diff --git a/404.html b/404.html index c4f01d1b..ff8ad552 100644 --- a/404.html +++ b/404.html @@ -88,7 +88,7 @@ - + @@ -219,7 +219,7 @@ - + YouQu Docs diff --git "a/AT\345\237\272\347\241\200\346\241\206\346\236\266\350\256\276\350\256\241\346\226\271\346\241\210/index.html" "b/AT\345\237\272\347\241\200\346\241\206\346\236\266\350\256\276\350\256\241\346\226\271\346\241\210/index.html" index bf38e341..3f5f3876 100644 --- "a/AT\345\237\272\347\241\200\346\241\206\346\236\266\350\256\276\350\256\241\346\226\271\346\241\210/index.html" +++ "b/AT\345\237\272\347\241\200\346\241\206\346\236\266\350\256\276\350\256\241\346\226\271\346\241\210/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs diff --git "a/AT\345\272\224\347\224\250\345\272\223\350\256\276\350\256\241\346\226\271\346\241\210/index.html" "b/AT\345\272\224\347\224\250\345\272\223\350\256\276\350\256\241\346\226\271\346\241\210/index.html" index d56fec19..f1469bc8 100644 --- "a/AT\345\272\224\347\224\250\345\272\223\350\256\276\350\256\241\346\226\271\346\241\210/index.html" +++ "b/AT\345\272\224\347\224\250\345\272\223\350\256\276\350\256\241\346\226\271\346\241\210/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs diff --git "a/AT\345\274\200\345\217\221\350\247\204\350\214\203/index.html" "b/AT\345\274\200\345\217\221\350\247\204\350\214\203/index.html" index 3cd64cd4..d3b8ff87 100644 --- "a/AT\345\274\200\345\217\221\350\247\204\350\214\203/index.html" +++ "b/AT\345\274\200\345\217\221\350\247\204\350\214\203/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs diff --git "a/AT\346\211\247\350\241\214\345\231\250\344\275\277\347\224\250\346\214\207\345\214\227/index.html" "b/AT\346\211\247\350\241\214\345\231\250\344\275\277\347\224\250\346\214\207\345\214\227/index.html" index 51746899..f1b435cb 100644 --- "a/AT\346\211\247\350\241\214\345\231\250\344\275\277\347\224\250\346\214\207\345\214\227/index.html" +++ "b/AT\346\211\247\350\241\214\345\231\250\344\275\277\347\224\250\346\214\207\345\214\227/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs diff --git "a/AT\347\224\250\344\276\213\347\255\233\351\200\211\346\214\207\345\214\227/index.html" "b/AT\347\224\250\344\276\213\347\255\233\351\200\211\346\214\207\345\214\227/index.html" index b58575a5..d456b271 100644 --- "a/AT\347\224\250\344\276\213\347\255\233\351\200\211\346\214\207\345\214\227/index.html" +++ "b/AT\347\224\250\344\276\213\347\255\233\351\200\211\346\214\207\345\214\227/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs diff --git "a/AT\347\273\217\351\252\214\346\200\273\347\273\223/index.html" "b/AT\347\273\217\351\252\214\346\200\273\347\273\223/index.html" index 9cee4391..75fba703 100644 --- "a/AT\347\273\217\351\252\214\346\200\273\347\273\223/index.html" +++ "b/AT\347\273\217\351\252\214\346\200\273\347\273\223/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs diff --git a/RELEASE/index.html b/RELEASE/index.html index 7f6d6e92..b496b360 100644 --- a/RELEASE/index.html +++ b/RELEASE/index.html @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs @@ -337,6 +337,20 @@ + + + 2.2.0(2023/9/5) + + + + + + + 2.1.5(2023/8/31) + + + + 2.1.2(2023/8/22) @@ -727,6 +741,20 @@ + + + 2.2.0(2023/9/5) + + + + + + + 2.1.5(2023/8/31) + + + + 2.1.2(2023/8/22) @@ -893,11 +921,37 @@ 版本更新记录¶ +2.2.0(2023/9/5)¶ +new + +正式启用 letmego 技术方案; + +fix + +对 docs 里面细化了远程执行章节的描述; + +2.1.5(2023/8/31)¶ +new + + +将有趣的文档系统迁移到 linuxdeepin ,剥离文档中的图片资源,采用 CDN 加速方式加载; + + +尝试合入一个有趣的功能; + + +fix + +修复了 Wayland 键鼠工具没有鼠标相对移动方法 moveRel 的问题; +修复了 Wayland 下获取窗口信息功能模块中环境变量的问题; +优化了 startproject 功能的一些信息输出; +修复了特殊场景下 env_dev.sh 开发环境部署是可能影响到正式环境 env.sh 的问题; + 2.1.2(2023/8/22)¶ new 增加 OCR 识别自动重试机制,默认重试 2 次,支持动态传入重试次数; -使用窗管最新提供的二进制接口,优化基于 UI 的元素定位方案在 Wayland 下获取窗口信息的方法;感谢桌面测试部 @何权 @孙翠 、窗管研发 @黄泽铭 的大力支持。 +使用窗管最新提供的二进制接口,优化基于 UI 的元素定位方案在 Wayland 下获取窗口信息的方法;感谢桌面测试部 @何权 @孙翠 、窗管研发 @黄泽铭 的大力支持。 扩充 skipif 条件跳过的功能函数: skipif_xdg_type 支持 x11 或 wayland 上跳过; skipif_cpu_name 支持不同 cpu 上跳过,比如:skipif_cpu_name-KLVVW5821; @@ -964,7 +1018,7 @@ 2.0.0(2023/8/16) 只需要把 python3 替换成 youqu 就可以了,看起来很和谐~ 4、新的文档地址 -过去咱们 YouQu 的在线文档是部署在公司内网的,现在开源到 github 了,外部开发者肯定访问不到内网的文档,因此需要将文档部署到公网【公网文档】; +过去咱们 YouQu 的在线文档是部署在公司内网的,现在开源到 github 了,外部开发者肯定访问不到内网的文档,因此需要将文档部署到公网【公网文档】; 公网文档使用的是 github pages(白嫖怪一顿狂喜~~),但可能会出现文档速度慢的问题(代理下就好了),不过没关系,咱们【内网文档】仍然保留,文档内容一样,访问速度更快。 5、其他一些小小功能更新: (1)新增关闭分辨率检测的参数值; diff --git a/index.html b/index.html index 0892048b..db752a92 100644 --- a/index.html +++ b/index.html @@ -95,7 +95,7 @@ - + @@ -226,7 +226,7 @@ - + YouQu Docs @@ -379,6 +379,26 @@ 2.2. 远程执行 + + + + + + 2.2.1. 远程多机器分布式异步执行 + + + + + + + 2.2.2. 远程多机器分布式异步负载均衡执行 + + + + + + + @@ -795,6 +815,26 @@ 2.2. 远程执行 + + + + + + 2.2.1. 远程多机器分布式异步执行 + + + + + + + 2.2.2. 远程多机器分布式异步负载均衡执行 + + + + + + + @@ -961,171 +1001,215 @@ 2.1.1. 配置文件 ;执行包含用例标签的用例 TAGS = -;1、KEYWORDS 和 TAGS 都为空表示执行 APP_NAME 的所有用例 -;2、KEYWORDS 和 TAGS 都支持逻辑组合,即 and/or/not 的表达式, e.g. TAGS = L1 or smoke - -;本地文件测试套,将要执行的用例写入指定的 csv 文件 -;默认为空,从基础框架根目录开始:e.g. CASE_FILE = case_list.txt -;如果这里有值,APP_NAME KEYWORDS TAGS 的配置均不生效 -CASE_FILE = - -;=============================== RUNNER CONFIG =================================== -[runner] -;最大失败用例数量的占比 -;比如:总执行用例数为100, 若 MAX_FAIL = 0.5,则失败用例数达到50就会终止测试。 -MAX_FAIL = 0.5 - -;单条用例的超时时间,如果一条用例的执行时间超时,这条用例会被停止,后续用例继续执行。 -;单位为秒 -; 这是一个全局统一配置,如果某条用例需要单独配置超时时间,可以在用例中这样写: -;@pytest.mark.timeout(500) -;def test_xxx_001(): -; ... -;会话(所有用例执行的)超时是根据全局超时配置和用例单独超时配置自动计算的; -CASE_TIME_OUT = 200 - -;失败用例重跑次数 -RERUN = 1 +;----------------------------------------------- +;1.KEYWORDS 和 TAGS 都为空表示执行 APP_NAME 的所有用例 +;2.KEYWORDS 和 TAGS 都支持逻辑组合,即 and/or/not 的表达式 +;e.g. TAGS = L1 or smoke +;----------------------------------------------- + +;本地文件测试套,将要执行的用例写入指定的 csv 文件 +;默认为空,从基础框架根目录开始:e.g. CASE_FILE = case_list.txt +;如果这里有值,APP_NAME KEYWORDS TAGS 的配置均不生效 +CASE_FILE = + +;=============================== RUNNER CONFIG =================================== +[runner] +;最大失败用例数量的占比 +;比如:总执行用例数为 100, 若 MAX_FAIL = 0.5,则失败用例数达到 50 就会终止测试。 +MAX_FAIL = 1 + +;单条用例的超时时间,如果一条用例的执行时间超时,这条用例会被停止,后续用例继续执行。 +;单位为秒 +;这是一个全局统一配置,如果某条用例需要单独配置超时时间,可以在用例中这样写: +;@pytest.mark.timeout(500) +;def test_xxx_001(): +; ... +;会话超时(所有用例执行的超时时间)是根据全局超时配置和用例单独超时配置自动计算的。 +CASE_TIME_OUT = 200 -;失败录屏从第几次开始录制视频。 -;比如 RECORD_FAILED_CASE = 1 ,表示用例第1次执行失败之后开始录屏。 -;注意,用例失败重跑的次数不能小于失败录屏次数,即 RERUN >= RECORD_FAILED_CASE -RECORD_FAILED_CASE = 1 +;失败用例重跑次数 +;注意,RERUN = 1 表示重跑 1 次,即第一次用例执行失败会自动重跑 1 次,总共执行 2 次; +;如果第 2 次执行成功,结果成功,失败亦为失败。 +RERUN = 1 -;批量执行时,终端输出的日志级别 DEBUG/INFO/ERROR -LOG_LEVEL = INFO - -;yes 每条用例执行之后进行环境清理 -CLEAN_ALL = yes +;失败录屏从第几次失败开始录制视频。 +;比如 RECORD_FAILED_CASE = 1 ,表示用例第 1 次执行失败之后开始录屏,RERUN >= RECORD_FAILED_CASE。 +;1.关闭录屏:RECORD_FAILED_CASE > RERUN +;2.每条用例都录屏:RECORD_FAILED_CASE = 0 +RECORD_FAILED_CASE = 1 -;检查测试机分辨率 -RESOLUTION = 1920x1080 +;yes 每条用例执行之后进行环境清理 +CLEAN_ALL = yes -;不跳过用例,csv文件里面标记了 skip-xxx的用例不跳过 -NOSKIP = no - -;ignore fixed -;no,只要标记了fixed的用例,即使标记了skip-,也会执行; -;yes,fixed不生效,仅通过skip跳过用例; -IFIXED = no - -;要安装deb包的路径 -;e.g : ~/Downloads/ 安装下载目录下的deb包,如果是远程执行,会自动拷贝到远程并安装。 -DEB_PATH = +;检查测试机分辨率, 比如:1920x1080 +;no: 表示不做分辨率校验 +RESOLUTION = 1920x1080 + +;不跳过用例,csv文件里面标记了 skip-xxx的用例不跳过 +NOSKIP = no + +;ignore fixed +;no,只要标记了fixed的用例,即使标记了skip-,也会执行; +;yes,fixed不生效,仅通过skip跳过用例; +IFIXED = no -;DEBUG 模式执行用例,只收集不执行用例,也不做设备分辨率的检查。 -DEBUG = no - -;记录top命令查询的系统资源占用情况,TOP = 3 表示记录前3个进程。 -TOP = - -;指定用例执行次数 -REPEAT = - -;默认在所有测试完成之后输出报错信息. -;yes, 测试过程中立即显示报错 -DURING_FAIL = no +;要安装deb包的路径 +;e.g : ~/Downloads/ 安装下载目录下的deb包,如果是远程执行,会自动拷贝到远程并安装。 +DEB_PATH = + +;DEBUG 模式执行用例,只收集不执行用例,也不做设备分辨率的检查。 +DEBUG = no + +;记录top命令查询的系统资源占用情况,TOP = 3 表示记录前3个进程。 +TOP = + +;指定用例执行次数 +REPEAT = -;=============================== REPORT CONFIG =================================== -[report] -;用例执行完后生成的测试报告格式 -;目前支持 allure, xml, json (支持同时生成) -REPORT_FORMAT = allure, xml, json - -;指定报告生成的路径(相对项目根目录下) -ALLURE_REPORT_PATH = report/ -XML_REPORT_PATH = report/ -JSON_REPORT_PATH = report/ - -;=============================== GLOBAL CONFIG =================================== -[globalconfig] -;测试机的密码 -PASSWORD = 1 - -;图像识别重试次数 -IMAGE_MATCH_NUMBER = 1 - -;图像识别重试每次间隔等待时间 -IMAGE_MATCH_WAIT_TIME = 1 - -;图像识别匹配度 -IMAGE_RATE = 0.9 - -;截取当前屏幕实时图像保存路径,用于图像识别坐标 -SCREEN_CACHE = /tmp/screen.png - -;截取屏幕上指定区域图片,保存临时图片的路径 -TMPDIR = /tmp/tmpdir +;默认在所有测试完成之后输出报错信息. +;yes, 测试过程中立即显示报错 +DURING_FAIL = no + +;注册自启服务 +AUTOSTART = no + +;=============================== REPORT CONFIG =================================== +[report] +;测试报告的title +REPORT_TITLE = YouQu Report + +;测试报告的name +REPORT_NAME = YouQu Report + +;测试报告的默认语言 +;en:English +;ru:Русский +;zh:中文 +;de:Deutsch +;nl:Nederlands +;he:Hebrew +;br:Brazil +;pl:Polski +;ja:日本語 +;es:Español +;kr:한국어 +;fr:Français +;az:Azərbaycanca +REPORT_LANGUAGE = zh -;系统主题 -SYS_THEME = deepin - -;OCR服务端地址(不可随意修改) -OCR_SERVER_HOST = http://youqu-dev.uniontech.com:8890 - -;OpenCV服务端地址 -OPENCV_SERVER_HOST = http://youqu-dev.uniontech.com:8889 +;用例执行完后生成的测试报告格式 +;目前支持 allure, xml, json (支持同时生成) +REPORT_FORMAT = allure, xml, json + +;指定报告生成的路径(相对项目根目录下) +ALLURE_REPORT_PATH = report/ +XML_REPORT_PATH = report/ +JSON_REPORT_PATH = report/ -;=============================== PMS CONFIG =================================== -;PMS相关配置,包含以下几个方面: -;1.PMS测试套执行 -;2.自动从PMS爬取数据并同步本地CSV文件 -;3.PMS数据回填 -[pms] -;PMS的用户名: ut001234 -PMS_USER = - -;PMS的密码 -PMS_PASSWORD = - -;PMS测试套的ID -;在PMS上查看用例“套件”链接: https://pms.uniontech.com/testsuite-view-495.html -;测试套ID为: 495 -SUITE_ID = +;=============================== GLOBAL CONFIG =================================== +[globalconfig] +;测试机的密码 +PASSWORD = 1 + +;图像识别重试次数 +IMAGE_MATCH_NUMBER = 1 + +;图像识别重试每次间隔等待时间 +IMAGE_MATCH_WAIT_TIME = 1 + +;图像识别匹配度 +IMAGE_RATE = 0.9 + +;截取当前屏幕实时图像保存路径,用于图像识别坐标 +SCREEN_CACHE = /tmp/screen.png -;数据回填必须关联PMS测试单 -;在PMS上查看测试单链接: https://pms.uniontech.com/testtask-cases-20747.html -;测试单ID为: 20747 -TASK_ID = - -;将测试结果数据回填到PMS -;为空: 表示不回填,不会在每条用例执行完之后生成json结果文件; -;async: 表示逐条异步回填,后面一条执行开始时通过子线程对前一条用例的执行结果进行回填,如此实现时间效率最大化; -;finish: 表示所有用例执行完成之后逐个回填(PMS不支持并发); -SEND_PMS = - -;数据回填的触发者 -;auto: 框架自动回填,配合SEND_PMS配置使用,你可以选择在不同的阶段进行数据回填; -;hand: 手动回填,每条用例仍然会生成json文件,但框架不会进行数据回填,需要你可以在你想要发送的时间点手动触发回填; -TRIGGER = auto - -;PMS回填的重试次数 -;如果接口请求失败,会进行重试 -SEND_PMS_RETRY_NUMBER = 2 - -[csv_link_pms_lib] -;caselib: 用例库 -;testcase: 产品库用例 -CASE_FROM = caselib - -[csv_link_pms_id] -;同步PMS数据到本地CSV文件,必须要配置的配置项 -;key是本地CSV文件的文件名称; -;value是对应PMS上的模块ID; -;比如要同步音乐的数据, 首先需要将配置 APP_NAME = deepin-music, -;CSV文件名称为music.csv,其在PMS上的用例为: https://pms.uniontech.com/caselib-browse-81.html -;因此应该配置为: music = 81 -;这样才能将PMS与本地CSV文件建立联系。 -;如果你的应用分了很多模块,只需要将对应的信息依次配置好就行了。 -music = - - -[export_csv] -;导出的csv文件名称,默认 case_list.csv -CSV_FILE = case_list.csv - -;exportcsv 命令导出 case_list.csv 文件时配置的字段名,用例名称默认存在第一列,无需添加 -CSV_HEARD = 用例级别,用例类型,测试级别,是否跳过 +;截取屏幕上指定区域图片,保存临时图片的路径 +TMPDIR = /tmp/tmpdir + +;系统主题 +SYS_THEME = deepin + +;OCR服务端地址(不可随意修改) +OCR_SERVER_HOST = youqu-dev.uniontech.com + +;OpenCV服务端地址 +OPENCV_SERVER_HOST = youqu-dev.uniontech.com + +;=============================== PMS CONFIG =================================== +;PMS相关配置,包含以下几个方面: +;1.PMS测试套执行 +;2.自动从PMS爬取数据并同步本地CSV文件 +;3.PMS数据回填 +[pms] +;PMS的用户名,如: ut001234 +PMS_USER = + +;PMS的密码 +PMS_PASSWORD = + +;PMS测试套的ID +;在PMS上查看用例“套件”链接: https://pms.uniontech.com/testsuite-view-495.html +;测试套ID为: 495 +SUITE_ID = + +;数据回填必须关联PMS测试单 +;在PMS上查看测试单链接: https://pms.uniontech.com/testtask-cases-20747.html +;测试单ID为: 20747 +TASK_ID = + +;将测试结果数据回填到PMS +;为空: 表示不回填,不会在每条用例执行完之后生成json结果文件; +;async: 表示逐条异步回填,后面一条执行开始时通过子线程对前一条用例的执行结果进行回填,如此实现时间效率最大化; +;finish: 表示所有用例执行完成之后逐个回填(PMS不支持并发); +SEND_PMS = + +;数据回填的触发者 +;auto: 框架自动回填,配合SEND_PMS配置使用,你可以选择在不同的阶段进行数据回填; +;hand: 手动回填,每条用例仍然会生成json文件,但框架不会进行数据回填,需要你可以在你想要发送的时间点手动触发回填; +TRIGGER = auto + +;PMS回填的重试次数 +;如果接口请求失败,会进行重试 +SEND_PMS_RETRY_NUMBER = 2 + +[csv_link_pms_lib] +;caselib: 用例库 +;testcase: 产品库用例 +CASE_FROM = caselib + +[csv_link_pms_id] +;同步PMS数据到本地CSV文件,必须要配置的配置项 +;key是本地CSV文件的文件名称; +;value是对应PMS上的模块ID; +;比如要同步音乐的数据, 首先需要将配置 APP_NAME = deepin-music, +;CSV文件名称为music.csv,其在PMS上的用例为: https://pms.uniontech.com/caselib-browse-81.html +;因此应该配置为: music = 81 +;这样才能将PMS与本地CSV文件建立联系。 +;如果你的应用分了很多模块,只需要将对应的信息依次配置好就行了。 +music = + +[export_csv] +;导出的csv文件名称,默认 case_list.csv +CSV_FILE = case_list.csv + +;exportcsv 命令导出 case_list.csv 文件时配置的字段名,用例名称默认存在第一列,无需添加 +CSV_HEARD = 用例级别,用例类型,测试级别,是否跳过 + +[log_cli] +;日志相关配置(不打印构造函数和魔法函数的功能说明) +;批量执行时,终端输出的日志级别 DEBUG/INFO/ERROR +LOG_LEVEL = DEBUG + +# ============= 自动输出日志的配置 ================ +;支持类名以 xxx 开头的,自动将函数说明打印为日志, 多个参数以逗号隔开 +CLASS_NAME_STARTSWITH = Assert + +;支持类名以 xxx 结尾的,自动将函数说明打印为日志,多个参数以逗号隔开 +CLASS_NAME_ENDSWITH = Widget + +;支持类名包含 xxx 的,自动将函数说明打印为日志,多个参数以逗号隔开 +CLASS_NAME_CONTAIN = ShortCut +# ============================================== 配置完成之后,直接在命令行执行 manage.py 就好了。 youqu manage.py run @@ -1133,47 +1217,51 @@ 2.1.1. 配置文件2.1.2. 命令行参数¶ 通过命令行参数配置参数 以下为 youqu manage.py run 提供的一些参数选项: - -a APP, --app APP 应用名称:deepin-music 或 autotest_deepin_music 或 - apps/autotest_deepin_music - -k KEYWORDS, --keywords KEYWORDS - 用例的关键词,支持and/or/not逻辑组合 - -t TAGS, --tags TAGS 用例的标签,支持and/or/not逻辑组合 - --rerun RERUN 失败重跑次数 - --clean {yes,} 清理环境 - --report_formats REPORT_FORMATS - 测试报告格式 - --max_fail MAX_FAIL 最大失败率 - --log_level LOG_LEVEL - 日志输出级别 - --timeout TIMEOUT 单条用例超时时间 - --resolution RESOLUTION - 检查分辨率 - --debug DEBUG 调试模式 - --noskip {yes,} csv文件里面标记了skip跳过的用例不生效 - --ifixed {yes,} fixed不生效,仅通过skip跳过用例 - --send_pms {,async,finish} - 数据回填 - --task_id TASK_ID 测试单ID - --trigger {,auto,hand} - 触发者 - -f CASE_FILE, --case_file CASE_FILE - 根据文件执行用例 - --deb_path DEB_PATH 需要安装deb包的本地路径 - --pms_user PMS_USER pms 用户名 - --pms_password PMS_PASSWORD - pms 密码 - --suite_id SUITE_ID pms 测试套ID - --pms_info_file PMS_INFO_FILE - pms 信息文件 - --top TOP 过程中记录top命令中的值 - --lastfailed 仅执行上次失败用例 - --duringfail 测试过程中立即显示报错 - --repeat REPEAT 指定用例执行次数 - --project_name PROJECT_NAME - 工程名称(写入json文件) - --build_location BUILD_LOCATION - 构建地区(写入json文件) - --line LINE 执行的业务线(写入json文件) + -h, --help show this help message and exit + -a APP, --app APP 应用名称:deepin-music 或 autotest_deepin_music 或 + apps/autotest_deepin_music + -k KEYWORDS, --keywords KEYWORDS + 用例的关键词,支持and/or/not逻辑组合 + -t TAGS, --tags TAGS 用例的标签,支持and/or/not逻辑组合 + --rerun RERUN 失败重跑次数 + --record_failed_case RECORD_FAILED_CASE + 失败录屏从第几次失败开始录制视频 + --clean {yes,} 清理环境 + --report_formats REPORT_FORMATS + 测试报告格式 + --max_fail MAX_FAIL 最大失败率 + --log_level LOG_LEVEL + 日志输出级别 + --timeout TIMEOUT 单条用例超时时间 + --resolution RESOLUTION + 检查分辨率 + --debug DEBUG 调试模式 + --noskip {yes,} csv文件里面标记了skip跳过的用例不生效 + --ifixed {yes,} fixed不生效,仅通过skip跳过用例 + --send_pms {,async,finish} + 数据回填 + --task_id TASK_ID 测试单ID + --trigger {,auto,hand} + 触发者 + -f CASE_FILE, --case_file CASE_FILE + 根据文件执行用例 + --deb_path DEB_PATH 需要安装deb包的本地路径 + --pms_user PMS_USER pms 用户名 + --pms_password PMS_PASSWORD + pms 密码 + --suite_id SUITE_ID pms 测试套ID + --pms_info_file PMS_INFO_FILE + pms 信息文件 + --top TOP 过程中记录top命令中的值 + --lastfailed 仅执行上次失败用例 + --duringfail 测试过程中立即显示报错 + --repeat REPEAT 指定用例执行次数 + --project_name PROJECT_NAME + 工程名称(写入json文件) + --build_location BUILD_LOCATION + 构建地区(写入json文件) + --line LINE 执行的业务线(写入json文件) + --autostart AUTOSTART 用例执行程序注册到开机自启服务 在一些 CI 环境下使用命令行参数会更加方便: youqu manage.py run --app deepin-music --keywords "xxx" --tags "xxx" @@ -1181,8 +1269,13 @@ 2.1.2. 命令行参数2.2. 远程执行¶ +远程执行就是用本地作为服务端控制远程机器执行,远程机器执行的用例相同; +使用 remote 命令: youqu manage.py remote +2.2.1. 远程多机器分布式异步执行¶ + +多机器分布式异步执行就是由本地 YouQu 作为服务端,控制远程 N 台机器执行相同的用例,执行完之后所有测试机的测试结果会返回给服务端 report 目录下; 远程执行同样通过配置文件 setting/globalconfig.ini 进行用例相关配置; 需要重点说一下远程执行时的测试机信息配置,在配置文件 setting/remote.ini 里面配置测试机的用户名、IP、密码。 ;=============================== CLIENT LIST ===================================== @@ -1206,49 +1299,47 @@ 2.2. 远程执行user = uos ip = 10.8.11.xx -有多少台机器就像这样挨着写就行了。 +有多少台机器就像这样参考上面的格式写就行了。 然后在命令行: youqu manage.py remote 这样运行是从配置文件去读取相关配置。 如果你不想通过配置文件,你仍然通过命令行参数进行传参, 以下为 python3 manage.py remote 提供的一些参数选项: - -a APP, --app APP 应用名称:deepin-music 或 autotest_deepin_music 或 - apps/autotest_deepin_music - -c CLIENTS, --clients CLIENTS - 远程机器的user@ip:password,多个机器用'/'连接,如果password不传入,默认取 - setting/remote.ini 中 CLIENT_PASSWORD - 的值,比如:uos@10.8.13.33:1 或 uos@10.8.13.33 - -k KEYWORDS, --keywords KEYWORDS - 用例的关键词,支持and/or/not逻辑组合 - -t TAGS, --tags TAGS 用例的标签,支持and/or/not逻辑组合 - -s {yes,no,}, --send_code {yes,no,} - 发送代码到测试机(不含report目录) - -e, --build_env 搭建测试环境,如果为yes,不管send_code是否为yes都会发送代码到测试机. - -p CLIENT_PASSWORD, --client_password CLIENT_PASSWORD - 测试机密码(全局) - -y PARALLEL, --parallel PARALLEL - yes:表示所有测试机并行跑,执行相同的测试用例,no - :表示测试机分布式执行,服务端会根据收集到的测试用例自动分配给各个测试机执行。 - --rerun RERUN 失败重跑次数 - --clean {yes,} 清理环境 - --report_formats REPORT_FORMATS - 测试报告格式 - --log_level LOG_LEVEL - 日志输出级别 - --timeout TIMEOUT 单条用例超时时间 - --debug DEBUG 调试模式 - --noskip {yes,} csv文件里面标记了skip跳过的用例不生效 - --ifixed {yes,} fixed不生效,仅通过skip跳过用例 - --send_pms SEND_PMS 数据回填 - --task_id TASK_ID 测试单ID - --deb_path DEB_PATH 需要安装deb包的本地路径 + -h, --help show this help message and exit + -c CLIENTS, --clients CLIENTS + 远程机器的user@ip:password,多个机器用'/'连接,如果password不传入,默认取sett + ing/remote.ini中CLIENT_PASSWORD的值,比如: uos@10.8.13.33:1 + 或 uos@10.8.13.33 + -s, --send_code 发送代码到测试机(不含report目录) + -e, --build_env 搭建测试环境,如果为yes,不管send_code是否为yes都会发送代码到测试机. + -p CLIENT_PASSWORD, --client_password CLIENT_PASSWORD + 测试机密码(全局) + -y PARALLEL, --parallel PARALLEL + yes:表示所有测试机并行跑,执行相同的测试用例;no:表示测试机分布式执行,服务端会根据收集到的测试用例自 + 动分配给各个测试机执行。 +除了这些特有参数以外,它同样支持本地执行的所有参数; 在命令行这样运行: youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k "xxx" -t "xxx" 所有用例执行完之后会在 report 目录下回收各个测试机执行的测试报告。 +注意,如果远程机器没有搭建自动化测试环境,记得加上参数 -e : +youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k "xxx" -t "xxx" -e + +执行前确保远程机器已经开启了 ssh 服务,否则会提示无法连接,如果没有开启,请手动开启: +sudo systemctl restart ssh +sudo systemctl enable ssh + 配置文件其他相关配置项详细说明,请查看配置文件中的注释内容。 +2.2.2. 远程多机器分布式异步负载均衡执行¶ +多机器分布式异步负载均衡执行也是用本地作为服务端控制远程机器执行,但远程机器执行的用例不同,而是所有远程机器执行的用例之和,为你想要执行的用例集; +似乎有点难以理解,我用大白话举例描述下就是,服务端想要执行 10 条用例,现在远程机器有 5 台; +然后服务端就先拿着第 1 条用例给远程 1 号机执行,拿第 2 条用例给远程 2 号机执行...,如此循环直到所有用例执行完,这就是负载均衡执行。 + +使用方法和前面一样,只是需要增加一个参数: +youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k "xxx" -t "xxx" --parallel no + 2.3. PMS 数据回填¶ 测试单关联的用例,自动化测试对应的去跑这些关联的用例,并且将执行的结果回填的测试用例的状态里面。 PMS 数据回填主要有三种方式: @@ -1256,35 +1347,35 @@ 2.3. PMS 数据回填在用例执行的过程中,采用异步的方式去进行数据回填,直白的讲就是,第二条用例开始跑的时候,通过子线程去做第一条用例的数据回填,如此循环,直到所有用例执行结束; 这种方案的时间效率最高的,因为理论上用例的执行时间是大于数据回填的接口请求时间的,也就是说,当用例执行完之后,数据回填也完成了。 使用方法,在 globalconfig.ini 里面配置以下参数:(以下涉及到的参数配置都是在配置文件里面进行配置) -PMS_USER = PMS账号 -PMS_PASSWORD = PMS密码 -SEND_PMS = async -TASK_ID = 测试单ID -TRIGGER = auto -APP_NAME = 这个参数可填可不填,但是填了可以提高用例的执行速度,因为在用例收集阶段可以指定到具体的应用库。(下同) +PMS_USER = PMS账号 +PMS_PASSWORD = PMS密码 +SEND_PMS = async +TASK_ID = 测试单ID +TRIGGER = auto +APP_NAME = 这个参数可填可不填,但是填了可以提高用例的执行速度,因为在用例收集阶段可以指定到具体的应用库。(下同) (2)用例执行完之后回填 等所有用例执行完之后,再逐个进行回填的接口请求,此方案时间效率比较低。 使用方法: -PMS_USER = PMS账号 -PMS_PASSWORD = PMS密码 -SEND_PMS = finish -TASK_ID = 测试单ID -TRIGGER = auto -APP_NAME = +PMS_USER = PMS账号 +PMS_PASSWORD = PMS密码 +SEND_PMS = finish +TASK_ID = 测试单ID +TRIGGER = auto +APP_NAME = (3)手动回填 所有用例执行完之后不做回填的接口请求,后续手动将结果进行回填请求。 用例执行时配置: -PMS_USER = PMS账号 -PMS_PASSWORD = PMS密码 -SEND_PMS = finish -TASK_ID = 测试单ID -TRIGGER = hand -APP_NAME = +PMS_USER = PMS账号 +PMS_PASSWORD = PMS密码 +SEND_PMS = finish +TASK_ID = 测试单ID +TRIGGER = hand +APP_NAME = 后续手动回填方法: -youqu manage.py pms --send2task yes +youqu manage.py pms --send2task yes 可能遇到的问题¶ 由同学可能会发现,怎么回填一次之后,后面想再次回填就不生效了; @@ -1292,62 +1383,62 @@ 可能遇到的问题2.4. 导出 CSV 文件¶ 框架提供导出指定标签用例的功能: -youqu manage.py exportcsv -a deepin-album -t CICD +youqu manage.py exportcsv -a deepin-album -t CICD 表示导出 deepin-album 的用例中标记了 CICD 标签的用例,导出 CSV 文件的字段格式已经适配了 CICD 的要求。 2.5. 脚手架新建 APP 工程¶ 新建一个 APP 工程: -youqu manage.py startapp autotest_deepin_some +youqu manage.py startapp autotest_deepin_some 这样在 apps 目录下会创建一个子项目工程 autotest_deepin_some,同时新建好工程模板目录和模板文件: -apps -└── autotest_deepin_some - ├── case - │ ├── assert_res - │ │ └── readme - │ ├── base_case.py - │ └── __init__.py - ├── config.ini - ├── config.py - ├── conftest.py - ├── control - ├── deepin_some_assert.py - ├── deepin_some.csv - ├── __init__.py - └── widget - ├── base_widget.py - ├── case_res - │ └── readme - ├── deepin_some_widget.py - ├── __init__.py - ├── other.ini - ├── other_widget.py - ├── pic_res - │ └── readme - └── ui.ini +apps +└── autotest_deepin_some + ├── case + │ ├── assert_res + │ │ └── readme + │ ├── base_case.py + │ └── __init__.py + ├── config.ini + ├── config.py + ├── conftest.py + ├── control + ├── deepin_some_assert.py + ├── deepin_some.csv + ├── __init__.py + └── widget + ├── base_widget.py + ├── case_res + │ └── readme + ├── deepin_some_widget.py + ├── __init__.py + ├── other.ini + ├── other_widget.py + ├── pic_res + │ └── readme + └── ui.ini autotest_deepin_some 是你的工程名称,比如:autotest_deepin_music ; 在此基础上,你可以快速的开始你的 AT 项目。 2.6. 用例标签自动同步¶ 用于自动同步 PMS 用例标签数据至本地 CSV 文件,主要通过以下几个配置来控制: -APP_NAME = # 指定要同步的应用名称 -PMS_USER = # PMS的用户名 -PMS_PASSWORD = # PMS的密码 +APP_NAME = # 指定要同步的应用名称 +PMS_USER = # PMS的用户名 +PMS_PASSWORD = # PMS的密码 在 [csv_link_pms_id] 节点下指定 csv 文件名与 PMS 用例模块的对应关系,比如: -[csv_link_pms_id] -;同步PMS数据到本地CSV文件,必须要配置的配置项 -;key是本地CSV文件的文件名称; -;value是对应PMS上的模块ID; -;比如要同步音乐的数据, 首先需要将配置 APP_NAME = deepin-music, -;CSV文件名称为music.csv,其在PMS上的用例为: https://pms.uniontech.com/testcase-browse-53.html -;因此应该配置为: music = 53 -;这样才能将PMS与本地CSV文件建立联系。 -;如果你的应用分了很多模块,只需要将对应的信息依次配置好就行了。 -music = 53 +[csv_link_pms_id] +;同步PMS数据到本地CSV文件,必须要配置的配置项 +;key是本地CSV文件的文件名称; +;value是对应PMS上的模块ID; +;比如要同步音乐的数据, 首先需要将配置 APP_NAME = deepin-music, +;CSV文件名称为music.csv,其在PMS上的用例为: https://pms.uniontech.com/testcase-browse-53.html +;因此应该配置为: music = 53 +;这样才能将PMS与本地CSV文件建立联系。 +;如果你的应用分了很多模块,只需要将对应的信息依次配置好就行了。 +music = 53 将以上信息配置好之后,在命令行执行: -youqu manage.py pms --pms2csv yes +youqu manage.py pms --pms2csv yes 每次执行时原 csv 文件会自动备份在 report/csv_back 目录下,因此你不用担心脚本执行导致你的数据丢失。 diff --git a/search/search_index.json b/search/search_index.json index 91ebe84c..c7cfc7a2 100644 --- a/search/search_index.json +++ b/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\u200b\\u3000\\-\u3001\u3002\uff0c\uff0e\uff1f\uff01\uff1b]+","pipeline":["stemmer"]},"docs":[{"location":"","title":"\u9996\u9875","text":""},{"location":"#youqu","title":"\u6709\u8da3\uff08YouQu\uff09","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/4/1\n# Author : Mikigo\n# =============================================\n \u672c\u7ad9\u603b\u8bbf\u95ee\u91cf \u6b21 \u6b22\u8fce\u5728\u6d4f\u89c8\u5668\u8bbf\u95ee\u3010\u516c\u7f51\u6587\u6863\u3011 \u7edf\u4fe1\u516c\u53f8\u5185\u7f51\u8fd8\u53ef\u4ee5\u8bbf\u95ee\u3010\u5185\u7f51\u6587\u6863\u3011\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u54e6~~"},{"location":"#_1","title":"\u4e00\u3001\u7b80\u4ecb","text":"\u6709\u8da3\uff08YouQu\uff09\u662f\u6df1\u5ea6\u79d1\u6280\u8bbe\u8ba1\u548c\u5f00\u53d1\u7684\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff0c\u91c7\u7528\u7ed3\u6784\u5206\u5c42\u7684\u8bbe\u8ba1\u7406\u5ff5\uff0c\u652f\u6301\u591a\u5143\u5316\u5143\u7d20\u5b9a\u4f4d\u548c\u65ad\u8a00\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\u3001\u5f3a\u5927\u7684\u65e5\u5fd7\u548c\u62a5\u544a\u8f93\u51fa\u7b49\u7279\u8272\u529f\u80fd\uff0c\u540c\u65f6\u5b8c\u7f8e\u517c\u5bb9X11\u3001Wayland\u663e\u793a\u534f\u8bae\uff0c\u73af\u5883\u90e8\u7f72\u7b80\u5355\uff0c\u64cd\u4f5c\u6613\u4e0a\u624b\u3002"},{"location":"#17","title":"\u7231\u4e0a \u201c\u6709\u8da3\u201d \u7684 17 \u4e2a\u7406\u7531","text":" \u6838\u5fc3\u5e93\u63d0\u4f9b\u4e86\u7edf\u4e00\u7684\u63a5\u53e3\uff0c\u7f16\u5199\u65b9\u6cd5\u65f6\u53ea\u9700\u8981\u5bfc\u5165\u4e00\u4e2a\u5305\u5c31\u53ef\u4ee5\u4f7f\u7528\u5230\u6838\u5fc3\u5e93\u63d0\u4f9b\u7684\u6240\u6709\u529f\u80fd\uff1b \u516c\u5171\u5e93\u5c01\u88c5\u4e86\u5f88\u591a\u5e38\u7528\u6a21\u5757\u7684\u76f8\u5173\u65b9\u6cd5\uff0c\u6bd4\u5982\uff1a\u4efb\u52a1\u680f\u7684\u64cd\u4f5c\u3001\u684c\u9762\u7684\u64cd\u4f5c\u3001\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\u7b49\u7b49\uff1b \u9664\u4e86\u5e38\u7528\u7684\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u8bc6\u522b\u4ee5\u5916\uff0c\u6211\u4eec\u8fd8\u63d0\u4f9b\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u5176\u4f7f\u7528\u7b80\u5355\u4e14\u9ad8\u6548\uff0c\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff1b \u5bf9\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u5c06\u7f16\u5199\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u53d8\u5f97\u7b80\u5355\u800c\u4f18\u96c5\uff1b \u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u6280\u672f\u8fdb\u884c\u529f\u80fd\u5347\u7ea7\uff0c\u9664\u4e86\u652f\u6301\u5355\u4e2a\u5750\u6807\u8fd4\u56de\uff0c\u8fd8\u652f\u6301\u540c\u4e00\u754c\u9762\u4e0b\u591a\u4e2a\u76f8\u540c\u5143\u7d20\u8fd4\u56de\u591a\u4e2a\u5750\u6807\u7684\u529f\u80fd\uff1b \u63d0\u4f9b\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u548c\u6279\u91cf\u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u4e0d\u5230\u4e00\u4e2a csv \u6587\u4ef6\u539f\u6765\u80fd\u5e72\u8fd9\u4e48\u591a\u4e8b\u60c5\uff1b \u63d0\u4f9b\u4e86\u529f\u80fd\u5f3a\u5927\u7684\u6267\u884c\u5668\u5165\u53e3\uff0c\u8ba9\u4f60\u53ef\u4ee5\u65b9\u4fbf\u7684\u5728\u672c\u5730\u6267\u884c\u4efb\u4f55\u7528\u4f8b\u96c6\u7684\u7528\u4f8b\uff0c\u5176\u4e30\u5bcc\u7684\u81ea\u5b9a\u4e49\u914d\u7f6e\u9879\uff0c\u6ee1\u8db3\u4f60\u5bf9\u6267\u884c\u5668\u6240\u6709\u7684\u5e7b\u60f3\uff1b \u63d0\u4f9b\u8fdc\u7a0b\u6267\u884c\u7684\u529f\u80fd\uff0c\u53ef\u4ee5\u63a7\u5236\u591a\u53f0\u673a\u5668\u5e76\u884c\u8dd1\uff0c\u6216\u8005\u5206\u5e03\u5f0f\u8dd1\uff0c\u8fd9\u79cd\u4ed8\u8d39\u529f\u80fd\u73b0\u5728\u514d\u8d39\u7ed9\u4f60\u7528\uff1b \u63d0\u4f9b\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u529f\u80fd\uff0c\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u6bcf\u4e2a\u65b9\u6cd5\u5355\u72ec\u5199\u8f93\u51fa\u65e5\u5fd7\u7684\u4ee3\u7801\uff0c\u4e00\u5207\u6211\u4eec\u7ed9\u4f60\u641e\u5b9a\u4e86\uff0c\u65e5\u5fd7\u8f93\u51fa\u4e0d\u4ec5\u5185\u5bb9\u4e30\u5bcc\uff0c\u989c\u503c\u4e5f\u7edd\u5bf9\u5728\u7ebf\uff0c\u6211\u4eec\u8fd8\u81ea\u5df1\u8bbe\u8ba1\u4e86\u4e00\u6b3e\u7ec8\u7aef\u8f93\u51fa\u4e3b\u9898\u53eb\u300a\u4e94\u5f69\u6591\u6593\u7684\u9ed1\u300b\uff1b \u63d0\u4f9b\u4e86\u4e00\u952e\u90e8\u7f72\u81ea\u52a8\u5316\u6d4b\u8bd5\u73af\u5883\u7684\u529f\u80fd\uff0c\u8fde\u4ee3\u7801\u7f16\u8f91\u5668\u90fd\u7ed9\u4f60\u88c5\u597d\u4e86\uff0c\u8ba9\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u73af\u5883\u90e8\u7f72\u800c\u70e6\u607c\uff1b \u63d0\u4f9b\u4e86\u81ea\u52a8\u751f\u6210\u591a\u79cd\u62a5\u544a\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u8f93\u51fa\u4ec0\u4e48\u62a5\u544a\u5f62\u5f0f\u90fd\u884c\uff0c\u800c\u4e14\u6211\u4eec\u5728\u62a5\u544a\u4e2d\u8fd8\u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\u548c\u5931\u8d25\u622a\u56fe\u7684\u529f\u80fd\uff1b \u5bf9\u65ad\u8a00\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u63d0\u4f9b\u66f4\u53cb\u597d\u5316\u7684\u9519\u8bef\u63d0\u793a\uff0c\u8ba9\u5b9a\u4f4d\u95ee\u9898\u7cbe\u51c6\u9ad8\u6548\uff1b \u4e0d\u4ec5\u652f\u6301\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u63a7\u5236\uff0c\u800c\u4e14\u8fd8\u652f\u6301\u52a8\u6001\u63a7\u5236\u7528\u4f8b\u6279\u91cf\u6267\u884c\u7684\u603b\u65f6\u95f4\uff0c\u786e\u4fdd CI \u73af\u5883\u4e0b\u80fd\u987a\u7545\u8fd0\u884c\uff1b \u652f\u6301\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\u6267\u884c\u3001PMS \u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6807\u7b7e\u5316\u6267\u884c\u65b9\u6848\uff0c\u6ee1\u8db3\u4f60\u5404\u79cd\u573a\u666f\u4e0b\u7684\u6267\u884c\u9700\u6c42\uff1b \u652f\u6301\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u529f\u80fd\uff0c\u53ef\u5b9a\u4f4d\u53ef\u65ad\u8a00\uff0c\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\uff1b \u5b8c\u7f8e\u517c\u5bb9 Wayland \u548c X11\uff0c\u771f\u6b63\u505a\u5230\u4e00\u5957\u4ee3\u7801\uff0c\u968f\u5904\u6267\u884c\uff1b \u652f\u6301\u591a\u79cd\u65b9\u5f0f\u7684\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u5176\u4e2d\u5f02\u6b65\u56de\u586b\u7684\u65b9\u6848\uff0c\u5b8c\u7f8e\u89e3\u51b3\u4e86\u6570\u636e\u56de\u586b\u7684\u8017\u65f6\u95ee\u9898\uff1b \u3010\u89c6\u9891\u4ecb\u7ecd\u3011"},{"location":"#_2","title":"\u4e8c\u3001\u5b89\u88c5\u4f7f\u7528","text":"\u57fa\u7840\u6846\u67b6\uff1ahttps://github.com/linuxdeepin/deepin-autotest-framework \u4ece PyPI \u5b89\u88c5: sudo pip3 install youqu\n \u521b\u5efa\u9879\u76ee: youqu-startproject youqu\n \u5b89\u88c5\u4f9d\u8d56: cd youqu\nbash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002 \u5e94\u7528\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684\u5e94\u7528\u540d\u79f0\u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music cd apps/\n \u5c06\u5e94\u7528\u5e93\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u50cf\u8fd9\u6837\uff1a youqu\n\u251c\u2500\u2500 apps\n\u2502 \u251c\u2500\u2500 autotest_deepin_music # \u5e94\u7528\u5e93\n...\n \u5e94\u7528\u5e93\u7684\u540d\u79f0\u4e0d\u53ef\u4ee5\u4fee\u6539\u3002"},{"location":"#_3","title":"\u4e09\u3001\u8fd0\u884c","text":""},{"location":"#1","title":"1. \u5de5\u4f5c\u7a7a\u95f4","text":"\u57fa\u7840\u6846\u67b6\u5de5\u7a0b\u76ee\u5f55\u5efa\u8bae\u653e\u5728 ~ \u76ee\u5f55\u4e0b\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u4e5f\u53ef\u4ee5\u8fd0\u884c\uff0c\u4f46\u662f\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u9700\u8981\u505a\u73af\u5883\u6e05\u7406\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u5b58\u5728\u4ee3\u7801\u88ab\u5220\u9664\u7684\u98ce\u9669\u3002 \u5982\u679c\u4f60\u7684\u673a\u5668\u4e0a\u4e0d\u540c\u76ee\u5f55\u4e0b\u5b58\u5728\u591a\u4e2a YouQu \u5de5\u7a0b\uff0c\u90a3\u4e48\u5728\u8fd0\u884c\u4e4b\u524d\uff0c\u8bf7\u5148\u6267\u884c env.sh \u6821\u6b63\u76f8\u5173\u73af\u5883\u3002"},{"location":"#2","title":"2. \u6267\u884c\u5668","text":"\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u6709\u4e00\u4e2a manage.py \uff0c\u5b83\u662f\u4e00\u4e2a\u6267\u884c\u5668\u5165\u53e3\uff0c\u63d0\u4f9b\u4e86\u672c\u5730\u6267\u884c\u3001\u8fdc\u7a0b\u6267\u884c\u7b49\u7684\u529f\u80fd\u3002 \u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6765\u6267\u884c\uff1a youqu manage.py run -a deepin-music\n"},{"location":"#21","title":"2.1. \u672c\u5730\u6267\u884c","text":"youqu manage.py run\n"},{"location":"#211","title":"2.1.1. \u914d\u7f6e\u6587\u4ef6","text":"\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u914d\u7f6e\u53c2\u6570 \u5728\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u91cc\u9762\u652f\u6301\u914d\u7f6e\u5bf9\u6267\u884c\u7684\u4e00\u4e9b\u53c2\u6570\u8fdb\u884c\u914d\u7f6e\uff0c\u5e38\u7528\u7684\u5982\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;1\u3001KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2\u3001KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f, e.g. TAGS = L1 or smoke\n;\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\uff0c\u5c06\u8981\u6267\u884c\u7684\u7528\u4f8b\u5199\u5165\u6307\u5b9a\u7684 csv \u6587\u4ef6\n;\u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u4ece\u57fa\u7840\u6846\u67b6\u6839\u76ee\u5f55\u5f00\u59cb\uff1ae.g. CASE_FILE = case_list.txt\n;\u5982\u679c\u8fd9\u91cc\u6709\u503c\uff0cAPP_NAME KEYWORDS TAGS \u7684\u914d\u7f6e\u5747\u4e0d\u751f\u6548\nCASE_FILE =\n;=============================== RUNNER CONFIG ===================================\n[runner]\n;\u6700\u5927\u5931\u8d25\u7528\u4f8b\u6570\u91cf\u7684\u5360\u6bd4\n;\u6bd4\u5982\uff1a\u603b\u6267\u884c\u7528\u4f8b\u6570\u4e3a100, \u82e5 MAX_FAIL = 0.5,\u5219\u5931\u8d25\u7528\u4f8b\u6570\u8fbe\u523050\u5c31\u4f1a\u7ec8\u6b62\u6d4b\u8bd5\u3002\nMAX_FAIL = 0.5\n;\u5355\u6761\u7528\u4f8b\u7684\u8d85\u65f6\u65f6\u95f4\uff0c\u5982\u679c\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u8d85\u65f6\uff0c\u8fd9\u6761\u7528\u4f8b\u4f1a\u88ab\u505c\u6b62\uff0c\u540e\u7eed\u7528\u4f8b\u7ee7\u7eed\u6267\u884c\u3002\n;\u5355\u4f4d\u4e3a\u79d2\n; \u8fd9\u662f\u4e00\u4e2a\u5168\u5c40\u7edf\u4e00\u914d\u7f6e\uff0c\u5982\u679c\u67d0\u6761\u7528\u4f8b\u9700\u8981\u5355\u72ec\u914d\u7f6e\u8d85\u65f6\u65f6\u95f4\uff0c\u53ef\u4ee5\u5728\u7528\u4f8b\u4e2d\u8fd9\u6837\u5199\uff1a\n;@pytest.mark.timeout(500)\n;def test_xxx_001():\n; ...\n;\u4f1a\u8bdd\uff08\u6240\u6709\u7528\u4f8b\u6267\u884c\u7684\uff09\u8d85\u65f6\u662f\u6839\u636e\u5168\u5c40\u8d85\u65f6\u914d\u7f6e\u548c\u7528\u4f8b\u5355\u72ec\u8d85\u65f6\u914d\u7f6e\u81ea\u52a8\u8ba1\u7b97\u7684\uff1b\nCASE_TIME_OUT = 200\n;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\u3002\n;\u6ce8\u610f\uff0c\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u4e0d\u80fd\u5c0f\u4e8e\u5931\u8d25\u5f55\u5c4f\u6b21\u6570\uff0c\u5373 RERUN >= RECORD_FAILED_CASE\nRECORD_FAILED_CASE = 1\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = INFO\n;yes \u6bcf\u6761\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u8fdb\u884c\u73af\u5883\u6e05\u7406\nCLEAN_ALL = yes\n;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\nRESOLUTION = 1920x1080\n;\u4e0d\u8df3\u8fc7\u7528\u4f8b\uff0ccsv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86 skip-xxx\u7684\u7528\u4f8b\u4e0d\u8df3\u8fc7\nNOSKIP = no\n;ignore fixed\n;no\uff0c\u53ea\u8981\u6807\u8bb0\u4e86fixed\u7684\u7528\u4f8b\uff0c\u5373\u4f7f\u6807\u8bb0\u4e86skip-\uff0c\u4e5f\u4f1a\u6267\u884c\uff1b\n;yes\uff0cfixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\uff1b\nIFIXED = no\n;\u8981\u5b89\u88c5deb\u5305\u7684\u8def\u5f84\n;e.g : ~/Downloads/ \u5b89\u88c5\u4e0b\u8f7d\u76ee\u5f55\u4e0b\u7684deb\u5305\uff0c\u5982\u679c\u662f\u8fdc\u7a0b\u6267\u884c\uff0c\u4f1a\u81ea\u52a8\u62f7\u8d1d\u5230\u8fdc\u7a0b\u5e76\u5b89\u88c5\u3002\nDEB_PATH =\n;DEBUG \u6a21\u5f0f\u6267\u884c\u7528\u4f8b\uff0c\u53ea\u6536\u96c6\u4e0d\u6267\u884c\u7528\u4f8b\uff0c\u4e5f\u4e0d\u505a\u8bbe\u5907\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002\nDEBUG = no\n;\u8bb0\u5f55top\u547d\u4ee4\u67e5\u8be2\u7684\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0cTOP = 3 \u8868\u793a\u8bb0\u5f55\u524d3\u4e2a\u8fdb\u7a0b\u3002\nTOP =\n;\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\nREPEAT =\n;\u9ed8\u8ba4\u5728\u6240\u6709\u6d4b\u8bd5\u5b8c\u6210\u4e4b\u540e\u8f93\u51fa\u62a5\u9519\u4fe1\u606f.\n;yes, \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\nDURING_FAIL = no\n;=============================== REPORT CONFIG ===================================\n[report]\n;\u7528\u4f8b\u6267\u884c\u5b8c\u540e\u751f\u6210\u7684\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n;\u76ee\u524d\u652f\u6301 allure, xml, json \uff08\u652f\u6301\u540c\u65f6\u751f\u6210\uff09\nREPORT_FORMAT = allure, xml, json\n;\u6307\u5b9a\u62a5\u544a\u751f\u6210\u7684\u8def\u5f84\uff08\u76f8\u5bf9\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\uff09\nALLURE_REPORT_PATH = report/\nXML_REPORT_PATH = report/\nJSON_REPORT_PATH = report/\n;=============================== GLOBAL CONFIG ===================================\n[globalconfig]\n;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\nPASSWORD = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\nIMAGE_MATCH_NUMBER = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6bcf\u6b21\u95f4\u9694\u7b49\u5f85\u65f6\u95f4\nIMAGE_MATCH_WAIT_TIME = 1\n;\u56fe\u50cf\u8bc6\u522b\u5339\u914d\u5ea6\nIMAGE_RATE = 0.9\n;\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u5b9e\u65f6\u56fe\u50cf\u4fdd\u5b58\u8def\u5f84\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u5750\u6807\nSCREEN_CACHE = /tmp/screen.png\n;\u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\u7684\u8def\u5f84\nTMPDIR = /tmp/tmpdir\n;\u7cfb\u7edf\u4e3b\u9898\nSYS_THEME = deepin\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = http://youqu-dev.uniontech.com:8890\n;OpenCV\u670d\u52a1\u7aef\u5730\u5740\nOPENCV_SERVER_HOST = http://youqu-dev.uniontech.com:8889\n;=============================== PMS CONFIG ===================================\n;PMS\u76f8\u5173\u914d\u7f6e\uff0c\u5305\u542b\u4ee5\u4e0b\u51e0\u4e2a\u65b9\u9762\uff1a\n;1.PMS\u6d4b\u8bd5\u5957\u6267\u884c\n;2.\u81ea\u52a8\u4ecePMS\u722c\u53d6\u6570\u636e\u5e76\u540c\u6b65\u672c\u5730CSV\u6587\u4ef6\n;3.PMS\u6570\u636e\u56de\u586b\n[pms]\n;PMS\u7684\u7528\u6237\u540d: ut001234\nPMS_USER =\n;PMS\u7684\u5bc6\u7801\nPMS_PASSWORD =\n;PMS\u6d4b\u8bd5\u5957\u7684ID\n;\u5728PMS\u4e0a\u67e5\u770b\u7528\u4f8b\u201c\u5957\u4ef6\u201d\u94fe\u63a5: https://pms.uniontech.com/testsuite-view-495.html\n;\u6d4b\u8bd5\u5957ID\u4e3a: 495\nSUITE_ID =\n;\u6570\u636e\u56de\u586b\u5fc5\u987b\u5173\u8054PMS\u6d4b\u8bd5\u5355\n;\u5728PMS\u4e0a\u67e5\u770b\u6d4b\u8bd5\u5355\u94fe\u63a5: https://pms.uniontech.com/testtask-cases-20747.html\n;\u6d4b\u8bd5\u5355ID\u4e3a: 20747\nTASK_ID =\n;\u5c06\u6d4b\u8bd5\u7ed3\u679c\u6570\u636e\u56de\u586b\u5230PMS\n;\u4e3a\u7a7a: \u8868\u793a\u4e0d\u56de\u586b,\u4e0d\u4f1a\u5728\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u751f\u6210json\u7ed3\u679c\u6587\u4ef6;\n;async: \u8868\u793a\u9010\u6761\u5f02\u6b65\u56de\u586b,\u540e\u9762\u4e00\u6761\u6267\u884c\u5f00\u59cb\u65f6\u901a\u8fc7\u5b50\u7ebf\u7a0b\u5bf9\u524d\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u8fdb\u884c\u56de\u586b\uff0c\u5982\u6b64\u5b9e\u73b0\u65f6\u95f4\u6548\u7387\u6700\u5927\u5316;\n;finish: \u8868\u793a\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u6210\u4e4b\u540e\u9010\u4e2a\u56de\u586b(PMS\u4e0d\u652f\u6301\u5e76\u53d1);\nSEND_PMS =\n;\u6570\u636e\u56de\u586b\u7684\u89e6\u53d1\u8005\n;auto: \u6846\u67b6\u81ea\u52a8\u56de\u586b,\u914d\u5408SEND_PMS\u914d\u7f6e\u4f7f\u7528,\u4f60\u53ef\u4ee5\u9009\u62e9\u5728\u4e0d\u540c\u7684\u9636\u6bb5\u8fdb\u884c\u6570\u636e\u56de\u586b;\n;hand: \u624b\u52a8\u56de\u586b,\u6bcf\u6761\u7528\u4f8b\u4ecd\u7136\u4f1a\u751f\u6210json\u6587\u4ef6,\u4f46\u6846\u67b6\u4e0d\u4f1a\u8fdb\u884c\u6570\u636e\u56de\u586b,\u9700\u8981\u4f60\u53ef\u4ee5\u5728\u4f60\u60f3\u8981\u53d1\u9001\u7684\u65f6\u95f4\u70b9\u624b\u52a8\u89e6\u53d1\u56de\u586b;\nTRIGGER = auto\n;PMS\u56de\u586b\u7684\u91cd\u8bd5\u6b21\u6570\n;\u5982\u679c\u63a5\u53e3\u8bf7\u6c42\u5931\u8d25,\u4f1a\u8fdb\u884c\u91cd\u8bd5\nSEND_PMS_RETRY_NUMBER = 2\n[csv_link_pms_lib]\n;caselib: \u7528\u4f8b\u5e93\n;testcase: \u4ea7\u54c1\u5e93\u7528\u4f8b\nCASE_FROM = caselib\n[csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/caselib-browse-81.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 81\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic =\n[export_csv]\n;\u5bfc\u51fa\u7684csv\u6587\u4ef6\u540d\u79f0\uff0c\u9ed8\u8ba4 case_list.csv\nCSV_FILE = case_list.csv\n;exportcsv \u547d\u4ee4\u5bfc\u51fa case_list.csv \u6587\u4ef6\u65f6\u914d\u7f6e\u7684\u5b57\u6bb5\u540d\uff0c\u7528\u4f8b\u540d\u79f0\u9ed8\u8ba4\u5b58\u5728\u7b2c\u4e00\u5217\uff0c\u65e0\u9700\u6dfb\u52a0\nCSV_HEARD = \u7528\u4f8b\u7ea7\u522b,\u7528\u4f8b\u7c7b\u578b,\u6d4b\u8bd5\u7ea7\u522b,\u662f\u5426\u8df3\u8fc7\n \u914d\u7f6e\u5b8c\u6210\u4e4b\u540e\uff0c\u76f4\u63a5\u5728\u547d\u4ee4\u884c\u6267\u884c manage.py \u5c31\u597d\u4e86\u3002 youqu manage.py run\n"},{"location":"#212","title":"2.1.2. \u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a youqu manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--max_fail MAX_FAIL \u6700\u5927\u5931\u8d25\u7387\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--resolution RESOLUTION\n\u68c0\u67e5\u5206\u8fa8\u7387\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms {,async,finish}\n\u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--trigger {,auto,hand}\n\u89e6\u53d1\u8005\n-f CASE_FILE, --case_file CASE_FILE\n\u6839\u636e\u6587\u4ef6\u6267\u884c\u7528\u4f8b\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n--pms_user PMS_USER pms \u7528\u6237\u540d\n--pms_password PMS_PASSWORD\npms \u5bc6\u7801\n--suite_id SUITE_ID pms \u6d4b\u8bd5\u5957ID\n--pms_info_file PMS_INFO_FILE\npms \u4fe1\u606f\u6587\u4ef6\n--top TOP \u8fc7\u7a0b\u4e2d\u8bb0\u5f55top\u547d\u4ee4\u4e2d\u7684\u503c\n--lastfailed \u4ec5\u6267\u884c\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\n--duringfail \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\n--repeat REPEAT \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n--project_name PROJECT_NAME\n\u5de5\u7a0b\u540d\u79f0\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--build_location BUILD_LOCATION\n\u6784\u5efa\u5730\u533a\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--line LINE \u6267\u884c\u7684\u4e1a\u52a1\u7ebf\uff08\u5199\u5165json\u6587\u4ef6\uff09\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a youqu manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\"\n \u547d\u4ee4\u884c\u53c2\u6570\u4f18\u5148\u7ea7\u662f\u9ad8\u4e8e\u914d\u7f6e\u6587\u4ef6\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u4e86\u5bf9\u5e94\u7684\u53c2\u6570\uff0c\u914d\u7f6e\u6587\u4ef6\u4e2d\u4e0d\u7ba1\u662f\u5426\u914d\u7f6e\u5747\u4e0d\u751f\u6548\u3002 --app \u5165\u53c2\u8fd8\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\uff0c\u4e0b\u9762\u7684\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u540c\u6837\u652f\u6301\u3002"},{"location":"#22","title":"2.2. \u8fdc\u7a0b\u6267\u884c","text":"youqu manage.py remote\n \u8fdc\u7a0b\u6267\u884c\u540c\u6837\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u8fdb\u884c\u7528\u4f8b\u76f8\u5173\u914d\u7f6e\uff1b \u9700\u8981\u91cd\u70b9\u8bf4\u4e00\u4e0b\u8fdc\u7a0b\u6267\u884c\u65f6\u7684\u6d4b\u8bd5\u673a\u4fe1\u606f\u914d\u7f6e\uff0c\u5728\u914d\u7f6e\u6587\u4ef6 setting/remote.ini \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\u3001IP\u3001\u5bc6\u7801\u3002 ;=============================== CLIENT LIST =====================================\n; \u6d4b\u8bd5\u673a\u914d\u7f6e\u5217\u8868\n;[client{number}] ;\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u6709\u591a\u5c11\u53f0\u6d4b\u8bd5\u673a\u5c31\u5199\u591a\u5c11\u4e2a client\uff0c\u522b\u540d\u5fc5\u987b\u5305\u542b client \u5b57\u7b26\uff0c\u4e14\u4e0d\u80fd\u91cd\u590d\u3002\n;user = ;\u6d4b\u8bd5\u673a user\n;ip = ;\u6d4b\u8bd5\u673a ip\n;password = 1 ;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801, \u53ef\u4ee5\u4e0d\u914d\u7f6e\u6b64\u9879\uff0c\u9ed8\u8ba4\u53d6 CLIENT_PASSWORD \u7684\u503c\uff1b\n;\u5982\u679c\u4f60\u6240\u6709\u6d4b\u8bd5\u673a\u5bc6\u7801\u90fd\u76f8\u540c\uff0c\u90a3\u4e48\u53ea\u9700\u8981\u914d\u7f6e CLIENT_PASSWORD \u5c31\u53ef\u4ee5\u4e86\n;=================================================================================\n[client1]\nuser = uos\nip = 10.8.15.xx\n[client2]\nuser = uos\nip = 10.8.15.xx\n[client3]\nuser = uos\nip = 10.8.11.xx\n \u6709\u591a\u5c11\u53f0\u673a\u5668\u5c31\u50cf\u8fd9\u6837\u6328\u7740\u5199\u5c31\u884c\u4e86\u3002 \u7136\u540e\u5728\u547d\u4ee4\u884c\uff1a youqu manage.py remote\n \u8fd9\u6837\u8fd0\u884c\u662f\u4ece\u914d\u7f6e\u6587\u4ef6\u53bb\u8bfb\u53d6\u76f8\u5173\u914d\u7f6e\u3002 \u5982\u679c\u4f60\u4e0d\u60f3\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\uff0c\u4f60\u4ecd\u7136\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u8fdb\u884c\u4f20\u53c2\uff0c \u4ee5\u4e0b\u4e3a python3 manage.py remote \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-c CLIENTS, --clients CLIENTS\n\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679cpassword\u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6\nsetting/remote.ini \u4e2d CLIENT_PASSWORD\n\u7684\u503c,\u6bd4\u5982\uff1auos@10.8.13.33:1 \u6216 uos@10.8.13.33\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-s {yes,no,}, --send_code {yes,no,}\n\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a\uff08\u4e0d\u542breport\u76ee\u5f55\uff09\n-e, --build_env \u642d\u5efa\u6d4b\u8bd5\u73af\u5883,\u5982\u679c\u4e3ayes\uff0c\u4e0d\u7ba1send_code\u662f\u5426\u4e3ayes\u90fd\u4f1a\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a.\n-p CLIENT_PASSWORD, --client_password CLIENT_PASSWORD\n\u6d4b\u8bd5\u673a\u5bc6\u7801\uff08\u5168\u5c40\uff09\n-y PARALLEL, --parallel PARALLEL\nyes:\u8868\u793a\u6240\u6709\u6d4b\u8bd5\u673a\u5e76\u884c\u8dd1\uff0c\u6267\u884c\u76f8\u540c\u7684\u6d4b\u8bd5\u7528\u4f8b\uff0cno\n:\u8868\u793a\u6d4b\u8bd5\u673a\u5206\u5e03\u5f0f\u6267\u884c\uff0c\u670d\u52a1\u7aef\u4f1a\u6839\u636e\u6536\u96c6\u5230\u7684\u6d4b\u8bd5\u7528\u4f8b\u81ea\u52a8\u5206\u914d\u7ed9\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u3002\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms SEND_PMS \u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n \u5728\u547d\u4ee4\u884c\u8fd9\u6837\u8fd0\u884c\uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\"\n \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report \u76ee\u5f55\u4e0b\u56de\u6536\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u7684\u6d4b\u8bd5\u62a5\u544a\u3002 \u914d\u7f6e\u6587\u4ef6\u5176\u4ed6\u76f8\u5173\u914d\u7f6e\u9879\u8be6\u7ec6\u8bf4\u660e\uff0c\u8bf7\u67e5\u770b\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u6ce8\u91ca\u5185\u5bb9\u3002"},{"location":"#23-pms","title":"2.3. PMS \u6570\u636e\u56de\u586b","text":"\u6d4b\u8bd5\u5355\u5173\u8054\u7684\u7528\u4f8b\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u5bf9\u5e94\u7684\u53bb\u8dd1\u8fd9\u4e9b\u5173\u8054\u7684\u7528\u4f8b\uff0c\u5e76\u4e14\u5c06\u6267\u884c\u7684\u7ed3\u679c\u56de\u586b\u7684\u6d4b\u8bd5\u7528\u4f8b\u7684\u72b6\u6001\u91cc\u9762\u3002 PMS \u6570\u636e\u56de\u586b\u4e3b\u8981\u6709\u4e09\u79cd\u65b9\u5f0f\uff1a \uff081\uff09\u5f02\u6b65\u56de\u586b \u5728\u7528\u4f8b\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\uff0c\u91c7\u7528\u5f02\u6b65\u7684\u65b9\u5f0f\u53bb\u8fdb\u884c\u6570\u636e\u56de\u586b\uff0c\u76f4\u767d\u7684\u8bb2\u5c31\u662f\uff0c\u7b2c\u4e8c\u6761\u7528\u4f8b\u5f00\u59cb\u8dd1\u7684\u65f6\u5019\uff0c\u901a\u8fc7\u5b50\u7ebf\u7a0b\u53bb\u505a\u7b2c\u4e00\u6761\u7528\u4f8b\u7684\u6570\u636e\u56de\u586b\uff0c\u5982\u6b64\u5faa\u73af\uff0c\u76f4\u5230\u6240\u6709\u7528\u4f8b\u6267\u884c\u7ed3\u675f\uff1b \u8fd9\u79cd\u65b9\u6848\u7684\u65f6\u95f4\u6548\u7387\u6700\u9ad8\u7684\uff0c\u56e0\u4e3a\u7406\u8bba\u4e0a\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u662f\u5927\u4e8e\u6570\u636e\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\u65f6\u95f4\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u5f53\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u6570\u636e\u56de\u586b\u4e5f\u5b8c\u6210\u4e86\u3002 \u4f7f\u7528\u65b9\u6cd5\uff0c\u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u4ee5\u4e0b\u53c2\u6570\uff1a\uff08\u4ee5\u4e0b\u6d89\u53ca\u5230\u7684\u53c2\u6570\u914d\u7f6e\u90fd\u662f\u5728\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u914d\u7f6e\uff09 PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = async\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \u8fd9\u4e2a\u53c2\u6570\u53ef\u586b\u53ef\u4e0d\u586b\uff0c\u4f46\u662f\u586b\u4e86\u53ef\u4ee5\u63d0\u9ad8\u7528\u4f8b\u7684\u6267\u884c\u901f\u5ea6\uff0c\u56e0\u4e3a\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u53ef\u4ee5\u6307\u5b9a\u5230\u5177\u4f53\u7684\u5e94\u7528\u5e93\u3002\uff08\u4e0b\u540c\uff09\n \uff082\uff09\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u56de\u586b \u7b49\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u518d\u9010\u4e2a\u8fdb\u884c\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u6b64\u65b9\u6848\u65f6\u95f4\u6548\u7387\u6bd4\u8f83\u4f4e\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \uff083\uff09\u624b\u52a8\u56de\u586b \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4e0d\u505a\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u540e\u7eed\u624b\u52a8\u5c06\u7ed3\u679c\u8fdb\u884c\u56de\u586b\u8bf7\u6c42\u3002 \u7528\u4f8b\u6267\u884c\u65f6\u914d\u7f6e\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = hand\nAPP_NAME = \u540e\u7eed\u624b\u52a8\u56de\u586b\u65b9\u6cd5\uff1a youqu manage.py pms --send2task yes\n"},{"location":"#_4","title":"\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898","text":"\u7531\u540c\u5b66\u53ef\u80fd\u4f1a\u53d1\u73b0\uff0c\u600e\u4e48\u56de\u586b\u4e00\u6b21\u4e4b\u540e\uff0c\u540e\u9762\u60f3\u518d\u6b21\u56de\u586b\u5c31\u4e0d\u751f\u6548\u4e86\uff1b \u8fd9\u662f\u56e0\u4e3a\u4e3a\u4e86\u5e94\u5bf9\u524d\u9762\u63d0\u5230\u7684\u591a\u79cd\u6570\u636e\u56de\u586b\u7684\u65b9\u5f0f\uff0c\u5728 report \u76ee\u5f55\u4e0b\u4f1a\u7531 pms_xxx \u5f00\u5934\u7684\u76ee\u5f55\uff0c\u8bb0\u5f55\u4e86\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u548c\u56de\u586b\u60c5\u51b5\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u4e4b\u524d\u5df2\u7ecf\u56de\u586b\u8fc7\u4e86\uff0c\u540e\u7eed\u5c31\u4e0d\u4f1a\u518d\u6b64\u89e6\u53d1\u56de\u586b\u4e86\uff1b \u5982\u679c\u4f60\u60f3\u91cd\u65b0\u505a\u56de\u586b\uff0c\u4f60\u53ef\u4ee5\u628a report/pms_xxx \u76ee\u5f55\u5220\u6389\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u91cd\u65b0\u505a\u6570\u636e\u56de\u586b\u4e86\uff1b"},{"location":"#24-csv","title":"2.4. \u5bfc\u51fa CSV \u6587\u4ef6","text":"\u6846\u67b6\u63d0\u4f9b\u5bfc\u51fa\u6307\u5b9a\u6807\u7b7e\u7528\u4f8b\u7684\u529f\u80fd\uff1a youqu manage.py exportcsv -a deepin-album -t CICD\n \u8868\u793a\u5bfc\u51fa deepin-album \u7684\u7528\u4f8b\u4e2d\u6807\u8bb0\u4e86 CICD \u6807\u7b7e\u7684\u7528\u4f8b\uff0c\u5bfc\u51fa CSV \u6587\u4ef6\u7684\u5b57\u6bb5\u683c\u5f0f\u5df2\u7ecf\u9002\u914d\u4e86 CICD \u7684\u8981\u6c42\u3002"},{"location":"#25-app","title":"2.5. \u811a\u624b\u67b6\u65b0\u5efa APP \u5de5\u7a0b","text":"\u65b0\u5efa\u4e00\u4e2a APP \u5de5\u7a0b\uff1a youqu manage.py startapp autotest_deepin_some \u8fd9\u6837\u5728 apps \u76ee\u5f55\u4e0b\u4f1a\u521b\u5efa\u4e00\u4e2a\u5b50\u9879\u76ee\u5de5\u7a0b autotest_deepin_some\uff0c\u540c\u65f6\u65b0\u5efa\u597d\u5de5\u7a0b\u6a21\u677f\u76ee\u5f55\u548c\u6a21\u677f\u6587\u4ef6\uff1a apps\n\u2514\u2500\u2500 autotest_deepin_some\n \u00a0\u00a0 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_case.py\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 config.ini\n \u00a0\u00a0 \u251c\u2500\u2500 config.py\n \u00a0\u00a0 \u251c\u2500\u2500 conftest.py\n \u00a0\u00a0 \u251c\u2500\u2500 control\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_assert.py\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some.csv\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u2514\u2500\u2500 widget\n \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 case_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 other.ini\n \u00a0\u00a0 \u251c\u2500\u2500 other_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 pic_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2514\u2500\u2500 ui.ini\n autotest_deepin_some \u662f\u4f60\u7684\u5de5\u7a0b\u540d\u79f0\uff0c\u6bd4\u5982\uff1aautotest_deepin_music \uff1b \u5728\u6b64\u57fa\u7840\u4e0a\uff0c\u4f60\u53ef\u4ee5\u5feb\u901f\u7684\u5f00\u59cb\u4f60\u7684 AT \u9879\u76ee\u3002"},{"location":"#26","title":"2.6. \u7528\u4f8b\u6807\u7b7e\u81ea\u52a8\u540c\u6b65","text":"\u7528\u4e8e\u81ea\u52a8\u540c\u6b65 PMS \u7528\u4f8b\u6807\u7b7e\u6570\u636e\u81f3\u672c\u5730 CSV \u6587\u4ef6\uff0c\u4e3b\u8981\u901a\u8fc7\u4ee5\u4e0b\u51e0\u4e2a\u914d\u7f6e\u6765\u63a7\u5236\uff1a APP_NAME = # \u6307\u5b9a\u8981\u540c\u6b65\u7684\u5e94\u7528\u540d\u79f0\nPMS_USER = # PMS\u7684\u7528\u6237\u540d\nPMS_PASSWORD = # PMS\u7684\u5bc6\u7801\n \u5728 [csv_link_pms_id] \u8282\u70b9\u4e0b\u6307\u5b9a csv \u6587\u4ef6\u540d\u4e0e PMS \u7528\u4f8b\u6a21\u5757\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u6bd4\u5982\uff1a [csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/testcase-browse-53.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 53\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic = 53\n \u5c06\u4ee5\u4e0a\u4fe1\u606f\u914d\u7f6e\u597d\u4e4b\u540e\uff0c\u5728\u547d\u4ee4\u884c\u6267\u884c\uff1a youqu manage.py pms --pms2csv yes\n \u6bcf\u6b21\u6267\u884c\u65f6\u539f csv \u6587\u4ef6\u4f1a\u81ea\u52a8\u5907\u4efd\u5728 report/csv_back \u76ee\u5f55\u4e0b\uff0c\u56e0\u6b64\u4f60\u4e0d\u7528\u62c5\u5fc3\u811a\u672c\u6267\u884c\u5bfc\u81f4\u4f60\u7684\u6570\u636e\u4e22\u5931\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u57fa\u7840\u6846\u67b6\u8bbe\u8ba1\u65b9\u6848","text":"# ====================================\n# Author : Mikigo\n# Time : 2022/3/18\n# version \uff1a1.0\n# ====================================\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"\u505a\u4e00\u4e2a\u7b80\u5355\u3001\u597d\u7528\u3001\u529f\u80fd\u5f3a\u5927\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u3002 \u4f5c\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4e00\u4e2a\u57fa\u7840\u6846\u67b6\uff0c\u4efb\u4f55\u5e94\u7528\u90fd\u80fd\u5f88\u65b9\u4fbf\u7684\u63a5\u5165\u8fdb\u6765\uff1b \u63d0\u4f9b\u6240\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u9700\u8981\u7684\u5e95\u5c42\u529f\u80fd\uff0c\u5e76\u5bf9\u5916\u63d0\u4f9b\u552f\u4e00\u7684\u63a5\u53e3\uff0c\u65b9\u4fbf\u5e94\u7528\u5e93\u4f7f\u7528\uff1b \u6574\u5408\u516c\u5171\u5e93\uff0c\u51cf\u5c11\u5e94\u7528\u5e93\u4ee3\u7801\u91cf\u548c\u65b9\u6cd5\u7ef4\u62a4\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u8bbe\u8ba1\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u7edf\u4e00\u6982\u5ff5","text":" \u57fa\u7840\u6846\u67b6 \u672c\u9879\u76ee\u662f\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\uff08AutoTest Basic Frame\uff09\uff0c\u5168\u79f0\u4e3a\u201c\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff08AT \u57fa\u7840\u6846\u67b6\uff09\u201d\u3002 AT \u57fa\u7840\u6846\u67b6\u662f\u505a\u4e3a\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\u6765\u8bbe\u8ba1\u7684\uff0c\u5b83\u63d0\u4f9b\u4e86\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u57fa\u7840\u529f\u80fd\uff0c\u4efb\u4f55\u5e94\u7528\u63a5\u5165\u8fdb\u6765\u90fd\u80fd\u5feb\u901f\u65b9\u4fbf\u7684\u8fdb\u884c\u65b9\u6cd5\u548c\u7528\u4f8b\u7f16\u5199\uff0c\u540c\u65f6\u5728\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u3001\u6807\u7b7e\u5316\u6267\u884c\u3001\u5206\u5e03\u5f0f\u6267\u884c\u3001\u591a\u79cd\u62a5\u544a\u8f93\u51fa\u3001\u4f18\u7f8e\u7684\u6267\u884c\u65e5\u5fd7\u3001\u5931\u8d25\u81ea\u52a8\u5f55\u5c4f\u548c\u622a\u56fe\u3001\u81ea\u52a8\u73af\u5883\u6e05\u7406\u7b49\u7b49\uff0c\u5b83\u90fd\u63d0\u4f9b\u4e86\u5b8c\u5584\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u66f4\u91cd\u8981\u7684\u662f\u8fd9\u4e00\u5207\u4f7f\u7528\u8d77\u6765\u90fd\u975e\u5e38\u7b80\u5355\u3002 \u57fa\u7840\u6846\u67b6\u4e2d\u5305\u542b\u5e94\u7528\u5e93\uff08apps\uff09\u3001\u6838\u5fc3\u5e93\uff08src\uff09\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09\u3002 \u5e94\u7528\u5e93\uff08apps\uff09 \u5404\u4e2a\u5e94\u7528\u81ea\u5df1\u7684\u4ed3\u5e93\uff0c\u91cc\u9762\u4e3b\u8981\u5305\u542b\u7684\u662f\u7528\u4f8b\u3001\u65b9\u6cd5\u53ca\u4e00\u4e9b\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u53eb autotest-dde-file-manager \u3002 \u6838\u5fc3\u5e93\uff08src\uff09 \u6838\u5fc3\u5e93\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u5230\u6240\u6709\u5e95\u5c42\u6838\u5fc3\u529f\u80fd\uff0c\u8fd9\u662f\u6700\u91cd\u8981\u7684\u4e00\u4e2a\u90e8\u5206\uff0c\u7075\u9b42\u3002\u5177\u4f53\u529f\u80fd\u6a21\u5757\u53ca\u8bf4\u660e\u4f1a\u5728\u4e0b\u9762\u7b2c\u56db\u4e2a\u7ae0\u8282\u8be6\u7ec6\u63cf\u8ff0\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09 \u591a\u4e2a\u5e94\u7528\u90fd\u8981\u7528\u5230\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\uff0c\u6309\u7167\u5e94\u7528\u5212\u5206\u5b58\u653e\uff0c\u4e3b\u8981\u662f\u4e3a\u4e86\u51cf\u5c11\u4ee3\u7801\u91cf\uff0c\u6d88\u9664\u5e94\u7528\u95f4\u7684\u8026\u5408\u5173\u7cfb\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u67b6\u6784\u56fe","text":"\u6574\u4f53\u7684\u6846\u67b6\u8bbe\u8ba1\u5728\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u300b\u6587\u6863\u91cc\u9762\u5df2\u7ecf\u6709\u8be6\u7ec6\u63cf\u8ff0\u4e86\uff0c\u8fd9\u91cc\u8d34\u4e00\u4e0b\u6574\u4f53\u7684\u67b6\u6784\u56fe\uff1a \u4e3a\u4e86\u7a81\u663e\u672c\u6587\u7684\u91cd\u70b9\uff0c\u62bd\u53d6\u5176\u4e2d\u91cd\u8981\u529f\u80fd\u6a21\u5757\uff0c\u5982\u4e0b\u56fe\uff1a "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-basic-frame # \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\n\u251c\u2500\u2500 apps # \u5e94\u7528\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-dde-file-manager # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\uff08\u5e94\u7528\u5e93\u8be6\u7ec6\u76ee\u5f55\u7ed3\u6784\u8bf7\u770b\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\uff09\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 tag # \u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u2514\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u2502 \u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 xxx.png\n\u2502 \u2502 ...\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-deepin-music # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 public # \u516c\u5171\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget # dde_dock \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget # dde_desktop \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 src # \u6838\u5fc3\u5e93\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 button_center.py\n\u2502 \u251c\u2500\u2500 cmdtrl.py\n\u2502 \u251c\u2500\u2500 dogtails.py\n\u2502 \u251c\u2500\u2500 find_image.py\n\u2502 \u251c\u2500\u2500 global_config.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 setting # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 config.py\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 global_config.ini\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\u6a21\u5757\uff08Hook\uff09\n\u251c\u2500\u2500 pytest.ini # Pytest \u9ed8\u8ba4\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 docs # \u6587\u6863\u76ee\u5f55\n\u2514\u2500\u2500 manage.py # \u6267\u884c\u5668\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1apps","title":"1\u3001\u5e94\u7528\u5e93\uff08apps\uff09","text":"\u6240\u6709\u5e94\u7528\u5e93\u5747\u653e\u7f6e\u5728\u57fa\u7840\u6846\u67b6\u4e0b\u7684 apps \u76ee\u5f55\u4e0b\uff08\u89c1\u7b2c\u4e8c\u7ae0\u8282\u7b2c3\u6bb5\u76ee\u5f55\u7ed3\u6784\u5185\u5bb9\uff09\u3002\u5e94\u7528\u5e93\u7684\u67b6\u6784\u8bbe\u8ba1\u53ef\u4ee5\u53c2\u8003\u300aAT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b\u6587\u6863\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2src","title":"2\u3001\u6838\u5fc3\u5e93\uff08src\uff09","text":"\u5728 src \u76ee\u5f55\u4e0b\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u5e95\u5c42\u6838\u5fc3\u7ec4\u4ef6\uff0c\u901a\u5e38\u6765\u8bb2\u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5230\u5176\u4e2d\u67d0\u4e00\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4e48\u4f60\u9700\u8981\u663e\u793a\u7684\u5bfc\u5165\u8fd9\u4e2a\u6a21\u5757\uff0c\u7136\u540e\u624d\u80fd\u4f7f\u7528\u8be5\u6a21\u5757\u4e0b\u7684\u529f\u80fd\uff0c\u5982\u679c\u4f60\u7528\u5230\u4e86\u5341\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4f60\u5c31\u9700\u8981\u5bfc\u5165\u5341\u4e2a\u3002\u4f46\u662f\u6211\u4eec\u60f3\u8ba9\u4e8b\u60c5\u53d8\u5f97\u7b80\u5355\uff0c\u4e00\u6b21\u5bfc\u5165\uff0c\u4f7f\u7528\u6240\u6709\u3002 \u5c06\u6240\u6709\u7684\u529f\u80fd\u6a21\u5757\u90fd\u8fdb\u5165\u5230 src \u7684\u540d\u79f0\u7a7a\u95f4\uff0c\u5728 src/__init__.py \u91cc\u9762\u6211\u4eec\u8bbe\u8ba1\u6210\u8fd9\u6837\uff1a # src/__init__.py\nfrom .cmdctl import CmdCtl\nfrom .dogtails import Dogtail\nfrom .find_image import FindImage\nfrom .button_center import ButtonCenter\nclass Src(CmdCtl, FindImage):\ndef __init__(self, **kwargs):\n\"\"\"dogtail or button center param\n :param kwargs: app_name, desc, number\n \"\"\"\nif kwargs:\napp_name = kwargs.get(\"APP_NAME\")\ndesc = kwargs.get(\"DESC\")\nif app_name is None or desc is None:\nraise ValueError\nnumber = kwargs.get(\"number\")\nnumber = number if isinstance(number, int) else -1\n# \u5bf9\u8c61\u7ec4\u5408\nself.dog = Dogtail(app_name, desc, number)\nself.ui = ButtonCenter(app_name, number)\n \u9700\u8981\u4f20\u9012\u53c2\u6570\u7684\u91c7\u7528\u5bf9\u8c61\u7ec4\u5408\uff0c\u6ca1\u6709\u53c2\u6570\u7684\u4f7f\u7528\u7ee7\u627f\uff0c\u7ee7\u627f\u7684\u7c7b\u7b26\u5408 Mixin \u8bbe\u8ba1\u6a21\u5f0f\u3002 \u5e94\u7528\u5e93\u91cc\u9762\u4f7f\u7528\u7684\u65f6\u5019\u5728 widget/base_widget.py \u91cc\u9762\u53ea\u9700\u8981\u552f\u4e00\u7ee7\u627f Src \uff1a # \u5e94\u7528\u5e93\u91cc\u9762\u65b9\u6cd5\u57fa\u7c7b\n# widget/base_widget.py\nfrom src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n \u8981\u4f7f\u7528\u6838\u5fc3\u5e93\u7684\u529f\u80fd\uff0c\u53ea\u9700\u8981\u5199\u4e00\u4e2a\u5bfc\u5165 from src import Src \u5373\u53ef\u3002 \u5199 __init__ \u6784\u9020\u51fd\u6570\u7684\u539f\u56e0\u662f\u901a\u8fc7\u53c2\u6570\u6784\u9020\u5e94\u7528\uff0c\u5e76\u4e14\u4f20\u9012 number \u8fdb\u6765\uff0c\u53ef\u4ee5\u5b9e\u73b0\u591a\u7a97\u53e3\u7684\u63a7\u5236\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3public","title":"3\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09","text":"\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6bcf\u4e2a\u5e94\u7528\u90fd\u662f\u4e00\u4e2a\u5355\u72ec\u7684 py \u6587\u4ef6\uff0c\u76f8\u4e92\u4e4b\u95f4\u662f\u72ec\u7acb\u7684\uff0c\u6bcf\u4e2a py \u6587\u4ef6\u91cc\u9762\u662f\u8be5\u5e94\u7528\u7684\u65b9\u6cd5\u7c7b\uff0c\u6bd4\u5982\uff1a\u6700\u5e38\u7528\u7684\u65b9\u6cd5\u7c7b dde_desktop_public_widget.py # dde_desktop_widget.py\nfrom src import Src\nclass _DdeDesktopPublicBaseWidget(Src):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-desktop\"\nDESC = \"/usr/bin/dde-desktop\"\ndef __init__(self):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC)\nclass DdeDesktopPublicWidget(_DdeDesktopPublicBaseWidget):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u7c7b\"\"\"\ndef click_music_dir_by_ui(self):\n\"\"\"\u5728\u6587\u4ef6\u9009\u62e9\u6846\u70b9\u51fb\u97f3\u4e50\u76ee\u5f55\"\"\"\nself.click(*self.ui.btn_center(\"\u4fa7\u8fb9\u680f-\u97f3\u4e50\")) \ndef click_xxx_by_attr(self):\npass\n \u516c\u5171\u65b9\u6cd5\u5e93\u610f\u4e49\uff1a \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6240\u5c01\u88c5\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\u90fd\u662f\u81f3\u5c11\u88ab2\u4e2a\u5e94\u7528\u90fd\u7528\u5230\u7684\uff0c\u8fd9\u6837\u505a\u53ef\u4ee5\u51cf\u5c11\u6574\u4f53\u4ee3\u7801\u91cf\uff0c\u4ece\u800c\u51cf\u8f7b\u5e94\u7528\u5e93\u4ee3\u7801\u7684\u7ef4\u62a4\u5de5\u4f5c\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u7f16\u5199\u5f62\u5f0f\uff08\u547d\u540d\u89c4\u5219\u3001\u5b9a\u4f4d\u7684\u65b9\u6848\u5199\u6cd5\u3001\u6ce8\u91ca\u7684\u5199\u6cd5\u7b49\u7b49\uff09\u5177\u6709\u4e00\u5b9a\u7684\u6a21\u677f\u4f5c\u7528\uff0c\u8fd9\u6837\u5373\u4f7f\u662f\u5404\u4e2a\u5e94\u7528\u5e93\u90fd\u72ec\u7acb\u7ef4\u62a4\uff0c\u6240\u6709\u7684\u7f16\u7801\u98ce\u683c\u90fd\u662f\u8d8b\u4e8e\u76f8\u540c\u7684\uff0c\u56e0\u4e3a\u5927\u5bb6\u90fd\u5e94\u8be5\u53c2\u7167\u516c\u5171\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u5199\u6cd5\u6765\u5199\u81ea\u5df1\u5e94\u7528\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\u7c7b\uff0c\u8fd9\u6837\u4f7f\u5f97\u4ece\u516c\u53f8\u7684\u89d2\u5ea6\u53bb\u770b\u6240\u6709\u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u90fd\u662f\u7edf\u4e00\u7684\u3002 \u53ef\u4ee5\u901a\u8fc7\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\uff0c\u4e86\u89e3\u5230\u5176\u4ed6\u5e94\u7528\u7684\u529f\u80fd\uff0c\u5bf9\u4e8e\u6211\u4eec\u9700\u6c42\u7406\u89e3\uff0c\u4e86\u89e3\u7cfb\u7edf\u7684\u65b9\u65b9\u9762\u9762\u4e5f\u6709\u597d\u5904\u3002 \u5f53\u7136\uff0c\u5982\u679c\u4f60\u7684\u5e94\u7528\u672c\u8eab\u662f\u5c5e\u4e8e\u6839\u672c\u5c31\u4e0d\u9700\u8981\u548c\u5176\u4ed6\u5e94\u7528\u4ea4\u4e92\u7684\uff0c\u90a3\u4e48\u4f60\u53ef\u80fd\u4e0d\u4f1a\u7528\u5230\u8fd9\u91cc\u9762\u7684\u529f\u80fd\uff0c\u6ca1\u5173\u7cfb\uff0c\u4f60\u6240\u6709\u7684\u65b9\u6cd5\u90fd\u53ef\u4ee5\u76f4\u63a5\u5199\u5728\u5e94\u7528\u5e93\u7684\u4e1a\u52a1\u5c42\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4conftestpy","title":"4\u3001conftest.py","text":"conftest.py \u4ece\u529f\u80fd\u4e0a\u5c06\u662f\u5c5e\u4e8e\u6838\u5fc3\u5e93\uff08src\uff09\u7684\u5185\u5bb9\uff0c\u4f46\u662f\u7531\u4e8e\u5b83\u7684\u7279\u6b8a\u6027\uff0c\u5373\u5b83\u662f\u5bf9\u5e94\u7528\u5e93\u4e2d\u7684\u7528\u4f8b\u751f\u6548\u7684\uff0c\u800c\u4e14\u5b83\u7684\u4f5c\u7528\u57df\u662f\u5f53\u524d\u76ee\u5f55\u53ca\u4ee5\u4e0b\uff0c\u56e0\u6b64\u6211\u4eec\u5c06\u5b83\u653e\u5230\u9879\u76ee\u6839\u76ee\u5f55\u3002\u6211\u4eec\u6846\u67b6\u4e2d\u6709\u4e0d\u5c11\u6838\u5fc3\u529f\u80fd\u90fd\u662f\u5728\u8fd9\u91cc\u9762\u8fdb\u884c\u5f00\u53d1\u7684\uff0c\u540e\u9762\u7b2c\u56db\u7ae0\u4f1a\u8bb2\u5230\u7ec6\u8282\u3002 pytest.ini \u4f5c\u7528\u548c conftest.py \u7c7b\u4f3c\uff0c\u662f Pytest \u6846\u67b6\u7684\u56fa\u5b9a\u914d\u7f6e\u6587\u4ef6\uff0c\u76ee\u524d\u914d\u7f6e\u4e86\u4e00\u4e9b\u901a\u7528\u7684\u547d\u4ee4\u884c\u6267\u884c\u53c2\u6570\uff0c\u4e5f\u653e\u5728\u9879\u76ee\u6839\u76ee\u5f55\u3002 \u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 Hook \u51fd\u6570\uff0capps \u76ee\u5f55\u4e0b\u7684 \u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 fixture \u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5setting","title":"5\u3001setting","text":"\u5168\u5c40\u914d\u7f6e\u6a21\u5757\uff0c\u5305\u542b\u4e86\u4ee5\u4e0b\u914d\u7f6e\u6587\u4ef6\uff1a \uff081\uff09ini \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u914d\u7f6e\u4e00\u4e9b\u5168\u5c40\u7684\u914d\u7f6e\u9879\uff0c\u8b6c\u5982\uff1a\u5931\u8d25\u91cd\u8dd1\u6b21\u6570\u3001\u662f\u5426\u5931\u8d25\u5f55\u5c4f\u3001\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\u3001\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4\u3001\u6267\u884c\u65f6\u65e5\u5fd7\u7ea7\u522b\u3001\u751f\u6210\u7684\u62a5\u544a\u7c7b\u578b\u3001\u4ee5\u53ca\u5206\u5e03\u5f0f\u6267\u884c\u7684\u4e00\u4e9b\u7b56\u7565\u914d\u7f6e\u9879\u7b49\u7b49\u3002 \uff082\uff09config.py \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u63d0\u4f9b\u914d\u7f6e\u6587\u4ef6\u8bfb\u53d6\u3001\u52a8\u6001\u83b7\u53d6\u4e00\u4e9b\u5e38\u91cf\uff08\u5982\u9879\u76ee\u6839\u76ee\u5f55\u7edd\u5bf9\u8def\u5f84 (BASE_DIR)\u3001\u7cfb\u7edf\u67b6\u6784\uff08SYS_FRAME\uff09\u3001\u65f6\u95f4\u5b57\u7b26\u4e32\uff08strftime\uff09\u3001\u672c\u673a USERNAME IP \u7b49\u7b49\uff09\u3001\u516c\u5171 URL \u7b49\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u89c4\u8303","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u7248\u672c\u53ca\u4f9d\u8d56","text":"\u57fa\u7840\u6846\u67b6\u4f1a\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u8fdb\u884c\u7248\u672c\u53d1\u5e03\uff0c\u4e0d\u4e0e\u67d0\u4e2a\u5e94\u7528\u7248\u672c\u7ed1\u5b9a\uff0c\u4f46\u662f\uff0c\u5e94\u7528\u5e93\u4f1a\u4f9d\u8d56\u4e8e\u57fa\u7840\u6846\u67b6\u7684\u7248\u672c\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u5efa\u8bae\u5728\u5e94\u7528\u5e93\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a\u6587\u672c\u6587\u4ef6\u7528\u4e8e\u8bb0\u5f55\u6240\u4f9d\u8d56\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\uff0c\u7c7b\u4f3c\u4e8e\u5f00\u53d1\u5e94\u7528\u7684 debian/control \u6587\u4ef6\u7684\u529f\u80fd\uff0c\u4e3a\u4e86\u4fdd\u6301\u7edf\u4e00\uff0c\u8fd9\u4e2a\u6587\u4ef6\u5c31\u547d\u540d\u4e3a control\uff0c\u653e\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u6838\u5fc3\u5e93\u72ec\u7acb\u6027","text":"\u6838\u5fc3\u5e93\u4e0d\u5efa\u8bae\u9488\u5bf9\u67d0\u4e00\u4e2a\u5e94\u7528\u5355\u72ec\u505a\u4ee3\u7801\u4e0a\u7279\u6b8a\u5904\u7406\uff0c\u901a\u5e38\u8003\u8651\u9488\u5bf9\u67d0\u4e00\u79cd\u573a\u666f\u8fdb\u884c\u5904\u7406\uff0c\u8fd9\u4e9b\u573a\u666f\u901a\u5e38\u662f\u5b58\u5728\u4e00\u4e9b\u5171\u6027\u7684\u3002\u6bd4\u5982\u8bf4\uff1a\u684c\u9762\u7684ID\u5206\u914d\u5b58\u5728\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u903b\u8f91\u5904\u7406\u89e3\u51b3ID\u5206\u914d\u9519\u8bef\u7684\u95ee\u9898\uff0c\u4f46\u662f\u8fd9\u90e8\u5206\u903b\u8f91\u6211\u4eec\u4f1a\u5728\u684c\u9762\u7684\u65b9\u6cd5\u5c42\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u517c\u5bb9\u6027","text":"\u4e3a\u4e86\u4fdd\u6301\u517c\u5bb9\u6027\uff0c\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u539f\u5219\u4e0a\u4e0d\u5bf9\u8001\u65b9\u6cd5\u8fdb\u884c\u4fee\u6539\u6216\u5220\u9664\uff0c\u53ea\u8fdb\u884c\u65b0\u589e\u3002\u6d89\u53ca\u5230\u8001\u65b9\u6cd5\u4fee\u6539\u6216\u5220\u9664\u7684\uff0c\u4f1a\u8fdb\u884c\u63d0\u524d\u9884\u544a\uff0c\u5e76\u5728\u7b2c\u4e8c\u4e2a\u7248\u672c\u4e4b\u540e\uff08\u4e2d\u95f4\u4f1a\u9694\u4e00\u4e2a\u7248\u672c\u8fc7\u5ea6\uff09\u6b63\u5f0f\u5b9e\u65bd\u4fee\u6539\u6216\u5220\u9664\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u547d\u540d\u89c4\u8303","text":" \u7528\u4f8b ID \u6bcf\u4e2a\u5e94\u7528\u81ea\u5df1\u7ef4\u62a4\u4e00\u5957 ID\uff0c\u5728PMS\u4e0a\u7528\u4f8b\u6807\u9898\u4e0a\u5c06\u81ea\u52a8\u5316ID\u4ee5\u6807\u7b7e\u7684\u5f62\u5f0f\u5199\u5165\uff0c\u6bd4\u5982\uff1a[101]\u6253\u5f00-\u542f\u52a8\u5e94\u7528\u540edock\u53f3\u952e\u83dc\u5355 \u4e00\u4e2a\u7528\u4f8b\u7c7b\u91cc\u9762\u6709\u591a\u4e2a\u7528\u4f8b\u65f6\uff0c\u5728\u7528\u4f8b\u540d\u79f0\u540e\u9762\u52a0\u5e8f\u53f7\u3002 class TestFileManager(BaseCase):\n\"\"\"\u6587\u7ba1\u7528\u4f8b\"\"\"\ndef test_xxx_015_1(self):\npass\ndef test_xxx_015_2(self):\npass\n \u6ce8\u610f 015_1\uff0c\u4e0d\u8981\u5199015_01\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 PMS \u4e0a\u7684\u7528\u4f8bID\uff1a PMS \u4e0a\u662f6\u4f4d\u6570\uff0c\u4e0d\u591f\u76f4\u89c2\uff0c\u4e5f\u4e0d\u597d\u7ef4\u62a4\uff0c\u5728\u81ea\u52a8\u5316\u4e0b\u9762\u53bb\u627e\u4e00\u4e2a\u5e26\u6709 6 \u4f4d\u6570\u7684\u6587\u4ef6\u662f\u4e00\u4e2a\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 PMS \u4e0a\u7684 ID \u53ef\u80fd\u4f1a\u53d1\u751f\u53d8\u5316\uff0c\u6bd4\u5982\u5bfc\u51fa\u6765\u5bfc\u8fdb\u53bb\u7684\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u5b58\u5728\u95ee\u9898\uff0c\u5982\u679c\u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u8981\u60f3\u627e\u51fa\u6765\u5bf9\u5e94\u4fee\u6539\u81ea\u52a8\u5316\u7528\u4f8b ID\uff0c\u5c06\u4f1a\u662f\u4ef6\u975e\u5e38\u75db\u82e6\u7684\u4e8b\u60c5\u3002 \u51fd\u6570\u547d\u540d\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5de6\u952e\u70b9\u51fb click \u53f3\u952e\u70b9\u51fb right_click \u53cc\u51fb double_click \u79fb\u52a8 move_to \u62d6\u52a8 drag \u65b0\u5efa new \u62d6\u52a8\u5230 drag_to \u4ece\u54ea\u91cc\u62d6\u52a8\u5230\u54ea\u91cc drag_something_from_xxx_to_xxx \u83b7\u53d6 get \u83b7\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5750\u6807 get_location \u975e\u7279\u6b8a\u6587\u4ef6 file word\u6587\u4ef6 doc text\u6587\u4ef6 text \u6587\u4ef6\u5939 dir \u5173\u952e\u8bcd\u6301\u7eed\u589e\u52a0 \u5e38\u91cf\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5e94\u7528\u540d\u79f0 APP_NAME \u5e94\u7528\u63cf\u8ff0 DESC \u672c\u5e94\u7528\u4ee5\u5916\u7684\u5176\u4ed6\u5e94\u7528\uff0c\u6bd4\u5982\u5e2e\u52a9 HELP \u5176\u4ed6\u540d\u79f0\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u65b9\u6cd5\u5305\u540d widget \u65b9\u6cd5\u6587\u4ef6\u540d\uff08\u6587\u7ba1\u4e3e\u4f8b\uff09 dfm_widget.pytitle_widget.pyright_view_widget.pyleft_view_widget.pypop_widget.pybase_widget.pydfm_assert.py \u65ad\u8a00\u8bed\u53e5\u547d\u540d\u89c4\u8303 \u65ad\u8a00\u8bed\u53e5\u90fd\u662f\u4ee5 assert \u5f00\u5934 \u65ad\u8a00 \u8bed\u53e5 \u5224\u65ad\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_existsassert_file_not_exists \u5224\u65ad\u684c\u9762\u76ee\u5f55\u4e0b\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_exists_in_desktopassert_file_not_exists_in_desktop \u5224\u65ad\u56fe\u7247\u5b58\u5728 assert_image_existsassert_image_not_exists \u5224\u65ad\u5f71\u9662\u4e2d\u662f\u5426\u5b58\u5728\u56fe\u7247 assert_image_exists_in_movieassert_image_not_exists_in_movie \u5224\u65ad\u5143\u7d20\u662f\u5426\u5b58\u5728 assert_element_existassert_element_not_exist \u5224\u65ad\u662f\u5426\u76f8\u7b49 assert_equalassert_not_equal \u5224\u65ad\u662f\u5426\u4e3a\u771f assert_trueassert_false"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5fixture","title":"5\u3001fixture \u89c4\u8303","text":"\u7531\u4e8e Pytest \u6846\u67b6\u4e2d\u652f\u6301 fixture \u7684\u5199\u6cd5\u548c Xunit \u5199\u6cd5\u7684\uff0c\u6240\u4ee5\u5e94\u7528\u5e93\u4e2d\u53ef\u80fd\u5b58\u5728\u6df7\u7528\u7684\u60c5\u51b5\uff0c\u4e3a\u7edf\u4e00\u7f16\u7801\u98ce\u683c\u65b9\u4fbf\u540e\u7eed\u7528\u4f8b\u4ee3\u7801\u7ef4\u62a4\uff0c\u73b0\u505a\u4ee5\u4e0b\u89c4\u8303\u8bf4\u660e\uff1a \u629b\u5f03 Xunit \u7684\u5199\u6cd5\uff0c\u7edf\u4e00\u91c7\u7528 Pytest fixture \u7684\u5199\u6cd5\u3002 \u5e94\u7528\u5185 fixture \u8c28\u614e\u4f7f\u7528 autouse=True \uff0c\u975e\u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u975e\u5e38\u4e0d\u5efa\u8bae\u4f7f\u7528\u8fd9\u4e2a\u53c2\u6570\u3002 \u8c03\u7528 fixture \u4e0d\u80fd\u4f7f\u7528 @pytest.mark.usefixture()\uff0c\u4f7f\u7528\u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u4f20\u5165\u51fd\u6570\u5bf9\u8c61\u3002 \u5efa\u8bae\u5728\u4e00\u4e2a conftest.py \u91cc\u9762\u53bb\u5199\uff0c\u4e00\u4e2a\u5e94\u7528\u4e5f\u5c3d\u91cf\u7ef4\u62a4\u4e00\u4e2a conftest.py\u6587\u4ef6\u3002 fixture \u4e5f\u9700\u8981\u5199\u529f\u80fd\u8bf4\u660e\uff0c\u51fd\u6570\u540d\u79f0\u8981\u6709\u5177\u4f53\u542b\u4e49\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#6","title":"6\u3001\u65b9\u6cd5\u7f16\u5199\u89c4\u8303","text":" \u65b9\u6cd5\u7c7b\u578b\uff1a if \u6ca1\u6709\u7528\u5230\u5b9e\u4f8b\u5bf9\u8c61\uff1a\nif \u6ca1\u6709\u7528\u5230\u7c7b\u5bf9\u8c61\uff1a\n\u5199\u9759\u6001\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @staticmethod\nelse\uff1a\n\u5199\u7c7b\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @classmethod\nelse:\n\u76f4\u63a5\u5199\u5b9e\u4f8b\u65b9\u6cd5\n \u4e3e\u4f8b: class TitleWidget:\ndef click_xxx_by_ui(self):\npass\n@staticmethod\ndef click_xxx_by_ui():\npass\n@classmethod\ndef click_xxx_by_ui(cls):\npass\n \u51fd\u6570\u540d\u79f0\u4e0d\u51fa\u73b0\u6570\u5b57\uff0c\u9700\u8981\u8868\u793a\u6570\u91cf\u7684\u7528\u5355\u8bcd\u8868\u793a\u3002 \u51fd\u6570\u529f\u80fd\u6ce8\u91ca\u3002 \u6ca1\u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg2:xxx\n\"\"\"\n \u6709\u53c2\u6570\uff0c\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg1:xxx\nreturn: xxx\n\"\"\"\n \u200b \u7528 Pycharm \u7684\u6ce8\u91ca\u6a21\u677f\u4e5f\u53ef\u4ee5\uff0c\u53ea\u8981\u4f53\u73b0\u4e86\u53c2\u6570\u7684\u7c7b\u578b\u548c\u8fd4\u56de\u5c31\u884c\u4e86\u3002 \u6682\u4e0d\u8981\u6c42\u5199\u7c7b\u578b\u6ce8\u89e3\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#7case","title":"7\u3001\u7528\u4f8b\uff08case\uff09\u89c4\u8303","text":" \u4ee5\u7c7b\u7684\u5f62\u5f0f\u5199\u7528\u4f8b\uff0c\u7528\u4f8b\u7c7b\u96c6\u6210\u7528\u4f8b\u57fa\u7c7b\u3002 \u7528\u4f8b\u7c7b\u9700\u8981\u5199\u6ce8\u91ca\u3002 \u6d4b\u8bd5\u7528\u4f8b\u51fd\u6570\u8bf4\u660e\uff08\u5efa\u8bae\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u540d\u79f0\uff09 \"\"\"\u53f3\u4fa7\u9884\u89c8-\u56fe\u7247\u7c7b\u578b\u4fe1\u606f\u680f\u57fa\u672c\u4fe1\u606f\"\"\"\n \u4e0d\u5199\u8c03\u8bd5\u4ee3\u7801 if __name__ == '__main__':\npytest.main()\n \u6240\u6709\u7528\u4f8b\u90fd\u7ee7\u627f BaseCase\u3002 BaseCase \u91cc\u9762\u653e\u4e00\u4e9b\u6d4b\u8bd5\u6570\u636e\u7684\u5e38\u91cf\uff0c\u6bd4\u5982\u6587\u4ef6\u540d\u79f0\uff0c\u5e94\u7528\u540d\u79f0\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u4e00\u4e9b\u901a\u7528\u7684\u5b57\u7b26\u4e32\u3002 \u8fd9\u7c7b\u662f\u5c5e\u4e8e\u6d4b\u8bd5\u6570\u636e\u3002 class BaseCase(DfmAssert):\n\"\"\"\u7528\u4f8b\u57fa\u7c7b\"\"\"\nNEW_FILE = \"\u65b0\u5efa\u6587\u672c.txt\"\nTEST_FILE = \"test.txt\"\nNEW_DIR = \"\u65b0\u5efa\u6587\u4ef6\u5939\"\nNEW_WORD = \"\u65b0\u5efaWord\u6587\u6863.doc\"\nAPP_HELP = \"damn\"\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\n\"\"\"\u7528\u4f8b\u6807\u9898\uff08\u590d\u5236PMS\u4e0a\u7528\u4f8b\u6807\u9898\uff09\"\"\"\ndfm = DfmWidget()\ndfm.click_xxx_by_attr(self.NEW_FILE)\ndfm.new_file_in_desktop_by_cmd(self.NEW_FILE)\nself.assert_true(dfm.get_process_status(self.APP_NAME))\n \u7528\u4f8b\u91cc\u9762\u5c3d\u91cf\u51cf\u5c11\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\uff0c\u66f4\u8981\u51cf\u5c11\u76f8\u540c\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\u3002 \u7edf\u4e00\u6587\u4ef6\u6ce8\u91ca\u5934\u3002 #!/usr/bin/env python3\n# _*_ coding:utf-8 _*_\n\"\"\"\n:Author:email@uniontech.com\n:Date :${DATE} ${TIME}\n\"\"\"\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#8","title":"8\u3001\u5176\u4ed6\u89c4\u8303","text":" \u65e5\u5fd7\u6253\u5370\u8981\u5728\u65b9\u6cd5\u6700\u524d\u9762\uff0c\u5426\u5219\u4ee3\u7801\u62a5\u9519\u6ca1\u6709\u65e5\u5fd7\u8f93\u51fa\uff0c\u4e0d\u597d\u5b9a\u4f4d\u95ee\u9898\u3002\uff08\u6211\u4eec\u4f1a\u8003\u8651\u7ee7\u7eed\u4f7f\u7528\u62e6\u622a\u5668\u6253\u5370\u65e5\u5fd7\uff09 \u6240\u6709\u7684\u64cd\u4f5c\u90fd\u9700\u8981\u6709\u65e5\u5fd7\uff0c\u5305\u62ec sleep()\uff0c\u6211\u4eec\u4f1a\u91cd\u5199\u4e00\u4e2a\u6709\u65e5\u5fd7\u8f93\u5165\u7684 sleep\u3002 \u4e1a\u52a1\u5c42\u65e5\u5fd7\u7ea7\u522b\u4e3a INFO\u3002 hook \u51fd\u6570\u53ea\u80fd\u5199\u5230\u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u91cc\u9762\u3002 apps \u76ee\u5f55\u4e0b\u7684 conftest.py \u539f\u5219\u4e0a\u4e0d\u4f1a\u65b0\u589e fixture\u3002 \u56fa\u5b9a\u76ee\u5f55\u6216\u5143\u7d20\u63a7\u4ef6\u7684\u64cd\u4f5c\uff0c\u5c06\u64cd\u4f5c\u65b9\u6cd5\u5199\u6b7b\uff0c\u6587\u4ef6\u7c7b\u64cd\u4f5c\u5c06\u6587\u4ef6\u540d\u7559\u53c2\u6570\u3002 \u8def\u5f84\u62fc\u63a5\u89c4\u8303\uff1a \u7cfb\u7edf\u4e2d\u56fa\u5b9a\u76ee\u5f55\uff0c\u8def\u5f84\u62fc\u63a5\u65f6\u4f7f\u7528\u6ce2\u6d6a\u7b26\u53f7\uff0c\u6bd4\u5982\uff1a~/Desktop/\uff0c\u4e0b\u5c42\u4f7f\u7528 os.path.expanduser()\uff0c\u5b83\u53ef\u4ee5\u81ea\u52a8\u8bc6\u522b\u6ce2\u6d6a\u7b26\u53f7\u3002 \u9879\u76ee\u4e0b\u8def\u5f84\u4f7f\u7528\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u8def\u5f84\uff0c\u6bd4\u5982\uff1aConfig.BASE_PATH\uff0c\u56e0\u4e3a\u9879\u76ee\u662f\u53ef\u4ee5\u5728\u4efb\u610f\u8def\u5f84\u8fd0\u884c\u7684\uff0c\u9700\u8981\u52a8\u6001\u62fc\u63a5\u8def\u5f84\u3002 "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848","text":"# =================================================\n# Author : Mikigo\n# Time : 2022/3/16\n# version \uff1a1.0\n# =================================================\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"AT \u5e94\u7528\u5e93\u6539\u9020\u662f\u57fa\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u8fdb\u884c\u7528\u4f8b\u65b9\u6cd5\u548c\u4e1a\u52a1\u903b\u8f91\u7684\u91cd\u65b0\u8bbe\u8ba1\uff0c\u4ee5\u5b9e\u73b0\u5e94\u7528\u5e93\u9ad8\u6548\u7684\u7f16\u5199\u3001\u7ef4\u62a4\u7528\u4f8b\u53ca\u5176\u65b9\u6cd5\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u6587\u4ef6\u7ba1\u7406\u5668\u4ece\u4e1a\u52a1\u590d\u6742\u5ea6\u548c\u7528\u4f8b\u91cf\u6765\u8bb2\uff0c\u5728\u7cfb\u7edf\u6240\u6709\u5e94\u7528\u4e2d\uff0c\u662f\u5f88\u6709\u4ee3\u8868\u6027\u7684\uff0c\u96be\u5ea6\u4e5f\u662f\u6700\u5927\u7684\uff0c\u56e0\u6b64\u6211\u4eec\u9009\u53d6\u6587\u4ef6\u7ba1\u7406\u5668\u4f5c\u4e3a\u5e94\u7528\u5e93\u6539\u9020\u7684\u5b9e\u9a8c\u5e94\u7528\uff0c\u7ed9\u540e\u7eed\u5176\u4ed6\u5e94\u7528\u6539\u9020\u63d0\u4f9b\u5207\u5b9e\u53ef\u884c\u7684\u601d\u8def\u548c\u65b9\u6848\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u5206\u5c42\u8bbe\u8ba1\u56fe","text":"\u6574\u4f53\u4ecd\u7136\u9075\u5faa PO \u8bbe\u8ba1\u7406\u5ff5\uff0c\u6839\u636e\u4e1a\u52a1\u9700\u8981\uff0c\u5c06\u6587\u7ba1\u4e1a\u52a1\u5c42\u8fdb\u884c 3 \u5c42\u5212\u5206\uff1a "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-dde-file-manager # \u5e94\u7528\u4ed3\u5e93\n\u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 test_xxx_001.py\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u00a0\u251c\u2500\u2500 __init__.py\n\u2502 \u00a0\u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u00a0\u251c\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u00a0\u251c\u2500\u2500 base_widget.py # \u65b9\u6cd5\u57fa\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 title_widget.py # title \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 right_view_widget.py # right view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 left_view_widget.py # left view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 pop_widget.py # pop \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 dfm_widget.py # \u65b9\u6cd5\u7684\u7edf\u4e00\u51fa\u53e3\n\u2502 \u00a0\u2514\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 tag # \u7528\u4f8b\u6807\u7b7e\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 xxx.csv # \u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2514\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u57fa\u7c7b","text":" \u7ee7\u627f\u6838\u5fc3\u5c42\u7684\u5404\u4e2a\u6a21\u5757\u7c7b\u3002 \u62bd\u53d6\u64cd\u4f5c\u5c42\u7684\u4e00\u4e9b\u57fa\u7840\u65b9\u6cd5\u3002 \u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u7684\u4e00\u4e9b\u516c\u5171\u65b9\u6cd5\u3002 \u8def\u5f84\u7ec4\u88c5\u65b9\u6cd5\u3002 \u4e00\u4e9b\u4e1a\u52a1\u5c42\u76f8\u5173\u7684\u53d8\u91cf\u3001\u5e38\u91cf\u3001shell\u547d\u4ee4\u3001\u5750\u6807\u3002 \u65b9\u6cd5\u57fa\u7c7b\u7684\u5199\u6cd5\uff1a from src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u64cd\u4f5c\u5c42","text":" \u6a21\u5757\u5212\u5206 \u6309\u7167\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u6587\u7ba1\u4e3b\u754c\u9762\u5206\u4e3a\u4e09\u4e2a\u533a\u57df\uff1a\u6807\u9898\u680f\u3001\u53f3\u8fb9\u89c6\u56fe\u533a\u57df\u3001\u5de6\u8fb9\u89c6\u56fe\u533a\u57df \u5f39\u7a97\uff1a\u8bbe\u7f6e\u754c\u9762\u5f39\u7a97\u3001\u4fdd\u9669\u7bb1\u5f39\u7a97\u3001\u5220\u9664\u786e\u8ba4\u5f39\u7a97\u3001\u53ca\u5404\u79cd\u7f51\u7edc\u5f39\u7a97 \u53f3\u952e\u83dc\u5355\uff1a\u6682\u65f6\u4e0d\u8003\u8651\u4e3a\u5355\u72ec\u7684\u6a21\u5757\uff0c\u8003\u8651\u4ee5\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6848\u505a\u6210\u516c\u5171\u5e93\u3002 \u5404\u4e2a\u6a21\u5757\u53ea\u7ee7\u627f\u57fa\u7c7b from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u6784\u9020\u51fd\u6570\u91cc\u9762\u4e0d\u6784\u9020\u5bf9\u8c61\uff0c\u53ef\u4ee5\u521d\u59cb\u5316\u4e00\u4e9b\u53d8\u91cf\u3002 \u4e0d\u540c\u7684\u5b9a\u4f4d\u65b9\u6848\u8c03\u7528\u4e0d\u540c\u7684\u5b9a\u4f4d\u5de5\u5177\u5bf9\u8c61\u3002 self.dog\nself.ui\nself.d_bus\n \u65b9\u6cd5\u7f16\u5199 \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u5e94\u7528\u5c42","text":" \u7ee7\u627f\u64cd\u4f5c\u5c42\u7684\u6240\u6709\u7c7b\u3002 \u4ec5\u4ec5\u7528\u4e8e\u7528\u4f8b\u4e2d\u5bfc\u5165\u65b9\u4fbf\uff0c\u4e0d\u505a\u5176\u4ed6\u4e8b\u60c5\u3002 class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n DfmAssert \u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u7ee7\u627f\uff0c\u65b9\u4fbf\u4f7f\u7528\u65ad\u8a00\u8bed\u53e5\u3002 from apps.dde_file_manager.widget.dfm_widget import DfmWidget\nfrom public.assert import Assert\nclass DfmAssert(Assert):\ndef assert_file_exists_in_desktop(self, file_name):\nself.assert_file_exists(f\"~/Desktop{file_name}\")\n...\nDfmWidget().get_file_in_desktop()\n \u7528\u4f8b\u91cc\u9762\u76f4\u63a5\u7ee7\u627f\uff0c\u65b9\u4fbf\u5728\u7528\u4f8b\u91cc\u9762\u4f7f\u7528 self \u8fdb\u884c\u65ad\u8a00\uff0c\u66f4\u7b26\u5408\u65ad\u8a00\u7684\u4f7f\u7528\u4e60\u60ef\uff0c\u7528\u4f8b\u903b\u8f91\u4e0a\u66f4\u6e05\u695a\u3002 class BaseCase(DfmAssert):\npass\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\nself.assert_file_exists_in_desktop(\"xxx\")\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u903b\u8f91\u4e3e\u4f8b","text":"\u7528\u4f8b\u4ee3\u7801\u8c03\u7528\u903b\u8f91\u4e3e\u4f8b\uff1a # BaseWidget\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n# =============================================\n# TitleWidget\nclass TitleWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_title_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# RightViewWidget\nclass RightViewWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_right_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# =============================================\n# \u51fa\u53e3 DfmWidget\nclass DfmWidget(TitleWidget, RightViewWidget):\npass\n# =============================================\n# in case\nfrom apps.dde_file_manager.widget.dfm_widget import DfmWidget\ndfm = DfmWidget()\ndfm.click_xxx_title_by_ui()\ndfm.click_xxx_right_by_ui()\ndfm.dog.print_desc()\ndfm.ui.print_number()\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u5de5\u7a0b\u6539\u9020\u5b9e\u65bd\u6b65\u9aa4","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_2","title":"1\u3001\u5de5\u7a0b\u4ee3\u7801\u62c9\u53d6","text":"1.1. \u5c06\u81ea\u52a8\u5316\u57fa\u7840\u6846\u67b6\u7684\u529f\u80fd\u62c9\u5230\u672c\u5730 Autotest Basic Frame \uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame 1.2. \u5c06\u5e94\u7528\u5e93\u4ee3\u7801\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u5e94\u7528\u5e93\u7684\u4ed3\u5e93\u547d\u540d\u5e94\u8be5\u662f\u957f\u8fd9\u6837\u7684 autotest_deepin_xxx\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_2","title":"2\u3001\u8c03\u6574\u5de5\u7a0b\u76ee\u5f55","text":"\u6309\u7167 \u65b9\u6848\u8bbe\u8ba1-\u76ee\u5f55\u7ed3\u6784 \u8fdb\u884c\u76ee\u5f55\u8c03\u6574\uff0c\u5c3d\u91cf\u4f7f\u7528\u7f16\u8f91\u5668\u8fdb\u884c\u76f8\u5e94\u7684\u8c03\u6574\uff0c\u7f16\u8f91\u5668\u63a8\u8350\u4f7f\u7528 Pycharm \uff0c\u4ee5\u4e0b\u64cd\u4f5c\u5747\u5728 Pycharm \u91cc\u9762\u53ef\u5b9e\u73b0\u3002 2.1. \u9700\u8981\u79fb\u52a8 py \u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u76f4\u63a5\u5728\u7f16\u8f91\u5668\u91cc\u9762\uff0c\u4f7f\u7528\u9f20\u6807\u9009\u4e2d\u5e76\u6309\u4f4f\uff0c\u4e4b\u540e\u62d6\u52a8\u5230\u76ee\u6807\u4f4d\u7f6e\u5373\u53ef\uff0cPycharm \u4f1a\u5c3d\u53ef\u80fd\u7684\u81ea\u52a8\u89e3\u51b3\u79fb\u52a8\u5bfc\u81f4\u7684\u8def\u5f84\u95ee\u9898\u3002\u6ce8\u610f\uff0c\u6211\u8bf4\u7684\u662f\u201c\u5c3d\u53ef\u80fd\u201d\uff0c\u6709\u4e9b\u9a9a\u64cd\u4f5c\u7f16\u8f91\u5668\u662f\u65e0\u6cd5\u81ea\u52a8\u5904\u7406\u7684\u3002\u5982\u679c\u6ca1\u6709\u88ab\u7f16\u8f91\u5668\u81ea\u52a8\u5904\u7406\u7684\u8def\u5f84\u95ee\u9898\uff0c\u540e\u7eed\u53ea\u80fd\u624b\u52a8\u89e3\u51b3\u3002 2.2. \u9700\u8981\u91cd\u547d\u540d\u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u5728\u7f16\u8f91\u5668\u91cc\u9762\u9009\u4e2d\u6587\u4ef6\uff0c\u7136\u540e\u4f7f\u7528\u5feb\u6377\u952e Shift + F6 \uff08\u5982\u679c\u5feb\u6377\u952e\u6ca1\u53cd\u5e94\uff0c\u6587\u4ef6\u53f3\u952e\u83dc\u5355 Refactor \u2014\u2014 Rename\uff09\uff0c\u7136\u540e\u5728\u8f93\u5165\u6846\u4e2d\u8f93\u5165\u8981\u91cd\u547d\u540d\u7684\u540d\u79f0\uff0c\u540c\u65f6\uff0c\u786e\u8ba4\u52fe\u9009 Search for references \u548c Search in comments and strings \u8fd9\u4e24\u4e2a\u9009\u9879\uff0c\u6700\u540e\u6309\u56de\u8f66\u6216\u8005\u9f20\u6807\u70b9 Refactor \u3002 \u6ce8\u610f\uff0c\u6b64\u65f6\u7f16\u8f91\u5668\u53ef\u80fd\u4f1a\u63d0\u793a\u4f60\uff0c\u4f60\u8fd9\u4e2a\u91cd\u547d\u540d\u7684\u64cd\u4f5c\u5173\u8054\u4e86\u591a\u4e2a\u6a21\u5757\uff0c\u5b83\u88ab\u591a\u4e2a\u5730\u65b9\u90fd\u4f7f\u7528\u5230\u4e86\uff0c\u76f8\u5173\u7684\u6a21\u5757\u662f\u5426\u4e5f\u4e00\u8d77\u6539\u540d\u4e86\uff0c\u8fd9\u4e0d\u5e9f\u8bdd\u5417\uff0c\u7528\u8fd9\u4e2a\u529f\u80fd\u5c31\u662f\u60f3\u628a\u5173\u8054\u5230\u7684\u90fd\u4fee\u6539\uff0c\u4e0d\u7136\u6211\u4e3a\u4ec0\u4e48\u4e0d\u7528\u6587\u7ba1\u7684\u91cd\u547d\u540d\u529f\u80fd\u5462\uff0c\u522b\u60f3\u4e86\uff0c\u76f4\u63a5\u70b9\u5de6\u4e0b\u89d2\u7684 Refactor \u6309\u94ae\uff0c\u5c31\u662f\u5e72\u3002 \u7c7b\u540d\u3001\u51fd\u6570\u540d\u7684\u91cd\u547d\u540d\u90fd\u5c3d\u91cf\u91c7\u7528\u8fd9\u79cd\u65b9\u6848\uff0c\u56e0\u4e3a\u7f16\u8f91\u5668\u4f1a\u81ea\u52a8\u7ed9\u6211\u4eec\u627e\u5230\u5173\u8054\u7684\u5730\u65b9\uff0c\u7136\u540e\u540c\u6b65\u4fee\u6539\u6389\u3002\u4f60\u53ef\u5343\u4e07\u522b\u76f4\u63a5\u5220\u4e86\u4fee\u6539\u540d\u79f0\uff0c\u4e0d\u7136\u4f60\u53ef\u80fd\u4f1a\u82b1\u4e0a\u4e00\u5929\u7684\u65f6\u95f4\u6765\u89e3\u51b3\u91cd\u547d\u540d\u7684\u95ee\u9898\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u5b9e\u73b0\u6838\u5fc3\u5e93\u63a5\u53e3","text":"3.1. BaseWidget \u5728 BaseWidget \u91cc\u9762\u628a\u8be5\u5199\u7684\u90fd\u5199\u597d\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u4e0a\u9762\u7684\u8bbe\u8ba1\u7406\u5ff5\u6765\u5199\u3002 \u5982\u679c\u4f60\u5acc\u9ebb\u70e6\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u6587\u7ba1\u7684\u5b9e\u9645\u5de5\u7a0b\u4ee3\u7801 autotest_dde_file_manager : https://gerrit.uniontech.com/admin/repos/autotest_dde_file_manager \u3002 3.2. \u64cd\u4f5c\u5c42 \u5982\u679c\u4f60\u662f\u65b0\u5199\u9879\u76ee\uff0c\u4f60\u4f1a\u53d1\u73b0\u4e00\u5207\u90fd\u662f\u90a3\u4e48\u7684\u7b80\u5355\u3001\u76f4\u63a5\uff0c\u6309\u7167\u6211\u4eec\u63d0\u4f9b\u7ed9\u4f60\u7684\u63a5\u53e3\u5199\u7528\u4f8b\u7684\u64cd\u4f5c\u65b9\u6cd5\u5c31\u597d\u4e86\u3002 \u5982\u679c\u4f60\u662f\u60f3\u5bf9\u539f\u6765\u7684\u5de5\u7a0b\u8fdb\u884c\u6539\u9020\uff0c\u4f60\u9700\u8981\u6309\u7167\u6838\u5fc3\u5e93\u65b9\u6cd5\u7684\u8c03\u7528\uff0c\u5c06\u4f60\u4e4b\u524d\u5199\u7684\u6bcf\u4e2a\u65b9\u6848\u8fdb\u884c\u5bf9\u5e94\u7684\u4fee\u6539\uff0c\u5305\u62ec\u7c7b\u548c\u65b9\u6cd5\u7684\u547d\u540d\u3001\u65b9\u6cd5\u5185\u6240\u8981\u7528\u5230\u4e0d\u540c\u5b9a\u4f4d\u65b9\u6cd5\u7684\u5199\u6cd5\u4fee\u6539\u3002 \u8fd9\u65f6\u5019\u4f60\u53ef\u80fd\u4f60\u7684\u4ee3\u7801\u4e2d\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u62a5\u9519\uff0c\u4e0d\u7528\u62c5\u5fc3\uff0c\u4f60\u53ef\u4ee5\u4ece\u4e1a\u52a1\u903b\u8f91\u51fa\u53d1\uff0c\u60f3\u6e05\u695a\u8fd9\u4e2a\u65b9\u6cd5\u662f\u5e72\u4ec0\u4e48\u7684\u3001\u64cd\u4f5c\u7684\u5bf9\u8c61\u662f\u4ec0\u4e48\u3001\u53c2\u6570\u662f\u4ec0\u4e48\uff0c\u6ce8\u610f\u8fd9\u4e9b\u4fee\u6539\u662f\u4f1a\u5f71\u54cd\u5230\u7528\u4f8b\u4ee3\u7801\u91cc\u9762\u7684\uff0c\u6ca1\u5173\u7cfb\uff0c\u7528\u4f8b\u91cc\u9762\u672c\u6765\u4e5f\u5e94\u8be5\u88ab\u5173\u8054\u4fee\u6539\u3002 3.3. \u628a\u914d\u7f6e\u6a21\u5757\u5199\u597d\uff0c\u8fd9\u90e8\u5206\u57fa\u672c\u53ef\u4ee5\u590d\u5236\u6587\u7ba1\u7684\u4ee3\u7801\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4_1","title":"4\u3001\u8def\u5f84\u5904\u7406","text":"4.1. \u5bfc\u5165\u8def\u5f84 \u65b9\u6cd5\u548c\u7528\u4f8b\u4e2d\u90fd\u4f1a\u6d89\u53ca\u5230\u5bfc\u5165\u8def\u5f84\u7684\u4fee\u6539\uff0c\u5728\u4fee\u6539\u8def\u5f84\u65f6\uff0c\u5efa\u8bae\u4f60\u4f7f\u7528 Ctrl + Shift + R \u5168\u5c40\u66ff\u6362\uff0c\u4f1a\u5c06\u6574\u4e2a\u9879\u76ee\u4e0b\u7684\u76f8\u540c\u5730\u65b9\u90fd\u4fee\u6539\u5230\uff0c\u5f53\u7136\uff0c\u4f60\u4e5f\u53ef\u4ee5\u5728\u5c0f\u5f39\u7a97\u4e2d\u4fee\u6539\u5168\u5c40\u66ff\u6362\u4e3a\u5c40\u90e8\u76ee\u5f55\u4e0b\u66ff\u6362\u3002\u5904\u7406\u90a3\u79cd\u6ca1\u6709\u5173\u8054\u5173\u7cfb\uff0c\u4f46\u662f\u53c8\u662f\u76f8\u540c\u540d\u79f0\u7684\u91cd\u547d\u540d\uff0c\u6211\u4e5f\u63a8\u8350\u4f7f\u7528\u8fd9\u79cd\u65b9\u5f0f\u8fdb\u884c\u91cd\u547d\u540d\u3002 \u6ce8\u610f\uff0c\u5168\u5c40\u66ff\u6362\u7684\u65b9\u5f0f\u4efb\u7136\u65e0\u6cd5\u4fdd\u8bc1\u771f\u7684\u5168\u5c40\u88ab\u66ff\u6362\u4e86\uff08\u53ef\u80fd\u662f\u7f16\u8f91\u5668\u7684 Bug \u5427\uff09\uff0c\u6240\u4ee5\u4f60\u4ecd\u7136\u9700\u8981\u624b\u52a8\u770b\u4e0b\u5404\u5904\u662f\u5426\u4fee\u6539\u5230\u4f4d\u3002 4.2. \u8d44\u6e90\u8def\u5f84 \u4e00\u4e9b\u7528\u4f8b\u8d44\u6e90\u9700\u8981\u6839\u636e config.py \u91cc\u9762\u7684\u8def\u5f84\u914d\u7f6e\u8fdb\u884c\u8d44\u6e90\u8def\u5f84\u7684\u62fc\u63a5\uff0c\u5982\u679c\u4f60\u539f\u6765\u672c\u6765\u5c31\u6709\u4e00\u4e2a\u51fd\u6570\u4e13\u95e8\u7528\u4e8e\u7ec4\u88c5\u8def\u5f84\u7684\uff0c\u90a3\u4f60\u53ea\u9700\u8981\u4fee\u6539\u8fd9\u4e00\u4e2a\u5730\u65b9\u5c31\u597d\u4e86\uff0c\u5982\u679c\u4f60\u4e4b\u524d\u5e76\u6ca1\u6709\u8fd9\u6837\u7684\u8bbe\u8ba1\uff0c\u90a3\u53ef\u80fd\u9700\u8981\u4fee\u6539\u5927\u91cf\u6d89\u53ca\u5230\u8d44\u6e90\u8def\u5f84\u7684\u5730\u65b9\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5","title":"5\u3001\u8c03\u8bd5\u548c\u7f16\u5199\u7528\u4f8b","text":"\u4ee5\u4e0a\u51e0\u4e2a\u6b65\u9aa4\u505a\u5b8c\uff0c\u57fa\u672c\u5c31\u53ef\u4ee5\u8fdb\u884c\u7528\u4f8b\u4ee3\u7801\u7684\u8c03\u8bd5\u4e86\uff0c\u8fd9\u90e8\u5206\u5de5\u4f5c\u4e3b\u8981\u89e3\u51b3\u4f60\u4e4b\u524d\u51e0\u4e2a\u6b65\u9aa4\u9057\u6f0f\u7684\u95ee\u9898\uff0c\u5982\u679c\u6240\u6709\u7528\u4f8b\u90fd\u8c03\u8bd5\u901a\u8fc7\u4e86\uff0c\u90a3\u4e48\u5de5\u7a0b\u6539\u9020\u5c31\u5168\u90e8\u5b8c\u6210\u4e86\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/","title":"AT \u5f00\u53d1\u89c4\u8303","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u5f00\u53d1\u89c4\u8303\u662f\u6839\u636e\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fd0\u884c\u4e24\u5e74\u591a\u6765\uff0c\u9047\u5230\u95ee\u9898\u89e3\u51b3\u95ee\u9898\u800c\u5f62\u6210\u7684\u4e00\u4e9b\u89e3\u51b3\u65b9\u6848\uff0c\u6216\u8005\u8bf4\u7ecf\u9a8c\u603b\u7ed3\uff1b\u8fd9\u4e9b\u7ecf\u9a8c\u7b26\u5408\u6211\u4eec\u73b0\u9636\u6bb5 AT \u6240\u5e94\u7528\u7684\u573a\u666f\u9700\u8981\uff0c\u4e5f\u662f\u6211\u4eec\u7ecf\u8fc7\u957f\u671f\u601d\u8003\uff0c\u4e0d\u65ad\u8bd5\u9519\u4e0d\u65ad\u4fee\u6b63\uff0c\u5e76\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u5b9e\u8df5\u4e2d\u68c0\u9a8c\u8fc7\u53ef\u884c\u7684\u3002\u4ee5\u6b64\uff0c\u5e0c\u671b\u80fd\u5e2e\u52a9\u53c2\u4e0e\u5230\u81ea\u52a8\u5316\u7684\u76f8\u5173\u4eba\u5458\u51cf\u5c11\u8bd5\u9519\u6210\u672c\uff0c\u66f4\u597d\u3001\u66f4\u5feb\u7684\u7f16\u5199\u7528\u4f8b\u53ca\u7ef4\u62a4\u7528\u4f8b\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_1","title":"\u4e00\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u89c4\u8303","text":"\u6807\u7b7e\u5316\u7ba1\u7406\u6587\u6863\u8bf7\u53c2\u8003\uff1a \u300a\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u64cd\u4f5c\u6307\u5f15\u300b \u4ee5\u4e0b\u8bf4\u51e0\u4e2a\u5bb9\u6613\u51fa\u73b0\u7684\u95ee\u9898\uff1a"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1","title":"1. \u5bf9\u5e94\u5173\u7cfb","text":" \u5199\u5b8c\u81ea\u52a8\u5316\u7528\u4f8b\u4e4b\u540e\uff0c\u8bf7\u5728 CSV \u6587\u4ef6\u4e2d\u6807\u8bb0\u7528\u4f8b\u7684 ID\u3001\u7b49\u7ea7\u3002\u4e3a\u4e86\u63d0\u9192\u6807\u8bb0\uff0c\u6267\u884c\u7528\u4f8b\u65f6\u5728\u9996\u884c\u4f1a\u8f93\u51fa ERROR \u65e5\u5fd7\uff1a CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94\u7684 ID\uff1b \u5728\u6700\u7ec8\u63d0\u4ea4\u4ee3\u7801\u4e4b\u524d\uff0c\u4f60\u9700\u8981\u5728 CSV \u6587\u4ef6\u91cc\u9762\u5c06ID\u3001\u7528\u4f8b\u7b49\u7ea7\u7b49\u6807\u7b7e\u8865\u5168\uff0c\u5982\u679c CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94 ID\uff0c\u540e\u7eed\u5728\u6279\u91cf\u6267\u884c\u7684\u65f6\u5019\uff0c\u8fd9\u4e9b\u7528\u4f8b\u662f\u4e0d\u4f1a\u6267\u884c\u7684\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2","title":"2. \u540d\u79f0\u4e00\u81f4","text":" CSV \u6587\u4ef6\u7684\u6587\u4ef6\u540d\u3001\u7528\u4f8b\u51fd\u6570\u4e2d\u95f4\u7684\u540d\u79f0\u4e00\u81f4\u3001\u7528\u4f8b py \u6587\u4ef6\u4e2d\u95f4\u7684\u540d\u79f0\uff0c\u8fd9\u4e09\u4e2a\u540d\u79f0\u4e00\u81f4\u3002 \u4e3e\u4f8b\uff1a # test_music_001.py\ndef test_music_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u90a3\u4e48 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e3a music.csv\u3002 AT \u6846\u67b6\u5e95\u5c42\u4ee3\u7801\u5b9e\u73b0\u662f\u5c06 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e0e\u7528\u4f8b\u51fd\u6570\u540d\u79f0\u540d\u79f0\uff08item.name\uff09\u8fdb\u884c\u5bf9\u5e94\uff0c\u56e0\u6b64\uff0c\u6ce8\u610f CSV \u6587\u4ef6\u540d\u79f0\u5bf9\u5e94\u7684\u662f\u7528\u4f8b\u51fd\u6570\u540d\u79f0\uff0c\u5373 def test_music_001 \u91cc\u9762\u7684 music \uff0c\u800c\u4e0d\u662f test_music_001.py \u91cc\u9762\u7684 music \u3002 \u8fd9\u91cc\u7ec6\u7ec6\u54c1\u4e00\u4e0b\u54c8~ \u5982\u679c\u4f60\u5c06\u4e0a\u4f8b\u5199\u6210\u4e86\u8fd9\u6837: # test_music_001.py\ndef test_movie_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u7528\u4f8b\u6267\u884c\u6ca1\u95ee\u9898\uff0c\u4f46\u662f\u6807\u7b7e\u5316\u7ba1\u7406\u662f\u4e0d\u751f\u6548\u7684\uff0c\u6846\u67b6\u65e0\u6cd5\u5c06 music.csv\u6587\u4ef6\u91cc\u9762\u6807\u7b7e\uff0c\u6dfb\u52a0\u5230 test_movie_001\u8fd9\u4e2a\u7528\u4f8b\u4e2d\uff0c\u56e0\u4e3a\u4ed6\u4eec\u6ca1\u6709\u5bf9\u5e94\u5173\u7cfb\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#tag","title":"\u4e8c\u3001\u5206\u652f\u53ca tag \u7ba1\u7406\u89c4\u8303","text":"\u53c2\u8003\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u4ee3\u7801\u7ba1\u7406\u89c4\u8303\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2-tag","title":"2. \u5e94\u7528\u5e93 tag","text":" \u5e94\u7528\u5e93 tag \u6839\u636e\u5e94\u7528\u4ea4\u4ed8\u8282\u70b9\u751f\u6210\uff0c\u6bcf\u6b21\u6253 tag \u4e4b\u524d\uff0c\u76f8\u5173\u6d4b\u8bd5\u4eba\u5458\u9700\u8981\u8fdb\u884c\u7528\u4f8b\u8c03\u8bd5\uff1b \u8c03\u8bd5\u7528\u4f8b\u662f\u6307\u7684\u5728\u5168\u67b6\u6784\uff08x86\u3001arm\u3001mips\uff09\u4e0a\u8c03\u8bd5\u901a\u8fc7\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\u8fbe\u5230 90% \u4ee5\u4e0a\u624d\u80fd\u6253 tag\uff0c\u901a\u8fc7 Jenkins \u6267\u884c\u5668\u6267\u884c\u7528\u4f8b\uff0c\u4fdd\u7559\u901a\u8fc7\u7387\u7ed3\u679c\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\uff1a\u901a\u8fc7\u7528\u4f8b\u6570 / (\u603b\u7528\u4f8b\u6570 - \u5df2\u5e9f\u5f03\u7528\u4f8b) \u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u7b97\u901a\u8fc7 Jenkins \u6267\u884c\u5668 \u4f60\u53ef\u80fd\u4f1a\u5728\u4e00\u4e2a\u4ea4\u4ed8\u5468\u671f\u5185\u6301\u7eed\u7684\u8fdb\u884cAT\u7528\u4f8b\u8c03\u8bd5\uff0c\u4f46\u662f\u6700\u7ec8 AT \u7528\u4f8b\u6253 tag \u7684\u5e94\u7528\u7248\u672c\uff0c\u9700\u8981\u4f7f\u7528\u5e94\u7528\u96c6\u6210\u4ea4\u4ed8\u7684\u6700\u65b0\u5e94\u7528\u7248\u672c\uff0c\u53ef\u4ee5\u4f7f\u7528\u5e94\u7528\u7684\u63d0\u6d4b\u7248\u672c\uff1b\u4e00\u5b9a\u8981\u786e\u4fdd\u8c03\u8bd5\u7528\u4f8b\u7684\u5e94\u7528\u7248\u672c\u662f\u6700\u65b0\u7684\uff0c\u4e0d\u7136\u96c6\u6210\u8fdb\u53bb\u4e4b\u540e\uff0c\u6301\u7eed\u96c6\u6210\u5c31\u4f1a\u51fa\u95ee\u9898\uff1b tag \u53f7\u600e\u4e48\u6253\uff1f \u6839\u636e\u6301\u7eed\u96c6\u6210\u7684\u8981\u6c42\u751f\u6210\uff0c\u5176\u4e2d\u5e94\u7528\u7248\u672c\u53f7\u9700\u8981\u4e0e\u9879\u76ee\u7ecf\u7406\u786e\u8ba4\u672c\u6b21\u5373\u5c06\u96c6\u6210\u7684\u5e94\u7528\u7248\u672c\u53f7\u662f\u591a\u5c11\uff1b tag \u7684 commit \u4fe1\u606f\u683c\u5f0f\uff1a # commit msg\nversion:5.6.5\n \u5176\u4e2d 5.6.5 \u5199\u5e94\u7528\u7684\u96c6\u6210\u7248\u672c\u53f7\u3002 \u751f\u6210 tag \u7684\u547d\u4ee4\u53c2\u8003\uff1a\u300aGit \u6807\u7b7e\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3-tag","title":"3. \u57fa\u7840\u6846\u67b6 tag","text":"\u57fa\u7840\u6846\u67b6 tag \u4e0d\u4e0e\u4e1a\u52a1\u6302\u94a9\uff0c\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u6309\u9700\u53d1\u5e03\u7248\u672c\uff0c\u5728\u6839\u76ee\u5f55\u4e0b CURRENT \u6587\u4ef6\u4e2d\u8bb0\u5f55\u7684\u5f53\u524d\u7248\u672c\u53f7\u548c\u5386\u53f2\u7248\u672c\u53f7\uff0c\u53ca\u5176\u5bf9\u5e94\u65b0\u589e\u4e86\u54ea\u4e9b\u529f\u80fd\uff0c\u6709\u52a9\u4e8e\u5e94\u7528\u9009\u62e9\u5408\u9002\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\u3002 # CURRENT\n[current]\ntag = 0.9.5\n \u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u7684 control \u6587\u4ef6\u8bb0\u5f55\u5f53\u524d\u5e94\u7528\u5e93\u4f9d\u8d56\u7684\u57fa\u7840\u5e93\u7248\u672c\u3002 # control\n[Depends]\nautotest-basic-frame = 0.9.5\n \u7528\u4f8b\u5728\u6267\u884c\u65f6\u4f1a\u6821\u9a8c\u4e24\u4e2a\u6587\u4ef6\u7684\u7248\u672c\u53f7\u662f\u5426\u4e00\u81f4\uff0c\u5982\u679c\u4e0d\u4e00\u81f4\uff0c\u4f1a\u6253\u5370 error \u65e5\u5fd7\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_2","title":"\u4e09\u3001\u4ed3\u5e93\u6743\u9650\u7ba1\u7406","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_1","title":"1. \u57fa\u7840\u6846\u67b6","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u4ed3\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame \u57fa\u7840\u6846\u67b6\u4e0d\u5141\u8bb8\u533f\u540d\u8bbf\u95ee\uff0c\u5982\u679c\u4f60\u767b\u5f55 gerrit \u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u8bbf\u95ee\u4ee5\u4e0a\u94fe\u63a5\uff0c\u5219\u9700\u8981\u7533\u8bf7\u8bbf\u95ee\u6743\u9650\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_1","title":"2. \u5e94\u7528\u4ed3\u5e93","text":" \u81ea\u52a8\u5316\u5e94\u7528\u4ed3\u5e93\uff1a https://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684 app_name \u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_3","title":"\u56db\u3001\u65b9\u6cd5\u7f16\u5199&\u8c03\u7528\u89c4\u8303","text":"\u65b9\u6cd5\u7f16\u5199\u6574\u4f53\u8bbe\u8ba1\u601d\u8def\u53c2\u8003\uff1a[\u300aAT\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b]"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_2","title":"1. \u65b9\u6cd5\u7f16\u5199","text":"\u5199\u65b9\u6cd5\u7684\u65f6\u5019\u6ce8\u610f\u65b9\u6cd5\u5f52\u5c5e\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget\uff0c\u65b9\u6cd5\u662f\u5728\u54ea\u4e2a\u533a\u57df\u64cd\u4f5c\u7684\uff0c\u5c31\u5199\u5728\u54ea\u4e2a\u7c7b\u91cc\u9762\u3002 \u4e3e\u4f8b\uff1a from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n\"\"\"\u70b9\u51fb\u6807\u9898\u680fxxx\"\"\"\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_2","title":"2. \u65b9\u6cd5\u8c03\u7528","text":" \u5728\u7528\u4f8b\u4e2d\u8c03\u7528\u65b9\u6cd5\uff0c\u901a\u8fc7\u8be5\u5e94\u7528\u552f\u4e00\u7684\u51fa\u53e3\u8fdb\u884c\u8c03\u7528\uff0c\u6bd4\u5982\u6587\u7ba1\uff1a class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n \u4e0d\u8981\u5728\u7528\u4f8b\u4e2d\u5355\u72ec\u53bb\u8c03\u7528 TitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u8fd9\u4e9b\u7c7b\uff0c\u5426\u5219\u540e\u671f\u7528\u4f8b\u4f1a\u53d8\u5f97\u4e0d\u597d\u7ef4\u62a4\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_4","title":"\u4e94\u3001\u7528\u4f8b\u7f16\u5199\u89c4\u8303","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_3","title":"1. \u57fa\u4e8e\u7c7b\u5199\u7528\u4f8b","text":"\u6240\u6709\u7528\u4f8b\u90fd\u5e94\u8be5\u57fa\u4e8e\u7c7b\u53bb\u5199\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001(self):\n\"\"\"\u97f3\u4e50\u542f\u52a8\"\"\"\n \u6ce8\u610f\u4ee5\u4e0b\u51e0\u70b9\uff1a \u7c7b\u540d\u4e0d\u8981\u968f\u4fbf\u53d6\uff0c\u540c\u4e00\u4e2a\u5e94\u7528\u5e94\u8be5\u4f7f\u7528\u540c\u4e00\u4e2a\u7c7b\u540d\uff0c\u7528\u4f8b\u7c7b\u540d\u79f0\u5fc5\u987b\u4ee5 Test \u5f00\u5934\uff0c\u9075\u5faa\u5927\u9a7c\u5cf0\u547d\u540d\u89c4\u8303\uff1b \u7528\u4f8b\u7c7b\u7ee7\u627f BaseCase\uff0c\u4e00\u4e2a\u5e94\u7528\u53ea\u6709\u4e00\u4e2a BaseCase \u4e00\u4e2a py \u6587\u4ef6\u91cc\u9762\u53ea\u6709\u4e00\u4e2a\u7c7b\uff0c\u6211\u4eec\u79f0\u4e3a\u4e00\u4e2a\u6d4b\u8bd5\u7c7b\uff1b \u4e00\u4e2a\u7c7b\u91cc\u9762\u53ef\u4ee5\u6709\u591a\u4e2a\u7528\u4f8b\u51fd\u6570\uff0c\u8fd9\u53d6\u51b3\u8fd9\u6761\u7528\u4f8b\u6709\u591a\u5c11\u4e2a\u6d4b\u8bd5\u70b9\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001_1(self):\n\"\"\"\u4efb\u52a1\u680f\u542f\u52a8\u97f3\u4e50\"\"\"\ndef test_music_001_2(self):\n\"\"\"\u542f\u52a8\u5668\u542f\u52a8\u97f3\u4e50\"\"\" \ndef test_music_001_3(self):\n\"\"\"\u684c\u9762\u542f\u52a8\u97f3\u4e50\"\"\"\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_3","title":"2. \u7528\u4f8b\u51fd\u6570\u89c4\u8303","text":" \u7528\u4f8b\u51fd\u6570\u4ee5 test \u5f00\u5934\uff0c\u9075\u5faa\u86c7\u5f62\u547d\u540d\u89c4\u8303\uff0c\u4e2d\u95f4\u4e3a\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0\uff0c\u540e\u9762\u52a0\u7528\u4f8b ID\uff0c\u6700\u540e\u52a0\u6d4b\u8bd5\u70b9\u5e8f\u53f7\uff0c\u5373 test_${module}_${case_id}[_${index}] \uff1b \u6bd4\u5982\uff1atest_music_001_1\uff0cindex \u4ece 1 \u5f00\u59cb\u3002 \u51fd\u6570\u529f\u80fd\u8bf4\u660e\u91cc\u9762\u5199\u7528\u4f8b\u6807\u9898\uff0c\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u6807\u9898\u5373\u53ef\uff0c\u6ce8\u610f\u7528\u4e09\u5bf9\u53cc\u5f15\u53f7\uff0c\u4e0d\u8981\u7528\u5176\u4ed6\u6ce8\u91ca\uff0c\u66f4\u4e0d\u8981\u7528\u4e95\u53f7\u6ce8\u91ca\u5199\u7528\u4f8b\u6807\u9898\uff1b \u76f4\u63a5\u590d\u5236 PMS \u7528\u4f8b \u7528\u4f8b\u6b65\u9aa4\u76f4\u63a5\u5c06 PMS \u4e0a\u7528\u4f8b\u6b65\u9aa4\u548c\u9884\u671f\u590d\u5236\u8fdb\u6765\uff0c\u7136\u540e\u8fdb\u884c\u6279\u91cf\u6ce8\u91ca\uff08ctrl + /\uff09\uff0c\u5728\u6ce8\u91ca\u7684\u57fa\u7840\u4e0a\u53bb\u5199\u7528\u4f8b\u811a\u672c\u4f1a\u66f4\u52a0\u65b9\u4fbf\u5168\u9762\uff0c\u4e5f\u6bd4\u4f60\u81ea\u5df1\u5199\u6ce8\u91ca\u66f4\u8282\u7ea6\u65f6\u95f4\uff1a \u4e3e\u4f8b\uff0cPMS \u7528\u4f8b\uff1a \u76f4\u63a5\u9009\u4e2d\u7528\u4f8b\u5185\u5bb9\uff0c\u590d\u5236\u4e0b\u6765\uff0c\u7136\u540e\u7c98\u8d34\u5230\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c\u4e2d\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\n \u4e0a\u4f8b\u4e2d\u4e95\u53f7\u6ce8\u91ca\u90e8\u5206\u5c31\u662f\u76f4\u63a5\u4ece PMS \u4e0a\u590d\u5236\u8fc7\u6765\u7684\uff0c\u5728\u6b64\u57fa\u7840\u4e0a\u5199\u7528\u4f8b\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\nmusic = DeepinMusicWidget()\nmusic.click_singer_btn_in_music_by_ui()\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\nmusic.click_icon_mode_in_music_by_ui()\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\nmusic.double_click_first_singer_in_singer_icon_view_by_ui()\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\nself.assert_xxx\n \u4f60\u770b\uff0c\u975e\u5e38\u6e05\u695a\u6bcf\u4e00\u6b65\u5728\u505a\u4ec0\u4e48\uff0c\u91cd\u70b9\u662f\u7701\u53bb\u4e86\u5199\u6ce8\u91ca\u7684\u65f6\u95f4\uff0c\u771f\u7684\u7092\u9e21\u65b9\u4fbf\u3002 \u4e0d\u5199 if __name__ == '__main__':\uff0c\u4e0d\u5199\u591a\u4f59\u7684\u4ee3\u7801\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3","title":"3. \u6570\u636e\u9a71\u52a8","text":" \u5982\u679c\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u662f\u76f8\u540c\u7684\uff0c\u53ea\u662f\u4e00\u4e9b\u53c2\u6570\u53d8\u5316\uff0c\u5c3d\u91cf\u4f7f\u7528\u6570\u636e\u9a71\u52a8\u6765\u5b9e\u73b0\u7528\u4f8b\uff1b \u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u6570\u636e\u9a71\u52a8\u7684\u6570\u636e\uff0c\u4e0d\u80fd\u56e0\u6b64\u5f15\u5165\u4f9d\u8d56\uff0c\u5c3d\u91cf\u4f7f\u7528\u4e00\u4e9b\u6807\u51c6\u5e93\u80fd\u8bfb\u53d6\u7684\u6587\u4ef6\u683c\u5f0f\uff0c\u6bd4\u5982 json\u3001ini\u3001CSV\u3001xml\u3001txt \u7b49\u6587\u4ef6\u683c\u5f0f\uff1b\u4e0d\u5efa\u8bae\u4f7f\u7528 Yaml\u3001Excel\u3001MySQL \u7b49\u6570\u636e\u683c\u5f0f\uff1b \u8bfb\u53d6\u6570\u636e\u65f6\u4e5f\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff0c\u5982\u4f7f\u7528 pandas \u5904\u7406 CSV \u5c31\u5c5e\u4e8e\u5927\u6750\u5c0f\u7528\u4e86\uff0c\u6b63\u5e38\u7684\u6570\u636e\u9a71\u52a8\u8fd8\u6ca1\u5230\u9700\u8981\u5927\u6570\u636e\u5206\u6790\u6765\u5904\u7406\u7684\u5730\u6b65\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u5728 widget/ddt/ \u76ee\u5f55\u4e0b\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5199\u6cd5\uff1a @pytest.mark.parametrize(\"value\", data)\ndef test_smb_049(self, value):\n \u4ee5\u4e0a\u8fd9\u79cd\u53c2\u6570\u5316\u7684\u5199\u6cd5\u672c\u8eab\u6ca1\u4ec0\u4e48\u95ee\u9898\uff0c\u4f46\u662f\uff0c\u8fd9\u91cc\u5fc5\u987b\u8981\u8865\u5145\u4e00\u4e2a\u6ca1\u6709\u7528\u7684\u5c0f\u77e5\u8bc6\uff1a \u5982\u679c\u53c2\u6570\u5316\u6570\u636e\u91cc\u9762\u7684\u5b57\u7b26\u4f1a\u539f\u5c01\u4e0d\u52a8\u7684\u8f93\u51fa\u5230 item.name \u91cc\u9762\uff0c\u663e\u793a\u975e\u5e38\u4e0d\u4f18\u96c5\uff0c\u800c\u4e14\u53ef\u4ee5\u4f1a\u5f15\u5165\u4e00\u4e9b\u610f\u60f3\u4e0d\u5230\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u611f\u53d7\u4e00\u4e0b\uff1a \u53c2\u6570\uff1a data = [\n\"\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\", \"qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678\",\n]\n \u73b0\u8c61\u662f\u8fd9\u6837\u8272\u513f\u7684\uff1a test_smb_049.py::TestFileManager::test_smb_049[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09]\ntest_smb_049.py::TestFileManager::test_smb_049[qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui]\ntest_smb_049.py::TestFileManager::test_smb_049[12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678]\n \u8bf4\u5b9e\u8bdd\uff0c\u770b\u7740\u5fc3\u91cc\u5835\u5f97\u614c\uff0c\u5982\u679c\u8fd9\u91cc\u9762\u5305\u542b\u4e00\u4e9b\u7279\u6b8a\u5b57\u7b26\u6216\u8005\u662f\u8d85\u957f\uff0c\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u5f88\u5947\u5999\u7684\u4e8b\u60c5\u53d1\u751f\u3002 parametrize \u91cc\u9762\u6709\u4e2a\u53c2\u6570\uff1aids\uff0c\u53ef\u4ee5\u89e3\u51b3\u6b64\u7c7b\u95ee\u9898\uff0c\u5c31\u50cf\u8fd9\u6837\uff1a @pytest.mark.parametrize(\"value\", data, ids=[1, 2, 3])\ndef test_smb_049(self, value):\n \u518d\u6765\u611f\u53d7\u4e00\u4e0b\uff1a test_smb_049.py::TestFileManager::test_smb_049[1]\ntest_smb_049.py::TestFileManager::test_smb_049[2]\ntest_smb_049.py::TestFileManager::test_smb_049[3]\n \u660e\u663e\u597d\u591a\u4e86\uff0c\u6240\u4ee5\u5c3d\u91cf\u4f7f\u7528 ids \u8fd9\u4e2a\u53c2\u6570\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 fixture \u7684\u6570\u636e\u9a71\u52a8\u65b9\u5f0f\uff0c\u6846\u67b6\u867d\u7136\u652f\u6301\uff0c\u4f46\u53ef\u8bfb\u6027\u6bd4\u8f83\u5dee\uff1b\u5982\u679c\u4f60\u4e0d\u77e5\u9053\u8fd9\u53e5\u8bdd\u5728\u8bf4\u5565\uff0c\u90a3\u4f60\u53ef\u4ee5\u5ffd\u7565\uff0c\u6211\u4e5f\u4e0d\u6253\u7b97\u8be6\u7ec6\u8bf4\u8fd9\u79cd\u5b9e\u73b0\u65b9\u5f0f\uff0c\u64cd\u4f5c\u6bd4\u8f83\u9a9a\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4","title":"4. \u65ad\u8a00\u8d44\u6e90","text":" \u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u76f4\u63a5\u653e\u5728\u7528\u4f8b\u6a21\u5757\u7684\u540c\u7ea7\u76ee\u5f55\u4e0b\u7684 assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0 + \u7528\u4f8b ID \u547d\u540d\uff1b \u56fe\u50cf\u8bc6\u522b\u65ad\u8a00\uff0c\u4e0d\u8981\u622a\u53d6\u4e00\u5f20\u5f88\u5927\u7684\u56fe\uff0c\u56fe\u7247\u8d44\u6e90\u5305\u542b\u7684\u5143\u7d20\u592a\u591a\u4e86\uff0c\u975e\u5e38\u5bb9\u6613\u53d7\u5230\u9700\u6c42\u5f71\u54cd\uff0c\u5efa\u8bae\u662f\u8fdb\u884c\u5c40\u90e8\u7684\u65ad\u8a00\uff1b \u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u5339\u914d\u5ea6\u662f 0.9\uff0c\u5982\u679c\u65ad\u8a00\u7684\u573a\u666f\u5bf9\u4e8e\u7cbe\u786e\u5ea6\u8981\u6c42\u6ca1\u90a3\u4e48\u9ad8\uff0c\u53ef\u4ee5\u5728\u65ad\u8a00\u8bed\u53e5\u91cc\u9762\u4f20\u5165\u5c0f\u4e8e 0.9 \u7684\u53c2\u6570\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5","title":"5. \u5143\u7d20\u5b9a\u4f4d","text":" \u7528\u4e8e\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u4e2d\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u547d\u540d\u4e3a\u8be5\u5143\u7d20\u7684\u540d\u79f0\uff1b \u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u622a\u53d6\u65f6\u5c3d\u91cf\u7cbe\u786e\u5230\u8fd9\u4e2a\u5177\u4f53\u7684\u6309\u94ae\uff0c\u56fe\u7247\u4e5f\u4e0d\u8981\u592a\u5927\uff1b \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u64cd\u4f5c\u8f83\u5feb\uff0c\u5408\u7406\u52a0\u5165\u7b49\u5f85\u65f6\u95f4\u80fd\u63d0\u9ad8\u7528\u4f8b\u7684\u7a33\u5b9a\u6027\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6","title":"6. \u7528\u4f8b\u8d44\u6e90","text":" \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u4f7f\u7528\u5230\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u6bd4\u5982\u97f3\u4e50\u53ef\u80fd\u9700\u8981\u4e00\u4e9b mp3 \u7684\u8d44\u6e90\u7528\u4e8e\u6d4b\u8bd5\uff0c\u5b58\u653e\u5728 widget/case_res \u76ee\u5f55\u4e0b\uff0c\u524d\u63d0\u662f\u8fd9\u4e9b\u8d44\u6e90\u4e0d\u8d85\u8fc7 10M\uff1b \u5982\u679c\u662f\u4e00\u4e9b\u6bd4\u8f83\u5927\u7684\u8d44\u6e90\uff0c\u5efa\u8bae\u653e\u5230\u7edf\u4e00\u7684 ftp \u670d\u52a1\u5668 \uff08ftp://10.8.10.245\uff09\uff0c\u9700\u8981\u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\u518d\u4e0b\u8f7d\u4e0b\u6765\uff1b f\"wget ftp://{Config.FTP_IP}/uploads/\u591a\u5a92\u4f53/\u5f71\u9662/auto/{file_name};unzip {file_name};rm -rf {file_name};\"\n \u6d4b\u8bd5\u8d44\u6e90\u4e0b\u8f7d\u5230\u5e94\u7528 widget/case_res \u76ee\u5f55\u4e0b\uff1b \u7981\u6b62\u5c06\u6d4b\u8bd5\u8d44\u6e90\u5b58\u653e\u5728\u4e2a\u4eba\u7684\u673a\u5668\u4e0a\uff1b \u5e94\u8be5\u5c3d\u91cf\u4fdd\u8bc1\uff0c\u4e00\u4e2a\u8d44\u6e90\u5728\u4e00\u6b21\u7528\u4f8b\u6267\u884c\u4e2d\u53ea\u9700\u8981\u4e0b\u8f7d\u4e00\u6b21\uff0c\u6240\u4ee5\u4f60\u4e0d\u80fd\u6bcf\u6b21\u4f7f\u7528\u7684\u65f6\u5019\u90fd\u53bb\u4e0b\u8f7d\uff0c\u8fd9\u6837\u53ef\u80fd\u4f1a\u8017\u8d39\u5927\u91cf\u7684\u7f51\u7edc\u8d44\u6e90\uff0c\u800c\u56e0\u4e3a\u5148\u5224\u65ad\u672c\u5730\u662f\u5426\u5b58\u5728\u6b64\u8d44\u6e90\uff0c\u5982\u679c\u4e0d\u5b58\u5728\u518d\u53bb\u4e0b\u8f7d\uff1b \u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u5c06\u8d44\u6e90\u62f7\u8d1d\u5230\u5bf9\u5e94\u7684\u6d4b\u8bd5\u76ee\u5f55\u4e0b\uff0c\u6bd4\u5982\u5c06 mp3 \u6587\u4ef6\u62f7\u8d1d\u5230 ~/Music \u76ee\u5f55\u4e0b\uff0c\u4f46\u662f\u6211\u4eec\u66f4\u5efa\u8bae\u4f60\u4f7f\u7528\u53d1\u9001\u5feb\u6377\u94fe\u63a5\u7684\u65b9\u5f0f\u66ff\u4ee3\u62f7\u8d1d\u7684\u64cd\u4f5c\uff0c\u56e0\u4e3a\u5728\u62f7\u8d1d\u5927\u6587\u4ef6\u65f6\u662f\u5f88\u6d88\u8017\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u800c\u521b\u5efa\u94fe\u63a5\u5219\u4e0d\u4f1a\uff1b @classmethod\ndef recovery_many_movies_in_movie_by_cmd(cls):\n\"\"\"\u6062\u590d\u591a\u4e2a\u89c6\u9891\u6587\u4ef6\u81f3\u89c6\u9891\u76ee\u5f55\u4e2d\"\"\"\nwork_path = f\"/home/{Config.USERNAME}/Videos/auto\"\ncode_path = f\"{Config.CASE_RES_PATH}/auto\"\ncls.run_cmd(f\"rm -rf {work_path};mkdir {work_path}\")\nsleep(1)\nflag = False\nif not exists(code_path):\ncls.run_cmd(f\"mkdir -p {code_path}\")\nflag = True\nlogger.info(f\"ln -s {code_path}/* {work_path}/\")\ncls.run_cmd(\nf\"cd {code_path}/;\"\nf\"{cls.wget_file('auto.zip') if flag else ''}\"\nf\"ln -s {code_path}/* {work_path}/ > /dev/null 2>&1\"\n)\n \u8d44\u6e90\u4e0b\u8f7d\u8fc7\u7a0b\u4e2d\u6ce8\u610f\u8d85\u65f6\u7684\u95ee\u9898\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u5f88\u5927\uff0c\u8981\u7279\u522b\u6ce8\u610f\u8fd9\u95ee\u9898\uff0c\u5982\u679c\u4f60\u4f7f\u7528\u5f3a\u5236\u7b49\u5f85\u4e0b\u8f7d\u7ed3\u675f( os.system )\uff0c\u53ef\u80fd\u4f1a\u9020\u6210\u7528\u4f8b\u6267\u884c\u65f6\u957f\u53d8\u5f97\u4e0d\u53ef\u63a5\u53d7\uff0c\u76ee\u524d\u6211\u4eec\u53d1\u73b0\u5728\u6301\u7eed\u96c6\u6210\u73af\u5883\u6267\u884c\u65f6\u7f51\u7edc\u4e0b\u8f7d\u901f\u5ea6\u5f88\u6162\uff0c\u6240\u4ee5\u8d85\u65f6\u673a\u5236\u662f\u5f88\u6709\u5fc5\u8981\u7684\uff1brun_cmd \u65b9\u6cd5\u6709\u4e00\u4e2a\u9ed8\u8ba4\u8d85\u65f6\u7684\u65f6\u95f4\uff0c\u4f60\u53ef\u4ee5\u6839\u636e\u8d44\u6e90\u5927\u5c0f\u5bf9\u8d85\u65f6\u65f6\u95f4\u8fdb\u884c\u8c03\u6574\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_5","title":"\u516d\u3001\u7528\u4f8b\u8c03\u8bd5\u6280\u5de7","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_4","title":"1. \u65e5\u5fd7","text":" \u4e00\u5b9a\u8981\u5148\u770b\u62a5\u9519\uff0c\u770b error \u65e5\u5fd7\uff0c\u901a\u5e38\u80fd\u660e\u786e\u7684\u544a\u8bc9\u4f60\u5177\u4f53\u54ea\u91cc\u4ee3\u7801\u62a5\u9519\uff1b \u7ed3\u5408\u62a5\u9519\u70b9\u524d\u9762\u7684error\u3001 info \u548c debug \u65e5\u5fd7\u770b\u5426\u662f\u6b63\u5e38\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_4","title":"2. \u65ad\u70b9\u8c03\u8bd5","text":" \u65b9\u6cd5\u62a5\u9519\uff1a \u5728\u65b9\u6cd5\u5e93\u4e2d\u627e\u5230\u5bf9\u5e94\u7684\u65b9\u6cd5\uff0c\u5355\u72ec\u8c03\u7528\uff0c\u770b\u662f\u5426\u80fd\u6b63\u5e38\u6267\u884c\uff1b \u901a\u5e38\u5355\u4e2a\u65b9\u6cd5\u7684\u6267\u884c\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u62a5\u9519\uff0c\u5f88\u5feb\u5c31\u80fd\u6392\u67e5\u51fa\u95ee\u9898\uff1b\u5728\u65b9\u6cd5\u5185\u90e8\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u65b9\u6cd5\u5185\u90e8\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u8c03\u7528\u6ca1\u95ee\u9898\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u62a5\u9519\u7684\u65b9\u6cd5\u524d\u9762\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u7528\u4f8b\u7684\u4e1a\u52a1\u903b\u8f91\u548c\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u65ad\u8a00\u62a5\u9519\uff1a \u65ad\u8a00\u4e3a\u6570\u636e\u65ad\u8a00\uff0c\u6839\u636e\u8868\u8fbe\u5f0f\u8fdb\u884c\u65ad\u8a00\u8bed\u53e5\u8fdb\u884c\u4fee\u6539\uff1b \u6587\u4ef6\u751f\u6210\u7c7b\u65ad\u8a00\uff0c\u67e5\u770b\u662f\u5426\u9700\u8981\u52a0\u7b49\u5f85\u65f6\u95f4\uff1b \u56fe\u50cf\u65ad\u8a00\uff0c\u5728\u65ad\u8a00\u8bed\u53e5\u5904\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u7528\u4f8b\u8fd0\u884c\u5230\u65ad\u8a00\u5904\u4f1a\u505c\u6b62\uff0c\u67e5\u770b\u6b64\u65f6\u65ad\u8a00\u7684\u56fe\u7247\u4e0e\u7528\u4f8b\u6267\u884c\u7684\u73b0\u573a\u5b58\u5728\u4ec0\u4e48\u5dee\u5f02\uff0c\u6b64\u65f6\u4e5f\u53ef\u4ee5\u8fdb\u884c\u91cd\u65b0\u622a\u56fe\uff0c\u4ece\u800c\u66ff\u6362\u65b0\u7684\u56fe\u7247\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3_1","title":"3. \u8fdc\u7a0b\u6267\u884c","text":" \u8fdc\u7a0b\u6267\u884c\u6307\u7684\u662f\u7f16\u8f91\u5668\u901a\u8fc7\u6307\u5b9a\u8fdc\u7a0b\u89e3\u91ca\u5668\u6267\u884c\u81ea\u52a8\u5316\u4ee3\u7801\uff1b \u8fdc\u7a0b\u6267\u884c\u7684\u597d\u5904\u662f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u7684 Debug \u8fd0\u884c\uff0c\u4e0d\u7528\u5728\u6d4b\u8bd5\u673a\u4e0a\u6253\u5f00\u7f16\u8f91\u5668\uff0c\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u66f4\u5feb\uff1b \u652f\u6301\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u7684\u7f16\u8f91\u5668\uff1a \u4e13\u4e1a\u7248 Pycharm VScode \uff0c\u9700\u8981\u4f7f\u7528\u63d2\u4ef6 Remote-SSH \u8fdc\u7a0b\u6267\u884c\u914d\u7f6e \u4ee5 Pycharm \u4e3a\u4f8b\uff1a File \u2014> Settings \u2014> Project \u2014> Python Interpreter \u2014> \u53f3\u8fb9\u8bbe\u7f6e\u6309\u94ae \u2014> Add... \u2014> SSH Interpreter \u2014> New server configuration(\u586b\u5165host\u548cusername) \u2014> Next \u2014> password\uff08\u6d4b\u8bd5\u673a\u5bc6\u7801\uff09 \u2014> Interpreter(\u9009\u62e9\u8fdc\u7a0b\u89e3\u91ca\u5668) \u2014> Finish "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4_1","title":"4. \u73af\u5883\u6e05\u7406","text":" \u5982\u679c\u7528\u4f8b\u91cc\u9762\u7684 teardown \u6ca1\u6709\u6267\u884c\uff0c\u5927\u6982\u7387\u662f\u56e0\u4e3a setup \u91cc\u9762\u4ee3\u7801\u62a5\u9519\uff0c\u8fd9\u4e24\u4e2a\u662f\u4e00\u5bf9\u7684\uff0csetup \u91cc\u9762\u62a5\u9519\uff0cteardown \u91cc\u9762\u7684\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\uff1b \u76ee\u524d\u6211\u4eec\u5df2\u7ecf\u5c06\u5404\u5e94\u7528\u7684 clean_all \u8fd9\u4e2a fixture \u6539\u6210\u4e86\u7ec8\u7ed3\u5668\uff0c\u786e\u4fdd\u59cb\u7ec8\u80fd\u6267\u884c\u5230\u8fd9\u6b65\uff0c\u4f46\u662f\u7528\u4f8b\u91cc\u9762\u7684 fixture\uff0c\u8fd8\u662f\u9700\u8981\u6211\u4eec\u5c0f\u5fc3\u5904\u7406\uff1b \u8981\u6267\u884c clean_all \u9700\u8981\u5728\u7f16\u8f91\u5668\u8fd0\u884c\u53c2\u6570\u52a0 --clean yes\uff0c\u5199\u7528\u4f8b\u7684\u65f6\u5019\u8bf7\u52a0\u4e0a\uff0c\u4e0d\u7136\u4f60\u4e0d\u786e\u5b9a\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u7684\u73af\u5883\u662f\u5426\u6062\u590d\uff1b setup \u53ef\u4ee5\u4e0d\u8981\uff0c\u5c06 setup \u653e\u5230\u7528\u4f8b\u91cc\u9762\u662f\u4e00\u79cd\u7a33\u59a5\u7684\u505a\u6cd5\uff0cteardown \u4e00\u5b9a\u8981\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5_1","title":"5. \u5143\u7d20\u5b9a\u4f4d\u4e0d\u51c6\uff08\u5750\u6807\u8fd4\u56de\u4e0d\u5bf9\uff09","text":" \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u53ef\u80fd\u53d7\u5230\u7a97\u53e3 ID \u7684\u53d8\u5316\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u9ed8\u8ba4\u53d6\u6700\u65b0\u7684\u4e00\u4e2a\u7a97\u53e3\u7528\u4e8e\u5b9a\u4f4d\uff0c\u4f46\u5982\u679c\u5b9e\u9645\u9700\u8981\u5b9a\u4f4d\u7684\u4e0d\u662f\u6700\u65b0\u7684\u7a97\u53e3\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u91cd\u65b0\u5b9e\u4f8b\u5316\u65b9\u6cd5\u7c7b\u5bf9\u8c61\uff0c\u5e76\u5728\u7c7b\u4e2d\u4f20\u5165\u5bf9\u5e94\u7684\u7a97\u53e3\u5e8f\u53f7\uff1b \u57fa\u4e8e\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u76ee\u524d\u9047\u5230\u7684\u7b14\u8bb0\u672c\u4e0a\uff0c\u7531\u4e8e\u5c4f\u5e55\u7f29\u653e\u6bd4\u4f8b\u4e3a 1.25\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u6211\u4eec\u9ed8\u8ba4\u4f7f\u7528\u7f29\u653e\u6bd4\u4f8b\u4e3a 1\uff1b \u57fa\u4e8e\u56fe\u50cf\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u76ee\u6807\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b \u57fa\u4e8e OCR \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u6587\u5b57\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u540c\u6837\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6_1","title":"6. \u952e\u9f20\u64cd\u4f5c\u4e0d\u51c6","text":" \u9f20\u6807\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6bd4\u5982\u53f3\u952e\u3001\u53cc\u51fb\u65e0\u54cd\u5e94\uff1b \u952e\u76d8\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6216\u8005\u5ef6\u8fdf\u8f93\u5165\uff0c\u6bd4\u5982\u7528\u4f8b\u9700\u8981\u8f93\u5165\u201c\u6211\u662f\u4e2d\u56fd\u4eba\u201d\uff0c\u5b9e\u9645\u53ea\u8f93\u5165\u4e86\u201c\u6211\u56fd\u4eba\u201d\uff1b \u4ee5\u4e0a\u95ee\u9898\u6392\u9664\u5e94\u7528\u5361\u987f\u7b49\u95ee\u9898\uff0c\u5927\u6982\u7387\u662f\u7531\u4e8e\u5de5\u5177\u7684\u95ee\u9898\uff0c\u76ee\u524d\u952e\u9f20\u64cd\u4f5c\u6211\u4eec\u4f7f\u7528\u4e09\u4e2a\u5de5\u5177\uff1aDogtail \u63d0\u4f9b\u7684\u952e\u9f20\u5de5\u5177\u3001PyAutoGUI\u3001Xdotool \uff1b \u6709\u540c\u5b66\u53ef\u80fd\u8981\u8bf4\u4e3a\u5565\u8981\u7528\u4e09\u4e2a\u554a\uff0c\u7528\u4e00\u4e2a\u4e0d\u5c31\u597d\u4e86\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u5404\u6709\u4f18\u70b9\u5404\u6709\u7f3a\u70b9\u3002 \u5982\u679c\u4f60\u9047\u5230\u952e\u9f20\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u8bd5\u8bd5\u901a\u8fc7\u4e0d\u540c\u7684\u5de5\u5177\u64cd\u4f5c\uff1b\u952e\u76d8\u8f93\u5165\u5ef6\u8fdf\u7684\u95ee\u9898\uff0c\u4e00\u822c\u662f\u56e0\u4e3a\u8f93\u5165\u901f\u5ea6\u592a\u5feb\u4e86\uff0c\u7cfb\u7edf\u6ca1\u53cd\u5e94\u8fc7\u6765\uff0c\u5e38\u89c1\u4e8e ARM \u548c MIPS \u4e0a\uff0c\u4fee\u6539\u53c2\u6570 delay_time \u7684\u503c\uff0c\u5355\u4f4d\u4e3a\u6beb\u79d2\uff1b # mouse_key.py\n@classmethod\ndef input_message(cls, message, delay_time=300, interval=0.2):\n\"\"\"\n \u8f93\u5165\u5b57\u7b26\u4e32\n :param message: \u8f93\u5165\u7684\u5185\u5bb9\n :param delay_time: \u5ef6\u8fdf\u65f6\u95f4\n :param interval:\n :return:\n \"\"\"\n \u5982\u679c\u4e0d\u662f\u65b9\u6cd5\u7684\u95ee\u9898\uff0c\u5219\u9700\u8981\u7ee7\u7eed\u548c\u5f00\u53d1\u4e00\u8d77\u6392\u9664\uff0c\u662f\u5426\u4e3a\u5e94\u7528\u63a5\u53d7\u952e\u9f20\u4fe1\u53f7\u5904\u7406\u7684\u95ee\u9898\uff0c\u8fd9\u7c7b\u60c5\u51b5\u6211\u4eec\u4e5f\u662f\u9047\u5230\u8fc7\u7684\uff0c\u5177\u4f53\u95ee\u9898\u5177\u4f53\u5206\u6790\u3002 \u6bd4\u5982\u5f71\u9662\u5c31\u91cd\u5199\u4e86\u4e00\u4e2a\u53f3\u952e\u7684\u65b9\u6cd5\uff1a # base_widget.py\n@classmethod\ndef right_click(cls, _x=None, _y=None):\n\"\"\"\n \u91cd\u5199\u5e95\u5c42\u5355\u51fb\u9f20\u6807\u53f3\u952e\n \u89e3\u51b3\u5f71\u9662\u53f3\u952e\u89e6\u53d1release\u4e8b\u4ef6\u7684\u95ee\u9898\uff08\u53f3\u952e\u4e3b\u7a97\u53e3\u4f1a\u64ad\u653e\u89c6\u9891\uff09\n \"\"\"\ncls.mouse_down(_x, _y, button=3)\nsleep(0.1)\ncls.mouse_up(button=3)\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_6","title":"\u4e03\u3001\u5176\u4ed6\u4e0d\u4e3a\u4eba\u77e5\u7684\u7ec6\u8282","text":" \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u5c3d\u91cf\u7f16\u5199\u540c\u4e00\u4e2a\u5e94\u7528\u6216\u6a21\u5757\u7684\u7528\u4f8b\uff0c\u80fd\u5bf9\u8be5\u7528\u4f8b\u5df2\u6709\u65b9\u6cd5\u719f\u6089\uff0c\u907f\u514d\u8fc7\u591a\u91cd\u590d\u4e1a\u52a1\u4ee3\u7801\u7684\u5c01\u88c5\uff1b \u76f8\u540c\u7684\u573a\u666f\u4e0b\uff0c\u5404\u67b6\u6784\u7b49\u5f85\u65f6\u95f4\u4e0d\u540c\uff0c\u5efa\u8bae\u4f7f\u7528\u6846\u67b6\u63d0\u4f9b\u7684 sleep\uff0c\u6211\u4eec\u505a\u4e86\u4e0d\u540c\u67b6\u6784\u7684\u500d\u6570\u653e\u5927\uff1b \u7f16\u5199\u7528\u4f8b\u65f6\uff0c\u5c3d\u91cf\u8003\u8651\u5230\u6bcf\u4e00\u6b65\u5f02\u5e38\u540e\u7684\u73af\u5883\u6062\u590d\uff0c\u9700\u8981\u5efa\u8bae\u8fd9\u79cd\u610f\u8bc6\uff0c\u968f\u65f6\u8981\u8003\u8651\u5230\uff0c\u8fd9\u6b65\u64cd\u4f5c\u6709\u6ca1\u6709\u53ef\u80fd\u51fa\u9519\uff0c\u51fa\u9519\u4e86\u6539\u600e\u4e48\u529e\uff1b \u63d0\u4ea4\u4ee3\u7801\u7684\u65f6\u5019\u6ce8\u610f\u4e0d\u8981\u628a\u4e00\u4e9b\u4e34\u65f6\u7684\u6d4b\u8bd5\u8d44\u6e90\u63d0\u4ea4\u8fdb\u53bb\u4e86\uff0c\u6bd4\u5982\u6d4b\u8bd5\u4e86\u4e00\u4e2a\u5f71\u7247\uff0c\u6709\u4e9b\u540c\u5b66\u4e60\u60ef\u4f7f\u7528 git add . \uff0c\u7136\u540e\u5c31\u5168\u90e8\u63d0\u4ea4\u5230\u4ee3\u7801\u4ed3\u5e93\u4e86\uff0c\u8fd9\u6837\u5373\u4f7f\u540e\u671f\u628a\u5927\u6587\u4ef6\u5220\u4e86\uff0c.git \u6587\u4ef6\u91cc\u9762\u4e5f\u4f1a\u5f88\u5927\uff0c\u9020\u6210\u4ee3\u7801\u4ed3\u5e93\u53d8\u5f97\u5341\u5206\u81c3\u80bf\u3002 \u66f4\u591a\u7ec6\u8282\u67e5\u770b\uff1a\u300aAT\u7ecf\u9a8c\u603b\u7ed3\u300b"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/","title":"AT \u6267\u884c\u5668\u4f7f\u7528\u6307\u5317","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/5/25\n# Author : litao\n# =============================================\n Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1","title":"1\u3001\u529f\u80fd\u4ecb\u7ecd","text":" \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7cfb\u7edf\u8bed\u8a00\u8bbe\u7f6e\uff0c\u5206\u8fa8\u7387\u8bbe\u7f6e\u53ca\u7528\u4f8b\u6267\u884c\u73af\u5883\u642d\u5efa\uff1b \u652f\u6301 IP \u4e3a 15 \u7f51\u6bb5\u7684 AMD \u67b6\u6784\u6d4b\u8bd5\u673a\u955c\u50cf\u88c5\u673a\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u6307\u5b9a\u5e94\u7528\uff0c\u6307\u5b9a\u8303\u56f4\u6807\u7b7e\u7684\u7528\u4f8b\u6267\u884c\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u72b6\u6001\u68c0\u67e5\uff0c\u662f\u5426\u6709\u6b63\u5728\u8fd0\u884c\u7684\u6d4b\u8bd5\uff1b \u652f\u6301\u914d\u7f6e\u7528\u4f8b\u6267\u884c\u65f6\u957f\uff0c\u9632\u6b62\u4efb\u52a1\u963b\u585e\uff1b \u652f\u6301\u6839\u636e\u5e94\u7528\u7248\u672c\u81ea\u52a8\u67e5\u627e\u5bf9\u5e94\u7684\u7528\u4f8b tag\uff1b \u652f\u6301\u5f02\u5e38\u5904\u7406\u548c\u6d4b\u8bd5\u5b8c\u6210\u7684\u5b9e\u65f6\u6d88\u606f\u901a\u77e5\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2job","title":"2\u3001Job \u4ecb\u7ecd","text":"\u4ee5\u4e0b\u6309\u6267\u884c\u6d41\u7a0b\u7684\u987a\u5e8f\u4ecb\u7ecd\uff0c\u6bcf\u4e00\u6b65\u90fd\u53ef\u4ee5\u5355\u72ec\u6267\u884c\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1_1","title":"1\u3001\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/AT_test/ \u6574\u4e2a\u6d41\u7a0b\u7684\u4e3b\u5165\u53e3\uff0c\u901a\u8fc7\u8fd9\u4e2a\u5165\u53e3\uff0c\u8fde\u540c\u6574\u4e2a\u6d4b\u8bd5\u6d41\u7a0b\uff0c\u955c\u50cf\u88c5\u673a\uff0c\u73af\u5883\u90e8\u7f72\uff0c\u6d4b\u8bd5\u5e94\u7528\u53ca\u751f\u6210\u62a5\u544a\u3002 \u53c2\u6570\u4ecb\u7ecd\uff1a \u6d4b\u8bd5\u673a\uff1a\u6240\u6709\u89c4\u6574\u5230\u56fa\u5b9a\u533a\u57df\u7684\u6d4b\u8bd5\u673a\uff0c\u901a\u8fc7\u6d4b\u8bd5\u540c\u5b66\u5bf9\u6d4b\u8bd5\u673a\u7684\u4e60\u60ef\u547d\u540d\uff0c\u5728\u540e\u53f0\u6620\u5c04\u6d4b\u8bd5\u673a\u7684\u8be6\u7ec6\u4fe1\u606f\uff0c\u62ec\u53f7\u4e2d\u4e3a\u6d4b\u8bd5\u673a IP \u7684\u6700\u540e\u4e00\u4f4d\uff1b \u6d4b\u8bd5\u5e94\u7528\uff1a\u6307\u5b9a\u7684\u6d4b\u8bd5\u5e94\u7528\u7684\u5305\u540d\uff0c\u7cfb\u7edf\u6839\u636e\u540d\u79f0\u81ea\u52a8\u62c9\u53d6\u5bf9\u5e94\u7684\u4ed3\u5e93\u4ee3\u7801\uff1b deb\u5305\u4e0b\u8f7d\u5730\u5740\uff1a\u6d4b\u8bd5\u4e0a\u8ff0\u5e94\u7528\u65f6\uff0c\u9700\u8981\u5b89\u88c5\u7684deb\u5305\u4e0b\u8f7d\u5730\u5740\uff0c\u591a\u4e2a\u5730\u5740\u7528\u201c,\u201d\u9694\u5f00\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff1b \u8303\u56f4\u6807\u7b7e\uff1a\u6267\u884c\u6d4b\u8bd5\u7528\u4f8b\u7684\u6807\u7b7e\u8303\u56f4\uff0c\u5bf9\u5e94\u7528\u4f8b\u4ee3\u7801 csv \u6587\u4ef6\u4e2d\u7684\u6807\u7b7e\u4fe1\u606f\uff0c\u4ee5 pytest \u7684mark\u8bed\u6cd5\u7f16\u5199\uff1b \u7cfb\u7edf\u8bed\u8a00\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u8bed\u8a00\u73af\u5883\uff1b \u5206\u8fa8\u7387\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u5206\u8fa8\u7387\u73af\u5883\uff1b \u955c\u50cf\u5730\u5740\uff1a\u955c\u50cf\u4ed3\u5e93\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u901a\u8fc7 PXE \u88c5\u673a\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u88c5\u673a\u73af\u8282\uff08\u76ee\u524d\u4ec5\u652f\u6301\u90e8\u5206 AMD \u67b6\u6784\u7684\u88c5\u673a\uff09\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2pxe","title":"2\u3001PXE \u88c5\u673a","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/IOS_install/ \u8f93\u5165\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\uff0cIP\uff0c\u5bc6\u7801\uff0c\u955c\u50cf\u5730\u5740\u540e\uff0c\u81ea\u52a8\u88c5\u673a\uff0c\u76ee\u524d\u4ec5\u652f\u6301\u56fa\u5b9a 15 \u7f51\u6bb5\u7684\u90e8\u5206 AMD \u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#3","title":"3\u3001\u6b21\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/all_client_test/ \u8be5\u5165\u53e3\u4e0e\u4e3b\u5165\u53e3\u529f\u80fd\u57fa\u672c\u4e00\u81f4\uff0c\u53ea\u662f\u5265\u79bb\u4e86PXE\u88c5\u673a\u6d41\u7a0b\uff0c\u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7684\u6267\u884c\u6d41\u7a0b\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#4","title":"4\u3001\u73af\u5883\u90e8\u7f72","text":"Jenkins url\uff1ahttps://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/env/build?delay=0sec \u8bbe\u7f6e\u6d4b\u8bd5\u673a\u7684\u7cfb\u7edf\u8bed\u8a00\uff0c\u5206\u8fa8\u7387\u53ca\u5b89\u88c5\u6d4b\u8bd5\u6240\u9700\u7684\u4f9d\u8d56\u5305\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#5","title":"5\u3001\u53d1\u9001\u4ee3\u7801","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/send_code/ \u6839\u636e\u6d4b\u8bd5\u5e94\u7528\u540d\u79f0\uff0c\u62c9\u53d6\u5bf9\u5e94\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u5e76\u6839\u636e\u6d4b\u8bd5\u673a\u4e0a\u5e94\u7528\u7248\u672c\u5207\u6362\u5230\u5bf9\u5e94\u7684tag\u7248\u672c\uff0c\u82e5\u672a\u627e\u5230tag\u7248\u672c\uff0c\u5219\u4f7f\u7528\u6700\u65b0\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u518d\u6839\u636e\u5e94\u7528\u5e93\u4ee3\u7801\u4e2d\u914d\u7f6e\u7684\u57fa\u7840\u5e93\u7248\u672c\uff0c\u62c9\u53d6\u57fa\u7840\u5e93\u4ee3\u7801\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#6","title":"6\u3001\u7528\u4f8b\u6267\u884c","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/run_test/ \u8fd0\u884c\u6d4b\u8bd5\u673a\u4e0a\u7684\u7528\u4f8b"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/","title":"AT \u7528\u4f8b\u7b5b\u9009\u6307\u5317","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u7528\u4f8b\u7b5b\u9009\u6807\u51c6\uff0c\u662f\u6311\u9009\u5408\u9002\u7684\u6587\u672c\u7528\u4f8b\u8fdb\u884c\u81ea\u52a8\u5316\u7528\u4f8b\u8f6c\u5316\u7684\u4e00\u4e9b\u901a\u7528\u6807\u51c6\u3002 \u8fc7\u53bb\u6211\u4eec\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u5b9e\u8df5\u8fc7\u7a0b\u4e2d\uff0c\u5199\u4e86\u4e0d\u5c11\u81ea\u52a8\u5316\u7528\u4f8b\uff0c\u968f\u7740\u9700\u6c42\u7684\u8fed\u4ee3\uff0c\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u81ea\u7136\u8150\u5316\uff0c\u56e0\u800c\u9700\u8981\u5728\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\u5bf9\u81ea\u52a8\u5316\u7528\u4f8b\u8fdb\u884c\u7ef4\u62a4\uff0c\u5728\u7ef4\u62a4\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u6211\u4eec\u53d1\u73b0\uff0c\u6709\u4e9b\u7528\u4f8b\u7ef4\u62a4\u8d77\u6765\u592a\u96be\u4e86\uff0c\u8c03\u8bd5\u7528\u4f8b\u8017\u8d39\u5927\u91cf\u65f6\u95f4\uff0c\u6210\u672c\u5f88\u9ad8\u3002 \u56e0\u6b64\uff0c\u6211\u4eec\u603b\u7ed3\u4e00\u4e9b\u81ea\u52a8\u5316\u7528\u4f8b\u9009\u578b\u7684\u6807\u51c6\uff0c\u4ee5\u4f18\u5316\u540e\u7eed\u81ea\u52a8\u5316\u7528\u4f8b\u7ed3\u6784\uff0c\u671f\u5f85\u6211\u4eec\u80fd\u7f16\u5199\u51fa\u9ad8\u6548\u3001\u7a33\u5b9a\u3001\u6613\u4e8e\u7ef4\u62a4\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_1","title":"\u4e00\u3001\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u53ef\u4ee5\u5206\u4e3a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u548c\u4e13\u9879\u81ea\u52a8\u5316\u6d4b\u8bd5\uff0c\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e00\u822c\u53ea\u9488\u5bf9\u4e00\u4e9b\u5e38\u89c4\u7684\u529f\u80fd\u6d4b\u8bd5\uff0c\u5176\u4ed6\u975e\u5e38\u89c4\u529f\u80fd\u7684\u7528\u4f8b\uff0c\u5e94\u8be5\u91c7\u7528\u4e13\u9879\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u6848\uff1b \u4ee5\u4e0b\u662f\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1","title":"1. \u7a33\u5b9a\u6027\u3001\u538b\u6d4b\u7528\u4f8b","text":"\u7a33\u5b9a\u6027\u6d4b\u8bd5\u3001\u538b\u6d4b\u7528\u4f8b\u5e94\u8be5\u662f\u5c5e\u4e8e\u6027\u80fd\u76f8\u5173\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u5982\uff1a\u53cd\u590d\u591a\u6b21\u70b9\u51fb\u6309\u94ae\uff0c\u68c0\u9a8c\u5176\u529f\u80fd\u7a33\u5b9a\u6027\u3002\u56e0\u4e3a\u8fd9\u4e9b\u7528\u4f8b\u65ad\u8a00\u7684\u9884\u671f\u53ef\u80fd\u4e0d\u662f\u5f88\u660e\u786e\uff0c\u66f4\u6709\u751a\u8005\u4e0d\u9700\u8981\u65ad\u8a00\uff0c\u7528\u4f8b\u65f6\u957f\u6bd4\u8f83\u957f\uff0c\u800c\u4e14\u4e0d\u53ef\u63a7\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u76ee\u524d\u6211\u4eec\u6709\u6027\u80fd\u81ea\u52a8\u5316\u7684\u4e13\u9879\u65b9\u6848\uff0c\u4ee5\u53ca\u4e00\u4e9b\u7a33\u5b9a\u6027\u6d4b\u8bd5\u7684\u4e13\u9879\u65b9\u6848\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u6b64\u7c7b\u7528\u4f8b\u653e\u5230\u4e13\u9879\u81ea\u52a8\u5316\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2","title":"2. \u6d89\u53ca\u591a\u4e2a\u7528\u6237\u64cd\u4f5c","text":"\u5e38\u89c1\u4e0e\u6587\u7ba1\u7684\u7528\u4f8b\u4e2d\uff0c\u591a\u7528\u6237\u64cd\u4f5c\u7684\u7528\u4f8b\u4e00\u822c\u90fd\u4f1a\u6d89\u53ca\u5230\u5728\u7cfb\u7edf\u4e2d\u8fdb\u884c\u591a\u4e2a\u7528\u6237\u95f4\u7684\u5207\u6362\uff0c\u81ea\u52a8\u5316\u811a\u672c\u4e00\u822c\u662f\u8fd0\u884c\u5728\u4e00\u4e2a\u7528\u6237\u7a7a\u95f4\u4e0b\u7684\uff0c\u6240\u4ee5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u591a\u7528\u6237\u95f4\u7684\u5207\u6362\u3002 \u6b64\u7c7b\u4e0d\u5efa\u8bae\u91c7\u7528\u81ea\u52a8\u5316\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3","title":"3. \u4e0e\u5f00\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4ea4\u4e92","text":"\u6b64\u7c7b\u573a\u666f\u591a\u4e3a\u5e94\u7528\u7684\u5f02\u5e38\u573a\u666f\u6d4b\u8bd5\uff0c\u6bd4\u5982\uff1a\u590d\u5236\u5927\u6587\u4ef6\u8fc7\u7a0b\u4e2d\u6ce8\u9500\u673a\u5668\u3002 \u81ea\u52a8\u5316\u811a\u672c\u5728\u7cfb\u7edf\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4e4b\u540e\u662f\u4f1a\u505c\u6b62\u8fd0\u884c\u7684\uff1b\u6b64\u7c7b\u7528\u4f8b\u53ef\u4ee5\u505a\u81ea\u52a8\u5316\uff0c\u4f46\u662f\u540c\u6837\u9700\u8981\u505a\u4e13\u9879\u65b9\u6848\uff0c\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u7684\u5904\u7406\u903b\u8f91\u5b8c\u5168\u4e0d\u540c\u3002 \u540e\u7eed\u81ea\u52a8\u5316\u9700\u8981\u516c\u5173\u7684\u70b9\uff1a \u81ea\u52a8\u5316\u811a\u672c\u5728\u672c\u673a\u8fd0\u884c\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u81f3\u5c11\u9700\u8981\u63d0\u4f9b\u4ee5\u4e0b\u529f\u80fd\uff1a \u91cd\u542f\u4e4b\u540e\u7528\u4f8b\u80fd\u81ea\u52a8\u8fd0\u884c\uff1b\u53ef\u4ee5\u8003\u8651\u5c06\u6267\u884c\u7528\u4f8b\u5199\u6210\u4e00\u4e2a\u5f00\u673a\u81ea\u542f\u7684\u670d\u52a1\uff1b \u80fd\u8bb0\u5f55\u5173\u673a\u4e4b\u524d\u7528\u4f8b\u6267\u884c\u7684\u4f4d\u7f6e\uff0c\u91cd\u542f\u4e4b\u540e\u80fd\u4ece\u6b64\u4f4d\u7f6e\u5f00\u59cb\u6267\u884c\uff1b \u50cf\u6027\u80fd\u81ea\u52a8\u5316\u4e00\u6837\uff0c\u7531\u670d\u52a1\u7aef\u63a7\u5236\uff1b \u5b8c\u5168\u57fa\u4e8e\u56fe\u5f62\u8bc6\u522b\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u4e32\u53e3\u7ebf\u63a7\u5236\u952e\u9f20\u7a33\u5b9a\u6027\uff1b "},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4","title":"4. \u6d4b\u8bd5\u6267\u884c\u65f6\u95f4\u957f","text":"\u7528\u4f8b\u6267\u884c\u65f6\u95f4\u63a7\u5236\u57282\u5206\u949f\u4ee5\u5185\uff0c\u6781\u7aef\u60c5\u51b5\u4e0d\u8981\u8d85\u8fc75\u5206\u949f\uff0c\u6240\u6709\u7528\u4f8b\u7684\u5e73\u5747\u65f6\u957f\u5e94\u8be5\u57281\u5206\u949f\u5de6\u53f3\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u95f4\u592a\u957f\uff0c\u7f16\u5199\u7528\u4f8b\u3001\u8c03\u8bd5\u7528\u4f8b\u3001\u6267\u884c\u7528\u4f8b\u3001\u7ef4\u62a4\u7528\u4f8b\u90fd\u975e\u5e38\u7684\u8017\u65f6\uff0c\u4eba\u529b\u6210\u672c\u65f6\u95f4\u6210\u672c\u6295\u5165\u592a\u9ad8\u3002 \u4f60\u60f3\uff0c\u8fd9\u6761\u7528\u4f8b\u6267\u884c\u9700\u89815\u5206\u949f\uff0c\u90a3\u4f60\u5199\u8fd9\u6761\u7528\u4f8b\u7684\u65f6\u95f4\u4e0d\u53ef\u80fd\u4e00\u904d\u8fc7\uff0c\u5199\u7684\u8fc7\u7a0b\u4e2d\u8dd1\u4e0d\u901a\u8fd8\u5f97\u91cd\u8dd1\u81f3\u5c1115\u5206\u949f\u4e0d\u8fc7\u5206\uff0c\u5199\u5b8c\u4e86\u8fd8\u5f97\u5728\u5176\u4ed6\u67b6\u6784\u4e0a\u8c03\u8bd5\uff0c\u534a\u4e2a\u5c0f\u65f6\u8fc7\u53bb\u4e86\uff0c\u8fd9\u8fd8\u53ea\u662f\u7b2c\u4e00\u6b21\u5199\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u540e\u7eed\u5982\u679c\u7528\u4f8b\u7ef4\u62a4\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u7ecf\u5e38\u6295\u5165\u76f8\u5f53\u957f\u65f6\u95f4\uff0c\u8fd9\u6837\u5176\u5b9e\u662f\u5931\u53bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u7684\u3002\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u5c31\u5e94\u8be5\u662f\u5feb\u51c6\u72e0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5","title":"5. \u8fb9\u7f18\u6027\u6d4b\u8bd5","text":"\u6709\u4e9b\u529f\u80fd\u6a21\u5757\u672c\u8eab\u662f\u5c5e\u4e8e\u6bd4\u8f83\u8fb9\u7f18\u6027\u7684\uff0c\u5373\u6781\u5c11\u7528\u6237\u4f1a\u4f7f\u7528\u5230\u7684\u529f\u80fd\uff0c\u8fd9\u7c7b\u529f\u80fd\u6a21\u5757\u4e0d\u9700\u8981\u5927\u89c4\u6a21\u5b9e\u73b0\u81ea\u52a8\u5316\uff0c\u4e00\u4e24\u4e2a\u573a\u666f\u8986\u76d6\u57fa\u672c\u529f\u80fd\u5c31\u884c\u4e86\uff0c\u56e0\u6b64\u6211\u4eec\u5728\u6311\u9009\u6b64\u7c7b\u7528\u4f8b\u7684\u65f6\u5019\u53ef\u4ee5\u7ed3\u5408\u6574\u4e2a\u529f\u80fd\u6a21\u5757\u7684\u8986\u76d6\u60c5\u51b5\u6765\u51b3\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6","title":"6. \u9700\u8981\u4f9d\u8d56\u4eba\u5de5\u4ecb\u5165\u7684","text":"\u81ea\u52a8\u5316\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\u662f\u6ca1\u6709\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bd4\u5982\u8981\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u90a3\u4e48\u5c31\u80cc\u79bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u3002 \u6bd4\u5982\u5149\u9a71\u6a21\u5757\uff0c\u5149\u9a71\u523b\u5f55\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u4f46\u662f\u5149\u9a71\u523b\u5f55\u4e4b\u540e\u5149\u76d8\u4f1a\u5f39\u51fa\u6765\uff0c\u9700\u8981\u4eba\u5de5\u66f4\u6362\u5149\u76d8\uff0c\u518d\u624b\u52a8\u63a8\u8fdb\u5149\u9a71\u4e2d\u3002 \u8fd9\u79cd\u529f\u80fd\u6a21\u5757\u5373\u4f7f\u505a\u81ea\u52a8\u5316\uff0c\u80fd\u6d89\u53ca\u5230\u7684\u529f\u80fd\u975e\u5e38\u6709\u9650\uff0c\u800c\u4e14\u4e0d\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u6240\u4ee5\u660e\u663e\u5c31\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7","title":"7. \u96be\u4ee5\u5b9e\u73b0\u7684","text":"\u7528\u4f8b\u6240\u6d89\u53ca\u5230\u7684\u65b9\u6cd5\u5b9e\u73b0\u8d77\u6765\u53ef\u80fd\u6709\u96be\u5ea6\uff0c\u751a\u81f3\u73b0\u9636\u6bb5\u65e0\u6cd5\u5b9e\u73b0\u7684\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002 \u6bd4\u5982\u5f71\u9662\u6d4b\u8bd5\u753b\u9762\u6e05\u6670\u5ea6\u3001\u6d41\u7545\u5ea6\u3001\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u4e4b\u540e\u7684\u89c6\u9891\u662f\u5426\u5b58\u5728\u5361\u987f\u7b49\u7528\u4f8b\uff0c\u73b0\u9636\u6bb5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#8","title":"8. \u529f\u80fd\u4e0d\u7a33\u5b9a","text":"\u8fd9\u4e2a\u4e0d\u662f\u8bf4\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\uff0c\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\u4e0d\u7a33\u5b9a\u662f\u6b63\u5e38\u7684\uff0c\u8fd9\u79cd\u6211\u4eec\u53ef\u4ee5\u7b49\u5f00\u53d1\u63d0\u6d4b\u4e4b\u540e\u518d\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u3002 \u529f\u80fd\u4e0d\u7a33\u5b9a\u6307\u7684\u662f\u7528\u4f8b\u6240\u6d89\u53ca\u7684\u529f\u80fd\uff0c\u53ef\u80fd\u5b58\u5728\u591a\u79cd\u53d8\u5316\uff0c\u6bcf\u6b21\u6267\u884c\u7528\u4f8b\u53ef\u80fd\u65ad\u8a00\u7684\u9884\u671f\u90fd\u4e0d\u540c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#9","title":"9. \u52a8\u6001\u65ad\u8a00","text":"\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u76f4\u5230\u7528\u4f8b\u7ed3\u675f\uff0c\u4e00\u76f4\u662f\u4e00\u4e2a\u52a8\u6001\u53d8\u5316\u7684\u8fc7\u7a0b\uff0c\u800c\u4e14\u65e0\u6cd5\u901a\u8fc7\u5176\u4ed6\u624b\u6bb5\u505c\u4e0b\u6765\uff1b \u6bd4\u5982\uff1a\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u65f6\uff0c\u53f3\u4e0b\u89d2\u7684\u5f55\u5236\u65f6\u95f4\u662f\u4e00\u76f4\u5728\u53d8\u5316\u7684\uff0c\u7528\u4f8b\u9700\u8981\u6d4b\u8bd5\u5f55\u52361\u5206\u949f\u4e4b\u540e\uff0c\u5f55\u5236\u65f6\u95f4\u662f\u521a\u597d\u505c\u572860\u79d2\uff1b \u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fd8\u505a\u4e0d\u5230\u65f6\u95f4\u7cbe\u51c6\u63a7\u5236\uff0c\u7a0b\u5e8f\u6267\u884c\u65f6\u95f4\u662f\u6709\u6ce2\u52a8\u7684\uff0c\u800c\u4e14\u8981\u9002\u914d\u591a\u4e2a\u5e73\u53f0\uff0c\u6240\u4ee5\u6b64\u7c7b\u7528\u4f8b\u5927\u6982\u7387\u4f1a\u6267\u884c\u5931\u8d25\u3002\u7279\u522b\u662f\u5728\u6027\u80fd\u8f83\u5dee\u7684\u56fd\u4ea7\u5316\u67b6\u6784\u4e0a\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u592a\u53ef\u80fd\u7a33\u5b9a\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#10","title":"10. \u63a2\u7d22\u6027\u6d4b\u8bd5","text":"\u63a2\u7d22\u6027\u6d4b\u8bd5\u901a\u5e38\u662f\u4e00\u4e9b\u4e0d\u786e\u5b9a\u7684\u64cd\u4f5c\uff0c\u591a\u53d8\u5207\u590d\u6742\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u9884\u671f\u4e5f\u53ef\u80fd\u662f\u4e0d\u786e\u5b9a\u7684\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u9a9a\u64cd\u4f5c\u592a\u591a\u4e86\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6b64\u7c7b\u7528\u4f8b\u9002\u5408\u91c7\u7528\u624b\u5de5\u6d4b\u8bd5\uff0c\u662f\u624b\u5de5\u6d4b\u8bd5\u771f\u6b63\u7684\u4ef7\u503c\u4f53\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#11","title":"11. \u6613\u7528\u6027\u6d4b\u8bd5","text":"\u5bf9\u4e8e\u6613\u7528\u6027\u7684\u5224\u65ad\u901a\u5e38\u662f\u4e3b\u89c2\u7684\uff0c\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\u5f88\u96be\u53bb\u5b9a\u4e49\u4ec0\u4e48\u6837\u7684\u60c5\u51b5\u5bf9\u7528\u6237\u662f\u6613\u7528\u7684\uff0c\u81ea\u52a8\u5316\u9700\u8981\u6709\u660e\u786e\u7684\u53ef\u5b9e\u73b0\u7684\u9884\u671f\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_2","title":"\u4e8c\u3001\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u524d\u9762\u8bb2\u4e86\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u4e00\u4e9b\u7528\u4f8b\u60c5\u51b5\uff0c\u6709\u540c\u5b66\u5c31\u8bf4\u4e86\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\u4e0d\u7528\u8bb2\u4e86\uff0c\u5c31\u662f\u4e0d\u9002\u5408\u7684\u53cd\u9762\u3002\u6ca1\u6bdb\u75c5\u54c8\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\uff0c\u6211\u4eec\u5927\u4f53\u8fd8\u53ef\u4ee5\u5206\u4e3a\u4e24\u7c7b\uff1a \u7b2c\u4e00\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u597d\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u7b2c\u4e8c\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u4e00\u822c\uff0c\u9700\u8981\u6295\u5165\u66f4\u591a\u7cbe\u529b\u624d\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u4ee5\u4e0b\u4ecb\u7ecd\u4e00\u4e9b\u6211\u4eec\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1_1","title":"1. \u64cd\u4f5c\u76f8\u5bf9\u7b80\u5355","text":"\u7528\u4f8b\u6b65\u9aa4\u76f8\u5bf9\u8f83\u5c11\uff0c\u8fd9\u79cd\u7528\u4f8b\u901a\u5e38\u662f\u4e00\u4e9b\u8def\u5f84\u5f88\u6d45\u7684\u7528\u4f8b\uff0c\u4e00\u822c\u4e5f\u662f\u4e00\u4e9b\u57fa\u7840\u7528\u4f8b\u3002\u7528\u4f8b\u7f16\u5199\u3001\u7ef4\u62a4\u90fd\u53ef\u4ee5\u8f7b\u677e\u641e\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2_1","title":"2. \u5bb9\u6613\u5b9e\u73b0","text":"\u73b0\u6709\u6280\u672f\u662f\u53ef\u5b9e\u73b0\u7684\uff0c\u6ca1\u6709\u96be\u5ea6\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3_1","title":"3. \u7ecf\u5e38\u7528\u4e8e\u56de\u5f52\u6d4b\u8bd5","text":"\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bcf\u6b21\u56de\u5f52\u6d4b\u8bd5\u5fc5\u987b\u8981\u6267\u884c\u7684\u7528\u4f8b\uff0c\u90a3\u4e48\u8fd9\u6761\u7528\u4f8b\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u3002 \u56de\u5f52\u6d4b\u8bd5\u65f6\u6211\u4eec\u9996\u5148\u5e94\u8be5\u4fdd\u8bc1\u5e94\u7528\u5386\u53f2\u57fa\u672c\u529f\u80fd\u6b63\u5e38\uff0c\u6240\u4ee5\u90a3\u4e9b\u6bcf\u6b21\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u90fd\u8981\u6267\u884c\u7684\u7528\u4f8b\u9002\u5408\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4_1","title":"4. \u529f\u80fd\u7a33\u5b9a\u7684\u6838\u5fc3\u529f\u80fd","text":"\u6d89\u53ca\u6838\u5fc3\u529f\u80fd\u7684\u7528\u4f8b\u662f\u6700\u6700\u91cd\u8981\u7684\u7528\u4f8b\uff0c\u4e5f\u662f\u6211\u4eec\u4ea4\u4ed8\u65f6\u5fc5\u987b\u8981\u4fdd\u8bc1\u8d28\u91cf\u7684\u76f8\u5173\u529f\u80fd\uff0c\u56e0\u6b64\u5e94\u8be5\u5c3d\u53ef\u80fd\u7684\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5_1","title":"5. \u8f93\u5165\u6570\u636e\u6d4b\u8bd5","text":"\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u901a\u5e38\u662f\u68c0\u9a8c\u88ab\u6d4b\u5e94\u7528\u63a5\u53d7\u6709\u6548\u6570\u636e\u3001\u62d2\u7edd\u65e0\u6548\u6570\u636e\u7684\u80fd\u529b\u3002\u5982\uff1a\u63d0\u4ea4\u8d85\u957f\u5b57\u7b26\u4e32\u3001\u7279\u6b8a\u5b57\u7b26\u4e32\u7b49\u7b49\u3002 \u6b64\u7c7b\u7528\u4f8b\u624b\u5de5\u6d4b\u8bd5\u5f88\u96be\u6bd4\u8f83\u5168\u9762\u7684\u8986\u76d6\u5230\u6240\u6709\u7684\u8f93\u5165\u60c5\u51b5\uff0c\u4f46\u662f\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\uff0c\u6b64\u7c7b\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u90fd\u662f\u4e00\u6837\u7684\uff0c\u53d8\u5316\u7684\u4ec5\u662f\u8f93\u5165\u53c2\u6570\u548c\u65ad\u8a00\u7ed3\u679c\uff0c\u91c7\u7528\u6570\u636e\u9a71\u52a8\uff0c\u53ef\u4ee5\u8f7b\u677e\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6_1","title":"6. \u683c\u5f0f\u8986\u76d6","text":"\u539f\u56e0\u540c\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u7c7b\u7528\u4f8b\u4e00\u6837\uff0c\u591a\u79cd\u683c\u5f0f\u7684\u8986\u76d6\u4e5f\u662f\u4e00\u4e2a\u5f88\u7e41\u7410\u7684\u4e8b\u60c5\uff0c\u4ea4\u7ed9\u81ea\u52a8\u5316\u6765\u505a\u518d\u5408\u9002\u4e0d\u8fc7\u4e86\u3002 \u6bd4\u5982\u5f71\u9662\u5bf9\u5f71\u7247\u683c\u5f0f\u7684\u68c0\u67e5\u3001\u622a\u56fe\u5f55\u5c4f\u5bf9\u4fdd\u5b58\u683c\u5f0f\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7_1","title":"7. \u68c0\u67e5\u5143\u7d20\u72b6\u6001","text":"\u67e5\u770b\u88ab\u6d4b\u5e94\u7528\u7684\u5143\u7d20\u5c5e\u6027\u3002\u5982\uff1a\u56fe\u7247\u7684\u5927\u5c0f\u548c\u6392\u5217\uff1b\u6309\u94ae\u7684\u53ef\u7528\u548c\u4e0d\u53ef\u7528\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/","title":"AT \u7ecf\u9a8c\u603b\u7ed3","text":"\u6b22\u8fce\u6240\u6709\u4eba\u63d0\u4ea4\u4f60\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u9762\u7684\u4f18\u79c0\u5b9e\u8df5\u7ecf\u9a8c\uff0c\u4ee5\u5e2e\u52a9\u5927\u5bb6\u89e3\u51b3\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#1","title":"1\u3001\u7ec8\u7ed3\u5668","text":"# litaoa@uniontech.com\n \u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4 pytest \u5b9e\u73b0\u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4\u7684\u65b9\u5f0f\u6709\u4e24\u79cd\uff0cyield \u548c\u7ec8\u7ed3\u51fd\u6570\uff1b yield \u5b9e\u73b0\uff0cyield\u524d\u9762\u4e3a\u7528\u4f8b\u7684\u524d\u7f6e\u6b65\u9aa4\uff0cyield \u540e\u9762\u4e3a\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4\u3002 @pytest.fixture\ndef clean_env():\nprint(\"setup\")\nyield\nprint(\"teardown\")\n \u7ec8\u7ed3\u51fd\u6570\u5b9e\u73b0\uff0c\u4f7f\u7528 request.addfinalizer \u6ce8\u518c\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4 @pytest.fixture\ndef clean_env(request):\ndef clean():\nprint(\"teardown\")\nrequest.addfinalizer(clean)\nprint(\"setup\")\n yield\u7684\u4f18\u7f3a\u70b9\uff1a \u4f18\u70b9\uff1a\u4ee3\u7801\u7b80\u6d01\uff0c\u76f4\u89c2\uff0c\u53ef\u4f7f\u7528yield\u5728\u7528\u4f8b\u4e2d\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c \u7f3a\u70b9\uff1a\u82e5\u524d\u7f6e\u6b65\u9aa4\u4e2d\u51fa\u73b0\u9519\u8bef\uff0c\u5219\u540e\u7f6e\u6b65\u9aa4\u4e0d\u4f1a\u6267\u884c \u7ec8\u7ed3\u51fd\u6570\uff1a \u4f18\u70b9\uff1a\u524d\u7f6e\u6b65\u9aa4\u5931\u8d25\u7684\u8bdd\uff0c\u540e\u7f6e\u6b65\u9aa4\u4ecd\u4f1a\u6267\u884c\u4e14\u53ef\u4ee5\u6ce8\u518c\u591a\u4e2a\u540e\u7f6e\u6b65\u9aa4\uff08\u524d\u63d0\uff1a\u9700\u8981\u5728\u4ee3\u7801\u62a5\u9519\u4e4b\u524d\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff09\uff0c\u652f\u6301\u7075\u6d3b\u4f7f\u7528\u540e\u7f6e\u6761\u4ef6 \u7f3a\u70b9\uff1a\u4ee3\u7801\u8f83\u4e3a\u590d\u6742\uff0c\u65e0\u6cd5\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c\uff08\u672c\u4eba\u76ee\u524d\u672a\u5b9e\u73b0\uff09 \u603b\u7ed3\uff1a\u5728\u524d\u7f6e\u6b65\u9aa4\u4fdd\u8bc1\u7edd\u5bf9\u4e0d\u4f1a\u51fa\u9519\u65f6\uff0c\u4f7f\u7528yield\u66f4\u4f73\u7b80\u4fbf\uff0c\u5f53\u524d\u7f6e\u6b65\u9aa4\u6613\u51fa\u73b0\u95ee\u9898\u65f6\uff0c\u63a8\u8350\u4f7f\u7528\u7ec8\u7ed3\u51fd\u6570\u3002 \u573a\u666f\uff1a\u4fdd\u9669\u7bb1\u7528\u4f8b\uff0c\u524d\u7f6e\u6b65\u9aa4\u4e2d\u5f00\u542f\u4fdd\u9669\u7bb1\uff0c\u540e\u7f6e\u6b65\u9aa4\u5220\u9664\u4fdd\u9669\u7bb1\u3002 @pytest.fixture(scope=\"session\", autouse=True)\ndef vault_fixture(request):\nDfmWidget.reset_vault_by_cmd() # 1\u3001\u91cd\u7f6e\u4fdd\u9669\u7bb1\nDdeDockPublicWidget().close_file_manager_by_cmd() # 2\u3001\u5173\u95ed\u6587\u7ba1\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 3\u3001\u5f00\u542f\u6587\u7ba1\nvault = DfmWidget()\nvault.create_file_vault() # 4\u3001\u521b\u5efa\u4fdd\u9669\u7bb1\ndef delete_vault(): # 8\u3001\u5220\u9664\u4fdd\u9669\u7bb1\u7684\u540e\u7f6e\u6b65\u9aa4\nsleep(2)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr()\nvault = DfmWidget()\nvault.delete_file_vault()\nDfmWidget.reset_vault_by_cmd()\nDdeDockPublicWidget().close_file_manager_by_cmd()\nrequest.addfinalizer(delete_vault) # 5\u3001\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\nDdeDockPublicWidget().close_file_manager_by_cmd() # 6\u3001\u5173\u95ed\u6587\u7ba1\nsleep(1)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 7\u3001\u5f00\u542f\u6587\u7ba1\n \u4ee3\u7801\u6309\u6ce8\u91ca\u4e2d\u7684\u5e8f\u53f7\u6267\u884c\u6b65\u9aa4 \u4ee3\u7801\u5728\u6b65\u9aa41-4\u4efb\u610f\u4f4d\u7f6e\u62a5\u9519\uff0c\u5219\u4e0d\u4f1a\u6267\u884c\u6b65\u9aa48\uff0c\u56e0\u4e3a\u672a\u6267\u884c\u5230\u6b65\u9aa45\uff0c\u6b65\u9aa48\u8fd8\u672a\u6ce8\u518c \u4ee3\u7801\u5728\u6b65\u9aa46-7\u62a5\u9519\uff0c\u4ecd\u4f1a\u6267\u884c\u6b65\u9aa47\uff0c\u56e0\u4e3a\u5728\u6b65\u9aa45\u4e2d\u5df2\u7ecf\u5c06\u6b65\u9aa47\u6ce8\u518c \u53ef\u4ee5\u7075\u6d3b\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff0c\u80fd\u5b9e\u73b0\u67d0\u4e2a\u524d\u7f6e\u6b65\u9aa4\u6267\u884c\u4e4b\u540e\uff0c\u624d\u4f1a\u6267\u884c\u540e\u7f6e\u6b65\u9aa4\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#2","title":"2\u3001\u542f\u52a8\u5e94\u7528\u7684\u65b9\u5f0f","text":"# huangmingqiang@uniontech.com\n \uff081\uff09\u547d\u4ee4\u884c\u542f\u52a8 \u5728 AT \u4ee3\u7801\u4e2d\u4f7f\u7528\u547d\u4ee4\u884c\u542f\u52a8\u5e94\u7528\uff0c\u4e3e\u4f8b\uff1a os.popen(\"deepin-music\")\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f7f\u7528 ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6\uff0cdogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u3002 \uff082\uff09\u901a\u8fc7 UI \u64cd\u4f5c\u542f\u52a8 \u901a\u8fc7\u4efb\u52a1\u680f\u3001\u542f\u52a8\u5668\u3001\u684c\u9762\u7b49UI\u65b9\u5f0f\u542f\u52a8\uff0c\u6bd4\u5982\u53cc\u51fb\u6253\u5f00\u3001\u53f3\u952e\u6253\u5f00\u7b49\uff0c\u8fd9\u79cd\u64cd\u4f5c\u65b9\u5f0f\u4e0d\u5b58\u5728ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6dogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u7684\u95ee\u9898\uff0c\u4e5f\u66f4\u52a0\u7b26\u5408\u7528\u6237\u7684\u64cd\u4f5c\u884c\u4e3a\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#3","title":"3\u3001\u6587\u4ef6\u9009\u62e9\u6846\u5c5e\u6027\u5b9a\u4f4d\u5076\u73b0\u65e0\u6cd5\u627e\u5230","text":"\u6587\u4ef6\u9009\u62e9\u6846\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5728\u8c03\u7528\u6587\u4ef6\u9009\u62e9\u6846\u65f6\uff0c\u6709\u4e00\u5b9a\u7684\u6982\u7387\u51fa\u73b0\uff0c\u754c\u9762\u5df2\u7ecf\u6e32\u67d3\u51fa\u6765\u4e86\uff0c\u4f46\u662f\u5c5e\u6027\u6811\u5e76\u6ca1\u6709\u5199\u5165\uff0c\u5bfc\u81f4\u901a\u8fc7\u5c5e\u6027\u65e0\u6cd5\u627e\u5230\u5143\u7d20\uff0c\u76ee\u524d\u4e5f\u6ca1\u6709\u5f88\u597d\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u4e3a\u4e86\u7528\u4f8b\u7a33\u5b9a\u6027\uff0c\u6587\u4ef6\u9009\u62e9\u6846\u7684\u64cd\u4f5c\u5efa\u8bae\u4f7f\u7528UI\u6216\u8005\u56fe\u7247\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u53ef\u4ee5\u901a\u8fc7\u641c\u7d22\u5185\u5bb9\u56fa\u5b9a\u6587\u4ef6\u4f4d\u7f6e\u3002 # litaoa@uniontech.com\n desk = DdeDesktopPublicWidget()\n# \u9009\u62e9\u89c6\u9891\u76ee\u5f55\ndesk.click_videos_dir_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.ctrl_f()\nsleep(1)\ndesk.input_message(\"\u5143\u7d20\u540d\u79f0\")\nsleep(0.5)\ndesk.enter()\nsleep(1)\n# \u9009\u62e9\u7b2c\u4e00\u4e2a\u6587\u4ef6\ndesk.click_list_view_btn_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.click_first_file_in_desktop_plugs_by_ui()\nsleep(1)\n# \u6587\u7ba1\u63d2\u4ef6\u4e2d\u70b9\u51fb\u6253\u5f00\ndesk.click_open_btn_in_desktop_plugs_by_ui()\n"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#4","title":"4\u3001\u5e94\u7528\u542f\u52a8","text":"# mikigo\n \u5728UI\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u4e00\u5207\u64cd\u4f5c\u7684\u90fd\u662f\u4ece\u5e94\u7528\u542f\u52a8\u5f00\u59cb\u7684\uff0c\u800c\u5728Linux\u684c\u9762\u5e94\u7528\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u6211\u4eec\u542f\u52a8\u5e94\u7528\u7684\u65b9\u6cd5\u6709\u591a\u79cd\uff0c\u4e0b\u9762\u505a\u4e00\u4e2a\u7b80\u5355\u7684\u4ecb\u7ecd\uff1a \u3010\u4f7f\u7528dogtail\u542f\u52a8\u3011 dogtail\u63d0\u4f9b\u4e86\u5e94\u7528\u542f\u52a8\u7684\u65b9\u6cd5\uff0c\u5728utils\u5e93\u4e2d\uff0c\u4f7f\u7528run\u65b9\u6cd5\u542f\u52a8\uff1a \u9996\u5148\u5bfc\u5165\u65b9\u6cd5\uff1a from dogtail.utils import *\n \u8c03\u7528run\u65b9\u6cd5 run('deepin-music')\n \u5373\u53ef\u542f\u52a8\u97f3\u4e50 \u8fd9\u79cd\u65b9\u6cd5\u7684\u4f18\u70b9\u662f\u91c7\u7528\u8fdb\u7a0b\u7684\u65b9\u5f0f\u76f4\u63a5\u542f\u52a8\uff0c\u4e0d\u4f9d\u8d56\u4e0eUI\uff0c\u65e0\u8bba\u684c\u9762\u6216\u4efb\u52a1\u680f\u4e0a\u662f\u5426\u5b58\u5728\u5e94\u7528\u56fe\u6807\uff0c\u90fd\u53ef\u4ee5\u6b63\u5e38\u542f\u52a8\u3002 \u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c \u5982\u679c\u4f7f\u7528ssh\u8fdc\u7a0b\u8c03\u7528\uff0c\u6216\u8005Jenkins\u4e2d\u6267\u884c\u6d4b\u8bd5\u811a\u672c\u7684\u65f6\u5019\uff0c\u5728sniff\u4e2d\u4f1a\u51fa\u73b0\u627e\u4e0d\u5230\u5e94\u7528\uff0c\u7ecf\u8fc7\u5206\u6790\uff0c\u53ef\u80fd\u662f\u56e0\u4e3a\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\u542f\u52a8\u7684\u65f6\u5019\uff0c\u5b9e\u9645\u662f\u91c7\u7528\u4e00\u4e2a\u5b50\u8fdb\u7a0b\u542f\u52a8\u4e86\u5e94\u7528\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u5230\u3002 \u3010\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u3011 \u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807 \u901a\u5e38\u6709\u4e24\u79cd\u65b9\u6cd5\uff1a \uff081\uff09\u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807\u3002 \uff082\uff09\u5df2\u77e5\u5e94\u7528\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u7684\u4f4d\u7f6e\uff0c\u7136\u540e\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u5bf9\u5e94\u5750\u6807\u3002 \u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u7f3a\u70b9\u662f\u4f4d\u7f6e\u5fc5\u987b\u56fa\u5b9a\uff0c\u5982\u679c\u79fb\u52a8\u4f4d\u7f6e\u5c31\u4e0d\u884c\u4e86\uff0c\u800c\u4f7f\u7528\u7b2c\u4e00\u79cd\u65b9\u6cd5\uff0c\u65e0\u8bba\u4f4d\u7f6e\u5728\u54ea\u91cc\uff0c\u53ea\u8981\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u5b58\u5728\u5373\u53ef\u3002 \u3010\u70b9\u51fb\u684c\u9762\u56fe\u6807\u542f\u52a8\u3011 \u684c\u9762\u56fe\u6807\u76ee\u524d\u662f\u91c7\u7528\u56fe\u50cf\u8bc6\u522b\u6280\u672f\uff0c\u5b9a\u4f4d\u5230\u5e94\u7528\u56fe\u6807\u7684\u5750\u6807\uff0c\u7136\u540e\u901a\u8fc7pyauogui\u8fdb\u884c\u70b9\u51fb\u64cd\u4f5c\u3002 \u8be6\u7ec6\u6280\u672f\u65b9\u6848\u53ef\u4ee5\u53c2\u8003\u6211\u7684\u53e6\u5916\u4e24\u7bc7\u535a\u5ba2: \u57fa\u4e8eopencv\u7684\u6a21\u677f\u5339\u914d\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd4\u56de\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 Python\u4e09\u65b9\u5e93PyAutoGui\u7684\u4f7f\u7528\u65b9\u6cd5 \u3010\u4ece\u542f\u52a8\u5668\u542f\u52a8\uff08\u4fd7\u79f0\u5f00\u59cb\u83dc\u5355\uff09\u3011 \u542f\u52a8\u4e2d\u542f\u52a8\u7684\u5b9e\u73b0\u903b\u8f91\u5b9e\u9645\u548c\u4efb\u52a1\u680f\u4e0a\u542f\u52a8\u5dee\u4e0d\u591a\u3002 \u9996\u5148\uff0c\u9700\u8981\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u542f\u52a8\u5668\u56fe\u6807\uff0c\u6216\u8005\u952e\u76d8super\u952e\uff0c\u5c06\u542f\u52a8\u5668\u547c\u51fa\u6765\uff0c \u7136\u540e\uff0c\u5728\u542f\u52a8\u5668\u4e2d\u70b9\u51fb\u5bf9\u5e94\u7684\u56fe\u6807\uff0c \u4f46\u662f\u8fd9\u91cc\u6709\u4e2a\u95ee\u9898\uff0c\u542f\u52a8\u5668\u4e2d\u7684\u5e94\u7528\u5217\u8868\uff0c\u4e00\u9875\u5c55\u793a\u4e0d\u5b8c\uff0c\u6240\u4ee5\u5982\u679c\u6211\u4eec\u8981\u70b9\u51fb\u7684\u5e94\u7528\u56fe\u6807\u4e0d\u5728\u7b2c\u4e00\u9875\u600e\u4e48\u529e\uff0c\u901a\u5e38\u89e3\u51b3\u65b9\u6848\u6709\u4e24\u79cd\uff1a \uff081\uff09\u9700\u8981\u8fdb\u884c\u5411\u4e0b\u6ed1\u52a8\uff0c\u8fd9\u91cc\u5c31\u6d89\u53ca\u5230\u76f8\u5e94\u7684\u8bc6\u522b\u65b9\u6848\uff0c\u5224\u65ad\u5982\u679c\u4e0d\u5728\u7b2c\u4e00\u9875\u5c31\u5f80\u4e0b\u6ed1\u52a8\u7ffb\u9875\u3002 \uff082\uff09\u542f\u52a8\u5668\u63d0\u4f9b\u641c\u7d22\u7684\u529f\u80fd\uff0c\u8f93\u5165\u5e94\u7528\u540d\u79f0\u641c\u7d22\uff0c\u7136\u540e\u8fdb\u884c\u70b9\u51fb\u3002 \u4ece\u5b9e\u9645\u64cd\u4f5c\u4e2d\u6765\u770b\uff0c\u91c7\u7528\u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u6548\u7387\u4f1a\u9ad8\u4e00\u70b9\u3002 \u3010\u7ec8\u7aef\u547d\u4ee4\u542f\u52a8\u3011 \u5728python\u4e2d\uff0c\u4f7f\u7528os.popen()\u6216os.system()\u6216\u8005subprocess.Popen()\uff0c\u5b9e\u73b0\u547d\u4ee4\u884c\u542f\u52a8\uff0c\u6bd4\u5982\uff1a import os\nos.popen('deepin-music')\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u8fdc\u7a0b\u6267\u884c\u811a\u672c\u7684\u65f6\u5019\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u7684\u95ee\u9898\u3002 \u3010\u603b\u7ed3\u3011 \u4ee5\u4e0a\u51e0\u79cd\u65b9\u6cd5\uff0c\u5404\u6709\u4f18\u7f3a\u70b9\uff0c\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff1a \uff081\uff09\u5982\u679c\u9700\u8981\u5728Jenkins\u4e2d\u505a\u6301\u7eed\u96c6\u6210\uff0c\u5efa\u8bae\u4f7f\u7528\u7b2c\u4e8c\u79cd\u4efb\u52a1\u680f\u542f\u52a8\u7684\u65b9\u6cd5\u3002 \uff082\uff09\u5982\u679c\u4e0d\u4f1a\u91c7\u7528\u8fdc\u7a0b\u6267\u884c\u7684\uff0c\u5efa\u8bae\u91c7\u7528\u7b2c\u4e00\u79cd\u6216\u8005\u6700\u540e\u4e00\u79cd\u65b9\u6848\u3002 \uff083\uff09\u7b2c\u4e09\u79cd\u548c\u7b2c\u56db\u79cd\u542f\u52a8\u65b9\u6cd5\uff0c\u901a\u5e38\u5728\u6d4b\u8bd5\u7528\u4f8b\u4e2d\u4f1a\u6d89\u53ca\u5230\uff0c\u6240\u4ee5\u5076\u5c14\u4f1a\u7528\u3002"},{"location":"RELEASE/","title":"\u7248\u672c\u66f4\u65b0\u8bb0\u5f55","text":""},{"location":"RELEASE/#2122023822","title":"2.1.2\uff082023/8/22\uff09","text":"new \u589e\u52a0 OCR \u8bc6\u522b\u81ea\u52a8\u91cd\u8bd5\u673a\u5236\uff0c\u9ed8\u8ba4\u91cd\u8bd5 2 \u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u91cd\u8bd5\u6b21\u6570\uff1b \u4f7f\u7528\u7a97\u7ba1\u6700\u65b0\u63d0\u4f9b\u7684\u4e8c\u8fdb\u5236\u63a5\u53e3\uff0c\u4f18\u5316\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u5728 Wayland \u4e0b\u83b7\u53d6\u7a97\u53e3\u4fe1\u606f\u7684\u65b9\u6cd5\uff1b\u611f\u8c22\u684c\u9762\u6d4b\u8bd5\u90e8 @\u4f55\u6743 @\u5b59\u7fe0 \u3001\u7a97\u7ba1\u7814\u53d1 @\u9ec4\u6cfd\u94ed \u7684\u5927\u529b\u652f\u6301\u3002 \u6269\u5145 skipif \u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\u51fd\u6570\uff1a skipif_xdg_type \u652f\u6301 x11 \u6216 wayland \u4e0a\u8df3\u8fc7\uff1b skipif_cpu_name \u652f\u6301\u4e0d\u540c cpu \u4e0a\u8df3\u8fc7\uff0c\u6bd4\u5982\uff1askipif_cpu_name-KLVVW5821\uff1b "},{"location":"RELEASE/#2102023818","title":"2.1.0\uff082023/8/18\uff09","text":"fix \u4fee\u590d SW \u67b6\u6784\u73af\u5883\u4f9d\u8d56\u7684\u95ee\u9898\uff0c\u539f\u56e0\u662f\u4e4b\u524d\u6211\u8fd9\u91cc\u672c\u5730\u6ca1\u6709 SW \u7684\u673a\u5668\uff0c\u6ca1\u6709\u505a\u76f8\u5173\u9002\u914d\uff1b \u4fee\u590d\u5b50\u9879\u76ee\u5355\u72ec\u9700\u8981\u4e09\u65b9\u5305 pexpect\uff0c\u7531\u4e8e\u4e4b\u524d\u662f\u9884\u88c5\u5230\u955c\u50cf\u91cc\u9762\u7684\uff0c\u4f46\u57fa\u7840\u6846\u67b6\u4e0d\u9700\u8981\uff0c\u56e0\u6b64\u6ca1\u6709\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u91cc\u9762\uff0c\u5bfc\u81f4\u5b50\u9879\u76ee\u4f9d\u8d56\u62a5\u9519\u3002 \u4fee\u590d\u5b50\u9879\u76ee cv \u5bfc\u5165\u62a5\u9519\u7684\u95ee\u9898\uff1b \u539f\u56e0\u4e3a\uff1ayouqu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u517c\u5bb9\u4e24\u79cd\u60c5\u51b5\uff0c\u4e00\u79cd\u662f\u9762\u5411\u670d\u52a1\uff0c\u5c31\u662f\u672c\u5730\u6d4b\u8bd5\u673a\u4e0d\u9700\u8981\u5b89\u88c5 OpenCV\uff0c\u7528\u4f8b\u4e2d\u7684\u56fe\u50cf\u8bc6\u522b\u4f1a\u901a\u8fc7\u8fdc\u7a0b\u670d\u52a1\u63a5\u53e3\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u548c\u7ed3\u679c\u83b7\u53d6\uff1b\u7b2c\u4e8c\u79cd\u662f\u539f\u751f\uff0c\u5c31\u662f\u672c\u5730\u76f4\u63a5\u5b89\u88c5 OpenCV \u76f4\u63a5\u7528\u3002\u4e24\u4e2a\u60c5\u51b5\u7684\u4f18\u5148\u7ea7\u662f\u4f18\u5148\u5224\u65ad\u672c\u5730\u5b58\u5728\uff0c\u5426\u5219\u8d70\u670d\u52a1\u3002 \u524d\u9762\u6211\u4eec\u5df2\u7ecf\u628a OCR \u529f\u80fd\u505a\u4e86\u670d\u52a1\u5316\uff0c\u57fa\u4e8e 1 \u5e74\u591a\u4ee5\u6765\u7684\u89c2\u5bdf\uff0c\u7528\u8d77\u6765\u5f88\u7a33\u5b9a\uff0c\u518d\u4e00\u4e2a\u5c31\u662f OpenCV \u5b89\u88c5\u5305\u662f\u6bd4\u8f83\u81c3\u80bf\u7684\uff0c\u7c97\u7565\u6570\u4e86\u4e0b\u4f9d\u8d56\u6709 30+ \u4e2a\uff0c\u800c\u4e14\u5728\u5404\u67b6\u6784\u4e0a\u4f9d\u8d56\u5305\u8fd8\u4e0d\u5c3d\u76f8\u540c\uff0c\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u65b9\u6848\u4e2d\u4e0d\u592a\u597d\u5904\u7406\uff0c\u6240\u4ee5\u672c\u6b21 2.0 \u7248\u672c\u6211\u4eec\u5927\u80c6\u7684\u5c06\u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u529f\u80fd\u4fee\u6539\u4e3a\u9762\u5411\u670d\u52a1\u7684\u65b9\u5f0f\uff0c\u524d\u671f\u6d4b\u8bd5\u4e00\u5207\u770b\u8d77\u6765\u90fd\u5f88\u548c\u8c10\u3002 \u4f46\u662f\u6ca1\u6ce8\u610f\u5230\u4e4b\u524d\u7ed9\u6d77\u71d5\u59d0\u90a3\u8fb9\u9879\u76ee\u5355\u72ec\u5b9a\u5236\u505a\u4e86\u4e2a\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\uff08\u4e3a\u4e86\u80fd\u7b80\u5355\u5e73\u6ed1\u7684\u8fc1\u79fb\u5230 youqu\uff09\uff0c\u6b64\u63a5\u53e3\u5e95\u5c42\u6ca1\u6709\u517c\u5bb9\u670d\u52a1\u5316\uff0c\u6240\u4ee5\u5979\u90a3\u8fb9\u7684\u9879\u76ee\u8c03\u7528\u6b64\u5b9a\u5236\u63a5\u53e3\u4f1a\u62a5 cv \u5bfc\u5165\u7684\u95ee\u9898\u3002 \u7531\u4e8e\u5c06\u8fd9\u4e2a\u5b9a\u5236\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\u8fdb\u884c\u670d\u52a1\u5316\u517c\u5bb9\u6539\u9020\u9700\u8981\u4e00\u5b9a\u65f6\u95f4\uff0c\u6539\u5b8c\u8fd8\u9700\u8981\u6d4b\u8bd5\uff0c\u4f46\u672c\u6b21\u65f6\u95f4\u6bd4\u8f83\u7d27\uff0c\u56e0\u6b64\u5148\u628a OpenCV \u88c5\u8fdb\u865a\u62df\u73af\u5883\uff0c\u540e\u7eed\u7248\u672c\u518d\u8003\u8651\u9488\u5bf9\u6b64\u63a5\u53e3\u505a\u4fee\u6539\u3002"},{"location":"RELEASE/#2002023816","title":"2.0.0\uff082023/8/16\uff09","text":"YouQu\uff08\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff09\u5f00\u6e90\u4e86\uff0c\u540c\u65f6\u63a8\u51fa\u4e86 2.0 \u7248\u672c\u3002 \u611f\u8c22\u738b\u6ce2\u603b\u3001\u67b6\u6784\u5e08\u5f90\u5c0f\u4e1c\u3001\u7814\u53d1\u7ecf\u7406\u90d1\u5e7c\u6208\u3001\u5218\u90d1\u7b49\u7814\u53d1\u540c\u4e8b\u7684\u5927\u529b\u652f\u6301\u3002 new 1\u3001\u65b0\u7684\u57fa\u7840\u6846\u67b6\u4ee3\u7801\u83b7\u53d6\u65b9\u5f0f\u53ca\u65b0\u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4 YouQu \u540e\u7eed\u5747\u901a\u8fc7 PyPI \u8fdb\u884c\u5305\u7684\u53d1\u5e03\uff0c\u4e5f\u5c31\u662f\u8bf4\u540e\u7eed\u53ef\u4ee5\u4f7f\u7528 pip \u8fdb\u884c\u5b89\u88c5\uff1a sudo pip3 install youqu==2.0.0\n \u8fd9\u91cc\u6709 2 \u4e2a\u5c0f\u70b9\u8981\u6ce8\u610f\uff1a \u63a8\u8350\u4f7f\u7528 sudo pip3 \uff08\u52a0 sudo\uff09\u8fdb\u884c\u5b89\u88c5\uff1b \u5982\u679c\u4e0d\u52a0 sudo \u6709\u4e9b\u673a\u5668\u53ef\u80fd $HOME/.local/bin \u4e0d\u5728\u7cfb\u7edf PATH \u73af\u5883\u76ee\u5f55\u4e0b\uff0c\u5728\u4e0d\u6dfb\u52a0\u73af\u5883\u53d8\u91cf\u7684\u60c5\u51b5\u4e0b\uff0c\u4f1a\u51fa\u73b0 YouQu \u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4\uff08youqu-startproject\uff09\u65e0\u6cd5\u4f7f\u7528\u7684\u95ee\u9898\uff1b \u5f53\u7136\uff0c\u5c06\u4e0a\u8ff0\u8def\u5f84\u6dfb\u52a0\u5230\u73af\u5883\u53d8\u91cf\u4e4b\u540e\u4e5f\u662f\u53ef\u4ee5\u7528\u7684\uff0c\u6240\u4ee5\u6211\u8fd9\u91cc\u662f\u63a8\u8350\u52a0 sudo\uff0c\u4e0d\u52a0 sudo \u4e5f\u662f\u53ef\u4ee5\u7684\uff0c\u53ea\u662f\u9700\u8981\u5173\u6ce8\u4e0b\u73af\u5883\u53d8\u91cf\u7684\u95ee\u9898\u3002 \u63a8\u8350\u6307\u5b9a\u7248\u672c\u53f7\uff08youqu==2.0.0\uff09\u5b89\u88c5\uff0c\u5982\u679c\u4e0d\u6307\u5b9a\u7248\u672c\u53f7\u9ed8\u8ba4\u662f\u5b89\u88c5\u6700\u65b0\u53d1\u5e03\u7684 YouQu \u7248\u672c\uff0c\u4f60\u53ef\u4ee5\u5728 PyPI \u4e0a\u7684 Release history \u91cc\u9762\u67e5\u770b\u6709\u54ea\u4e9b\u7248\u672c\u3002 \u5b89\u88c5\u4e4b\u540e\u4f1a\u81ea\u52a8\u751f\u6210\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu-startproject\uff0c\u4f7f\u7528\u5b83\u53ef\u4ee5\u521d\u59cb\u5316\u5de5\u7a0b\uff0c\u8fd9\u91cc\u4ee5\u97f3\u4e50\u4e3e\u4f8b\uff1b youqu-startproject autotest_deepin_music\n \u8fd9\u6837\u5c31\u4f1a\u5728\u5f53\u524d\u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a autotest_deepin_music \u76ee\u5f55\uff0c\u91cc\u9762\u5305\u542b\u4e86\u57fa\u7840\u6846\u67b6\u6240\u6709\u7684\u4ee3\u7801\uff1b \u4e4b\u540e\uff0c\u8fd8\u662f\u5728 apps \u76ee\u5f55\u4e0b\uff0c\u653e\u5165\u5b50\u9879\u76ee\u7684AT\u4ee3\u7801\u5373\u53ef\uff0c\u4f7f\u7528\u65b9\u6cd5\u548c\u8fc7\u53bb\u4e00\u6837\uff0c\u8fd9\u91cc\u5c31\u4e0d\u591a\u4ecb\u7ecd\u3002 \u53e6\u5916\uff0c\u9664\u4e86\u901a\u8fc7 pip \u83b7\u53d6\u4ee5\u5916\uff0c\u4ecd\u7136\u53ef\u4ee5\u901a\u8fc7\u6e90\u7801\u83b7\u53d6\uff08\u76f4\u63a5 git clone\uff09\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u4f7f\u7528 pip \u5b89\u88c5 YouQu \u65f6\uff0cYouQu \u5305\u7684\u5927\u5c0f\u624d 600+ k\uff0c\u5b89\u88c5\u901f\u5ea6\u8d77\u98de\u3002 2\u3001\u65b0\u7684AT\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848 \u4e3a\u4e86\u89e3\u51b3\u4ee5\u4e0b\u95ee\u9898\uff1a \u8fc7\u53bb\u4e00\u6bb5\u65f6\u95f4\u54b1\u4eec\u7ecf\u5e38\u51fa\u73b0\u7684\uff0c\u4e0d\u540c\u7684AT\u9879\u76ee\u5728\u540c\u4e00\u53f0\u673a\u5668\u4e0a\u90e8\u7f72\u73af\u5883\u65f6\u4f9d\u8d56\u7248\u672c\u51b2\u7a81\u7684\u95ee\u9898\uff0c\u65b0\u65b9\u6848\u4e0d\u540c\u7684\u9879\u76ee\u4f1a\u52a8\u6001\u751f\u6210\u81ea\u5df1\u7684\u865a\u62df\u73af\u5883\uff0c\u76f8\u4e92\u4e4b\u95f4\u4e0d\u5f71\u54cd\uff1b \u4e1a\u5185\u4e3a\u4e86\u89e3\u51b3\u7248\u672c\u51b2\u7a81\u95ee\u9898\u4e00\u822c\u90fd\u4f1a\u4f7f\u7528Python\u865a\u62df\u73af\u5883\u7684\u5de5\u5177\uff0c\u4f46\u662f\u90fd\u6709\u4e2a\u95ee\u9898\uff0c\u65e0\u6cd5\u7ba1\u7406 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u5305\uff0c\u672c\u6b21\u6211\u4eec\u89e3\u51b3\u4e86\u8fd9\u4e2a\u95ee\u9898\uff0c\u80fd\u591f\u5b8c\u5168\u7ba1\u7406\u5e38\u89c4\u7684Python\u5305\uff0c\u4e5f\u80fd\u7ba1\u7406\u5230 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u4e09\u65b9\u5305\uff1b \u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u4f7f\u7528\u65b9\u6cd5\uff1a bash env.sh\n \u53ef\u4ee5\u770b\u51fa\u6765\u548c\u539f\u6765\u4f7f\u7528\u65b9\u6cd5\u6ca1\u6709\u53d8\u5316\uff0c\u4e5f\u5c31\u662f\u8bf4\u4ece\u4f7f\u7528\u7684\u89d2\u5ea6\u662f\u5b8c\u5168\u6ca1\u6709\u533a\u522b\u7684\uff0c\u53ea\u662f\u5185\u90e8\u505a\u4e86\u4e0d\u540c\u7684\u4e8b\u60c5\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u672c\u673a\u90e8\u7f72\u7684\u529f\u80fd\u4ecd\u7136\u4fdd\u7559 env_dev.sh\uff0c\u53ef\u4ee5\u4f5c\u4e3a\u5f00\u53d1\u65f6\u7684\u73af\u5883\u90e8\u7f72\u3002 3\u3001\u65b0\u7684\u9a71\u52a8\u547d\u4ee4 \u8fc7\u53bb\u54b1\u4eec\u90fd\u662f\u4f7f\u7528\u8fd9\u6837\u7684\u547d\u4ee4\u6765\u9a71\u52a8\u6267\u884c\uff1a python3 manage.py run\n \u7531\u4e8e\u9ed8\u8ba4\u57fa\u4e8e\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848\uff0c\u56e0\u6b64\u6211\u4eec\u589e\u52a0\u4e86\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu\uff1b \u65b0\u7684\u9a71\u52a8\u65b9\u5f0f\uff1a youqu manage.py run\n \u53ea\u9700\u8981\u628a python3 \u66ff\u6362\u6210 youqu \u5c31\u53ef\u4ee5\u4e86\uff0c\u770b\u8d77\u6765\u5f88\u548c\u8c10~ 4\u3001\u65b0\u7684\u6587\u6863\u5730\u5740 \u8fc7\u53bb\u54b1\u4eec YouQu \u7684\u5728\u7ebf\u6587\u6863\u662f\u90e8\u7f72\u5728\u516c\u53f8\u5185\u7f51\u7684\uff0c\u73b0\u5728\u5f00\u6e90\u5230 github \u4e86\uff0c\u5916\u90e8\u5f00\u53d1\u8005\u80af\u5b9a\u8bbf\u95ee\u4e0d\u5230\u5185\u7f51\u7684\u6587\u6863\uff0c\u56e0\u6b64\u9700\u8981\u5c06\u6587\u6863\u90e8\u7f72\u5230\u516c\u7f51\u3010\u516c\u7f51\u6587\u6863\u3011\uff1b \u516c\u7f51\u6587\u6863\u4f7f\u7528\u7684\u662f github pages\uff08\u767d\u5ad6\u602a\u4e00\u987f\u72c2\u559c~~\uff09\uff0c\u4f46\u53ef\u80fd\u4f1a\u51fa\u73b0\u6587\u6863\u901f\u5ea6\u6162\u7684\u95ee\u9898\uff08\u4ee3\u7406\u4e0b\u5c31\u597d\u4e86\uff09\uff0c\u4e0d\u8fc7\u6ca1\u5173\u7cfb\uff0c\u54b1\u4eec\u3010\u5185\u7f51\u6587\u6863\u3011\u4ecd\u7136\u4fdd\u7559\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u3002 5\u3001\u5176\u4ed6\u4e00\u4e9b\u5c0f\u5c0f\u529f\u80fd\u66f4\u65b0\uff1a \uff081\uff09\u65b0\u589e\u5173\u95ed\u5206\u8fa8\u7387\u68c0\u6d4b\u7684\u53c2\u6570\u503c\uff1b youqu manage.py run --resolution no\n \u6216\u8005\u4fee\u6539 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387, \u6bd4\u5982\uff1a1920x1080\n;no: \u8868\u793a\u4e0d\u505a\u5206\u8fa8\u7387\u6821\u9a8c\nRESOLUTION = 1920x1080\n resolution \u8fd9\u4e2a\u53c2\u6570\u4e00\u76f4\u90fd\u6709\u7684\uff0c\u53ea\u4e0d\u8fc7\u4e4b\u524d\u662f\u7528\u4e8e\u6307\u5b9a\u5206\u8fa8\u7387\u5927\u5c0f\uff0c\u6bd4\u5982 --resolution 1920x1080\uff0c\u4f46\u6709\u4e9b\u63a5\u53e3\u7684\u9879\u76ee\u4e0d\u9700\u8981\u8fd9\u4e2a\u68c0\u67e5\uff0c\u53ef\u4ee5\u7ed9\u5b83\u4e2a no \u5c31\u597d\u4e86\uff0c\u5f53\u7136 CICD \u4e0a\u5173\u95ed\uff0c\u9700\u8981\u6d41\u6c34\u7ebf\u4e0a\u628a\u8fd9\u4e2a\u53c2\u6570\u52a0\u4e0a\uff1b \uff082\uff09\u65b0\u589e\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u7684\u547d\u4ee4\u884c\u53c2\u6570 \u4e4b\u524d\u8fd9\u4e2a\u914d\u7f6e\u9879\u53ea\u80fd\u5728 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c 1 \u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff0cRERUN >= RECORD_FAILED_CASE\u3002\n;1.\u5173\u95ed\u5f55\u5c4f\uff1aRECORD_FAILED_CASE > RERUN\n;2.\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1aRECORD_FAILED_CASE = 0\nRECORD_FAILED_CASE = 1\n \u73b0\u5728\u5c06\u5f00\u53d1\u5230\u547d\u4ee4\u884c\u53c2\u6570\u3002 youqu manage.py run --record_failed_case 2\n fix \u4fee\u590d remote \u6267\u884c\u65f6\uff0c\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u65e0\u6cd5\u751f\u6210\u6d4b\u8bd5\u62a5\u544a\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1302023710","title":"1.3.0\uff082023/7/10\uff09","text":"fix \u8fdb\u4e00\u6b65\u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b\u53c2\u8003\uff1a\u914d\u7f6ePython\u6e90\u7684\u51e0\u79cd\u65b9\u6cd5 \u4fee\u590d wayland_autotool \u53d7\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86wayland\u4e0b\u5076\u73b0\u627e\u4e0d\u5230 .Xauthority \u6587\u4ef6\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1292023626","title":"1.2.9\uff082023/6/26\uff09","text":"fix \u4f18\u5316\u8fdc\u7a0b\u6267\u884c remote \u7684\u53c2\u6570\u76f4\u63a5\u4f20\u7ed9\u8fdc\u7a0b\u673a\u5668\u7684 run \u547d\u4ee4\uff0c\u4e0d\u7528\u518d\u5355\u72ec\u5904\u7406\u8fdc\u7a0b\u6267\u884c\u7684\u53c2\u6570\u903b\u8f91\uff0c\u540e\u7eed\u4e13\u6ce8\u4e8e\u672c\u5730\u6267\u884c\u529f\u80fd\u5f00\u53d1\uff0c\u8fdc\u7a0b\u6267\u884c\u81ea\u52a8\u9002\u7528\uff1b env.sh \u79fb\u9664 pyyaml \u5b89\u88c5\uff0c\u7531\u5b50\u9879\u76ee\u5728 requirement.txt \u91cc\u9762\u5b9a\u4e49\uff0c\u6846\u67b6\u81ea\u52a8\u52a0\u8f7d\uff1b \u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b "},{"location":"RELEASE/#128202369","title":"1.2.8\uff082023/6/9\uff09","text":"fix \u4fee\u590d\u4e86 pypi \u5b89\u88c5 numpy \u5b58\u5728\u7cfb\u7edf\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#127202368","title":"1.2.7\uff082023/6/8\uff09","text":"fix env.sh \u4e2d\u5b89\u88c5 Python \u5305\u672a\u6307\u5b9a\u7248\u672c\u65f6\uff0c\u65e5\u5fd7\u8f93\u51fa\u5b89\u88c5\u7684\u7248\u672c\uff1b pdocr-rpc 2.0.1\nallure-custom 1.2.1\nfunnylog 1.1.3\n \u4fee\u590d -f \u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u62a5\u9519\u7684\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#126202367","title":"1.2.6\uff082023/6/7\uff09","text":"fix \u4fee\u590d wayland \u4e0a\u8c03\u7528\u9f20\u6807\u4e2d\u952e\u3001\u53f3\u952e\u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b \u4fee\u590d pubilic/dde_desktop_public_widget \u91cc\u9762\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u5b9a\u4f4d\u684c\u9762\u6587\u4ef6\u7684\u65b9\u6cd5\uff0c\u5750\u6807\u6ca1\u6709\u62c6\u5305\u7684\u95ee\u9898\uff1b \u4f18\u5316\u4e86\u7b49\u5f85\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b pycreeze \u7248\u672c\u5347\u7ea7\u5230 0.1.29\uff0c\u5bfc\u81f4\u4e0e pyautogui 0.9.53 \u4e0d\u517c\u5bb9\uff0cenv.sh \u91cc\u9762\u589e\u52a0\u6307\u5b9a pycreeze \u7248\u672c\u4e3a 0.1.28\uff1b "},{"location":"RELEASE/#1252023516","title":"1.2.5\uff082023/5/16\uff09","text":"new --app \u53c2\u6570\u540e\u9762\u65b0\u589e\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u76ee\u524d\u652f\u6301\u4e09\u79cd\u53c2\u6570\u4f20\u5165\u65b9\u5f0f\uff1a ~$: youqu run -a deepin-music\n~$: youqu run -a autotest_deepin_music\n~$: youqu run -a apps/autotest_deepin_music\n \u200b \u540e\u4e24\u79cd\u5165\u53c2\u65b9\u5f0f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\u3002 remote \u8fdc\u7a0b\u6267\u884c\u65b0\u589e\u4ece\u547d\u4ee4\u884c\u4f20\u5165\u6d4b\u8bd5\u673a\u4fe1\u606f\uff0c\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679c password \u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6 setting/remote.ini \u4e2d CLIENT_PASSWORD \u7684\u503c,\u6bd4\u5982\uff1auos@10.8.13.33:1 \u6216 uos@10.8.13.33 \uff1b python3 manage.py remote -c uos@10.8.13.33/uos@10.8.13.34\npython3 manage.py remote -c uos@10.8.13.33:1/uos@10.8.13.34:2\n fix \u65e5\u5fd7\u6a21\u5757\u4fee\u6539\u4e3a\u51fd\u6570\u6267\u884c\u4e4b\u524d\u6253\u5370\u65e5\u5fd7\uff1b \u65e5\u5fd7\u6a21\u5757\u589e\u52a0\u767d\u540d\u5355\uff0c\u901a\u8fc7\u7c7b\u540d\u5f00\u5934\uff0c\u7ed3\u675f\uff0c\u5305\u542b\u7b49\u5173\u952e\u5b57\u63a7\u5236\u9700\u8981\u6253\u5370\u7684\u51fd\u6570\u65e5\u5fd7\uff1b \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5982\u679c\u4f20\u5165\u4e86 app_name \u53ea\u4f1a\u5c06 apps \u76ee\u5f55\u4e0b app_name \u7684\u76ee\u5f55\u53d1\u9001\u5230\u6d4b\u8bd5\u673a\uff1b env.sh \u79fb\u9664 python3-dev\uff1b \u4fee\u590d Wayland \u4e0b env.sh \u73af\u5883\u5b89\u88c5\u5931\u8d25\u7684\u95ee\u9898\uff0c\u4f18\u5316\u4e86 deb \u4f9d\u8d56\u5b89\u88c5\u7684\u903b\u8f91\uff1b \u5c06 env.sh \u5237\u65b0\u6e90\u7684\u65e5\u5fd7\u5728\u7ec8\u7aef\u663e\u793a\uff0c\u89e3\u51b3\u5728 CI \u73af\u5883\u4e0b\uff0c\u957f\u65f6\u95f4\u4e0d\u8f93\u51fa\u65e5\u5fd7\u8fde\u63a5\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d1060 \u534e\u4e3a\u673a\u578b\u5b89\u88c5\u952e\u9f20\u5de5\u5177\u65f6\u4f9d\u8d56\u4e0d\u517c\u5bb9\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1242023227","title":"1.2.4\uff082023/2/27\uff09","text":"fix \u4fee\u6539 CURRENT \u6587\u4ef6\uff1b "},{"location":"RELEASE/#1232023227","title":"1.2.3\uff082023/2/27\uff09","text":"new pylint.sh \u652f\u6301\u901a\u8fc7\u4f4d\u7f6e\u53c2\u6570\u4f20\u5165\u6587\u4ef6\u8def\u5f84\uff1abash pylint.sh apps/autotest_deepin_music,\u597d\u5904\u662f\u53c2\u6570\u8def\u5f84\u53ef\u4ee5\u5728\u7ec8\u7aef\u8865\u5168\uff1b \u65b0\u589e\u7cfb\u7edf\u547d\u4ee4 youqu-pylint \uff0c\u7528\u4e8e\u9759\u6001\u4ee3\u7801\u626b\u63cf\uff0c\u4f7f\u7528\u65b9\u6cd5: youqu-pylint apps/autotest_deepin_music\uff1b \u7531\u4e8e\u7cfb\u7edf\u4e00\u4e9b dbus \u63a5\u53e3\u6539\u53d8\uff0c\u516c\u5171\u5e93\u4e2d\u7684 dbus \u65b9\u6cd5\u5c06\u4e0d\u518d\u7ef4\u62a4\uff0c\u7531\u5b50\u9879\u76ee\u5728 other_widget.py \u91cc\u9762\u8fdb\u884c\u7ef4\u62a4\uff1b fix \u4fee\u590d ssh \u73af\u5883\u4e0b\u8fd0\u884c\u63d0\u793a \u201c\u65e0\u6cd5\u8fde\u63a5\u201d \u7684\u95ee\u9898\uff1b \u4fee\u590d\u8fd0\u884c\u65f6\u7a0b\u5e8f\u9000\u51fa\uff0c\u4e0d\u8f93\u51fa\u5f02\u5e38\u65e5\u5fd7\u7684\u95ee\u9898\uff1b \u4fee\u590dyouqu remote xxx \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5728\u670d\u52a1\u7aef Ctrl + C \u65e0\u6cd5\u505c\u6b62\u7a0b\u5e8f\u8fd0\u884c\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#122202328","title":"1.2.2\uff082023/2/8\uff09","text":"new \u65b0\u589e\u6c14\u6ce1\u7c7b\u56fe\u50cf\u8bc6\u522b\u65b9\u6848\uff1bimage_utils.py::ImageUtil::get_during\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u533a\u57df\u8bc6\u522b\uff0c\u4f20\u5165 [x, y, w, h]\uff0cx: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u76ee\u6807\u56fe\u7247\uff0c\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\uff1b env.sh \u79fb\u9664 pypinyin; \u4f18\u5316\u6267\u884c env.sh \u65f6\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b manage.py \u79fb\u9664\u4e86\u53c2\u6570 session_timeout \uff0c\u6846\u67b6\u6839\u636e\u5168\u5c40\u7684 timeout \u4ee5\u53ca\u7528\u4f8b\u81ea\u5b9a\u4e49\u7684 timeout \u81ea\u52a8\u8ba1\u7b97\u51fa sessiontimeout \u7684\u503c\uff1b \u65b0\u589e ocr \u670d\u52a1\u5668\u94fe\u63a5\u91cd\u8bd5\uff0c\u9ed8\u8ba4\u91cd\u8bd51\u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u53c2\u6570\uff1b fix \u4fee\u590d\u4e86\u4e00\u4e9b pylint \u626b\u63cf\u7684\u4ee3\u7801\u98ce\u683c\u95ee\u9898\uff1b \u91cd\u65b0\u8bbe\u8ba1\u4e86\u6d4b\u8bd5\u62a5\u544a\u4e3b\u9898\uff1b "},{"location":"RELEASE/#121202316","title":"1.2.1\uff082023/1/6\uff09","text":"new \u652f\u6301\u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6267\u884c\u7528\u4f8b\uff1b\u53ef\u5c06python3 manage.py \u66ff\u6362\u4e3a youqu \uff1a youqu run -a deepin-music -k 001\n RPC \u670d\u52a1 IP \u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u6307\u5b9a\u4e0d\u540c\u7684\u7aef\u53e3\uff1b \u5728\u7ebf\u6587\u6863\u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u539f\u6765\u7684\u5730\u5740 10.8.10.215 \u5c06\u4e0d\u5728\u4f7f\u7528\uff1b fix \u4fee\u590d --count \u53c2\u6570\u53ef\u80fd\u51fa\u73b0\u4e0e\u5176\u4ed6\u6846\u67b6\u7684\u5de5\u7a0b\u4f9d\u8d56\u5b58\u5728\u51b2\u7a81\uff0c\u62a5\u9519\u91cd\u590d\u6ce8\u518c\u7684\u95ee\u9898\uff1b \u4fee\u590d CI \u73af\u5883\u4e0b\u591a\u4e2a\u5de5\u7a0b\u5b58\u5728 Python \u73af\u5883\u53d8\u91cf\u6307\u5411\u9519\u8bef\uff0c\u5bfc\u5305\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u5355\u72ec\u8fd0\u884c\u65b9\u6cd5\u65f6\u65e0\u65e5\u5fd7\u8f93\u51fa\u7684 Bug\uff1b "},{"location":"RELEASE/#12020221230","title":"1.2.0\uff082022/12/30\uff09","text":"1.1.4 \u7248\u672c\u9002\u914d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e14\u65b0\u589e\u4e86\u8f83\u591a\u65b0\u7279\u6027\uff0c\u6211\u4eec\u8ba1\u5212\u4f7f\u7528 1.1.4 \u7248\u672c\u8fd0\u884c\u4e00\u6bb5\u65f6\u95f4\uff0c1.2.0 \u7248\u672c\u5c06\u4fee\u590d\u671f\u95f4\u51fa\u73b0\u7684 Bug\uff0c\u7136\u540e\u4f5c\u4e3a\u7a33\u5b9a\u7248\u672c\u53d1\u5e03\u3002 new \u4fee\u6539\u5de5\u7a0b\u540d\u79f0\u4e3a youqu\uff1b \u5c06 sphinx \u6587\u6863\u5de5\u7a0b\u8fc1\u79fb\u5230\u5355\u72ec\u7684\u4ed3\u5e93\uff1b fix \u4fee\u590d startapp \u521b\u5efa\u5de5\u7a0b\u65f6\u5b58\u5728\u5de5\u7a0b\u540d\u79f0\u65f6\u65e0\u6cd5\u7ee7\u7eed\u521b\u5efa\uff1b \u4fee\u590d\u4e86 OCR \u670d\u52a1\u5728\u5e76\u53d1\u65f6\u53ef\u80fd\u51fa\u73b0\u65e0\u6cd5\u8fd4\u56de\u7ed3\u679c\u7684\u95ee\u9898\uff0c\u63d0\u5347 OCR \u670d\u52a1\u9ad8\u5e76\u53d1\u7a33\u5b9a\u6027\uff1b \u4fee\u590d PMS \u540c\u6b65\u6807\u7b7e\u5230 CSV \u6587\u4ef6\u4e0d\u652f\u6301\u7528\u4f8b\u5e93\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11420221214","title":"1.1.4\uff082022/12/14\uff09","text":"new \u65b0\u589e startapp \u5b50\u547d\u4ee4\u521b\u5efa\u5b50\u9879\u76ee\u5de5\u7a0b\u6a21\u677f: python3 manage.py startapp autotest_deepin_xxx \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u91cd\u590d\u6267\u884c\u6b21\u6570\uff1b \u53bb\u6389\u6279\u91cf\u6267\u884c\u524d\u6536\u96c6\u7528\u4f8b\u7684\u6b65\u9aa4\uff1b \u589e\u52a0\u5f00\u59cb\u6267\u884c\u65f6\u6253\u5370\u4e00\u4e9b\u6267\u884c\u53c2\u6570\uff0c\u5982\uff1a \u7528\u4f8b\u6536\u96c6\u6570\u91cf: 99\n\u5931\u8d25\u91cd\u8dd1\u6b21\u6570: 1\n\u6700\u5927\u5931\u8d25\u6b21\u6570: 49\n\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4: 200.0s (03\u520620\u79d2)\n\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4: 11880s (3\u5c0f\u65f618\u52060\u79d2)\n \u5b9a\u5236\u4fee\u6539allure\u62a5\u544alogo\u3001title\u3001\u9ed8\u8ba4\u8bed\u8a00\uff1b manage.py \u6267\u884c\u5f00\u59cb\u65f6\u6253\u5370 logo \u548c\u5f53\u524d\u7248\u672c\uff1a \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u255a\u2588\u2588\u2557 \u2588\u2588\u2554\u255d \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2584\u2584 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2580\u2580\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u2584\u2588 \u2584\u2588 \u2588 \u2588 \u2588 \u2584 \u2588 \u2584 \u2580\u2580\u2588 \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\uff1b \u88c5\u9970\u5668\u65b9\u6cd5\u6307\u5b9a\u6b21\u6570\uff1b @pytest.mark.count(2)\ndef test_music_001():\npass\n \u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u6b21\u6570\uff1b python3 manage.py run -a deepin-music -k 001 --count 2\n \u200b image_utils \u589e\u52a0\u51fd\u6570 save_temporary_picture\uff0c\u652f\u6301\u6307\u5b9a\u5c4f\u5e55\u533a\u57df\u622a\u56fe\u5e76\u8fd4\u56de\u56fe\u7247\u5b58\u653e\u7684\u672c\u5730\u8def\u5f84\uff0c\u540e\u7eed\u4f7f\u7528 assert_image_exist \u8fdb\u884c\u65ad\u8a00 Python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(x, y, width, height) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) button_center \u65b0\u589e btn_size \u83b7\u53d6\u63a7\u4ef6\u5de6\u4e0a\u89d2\u5750\u6807\u53ca\u957f\u5bbd\uff0c\u7528\u4e8e\u52a8\u6001\u7684\u622a\u53d6\u5143\u7d20\u7684\u56fe\u7247\uff0c\u53ef\u7528\u4e8e\u5b9a\u4f4d\u65ad\u8a00 python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u6240\u6709\u97f3\u4e50\u6309\u94ae\")) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) allure \u62a5\u544a\u4e2d\u5b9a\u4f4d\u95ee\u9898\u9664\u4e86\u65e5\u5fd7\u3001\u622a\u56fe\u3001\u5f55\u5c4f\u5916\uff0c\u8c03\u7528\u7684\u51fd\u6570\u589e\u52a0\u4e86 step \u6b65\u9aa4\u5c55\u793a\uff1b env.sh \u65b0\u589e\u5b89\u88c5\u5b50\u9879\u76ee Python \u4e09\u65b9\u4f9d\u8d56\uff0c\u5728\u5b50\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u5199 requirement.txt \u6587\u4ef6\uff0cenv.sh \u4f1a\u81ea\u52a8\u52a0\u8f7d\uff1b ocr \u8bc6\u522b\u65b0\u589e\u652f\u6301\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\u8fdb\u884c\u6587\u5b57\u8bc6\u522b\uff0c\u51cf\u5c11\u56e0\u5168\u5c4f\u8bc6\u522b\u65f6\uff0c\u5176\u4ed6\u6587\u5b57\u7684\u5e72\u6270 Python # \u65ad\u8a00\u97f3\u4e50\u7684\u5220\u9664\u5f39\u7a97\u4e2d\uff0c\u5305\u542b\u4e86\u201c\u786e\u8ba4\u201d\u7684\u6587\u5b57 self.assert_ocr_exist(\"\u786e\u8ba4\", picture_abspath=DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u5220\u9664\u5f39\u7a97\"))) \u65ad\u8a00\u51fd\u6570\u7684\u8c03\u7528\u4e5f\u4f1a\u81ea\u52a8\u6253\u5370\u65e5\u5fd7; env.sh \u65b0\u589e\u88c1\u526a\u4f9d\u8d56\u7684\u65b9\u6848\uff1b fix \u4fee\u590d Jenkins \u73af\u5883\u4e0b\uff0c apps \u76ee\u5f55\u4e0b\u5b50\u9879\u76ee\u5b58\u5728 auotest_deepin_xxx@tmp \u76ee\u5f55\uff0c\u5728\u4f20\u5165 app_name \u540e\u65e0\u6cd5\u6267\u884c\u7528\u4f8b\u7684\u95ee\u9898\uff1b \u4fee\u590d\u81ea\u52a8\u751f\u6210 case_list.csv \u6587\u4ef6\u65f6\uff0c\u7528\u4f8b\u987a\u5e8f\u88ab\u8c03\u6574\u7684\u95ee\u9898\uff1b env.sh \u73af\u5883\u5b89\u88c5\u79fb\u9664 git \u548c curl\uff1b \u4fee\u590d\u7528\u4f8b\u5728 setup \u9636\u6bb5\u62a5\u9519\u540e\uff0c\u672a\u5199\u5165 ci_result.json \u7684\u95ee\u9898\uff1b \u79fb\u9664 uos_ci.py\uff1b "},{"location":"RELEASE/#11320221028","title":"1.1.3\uff082022/10/28\uff09","text":"new \u65b0\u589e\u56fe\u50cf\u65ad\u8a00\u6210\u529f\u8f93\u51fa\u5339\u914d\u5ea6\uff1b \u65b0\u589e\u73af\u5883\u5b89\u88c5 yaml \u4f9d\u8d56\uff1b \u65b0\u589e\u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6570\u636e\u56de\u586b\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b \u65b0\u589e\u6d4b\u8bd5\u7ed3\u679c\u8868\u60c5\u663e\u793a\uff0c\u5e76\u4f18\u5316\u4e86\u65e5\u5fd7\u7684\u6392\u7248\uff1b \u65b0\u589e --top {number} \u7528\u4e8e\u8bb0\u5f55\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0c\u65e5\u5fd7\u751f\u6210\u5230 report/logs/top.log\uff1b fix \u4fee\u590d\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4f46\u7ec8\u7aef\u6ca1\u6709\u9519\u8bef\u65e5\u5fd7\u8f93\u51fa\u7684\u95ee\u9898\uff1b \u4fee\u6539\u5931\u8d25\u7528\u4f8b\u56de\u6eaf\u65e5\u5fd7\u4e3a\u8be6\u7ec6\u7ea7\u522b\uff1b \u4fee\u590d\u4e86\u6267\u884c\u8fdb\u5ea6\u672a\u8ba1\u7b97\u8df3\u8fc7\u7528\u4f8b\u7684\u95ee\u9898\uff0c\u5e76\u4f18\u5316\u4e86\u8fdb\u5ea6\u83b7\u53d6\u7684\u7b97\u6cd5\uff1b \u4fee\u590d env.sh \u5728 V23 \u73af\u5883\u4e0b\u5b89\u88c5\u65e0\u6cd5\u8bfb\u53d6\u5bc6\u7801\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 pms \u6d4b\u8bd5\u5957\u6267\u884c\u6216\u6d4b\u8bd5\u5355\u6267\u884c\u65f6\uff0c\u7528\u4f8bID\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b env.sh \u91cc\u9762 hub.deepin.com \u66f4\u6362\u6210 it.uniontech.com\uff1b uos_ci.py \u6d4b\u8bd5\u7ed3\u679c\u7edf\u8ba1\u65f6\uff0c\u603b\u6570\u5254\u9664 skip \u7684\u6570\u91cf "},{"location":"RELEASE/#11220220921","title":"1.1.2\uff082022/09/21\uff09","text":"new \u5728\u6ca1\u6709\u5b89\u88c5 dogtail \u7684\u60c5\u51b5\u4e0b\uff0c\u4e5f\u80fd\u4f7f\u7528 sniff \u5de5\u5177\uff1b fix \u4fee\u590d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e2d\u6ca1\u6709\u5b89\u88c5 AT \u73af\u5883\u6267\u884c uos_ci.py \u62a5\u9519\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11120220919","title":"1.1.1\uff082022/09/19\uff09","text":"new \u65b0\u589e\u6267\u884c\u8fdb\u5ea6\u663e\u793a\uff0c\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u65f6\u65e5\u5fd7\u8f93\u51fa\u5f53\u524d\u8fdb\u5ea6\uff1a[\u5f53\u524d\u6307\u5b9a\u7b2c\u51e0\u6761/\u7528\u4f8b\u603b\u6570]\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u7528\u4f8b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\u6240\u6709\u5931\u8d25\u7528\u4f8b\u7684\u5217\u8868\uff1b \u5173\u95ed\u7ec8\u7aef\u8f93\u51fa\u6355\u83b7\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u65e5\u5fd7\u5feb\u7167\uff1b \u4f18\u5316\u7ec8\u7aef\u8f93\u51fa\u5931\u8d25\u4fe1\u606f\u5197\u957f\u4e3a\u7b80\u8981\u4fe1\u606f\u8f93\u51fa\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u663e\u793a 10 \u4e2a\u6267\u884c\u6700\u6162\u7684\u7528\u4f8b\u5217\u8868\uff0c\u5e76\u8be6\u7ec6\u5217\u51fa\u5404\u4e2a\u9636\u6bb5\u7684\u8017\u65f6\uff1b \u5931\u8d25\u91cd\u8dd1\u7528\u4f8b\u91cd\u8dd1\u4e4b\u524d\u5ef6\u8fdf 1 \u79d2\uff1b \u65b0\u589e\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4ecd\u7136\u5f3a\u5236\u6267\u884c\uff1b \u7528\u4f8b\u6536\u96c6\u65f6\u4ec5\u5728 apps \u76ee\u5f55\u4e0b\u8fdb\u884c\uff0c\u5ffd\u7565 src,setting,public \u76ee\u5f55\uff1b \u65b0\u589e allure \u62a5\u544a\u5907\u4efd\u529f\u80fd\uff0c\u9ed8\u8ba4\u5907\u4efd\u81f3 allure_back \u76ee\u5f55\u4e0b\uff1b manage.py\u65b0\u589e\u53c2\u6570 --lastfailed \u7528\u4e8e\u53ea\u8dd1\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\u7684\u529f\u80fd\uff1b fix \u4fee\u590d\u4e86\u5728\u6ca1\u6709\u6307\u5b9a\u5e94\u7528\u540d\u79f0\u6267\u884c\u65f6\uff0cxml \u62a5\u544a\u751f\u6210\u8def\u5f84\u5f02\u5e38\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 uos_ci.py \u4f20\u5165 timeout \u548c session_timeout \u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11020220916","title":"1.1.0\uff082022/09/16\uff09","text":"new \u65b0\u589ePMS\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u652f\u6301\u591a\u79cd\u6570\u636e\u56de\u586b\u6a21\u5f0f\uff1b \u4f18\u5316\u4e86\u901a\u8fc7\u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u65f6PMS \u722c\u866b\u7684\u6027\u80fd\uff1b \u65b0\u589e .gitmodules \u6587\u4ef6\uff0c\u7528\u4e8e\u6807\u8bb0\u6240\u6709\u5b50\u9879\u76ee\uff0c\u65b9\u4fbf\u7edf\u4e00\u62c9\u53d6\u4ee3\u7801\uff1b env.sh \u9002\u914d\u793e\u533a\u7248\u4e0a\u5b89\u88c5\u81ea\u52a8\u5316\u73af\u5883\uff1b \u589e\u52a0\u6267\u884c\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u9519\u8bef\u7684\u529f\u80fd\uff1b README.md \u589e\u52a0 Wayland \u4e0b\u4f7f\u7528\u3001\u6d4b\u8bd5\u62a5\u544a\u67e5\u770b\u3001\u5e38\u89c1\u95ee\u9898\u7b49\u7684\u6587\u6863\u8bf4\u660e\uff1b \u589e\u52a0\u4e86\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u5bf9 setup\u3001call\u3001teardown \u8fdb\u884c\u65e5\u5fd7\u5206\u6bb5\uff1b fix \u4fee\u590d\u4e86 \u786e\u8ba4\u4fee\u590d \u5217\u6ca1\u5199\u8868\u5934\uff0c\u4f46\u5199\u4e86 fixed-xxx \u6807\u7b7e\uff0c\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u540c\u4e00\u5e94\u7528\u5185\u591a\u4e2a csv \u6587\u4ef6\u4e2d \u786e\u8ba4\u4fee\u590d \u5217\u6709\u7684\u5199\u4e86\uff0c\u6709\u7684\u6ca1\u5199\uff0c\u53ef\u80fd\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 INFO \u65e5\u5fd7\uff0c\u663e\u793a\u4e3a DEBUG \u7684\u95ee\u9898\uff1b\u4fee\u590d\u4e86\u90e8\u5206\u673a\u5668\u4e0a INFO \u65e5\u5fd7\u5185\u5bb9\u663e\u793a\u4e3a\u7ea2\u8272\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\u770b\u4e0d\u5230\u8be6\u7ec6\u4fe1\u606f\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10220220822","title":"1.0.2\uff082022/08/22\uff09","text":"new \u79fb\u9664 loguru\uff0c\u66ff\u6362\u4e3a logging\uff0c\u63a5\u53e3\u4fdd\u6301\u4e0d\u53d8\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u53d7\u5f71\u54cd\uff1b \u9ed8\u8ba4\u5f00\u542f coredump\uff1b fix \u4fee\u590d\u4e86\u4e09\u65b9\u5e93 loguru \u5076\u73b0\u5f02\u5e38\uff0c\u5bfc\u81f4\u7a0b\u5e8f\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7b2c\u4e00\u6b21\u5931\u8d25\u4e0d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10120220812","title":"1.0.1\uff082022/08/12\uff09","text":"new \u65b0\u589e RELEASE.md \u6587\u4ef6\uff0c\u7528\u4e8e\u8bb0\u5f55\u5386\u53f2\u53d1\u5e03\u7248\u672c\u7684\u66f4\u65b0\u5185\u5bb9\uff1b \u517c\u5bb9 Wayland \u6a21\u5f0f\u4e0b\u6267\u884c\u7528\u4f8b\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u7528\u7ba1\u5f53\u524d\u6d4b\u8bd5\u673a\u6267\u884c\u73af\u5883\uff0c\u6846\u67b6\u4f1a\u81ea\u52a8\u6839\u636e\u5f53\u524d\u73af\u5883\u8d70\u4e0d\u540c\u7684\u4ee3\u7801\u903b\u8f91\uff1b \u7531\u4e8e\u9700\u8981\u4fee\u6539 dogtail \u6e90\u4ee3\u7801\uff0c\u56e0\u6b64\u5c06\u4fee\u6539\u540e\u7684\u6e90\u7801\u653e\u5165\u5230\u6838\u5fc3\u5e93\u91cc\u9762 src/depends/dogtail \u540e\u7eed\u7248\u672c\u5c06\u4e0d\u9700\u8981\u5728\u7cfb\u7edf\u4e2d\u5b89\u88c5dogtail\uff1b \u5982\u679c\u5e94\u7528\u5e93\u540c\u6837\u4f7f\u7528\u4e86\u7cfb\u7edf\u5b89\u88c5\u7684 dogtail \u53ef\u80fd\u4f1a\u62a5\u9519\uff0c\u89e3\u51b3\u65b9\u6848\u662f\u5c06\u4ee3\u7801\u4e2d\u7684 import dogtail \u4fee\u6539\u4e3a from src.depends import dogtail ; fix \u91cd\u8dd1\u5931\u8d25\u4e4b\u540e\u624d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff0c\u4fee\u6539\u4e3a\u5931\u8d25\u4e4b\u540e\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":"# Attribution \uff1achengdu Test Team\n# Date \uff1a2021/08/20\n \u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d \u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d \u4ed3\u5e93\u5730\u5740\uff1ahttps://gitlabcd.uniontech.com/autotest/cd-desktop-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u65b9\u6848\u6982\u8ff0","text":"\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u667a\u80fd\u8bc6\u522b\u5e94\u7528\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u7528\u4e8e\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u64cd\u4f5c\u8fc7\u7a0b\u4e2d\u7684\u5143\u7d20\u5b9a\u4f4d\u4ee5\u53ca\u5224\u65ad\u7ed3\u679c\u65f6\u7684\u65ad\u8a00\u5904\u7406\uff1b\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\uff0c\u6d4b\u8bd5\u673a\u4e0a\u7684\u753b\u9762\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u5230\u670d\u52a1\u5668\u4e0a\uff0c\u670d\u52a1\u5668\u5bf9\u89c6\u9891\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\u540e\uff0c\u670d\u52a1\u5668\u667a\u80fd\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\u6210\u529f\uff0c\u7136\u540e\u5bf9\u6d4b\u8bd5\u673a\u4e0b\u53d1\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\uff0c\u6d4b\u8bd5\u673a\u63a5\u53d7\u5e76\u6267\u884c\u4e0b\u4e00\u6b65\u64cd\u4f5c\u3002 \u670d\u52a1\u5668\u4e0e\u6d4b\u8bd5\u673a\u4e4b\u95f4\u7684\u94fe\u63a5\uff1a \u670d\u52a1\u5668\u901a\u8fc7 USB \u4e32\u53e3\u8bbe\u5907\uff08USB-HID \u534f\u8bae\uff09\u6a21\u62df\u9f20\u6807\u952e\u76d8\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u64cd\u4f5c\u3002 \u901a\u8fc7\u89c6\u9891\u91c7\u96c6\u8bbe\u5907\u6355\u83b7\u6d4b\u8bd5\u673a\u7684\u5b9e\u65f6\u753b\u9762\u4f20\u8f93\u7ed9\u670d\u52a1\u5668\u3002 \u670d\u52a1\u5668\u5bf9\u91c7\u96c6\u7684\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\uff0c\u8bc6\u522b\u5176\u4e2d\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5e76\u8fd4\u56de\u5143\u7d20\u63a7\u4ef6\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\uff0c\u670d\u52a1\u5668\u901a\u8fc7\u667a\u80fd\u5316\u5206\u6790\uff0c\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e00\u81f4\u5c06\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\u901a\u8fc7\u4e32\u53e3\u6a21\u62df\u952e\u9f20\u4fe1\u53f7\u53d1\u9001\u7ed9\u6d4b\u8bd5\u673a\uff1b\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e0d\u4e00\u81f4\u5c06\u4f1a\u8fdb\u5165\u4e2d\u65ad\u5904\u7406\u53ca\u5f02\u5e38\u7ed3\u679c\u8f93\u51fa\uff0c\u7ee7\u7eed\u6267\u884c\u540e\u7eed\u573a\u666f\uff0c\u76f4\u81f3\u6240\u6709\u7528\u4f8b\u6d4b\u8bd5\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u6df1\u5ea6\u5b66\u4e60\u73af\u5883\u642d\u5efa","text":"\u6a21\u578b\u8bad\u7ec3\u4e3b\u8981\u5bf9 GPU \u6709\u8981\u6c42\uff0c\u8bad\u7ec3\u6a21\u578b\u7684\u673a\u5668\u663e\u5b58\u4e0d\u4f4e\u4e8e 6G\uff0c\u5176\u4ed6\u914d\u7f6e\u65e0\u7279\u6b8a\u8981\u6c42\u3002 \u63a8\u8350\u6027\u4ef7\u6bd4\u8f83\u9ad8\u914d\u7f6e \u64cd\u4f5c\u7cfb\u7edf: UnionTech OS Desktop 20 Professional Linux version 4.19.0-desktop-amd64 (deepin@deepin-PC) (Uos 8.3.0.3-3+rebuild) \u5904\u7406\u5668: Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz (\u516b\u6838 / \u5341\u516d\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460M-HDV(RD)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))/8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: TU116 [GeForce GTX 1660]\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u865a\u62df\u73af\u5883\u5b89\u88c5","text":"cd ~\nwget -c https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh\nbash Miniconda3-latest-Linux-x86_64.sh\n \u4e00\u8def\u56de\u8f66 \u7b2c\u4e00\u6b21\u63d0\u793a\u8f93\u5165 yes/no \uff1a\u8f93\u5165 yes \u7ee7\u7eed\u4e00\u8def\u56de\u8f66 \u7b2c\u4e8c\u6b21\u63d0\u793a\uff1a\u8f93\u5165 no cd ~/miniconda3/bin\nsudo chmod 777 activate\n \u6fc0\u6d3bconda\u73af\u5883 . ./activate\n \u6dfb\u52a0\u516c\u53f8\u5185\u7f51\u6e90 conda config --add channels bioconda\nconda config --add channels conda-forge\n \u5982\u679c\u662f\u5916\u7f51\u6dfb\u52a0\u5916\u7f51\u6e90 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/\n \u5982\u679c\u8981\u5220\u9664\u6e90 conda config --remove-key channels\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"2\u3001\u5b89\u88c5\u4f9d\u8d56","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u521b\u5efa\u865a\u62df\u73af\u5883","text":"conda remove --name mmlab --all # \u79fb\u9664\u6240\u6709\u865a\u62df\u73af\u5883\n conda create -n mmlab python=3.7\n conda activate mmlab\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-pytorch","title":"\uff082\uff09\u5b89\u88c5 Pytorch","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install torch==1.7.0+cu101 torchvision==0.8.1+cu101 torchaudio==0.7.0 -f https://download.pytorch.org/whl/torch_stable.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-mmcv","title":"\uff083\uff09\u5b89\u88c5 MMCV","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install mmcv-full==1.3.3 -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.7.0/index.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"\uff084\uff09\u5b89\u88c5\u663e\u5361\u9a71\u52a8","text":"\u6839\u636e\u4f60\u7684\u663e\u5361\u4e0b\u8f7d\u5bf9\u5e94\u9a71\u52a8\uff0c\u6bd4\u5982\u6211\u7684\u663e\u5361\u4e3a GTX1660\uff0c\u9a71\u52a8\u7248\u672c\u4e3a 430\uff0c\u9a71\u52a8\u4e0b\u8f7d\u5730\u5740\uff1ahttps://www.nvidia.cn/Download/Find.aspx?lang=cn CTRL+ALT+F2 \u8fdb\u5165tty\n \u7981\u7528 nouveau \u9a71\u52a8 sudo vim /etc/modprobe.d/blacklist-nouveau.conf\n \u586b\u5165\uff1a blacklist nouveau options nouveau modeset=0\n \u5237\u65b0\u914d\u7f6e\u6587\u4ef6 sudo update-initramfs -u reboot \u91cd\u542f\u540e\u518d\u8fdb\u5165 tty \u5173\u95ed\u56fe\u50cf\u754c\u9762\uff0c\u8f93\u5165\u547d\u4ee4\u5173\u95ed\u56fe\u50cf\u754c\u9762 sudo service lightdm stop\n \u5b89\u88c5\u9a71\u52a8 sudo chmod a+x NVIDIA-Linux-x86_64-430.run\nsudo ./NVIDIA-Linux-x86_64-430.run\n reboot\u91cd\u542f\uff0cnvidia-smi\u67e5\u770b\u5b89\u88c5\u72b6\u6001\u3002\u6ce8\u610f\u770b\u4e0bcuda\u7248\u672c\uff0c10.1\uff0cdriver\u7248\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u6570\u636e\u6807\u6ce8","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u6570\u636e\u6807\u6ce8","text":"\u6807\u6ce8\u4e4b\u524d\u9700\u8981\u5148\u8f6c\u6362\u56fe\u7247\u5927\u5c0f\uff0c\u5e76\u4e14\u4ee5\u6570\u5b57\u547d\u540d\uff0c\u6bcf\u7ec4\u547d\u540d\u9012\u589e"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"\uff081\uff09\u8f6c\u6362\u5927\u5c0f\u5e76\u91cd\u547d\u540d","text":"rename_pic.py import os\nimport sys\nimport cv2\nimport time\nimport getpass\nusername = getpass.getuser()\nsource_path = f\"/home/{username}/Desktop/right_menu\" # \u56fe\u7247\u8def\u5f84\nsource_dest = os.path.join('/'.join(source_path.split(\"/\")[:-1]), 'tmp')\nif not os.path.exists(source_dest):\nos.mkdir(source_dest)\nstart_name = sys.argv[1]\nfile_name_list = list()\nfor file in os.listdir(source_path):\nif file.endswith('.png'):\nfile_name_list.append(file)\nstart_name = int(start_name)\nfor file in file_name_list:\nos.rename(os.path.join(source_path,file), os.path.join(source_path, f\"{str(start_name)}.png\"))\nstart_name += 1\ntime.sleep(1)\nfor file in os.listdir(source_path):\nimage = os.path.join(source_path, str(file))\nsrc = cv2.imread(image)\nresult = cv2.resize(src, (960, 540))\nresizeImage = os.path.join(source_dest, str(file))\nprint(resizeImage)\ncv2.imwrite(str(resizeImage), result)\ncv2.waitKey(0)\ncv2.destroyAllWindows()\ntime.sleep(1)\nos.system(f'rm -rf {source_path}/*')\nos.system(f'mv {source_dest}/* {source_path}')\nos.system(f'rm -rf {source_dest}')\nprint(\"\u4e0b\u4e00\u4e2a\u5e8f\u53f7\uff1a\", start_name)\n \u6839\u636e\u7ec8\u7aef\u8f93\u51fa\u7684\u4e0b\u4e00\u4e2a\u5e8f\u53f7\u7684\u63d0\u793a\uff0c\u6267\u884c Python \u6587\u4ef6\u7684\u65f6\u5019\u4f20\u53c2\u3002 python rename_pic.py 249\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"\uff082\uff09\u5de5\u5177\u6807\u6ce8","text":"\u4f7f\u7528\u5de5\u5177 labelImg \u6807\u6ce8 sudo pip3 install PyQt5==5.13\nsudo pip3 install labelImg\n \u7ec8\u7aef\u76f4\u63a5\u8f93\u5165 labelImg\uff0c\u56de\u8f66 \u6807\u6ce8\u6a21\u5f0f\u9009\u62e9\uff1aPascalVOC"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u667a\u80fd\u6807\u6ce8","text":"\u6253\u5f00\u5c4f\u5e55\u5f55\u5236\u8f6f\u4ef6\uff0c\u5f55\u5236\u624b\u52a8\u64cd\u4f5c\u4e00\u6b21\u6d4b\u8bd5\u7528\u4f8b\uff0c\u7136\u540e\u5c06\u5f55\u5236\u7684\u89c6\u9891\u8fdb\u884c\u5206\u5e27\uff0c\u7136\u540e\u5bf9\u6bd4\u524d\u4e24\u5e27\u56fe\u6807\u76f8\u4f3c\u5ea6\uff0c\u5254\u9664\u76f8\u4f3c\u5ea6\u8fc7\u9ad8\u7684\u56fe\u7247\uff0c\u5728\u4fdd\u8bc1\u7d20\u6750\u591a\u6837\u6027\u7684\u524d\u63d0\u4e0b\uff0c\u5254\u9664\u91cd\u590d\u591a\u4f59\u7684\u56fe\u7247\u751f\u6210\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u96c6\uff0c\u7136\u540e\u53d6\u51fa\u63a7\u4ef6\u6a21\u677f\u6570\u636e\u96c6\uff0c\u901a\u8fc7 OpenCV \u6a21\u677f\u5339\u914d\u83b7\u53d6\u63a7\u4ef6\u5728\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u56fe\u7247\u4e2d\u6240\u5728\u7684\u5de6\u4e0a\u3001\u5de6\u4e0b\u3001\u53f3\u4e0a\u3001\u53f3\u4e0b\u56db\u5904\u5750\u6807\uff0c\u4ece\u800c\u6839\u636e\u6a21\u677f\u6570\u636e\u96c6\u751f\u6210\u6807\u6ce8\u6570\u636e\u3002\u53c2\u8003\u76ee\u5f55 AnnotationMaterial"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"\uff081\uff09\u6a21\u677f\u6570\u636e\u96c6\u51c6\u5907","text":"1\u3001\u5728\u754c\u9762\u622a\u53d6\u9700\u8981\u6807\u6ce8\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u653e\u5728\u76ee\u5f55\u4e0b AnnotationMaterial/template/img 2\u3001\u7ef4\u62a4\u63a7\u4ef6\u540d\u4e0e\u5143\u7d20\u63a7\u4ef6\u7684\u952e\u5bf9\uff0c\u4e00\u4e2a\u63a7\u4ef6\u540d\u53ef\u5bf9\u5e94\u591a\u4e2a\u5143\u7d20\u63a7\u4ef6 menu:\n- menu.jpg\n- menu1.jpg\n- menu2.jpg\n- menu3.jpg\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"\uff082\uff09\u7d20\u6750\u96c6\u51c6\u5907","text":"\u5f55\u5236\u89c6\u9891\u6216\u6216\u5c4f\u5e55\u622a\u56fe\u653e\u7f6e\u76ee\u5f55 AnnotationMaterial/source"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u5f00\u59cb\u6807\u6ce8","text":"python3 AnnotationMaterial/main.py\n \u751f\u6210\u7684\u6807\u6ce8\u6570\u636e\u5b58\u653e\u5728 AnnotationMaterial/result"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#mmdetection","title":"\u56db\u3001MMDetection","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1-mmdetection","title":"1\u3001 MMDetection \u4ee3\u7801","text":"MMDetection \u662f\u4e00\u4e2a\u6709\u540d\u7684\u6df1\u5ea6\u5b66\u4e60\u76ee\u6807\u68c0\u6d4b\u5f00\u6e90\u9879\u76ee\uff0c\u4e5f\u662f openMMlab \u7684\u62db\u724c\u9879\u76ee\uff0c\u4e3a\u4ec0\u4e48\u9009\u62e9\u5b83\uff0c\u5c0f\u5b69\u513f\u6ca1\u5a18\u8bf4\u6765\u8bdd\u957f\uff0c\u611f\u5174\u8da3\u53ef\u4ee5\u81ea\u884c\u6df1\u5165\u4e86\u89e3\uff1b \u4f60\u53ef\u4ee5\u76f4\u63a5\u5728 GitHub \u4e0a\u514b\u9686\u4ee3\u7801\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u54b1\u4eec\u4ed3\u5e93\u4e0b Train \u76ee\u5f55\u4e2d\u4ee3\u7801\uff0cTrain \u4e2d\u7684\u4ee3\u7801\u4e5f\u662f\u4ece GitHub \u4e0a\u62c9\u53d6\u7684\uff0c\u4e0d\u8fc7\u6211\u4eec\u6839\u636e\u9879\u76ee\u9700\u8981\u505a\u4e86\u4e00\u4e9b\u4e8c\u6b21\u5f00\u53d1\uff0c\u63a8\u8350\u76f4\u63a5\u4f7f\u7528\u5b83\u3002 \u5982\u679c\u4f60\u60f3\u4ece GitHub \u4e0a\u62c9\uff1a git clone https://github.com/open-mmlab/mmdetection.git\n# \u4e0d\u80fd\u76f4\u63a5\u62c9\u53d6\u4e3b\u5206\u652f\uff0c\u5efa\u8bae\u4f7f\u75282.12\u7248\u672c\uff0c\u4e0d\u540c\u7684\u7248\u672c\u5bf9\u5e94\u7684mmcv\u7248\u672c\u662f\u4e0d\u540c\u7684\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-voc2coco","title":"2\u3001\u62c9\u53d6 voc2coco \u4ee3\u7801","text":"git clone https://github.com/Tony607/voc2coco.git\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-coco","title":"3\u3001\u8f6c\u6362 coco \u6570\u636e\u96c6","text":"\u5c06\u6240\u6709\u7684\u56fe\u7247\u548cxml\u6587\u4ef6\u653e\u5165train2017\uff0c\u4ece\u4e2d\u6311\u9009\u51e0\u7ec4\u653e\u5165val2017\uff08\u6d4b\u8bd5\u96c6\uff09 cd mmdetection/data/coco\npython voc2coco.py train2017 annotations/instances_train2017.json\npython voc2coco.py val2017 annotations/instances_val2017.json\n \u751f\u6210json\u6587\u4ef6"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4_1","title":"4\u3001\u4fee\u6539\u914d\u7f6e","text":"\uff081\uff09\u8bfb\u53d6\u6a21\u578b\u540d\u79f0 import json\nmodule_name = []\nwith open('./instances_train2017.json', \"r+\") as f:\njson_file = f.read()\njson_dict = json.loads(json_file)\nmodule_list = json_dict.get('categories')\nfor module_info in module_list:\nname = module_info.get('name')\nmodule_name.append(name)\nprint(module_name)\nprint(\"module_num:\", len(module_name))\n # \u6ce8\u610f\u5bf9\u6bd4instances_train2017.json\u91cc\u9762\u6a21\u578b\u540d\u79f0\u7684\u987a\u5e8f\uff0c\u4e0eCLASSES\u548ccoco_classes\u91cc\u9762\u7684\u987a\u5e8f\u4fdd\u6301\u4e00\u81f4\u3002\n \uff082\uff09\u4fee\u6539 faster_rcnn_r101_2x_coco.py mmdetection/xianjin/faster_rcnn_r101_2x_coco.py \u4fee\u653946\u884c\uff0cnum_clasess\u7684\u503c\uff0c\u65b0\u589e1\u4e2a\uff0c\u5c31 +1\uff1b \uff083\uff09\u4fee\u6539 coco.py mmdetection/mmdet/datasets/coco.py CLASSES = ()\uff0c\u5728\u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b \uff084\uff09\u4fee\u6539 class_names.py mmdetection/mmdet/core/evaluation/class_names.py coco_classes \u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#5","title":"5\u3001\u7f13\u5b58\u6e05\u7406","text":"\u5220\u9664 mmdetection/build \u76ee\u5f55 python setup.py install\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#6","title":"6\u3001\u8bad\u7ec3\u6a21\u578b","text":"\uff081\uff09\u6307\u5b9a\u81ea\u5df1\u914d\u7f6e\u7684\u8bad\u7ec3\u6a21\u578b\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py --gpus 1\n \uff082\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u6d4b\u8bd5\u96c6\u7ed3\u679c\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py xianjin/epoch_24.pth --show\n \uff083\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u51c6\u786e\u5ea6\uff1b python tools/analysis_tools/analyze_logs.py plot_curve xianjin/20210530_011907.log.json --keys acc\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#7","title":"7\u3001\u5feb\u6377\u64cd\u4f5c","text":"python3 run.py\n \u5c06\u4ee5\u4e0a 4 - 7 \u6b65\u64cd\u4f5c\u6574\u5408\u6210 run.py\uff0c\u4e00\u952e\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u4e94\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\uff1b \u670d\u52a1\u7aef\u4e00\u53f0\uff08\u76ee\u524d\u4ec5\u652f\u6301AMD\u67b6\u6784\uff09\uff1b \u91c7\u96c6\u76d2\u4e00\u4e2a \uff08ACASIS hdmi\u89c6\u9891\u91c7\u96c6\u5361\uff0chttps://item.jd.com/10024310742602.html \uff09\uff1b USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\uff1b USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff1b \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5USB\u5ef6\u957f\u7ebf\uff1b \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u63a8\u8350\u914d\u7f6e","text":"\u6267\u884c\u7528\u4f8b\u7684\u670d\u52a1\u7aef\u5bf9\u914d\u7f6e\u6ca1\u6709\u7279\u6b8a\u8981\u6c42\uff0c\u5982\u679c\u6761\u4ef6\u5141\u8bb8\u914d\u7f6e\u8d8a\u9ad8\uff0c\u8bc6\u522b\u901f\u5ea6\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n \u6d4b\u8bd5\u673a\u4e0a\u4e0d\u6267\u884c\u4efb\u4f55\u811a\u672c\uff0c\u5177\u4f53\u914d\u7f6e\u6839\u636e\u6d4b\u8bd5\u9700\u8981\u51b3\u5b9a\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#usb_mk","title":"\u516d\u3001USB_MK\u4e32\u53e3\u9a71\u52a8\u65b9\u6cd5","text":"\u4f4d\u4e8econtrol_method\u76ee\u5f55\u4e0b\u7684usb_mk.py\u6587\u4ef6 \uff081\uff09\u5217\u51fa\u53ef\u901a\u4fe1\u7684\u7aef\u53e3 python3 -m serial.tools.list_ports -v\n \uff082\uff09\u4fee\u6539\u4e32\u53e3\u7684\u6743\u9650 sudo chmod 777 /dev/ttyACM0\n \uff083\uff09\u5b9e\u4f8b\u5316USB_MK import UsbMk\nusb_mk = UsbMk(\"/dev/ttyACM0\", 9600) # \u8bbe\u5907\u9ed8\u8ba49600\u4e3a\u6ce2\u7279\u7387\uff0c\u63a7\u5236\u4f20\u8f93\u901f\u7387\n \uff084\uff09USB\u4e32\u53e3\u8bbe\u5907\u9ed8\u8ba4\u6ce2\u7279\u7387\u4e3a9600\uff08\u7ecf\u6d4b\u8bd5\u6ce2\u7279\u73879600\u51c6\u786e\u6027\u6700\u597d\uff09\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up() # \u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u6c49\u5b57\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e\n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff083\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff084\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff085\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() # \u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2\n \uff086\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff087\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff088\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e03\u3001\u65b9\u6cd5\u8c03\u7528\u5165\u53c2\u89c4\u5219","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_7","title":"1\u3001\u57fa\u7c7b","text":"class Base:\ndef __init__(self):\nself._obj = image\nself._usb = usb_mk\ndef find_element_by_ai(self, element):\nreturn self._obj.find_element(element)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_6","title":"2\u3001\u5165\u53c2\u8bf4\u660e","text":"\u56fe\u50cf\u8bc6\u522b\u65b9\u6cd5\u5165\u53e3\u4e3a Base \u7c7b\u4e0b\u7684 find_element_by_ai \u3002\u4ec5\u63a5\u53d7\u4e00\u4e2a\u53c2\u6570 element\uff0c\u7c7b\u578b\u4e3a string\u3002 \u53ef\u8bc6\u522b\u7684 string \u683c\u5f0f\uff1a \uff081\uff09\u5927\u56fe\u6807\uff08 \u56fe\u6807\u5927\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\uff0c\u4f8b\uff1a Base().find_element_by_ai(\"window\")\n \uff082\uff09\u5927\u56fe\u6807 / \u5c0f\u56fe\u6807\uff08\u56fe\u6807\u5c0f\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5c0f\u56fe\u6807\uff0c\u4f8b\uff1awindow/search_btn Base().find_element_by_ai(\"window/search_btn\")\n \uff083\uff09\u5927\u56fe\u6807 / OCR\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\u5185\u7684\u6587\u5b57\uff0c\u4f8b\uff1amenu/\u5c5e\u6027 Base().find_element_by_ai(\"menu/\u5c5e\u6027\")\n \uff084\uff09OCR\uff1a\u5168\u5c4f\u8bc6\u522b\u6587\u5b57 Base().find_element_by_ai(\"\u641c\u7d22\")\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516b\u3001\u9690\u85cf\u9f20\u6807","text":"\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u8fc7\u6765\u7684\u89c6\u9891\u6d41\uff0c\u5728\u8bc6\u522b\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u53d7\u5230\u9f20\u6807\u5f71\u54cd\uff0c\u56e0\u6b64\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u9690\u85cf\u9f20\u6807\u3002 \u5c4f\u853d\u9f20\u6807\u5149\u6807\u663e\u793a ```shell script /etc/lightdm/lightdm.conf \u5728`[Seat:*]`\u4e0b\u9762\u6dfb\u52a0\u53c2\u6570\n```shell script\nxserver-command=X -bs -core -nocursor\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e5d\u3001\u667a\u80fd\u81ea\u52a8\u5316\u7684\u610f\u4e49","text":"1\u3001\u6539\u5584 Acessibility \u5b9a\u4f4d\u7684\u7a33\u5b9a\u6027\u95ee\u9898 Acessibility \u5c5e\u6027\u5b9a\u4f4d\u5b58\u5728\u5076\u5c14\u5931\u6548\u7684\u60c5\u51b5 \uff081\uff09\u5f00\u53d1\u5728\u505a\u65b0\u9700\u6c42\u5f00\u53d1\u65f6\u53ef\u80fd\u6d89\u53ca\u5230\u5bf9\u5c5e\u6027\u6807\u7b7e\u7684\u4fee\u6539\u6216\u8005\u5c42\u7ea7\u7684\u8c03\u6574\uff0c\u53ef\u80fd\u9020\u6210\u81ea\u52a8\u5316\u7528\u4f8b\u65e0\u6cd5\u5b9a\u4f4d\u5230\u5143\u7d20\u3002 \u6bd4\u59821040\u9636\u6bb5\uff0c\u97f3\u4e50\u91cd\u6784\u7684\u65f6\u5019\uff0c\u5f00\u53d1\u5bf9\u90e8\u5206\u5c5e\u6027\u548c\u5c42\u7ea7\u505a\u4e86\u4fee\u6539\uff0c\u5bfc\u81f4\u81ea\u52a8\u5316\u7528\u4f8b\u5b9a\u4f4d\u65b9\u6cd580%\u9700\u8981\u4fee\u6539\u3002 \u5f00\u53d1\u65b0\u529f\u80fd\u7684\u65f6\u5019\u5076\u5c14\u4e5f\u4f1a\u5bf9\u5c5e\u6027\u505a\u8c03\u6574\uff0c\u9047\u52305\u6b21\u3002 \uff082\uff09\u76ee\u524d\u4e3b\u8981\u4f7f\u7528Dogtail\u8bc6\u522b\u5e94\u7528Acessibility\u5c5e\u6027\u8fdb\u884c\u5b9a\u4f4d\uff0c\u662f\u83b7\u53d6\u5e94\u7528\u5f53\u524d\u754c\u9762\u7684\u5c5e\u6027tree\uff0c\u5728\u5e94\u7528\u8df3\u8f6c\u540e\uff0cDogtail\u5b58\u5728\u65e0\u6cd5\u53ca\u65f6\u83b7\u53d6\u5f53\u524d\u5c5e\u6027\u5217\u8868\u7684\u60c5\u51b5\u3002 \u591a\u5a92\u4f53\u8c03\u7528\u6587\u7ba1\u7a97\u53e3\u7684\u65f6\u5019\uff0c\u51fa\u73b0\u627e\u4e0d\u5230\u6587\u7ba1\u91cc\u9762\u5143\u7d20\u7684\u60c5\u51b5\uff0c\u76ee\u524d\u51fa\u73b010+\u6b21\u3002 \u5e94\u7528\u8bbe\u7f6e\u9875\u9762\u7684\u5c5e\u6027\u5076\u5c14\u5b58\u5728\u627e\u4e0d\u5230\u7684\u60c5\u51b5\uff0c\u9047\u52305\u6b21\u3002 \uff083\uff09Dogtail\u5de5\u5177\u672c\u8eab\u5b58\u5728\u95ee\u9898\uff0c\u6709\u65f6\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u5019\u5f88\u6162\uff0c\u8ba9\u4eba\u65e0\u6cd5\u63a5\u53d7\uff0c\u76ee\u524d\u51fa\u73b0\u8fc7\u5f88\u591a\u6b21\u3002 \u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u95f4\u6bd4\u5e73\u5e38\u61623\u500d\uff0c\u51fa\u73b04\u6b21\u3002 2\u3001\u89e3\u51b3\u4e86\u4f7f\u7528\u7edd\u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898 \u90e8\u5206\u63a7\u4ef6\u65e0\u6cd5\u6dfb\u52a0 Acessibility \u5c5e\u6027\u4ece\u800c\u4f7f\u7528\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u51fa\u73b0\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898\u3002 \uff081\uff09\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u65b9\u6cd5\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u76ee\u6807\u56fe\u7247\u8d44\u6e90\uff0c\u5728 UI \u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u4f1a\u6d89\u53ca\u5230\u76ee\u6807\u8d44\u6e90\u7684\u66ff\u6362\uff0c\u6bd4\u8f83\u8017\u8d39\u4eba\u529b\u3002 \uff082\uff09\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6cd5\u5bf9\u6bd4\u7cbe\u5ea6\u6bd4\u8f83\u641e\uff0c\u5982\u679cUI \u7684\u53d8\u66f4\u4f1a\u9020\u6210\u65e0\u6cd5\u51c6\u786e\u5b9a\u4f4d\u5230\uff0c\u81ea\u52a8\u5316\u811a\u672c\u5065\u58ee\u6027\u4e0d\u8db3\u3002 3\u3001\u4f7f\u7528\u673a\u5668\u5206\u79bb\uff0c\u89e3\u51b3\u4e86\u81ea\u52a8\u5316\u811a\u672c\u5bf9\u5e94\u7528\u7684\u5f71\u54cd\uff0c\u771f\u5b9e\u8fd8\u539f\u7528\u6237\u7684\u4f7f\u7528\u573a\u666f \u673a\u5668\u5206\u79bb\u7684\u67b6\u6784\u8bbe\u8ba1\uff0c\u4fdd\u8bc1\u4e86\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u73af\u5883\u5b8c\u5168\u7b49\u540c\u4e8e\u7528\u6237\uff0c\u6392\u9664\u6d4b\u8bd5\u811a\u672c\u7684\u5f71\u54cd\u3002 \uff081\uff09\u76ee\u524d\u7684\u529f\u80fd\u81ea\u52a8\u5316\u662f\u5728\u6d4b\u8bd5\u673a\u4e0a\u76f4\u63a5\u8fd0\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\uff0c\u52a0\u4e0a\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u6211\u4eec\u6dfb\u52a0\u4e86\u4e00\u4e9b\u8fdb\u7a0b\u76d1\u63a7\u3001\u89c6\u9891\u5f55\u5236\u7b49\u529f\u80fd\uff0c\u81ea\u52a8\u5316\u811a\u672c\u672c\u8eab\u4f1a\u6d88\u8017\u4e00\u4e9b\u7cfb\u7edf\u8d44\u6e90\uff0c\u65e0\u6cd5\u8fd8\u539f\u771f\u662f\u7684\u7528\u6237\u4f7f\u7528\u573a\u666f\u3002 \uff082\uff09\u6027\u80fd\u6d4b\u8bd5\u9700\u8981\u6392\u9664\u5176\u4ed6\u7a0b\u5e8f\u7684\u8d44\u6e90\u6d88\u8017\u5f71\u54cd\uff0c\u6027\u80fd\u81ea\u52a8\u5316\u91c7\u7528\u673a\u5668\u5206\u79bb\uff0c\u4fdd\u8bc1\u4e86\u6027\u80fd\u6570\u636e\u7684\u51c6\u786e\u6027\u3002 \u4ee5\u524d\u7684\u7528\u4f8b\u6267\u884c\u8017\u65f6\u6ca1\u6761\u572830\u79d2\u5de6\u53f3\uff0c\u73b0\u5728\u7528\u4f8b\u8017\u65f6\u572810\u79d2\u3002 4\u3001\u89e3\u51b3\u4e86UI \u8c03\u6574\u5bfc\u81f4\u5b9a\u4f4d\u5931\u8d25\u7684\u4e0d\u7a33\u5b9a\u6027\u95ee\u9898 \uff081\uff09\u89e3\u51b3\u4e86\u56e0 UI \u8c03\u6574\u5bfc\u81f4\u63a7\u4ef6\u4f4d\u7f6e\u53d8\u5316\u6216\u8272\u5dee\u53d8\u5316\u540e\u5b9a\u4f4d\u4e0d\u51c6\u786e\u7684\u95ee\u9898\uff0c\u53ea\u8981\u63a7\u4ef6\u6587\u6848\u548c\u63a7\u4ef6\u5916\u8fb9\u6846\u65e0\u53d8\u5316\u5747\u53ef\u51c6\u786e\u5b9a\u4f4d\uff1b \uff082\uff09\u76ee\u524d\u4e5f\u4f1a\u91c7\u7528\u57fa\u4e8eUI\u7684\u5b9a\u4f4d\u65b9\u6848\uff0c\u5982\u679cUI\u4f4d\u7f6e\u6709\u8c03\u6574\uff0c\u4f1a\u5bfc\u81f4\u5143\u7d20\u65e0\u6cd5\u5b9a\u4f4d\u3002 5\u3001\u7b80\u5316\u4e86\u7528\u4f8b\u7ed3\u6784\uff0c\u63d0\u5347\u7f16\u5199\u53cb\u597d\u5ea6 \uff081\uff09\u667a\u80fd\u81ea\u52a8\u5316\u8bc6\u522b\u5143\u7d20\u7684\u65b9\u6cd5\u53ea\u6709\u4e00\u4e2a\uff0c\u5c31\u662f\u57fa\u4e8e\u6211\u4eec\u8bad\u7ec3\u7684\u6a21\u578b\u8bc6\u522b\u89c6\u9891\u6d41\u4e2d\u7684\u5143\u7d20\uff0c\u7ecf\u8fc7\u811a\u672c\u5c01\u88c5\u4e4b\u540e\uff0c\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u4e2d\u6240\u6709\u5b9a\u4f4d\u7684\u64cd\u4f5c\u90fd\u53ea\u9700\u8981\u8c03\u7528\u8fd9\u4e00\u4e2a\u65b9\u6cd5\u5c31\u884c\u4e86\uff0c\u7f16\u5199\u81ea\u52a8\u5316\u811a\u672c\u7684\u96be\u5ea6\u5927\u5927\u964d\u4f4e\u3002 \uff082\uff09\u4e5f\u662f\u7531\u4e8e\u8c03\u7528\u65b9\u6cd5\u7b80\u5355\uff0c\u5728 UI \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u4e2d\u7684\u5206\u5c42\u7ed3\u6784\u5c06\u4f1a\u51cf\u5c11\uff0c\u591a\u7ee7\u627f\u7684\u60c5\u51b5\u4f1a\u51cf\u5c11\uff0c\u81ea\u52a8\u5316\u4ee3\u7801\u7684\u8c03\u7528\u7ed3\u6784\u4e5f\u4f1a\u53d8\u5f97\u7b80\u5355\uff0c\u800c\u4e14\u529f\u80fd\u6d4b\u8bd5\u540c\u5b66\u7f16\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u66f4\u52a0\u5bb9\u6613\u4e0a\u624b\u3002 \u4ee5\u524d\u5199\u7528\u4f8b\u7531\u4e8e\u9700\u8981\u7ed3\u5408\u4e0d\u540c\u7684\u6a21\u5757\uff0c\u8c03\u7528\u4e0d\u540c\u7684\u65b9\u6cd5\uff0c\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u5e76\u5b8c\u6210\u8c03\u8bd5\u7684\u65f6\u95f4\u5e73\u5747\u572820-30\u5206\u949f\uff0c\u73b0\u5728\u5199\u7528\u4f8b\u811a\u672c\u80fd\u57285\u5206\u949f\u5de6\u53f3\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":"# =============================================\n# Attribution : Application Test Department III\n# Time : 2023/1/3\n# Author : ut003281\n# =============================================\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u7b80\u8ff0","text":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5 \u901a\u8fc7\u81ea\u52a8\u5316\u624b\u6bb5\u5bf9\u5e94\u7528\u8fdb\u884c\u6027\u80fd\u6d4b\u8bd5\uff0c\u63d0\u4f9b\u65b9\u4fbf\u7684\u73af\u5883\u90e8\u7f72\u3001\u8fd0\u884c\u914d\u7f6e\u3001\u7528\u4f8b\u7f16\u5199\u7b49\uff0c\u7528\u4e8e\u684c\u9762\u5e94\u7528\u7684\u51b7\u70ed\u542f\u52a8\u3001\u8d44\u6e90\u62f7\u8d1d\u3001\u9875\u9762\u8df3\u8f6c\u7b49\u6027\u80fd\u573a\u666f\u6d4b\u8bd5\u3002 \u4ed3\u5e93\u5730\u5740\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-perf-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u4ee3\u7801\u7ed3\u6784","text":"autotest-perf-aitest\n\u251c\u2500\u2500 apps # \u5b58\u653e\u6240\u6709\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u811a\u672c\n\u251c\u2500\u2500 conftest.py # pytest hook\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 CURRENT # \u7248\u672c\u5185\u5bb9\n\u251c\u2500\u2500 docs # \u6587\u6863\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u952e\u503c\u5bf9\u7167\u8868.pdf # \u4e32\u53e3\u7ebfcode\u4e0e\u6309\u952e\u7684\u5bf9\u7167\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u6027\u80fd\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\u6267\u884c\u5668\u4f7f\u7528\u6307\u5357.md # \u6267\u884c\u5668\u811a\u672c\u4f7f\u7528\u6307\u5357\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 USB\u4e32\u53e3\u8f6cUSB\u952e\u76d8\u9f20\u6807\u7ebf\u534f\u8bae\u6587\u4ef6V1.0.pdf # \u4e32\u53e3\u534f\u8bae\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput-0.28.2.zip # Linux\u4e0b\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\u7684\u6e90\u7801\uff0c\u53ef\u6839\u636e\u67b6\u6784\u6253\u5305\n\u251c\u2500\u2500 manage.py # \u529f\u80fd\u4e3b\u5165\u53e3\n\u251c\u2500\u2500 pytest.ini # pytst \u914d\u7f6e\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 setting # \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 client.ini # \u6d4b\u8bd5\u673a IP \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5168\u5c40\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dev_env.sh # \u5bbf\u4e3b\u673a\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose_no_relay.yml # \u65e0\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose.yml # \u6709\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker_login.sh # docker \u767b\u9646\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 res\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 black.png # \u5168\u9ed1\u56fe\u7247\uff0c\u7528\u4e8e\u4fee\u6539\u58c1\u7eb8\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_5000.deb # 3A5000 \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_amd64.deb # amd \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_arm64.deb # arm \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_mips64.deb # mips \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_sw_64.deb # sw \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 server.ini # \u670d\u52a1\u5668\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 setup.sh # \u5bb9\u5668\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 template # \u521b\u5efa app \u57fa\u7840\u811a\u672c\u6a21\u677f\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 app_template\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ${app_name}_widget.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 control-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 images\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 test_${app_name}_01_scene.json-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 test_${app_name}_01_scene.py-tpl\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 uos_docker # \u5bb9\u5668\u73af\u5883\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dockerfile\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 requirements.txt\n\u2514\u2500\u2500 src\n \u251c\u2500\u2500 analysis_save.py # \u89e3\u6790\u56fe\u7247\u6d41\u7ed3\u679c\uff0c\u6c47\u603b\u751f\u6210 excel \u62a5\u544a\n\u251c\u2500\u2500 base_widget.py # \u5c01\u88c5\u7684\u57fa\u7840\u64cd\u4f5c\uff0c\u5e94\u7528\u8c03\u7528\u7684\u4e3b\u5165\u53e3\u65b9\u6cd5\n\u251c\u2500\u2500 cmdctl.py # \u8c03\u7528\u547d\u4ee4\u884c\u4f7f\u7528\n\u251c\u2500\u2500 global_value.py # \u5168\u5c40\u53d8\u91cf\n\u251c\u2500\u2500 image_utils.py # \u56fe\u7247\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 __init__.py\n \u251c\u2500\u2500 logger_utils.py # \u65e5\u5fd7\u914d\u7f6e\n\u251c\u2500\u2500 pdocr.py # ocr \u914d\u7f6e\n\u251c\u2500\u2500 public_method.py # \u4e00\u4e9b\u65b9\u4fbf\u7684\u5c01\u4f4f\n\u251c\u2500\u2500 record.py # \u5f55\u5c4f\u76f8\u5173\n\u251c\u2500\u2500 rtk # \u8fd0\u884c\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 _base.py # \u4e00\u4e9b\u679a\u4e3e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 install_env.py # \u5b89\u88c5\u73af\u5883\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 local_runner.py # \u8fd0\u884c\u7528\u4f8b\n\u251c\u2500\u2500 serial_communication # \u4e32\u53e3\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 power_control.py # \u7ee7\u7535\u5668\u64cd\u4f5c\uff0c\u4f7f\u7528\u7ee7\u7535\u5668\u8fde\u63a5\u4e3b\u673a\u7535\u6e90\uff0c\u63a7\u5236\u5f00\u5173\u673a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 serial_common.py # \u4e32\u53e3\u516c\u5171\u65b9\u6cd5\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 usb_mk.py # \u952e\u9f20\u64cd\u4f5c\u57fa\u7840\u5c01\u88c5\n\u251c\u2500\u2500 shortcut_key.py # \u5feb\u6377\u952e\u7684\u5c01\u88c5\n\u251c\u2500\u2500 singleton.py # \u5355\u4f8b\u6a21\u5f0f\n\u251c\u2500\u2500 start_app.py # \u521b\u5efa app\n\u2514\u2500\u2500 write_xlsx.py # \u751f\u6210 excel\n# __init__.py \u6587\u4ef6\u4e3a\u6807\u8bc6\u8be5\u76ee\u5f55\u662f\u4e00\u4e2aPython\u7684\u6a21\u5757\u5305\uff0c\u9879\u76ee\u4e2d\u7684__init__.py\u5747\u4e3a\u7a7a\u6587\u4ef6\u3002\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u73af\u5883\u642d\u5efa","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\u3002 \u670d\u52a1\u7aef\u4e00\u53f0\u3002\uff08\u4ec5\u652f\u6301 AMD \u67b6\u6784\uff0c\u82e5\u9700\u5176\u4ed6\u67b6\u6784\uff0c\u54a8\u8be2\u76f8\u5173\u5f00\u53d1\u4eba\u5458\uff09 \u91c7\u96c6\u76d2\u4e00\u4e2a\u3002 \uff08ACASIS HDMI \u89c6\u9891\u91c7\u96c6\u76d2\uff0chttps://item.jd.com/100013302599.html#crumb-wrap \uff09 USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\u3002\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"\uff082\uff09\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\u3002 USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff08USB3.0 \u63a5\u53e3\u4e0a\uff09\u3002 \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5 USB \u5ef6\u957f\u7ebf\u3002 \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u670d\u52a1\u7aef\u63a8\u8350\u914d\u7f6e","text":"\u914d\u7f6e\u8d8a\u9ad8\uff0c\u89e3\u6790\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"2\u3001\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa","text":" \u6253\u5f00\u63a7\u5236\u4e2d\u5fc3\uff0c\u8d26\u6237\u8bbe\u7f6e\u4e3a\u3010\u81ea\u52a8\u767b\u5f55\u3011\u548c\u3010\u65e0\u5bc6\u7801\u767b\u5f55\u3011\uff0c\u7535\u6e90\u7ba1\u7406\u4e2d\u4f7f\u7528\u7535\u6e90\u5168\u90e8\u8bbe\u7f6e\u4e3a\u3010\u4ece\u4e0d\u3011\uff0c\u5f00\u542f\u5f00\u53d1\u8005\u6a21\u5f0f\u3002 \u6839\u636e\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u8981\u6c42\uff0c\u5bfc\u5165\u76f8\u5173\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\uff1a\u5bfc\u5165\u76f8\u518c\u3001\u5f71\u9662\u3001\u97f3\u4e50\u7684\u6d4b\u8bd5\u8d44\u6e90\u3002 \u5728\u670d\u52a1\u7aef\u6253\u5f00\u76f8\u673a\u5e94\u7528\u540e\uff0c\u5c06\u6d4b\u8bd5\u673a\u684c\u9762\u58c1\u7eb8\u66f4\u6362\u4e3a\u7eaf\u8272\u58c1\u7eb8\uff08\u6ce8\u610f\uff0c\u670d\u52a1\u7aef\u9700\u63d0\u524d\u5f00\u542f\u76f8\u673a\u540e\u518d\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u58c1\u7eb8\uff0c\u5efa\u8bae\u7eaf\u9ed1\u58c1\u7eb8 setting/res/black.png\uff09 \u5728\u6587\u4ef6\u7ba1\u7406\u5668\u4e2d\uff0c\u5c06\u9009\u9879 \u4e3b\u83dc\u5355-\u8bbe\u7f6e-\u9884\u89c8-\u56fe\u7247\u9884\u89c8 \u53d6\u6d88\u52fe\u9009\uff08\u5982\u4e0d\u53d6\u6d88\uff0c\u4f1a\u5f71\u54cd\u622a\u56fe\u5f55\u5c4f\u5e94\u7528\u7684\u6027\u80fd\u6570\u636e\uff09 \u79fb\u52a8\u6216\u5220\u9664\u7cfb\u7edf Logo \uff0c\u6392\u9664\u684c\u9762\u53f3\u4e0b\u89d2 Logo \u7684\u5f71\u54cd\uff08\u91cd\u542f\u751f\u6548\uff09\u3002 sudo mv /usr/share/deepin/uos_logo.svg ~/Pictures/\n \u5b89\u88c5\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\uff08\u5fc5\u987b\u5b89\u88c5\uff01\uff01\uff09 AMD \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_amd64.deb ARM \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_arm64.deb MIPS \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_mips64.deb 3A5000 \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_5000.deb \u5b89\u88c5\u547d\u4ee4 sudo dkpg -i xserver-xorg-input-libinput_0.28.2-2_amd64.deb\n \u5b89\u88c5\u65f6\u4f1a\u63d0\u793a\u5df2\u5b58\u5728\u76f8\u540c\u7248\u672c\uff0c\u8bf7\u5ffd\u7565\uff0c\u76f4\u63a5\u8986\u76d6\u5b89\u88c5\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u4e3b\u673a\u624d\u751f\u6548"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u670d\u52a1\u7aef\u4e00\u952e\u73af\u5883\u90e8\u7f72","text":"\u73af\u5883\u642d\u5efa\u524d\u5fc5\u987b\u5148\u8fde\u63a5\u4e0a USB \u4e32\u53e3\u7ebf\u548c\u91c7\u96c6\u76d2\u3002 \u5bbf\u4e3b\u673a\u73af\u5883\u5b89\u88c5 python3 manage.py install --env host\n \u5bb9\u5668\u73af\u5883\u5b89\u88c5 python3 manage.py install --env docker\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u56db\u3001\u914d\u7f6e\u9879","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u670d\u52a1\u7aef\u914d\u7f6e","text":"setting/config/server.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u914d\u7f6e\u9879\uff0c\u5305\u542b\u4e86\u6240\u6709\u670d\u52a1\u7aef\u6240\u6709\u7684\u53ef\u914d\u7f6e\u9879\u3002 \u672c\u5730\u65e0\u7f51\u7edc\u8fd0\u884c \u5c06\u914d\u7f6e\u9879 network=0 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u672c\u5730\u6709\u7f51\u7edc\u8fd0\u884c \u914d\u7f6e\u9879 network=1 (1)\u914d\u7f6e\u9879 client_alias= \u914d\u7f6e\u4e3a\u4f60\u8981\u6d4b\u8bd5\u7684\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5982 Alias1 \u6d4b\u8bd5\u673a\u522b\u540d\u5728 setting/config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 (2)\u914d\u7f6e\u9879 client_alias= \u4e3a\u7a7a\uff0c\u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager --client_alias Alias1\uff0c\u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002(Alias1 \u4e3a\u4f60\u914d\u7f6e\u7684\u6d4b\u8bd5\u673a\u522b\u540d) (1)\u548c(2)\u53ea\u8981\u4f7f\u7528\u5176\u4e00\u5373\u53ef\u3002 \u6709\u7f51\u7edc\u8fd0\u884c\uff0c\u4e14\u9700\u8981\u901a\u8fc7 Jenkins \u4e0a\u8fd0\u884c\u4e00\u4e2a job \uff0c\u540c\u65f6\u63a7\u5236\u591a\u53f0\u673a\u5668\u3002 \u914d\u7f6e\u9879 network=1 \u914d\u7f6e\u9879 client_alias= \u4e0d\u7528\u914d\u7f6e\uff0c\u5728\u8fd0\u884c run.sh \u7684\u65f6\u5019\u76f4\u63a5\u7a7a\u683c\u52a0\u522b\u540d\u5373\u53ef\uff0c\u6bd4\u5982\uff1a\u6d4b\u8bd5\u673a\u522b\u540d\u4e3a Alias1 \uff0c\u4e14\u5df2\u7ecf\u5728 config/client.ini \u4e2d\u914d\u7f6e\u4e86 Alias1 \u7684user ip password \uff0c\u5219\u8fd0\u884c bash run.sh Alias1 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u5728 Jenkins pipeline \u91cc\u9762\u901a\u8fc7\u5e76\u884c stage \u6216\u5e76\u884c\u8c03\u7528\u4e0b\u5c42\u4efb\u52a1\u7684\u65b9\u5f0f\u53ef\u4ee5\u5b9e\u73b0\u5927\u89c4\u6a21\u7684\u6027\u80fd\u6d4b\u8bd5\u9700\u6c42\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;1\u3001KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2\u3001KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f, e.g. TAGS = L1 or smoke\n[case_conf]\n# \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\uff0cocr\u6587\u6848\u8bc6\u522b\u8f83\u6162\uff0c\u4e0d\u63a8\u8350\u4f7f\u7528\nfind_by = stage\n# \u6700\u540e\u4e00\u4e2a\u7a33\u5b9a\u9636\u6bb5\u7684\u5e27\u6570\u8bc6\u522b\n# \u9996\u5e27\u5b58\u5728\u540e\u7684\u7b2c\u4e00\u4e2a\u5927\u4e8e\u8be5\u914d\u7f6e\u5e27\u6570\u7684\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u5c3e\u5e27\nfinal_stable_num=100\n# \u4ece\u8be5\u5e27\u6570\u5f00\u59cb\u8bc6\u522b\u6587\u6848\u6216\u56fe\u7247\uff0c\u51cf\u5c11\u5206\u6790\u65f6\u95f4\nstart_num = 150\n# \u8bc6\u522b\u7684\u6587\u6848\ntext=\n# \u8bc6\u522b\u56fe\u7247\nmatch=apps/xxx/images/match.png\n# \u8bc6\u522b\u76f8\u4f3c\u5ea6\nmatch_rate=0.9\n# \u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6bd4\u5982\u70ed\u542f\u52a8\u7528\u4f8b\uff0c\u4ece\u70b9\u51fb\u6253\u5f00\u5230\u505c\u6b62\u5f55\u5c4f\uff0c\u4e2d\u95f4\u7b49\u5f855\u79d2\uff1b\nduration = 15\n# \u5355\u6761\u7528\u4f8b\u6267\u884c\u7684\u6b21\u6570\ncount = 5\n# \u7a33\u5b9a\u9636\u6bb5\u5212\u5206\u7684\u76f8\u4f3c\u5ea6\nstable_similarity = 0.9997\n[server]\n# \u8c03\u8bd5\u6a21\u5f0f=1\uff0c\u4e3a\u5f00\u542f\u8c03\u8bd5\u6a21\u5f0f\uff0c0\u4e3a\u5173\u95ed\u3002\n# \u8c03\u8bd5\u6a21\u5f0f\u4e0b\u9ed8\u8ba4\u53ea\u6267\u884c\u4e00\u6b21\u7528\u4f8b\uff0c\u4e0d\u5173\u673a\n# \u7f16\u5199\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u5efa\u8bae\u5f00\u542fmaintain\u3002\nMAINTAIN = 0\n# \u8fd0\u884c\u7684\u73af\u5883docker\u5bb9\u5668\u73af\u5883\uff0chost\u5bbf\u4e3b\u673a\u73af\u5883\nENV = docker\n# \u670d\u52a1\u7aef\u5bc6\u7801\nPASSWORD=1\n# \u6307\u5b9a\u6d4b\u8bd5\u673a\u522b\u540d\n# \u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6bd4\u5982\uff1a\n# [AMD]\n# ip=10.8.15.86\n# user=uos\n# \u5176\u4e2d AMD \u4e3a\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5219client_alias=AMD\nCLIENT_ALIAS = x86\uff08Intel-i7\uff09\n# 1 \u5f00\u542f\u7f51\u7edc, 0 \u5173\u95ed\u7f51\u7edc\n# \uff081\uff09\u670d\u52a1\u7aef\u4e0e\u6d4b\u8bd5\u673a\u987b\u5728\u540c\u4e00\u7f51\u6bb5\u4e0b\uff0c\u4f60\u53ef\u4ee5\u5c1d\u8bd5\u5728\u670d\u52a1\u7aef\u901a\u8fc7ssh\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c\u5982\u679c\u53ef\u4ee5\u8fde\u63a5\uff0c\u8bf4\u660e\u7f51\u7edc\u6b63\u5e38\u3002\n# \uff082\uff09\u5f53input_type=FILE_NAME \u65f6\uff0c\u5fc5\u987b\u5f00\u542f\u7f51\u7edc\u3002\nNETWORK = 1\n# \u6027\u80fd\u7ed3\u679c\u7edf\u8ba1\u5355\u4f4d \u6beb\u79d2\u2014ms, \u79d2\u2014s\nUNIT=ms\n# \u6d4b\u8bd5\u673a\u5f00\u673a\u8fdb\u5165\u684c\u9762\u540e\u7b49\u5f85\u65f6\u95f4,\u5355\u4f4d/\u79d2\nSTARTUP_DELAY = 60\n# 1\u4e3a\u5220\u9664\u7f13\u5b58\uff0c0\u4e3a\u4e0d\u5220\u9664\u7f13\u5b58\n# \u7528\u4f8b\u6267\u884c\u5b8c\u540e\u4f1a\u5728report\u76ee\u5f55\u4e0b\u751f\u6210\u667a\u80fd\u89e3\u6790\u7684\u4e00\u4e9b\u7f13\u5b58\u56fe\u7247\u3002\nCACHE = 0\n# \u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u62a5\u544a\u4f1a\u4fdd\u5b58\u5728\u9879\u76ee\u4e0breport\u76ee\u5f55\u4e2d\uff1b\n# \u6307\u5b9a\u62a5\u544a\u76ee\u5f55\u5219\u5b58\u653e\u5230\u6307\u5b9a\u76ee\u5f55\u3002\nREPORT_PATH = report\n# \u670d\u52a1\u7aef\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684icon\u8d44\u6e90\u4f1a\u7f13\u5b58\u5728\u9879\u76ee\u4e0binput\u76ee\u5f55\u4e2d\nINPUT = input/\n# 1\u4e3a\u6d4b\u8bd5\u5b8c\u5173\u673a\uff0c0\u4e3a\u6d4b\u8bd5\u5b8c\u4e0d\u5173\u673a\nSHUTDOWN = 0\n# \u89e3\u6790\u8fdb\u7a0b\u6570\uff08\u4e0d\u63a8\u8350\u4fee\u6539\uff09\n# 3\u4e2a\u8fdb\u7a0b\u89e3\u6790\u89c6\u9891\u5df2\u7ecf\u80fd\u591f\u6ee1\u8db3\uff0c\u5373\u4f7f\u589e\u52a0\u8fdb\u7a0b\u6570\u4e5f\u4e0d\u80fd\u51cf\u5c11\u6574\u4f53\u8017\u65f6\n# \u53e6\u5916\u8fd8\u8981\u770bCPU\u6838\u6570\u662f\u5426\u652f\u6301\u3002\nPARSING_PROCESS = 3\n# 1\u4e3a\u4f7f\u7528\u7ee7\u7535\u5668\u5f00\u5173\u673a\uff0c0\u4e3a\u4f7f\u7528reboot\u547d\u4ee4\u91cd\u542f\u3002\u4f9d\u8d56\u7ee7\u7535\u5668\u786c\u4ef6\u8bbe\u5907\uff0c\u9700\u8981\u4f7f\u7528\u8054\u7cfb\u5f00\u53d1\u8005\nRELAY = 0\n# \u83b7\u53d6\u6d4b\u8bd5\u5e94\u7528\u7684\u7248\u672c, %s \u5360\u4f4d\u5e94\u7528\u540d\n# \u5982\u679c\u8be5\u914d\u7f6e\u4e3a\u7a7a\uff0c\u5219\u4e0d\u83b7\u53d6\u5e94\u7528\u7684\u7248\u672c\u4fe1\u606f\u3002\nCOMMAND = apt policy %s 2>/dev/null|grep \"\u5df2\u5b89\u88c5\"|awk -F \"\uff1a\" \"{print \\$2}\"\n# \u5173\u673a\u7b49\u5f85\u5f00\u542f\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6839\u636e\u6d4b\u8bd5\u673a\u6027\u80fd\u4e0d\u540c\uff0c\u5f00\u5173\u673a\u8017\u65f6\u53ef\u80fd\u4e0d\u540c\uff0c\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u673a\u60c5\u51b5\u914d\u7f6e\u3002\nSHUTDOWN_DELAY = 30\n# \u53ef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u56fe\u7247\u683c\u5f0f\uff0c\u4ee5\u82f1\u6587\u9017\u53f7\u9694\u5f00\u3002\n# \u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u76ee\u524d\u6211\u4eec\u4ec5\u9a8c\u8bc1\u4e86jpg,jpeg,png\u8fd9\u4e09\u79cd\u5e38\u7528\u7684\u56fe\u7247\u683c\u5f0f\u3002\nINPUT_TYPES = jpg,jpeg,png\n# \u6027\u80fd\u5206\u6790\u8865\u5e27\uff0c\u7b49\u4e8e\u6216\u4f4e\u4e8e\u8be5\u503c\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u9700\u8981\u51cf\u6389\u3002\nUN_STAB_START = 3\n# \u670d\u52a1\u7aef\u83b7\u53d6\u6d4b\u8bd5\u673a\u56fe\u50cf\u7684\u5e27\u7387\uff0c\u5373\u6bcf\u79d2\u83b7\u53d6\u591a\u5c11\u5f20\u6d4b\u8bd5\u673a\u4e0a\u7684\u56fe\u50cf\u3002\n# \u9ed8\u8ba4\u5e27\u7387\u4e3a30\u5e27/\u79d2\uff0c\u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u53ef\u80fd\u4f1a\u5bf9\u89e3\u6790\u7ed3\u679c\u9020\u6210\u504f\u5dee\u3002\nFPS = 30\n# \u4ee5\u4e0b\u573a\u666f\u7c7b\u578b\u4f1a\u91cd\u542f\u6d4b\u8bd5\u673a,\u591a\u79cd\u573a\u666f\u4f7f\u7528\u9017\u53f7\u9694\u5f00\nSCENE = cold\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = http://10.8.13.78:8890\n#\u5c4f\u5e55\u56fe\u7247\u4e34\u65f6\u5b58\u653e\u4f4d\u7f6e\nSCREEN_CACHE = /tmp/screen\n# =======================================\n[log]\n# \u65e5\u5fd7\u7ea7\u522b\uff0cOFF\u3001FATAL\u3001ERROR\u3001WARN\u3001INFO\u3001DEBUG\u3001ALL\n# \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u65e5\u5fd7\u8f93\u51fa\uff0clog_cli=INFO\u8868\u793a \u4ec5\u8f93\u51faINFO\u53ca\u4ee5\u4e0a\u7ea7\u522b\u7684\u65e5\u5fd7\u3002\nLOG_LEVEL = DEBUG\n# \u65e5\u5fd7\u6587\u4ef6\u4fdd\u5b58\u8def\u5f84\nLOG_PATH= logs\n# =======================================\n[dockerhub]\n# \u5bb9\u5668\u767b\u9646\u8d26\u53f7\nDOCKER_USER = user\n# \u5bb9\u5668\u767b\u9646\u5bc6\u7801\nDOCKER_PASSWORD = User1234\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u6d4b\u8bd5\u673a\u914d\u7f6e","text":"setting/config/client.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u4fe1\u606f\u3002 \u6709\u7f51\u7edc\u7684\u60c5\u51b5\u4e0b\uff0c\u670d\u52a1\u7aef\u9700\u8981\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u56e0\u6b64\u4f60\u9700\u8981\u5199\u5165 \u6d4b\u8bd5\u673a\u522b\u540d \u3001 user \u3001ip\u3001 password \u3002 # \u6d4b\u8bd5\u673a\u522b\u540d\n[Alias1] # \u6d4b\u8bd5\u673aip\nip=10.8.15.86 # \u6d4b\u8bd5\u673a\u7528\u6237\u540d\nuser=uos\n \u547d\u540d\u5efa\u8bae\uff1aAliasA1\u3001AliasA2\u3001AliasB1\u3001AliasB2\uff0c\u4e0d\u8981\u91cd\u540d\u3002 \u65e0\u7f51\u7edc\u60c5\u51b5\u4e0b\uff0c\u4ec5\u9700\u8981\u5173\u6ce8\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\u9879 width=\u3001 height= \u5373\u53ef\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a [client]\n# \u9ed8\u8ba4\u6d4b\u8bd5\u673a\u7528\u6237\u540d\uff0c\u5bc6\u7801\uff0cip\nip=\nuser=\n# \u6d4b\u8bd5\u673a\u5bc6\u7801\npassword=1\n# \u6d4b\u8bd5\u673a\u4e3b\u9898\ntheme=bloom\n# \u6d4b\u8bd5\u673aicon\u76ee\u5f55\npath=/usr/share/icons\n# \u7cfb\u7edfdesktop\u6587\u4ef6\u7684\u5b58\u653e\u76ee\u5f55\uff0cUOS\u7cfb\u7edf\u9ed8\u8ba4\u4e3a/usr/share/applications\ndesktop_path=/usr/share/applications\n# \u7528\u4e8e\u5224\u65ad\u6d4b\u8bd5\u673a\u662f\u5426\u5f00\u673a\u8fdb\u5165\u684c\u9762\u7684\u8bc6\u522b\u6807\u8bc6\u3002\n# 1\u3001\u901a\u8fc7\u684c\u9762\u56fe\u6807\u8bc6\u522b\u3002\n# - type=FILE_NAME\u65f6\uff0c\u670d\u52a1\u5668\u548c\u6d4b\u8bd5\u673a\u5fc5\u987b\u5728\u540c\u4e00\u5c40\u57df\u7f51\u5185\u3002\n# - power_on=dde-computer\u8868\u793a\u901a\u8fc7\u684c\u9762\u8ba1\u7b97\u673a\u56fe\u6807\u5224\u65ad\u5f00\u673a\u8fdb\u5165\u684c\u9762\u3002\n# 2\u3001\u901a\u8fc7\u672c\u5730\u56fe\u7247\u4f5c\u4e3a\u5f00\u673a\u8bc6\u522b\u3002\n# - type= \u4f20\u5165\u4e3a\u56fe\u7247\u683c\u5f0f\uff0ctype\u652f\u6301\u7684\u7c7b\u578b\u5305\u542b\u5728server.ini\u5185\u914d\u7f6e\u9879input_type=jpg,jpeg,png\u3002\n# - power_on= \u4f20\u5165\u7684\u662f\u672c\u5730\u56fe\u7247\u7684\u8def\u5f84\u3002\ntype=FILE_NAME\npower_on=dde-computer\n# \u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\uff08\u6d4b\u8bd5\u673a\u8fde\u63a5\u91c7\u96c6\u76d2\uff0c\u91c7\u96c6\u76d2\u7684\u5206\u8fa8\u7387\uff09\nheight=1080\nwidth=1920\n[AliasA1] ip=10.8.15.86\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n[AliasA2]\nip=10.8.15.20\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_2","title":"3\u3001\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e","text":"\u968f\u7740\u6d4b\u8bd5\u573a\u666f\u7684\u4e0d\u65ad\u5f15\u5165\uff0c\u53d1\u73b0\u73b0\u6709\u670d\u52a1\u7aef\u91cc\u7684\u914d\u7f6e\u9879\u5e76\u4e0d\u9002\u7528\u4e8e\u6240\u6709\u7684\u6027\u80fd\u573a\u666f\uff0c\u4e8e\u662f\u5c06\u670d\u52a1\u7aef\u914d\u7f6e\u8fdb\u884c\u4e00\u4e2a\u63d0\u53d6\uff0c\u53ef\u505a\u5355\u4e2a\u573a\u666f\u7684\u4e2a\u6027\u5316\u914d\u7f6e\uff0c\u5f53\u7136\u539f\u6765\u7684\u670d\u52a1\u7aef\u914d\u7f6e\u529f\u80fd\u4fdd\u7559\uff0c\u53ea\u662f\u5f53\u4f60\u914d\u7f6e\u4e86\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e\u540e\uff0c\u4f18\u5148\u4f7f\u7528\u4e2a\u6027\u5316\u914d\u7f6e\u91cc\u9762\u7684\u5185\u5bb9\uff0c\u4ee5\u4e0b\u662f\u5bf9\u4e2a\u6027\u5316\u914d\u7f6e\u7684\u4ecb\u7ecd\u3002 \u76ee\u524d\u6bcf\u4e00\u4e2a py \u6587\u4ef6\u5bf9\u5e94\u4e00\u4e2a\u6027\u80fd\u6d4b\u8bd5\u573a\u666f\uff0c\u4e8e\u662f\u5728\u540c\u7ea7\u76ee\u5f55\u4e0b\u521b\u5efa\u4e00\u4e2a\u4e0e\u4e4b\u540c\u540d\u7684 json \u6587\u4ef6\uff0c\u4f5c\u4e3a\u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6 apps\n\u251c\u2500\u2500 album\n \u251c\u2500\u2500 test_album_01_start.json # \u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6\n\u2514\u2500\u2500 test_album_01_start.py # \u6027\u80fd\u573a\u666f\u6587\u4ef6\n \u4ee5\u4e0b\u662f\u5bf9 json \u6587\u4ef6\u4e2d\u914d\u7f6e\u7684\u89e3\u91ca\uff0c\u82e5\u67d0\u9879\u914d\u7f6e\u4e0d\u9700\u8981\uff0c\u53ef\u4ee5\u7f3a\u5931\uff0c\u4f46\u4e0d\u80fd\u4e3a\u7a7a\uff1b {\n\"title\": \"test_album_start\", # \u6807\u9898\uff1b\u5fc5\u987b\n\"app_name\": \"deepin-album\", # \u573a\u666f\u6240\u5c5e\u7684\u5e94\u7528\uff1b\u5fc5\u987b\n\"scene\": \"hot\", # \u573a\u666f\u522b\u540d\uff1b\u5fc5\u987b\n\"icon\": [\"deepin-album\"], # \u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684icon\u5230\u670d\u52a1\u7aef\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\uff1b\u53ef\u7f3a\u5931\n# \u6ce8\u610f\uff1a\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684desktop\u6587\u4ef6\u540d\u4e3adeepin-album.desktop\uff0c\n# \u53ea\u9700\u8981\u5199deepin-album\u5373\u53ef\uff0c\u201c.desktop\u201d\u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002\n\"size\": { # \u56fe\u7247\u5bf9\u6bd4\u7684\u533a\u57df\u8bbe\u7f6e\u9879\uff0c\u67d0\u4e9b\u5e94\u7528\u5f53\u524d\u5c4f\u5e55\u7684\u90e8\u5206\u533a\u57df\u9700\u8981\u5c06\u5176\u53bb\u6389\uff0c\u53ef\u4ee5\u8bbe\u7f6e\u6b64\u9879\uff0c\u5982\u679c\u6ca1\u6709\u5219\u53ef\u4e0d\u5199\uff1b\u53ef\u786e\u5b9e\n\"x-coordinate\": 0, # \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n\"y-coordinate\": 0, # \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n\"width\": 850, # \u6a2a\u5411\u957f\u5ea6\n\"height\": 1920 # \u7eb5\u5411\u9ad8\u5ea6\n},\n\"count\": 5, # \u573a\u666f\u6267\u884c\u7684\u6b21\u6570\uff1b\u5fc5\u987b\n\"duration\": 5, # \u8be5\u6761\u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff0c\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7279\u5b9a\u573a\u666f\uff0c\u8be5\u914d\u7f6e\u4e3a\u53ef\u9009\u9879\uff0c\u8986\u76d6 server.ini \u4e2d\u7684\u914d\u7f6e\uff1b\u53ef\u7f3a\u5931\n\"stable_similarity\": 0.9997, # \u6027\u80fd\u573a\u666f\u5206\u9636\u6bb5\u65f6\u7684\u56fe\u7247\u76f8\u4f3c\u5ea6\u5bf9\u6bd4\uff0c\u524d\u540e\u56fe\u7247\u4f4e\u4e8e\u8be5\u503c\uff0c\u5219\u5206\u4e3a\u4e0d\u7a33\u5b9a\u9636\u6bb5\uff1b\u53ef\u7f3a\u5931\n\"find_by\": \"stage\", # \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\n\"final_stable_num\": 100, # \u67e5\u627e\u6700\u540e\u4e00\u4e2a\u5927\u4e8e\u8be5\u503c\u7684\u7a33\u5b9a\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u7684\u5c3e\u796f\uff1b\u53ef\u7f3a\u5931\n\"start_num\": 150,\n\"text\": \"\", # ocr\u8bc6\u522b\u7684\u6587\u6848\n\"match\": \"apps/xxx/images/match.png\", # \u56fe\u50cf\u5339\u914d\u7684\u56fe\u7247\u6587\u4ef6\u8def\u5f84\n\"match_rate\": 0.9 # \u5339\u914d\u76f8\u4f3c\u5ea6\n}\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e94\u3001\u6d4b\u8bd5\u6d41\u7a0b","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516d\u3001\u7528\u4f8b\u7f16\u5199\u53ca\u65b9\u6cd5\u53c2\u6570\u6307\u5f15","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"1\u3001\u7528\u4f8b\u5b9e\u4f8b\u8bf4\u660e","text":"# \u6807\u51c6\u5e93\u5bfc\u5165\nfrom time import sleep\n# \u5bfc\u5165\u4e09\u65b9\u5e93pytest\nimport pytest\n# \u5bfc\u5165\u7528\u4f8b\u6267\u884c\u8981\u7528\u5230\u7684Widget\u7c7b\nfrom src.base_widget import BaseWidget\nclass TestStart:\n# class\u7ea7\u522b\u7684fixture\uff0c\u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u6267\u884c\u3002autouse=True \u81ea\u52a8\u5728\u5f53\u524d\u4f5c\u7528\u57df\u4e0b\u4f7f\u7528\u3002\n@pytest.fixture(scope=\"class\", autouse=True)\n# \u6d4b\u8bd5\u70ed\u542f\u52a8\u4e4b\u524d\u9700\u8981\u9884\u542f\u52a8\u3002\ndef application_pre_start(self):\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().right_click_element(\"deepin-album\")\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().click_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\")\nsleep(2)\n# \u5feb\u6377\u952e\u5173\u95ed\u7a97\u53e3\nBaseWidget().hot_key(\"alt\", \"f4\")\nsleep(2)\n# \u9ed8\u8ba4\u4e3afunction\u7ea7\u522b\u7684fixture\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\uff0cclass\u7ea7\u522bfixture\u6267\u884c\u4e4b\u540e\u6267\u884c\u3002\n@pytest.fixture(autouse=True)\ndef setup_start(self):\n# \u53f3\u952e\u70b9\u51fb deepin-album \u56fe\u6807\nBaseWidget().right_click_element(\"deepin-album\")\n# \u79fb\u52a8\u5230\u53f3\u952e\u83dc\u5355\u4e2d\u6253\u5f00\uff08open.png\uff09\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().move_to(*BaseWidget().find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))\n# \u7b49\u5f85\u79fb\u52a8\u5b8c\u6210\nsleep(0.5)\ndef test_album_start(self):\n# \u70b9\u51fb\u201c\u6253\u5f00\u201d\nBaseWidget().click() \n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"2\u3001\u65b9\u6cd5\u53c2\u6570\u8bf4\u660e","text":"2.1\u3001find_element \u65b9\u6cd5 def find_element(element: str, input_type: str = \"FILE_NAME\", fill_color_position: tuple = (-1, -1), size: tuple = (25, 70)):\npass\n \u53c2\u6570 element \u548c input_type \uff081\uff09\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u5143\u7d20 - `input_type` \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a `FIEL_NAME` \uff0c\u8868\u793a\u901a\u8fc7\u5e94\u7528 `icon` \u5bfb\u627e\u5143\u7d20\uff0c\u6b64\u65b9\u6cd5\u4f1a\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u5e94\u7528 `icon` \u56fe\u6807\u3002\n \u4e3e\u4f8b\uff1a\u9ed8\u8ba4\u60c5\u51b5\u4e0b input_type \u53c2\u6570\u4e0d\u9700\u8981\u4f20\u5165\uff0c find_element(\"deepin-album\")\uff0c\u8868\u793a\u901a\u8fc7 deepin-album \u7684\u5e94\u7528 icon \u6765\u83b7\u53d6\u5750\u6807\uff0c\u6ce8\u610f\uff0c\u6b64\u65f6\u4f20\u5165\u7684 deepin-album \u53c2\u6570\u5b9e\u9645\u662f desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u548c2.3\u4e2d\u7684 icon \u53d8\u91cf\u4e00\u81f4\u3002 \u6211\u4eec\u5efa\u8bae\u4f18\u5148\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\uff0c\u4f46\u6b64\u65b9\u6cd5\u4f9d\u8d56\u7f51\u7edc\uff0c\u8bf7\u6839\u636e\u6d4b\u8bd5\u73af\u5883\u5b9e\u9645\u60c5\u51b5\u9009\u62e9\u3002 \uff082\uff09\u901a\u8fc7\u672c\u5730\u56fe\u7247\u8bc6\u522b\u5143\u7d20 - \u53c2\u6570 `input_type` \u4f20\u5165\u56fe\u7247\u683c\u5f0f\uff0c\u6bd4\u5982\u622a\u53d6\u7684\u672c\u5730\u56fe\u7247\u683c\u5f0f\u4e3a `png`\uff0c\u90a3\u4e48 `input_type=\"png\"`\uff0c\u6b64\u65f6\u53c2\u6570 `element ` \u4f20\u5165\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5efa\u8bae\u5b58\u653e\u5728\u5bf9\u5e94\u7684\u4ea7\u54c1 `apps/app/picture/` \u76ee\u5f55\u4e0b\uff0c\u8def\u5f84\u4e3a\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u7684\u76f8\u5bf9\u8def\u5f84\u3002\n- \u4e3e\u4f8b\uff1a`find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))`\uff0c\u8868\u793a\u901a\u8fc7\u672c\u5730\u56fe\u7247 `open.png` \u8bc6\u522b\u5143\u7d20\u3002\n \u53c2\u6570 fill_color_position fill_color_position \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (-1, -1)\uff0c(-1, -1) \u8868\u793a\u53d6\u5c4f\u5e55\u4e2d\u53f3\u4e0b\u89d2\u6700\u540e\u4e00\u4e2a\u50cf\u7d20\u70b9\u4f5c\u4e3a\u586b\u5145\u5750\u6807\uff0c\u5728 1920x1080 \u5c4f\u5e55\u5206\u8fa8\u7387\u4e0b\u5373\u5b9e\u9645\u5750\u6807\u4e3a (1919, 1079) \uff0c\u8fd9\u6837\u7684\u5199\u6cd5\u53ef\u4ee5\u9002\u914d\u4e0d\u540c\u5927\u5c0f\u7684\u5c4f\u5e55\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0d\u540c\u65b9\u4f4d\uff1a \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0b\u65b9\uff0c\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u4e0d\u9700\u8981\u4f20\u5165\u8be5\u53c2\u6570\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u5de6\u8fb9\uff0cfill_color_position=(1, 1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u53f3\u8fb9\uff0cfill_color_position=(-1, -1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0a\u8fb9\uff0cfill_color_position=(1, 1) \u4ece\u684c\u9762\u542f\u52a8\u5e94\u7528\uff0c\u5219\u9700\u8981\u4f20\u5165\u9664\u4efb\u52a1\u680f\u4ee5\u5916\u5176\u4ed6\u4f4d\u7f6e\u7684\u5750\u6807\uff0c\u6bd4\u5982(100, 100)\uff0c\u53ea\u8981\u8fd9\u4e2a\u5750\u6807\u4e3a\u9664\u5e94\u7528\u548c\u4efb\u52a1\u680f\u533a\u57df\u90fd\u53ef\u4ee5\u3002 \u4ece\u542f\u52a8\u5668\u91cc\u9762\u542f\u52a8\u5e94\u7528\uff0c\u9700\u8981\u586b\u5145\u7684\u5750\u6807\u4e3a\u542f\u52a8\u5668\u533a\u57df\u3002 \u6ce8\uff1a\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u65f6\uff0c\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684 icon \u539f\u6587\u4ef6\u4e3a svg \u77e2\u91cf\u56fe\uff0c\u8f6c\u6362\u4e3a png \u4e4b\u540e\u9700\u8981\u586b\u5145\u8fb9\u7f18\u900f\u660e\u90e8\u5206\u3002 \u53c2\u6570 size size \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (25, 70)\uff0c\u8868\u793a\u6d4b\u8bd5\u673a\u4e0a dock \u680f\u4e0a\u5e94\u7528\u56fe\u6807\u7684\u5927\u5c0f\u8303\u56f4\u3002 UOS \u7cfb\u7edf dock \u680f\u662f\u53ef\u4ee5\u4e0a\u4e0b\u62d6\u52a8\u5927\u5c0f\u7684\uff0c\u968f\u7740 dock \u680f\u5927\u5c0f\u6539\u53d8\uff0c\u5e94\u7528\u56fe\u6807\u7684\u8303\u56f4\u4e3a25\u523070\u4e4b\u95f4\u3002 \u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u64cd\u4f5c\u7cfb\u7edf\u4e0a dock \u680f\u5927\u5c0f\u4e0d\u4e00\u6837\uff0c\u53ef\u4ee5\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u4f20\u5165\u5927\u5c0f\u8303\u56f4\u3002 2.2\u3001click_element\u3001 right_click_element\uff0c double_click_element \u8fd9\u51e0\u4e2a\u65b9\u6cd5\u53c2\u6570\u89c4\u5219\u4e0e find_element \u65b9\u6cd5\u4e00\u6837\u3002\u4ed6\u4eec\u5b9e\u9645\u4e0a\u662f\u5728 find_element \u65b9\u6cd5\u57fa\u7840\u4e4b\u4e0a\u505a\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u589e\u52a0\u4e86\u9f20\u6807\u7684\u52a8\u4f5c\uff0c\u5982\u679c\u4f60\u4e0d\u60f3\u4f7f\u7528\u8fd9\u51e0\u4e2a\u65b9\u6cd5\uff0c\u5728\u7528\u4f8b\u4e2d\u4e5f\u53ef\u4ee5\u901a\u8fc7 find_element \u83b7\u53d6\u5230\u5750\u6807\uff0c\u7136\u540e\u5c06\u5750\u6807\u4f20\u5165\u5230\u952e\u9f20\u7684\u65b9\u6cd5\u4e2d\uff0c\u53ef\u4ee5\u5b9e\u73b0\u540c\u6837\u7684\u6548\u679c\u3002 2.3\u3001\u7528\u4f8b\u7c7b\u4e2d\u6709\u4e2a\u7c7b\u53d8\u91cf icon = [\"deepin-album\"] \u9700\u8981\u7279\u6b8a\u8bf4\u660e\uff0c\u5217\u8868\u4e2d\u7684\u5143\u7d20\u4e3a\u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709 icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684 icon \u5230\u670d\u52a1\u7aef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528 desktop \u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684 desktop \u6587\u4ef6\u540d\u4e3a deepin-album.desktop\uff0c\u53ea\u9700\u8981\u5199 deepin-album \u5373\u53ef\uff0c.desktop \u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e03\u3001\u6267\u884c\u5165\u53e3","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"1\u3001\u7528\u4f8b\u7ec4\u7ec7","text":"\u5728 setting/config/server.ini \u6587\u4ef6\u4e2d APP_NAME= \u5b57\u6bb5\u4e3a\u7528\u4f8b\u7684\u6267\u884c\u7684\u76ee\u5f55\uff0c\u9ed8\u8ba4\u4e3a apps \u76ee\u5f55\u4e0b\u6240\u6709\u7528\u4f8b\u3002\u5982\u679c\u4f60\u60f3\u6307\u5b9a\u6267\u884c\u67d0\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4f60\u53ef\u4ee5\u5c06\u8be5\u914d\u7f6e\u9879\u6307\u5b9a\u5230\u5e94\u7528\u7684\u7528\u4f8b\u76ee\u5f55\uff0c\u6bd4\u5982\uff1aAPP_NAME=deepin_album\uff0c \u8868\u793a\u6267\u884c\u76f8\u518c\u76ee\u5f55\u4e0b\u7684\u7528\u4f8b\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a python3 manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music\n -k KEYWORDS, --keywords KEYWORDS\n \u7528\u4f8b\u7684\u5173\u952e\u8bcd\n -t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e\n --log_level LOG_LEVEL \u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n --env {host,docker} \u5728\u5bbf\u4e3b\u673a\u6216\u5bb9\u5668\u73af\u5883\u6267\u884c\n --client_alias \u9009\u62e9\u6d4b\u8bd5\u673a\u522b\u540d, \u53ef\u9009\u9879\u4e3aclient.ini\u4e2d\u5df2\u914d\u7f6e, \u9ed8\u8ba4\u503c\u4e3a zx-x86.\n --count \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a python3 manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\" --env docker\n \u6ce8\uff1a\u5728\u5bb9\u5668\u4e2d\u6267\u884c\u65f6\uff0c\u82e5\u5f3a\u5236\u9000\u51fa\uff0c\u5bb9\u5668\u5e76\u4e0d\u4f1a\u505c\u6b62\u8fd0\u884c\uff01"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_9","title":"\u516b\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1json","title":"1\u3001Json \u62a5\u544a","text":"\u81ea\u7814\u89c6\u9891\u89e3\u6790\u5de5\u5177\u4f1a\u5bf9\u5355\u6761\u7528\u4f8b\u6267\u884c\u4e00\u8f6e\u751f\u6210\u4e00\u4e2a json \u6587\u4ef6\uff0c\u5b58\u653e\u4e8e report/{app_name}/{scene}/{run_num} \u76ee\u5f55\u4e0b\uff0c\u547d\u540d\u683c\u5f0f\u4e3a\uff1a report.json json \u5185\u5bb9\u4e3e\u4f8b\uff1a [\n{\n\"Stab1\": {\n\"images\": [1,2...150,151],\n\"startStub\": 0,\n\"type\": \"Stab\"\n}\n},\n{\n\"Stab2\": {\n\"images\": [152,153...169,170],\n\"startStub\": 1,\n\"type\": \"UnStab\"\n}\n},\n{\n\"Stab3\": {\n\"images\": [171,172...300,301],\n\"startStub\": 0,\n\"type\": \"UnStab\"\n}\n}\n]\n \u8bf4\u660e\uff1a Stab \uff1a\u8868\u793a\u89e3\u6790\u8fc7\u7a0b\u4e2d\u4e0d\u540c\u7684\u9636\u6bb5\u3002 images \uff1a\u8868\u793a\u6bcf\u4e00\u5e27\u7684\u56fe\u7247\u5e8f\u53f7\u3002 startStub\uff1a \u4e3a\u8bc6\u522b\u5c3e\u5e27\u7684\u9636\u6bb5\u8868\u793a\uff0c\u5982\u679c \"startStub\": 1 \uff0c\u8bf4\u660e\u5c3e\u5e27\u51fa\u73b0\u5728\u8be5\u9636\u6bb5\u3002 type\uff1a \u4e3a Stab \u6216 UnStab \uff0c\u8868\u793a\u7a33\u5b9a\u9636\u6bb5\u6216\u4e0d\u7a33\u5b9a\u9636\u6bb5\u3002 \u5404\u9636\u6bb5\u6709\u5e27\u6570\u8865\u507f\uff0c\u9ed8\u8ba4\u8865\u507f\u7684\u5e27\u6570\u4e3a 3 \u5e27\uff08\u53ef\u4ee5\u901a\u8fc7 server.ini \u91cc\u9762 un_stab_start=3 \u8fdb\u884c\u914d\u7f6e\uff09\uff0c\u8868\u793a\u5c0f\u4e8e\u7b49\u4e8e 3 \u5e27\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u524d\u540e\u5747\u9700\u8981\u51cf\u6389\u3002 \u5e94\u7528\u542f\u52a8\u9636\u6bb5\u5c31\u662f\u5728 Stab2 \u9636\u6bb5\uff0c\u542f\u52a8\u65f6\u95f4\u4e3a\uff1a171 \u51cf 151 \u518d\u51cf\u6389\u524d\u540e\u8865\u507f\u5e27\u6570 6 \u5e27\uff0c\u5373 14 \u5e27\uff0c\u89c6\u9891\u5e27\u7387 30 \u5e27/\u79d2\uff0c\u56e0\u6b64\u542f\u52a8\u8017\u65f6\u4e3a\uff1a14 * 33 = 462 ms"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2excel","title":"2\u3001Excel \u62a5\u544a","text":"\u6240\u6709\u7528\u4f8b\u6267\u884c\u5e76\u89e3\u6790\u5b8c\u4e4b\u540e\u4f1a report \u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a\u6c47\u603b\u6570\u636e\u7684 Excel \u6587\u4ef6\uff0c\u6587\u4ef6\u540d\u4e3a\uff1a{time}_perf_time.xlsx\u3002 \u6ce8\u610f\uff0creport \u76ee\u5f55\u4e3a\u53ef\u914d\u7f6e\u9879\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u4f1a\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u751f\u6210\uff0c\u5982\u679c\u4f60\u5c06 report\uff0c\u6307\u5b9a\u5230\u9879\u76ee\u4e0b\u5176\u4ed6\u8def\u5f84\uff0c\u5219\u4f1a\u5728\u5bf9\u5e94\u7684\u8def\u5f84\u4e0b\u751f\u6210 json \u548c Excel \u6587\u4ef6\u3002 \u4f60\u4e5f\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8bfb\u53d6\u6240\u6709 json / excel \u62a5\u544a\u7684\u6570\u636e\uff0c\u751f\u6210\u4f60\u81ea\u5df1\u60f3\u8981\u7684\u4e00\u4e9b\u6d4b\u8bd5\u62a5\u544a\u5f62\u5f0f\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#usb","title":"\u4e5d\u3001USB \u4e32\u53e3\u9a71\u52a8\u952e\u9f20\u65b9\u6cd5","text":"\u4f4d\u4e8e src/utils/control/serial_communication \u76ee\u5f55\u4e0b\u7684 usb_mk.py \u6587\u4ef6 usb_mk = UsbMk()\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up()\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u652f\u6301\u4f20\u5165\u6c49\u5b57\uff0c\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click()\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() \n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() \n \uff084\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() \n \uff085\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() \n \uff086\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() \n \uff087\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff088\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff0810\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_10","title":"\u5341\u3001\u7ee7\u7535\u5668\u63a7\u5236\u4e3b\u673a\u5f00\u673a/\u91cd\u542f","text":"\uff08\u82e5\u4e0d\u4f7f\u7528\u7ee7\u7535\u5668\uff0c\u53ef\u5ffd\u7565\u8be5\u6b65\u9aa4\uff0c\u6267\u884c\u65f6\u4f1a\u901a\u8fc7\u547d\u4ee4 reboot\uff09"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u7ee7\u7535\u5668\u8bbe\u5907","text":"LCUS-2 \u578b \u53cc\u8def USB \u667a\u80fd\u4e32\u53e3\u63a7\u5236\u7ee7\u7535\u5668\u3002 https://item.taobao.com/item.htm?spm=a1z09.2.0.0.41d72e8dUYx2pi&id=582653718178&_u=i25r20ia6a2e "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2usb","title":"2\u3001USB \u5ef6\u957f\u7ebf","text":"\u666e\u901a\u7684 USB \u7ebf\u5373\u53ef\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_3","title":"3\u3001\u675c\u90a6\u7ebf","text":"3.1\u300140P \u6bcd\u5bf9\u516c\u675c\u90a6\u7ebf\u3002 3.2\u3001\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"4\u3001\u5b89\u88c5\u56fe\u6587\u6559\u7a0b","text":"4.1\u3001\u4f7f\u7528 USB \u5ef6\u957f\u7ebf\u8fde\u63a5\u63a7\u5236\u7aef\u548c\u7ee7\u7535\u5668\u3002 4.2\u3001\u5728\u7ee7\u7535\u5668\u5e38\u7aef\u548c\u516c\u5171\u7aef\u5747\u8fde\u63a5\u4e00\u6839\u675c\u90a6\u7ebf\u3002 4.3\u3001\u5728\u4e3b\u677f\u4e0a\u5f00\u673a\u9488\u548c\u91cd\u542f\u9488\u4e0a\u63d2\u4e0a\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 4.4\u3001\u5c06\u5f00\u673a\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76841\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1\u5de6\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 4.5\u3001\u5c06\u91cd\u542f\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76842\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1 \u53f3\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 \u82e5\u60f3\u4fdd\u7559\u539f\u7535\u6e90\u5f00\u5173\u7684\u7535\u6e90\u706f\uff0c\u53ef\u6839\u636e\u5982\u4e0a\u56fe\u6240\u793a\uff0c\u4f7f\u7528\u675c\u90a6\u7ebf\u8fde\u63a5\u4e3b\u677f\u4e0a\u7684\u7535\u6e90\u706f\u548c\u539f\u7535\u6e90\u5f00\u5173"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_11","title":"\u5341\u4e00\u3001\u5e38\u89c1\u95ee\u9898\u8bf4\u660e","text":"1\u3001ERROR: for uos Cannot restart container 2301b1a1395d7959ee6523d61b61c87084649af530786cdb8fb5b3ecbcbd1068: linux runtime spec devices: error gathering device information while adding custom device \"/dev/ttyACM0\": no such file or directory \u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u8fde\u63a5\u72b6\u6001\uff0c\u67e5\u770b /dev/ttyACM0 \u662f\u5426\u5b58\u5728\uff0c\u82e5\u5b58\u5728 /dev/ttyACMn\uff08n\u4e3a\u4efb\u610f\u6570\u5b57\uff09\uff0c\u91cd\u542f\u7535\u8111\u89e3\u51b3\u3002 2\u3001Error response from daemon: Container 5e700fdc769e8c74666d68a7f2bc3de58268b4594cf88706609d59f8dbc7362d is not running \u5bb9\u5668\u542f\u52a8\u5931\u8d25 1\uff09\u68c0\u67e5\u54ea\u4e00\u4e2a\u5bb9\u5668\u672a\u542f\u52a8 sudo docker container ls # \u5217\u51fa\u8fd0\u884c\u4e2d\u7684 Docker \u5bb9\u5668\n 2\uff09\u7f3a\u5c11 uos \u5bb9\u5668\uff0c\u68c0\u67e5 USB \u4e32\u53e3\u8fde\u63a5\u7ebf\u548c\u91c7\u96c6\u76d2\u8fde\u63a5\u7ebf\u662f\u5426\u6b63\u5e38\uff0c\u91cd\u542f\u540e\u6267\u884c bash install/setup.up # \u91cd\u65b0\u5b8c\u6574\u90e8\u7f72\u73af\u5883\n \u6216\u6267\u884c sudo docker-compose up -d --build # \u4ec5\u91cd\u65b0\u6784\u5efa Docker \u955c\u50cf\n 3\u3001\u82e5\u90e8\u7f72\u65f6\u63d0\u793a\u6302\u8f7d ttyACM0\u3001video0 \u5931\u8d25\uff0c\u8bf7\u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u53ca\u91c7\u96c6\u76d2\u662f\u5426\u63a5\u89e6\u826f\u597d\uff0c\u82e5\u63a5\u89e6\u826f\u597d\uff0c\u91cd\u542f\u5373\u53ef\u89e3\u51b3\u3002 4\u3001\u82e5\u51fa\u73b0\u56fe\u7247\u80fd\u8bc6\u522b\uff0c\u4f46\u662f\u9f20\u6807\u672a\u79fb\u52a8\u64cd\u4f5c\u65f6\uff0c\u5b89\u88c5\u7edd\u5bf9\u9f20\u6807\u64cd\u4f5c\u7684\u4f9d\u8d56\u5305\uff0c\u89c1\u7b2c\u4e09\u8282\u7b2c\u4e8c\u5c0f\u8282\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u6d4b\u8bd5\u673a\u3002 5\u3001\u7531\u4e8e\u901a\u8fc7\u91c7\u96c6\u5361\u83b7\u53d6\u7684\u6d4b\u8bd5\u673a\u5b9e\u65f6\u753b\u9762\uff0c\u5305\u542b\u4e86\u9f20\u6807\u7684\u6837\u5f0f\uff0c\u6240\u4ee5\u5bf9\u56fe\u7247\u8bc6\u522b\u65f6\uff0c\u9f20\u6807\u82e5\u505c\u7559\u5728\u56fe\u6807\u4e0a\u5c42\uff0c\u5219\u4f1a\u5bf9\u8bc6\u522b\u7ed3\u679c\u9020\u6210\u5f71\u54cd\uff0c\u9700\u8981\u5c06\u9f20\u6807\u79fb\u52a8\u81f3\u5176\u4ed6\u4f4d\u7f6e\uff0c\u6216\u8005\u9690\u85cf\u9f20\u6807\u89e3\u51b3\u3002 6\u3001Excel \u62a5\u544a\u4e2d\uff0c\u6d4b\u8bd5\u573a\u666f\u5217\u4e0e\u7528\u4f8b\u4e2d\u7684\u4e0d\u4e00\u81f4\uff0c\u5173\u952e\u5b57scene\u3001app_name\u3001\u67b6\u6784\u522b\u540d\uff0c\u4e0d\u80fd\u5305\u542b\u4e0b\u5212\u7ebf\u548c\u82f1\u6587\u7b26\u53f7\u7684\u5706\u62ec\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/","title":"\u6846\u67b6\u529f\u80fd\u4ecb\u7ecd","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2023/1/12\n# Author : Mikigo\n# =============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_2","title":"\u4e00\u3001\u4e00\u53e5\u8bdd\u7b80\u4ecb","text":"\u6b64\u6587\u6863\u4e3b\u8981\u60f3\u5bf9 YouQu \u6846\u67b6\u4e00\u4e9b\u91cd\u70b9\u7684\u529f\u80fd\u505a\u8be6\u7ec6\u7684\u4ecb\u7ecd\uff0c\u5305\u62ec\u5bf9\u4e00\u4e9b\u529f\u80fd\u5f00\u53d1\u7684\u80cc\u666f\u3001\u8981\u89e3\u51b3\u7684\u95ee\u9898\u3001\u5b9e\u73b0\u903b\u8f91\u3001\u4ee3\u7801\u7b49\u65b9\u9762\u7684\u4ecb\u7ecd\uff0c\u4ee5\u6b64\u8ba9\u5927\u5bb6\u80fd\u66f4\u52a0\u6e05\u6670\u7684\u7406\u89e3\u5404\u9879\u529f\u80fd\uff0c\u4ece\u800c\u5728\u4f7f\u7528\u7684\u65f6\u5019\u80fd\u66f4\u52a0\u7684\u5f97\u5fc3\u5e94\u624b\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_3","title":"\u4e8c\u3001\u56fe\u50cf\u8bc6\u522b","text":"\u56fe\u50cf\u8bc6\u522b\u5728 UI \u81ea\u52a8\u5316\u4e2d\u662f\u4e0d\u53ef\u7f3a\u5c11\u7684\uff0c\u5e02\u9762\u4e0a\u751a\u81f3\u6709\u5b8c\u5168\u57fa\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\uff0c\u6bd4\u5982 Airtest\u3001Sikuli \u7b49\uff0c\u5728\u6e38\u620f\u7b49\u7279\u5b9a\u9886\u57df\u4e5f\u6709\u4e0d\u9519\u7684\u6548\u679c\uff0c\u8fd9\u4e9b\u5de5\u5177\u5b9e\u9645\u4e0a\u4e5f\u662f\u7528\u7684 OpenCV \u8fdb\u884c\u4e86\u5c01\u88c5\uff0cYouQu \u6846\u67b6\u57fa\u4e8e OpenCV \u5f00\u53d1\u4e86\u81ea\u5df1\u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\uff0c\u5b83\u53ef\u4ee5\u65b9\u4fbf\u7684\u7528\u4e8e\u754c\u9762\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u65ad\u8a00\uff1b YouQu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u51e0\u4e4e\u6ee1\u8db3\u4e86\u4f60\u7684\u6240\u6709\u8981\u6c42\uff0c\u6211\u4eec\u5728\u957f\u65f6\u95f4\u7684\u601d\u8003\u548c\u6478\u7d22\u4e2d\uff0c\u9488\u5bf9\u5e38\u89c4\u573a\u666f\u53ca\u4e00\u4e9b\u7279\u6b8a\u573a\u666f\u63a2\u7d22\u9664\u4e86\u4e00\u4e9b\u5b9e\u7528\u4e14\u6709\u6548\u7684\u65b9\u6848\uff0c\u4e14\u542c\u6211\u6162\u6162\u9053\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1","title":"1\u3001\u5e38\u89c4\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5e38\u89c4\u8bc6\u522b\u5f88\u597d\u7406\u89e3\uff0c\u4e00\u53e5\u8bdd\u8bb2\u5c31\u662f\uff0c\u8981\u83b7\u53d6\u5230\u76ee\u6807\u5143\u7d20\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u3002 \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u5728\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u9700\u8981\u83b7\u53d6\u7684\u5750\u6807\u662f\u76f8\u5bf9\u4e8e\u6574\u4e2a\u5c4f\u5e55\u7684\u5750\u6807\uff0c\u6211\u4eec\u53ef\u4ee5\u622a\u53d6\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u56fe\u7247\uff08screen\uff09\uff1b \u5728\u5143\u7d20\u8bc6\u522b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u622a\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5c0f\u56fe\u8fdb\u884c\u8bc6\u522b\uff0c\u6bd4\u5982\u622a\u53d6\u64ad\u653e\u6309\u94ae\uff1a \u90a3\u4e48\u5b9e\u9645\u4e0a\uff0c\u5143\u7d20\u5b9a\u4f4d\u7684\u95ee\u9898\u5c31\u8f6c\u6362\u4e3a\uff0c\u5c06\u622a\u56fe\u7684\u5c0f\u56fe\uff08play_btn\uff09\u62ff\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u5927\u56fe\uff08screen\uff09\u4e2d\u53bb\u505a\u5339\u914d\uff0c\u5982\u679c\u5339\u914d\u6210\u529f\uff0c\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff08 x, y \uff09\u5373\u53ef\u3002 \u4e3a\u4e86\u65b9\u4fbf\u63cf\u8ff0\uff0c\u4ee5\u4e0b\u6211\u5c06\u6574\u4e2a\u5c4f\u5e55\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5927\u56fe\uff0c\u67d0\u4e2a\u5143\u7d20\u56fe\u7247\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5c0f\u56fe\u3002 \u57fa\u4e8e OpenCV \u7684\u6a21\u677f\u5339\u914d cv.matchTemplate() \u529f\u80fd\uff0c\u6211\u4eec\u5b9e\u73b0\u4e86\u56fe\u50cf\u5b9a\u4f4d\u7684\u529f\u80fd\uff0c\u6846\u67b6\u63d0\u4f9b\u4e86\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u5e95\u5c42\u63a5\u53e3\uff08\u4e00\u822c\u4e0d\u5bf9\u4e0a\u5c42\u63d0\u4f9b\u8c03\u7528\uff09\uff1a def _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\n# \u8be6\u7ec6\u4ee3\u7801\u592a\u957f\u4e0d\u8d34\u4e86\uff0c\u611f\u5174\u8da3\u8bf7\u67e5\u770b\u6e90\u7801\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001image_path image_path \u662f\u5c0f\u56fe\u7684\u7edd\u5bf9\u8def\u5f84; \u901a\u5e38\u5728 AT \u5de5\u7a0b\u91cc\u9762\uff0c\u6211\u4eec\u7ea6\u5b9a\u5c06\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u5b9e\u9645\u7684\u5143\u7d20\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1aplay_btn.png \uff1b \u7528\u4e8e\u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 case/assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1amusic_001.png \uff1b \u8fd9\u6837\u662f\u4e3a\u4e86\u65b9\u4fbf\u7ba1\u7406\u548c\u7ef4\u62a4\u3002 2\u3001rate \u56fe\u50cf\u8bc6\u522b\u7684\u7684\u5339\u914d\u5ea6\u6216\u8005\u8bf4\u76f8\u4f3c\u5ea6\uff0c\u6846\u67b6\u9ed8\u8ba4\u7684\u914d\u7f6e\u4e3a 0.9\uff0c\u4e5f\u5c31\u662f\u8bf4\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u5b58\u5728\u4e00\u4e2a\u76f8\u4f3c\u5ea6 90% \u7684\u56fe\u6807\u5373\u8fd4\u56de\u5176\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff1b \u5982\u679c\u4f60\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u8c03\u6574\u8bc6\u522b\u5ea6\uff0c\u4f60\u53ef\u4ee5\u5728\u8c03\u7528\u51fd\u6570\u7684\u65f6\u5019\uff0c\u4f20\u5165\u4e0d\u540c\u7684\u8bc6\u522b\u5ea6\u7684\u503c\u3002 3\u3001multiple \u9ed8\u8ba4\u60c5\u51b5\u4e0b multiple=False\uff0c\u8868\u793a\u53ea\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u7b2c\u4e00\u4e2a\uff0c\u5982\u679c multiple=True \u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\uff0c\u56e0\u4e3a\u5927\u56fe\u4e2d\u53ef\u80fd\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u5c0f\u56fe\uff0c\u5728\u67d0\u4e9b\u573a\u666f\u4e0b\u4f60\u53ef\u80fd\u9700\u8981\u5168\u90e8\u83b7\u53d6\u5230\u6240\u6709\u5339\u914d\u5230\u7684\u5750\u6807\u3002 4\u3001picture_abspath \u9ed8\u8ba4\u60c5\u51b5\u4e0b picture_abspath=None \u8868\u793a\u5927\u56fe\u4e3a\u622a\u53d6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u5982\u679c\u4f60\u4e0d\u5e0c\u671b\u5927\u56fe\u662f\u5c4f\u5e55\u7684\u622a\u56fe\uff0c\u800c\u662f\u4f60\u81ea\u5b9a\u4e49\u4f20\u5165\u7684\u67d0\u4e2a\u56fe\u7247\uff0c\u4f60\u53ea\u9700\u8981\u5c06\u4f60\u7684\u56fe\u7247\u8def\u5f84\u4f20\u9012\u7ed9\u8fd9\u4e2a\u53c2\u6570\u5c31\u884c\uff0c\u6bd4\u5982\uff1a picture_abspath=\"~/Desktop/big.png\" \uff1b 5\u3001screen_bbox \u5927\u56fe\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u622a\u53d6\u6574\u4e2a\u5c4f\u5e55\uff0cscreen_bbox = [x, y, w, h] \u53ef\u4ee5\u6307\u5b9a\u622a\u53d6\u5c4f\u5e55\u4e2d\u7684\u56fa\u5b9a\u533a\u57df\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\uff0c\u53ef\u4ee5\u6392\u9664\u90e8\u5206\u533a\u57df\u5bf9\u8bc6\u522b\u7ed3\u679c\u7684\u5f71\u54cd\u3002 \u3010\u9690\u5f0f\u7b49\u5f85\u3011 \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\uff0c\u6709\u65f6\u5019\u9875\u9762\u8df3\u8f6c\u6709\u5ef6\u65f6\uff0c\u6709\u53ef\u80fd\u5b58\u5728\u8bc6\u522b\u7684\u90a3\u4e00\u523b\u9875\u9762\u4e5f\u6ca1\u6709\u8df3\u8f6c\u51fa\u6765\uff0c\u6216\u8005\u6216\u8005\u8bc6\u522b\u7684\u90a3\u4e00\u523b\uff1b \u56e0\u6b64\u6211\u4eec\u9700\u8981\u4e00\u79cd\u7b49\u5f85\u673a\u5236\uff0c\u5373\u5728\u4e00\u5b9a\u7684\u65f6\u95f4\u5185\uff0c\u5982\u679c\u8bc6\u522b\u4e0d\u5230\uff0c\u91cd\u590d\u53bb\u8bc6\u522b\uff1a def find_image(\ncls,\n*widget, rate: [float, int] = None,\nmultiple: bool = False,\nmatch_number: int = None,\npicture_abspath: str = None,\nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u5728\u5c4f\u5e55\u4e2d\u533a\u5bfb\u627e\u5c0f\u56fe\uff0c\u8fd4\u56de\u5750\u6807\uff0c\n \u5982\u679c\u627e\u4e0d\u5230\uff0c\u6839\u636e\u914d\u7f6e\u91cd\u8bd5\u6b21\u6570\uff0c\u6bcf\u6b21\u95f4\u96941\u79d2\n :param widget: \u6a21\u677f\u56fe\u7247\u8def\u5f84\n :param rate: \u76f8\u4f3c\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param match_number: \u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\n :return: \u5750\u6807\u5143\u7ec4\n \"\"\"\nif rate is None:\nrate = float(GlobalConfig.IMAGE_RATE)\ntry:\nfor element in widget:\nfor _ in range((match_number or int(GlobalConfig.IMAGE_MATCH_NUMBER)) + 1):\nlocate = cls._match_image_by_opencv(\nelement,\nrate,\nmultiple=multiple,\npicture_abspath=picture_abspath,\nscreen_bbox=screen_bbox\n)\nif not locate:\nsleep(int(GlobalConfig.IMAGE_MATCH_WAIT_TIME))\nelse:\nreturn locate\nraise TemplateElementNotFound(*widget)\nexcept Exception as e:\nraise e\n \u53c2\u6570 match_number \u7528\u4e8e\u63a7\u5236\u91cd\u590d\u8bc6\u522b\u7684\u6b21\u6570\uff0c\u9ed8\u8ba4\u4e0d\u4f20\u53c2\uff0c\u53d6\u5168\u5c40\u914d\u7f6e setting/globalconfig.ini \u91cc\u9762\u7684 IMAGE_MATCH_NUMBER \u914d\u7f6e\u9879\u7684\u503c\uff0c\u9ed8\u8ba4IMAGE_MATCH_NUMBER = 1\uff0c\u5373\u91cd\u8bd5 1 \u6b21\uff1b find_image \u662f\u6846\u67b6\u63d0\u4f9b\u7684\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u51fd\u6570\u63a5\u53e3\uff0c\u8fd9\u4e2a\u51fd\u6570\u63d0\u4f9b\u4e86\u9690\u5f0f\u7b49\u5f85\u7684\u529f\u80fd\uff0c\u4e14\u5305\u542b\u4e0a\u9762\u4ecb\u7ecd\u7684 _match_image_by_opencv \u51fd\u6570\u7684\u6240\u6709\u529f\u80fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2","title":"2\u3001\u6c14\u6ce1\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u6c14\u6ce1\u8bc6\u522b\u6307\u7684\u662f\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\u8981\u5b9a\u4f4d\u7684\u5143\u7d20\u662f\u4e00\u4e9b\u4f1a\u6d88\u5931\u7684\u5c0f\u5f39\u7a97\uff0c\u8fd9\u7c7b\u573a\u666f\u5728\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\u5c31\u53ef\u80fd\u5b58\u5728\u4e0d\u7a33\u5b9a\u6027\uff0c\u6709\u53ef\u80fd\u56fe\u50cf\u8bc6\u522b\u7684\u65f6\u5019\u6c14\u6ce1\u5df2\u7ecf\u6d88\u5931\u4e86\uff0c\u4e5f\u6709\u53ef\u80fd\u6c14\u6ce1\u51fa\u73b0\u7684\u65f6\u95f4\u592a\u77ed\u4e86\uff0c\u4e0d\u5bb9\u6613\u6355\u6349\u5230\uff0c\u5c31\u50cf\u6c14\u6ce1\u4e00\u6837\uff0c\u51fa\u73b0\u4e00\u4e0b\u5c31\u6d88\u5931\uff0c\u56e0\u6b64\u6211\u4eec\u5f62\u8c61\u7684\u79f0\u4e4b\u4e3a \u201c\u6c14\u6ce1\u8bc6\u522b\u201d\uff1b \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u4e3a\u4e86\u80fd\u7a33\u5b9a\u7684\u8bc6\u522b\u6c14\u6ce1\u7c7b\u573a\u666f\uff0c\u6211\u4eec\u91c7\u7528\u7684\u65b9\u6848\u662f\uff1a \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\uff08\u5305\u542b\u6c14\u6ce1\u4ece\u51fa\u73b0\u5230\u6d88\u5931\uff09\uff0c\u4e0d\u505c\u7684\u622a\u53d6\u8fd9\u6bb5\u65f6\u95f4\u5185\u7684\u5927\u56fe\uff0c\u4ee5\u6b64\u786e\u4fdd\u5728\u622a\u53d6\u7684\u4e00\u5806\u56fe\u7247\u4e2d\uff0c\u80af\u5b9a\u6709\u81f3\u5c11\u4e00\u5f20\u56fe\u7247\u80fd\u6355\u6349\u5230\u6c14\u6ce1\uff0c\u6700\u540e\u518d\u5bf9\u8fd9\u4e00\u5806\u56fe\u7247\u9010\u4e2a\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def get_during(\ncls,\nimage_path: str,\nscreen_time: [float, int],\nrate: float = None,\npause: [int, float] = None,\nmax_range: int = 10000\n):\n\"\"\"\n \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u622a\u56fe\u591a\u5f20\u56fe\u7247\u8fdb\u884c\u8bc6\u522b\uff0c\u5176\u4e2d\u6709\u4e00\u5f20\u56fe\u7247\u8bc6\u522b\u6210\u529f\u5373\u8fd4\u56de\u7ed3\u679c;\n \u9002\u7528\u4e8e\u6c14\u6ce1\u7c7b\u7684\u65ad\u8a00\uff0c\u6bd4\u5982\u6c14\u6ce1\u57281\u79d2\u5185\u6d88\u5931\uff0c\u5982\u679c\u7528\u5e38\u89c4\u7684\u56fe\u50cf\u8bc6\u522b\u5219\u6709\u53ef\u80fd\u65e0\u6cd5\u8bc6\u522b\u5230\uff1b\n :param image_path: \u8981\u8bc6\u522b\u7684\u6a21\u677f\u56fe\u7247\uff1b\n :param screen_time: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff1b\n :param rate: \u8bc6\u522b\u7387\uff1b\n :param pause: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u4e0d\u95f4\u9694\uff1b\n :param max_range: \u622a\u56fe\u7684\u6700\u5927\u6b21\u6570\uff0c\u8fd9\u662f\u4e00\u4e2a\u9884\u8bbe\u503c\uff0c\u4e00\u822c\u60c5\u51b5\u4e0b\u4e0d\u6d89\u53ca\u4fee\u6539\uff1b\n \"\"\"\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001screen_time \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5728\u6b64\u65f6\u95f4\u5185\u4f1a\u4e0d\u65ad\u7684\u8fdb\u884c\u622a\u56fe\u64cd\u4f5c\uff0c\u5c31\u50cf\u5f55\u5236\u89c6\u9891\u4e00\u6837\uff1b 2\u3001pause \u6bcf\u6b21\u622a\u53d6\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u4e00\u523b\u4e0d\u505c\u7684\u622a\u56fe\uff0c\u5982\u679c\u4f60\u60f3\u6bcf\u6b21\u622a\u56fe\u5b58\u5728\u4e00\u4e9b\u95f4\u9694\u65f6\u95f4\u4f20\u5165\u5bf9\u5e94\u7684\u65f6\u95f4\u95f4\u9694\u5373\u53ef\uff0c\u5355\u4f4d\u662f\u79d2\uff0c\u6bd4\u5982\uff1apause = 0.03\uff0c\u8868\u793a 30 ms\uff0c\u76f8\u5f53\u4e8e\u5e27\u7387\u4e3a 30 \u5e27\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-opencv","title":"3\u3001\u4e0d\u4f9d\u8d56 OpenCV \u7684\u56fe\u50cf\u8bc6\u522b\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31","title":"3.1\u3001\u81ea\u7814\u56fe\u50cf\u8bc6\u522b\u6280\u672f","text":"\u3010\u539f\u7406\u3011 \u4e3a\u4e86\u5b9e\u73b0\u8bc6\u522b\u56fe\u50cf\u7684\u76ee\u7684\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u5c06\u56fe\u7247\u7684\u6bcf\u4e2a\u50cf\u7d20\u7684RGB\u503c\uff0c\u4e0e\u6574\u4e2a\u5c4f\u5e55\u4e2d\u7684RGB\u8fdb\u884c\u5bf9\u6bd4\uff0c\u5982\u679c\u5c0f\u56fe\u4e0a\u7684RGB\u503c\u4e0e\u5bf9\u5e94\u5927\u56fe\u4f4d\u7f6e\u7684RGB\u90fd\u76f8\u7b49\uff0c\u5219\u5339\u914d\u6210\u529f\uff0c\u5373\u53ef\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u70b9\u3002 1\u3001\u8bfb\u53d6\u5c0f\u56fe\u548c\u5927\u56fe\u7684RGB\u503c \uff081\uff09\u5c0f\u56fe\u7684RGB\u503c small_data = small_pic.load() # load()\u4f1a\u5c06\u56fe\u7247\u7684RGB\u503c\u83b7\u53d6\u5230\uff0c\u6570\u636e\u683c\u5f0f\u4e3a\u4e00\u4e2a\u4e8c\u7ef4\u5217\u8868\uff0c\u8d4b\u503c\u7ed9\u4e00\u4e2a\u53d8\u91cfsmall_data\u3002\n \uff082\uff09\u5927\u56fe\u7684RGB\u503c big_data = big_pic.load()\n 2\u3001\u5c06\u5c0f\u56fe\u4e0e\u5927\u56fe\u7684RGB\u503c\u8fdb\u884c\u5339\u914d \uff081\uff09\u5339\u914d\u4ece\u5927\u56fe\u7684\u5750\u6807\uff080\uff0c0\uff09\u5f00\u59cb\u5339\u914d\uff0c\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff082\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\uff080\uff0c0\uff09\u5bf9\u5e94\u7684\u6240\u6709\u5c0f\u56fe\u7684RGB\u503c\u4e0d\u76f8\u7b49\uff0c\u5219\u79fb\u52a8\u5230\u4e0b\u4e00\u4e2a\u5750\u6807\u70b9\uff081\uff0c0\uff09\uff0c\u540c\u6837\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff083\uff09\u6309\u7167\u8fd9\u6837\u7684\u89c4\u5f8b\u5c06\u8fd9\u4e00\u884c\u6bcf\u79fb\u52a8\u4e00\u4e2a\u5750\u6807\u70b9\uff0c\u90fd\u5c06\u5c0f\u56fe\u6240\u6709\u7684RGB\u4e0e\u5bf9\u5e94\u5927\u56fe\u7684\u503c\u8fdb\u884c\u5339\u914d\uff1b \uff084\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\u5176\u4e2d\u4e00\u4e2a\u5750\u6807\u70b9\u4e0a\u5339\u914d\u5230\u4e86\u5c0f\u56fe\u7684\u6240\u6709RGB\u503c\uff0c\u5219\u6b64\u65f6\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\u70b9\uff1b \uff085\uff09\u5982\u679c\u5339\u914d\u4e86\u5927\u56fe\u6240\u6709\u7684\u5750\u6807\u70b9\uff0c\u90fd\u6ca1\u6709\u5339\u914d\u5230\uff0c\u5219\u8bf4\u660e\u5927\u56fe\u4e2d\u4e0d\u5b58\u5728\u5c0f\u56fe\uff0c\u5339\u914d\u5931\u8d25\uff1b \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 class ImageRgb:\n@staticmethod\ndef _check_match(_x, _y, small, bdata, sdata, rate):\n\"\"\"\n Matching degree of small graph and large graph matching\n \"\"\"\n@staticmethod\ndef _pre_random_point(small):\n\"\"\"\n Pre matching, take 10-20 points at random each time,\n and take coordinates randomly in the small graph\n \"\"\"\n@staticmethod\ndef _pre_random_match(_x, _y, point_list, bdata, sdata, rate):\n\"\"\"\n In the small graph, several points are randomly\n selected for matching, and the matching degree is\n also set for the random points\n \"\"\"\n@classmethod\ndef match_image_by_rgb(cls, image_name=None, image_path=None, rate=0.9):\n\"\"\"\n By comparing the RGB values of the small image with the large\n image on the screen, the coordinates of the small image on\n the screen are returned.\n \"\"\"\n \u901a\u8fc7 match_image_by_rgb() \u8fd9\u4e2a\u51fd\u6570\uff0c\u4f20\u5165\u76ee\u6807\u5c0f\u56fe\u7684\u6587\u4ef6\u540d\u79f0\uff0c\u5373\u53ef\u8fd4\u56de\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u3002 \u6709\u540c\u5b66\u8981\u95ee\u4e86\uff0c\u6709 OpenCV \u5e72\u561b\u4e0d\u7528\uff0c\u6709\u5fc5\u8981\u81ea\u5df1\u5b9e\u73b0\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u529f\u80fd\u5417\uff0c\u4f60\u4eec\u662f\u4e0d\u662f\u95f2\u7684\u554a\uff1f \u8fd9\u4e48\u95ee\u7684\u8bdd\uff0c\u5c0f\u4e86\uff0c\u683c\u5c40\u5c0f\u4e86\uff1b\u6211\u4eec\u81ea\u5df1\u5b9e\u73b0\u4e3b\u8981\u6709\u51e0\u65b9\u9762\u539f\u56e0\uff1a \u51cf\u5c11\u73af\u5883\u4f9d\u8d56\uff0c\u5373\u4e0d\u7528\u5b89\u88c5 OpenCV\uff0c\u6211\u4eec\u4e5f\u80fd\u5b9e\u73b0\u5176\u529f\u80fd\uff0c\u73af\u5883\u4f9d\u8d56\u8fd9\u5757\u540e\u9762\u4f1a\u5355\u72ec\u8be6\u7ec6\u8bb2\uff0c\u51cf\u5c11\u73af\u5883\u4f9d\u8d56\u5bf9\u4e8e\u4efb\u4f55\u8f6f\u4ef6\u5de5\u7a0b\u90fd\u975e\u5e38\u91cd\u8981\uff1b OpenCV \u5728\u5176\u4ed6\u56fd\u4ea7 CPU \u67b6\u6784\u4e0a\u5b89\u88c5\u5e76\u4e0d\u80fd\u4fdd\u8bc1100%\u6210\u529f\uff0c\u751a\u81f3\u6709\u6ca1\u6709\u53ef\u80fd\u5728\u4e00\u4e9b\u67b6\u6784\u4e0a\u538b\u6839\u513f\u5c31\u4e0d\u80fd\u5b89\u88c5\u4f7f\u7528 OpenCV \uff1f \u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 OpenCV \uff1f\u5c31\u50cf\u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 Windows \u5462\uff1f\u8fd9\u4e9b\u95ee\u9898\u503c\u5f97\u601d\u8003\u3002 \u5f53\u7136\uff0c\u6211\u4eec\u627f\u8ba4\u8fd9\u5957\u65b9\u6848\uff0c\u867d\u7136\u8bc6\u522b\u51c6\u786e\u7387\u6ca1\u95ee\u9898\uff0c\u4f46\u5728\u8bc6\u522b\u6548\u7387\u4e0a\u8fd8\u6ca1\u6709\u8fbe\u5230 OpenCV \u6a21\u677f\u5339\u914d\u7684\u6548\u679c\uff0c\u6211\u4eec\u7684\u65b9\u6848\u6bcf\u6b21\u8bc6\u522b\u5728 1.5s \u5de6\u53f3\uff0c\u800c OpenCV \u5728 1s \u5de6\u53f3\uff1b \u6574\u4f53\u8bc6\u522b\u6548\u679c\u6765\u8bb2\uff0c\u6211\u8ba4\u4e3a\u8fd8\u662f\u53ef\u4ee5\u63a5\u53d7\u7684\uff0c\u4e5f\u5e0c\u671b\u6709\u5fd7\u4e4b\u58eb\u80fd\u4e00\u8d77\u4f18\u5316\u6b64\u65b9\u6848\uff0c\u4e00\u8d77\u6280\u672f\u62a5\u56fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32-rpc","title":"3.2\u3001\u57fa\u4e8e RPC \u670d\u52a1\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b","text":"\u5728\u8fdc\u7a0b\u670d\u52a1\u5668\u4e0a\u90e8\u7f72 OpenCV \u7684\u73af\u5883\uff0c\u5e76\u5c06\u5176\u90e8\u7f72\u4e3a RPC \u670d\u52a1\uff0c\u6d4b\u8bd5\u673a\u4e0a\u4e0d\u7528\u5b89\u88c5 OpenCV \u4f9d\u8d56\uff0c\u800c\u662f\u901a\u8fc7\u8bf7\u6c42 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u3010\u539f\u7406\u3011 \u6d4b\u8bd5\u673a\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u56fe\u7247\u4ee5\u53ca\u6a21\u677f\u56fe\u7247\uff0c\u53d1\u9001\u7ed9 RPC \u670d\u52a1\u7aef\uff0c\u670d\u52a1\u7aef\u62ff\u5230\u4e24\u5f20\u56fe\u7247\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u6700\u540e\u5c06\u8bc6\u522b\u7ed3\u679c\u8fd4\u56de\u7ed9\u6d4b\u8bd5\u673a\uff1b \u8981\u7279\u6b8a\u8bf4\u660e\u7684\u662f\uff1a RPC \u662f\u4e00\u79cd\u534f\u8bae\uff0c\u8bb8\u591a\u8bed\u8a00\u90fd\u662f\u652f\u6301\u7684\uff0c\u6bd4\u5982\u8bf4\u670d\u52a1\u7aef\u4e5f\u53ef\u4ee5\u7528 C++ \u6765\u5b9e\u73b0\uff0c\u5ba2\u6237\u7aef\u4f7f\u7528 Python \u4e5f\u662f\u53ef\u4ee5\u8c03\u7528\u7684\u3002 \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 \u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nimport cv2 as cv\nimport numpy as np\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\nif __name__ == \"__main__\":\nserver = ThreadXMLRPCServer((\"x.x.x.x\", 8889), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(match_image_by_opencv, \"match_image_by_opencv\")\nserver.serve_forever()\n \u8fd9\u6837\uff0c\u6211\u4eec\u57fa\u4e8e Python \u6807\u51c6\u5e93 xmlrpc \u642d\u5efa\u4e86\u4e00\u4e2a RPC \u670d\u52a1\u5668\uff0c\u6ce8\u518c\u4e86 image_put \u548c match_image_by_opencv \u4e24\u4e2a\u529f\u80fd\u63a5\u53e3\uff0c\u5728\u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u901a\u8fc7 IP \u548c\u7aef\u53e3\u8fdb\u884c RPC \u8bf7\u6c42\uff1b \u5ba2\u6237\u7aef\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from xmlrpc.client import Binary\nfrom xmlrpc.client import ServerProxy\nserver = ServerProxy(GlobalConfig.OPENCV_SERVER_HOST, allow_none=True)\nscreen_rb = open(screen, \"rb\")\ntemplate_rb = open(template_path, \"rb\")\ntry:\nscreen_path = server.image_put(Binary(screen_rb.read()))\nscreen_rb.close()\ntpl_path = server.image_put(Binary(template_rb.read()))\ntemplate_rb.close()\nreturn server.match_image_by_opencv(\ntpl_path, screen_path, rate, multiple\n)\nexcept OSError as exc:\nraise EnvironmentError(\nf\"RPC\u670d\u52a1\u5668\u94fe\u63a5\u5931\u8d25. {GlobalConfig.OPENCV_SERVER_HOST}\"\n) from exc\n \u901a\u8fc7\u8fd4\u56de server.match_image_by_opencv \u5c31\u83b7\u53d6\u4e86\u5728\u670d\u52a1\u7aef\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4","title":"4\u3001\u53f3\u952e\u83dc\u5355\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41","title":"4.1\u3001\u53f3\u952e\u83dc\u5355\u5b9a\u4f4d\u7684\u65b9\u6848\u53ca\u95ee\u9898","text":"\u53f3\u952e\u83dc\u5355\u7684\u5143\u7d20\u5b9a\u4f4d\u662f\u4e00\u4e2a\u96be\u70b9\uff0c\u8fc7\u53bb\u6211\u4eec\u8c03\u7814\u548c\u4f7f\u7528\u8fc7\u7684\u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u65b9\u6cd5\u6709 4 \u79cd\uff1a \u7b2c\u4e00\u79cd\uff1a\u6b65\u957f\u64cd\u4f5c\u6cd5 \u5728\u53f3\u952e\u83dc\u5355\u547c\u51fa\u6765\u4e4b\u540e\uff0c\u901a\u8fc7\u952e\u76d8\u7684 up\u3001down \u6309\u952e\uff0c\u8fdb\u884c\u9009\u62e9\u83dc\u5355\u9009\u62e9\uff0c\u9009\u4e2d\u76ee\u6807\u4e4b\u540e enter \u5373\u53ef\uff1b\u6bd4\u5982\uff1a\u5728\u684c\u9762\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\uff0c\u6309 1 \u6b21 down \uff0c\u4f1a\u51fa\u73b0\u4e0b\u56fe\uff1a \u7ee7\u7eed\u518d\u6309 2 \u6b21 down\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u518d\u6309 enter\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u5982\u6b64\uff0c\u201c\u6392\u5e8f\u65b9\u5f0f\u201d\u7684\u6b65\u957f\u4e3a 3\uff1b\u901a\u8fc7\u4f7f\u7528\u952e\u76d8\u4e0a\u4e0b\u952e\uff0c\u5c31\u5b9e\u73b0\u4e86\u5bf9\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\uff1b \u4f46\u662f\uff0c\u8fd9\u79cd\u65b9\u5f0f\u6709\u4e2a\u5f88\u70e6\u4eba\u7684\u95ee\u9898\uff0c\u5c31\u662f\u53f3\u952e\u83dc\u5355\u7684\u9009\u9879\u4f4d\u7f6e\u4e0d\u53ef\u80fd\u4e00\u76f4\u4e0d\u53d8\uff0c\u5728\u9700\u6c42\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\uff0c\u83dc\u5355\u9009\u9879\u7684\u53d8\u5316\u662f\u5f88\u5927\u7684\uff0c\u751a\u81f3\u6709\u4e9b\u5e94\u7528\u652f\u6301\u81ea\u5b9a\u4e49\u83dc\u5355\uff0c\u6bd4\u5982\u6587\u7ba1\u53f3\u952e\u83dc\u5355\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff1b \u4e5f\u5c31\u662f\u8bf4\u4f60\u5f97\u7ecf\u5e38\u53bb\u7ef4\u62a4\u83dc\u5355\u9009\u9879\u7684\u6b65\u957f\uff0c\u4e00\u4e2a\u9009\u9879\u73b0\u5728\u7684\u6b65\u957f\u662f 3\uff0c\u4e0b\u4e2a\u8fed\u4ee3\u53ef\u80fd\u5c31\u662f 4 \u6216\u8005 5\u3002 \u7b2c\u4e8c\u79cd\uff1a\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u6cd5 \u628a\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5355\u72ec\u622a\u56fe\u4fdd\u5b58\uff0c\u56fe\u7247\u4e2d\u4ec5\u5305\u542b\u4e00\u4e2a\u83dc\u5355\u9009\u9879\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u8fd9\u6837\uff0c\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5c31\u53ef\u4ee5\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u65b9\u5f0f\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u8fd9\u79cd\u65b9\u5f0f\u4e0d\u7528\u62c5\u5fc3\u83dc\u5355\u9009\u9879\u7684\u987a\u5e8f\u6216\u4f4d\u7f6e\uff0c\u4f46\u662f\u9700\u8981\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff0c\u4e14\u5bb9\u6613\u53d7\u5230\u5b57\u4f53 UI \u53d8\u66f4\u7c7b\u9700\u6c42\u7684\u5f71\u54cd\uff0c\u6bd4\u5982\uff1a\u5b57\u4f53\u5927\u5c0f\u3001\u5b57\u4f53\u95f4\u8ddd\u7b49\u7b49\u9700\u6c42\u53d8\u66f4\u90fd\u4f1a\u5f71\u54cd\uff0c\u6bcf\u6b21\u53d8\u66f4\u4e4b\u540e\u5c31\u9700\u8981\u8fdb\u884c\u5927\u91cf\u56fe\u7247\u8d44\u6e90\u7684\u91cd\u65b0\u622a\u56fe\u66ff\u6362\uff0c\u662f\u4e2a\u6bd4\u8f83\u9ebb\u70e6\u7684\u4e8b\u60c5\uff1b \u7b2c\u4e09\u79cd\uff1a\u76f8\u5bf9\u4f4d\u79fb\u6cd5 \u9f20\u6807\u70b9\u51fb\u53f3\u952e\u7684\u65f6\u5019\uff0c\u9f20\u6807\u7684\u5f53\u524d\u5750\u6807\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u7684\uff0c\u83dc\u5355\u9009\u9879\u7684\u5bbd\uff08 w \uff09\u4e00\u822c\u662f\u56fa\u5b9a\u7684\uff0c\u53d8\u5316\u7684\u662f\u83dc\u5355\u7684\u957f\u5ea6\uff08 h \uff09\uff0c\u53ef\u4ee5\u901a\u8fc7\u67d0\u4e2a\u9009\u9879\u76f8\u5bf9\u4e8e\u9f20\u6807\u7684\u8ddd\u79bb\u5728\u786e\u5b9a\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u901a\u8fc7\u7ef4\u62a4\u83dc\u5355\u9009\u9879\uff08\u76f8\u5bf9\u4f4d\u7f6e\uff09\u76f8\u5bf9\u4e8e\u9f20\u6807\u4f4d\u7f6e\u7684\u8ddd\u79bb\uff0c\u5373\u53ef\u8f7b\u677e\u8ba1\u7b97\u51fa\u83dc\u5355\u9009\u9879\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\u3002 \u4ece\u7406\u8bba\u4e0a\u6b64\u65b9\u6848\u662f\u53ef\u884c\u7684\uff0c\u4f46\u662f\u8fd9\u91cc\u4ecd\u7136\u5b58\u5728\u4e24\u4e2a\u4e25\u91cd\u7684\u95ee\u9898\uff1a \u83dc\u5355\u987a\u5e8f\u6539\u53d8\uff0c\u5bfc\u81f4\u76f8\u5bf9\u8ddd\u79bb\u6539\u53d8\uff0c\u800c\u4e14\u8ddd\u79bb\u662f\u901a\u8fc7\u50cf\u7d20\uff08px\uff09\u6765\u8868\u793a\u7684\uff0c\u4e0d\u60f3\u6b65\u957f\u90a3\u4e48\u53ea\u7ba1\uff0c\u6bcf\u6b21\u9700\u8981\u53bb\u91cf\u4e00\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u70b9\u9ebb\u70e6\uff1b \u9f20\u6807\u5728\u684c\u9762\u4e0d\u540c\u4f4d\u7f6e\u70b9\u51fb\u53f3\u952e\uff0c\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u4f4d\u7f6e\u662f\u4e0d\u540c\u7684\uff0c\u4e0a\u56fe\u7684\u83dc\u5355\u662f\u5728\u9f20\u6807\u7684\u5de6\u4e0b\u65b9\uff0c\u5982\u679c\u4f60\u79fb\u52a8\u9f20\u6807\u5230\u5c4f\u5e55\u56db\u8fb9\uff0c\u4f60\u4f1a\u53d1\u73b0\uff0c\u53f3\u952e\u83dc\u5355\u53ef\u80fd\u51fa\u73b0\u5728\u9f20\u6807\u7684\u56db\u4e2a\u65b9\u5411\uff0c\u4e5f\u5c31\u662f\u8bf4\u4f60\u9700\u8981\u6839\u636e\u9f20\u6807\u7684\u4e0d\u540c\u4f4d\u7f6e\u6765\u5224\u65ad\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u65b9\u5411\uff0c\u800c\u4e0d\u540c\u7684\u65b9\u5411\u4e0a\u8ba1\u7b97\u65b9\u6cd5\u662f\u4e0d\u540c\u7684\uff0c\u6bd4\u5982\uff1a\u53f3\u952e\u83dc\u5355\u5728\u9f20\u6807\u7684\u5de6\u4e0a\uff0c\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\u8ba1\u7b97\u65b9\u6cd5\u4e3a\uff08x - w / 2\uff0c y - h\uff09\uff0c\u8fd9\u6837\u7ef4\u62a4\u8d77\u6765\u53ef\u4ee5\u8bf4\u975e\u5e38\u590d\u6742\uff1b \u57fa\u4e8e\u4ee5\u4e0a\u4e24\u4e2a\u539f\u56e0\uff0c\u6211\u4eec\u5e76\u4e0d\u63a8\u8350\u8fd9\u79cd\u64cd\u4f5c\u65b9\u6848\u3002 \u7b2c\u56db\u79cd\uff1a\u5c5e\u6027\u5b9a\u4f4d \u6709\u540c\u5b66\u8bf4\u5e72\u561b\u4e0d\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u5462\uff0c\u5176\u5b9e\uff0c\u6211\u4eec\u6700\u5f00\u59cb\u60f3\u5230\u7684\u65b9\u6848\u5c31\u662f\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\uff0c\u4f46\u662f\u5728\u5c5e\u6027\u7684 DOM \u6811\u91cc\u600e\u4e48\u4e5f\u627e\u4e0d\u5230\uff0c\u65e0\u6cd5\u5b9a\u4f4d\u5230\uff0c\u6211\u4eec\u4e5f\u8054\u5408\u7814\u53d1\u540c\u5b66\u4e00\u8d77\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u4f46\u6700\u7ec8\u8fd8\u662f\u6ca1\u80fd\u89e3\u51b3\uff0c\u975e\u5e38\u9057\u61be\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42","title":"4.2\u3001\u6700\u65b0\u7684\u53f3\u952e\u83dc\u5355\u7ec8\u6781\u89e3\u51b3\u65b9\u6848","text":"\u7531\u4e8e\u53f3\u952e\u83dc\u5355\u9009\u9879\u51e0\u4e4e\u90fd\u662f\u6587\u672c\uff0c\u90a3\u4e48\u901a\u8fc7 OCR \u8bc6\u522b\uff0c\u51e0\u4e4e\u662f\u6700\u4f18\u7684\u65b9\u6848\uff1a \u4e0d\u7528\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff1b \u4e0d\u4f1a\u53d7\u5230\u83dc\u5355\u9009\u9879\u987a\u5e8f\u6539\u53d8\u7684\u5f71\u54cd\uff1b \u4e0d\u4f1a\u53d7\u5230\u5b57\u4f53 UI \u53d8\u5316\u7684\u5f71\u54cd\uff1b \u5173\u4e8e OCR \u8bc6\u522b\u6211\u4eec\u5728\u540e\u9762\u4f1a\u8be6\u7ec6\u8bb2\u5230\uff0c\u672c\u7ae0\u8282\u4e3b\u8981\u8bb2\u57fa\u4e8e OCR \u8bc6\u522b\uff0c\u6211\u4eec\u5728\u53f3\u952e\u83dc\u5355\u8bc6\u522b\u4e0a\u7684\u7a81\u7834\u548c\u521b\u65b0\uff1b \u4f7f\u7528 OCR \u8bc6\u522b\u53f3\u952e\u83dc\u5355\u867d\u7136\u5df2\u7ecf\u5f88\u5b8c\u7f8e\u4e86\uff0c\u4f46\u662f\u5728\u4e00\u4e9b\u60c5\u51b5\u4e0b\u4ecd\u7136\u5b58\u5728\u4e00\u70b9\u95ee\u9898\uff0c\u5c31\u662f\u5c4f\u5e55\u4e2d\u51fa\u73b0\u591a\u4e2a\u548c\u83dc\u5355\u9009\u9879\u6587\u5b57\u76f8\u540c\u7684\u6587\u5b57\u65f6\uff0c\u6bd4\u5982\u4e0b\u9762\u8fd9\u79cd\u60c5\u51b5\uff1a \u5c4f\u5e55\u6070\u597d\u51fa\u73b0\u4e86\u4e24\u4e2a\u201c\u590d\u5236\u201d\uff0c\u6b64\u65f6\u8981\u5b9a\u4f4d\u5230\u83dc\u5355\u4e2d\u7684 \u201c\u590d\u5236\u201d\uff0c\u5c31\u9700\u8981\u8fdb\u4e00\u6b65\u505a\u6570\u636e\u5904\u7406\uff0c\u6bd4\u5982\uff1aOCR \u8fd4\u56de 2 \u4e2a\u201c\u590d\u5236\u201d\u7684\u5750\u6807\uff0c\u7528\u4f8b\u91cc\u9762\u6765\u5224\u65ad\u7528\u54ea\u4e2a\uff0c\u4ece\u4e1a\u52a1\u4e0a\u5c06\u5904\u7406\u8d77\u6765\u6bd4\u8f83\u9ebb\u70e6\uff0c\u56e0\u4e3a\u4f60\u5f97\u660e\u786e\u77e5\u9053\u83dc\u5355\u5728\u5de6\u8fb9\u8fd8\u662f\u53f3\u8fb9\uff0c\u7136\u540e\u8fd9\u672c\u8eab\u5c31\u662f\u4e0d\u786e\u5b9a\u7684\uff1b \u600e\u4e48\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u5462\uff0c\u8fd9\u5c31\u8981\u8bf4\u9053\u672c\u7ae0\u7684\u4e3b\u9898\uff1a\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b\u3002 \u3010\u539f\u7406\u3011 \u5728\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u524d\u622a\u4e00\u5f20\u56fe\uff0c\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\u518d\u622a\u53d6\u4e00\u5f20\u56fe\uff0c\u4e24\u5f20\u56fe\u552f\u4e00\u53d8\u5316\u7684\u5c31\u662f\u53f3\u952e\u83dc\u5355\uff0c\u5c06\u5176\u4ed6\u76f8\u540c\u7684\u5730\u65b9\u90fd\u5c4f\u853d\u6389\uff0c\u53ea\u7559\u4e0b\u83dc\u5355\u754c\u9762\uff0c\u5982\u6b64\u5373\u53ef\u6d88\u9664\u5e72\u6270\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u5c06\u4e24\u79cd\u56fe\u505a\u524d\u540e\u5bf9\u6bd4\u63d0\u53d6\u53ef\u4ee5\u5f97\u5230\u8fd9\u6837\u7684\u56fe\uff1a \u4f60\u770b\uff0c\u901a\u8fc7\u524d\u540e\u56fe\u7247\u7684\u5bf9\u6bd4\uff0c\u5c06\u76f8\u540c\u7684\u90e8\u5206\u7ed9\u6d88\u9664\u6389\uff0c\u518d\u8fdb\u884c OCR \u8bc6\u522b\uff0c\u8fd9\u6837\u5c31\u4e0d\u4f1a\u6709\u5e72\u6270\u4e86\uff1b \u4ee3\u7801\u5b9e\u73b0\u8bf7\u67e5\u770b src/filter_image.py \uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def filter_image(action):\n\"\"\"\n \u5bf9\u6bd4\u52a8\u4f5c\u524d\u540e\u4e24\u5f20\u56fe\u7247\uff0c\u63d0\u53d6\u4e0d\u540c\u7684\u90e8\u5206\u751f\u6210\u4e00\u5f20\u65b0\u7684\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u65b0\u56fe\u7247\u7684\u8def\u5f84\n :param action: \u52a8\u4f5c\u51fd\u6570\u7684\u51fd\u6570\u5bf9\u8c61\n :return: \u65b0\u56fe\u7247\u7684\u8def\u5f84\n \"\"\"\n action \u662f\u9f20\u6807\u4e8b\u4ef6\uff0c\u56e0\u4e3a\u6b64\u7c7b\u573a\u666f\u4e0d\u4ec5\u4ec5\u5728\u53f3\u952e\u5b58\u5728\uff0c\u5355\u51fb\u3001\u53cc\u51fb\u7b49\u7b49\uff0c\u53ea\u8981\u64cd\u4f5c\u524d\u540e\u540e\u53d8\u5316\u7684\u90fd\u53ef\u4ee5\uff1a from src.mouse_key import MouseKey\naction = (\nMouseKey.click,\nMouseKey.right_click,\nMouseKey.double_click,\nMouseKey.move_to,\n)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5","title":"5\u3001\u52a8\u6001\u56fe\u50cf\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5728\u684c\u9762\u58c1\u7eb8\u5207\u6362\uff0c\u6216\u770b\u56fe\u3001\u76f8\u518c\u5207\u6362\u56fe\u7247\u7c7b\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u7531\u4e8e\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u662f\u4e0d\u56fa\u5b9a\u7684\uff08\u4e0d\u540c\u7248\u672c\u7684\u7cfb\u7edf\u58c1\u7eb8\u4e0d\u540c\u3001\u58c1\u7eb8\u987a\u5e8f\u4e0d\u540c\uff0c\u770b\u56fe\u76f8\u518c\u5728\u56fe\u7247\u8d44\u6e90\u4e0d\u4e00\u5b9a\u56fa\u5b9a\uff09\uff0c\u90a3\u4e48\u5728\u6d4b\u8bd5\u5207\u6362\u58c1\u7eb8\u6216\u8005\u5207\u6362\u56fe\u7247\u7684\u573a\u666f\u65f6\u5c31\u4f1a\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u4f60\u4e0d\u77e5\u9053\u9884\u671f\u662f\u5565\uff0c\u7528\u4f8b\u64cd\u4f5c\u52a8\u6001\u7684\uff0c\u4e5f\u662f\u6781\u4e0d\u7a33\u5b9a\u3002 \u3010\u539f\u7406\u3011 \u5728\u5207\u6362\u56fe\u7247\u4e4b\u524d\u622a\u56fe\u4fdd\u5b58\u5e76\u8fd4\u56de\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u6b21\u8bc6\u522b\u8fd9\u5f20\u56fe\u7247\uff0c\u5982\u679c\u4e0d\u5b58\u5728\uff0c\u8bf4\u660e\u56fe\u7247\u5df2\u7ecf\u5207\u6362\u4e86\uff1b \u793a\u610f\u56fe\uff1a \u8fd9\u6837\uff0c\u6211\u4eec\u622a\u53d6\u4e86\u5f53\u524d\u56fe\u7247\u4e2d\u6bd4\u8f83\u6709\u4ee3\u8868\u6027\u7684\u4f4d\u7f6e\uff08\u4e00\u53ea\u9e1f\uff09\uff0c\u5728\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u7528\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1a \u6211\u4eec\u518d\u62ff\u7740\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd9\u6837\u5728\u5f53\u524d\u56fe\u7247\u4e2d\uff0c\u5c31\u4e0d\u80fd\u627e\u5230\u8fd9\u53ea\u9e1f\u4e86\uff0c\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u662f False\uff0c\u90a3\u4e48\u4e5f\u5c31\u53ef\u4ee5\u5224\u65ad\u56fe\u7247\u5207\u6362\u662f\u6210\u529f\u7684\u3002 \u4ee3\u7801\u793a\u610f\uff1a def save_temporary_picture(_x: int, _y: int, width: int, height: int):\n\"\"\"\n \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u56fe\u7247\u8def\u5f84\n :param x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n :param y: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n :param width: \u5bbd\u5ea6\n :param height: \u9ad8\u5ea6\n :return: \u56fe\u7247\u8def\u5f84\n \"\"\"\n \u6b64\u51fd\u6570\u7528\u4e8e\u5728\u64cd\u4f5c\u4e4b\u524d\u622a\u56fe\u4e00\u5f20\u4e34\u65f6\u56fe\u7247\uff0c\u8fd4\u56de\u56fe\u7247\u8def\u5f84\uff0c\u6700\u540e\u5728\u65ad\u8a00\u7684\u65f6\u5019\u518d\u5c06\u56fe\u7247\u8def\u5f84\u4f5c\u4e3a\u53c2\u6570\u4f20\u5165\u65ad\u8a00\u8bed\u53e5\u5373\u53ef\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ui","title":"\u4e09\u3001\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_1","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u662f\u6211\u4eec\u81ea\u7814\u7684\u4e00\u79cd\u4f7f\u7528\u7b80\u5355\uff0c\u4e14\u6548\u7387\u6781\u9ad8\u3001\u7a33\u5b9a\u6027\u597d\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u57fa\u4e8e\u5143\u7d20\u6309\u94ae\u5728\u5e94\u7528\u4e2d\u7684\u76f8\u5bf9\u4f4d\u7f6e\uff0c\u52a8\u6001\u83b7\u53d6\u5143\u7d20\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff0c\u9002\u7528\u4e8e\u5404\u79cd\u5c4f\u5e55\u5206\u8fa8\u7387\uff08\u5305\u62ec\u9ad8\u5206\u5c4f\u3001\u5bbd\u5c4f\u3001\u5e26\u9c7c\u5c4f\uff09\uff0c\u5f53\u5143\u7d20\u6309\u94ae\u4f4d\u7f6e\u76f8\u5bf9\u4e8e\u5e94\u7528\u754c\u9762\u4f4d\u7f6e\u53d1\u751f\u4fee\u6539\u4e4b\u540e\uff0c\u53ea\u9700\u8981\u6839\u636e UI \u8bbe\u8ba1\u56fe\u4e0a\u7684\u6e90\u6570\u636e\u4fee\u6539\u5bf9\u5e94\u5750\u6807\u6570\u636e\u5c31\u597d\uff0c\u7ef4\u62a4\u975e\u5e38\u7684\u65b9\u4fbf\u3002 \u6b64\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u9002\u7528\u4e8e\u4e00\u4e9b\u5143\u7d20\u4f4d\u7f6e\u76f8\u5bf9\u4e0e\u5e94\u7528\u754c\u9762\u6bd4\u8f83\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u97f3\u4e50\uff0899% \u7684\u5143\u7d20\u5b9a\u4f4d\u91c7\u7528\u8fd9\u79cd\uff0c\u6548\u679c\u975e\u5e38\u597d\uff09\uff0c\u4e0d\u9002\u7528\u4e8e\u754c\u9762\u4e0d\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u622a\u56fe\u5f55\u5c4f\uff0c\u5f88\u660e\u663e\u4e0d\u9002\u7528\u4e8e\u8fd9\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u3002\u8fd9\u79cd\u5168\u65b0\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u6709\u5b83\u7684\u9002\u7528\u6761\u4ef6\uff0c\u5982\u679c\u4f60\u53d1\u73b0\u4f7f\u7528\u5e38\u89c4\u7684\uff08\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u5b9a\u4f4d\uff09\u4e0d\u597d\u505a\u65f6\uff0c\u4e0d\u59a8\u8003\u8651\u4f7f\u7528\u8fd9\u79cd\uff0c\u5176\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff0c\u5e76\u4e14\u8fc5\u901f\u7231\u4e0a\u4ed6\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_1","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5728 UI \u8bbe\u8ba1\u56fe\u4e2d\u6211\u4eec\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u8fb9\u6846\u7684\u8ddd\u79bb\u7684\uff0c\u7136\u540e\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u6280\u672f\u624b\u6bb5\u83b7\u53d6\u5230\u5e94\u7528\u754c\u9762\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u53ca\u5e94\u7528\u7a97\u53e3\u7684\u5927\u5c0f\uff0c\u793a\u610f\u56fe\u5982\u4e0b\uff1a \uff08x1, y1\uff09\u4e3a\u5e94\u7528\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\uff1b\uff08x2, y2\uff09\u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u5de6\u4e0a\u89d2\uff08x1, y1\uff09\u7684\u5750\u6807\uff0c\u90a3\u4e48\u5b9e\u9645\u4e0a\u3010\u64ad\u653e\u6240\u6709\u3011\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\u4e3a\uff1a\uff08 x1 + x2, y1 + y2 \uff09\uff1b \u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5927\u5c0f\uff08w2, h2\uff09\uff0c\u53ef\u4ee5\u4ece UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\uff1b \u5728 UI \u8bbe\u8ba1\u7a3f\u4e0a\u70b9\u51fb\u3010\u64ad\u653e\u6240\u6709\u3011\u56fe\u6807\uff0c\u7136\u540e\u79fb\u52a8\u9f20\u6807\u5c31\u5c31\u53ef\u4ee5\u770b\u5230\u4e0a\u56fe\u7684\u53c2\u8003\u7ebf\u53ca\u6570\u636e\uff1b \u6240\u4ee5\uff0c\u6211\u4eec\u53ef\u4ee5\u8f7b\u677e\u7684\u83b7\u53d6\u5230\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u4e2d\u5fc3\u5750\u6807\u4e3a\uff1a\uff08 x1 + x2 + (w2 / 2), y1 + y2 + ( h2 / 2) \uff09 \u8be6\u7ec6\u6e90\u4ee3\u7801\u8bf7\u67e5\u770b AT \u57fa\u7840\u6846\u67b6: src/button_center.py \u83b7\u53d6\u5e94\u7528\u7a97\u53e3\u7684\u4fe1\u606f \u4f7f\u7528 xdotool \u548c xwininfo \u83b7\u53d6\u5230\u5e94\u7528\u7a97\u53e3\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u5de6\u4e0a\u89d2\uff09\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a app_id = CmdCtl.run_cmd(f\"xdotool search --classname --onlyvisible {self.app_name}\"\n).split(\"\\n\")\napp_id_list = [int(_id) for _id in app_id if _id]\nreturn CmdCtl.run_cmd(f\"xwininfo -id {app_id_list[self.number]}\")\n \u4f7f\u7528\u6b63\u5219\u83b7\u53d6\u7a97\u53e3\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u83b7\u53d6\u914d\u7f6e \u8bfb ini \u914d\u7f6e\u6587\u4ef6\uff0c\u83b7\u53d6\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e0e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a conf = ConfigParser()\nconf.read(self.config_path)\ndirection = conf.get(btn_name, \"direction\")\nposition = [int(i.strip()) for i in conf.get(btn_name, \"location\").split(\",\")]\n \u8ba1\u7b97\u5143\u7d20\u6309\u94ae\u5750\u6807 \u6839\u636e\u5e94\u7528\u7a97\u53e3\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u5927\u5c0f\u3001\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u5927\u5c0f\uff0c\u4f7f\u7528\u4e00\u5b9a\u7684\u7b97\u6cd5\u5373\u53ef\u8ba1\u7b97\u51fa\u5143\u7d20\u6309\u94ae\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u4e2d\u5fc3\u5750\u6807\uff09\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3","title":"3\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u3010\u914d\u7f6e\u65b9\u6cd5\u3011 \u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u7684\u6570\u636e\u6e90\u662f\u5e94\u7528\u5e93\u4e2d\u7684 ui.ini \u914d\u7f6e\u6587\u4ef6\uff1a ;section\n[\u65b0\u5efa\u6b4c\u5355+] ;key = value\ndirection = left_top\nlocation = 180, 268, 21, 21\n section \u662f\u4f60\u6839\u636e\u5bf9\u5e94\u7684\u5143\u7d20\u6309\u94ae\u547d\u540d\uff0c\u4f60\u53ef\u4ee5\u4efb\u610f\u547d\u540d\uff0c\u4f46\u6700\u597d\u6709\u5177\u4f53\u542b\u4e49\uff0c\u4e14\u80fd\u660e\u786e\u8868\u793a\u8fd9\u4e2a\u5143\u7d20\u6309\u94ae\u7684\u540d\u79f0\uff1b\u7528\u4e2d\u62ec\u53f7\u62ec\u8d77\u6765\u5c31\u884c\uff0c\u6bd4\u5982\uff1a[\u65b0\u5efa\u6b4c\u5355+] \uff1b direction \u662f\u914d\u7f6e\u8be5\u5143\u7d20\u7684\u53c2\u8003\u7cfb\uff0c\u5206\u522b\u4e3a\uff1a left_top \u5de6\u4e0a\uff1b left_bottom \u5de6\u4e0b\uff1b right_top \u53f3\u4e0a\uff1b right_bottom \u53f3\u4e0b\uff1b \u53c2\u8003\u7cfb\u7684\u9009\u53d6\u6807\u51c6\uff1a\u62c9\u52a8\u6539\u53d8\u7a97\u53e3\u5927\u5c0f\u65f6\uff0c\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u53c2\u8003\u7cfb\u4f4d\u7f6e\u662f\u4e0d\u53d8\u7684\uff1b location \u662f\u8be5\u5143\u7d20\u6309\u94ae\u7684\u76f8\u5bf9\u4e0e\u53c2\u8003\u7cfb\u7684 x, y \u7684\u8ddd\u79bb\uff0c\u53ca\u5927\u5c0f(w, h)\uff0c\u8fd9\u56db\u4e2a\u6570\u636e\u53ef\u4ee5\u901a\u8fc7 UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\u6570\u636e\uff0c\u5728\u7f16\u8f91\u6a21\u5f0f\u4e0b\uff0c\u70b9\u51fb UI \u56fe\u4e0a\u7684\u6309\u94ae\uff0c\u53f3\u4fa7\u5c31\u4f1a\u51fa\u73b0\u8be5\u5143\u7d20\u6309\u94ae\u7684 x, y, w, h \u6570\u636e\u3002 \u5982\u679c UI \u56fe\u4e0a\u6ca1\u6709\u63d0\u4f9b\u4f60\u60f3\u8981\u7684\u5143\u7d20\u6570\u636e\uff0c\u4f60\u53ef\u4ee5\u76f4\u63a5\u5728\u7cfb\u7edf\u4e2d\u4f7f\u7528\u622a\u56fe\u5f55\u5c4f\u8fdb\u884c\u5c3a\u91cf\uff0c\u8fd9\u662f\u4e00\u79cd\u4e0d\u63a8\u8350\u4f46\u80fd\u7528\u7684\u65b9\u6cd5\u3002 \u3010\u8c03\u7528\u65b9\u6cd5\u3011 \u5728\u5e94\u7528\u5e93\u65b9\u6cd5\u5c42\u8fd9\u6837\u5199\uff1a def click_add_music_list_btn_in_music_by_ui(self):\n\"\"\"\u70b9\u51fb\u65b0\u5efa\u6b4c\u5355\u6309\u94ae\"\"\"\nself.click(*self.ui.btn_center(\"\u65b0\u5efa\u6b4c\u5355+\"))\n self.ui.btn_center() \u662f\u56fa\u5b9a\u5199\u6cd5\uff0c\u53c2\u6570\u5c31\u662f\u914d\u7f6e\u91cc\u9762\u7684 section \u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ocr","title":"\u56db\u3001OCR \u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_2","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 OCR \u65b9\u6848\u5927\u591a\u91c7\u7528\u8c37\u6b4c OCR\uff08Tesseract\uff09\u65b9\u6848\uff0c\u4f46\u662f\u5b83\u5bf9\u4e8e\u4e2d\u6587\u7684\u8bc6\u522b\u975e\u5e38\u5dee\uff0c\u7ecf\u8fc7\u5927\u91cf\u7684\u8c03\u7814\uff0c\u6211\u4eec\u4f7f\u7528 PaddleOCR\uff0c\u5b83\u662f\u4e00\u4e2a\u5f00\u6e90\u7684\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u8bc6\u522b\u5de5\u5177\uff0c\u4e5f\u662f PaddlePaddle \u6700\u6709\u540d\u7684\u4e00\u4e2a\u5f00\u6e90\u9879\u76ee\uff0c\u611f\u5174\u8da3\u7684\u53ef\u4ee5\u70b9\u8fd9\u91cc\u4e86\u89e3\uff0c\u591a\u7684\u4e0d\u8bf4\u4e86\uff0c\u4f60\u53ea\u9700\u8981\u77e5\u9053\u5b83\u5c31\u662f\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_2","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5b89\u88c5\u4ed6\u662f\u4e2a\u5f88\u9ebb\u70e6\u7684\u4e8b\u60c5\uff0c\u867d\u7136\u64cd\u4f5c\u5f88\u7b80\u5355\uff0c\u4f46\u5176\u5b9e\u5b89\u88c5\u5305\u6709\u70b9\u5927\uff0c\u56e0\u6b64\u6211\u4eec\u4e0d\u5e0c\u671b\u76f4\u63a5\u5728 env.sh \u4e2d\u52a0\u5165\u5b83\uff0c\u8fd9\u4f1a\u8ba9\u6574\u4e2a\u81ea\u52a8\u5316\u73af\u5883\u53d8\u5f97\u975e\u5e38\u81c3\u80bf\uff1b \u56e0\u6b64\uff0c\u6211\u4eec\u60f3\u5230\u5c06\u5b83\u505a\u6210\u4e00\u4e2a RPC \u670d\u52a1\u5728\u5176\u4ed6\u673a\u5668\u4e0a\u90e8\u7f72\uff0c\u6d4b\u8bd5\u673a\u901a\u8fc7\u8fdc\u7a0b\u8c03\u7528 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u4f7f\u7528\u5b83\uff1b RPC \u7684\u8c03\u7528\u903b\u8f91\uff1a \u8fd9\u6837\u6211\u4eec\u53ea\u9700\u8981\u5728\u670d\u52a1\u7aef\u90e8\u7f72\u597d OCR \u8bc6\u522b\u7684\u670d\u52a1\uff0c\u7136\u540e\u901a\u8fc7 RPC \u670d\u52a1\u5c06\u529f\u80fd\u63d0\u4f9b\u51fa\u6765\uff0c\u6846\u67b6\u91cc\u9762\u53ea\u9700\u8981\u8c03\u7528\u5bf9\u5e94\u7684 RPC \u63a5\u53e3\u5c31\u884c\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_1","title":"3\u3001\u4f7f\u7528\u8bf4\u660e","text":"\u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nfrom paddleocr import PaddleOCR\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef paddle_ocr(pic_path, lang):\n\"\"\"\n Paddleocr\u76ee\u524d\u652f\u6301\u7684\u591a\u8bed\u8a00\u8bed\u79cd\u53ef\u4ee5\u901a\u8fc7\u4fee\u6539lang\u53c2\u6570\u8fdb\u884c\u5207\u6362\n \u4f8b\u5982`ch`, `en`, `fr`, `german`, `korean`, `japan`\n :param file_name:\n :param lang:\n :return:\n \"\"\"\nif __name__ == \"__main__\":\nIP = popen(\"hostname -I\").read().split(\" \")[0]\nPORT = 8890\nSCREEN_CACHE = \"/tmp/screen.png\"\nserver = ThreadXMLRPCServer((IP, PORT), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(paddle_ocr, \"paddle_ocr\")\nprint(\"\u76d1\u542c\u5ba2\u6237\u7aef\u8bf7\u6c42\u3002\u3002\")\nserver.serve_forever()\n \u6846\u67b6\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from src import OCR\nOCR.ocr(*target_strings, picture_abspath=None, similarity=0.6, return_default=False, return_first=False, lang=\"ch\"):\n# \u901a\u8fc7 OCR \u8fdb\u884c\u8bc6\u522b\u3002\n# target_strings:\n# \u76ee\u6807\u5b57\u7b26,\u8bc6\u522b\u4e00\u4e2a\u5b57\u7b26\u4e32\u6216\u591a\u4e2a\u5b57\u7b26\u4e32,\u5e76\u8fd4\u56de\u5176\u5728\u56fe\u7247\u4e2d\u7684\u5750\u6807;\n# \u5982\u679c\u4e0d\u4f20\u53c2\uff0c\u8fd4\u56de\u56fe\u7247\u4e2d\u8bc6\u522b\u5230\u7684\u6240\u6709\u5b57\u7b26\u4e32\u3002\n# picture_abspath: \u8981\u8bc6\u522b\u7684\u56fe\u7247\u8def\u5f84\uff0c\u5982\u679c\u4e0d\u4f20\u9ed8\u8ba4\u622a\u53d6\u5168\u5c4f\u8bc6\u522b\u3002\n# similarity: \u5339\u914d\u5ea6\u3002\n# return_default: \u8fd4\u56de\u8bc6\u522b\u7684\u539f\u751f\u6570\u636e\u3002\n# return_first: \u53ea\u8fd4\u56de\u7b2c\u4e00\u4e2a,\u9ed8\u8ba4\u4e3a False,\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u6240\u6709\u6570\u636e\u3002\n# lang: `ch`, `en`, `fr`, `german`, `korean`, `japan`\n \u6b64\u65b9\u6848\u5728\u6846\u67b6\u5185\u6ca1\u6709\u5f15\u5165\u4efb\u4f55\u4e09\u65b9\u4f9d\u8d56\u5b8c\u5168\u91c7\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\uff0c\u800c\u4e14\u4f7f\u7528\u65b9\u6cd5\u975e\u5e38\u7b80\u5355\uff0c\u53ea\u9700\u8981\u901a\u8fc7 OCR.ocr() \u5373\u53ef\uff1b \u5bf9\u4e8e\u4e00\u4e9b\u6587\u6848\u7684\u573a\u666f\u975e\u5e38\u9002\u7528\uff0c\u6b64\u65b9\u6cd5\u76f4\u63a5\u8fd4\u56de\u5750\u6807\uff0c\u53ef\u4ee5\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u3002 \u4e5f\u53ef\u4ee5\u7528\u4e8e\u6587\u5b57\u65ad\u8a00\uff0c\u4ee3\u7801\u793a\u610f\uff1a def assert_ocr_exist(\n*args, picture_abspath=None, similarity=0.6, return_first=False, lang=\"ch\"\n):\n\"\"\"\u65ad\u8a00\u6587\u6848\u5b58\u5728\"\"\"\npic = None\nif picture_abspath is not None:\npic = picture_abspath + \".png\"\nres = OCR.ocr(\n*args,\npicture_abspath=pic,\nsimilarity=similarity,\nreturn_first=return_first,\nlang=lang,\n)\nif res is False:\nraise AssertionError(\n(f\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{args}\", f\"{pic if pic else GlobalConfig.SCREEN_CACHE}\")\n)\nif isinstance(res, tuple):\npass\nelif isinstance(res, dict) and False in res.values():\nres = filter(lambda x: x[1] is False, res.items())\nraise AssertionError(\n(\nf\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{dict(res)}\",\nf\"{pic if pic else GlobalConfig.SCREEN_CACHE}\",\n)\n)\n \u5728\u7528\u4f8b\u4e2d\u4f7f\u7528\u65ad\u8a00\uff0c\u793a\u4f8b\uff1a def test_font_manager_021(self):\n\"\"\"\u53f3\u4fa7\u2665-\u6536\u85cf/\u53d6\u6d88\u6536\u85cf\u5b57\u4f53\"\"\"\n# \u5b57\u4f53\u7ba1\u7406\u5668\u754c\u9762\u53f3\u4fa7\u8be6\u60c5\u5217\u8868\uff0c\u9009\u62e9\u672a\u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e / \u6536\u85cf\u5b57\u4f53\n# \u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e\u83dc\u5355\u663e\u793a\u201c\u53d6\u6d88\u6536\u85cf\u201d\uff1b\n...\nself.assert_ocr_exist(\"\u53d6\u6d88\u6536\u85cf\")\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_1","title":"4\u3001\u670d\u52a1\u7aef\u90e8\u7f72","text":"\u6211\u4eec\u76ee\u524d\u662f\u5c06 OCR \u670d\u52a1\u90e8\u7f72\u5728\u666e\u901a\u7684\u529e\u516c\u673a\u4e0a\u7684\uff0c\u5982\u679c\u4f60\u89c9\u5f97\u73b0\u6709\u7684 OCR \u8bc6\u522b\u6027\u80fd\u4e0d\u591f\u597d\uff0c\u6070\u597d\u4f60\u6709\u66f4\u597d\u7684\u673a\u5668\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u5176\u79c1\u6709\u5316\u90e8\u7f72\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41_1","title":"4.1\u3001\u73af\u5883\u5b89\u88c5","text":"\u63a8\u8350\u4f7f\u7528 pipenv \u8fdb\u884c\u73af\u5883\u642d\u5efa\uff1b \u5b89\u88c5 pipenv \uff1a sudo pip3 install pipenv\n \u65b0\u5efa\u4e00\u4e2a\u76ee\u5f55\u4f5c\u4e3a\u73af\u5883\u5305 ocr_env\uff1a cd ~\nmkdir ocr_env\n \u521b\u5efa python 3.7 \u73af\u5883\uff1a cd ocr_env\npipenv --python 3.7\n \u5b89\u88c5 OCR \u4f9d\u8d56\u5305\uff1a pipenv install paddlepaddle -i https://mirror.baidu.com/pypi/simple\npipenv install \"paddleocr>=2.0.1\" -i https://mirror.baidu.com/pypi/simple\n \u4e0d\u51fa\u610f\u5916\uff0c\u8fd9\u6837\u5c31\u628a\u4f9d\u8d56\u5b89\u88c5\u597d\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42_1","title":"4.2\u3001\u542f\u52a8\u670d\u52a1","text":"\u5c06\u57fa\u7840\u6846\u67b6\u4e2d\u7684 scr/ocr/pdocr_rpc_server.py \u6587\u4ef6\u62f7\u8d1d\u5230 ocr_env \u76ee\u5f55\uff0c\u540e\u53f0\u6267\u884c\u5b83\u5c31\u597d\u4e86\uff1a cd ocr_env\nnohup pipenv run python pdocr_rpc_server.py &\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#43","title":"4.3\u3001\u914d\u7f6e\u5f00\u673a\u81ea\u542f\uff08\u901a\u7528\uff09","text":"\u4f60\u80af\u5b9a\u4e0d\u60f3\u6bcf\u6b21\u673a\u5668\u91cd\u542f\u4e4b\u540e\u90fd\u9700\u8981\u624b\u52a8\u542f\u52a8\u670d\u52a1\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u914d\u7f6e\u5f00\u673a\u81ea\u542f\u3002 \u5199\u5f00\u673a\u81ea\u542f\u670d\u52a1\u6587\u4ef6\uff1a sudo vim /lib/systemd/system/ocr.service\n autoocr \u540d\u79f0\u4f60\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff0c\u5199\u5165\u4ee5\u4e0b\u5185\u5bb9\uff1a [Unit]\nDescription=OCR Service\nAfter=multi-user.target\n\n[Service]\nUser=uos\nGroup=uos\nType=idle\nWorkingDirectory=/home/uos/ocr_env\nExecStart=pipenv run python pdocr_rpc_server.py\n\n[Install]\nWantedBy=multi-user.target\n \u6ce8\u610f\u66ff\u6362\u4f60\u7684${USER} \u4fee\u6539\u914d\u7f6e\u6587\u4ef6\u7684\u6743\u9650\uff1a sudo chmod 644 /lib/systemd/system/ocr.service\n \u81ea\u542f\u670d\u52a1\u751f\u6548\uff1a sudo systemctl daemon-reload\nsudo systemctl enable ocr.service\n \u67e5\u770b\u670d\u52a1\u72b6\u6001\uff1a sudo systemctl status ocr.service\n \u4f60\u53ef\u4ee5\u518d\u91cd\u542f\u4e0b\u7535\u8111\uff0c\u770b\u770b\u670d\u52a1\u662f\u4e0d\u662f\u6b63\u5e38\u542f\u52a8\u4e86\uff0c\u6ca1\u62a5\u9519\u5c31 OK \u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_4","title":"\u4e94\u3001\u5c5e\u6027\u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_3","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 UI \u81ea\u52a8\u5316\u5927\u591a\u90fd\u662f\u57fa\u4e8e\u6d4f\u89c8\u5668\u7684\uff0c\u6838\u5fc3\u662f\u5728\u7f51\u9875\u7684 DOM \u6811\u4e0a\u67e5\u627e\u5143\u7d20\uff0c\u5e76\u5bf9\u5176\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\uff1b Linux \u684c\u9762\u5e94\u7528\u5927\u591a\u662f\u91c7\u7528 Qt \u7f16\u5199\u7684\uff0c\u5728 Qt \u4e2d\u4e5f\u662f\u4ece\u6700\u9876\u5c42\u7684 MainWindow \u5f00\u59cb\u6784\u5efa\u5e94\u7528\uff0c\u6240\u4ee5\u903b\u8f91\u4e5f\u662f\u4e00\u6837\u7684\uff0cQt \u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u540c\u6837\u53ef\u4ee5\u901a\u8fc7 DOM \u6811\uff08\u5c5e\u6027\u6811\uff09\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff0c\u6211\u4eec\u79f0\u4e4b\u4e3a\u5c5e\u6027\u5b9a\u4f4d\u3002 \u501f\u52a9\u5f00\u6e90\u5de5\u5177 dogtail \u6211\u4eec\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u83b7\u53d6\uff0c\u4ece\u800c\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\u3002dogtail \u7684\u9879\u76ee\u4ecb\u7ecd\u53ef\u4ee5\u731b\u6233\u8fd9\u91cc\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_3","title":"2\u3001\u4f7f\u7528\u65b9\u6cd5","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#21sniff","title":"2.1\u3001sniff\uff08\u55c5\u63a2\u5668\uff09\u4f7f\u7528","text":"\u5728\u7ec8\u7aef\u8f93\u5165 sniff \u542f\u52a8 AT-SPI Browser mikigo@mikigo-PC:~$ sniff\n \u67e5\u770b\u5e94\u7528\u7684\u6807\u7b7e \u5728 sniff \u91cc\u9762\u53ef\u4ee5\u770b\u5230\u7cfb\u7edf\u4e2d\u5df2\u542f\u52a8\u7684\u5e94\u7528\uff0c\u70b9\u51fb\u5e94\u7528\u540d\u79f0\u524d\u9762\u7684\u4e09\u89d2\u5f62\u56fe\u6807\uff0c\u53ef\u4ee5\u5c55\u5f00\u5e94\u7528\u7684\u6807\u7b7e\uff0c\u6240\u6709\u6807\u7b7e\u4ee5 tree \u7684\u5f62\u5f0f\u5c55\u793a\uff0c\u5bf9\u5e94\u5e94\u7528\u91cc\u9762\u7684\u7236\u7a97\u53e3\u548c\u5b50\u7a97\u53e3\u3002 \u83b7\u53d6\u5143\u7d20\u63a7\u4ef6\u7684\u6807\u7b7e\u540d\u79f0 \u9996\u5148\uff0c\u4e3a\u4e86\u65b9\u4fbf\u67e5\u770b\u5143\u7d20\u63a7\u4ef6\u5bf9\u5e94\u7684\u4f4d\u7f6e\uff0c\u5efa\u8bae\u73b0\u5728\u4e0a\u65b9\u5de5\u5177\u680f\u70b9\u51fb Actions\uff0c\u7136\u540e\u52fe\u9009 Hightlight Items\uff0c\u8fd9\u6837\u5728 sniff \u4e2d\u9f20\u6807\u9009\u4e2d\u5143\u7d20\u6807\u7b7e\u7684\u65f6\u5019\uff0c\u5e94\u7528\u4e2d\u4f1a\u6709\u76f8\u5e94\u7684\u5149\u6807\u9501\u5b9a\u3002 \u5728 sniff \u91cc\u9762\u70b9\u51fb\u8fdb\u5165\u5e94\u7528\u7684\u6807\u7b7e tree \u4e2d\u540e\uff0c\u70b9\u51fb\u76f8\u5e94\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5728\u5de5\u5177\u4e0b\u65b9\uff0c\u4f1a\u5c55\u793a\u5143\u7d20\u63a7\u4ef6\u7684 Name\uff0c\u8fd9\u4e2a\u5c31\u662f\u6807\u7b7e\u540d\u79f0\u3002 \u5728 tree \u4e2d\u6709\u4e9b\u5730\u65b9\u662f\u7a7a\u767d\u7684\u6216\u8005\u662f Form\uff0c\u662f\u56e0\u4e3a\u5f00\u53d1\u4eba\u5458\u5728\u6dfb\u52a0\u6807\u7b7e\u7684\u65f6\u5019\u6ca1\u6709\u6dfb\u52a0\uff0c\u6216\u8005\u6709\u4e9b\u7236\u7a97\u53e3\u4e0d\u9700\u8981\u6dfb\u52a0\uff0c\u8fd9\u79cd\u5728\u5b9e\u9645\u4e1a\u52a1\u4e2d\u662f\u4e0d\u5f71\u54cd\u7684\uff0c\u6211\u4eec\u53ea\u8981\u4fdd\u8bc1\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\u4e2d\uff0c\u8981\u7528\u5230\u7684\u5143\u7d20\u90fd\u6dfb\u52a0\u4e86\u6807\u7b7e\u5373\u53ef\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#22","title":"2.2\u3001\u5143\u7d20\u64cd\u4f5c","text":"\u83b7\u53d6\u5e94\u7528\u5bf9\u8c61 dogtail \u83b7\u53d6\u5e94\u7528\u5bf9\u8c61\u7684\u65f6\u5019\uff0c\u4f7f\u7528\u7684\u662f tree \u5e93\u91cc\u9762\u7684 application() \u65b9\u6cd5\uff1a from dogtail.tree import root\napp_obj = root.application('deepin-music')\n app_obj\u5c31\u662f\u5e94\u7528\u7684\u5bf9\u8c61\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\uff0c\u662f\u5e94\u7528\u5bf9\u8c61\u4f7f\u7528child()\u65b9\u6cd5\uff1a element = app_obj.child('element_name')\n \u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u4f20\u5165\u5143\u7d20\u7684 Name\uff0c\u83b7\u53d6\u5230\u76f8\u5e94\u5143\u7d20\u7684\u5bf9\u8c61\u3002Name \u53ef\u4ee5\u901a\u8fc7 sniff \u67e5\u770b\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\u5217\u8868: element_list = element.children\n \u83b7\u53d6\u5230\u8fd9\u4e2a\u5143\u7d20\u4e0b\u9762\u6240\u6709\u7684\u5143\u7d20\u5217\u8868\u3002 \u8fd9\u4e2a\u65b9\u6cd5\u9002\u7528\u4e8e\u6709\u4e9b\u6807\u7b7e\u6ca1\u6709\u6dfb\u52a0\uff0c\u4f46\u662f\u4f4d\u7f6e\u662f\u56fa\u5b9a\u7684\uff0c\u6211\u4eec\u901a\u8fc7\u7d22\u5f15\u53ef\u4ee5\u53d6\u5f97\u5143\u7d20\u3002 element_list[0]\n \u5bf9\u5143\u7d20\u7684\u64cd\u4f5c \u5728\u83b7\u53d6\u5230\u5143\u7d20\u4e4b\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u76f8\u5e94\u7684\u64cd\u4f5c\u3002 \u5355\u51fb element.click(button=1)\n button 1 \u2014>\u5de6\u952e\uff0c2 \u2014>\u6eda\u8f6e\uff0c3 \u2014>\u53f3\u952e\uff0c\u9ed8\u8ba4\u4e3a 1 \u53cc\u51fb element.doubleClick(button=1)\n \u9f20\u6807\u60ac\u505c element.point()\n \u9f20\u6807\u79fb\u52a8\u5230\u5143\u7d20\u4e2d\u5fc3\u4f4d\u7f6e \u6587\u672c\u8f93\u5165 element.typeText(string)\n \u5411\u5143\u7d20\u5bf9\u8c61\u8f93\u5165\u5b57\u7b26\u4e32 \uff0c\u6bd4\u5982\u8f93\u5165\u6846 \u7ec4\u5408\u952e element.keyCombo(comboString)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#23","title":"2.3\u3001\u6846\u67b6\u5c01\u88c5","text":"\u4ee3\u7801\u793a\u4f8b\uff1a # \u8be6\u7ec6\u4ee3\u7801\u8bf7\u67e5\u770b src/dogtail_utils.py\nclass DogtailUtils:\ndef __init__(self, name=None, description=None):\nself.name = name\nself.description = description\nself.obj = root.application(self.name, self.description)\ndef app_element(self, *args, **kwargs):\n\"\"\"\n \u83b7\u53d6app\u5143\u7d20\u7684\u5bf9\u8c61\n :return: \u5143\u7d20\u7684\u5bf9\u8c61\n \"\"\"\nreturn self.obj.child(*args, **kwargs, retry=False)\ndef element_center(self, element) -> tuple:\n\"\"\"\n \u83b7\u53d6\u5143\u7d20\u7684\u4e2d\u5fc3\u4f4d\u7f6e\n :param element:\n :return: \u5143\u7d20\u4e2d\u5fc3\u5750\u6807\n \"\"\"\n_x, _y, _w, _h = self.app_element(element).extents\n_x = _x + _w / 2\n_y = _y + _h / 2\nreturn _x, _y\n \u6846\u67b6\u63d0\u4f9b\u7684\u63a5\u53e3\u975e\u5e38\u7b80\u6d01\uff0c\u5728\u8c03\u7528\u65f6\uff1a self.dog.element_center(\"\u64ad\u653e\")\n \u8fd9\u6837\u5c31\u80fd\u83b7\u53d6\u5230\u6b64\u5143\u7d20\u7684\u4e2d\u5fc3\u5750\u6807\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_5","title":"\u516d\u3001\u6807\u7b7e\u5316\u7ba1\u7406","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_4","title":"1\u3001\u6807\u7b7e\u8bf4\u660e","text":"\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u811a\u672c ID\uff1a\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c/\u51fd\u6570 ID\uff1b PMS\u7528\u4f8bID\uff1aPMS \u4e0a\u5bf9\u5e94\u7684\u7528\u4f8b ID\uff08\u7528\u4f8b\u5e93 ID\uff09\uff1b \u9ed8\u8ba4\u4f7f\u7528\u7528\u4f8b\u5e93 ID\uff0c\u5bf9\u4e8e\u6682\u65f6\u6ca1\u6709\u4f7f\u7528\u7528\u4f8b\u5e93\u7ba1\u7406\u7528\u4f8b\u7684\u9879\u76ee\uff0c\u53ef\u4ee5\u4f7f\u7528\u4ea7\u54c1\u5e93\u7528\u4f8b ID\uff1b \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1aFUNC\uff08\u529f\u80fd\uff09\u3001API\uff08\u63a5\u53e3\uff09\u3001BASELINE\uff08\u57fa\u7ebf\uff09\u3001PERF\uff08\u6027\u80fd\uff09\u3001STR\uff08\u538b\u529b\uff09\u3001SEC\uff08\u5b89\u5168\uff09\u3001CTS\uff08\u517c\u5bb9\u6027\uff09 \u4e0a\u7ebf\u5bf9\u8c61\uff1aCICD\uff0c\u8868\u793a\u4e0a\u7ebf\u5230 CICD \u6d41\u6c34\u7ebf\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u53ef\u4e00\u952e\u751f\u6210 case_list.csv \u6587\u4ef6\uff0c\u7528\u4e8e\u5bfc\u5165\u5230\u660e\u9053\u4e91 AT \u7528\u4f8b\u5217\u8868\u4e2d\u63a7\u5236 CICD \u8dd1\u6d4b\u8303\u56f4\uff1b \u6d4b\u8bd5\u7ea7\u522b\uff1aC1 / C2 / C3 / C4\uff0c\u5177\u4f53\u5b9a\u4e49\u53c2\u8003\u6d41\u6c34\u7ebf\u4f7f\u7528\u6307\u5bfc\uff1b \u8df3\u8fc7\u539f\u56e0\uff1askip-XXX\uff0c\u7528\u4e8e\u63a7\u5236\u7528\u4f8b\u662f\u5426\u6267\u884c\uff1b \u786e\u8ba4\u4fee\u590d\uff1afixed-XXX\uff0c\u7528\u4e8e\u6807\u8bb0\u7528\u4f8b\u7684\u4fee\u590d\u72b6\u6001\uff08\u540e\u9762\u8be6\u7ec6\u8bb2\u89e3\u7528\u6cd5\uff09\uff1b \u5e9f\u5f03\u7528\u4f8b\uff1aremoved-\u5df2\u5e9f\u5f03\uff0c\u7528\u4e8e\u6807\u8bb0\u5df2\u7ecf\u5e9f\u5f03\u7684\u7528\u4f8b\uff0c\u6b64\u7528\u4f8b\u6807\u7b7e\u4e0d\u4f1a\u88ab\u6dfb\u52a0\uff0c\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff1b \u793a\u4f8b\uff1a \u811a\u672cID PMS\u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u4e0a\u7ebf\u5bf9\u8c61 \u6d4b\u8bd5\u7ea7\u522b \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b ... 001 679537 L1 FUNC CICD C1 skip-XXX fixed-XXX removed-\u5df2\u5e9f\u5f03 ..."},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_4","title":"2\u3001\u64cd\u4f5c\u6b65\u9aa4","text":"2.1\u3001\u5728\u5b50\u9879\u76ee\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u4ee5\u7528\u4f8b\u7684 py \u6587\u4ef6\u9664\u53bb\u9996\u5b57\u7b26\u4e32 \"test_\" \u548c\u7528\u4f8b\u5e8f\u53f7\u540e\u7684\u5b57\u7b26\u4e32\u4f5c\u4e3a csv \u7684\u6587\u4ef6\u540d\u3002 \u4f8b\u5982: \u76f8\u518c\u7684\u7528\u4f8b\u6587\u4ef6\u4e3a test_album_xxx.py\uff0cxxx \u8868\u793a\u4efb\u610f\u4e09\u4f4d\u6570\u5b57\u4ee3\u8868\u7528\u4f8b\u5e8f\u53f7\uff0c\u6b64\u65f6 csv \u6587\u4ef6\u540d\u5c31\u5e94\u4e3a album.csv\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u6240\u6709 csv \u6587\u4ef6\u5efa\u8bae\u653e\u5728\u4e00\u4e2a tags \u76ee\u5f55\u4e0b\u3002 \u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 2.2\u3001\u7b2c\u4e00\u5217\u4e3a\u811a\u672c ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b\u7528\u4f8b\u6807\u7b7e\u53ef\u4ee5\u65e0\u5e8f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_2","title":"3\u3001\u589e\u52a0\u8bf4\u660e","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_1","title":"3.1\u3001\u8df3\u8fc7\u7528\u4f8b","text":"\u4f20\u7edf\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668(@pytest.mark.skip)\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a; \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#311","title":"3.1.1\u3001\u56fa\u5b9a\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u7b7e\u5f00\u5934\u4e3a \u201cskip-XXX\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\uff0c\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\u5219\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u7b7e\u4e3a SKIPED\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#312","title":"3.1.2\u3001\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skipif_platform-aarch64&mips64 \u67d0\u4e9b\u7528\u4f8b\u4f1a\u56e0\u4e3a\u4e0d\u540c\u7684\u73af\u5883\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\uff0c\u5e38\u89c1\u7684\u573a\u666f\u4e3a\u5728\u4e0d\u540c\u67b6\u6784\u4e0a\u5224\u65ad\u662f\u5426\u6267\u884c\uff0c\u8df3\u8fc7\u7684\u539f\u56e0\u6807\u7b7e\u4e3a \u201cskipif_platform-\u201d \u52a0\u67b6\u6784\u540d\uff0c\u591a\u4e2a\u67b6\u6784\u4e4b\u95f4\u4f7f\u7528 \u201c&\u201d \u62fc\u63a5\uff1b \u4ee5\u4e0a\u4f8b\u5b50\u4e3a\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u5224\u65ad\u5f53\u524d\u67b6\u6784\u662f\u5426\u4e3a arrch64 \u6216\u8005 mips64\uff0c\u82e5\u662f\uff0c\u5219\u8df3\u8fc7\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u82e5\u5426\u5219\u6267\u884c\u7528\u4f8b\uff1b \u76ee\u524d\u6846\u67b6\u9ed8\u8ba4\u4ec5\u652f\u6301\u67b6\u6784\u7684\u6761\u4ef6\u5224\u65ad\uff0c\u4f46\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u903b\u8f91\u652f\u6301\u81ea\u5b9a\u4e49\u6dfb\u52a0\u3002 \u5728\u9879\u76ee\u76ee\u5f55\u8def\u5f84\u4e0b\u5b58\u5728\u6587\u4ef6 setting/skipif.py\uff0c\u6240\u6709\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u7684\u51fd\u6570\u5199\u5728\u6b64\u6587\u4ef6\u4e2d\u3002 \u9ed8\u8ba4\u67b6\u6784\u5224\u65ad\u4f8b\u5b50\uff1a def skipif_platform(args: str):\n\"\"\"\u5e73\u53f0\u8df3\u8fc7\"\"\"\n_skip_key = args.split(\"&\")\nfor key in _skip_key:\nif GlobalConfig.SYS_ARCH == key:\nreturn True\nreturn False\n \u65b9\u6cd5\u7f16\u5199\u89c4\u8303\uff1a \u65b9\u6cd5\u540d\u5fc5\u987b\u4ee5 skipif \u5f00\u5934\uff1b \u65b9\u6cd5\u5fc5\u987b\u6709\u8fd4\u56de\u7ed3\u679c\u5e76\u4e14\u4e3a\u5e03\u5c14\u503c\uff08True \u4ee3\u8868\u8df3\u8fc7\uff0cFalse \u4ee3\u8868\u4e0d\u8df3\u8fc7\uff09\uff1b \u65b9\u6cd5\u53ea\u80fd\u6709\u4e00\u4e2a\u5165\u53c2\uff1b \u5728 csv \u6587\u4ef6\u8df3\u8fc7\u539f\u56e0\u4e00\u680f\u4e2d\u586b\u5199\u4e3a \u201c{\u51fd\u6570\u540d}-{\u53c2\u6570}\u201d\uff0c\u4f8b\u5982\uff1askipif_platform-aarch64\uff1b\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u4f1a\u4ee5\u7b2c\u4e00\u4e2a \u201c-\u201d \u8fdb\u884c\u5206\u5272\uff0c\u622a\u53d6\u7684\u5de6\u4fa7\u5b57\u7b26\u4e32\u4f5c\u4e3a\u51fd\u6570\u540d\uff0c\u5728 skipif.py \u6587\u4ef6\u4e2d\u67e5\u627e\u662f\u5426\u6709\u540c\u540d\u51fd\u6570\uff0c\u5e76\u5c06\u622a\u53d6\u7684\u53f3\u4fa7\u4f5c\u4e3a\u53c2\u6570\u4f20\u9012\u7ed9\u8be5\u51fd\u6570\uff0c\u901a\u8fc7\u83b7\u53d6\u8be5\u51fd\u6570\u8fd4\u56de\u7684\u5e03\u5c14\u503c\uff0c\u8fd4\u56de True\uff0c\u5219\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u8fd4\u56de False\uff0c\u5219\u6267\u884c\u8be5\u7528\u4f8b\u3002 \u82e5\u51fd\u6570\u9700\u8981\u591a\u4e2a\u53c2\u6570\uff0c\u53ef\u81ea\u5b9a\u4e49\u591a\u4e2a\u53c2\u6570\u4e4b\u95f4\u7684\u8fde\u63a5\u7b26\uff0c\u8fde\u63a5\u7b26\u53f7\u4e0d\u53ef\u4f7f\u7528\u4e0b\u5212\u7ebf\u548c\u9017\u53f7\uff0c\u63a8\u8350\u7edf\u4e00\u4f7f\u7528 & \u7b26\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32","title":"3.2\u3001\u786e\u8ba4\u4fee\u590d","text":"\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7528\u4f8b\u4fee\u590d\u540e\uff0c\u4f46\u4e0d\u80fd\u7acb\u5373\u5220\u9664\u8df3\u8fc7\u539f\u56e0\uff08skip-XXX\uff09\u7684\u7528\u4f8b\uff0c\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u786e\u8ba4\u4fee\u590d\u201d\uff0c\u4f5c\u4e3a\u6807\u8bb0\u8be5\u7528\u4f8b\u662f\u5426\u5df2\u7ecf\u4fee\u590d\uff0c\u56fa\u5b9a\u586b\u5165\u5b57\u6bb5\u4e3a \u201cfixed-\u5df2\u4fee\u590d\u201d\u3002\u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u5373\u4f7f\u540c\u65f6\u6807\u8bb0\u4e86 skip-XXX \u4e5f\u4f1a\u6b63\u5e38\u6267\u884c\u3002 \u793a\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d \u3010\u540c\u65f6\u6807\u8bb0\u4e86skip \u548c fixed\uff0c\u4f46\u4ecd\u7136\u60f3\u8981\u8df3\u8fc7\u7528\u4f8b\u3011 \u5f53 \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u540c\u65f6\u586b\u5165\u540e\uff0c\u547d\u4ee4\u884c\u4f20\u9012\u53c2\u6570 --ifixed yes\uff0c\u5219\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\u8be5\u6761\u7528\u4f8b\u3002 python3 manage.py run --ifixed yes\n \u770b\u5230\u8fd9\u91cc\u6709\u4e9b\u540c\u5b66\u53ef\u80fd\u8981\u95ee\u4e86\uff0c\u6211\u60f3\u6062\u590d\u8df3\u8fc7\u6267\u884c\uff0c\u76f4\u63a5\u628a skip-XXX \u8fd9\u4e00\u5217\u6807\u7b7e\u5220\u6389\u4e0d\u5c31\u597d\u4e86\uff0c\u8fd8\u641e\u4ec0\u4e48\u786e\u8ba4\u4fee\u590d\u5e72\u5565\uff1f \u8fd9\u91cc\u7ed9\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u89e3\u91ca\u4e00\u4e0b\uff1a \uff08\u4ee5\u4e0b\u6d41\u6c34\u7ebf\u6307\u7684\u662f\u6bcf\u65e5\u6784\u5efa\u7684\u6d41\u6c34\u7ebf\uff0c\u8dd1 AT \u7684\u5168\u91cf\u7528\u4f8b\uff09 \u9996\u5148\uff0c\u6d41\u6c34\u7ebf\u4e0a\u8dd1\u7684\u662f AT \u5386\u53f2 Tag\uff0c\u8df3\u8fc7\u7528\u4f8b\u7684\u6807\u7b7e(skip-XXX) \u662f\u5728\u6700\u65b0\u7684\u4ee3\u7801\u4e0a\u63d0\u4ea4\u7684\uff0c\u6211\u4eec\u91c7\u7528\u6700\u65b0\u7684 csv \u6587\u4ef6\u8986\u76d6\u5386\u53f2 csv \u6587\u4ef6\u7684\u8bbe\u8ba1\u6765\u5b9e\u73b0\u4e86\u5bf9\u5386\u53f2 Tag \u4e0a\u7528\u4f8b\u7684\u8df3\u8fc7\uff1b \u7136\u540e\uff0c\u5728\u65e5\u5e38\u8df3\u8fc7\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u540c\u65f6\u4e5f\u5728\u4fee\u590d\u4e00\u4e9b\u7528\u4f8b\uff0c\u4fee\u590d\u540e\u7684\u8fd9\u4e9b\u7528\u4f8b\u5728\u672c\u5730\u8c03\u8bd5\u7684\u65f6\u5019\u6211\u4eec\u4e0d\u5e0c\u671b\u7ee7\u7eed\u8df3\u8fc7\uff0c\u4f46\u662f\u6b64\u65f6\uff0c\u4fee\u590d\u7684\u8fd9\u4e9b\u7528\u4f8b\u53ef\u80fd\u8fd8\u4e0d\u7a33\u5b9a\uff0c\u4e0d\u9002\u5408\u9a6c\u4e0a\u653e\u5230\u6d41\u6c34\u7ebf\u53bb\u8dd1\uff0c\u4e5f\u5c31\u662f\u8bf4\u6d41\u6c34\u7ebf\u4e0a\u6211\u4eec\u662f\u5e0c\u671b\u4ed6\u7ee7\u7eed\u8df3\u8fc7\u7684\uff0c\u56e0\u6b64\uff0c\u54b1\u4e0d\u80fd\u76f4\u63a5\u628a skip-XXX \u5e72\u6389\uff1b \u8fd9\u91cc\u5c31\u77db\u76fe\u4e86\uff0c\u4e00\u4e2a\u9700\u6c42\u662f\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u53e6\u4e00\u4e2a\u9700\u6c42\u53c8\u4e0d\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u600e\u4e48\u529e\u5462\uff1f \u6211\u4eec\u4f7f\u7528\u201c\u786e\u8ba4\u4fee\u590d\u201d\u6765\u6807\u8bb0\u8fd9\u6761\u7528\u4f8b\u5df2\u7ecf\u4fee\u590d\u4e86\uff0c\u8fd9\u6837\u4f60\u672c\u5730\u8c03\u8bd5\u7528\u4f8b\u7684\u65f6\u5019\u8fd9\u6761\u5df2\u4fee\u590d\u7684\u7528\u4f8b\u662f\u4f1a\u6267\u884c\u7684\uff0c\u540c\u65f6\u5728\u6d41\u6c34\u7ebf\u4e0a\u5c06 --ifixed yes \u53c2\u6570\u52a0\u4e0a\uff0c\u90a3\u4e48\u6d41\u6c34\u7ebf\u4e0a\u6267\u884c\u65f6\u8fd9\u6761\u7528\u4f8b\u4ecd\u7136\u662f\u8df3\u8fc7\u7684\u72b6\u6001\uff0c\u540e\u7eed\u4f60\u6253 Tag \u7684\u65f6\u5019\uff0c\u628a \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u7684\u6807\u7b7e\u5168\u90e8\u5220\u6389\u5c31\u53ef\u4ee5\u4e86\u3002 \u8fd9\u5c31\u662f\u201c\u786e\u8ba4\u4fee\u590d\u201d\u8fd9\u4e2a\u6807\u7b7e\u7684\u80cc\u666f\uff0c\u9700\u8981\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u54c1\u4e00\u54c1\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#33","title":"3.3\u3001\u5e9f\u5f03\u7528\u4f8b","text":"\u9488\u5bf9\u67d0\u4e9b\u7528\u4f8b\uff0c\u7531\u4e8e\u9700\u6c42\u53d8\u66f4\uff0c\u73af\u5883\u5f71\u54cd\u6216\u8bc4\u4f30\u4e0d\u518d\u9002\u7528\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u65f6\uff0c\u7528\u4f8b\u9700\u8981\u5e9f\u5f03\uff0c\u5219\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u5e9f\u5f03\u7528\u4f8b\u201d\uff0c\u8be5\u5217\u5b58\u5728 \u201cremoved-{\u5e9f\u5f03\u539f\u56e0}\u201d\uff0c\u5219\u7528\u4f8b\u4e0d\u4f1a\u6267\u884c\u3002 \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d removed-\u5df2\u5e9f\u5f03 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_2","title":"4\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u4e0a\u9762\u4ecb\u7ecd Pytest \u6846\u67b6\u63d0\u4f9b\u7684\u6807\u7b7e\u529f\u80fd mark\uff0c\u4f7f\u7528\u65f6\u9700\u8981\u4e3a\u6bcf\u4e00\u4e2a\u7528\u4f8b\u6dfb\u52a0\u6807\u7b7e\u88c5\u9970\u5668\uff0c\u5219\u64cd\u4f5c\u590d\u6742\uff0c\u53ef\u7ef4\u62a4\u6027\u5dee\uff0c\u5176\u6839\u672c\u95ee\u9898\u5c31\u662f\u6807\u7b7e\u5206\u6563\u5728\u6bcf\u4e00\u6761\u7528\u4f8b\u7684\u88c5\u9970\u5668\u4e0a\uff0c\u96be\u4ee5\u96c6\u4e2d\u7ef4\u62a4\uff1b\u4e8e\u662f\u4e4e\u5c06\u6240\u6709\u6807\u7b7e\u4f7f\u7528 csv \u6587\u4ef6\u8fdb\u884c\u96c6\u4e2d\u7ba1\u7406\uff0c\u5e76\u901a\u8fc7 Pytest \u7684\u94a9\u5b50\u51fd\u6570\uff0c\u8bfb\u53d6 csv \u6587\u4ef6\uff0c\u52a8\u6001\u6dfb\u52a0\u6807\u7b7e\u5230\u7528\u4e2d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5csv","title":"5\u3001CSV\u6587\u4ef6\u683c\u5f0f","text":"\u6b64\u914d\u7f6e\u6587\u4ef6\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u6807\u7b7e\u6570\u636e\uff0c\u4e14\u8981\u65b9\u4fbf\u80fd\u4f7f\u7528Excel\u6253\u5f00\u8fdb\u884c\u7f16\u8f91\u67e5\u770b\uff0c\u66f4\u91cd\u8981\u7684\u662f\u6211\u4eec\u4e0d\u60f3\u5f15\u5165\u4e09\u65b9\u4f9d\u8d56\uff0cCSV \u6587\u4ef6\u51e0\u4e4e\u662f\u552f\u4e00\u80fd\u6ee1\u8db3\u6240\u6709\u7684\u8981\u6c42\u7684\u6587\u4ef6\u683c\u5f0f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_6","title":"\u4e03\u3001\u65e5\u5fd7\u7cfb\u7edf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_5","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e YouQu \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u64cd\u4f5c\u65b9\u6cd5\u5c01\u88c5\u5199\u6cd5\uff0c\u901a\u5e38\u662f\u8fd9\u6837\u7684\uff1a\u7c7b\u91cc\u9762\u4e00\u4e2a\u51fd\u6570\u53ea\u5305\u542b\u4e00\u4e2a\u64cd\u4f5c\u6216\u591a\u6b21\u8c03\u7528\u7684\u4e00\u7cfb\u5217\u53ef\u5408\u5e76\u7684\u64cd\u4f5c\uff1b \u4f20\u7edf\u7684\u65e5\u5fd7\u8f93\u51fa\u65b9\u5f0f\uff0c\u9700\u8981\u5728\u6bcf\u4e2a\u51fd\u6570\u91cc\u9762\u4e3b\u52a8\u7f16\u5199\u65e5\u5fd7\u8f93\u51fa\u4ee3\u7801 \uff0c\u4f8b\u5982\uff1a class XXXWidget:\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\nlogger.info(\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\")\n...\n# \u7701\u7565\u4ee3\u7801\u90e8\u5206\n \u4e00\u4e2a\u51fd\u6570\u91cc\u9762\u81f3\u5c11\u5305\u542b\u4e00\u6761\u65e5\u5fd7\u4fe1\u606f\uff0c\u5982\u679c\u6bd4\u8f83\u590d\u6742\u64cd\u4f5c\u6b65\u9aa4\uff0c\u53ef\u80fd\u5305\u542b\u591a\u6761\u65e5\u5fd7\u4fe1\u606f\uff1b \u4e00\u4e2a\u5e94\u7528\u542b\u6709\u5927\u91cf\u7684\u64cd\u4f5c\u51fd\u6570\uff0c\u4e5f\u5c31\u662f\u8bf4\u6211\u4eec\u9700\u8981\u5199\u5927\u91cf\u7684\u65e5\u5fd7\u4ee3\u7801\uff1b \u901a\u8fc7\u7ecf\u9a8c\u89c2\u5bdf\uff0c\u6211\u4eec\u53d1\u73b0\uff0c\u51fd\u6570\u8bf4\u660e\u4ee5\u53ca\u51fd\u6570\u64cd\u4f5c\u65e5\u5fd7\uff0c\u5177\u6709\u8f83\u9ad8\u7684\u91cd\u590d\u5ea6\uff08\u4ece\u4e0a\u9762\u7684\u4f8b\u5b50\u4e5f\u53ef\u4ee5\u770b\u51fa\u6765\uff09\uff0c\u56e0\u6b64\u6211\u4eec\u5927\u80c6\u7684\u8bbe\u60f3\uff0c\u80fd\u4e0d\u80fd\u57fa\u4e8e\u6846\u67b6\u6267\u884c\u65f6\uff0c\u81ea\u52a8\u7684\u5c06\u51fd\u6570\u8bf4\u660e\u4f5c\u4e3a\u65e5\u5fd7\u6253\u5370\u51fa\u6765\uff0c\u4ece\u800c\u51cf\u5c11\u5927\u91cf\u65e5\u5fd7\u4ee3\u7801\u91cf\u548c\u91cd\u590d\u7f16\u5199\uff0c\u90a3\u771f\u662f\u5999\u554a~\u3002 \u57fa\u4e8e\u6b64\u201c\u5929\u771f\u201d\u7684\u60f3\u6cd5\uff0c\u6211\u4eec\u8bbe\u8ba1\u51fa\u4e86 youqu \u7684\u65e5\u5fd7\u7cfb\u7edf\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_5","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u6838\u5fc3\u539f\u7406\uff1a \u901a\u8fc7\u7ed9\u7c7b\u52a0\u4e0a\u4e00\u4e2a\u88c5\u9970\u5668 @log\uff0c\u52a8\u6001\u7ed9\u8be5\u7c7b\u4e0b\u6240\u6709\u7684\u51fd\u6570\u53ca\u7236\u7c7b\u51fd\u6570\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668 @_trace\uff0c\u5728\u6b64\u88c5\u9970\u5668\u4e2d\u6211\u4eec\u80fd\u52a8\u6001\u7684\u6355\u83b7\u6240\u8c03\u7528\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff08func.__doc__\uff09\uff0c\u901a\u8fc7\u65e5\u5fd7\u8f93\u51fa\u5668\u5c06\u5176\u8f93\u51fa\u5373\u53ef\u3002 \u5b9e\u73b0\u6b65\u9aa4\uff1a \u901a\u8fc7 inspect.getmembers \u83b7\u53d6\u88ab\u88c5\u9970\u7684\u7c7b\u4e0b\u6240\u6709\u51fd\u6570\uff0c\u5305\u542b\u9759\u6001\u65b9\u6cd5\uff0c\u7c7b\u65b9\u6cd5\uff0c\u5b9e\u4f8b\u65b9\u6cd5\uff1b \u901a\u8fc7 setattr(\u7c7b, \u65b9\u6cd5, _trace\uff09 \u7684\u65b9\u5f0f\uff0c\u7ed9\u7b26\u5408\u6761\u4ef6\u7684\u51fd\u6570\uff0c\u52a8\u6001\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_3","title":"3\u3001\u65e5\u5fd7\u914d\u7f6e","text":"[log_cli]\n;\u65e5\u5fd7\u76f8\u5173\u914d\u7f6e\uff08\u4e0d\u6253\u5370\u6784\u9020\u51fd\u6570\u548c\u9b54\u6cd5\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff09\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = INFO\n# ============= \u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u914d\u7f6e ================\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u5f00\u5934\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7, \u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_STARTSWITH = Assert\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u7ed3\u5c3e\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_ENDSWITH = Widget\n;\u652f\u6301\u7c7b\u540d\u5305\u542b xxx \u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_CONTAIN = ShortCut\n# ==============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_3","title":"4\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u5728\u5e94\u7528\u5e93 widget \u65b9\u6cd5\u5e93\u91cc\u9762\uff0c\u53ea\u9700\u8981\u5728\u51fa\u53e3\u6587\u4ef6\u52a0\u4e0a\u7c7b\u88c5\u9970\u5668\uff0c\u5c31\u53ef\u4ee5\u5b9e\u73b0\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u4e86\uff1b # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6ce8\u610f\uff0c\u662f\u7c7b\u88c5\u9970\u5668\u3002 \u5b9e\u4f8b\uff1a # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\n@classmethod\ndef find_dfm_image(cls, *elements, multiple=False, rate=0.9):\n\"\"\"\n \u67e5\u627e\u56fe\u7247 {{elements}}.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e {{rate}} \u7684\u5750\u6807\n :param elements:\n :param multiple:\n :return:\n \"\"\"\nelement = tuple(map(lambda x: f\"{Config.PIC_RES_PATH}/{x}\", elements))\nreturn cls.find_image(*element, multiple=multiple)\n \u8c03\u7528\u65b9\u6cd5\u65f6\uff1a DfmWidget.find_dfm_image(\"dfm_001\")\n \u81ea\u52a8\u8f93\u51fa\u7684\u65e5\u5fd7\uff1a >> x86_64-uos-6: 02/28 17:48:47 | INFO | logger_utils: [find_dfm_image]: \u67e5\u627e\u56fe\u7247 dfm_001.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e 0.9 \u7684\u5750\u6807\n \u52a0\u4e0a\u88c5\u9970\u5668 @log \u4e4b\u540e\uff0c\u65b9\u6cd5\u5c42\u6240\u6709\u7684\u51fd\u6570\uff08\u5305\u62ec\u5b9e\u4f8b\u65b9\u6cd5\u3001\u7c7b\u65b9\u6cd5\u3001\u9759\u6001\u65b9\u6cd5\uff09\u90fd\u4e0d\u9700\u8981\u518d\u5199\u65e5\u5fd7\u4ee3\u7801\uff0c\u6267\u884c\u7684\u65f6\u5019\u4f1a\u81ea\u52a8\u8f93\u51fa\uff0c\u5e76\u4e14\u6240\u6709\u8c03\u7528\u7684\u65b9\u6cd5\u4f1a\u4ee5 allure.step \u7684\u65b9\u5f0f\uff0c\u5c55\u793a\u5728 allure \u62a5\u544a\u4e2d\uff0c\u5728\u62a5\u544a\u4e2d\u66f4\u80fd\u4e00\u76ee\u4e86\u7136\u7684\u770b\u5230\u7528\u4f8b\u6267\u884c\u6b65\u9aa4\u3002 \u3010\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\u3011 \u901a\u8fc7\u89c2\u5bdf\u524d\u9762\u7684\u4f8b\u5b50\uff0c\u7ec6\u5fc3\u7684\u540c\u5b66\u53ef\u80fd\u8fd8\u53d1\u73b0\u4e86\u4e00\u4e2a\u5c0f\u7ec6\u8282\uff1a\u51fd\u6570\u529f\u80fd\u8bf4\u660e\u4e2d\uff0c\u4e24\u5bf9\u5927\u62ec\u53f7\u4e2d\u7684\u5185\u5bb9 {{elements}} \u4f5c\u4e3a\u53d8\u91cf\u8f93\u51fa\u51fa\u6765\u4e86\uff1b \u6ca1\u9519\uff0c\u8fd9\u5c31\u662f\u6211\u4eec\u53c2\u8003Django \u548c jinja2 \u7684\u6a21\u677f\u8bed\u6cd5\u8bbe\u8ba1\u51fa\u7684\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\uff0c\u4f7f\u7528\u65b9\u6cd5\u5f88\u7b80\u5355\uff0c\u7528\u4e24\u5bf9\u5927\u62ec\u53f7\u628a\u51fd\u6570\u7684\u53c2\u6570\u62ec\u8d77\u6765\uff0c\u8fd9\u6837\u5728\u65e5\u5fd7\u8f93\u51fa\u7684\u65f6\u5019\u5c31\u80fd\u628a\u8c03\u7528\u51fd\u6570\u65f6\u53c2\u6570\u7684\u503c\u8f93\u51fa\u51fa\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_7","title":"\u516b\u3001\u73af\u5883\u90e8\u7f72","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_6","title":"1\u3001\u539f\u5219","text":"YouQu \u7684\u73af\u5883\u4f9d\u8d56\u4e00\u76f4\u575a\u6301 2 \u4e2a\u539f\u5219\uff1a \u6700\u5c0f\u73af\u5883\u4f9d\u8d56\u539f\u5219 \u6709\u4e9b\u540c\u5b66\u5199\u4e00\u4e9b\u529f\u80fd\uff0c\u9996\u5148\u60f3\u5230\u7684\u5c31\u662f\u53bb\u641c\u7d22\u5f15\u64ce\u641c\u4e00\u4e0b\uff0c\u770b\u6709\u6ca1\u6709\u73b0\u6210\u7684\u5de5\u5177\u6216\u8005\u4ee3\u7801\u76f4\u63a5\u80fd\u7528\uff0c\u7f8e\u5176\u540d\u66f0\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\uff0c\u522b\u4eba\u5df2\u7ecf\u9020\u597d\u4e86\u8f6e\u5b50\u54b1\u4eec\u5c31\u4e0d\u8981\u91cd\u590d\u53bb\u9020\u4e86\uff0c\u7136\u540e\u4e00\u5207\u4f3c\u4e4e\u90fd\u53d8\u5f97\u90a3\u4e48\u7684\u7406\u6240\u5e94\u5f53\u3002 \u5f53\u7136\u8fd9\u6837\u505a\u65e0\u53ef\u539a\u975e\uff0c\u6211\u76f8\u4fe1\u6709\u8fd9\u6837\u60f3\u6cd5\u5e76\u4e14\u4e00\u76f4\u8df5\u884c\u8fd9\u6837\u505a\u6cd5\u7684\u540c\u5b66\u4e0d\u5728\u5c11\u6570\uff0c\u4f46\u8fd9\u6837\u505a\u6709\u4e00\u4e2a\u5f88\u4e25\u91cd\u7684\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f60\u5199\u4e00\u4e2a\u5927\u578b\u9879\u76ee\u65f6\uff0c\u4f60\u4f1a\u5f15\u5165\u975e\u5e38\u975e\u5e38\u975e\u5e38\u591a\u7684\u4f9d\u8d56\uff0c\u6bd4\u5982\u8981\u505a\u4e2a\u63a5\u53e3\u8bf7\u6c42\u8981\u7528 requests\u3001\u8bfb\u5199\u4e2a\u6570\u636e\u7528 pandas\u3001\u5199\u4e2a\u8868\u683c\u7528 pyopenxl\u3001\u89e3\u6790\u4e2a\u6587\u672c\u8981\u7528\u8fd9\u4e2a\u90a3\u4e2a\u4e09\u65b9\u5e93 ... \u3002 \u6211\u8ba4\u4e3a\u8fd9\u662f\u975e\u5e38\u4e0d\u597d\u7684\u4e60\u60ef\uff0c\u5728\u5b9e\u73b0\u4e00\u4e2a\u529f\u80fd\u7684\u65f6\u5019\uff0c\u9996\u5148\u6211\u4eec\u5e94\u8be5\u53bb\u60f3\u81ea\u5df1\u600e\u4e48\u6837\u53bb\u5b9e\u73b0\uff0c\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff1b \u5982\u679c\u4f60\u4e0d\u4f1a\uff0c\u4f60\u53ef\u4ee5\u53bb\u5b66\u4e60\u4e09\u65b9\u5e93\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u522b\u4eba\u4e09\u65b9\u5e93\u4e5f\u662f\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\u7684\uff0c\u4e3a\u4ec0\u4e48\u54b1\u4eec\u4e0d\u884c\u5462\uff1b\u5982\u679c\u522b\u4eba\u7684\u4f60\u5b9e\u5728\u662f\u770b\u4e0d\u61c2\uff0c\u60f3\u5c3d\u4e00\u5207\u529e\u6cd5\u786e\u5b9e\u505a\u4e0d\u51fa\u6765\uff0c\u90a3\u518d\u8003\u8651\u5f15\u5165\u8fd9\u4e2a\u4e09\u65b9\u5e93\uff0c\u6211\u8ba4\u4e3a\u8fd9\u6837\u662f\u6ca1\u95ee\u9898\u7684\uff0c\u6bd5\u7adf\u54b1\u4eec\u6bb5\u4f4d\u8fd8\u4e0d\u591f\uff0c\u4f46\u5e0c\u671b\u5c06\u6765\u6709\u4e00\u5929\u6211\u4eec\u53ef\u4ee5\u3002 \u8fd9\u6837\u7684\u505a\u6cd5\u624d\u5e94\u8be5\u662f\u201c\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\u201d\u6b63\u786e\u7684\u64cd\u4f5c\u3002\u4e0d\u4f1a\u6ca1\u5173\u7cfb\uff0c\u770b\u770b\u522b\u4eba\u662f\u600e\u4e48\u5b9e\u73b0\u7684\uff0c\u81ea\u5df1\u518d\u6478\u7d22\u7740\u5199\u51fa\u6765\uff0c\u8fd9\u6837\u81ea\u5df1\u624d\u80fd\u6709\u6240\u63d0\u9ad8\uff0c\u4e0d\u7136\u4f60\u5c31\u53ea\u4f1a\u7528\u522b\u4eba\u7684\u4e1c\u897f\uff1b\u90a3\u4e9b\u5632\u7b11\u3001\u6279\u8bc4\u6211\u4eec\u91cd\u590d\u9020\u8f6e\u5b50\u7684\u4eba\uff0c\u5148\u60f3\u60f3\u81ea\u5df1\u4f1a\u9020\u8f6e\u5b50\u5417\u3002 \u672c\u7740\u81ea\u5df1\u5b9e\u73b0\u80fd\u5b9e\u73b0\u7684\u4e00\u5207\u7684\u539f\u5219\uff0cYouQu \u6846\u67b6\u505a\u5230\u4e86\u975e\u5e38\u5c11\u7684\u73af\u5883\u4f9d\u8d56\uff0c\u800c\u4e14\u6211\u4eec\u4ecd\u5728\u4e0d\u65ad\u52aa\u529b\uff0c\u51cf\u5c11\u73af\u5883\u90e8\u7f72\u7684\u4f9d\u8d56\u3002 \u6700\u5c0f\u4ed3\u5e93\u4f53\u79ef\u539f\u5219 \u5927\u6587\u4ef6\u4e0d\u80fd\u4e0a\u4f20\u5230\u5de5\u7a0b\u91cc\u9762\uff0c\u4fdd\u6301\u6574\u4e2a\u5de5\u7a0b\u7684\u8f7b\u91cf\u5316\uff0c\u8fd9\u6837\u5728\u514b\u9686\u4ee3\u7801\u7684\u65f6\u5019\u624d\u80fd\u975e\u5e38\u5feb\u901f\u65b9\u4fbf\u4f7f\u7528\uff0c\u6211\u4eec\u89c1\u8fc7\u4e00\u4e2a AT \u5de5\u7a0b clone \u5927\u5c0f\u8fbe\u5230\u597d\u51e0\u4e2a G\uff0c\u7b80\u76f4\u4e0d\u53ef\u601d\u8bae\u3002 \u5176\u5b9e\u4ee3\u7801\u6587\u4ef6\u7684\u5927\u5c0f\u662f\u5f88\u5c0f\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u7eaf\u5199\u4ee3\u7801\u968f\u4fbf\u5199\u5de5\u7a0b\u4e5f\u4e0d\u4f1a\u592a\u5927\uff0c\u800c\u6587\u6863\uff08\u5305\u542b\u63d2\u56fe\uff09\u7b49\u8d44\u6e90\u5374\u662f\u5f88\u5360\u7a7a\u95f4\u3002 \u56e0\u6b64\u6211\u4eec\u9009\u62e9\u5c06 YouQu \u7684\u6587\u6863\u5de5\u7a0b\u5355\u72ec\u8fc1\u51fa\u5230\u72ec\u7acb\u7684\u4ed3\u5e93 youqu-docs \u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_6","title":"2\u3001\u5b89\u88c5","text":"\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u8fd0\u884c env.sh \u5373\u53ef\u3002 bash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_4","title":"3\u3001\u5b9a\u5236\u4f9d\u8d56","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_2","title":"3.1\u3001\u65b0\u589e\u4f9d\u8d56","text":"\u5982\u679c\u5e94\u7528\u5e93\u8fd8\u9700\u8981\u5176\u4ed6 Python \u4f9d\u8d56\u5e93\uff0c\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a requirement.txt \u6587\u4ef6\uff1b autotest_xxx\n\u251c\u2500\u2500 requirement.txt\n\u251c\u2500\u2500 case ...\n \u91cc\u9762\u5199\u5165\u9700\u8981\u5b89\u88c5\u7684\u4e09\u65b9\u4f9d\u8d56\uff0c\u6bd4\u5982\u50cf\u8fd9\u6837\uff1a # requirement.txt\nPyYAML==6.0 # \u6307\u5b9a\u5b89\u88c5\u67d0\u4e2a\u7248\u672c\nrequests # \u672a\u6307\u5b9a\u7248\u672c\u5219\u5b89\u88c5\u6700\u65b0\u7248\n \u5728\u6267\u884c bash env.sh \u65f6\u4f1a\u4e00\u5e76\u5c06\u5176\u5b89\u88c5\u3002 \u5982\u679c\u591a\u4e2a\u5e94\u7528\u5e93\u90fd\u5b58\u5728 requirement.txt \u6587\u4ef6\uff0c\u6267\u884c env.sh \u65f6\u4f1a\u5c06\u591a\u4e2a requirement.txt \u6587\u4ef6\u4e00\u5e76\u52a0\u8f7d\uff1b\u90a3\u4e48\u4e00\u5b9a\u8981\u6ce8\u610f\u591a\u4e2a requirement.txt \u6587\u4ef6\u53ef\u80fd\u5b58\u5728\u76f8\u540c\u7684\u4f9d\u8d56\u88ab\u6307\u5b9a\u5b89\u88c5\u4e0d\u540c\u7248\u672c\u7b49\u7b49\u517c\u5bb9\u6027\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32_1","title":"3.2\u3001\u88c1\u526a\u4f9d\u8d56","text":"\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0c\u53ef\u80fd\u4f60\u53ea\u9700\u8981\u5b89\u88c5\u4e00\u4e9b\u6700\u6700\u57fa\u7840\u7684\u4f9d\u8d56\uff0c\u5176\u4ed6\u7684\u90fd\u4e0d\u9700\u8981\uff0c\u6bd4\u5982\u7eaf\u63a5\u53e3\u81ea\u52a8\u5316\u7684\u9879\u76ee\uff0c\u5b83\u4e0d\u9700\u8981 UI \u81ea\u52a8\u5316\u76f8\u5173\u7684\u4f9d\u8d56\u3002 \u4f60\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\uff0c\u5b58\u653e\u4e00\u4e2a BASICENV \u7684\u666e\u901a\u6587\u4ef6\uff0c\u91cc\u9762\u4e0d\u9700\u8981\u5199\u4efb\u4f55\u5185\u5bb9\uff0c\u8fd9\u6837\u6267\u884c env.sh \u65f6\uff0c\u53ea\u4f1a\u5b89\u88c5\u6700\u57fa\u7840\u7684\u4f9d\u8d56\u3002 autotest_xxx\n\u251c\u2500\u2500 BASICENV # \u53ef\u4ee5\u4f7f\u7528\uff1atouch BASICENV \u521b\u5efa\u6587\u4ef6\n\u251c\u2500\u2500 case ...\n \u57fa\u7840\u4f9d\u8d56\u4ec5\u5b89\u88c5\u4ee5\u4e0b\u51e0\u4e2a\u5305\uff1a pytest # pytest\npytest-rerunfailures # \u5931\u8d25\u91cd\u8dd1\u63d2\u4ef6\npytest-timeout # \u7528\u4f8b\u8d85\u65f6\u63d2\u4ef6\nallure-pytest # \u751f\u6210 allure \u62a5\u544a\u63d2\u4ef6\nallure.deb # allure \u62a5\u544a\u67e5\u770b\u5de5\u5177\n \u88c1\u526a\u4f9d\u8d56 \u548c \u65b0\u589e\u4f9d\u8d56 \u662f\u4e0d\u51b2\u7a81\u7684\uff0c\u53ef\u4ee5\u540c\u65f6\u4f7f\u7528\u3002 \u6b64\u65b9\u6848\u9ed8\u8ba4\u4e3a\u865a\u62df\u73af\u5883\u90e8\u7f72\uff0c\u5982\u679c\u4f60\u60f3\u76f4\u63a5\u90e8\u7f72\u5728\u672c\u673a\u4e0a\uff1a bash env_dev.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_8","title":"\u4e5d\u3001\u5931\u8d25\u5f55\u5c4f","text":"\u5f55\u5c4f\u5176\u5b9e\u662f\u4e00\u79cd\u89c6\u9891\u5f62\u5f0f\u7684\u65e5\u5fd7\uff0c\u56e0\u4e3a\u5f88\u591a\u65f6\u5019\u6211\u4eec\u5728\u67e5\u770b\u65e5\u5fd7\u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u51c6\u786e\u7684\u5b9a\u4f4d\u5230\u7528\u4f8b\u5931\u8d25\u7684\u5177\u4f53\u539f\u56e0\uff0c\u56e0\u6b64\u7528\u4f8b\u7684\u5f55\u5c4f\u80fd\u8ba9\u6211\u4eec\u770b\u5230\u7528\u4f8b\u5728\u6267\u884c\u8fc7\u7a0b\uff1b \u3010\u4f7f\u7528\u65b9\u6cd5\u3011 \u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u5173\u6ce8 2 \u4e2a\u53c2\u6570\uff1b ;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\u3002\n;\u6ce8\u610f\uff0c\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u4e0d\u80fd\u5c0f\u4e8e\u5931\u8d25\u5f55\u5c4f\u6b21\u6570\uff0c\u5373 RERUN >= RECORD_FAILED_CASE\nRECORD_FAILED_CASE = 1\n \u9ed8\u8ba4\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u662f 1 \u6b21\uff1b RECORD_FAILED_CASE = 1 \u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff1b RECORD_FAILED_CASE = 0 \u8868\u793a\u4e0d\u7ba1\u7528\u4f8b\u6210\u529f\u6216\u5931\u8d25\u90fd\u5f55\u5c4f\uff1b \u5f55\u5c4f\u662f\u8981\u5360\u7528\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u7279\u522b\u662f\u5728\u4e00\u4e9b\u914d\u7f6e\u8f83\u4f4e\u7684\u673a\u5668\u4e0a\u4f1a\u5f88\u660e\u663e\uff0c\u6240\u4ee5\u4f60\u9700\u8981\u8003\u8651\u662f\u5426\u6709\u5fc5\u8981\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1b \u4f7f\u7528 manage.py \u6267\u884c\u7528\u4f8b\u9ed8\u8ba4\u8bfb\u53d6\u5230 globalconfig.ini \u91cc\u9762\u7684\u53c2\u6570\uff0c\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report/record \u76ee\u5f55\u4e0b\u4fdd\u5b58\u5931\u8d25\u7528\u4f8b\u7684\u5f55\u5c4f\u548c\u65ad\u8a00\u7684\u90a3\u4e2a\u65f6\u95f4\u70b9\u7684\u622a\u5c4f\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7\u89c6\u9891\u6587\u4ef6\u770b\u5230\u5931\u8d25\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u90fd\u53d1\u751f\u4e86\u4ec0\u4e48\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#wayland","title":"\u5341\u3001Wayland \u9002\u914d","text":"Wayland \u4e0b\u81ea\u52a8\u5316\u4e3b\u8981\u95ee\u9898\u662f X11 \u4e0b\u7684\u952e\u9f20\u64cd\u4f5c\u65b9\u6cd5\u65e0\u6cd5\u4f7f\u7528\uff0c\u6bd4\u5982 Xdotool\u3001 PyAutoGUI\u3001Xwininfo \u7b49\u7b49\uff1b YouQu \u5728 Wayland \u4e0b\u517c\u5bb9\u9002\u914d\uff0cenv.sh \u5728 Wayland \u4e0b\u6267\u884c\u65f6\u4f1a\u5b89\u88c5\u81ea\u7814\u7684\u952e\u9f20\u64cd\u4f5c\u670d\u52a1\uff08\u53ef\u80fd\u5b58\u5728\u4e00\u4e9b\u4f9d\u8d56\u62a5\u9519\uff0c\u6309\u7167\u6ce8\u91ca\u89e3\u51b3\u5373\u53ef\uff09\uff0c\u6846\u67b6\u6838\u5fc3\u5e93\u4e5f\u9488\u5bf9\u6027\u7684\u505a\u4e86\u9002\u914d\uff0c\u4e0a\u5c42\u7528\u4f8b\u5b8c\u5168\u4e0d\u7528\u5173\u5fc3\u673a\u5668\u662fWayland \u8fd8\u662f X11\uff0c\u6846\u67b6\u4f1a\u6839\u636e\u6267\u884c\u65f6\u72b6\u6001\u81ea\u52a8\u5224\u65ad\u8d70\u4e0d\u540c\u7684\u903b\u8f91\uff1b \u7b80\u5355\u8bb2\u5c31\u662f\uff0c\u5e94\u7528\u5e93\u53ea\u9700\u8981\u7ef4\u62a4\u4e00\u5957\u7528\u4f8b\u811a\u672c\u5373\u53ef\u3002 \u3010\u7528\u4f8b\u517c\u5bb9\u3011 \u56e0\u4e3a Wayland \u4e0b\u6709\u4e9b\u5e94\u7528\u7684\u754c\u9762\u663e\u793a\u548c\u529f\u80fd\u672c\u8eab\u5b58\u5728\u4e00\u4e9b\u5dee\u5f02\uff0c\u7528\u4f8b\u5c42\u53ef\u80fd\u9700\u8981\u5bf9\u8fd9\u90e8\u5206\u7528\u4f8b\u505a\u903b\u8f91\u5224\u65ad\uff0c\u4f7f\u7528\u5168\u5c40\u914d\u7f6e\u91cc\u9762\u7684\u5e38\u91cf\u8fdb\u884c\u903b\u8f91\u7f16\u5199\u5373\u53ef\uff1a from setting.globalconfig import GlobalConfig\n# GlobalConfig.IS_WAYLAND \u83b7\u53d6\u5230\u5f53\u524d\u7684\u663e\u793a\u670d\u52a1\u5668\uff08bool\uff09\n# \u5e94\u7528\u5e93 Config \u7ee7\u627f GlobalConfig\nif Config.IS_WAYLAND:\npass\nif Config.IS_X11:\npass\n \u6bd4\u5982\u7528\u4f8b\u91cc\u9762\u5982\u679c\u65ad\u8a00\u7684\u56fe\u7247\u4e0d\u540c\uff1a if Config.IS_WAYLAND:\nself.assert_image_exist(\"wayland_XXX\")\nelse:\nself.assert_image_exist(\"x11_XXX\")\n \u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u811a\u672c\u5728 Wayland \u548c X11 \u4e0b\u90fd\u53ef\u4ee5\u8dd1\uff0cso easy \u662f\u4e0d\u662f\uff1f\u5b8c\u5168\u6ca1\u5fc5\u8981\u4e13\u95e8\u62c9\u65b0\u5206\u652f\u8fdb\u884c Wayland \u9002\u914d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_9","title":"\u5341\u4e00\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_7","title":"1. \u76ee\u5f55\u7ed3\u6784","text":"\u6267\u884c\u65f6\u4f1a\u5728\u6839\u76ee\u5f55\u4e0b\u52a8\u6001\u751f\u6210 report \u76ee\u5f55\uff0c\u6240\u6709\u7684\u62a5\u544a\u76f8\u5173\u7684\u6587\u4ef6\u4f1a\u7edf\u4e00\u5b58\u653e\u5728\u91cc\u9762\uff0c\u793a\u4f8b\uff1a /report\n \u251c\u2500\u2500 allure # allure\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json\n \u251c\u2500\u2500 allure_html # \u751f\u6210\u7684html\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 index.html \u251c\u2500\u2500 allure_back # allure\u62a5\u544a\u5907\u4efd\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 20221108114823\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json\n \u251c\u2500\u2500 json # json\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 result_deepin-music_20221109134736_1081333.json\n \u251c\u2500\u2500 logs # \u65e5\u5fd7\u6587\u4ef6\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 2022-11-10_debug.log \u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-10_error.log\n \u251c\u2500\u2500 record # \u5f55\u5c4f\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-09\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 15\u65f614\u520609\u79d2_test_music_303_2_autotest.mp4\n \u2514\u2500\u2500 xml # xml\u62a5\u544a\n\u2514\u2500\u2500 autotest_deepin_music-20221109134736.xml\n \u9ed8\u8ba4\u60c5\u51b5\u4e0b\u540c\u65f6\u751f\u6210 html\u3001xml\u3001json\u4e09\u79cd\u5f62\u5f0f\u7684\u62a5\u544a\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_7","title":"2. \u5b9a\u5236\u62a5\u544a","text":"\u6211\u4eec\u5bf9 allure \u62a5\u544a\u8fdb\u884c\u4e86\u4e00\u7cfb\u5217\u7684\u5b9a\u5236\uff1a \u5b9a\u5236 logo\u3001title\u3001\u62a5\u544a\u9ed8\u8ba4\u8bed\u8a00\u4e3a\u4e2d\u6587\uff1b \u52a0\u5165\u4e86\u7528\u4f8b\u65ad\u8a00\u5931\u8d25\u65f6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u4ee5\u53ca\u6b64\u65f6\u56fe\u50cf\u5bf9\u6bd4\u7684\u6a21\u677f\u56fe\u7247\uff1b \u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\uff0c\u4f60\u53ef\u4ee5\u5728 html \u62a5\u544a\u4e2d\u76f4\u63a5\u770b\u5f55\u5236\u7684\u89c6\u9891\uff1b \u52a0\u5165\u4e86 IP \u5730\u5740\u3001\u7cfb\u7edf\u4fe1\u606f\u3001\u955c\u50cf\u7248\u672c\u7b49\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_5","title":"3. \u67e5\u770b\u62a5\u544a","text":" \u672c\u5730\u6267\u884c \u5728 report/allure \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u4e00\u5806\u6587\u672c\u6587\u4ef6\uff0c\u8fd9\u4e9b\u662f allure \u63d2\u4ef6\u751f\u6210\u7684\u62a5\u544a\u6e90\u6570\u636e\uff0c\u6211\u4eec\u5728 report/allure_html \u76ee\u5f55\u4e0b\u7ed9\u4f60\u751f\u6210\u4e86 html \u6587\u4ef6\uff0c\u4f46\u662f\u4f60\u4e0d\u80fd\u76f4\u63a5\u901a\u8fc7\u6d4f\u89c8\u5668\u6253\u5f00 index.html \u6587\u4ef6\uff0c\u56e0\u4e3a allure \u7684\u62a5\u544a\u90fd\u662f\u57fa\u4e8e\u5728\u7ebf\u7684\u670d\u52a1\uff0c\u4f60\u5e94\u8be5\u8fd9\u6837\u6253\u5f00\uff1a allure open report/allure_html\n \u4f7f\u7528 manage.py \u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u5728\u7ec8\u7aef\u7684\u6700\u540e\u4e00\u884c\uff0c\u6211\u4eec\u4f1a\u7ed9\u4f60\u8f93\u51fa\u6253\u5f00\u62a5\u544a\u7684\u547d\u4ee4\uff0c\u76f4\u63a5\u590d\u5236\u5b83\u5728\u7ec8\u7aef\u6267\u884c\u5c31\u53ef\u4ee5\u67e5\u770b\u4e86\uff0c\u50cf\u8fd9\u6837\uff1a \u7ec8\u7aef\u6267\u884c\u547d\u4ee4: allure open /tmp/youqu/report/allure_html \u67e5\u770b\u62a5\u544a \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 Pycharm \u91cc\u9762\u627e\u5230 index.html \u6587\u4ef6\uff0c\u7136\u540e\u53f3\u952e\u9009\u62e9\u6d4f\u89c8\u5668\u6253\u5f00\uff0c\u6216\u8005\u4f60\u53ef\u4ee5\u7528\u4e00\u4e2a http \u670d\u52a1\u6253\u5f00\u3002 \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 report/allure \u76ee\u5f55\u4e0b\u67e5\u770b\u62a5\u544a\uff1a allure serve report/allure\n \u8fdc\u7a0b\u6267\u884c \u8fdc\u7a0b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\uff0c\u4f1a\u5c06\u6240\u6709\u8fdc\u7a0b\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u62a5\u544a\u90fd\u6536\u96c6\u5230 report/allure \u76ee\u5f55\u4e0b\uff0c\u5206\u522b\u6309\u7167\u673a\u5668\u7684 IP \u7b49\u5efa\u4e86\u4e0d\u540c\u7684\u76ee\u5f55\uff0c\u4f60\u53ef\u4ee5\u5728\u8fd9\u4e9b\u76ee\u5f55\u91cc\u9762\u53bb\u67e5\u770b\u5bf9\u5e94\u7684\u6d4b\u8bd5\u62a5\u544a\uff0c\u67e5\u770b\u65b9\u6cd5\u548c\u524d\u9762\u672c\u5730\u6267\u884c\u67e5\u770b\u7684\u65b9\u6cd5\u4e00\u6837\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_10","title":"\u5341\u4e8c\u3001\u9759\u6001\u4ee3\u7801\u626b\u63cf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_8","title":"1. \u63d0\u524d\u89e3\u51b3\u4ee3\u7801\u95ee\u9898","text":"\u4e3a\u4e86\u5e2e\u52a9\u5f00\u53d1\u8005\u7edf\u4e00\u4ee3\u7801\u98ce\u683c\uff0cPython \u793e\u533a\u63d0\u51fa\u4e86 PEP8 \u4ee3\u7801\u7f16\u7801\u98ce\u683c\uff0cPython \u5b98\u65b9\u540c\u65f6\u63a8\u51fa\u4e86\u4e00\u4e2a\u68c0\u67e5\u4ee3\u7801\u98ce\u683c\u662f\u5426\u7b26\u5408 PEP8 \u7684\u5de5\u5177\uff0c\u540d\u5b57\u4e5f\u53eb PEP8\u3002 \u4f46\u662f\uff0cPycharm \u91cc\u9762\u7684 PEP8 \u63d2\u4ef6\u5b9e\u9645\u4e0a\u5e76\u4e0d\u80fd\u53d1\u73b0\u5f88\u591a\u4ee3\u7801\u95ee\u9898\uff0c\u8fd9\u4e9b\u95ee\u9898\u5e76\u4e0d\u4f1a\u5728\u8fd0\u884c\u65f6\u62a5\u9519\uff0c\u56e0\u4e3a\u4ece Python \u8bed\u8a00\u89d2\u5ea6\u5e76\u4e0d\u5173\u5fc3\u8fd9\u4e9b\u95ee\u9898\uff0c\u5728 Pycharm \u7f16\u8f91\u5668\u91cc\u9762\u4f7f\u7528\u5feb\u6377\u952e ctrl + alt + L\uff0c\u6709\u4e00\u70b9\u70b9\u683c\u5f0f\u5316\u7684\u6548\u679c\uff0c\u80fd\u89e3\u51b3\u4e00\u4e9b\u7a7a\u683c\u3001\u6362\u884c\u7b49\u5c0f\u95ee\u9898\u3002 \u8fd9\u91cc\u63a8\u8350\u4e00\u4e2a Python \u793e\u533a\u6d41\u884c\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff1a Black\uff0c\u53f7\u79f0\u4e0d\u59a5\u534f\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff0c\u5b83\u68c0\u6d4b\u5230\u4e0d\u7b26\u5408\u89c4\u8303\u7684\u4ee3\u7801\u98ce\u683c\u76f4\u63a5\u5c31\u5e2e\u4f60\u5168\u90e8\u683c\u5f0f\u5316\u597d\uff0c\u5c31\u662f\u8fd9\u4e48\u521a\uff01 \u5b89\u88c5\uff1a sudo pip3 install black \n \u4f7f\u7528\u65b9\u6cd5\uff1a black ${CheckPath}\n \u4f7f\u7528\u8fd9\u4e2a\u5de5\u5177\u683c\u5f0f\u5316\u4e4b\u540e\uff0c\u4ee3\u7801\u4f1a\u88ab\u81ea\u52a8\u8c03\u6574\uff0c\u521a\u5f00\u59cb\u4f60\u53ef\u80fd\u4f1a\u89c9\u5f97\u8c03\u6574\u5f97\u5f88\u5938\u5f20\uff0c\u6ca1\u5173\u7cfb\u575a\u6301\u770b\uff0c\u4e60\u60ef\u4e4b\u540e\uff0c\u4f60\u4f1a\u89c9\u5f97\u5f88\u4f18\u96c5\uff0c\u6ca1\u9519\uff0c\u8fd9\u5c31\u662f Pythonic Code \u7684\u6838\u5fc3\uff0c\u8bf7\u4fdd\u6301\u4f18\u96c5\uff5e\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_8","title":"2. \u4ee3\u7801\u626b\u63cf\u5de5\u5177","text":"\u4f7f\u7528\u6839\u76ee\u5f55\u4e0b pylint.sh \u626b\u63cf\u4ee3\u7801\uff0c\u5728 report \u76ee\u5f55\u4e0b\u67e5\u770b\u4ee3\u7801\u626b\u63cf\u62a5\u544a\uff0c\u5982\u679c\u6709\u4ee3\u7801\u95ee\u9898\u8bf7\u63d0\u524d\u89e3\u51b3\u4e4b\u540e\u518d\u63d0\u4ea4\u3002 \u6b64\u811a\u672c\u5df2\u7ecf\u4f7f\u7528 Python \u793e\u533a\u6700\u6d41\u884c\u7684\u4ee3\u7801\u626b\u63cf\u5de5\u5177 Pylint \u8fdb\u884c\u4ee3\u7801\u626b\u63cf\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a bash pylint.sh\n \u8fd0\u884c\u4e4b\u540e\u4f1a\u63d0\u793a\u4f60\u8981\u626b\u63cf\u7684\u76ee\u5f55\uff0c\u6bd4\u5982\u8f93\u5165 apps \uff0c\u5219\u4f1a\u626b\u63cf apps \u4e0b\u7684\u6240\u6709 Python \u4ee3\u7801\u3002 \u5728 setting/pylintrc.cfg \u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u76f8\u5173\u914d\u7f6e\uff0c\u626b\u63cf\u5b8c\u6210\u4e4b\u540e\u5728 report/pylints \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u626b\u63cf\u62a5\u544a\u3002 \u4ee3\u7801\u63d0\u4ea4\u9700\u901a\u8fc7 git review \u63d0\u4ea4\u5230 gerrit \uff0c\u4eba\u5de5 Code Review \u901a\u8fc7\u4e4b\u540e\u5408\u5165\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_11","title":"\u5341\u4e09\u3001\u63d0\u4ea4\u4ee3\u7801","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_9","title":"1. \u5b89\u88c5\u4f9d\u8d56","text":"sudo apt install git-review\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_9","title":"2. \u63d0\u4ea4\u6a21\u677f","text":"\u5728 ~ \u76ee\u5f55\u4e0b\u65b0\u5efa\u6587\u4ef6\uff0c\u5e76\u547d\u540d\u4e3a gitcommit_template \u5c06\u4ee5\u4e0b\u5185\u5bb9\u5199\u5165\u6587\u4ef6\u5f53\u4e2d\uff1a # commit type :fix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style(\u98ce\u683c\u4fee\u6539)\u3001refactor(\u91cd\u6784)\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test(\u6d4b\u8bd5) + \u7b80\u5355\u63cf\u8ff0. \u9ed8\u8ba4fix,\u6839\u636e\u60c5\u51b5\u4fee\u6539\nfix: \n\n# \u8be6\u7ec6\u8bf4\u660e\u4ee3\u7801\u7684\u6539\u52a8\uff0c\u5305\u542b\u4ee3\u7801\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u4ee5\u53ca\u4e3a\u4ec0\u4e48\u8fd9\u4e48\u505a\uff0c\u53ef\u80fd\u4f1a\u5f71\u54cd\u54ea\u4e9b\u529f\u80fd\u3002\u5bf9\u4e8e\u4ee3\u7801\u7684\u5ba1\u6838\u8005\uff0c\u9700\u8981\u4ece\u8fd9\u6bb5\u63cf\u8ff0\u4e2d\u80fd\u5b8c\u5168\u7406\u89e3\u4ee3\u7801\u4e2d\u6240\u6709\u6539\u52a8\u7684\u5185\u5bb9\nDescription: \n\n# \u5199\u4e00\u6bb5\u9762\u5411\u4e8e\u4ea7\u54c1\u7684\u603b\u7ed3\u6027\u5185\u5bb9\uff0c\u7528\u4e8e\u81ea\u52a8\u751f\u6210crp\u4e0a\u7684changlog\uff0c\u9700\u8981\u6ce8\u610f\u7684\u4e8b\uff0c\u8fd9\u6bb5\u63cf\u8ff0\u5fc5\u987b\u4ece\u4ea7\u54c1\u7684\u89d2\u5ea6\u8003\u8651\u3002\nLog: \n\n# \u5173\u8054pms\u4e0a\u7684bug\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94bug\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4fee\u590dbug\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Bug: \n\n# \u4fee\u590d github issue \n#Issue: \n\n# \u5173\u8054pms\u4e0a\u7684\u4efb\u52a1\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94\u4efb\u52a1\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4efb\u52a1\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Task: \n \u547d\u4ee4\u884c\u6267\u884c: git config --global commit.template ~/gitcommit_template\n \u6b64\u547d\u4ee4\u5c06\u6a21\u677f\u52a0\u5165\u5230 git \u7684\u63d0\u4ea4\u6a21\u677f\u4e2d\u3002 \u540e\u7eed\u63d0\u4ea4\u7684\u65f6\u5019\u9700\u8981\u5173\u6ce8\u4e00\u4e0b\u51e0\u70b9\uff1a commit type \u5bf9\u5e94\u4e0d\u540c\u7684\u4fee\u6539\u7c7b\u578b\uff1afix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style \uff08\u98ce\u683c\u4fee\u6539\uff09\u3001refactor \uff08\u91cd\u6784\uff09\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test \uff08\u6d4b\u8bd5\uff09 commit type \u5192\u53f7\u540e\u9762\u52a0\u7a7a\u683c\u3002 Description \u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u9700\u8981\u8fdb\u884c\u8be6\u7ec6\u8bf4\u660e\uff0c\u6bd4\u5982\u5bf9\u529f\u80fd\u8fdb\u884c\u5927\u6539\u7b49\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_6","title":"3. \u63a8\u9001\u4ee3\u7801","text":"\u9996\u5148\u6dfb\u52a0 commit \u4fe1\u606f git add \u540e\u9762\u52a0\u6587\u4ef6\u540d\u79f0\n git add . # \u8868\u793a\u6dfb\u52a0\u6240\u6709\u6587\u4ef6\n \u4f7f\u7528\u8fd9\u6761\u547d\u4ee4\u6ce8\u610f\u6709\u4e9b\u4e34\u65f6\u6587\u4ef6\u4e0d\u8981\u63d0\u4ea4\u5230\u4ed3\u5e93\u4e86\u3002 git commit -a\n \u4e4b\u540e\u5728 fix: \u540e\u9762\uff08\u6ce8\u610f\u5192\u53f7\u540e\u9762\u5fc5\u987b\u52a0\u7a7a\u683c\uff0c\u4e0d\u7136\u76f4\u63a5-1\uff09\u5199\u672c\u5730\u63d0\u4ea4\u7684 commit \u4fe1\u606f\uff0c\u7136\u540e\u5c31\u53ef\u4ee5\u63d0\u4ea4\u4ee3\u7801\u4e86 git review branch(\u5f53\u524d\u5206\u652f) -r origin\n \u6700\u597d\u4e00\u6b21 commit\uff0c\u4e00\u6b21 git review \uff0c\u7ecf\u5e38\u6709\u540c\u5b66\u5728\u672c\u5730\u75af\u72c2 commit \u6700\u540e git review \u62a5\u9519\u4e0d\u77e5\u9053\u548b\u56de\u4e8b\u513f\u3002 \u82e5\u4e0d\u60f3\u6bcf\u6b21\u63d0\u4ea4\u90fd\u52a0\u4e0a -r \u9009\u9879\uff0c\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a git config --global gitreview.remote origin \u63d0\u4ea4\u4ee3\u7801\uff0c\u76f4\u63a5\u4f7f\u7528 git review branch<\u76ee\u6807\u5206\u652f>\uff0c\u4f8b\u5982 git review master"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git","title":"4. Git\u6807\u7b7e","text":"Git \u6807\u7b7e\u5b9e\u9645\u4e0a\u662f commit \u7684\u4e00\u4e2a\u522b\u540d\uff0c\u4e3b\u8981\u7528\u4e8e\u7ba1\u7406\u5386\u53f2\u7248\u672c\u3002 \u60f3\u8c61\u4e00\u4e0b\u9886\u5bfc\u8ba9\u4f60\u628a\u4e4b\u524d\u7684\u67d0\u4e2a\u7248\u672c\u7684\u4ee3\u7801\u62c9\u51fa\u6765\u8dd1\uff0c\u4f60\u662f\u4e0d\u662f\u4e56\u4e56\u7684\u53bb\u628a\u6240\u6709\u63d0\u4ea4\u8bb0\u5f55\u62c9\u51fa\u6765\u627e\uff0c\u7136\u540e\u627e\u5230\u90a3\u4e2a\u54c8\u5e0c\u503c\uff0c\u901a\u8fc7\u54c8\u5e0c\u503c\u6765\u68c0\u51fa\u4ee3\u7801\u3002 \u8fd9\u4e00\u5957\u64cd\u4f5c\u4e0b\u6765\u662f\u4e0d\u662f\u5f88\u9ebb\u70e6\uff0c\u8d39\u65f6\u95f4\u8fd8\u4e0d\u4e00\u5b9a\u80fd\u627e\u5f97\u5230\uff0c\u6ca1\u4eba\u80fd\u8bb0\u4f4f\u6bcf\u4e2a\u63d0\u4ea4\u54c8\u5e0c\u503c\u4ee5\u53ca\u8fd9\u6b21\u63d0\u4ea4\u90fd\u6539\u4e86\u54ea\u4e9b\u4ee3\u7801\u3002 \u56e0\u6b64\u7ed9\u63d0\u4ea4\u6253\u4e2a\u6807\u7b7e\uff0c\u5c31\u662f\u628a\u54c8\u5e0c\u503c\u8f6c\u6362\u6210\u4eba\u7c7b\u80fd\u7406\u89e3\u7684\u8bed\u8a00\uff0c\u6bd4\u5982 v1.0\uff0c\u5c31\u53ef\u4ee5\u76f4\u63a5\u901a\u8fc7\u6807\u7b7e\u627e\u5230\u5bf9\u5e94\u7684\u63d0\u4ea4\u3002 \u65b0\u5efa\u6807\u7b7e git tag -a <tagname>\n \u56de\u8f66\u4e4b\u540e\uff0cGit \u4f1a\u6253\u5f00\u4f60\u7684\u7f16\u8f91\u5668\uff0c\u8ba9\u4f60\u5199\u4e00\u53e5\u6807\u7b7e\u6ce8\u89e3\uff0c\u5c31\u50cf\u4f60\u7ed9\u63d0\u4ea4\u5199\u6ce8\u89e3\u4e00\u6837\u3002 \u67e5\u770b\u6240\u6709\u6807\u7b7e git tag -l\n# git tag \u4e5f\u884c\n \u5220\u9664\u6807\u7b7e git tag -d <tagname>\n \u63a8\u9001\u6807\u7b7e\u81f3\u8fdc\u7a0b git push \u547d\u4ee4\u5e76\u4e0d\u4f1a\u4f20\u9001\u6807\u7b7e\u5230\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\uff0c\u5fc5\u987b\u663e\u5f0f\u5730\u63a8\u9001\u6807\u7b7e\u3002 git push origin <tagname>\n \u63a8\u9001\u6240\u6709\u4e0d\u5728\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\u7684\u6807\u7b7e git push origin --tag\n \u5220\u9664\u8fdc\u7a0b\u6807\u7b7e git push origin :refs/tag/<tagname>\n \u540e\u671f\u6253\u6807\u7b7e \u5148\u7528 git log --pretty=oneline \u67e5\u8be2\u63d0\u4ea4\u8bb0\u5f55\uff0c\u83b7\u53d6\u6821\u9a8c\u7801\u3002 git tag -a <tagname> 9fceb02(\u6821\u9a8c\u7801)\n \u68c0\u51fa\u6807\u7b7e git checkout <tagname>\n \u6b64\u65f6\uff0c\u4ed3\u5e93\u4f1a\u5904\u4e8e\u201c\u5206\u79bb\u5934\u6307\u9488\uff08detached HEAD\uff09\u201d\u7684\u72b6\u6001\u3002 \u5728\u201c\u5206\u79bb\u5934\u6307\u9488\u201d\u72b6\u6001\u4e0b\uff0c\u5982\u679c\u4f60\u505a\u4e86\u67d0\u4e9b\u66f4\u6539\u7136\u540e\u63d0\u4ea4\u5b83\u4eec\uff0c\u6807\u7b7e\u4e0d\u4f1a\u53d1\u751f\u53d8\u5316\uff0c \u4f46\u4f60\u7684\u65b0\u63d0\u4ea4\u5c06\u4e0d\u5c5e\u4e8e\u4efb\u4f55\u5206\u652f\uff0c\u5e76\u4e14\u5c06\u65e0\u6cd5\u8bbf\u95ee\uff0c\u9664\u975e\u901a\u8fc7\u786e\u5207\u7684\u63d0\u4ea4\u54c8\u5e0c\u624d\u80fd\u8bbf\u95ee\u3002 \u56e0\u6b64\uff0c\u5982\u679c\u4f60\u9700\u8981\u8fdb\u884c\u66f4\u6539\uff0c\u6bd4\u5982\u4f60\u8981\u4fee\u590d\u65e7\u7248\u672c\u4e2d\u7684\u9519\u8bef\uff0c\u90a3\u4e48\u901a\u5e38\u9700\u8981\u521b\u5efa\u4e00\u4e2a\u65b0\u5206\u652f\uff1a git checkout -b <NewBranchName> <tagname>\n \u65b0\u5206\u652f\u4e0a\u53ef\u4ee5\u8fdb\u884c\u63d0\u4ea4\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_12","title":"\u5341\u56db\u3001\u5e38\u89c1\u95ee\u9898","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_10","title":"1. \u63d0\u4ea4\u4ee3\u7801\u65f6\u63d0\u793a\u90ae\u7bb1\u6216\u8005\u540d\u79f0\u4e0d\u5bf9","text":"\u91cd\u65b0\u914d\u7f6e\u90ae\u7bb1\u6216\u8005\u540d\u79f0\uff0c\u7136\u540e\u91cd\u7f6e\u751f\u6548\uff1a git commit --amend --reset-author\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_10","title":"2. \u600e\u4e48\u56de\u6eda\u5230\u4e4b\u524d\u7684\u7248\u672c","text":"(1)\u67e5\u8be2\u5386\u53f2\u63d0\u4ea4\u8bb0\u5f55 git log\n \u627e\u5230\u4f60\u8981\u56de\u6eda\u7684\u7248\u672c\uff0c\u590d\u5236 hash \u503c\u3002 \u6ce8\u610f\uff1a\u662f commit \u7a7a\u683c\u4e4b\u540e\u7684 hash \u503c\uff0c\u4e4b\u524d\u6709\u540c\u5b66\u590d\u5236\u7684 Change-Id: \u8fd9\u6837\u80af\u5b9a\u62a5\u9519\u3002 (2)\u56de\u6eda\u7248\u672c\uff0c\u4e0d\u6e05\u9664\u4ee3\u7801 git reset --soft ${hash}\n (3)\u56de\u6eda\u7248\u672c\uff0c\u6e05\u9664\u4ee3\u7801\uff0c\u614e\u7528\u54c8 git reset --hard ${hash}\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-f-s-e","title":"3. \u6d4b\u8bd5\u62a5\u544a\u91cc\u9762 F S . E \u662f\u4ec0\u4e48\u610f\u601d","text":"F \u8868\u793a\u5931\u8d25\uff0c. \uff08\u70b9\uff09\u8868\u793a\u901a\u8fc7\uff0cS \u8868\u793a\u8df3\u8fc7\uff0cE \u8868\u793a error \u6709\u62a5\u9519"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git-status","title":"4. \u89e3\u51b3 git status \u4e2d\u6587\u663e\u793a\u7684\u95ee\u9898","text":"git config --global core.quotePath false\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5-apps","title":"5. apps \u76ee\u5f55\u4e0b\u989c\u8272\u6709\u4e9b\u662f\u9ec4\u8272\u7684","text":"\u5728 Pycharm \u4e2d apps \u76ee\u5f55\u4e0b\u5e94\u7528\u5e93\u6587\u4ef6\u662f\u9ec4\u8272\u7684\uff0c\u7f16\u8f91\u5668\u8bc6\u522b\u4e0d\u5230\u4ee3\u7801\u65b0\u589e\u548c\u4fee\u6539\uff1b \u7531\u4e8e\u793e\u533a\u7248 Pycharm \u4e0d\u80fd\u52a8\u6001\u8bc6\u522b\u591a\u4ed3\u5e93\uff0c\u9700\u8981\u5728 setting \u91cc\u9762\u624b\u52a8\u6ce8\u518c\uff0c\u64cd\u4f5c\u6b65\u9aa4\uff1a File \u2014> Settings \u2014> Version Control \u2014> \u70b9 + \u53f7 \u2014> Directory \u9009\u4e2d\u5e94\u7528\u5e93\u5de5\u7a0b\u76ee\u5f55 \u2014> VCS \u9009\u4e2d Git \u2014> Apply \u5982\u6b64\u5c31\u53ef\u4ee5\u4e86\u3002 \u4e13\u4e1a\u7248 Pycharm \u4e0d\u5b58\u5728\u8fd9\u4e2a\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#6-envsh-r","title":"6. \u6267\u884c env.sh \u62a5\u9519 $'\\r':\u672a\u627e\u5230\u547d\u4ee4","text":"\u51fa\u73b0\u8fd9\u4e2a\u95ee\u9898\u4f60\u5e94\u8be5\u662f\u5728 windows \u4e0a\u6253\u5f00\u6216\u7f16\u8f91\u8fc7 env.sh \u811a\u672c\uff0cwindows\u4e0b\u7684\u6362\u884c\u662f\u56de\u8f66\u7b26+\u6362\u884c\u7b26\uff0c\u4e5f\u5c31\u662f\\r\\n\uff0c\u800c Linxu \u4e0b\u662f\u6362\u884c\u7b26 \\n\uff0cLinux \u4e0b\u4e0d\u8bc6\u522b \\r\uff0c\u56e0\u6b64\u62a5\u9519\u3002 \u89e3\u51b3\u65b9\u6848\uff1a # \u5c06 \\r \u66ff\u6362\u4e3a\u7a7a\nsudo sed -i 's/\\r//' env.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#7","title":"7.\u600e\u6837\u4e3a\u5355\u72ec\u67d0\u4e00\u6761\u7528\u4f8b\u914d\u7f6e\u6267\u884c\u8d85\u65f6\u65f6\u95f4","text":"\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u5982\u4e0b\uff1a @pytest.mark.timeout(300) # \u5355\u4f4d\u79d2\ndef test_xxx_001():\npass\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#8-youqu","title":"8. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u6240\u6709\u4ee3\u7801\uff0c\u5305\u542b\u5b50\u4ed3\u5e93","text":"\u524d\u7f6e\u6761\u4ef6\uff1a\u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 # \u7b2c\u4e00\u6b21\u5b58\u50a8\u5bc6\u7801\uff0c\u63d0\u4f9b\u540e\u9762\u62c9\u4ee3\u7801(gerrit: ldap\u8d26\u53f7\u548c\u5bc6\u7801\uff0cgit\u62c9\u53d6\u7b2c\u4e00\u6b21\u8f93\u5165\u4fdd\u5b58\uff0c\u540e\u9762\u76f4\u63a5\u4f7f\u7528)\ngit config --global credential.helper store\n\n# \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\uff0c\u5e76\u9012\u5f52\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\" --recursive\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#9-youqu","title":"9. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\u6307\u5b9a\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u524d\u7f6e\u6761\u4ef6\uff1a \u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 \u5df2\u5b58\u50a8\u8bbf\u95ee\u5bc6\u7801 # \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\"\n# \u6307\u5b9a\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ncd youqu\ngit submodule update --init apps/autotest_xxx_xxx\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#10-youqu","title":"10. \u5982\u4f55\u66f4\u65b0 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\uff0c\u6240\u6709\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u66f4\u65b0\u6240\u6709\u5b50\u4ed3\u5e93\u4ee3\u7801 cd youqu\ngit pull & git submodule foreach git pull\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#11-youqu-master-detached-head","title":"11. \u5982\u4f55\u4fee\u590d YouQu \u6240\u6709\u5b50\u4ed3\u5e93 master \u5206\u652f\u6e38\u79bb\u5934\uff08detached head\uff09","text":"\u4fee\u590d\u6240\u6709\u5b50\u4ed3\u5e93\u9ed8\u8ba4master \u5206\u652f\u6e38\u79bb\u5934 cd youqu\ngit submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/","title":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212 \u5206\u7c7b\uff1a/ \u67b6\u6784\u5e08\uff1a/ \u76ee\u6807\uff1a \u5e94\u7528 AT \u67b6\u6784\u5de5\u7a0b\u5316\uff0c\u53c2\u8003\u6027\u80fd\u81ea\u52a8\u5316\u5de5\u7a0b\u5b8c\u6210\u5de5\u7a0b\u5316\u6539\u9020\u3002 \u5e94\u7528\u95f4\u7528\u4f8b\u89e3\u8026\uff0c\u89e3\u9664\u6240\u6709\u4ea4\u53c9\u8c03\u7528\u7684\u65b9\u6cd5\uff0c\u5404\u5e94\u7528\u80fd\u8ddf\u968f\u81ea\u8eab\u8fed\u4ee3\u5468\u671f\u72ec\u7acb\u7ef4\u62a4 AT \u7528\u4f8b\u3002 \u5b8c\u6210\u516c\u5171\u65b9\u6cd5\u7684\u62bd\u53d6\u6574\u5408\uff0c\u5f62\u6210\u4e00\u5957\u72ec\u7acb\u4e8e\u5e94\u7528\u95f4\u7684\u516c\u5171\u65b9\u6cd5\u5e93\uff0c\u5404\u5e94\u7528\u65b9\u6cd5\u91cc\u9762\u4e0d\u5b58\u5728\u88ab\u591a\u4e2a\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\u3002 \u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u4e3a\u5c06\u6765\u9002\u914d\u66f4\u591a\u7684 AT \u8fd0\u7528\u573a\u666f\u63d0\u4f9b\u652f\u6491\uff0c\u539f\u5219\u4e0a\u53ef\u5b9e\u73b0\u65e0\u9650\u6269\u5c55\uff0c\u5728\u6bcf\u65e5\u6784\u5efa\u548c\u6301\u7eed\u96c6\u6210\u6d41\u7a0b\u843d\u5730\u4f7f\u7528\u3002 \u4ee3\u7801\u89c4\u8303\u95ee\u9898\u6e05\u96f6\uff0c\u7b26\u5408 Shell Check\u3001Pylint\u3001\u7cfb\u7edf\u90e8\u76f8\u5173\u7f16\u7801\u89c4\u8303\u8981\u6c42\u3002 \u610f\u4e49\uff1a \u7edf\u4e00\u6210\u7814 AT \u67b6\u6784\u8bbe\u8ba1\u601d\u8def\uff0c\u6d88\u9664 AT \u4ee3\u7801\u5b9e\u73b0\u548c\u7ef4\u62a4\u4e0a\u53ef\u80fd\u51fa\u73b0\u7684\u5206\u6b67\uff0c\u6539\u5584\u5386\u53f2 AT \u65e0\u5de5\u7a0b\u5316\u8bbe\u8ba1\u7684\u7f3a\u9677\uff0c\u63d0\u9ad8\u67b6\u6784\u4e13\u4e1a\u6027\u3002 \u5404\u5e94\u7528 AT \u4ee3\u7801\u76f8\u4e92\u72ec\u7acb\uff0c\u5951\u5408\u5e94\u7528\u72ec\u7acb\u53d1\u5e03\u7279\u6027\uff0c\u53ef\u652f\u6301\u8fed\u4ee3\u671f\u95f4\u72ec\u7acb\u65b0\u589e\u3001\u7ef4\u62a4\u548c\u6267\u884c\u3002 \u65b9\u6cd5\u8c03\u7528\u903b\u8f91\u5f97\u5230\u7b80\u5316\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u66f4\u9ad8\u6548\uff1b\u516c\u5171\u5e93\u62bd\u53d6\uff0c\u51cf\u5c11\u65b9\u6cd5\u91cd\u590d\u7f16\u5199\uff0c\u63d0\u9ad8\u4ee3\u7801\u5229\u7528\u7387\uff1b\u5e73\u5747\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u4ece40\u5206\u949f\u964d\u4f4e\u81f330\u5206\u949f\uff0c\u65e5\u4ea7\u51fa\u7528\u4f8b\u4ece12\u6761/\u5929\u63d0\u5347\u81f316\u6761/\u5929\u3002 \u53ef\u7075\u6d3b\u652f\u6491\u4e0d\u540c\u7684\u81ea\u52a8\u5316\u8fd0\u7528\u573a\u666f\uff0c\u5982 CI\u3001\u5192\u70df\u6d4b\u8bd5\u3001\u96c6\u6210\u6d4b\u8bd5\u3001\u56de\u5f52\u6d4b\u8bd5\u3001\u4e13\u9879\u6d4b\u8bd5\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_2","title":"\u4e00\u3001\u80cc\u666f\u4ecb\u7ecd","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1","title":"1\u3001\u73b0\u6709\u67b6\u6784\u4ecb\u7ecd","text":"\u73b0\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u6574\u4f53\u5206\u4e3a\u4e09\u5c42\uff1a\u7528\u4f8b\u5c42\uff08\u4e1a\u52a1\u903b\u8f91\u5c42\uff09\u3001\u4e2d\u95f4\u5c42\uff08\u5143\u7d20\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff09\u3001\u6838\u5fc3\u5c42\uff08\u5e95\u5c42\u529f\u80fd\u5e93\u5c42\uff09\u3002 \u7528\u4f8b\u5c42\uff1a\u5373\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4e13\u6ce8\u4e8e\u4e1a\u52a1\u529f\u80fd\u903b\u8f91\uff0c\u4e0d\u5173\u5fc3\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\uff1b \u4e2d\u95f4\u5c42\uff1a\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff0c\u6bcf\u4e2a\u65b9\u6cd5\u5747\u5bf9\u5e94\u4e00\u4e2a\u5143\u7d20\u7684\u4e00\u4e2a\u5177\u4f53\u64cd\u4f5c\uff0c\u4e5f\u53ef\u4ee5\u662f\u591a\u4e2a\u64cd\u4f5c\u7684\u7ec4\u5408\u64cd\u4f5c\uff0c\u4e2d\u95f4\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u7528\u4f8b\u5c42\uff0c\u5177\u6709\u53ef\u6269\u5c55\u6027\u548c\u590d\u7528\u6027\uff1b \u6838\u5fc3\u5c42\uff1a\u4e3b\u8981\u5c01\u88c5\u7684\u5e95\u5c42\u529f\u80fd\u5b9e\u73b0\uff0c\u6b64\u5c42\u5728\u6846\u67b6\u4e2d\u63d0\u4f9b\u4e00\u4e9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u529f\u80fd\u6a21\u5757\u76f8\u5bf9\u72ec\u7acb\uff0c\u6838\u5fc3\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u64cd\u4f5c\u5c42\uff0c\u6bd4\u5982\uff1a\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7 UI \u5750\u6807\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u952e\u9f20\u64cd\u4f5c\u7684\u57fa\u7840\u65b9\u64cd\u4f5c\u6a21\u5757\u3001Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757\u3001\u6587\u4ef6\u7684\u589e\u5220\u6539\u67e5\u64cd\u4f5c\u6a21\u5757\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2","title":"2\u3001\u81ea\u52a8\u5316\u7684\u5e94\u7528","text":"2.1\u3001CI \u6d41\u7a0b \u6bcf\u65e5\u6784\u5efa\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u7814\u53d1\u6bcf\u65e5\u63d0\u4ea4\u7684\u4ee3\u7801\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u73ed\u4e4b\u540e\u4f1a\u5c06\u5404\u5e94\u7528\u8fdb\u884c\u6253\u5305\uff0c\u7136\u540e\u5728\u6d4b\u8bd5\u673a\u4e0a\u5b89\u88c5\u66f4\u65b0 deb \u5305\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u5e94\u7528\u63d0\u4ea4\u96c6\u6210\u7684\u7248\u672c\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u8f7d\u6700\u65b0\u7684 ISO \u8fdb\u884c PXE \u90e8\u7f72\uff0c\u7136\u540e\u6d4b\u8bd5\u673a\u5b89\u88c5\u6700\u65b0\u7684\u955c\u50cf\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 2.2\u3001\u9a8c\u6536\u6d4b\u8bd5 \u5728\u5404\u9a8c\u6536\u8282\u70b9\u8fdb\u884c\u81ea\u52a8\u5316\u9a8c\u6536\uff0c\u76ee\u524d\u7684\u7b56\u7565\u662f\u5168\u7528\u4f8b\u8986\u76d6\u5168\u67b6\u6784\u3002 2.3\u3001\u56de\u5f52\u6d4b\u8bd5 \u56de\u5f52\u6d4b\u8bd5\u4eca\u5e74\u89c4\u5212\u5efa\u8bbe\u4e2d\uff0c\u65e8\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u6267\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\uff0c\u51cf\u5c11\u529f\u80fd\u6d4b\u8bd5\u7684\u91cd\u590d\u52b3\u52a8\u529b\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3","title":"3\u3001\u5b58\u5728\u7684\u95ee\u9898","text":" \u5404\u5e94\u7528\u4e4b\u95f4\u5b58\u5728\u8026\u5408 \u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u521d\u671f\uff0c\u6240\u6709\u5e94\u7528\u662f\u6574\u4f53\u53d1\u5e03\uff0c\u6211\u4eec\u662f\u5c06\u6240\u6709\u5e94\u7528\u770b\u6210\u662f\u4e00\u4e2a\u6574\u4f53\uff0c\u5404\u5e94\u7528\u4f5c\u4e3a\u5176\u4e2d\u7684\u4e00\u4e2a\u6a21\u5757\uff0c\u6240\u4ee5\u5b58\u5728\u5e94\u7528\u95f4\u65b9\u6cd5\u4ea4\u53c9\u8c03\u7528\u7684\u95ee\u9898\uff0c\u8fd9\u6837\u4ece\u6700\u521d\u7684\u8bbe\u8ba1\u6765\u8bb2\u786e\u5b9e\u80fd\u591f\u51cf\u5c11\u91cd\u590d\u4ee3\u7801\u7684\u7f16\u5199\u3002\u4f46\u662f\u73b0\u5728\u5e94\u7528\u8d70\u72ec\u7acb\u53d1\u5e03\uff0c\u5404\u5e94\u7528\u90fd\u6709\u81ea\u5df1\u7684\u8fed\u4ee3\u8282\u594f\uff0c\u5728\u65b0\u9700\u6c42\u5feb\u901f\u53d8\u5316\u7684\u8fc7\u7a0b\u4e2d\uff0c\u81ea\u52a8\u5316\u7ef4\u62a4\u53d8\u5f97\u5f02\u5e38\u56f0\u96be\uff0c\u539f\u56e0\u5c31\u662f\u81ea\u52a8\u5316\u9879\u76ee\u91cc\u9762\u5404\u4e2a\u5e94\u7528\u7684\u6709\u6bd4\u8f83\u591a\u7684\u8026\u5408\u5173\u7cfb\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u8fdb\u884c\u89e3\u8026\uff0c\u4ee5\u9002\u5e94\u5e94\u7528\u4e0d\u540c\u7684\u8fed\u4ee3\u5468\u671f\u3002 \u65e0\u6cd5\u7cbe\u51c6\u7684\u5212\u5206\u7528\u4f8b\u8303\u56f4 \u7528\u4f8b\u6267\u884c\u7684\u8303\u56f4\u4e0d\u591f\u7cbe\u51c6\uff0c\u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u4e3b\u8981\u901a\u8fc7\u7528\u4f8b\u7684\u5173\u952e\u8bcd core\uff08\u6838\u5fc3\uff09\u6765\u533a\u5206\u7528\u4f8b\u662f\u5426\u4e3a\u6838\u5fc3\u7528\u4f8b\uff0c\u4f46\u662f\u8fd9\u6837\u7684\u533a\u5206\u592a\u5bbd\u6cdb\u4e86\uff0c\u4e0d\u80fd\u9002\u5e94\u81ea\u52a8\u5316\u6d4b\u8bd5\u5728\u591a\u573a\u666f\u4e0b\u7684\u5e94\u7528\u3002\u5f88\u591a\u573a\u666f\u4e0b\u6211\u4eec\u8fd8\u9700\u8981\u6839\u636e\u7528\u4f8b\u7684\u7b49\u7ea7\u3001\u7528\u4f8b\u7684\u7c7b\u578b\u3001\u7528\u4f8b\u6765\u6e90\u7b49\u7b49\uff0c\u4e0d\u540c\u7684\u7ef4\u5ea6\u6765\u6311\u9009\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u5173\u952e\u5b57\u9700\u8981\u4eba\u5de5\u4e00\u6761\u6761\u7684\u6539\uff0c\u8d39\u65f6\u8d39\u529b\uff0c\u800c\u4e14\u4e0d\u597d\u7ef4\u62a4\u3002 \u53d7\u65b0\u9700\u6c42\u5f71\u54cd\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u597d\u7ef4\u62a4 \u76ee\u524d\u9700\u8981\u8df3\u8fc7\u7684\u7528\u4f8b\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684\u7528\u4f8b\u811a\u672c\u91cc\u9762\uff0c\u6dfb\u52a0\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\uff0c\u540e\u7eed\u89e3\u9664\u8df3\u8fc7\u7684\u65f6\u5019\u53c8\u9700\u8981\u627e\u5230\u8fd9\u6761\u811a\u672c\uff0c\u5220\u6389\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\u3002\u5728\u8df3\u8fc7\u7528\u4f8b\u8f83\u591a\u7684\u60c5\u51b5\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u96be\u5ea6\u3002 \u7f16\u5199\u7528\u4f8b\u65f6\u903b\u8f91\u6bd4\u8f83\u590d\u6742\uff0c\u9700\u8981\u8c03\u7528\u591a\u4e2a\u5e94\u7528\u7684\u65b9\u6cd5\u6a21\u5757\u3002 \u6846\u67b6\u6269\u5c55\u6027\u4e0d\u8db3\uff0c\u65e0\u6cd5\u6574\u5408\u6027\u80fd\u81ea\u52a8\u5316\u3001\u538b\u6d4b\u81ea\u52a8\u5316\u3001\u5b89\u5168\u81ea\u52a8\u5316\u7b49\u4e13\u9879\u6d4b\u8bd5\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_3","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u4e3a\u89e3\u51b3\u73b0\u6709\u95ee\u9898\uff0c\u9002\u5e94\u4e0d\u65ad\u4e30\u5bcc\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u66f4\u597d\u7684\u53d1\u6325\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4f5c\u7528\uff0c\u9700\u8981\u5bf9\u81ea\u52a8\u5316\u67b6\u6784\u53ca\u5404\u529f\u80fd\u6a21\u5757\u8fdb\u884c\u91cd\u65b0\u8bbe\u8ba1\u89c4\u5212\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_1","title":"1\u3001\u67b6\u6784\u8bbe\u8ba1","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_1","title":"2\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u6846\u67b6\u7684\u8fd0\u884c\u903b\u8f91\uff1a\u901a\u8fc7\u6838\u5fc3\u5c42\u63d0\u4f9b\u4e00\u4e2a\u57fa\u7840\u80fd\u529b\uff0c\u4e1a\u52a1\u5c42\u6839\u636e\u5b9e\u9645\u4e1a\u52a1\u9700\u6c42\uff08\u6d4b\u8bd5\u7528\u4f8b\uff09\u52a8\u6001\u52a0\u8f7d\u6838\u5fc3\u5c42\uff0c\u6267\u884c\u5165\u53e3\u52a0\u8f7d\u76f8\u5e94\u7684\u7528\u4f8b\u96c6\u5e76\u63a7\u5236\u6267\u884c\uff0c\u5e94\u7528\u5c42\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u9700\u6c42\uff0c\u901a\u8fc7\u76f8\u5e94\u7684\u914d\u7f6e\u9879\u8fdb\u884c\u914d\u7f6e\uff0c\u4ece\u800c\u89e6\u53d1\u81ea\u52a8\u5316\u6d4b\u8bd5\u4efb\u52a1\u3002 \u6838\u5fc3\u5c42\uff1a\u57fa\u672c\u4fdd\u6301\u4e0d\u53d8\uff0c\u90e8\u5206\u6a21\u5757\u4f1a\u6d89\u53ca\u5230\u65b0\u529f\u80fd\u5f00\u53d1\uff0c\u6838\u5fc3\u5c42\u5404\u529f\u80fd\u6a21\u5757\u4fdd\u6301\u72ec\u7acb\u6027\uff0c\u63d0\u4f9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u4f9b\u4e0a\u5c42\u8c03\u7528\uff1b \u5e95\u5c42\u6838\u5fc3\u6a21\u5757\u5305\u62ec\uff1a \u56fe\u50cf\u8bc6\u522b\u6a21\u5757 UI \u5b9a\u4f4d\u6a21\u5757 Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757 \u5c5e\u6027\u5b9a\u4f4d\u6a21\u5757 \u65e5\u5fd7\u6a21\u5757 \u952e\u9f20\u64cd\u4f5c\u6a21\u5757 \u6587\u4ef6\u64cd\u4f5c\u6a21\u5757 \u5f55\u5c4f\u6a21\u5757 \u81ea\u5b9a\u4e49\u65ad\u8a00\u6a21\u5757 \u7528\u4f8b\u6267\u884c\u6a21\u5757 PXE \u88c5\u673a\u6a21\u5757 \u952e\u9f20\u4fe1\u53f7\u6a21\u62df\u6a21\u5757 OCR \u6a21\u5757 \u4e1a\u52a1\u5c42\uff1a\u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e94\u7528\u5185\u5305\u542b\u591a\u4e2a\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5982\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7b49\uff0c\u540e\u7eed\u53ef\u4ee5\u6839\u636e\u9700\u8981\u5ac1\u63a5\u8fdb\u6765\u3002\u5176\u4e2d\u529f\u80fd\u6d4b\u8bd5\u8bbe\u8ba1\u601d\u8def\uff1a \u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e76\u5c06\u6d4b\u8bd5\u6570\u636e\u548c\u6d4b\u8bd5\u8d44\u6e90\u6574\u5408\u8fdb\u6765\uff0c\u589e\u52a0\u7528\u4f8b\u6807\u7b7e csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ed9\u6bcf\u6761\u7528\u4f8b\u6253\u6807\u7b7e\u3002 \u5404\u6807\u7b7e\u6240\u4f7f\u7528\u5bf9\u5e94\u7684\u5b57\u6bb5\u540d\u79f0\uff0c\u4f7f\u7528 csv \u6587\u4ef6\u7ef4\u62a4\u7528\u4f8b\u4e0e\u6807\u7b7e\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u5bf9\u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u53ef\u4ee5\u7ec4\u5408\u5176\u4e2d\u7684\u6807\u7b7e\u800c\u4ece\u9a71\u52a8\u5bf9\u5e94\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\uff0c\u517c\u5bb9\u73b0\u6709\u7528\u4f8b\u6807\u7b7e\uff0c\u4e14\u652f\u6301\u7528\u4f8b\u6807\u7b7e\u53ef\u6269\u5c55\uff1b \u4f7f\u7528 csv \u683c\u5f0f\u6587\u4ef6\u53ef\u4ee5\u65b9\u4fbf\u7684\u4f7f\u7528 Excel \u8868\u683c\u6253\u5f00\u8fdb\u884c\u7f16\u8f91\uff0c\u540c\u65f6\u7531\u4e8e csv \u6587\u4ef6\u5b9e\u9645\u662f\u4ee5\u90fd\u597d\u5206\u9694\u7684\u6587\u672c\u6587\u4ef6\uff0c\u4ee3\u7801\u4e2d\u53ef\u4ee5\u5728\u4e0d\u4f9d\u8d56\u4e09\u65b9\u5e93\u7684\u60c5\u51b5\u4e0b\u65b9\u4fbf\u5feb\u901f\u7684\u89e3\u6790\u5b83\uff0c\u53ef\u64cd\u4f5c\u6027\u548c\u53ef\u7ef4\u62a4\u6027\u8f83\u9ad8\u3002 \u5404\u4e2a\u5e94\u7528\u4e4b\u95f4\uff0c\u7528\u4f8b\u3001\u65b9\u6cd5\u3001\u6807\u7b7e\u548c\u8d44\u6e90\u90fd\u662f\u76f8\u4e92\u72ec\u7acb\u7684\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u7528\u4f8b\u65f6\u53ea\u9700\u8981\u81ea\u5df1\u5e94\u7528\u4e0b\u7684\u65b9\u6cd5\u548c\u516c\u5171\u5e93\u5373\u53ef\u3002 \u7ed3\u6784\u4e3e\u4f8b\uff1a .\n\u251c\u2500\u2500 apps\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_album # \u5e94\u7528\u540d (\u7528\u4e0b\u5212\u7ebf\u8fde\u63a5\u662f Python \u7f16\u7801\u89c4\u8303)\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_assert # \u65ad\u8a00\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_function_tag.csv # \u7528\u4f8b\u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 asan_cases # \u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases # \u529f\u80fd\u6d4b\u8bd5\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 res # \u6d4b\u8bd5\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config # \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_widget # \u5e94\u7528\u81ea\u5df1\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_widget # \u65b9\u6cd5\u57fa\u7c7b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 other_widget # \u8c03\u7528\u5176\u4ed6\u5e94\u7528\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_camera\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases\n\u2502\u00a0\u00a0 \u2502\u00a0 ...\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 public_widget # \u516c\u5171\u65b9\u6cd5\u5e93\n\u251c\u2500\u2500 config # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n...\n config \u914d\u7f6e\u6a21\u5757\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u76f8\u5e94\u914d\u7f6e\uff0c\u6d4b\u8bd5\u540c\u5b66\u53ef\u4ee5\u6839\u636e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5728 config \u91cc\u9762\u8fdb\u884c\u914d\u7f6e\u3002 \u5168\u5c40\u914d\u7f6e\uff1a \u6267\u884c\u4e00\u4e2a\u6216\u591a\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff1a\u5728 pattern \u91cc\u9762\u5199\u5165\u5e94\u7528\u5305\u540d\uff0c\u591a\u4e2a\u5e94\u7528\u4e4b\u95f4\u7528 or \u8fde\u63a5\uff0c\u5982 deepin-music or deepin-movie\uff1b \u5192\u70df\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a smoke\uff1b \u96c6\u6210\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a core \uff1b \u5168\u91cf\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u4e3a\u7a7a\u5373\u53ef\uff1b \u901a\u8fc7 tags \u7684\u914d\u7f6e\u6bd4\u8f83\u7075\u6d3b\uff0c\u540e\u9762\u6807\u7b7e\u5316\u7ba1\u7406\u7ae0\u8282\u4f1a\u8bb2\u5230\uff0c\u652f\u6301\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u7075\u6d3b\u914d\u7f6e\u3002 \u6307\u5b9a\u67d0\u53f0\u673a\u5668\u5728\u6307\u5b9a\u955c\u50cf\u7248\u672c\u4e0a\u6267\u884c\u7528\u4f8b\uff1a\u5728 IP \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a IP\uff0c\u5e76\u5728 URL \u91cc\u9762\u586b\u5165\u955c\u50cf\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u6846\u67b6\u4f1a\u8c03\u7528 PXE \u8fdb\u884c\u81ea\u52a8\u88c5\u673a\uff0c\u88c5\u673a\u5b8c\u4e4b\u540e\u81ea\u52a8\u5f00\u59cb\u6267\u884c\u914d\u7f6e\u7684\u6d4b\u8bd5\u7528\u4f8b\u3002 \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\uff1a \u6bcf\u4e2a\u5e94\u7528\u5185\u90e8\u4f1a\u6709\u4e00\u4e2a\u5355\u72ec\u7684\u914d\u7f6e\u6a21\u5757\uff0c\u4f1a\u5305\u542b\u4e00\u4e9b\u672c\u5e94\u7528\u7684\u6d4b\u8bd5\u8d44\u6e90\u7684\u8def\u5f84\u3001\u6267\u884c\u7528\u4f8b\u7684\u6807\u7b7e\u914d\u7f6e\u7b49\u7b49\uff0c\u5982\u679c\u5728\u5c40\u90e8\u914d\u7f6e\u91cc\u9762\u914d\u7f6e\u4e86\u7528\u4f8b\u6267\u884c\u6807\u7b7e\uff0c\u800c\u5916\u5c42 runner \u51fa\u6ca1\u6709\u6307\u5b9a\u6267\u884c\u6807\u7b7e\uff0c\u5219\u5728\u6267\u884c\u65f6\u53ea\u4f1a\u6267\u884c\u5c40\u90e8\u914d\u7f6e\u5df2\u914d\u7f6e\u7684\uff0c\u82e5\u5916\u5c42 runner \u4e5f\u914d\u7f6e\u4e86\u6267\u884c\u6807\u7b7e\uff0c\u5219\u4f1a\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u7528\u4f8b\u3002 \u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u914d\u7f6e\u90fd\u5728\u540c\u4e00\u4e2a\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\uff0cpy \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684\u7c7b\uff0cini \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684 option\u3002 \u5168\u5c40\u914d\u7f6e\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u7b56\u7565\u5982\u4e0b\uff1a \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5c40\u90e8\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5e94\u7528\u5c42\uff1arunner \u662f\u6d4b\u8bd5\u6267\u884c\u7684\u5165\u53e3\uff0c\u5b83\u4f1a\u6839\u636e\u914d\u7f6e\u91cc\u9762\u7684\u914d\u7f6e\u9879\uff0c\u8fdb\u884c\u7528\u4f8b\u7684\u52a0\u8f7d\u548c\u6267\u884c\u3002\u5b83\u63d0\u4f9b\u63a5\u53e3\u7ed9\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\uff0c\u5e73\u53f0\u4e0a\u7684\u6307\u4ee4\u5b9e\u9645\u4e0a\u90fd\u662f\u901a\u8fc7\u4e0b\u53d1\u7ed9 runner\uff0c\u7136\u540e\u7531 runner \u6765\u6267\u884c\u76f8\u5e94\u7684\u6d4b\u8bd5\u3002 \u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u662f\u4e00\u4e2a\u524d\u7aef\u7cfb\u7edf\uff0c\u53ef\u4ee5\u8fdb\u884c\u6d4b\u8bd5\u673a\u7ba1\u7406\u3001\u81ea\u52a8\u5b89\u88c5\u955c\u50cf\u3001\u81ea\u52a8\u5b89\u88c5\u6307\u5b9a\u5e94\u7528\u7248\u672c\u3001\u8fdb\u884c\u6d4b\u8bd5\u7528\u4f8b\u8303\u56f4\u9009\u62e9\u3001\u7528\u4f8b\u89e6\u53d1\u6267\u884c\u63a7\u5236\u3001\u7ed3\u679c\u5c55\u793a\u8f93\u51fa\u7b49\u3002 \u4e00\u4e2a\u5e94\u7528\u7684\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\u90fd\u53ef\u4ee5\u5355\u72ec\u89e6\u53d1\u3002 \u517c\u5bb9\u6027\u6d4b\u8bd5\u4e3b\u8981\u901a\u8fc7 PXE \u670d\u52a1\u5668\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u88c5\u673a\uff0c\u7136\u540e\u914d\u5408 AT \u8fdb\u884c\u6d4b\u8bd5\uff0c\u53ef\u4ee5\u5b9e\u73b0\u4e0d\u540c\u7cfb\u7edf\u7248\u672c\u3001\u4e0d\u540c\u5e94\u7528\u7248\u672c\u73af\u5883\u4e0a\u90fd\u53ef\u4ee5\u8fdb\u884c\u81ea\u52a8\u5316\u7684 AT \u6267\u884c\uff0c\u63d0\u9ad8\u517c\u5bb9\u6027\u6d4b\u8bd5\u6548\u7387\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_4","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_2","title":"1\u3001\u7528\u4f8b\u89e3\u8026","text":"\u5b58\u5728\u8026\u5408\u5173\u7cfb\u7684\u65b9\u6cd5\uff1a\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u88ab\u5916\u90e8\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\uff0c\u5219\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u8026\u5408\u5173\u7cfb\u3002 1.1\u3001\u901a\u8fc7\u7f16\u8f91\u5668 Find Usages \u67e5\u770b\u6bcf\u4e2a\u65b9\u6cd5\u88ab\u8c03\u7528\u7684\u8def\u5f84\u548c\u88ab\u8c03\u7528\u6b21\u6570\uff1b 1.2\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 1 \u4e2a\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728\u5916\u90e8\u5e94\u7528\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1b 1.3\u3001\u64cd\u4f5c\u5c42\u6587\u4ef6\u540d\u5747\u4ee5 widget \u7ed3\u5c3e\uff0c\u7c7b\u540d\u4ee5 Widget \u7ed3\u5c3e\uff0c\u5982\uff1a\u6587\u4ef6\u540d music_widget.py \uff1a class MusicWidget:\n\"\"\"\u97f3\u4e50\u7684\u64cd\u4f5c\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_2","title":"2\u3001\u516c\u5171\u5e93\u5efa\u8bbe","text":"2.1\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 2 \u4e2a\u53ca\u4ee5\u4e0a\u7684\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728 public_widget \u76ee\u5f55\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1bpublic_widget \u5373\u4e3a\u516c\u5171\u65b9\u6cd5\u5e93\uff1b 2.2\u3001\u5728\u7528\u4f8b\u5c42\u4fee\u6539\u7528\u4f8b\u4e2d\u7c7b\u7684\u5bfc\u5165\u8def\u5f84\uff0c\u5c5e\u4e8e\u516c\u5171\u65b9\u6cd5\u7684\u5219\u8c03\u7528 public_widget \u4e2d\u7684\u7c7b\uff0c\u5916\u90e8\u5e94\u7528\u7684\u64cd\u4f5c\u65b9\u6cd5\uff0c\u5219\u8c03\u7528\u672c\u5e94\u7528\u76ee\u5f55\u4e0b\u91cd\u5199\u7684\u5916\u90e8\u5e94\u7528\u65b9\u6cd5\u3002 \u6bd4\u5982\uff1a\u51e0\u4e4e\u6240\u6709\u591a\u5a92\u4f53\u5e94\u7528\u90fd\u9700\u8981\u901a\u8fc7\u6587\u7ba1\u52a0\u8f7d\u8d44\u6e90\uff0c\u8c03\u8d77\u7684\u6587\u7ba1\u5bf9\u8bdd\u6846\u5b9e\u9645\u4e3a dde-desktop\uff0c\u56e0\u6b64\u5c06 desktop_widget.py \u653e\u5230 public_widget \u91cc\u9762\uff1a class DdeDesktopPublicWidget:\n\"\"\"\u516c\u5171-\u684c\u9762\u7684\u64cd\u4f5c\u65b9\u6cd5\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3_1","title":"3\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406","text":"3.1\u3001\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1a\u5bf9\u5e94 core\u3001smoke\uff0c\u6216\u4e3a\u7a7a\uff1b \u7528\u4f8b\u6765\u6e90\uff1a\u5bf9\u5e94 PMS \u7528\u4f8b\u6765\u6e90\uff0c\u5206\u522b\u7528 acp1\u3001acp2\u3001acp3\u3001acp4 \u8868\u793a\u3002 acp1 \uff1a\u4e1a\u52a1\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5199\u7684\u7528\u4f8b\uff0c\u88ab\u7528\u4e8e\u9a8c\u6536\u6d4b\u8bd5\u7684\uff1b acp2 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5f15\u5165\u7684\u4ea7\u54c1\u9a8c\u6536\u6d4b\u8bc4\u90e8\u7684\u7528\u4f8b\uff1b acp3 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u6839\u636e\u4ea7\u54c1\u9700\u6c42\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\uff1b acp4 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u901a\u8fc7\u793e\u533a\u3001\u8bba\u575b\u7528\u6237\u53cd\u9988\u95ee\u9898\u603b\u7ed3\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\u3002 \u4e3e\u4f8b\uff1a \u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u7528\u4f8b\u6765\u6e90 001 L1 core acp1 \u6807\u7b7e\u91c7\u7528\u679a\u4e3e\u7684\u65b9\u5f0f\u8fdb\u884c\u4ee3\u53f7\u7ba1\u7406\u65b9\u4fbf\u7ba1\u7406\u4ee5\u53ca\u540e\u7eed\u6269\u5c55\u3002 3.2\u3001\u5728\u6bcf\u4e2a\u5e94\u7528\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u7b2c\u4e00\u5217\u4e3a\u7528\u4f8b\u7684 ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ba1\u7406\u6a21\u5757\u5185\u7684\u7528\u4f8b\u6807\u7b7e\u3002\u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 3.3\u3001\u5bf9\u7167 PMS \u4e0a\u7528\u4f8b\u7b49\u7ea7\u3001\u7528\u4f8b\u7c7b\u578b\u548c\u7528\u4f8b\u6765\u6e90\uff0c\u6807\u8bb0\u6240\u6709\u5df2\u5b9e\u73b0\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u540e\u7eed\u7f16\u5199\u65b0\u589e\u81ea\u52a8\u5316\u7528\u4f8b\u65f6\uff0c\u6bcf\u5199\u4e00\u6761\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684 csv \u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u6b64\u6761\u7528\u4f8b\u7684\u6807\u7b7e\u3002 3.4\u3001\u8df3\u8fc7\u7528\u4f8b\u6807\u7b7e\u5316 \u73b0\u6709\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a\uff1a \u4e3e\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u8bb0\u4e3a \u201cskip-\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u8bb0\uff0c\u5982\u679c\u5df2\u7ecf\u6807\u8bb0\u4e86\u8df3\u8fc7\u539f\u56e0\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u8bb0\u4e3a SKIPED\uff0c\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\u3002 \u6240\u6709\u7684\u6807\u7b7e\u5728 docs \u76ee\u5f55\u4e0b\u4f1a\u6709\u4e00\u4e2a\u6587\u6863\uff0c\u6587\u6863\u6682\u5b9a\u540d\u79f0\u4e3a\uff1atags_info.md\uff0c\u7528\u4e8e\u8bf4\u660e\u73b0\u5728\u5df2\u7ecf\u4f7f\u7528\u5230\u7684\u6807\u7b7e\uff0c\u4ee5\u53ca\u8fd9\u4e9b\u6807\u7b7e\u7684\u89e3\u91ca\u548c\u7528\u6cd5\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#4","title":"4\u3001\u7528\u4f8b\u6267\u884c","text":"4.1\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u7684\u9a71\u52a8\u6267\u884c\u903b\u8f91\u529f\u80fd\u5b9e\u73b0 \u5f00\u53d1\u6839\u636e\u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\u91cc\u9762\u7684\u7528\u4f8b\u6807\u7b7e\u6267\u884c\u5bf9\u5e94\u7528\u4f8b\u7684\u529f\u80fd\uff0c\u80fd\u652f\u6301\u591a\u4e2a\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u6267\u884c\u5165\u53e3\u80fd\u968f\u610f\u901a\u8fc7\u7528\u4f8b\u6807\u7b7e\u6307\u5b9a\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002 \u7528\u4f8b\u6807\u7b7e\u7684\u9a71\u52a8\u65b9\u5f0f\u5fc5\u987b\u80fd\u652f\u6301\u6807\u7b7e\u7684\u6269\u5c55\uff0c\u672a\u6765\u968f\u7740\u4e1a\u52a1\u7684\u53d8\u5316\u53ef\u80fd\u9700\u8981\u589e\u52a0\u5404\u79cd\u5404\u6837\u7684\u6807\u7b7e\u3002 4.2\u3001\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u6267\u884c \u529f\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u3001\u6027\u80fd\u6d4b\u8bd5\u7b49\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u662f\u5206\u5f00\u6267\u884c\u7684\uff0c\u4e5f\u5c31\u662f\u5728\u4e00\u6b21\u6267\u884c\u4e2d\uff0c\u53ea\u80fd\u6267\u884c\u5176\u4e2d\u4e00\u79cd\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5177\u4f53\u8981\u6267\u884c\u54ea\u4e00\u79cd\u540c\u6837\u901a\u8fc7\u53c2\u6570\u6765\u63a7\u5236\u3002 4.3\u3001\u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c \u7531\u4e8e\u6d4b\u8bd5\u673a\u8d44\u6e90\u6709\u9650\uff0c\u968f\u7740\u81ea\u52a8\u5316\u7528\u4f8b\u6570\u91cf\u7684\u589e\u52a0\uff0cCI \u6267\u884c\u65f6\u95f4\u4f1a\u8d8a\u6765\u8d8a\u957f\u3002 \u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c\u7684\u529f\u80fd\uff1a \u540c\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\u5206\u6563\u5230\u4e0d\u540c\u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u4e0a\u6267\u884c\uff0c\u7f29\u77ed\u6267\u884c\u603b\u65f6\u95f4\uff1b \u7b2c\u4e8c\u5929\u8dd1\u7684\u65f6\u5019\u540c\u4e00\u4e2a\u673a\u5668\u4e0a\u4f1a\u6267\u884c\u6628\u5929\u6ca1\u6709\u6267\u884c\u5230\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u6267\u884c\u540c\u7406\uff1b \u53ef\u4ee5\u5b9e\u73b0\u5728\u5168\u67b6\u6784\u6d4b\u8bd5\u673a\u4e0a\u8f6e\u6d41\u6267\u884c\u7528\u4f8b\uff0c\u65e2\u80fd\u4fdd\u8bc1\u6267\u884c\u4e86\u6240\u6709\u7684\u7528\u4f8b\uff0c\u53c8\u80fd\u5728\u8d44\u6e90\u6709\u9650\u7684\u60c5\u51b5\u4e0b\u8986\u76d6\u4e86\u6240\u6709\u7684\u67b6\u6784\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#5","title":"5\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0","text":"5.1\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u4f5c\u4e3a\u524d\u7aef\u754c\u9762\u7cfb\u7edf\uff0c\u901a\u8fc7\u9875\u9762\u4e0a\u7684\u4e00\u4e9b\u529f\u80fd\u9009\u9879\u8fdb\u884c\u5bf9\u5e94\u6d4b\u8bd5\u4efb\u52a1\u7684\u7ba1\u7406\u6216\u89e6\u53d1\uff0c\u4e1a\u5185\u6bd4\u8f83\u6d41\u884c\u7684\u5b9e\u73b0\u65b9\u6848\u662f\u4f7f\u7528 Vue + DRF \u5b9e\u73b0\u4e00\u4e2a\u524d\u540e\u7aef\u5206\u79bb\u7684\u7cfb\u7edf\u3002 \u6d4b\u8bd5\u5e73\u53f0\u53ef\u80fd\u4f1a\u6d89\u53ca\u5230\u7684\u6a21\u5757\u6709\uff1a\u6d4b\u8bd5\u673a\u8d44\u6e90\u7ba1\u7406\u6a21\u5757\u3001\u7528\u4f8b\u6267\u884c\u63a7\u5236\u6a21\u5757\u3001\u7ed3\u679c\u5c55\u793a\u6a21\u5757\u3001PXE \u955c\u50cf\u5b89\u88c5\u6a21\u5757\u7b49\u3002 \u7528\u6237\uff08\u6d4b\u8bd5\u3001\u7814\u53d1\u540c\u5b66\u7b49\uff09\u53ef\u4ee5\u914d\u7f6e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5982\u6267\u884c\u54ea\u4e2a\u5e94\u7528\u3001\u6267\u884c\u7528\u4f8b\u7684\u8303\u56f4\u3001\u5728\u54ea\u53f0\u673a\u5668\u4e0a\u6267\u884c\u3001\u955c\u50cf\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u5e94\u7528\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u6267\u884c\u65f6\u95f4\u3002 5.2\u3001\u6267\u884c\u5165\u53e3 runner \u63d0\u4f9b\u7ed9\u6d4b\u8bd5\u5e73\u53f0\u7684\u63a5\u53e3\u5305\u62ec\uff1a\u7528\u4f8b\u6267\u884c\u63a5\u53e3\u3001\u7ed3\u679c\u8fd4\u56de\u63a5\u53e3\u3001\u955c\u50cf\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u955c\u50cf\u5b89\u88c5\u63a5\u53e3\u3001\u5e94\u7528\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u5e94\u7528\u5b89\u88c5\u66f4\u65b0\u63a5\u53e3\u7b49\u3002 \u524d\u7aef\u5e73\u53f0\u76ee\u524d\u8fd8\u6ca1\u6709\u592a\u591a\u8be6\u7ec6\u7684\u65b9\u6848\uff0c\u672c\u6b21\u8bbe\u8ba1\u4e3b\u8981\u96c6\u4e2d\u5728\u540e\u7aef\u8fd9\u90e8\u5206\u67b6\u6784\u7684\u8bbe\u8ba1\u4e0a\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_5","title":"\u56db\u3001\u5b9e\u65bd\u8ba1\u5212","text":"\u8fd1\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u6587\u7ba1\u4ee3\u7801\u89e3\u8026 2022/3/28 2022/4/8 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u56fe\u5f62\u56fe\u50cf\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u97f3\u89c6\u9891\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5168\u5c40\u641c\u7d22\u4ee3\u7801\u89e3\u8026 2022/4/25 2022/4/26 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u516c\u5171\u5e93\u5efa\u8bbe 2022/4/27 2022/5/5 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5c01\u88c5\u7684\u65b9\u6cd5\u6574\u7406\u6210\u4e00\u4e2a\u8868 2022/5/6 2022/5/10 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7528\u4f8b\u6807\u7b7e\u5206\u7c7b\u8bc4\u4f30 2022/5/11 2022/5/11 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u6807\u7b7e\u5316\u6267\u884c\u9a71\u52a8\u7a0b\u5e8f\u7f16\u5199 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u9700\u5b9e\u73b0\u81ea\u52a8\u89e3\u6790 csv \u8868\u683c\u4e2d\u7684\u7528\u4f8b\u7f16\u53f7 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u722c\u866b\u811a\u672c\uff0c\u722c\u53d6 pms \u4e0a\u7528\u4f8b\u7684\u6807\u7b7e 2022/5/11 2022/5/13 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u5b9a\u65f6\u81ea\u52a8\u7ef4\u62a4\u672c\u5730 csv \u6587\u4ef6\u811a\u672c 2022/5/11 2022/5/20 \u4e2d\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u76ee\u5f55\u7ed3\u6784\u8c03\u6574 2022/5/20 2022/6/2 \u5b8c\u6210\u5168\u5c40\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u5177\u4f53\u65b9\u6848\u548c\u903b\u8f91\u5b9e\u73b0 2022/6/6 2022/6/17 \u9759\u6001\u626b\u63cf\u95ee\u9898\u6e05\u96f6 2022/6/20 2022/7/1 \u5b8c\u6210\u65b0\u6846\u67b6\u4f7f\u7528\u57f9\u8bad 2022/7/4 2022/7/11 \u843d\u5730\u8fd0\u884c 2022/7/12 2022/7/20 \u5e95\u5c42\u5e93\u7528\u9014\u8bf4\u660e\u6587\u6863\u7f16\u5199 2022/7/21 2022/7/28"}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\u200b\\u3000\\-\u3001\u3002\uff0c\uff0e\uff1f\uff01\uff1b]+","pipeline":["stemmer"]},"docs":[{"location":"","title":"\u9996\u9875","text":""},{"location":"#youqu","title":"\u6709\u8da3\uff08YouQu\uff09","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/4/1\n# Author : Mikigo\n# =============================================\n \u672c\u7ad9\u603b\u8bbf\u95ee\u91cf \u6b21 \u6b22\u8fce\u5728\u6d4f\u89c8\u5668\u8bbf\u95ee\u3010\u516c\u7f51\u6587\u6863\u3011 \u7edf\u4fe1\u516c\u53f8\u5185\u7f51\u8fd8\u53ef\u4ee5\u8bbf\u95ee\u3010\u5185\u7f51\u6587\u6863\u3011\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u54e6~~"},{"location":"#_1","title":"\u4e00\u3001\u7b80\u4ecb","text":"\u6709\u8da3\uff08YouQu\uff09\u662f\u6df1\u5ea6\u79d1\u6280\u8bbe\u8ba1\u548c\u5f00\u53d1\u7684\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff0c\u91c7\u7528\u7ed3\u6784\u5206\u5c42\u7684\u8bbe\u8ba1\u7406\u5ff5\uff0c\u652f\u6301\u591a\u5143\u5316\u5143\u7d20\u5b9a\u4f4d\u548c\u65ad\u8a00\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\u3001\u5f3a\u5927\u7684\u65e5\u5fd7\u548c\u62a5\u544a\u8f93\u51fa\u7b49\u7279\u8272\u529f\u80fd\uff0c\u540c\u65f6\u5b8c\u7f8e\u517c\u5bb9X11\u3001Wayland\u663e\u793a\u534f\u8bae\uff0c\u73af\u5883\u90e8\u7f72\u7b80\u5355\uff0c\u64cd\u4f5c\u6613\u4e0a\u624b\u3002"},{"location":"#17","title":"\u7231\u4e0a \u201c\u6709\u8da3\u201d \u7684 17 \u4e2a\u7406\u7531","text":" \u6838\u5fc3\u5e93\u63d0\u4f9b\u4e86\u7edf\u4e00\u7684\u63a5\u53e3\uff0c\u7f16\u5199\u65b9\u6cd5\u65f6\u53ea\u9700\u8981\u5bfc\u5165\u4e00\u4e2a\u5305\u5c31\u53ef\u4ee5\u4f7f\u7528\u5230\u6838\u5fc3\u5e93\u63d0\u4f9b\u7684\u6240\u6709\u529f\u80fd\uff1b \u516c\u5171\u5e93\u5c01\u88c5\u4e86\u5f88\u591a\u5e38\u7528\u6a21\u5757\u7684\u76f8\u5173\u65b9\u6cd5\uff0c\u6bd4\u5982\uff1a\u4efb\u52a1\u680f\u7684\u64cd\u4f5c\u3001\u684c\u9762\u7684\u64cd\u4f5c\u3001\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\u7b49\u7b49\uff1b \u9664\u4e86\u5e38\u7528\u7684\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u8bc6\u522b\u4ee5\u5916\uff0c\u6211\u4eec\u8fd8\u63d0\u4f9b\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u5176\u4f7f\u7528\u7b80\u5355\u4e14\u9ad8\u6548\uff0c\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff1b \u5bf9\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u5c06\u7f16\u5199\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u53d8\u5f97\u7b80\u5355\u800c\u4f18\u96c5\uff1b \u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u6280\u672f\u8fdb\u884c\u529f\u80fd\u5347\u7ea7\uff0c\u9664\u4e86\u652f\u6301\u5355\u4e2a\u5750\u6807\u8fd4\u56de\uff0c\u8fd8\u652f\u6301\u540c\u4e00\u754c\u9762\u4e0b\u591a\u4e2a\u76f8\u540c\u5143\u7d20\u8fd4\u56de\u591a\u4e2a\u5750\u6807\u7684\u529f\u80fd\uff1b \u63d0\u4f9b\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u548c\u6279\u91cf\u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u4e0d\u5230\u4e00\u4e2a csv \u6587\u4ef6\u539f\u6765\u80fd\u5e72\u8fd9\u4e48\u591a\u4e8b\u60c5\uff1b \u63d0\u4f9b\u4e86\u529f\u80fd\u5f3a\u5927\u7684\u6267\u884c\u5668\u5165\u53e3\uff0c\u8ba9\u4f60\u53ef\u4ee5\u65b9\u4fbf\u7684\u5728\u672c\u5730\u6267\u884c\u4efb\u4f55\u7528\u4f8b\u96c6\u7684\u7528\u4f8b\uff0c\u5176\u4e30\u5bcc\u7684\u81ea\u5b9a\u4e49\u914d\u7f6e\u9879\uff0c\u6ee1\u8db3\u4f60\u5bf9\u6267\u884c\u5668\u6240\u6709\u7684\u5e7b\u60f3\uff1b \u63d0\u4f9b\u8fdc\u7a0b\u6267\u884c\u7684\u529f\u80fd\uff0c\u53ef\u4ee5\u63a7\u5236\u591a\u53f0\u673a\u5668\u5e76\u884c\u8dd1\uff0c\u6216\u8005\u5206\u5e03\u5f0f\u8dd1\uff0c\u8fd9\u79cd\u4ed8\u8d39\u529f\u80fd\u73b0\u5728\u514d\u8d39\u7ed9\u4f60\u7528\uff1b \u63d0\u4f9b\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u529f\u80fd\uff0c\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u6bcf\u4e2a\u65b9\u6cd5\u5355\u72ec\u5199\u8f93\u51fa\u65e5\u5fd7\u7684\u4ee3\u7801\uff0c\u4e00\u5207\u6211\u4eec\u7ed9\u4f60\u641e\u5b9a\u4e86\uff0c\u65e5\u5fd7\u8f93\u51fa\u4e0d\u4ec5\u5185\u5bb9\u4e30\u5bcc\uff0c\u989c\u503c\u4e5f\u7edd\u5bf9\u5728\u7ebf\uff0c\u6211\u4eec\u8fd8\u81ea\u5df1\u8bbe\u8ba1\u4e86\u4e00\u6b3e\u7ec8\u7aef\u8f93\u51fa\u4e3b\u9898\u53eb\u300a\u4e94\u5f69\u6591\u6593\u7684\u9ed1\u300b\uff1b \u63d0\u4f9b\u4e86\u4e00\u952e\u90e8\u7f72\u81ea\u52a8\u5316\u6d4b\u8bd5\u73af\u5883\u7684\u529f\u80fd\uff0c\u8fde\u4ee3\u7801\u7f16\u8f91\u5668\u90fd\u7ed9\u4f60\u88c5\u597d\u4e86\uff0c\u8ba9\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u73af\u5883\u90e8\u7f72\u800c\u70e6\u607c\uff1b \u63d0\u4f9b\u4e86\u81ea\u52a8\u751f\u6210\u591a\u79cd\u62a5\u544a\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u8f93\u51fa\u4ec0\u4e48\u62a5\u544a\u5f62\u5f0f\u90fd\u884c\uff0c\u800c\u4e14\u6211\u4eec\u5728\u62a5\u544a\u4e2d\u8fd8\u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\u548c\u5931\u8d25\u622a\u56fe\u7684\u529f\u80fd\uff1b \u5bf9\u65ad\u8a00\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u63d0\u4f9b\u66f4\u53cb\u597d\u5316\u7684\u9519\u8bef\u63d0\u793a\uff0c\u8ba9\u5b9a\u4f4d\u95ee\u9898\u7cbe\u51c6\u9ad8\u6548\uff1b \u4e0d\u4ec5\u652f\u6301\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u63a7\u5236\uff0c\u800c\u4e14\u8fd8\u652f\u6301\u52a8\u6001\u63a7\u5236\u7528\u4f8b\u6279\u91cf\u6267\u884c\u7684\u603b\u65f6\u95f4\uff0c\u786e\u4fdd CI \u73af\u5883\u4e0b\u80fd\u987a\u7545\u8fd0\u884c\uff1b \u652f\u6301\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\u6267\u884c\u3001PMS \u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6807\u7b7e\u5316\u6267\u884c\u65b9\u6848\uff0c\u6ee1\u8db3\u4f60\u5404\u79cd\u573a\u666f\u4e0b\u7684\u6267\u884c\u9700\u6c42\uff1b \u652f\u6301\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u529f\u80fd\uff0c\u53ef\u5b9a\u4f4d\u53ef\u65ad\u8a00\uff0c\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\uff1b \u5b8c\u7f8e\u517c\u5bb9 Wayland \u548c X11\uff0c\u771f\u6b63\u505a\u5230\u4e00\u5957\u4ee3\u7801\uff0c\u968f\u5904\u6267\u884c\uff1b \u652f\u6301\u591a\u79cd\u65b9\u5f0f\u7684\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u5176\u4e2d\u5f02\u6b65\u56de\u586b\u7684\u65b9\u6848\uff0c\u5b8c\u7f8e\u89e3\u51b3\u4e86\u6570\u636e\u56de\u586b\u7684\u8017\u65f6\u95ee\u9898\uff1b \u3010\u89c6\u9891\u4ecb\u7ecd\u3011"},{"location":"#_2","title":"\u4e8c\u3001\u5b89\u88c5\u4f7f\u7528","text":"\u57fa\u7840\u6846\u67b6\uff1ahttps://github.com/linuxdeepin/deepin-autotest-framework \u4ece PyPI \u5b89\u88c5: sudo pip3 install youqu\n \u521b\u5efa\u9879\u76ee: youqu-startproject youqu\n \u5b89\u88c5\u4f9d\u8d56: cd youqu\nbash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002 \u5e94\u7528\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684\u5e94\u7528\u540d\u79f0\u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music cd apps/\n \u5c06\u5e94\u7528\u5e93\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u50cf\u8fd9\u6837\uff1a youqu\n\u251c\u2500\u2500 apps\n\u2502 \u251c\u2500\u2500 autotest_deepin_music # \u5e94\u7528\u5e93\n...\n \u5e94\u7528\u5e93\u7684\u540d\u79f0\u4e0d\u53ef\u4ee5\u4fee\u6539\u3002"},{"location":"#_3","title":"\u4e09\u3001\u8fd0\u884c","text":""},{"location":"#1","title":"1. \u5de5\u4f5c\u7a7a\u95f4","text":"\u57fa\u7840\u6846\u67b6\u5de5\u7a0b\u76ee\u5f55\u5efa\u8bae\u653e\u5728 ~ \u76ee\u5f55\u4e0b\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u4e5f\u53ef\u4ee5\u8fd0\u884c\uff0c\u4f46\u662f\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u9700\u8981\u505a\u73af\u5883\u6e05\u7406\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u5b58\u5728\u4ee3\u7801\u88ab\u5220\u9664\u7684\u98ce\u9669\u3002 \u5982\u679c\u4f60\u7684\u673a\u5668\u4e0a\u4e0d\u540c\u76ee\u5f55\u4e0b\u5b58\u5728\u591a\u4e2a YouQu \u5de5\u7a0b\uff0c\u90a3\u4e48\u5728\u8fd0\u884c\u4e4b\u524d\uff0c\u8bf7\u5148\u6267\u884c env.sh \u6821\u6b63\u76f8\u5173\u73af\u5883\u3002"},{"location":"#2","title":"2. \u6267\u884c\u5668","text":"\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u6709\u4e00\u4e2a manage.py \uff0c\u5b83\u662f\u4e00\u4e2a\u6267\u884c\u5668\u5165\u53e3\uff0c\u63d0\u4f9b\u4e86\u672c\u5730\u6267\u884c\u3001\u8fdc\u7a0b\u6267\u884c\u7b49\u7684\u529f\u80fd\u3002 \u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6765\u6267\u884c\uff1a youqu manage.py run -a deepin-music\n"},{"location":"#21","title":"2.1. \u672c\u5730\u6267\u884c","text":"youqu manage.py run\n"},{"location":"#211","title":"2.1.1. \u914d\u7f6e\u6587\u4ef6","text":"\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u914d\u7f6e\u53c2\u6570 \u5728\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u91cc\u9762\u652f\u6301\u914d\u7f6e\u5bf9\u6267\u884c\u7684\u4e00\u4e9b\u53c2\u6570\u8fdb\u884c\u914d\u7f6e\uff0c\u5e38\u7528\u7684\u5982\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;-----------------------------------------------\n;1.KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2.KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f\n;e.g. TAGS = L1 or smoke\n;-----------------------------------------------\n;\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\uff0c\u5c06\u8981\u6267\u884c\u7684\u7528\u4f8b\u5199\u5165\u6307\u5b9a\u7684 csv \u6587\u4ef6\n;\u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u4ece\u57fa\u7840\u6846\u67b6\u6839\u76ee\u5f55\u5f00\u59cb\uff1ae.g. CASE_FILE = case_list.txt\n;\u5982\u679c\u8fd9\u91cc\u6709\u503c\uff0cAPP_NAME KEYWORDS TAGS \u7684\u914d\u7f6e\u5747\u4e0d\u751f\u6548\nCASE_FILE =\n;=============================== RUNNER CONFIG ===================================\n[runner]\n;\u6700\u5927\u5931\u8d25\u7528\u4f8b\u6570\u91cf\u7684\u5360\u6bd4\n;\u6bd4\u5982\uff1a\u603b\u6267\u884c\u7528\u4f8b\u6570\u4e3a 100, \u82e5 MAX_FAIL = 0.5,\u5219\u5931\u8d25\u7528\u4f8b\u6570\u8fbe\u5230 50 \u5c31\u4f1a\u7ec8\u6b62\u6d4b\u8bd5\u3002\nMAX_FAIL = 1\n;\u5355\u6761\u7528\u4f8b\u7684\u8d85\u65f6\u65f6\u95f4\uff0c\u5982\u679c\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u8d85\u65f6\uff0c\u8fd9\u6761\u7528\u4f8b\u4f1a\u88ab\u505c\u6b62\uff0c\u540e\u7eed\u7528\u4f8b\u7ee7\u7eed\u6267\u884c\u3002\n;\u5355\u4f4d\u4e3a\u79d2\n;\u8fd9\u662f\u4e00\u4e2a\u5168\u5c40\u7edf\u4e00\u914d\u7f6e\uff0c\u5982\u679c\u67d0\u6761\u7528\u4f8b\u9700\u8981\u5355\u72ec\u914d\u7f6e\u8d85\u65f6\u65f6\u95f4\uff0c\u53ef\u4ee5\u5728\u7528\u4f8b\u4e2d\u8fd9\u6837\u5199\uff1a\n;@pytest.mark.timeout(500)\n;def test_xxx_001():\n; ...\n;\u4f1a\u8bdd\u8d85\u65f6\uff08\u6240\u6709\u7528\u4f8b\u6267\u884c\u7684\u8d85\u65f6\u65f6\u95f4\uff09\u662f\u6839\u636e\u5168\u5c40\u8d85\u65f6\u914d\u7f6e\u548c\u7528\u4f8b\u5355\u72ec\u8d85\u65f6\u914d\u7f6e\u81ea\u52a8\u8ba1\u7b97\u7684\u3002\nCASE_TIME_OUT = 200\n;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\n;\u6ce8\u610f\uff0cRERUN = 1 \u8868\u793a\u91cd\u8dd1 1 \u6b21\uff0c\u5373\u7b2c\u4e00\u6b21\u7528\u4f8b\u6267\u884c\u5931\u8d25\u4f1a\u81ea\u52a8\u91cd\u8dd1 1 \u6b21\uff0c\u603b\u5171\u6267\u884c 2 \u6b21\uff1b\n;\u5982\u679c\u7b2c 2 \u6b21\u6267\u884c\u6210\u529f\uff0c\u7ed3\u679c\u6210\u529f\uff0c\u5931\u8d25\u4ea6\u4e3a\u5931\u8d25\u3002\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c 1 \u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff0cRERUN >= RECORD_FAILED_CASE\u3002\n;1.\u5173\u95ed\u5f55\u5c4f\uff1aRECORD_FAILED_CASE > RERUN\n;2.\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1aRECORD_FAILED_CASE = 0\nRECORD_FAILED_CASE = 1\n;yes \u6bcf\u6761\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u8fdb\u884c\u73af\u5883\u6e05\u7406\nCLEAN_ALL = yes\n;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387, \u6bd4\u5982\uff1a1920x1080\n;no: \u8868\u793a\u4e0d\u505a\u5206\u8fa8\u7387\u6821\u9a8c\nRESOLUTION = 1920x1080\n;\u4e0d\u8df3\u8fc7\u7528\u4f8b\uff0ccsv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86 skip-xxx\u7684\u7528\u4f8b\u4e0d\u8df3\u8fc7\nNOSKIP = no\n;ignore fixed\n;no\uff0c\u53ea\u8981\u6807\u8bb0\u4e86fixed\u7684\u7528\u4f8b\uff0c\u5373\u4f7f\u6807\u8bb0\u4e86skip-\uff0c\u4e5f\u4f1a\u6267\u884c\uff1b\n;yes\uff0cfixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\uff1b\nIFIXED = no\n;\u8981\u5b89\u88c5deb\u5305\u7684\u8def\u5f84\n;e.g : ~/Downloads/ \u5b89\u88c5\u4e0b\u8f7d\u76ee\u5f55\u4e0b\u7684deb\u5305\uff0c\u5982\u679c\u662f\u8fdc\u7a0b\u6267\u884c\uff0c\u4f1a\u81ea\u52a8\u62f7\u8d1d\u5230\u8fdc\u7a0b\u5e76\u5b89\u88c5\u3002\nDEB_PATH =\n;DEBUG \u6a21\u5f0f\u6267\u884c\u7528\u4f8b\uff0c\u53ea\u6536\u96c6\u4e0d\u6267\u884c\u7528\u4f8b\uff0c\u4e5f\u4e0d\u505a\u8bbe\u5907\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002\nDEBUG = no\n;\u8bb0\u5f55top\u547d\u4ee4\u67e5\u8be2\u7684\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0cTOP = 3 \u8868\u793a\u8bb0\u5f55\u524d3\u4e2a\u8fdb\u7a0b\u3002\nTOP =\n;\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\nREPEAT =\n;\u9ed8\u8ba4\u5728\u6240\u6709\u6d4b\u8bd5\u5b8c\u6210\u4e4b\u540e\u8f93\u51fa\u62a5\u9519\u4fe1\u606f.\n;yes, \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\nDURING_FAIL = no\n;\u6ce8\u518c\u81ea\u542f\u670d\u52a1\nAUTOSTART = no\n;=============================== REPORT CONFIG ===================================\n[report]\n;\u6d4b\u8bd5\u62a5\u544a\u7684title\nREPORT_TITLE = YouQu Report\n;\u6d4b\u8bd5\u62a5\u544a\u7684name\nREPORT_NAME = YouQu Report\n;\u6d4b\u8bd5\u62a5\u544a\u7684\u9ed8\u8ba4\u8bed\u8a00\n;en:English\n;ru:\u0420\u0443\u0441\u0441\u043a\u0438\u0439\n;zh:\u4e2d\u6587\n;de:Deutsch\n;nl:Nederlands\n;he:Hebrew\n;br:Brazil\n;pl:Polski\n;ja:\u65e5\u672c\u8a9e\n;es:Espa\u00f1ol\n;kr:\ud55c\uad6d\uc5b4\n;fr:Fran\u00e7ais\n;az:Az\u0259rbaycanca\nREPORT_LANGUAGE = zh\n;\u7528\u4f8b\u6267\u884c\u5b8c\u540e\u751f\u6210\u7684\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n;\u76ee\u524d\u652f\u6301 allure, xml, json \uff08\u652f\u6301\u540c\u65f6\u751f\u6210\uff09\nREPORT_FORMAT = allure, xml, json\n;\u6307\u5b9a\u62a5\u544a\u751f\u6210\u7684\u8def\u5f84\uff08\u76f8\u5bf9\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\uff09\nALLURE_REPORT_PATH = report/\nXML_REPORT_PATH = report/\nJSON_REPORT_PATH = report/\n;=============================== GLOBAL CONFIG ===================================\n[globalconfig]\n;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\nPASSWORD = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\nIMAGE_MATCH_NUMBER = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6bcf\u6b21\u95f4\u9694\u7b49\u5f85\u65f6\u95f4\nIMAGE_MATCH_WAIT_TIME = 1\n;\u56fe\u50cf\u8bc6\u522b\u5339\u914d\u5ea6\nIMAGE_RATE = 0.9\n;\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u5b9e\u65f6\u56fe\u50cf\u4fdd\u5b58\u8def\u5f84\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u5750\u6807\nSCREEN_CACHE = /tmp/screen.png\n;\u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\u7684\u8def\u5f84\nTMPDIR = /tmp/tmpdir\n;\u7cfb\u7edf\u4e3b\u9898\nSYS_THEME = deepin\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = youqu-dev.uniontech.com\n;OpenCV\u670d\u52a1\u7aef\u5730\u5740\nOPENCV_SERVER_HOST = youqu-dev.uniontech.com\n;=============================== PMS CONFIG ===================================\n;PMS\u76f8\u5173\u914d\u7f6e\uff0c\u5305\u542b\u4ee5\u4e0b\u51e0\u4e2a\u65b9\u9762\uff1a\n;1.PMS\u6d4b\u8bd5\u5957\u6267\u884c\n;2.\u81ea\u52a8\u4ecePMS\u722c\u53d6\u6570\u636e\u5e76\u540c\u6b65\u672c\u5730CSV\u6587\u4ef6\n;3.PMS\u6570\u636e\u56de\u586b\n[pms]\n;PMS\u7684\u7528\u6237\u540d,\u5982: ut001234\nPMS_USER =\n;PMS\u7684\u5bc6\u7801\nPMS_PASSWORD =\n;PMS\u6d4b\u8bd5\u5957\u7684ID\n;\u5728PMS\u4e0a\u67e5\u770b\u7528\u4f8b\u201c\u5957\u4ef6\u201d\u94fe\u63a5: https://pms.uniontech.com/testsuite-view-495.html\n;\u6d4b\u8bd5\u5957ID\u4e3a: 495\nSUITE_ID =\n;\u6570\u636e\u56de\u586b\u5fc5\u987b\u5173\u8054PMS\u6d4b\u8bd5\u5355\n;\u5728PMS\u4e0a\u67e5\u770b\u6d4b\u8bd5\u5355\u94fe\u63a5: https://pms.uniontech.com/testtask-cases-20747.html\n;\u6d4b\u8bd5\u5355ID\u4e3a: 20747\nTASK_ID =\n;\u5c06\u6d4b\u8bd5\u7ed3\u679c\u6570\u636e\u56de\u586b\u5230PMS\n;\u4e3a\u7a7a: \u8868\u793a\u4e0d\u56de\u586b,\u4e0d\u4f1a\u5728\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u751f\u6210json\u7ed3\u679c\u6587\u4ef6;\n;async: \u8868\u793a\u9010\u6761\u5f02\u6b65\u56de\u586b,\u540e\u9762\u4e00\u6761\u6267\u884c\u5f00\u59cb\u65f6\u901a\u8fc7\u5b50\u7ebf\u7a0b\u5bf9\u524d\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u8fdb\u884c\u56de\u586b\uff0c\u5982\u6b64\u5b9e\u73b0\u65f6\u95f4\u6548\u7387\u6700\u5927\u5316;\n;finish: \u8868\u793a\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u6210\u4e4b\u540e\u9010\u4e2a\u56de\u586b(PMS\u4e0d\u652f\u6301\u5e76\u53d1);\nSEND_PMS =\n;\u6570\u636e\u56de\u586b\u7684\u89e6\u53d1\u8005\n;auto: \u6846\u67b6\u81ea\u52a8\u56de\u586b,\u914d\u5408SEND_PMS\u914d\u7f6e\u4f7f\u7528,\u4f60\u53ef\u4ee5\u9009\u62e9\u5728\u4e0d\u540c\u7684\u9636\u6bb5\u8fdb\u884c\u6570\u636e\u56de\u586b;\n;hand: \u624b\u52a8\u56de\u586b,\u6bcf\u6761\u7528\u4f8b\u4ecd\u7136\u4f1a\u751f\u6210json\u6587\u4ef6,\u4f46\u6846\u67b6\u4e0d\u4f1a\u8fdb\u884c\u6570\u636e\u56de\u586b,\u9700\u8981\u4f60\u53ef\u4ee5\u5728\u4f60\u60f3\u8981\u53d1\u9001\u7684\u65f6\u95f4\u70b9\u624b\u52a8\u89e6\u53d1\u56de\u586b;\nTRIGGER = auto\n;PMS\u56de\u586b\u7684\u91cd\u8bd5\u6b21\u6570\n;\u5982\u679c\u63a5\u53e3\u8bf7\u6c42\u5931\u8d25,\u4f1a\u8fdb\u884c\u91cd\u8bd5\nSEND_PMS_RETRY_NUMBER = 2\n[csv_link_pms_lib]\n;caselib: \u7528\u4f8b\u5e93\n;testcase: \u4ea7\u54c1\u5e93\u7528\u4f8b\nCASE_FROM = caselib\n[csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/caselib-browse-81.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 81\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic =\n[export_csv]\n;\u5bfc\u51fa\u7684csv\u6587\u4ef6\u540d\u79f0\uff0c\u9ed8\u8ba4 case_list.csv\nCSV_FILE = case_list.csv\n;exportcsv \u547d\u4ee4\u5bfc\u51fa case_list.csv \u6587\u4ef6\u65f6\u914d\u7f6e\u7684\u5b57\u6bb5\u540d\uff0c\u7528\u4f8b\u540d\u79f0\u9ed8\u8ba4\u5b58\u5728\u7b2c\u4e00\u5217\uff0c\u65e0\u9700\u6dfb\u52a0\nCSV_HEARD = \u7528\u4f8b\u7ea7\u522b,\u7528\u4f8b\u7c7b\u578b,\u6d4b\u8bd5\u7ea7\u522b,\u662f\u5426\u8df3\u8fc7\n[log_cli]\n;\u65e5\u5fd7\u76f8\u5173\u914d\u7f6e\uff08\u4e0d\u6253\u5370\u6784\u9020\u51fd\u6570\u548c\u9b54\u6cd5\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff09\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = DEBUG\n# ============= \u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u914d\u7f6e ================\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u5f00\u5934\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7, \u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_STARTSWITH = Assert\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u7ed3\u5c3e\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_ENDSWITH = Widget\n;\u652f\u6301\u7c7b\u540d\u5305\u542b xxx \u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_CONTAIN = ShortCut\n# ==============================================\n \u914d\u7f6e\u5b8c\u6210\u4e4b\u540e\uff0c\u76f4\u63a5\u5728\u547d\u4ee4\u884c\u6267\u884c manage.py \u5c31\u597d\u4e86\u3002 youqu manage.py run\n"},{"location":"#212","title":"2.1.2. \u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a youqu manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -h, --help show this help message and exit\n-a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--record_failed_case RECORD_FAILED_CASE\n\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--max_fail MAX_FAIL \u6700\u5927\u5931\u8d25\u7387\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--resolution RESOLUTION\n\u68c0\u67e5\u5206\u8fa8\u7387\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms {,async,finish}\n\u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--trigger {,auto,hand}\n\u89e6\u53d1\u8005\n-f CASE_FILE, --case_file CASE_FILE\n\u6839\u636e\u6587\u4ef6\u6267\u884c\u7528\u4f8b\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n--pms_user PMS_USER pms \u7528\u6237\u540d\n--pms_password PMS_PASSWORD\npms \u5bc6\u7801\n--suite_id SUITE_ID pms \u6d4b\u8bd5\u5957ID\n--pms_info_file PMS_INFO_FILE\npms \u4fe1\u606f\u6587\u4ef6\n--top TOP \u8fc7\u7a0b\u4e2d\u8bb0\u5f55top\u547d\u4ee4\u4e2d\u7684\u503c\n--lastfailed \u4ec5\u6267\u884c\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\n--duringfail \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\n--repeat REPEAT \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n--project_name PROJECT_NAME\n\u5de5\u7a0b\u540d\u79f0\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--build_location BUILD_LOCATION\n\u6784\u5efa\u5730\u533a\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--line LINE \u6267\u884c\u7684\u4e1a\u52a1\u7ebf\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--autostart AUTOSTART \u7528\u4f8b\u6267\u884c\u7a0b\u5e8f\u6ce8\u518c\u5230\u5f00\u673a\u81ea\u542f\u670d\u52a1\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a youqu manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\"\n \u547d\u4ee4\u884c\u53c2\u6570\u4f18\u5148\u7ea7\u662f\u9ad8\u4e8e\u914d\u7f6e\u6587\u4ef6\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u4e86\u5bf9\u5e94\u7684\u53c2\u6570\uff0c\u914d\u7f6e\u6587\u4ef6\u4e2d\u4e0d\u7ba1\u662f\u5426\u914d\u7f6e\u5747\u4e0d\u751f\u6548\u3002 --app \u5165\u53c2\u8fd8\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\uff0c\u4e0b\u9762\u7684\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u540c\u6837\u652f\u6301\u3002"},{"location":"#22","title":"2.2. \u8fdc\u7a0b\u6267\u884c","text":"\u8fdc\u7a0b\u6267\u884c\u5c31\u662f\u7528\u672c\u5730\u4f5c\u4e3a\u670d\u52a1\u7aef\u63a7\u5236\u8fdc\u7a0b\u673a\u5668\u6267\u884c\uff0c\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u76f8\u540c\uff1b \u4f7f\u7528 remote \u547d\u4ee4\uff1a youqu manage.py remote\n"},{"location":"#221","title":"2.2.1. \u8fdc\u7a0b\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u6267\u884c","text":"\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u6267\u884c\u5c31\u662f\u7531\u672c\u5730 YouQu \u4f5c\u4e3a\u670d\u52a1\u7aef\uff0c\u63a7\u5236\u8fdc\u7a0b N \u53f0\u673a\u5668\u6267\u884c\u76f8\u540c\u7684\u7528\u4f8b\uff0c\u6267\u884c\u5b8c\u4e4b\u540e\u6240\u6709\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u7ed3\u679c\u4f1a\u8fd4\u56de\u7ed9\u670d\u52a1\u7aef report \u76ee\u5f55\u4e0b\uff1b \u8fdc\u7a0b\u6267\u884c\u540c\u6837\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u8fdb\u884c\u7528\u4f8b\u76f8\u5173\u914d\u7f6e\uff1b \u9700\u8981\u91cd\u70b9\u8bf4\u4e00\u4e0b\u8fdc\u7a0b\u6267\u884c\u65f6\u7684\u6d4b\u8bd5\u673a\u4fe1\u606f\u914d\u7f6e\uff0c\u5728\u914d\u7f6e\u6587\u4ef6 setting/remote.ini \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\u3001IP\u3001\u5bc6\u7801\u3002 ;=============================== CLIENT LIST =====================================\n; \u6d4b\u8bd5\u673a\u914d\u7f6e\u5217\u8868\n;[client{number}] ;\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u6709\u591a\u5c11\u53f0\u6d4b\u8bd5\u673a\u5c31\u5199\u591a\u5c11\u4e2a client\uff0c\u522b\u540d\u5fc5\u987b\u5305\u542b client \u5b57\u7b26\uff0c\u4e14\u4e0d\u80fd\u91cd\u590d\u3002\n;user = ;\u6d4b\u8bd5\u673a user\n;ip = ;\u6d4b\u8bd5\u673a ip\n;password = 1 ;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801, \u53ef\u4ee5\u4e0d\u914d\u7f6e\u6b64\u9879\uff0c\u9ed8\u8ba4\u53d6 CLIENT_PASSWORD \u7684\u503c\uff1b\n;\u5982\u679c\u4f60\u6240\u6709\u6d4b\u8bd5\u673a\u5bc6\u7801\u90fd\u76f8\u540c\uff0c\u90a3\u4e48\u53ea\u9700\u8981\u914d\u7f6e CLIENT_PASSWORD \u5c31\u53ef\u4ee5\u4e86\n;=================================================================================\n[client1]\nuser = uos\nip = 10.8.15.xx\n[client2]\nuser = uos\nip = 10.8.15.xx\n[client3]\nuser = uos\nip = 10.8.11.xx\n \u6709\u591a\u5c11\u53f0\u673a\u5668\u5c31\u50cf\u8fd9\u6837\u53c2\u8003\u4e0a\u9762\u7684\u683c\u5f0f\u5199\u5c31\u884c\u4e86\u3002 \u7136\u540e\u5728\u547d\u4ee4\u884c\uff1a youqu manage.py remote\n \u8fd9\u6837\u8fd0\u884c\u662f\u4ece\u914d\u7f6e\u6587\u4ef6\u53bb\u8bfb\u53d6\u76f8\u5173\u914d\u7f6e\u3002 \u5982\u679c\u4f60\u4e0d\u60f3\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\uff0c\u4f60\u4ecd\u7136\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u8fdb\u884c\u4f20\u53c2\uff0c \u4ee5\u4e0b\u4e3a python3 manage.py remote \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -h, --help show this help message and exit\n-c CLIENTS, --clients CLIENTS\n\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679cpassword\u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6sett\ning/remote.ini\u4e2dCLIENT_PASSWORD\u7684\u503c,\u6bd4\u5982: uos@10.8.13.33:1\n\u6216 uos@10.8.13.33\n-s, --send_code \u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a\uff08\u4e0d\u542breport\u76ee\u5f55\uff09\n-e, --build_env \u642d\u5efa\u6d4b\u8bd5\u73af\u5883,\u5982\u679c\u4e3ayes\uff0c\u4e0d\u7ba1send_code\u662f\u5426\u4e3ayes\u90fd\u4f1a\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a.\n-p CLIENT_PASSWORD, --client_password CLIENT_PASSWORD\n\u6d4b\u8bd5\u673a\u5bc6\u7801\uff08\u5168\u5c40\uff09\n-y PARALLEL, --parallel PARALLEL\nyes:\u8868\u793a\u6240\u6709\u6d4b\u8bd5\u673a\u5e76\u884c\u8dd1\uff0c\u6267\u884c\u76f8\u540c\u7684\u6d4b\u8bd5\u7528\u4f8b;no:\u8868\u793a\u6d4b\u8bd5\u673a\u5206\u5e03\u5f0f\u6267\u884c\uff0c\u670d\u52a1\u7aef\u4f1a\u6839\u636e\u6536\u96c6\u5230\u7684\u6d4b\u8bd5\u7528\u4f8b\u81ea\n\u52a8\u5206\u914d\u7ed9\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u3002\n \u9664\u4e86\u8fd9\u4e9b\u7279\u6709\u53c2\u6570\u4ee5\u5916\uff0c\u5b83\u540c\u6837\u652f\u6301\u672c\u5730\u6267\u884c\u7684\u6240\u6709\u53c2\u6570\uff1b \u5728\u547d\u4ee4\u884c\u8fd9\u6837\u8fd0\u884c\uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\"\n \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report \u76ee\u5f55\u4e0b\u56de\u6536\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u7684\u6d4b\u8bd5\u62a5\u544a\u3002 \u6ce8\u610f\uff0c\u5982\u679c\u8fdc\u7a0b\u673a\u5668\u6ca1\u6709\u642d\u5efa\u81ea\u52a8\u5316\u6d4b\u8bd5\u73af\u5883\uff0c\u8bb0\u5f97\u52a0\u4e0a\u53c2\u6570 -e \uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\" -e\n \u6267\u884c\u524d\u786e\u4fdd\u8fdc\u7a0b\u673a\u5668\u5df2\u7ecf\u5f00\u542f\u4e86 ssh \u670d\u52a1\uff0c\u5426\u5219\u4f1a\u63d0\u793a\u65e0\u6cd5\u8fde\u63a5\uff0c\u5982\u679c\u6ca1\u6709\u5f00\u542f\uff0c\u8bf7\u624b\u52a8\u5f00\u542f\uff1a sudo systemctl restart ssh\nsudo systemctl enable ssh\n \u914d\u7f6e\u6587\u4ef6\u5176\u4ed6\u76f8\u5173\u914d\u7f6e\u9879\u8be6\u7ec6\u8bf4\u660e\uff0c\u8bf7\u67e5\u770b\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u6ce8\u91ca\u5185\u5bb9\u3002"},{"location":"#222","title":"2.2.2. \u8fdc\u7a0b\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u8d1f\u8f7d\u5747\u8861\u6267\u884c","text":"\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u8d1f\u8f7d\u5747\u8861\u6267\u884c\u4e5f\u662f\u7528\u672c\u5730\u4f5c\u4e3a\u670d\u52a1\u7aef\u63a7\u5236\u8fdc\u7a0b\u673a\u5668\u6267\u884c\uff0c\u4f46\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u4e0d\u540c\uff0c\u800c\u662f\u6240\u6709\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u4e4b\u548c\uff0c\u4e3a\u4f60\u60f3\u8981\u6267\u884c\u7684\u7528\u4f8b\u96c6\uff1b \u4f3c\u4e4e\u6709\u70b9\u96be\u4ee5\u7406\u89e3\uff0c\u6211\u7528\u5927\u767d\u8bdd\u4e3e\u4f8b\u63cf\u8ff0\u4e0b\u5c31\u662f\uff0c\u670d\u52a1\u7aef\u60f3\u8981\u6267\u884c 10 \u6761\u7528\u4f8b\uff0c\u73b0\u5728\u8fdc\u7a0b\u673a\u5668\u6709 5 \u53f0\uff1b \u7136\u540e\u670d\u52a1\u7aef\u5c31\u5148\u62ff\u7740\u7b2c 1 \u6761\u7528\u4f8b\u7ed9\u8fdc\u7a0b 1 \u53f7\u673a\u6267\u884c\uff0c\u62ff\u7b2c 2 \u6761\u7528\u4f8b\u7ed9\u8fdc\u7a0b 2 \u53f7\u673a\u6267\u884c...\uff0c\u5982\u6b64\u5faa\u73af\u76f4\u5230\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\uff0c\u8fd9\u5c31\u662f\u8d1f\u8f7d\u5747\u8861\u6267\u884c\u3002 \u4f7f\u7528\u65b9\u6cd5\u548c\u524d\u9762\u4e00\u6837\uff0c\u53ea\u662f\u9700\u8981\u589e\u52a0\u4e00\u4e2a\u53c2\u6570\uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\" --parallel no\n"},{"location":"#23-pms","title":"2.3. PMS \u6570\u636e\u56de\u586b","text":"\u6d4b\u8bd5\u5355\u5173\u8054\u7684\u7528\u4f8b\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u5bf9\u5e94\u7684\u53bb\u8dd1\u8fd9\u4e9b\u5173\u8054\u7684\u7528\u4f8b\uff0c\u5e76\u4e14\u5c06\u6267\u884c\u7684\u7ed3\u679c\u56de\u586b\u7684\u6d4b\u8bd5\u7528\u4f8b\u7684\u72b6\u6001\u91cc\u9762\u3002 PMS \u6570\u636e\u56de\u586b\u4e3b\u8981\u6709\u4e09\u79cd\u65b9\u5f0f\uff1a \uff081\uff09\u5f02\u6b65\u56de\u586b \u5728\u7528\u4f8b\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\uff0c\u91c7\u7528\u5f02\u6b65\u7684\u65b9\u5f0f\u53bb\u8fdb\u884c\u6570\u636e\u56de\u586b\uff0c\u76f4\u767d\u7684\u8bb2\u5c31\u662f\uff0c\u7b2c\u4e8c\u6761\u7528\u4f8b\u5f00\u59cb\u8dd1\u7684\u65f6\u5019\uff0c\u901a\u8fc7\u5b50\u7ebf\u7a0b\u53bb\u505a\u7b2c\u4e00\u6761\u7528\u4f8b\u7684\u6570\u636e\u56de\u586b\uff0c\u5982\u6b64\u5faa\u73af\uff0c\u76f4\u5230\u6240\u6709\u7528\u4f8b\u6267\u884c\u7ed3\u675f\uff1b \u8fd9\u79cd\u65b9\u6848\u7684\u65f6\u95f4\u6548\u7387\u6700\u9ad8\u7684\uff0c\u56e0\u4e3a\u7406\u8bba\u4e0a\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u662f\u5927\u4e8e\u6570\u636e\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\u65f6\u95f4\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u5f53\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u6570\u636e\u56de\u586b\u4e5f\u5b8c\u6210\u4e86\u3002 \u4f7f\u7528\u65b9\u6cd5\uff0c\u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u4ee5\u4e0b\u53c2\u6570\uff1a\uff08\u4ee5\u4e0b\u6d89\u53ca\u5230\u7684\u53c2\u6570\u914d\u7f6e\u90fd\u662f\u5728\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u914d\u7f6e\uff09 PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = async\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \u8fd9\u4e2a\u53c2\u6570\u53ef\u586b\u53ef\u4e0d\u586b\uff0c\u4f46\u662f\u586b\u4e86\u53ef\u4ee5\u63d0\u9ad8\u7528\u4f8b\u7684\u6267\u884c\u901f\u5ea6\uff0c\u56e0\u4e3a\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u53ef\u4ee5\u6307\u5b9a\u5230\u5177\u4f53\u7684\u5e94\u7528\u5e93\u3002\uff08\u4e0b\u540c\uff09\n \uff082\uff09\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u56de\u586b \u7b49\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u518d\u9010\u4e2a\u8fdb\u884c\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u6b64\u65b9\u6848\u65f6\u95f4\u6548\u7387\u6bd4\u8f83\u4f4e\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \uff083\uff09\u624b\u52a8\u56de\u586b \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4e0d\u505a\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u540e\u7eed\u624b\u52a8\u5c06\u7ed3\u679c\u8fdb\u884c\u56de\u586b\u8bf7\u6c42\u3002 \u7528\u4f8b\u6267\u884c\u65f6\u914d\u7f6e\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = hand\nAPP_NAME = \u540e\u7eed\u624b\u52a8\u56de\u586b\u65b9\u6cd5\uff1a youqu manage.py pms --send2task yes\n"},{"location":"#_4","title":"\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898","text":"\u7531\u540c\u5b66\u53ef\u80fd\u4f1a\u53d1\u73b0\uff0c\u600e\u4e48\u56de\u586b\u4e00\u6b21\u4e4b\u540e\uff0c\u540e\u9762\u60f3\u518d\u6b21\u56de\u586b\u5c31\u4e0d\u751f\u6548\u4e86\uff1b \u8fd9\u662f\u56e0\u4e3a\u4e3a\u4e86\u5e94\u5bf9\u524d\u9762\u63d0\u5230\u7684\u591a\u79cd\u6570\u636e\u56de\u586b\u7684\u65b9\u5f0f\uff0c\u5728 report \u76ee\u5f55\u4e0b\u4f1a\u7531 pms_xxx \u5f00\u5934\u7684\u76ee\u5f55\uff0c\u8bb0\u5f55\u4e86\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u548c\u56de\u586b\u60c5\u51b5\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u4e4b\u524d\u5df2\u7ecf\u56de\u586b\u8fc7\u4e86\uff0c\u540e\u7eed\u5c31\u4e0d\u4f1a\u518d\u6b64\u89e6\u53d1\u56de\u586b\u4e86\uff1b \u5982\u679c\u4f60\u60f3\u91cd\u65b0\u505a\u56de\u586b\uff0c\u4f60\u53ef\u4ee5\u628a report/pms_xxx \u76ee\u5f55\u5220\u6389\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u91cd\u65b0\u505a\u6570\u636e\u56de\u586b\u4e86\uff1b"},{"location":"#24-csv","title":"2.4. \u5bfc\u51fa CSV \u6587\u4ef6","text":"\u6846\u67b6\u63d0\u4f9b\u5bfc\u51fa\u6307\u5b9a\u6807\u7b7e\u7528\u4f8b\u7684\u529f\u80fd\uff1a youqu manage.py exportcsv -a deepin-album -t CICD\n \u8868\u793a\u5bfc\u51fa deepin-album \u7684\u7528\u4f8b\u4e2d\u6807\u8bb0\u4e86 CICD \u6807\u7b7e\u7684\u7528\u4f8b\uff0c\u5bfc\u51fa CSV \u6587\u4ef6\u7684\u5b57\u6bb5\u683c\u5f0f\u5df2\u7ecf\u9002\u914d\u4e86 CICD \u7684\u8981\u6c42\u3002"},{"location":"#25-app","title":"2.5. \u811a\u624b\u67b6\u65b0\u5efa APP \u5de5\u7a0b","text":"\u65b0\u5efa\u4e00\u4e2a APP \u5de5\u7a0b\uff1a youqu manage.py startapp autotest_deepin_some \u8fd9\u6837\u5728 apps \u76ee\u5f55\u4e0b\u4f1a\u521b\u5efa\u4e00\u4e2a\u5b50\u9879\u76ee\u5de5\u7a0b autotest_deepin_some\uff0c\u540c\u65f6\u65b0\u5efa\u597d\u5de5\u7a0b\u6a21\u677f\u76ee\u5f55\u548c\u6a21\u677f\u6587\u4ef6\uff1a apps\n\u2514\u2500\u2500 autotest_deepin_some\n \u00a0\u00a0 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_case.py\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 config.ini\n \u00a0\u00a0 \u251c\u2500\u2500 config.py\n \u00a0\u00a0 \u251c\u2500\u2500 conftest.py\n \u00a0\u00a0 \u251c\u2500\u2500 control\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_assert.py\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some.csv\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u2514\u2500\u2500 widget\n \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 case_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 other.ini\n \u00a0\u00a0 \u251c\u2500\u2500 other_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 pic_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2514\u2500\u2500 ui.ini\n autotest_deepin_some \u662f\u4f60\u7684\u5de5\u7a0b\u540d\u79f0\uff0c\u6bd4\u5982\uff1aautotest_deepin_music \uff1b \u5728\u6b64\u57fa\u7840\u4e0a\uff0c\u4f60\u53ef\u4ee5\u5feb\u901f\u7684\u5f00\u59cb\u4f60\u7684 AT \u9879\u76ee\u3002"},{"location":"#26","title":"2.6. \u7528\u4f8b\u6807\u7b7e\u81ea\u52a8\u540c\u6b65","text":"\u7528\u4e8e\u81ea\u52a8\u540c\u6b65 PMS \u7528\u4f8b\u6807\u7b7e\u6570\u636e\u81f3\u672c\u5730 CSV \u6587\u4ef6\uff0c\u4e3b\u8981\u901a\u8fc7\u4ee5\u4e0b\u51e0\u4e2a\u914d\u7f6e\u6765\u63a7\u5236\uff1a APP_NAME = # \u6307\u5b9a\u8981\u540c\u6b65\u7684\u5e94\u7528\u540d\u79f0\nPMS_USER = # PMS\u7684\u7528\u6237\u540d\nPMS_PASSWORD = # PMS\u7684\u5bc6\u7801\n \u5728 [csv_link_pms_id] \u8282\u70b9\u4e0b\u6307\u5b9a csv \u6587\u4ef6\u540d\u4e0e PMS \u7528\u4f8b\u6a21\u5757\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u6bd4\u5982\uff1a [csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/testcase-browse-53.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 53\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic = 53\n \u5c06\u4ee5\u4e0a\u4fe1\u606f\u914d\u7f6e\u597d\u4e4b\u540e\uff0c\u5728\u547d\u4ee4\u884c\u6267\u884c\uff1a youqu manage.py pms --pms2csv yes\n \u6bcf\u6b21\u6267\u884c\u65f6\u539f csv \u6587\u4ef6\u4f1a\u81ea\u52a8\u5907\u4efd\u5728 report/csv_back \u76ee\u5f55\u4e0b\uff0c\u56e0\u6b64\u4f60\u4e0d\u7528\u62c5\u5fc3\u811a\u672c\u6267\u884c\u5bfc\u81f4\u4f60\u7684\u6570\u636e\u4e22\u5931\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u57fa\u7840\u6846\u67b6\u8bbe\u8ba1\u65b9\u6848","text":"# ====================================\n# Author : Mikigo\n# Time : 2022/3/18\n# version \uff1a1.0\n# ====================================\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"\u505a\u4e00\u4e2a\u7b80\u5355\u3001\u597d\u7528\u3001\u529f\u80fd\u5f3a\u5927\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u3002 \u4f5c\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4e00\u4e2a\u57fa\u7840\u6846\u67b6\uff0c\u4efb\u4f55\u5e94\u7528\u90fd\u80fd\u5f88\u65b9\u4fbf\u7684\u63a5\u5165\u8fdb\u6765\uff1b \u63d0\u4f9b\u6240\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u9700\u8981\u7684\u5e95\u5c42\u529f\u80fd\uff0c\u5e76\u5bf9\u5916\u63d0\u4f9b\u552f\u4e00\u7684\u63a5\u53e3\uff0c\u65b9\u4fbf\u5e94\u7528\u5e93\u4f7f\u7528\uff1b \u6574\u5408\u516c\u5171\u5e93\uff0c\u51cf\u5c11\u5e94\u7528\u5e93\u4ee3\u7801\u91cf\u548c\u65b9\u6cd5\u7ef4\u62a4\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u8bbe\u8ba1\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u7edf\u4e00\u6982\u5ff5","text":" \u57fa\u7840\u6846\u67b6 \u672c\u9879\u76ee\u662f\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\uff08AutoTest Basic Frame\uff09\uff0c\u5168\u79f0\u4e3a\u201c\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff08AT \u57fa\u7840\u6846\u67b6\uff09\u201d\u3002 AT \u57fa\u7840\u6846\u67b6\u662f\u505a\u4e3a\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\u6765\u8bbe\u8ba1\u7684\uff0c\u5b83\u63d0\u4f9b\u4e86\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u57fa\u7840\u529f\u80fd\uff0c\u4efb\u4f55\u5e94\u7528\u63a5\u5165\u8fdb\u6765\u90fd\u80fd\u5feb\u901f\u65b9\u4fbf\u7684\u8fdb\u884c\u65b9\u6cd5\u548c\u7528\u4f8b\u7f16\u5199\uff0c\u540c\u65f6\u5728\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u3001\u6807\u7b7e\u5316\u6267\u884c\u3001\u5206\u5e03\u5f0f\u6267\u884c\u3001\u591a\u79cd\u62a5\u544a\u8f93\u51fa\u3001\u4f18\u7f8e\u7684\u6267\u884c\u65e5\u5fd7\u3001\u5931\u8d25\u81ea\u52a8\u5f55\u5c4f\u548c\u622a\u56fe\u3001\u81ea\u52a8\u73af\u5883\u6e05\u7406\u7b49\u7b49\uff0c\u5b83\u90fd\u63d0\u4f9b\u4e86\u5b8c\u5584\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u66f4\u91cd\u8981\u7684\u662f\u8fd9\u4e00\u5207\u4f7f\u7528\u8d77\u6765\u90fd\u975e\u5e38\u7b80\u5355\u3002 \u57fa\u7840\u6846\u67b6\u4e2d\u5305\u542b\u5e94\u7528\u5e93\uff08apps\uff09\u3001\u6838\u5fc3\u5e93\uff08src\uff09\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09\u3002 \u5e94\u7528\u5e93\uff08apps\uff09 \u5404\u4e2a\u5e94\u7528\u81ea\u5df1\u7684\u4ed3\u5e93\uff0c\u91cc\u9762\u4e3b\u8981\u5305\u542b\u7684\u662f\u7528\u4f8b\u3001\u65b9\u6cd5\u53ca\u4e00\u4e9b\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u53eb autotest-dde-file-manager \u3002 \u6838\u5fc3\u5e93\uff08src\uff09 \u6838\u5fc3\u5e93\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u5230\u6240\u6709\u5e95\u5c42\u6838\u5fc3\u529f\u80fd\uff0c\u8fd9\u662f\u6700\u91cd\u8981\u7684\u4e00\u4e2a\u90e8\u5206\uff0c\u7075\u9b42\u3002\u5177\u4f53\u529f\u80fd\u6a21\u5757\u53ca\u8bf4\u660e\u4f1a\u5728\u4e0b\u9762\u7b2c\u56db\u4e2a\u7ae0\u8282\u8be6\u7ec6\u63cf\u8ff0\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09 \u591a\u4e2a\u5e94\u7528\u90fd\u8981\u7528\u5230\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\uff0c\u6309\u7167\u5e94\u7528\u5212\u5206\u5b58\u653e\uff0c\u4e3b\u8981\u662f\u4e3a\u4e86\u51cf\u5c11\u4ee3\u7801\u91cf\uff0c\u6d88\u9664\u5e94\u7528\u95f4\u7684\u8026\u5408\u5173\u7cfb\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u67b6\u6784\u56fe","text":"\u6574\u4f53\u7684\u6846\u67b6\u8bbe\u8ba1\u5728\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u300b\u6587\u6863\u91cc\u9762\u5df2\u7ecf\u6709\u8be6\u7ec6\u63cf\u8ff0\u4e86\uff0c\u8fd9\u91cc\u8d34\u4e00\u4e0b\u6574\u4f53\u7684\u67b6\u6784\u56fe\uff1a \u4e3a\u4e86\u7a81\u663e\u672c\u6587\u7684\u91cd\u70b9\uff0c\u62bd\u53d6\u5176\u4e2d\u91cd\u8981\u529f\u80fd\u6a21\u5757\uff0c\u5982\u4e0b\u56fe\uff1a "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-basic-frame # \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\n\u251c\u2500\u2500 apps # \u5e94\u7528\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-dde-file-manager # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\uff08\u5e94\u7528\u5e93\u8be6\u7ec6\u76ee\u5f55\u7ed3\u6784\u8bf7\u770b\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\uff09\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 tag # \u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u2514\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u2502 \u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 xxx.png\n\u2502 \u2502 ...\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-deepin-music # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 public # \u516c\u5171\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget # dde_dock \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget # dde_desktop \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 src # \u6838\u5fc3\u5e93\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 button_center.py\n\u2502 \u251c\u2500\u2500 cmdtrl.py\n\u2502 \u251c\u2500\u2500 dogtails.py\n\u2502 \u251c\u2500\u2500 find_image.py\n\u2502 \u251c\u2500\u2500 global_config.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 setting # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 config.py\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 global_config.ini\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\u6a21\u5757\uff08Hook\uff09\n\u251c\u2500\u2500 pytest.ini # Pytest \u9ed8\u8ba4\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 docs # \u6587\u6863\u76ee\u5f55\n\u2514\u2500\u2500 manage.py # \u6267\u884c\u5668\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1apps","title":"1\u3001\u5e94\u7528\u5e93\uff08apps\uff09","text":"\u6240\u6709\u5e94\u7528\u5e93\u5747\u653e\u7f6e\u5728\u57fa\u7840\u6846\u67b6\u4e0b\u7684 apps \u76ee\u5f55\u4e0b\uff08\u89c1\u7b2c\u4e8c\u7ae0\u8282\u7b2c3\u6bb5\u76ee\u5f55\u7ed3\u6784\u5185\u5bb9\uff09\u3002\u5e94\u7528\u5e93\u7684\u67b6\u6784\u8bbe\u8ba1\u53ef\u4ee5\u53c2\u8003\u300aAT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b\u6587\u6863\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2src","title":"2\u3001\u6838\u5fc3\u5e93\uff08src\uff09","text":"\u5728 src \u76ee\u5f55\u4e0b\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u5e95\u5c42\u6838\u5fc3\u7ec4\u4ef6\uff0c\u901a\u5e38\u6765\u8bb2\u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5230\u5176\u4e2d\u67d0\u4e00\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4e48\u4f60\u9700\u8981\u663e\u793a\u7684\u5bfc\u5165\u8fd9\u4e2a\u6a21\u5757\uff0c\u7136\u540e\u624d\u80fd\u4f7f\u7528\u8be5\u6a21\u5757\u4e0b\u7684\u529f\u80fd\uff0c\u5982\u679c\u4f60\u7528\u5230\u4e86\u5341\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4f60\u5c31\u9700\u8981\u5bfc\u5165\u5341\u4e2a\u3002\u4f46\u662f\u6211\u4eec\u60f3\u8ba9\u4e8b\u60c5\u53d8\u5f97\u7b80\u5355\uff0c\u4e00\u6b21\u5bfc\u5165\uff0c\u4f7f\u7528\u6240\u6709\u3002 \u5c06\u6240\u6709\u7684\u529f\u80fd\u6a21\u5757\u90fd\u8fdb\u5165\u5230 src \u7684\u540d\u79f0\u7a7a\u95f4\uff0c\u5728 src/__init__.py \u91cc\u9762\u6211\u4eec\u8bbe\u8ba1\u6210\u8fd9\u6837\uff1a # src/__init__.py\nfrom .cmdctl import CmdCtl\nfrom .dogtails import Dogtail\nfrom .find_image import FindImage\nfrom .button_center import ButtonCenter\nclass Src(CmdCtl, FindImage):\ndef __init__(self, **kwargs):\n\"\"\"dogtail or button center param\n :param kwargs: app_name, desc, number\n \"\"\"\nif kwargs:\napp_name = kwargs.get(\"APP_NAME\")\ndesc = kwargs.get(\"DESC\")\nif app_name is None or desc is None:\nraise ValueError\nnumber = kwargs.get(\"number\")\nnumber = number if isinstance(number, int) else -1\n# \u5bf9\u8c61\u7ec4\u5408\nself.dog = Dogtail(app_name, desc, number)\nself.ui = ButtonCenter(app_name, number)\n \u9700\u8981\u4f20\u9012\u53c2\u6570\u7684\u91c7\u7528\u5bf9\u8c61\u7ec4\u5408\uff0c\u6ca1\u6709\u53c2\u6570\u7684\u4f7f\u7528\u7ee7\u627f\uff0c\u7ee7\u627f\u7684\u7c7b\u7b26\u5408 Mixin \u8bbe\u8ba1\u6a21\u5f0f\u3002 \u5e94\u7528\u5e93\u91cc\u9762\u4f7f\u7528\u7684\u65f6\u5019\u5728 widget/base_widget.py \u91cc\u9762\u53ea\u9700\u8981\u552f\u4e00\u7ee7\u627f Src \uff1a # \u5e94\u7528\u5e93\u91cc\u9762\u65b9\u6cd5\u57fa\u7c7b\n# widget/base_widget.py\nfrom src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n \u8981\u4f7f\u7528\u6838\u5fc3\u5e93\u7684\u529f\u80fd\uff0c\u53ea\u9700\u8981\u5199\u4e00\u4e2a\u5bfc\u5165 from src import Src \u5373\u53ef\u3002 \u5199 __init__ \u6784\u9020\u51fd\u6570\u7684\u539f\u56e0\u662f\u901a\u8fc7\u53c2\u6570\u6784\u9020\u5e94\u7528\uff0c\u5e76\u4e14\u4f20\u9012 number \u8fdb\u6765\uff0c\u53ef\u4ee5\u5b9e\u73b0\u591a\u7a97\u53e3\u7684\u63a7\u5236\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3public","title":"3\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09","text":"\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6bcf\u4e2a\u5e94\u7528\u90fd\u662f\u4e00\u4e2a\u5355\u72ec\u7684 py \u6587\u4ef6\uff0c\u76f8\u4e92\u4e4b\u95f4\u662f\u72ec\u7acb\u7684\uff0c\u6bcf\u4e2a py \u6587\u4ef6\u91cc\u9762\u662f\u8be5\u5e94\u7528\u7684\u65b9\u6cd5\u7c7b\uff0c\u6bd4\u5982\uff1a\u6700\u5e38\u7528\u7684\u65b9\u6cd5\u7c7b dde_desktop_public_widget.py # dde_desktop_widget.py\nfrom src import Src\nclass _DdeDesktopPublicBaseWidget(Src):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-desktop\"\nDESC = \"/usr/bin/dde-desktop\"\ndef __init__(self):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC)\nclass DdeDesktopPublicWidget(_DdeDesktopPublicBaseWidget):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u7c7b\"\"\"\ndef click_music_dir_by_ui(self):\n\"\"\"\u5728\u6587\u4ef6\u9009\u62e9\u6846\u70b9\u51fb\u97f3\u4e50\u76ee\u5f55\"\"\"\nself.click(*self.ui.btn_center(\"\u4fa7\u8fb9\u680f-\u97f3\u4e50\")) \ndef click_xxx_by_attr(self):\npass\n \u516c\u5171\u65b9\u6cd5\u5e93\u610f\u4e49\uff1a \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6240\u5c01\u88c5\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\u90fd\u662f\u81f3\u5c11\u88ab2\u4e2a\u5e94\u7528\u90fd\u7528\u5230\u7684\uff0c\u8fd9\u6837\u505a\u53ef\u4ee5\u51cf\u5c11\u6574\u4f53\u4ee3\u7801\u91cf\uff0c\u4ece\u800c\u51cf\u8f7b\u5e94\u7528\u5e93\u4ee3\u7801\u7684\u7ef4\u62a4\u5de5\u4f5c\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u7f16\u5199\u5f62\u5f0f\uff08\u547d\u540d\u89c4\u5219\u3001\u5b9a\u4f4d\u7684\u65b9\u6848\u5199\u6cd5\u3001\u6ce8\u91ca\u7684\u5199\u6cd5\u7b49\u7b49\uff09\u5177\u6709\u4e00\u5b9a\u7684\u6a21\u677f\u4f5c\u7528\uff0c\u8fd9\u6837\u5373\u4f7f\u662f\u5404\u4e2a\u5e94\u7528\u5e93\u90fd\u72ec\u7acb\u7ef4\u62a4\uff0c\u6240\u6709\u7684\u7f16\u7801\u98ce\u683c\u90fd\u662f\u8d8b\u4e8e\u76f8\u540c\u7684\uff0c\u56e0\u4e3a\u5927\u5bb6\u90fd\u5e94\u8be5\u53c2\u7167\u516c\u5171\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u5199\u6cd5\u6765\u5199\u81ea\u5df1\u5e94\u7528\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\u7c7b\uff0c\u8fd9\u6837\u4f7f\u5f97\u4ece\u516c\u53f8\u7684\u89d2\u5ea6\u53bb\u770b\u6240\u6709\u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u90fd\u662f\u7edf\u4e00\u7684\u3002 \u53ef\u4ee5\u901a\u8fc7\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\uff0c\u4e86\u89e3\u5230\u5176\u4ed6\u5e94\u7528\u7684\u529f\u80fd\uff0c\u5bf9\u4e8e\u6211\u4eec\u9700\u6c42\u7406\u89e3\uff0c\u4e86\u89e3\u7cfb\u7edf\u7684\u65b9\u65b9\u9762\u9762\u4e5f\u6709\u597d\u5904\u3002 \u5f53\u7136\uff0c\u5982\u679c\u4f60\u7684\u5e94\u7528\u672c\u8eab\u662f\u5c5e\u4e8e\u6839\u672c\u5c31\u4e0d\u9700\u8981\u548c\u5176\u4ed6\u5e94\u7528\u4ea4\u4e92\u7684\uff0c\u90a3\u4e48\u4f60\u53ef\u80fd\u4e0d\u4f1a\u7528\u5230\u8fd9\u91cc\u9762\u7684\u529f\u80fd\uff0c\u6ca1\u5173\u7cfb\uff0c\u4f60\u6240\u6709\u7684\u65b9\u6cd5\u90fd\u53ef\u4ee5\u76f4\u63a5\u5199\u5728\u5e94\u7528\u5e93\u7684\u4e1a\u52a1\u5c42\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4conftestpy","title":"4\u3001conftest.py","text":"conftest.py \u4ece\u529f\u80fd\u4e0a\u5c06\u662f\u5c5e\u4e8e\u6838\u5fc3\u5e93\uff08src\uff09\u7684\u5185\u5bb9\uff0c\u4f46\u662f\u7531\u4e8e\u5b83\u7684\u7279\u6b8a\u6027\uff0c\u5373\u5b83\u662f\u5bf9\u5e94\u7528\u5e93\u4e2d\u7684\u7528\u4f8b\u751f\u6548\u7684\uff0c\u800c\u4e14\u5b83\u7684\u4f5c\u7528\u57df\u662f\u5f53\u524d\u76ee\u5f55\u53ca\u4ee5\u4e0b\uff0c\u56e0\u6b64\u6211\u4eec\u5c06\u5b83\u653e\u5230\u9879\u76ee\u6839\u76ee\u5f55\u3002\u6211\u4eec\u6846\u67b6\u4e2d\u6709\u4e0d\u5c11\u6838\u5fc3\u529f\u80fd\u90fd\u662f\u5728\u8fd9\u91cc\u9762\u8fdb\u884c\u5f00\u53d1\u7684\uff0c\u540e\u9762\u7b2c\u56db\u7ae0\u4f1a\u8bb2\u5230\u7ec6\u8282\u3002 pytest.ini \u4f5c\u7528\u548c conftest.py \u7c7b\u4f3c\uff0c\u662f Pytest \u6846\u67b6\u7684\u56fa\u5b9a\u914d\u7f6e\u6587\u4ef6\uff0c\u76ee\u524d\u914d\u7f6e\u4e86\u4e00\u4e9b\u901a\u7528\u7684\u547d\u4ee4\u884c\u6267\u884c\u53c2\u6570\uff0c\u4e5f\u653e\u5728\u9879\u76ee\u6839\u76ee\u5f55\u3002 \u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 Hook \u51fd\u6570\uff0capps \u76ee\u5f55\u4e0b\u7684 \u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 fixture \u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5setting","title":"5\u3001setting","text":"\u5168\u5c40\u914d\u7f6e\u6a21\u5757\uff0c\u5305\u542b\u4e86\u4ee5\u4e0b\u914d\u7f6e\u6587\u4ef6\uff1a \uff081\uff09ini \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u914d\u7f6e\u4e00\u4e9b\u5168\u5c40\u7684\u914d\u7f6e\u9879\uff0c\u8b6c\u5982\uff1a\u5931\u8d25\u91cd\u8dd1\u6b21\u6570\u3001\u662f\u5426\u5931\u8d25\u5f55\u5c4f\u3001\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\u3001\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4\u3001\u6267\u884c\u65f6\u65e5\u5fd7\u7ea7\u522b\u3001\u751f\u6210\u7684\u62a5\u544a\u7c7b\u578b\u3001\u4ee5\u53ca\u5206\u5e03\u5f0f\u6267\u884c\u7684\u4e00\u4e9b\u7b56\u7565\u914d\u7f6e\u9879\u7b49\u7b49\u3002 \uff082\uff09config.py \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u63d0\u4f9b\u914d\u7f6e\u6587\u4ef6\u8bfb\u53d6\u3001\u52a8\u6001\u83b7\u53d6\u4e00\u4e9b\u5e38\u91cf\uff08\u5982\u9879\u76ee\u6839\u76ee\u5f55\u7edd\u5bf9\u8def\u5f84 (BASE_DIR)\u3001\u7cfb\u7edf\u67b6\u6784\uff08SYS_FRAME\uff09\u3001\u65f6\u95f4\u5b57\u7b26\u4e32\uff08strftime\uff09\u3001\u672c\u673a USERNAME IP \u7b49\u7b49\uff09\u3001\u516c\u5171 URL \u7b49\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u89c4\u8303","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u7248\u672c\u53ca\u4f9d\u8d56","text":"\u57fa\u7840\u6846\u67b6\u4f1a\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u8fdb\u884c\u7248\u672c\u53d1\u5e03\uff0c\u4e0d\u4e0e\u67d0\u4e2a\u5e94\u7528\u7248\u672c\u7ed1\u5b9a\uff0c\u4f46\u662f\uff0c\u5e94\u7528\u5e93\u4f1a\u4f9d\u8d56\u4e8e\u57fa\u7840\u6846\u67b6\u7684\u7248\u672c\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u5efa\u8bae\u5728\u5e94\u7528\u5e93\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a\u6587\u672c\u6587\u4ef6\u7528\u4e8e\u8bb0\u5f55\u6240\u4f9d\u8d56\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\uff0c\u7c7b\u4f3c\u4e8e\u5f00\u53d1\u5e94\u7528\u7684 debian/control \u6587\u4ef6\u7684\u529f\u80fd\uff0c\u4e3a\u4e86\u4fdd\u6301\u7edf\u4e00\uff0c\u8fd9\u4e2a\u6587\u4ef6\u5c31\u547d\u540d\u4e3a control\uff0c\u653e\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u6838\u5fc3\u5e93\u72ec\u7acb\u6027","text":"\u6838\u5fc3\u5e93\u4e0d\u5efa\u8bae\u9488\u5bf9\u67d0\u4e00\u4e2a\u5e94\u7528\u5355\u72ec\u505a\u4ee3\u7801\u4e0a\u7279\u6b8a\u5904\u7406\uff0c\u901a\u5e38\u8003\u8651\u9488\u5bf9\u67d0\u4e00\u79cd\u573a\u666f\u8fdb\u884c\u5904\u7406\uff0c\u8fd9\u4e9b\u573a\u666f\u901a\u5e38\u662f\u5b58\u5728\u4e00\u4e9b\u5171\u6027\u7684\u3002\u6bd4\u5982\u8bf4\uff1a\u684c\u9762\u7684ID\u5206\u914d\u5b58\u5728\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u903b\u8f91\u5904\u7406\u89e3\u51b3ID\u5206\u914d\u9519\u8bef\u7684\u95ee\u9898\uff0c\u4f46\u662f\u8fd9\u90e8\u5206\u903b\u8f91\u6211\u4eec\u4f1a\u5728\u684c\u9762\u7684\u65b9\u6cd5\u5c42\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u517c\u5bb9\u6027","text":"\u4e3a\u4e86\u4fdd\u6301\u517c\u5bb9\u6027\uff0c\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u539f\u5219\u4e0a\u4e0d\u5bf9\u8001\u65b9\u6cd5\u8fdb\u884c\u4fee\u6539\u6216\u5220\u9664\uff0c\u53ea\u8fdb\u884c\u65b0\u589e\u3002\u6d89\u53ca\u5230\u8001\u65b9\u6cd5\u4fee\u6539\u6216\u5220\u9664\u7684\uff0c\u4f1a\u8fdb\u884c\u63d0\u524d\u9884\u544a\uff0c\u5e76\u5728\u7b2c\u4e8c\u4e2a\u7248\u672c\u4e4b\u540e\uff08\u4e2d\u95f4\u4f1a\u9694\u4e00\u4e2a\u7248\u672c\u8fc7\u5ea6\uff09\u6b63\u5f0f\u5b9e\u65bd\u4fee\u6539\u6216\u5220\u9664\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u547d\u540d\u89c4\u8303","text":" \u7528\u4f8b ID \u6bcf\u4e2a\u5e94\u7528\u81ea\u5df1\u7ef4\u62a4\u4e00\u5957 ID\uff0c\u5728PMS\u4e0a\u7528\u4f8b\u6807\u9898\u4e0a\u5c06\u81ea\u52a8\u5316ID\u4ee5\u6807\u7b7e\u7684\u5f62\u5f0f\u5199\u5165\uff0c\u6bd4\u5982\uff1a[101]\u6253\u5f00-\u542f\u52a8\u5e94\u7528\u540edock\u53f3\u952e\u83dc\u5355 \u4e00\u4e2a\u7528\u4f8b\u7c7b\u91cc\u9762\u6709\u591a\u4e2a\u7528\u4f8b\u65f6\uff0c\u5728\u7528\u4f8b\u540d\u79f0\u540e\u9762\u52a0\u5e8f\u53f7\u3002 class TestFileManager(BaseCase):\n\"\"\"\u6587\u7ba1\u7528\u4f8b\"\"\"\ndef test_xxx_015_1(self):\npass\ndef test_xxx_015_2(self):\npass\n \u6ce8\u610f 015_1\uff0c\u4e0d\u8981\u5199015_01\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 PMS \u4e0a\u7684\u7528\u4f8bID\uff1a PMS \u4e0a\u662f6\u4f4d\u6570\uff0c\u4e0d\u591f\u76f4\u89c2\uff0c\u4e5f\u4e0d\u597d\u7ef4\u62a4\uff0c\u5728\u81ea\u52a8\u5316\u4e0b\u9762\u53bb\u627e\u4e00\u4e2a\u5e26\u6709 6 \u4f4d\u6570\u7684\u6587\u4ef6\u662f\u4e00\u4e2a\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 PMS \u4e0a\u7684 ID \u53ef\u80fd\u4f1a\u53d1\u751f\u53d8\u5316\uff0c\u6bd4\u5982\u5bfc\u51fa\u6765\u5bfc\u8fdb\u53bb\u7684\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u5b58\u5728\u95ee\u9898\uff0c\u5982\u679c\u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u8981\u60f3\u627e\u51fa\u6765\u5bf9\u5e94\u4fee\u6539\u81ea\u52a8\u5316\u7528\u4f8b ID\uff0c\u5c06\u4f1a\u662f\u4ef6\u975e\u5e38\u75db\u82e6\u7684\u4e8b\u60c5\u3002 \u51fd\u6570\u547d\u540d\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5de6\u952e\u70b9\u51fb click \u53f3\u952e\u70b9\u51fb right_click \u53cc\u51fb double_click \u79fb\u52a8 move_to \u62d6\u52a8 drag \u65b0\u5efa new \u62d6\u52a8\u5230 drag_to \u4ece\u54ea\u91cc\u62d6\u52a8\u5230\u54ea\u91cc drag_something_from_xxx_to_xxx \u83b7\u53d6 get \u83b7\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5750\u6807 get_location \u975e\u7279\u6b8a\u6587\u4ef6 file word\u6587\u4ef6 doc text\u6587\u4ef6 text \u6587\u4ef6\u5939 dir \u5173\u952e\u8bcd\u6301\u7eed\u589e\u52a0 \u5e38\u91cf\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5e94\u7528\u540d\u79f0 APP_NAME \u5e94\u7528\u63cf\u8ff0 DESC \u672c\u5e94\u7528\u4ee5\u5916\u7684\u5176\u4ed6\u5e94\u7528\uff0c\u6bd4\u5982\u5e2e\u52a9 HELP \u5176\u4ed6\u540d\u79f0\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u65b9\u6cd5\u5305\u540d widget \u65b9\u6cd5\u6587\u4ef6\u540d\uff08\u6587\u7ba1\u4e3e\u4f8b\uff09 dfm_widget.pytitle_widget.pyright_view_widget.pyleft_view_widget.pypop_widget.pybase_widget.pydfm_assert.py \u65ad\u8a00\u8bed\u53e5\u547d\u540d\u89c4\u8303 \u65ad\u8a00\u8bed\u53e5\u90fd\u662f\u4ee5 assert \u5f00\u5934 \u65ad\u8a00 \u8bed\u53e5 \u5224\u65ad\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_existsassert_file_not_exists \u5224\u65ad\u684c\u9762\u76ee\u5f55\u4e0b\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_exists_in_desktopassert_file_not_exists_in_desktop \u5224\u65ad\u56fe\u7247\u5b58\u5728 assert_image_existsassert_image_not_exists \u5224\u65ad\u5f71\u9662\u4e2d\u662f\u5426\u5b58\u5728\u56fe\u7247 assert_image_exists_in_movieassert_image_not_exists_in_movie \u5224\u65ad\u5143\u7d20\u662f\u5426\u5b58\u5728 assert_element_existassert_element_not_exist \u5224\u65ad\u662f\u5426\u76f8\u7b49 assert_equalassert_not_equal \u5224\u65ad\u662f\u5426\u4e3a\u771f assert_trueassert_false"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5fixture","title":"5\u3001fixture \u89c4\u8303","text":"\u7531\u4e8e Pytest \u6846\u67b6\u4e2d\u652f\u6301 fixture \u7684\u5199\u6cd5\u548c Xunit \u5199\u6cd5\u7684\uff0c\u6240\u4ee5\u5e94\u7528\u5e93\u4e2d\u53ef\u80fd\u5b58\u5728\u6df7\u7528\u7684\u60c5\u51b5\uff0c\u4e3a\u7edf\u4e00\u7f16\u7801\u98ce\u683c\u65b9\u4fbf\u540e\u7eed\u7528\u4f8b\u4ee3\u7801\u7ef4\u62a4\uff0c\u73b0\u505a\u4ee5\u4e0b\u89c4\u8303\u8bf4\u660e\uff1a \u629b\u5f03 Xunit \u7684\u5199\u6cd5\uff0c\u7edf\u4e00\u91c7\u7528 Pytest fixture \u7684\u5199\u6cd5\u3002 \u5e94\u7528\u5185 fixture \u8c28\u614e\u4f7f\u7528 autouse=True \uff0c\u975e\u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u975e\u5e38\u4e0d\u5efa\u8bae\u4f7f\u7528\u8fd9\u4e2a\u53c2\u6570\u3002 \u8c03\u7528 fixture \u4e0d\u80fd\u4f7f\u7528 @pytest.mark.usefixture()\uff0c\u4f7f\u7528\u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u4f20\u5165\u51fd\u6570\u5bf9\u8c61\u3002 \u5efa\u8bae\u5728\u4e00\u4e2a conftest.py \u91cc\u9762\u53bb\u5199\uff0c\u4e00\u4e2a\u5e94\u7528\u4e5f\u5c3d\u91cf\u7ef4\u62a4\u4e00\u4e2a conftest.py\u6587\u4ef6\u3002 fixture \u4e5f\u9700\u8981\u5199\u529f\u80fd\u8bf4\u660e\uff0c\u51fd\u6570\u540d\u79f0\u8981\u6709\u5177\u4f53\u542b\u4e49\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#6","title":"6\u3001\u65b9\u6cd5\u7f16\u5199\u89c4\u8303","text":" \u65b9\u6cd5\u7c7b\u578b\uff1a if \u6ca1\u6709\u7528\u5230\u5b9e\u4f8b\u5bf9\u8c61\uff1a\nif \u6ca1\u6709\u7528\u5230\u7c7b\u5bf9\u8c61\uff1a\n\u5199\u9759\u6001\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @staticmethod\nelse\uff1a\n\u5199\u7c7b\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @classmethod\nelse:\n\u76f4\u63a5\u5199\u5b9e\u4f8b\u65b9\u6cd5\n \u4e3e\u4f8b: class TitleWidget:\ndef click_xxx_by_ui(self):\npass\n@staticmethod\ndef click_xxx_by_ui():\npass\n@classmethod\ndef click_xxx_by_ui(cls):\npass\n \u51fd\u6570\u540d\u79f0\u4e0d\u51fa\u73b0\u6570\u5b57\uff0c\u9700\u8981\u8868\u793a\u6570\u91cf\u7684\u7528\u5355\u8bcd\u8868\u793a\u3002 \u51fd\u6570\u529f\u80fd\u6ce8\u91ca\u3002 \u6ca1\u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg2:xxx\n\"\"\"\n \u6709\u53c2\u6570\uff0c\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg1:xxx\nreturn: xxx\n\"\"\"\n \u200b \u7528 Pycharm \u7684\u6ce8\u91ca\u6a21\u677f\u4e5f\u53ef\u4ee5\uff0c\u53ea\u8981\u4f53\u73b0\u4e86\u53c2\u6570\u7684\u7c7b\u578b\u548c\u8fd4\u56de\u5c31\u884c\u4e86\u3002 \u6682\u4e0d\u8981\u6c42\u5199\u7c7b\u578b\u6ce8\u89e3\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#7case","title":"7\u3001\u7528\u4f8b\uff08case\uff09\u89c4\u8303","text":" \u4ee5\u7c7b\u7684\u5f62\u5f0f\u5199\u7528\u4f8b\uff0c\u7528\u4f8b\u7c7b\u96c6\u6210\u7528\u4f8b\u57fa\u7c7b\u3002 \u7528\u4f8b\u7c7b\u9700\u8981\u5199\u6ce8\u91ca\u3002 \u6d4b\u8bd5\u7528\u4f8b\u51fd\u6570\u8bf4\u660e\uff08\u5efa\u8bae\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u540d\u79f0\uff09 \"\"\"\u53f3\u4fa7\u9884\u89c8-\u56fe\u7247\u7c7b\u578b\u4fe1\u606f\u680f\u57fa\u672c\u4fe1\u606f\"\"\"\n \u4e0d\u5199\u8c03\u8bd5\u4ee3\u7801 if __name__ == '__main__':\npytest.main()\n \u6240\u6709\u7528\u4f8b\u90fd\u7ee7\u627f BaseCase\u3002 BaseCase \u91cc\u9762\u653e\u4e00\u4e9b\u6d4b\u8bd5\u6570\u636e\u7684\u5e38\u91cf\uff0c\u6bd4\u5982\u6587\u4ef6\u540d\u79f0\uff0c\u5e94\u7528\u540d\u79f0\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u4e00\u4e9b\u901a\u7528\u7684\u5b57\u7b26\u4e32\u3002 \u8fd9\u7c7b\u662f\u5c5e\u4e8e\u6d4b\u8bd5\u6570\u636e\u3002 class BaseCase(DfmAssert):\n\"\"\"\u7528\u4f8b\u57fa\u7c7b\"\"\"\nNEW_FILE = \"\u65b0\u5efa\u6587\u672c.txt\"\nTEST_FILE = \"test.txt\"\nNEW_DIR = \"\u65b0\u5efa\u6587\u4ef6\u5939\"\nNEW_WORD = \"\u65b0\u5efaWord\u6587\u6863.doc\"\nAPP_HELP = \"damn\"\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\n\"\"\"\u7528\u4f8b\u6807\u9898\uff08\u590d\u5236PMS\u4e0a\u7528\u4f8b\u6807\u9898\uff09\"\"\"\ndfm = DfmWidget()\ndfm.click_xxx_by_attr(self.NEW_FILE)\ndfm.new_file_in_desktop_by_cmd(self.NEW_FILE)\nself.assert_true(dfm.get_process_status(self.APP_NAME))\n \u7528\u4f8b\u91cc\u9762\u5c3d\u91cf\u51cf\u5c11\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\uff0c\u66f4\u8981\u51cf\u5c11\u76f8\u540c\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\u3002 \u7edf\u4e00\u6587\u4ef6\u6ce8\u91ca\u5934\u3002 #!/usr/bin/env python3\n# _*_ coding:utf-8 _*_\n\"\"\"\n:Author:email@uniontech.com\n:Date :${DATE} ${TIME}\n\"\"\"\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#8","title":"8\u3001\u5176\u4ed6\u89c4\u8303","text":" \u65e5\u5fd7\u6253\u5370\u8981\u5728\u65b9\u6cd5\u6700\u524d\u9762\uff0c\u5426\u5219\u4ee3\u7801\u62a5\u9519\u6ca1\u6709\u65e5\u5fd7\u8f93\u51fa\uff0c\u4e0d\u597d\u5b9a\u4f4d\u95ee\u9898\u3002\uff08\u6211\u4eec\u4f1a\u8003\u8651\u7ee7\u7eed\u4f7f\u7528\u62e6\u622a\u5668\u6253\u5370\u65e5\u5fd7\uff09 \u6240\u6709\u7684\u64cd\u4f5c\u90fd\u9700\u8981\u6709\u65e5\u5fd7\uff0c\u5305\u62ec sleep()\uff0c\u6211\u4eec\u4f1a\u91cd\u5199\u4e00\u4e2a\u6709\u65e5\u5fd7\u8f93\u5165\u7684 sleep\u3002 \u4e1a\u52a1\u5c42\u65e5\u5fd7\u7ea7\u522b\u4e3a INFO\u3002 hook \u51fd\u6570\u53ea\u80fd\u5199\u5230\u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u91cc\u9762\u3002 apps \u76ee\u5f55\u4e0b\u7684 conftest.py \u539f\u5219\u4e0a\u4e0d\u4f1a\u65b0\u589e fixture\u3002 \u56fa\u5b9a\u76ee\u5f55\u6216\u5143\u7d20\u63a7\u4ef6\u7684\u64cd\u4f5c\uff0c\u5c06\u64cd\u4f5c\u65b9\u6cd5\u5199\u6b7b\uff0c\u6587\u4ef6\u7c7b\u64cd\u4f5c\u5c06\u6587\u4ef6\u540d\u7559\u53c2\u6570\u3002 \u8def\u5f84\u62fc\u63a5\u89c4\u8303\uff1a \u7cfb\u7edf\u4e2d\u56fa\u5b9a\u76ee\u5f55\uff0c\u8def\u5f84\u62fc\u63a5\u65f6\u4f7f\u7528\u6ce2\u6d6a\u7b26\u53f7\uff0c\u6bd4\u5982\uff1a~/Desktop/\uff0c\u4e0b\u5c42\u4f7f\u7528 os.path.expanduser()\uff0c\u5b83\u53ef\u4ee5\u81ea\u52a8\u8bc6\u522b\u6ce2\u6d6a\u7b26\u53f7\u3002 \u9879\u76ee\u4e0b\u8def\u5f84\u4f7f\u7528\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u8def\u5f84\uff0c\u6bd4\u5982\uff1aConfig.BASE_PATH\uff0c\u56e0\u4e3a\u9879\u76ee\u662f\u53ef\u4ee5\u5728\u4efb\u610f\u8def\u5f84\u8fd0\u884c\u7684\uff0c\u9700\u8981\u52a8\u6001\u62fc\u63a5\u8def\u5f84\u3002 "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848","text":"# =================================================\n# Author : Mikigo\n# Time : 2022/3/16\n# version \uff1a1.0\n# =================================================\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"AT \u5e94\u7528\u5e93\u6539\u9020\u662f\u57fa\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u8fdb\u884c\u7528\u4f8b\u65b9\u6cd5\u548c\u4e1a\u52a1\u903b\u8f91\u7684\u91cd\u65b0\u8bbe\u8ba1\uff0c\u4ee5\u5b9e\u73b0\u5e94\u7528\u5e93\u9ad8\u6548\u7684\u7f16\u5199\u3001\u7ef4\u62a4\u7528\u4f8b\u53ca\u5176\u65b9\u6cd5\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u6587\u4ef6\u7ba1\u7406\u5668\u4ece\u4e1a\u52a1\u590d\u6742\u5ea6\u548c\u7528\u4f8b\u91cf\u6765\u8bb2\uff0c\u5728\u7cfb\u7edf\u6240\u6709\u5e94\u7528\u4e2d\uff0c\u662f\u5f88\u6709\u4ee3\u8868\u6027\u7684\uff0c\u96be\u5ea6\u4e5f\u662f\u6700\u5927\u7684\uff0c\u56e0\u6b64\u6211\u4eec\u9009\u53d6\u6587\u4ef6\u7ba1\u7406\u5668\u4f5c\u4e3a\u5e94\u7528\u5e93\u6539\u9020\u7684\u5b9e\u9a8c\u5e94\u7528\uff0c\u7ed9\u540e\u7eed\u5176\u4ed6\u5e94\u7528\u6539\u9020\u63d0\u4f9b\u5207\u5b9e\u53ef\u884c\u7684\u601d\u8def\u548c\u65b9\u6848\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u5206\u5c42\u8bbe\u8ba1\u56fe","text":"\u6574\u4f53\u4ecd\u7136\u9075\u5faa PO \u8bbe\u8ba1\u7406\u5ff5\uff0c\u6839\u636e\u4e1a\u52a1\u9700\u8981\uff0c\u5c06\u6587\u7ba1\u4e1a\u52a1\u5c42\u8fdb\u884c 3 \u5c42\u5212\u5206\uff1a "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-dde-file-manager # \u5e94\u7528\u4ed3\u5e93\n\u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 test_xxx_001.py\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u00a0\u251c\u2500\u2500 __init__.py\n\u2502 \u00a0\u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u00a0\u251c\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u00a0\u251c\u2500\u2500 base_widget.py # \u65b9\u6cd5\u57fa\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 title_widget.py # title \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 right_view_widget.py # right view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 left_view_widget.py # left view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 pop_widget.py # pop \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 dfm_widget.py # \u65b9\u6cd5\u7684\u7edf\u4e00\u51fa\u53e3\n\u2502 \u00a0\u2514\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 tag # \u7528\u4f8b\u6807\u7b7e\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 xxx.csv # \u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2514\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u57fa\u7c7b","text":" \u7ee7\u627f\u6838\u5fc3\u5c42\u7684\u5404\u4e2a\u6a21\u5757\u7c7b\u3002 \u62bd\u53d6\u64cd\u4f5c\u5c42\u7684\u4e00\u4e9b\u57fa\u7840\u65b9\u6cd5\u3002 \u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u7684\u4e00\u4e9b\u516c\u5171\u65b9\u6cd5\u3002 \u8def\u5f84\u7ec4\u88c5\u65b9\u6cd5\u3002 \u4e00\u4e9b\u4e1a\u52a1\u5c42\u76f8\u5173\u7684\u53d8\u91cf\u3001\u5e38\u91cf\u3001shell\u547d\u4ee4\u3001\u5750\u6807\u3002 \u65b9\u6cd5\u57fa\u7c7b\u7684\u5199\u6cd5\uff1a from src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u64cd\u4f5c\u5c42","text":" \u6a21\u5757\u5212\u5206 \u6309\u7167\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u6587\u7ba1\u4e3b\u754c\u9762\u5206\u4e3a\u4e09\u4e2a\u533a\u57df\uff1a\u6807\u9898\u680f\u3001\u53f3\u8fb9\u89c6\u56fe\u533a\u57df\u3001\u5de6\u8fb9\u89c6\u56fe\u533a\u57df \u5f39\u7a97\uff1a\u8bbe\u7f6e\u754c\u9762\u5f39\u7a97\u3001\u4fdd\u9669\u7bb1\u5f39\u7a97\u3001\u5220\u9664\u786e\u8ba4\u5f39\u7a97\u3001\u53ca\u5404\u79cd\u7f51\u7edc\u5f39\u7a97 \u53f3\u952e\u83dc\u5355\uff1a\u6682\u65f6\u4e0d\u8003\u8651\u4e3a\u5355\u72ec\u7684\u6a21\u5757\uff0c\u8003\u8651\u4ee5\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6848\u505a\u6210\u516c\u5171\u5e93\u3002 \u5404\u4e2a\u6a21\u5757\u53ea\u7ee7\u627f\u57fa\u7c7b from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u6784\u9020\u51fd\u6570\u91cc\u9762\u4e0d\u6784\u9020\u5bf9\u8c61\uff0c\u53ef\u4ee5\u521d\u59cb\u5316\u4e00\u4e9b\u53d8\u91cf\u3002 \u4e0d\u540c\u7684\u5b9a\u4f4d\u65b9\u6848\u8c03\u7528\u4e0d\u540c\u7684\u5b9a\u4f4d\u5de5\u5177\u5bf9\u8c61\u3002 self.dog\nself.ui\nself.d_bus\n \u65b9\u6cd5\u7f16\u5199 \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u5e94\u7528\u5c42","text":" \u7ee7\u627f\u64cd\u4f5c\u5c42\u7684\u6240\u6709\u7c7b\u3002 \u4ec5\u4ec5\u7528\u4e8e\u7528\u4f8b\u4e2d\u5bfc\u5165\u65b9\u4fbf\uff0c\u4e0d\u505a\u5176\u4ed6\u4e8b\u60c5\u3002 class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n DfmAssert \u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u7ee7\u627f\uff0c\u65b9\u4fbf\u4f7f\u7528\u65ad\u8a00\u8bed\u53e5\u3002 from apps.dde_file_manager.widget.dfm_widget import DfmWidget\nfrom public.assert import Assert\nclass DfmAssert(Assert):\ndef assert_file_exists_in_desktop(self, file_name):\nself.assert_file_exists(f\"~/Desktop{file_name}\")\n...\nDfmWidget().get_file_in_desktop()\n \u7528\u4f8b\u91cc\u9762\u76f4\u63a5\u7ee7\u627f\uff0c\u65b9\u4fbf\u5728\u7528\u4f8b\u91cc\u9762\u4f7f\u7528 self \u8fdb\u884c\u65ad\u8a00\uff0c\u66f4\u7b26\u5408\u65ad\u8a00\u7684\u4f7f\u7528\u4e60\u60ef\uff0c\u7528\u4f8b\u903b\u8f91\u4e0a\u66f4\u6e05\u695a\u3002 class BaseCase(DfmAssert):\npass\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\nself.assert_file_exists_in_desktop(\"xxx\")\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u903b\u8f91\u4e3e\u4f8b","text":"\u7528\u4f8b\u4ee3\u7801\u8c03\u7528\u903b\u8f91\u4e3e\u4f8b\uff1a # BaseWidget\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n# =============================================\n# TitleWidget\nclass TitleWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_title_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# RightViewWidget\nclass RightViewWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_right_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# =============================================\n# \u51fa\u53e3 DfmWidget\nclass DfmWidget(TitleWidget, RightViewWidget):\npass\n# =============================================\n# in case\nfrom apps.dde_file_manager.widget.dfm_widget import DfmWidget\ndfm = DfmWidget()\ndfm.click_xxx_title_by_ui()\ndfm.click_xxx_right_by_ui()\ndfm.dog.print_desc()\ndfm.ui.print_number()\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u5de5\u7a0b\u6539\u9020\u5b9e\u65bd\u6b65\u9aa4","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_2","title":"1\u3001\u5de5\u7a0b\u4ee3\u7801\u62c9\u53d6","text":"1.1. \u5c06\u81ea\u52a8\u5316\u57fa\u7840\u6846\u67b6\u7684\u529f\u80fd\u62c9\u5230\u672c\u5730 Autotest Basic Frame \uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame 1.2. \u5c06\u5e94\u7528\u5e93\u4ee3\u7801\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u5e94\u7528\u5e93\u7684\u4ed3\u5e93\u547d\u540d\u5e94\u8be5\u662f\u957f\u8fd9\u6837\u7684 autotest_deepin_xxx\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_2","title":"2\u3001\u8c03\u6574\u5de5\u7a0b\u76ee\u5f55","text":"\u6309\u7167 \u65b9\u6848\u8bbe\u8ba1-\u76ee\u5f55\u7ed3\u6784 \u8fdb\u884c\u76ee\u5f55\u8c03\u6574\uff0c\u5c3d\u91cf\u4f7f\u7528\u7f16\u8f91\u5668\u8fdb\u884c\u76f8\u5e94\u7684\u8c03\u6574\uff0c\u7f16\u8f91\u5668\u63a8\u8350\u4f7f\u7528 Pycharm \uff0c\u4ee5\u4e0b\u64cd\u4f5c\u5747\u5728 Pycharm \u91cc\u9762\u53ef\u5b9e\u73b0\u3002 2.1. \u9700\u8981\u79fb\u52a8 py \u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u76f4\u63a5\u5728\u7f16\u8f91\u5668\u91cc\u9762\uff0c\u4f7f\u7528\u9f20\u6807\u9009\u4e2d\u5e76\u6309\u4f4f\uff0c\u4e4b\u540e\u62d6\u52a8\u5230\u76ee\u6807\u4f4d\u7f6e\u5373\u53ef\uff0cPycharm \u4f1a\u5c3d\u53ef\u80fd\u7684\u81ea\u52a8\u89e3\u51b3\u79fb\u52a8\u5bfc\u81f4\u7684\u8def\u5f84\u95ee\u9898\u3002\u6ce8\u610f\uff0c\u6211\u8bf4\u7684\u662f\u201c\u5c3d\u53ef\u80fd\u201d\uff0c\u6709\u4e9b\u9a9a\u64cd\u4f5c\u7f16\u8f91\u5668\u662f\u65e0\u6cd5\u81ea\u52a8\u5904\u7406\u7684\u3002\u5982\u679c\u6ca1\u6709\u88ab\u7f16\u8f91\u5668\u81ea\u52a8\u5904\u7406\u7684\u8def\u5f84\u95ee\u9898\uff0c\u540e\u7eed\u53ea\u80fd\u624b\u52a8\u89e3\u51b3\u3002 2.2. \u9700\u8981\u91cd\u547d\u540d\u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u5728\u7f16\u8f91\u5668\u91cc\u9762\u9009\u4e2d\u6587\u4ef6\uff0c\u7136\u540e\u4f7f\u7528\u5feb\u6377\u952e Shift + F6 \uff08\u5982\u679c\u5feb\u6377\u952e\u6ca1\u53cd\u5e94\uff0c\u6587\u4ef6\u53f3\u952e\u83dc\u5355 Refactor \u2014\u2014 Rename\uff09\uff0c\u7136\u540e\u5728\u8f93\u5165\u6846\u4e2d\u8f93\u5165\u8981\u91cd\u547d\u540d\u7684\u540d\u79f0\uff0c\u540c\u65f6\uff0c\u786e\u8ba4\u52fe\u9009 Search for references \u548c Search in comments and strings \u8fd9\u4e24\u4e2a\u9009\u9879\uff0c\u6700\u540e\u6309\u56de\u8f66\u6216\u8005\u9f20\u6807\u70b9 Refactor \u3002 \u6ce8\u610f\uff0c\u6b64\u65f6\u7f16\u8f91\u5668\u53ef\u80fd\u4f1a\u63d0\u793a\u4f60\uff0c\u4f60\u8fd9\u4e2a\u91cd\u547d\u540d\u7684\u64cd\u4f5c\u5173\u8054\u4e86\u591a\u4e2a\u6a21\u5757\uff0c\u5b83\u88ab\u591a\u4e2a\u5730\u65b9\u90fd\u4f7f\u7528\u5230\u4e86\uff0c\u76f8\u5173\u7684\u6a21\u5757\u662f\u5426\u4e5f\u4e00\u8d77\u6539\u540d\u4e86\uff0c\u8fd9\u4e0d\u5e9f\u8bdd\u5417\uff0c\u7528\u8fd9\u4e2a\u529f\u80fd\u5c31\u662f\u60f3\u628a\u5173\u8054\u5230\u7684\u90fd\u4fee\u6539\uff0c\u4e0d\u7136\u6211\u4e3a\u4ec0\u4e48\u4e0d\u7528\u6587\u7ba1\u7684\u91cd\u547d\u540d\u529f\u80fd\u5462\uff0c\u522b\u60f3\u4e86\uff0c\u76f4\u63a5\u70b9\u5de6\u4e0b\u89d2\u7684 Refactor \u6309\u94ae\uff0c\u5c31\u662f\u5e72\u3002 \u7c7b\u540d\u3001\u51fd\u6570\u540d\u7684\u91cd\u547d\u540d\u90fd\u5c3d\u91cf\u91c7\u7528\u8fd9\u79cd\u65b9\u6848\uff0c\u56e0\u4e3a\u7f16\u8f91\u5668\u4f1a\u81ea\u52a8\u7ed9\u6211\u4eec\u627e\u5230\u5173\u8054\u7684\u5730\u65b9\uff0c\u7136\u540e\u540c\u6b65\u4fee\u6539\u6389\u3002\u4f60\u53ef\u5343\u4e07\u522b\u76f4\u63a5\u5220\u4e86\u4fee\u6539\u540d\u79f0\uff0c\u4e0d\u7136\u4f60\u53ef\u80fd\u4f1a\u82b1\u4e0a\u4e00\u5929\u7684\u65f6\u95f4\u6765\u89e3\u51b3\u91cd\u547d\u540d\u7684\u95ee\u9898\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u5b9e\u73b0\u6838\u5fc3\u5e93\u63a5\u53e3","text":"3.1. BaseWidget \u5728 BaseWidget \u91cc\u9762\u628a\u8be5\u5199\u7684\u90fd\u5199\u597d\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u4e0a\u9762\u7684\u8bbe\u8ba1\u7406\u5ff5\u6765\u5199\u3002 \u5982\u679c\u4f60\u5acc\u9ebb\u70e6\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u6587\u7ba1\u7684\u5b9e\u9645\u5de5\u7a0b\u4ee3\u7801 autotest_dde_file_manager : https://gerrit.uniontech.com/admin/repos/autotest_dde_file_manager \u3002 3.2. \u64cd\u4f5c\u5c42 \u5982\u679c\u4f60\u662f\u65b0\u5199\u9879\u76ee\uff0c\u4f60\u4f1a\u53d1\u73b0\u4e00\u5207\u90fd\u662f\u90a3\u4e48\u7684\u7b80\u5355\u3001\u76f4\u63a5\uff0c\u6309\u7167\u6211\u4eec\u63d0\u4f9b\u7ed9\u4f60\u7684\u63a5\u53e3\u5199\u7528\u4f8b\u7684\u64cd\u4f5c\u65b9\u6cd5\u5c31\u597d\u4e86\u3002 \u5982\u679c\u4f60\u662f\u60f3\u5bf9\u539f\u6765\u7684\u5de5\u7a0b\u8fdb\u884c\u6539\u9020\uff0c\u4f60\u9700\u8981\u6309\u7167\u6838\u5fc3\u5e93\u65b9\u6cd5\u7684\u8c03\u7528\uff0c\u5c06\u4f60\u4e4b\u524d\u5199\u7684\u6bcf\u4e2a\u65b9\u6848\u8fdb\u884c\u5bf9\u5e94\u7684\u4fee\u6539\uff0c\u5305\u62ec\u7c7b\u548c\u65b9\u6cd5\u7684\u547d\u540d\u3001\u65b9\u6cd5\u5185\u6240\u8981\u7528\u5230\u4e0d\u540c\u5b9a\u4f4d\u65b9\u6cd5\u7684\u5199\u6cd5\u4fee\u6539\u3002 \u8fd9\u65f6\u5019\u4f60\u53ef\u80fd\u4f60\u7684\u4ee3\u7801\u4e2d\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u62a5\u9519\uff0c\u4e0d\u7528\u62c5\u5fc3\uff0c\u4f60\u53ef\u4ee5\u4ece\u4e1a\u52a1\u903b\u8f91\u51fa\u53d1\uff0c\u60f3\u6e05\u695a\u8fd9\u4e2a\u65b9\u6cd5\u662f\u5e72\u4ec0\u4e48\u7684\u3001\u64cd\u4f5c\u7684\u5bf9\u8c61\u662f\u4ec0\u4e48\u3001\u53c2\u6570\u662f\u4ec0\u4e48\uff0c\u6ce8\u610f\u8fd9\u4e9b\u4fee\u6539\u662f\u4f1a\u5f71\u54cd\u5230\u7528\u4f8b\u4ee3\u7801\u91cc\u9762\u7684\uff0c\u6ca1\u5173\u7cfb\uff0c\u7528\u4f8b\u91cc\u9762\u672c\u6765\u4e5f\u5e94\u8be5\u88ab\u5173\u8054\u4fee\u6539\u3002 3.3. \u628a\u914d\u7f6e\u6a21\u5757\u5199\u597d\uff0c\u8fd9\u90e8\u5206\u57fa\u672c\u53ef\u4ee5\u590d\u5236\u6587\u7ba1\u7684\u4ee3\u7801\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4_1","title":"4\u3001\u8def\u5f84\u5904\u7406","text":"4.1. \u5bfc\u5165\u8def\u5f84 \u65b9\u6cd5\u548c\u7528\u4f8b\u4e2d\u90fd\u4f1a\u6d89\u53ca\u5230\u5bfc\u5165\u8def\u5f84\u7684\u4fee\u6539\uff0c\u5728\u4fee\u6539\u8def\u5f84\u65f6\uff0c\u5efa\u8bae\u4f60\u4f7f\u7528 Ctrl + Shift + R \u5168\u5c40\u66ff\u6362\uff0c\u4f1a\u5c06\u6574\u4e2a\u9879\u76ee\u4e0b\u7684\u76f8\u540c\u5730\u65b9\u90fd\u4fee\u6539\u5230\uff0c\u5f53\u7136\uff0c\u4f60\u4e5f\u53ef\u4ee5\u5728\u5c0f\u5f39\u7a97\u4e2d\u4fee\u6539\u5168\u5c40\u66ff\u6362\u4e3a\u5c40\u90e8\u76ee\u5f55\u4e0b\u66ff\u6362\u3002\u5904\u7406\u90a3\u79cd\u6ca1\u6709\u5173\u8054\u5173\u7cfb\uff0c\u4f46\u662f\u53c8\u662f\u76f8\u540c\u540d\u79f0\u7684\u91cd\u547d\u540d\uff0c\u6211\u4e5f\u63a8\u8350\u4f7f\u7528\u8fd9\u79cd\u65b9\u5f0f\u8fdb\u884c\u91cd\u547d\u540d\u3002 \u6ce8\u610f\uff0c\u5168\u5c40\u66ff\u6362\u7684\u65b9\u5f0f\u4efb\u7136\u65e0\u6cd5\u4fdd\u8bc1\u771f\u7684\u5168\u5c40\u88ab\u66ff\u6362\u4e86\uff08\u53ef\u80fd\u662f\u7f16\u8f91\u5668\u7684 Bug \u5427\uff09\uff0c\u6240\u4ee5\u4f60\u4ecd\u7136\u9700\u8981\u624b\u52a8\u770b\u4e0b\u5404\u5904\u662f\u5426\u4fee\u6539\u5230\u4f4d\u3002 4.2. \u8d44\u6e90\u8def\u5f84 \u4e00\u4e9b\u7528\u4f8b\u8d44\u6e90\u9700\u8981\u6839\u636e config.py \u91cc\u9762\u7684\u8def\u5f84\u914d\u7f6e\u8fdb\u884c\u8d44\u6e90\u8def\u5f84\u7684\u62fc\u63a5\uff0c\u5982\u679c\u4f60\u539f\u6765\u672c\u6765\u5c31\u6709\u4e00\u4e2a\u51fd\u6570\u4e13\u95e8\u7528\u4e8e\u7ec4\u88c5\u8def\u5f84\u7684\uff0c\u90a3\u4f60\u53ea\u9700\u8981\u4fee\u6539\u8fd9\u4e00\u4e2a\u5730\u65b9\u5c31\u597d\u4e86\uff0c\u5982\u679c\u4f60\u4e4b\u524d\u5e76\u6ca1\u6709\u8fd9\u6837\u7684\u8bbe\u8ba1\uff0c\u90a3\u53ef\u80fd\u9700\u8981\u4fee\u6539\u5927\u91cf\u6d89\u53ca\u5230\u8d44\u6e90\u8def\u5f84\u7684\u5730\u65b9\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5","title":"5\u3001\u8c03\u8bd5\u548c\u7f16\u5199\u7528\u4f8b","text":"\u4ee5\u4e0a\u51e0\u4e2a\u6b65\u9aa4\u505a\u5b8c\uff0c\u57fa\u672c\u5c31\u53ef\u4ee5\u8fdb\u884c\u7528\u4f8b\u4ee3\u7801\u7684\u8c03\u8bd5\u4e86\uff0c\u8fd9\u90e8\u5206\u5de5\u4f5c\u4e3b\u8981\u89e3\u51b3\u4f60\u4e4b\u524d\u51e0\u4e2a\u6b65\u9aa4\u9057\u6f0f\u7684\u95ee\u9898\uff0c\u5982\u679c\u6240\u6709\u7528\u4f8b\u90fd\u8c03\u8bd5\u901a\u8fc7\u4e86\uff0c\u90a3\u4e48\u5de5\u7a0b\u6539\u9020\u5c31\u5168\u90e8\u5b8c\u6210\u4e86\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/","title":"AT \u5f00\u53d1\u89c4\u8303","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u5f00\u53d1\u89c4\u8303\u662f\u6839\u636e\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fd0\u884c\u4e24\u5e74\u591a\u6765\uff0c\u9047\u5230\u95ee\u9898\u89e3\u51b3\u95ee\u9898\u800c\u5f62\u6210\u7684\u4e00\u4e9b\u89e3\u51b3\u65b9\u6848\uff0c\u6216\u8005\u8bf4\u7ecf\u9a8c\u603b\u7ed3\uff1b\u8fd9\u4e9b\u7ecf\u9a8c\u7b26\u5408\u6211\u4eec\u73b0\u9636\u6bb5 AT \u6240\u5e94\u7528\u7684\u573a\u666f\u9700\u8981\uff0c\u4e5f\u662f\u6211\u4eec\u7ecf\u8fc7\u957f\u671f\u601d\u8003\uff0c\u4e0d\u65ad\u8bd5\u9519\u4e0d\u65ad\u4fee\u6b63\uff0c\u5e76\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u5b9e\u8df5\u4e2d\u68c0\u9a8c\u8fc7\u53ef\u884c\u7684\u3002\u4ee5\u6b64\uff0c\u5e0c\u671b\u80fd\u5e2e\u52a9\u53c2\u4e0e\u5230\u81ea\u52a8\u5316\u7684\u76f8\u5173\u4eba\u5458\u51cf\u5c11\u8bd5\u9519\u6210\u672c\uff0c\u66f4\u597d\u3001\u66f4\u5feb\u7684\u7f16\u5199\u7528\u4f8b\u53ca\u7ef4\u62a4\u7528\u4f8b\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_1","title":"\u4e00\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u89c4\u8303","text":"\u6807\u7b7e\u5316\u7ba1\u7406\u6587\u6863\u8bf7\u53c2\u8003\uff1a \u300a\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u64cd\u4f5c\u6307\u5f15\u300b \u4ee5\u4e0b\u8bf4\u51e0\u4e2a\u5bb9\u6613\u51fa\u73b0\u7684\u95ee\u9898\uff1a"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1","title":"1. \u5bf9\u5e94\u5173\u7cfb","text":" \u5199\u5b8c\u81ea\u52a8\u5316\u7528\u4f8b\u4e4b\u540e\uff0c\u8bf7\u5728 CSV \u6587\u4ef6\u4e2d\u6807\u8bb0\u7528\u4f8b\u7684 ID\u3001\u7b49\u7ea7\u3002\u4e3a\u4e86\u63d0\u9192\u6807\u8bb0\uff0c\u6267\u884c\u7528\u4f8b\u65f6\u5728\u9996\u884c\u4f1a\u8f93\u51fa ERROR \u65e5\u5fd7\uff1a CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94\u7684 ID\uff1b \u5728\u6700\u7ec8\u63d0\u4ea4\u4ee3\u7801\u4e4b\u524d\uff0c\u4f60\u9700\u8981\u5728 CSV \u6587\u4ef6\u91cc\u9762\u5c06ID\u3001\u7528\u4f8b\u7b49\u7ea7\u7b49\u6807\u7b7e\u8865\u5168\uff0c\u5982\u679c CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94 ID\uff0c\u540e\u7eed\u5728\u6279\u91cf\u6267\u884c\u7684\u65f6\u5019\uff0c\u8fd9\u4e9b\u7528\u4f8b\u662f\u4e0d\u4f1a\u6267\u884c\u7684\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2","title":"2. \u540d\u79f0\u4e00\u81f4","text":" CSV \u6587\u4ef6\u7684\u6587\u4ef6\u540d\u3001\u7528\u4f8b\u51fd\u6570\u4e2d\u95f4\u7684\u540d\u79f0\u4e00\u81f4\u3001\u7528\u4f8b py \u6587\u4ef6\u4e2d\u95f4\u7684\u540d\u79f0\uff0c\u8fd9\u4e09\u4e2a\u540d\u79f0\u4e00\u81f4\u3002 \u4e3e\u4f8b\uff1a # test_music_001.py\ndef test_music_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u90a3\u4e48 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e3a music.csv\u3002 AT \u6846\u67b6\u5e95\u5c42\u4ee3\u7801\u5b9e\u73b0\u662f\u5c06 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e0e\u7528\u4f8b\u51fd\u6570\u540d\u79f0\u540d\u79f0\uff08item.name\uff09\u8fdb\u884c\u5bf9\u5e94\uff0c\u56e0\u6b64\uff0c\u6ce8\u610f CSV \u6587\u4ef6\u540d\u79f0\u5bf9\u5e94\u7684\u662f\u7528\u4f8b\u51fd\u6570\u540d\u79f0\uff0c\u5373 def test_music_001 \u91cc\u9762\u7684 music \uff0c\u800c\u4e0d\u662f test_music_001.py \u91cc\u9762\u7684 music \u3002 \u8fd9\u91cc\u7ec6\u7ec6\u54c1\u4e00\u4e0b\u54c8~ \u5982\u679c\u4f60\u5c06\u4e0a\u4f8b\u5199\u6210\u4e86\u8fd9\u6837: # test_music_001.py\ndef test_movie_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u7528\u4f8b\u6267\u884c\u6ca1\u95ee\u9898\uff0c\u4f46\u662f\u6807\u7b7e\u5316\u7ba1\u7406\u662f\u4e0d\u751f\u6548\u7684\uff0c\u6846\u67b6\u65e0\u6cd5\u5c06 music.csv\u6587\u4ef6\u91cc\u9762\u6807\u7b7e\uff0c\u6dfb\u52a0\u5230 test_movie_001\u8fd9\u4e2a\u7528\u4f8b\u4e2d\uff0c\u56e0\u4e3a\u4ed6\u4eec\u6ca1\u6709\u5bf9\u5e94\u5173\u7cfb\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#tag","title":"\u4e8c\u3001\u5206\u652f\u53ca tag \u7ba1\u7406\u89c4\u8303","text":"\u53c2\u8003\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u4ee3\u7801\u7ba1\u7406\u89c4\u8303\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2-tag","title":"2. \u5e94\u7528\u5e93 tag","text":" \u5e94\u7528\u5e93 tag \u6839\u636e\u5e94\u7528\u4ea4\u4ed8\u8282\u70b9\u751f\u6210\uff0c\u6bcf\u6b21\u6253 tag \u4e4b\u524d\uff0c\u76f8\u5173\u6d4b\u8bd5\u4eba\u5458\u9700\u8981\u8fdb\u884c\u7528\u4f8b\u8c03\u8bd5\uff1b \u8c03\u8bd5\u7528\u4f8b\u662f\u6307\u7684\u5728\u5168\u67b6\u6784\uff08x86\u3001arm\u3001mips\uff09\u4e0a\u8c03\u8bd5\u901a\u8fc7\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\u8fbe\u5230 90% \u4ee5\u4e0a\u624d\u80fd\u6253 tag\uff0c\u901a\u8fc7 Jenkins \u6267\u884c\u5668\u6267\u884c\u7528\u4f8b\uff0c\u4fdd\u7559\u901a\u8fc7\u7387\u7ed3\u679c\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\uff1a\u901a\u8fc7\u7528\u4f8b\u6570 / (\u603b\u7528\u4f8b\u6570 - \u5df2\u5e9f\u5f03\u7528\u4f8b) \u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u7b97\u901a\u8fc7 Jenkins \u6267\u884c\u5668 \u4f60\u53ef\u80fd\u4f1a\u5728\u4e00\u4e2a\u4ea4\u4ed8\u5468\u671f\u5185\u6301\u7eed\u7684\u8fdb\u884cAT\u7528\u4f8b\u8c03\u8bd5\uff0c\u4f46\u662f\u6700\u7ec8 AT \u7528\u4f8b\u6253 tag \u7684\u5e94\u7528\u7248\u672c\uff0c\u9700\u8981\u4f7f\u7528\u5e94\u7528\u96c6\u6210\u4ea4\u4ed8\u7684\u6700\u65b0\u5e94\u7528\u7248\u672c\uff0c\u53ef\u4ee5\u4f7f\u7528\u5e94\u7528\u7684\u63d0\u6d4b\u7248\u672c\uff1b\u4e00\u5b9a\u8981\u786e\u4fdd\u8c03\u8bd5\u7528\u4f8b\u7684\u5e94\u7528\u7248\u672c\u662f\u6700\u65b0\u7684\uff0c\u4e0d\u7136\u96c6\u6210\u8fdb\u53bb\u4e4b\u540e\uff0c\u6301\u7eed\u96c6\u6210\u5c31\u4f1a\u51fa\u95ee\u9898\uff1b tag \u53f7\u600e\u4e48\u6253\uff1f \u6839\u636e\u6301\u7eed\u96c6\u6210\u7684\u8981\u6c42\u751f\u6210\uff0c\u5176\u4e2d\u5e94\u7528\u7248\u672c\u53f7\u9700\u8981\u4e0e\u9879\u76ee\u7ecf\u7406\u786e\u8ba4\u672c\u6b21\u5373\u5c06\u96c6\u6210\u7684\u5e94\u7528\u7248\u672c\u53f7\u662f\u591a\u5c11\uff1b tag \u7684 commit \u4fe1\u606f\u683c\u5f0f\uff1a # commit msg\nversion:5.6.5\n \u5176\u4e2d 5.6.5 \u5199\u5e94\u7528\u7684\u96c6\u6210\u7248\u672c\u53f7\u3002 \u751f\u6210 tag \u7684\u547d\u4ee4\u53c2\u8003\uff1a\u300aGit \u6807\u7b7e\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3-tag","title":"3. \u57fa\u7840\u6846\u67b6 tag","text":"\u57fa\u7840\u6846\u67b6 tag \u4e0d\u4e0e\u4e1a\u52a1\u6302\u94a9\uff0c\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u6309\u9700\u53d1\u5e03\u7248\u672c\uff0c\u5728\u6839\u76ee\u5f55\u4e0b CURRENT \u6587\u4ef6\u4e2d\u8bb0\u5f55\u7684\u5f53\u524d\u7248\u672c\u53f7\u548c\u5386\u53f2\u7248\u672c\u53f7\uff0c\u53ca\u5176\u5bf9\u5e94\u65b0\u589e\u4e86\u54ea\u4e9b\u529f\u80fd\uff0c\u6709\u52a9\u4e8e\u5e94\u7528\u9009\u62e9\u5408\u9002\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\u3002 # CURRENT\n[current]\ntag = 0.9.5\n \u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u7684 control \u6587\u4ef6\u8bb0\u5f55\u5f53\u524d\u5e94\u7528\u5e93\u4f9d\u8d56\u7684\u57fa\u7840\u5e93\u7248\u672c\u3002 # control\n[Depends]\nautotest-basic-frame = 0.9.5\n \u7528\u4f8b\u5728\u6267\u884c\u65f6\u4f1a\u6821\u9a8c\u4e24\u4e2a\u6587\u4ef6\u7684\u7248\u672c\u53f7\u662f\u5426\u4e00\u81f4\uff0c\u5982\u679c\u4e0d\u4e00\u81f4\uff0c\u4f1a\u6253\u5370 error \u65e5\u5fd7\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_2","title":"\u4e09\u3001\u4ed3\u5e93\u6743\u9650\u7ba1\u7406","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_1","title":"1. \u57fa\u7840\u6846\u67b6","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u4ed3\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame \u57fa\u7840\u6846\u67b6\u4e0d\u5141\u8bb8\u533f\u540d\u8bbf\u95ee\uff0c\u5982\u679c\u4f60\u767b\u5f55 gerrit \u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u8bbf\u95ee\u4ee5\u4e0a\u94fe\u63a5\uff0c\u5219\u9700\u8981\u7533\u8bf7\u8bbf\u95ee\u6743\u9650\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_1","title":"2. \u5e94\u7528\u4ed3\u5e93","text":" \u81ea\u52a8\u5316\u5e94\u7528\u4ed3\u5e93\uff1a https://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684 app_name \u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_3","title":"\u56db\u3001\u65b9\u6cd5\u7f16\u5199&\u8c03\u7528\u89c4\u8303","text":"\u65b9\u6cd5\u7f16\u5199\u6574\u4f53\u8bbe\u8ba1\u601d\u8def\u53c2\u8003\uff1a[\u300aAT\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b]"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_2","title":"1. \u65b9\u6cd5\u7f16\u5199","text":"\u5199\u65b9\u6cd5\u7684\u65f6\u5019\u6ce8\u610f\u65b9\u6cd5\u5f52\u5c5e\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget\uff0c\u65b9\u6cd5\u662f\u5728\u54ea\u4e2a\u533a\u57df\u64cd\u4f5c\u7684\uff0c\u5c31\u5199\u5728\u54ea\u4e2a\u7c7b\u91cc\u9762\u3002 \u4e3e\u4f8b\uff1a from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n\"\"\"\u70b9\u51fb\u6807\u9898\u680fxxx\"\"\"\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_2","title":"2. \u65b9\u6cd5\u8c03\u7528","text":" \u5728\u7528\u4f8b\u4e2d\u8c03\u7528\u65b9\u6cd5\uff0c\u901a\u8fc7\u8be5\u5e94\u7528\u552f\u4e00\u7684\u51fa\u53e3\u8fdb\u884c\u8c03\u7528\uff0c\u6bd4\u5982\u6587\u7ba1\uff1a class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n \u4e0d\u8981\u5728\u7528\u4f8b\u4e2d\u5355\u72ec\u53bb\u8c03\u7528 TitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u8fd9\u4e9b\u7c7b\uff0c\u5426\u5219\u540e\u671f\u7528\u4f8b\u4f1a\u53d8\u5f97\u4e0d\u597d\u7ef4\u62a4\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_4","title":"\u4e94\u3001\u7528\u4f8b\u7f16\u5199\u89c4\u8303","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_3","title":"1. \u57fa\u4e8e\u7c7b\u5199\u7528\u4f8b","text":"\u6240\u6709\u7528\u4f8b\u90fd\u5e94\u8be5\u57fa\u4e8e\u7c7b\u53bb\u5199\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001(self):\n\"\"\"\u97f3\u4e50\u542f\u52a8\"\"\"\n \u6ce8\u610f\u4ee5\u4e0b\u51e0\u70b9\uff1a \u7c7b\u540d\u4e0d\u8981\u968f\u4fbf\u53d6\uff0c\u540c\u4e00\u4e2a\u5e94\u7528\u5e94\u8be5\u4f7f\u7528\u540c\u4e00\u4e2a\u7c7b\u540d\uff0c\u7528\u4f8b\u7c7b\u540d\u79f0\u5fc5\u987b\u4ee5 Test \u5f00\u5934\uff0c\u9075\u5faa\u5927\u9a7c\u5cf0\u547d\u540d\u89c4\u8303\uff1b \u7528\u4f8b\u7c7b\u7ee7\u627f BaseCase\uff0c\u4e00\u4e2a\u5e94\u7528\u53ea\u6709\u4e00\u4e2a BaseCase \u4e00\u4e2a py \u6587\u4ef6\u91cc\u9762\u53ea\u6709\u4e00\u4e2a\u7c7b\uff0c\u6211\u4eec\u79f0\u4e3a\u4e00\u4e2a\u6d4b\u8bd5\u7c7b\uff1b \u4e00\u4e2a\u7c7b\u91cc\u9762\u53ef\u4ee5\u6709\u591a\u4e2a\u7528\u4f8b\u51fd\u6570\uff0c\u8fd9\u53d6\u51b3\u8fd9\u6761\u7528\u4f8b\u6709\u591a\u5c11\u4e2a\u6d4b\u8bd5\u70b9\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001_1(self):\n\"\"\"\u4efb\u52a1\u680f\u542f\u52a8\u97f3\u4e50\"\"\"\ndef test_music_001_2(self):\n\"\"\"\u542f\u52a8\u5668\u542f\u52a8\u97f3\u4e50\"\"\" \ndef test_music_001_3(self):\n\"\"\"\u684c\u9762\u542f\u52a8\u97f3\u4e50\"\"\"\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_3","title":"2. \u7528\u4f8b\u51fd\u6570\u89c4\u8303","text":" \u7528\u4f8b\u51fd\u6570\u4ee5 test \u5f00\u5934\uff0c\u9075\u5faa\u86c7\u5f62\u547d\u540d\u89c4\u8303\uff0c\u4e2d\u95f4\u4e3a\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0\uff0c\u540e\u9762\u52a0\u7528\u4f8b ID\uff0c\u6700\u540e\u52a0\u6d4b\u8bd5\u70b9\u5e8f\u53f7\uff0c\u5373 test_${module}_${case_id}[_${index}] \uff1b \u6bd4\u5982\uff1atest_music_001_1\uff0cindex \u4ece 1 \u5f00\u59cb\u3002 \u51fd\u6570\u529f\u80fd\u8bf4\u660e\u91cc\u9762\u5199\u7528\u4f8b\u6807\u9898\uff0c\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u6807\u9898\u5373\u53ef\uff0c\u6ce8\u610f\u7528\u4e09\u5bf9\u53cc\u5f15\u53f7\uff0c\u4e0d\u8981\u7528\u5176\u4ed6\u6ce8\u91ca\uff0c\u66f4\u4e0d\u8981\u7528\u4e95\u53f7\u6ce8\u91ca\u5199\u7528\u4f8b\u6807\u9898\uff1b \u76f4\u63a5\u590d\u5236 PMS \u7528\u4f8b \u7528\u4f8b\u6b65\u9aa4\u76f4\u63a5\u5c06 PMS \u4e0a\u7528\u4f8b\u6b65\u9aa4\u548c\u9884\u671f\u590d\u5236\u8fdb\u6765\uff0c\u7136\u540e\u8fdb\u884c\u6279\u91cf\u6ce8\u91ca\uff08ctrl + /\uff09\uff0c\u5728\u6ce8\u91ca\u7684\u57fa\u7840\u4e0a\u53bb\u5199\u7528\u4f8b\u811a\u672c\u4f1a\u66f4\u52a0\u65b9\u4fbf\u5168\u9762\uff0c\u4e5f\u6bd4\u4f60\u81ea\u5df1\u5199\u6ce8\u91ca\u66f4\u8282\u7ea6\u65f6\u95f4\uff1a \u4e3e\u4f8b\uff0cPMS \u7528\u4f8b\uff1a \u76f4\u63a5\u9009\u4e2d\u7528\u4f8b\u5185\u5bb9\uff0c\u590d\u5236\u4e0b\u6765\uff0c\u7136\u540e\u7c98\u8d34\u5230\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c\u4e2d\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\n \u4e0a\u4f8b\u4e2d\u4e95\u53f7\u6ce8\u91ca\u90e8\u5206\u5c31\u662f\u76f4\u63a5\u4ece PMS \u4e0a\u590d\u5236\u8fc7\u6765\u7684\uff0c\u5728\u6b64\u57fa\u7840\u4e0a\u5199\u7528\u4f8b\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\nmusic = DeepinMusicWidget()\nmusic.click_singer_btn_in_music_by_ui()\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\nmusic.click_icon_mode_in_music_by_ui()\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\nmusic.double_click_first_singer_in_singer_icon_view_by_ui()\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\nself.assert_xxx\n \u4f60\u770b\uff0c\u975e\u5e38\u6e05\u695a\u6bcf\u4e00\u6b65\u5728\u505a\u4ec0\u4e48\uff0c\u91cd\u70b9\u662f\u7701\u53bb\u4e86\u5199\u6ce8\u91ca\u7684\u65f6\u95f4\uff0c\u771f\u7684\u7092\u9e21\u65b9\u4fbf\u3002 \u4e0d\u5199 if __name__ == '__main__':\uff0c\u4e0d\u5199\u591a\u4f59\u7684\u4ee3\u7801\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3","title":"3. \u6570\u636e\u9a71\u52a8","text":" \u5982\u679c\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u662f\u76f8\u540c\u7684\uff0c\u53ea\u662f\u4e00\u4e9b\u53c2\u6570\u53d8\u5316\uff0c\u5c3d\u91cf\u4f7f\u7528\u6570\u636e\u9a71\u52a8\u6765\u5b9e\u73b0\u7528\u4f8b\uff1b \u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u6570\u636e\u9a71\u52a8\u7684\u6570\u636e\uff0c\u4e0d\u80fd\u56e0\u6b64\u5f15\u5165\u4f9d\u8d56\uff0c\u5c3d\u91cf\u4f7f\u7528\u4e00\u4e9b\u6807\u51c6\u5e93\u80fd\u8bfb\u53d6\u7684\u6587\u4ef6\u683c\u5f0f\uff0c\u6bd4\u5982 json\u3001ini\u3001CSV\u3001xml\u3001txt \u7b49\u6587\u4ef6\u683c\u5f0f\uff1b\u4e0d\u5efa\u8bae\u4f7f\u7528 Yaml\u3001Excel\u3001MySQL \u7b49\u6570\u636e\u683c\u5f0f\uff1b \u8bfb\u53d6\u6570\u636e\u65f6\u4e5f\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff0c\u5982\u4f7f\u7528 pandas \u5904\u7406 CSV \u5c31\u5c5e\u4e8e\u5927\u6750\u5c0f\u7528\u4e86\uff0c\u6b63\u5e38\u7684\u6570\u636e\u9a71\u52a8\u8fd8\u6ca1\u5230\u9700\u8981\u5927\u6570\u636e\u5206\u6790\u6765\u5904\u7406\u7684\u5730\u6b65\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u5728 widget/ddt/ \u76ee\u5f55\u4e0b\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5199\u6cd5\uff1a @pytest.mark.parametrize(\"value\", data)\ndef test_smb_049(self, value):\n \u4ee5\u4e0a\u8fd9\u79cd\u53c2\u6570\u5316\u7684\u5199\u6cd5\u672c\u8eab\u6ca1\u4ec0\u4e48\u95ee\u9898\uff0c\u4f46\u662f\uff0c\u8fd9\u91cc\u5fc5\u987b\u8981\u8865\u5145\u4e00\u4e2a\u6ca1\u6709\u7528\u7684\u5c0f\u77e5\u8bc6\uff1a \u5982\u679c\u53c2\u6570\u5316\u6570\u636e\u91cc\u9762\u7684\u5b57\u7b26\u4f1a\u539f\u5c01\u4e0d\u52a8\u7684\u8f93\u51fa\u5230 item.name \u91cc\u9762\uff0c\u663e\u793a\u975e\u5e38\u4e0d\u4f18\u96c5\uff0c\u800c\u4e14\u53ef\u4ee5\u4f1a\u5f15\u5165\u4e00\u4e9b\u610f\u60f3\u4e0d\u5230\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u611f\u53d7\u4e00\u4e0b\uff1a \u53c2\u6570\uff1a data = [\n\"\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\", \"qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678\",\n]\n \u73b0\u8c61\u662f\u8fd9\u6837\u8272\u513f\u7684\uff1a test_smb_049.py::TestFileManager::test_smb_049[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09]\ntest_smb_049.py::TestFileManager::test_smb_049[qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui]\ntest_smb_049.py::TestFileManager::test_smb_049[12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678]\n \u8bf4\u5b9e\u8bdd\uff0c\u770b\u7740\u5fc3\u91cc\u5835\u5f97\u614c\uff0c\u5982\u679c\u8fd9\u91cc\u9762\u5305\u542b\u4e00\u4e9b\u7279\u6b8a\u5b57\u7b26\u6216\u8005\u662f\u8d85\u957f\uff0c\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u5f88\u5947\u5999\u7684\u4e8b\u60c5\u53d1\u751f\u3002 parametrize \u91cc\u9762\u6709\u4e2a\u53c2\u6570\uff1aids\uff0c\u53ef\u4ee5\u89e3\u51b3\u6b64\u7c7b\u95ee\u9898\uff0c\u5c31\u50cf\u8fd9\u6837\uff1a @pytest.mark.parametrize(\"value\", data, ids=[1, 2, 3])\ndef test_smb_049(self, value):\n \u518d\u6765\u611f\u53d7\u4e00\u4e0b\uff1a test_smb_049.py::TestFileManager::test_smb_049[1]\ntest_smb_049.py::TestFileManager::test_smb_049[2]\ntest_smb_049.py::TestFileManager::test_smb_049[3]\n \u660e\u663e\u597d\u591a\u4e86\uff0c\u6240\u4ee5\u5c3d\u91cf\u4f7f\u7528 ids \u8fd9\u4e2a\u53c2\u6570\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 fixture \u7684\u6570\u636e\u9a71\u52a8\u65b9\u5f0f\uff0c\u6846\u67b6\u867d\u7136\u652f\u6301\uff0c\u4f46\u53ef\u8bfb\u6027\u6bd4\u8f83\u5dee\uff1b\u5982\u679c\u4f60\u4e0d\u77e5\u9053\u8fd9\u53e5\u8bdd\u5728\u8bf4\u5565\uff0c\u90a3\u4f60\u53ef\u4ee5\u5ffd\u7565\uff0c\u6211\u4e5f\u4e0d\u6253\u7b97\u8be6\u7ec6\u8bf4\u8fd9\u79cd\u5b9e\u73b0\u65b9\u5f0f\uff0c\u64cd\u4f5c\u6bd4\u8f83\u9a9a\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4","title":"4. \u65ad\u8a00\u8d44\u6e90","text":" \u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u76f4\u63a5\u653e\u5728\u7528\u4f8b\u6a21\u5757\u7684\u540c\u7ea7\u76ee\u5f55\u4e0b\u7684 assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0 + \u7528\u4f8b ID \u547d\u540d\uff1b \u56fe\u50cf\u8bc6\u522b\u65ad\u8a00\uff0c\u4e0d\u8981\u622a\u53d6\u4e00\u5f20\u5f88\u5927\u7684\u56fe\uff0c\u56fe\u7247\u8d44\u6e90\u5305\u542b\u7684\u5143\u7d20\u592a\u591a\u4e86\uff0c\u975e\u5e38\u5bb9\u6613\u53d7\u5230\u9700\u6c42\u5f71\u54cd\uff0c\u5efa\u8bae\u662f\u8fdb\u884c\u5c40\u90e8\u7684\u65ad\u8a00\uff1b \u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u5339\u914d\u5ea6\u662f 0.9\uff0c\u5982\u679c\u65ad\u8a00\u7684\u573a\u666f\u5bf9\u4e8e\u7cbe\u786e\u5ea6\u8981\u6c42\u6ca1\u90a3\u4e48\u9ad8\uff0c\u53ef\u4ee5\u5728\u65ad\u8a00\u8bed\u53e5\u91cc\u9762\u4f20\u5165\u5c0f\u4e8e 0.9 \u7684\u53c2\u6570\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5","title":"5. \u5143\u7d20\u5b9a\u4f4d","text":" \u7528\u4e8e\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u4e2d\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u547d\u540d\u4e3a\u8be5\u5143\u7d20\u7684\u540d\u79f0\uff1b \u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u622a\u53d6\u65f6\u5c3d\u91cf\u7cbe\u786e\u5230\u8fd9\u4e2a\u5177\u4f53\u7684\u6309\u94ae\uff0c\u56fe\u7247\u4e5f\u4e0d\u8981\u592a\u5927\uff1b \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u64cd\u4f5c\u8f83\u5feb\uff0c\u5408\u7406\u52a0\u5165\u7b49\u5f85\u65f6\u95f4\u80fd\u63d0\u9ad8\u7528\u4f8b\u7684\u7a33\u5b9a\u6027\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6","title":"6. \u7528\u4f8b\u8d44\u6e90","text":" \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u4f7f\u7528\u5230\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u6bd4\u5982\u97f3\u4e50\u53ef\u80fd\u9700\u8981\u4e00\u4e9b mp3 \u7684\u8d44\u6e90\u7528\u4e8e\u6d4b\u8bd5\uff0c\u5b58\u653e\u5728 widget/case_res \u76ee\u5f55\u4e0b\uff0c\u524d\u63d0\u662f\u8fd9\u4e9b\u8d44\u6e90\u4e0d\u8d85\u8fc7 10M\uff1b \u5982\u679c\u662f\u4e00\u4e9b\u6bd4\u8f83\u5927\u7684\u8d44\u6e90\uff0c\u5efa\u8bae\u653e\u5230\u7edf\u4e00\u7684 ftp \u670d\u52a1\u5668 \uff08ftp://10.8.10.245\uff09\uff0c\u9700\u8981\u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\u518d\u4e0b\u8f7d\u4e0b\u6765\uff1b f\"wget ftp://{Config.FTP_IP}/uploads/\u591a\u5a92\u4f53/\u5f71\u9662/auto/{file_name};unzip {file_name};rm -rf {file_name};\"\n \u6d4b\u8bd5\u8d44\u6e90\u4e0b\u8f7d\u5230\u5e94\u7528 widget/case_res \u76ee\u5f55\u4e0b\uff1b \u7981\u6b62\u5c06\u6d4b\u8bd5\u8d44\u6e90\u5b58\u653e\u5728\u4e2a\u4eba\u7684\u673a\u5668\u4e0a\uff1b \u5e94\u8be5\u5c3d\u91cf\u4fdd\u8bc1\uff0c\u4e00\u4e2a\u8d44\u6e90\u5728\u4e00\u6b21\u7528\u4f8b\u6267\u884c\u4e2d\u53ea\u9700\u8981\u4e0b\u8f7d\u4e00\u6b21\uff0c\u6240\u4ee5\u4f60\u4e0d\u80fd\u6bcf\u6b21\u4f7f\u7528\u7684\u65f6\u5019\u90fd\u53bb\u4e0b\u8f7d\uff0c\u8fd9\u6837\u53ef\u80fd\u4f1a\u8017\u8d39\u5927\u91cf\u7684\u7f51\u7edc\u8d44\u6e90\uff0c\u800c\u56e0\u4e3a\u5148\u5224\u65ad\u672c\u5730\u662f\u5426\u5b58\u5728\u6b64\u8d44\u6e90\uff0c\u5982\u679c\u4e0d\u5b58\u5728\u518d\u53bb\u4e0b\u8f7d\uff1b \u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u5c06\u8d44\u6e90\u62f7\u8d1d\u5230\u5bf9\u5e94\u7684\u6d4b\u8bd5\u76ee\u5f55\u4e0b\uff0c\u6bd4\u5982\u5c06 mp3 \u6587\u4ef6\u62f7\u8d1d\u5230 ~/Music \u76ee\u5f55\u4e0b\uff0c\u4f46\u662f\u6211\u4eec\u66f4\u5efa\u8bae\u4f60\u4f7f\u7528\u53d1\u9001\u5feb\u6377\u94fe\u63a5\u7684\u65b9\u5f0f\u66ff\u4ee3\u62f7\u8d1d\u7684\u64cd\u4f5c\uff0c\u56e0\u4e3a\u5728\u62f7\u8d1d\u5927\u6587\u4ef6\u65f6\u662f\u5f88\u6d88\u8017\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u800c\u521b\u5efa\u94fe\u63a5\u5219\u4e0d\u4f1a\uff1b @classmethod\ndef recovery_many_movies_in_movie_by_cmd(cls):\n\"\"\"\u6062\u590d\u591a\u4e2a\u89c6\u9891\u6587\u4ef6\u81f3\u89c6\u9891\u76ee\u5f55\u4e2d\"\"\"\nwork_path = f\"/home/{Config.USERNAME}/Videos/auto\"\ncode_path = f\"{Config.CASE_RES_PATH}/auto\"\ncls.run_cmd(f\"rm -rf {work_path};mkdir {work_path}\")\nsleep(1)\nflag = False\nif not exists(code_path):\ncls.run_cmd(f\"mkdir -p {code_path}\")\nflag = True\nlogger.info(f\"ln -s {code_path}/* {work_path}/\")\ncls.run_cmd(\nf\"cd {code_path}/;\"\nf\"{cls.wget_file('auto.zip') if flag else ''}\"\nf\"ln -s {code_path}/* {work_path}/ > /dev/null 2>&1\"\n)\n \u8d44\u6e90\u4e0b\u8f7d\u8fc7\u7a0b\u4e2d\u6ce8\u610f\u8d85\u65f6\u7684\u95ee\u9898\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u5f88\u5927\uff0c\u8981\u7279\u522b\u6ce8\u610f\u8fd9\u95ee\u9898\uff0c\u5982\u679c\u4f60\u4f7f\u7528\u5f3a\u5236\u7b49\u5f85\u4e0b\u8f7d\u7ed3\u675f( os.system )\uff0c\u53ef\u80fd\u4f1a\u9020\u6210\u7528\u4f8b\u6267\u884c\u65f6\u957f\u53d8\u5f97\u4e0d\u53ef\u63a5\u53d7\uff0c\u76ee\u524d\u6211\u4eec\u53d1\u73b0\u5728\u6301\u7eed\u96c6\u6210\u73af\u5883\u6267\u884c\u65f6\u7f51\u7edc\u4e0b\u8f7d\u901f\u5ea6\u5f88\u6162\uff0c\u6240\u4ee5\u8d85\u65f6\u673a\u5236\u662f\u5f88\u6709\u5fc5\u8981\u7684\uff1brun_cmd \u65b9\u6cd5\u6709\u4e00\u4e2a\u9ed8\u8ba4\u8d85\u65f6\u7684\u65f6\u95f4\uff0c\u4f60\u53ef\u4ee5\u6839\u636e\u8d44\u6e90\u5927\u5c0f\u5bf9\u8d85\u65f6\u65f6\u95f4\u8fdb\u884c\u8c03\u6574\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_5","title":"\u516d\u3001\u7528\u4f8b\u8c03\u8bd5\u6280\u5de7","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_4","title":"1. \u65e5\u5fd7","text":" \u4e00\u5b9a\u8981\u5148\u770b\u62a5\u9519\uff0c\u770b error \u65e5\u5fd7\uff0c\u901a\u5e38\u80fd\u660e\u786e\u7684\u544a\u8bc9\u4f60\u5177\u4f53\u54ea\u91cc\u4ee3\u7801\u62a5\u9519\uff1b \u7ed3\u5408\u62a5\u9519\u70b9\u524d\u9762\u7684error\u3001 info \u548c debug \u65e5\u5fd7\u770b\u5426\u662f\u6b63\u5e38\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_4","title":"2. \u65ad\u70b9\u8c03\u8bd5","text":" \u65b9\u6cd5\u62a5\u9519\uff1a \u5728\u65b9\u6cd5\u5e93\u4e2d\u627e\u5230\u5bf9\u5e94\u7684\u65b9\u6cd5\uff0c\u5355\u72ec\u8c03\u7528\uff0c\u770b\u662f\u5426\u80fd\u6b63\u5e38\u6267\u884c\uff1b \u901a\u5e38\u5355\u4e2a\u65b9\u6cd5\u7684\u6267\u884c\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u62a5\u9519\uff0c\u5f88\u5feb\u5c31\u80fd\u6392\u67e5\u51fa\u95ee\u9898\uff1b\u5728\u65b9\u6cd5\u5185\u90e8\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u65b9\u6cd5\u5185\u90e8\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u8c03\u7528\u6ca1\u95ee\u9898\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u62a5\u9519\u7684\u65b9\u6cd5\u524d\u9762\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u7528\u4f8b\u7684\u4e1a\u52a1\u903b\u8f91\u548c\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u65ad\u8a00\u62a5\u9519\uff1a \u65ad\u8a00\u4e3a\u6570\u636e\u65ad\u8a00\uff0c\u6839\u636e\u8868\u8fbe\u5f0f\u8fdb\u884c\u65ad\u8a00\u8bed\u53e5\u8fdb\u884c\u4fee\u6539\uff1b \u6587\u4ef6\u751f\u6210\u7c7b\u65ad\u8a00\uff0c\u67e5\u770b\u662f\u5426\u9700\u8981\u52a0\u7b49\u5f85\u65f6\u95f4\uff1b \u56fe\u50cf\u65ad\u8a00\uff0c\u5728\u65ad\u8a00\u8bed\u53e5\u5904\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u7528\u4f8b\u8fd0\u884c\u5230\u65ad\u8a00\u5904\u4f1a\u505c\u6b62\uff0c\u67e5\u770b\u6b64\u65f6\u65ad\u8a00\u7684\u56fe\u7247\u4e0e\u7528\u4f8b\u6267\u884c\u7684\u73b0\u573a\u5b58\u5728\u4ec0\u4e48\u5dee\u5f02\uff0c\u6b64\u65f6\u4e5f\u53ef\u4ee5\u8fdb\u884c\u91cd\u65b0\u622a\u56fe\uff0c\u4ece\u800c\u66ff\u6362\u65b0\u7684\u56fe\u7247\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3_1","title":"3. \u8fdc\u7a0b\u6267\u884c","text":" \u8fdc\u7a0b\u6267\u884c\u6307\u7684\u662f\u7f16\u8f91\u5668\u901a\u8fc7\u6307\u5b9a\u8fdc\u7a0b\u89e3\u91ca\u5668\u6267\u884c\u81ea\u52a8\u5316\u4ee3\u7801\uff1b \u8fdc\u7a0b\u6267\u884c\u7684\u597d\u5904\u662f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u7684 Debug \u8fd0\u884c\uff0c\u4e0d\u7528\u5728\u6d4b\u8bd5\u673a\u4e0a\u6253\u5f00\u7f16\u8f91\u5668\uff0c\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u66f4\u5feb\uff1b \u652f\u6301\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u7684\u7f16\u8f91\u5668\uff1a \u4e13\u4e1a\u7248 Pycharm VScode \uff0c\u9700\u8981\u4f7f\u7528\u63d2\u4ef6 Remote-SSH \u8fdc\u7a0b\u6267\u884c\u914d\u7f6e \u4ee5 Pycharm \u4e3a\u4f8b\uff1a File \u2014> Settings \u2014> Project \u2014> Python Interpreter \u2014> \u53f3\u8fb9\u8bbe\u7f6e\u6309\u94ae \u2014> Add... \u2014> SSH Interpreter \u2014> New server configuration(\u586b\u5165host\u548cusername) \u2014> Next \u2014> password\uff08\u6d4b\u8bd5\u673a\u5bc6\u7801\uff09 \u2014> Interpreter(\u9009\u62e9\u8fdc\u7a0b\u89e3\u91ca\u5668) \u2014> Finish "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4_1","title":"4. \u73af\u5883\u6e05\u7406","text":" \u5982\u679c\u7528\u4f8b\u91cc\u9762\u7684 teardown \u6ca1\u6709\u6267\u884c\uff0c\u5927\u6982\u7387\u662f\u56e0\u4e3a setup \u91cc\u9762\u4ee3\u7801\u62a5\u9519\uff0c\u8fd9\u4e24\u4e2a\u662f\u4e00\u5bf9\u7684\uff0csetup \u91cc\u9762\u62a5\u9519\uff0cteardown \u91cc\u9762\u7684\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\uff1b \u76ee\u524d\u6211\u4eec\u5df2\u7ecf\u5c06\u5404\u5e94\u7528\u7684 clean_all \u8fd9\u4e2a fixture \u6539\u6210\u4e86\u7ec8\u7ed3\u5668\uff0c\u786e\u4fdd\u59cb\u7ec8\u80fd\u6267\u884c\u5230\u8fd9\u6b65\uff0c\u4f46\u662f\u7528\u4f8b\u91cc\u9762\u7684 fixture\uff0c\u8fd8\u662f\u9700\u8981\u6211\u4eec\u5c0f\u5fc3\u5904\u7406\uff1b \u8981\u6267\u884c clean_all \u9700\u8981\u5728\u7f16\u8f91\u5668\u8fd0\u884c\u53c2\u6570\u52a0 --clean yes\uff0c\u5199\u7528\u4f8b\u7684\u65f6\u5019\u8bf7\u52a0\u4e0a\uff0c\u4e0d\u7136\u4f60\u4e0d\u786e\u5b9a\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u7684\u73af\u5883\u662f\u5426\u6062\u590d\uff1b setup \u53ef\u4ee5\u4e0d\u8981\uff0c\u5c06 setup \u653e\u5230\u7528\u4f8b\u91cc\u9762\u662f\u4e00\u79cd\u7a33\u59a5\u7684\u505a\u6cd5\uff0cteardown \u4e00\u5b9a\u8981\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5_1","title":"5. \u5143\u7d20\u5b9a\u4f4d\u4e0d\u51c6\uff08\u5750\u6807\u8fd4\u56de\u4e0d\u5bf9\uff09","text":" \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u53ef\u80fd\u53d7\u5230\u7a97\u53e3 ID \u7684\u53d8\u5316\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u9ed8\u8ba4\u53d6\u6700\u65b0\u7684\u4e00\u4e2a\u7a97\u53e3\u7528\u4e8e\u5b9a\u4f4d\uff0c\u4f46\u5982\u679c\u5b9e\u9645\u9700\u8981\u5b9a\u4f4d\u7684\u4e0d\u662f\u6700\u65b0\u7684\u7a97\u53e3\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u91cd\u65b0\u5b9e\u4f8b\u5316\u65b9\u6cd5\u7c7b\u5bf9\u8c61\uff0c\u5e76\u5728\u7c7b\u4e2d\u4f20\u5165\u5bf9\u5e94\u7684\u7a97\u53e3\u5e8f\u53f7\uff1b \u57fa\u4e8e\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u76ee\u524d\u9047\u5230\u7684\u7b14\u8bb0\u672c\u4e0a\uff0c\u7531\u4e8e\u5c4f\u5e55\u7f29\u653e\u6bd4\u4f8b\u4e3a 1.25\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u6211\u4eec\u9ed8\u8ba4\u4f7f\u7528\u7f29\u653e\u6bd4\u4f8b\u4e3a 1\uff1b \u57fa\u4e8e\u56fe\u50cf\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u76ee\u6807\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b \u57fa\u4e8e OCR \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u6587\u5b57\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u540c\u6837\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6_1","title":"6. \u952e\u9f20\u64cd\u4f5c\u4e0d\u51c6","text":" \u9f20\u6807\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6bd4\u5982\u53f3\u952e\u3001\u53cc\u51fb\u65e0\u54cd\u5e94\uff1b \u952e\u76d8\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6216\u8005\u5ef6\u8fdf\u8f93\u5165\uff0c\u6bd4\u5982\u7528\u4f8b\u9700\u8981\u8f93\u5165\u201c\u6211\u662f\u4e2d\u56fd\u4eba\u201d\uff0c\u5b9e\u9645\u53ea\u8f93\u5165\u4e86\u201c\u6211\u56fd\u4eba\u201d\uff1b \u4ee5\u4e0a\u95ee\u9898\u6392\u9664\u5e94\u7528\u5361\u987f\u7b49\u95ee\u9898\uff0c\u5927\u6982\u7387\u662f\u7531\u4e8e\u5de5\u5177\u7684\u95ee\u9898\uff0c\u76ee\u524d\u952e\u9f20\u64cd\u4f5c\u6211\u4eec\u4f7f\u7528\u4e09\u4e2a\u5de5\u5177\uff1aDogtail \u63d0\u4f9b\u7684\u952e\u9f20\u5de5\u5177\u3001PyAutoGUI\u3001Xdotool \uff1b \u6709\u540c\u5b66\u53ef\u80fd\u8981\u8bf4\u4e3a\u5565\u8981\u7528\u4e09\u4e2a\u554a\uff0c\u7528\u4e00\u4e2a\u4e0d\u5c31\u597d\u4e86\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u5404\u6709\u4f18\u70b9\u5404\u6709\u7f3a\u70b9\u3002 \u5982\u679c\u4f60\u9047\u5230\u952e\u9f20\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u8bd5\u8bd5\u901a\u8fc7\u4e0d\u540c\u7684\u5de5\u5177\u64cd\u4f5c\uff1b\u952e\u76d8\u8f93\u5165\u5ef6\u8fdf\u7684\u95ee\u9898\uff0c\u4e00\u822c\u662f\u56e0\u4e3a\u8f93\u5165\u901f\u5ea6\u592a\u5feb\u4e86\uff0c\u7cfb\u7edf\u6ca1\u53cd\u5e94\u8fc7\u6765\uff0c\u5e38\u89c1\u4e8e ARM \u548c MIPS \u4e0a\uff0c\u4fee\u6539\u53c2\u6570 delay_time \u7684\u503c\uff0c\u5355\u4f4d\u4e3a\u6beb\u79d2\uff1b # mouse_key.py\n@classmethod\ndef input_message(cls, message, delay_time=300, interval=0.2):\n\"\"\"\n \u8f93\u5165\u5b57\u7b26\u4e32\n :param message: \u8f93\u5165\u7684\u5185\u5bb9\n :param delay_time: \u5ef6\u8fdf\u65f6\u95f4\n :param interval:\n :return:\n \"\"\"\n \u5982\u679c\u4e0d\u662f\u65b9\u6cd5\u7684\u95ee\u9898\uff0c\u5219\u9700\u8981\u7ee7\u7eed\u548c\u5f00\u53d1\u4e00\u8d77\u6392\u9664\uff0c\u662f\u5426\u4e3a\u5e94\u7528\u63a5\u53d7\u952e\u9f20\u4fe1\u53f7\u5904\u7406\u7684\u95ee\u9898\uff0c\u8fd9\u7c7b\u60c5\u51b5\u6211\u4eec\u4e5f\u662f\u9047\u5230\u8fc7\u7684\uff0c\u5177\u4f53\u95ee\u9898\u5177\u4f53\u5206\u6790\u3002 \u6bd4\u5982\u5f71\u9662\u5c31\u91cd\u5199\u4e86\u4e00\u4e2a\u53f3\u952e\u7684\u65b9\u6cd5\uff1a # base_widget.py\n@classmethod\ndef right_click(cls, _x=None, _y=None):\n\"\"\"\n \u91cd\u5199\u5e95\u5c42\u5355\u51fb\u9f20\u6807\u53f3\u952e\n \u89e3\u51b3\u5f71\u9662\u53f3\u952e\u89e6\u53d1release\u4e8b\u4ef6\u7684\u95ee\u9898\uff08\u53f3\u952e\u4e3b\u7a97\u53e3\u4f1a\u64ad\u653e\u89c6\u9891\uff09\n \"\"\"\ncls.mouse_down(_x, _y, button=3)\nsleep(0.1)\ncls.mouse_up(button=3)\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_6","title":"\u4e03\u3001\u5176\u4ed6\u4e0d\u4e3a\u4eba\u77e5\u7684\u7ec6\u8282","text":" \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u5c3d\u91cf\u7f16\u5199\u540c\u4e00\u4e2a\u5e94\u7528\u6216\u6a21\u5757\u7684\u7528\u4f8b\uff0c\u80fd\u5bf9\u8be5\u7528\u4f8b\u5df2\u6709\u65b9\u6cd5\u719f\u6089\uff0c\u907f\u514d\u8fc7\u591a\u91cd\u590d\u4e1a\u52a1\u4ee3\u7801\u7684\u5c01\u88c5\uff1b \u76f8\u540c\u7684\u573a\u666f\u4e0b\uff0c\u5404\u67b6\u6784\u7b49\u5f85\u65f6\u95f4\u4e0d\u540c\uff0c\u5efa\u8bae\u4f7f\u7528\u6846\u67b6\u63d0\u4f9b\u7684 sleep\uff0c\u6211\u4eec\u505a\u4e86\u4e0d\u540c\u67b6\u6784\u7684\u500d\u6570\u653e\u5927\uff1b \u7f16\u5199\u7528\u4f8b\u65f6\uff0c\u5c3d\u91cf\u8003\u8651\u5230\u6bcf\u4e00\u6b65\u5f02\u5e38\u540e\u7684\u73af\u5883\u6062\u590d\uff0c\u9700\u8981\u5efa\u8bae\u8fd9\u79cd\u610f\u8bc6\uff0c\u968f\u65f6\u8981\u8003\u8651\u5230\uff0c\u8fd9\u6b65\u64cd\u4f5c\u6709\u6ca1\u6709\u53ef\u80fd\u51fa\u9519\uff0c\u51fa\u9519\u4e86\u6539\u600e\u4e48\u529e\uff1b \u63d0\u4ea4\u4ee3\u7801\u7684\u65f6\u5019\u6ce8\u610f\u4e0d\u8981\u628a\u4e00\u4e9b\u4e34\u65f6\u7684\u6d4b\u8bd5\u8d44\u6e90\u63d0\u4ea4\u8fdb\u53bb\u4e86\uff0c\u6bd4\u5982\u6d4b\u8bd5\u4e86\u4e00\u4e2a\u5f71\u7247\uff0c\u6709\u4e9b\u540c\u5b66\u4e60\u60ef\u4f7f\u7528 git add . \uff0c\u7136\u540e\u5c31\u5168\u90e8\u63d0\u4ea4\u5230\u4ee3\u7801\u4ed3\u5e93\u4e86\uff0c\u8fd9\u6837\u5373\u4f7f\u540e\u671f\u628a\u5927\u6587\u4ef6\u5220\u4e86\uff0c.git \u6587\u4ef6\u91cc\u9762\u4e5f\u4f1a\u5f88\u5927\uff0c\u9020\u6210\u4ee3\u7801\u4ed3\u5e93\u53d8\u5f97\u5341\u5206\u81c3\u80bf\u3002 \u66f4\u591a\u7ec6\u8282\u67e5\u770b\uff1a\u300aAT\u7ecf\u9a8c\u603b\u7ed3\u300b"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/","title":"AT \u6267\u884c\u5668\u4f7f\u7528\u6307\u5317","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/5/25\n# Author : litao\n# =============================================\n Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1","title":"1\u3001\u529f\u80fd\u4ecb\u7ecd","text":" \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7cfb\u7edf\u8bed\u8a00\u8bbe\u7f6e\uff0c\u5206\u8fa8\u7387\u8bbe\u7f6e\u53ca\u7528\u4f8b\u6267\u884c\u73af\u5883\u642d\u5efa\uff1b \u652f\u6301 IP \u4e3a 15 \u7f51\u6bb5\u7684 AMD \u67b6\u6784\u6d4b\u8bd5\u673a\u955c\u50cf\u88c5\u673a\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u6307\u5b9a\u5e94\u7528\uff0c\u6307\u5b9a\u8303\u56f4\u6807\u7b7e\u7684\u7528\u4f8b\u6267\u884c\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u72b6\u6001\u68c0\u67e5\uff0c\u662f\u5426\u6709\u6b63\u5728\u8fd0\u884c\u7684\u6d4b\u8bd5\uff1b \u652f\u6301\u914d\u7f6e\u7528\u4f8b\u6267\u884c\u65f6\u957f\uff0c\u9632\u6b62\u4efb\u52a1\u963b\u585e\uff1b \u652f\u6301\u6839\u636e\u5e94\u7528\u7248\u672c\u81ea\u52a8\u67e5\u627e\u5bf9\u5e94\u7684\u7528\u4f8b tag\uff1b \u652f\u6301\u5f02\u5e38\u5904\u7406\u548c\u6d4b\u8bd5\u5b8c\u6210\u7684\u5b9e\u65f6\u6d88\u606f\u901a\u77e5\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2job","title":"2\u3001Job \u4ecb\u7ecd","text":"\u4ee5\u4e0b\u6309\u6267\u884c\u6d41\u7a0b\u7684\u987a\u5e8f\u4ecb\u7ecd\uff0c\u6bcf\u4e00\u6b65\u90fd\u53ef\u4ee5\u5355\u72ec\u6267\u884c\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1_1","title":"1\u3001\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/AT_test/ \u6574\u4e2a\u6d41\u7a0b\u7684\u4e3b\u5165\u53e3\uff0c\u901a\u8fc7\u8fd9\u4e2a\u5165\u53e3\uff0c\u8fde\u540c\u6574\u4e2a\u6d4b\u8bd5\u6d41\u7a0b\uff0c\u955c\u50cf\u88c5\u673a\uff0c\u73af\u5883\u90e8\u7f72\uff0c\u6d4b\u8bd5\u5e94\u7528\u53ca\u751f\u6210\u62a5\u544a\u3002 \u53c2\u6570\u4ecb\u7ecd\uff1a \u6d4b\u8bd5\u673a\uff1a\u6240\u6709\u89c4\u6574\u5230\u56fa\u5b9a\u533a\u57df\u7684\u6d4b\u8bd5\u673a\uff0c\u901a\u8fc7\u6d4b\u8bd5\u540c\u5b66\u5bf9\u6d4b\u8bd5\u673a\u7684\u4e60\u60ef\u547d\u540d\uff0c\u5728\u540e\u53f0\u6620\u5c04\u6d4b\u8bd5\u673a\u7684\u8be6\u7ec6\u4fe1\u606f\uff0c\u62ec\u53f7\u4e2d\u4e3a\u6d4b\u8bd5\u673a IP \u7684\u6700\u540e\u4e00\u4f4d\uff1b \u6d4b\u8bd5\u5e94\u7528\uff1a\u6307\u5b9a\u7684\u6d4b\u8bd5\u5e94\u7528\u7684\u5305\u540d\uff0c\u7cfb\u7edf\u6839\u636e\u540d\u79f0\u81ea\u52a8\u62c9\u53d6\u5bf9\u5e94\u7684\u4ed3\u5e93\u4ee3\u7801\uff1b deb\u5305\u4e0b\u8f7d\u5730\u5740\uff1a\u6d4b\u8bd5\u4e0a\u8ff0\u5e94\u7528\u65f6\uff0c\u9700\u8981\u5b89\u88c5\u7684deb\u5305\u4e0b\u8f7d\u5730\u5740\uff0c\u591a\u4e2a\u5730\u5740\u7528\u201c,\u201d\u9694\u5f00\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff1b \u8303\u56f4\u6807\u7b7e\uff1a\u6267\u884c\u6d4b\u8bd5\u7528\u4f8b\u7684\u6807\u7b7e\u8303\u56f4\uff0c\u5bf9\u5e94\u7528\u4f8b\u4ee3\u7801 csv \u6587\u4ef6\u4e2d\u7684\u6807\u7b7e\u4fe1\u606f\uff0c\u4ee5 pytest \u7684mark\u8bed\u6cd5\u7f16\u5199\uff1b \u7cfb\u7edf\u8bed\u8a00\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u8bed\u8a00\u73af\u5883\uff1b \u5206\u8fa8\u7387\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u5206\u8fa8\u7387\u73af\u5883\uff1b \u955c\u50cf\u5730\u5740\uff1a\u955c\u50cf\u4ed3\u5e93\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u901a\u8fc7 PXE \u88c5\u673a\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u88c5\u673a\u73af\u8282\uff08\u76ee\u524d\u4ec5\u652f\u6301\u90e8\u5206 AMD \u67b6\u6784\u7684\u88c5\u673a\uff09\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2pxe","title":"2\u3001PXE \u88c5\u673a","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/IOS_install/ \u8f93\u5165\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\uff0cIP\uff0c\u5bc6\u7801\uff0c\u955c\u50cf\u5730\u5740\u540e\uff0c\u81ea\u52a8\u88c5\u673a\uff0c\u76ee\u524d\u4ec5\u652f\u6301\u56fa\u5b9a 15 \u7f51\u6bb5\u7684\u90e8\u5206 AMD \u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#3","title":"3\u3001\u6b21\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/all_client_test/ \u8be5\u5165\u53e3\u4e0e\u4e3b\u5165\u53e3\u529f\u80fd\u57fa\u672c\u4e00\u81f4\uff0c\u53ea\u662f\u5265\u79bb\u4e86PXE\u88c5\u673a\u6d41\u7a0b\uff0c\u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7684\u6267\u884c\u6d41\u7a0b\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#4","title":"4\u3001\u73af\u5883\u90e8\u7f72","text":"Jenkins url\uff1ahttps://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/env/build?delay=0sec \u8bbe\u7f6e\u6d4b\u8bd5\u673a\u7684\u7cfb\u7edf\u8bed\u8a00\uff0c\u5206\u8fa8\u7387\u53ca\u5b89\u88c5\u6d4b\u8bd5\u6240\u9700\u7684\u4f9d\u8d56\u5305\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#5","title":"5\u3001\u53d1\u9001\u4ee3\u7801","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/send_code/ \u6839\u636e\u6d4b\u8bd5\u5e94\u7528\u540d\u79f0\uff0c\u62c9\u53d6\u5bf9\u5e94\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u5e76\u6839\u636e\u6d4b\u8bd5\u673a\u4e0a\u5e94\u7528\u7248\u672c\u5207\u6362\u5230\u5bf9\u5e94\u7684tag\u7248\u672c\uff0c\u82e5\u672a\u627e\u5230tag\u7248\u672c\uff0c\u5219\u4f7f\u7528\u6700\u65b0\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u518d\u6839\u636e\u5e94\u7528\u5e93\u4ee3\u7801\u4e2d\u914d\u7f6e\u7684\u57fa\u7840\u5e93\u7248\u672c\uff0c\u62c9\u53d6\u57fa\u7840\u5e93\u4ee3\u7801\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#6","title":"6\u3001\u7528\u4f8b\u6267\u884c","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/run_test/ \u8fd0\u884c\u6d4b\u8bd5\u673a\u4e0a\u7684\u7528\u4f8b"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/","title":"AT \u7528\u4f8b\u7b5b\u9009\u6307\u5317","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u7528\u4f8b\u7b5b\u9009\u6807\u51c6\uff0c\u662f\u6311\u9009\u5408\u9002\u7684\u6587\u672c\u7528\u4f8b\u8fdb\u884c\u81ea\u52a8\u5316\u7528\u4f8b\u8f6c\u5316\u7684\u4e00\u4e9b\u901a\u7528\u6807\u51c6\u3002 \u8fc7\u53bb\u6211\u4eec\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u5b9e\u8df5\u8fc7\u7a0b\u4e2d\uff0c\u5199\u4e86\u4e0d\u5c11\u81ea\u52a8\u5316\u7528\u4f8b\uff0c\u968f\u7740\u9700\u6c42\u7684\u8fed\u4ee3\uff0c\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u81ea\u7136\u8150\u5316\uff0c\u56e0\u800c\u9700\u8981\u5728\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\u5bf9\u81ea\u52a8\u5316\u7528\u4f8b\u8fdb\u884c\u7ef4\u62a4\uff0c\u5728\u7ef4\u62a4\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u6211\u4eec\u53d1\u73b0\uff0c\u6709\u4e9b\u7528\u4f8b\u7ef4\u62a4\u8d77\u6765\u592a\u96be\u4e86\uff0c\u8c03\u8bd5\u7528\u4f8b\u8017\u8d39\u5927\u91cf\u65f6\u95f4\uff0c\u6210\u672c\u5f88\u9ad8\u3002 \u56e0\u6b64\uff0c\u6211\u4eec\u603b\u7ed3\u4e00\u4e9b\u81ea\u52a8\u5316\u7528\u4f8b\u9009\u578b\u7684\u6807\u51c6\uff0c\u4ee5\u4f18\u5316\u540e\u7eed\u81ea\u52a8\u5316\u7528\u4f8b\u7ed3\u6784\uff0c\u671f\u5f85\u6211\u4eec\u80fd\u7f16\u5199\u51fa\u9ad8\u6548\u3001\u7a33\u5b9a\u3001\u6613\u4e8e\u7ef4\u62a4\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_1","title":"\u4e00\u3001\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u53ef\u4ee5\u5206\u4e3a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u548c\u4e13\u9879\u81ea\u52a8\u5316\u6d4b\u8bd5\uff0c\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e00\u822c\u53ea\u9488\u5bf9\u4e00\u4e9b\u5e38\u89c4\u7684\u529f\u80fd\u6d4b\u8bd5\uff0c\u5176\u4ed6\u975e\u5e38\u89c4\u529f\u80fd\u7684\u7528\u4f8b\uff0c\u5e94\u8be5\u91c7\u7528\u4e13\u9879\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u6848\uff1b \u4ee5\u4e0b\u662f\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1","title":"1. \u7a33\u5b9a\u6027\u3001\u538b\u6d4b\u7528\u4f8b","text":"\u7a33\u5b9a\u6027\u6d4b\u8bd5\u3001\u538b\u6d4b\u7528\u4f8b\u5e94\u8be5\u662f\u5c5e\u4e8e\u6027\u80fd\u76f8\u5173\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u5982\uff1a\u53cd\u590d\u591a\u6b21\u70b9\u51fb\u6309\u94ae\uff0c\u68c0\u9a8c\u5176\u529f\u80fd\u7a33\u5b9a\u6027\u3002\u56e0\u4e3a\u8fd9\u4e9b\u7528\u4f8b\u65ad\u8a00\u7684\u9884\u671f\u53ef\u80fd\u4e0d\u662f\u5f88\u660e\u786e\uff0c\u66f4\u6709\u751a\u8005\u4e0d\u9700\u8981\u65ad\u8a00\uff0c\u7528\u4f8b\u65f6\u957f\u6bd4\u8f83\u957f\uff0c\u800c\u4e14\u4e0d\u53ef\u63a7\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u76ee\u524d\u6211\u4eec\u6709\u6027\u80fd\u81ea\u52a8\u5316\u7684\u4e13\u9879\u65b9\u6848\uff0c\u4ee5\u53ca\u4e00\u4e9b\u7a33\u5b9a\u6027\u6d4b\u8bd5\u7684\u4e13\u9879\u65b9\u6848\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u6b64\u7c7b\u7528\u4f8b\u653e\u5230\u4e13\u9879\u81ea\u52a8\u5316\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2","title":"2. \u6d89\u53ca\u591a\u4e2a\u7528\u6237\u64cd\u4f5c","text":"\u5e38\u89c1\u4e0e\u6587\u7ba1\u7684\u7528\u4f8b\u4e2d\uff0c\u591a\u7528\u6237\u64cd\u4f5c\u7684\u7528\u4f8b\u4e00\u822c\u90fd\u4f1a\u6d89\u53ca\u5230\u5728\u7cfb\u7edf\u4e2d\u8fdb\u884c\u591a\u4e2a\u7528\u6237\u95f4\u7684\u5207\u6362\uff0c\u81ea\u52a8\u5316\u811a\u672c\u4e00\u822c\u662f\u8fd0\u884c\u5728\u4e00\u4e2a\u7528\u6237\u7a7a\u95f4\u4e0b\u7684\uff0c\u6240\u4ee5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u591a\u7528\u6237\u95f4\u7684\u5207\u6362\u3002 \u6b64\u7c7b\u4e0d\u5efa\u8bae\u91c7\u7528\u81ea\u52a8\u5316\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3","title":"3. \u4e0e\u5f00\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4ea4\u4e92","text":"\u6b64\u7c7b\u573a\u666f\u591a\u4e3a\u5e94\u7528\u7684\u5f02\u5e38\u573a\u666f\u6d4b\u8bd5\uff0c\u6bd4\u5982\uff1a\u590d\u5236\u5927\u6587\u4ef6\u8fc7\u7a0b\u4e2d\u6ce8\u9500\u673a\u5668\u3002 \u81ea\u52a8\u5316\u811a\u672c\u5728\u7cfb\u7edf\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4e4b\u540e\u662f\u4f1a\u505c\u6b62\u8fd0\u884c\u7684\uff1b\u6b64\u7c7b\u7528\u4f8b\u53ef\u4ee5\u505a\u81ea\u52a8\u5316\uff0c\u4f46\u662f\u540c\u6837\u9700\u8981\u505a\u4e13\u9879\u65b9\u6848\uff0c\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u7684\u5904\u7406\u903b\u8f91\u5b8c\u5168\u4e0d\u540c\u3002 \u540e\u7eed\u81ea\u52a8\u5316\u9700\u8981\u516c\u5173\u7684\u70b9\uff1a \u81ea\u52a8\u5316\u811a\u672c\u5728\u672c\u673a\u8fd0\u884c\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u81f3\u5c11\u9700\u8981\u63d0\u4f9b\u4ee5\u4e0b\u529f\u80fd\uff1a \u91cd\u542f\u4e4b\u540e\u7528\u4f8b\u80fd\u81ea\u52a8\u8fd0\u884c\uff1b\u53ef\u4ee5\u8003\u8651\u5c06\u6267\u884c\u7528\u4f8b\u5199\u6210\u4e00\u4e2a\u5f00\u673a\u81ea\u542f\u7684\u670d\u52a1\uff1b \u80fd\u8bb0\u5f55\u5173\u673a\u4e4b\u524d\u7528\u4f8b\u6267\u884c\u7684\u4f4d\u7f6e\uff0c\u91cd\u542f\u4e4b\u540e\u80fd\u4ece\u6b64\u4f4d\u7f6e\u5f00\u59cb\u6267\u884c\uff1b \u50cf\u6027\u80fd\u81ea\u52a8\u5316\u4e00\u6837\uff0c\u7531\u670d\u52a1\u7aef\u63a7\u5236\uff1b \u5b8c\u5168\u57fa\u4e8e\u56fe\u5f62\u8bc6\u522b\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u4e32\u53e3\u7ebf\u63a7\u5236\u952e\u9f20\u7a33\u5b9a\u6027\uff1b "},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4","title":"4. \u6d4b\u8bd5\u6267\u884c\u65f6\u95f4\u957f","text":"\u7528\u4f8b\u6267\u884c\u65f6\u95f4\u63a7\u5236\u57282\u5206\u949f\u4ee5\u5185\uff0c\u6781\u7aef\u60c5\u51b5\u4e0d\u8981\u8d85\u8fc75\u5206\u949f\uff0c\u6240\u6709\u7528\u4f8b\u7684\u5e73\u5747\u65f6\u957f\u5e94\u8be5\u57281\u5206\u949f\u5de6\u53f3\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u95f4\u592a\u957f\uff0c\u7f16\u5199\u7528\u4f8b\u3001\u8c03\u8bd5\u7528\u4f8b\u3001\u6267\u884c\u7528\u4f8b\u3001\u7ef4\u62a4\u7528\u4f8b\u90fd\u975e\u5e38\u7684\u8017\u65f6\uff0c\u4eba\u529b\u6210\u672c\u65f6\u95f4\u6210\u672c\u6295\u5165\u592a\u9ad8\u3002 \u4f60\u60f3\uff0c\u8fd9\u6761\u7528\u4f8b\u6267\u884c\u9700\u89815\u5206\u949f\uff0c\u90a3\u4f60\u5199\u8fd9\u6761\u7528\u4f8b\u7684\u65f6\u95f4\u4e0d\u53ef\u80fd\u4e00\u904d\u8fc7\uff0c\u5199\u7684\u8fc7\u7a0b\u4e2d\u8dd1\u4e0d\u901a\u8fd8\u5f97\u91cd\u8dd1\u81f3\u5c1115\u5206\u949f\u4e0d\u8fc7\u5206\uff0c\u5199\u5b8c\u4e86\u8fd8\u5f97\u5728\u5176\u4ed6\u67b6\u6784\u4e0a\u8c03\u8bd5\uff0c\u534a\u4e2a\u5c0f\u65f6\u8fc7\u53bb\u4e86\uff0c\u8fd9\u8fd8\u53ea\u662f\u7b2c\u4e00\u6b21\u5199\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u540e\u7eed\u5982\u679c\u7528\u4f8b\u7ef4\u62a4\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u7ecf\u5e38\u6295\u5165\u76f8\u5f53\u957f\u65f6\u95f4\uff0c\u8fd9\u6837\u5176\u5b9e\u662f\u5931\u53bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u7684\u3002\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u5c31\u5e94\u8be5\u662f\u5feb\u51c6\u72e0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5","title":"5. \u8fb9\u7f18\u6027\u6d4b\u8bd5","text":"\u6709\u4e9b\u529f\u80fd\u6a21\u5757\u672c\u8eab\u662f\u5c5e\u4e8e\u6bd4\u8f83\u8fb9\u7f18\u6027\u7684\uff0c\u5373\u6781\u5c11\u7528\u6237\u4f1a\u4f7f\u7528\u5230\u7684\u529f\u80fd\uff0c\u8fd9\u7c7b\u529f\u80fd\u6a21\u5757\u4e0d\u9700\u8981\u5927\u89c4\u6a21\u5b9e\u73b0\u81ea\u52a8\u5316\uff0c\u4e00\u4e24\u4e2a\u573a\u666f\u8986\u76d6\u57fa\u672c\u529f\u80fd\u5c31\u884c\u4e86\uff0c\u56e0\u6b64\u6211\u4eec\u5728\u6311\u9009\u6b64\u7c7b\u7528\u4f8b\u7684\u65f6\u5019\u53ef\u4ee5\u7ed3\u5408\u6574\u4e2a\u529f\u80fd\u6a21\u5757\u7684\u8986\u76d6\u60c5\u51b5\u6765\u51b3\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6","title":"6. \u9700\u8981\u4f9d\u8d56\u4eba\u5de5\u4ecb\u5165\u7684","text":"\u81ea\u52a8\u5316\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\u662f\u6ca1\u6709\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bd4\u5982\u8981\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u90a3\u4e48\u5c31\u80cc\u79bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u3002 \u6bd4\u5982\u5149\u9a71\u6a21\u5757\uff0c\u5149\u9a71\u523b\u5f55\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u4f46\u662f\u5149\u9a71\u523b\u5f55\u4e4b\u540e\u5149\u76d8\u4f1a\u5f39\u51fa\u6765\uff0c\u9700\u8981\u4eba\u5de5\u66f4\u6362\u5149\u76d8\uff0c\u518d\u624b\u52a8\u63a8\u8fdb\u5149\u9a71\u4e2d\u3002 \u8fd9\u79cd\u529f\u80fd\u6a21\u5757\u5373\u4f7f\u505a\u81ea\u52a8\u5316\uff0c\u80fd\u6d89\u53ca\u5230\u7684\u529f\u80fd\u975e\u5e38\u6709\u9650\uff0c\u800c\u4e14\u4e0d\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u6240\u4ee5\u660e\u663e\u5c31\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7","title":"7. \u96be\u4ee5\u5b9e\u73b0\u7684","text":"\u7528\u4f8b\u6240\u6d89\u53ca\u5230\u7684\u65b9\u6cd5\u5b9e\u73b0\u8d77\u6765\u53ef\u80fd\u6709\u96be\u5ea6\uff0c\u751a\u81f3\u73b0\u9636\u6bb5\u65e0\u6cd5\u5b9e\u73b0\u7684\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002 \u6bd4\u5982\u5f71\u9662\u6d4b\u8bd5\u753b\u9762\u6e05\u6670\u5ea6\u3001\u6d41\u7545\u5ea6\u3001\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u4e4b\u540e\u7684\u89c6\u9891\u662f\u5426\u5b58\u5728\u5361\u987f\u7b49\u7528\u4f8b\uff0c\u73b0\u9636\u6bb5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#8","title":"8. \u529f\u80fd\u4e0d\u7a33\u5b9a","text":"\u8fd9\u4e2a\u4e0d\u662f\u8bf4\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\uff0c\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\u4e0d\u7a33\u5b9a\u662f\u6b63\u5e38\u7684\uff0c\u8fd9\u79cd\u6211\u4eec\u53ef\u4ee5\u7b49\u5f00\u53d1\u63d0\u6d4b\u4e4b\u540e\u518d\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u3002 \u529f\u80fd\u4e0d\u7a33\u5b9a\u6307\u7684\u662f\u7528\u4f8b\u6240\u6d89\u53ca\u7684\u529f\u80fd\uff0c\u53ef\u80fd\u5b58\u5728\u591a\u79cd\u53d8\u5316\uff0c\u6bcf\u6b21\u6267\u884c\u7528\u4f8b\u53ef\u80fd\u65ad\u8a00\u7684\u9884\u671f\u90fd\u4e0d\u540c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#9","title":"9. \u52a8\u6001\u65ad\u8a00","text":"\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u76f4\u5230\u7528\u4f8b\u7ed3\u675f\uff0c\u4e00\u76f4\u662f\u4e00\u4e2a\u52a8\u6001\u53d8\u5316\u7684\u8fc7\u7a0b\uff0c\u800c\u4e14\u65e0\u6cd5\u901a\u8fc7\u5176\u4ed6\u624b\u6bb5\u505c\u4e0b\u6765\uff1b \u6bd4\u5982\uff1a\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u65f6\uff0c\u53f3\u4e0b\u89d2\u7684\u5f55\u5236\u65f6\u95f4\u662f\u4e00\u76f4\u5728\u53d8\u5316\u7684\uff0c\u7528\u4f8b\u9700\u8981\u6d4b\u8bd5\u5f55\u52361\u5206\u949f\u4e4b\u540e\uff0c\u5f55\u5236\u65f6\u95f4\u662f\u521a\u597d\u505c\u572860\u79d2\uff1b \u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fd8\u505a\u4e0d\u5230\u65f6\u95f4\u7cbe\u51c6\u63a7\u5236\uff0c\u7a0b\u5e8f\u6267\u884c\u65f6\u95f4\u662f\u6709\u6ce2\u52a8\u7684\uff0c\u800c\u4e14\u8981\u9002\u914d\u591a\u4e2a\u5e73\u53f0\uff0c\u6240\u4ee5\u6b64\u7c7b\u7528\u4f8b\u5927\u6982\u7387\u4f1a\u6267\u884c\u5931\u8d25\u3002\u7279\u522b\u662f\u5728\u6027\u80fd\u8f83\u5dee\u7684\u56fd\u4ea7\u5316\u67b6\u6784\u4e0a\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u592a\u53ef\u80fd\u7a33\u5b9a\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#10","title":"10. \u63a2\u7d22\u6027\u6d4b\u8bd5","text":"\u63a2\u7d22\u6027\u6d4b\u8bd5\u901a\u5e38\u662f\u4e00\u4e9b\u4e0d\u786e\u5b9a\u7684\u64cd\u4f5c\uff0c\u591a\u53d8\u5207\u590d\u6742\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u9884\u671f\u4e5f\u53ef\u80fd\u662f\u4e0d\u786e\u5b9a\u7684\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u9a9a\u64cd\u4f5c\u592a\u591a\u4e86\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6b64\u7c7b\u7528\u4f8b\u9002\u5408\u91c7\u7528\u624b\u5de5\u6d4b\u8bd5\uff0c\u662f\u624b\u5de5\u6d4b\u8bd5\u771f\u6b63\u7684\u4ef7\u503c\u4f53\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#11","title":"11. \u6613\u7528\u6027\u6d4b\u8bd5","text":"\u5bf9\u4e8e\u6613\u7528\u6027\u7684\u5224\u65ad\u901a\u5e38\u662f\u4e3b\u89c2\u7684\uff0c\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\u5f88\u96be\u53bb\u5b9a\u4e49\u4ec0\u4e48\u6837\u7684\u60c5\u51b5\u5bf9\u7528\u6237\u662f\u6613\u7528\u7684\uff0c\u81ea\u52a8\u5316\u9700\u8981\u6709\u660e\u786e\u7684\u53ef\u5b9e\u73b0\u7684\u9884\u671f\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_2","title":"\u4e8c\u3001\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u524d\u9762\u8bb2\u4e86\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u4e00\u4e9b\u7528\u4f8b\u60c5\u51b5\uff0c\u6709\u540c\u5b66\u5c31\u8bf4\u4e86\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\u4e0d\u7528\u8bb2\u4e86\uff0c\u5c31\u662f\u4e0d\u9002\u5408\u7684\u53cd\u9762\u3002\u6ca1\u6bdb\u75c5\u54c8\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\uff0c\u6211\u4eec\u5927\u4f53\u8fd8\u53ef\u4ee5\u5206\u4e3a\u4e24\u7c7b\uff1a \u7b2c\u4e00\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u597d\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u7b2c\u4e8c\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u4e00\u822c\uff0c\u9700\u8981\u6295\u5165\u66f4\u591a\u7cbe\u529b\u624d\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u4ee5\u4e0b\u4ecb\u7ecd\u4e00\u4e9b\u6211\u4eec\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1_1","title":"1. \u64cd\u4f5c\u76f8\u5bf9\u7b80\u5355","text":"\u7528\u4f8b\u6b65\u9aa4\u76f8\u5bf9\u8f83\u5c11\uff0c\u8fd9\u79cd\u7528\u4f8b\u901a\u5e38\u662f\u4e00\u4e9b\u8def\u5f84\u5f88\u6d45\u7684\u7528\u4f8b\uff0c\u4e00\u822c\u4e5f\u662f\u4e00\u4e9b\u57fa\u7840\u7528\u4f8b\u3002\u7528\u4f8b\u7f16\u5199\u3001\u7ef4\u62a4\u90fd\u53ef\u4ee5\u8f7b\u677e\u641e\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2_1","title":"2. \u5bb9\u6613\u5b9e\u73b0","text":"\u73b0\u6709\u6280\u672f\u662f\u53ef\u5b9e\u73b0\u7684\uff0c\u6ca1\u6709\u96be\u5ea6\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3_1","title":"3. \u7ecf\u5e38\u7528\u4e8e\u56de\u5f52\u6d4b\u8bd5","text":"\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bcf\u6b21\u56de\u5f52\u6d4b\u8bd5\u5fc5\u987b\u8981\u6267\u884c\u7684\u7528\u4f8b\uff0c\u90a3\u4e48\u8fd9\u6761\u7528\u4f8b\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u3002 \u56de\u5f52\u6d4b\u8bd5\u65f6\u6211\u4eec\u9996\u5148\u5e94\u8be5\u4fdd\u8bc1\u5e94\u7528\u5386\u53f2\u57fa\u672c\u529f\u80fd\u6b63\u5e38\uff0c\u6240\u4ee5\u90a3\u4e9b\u6bcf\u6b21\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u90fd\u8981\u6267\u884c\u7684\u7528\u4f8b\u9002\u5408\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4_1","title":"4. \u529f\u80fd\u7a33\u5b9a\u7684\u6838\u5fc3\u529f\u80fd","text":"\u6d89\u53ca\u6838\u5fc3\u529f\u80fd\u7684\u7528\u4f8b\u662f\u6700\u6700\u91cd\u8981\u7684\u7528\u4f8b\uff0c\u4e5f\u662f\u6211\u4eec\u4ea4\u4ed8\u65f6\u5fc5\u987b\u8981\u4fdd\u8bc1\u8d28\u91cf\u7684\u76f8\u5173\u529f\u80fd\uff0c\u56e0\u6b64\u5e94\u8be5\u5c3d\u53ef\u80fd\u7684\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5_1","title":"5. \u8f93\u5165\u6570\u636e\u6d4b\u8bd5","text":"\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u901a\u5e38\u662f\u68c0\u9a8c\u88ab\u6d4b\u5e94\u7528\u63a5\u53d7\u6709\u6548\u6570\u636e\u3001\u62d2\u7edd\u65e0\u6548\u6570\u636e\u7684\u80fd\u529b\u3002\u5982\uff1a\u63d0\u4ea4\u8d85\u957f\u5b57\u7b26\u4e32\u3001\u7279\u6b8a\u5b57\u7b26\u4e32\u7b49\u7b49\u3002 \u6b64\u7c7b\u7528\u4f8b\u624b\u5de5\u6d4b\u8bd5\u5f88\u96be\u6bd4\u8f83\u5168\u9762\u7684\u8986\u76d6\u5230\u6240\u6709\u7684\u8f93\u5165\u60c5\u51b5\uff0c\u4f46\u662f\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\uff0c\u6b64\u7c7b\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u90fd\u662f\u4e00\u6837\u7684\uff0c\u53d8\u5316\u7684\u4ec5\u662f\u8f93\u5165\u53c2\u6570\u548c\u65ad\u8a00\u7ed3\u679c\uff0c\u91c7\u7528\u6570\u636e\u9a71\u52a8\uff0c\u53ef\u4ee5\u8f7b\u677e\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6_1","title":"6. \u683c\u5f0f\u8986\u76d6","text":"\u539f\u56e0\u540c\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u7c7b\u7528\u4f8b\u4e00\u6837\uff0c\u591a\u79cd\u683c\u5f0f\u7684\u8986\u76d6\u4e5f\u662f\u4e00\u4e2a\u5f88\u7e41\u7410\u7684\u4e8b\u60c5\uff0c\u4ea4\u7ed9\u81ea\u52a8\u5316\u6765\u505a\u518d\u5408\u9002\u4e0d\u8fc7\u4e86\u3002 \u6bd4\u5982\u5f71\u9662\u5bf9\u5f71\u7247\u683c\u5f0f\u7684\u68c0\u67e5\u3001\u622a\u56fe\u5f55\u5c4f\u5bf9\u4fdd\u5b58\u683c\u5f0f\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7_1","title":"7. \u68c0\u67e5\u5143\u7d20\u72b6\u6001","text":"\u67e5\u770b\u88ab\u6d4b\u5e94\u7528\u7684\u5143\u7d20\u5c5e\u6027\u3002\u5982\uff1a\u56fe\u7247\u7684\u5927\u5c0f\u548c\u6392\u5217\uff1b\u6309\u94ae\u7684\u53ef\u7528\u548c\u4e0d\u53ef\u7528\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/","title":"AT \u7ecf\u9a8c\u603b\u7ed3","text":"\u6b22\u8fce\u6240\u6709\u4eba\u63d0\u4ea4\u4f60\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u9762\u7684\u4f18\u79c0\u5b9e\u8df5\u7ecf\u9a8c\uff0c\u4ee5\u5e2e\u52a9\u5927\u5bb6\u89e3\u51b3\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#1","title":"1\u3001\u7ec8\u7ed3\u5668","text":"# litaoa@uniontech.com\n \u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4 pytest \u5b9e\u73b0\u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4\u7684\u65b9\u5f0f\u6709\u4e24\u79cd\uff0cyield \u548c\u7ec8\u7ed3\u51fd\u6570\uff1b yield \u5b9e\u73b0\uff0cyield\u524d\u9762\u4e3a\u7528\u4f8b\u7684\u524d\u7f6e\u6b65\u9aa4\uff0cyield \u540e\u9762\u4e3a\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4\u3002 @pytest.fixture\ndef clean_env():\nprint(\"setup\")\nyield\nprint(\"teardown\")\n \u7ec8\u7ed3\u51fd\u6570\u5b9e\u73b0\uff0c\u4f7f\u7528 request.addfinalizer \u6ce8\u518c\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4 @pytest.fixture\ndef clean_env(request):\ndef clean():\nprint(\"teardown\")\nrequest.addfinalizer(clean)\nprint(\"setup\")\n yield\u7684\u4f18\u7f3a\u70b9\uff1a \u4f18\u70b9\uff1a\u4ee3\u7801\u7b80\u6d01\uff0c\u76f4\u89c2\uff0c\u53ef\u4f7f\u7528yield\u5728\u7528\u4f8b\u4e2d\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c \u7f3a\u70b9\uff1a\u82e5\u524d\u7f6e\u6b65\u9aa4\u4e2d\u51fa\u73b0\u9519\u8bef\uff0c\u5219\u540e\u7f6e\u6b65\u9aa4\u4e0d\u4f1a\u6267\u884c \u7ec8\u7ed3\u51fd\u6570\uff1a \u4f18\u70b9\uff1a\u524d\u7f6e\u6b65\u9aa4\u5931\u8d25\u7684\u8bdd\uff0c\u540e\u7f6e\u6b65\u9aa4\u4ecd\u4f1a\u6267\u884c\u4e14\u53ef\u4ee5\u6ce8\u518c\u591a\u4e2a\u540e\u7f6e\u6b65\u9aa4\uff08\u524d\u63d0\uff1a\u9700\u8981\u5728\u4ee3\u7801\u62a5\u9519\u4e4b\u524d\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff09\uff0c\u652f\u6301\u7075\u6d3b\u4f7f\u7528\u540e\u7f6e\u6761\u4ef6 \u7f3a\u70b9\uff1a\u4ee3\u7801\u8f83\u4e3a\u590d\u6742\uff0c\u65e0\u6cd5\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c\uff08\u672c\u4eba\u76ee\u524d\u672a\u5b9e\u73b0\uff09 \u603b\u7ed3\uff1a\u5728\u524d\u7f6e\u6b65\u9aa4\u4fdd\u8bc1\u7edd\u5bf9\u4e0d\u4f1a\u51fa\u9519\u65f6\uff0c\u4f7f\u7528yield\u66f4\u4f73\u7b80\u4fbf\uff0c\u5f53\u524d\u7f6e\u6b65\u9aa4\u6613\u51fa\u73b0\u95ee\u9898\u65f6\uff0c\u63a8\u8350\u4f7f\u7528\u7ec8\u7ed3\u51fd\u6570\u3002 \u573a\u666f\uff1a\u4fdd\u9669\u7bb1\u7528\u4f8b\uff0c\u524d\u7f6e\u6b65\u9aa4\u4e2d\u5f00\u542f\u4fdd\u9669\u7bb1\uff0c\u540e\u7f6e\u6b65\u9aa4\u5220\u9664\u4fdd\u9669\u7bb1\u3002 @pytest.fixture(scope=\"session\", autouse=True)\ndef vault_fixture(request):\nDfmWidget.reset_vault_by_cmd() # 1\u3001\u91cd\u7f6e\u4fdd\u9669\u7bb1\nDdeDockPublicWidget().close_file_manager_by_cmd() # 2\u3001\u5173\u95ed\u6587\u7ba1\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 3\u3001\u5f00\u542f\u6587\u7ba1\nvault = DfmWidget()\nvault.create_file_vault() # 4\u3001\u521b\u5efa\u4fdd\u9669\u7bb1\ndef delete_vault(): # 8\u3001\u5220\u9664\u4fdd\u9669\u7bb1\u7684\u540e\u7f6e\u6b65\u9aa4\nsleep(2)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr()\nvault = DfmWidget()\nvault.delete_file_vault()\nDfmWidget.reset_vault_by_cmd()\nDdeDockPublicWidget().close_file_manager_by_cmd()\nrequest.addfinalizer(delete_vault) # 5\u3001\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\nDdeDockPublicWidget().close_file_manager_by_cmd() # 6\u3001\u5173\u95ed\u6587\u7ba1\nsleep(1)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 7\u3001\u5f00\u542f\u6587\u7ba1\n \u4ee3\u7801\u6309\u6ce8\u91ca\u4e2d\u7684\u5e8f\u53f7\u6267\u884c\u6b65\u9aa4 \u4ee3\u7801\u5728\u6b65\u9aa41-4\u4efb\u610f\u4f4d\u7f6e\u62a5\u9519\uff0c\u5219\u4e0d\u4f1a\u6267\u884c\u6b65\u9aa48\uff0c\u56e0\u4e3a\u672a\u6267\u884c\u5230\u6b65\u9aa45\uff0c\u6b65\u9aa48\u8fd8\u672a\u6ce8\u518c \u4ee3\u7801\u5728\u6b65\u9aa46-7\u62a5\u9519\uff0c\u4ecd\u4f1a\u6267\u884c\u6b65\u9aa47\uff0c\u56e0\u4e3a\u5728\u6b65\u9aa45\u4e2d\u5df2\u7ecf\u5c06\u6b65\u9aa47\u6ce8\u518c \u53ef\u4ee5\u7075\u6d3b\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff0c\u80fd\u5b9e\u73b0\u67d0\u4e2a\u524d\u7f6e\u6b65\u9aa4\u6267\u884c\u4e4b\u540e\uff0c\u624d\u4f1a\u6267\u884c\u540e\u7f6e\u6b65\u9aa4\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#2","title":"2\u3001\u542f\u52a8\u5e94\u7528\u7684\u65b9\u5f0f","text":"# huangmingqiang@uniontech.com\n \uff081\uff09\u547d\u4ee4\u884c\u542f\u52a8 \u5728 AT \u4ee3\u7801\u4e2d\u4f7f\u7528\u547d\u4ee4\u884c\u542f\u52a8\u5e94\u7528\uff0c\u4e3e\u4f8b\uff1a os.popen(\"deepin-music\")\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f7f\u7528 ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6\uff0cdogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u3002 \uff082\uff09\u901a\u8fc7 UI \u64cd\u4f5c\u542f\u52a8 \u901a\u8fc7\u4efb\u52a1\u680f\u3001\u542f\u52a8\u5668\u3001\u684c\u9762\u7b49UI\u65b9\u5f0f\u542f\u52a8\uff0c\u6bd4\u5982\u53cc\u51fb\u6253\u5f00\u3001\u53f3\u952e\u6253\u5f00\u7b49\uff0c\u8fd9\u79cd\u64cd\u4f5c\u65b9\u5f0f\u4e0d\u5b58\u5728ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6dogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u7684\u95ee\u9898\uff0c\u4e5f\u66f4\u52a0\u7b26\u5408\u7528\u6237\u7684\u64cd\u4f5c\u884c\u4e3a\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#3","title":"3\u3001\u6587\u4ef6\u9009\u62e9\u6846\u5c5e\u6027\u5b9a\u4f4d\u5076\u73b0\u65e0\u6cd5\u627e\u5230","text":"\u6587\u4ef6\u9009\u62e9\u6846\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5728\u8c03\u7528\u6587\u4ef6\u9009\u62e9\u6846\u65f6\uff0c\u6709\u4e00\u5b9a\u7684\u6982\u7387\u51fa\u73b0\uff0c\u754c\u9762\u5df2\u7ecf\u6e32\u67d3\u51fa\u6765\u4e86\uff0c\u4f46\u662f\u5c5e\u6027\u6811\u5e76\u6ca1\u6709\u5199\u5165\uff0c\u5bfc\u81f4\u901a\u8fc7\u5c5e\u6027\u65e0\u6cd5\u627e\u5230\u5143\u7d20\uff0c\u76ee\u524d\u4e5f\u6ca1\u6709\u5f88\u597d\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u4e3a\u4e86\u7528\u4f8b\u7a33\u5b9a\u6027\uff0c\u6587\u4ef6\u9009\u62e9\u6846\u7684\u64cd\u4f5c\u5efa\u8bae\u4f7f\u7528UI\u6216\u8005\u56fe\u7247\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u53ef\u4ee5\u901a\u8fc7\u641c\u7d22\u5185\u5bb9\u56fa\u5b9a\u6587\u4ef6\u4f4d\u7f6e\u3002 # litaoa@uniontech.com\n desk = DdeDesktopPublicWidget()\n# \u9009\u62e9\u89c6\u9891\u76ee\u5f55\ndesk.click_videos_dir_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.ctrl_f()\nsleep(1)\ndesk.input_message(\"\u5143\u7d20\u540d\u79f0\")\nsleep(0.5)\ndesk.enter()\nsleep(1)\n# \u9009\u62e9\u7b2c\u4e00\u4e2a\u6587\u4ef6\ndesk.click_list_view_btn_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.click_first_file_in_desktop_plugs_by_ui()\nsleep(1)\n# \u6587\u7ba1\u63d2\u4ef6\u4e2d\u70b9\u51fb\u6253\u5f00\ndesk.click_open_btn_in_desktop_plugs_by_ui()\n"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#4","title":"4\u3001\u5e94\u7528\u542f\u52a8","text":"# mikigo\n \u5728UI\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u4e00\u5207\u64cd\u4f5c\u7684\u90fd\u662f\u4ece\u5e94\u7528\u542f\u52a8\u5f00\u59cb\u7684\uff0c\u800c\u5728Linux\u684c\u9762\u5e94\u7528\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u6211\u4eec\u542f\u52a8\u5e94\u7528\u7684\u65b9\u6cd5\u6709\u591a\u79cd\uff0c\u4e0b\u9762\u505a\u4e00\u4e2a\u7b80\u5355\u7684\u4ecb\u7ecd\uff1a \u3010\u4f7f\u7528dogtail\u542f\u52a8\u3011 dogtail\u63d0\u4f9b\u4e86\u5e94\u7528\u542f\u52a8\u7684\u65b9\u6cd5\uff0c\u5728utils\u5e93\u4e2d\uff0c\u4f7f\u7528run\u65b9\u6cd5\u542f\u52a8\uff1a \u9996\u5148\u5bfc\u5165\u65b9\u6cd5\uff1a from dogtail.utils import *\n \u8c03\u7528run\u65b9\u6cd5 run('deepin-music')\n \u5373\u53ef\u542f\u52a8\u97f3\u4e50 \u8fd9\u79cd\u65b9\u6cd5\u7684\u4f18\u70b9\u662f\u91c7\u7528\u8fdb\u7a0b\u7684\u65b9\u5f0f\u76f4\u63a5\u542f\u52a8\uff0c\u4e0d\u4f9d\u8d56\u4e0eUI\uff0c\u65e0\u8bba\u684c\u9762\u6216\u4efb\u52a1\u680f\u4e0a\u662f\u5426\u5b58\u5728\u5e94\u7528\u56fe\u6807\uff0c\u90fd\u53ef\u4ee5\u6b63\u5e38\u542f\u52a8\u3002 \u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c \u5982\u679c\u4f7f\u7528ssh\u8fdc\u7a0b\u8c03\u7528\uff0c\u6216\u8005Jenkins\u4e2d\u6267\u884c\u6d4b\u8bd5\u811a\u672c\u7684\u65f6\u5019\uff0c\u5728sniff\u4e2d\u4f1a\u51fa\u73b0\u627e\u4e0d\u5230\u5e94\u7528\uff0c\u7ecf\u8fc7\u5206\u6790\uff0c\u53ef\u80fd\u662f\u56e0\u4e3a\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\u542f\u52a8\u7684\u65f6\u5019\uff0c\u5b9e\u9645\u662f\u91c7\u7528\u4e00\u4e2a\u5b50\u8fdb\u7a0b\u542f\u52a8\u4e86\u5e94\u7528\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u5230\u3002 \u3010\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u3011 \u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807 \u901a\u5e38\u6709\u4e24\u79cd\u65b9\u6cd5\uff1a \uff081\uff09\u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807\u3002 \uff082\uff09\u5df2\u77e5\u5e94\u7528\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u7684\u4f4d\u7f6e\uff0c\u7136\u540e\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u5bf9\u5e94\u5750\u6807\u3002 \u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u7f3a\u70b9\u662f\u4f4d\u7f6e\u5fc5\u987b\u56fa\u5b9a\uff0c\u5982\u679c\u79fb\u52a8\u4f4d\u7f6e\u5c31\u4e0d\u884c\u4e86\uff0c\u800c\u4f7f\u7528\u7b2c\u4e00\u79cd\u65b9\u6cd5\uff0c\u65e0\u8bba\u4f4d\u7f6e\u5728\u54ea\u91cc\uff0c\u53ea\u8981\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u5b58\u5728\u5373\u53ef\u3002 \u3010\u70b9\u51fb\u684c\u9762\u56fe\u6807\u542f\u52a8\u3011 \u684c\u9762\u56fe\u6807\u76ee\u524d\u662f\u91c7\u7528\u56fe\u50cf\u8bc6\u522b\u6280\u672f\uff0c\u5b9a\u4f4d\u5230\u5e94\u7528\u56fe\u6807\u7684\u5750\u6807\uff0c\u7136\u540e\u901a\u8fc7pyauogui\u8fdb\u884c\u70b9\u51fb\u64cd\u4f5c\u3002 \u8be6\u7ec6\u6280\u672f\u65b9\u6848\u53ef\u4ee5\u53c2\u8003\u6211\u7684\u53e6\u5916\u4e24\u7bc7\u535a\u5ba2: \u57fa\u4e8eopencv\u7684\u6a21\u677f\u5339\u914d\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd4\u56de\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 Python\u4e09\u65b9\u5e93PyAutoGui\u7684\u4f7f\u7528\u65b9\u6cd5 \u3010\u4ece\u542f\u52a8\u5668\u542f\u52a8\uff08\u4fd7\u79f0\u5f00\u59cb\u83dc\u5355\uff09\u3011 \u542f\u52a8\u4e2d\u542f\u52a8\u7684\u5b9e\u73b0\u903b\u8f91\u5b9e\u9645\u548c\u4efb\u52a1\u680f\u4e0a\u542f\u52a8\u5dee\u4e0d\u591a\u3002 \u9996\u5148\uff0c\u9700\u8981\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u542f\u52a8\u5668\u56fe\u6807\uff0c\u6216\u8005\u952e\u76d8super\u952e\uff0c\u5c06\u542f\u52a8\u5668\u547c\u51fa\u6765\uff0c \u7136\u540e\uff0c\u5728\u542f\u52a8\u5668\u4e2d\u70b9\u51fb\u5bf9\u5e94\u7684\u56fe\u6807\uff0c \u4f46\u662f\u8fd9\u91cc\u6709\u4e2a\u95ee\u9898\uff0c\u542f\u52a8\u5668\u4e2d\u7684\u5e94\u7528\u5217\u8868\uff0c\u4e00\u9875\u5c55\u793a\u4e0d\u5b8c\uff0c\u6240\u4ee5\u5982\u679c\u6211\u4eec\u8981\u70b9\u51fb\u7684\u5e94\u7528\u56fe\u6807\u4e0d\u5728\u7b2c\u4e00\u9875\u600e\u4e48\u529e\uff0c\u901a\u5e38\u89e3\u51b3\u65b9\u6848\u6709\u4e24\u79cd\uff1a \uff081\uff09\u9700\u8981\u8fdb\u884c\u5411\u4e0b\u6ed1\u52a8\uff0c\u8fd9\u91cc\u5c31\u6d89\u53ca\u5230\u76f8\u5e94\u7684\u8bc6\u522b\u65b9\u6848\uff0c\u5224\u65ad\u5982\u679c\u4e0d\u5728\u7b2c\u4e00\u9875\u5c31\u5f80\u4e0b\u6ed1\u52a8\u7ffb\u9875\u3002 \uff082\uff09\u542f\u52a8\u5668\u63d0\u4f9b\u641c\u7d22\u7684\u529f\u80fd\uff0c\u8f93\u5165\u5e94\u7528\u540d\u79f0\u641c\u7d22\uff0c\u7136\u540e\u8fdb\u884c\u70b9\u51fb\u3002 \u4ece\u5b9e\u9645\u64cd\u4f5c\u4e2d\u6765\u770b\uff0c\u91c7\u7528\u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u6548\u7387\u4f1a\u9ad8\u4e00\u70b9\u3002 \u3010\u7ec8\u7aef\u547d\u4ee4\u542f\u52a8\u3011 \u5728python\u4e2d\uff0c\u4f7f\u7528os.popen()\u6216os.system()\u6216\u8005subprocess.Popen()\uff0c\u5b9e\u73b0\u547d\u4ee4\u884c\u542f\u52a8\uff0c\u6bd4\u5982\uff1a import os\nos.popen('deepin-music')\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u8fdc\u7a0b\u6267\u884c\u811a\u672c\u7684\u65f6\u5019\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u7684\u95ee\u9898\u3002 \u3010\u603b\u7ed3\u3011 \u4ee5\u4e0a\u51e0\u79cd\u65b9\u6cd5\uff0c\u5404\u6709\u4f18\u7f3a\u70b9\uff0c\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff1a \uff081\uff09\u5982\u679c\u9700\u8981\u5728Jenkins\u4e2d\u505a\u6301\u7eed\u96c6\u6210\uff0c\u5efa\u8bae\u4f7f\u7528\u7b2c\u4e8c\u79cd\u4efb\u52a1\u680f\u542f\u52a8\u7684\u65b9\u6cd5\u3002 \uff082\uff09\u5982\u679c\u4e0d\u4f1a\u91c7\u7528\u8fdc\u7a0b\u6267\u884c\u7684\uff0c\u5efa\u8bae\u91c7\u7528\u7b2c\u4e00\u79cd\u6216\u8005\u6700\u540e\u4e00\u79cd\u65b9\u6848\u3002 \uff083\uff09\u7b2c\u4e09\u79cd\u548c\u7b2c\u56db\u79cd\u542f\u52a8\u65b9\u6cd5\uff0c\u901a\u5e38\u5728\u6d4b\u8bd5\u7528\u4f8b\u4e2d\u4f1a\u6d89\u53ca\u5230\uff0c\u6240\u4ee5\u5076\u5c14\u4f1a\u7528\u3002"},{"location":"RELEASE/","title":"\u7248\u672c\u66f4\u65b0\u8bb0\u5f55","text":""},{"location":"RELEASE/#220202395","title":"2.2.0\uff082023/9/5\uff09","text":"new \u6b63\u5f0f\u542f\u7528 letmego \u6280\u672f\u65b9\u6848\uff1b fix \u5bf9 docs \u91cc\u9762\u7ec6\u5316\u4e86\u8fdc\u7a0b\u6267\u884c\u7ae0\u8282\u7684\u63cf\u8ff0\uff1b "},{"location":"RELEASE/#2152023831","title":"2.1.5\uff082023/8/31\uff09","text":"new \u5c06\u6709\u8da3\u7684\u6587\u6863\u7cfb\u7edf\u8fc1\u79fb\u5230 linuxdeepin \uff0c\u5265\u79bb\u6587\u6863\u4e2d\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u91c7\u7528 CDN \u52a0\u901f\u65b9\u5f0f\u52a0\u8f7d\uff1b \u5c1d\u8bd5\u5408\u5165\u4e00\u4e2a\u6709\u8da3\u7684\u529f\u80fd\uff1b fix \u4fee\u590d\u4e86 Wayland \u952e\u9f20\u5de5\u5177\u6ca1\u6709\u9f20\u6807\u76f8\u5bf9\u79fb\u52a8\u65b9\u6cd5 moveRel \u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 Wayland \u4e0b\u83b7\u53d6\u7a97\u53e3\u4fe1\u606f\u529f\u80fd\u6a21\u5757\u4e2d\u73af\u5883\u53d8\u91cf\u7684\u95ee\u9898\uff1b \u4f18\u5316\u4e86 startproject \u529f\u80fd\u7684\u4e00\u4e9b\u4fe1\u606f\u8f93\u51fa\uff1b \u4fee\u590d\u4e86\u7279\u6b8a\u573a\u666f\u4e0b env_dev.sh \u5f00\u53d1\u73af\u5883\u90e8\u7f72\u662f\u53ef\u80fd\u5f71\u54cd\u5230\u6b63\u5f0f\u73af\u5883 env.sh \u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#2122023822","title":"2.1.2\uff082023/8/22\uff09","text":"new \u589e\u52a0 OCR \u8bc6\u522b\u81ea\u52a8\u91cd\u8bd5\u673a\u5236\uff0c\u9ed8\u8ba4\u91cd\u8bd5 2 \u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u91cd\u8bd5\u6b21\u6570\uff1b \u4f7f\u7528\u7a97\u7ba1\u6700\u65b0\u63d0\u4f9b\u7684\u4e8c\u8fdb\u5236\u63a5\u53e3\uff0c\u4f18\u5316\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u5728 Wayland \u4e0b\u83b7\u53d6\u7a97\u53e3\u4fe1\u606f\u7684\u65b9\u6cd5\uff1b\u611f\u8c22\u684c\u9762\u6d4b\u8bd5\u90e8 @\u4f55\u6743 @\u5b59\u7fe0 \u3001\u7a97\u7ba1\u7814\u53d1 @\u9ec4\u6cfd\u94ed \u7684\u5927\u529b\u652f\u6301\u3002 \u6269\u5145 skipif \u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\u51fd\u6570\uff1a skipif_xdg_type \u652f\u6301 x11 \u6216 wayland \u4e0a\u8df3\u8fc7\uff1b skipif_cpu_name \u652f\u6301\u4e0d\u540c cpu \u4e0a\u8df3\u8fc7\uff0c\u6bd4\u5982\uff1askipif_cpu_name-KLVVW5821\uff1b "},{"location":"RELEASE/#2102023818","title":"2.1.0\uff082023/8/18\uff09","text":"fix \u4fee\u590d SW \u67b6\u6784\u73af\u5883\u4f9d\u8d56\u7684\u95ee\u9898\uff0c\u539f\u56e0\u662f\u4e4b\u524d\u6211\u8fd9\u91cc\u672c\u5730\u6ca1\u6709 SW \u7684\u673a\u5668\uff0c\u6ca1\u6709\u505a\u76f8\u5173\u9002\u914d\uff1b \u4fee\u590d\u5b50\u9879\u76ee\u5355\u72ec\u9700\u8981\u4e09\u65b9\u5305 pexpect\uff0c\u7531\u4e8e\u4e4b\u524d\u662f\u9884\u88c5\u5230\u955c\u50cf\u91cc\u9762\u7684\uff0c\u4f46\u57fa\u7840\u6846\u67b6\u4e0d\u9700\u8981\uff0c\u56e0\u6b64\u6ca1\u6709\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u91cc\u9762\uff0c\u5bfc\u81f4\u5b50\u9879\u76ee\u4f9d\u8d56\u62a5\u9519\u3002 \u4fee\u590d\u5b50\u9879\u76ee cv \u5bfc\u5165\u62a5\u9519\u7684\u95ee\u9898\uff1b \u539f\u56e0\u4e3a\uff1ayouqu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u517c\u5bb9\u4e24\u79cd\u60c5\u51b5\uff0c\u4e00\u79cd\u662f\u9762\u5411\u670d\u52a1\uff0c\u5c31\u662f\u672c\u5730\u6d4b\u8bd5\u673a\u4e0d\u9700\u8981\u5b89\u88c5 OpenCV\uff0c\u7528\u4f8b\u4e2d\u7684\u56fe\u50cf\u8bc6\u522b\u4f1a\u901a\u8fc7\u8fdc\u7a0b\u670d\u52a1\u63a5\u53e3\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u548c\u7ed3\u679c\u83b7\u53d6\uff1b\u7b2c\u4e8c\u79cd\u662f\u539f\u751f\uff0c\u5c31\u662f\u672c\u5730\u76f4\u63a5\u5b89\u88c5 OpenCV \u76f4\u63a5\u7528\u3002\u4e24\u4e2a\u60c5\u51b5\u7684\u4f18\u5148\u7ea7\u662f\u4f18\u5148\u5224\u65ad\u672c\u5730\u5b58\u5728\uff0c\u5426\u5219\u8d70\u670d\u52a1\u3002 \u524d\u9762\u6211\u4eec\u5df2\u7ecf\u628a OCR \u529f\u80fd\u505a\u4e86\u670d\u52a1\u5316\uff0c\u57fa\u4e8e 1 \u5e74\u591a\u4ee5\u6765\u7684\u89c2\u5bdf\uff0c\u7528\u8d77\u6765\u5f88\u7a33\u5b9a\uff0c\u518d\u4e00\u4e2a\u5c31\u662f OpenCV \u5b89\u88c5\u5305\u662f\u6bd4\u8f83\u81c3\u80bf\u7684\uff0c\u7c97\u7565\u6570\u4e86\u4e0b\u4f9d\u8d56\u6709 30+ \u4e2a\uff0c\u800c\u4e14\u5728\u5404\u67b6\u6784\u4e0a\u4f9d\u8d56\u5305\u8fd8\u4e0d\u5c3d\u76f8\u540c\uff0c\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u65b9\u6848\u4e2d\u4e0d\u592a\u597d\u5904\u7406\uff0c\u6240\u4ee5\u672c\u6b21 2.0 \u7248\u672c\u6211\u4eec\u5927\u80c6\u7684\u5c06\u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u529f\u80fd\u4fee\u6539\u4e3a\u9762\u5411\u670d\u52a1\u7684\u65b9\u5f0f\uff0c\u524d\u671f\u6d4b\u8bd5\u4e00\u5207\u770b\u8d77\u6765\u90fd\u5f88\u548c\u8c10\u3002 \u4f46\u662f\u6ca1\u6ce8\u610f\u5230\u4e4b\u524d\u7ed9\u6d77\u71d5\u59d0\u90a3\u8fb9\u9879\u76ee\u5355\u72ec\u5b9a\u5236\u505a\u4e86\u4e2a\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\uff08\u4e3a\u4e86\u80fd\u7b80\u5355\u5e73\u6ed1\u7684\u8fc1\u79fb\u5230 youqu\uff09\uff0c\u6b64\u63a5\u53e3\u5e95\u5c42\u6ca1\u6709\u517c\u5bb9\u670d\u52a1\u5316\uff0c\u6240\u4ee5\u5979\u90a3\u8fb9\u7684\u9879\u76ee\u8c03\u7528\u6b64\u5b9a\u5236\u63a5\u53e3\u4f1a\u62a5 cv \u5bfc\u5165\u7684\u95ee\u9898\u3002 \u7531\u4e8e\u5c06\u8fd9\u4e2a\u5b9a\u5236\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\u8fdb\u884c\u670d\u52a1\u5316\u517c\u5bb9\u6539\u9020\u9700\u8981\u4e00\u5b9a\u65f6\u95f4\uff0c\u6539\u5b8c\u8fd8\u9700\u8981\u6d4b\u8bd5\uff0c\u4f46\u672c\u6b21\u65f6\u95f4\u6bd4\u8f83\u7d27\uff0c\u56e0\u6b64\u5148\u628a OpenCV \u88c5\u8fdb\u865a\u62df\u73af\u5883\uff0c\u540e\u7eed\u7248\u672c\u518d\u8003\u8651\u9488\u5bf9\u6b64\u63a5\u53e3\u505a\u4fee\u6539\u3002"},{"location":"RELEASE/#2002023816","title":"2.0.0\uff082023/8/16\uff09","text":"YouQu\uff08\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff09\u5f00\u6e90\u4e86\uff0c\u540c\u65f6\u63a8\u51fa\u4e86 2.0 \u7248\u672c\u3002 \u611f\u8c22\u738b\u6ce2\u603b\u3001\u67b6\u6784\u5e08\u5f90\u5c0f\u4e1c\u3001\u7814\u53d1\u7ecf\u7406\u90d1\u5e7c\u6208\u3001\u5218\u90d1\u7b49\u7814\u53d1\u540c\u4e8b\u7684\u5927\u529b\u652f\u6301\u3002 new 1\u3001\u65b0\u7684\u57fa\u7840\u6846\u67b6\u4ee3\u7801\u83b7\u53d6\u65b9\u5f0f\u53ca\u65b0\u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4 YouQu \u540e\u7eed\u5747\u901a\u8fc7 PyPI \u8fdb\u884c\u5305\u7684\u53d1\u5e03\uff0c\u4e5f\u5c31\u662f\u8bf4\u540e\u7eed\u53ef\u4ee5\u4f7f\u7528 pip \u8fdb\u884c\u5b89\u88c5\uff1a sudo pip3 install youqu==2.0.0\n \u8fd9\u91cc\u6709 2 \u4e2a\u5c0f\u70b9\u8981\u6ce8\u610f\uff1a \u63a8\u8350\u4f7f\u7528 sudo pip3 \uff08\u52a0 sudo\uff09\u8fdb\u884c\u5b89\u88c5\uff1b \u5982\u679c\u4e0d\u52a0 sudo \u6709\u4e9b\u673a\u5668\u53ef\u80fd $HOME/.local/bin \u4e0d\u5728\u7cfb\u7edf PATH \u73af\u5883\u76ee\u5f55\u4e0b\uff0c\u5728\u4e0d\u6dfb\u52a0\u73af\u5883\u53d8\u91cf\u7684\u60c5\u51b5\u4e0b\uff0c\u4f1a\u51fa\u73b0 YouQu \u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4\uff08youqu-startproject\uff09\u65e0\u6cd5\u4f7f\u7528\u7684\u95ee\u9898\uff1b \u5f53\u7136\uff0c\u5c06\u4e0a\u8ff0\u8def\u5f84\u6dfb\u52a0\u5230\u73af\u5883\u53d8\u91cf\u4e4b\u540e\u4e5f\u662f\u53ef\u4ee5\u7528\u7684\uff0c\u6240\u4ee5\u6211\u8fd9\u91cc\u662f\u63a8\u8350\u52a0 sudo\uff0c\u4e0d\u52a0 sudo \u4e5f\u662f\u53ef\u4ee5\u7684\uff0c\u53ea\u662f\u9700\u8981\u5173\u6ce8\u4e0b\u73af\u5883\u53d8\u91cf\u7684\u95ee\u9898\u3002 \u63a8\u8350\u6307\u5b9a\u7248\u672c\u53f7\uff08youqu==2.0.0\uff09\u5b89\u88c5\uff0c\u5982\u679c\u4e0d\u6307\u5b9a\u7248\u672c\u53f7\u9ed8\u8ba4\u662f\u5b89\u88c5\u6700\u65b0\u53d1\u5e03\u7684 YouQu \u7248\u672c\uff0c\u4f60\u53ef\u4ee5\u5728 PyPI \u4e0a\u7684 Release history \u91cc\u9762\u67e5\u770b\u6709\u54ea\u4e9b\u7248\u672c\u3002 \u5b89\u88c5\u4e4b\u540e\u4f1a\u81ea\u52a8\u751f\u6210\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu-startproject\uff0c\u4f7f\u7528\u5b83\u53ef\u4ee5\u521d\u59cb\u5316\u5de5\u7a0b\uff0c\u8fd9\u91cc\u4ee5\u97f3\u4e50\u4e3e\u4f8b\uff1b youqu-startproject autotest_deepin_music\n \u8fd9\u6837\u5c31\u4f1a\u5728\u5f53\u524d\u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a autotest_deepin_music \u76ee\u5f55\uff0c\u91cc\u9762\u5305\u542b\u4e86\u57fa\u7840\u6846\u67b6\u6240\u6709\u7684\u4ee3\u7801\uff1b \u4e4b\u540e\uff0c\u8fd8\u662f\u5728 apps \u76ee\u5f55\u4e0b\uff0c\u653e\u5165\u5b50\u9879\u76ee\u7684AT\u4ee3\u7801\u5373\u53ef\uff0c\u4f7f\u7528\u65b9\u6cd5\u548c\u8fc7\u53bb\u4e00\u6837\uff0c\u8fd9\u91cc\u5c31\u4e0d\u591a\u4ecb\u7ecd\u3002 \u53e6\u5916\uff0c\u9664\u4e86\u901a\u8fc7 pip \u83b7\u53d6\u4ee5\u5916\uff0c\u4ecd\u7136\u53ef\u4ee5\u901a\u8fc7\u6e90\u7801\u83b7\u53d6\uff08\u76f4\u63a5 git clone\uff09\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u4f7f\u7528 pip \u5b89\u88c5 YouQu \u65f6\uff0cYouQu \u5305\u7684\u5927\u5c0f\u624d 600+ k\uff0c\u5b89\u88c5\u901f\u5ea6\u8d77\u98de\u3002 2\u3001\u65b0\u7684AT\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848 \u4e3a\u4e86\u89e3\u51b3\u4ee5\u4e0b\u95ee\u9898\uff1a \u8fc7\u53bb\u4e00\u6bb5\u65f6\u95f4\u54b1\u4eec\u7ecf\u5e38\u51fa\u73b0\u7684\uff0c\u4e0d\u540c\u7684AT\u9879\u76ee\u5728\u540c\u4e00\u53f0\u673a\u5668\u4e0a\u90e8\u7f72\u73af\u5883\u65f6\u4f9d\u8d56\u7248\u672c\u51b2\u7a81\u7684\u95ee\u9898\uff0c\u65b0\u65b9\u6848\u4e0d\u540c\u7684\u9879\u76ee\u4f1a\u52a8\u6001\u751f\u6210\u81ea\u5df1\u7684\u865a\u62df\u73af\u5883\uff0c\u76f8\u4e92\u4e4b\u95f4\u4e0d\u5f71\u54cd\uff1b \u4e1a\u5185\u4e3a\u4e86\u89e3\u51b3\u7248\u672c\u51b2\u7a81\u95ee\u9898\u4e00\u822c\u90fd\u4f1a\u4f7f\u7528Python\u865a\u62df\u73af\u5883\u7684\u5de5\u5177\uff0c\u4f46\u662f\u90fd\u6709\u4e2a\u95ee\u9898\uff0c\u65e0\u6cd5\u7ba1\u7406 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u5305\uff0c\u672c\u6b21\u6211\u4eec\u89e3\u51b3\u4e86\u8fd9\u4e2a\u95ee\u9898\uff0c\u80fd\u591f\u5b8c\u5168\u7ba1\u7406\u5e38\u89c4\u7684Python\u5305\uff0c\u4e5f\u80fd\u7ba1\u7406\u5230 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u4e09\u65b9\u5305\uff1b \u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u4f7f\u7528\u65b9\u6cd5\uff1a bash env.sh\n \u53ef\u4ee5\u770b\u51fa\u6765\u548c\u539f\u6765\u4f7f\u7528\u65b9\u6cd5\u6ca1\u6709\u53d8\u5316\uff0c\u4e5f\u5c31\u662f\u8bf4\u4ece\u4f7f\u7528\u7684\u89d2\u5ea6\u662f\u5b8c\u5168\u6ca1\u6709\u533a\u522b\u7684\uff0c\u53ea\u662f\u5185\u90e8\u505a\u4e86\u4e0d\u540c\u7684\u4e8b\u60c5\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u672c\u673a\u90e8\u7f72\u7684\u529f\u80fd\u4ecd\u7136\u4fdd\u7559 env_dev.sh\uff0c\u53ef\u4ee5\u4f5c\u4e3a\u5f00\u53d1\u65f6\u7684\u73af\u5883\u90e8\u7f72\u3002 3\u3001\u65b0\u7684\u9a71\u52a8\u547d\u4ee4 \u8fc7\u53bb\u54b1\u4eec\u90fd\u662f\u4f7f\u7528\u8fd9\u6837\u7684\u547d\u4ee4\u6765\u9a71\u52a8\u6267\u884c\uff1a python3 manage.py run\n \u7531\u4e8e\u9ed8\u8ba4\u57fa\u4e8e\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848\uff0c\u56e0\u6b64\u6211\u4eec\u589e\u52a0\u4e86\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu\uff1b \u65b0\u7684\u9a71\u52a8\u65b9\u5f0f\uff1a youqu manage.py run\n \u53ea\u9700\u8981\u628a python3 \u66ff\u6362\u6210 youqu \u5c31\u53ef\u4ee5\u4e86\uff0c\u770b\u8d77\u6765\u5f88\u548c\u8c10~ 4\u3001\u65b0\u7684\u6587\u6863\u5730\u5740 \u8fc7\u53bb\u54b1\u4eec YouQu \u7684\u5728\u7ebf\u6587\u6863\u662f\u90e8\u7f72\u5728\u516c\u53f8\u5185\u7f51\u7684\uff0c\u73b0\u5728\u5f00\u6e90\u5230 github \u4e86\uff0c\u5916\u90e8\u5f00\u53d1\u8005\u80af\u5b9a\u8bbf\u95ee\u4e0d\u5230\u5185\u7f51\u7684\u6587\u6863\uff0c\u56e0\u6b64\u9700\u8981\u5c06\u6587\u6863\u90e8\u7f72\u5230\u516c\u7f51\u3010\u516c\u7f51\u6587\u6863\u3011\uff1b \u516c\u7f51\u6587\u6863\u4f7f\u7528\u7684\u662f github pages\uff08\u767d\u5ad6\u602a\u4e00\u987f\u72c2\u559c~~\uff09\uff0c\u4f46\u53ef\u80fd\u4f1a\u51fa\u73b0\u6587\u6863\u901f\u5ea6\u6162\u7684\u95ee\u9898\uff08\u4ee3\u7406\u4e0b\u5c31\u597d\u4e86\uff09\uff0c\u4e0d\u8fc7\u6ca1\u5173\u7cfb\uff0c\u54b1\u4eec\u3010\u5185\u7f51\u6587\u6863\u3011\u4ecd\u7136\u4fdd\u7559\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u3002 5\u3001\u5176\u4ed6\u4e00\u4e9b\u5c0f\u5c0f\u529f\u80fd\u66f4\u65b0\uff1a \uff081\uff09\u65b0\u589e\u5173\u95ed\u5206\u8fa8\u7387\u68c0\u6d4b\u7684\u53c2\u6570\u503c\uff1b youqu manage.py run --resolution no\n \u6216\u8005\u4fee\u6539 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387, \u6bd4\u5982\uff1a1920x1080\n;no: \u8868\u793a\u4e0d\u505a\u5206\u8fa8\u7387\u6821\u9a8c\nRESOLUTION = 1920x1080\n resolution \u8fd9\u4e2a\u53c2\u6570\u4e00\u76f4\u90fd\u6709\u7684\uff0c\u53ea\u4e0d\u8fc7\u4e4b\u524d\u662f\u7528\u4e8e\u6307\u5b9a\u5206\u8fa8\u7387\u5927\u5c0f\uff0c\u6bd4\u5982 --resolution 1920x1080\uff0c\u4f46\u6709\u4e9b\u63a5\u53e3\u7684\u9879\u76ee\u4e0d\u9700\u8981\u8fd9\u4e2a\u68c0\u67e5\uff0c\u53ef\u4ee5\u7ed9\u5b83\u4e2a no \u5c31\u597d\u4e86\uff0c\u5f53\u7136 CICD \u4e0a\u5173\u95ed\uff0c\u9700\u8981\u6d41\u6c34\u7ebf\u4e0a\u628a\u8fd9\u4e2a\u53c2\u6570\u52a0\u4e0a\uff1b \uff082\uff09\u65b0\u589e\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u7684\u547d\u4ee4\u884c\u53c2\u6570 \u4e4b\u524d\u8fd9\u4e2a\u914d\u7f6e\u9879\u53ea\u80fd\u5728 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c 1 \u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff0cRERUN >= RECORD_FAILED_CASE\u3002\n;1.\u5173\u95ed\u5f55\u5c4f\uff1aRECORD_FAILED_CASE > RERUN\n;2.\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1aRECORD_FAILED_CASE = 0\nRECORD_FAILED_CASE = 1\n \u73b0\u5728\u5c06\u5f00\u53d1\u5230\u547d\u4ee4\u884c\u53c2\u6570\u3002 youqu manage.py run --record_failed_case 2\n fix \u4fee\u590d remote \u6267\u884c\u65f6\uff0c\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u65e0\u6cd5\u751f\u6210\u6d4b\u8bd5\u62a5\u544a\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1302023710","title":"1.3.0\uff082023/7/10\uff09","text":"fix \u8fdb\u4e00\u6b65\u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b\u53c2\u8003\uff1a\u914d\u7f6ePython\u6e90\u7684\u51e0\u79cd\u65b9\u6cd5 \u4fee\u590d wayland_autotool \u53d7\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86wayland\u4e0b\u5076\u73b0\u627e\u4e0d\u5230 .Xauthority \u6587\u4ef6\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1292023626","title":"1.2.9\uff082023/6/26\uff09","text":"fix \u4f18\u5316\u8fdc\u7a0b\u6267\u884c remote \u7684\u53c2\u6570\u76f4\u63a5\u4f20\u7ed9\u8fdc\u7a0b\u673a\u5668\u7684 run \u547d\u4ee4\uff0c\u4e0d\u7528\u518d\u5355\u72ec\u5904\u7406\u8fdc\u7a0b\u6267\u884c\u7684\u53c2\u6570\u903b\u8f91\uff0c\u540e\u7eed\u4e13\u6ce8\u4e8e\u672c\u5730\u6267\u884c\u529f\u80fd\u5f00\u53d1\uff0c\u8fdc\u7a0b\u6267\u884c\u81ea\u52a8\u9002\u7528\uff1b env.sh \u79fb\u9664 pyyaml \u5b89\u88c5\uff0c\u7531\u5b50\u9879\u76ee\u5728 requirement.txt \u91cc\u9762\u5b9a\u4e49\uff0c\u6846\u67b6\u81ea\u52a8\u52a0\u8f7d\uff1b \u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b "},{"location":"RELEASE/#128202369","title":"1.2.8\uff082023/6/9\uff09","text":"fix \u4fee\u590d\u4e86 pypi \u5b89\u88c5 numpy \u5b58\u5728\u7cfb\u7edf\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#127202368","title":"1.2.7\uff082023/6/8\uff09","text":"fix env.sh \u4e2d\u5b89\u88c5 Python \u5305\u672a\u6307\u5b9a\u7248\u672c\u65f6\uff0c\u65e5\u5fd7\u8f93\u51fa\u5b89\u88c5\u7684\u7248\u672c\uff1b pdocr-rpc 2.0.1\nallure-custom 1.2.1\nfunnylog 1.1.3\n \u4fee\u590d -f \u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u62a5\u9519\u7684\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#126202367","title":"1.2.6\uff082023/6/7\uff09","text":"fix \u4fee\u590d wayland \u4e0a\u8c03\u7528\u9f20\u6807\u4e2d\u952e\u3001\u53f3\u952e\u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b \u4fee\u590d pubilic/dde_desktop_public_widget \u91cc\u9762\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u5b9a\u4f4d\u684c\u9762\u6587\u4ef6\u7684\u65b9\u6cd5\uff0c\u5750\u6807\u6ca1\u6709\u62c6\u5305\u7684\u95ee\u9898\uff1b \u4f18\u5316\u4e86\u7b49\u5f85\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b pycreeze \u7248\u672c\u5347\u7ea7\u5230 0.1.29\uff0c\u5bfc\u81f4\u4e0e pyautogui 0.9.53 \u4e0d\u517c\u5bb9\uff0cenv.sh \u91cc\u9762\u589e\u52a0\u6307\u5b9a pycreeze \u7248\u672c\u4e3a 0.1.28\uff1b "},{"location":"RELEASE/#1252023516","title":"1.2.5\uff082023/5/16\uff09","text":"new --app \u53c2\u6570\u540e\u9762\u65b0\u589e\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u76ee\u524d\u652f\u6301\u4e09\u79cd\u53c2\u6570\u4f20\u5165\u65b9\u5f0f\uff1a ~$: youqu run -a deepin-music\n~$: youqu run -a autotest_deepin_music\n~$: youqu run -a apps/autotest_deepin_music\n \u200b \u540e\u4e24\u79cd\u5165\u53c2\u65b9\u5f0f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\u3002 remote \u8fdc\u7a0b\u6267\u884c\u65b0\u589e\u4ece\u547d\u4ee4\u884c\u4f20\u5165\u6d4b\u8bd5\u673a\u4fe1\u606f\uff0c\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679c password \u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6 setting/remote.ini \u4e2d CLIENT_PASSWORD \u7684\u503c,\u6bd4\u5982\uff1auos@10.8.13.33:1 \u6216 uos@10.8.13.33 \uff1b python3 manage.py remote -c uos@10.8.13.33/uos@10.8.13.34\npython3 manage.py remote -c uos@10.8.13.33:1/uos@10.8.13.34:2\n fix \u65e5\u5fd7\u6a21\u5757\u4fee\u6539\u4e3a\u51fd\u6570\u6267\u884c\u4e4b\u524d\u6253\u5370\u65e5\u5fd7\uff1b \u65e5\u5fd7\u6a21\u5757\u589e\u52a0\u767d\u540d\u5355\uff0c\u901a\u8fc7\u7c7b\u540d\u5f00\u5934\uff0c\u7ed3\u675f\uff0c\u5305\u542b\u7b49\u5173\u952e\u5b57\u63a7\u5236\u9700\u8981\u6253\u5370\u7684\u51fd\u6570\u65e5\u5fd7\uff1b \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5982\u679c\u4f20\u5165\u4e86 app_name \u53ea\u4f1a\u5c06 apps \u76ee\u5f55\u4e0b app_name \u7684\u76ee\u5f55\u53d1\u9001\u5230\u6d4b\u8bd5\u673a\uff1b env.sh \u79fb\u9664 python3-dev\uff1b \u4fee\u590d Wayland \u4e0b env.sh \u73af\u5883\u5b89\u88c5\u5931\u8d25\u7684\u95ee\u9898\uff0c\u4f18\u5316\u4e86 deb \u4f9d\u8d56\u5b89\u88c5\u7684\u903b\u8f91\uff1b \u5c06 env.sh \u5237\u65b0\u6e90\u7684\u65e5\u5fd7\u5728\u7ec8\u7aef\u663e\u793a\uff0c\u89e3\u51b3\u5728 CI \u73af\u5883\u4e0b\uff0c\u957f\u65f6\u95f4\u4e0d\u8f93\u51fa\u65e5\u5fd7\u8fde\u63a5\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d1060 \u534e\u4e3a\u673a\u578b\u5b89\u88c5\u952e\u9f20\u5de5\u5177\u65f6\u4f9d\u8d56\u4e0d\u517c\u5bb9\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1242023227","title":"1.2.4\uff082023/2/27\uff09","text":"fix \u4fee\u6539 CURRENT \u6587\u4ef6\uff1b "},{"location":"RELEASE/#1232023227","title":"1.2.3\uff082023/2/27\uff09","text":"new pylint.sh \u652f\u6301\u901a\u8fc7\u4f4d\u7f6e\u53c2\u6570\u4f20\u5165\u6587\u4ef6\u8def\u5f84\uff1abash pylint.sh apps/autotest_deepin_music,\u597d\u5904\u662f\u53c2\u6570\u8def\u5f84\u53ef\u4ee5\u5728\u7ec8\u7aef\u8865\u5168\uff1b \u65b0\u589e\u7cfb\u7edf\u547d\u4ee4 youqu-pylint \uff0c\u7528\u4e8e\u9759\u6001\u4ee3\u7801\u626b\u63cf\uff0c\u4f7f\u7528\u65b9\u6cd5: youqu-pylint apps/autotest_deepin_music\uff1b \u7531\u4e8e\u7cfb\u7edf\u4e00\u4e9b dbus \u63a5\u53e3\u6539\u53d8\uff0c\u516c\u5171\u5e93\u4e2d\u7684 dbus \u65b9\u6cd5\u5c06\u4e0d\u518d\u7ef4\u62a4\uff0c\u7531\u5b50\u9879\u76ee\u5728 other_widget.py \u91cc\u9762\u8fdb\u884c\u7ef4\u62a4\uff1b fix \u4fee\u590d ssh \u73af\u5883\u4e0b\u8fd0\u884c\u63d0\u793a \u201c\u65e0\u6cd5\u8fde\u63a5\u201d \u7684\u95ee\u9898\uff1b \u4fee\u590d\u8fd0\u884c\u65f6\u7a0b\u5e8f\u9000\u51fa\uff0c\u4e0d\u8f93\u51fa\u5f02\u5e38\u65e5\u5fd7\u7684\u95ee\u9898\uff1b \u4fee\u590dyouqu remote xxx \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5728\u670d\u52a1\u7aef Ctrl + C \u65e0\u6cd5\u505c\u6b62\u7a0b\u5e8f\u8fd0\u884c\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#122202328","title":"1.2.2\uff082023/2/8\uff09","text":"new \u65b0\u589e\u6c14\u6ce1\u7c7b\u56fe\u50cf\u8bc6\u522b\u65b9\u6848\uff1bimage_utils.py::ImageUtil::get_during\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u533a\u57df\u8bc6\u522b\uff0c\u4f20\u5165 [x, y, w, h]\uff0cx: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u76ee\u6807\u56fe\u7247\uff0c\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\uff1b env.sh \u79fb\u9664 pypinyin; \u4f18\u5316\u6267\u884c env.sh \u65f6\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b manage.py \u79fb\u9664\u4e86\u53c2\u6570 session_timeout \uff0c\u6846\u67b6\u6839\u636e\u5168\u5c40\u7684 timeout \u4ee5\u53ca\u7528\u4f8b\u81ea\u5b9a\u4e49\u7684 timeout \u81ea\u52a8\u8ba1\u7b97\u51fa sessiontimeout \u7684\u503c\uff1b \u65b0\u589e ocr \u670d\u52a1\u5668\u94fe\u63a5\u91cd\u8bd5\uff0c\u9ed8\u8ba4\u91cd\u8bd51\u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u53c2\u6570\uff1b fix \u4fee\u590d\u4e86\u4e00\u4e9b pylint \u626b\u63cf\u7684\u4ee3\u7801\u98ce\u683c\u95ee\u9898\uff1b \u91cd\u65b0\u8bbe\u8ba1\u4e86\u6d4b\u8bd5\u62a5\u544a\u4e3b\u9898\uff1b "},{"location":"RELEASE/#121202316","title":"1.2.1\uff082023/1/6\uff09","text":"new \u652f\u6301\u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6267\u884c\u7528\u4f8b\uff1b\u53ef\u5c06python3 manage.py \u66ff\u6362\u4e3a youqu \uff1a youqu run -a deepin-music -k 001\n RPC \u670d\u52a1 IP \u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u6307\u5b9a\u4e0d\u540c\u7684\u7aef\u53e3\uff1b \u5728\u7ebf\u6587\u6863\u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u539f\u6765\u7684\u5730\u5740 10.8.10.215 \u5c06\u4e0d\u5728\u4f7f\u7528\uff1b fix \u4fee\u590d --count \u53c2\u6570\u53ef\u80fd\u51fa\u73b0\u4e0e\u5176\u4ed6\u6846\u67b6\u7684\u5de5\u7a0b\u4f9d\u8d56\u5b58\u5728\u51b2\u7a81\uff0c\u62a5\u9519\u91cd\u590d\u6ce8\u518c\u7684\u95ee\u9898\uff1b \u4fee\u590d CI \u73af\u5883\u4e0b\u591a\u4e2a\u5de5\u7a0b\u5b58\u5728 Python \u73af\u5883\u53d8\u91cf\u6307\u5411\u9519\u8bef\uff0c\u5bfc\u5305\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u5355\u72ec\u8fd0\u884c\u65b9\u6cd5\u65f6\u65e0\u65e5\u5fd7\u8f93\u51fa\u7684 Bug\uff1b "},{"location":"RELEASE/#12020221230","title":"1.2.0\uff082022/12/30\uff09","text":"1.1.4 \u7248\u672c\u9002\u914d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e14\u65b0\u589e\u4e86\u8f83\u591a\u65b0\u7279\u6027\uff0c\u6211\u4eec\u8ba1\u5212\u4f7f\u7528 1.1.4 \u7248\u672c\u8fd0\u884c\u4e00\u6bb5\u65f6\u95f4\uff0c1.2.0 \u7248\u672c\u5c06\u4fee\u590d\u671f\u95f4\u51fa\u73b0\u7684 Bug\uff0c\u7136\u540e\u4f5c\u4e3a\u7a33\u5b9a\u7248\u672c\u53d1\u5e03\u3002 new \u4fee\u6539\u5de5\u7a0b\u540d\u79f0\u4e3a youqu\uff1b \u5c06 sphinx \u6587\u6863\u5de5\u7a0b\u8fc1\u79fb\u5230\u5355\u72ec\u7684\u4ed3\u5e93\uff1b fix \u4fee\u590d startapp \u521b\u5efa\u5de5\u7a0b\u65f6\u5b58\u5728\u5de5\u7a0b\u540d\u79f0\u65f6\u65e0\u6cd5\u7ee7\u7eed\u521b\u5efa\uff1b \u4fee\u590d\u4e86 OCR \u670d\u52a1\u5728\u5e76\u53d1\u65f6\u53ef\u80fd\u51fa\u73b0\u65e0\u6cd5\u8fd4\u56de\u7ed3\u679c\u7684\u95ee\u9898\uff0c\u63d0\u5347 OCR \u670d\u52a1\u9ad8\u5e76\u53d1\u7a33\u5b9a\u6027\uff1b \u4fee\u590d PMS \u540c\u6b65\u6807\u7b7e\u5230 CSV \u6587\u4ef6\u4e0d\u652f\u6301\u7528\u4f8b\u5e93\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11420221214","title":"1.1.4\uff082022/12/14\uff09","text":"new \u65b0\u589e startapp \u5b50\u547d\u4ee4\u521b\u5efa\u5b50\u9879\u76ee\u5de5\u7a0b\u6a21\u677f: python3 manage.py startapp autotest_deepin_xxx \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u91cd\u590d\u6267\u884c\u6b21\u6570\uff1b \u53bb\u6389\u6279\u91cf\u6267\u884c\u524d\u6536\u96c6\u7528\u4f8b\u7684\u6b65\u9aa4\uff1b \u589e\u52a0\u5f00\u59cb\u6267\u884c\u65f6\u6253\u5370\u4e00\u4e9b\u6267\u884c\u53c2\u6570\uff0c\u5982\uff1a \u7528\u4f8b\u6536\u96c6\u6570\u91cf: 99\n\u5931\u8d25\u91cd\u8dd1\u6b21\u6570: 1\n\u6700\u5927\u5931\u8d25\u6b21\u6570: 49\n\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4: 200.0s (03\u520620\u79d2)\n\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4: 11880s (3\u5c0f\u65f618\u52060\u79d2)\n \u5b9a\u5236\u4fee\u6539allure\u62a5\u544alogo\u3001title\u3001\u9ed8\u8ba4\u8bed\u8a00\uff1b manage.py \u6267\u884c\u5f00\u59cb\u65f6\u6253\u5370 logo \u548c\u5f53\u524d\u7248\u672c\uff1a \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u255a\u2588\u2588\u2557 \u2588\u2588\u2554\u255d \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2584\u2584 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2580\u2580\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u2584\u2588 \u2584\u2588 \u2588 \u2588 \u2588 \u2584 \u2588 \u2584 \u2580\u2580\u2588 \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\uff1b \u88c5\u9970\u5668\u65b9\u6cd5\u6307\u5b9a\u6b21\u6570\uff1b @pytest.mark.count(2)\ndef test_music_001():\npass\n \u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u6b21\u6570\uff1b python3 manage.py run -a deepin-music -k 001 --count 2\n \u200b image_utils \u589e\u52a0\u51fd\u6570 save_temporary_picture\uff0c\u652f\u6301\u6307\u5b9a\u5c4f\u5e55\u533a\u57df\u622a\u56fe\u5e76\u8fd4\u56de\u56fe\u7247\u5b58\u653e\u7684\u672c\u5730\u8def\u5f84\uff0c\u540e\u7eed\u4f7f\u7528 assert_image_exist \u8fdb\u884c\u65ad\u8a00 Python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(x, y, width, height) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) button_center \u65b0\u589e btn_size \u83b7\u53d6\u63a7\u4ef6\u5de6\u4e0a\u89d2\u5750\u6807\u53ca\u957f\u5bbd\uff0c\u7528\u4e8e\u52a8\u6001\u7684\u622a\u53d6\u5143\u7d20\u7684\u56fe\u7247\uff0c\u53ef\u7528\u4e8e\u5b9a\u4f4d\u65ad\u8a00 python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u6240\u6709\u97f3\u4e50\u6309\u94ae\")) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) allure \u62a5\u544a\u4e2d\u5b9a\u4f4d\u95ee\u9898\u9664\u4e86\u65e5\u5fd7\u3001\u622a\u56fe\u3001\u5f55\u5c4f\u5916\uff0c\u8c03\u7528\u7684\u51fd\u6570\u589e\u52a0\u4e86 step \u6b65\u9aa4\u5c55\u793a\uff1b env.sh \u65b0\u589e\u5b89\u88c5\u5b50\u9879\u76ee Python \u4e09\u65b9\u4f9d\u8d56\uff0c\u5728\u5b50\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u5199 requirement.txt \u6587\u4ef6\uff0cenv.sh \u4f1a\u81ea\u52a8\u52a0\u8f7d\uff1b ocr \u8bc6\u522b\u65b0\u589e\u652f\u6301\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\u8fdb\u884c\u6587\u5b57\u8bc6\u522b\uff0c\u51cf\u5c11\u56e0\u5168\u5c4f\u8bc6\u522b\u65f6\uff0c\u5176\u4ed6\u6587\u5b57\u7684\u5e72\u6270 Python # \u65ad\u8a00\u97f3\u4e50\u7684\u5220\u9664\u5f39\u7a97\u4e2d\uff0c\u5305\u542b\u4e86\u201c\u786e\u8ba4\u201d\u7684\u6587\u5b57 self.assert_ocr_exist(\"\u786e\u8ba4\", picture_abspath=DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u5220\u9664\u5f39\u7a97\"))) \u65ad\u8a00\u51fd\u6570\u7684\u8c03\u7528\u4e5f\u4f1a\u81ea\u52a8\u6253\u5370\u65e5\u5fd7; env.sh \u65b0\u589e\u88c1\u526a\u4f9d\u8d56\u7684\u65b9\u6848\uff1b fix \u4fee\u590d Jenkins \u73af\u5883\u4e0b\uff0c apps \u76ee\u5f55\u4e0b\u5b50\u9879\u76ee\u5b58\u5728 auotest_deepin_xxx@tmp \u76ee\u5f55\uff0c\u5728\u4f20\u5165 app_name \u540e\u65e0\u6cd5\u6267\u884c\u7528\u4f8b\u7684\u95ee\u9898\uff1b \u4fee\u590d\u81ea\u52a8\u751f\u6210 case_list.csv \u6587\u4ef6\u65f6\uff0c\u7528\u4f8b\u987a\u5e8f\u88ab\u8c03\u6574\u7684\u95ee\u9898\uff1b env.sh \u73af\u5883\u5b89\u88c5\u79fb\u9664 git \u548c curl\uff1b \u4fee\u590d\u7528\u4f8b\u5728 setup \u9636\u6bb5\u62a5\u9519\u540e\uff0c\u672a\u5199\u5165 ci_result.json \u7684\u95ee\u9898\uff1b \u79fb\u9664 uos_ci.py\uff1b "},{"location":"RELEASE/#11320221028","title":"1.1.3\uff082022/10/28\uff09","text":"new \u65b0\u589e\u56fe\u50cf\u65ad\u8a00\u6210\u529f\u8f93\u51fa\u5339\u914d\u5ea6\uff1b \u65b0\u589e\u73af\u5883\u5b89\u88c5 yaml \u4f9d\u8d56\uff1b \u65b0\u589e\u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6570\u636e\u56de\u586b\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b \u65b0\u589e\u6d4b\u8bd5\u7ed3\u679c\u8868\u60c5\u663e\u793a\uff0c\u5e76\u4f18\u5316\u4e86\u65e5\u5fd7\u7684\u6392\u7248\uff1b \u65b0\u589e --top {number} \u7528\u4e8e\u8bb0\u5f55\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0c\u65e5\u5fd7\u751f\u6210\u5230 report/logs/top.log\uff1b fix \u4fee\u590d\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4f46\u7ec8\u7aef\u6ca1\u6709\u9519\u8bef\u65e5\u5fd7\u8f93\u51fa\u7684\u95ee\u9898\uff1b \u4fee\u6539\u5931\u8d25\u7528\u4f8b\u56de\u6eaf\u65e5\u5fd7\u4e3a\u8be6\u7ec6\u7ea7\u522b\uff1b \u4fee\u590d\u4e86\u6267\u884c\u8fdb\u5ea6\u672a\u8ba1\u7b97\u8df3\u8fc7\u7528\u4f8b\u7684\u95ee\u9898\uff0c\u5e76\u4f18\u5316\u4e86\u8fdb\u5ea6\u83b7\u53d6\u7684\u7b97\u6cd5\uff1b \u4fee\u590d env.sh \u5728 V23 \u73af\u5883\u4e0b\u5b89\u88c5\u65e0\u6cd5\u8bfb\u53d6\u5bc6\u7801\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 pms \u6d4b\u8bd5\u5957\u6267\u884c\u6216\u6d4b\u8bd5\u5355\u6267\u884c\u65f6\uff0c\u7528\u4f8bID\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b env.sh \u91cc\u9762 hub.deepin.com \u66f4\u6362\u6210 it.uniontech.com\uff1b uos_ci.py \u6d4b\u8bd5\u7ed3\u679c\u7edf\u8ba1\u65f6\uff0c\u603b\u6570\u5254\u9664 skip \u7684\u6570\u91cf "},{"location":"RELEASE/#11220220921","title":"1.1.2\uff082022/09/21\uff09","text":"new \u5728\u6ca1\u6709\u5b89\u88c5 dogtail \u7684\u60c5\u51b5\u4e0b\uff0c\u4e5f\u80fd\u4f7f\u7528 sniff \u5de5\u5177\uff1b fix \u4fee\u590d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e2d\u6ca1\u6709\u5b89\u88c5 AT \u73af\u5883\u6267\u884c uos_ci.py \u62a5\u9519\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11120220919","title":"1.1.1\uff082022/09/19\uff09","text":"new \u65b0\u589e\u6267\u884c\u8fdb\u5ea6\u663e\u793a\uff0c\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u65f6\u65e5\u5fd7\u8f93\u51fa\u5f53\u524d\u8fdb\u5ea6\uff1a[\u5f53\u524d\u6307\u5b9a\u7b2c\u51e0\u6761/\u7528\u4f8b\u603b\u6570]\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u7528\u4f8b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\u6240\u6709\u5931\u8d25\u7528\u4f8b\u7684\u5217\u8868\uff1b \u5173\u95ed\u7ec8\u7aef\u8f93\u51fa\u6355\u83b7\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u65e5\u5fd7\u5feb\u7167\uff1b \u4f18\u5316\u7ec8\u7aef\u8f93\u51fa\u5931\u8d25\u4fe1\u606f\u5197\u957f\u4e3a\u7b80\u8981\u4fe1\u606f\u8f93\u51fa\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u663e\u793a 10 \u4e2a\u6267\u884c\u6700\u6162\u7684\u7528\u4f8b\u5217\u8868\uff0c\u5e76\u8be6\u7ec6\u5217\u51fa\u5404\u4e2a\u9636\u6bb5\u7684\u8017\u65f6\uff1b \u5931\u8d25\u91cd\u8dd1\u7528\u4f8b\u91cd\u8dd1\u4e4b\u524d\u5ef6\u8fdf 1 \u79d2\uff1b \u65b0\u589e\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4ecd\u7136\u5f3a\u5236\u6267\u884c\uff1b \u7528\u4f8b\u6536\u96c6\u65f6\u4ec5\u5728 apps \u76ee\u5f55\u4e0b\u8fdb\u884c\uff0c\u5ffd\u7565 src,setting,public \u76ee\u5f55\uff1b \u65b0\u589e allure \u62a5\u544a\u5907\u4efd\u529f\u80fd\uff0c\u9ed8\u8ba4\u5907\u4efd\u81f3 allure_back \u76ee\u5f55\u4e0b\uff1b manage.py\u65b0\u589e\u53c2\u6570 --lastfailed \u7528\u4e8e\u53ea\u8dd1\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\u7684\u529f\u80fd\uff1b fix \u4fee\u590d\u4e86\u5728\u6ca1\u6709\u6307\u5b9a\u5e94\u7528\u540d\u79f0\u6267\u884c\u65f6\uff0cxml \u62a5\u544a\u751f\u6210\u8def\u5f84\u5f02\u5e38\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 uos_ci.py \u4f20\u5165 timeout \u548c session_timeout \u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11020220916","title":"1.1.0\uff082022/09/16\uff09","text":"new \u65b0\u589ePMS\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u652f\u6301\u591a\u79cd\u6570\u636e\u56de\u586b\u6a21\u5f0f\uff1b \u4f18\u5316\u4e86\u901a\u8fc7\u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u65f6PMS \u722c\u866b\u7684\u6027\u80fd\uff1b \u65b0\u589e .gitmodules \u6587\u4ef6\uff0c\u7528\u4e8e\u6807\u8bb0\u6240\u6709\u5b50\u9879\u76ee\uff0c\u65b9\u4fbf\u7edf\u4e00\u62c9\u53d6\u4ee3\u7801\uff1b env.sh \u9002\u914d\u793e\u533a\u7248\u4e0a\u5b89\u88c5\u81ea\u52a8\u5316\u73af\u5883\uff1b \u589e\u52a0\u6267\u884c\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u9519\u8bef\u7684\u529f\u80fd\uff1b README.md \u589e\u52a0 Wayland \u4e0b\u4f7f\u7528\u3001\u6d4b\u8bd5\u62a5\u544a\u67e5\u770b\u3001\u5e38\u89c1\u95ee\u9898\u7b49\u7684\u6587\u6863\u8bf4\u660e\uff1b \u589e\u52a0\u4e86\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u5bf9 setup\u3001call\u3001teardown \u8fdb\u884c\u65e5\u5fd7\u5206\u6bb5\uff1b fix \u4fee\u590d\u4e86 \u786e\u8ba4\u4fee\u590d \u5217\u6ca1\u5199\u8868\u5934\uff0c\u4f46\u5199\u4e86 fixed-xxx \u6807\u7b7e\uff0c\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u540c\u4e00\u5e94\u7528\u5185\u591a\u4e2a csv \u6587\u4ef6\u4e2d \u786e\u8ba4\u4fee\u590d \u5217\u6709\u7684\u5199\u4e86\uff0c\u6709\u7684\u6ca1\u5199\uff0c\u53ef\u80fd\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 INFO \u65e5\u5fd7\uff0c\u663e\u793a\u4e3a DEBUG \u7684\u95ee\u9898\uff1b\u4fee\u590d\u4e86\u90e8\u5206\u673a\u5668\u4e0a INFO \u65e5\u5fd7\u5185\u5bb9\u663e\u793a\u4e3a\u7ea2\u8272\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\u770b\u4e0d\u5230\u8be6\u7ec6\u4fe1\u606f\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10220220822","title":"1.0.2\uff082022/08/22\uff09","text":"new \u79fb\u9664 loguru\uff0c\u66ff\u6362\u4e3a logging\uff0c\u63a5\u53e3\u4fdd\u6301\u4e0d\u53d8\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u53d7\u5f71\u54cd\uff1b \u9ed8\u8ba4\u5f00\u542f coredump\uff1b fix \u4fee\u590d\u4e86\u4e09\u65b9\u5e93 loguru \u5076\u73b0\u5f02\u5e38\uff0c\u5bfc\u81f4\u7a0b\u5e8f\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7b2c\u4e00\u6b21\u5931\u8d25\u4e0d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10120220812","title":"1.0.1\uff082022/08/12\uff09","text":"new \u65b0\u589e RELEASE.md \u6587\u4ef6\uff0c\u7528\u4e8e\u8bb0\u5f55\u5386\u53f2\u53d1\u5e03\u7248\u672c\u7684\u66f4\u65b0\u5185\u5bb9\uff1b \u517c\u5bb9 Wayland \u6a21\u5f0f\u4e0b\u6267\u884c\u7528\u4f8b\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u7528\u7ba1\u5f53\u524d\u6d4b\u8bd5\u673a\u6267\u884c\u73af\u5883\uff0c\u6846\u67b6\u4f1a\u81ea\u52a8\u6839\u636e\u5f53\u524d\u73af\u5883\u8d70\u4e0d\u540c\u7684\u4ee3\u7801\u903b\u8f91\uff1b \u7531\u4e8e\u9700\u8981\u4fee\u6539 dogtail \u6e90\u4ee3\u7801\uff0c\u56e0\u6b64\u5c06\u4fee\u6539\u540e\u7684\u6e90\u7801\u653e\u5165\u5230\u6838\u5fc3\u5e93\u91cc\u9762 src/depends/dogtail \u540e\u7eed\u7248\u672c\u5c06\u4e0d\u9700\u8981\u5728\u7cfb\u7edf\u4e2d\u5b89\u88c5dogtail\uff1b \u5982\u679c\u5e94\u7528\u5e93\u540c\u6837\u4f7f\u7528\u4e86\u7cfb\u7edf\u5b89\u88c5\u7684 dogtail \u53ef\u80fd\u4f1a\u62a5\u9519\uff0c\u89e3\u51b3\u65b9\u6848\u662f\u5c06\u4ee3\u7801\u4e2d\u7684 import dogtail \u4fee\u6539\u4e3a from src.depends import dogtail ; fix \u91cd\u8dd1\u5931\u8d25\u4e4b\u540e\u624d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff0c\u4fee\u6539\u4e3a\u5931\u8d25\u4e4b\u540e\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":"# Attribution \uff1achengdu Test Team\n# Date \uff1a2021/08/20\n \u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d \u4ed3\u5e93\u5730\u5740\uff1ahttps://gitlabcd.uniontech.com/autotest/cd-desktop-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u65b9\u6848\u6982\u8ff0","text":"\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u667a\u80fd\u8bc6\u522b\u5e94\u7528\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u7528\u4e8e\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u64cd\u4f5c\u8fc7\u7a0b\u4e2d\u7684\u5143\u7d20\u5b9a\u4f4d\u4ee5\u53ca\u5224\u65ad\u7ed3\u679c\u65f6\u7684\u65ad\u8a00\u5904\u7406\uff1b\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\uff0c\u6d4b\u8bd5\u673a\u4e0a\u7684\u753b\u9762\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u5230\u670d\u52a1\u5668\u4e0a\uff0c\u670d\u52a1\u5668\u5bf9\u89c6\u9891\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\u540e\uff0c\u670d\u52a1\u5668\u667a\u80fd\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\u6210\u529f\uff0c\u7136\u540e\u5bf9\u6d4b\u8bd5\u673a\u4e0b\u53d1\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\uff0c\u6d4b\u8bd5\u673a\u63a5\u53d7\u5e76\u6267\u884c\u4e0b\u4e00\u6b65\u64cd\u4f5c\u3002 \u670d\u52a1\u5668\u4e0e\u6d4b\u8bd5\u673a\u4e4b\u95f4\u7684\u94fe\u63a5\uff1a \u670d\u52a1\u5668\u901a\u8fc7 USB \u4e32\u53e3\u8bbe\u5907\uff08USB-HID \u534f\u8bae\uff09\u6a21\u62df\u9f20\u6807\u952e\u76d8\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u64cd\u4f5c\u3002 \u901a\u8fc7\u89c6\u9891\u91c7\u96c6\u8bbe\u5907\u6355\u83b7\u6d4b\u8bd5\u673a\u7684\u5b9e\u65f6\u753b\u9762\u4f20\u8f93\u7ed9\u670d\u52a1\u5668\u3002 \u670d\u52a1\u5668\u5bf9\u91c7\u96c6\u7684\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\uff0c\u8bc6\u522b\u5176\u4e2d\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5e76\u8fd4\u56de\u5143\u7d20\u63a7\u4ef6\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\uff0c\u670d\u52a1\u5668\u901a\u8fc7\u667a\u80fd\u5316\u5206\u6790\uff0c\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e00\u81f4\u5c06\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\u901a\u8fc7\u4e32\u53e3\u6a21\u62df\u952e\u9f20\u4fe1\u53f7\u53d1\u9001\u7ed9\u6d4b\u8bd5\u673a\uff1b\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e0d\u4e00\u81f4\u5c06\u4f1a\u8fdb\u5165\u4e2d\u65ad\u5904\u7406\u53ca\u5f02\u5e38\u7ed3\u679c\u8f93\u51fa\uff0c\u7ee7\u7eed\u6267\u884c\u540e\u7eed\u573a\u666f\uff0c\u76f4\u81f3\u6240\u6709\u7528\u4f8b\u6d4b\u8bd5\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u6df1\u5ea6\u5b66\u4e60\u73af\u5883\u642d\u5efa","text":"\u6a21\u578b\u8bad\u7ec3\u4e3b\u8981\u5bf9 GPU \u6709\u8981\u6c42\uff0c\u8bad\u7ec3\u6a21\u578b\u7684\u673a\u5668\u663e\u5b58\u4e0d\u4f4e\u4e8e 6G\uff0c\u5176\u4ed6\u914d\u7f6e\u65e0\u7279\u6b8a\u8981\u6c42\u3002 \u63a8\u8350\u6027\u4ef7\u6bd4\u8f83\u9ad8\u914d\u7f6e \u64cd\u4f5c\u7cfb\u7edf: UnionTech OS Desktop 20 Professional Linux version 4.19.0-desktop-amd64 (deepin@deepin-PC) (Uos 8.3.0.3-3+rebuild) \u5904\u7406\u5668: Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz (\u516b\u6838 / \u5341\u516d\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460M-HDV(RD)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))/8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: TU116 [GeForce GTX 1660]\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u865a\u62df\u73af\u5883\u5b89\u88c5","text":"cd ~\nwget -c https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh\nbash Miniconda3-latest-Linux-x86_64.sh\n \u4e00\u8def\u56de\u8f66 \u7b2c\u4e00\u6b21\u63d0\u793a\u8f93\u5165 yes/no \uff1a\u8f93\u5165 yes \u7ee7\u7eed\u4e00\u8def\u56de\u8f66 \u7b2c\u4e8c\u6b21\u63d0\u793a\uff1a\u8f93\u5165 no cd ~/miniconda3/bin\nsudo chmod 777 activate\n \u6fc0\u6d3bconda\u73af\u5883 . ./activate\n \u6dfb\u52a0\u516c\u53f8\u5185\u7f51\u6e90 conda config --add channels bioconda\nconda config --add channels conda-forge\n \u5982\u679c\u662f\u5916\u7f51\u6dfb\u52a0\u5916\u7f51\u6e90 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/\n \u5982\u679c\u8981\u5220\u9664\u6e90 conda config --remove-key channels\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"2\u3001\u5b89\u88c5\u4f9d\u8d56","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u521b\u5efa\u865a\u62df\u73af\u5883","text":"conda remove --name mmlab --all # \u79fb\u9664\u6240\u6709\u865a\u62df\u73af\u5883\n conda create -n mmlab python=3.7\n conda activate mmlab\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-pytorch","title":"\uff082\uff09\u5b89\u88c5 Pytorch","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install torch==1.7.0+cu101 torchvision==0.8.1+cu101 torchaudio==0.7.0 -f https://download.pytorch.org/whl/torch_stable.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-mmcv","title":"\uff083\uff09\u5b89\u88c5 MMCV","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install mmcv-full==1.3.3 -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.7.0/index.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"\uff084\uff09\u5b89\u88c5\u663e\u5361\u9a71\u52a8","text":"\u6839\u636e\u4f60\u7684\u663e\u5361\u4e0b\u8f7d\u5bf9\u5e94\u9a71\u52a8\uff0c\u6bd4\u5982\u6211\u7684\u663e\u5361\u4e3a GTX1660\uff0c\u9a71\u52a8\u7248\u672c\u4e3a 430\uff0c\u9a71\u52a8\u4e0b\u8f7d\u5730\u5740\uff1ahttps://www.nvidia.cn/Download/Find.aspx?lang=cn CTRL+ALT+F2 \u8fdb\u5165tty\n \u7981\u7528 nouveau \u9a71\u52a8 sudo vim /etc/modprobe.d/blacklist-nouveau.conf\n \u586b\u5165\uff1a blacklist nouveau options nouveau modeset=0\n \u5237\u65b0\u914d\u7f6e\u6587\u4ef6 sudo update-initramfs -u reboot \u91cd\u542f\u540e\u518d\u8fdb\u5165 tty \u5173\u95ed\u56fe\u50cf\u754c\u9762\uff0c\u8f93\u5165\u547d\u4ee4\u5173\u95ed\u56fe\u50cf\u754c\u9762 sudo service lightdm stop\n \u5b89\u88c5\u9a71\u52a8 sudo chmod a+x NVIDIA-Linux-x86_64-430.run\nsudo ./NVIDIA-Linux-x86_64-430.run\n reboot\u91cd\u542f\uff0cnvidia-smi\u67e5\u770b\u5b89\u88c5\u72b6\u6001\u3002\u6ce8\u610f\u770b\u4e0bcuda\u7248\u672c\uff0c10.1\uff0cdriver\u7248\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u6570\u636e\u6807\u6ce8","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u6570\u636e\u6807\u6ce8","text":"\u6807\u6ce8\u4e4b\u524d\u9700\u8981\u5148\u8f6c\u6362\u56fe\u7247\u5927\u5c0f\uff0c\u5e76\u4e14\u4ee5\u6570\u5b57\u547d\u540d\uff0c\u6bcf\u7ec4\u547d\u540d\u9012\u589e"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"\uff081\uff09\u8f6c\u6362\u5927\u5c0f\u5e76\u91cd\u547d\u540d","text":"rename_pic.py import os\nimport sys\nimport cv2\nimport time\nimport getpass\nusername = getpass.getuser()\nsource_path = f\"/home/{username}/Desktop/right_menu\" # \u56fe\u7247\u8def\u5f84\nsource_dest = os.path.join('/'.join(source_path.split(\"/\")[:-1]), 'tmp')\nif not os.path.exists(source_dest):\nos.mkdir(source_dest)\nstart_name = sys.argv[1]\nfile_name_list = list()\nfor file in os.listdir(source_path):\nif file.endswith('.png'):\nfile_name_list.append(file)\nstart_name = int(start_name)\nfor file in file_name_list:\nos.rename(os.path.join(source_path,file), os.path.join(source_path, f\"{str(start_name)}.png\"))\nstart_name += 1\ntime.sleep(1)\nfor file in os.listdir(source_path):\nimage = os.path.join(source_path, str(file))\nsrc = cv2.imread(image)\nresult = cv2.resize(src, (960, 540))\nresizeImage = os.path.join(source_dest, str(file))\nprint(resizeImage)\ncv2.imwrite(str(resizeImage), result)\ncv2.waitKey(0)\ncv2.destroyAllWindows()\ntime.sleep(1)\nos.system(f'rm -rf {source_path}/*')\nos.system(f'mv {source_dest}/* {source_path}')\nos.system(f'rm -rf {source_dest}')\nprint(\"\u4e0b\u4e00\u4e2a\u5e8f\u53f7\uff1a\", start_name)\n \u6839\u636e\u7ec8\u7aef\u8f93\u51fa\u7684\u4e0b\u4e00\u4e2a\u5e8f\u53f7\u7684\u63d0\u793a\uff0c\u6267\u884c Python \u6587\u4ef6\u7684\u65f6\u5019\u4f20\u53c2\u3002 python rename_pic.py 249\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"\uff082\uff09\u5de5\u5177\u6807\u6ce8","text":"\u4f7f\u7528\u5de5\u5177 labelImg \u6807\u6ce8 sudo pip3 install PyQt5==5.13\nsudo pip3 install labelImg\n \u7ec8\u7aef\u76f4\u63a5\u8f93\u5165 labelImg\uff0c\u56de\u8f66 \u6807\u6ce8\u6a21\u5f0f\u9009\u62e9\uff1aPascalVOC"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u667a\u80fd\u6807\u6ce8","text":"\u6253\u5f00\u5c4f\u5e55\u5f55\u5236\u8f6f\u4ef6\uff0c\u5f55\u5236\u624b\u52a8\u64cd\u4f5c\u4e00\u6b21\u6d4b\u8bd5\u7528\u4f8b\uff0c\u7136\u540e\u5c06\u5f55\u5236\u7684\u89c6\u9891\u8fdb\u884c\u5206\u5e27\uff0c\u7136\u540e\u5bf9\u6bd4\u524d\u4e24\u5e27\u56fe\u6807\u76f8\u4f3c\u5ea6\uff0c\u5254\u9664\u76f8\u4f3c\u5ea6\u8fc7\u9ad8\u7684\u56fe\u7247\uff0c\u5728\u4fdd\u8bc1\u7d20\u6750\u591a\u6837\u6027\u7684\u524d\u63d0\u4e0b\uff0c\u5254\u9664\u91cd\u590d\u591a\u4f59\u7684\u56fe\u7247\u751f\u6210\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u96c6\uff0c\u7136\u540e\u53d6\u51fa\u63a7\u4ef6\u6a21\u677f\u6570\u636e\u96c6\uff0c\u901a\u8fc7 OpenCV \u6a21\u677f\u5339\u914d\u83b7\u53d6\u63a7\u4ef6\u5728\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u56fe\u7247\u4e2d\u6240\u5728\u7684\u5de6\u4e0a\u3001\u5de6\u4e0b\u3001\u53f3\u4e0a\u3001\u53f3\u4e0b\u56db\u5904\u5750\u6807\uff0c\u4ece\u800c\u6839\u636e\u6a21\u677f\u6570\u636e\u96c6\u751f\u6210\u6807\u6ce8\u6570\u636e\u3002\u53c2\u8003\u76ee\u5f55 AnnotationMaterial"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"\uff081\uff09\u6a21\u677f\u6570\u636e\u96c6\u51c6\u5907","text":"1\u3001\u5728\u754c\u9762\u622a\u53d6\u9700\u8981\u6807\u6ce8\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u653e\u5728\u76ee\u5f55\u4e0b AnnotationMaterial/template/img 2\u3001\u7ef4\u62a4\u63a7\u4ef6\u540d\u4e0e\u5143\u7d20\u63a7\u4ef6\u7684\u952e\u5bf9\uff0c\u4e00\u4e2a\u63a7\u4ef6\u540d\u53ef\u5bf9\u5e94\u591a\u4e2a\u5143\u7d20\u63a7\u4ef6 menu:\n- menu.jpg\n- menu1.jpg\n- menu2.jpg\n- menu3.jpg\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"\uff082\uff09\u7d20\u6750\u96c6\u51c6\u5907","text":"\u5f55\u5236\u89c6\u9891\u6216\u6216\u5c4f\u5e55\u622a\u56fe\u653e\u7f6e\u76ee\u5f55 AnnotationMaterial/source"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u5f00\u59cb\u6807\u6ce8","text":"python3 AnnotationMaterial/main.py\n \u751f\u6210\u7684\u6807\u6ce8\u6570\u636e\u5b58\u653e\u5728 AnnotationMaterial/result"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#mmdetection","title":"\u56db\u3001MMDetection","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1-mmdetection","title":"1\u3001 MMDetection \u4ee3\u7801","text":"MMDetection \u662f\u4e00\u4e2a\u6709\u540d\u7684\u6df1\u5ea6\u5b66\u4e60\u76ee\u6807\u68c0\u6d4b\u5f00\u6e90\u9879\u76ee\uff0c\u4e5f\u662f openMMlab \u7684\u62db\u724c\u9879\u76ee\uff0c\u4e3a\u4ec0\u4e48\u9009\u62e9\u5b83\uff0c\u5c0f\u5b69\u513f\u6ca1\u5a18\u8bf4\u6765\u8bdd\u957f\uff0c\u611f\u5174\u8da3\u53ef\u4ee5\u81ea\u884c\u6df1\u5165\u4e86\u89e3\uff1b \u4f60\u53ef\u4ee5\u76f4\u63a5\u5728 GitHub \u4e0a\u514b\u9686\u4ee3\u7801\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u54b1\u4eec\u4ed3\u5e93\u4e0b Train \u76ee\u5f55\u4e2d\u4ee3\u7801\uff0cTrain \u4e2d\u7684\u4ee3\u7801\u4e5f\u662f\u4ece GitHub \u4e0a\u62c9\u53d6\u7684\uff0c\u4e0d\u8fc7\u6211\u4eec\u6839\u636e\u9879\u76ee\u9700\u8981\u505a\u4e86\u4e00\u4e9b\u4e8c\u6b21\u5f00\u53d1\uff0c\u63a8\u8350\u76f4\u63a5\u4f7f\u7528\u5b83\u3002 \u5982\u679c\u4f60\u60f3\u4ece GitHub \u4e0a\u62c9\uff1a git clone https://github.com/open-mmlab/mmdetection.git\n# \u4e0d\u80fd\u76f4\u63a5\u62c9\u53d6\u4e3b\u5206\u652f\uff0c\u5efa\u8bae\u4f7f\u75282.12\u7248\u672c\uff0c\u4e0d\u540c\u7684\u7248\u672c\u5bf9\u5e94\u7684mmcv\u7248\u672c\u662f\u4e0d\u540c\u7684\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-voc2coco","title":"2\u3001\u62c9\u53d6 voc2coco \u4ee3\u7801","text":"git clone https://github.com/Tony607/voc2coco.git\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-coco","title":"3\u3001\u8f6c\u6362 coco \u6570\u636e\u96c6","text":"\u5c06\u6240\u6709\u7684\u56fe\u7247\u548cxml\u6587\u4ef6\u653e\u5165train2017\uff0c\u4ece\u4e2d\u6311\u9009\u51e0\u7ec4\u653e\u5165val2017\uff08\u6d4b\u8bd5\u96c6\uff09 cd mmdetection/data/coco\npython voc2coco.py train2017 annotations/instances_train2017.json\npython voc2coco.py val2017 annotations/instances_val2017.json\n \u751f\u6210json\u6587\u4ef6"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4_1","title":"4\u3001\u4fee\u6539\u914d\u7f6e","text":"\uff081\uff09\u8bfb\u53d6\u6a21\u578b\u540d\u79f0 import json\nmodule_name = []\nwith open('./instances_train2017.json', \"r+\") as f:\njson_file = f.read()\njson_dict = json.loads(json_file)\nmodule_list = json_dict.get('categories')\nfor module_info in module_list:\nname = module_info.get('name')\nmodule_name.append(name)\nprint(module_name)\nprint(\"module_num:\", len(module_name))\n # \u6ce8\u610f\u5bf9\u6bd4instances_train2017.json\u91cc\u9762\u6a21\u578b\u540d\u79f0\u7684\u987a\u5e8f\uff0c\u4e0eCLASSES\u548ccoco_classes\u91cc\u9762\u7684\u987a\u5e8f\u4fdd\u6301\u4e00\u81f4\u3002\n \uff082\uff09\u4fee\u6539 faster_rcnn_r101_2x_coco.py mmdetection/xianjin/faster_rcnn_r101_2x_coco.py \u4fee\u653946\u884c\uff0cnum_clasess\u7684\u503c\uff0c\u65b0\u589e1\u4e2a\uff0c\u5c31 +1\uff1b \uff083\uff09\u4fee\u6539 coco.py mmdetection/mmdet/datasets/coco.py CLASSES = ()\uff0c\u5728\u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b \uff084\uff09\u4fee\u6539 class_names.py mmdetection/mmdet/core/evaluation/class_names.py coco_classes \u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#5","title":"5\u3001\u7f13\u5b58\u6e05\u7406","text":"\u5220\u9664 mmdetection/build \u76ee\u5f55 python setup.py install\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#6","title":"6\u3001\u8bad\u7ec3\u6a21\u578b","text":"\uff081\uff09\u6307\u5b9a\u81ea\u5df1\u914d\u7f6e\u7684\u8bad\u7ec3\u6a21\u578b\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py --gpus 1\n \uff082\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u6d4b\u8bd5\u96c6\u7ed3\u679c\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py xianjin/epoch_24.pth --show\n \uff083\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u51c6\u786e\u5ea6\uff1b python tools/analysis_tools/analyze_logs.py plot_curve xianjin/20210530_011907.log.json --keys acc\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#7","title":"7\u3001\u5feb\u6377\u64cd\u4f5c","text":"python3 run.py\n \u5c06\u4ee5\u4e0a 4 - 7 \u6b65\u64cd\u4f5c\u6574\u5408\u6210 run.py\uff0c\u4e00\u952e\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u4e94\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\uff1b \u670d\u52a1\u7aef\u4e00\u53f0\uff08\u76ee\u524d\u4ec5\u652f\u6301AMD\u67b6\u6784\uff09\uff1b \u91c7\u96c6\u76d2\u4e00\u4e2a \uff08ACASIS hdmi\u89c6\u9891\u91c7\u96c6\u5361\uff0chttps://item.jd.com/10024310742602.html \uff09\uff1b USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\uff1b USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff1b \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5USB\u5ef6\u957f\u7ebf\uff1b \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u63a8\u8350\u914d\u7f6e","text":"\u6267\u884c\u7528\u4f8b\u7684\u670d\u52a1\u7aef\u5bf9\u914d\u7f6e\u6ca1\u6709\u7279\u6b8a\u8981\u6c42\uff0c\u5982\u679c\u6761\u4ef6\u5141\u8bb8\u914d\u7f6e\u8d8a\u9ad8\uff0c\u8bc6\u522b\u901f\u5ea6\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n \u6d4b\u8bd5\u673a\u4e0a\u4e0d\u6267\u884c\u4efb\u4f55\u811a\u672c\uff0c\u5177\u4f53\u914d\u7f6e\u6839\u636e\u6d4b\u8bd5\u9700\u8981\u51b3\u5b9a\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#usb_mk","title":"\u516d\u3001USB_MK\u4e32\u53e3\u9a71\u52a8\u65b9\u6cd5","text":"\u4f4d\u4e8econtrol_method\u76ee\u5f55\u4e0b\u7684usb_mk.py\u6587\u4ef6 \uff081\uff09\u5217\u51fa\u53ef\u901a\u4fe1\u7684\u7aef\u53e3 python3 -m serial.tools.list_ports -v\n \uff082\uff09\u4fee\u6539\u4e32\u53e3\u7684\u6743\u9650 sudo chmod 777 /dev/ttyACM0\n \uff083\uff09\u5b9e\u4f8b\u5316USB_MK import UsbMk\nusb_mk = UsbMk(\"/dev/ttyACM0\", 9600) # \u8bbe\u5907\u9ed8\u8ba49600\u4e3a\u6ce2\u7279\u7387\uff0c\u63a7\u5236\u4f20\u8f93\u901f\u7387\n \uff084\uff09USB\u4e32\u53e3\u8bbe\u5907\u9ed8\u8ba4\u6ce2\u7279\u7387\u4e3a9600\uff08\u7ecf\u6d4b\u8bd5\u6ce2\u7279\u73879600\u51c6\u786e\u6027\u6700\u597d\uff09\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up() # \u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u6c49\u5b57\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e\n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff083\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff084\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff085\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() # \u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2\n \uff086\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff087\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff088\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e03\u3001\u65b9\u6cd5\u8c03\u7528\u5165\u53c2\u89c4\u5219","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_7","title":"1\u3001\u57fa\u7c7b","text":"class Base:\ndef __init__(self):\nself._obj = image\nself._usb = usb_mk\ndef find_element_by_ai(self, element):\nreturn self._obj.find_element(element)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_6","title":"2\u3001\u5165\u53c2\u8bf4\u660e","text":"\u56fe\u50cf\u8bc6\u522b\u65b9\u6cd5\u5165\u53e3\u4e3a Base \u7c7b\u4e0b\u7684 find_element_by_ai \u3002\u4ec5\u63a5\u53d7\u4e00\u4e2a\u53c2\u6570 element\uff0c\u7c7b\u578b\u4e3a string\u3002 \u53ef\u8bc6\u522b\u7684 string \u683c\u5f0f\uff1a \uff081\uff09\u5927\u56fe\u6807\uff08 \u56fe\u6807\u5927\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\uff0c\u4f8b\uff1a Base().find_element_by_ai(\"window\")\n \uff082\uff09\u5927\u56fe\u6807 / \u5c0f\u56fe\u6807\uff08\u56fe\u6807\u5c0f\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5c0f\u56fe\u6807\uff0c\u4f8b\uff1awindow/search_btn Base().find_element_by_ai(\"window/search_btn\")\n \uff083\uff09\u5927\u56fe\u6807 / OCR\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\u5185\u7684\u6587\u5b57\uff0c\u4f8b\uff1amenu/\u5c5e\u6027 Base().find_element_by_ai(\"menu/\u5c5e\u6027\")\n \uff084\uff09OCR\uff1a\u5168\u5c4f\u8bc6\u522b\u6587\u5b57 Base().find_element_by_ai(\"\u641c\u7d22\")\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516b\u3001\u9690\u85cf\u9f20\u6807","text":"\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u8fc7\u6765\u7684\u89c6\u9891\u6d41\uff0c\u5728\u8bc6\u522b\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u53d7\u5230\u9f20\u6807\u5f71\u54cd\uff0c\u56e0\u6b64\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u9690\u85cf\u9f20\u6807\u3002 \u5c4f\u853d\u9f20\u6807\u5149\u6807\u663e\u793a ```shell script /etc/lightdm/lightdm.conf \u5728`[Seat:*]`\u4e0b\u9762\u6dfb\u52a0\u53c2\u6570\n```shell script\nxserver-command=X -bs -core -nocursor\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e5d\u3001\u667a\u80fd\u81ea\u52a8\u5316\u7684\u610f\u4e49","text":"1\u3001\u6539\u5584 Acessibility \u5b9a\u4f4d\u7684\u7a33\u5b9a\u6027\u95ee\u9898 Acessibility \u5c5e\u6027\u5b9a\u4f4d\u5b58\u5728\u5076\u5c14\u5931\u6548\u7684\u60c5\u51b5 \uff081\uff09\u5f00\u53d1\u5728\u505a\u65b0\u9700\u6c42\u5f00\u53d1\u65f6\u53ef\u80fd\u6d89\u53ca\u5230\u5bf9\u5c5e\u6027\u6807\u7b7e\u7684\u4fee\u6539\u6216\u8005\u5c42\u7ea7\u7684\u8c03\u6574\uff0c\u53ef\u80fd\u9020\u6210\u81ea\u52a8\u5316\u7528\u4f8b\u65e0\u6cd5\u5b9a\u4f4d\u5230\u5143\u7d20\u3002 \u6bd4\u59821040\u9636\u6bb5\uff0c\u97f3\u4e50\u91cd\u6784\u7684\u65f6\u5019\uff0c\u5f00\u53d1\u5bf9\u90e8\u5206\u5c5e\u6027\u548c\u5c42\u7ea7\u505a\u4e86\u4fee\u6539\uff0c\u5bfc\u81f4\u81ea\u52a8\u5316\u7528\u4f8b\u5b9a\u4f4d\u65b9\u6cd580%\u9700\u8981\u4fee\u6539\u3002 \u5f00\u53d1\u65b0\u529f\u80fd\u7684\u65f6\u5019\u5076\u5c14\u4e5f\u4f1a\u5bf9\u5c5e\u6027\u505a\u8c03\u6574\uff0c\u9047\u52305\u6b21\u3002 \uff082\uff09\u76ee\u524d\u4e3b\u8981\u4f7f\u7528Dogtail\u8bc6\u522b\u5e94\u7528Acessibility\u5c5e\u6027\u8fdb\u884c\u5b9a\u4f4d\uff0c\u662f\u83b7\u53d6\u5e94\u7528\u5f53\u524d\u754c\u9762\u7684\u5c5e\u6027tree\uff0c\u5728\u5e94\u7528\u8df3\u8f6c\u540e\uff0cDogtail\u5b58\u5728\u65e0\u6cd5\u53ca\u65f6\u83b7\u53d6\u5f53\u524d\u5c5e\u6027\u5217\u8868\u7684\u60c5\u51b5\u3002 \u591a\u5a92\u4f53\u8c03\u7528\u6587\u7ba1\u7a97\u53e3\u7684\u65f6\u5019\uff0c\u51fa\u73b0\u627e\u4e0d\u5230\u6587\u7ba1\u91cc\u9762\u5143\u7d20\u7684\u60c5\u51b5\uff0c\u76ee\u524d\u51fa\u73b010+\u6b21\u3002 \u5e94\u7528\u8bbe\u7f6e\u9875\u9762\u7684\u5c5e\u6027\u5076\u5c14\u5b58\u5728\u627e\u4e0d\u5230\u7684\u60c5\u51b5\uff0c\u9047\u52305\u6b21\u3002 \uff083\uff09Dogtail\u5de5\u5177\u672c\u8eab\u5b58\u5728\u95ee\u9898\uff0c\u6709\u65f6\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u5019\u5f88\u6162\uff0c\u8ba9\u4eba\u65e0\u6cd5\u63a5\u53d7\uff0c\u76ee\u524d\u51fa\u73b0\u8fc7\u5f88\u591a\u6b21\u3002 \u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u95f4\u6bd4\u5e73\u5e38\u61623\u500d\uff0c\u51fa\u73b04\u6b21\u3002 2\u3001\u89e3\u51b3\u4e86\u4f7f\u7528\u7edd\u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898 \u90e8\u5206\u63a7\u4ef6\u65e0\u6cd5\u6dfb\u52a0 Acessibility \u5c5e\u6027\u4ece\u800c\u4f7f\u7528\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u51fa\u73b0\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898\u3002 \uff081\uff09\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u65b9\u6cd5\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u76ee\u6807\u56fe\u7247\u8d44\u6e90\uff0c\u5728 UI \u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u4f1a\u6d89\u53ca\u5230\u76ee\u6807\u8d44\u6e90\u7684\u66ff\u6362\uff0c\u6bd4\u8f83\u8017\u8d39\u4eba\u529b\u3002 \uff082\uff09\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6cd5\u5bf9\u6bd4\u7cbe\u5ea6\u6bd4\u8f83\u641e\uff0c\u5982\u679cUI \u7684\u53d8\u66f4\u4f1a\u9020\u6210\u65e0\u6cd5\u51c6\u786e\u5b9a\u4f4d\u5230\uff0c\u81ea\u52a8\u5316\u811a\u672c\u5065\u58ee\u6027\u4e0d\u8db3\u3002 3\u3001\u4f7f\u7528\u673a\u5668\u5206\u79bb\uff0c\u89e3\u51b3\u4e86\u81ea\u52a8\u5316\u811a\u672c\u5bf9\u5e94\u7528\u7684\u5f71\u54cd\uff0c\u771f\u5b9e\u8fd8\u539f\u7528\u6237\u7684\u4f7f\u7528\u573a\u666f \u673a\u5668\u5206\u79bb\u7684\u67b6\u6784\u8bbe\u8ba1\uff0c\u4fdd\u8bc1\u4e86\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u73af\u5883\u5b8c\u5168\u7b49\u540c\u4e8e\u7528\u6237\uff0c\u6392\u9664\u6d4b\u8bd5\u811a\u672c\u7684\u5f71\u54cd\u3002 \uff081\uff09\u76ee\u524d\u7684\u529f\u80fd\u81ea\u52a8\u5316\u662f\u5728\u6d4b\u8bd5\u673a\u4e0a\u76f4\u63a5\u8fd0\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\uff0c\u52a0\u4e0a\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u6211\u4eec\u6dfb\u52a0\u4e86\u4e00\u4e9b\u8fdb\u7a0b\u76d1\u63a7\u3001\u89c6\u9891\u5f55\u5236\u7b49\u529f\u80fd\uff0c\u81ea\u52a8\u5316\u811a\u672c\u672c\u8eab\u4f1a\u6d88\u8017\u4e00\u4e9b\u7cfb\u7edf\u8d44\u6e90\uff0c\u65e0\u6cd5\u8fd8\u539f\u771f\u662f\u7684\u7528\u6237\u4f7f\u7528\u573a\u666f\u3002 \uff082\uff09\u6027\u80fd\u6d4b\u8bd5\u9700\u8981\u6392\u9664\u5176\u4ed6\u7a0b\u5e8f\u7684\u8d44\u6e90\u6d88\u8017\u5f71\u54cd\uff0c\u6027\u80fd\u81ea\u52a8\u5316\u91c7\u7528\u673a\u5668\u5206\u79bb\uff0c\u4fdd\u8bc1\u4e86\u6027\u80fd\u6570\u636e\u7684\u51c6\u786e\u6027\u3002 \u4ee5\u524d\u7684\u7528\u4f8b\u6267\u884c\u8017\u65f6\u6ca1\u6761\u572830\u79d2\u5de6\u53f3\uff0c\u73b0\u5728\u7528\u4f8b\u8017\u65f6\u572810\u79d2\u3002 4\u3001\u89e3\u51b3\u4e86UI \u8c03\u6574\u5bfc\u81f4\u5b9a\u4f4d\u5931\u8d25\u7684\u4e0d\u7a33\u5b9a\u6027\u95ee\u9898 \uff081\uff09\u89e3\u51b3\u4e86\u56e0 UI \u8c03\u6574\u5bfc\u81f4\u63a7\u4ef6\u4f4d\u7f6e\u53d8\u5316\u6216\u8272\u5dee\u53d8\u5316\u540e\u5b9a\u4f4d\u4e0d\u51c6\u786e\u7684\u95ee\u9898\uff0c\u53ea\u8981\u63a7\u4ef6\u6587\u6848\u548c\u63a7\u4ef6\u5916\u8fb9\u6846\u65e0\u53d8\u5316\u5747\u53ef\u51c6\u786e\u5b9a\u4f4d\uff1b \uff082\uff09\u76ee\u524d\u4e5f\u4f1a\u91c7\u7528\u57fa\u4e8eUI\u7684\u5b9a\u4f4d\u65b9\u6848\uff0c\u5982\u679cUI\u4f4d\u7f6e\u6709\u8c03\u6574\uff0c\u4f1a\u5bfc\u81f4\u5143\u7d20\u65e0\u6cd5\u5b9a\u4f4d\u3002 5\u3001\u7b80\u5316\u4e86\u7528\u4f8b\u7ed3\u6784\uff0c\u63d0\u5347\u7f16\u5199\u53cb\u597d\u5ea6 \uff081\uff09\u667a\u80fd\u81ea\u52a8\u5316\u8bc6\u522b\u5143\u7d20\u7684\u65b9\u6cd5\u53ea\u6709\u4e00\u4e2a\uff0c\u5c31\u662f\u57fa\u4e8e\u6211\u4eec\u8bad\u7ec3\u7684\u6a21\u578b\u8bc6\u522b\u89c6\u9891\u6d41\u4e2d\u7684\u5143\u7d20\uff0c\u7ecf\u8fc7\u811a\u672c\u5c01\u88c5\u4e4b\u540e\uff0c\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u4e2d\u6240\u6709\u5b9a\u4f4d\u7684\u64cd\u4f5c\u90fd\u53ea\u9700\u8981\u8c03\u7528\u8fd9\u4e00\u4e2a\u65b9\u6cd5\u5c31\u884c\u4e86\uff0c\u7f16\u5199\u81ea\u52a8\u5316\u811a\u672c\u7684\u96be\u5ea6\u5927\u5927\u964d\u4f4e\u3002 \uff082\uff09\u4e5f\u662f\u7531\u4e8e\u8c03\u7528\u65b9\u6cd5\u7b80\u5355\uff0c\u5728 UI \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u4e2d\u7684\u5206\u5c42\u7ed3\u6784\u5c06\u4f1a\u51cf\u5c11\uff0c\u591a\u7ee7\u627f\u7684\u60c5\u51b5\u4f1a\u51cf\u5c11\uff0c\u81ea\u52a8\u5316\u4ee3\u7801\u7684\u8c03\u7528\u7ed3\u6784\u4e5f\u4f1a\u53d8\u5f97\u7b80\u5355\uff0c\u800c\u4e14\u529f\u80fd\u6d4b\u8bd5\u540c\u5b66\u7f16\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u66f4\u52a0\u5bb9\u6613\u4e0a\u624b\u3002 \u4ee5\u524d\u5199\u7528\u4f8b\u7531\u4e8e\u9700\u8981\u7ed3\u5408\u4e0d\u540c\u7684\u6a21\u5757\uff0c\u8c03\u7528\u4e0d\u540c\u7684\u65b9\u6cd5\uff0c\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u5e76\u5b8c\u6210\u8c03\u8bd5\u7684\u65f6\u95f4\u5e73\u5747\u572820-30\u5206\u949f\uff0c\u73b0\u5728\u5199\u7528\u4f8b\u811a\u672c\u80fd\u57285\u5206\u949f\u5de6\u53f3\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":"# =============================================\n# Attribution : Application Test Department III\n# Time : 2023/1/3\n# Author : ut003281\n# =============================================\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u7b80\u8ff0","text":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5 \u901a\u8fc7\u81ea\u52a8\u5316\u624b\u6bb5\u5bf9\u5e94\u7528\u8fdb\u884c\u6027\u80fd\u6d4b\u8bd5\uff0c\u63d0\u4f9b\u65b9\u4fbf\u7684\u73af\u5883\u90e8\u7f72\u3001\u8fd0\u884c\u914d\u7f6e\u3001\u7528\u4f8b\u7f16\u5199\u7b49\uff0c\u7528\u4e8e\u684c\u9762\u5e94\u7528\u7684\u51b7\u70ed\u542f\u52a8\u3001\u8d44\u6e90\u62f7\u8d1d\u3001\u9875\u9762\u8df3\u8f6c\u7b49\u6027\u80fd\u573a\u666f\u6d4b\u8bd5\u3002 \u4ed3\u5e93\u5730\u5740\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-perf-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u4ee3\u7801\u7ed3\u6784","text":"autotest-perf-aitest\n\u251c\u2500\u2500 apps # \u5b58\u653e\u6240\u6709\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u811a\u672c\n\u251c\u2500\u2500 conftest.py # pytest hook\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 CURRENT # \u7248\u672c\u5185\u5bb9\n\u251c\u2500\u2500 docs # \u6587\u6863\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u952e\u503c\u5bf9\u7167\u8868.pdf # \u4e32\u53e3\u7ebfcode\u4e0e\u6309\u952e\u7684\u5bf9\u7167\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u6027\u80fd\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\u6267\u884c\u5668\u4f7f\u7528\u6307\u5357.md # \u6267\u884c\u5668\u811a\u672c\u4f7f\u7528\u6307\u5357\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 USB\u4e32\u53e3\u8f6cUSB\u952e\u76d8\u9f20\u6807\u7ebf\u534f\u8bae\u6587\u4ef6V1.0.pdf # \u4e32\u53e3\u534f\u8bae\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput-0.28.2.zip # Linux\u4e0b\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\u7684\u6e90\u7801\uff0c\u53ef\u6839\u636e\u67b6\u6784\u6253\u5305\n\u251c\u2500\u2500 manage.py # \u529f\u80fd\u4e3b\u5165\u53e3\n\u251c\u2500\u2500 pytest.ini # pytst \u914d\u7f6e\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 setting # \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 client.ini # \u6d4b\u8bd5\u673a IP \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5168\u5c40\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dev_env.sh # \u5bbf\u4e3b\u673a\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose_no_relay.yml # \u65e0\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose.yml # \u6709\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker_login.sh # docker \u767b\u9646\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 res\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 black.png # \u5168\u9ed1\u56fe\u7247\uff0c\u7528\u4e8e\u4fee\u6539\u58c1\u7eb8\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_5000.deb # 3A5000 \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_amd64.deb # amd \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_arm64.deb # arm \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_mips64.deb # mips \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_sw_64.deb # sw \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 server.ini # \u670d\u52a1\u5668\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 setup.sh # \u5bb9\u5668\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 template # \u521b\u5efa app \u57fa\u7840\u811a\u672c\u6a21\u677f\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 app_template\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ${app_name}_widget.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 control-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 images\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 test_${app_name}_01_scene.json-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 test_${app_name}_01_scene.py-tpl\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 uos_docker # \u5bb9\u5668\u73af\u5883\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dockerfile\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 requirements.txt\n\u2514\u2500\u2500 src\n \u251c\u2500\u2500 analysis_save.py # \u89e3\u6790\u56fe\u7247\u6d41\u7ed3\u679c\uff0c\u6c47\u603b\u751f\u6210 excel \u62a5\u544a\n\u251c\u2500\u2500 base_widget.py # \u5c01\u88c5\u7684\u57fa\u7840\u64cd\u4f5c\uff0c\u5e94\u7528\u8c03\u7528\u7684\u4e3b\u5165\u53e3\u65b9\u6cd5\n\u251c\u2500\u2500 cmdctl.py # \u8c03\u7528\u547d\u4ee4\u884c\u4f7f\u7528\n\u251c\u2500\u2500 global_value.py # \u5168\u5c40\u53d8\u91cf\n\u251c\u2500\u2500 image_utils.py # \u56fe\u7247\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 __init__.py\n \u251c\u2500\u2500 logger_utils.py # \u65e5\u5fd7\u914d\u7f6e\n\u251c\u2500\u2500 pdocr.py # ocr \u914d\u7f6e\n\u251c\u2500\u2500 public_method.py # \u4e00\u4e9b\u65b9\u4fbf\u7684\u5c01\u4f4f\n\u251c\u2500\u2500 record.py # \u5f55\u5c4f\u76f8\u5173\n\u251c\u2500\u2500 rtk # \u8fd0\u884c\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 _base.py # \u4e00\u4e9b\u679a\u4e3e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 install_env.py # \u5b89\u88c5\u73af\u5883\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 local_runner.py # \u8fd0\u884c\u7528\u4f8b\n\u251c\u2500\u2500 serial_communication # \u4e32\u53e3\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 power_control.py # \u7ee7\u7535\u5668\u64cd\u4f5c\uff0c\u4f7f\u7528\u7ee7\u7535\u5668\u8fde\u63a5\u4e3b\u673a\u7535\u6e90\uff0c\u63a7\u5236\u5f00\u5173\u673a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 serial_common.py # \u4e32\u53e3\u516c\u5171\u65b9\u6cd5\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 usb_mk.py # \u952e\u9f20\u64cd\u4f5c\u57fa\u7840\u5c01\u88c5\n\u251c\u2500\u2500 shortcut_key.py # \u5feb\u6377\u952e\u7684\u5c01\u88c5\n\u251c\u2500\u2500 singleton.py # \u5355\u4f8b\u6a21\u5f0f\n\u251c\u2500\u2500 start_app.py # \u521b\u5efa app\n\u2514\u2500\u2500 write_xlsx.py # \u751f\u6210 excel\n# __init__.py \u6587\u4ef6\u4e3a\u6807\u8bc6\u8be5\u76ee\u5f55\u662f\u4e00\u4e2aPython\u7684\u6a21\u5757\u5305\uff0c\u9879\u76ee\u4e2d\u7684__init__.py\u5747\u4e3a\u7a7a\u6587\u4ef6\u3002\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u73af\u5883\u642d\u5efa","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\u3002 \u670d\u52a1\u7aef\u4e00\u53f0\u3002\uff08\u4ec5\u652f\u6301 AMD \u67b6\u6784\uff0c\u82e5\u9700\u5176\u4ed6\u67b6\u6784\uff0c\u54a8\u8be2\u76f8\u5173\u5f00\u53d1\u4eba\u5458\uff09 \u91c7\u96c6\u76d2\u4e00\u4e2a\u3002 \uff08ACASIS HDMI \u89c6\u9891\u91c7\u96c6\u76d2\uff0chttps://item.jd.com/100013302599.html#crumb-wrap \uff09 USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\u3002\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"\uff082\uff09\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\u3002 USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff08USB3.0 \u63a5\u53e3\u4e0a\uff09\u3002 \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5 USB \u5ef6\u957f\u7ebf\u3002 \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u670d\u52a1\u7aef\u63a8\u8350\u914d\u7f6e","text":"\u914d\u7f6e\u8d8a\u9ad8\uff0c\u89e3\u6790\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"2\u3001\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa","text":" \u6253\u5f00\u63a7\u5236\u4e2d\u5fc3\uff0c\u8d26\u6237\u8bbe\u7f6e\u4e3a\u3010\u81ea\u52a8\u767b\u5f55\u3011\u548c\u3010\u65e0\u5bc6\u7801\u767b\u5f55\u3011\uff0c\u7535\u6e90\u7ba1\u7406\u4e2d\u4f7f\u7528\u7535\u6e90\u5168\u90e8\u8bbe\u7f6e\u4e3a\u3010\u4ece\u4e0d\u3011\uff0c\u5f00\u542f\u5f00\u53d1\u8005\u6a21\u5f0f\u3002 \u6839\u636e\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u8981\u6c42\uff0c\u5bfc\u5165\u76f8\u5173\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\uff1a\u5bfc\u5165\u76f8\u518c\u3001\u5f71\u9662\u3001\u97f3\u4e50\u7684\u6d4b\u8bd5\u8d44\u6e90\u3002 \u5728\u670d\u52a1\u7aef\u6253\u5f00\u76f8\u673a\u5e94\u7528\u540e\uff0c\u5c06\u6d4b\u8bd5\u673a\u684c\u9762\u58c1\u7eb8\u66f4\u6362\u4e3a\u7eaf\u8272\u58c1\u7eb8\uff08\u6ce8\u610f\uff0c\u670d\u52a1\u7aef\u9700\u63d0\u524d\u5f00\u542f\u76f8\u673a\u540e\u518d\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u58c1\u7eb8\uff0c\u5efa\u8bae\u7eaf\u9ed1\u58c1\u7eb8 setting/res/black.png\uff09 \u5728\u6587\u4ef6\u7ba1\u7406\u5668\u4e2d\uff0c\u5c06\u9009\u9879 \u4e3b\u83dc\u5355-\u8bbe\u7f6e-\u9884\u89c8-\u56fe\u7247\u9884\u89c8 \u53d6\u6d88\u52fe\u9009\uff08\u5982\u4e0d\u53d6\u6d88\uff0c\u4f1a\u5f71\u54cd\u622a\u56fe\u5f55\u5c4f\u5e94\u7528\u7684\u6027\u80fd\u6570\u636e\uff09 \u79fb\u52a8\u6216\u5220\u9664\u7cfb\u7edf Logo \uff0c\u6392\u9664\u684c\u9762\u53f3\u4e0b\u89d2 Logo \u7684\u5f71\u54cd\uff08\u91cd\u542f\u751f\u6548\uff09\u3002 sudo mv /usr/share/deepin/uos_logo.svg ~/Pictures/\n \u5b89\u88c5\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\uff08\u5fc5\u987b\u5b89\u88c5\uff01\uff01\uff09 AMD \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_amd64.deb ARM \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_arm64.deb MIPS \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_mips64.deb 3A5000 \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_5000.deb \u5b89\u88c5\u547d\u4ee4 sudo dkpg -i xserver-xorg-input-libinput_0.28.2-2_amd64.deb\n \u5b89\u88c5\u65f6\u4f1a\u63d0\u793a\u5df2\u5b58\u5728\u76f8\u540c\u7248\u672c\uff0c\u8bf7\u5ffd\u7565\uff0c\u76f4\u63a5\u8986\u76d6\u5b89\u88c5\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u4e3b\u673a\u624d\u751f\u6548"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u670d\u52a1\u7aef\u4e00\u952e\u73af\u5883\u90e8\u7f72","text":"\u73af\u5883\u642d\u5efa\u524d\u5fc5\u987b\u5148\u8fde\u63a5\u4e0a USB \u4e32\u53e3\u7ebf\u548c\u91c7\u96c6\u76d2\u3002 \u5bbf\u4e3b\u673a\u73af\u5883\u5b89\u88c5 python3 manage.py install --env host\n \u5bb9\u5668\u73af\u5883\u5b89\u88c5 python3 manage.py install --env docker\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u56db\u3001\u914d\u7f6e\u9879","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u670d\u52a1\u7aef\u914d\u7f6e","text":"setting/config/server.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u914d\u7f6e\u9879\uff0c\u5305\u542b\u4e86\u6240\u6709\u670d\u52a1\u7aef\u6240\u6709\u7684\u53ef\u914d\u7f6e\u9879\u3002 \u672c\u5730\u65e0\u7f51\u7edc\u8fd0\u884c \u5c06\u914d\u7f6e\u9879 network=0 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u672c\u5730\u6709\u7f51\u7edc\u8fd0\u884c \u914d\u7f6e\u9879 network=1 (1)\u914d\u7f6e\u9879 client_alias= \u914d\u7f6e\u4e3a\u4f60\u8981\u6d4b\u8bd5\u7684\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5982 Alias1 \u6d4b\u8bd5\u673a\u522b\u540d\u5728 setting/config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 (2)\u914d\u7f6e\u9879 client_alias= \u4e3a\u7a7a\uff0c\u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager --client_alias Alias1\uff0c\u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002(Alias1 \u4e3a\u4f60\u914d\u7f6e\u7684\u6d4b\u8bd5\u673a\u522b\u540d) (1)\u548c(2)\u53ea\u8981\u4f7f\u7528\u5176\u4e00\u5373\u53ef\u3002 \u6709\u7f51\u7edc\u8fd0\u884c\uff0c\u4e14\u9700\u8981\u901a\u8fc7 Jenkins \u4e0a\u8fd0\u884c\u4e00\u4e2a job \uff0c\u540c\u65f6\u63a7\u5236\u591a\u53f0\u673a\u5668\u3002 \u914d\u7f6e\u9879 network=1 \u914d\u7f6e\u9879 client_alias= \u4e0d\u7528\u914d\u7f6e\uff0c\u5728\u8fd0\u884c run.sh \u7684\u65f6\u5019\u76f4\u63a5\u7a7a\u683c\u52a0\u522b\u540d\u5373\u53ef\uff0c\u6bd4\u5982\uff1a\u6d4b\u8bd5\u673a\u522b\u540d\u4e3a Alias1 \uff0c\u4e14\u5df2\u7ecf\u5728 config/client.ini \u4e2d\u914d\u7f6e\u4e86 Alias1 \u7684user ip password \uff0c\u5219\u8fd0\u884c bash run.sh Alias1 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u5728 Jenkins pipeline \u91cc\u9762\u901a\u8fc7\u5e76\u884c stage \u6216\u5e76\u884c\u8c03\u7528\u4e0b\u5c42\u4efb\u52a1\u7684\u65b9\u5f0f\u53ef\u4ee5\u5b9e\u73b0\u5927\u89c4\u6a21\u7684\u6027\u80fd\u6d4b\u8bd5\u9700\u6c42\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;1\u3001KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2\u3001KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f, e.g. TAGS = L1 or smoke\n[case_conf]\n# \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\uff0cocr\u6587\u6848\u8bc6\u522b\u8f83\u6162\uff0c\u4e0d\u63a8\u8350\u4f7f\u7528\nfind_by = stage\n# \u6700\u540e\u4e00\u4e2a\u7a33\u5b9a\u9636\u6bb5\u7684\u5e27\u6570\u8bc6\u522b\n# \u9996\u5e27\u5b58\u5728\u540e\u7684\u7b2c\u4e00\u4e2a\u5927\u4e8e\u8be5\u914d\u7f6e\u5e27\u6570\u7684\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u5c3e\u5e27\nfinal_stable_num=100\n# \u4ece\u8be5\u5e27\u6570\u5f00\u59cb\u8bc6\u522b\u6587\u6848\u6216\u56fe\u7247\uff0c\u51cf\u5c11\u5206\u6790\u65f6\u95f4\nstart_num = 150\n# \u8bc6\u522b\u7684\u6587\u6848\ntext=\n# \u8bc6\u522b\u56fe\u7247\nmatch=apps/xxx/images/match.png\n# \u8bc6\u522b\u76f8\u4f3c\u5ea6\nmatch_rate=0.9\n# \u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6bd4\u5982\u70ed\u542f\u52a8\u7528\u4f8b\uff0c\u4ece\u70b9\u51fb\u6253\u5f00\u5230\u505c\u6b62\u5f55\u5c4f\uff0c\u4e2d\u95f4\u7b49\u5f855\u79d2\uff1b\nduration = 15\n# \u5355\u6761\u7528\u4f8b\u6267\u884c\u7684\u6b21\u6570\ncount = 5\n# \u7a33\u5b9a\u9636\u6bb5\u5212\u5206\u7684\u76f8\u4f3c\u5ea6\nstable_similarity = 0.9997\n[server]\n# \u8c03\u8bd5\u6a21\u5f0f=1\uff0c\u4e3a\u5f00\u542f\u8c03\u8bd5\u6a21\u5f0f\uff0c0\u4e3a\u5173\u95ed\u3002\n# \u8c03\u8bd5\u6a21\u5f0f\u4e0b\u9ed8\u8ba4\u53ea\u6267\u884c\u4e00\u6b21\u7528\u4f8b\uff0c\u4e0d\u5173\u673a\n# \u7f16\u5199\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u5efa\u8bae\u5f00\u542fmaintain\u3002\nMAINTAIN = 0\n# \u8fd0\u884c\u7684\u73af\u5883docker\u5bb9\u5668\u73af\u5883\uff0chost\u5bbf\u4e3b\u673a\u73af\u5883\nENV = docker\n# \u670d\u52a1\u7aef\u5bc6\u7801\nPASSWORD=1\n# \u6307\u5b9a\u6d4b\u8bd5\u673a\u522b\u540d\n# \u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6bd4\u5982\uff1a\n# [AMD]\n# ip=10.8.15.86\n# user=uos\n# \u5176\u4e2d AMD \u4e3a\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5219client_alias=AMD\nCLIENT_ALIAS = x86\uff08Intel-i7\uff09\n# 1 \u5f00\u542f\u7f51\u7edc, 0 \u5173\u95ed\u7f51\u7edc\n# \uff081\uff09\u670d\u52a1\u7aef\u4e0e\u6d4b\u8bd5\u673a\u987b\u5728\u540c\u4e00\u7f51\u6bb5\u4e0b\uff0c\u4f60\u53ef\u4ee5\u5c1d\u8bd5\u5728\u670d\u52a1\u7aef\u901a\u8fc7ssh\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c\u5982\u679c\u53ef\u4ee5\u8fde\u63a5\uff0c\u8bf4\u660e\u7f51\u7edc\u6b63\u5e38\u3002\n# \uff082\uff09\u5f53input_type=FILE_NAME \u65f6\uff0c\u5fc5\u987b\u5f00\u542f\u7f51\u7edc\u3002\nNETWORK = 1\n# \u6027\u80fd\u7ed3\u679c\u7edf\u8ba1\u5355\u4f4d \u6beb\u79d2\u2014ms, \u79d2\u2014s\nUNIT=ms\n# \u6d4b\u8bd5\u673a\u5f00\u673a\u8fdb\u5165\u684c\u9762\u540e\u7b49\u5f85\u65f6\u95f4,\u5355\u4f4d/\u79d2\nSTARTUP_DELAY = 60\n# 1\u4e3a\u5220\u9664\u7f13\u5b58\uff0c0\u4e3a\u4e0d\u5220\u9664\u7f13\u5b58\n# \u7528\u4f8b\u6267\u884c\u5b8c\u540e\u4f1a\u5728report\u76ee\u5f55\u4e0b\u751f\u6210\u667a\u80fd\u89e3\u6790\u7684\u4e00\u4e9b\u7f13\u5b58\u56fe\u7247\u3002\nCACHE = 0\n# \u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u62a5\u544a\u4f1a\u4fdd\u5b58\u5728\u9879\u76ee\u4e0breport\u76ee\u5f55\u4e2d\uff1b\n# \u6307\u5b9a\u62a5\u544a\u76ee\u5f55\u5219\u5b58\u653e\u5230\u6307\u5b9a\u76ee\u5f55\u3002\nREPORT_PATH = report\n# \u670d\u52a1\u7aef\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684icon\u8d44\u6e90\u4f1a\u7f13\u5b58\u5728\u9879\u76ee\u4e0binput\u76ee\u5f55\u4e2d\nINPUT = input/\n# 1\u4e3a\u6d4b\u8bd5\u5b8c\u5173\u673a\uff0c0\u4e3a\u6d4b\u8bd5\u5b8c\u4e0d\u5173\u673a\nSHUTDOWN = 0\n# \u89e3\u6790\u8fdb\u7a0b\u6570\uff08\u4e0d\u63a8\u8350\u4fee\u6539\uff09\n# 3\u4e2a\u8fdb\u7a0b\u89e3\u6790\u89c6\u9891\u5df2\u7ecf\u80fd\u591f\u6ee1\u8db3\uff0c\u5373\u4f7f\u589e\u52a0\u8fdb\u7a0b\u6570\u4e5f\u4e0d\u80fd\u51cf\u5c11\u6574\u4f53\u8017\u65f6\n# \u53e6\u5916\u8fd8\u8981\u770bCPU\u6838\u6570\u662f\u5426\u652f\u6301\u3002\nPARSING_PROCESS = 3\n# 1\u4e3a\u4f7f\u7528\u7ee7\u7535\u5668\u5f00\u5173\u673a\uff0c0\u4e3a\u4f7f\u7528reboot\u547d\u4ee4\u91cd\u542f\u3002\u4f9d\u8d56\u7ee7\u7535\u5668\u786c\u4ef6\u8bbe\u5907\uff0c\u9700\u8981\u4f7f\u7528\u8054\u7cfb\u5f00\u53d1\u8005\nRELAY = 0\n# \u83b7\u53d6\u6d4b\u8bd5\u5e94\u7528\u7684\u7248\u672c, %s \u5360\u4f4d\u5e94\u7528\u540d\n# \u5982\u679c\u8be5\u914d\u7f6e\u4e3a\u7a7a\uff0c\u5219\u4e0d\u83b7\u53d6\u5e94\u7528\u7684\u7248\u672c\u4fe1\u606f\u3002\nCOMMAND = apt policy %s 2>/dev/null|grep \"\u5df2\u5b89\u88c5\"|awk -F \"\uff1a\" \"{print \\$2}\"\n# \u5173\u673a\u7b49\u5f85\u5f00\u542f\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6839\u636e\u6d4b\u8bd5\u673a\u6027\u80fd\u4e0d\u540c\uff0c\u5f00\u5173\u673a\u8017\u65f6\u53ef\u80fd\u4e0d\u540c\uff0c\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u673a\u60c5\u51b5\u914d\u7f6e\u3002\nSHUTDOWN_DELAY = 30\n# \u53ef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u56fe\u7247\u683c\u5f0f\uff0c\u4ee5\u82f1\u6587\u9017\u53f7\u9694\u5f00\u3002\n# \u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u76ee\u524d\u6211\u4eec\u4ec5\u9a8c\u8bc1\u4e86jpg,jpeg,png\u8fd9\u4e09\u79cd\u5e38\u7528\u7684\u56fe\u7247\u683c\u5f0f\u3002\nINPUT_TYPES = jpg,jpeg,png\n# \u6027\u80fd\u5206\u6790\u8865\u5e27\uff0c\u7b49\u4e8e\u6216\u4f4e\u4e8e\u8be5\u503c\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u9700\u8981\u51cf\u6389\u3002\nUN_STAB_START = 3\n# \u670d\u52a1\u7aef\u83b7\u53d6\u6d4b\u8bd5\u673a\u56fe\u50cf\u7684\u5e27\u7387\uff0c\u5373\u6bcf\u79d2\u83b7\u53d6\u591a\u5c11\u5f20\u6d4b\u8bd5\u673a\u4e0a\u7684\u56fe\u50cf\u3002\n# \u9ed8\u8ba4\u5e27\u7387\u4e3a30\u5e27/\u79d2\uff0c\u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u53ef\u80fd\u4f1a\u5bf9\u89e3\u6790\u7ed3\u679c\u9020\u6210\u504f\u5dee\u3002\nFPS = 30\n# \u4ee5\u4e0b\u573a\u666f\u7c7b\u578b\u4f1a\u91cd\u542f\u6d4b\u8bd5\u673a,\u591a\u79cd\u573a\u666f\u4f7f\u7528\u9017\u53f7\u9694\u5f00\nSCENE = cold\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = http://10.8.13.78:8890\n#\u5c4f\u5e55\u56fe\u7247\u4e34\u65f6\u5b58\u653e\u4f4d\u7f6e\nSCREEN_CACHE = /tmp/screen\n# =======================================\n[log]\n# \u65e5\u5fd7\u7ea7\u522b\uff0cOFF\u3001FATAL\u3001ERROR\u3001WARN\u3001INFO\u3001DEBUG\u3001ALL\n# \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u65e5\u5fd7\u8f93\u51fa\uff0clog_cli=INFO\u8868\u793a \u4ec5\u8f93\u51faINFO\u53ca\u4ee5\u4e0a\u7ea7\u522b\u7684\u65e5\u5fd7\u3002\nLOG_LEVEL = DEBUG\n# \u65e5\u5fd7\u6587\u4ef6\u4fdd\u5b58\u8def\u5f84\nLOG_PATH= logs\n# =======================================\n[dockerhub]\n# \u5bb9\u5668\u767b\u9646\u8d26\u53f7\nDOCKER_USER = user\n# \u5bb9\u5668\u767b\u9646\u5bc6\u7801\nDOCKER_PASSWORD = User1234\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u6d4b\u8bd5\u673a\u914d\u7f6e","text":"setting/config/client.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u4fe1\u606f\u3002 \u6709\u7f51\u7edc\u7684\u60c5\u51b5\u4e0b\uff0c\u670d\u52a1\u7aef\u9700\u8981\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u56e0\u6b64\u4f60\u9700\u8981\u5199\u5165 \u6d4b\u8bd5\u673a\u522b\u540d \u3001 user \u3001ip\u3001 password \u3002 # \u6d4b\u8bd5\u673a\u522b\u540d\n[Alias1] # \u6d4b\u8bd5\u673aip\nip=10.8.15.86 # \u6d4b\u8bd5\u673a\u7528\u6237\u540d\nuser=uos\n \u547d\u540d\u5efa\u8bae\uff1aAliasA1\u3001AliasA2\u3001AliasB1\u3001AliasB2\uff0c\u4e0d\u8981\u91cd\u540d\u3002 \u65e0\u7f51\u7edc\u60c5\u51b5\u4e0b\uff0c\u4ec5\u9700\u8981\u5173\u6ce8\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\u9879 width=\u3001 height= \u5373\u53ef\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a [client]\n# \u9ed8\u8ba4\u6d4b\u8bd5\u673a\u7528\u6237\u540d\uff0c\u5bc6\u7801\uff0cip\nip=\nuser=\n# \u6d4b\u8bd5\u673a\u5bc6\u7801\npassword=1\n# \u6d4b\u8bd5\u673a\u4e3b\u9898\ntheme=bloom\n# \u6d4b\u8bd5\u673aicon\u76ee\u5f55\npath=/usr/share/icons\n# \u7cfb\u7edfdesktop\u6587\u4ef6\u7684\u5b58\u653e\u76ee\u5f55\uff0cUOS\u7cfb\u7edf\u9ed8\u8ba4\u4e3a/usr/share/applications\ndesktop_path=/usr/share/applications\n# \u7528\u4e8e\u5224\u65ad\u6d4b\u8bd5\u673a\u662f\u5426\u5f00\u673a\u8fdb\u5165\u684c\u9762\u7684\u8bc6\u522b\u6807\u8bc6\u3002\n# 1\u3001\u901a\u8fc7\u684c\u9762\u56fe\u6807\u8bc6\u522b\u3002\n# - type=FILE_NAME\u65f6\uff0c\u670d\u52a1\u5668\u548c\u6d4b\u8bd5\u673a\u5fc5\u987b\u5728\u540c\u4e00\u5c40\u57df\u7f51\u5185\u3002\n# - power_on=dde-computer\u8868\u793a\u901a\u8fc7\u684c\u9762\u8ba1\u7b97\u673a\u56fe\u6807\u5224\u65ad\u5f00\u673a\u8fdb\u5165\u684c\u9762\u3002\n# 2\u3001\u901a\u8fc7\u672c\u5730\u56fe\u7247\u4f5c\u4e3a\u5f00\u673a\u8bc6\u522b\u3002\n# - type= \u4f20\u5165\u4e3a\u56fe\u7247\u683c\u5f0f\uff0ctype\u652f\u6301\u7684\u7c7b\u578b\u5305\u542b\u5728server.ini\u5185\u914d\u7f6e\u9879input_type=jpg,jpeg,png\u3002\n# - power_on= \u4f20\u5165\u7684\u662f\u672c\u5730\u56fe\u7247\u7684\u8def\u5f84\u3002\ntype=FILE_NAME\npower_on=dde-computer\n# \u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\uff08\u6d4b\u8bd5\u673a\u8fde\u63a5\u91c7\u96c6\u76d2\uff0c\u91c7\u96c6\u76d2\u7684\u5206\u8fa8\u7387\uff09\nheight=1080\nwidth=1920\n[AliasA1] ip=10.8.15.86\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n[AliasA2]\nip=10.8.15.20\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_2","title":"3\u3001\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e","text":"\u968f\u7740\u6d4b\u8bd5\u573a\u666f\u7684\u4e0d\u65ad\u5f15\u5165\uff0c\u53d1\u73b0\u73b0\u6709\u670d\u52a1\u7aef\u91cc\u7684\u914d\u7f6e\u9879\u5e76\u4e0d\u9002\u7528\u4e8e\u6240\u6709\u7684\u6027\u80fd\u573a\u666f\uff0c\u4e8e\u662f\u5c06\u670d\u52a1\u7aef\u914d\u7f6e\u8fdb\u884c\u4e00\u4e2a\u63d0\u53d6\uff0c\u53ef\u505a\u5355\u4e2a\u573a\u666f\u7684\u4e2a\u6027\u5316\u914d\u7f6e\uff0c\u5f53\u7136\u539f\u6765\u7684\u670d\u52a1\u7aef\u914d\u7f6e\u529f\u80fd\u4fdd\u7559\uff0c\u53ea\u662f\u5f53\u4f60\u914d\u7f6e\u4e86\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e\u540e\uff0c\u4f18\u5148\u4f7f\u7528\u4e2a\u6027\u5316\u914d\u7f6e\u91cc\u9762\u7684\u5185\u5bb9\uff0c\u4ee5\u4e0b\u662f\u5bf9\u4e2a\u6027\u5316\u914d\u7f6e\u7684\u4ecb\u7ecd\u3002 \u76ee\u524d\u6bcf\u4e00\u4e2a py \u6587\u4ef6\u5bf9\u5e94\u4e00\u4e2a\u6027\u80fd\u6d4b\u8bd5\u573a\u666f\uff0c\u4e8e\u662f\u5728\u540c\u7ea7\u76ee\u5f55\u4e0b\u521b\u5efa\u4e00\u4e2a\u4e0e\u4e4b\u540c\u540d\u7684 json \u6587\u4ef6\uff0c\u4f5c\u4e3a\u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6 apps\n\u251c\u2500\u2500 album\n \u251c\u2500\u2500 test_album_01_start.json # \u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6\n\u2514\u2500\u2500 test_album_01_start.py # \u6027\u80fd\u573a\u666f\u6587\u4ef6\n \u4ee5\u4e0b\u662f\u5bf9 json \u6587\u4ef6\u4e2d\u914d\u7f6e\u7684\u89e3\u91ca\uff0c\u82e5\u67d0\u9879\u914d\u7f6e\u4e0d\u9700\u8981\uff0c\u53ef\u4ee5\u7f3a\u5931\uff0c\u4f46\u4e0d\u80fd\u4e3a\u7a7a\uff1b {\n\"title\": \"test_album_start\", # \u6807\u9898\uff1b\u5fc5\u987b\n\"app_name\": \"deepin-album\", # \u573a\u666f\u6240\u5c5e\u7684\u5e94\u7528\uff1b\u5fc5\u987b\n\"scene\": \"hot\", # \u573a\u666f\u522b\u540d\uff1b\u5fc5\u987b\n\"icon\": [\"deepin-album\"], # \u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684icon\u5230\u670d\u52a1\u7aef\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\uff1b\u53ef\u7f3a\u5931\n# \u6ce8\u610f\uff1a\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684desktop\u6587\u4ef6\u540d\u4e3adeepin-album.desktop\uff0c\n# \u53ea\u9700\u8981\u5199deepin-album\u5373\u53ef\uff0c\u201c.desktop\u201d\u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002\n\"size\": { # \u56fe\u7247\u5bf9\u6bd4\u7684\u533a\u57df\u8bbe\u7f6e\u9879\uff0c\u67d0\u4e9b\u5e94\u7528\u5f53\u524d\u5c4f\u5e55\u7684\u90e8\u5206\u533a\u57df\u9700\u8981\u5c06\u5176\u53bb\u6389\uff0c\u53ef\u4ee5\u8bbe\u7f6e\u6b64\u9879\uff0c\u5982\u679c\u6ca1\u6709\u5219\u53ef\u4e0d\u5199\uff1b\u53ef\u786e\u5b9e\n\"x-coordinate\": 0, # \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n\"y-coordinate\": 0, # \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n\"width\": 850, # \u6a2a\u5411\u957f\u5ea6\n\"height\": 1920 # \u7eb5\u5411\u9ad8\u5ea6\n},\n\"count\": 5, # \u573a\u666f\u6267\u884c\u7684\u6b21\u6570\uff1b\u5fc5\u987b\n\"duration\": 5, # \u8be5\u6761\u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff0c\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7279\u5b9a\u573a\u666f\uff0c\u8be5\u914d\u7f6e\u4e3a\u53ef\u9009\u9879\uff0c\u8986\u76d6 server.ini \u4e2d\u7684\u914d\u7f6e\uff1b\u53ef\u7f3a\u5931\n\"stable_similarity\": 0.9997, # \u6027\u80fd\u573a\u666f\u5206\u9636\u6bb5\u65f6\u7684\u56fe\u7247\u76f8\u4f3c\u5ea6\u5bf9\u6bd4\uff0c\u524d\u540e\u56fe\u7247\u4f4e\u4e8e\u8be5\u503c\uff0c\u5219\u5206\u4e3a\u4e0d\u7a33\u5b9a\u9636\u6bb5\uff1b\u53ef\u7f3a\u5931\n\"find_by\": \"stage\", # \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\n\"final_stable_num\": 100, # \u67e5\u627e\u6700\u540e\u4e00\u4e2a\u5927\u4e8e\u8be5\u503c\u7684\u7a33\u5b9a\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u7684\u5c3e\u796f\uff1b\u53ef\u7f3a\u5931\n\"start_num\": 150,\n\"text\": \"\", # ocr\u8bc6\u522b\u7684\u6587\u6848\n\"match\": \"apps/xxx/images/match.png\", # \u56fe\u50cf\u5339\u914d\u7684\u56fe\u7247\u6587\u4ef6\u8def\u5f84\n\"match_rate\": 0.9 # \u5339\u914d\u76f8\u4f3c\u5ea6\n}\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e94\u3001\u6d4b\u8bd5\u6d41\u7a0b","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516d\u3001\u7528\u4f8b\u7f16\u5199\u53ca\u65b9\u6cd5\u53c2\u6570\u6307\u5f15","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"1\u3001\u7528\u4f8b\u5b9e\u4f8b\u8bf4\u660e","text":"# \u6807\u51c6\u5e93\u5bfc\u5165\nfrom time import sleep\n# \u5bfc\u5165\u4e09\u65b9\u5e93pytest\nimport pytest\n# \u5bfc\u5165\u7528\u4f8b\u6267\u884c\u8981\u7528\u5230\u7684Widget\u7c7b\nfrom src.base_widget import BaseWidget\nclass TestStart:\n# class\u7ea7\u522b\u7684fixture\uff0c\u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u6267\u884c\u3002autouse=True \u81ea\u52a8\u5728\u5f53\u524d\u4f5c\u7528\u57df\u4e0b\u4f7f\u7528\u3002\n@pytest.fixture(scope=\"class\", autouse=True)\n# \u6d4b\u8bd5\u70ed\u542f\u52a8\u4e4b\u524d\u9700\u8981\u9884\u542f\u52a8\u3002\ndef application_pre_start(self):\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().right_click_element(\"deepin-album\")\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().click_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\")\nsleep(2)\n# \u5feb\u6377\u952e\u5173\u95ed\u7a97\u53e3\nBaseWidget().hot_key(\"alt\", \"f4\")\nsleep(2)\n# \u9ed8\u8ba4\u4e3afunction\u7ea7\u522b\u7684fixture\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\uff0cclass\u7ea7\u522bfixture\u6267\u884c\u4e4b\u540e\u6267\u884c\u3002\n@pytest.fixture(autouse=True)\ndef setup_start(self):\n# \u53f3\u952e\u70b9\u51fb deepin-album \u56fe\u6807\nBaseWidget().right_click_element(\"deepin-album\")\n# \u79fb\u52a8\u5230\u53f3\u952e\u83dc\u5355\u4e2d\u6253\u5f00\uff08open.png\uff09\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().move_to(*BaseWidget().find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))\n# \u7b49\u5f85\u79fb\u52a8\u5b8c\u6210\nsleep(0.5)\ndef test_album_start(self):\n# \u70b9\u51fb\u201c\u6253\u5f00\u201d\nBaseWidget().click() \n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"2\u3001\u65b9\u6cd5\u53c2\u6570\u8bf4\u660e","text":"2.1\u3001find_element \u65b9\u6cd5 def find_element(element: str, input_type: str = \"FILE_NAME\", fill_color_position: tuple = (-1, -1), size: tuple = (25, 70)):\npass\n \u53c2\u6570 element \u548c input_type \uff081\uff09\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u5143\u7d20 - `input_type` \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a `FIEL_NAME` \uff0c\u8868\u793a\u901a\u8fc7\u5e94\u7528 `icon` \u5bfb\u627e\u5143\u7d20\uff0c\u6b64\u65b9\u6cd5\u4f1a\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u5e94\u7528 `icon` \u56fe\u6807\u3002\n \u4e3e\u4f8b\uff1a\u9ed8\u8ba4\u60c5\u51b5\u4e0b input_type \u53c2\u6570\u4e0d\u9700\u8981\u4f20\u5165\uff0c find_element(\"deepin-album\")\uff0c\u8868\u793a\u901a\u8fc7 deepin-album \u7684\u5e94\u7528 icon \u6765\u83b7\u53d6\u5750\u6807\uff0c\u6ce8\u610f\uff0c\u6b64\u65f6\u4f20\u5165\u7684 deepin-album \u53c2\u6570\u5b9e\u9645\u662f desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u548c2.3\u4e2d\u7684 icon \u53d8\u91cf\u4e00\u81f4\u3002 \u6211\u4eec\u5efa\u8bae\u4f18\u5148\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\uff0c\u4f46\u6b64\u65b9\u6cd5\u4f9d\u8d56\u7f51\u7edc\uff0c\u8bf7\u6839\u636e\u6d4b\u8bd5\u73af\u5883\u5b9e\u9645\u60c5\u51b5\u9009\u62e9\u3002 \uff082\uff09\u901a\u8fc7\u672c\u5730\u56fe\u7247\u8bc6\u522b\u5143\u7d20 - \u53c2\u6570 `input_type` \u4f20\u5165\u56fe\u7247\u683c\u5f0f\uff0c\u6bd4\u5982\u622a\u53d6\u7684\u672c\u5730\u56fe\u7247\u683c\u5f0f\u4e3a `png`\uff0c\u90a3\u4e48 `input_type=\"png\"`\uff0c\u6b64\u65f6\u53c2\u6570 `element ` \u4f20\u5165\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5efa\u8bae\u5b58\u653e\u5728\u5bf9\u5e94\u7684\u4ea7\u54c1 `apps/app/picture/` \u76ee\u5f55\u4e0b\uff0c\u8def\u5f84\u4e3a\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u7684\u76f8\u5bf9\u8def\u5f84\u3002\n- \u4e3e\u4f8b\uff1a`find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))`\uff0c\u8868\u793a\u901a\u8fc7\u672c\u5730\u56fe\u7247 `open.png` \u8bc6\u522b\u5143\u7d20\u3002\n \u53c2\u6570 fill_color_position fill_color_position \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (-1, -1)\uff0c(-1, -1) \u8868\u793a\u53d6\u5c4f\u5e55\u4e2d\u53f3\u4e0b\u89d2\u6700\u540e\u4e00\u4e2a\u50cf\u7d20\u70b9\u4f5c\u4e3a\u586b\u5145\u5750\u6807\uff0c\u5728 1920x1080 \u5c4f\u5e55\u5206\u8fa8\u7387\u4e0b\u5373\u5b9e\u9645\u5750\u6807\u4e3a (1919, 1079) \uff0c\u8fd9\u6837\u7684\u5199\u6cd5\u53ef\u4ee5\u9002\u914d\u4e0d\u540c\u5927\u5c0f\u7684\u5c4f\u5e55\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0d\u540c\u65b9\u4f4d\uff1a \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0b\u65b9\uff0c\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u4e0d\u9700\u8981\u4f20\u5165\u8be5\u53c2\u6570\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u5de6\u8fb9\uff0cfill_color_position=(1, 1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u53f3\u8fb9\uff0cfill_color_position=(-1, -1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0a\u8fb9\uff0cfill_color_position=(1, 1) \u4ece\u684c\u9762\u542f\u52a8\u5e94\u7528\uff0c\u5219\u9700\u8981\u4f20\u5165\u9664\u4efb\u52a1\u680f\u4ee5\u5916\u5176\u4ed6\u4f4d\u7f6e\u7684\u5750\u6807\uff0c\u6bd4\u5982(100, 100)\uff0c\u53ea\u8981\u8fd9\u4e2a\u5750\u6807\u4e3a\u9664\u5e94\u7528\u548c\u4efb\u52a1\u680f\u533a\u57df\u90fd\u53ef\u4ee5\u3002 \u4ece\u542f\u52a8\u5668\u91cc\u9762\u542f\u52a8\u5e94\u7528\uff0c\u9700\u8981\u586b\u5145\u7684\u5750\u6807\u4e3a\u542f\u52a8\u5668\u533a\u57df\u3002 \u6ce8\uff1a\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u65f6\uff0c\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684 icon \u539f\u6587\u4ef6\u4e3a svg \u77e2\u91cf\u56fe\uff0c\u8f6c\u6362\u4e3a png \u4e4b\u540e\u9700\u8981\u586b\u5145\u8fb9\u7f18\u900f\u660e\u90e8\u5206\u3002 \u53c2\u6570 size size \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (25, 70)\uff0c\u8868\u793a\u6d4b\u8bd5\u673a\u4e0a dock \u680f\u4e0a\u5e94\u7528\u56fe\u6807\u7684\u5927\u5c0f\u8303\u56f4\u3002 UOS \u7cfb\u7edf dock \u680f\u662f\u53ef\u4ee5\u4e0a\u4e0b\u62d6\u52a8\u5927\u5c0f\u7684\uff0c\u968f\u7740 dock \u680f\u5927\u5c0f\u6539\u53d8\uff0c\u5e94\u7528\u56fe\u6807\u7684\u8303\u56f4\u4e3a25\u523070\u4e4b\u95f4\u3002 \u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u64cd\u4f5c\u7cfb\u7edf\u4e0a dock \u680f\u5927\u5c0f\u4e0d\u4e00\u6837\uff0c\u53ef\u4ee5\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u4f20\u5165\u5927\u5c0f\u8303\u56f4\u3002 2.2\u3001click_element\u3001 right_click_element\uff0c double_click_element \u8fd9\u51e0\u4e2a\u65b9\u6cd5\u53c2\u6570\u89c4\u5219\u4e0e find_element \u65b9\u6cd5\u4e00\u6837\u3002\u4ed6\u4eec\u5b9e\u9645\u4e0a\u662f\u5728 find_element \u65b9\u6cd5\u57fa\u7840\u4e4b\u4e0a\u505a\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u589e\u52a0\u4e86\u9f20\u6807\u7684\u52a8\u4f5c\uff0c\u5982\u679c\u4f60\u4e0d\u60f3\u4f7f\u7528\u8fd9\u51e0\u4e2a\u65b9\u6cd5\uff0c\u5728\u7528\u4f8b\u4e2d\u4e5f\u53ef\u4ee5\u901a\u8fc7 find_element \u83b7\u53d6\u5230\u5750\u6807\uff0c\u7136\u540e\u5c06\u5750\u6807\u4f20\u5165\u5230\u952e\u9f20\u7684\u65b9\u6cd5\u4e2d\uff0c\u53ef\u4ee5\u5b9e\u73b0\u540c\u6837\u7684\u6548\u679c\u3002 2.3\u3001\u7528\u4f8b\u7c7b\u4e2d\u6709\u4e2a\u7c7b\u53d8\u91cf icon = [\"deepin-album\"] \u9700\u8981\u7279\u6b8a\u8bf4\u660e\uff0c\u5217\u8868\u4e2d\u7684\u5143\u7d20\u4e3a\u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709 icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684 icon \u5230\u670d\u52a1\u7aef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528 desktop \u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684 desktop \u6587\u4ef6\u540d\u4e3a deepin-album.desktop\uff0c\u53ea\u9700\u8981\u5199 deepin-album \u5373\u53ef\uff0c.desktop \u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e03\u3001\u6267\u884c\u5165\u53e3","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"1\u3001\u7528\u4f8b\u7ec4\u7ec7","text":"\u5728 setting/config/server.ini \u6587\u4ef6\u4e2d APP_NAME= \u5b57\u6bb5\u4e3a\u7528\u4f8b\u7684\u6267\u884c\u7684\u76ee\u5f55\uff0c\u9ed8\u8ba4\u4e3a apps \u76ee\u5f55\u4e0b\u6240\u6709\u7528\u4f8b\u3002\u5982\u679c\u4f60\u60f3\u6307\u5b9a\u6267\u884c\u67d0\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4f60\u53ef\u4ee5\u5c06\u8be5\u914d\u7f6e\u9879\u6307\u5b9a\u5230\u5e94\u7528\u7684\u7528\u4f8b\u76ee\u5f55\uff0c\u6bd4\u5982\uff1aAPP_NAME=deepin_album\uff0c \u8868\u793a\u6267\u884c\u76f8\u518c\u76ee\u5f55\u4e0b\u7684\u7528\u4f8b\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a python3 manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music\n -k KEYWORDS, --keywords KEYWORDS\n \u7528\u4f8b\u7684\u5173\u952e\u8bcd\n -t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e\n --log_level LOG_LEVEL \u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n --env {host,docker} \u5728\u5bbf\u4e3b\u673a\u6216\u5bb9\u5668\u73af\u5883\u6267\u884c\n --client_alias \u9009\u62e9\u6d4b\u8bd5\u673a\u522b\u540d, \u53ef\u9009\u9879\u4e3aclient.ini\u4e2d\u5df2\u914d\u7f6e, \u9ed8\u8ba4\u503c\u4e3a zx-x86.\n --count \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a python3 manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\" --env docker\n \u6ce8\uff1a\u5728\u5bb9\u5668\u4e2d\u6267\u884c\u65f6\uff0c\u82e5\u5f3a\u5236\u9000\u51fa\uff0c\u5bb9\u5668\u5e76\u4e0d\u4f1a\u505c\u6b62\u8fd0\u884c\uff01"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_9","title":"\u516b\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1json","title":"1\u3001Json \u62a5\u544a","text":"\u81ea\u7814\u89c6\u9891\u89e3\u6790\u5de5\u5177\u4f1a\u5bf9\u5355\u6761\u7528\u4f8b\u6267\u884c\u4e00\u8f6e\u751f\u6210\u4e00\u4e2a json \u6587\u4ef6\uff0c\u5b58\u653e\u4e8e report/{app_name}/{scene}/{run_num} \u76ee\u5f55\u4e0b\uff0c\u547d\u540d\u683c\u5f0f\u4e3a\uff1a report.json json \u5185\u5bb9\u4e3e\u4f8b\uff1a [\n{\n\"Stab1\": {\n\"images\": [1,2...150,151],\n\"startStub\": 0,\n\"type\": \"Stab\"\n}\n},\n{\n\"Stab2\": {\n\"images\": [152,153...169,170],\n\"startStub\": 1,\n\"type\": \"UnStab\"\n}\n},\n{\n\"Stab3\": {\n\"images\": [171,172...300,301],\n\"startStub\": 0,\n\"type\": \"UnStab\"\n}\n}\n]\n \u8bf4\u660e\uff1a Stab \uff1a\u8868\u793a\u89e3\u6790\u8fc7\u7a0b\u4e2d\u4e0d\u540c\u7684\u9636\u6bb5\u3002 images \uff1a\u8868\u793a\u6bcf\u4e00\u5e27\u7684\u56fe\u7247\u5e8f\u53f7\u3002 startStub\uff1a \u4e3a\u8bc6\u522b\u5c3e\u5e27\u7684\u9636\u6bb5\u8868\u793a\uff0c\u5982\u679c \"startStub\": 1 \uff0c\u8bf4\u660e\u5c3e\u5e27\u51fa\u73b0\u5728\u8be5\u9636\u6bb5\u3002 type\uff1a \u4e3a Stab \u6216 UnStab \uff0c\u8868\u793a\u7a33\u5b9a\u9636\u6bb5\u6216\u4e0d\u7a33\u5b9a\u9636\u6bb5\u3002 \u5404\u9636\u6bb5\u6709\u5e27\u6570\u8865\u507f\uff0c\u9ed8\u8ba4\u8865\u507f\u7684\u5e27\u6570\u4e3a 3 \u5e27\uff08\u53ef\u4ee5\u901a\u8fc7 server.ini \u91cc\u9762 un_stab_start=3 \u8fdb\u884c\u914d\u7f6e\uff09\uff0c\u8868\u793a\u5c0f\u4e8e\u7b49\u4e8e 3 \u5e27\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u524d\u540e\u5747\u9700\u8981\u51cf\u6389\u3002 \u5e94\u7528\u542f\u52a8\u9636\u6bb5\u5c31\u662f\u5728 Stab2 \u9636\u6bb5\uff0c\u542f\u52a8\u65f6\u95f4\u4e3a\uff1a171 \u51cf 151 \u518d\u51cf\u6389\u524d\u540e\u8865\u507f\u5e27\u6570 6 \u5e27\uff0c\u5373 14 \u5e27\uff0c\u89c6\u9891\u5e27\u7387 30 \u5e27/\u79d2\uff0c\u56e0\u6b64\u542f\u52a8\u8017\u65f6\u4e3a\uff1a14 * 33 = 462 ms"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2excel","title":"2\u3001Excel \u62a5\u544a","text":"\u6240\u6709\u7528\u4f8b\u6267\u884c\u5e76\u89e3\u6790\u5b8c\u4e4b\u540e\u4f1a report \u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a\u6c47\u603b\u6570\u636e\u7684 Excel \u6587\u4ef6\uff0c\u6587\u4ef6\u540d\u4e3a\uff1a{time}_perf_time.xlsx\u3002 \u6ce8\u610f\uff0creport \u76ee\u5f55\u4e3a\u53ef\u914d\u7f6e\u9879\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u4f1a\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u751f\u6210\uff0c\u5982\u679c\u4f60\u5c06 report\uff0c\u6307\u5b9a\u5230\u9879\u76ee\u4e0b\u5176\u4ed6\u8def\u5f84\uff0c\u5219\u4f1a\u5728\u5bf9\u5e94\u7684\u8def\u5f84\u4e0b\u751f\u6210 json \u548c Excel \u6587\u4ef6\u3002 \u4f60\u4e5f\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8bfb\u53d6\u6240\u6709 json / excel \u62a5\u544a\u7684\u6570\u636e\uff0c\u751f\u6210\u4f60\u81ea\u5df1\u60f3\u8981\u7684\u4e00\u4e9b\u6d4b\u8bd5\u62a5\u544a\u5f62\u5f0f\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#usb","title":"\u4e5d\u3001USB \u4e32\u53e3\u9a71\u52a8\u952e\u9f20\u65b9\u6cd5","text":"\u4f4d\u4e8e src/utils/control/serial_communication \u76ee\u5f55\u4e0b\u7684 usb_mk.py \u6587\u4ef6 usb_mk = UsbMk()\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up()\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u652f\u6301\u4f20\u5165\u6c49\u5b57\uff0c\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click()\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() \n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() \n \uff084\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() \n \uff085\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() \n \uff086\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() \n \uff087\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff088\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff0810\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_10","title":"\u5341\u3001\u7ee7\u7535\u5668\u63a7\u5236\u4e3b\u673a\u5f00\u673a/\u91cd\u542f","text":"\uff08\u82e5\u4e0d\u4f7f\u7528\u7ee7\u7535\u5668\uff0c\u53ef\u5ffd\u7565\u8be5\u6b65\u9aa4\uff0c\u6267\u884c\u65f6\u4f1a\u901a\u8fc7\u547d\u4ee4 reboot\uff09"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u7ee7\u7535\u5668\u8bbe\u5907","text":"LCUS-2 \u578b \u53cc\u8def USB \u667a\u80fd\u4e32\u53e3\u63a7\u5236\u7ee7\u7535\u5668\u3002 https://item.taobao.com/item.htm?spm=a1z09.2.0.0.41d72e8dUYx2pi&id=582653718178&_u=i25r20ia6a2e "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2usb","title":"2\u3001USB \u5ef6\u957f\u7ebf","text":"\u666e\u901a\u7684 USB \u7ebf\u5373\u53ef\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_3","title":"3\u3001\u675c\u90a6\u7ebf","text":"3.1\u300140P \u6bcd\u5bf9\u516c\u675c\u90a6\u7ebf\u3002 3.2\u3001\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"4\u3001\u5b89\u88c5\u56fe\u6587\u6559\u7a0b","text":"4.1\u3001\u4f7f\u7528 USB \u5ef6\u957f\u7ebf\u8fde\u63a5\u63a7\u5236\u7aef\u548c\u7ee7\u7535\u5668\u3002 4.2\u3001\u5728\u7ee7\u7535\u5668\u5e38\u7aef\u548c\u516c\u5171\u7aef\u5747\u8fde\u63a5\u4e00\u6839\u675c\u90a6\u7ebf\u3002 4.3\u3001\u5728\u4e3b\u677f\u4e0a\u5f00\u673a\u9488\u548c\u91cd\u542f\u9488\u4e0a\u63d2\u4e0a\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 4.4\u3001\u5c06\u5f00\u673a\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76841\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1\u5de6\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 4.5\u3001\u5c06\u91cd\u542f\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76842\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1 \u53f3\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 \u82e5\u60f3\u4fdd\u7559\u539f\u7535\u6e90\u5f00\u5173\u7684\u7535\u6e90\u706f\uff0c\u53ef\u6839\u636e\u5982\u4e0a\u56fe\u6240\u793a\uff0c\u4f7f\u7528\u675c\u90a6\u7ebf\u8fde\u63a5\u4e3b\u677f\u4e0a\u7684\u7535\u6e90\u706f\u548c\u539f\u7535\u6e90\u5f00\u5173"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_11","title":"\u5341\u4e00\u3001\u5e38\u89c1\u95ee\u9898\u8bf4\u660e","text":"1\u3001ERROR: for uos Cannot restart container 2301b1a1395d7959ee6523d61b61c87084649af530786cdb8fb5b3ecbcbd1068: linux runtime spec devices: error gathering device information while adding custom device \"/dev/ttyACM0\": no such file or directory \u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u8fde\u63a5\u72b6\u6001\uff0c\u67e5\u770b /dev/ttyACM0 \u662f\u5426\u5b58\u5728\uff0c\u82e5\u5b58\u5728 /dev/ttyACMn\uff08n\u4e3a\u4efb\u610f\u6570\u5b57\uff09\uff0c\u91cd\u542f\u7535\u8111\u89e3\u51b3\u3002 2\u3001Error response from daemon: Container 5e700fdc769e8c74666d68a7f2bc3de58268b4594cf88706609d59f8dbc7362d is not running \u5bb9\u5668\u542f\u52a8\u5931\u8d25 1\uff09\u68c0\u67e5\u54ea\u4e00\u4e2a\u5bb9\u5668\u672a\u542f\u52a8 sudo docker container ls # \u5217\u51fa\u8fd0\u884c\u4e2d\u7684 Docker \u5bb9\u5668\n 2\uff09\u7f3a\u5c11 uos \u5bb9\u5668\uff0c\u68c0\u67e5 USB \u4e32\u53e3\u8fde\u63a5\u7ebf\u548c\u91c7\u96c6\u76d2\u8fde\u63a5\u7ebf\u662f\u5426\u6b63\u5e38\uff0c\u91cd\u542f\u540e\u6267\u884c bash install/setup.up # \u91cd\u65b0\u5b8c\u6574\u90e8\u7f72\u73af\u5883\n \u6216\u6267\u884c sudo docker-compose up -d --build # \u4ec5\u91cd\u65b0\u6784\u5efa Docker \u955c\u50cf\n 3\u3001\u82e5\u90e8\u7f72\u65f6\u63d0\u793a\u6302\u8f7d ttyACM0\u3001video0 \u5931\u8d25\uff0c\u8bf7\u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u53ca\u91c7\u96c6\u76d2\u662f\u5426\u63a5\u89e6\u826f\u597d\uff0c\u82e5\u63a5\u89e6\u826f\u597d\uff0c\u91cd\u542f\u5373\u53ef\u89e3\u51b3\u3002 4\u3001\u82e5\u51fa\u73b0\u56fe\u7247\u80fd\u8bc6\u522b\uff0c\u4f46\u662f\u9f20\u6807\u672a\u79fb\u52a8\u64cd\u4f5c\u65f6\uff0c\u5b89\u88c5\u7edd\u5bf9\u9f20\u6807\u64cd\u4f5c\u7684\u4f9d\u8d56\u5305\uff0c\u89c1\u7b2c\u4e09\u8282\u7b2c\u4e8c\u5c0f\u8282\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u6d4b\u8bd5\u673a\u3002 5\u3001\u7531\u4e8e\u901a\u8fc7\u91c7\u96c6\u5361\u83b7\u53d6\u7684\u6d4b\u8bd5\u673a\u5b9e\u65f6\u753b\u9762\uff0c\u5305\u542b\u4e86\u9f20\u6807\u7684\u6837\u5f0f\uff0c\u6240\u4ee5\u5bf9\u56fe\u7247\u8bc6\u522b\u65f6\uff0c\u9f20\u6807\u82e5\u505c\u7559\u5728\u56fe\u6807\u4e0a\u5c42\uff0c\u5219\u4f1a\u5bf9\u8bc6\u522b\u7ed3\u679c\u9020\u6210\u5f71\u54cd\uff0c\u9700\u8981\u5c06\u9f20\u6807\u79fb\u52a8\u81f3\u5176\u4ed6\u4f4d\u7f6e\uff0c\u6216\u8005\u9690\u85cf\u9f20\u6807\u89e3\u51b3\u3002 6\u3001Excel \u62a5\u544a\u4e2d\uff0c\u6d4b\u8bd5\u573a\u666f\u5217\u4e0e\u7528\u4f8b\u4e2d\u7684\u4e0d\u4e00\u81f4\uff0c\u5173\u952e\u5b57scene\u3001app_name\u3001\u67b6\u6784\u522b\u540d\uff0c\u4e0d\u80fd\u5305\u542b\u4e0b\u5212\u7ebf\u548c\u82f1\u6587\u7b26\u53f7\u7684\u5706\u62ec\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/","title":"\u6846\u67b6\u529f\u80fd\u4ecb\u7ecd","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2023/1/12\n# Author : Mikigo\n# =============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_2","title":"\u4e00\u3001\u4e00\u53e5\u8bdd\u7b80\u4ecb","text":"\u6b64\u6587\u6863\u4e3b\u8981\u60f3\u5bf9 YouQu \u6846\u67b6\u4e00\u4e9b\u91cd\u70b9\u7684\u529f\u80fd\u505a\u8be6\u7ec6\u7684\u4ecb\u7ecd\uff0c\u5305\u62ec\u5bf9\u4e00\u4e9b\u529f\u80fd\u5f00\u53d1\u7684\u80cc\u666f\u3001\u8981\u89e3\u51b3\u7684\u95ee\u9898\u3001\u5b9e\u73b0\u903b\u8f91\u3001\u4ee3\u7801\u7b49\u65b9\u9762\u7684\u4ecb\u7ecd\uff0c\u4ee5\u6b64\u8ba9\u5927\u5bb6\u80fd\u66f4\u52a0\u6e05\u6670\u7684\u7406\u89e3\u5404\u9879\u529f\u80fd\uff0c\u4ece\u800c\u5728\u4f7f\u7528\u7684\u65f6\u5019\u80fd\u66f4\u52a0\u7684\u5f97\u5fc3\u5e94\u624b\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_3","title":"\u4e8c\u3001\u56fe\u50cf\u8bc6\u522b","text":"\u56fe\u50cf\u8bc6\u522b\u5728 UI \u81ea\u52a8\u5316\u4e2d\u662f\u4e0d\u53ef\u7f3a\u5c11\u7684\uff0c\u5e02\u9762\u4e0a\u751a\u81f3\u6709\u5b8c\u5168\u57fa\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\uff0c\u6bd4\u5982 Airtest\u3001Sikuli \u7b49\uff0c\u5728\u6e38\u620f\u7b49\u7279\u5b9a\u9886\u57df\u4e5f\u6709\u4e0d\u9519\u7684\u6548\u679c\uff0c\u8fd9\u4e9b\u5de5\u5177\u5b9e\u9645\u4e0a\u4e5f\u662f\u7528\u7684 OpenCV \u8fdb\u884c\u4e86\u5c01\u88c5\uff0cYouQu \u6846\u67b6\u57fa\u4e8e OpenCV \u5f00\u53d1\u4e86\u81ea\u5df1\u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\uff0c\u5b83\u53ef\u4ee5\u65b9\u4fbf\u7684\u7528\u4e8e\u754c\u9762\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u65ad\u8a00\uff1b YouQu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u51e0\u4e4e\u6ee1\u8db3\u4e86\u4f60\u7684\u6240\u6709\u8981\u6c42\uff0c\u6211\u4eec\u5728\u957f\u65f6\u95f4\u7684\u601d\u8003\u548c\u6478\u7d22\u4e2d\uff0c\u9488\u5bf9\u5e38\u89c4\u573a\u666f\u53ca\u4e00\u4e9b\u7279\u6b8a\u573a\u666f\u63a2\u7d22\u9664\u4e86\u4e00\u4e9b\u5b9e\u7528\u4e14\u6709\u6548\u7684\u65b9\u6848\uff0c\u4e14\u542c\u6211\u6162\u6162\u9053\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1","title":"1\u3001\u5e38\u89c4\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5e38\u89c4\u8bc6\u522b\u5f88\u597d\u7406\u89e3\uff0c\u4e00\u53e5\u8bdd\u8bb2\u5c31\u662f\uff0c\u8981\u83b7\u53d6\u5230\u76ee\u6807\u5143\u7d20\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u3002 \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u5728\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u9700\u8981\u83b7\u53d6\u7684\u5750\u6807\u662f\u76f8\u5bf9\u4e8e\u6574\u4e2a\u5c4f\u5e55\u7684\u5750\u6807\uff0c\u6211\u4eec\u53ef\u4ee5\u622a\u53d6\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u56fe\u7247\uff08screen\uff09\uff1b \u5728\u5143\u7d20\u8bc6\u522b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u622a\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5c0f\u56fe\u8fdb\u884c\u8bc6\u522b\uff0c\u6bd4\u5982\u622a\u53d6\u64ad\u653e\u6309\u94ae\uff1a \u90a3\u4e48\u5b9e\u9645\u4e0a\uff0c\u5143\u7d20\u5b9a\u4f4d\u7684\u95ee\u9898\u5c31\u8f6c\u6362\u4e3a\uff0c\u5c06\u622a\u56fe\u7684\u5c0f\u56fe\uff08play_btn\uff09\u62ff\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u5927\u56fe\uff08screen\uff09\u4e2d\u53bb\u505a\u5339\u914d\uff0c\u5982\u679c\u5339\u914d\u6210\u529f\uff0c\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff08 x, y \uff09\u5373\u53ef\u3002 \u4e3a\u4e86\u65b9\u4fbf\u63cf\u8ff0\uff0c\u4ee5\u4e0b\u6211\u5c06\u6574\u4e2a\u5c4f\u5e55\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5927\u56fe\uff0c\u67d0\u4e2a\u5143\u7d20\u56fe\u7247\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5c0f\u56fe\u3002 \u57fa\u4e8e OpenCV \u7684\u6a21\u677f\u5339\u914d cv.matchTemplate() \u529f\u80fd\uff0c\u6211\u4eec\u5b9e\u73b0\u4e86\u56fe\u50cf\u5b9a\u4f4d\u7684\u529f\u80fd\uff0c\u6846\u67b6\u63d0\u4f9b\u4e86\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u5e95\u5c42\u63a5\u53e3\uff08\u4e00\u822c\u4e0d\u5bf9\u4e0a\u5c42\u63d0\u4f9b\u8c03\u7528\uff09\uff1a def _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\n# \u8be6\u7ec6\u4ee3\u7801\u592a\u957f\u4e0d\u8d34\u4e86\uff0c\u611f\u5174\u8da3\u8bf7\u67e5\u770b\u6e90\u7801\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001image_path image_path \u662f\u5c0f\u56fe\u7684\u7edd\u5bf9\u8def\u5f84; \u901a\u5e38\u5728 AT \u5de5\u7a0b\u91cc\u9762\uff0c\u6211\u4eec\u7ea6\u5b9a\u5c06\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u5b9e\u9645\u7684\u5143\u7d20\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1aplay_btn.png \uff1b \u7528\u4e8e\u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 case/assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1amusic_001.png \uff1b \u8fd9\u6837\u662f\u4e3a\u4e86\u65b9\u4fbf\u7ba1\u7406\u548c\u7ef4\u62a4\u3002 2\u3001rate \u56fe\u50cf\u8bc6\u522b\u7684\u7684\u5339\u914d\u5ea6\u6216\u8005\u8bf4\u76f8\u4f3c\u5ea6\uff0c\u6846\u67b6\u9ed8\u8ba4\u7684\u914d\u7f6e\u4e3a 0.9\uff0c\u4e5f\u5c31\u662f\u8bf4\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u5b58\u5728\u4e00\u4e2a\u76f8\u4f3c\u5ea6 90% \u7684\u56fe\u6807\u5373\u8fd4\u56de\u5176\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff1b \u5982\u679c\u4f60\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u8c03\u6574\u8bc6\u522b\u5ea6\uff0c\u4f60\u53ef\u4ee5\u5728\u8c03\u7528\u51fd\u6570\u7684\u65f6\u5019\uff0c\u4f20\u5165\u4e0d\u540c\u7684\u8bc6\u522b\u5ea6\u7684\u503c\u3002 3\u3001multiple \u9ed8\u8ba4\u60c5\u51b5\u4e0b multiple=False\uff0c\u8868\u793a\u53ea\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u7b2c\u4e00\u4e2a\uff0c\u5982\u679c multiple=True \u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\uff0c\u56e0\u4e3a\u5927\u56fe\u4e2d\u53ef\u80fd\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u5c0f\u56fe\uff0c\u5728\u67d0\u4e9b\u573a\u666f\u4e0b\u4f60\u53ef\u80fd\u9700\u8981\u5168\u90e8\u83b7\u53d6\u5230\u6240\u6709\u5339\u914d\u5230\u7684\u5750\u6807\u3002 4\u3001picture_abspath \u9ed8\u8ba4\u60c5\u51b5\u4e0b picture_abspath=None \u8868\u793a\u5927\u56fe\u4e3a\u622a\u53d6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u5982\u679c\u4f60\u4e0d\u5e0c\u671b\u5927\u56fe\u662f\u5c4f\u5e55\u7684\u622a\u56fe\uff0c\u800c\u662f\u4f60\u81ea\u5b9a\u4e49\u4f20\u5165\u7684\u67d0\u4e2a\u56fe\u7247\uff0c\u4f60\u53ea\u9700\u8981\u5c06\u4f60\u7684\u56fe\u7247\u8def\u5f84\u4f20\u9012\u7ed9\u8fd9\u4e2a\u53c2\u6570\u5c31\u884c\uff0c\u6bd4\u5982\uff1a picture_abspath=\"~/Desktop/big.png\" \uff1b 5\u3001screen_bbox \u5927\u56fe\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u622a\u53d6\u6574\u4e2a\u5c4f\u5e55\uff0cscreen_bbox = [x, y, w, h] \u53ef\u4ee5\u6307\u5b9a\u622a\u53d6\u5c4f\u5e55\u4e2d\u7684\u56fa\u5b9a\u533a\u57df\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\uff0c\u53ef\u4ee5\u6392\u9664\u90e8\u5206\u533a\u57df\u5bf9\u8bc6\u522b\u7ed3\u679c\u7684\u5f71\u54cd\u3002 \u3010\u9690\u5f0f\u7b49\u5f85\u3011 \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\uff0c\u6709\u65f6\u5019\u9875\u9762\u8df3\u8f6c\u6709\u5ef6\u65f6\uff0c\u6709\u53ef\u80fd\u5b58\u5728\u8bc6\u522b\u7684\u90a3\u4e00\u523b\u9875\u9762\u4e5f\u6ca1\u6709\u8df3\u8f6c\u51fa\u6765\uff0c\u6216\u8005\u6216\u8005\u8bc6\u522b\u7684\u90a3\u4e00\u523b\uff1b \u56e0\u6b64\u6211\u4eec\u9700\u8981\u4e00\u79cd\u7b49\u5f85\u673a\u5236\uff0c\u5373\u5728\u4e00\u5b9a\u7684\u65f6\u95f4\u5185\uff0c\u5982\u679c\u8bc6\u522b\u4e0d\u5230\uff0c\u91cd\u590d\u53bb\u8bc6\u522b\uff1a def find_image(\ncls,\n*widget, rate: [float, int] = None,\nmultiple: bool = False,\nmatch_number: int = None,\npicture_abspath: str = None,\nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u5728\u5c4f\u5e55\u4e2d\u533a\u5bfb\u627e\u5c0f\u56fe\uff0c\u8fd4\u56de\u5750\u6807\uff0c\n \u5982\u679c\u627e\u4e0d\u5230\uff0c\u6839\u636e\u914d\u7f6e\u91cd\u8bd5\u6b21\u6570\uff0c\u6bcf\u6b21\u95f4\u96941\u79d2\n :param widget: \u6a21\u677f\u56fe\u7247\u8def\u5f84\n :param rate: \u76f8\u4f3c\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param match_number: \u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\n :return: \u5750\u6807\u5143\u7ec4\n \"\"\"\nif rate is None:\nrate = float(GlobalConfig.IMAGE_RATE)\ntry:\nfor element in widget:\nfor _ in range((match_number or int(GlobalConfig.IMAGE_MATCH_NUMBER)) + 1):\nlocate = cls._match_image_by_opencv(\nelement,\nrate,\nmultiple=multiple,\npicture_abspath=picture_abspath,\nscreen_bbox=screen_bbox\n)\nif not locate:\nsleep(int(GlobalConfig.IMAGE_MATCH_WAIT_TIME))\nelse:\nreturn locate\nraise TemplateElementNotFound(*widget)\nexcept Exception as e:\nraise e\n \u53c2\u6570 match_number \u7528\u4e8e\u63a7\u5236\u91cd\u590d\u8bc6\u522b\u7684\u6b21\u6570\uff0c\u9ed8\u8ba4\u4e0d\u4f20\u53c2\uff0c\u53d6\u5168\u5c40\u914d\u7f6e setting/globalconfig.ini \u91cc\u9762\u7684 IMAGE_MATCH_NUMBER \u914d\u7f6e\u9879\u7684\u503c\uff0c\u9ed8\u8ba4IMAGE_MATCH_NUMBER = 1\uff0c\u5373\u91cd\u8bd5 1 \u6b21\uff1b find_image \u662f\u6846\u67b6\u63d0\u4f9b\u7684\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u51fd\u6570\u63a5\u53e3\uff0c\u8fd9\u4e2a\u51fd\u6570\u63d0\u4f9b\u4e86\u9690\u5f0f\u7b49\u5f85\u7684\u529f\u80fd\uff0c\u4e14\u5305\u542b\u4e0a\u9762\u4ecb\u7ecd\u7684 _match_image_by_opencv \u51fd\u6570\u7684\u6240\u6709\u529f\u80fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2","title":"2\u3001\u6c14\u6ce1\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u6c14\u6ce1\u8bc6\u522b\u6307\u7684\u662f\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\u8981\u5b9a\u4f4d\u7684\u5143\u7d20\u662f\u4e00\u4e9b\u4f1a\u6d88\u5931\u7684\u5c0f\u5f39\u7a97\uff0c\u8fd9\u7c7b\u573a\u666f\u5728\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\u5c31\u53ef\u80fd\u5b58\u5728\u4e0d\u7a33\u5b9a\u6027\uff0c\u6709\u53ef\u80fd\u56fe\u50cf\u8bc6\u522b\u7684\u65f6\u5019\u6c14\u6ce1\u5df2\u7ecf\u6d88\u5931\u4e86\uff0c\u4e5f\u6709\u53ef\u80fd\u6c14\u6ce1\u51fa\u73b0\u7684\u65f6\u95f4\u592a\u77ed\u4e86\uff0c\u4e0d\u5bb9\u6613\u6355\u6349\u5230\uff0c\u5c31\u50cf\u6c14\u6ce1\u4e00\u6837\uff0c\u51fa\u73b0\u4e00\u4e0b\u5c31\u6d88\u5931\uff0c\u56e0\u6b64\u6211\u4eec\u5f62\u8c61\u7684\u79f0\u4e4b\u4e3a \u201c\u6c14\u6ce1\u8bc6\u522b\u201d\uff1b \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u4e3a\u4e86\u80fd\u7a33\u5b9a\u7684\u8bc6\u522b\u6c14\u6ce1\u7c7b\u573a\u666f\uff0c\u6211\u4eec\u91c7\u7528\u7684\u65b9\u6848\u662f\uff1a \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\uff08\u5305\u542b\u6c14\u6ce1\u4ece\u51fa\u73b0\u5230\u6d88\u5931\uff09\uff0c\u4e0d\u505c\u7684\u622a\u53d6\u8fd9\u6bb5\u65f6\u95f4\u5185\u7684\u5927\u56fe\uff0c\u4ee5\u6b64\u786e\u4fdd\u5728\u622a\u53d6\u7684\u4e00\u5806\u56fe\u7247\u4e2d\uff0c\u80af\u5b9a\u6709\u81f3\u5c11\u4e00\u5f20\u56fe\u7247\u80fd\u6355\u6349\u5230\u6c14\u6ce1\uff0c\u6700\u540e\u518d\u5bf9\u8fd9\u4e00\u5806\u56fe\u7247\u9010\u4e2a\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def get_during(\ncls,\nimage_path: str,\nscreen_time: [float, int],\nrate: float = None,\npause: [int, float] = None,\nmax_range: int = 10000\n):\n\"\"\"\n \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u622a\u56fe\u591a\u5f20\u56fe\u7247\u8fdb\u884c\u8bc6\u522b\uff0c\u5176\u4e2d\u6709\u4e00\u5f20\u56fe\u7247\u8bc6\u522b\u6210\u529f\u5373\u8fd4\u56de\u7ed3\u679c;\n \u9002\u7528\u4e8e\u6c14\u6ce1\u7c7b\u7684\u65ad\u8a00\uff0c\u6bd4\u5982\u6c14\u6ce1\u57281\u79d2\u5185\u6d88\u5931\uff0c\u5982\u679c\u7528\u5e38\u89c4\u7684\u56fe\u50cf\u8bc6\u522b\u5219\u6709\u53ef\u80fd\u65e0\u6cd5\u8bc6\u522b\u5230\uff1b\n :param image_path: \u8981\u8bc6\u522b\u7684\u6a21\u677f\u56fe\u7247\uff1b\n :param screen_time: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff1b\n :param rate: \u8bc6\u522b\u7387\uff1b\n :param pause: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u4e0d\u95f4\u9694\uff1b\n :param max_range: \u622a\u56fe\u7684\u6700\u5927\u6b21\u6570\uff0c\u8fd9\u662f\u4e00\u4e2a\u9884\u8bbe\u503c\uff0c\u4e00\u822c\u60c5\u51b5\u4e0b\u4e0d\u6d89\u53ca\u4fee\u6539\uff1b\n \"\"\"\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001screen_time \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5728\u6b64\u65f6\u95f4\u5185\u4f1a\u4e0d\u65ad\u7684\u8fdb\u884c\u622a\u56fe\u64cd\u4f5c\uff0c\u5c31\u50cf\u5f55\u5236\u89c6\u9891\u4e00\u6837\uff1b 2\u3001pause \u6bcf\u6b21\u622a\u53d6\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u4e00\u523b\u4e0d\u505c\u7684\u622a\u56fe\uff0c\u5982\u679c\u4f60\u60f3\u6bcf\u6b21\u622a\u56fe\u5b58\u5728\u4e00\u4e9b\u95f4\u9694\u65f6\u95f4\u4f20\u5165\u5bf9\u5e94\u7684\u65f6\u95f4\u95f4\u9694\u5373\u53ef\uff0c\u5355\u4f4d\u662f\u79d2\uff0c\u6bd4\u5982\uff1apause = 0.03\uff0c\u8868\u793a 30 ms\uff0c\u76f8\u5f53\u4e8e\u5e27\u7387\u4e3a 30 \u5e27\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-opencv","title":"3\u3001\u4e0d\u4f9d\u8d56 OpenCV \u7684\u56fe\u50cf\u8bc6\u522b\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31","title":"3.1\u3001\u81ea\u7814\u56fe\u50cf\u8bc6\u522b\u6280\u672f","text":"\u3010\u539f\u7406\u3011 \u4e3a\u4e86\u5b9e\u73b0\u8bc6\u522b\u56fe\u50cf\u7684\u76ee\u7684\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u5c06\u56fe\u7247\u7684\u6bcf\u4e2a\u50cf\u7d20\u7684RGB\u503c\uff0c\u4e0e\u6574\u4e2a\u5c4f\u5e55\u4e2d\u7684RGB\u8fdb\u884c\u5bf9\u6bd4\uff0c\u5982\u679c\u5c0f\u56fe\u4e0a\u7684RGB\u503c\u4e0e\u5bf9\u5e94\u5927\u56fe\u4f4d\u7f6e\u7684RGB\u90fd\u76f8\u7b49\uff0c\u5219\u5339\u914d\u6210\u529f\uff0c\u5373\u53ef\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u70b9\u3002 1\u3001\u8bfb\u53d6\u5c0f\u56fe\u548c\u5927\u56fe\u7684RGB\u503c \uff081\uff09\u5c0f\u56fe\u7684RGB\u503c small_data = small_pic.load() # load()\u4f1a\u5c06\u56fe\u7247\u7684RGB\u503c\u83b7\u53d6\u5230\uff0c\u6570\u636e\u683c\u5f0f\u4e3a\u4e00\u4e2a\u4e8c\u7ef4\u5217\u8868\uff0c\u8d4b\u503c\u7ed9\u4e00\u4e2a\u53d8\u91cfsmall_data\u3002\n \uff082\uff09\u5927\u56fe\u7684RGB\u503c big_data = big_pic.load()\n 2\u3001\u5c06\u5c0f\u56fe\u4e0e\u5927\u56fe\u7684RGB\u503c\u8fdb\u884c\u5339\u914d \uff081\uff09\u5339\u914d\u4ece\u5927\u56fe\u7684\u5750\u6807\uff080\uff0c0\uff09\u5f00\u59cb\u5339\u914d\uff0c\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff082\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\uff080\uff0c0\uff09\u5bf9\u5e94\u7684\u6240\u6709\u5c0f\u56fe\u7684RGB\u503c\u4e0d\u76f8\u7b49\uff0c\u5219\u79fb\u52a8\u5230\u4e0b\u4e00\u4e2a\u5750\u6807\u70b9\uff081\uff0c0\uff09\uff0c\u540c\u6837\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff083\uff09\u6309\u7167\u8fd9\u6837\u7684\u89c4\u5f8b\u5c06\u8fd9\u4e00\u884c\u6bcf\u79fb\u52a8\u4e00\u4e2a\u5750\u6807\u70b9\uff0c\u90fd\u5c06\u5c0f\u56fe\u6240\u6709\u7684RGB\u4e0e\u5bf9\u5e94\u5927\u56fe\u7684\u503c\u8fdb\u884c\u5339\u914d\uff1b \uff084\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\u5176\u4e2d\u4e00\u4e2a\u5750\u6807\u70b9\u4e0a\u5339\u914d\u5230\u4e86\u5c0f\u56fe\u7684\u6240\u6709RGB\u503c\uff0c\u5219\u6b64\u65f6\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\u70b9\uff1b \uff085\uff09\u5982\u679c\u5339\u914d\u4e86\u5927\u56fe\u6240\u6709\u7684\u5750\u6807\u70b9\uff0c\u90fd\u6ca1\u6709\u5339\u914d\u5230\uff0c\u5219\u8bf4\u660e\u5927\u56fe\u4e2d\u4e0d\u5b58\u5728\u5c0f\u56fe\uff0c\u5339\u914d\u5931\u8d25\uff1b \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 class ImageRgb:\n@staticmethod\ndef _check_match(_x, _y, small, bdata, sdata, rate):\n\"\"\"\n Matching degree of small graph and large graph matching\n \"\"\"\n@staticmethod\ndef _pre_random_point(small):\n\"\"\"\n Pre matching, take 10-20 points at random each time,\n and take coordinates randomly in the small graph\n \"\"\"\n@staticmethod\ndef _pre_random_match(_x, _y, point_list, bdata, sdata, rate):\n\"\"\"\n In the small graph, several points are randomly\n selected for matching, and the matching degree is\n also set for the random points\n \"\"\"\n@classmethod\ndef match_image_by_rgb(cls, image_name=None, image_path=None, rate=0.9):\n\"\"\"\n By comparing the RGB values of the small image with the large\n image on the screen, the coordinates of the small image on\n the screen are returned.\n \"\"\"\n \u901a\u8fc7 match_image_by_rgb() \u8fd9\u4e2a\u51fd\u6570\uff0c\u4f20\u5165\u76ee\u6807\u5c0f\u56fe\u7684\u6587\u4ef6\u540d\u79f0\uff0c\u5373\u53ef\u8fd4\u56de\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u3002 \u6709\u540c\u5b66\u8981\u95ee\u4e86\uff0c\u6709 OpenCV \u5e72\u561b\u4e0d\u7528\uff0c\u6709\u5fc5\u8981\u81ea\u5df1\u5b9e\u73b0\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u529f\u80fd\u5417\uff0c\u4f60\u4eec\u662f\u4e0d\u662f\u95f2\u7684\u554a\uff1f \u8fd9\u4e48\u95ee\u7684\u8bdd\uff0c\u5c0f\u4e86\uff0c\u683c\u5c40\u5c0f\u4e86\uff1b\u6211\u4eec\u81ea\u5df1\u5b9e\u73b0\u4e3b\u8981\u6709\u51e0\u65b9\u9762\u539f\u56e0\uff1a \u51cf\u5c11\u73af\u5883\u4f9d\u8d56\uff0c\u5373\u4e0d\u7528\u5b89\u88c5 OpenCV\uff0c\u6211\u4eec\u4e5f\u80fd\u5b9e\u73b0\u5176\u529f\u80fd\uff0c\u73af\u5883\u4f9d\u8d56\u8fd9\u5757\u540e\u9762\u4f1a\u5355\u72ec\u8be6\u7ec6\u8bb2\uff0c\u51cf\u5c11\u73af\u5883\u4f9d\u8d56\u5bf9\u4e8e\u4efb\u4f55\u8f6f\u4ef6\u5de5\u7a0b\u90fd\u975e\u5e38\u91cd\u8981\uff1b OpenCV \u5728\u5176\u4ed6\u56fd\u4ea7 CPU \u67b6\u6784\u4e0a\u5b89\u88c5\u5e76\u4e0d\u80fd\u4fdd\u8bc1100%\u6210\u529f\uff0c\u751a\u81f3\u6709\u6ca1\u6709\u53ef\u80fd\u5728\u4e00\u4e9b\u67b6\u6784\u4e0a\u538b\u6839\u513f\u5c31\u4e0d\u80fd\u5b89\u88c5\u4f7f\u7528 OpenCV \uff1f \u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 OpenCV \uff1f\u5c31\u50cf\u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 Windows \u5462\uff1f\u8fd9\u4e9b\u95ee\u9898\u503c\u5f97\u601d\u8003\u3002 \u5f53\u7136\uff0c\u6211\u4eec\u627f\u8ba4\u8fd9\u5957\u65b9\u6848\uff0c\u867d\u7136\u8bc6\u522b\u51c6\u786e\u7387\u6ca1\u95ee\u9898\uff0c\u4f46\u5728\u8bc6\u522b\u6548\u7387\u4e0a\u8fd8\u6ca1\u6709\u8fbe\u5230 OpenCV \u6a21\u677f\u5339\u914d\u7684\u6548\u679c\uff0c\u6211\u4eec\u7684\u65b9\u6848\u6bcf\u6b21\u8bc6\u522b\u5728 1.5s \u5de6\u53f3\uff0c\u800c OpenCV \u5728 1s \u5de6\u53f3\uff1b \u6574\u4f53\u8bc6\u522b\u6548\u679c\u6765\u8bb2\uff0c\u6211\u8ba4\u4e3a\u8fd8\u662f\u53ef\u4ee5\u63a5\u53d7\u7684\uff0c\u4e5f\u5e0c\u671b\u6709\u5fd7\u4e4b\u58eb\u80fd\u4e00\u8d77\u4f18\u5316\u6b64\u65b9\u6848\uff0c\u4e00\u8d77\u6280\u672f\u62a5\u56fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32-rpc","title":"3.2\u3001\u57fa\u4e8e RPC \u670d\u52a1\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b","text":"\u5728\u8fdc\u7a0b\u670d\u52a1\u5668\u4e0a\u90e8\u7f72 OpenCV \u7684\u73af\u5883\uff0c\u5e76\u5c06\u5176\u90e8\u7f72\u4e3a RPC \u670d\u52a1\uff0c\u6d4b\u8bd5\u673a\u4e0a\u4e0d\u7528\u5b89\u88c5 OpenCV \u4f9d\u8d56\uff0c\u800c\u662f\u901a\u8fc7\u8bf7\u6c42 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u3010\u539f\u7406\u3011 \u6d4b\u8bd5\u673a\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u56fe\u7247\u4ee5\u53ca\u6a21\u677f\u56fe\u7247\uff0c\u53d1\u9001\u7ed9 RPC \u670d\u52a1\u7aef\uff0c\u670d\u52a1\u7aef\u62ff\u5230\u4e24\u5f20\u56fe\u7247\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u6700\u540e\u5c06\u8bc6\u522b\u7ed3\u679c\u8fd4\u56de\u7ed9\u6d4b\u8bd5\u673a\uff1b \u8981\u7279\u6b8a\u8bf4\u660e\u7684\u662f\uff1a RPC \u662f\u4e00\u79cd\u534f\u8bae\uff0c\u8bb8\u591a\u8bed\u8a00\u90fd\u662f\u652f\u6301\u7684\uff0c\u6bd4\u5982\u8bf4\u670d\u52a1\u7aef\u4e5f\u53ef\u4ee5\u7528 C++ \u6765\u5b9e\u73b0\uff0c\u5ba2\u6237\u7aef\u4f7f\u7528 Python \u4e5f\u662f\u53ef\u4ee5\u8c03\u7528\u7684\u3002 \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 \u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nimport cv2 as cv\nimport numpy as np\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\nif __name__ == \"__main__\":\nserver = ThreadXMLRPCServer((\"x.x.x.x\", 8889), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(match_image_by_opencv, \"match_image_by_opencv\")\nserver.serve_forever()\n \u8fd9\u6837\uff0c\u6211\u4eec\u57fa\u4e8e Python \u6807\u51c6\u5e93 xmlrpc \u642d\u5efa\u4e86\u4e00\u4e2a RPC \u670d\u52a1\u5668\uff0c\u6ce8\u518c\u4e86 image_put \u548c match_image_by_opencv \u4e24\u4e2a\u529f\u80fd\u63a5\u53e3\uff0c\u5728\u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u901a\u8fc7 IP \u548c\u7aef\u53e3\u8fdb\u884c RPC \u8bf7\u6c42\uff1b \u5ba2\u6237\u7aef\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from xmlrpc.client import Binary\nfrom xmlrpc.client import ServerProxy\nserver = ServerProxy(GlobalConfig.OPENCV_SERVER_HOST, allow_none=True)\nscreen_rb = open(screen, \"rb\")\ntemplate_rb = open(template_path, \"rb\")\ntry:\nscreen_path = server.image_put(Binary(screen_rb.read()))\nscreen_rb.close()\ntpl_path = server.image_put(Binary(template_rb.read()))\ntemplate_rb.close()\nreturn server.match_image_by_opencv(\ntpl_path, screen_path, rate, multiple\n)\nexcept OSError as exc:\nraise EnvironmentError(\nf\"RPC\u670d\u52a1\u5668\u94fe\u63a5\u5931\u8d25. {GlobalConfig.OPENCV_SERVER_HOST}\"\n) from exc\n \u901a\u8fc7\u8fd4\u56de server.match_image_by_opencv \u5c31\u83b7\u53d6\u4e86\u5728\u670d\u52a1\u7aef\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4","title":"4\u3001\u53f3\u952e\u83dc\u5355\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41","title":"4.1\u3001\u53f3\u952e\u83dc\u5355\u5b9a\u4f4d\u7684\u65b9\u6848\u53ca\u95ee\u9898","text":"\u53f3\u952e\u83dc\u5355\u7684\u5143\u7d20\u5b9a\u4f4d\u662f\u4e00\u4e2a\u96be\u70b9\uff0c\u8fc7\u53bb\u6211\u4eec\u8c03\u7814\u548c\u4f7f\u7528\u8fc7\u7684\u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u65b9\u6cd5\u6709 4 \u79cd\uff1a \u7b2c\u4e00\u79cd\uff1a\u6b65\u957f\u64cd\u4f5c\u6cd5 \u5728\u53f3\u952e\u83dc\u5355\u547c\u51fa\u6765\u4e4b\u540e\uff0c\u901a\u8fc7\u952e\u76d8\u7684 up\u3001down \u6309\u952e\uff0c\u8fdb\u884c\u9009\u62e9\u83dc\u5355\u9009\u62e9\uff0c\u9009\u4e2d\u76ee\u6807\u4e4b\u540e enter \u5373\u53ef\uff1b\u6bd4\u5982\uff1a\u5728\u684c\u9762\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\uff0c\u6309 1 \u6b21 down \uff0c\u4f1a\u51fa\u73b0\u4e0b\u56fe\uff1a \u7ee7\u7eed\u518d\u6309 2 \u6b21 down\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u518d\u6309 enter\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u5982\u6b64\uff0c\u201c\u6392\u5e8f\u65b9\u5f0f\u201d\u7684\u6b65\u957f\u4e3a 3\uff1b\u901a\u8fc7\u4f7f\u7528\u952e\u76d8\u4e0a\u4e0b\u952e\uff0c\u5c31\u5b9e\u73b0\u4e86\u5bf9\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\uff1b \u4f46\u662f\uff0c\u8fd9\u79cd\u65b9\u5f0f\u6709\u4e2a\u5f88\u70e6\u4eba\u7684\u95ee\u9898\uff0c\u5c31\u662f\u53f3\u952e\u83dc\u5355\u7684\u9009\u9879\u4f4d\u7f6e\u4e0d\u53ef\u80fd\u4e00\u76f4\u4e0d\u53d8\uff0c\u5728\u9700\u6c42\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\uff0c\u83dc\u5355\u9009\u9879\u7684\u53d8\u5316\u662f\u5f88\u5927\u7684\uff0c\u751a\u81f3\u6709\u4e9b\u5e94\u7528\u652f\u6301\u81ea\u5b9a\u4e49\u83dc\u5355\uff0c\u6bd4\u5982\u6587\u7ba1\u53f3\u952e\u83dc\u5355\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff1b \u4e5f\u5c31\u662f\u8bf4\u4f60\u5f97\u7ecf\u5e38\u53bb\u7ef4\u62a4\u83dc\u5355\u9009\u9879\u7684\u6b65\u957f\uff0c\u4e00\u4e2a\u9009\u9879\u73b0\u5728\u7684\u6b65\u957f\u662f 3\uff0c\u4e0b\u4e2a\u8fed\u4ee3\u53ef\u80fd\u5c31\u662f 4 \u6216\u8005 5\u3002 \u7b2c\u4e8c\u79cd\uff1a\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u6cd5 \u628a\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5355\u72ec\u622a\u56fe\u4fdd\u5b58\uff0c\u56fe\u7247\u4e2d\u4ec5\u5305\u542b\u4e00\u4e2a\u83dc\u5355\u9009\u9879\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u8fd9\u6837\uff0c\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5c31\u53ef\u4ee5\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u65b9\u5f0f\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u8fd9\u79cd\u65b9\u5f0f\u4e0d\u7528\u62c5\u5fc3\u83dc\u5355\u9009\u9879\u7684\u987a\u5e8f\u6216\u4f4d\u7f6e\uff0c\u4f46\u662f\u9700\u8981\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff0c\u4e14\u5bb9\u6613\u53d7\u5230\u5b57\u4f53 UI \u53d8\u66f4\u7c7b\u9700\u6c42\u7684\u5f71\u54cd\uff0c\u6bd4\u5982\uff1a\u5b57\u4f53\u5927\u5c0f\u3001\u5b57\u4f53\u95f4\u8ddd\u7b49\u7b49\u9700\u6c42\u53d8\u66f4\u90fd\u4f1a\u5f71\u54cd\uff0c\u6bcf\u6b21\u53d8\u66f4\u4e4b\u540e\u5c31\u9700\u8981\u8fdb\u884c\u5927\u91cf\u56fe\u7247\u8d44\u6e90\u7684\u91cd\u65b0\u622a\u56fe\u66ff\u6362\uff0c\u662f\u4e2a\u6bd4\u8f83\u9ebb\u70e6\u7684\u4e8b\u60c5\uff1b \u7b2c\u4e09\u79cd\uff1a\u76f8\u5bf9\u4f4d\u79fb\u6cd5 \u9f20\u6807\u70b9\u51fb\u53f3\u952e\u7684\u65f6\u5019\uff0c\u9f20\u6807\u7684\u5f53\u524d\u5750\u6807\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u7684\uff0c\u83dc\u5355\u9009\u9879\u7684\u5bbd\uff08 w \uff09\u4e00\u822c\u662f\u56fa\u5b9a\u7684\uff0c\u53d8\u5316\u7684\u662f\u83dc\u5355\u7684\u957f\u5ea6\uff08 h \uff09\uff0c\u53ef\u4ee5\u901a\u8fc7\u67d0\u4e2a\u9009\u9879\u76f8\u5bf9\u4e8e\u9f20\u6807\u7684\u8ddd\u79bb\u5728\u786e\u5b9a\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u901a\u8fc7\u7ef4\u62a4\u83dc\u5355\u9009\u9879\uff08\u76f8\u5bf9\u4f4d\u7f6e\uff09\u76f8\u5bf9\u4e8e\u9f20\u6807\u4f4d\u7f6e\u7684\u8ddd\u79bb\uff0c\u5373\u53ef\u8f7b\u677e\u8ba1\u7b97\u51fa\u83dc\u5355\u9009\u9879\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\u3002 \u4ece\u7406\u8bba\u4e0a\u6b64\u65b9\u6848\u662f\u53ef\u884c\u7684\uff0c\u4f46\u662f\u8fd9\u91cc\u4ecd\u7136\u5b58\u5728\u4e24\u4e2a\u4e25\u91cd\u7684\u95ee\u9898\uff1a \u83dc\u5355\u987a\u5e8f\u6539\u53d8\uff0c\u5bfc\u81f4\u76f8\u5bf9\u8ddd\u79bb\u6539\u53d8\uff0c\u800c\u4e14\u8ddd\u79bb\u662f\u901a\u8fc7\u50cf\u7d20\uff08px\uff09\u6765\u8868\u793a\u7684\uff0c\u4e0d\u60f3\u6b65\u957f\u90a3\u4e48\u53ea\u7ba1\uff0c\u6bcf\u6b21\u9700\u8981\u53bb\u91cf\u4e00\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u70b9\u9ebb\u70e6\uff1b \u9f20\u6807\u5728\u684c\u9762\u4e0d\u540c\u4f4d\u7f6e\u70b9\u51fb\u53f3\u952e\uff0c\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u4f4d\u7f6e\u662f\u4e0d\u540c\u7684\uff0c\u4e0a\u56fe\u7684\u83dc\u5355\u662f\u5728\u9f20\u6807\u7684\u5de6\u4e0b\u65b9\uff0c\u5982\u679c\u4f60\u79fb\u52a8\u9f20\u6807\u5230\u5c4f\u5e55\u56db\u8fb9\uff0c\u4f60\u4f1a\u53d1\u73b0\uff0c\u53f3\u952e\u83dc\u5355\u53ef\u80fd\u51fa\u73b0\u5728\u9f20\u6807\u7684\u56db\u4e2a\u65b9\u5411\uff0c\u4e5f\u5c31\u662f\u8bf4\u4f60\u9700\u8981\u6839\u636e\u9f20\u6807\u7684\u4e0d\u540c\u4f4d\u7f6e\u6765\u5224\u65ad\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u65b9\u5411\uff0c\u800c\u4e0d\u540c\u7684\u65b9\u5411\u4e0a\u8ba1\u7b97\u65b9\u6cd5\u662f\u4e0d\u540c\u7684\uff0c\u6bd4\u5982\uff1a\u53f3\u952e\u83dc\u5355\u5728\u9f20\u6807\u7684\u5de6\u4e0a\uff0c\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\u8ba1\u7b97\u65b9\u6cd5\u4e3a\uff08x - w / 2\uff0c y - h\uff09\uff0c\u8fd9\u6837\u7ef4\u62a4\u8d77\u6765\u53ef\u4ee5\u8bf4\u975e\u5e38\u590d\u6742\uff1b \u57fa\u4e8e\u4ee5\u4e0a\u4e24\u4e2a\u539f\u56e0\uff0c\u6211\u4eec\u5e76\u4e0d\u63a8\u8350\u8fd9\u79cd\u64cd\u4f5c\u65b9\u6848\u3002 \u7b2c\u56db\u79cd\uff1a\u5c5e\u6027\u5b9a\u4f4d \u6709\u540c\u5b66\u8bf4\u5e72\u561b\u4e0d\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u5462\uff0c\u5176\u5b9e\uff0c\u6211\u4eec\u6700\u5f00\u59cb\u60f3\u5230\u7684\u65b9\u6848\u5c31\u662f\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\uff0c\u4f46\u662f\u5728\u5c5e\u6027\u7684 DOM \u6811\u91cc\u600e\u4e48\u4e5f\u627e\u4e0d\u5230\uff0c\u65e0\u6cd5\u5b9a\u4f4d\u5230\uff0c\u6211\u4eec\u4e5f\u8054\u5408\u7814\u53d1\u540c\u5b66\u4e00\u8d77\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u4f46\u6700\u7ec8\u8fd8\u662f\u6ca1\u80fd\u89e3\u51b3\uff0c\u975e\u5e38\u9057\u61be\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42","title":"4.2\u3001\u6700\u65b0\u7684\u53f3\u952e\u83dc\u5355\u7ec8\u6781\u89e3\u51b3\u65b9\u6848","text":"\u7531\u4e8e\u53f3\u952e\u83dc\u5355\u9009\u9879\u51e0\u4e4e\u90fd\u662f\u6587\u672c\uff0c\u90a3\u4e48\u901a\u8fc7 OCR \u8bc6\u522b\uff0c\u51e0\u4e4e\u662f\u6700\u4f18\u7684\u65b9\u6848\uff1a \u4e0d\u7528\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff1b \u4e0d\u4f1a\u53d7\u5230\u83dc\u5355\u9009\u9879\u987a\u5e8f\u6539\u53d8\u7684\u5f71\u54cd\uff1b \u4e0d\u4f1a\u53d7\u5230\u5b57\u4f53 UI \u53d8\u5316\u7684\u5f71\u54cd\uff1b \u5173\u4e8e OCR \u8bc6\u522b\u6211\u4eec\u5728\u540e\u9762\u4f1a\u8be6\u7ec6\u8bb2\u5230\uff0c\u672c\u7ae0\u8282\u4e3b\u8981\u8bb2\u57fa\u4e8e OCR \u8bc6\u522b\uff0c\u6211\u4eec\u5728\u53f3\u952e\u83dc\u5355\u8bc6\u522b\u4e0a\u7684\u7a81\u7834\u548c\u521b\u65b0\uff1b \u4f7f\u7528 OCR \u8bc6\u522b\u53f3\u952e\u83dc\u5355\u867d\u7136\u5df2\u7ecf\u5f88\u5b8c\u7f8e\u4e86\uff0c\u4f46\u662f\u5728\u4e00\u4e9b\u60c5\u51b5\u4e0b\u4ecd\u7136\u5b58\u5728\u4e00\u70b9\u95ee\u9898\uff0c\u5c31\u662f\u5c4f\u5e55\u4e2d\u51fa\u73b0\u591a\u4e2a\u548c\u83dc\u5355\u9009\u9879\u6587\u5b57\u76f8\u540c\u7684\u6587\u5b57\u65f6\uff0c\u6bd4\u5982\u4e0b\u9762\u8fd9\u79cd\u60c5\u51b5\uff1a \u5c4f\u5e55\u6070\u597d\u51fa\u73b0\u4e86\u4e24\u4e2a\u201c\u590d\u5236\u201d\uff0c\u6b64\u65f6\u8981\u5b9a\u4f4d\u5230\u83dc\u5355\u4e2d\u7684 \u201c\u590d\u5236\u201d\uff0c\u5c31\u9700\u8981\u8fdb\u4e00\u6b65\u505a\u6570\u636e\u5904\u7406\uff0c\u6bd4\u5982\uff1aOCR \u8fd4\u56de 2 \u4e2a\u201c\u590d\u5236\u201d\u7684\u5750\u6807\uff0c\u7528\u4f8b\u91cc\u9762\u6765\u5224\u65ad\u7528\u54ea\u4e2a\uff0c\u4ece\u4e1a\u52a1\u4e0a\u5c06\u5904\u7406\u8d77\u6765\u6bd4\u8f83\u9ebb\u70e6\uff0c\u56e0\u4e3a\u4f60\u5f97\u660e\u786e\u77e5\u9053\u83dc\u5355\u5728\u5de6\u8fb9\u8fd8\u662f\u53f3\u8fb9\uff0c\u7136\u540e\u8fd9\u672c\u8eab\u5c31\u662f\u4e0d\u786e\u5b9a\u7684\uff1b \u600e\u4e48\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u5462\uff0c\u8fd9\u5c31\u8981\u8bf4\u9053\u672c\u7ae0\u7684\u4e3b\u9898\uff1a\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b\u3002 \u3010\u539f\u7406\u3011 \u5728\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u524d\u622a\u4e00\u5f20\u56fe\uff0c\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\u518d\u622a\u53d6\u4e00\u5f20\u56fe\uff0c\u4e24\u5f20\u56fe\u552f\u4e00\u53d8\u5316\u7684\u5c31\u662f\u53f3\u952e\u83dc\u5355\uff0c\u5c06\u5176\u4ed6\u76f8\u540c\u7684\u5730\u65b9\u90fd\u5c4f\u853d\u6389\uff0c\u53ea\u7559\u4e0b\u83dc\u5355\u754c\u9762\uff0c\u5982\u6b64\u5373\u53ef\u6d88\u9664\u5e72\u6270\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u5c06\u4e24\u79cd\u56fe\u505a\u524d\u540e\u5bf9\u6bd4\u63d0\u53d6\u53ef\u4ee5\u5f97\u5230\u8fd9\u6837\u7684\u56fe\uff1a \u4f60\u770b\uff0c\u901a\u8fc7\u524d\u540e\u56fe\u7247\u7684\u5bf9\u6bd4\uff0c\u5c06\u76f8\u540c\u7684\u90e8\u5206\u7ed9\u6d88\u9664\u6389\uff0c\u518d\u8fdb\u884c OCR \u8bc6\u522b\uff0c\u8fd9\u6837\u5c31\u4e0d\u4f1a\u6709\u5e72\u6270\u4e86\uff1b \u4ee3\u7801\u5b9e\u73b0\u8bf7\u67e5\u770b src/filter_image.py \uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def filter_image(action):\n\"\"\"\n \u5bf9\u6bd4\u52a8\u4f5c\u524d\u540e\u4e24\u5f20\u56fe\u7247\uff0c\u63d0\u53d6\u4e0d\u540c\u7684\u90e8\u5206\u751f\u6210\u4e00\u5f20\u65b0\u7684\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u65b0\u56fe\u7247\u7684\u8def\u5f84\n :param action: \u52a8\u4f5c\u51fd\u6570\u7684\u51fd\u6570\u5bf9\u8c61\n :return: \u65b0\u56fe\u7247\u7684\u8def\u5f84\n \"\"\"\n action \u662f\u9f20\u6807\u4e8b\u4ef6\uff0c\u56e0\u4e3a\u6b64\u7c7b\u573a\u666f\u4e0d\u4ec5\u4ec5\u5728\u53f3\u952e\u5b58\u5728\uff0c\u5355\u51fb\u3001\u53cc\u51fb\u7b49\u7b49\uff0c\u53ea\u8981\u64cd\u4f5c\u524d\u540e\u540e\u53d8\u5316\u7684\u90fd\u53ef\u4ee5\uff1a from src.mouse_key import MouseKey\naction = (\nMouseKey.click,\nMouseKey.right_click,\nMouseKey.double_click,\nMouseKey.move_to,\n)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5","title":"5\u3001\u52a8\u6001\u56fe\u50cf\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5728\u684c\u9762\u58c1\u7eb8\u5207\u6362\uff0c\u6216\u770b\u56fe\u3001\u76f8\u518c\u5207\u6362\u56fe\u7247\u7c7b\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u7531\u4e8e\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u662f\u4e0d\u56fa\u5b9a\u7684\uff08\u4e0d\u540c\u7248\u672c\u7684\u7cfb\u7edf\u58c1\u7eb8\u4e0d\u540c\u3001\u58c1\u7eb8\u987a\u5e8f\u4e0d\u540c\uff0c\u770b\u56fe\u76f8\u518c\u5728\u56fe\u7247\u8d44\u6e90\u4e0d\u4e00\u5b9a\u56fa\u5b9a\uff09\uff0c\u90a3\u4e48\u5728\u6d4b\u8bd5\u5207\u6362\u58c1\u7eb8\u6216\u8005\u5207\u6362\u56fe\u7247\u7684\u573a\u666f\u65f6\u5c31\u4f1a\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u4f60\u4e0d\u77e5\u9053\u9884\u671f\u662f\u5565\uff0c\u7528\u4f8b\u64cd\u4f5c\u52a8\u6001\u7684\uff0c\u4e5f\u662f\u6781\u4e0d\u7a33\u5b9a\u3002 \u3010\u539f\u7406\u3011 \u5728\u5207\u6362\u56fe\u7247\u4e4b\u524d\u622a\u56fe\u4fdd\u5b58\u5e76\u8fd4\u56de\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u6b21\u8bc6\u522b\u8fd9\u5f20\u56fe\u7247\uff0c\u5982\u679c\u4e0d\u5b58\u5728\uff0c\u8bf4\u660e\u56fe\u7247\u5df2\u7ecf\u5207\u6362\u4e86\uff1b \u793a\u610f\u56fe\uff1a \u8fd9\u6837\uff0c\u6211\u4eec\u622a\u53d6\u4e86\u5f53\u524d\u56fe\u7247\u4e2d\u6bd4\u8f83\u6709\u4ee3\u8868\u6027\u7684\u4f4d\u7f6e\uff08\u4e00\u53ea\u9e1f\uff09\uff0c\u5728\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u7528\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1a \u6211\u4eec\u518d\u62ff\u7740\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd9\u6837\u5728\u5f53\u524d\u56fe\u7247\u4e2d\uff0c\u5c31\u4e0d\u80fd\u627e\u5230\u8fd9\u53ea\u9e1f\u4e86\uff0c\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u662f False\uff0c\u90a3\u4e48\u4e5f\u5c31\u53ef\u4ee5\u5224\u65ad\u56fe\u7247\u5207\u6362\u662f\u6210\u529f\u7684\u3002 \u4ee3\u7801\u793a\u610f\uff1a def save_temporary_picture(_x: int, _y: int, width: int, height: int):\n\"\"\"\n \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u56fe\u7247\u8def\u5f84\n :param x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n :param y: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n :param width: \u5bbd\u5ea6\n :param height: \u9ad8\u5ea6\n :return: \u56fe\u7247\u8def\u5f84\n \"\"\"\n \u6b64\u51fd\u6570\u7528\u4e8e\u5728\u64cd\u4f5c\u4e4b\u524d\u622a\u56fe\u4e00\u5f20\u4e34\u65f6\u56fe\u7247\uff0c\u8fd4\u56de\u56fe\u7247\u8def\u5f84\uff0c\u6700\u540e\u5728\u65ad\u8a00\u7684\u65f6\u5019\u518d\u5c06\u56fe\u7247\u8def\u5f84\u4f5c\u4e3a\u53c2\u6570\u4f20\u5165\u65ad\u8a00\u8bed\u53e5\u5373\u53ef\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ui","title":"\u4e09\u3001\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_1","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u662f\u6211\u4eec\u81ea\u7814\u7684\u4e00\u79cd\u4f7f\u7528\u7b80\u5355\uff0c\u4e14\u6548\u7387\u6781\u9ad8\u3001\u7a33\u5b9a\u6027\u597d\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u57fa\u4e8e\u5143\u7d20\u6309\u94ae\u5728\u5e94\u7528\u4e2d\u7684\u76f8\u5bf9\u4f4d\u7f6e\uff0c\u52a8\u6001\u83b7\u53d6\u5143\u7d20\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff0c\u9002\u7528\u4e8e\u5404\u79cd\u5c4f\u5e55\u5206\u8fa8\u7387\uff08\u5305\u62ec\u9ad8\u5206\u5c4f\u3001\u5bbd\u5c4f\u3001\u5e26\u9c7c\u5c4f\uff09\uff0c\u5f53\u5143\u7d20\u6309\u94ae\u4f4d\u7f6e\u76f8\u5bf9\u4e8e\u5e94\u7528\u754c\u9762\u4f4d\u7f6e\u53d1\u751f\u4fee\u6539\u4e4b\u540e\uff0c\u53ea\u9700\u8981\u6839\u636e UI \u8bbe\u8ba1\u56fe\u4e0a\u7684\u6e90\u6570\u636e\u4fee\u6539\u5bf9\u5e94\u5750\u6807\u6570\u636e\u5c31\u597d\uff0c\u7ef4\u62a4\u975e\u5e38\u7684\u65b9\u4fbf\u3002 \u6b64\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u9002\u7528\u4e8e\u4e00\u4e9b\u5143\u7d20\u4f4d\u7f6e\u76f8\u5bf9\u4e0e\u5e94\u7528\u754c\u9762\u6bd4\u8f83\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u97f3\u4e50\uff0899% \u7684\u5143\u7d20\u5b9a\u4f4d\u91c7\u7528\u8fd9\u79cd\uff0c\u6548\u679c\u975e\u5e38\u597d\uff09\uff0c\u4e0d\u9002\u7528\u4e8e\u754c\u9762\u4e0d\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u622a\u56fe\u5f55\u5c4f\uff0c\u5f88\u660e\u663e\u4e0d\u9002\u7528\u4e8e\u8fd9\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u3002\u8fd9\u79cd\u5168\u65b0\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u6709\u5b83\u7684\u9002\u7528\u6761\u4ef6\uff0c\u5982\u679c\u4f60\u53d1\u73b0\u4f7f\u7528\u5e38\u89c4\u7684\uff08\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u5b9a\u4f4d\uff09\u4e0d\u597d\u505a\u65f6\uff0c\u4e0d\u59a8\u8003\u8651\u4f7f\u7528\u8fd9\u79cd\uff0c\u5176\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff0c\u5e76\u4e14\u8fc5\u901f\u7231\u4e0a\u4ed6\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_1","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5728 UI \u8bbe\u8ba1\u56fe\u4e2d\u6211\u4eec\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u8fb9\u6846\u7684\u8ddd\u79bb\u7684\uff0c\u7136\u540e\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u6280\u672f\u624b\u6bb5\u83b7\u53d6\u5230\u5e94\u7528\u754c\u9762\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u53ca\u5e94\u7528\u7a97\u53e3\u7684\u5927\u5c0f\uff0c\u793a\u610f\u56fe\u5982\u4e0b\uff1a \uff08x1, y1\uff09\u4e3a\u5e94\u7528\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\uff1b\uff08x2, y2\uff09\u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u5de6\u4e0a\u89d2\uff08x1, y1\uff09\u7684\u5750\u6807\uff0c\u90a3\u4e48\u5b9e\u9645\u4e0a\u3010\u64ad\u653e\u6240\u6709\u3011\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\u4e3a\uff1a\uff08 x1 + x2, y1 + y2 \uff09\uff1b \u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5927\u5c0f\uff08w2, h2\uff09\uff0c\u53ef\u4ee5\u4ece UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\uff1b \u5728 UI \u8bbe\u8ba1\u7a3f\u4e0a\u70b9\u51fb\u3010\u64ad\u653e\u6240\u6709\u3011\u56fe\u6807\uff0c\u7136\u540e\u79fb\u52a8\u9f20\u6807\u5c31\u5c31\u53ef\u4ee5\u770b\u5230\u4e0a\u56fe\u7684\u53c2\u8003\u7ebf\u53ca\u6570\u636e\uff1b \u6240\u4ee5\uff0c\u6211\u4eec\u53ef\u4ee5\u8f7b\u677e\u7684\u83b7\u53d6\u5230\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u4e2d\u5fc3\u5750\u6807\u4e3a\uff1a\uff08 x1 + x2 + (w2 / 2), y1 + y2 + ( h2 / 2) \uff09 \u8be6\u7ec6\u6e90\u4ee3\u7801\u8bf7\u67e5\u770b AT \u57fa\u7840\u6846\u67b6: src/button_center.py \u83b7\u53d6\u5e94\u7528\u7a97\u53e3\u7684\u4fe1\u606f \u4f7f\u7528 xdotool \u548c xwininfo \u83b7\u53d6\u5230\u5e94\u7528\u7a97\u53e3\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u5de6\u4e0a\u89d2\uff09\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a app_id = CmdCtl.run_cmd(f\"xdotool search --classname --onlyvisible {self.app_name}\"\n).split(\"\\n\")\napp_id_list = [int(_id) for _id in app_id if _id]\nreturn CmdCtl.run_cmd(f\"xwininfo -id {app_id_list[self.number]}\")\n \u4f7f\u7528\u6b63\u5219\u83b7\u53d6\u7a97\u53e3\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u83b7\u53d6\u914d\u7f6e \u8bfb ini \u914d\u7f6e\u6587\u4ef6\uff0c\u83b7\u53d6\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e0e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a conf = ConfigParser()\nconf.read(self.config_path)\ndirection = conf.get(btn_name, \"direction\")\nposition = [int(i.strip()) for i in conf.get(btn_name, \"location\").split(\",\")]\n \u8ba1\u7b97\u5143\u7d20\u6309\u94ae\u5750\u6807 \u6839\u636e\u5e94\u7528\u7a97\u53e3\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u5927\u5c0f\u3001\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u5927\u5c0f\uff0c\u4f7f\u7528\u4e00\u5b9a\u7684\u7b97\u6cd5\u5373\u53ef\u8ba1\u7b97\u51fa\u5143\u7d20\u6309\u94ae\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u4e2d\u5fc3\u5750\u6807\uff09\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3","title":"3\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u3010\u914d\u7f6e\u65b9\u6cd5\u3011 \u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u7684\u6570\u636e\u6e90\u662f\u5e94\u7528\u5e93\u4e2d\u7684 ui.ini \u914d\u7f6e\u6587\u4ef6\uff1a ;section\n[\u65b0\u5efa\u6b4c\u5355+] ;key = value\ndirection = left_top\nlocation = 180, 268, 21, 21\n section \u662f\u4f60\u6839\u636e\u5bf9\u5e94\u7684\u5143\u7d20\u6309\u94ae\u547d\u540d\uff0c\u4f60\u53ef\u4ee5\u4efb\u610f\u547d\u540d\uff0c\u4f46\u6700\u597d\u6709\u5177\u4f53\u542b\u4e49\uff0c\u4e14\u80fd\u660e\u786e\u8868\u793a\u8fd9\u4e2a\u5143\u7d20\u6309\u94ae\u7684\u540d\u79f0\uff1b\u7528\u4e2d\u62ec\u53f7\u62ec\u8d77\u6765\u5c31\u884c\uff0c\u6bd4\u5982\uff1a[\u65b0\u5efa\u6b4c\u5355+] \uff1b direction \u662f\u914d\u7f6e\u8be5\u5143\u7d20\u7684\u53c2\u8003\u7cfb\uff0c\u5206\u522b\u4e3a\uff1a left_top \u5de6\u4e0a\uff1b left_bottom \u5de6\u4e0b\uff1b right_top \u53f3\u4e0a\uff1b right_bottom \u53f3\u4e0b\uff1b \u53c2\u8003\u7cfb\u7684\u9009\u53d6\u6807\u51c6\uff1a\u62c9\u52a8\u6539\u53d8\u7a97\u53e3\u5927\u5c0f\u65f6\uff0c\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u53c2\u8003\u7cfb\u4f4d\u7f6e\u662f\u4e0d\u53d8\u7684\uff1b location \u662f\u8be5\u5143\u7d20\u6309\u94ae\u7684\u76f8\u5bf9\u4e0e\u53c2\u8003\u7cfb\u7684 x, y \u7684\u8ddd\u79bb\uff0c\u53ca\u5927\u5c0f(w, h)\uff0c\u8fd9\u56db\u4e2a\u6570\u636e\u53ef\u4ee5\u901a\u8fc7 UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\u6570\u636e\uff0c\u5728\u7f16\u8f91\u6a21\u5f0f\u4e0b\uff0c\u70b9\u51fb UI \u56fe\u4e0a\u7684\u6309\u94ae\uff0c\u53f3\u4fa7\u5c31\u4f1a\u51fa\u73b0\u8be5\u5143\u7d20\u6309\u94ae\u7684 x, y, w, h \u6570\u636e\u3002 \u5982\u679c UI \u56fe\u4e0a\u6ca1\u6709\u63d0\u4f9b\u4f60\u60f3\u8981\u7684\u5143\u7d20\u6570\u636e\uff0c\u4f60\u53ef\u4ee5\u76f4\u63a5\u5728\u7cfb\u7edf\u4e2d\u4f7f\u7528\u622a\u56fe\u5f55\u5c4f\u8fdb\u884c\u5c3a\u91cf\uff0c\u8fd9\u662f\u4e00\u79cd\u4e0d\u63a8\u8350\u4f46\u80fd\u7528\u7684\u65b9\u6cd5\u3002 \u3010\u8c03\u7528\u65b9\u6cd5\u3011 \u5728\u5e94\u7528\u5e93\u65b9\u6cd5\u5c42\u8fd9\u6837\u5199\uff1a def click_add_music_list_btn_in_music_by_ui(self):\n\"\"\"\u70b9\u51fb\u65b0\u5efa\u6b4c\u5355\u6309\u94ae\"\"\"\nself.click(*self.ui.btn_center(\"\u65b0\u5efa\u6b4c\u5355+\"))\n self.ui.btn_center() \u662f\u56fa\u5b9a\u5199\u6cd5\uff0c\u53c2\u6570\u5c31\u662f\u914d\u7f6e\u91cc\u9762\u7684 section \u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ocr","title":"\u56db\u3001OCR \u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_2","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 OCR \u65b9\u6848\u5927\u591a\u91c7\u7528\u8c37\u6b4c OCR\uff08Tesseract\uff09\u65b9\u6848\uff0c\u4f46\u662f\u5b83\u5bf9\u4e8e\u4e2d\u6587\u7684\u8bc6\u522b\u975e\u5e38\u5dee\uff0c\u7ecf\u8fc7\u5927\u91cf\u7684\u8c03\u7814\uff0c\u6211\u4eec\u4f7f\u7528 PaddleOCR\uff0c\u5b83\u662f\u4e00\u4e2a\u5f00\u6e90\u7684\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u8bc6\u522b\u5de5\u5177\uff0c\u4e5f\u662f PaddlePaddle \u6700\u6709\u540d\u7684\u4e00\u4e2a\u5f00\u6e90\u9879\u76ee\uff0c\u611f\u5174\u8da3\u7684\u53ef\u4ee5\u70b9\u8fd9\u91cc\u4e86\u89e3\uff0c\u591a\u7684\u4e0d\u8bf4\u4e86\uff0c\u4f60\u53ea\u9700\u8981\u77e5\u9053\u5b83\u5c31\u662f\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_2","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5b89\u88c5\u4ed6\u662f\u4e2a\u5f88\u9ebb\u70e6\u7684\u4e8b\u60c5\uff0c\u867d\u7136\u64cd\u4f5c\u5f88\u7b80\u5355\uff0c\u4f46\u5176\u5b9e\u5b89\u88c5\u5305\u6709\u70b9\u5927\uff0c\u56e0\u6b64\u6211\u4eec\u4e0d\u5e0c\u671b\u76f4\u63a5\u5728 env.sh \u4e2d\u52a0\u5165\u5b83\uff0c\u8fd9\u4f1a\u8ba9\u6574\u4e2a\u81ea\u52a8\u5316\u73af\u5883\u53d8\u5f97\u975e\u5e38\u81c3\u80bf\uff1b \u56e0\u6b64\uff0c\u6211\u4eec\u60f3\u5230\u5c06\u5b83\u505a\u6210\u4e00\u4e2a RPC \u670d\u52a1\u5728\u5176\u4ed6\u673a\u5668\u4e0a\u90e8\u7f72\uff0c\u6d4b\u8bd5\u673a\u901a\u8fc7\u8fdc\u7a0b\u8c03\u7528 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u4f7f\u7528\u5b83\uff1b RPC \u7684\u8c03\u7528\u903b\u8f91\uff1a \u8fd9\u6837\u6211\u4eec\u53ea\u9700\u8981\u5728\u670d\u52a1\u7aef\u90e8\u7f72\u597d OCR \u8bc6\u522b\u7684\u670d\u52a1\uff0c\u7136\u540e\u901a\u8fc7 RPC \u670d\u52a1\u5c06\u529f\u80fd\u63d0\u4f9b\u51fa\u6765\uff0c\u6846\u67b6\u91cc\u9762\u53ea\u9700\u8981\u8c03\u7528\u5bf9\u5e94\u7684 RPC \u63a5\u53e3\u5c31\u884c\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_1","title":"3\u3001\u4f7f\u7528\u8bf4\u660e","text":"\u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nfrom paddleocr import PaddleOCR\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef paddle_ocr(pic_path, lang):\n\"\"\"\n Paddleocr\u76ee\u524d\u652f\u6301\u7684\u591a\u8bed\u8a00\u8bed\u79cd\u53ef\u4ee5\u901a\u8fc7\u4fee\u6539lang\u53c2\u6570\u8fdb\u884c\u5207\u6362\n \u4f8b\u5982`ch`, `en`, `fr`, `german`, `korean`, `japan`\n :param file_name:\n :param lang:\n :return:\n \"\"\"\nif __name__ == \"__main__\":\nIP = popen(\"hostname -I\").read().split(\" \")[0]\nPORT = 8890\nSCREEN_CACHE = \"/tmp/screen.png\"\nserver = ThreadXMLRPCServer((IP, PORT), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(paddle_ocr, \"paddle_ocr\")\nprint(\"\u76d1\u542c\u5ba2\u6237\u7aef\u8bf7\u6c42\u3002\u3002\")\nserver.serve_forever()\n \u6846\u67b6\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from src import OCR\nOCR.ocr(*target_strings, picture_abspath=None, similarity=0.6, return_default=False, return_first=False, lang=\"ch\"):\n# \u901a\u8fc7 OCR \u8fdb\u884c\u8bc6\u522b\u3002\n# target_strings:\n# \u76ee\u6807\u5b57\u7b26,\u8bc6\u522b\u4e00\u4e2a\u5b57\u7b26\u4e32\u6216\u591a\u4e2a\u5b57\u7b26\u4e32,\u5e76\u8fd4\u56de\u5176\u5728\u56fe\u7247\u4e2d\u7684\u5750\u6807;\n# \u5982\u679c\u4e0d\u4f20\u53c2\uff0c\u8fd4\u56de\u56fe\u7247\u4e2d\u8bc6\u522b\u5230\u7684\u6240\u6709\u5b57\u7b26\u4e32\u3002\n# picture_abspath: \u8981\u8bc6\u522b\u7684\u56fe\u7247\u8def\u5f84\uff0c\u5982\u679c\u4e0d\u4f20\u9ed8\u8ba4\u622a\u53d6\u5168\u5c4f\u8bc6\u522b\u3002\n# similarity: \u5339\u914d\u5ea6\u3002\n# return_default: \u8fd4\u56de\u8bc6\u522b\u7684\u539f\u751f\u6570\u636e\u3002\n# return_first: \u53ea\u8fd4\u56de\u7b2c\u4e00\u4e2a,\u9ed8\u8ba4\u4e3a False,\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u6240\u6709\u6570\u636e\u3002\n# lang: `ch`, `en`, `fr`, `german`, `korean`, `japan`\n \u6b64\u65b9\u6848\u5728\u6846\u67b6\u5185\u6ca1\u6709\u5f15\u5165\u4efb\u4f55\u4e09\u65b9\u4f9d\u8d56\u5b8c\u5168\u91c7\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\uff0c\u800c\u4e14\u4f7f\u7528\u65b9\u6cd5\u975e\u5e38\u7b80\u5355\uff0c\u53ea\u9700\u8981\u901a\u8fc7 OCR.ocr() \u5373\u53ef\uff1b \u5bf9\u4e8e\u4e00\u4e9b\u6587\u6848\u7684\u573a\u666f\u975e\u5e38\u9002\u7528\uff0c\u6b64\u65b9\u6cd5\u76f4\u63a5\u8fd4\u56de\u5750\u6807\uff0c\u53ef\u4ee5\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u3002 \u4e5f\u53ef\u4ee5\u7528\u4e8e\u6587\u5b57\u65ad\u8a00\uff0c\u4ee3\u7801\u793a\u610f\uff1a def assert_ocr_exist(\n*args, picture_abspath=None, similarity=0.6, return_first=False, lang=\"ch\"\n):\n\"\"\"\u65ad\u8a00\u6587\u6848\u5b58\u5728\"\"\"\npic = None\nif picture_abspath is not None:\npic = picture_abspath + \".png\"\nres = OCR.ocr(\n*args,\npicture_abspath=pic,\nsimilarity=similarity,\nreturn_first=return_first,\nlang=lang,\n)\nif res is False:\nraise AssertionError(\n(f\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{args}\", f\"{pic if pic else GlobalConfig.SCREEN_CACHE}\")\n)\nif isinstance(res, tuple):\npass\nelif isinstance(res, dict) and False in res.values():\nres = filter(lambda x: x[1] is False, res.items())\nraise AssertionError(\n(\nf\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{dict(res)}\",\nf\"{pic if pic else GlobalConfig.SCREEN_CACHE}\",\n)\n)\n \u5728\u7528\u4f8b\u4e2d\u4f7f\u7528\u65ad\u8a00\uff0c\u793a\u4f8b\uff1a def test_font_manager_021(self):\n\"\"\"\u53f3\u4fa7\u2665-\u6536\u85cf/\u53d6\u6d88\u6536\u85cf\u5b57\u4f53\"\"\"\n# \u5b57\u4f53\u7ba1\u7406\u5668\u754c\u9762\u53f3\u4fa7\u8be6\u60c5\u5217\u8868\uff0c\u9009\u62e9\u672a\u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e / \u6536\u85cf\u5b57\u4f53\n# \u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e\u83dc\u5355\u663e\u793a\u201c\u53d6\u6d88\u6536\u85cf\u201d\uff1b\n...\nself.assert_ocr_exist(\"\u53d6\u6d88\u6536\u85cf\")\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_1","title":"4\u3001\u670d\u52a1\u7aef\u90e8\u7f72","text":"\u6211\u4eec\u76ee\u524d\u662f\u5c06 OCR \u670d\u52a1\u90e8\u7f72\u5728\u666e\u901a\u7684\u529e\u516c\u673a\u4e0a\u7684\uff0c\u5982\u679c\u4f60\u89c9\u5f97\u73b0\u6709\u7684 OCR \u8bc6\u522b\u6027\u80fd\u4e0d\u591f\u597d\uff0c\u6070\u597d\u4f60\u6709\u66f4\u597d\u7684\u673a\u5668\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u5176\u79c1\u6709\u5316\u90e8\u7f72\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41_1","title":"4.1\u3001\u73af\u5883\u5b89\u88c5","text":"\u63a8\u8350\u4f7f\u7528 pipenv \u8fdb\u884c\u73af\u5883\u642d\u5efa\uff1b \u5b89\u88c5 pipenv \uff1a sudo pip3 install pipenv\n \u65b0\u5efa\u4e00\u4e2a\u76ee\u5f55\u4f5c\u4e3a\u73af\u5883\u5305 ocr_env\uff1a cd ~\nmkdir ocr_env\n \u521b\u5efa python 3.7 \u73af\u5883\uff1a cd ocr_env\npipenv --python 3.7\n \u5b89\u88c5 OCR \u4f9d\u8d56\u5305\uff1a pipenv install paddlepaddle -i https://mirror.baidu.com/pypi/simple\npipenv install \"paddleocr>=2.0.1\" -i https://mirror.baidu.com/pypi/simple\n \u4e0d\u51fa\u610f\u5916\uff0c\u8fd9\u6837\u5c31\u628a\u4f9d\u8d56\u5b89\u88c5\u597d\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42_1","title":"4.2\u3001\u542f\u52a8\u670d\u52a1","text":"\u5c06\u57fa\u7840\u6846\u67b6\u4e2d\u7684 scr/ocr/pdocr_rpc_server.py \u6587\u4ef6\u62f7\u8d1d\u5230 ocr_env \u76ee\u5f55\uff0c\u540e\u53f0\u6267\u884c\u5b83\u5c31\u597d\u4e86\uff1a cd ocr_env\nnohup pipenv run python pdocr_rpc_server.py &\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#43","title":"4.3\u3001\u914d\u7f6e\u5f00\u673a\u81ea\u542f\uff08\u901a\u7528\uff09","text":"\u4f60\u80af\u5b9a\u4e0d\u60f3\u6bcf\u6b21\u673a\u5668\u91cd\u542f\u4e4b\u540e\u90fd\u9700\u8981\u624b\u52a8\u542f\u52a8\u670d\u52a1\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u914d\u7f6e\u5f00\u673a\u81ea\u542f\u3002 \u5199\u5f00\u673a\u81ea\u542f\u670d\u52a1\u6587\u4ef6\uff1a sudo vim /lib/systemd/system/ocr.service\n autoocr \u540d\u79f0\u4f60\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff0c\u5199\u5165\u4ee5\u4e0b\u5185\u5bb9\uff1a [Unit]\nDescription=OCR Service\nAfter=multi-user.target\n\n[Service]\nUser=uos\nGroup=uos\nType=idle\nWorkingDirectory=/home/uos/ocr_env\nExecStart=pipenv run python pdocr_rpc_server.py\n\n[Install]\nWantedBy=multi-user.target\n \u6ce8\u610f\u66ff\u6362\u4f60\u7684${USER} \u4fee\u6539\u914d\u7f6e\u6587\u4ef6\u7684\u6743\u9650\uff1a sudo chmod 644 /lib/systemd/system/ocr.service\n \u81ea\u542f\u670d\u52a1\u751f\u6548\uff1a sudo systemctl daemon-reload\nsudo systemctl enable ocr.service\n \u67e5\u770b\u670d\u52a1\u72b6\u6001\uff1a sudo systemctl status ocr.service\n \u4f60\u53ef\u4ee5\u518d\u91cd\u542f\u4e0b\u7535\u8111\uff0c\u770b\u770b\u670d\u52a1\u662f\u4e0d\u662f\u6b63\u5e38\u542f\u52a8\u4e86\uff0c\u6ca1\u62a5\u9519\u5c31 OK \u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_4","title":"\u4e94\u3001\u5c5e\u6027\u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_3","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 UI \u81ea\u52a8\u5316\u5927\u591a\u90fd\u662f\u57fa\u4e8e\u6d4f\u89c8\u5668\u7684\uff0c\u6838\u5fc3\u662f\u5728\u7f51\u9875\u7684 DOM \u6811\u4e0a\u67e5\u627e\u5143\u7d20\uff0c\u5e76\u5bf9\u5176\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\uff1b Linux \u684c\u9762\u5e94\u7528\u5927\u591a\u662f\u91c7\u7528 Qt \u7f16\u5199\u7684\uff0c\u5728 Qt \u4e2d\u4e5f\u662f\u4ece\u6700\u9876\u5c42\u7684 MainWindow \u5f00\u59cb\u6784\u5efa\u5e94\u7528\uff0c\u6240\u4ee5\u903b\u8f91\u4e5f\u662f\u4e00\u6837\u7684\uff0cQt \u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u540c\u6837\u53ef\u4ee5\u901a\u8fc7 DOM \u6811\uff08\u5c5e\u6027\u6811\uff09\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff0c\u6211\u4eec\u79f0\u4e4b\u4e3a\u5c5e\u6027\u5b9a\u4f4d\u3002 \u501f\u52a9\u5f00\u6e90\u5de5\u5177 dogtail \u6211\u4eec\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u83b7\u53d6\uff0c\u4ece\u800c\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\u3002dogtail \u7684\u9879\u76ee\u4ecb\u7ecd\u53ef\u4ee5\u731b\u6233\u8fd9\u91cc\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_3","title":"2\u3001\u4f7f\u7528\u65b9\u6cd5","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#21sniff","title":"2.1\u3001sniff\uff08\u55c5\u63a2\u5668\uff09\u4f7f\u7528","text":"\u5728\u7ec8\u7aef\u8f93\u5165 sniff \u542f\u52a8 AT-SPI Browser mikigo@mikigo-PC:~$ sniff\n \u67e5\u770b\u5e94\u7528\u7684\u6807\u7b7e \u5728 sniff \u91cc\u9762\u53ef\u4ee5\u770b\u5230\u7cfb\u7edf\u4e2d\u5df2\u542f\u52a8\u7684\u5e94\u7528\uff0c\u70b9\u51fb\u5e94\u7528\u540d\u79f0\u524d\u9762\u7684\u4e09\u89d2\u5f62\u56fe\u6807\uff0c\u53ef\u4ee5\u5c55\u5f00\u5e94\u7528\u7684\u6807\u7b7e\uff0c\u6240\u6709\u6807\u7b7e\u4ee5 tree \u7684\u5f62\u5f0f\u5c55\u793a\uff0c\u5bf9\u5e94\u5e94\u7528\u91cc\u9762\u7684\u7236\u7a97\u53e3\u548c\u5b50\u7a97\u53e3\u3002 \u83b7\u53d6\u5143\u7d20\u63a7\u4ef6\u7684\u6807\u7b7e\u540d\u79f0 \u9996\u5148\uff0c\u4e3a\u4e86\u65b9\u4fbf\u67e5\u770b\u5143\u7d20\u63a7\u4ef6\u5bf9\u5e94\u7684\u4f4d\u7f6e\uff0c\u5efa\u8bae\u73b0\u5728\u4e0a\u65b9\u5de5\u5177\u680f\u70b9\u51fb Actions\uff0c\u7136\u540e\u52fe\u9009 Hightlight Items\uff0c\u8fd9\u6837\u5728 sniff \u4e2d\u9f20\u6807\u9009\u4e2d\u5143\u7d20\u6807\u7b7e\u7684\u65f6\u5019\uff0c\u5e94\u7528\u4e2d\u4f1a\u6709\u76f8\u5e94\u7684\u5149\u6807\u9501\u5b9a\u3002 \u5728 sniff \u91cc\u9762\u70b9\u51fb\u8fdb\u5165\u5e94\u7528\u7684\u6807\u7b7e tree \u4e2d\u540e\uff0c\u70b9\u51fb\u76f8\u5e94\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5728\u5de5\u5177\u4e0b\u65b9\uff0c\u4f1a\u5c55\u793a\u5143\u7d20\u63a7\u4ef6\u7684 Name\uff0c\u8fd9\u4e2a\u5c31\u662f\u6807\u7b7e\u540d\u79f0\u3002 \u5728 tree \u4e2d\u6709\u4e9b\u5730\u65b9\u662f\u7a7a\u767d\u7684\u6216\u8005\u662f Form\uff0c\u662f\u56e0\u4e3a\u5f00\u53d1\u4eba\u5458\u5728\u6dfb\u52a0\u6807\u7b7e\u7684\u65f6\u5019\u6ca1\u6709\u6dfb\u52a0\uff0c\u6216\u8005\u6709\u4e9b\u7236\u7a97\u53e3\u4e0d\u9700\u8981\u6dfb\u52a0\uff0c\u8fd9\u79cd\u5728\u5b9e\u9645\u4e1a\u52a1\u4e2d\u662f\u4e0d\u5f71\u54cd\u7684\uff0c\u6211\u4eec\u53ea\u8981\u4fdd\u8bc1\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\u4e2d\uff0c\u8981\u7528\u5230\u7684\u5143\u7d20\u90fd\u6dfb\u52a0\u4e86\u6807\u7b7e\u5373\u53ef\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#22","title":"2.2\u3001\u5143\u7d20\u64cd\u4f5c","text":"\u83b7\u53d6\u5e94\u7528\u5bf9\u8c61 dogtail \u83b7\u53d6\u5e94\u7528\u5bf9\u8c61\u7684\u65f6\u5019\uff0c\u4f7f\u7528\u7684\u662f tree \u5e93\u91cc\u9762\u7684 application() \u65b9\u6cd5\uff1a from dogtail.tree import root\napp_obj = root.application('deepin-music')\n app_obj\u5c31\u662f\u5e94\u7528\u7684\u5bf9\u8c61\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\uff0c\u662f\u5e94\u7528\u5bf9\u8c61\u4f7f\u7528child()\u65b9\u6cd5\uff1a element = app_obj.child('element_name')\n \u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u4f20\u5165\u5143\u7d20\u7684 Name\uff0c\u83b7\u53d6\u5230\u76f8\u5e94\u5143\u7d20\u7684\u5bf9\u8c61\u3002Name \u53ef\u4ee5\u901a\u8fc7 sniff \u67e5\u770b\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\u5217\u8868: element_list = element.children\n \u83b7\u53d6\u5230\u8fd9\u4e2a\u5143\u7d20\u4e0b\u9762\u6240\u6709\u7684\u5143\u7d20\u5217\u8868\u3002 \u8fd9\u4e2a\u65b9\u6cd5\u9002\u7528\u4e8e\u6709\u4e9b\u6807\u7b7e\u6ca1\u6709\u6dfb\u52a0\uff0c\u4f46\u662f\u4f4d\u7f6e\u662f\u56fa\u5b9a\u7684\uff0c\u6211\u4eec\u901a\u8fc7\u7d22\u5f15\u53ef\u4ee5\u53d6\u5f97\u5143\u7d20\u3002 element_list[0]\n \u5bf9\u5143\u7d20\u7684\u64cd\u4f5c \u5728\u83b7\u53d6\u5230\u5143\u7d20\u4e4b\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u76f8\u5e94\u7684\u64cd\u4f5c\u3002 \u5355\u51fb element.click(button=1)\n button 1 \u2014>\u5de6\u952e\uff0c2 \u2014>\u6eda\u8f6e\uff0c3 \u2014>\u53f3\u952e\uff0c\u9ed8\u8ba4\u4e3a 1 \u53cc\u51fb element.doubleClick(button=1)\n \u9f20\u6807\u60ac\u505c element.point()\n \u9f20\u6807\u79fb\u52a8\u5230\u5143\u7d20\u4e2d\u5fc3\u4f4d\u7f6e \u6587\u672c\u8f93\u5165 element.typeText(string)\n \u5411\u5143\u7d20\u5bf9\u8c61\u8f93\u5165\u5b57\u7b26\u4e32 \uff0c\u6bd4\u5982\u8f93\u5165\u6846 \u7ec4\u5408\u952e element.keyCombo(comboString)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#23","title":"2.3\u3001\u6846\u67b6\u5c01\u88c5","text":"\u4ee3\u7801\u793a\u4f8b\uff1a # \u8be6\u7ec6\u4ee3\u7801\u8bf7\u67e5\u770b src/dogtail_utils.py\nclass DogtailUtils:\ndef __init__(self, name=None, description=None):\nself.name = name\nself.description = description\nself.obj = root.application(self.name, self.description)\ndef app_element(self, *args, **kwargs):\n\"\"\"\n \u83b7\u53d6app\u5143\u7d20\u7684\u5bf9\u8c61\n :return: \u5143\u7d20\u7684\u5bf9\u8c61\n \"\"\"\nreturn self.obj.child(*args, **kwargs, retry=False)\ndef element_center(self, element) -> tuple:\n\"\"\"\n \u83b7\u53d6\u5143\u7d20\u7684\u4e2d\u5fc3\u4f4d\u7f6e\n :param element:\n :return: \u5143\u7d20\u4e2d\u5fc3\u5750\u6807\n \"\"\"\n_x, _y, _w, _h = self.app_element(element).extents\n_x = _x + _w / 2\n_y = _y + _h / 2\nreturn _x, _y\n \u6846\u67b6\u63d0\u4f9b\u7684\u63a5\u53e3\u975e\u5e38\u7b80\u6d01\uff0c\u5728\u8c03\u7528\u65f6\uff1a self.dog.element_center(\"\u64ad\u653e\")\n \u8fd9\u6837\u5c31\u80fd\u83b7\u53d6\u5230\u6b64\u5143\u7d20\u7684\u4e2d\u5fc3\u5750\u6807\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_5","title":"\u516d\u3001\u6807\u7b7e\u5316\u7ba1\u7406","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_4","title":"1\u3001\u6807\u7b7e\u8bf4\u660e","text":"\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u811a\u672c ID\uff1a\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c/\u51fd\u6570 ID\uff1b PMS\u7528\u4f8bID\uff1aPMS \u4e0a\u5bf9\u5e94\u7684\u7528\u4f8b ID\uff08\u7528\u4f8b\u5e93 ID\uff09\uff1b \u9ed8\u8ba4\u4f7f\u7528\u7528\u4f8b\u5e93 ID\uff0c\u5bf9\u4e8e\u6682\u65f6\u6ca1\u6709\u4f7f\u7528\u7528\u4f8b\u5e93\u7ba1\u7406\u7528\u4f8b\u7684\u9879\u76ee\uff0c\u53ef\u4ee5\u4f7f\u7528\u4ea7\u54c1\u5e93\u7528\u4f8b ID\uff1b \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1aFUNC\uff08\u529f\u80fd\uff09\u3001PERF\uff08\u6027\u80fd\uff09\u3001STR\uff08\u538b\u529b\uff09\u3001SEC\uff08\u5b89\u5168\uff09\u3001CTS\uff08\u517c\u5bb9\u6027\uff09\u3001API\uff08\u63a5\u53e3\uff09\u3001BASELINE\uff08\u57fa\u7ebf-\u9884\u7559\uff09 \u8bbe\u5907\u7c7b\u578b\uff1aPPL\uff08\u4f9d\u8d56\u5916\u8bbe\u7684\u7528\u4f8b\uff09\u3001COL\uff08\u4f9d\u8d56\u4e3b\u63a7\u673a\u7684\u7528\u4f8b\uff09 \u7528\u4f8b\u6765\u6e90\uff1aBUG\uff08\u7531 Bug \u8f6c\u7684\u7528\u4f8b\uff09 \u4e0a\u7ebf\u5bf9\u8c61\uff1aCICD\uff0c\u8868\u793a\u4e0a\u7ebf\u5230 CICD \u6d41\u6c34\u7ebf\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u53ef\u4e00\u952e\u751f\u6210 case_list.csv \u6587\u4ef6\uff0c\u7528\u4e8e\u5bfc\u5165\u5230\u660e\u9053\u4e91 AT \u7528\u4f8b\u5217\u8868\u4e2d\u63a7\u5236 CICD \u8dd1\u6d4b\u8303\u56f4\uff1b \u6d4b\u8bd5\u7ea7\u522b\uff1aC1 / C2 / C3 / C4\uff0c\u5177\u4f53\u5b9a\u4e49\u53c2\u8003\u6d41\u6c34\u7ebf\u4f7f\u7528\u6307\u5bfc\uff1b \u8df3\u8fc7\u539f\u56e0\uff1askip-XXX\uff0c\u7528\u4e8e\u63a7\u5236\u7528\u4f8b\u662f\u5426\u6267\u884c\uff1b \u786e\u8ba4\u4fee\u590d\uff1afixed-XXX\uff0c\u7528\u4e8e\u6807\u8bb0\u7528\u4f8b\u7684\u4fee\u590d\u72b6\u6001\uff08\u540e\u9762\u8be6\u7ec6\u8bb2\u89e3\u7528\u6cd5\uff09\uff1b \u5e9f\u5f03\u7528\u4f8b\uff1aremoved-\u5df2\u5e9f\u5f03\uff0c\u7528\u4e8e\u6807\u8bb0\u5df2\u7ecf\u5e9f\u5f03\u7684\u7528\u4f8b\uff0c\u6b64\u7528\u4f8b\u6807\u7b7e\u4e0d\u4f1a\u88ab\u6dfb\u52a0\uff0c\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff1b \u793a\u4f8b\uff1a \u811a\u672cID PMS\u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u8bbe\u5907\u7c7b\u578b \u7528\u4f8b\u6765\u6e90 \u4e0a\u7ebf\u5bf9\u8c61 \u6d4b\u8bd5\u7ea7\u522b \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b ... 679537 679537 L1 FUNC PPL CICD C1 skip-XXX fixed-XXX removed-\u5df2\u5e9f\u5f03 ..."},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_4","title":"2\u3001\u64cd\u4f5c\u6b65\u9aa4","text":"2.1\u3001\u5728\u5b50\u9879\u76ee\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u4ee5\u7528\u4f8b\u7684 py \u6587\u4ef6\u9664\u53bb\u9996\u5b57\u7b26\u4e32 \"test_\" \u548c\u7528\u4f8b\u5e8f\u53f7\u540e\u7684\u5b57\u7b26\u4e32\u4f5c\u4e3a csv \u7684\u6587\u4ef6\u540d\u3002 \u4f8b\u5982: \u76f8\u518c\u7684\u7528\u4f8b\u6587\u4ef6\u4e3a test_album_xxx.py\uff0cxxx \u8868\u793a\u7528\u4f8b\u7684ID\uff08\u4e5f\u53ef\u4ee5\u662f\u81ea\u5b9a\u4e49\u7684\u6570\u5b57\u4ee3\u8868\u7528\u4f8b\u5e8f\u53f7\uff09\uff0c\u6b64\u65f6 csv \u6587\u4ef6\u540d\u5c31\u5e94\u4e3a album.csv\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u6240\u6709 csv \u6587\u4ef6\u5efa\u8bae\u653e\u5728\u4e00\u4e2a tags \u76ee\u5f55\u4e0b\u3002 \u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 2.2\u3001\u7b2c\u4e00\u5217\u4e3a\u811a\u672c ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b\u7528\u4f8b\u6807\u7b7e\u53ef\u4ee5\u65e0\u5e8f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_2","title":"3\u3001\u589e\u52a0\u8bf4\u660e","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_1","title":"3.1\u3001\u8df3\u8fc7\u7528\u4f8b","text":"\u4f20\u7edf\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668(@pytest.mark.skip)\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a; \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#311","title":"3.1.1\u3001\u56fa\u5b9a\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 679537 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u7b7e\u5f00\u5934\u4e3a \u201cskip-XXX\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\uff0c\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\u5219\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u7b7e\u4e3a SKIPED\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#312","title":"3.1.2\u3001\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skipif_platform-aarch64&mips64 \u67d0\u4e9b\u7528\u4f8b\u4f1a\u56e0\u4e3a\u4e0d\u540c\u7684\u73af\u5883\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\uff0c\u5e38\u89c1\u7684\u573a\u666f\u4e3a\u5728\u4e0d\u540c\u67b6\u6784\u4e0a\u5224\u65ad\u662f\u5426\u6267\u884c\uff0c\u8df3\u8fc7\u7684\u539f\u56e0\u6807\u7b7e\u4e3a \u201cskipif_platform-\u201d \u52a0\u67b6\u6784\u540d\uff0c\u591a\u4e2a\u67b6\u6784\u4e4b\u95f4\u4f7f\u7528 \u201c&\u201d \u62fc\u63a5\uff1b \u4ee5\u4e0a\u4f8b\u5b50\u4e3a\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u5224\u65ad\u5f53\u524d\u67b6\u6784\u662f\u5426\u4e3a arrch64 \u6216\u8005 mips64\uff0c\u82e5\u662f\uff0c\u5219\u8df3\u8fc7\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u82e5\u5426\u5219\u6267\u884c\u7528\u4f8b\uff1b \u76ee\u524d\u6846\u67b6\u9ed8\u8ba4\u4ec5\u652f\u6301\u67b6\u6784\u7684\u6761\u4ef6\u5224\u65ad\uff0c\u4f46\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u903b\u8f91\u652f\u6301\u81ea\u5b9a\u4e49\u6dfb\u52a0\u3002 \u5728\u9879\u76ee\u76ee\u5f55\u8def\u5f84\u4e0b\u5b58\u5728\u6587\u4ef6 setting/skipif.py\uff0c\u6240\u6709\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u7684\u51fd\u6570\u5199\u5728\u6b64\u6587\u4ef6\u4e2d\u3002 \u9ed8\u8ba4\u67b6\u6784\u5224\u65ad\u4f8b\u5b50\uff1a def skipif_platform(args: str):\n\"\"\"\u5e73\u53f0\u8df3\u8fc7\"\"\"\n_skip_key = args.split(\"&\")\nfor key in _skip_key:\nif GlobalConfig.SYS_ARCH == key:\nreturn True\nreturn False\n \u65b9\u6cd5\u7f16\u5199\u89c4\u8303\uff1a \u65b9\u6cd5\u540d\u5fc5\u987b\u4ee5 skipif \u5f00\u5934\uff1b \u65b9\u6cd5\u5fc5\u987b\u6709\u8fd4\u56de\u7ed3\u679c\u5e76\u4e14\u4e3a\u5e03\u5c14\u503c\uff08True \u4ee3\u8868\u8df3\u8fc7\uff0cFalse \u4ee3\u8868\u4e0d\u8df3\u8fc7\uff09\uff1b \u65b9\u6cd5\u53ea\u80fd\u6709\u4e00\u4e2a\u5165\u53c2\uff1b \u5728 csv \u6587\u4ef6\u8df3\u8fc7\u539f\u56e0\u4e00\u680f\u4e2d\u586b\u5199\u4e3a \u201c{\u51fd\u6570\u540d}-{\u53c2\u6570}\u201d\uff0c\u4f8b\u5982\uff1askipif_platform-aarch64\uff1b\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u4f1a\u4ee5\u7b2c\u4e00\u4e2a \u201c-\u201d \u8fdb\u884c\u5206\u5272\uff0c\u622a\u53d6\u7684\u5de6\u4fa7\u5b57\u7b26\u4e32\u4f5c\u4e3a\u51fd\u6570\u540d\uff0c\u5728 skipif.py \u6587\u4ef6\u4e2d\u67e5\u627e\u662f\u5426\u6709\u540c\u540d\u51fd\u6570\uff0c\u5e76\u5c06\u622a\u53d6\u7684\u53f3\u4fa7\u4f5c\u4e3a\u53c2\u6570\u4f20\u9012\u7ed9\u8be5\u51fd\u6570\uff0c\u901a\u8fc7\u83b7\u53d6\u8be5\u51fd\u6570\u8fd4\u56de\u7684\u5e03\u5c14\u503c\uff0c\u8fd4\u56de True\uff0c\u5219\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u8fd4\u56de False\uff0c\u5219\u6267\u884c\u8be5\u7528\u4f8b\u3002 \u82e5\u51fd\u6570\u9700\u8981\u591a\u4e2a\u53c2\u6570\uff0c\u53ef\u81ea\u5b9a\u4e49\u591a\u4e2a\u53c2\u6570\u4e4b\u95f4\u7684\u8fde\u63a5\u7b26\uff0c\u8fde\u63a5\u7b26\u53f7\u4e0d\u53ef\u4f7f\u7528\u4e0b\u5212\u7ebf\u548c\u9017\u53f7\uff0c\u63a8\u8350\u7edf\u4e00\u4f7f\u7528 & \u7b26\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32","title":"3.2\u3001\u786e\u8ba4\u4fee\u590d","text":"\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7528\u4f8b\u4fee\u590d\u540e\uff0c\u4f46\u4e0d\u80fd\u7acb\u5373\u5220\u9664\u8df3\u8fc7\u539f\u56e0\uff08skip-XXX\uff09\u7684\u7528\u4f8b\uff0c\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u786e\u8ba4\u4fee\u590d\u201d\uff0c\u4f5c\u4e3a\u6807\u8bb0\u8be5\u7528\u4f8b\u662f\u5426\u5df2\u7ecf\u4fee\u590d\uff0c\u56fa\u5b9a\u586b\u5165\u5b57\u6bb5\u4e3a \u201cfixed-\u5df2\u4fee\u590d\u201d\u3002\u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u5373\u4f7f\u540c\u65f6\u6807\u8bb0\u4e86 skip-XXX \u4e5f\u4f1a\u6b63\u5e38\u6267\u884c\u3002 \u793a\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d 679537 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d \u3010\u540c\u65f6\u6807\u8bb0\u4e86skip \u548c fixed\uff0c\u4f46\u4ecd\u7136\u60f3\u8981\u8df3\u8fc7\u7528\u4f8b\u3011 \u5f53 \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u540c\u65f6\u586b\u5165\u540e\uff0c\u547d\u4ee4\u884c\u4f20\u9012\u53c2\u6570 --ifixed yes\uff0c\u5219\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\u8be5\u6761\u7528\u4f8b\u3002 python3 manage.py run --ifixed yes\n \u770b\u5230\u8fd9\u91cc\u6709\u4e9b\u540c\u5b66\u53ef\u80fd\u8981\u95ee\u4e86\uff0c\u6211\u60f3\u6062\u590d\u8df3\u8fc7\u6267\u884c\uff0c\u76f4\u63a5\u628a skip-XXX \u8fd9\u4e00\u5217\u6807\u7b7e\u5220\u6389\u4e0d\u5c31\u597d\u4e86\uff0c\u8fd8\u641e\u4ec0\u4e48\u786e\u8ba4\u4fee\u590d\u5e72\u5565\uff1f \u8fd9\u91cc\u7ed9\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u89e3\u91ca\u4e00\u4e0b\uff1a \uff08\u4ee5\u4e0b\u6d41\u6c34\u7ebf\u6307\u7684\u662f\u6bcf\u65e5\u6784\u5efa\u7684\u6d41\u6c34\u7ebf\uff0c\u8dd1 AT \u7684\u5168\u91cf\u7528\u4f8b\uff09 \u9996\u5148\uff0c\u6d41\u6c34\u7ebf\u4e0a\u8dd1\u7684\u662f AT \u5386\u53f2 Tag\uff0c\u8df3\u8fc7\u7528\u4f8b\u7684\u6807\u7b7e(skip-XXX) \u662f\u5728\u6700\u65b0\u7684\u4ee3\u7801\u4e0a\u63d0\u4ea4\u7684\uff0c\u6211\u4eec\u91c7\u7528\u6700\u65b0\u7684 csv \u6587\u4ef6\u8986\u76d6\u5386\u53f2 csv \u6587\u4ef6\u7684\u8bbe\u8ba1\u6765\u5b9e\u73b0\u4e86\u5bf9\u5386\u53f2 Tag \u4e0a\u7528\u4f8b\u7684\u8df3\u8fc7\uff1b \u7136\u540e\uff0c\u5728\u65e5\u5e38\u8df3\u8fc7\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u540c\u65f6\u4e5f\u5728\u4fee\u590d\u4e00\u4e9b\u7528\u4f8b\uff0c\u4fee\u590d\u540e\u7684\u8fd9\u4e9b\u7528\u4f8b\u5728\u672c\u5730\u8c03\u8bd5\u7684\u65f6\u5019\u6211\u4eec\u4e0d\u5e0c\u671b\u7ee7\u7eed\u8df3\u8fc7\uff0c\u4f46\u662f\u6b64\u65f6\uff0c\u4fee\u590d\u7684\u8fd9\u4e9b\u7528\u4f8b\u53ef\u80fd\u8fd8\u4e0d\u7a33\u5b9a\uff0c\u4e0d\u9002\u5408\u9a6c\u4e0a\u653e\u5230\u6d41\u6c34\u7ebf\u53bb\u8dd1\uff0c\u4e5f\u5c31\u662f\u8bf4\u6d41\u6c34\u7ebf\u4e0a\u6211\u4eec\u662f\u5e0c\u671b\u4ed6\u7ee7\u7eed\u8df3\u8fc7\u7684\uff0c\u56e0\u6b64\uff0c\u54b1\u4e0d\u80fd\u76f4\u63a5\u628a skip-XXX \u5e72\u6389\uff1b \u8fd9\u91cc\u5c31\u77db\u76fe\u4e86\uff0c\u4e00\u4e2a\u9700\u6c42\u662f\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u53e6\u4e00\u4e2a\u9700\u6c42\u53c8\u4e0d\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u600e\u4e48\u529e\u5462\uff1f \u6211\u4eec\u4f7f\u7528\u201c\u786e\u8ba4\u4fee\u590d\u201d\u6765\u6807\u8bb0\u8fd9\u6761\u7528\u4f8b\u5df2\u7ecf\u4fee\u590d\u4e86\uff0c\u8fd9\u6837\u4f60\u672c\u5730\u8c03\u8bd5\u7528\u4f8b\u7684\u65f6\u5019\u8fd9\u6761\u5df2\u4fee\u590d\u7684\u7528\u4f8b\u662f\u4f1a\u6267\u884c\u7684\uff0c\u540c\u65f6\u5728\u6d41\u6c34\u7ebf\u4e0a\u5c06 --ifixed yes \u53c2\u6570\u52a0\u4e0a\uff0c\u90a3\u4e48\u6d41\u6c34\u7ebf\u4e0a\u6267\u884c\u65f6\u8fd9\u6761\u7528\u4f8b\u4ecd\u7136\u662f\u8df3\u8fc7\u7684\u72b6\u6001\uff0c\u540e\u7eed\u4f60\u6253 Tag \u7684\u65f6\u5019\uff0c\u628a \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u7684\u6807\u7b7e\u5168\u90e8\u5220\u6389\u5c31\u53ef\u4ee5\u4e86\u3002 \u8fd9\u5c31\u662f\u201c\u786e\u8ba4\u4fee\u590d\u201d\u8fd9\u4e2a\u6807\u7b7e\u7684\u80cc\u666f\uff0c\u9700\u8981\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u54c1\u4e00\u54c1\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#33","title":"3.3\u3001\u5e9f\u5f03\u7528\u4f8b","text":"\u9488\u5bf9\u67d0\u4e9b\u7528\u4f8b\uff0c\u7531\u4e8e\u9700\u6c42\u53d8\u66f4\uff0c\u73af\u5883\u5f71\u54cd\u6216\u8bc4\u4f30\u4e0d\u518d\u9002\u7528\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u65f6\uff0c\u7528\u4f8b\u9700\u8981\u5e9f\u5f03\uff0c\u5219\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u5e9f\u5f03\u7528\u4f8b\u201d\uff0c\u8be5\u5217\u5b58\u5728 \u201cremoved-{\u5e9f\u5f03\u539f\u56e0}\u201d\uff0c\u5219\u7528\u4f8b\u4e0d\u4f1a\u6267\u884c\u3002 \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d removed-\u5df2\u5e9f\u5f03 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_2","title":"4\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u4e0a\u9762\u4ecb\u7ecd Pytest \u6846\u67b6\u63d0\u4f9b\u7684\u6807\u7b7e\u529f\u80fd mark\uff0c\u4f7f\u7528\u65f6\u9700\u8981\u4e3a\u6bcf\u4e00\u4e2a\u7528\u4f8b\u6dfb\u52a0\u6807\u7b7e\u88c5\u9970\u5668\uff0c\u5219\u64cd\u4f5c\u590d\u6742\uff0c\u53ef\u7ef4\u62a4\u6027\u5dee\uff0c\u5176\u6839\u672c\u95ee\u9898\u5c31\u662f\u6807\u7b7e\u5206\u6563\u5728\u6bcf\u4e00\u6761\u7528\u4f8b\u7684\u88c5\u9970\u5668\u4e0a\uff0c\u96be\u4ee5\u96c6\u4e2d\u7ef4\u62a4\uff1b\u4e8e\u662f\u4e4e\u5c06\u6240\u6709\u6807\u7b7e\u4f7f\u7528 csv \u6587\u4ef6\u8fdb\u884c\u96c6\u4e2d\u7ba1\u7406\uff0c\u5e76\u901a\u8fc7 Pytest \u7684\u94a9\u5b50\u51fd\u6570\uff0c\u8bfb\u53d6 csv \u6587\u4ef6\uff0c\u52a8\u6001\u6dfb\u52a0\u6807\u7b7e\u5230\u7528\u4e2d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5csv","title":"5\u3001CSV\u6587\u4ef6\u683c\u5f0f","text":"\u6b64\u914d\u7f6e\u6587\u4ef6\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u6807\u7b7e\u6570\u636e\uff0c\u4e14\u8981\u65b9\u4fbf\u80fd\u4f7f\u7528 Excel \u6253\u5f00\u8fdb\u884c\u7f16\u8f91\u67e5\u770b\uff0c\u66f4\u91cd\u8981\u7684\u662f\u6211\u4eec\u4e0d\u60f3\u5f15\u5165\u4e09\u65b9\u4f9d\u8d56\uff0cCSV \u6587\u4ef6\u51e0\u4e4e\u662f\u552f\u4e00\u80fd\u6ee1\u8db3\u6240\u6709\u7684\u8981\u6c42\u7684\u6587\u4ef6\u683c\u5f0f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_6","title":"\u4e03\u3001\u65e5\u5fd7\u7cfb\u7edf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_5","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e YouQu \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u64cd\u4f5c\u65b9\u6cd5\u5c01\u88c5\u5199\u6cd5\uff0c\u901a\u5e38\u662f\u8fd9\u6837\u7684\uff1a\u7c7b\u91cc\u9762\u4e00\u4e2a\u51fd\u6570\u53ea\u5305\u542b\u4e00\u4e2a\u64cd\u4f5c\u6216\u591a\u6b21\u8c03\u7528\u7684\u4e00\u7cfb\u5217\u53ef\u5408\u5e76\u7684\u64cd\u4f5c\uff1b \u4f20\u7edf\u7684\u65e5\u5fd7\u8f93\u51fa\u65b9\u5f0f\uff0c\u9700\u8981\u5728\u6bcf\u4e2a\u51fd\u6570\u91cc\u9762\u4e3b\u52a8\u7f16\u5199\u65e5\u5fd7\u8f93\u51fa\u4ee3\u7801 \uff0c\u4f8b\u5982\uff1a class XXXWidget:\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\nlogger.info(\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\")\n...\n# \u7701\u7565\u4ee3\u7801\u90e8\u5206\n \u4e00\u4e2a\u51fd\u6570\u91cc\u9762\u81f3\u5c11\u5305\u542b\u4e00\u6761\u65e5\u5fd7\u4fe1\u606f\uff0c\u5982\u679c\u6bd4\u8f83\u590d\u6742\u64cd\u4f5c\u6b65\u9aa4\uff0c\u53ef\u80fd\u5305\u542b\u591a\u6761\u65e5\u5fd7\u4fe1\u606f\uff1b \u4e00\u4e2a\u5e94\u7528\u542b\u6709\u5927\u91cf\u7684\u64cd\u4f5c\u51fd\u6570\uff0c\u4e5f\u5c31\u662f\u8bf4\u6211\u4eec\u9700\u8981\u5199\u5927\u91cf\u7684\u65e5\u5fd7\u4ee3\u7801\uff1b \u901a\u8fc7\u7ecf\u9a8c\u89c2\u5bdf\uff0c\u6211\u4eec\u53d1\u73b0\uff0c\u51fd\u6570\u8bf4\u660e\u4ee5\u53ca\u51fd\u6570\u64cd\u4f5c\u65e5\u5fd7\uff0c\u5177\u6709\u8f83\u9ad8\u7684\u91cd\u590d\u5ea6\uff08\u4ece\u4e0a\u9762\u7684\u4f8b\u5b50\u4e5f\u53ef\u4ee5\u770b\u51fa\u6765\uff09\uff0c\u56e0\u6b64\u6211\u4eec\u5927\u80c6\u7684\u8bbe\u60f3\uff0c\u80fd\u4e0d\u80fd\u57fa\u4e8e\u6846\u67b6\u6267\u884c\u65f6\uff0c\u81ea\u52a8\u7684\u5c06\u51fd\u6570\u8bf4\u660e\u4f5c\u4e3a\u65e5\u5fd7\u6253\u5370\u51fa\u6765\uff0c\u4ece\u800c\u51cf\u5c11\u5927\u91cf\u65e5\u5fd7\u4ee3\u7801\u91cf\u548c\u91cd\u590d\u7f16\u5199\uff0c\u90a3\u771f\u662f\u5999\u554a~\u3002 \u57fa\u4e8e\u6b64\u201c\u5929\u771f\u201d\u7684\u60f3\u6cd5\uff0c\u6211\u4eec\u8bbe\u8ba1\u51fa\u4e86 youqu \u7684\u65e5\u5fd7\u7cfb\u7edf\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_5","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u6838\u5fc3\u539f\u7406\uff1a \u901a\u8fc7\u7ed9\u7c7b\u52a0\u4e0a\u4e00\u4e2a\u88c5\u9970\u5668 @log\uff0c\u52a8\u6001\u7ed9\u8be5\u7c7b\u4e0b\u6240\u6709\u7684\u51fd\u6570\u53ca\u7236\u7c7b\u51fd\u6570\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668 @_trace\uff0c\u5728\u6b64\u88c5\u9970\u5668\u4e2d\u6211\u4eec\u80fd\u52a8\u6001\u7684\u6355\u83b7\u6240\u8c03\u7528\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff08func.__doc__\uff09\uff0c\u901a\u8fc7\u65e5\u5fd7\u8f93\u51fa\u5668\u5c06\u5176\u8f93\u51fa\u5373\u53ef\u3002 \u5b9e\u73b0\u6b65\u9aa4\uff1a \u901a\u8fc7 inspect.getmembers \u83b7\u53d6\u88ab\u88c5\u9970\u7684\u7c7b\u4e0b\u6240\u6709\u51fd\u6570\uff0c\u5305\u542b\u9759\u6001\u65b9\u6cd5\uff0c\u7c7b\u65b9\u6cd5\uff0c\u5b9e\u4f8b\u65b9\u6cd5\uff1b \u901a\u8fc7 setattr(\u7c7b, \u65b9\u6cd5, _trace\uff09 \u7684\u65b9\u5f0f\uff0c\u7ed9\u7b26\u5408\u6761\u4ef6\u7684\u51fd\u6570\uff0c\u52a8\u6001\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_3","title":"3\u3001\u65e5\u5fd7\u914d\u7f6e","text":"[log_cli]\n;\u65e5\u5fd7\u76f8\u5173\u914d\u7f6e\uff08\u4e0d\u6253\u5370\u6784\u9020\u51fd\u6570\u548c\u9b54\u6cd5\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff09\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = INFO\n# ============= \u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u914d\u7f6e ================\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u5f00\u5934\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7, \u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_STARTSWITH = Assert\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u7ed3\u5c3e\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_ENDSWITH = Widget\n;\u652f\u6301\u7c7b\u540d\u5305\u542b xxx \u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_CONTAIN = ShortCut\n# ==============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_3","title":"4\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u5728\u5e94\u7528\u5e93 widget \u65b9\u6cd5\u5e93\u91cc\u9762\uff0c\u53ea\u9700\u8981\u5728\u51fa\u53e3\u6587\u4ef6\u52a0\u4e0a\u7c7b\u88c5\u9970\u5668\uff0c\u5c31\u53ef\u4ee5\u5b9e\u73b0\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u4e86\uff1b # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6ce8\u610f\uff0c\u662f\u7c7b\u88c5\u9970\u5668\u3002 \u5b9e\u4f8b\uff1a # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\n@classmethod\ndef find_dfm_image(cls, *elements, multiple=False, rate=0.9):\n\"\"\"\n \u67e5\u627e\u56fe\u7247 {{elements}}.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e {{rate}} \u7684\u5750\u6807\n :param elements:\n :param multiple:\n :return:\n \"\"\"\nelement = tuple(map(lambda x: f\"{Config.PIC_RES_PATH}/{x}\", elements))\nreturn cls.find_image(*element, multiple=multiple)\n \u8c03\u7528\u65b9\u6cd5\u65f6\uff1a DfmWidget.find_dfm_image(\"dfm_001\")\n \u81ea\u52a8\u8f93\u51fa\u7684\u65e5\u5fd7\uff1a >> x86_64-uos-6: 02/28 17:48:47 | INFO | logger_utils: [find_dfm_image]: \u67e5\u627e\u56fe\u7247 dfm_001.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e 0.9 \u7684\u5750\u6807\n \u52a0\u4e0a\u88c5\u9970\u5668 @log \u4e4b\u540e\uff0c\u65b9\u6cd5\u5c42\u6240\u6709\u7684\u51fd\u6570\uff08\u5305\u62ec\u5b9e\u4f8b\u65b9\u6cd5\u3001\u7c7b\u65b9\u6cd5\u3001\u9759\u6001\u65b9\u6cd5\uff09\u90fd\u4e0d\u9700\u8981\u518d\u5199\u65e5\u5fd7\u4ee3\u7801\uff0c\u6267\u884c\u7684\u65f6\u5019\u4f1a\u81ea\u52a8\u8f93\u51fa\uff0c\u5e76\u4e14\u6240\u6709\u8c03\u7528\u7684\u65b9\u6cd5\u4f1a\u4ee5 allure.step \u7684\u65b9\u5f0f\uff0c\u5c55\u793a\u5728 allure \u62a5\u544a\u4e2d\uff0c\u5728\u62a5\u544a\u4e2d\u66f4\u80fd\u4e00\u76ee\u4e86\u7136\u7684\u770b\u5230\u7528\u4f8b\u6267\u884c\u6b65\u9aa4\u3002 \u3010\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\u3011 \u901a\u8fc7\u89c2\u5bdf\u524d\u9762\u7684\u4f8b\u5b50\uff0c\u7ec6\u5fc3\u7684\u540c\u5b66\u53ef\u80fd\u8fd8\u53d1\u73b0\u4e86\u4e00\u4e2a\u5c0f\u7ec6\u8282\uff1a\u51fd\u6570\u529f\u80fd\u8bf4\u660e\u4e2d\uff0c\u4e24\u5bf9\u5927\u62ec\u53f7\u4e2d\u7684\u5185\u5bb9 {{elements}} \u4f5c\u4e3a\u53d8\u91cf\u8f93\u51fa\u51fa\u6765\u4e86\uff1b \u6ca1\u9519\uff0c\u8fd9\u5c31\u662f\u6211\u4eec\u53c2\u8003Django \u548c jinja2 \u7684\u6a21\u677f\u8bed\u6cd5\u8bbe\u8ba1\u51fa\u7684\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\uff0c\u4f7f\u7528\u65b9\u6cd5\u5f88\u7b80\u5355\uff0c\u7528\u4e24\u5bf9\u5927\u62ec\u53f7\u628a\u51fd\u6570\u7684\u53c2\u6570\u62ec\u8d77\u6765\uff0c\u8fd9\u6837\u5728\u65e5\u5fd7\u8f93\u51fa\u7684\u65f6\u5019\u5c31\u80fd\u628a\u8c03\u7528\u51fd\u6570\u65f6\u53c2\u6570\u7684\u503c\u8f93\u51fa\u51fa\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_7","title":"\u516b\u3001\u73af\u5883\u90e8\u7f72","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_6","title":"1\u3001\u539f\u5219","text":"YouQu \u7684\u73af\u5883\u4f9d\u8d56\u4e00\u76f4\u575a\u6301 2 \u4e2a\u539f\u5219\uff1a \u6700\u5c0f\u73af\u5883\u4f9d\u8d56\u539f\u5219 \u6709\u4e9b\u540c\u5b66\u5199\u4e00\u4e9b\u529f\u80fd\uff0c\u9996\u5148\u60f3\u5230\u7684\u5c31\u662f\u53bb\u641c\u7d22\u5f15\u64ce\u641c\u4e00\u4e0b\uff0c\u770b\u6709\u6ca1\u6709\u73b0\u6210\u7684\u5de5\u5177\u6216\u8005\u4ee3\u7801\u76f4\u63a5\u80fd\u7528\uff0c\u7f8e\u5176\u540d\u66f0\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\uff0c\u522b\u4eba\u5df2\u7ecf\u9020\u597d\u4e86\u8f6e\u5b50\u54b1\u4eec\u5c31\u4e0d\u8981\u91cd\u590d\u53bb\u9020\u4e86\uff0c\u7136\u540e\u4e00\u5207\u4f3c\u4e4e\u90fd\u53d8\u5f97\u90a3\u4e48\u7684\u7406\u6240\u5e94\u5f53\u3002 \u5f53\u7136\u8fd9\u6837\u505a\u65e0\u53ef\u539a\u975e\uff0c\u6211\u76f8\u4fe1\u6709\u8fd9\u6837\u60f3\u6cd5\u5e76\u4e14\u4e00\u76f4\u8df5\u884c\u8fd9\u6837\u505a\u6cd5\u7684\u540c\u5b66\u4e0d\u5728\u5c11\u6570\uff0c\u4f46\u8fd9\u6837\u505a\u6709\u4e00\u4e2a\u5f88\u4e25\u91cd\u7684\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f60\u5199\u4e00\u4e2a\u5927\u578b\u9879\u76ee\u65f6\uff0c\u4f60\u4f1a\u5f15\u5165\u975e\u5e38\u975e\u5e38\u975e\u5e38\u591a\u7684\u4f9d\u8d56\uff0c\u6bd4\u5982\u8981\u505a\u4e2a\u63a5\u53e3\u8bf7\u6c42\u8981\u7528 requests\u3001\u8bfb\u5199\u4e2a\u6570\u636e\u7528 pandas\u3001\u5199\u4e2a\u8868\u683c\u7528 pyopenxl\u3001\u89e3\u6790\u4e2a\u6587\u672c\u8981\u7528\u8fd9\u4e2a\u90a3\u4e2a\u4e09\u65b9\u5e93 ... \u3002 \u6211\u8ba4\u4e3a\u8fd9\u662f\u975e\u5e38\u4e0d\u597d\u7684\u4e60\u60ef\uff0c\u5728\u5b9e\u73b0\u4e00\u4e2a\u529f\u80fd\u7684\u65f6\u5019\uff0c\u9996\u5148\u6211\u4eec\u5e94\u8be5\u53bb\u60f3\u81ea\u5df1\u600e\u4e48\u6837\u53bb\u5b9e\u73b0\uff0c\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff1b \u5982\u679c\u4f60\u4e0d\u4f1a\uff0c\u4f60\u53ef\u4ee5\u53bb\u5b66\u4e60\u4e09\u65b9\u5e93\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u522b\u4eba\u4e09\u65b9\u5e93\u4e5f\u662f\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\u7684\uff0c\u4e3a\u4ec0\u4e48\u54b1\u4eec\u4e0d\u884c\u5462\uff1b\u5982\u679c\u522b\u4eba\u7684\u4f60\u5b9e\u5728\u662f\u770b\u4e0d\u61c2\uff0c\u60f3\u5c3d\u4e00\u5207\u529e\u6cd5\u786e\u5b9e\u505a\u4e0d\u51fa\u6765\uff0c\u90a3\u518d\u8003\u8651\u5f15\u5165\u8fd9\u4e2a\u4e09\u65b9\u5e93\uff0c\u6211\u8ba4\u4e3a\u8fd9\u6837\u662f\u6ca1\u95ee\u9898\u7684\uff0c\u6bd5\u7adf\u54b1\u4eec\u6bb5\u4f4d\u8fd8\u4e0d\u591f\uff0c\u4f46\u5e0c\u671b\u5c06\u6765\u6709\u4e00\u5929\u6211\u4eec\u53ef\u4ee5\u3002 \u8fd9\u6837\u7684\u505a\u6cd5\u624d\u5e94\u8be5\u662f\u201c\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\u201d\u6b63\u786e\u7684\u64cd\u4f5c\u3002\u4e0d\u4f1a\u6ca1\u5173\u7cfb\uff0c\u770b\u770b\u522b\u4eba\u662f\u600e\u4e48\u5b9e\u73b0\u7684\uff0c\u81ea\u5df1\u518d\u6478\u7d22\u7740\u5199\u51fa\u6765\uff0c\u8fd9\u6837\u81ea\u5df1\u624d\u80fd\u6709\u6240\u63d0\u9ad8\uff0c\u4e0d\u7136\u4f60\u5c31\u53ea\u4f1a\u7528\u522b\u4eba\u7684\u4e1c\u897f\uff1b\u90a3\u4e9b\u5632\u7b11\u3001\u6279\u8bc4\u6211\u4eec\u91cd\u590d\u9020\u8f6e\u5b50\u7684\u4eba\uff0c\u5148\u60f3\u60f3\u81ea\u5df1\u4f1a\u9020\u8f6e\u5b50\u5417\u3002 \u672c\u7740\u81ea\u5df1\u5b9e\u73b0\u80fd\u5b9e\u73b0\u7684\u4e00\u5207\u7684\u539f\u5219\uff0cYouQu \u6846\u67b6\u505a\u5230\u4e86\u975e\u5e38\u5c11\u7684\u73af\u5883\u4f9d\u8d56\uff0c\u800c\u4e14\u6211\u4eec\u4ecd\u5728\u4e0d\u65ad\u52aa\u529b\uff0c\u51cf\u5c11\u73af\u5883\u90e8\u7f72\u7684\u4f9d\u8d56\u3002 \u6700\u5c0f\u4ed3\u5e93\u4f53\u79ef\u539f\u5219 \u5927\u6587\u4ef6\u4e0d\u80fd\u4e0a\u4f20\u5230\u5de5\u7a0b\u91cc\u9762\uff0c\u4fdd\u6301\u6574\u4e2a\u5de5\u7a0b\u7684\u8f7b\u91cf\u5316\uff0c\u8fd9\u6837\u5728\u514b\u9686\u4ee3\u7801\u7684\u65f6\u5019\u624d\u80fd\u975e\u5e38\u5feb\u901f\u65b9\u4fbf\u4f7f\u7528\uff0c\u6211\u4eec\u89c1\u8fc7\u4e00\u4e2a AT \u5de5\u7a0b clone \u5927\u5c0f\u8fbe\u5230\u597d\u51e0\u4e2a G\uff0c\u7b80\u76f4\u4e0d\u53ef\u601d\u8bae\u3002 \u5176\u5b9e\u4ee3\u7801\u6587\u4ef6\u7684\u5927\u5c0f\u662f\u5f88\u5c0f\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u7eaf\u5199\u4ee3\u7801\u968f\u4fbf\u5199\u5de5\u7a0b\u4e5f\u4e0d\u4f1a\u592a\u5927\uff0c\u800c\u6587\u6863\uff08\u5305\u542b\u63d2\u56fe\uff09\u7b49\u8d44\u6e90\u5374\u662f\u5f88\u5360\u7a7a\u95f4\u3002 \u56e0\u6b64\u6211\u4eec\u9009\u62e9\u5c06 YouQu \u7684\u6587\u6863\u5de5\u7a0b\u6d89\u53ca\u5230\u7684\u56fe\u7247\u8d44\u6e90\u90fd\u91c7\u7528\u5916\u94fe\u52a0\u8f7d\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_6","title":"2\u3001\u5b89\u88c5","text":"\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u8fd0\u884c env.sh \u5373\u53ef\u3002 bash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_4","title":"3\u3001\u5b9a\u5236\u4f9d\u8d56","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_2","title":"3.1\u3001\u65b0\u589e\u4f9d\u8d56","text":"\u5982\u679c\u5e94\u7528\u5e93\u8fd8\u9700\u8981\u5176\u4ed6 Python \u4f9d\u8d56\u5e93\uff0c\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a requirement.txt \u6587\u4ef6\uff1b autotest_xxx\n\u251c\u2500\u2500 requirement.txt\n\u251c\u2500\u2500 case ...\n \u91cc\u9762\u5199\u5165\u9700\u8981\u5b89\u88c5\u7684\u4e09\u65b9\u4f9d\u8d56\uff0c\u6bd4\u5982\u50cf\u8fd9\u6837\uff1a # requirement.txt\nPyYAML==6.0 # \u6307\u5b9a\u5b89\u88c5\u67d0\u4e2a\u7248\u672c\nrequests # \u672a\u6307\u5b9a\u7248\u672c\u5219\u5b89\u88c5\u6700\u65b0\u7248\n \u5728\u6267\u884c bash env.sh \u65f6\u4f1a\u4e00\u5e76\u5c06\u5176\u5b89\u88c5\u3002 \u5982\u679c\u591a\u4e2a\u5e94\u7528\u5e93\u90fd\u5b58\u5728 requirement.txt \u6587\u4ef6\uff0c\u6267\u884c env.sh \u65f6\u4f1a\u5c06\u591a\u4e2a requirement.txt \u6587\u4ef6\u4e00\u5e76\u52a0\u8f7d\uff1b\u90a3\u4e48\u4e00\u5b9a\u8981\u6ce8\u610f\u591a\u4e2a requirement.txt \u6587\u4ef6\u53ef\u80fd\u5b58\u5728\u76f8\u540c\u7684\u4f9d\u8d56\u88ab\u6307\u5b9a\u5b89\u88c5\u4e0d\u540c\u7248\u672c\u7b49\u7b49\u517c\u5bb9\u6027\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32_1","title":"3.2\u3001\u88c1\u526a\u4f9d\u8d56","text":"\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0c\u53ef\u80fd\u4f60\u53ea\u9700\u8981\u5b89\u88c5\u4e00\u4e9b\u6700\u6700\u57fa\u7840\u7684\u4f9d\u8d56\uff0c\u5176\u4ed6\u7684\u90fd\u4e0d\u9700\u8981\uff0c\u6bd4\u5982\u7eaf\u63a5\u53e3\u81ea\u52a8\u5316\u7684\u9879\u76ee\uff0c\u5b83\u4e0d\u9700\u8981 UI \u81ea\u52a8\u5316\u76f8\u5173\u7684\u4f9d\u8d56\u3002 \u4f60\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\uff0c\u5b58\u653e\u4e00\u4e2a BASICENV \u7684\u666e\u901a\u6587\u4ef6\uff0c\u91cc\u9762\u4e0d\u9700\u8981\u5199\u4efb\u4f55\u5185\u5bb9\uff0c\u8fd9\u6837\u6267\u884c env.sh \u65f6\uff0c\u53ea\u4f1a\u5b89\u88c5\u6700\u57fa\u7840\u7684\u4f9d\u8d56\u3002 autotest_xxx\n\u251c\u2500\u2500 BASICENV # \u53ef\u4ee5\u4f7f\u7528\uff1atouch BASICENV \u521b\u5efa\u6587\u4ef6\n\u251c\u2500\u2500 case ...\n \u57fa\u7840\u4f9d\u8d56\u4ec5\u5b89\u88c5\u4ee5\u4e0b\u51e0\u4e2a\u5305\uff1a pytest # pytest\npytest-rerunfailures # \u5931\u8d25\u91cd\u8dd1\u63d2\u4ef6\npytest-timeout # \u7528\u4f8b\u8d85\u65f6\u63d2\u4ef6\nallure-pytest # \u751f\u6210 allure \u62a5\u544a\u63d2\u4ef6\nallure.deb # allure \u62a5\u544a\u67e5\u770b\u5de5\u5177\n \u88c1\u526a\u4f9d\u8d56 \u548c \u65b0\u589e\u4f9d\u8d56 \u662f\u4e0d\u51b2\u7a81\u7684\uff0c\u53ef\u4ee5\u540c\u65f6\u4f7f\u7528\u3002 \u6b64\u65b9\u6848\u9ed8\u8ba4\u4e3a\u865a\u62df\u73af\u5883\u90e8\u7f72\uff0c\u5982\u679c\u4f60\u60f3\u76f4\u63a5\u90e8\u7f72\u5728\u672c\u673a\u4e0a\uff1a bash env_dev.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_4","title":"4\u3001\u865a\u62df\u5316\u90e8\u7f72","text":"YouQu\u9ed8\u8ba4\u91c7\u7528\u865a\u62df\u5316\u90e8\u5206\uff0c\u865a\u62df\u5316\u73af\u5883\u5b9e\u9645\u5b89\u88c5\u7684\u4f4d\u7f6e\u662f\u5728 $HOME/.local/share/virtualenvs/youqu-oHTM7l7G \u76ee\u5f55\u4e0b youqu-oHTM7l7G \u6b64\u76ee\u5f55\u540d\u79f0\u524d\u9762\u90e8\u5206\u662f\u4f60\u7684\u4ee3\u7801\u6839\u76ee\u5f55\u7684\u540d\u79f0\uff0c\u540e\u9762\u90e8\u5206\u662f\u751f\u6210\u7684\u968f\u673a\u5b57\u7b26\u4e32\uff1b \u540c\u5b66\u4eec\u5728\u8fdc\u7a0b\u673a\u5668\u4e0a\u5b9a\u4f4d\u95ee\u9898\u7684\u65f6\u5019\uff0c\u5982\u679c\u4f7f\u7528 Pycharm \u8c03\u8bd5\uff0c\u5c31\u5c06\u89e3\u91ca\u5668\u6307\u5b9a\u5230\u8fd9\u4e2a\u76ee\u5f55\u7684\u5c31\u884c\u4e86\uff1b \u5f53\u7136\uff0c\u6211\u4eec\u4e5f\u63d0\u4f9b\u4e86\u672c\u673a\u5f00\u53d1\u73af\u5883\u90e8\u7f72\uff1a bash env_dev.sh\n \u5982\u679c\u4f60\u662f\u672c\u5730\u5f00\u53d1\u73af\u5883\u53ef\u4ee5\u7528\u5b83\uff0c\u533a\u522b\u5c31\u662f\u9a71\u52a8\u6267\u884c\u7684\u65f6\u5019\u4f7f\u7528\uff1apython3 manage.py xxx"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_8","title":"\u4e5d\u3001\u5931\u8d25\u5f55\u5c4f","text":"\u5f55\u5c4f\u5176\u5b9e\u662f\u4e00\u79cd\u89c6\u9891\u5f62\u5f0f\u7684\u65e5\u5fd7\uff0c\u56e0\u4e3a\u5f88\u591a\u65f6\u5019\u6211\u4eec\u5728\u67e5\u770b\u65e5\u5fd7\u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u51c6\u786e\u7684\u5b9a\u4f4d\u5230\u7528\u4f8b\u5931\u8d25\u7684\u5177\u4f53\u539f\u56e0\uff0c\u56e0\u6b64\u7528\u4f8b\u7684\u5f55\u5c4f\u80fd\u8ba9\u6211\u4eec\u770b\u5230\u7528\u4f8b\u5728\u6267\u884c\u8fc7\u7a0b\uff1b \u3010\u4f7f\u7528\u65b9\u6cd5\u3011 \u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u5173\u6ce8 2 \u4e2a\u53c2\u6570\uff1b ;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\u3002\n;\u6ce8\u610f\uff0c\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u4e0d\u80fd\u5c0f\u4e8e\u5931\u8d25\u5f55\u5c4f\u6b21\u6570\uff0c\u5373 RERUN >= RECORD_FAILED_CASE\nRECORD_FAILED_CASE = 1\n \u9ed8\u8ba4\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u662f 1 \u6b21\uff1b RECORD_FAILED_CASE = 1 \u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff1b RECORD_FAILED_CASE = 0 \u8868\u793a\u4e0d\u7ba1\u7528\u4f8b\u6210\u529f\u6216\u5931\u8d25\u90fd\u5f55\u5c4f\uff1b \u5f55\u5c4f\u662f\u8981\u5360\u7528\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u7279\u522b\u662f\u5728\u4e00\u4e9b\u914d\u7f6e\u8f83\u4f4e\u7684\u673a\u5668\u4e0a\u4f1a\u5f88\u660e\u663e\uff0c\u6240\u4ee5\u4f60\u9700\u8981\u8003\u8651\u662f\u5426\u6709\u5fc5\u8981\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1b \u4f7f\u7528 manage.py \u6267\u884c\u7528\u4f8b\u9ed8\u8ba4\u8bfb\u53d6\u5230 globalconfig.ini \u91cc\u9762\u7684\u53c2\u6570\uff0c\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report/record \u76ee\u5f55\u4e0b\u4fdd\u5b58\u5931\u8d25\u7528\u4f8b\u7684\u5f55\u5c4f\u548c\u65ad\u8a00\u7684\u90a3\u4e2a\u65f6\u95f4\u70b9\u7684\u622a\u5c4f\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7\u89c6\u9891\u6587\u4ef6\u770b\u5230\u5931\u8d25\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u90fd\u53d1\u751f\u4e86\u4ec0\u4e48\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#wayland","title":"\u5341\u3001Wayland \u9002\u914d","text":"Wayland \u4e0b\u81ea\u52a8\u5316\u4e3b\u8981\u95ee\u9898\u662f X11 \u4e0b\u7684\u952e\u9f20\u64cd\u4f5c\u65b9\u6cd5\u65e0\u6cd5\u4f7f\u7528\uff0c\u6bd4\u5982 Xdotool\u3001 PyAutoGUI\u3001Xwininfo \u7b49\u7b49\uff1b YouQu \u5728 Wayland \u4e0b\u517c\u5bb9\u9002\u914d\uff0cenv.sh \u5728 Wayland \u4e0b\u6267\u884c\u65f6\u4f1a\u5b89\u88c5\u81ea\u7814\u7684\u952e\u9f20\u64cd\u4f5c\u670d\u52a1\uff08\u53ef\u80fd\u5b58\u5728\u4e00\u4e9b\u4f9d\u8d56\u62a5\u9519\uff0c\u6309\u7167\u6ce8\u91ca\u89e3\u51b3\u5373\u53ef\uff09\uff0c\u6846\u67b6\u6838\u5fc3\u5e93\u4e5f\u9488\u5bf9\u6027\u7684\u505a\u4e86\u9002\u914d\uff0c\u4e0a\u5c42\u7528\u4f8b\u5b8c\u5168\u4e0d\u7528\u5173\u5fc3\u673a\u5668\u662fWayland \u8fd8\u662f X11\uff0c\u6846\u67b6\u4f1a\u6839\u636e\u6267\u884c\u65f6\u72b6\u6001\u81ea\u52a8\u5224\u65ad\u8d70\u4e0d\u540c\u7684\u903b\u8f91\uff1b \u7b80\u5355\u8bb2\u5c31\u662f\uff0c\u5e94\u7528\u5e93\u53ea\u9700\u8981\u7ef4\u62a4\u4e00\u5957\u7528\u4f8b\u811a\u672c\u5373\u53ef\u3002 \u3010\u7528\u4f8b\u517c\u5bb9\u3011 \u56e0\u4e3a Wayland \u4e0b\u6709\u4e9b\u5e94\u7528\u7684\u754c\u9762\u663e\u793a\u548c\u529f\u80fd\u672c\u8eab\u5b58\u5728\u4e00\u4e9b\u5dee\u5f02\uff0c\u7528\u4f8b\u5c42\u53ef\u80fd\u9700\u8981\u5bf9\u8fd9\u90e8\u5206\u7528\u4f8b\u505a\u903b\u8f91\u5224\u65ad\uff0c\u4f7f\u7528\u5168\u5c40\u914d\u7f6e\u91cc\u9762\u7684\u5e38\u91cf\u8fdb\u884c\u903b\u8f91\u7f16\u5199\u5373\u53ef\uff1a from setting.globalconfig import GlobalConfig\n# GlobalConfig.IS_WAYLAND \u83b7\u53d6\u5230\u5f53\u524d\u7684\u663e\u793a\u670d\u52a1\u5668\uff08bool\uff09\n# \u5e94\u7528\u5e93 Config \u7ee7\u627f GlobalConfig\nif Config.IS_WAYLAND:\npass\nif Config.IS_X11:\npass\n \u6bd4\u5982\u7528\u4f8b\u91cc\u9762\u5982\u679c\u65ad\u8a00\u7684\u56fe\u7247\u4e0d\u540c\uff1a if Config.IS_WAYLAND:\nself.assert_image_exist(\"wayland_XXX\")\nelse:\nself.assert_image_exist(\"x11_XXX\")\n \u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u811a\u672c\u5728 Wayland \u548c X11 \u4e0b\u90fd\u53ef\u4ee5\u8dd1\uff0cso easy \u662f\u4e0d\u662f\uff1f\u5b8c\u5168\u6ca1\u5fc5\u8981\u4e13\u95e8\u62c9\u65b0\u5206\u652f\u8fdb\u884c Wayland \u9002\u914d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_9","title":"\u5341\u4e00\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_7","title":"1. \u76ee\u5f55\u7ed3\u6784","text":"\u6267\u884c\u65f6\u4f1a\u5728\u6839\u76ee\u5f55\u4e0b\u52a8\u6001\u751f\u6210 report \u76ee\u5f55\uff0c\u6240\u6709\u7684\u62a5\u544a\u76f8\u5173\u7684\u6587\u4ef6\u4f1a\u7edf\u4e00\u5b58\u653e\u5728\u91cc\u9762\uff0c\u793a\u4f8b\uff1a /report\n \u251c\u2500\u2500 allure # allure\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json\n \u251c\u2500\u2500 allure_html # \u751f\u6210\u7684html\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 index.html \u251c\u2500\u2500 allure_back # allure\u62a5\u544a\u5907\u4efd\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 20221108114823\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json\n \u251c\u2500\u2500 json # json\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 result_deepin-music_20221109134736_1081333.json\n \u251c\u2500\u2500 logs # \u65e5\u5fd7\u6587\u4ef6\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 2022-11-10_debug.log \u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-10_error.log\n \u251c\u2500\u2500 record # \u5f55\u5c4f\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-09\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 15\u65f614\u520609\u79d2_test_music_303_2_autotest.mp4\n \u2514\u2500\u2500 xml # xml\u62a5\u544a\n\u2514\u2500\u2500 autotest_deepin_music-20221109134736.xml\n \u9ed8\u8ba4\u60c5\u51b5\u4e0b\u540c\u65f6\u751f\u6210 html\u3001xml\u3001json\u4e09\u79cd\u5f62\u5f0f\u7684\u62a5\u544a\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_7","title":"2. \u5b9a\u5236\u62a5\u544a","text":"\u6211\u4eec\u5bf9 allure \u62a5\u544a\u8fdb\u884c\u4e86\u4e00\u7cfb\u5217\u7684\u5b9a\u5236\uff1a \u5b9a\u5236 logo\u3001title\u3001\u62a5\u544a\u9ed8\u8ba4\u8bed\u8a00\u4e3a\u4e2d\u6587\uff1b \u52a0\u5165\u4e86\u7528\u4f8b\u65ad\u8a00\u5931\u8d25\u65f6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u4ee5\u53ca\u6b64\u65f6\u56fe\u50cf\u5bf9\u6bd4\u7684\u6a21\u677f\u56fe\u7247\uff1b \u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\uff0c\u4f60\u53ef\u4ee5\u5728 html \u62a5\u544a\u4e2d\u76f4\u63a5\u770b\u5f55\u5236\u7684\u89c6\u9891\uff1b \u52a0\u5165\u4e86 IP \u5730\u5740\u3001\u7cfb\u7edf\u4fe1\u606f\u3001\u955c\u50cf\u7248\u672c\u7b49\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_5","title":"3. \u67e5\u770b\u62a5\u544a","text":" \u672c\u5730\u6267\u884c \u5728 report/allure \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u4e00\u5806\u6587\u672c\u6587\u4ef6\uff0c\u8fd9\u4e9b\u662f allure \u63d2\u4ef6\u751f\u6210\u7684\u62a5\u544a\u6e90\u6570\u636e\uff0c\u6211\u4eec\u5728 report/allure_html \u76ee\u5f55\u4e0b\u7ed9\u4f60\u751f\u6210\u4e86 html \u6587\u4ef6\uff0c\u4f46\u662f\u4f60\u4e0d\u80fd\u76f4\u63a5\u901a\u8fc7\u6d4f\u89c8\u5668\u6253\u5f00 index.html \u6587\u4ef6\uff0c\u56e0\u4e3a allure \u7684\u62a5\u544a\u90fd\u662f\u57fa\u4e8e\u5728\u7ebf\u7684\u670d\u52a1\uff0c\u4f60\u5e94\u8be5\u8fd9\u6837\u6253\u5f00\uff1a allure open report/allure_html\n \u4f7f\u7528 manage.py \u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u5728\u7ec8\u7aef\u7684\u6700\u540e\u4e00\u884c\uff0c\u6211\u4eec\u4f1a\u7ed9\u4f60\u8f93\u51fa\u6253\u5f00\u62a5\u544a\u7684\u547d\u4ee4\uff0c\u76f4\u63a5\u590d\u5236\u5b83\u5728\u7ec8\u7aef\u6267\u884c\u5c31\u53ef\u4ee5\u67e5\u770b\u4e86\uff0c\u50cf\u8fd9\u6837\uff1a \u7ec8\u7aef\u6267\u884c\u547d\u4ee4: allure open /tmp/youqu/report/allure_html \u67e5\u770b\u62a5\u544a \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 Pycharm \u91cc\u9762\u627e\u5230 index.html \u6587\u4ef6\uff0c\u7136\u540e\u53f3\u952e\u9009\u62e9\u6d4f\u89c8\u5668\u6253\u5f00\uff0c\u6216\u8005\u4f60\u53ef\u4ee5\u7528\u4e00\u4e2a http \u670d\u52a1\u6253\u5f00\u3002 \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 report/allure \u76ee\u5f55\u4e0b\u67e5\u770b\u62a5\u544a\uff1a allure serve report/allure\n \u8fdc\u7a0b\u6267\u884c \u8fdc\u7a0b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\uff0c\u4f1a\u5c06\u6240\u6709\u8fdc\u7a0b\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u62a5\u544a\u90fd\u6536\u96c6\u5230 report/allure \u76ee\u5f55\u4e0b\uff0c\u5206\u522b\u6309\u7167\u673a\u5668\u7684 IP \u7b49\u5efa\u4e86\u4e0d\u540c\u7684\u76ee\u5f55\uff0c\u4f60\u53ef\u4ee5\u5728\u8fd9\u4e9b\u76ee\u5f55\u91cc\u9762\u53bb\u67e5\u770b\u5bf9\u5e94\u7684\u6d4b\u8bd5\u62a5\u544a\uff0c\u67e5\u770b\u65b9\u6cd5\u548c\u524d\u9762\u672c\u5730\u6267\u884c\u67e5\u770b\u7684\u65b9\u6cd5\u4e00\u6837\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_10","title":"\u5341\u4e8c\u3001\u9759\u6001\u4ee3\u7801\u626b\u63cf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_8","title":"1. \u63d0\u524d\u89e3\u51b3\u4ee3\u7801\u95ee\u9898","text":"\u4e3a\u4e86\u5e2e\u52a9\u5f00\u53d1\u8005\u7edf\u4e00\u4ee3\u7801\u98ce\u683c\uff0cPython \u793e\u533a\u63d0\u51fa\u4e86 PEP8 \u4ee3\u7801\u7f16\u7801\u98ce\u683c\uff0cPython \u5b98\u65b9\u540c\u65f6\u63a8\u51fa\u4e86\u4e00\u4e2a\u68c0\u67e5\u4ee3\u7801\u98ce\u683c\u662f\u5426\u7b26\u5408 PEP8 \u7684\u5de5\u5177\uff0c\u540d\u5b57\u4e5f\u53eb PEP8\u3002 \u4f46\u662f\uff0cPycharm \u91cc\u9762\u7684 PEP8 \u63d2\u4ef6\u5b9e\u9645\u4e0a\u5e76\u4e0d\u80fd\u53d1\u73b0\u5f88\u591a\u4ee3\u7801\u95ee\u9898\uff0c\u8fd9\u4e9b\u95ee\u9898\u5e76\u4e0d\u4f1a\u5728\u8fd0\u884c\u65f6\u62a5\u9519\uff0c\u56e0\u4e3a\u4ece Python \u8bed\u8a00\u89d2\u5ea6\u5e76\u4e0d\u5173\u5fc3\u8fd9\u4e9b\u95ee\u9898\uff0c\u5728 Pycharm \u7f16\u8f91\u5668\u91cc\u9762\u4f7f\u7528\u5feb\u6377\u952e ctrl + alt + L\uff0c\u6709\u4e00\u70b9\u70b9\u683c\u5f0f\u5316\u7684\u6548\u679c\uff0c\u80fd\u89e3\u51b3\u4e00\u4e9b\u7a7a\u683c\u3001\u6362\u884c\u7b49\u5c0f\u95ee\u9898\u3002 \u8fd9\u91cc\u63a8\u8350\u4e00\u4e2a Python \u793e\u533a\u6d41\u884c\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff1a Black\uff0c\u53f7\u79f0\u4e0d\u59a5\u534f\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff0c\u5b83\u68c0\u6d4b\u5230\u4e0d\u7b26\u5408\u89c4\u8303\u7684\u4ee3\u7801\u98ce\u683c\u76f4\u63a5\u5c31\u5e2e\u4f60\u5168\u90e8\u683c\u5f0f\u5316\u597d\uff0c\u5c31\u662f\u8fd9\u4e48\u521a\uff01 \u5b89\u88c5\uff1a sudo pip3 install black \n \u4f7f\u7528\u65b9\u6cd5\uff1a black ${CheckPath}\n \u4f7f\u7528\u8fd9\u4e2a\u5de5\u5177\u683c\u5f0f\u5316\u4e4b\u540e\uff0c\u4ee3\u7801\u4f1a\u88ab\u81ea\u52a8\u8c03\u6574\uff0c\u521a\u5f00\u59cb\u4f60\u53ef\u80fd\u4f1a\u89c9\u5f97\u8c03\u6574\u5f97\u5f88\u5938\u5f20\uff0c\u6ca1\u5173\u7cfb\u575a\u6301\u770b\uff0c\u4e60\u60ef\u4e4b\u540e\uff0c\u4f60\u4f1a\u89c9\u5f97\u5f88\u4f18\u96c5\uff0c\u6ca1\u9519\uff0c\u8fd9\u5c31\u662f Pythonic Code \u7684\u6838\u5fc3\uff0c\u8bf7\u4fdd\u6301\u4f18\u96c5\uff5e\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_8","title":"2. \u4ee3\u7801\u626b\u63cf\u5de5\u5177","text":"\u4f7f\u7528\u6839\u76ee\u5f55\u4e0b pylint.sh \u626b\u63cf\u4ee3\u7801\uff0c\u5728 report \u76ee\u5f55\u4e0b\u67e5\u770b\u4ee3\u7801\u626b\u63cf\u62a5\u544a\uff0c\u5982\u679c\u6709\u4ee3\u7801\u95ee\u9898\u8bf7\u63d0\u524d\u89e3\u51b3\u4e4b\u540e\u518d\u63d0\u4ea4\u3002 \u6b64\u811a\u672c\u5df2\u7ecf\u4f7f\u7528 Python \u793e\u533a\u6700\u6d41\u884c\u7684\u4ee3\u7801\u626b\u63cf\u5de5\u5177 Pylint \u8fdb\u884c\u4ee3\u7801\u626b\u63cf\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a bash pylint.sh\n \u8fd0\u884c\u4e4b\u540e\u4f1a\u63d0\u793a\u4f60\u8981\u626b\u63cf\u7684\u76ee\u5f55\uff0c\u6bd4\u5982\u8f93\u5165 apps \uff0c\u5219\u4f1a\u626b\u63cf apps \u4e0b\u7684\u6240\u6709 Python \u4ee3\u7801\u3002 \u5728 setting/pylintrc.cfg \u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u76f8\u5173\u914d\u7f6e\uff0c\u626b\u63cf\u5b8c\u6210\u4e4b\u540e\u5728 report/pylints \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u626b\u63cf\u62a5\u544a\u3002 \u4ee3\u7801\u63d0\u4ea4\u9700\u901a\u8fc7 git review \u63d0\u4ea4\u5230 gerrit \uff0c\u4eba\u5de5 Code Review \u901a\u8fc7\u4e4b\u540e\u5408\u5165\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_11","title":"\u5341\u4e09\u3001\u63d0\u4ea4\u4ee3\u7801","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_9","title":"1. \u5b89\u88c5\u4f9d\u8d56","text":"sudo apt install git-review\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_9","title":"2. \u63d0\u4ea4\u6a21\u677f","text":"\u5728 ~ \u76ee\u5f55\u4e0b\u65b0\u5efa\u6587\u4ef6\uff0c\u5e76\u547d\u540d\u4e3a gitcommit_template \u5c06\u4ee5\u4e0b\u5185\u5bb9\u5199\u5165\u6587\u4ef6\u5f53\u4e2d\uff1a # commit type :fix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style(\u98ce\u683c\u4fee\u6539)\u3001refactor(\u91cd\u6784)\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test(\u6d4b\u8bd5) + \u7b80\u5355\u63cf\u8ff0. \u9ed8\u8ba4fix,\u6839\u636e\u60c5\u51b5\u4fee\u6539\nfix: \n\n# \u8be6\u7ec6\u8bf4\u660e\u4ee3\u7801\u7684\u6539\u52a8\uff0c\u5305\u542b\u4ee3\u7801\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u4ee5\u53ca\u4e3a\u4ec0\u4e48\u8fd9\u4e48\u505a\uff0c\u53ef\u80fd\u4f1a\u5f71\u54cd\u54ea\u4e9b\u529f\u80fd\u3002\u5bf9\u4e8e\u4ee3\u7801\u7684\u5ba1\u6838\u8005\uff0c\u9700\u8981\u4ece\u8fd9\u6bb5\u63cf\u8ff0\u4e2d\u80fd\u5b8c\u5168\u7406\u89e3\u4ee3\u7801\u4e2d\u6240\u6709\u6539\u52a8\u7684\u5185\u5bb9\nDescription: \n\n# \u5199\u4e00\u6bb5\u9762\u5411\u4e8e\u4ea7\u54c1\u7684\u603b\u7ed3\u6027\u5185\u5bb9\uff0c\u7528\u4e8e\u81ea\u52a8\u751f\u6210crp\u4e0a\u7684changlog\uff0c\u9700\u8981\u6ce8\u610f\u7684\u4e8b\uff0c\u8fd9\u6bb5\u63cf\u8ff0\u5fc5\u987b\u4ece\u4ea7\u54c1\u7684\u89d2\u5ea6\u8003\u8651\u3002\nLog: \n\n# \u5173\u8054pms\u4e0a\u7684bug\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94bug\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4fee\u590dbug\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Bug: \n\n# \u4fee\u590d github issue \n#Issue: \n\n# \u5173\u8054pms\u4e0a\u7684\u4efb\u52a1\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94\u4efb\u52a1\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4efb\u52a1\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Task: \n \u547d\u4ee4\u884c\u6267\u884c: git config --global commit.template ~/gitcommit_template\n \u6b64\u547d\u4ee4\u5c06\u6a21\u677f\u52a0\u5165\u5230 git \u7684\u63d0\u4ea4\u6a21\u677f\u4e2d\u3002 \u540e\u7eed\u63d0\u4ea4\u7684\u65f6\u5019\u9700\u8981\u5173\u6ce8\u4e00\u4e0b\u51e0\u70b9\uff1a commit type \u5bf9\u5e94\u4e0d\u540c\u7684\u4fee\u6539\u7c7b\u578b\uff1afix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style \uff08\u98ce\u683c\u4fee\u6539\uff09\u3001refactor \uff08\u91cd\u6784\uff09\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test \uff08\u6d4b\u8bd5\uff09 commit type \u5192\u53f7\u540e\u9762\u52a0\u7a7a\u683c\u3002 Description \u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u9700\u8981\u8fdb\u884c\u8be6\u7ec6\u8bf4\u660e\uff0c\u6bd4\u5982\u5bf9\u529f\u80fd\u8fdb\u884c\u5927\u6539\u7b49\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_6","title":"3. \u63a8\u9001\u4ee3\u7801","text":"\u9996\u5148\u6dfb\u52a0 commit \u4fe1\u606f git add \u540e\u9762\u52a0\u6587\u4ef6\u540d\u79f0\n git add . # \u8868\u793a\u6dfb\u52a0\u6240\u6709\u6587\u4ef6\n \u4f7f\u7528\u8fd9\u6761\u547d\u4ee4\u6ce8\u610f\u6709\u4e9b\u4e34\u65f6\u6587\u4ef6\u4e0d\u8981\u63d0\u4ea4\u5230\u4ed3\u5e93\u4e86\u3002 git commit -a\n \u4e4b\u540e\u5728 fix: \u540e\u9762\uff08\u6ce8\u610f\u5192\u53f7\u540e\u9762\u5fc5\u987b\u52a0\u7a7a\u683c\uff0c\u4e0d\u7136\u76f4\u63a5-1\uff09\u5199\u672c\u5730\u63d0\u4ea4\u7684 commit \u4fe1\u606f\uff0c\u7136\u540e\u5c31\u53ef\u4ee5\u63d0\u4ea4\u4ee3\u7801\u4e86 git review branch(\u5f53\u524d\u5206\u652f) -r origin\n \u6700\u597d\u4e00\u6b21 commit\uff0c\u4e00\u6b21 git review \uff0c\u7ecf\u5e38\u6709\u540c\u5b66\u5728\u672c\u5730\u75af\u72c2 commit \u6700\u540e git review \u62a5\u9519\u4e0d\u77e5\u9053\u548b\u56de\u4e8b\u513f\u3002 \u82e5\u4e0d\u60f3\u6bcf\u6b21\u63d0\u4ea4\u90fd\u52a0\u4e0a -r \u9009\u9879\uff0c\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a git config --global gitreview.remote origin \u63d0\u4ea4\u4ee3\u7801\uff0c\u76f4\u63a5\u4f7f\u7528 git review branch<\u76ee\u6807\u5206\u652f>\uff0c\u4f8b\u5982 git review master"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git","title":"4. Git\u6807\u7b7e","text":"Git \u6807\u7b7e\u5b9e\u9645\u4e0a\u662f commit \u7684\u4e00\u4e2a\u522b\u540d\uff0c\u4e3b\u8981\u7528\u4e8e\u7ba1\u7406\u5386\u53f2\u7248\u672c\u3002 \u60f3\u8c61\u4e00\u4e0b\u9886\u5bfc\u8ba9\u4f60\u628a\u4e4b\u524d\u7684\u67d0\u4e2a\u7248\u672c\u7684\u4ee3\u7801\u62c9\u51fa\u6765\u8dd1\uff0c\u4f60\u662f\u4e0d\u662f\u4e56\u4e56\u7684\u53bb\u628a\u6240\u6709\u63d0\u4ea4\u8bb0\u5f55\u62c9\u51fa\u6765\u627e\uff0c\u7136\u540e\u627e\u5230\u90a3\u4e2a\u54c8\u5e0c\u503c\uff0c\u901a\u8fc7\u54c8\u5e0c\u503c\u6765\u68c0\u51fa\u4ee3\u7801\u3002 \u8fd9\u4e00\u5957\u64cd\u4f5c\u4e0b\u6765\u662f\u4e0d\u662f\u5f88\u9ebb\u70e6\uff0c\u8d39\u65f6\u95f4\u8fd8\u4e0d\u4e00\u5b9a\u80fd\u627e\u5f97\u5230\uff0c\u6ca1\u4eba\u80fd\u8bb0\u4f4f\u6bcf\u4e2a\u63d0\u4ea4\u54c8\u5e0c\u503c\u4ee5\u53ca\u8fd9\u6b21\u63d0\u4ea4\u90fd\u6539\u4e86\u54ea\u4e9b\u4ee3\u7801\u3002 \u56e0\u6b64\u7ed9\u63d0\u4ea4\u6253\u4e2a\u6807\u7b7e\uff0c\u5c31\u662f\u628a\u54c8\u5e0c\u503c\u8f6c\u6362\u6210\u4eba\u7c7b\u80fd\u7406\u89e3\u7684\u8bed\u8a00\uff0c\u6bd4\u5982 v1.0\uff0c\u5c31\u53ef\u4ee5\u76f4\u63a5\u901a\u8fc7\u6807\u7b7e\u627e\u5230\u5bf9\u5e94\u7684\u63d0\u4ea4\u3002 \u65b0\u5efa\u6807\u7b7e git tag -a <tagname>\n \u56de\u8f66\u4e4b\u540e\uff0cGit \u4f1a\u6253\u5f00\u4f60\u7684\u7f16\u8f91\u5668\uff0c\u8ba9\u4f60\u5199\u4e00\u53e5\u6807\u7b7e\u6ce8\u89e3\uff0c\u5c31\u50cf\u4f60\u7ed9\u63d0\u4ea4\u5199\u6ce8\u89e3\u4e00\u6837\u3002 \u67e5\u770b\u6240\u6709\u6807\u7b7e git tag -l\n# git tag \u4e5f\u884c\n \u5220\u9664\u6807\u7b7e git tag -d <tagname>\n \u63a8\u9001\u6807\u7b7e\u81f3\u8fdc\u7a0b git push \u547d\u4ee4\u5e76\u4e0d\u4f1a\u4f20\u9001\u6807\u7b7e\u5230\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\uff0c\u5fc5\u987b\u663e\u5f0f\u5730\u63a8\u9001\u6807\u7b7e\u3002 git push origin <tagname>\n \u63a8\u9001\u6240\u6709\u4e0d\u5728\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\u7684\u6807\u7b7e git push origin --tag\n \u5220\u9664\u8fdc\u7a0b\u6807\u7b7e git push origin :refs/tag/<tagname>\n \u540e\u671f\u6253\u6807\u7b7e \u5148\u7528 git log --pretty=oneline \u67e5\u8be2\u63d0\u4ea4\u8bb0\u5f55\uff0c\u83b7\u53d6\u6821\u9a8c\u7801\u3002 git tag -a <tagname> 9fceb02(\u6821\u9a8c\u7801)\n \u68c0\u51fa\u6807\u7b7e git checkout <tagname>\n \u6b64\u65f6\uff0c\u4ed3\u5e93\u4f1a\u5904\u4e8e\u201c\u5206\u79bb\u5934\u6307\u9488\uff08detached HEAD\uff09\u201d\u7684\u72b6\u6001\u3002 \u5728\u201c\u5206\u79bb\u5934\u6307\u9488\u201d\u72b6\u6001\u4e0b\uff0c\u5982\u679c\u4f60\u505a\u4e86\u67d0\u4e9b\u66f4\u6539\u7136\u540e\u63d0\u4ea4\u5b83\u4eec\uff0c\u6807\u7b7e\u4e0d\u4f1a\u53d1\u751f\u53d8\u5316\uff0c \u4f46\u4f60\u7684\u65b0\u63d0\u4ea4\u5c06\u4e0d\u5c5e\u4e8e\u4efb\u4f55\u5206\u652f\uff0c\u5e76\u4e14\u5c06\u65e0\u6cd5\u8bbf\u95ee\uff0c\u9664\u975e\u901a\u8fc7\u786e\u5207\u7684\u63d0\u4ea4\u54c8\u5e0c\u624d\u80fd\u8bbf\u95ee\u3002 \u56e0\u6b64\uff0c\u5982\u679c\u4f60\u9700\u8981\u8fdb\u884c\u66f4\u6539\uff0c\u6bd4\u5982\u4f60\u8981\u4fee\u590d\u65e7\u7248\u672c\u4e2d\u7684\u9519\u8bef\uff0c\u90a3\u4e48\u901a\u5e38\u9700\u8981\u521b\u5efa\u4e00\u4e2a\u65b0\u5206\u652f\uff1a git checkout -b <NewBranchName> <tagname>\n \u65b0\u5206\u652f\u4e0a\u53ef\u4ee5\u8fdb\u884c\u63d0\u4ea4\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_12","title":"\u5341\u56db\u3001\u5e38\u89c1\u95ee\u9898","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_10","title":"1. \u63d0\u4ea4\u4ee3\u7801\u65f6\u63d0\u793a\u90ae\u7bb1\u6216\u8005\u540d\u79f0\u4e0d\u5bf9","text":"\u91cd\u65b0\u914d\u7f6e\u90ae\u7bb1\u6216\u8005\u540d\u79f0\uff0c\u7136\u540e\u91cd\u7f6e\u751f\u6548\uff1a git commit --amend --reset-author\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_10","title":"2. \u600e\u4e48\u56de\u6eda\u5230\u4e4b\u524d\u7684\u7248\u672c","text":"(1)\u67e5\u8be2\u5386\u53f2\u63d0\u4ea4\u8bb0\u5f55 git log\n \u627e\u5230\u4f60\u8981\u56de\u6eda\u7684\u7248\u672c\uff0c\u590d\u5236 hash \u503c\u3002 \u6ce8\u610f\uff1a\u662f commit \u7a7a\u683c\u4e4b\u540e\u7684 hash \u503c\uff0c\u4e4b\u524d\u6709\u540c\u5b66\u590d\u5236\u7684 Change-Id: \u8fd9\u6837\u80af\u5b9a\u62a5\u9519\u3002 (2)\u56de\u6eda\u7248\u672c\uff0c\u4e0d\u6e05\u9664\u4ee3\u7801 git reset --soft ${hash}\n (3)\u56de\u6eda\u7248\u672c\uff0c\u6e05\u9664\u4ee3\u7801\uff0c\u614e\u7528\u54c8 git reset --hard ${hash}\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-f-s-e","title":"3. \u6d4b\u8bd5\u62a5\u544a\u91cc\u9762 F S . E \u662f\u4ec0\u4e48\u610f\u601d","text":"F \u8868\u793a\u5931\u8d25\uff0c. \uff08\u70b9\uff09\u8868\u793a\u901a\u8fc7\uff0cS \u8868\u793a\u8df3\u8fc7\uff0cE \u8868\u793a error \u6709\u62a5\u9519"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git-status","title":"4. \u89e3\u51b3 git status \u4e2d\u6587\u663e\u793a\u7684\u95ee\u9898","text":"git config --global core.quotePath false\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5-apps","title":"5. apps \u76ee\u5f55\u4e0b\u989c\u8272\u6709\u4e9b\u662f\u9ec4\u8272\u7684","text":"\u5728 Pycharm \u4e2d apps \u76ee\u5f55\u4e0b\u5e94\u7528\u5e93\u6587\u4ef6\u662f\u9ec4\u8272\u7684\uff0c\u7f16\u8f91\u5668\u8bc6\u522b\u4e0d\u5230\u4ee3\u7801\u65b0\u589e\u548c\u4fee\u6539\uff1b \u7531\u4e8e\u793e\u533a\u7248 Pycharm \u4e0d\u80fd\u52a8\u6001\u8bc6\u522b\u591a\u4ed3\u5e93\uff0c\u9700\u8981\u5728 setting \u91cc\u9762\u624b\u52a8\u6ce8\u518c\uff0c\u64cd\u4f5c\u6b65\u9aa4\uff1a File \u2014> Settings \u2014> Version Control \u2014> \u70b9 + \u53f7 \u2014> Directory \u9009\u4e2d\u5e94\u7528\u5e93\u5de5\u7a0b\u76ee\u5f55 \u2014> VCS \u9009\u4e2d Git \u2014> Apply \u5982\u6b64\u5c31\u53ef\u4ee5\u4e86\u3002 \u4e13\u4e1a\u7248 Pycharm \u4e0d\u5b58\u5728\u8fd9\u4e2a\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#6-envsh-r","title":"6. \u6267\u884c env.sh \u62a5\u9519 $'\\r':\u672a\u627e\u5230\u547d\u4ee4","text":"\u51fa\u73b0\u8fd9\u4e2a\u95ee\u9898\u4f60\u5e94\u8be5\u662f\u5728 windows \u4e0a\u6253\u5f00\u6216\u7f16\u8f91\u8fc7 env.sh \u811a\u672c\uff0cwindows\u4e0b\u7684\u6362\u884c\u662f\u56de\u8f66\u7b26+\u6362\u884c\u7b26\uff0c\u4e5f\u5c31\u662f\\r\\n\uff0c\u800c Linxu \u4e0b\u662f\u6362\u884c\u7b26 \\n\uff0cLinux \u4e0b\u4e0d\u8bc6\u522b \\r\uff0c\u56e0\u6b64\u62a5\u9519\u3002 \u89e3\u51b3\u65b9\u6848\uff1a # \u5c06 \\r \u66ff\u6362\u4e3a\u7a7a\nsudo sed -i 's/\\r//' env.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#7","title":"7.\u600e\u6837\u4e3a\u5355\u72ec\u67d0\u4e00\u6761\u7528\u4f8b\u914d\u7f6e\u6267\u884c\u8d85\u65f6\u65f6\u95f4","text":"\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u5982\u4e0b\uff1a @pytest.mark.timeout(300) # \u5355\u4f4d\u79d2\ndef test_xxx_001():\npass\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#8-youqu","title":"8. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u6240\u6709\u4ee3\u7801\uff0c\u5305\u542b\u5b50\u4ed3\u5e93","text":"\u524d\u7f6e\u6761\u4ef6\uff1a\u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 # \u7b2c\u4e00\u6b21\u5b58\u50a8\u5bc6\u7801\uff0c\u63d0\u4f9b\u540e\u9762\u62c9\u4ee3\u7801(gerrit: ldap\u8d26\u53f7\u548c\u5bc6\u7801\uff0cgit\u62c9\u53d6\u7b2c\u4e00\u6b21\u8f93\u5165\u4fdd\u5b58\uff0c\u540e\u9762\u76f4\u63a5\u4f7f\u7528)\ngit config --global credential.helper store\n\n# \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\uff0c\u5e76\u9012\u5f52\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\" --recursive\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#9-youqu","title":"9. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\u6307\u5b9a\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u524d\u7f6e\u6761\u4ef6\uff1a \u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 \u5df2\u5b58\u50a8\u8bbf\u95ee\u5bc6\u7801 # \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\"\n# \u6307\u5b9a\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ncd youqu\ngit submodule update --init apps/autotest_xxx_xxx\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#10-youqu","title":"10. \u5982\u4f55\u66f4\u65b0 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\uff0c\u6240\u6709\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u66f4\u65b0\u6240\u6709\u5b50\u4ed3\u5e93\u4ee3\u7801 cd youqu\ngit pull & git submodule foreach git pull\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#11-youqu-master-detached-head","title":"11. \u5982\u4f55\u4fee\u590d YouQu \u6240\u6709\u5b50\u4ed3\u5e93 master \u5206\u652f\u6e38\u79bb\u5934\uff08detached head\uff09","text":"\u4fee\u590d\u6240\u6709\u5b50\u4ed3\u5e93\u9ed8\u8ba4master \u5206\u652f\u6e38\u79bb\u5934 cd youqu\ngit submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/","title":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212 \u5206\u7c7b\uff1a/ \u67b6\u6784\u5e08\uff1a/ \u76ee\u6807\uff1a \u5e94\u7528 AT \u67b6\u6784\u5de5\u7a0b\u5316\uff0c\u53c2\u8003\u6027\u80fd\u81ea\u52a8\u5316\u5de5\u7a0b\u5b8c\u6210\u5de5\u7a0b\u5316\u6539\u9020\u3002 \u5e94\u7528\u95f4\u7528\u4f8b\u89e3\u8026\uff0c\u89e3\u9664\u6240\u6709\u4ea4\u53c9\u8c03\u7528\u7684\u65b9\u6cd5\uff0c\u5404\u5e94\u7528\u80fd\u8ddf\u968f\u81ea\u8eab\u8fed\u4ee3\u5468\u671f\u72ec\u7acb\u7ef4\u62a4 AT \u7528\u4f8b\u3002 \u5b8c\u6210\u516c\u5171\u65b9\u6cd5\u7684\u62bd\u53d6\u6574\u5408\uff0c\u5f62\u6210\u4e00\u5957\u72ec\u7acb\u4e8e\u5e94\u7528\u95f4\u7684\u516c\u5171\u65b9\u6cd5\u5e93\uff0c\u5404\u5e94\u7528\u65b9\u6cd5\u91cc\u9762\u4e0d\u5b58\u5728\u88ab\u591a\u4e2a\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\u3002 \u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u4e3a\u5c06\u6765\u9002\u914d\u66f4\u591a\u7684 AT \u8fd0\u7528\u573a\u666f\u63d0\u4f9b\u652f\u6491\uff0c\u539f\u5219\u4e0a\u53ef\u5b9e\u73b0\u65e0\u9650\u6269\u5c55\uff0c\u5728\u6bcf\u65e5\u6784\u5efa\u548c\u6301\u7eed\u96c6\u6210\u6d41\u7a0b\u843d\u5730\u4f7f\u7528\u3002 \u4ee3\u7801\u89c4\u8303\u95ee\u9898\u6e05\u96f6\uff0c\u7b26\u5408 Shell Check\u3001Pylint\u3001\u7cfb\u7edf\u90e8\u76f8\u5173\u7f16\u7801\u89c4\u8303\u8981\u6c42\u3002 \u610f\u4e49\uff1a \u7edf\u4e00\u6210\u7814 AT \u67b6\u6784\u8bbe\u8ba1\u601d\u8def\uff0c\u6d88\u9664 AT \u4ee3\u7801\u5b9e\u73b0\u548c\u7ef4\u62a4\u4e0a\u53ef\u80fd\u51fa\u73b0\u7684\u5206\u6b67\uff0c\u6539\u5584\u5386\u53f2 AT \u65e0\u5de5\u7a0b\u5316\u8bbe\u8ba1\u7684\u7f3a\u9677\uff0c\u63d0\u9ad8\u67b6\u6784\u4e13\u4e1a\u6027\u3002 \u5404\u5e94\u7528 AT \u4ee3\u7801\u76f8\u4e92\u72ec\u7acb\uff0c\u5951\u5408\u5e94\u7528\u72ec\u7acb\u53d1\u5e03\u7279\u6027\uff0c\u53ef\u652f\u6301\u8fed\u4ee3\u671f\u95f4\u72ec\u7acb\u65b0\u589e\u3001\u7ef4\u62a4\u548c\u6267\u884c\u3002 \u65b9\u6cd5\u8c03\u7528\u903b\u8f91\u5f97\u5230\u7b80\u5316\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u66f4\u9ad8\u6548\uff1b\u516c\u5171\u5e93\u62bd\u53d6\uff0c\u51cf\u5c11\u65b9\u6cd5\u91cd\u590d\u7f16\u5199\uff0c\u63d0\u9ad8\u4ee3\u7801\u5229\u7528\u7387\uff1b\u5e73\u5747\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u4ece40\u5206\u949f\u964d\u4f4e\u81f330\u5206\u949f\uff0c\u65e5\u4ea7\u51fa\u7528\u4f8b\u4ece12\u6761/\u5929\u63d0\u5347\u81f316\u6761/\u5929\u3002 \u53ef\u7075\u6d3b\u652f\u6491\u4e0d\u540c\u7684\u81ea\u52a8\u5316\u8fd0\u7528\u573a\u666f\uff0c\u5982 CI\u3001\u5192\u70df\u6d4b\u8bd5\u3001\u96c6\u6210\u6d4b\u8bd5\u3001\u56de\u5f52\u6d4b\u8bd5\u3001\u4e13\u9879\u6d4b\u8bd5\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_2","title":"\u4e00\u3001\u80cc\u666f\u4ecb\u7ecd","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1","title":"1\u3001\u73b0\u6709\u67b6\u6784\u4ecb\u7ecd","text":"\u73b0\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u6574\u4f53\u5206\u4e3a\u4e09\u5c42\uff1a\u7528\u4f8b\u5c42\uff08\u4e1a\u52a1\u903b\u8f91\u5c42\uff09\u3001\u4e2d\u95f4\u5c42\uff08\u5143\u7d20\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff09\u3001\u6838\u5fc3\u5c42\uff08\u5e95\u5c42\u529f\u80fd\u5e93\u5c42\uff09\u3002 \u7528\u4f8b\u5c42\uff1a\u5373\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4e13\u6ce8\u4e8e\u4e1a\u52a1\u529f\u80fd\u903b\u8f91\uff0c\u4e0d\u5173\u5fc3\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\uff1b \u4e2d\u95f4\u5c42\uff1a\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff0c\u6bcf\u4e2a\u65b9\u6cd5\u5747\u5bf9\u5e94\u4e00\u4e2a\u5143\u7d20\u7684\u4e00\u4e2a\u5177\u4f53\u64cd\u4f5c\uff0c\u4e5f\u53ef\u4ee5\u662f\u591a\u4e2a\u64cd\u4f5c\u7684\u7ec4\u5408\u64cd\u4f5c\uff0c\u4e2d\u95f4\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u7528\u4f8b\u5c42\uff0c\u5177\u6709\u53ef\u6269\u5c55\u6027\u548c\u590d\u7528\u6027\uff1b \u6838\u5fc3\u5c42\uff1a\u4e3b\u8981\u5c01\u88c5\u7684\u5e95\u5c42\u529f\u80fd\u5b9e\u73b0\uff0c\u6b64\u5c42\u5728\u6846\u67b6\u4e2d\u63d0\u4f9b\u4e00\u4e9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u529f\u80fd\u6a21\u5757\u76f8\u5bf9\u72ec\u7acb\uff0c\u6838\u5fc3\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u64cd\u4f5c\u5c42\uff0c\u6bd4\u5982\uff1a\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7 UI \u5750\u6807\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u952e\u9f20\u64cd\u4f5c\u7684\u57fa\u7840\u65b9\u64cd\u4f5c\u6a21\u5757\u3001Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757\u3001\u6587\u4ef6\u7684\u589e\u5220\u6539\u67e5\u64cd\u4f5c\u6a21\u5757\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2","title":"2\u3001\u81ea\u52a8\u5316\u7684\u5e94\u7528","text":"2.1\u3001CI \u6d41\u7a0b \u6bcf\u65e5\u6784\u5efa\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u7814\u53d1\u6bcf\u65e5\u63d0\u4ea4\u7684\u4ee3\u7801\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u73ed\u4e4b\u540e\u4f1a\u5c06\u5404\u5e94\u7528\u8fdb\u884c\u6253\u5305\uff0c\u7136\u540e\u5728\u6d4b\u8bd5\u673a\u4e0a\u5b89\u88c5\u66f4\u65b0 deb \u5305\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u5e94\u7528\u63d0\u4ea4\u96c6\u6210\u7684\u7248\u672c\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u8f7d\u6700\u65b0\u7684 ISO \u8fdb\u884c PXE \u90e8\u7f72\uff0c\u7136\u540e\u6d4b\u8bd5\u673a\u5b89\u88c5\u6700\u65b0\u7684\u955c\u50cf\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 2.2\u3001\u9a8c\u6536\u6d4b\u8bd5 \u5728\u5404\u9a8c\u6536\u8282\u70b9\u8fdb\u884c\u81ea\u52a8\u5316\u9a8c\u6536\uff0c\u76ee\u524d\u7684\u7b56\u7565\u662f\u5168\u7528\u4f8b\u8986\u76d6\u5168\u67b6\u6784\u3002 2.3\u3001\u56de\u5f52\u6d4b\u8bd5 \u56de\u5f52\u6d4b\u8bd5\u4eca\u5e74\u89c4\u5212\u5efa\u8bbe\u4e2d\uff0c\u65e8\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u6267\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\uff0c\u51cf\u5c11\u529f\u80fd\u6d4b\u8bd5\u7684\u91cd\u590d\u52b3\u52a8\u529b\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3","title":"3\u3001\u5b58\u5728\u7684\u95ee\u9898","text":" \u5404\u5e94\u7528\u4e4b\u95f4\u5b58\u5728\u8026\u5408 \u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u521d\u671f\uff0c\u6240\u6709\u5e94\u7528\u662f\u6574\u4f53\u53d1\u5e03\uff0c\u6211\u4eec\u662f\u5c06\u6240\u6709\u5e94\u7528\u770b\u6210\u662f\u4e00\u4e2a\u6574\u4f53\uff0c\u5404\u5e94\u7528\u4f5c\u4e3a\u5176\u4e2d\u7684\u4e00\u4e2a\u6a21\u5757\uff0c\u6240\u4ee5\u5b58\u5728\u5e94\u7528\u95f4\u65b9\u6cd5\u4ea4\u53c9\u8c03\u7528\u7684\u95ee\u9898\uff0c\u8fd9\u6837\u4ece\u6700\u521d\u7684\u8bbe\u8ba1\u6765\u8bb2\u786e\u5b9e\u80fd\u591f\u51cf\u5c11\u91cd\u590d\u4ee3\u7801\u7684\u7f16\u5199\u3002\u4f46\u662f\u73b0\u5728\u5e94\u7528\u8d70\u72ec\u7acb\u53d1\u5e03\uff0c\u5404\u5e94\u7528\u90fd\u6709\u81ea\u5df1\u7684\u8fed\u4ee3\u8282\u594f\uff0c\u5728\u65b0\u9700\u6c42\u5feb\u901f\u53d8\u5316\u7684\u8fc7\u7a0b\u4e2d\uff0c\u81ea\u52a8\u5316\u7ef4\u62a4\u53d8\u5f97\u5f02\u5e38\u56f0\u96be\uff0c\u539f\u56e0\u5c31\u662f\u81ea\u52a8\u5316\u9879\u76ee\u91cc\u9762\u5404\u4e2a\u5e94\u7528\u7684\u6709\u6bd4\u8f83\u591a\u7684\u8026\u5408\u5173\u7cfb\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u8fdb\u884c\u89e3\u8026\uff0c\u4ee5\u9002\u5e94\u5e94\u7528\u4e0d\u540c\u7684\u8fed\u4ee3\u5468\u671f\u3002 \u65e0\u6cd5\u7cbe\u51c6\u7684\u5212\u5206\u7528\u4f8b\u8303\u56f4 \u7528\u4f8b\u6267\u884c\u7684\u8303\u56f4\u4e0d\u591f\u7cbe\u51c6\uff0c\u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u4e3b\u8981\u901a\u8fc7\u7528\u4f8b\u7684\u5173\u952e\u8bcd core\uff08\u6838\u5fc3\uff09\u6765\u533a\u5206\u7528\u4f8b\u662f\u5426\u4e3a\u6838\u5fc3\u7528\u4f8b\uff0c\u4f46\u662f\u8fd9\u6837\u7684\u533a\u5206\u592a\u5bbd\u6cdb\u4e86\uff0c\u4e0d\u80fd\u9002\u5e94\u81ea\u52a8\u5316\u6d4b\u8bd5\u5728\u591a\u573a\u666f\u4e0b\u7684\u5e94\u7528\u3002\u5f88\u591a\u573a\u666f\u4e0b\u6211\u4eec\u8fd8\u9700\u8981\u6839\u636e\u7528\u4f8b\u7684\u7b49\u7ea7\u3001\u7528\u4f8b\u7684\u7c7b\u578b\u3001\u7528\u4f8b\u6765\u6e90\u7b49\u7b49\uff0c\u4e0d\u540c\u7684\u7ef4\u5ea6\u6765\u6311\u9009\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u5173\u952e\u5b57\u9700\u8981\u4eba\u5de5\u4e00\u6761\u6761\u7684\u6539\uff0c\u8d39\u65f6\u8d39\u529b\uff0c\u800c\u4e14\u4e0d\u597d\u7ef4\u62a4\u3002 \u53d7\u65b0\u9700\u6c42\u5f71\u54cd\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u597d\u7ef4\u62a4 \u76ee\u524d\u9700\u8981\u8df3\u8fc7\u7684\u7528\u4f8b\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684\u7528\u4f8b\u811a\u672c\u91cc\u9762\uff0c\u6dfb\u52a0\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\uff0c\u540e\u7eed\u89e3\u9664\u8df3\u8fc7\u7684\u65f6\u5019\u53c8\u9700\u8981\u627e\u5230\u8fd9\u6761\u811a\u672c\uff0c\u5220\u6389\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\u3002\u5728\u8df3\u8fc7\u7528\u4f8b\u8f83\u591a\u7684\u60c5\u51b5\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u96be\u5ea6\u3002 \u7f16\u5199\u7528\u4f8b\u65f6\u903b\u8f91\u6bd4\u8f83\u590d\u6742\uff0c\u9700\u8981\u8c03\u7528\u591a\u4e2a\u5e94\u7528\u7684\u65b9\u6cd5\u6a21\u5757\u3002 \u6846\u67b6\u6269\u5c55\u6027\u4e0d\u8db3\uff0c\u65e0\u6cd5\u6574\u5408\u6027\u80fd\u81ea\u52a8\u5316\u3001\u538b\u6d4b\u81ea\u52a8\u5316\u3001\u5b89\u5168\u81ea\u52a8\u5316\u7b49\u4e13\u9879\u6d4b\u8bd5\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_3","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u4e3a\u89e3\u51b3\u73b0\u6709\u95ee\u9898\uff0c\u9002\u5e94\u4e0d\u65ad\u4e30\u5bcc\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u66f4\u597d\u7684\u53d1\u6325\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4f5c\u7528\uff0c\u9700\u8981\u5bf9\u81ea\u52a8\u5316\u67b6\u6784\u53ca\u5404\u529f\u80fd\u6a21\u5757\u8fdb\u884c\u91cd\u65b0\u8bbe\u8ba1\u89c4\u5212\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_1","title":"1\u3001\u67b6\u6784\u8bbe\u8ba1","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_1","title":"2\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u6846\u67b6\u7684\u8fd0\u884c\u903b\u8f91\uff1a\u901a\u8fc7\u6838\u5fc3\u5c42\u63d0\u4f9b\u4e00\u4e2a\u57fa\u7840\u80fd\u529b\uff0c\u4e1a\u52a1\u5c42\u6839\u636e\u5b9e\u9645\u4e1a\u52a1\u9700\u6c42\uff08\u6d4b\u8bd5\u7528\u4f8b\uff09\u52a8\u6001\u52a0\u8f7d\u6838\u5fc3\u5c42\uff0c\u6267\u884c\u5165\u53e3\u52a0\u8f7d\u76f8\u5e94\u7684\u7528\u4f8b\u96c6\u5e76\u63a7\u5236\u6267\u884c\uff0c\u5e94\u7528\u5c42\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u9700\u6c42\uff0c\u901a\u8fc7\u76f8\u5e94\u7684\u914d\u7f6e\u9879\u8fdb\u884c\u914d\u7f6e\uff0c\u4ece\u800c\u89e6\u53d1\u81ea\u52a8\u5316\u6d4b\u8bd5\u4efb\u52a1\u3002 \u6838\u5fc3\u5c42\uff1a\u57fa\u672c\u4fdd\u6301\u4e0d\u53d8\uff0c\u90e8\u5206\u6a21\u5757\u4f1a\u6d89\u53ca\u5230\u65b0\u529f\u80fd\u5f00\u53d1\uff0c\u6838\u5fc3\u5c42\u5404\u529f\u80fd\u6a21\u5757\u4fdd\u6301\u72ec\u7acb\u6027\uff0c\u63d0\u4f9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u4f9b\u4e0a\u5c42\u8c03\u7528\uff1b \u5e95\u5c42\u6838\u5fc3\u6a21\u5757\u5305\u62ec\uff1a \u56fe\u50cf\u8bc6\u522b\u6a21\u5757 UI \u5b9a\u4f4d\u6a21\u5757 Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757 \u5c5e\u6027\u5b9a\u4f4d\u6a21\u5757 \u65e5\u5fd7\u6a21\u5757 \u952e\u9f20\u64cd\u4f5c\u6a21\u5757 \u6587\u4ef6\u64cd\u4f5c\u6a21\u5757 \u5f55\u5c4f\u6a21\u5757 \u81ea\u5b9a\u4e49\u65ad\u8a00\u6a21\u5757 \u7528\u4f8b\u6267\u884c\u6a21\u5757 PXE \u88c5\u673a\u6a21\u5757 \u952e\u9f20\u4fe1\u53f7\u6a21\u62df\u6a21\u5757 OCR \u6a21\u5757 \u4e1a\u52a1\u5c42\uff1a\u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e94\u7528\u5185\u5305\u542b\u591a\u4e2a\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5982\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7b49\uff0c\u540e\u7eed\u53ef\u4ee5\u6839\u636e\u9700\u8981\u5ac1\u63a5\u8fdb\u6765\u3002\u5176\u4e2d\u529f\u80fd\u6d4b\u8bd5\u8bbe\u8ba1\u601d\u8def\uff1a \u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e76\u5c06\u6d4b\u8bd5\u6570\u636e\u548c\u6d4b\u8bd5\u8d44\u6e90\u6574\u5408\u8fdb\u6765\uff0c\u589e\u52a0\u7528\u4f8b\u6807\u7b7e csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ed9\u6bcf\u6761\u7528\u4f8b\u6253\u6807\u7b7e\u3002 \u5404\u6807\u7b7e\u6240\u4f7f\u7528\u5bf9\u5e94\u7684\u5b57\u6bb5\u540d\u79f0\uff0c\u4f7f\u7528 csv \u6587\u4ef6\u7ef4\u62a4\u7528\u4f8b\u4e0e\u6807\u7b7e\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u5bf9\u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u53ef\u4ee5\u7ec4\u5408\u5176\u4e2d\u7684\u6807\u7b7e\u800c\u4ece\u9a71\u52a8\u5bf9\u5e94\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\uff0c\u517c\u5bb9\u73b0\u6709\u7528\u4f8b\u6807\u7b7e\uff0c\u4e14\u652f\u6301\u7528\u4f8b\u6807\u7b7e\u53ef\u6269\u5c55\uff1b \u4f7f\u7528 csv \u683c\u5f0f\u6587\u4ef6\u53ef\u4ee5\u65b9\u4fbf\u7684\u4f7f\u7528 Excel \u8868\u683c\u6253\u5f00\u8fdb\u884c\u7f16\u8f91\uff0c\u540c\u65f6\u7531\u4e8e csv \u6587\u4ef6\u5b9e\u9645\u662f\u4ee5\u90fd\u597d\u5206\u9694\u7684\u6587\u672c\u6587\u4ef6\uff0c\u4ee3\u7801\u4e2d\u53ef\u4ee5\u5728\u4e0d\u4f9d\u8d56\u4e09\u65b9\u5e93\u7684\u60c5\u51b5\u4e0b\u65b9\u4fbf\u5feb\u901f\u7684\u89e3\u6790\u5b83\uff0c\u53ef\u64cd\u4f5c\u6027\u548c\u53ef\u7ef4\u62a4\u6027\u8f83\u9ad8\u3002 \u5404\u4e2a\u5e94\u7528\u4e4b\u95f4\uff0c\u7528\u4f8b\u3001\u65b9\u6cd5\u3001\u6807\u7b7e\u548c\u8d44\u6e90\u90fd\u662f\u76f8\u4e92\u72ec\u7acb\u7684\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u7528\u4f8b\u65f6\u53ea\u9700\u8981\u81ea\u5df1\u5e94\u7528\u4e0b\u7684\u65b9\u6cd5\u548c\u516c\u5171\u5e93\u5373\u53ef\u3002 \u7ed3\u6784\u4e3e\u4f8b\uff1a .\n\u251c\u2500\u2500 apps\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_album # \u5e94\u7528\u540d (\u7528\u4e0b\u5212\u7ebf\u8fde\u63a5\u662f Python \u7f16\u7801\u89c4\u8303)\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_assert # \u65ad\u8a00\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_function_tag.csv # \u7528\u4f8b\u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 asan_cases # \u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases # \u529f\u80fd\u6d4b\u8bd5\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 res # \u6d4b\u8bd5\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config # \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_widget # \u5e94\u7528\u81ea\u5df1\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_widget # \u65b9\u6cd5\u57fa\u7c7b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 other_widget # \u8c03\u7528\u5176\u4ed6\u5e94\u7528\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_camera\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases\n\u2502\u00a0\u00a0 \u2502\u00a0 ...\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 public_widget # \u516c\u5171\u65b9\u6cd5\u5e93\n\u251c\u2500\u2500 config # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n...\n config \u914d\u7f6e\u6a21\u5757\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u76f8\u5e94\u914d\u7f6e\uff0c\u6d4b\u8bd5\u540c\u5b66\u53ef\u4ee5\u6839\u636e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5728 config \u91cc\u9762\u8fdb\u884c\u914d\u7f6e\u3002 \u5168\u5c40\u914d\u7f6e\uff1a \u6267\u884c\u4e00\u4e2a\u6216\u591a\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff1a\u5728 pattern \u91cc\u9762\u5199\u5165\u5e94\u7528\u5305\u540d\uff0c\u591a\u4e2a\u5e94\u7528\u4e4b\u95f4\u7528 or \u8fde\u63a5\uff0c\u5982 deepin-music or deepin-movie\uff1b \u5192\u70df\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a smoke\uff1b \u96c6\u6210\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a core \uff1b \u5168\u91cf\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u4e3a\u7a7a\u5373\u53ef\uff1b \u901a\u8fc7 tags \u7684\u914d\u7f6e\u6bd4\u8f83\u7075\u6d3b\uff0c\u540e\u9762\u6807\u7b7e\u5316\u7ba1\u7406\u7ae0\u8282\u4f1a\u8bb2\u5230\uff0c\u652f\u6301\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u7075\u6d3b\u914d\u7f6e\u3002 \u6307\u5b9a\u67d0\u53f0\u673a\u5668\u5728\u6307\u5b9a\u955c\u50cf\u7248\u672c\u4e0a\u6267\u884c\u7528\u4f8b\uff1a\u5728 IP \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a IP\uff0c\u5e76\u5728 URL \u91cc\u9762\u586b\u5165\u955c\u50cf\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u6846\u67b6\u4f1a\u8c03\u7528 PXE \u8fdb\u884c\u81ea\u52a8\u88c5\u673a\uff0c\u88c5\u673a\u5b8c\u4e4b\u540e\u81ea\u52a8\u5f00\u59cb\u6267\u884c\u914d\u7f6e\u7684\u6d4b\u8bd5\u7528\u4f8b\u3002 \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\uff1a \u6bcf\u4e2a\u5e94\u7528\u5185\u90e8\u4f1a\u6709\u4e00\u4e2a\u5355\u72ec\u7684\u914d\u7f6e\u6a21\u5757\uff0c\u4f1a\u5305\u542b\u4e00\u4e9b\u672c\u5e94\u7528\u7684\u6d4b\u8bd5\u8d44\u6e90\u7684\u8def\u5f84\u3001\u6267\u884c\u7528\u4f8b\u7684\u6807\u7b7e\u914d\u7f6e\u7b49\u7b49\uff0c\u5982\u679c\u5728\u5c40\u90e8\u914d\u7f6e\u91cc\u9762\u914d\u7f6e\u4e86\u7528\u4f8b\u6267\u884c\u6807\u7b7e\uff0c\u800c\u5916\u5c42 runner \u51fa\u6ca1\u6709\u6307\u5b9a\u6267\u884c\u6807\u7b7e\uff0c\u5219\u5728\u6267\u884c\u65f6\u53ea\u4f1a\u6267\u884c\u5c40\u90e8\u914d\u7f6e\u5df2\u914d\u7f6e\u7684\uff0c\u82e5\u5916\u5c42 runner \u4e5f\u914d\u7f6e\u4e86\u6267\u884c\u6807\u7b7e\uff0c\u5219\u4f1a\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u7528\u4f8b\u3002 \u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u914d\u7f6e\u90fd\u5728\u540c\u4e00\u4e2a\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\uff0cpy \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684\u7c7b\uff0cini \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684 option\u3002 \u5168\u5c40\u914d\u7f6e\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u7b56\u7565\u5982\u4e0b\uff1a \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5c40\u90e8\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5e94\u7528\u5c42\uff1arunner \u662f\u6d4b\u8bd5\u6267\u884c\u7684\u5165\u53e3\uff0c\u5b83\u4f1a\u6839\u636e\u914d\u7f6e\u91cc\u9762\u7684\u914d\u7f6e\u9879\uff0c\u8fdb\u884c\u7528\u4f8b\u7684\u52a0\u8f7d\u548c\u6267\u884c\u3002\u5b83\u63d0\u4f9b\u63a5\u53e3\u7ed9\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\uff0c\u5e73\u53f0\u4e0a\u7684\u6307\u4ee4\u5b9e\u9645\u4e0a\u90fd\u662f\u901a\u8fc7\u4e0b\u53d1\u7ed9 runner\uff0c\u7136\u540e\u7531 runner \u6765\u6267\u884c\u76f8\u5e94\u7684\u6d4b\u8bd5\u3002 \u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u662f\u4e00\u4e2a\u524d\u7aef\u7cfb\u7edf\uff0c\u53ef\u4ee5\u8fdb\u884c\u6d4b\u8bd5\u673a\u7ba1\u7406\u3001\u81ea\u52a8\u5b89\u88c5\u955c\u50cf\u3001\u81ea\u52a8\u5b89\u88c5\u6307\u5b9a\u5e94\u7528\u7248\u672c\u3001\u8fdb\u884c\u6d4b\u8bd5\u7528\u4f8b\u8303\u56f4\u9009\u62e9\u3001\u7528\u4f8b\u89e6\u53d1\u6267\u884c\u63a7\u5236\u3001\u7ed3\u679c\u5c55\u793a\u8f93\u51fa\u7b49\u3002 \u4e00\u4e2a\u5e94\u7528\u7684\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\u90fd\u53ef\u4ee5\u5355\u72ec\u89e6\u53d1\u3002 \u517c\u5bb9\u6027\u6d4b\u8bd5\u4e3b\u8981\u901a\u8fc7 PXE \u670d\u52a1\u5668\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u88c5\u673a\uff0c\u7136\u540e\u914d\u5408 AT \u8fdb\u884c\u6d4b\u8bd5\uff0c\u53ef\u4ee5\u5b9e\u73b0\u4e0d\u540c\u7cfb\u7edf\u7248\u672c\u3001\u4e0d\u540c\u5e94\u7528\u7248\u672c\u73af\u5883\u4e0a\u90fd\u53ef\u4ee5\u8fdb\u884c\u81ea\u52a8\u5316\u7684 AT \u6267\u884c\uff0c\u63d0\u9ad8\u517c\u5bb9\u6027\u6d4b\u8bd5\u6548\u7387\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_4","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_2","title":"1\u3001\u7528\u4f8b\u89e3\u8026","text":"\u5b58\u5728\u8026\u5408\u5173\u7cfb\u7684\u65b9\u6cd5\uff1a\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u88ab\u5916\u90e8\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\uff0c\u5219\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u8026\u5408\u5173\u7cfb\u3002 1.1\u3001\u901a\u8fc7\u7f16\u8f91\u5668 Find Usages \u67e5\u770b\u6bcf\u4e2a\u65b9\u6cd5\u88ab\u8c03\u7528\u7684\u8def\u5f84\u548c\u88ab\u8c03\u7528\u6b21\u6570\uff1b 1.2\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 1 \u4e2a\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728\u5916\u90e8\u5e94\u7528\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1b 1.3\u3001\u64cd\u4f5c\u5c42\u6587\u4ef6\u540d\u5747\u4ee5 widget \u7ed3\u5c3e\uff0c\u7c7b\u540d\u4ee5 Widget \u7ed3\u5c3e\uff0c\u5982\uff1a\u6587\u4ef6\u540d music_widget.py \uff1a class MusicWidget:\n\"\"\"\u97f3\u4e50\u7684\u64cd\u4f5c\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_2","title":"2\u3001\u516c\u5171\u5e93\u5efa\u8bbe","text":"2.1\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 2 \u4e2a\u53ca\u4ee5\u4e0a\u7684\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728 public_widget \u76ee\u5f55\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1bpublic_widget \u5373\u4e3a\u516c\u5171\u65b9\u6cd5\u5e93\uff1b 2.2\u3001\u5728\u7528\u4f8b\u5c42\u4fee\u6539\u7528\u4f8b\u4e2d\u7c7b\u7684\u5bfc\u5165\u8def\u5f84\uff0c\u5c5e\u4e8e\u516c\u5171\u65b9\u6cd5\u7684\u5219\u8c03\u7528 public_widget \u4e2d\u7684\u7c7b\uff0c\u5916\u90e8\u5e94\u7528\u7684\u64cd\u4f5c\u65b9\u6cd5\uff0c\u5219\u8c03\u7528\u672c\u5e94\u7528\u76ee\u5f55\u4e0b\u91cd\u5199\u7684\u5916\u90e8\u5e94\u7528\u65b9\u6cd5\u3002 \u6bd4\u5982\uff1a\u51e0\u4e4e\u6240\u6709\u591a\u5a92\u4f53\u5e94\u7528\u90fd\u9700\u8981\u901a\u8fc7\u6587\u7ba1\u52a0\u8f7d\u8d44\u6e90\uff0c\u8c03\u8d77\u7684\u6587\u7ba1\u5bf9\u8bdd\u6846\u5b9e\u9645\u4e3a dde-desktop\uff0c\u56e0\u6b64\u5c06 desktop_widget.py \u653e\u5230 public_widget \u91cc\u9762\uff1a class DdeDesktopPublicWidget:\n\"\"\"\u516c\u5171-\u684c\u9762\u7684\u64cd\u4f5c\u65b9\u6cd5\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3_1","title":"3\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406","text":"3.1\u3001\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1a\u5bf9\u5e94 core\u3001smoke\uff0c\u6216\u4e3a\u7a7a\uff1b \u7528\u4f8b\u6765\u6e90\uff1a\u5bf9\u5e94 PMS \u7528\u4f8b\u6765\u6e90\uff0c\u5206\u522b\u7528 acp1\u3001acp2\u3001acp3\u3001acp4 \u8868\u793a\u3002 acp1 \uff1a\u4e1a\u52a1\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5199\u7684\u7528\u4f8b\uff0c\u88ab\u7528\u4e8e\u9a8c\u6536\u6d4b\u8bd5\u7684\uff1b acp2 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5f15\u5165\u7684\u4ea7\u54c1\u9a8c\u6536\u6d4b\u8bc4\u90e8\u7684\u7528\u4f8b\uff1b acp3 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u6839\u636e\u4ea7\u54c1\u9700\u6c42\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\uff1b acp4 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u901a\u8fc7\u793e\u533a\u3001\u8bba\u575b\u7528\u6237\u53cd\u9988\u95ee\u9898\u603b\u7ed3\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\u3002 \u4e3e\u4f8b\uff1a \u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u7528\u4f8b\u6765\u6e90 001 L1 core acp1 \u6807\u7b7e\u91c7\u7528\u679a\u4e3e\u7684\u65b9\u5f0f\u8fdb\u884c\u4ee3\u53f7\u7ba1\u7406\u65b9\u4fbf\u7ba1\u7406\u4ee5\u53ca\u540e\u7eed\u6269\u5c55\u3002 3.2\u3001\u5728\u6bcf\u4e2a\u5e94\u7528\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u7b2c\u4e00\u5217\u4e3a\u7528\u4f8b\u7684 ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ba1\u7406\u6a21\u5757\u5185\u7684\u7528\u4f8b\u6807\u7b7e\u3002\u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 3.3\u3001\u5bf9\u7167 PMS \u4e0a\u7528\u4f8b\u7b49\u7ea7\u3001\u7528\u4f8b\u7c7b\u578b\u548c\u7528\u4f8b\u6765\u6e90\uff0c\u6807\u8bb0\u6240\u6709\u5df2\u5b9e\u73b0\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u540e\u7eed\u7f16\u5199\u65b0\u589e\u81ea\u52a8\u5316\u7528\u4f8b\u65f6\uff0c\u6bcf\u5199\u4e00\u6761\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684 csv \u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u6b64\u6761\u7528\u4f8b\u7684\u6807\u7b7e\u3002 3.4\u3001\u8df3\u8fc7\u7528\u4f8b\u6807\u7b7e\u5316 \u73b0\u6709\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a\uff1a \u4e3e\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u8bb0\u4e3a \u201cskip-\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u8bb0\uff0c\u5982\u679c\u5df2\u7ecf\u6807\u8bb0\u4e86\u8df3\u8fc7\u539f\u56e0\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u8bb0\u4e3a SKIPED\uff0c\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\u3002 \u6240\u6709\u7684\u6807\u7b7e\u5728 docs \u76ee\u5f55\u4e0b\u4f1a\u6709\u4e00\u4e2a\u6587\u6863\uff0c\u6587\u6863\u6682\u5b9a\u540d\u79f0\u4e3a\uff1atags_info.md\uff0c\u7528\u4e8e\u8bf4\u660e\u73b0\u5728\u5df2\u7ecf\u4f7f\u7528\u5230\u7684\u6807\u7b7e\uff0c\u4ee5\u53ca\u8fd9\u4e9b\u6807\u7b7e\u7684\u89e3\u91ca\u548c\u7528\u6cd5\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#4","title":"4\u3001\u7528\u4f8b\u6267\u884c","text":"4.1\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u7684\u9a71\u52a8\u6267\u884c\u903b\u8f91\u529f\u80fd\u5b9e\u73b0 \u5f00\u53d1\u6839\u636e\u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\u91cc\u9762\u7684\u7528\u4f8b\u6807\u7b7e\u6267\u884c\u5bf9\u5e94\u7528\u4f8b\u7684\u529f\u80fd\uff0c\u80fd\u652f\u6301\u591a\u4e2a\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u6267\u884c\u5165\u53e3\u80fd\u968f\u610f\u901a\u8fc7\u7528\u4f8b\u6807\u7b7e\u6307\u5b9a\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002 \u7528\u4f8b\u6807\u7b7e\u7684\u9a71\u52a8\u65b9\u5f0f\u5fc5\u987b\u80fd\u652f\u6301\u6807\u7b7e\u7684\u6269\u5c55\uff0c\u672a\u6765\u968f\u7740\u4e1a\u52a1\u7684\u53d8\u5316\u53ef\u80fd\u9700\u8981\u589e\u52a0\u5404\u79cd\u5404\u6837\u7684\u6807\u7b7e\u3002 4.2\u3001\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u6267\u884c \u529f\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u3001\u6027\u80fd\u6d4b\u8bd5\u7b49\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u662f\u5206\u5f00\u6267\u884c\u7684\uff0c\u4e5f\u5c31\u662f\u5728\u4e00\u6b21\u6267\u884c\u4e2d\uff0c\u53ea\u80fd\u6267\u884c\u5176\u4e2d\u4e00\u79cd\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5177\u4f53\u8981\u6267\u884c\u54ea\u4e00\u79cd\u540c\u6837\u901a\u8fc7\u53c2\u6570\u6765\u63a7\u5236\u3002 4.3\u3001\u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c \u7531\u4e8e\u6d4b\u8bd5\u673a\u8d44\u6e90\u6709\u9650\uff0c\u968f\u7740\u81ea\u52a8\u5316\u7528\u4f8b\u6570\u91cf\u7684\u589e\u52a0\uff0cCI \u6267\u884c\u65f6\u95f4\u4f1a\u8d8a\u6765\u8d8a\u957f\u3002 \u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c\u7684\u529f\u80fd\uff1a \u540c\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\u5206\u6563\u5230\u4e0d\u540c\u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u4e0a\u6267\u884c\uff0c\u7f29\u77ed\u6267\u884c\u603b\u65f6\u95f4\uff1b \u7b2c\u4e8c\u5929\u8dd1\u7684\u65f6\u5019\u540c\u4e00\u4e2a\u673a\u5668\u4e0a\u4f1a\u6267\u884c\u6628\u5929\u6ca1\u6709\u6267\u884c\u5230\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u6267\u884c\u540c\u7406\uff1b \u53ef\u4ee5\u5b9e\u73b0\u5728\u5168\u67b6\u6784\u6d4b\u8bd5\u673a\u4e0a\u8f6e\u6d41\u6267\u884c\u7528\u4f8b\uff0c\u65e2\u80fd\u4fdd\u8bc1\u6267\u884c\u4e86\u6240\u6709\u7684\u7528\u4f8b\uff0c\u53c8\u80fd\u5728\u8d44\u6e90\u6709\u9650\u7684\u60c5\u51b5\u4e0b\u8986\u76d6\u4e86\u6240\u6709\u7684\u67b6\u6784\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#5","title":"5\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0","text":"5.1\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u4f5c\u4e3a\u524d\u7aef\u754c\u9762\u7cfb\u7edf\uff0c\u901a\u8fc7\u9875\u9762\u4e0a\u7684\u4e00\u4e9b\u529f\u80fd\u9009\u9879\u8fdb\u884c\u5bf9\u5e94\u6d4b\u8bd5\u4efb\u52a1\u7684\u7ba1\u7406\u6216\u89e6\u53d1\uff0c\u4e1a\u5185\u6bd4\u8f83\u6d41\u884c\u7684\u5b9e\u73b0\u65b9\u6848\u662f\u4f7f\u7528 Vue + DRF \u5b9e\u73b0\u4e00\u4e2a\u524d\u540e\u7aef\u5206\u79bb\u7684\u7cfb\u7edf\u3002 \u6d4b\u8bd5\u5e73\u53f0\u53ef\u80fd\u4f1a\u6d89\u53ca\u5230\u7684\u6a21\u5757\u6709\uff1a\u6d4b\u8bd5\u673a\u8d44\u6e90\u7ba1\u7406\u6a21\u5757\u3001\u7528\u4f8b\u6267\u884c\u63a7\u5236\u6a21\u5757\u3001\u7ed3\u679c\u5c55\u793a\u6a21\u5757\u3001PXE \u955c\u50cf\u5b89\u88c5\u6a21\u5757\u7b49\u3002 \u7528\u6237\uff08\u6d4b\u8bd5\u3001\u7814\u53d1\u540c\u5b66\u7b49\uff09\u53ef\u4ee5\u914d\u7f6e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5982\u6267\u884c\u54ea\u4e2a\u5e94\u7528\u3001\u6267\u884c\u7528\u4f8b\u7684\u8303\u56f4\u3001\u5728\u54ea\u53f0\u673a\u5668\u4e0a\u6267\u884c\u3001\u955c\u50cf\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u5e94\u7528\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u6267\u884c\u65f6\u95f4\u3002 5.2\u3001\u6267\u884c\u5165\u53e3 runner \u63d0\u4f9b\u7ed9\u6d4b\u8bd5\u5e73\u53f0\u7684\u63a5\u53e3\u5305\u62ec\uff1a\u7528\u4f8b\u6267\u884c\u63a5\u53e3\u3001\u7ed3\u679c\u8fd4\u56de\u63a5\u53e3\u3001\u955c\u50cf\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u955c\u50cf\u5b89\u88c5\u63a5\u53e3\u3001\u5e94\u7528\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u5e94\u7528\u5b89\u88c5\u66f4\u65b0\u63a5\u53e3\u7b49\u3002 \u524d\u7aef\u5e73\u53f0\u76ee\u524d\u8fd8\u6ca1\u6709\u592a\u591a\u8be6\u7ec6\u7684\u65b9\u6848\uff0c\u672c\u6b21\u8bbe\u8ba1\u4e3b\u8981\u96c6\u4e2d\u5728\u540e\u7aef\u8fd9\u90e8\u5206\u67b6\u6784\u7684\u8bbe\u8ba1\u4e0a\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_5","title":"\u56db\u3001\u5b9e\u65bd\u8ba1\u5212","text":"\u8fd1\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u6587\u7ba1\u4ee3\u7801\u89e3\u8026 2022/3/28 2022/4/8 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u56fe\u5f62\u56fe\u50cf\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u97f3\u89c6\u9891\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5168\u5c40\u641c\u7d22\u4ee3\u7801\u89e3\u8026 2022/4/25 2022/4/26 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u516c\u5171\u5e93\u5efa\u8bbe 2022/4/27 2022/5/5 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5c01\u88c5\u7684\u65b9\u6cd5\u6574\u7406\u6210\u4e00\u4e2a\u8868 2022/5/6 2022/5/10 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7528\u4f8b\u6807\u7b7e\u5206\u7c7b\u8bc4\u4f30 2022/5/11 2022/5/11 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u6807\u7b7e\u5316\u6267\u884c\u9a71\u52a8\u7a0b\u5e8f\u7f16\u5199 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u9700\u5b9e\u73b0\u81ea\u52a8\u89e3\u6790 csv \u8868\u683c\u4e2d\u7684\u7528\u4f8b\u7f16\u53f7 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u722c\u866b\u811a\u672c\uff0c\u722c\u53d6 pms \u4e0a\u7528\u4f8b\u7684\u6807\u7b7e 2022/5/11 2022/5/13 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u5b9a\u65f6\u81ea\u52a8\u7ef4\u62a4\u672c\u5730 csv \u6587\u4ef6\u811a\u672c 2022/5/11 2022/5/20 \u4e2d\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u76ee\u5f55\u7ed3\u6784\u8c03\u6574 2022/5/20 2022/6/2 \u5b8c\u6210\u5168\u5c40\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u5177\u4f53\u65b9\u6848\u548c\u903b\u8f91\u5b9e\u73b0 2022/6/6 2022/6/17 \u9759\u6001\u626b\u63cf\u95ee\u9898\u6e05\u96f6 2022/6/20 2022/7/1 \u5b8c\u6210\u65b0\u6846\u67b6\u4f7f\u7528\u57f9\u8bad 2022/7/4 2022/7/11 \u843d\u5730\u8fd0\u884c 2022/7/12 2022/7/20 \u5e95\u5c42\u5e93\u7528\u9014\u8bf4\u660e\u6587\u6863\u7f16\u5199 2022/7/21 2022/7/28"}]} \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz index 8ffaebc1..e0b7bbfc 100644 Binary files a/sitemap.xml.gz and b/sitemap.xml.gz differ diff --git "a/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" "b/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" index 25f669d5..97100667 100644 --- "a/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" +++ "b/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs @@ -1215,8 +1215,7 @@ 智能化功能测试# Attribution :chengdu Test Team # Date :2021/08/20 -此方案仍在演进中 -此方案仍在演进中 +此方案仍在演进中 仓库地址:https://gitlabcd.uniontech.com/autotest/cd-desktop-aitest 一、方案概述¶ 基于深度学习智能识别应用的元素控件,用于在自动化测试操作过程中的元素定位以及判断结果时的断言处理;自动化测试过程中,测试机上的画面通过采集盒传输到服务器上,服务器对视频画面进行智能识别后,服务器智能判断用例是否执行成功,然后对测试机下发下一步操作指令,测试机接受并执行下一步操作。 diff --git "a/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" "b/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" index cdf9ccde..06c9e9a5 100644 --- "a/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" +++ "b/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" @@ -95,7 +95,7 @@ - + @@ -226,7 +226,7 @@ - + YouQu Docs diff --git "a/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" "b/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" index 121b4507..72123668 100644 --- "a/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" +++ "b/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs @@ -752,6 +752,13 @@ + + + + + 4、虚拟化部署 + + @@ -1661,6 +1668,13 @@ + + + + + 4、虚拟化部署 + + @@ -2604,18 +2618,12 @@ 1、标签说明流水线使用指导; 跳过原因:skip-XXX,用于控制用例是否执行; 确认修复:fixed-XXX,用于标记用例的修复状态(后面详细讲解用法); @@ -2629,26 +2637,30 @@ 1、标签说明PMS用例ID 用例级别 用例类型 +设备类型 +用例来源 上线对象 测试级别 跳过原因 确认修复 -废弃用例 -... +废弃用例 +... -001 +679537 679537 L1 FUNC +PPL + CICD C1 skip-XXX fixed-XXX -removed-已废弃 -... +removed-已废弃 +... @@ -2656,7 +2668,7 @@ 2、操作步骤csv 的文件名。 例如: -相册的用例文件为 test_album_xxx.py,xxx 表示任意三位数字代表用例序号,此时 csv 文件名就应为 album.csv; +相册的用例文件为 test_album_xxx.py,xxx 表示用例的ID(也可以是自定义的数字代表用例序号),此时 csv 文件名就应为 album.csv; 对于用例规模比较大的应用,比如文件管理器,建议分模块,每个模块建立一个 csv 文件,所有 csv 文件建议放在一个 tags 目录下。 是否分模块维护 csv 取决于应用的用例复杂度,同时我们应该充分考虑后期的可维护性,csv 文件太多了也是一个很糟糕的事情。 @@ -2677,7 +2689,7 @@ 3.1.1、固定跳过001 +679537 ... skip-受到某新需求影响 @@ -2742,7 +2754,7 @@ 3.2、确认修复001 +679537 ... skip-受到某新需求影响 fixed-已修复 @@ -2787,7 +2799,7 @@ 3.3、废弃用例4、设计思路¶ 上面介绍 Pytest 框架提供的标签功能 mark,使用时需要为每一个用例添加标签装饰器,则操作复杂,可维护性差,其根本问题就是标签分散在每一条用例的装饰器上,难以集中维护;于是乎将所有标签使用 csv 文件进行集中管理,并通过 Pytest 的钩子函数,读取 csv 文件,动态添加标签到用中。 5、CSV文件格式¶ -此配置文件需要维护大量的标签数据,且要方便能使用Excel打开进行编辑查看,更重要的是我们不想引入三方依赖,CSV 文件几乎是唯一能满足所有的要求的文件格式。 +此配置文件需要维护大量的标签数据,且要方便能使用 Excel 打开进行编辑查看,更重要的是我们不想引入三方依赖,CSV 文件几乎是唯一能满足所有的要求的文件格式。 七、日志系统¶ 1、背景¶ 基于 YouQu 自动化测试框架操作方法封装写法,通常是这样的:类里面一个函数只包含一个操作或多次调用的一系列可合并的操作; @@ -2888,7 +2900,7 @@ 1、原则 大文件不能上传到工程里面,保持整个工程的轻量化,这样在克隆代码的时候才能非常快速方便使用,我们见过一个 AT 工程 clone 大小达到好几个 G,简直不可思议。 其实代码文件的大小是很小的,也就是说,纯写代码随便写工程也不会太大,而文档(包含插图)等资源却是很占空间。 -因此我们选择将 YouQu 的文档工程单独迁出到独立的仓库 youqu-docs 。 +因此我们选择将 YouQu 的文档工程涉及到的图片资源都采用外链加载; 2、安装¶ 项目根目录下运行 env.sh 即可。 bash env.sh @@ -2930,17 +2942,25 @@ 3.2、裁剪依赖bash env_dev.sh +4、虚拟化部署¶ +YouQu默认采用虚拟化部分,虚拟化环境实际安装的位置是在 $HOME/.local/share/virtualenvs/youqu-oHTM7l7G 目录下 +youqu-oHTM7l7G 此目录名称前面部分是你的代码根目录的名称,后面部分是生成的随机字符串; +同学们在远程机器上定位问题的时候,如果使用 Pycharm 调试,就将解释器指定到这个目录的就行了; +当然,我们也提供了本机开发环境部署: +bash env_dev.sh + +如果你是本地开发环境可以用它,区别就是驱动执行的时候使用:python3 manage.py xxx 九、失败录屏¶ 录屏其实是一种视频形式的日志,因为很多时候我们在查看日志之后仍然无法准确的定位到用例失败的具体原因,因此用例的录屏能让我们看到用例在执行过程; 【使用方法】 在 globalconfig.ini 里面配置关注 2 个参数; -;失败用例重跑次数 -RERUN = 1 - -;失败录屏从第几次开始录制视频。 -;比如 RECORD_FAILED_CASE = 1 ,表示用例第1次执行失败之后开始录屏。 -;注意,用例失败重跑的次数不能小于失败录屏次数,即 RERUN >= RECORD_FAILED_CASE -RECORD_FAILED_CASE = 1 +;失败用例重跑次数 +RERUN = 1 + +;失败录屏从第几次开始录制视频。 +;比如 RECORD_FAILED_CASE = 1 ,表示用例第1次执行失败之后开始录屏。 +;注意,用例失败重跑的次数不能小于失败录屏次数,即 RERUN >= RECORD_FAILED_CASE +RECORD_FAILED_CASE = 1 默认失败重跑的次数是 1 次; RECORD_FAILED_CASE = 1 表示用例第1次执行失败之后开始录屏; @@ -2953,48 +2973,48 @@ 十、Wayland 适配简单讲就是,应用库只需要维护一套用例脚本即可。 【用例兼容】 因为 Wayland 下有些应用的界面显示和功能本身存在一些差异,用例层可能需要对这部分用例做逻辑判断,使用全局配置里面的常量进行逻辑编写即可: -from setting.globalconfig import GlobalConfig - -# GlobalConfig.IS_WAYLAND 获取到当前的显示服务器(bool) -# 应用库 Config 继承 GlobalConfig -if Config.IS_WAYLAND: - pass -if Config.IS_X11: - pass +from setting.globalconfig import GlobalConfig + +# GlobalConfig.IS_WAYLAND 获取到当前的显示服务器(bool) +# 应用库 Config 继承 GlobalConfig +if Config.IS_WAYLAND: + pass +if Config.IS_X11: + pass 比如用例里面如果断言的图片不同: -if Config.IS_WAYLAND: - self.assert_image_exist("wayland_XXX") -else: - self.assert_image_exist("x11_XXX") +if Config.IS_WAYLAND: + self.assert_image_exist("wayland_XXX") +else: + self.assert_image_exist("x11_XXX") 这样这条用例脚本在 Wayland 和 X11 下都可以跑,so easy 是不是?完全没必要专门拉新分支进行 Wayland 适配。 十一、测试报告¶ 1. 目录结构¶ 执行时会在根目录下动态生成 report 目录,所有的报告相关的文件会统一存放在里面,示例: -/report - ├── allure # allure报告 - │ ├── ... - │ └── ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json - ├── allure_html # 生成的html报告 - │ ├── ... - │ └── index.html - ├── allure_back # allure报告备份 - │ └── 20221108114823 - │ ├── ... - │ └── f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json - ├── json # json报告 - │ ├── ... - │ └── result_deepin-music_20221109134736_1081333.json - ├── logs # 日志文件 - │ ├── 2022-11-10_debug.log - │ └── 2022-11-10_error.log - ├── record # 录屏 - │ └── 2022-11-09 - │ ├── ... - │ └── 15时14分09秒_test_music_303_2_autotest.mp4 - └── xml # xml报告 - └── autotest_deepin_music-20221109134736.xml +/report + ├── allure # allure报告 + │ ├── ... + │ └── ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json + ├── allure_html # 生成的html报告 + │ ├── ... + │ └── index.html + ├── allure_back # allure报告备份 + │ └── 20221108114823 + │ ├── ... + │ └── f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json + ├── json # json报告 + │ ├── ... + │ └── result_deepin-music_20221109134736_1081333.json + ├── logs # 日志文件 + │ ├── 2022-11-10_debug.log + │ └── 2022-11-10_error.log + ├── record # 录屏 + │ └── 2022-11-09 + │ ├── ... + │ └── 15时14分09秒_test_music_303_2_autotest.mp4 + └── xml # xml报告 + └── autotest_deepin_music-20221109134736.xml 默认情况下同时生成 html、xml、json三种形式的报告。 2. 定制报告¶ @@ -3011,14 +3031,14 @@ 3. 查看报告allure open report/allure_html +allure open report/allure_html 使用 manage.py 执行完之后,在终端的最后一行,我们会给你输出打开报告的命令,直接复制它在终端执行就可以查看了,像这样: - 终端执行命令: allure open /tmp/youqu/report/allure_html 查看报告 + 终端执行命令: allure open /tmp/youqu/report/allure_html 查看报告 你也可以直接在 Pycharm 里面找到 index.html 文件,然后右键选择浏览器打开,或者你可以用一个 http 服务打开。 你也可以直接在 report/allure 目录下查看报告: - allure serve report/allure + allure serve report/allure 远程执行 @@ -3031,48 +3051,48 @@ 1. 提前解决代码问题这里推荐一个 Python 社区流行的代码格式化工具: Black,号称不妥协的代码格式化工具,它检测到不符合规范的代码风格直接就帮你全部格式化好,就是这么刚! 安装: -sudo pip3 install black +sudo pip3 install black 使用方法: -black ${CheckPath} +black ${CheckPath} 使用这个工具格式化之后,代码会被自动调整,刚开始你可能会觉得调整得很夸张,没关系坚持看,习惯之后,你会觉得很优雅,没错,这就是 Pythonic Code 的核心,请保持优雅~。 2. 代码扫描工具¶ 使用根目录下 pylint.sh 扫描代码,在 report 目录下查看代码扫描报告,如果有代码问题请提前解决之后再提交。 此脚本已经使用 Python 社区最流行的代码扫描工具 Pylint 进行代码扫描。 使用方法: -bash pylint.sh +bash pylint.sh 运行之后会提示你要扫描的目录,比如输入 apps ,则会扫描 apps 下的所有 Python 代码。 在 setting/pylintrc.cfg 配置文件里面进行相关配置,扫描完成之后在 report/pylints 目录下会生成扫描报告。 代码提交需通过 git review 提交到 gerrit ,人工 Code Review 通过之后合入代码。 十三、提交代码¶ 1. 安装依赖¶ -sudo apt install git-review +sudo apt install git-review 2. 提交模板¶ 在 ~ 目录下新建文件,并命名为 gitcommit_template 将以下内容写入文件当中: -# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 -fix: - -# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 -Description: - -# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 -Log: - -# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 -#Bug: - -# 修复 github issue -#Issue: - -# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 -#Task: +# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 +fix: + +# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 +Description: + +# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 +Log: + +# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 +#Bug: + +# 修复 github issue +#Issue: + +# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 +#Task: 命令行执行: -git config --global commit.template ~/gitcommit_template +git config --global commit.template ~/gitcommit_template 此命令将模板加入到 git 的提交模板中。 后续提交的时候需要关注一下几点: @@ -3083,19 +3103,19 @@ 2. 提交模板3. 推送代码¶ 首先添加 commit 信息 -git add 后面加文件名称 +git add 后面加文件名称 -git add . # 表示添加所有文件 +git add . # 表示添加所有文件 使用这条命令注意有些临时文件不要提交到仓库了。 -git commit -a +git commit -a 之后在 fix: 后面(注意冒号后面必须加空格,不然直接-1)写本地提交的 commit 信息,然后就可以提交代码了 -git review branch(当前分支) -r origin +git review branch(当前分支) -r origin 最好一次 commit,一次 git review ,经常有同学在本地疯狂 commit 最后 git review 报错不知道咋回事儿。 若不想每次提交都加上 -r 选项,执行以下命令: -git config --global gitreview.remote origin +git config --global gitreview.remote origin 提交代码,直接使用 git review branch<目标分支>,例如 git review master 4. Git标签¶ @@ -3106,74 +3126,74 @@ 4. Git标签git tag -a <tagname> +git tag -a <tagname> 回车之后,Git 会打开你的编辑器,让你写一句标签注解,就像你给提交写注解一样。 查看所有标签 -git tag -l -# git tag 也行 +git tag -l +# git tag 也行 删除标签 -git tag -d <tagname> +git tag -d <tagname> 推送标签至远程 git push 命令并不会传送标签到远程仓库服务器上,必须显式地推送标签。 -git push origin <tagname> +git push origin <tagname> 推送所有不在远程仓库服务器上的标签 -git push origin --tag +git push origin --tag 删除远程标签 -git push origin :refs/tag/<tagname> +git push origin :refs/tag/<tagname> 后期打标签 先用 git log --pretty=oneline 查询提交记录,获取校验码。 -git tag -a <tagname> 9fceb02(校验码) +git tag -a <tagname> 9fceb02(校验码) 检出标签 -git checkout <tagname> +git checkout <tagname> 此时,仓库会处于“分离头指针(detached HEAD)”的状态。 在“分离头指针”状态下,如果你做了某些更改然后提交它们,标签不会发生变化, 但你的新提交将不属于任何分支,并且将无法访问,除非通过确切的提交哈希才能访问。 因此,如果你需要进行更改,比如你要修复旧版本中的错误,那么通常需要创建一个新分支: -git checkout -b <NewBranchName> <tagname> +git checkout -b <NewBranchName> <tagname> 新分支上可以进行提交代码。 十四、常见问题¶ 1. 提交代码时提示邮箱或者名称不对¶ 重新配置邮箱或者名称,然后重置生效: -git commit --amend --reset-author +git commit --amend --reset-author 2. 怎么回滚到之前的版本¶ (1)查询历史提交记录 -git log +git log 找到你要回滚的版本,复制 hash 值。 注意:是 commit 空格之后的 hash 值,之前有同学复制的 Change-Id: 这样肯定报错。 (2)回滚版本,不清除代码 -git reset --soft ${hash} +git reset --soft ${hash} (3)回滚版本,清除代码,慎用哈 -git reset --hard ${hash} +git reset --hard ${hash} 3. 测试报告里面 F S . E 是什么意思¶ F 表示失败,. (点)表示通过,S 表示跳过,E 表示 error 有报错 4. 解决 git status 中文显示的问题¶ -git config --global core.quotePath false +git config --global core.quotePath false 5. apps 目录下颜色有些是黄色的¶ 在 Pycharm 中 apps 目录下应用库文件是黄色的,编辑器识别不到代码新增和修改; @@ -3184,22 +3204,22 @@ 5. apps 目录下颜色有些是黄色的6. 执行 env.sh 报错 $'\r':未找到命令¶ 出现这个问题你应该是在 windows 上打开或编辑过 env.sh 脚本,windows下的换行是回车符+换行符,也就是\r\n,而 Linxu 下是换行符 \n,Linux 下不识别 \r,因此报错。 解决方案: -# 将 \r 替换为空 -sudo sed -i 's/\r//' env.sh +# 将 \r 替换为空 +sudo sed -i 's/\r//' env.sh 7.怎样为单独某一条用例配置执行超时时间¶ 在用例脚本中添加装饰器,如下: -@pytest.mark.timeout(300) # 单位秒 -def test_xxx_001(): - pass +@pytest.mark.timeout(300) # 单位秒 +def test_xxx_001(): + pass 8. 如何拉取 YouQu 自动化项目所有代码,包含子仓库¶ 前置条件:已申请访问 YouQu 权限群组 -# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) -git config --global credential.helper store - -# 拉取YouQu框架代码,并递归拉取子仓库代码 -git clone "http://gerrit.uniontech.com/youqu" --recursive +# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) +git config --global credential.helper store + +# 拉取YouQu框架代码,并递归拉取子仓库代码 +git clone "http://gerrit.uniontech.com/youqu" --recursive 9. 如何拉取 YouQu 自动化项目中指定子仓库的代码¶ 前置条件: @@ -3207,22 +3227,22 @@ 9. 如何拉取 YouQu 自动化项目中指定子仓库的代 已申请访问 YouQu 权限群组 已存储访问密码 -# 拉取YouQu框架代码 -git clone "http://gerrit.uniontech.com/youqu" - -# 指定拉取子仓库代码 -cd youqu -git submodule update --init apps/autotest_xxx_xxx +# 拉取YouQu框架代码 +git clone "http://gerrit.uniontech.com/youqu" + +# 指定拉取子仓库代码 +cd youqu +git submodule update --init apps/autotest_xxx_xxx 10. 如何更新 YouQu 自动化项目中,所有子仓库的代码¶ 更新所有子仓库代码 -cd youqu -git pull & git submodule foreach git pull +cd youqu +git pull & git submodule foreach git pull 11. 如何修复 YouQu 所有子仓库 master 分支游离头(detached head)¶ 修复所有子仓库默认master 分支游离头 -cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
new
fix
将有趣的文档系统迁移到 linuxdeepin ,剥离文档中的图片资源,采用 CDN 加速方式加载;
CDN
尝试合入一个有趣的功能;
UI
Wayland
skipif
skipif_xdg_type
x11
wayland
skipif_cpu_name
cpu
skipif_cpu_name-KLVVW5821
只需要把 python3 替换成 youqu 就可以了,看起来很和谐~
4、新的文档地址
过去咱们 YouQu 的在线文档是部署在公司内网的,现在开源到 github 了,外部开发者肯定访问不到内网的文档,因此需要将文档部署到公网【公网文档】;
公网文档使用的是 github pages(白嫖怪一顿狂喜~~),但可能会出现文档速度慢的问题(代理下就好了),不过没关系,咱们【内网文档】仍然保留,文档内容一样,访问速度更快。
5、其他一些小小功能更新:
(1)新增关闭分辨率检测的参数值;
配置完成之后,直接在命令行执行 manage.py 就好了。
manage.py
youqu manage.py run @@ -1133,47 +1217,51 @@ 2.1.1. 配置文件2.1.2. 命令行参数¶ 通过命令行参数配置参数 以下为 youqu manage.py run 提供的一些参数选项: - -a APP, --app APP 应用名称:deepin-music 或 autotest_deepin_music 或 - apps/autotest_deepin_music - -k KEYWORDS, --keywords KEYWORDS - 用例的关键词,支持and/or/not逻辑组合 - -t TAGS, --tags TAGS 用例的标签,支持and/or/not逻辑组合 - --rerun RERUN 失败重跑次数 - --clean {yes,} 清理环境 - --report_formats REPORT_FORMATS - 测试报告格式 - --max_fail MAX_FAIL 最大失败率 - --log_level LOG_LEVEL - 日志输出级别 - --timeout TIMEOUT 单条用例超时时间 - --resolution RESOLUTION - 检查分辨率 - --debug DEBUG 调试模式 - --noskip {yes,} csv文件里面标记了skip跳过的用例不生效 - --ifixed {yes,} fixed不生效,仅通过skip跳过用例 - --send_pms {,async,finish} - 数据回填 - --task_id TASK_ID 测试单ID - --trigger {,auto,hand} - 触发者 - -f CASE_FILE, --case_file CASE_FILE - 根据文件执行用例 - --deb_path DEB_PATH 需要安装deb包的本地路径 - --pms_user PMS_USER pms 用户名 - --pms_password PMS_PASSWORD - pms 密码 - --suite_id SUITE_ID pms 测试套ID - --pms_info_file PMS_INFO_FILE - pms 信息文件 - --top TOP 过程中记录top命令中的值 - --lastfailed 仅执行上次失败用例 - --duringfail 测试过程中立即显示报错 - --repeat REPEAT 指定用例执行次数 - --project_name PROJECT_NAME - 工程名称(写入json文件) - --build_location BUILD_LOCATION - 构建地区(写入json文件) - --line LINE 执行的业务线(写入json文件) + -h, --help show this help message and exit + -a APP, --app APP 应用名称:deepin-music 或 autotest_deepin_music 或 + apps/autotest_deepin_music + -k KEYWORDS, --keywords KEYWORDS + 用例的关键词,支持and/or/not逻辑组合 + -t TAGS, --tags TAGS 用例的标签,支持and/or/not逻辑组合 + --rerun RERUN 失败重跑次数 + --record_failed_case RECORD_FAILED_CASE + 失败录屏从第几次失败开始录制视频 + --clean {yes,} 清理环境 + --report_formats REPORT_FORMATS + 测试报告格式 + --max_fail MAX_FAIL 最大失败率 + --log_level LOG_LEVEL + 日志输出级别 + --timeout TIMEOUT 单条用例超时时间 + --resolution RESOLUTION + 检查分辨率 + --debug DEBUG 调试模式 + --noskip {yes,} csv文件里面标记了skip跳过的用例不生效 + --ifixed {yes,} fixed不生效,仅通过skip跳过用例 + --send_pms {,async,finish} + 数据回填 + --task_id TASK_ID 测试单ID + --trigger {,auto,hand} + 触发者 + -f CASE_FILE, --case_file CASE_FILE + 根据文件执行用例 + --deb_path DEB_PATH 需要安装deb包的本地路径 + --pms_user PMS_USER pms 用户名 + --pms_password PMS_PASSWORD + pms 密码 + --suite_id SUITE_ID pms 测试套ID + --pms_info_file PMS_INFO_FILE + pms 信息文件 + --top TOP 过程中记录top命令中的值 + --lastfailed 仅执行上次失败用例 + --duringfail 测试过程中立即显示报错 + --repeat REPEAT 指定用例执行次数 + --project_name PROJECT_NAME + 工程名称(写入json文件) + --build_location BUILD_LOCATION + 构建地区(写入json文件) + --line LINE 执行的业务线(写入json文件) + --autostart AUTOSTART 用例执行程序注册到开机自启服务 在一些 CI 环境下使用命令行参数会更加方便: youqu manage.py run --app deepin-music --keywords "xxx" --tags "xxx" @@ -1181,8 +1269,13 @@ 2.1.2. 命令行参数2.2. 远程执行¶ +远程执行就是用本地作为服务端控制远程机器执行,远程机器执行的用例相同; +使用 remote 命令: youqu manage.py remote +2.2.1. 远程多机器分布式异步执行¶ + +多机器分布式异步执行就是由本地 YouQu 作为服务端,控制远程 N 台机器执行相同的用例,执行完之后所有测试机的测试结果会返回给服务端 report 目录下; 远程执行同样通过配置文件 setting/globalconfig.ini 进行用例相关配置; 需要重点说一下远程执行时的测试机信息配置,在配置文件 setting/remote.ini 里面配置测试机的用户名、IP、密码。 ;=============================== CLIENT LIST ===================================== @@ -1206,49 +1299,47 @@ 2.2. 远程执行user = uos ip = 10.8.11.xx -有多少台机器就像这样挨着写就行了。 +有多少台机器就像这样参考上面的格式写就行了。 然后在命令行: youqu manage.py remote 这样运行是从配置文件去读取相关配置。 如果你不想通过配置文件,你仍然通过命令行参数进行传参, 以下为 python3 manage.py remote 提供的一些参数选项: - -a APP, --app APP 应用名称:deepin-music 或 autotest_deepin_music 或 - apps/autotest_deepin_music - -c CLIENTS, --clients CLIENTS - 远程机器的user@ip:password,多个机器用'/'连接,如果password不传入,默认取 - setting/remote.ini 中 CLIENT_PASSWORD - 的值,比如:uos@10.8.13.33:1 或 uos@10.8.13.33 - -k KEYWORDS, --keywords KEYWORDS - 用例的关键词,支持and/or/not逻辑组合 - -t TAGS, --tags TAGS 用例的标签,支持and/or/not逻辑组合 - -s {yes,no,}, --send_code {yes,no,} - 发送代码到测试机(不含report目录) - -e, --build_env 搭建测试环境,如果为yes,不管send_code是否为yes都会发送代码到测试机. - -p CLIENT_PASSWORD, --client_password CLIENT_PASSWORD - 测试机密码(全局) - -y PARALLEL, --parallel PARALLEL - yes:表示所有测试机并行跑,执行相同的测试用例,no - :表示测试机分布式执行,服务端会根据收集到的测试用例自动分配给各个测试机执行。 - --rerun RERUN 失败重跑次数 - --clean {yes,} 清理环境 - --report_formats REPORT_FORMATS - 测试报告格式 - --log_level LOG_LEVEL - 日志输出级别 - --timeout TIMEOUT 单条用例超时时间 - --debug DEBUG 调试模式 - --noskip {yes,} csv文件里面标记了skip跳过的用例不生效 - --ifixed {yes,} fixed不生效,仅通过skip跳过用例 - --send_pms SEND_PMS 数据回填 - --task_id TASK_ID 测试单ID - --deb_path DEB_PATH 需要安装deb包的本地路径 + -h, --help show this help message and exit + -c CLIENTS, --clients CLIENTS + 远程机器的user@ip:password,多个机器用'/'连接,如果password不传入,默认取sett + ing/remote.ini中CLIENT_PASSWORD的值,比如: uos@10.8.13.33:1 + 或 uos@10.8.13.33 + -s, --send_code 发送代码到测试机(不含report目录) + -e, --build_env 搭建测试环境,如果为yes,不管send_code是否为yes都会发送代码到测试机. + -p CLIENT_PASSWORD, --client_password CLIENT_PASSWORD + 测试机密码(全局) + -y PARALLEL, --parallel PARALLEL + yes:表示所有测试机并行跑,执行相同的测试用例;no:表示测试机分布式执行,服务端会根据收集到的测试用例自 + 动分配给各个测试机执行。 +除了这些特有参数以外,它同样支持本地执行的所有参数; 在命令行这样运行: youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k "xxx" -t "xxx" 所有用例执行完之后会在 report 目录下回收各个测试机执行的测试报告。 +注意,如果远程机器没有搭建自动化测试环境,记得加上参数 -e : +youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k "xxx" -t "xxx" -e + +执行前确保远程机器已经开启了 ssh 服务,否则会提示无法连接,如果没有开启,请手动开启: +sudo systemctl restart ssh +sudo systemctl enable ssh + 配置文件其他相关配置项详细说明,请查看配置文件中的注释内容。 +2.2.2. 远程多机器分布式异步负载均衡执行¶ +多机器分布式异步负载均衡执行也是用本地作为服务端控制远程机器执行,但远程机器执行的用例不同,而是所有远程机器执行的用例之和,为你想要执行的用例集; +似乎有点难以理解,我用大白话举例描述下就是,服务端想要执行 10 条用例,现在远程机器有 5 台; +然后服务端就先拿着第 1 条用例给远程 1 号机执行,拿第 2 条用例给远程 2 号机执行...,如此循环直到所有用例执行完,这就是负载均衡执行。 + +使用方法和前面一样,只是需要增加一个参数: +youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k "xxx" -t "xxx" --parallel no + 2.3. PMS 数据回填¶ 测试单关联的用例,自动化测试对应的去跑这些关联的用例,并且将执行的结果回填的测试用例的状态里面。 PMS 数据回填主要有三种方式: @@ -1256,35 +1347,35 @@ 2.3. PMS 数据回填在用例执行的过程中,采用异步的方式去进行数据回填,直白的讲就是,第二条用例开始跑的时候,通过子线程去做第一条用例的数据回填,如此循环,直到所有用例执行结束; 这种方案的时间效率最高的,因为理论上用例的执行时间是大于数据回填的接口请求时间的,也就是说,当用例执行完之后,数据回填也完成了。 使用方法,在 globalconfig.ini 里面配置以下参数:(以下涉及到的参数配置都是在配置文件里面进行配置) -PMS_USER = PMS账号 -PMS_PASSWORD = PMS密码 -SEND_PMS = async -TASK_ID = 测试单ID -TRIGGER = auto -APP_NAME = 这个参数可填可不填,但是填了可以提高用例的执行速度,因为在用例收集阶段可以指定到具体的应用库。(下同) +PMS_USER = PMS账号 +PMS_PASSWORD = PMS密码 +SEND_PMS = async +TASK_ID = 测试单ID +TRIGGER = auto +APP_NAME = 这个参数可填可不填,但是填了可以提高用例的执行速度,因为在用例收集阶段可以指定到具体的应用库。(下同) (2)用例执行完之后回填 等所有用例执行完之后,再逐个进行回填的接口请求,此方案时间效率比较低。 使用方法: -PMS_USER = PMS账号 -PMS_PASSWORD = PMS密码 -SEND_PMS = finish -TASK_ID = 测试单ID -TRIGGER = auto -APP_NAME = +PMS_USER = PMS账号 +PMS_PASSWORD = PMS密码 +SEND_PMS = finish +TASK_ID = 测试单ID +TRIGGER = auto +APP_NAME = (3)手动回填 所有用例执行完之后不做回填的接口请求,后续手动将结果进行回填请求。 用例执行时配置: -PMS_USER = PMS账号 -PMS_PASSWORD = PMS密码 -SEND_PMS = finish -TASK_ID = 测试单ID -TRIGGER = hand -APP_NAME = +PMS_USER = PMS账号 +PMS_PASSWORD = PMS密码 +SEND_PMS = finish +TASK_ID = 测试单ID +TRIGGER = hand +APP_NAME = 后续手动回填方法: -youqu manage.py pms --send2task yes +youqu manage.py pms --send2task yes 可能遇到的问题¶ 由同学可能会发现,怎么回填一次之后,后面想再次回填就不生效了; @@ -1292,62 +1383,62 @@ 可能遇到的问题2.4. 导出 CSV 文件¶ 框架提供导出指定标签用例的功能: -youqu manage.py exportcsv -a deepin-album -t CICD +youqu manage.py exportcsv -a deepin-album -t CICD 表示导出 deepin-album 的用例中标记了 CICD 标签的用例,导出 CSV 文件的字段格式已经适配了 CICD 的要求。 2.5. 脚手架新建 APP 工程¶ 新建一个 APP 工程: -youqu manage.py startapp autotest_deepin_some +youqu manage.py startapp autotest_deepin_some 这样在 apps 目录下会创建一个子项目工程 autotest_deepin_some,同时新建好工程模板目录和模板文件: -apps -└── autotest_deepin_some - ├── case - │ ├── assert_res - │ │ └── readme - │ ├── base_case.py - │ └── __init__.py - ├── config.ini - ├── config.py - ├── conftest.py - ├── control - ├── deepin_some_assert.py - ├── deepin_some.csv - ├── __init__.py - └── widget - ├── base_widget.py - ├── case_res - │ └── readme - ├── deepin_some_widget.py - ├── __init__.py - ├── other.ini - ├── other_widget.py - ├── pic_res - │ └── readme - └── ui.ini +apps +└── autotest_deepin_some + ├── case + │ ├── assert_res + │ │ └── readme + │ ├── base_case.py + │ └── __init__.py + ├── config.ini + ├── config.py + ├── conftest.py + ├── control + ├── deepin_some_assert.py + ├── deepin_some.csv + ├── __init__.py + └── widget + ├── base_widget.py + ├── case_res + │ └── readme + ├── deepin_some_widget.py + ├── __init__.py + ├── other.ini + ├── other_widget.py + ├── pic_res + │ └── readme + └── ui.ini autotest_deepin_some 是你的工程名称,比如:autotest_deepin_music ; 在此基础上,你可以快速的开始你的 AT 项目。 2.6. 用例标签自动同步¶ 用于自动同步 PMS 用例标签数据至本地 CSV 文件,主要通过以下几个配置来控制: -APP_NAME = # 指定要同步的应用名称 -PMS_USER = # PMS的用户名 -PMS_PASSWORD = # PMS的密码 +APP_NAME = # 指定要同步的应用名称 +PMS_USER = # PMS的用户名 +PMS_PASSWORD = # PMS的密码 在 [csv_link_pms_id] 节点下指定 csv 文件名与 PMS 用例模块的对应关系,比如: -[csv_link_pms_id] -;同步PMS数据到本地CSV文件,必须要配置的配置项 -;key是本地CSV文件的文件名称; -;value是对应PMS上的模块ID; -;比如要同步音乐的数据, 首先需要将配置 APP_NAME = deepin-music, -;CSV文件名称为music.csv,其在PMS上的用例为: https://pms.uniontech.com/testcase-browse-53.html -;因此应该配置为: music = 53 -;这样才能将PMS与本地CSV文件建立联系。 -;如果你的应用分了很多模块,只需要将对应的信息依次配置好就行了。 -music = 53 +[csv_link_pms_id] +;同步PMS数据到本地CSV文件,必须要配置的配置项 +;key是本地CSV文件的文件名称; +;value是对应PMS上的模块ID; +;比如要同步音乐的数据, 首先需要将配置 APP_NAME = deepin-music, +;CSV文件名称为music.csv,其在PMS上的用例为: https://pms.uniontech.com/testcase-browse-53.html +;因此应该配置为: music = 53 +;这样才能将PMS与本地CSV文件建立联系。 +;如果你的应用分了很多模块,只需要将对应的信息依次配置好就行了。 +music = 53 将以上信息配置好之后,在命令行执行: -youqu manage.py pms --pms2csv yes +youqu manage.py pms --pms2csv yes 每次执行时原 csv 文件会自动备份在 report/csv_back 目录下,因此你不用担心脚本执行导致你的数据丢失。 diff --git a/search/search_index.json b/search/search_index.json index 91ebe84c..c7cfc7a2 100644 --- a/search/search_index.json +++ b/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\u200b\\u3000\\-\u3001\u3002\uff0c\uff0e\uff1f\uff01\uff1b]+","pipeline":["stemmer"]},"docs":[{"location":"","title":"\u9996\u9875","text":""},{"location":"#youqu","title":"\u6709\u8da3\uff08YouQu\uff09","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/4/1\n# Author : Mikigo\n# =============================================\n \u672c\u7ad9\u603b\u8bbf\u95ee\u91cf \u6b21 \u6b22\u8fce\u5728\u6d4f\u89c8\u5668\u8bbf\u95ee\u3010\u516c\u7f51\u6587\u6863\u3011 \u7edf\u4fe1\u516c\u53f8\u5185\u7f51\u8fd8\u53ef\u4ee5\u8bbf\u95ee\u3010\u5185\u7f51\u6587\u6863\u3011\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u54e6~~"},{"location":"#_1","title":"\u4e00\u3001\u7b80\u4ecb","text":"\u6709\u8da3\uff08YouQu\uff09\u662f\u6df1\u5ea6\u79d1\u6280\u8bbe\u8ba1\u548c\u5f00\u53d1\u7684\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff0c\u91c7\u7528\u7ed3\u6784\u5206\u5c42\u7684\u8bbe\u8ba1\u7406\u5ff5\uff0c\u652f\u6301\u591a\u5143\u5316\u5143\u7d20\u5b9a\u4f4d\u548c\u65ad\u8a00\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\u3001\u5f3a\u5927\u7684\u65e5\u5fd7\u548c\u62a5\u544a\u8f93\u51fa\u7b49\u7279\u8272\u529f\u80fd\uff0c\u540c\u65f6\u5b8c\u7f8e\u517c\u5bb9X11\u3001Wayland\u663e\u793a\u534f\u8bae\uff0c\u73af\u5883\u90e8\u7f72\u7b80\u5355\uff0c\u64cd\u4f5c\u6613\u4e0a\u624b\u3002"},{"location":"#17","title":"\u7231\u4e0a \u201c\u6709\u8da3\u201d \u7684 17 \u4e2a\u7406\u7531","text":" \u6838\u5fc3\u5e93\u63d0\u4f9b\u4e86\u7edf\u4e00\u7684\u63a5\u53e3\uff0c\u7f16\u5199\u65b9\u6cd5\u65f6\u53ea\u9700\u8981\u5bfc\u5165\u4e00\u4e2a\u5305\u5c31\u53ef\u4ee5\u4f7f\u7528\u5230\u6838\u5fc3\u5e93\u63d0\u4f9b\u7684\u6240\u6709\u529f\u80fd\uff1b \u516c\u5171\u5e93\u5c01\u88c5\u4e86\u5f88\u591a\u5e38\u7528\u6a21\u5757\u7684\u76f8\u5173\u65b9\u6cd5\uff0c\u6bd4\u5982\uff1a\u4efb\u52a1\u680f\u7684\u64cd\u4f5c\u3001\u684c\u9762\u7684\u64cd\u4f5c\u3001\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\u7b49\u7b49\uff1b \u9664\u4e86\u5e38\u7528\u7684\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u8bc6\u522b\u4ee5\u5916\uff0c\u6211\u4eec\u8fd8\u63d0\u4f9b\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u5176\u4f7f\u7528\u7b80\u5355\u4e14\u9ad8\u6548\uff0c\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff1b \u5bf9\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u5c06\u7f16\u5199\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u53d8\u5f97\u7b80\u5355\u800c\u4f18\u96c5\uff1b \u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u6280\u672f\u8fdb\u884c\u529f\u80fd\u5347\u7ea7\uff0c\u9664\u4e86\u652f\u6301\u5355\u4e2a\u5750\u6807\u8fd4\u56de\uff0c\u8fd8\u652f\u6301\u540c\u4e00\u754c\u9762\u4e0b\u591a\u4e2a\u76f8\u540c\u5143\u7d20\u8fd4\u56de\u591a\u4e2a\u5750\u6807\u7684\u529f\u80fd\uff1b \u63d0\u4f9b\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u548c\u6279\u91cf\u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u4e0d\u5230\u4e00\u4e2a csv \u6587\u4ef6\u539f\u6765\u80fd\u5e72\u8fd9\u4e48\u591a\u4e8b\u60c5\uff1b \u63d0\u4f9b\u4e86\u529f\u80fd\u5f3a\u5927\u7684\u6267\u884c\u5668\u5165\u53e3\uff0c\u8ba9\u4f60\u53ef\u4ee5\u65b9\u4fbf\u7684\u5728\u672c\u5730\u6267\u884c\u4efb\u4f55\u7528\u4f8b\u96c6\u7684\u7528\u4f8b\uff0c\u5176\u4e30\u5bcc\u7684\u81ea\u5b9a\u4e49\u914d\u7f6e\u9879\uff0c\u6ee1\u8db3\u4f60\u5bf9\u6267\u884c\u5668\u6240\u6709\u7684\u5e7b\u60f3\uff1b \u63d0\u4f9b\u8fdc\u7a0b\u6267\u884c\u7684\u529f\u80fd\uff0c\u53ef\u4ee5\u63a7\u5236\u591a\u53f0\u673a\u5668\u5e76\u884c\u8dd1\uff0c\u6216\u8005\u5206\u5e03\u5f0f\u8dd1\uff0c\u8fd9\u79cd\u4ed8\u8d39\u529f\u80fd\u73b0\u5728\u514d\u8d39\u7ed9\u4f60\u7528\uff1b \u63d0\u4f9b\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u529f\u80fd\uff0c\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u6bcf\u4e2a\u65b9\u6cd5\u5355\u72ec\u5199\u8f93\u51fa\u65e5\u5fd7\u7684\u4ee3\u7801\uff0c\u4e00\u5207\u6211\u4eec\u7ed9\u4f60\u641e\u5b9a\u4e86\uff0c\u65e5\u5fd7\u8f93\u51fa\u4e0d\u4ec5\u5185\u5bb9\u4e30\u5bcc\uff0c\u989c\u503c\u4e5f\u7edd\u5bf9\u5728\u7ebf\uff0c\u6211\u4eec\u8fd8\u81ea\u5df1\u8bbe\u8ba1\u4e86\u4e00\u6b3e\u7ec8\u7aef\u8f93\u51fa\u4e3b\u9898\u53eb\u300a\u4e94\u5f69\u6591\u6593\u7684\u9ed1\u300b\uff1b \u63d0\u4f9b\u4e86\u4e00\u952e\u90e8\u7f72\u81ea\u52a8\u5316\u6d4b\u8bd5\u73af\u5883\u7684\u529f\u80fd\uff0c\u8fde\u4ee3\u7801\u7f16\u8f91\u5668\u90fd\u7ed9\u4f60\u88c5\u597d\u4e86\uff0c\u8ba9\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u73af\u5883\u90e8\u7f72\u800c\u70e6\u607c\uff1b \u63d0\u4f9b\u4e86\u81ea\u52a8\u751f\u6210\u591a\u79cd\u62a5\u544a\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u8f93\u51fa\u4ec0\u4e48\u62a5\u544a\u5f62\u5f0f\u90fd\u884c\uff0c\u800c\u4e14\u6211\u4eec\u5728\u62a5\u544a\u4e2d\u8fd8\u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\u548c\u5931\u8d25\u622a\u56fe\u7684\u529f\u80fd\uff1b \u5bf9\u65ad\u8a00\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u63d0\u4f9b\u66f4\u53cb\u597d\u5316\u7684\u9519\u8bef\u63d0\u793a\uff0c\u8ba9\u5b9a\u4f4d\u95ee\u9898\u7cbe\u51c6\u9ad8\u6548\uff1b \u4e0d\u4ec5\u652f\u6301\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u63a7\u5236\uff0c\u800c\u4e14\u8fd8\u652f\u6301\u52a8\u6001\u63a7\u5236\u7528\u4f8b\u6279\u91cf\u6267\u884c\u7684\u603b\u65f6\u95f4\uff0c\u786e\u4fdd CI \u73af\u5883\u4e0b\u80fd\u987a\u7545\u8fd0\u884c\uff1b \u652f\u6301\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\u6267\u884c\u3001PMS \u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6807\u7b7e\u5316\u6267\u884c\u65b9\u6848\uff0c\u6ee1\u8db3\u4f60\u5404\u79cd\u573a\u666f\u4e0b\u7684\u6267\u884c\u9700\u6c42\uff1b \u652f\u6301\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u529f\u80fd\uff0c\u53ef\u5b9a\u4f4d\u53ef\u65ad\u8a00\uff0c\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\uff1b \u5b8c\u7f8e\u517c\u5bb9 Wayland \u548c X11\uff0c\u771f\u6b63\u505a\u5230\u4e00\u5957\u4ee3\u7801\uff0c\u968f\u5904\u6267\u884c\uff1b \u652f\u6301\u591a\u79cd\u65b9\u5f0f\u7684\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u5176\u4e2d\u5f02\u6b65\u56de\u586b\u7684\u65b9\u6848\uff0c\u5b8c\u7f8e\u89e3\u51b3\u4e86\u6570\u636e\u56de\u586b\u7684\u8017\u65f6\u95ee\u9898\uff1b \u3010\u89c6\u9891\u4ecb\u7ecd\u3011"},{"location":"#_2","title":"\u4e8c\u3001\u5b89\u88c5\u4f7f\u7528","text":"\u57fa\u7840\u6846\u67b6\uff1ahttps://github.com/linuxdeepin/deepin-autotest-framework \u4ece PyPI \u5b89\u88c5: sudo pip3 install youqu\n \u521b\u5efa\u9879\u76ee: youqu-startproject youqu\n \u5b89\u88c5\u4f9d\u8d56: cd youqu\nbash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002 \u5e94\u7528\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684\u5e94\u7528\u540d\u79f0\u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music cd apps/\n \u5c06\u5e94\u7528\u5e93\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u50cf\u8fd9\u6837\uff1a youqu\n\u251c\u2500\u2500 apps\n\u2502 \u251c\u2500\u2500 autotest_deepin_music # \u5e94\u7528\u5e93\n...\n \u5e94\u7528\u5e93\u7684\u540d\u79f0\u4e0d\u53ef\u4ee5\u4fee\u6539\u3002"},{"location":"#_3","title":"\u4e09\u3001\u8fd0\u884c","text":""},{"location":"#1","title":"1. \u5de5\u4f5c\u7a7a\u95f4","text":"\u57fa\u7840\u6846\u67b6\u5de5\u7a0b\u76ee\u5f55\u5efa\u8bae\u653e\u5728 ~ \u76ee\u5f55\u4e0b\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u4e5f\u53ef\u4ee5\u8fd0\u884c\uff0c\u4f46\u662f\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u9700\u8981\u505a\u73af\u5883\u6e05\u7406\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u5b58\u5728\u4ee3\u7801\u88ab\u5220\u9664\u7684\u98ce\u9669\u3002 \u5982\u679c\u4f60\u7684\u673a\u5668\u4e0a\u4e0d\u540c\u76ee\u5f55\u4e0b\u5b58\u5728\u591a\u4e2a YouQu \u5de5\u7a0b\uff0c\u90a3\u4e48\u5728\u8fd0\u884c\u4e4b\u524d\uff0c\u8bf7\u5148\u6267\u884c env.sh \u6821\u6b63\u76f8\u5173\u73af\u5883\u3002"},{"location":"#2","title":"2. \u6267\u884c\u5668","text":"\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u6709\u4e00\u4e2a manage.py \uff0c\u5b83\u662f\u4e00\u4e2a\u6267\u884c\u5668\u5165\u53e3\uff0c\u63d0\u4f9b\u4e86\u672c\u5730\u6267\u884c\u3001\u8fdc\u7a0b\u6267\u884c\u7b49\u7684\u529f\u80fd\u3002 \u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6765\u6267\u884c\uff1a youqu manage.py run -a deepin-music\n"},{"location":"#21","title":"2.1. \u672c\u5730\u6267\u884c","text":"youqu manage.py run\n"},{"location":"#211","title":"2.1.1. \u914d\u7f6e\u6587\u4ef6","text":"\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u914d\u7f6e\u53c2\u6570 \u5728\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u91cc\u9762\u652f\u6301\u914d\u7f6e\u5bf9\u6267\u884c\u7684\u4e00\u4e9b\u53c2\u6570\u8fdb\u884c\u914d\u7f6e\uff0c\u5e38\u7528\u7684\u5982\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;1\u3001KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2\u3001KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f, e.g. TAGS = L1 or smoke\n;\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\uff0c\u5c06\u8981\u6267\u884c\u7684\u7528\u4f8b\u5199\u5165\u6307\u5b9a\u7684 csv \u6587\u4ef6\n;\u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u4ece\u57fa\u7840\u6846\u67b6\u6839\u76ee\u5f55\u5f00\u59cb\uff1ae.g. CASE_FILE = case_list.txt\n;\u5982\u679c\u8fd9\u91cc\u6709\u503c\uff0cAPP_NAME KEYWORDS TAGS \u7684\u914d\u7f6e\u5747\u4e0d\u751f\u6548\nCASE_FILE =\n;=============================== RUNNER CONFIG ===================================\n[runner]\n;\u6700\u5927\u5931\u8d25\u7528\u4f8b\u6570\u91cf\u7684\u5360\u6bd4\n;\u6bd4\u5982\uff1a\u603b\u6267\u884c\u7528\u4f8b\u6570\u4e3a100, \u82e5 MAX_FAIL = 0.5,\u5219\u5931\u8d25\u7528\u4f8b\u6570\u8fbe\u523050\u5c31\u4f1a\u7ec8\u6b62\u6d4b\u8bd5\u3002\nMAX_FAIL = 0.5\n;\u5355\u6761\u7528\u4f8b\u7684\u8d85\u65f6\u65f6\u95f4\uff0c\u5982\u679c\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u8d85\u65f6\uff0c\u8fd9\u6761\u7528\u4f8b\u4f1a\u88ab\u505c\u6b62\uff0c\u540e\u7eed\u7528\u4f8b\u7ee7\u7eed\u6267\u884c\u3002\n;\u5355\u4f4d\u4e3a\u79d2\n; \u8fd9\u662f\u4e00\u4e2a\u5168\u5c40\u7edf\u4e00\u914d\u7f6e\uff0c\u5982\u679c\u67d0\u6761\u7528\u4f8b\u9700\u8981\u5355\u72ec\u914d\u7f6e\u8d85\u65f6\u65f6\u95f4\uff0c\u53ef\u4ee5\u5728\u7528\u4f8b\u4e2d\u8fd9\u6837\u5199\uff1a\n;@pytest.mark.timeout(500)\n;def test_xxx_001():\n; ...\n;\u4f1a\u8bdd\uff08\u6240\u6709\u7528\u4f8b\u6267\u884c\u7684\uff09\u8d85\u65f6\u662f\u6839\u636e\u5168\u5c40\u8d85\u65f6\u914d\u7f6e\u548c\u7528\u4f8b\u5355\u72ec\u8d85\u65f6\u914d\u7f6e\u81ea\u52a8\u8ba1\u7b97\u7684\uff1b\nCASE_TIME_OUT = 200\n;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\u3002\n;\u6ce8\u610f\uff0c\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u4e0d\u80fd\u5c0f\u4e8e\u5931\u8d25\u5f55\u5c4f\u6b21\u6570\uff0c\u5373 RERUN >= RECORD_FAILED_CASE\nRECORD_FAILED_CASE = 1\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = INFO\n;yes \u6bcf\u6761\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u8fdb\u884c\u73af\u5883\u6e05\u7406\nCLEAN_ALL = yes\n;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\nRESOLUTION = 1920x1080\n;\u4e0d\u8df3\u8fc7\u7528\u4f8b\uff0ccsv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86 skip-xxx\u7684\u7528\u4f8b\u4e0d\u8df3\u8fc7\nNOSKIP = no\n;ignore fixed\n;no\uff0c\u53ea\u8981\u6807\u8bb0\u4e86fixed\u7684\u7528\u4f8b\uff0c\u5373\u4f7f\u6807\u8bb0\u4e86skip-\uff0c\u4e5f\u4f1a\u6267\u884c\uff1b\n;yes\uff0cfixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\uff1b\nIFIXED = no\n;\u8981\u5b89\u88c5deb\u5305\u7684\u8def\u5f84\n;e.g : ~/Downloads/ \u5b89\u88c5\u4e0b\u8f7d\u76ee\u5f55\u4e0b\u7684deb\u5305\uff0c\u5982\u679c\u662f\u8fdc\u7a0b\u6267\u884c\uff0c\u4f1a\u81ea\u52a8\u62f7\u8d1d\u5230\u8fdc\u7a0b\u5e76\u5b89\u88c5\u3002\nDEB_PATH =\n;DEBUG \u6a21\u5f0f\u6267\u884c\u7528\u4f8b\uff0c\u53ea\u6536\u96c6\u4e0d\u6267\u884c\u7528\u4f8b\uff0c\u4e5f\u4e0d\u505a\u8bbe\u5907\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002\nDEBUG = no\n;\u8bb0\u5f55top\u547d\u4ee4\u67e5\u8be2\u7684\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0cTOP = 3 \u8868\u793a\u8bb0\u5f55\u524d3\u4e2a\u8fdb\u7a0b\u3002\nTOP =\n;\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\nREPEAT =\n;\u9ed8\u8ba4\u5728\u6240\u6709\u6d4b\u8bd5\u5b8c\u6210\u4e4b\u540e\u8f93\u51fa\u62a5\u9519\u4fe1\u606f.\n;yes, \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\nDURING_FAIL = no\n;=============================== REPORT CONFIG ===================================\n[report]\n;\u7528\u4f8b\u6267\u884c\u5b8c\u540e\u751f\u6210\u7684\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n;\u76ee\u524d\u652f\u6301 allure, xml, json \uff08\u652f\u6301\u540c\u65f6\u751f\u6210\uff09\nREPORT_FORMAT = allure, xml, json\n;\u6307\u5b9a\u62a5\u544a\u751f\u6210\u7684\u8def\u5f84\uff08\u76f8\u5bf9\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\uff09\nALLURE_REPORT_PATH = report/\nXML_REPORT_PATH = report/\nJSON_REPORT_PATH = report/\n;=============================== GLOBAL CONFIG ===================================\n[globalconfig]\n;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\nPASSWORD = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\nIMAGE_MATCH_NUMBER = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6bcf\u6b21\u95f4\u9694\u7b49\u5f85\u65f6\u95f4\nIMAGE_MATCH_WAIT_TIME = 1\n;\u56fe\u50cf\u8bc6\u522b\u5339\u914d\u5ea6\nIMAGE_RATE = 0.9\n;\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u5b9e\u65f6\u56fe\u50cf\u4fdd\u5b58\u8def\u5f84\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u5750\u6807\nSCREEN_CACHE = /tmp/screen.png\n;\u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\u7684\u8def\u5f84\nTMPDIR = /tmp/tmpdir\n;\u7cfb\u7edf\u4e3b\u9898\nSYS_THEME = deepin\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = http://youqu-dev.uniontech.com:8890\n;OpenCV\u670d\u52a1\u7aef\u5730\u5740\nOPENCV_SERVER_HOST = http://youqu-dev.uniontech.com:8889\n;=============================== PMS CONFIG ===================================\n;PMS\u76f8\u5173\u914d\u7f6e\uff0c\u5305\u542b\u4ee5\u4e0b\u51e0\u4e2a\u65b9\u9762\uff1a\n;1.PMS\u6d4b\u8bd5\u5957\u6267\u884c\n;2.\u81ea\u52a8\u4ecePMS\u722c\u53d6\u6570\u636e\u5e76\u540c\u6b65\u672c\u5730CSV\u6587\u4ef6\n;3.PMS\u6570\u636e\u56de\u586b\n[pms]\n;PMS\u7684\u7528\u6237\u540d: ut001234\nPMS_USER =\n;PMS\u7684\u5bc6\u7801\nPMS_PASSWORD =\n;PMS\u6d4b\u8bd5\u5957\u7684ID\n;\u5728PMS\u4e0a\u67e5\u770b\u7528\u4f8b\u201c\u5957\u4ef6\u201d\u94fe\u63a5: https://pms.uniontech.com/testsuite-view-495.html\n;\u6d4b\u8bd5\u5957ID\u4e3a: 495\nSUITE_ID =\n;\u6570\u636e\u56de\u586b\u5fc5\u987b\u5173\u8054PMS\u6d4b\u8bd5\u5355\n;\u5728PMS\u4e0a\u67e5\u770b\u6d4b\u8bd5\u5355\u94fe\u63a5: https://pms.uniontech.com/testtask-cases-20747.html\n;\u6d4b\u8bd5\u5355ID\u4e3a: 20747\nTASK_ID =\n;\u5c06\u6d4b\u8bd5\u7ed3\u679c\u6570\u636e\u56de\u586b\u5230PMS\n;\u4e3a\u7a7a: \u8868\u793a\u4e0d\u56de\u586b,\u4e0d\u4f1a\u5728\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u751f\u6210json\u7ed3\u679c\u6587\u4ef6;\n;async: \u8868\u793a\u9010\u6761\u5f02\u6b65\u56de\u586b,\u540e\u9762\u4e00\u6761\u6267\u884c\u5f00\u59cb\u65f6\u901a\u8fc7\u5b50\u7ebf\u7a0b\u5bf9\u524d\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u8fdb\u884c\u56de\u586b\uff0c\u5982\u6b64\u5b9e\u73b0\u65f6\u95f4\u6548\u7387\u6700\u5927\u5316;\n;finish: \u8868\u793a\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u6210\u4e4b\u540e\u9010\u4e2a\u56de\u586b(PMS\u4e0d\u652f\u6301\u5e76\u53d1);\nSEND_PMS =\n;\u6570\u636e\u56de\u586b\u7684\u89e6\u53d1\u8005\n;auto: \u6846\u67b6\u81ea\u52a8\u56de\u586b,\u914d\u5408SEND_PMS\u914d\u7f6e\u4f7f\u7528,\u4f60\u53ef\u4ee5\u9009\u62e9\u5728\u4e0d\u540c\u7684\u9636\u6bb5\u8fdb\u884c\u6570\u636e\u56de\u586b;\n;hand: \u624b\u52a8\u56de\u586b,\u6bcf\u6761\u7528\u4f8b\u4ecd\u7136\u4f1a\u751f\u6210json\u6587\u4ef6,\u4f46\u6846\u67b6\u4e0d\u4f1a\u8fdb\u884c\u6570\u636e\u56de\u586b,\u9700\u8981\u4f60\u53ef\u4ee5\u5728\u4f60\u60f3\u8981\u53d1\u9001\u7684\u65f6\u95f4\u70b9\u624b\u52a8\u89e6\u53d1\u56de\u586b;\nTRIGGER = auto\n;PMS\u56de\u586b\u7684\u91cd\u8bd5\u6b21\u6570\n;\u5982\u679c\u63a5\u53e3\u8bf7\u6c42\u5931\u8d25,\u4f1a\u8fdb\u884c\u91cd\u8bd5\nSEND_PMS_RETRY_NUMBER = 2\n[csv_link_pms_lib]\n;caselib: \u7528\u4f8b\u5e93\n;testcase: \u4ea7\u54c1\u5e93\u7528\u4f8b\nCASE_FROM = caselib\n[csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/caselib-browse-81.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 81\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic =\n[export_csv]\n;\u5bfc\u51fa\u7684csv\u6587\u4ef6\u540d\u79f0\uff0c\u9ed8\u8ba4 case_list.csv\nCSV_FILE = case_list.csv\n;exportcsv \u547d\u4ee4\u5bfc\u51fa case_list.csv \u6587\u4ef6\u65f6\u914d\u7f6e\u7684\u5b57\u6bb5\u540d\uff0c\u7528\u4f8b\u540d\u79f0\u9ed8\u8ba4\u5b58\u5728\u7b2c\u4e00\u5217\uff0c\u65e0\u9700\u6dfb\u52a0\nCSV_HEARD = \u7528\u4f8b\u7ea7\u522b,\u7528\u4f8b\u7c7b\u578b,\u6d4b\u8bd5\u7ea7\u522b,\u662f\u5426\u8df3\u8fc7\n \u914d\u7f6e\u5b8c\u6210\u4e4b\u540e\uff0c\u76f4\u63a5\u5728\u547d\u4ee4\u884c\u6267\u884c manage.py \u5c31\u597d\u4e86\u3002 youqu manage.py run\n"},{"location":"#212","title":"2.1.2. \u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a youqu manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--max_fail MAX_FAIL \u6700\u5927\u5931\u8d25\u7387\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--resolution RESOLUTION\n\u68c0\u67e5\u5206\u8fa8\u7387\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms {,async,finish}\n\u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--trigger {,auto,hand}\n\u89e6\u53d1\u8005\n-f CASE_FILE, --case_file CASE_FILE\n\u6839\u636e\u6587\u4ef6\u6267\u884c\u7528\u4f8b\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n--pms_user PMS_USER pms \u7528\u6237\u540d\n--pms_password PMS_PASSWORD\npms \u5bc6\u7801\n--suite_id SUITE_ID pms \u6d4b\u8bd5\u5957ID\n--pms_info_file PMS_INFO_FILE\npms \u4fe1\u606f\u6587\u4ef6\n--top TOP \u8fc7\u7a0b\u4e2d\u8bb0\u5f55top\u547d\u4ee4\u4e2d\u7684\u503c\n--lastfailed \u4ec5\u6267\u884c\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\n--duringfail \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\n--repeat REPEAT \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n--project_name PROJECT_NAME\n\u5de5\u7a0b\u540d\u79f0\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--build_location BUILD_LOCATION\n\u6784\u5efa\u5730\u533a\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--line LINE \u6267\u884c\u7684\u4e1a\u52a1\u7ebf\uff08\u5199\u5165json\u6587\u4ef6\uff09\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a youqu manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\"\n \u547d\u4ee4\u884c\u53c2\u6570\u4f18\u5148\u7ea7\u662f\u9ad8\u4e8e\u914d\u7f6e\u6587\u4ef6\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u4e86\u5bf9\u5e94\u7684\u53c2\u6570\uff0c\u914d\u7f6e\u6587\u4ef6\u4e2d\u4e0d\u7ba1\u662f\u5426\u914d\u7f6e\u5747\u4e0d\u751f\u6548\u3002 --app \u5165\u53c2\u8fd8\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\uff0c\u4e0b\u9762\u7684\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u540c\u6837\u652f\u6301\u3002"},{"location":"#22","title":"2.2. \u8fdc\u7a0b\u6267\u884c","text":"youqu manage.py remote\n \u8fdc\u7a0b\u6267\u884c\u540c\u6837\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u8fdb\u884c\u7528\u4f8b\u76f8\u5173\u914d\u7f6e\uff1b \u9700\u8981\u91cd\u70b9\u8bf4\u4e00\u4e0b\u8fdc\u7a0b\u6267\u884c\u65f6\u7684\u6d4b\u8bd5\u673a\u4fe1\u606f\u914d\u7f6e\uff0c\u5728\u914d\u7f6e\u6587\u4ef6 setting/remote.ini \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\u3001IP\u3001\u5bc6\u7801\u3002 ;=============================== CLIENT LIST =====================================\n; \u6d4b\u8bd5\u673a\u914d\u7f6e\u5217\u8868\n;[client{number}] ;\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u6709\u591a\u5c11\u53f0\u6d4b\u8bd5\u673a\u5c31\u5199\u591a\u5c11\u4e2a client\uff0c\u522b\u540d\u5fc5\u987b\u5305\u542b client \u5b57\u7b26\uff0c\u4e14\u4e0d\u80fd\u91cd\u590d\u3002\n;user = ;\u6d4b\u8bd5\u673a user\n;ip = ;\u6d4b\u8bd5\u673a ip\n;password = 1 ;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801, \u53ef\u4ee5\u4e0d\u914d\u7f6e\u6b64\u9879\uff0c\u9ed8\u8ba4\u53d6 CLIENT_PASSWORD \u7684\u503c\uff1b\n;\u5982\u679c\u4f60\u6240\u6709\u6d4b\u8bd5\u673a\u5bc6\u7801\u90fd\u76f8\u540c\uff0c\u90a3\u4e48\u53ea\u9700\u8981\u914d\u7f6e CLIENT_PASSWORD \u5c31\u53ef\u4ee5\u4e86\n;=================================================================================\n[client1]\nuser = uos\nip = 10.8.15.xx\n[client2]\nuser = uos\nip = 10.8.15.xx\n[client3]\nuser = uos\nip = 10.8.11.xx\n \u6709\u591a\u5c11\u53f0\u673a\u5668\u5c31\u50cf\u8fd9\u6837\u6328\u7740\u5199\u5c31\u884c\u4e86\u3002 \u7136\u540e\u5728\u547d\u4ee4\u884c\uff1a youqu manage.py remote\n \u8fd9\u6837\u8fd0\u884c\u662f\u4ece\u914d\u7f6e\u6587\u4ef6\u53bb\u8bfb\u53d6\u76f8\u5173\u914d\u7f6e\u3002 \u5982\u679c\u4f60\u4e0d\u60f3\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\uff0c\u4f60\u4ecd\u7136\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u8fdb\u884c\u4f20\u53c2\uff0c \u4ee5\u4e0b\u4e3a python3 manage.py remote \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-c CLIENTS, --clients CLIENTS\n\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679cpassword\u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6\nsetting/remote.ini \u4e2d CLIENT_PASSWORD\n\u7684\u503c,\u6bd4\u5982\uff1auos@10.8.13.33:1 \u6216 uos@10.8.13.33\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-s {yes,no,}, --send_code {yes,no,}\n\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a\uff08\u4e0d\u542breport\u76ee\u5f55\uff09\n-e, --build_env \u642d\u5efa\u6d4b\u8bd5\u73af\u5883,\u5982\u679c\u4e3ayes\uff0c\u4e0d\u7ba1send_code\u662f\u5426\u4e3ayes\u90fd\u4f1a\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a.\n-p CLIENT_PASSWORD, --client_password CLIENT_PASSWORD\n\u6d4b\u8bd5\u673a\u5bc6\u7801\uff08\u5168\u5c40\uff09\n-y PARALLEL, --parallel PARALLEL\nyes:\u8868\u793a\u6240\u6709\u6d4b\u8bd5\u673a\u5e76\u884c\u8dd1\uff0c\u6267\u884c\u76f8\u540c\u7684\u6d4b\u8bd5\u7528\u4f8b\uff0cno\n:\u8868\u793a\u6d4b\u8bd5\u673a\u5206\u5e03\u5f0f\u6267\u884c\uff0c\u670d\u52a1\u7aef\u4f1a\u6839\u636e\u6536\u96c6\u5230\u7684\u6d4b\u8bd5\u7528\u4f8b\u81ea\u52a8\u5206\u914d\u7ed9\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u3002\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms SEND_PMS \u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n \u5728\u547d\u4ee4\u884c\u8fd9\u6837\u8fd0\u884c\uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\"\n \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report \u76ee\u5f55\u4e0b\u56de\u6536\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u7684\u6d4b\u8bd5\u62a5\u544a\u3002 \u914d\u7f6e\u6587\u4ef6\u5176\u4ed6\u76f8\u5173\u914d\u7f6e\u9879\u8be6\u7ec6\u8bf4\u660e\uff0c\u8bf7\u67e5\u770b\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u6ce8\u91ca\u5185\u5bb9\u3002"},{"location":"#23-pms","title":"2.3. PMS \u6570\u636e\u56de\u586b","text":"\u6d4b\u8bd5\u5355\u5173\u8054\u7684\u7528\u4f8b\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u5bf9\u5e94\u7684\u53bb\u8dd1\u8fd9\u4e9b\u5173\u8054\u7684\u7528\u4f8b\uff0c\u5e76\u4e14\u5c06\u6267\u884c\u7684\u7ed3\u679c\u56de\u586b\u7684\u6d4b\u8bd5\u7528\u4f8b\u7684\u72b6\u6001\u91cc\u9762\u3002 PMS \u6570\u636e\u56de\u586b\u4e3b\u8981\u6709\u4e09\u79cd\u65b9\u5f0f\uff1a \uff081\uff09\u5f02\u6b65\u56de\u586b \u5728\u7528\u4f8b\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\uff0c\u91c7\u7528\u5f02\u6b65\u7684\u65b9\u5f0f\u53bb\u8fdb\u884c\u6570\u636e\u56de\u586b\uff0c\u76f4\u767d\u7684\u8bb2\u5c31\u662f\uff0c\u7b2c\u4e8c\u6761\u7528\u4f8b\u5f00\u59cb\u8dd1\u7684\u65f6\u5019\uff0c\u901a\u8fc7\u5b50\u7ebf\u7a0b\u53bb\u505a\u7b2c\u4e00\u6761\u7528\u4f8b\u7684\u6570\u636e\u56de\u586b\uff0c\u5982\u6b64\u5faa\u73af\uff0c\u76f4\u5230\u6240\u6709\u7528\u4f8b\u6267\u884c\u7ed3\u675f\uff1b \u8fd9\u79cd\u65b9\u6848\u7684\u65f6\u95f4\u6548\u7387\u6700\u9ad8\u7684\uff0c\u56e0\u4e3a\u7406\u8bba\u4e0a\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u662f\u5927\u4e8e\u6570\u636e\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\u65f6\u95f4\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u5f53\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u6570\u636e\u56de\u586b\u4e5f\u5b8c\u6210\u4e86\u3002 \u4f7f\u7528\u65b9\u6cd5\uff0c\u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u4ee5\u4e0b\u53c2\u6570\uff1a\uff08\u4ee5\u4e0b\u6d89\u53ca\u5230\u7684\u53c2\u6570\u914d\u7f6e\u90fd\u662f\u5728\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u914d\u7f6e\uff09 PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = async\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \u8fd9\u4e2a\u53c2\u6570\u53ef\u586b\u53ef\u4e0d\u586b\uff0c\u4f46\u662f\u586b\u4e86\u53ef\u4ee5\u63d0\u9ad8\u7528\u4f8b\u7684\u6267\u884c\u901f\u5ea6\uff0c\u56e0\u4e3a\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u53ef\u4ee5\u6307\u5b9a\u5230\u5177\u4f53\u7684\u5e94\u7528\u5e93\u3002\uff08\u4e0b\u540c\uff09\n \uff082\uff09\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u56de\u586b \u7b49\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u518d\u9010\u4e2a\u8fdb\u884c\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u6b64\u65b9\u6848\u65f6\u95f4\u6548\u7387\u6bd4\u8f83\u4f4e\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \uff083\uff09\u624b\u52a8\u56de\u586b \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4e0d\u505a\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u540e\u7eed\u624b\u52a8\u5c06\u7ed3\u679c\u8fdb\u884c\u56de\u586b\u8bf7\u6c42\u3002 \u7528\u4f8b\u6267\u884c\u65f6\u914d\u7f6e\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = hand\nAPP_NAME = \u540e\u7eed\u624b\u52a8\u56de\u586b\u65b9\u6cd5\uff1a youqu manage.py pms --send2task yes\n"},{"location":"#_4","title":"\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898","text":"\u7531\u540c\u5b66\u53ef\u80fd\u4f1a\u53d1\u73b0\uff0c\u600e\u4e48\u56de\u586b\u4e00\u6b21\u4e4b\u540e\uff0c\u540e\u9762\u60f3\u518d\u6b21\u56de\u586b\u5c31\u4e0d\u751f\u6548\u4e86\uff1b \u8fd9\u662f\u56e0\u4e3a\u4e3a\u4e86\u5e94\u5bf9\u524d\u9762\u63d0\u5230\u7684\u591a\u79cd\u6570\u636e\u56de\u586b\u7684\u65b9\u5f0f\uff0c\u5728 report \u76ee\u5f55\u4e0b\u4f1a\u7531 pms_xxx \u5f00\u5934\u7684\u76ee\u5f55\uff0c\u8bb0\u5f55\u4e86\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u548c\u56de\u586b\u60c5\u51b5\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u4e4b\u524d\u5df2\u7ecf\u56de\u586b\u8fc7\u4e86\uff0c\u540e\u7eed\u5c31\u4e0d\u4f1a\u518d\u6b64\u89e6\u53d1\u56de\u586b\u4e86\uff1b \u5982\u679c\u4f60\u60f3\u91cd\u65b0\u505a\u56de\u586b\uff0c\u4f60\u53ef\u4ee5\u628a report/pms_xxx \u76ee\u5f55\u5220\u6389\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u91cd\u65b0\u505a\u6570\u636e\u56de\u586b\u4e86\uff1b"},{"location":"#24-csv","title":"2.4. \u5bfc\u51fa CSV \u6587\u4ef6","text":"\u6846\u67b6\u63d0\u4f9b\u5bfc\u51fa\u6307\u5b9a\u6807\u7b7e\u7528\u4f8b\u7684\u529f\u80fd\uff1a youqu manage.py exportcsv -a deepin-album -t CICD\n \u8868\u793a\u5bfc\u51fa deepin-album \u7684\u7528\u4f8b\u4e2d\u6807\u8bb0\u4e86 CICD \u6807\u7b7e\u7684\u7528\u4f8b\uff0c\u5bfc\u51fa CSV \u6587\u4ef6\u7684\u5b57\u6bb5\u683c\u5f0f\u5df2\u7ecf\u9002\u914d\u4e86 CICD \u7684\u8981\u6c42\u3002"},{"location":"#25-app","title":"2.5. \u811a\u624b\u67b6\u65b0\u5efa APP \u5de5\u7a0b","text":"\u65b0\u5efa\u4e00\u4e2a APP \u5de5\u7a0b\uff1a youqu manage.py startapp autotest_deepin_some \u8fd9\u6837\u5728 apps \u76ee\u5f55\u4e0b\u4f1a\u521b\u5efa\u4e00\u4e2a\u5b50\u9879\u76ee\u5de5\u7a0b autotest_deepin_some\uff0c\u540c\u65f6\u65b0\u5efa\u597d\u5de5\u7a0b\u6a21\u677f\u76ee\u5f55\u548c\u6a21\u677f\u6587\u4ef6\uff1a apps\n\u2514\u2500\u2500 autotest_deepin_some\n \u00a0\u00a0 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_case.py\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 config.ini\n \u00a0\u00a0 \u251c\u2500\u2500 config.py\n \u00a0\u00a0 \u251c\u2500\u2500 conftest.py\n \u00a0\u00a0 \u251c\u2500\u2500 control\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_assert.py\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some.csv\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u2514\u2500\u2500 widget\n \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 case_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 other.ini\n \u00a0\u00a0 \u251c\u2500\u2500 other_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 pic_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2514\u2500\u2500 ui.ini\n autotest_deepin_some \u662f\u4f60\u7684\u5de5\u7a0b\u540d\u79f0\uff0c\u6bd4\u5982\uff1aautotest_deepin_music \uff1b \u5728\u6b64\u57fa\u7840\u4e0a\uff0c\u4f60\u53ef\u4ee5\u5feb\u901f\u7684\u5f00\u59cb\u4f60\u7684 AT \u9879\u76ee\u3002"},{"location":"#26","title":"2.6. \u7528\u4f8b\u6807\u7b7e\u81ea\u52a8\u540c\u6b65","text":"\u7528\u4e8e\u81ea\u52a8\u540c\u6b65 PMS \u7528\u4f8b\u6807\u7b7e\u6570\u636e\u81f3\u672c\u5730 CSV \u6587\u4ef6\uff0c\u4e3b\u8981\u901a\u8fc7\u4ee5\u4e0b\u51e0\u4e2a\u914d\u7f6e\u6765\u63a7\u5236\uff1a APP_NAME = # \u6307\u5b9a\u8981\u540c\u6b65\u7684\u5e94\u7528\u540d\u79f0\nPMS_USER = # PMS\u7684\u7528\u6237\u540d\nPMS_PASSWORD = # PMS\u7684\u5bc6\u7801\n \u5728 [csv_link_pms_id] \u8282\u70b9\u4e0b\u6307\u5b9a csv \u6587\u4ef6\u540d\u4e0e PMS \u7528\u4f8b\u6a21\u5757\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u6bd4\u5982\uff1a [csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/testcase-browse-53.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 53\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic = 53\n \u5c06\u4ee5\u4e0a\u4fe1\u606f\u914d\u7f6e\u597d\u4e4b\u540e\uff0c\u5728\u547d\u4ee4\u884c\u6267\u884c\uff1a youqu manage.py pms --pms2csv yes\n \u6bcf\u6b21\u6267\u884c\u65f6\u539f csv \u6587\u4ef6\u4f1a\u81ea\u52a8\u5907\u4efd\u5728 report/csv_back \u76ee\u5f55\u4e0b\uff0c\u56e0\u6b64\u4f60\u4e0d\u7528\u62c5\u5fc3\u811a\u672c\u6267\u884c\u5bfc\u81f4\u4f60\u7684\u6570\u636e\u4e22\u5931\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u57fa\u7840\u6846\u67b6\u8bbe\u8ba1\u65b9\u6848","text":"# ====================================\n# Author : Mikigo\n# Time : 2022/3/18\n# version \uff1a1.0\n# ====================================\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"\u505a\u4e00\u4e2a\u7b80\u5355\u3001\u597d\u7528\u3001\u529f\u80fd\u5f3a\u5927\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u3002 \u4f5c\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4e00\u4e2a\u57fa\u7840\u6846\u67b6\uff0c\u4efb\u4f55\u5e94\u7528\u90fd\u80fd\u5f88\u65b9\u4fbf\u7684\u63a5\u5165\u8fdb\u6765\uff1b \u63d0\u4f9b\u6240\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u9700\u8981\u7684\u5e95\u5c42\u529f\u80fd\uff0c\u5e76\u5bf9\u5916\u63d0\u4f9b\u552f\u4e00\u7684\u63a5\u53e3\uff0c\u65b9\u4fbf\u5e94\u7528\u5e93\u4f7f\u7528\uff1b \u6574\u5408\u516c\u5171\u5e93\uff0c\u51cf\u5c11\u5e94\u7528\u5e93\u4ee3\u7801\u91cf\u548c\u65b9\u6cd5\u7ef4\u62a4\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u8bbe\u8ba1\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u7edf\u4e00\u6982\u5ff5","text":" \u57fa\u7840\u6846\u67b6 \u672c\u9879\u76ee\u662f\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\uff08AutoTest Basic Frame\uff09\uff0c\u5168\u79f0\u4e3a\u201c\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff08AT \u57fa\u7840\u6846\u67b6\uff09\u201d\u3002 AT \u57fa\u7840\u6846\u67b6\u662f\u505a\u4e3a\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\u6765\u8bbe\u8ba1\u7684\uff0c\u5b83\u63d0\u4f9b\u4e86\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u57fa\u7840\u529f\u80fd\uff0c\u4efb\u4f55\u5e94\u7528\u63a5\u5165\u8fdb\u6765\u90fd\u80fd\u5feb\u901f\u65b9\u4fbf\u7684\u8fdb\u884c\u65b9\u6cd5\u548c\u7528\u4f8b\u7f16\u5199\uff0c\u540c\u65f6\u5728\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u3001\u6807\u7b7e\u5316\u6267\u884c\u3001\u5206\u5e03\u5f0f\u6267\u884c\u3001\u591a\u79cd\u62a5\u544a\u8f93\u51fa\u3001\u4f18\u7f8e\u7684\u6267\u884c\u65e5\u5fd7\u3001\u5931\u8d25\u81ea\u52a8\u5f55\u5c4f\u548c\u622a\u56fe\u3001\u81ea\u52a8\u73af\u5883\u6e05\u7406\u7b49\u7b49\uff0c\u5b83\u90fd\u63d0\u4f9b\u4e86\u5b8c\u5584\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u66f4\u91cd\u8981\u7684\u662f\u8fd9\u4e00\u5207\u4f7f\u7528\u8d77\u6765\u90fd\u975e\u5e38\u7b80\u5355\u3002 \u57fa\u7840\u6846\u67b6\u4e2d\u5305\u542b\u5e94\u7528\u5e93\uff08apps\uff09\u3001\u6838\u5fc3\u5e93\uff08src\uff09\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09\u3002 \u5e94\u7528\u5e93\uff08apps\uff09 \u5404\u4e2a\u5e94\u7528\u81ea\u5df1\u7684\u4ed3\u5e93\uff0c\u91cc\u9762\u4e3b\u8981\u5305\u542b\u7684\u662f\u7528\u4f8b\u3001\u65b9\u6cd5\u53ca\u4e00\u4e9b\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u53eb autotest-dde-file-manager \u3002 \u6838\u5fc3\u5e93\uff08src\uff09 \u6838\u5fc3\u5e93\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u5230\u6240\u6709\u5e95\u5c42\u6838\u5fc3\u529f\u80fd\uff0c\u8fd9\u662f\u6700\u91cd\u8981\u7684\u4e00\u4e2a\u90e8\u5206\uff0c\u7075\u9b42\u3002\u5177\u4f53\u529f\u80fd\u6a21\u5757\u53ca\u8bf4\u660e\u4f1a\u5728\u4e0b\u9762\u7b2c\u56db\u4e2a\u7ae0\u8282\u8be6\u7ec6\u63cf\u8ff0\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09 \u591a\u4e2a\u5e94\u7528\u90fd\u8981\u7528\u5230\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\uff0c\u6309\u7167\u5e94\u7528\u5212\u5206\u5b58\u653e\uff0c\u4e3b\u8981\u662f\u4e3a\u4e86\u51cf\u5c11\u4ee3\u7801\u91cf\uff0c\u6d88\u9664\u5e94\u7528\u95f4\u7684\u8026\u5408\u5173\u7cfb\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u67b6\u6784\u56fe","text":"\u6574\u4f53\u7684\u6846\u67b6\u8bbe\u8ba1\u5728\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u300b\u6587\u6863\u91cc\u9762\u5df2\u7ecf\u6709\u8be6\u7ec6\u63cf\u8ff0\u4e86\uff0c\u8fd9\u91cc\u8d34\u4e00\u4e0b\u6574\u4f53\u7684\u67b6\u6784\u56fe\uff1a \u4e3a\u4e86\u7a81\u663e\u672c\u6587\u7684\u91cd\u70b9\uff0c\u62bd\u53d6\u5176\u4e2d\u91cd\u8981\u529f\u80fd\u6a21\u5757\uff0c\u5982\u4e0b\u56fe\uff1a "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-basic-frame # \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\n\u251c\u2500\u2500 apps # \u5e94\u7528\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-dde-file-manager # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\uff08\u5e94\u7528\u5e93\u8be6\u7ec6\u76ee\u5f55\u7ed3\u6784\u8bf7\u770b\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\uff09\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 tag # \u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u2514\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u2502 \u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 xxx.png\n\u2502 \u2502 ...\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-deepin-music # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 public # \u516c\u5171\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget # dde_dock \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget # dde_desktop \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 src # \u6838\u5fc3\u5e93\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 button_center.py\n\u2502 \u251c\u2500\u2500 cmdtrl.py\n\u2502 \u251c\u2500\u2500 dogtails.py\n\u2502 \u251c\u2500\u2500 find_image.py\n\u2502 \u251c\u2500\u2500 global_config.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 setting # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 config.py\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 global_config.ini\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\u6a21\u5757\uff08Hook\uff09\n\u251c\u2500\u2500 pytest.ini # Pytest \u9ed8\u8ba4\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 docs # \u6587\u6863\u76ee\u5f55\n\u2514\u2500\u2500 manage.py # \u6267\u884c\u5668\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1apps","title":"1\u3001\u5e94\u7528\u5e93\uff08apps\uff09","text":"\u6240\u6709\u5e94\u7528\u5e93\u5747\u653e\u7f6e\u5728\u57fa\u7840\u6846\u67b6\u4e0b\u7684 apps \u76ee\u5f55\u4e0b\uff08\u89c1\u7b2c\u4e8c\u7ae0\u8282\u7b2c3\u6bb5\u76ee\u5f55\u7ed3\u6784\u5185\u5bb9\uff09\u3002\u5e94\u7528\u5e93\u7684\u67b6\u6784\u8bbe\u8ba1\u53ef\u4ee5\u53c2\u8003\u300aAT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b\u6587\u6863\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2src","title":"2\u3001\u6838\u5fc3\u5e93\uff08src\uff09","text":"\u5728 src \u76ee\u5f55\u4e0b\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u5e95\u5c42\u6838\u5fc3\u7ec4\u4ef6\uff0c\u901a\u5e38\u6765\u8bb2\u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5230\u5176\u4e2d\u67d0\u4e00\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4e48\u4f60\u9700\u8981\u663e\u793a\u7684\u5bfc\u5165\u8fd9\u4e2a\u6a21\u5757\uff0c\u7136\u540e\u624d\u80fd\u4f7f\u7528\u8be5\u6a21\u5757\u4e0b\u7684\u529f\u80fd\uff0c\u5982\u679c\u4f60\u7528\u5230\u4e86\u5341\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4f60\u5c31\u9700\u8981\u5bfc\u5165\u5341\u4e2a\u3002\u4f46\u662f\u6211\u4eec\u60f3\u8ba9\u4e8b\u60c5\u53d8\u5f97\u7b80\u5355\uff0c\u4e00\u6b21\u5bfc\u5165\uff0c\u4f7f\u7528\u6240\u6709\u3002 \u5c06\u6240\u6709\u7684\u529f\u80fd\u6a21\u5757\u90fd\u8fdb\u5165\u5230 src \u7684\u540d\u79f0\u7a7a\u95f4\uff0c\u5728 src/__init__.py \u91cc\u9762\u6211\u4eec\u8bbe\u8ba1\u6210\u8fd9\u6837\uff1a # src/__init__.py\nfrom .cmdctl import CmdCtl\nfrom .dogtails import Dogtail\nfrom .find_image import FindImage\nfrom .button_center import ButtonCenter\nclass Src(CmdCtl, FindImage):\ndef __init__(self, **kwargs):\n\"\"\"dogtail or button center param\n :param kwargs: app_name, desc, number\n \"\"\"\nif kwargs:\napp_name = kwargs.get(\"APP_NAME\")\ndesc = kwargs.get(\"DESC\")\nif app_name is None or desc is None:\nraise ValueError\nnumber = kwargs.get(\"number\")\nnumber = number if isinstance(number, int) else -1\n# \u5bf9\u8c61\u7ec4\u5408\nself.dog = Dogtail(app_name, desc, number)\nself.ui = ButtonCenter(app_name, number)\n \u9700\u8981\u4f20\u9012\u53c2\u6570\u7684\u91c7\u7528\u5bf9\u8c61\u7ec4\u5408\uff0c\u6ca1\u6709\u53c2\u6570\u7684\u4f7f\u7528\u7ee7\u627f\uff0c\u7ee7\u627f\u7684\u7c7b\u7b26\u5408 Mixin \u8bbe\u8ba1\u6a21\u5f0f\u3002 \u5e94\u7528\u5e93\u91cc\u9762\u4f7f\u7528\u7684\u65f6\u5019\u5728 widget/base_widget.py \u91cc\u9762\u53ea\u9700\u8981\u552f\u4e00\u7ee7\u627f Src \uff1a # \u5e94\u7528\u5e93\u91cc\u9762\u65b9\u6cd5\u57fa\u7c7b\n# widget/base_widget.py\nfrom src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n \u8981\u4f7f\u7528\u6838\u5fc3\u5e93\u7684\u529f\u80fd\uff0c\u53ea\u9700\u8981\u5199\u4e00\u4e2a\u5bfc\u5165 from src import Src \u5373\u53ef\u3002 \u5199 __init__ \u6784\u9020\u51fd\u6570\u7684\u539f\u56e0\u662f\u901a\u8fc7\u53c2\u6570\u6784\u9020\u5e94\u7528\uff0c\u5e76\u4e14\u4f20\u9012 number \u8fdb\u6765\uff0c\u53ef\u4ee5\u5b9e\u73b0\u591a\u7a97\u53e3\u7684\u63a7\u5236\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3public","title":"3\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09","text":"\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6bcf\u4e2a\u5e94\u7528\u90fd\u662f\u4e00\u4e2a\u5355\u72ec\u7684 py \u6587\u4ef6\uff0c\u76f8\u4e92\u4e4b\u95f4\u662f\u72ec\u7acb\u7684\uff0c\u6bcf\u4e2a py \u6587\u4ef6\u91cc\u9762\u662f\u8be5\u5e94\u7528\u7684\u65b9\u6cd5\u7c7b\uff0c\u6bd4\u5982\uff1a\u6700\u5e38\u7528\u7684\u65b9\u6cd5\u7c7b dde_desktop_public_widget.py # dde_desktop_widget.py\nfrom src import Src\nclass _DdeDesktopPublicBaseWidget(Src):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-desktop\"\nDESC = \"/usr/bin/dde-desktop\"\ndef __init__(self):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC)\nclass DdeDesktopPublicWidget(_DdeDesktopPublicBaseWidget):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u7c7b\"\"\"\ndef click_music_dir_by_ui(self):\n\"\"\"\u5728\u6587\u4ef6\u9009\u62e9\u6846\u70b9\u51fb\u97f3\u4e50\u76ee\u5f55\"\"\"\nself.click(*self.ui.btn_center(\"\u4fa7\u8fb9\u680f-\u97f3\u4e50\")) \ndef click_xxx_by_attr(self):\npass\n \u516c\u5171\u65b9\u6cd5\u5e93\u610f\u4e49\uff1a \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6240\u5c01\u88c5\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\u90fd\u662f\u81f3\u5c11\u88ab2\u4e2a\u5e94\u7528\u90fd\u7528\u5230\u7684\uff0c\u8fd9\u6837\u505a\u53ef\u4ee5\u51cf\u5c11\u6574\u4f53\u4ee3\u7801\u91cf\uff0c\u4ece\u800c\u51cf\u8f7b\u5e94\u7528\u5e93\u4ee3\u7801\u7684\u7ef4\u62a4\u5de5\u4f5c\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u7f16\u5199\u5f62\u5f0f\uff08\u547d\u540d\u89c4\u5219\u3001\u5b9a\u4f4d\u7684\u65b9\u6848\u5199\u6cd5\u3001\u6ce8\u91ca\u7684\u5199\u6cd5\u7b49\u7b49\uff09\u5177\u6709\u4e00\u5b9a\u7684\u6a21\u677f\u4f5c\u7528\uff0c\u8fd9\u6837\u5373\u4f7f\u662f\u5404\u4e2a\u5e94\u7528\u5e93\u90fd\u72ec\u7acb\u7ef4\u62a4\uff0c\u6240\u6709\u7684\u7f16\u7801\u98ce\u683c\u90fd\u662f\u8d8b\u4e8e\u76f8\u540c\u7684\uff0c\u56e0\u4e3a\u5927\u5bb6\u90fd\u5e94\u8be5\u53c2\u7167\u516c\u5171\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u5199\u6cd5\u6765\u5199\u81ea\u5df1\u5e94\u7528\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\u7c7b\uff0c\u8fd9\u6837\u4f7f\u5f97\u4ece\u516c\u53f8\u7684\u89d2\u5ea6\u53bb\u770b\u6240\u6709\u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u90fd\u662f\u7edf\u4e00\u7684\u3002 \u53ef\u4ee5\u901a\u8fc7\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\uff0c\u4e86\u89e3\u5230\u5176\u4ed6\u5e94\u7528\u7684\u529f\u80fd\uff0c\u5bf9\u4e8e\u6211\u4eec\u9700\u6c42\u7406\u89e3\uff0c\u4e86\u89e3\u7cfb\u7edf\u7684\u65b9\u65b9\u9762\u9762\u4e5f\u6709\u597d\u5904\u3002 \u5f53\u7136\uff0c\u5982\u679c\u4f60\u7684\u5e94\u7528\u672c\u8eab\u662f\u5c5e\u4e8e\u6839\u672c\u5c31\u4e0d\u9700\u8981\u548c\u5176\u4ed6\u5e94\u7528\u4ea4\u4e92\u7684\uff0c\u90a3\u4e48\u4f60\u53ef\u80fd\u4e0d\u4f1a\u7528\u5230\u8fd9\u91cc\u9762\u7684\u529f\u80fd\uff0c\u6ca1\u5173\u7cfb\uff0c\u4f60\u6240\u6709\u7684\u65b9\u6cd5\u90fd\u53ef\u4ee5\u76f4\u63a5\u5199\u5728\u5e94\u7528\u5e93\u7684\u4e1a\u52a1\u5c42\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4conftestpy","title":"4\u3001conftest.py","text":"conftest.py \u4ece\u529f\u80fd\u4e0a\u5c06\u662f\u5c5e\u4e8e\u6838\u5fc3\u5e93\uff08src\uff09\u7684\u5185\u5bb9\uff0c\u4f46\u662f\u7531\u4e8e\u5b83\u7684\u7279\u6b8a\u6027\uff0c\u5373\u5b83\u662f\u5bf9\u5e94\u7528\u5e93\u4e2d\u7684\u7528\u4f8b\u751f\u6548\u7684\uff0c\u800c\u4e14\u5b83\u7684\u4f5c\u7528\u57df\u662f\u5f53\u524d\u76ee\u5f55\u53ca\u4ee5\u4e0b\uff0c\u56e0\u6b64\u6211\u4eec\u5c06\u5b83\u653e\u5230\u9879\u76ee\u6839\u76ee\u5f55\u3002\u6211\u4eec\u6846\u67b6\u4e2d\u6709\u4e0d\u5c11\u6838\u5fc3\u529f\u80fd\u90fd\u662f\u5728\u8fd9\u91cc\u9762\u8fdb\u884c\u5f00\u53d1\u7684\uff0c\u540e\u9762\u7b2c\u56db\u7ae0\u4f1a\u8bb2\u5230\u7ec6\u8282\u3002 pytest.ini \u4f5c\u7528\u548c conftest.py \u7c7b\u4f3c\uff0c\u662f Pytest \u6846\u67b6\u7684\u56fa\u5b9a\u914d\u7f6e\u6587\u4ef6\uff0c\u76ee\u524d\u914d\u7f6e\u4e86\u4e00\u4e9b\u901a\u7528\u7684\u547d\u4ee4\u884c\u6267\u884c\u53c2\u6570\uff0c\u4e5f\u653e\u5728\u9879\u76ee\u6839\u76ee\u5f55\u3002 \u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 Hook \u51fd\u6570\uff0capps \u76ee\u5f55\u4e0b\u7684 \u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 fixture \u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5setting","title":"5\u3001setting","text":"\u5168\u5c40\u914d\u7f6e\u6a21\u5757\uff0c\u5305\u542b\u4e86\u4ee5\u4e0b\u914d\u7f6e\u6587\u4ef6\uff1a \uff081\uff09ini \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u914d\u7f6e\u4e00\u4e9b\u5168\u5c40\u7684\u914d\u7f6e\u9879\uff0c\u8b6c\u5982\uff1a\u5931\u8d25\u91cd\u8dd1\u6b21\u6570\u3001\u662f\u5426\u5931\u8d25\u5f55\u5c4f\u3001\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\u3001\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4\u3001\u6267\u884c\u65f6\u65e5\u5fd7\u7ea7\u522b\u3001\u751f\u6210\u7684\u62a5\u544a\u7c7b\u578b\u3001\u4ee5\u53ca\u5206\u5e03\u5f0f\u6267\u884c\u7684\u4e00\u4e9b\u7b56\u7565\u914d\u7f6e\u9879\u7b49\u7b49\u3002 \uff082\uff09config.py \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u63d0\u4f9b\u914d\u7f6e\u6587\u4ef6\u8bfb\u53d6\u3001\u52a8\u6001\u83b7\u53d6\u4e00\u4e9b\u5e38\u91cf\uff08\u5982\u9879\u76ee\u6839\u76ee\u5f55\u7edd\u5bf9\u8def\u5f84 (BASE_DIR)\u3001\u7cfb\u7edf\u67b6\u6784\uff08SYS_FRAME\uff09\u3001\u65f6\u95f4\u5b57\u7b26\u4e32\uff08strftime\uff09\u3001\u672c\u673a USERNAME IP \u7b49\u7b49\uff09\u3001\u516c\u5171 URL \u7b49\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u89c4\u8303","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u7248\u672c\u53ca\u4f9d\u8d56","text":"\u57fa\u7840\u6846\u67b6\u4f1a\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u8fdb\u884c\u7248\u672c\u53d1\u5e03\uff0c\u4e0d\u4e0e\u67d0\u4e2a\u5e94\u7528\u7248\u672c\u7ed1\u5b9a\uff0c\u4f46\u662f\uff0c\u5e94\u7528\u5e93\u4f1a\u4f9d\u8d56\u4e8e\u57fa\u7840\u6846\u67b6\u7684\u7248\u672c\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u5efa\u8bae\u5728\u5e94\u7528\u5e93\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a\u6587\u672c\u6587\u4ef6\u7528\u4e8e\u8bb0\u5f55\u6240\u4f9d\u8d56\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\uff0c\u7c7b\u4f3c\u4e8e\u5f00\u53d1\u5e94\u7528\u7684 debian/control \u6587\u4ef6\u7684\u529f\u80fd\uff0c\u4e3a\u4e86\u4fdd\u6301\u7edf\u4e00\uff0c\u8fd9\u4e2a\u6587\u4ef6\u5c31\u547d\u540d\u4e3a control\uff0c\u653e\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u6838\u5fc3\u5e93\u72ec\u7acb\u6027","text":"\u6838\u5fc3\u5e93\u4e0d\u5efa\u8bae\u9488\u5bf9\u67d0\u4e00\u4e2a\u5e94\u7528\u5355\u72ec\u505a\u4ee3\u7801\u4e0a\u7279\u6b8a\u5904\u7406\uff0c\u901a\u5e38\u8003\u8651\u9488\u5bf9\u67d0\u4e00\u79cd\u573a\u666f\u8fdb\u884c\u5904\u7406\uff0c\u8fd9\u4e9b\u573a\u666f\u901a\u5e38\u662f\u5b58\u5728\u4e00\u4e9b\u5171\u6027\u7684\u3002\u6bd4\u5982\u8bf4\uff1a\u684c\u9762\u7684ID\u5206\u914d\u5b58\u5728\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u903b\u8f91\u5904\u7406\u89e3\u51b3ID\u5206\u914d\u9519\u8bef\u7684\u95ee\u9898\uff0c\u4f46\u662f\u8fd9\u90e8\u5206\u903b\u8f91\u6211\u4eec\u4f1a\u5728\u684c\u9762\u7684\u65b9\u6cd5\u5c42\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u517c\u5bb9\u6027","text":"\u4e3a\u4e86\u4fdd\u6301\u517c\u5bb9\u6027\uff0c\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u539f\u5219\u4e0a\u4e0d\u5bf9\u8001\u65b9\u6cd5\u8fdb\u884c\u4fee\u6539\u6216\u5220\u9664\uff0c\u53ea\u8fdb\u884c\u65b0\u589e\u3002\u6d89\u53ca\u5230\u8001\u65b9\u6cd5\u4fee\u6539\u6216\u5220\u9664\u7684\uff0c\u4f1a\u8fdb\u884c\u63d0\u524d\u9884\u544a\uff0c\u5e76\u5728\u7b2c\u4e8c\u4e2a\u7248\u672c\u4e4b\u540e\uff08\u4e2d\u95f4\u4f1a\u9694\u4e00\u4e2a\u7248\u672c\u8fc7\u5ea6\uff09\u6b63\u5f0f\u5b9e\u65bd\u4fee\u6539\u6216\u5220\u9664\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u547d\u540d\u89c4\u8303","text":" \u7528\u4f8b ID \u6bcf\u4e2a\u5e94\u7528\u81ea\u5df1\u7ef4\u62a4\u4e00\u5957 ID\uff0c\u5728PMS\u4e0a\u7528\u4f8b\u6807\u9898\u4e0a\u5c06\u81ea\u52a8\u5316ID\u4ee5\u6807\u7b7e\u7684\u5f62\u5f0f\u5199\u5165\uff0c\u6bd4\u5982\uff1a[101]\u6253\u5f00-\u542f\u52a8\u5e94\u7528\u540edock\u53f3\u952e\u83dc\u5355 \u4e00\u4e2a\u7528\u4f8b\u7c7b\u91cc\u9762\u6709\u591a\u4e2a\u7528\u4f8b\u65f6\uff0c\u5728\u7528\u4f8b\u540d\u79f0\u540e\u9762\u52a0\u5e8f\u53f7\u3002 class TestFileManager(BaseCase):\n\"\"\"\u6587\u7ba1\u7528\u4f8b\"\"\"\ndef test_xxx_015_1(self):\npass\ndef test_xxx_015_2(self):\npass\n \u6ce8\u610f 015_1\uff0c\u4e0d\u8981\u5199015_01\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 PMS \u4e0a\u7684\u7528\u4f8bID\uff1a PMS \u4e0a\u662f6\u4f4d\u6570\uff0c\u4e0d\u591f\u76f4\u89c2\uff0c\u4e5f\u4e0d\u597d\u7ef4\u62a4\uff0c\u5728\u81ea\u52a8\u5316\u4e0b\u9762\u53bb\u627e\u4e00\u4e2a\u5e26\u6709 6 \u4f4d\u6570\u7684\u6587\u4ef6\u662f\u4e00\u4e2a\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 PMS \u4e0a\u7684 ID \u53ef\u80fd\u4f1a\u53d1\u751f\u53d8\u5316\uff0c\u6bd4\u5982\u5bfc\u51fa\u6765\u5bfc\u8fdb\u53bb\u7684\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u5b58\u5728\u95ee\u9898\uff0c\u5982\u679c\u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u8981\u60f3\u627e\u51fa\u6765\u5bf9\u5e94\u4fee\u6539\u81ea\u52a8\u5316\u7528\u4f8b ID\uff0c\u5c06\u4f1a\u662f\u4ef6\u975e\u5e38\u75db\u82e6\u7684\u4e8b\u60c5\u3002 \u51fd\u6570\u547d\u540d\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5de6\u952e\u70b9\u51fb click \u53f3\u952e\u70b9\u51fb right_click \u53cc\u51fb double_click \u79fb\u52a8 move_to \u62d6\u52a8 drag \u65b0\u5efa new \u62d6\u52a8\u5230 drag_to \u4ece\u54ea\u91cc\u62d6\u52a8\u5230\u54ea\u91cc drag_something_from_xxx_to_xxx \u83b7\u53d6 get \u83b7\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5750\u6807 get_location \u975e\u7279\u6b8a\u6587\u4ef6 file word\u6587\u4ef6 doc text\u6587\u4ef6 text \u6587\u4ef6\u5939 dir \u5173\u952e\u8bcd\u6301\u7eed\u589e\u52a0 \u5e38\u91cf\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5e94\u7528\u540d\u79f0 APP_NAME \u5e94\u7528\u63cf\u8ff0 DESC \u672c\u5e94\u7528\u4ee5\u5916\u7684\u5176\u4ed6\u5e94\u7528\uff0c\u6bd4\u5982\u5e2e\u52a9 HELP \u5176\u4ed6\u540d\u79f0\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u65b9\u6cd5\u5305\u540d widget \u65b9\u6cd5\u6587\u4ef6\u540d\uff08\u6587\u7ba1\u4e3e\u4f8b\uff09 dfm_widget.pytitle_widget.pyright_view_widget.pyleft_view_widget.pypop_widget.pybase_widget.pydfm_assert.py \u65ad\u8a00\u8bed\u53e5\u547d\u540d\u89c4\u8303 \u65ad\u8a00\u8bed\u53e5\u90fd\u662f\u4ee5 assert \u5f00\u5934 \u65ad\u8a00 \u8bed\u53e5 \u5224\u65ad\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_existsassert_file_not_exists \u5224\u65ad\u684c\u9762\u76ee\u5f55\u4e0b\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_exists_in_desktopassert_file_not_exists_in_desktop \u5224\u65ad\u56fe\u7247\u5b58\u5728 assert_image_existsassert_image_not_exists \u5224\u65ad\u5f71\u9662\u4e2d\u662f\u5426\u5b58\u5728\u56fe\u7247 assert_image_exists_in_movieassert_image_not_exists_in_movie \u5224\u65ad\u5143\u7d20\u662f\u5426\u5b58\u5728 assert_element_existassert_element_not_exist \u5224\u65ad\u662f\u5426\u76f8\u7b49 assert_equalassert_not_equal \u5224\u65ad\u662f\u5426\u4e3a\u771f assert_trueassert_false"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5fixture","title":"5\u3001fixture \u89c4\u8303","text":"\u7531\u4e8e Pytest \u6846\u67b6\u4e2d\u652f\u6301 fixture \u7684\u5199\u6cd5\u548c Xunit \u5199\u6cd5\u7684\uff0c\u6240\u4ee5\u5e94\u7528\u5e93\u4e2d\u53ef\u80fd\u5b58\u5728\u6df7\u7528\u7684\u60c5\u51b5\uff0c\u4e3a\u7edf\u4e00\u7f16\u7801\u98ce\u683c\u65b9\u4fbf\u540e\u7eed\u7528\u4f8b\u4ee3\u7801\u7ef4\u62a4\uff0c\u73b0\u505a\u4ee5\u4e0b\u89c4\u8303\u8bf4\u660e\uff1a \u629b\u5f03 Xunit \u7684\u5199\u6cd5\uff0c\u7edf\u4e00\u91c7\u7528 Pytest fixture \u7684\u5199\u6cd5\u3002 \u5e94\u7528\u5185 fixture \u8c28\u614e\u4f7f\u7528 autouse=True \uff0c\u975e\u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u975e\u5e38\u4e0d\u5efa\u8bae\u4f7f\u7528\u8fd9\u4e2a\u53c2\u6570\u3002 \u8c03\u7528 fixture \u4e0d\u80fd\u4f7f\u7528 @pytest.mark.usefixture()\uff0c\u4f7f\u7528\u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u4f20\u5165\u51fd\u6570\u5bf9\u8c61\u3002 \u5efa\u8bae\u5728\u4e00\u4e2a conftest.py \u91cc\u9762\u53bb\u5199\uff0c\u4e00\u4e2a\u5e94\u7528\u4e5f\u5c3d\u91cf\u7ef4\u62a4\u4e00\u4e2a conftest.py\u6587\u4ef6\u3002 fixture \u4e5f\u9700\u8981\u5199\u529f\u80fd\u8bf4\u660e\uff0c\u51fd\u6570\u540d\u79f0\u8981\u6709\u5177\u4f53\u542b\u4e49\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#6","title":"6\u3001\u65b9\u6cd5\u7f16\u5199\u89c4\u8303","text":" \u65b9\u6cd5\u7c7b\u578b\uff1a if \u6ca1\u6709\u7528\u5230\u5b9e\u4f8b\u5bf9\u8c61\uff1a\nif \u6ca1\u6709\u7528\u5230\u7c7b\u5bf9\u8c61\uff1a\n\u5199\u9759\u6001\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @staticmethod\nelse\uff1a\n\u5199\u7c7b\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @classmethod\nelse:\n\u76f4\u63a5\u5199\u5b9e\u4f8b\u65b9\u6cd5\n \u4e3e\u4f8b: class TitleWidget:\ndef click_xxx_by_ui(self):\npass\n@staticmethod\ndef click_xxx_by_ui():\npass\n@classmethod\ndef click_xxx_by_ui(cls):\npass\n \u51fd\u6570\u540d\u79f0\u4e0d\u51fa\u73b0\u6570\u5b57\uff0c\u9700\u8981\u8868\u793a\u6570\u91cf\u7684\u7528\u5355\u8bcd\u8868\u793a\u3002 \u51fd\u6570\u529f\u80fd\u6ce8\u91ca\u3002 \u6ca1\u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg2:xxx\n\"\"\"\n \u6709\u53c2\u6570\uff0c\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg1:xxx\nreturn: xxx\n\"\"\"\n \u200b \u7528 Pycharm \u7684\u6ce8\u91ca\u6a21\u677f\u4e5f\u53ef\u4ee5\uff0c\u53ea\u8981\u4f53\u73b0\u4e86\u53c2\u6570\u7684\u7c7b\u578b\u548c\u8fd4\u56de\u5c31\u884c\u4e86\u3002 \u6682\u4e0d\u8981\u6c42\u5199\u7c7b\u578b\u6ce8\u89e3\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#7case","title":"7\u3001\u7528\u4f8b\uff08case\uff09\u89c4\u8303","text":" \u4ee5\u7c7b\u7684\u5f62\u5f0f\u5199\u7528\u4f8b\uff0c\u7528\u4f8b\u7c7b\u96c6\u6210\u7528\u4f8b\u57fa\u7c7b\u3002 \u7528\u4f8b\u7c7b\u9700\u8981\u5199\u6ce8\u91ca\u3002 \u6d4b\u8bd5\u7528\u4f8b\u51fd\u6570\u8bf4\u660e\uff08\u5efa\u8bae\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u540d\u79f0\uff09 \"\"\"\u53f3\u4fa7\u9884\u89c8-\u56fe\u7247\u7c7b\u578b\u4fe1\u606f\u680f\u57fa\u672c\u4fe1\u606f\"\"\"\n \u4e0d\u5199\u8c03\u8bd5\u4ee3\u7801 if __name__ == '__main__':\npytest.main()\n \u6240\u6709\u7528\u4f8b\u90fd\u7ee7\u627f BaseCase\u3002 BaseCase \u91cc\u9762\u653e\u4e00\u4e9b\u6d4b\u8bd5\u6570\u636e\u7684\u5e38\u91cf\uff0c\u6bd4\u5982\u6587\u4ef6\u540d\u79f0\uff0c\u5e94\u7528\u540d\u79f0\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u4e00\u4e9b\u901a\u7528\u7684\u5b57\u7b26\u4e32\u3002 \u8fd9\u7c7b\u662f\u5c5e\u4e8e\u6d4b\u8bd5\u6570\u636e\u3002 class BaseCase(DfmAssert):\n\"\"\"\u7528\u4f8b\u57fa\u7c7b\"\"\"\nNEW_FILE = \"\u65b0\u5efa\u6587\u672c.txt\"\nTEST_FILE = \"test.txt\"\nNEW_DIR = \"\u65b0\u5efa\u6587\u4ef6\u5939\"\nNEW_WORD = \"\u65b0\u5efaWord\u6587\u6863.doc\"\nAPP_HELP = \"damn\"\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\n\"\"\"\u7528\u4f8b\u6807\u9898\uff08\u590d\u5236PMS\u4e0a\u7528\u4f8b\u6807\u9898\uff09\"\"\"\ndfm = DfmWidget()\ndfm.click_xxx_by_attr(self.NEW_FILE)\ndfm.new_file_in_desktop_by_cmd(self.NEW_FILE)\nself.assert_true(dfm.get_process_status(self.APP_NAME))\n \u7528\u4f8b\u91cc\u9762\u5c3d\u91cf\u51cf\u5c11\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\uff0c\u66f4\u8981\u51cf\u5c11\u76f8\u540c\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\u3002 \u7edf\u4e00\u6587\u4ef6\u6ce8\u91ca\u5934\u3002 #!/usr/bin/env python3\n# _*_ coding:utf-8 _*_\n\"\"\"\n:Author:email@uniontech.com\n:Date :${DATE} ${TIME}\n\"\"\"\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#8","title":"8\u3001\u5176\u4ed6\u89c4\u8303","text":" \u65e5\u5fd7\u6253\u5370\u8981\u5728\u65b9\u6cd5\u6700\u524d\u9762\uff0c\u5426\u5219\u4ee3\u7801\u62a5\u9519\u6ca1\u6709\u65e5\u5fd7\u8f93\u51fa\uff0c\u4e0d\u597d\u5b9a\u4f4d\u95ee\u9898\u3002\uff08\u6211\u4eec\u4f1a\u8003\u8651\u7ee7\u7eed\u4f7f\u7528\u62e6\u622a\u5668\u6253\u5370\u65e5\u5fd7\uff09 \u6240\u6709\u7684\u64cd\u4f5c\u90fd\u9700\u8981\u6709\u65e5\u5fd7\uff0c\u5305\u62ec sleep()\uff0c\u6211\u4eec\u4f1a\u91cd\u5199\u4e00\u4e2a\u6709\u65e5\u5fd7\u8f93\u5165\u7684 sleep\u3002 \u4e1a\u52a1\u5c42\u65e5\u5fd7\u7ea7\u522b\u4e3a INFO\u3002 hook \u51fd\u6570\u53ea\u80fd\u5199\u5230\u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u91cc\u9762\u3002 apps \u76ee\u5f55\u4e0b\u7684 conftest.py \u539f\u5219\u4e0a\u4e0d\u4f1a\u65b0\u589e fixture\u3002 \u56fa\u5b9a\u76ee\u5f55\u6216\u5143\u7d20\u63a7\u4ef6\u7684\u64cd\u4f5c\uff0c\u5c06\u64cd\u4f5c\u65b9\u6cd5\u5199\u6b7b\uff0c\u6587\u4ef6\u7c7b\u64cd\u4f5c\u5c06\u6587\u4ef6\u540d\u7559\u53c2\u6570\u3002 \u8def\u5f84\u62fc\u63a5\u89c4\u8303\uff1a \u7cfb\u7edf\u4e2d\u56fa\u5b9a\u76ee\u5f55\uff0c\u8def\u5f84\u62fc\u63a5\u65f6\u4f7f\u7528\u6ce2\u6d6a\u7b26\u53f7\uff0c\u6bd4\u5982\uff1a~/Desktop/\uff0c\u4e0b\u5c42\u4f7f\u7528 os.path.expanduser()\uff0c\u5b83\u53ef\u4ee5\u81ea\u52a8\u8bc6\u522b\u6ce2\u6d6a\u7b26\u53f7\u3002 \u9879\u76ee\u4e0b\u8def\u5f84\u4f7f\u7528\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u8def\u5f84\uff0c\u6bd4\u5982\uff1aConfig.BASE_PATH\uff0c\u56e0\u4e3a\u9879\u76ee\u662f\u53ef\u4ee5\u5728\u4efb\u610f\u8def\u5f84\u8fd0\u884c\u7684\uff0c\u9700\u8981\u52a8\u6001\u62fc\u63a5\u8def\u5f84\u3002 "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848","text":"# =================================================\n# Author : Mikigo\n# Time : 2022/3/16\n# version \uff1a1.0\n# =================================================\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"AT \u5e94\u7528\u5e93\u6539\u9020\u662f\u57fa\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u8fdb\u884c\u7528\u4f8b\u65b9\u6cd5\u548c\u4e1a\u52a1\u903b\u8f91\u7684\u91cd\u65b0\u8bbe\u8ba1\uff0c\u4ee5\u5b9e\u73b0\u5e94\u7528\u5e93\u9ad8\u6548\u7684\u7f16\u5199\u3001\u7ef4\u62a4\u7528\u4f8b\u53ca\u5176\u65b9\u6cd5\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u6587\u4ef6\u7ba1\u7406\u5668\u4ece\u4e1a\u52a1\u590d\u6742\u5ea6\u548c\u7528\u4f8b\u91cf\u6765\u8bb2\uff0c\u5728\u7cfb\u7edf\u6240\u6709\u5e94\u7528\u4e2d\uff0c\u662f\u5f88\u6709\u4ee3\u8868\u6027\u7684\uff0c\u96be\u5ea6\u4e5f\u662f\u6700\u5927\u7684\uff0c\u56e0\u6b64\u6211\u4eec\u9009\u53d6\u6587\u4ef6\u7ba1\u7406\u5668\u4f5c\u4e3a\u5e94\u7528\u5e93\u6539\u9020\u7684\u5b9e\u9a8c\u5e94\u7528\uff0c\u7ed9\u540e\u7eed\u5176\u4ed6\u5e94\u7528\u6539\u9020\u63d0\u4f9b\u5207\u5b9e\u53ef\u884c\u7684\u601d\u8def\u548c\u65b9\u6848\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u5206\u5c42\u8bbe\u8ba1\u56fe","text":"\u6574\u4f53\u4ecd\u7136\u9075\u5faa PO \u8bbe\u8ba1\u7406\u5ff5\uff0c\u6839\u636e\u4e1a\u52a1\u9700\u8981\uff0c\u5c06\u6587\u7ba1\u4e1a\u52a1\u5c42\u8fdb\u884c 3 \u5c42\u5212\u5206\uff1a "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-dde-file-manager # \u5e94\u7528\u4ed3\u5e93\n\u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 test_xxx_001.py\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u00a0\u251c\u2500\u2500 __init__.py\n\u2502 \u00a0\u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u00a0\u251c\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u00a0\u251c\u2500\u2500 base_widget.py # \u65b9\u6cd5\u57fa\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 title_widget.py # title \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 right_view_widget.py # right view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 left_view_widget.py # left view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 pop_widget.py # pop \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 dfm_widget.py # \u65b9\u6cd5\u7684\u7edf\u4e00\u51fa\u53e3\n\u2502 \u00a0\u2514\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 tag # \u7528\u4f8b\u6807\u7b7e\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 xxx.csv # \u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2514\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u57fa\u7c7b","text":" \u7ee7\u627f\u6838\u5fc3\u5c42\u7684\u5404\u4e2a\u6a21\u5757\u7c7b\u3002 \u62bd\u53d6\u64cd\u4f5c\u5c42\u7684\u4e00\u4e9b\u57fa\u7840\u65b9\u6cd5\u3002 \u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u7684\u4e00\u4e9b\u516c\u5171\u65b9\u6cd5\u3002 \u8def\u5f84\u7ec4\u88c5\u65b9\u6cd5\u3002 \u4e00\u4e9b\u4e1a\u52a1\u5c42\u76f8\u5173\u7684\u53d8\u91cf\u3001\u5e38\u91cf\u3001shell\u547d\u4ee4\u3001\u5750\u6807\u3002 \u65b9\u6cd5\u57fa\u7c7b\u7684\u5199\u6cd5\uff1a from src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u64cd\u4f5c\u5c42","text":" \u6a21\u5757\u5212\u5206 \u6309\u7167\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u6587\u7ba1\u4e3b\u754c\u9762\u5206\u4e3a\u4e09\u4e2a\u533a\u57df\uff1a\u6807\u9898\u680f\u3001\u53f3\u8fb9\u89c6\u56fe\u533a\u57df\u3001\u5de6\u8fb9\u89c6\u56fe\u533a\u57df \u5f39\u7a97\uff1a\u8bbe\u7f6e\u754c\u9762\u5f39\u7a97\u3001\u4fdd\u9669\u7bb1\u5f39\u7a97\u3001\u5220\u9664\u786e\u8ba4\u5f39\u7a97\u3001\u53ca\u5404\u79cd\u7f51\u7edc\u5f39\u7a97 \u53f3\u952e\u83dc\u5355\uff1a\u6682\u65f6\u4e0d\u8003\u8651\u4e3a\u5355\u72ec\u7684\u6a21\u5757\uff0c\u8003\u8651\u4ee5\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6848\u505a\u6210\u516c\u5171\u5e93\u3002 \u5404\u4e2a\u6a21\u5757\u53ea\u7ee7\u627f\u57fa\u7c7b from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u6784\u9020\u51fd\u6570\u91cc\u9762\u4e0d\u6784\u9020\u5bf9\u8c61\uff0c\u53ef\u4ee5\u521d\u59cb\u5316\u4e00\u4e9b\u53d8\u91cf\u3002 \u4e0d\u540c\u7684\u5b9a\u4f4d\u65b9\u6848\u8c03\u7528\u4e0d\u540c\u7684\u5b9a\u4f4d\u5de5\u5177\u5bf9\u8c61\u3002 self.dog\nself.ui\nself.d_bus\n \u65b9\u6cd5\u7f16\u5199 \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u5e94\u7528\u5c42","text":" \u7ee7\u627f\u64cd\u4f5c\u5c42\u7684\u6240\u6709\u7c7b\u3002 \u4ec5\u4ec5\u7528\u4e8e\u7528\u4f8b\u4e2d\u5bfc\u5165\u65b9\u4fbf\uff0c\u4e0d\u505a\u5176\u4ed6\u4e8b\u60c5\u3002 class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n DfmAssert \u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u7ee7\u627f\uff0c\u65b9\u4fbf\u4f7f\u7528\u65ad\u8a00\u8bed\u53e5\u3002 from apps.dde_file_manager.widget.dfm_widget import DfmWidget\nfrom public.assert import Assert\nclass DfmAssert(Assert):\ndef assert_file_exists_in_desktop(self, file_name):\nself.assert_file_exists(f\"~/Desktop{file_name}\")\n...\nDfmWidget().get_file_in_desktop()\n \u7528\u4f8b\u91cc\u9762\u76f4\u63a5\u7ee7\u627f\uff0c\u65b9\u4fbf\u5728\u7528\u4f8b\u91cc\u9762\u4f7f\u7528 self \u8fdb\u884c\u65ad\u8a00\uff0c\u66f4\u7b26\u5408\u65ad\u8a00\u7684\u4f7f\u7528\u4e60\u60ef\uff0c\u7528\u4f8b\u903b\u8f91\u4e0a\u66f4\u6e05\u695a\u3002 class BaseCase(DfmAssert):\npass\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\nself.assert_file_exists_in_desktop(\"xxx\")\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u903b\u8f91\u4e3e\u4f8b","text":"\u7528\u4f8b\u4ee3\u7801\u8c03\u7528\u903b\u8f91\u4e3e\u4f8b\uff1a # BaseWidget\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n# =============================================\n# TitleWidget\nclass TitleWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_title_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# RightViewWidget\nclass RightViewWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_right_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# =============================================\n# \u51fa\u53e3 DfmWidget\nclass DfmWidget(TitleWidget, RightViewWidget):\npass\n# =============================================\n# in case\nfrom apps.dde_file_manager.widget.dfm_widget import DfmWidget\ndfm = DfmWidget()\ndfm.click_xxx_title_by_ui()\ndfm.click_xxx_right_by_ui()\ndfm.dog.print_desc()\ndfm.ui.print_number()\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u5de5\u7a0b\u6539\u9020\u5b9e\u65bd\u6b65\u9aa4","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_2","title":"1\u3001\u5de5\u7a0b\u4ee3\u7801\u62c9\u53d6","text":"1.1. \u5c06\u81ea\u52a8\u5316\u57fa\u7840\u6846\u67b6\u7684\u529f\u80fd\u62c9\u5230\u672c\u5730 Autotest Basic Frame \uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame 1.2. \u5c06\u5e94\u7528\u5e93\u4ee3\u7801\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u5e94\u7528\u5e93\u7684\u4ed3\u5e93\u547d\u540d\u5e94\u8be5\u662f\u957f\u8fd9\u6837\u7684 autotest_deepin_xxx\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_2","title":"2\u3001\u8c03\u6574\u5de5\u7a0b\u76ee\u5f55","text":"\u6309\u7167 \u65b9\u6848\u8bbe\u8ba1-\u76ee\u5f55\u7ed3\u6784 \u8fdb\u884c\u76ee\u5f55\u8c03\u6574\uff0c\u5c3d\u91cf\u4f7f\u7528\u7f16\u8f91\u5668\u8fdb\u884c\u76f8\u5e94\u7684\u8c03\u6574\uff0c\u7f16\u8f91\u5668\u63a8\u8350\u4f7f\u7528 Pycharm \uff0c\u4ee5\u4e0b\u64cd\u4f5c\u5747\u5728 Pycharm \u91cc\u9762\u53ef\u5b9e\u73b0\u3002 2.1. \u9700\u8981\u79fb\u52a8 py \u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u76f4\u63a5\u5728\u7f16\u8f91\u5668\u91cc\u9762\uff0c\u4f7f\u7528\u9f20\u6807\u9009\u4e2d\u5e76\u6309\u4f4f\uff0c\u4e4b\u540e\u62d6\u52a8\u5230\u76ee\u6807\u4f4d\u7f6e\u5373\u53ef\uff0cPycharm \u4f1a\u5c3d\u53ef\u80fd\u7684\u81ea\u52a8\u89e3\u51b3\u79fb\u52a8\u5bfc\u81f4\u7684\u8def\u5f84\u95ee\u9898\u3002\u6ce8\u610f\uff0c\u6211\u8bf4\u7684\u662f\u201c\u5c3d\u53ef\u80fd\u201d\uff0c\u6709\u4e9b\u9a9a\u64cd\u4f5c\u7f16\u8f91\u5668\u662f\u65e0\u6cd5\u81ea\u52a8\u5904\u7406\u7684\u3002\u5982\u679c\u6ca1\u6709\u88ab\u7f16\u8f91\u5668\u81ea\u52a8\u5904\u7406\u7684\u8def\u5f84\u95ee\u9898\uff0c\u540e\u7eed\u53ea\u80fd\u624b\u52a8\u89e3\u51b3\u3002 2.2. \u9700\u8981\u91cd\u547d\u540d\u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u5728\u7f16\u8f91\u5668\u91cc\u9762\u9009\u4e2d\u6587\u4ef6\uff0c\u7136\u540e\u4f7f\u7528\u5feb\u6377\u952e Shift + F6 \uff08\u5982\u679c\u5feb\u6377\u952e\u6ca1\u53cd\u5e94\uff0c\u6587\u4ef6\u53f3\u952e\u83dc\u5355 Refactor \u2014\u2014 Rename\uff09\uff0c\u7136\u540e\u5728\u8f93\u5165\u6846\u4e2d\u8f93\u5165\u8981\u91cd\u547d\u540d\u7684\u540d\u79f0\uff0c\u540c\u65f6\uff0c\u786e\u8ba4\u52fe\u9009 Search for references \u548c Search in comments and strings \u8fd9\u4e24\u4e2a\u9009\u9879\uff0c\u6700\u540e\u6309\u56de\u8f66\u6216\u8005\u9f20\u6807\u70b9 Refactor \u3002 \u6ce8\u610f\uff0c\u6b64\u65f6\u7f16\u8f91\u5668\u53ef\u80fd\u4f1a\u63d0\u793a\u4f60\uff0c\u4f60\u8fd9\u4e2a\u91cd\u547d\u540d\u7684\u64cd\u4f5c\u5173\u8054\u4e86\u591a\u4e2a\u6a21\u5757\uff0c\u5b83\u88ab\u591a\u4e2a\u5730\u65b9\u90fd\u4f7f\u7528\u5230\u4e86\uff0c\u76f8\u5173\u7684\u6a21\u5757\u662f\u5426\u4e5f\u4e00\u8d77\u6539\u540d\u4e86\uff0c\u8fd9\u4e0d\u5e9f\u8bdd\u5417\uff0c\u7528\u8fd9\u4e2a\u529f\u80fd\u5c31\u662f\u60f3\u628a\u5173\u8054\u5230\u7684\u90fd\u4fee\u6539\uff0c\u4e0d\u7136\u6211\u4e3a\u4ec0\u4e48\u4e0d\u7528\u6587\u7ba1\u7684\u91cd\u547d\u540d\u529f\u80fd\u5462\uff0c\u522b\u60f3\u4e86\uff0c\u76f4\u63a5\u70b9\u5de6\u4e0b\u89d2\u7684 Refactor \u6309\u94ae\uff0c\u5c31\u662f\u5e72\u3002 \u7c7b\u540d\u3001\u51fd\u6570\u540d\u7684\u91cd\u547d\u540d\u90fd\u5c3d\u91cf\u91c7\u7528\u8fd9\u79cd\u65b9\u6848\uff0c\u56e0\u4e3a\u7f16\u8f91\u5668\u4f1a\u81ea\u52a8\u7ed9\u6211\u4eec\u627e\u5230\u5173\u8054\u7684\u5730\u65b9\uff0c\u7136\u540e\u540c\u6b65\u4fee\u6539\u6389\u3002\u4f60\u53ef\u5343\u4e07\u522b\u76f4\u63a5\u5220\u4e86\u4fee\u6539\u540d\u79f0\uff0c\u4e0d\u7136\u4f60\u53ef\u80fd\u4f1a\u82b1\u4e0a\u4e00\u5929\u7684\u65f6\u95f4\u6765\u89e3\u51b3\u91cd\u547d\u540d\u7684\u95ee\u9898\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u5b9e\u73b0\u6838\u5fc3\u5e93\u63a5\u53e3","text":"3.1. BaseWidget \u5728 BaseWidget \u91cc\u9762\u628a\u8be5\u5199\u7684\u90fd\u5199\u597d\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u4e0a\u9762\u7684\u8bbe\u8ba1\u7406\u5ff5\u6765\u5199\u3002 \u5982\u679c\u4f60\u5acc\u9ebb\u70e6\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u6587\u7ba1\u7684\u5b9e\u9645\u5de5\u7a0b\u4ee3\u7801 autotest_dde_file_manager : https://gerrit.uniontech.com/admin/repos/autotest_dde_file_manager \u3002 3.2. \u64cd\u4f5c\u5c42 \u5982\u679c\u4f60\u662f\u65b0\u5199\u9879\u76ee\uff0c\u4f60\u4f1a\u53d1\u73b0\u4e00\u5207\u90fd\u662f\u90a3\u4e48\u7684\u7b80\u5355\u3001\u76f4\u63a5\uff0c\u6309\u7167\u6211\u4eec\u63d0\u4f9b\u7ed9\u4f60\u7684\u63a5\u53e3\u5199\u7528\u4f8b\u7684\u64cd\u4f5c\u65b9\u6cd5\u5c31\u597d\u4e86\u3002 \u5982\u679c\u4f60\u662f\u60f3\u5bf9\u539f\u6765\u7684\u5de5\u7a0b\u8fdb\u884c\u6539\u9020\uff0c\u4f60\u9700\u8981\u6309\u7167\u6838\u5fc3\u5e93\u65b9\u6cd5\u7684\u8c03\u7528\uff0c\u5c06\u4f60\u4e4b\u524d\u5199\u7684\u6bcf\u4e2a\u65b9\u6848\u8fdb\u884c\u5bf9\u5e94\u7684\u4fee\u6539\uff0c\u5305\u62ec\u7c7b\u548c\u65b9\u6cd5\u7684\u547d\u540d\u3001\u65b9\u6cd5\u5185\u6240\u8981\u7528\u5230\u4e0d\u540c\u5b9a\u4f4d\u65b9\u6cd5\u7684\u5199\u6cd5\u4fee\u6539\u3002 \u8fd9\u65f6\u5019\u4f60\u53ef\u80fd\u4f60\u7684\u4ee3\u7801\u4e2d\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u62a5\u9519\uff0c\u4e0d\u7528\u62c5\u5fc3\uff0c\u4f60\u53ef\u4ee5\u4ece\u4e1a\u52a1\u903b\u8f91\u51fa\u53d1\uff0c\u60f3\u6e05\u695a\u8fd9\u4e2a\u65b9\u6cd5\u662f\u5e72\u4ec0\u4e48\u7684\u3001\u64cd\u4f5c\u7684\u5bf9\u8c61\u662f\u4ec0\u4e48\u3001\u53c2\u6570\u662f\u4ec0\u4e48\uff0c\u6ce8\u610f\u8fd9\u4e9b\u4fee\u6539\u662f\u4f1a\u5f71\u54cd\u5230\u7528\u4f8b\u4ee3\u7801\u91cc\u9762\u7684\uff0c\u6ca1\u5173\u7cfb\uff0c\u7528\u4f8b\u91cc\u9762\u672c\u6765\u4e5f\u5e94\u8be5\u88ab\u5173\u8054\u4fee\u6539\u3002 3.3. \u628a\u914d\u7f6e\u6a21\u5757\u5199\u597d\uff0c\u8fd9\u90e8\u5206\u57fa\u672c\u53ef\u4ee5\u590d\u5236\u6587\u7ba1\u7684\u4ee3\u7801\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4_1","title":"4\u3001\u8def\u5f84\u5904\u7406","text":"4.1. \u5bfc\u5165\u8def\u5f84 \u65b9\u6cd5\u548c\u7528\u4f8b\u4e2d\u90fd\u4f1a\u6d89\u53ca\u5230\u5bfc\u5165\u8def\u5f84\u7684\u4fee\u6539\uff0c\u5728\u4fee\u6539\u8def\u5f84\u65f6\uff0c\u5efa\u8bae\u4f60\u4f7f\u7528 Ctrl + Shift + R \u5168\u5c40\u66ff\u6362\uff0c\u4f1a\u5c06\u6574\u4e2a\u9879\u76ee\u4e0b\u7684\u76f8\u540c\u5730\u65b9\u90fd\u4fee\u6539\u5230\uff0c\u5f53\u7136\uff0c\u4f60\u4e5f\u53ef\u4ee5\u5728\u5c0f\u5f39\u7a97\u4e2d\u4fee\u6539\u5168\u5c40\u66ff\u6362\u4e3a\u5c40\u90e8\u76ee\u5f55\u4e0b\u66ff\u6362\u3002\u5904\u7406\u90a3\u79cd\u6ca1\u6709\u5173\u8054\u5173\u7cfb\uff0c\u4f46\u662f\u53c8\u662f\u76f8\u540c\u540d\u79f0\u7684\u91cd\u547d\u540d\uff0c\u6211\u4e5f\u63a8\u8350\u4f7f\u7528\u8fd9\u79cd\u65b9\u5f0f\u8fdb\u884c\u91cd\u547d\u540d\u3002 \u6ce8\u610f\uff0c\u5168\u5c40\u66ff\u6362\u7684\u65b9\u5f0f\u4efb\u7136\u65e0\u6cd5\u4fdd\u8bc1\u771f\u7684\u5168\u5c40\u88ab\u66ff\u6362\u4e86\uff08\u53ef\u80fd\u662f\u7f16\u8f91\u5668\u7684 Bug \u5427\uff09\uff0c\u6240\u4ee5\u4f60\u4ecd\u7136\u9700\u8981\u624b\u52a8\u770b\u4e0b\u5404\u5904\u662f\u5426\u4fee\u6539\u5230\u4f4d\u3002 4.2. \u8d44\u6e90\u8def\u5f84 \u4e00\u4e9b\u7528\u4f8b\u8d44\u6e90\u9700\u8981\u6839\u636e config.py \u91cc\u9762\u7684\u8def\u5f84\u914d\u7f6e\u8fdb\u884c\u8d44\u6e90\u8def\u5f84\u7684\u62fc\u63a5\uff0c\u5982\u679c\u4f60\u539f\u6765\u672c\u6765\u5c31\u6709\u4e00\u4e2a\u51fd\u6570\u4e13\u95e8\u7528\u4e8e\u7ec4\u88c5\u8def\u5f84\u7684\uff0c\u90a3\u4f60\u53ea\u9700\u8981\u4fee\u6539\u8fd9\u4e00\u4e2a\u5730\u65b9\u5c31\u597d\u4e86\uff0c\u5982\u679c\u4f60\u4e4b\u524d\u5e76\u6ca1\u6709\u8fd9\u6837\u7684\u8bbe\u8ba1\uff0c\u90a3\u53ef\u80fd\u9700\u8981\u4fee\u6539\u5927\u91cf\u6d89\u53ca\u5230\u8d44\u6e90\u8def\u5f84\u7684\u5730\u65b9\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5","title":"5\u3001\u8c03\u8bd5\u548c\u7f16\u5199\u7528\u4f8b","text":"\u4ee5\u4e0a\u51e0\u4e2a\u6b65\u9aa4\u505a\u5b8c\uff0c\u57fa\u672c\u5c31\u53ef\u4ee5\u8fdb\u884c\u7528\u4f8b\u4ee3\u7801\u7684\u8c03\u8bd5\u4e86\uff0c\u8fd9\u90e8\u5206\u5de5\u4f5c\u4e3b\u8981\u89e3\u51b3\u4f60\u4e4b\u524d\u51e0\u4e2a\u6b65\u9aa4\u9057\u6f0f\u7684\u95ee\u9898\uff0c\u5982\u679c\u6240\u6709\u7528\u4f8b\u90fd\u8c03\u8bd5\u901a\u8fc7\u4e86\uff0c\u90a3\u4e48\u5de5\u7a0b\u6539\u9020\u5c31\u5168\u90e8\u5b8c\u6210\u4e86\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/","title":"AT \u5f00\u53d1\u89c4\u8303","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u5f00\u53d1\u89c4\u8303\u662f\u6839\u636e\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fd0\u884c\u4e24\u5e74\u591a\u6765\uff0c\u9047\u5230\u95ee\u9898\u89e3\u51b3\u95ee\u9898\u800c\u5f62\u6210\u7684\u4e00\u4e9b\u89e3\u51b3\u65b9\u6848\uff0c\u6216\u8005\u8bf4\u7ecf\u9a8c\u603b\u7ed3\uff1b\u8fd9\u4e9b\u7ecf\u9a8c\u7b26\u5408\u6211\u4eec\u73b0\u9636\u6bb5 AT \u6240\u5e94\u7528\u7684\u573a\u666f\u9700\u8981\uff0c\u4e5f\u662f\u6211\u4eec\u7ecf\u8fc7\u957f\u671f\u601d\u8003\uff0c\u4e0d\u65ad\u8bd5\u9519\u4e0d\u65ad\u4fee\u6b63\uff0c\u5e76\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u5b9e\u8df5\u4e2d\u68c0\u9a8c\u8fc7\u53ef\u884c\u7684\u3002\u4ee5\u6b64\uff0c\u5e0c\u671b\u80fd\u5e2e\u52a9\u53c2\u4e0e\u5230\u81ea\u52a8\u5316\u7684\u76f8\u5173\u4eba\u5458\u51cf\u5c11\u8bd5\u9519\u6210\u672c\uff0c\u66f4\u597d\u3001\u66f4\u5feb\u7684\u7f16\u5199\u7528\u4f8b\u53ca\u7ef4\u62a4\u7528\u4f8b\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_1","title":"\u4e00\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u89c4\u8303","text":"\u6807\u7b7e\u5316\u7ba1\u7406\u6587\u6863\u8bf7\u53c2\u8003\uff1a \u300a\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u64cd\u4f5c\u6307\u5f15\u300b \u4ee5\u4e0b\u8bf4\u51e0\u4e2a\u5bb9\u6613\u51fa\u73b0\u7684\u95ee\u9898\uff1a"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1","title":"1. \u5bf9\u5e94\u5173\u7cfb","text":" \u5199\u5b8c\u81ea\u52a8\u5316\u7528\u4f8b\u4e4b\u540e\uff0c\u8bf7\u5728 CSV \u6587\u4ef6\u4e2d\u6807\u8bb0\u7528\u4f8b\u7684 ID\u3001\u7b49\u7ea7\u3002\u4e3a\u4e86\u63d0\u9192\u6807\u8bb0\uff0c\u6267\u884c\u7528\u4f8b\u65f6\u5728\u9996\u884c\u4f1a\u8f93\u51fa ERROR \u65e5\u5fd7\uff1a CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94\u7684 ID\uff1b \u5728\u6700\u7ec8\u63d0\u4ea4\u4ee3\u7801\u4e4b\u524d\uff0c\u4f60\u9700\u8981\u5728 CSV \u6587\u4ef6\u91cc\u9762\u5c06ID\u3001\u7528\u4f8b\u7b49\u7ea7\u7b49\u6807\u7b7e\u8865\u5168\uff0c\u5982\u679c CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94 ID\uff0c\u540e\u7eed\u5728\u6279\u91cf\u6267\u884c\u7684\u65f6\u5019\uff0c\u8fd9\u4e9b\u7528\u4f8b\u662f\u4e0d\u4f1a\u6267\u884c\u7684\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2","title":"2. \u540d\u79f0\u4e00\u81f4","text":" CSV \u6587\u4ef6\u7684\u6587\u4ef6\u540d\u3001\u7528\u4f8b\u51fd\u6570\u4e2d\u95f4\u7684\u540d\u79f0\u4e00\u81f4\u3001\u7528\u4f8b py \u6587\u4ef6\u4e2d\u95f4\u7684\u540d\u79f0\uff0c\u8fd9\u4e09\u4e2a\u540d\u79f0\u4e00\u81f4\u3002 \u4e3e\u4f8b\uff1a # test_music_001.py\ndef test_music_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u90a3\u4e48 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e3a music.csv\u3002 AT \u6846\u67b6\u5e95\u5c42\u4ee3\u7801\u5b9e\u73b0\u662f\u5c06 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e0e\u7528\u4f8b\u51fd\u6570\u540d\u79f0\u540d\u79f0\uff08item.name\uff09\u8fdb\u884c\u5bf9\u5e94\uff0c\u56e0\u6b64\uff0c\u6ce8\u610f CSV \u6587\u4ef6\u540d\u79f0\u5bf9\u5e94\u7684\u662f\u7528\u4f8b\u51fd\u6570\u540d\u79f0\uff0c\u5373 def test_music_001 \u91cc\u9762\u7684 music \uff0c\u800c\u4e0d\u662f test_music_001.py \u91cc\u9762\u7684 music \u3002 \u8fd9\u91cc\u7ec6\u7ec6\u54c1\u4e00\u4e0b\u54c8~ \u5982\u679c\u4f60\u5c06\u4e0a\u4f8b\u5199\u6210\u4e86\u8fd9\u6837: # test_music_001.py\ndef test_movie_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u7528\u4f8b\u6267\u884c\u6ca1\u95ee\u9898\uff0c\u4f46\u662f\u6807\u7b7e\u5316\u7ba1\u7406\u662f\u4e0d\u751f\u6548\u7684\uff0c\u6846\u67b6\u65e0\u6cd5\u5c06 music.csv\u6587\u4ef6\u91cc\u9762\u6807\u7b7e\uff0c\u6dfb\u52a0\u5230 test_movie_001\u8fd9\u4e2a\u7528\u4f8b\u4e2d\uff0c\u56e0\u4e3a\u4ed6\u4eec\u6ca1\u6709\u5bf9\u5e94\u5173\u7cfb\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#tag","title":"\u4e8c\u3001\u5206\u652f\u53ca tag \u7ba1\u7406\u89c4\u8303","text":"\u53c2\u8003\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u4ee3\u7801\u7ba1\u7406\u89c4\u8303\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2-tag","title":"2. \u5e94\u7528\u5e93 tag","text":" \u5e94\u7528\u5e93 tag \u6839\u636e\u5e94\u7528\u4ea4\u4ed8\u8282\u70b9\u751f\u6210\uff0c\u6bcf\u6b21\u6253 tag \u4e4b\u524d\uff0c\u76f8\u5173\u6d4b\u8bd5\u4eba\u5458\u9700\u8981\u8fdb\u884c\u7528\u4f8b\u8c03\u8bd5\uff1b \u8c03\u8bd5\u7528\u4f8b\u662f\u6307\u7684\u5728\u5168\u67b6\u6784\uff08x86\u3001arm\u3001mips\uff09\u4e0a\u8c03\u8bd5\u901a\u8fc7\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\u8fbe\u5230 90% \u4ee5\u4e0a\u624d\u80fd\u6253 tag\uff0c\u901a\u8fc7 Jenkins \u6267\u884c\u5668\u6267\u884c\u7528\u4f8b\uff0c\u4fdd\u7559\u901a\u8fc7\u7387\u7ed3\u679c\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\uff1a\u901a\u8fc7\u7528\u4f8b\u6570 / (\u603b\u7528\u4f8b\u6570 - \u5df2\u5e9f\u5f03\u7528\u4f8b) \u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u7b97\u901a\u8fc7 Jenkins \u6267\u884c\u5668 \u4f60\u53ef\u80fd\u4f1a\u5728\u4e00\u4e2a\u4ea4\u4ed8\u5468\u671f\u5185\u6301\u7eed\u7684\u8fdb\u884cAT\u7528\u4f8b\u8c03\u8bd5\uff0c\u4f46\u662f\u6700\u7ec8 AT \u7528\u4f8b\u6253 tag \u7684\u5e94\u7528\u7248\u672c\uff0c\u9700\u8981\u4f7f\u7528\u5e94\u7528\u96c6\u6210\u4ea4\u4ed8\u7684\u6700\u65b0\u5e94\u7528\u7248\u672c\uff0c\u53ef\u4ee5\u4f7f\u7528\u5e94\u7528\u7684\u63d0\u6d4b\u7248\u672c\uff1b\u4e00\u5b9a\u8981\u786e\u4fdd\u8c03\u8bd5\u7528\u4f8b\u7684\u5e94\u7528\u7248\u672c\u662f\u6700\u65b0\u7684\uff0c\u4e0d\u7136\u96c6\u6210\u8fdb\u53bb\u4e4b\u540e\uff0c\u6301\u7eed\u96c6\u6210\u5c31\u4f1a\u51fa\u95ee\u9898\uff1b tag \u53f7\u600e\u4e48\u6253\uff1f \u6839\u636e\u6301\u7eed\u96c6\u6210\u7684\u8981\u6c42\u751f\u6210\uff0c\u5176\u4e2d\u5e94\u7528\u7248\u672c\u53f7\u9700\u8981\u4e0e\u9879\u76ee\u7ecf\u7406\u786e\u8ba4\u672c\u6b21\u5373\u5c06\u96c6\u6210\u7684\u5e94\u7528\u7248\u672c\u53f7\u662f\u591a\u5c11\uff1b tag \u7684 commit \u4fe1\u606f\u683c\u5f0f\uff1a # commit msg\nversion:5.6.5\n \u5176\u4e2d 5.6.5 \u5199\u5e94\u7528\u7684\u96c6\u6210\u7248\u672c\u53f7\u3002 \u751f\u6210 tag \u7684\u547d\u4ee4\u53c2\u8003\uff1a\u300aGit \u6807\u7b7e\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3-tag","title":"3. \u57fa\u7840\u6846\u67b6 tag","text":"\u57fa\u7840\u6846\u67b6 tag \u4e0d\u4e0e\u4e1a\u52a1\u6302\u94a9\uff0c\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u6309\u9700\u53d1\u5e03\u7248\u672c\uff0c\u5728\u6839\u76ee\u5f55\u4e0b CURRENT \u6587\u4ef6\u4e2d\u8bb0\u5f55\u7684\u5f53\u524d\u7248\u672c\u53f7\u548c\u5386\u53f2\u7248\u672c\u53f7\uff0c\u53ca\u5176\u5bf9\u5e94\u65b0\u589e\u4e86\u54ea\u4e9b\u529f\u80fd\uff0c\u6709\u52a9\u4e8e\u5e94\u7528\u9009\u62e9\u5408\u9002\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\u3002 # CURRENT\n[current]\ntag = 0.9.5\n \u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u7684 control \u6587\u4ef6\u8bb0\u5f55\u5f53\u524d\u5e94\u7528\u5e93\u4f9d\u8d56\u7684\u57fa\u7840\u5e93\u7248\u672c\u3002 # control\n[Depends]\nautotest-basic-frame = 0.9.5\n \u7528\u4f8b\u5728\u6267\u884c\u65f6\u4f1a\u6821\u9a8c\u4e24\u4e2a\u6587\u4ef6\u7684\u7248\u672c\u53f7\u662f\u5426\u4e00\u81f4\uff0c\u5982\u679c\u4e0d\u4e00\u81f4\uff0c\u4f1a\u6253\u5370 error \u65e5\u5fd7\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_2","title":"\u4e09\u3001\u4ed3\u5e93\u6743\u9650\u7ba1\u7406","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_1","title":"1. \u57fa\u7840\u6846\u67b6","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u4ed3\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame \u57fa\u7840\u6846\u67b6\u4e0d\u5141\u8bb8\u533f\u540d\u8bbf\u95ee\uff0c\u5982\u679c\u4f60\u767b\u5f55 gerrit \u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u8bbf\u95ee\u4ee5\u4e0a\u94fe\u63a5\uff0c\u5219\u9700\u8981\u7533\u8bf7\u8bbf\u95ee\u6743\u9650\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_1","title":"2. \u5e94\u7528\u4ed3\u5e93","text":" \u81ea\u52a8\u5316\u5e94\u7528\u4ed3\u5e93\uff1a https://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684 app_name \u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_3","title":"\u56db\u3001\u65b9\u6cd5\u7f16\u5199&\u8c03\u7528\u89c4\u8303","text":"\u65b9\u6cd5\u7f16\u5199\u6574\u4f53\u8bbe\u8ba1\u601d\u8def\u53c2\u8003\uff1a[\u300aAT\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b]"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_2","title":"1. \u65b9\u6cd5\u7f16\u5199","text":"\u5199\u65b9\u6cd5\u7684\u65f6\u5019\u6ce8\u610f\u65b9\u6cd5\u5f52\u5c5e\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget\uff0c\u65b9\u6cd5\u662f\u5728\u54ea\u4e2a\u533a\u57df\u64cd\u4f5c\u7684\uff0c\u5c31\u5199\u5728\u54ea\u4e2a\u7c7b\u91cc\u9762\u3002 \u4e3e\u4f8b\uff1a from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n\"\"\"\u70b9\u51fb\u6807\u9898\u680fxxx\"\"\"\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_2","title":"2. \u65b9\u6cd5\u8c03\u7528","text":" \u5728\u7528\u4f8b\u4e2d\u8c03\u7528\u65b9\u6cd5\uff0c\u901a\u8fc7\u8be5\u5e94\u7528\u552f\u4e00\u7684\u51fa\u53e3\u8fdb\u884c\u8c03\u7528\uff0c\u6bd4\u5982\u6587\u7ba1\uff1a class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n \u4e0d\u8981\u5728\u7528\u4f8b\u4e2d\u5355\u72ec\u53bb\u8c03\u7528 TitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u8fd9\u4e9b\u7c7b\uff0c\u5426\u5219\u540e\u671f\u7528\u4f8b\u4f1a\u53d8\u5f97\u4e0d\u597d\u7ef4\u62a4\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_4","title":"\u4e94\u3001\u7528\u4f8b\u7f16\u5199\u89c4\u8303","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_3","title":"1. \u57fa\u4e8e\u7c7b\u5199\u7528\u4f8b","text":"\u6240\u6709\u7528\u4f8b\u90fd\u5e94\u8be5\u57fa\u4e8e\u7c7b\u53bb\u5199\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001(self):\n\"\"\"\u97f3\u4e50\u542f\u52a8\"\"\"\n \u6ce8\u610f\u4ee5\u4e0b\u51e0\u70b9\uff1a \u7c7b\u540d\u4e0d\u8981\u968f\u4fbf\u53d6\uff0c\u540c\u4e00\u4e2a\u5e94\u7528\u5e94\u8be5\u4f7f\u7528\u540c\u4e00\u4e2a\u7c7b\u540d\uff0c\u7528\u4f8b\u7c7b\u540d\u79f0\u5fc5\u987b\u4ee5 Test \u5f00\u5934\uff0c\u9075\u5faa\u5927\u9a7c\u5cf0\u547d\u540d\u89c4\u8303\uff1b \u7528\u4f8b\u7c7b\u7ee7\u627f BaseCase\uff0c\u4e00\u4e2a\u5e94\u7528\u53ea\u6709\u4e00\u4e2a BaseCase \u4e00\u4e2a py \u6587\u4ef6\u91cc\u9762\u53ea\u6709\u4e00\u4e2a\u7c7b\uff0c\u6211\u4eec\u79f0\u4e3a\u4e00\u4e2a\u6d4b\u8bd5\u7c7b\uff1b \u4e00\u4e2a\u7c7b\u91cc\u9762\u53ef\u4ee5\u6709\u591a\u4e2a\u7528\u4f8b\u51fd\u6570\uff0c\u8fd9\u53d6\u51b3\u8fd9\u6761\u7528\u4f8b\u6709\u591a\u5c11\u4e2a\u6d4b\u8bd5\u70b9\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001_1(self):\n\"\"\"\u4efb\u52a1\u680f\u542f\u52a8\u97f3\u4e50\"\"\"\ndef test_music_001_2(self):\n\"\"\"\u542f\u52a8\u5668\u542f\u52a8\u97f3\u4e50\"\"\" \ndef test_music_001_3(self):\n\"\"\"\u684c\u9762\u542f\u52a8\u97f3\u4e50\"\"\"\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_3","title":"2. \u7528\u4f8b\u51fd\u6570\u89c4\u8303","text":" \u7528\u4f8b\u51fd\u6570\u4ee5 test \u5f00\u5934\uff0c\u9075\u5faa\u86c7\u5f62\u547d\u540d\u89c4\u8303\uff0c\u4e2d\u95f4\u4e3a\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0\uff0c\u540e\u9762\u52a0\u7528\u4f8b ID\uff0c\u6700\u540e\u52a0\u6d4b\u8bd5\u70b9\u5e8f\u53f7\uff0c\u5373 test_${module}_${case_id}[_${index}] \uff1b \u6bd4\u5982\uff1atest_music_001_1\uff0cindex \u4ece 1 \u5f00\u59cb\u3002 \u51fd\u6570\u529f\u80fd\u8bf4\u660e\u91cc\u9762\u5199\u7528\u4f8b\u6807\u9898\uff0c\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u6807\u9898\u5373\u53ef\uff0c\u6ce8\u610f\u7528\u4e09\u5bf9\u53cc\u5f15\u53f7\uff0c\u4e0d\u8981\u7528\u5176\u4ed6\u6ce8\u91ca\uff0c\u66f4\u4e0d\u8981\u7528\u4e95\u53f7\u6ce8\u91ca\u5199\u7528\u4f8b\u6807\u9898\uff1b \u76f4\u63a5\u590d\u5236 PMS \u7528\u4f8b \u7528\u4f8b\u6b65\u9aa4\u76f4\u63a5\u5c06 PMS \u4e0a\u7528\u4f8b\u6b65\u9aa4\u548c\u9884\u671f\u590d\u5236\u8fdb\u6765\uff0c\u7136\u540e\u8fdb\u884c\u6279\u91cf\u6ce8\u91ca\uff08ctrl + /\uff09\uff0c\u5728\u6ce8\u91ca\u7684\u57fa\u7840\u4e0a\u53bb\u5199\u7528\u4f8b\u811a\u672c\u4f1a\u66f4\u52a0\u65b9\u4fbf\u5168\u9762\uff0c\u4e5f\u6bd4\u4f60\u81ea\u5df1\u5199\u6ce8\u91ca\u66f4\u8282\u7ea6\u65f6\u95f4\uff1a \u4e3e\u4f8b\uff0cPMS \u7528\u4f8b\uff1a \u76f4\u63a5\u9009\u4e2d\u7528\u4f8b\u5185\u5bb9\uff0c\u590d\u5236\u4e0b\u6765\uff0c\u7136\u540e\u7c98\u8d34\u5230\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c\u4e2d\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\n \u4e0a\u4f8b\u4e2d\u4e95\u53f7\u6ce8\u91ca\u90e8\u5206\u5c31\u662f\u76f4\u63a5\u4ece PMS \u4e0a\u590d\u5236\u8fc7\u6765\u7684\uff0c\u5728\u6b64\u57fa\u7840\u4e0a\u5199\u7528\u4f8b\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\nmusic = DeepinMusicWidget()\nmusic.click_singer_btn_in_music_by_ui()\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\nmusic.click_icon_mode_in_music_by_ui()\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\nmusic.double_click_first_singer_in_singer_icon_view_by_ui()\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\nself.assert_xxx\n \u4f60\u770b\uff0c\u975e\u5e38\u6e05\u695a\u6bcf\u4e00\u6b65\u5728\u505a\u4ec0\u4e48\uff0c\u91cd\u70b9\u662f\u7701\u53bb\u4e86\u5199\u6ce8\u91ca\u7684\u65f6\u95f4\uff0c\u771f\u7684\u7092\u9e21\u65b9\u4fbf\u3002 \u4e0d\u5199 if __name__ == '__main__':\uff0c\u4e0d\u5199\u591a\u4f59\u7684\u4ee3\u7801\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3","title":"3. \u6570\u636e\u9a71\u52a8","text":" \u5982\u679c\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u662f\u76f8\u540c\u7684\uff0c\u53ea\u662f\u4e00\u4e9b\u53c2\u6570\u53d8\u5316\uff0c\u5c3d\u91cf\u4f7f\u7528\u6570\u636e\u9a71\u52a8\u6765\u5b9e\u73b0\u7528\u4f8b\uff1b \u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u6570\u636e\u9a71\u52a8\u7684\u6570\u636e\uff0c\u4e0d\u80fd\u56e0\u6b64\u5f15\u5165\u4f9d\u8d56\uff0c\u5c3d\u91cf\u4f7f\u7528\u4e00\u4e9b\u6807\u51c6\u5e93\u80fd\u8bfb\u53d6\u7684\u6587\u4ef6\u683c\u5f0f\uff0c\u6bd4\u5982 json\u3001ini\u3001CSV\u3001xml\u3001txt \u7b49\u6587\u4ef6\u683c\u5f0f\uff1b\u4e0d\u5efa\u8bae\u4f7f\u7528 Yaml\u3001Excel\u3001MySQL \u7b49\u6570\u636e\u683c\u5f0f\uff1b \u8bfb\u53d6\u6570\u636e\u65f6\u4e5f\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff0c\u5982\u4f7f\u7528 pandas \u5904\u7406 CSV \u5c31\u5c5e\u4e8e\u5927\u6750\u5c0f\u7528\u4e86\uff0c\u6b63\u5e38\u7684\u6570\u636e\u9a71\u52a8\u8fd8\u6ca1\u5230\u9700\u8981\u5927\u6570\u636e\u5206\u6790\u6765\u5904\u7406\u7684\u5730\u6b65\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u5728 widget/ddt/ \u76ee\u5f55\u4e0b\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5199\u6cd5\uff1a @pytest.mark.parametrize(\"value\", data)\ndef test_smb_049(self, value):\n \u4ee5\u4e0a\u8fd9\u79cd\u53c2\u6570\u5316\u7684\u5199\u6cd5\u672c\u8eab\u6ca1\u4ec0\u4e48\u95ee\u9898\uff0c\u4f46\u662f\uff0c\u8fd9\u91cc\u5fc5\u987b\u8981\u8865\u5145\u4e00\u4e2a\u6ca1\u6709\u7528\u7684\u5c0f\u77e5\u8bc6\uff1a \u5982\u679c\u53c2\u6570\u5316\u6570\u636e\u91cc\u9762\u7684\u5b57\u7b26\u4f1a\u539f\u5c01\u4e0d\u52a8\u7684\u8f93\u51fa\u5230 item.name \u91cc\u9762\uff0c\u663e\u793a\u975e\u5e38\u4e0d\u4f18\u96c5\uff0c\u800c\u4e14\u53ef\u4ee5\u4f1a\u5f15\u5165\u4e00\u4e9b\u610f\u60f3\u4e0d\u5230\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u611f\u53d7\u4e00\u4e0b\uff1a \u53c2\u6570\uff1a data = [\n\"\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\", \"qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678\",\n]\n \u73b0\u8c61\u662f\u8fd9\u6837\u8272\u513f\u7684\uff1a test_smb_049.py::TestFileManager::test_smb_049[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09]\ntest_smb_049.py::TestFileManager::test_smb_049[qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui]\ntest_smb_049.py::TestFileManager::test_smb_049[12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678]\n \u8bf4\u5b9e\u8bdd\uff0c\u770b\u7740\u5fc3\u91cc\u5835\u5f97\u614c\uff0c\u5982\u679c\u8fd9\u91cc\u9762\u5305\u542b\u4e00\u4e9b\u7279\u6b8a\u5b57\u7b26\u6216\u8005\u662f\u8d85\u957f\uff0c\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u5f88\u5947\u5999\u7684\u4e8b\u60c5\u53d1\u751f\u3002 parametrize \u91cc\u9762\u6709\u4e2a\u53c2\u6570\uff1aids\uff0c\u53ef\u4ee5\u89e3\u51b3\u6b64\u7c7b\u95ee\u9898\uff0c\u5c31\u50cf\u8fd9\u6837\uff1a @pytest.mark.parametrize(\"value\", data, ids=[1, 2, 3])\ndef test_smb_049(self, value):\n \u518d\u6765\u611f\u53d7\u4e00\u4e0b\uff1a test_smb_049.py::TestFileManager::test_smb_049[1]\ntest_smb_049.py::TestFileManager::test_smb_049[2]\ntest_smb_049.py::TestFileManager::test_smb_049[3]\n \u660e\u663e\u597d\u591a\u4e86\uff0c\u6240\u4ee5\u5c3d\u91cf\u4f7f\u7528 ids \u8fd9\u4e2a\u53c2\u6570\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 fixture \u7684\u6570\u636e\u9a71\u52a8\u65b9\u5f0f\uff0c\u6846\u67b6\u867d\u7136\u652f\u6301\uff0c\u4f46\u53ef\u8bfb\u6027\u6bd4\u8f83\u5dee\uff1b\u5982\u679c\u4f60\u4e0d\u77e5\u9053\u8fd9\u53e5\u8bdd\u5728\u8bf4\u5565\uff0c\u90a3\u4f60\u53ef\u4ee5\u5ffd\u7565\uff0c\u6211\u4e5f\u4e0d\u6253\u7b97\u8be6\u7ec6\u8bf4\u8fd9\u79cd\u5b9e\u73b0\u65b9\u5f0f\uff0c\u64cd\u4f5c\u6bd4\u8f83\u9a9a\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4","title":"4. \u65ad\u8a00\u8d44\u6e90","text":" \u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u76f4\u63a5\u653e\u5728\u7528\u4f8b\u6a21\u5757\u7684\u540c\u7ea7\u76ee\u5f55\u4e0b\u7684 assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0 + \u7528\u4f8b ID \u547d\u540d\uff1b \u56fe\u50cf\u8bc6\u522b\u65ad\u8a00\uff0c\u4e0d\u8981\u622a\u53d6\u4e00\u5f20\u5f88\u5927\u7684\u56fe\uff0c\u56fe\u7247\u8d44\u6e90\u5305\u542b\u7684\u5143\u7d20\u592a\u591a\u4e86\uff0c\u975e\u5e38\u5bb9\u6613\u53d7\u5230\u9700\u6c42\u5f71\u54cd\uff0c\u5efa\u8bae\u662f\u8fdb\u884c\u5c40\u90e8\u7684\u65ad\u8a00\uff1b \u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u5339\u914d\u5ea6\u662f 0.9\uff0c\u5982\u679c\u65ad\u8a00\u7684\u573a\u666f\u5bf9\u4e8e\u7cbe\u786e\u5ea6\u8981\u6c42\u6ca1\u90a3\u4e48\u9ad8\uff0c\u53ef\u4ee5\u5728\u65ad\u8a00\u8bed\u53e5\u91cc\u9762\u4f20\u5165\u5c0f\u4e8e 0.9 \u7684\u53c2\u6570\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5","title":"5. \u5143\u7d20\u5b9a\u4f4d","text":" \u7528\u4e8e\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u4e2d\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u547d\u540d\u4e3a\u8be5\u5143\u7d20\u7684\u540d\u79f0\uff1b \u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u622a\u53d6\u65f6\u5c3d\u91cf\u7cbe\u786e\u5230\u8fd9\u4e2a\u5177\u4f53\u7684\u6309\u94ae\uff0c\u56fe\u7247\u4e5f\u4e0d\u8981\u592a\u5927\uff1b \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u64cd\u4f5c\u8f83\u5feb\uff0c\u5408\u7406\u52a0\u5165\u7b49\u5f85\u65f6\u95f4\u80fd\u63d0\u9ad8\u7528\u4f8b\u7684\u7a33\u5b9a\u6027\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6","title":"6. \u7528\u4f8b\u8d44\u6e90","text":" \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u4f7f\u7528\u5230\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u6bd4\u5982\u97f3\u4e50\u53ef\u80fd\u9700\u8981\u4e00\u4e9b mp3 \u7684\u8d44\u6e90\u7528\u4e8e\u6d4b\u8bd5\uff0c\u5b58\u653e\u5728 widget/case_res \u76ee\u5f55\u4e0b\uff0c\u524d\u63d0\u662f\u8fd9\u4e9b\u8d44\u6e90\u4e0d\u8d85\u8fc7 10M\uff1b \u5982\u679c\u662f\u4e00\u4e9b\u6bd4\u8f83\u5927\u7684\u8d44\u6e90\uff0c\u5efa\u8bae\u653e\u5230\u7edf\u4e00\u7684 ftp \u670d\u52a1\u5668 \uff08ftp://10.8.10.245\uff09\uff0c\u9700\u8981\u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\u518d\u4e0b\u8f7d\u4e0b\u6765\uff1b f\"wget ftp://{Config.FTP_IP}/uploads/\u591a\u5a92\u4f53/\u5f71\u9662/auto/{file_name};unzip {file_name};rm -rf {file_name};\"\n \u6d4b\u8bd5\u8d44\u6e90\u4e0b\u8f7d\u5230\u5e94\u7528 widget/case_res \u76ee\u5f55\u4e0b\uff1b \u7981\u6b62\u5c06\u6d4b\u8bd5\u8d44\u6e90\u5b58\u653e\u5728\u4e2a\u4eba\u7684\u673a\u5668\u4e0a\uff1b \u5e94\u8be5\u5c3d\u91cf\u4fdd\u8bc1\uff0c\u4e00\u4e2a\u8d44\u6e90\u5728\u4e00\u6b21\u7528\u4f8b\u6267\u884c\u4e2d\u53ea\u9700\u8981\u4e0b\u8f7d\u4e00\u6b21\uff0c\u6240\u4ee5\u4f60\u4e0d\u80fd\u6bcf\u6b21\u4f7f\u7528\u7684\u65f6\u5019\u90fd\u53bb\u4e0b\u8f7d\uff0c\u8fd9\u6837\u53ef\u80fd\u4f1a\u8017\u8d39\u5927\u91cf\u7684\u7f51\u7edc\u8d44\u6e90\uff0c\u800c\u56e0\u4e3a\u5148\u5224\u65ad\u672c\u5730\u662f\u5426\u5b58\u5728\u6b64\u8d44\u6e90\uff0c\u5982\u679c\u4e0d\u5b58\u5728\u518d\u53bb\u4e0b\u8f7d\uff1b \u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u5c06\u8d44\u6e90\u62f7\u8d1d\u5230\u5bf9\u5e94\u7684\u6d4b\u8bd5\u76ee\u5f55\u4e0b\uff0c\u6bd4\u5982\u5c06 mp3 \u6587\u4ef6\u62f7\u8d1d\u5230 ~/Music \u76ee\u5f55\u4e0b\uff0c\u4f46\u662f\u6211\u4eec\u66f4\u5efa\u8bae\u4f60\u4f7f\u7528\u53d1\u9001\u5feb\u6377\u94fe\u63a5\u7684\u65b9\u5f0f\u66ff\u4ee3\u62f7\u8d1d\u7684\u64cd\u4f5c\uff0c\u56e0\u4e3a\u5728\u62f7\u8d1d\u5927\u6587\u4ef6\u65f6\u662f\u5f88\u6d88\u8017\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u800c\u521b\u5efa\u94fe\u63a5\u5219\u4e0d\u4f1a\uff1b @classmethod\ndef recovery_many_movies_in_movie_by_cmd(cls):\n\"\"\"\u6062\u590d\u591a\u4e2a\u89c6\u9891\u6587\u4ef6\u81f3\u89c6\u9891\u76ee\u5f55\u4e2d\"\"\"\nwork_path = f\"/home/{Config.USERNAME}/Videos/auto\"\ncode_path = f\"{Config.CASE_RES_PATH}/auto\"\ncls.run_cmd(f\"rm -rf {work_path};mkdir {work_path}\")\nsleep(1)\nflag = False\nif not exists(code_path):\ncls.run_cmd(f\"mkdir -p {code_path}\")\nflag = True\nlogger.info(f\"ln -s {code_path}/* {work_path}/\")\ncls.run_cmd(\nf\"cd {code_path}/;\"\nf\"{cls.wget_file('auto.zip') if flag else ''}\"\nf\"ln -s {code_path}/* {work_path}/ > /dev/null 2>&1\"\n)\n \u8d44\u6e90\u4e0b\u8f7d\u8fc7\u7a0b\u4e2d\u6ce8\u610f\u8d85\u65f6\u7684\u95ee\u9898\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u5f88\u5927\uff0c\u8981\u7279\u522b\u6ce8\u610f\u8fd9\u95ee\u9898\uff0c\u5982\u679c\u4f60\u4f7f\u7528\u5f3a\u5236\u7b49\u5f85\u4e0b\u8f7d\u7ed3\u675f( os.system )\uff0c\u53ef\u80fd\u4f1a\u9020\u6210\u7528\u4f8b\u6267\u884c\u65f6\u957f\u53d8\u5f97\u4e0d\u53ef\u63a5\u53d7\uff0c\u76ee\u524d\u6211\u4eec\u53d1\u73b0\u5728\u6301\u7eed\u96c6\u6210\u73af\u5883\u6267\u884c\u65f6\u7f51\u7edc\u4e0b\u8f7d\u901f\u5ea6\u5f88\u6162\uff0c\u6240\u4ee5\u8d85\u65f6\u673a\u5236\u662f\u5f88\u6709\u5fc5\u8981\u7684\uff1brun_cmd \u65b9\u6cd5\u6709\u4e00\u4e2a\u9ed8\u8ba4\u8d85\u65f6\u7684\u65f6\u95f4\uff0c\u4f60\u53ef\u4ee5\u6839\u636e\u8d44\u6e90\u5927\u5c0f\u5bf9\u8d85\u65f6\u65f6\u95f4\u8fdb\u884c\u8c03\u6574\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_5","title":"\u516d\u3001\u7528\u4f8b\u8c03\u8bd5\u6280\u5de7","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_4","title":"1. \u65e5\u5fd7","text":" \u4e00\u5b9a\u8981\u5148\u770b\u62a5\u9519\uff0c\u770b error \u65e5\u5fd7\uff0c\u901a\u5e38\u80fd\u660e\u786e\u7684\u544a\u8bc9\u4f60\u5177\u4f53\u54ea\u91cc\u4ee3\u7801\u62a5\u9519\uff1b \u7ed3\u5408\u62a5\u9519\u70b9\u524d\u9762\u7684error\u3001 info \u548c debug \u65e5\u5fd7\u770b\u5426\u662f\u6b63\u5e38\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_4","title":"2. \u65ad\u70b9\u8c03\u8bd5","text":" \u65b9\u6cd5\u62a5\u9519\uff1a \u5728\u65b9\u6cd5\u5e93\u4e2d\u627e\u5230\u5bf9\u5e94\u7684\u65b9\u6cd5\uff0c\u5355\u72ec\u8c03\u7528\uff0c\u770b\u662f\u5426\u80fd\u6b63\u5e38\u6267\u884c\uff1b \u901a\u5e38\u5355\u4e2a\u65b9\u6cd5\u7684\u6267\u884c\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u62a5\u9519\uff0c\u5f88\u5feb\u5c31\u80fd\u6392\u67e5\u51fa\u95ee\u9898\uff1b\u5728\u65b9\u6cd5\u5185\u90e8\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u65b9\u6cd5\u5185\u90e8\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u8c03\u7528\u6ca1\u95ee\u9898\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u62a5\u9519\u7684\u65b9\u6cd5\u524d\u9762\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u7528\u4f8b\u7684\u4e1a\u52a1\u903b\u8f91\u548c\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u65ad\u8a00\u62a5\u9519\uff1a \u65ad\u8a00\u4e3a\u6570\u636e\u65ad\u8a00\uff0c\u6839\u636e\u8868\u8fbe\u5f0f\u8fdb\u884c\u65ad\u8a00\u8bed\u53e5\u8fdb\u884c\u4fee\u6539\uff1b \u6587\u4ef6\u751f\u6210\u7c7b\u65ad\u8a00\uff0c\u67e5\u770b\u662f\u5426\u9700\u8981\u52a0\u7b49\u5f85\u65f6\u95f4\uff1b \u56fe\u50cf\u65ad\u8a00\uff0c\u5728\u65ad\u8a00\u8bed\u53e5\u5904\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u7528\u4f8b\u8fd0\u884c\u5230\u65ad\u8a00\u5904\u4f1a\u505c\u6b62\uff0c\u67e5\u770b\u6b64\u65f6\u65ad\u8a00\u7684\u56fe\u7247\u4e0e\u7528\u4f8b\u6267\u884c\u7684\u73b0\u573a\u5b58\u5728\u4ec0\u4e48\u5dee\u5f02\uff0c\u6b64\u65f6\u4e5f\u53ef\u4ee5\u8fdb\u884c\u91cd\u65b0\u622a\u56fe\uff0c\u4ece\u800c\u66ff\u6362\u65b0\u7684\u56fe\u7247\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3_1","title":"3. \u8fdc\u7a0b\u6267\u884c","text":" \u8fdc\u7a0b\u6267\u884c\u6307\u7684\u662f\u7f16\u8f91\u5668\u901a\u8fc7\u6307\u5b9a\u8fdc\u7a0b\u89e3\u91ca\u5668\u6267\u884c\u81ea\u52a8\u5316\u4ee3\u7801\uff1b \u8fdc\u7a0b\u6267\u884c\u7684\u597d\u5904\u662f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u7684 Debug \u8fd0\u884c\uff0c\u4e0d\u7528\u5728\u6d4b\u8bd5\u673a\u4e0a\u6253\u5f00\u7f16\u8f91\u5668\uff0c\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u66f4\u5feb\uff1b \u652f\u6301\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u7684\u7f16\u8f91\u5668\uff1a \u4e13\u4e1a\u7248 Pycharm VScode \uff0c\u9700\u8981\u4f7f\u7528\u63d2\u4ef6 Remote-SSH \u8fdc\u7a0b\u6267\u884c\u914d\u7f6e \u4ee5 Pycharm \u4e3a\u4f8b\uff1a File \u2014> Settings \u2014> Project \u2014> Python Interpreter \u2014> \u53f3\u8fb9\u8bbe\u7f6e\u6309\u94ae \u2014> Add... \u2014> SSH Interpreter \u2014> New server configuration(\u586b\u5165host\u548cusername) \u2014> Next \u2014> password\uff08\u6d4b\u8bd5\u673a\u5bc6\u7801\uff09 \u2014> Interpreter(\u9009\u62e9\u8fdc\u7a0b\u89e3\u91ca\u5668) \u2014> Finish "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4_1","title":"4. \u73af\u5883\u6e05\u7406","text":" \u5982\u679c\u7528\u4f8b\u91cc\u9762\u7684 teardown \u6ca1\u6709\u6267\u884c\uff0c\u5927\u6982\u7387\u662f\u56e0\u4e3a setup \u91cc\u9762\u4ee3\u7801\u62a5\u9519\uff0c\u8fd9\u4e24\u4e2a\u662f\u4e00\u5bf9\u7684\uff0csetup \u91cc\u9762\u62a5\u9519\uff0cteardown \u91cc\u9762\u7684\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\uff1b \u76ee\u524d\u6211\u4eec\u5df2\u7ecf\u5c06\u5404\u5e94\u7528\u7684 clean_all \u8fd9\u4e2a fixture \u6539\u6210\u4e86\u7ec8\u7ed3\u5668\uff0c\u786e\u4fdd\u59cb\u7ec8\u80fd\u6267\u884c\u5230\u8fd9\u6b65\uff0c\u4f46\u662f\u7528\u4f8b\u91cc\u9762\u7684 fixture\uff0c\u8fd8\u662f\u9700\u8981\u6211\u4eec\u5c0f\u5fc3\u5904\u7406\uff1b \u8981\u6267\u884c clean_all \u9700\u8981\u5728\u7f16\u8f91\u5668\u8fd0\u884c\u53c2\u6570\u52a0 --clean yes\uff0c\u5199\u7528\u4f8b\u7684\u65f6\u5019\u8bf7\u52a0\u4e0a\uff0c\u4e0d\u7136\u4f60\u4e0d\u786e\u5b9a\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u7684\u73af\u5883\u662f\u5426\u6062\u590d\uff1b setup \u53ef\u4ee5\u4e0d\u8981\uff0c\u5c06 setup \u653e\u5230\u7528\u4f8b\u91cc\u9762\u662f\u4e00\u79cd\u7a33\u59a5\u7684\u505a\u6cd5\uff0cteardown \u4e00\u5b9a\u8981\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5_1","title":"5. \u5143\u7d20\u5b9a\u4f4d\u4e0d\u51c6\uff08\u5750\u6807\u8fd4\u56de\u4e0d\u5bf9\uff09","text":" \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u53ef\u80fd\u53d7\u5230\u7a97\u53e3 ID \u7684\u53d8\u5316\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u9ed8\u8ba4\u53d6\u6700\u65b0\u7684\u4e00\u4e2a\u7a97\u53e3\u7528\u4e8e\u5b9a\u4f4d\uff0c\u4f46\u5982\u679c\u5b9e\u9645\u9700\u8981\u5b9a\u4f4d\u7684\u4e0d\u662f\u6700\u65b0\u7684\u7a97\u53e3\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u91cd\u65b0\u5b9e\u4f8b\u5316\u65b9\u6cd5\u7c7b\u5bf9\u8c61\uff0c\u5e76\u5728\u7c7b\u4e2d\u4f20\u5165\u5bf9\u5e94\u7684\u7a97\u53e3\u5e8f\u53f7\uff1b \u57fa\u4e8e\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u76ee\u524d\u9047\u5230\u7684\u7b14\u8bb0\u672c\u4e0a\uff0c\u7531\u4e8e\u5c4f\u5e55\u7f29\u653e\u6bd4\u4f8b\u4e3a 1.25\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u6211\u4eec\u9ed8\u8ba4\u4f7f\u7528\u7f29\u653e\u6bd4\u4f8b\u4e3a 1\uff1b \u57fa\u4e8e\u56fe\u50cf\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u76ee\u6807\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b \u57fa\u4e8e OCR \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u6587\u5b57\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u540c\u6837\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6_1","title":"6. \u952e\u9f20\u64cd\u4f5c\u4e0d\u51c6","text":" \u9f20\u6807\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6bd4\u5982\u53f3\u952e\u3001\u53cc\u51fb\u65e0\u54cd\u5e94\uff1b \u952e\u76d8\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6216\u8005\u5ef6\u8fdf\u8f93\u5165\uff0c\u6bd4\u5982\u7528\u4f8b\u9700\u8981\u8f93\u5165\u201c\u6211\u662f\u4e2d\u56fd\u4eba\u201d\uff0c\u5b9e\u9645\u53ea\u8f93\u5165\u4e86\u201c\u6211\u56fd\u4eba\u201d\uff1b \u4ee5\u4e0a\u95ee\u9898\u6392\u9664\u5e94\u7528\u5361\u987f\u7b49\u95ee\u9898\uff0c\u5927\u6982\u7387\u662f\u7531\u4e8e\u5de5\u5177\u7684\u95ee\u9898\uff0c\u76ee\u524d\u952e\u9f20\u64cd\u4f5c\u6211\u4eec\u4f7f\u7528\u4e09\u4e2a\u5de5\u5177\uff1aDogtail \u63d0\u4f9b\u7684\u952e\u9f20\u5de5\u5177\u3001PyAutoGUI\u3001Xdotool \uff1b \u6709\u540c\u5b66\u53ef\u80fd\u8981\u8bf4\u4e3a\u5565\u8981\u7528\u4e09\u4e2a\u554a\uff0c\u7528\u4e00\u4e2a\u4e0d\u5c31\u597d\u4e86\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u5404\u6709\u4f18\u70b9\u5404\u6709\u7f3a\u70b9\u3002 \u5982\u679c\u4f60\u9047\u5230\u952e\u9f20\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u8bd5\u8bd5\u901a\u8fc7\u4e0d\u540c\u7684\u5de5\u5177\u64cd\u4f5c\uff1b\u952e\u76d8\u8f93\u5165\u5ef6\u8fdf\u7684\u95ee\u9898\uff0c\u4e00\u822c\u662f\u56e0\u4e3a\u8f93\u5165\u901f\u5ea6\u592a\u5feb\u4e86\uff0c\u7cfb\u7edf\u6ca1\u53cd\u5e94\u8fc7\u6765\uff0c\u5e38\u89c1\u4e8e ARM \u548c MIPS \u4e0a\uff0c\u4fee\u6539\u53c2\u6570 delay_time \u7684\u503c\uff0c\u5355\u4f4d\u4e3a\u6beb\u79d2\uff1b # mouse_key.py\n@classmethod\ndef input_message(cls, message, delay_time=300, interval=0.2):\n\"\"\"\n \u8f93\u5165\u5b57\u7b26\u4e32\n :param message: \u8f93\u5165\u7684\u5185\u5bb9\n :param delay_time: \u5ef6\u8fdf\u65f6\u95f4\n :param interval:\n :return:\n \"\"\"\n \u5982\u679c\u4e0d\u662f\u65b9\u6cd5\u7684\u95ee\u9898\uff0c\u5219\u9700\u8981\u7ee7\u7eed\u548c\u5f00\u53d1\u4e00\u8d77\u6392\u9664\uff0c\u662f\u5426\u4e3a\u5e94\u7528\u63a5\u53d7\u952e\u9f20\u4fe1\u53f7\u5904\u7406\u7684\u95ee\u9898\uff0c\u8fd9\u7c7b\u60c5\u51b5\u6211\u4eec\u4e5f\u662f\u9047\u5230\u8fc7\u7684\uff0c\u5177\u4f53\u95ee\u9898\u5177\u4f53\u5206\u6790\u3002 \u6bd4\u5982\u5f71\u9662\u5c31\u91cd\u5199\u4e86\u4e00\u4e2a\u53f3\u952e\u7684\u65b9\u6cd5\uff1a # base_widget.py\n@classmethod\ndef right_click(cls, _x=None, _y=None):\n\"\"\"\n \u91cd\u5199\u5e95\u5c42\u5355\u51fb\u9f20\u6807\u53f3\u952e\n \u89e3\u51b3\u5f71\u9662\u53f3\u952e\u89e6\u53d1release\u4e8b\u4ef6\u7684\u95ee\u9898\uff08\u53f3\u952e\u4e3b\u7a97\u53e3\u4f1a\u64ad\u653e\u89c6\u9891\uff09\n \"\"\"\ncls.mouse_down(_x, _y, button=3)\nsleep(0.1)\ncls.mouse_up(button=3)\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_6","title":"\u4e03\u3001\u5176\u4ed6\u4e0d\u4e3a\u4eba\u77e5\u7684\u7ec6\u8282","text":" \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u5c3d\u91cf\u7f16\u5199\u540c\u4e00\u4e2a\u5e94\u7528\u6216\u6a21\u5757\u7684\u7528\u4f8b\uff0c\u80fd\u5bf9\u8be5\u7528\u4f8b\u5df2\u6709\u65b9\u6cd5\u719f\u6089\uff0c\u907f\u514d\u8fc7\u591a\u91cd\u590d\u4e1a\u52a1\u4ee3\u7801\u7684\u5c01\u88c5\uff1b \u76f8\u540c\u7684\u573a\u666f\u4e0b\uff0c\u5404\u67b6\u6784\u7b49\u5f85\u65f6\u95f4\u4e0d\u540c\uff0c\u5efa\u8bae\u4f7f\u7528\u6846\u67b6\u63d0\u4f9b\u7684 sleep\uff0c\u6211\u4eec\u505a\u4e86\u4e0d\u540c\u67b6\u6784\u7684\u500d\u6570\u653e\u5927\uff1b \u7f16\u5199\u7528\u4f8b\u65f6\uff0c\u5c3d\u91cf\u8003\u8651\u5230\u6bcf\u4e00\u6b65\u5f02\u5e38\u540e\u7684\u73af\u5883\u6062\u590d\uff0c\u9700\u8981\u5efa\u8bae\u8fd9\u79cd\u610f\u8bc6\uff0c\u968f\u65f6\u8981\u8003\u8651\u5230\uff0c\u8fd9\u6b65\u64cd\u4f5c\u6709\u6ca1\u6709\u53ef\u80fd\u51fa\u9519\uff0c\u51fa\u9519\u4e86\u6539\u600e\u4e48\u529e\uff1b \u63d0\u4ea4\u4ee3\u7801\u7684\u65f6\u5019\u6ce8\u610f\u4e0d\u8981\u628a\u4e00\u4e9b\u4e34\u65f6\u7684\u6d4b\u8bd5\u8d44\u6e90\u63d0\u4ea4\u8fdb\u53bb\u4e86\uff0c\u6bd4\u5982\u6d4b\u8bd5\u4e86\u4e00\u4e2a\u5f71\u7247\uff0c\u6709\u4e9b\u540c\u5b66\u4e60\u60ef\u4f7f\u7528 git add . \uff0c\u7136\u540e\u5c31\u5168\u90e8\u63d0\u4ea4\u5230\u4ee3\u7801\u4ed3\u5e93\u4e86\uff0c\u8fd9\u6837\u5373\u4f7f\u540e\u671f\u628a\u5927\u6587\u4ef6\u5220\u4e86\uff0c.git \u6587\u4ef6\u91cc\u9762\u4e5f\u4f1a\u5f88\u5927\uff0c\u9020\u6210\u4ee3\u7801\u4ed3\u5e93\u53d8\u5f97\u5341\u5206\u81c3\u80bf\u3002 \u66f4\u591a\u7ec6\u8282\u67e5\u770b\uff1a\u300aAT\u7ecf\u9a8c\u603b\u7ed3\u300b"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/","title":"AT \u6267\u884c\u5668\u4f7f\u7528\u6307\u5317","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/5/25\n# Author : litao\n# =============================================\n Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1","title":"1\u3001\u529f\u80fd\u4ecb\u7ecd","text":" \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7cfb\u7edf\u8bed\u8a00\u8bbe\u7f6e\uff0c\u5206\u8fa8\u7387\u8bbe\u7f6e\u53ca\u7528\u4f8b\u6267\u884c\u73af\u5883\u642d\u5efa\uff1b \u652f\u6301 IP \u4e3a 15 \u7f51\u6bb5\u7684 AMD \u67b6\u6784\u6d4b\u8bd5\u673a\u955c\u50cf\u88c5\u673a\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u6307\u5b9a\u5e94\u7528\uff0c\u6307\u5b9a\u8303\u56f4\u6807\u7b7e\u7684\u7528\u4f8b\u6267\u884c\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u72b6\u6001\u68c0\u67e5\uff0c\u662f\u5426\u6709\u6b63\u5728\u8fd0\u884c\u7684\u6d4b\u8bd5\uff1b \u652f\u6301\u914d\u7f6e\u7528\u4f8b\u6267\u884c\u65f6\u957f\uff0c\u9632\u6b62\u4efb\u52a1\u963b\u585e\uff1b \u652f\u6301\u6839\u636e\u5e94\u7528\u7248\u672c\u81ea\u52a8\u67e5\u627e\u5bf9\u5e94\u7684\u7528\u4f8b tag\uff1b \u652f\u6301\u5f02\u5e38\u5904\u7406\u548c\u6d4b\u8bd5\u5b8c\u6210\u7684\u5b9e\u65f6\u6d88\u606f\u901a\u77e5\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2job","title":"2\u3001Job \u4ecb\u7ecd","text":"\u4ee5\u4e0b\u6309\u6267\u884c\u6d41\u7a0b\u7684\u987a\u5e8f\u4ecb\u7ecd\uff0c\u6bcf\u4e00\u6b65\u90fd\u53ef\u4ee5\u5355\u72ec\u6267\u884c\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1_1","title":"1\u3001\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/AT_test/ \u6574\u4e2a\u6d41\u7a0b\u7684\u4e3b\u5165\u53e3\uff0c\u901a\u8fc7\u8fd9\u4e2a\u5165\u53e3\uff0c\u8fde\u540c\u6574\u4e2a\u6d4b\u8bd5\u6d41\u7a0b\uff0c\u955c\u50cf\u88c5\u673a\uff0c\u73af\u5883\u90e8\u7f72\uff0c\u6d4b\u8bd5\u5e94\u7528\u53ca\u751f\u6210\u62a5\u544a\u3002 \u53c2\u6570\u4ecb\u7ecd\uff1a \u6d4b\u8bd5\u673a\uff1a\u6240\u6709\u89c4\u6574\u5230\u56fa\u5b9a\u533a\u57df\u7684\u6d4b\u8bd5\u673a\uff0c\u901a\u8fc7\u6d4b\u8bd5\u540c\u5b66\u5bf9\u6d4b\u8bd5\u673a\u7684\u4e60\u60ef\u547d\u540d\uff0c\u5728\u540e\u53f0\u6620\u5c04\u6d4b\u8bd5\u673a\u7684\u8be6\u7ec6\u4fe1\u606f\uff0c\u62ec\u53f7\u4e2d\u4e3a\u6d4b\u8bd5\u673a IP \u7684\u6700\u540e\u4e00\u4f4d\uff1b \u6d4b\u8bd5\u5e94\u7528\uff1a\u6307\u5b9a\u7684\u6d4b\u8bd5\u5e94\u7528\u7684\u5305\u540d\uff0c\u7cfb\u7edf\u6839\u636e\u540d\u79f0\u81ea\u52a8\u62c9\u53d6\u5bf9\u5e94\u7684\u4ed3\u5e93\u4ee3\u7801\uff1b deb\u5305\u4e0b\u8f7d\u5730\u5740\uff1a\u6d4b\u8bd5\u4e0a\u8ff0\u5e94\u7528\u65f6\uff0c\u9700\u8981\u5b89\u88c5\u7684deb\u5305\u4e0b\u8f7d\u5730\u5740\uff0c\u591a\u4e2a\u5730\u5740\u7528\u201c,\u201d\u9694\u5f00\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff1b \u8303\u56f4\u6807\u7b7e\uff1a\u6267\u884c\u6d4b\u8bd5\u7528\u4f8b\u7684\u6807\u7b7e\u8303\u56f4\uff0c\u5bf9\u5e94\u7528\u4f8b\u4ee3\u7801 csv \u6587\u4ef6\u4e2d\u7684\u6807\u7b7e\u4fe1\u606f\uff0c\u4ee5 pytest \u7684mark\u8bed\u6cd5\u7f16\u5199\uff1b \u7cfb\u7edf\u8bed\u8a00\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u8bed\u8a00\u73af\u5883\uff1b \u5206\u8fa8\u7387\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u5206\u8fa8\u7387\u73af\u5883\uff1b \u955c\u50cf\u5730\u5740\uff1a\u955c\u50cf\u4ed3\u5e93\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u901a\u8fc7 PXE \u88c5\u673a\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u88c5\u673a\u73af\u8282\uff08\u76ee\u524d\u4ec5\u652f\u6301\u90e8\u5206 AMD \u67b6\u6784\u7684\u88c5\u673a\uff09\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2pxe","title":"2\u3001PXE \u88c5\u673a","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/IOS_install/ \u8f93\u5165\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\uff0cIP\uff0c\u5bc6\u7801\uff0c\u955c\u50cf\u5730\u5740\u540e\uff0c\u81ea\u52a8\u88c5\u673a\uff0c\u76ee\u524d\u4ec5\u652f\u6301\u56fa\u5b9a 15 \u7f51\u6bb5\u7684\u90e8\u5206 AMD \u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#3","title":"3\u3001\u6b21\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/all_client_test/ \u8be5\u5165\u53e3\u4e0e\u4e3b\u5165\u53e3\u529f\u80fd\u57fa\u672c\u4e00\u81f4\uff0c\u53ea\u662f\u5265\u79bb\u4e86PXE\u88c5\u673a\u6d41\u7a0b\uff0c\u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7684\u6267\u884c\u6d41\u7a0b\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#4","title":"4\u3001\u73af\u5883\u90e8\u7f72","text":"Jenkins url\uff1ahttps://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/env/build?delay=0sec \u8bbe\u7f6e\u6d4b\u8bd5\u673a\u7684\u7cfb\u7edf\u8bed\u8a00\uff0c\u5206\u8fa8\u7387\u53ca\u5b89\u88c5\u6d4b\u8bd5\u6240\u9700\u7684\u4f9d\u8d56\u5305\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#5","title":"5\u3001\u53d1\u9001\u4ee3\u7801","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/send_code/ \u6839\u636e\u6d4b\u8bd5\u5e94\u7528\u540d\u79f0\uff0c\u62c9\u53d6\u5bf9\u5e94\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u5e76\u6839\u636e\u6d4b\u8bd5\u673a\u4e0a\u5e94\u7528\u7248\u672c\u5207\u6362\u5230\u5bf9\u5e94\u7684tag\u7248\u672c\uff0c\u82e5\u672a\u627e\u5230tag\u7248\u672c\uff0c\u5219\u4f7f\u7528\u6700\u65b0\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u518d\u6839\u636e\u5e94\u7528\u5e93\u4ee3\u7801\u4e2d\u914d\u7f6e\u7684\u57fa\u7840\u5e93\u7248\u672c\uff0c\u62c9\u53d6\u57fa\u7840\u5e93\u4ee3\u7801\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#6","title":"6\u3001\u7528\u4f8b\u6267\u884c","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/run_test/ \u8fd0\u884c\u6d4b\u8bd5\u673a\u4e0a\u7684\u7528\u4f8b"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/","title":"AT \u7528\u4f8b\u7b5b\u9009\u6307\u5317","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u7528\u4f8b\u7b5b\u9009\u6807\u51c6\uff0c\u662f\u6311\u9009\u5408\u9002\u7684\u6587\u672c\u7528\u4f8b\u8fdb\u884c\u81ea\u52a8\u5316\u7528\u4f8b\u8f6c\u5316\u7684\u4e00\u4e9b\u901a\u7528\u6807\u51c6\u3002 \u8fc7\u53bb\u6211\u4eec\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u5b9e\u8df5\u8fc7\u7a0b\u4e2d\uff0c\u5199\u4e86\u4e0d\u5c11\u81ea\u52a8\u5316\u7528\u4f8b\uff0c\u968f\u7740\u9700\u6c42\u7684\u8fed\u4ee3\uff0c\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u81ea\u7136\u8150\u5316\uff0c\u56e0\u800c\u9700\u8981\u5728\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\u5bf9\u81ea\u52a8\u5316\u7528\u4f8b\u8fdb\u884c\u7ef4\u62a4\uff0c\u5728\u7ef4\u62a4\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u6211\u4eec\u53d1\u73b0\uff0c\u6709\u4e9b\u7528\u4f8b\u7ef4\u62a4\u8d77\u6765\u592a\u96be\u4e86\uff0c\u8c03\u8bd5\u7528\u4f8b\u8017\u8d39\u5927\u91cf\u65f6\u95f4\uff0c\u6210\u672c\u5f88\u9ad8\u3002 \u56e0\u6b64\uff0c\u6211\u4eec\u603b\u7ed3\u4e00\u4e9b\u81ea\u52a8\u5316\u7528\u4f8b\u9009\u578b\u7684\u6807\u51c6\uff0c\u4ee5\u4f18\u5316\u540e\u7eed\u81ea\u52a8\u5316\u7528\u4f8b\u7ed3\u6784\uff0c\u671f\u5f85\u6211\u4eec\u80fd\u7f16\u5199\u51fa\u9ad8\u6548\u3001\u7a33\u5b9a\u3001\u6613\u4e8e\u7ef4\u62a4\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_1","title":"\u4e00\u3001\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u53ef\u4ee5\u5206\u4e3a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u548c\u4e13\u9879\u81ea\u52a8\u5316\u6d4b\u8bd5\uff0c\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e00\u822c\u53ea\u9488\u5bf9\u4e00\u4e9b\u5e38\u89c4\u7684\u529f\u80fd\u6d4b\u8bd5\uff0c\u5176\u4ed6\u975e\u5e38\u89c4\u529f\u80fd\u7684\u7528\u4f8b\uff0c\u5e94\u8be5\u91c7\u7528\u4e13\u9879\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u6848\uff1b \u4ee5\u4e0b\u662f\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1","title":"1. \u7a33\u5b9a\u6027\u3001\u538b\u6d4b\u7528\u4f8b","text":"\u7a33\u5b9a\u6027\u6d4b\u8bd5\u3001\u538b\u6d4b\u7528\u4f8b\u5e94\u8be5\u662f\u5c5e\u4e8e\u6027\u80fd\u76f8\u5173\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u5982\uff1a\u53cd\u590d\u591a\u6b21\u70b9\u51fb\u6309\u94ae\uff0c\u68c0\u9a8c\u5176\u529f\u80fd\u7a33\u5b9a\u6027\u3002\u56e0\u4e3a\u8fd9\u4e9b\u7528\u4f8b\u65ad\u8a00\u7684\u9884\u671f\u53ef\u80fd\u4e0d\u662f\u5f88\u660e\u786e\uff0c\u66f4\u6709\u751a\u8005\u4e0d\u9700\u8981\u65ad\u8a00\uff0c\u7528\u4f8b\u65f6\u957f\u6bd4\u8f83\u957f\uff0c\u800c\u4e14\u4e0d\u53ef\u63a7\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u76ee\u524d\u6211\u4eec\u6709\u6027\u80fd\u81ea\u52a8\u5316\u7684\u4e13\u9879\u65b9\u6848\uff0c\u4ee5\u53ca\u4e00\u4e9b\u7a33\u5b9a\u6027\u6d4b\u8bd5\u7684\u4e13\u9879\u65b9\u6848\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u6b64\u7c7b\u7528\u4f8b\u653e\u5230\u4e13\u9879\u81ea\u52a8\u5316\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2","title":"2. \u6d89\u53ca\u591a\u4e2a\u7528\u6237\u64cd\u4f5c","text":"\u5e38\u89c1\u4e0e\u6587\u7ba1\u7684\u7528\u4f8b\u4e2d\uff0c\u591a\u7528\u6237\u64cd\u4f5c\u7684\u7528\u4f8b\u4e00\u822c\u90fd\u4f1a\u6d89\u53ca\u5230\u5728\u7cfb\u7edf\u4e2d\u8fdb\u884c\u591a\u4e2a\u7528\u6237\u95f4\u7684\u5207\u6362\uff0c\u81ea\u52a8\u5316\u811a\u672c\u4e00\u822c\u662f\u8fd0\u884c\u5728\u4e00\u4e2a\u7528\u6237\u7a7a\u95f4\u4e0b\u7684\uff0c\u6240\u4ee5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u591a\u7528\u6237\u95f4\u7684\u5207\u6362\u3002 \u6b64\u7c7b\u4e0d\u5efa\u8bae\u91c7\u7528\u81ea\u52a8\u5316\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3","title":"3. \u4e0e\u5f00\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4ea4\u4e92","text":"\u6b64\u7c7b\u573a\u666f\u591a\u4e3a\u5e94\u7528\u7684\u5f02\u5e38\u573a\u666f\u6d4b\u8bd5\uff0c\u6bd4\u5982\uff1a\u590d\u5236\u5927\u6587\u4ef6\u8fc7\u7a0b\u4e2d\u6ce8\u9500\u673a\u5668\u3002 \u81ea\u52a8\u5316\u811a\u672c\u5728\u7cfb\u7edf\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4e4b\u540e\u662f\u4f1a\u505c\u6b62\u8fd0\u884c\u7684\uff1b\u6b64\u7c7b\u7528\u4f8b\u53ef\u4ee5\u505a\u81ea\u52a8\u5316\uff0c\u4f46\u662f\u540c\u6837\u9700\u8981\u505a\u4e13\u9879\u65b9\u6848\uff0c\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u7684\u5904\u7406\u903b\u8f91\u5b8c\u5168\u4e0d\u540c\u3002 \u540e\u7eed\u81ea\u52a8\u5316\u9700\u8981\u516c\u5173\u7684\u70b9\uff1a \u81ea\u52a8\u5316\u811a\u672c\u5728\u672c\u673a\u8fd0\u884c\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u81f3\u5c11\u9700\u8981\u63d0\u4f9b\u4ee5\u4e0b\u529f\u80fd\uff1a \u91cd\u542f\u4e4b\u540e\u7528\u4f8b\u80fd\u81ea\u52a8\u8fd0\u884c\uff1b\u53ef\u4ee5\u8003\u8651\u5c06\u6267\u884c\u7528\u4f8b\u5199\u6210\u4e00\u4e2a\u5f00\u673a\u81ea\u542f\u7684\u670d\u52a1\uff1b \u80fd\u8bb0\u5f55\u5173\u673a\u4e4b\u524d\u7528\u4f8b\u6267\u884c\u7684\u4f4d\u7f6e\uff0c\u91cd\u542f\u4e4b\u540e\u80fd\u4ece\u6b64\u4f4d\u7f6e\u5f00\u59cb\u6267\u884c\uff1b \u50cf\u6027\u80fd\u81ea\u52a8\u5316\u4e00\u6837\uff0c\u7531\u670d\u52a1\u7aef\u63a7\u5236\uff1b \u5b8c\u5168\u57fa\u4e8e\u56fe\u5f62\u8bc6\u522b\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u4e32\u53e3\u7ebf\u63a7\u5236\u952e\u9f20\u7a33\u5b9a\u6027\uff1b "},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4","title":"4. \u6d4b\u8bd5\u6267\u884c\u65f6\u95f4\u957f","text":"\u7528\u4f8b\u6267\u884c\u65f6\u95f4\u63a7\u5236\u57282\u5206\u949f\u4ee5\u5185\uff0c\u6781\u7aef\u60c5\u51b5\u4e0d\u8981\u8d85\u8fc75\u5206\u949f\uff0c\u6240\u6709\u7528\u4f8b\u7684\u5e73\u5747\u65f6\u957f\u5e94\u8be5\u57281\u5206\u949f\u5de6\u53f3\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u95f4\u592a\u957f\uff0c\u7f16\u5199\u7528\u4f8b\u3001\u8c03\u8bd5\u7528\u4f8b\u3001\u6267\u884c\u7528\u4f8b\u3001\u7ef4\u62a4\u7528\u4f8b\u90fd\u975e\u5e38\u7684\u8017\u65f6\uff0c\u4eba\u529b\u6210\u672c\u65f6\u95f4\u6210\u672c\u6295\u5165\u592a\u9ad8\u3002 \u4f60\u60f3\uff0c\u8fd9\u6761\u7528\u4f8b\u6267\u884c\u9700\u89815\u5206\u949f\uff0c\u90a3\u4f60\u5199\u8fd9\u6761\u7528\u4f8b\u7684\u65f6\u95f4\u4e0d\u53ef\u80fd\u4e00\u904d\u8fc7\uff0c\u5199\u7684\u8fc7\u7a0b\u4e2d\u8dd1\u4e0d\u901a\u8fd8\u5f97\u91cd\u8dd1\u81f3\u5c1115\u5206\u949f\u4e0d\u8fc7\u5206\uff0c\u5199\u5b8c\u4e86\u8fd8\u5f97\u5728\u5176\u4ed6\u67b6\u6784\u4e0a\u8c03\u8bd5\uff0c\u534a\u4e2a\u5c0f\u65f6\u8fc7\u53bb\u4e86\uff0c\u8fd9\u8fd8\u53ea\u662f\u7b2c\u4e00\u6b21\u5199\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u540e\u7eed\u5982\u679c\u7528\u4f8b\u7ef4\u62a4\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u7ecf\u5e38\u6295\u5165\u76f8\u5f53\u957f\u65f6\u95f4\uff0c\u8fd9\u6837\u5176\u5b9e\u662f\u5931\u53bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u7684\u3002\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u5c31\u5e94\u8be5\u662f\u5feb\u51c6\u72e0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5","title":"5. \u8fb9\u7f18\u6027\u6d4b\u8bd5","text":"\u6709\u4e9b\u529f\u80fd\u6a21\u5757\u672c\u8eab\u662f\u5c5e\u4e8e\u6bd4\u8f83\u8fb9\u7f18\u6027\u7684\uff0c\u5373\u6781\u5c11\u7528\u6237\u4f1a\u4f7f\u7528\u5230\u7684\u529f\u80fd\uff0c\u8fd9\u7c7b\u529f\u80fd\u6a21\u5757\u4e0d\u9700\u8981\u5927\u89c4\u6a21\u5b9e\u73b0\u81ea\u52a8\u5316\uff0c\u4e00\u4e24\u4e2a\u573a\u666f\u8986\u76d6\u57fa\u672c\u529f\u80fd\u5c31\u884c\u4e86\uff0c\u56e0\u6b64\u6211\u4eec\u5728\u6311\u9009\u6b64\u7c7b\u7528\u4f8b\u7684\u65f6\u5019\u53ef\u4ee5\u7ed3\u5408\u6574\u4e2a\u529f\u80fd\u6a21\u5757\u7684\u8986\u76d6\u60c5\u51b5\u6765\u51b3\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6","title":"6. \u9700\u8981\u4f9d\u8d56\u4eba\u5de5\u4ecb\u5165\u7684","text":"\u81ea\u52a8\u5316\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\u662f\u6ca1\u6709\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bd4\u5982\u8981\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u90a3\u4e48\u5c31\u80cc\u79bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u3002 \u6bd4\u5982\u5149\u9a71\u6a21\u5757\uff0c\u5149\u9a71\u523b\u5f55\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u4f46\u662f\u5149\u9a71\u523b\u5f55\u4e4b\u540e\u5149\u76d8\u4f1a\u5f39\u51fa\u6765\uff0c\u9700\u8981\u4eba\u5de5\u66f4\u6362\u5149\u76d8\uff0c\u518d\u624b\u52a8\u63a8\u8fdb\u5149\u9a71\u4e2d\u3002 \u8fd9\u79cd\u529f\u80fd\u6a21\u5757\u5373\u4f7f\u505a\u81ea\u52a8\u5316\uff0c\u80fd\u6d89\u53ca\u5230\u7684\u529f\u80fd\u975e\u5e38\u6709\u9650\uff0c\u800c\u4e14\u4e0d\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u6240\u4ee5\u660e\u663e\u5c31\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7","title":"7. \u96be\u4ee5\u5b9e\u73b0\u7684","text":"\u7528\u4f8b\u6240\u6d89\u53ca\u5230\u7684\u65b9\u6cd5\u5b9e\u73b0\u8d77\u6765\u53ef\u80fd\u6709\u96be\u5ea6\uff0c\u751a\u81f3\u73b0\u9636\u6bb5\u65e0\u6cd5\u5b9e\u73b0\u7684\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002 \u6bd4\u5982\u5f71\u9662\u6d4b\u8bd5\u753b\u9762\u6e05\u6670\u5ea6\u3001\u6d41\u7545\u5ea6\u3001\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u4e4b\u540e\u7684\u89c6\u9891\u662f\u5426\u5b58\u5728\u5361\u987f\u7b49\u7528\u4f8b\uff0c\u73b0\u9636\u6bb5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#8","title":"8. \u529f\u80fd\u4e0d\u7a33\u5b9a","text":"\u8fd9\u4e2a\u4e0d\u662f\u8bf4\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\uff0c\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\u4e0d\u7a33\u5b9a\u662f\u6b63\u5e38\u7684\uff0c\u8fd9\u79cd\u6211\u4eec\u53ef\u4ee5\u7b49\u5f00\u53d1\u63d0\u6d4b\u4e4b\u540e\u518d\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u3002 \u529f\u80fd\u4e0d\u7a33\u5b9a\u6307\u7684\u662f\u7528\u4f8b\u6240\u6d89\u53ca\u7684\u529f\u80fd\uff0c\u53ef\u80fd\u5b58\u5728\u591a\u79cd\u53d8\u5316\uff0c\u6bcf\u6b21\u6267\u884c\u7528\u4f8b\u53ef\u80fd\u65ad\u8a00\u7684\u9884\u671f\u90fd\u4e0d\u540c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#9","title":"9. \u52a8\u6001\u65ad\u8a00","text":"\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u76f4\u5230\u7528\u4f8b\u7ed3\u675f\uff0c\u4e00\u76f4\u662f\u4e00\u4e2a\u52a8\u6001\u53d8\u5316\u7684\u8fc7\u7a0b\uff0c\u800c\u4e14\u65e0\u6cd5\u901a\u8fc7\u5176\u4ed6\u624b\u6bb5\u505c\u4e0b\u6765\uff1b \u6bd4\u5982\uff1a\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u65f6\uff0c\u53f3\u4e0b\u89d2\u7684\u5f55\u5236\u65f6\u95f4\u662f\u4e00\u76f4\u5728\u53d8\u5316\u7684\uff0c\u7528\u4f8b\u9700\u8981\u6d4b\u8bd5\u5f55\u52361\u5206\u949f\u4e4b\u540e\uff0c\u5f55\u5236\u65f6\u95f4\u662f\u521a\u597d\u505c\u572860\u79d2\uff1b \u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fd8\u505a\u4e0d\u5230\u65f6\u95f4\u7cbe\u51c6\u63a7\u5236\uff0c\u7a0b\u5e8f\u6267\u884c\u65f6\u95f4\u662f\u6709\u6ce2\u52a8\u7684\uff0c\u800c\u4e14\u8981\u9002\u914d\u591a\u4e2a\u5e73\u53f0\uff0c\u6240\u4ee5\u6b64\u7c7b\u7528\u4f8b\u5927\u6982\u7387\u4f1a\u6267\u884c\u5931\u8d25\u3002\u7279\u522b\u662f\u5728\u6027\u80fd\u8f83\u5dee\u7684\u56fd\u4ea7\u5316\u67b6\u6784\u4e0a\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u592a\u53ef\u80fd\u7a33\u5b9a\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#10","title":"10. \u63a2\u7d22\u6027\u6d4b\u8bd5","text":"\u63a2\u7d22\u6027\u6d4b\u8bd5\u901a\u5e38\u662f\u4e00\u4e9b\u4e0d\u786e\u5b9a\u7684\u64cd\u4f5c\uff0c\u591a\u53d8\u5207\u590d\u6742\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u9884\u671f\u4e5f\u53ef\u80fd\u662f\u4e0d\u786e\u5b9a\u7684\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u9a9a\u64cd\u4f5c\u592a\u591a\u4e86\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6b64\u7c7b\u7528\u4f8b\u9002\u5408\u91c7\u7528\u624b\u5de5\u6d4b\u8bd5\uff0c\u662f\u624b\u5de5\u6d4b\u8bd5\u771f\u6b63\u7684\u4ef7\u503c\u4f53\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#11","title":"11. \u6613\u7528\u6027\u6d4b\u8bd5","text":"\u5bf9\u4e8e\u6613\u7528\u6027\u7684\u5224\u65ad\u901a\u5e38\u662f\u4e3b\u89c2\u7684\uff0c\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\u5f88\u96be\u53bb\u5b9a\u4e49\u4ec0\u4e48\u6837\u7684\u60c5\u51b5\u5bf9\u7528\u6237\u662f\u6613\u7528\u7684\uff0c\u81ea\u52a8\u5316\u9700\u8981\u6709\u660e\u786e\u7684\u53ef\u5b9e\u73b0\u7684\u9884\u671f\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_2","title":"\u4e8c\u3001\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u524d\u9762\u8bb2\u4e86\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u4e00\u4e9b\u7528\u4f8b\u60c5\u51b5\uff0c\u6709\u540c\u5b66\u5c31\u8bf4\u4e86\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\u4e0d\u7528\u8bb2\u4e86\uff0c\u5c31\u662f\u4e0d\u9002\u5408\u7684\u53cd\u9762\u3002\u6ca1\u6bdb\u75c5\u54c8\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\uff0c\u6211\u4eec\u5927\u4f53\u8fd8\u53ef\u4ee5\u5206\u4e3a\u4e24\u7c7b\uff1a \u7b2c\u4e00\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u597d\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u7b2c\u4e8c\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u4e00\u822c\uff0c\u9700\u8981\u6295\u5165\u66f4\u591a\u7cbe\u529b\u624d\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u4ee5\u4e0b\u4ecb\u7ecd\u4e00\u4e9b\u6211\u4eec\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1_1","title":"1. \u64cd\u4f5c\u76f8\u5bf9\u7b80\u5355","text":"\u7528\u4f8b\u6b65\u9aa4\u76f8\u5bf9\u8f83\u5c11\uff0c\u8fd9\u79cd\u7528\u4f8b\u901a\u5e38\u662f\u4e00\u4e9b\u8def\u5f84\u5f88\u6d45\u7684\u7528\u4f8b\uff0c\u4e00\u822c\u4e5f\u662f\u4e00\u4e9b\u57fa\u7840\u7528\u4f8b\u3002\u7528\u4f8b\u7f16\u5199\u3001\u7ef4\u62a4\u90fd\u53ef\u4ee5\u8f7b\u677e\u641e\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2_1","title":"2. \u5bb9\u6613\u5b9e\u73b0","text":"\u73b0\u6709\u6280\u672f\u662f\u53ef\u5b9e\u73b0\u7684\uff0c\u6ca1\u6709\u96be\u5ea6\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3_1","title":"3. \u7ecf\u5e38\u7528\u4e8e\u56de\u5f52\u6d4b\u8bd5","text":"\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bcf\u6b21\u56de\u5f52\u6d4b\u8bd5\u5fc5\u987b\u8981\u6267\u884c\u7684\u7528\u4f8b\uff0c\u90a3\u4e48\u8fd9\u6761\u7528\u4f8b\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u3002 \u56de\u5f52\u6d4b\u8bd5\u65f6\u6211\u4eec\u9996\u5148\u5e94\u8be5\u4fdd\u8bc1\u5e94\u7528\u5386\u53f2\u57fa\u672c\u529f\u80fd\u6b63\u5e38\uff0c\u6240\u4ee5\u90a3\u4e9b\u6bcf\u6b21\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u90fd\u8981\u6267\u884c\u7684\u7528\u4f8b\u9002\u5408\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4_1","title":"4. \u529f\u80fd\u7a33\u5b9a\u7684\u6838\u5fc3\u529f\u80fd","text":"\u6d89\u53ca\u6838\u5fc3\u529f\u80fd\u7684\u7528\u4f8b\u662f\u6700\u6700\u91cd\u8981\u7684\u7528\u4f8b\uff0c\u4e5f\u662f\u6211\u4eec\u4ea4\u4ed8\u65f6\u5fc5\u987b\u8981\u4fdd\u8bc1\u8d28\u91cf\u7684\u76f8\u5173\u529f\u80fd\uff0c\u56e0\u6b64\u5e94\u8be5\u5c3d\u53ef\u80fd\u7684\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5_1","title":"5. \u8f93\u5165\u6570\u636e\u6d4b\u8bd5","text":"\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u901a\u5e38\u662f\u68c0\u9a8c\u88ab\u6d4b\u5e94\u7528\u63a5\u53d7\u6709\u6548\u6570\u636e\u3001\u62d2\u7edd\u65e0\u6548\u6570\u636e\u7684\u80fd\u529b\u3002\u5982\uff1a\u63d0\u4ea4\u8d85\u957f\u5b57\u7b26\u4e32\u3001\u7279\u6b8a\u5b57\u7b26\u4e32\u7b49\u7b49\u3002 \u6b64\u7c7b\u7528\u4f8b\u624b\u5de5\u6d4b\u8bd5\u5f88\u96be\u6bd4\u8f83\u5168\u9762\u7684\u8986\u76d6\u5230\u6240\u6709\u7684\u8f93\u5165\u60c5\u51b5\uff0c\u4f46\u662f\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\uff0c\u6b64\u7c7b\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u90fd\u662f\u4e00\u6837\u7684\uff0c\u53d8\u5316\u7684\u4ec5\u662f\u8f93\u5165\u53c2\u6570\u548c\u65ad\u8a00\u7ed3\u679c\uff0c\u91c7\u7528\u6570\u636e\u9a71\u52a8\uff0c\u53ef\u4ee5\u8f7b\u677e\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6_1","title":"6. \u683c\u5f0f\u8986\u76d6","text":"\u539f\u56e0\u540c\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u7c7b\u7528\u4f8b\u4e00\u6837\uff0c\u591a\u79cd\u683c\u5f0f\u7684\u8986\u76d6\u4e5f\u662f\u4e00\u4e2a\u5f88\u7e41\u7410\u7684\u4e8b\u60c5\uff0c\u4ea4\u7ed9\u81ea\u52a8\u5316\u6765\u505a\u518d\u5408\u9002\u4e0d\u8fc7\u4e86\u3002 \u6bd4\u5982\u5f71\u9662\u5bf9\u5f71\u7247\u683c\u5f0f\u7684\u68c0\u67e5\u3001\u622a\u56fe\u5f55\u5c4f\u5bf9\u4fdd\u5b58\u683c\u5f0f\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7_1","title":"7. \u68c0\u67e5\u5143\u7d20\u72b6\u6001","text":"\u67e5\u770b\u88ab\u6d4b\u5e94\u7528\u7684\u5143\u7d20\u5c5e\u6027\u3002\u5982\uff1a\u56fe\u7247\u7684\u5927\u5c0f\u548c\u6392\u5217\uff1b\u6309\u94ae\u7684\u53ef\u7528\u548c\u4e0d\u53ef\u7528\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/","title":"AT \u7ecf\u9a8c\u603b\u7ed3","text":"\u6b22\u8fce\u6240\u6709\u4eba\u63d0\u4ea4\u4f60\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u9762\u7684\u4f18\u79c0\u5b9e\u8df5\u7ecf\u9a8c\uff0c\u4ee5\u5e2e\u52a9\u5927\u5bb6\u89e3\u51b3\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#1","title":"1\u3001\u7ec8\u7ed3\u5668","text":"# litaoa@uniontech.com\n \u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4 pytest \u5b9e\u73b0\u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4\u7684\u65b9\u5f0f\u6709\u4e24\u79cd\uff0cyield \u548c\u7ec8\u7ed3\u51fd\u6570\uff1b yield \u5b9e\u73b0\uff0cyield\u524d\u9762\u4e3a\u7528\u4f8b\u7684\u524d\u7f6e\u6b65\u9aa4\uff0cyield \u540e\u9762\u4e3a\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4\u3002 @pytest.fixture\ndef clean_env():\nprint(\"setup\")\nyield\nprint(\"teardown\")\n \u7ec8\u7ed3\u51fd\u6570\u5b9e\u73b0\uff0c\u4f7f\u7528 request.addfinalizer \u6ce8\u518c\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4 @pytest.fixture\ndef clean_env(request):\ndef clean():\nprint(\"teardown\")\nrequest.addfinalizer(clean)\nprint(\"setup\")\n yield\u7684\u4f18\u7f3a\u70b9\uff1a \u4f18\u70b9\uff1a\u4ee3\u7801\u7b80\u6d01\uff0c\u76f4\u89c2\uff0c\u53ef\u4f7f\u7528yield\u5728\u7528\u4f8b\u4e2d\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c \u7f3a\u70b9\uff1a\u82e5\u524d\u7f6e\u6b65\u9aa4\u4e2d\u51fa\u73b0\u9519\u8bef\uff0c\u5219\u540e\u7f6e\u6b65\u9aa4\u4e0d\u4f1a\u6267\u884c \u7ec8\u7ed3\u51fd\u6570\uff1a \u4f18\u70b9\uff1a\u524d\u7f6e\u6b65\u9aa4\u5931\u8d25\u7684\u8bdd\uff0c\u540e\u7f6e\u6b65\u9aa4\u4ecd\u4f1a\u6267\u884c\u4e14\u53ef\u4ee5\u6ce8\u518c\u591a\u4e2a\u540e\u7f6e\u6b65\u9aa4\uff08\u524d\u63d0\uff1a\u9700\u8981\u5728\u4ee3\u7801\u62a5\u9519\u4e4b\u524d\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff09\uff0c\u652f\u6301\u7075\u6d3b\u4f7f\u7528\u540e\u7f6e\u6761\u4ef6 \u7f3a\u70b9\uff1a\u4ee3\u7801\u8f83\u4e3a\u590d\u6742\uff0c\u65e0\u6cd5\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c\uff08\u672c\u4eba\u76ee\u524d\u672a\u5b9e\u73b0\uff09 \u603b\u7ed3\uff1a\u5728\u524d\u7f6e\u6b65\u9aa4\u4fdd\u8bc1\u7edd\u5bf9\u4e0d\u4f1a\u51fa\u9519\u65f6\uff0c\u4f7f\u7528yield\u66f4\u4f73\u7b80\u4fbf\uff0c\u5f53\u524d\u7f6e\u6b65\u9aa4\u6613\u51fa\u73b0\u95ee\u9898\u65f6\uff0c\u63a8\u8350\u4f7f\u7528\u7ec8\u7ed3\u51fd\u6570\u3002 \u573a\u666f\uff1a\u4fdd\u9669\u7bb1\u7528\u4f8b\uff0c\u524d\u7f6e\u6b65\u9aa4\u4e2d\u5f00\u542f\u4fdd\u9669\u7bb1\uff0c\u540e\u7f6e\u6b65\u9aa4\u5220\u9664\u4fdd\u9669\u7bb1\u3002 @pytest.fixture(scope=\"session\", autouse=True)\ndef vault_fixture(request):\nDfmWidget.reset_vault_by_cmd() # 1\u3001\u91cd\u7f6e\u4fdd\u9669\u7bb1\nDdeDockPublicWidget().close_file_manager_by_cmd() # 2\u3001\u5173\u95ed\u6587\u7ba1\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 3\u3001\u5f00\u542f\u6587\u7ba1\nvault = DfmWidget()\nvault.create_file_vault() # 4\u3001\u521b\u5efa\u4fdd\u9669\u7bb1\ndef delete_vault(): # 8\u3001\u5220\u9664\u4fdd\u9669\u7bb1\u7684\u540e\u7f6e\u6b65\u9aa4\nsleep(2)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr()\nvault = DfmWidget()\nvault.delete_file_vault()\nDfmWidget.reset_vault_by_cmd()\nDdeDockPublicWidget().close_file_manager_by_cmd()\nrequest.addfinalizer(delete_vault) # 5\u3001\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\nDdeDockPublicWidget().close_file_manager_by_cmd() # 6\u3001\u5173\u95ed\u6587\u7ba1\nsleep(1)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 7\u3001\u5f00\u542f\u6587\u7ba1\n \u4ee3\u7801\u6309\u6ce8\u91ca\u4e2d\u7684\u5e8f\u53f7\u6267\u884c\u6b65\u9aa4 \u4ee3\u7801\u5728\u6b65\u9aa41-4\u4efb\u610f\u4f4d\u7f6e\u62a5\u9519\uff0c\u5219\u4e0d\u4f1a\u6267\u884c\u6b65\u9aa48\uff0c\u56e0\u4e3a\u672a\u6267\u884c\u5230\u6b65\u9aa45\uff0c\u6b65\u9aa48\u8fd8\u672a\u6ce8\u518c \u4ee3\u7801\u5728\u6b65\u9aa46-7\u62a5\u9519\uff0c\u4ecd\u4f1a\u6267\u884c\u6b65\u9aa47\uff0c\u56e0\u4e3a\u5728\u6b65\u9aa45\u4e2d\u5df2\u7ecf\u5c06\u6b65\u9aa47\u6ce8\u518c \u53ef\u4ee5\u7075\u6d3b\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff0c\u80fd\u5b9e\u73b0\u67d0\u4e2a\u524d\u7f6e\u6b65\u9aa4\u6267\u884c\u4e4b\u540e\uff0c\u624d\u4f1a\u6267\u884c\u540e\u7f6e\u6b65\u9aa4\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#2","title":"2\u3001\u542f\u52a8\u5e94\u7528\u7684\u65b9\u5f0f","text":"# huangmingqiang@uniontech.com\n \uff081\uff09\u547d\u4ee4\u884c\u542f\u52a8 \u5728 AT \u4ee3\u7801\u4e2d\u4f7f\u7528\u547d\u4ee4\u884c\u542f\u52a8\u5e94\u7528\uff0c\u4e3e\u4f8b\uff1a os.popen(\"deepin-music\")\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f7f\u7528 ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6\uff0cdogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u3002 \uff082\uff09\u901a\u8fc7 UI \u64cd\u4f5c\u542f\u52a8 \u901a\u8fc7\u4efb\u52a1\u680f\u3001\u542f\u52a8\u5668\u3001\u684c\u9762\u7b49UI\u65b9\u5f0f\u542f\u52a8\uff0c\u6bd4\u5982\u53cc\u51fb\u6253\u5f00\u3001\u53f3\u952e\u6253\u5f00\u7b49\uff0c\u8fd9\u79cd\u64cd\u4f5c\u65b9\u5f0f\u4e0d\u5b58\u5728ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6dogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u7684\u95ee\u9898\uff0c\u4e5f\u66f4\u52a0\u7b26\u5408\u7528\u6237\u7684\u64cd\u4f5c\u884c\u4e3a\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#3","title":"3\u3001\u6587\u4ef6\u9009\u62e9\u6846\u5c5e\u6027\u5b9a\u4f4d\u5076\u73b0\u65e0\u6cd5\u627e\u5230","text":"\u6587\u4ef6\u9009\u62e9\u6846\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5728\u8c03\u7528\u6587\u4ef6\u9009\u62e9\u6846\u65f6\uff0c\u6709\u4e00\u5b9a\u7684\u6982\u7387\u51fa\u73b0\uff0c\u754c\u9762\u5df2\u7ecf\u6e32\u67d3\u51fa\u6765\u4e86\uff0c\u4f46\u662f\u5c5e\u6027\u6811\u5e76\u6ca1\u6709\u5199\u5165\uff0c\u5bfc\u81f4\u901a\u8fc7\u5c5e\u6027\u65e0\u6cd5\u627e\u5230\u5143\u7d20\uff0c\u76ee\u524d\u4e5f\u6ca1\u6709\u5f88\u597d\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u4e3a\u4e86\u7528\u4f8b\u7a33\u5b9a\u6027\uff0c\u6587\u4ef6\u9009\u62e9\u6846\u7684\u64cd\u4f5c\u5efa\u8bae\u4f7f\u7528UI\u6216\u8005\u56fe\u7247\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u53ef\u4ee5\u901a\u8fc7\u641c\u7d22\u5185\u5bb9\u56fa\u5b9a\u6587\u4ef6\u4f4d\u7f6e\u3002 # litaoa@uniontech.com\n desk = DdeDesktopPublicWidget()\n# \u9009\u62e9\u89c6\u9891\u76ee\u5f55\ndesk.click_videos_dir_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.ctrl_f()\nsleep(1)\ndesk.input_message(\"\u5143\u7d20\u540d\u79f0\")\nsleep(0.5)\ndesk.enter()\nsleep(1)\n# \u9009\u62e9\u7b2c\u4e00\u4e2a\u6587\u4ef6\ndesk.click_list_view_btn_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.click_first_file_in_desktop_plugs_by_ui()\nsleep(1)\n# \u6587\u7ba1\u63d2\u4ef6\u4e2d\u70b9\u51fb\u6253\u5f00\ndesk.click_open_btn_in_desktop_plugs_by_ui()\n"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#4","title":"4\u3001\u5e94\u7528\u542f\u52a8","text":"# mikigo\n \u5728UI\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u4e00\u5207\u64cd\u4f5c\u7684\u90fd\u662f\u4ece\u5e94\u7528\u542f\u52a8\u5f00\u59cb\u7684\uff0c\u800c\u5728Linux\u684c\u9762\u5e94\u7528\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u6211\u4eec\u542f\u52a8\u5e94\u7528\u7684\u65b9\u6cd5\u6709\u591a\u79cd\uff0c\u4e0b\u9762\u505a\u4e00\u4e2a\u7b80\u5355\u7684\u4ecb\u7ecd\uff1a \u3010\u4f7f\u7528dogtail\u542f\u52a8\u3011 dogtail\u63d0\u4f9b\u4e86\u5e94\u7528\u542f\u52a8\u7684\u65b9\u6cd5\uff0c\u5728utils\u5e93\u4e2d\uff0c\u4f7f\u7528run\u65b9\u6cd5\u542f\u52a8\uff1a \u9996\u5148\u5bfc\u5165\u65b9\u6cd5\uff1a from dogtail.utils import *\n \u8c03\u7528run\u65b9\u6cd5 run('deepin-music')\n \u5373\u53ef\u542f\u52a8\u97f3\u4e50 \u8fd9\u79cd\u65b9\u6cd5\u7684\u4f18\u70b9\u662f\u91c7\u7528\u8fdb\u7a0b\u7684\u65b9\u5f0f\u76f4\u63a5\u542f\u52a8\uff0c\u4e0d\u4f9d\u8d56\u4e0eUI\uff0c\u65e0\u8bba\u684c\u9762\u6216\u4efb\u52a1\u680f\u4e0a\u662f\u5426\u5b58\u5728\u5e94\u7528\u56fe\u6807\uff0c\u90fd\u53ef\u4ee5\u6b63\u5e38\u542f\u52a8\u3002 \u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c \u5982\u679c\u4f7f\u7528ssh\u8fdc\u7a0b\u8c03\u7528\uff0c\u6216\u8005Jenkins\u4e2d\u6267\u884c\u6d4b\u8bd5\u811a\u672c\u7684\u65f6\u5019\uff0c\u5728sniff\u4e2d\u4f1a\u51fa\u73b0\u627e\u4e0d\u5230\u5e94\u7528\uff0c\u7ecf\u8fc7\u5206\u6790\uff0c\u53ef\u80fd\u662f\u56e0\u4e3a\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\u542f\u52a8\u7684\u65f6\u5019\uff0c\u5b9e\u9645\u662f\u91c7\u7528\u4e00\u4e2a\u5b50\u8fdb\u7a0b\u542f\u52a8\u4e86\u5e94\u7528\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u5230\u3002 \u3010\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u3011 \u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807 \u901a\u5e38\u6709\u4e24\u79cd\u65b9\u6cd5\uff1a \uff081\uff09\u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807\u3002 \uff082\uff09\u5df2\u77e5\u5e94\u7528\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u7684\u4f4d\u7f6e\uff0c\u7136\u540e\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u5bf9\u5e94\u5750\u6807\u3002 \u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u7f3a\u70b9\u662f\u4f4d\u7f6e\u5fc5\u987b\u56fa\u5b9a\uff0c\u5982\u679c\u79fb\u52a8\u4f4d\u7f6e\u5c31\u4e0d\u884c\u4e86\uff0c\u800c\u4f7f\u7528\u7b2c\u4e00\u79cd\u65b9\u6cd5\uff0c\u65e0\u8bba\u4f4d\u7f6e\u5728\u54ea\u91cc\uff0c\u53ea\u8981\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u5b58\u5728\u5373\u53ef\u3002 \u3010\u70b9\u51fb\u684c\u9762\u56fe\u6807\u542f\u52a8\u3011 \u684c\u9762\u56fe\u6807\u76ee\u524d\u662f\u91c7\u7528\u56fe\u50cf\u8bc6\u522b\u6280\u672f\uff0c\u5b9a\u4f4d\u5230\u5e94\u7528\u56fe\u6807\u7684\u5750\u6807\uff0c\u7136\u540e\u901a\u8fc7pyauogui\u8fdb\u884c\u70b9\u51fb\u64cd\u4f5c\u3002 \u8be6\u7ec6\u6280\u672f\u65b9\u6848\u53ef\u4ee5\u53c2\u8003\u6211\u7684\u53e6\u5916\u4e24\u7bc7\u535a\u5ba2: \u57fa\u4e8eopencv\u7684\u6a21\u677f\u5339\u914d\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd4\u56de\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 Python\u4e09\u65b9\u5e93PyAutoGui\u7684\u4f7f\u7528\u65b9\u6cd5 \u3010\u4ece\u542f\u52a8\u5668\u542f\u52a8\uff08\u4fd7\u79f0\u5f00\u59cb\u83dc\u5355\uff09\u3011 \u542f\u52a8\u4e2d\u542f\u52a8\u7684\u5b9e\u73b0\u903b\u8f91\u5b9e\u9645\u548c\u4efb\u52a1\u680f\u4e0a\u542f\u52a8\u5dee\u4e0d\u591a\u3002 \u9996\u5148\uff0c\u9700\u8981\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u542f\u52a8\u5668\u56fe\u6807\uff0c\u6216\u8005\u952e\u76d8super\u952e\uff0c\u5c06\u542f\u52a8\u5668\u547c\u51fa\u6765\uff0c \u7136\u540e\uff0c\u5728\u542f\u52a8\u5668\u4e2d\u70b9\u51fb\u5bf9\u5e94\u7684\u56fe\u6807\uff0c \u4f46\u662f\u8fd9\u91cc\u6709\u4e2a\u95ee\u9898\uff0c\u542f\u52a8\u5668\u4e2d\u7684\u5e94\u7528\u5217\u8868\uff0c\u4e00\u9875\u5c55\u793a\u4e0d\u5b8c\uff0c\u6240\u4ee5\u5982\u679c\u6211\u4eec\u8981\u70b9\u51fb\u7684\u5e94\u7528\u56fe\u6807\u4e0d\u5728\u7b2c\u4e00\u9875\u600e\u4e48\u529e\uff0c\u901a\u5e38\u89e3\u51b3\u65b9\u6848\u6709\u4e24\u79cd\uff1a \uff081\uff09\u9700\u8981\u8fdb\u884c\u5411\u4e0b\u6ed1\u52a8\uff0c\u8fd9\u91cc\u5c31\u6d89\u53ca\u5230\u76f8\u5e94\u7684\u8bc6\u522b\u65b9\u6848\uff0c\u5224\u65ad\u5982\u679c\u4e0d\u5728\u7b2c\u4e00\u9875\u5c31\u5f80\u4e0b\u6ed1\u52a8\u7ffb\u9875\u3002 \uff082\uff09\u542f\u52a8\u5668\u63d0\u4f9b\u641c\u7d22\u7684\u529f\u80fd\uff0c\u8f93\u5165\u5e94\u7528\u540d\u79f0\u641c\u7d22\uff0c\u7136\u540e\u8fdb\u884c\u70b9\u51fb\u3002 \u4ece\u5b9e\u9645\u64cd\u4f5c\u4e2d\u6765\u770b\uff0c\u91c7\u7528\u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u6548\u7387\u4f1a\u9ad8\u4e00\u70b9\u3002 \u3010\u7ec8\u7aef\u547d\u4ee4\u542f\u52a8\u3011 \u5728python\u4e2d\uff0c\u4f7f\u7528os.popen()\u6216os.system()\u6216\u8005subprocess.Popen()\uff0c\u5b9e\u73b0\u547d\u4ee4\u884c\u542f\u52a8\uff0c\u6bd4\u5982\uff1a import os\nos.popen('deepin-music')\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u8fdc\u7a0b\u6267\u884c\u811a\u672c\u7684\u65f6\u5019\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u7684\u95ee\u9898\u3002 \u3010\u603b\u7ed3\u3011 \u4ee5\u4e0a\u51e0\u79cd\u65b9\u6cd5\uff0c\u5404\u6709\u4f18\u7f3a\u70b9\uff0c\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff1a \uff081\uff09\u5982\u679c\u9700\u8981\u5728Jenkins\u4e2d\u505a\u6301\u7eed\u96c6\u6210\uff0c\u5efa\u8bae\u4f7f\u7528\u7b2c\u4e8c\u79cd\u4efb\u52a1\u680f\u542f\u52a8\u7684\u65b9\u6cd5\u3002 \uff082\uff09\u5982\u679c\u4e0d\u4f1a\u91c7\u7528\u8fdc\u7a0b\u6267\u884c\u7684\uff0c\u5efa\u8bae\u91c7\u7528\u7b2c\u4e00\u79cd\u6216\u8005\u6700\u540e\u4e00\u79cd\u65b9\u6848\u3002 \uff083\uff09\u7b2c\u4e09\u79cd\u548c\u7b2c\u56db\u79cd\u542f\u52a8\u65b9\u6cd5\uff0c\u901a\u5e38\u5728\u6d4b\u8bd5\u7528\u4f8b\u4e2d\u4f1a\u6d89\u53ca\u5230\uff0c\u6240\u4ee5\u5076\u5c14\u4f1a\u7528\u3002"},{"location":"RELEASE/","title":"\u7248\u672c\u66f4\u65b0\u8bb0\u5f55","text":""},{"location":"RELEASE/#2122023822","title":"2.1.2\uff082023/8/22\uff09","text":"new \u589e\u52a0 OCR \u8bc6\u522b\u81ea\u52a8\u91cd\u8bd5\u673a\u5236\uff0c\u9ed8\u8ba4\u91cd\u8bd5 2 \u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u91cd\u8bd5\u6b21\u6570\uff1b \u4f7f\u7528\u7a97\u7ba1\u6700\u65b0\u63d0\u4f9b\u7684\u4e8c\u8fdb\u5236\u63a5\u53e3\uff0c\u4f18\u5316\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u5728 Wayland \u4e0b\u83b7\u53d6\u7a97\u53e3\u4fe1\u606f\u7684\u65b9\u6cd5\uff1b\u611f\u8c22\u684c\u9762\u6d4b\u8bd5\u90e8 @\u4f55\u6743 @\u5b59\u7fe0 \u3001\u7a97\u7ba1\u7814\u53d1 @\u9ec4\u6cfd\u94ed \u7684\u5927\u529b\u652f\u6301\u3002 \u6269\u5145 skipif \u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\u51fd\u6570\uff1a skipif_xdg_type \u652f\u6301 x11 \u6216 wayland \u4e0a\u8df3\u8fc7\uff1b skipif_cpu_name \u652f\u6301\u4e0d\u540c cpu \u4e0a\u8df3\u8fc7\uff0c\u6bd4\u5982\uff1askipif_cpu_name-KLVVW5821\uff1b "},{"location":"RELEASE/#2102023818","title":"2.1.0\uff082023/8/18\uff09","text":"fix \u4fee\u590d SW \u67b6\u6784\u73af\u5883\u4f9d\u8d56\u7684\u95ee\u9898\uff0c\u539f\u56e0\u662f\u4e4b\u524d\u6211\u8fd9\u91cc\u672c\u5730\u6ca1\u6709 SW \u7684\u673a\u5668\uff0c\u6ca1\u6709\u505a\u76f8\u5173\u9002\u914d\uff1b \u4fee\u590d\u5b50\u9879\u76ee\u5355\u72ec\u9700\u8981\u4e09\u65b9\u5305 pexpect\uff0c\u7531\u4e8e\u4e4b\u524d\u662f\u9884\u88c5\u5230\u955c\u50cf\u91cc\u9762\u7684\uff0c\u4f46\u57fa\u7840\u6846\u67b6\u4e0d\u9700\u8981\uff0c\u56e0\u6b64\u6ca1\u6709\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u91cc\u9762\uff0c\u5bfc\u81f4\u5b50\u9879\u76ee\u4f9d\u8d56\u62a5\u9519\u3002 \u4fee\u590d\u5b50\u9879\u76ee cv \u5bfc\u5165\u62a5\u9519\u7684\u95ee\u9898\uff1b \u539f\u56e0\u4e3a\uff1ayouqu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u517c\u5bb9\u4e24\u79cd\u60c5\u51b5\uff0c\u4e00\u79cd\u662f\u9762\u5411\u670d\u52a1\uff0c\u5c31\u662f\u672c\u5730\u6d4b\u8bd5\u673a\u4e0d\u9700\u8981\u5b89\u88c5 OpenCV\uff0c\u7528\u4f8b\u4e2d\u7684\u56fe\u50cf\u8bc6\u522b\u4f1a\u901a\u8fc7\u8fdc\u7a0b\u670d\u52a1\u63a5\u53e3\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u548c\u7ed3\u679c\u83b7\u53d6\uff1b\u7b2c\u4e8c\u79cd\u662f\u539f\u751f\uff0c\u5c31\u662f\u672c\u5730\u76f4\u63a5\u5b89\u88c5 OpenCV \u76f4\u63a5\u7528\u3002\u4e24\u4e2a\u60c5\u51b5\u7684\u4f18\u5148\u7ea7\u662f\u4f18\u5148\u5224\u65ad\u672c\u5730\u5b58\u5728\uff0c\u5426\u5219\u8d70\u670d\u52a1\u3002 \u524d\u9762\u6211\u4eec\u5df2\u7ecf\u628a OCR \u529f\u80fd\u505a\u4e86\u670d\u52a1\u5316\uff0c\u57fa\u4e8e 1 \u5e74\u591a\u4ee5\u6765\u7684\u89c2\u5bdf\uff0c\u7528\u8d77\u6765\u5f88\u7a33\u5b9a\uff0c\u518d\u4e00\u4e2a\u5c31\u662f OpenCV \u5b89\u88c5\u5305\u662f\u6bd4\u8f83\u81c3\u80bf\u7684\uff0c\u7c97\u7565\u6570\u4e86\u4e0b\u4f9d\u8d56\u6709 30+ \u4e2a\uff0c\u800c\u4e14\u5728\u5404\u67b6\u6784\u4e0a\u4f9d\u8d56\u5305\u8fd8\u4e0d\u5c3d\u76f8\u540c\uff0c\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u65b9\u6848\u4e2d\u4e0d\u592a\u597d\u5904\u7406\uff0c\u6240\u4ee5\u672c\u6b21 2.0 \u7248\u672c\u6211\u4eec\u5927\u80c6\u7684\u5c06\u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u529f\u80fd\u4fee\u6539\u4e3a\u9762\u5411\u670d\u52a1\u7684\u65b9\u5f0f\uff0c\u524d\u671f\u6d4b\u8bd5\u4e00\u5207\u770b\u8d77\u6765\u90fd\u5f88\u548c\u8c10\u3002 \u4f46\u662f\u6ca1\u6ce8\u610f\u5230\u4e4b\u524d\u7ed9\u6d77\u71d5\u59d0\u90a3\u8fb9\u9879\u76ee\u5355\u72ec\u5b9a\u5236\u505a\u4e86\u4e2a\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\uff08\u4e3a\u4e86\u80fd\u7b80\u5355\u5e73\u6ed1\u7684\u8fc1\u79fb\u5230 youqu\uff09\uff0c\u6b64\u63a5\u53e3\u5e95\u5c42\u6ca1\u6709\u517c\u5bb9\u670d\u52a1\u5316\uff0c\u6240\u4ee5\u5979\u90a3\u8fb9\u7684\u9879\u76ee\u8c03\u7528\u6b64\u5b9a\u5236\u63a5\u53e3\u4f1a\u62a5 cv \u5bfc\u5165\u7684\u95ee\u9898\u3002 \u7531\u4e8e\u5c06\u8fd9\u4e2a\u5b9a\u5236\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\u8fdb\u884c\u670d\u52a1\u5316\u517c\u5bb9\u6539\u9020\u9700\u8981\u4e00\u5b9a\u65f6\u95f4\uff0c\u6539\u5b8c\u8fd8\u9700\u8981\u6d4b\u8bd5\uff0c\u4f46\u672c\u6b21\u65f6\u95f4\u6bd4\u8f83\u7d27\uff0c\u56e0\u6b64\u5148\u628a OpenCV \u88c5\u8fdb\u865a\u62df\u73af\u5883\uff0c\u540e\u7eed\u7248\u672c\u518d\u8003\u8651\u9488\u5bf9\u6b64\u63a5\u53e3\u505a\u4fee\u6539\u3002"},{"location":"RELEASE/#2002023816","title":"2.0.0\uff082023/8/16\uff09","text":"YouQu\uff08\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff09\u5f00\u6e90\u4e86\uff0c\u540c\u65f6\u63a8\u51fa\u4e86 2.0 \u7248\u672c\u3002 \u611f\u8c22\u738b\u6ce2\u603b\u3001\u67b6\u6784\u5e08\u5f90\u5c0f\u4e1c\u3001\u7814\u53d1\u7ecf\u7406\u90d1\u5e7c\u6208\u3001\u5218\u90d1\u7b49\u7814\u53d1\u540c\u4e8b\u7684\u5927\u529b\u652f\u6301\u3002 new 1\u3001\u65b0\u7684\u57fa\u7840\u6846\u67b6\u4ee3\u7801\u83b7\u53d6\u65b9\u5f0f\u53ca\u65b0\u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4 YouQu \u540e\u7eed\u5747\u901a\u8fc7 PyPI \u8fdb\u884c\u5305\u7684\u53d1\u5e03\uff0c\u4e5f\u5c31\u662f\u8bf4\u540e\u7eed\u53ef\u4ee5\u4f7f\u7528 pip \u8fdb\u884c\u5b89\u88c5\uff1a sudo pip3 install youqu==2.0.0\n \u8fd9\u91cc\u6709 2 \u4e2a\u5c0f\u70b9\u8981\u6ce8\u610f\uff1a \u63a8\u8350\u4f7f\u7528 sudo pip3 \uff08\u52a0 sudo\uff09\u8fdb\u884c\u5b89\u88c5\uff1b \u5982\u679c\u4e0d\u52a0 sudo \u6709\u4e9b\u673a\u5668\u53ef\u80fd $HOME/.local/bin \u4e0d\u5728\u7cfb\u7edf PATH \u73af\u5883\u76ee\u5f55\u4e0b\uff0c\u5728\u4e0d\u6dfb\u52a0\u73af\u5883\u53d8\u91cf\u7684\u60c5\u51b5\u4e0b\uff0c\u4f1a\u51fa\u73b0 YouQu \u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4\uff08youqu-startproject\uff09\u65e0\u6cd5\u4f7f\u7528\u7684\u95ee\u9898\uff1b \u5f53\u7136\uff0c\u5c06\u4e0a\u8ff0\u8def\u5f84\u6dfb\u52a0\u5230\u73af\u5883\u53d8\u91cf\u4e4b\u540e\u4e5f\u662f\u53ef\u4ee5\u7528\u7684\uff0c\u6240\u4ee5\u6211\u8fd9\u91cc\u662f\u63a8\u8350\u52a0 sudo\uff0c\u4e0d\u52a0 sudo \u4e5f\u662f\u53ef\u4ee5\u7684\uff0c\u53ea\u662f\u9700\u8981\u5173\u6ce8\u4e0b\u73af\u5883\u53d8\u91cf\u7684\u95ee\u9898\u3002 \u63a8\u8350\u6307\u5b9a\u7248\u672c\u53f7\uff08youqu==2.0.0\uff09\u5b89\u88c5\uff0c\u5982\u679c\u4e0d\u6307\u5b9a\u7248\u672c\u53f7\u9ed8\u8ba4\u662f\u5b89\u88c5\u6700\u65b0\u53d1\u5e03\u7684 YouQu \u7248\u672c\uff0c\u4f60\u53ef\u4ee5\u5728 PyPI \u4e0a\u7684 Release history \u91cc\u9762\u67e5\u770b\u6709\u54ea\u4e9b\u7248\u672c\u3002 \u5b89\u88c5\u4e4b\u540e\u4f1a\u81ea\u52a8\u751f\u6210\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu-startproject\uff0c\u4f7f\u7528\u5b83\u53ef\u4ee5\u521d\u59cb\u5316\u5de5\u7a0b\uff0c\u8fd9\u91cc\u4ee5\u97f3\u4e50\u4e3e\u4f8b\uff1b youqu-startproject autotest_deepin_music\n \u8fd9\u6837\u5c31\u4f1a\u5728\u5f53\u524d\u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a autotest_deepin_music \u76ee\u5f55\uff0c\u91cc\u9762\u5305\u542b\u4e86\u57fa\u7840\u6846\u67b6\u6240\u6709\u7684\u4ee3\u7801\uff1b \u4e4b\u540e\uff0c\u8fd8\u662f\u5728 apps \u76ee\u5f55\u4e0b\uff0c\u653e\u5165\u5b50\u9879\u76ee\u7684AT\u4ee3\u7801\u5373\u53ef\uff0c\u4f7f\u7528\u65b9\u6cd5\u548c\u8fc7\u53bb\u4e00\u6837\uff0c\u8fd9\u91cc\u5c31\u4e0d\u591a\u4ecb\u7ecd\u3002 \u53e6\u5916\uff0c\u9664\u4e86\u901a\u8fc7 pip \u83b7\u53d6\u4ee5\u5916\uff0c\u4ecd\u7136\u53ef\u4ee5\u901a\u8fc7\u6e90\u7801\u83b7\u53d6\uff08\u76f4\u63a5 git clone\uff09\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u4f7f\u7528 pip \u5b89\u88c5 YouQu \u65f6\uff0cYouQu \u5305\u7684\u5927\u5c0f\u624d 600+ k\uff0c\u5b89\u88c5\u901f\u5ea6\u8d77\u98de\u3002 2\u3001\u65b0\u7684AT\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848 \u4e3a\u4e86\u89e3\u51b3\u4ee5\u4e0b\u95ee\u9898\uff1a \u8fc7\u53bb\u4e00\u6bb5\u65f6\u95f4\u54b1\u4eec\u7ecf\u5e38\u51fa\u73b0\u7684\uff0c\u4e0d\u540c\u7684AT\u9879\u76ee\u5728\u540c\u4e00\u53f0\u673a\u5668\u4e0a\u90e8\u7f72\u73af\u5883\u65f6\u4f9d\u8d56\u7248\u672c\u51b2\u7a81\u7684\u95ee\u9898\uff0c\u65b0\u65b9\u6848\u4e0d\u540c\u7684\u9879\u76ee\u4f1a\u52a8\u6001\u751f\u6210\u81ea\u5df1\u7684\u865a\u62df\u73af\u5883\uff0c\u76f8\u4e92\u4e4b\u95f4\u4e0d\u5f71\u54cd\uff1b \u4e1a\u5185\u4e3a\u4e86\u89e3\u51b3\u7248\u672c\u51b2\u7a81\u95ee\u9898\u4e00\u822c\u90fd\u4f1a\u4f7f\u7528Python\u865a\u62df\u73af\u5883\u7684\u5de5\u5177\uff0c\u4f46\u662f\u90fd\u6709\u4e2a\u95ee\u9898\uff0c\u65e0\u6cd5\u7ba1\u7406 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u5305\uff0c\u672c\u6b21\u6211\u4eec\u89e3\u51b3\u4e86\u8fd9\u4e2a\u95ee\u9898\uff0c\u80fd\u591f\u5b8c\u5168\u7ba1\u7406\u5e38\u89c4\u7684Python\u5305\uff0c\u4e5f\u80fd\u7ba1\u7406\u5230 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u4e09\u65b9\u5305\uff1b \u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u4f7f\u7528\u65b9\u6cd5\uff1a bash env.sh\n \u53ef\u4ee5\u770b\u51fa\u6765\u548c\u539f\u6765\u4f7f\u7528\u65b9\u6cd5\u6ca1\u6709\u53d8\u5316\uff0c\u4e5f\u5c31\u662f\u8bf4\u4ece\u4f7f\u7528\u7684\u89d2\u5ea6\u662f\u5b8c\u5168\u6ca1\u6709\u533a\u522b\u7684\uff0c\u53ea\u662f\u5185\u90e8\u505a\u4e86\u4e0d\u540c\u7684\u4e8b\u60c5\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u672c\u673a\u90e8\u7f72\u7684\u529f\u80fd\u4ecd\u7136\u4fdd\u7559 env_dev.sh\uff0c\u53ef\u4ee5\u4f5c\u4e3a\u5f00\u53d1\u65f6\u7684\u73af\u5883\u90e8\u7f72\u3002 3\u3001\u65b0\u7684\u9a71\u52a8\u547d\u4ee4 \u8fc7\u53bb\u54b1\u4eec\u90fd\u662f\u4f7f\u7528\u8fd9\u6837\u7684\u547d\u4ee4\u6765\u9a71\u52a8\u6267\u884c\uff1a python3 manage.py run\n \u7531\u4e8e\u9ed8\u8ba4\u57fa\u4e8e\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848\uff0c\u56e0\u6b64\u6211\u4eec\u589e\u52a0\u4e86\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu\uff1b \u65b0\u7684\u9a71\u52a8\u65b9\u5f0f\uff1a youqu manage.py run\n \u53ea\u9700\u8981\u628a python3 \u66ff\u6362\u6210 youqu \u5c31\u53ef\u4ee5\u4e86\uff0c\u770b\u8d77\u6765\u5f88\u548c\u8c10~ 4\u3001\u65b0\u7684\u6587\u6863\u5730\u5740 \u8fc7\u53bb\u54b1\u4eec YouQu \u7684\u5728\u7ebf\u6587\u6863\u662f\u90e8\u7f72\u5728\u516c\u53f8\u5185\u7f51\u7684\uff0c\u73b0\u5728\u5f00\u6e90\u5230 github \u4e86\uff0c\u5916\u90e8\u5f00\u53d1\u8005\u80af\u5b9a\u8bbf\u95ee\u4e0d\u5230\u5185\u7f51\u7684\u6587\u6863\uff0c\u56e0\u6b64\u9700\u8981\u5c06\u6587\u6863\u90e8\u7f72\u5230\u516c\u7f51\u3010\u516c\u7f51\u6587\u6863\u3011\uff1b \u516c\u7f51\u6587\u6863\u4f7f\u7528\u7684\u662f github pages\uff08\u767d\u5ad6\u602a\u4e00\u987f\u72c2\u559c~~\uff09\uff0c\u4f46\u53ef\u80fd\u4f1a\u51fa\u73b0\u6587\u6863\u901f\u5ea6\u6162\u7684\u95ee\u9898\uff08\u4ee3\u7406\u4e0b\u5c31\u597d\u4e86\uff09\uff0c\u4e0d\u8fc7\u6ca1\u5173\u7cfb\uff0c\u54b1\u4eec\u3010\u5185\u7f51\u6587\u6863\u3011\u4ecd\u7136\u4fdd\u7559\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u3002 5\u3001\u5176\u4ed6\u4e00\u4e9b\u5c0f\u5c0f\u529f\u80fd\u66f4\u65b0\uff1a \uff081\uff09\u65b0\u589e\u5173\u95ed\u5206\u8fa8\u7387\u68c0\u6d4b\u7684\u53c2\u6570\u503c\uff1b youqu manage.py run --resolution no\n \u6216\u8005\u4fee\u6539 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387, \u6bd4\u5982\uff1a1920x1080\n;no: \u8868\u793a\u4e0d\u505a\u5206\u8fa8\u7387\u6821\u9a8c\nRESOLUTION = 1920x1080\n resolution \u8fd9\u4e2a\u53c2\u6570\u4e00\u76f4\u90fd\u6709\u7684\uff0c\u53ea\u4e0d\u8fc7\u4e4b\u524d\u662f\u7528\u4e8e\u6307\u5b9a\u5206\u8fa8\u7387\u5927\u5c0f\uff0c\u6bd4\u5982 --resolution 1920x1080\uff0c\u4f46\u6709\u4e9b\u63a5\u53e3\u7684\u9879\u76ee\u4e0d\u9700\u8981\u8fd9\u4e2a\u68c0\u67e5\uff0c\u53ef\u4ee5\u7ed9\u5b83\u4e2a no \u5c31\u597d\u4e86\uff0c\u5f53\u7136 CICD \u4e0a\u5173\u95ed\uff0c\u9700\u8981\u6d41\u6c34\u7ebf\u4e0a\u628a\u8fd9\u4e2a\u53c2\u6570\u52a0\u4e0a\uff1b \uff082\uff09\u65b0\u589e\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u7684\u547d\u4ee4\u884c\u53c2\u6570 \u4e4b\u524d\u8fd9\u4e2a\u914d\u7f6e\u9879\u53ea\u80fd\u5728 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c 1 \u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff0cRERUN >= RECORD_FAILED_CASE\u3002\n;1.\u5173\u95ed\u5f55\u5c4f\uff1aRECORD_FAILED_CASE > RERUN\n;2.\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1aRECORD_FAILED_CASE = 0\nRECORD_FAILED_CASE = 1\n \u73b0\u5728\u5c06\u5f00\u53d1\u5230\u547d\u4ee4\u884c\u53c2\u6570\u3002 youqu manage.py run --record_failed_case 2\n fix \u4fee\u590d remote \u6267\u884c\u65f6\uff0c\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u65e0\u6cd5\u751f\u6210\u6d4b\u8bd5\u62a5\u544a\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1302023710","title":"1.3.0\uff082023/7/10\uff09","text":"fix \u8fdb\u4e00\u6b65\u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b\u53c2\u8003\uff1a\u914d\u7f6ePython\u6e90\u7684\u51e0\u79cd\u65b9\u6cd5 \u4fee\u590d wayland_autotool \u53d7\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86wayland\u4e0b\u5076\u73b0\u627e\u4e0d\u5230 .Xauthority \u6587\u4ef6\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1292023626","title":"1.2.9\uff082023/6/26\uff09","text":"fix \u4f18\u5316\u8fdc\u7a0b\u6267\u884c remote \u7684\u53c2\u6570\u76f4\u63a5\u4f20\u7ed9\u8fdc\u7a0b\u673a\u5668\u7684 run \u547d\u4ee4\uff0c\u4e0d\u7528\u518d\u5355\u72ec\u5904\u7406\u8fdc\u7a0b\u6267\u884c\u7684\u53c2\u6570\u903b\u8f91\uff0c\u540e\u7eed\u4e13\u6ce8\u4e8e\u672c\u5730\u6267\u884c\u529f\u80fd\u5f00\u53d1\uff0c\u8fdc\u7a0b\u6267\u884c\u81ea\u52a8\u9002\u7528\uff1b env.sh \u79fb\u9664 pyyaml \u5b89\u88c5\uff0c\u7531\u5b50\u9879\u76ee\u5728 requirement.txt \u91cc\u9762\u5b9a\u4e49\uff0c\u6846\u67b6\u81ea\u52a8\u52a0\u8f7d\uff1b \u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b "},{"location":"RELEASE/#128202369","title":"1.2.8\uff082023/6/9\uff09","text":"fix \u4fee\u590d\u4e86 pypi \u5b89\u88c5 numpy \u5b58\u5728\u7cfb\u7edf\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#127202368","title":"1.2.7\uff082023/6/8\uff09","text":"fix env.sh \u4e2d\u5b89\u88c5 Python \u5305\u672a\u6307\u5b9a\u7248\u672c\u65f6\uff0c\u65e5\u5fd7\u8f93\u51fa\u5b89\u88c5\u7684\u7248\u672c\uff1b pdocr-rpc 2.0.1\nallure-custom 1.2.1\nfunnylog 1.1.3\n \u4fee\u590d -f \u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u62a5\u9519\u7684\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#126202367","title":"1.2.6\uff082023/6/7\uff09","text":"fix \u4fee\u590d wayland \u4e0a\u8c03\u7528\u9f20\u6807\u4e2d\u952e\u3001\u53f3\u952e\u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b \u4fee\u590d pubilic/dde_desktop_public_widget \u91cc\u9762\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u5b9a\u4f4d\u684c\u9762\u6587\u4ef6\u7684\u65b9\u6cd5\uff0c\u5750\u6807\u6ca1\u6709\u62c6\u5305\u7684\u95ee\u9898\uff1b \u4f18\u5316\u4e86\u7b49\u5f85\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b pycreeze \u7248\u672c\u5347\u7ea7\u5230 0.1.29\uff0c\u5bfc\u81f4\u4e0e pyautogui 0.9.53 \u4e0d\u517c\u5bb9\uff0cenv.sh \u91cc\u9762\u589e\u52a0\u6307\u5b9a pycreeze \u7248\u672c\u4e3a 0.1.28\uff1b "},{"location":"RELEASE/#1252023516","title":"1.2.5\uff082023/5/16\uff09","text":"new --app \u53c2\u6570\u540e\u9762\u65b0\u589e\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u76ee\u524d\u652f\u6301\u4e09\u79cd\u53c2\u6570\u4f20\u5165\u65b9\u5f0f\uff1a ~$: youqu run -a deepin-music\n~$: youqu run -a autotest_deepin_music\n~$: youqu run -a apps/autotest_deepin_music\n \u200b \u540e\u4e24\u79cd\u5165\u53c2\u65b9\u5f0f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\u3002 remote \u8fdc\u7a0b\u6267\u884c\u65b0\u589e\u4ece\u547d\u4ee4\u884c\u4f20\u5165\u6d4b\u8bd5\u673a\u4fe1\u606f\uff0c\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679c password \u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6 setting/remote.ini \u4e2d CLIENT_PASSWORD \u7684\u503c,\u6bd4\u5982\uff1auos@10.8.13.33:1 \u6216 uos@10.8.13.33 \uff1b python3 manage.py remote -c uos@10.8.13.33/uos@10.8.13.34\npython3 manage.py remote -c uos@10.8.13.33:1/uos@10.8.13.34:2\n fix \u65e5\u5fd7\u6a21\u5757\u4fee\u6539\u4e3a\u51fd\u6570\u6267\u884c\u4e4b\u524d\u6253\u5370\u65e5\u5fd7\uff1b \u65e5\u5fd7\u6a21\u5757\u589e\u52a0\u767d\u540d\u5355\uff0c\u901a\u8fc7\u7c7b\u540d\u5f00\u5934\uff0c\u7ed3\u675f\uff0c\u5305\u542b\u7b49\u5173\u952e\u5b57\u63a7\u5236\u9700\u8981\u6253\u5370\u7684\u51fd\u6570\u65e5\u5fd7\uff1b \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5982\u679c\u4f20\u5165\u4e86 app_name \u53ea\u4f1a\u5c06 apps \u76ee\u5f55\u4e0b app_name \u7684\u76ee\u5f55\u53d1\u9001\u5230\u6d4b\u8bd5\u673a\uff1b env.sh \u79fb\u9664 python3-dev\uff1b \u4fee\u590d Wayland \u4e0b env.sh \u73af\u5883\u5b89\u88c5\u5931\u8d25\u7684\u95ee\u9898\uff0c\u4f18\u5316\u4e86 deb \u4f9d\u8d56\u5b89\u88c5\u7684\u903b\u8f91\uff1b \u5c06 env.sh \u5237\u65b0\u6e90\u7684\u65e5\u5fd7\u5728\u7ec8\u7aef\u663e\u793a\uff0c\u89e3\u51b3\u5728 CI \u73af\u5883\u4e0b\uff0c\u957f\u65f6\u95f4\u4e0d\u8f93\u51fa\u65e5\u5fd7\u8fde\u63a5\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d1060 \u534e\u4e3a\u673a\u578b\u5b89\u88c5\u952e\u9f20\u5de5\u5177\u65f6\u4f9d\u8d56\u4e0d\u517c\u5bb9\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1242023227","title":"1.2.4\uff082023/2/27\uff09","text":"fix \u4fee\u6539 CURRENT \u6587\u4ef6\uff1b "},{"location":"RELEASE/#1232023227","title":"1.2.3\uff082023/2/27\uff09","text":"new pylint.sh \u652f\u6301\u901a\u8fc7\u4f4d\u7f6e\u53c2\u6570\u4f20\u5165\u6587\u4ef6\u8def\u5f84\uff1abash pylint.sh apps/autotest_deepin_music,\u597d\u5904\u662f\u53c2\u6570\u8def\u5f84\u53ef\u4ee5\u5728\u7ec8\u7aef\u8865\u5168\uff1b \u65b0\u589e\u7cfb\u7edf\u547d\u4ee4 youqu-pylint \uff0c\u7528\u4e8e\u9759\u6001\u4ee3\u7801\u626b\u63cf\uff0c\u4f7f\u7528\u65b9\u6cd5: youqu-pylint apps/autotest_deepin_music\uff1b \u7531\u4e8e\u7cfb\u7edf\u4e00\u4e9b dbus \u63a5\u53e3\u6539\u53d8\uff0c\u516c\u5171\u5e93\u4e2d\u7684 dbus \u65b9\u6cd5\u5c06\u4e0d\u518d\u7ef4\u62a4\uff0c\u7531\u5b50\u9879\u76ee\u5728 other_widget.py \u91cc\u9762\u8fdb\u884c\u7ef4\u62a4\uff1b fix \u4fee\u590d ssh \u73af\u5883\u4e0b\u8fd0\u884c\u63d0\u793a \u201c\u65e0\u6cd5\u8fde\u63a5\u201d \u7684\u95ee\u9898\uff1b \u4fee\u590d\u8fd0\u884c\u65f6\u7a0b\u5e8f\u9000\u51fa\uff0c\u4e0d\u8f93\u51fa\u5f02\u5e38\u65e5\u5fd7\u7684\u95ee\u9898\uff1b \u4fee\u590dyouqu remote xxx \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5728\u670d\u52a1\u7aef Ctrl + C \u65e0\u6cd5\u505c\u6b62\u7a0b\u5e8f\u8fd0\u884c\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#122202328","title":"1.2.2\uff082023/2/8\uff09","text":"new \u65b0\u589e\u6c14\u6ce1\u7c7b\u56fe\u50cf\u8bc6\u522b\u65b9\u6848\uff1bimage_utils.py::ImageUtil::get_during\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u533a\u57df\u8bc6\u522b\uff0c\u4f20\u5165 [x, y, w, h]\uff0cx: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u76ee\u6807\u56fe\u7247\uff0c\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\uff1b env.sh \u79fb\u9664 pypinyin; \u4f18\u5316\u6267\u884c env.sh \u65f6\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b manage.py \u79fb\u9664\u4e86\u53c2\u6570 session_timeout \uff0c\u6846\u67b6\u6839\u636e\u5168\u5c40\u7684 timeout \u4ee5\u53ca\u7528\u4f8b\u81ea\u5b9a\u4e49\u7684 timeout \u81ea\u52a8\u8ba1\u7b97\u51fa sessiontimeout \u7684\u503c\uff1b \u65b0\u589e ocr \u670d\u52a1\u5668\u94fe\u63a5\u91cd\u8bd5\uff0c\u9ed8\u8ba4\u91cd\u8bd51\u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u53c2\u6570\uff1b fix \u4fee\u590d\u4e86\u4e00\u4e9b pylint \u626b\u63cf\u7684\u4ee3\u7801\u98ce\u683c\u95ee\u9898\uff1b \u91cd\u65b0\u8bbe\u8ba1\u4e86\u6d4b\u8bd5\u62a5\u544a\u4e3b\u9898\uff1b "},{"location":"RELEASE/#121202316","title":"1.2.1\uff082023/1/6\uff09","text":"new \u652f\u6301\u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6267\u884c\u7528\u4f8b\uff1b\u53ef\u5c06python3 manage.py \u66ff\u6362\u4e3a youqu \uff1a youqu run -a deepin-music -k 001\n RPC \u670d\u52a1 IP \u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u6307\u5b9a\u4e0d\u540c\u7684\u7aef\u53e3\uff1b \u5728\u7ebf\u6587\u6863\u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u539f\u6765\u7684\u5730\u5740 10.8.10.215 \u5c06\u4e0d\u5728\u4f7f\u7528\uff1b fix \u4fee\u590d --count \u53c2\u6570\u53ef\u80fd\u51fa\u73b0\u4e0e\u5176\u4ed6\u6846\u67b6\u7684\u5de5\u7a0b\u4f9d\u8d56\u5b58\u5728\u51b2\u7a81\uff0c\u62a5\u9519\u91cd\u590d\u6ce8\u518c\u7684\u95ee\u9898\uff1b \u4fee\u590d CI \u73af\u5883\u4e0b\u591a\u4e2a\u5de5\u7a0b\u5b58\u5728 Python \u73af\u5883\u53d8\u91cf\u6307\u5411\u9519\u8bef\uff0c\u5bfc\u5305\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u5355\u72ec\u8fd0\u884c\u65b9\u6cd5\u65f6\u65e0\u65e5\u5fd7\u8f93\u51fa\u7684 Bug\uff1b "},{"location":"RELEASE/#12020221230","title":"1.2.0\uff082022/12/30\uff09","text":"1.1.4 \u7248\u672c\u9002\u914d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e14\u65b0\u589e\u4e86\u8f83\u591a\u65b0\u7279\u6027\uff0c\u6211\u4eec\u8ba1\u5212\u4f7f\u7528 1.1.4 \u7248\u672c\u8fd0\u884c\u4e00\u6bb5\u65f6\u95f4\uff0c1.2.0 \u7248\u672c\u5c06\u4fee\u590d\u671f\u95f4\u51fa\u73b0\u7684 Bug\uff0c\u7136\u540e\u4f5c\u4e3a\u7a33\u5b9a\u7248\u672c\u53d1\u5e03\u3002 new \u4fee\u6539\u5de5\u7a0b\u540d\u79f0\u4e3a youqu\uff1b \u5c06 sphinx \u6587\u6863\u5de5\u7a0b\u8fc1\u79fb\u5230\u5355\u72ec\u7684\u4ed3\u5e93\uff1b fix \u4fee\u590d startapp \u521b\u5efa\u5de5\u7a0b\u65f6\u5b58\u5728\u5de5\u7a0b\u540d\u79f0\u65f6\u65e0\u6cd5\u7ee7\u7eed\u521b\u5efa\uff1b \u4fee\u590d\u4e86 OCR \u670d\u52a1\u5728\u5e76\u53d1\u65f6\u53ef\u80fd\u51fa\u73b0\u65e0\u6cd5\u8fd4\u56de\u7ed3\u679c\u7684\u95ee\u9898\uff0c\u63d0\u5347 OCR \u670d\u52a1\u9ad8\u5e76\u53d1\u7a33\u5b9a\u6027\uff1b \u4fee\u590d PMS \u540c\u6b65\u6807\u7b7e\u5230 CSV \u6587\u4ef6\u4e0d\u652f\u6301\u7528\u4f8b\u5e93\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11420221214","title":"1.1.4\uff082022/12/14\uff09","text":"new \u65b0\u589e startapp \u5b50\u547d\u4ee4\u521b\u5efa\u5b50\u9879\u76ee\u5de5\u7a0b\u6a21\u677f: python3 manage.py startapp autotest_deepin_xxx \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u91cd\u590d\u6267\u884c\u6b21\u6570\uff1b \u53bb\u6389\u6279\u91cf\u6267\u884c\u524d\u6536\u96c6\u7528\u4f8b\u7684\u6b65\u9aa4\uff1b \u589e\u52a0\u5f00\u59cb\u6267\u884c\u65f6\u6253\u5370\u4e00\u4e9b\u6267\u884c\u53c2\u6570\uff0c\u5982\uff1a \u7528\u4f8b\u6536\u96c6\u6570\u91cf: 99\n\u5931\u8d25\u91cd\u8dd1\u6b21\u6570: 1\n\u6700\u5927\u5931\u8d25\u6b21\u6570: 49\n\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4: 200.0s (03\u520620\u79d2)\n\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4: 11880s (3\u5c0f\u65f618\u52060\u79d2)\n \u5b9a\u5236\u4fee\u6539allure\u62a5\u544alogo\u3001title\u3001\u9ed8\u8ba4\u8bed\u8a00\uff1b manage.py \u6267\u884c\u5f00\u59cb\u65f6\u6253\u5370 logo \u548c\u5f53\u524d\u7248\u672c\uff1a \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u255a\u2588\u2588\u2557 \u2588\u2588\u2554\u255d \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2584\u2584 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2580\u2580\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u2584\u2588 \u2584\u2588 \u2588 \u2588 \u2588 \u2584 \u2588 \u2584 \u2580\u2580\u2588 \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\uff1b \u88c5\u9970\u5668\u65b9\u6cd5\u6307\u5b9a\u6b21\u6570\uff1b @pytest.mark.count(2)\ndef test_music_001():\npass\n \u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u6b21\u6570\uff1b python3 manage.py run -a deepin-music -k 001 --count 2\n \u200b image_utils \u589e\u52a0\u51fd\u6570 save_temporary_picture\uff0c\u652f\u6301\u6307\u5b9a\u5c4f\u5e55\u533a\u57df\u622a\u56fe\u5e76\u8fd4\u56de\u56fe\u7247\u5b58\u653e\u7684\u672c\u5730\u8def\u5f84\uff0c\u540e\u7eed\u4f7f\u7528 assert_image_exist \u8fdb\u884c\u65ad\u8a00 Python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(x, y, width, height) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) button_center \u65b0\u589e btn_size \u83b7\u53d6\u63a7\u4ef6\u5de6\u4e0a\u89d2\u5750\u6807\u53ca\u957f\u5bbd\uff0c\u7528\u4e8e\u52a8\u6001\u7684\u622a\u53d6\u5143\u7d20\u7684\u56fe\u7247\uff0c\u53ef\u7528\u4e8e\u5b9a\u4f4d\u65ad\u8a00 python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u6240\u6709\u97f3\u4e50\u6309\u94ae\")) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) allure \u62a5\u544a\u4e2d\u5b9a\u4f4d\u95ee\u9898\u9664\u4e86\u65e5\u5fd7\u3001\u622a\u56fe\u3001\u5f55\u5c4f\u5916\uff0c\u8c03\u7528\u7684\u51fd\u6570\u589e\u52a0\u4e86 step \u6b65\u9aa4\u5c55\u793a\uff1b env.sh \u65b0\u589e\u5b89\u88c5\u5b50\u9879\u76ee Python \u4e09\u65b9\u4f9d\u8d56\uff0c\u5728\u5b50\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u5199 requirement.txt \u6587\u4ef6\uff0cenv.sh \u4f1a\u81ea\u52a8\u52a0\u8f7d\uff1b ocr \u8bc6\u522b\u65b0\u589e\u652f\u6301\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\u8fdb\u884c\u6587\u5b57\u8bc6\u522b\uff0c\u51cf\u5c11\u56e0\u5168\u5c4f\u8bc6\u522b\u65f6\uff0c\u5176\u4ed6\u6587\u5b57\u7684\u5e72\u6270 Python # \u65ad\u8a00\u97f3\u4e50\u7684\u5220\u9664\u5f39\u7a97\u4e2d\uff0c\u5305\u542b\u4e86\u201c\u786e\u8ba4\u201d\u7684\u6587\u5b57 self.assert_ocr_exist(\"\u786e\u8ba4\", picture_abspath=DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u5220\u9664\u5f39\u7a97\"))) \u65ad\u8a00\u51fd\u6570\u7684\u8c03\u7528\u4e5f\u4f1a\u81ea\u52a8\u6253\u5370\u65e5\u5fd7; env.sh \u65b0\u589e\u88c1\u526a\u4f9d\u8d56\u7684\u65b9\u6848\uff1b fix \u4fee\u590d Jenkins \u73af\u5883\u4e0b\uff0c apps \u76ee\u5f55\u4e0b\u5b50\u9879\u76ee\u5b58\u5728 auotest_deepin_xxx@tmp \u76ee\u5f55\uff0c\u5728\u4f20\u5165 app_name \u540e\u65e0\u6cd5\u6267\u884c\u7528\u4f8b\u7684\u95ee\u9898\uff1b \u4fee\u590d\u81ea\u52a8\u751f\u6210 case_list.csv \u6587\u4ef6\u65f6\uff0c\u7528\u4f8b\u987a\u5e8f\u88ab\u8c03\u6574\u7684\u95ee\u9898\uff1b env.sh \u73af\u5883\u5b89\u88c5\u79fb\u9664 git \u548c curl\uff1b \u4fee\u590d\u7528\u4f8b\u5728 setup \u9636\u6bb5\u62a5\u9519\u540e\uff0c\u672a\u5199\u5165 ci_result.json \u7684\u95ee\u9898\uff1b \u79fb\u9664 uos_ci.py\uff1b "},{"location":"RELEASE/#11320221028","title":"1.1.3\uff082022/10/28\uff09","text":"new \u65b0\u589e\u56fe\u50cf\u65ad\u8a00\u6210\u529f\u8f93\u51fa\u5339\u914d\u5ea6\uff1b \u65b0\u589e\u73af\u5883\u5b89\u88c5 yaml \u4f9d\u8d56\uff1b \u65b0\u589e\u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6570\u636e\u56de\u586b\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b \u65b0\u589e\u6d4b\u8bd5\u7ed3\u679c\u8868\u60c5\u663e\u793a\uff0c\u5e76\u4f18\u5316\u4e86\u65e5\u5fd7\u7684\u6392\u7248\uff1b \u65b0\u589e --top {number} \u7528\u4e8e\u8bb0\u5f55\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0c\u65e5\u5fd7\u751f\u6210\u5230 report/logs/top.log\uff1b fix \u4fee\u590d\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4f46\u7ec8\u7aef\u6ca1\u6709\u9519\u8bef\u65e5\u5fd7\u8f93\u51fa\u7684\u95ee\u9898\uff1b \u4fee\u6539\u5931\u8d25\u7528\u4f8b\u56de\u6eaf\u65e5\u5fd7\u4e3a\u8be6\u7ec6\u7ea7\u522b\uff1b \u4fee\u590d\u4e86\u6267\u884c\u8fdb\u5ea6\u672a\u8ba1\u7b97\u8df3\u8fc7\u7528\u4f8b\u7684\u95ee\u9898\uff0c\u5e76\u4f18\u5316\u4e86\u8fdb\u5ea6\u83b7\u53d6\u7684\u7b97\u6cd5\uff1b \u4fee\u590d env.sh \u5728 V23 \u73af\u5883\u4e0b\u5b89\u88c5\u65e0\u6cd5\u8bfb\u53d6\u5bc6\u7801\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 pms \u6d4b\u8bd5\u5957\u6267\u884c\u6216\u6d4b\u8bd5\u5355\u6267\u884c\u65f6\uff0c\u7528\u4f8bID\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b env.sh \u91cc\u9762 hub.deepin.com \u66f4\u6362\u6210 it.uniontech.com\uff1b uos_ci.py \u6d4b\u8bd5\u7ed3\u679c\u7edf\u8ba1\u65f6\uff0c\u603b\u6570\u5254\u9664 skip \u7684\u6570\u91cf "},{"location":"RELEASE/#11220220921","title":"1.1.2\uff082022/09/21\uff09","text":"new \u5728\u6ca1\u6709\u5b89\u88c5 dogtail \u7684\u60c5\u51b5\u4e0b\uff0c\u4e5f\u80fd\u4f7f\u7528 sniff \u5de5\u5177\uff1b fix \u4fee\u590d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e2d\u6ca1\u6709\u5b89\u88c5 AT \u73af\u5883\u6267\u884c uos_ci.py \u62a5\u9519\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11120220919","title":"1.1.1\uff082022/09/19\uff09","text":"new \u65b0\u589e\u6267\u884c\u8fdb\u5ea6\u663e\u793a\uff0c\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u65f6\u65e5\u5fd7\u8f93\u51fa\u5f53\u524d\u8fdb\u5ea6\uff1a[\u5f53\u524d\u6307\u5b9a\u7b2c\u51e0\u6761/\u7528\u4f8b\u603b\u6570]\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u7528\u4f8b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\u6240\u6709\u5931\u8d25\u7528\u4f8b\u7684\u5217\u8868\uff1b \u5173\u95ed\u7ec8\u7aef\u8f93\u51fa\u6355\u83b7\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u65e5\u5fd7\u5feb\u7167\uff1b \u4f18\u5316\u7ec8\u7aef\u8f93\u51fa\u5931\u8d25\u4fe1\u606f\u5197\u957f\u4e3a\u7b80\u8981\u4fe1\u606f\u8f93\u51fa\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u663e\u793a 10 \u4e2a\u6267\u884c\u6700\u6162\u7684\u7528\u4f8b\u5217\u8868\uff0c\u5e76\u8be6\u7ec6\u5217\u51fa\u5404\u4e2a\u9636\u6bb5\u7684\u8017\u65f6\uff1b \u5931\u8d25\u91cd\u8dd1\u7528\u4f8b\u91cd\u8dd1\u4e4b\u524d\u5ef6\u8fdf 1 \u79d2\uff1b \u65b0\u589e\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4ecd\u7136\u5f3a\u5236\u6267\u884c\uff1b \u7528\u4f8b\u6536\u96c6\u65f6\u4ec5\u5728 apps \u76ee\u5f55\u4e0b\u8fdb\u884c\uff0c\u5ffd\u7565 src,setting,public \u76ee\u5f55\uff1b \u65b0\u589e allure \u62a5\u544a\u5907\u4efd\u529f\u80fd\uff0c\u9ed8\u8ba4\u5907\u4efd\u81f3 allure_back \u76ee\u5f55\u4e0b\uff1b manage.py\u65b0\u589e\u53c2\u6570 --lastfailed \u7528\u4e8e\u53ea\u8dd1\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\u7684\u529f\u80fd\uff1b fix \u4fee\u590d\u4e86\u5728\u6ca1\u6709\u6307\u5b9a\u5e94\u7528\u540d\u79f0\u6267\u884c\u65f6\uff0cxml \u62a5\u544a\u751f\u6210\u8def\u5f84\u5f02\u5e38\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 uos_ci.py \u4f20\u5165 timeout \u548c session_timeout \u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11020220916","title":"1.1.0\uff082022/09/16\uff09","text":"new \u65b0\u589ePMS\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u652f\u6301\u591a\u79cd\u6570\u636e\u56de\u586b\u6a21\u5f0f\uff1b \u4f18\u5316\u4e86\u901a\u8fc7\u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u65f6PMS \u722c\u866b\u7684\u6027\u80fd\uff1b \u65b0\u589e .gitmodules \u6587\u4ef6\uff0c\u7528\u4e8e\u6807\u8bb0\u6240\u6709\u5b50\u9879\u76ee\uff0c\u65b9\u4fbf\u7edf\u4e00\u62c9\u53d6\u4ee3\u7801\uff1b env.sh \u9002\u914d\u793e\u533a\u7248\u4e0a\u5b89\u88c5\u81ea\u52a8\u5316\u73af\u5883\uff1b \u589e\u52a0\u6267\u884c\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u9519\u8bef\u7684\u529f\u80fd\uff1b README.md \u589e\u52a0 Wayland \u4e0b\u4f7f\u7528\u3001\u6d4b\u8bd5\u62a5\u544a\u67e5\u770b\u3001\u5e38\u89c1\u95ee\u9898\u7b49\u7684\u6587\u6863\u8bf4\u660e\uff1b \u589e\u52a0\u4e86\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u5bf9 setup\u3001call\u3001teardown \u8fdb\u884c\u65e5\u5fd7\u5206\u6bb5\uff1b fix \u4fee\u590d\u4e86 \u786e\u8ba4\u4fee\u590d \u5217\u6ca1\u5199\u8868\u5934\uff0c\u4f46\u5199\u4e86 fixed-xxx \u6807\u7b7e\uff0c\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u540c\u4e00\u5e94\u7528\u5185\u591a\u4e2a csv \u6587\u4ef6\u4e2d \u786e\u8ba4\u4fee\u590d \u5217\u6709\u7684\u5199\u4e86\uff0c\u6709\u7684\u6ca1\u5199\uff0c\u53ef\u80fd\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 INFO \u65e5\u5fd7\uff0c\u663e\u793a\u4e3a DEBUG \u7684\u95ee\u9898\uff1b\u4fee\u590d\u4e86\u90e8\u5206\u673a\u5668\u4e0a INFO \u65e5\u5fd7\u5185\u5bb9\u663e\u793a\u4e3a\u7ea2\u8272\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\u770b\u4e0d\u5230\u8be6\u7ec6\u4fe1\u606f\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10220220822","title":"1.0.2\uff082022/08/22\uff09","text":"new \u79fb\u9664 loguru\uff0c\u66ff\u6362\u4e3a logging\uff0c\u63a5\u53e3\u4fdd\u6301\u4e0d\u53d8\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u53d7\u5f71\u54cd\uff1b \u9ed8\u8ba4\u5f00\u542f coredump\uff1b fix \u4fee\u590d\u4e86\u4e09\u65b9\u5e93 loguru \u5076\u73b0\u5f02\u5e38\uff0c\u5bfc\u81f4\u7a0b\u5e8f\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7b2c\u4e00\u6b21\u5931\u8d25\u4e0d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10120220812","title":"1.0.1\uff082022/08/12\uff09","text":"new \u65b0\u589e RELEASE.md \u6587\u4ef6\uff0c\u7528\u4e8e\u8bb0\u5f55\u5386\u53f2\u53d1\u5e03\u7248\u672c\u7684\u66f4\u65b0\u5185\u5bb9\uff1b \u517c\u5bb9 Wayland \u6a21\u5f0f\u4e0b\u6267\u884c\u7528\u4f8b\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u7528\u7ba1\u5f53\u524d\u6d4b\u8bd5\u673a\u6267\u884c\u73af\u5883\uff0c\u6846\u67b6\u4f1a\u81ea\u52a8\u6839\u636e\u5f53\u524d\u73af\u5883\u8d70\u4e0d\u540c\u7684\u4ee3\u7801\u903b\u8f91\uff1b \u7531\u4e8e\u9700\u8981\u4fee\u6539 dogtail \u6e90\u4ee3\u7801\uff0c\u56e0\u6b64\u5c06\u4fee\u6539\u540e\u7684\u6e90\u7801\u653e\u5165\u5230\u6838\u5fc3\u5e93\u91cc\u9762 src/depends/dogtail \u540e\u7eed\u7248\u672c\u5c06\u4e0d\u9700\u8981\u5728\u7cfb\u7edf\u4e2d\u5b89\u88c5dogtail\uff1b \u5982\u679c\u5e94\u7528\u5e93\u540c\u6837\u4f7f\u7528\u4e86\u7cfb\u7edf\u5b89\u88c5\u7684 dogtail \u53ef\u80fd\u4f1a\u62a5\u9519\uff0c\u89e3\u51b3\u65b9\u6848\u662f\u5c06\u4ee3\u7801\u4e2d\u7684 import dogtail \u4fee\u6539\u4e3a from src.depends import dogtail ; fix \u91cd\u8dd1\u5931\u8d25\u4e4b\u540e\u624d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff0c\u4fee\u6539\u4e3a\u5931\u8d25\u4e4b\u540e\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":"# Attribution \uff1achengdu Test Team\n# Date \uff1a2021/08/20\n \u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d \u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d \u4ed3\u5e93\u5730\u5740\uff1ahttps://gitlabcd.uniontech.com/autotest/cd-desktop-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u65b9\u6848\u6982\u8ff0","text":"\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u667a\u80fd\u8bc6\u522b\u5e94\u7528\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u7528\u4e8e\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u64cd\u4f5c\u8fc7\u7a0b\u4e2d\u7684\u5143\u7d20\u5b9a\u4f4d\u4ee5\u53ca\u5224\u65ad\u7ed3\u679c\u65f6\u7684\u65ad\u8a00\u5904\u7406\uff1b\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\uff0c\u6d4b\u8bd5\u673a\u4e0a\u7684\u753b\u9762\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u5230\u670d\u52a1\u5668\u4e0a\uff0c\u670d\u52a1\u5668\u5bf9\u89c6\u9891\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\u540e\uff0c\u670d\u52a1\u5668\u667a\u80fd\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\u6210\u529f\uff0c\u7136\u540e\u5bf9\u6d4b\u8bd5\u673a\u4e0b\u53d1\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\uff0c\u6d4b\u8bd5\u673a\u63a5\u53d7\u5e76\u6267\u884c\u4e0b\u4e00\u6b65\u64cd\u4f5c\u3002 \u670d\u52a1\u5668\u4e0e\u6d4b\u8bd5\u673a\u4e4b\u95f4\u7684\u94fe\u63a5\uff1a \u670d\u52a1\u5668\u901a\u8fc7 USB \u4e32\u53e3\u8bbe\u5907\uff08USB-HID \u534f\u8bae\uff09\u6a21\u62df\u9f20\u6807\u952e\u76d8\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u64cd\u4f5c\u3002 \u901a\u8fc7\u89c6\u9891\u91c7\u96c6\u8bbe\u5907\u6355\u83b7\u6d4b\u8bd5\u673a\u7684\u5b9e\u65f6\u753b\u9762\u4f20\u8f93\u7ed9\u670d\u52a1\u5668\u3002 \u670d\u52a1\u5668\u5bf9\u91c7\u96c6\u7684\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\uff0c\u8bc6\u522b\u5176\u4e2d\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5e76\u8fd4\u56de\u5143\u7d20\u63a7\u4ef6\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\uff0c\u670d\u52a1\u5668\u901a\u8fc7\u667a\u80fd\u5316\u5206\u6790\uff0c\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e00\u81f4\u5c06\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\u901a\u8fc7\u4e32\u53e3\u6a21\u62df\u952e\u9f20\u4fe1\u53f7\u53d1\u9001\u7ed9\u6d4b\u8bd5\u673a\uff1b\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e0d\u4e00\u81f4\u5c06\u4f1a\u8fdb\u5165\u4e2d\u65ad\u5904\u7406\u53ca\u5f02\u5e38\u7ed3\u679c\u8f93\u51fa\uff0c\u7ee7\u7eed\u6267\u884c\u540e\u7eed\u573a\u666f\uff0c\u76f4\u81f3\u6240\u6709\u7528\u4f8b\u6d4b\u8bd5\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u6df1\u5ea6\u5b66\u4e60\u73af\u5883\u642d\u5efa","text":"\u6a21\u578b\u8bad\u7ec3\u4e3b\u8981\u5bf9 GPU \u6709\u8981\u6c42\uff0c\u8bad\u7ec3\u6a21\u578b\u7684\u673a\u5668\u663e\u5b58\u4e0d\u4f4e\u4e8e 6G\uff0c\u5176\u4ed6\u914d\u7f6e\u65e0\u7279\u6b8a\u8981\u6c42\u3002 \u63a8\u8350\u6027\u4ef7\u6bd4\u8f83\u9ad8\u914d\u7f6e \u64cd\u4f5c\u7cfb\u7edf: UnionTech OS Desktop 20 Professional Linux version 4.19.0-desktop-amd64 (deepin@deepin-PC) (Uos 8.3.0.3-3+rebuild) \u5904\u7406\u5668: Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz (\u516b\u6838 / \u5341\u516d\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460M-HDV(RD)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))/8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: TU116 [GeForce GTX 1660]\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u865a\u62df\u73af\u5883\u5b89\u88c5","text":"cd ~\nwget -c https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh\nbash Miniconda3-latest-Linux-x86_64.sh\n \u4e00\u8def\u56de\u8f66 \u7b2c\u4e00\u6b21\u63d0\u793a\u8f93\u5165 yes/no \uff1a\u8f93\u5165 yes \u7ee7\u7eed\u4e00\u8def\u56de\u8f66 \u7b2c\u4e8c\u6b21\u63d0\u793a\uff1a\u8f93\u5165 no cd ~/miniconda3/bin\nsudo chmod 777 activate\n \u6fc0\u6d3bconda\u73af\u5883 . ./activate\n \u6dfb\u52a0\u516c\u53f8\u5185\u7f51\u6e90 conda config --add channels bioconda\nconda config --add channels conda-forge\n \u5982\u679c\u662f\u5916\u7f51\u6dfb\u52a0\u5916\u7f51\u6e90 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/\n \u5982\u679c\u8981\u5220\u9664\u6e90 conda config --remove-key channels\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"2\u3001\u5b89\u88c5\u4f9d\u8d56","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u521b\u5efa\u865a\u62df\u73af\u5883","text":"conda remove --name mmlab --all # \u79fb\u9664\u6240\u6709\u865a\u62df\u73af\u5883\n conda create -n mmlab python=3.7\n conda activate mmlab\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-pytorch","title":"\uff082\uff09\u5b89\u88c5 Pytorch","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install torch==1.7.0+cu101 torchvision==0.8.1+cu101 torchaudio==0.7.0 -f https://download.pytorch.org/whl/torch_stable.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-mmcv","title":"\uff083\uff09\u5b89\u88c5 MMCV","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install mmcv-full==1.3.3 -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.7.0/index.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"\uff084\uff09\u5b89\u88c5\u663e\u5361\u9a71\u52a8","text":"\u6839\u636e\u4f60\u7684\u663e\u5361\u4e0b\u8f7d\u5bf9\u5e94\u9a71\u52a8\uff0c\u6bd4\u5982\u6211\u7684\u663e\u5361\u4e3a GTX1660\uff0c\u9a71\u52a8\u7248\u672c\u4e3a 430\uff0c\u9a71\u52a8\u4e0b\u8f7d\u5730\u5740\uff1ahttps://www.nvidia.cn/Download/Find.aspx?lang=cn CTRL+ALT+F2 \u8fdb\u5165tty\n \u7981\u7528 nouveau \u9a71\u52a8 sudo vim /etc/modprobe.d/blacklist-nouveau.conf\n \u586b\u5165\uff1a blacklist nouveau options nouveau modeset=0\n \u5237\u65b0\u914d\u7f6e\u6587\u4ef6 sudo update-initramfs -u reboot \u91cd\u542f\u540e\u518d\u8fdb\u5165 tty \u5173\u95ed\u56fe\u50cf\u754c\u9762\uff0c\u8f93\u5165\u547d\u4ee4\u5173\u95ed\u56fe\u50cf\u754c\u9762 sudo service lightdm stop\n \u5b89\u88c5\u9a71\u52a8 sudo chmod a+x NVIDIA-Linux-x86_64-430.run\nsudo ./NVIDIA-Linux-x86_64-430.run\n reboot\u91cd\u542f\uff0cnvidia-smi\u67e5\u770b\u5b89\u88c5\u72b6\u6001\u3002\u6ce8\u610f\u770b\u4e0bcuda\u7248\u672c\uff0c10.1\uff0cdriver\u7248\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u6570\u636e\u6807\u6ce8","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u6570\u636e\u6807\u6ce8","text":"\u6807\u6ce8\u4e4b\u524d\u9700\u8981\u5148\u8f6c\u6362\u56fe\u7247\u5927\u5c0f\uff0c\u5e76\u4e14\u4ee5\u6570\u5b57\u547d\u540d\uff0c\u6bcf\u7ec4\u547d\u540d\u9012\u589e"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"\uff081\uff09\u8f6c\u6362\u5927\u5c0f\u5e76\u91cd\u547d\u540d","text":"rename_pic.py import os\nimport sys\nimport cv2\nimport time\nimport getpass\nusername = getpass.getuser()\nsource_path = f\"/home/{username}/Desktop/right_menu\" # \u56fe\u7247\u8def\u5f84\nsource_dest = os.path.join('/'.join(source_path.split(\"/\")[:-1]), 'tmp')\nif not os.path.exists(source_dest):\nos.mkdir(source_dest)\nstart_name = sys.argv[1]\nfile_name_list = list()\nfor file in os.listdir(source_path):\nif file.endswith('.png'):\nfile_name_list.append(file)\nstart_name = int(start_name)\nfor file in file_name_list:\nos.rename(os.path.join(source_path,file), os.path.join(source_path, f\"{str(start_name)}.png\"))\nstart_name += 1\ntime.sleep(1)\nfor file in os.listdir(source_path):\nimage = os.path.join(source_path, str(file))\nsrc = cv2.imread(image)\nresult = cv2.resize(src, (960, 540))\nresizeImage = os.path.join(source_dest, str(file))\nprint(resizeImage)\ncv2.imwrite(str(resizeImage), result)\ncv2.waitKey(0)\ncv2.destroyAllWindows()\ntime.sleep(1)\nos.system(f'rm -rf {source_path}/*')\nos.system(f'mv {source_dest}/* {source_path}')\nos.system(f'rm -rf {source_dest}')\nprint(\"\u4e0b\u4e00\u4e2a\u5e8f\u53f7\uff1a\", start_name)\n \u6839\u636e\u7ec8\u7aef\u8f93\u51fa\u7684\u4e0b\u4e00\u4e2a\u5e8f\u53f7\u7684\u63d0\u793a\uff0c\u6267\u884c Python \u6587\u4ef6\u7684\u65f6\u5019\u4f20\u53c2\u3002 python rename_pic.py 249\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"\uff082\uff09\u5de5\u5177\u6807\u6ce8","text":"\u4f7f\u7528\u5de5\u5177 labelImg \u6807\u6ce8 sudo pip3 install PyQt5==5.13\nsudo pip3 install labelImg\n \u7ec8\u7aef\u76f4\u63a5\u8f93\u5165 labelImg\uff0c\u56de\u8f66 \u6807\u6ce8\u6a21\u5f0f\u9009\u62e9\uff1aPascalVOC"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u667a\u80fd\u6807\u6ce8","text":"\u6253\u5f00\u5c4f\u5e55\u5f55\u5236\u8f6f\u4ef6\uff0c\u5f55\u5236\u624b\u52a8\u64cd\u4f5c\u4e00\u6b21\u6d4b\u8bd5\u7528\u4f8b\uff0c\u7136\u540e\u5c06\u5f55\u5236\u7684\u89c6\u9891\u8fdb\u884c\u5206\u5e27\uff0c\u7136\u540e\u5bf9\u6bd4\u524d\u4e24\u5e27\u56fe\u6807\u76f8\u4f3c\u5ea6\uff0c\u5254\u9664\u76f8\u4f3c\u5ea6\u8fc7\u9ad8\u7684\u56fe\u7247\uff0c\u5728\u4fdd\u8bc1\u7d20\u6750\u591a\u6837\u6027\u7684\u524d\u63d0\u4e0b\uff0c\u5254\u9664\u91cd\u590d\u591a\u4f59\u7684\u56fe\u7247\u751f\u6210\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u96c6\uff0c\u7136\u540e\u53d6\u51fa\u63a7\u4ef6\u6a21\u677f\u6570\u636e\u96c6\uff0c\u901a\u8fc7 OpenCV \u6a21\u677f\u5339\u914d\u83b7\u53d6\u63a7\u4ef6\u5728\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u56fe\u7247\u4e2d\u6240\u5728\u7684\u5de6\u4e0a\u3001\u5de6\u4e0b\u3001\u53f3\u4e0a\u3001\u53f3\u4e0b\u56db\u5904\u5750\u6807\uff0c\u4ece\u800c\u6839\u636e\u6a21\u677f\u6570\u636e\u96c6\u751f\u6210\u6807\u6ce8\u6570\u636e\u3002\u53c2\u8003\u76ee\u5f55 AnnotationMaterial"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"\uff081\uff09\u6a21\u677f\u6570\u636e\u96c6\u51c6\u5907","text":"1\u3001\u5728\u754c\u9762\u622a\u53d6\u9700\u8981\u6807\u6ce8\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u653e\u5728\u76ee\u5f55\u4e0b AnnotationMaterial/template/img 2\u3001\u7ef4\u62a4\u63a7\u4ef6\u540d\u4e0e\u5143\u7d20\u63a7\u4ef6\u7684\u952e\u5bf9\uff0c\u4e00\u4e2a\u63a7\u4ef6\u540d\u53ef\u5bf9\u5e94\u591a\u4e2a\u5143\u7d20\u63a7\u4ef6 menu:\n- menu.jpg\n- menu1.jpg\n- menu2.jpg\n- menu3.jpg\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"\uff082\uff09\u7d20\u6750\u96c6\u51c6\u5907","text":"\u5f55\u5236\u89c6\u9891\u6216\u6216\u5c4f\u5e55\u622a\u56fe\u653e\u7f6e\u76ee\u5f55 AnnotationMaterial/source"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u5f00\u59cb\u6807\u6ce8","text":"python3 AnnotationMaterial/main.py\n \u751f\u6210\u7684\u6807\u6ce8\u6570\u636e\u5b58\u653e\u5728 AnnotationMaterial/result"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#mmdetection","title":"\u56db\u3001MMDetection","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1-mmdetection","title":"1\u3001 MMDetection \u4ee3\u7801","text":"MMDetection \u662f\u4e00\u4e2a\u6709\u540d\u7684\u6df1\u5ea6\u5b66\u4e60\u76ee\u6807\u68c0\u6d4b\u5f00\u6e90\u9879\u76ee\uff0c\u4e5f\u662f openMMlab \u7684\u62db\u724c\u9879\u76ee\uff0c\u4e3a\u4ec0\u4e48\u9009\u62e9\u5b83\uff0c\u5c0f\u5b69\u513f\u6ca1\u5a18\u8bf4\u6765\u8bdd\u957f\uff0c\u611f\u5174\u8da3\u53ef\u4ee5\u81ea\u884c\u6df1\u5165\u4e86\u89e3\uff1b \u4f60\u53ef\u4ee5\u76f4\u63a5\u5728 GitHub \u4e0a\u514b\u9686\u4ee3\u7801\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u54b1\u4eec\u4ed3\u5e93\u4e0b Train \u76ee\u5f55\u4e2d\u4ee3\u7801\uff0cTrain \u4e2d\u7684\u4ee3\u7801\u4e5f\u662f\u4ece GitHub \u4e0a\u62c9\u53d6\u7684\uff0c\u4e0d\u8fc7\u6211\u4eec\u6839\u636e\u9879\u76ee\u9700\u8981\u505a\u4e86\u4e00\u4e9b\u4e8c\u6b21\u5f00\u53d1\uff0c\u63a8\u8350\u76f4\u63a5\u4f7f\u7528\u5b83\u3002 \u5982\u679c\u4f60\u60f3\u4ece GitHub \u4e0a\u62c9\uff1a git clone https://github.com/open-mmlab/mmdetection.git\n# \u4e0d\u80fd\u76f4\u63a5\u62c9\u53d6\u4e3b\u5206\u652f\uff0c\u5efa\u8bae\u4f7f\u75282.12\u7248\u672c\uff0c\u4e0d\u540c\u7684\u7248\u672c\u5bf9\u5e94\u7684mmcv\u7248\u672c\u662f\u4e0d\u540c\u7684\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-voc2coco","title":"2\u3001\u62c9\u53d6 voc2coco \u4ee3\u7801","text":"git clone https://github.com/Tony607/voc2coco.git\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-coco","title":"3\u3001\u8f6c\u6362 coco \u6570\u636e\u96c6","text":"\u5c06\u6240\u6709\u7684\u56fe\u7247\u548cxml\u6587\u4ef6\u653e\u5165train2017\uff0c\u4ece\u4e2d\u6311\u9009\u51e0\u7ec4\u653e\u5165val2017\uff08\u6d4b\u8bd5\u96c6\uff09 cd mmdetection/data/coco\npython voc2coco.py train2017 annotations/instances_train2017.json\npython voc2coco.py val2017 annotations/instances_val2017.json\n \u751f\u6210json\u6587\u4ef6"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4_1","title":"4\u3001\u4fee\u6539\u914d\u7f6e","text":"\uff081\uff09\u8bfb\u53d6\u6a21\u578b\u540d\u79f0 import json\nmodule_name = []\nwith open('./instances_train2017.json', \"r+\") as f:\njson_file = f.read()\njson_dict = json.loads(json_file)\nmodule_list = json_dict.get('categories')\nfor module_info in module_list:\nname = module_info.get('name')\nmodule_name.append(name)\nprint(module_name)\nprint(\"module_num:\", len(module_name))\n # \u6ce8\u610f\u5bf9\u6bd4instances_train2017.json\u91cc\u9762\u6a21\u578b\u540d\u79f0\u7684\u987a\u5e8f\uff0c\u4e0eCLASSES\u548ccoco_classes\u91cc\u9762\u7684\u987a\u5e8f\u4fdd\u6301\u4e00\u81f4\u3002\n \uff082\uff09\u4fee\u6539 faster_rcnn_r101_2x_coco.py mmdetection/xianjin/faster_rcnn_r101_2x_coco.py \u4fee\u653946\u884c\uff0cnum_clasess\u7684\u503c\uff0c\u65b0\u589e1\u4e2a\uff0c\u5c31 +1\uff1b \uff083\uff09\u4fee\u6539 coco.py mmdetection/mmdet/datasets/coco.py CLASSES = ()\uff0c\u5728\u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b \uff084\uff09\u4fee\u6539 class_names.py mmdetection/mmdet/core/evaluation/class_names.py coco_classes \u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#5","title":"5\u3001\u7f13\u5b58\u6e05\u7406","text":"\u5220\u9664 mmdetection/build \u76ee\u5f55 python setup.py install\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#6","title":"6\u3001\u8bad\u7ec3\u6a21\u578b","text":"\uff081\uff09\u6307\u5b9a\u81ea\u5df1\u914d\u7f6e\u7684\u8bad\u7ec3\u6a21\u578b\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py --gpus 1\n \uff082\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u6d4b\u8bd5\u96c6\u7ed3\u679c\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py xianjin/epoch_24.pth --show\n \uff083\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u51c6\u786e\u5ea6\uff1b python tools/analysis_tools/analyze_logs.py plot_curve xianjin/20210530_011907.log.json --keys acc\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#7","title":"7\u3001\u5feb\u6377\u64cd\u4f5c","text":"python3 run.py\n \u5c06\u4ee5\u4e0a 4 - 7 \u6b65\u64cd\u4f5c\u6574\u5408\u6210 run.py\uff0c\u4e00\u952e\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u4e94\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\uff1b \u670d\u52a1\u7aef\u4e00\u53f0\uff08\u76ee\u524d\u4ec5\u652f\u6301AMD\u67b6\u6784\uff09\uff1b \u91c7\u96c6\u76d2\u4e00\u4e2a \uff08ACASIS hdmi\u89c6\u9891\u91c7\u96c6\u5361\uff0chttps://item.jd.com/10024310742602.html \uff09\uff1b USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\uff1b USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff1b \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5USB\u5ef6\u957f\u7ebf\uff1b \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u63a8\u8350\u914d\u7f6e","text":"\u6267\u884c\u7528\u4f8b\u7684\u670d\u52a1\u7aef\u5bf9\u914d\u7f6e\u6ca1\u6709\u7279\u6b8a\u8981\u6c42\uff0c\u5982\u679c\u6761\u4ef6\u5141\u8bb8\u914d\u7f6e\u8d8a\u9ad8\uff0c\u8bc6\u522b\u901f\u5ea6\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n \u6d4b\u8bd5\u673a\u4e0a\u4e0d\u6267\u884c\u4efb\u4f55\u811a\u672c\uff0c\u5177\u4f53\u914d\u7f6e\u6839\u636e\u6d4b\u8bd5\u9700\u8981\u51b3\u5b9a\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#usb_mk","title":"\u516d\u3001USB_MK\u4e32\u53e3\u9a71\u52a8\u65b9\u6cd5","text":"\u4f4d\u4e8econtrol_method\u76ee\u5f55\u4e0b\u7684usb_mk.py\u6587\u4ef6 \uff081\uff09\u5217\u51fa\u53ef\u901a\u4fe1\u7684\u7aef\u53e3 python3 -m serial.tools.list_ports -v\n \uff082\uff09\u4fee\u6539\u4e32\u53e3\u7684\u6743\u9650 sudo chmod 777 /dev/ttyACM0\n \uff083\uff09\u5b9e\u4f8b\u5316USB_MK import UsbMk\nusb_mk = UsbMk(\"/dev/ttyACM0\", 9600) # \u8bbe\u5907\u9ed8\u8ba49600\u4e3a\u6ce2\u7279\u7387\uff0c\u63a7\u5236\u4f20\u8f93\u901f\u7387\n \uff084\uff09USB\u4e32\u53e3\u8bbe\u5907\u9ed8\u8ba4\u6ce2\u7279\u7387\u4e3a9600\uff08\u7ecf\u6d4b\u8bd5\u6ce2\u7279\u73879600\u51c6\u786e\u6027\u6700\u597d\uff09\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up() # \u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u6c49\u5b57\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e\n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff083\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff084\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff085\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() # \u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2\n \uff086\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff087\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff088\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e03\u3001\u65b9\u6cd5\u8c03\u7528\u5165\u53c2\u89c4\u5219","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_7","title":"1\u3001\u57fa\u7c7b","text":"class Base:\ndef __init__(self):\nself._obj = image\nself._usb = usb_mk\ndef find_element_by_ai(self, element):\nreturn self._obj.find_element(element)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_6","title":"2\u3001\u5165\u53c2\u8bf4\u660e","text":"\u56fe\u50cf\u8bc6\u522b\u65b9\u6cd5\u5165\u53e3\u4e3a Base \u7c7b\u4e0b\u7684 find_element_by_ai \u3002\u4ec5\u63a5\u53d7\u4e00\u4e2a\u53c2\u6570 element\uff0c\u7c7b\u578b\u4e3a string\u3002 \u53ef\u8bc6\u522b\u7684 string \u683c\u5f0f\uff1a \uff081\uff09\u5927\u56fe\u6807\uff08 \u56fe\u6807\u5927\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\uff0c\u4f8b\uff1a Base().find_element_by_ai(\"window\")\n \uff082\uff09\u5927\u56fe\u6807 / \u5c0f\u56fe\u6807\uff08\u56fe\u6807\u5c0f\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5c0f\u56fe\u6807\uff0c\u4f8b\uff1awindow/search_btn Base().find_element_by_ai(\"window/search_btn\")\n \uff083\uff09\u5927\u56fe\u6807 / OCR\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\u5185\u7684\u6587\u5b57\uff0c\u4f8b\uff1amenu/\u5c5e\u6027 Base().find_element_by_ai(\"menu/\u5c5e\u6027\")\n \uff084\uff09OCR\uff1a\u5168\u5c4f\u8bc6\u522b\u6587\u5b57 Base().find_element_by_ai(\"\u641c\u7d22\")\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516b\u3001\u9690\u85cf\u9f20\u6807","text":"\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u8fc7\u6765\u7684\u89c6\u9891\u6d41\uff0c\u5728\u8bc6\u522b\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u53d7\u5230\u9f20\u6807\u5f71\u54cd\uff0c\u56e0\u6b64\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u9690\u85cf\u9f20\u6807\u3002 \u5c4f\u853d\u9f20\u6807\u5149\u6807\u663e\u793a ```shell script /etc/lightdm/lightdm.conf \u5728`[Seat:*]`\u4e0b\u9762\u6dfb\u52a0\u53c2\u6570\n```shell script\nxserver-command=X -bs -core -nocursor\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e5d\u3001\u667a\u80fd\u81ea\u52a8\u5316\u7684\u610f\u4e49","text":"1\u3001\u6539\u5584 Acessibility \u5b9a\u4f4d\u7684\u7a33\u5b9a\u6027\u95ee\u9898 Acessibility \u5c5e\u6027\u5b9a\u4f4d\u5b58\u5728\u5076\u5c14\u5931\u6548\u7684\u60c5\u51b5 \uff081\uff09\u5f00\u53d1\u5728\u505a\u65b0\u9700\u6c42\u5f00\u53d1\u65f6\u53ef\u80fd\u6d89\u53ca\u5230\u5bf9\u5c5e\u6027\u6807\u7b7e\u7684\u4fee\u6539\u6216\u8005\u5c42\u7ea7\u7684\u8c03\u6574\uff0c\u53ef\u80fd\u9020\u6210\u81ea\u52a8\u5316\u7528\u4f8b\u65e0\u6cd5\u5b9a\u4f4d\u5230\u5143\u7d20\u3002 \u6bd4\u59821040\u9636\u6bb5\uff0c\u97f3\u4e50\u91cd\u6784\u7684\u65f6\u5019\uff0c\u5f00\u53d1\u5bf9\u90e8\u5206\u5c5e\u6027\u548c\u5c42\u7ea7\u505a\u4e86\u4fee\u6539\uff0c\u5bfc\u81f4\u81ea\u52a8\u5316\u7528\u4f8b\u5b9a\u4f4d\u65b9\u6cd580%\u9700\u8981\u4fee\u6539\u3002 \u5f00\u53d1\u65b0\u529f\u80fd\u7684\u65f6\u5019\u5076\u5c14\u4e5f\u4f1a\u5bf9\u5c5e\u6027\u505a\u8c03\u6574\uff0c\u9047\u52305\u6b21\u3002 \uff082\uff09\u76ee\u524d\u4e3b\u8981\u4f7f\u7528Dogtail\u8bc6\u522b\u5e94\u7528Acessibility\u5c5e\u6027\u8fdb\u884c\u5b9a\u4f4d\uff0c\u662f\u83b7\u53d6\u5e94\u7528\u5f53\u524d\u754c\u9762\u7684\u5c5e\u6027tree\uff0c\u5728\u5e94\u7528\u8df3\u8f6c\u540e\uff0cDogtail\u5b58\u5728\u65e0\u6cd5\u53ca\u65f6\u83b7\u53d6\u5f53\u524d\u5c5e\u6027\u5217\u8868\u7684\u60c5\u51b5\u3002 \u591a\u5a92\u4f53\u8c03\u7528\u6587\u7ba1\u7a97\u53e3\u7684\u65f6\u5019\uff0c\u51fa\u73b0\u627e\u4e0d\u5230\u6587\u7ba1\u91cc\u9762\u5143\u7d20\u7684\u60c5\u51b5\uff0c\u76ee\u524d\u51fa\u73b010+\u6b21\u3002 \u5e94\u7528\u8bbe\u7f6e\u9875\u9762\u7684\u5c5e\u6027\u5076\u5c14\u5b58\u5728\u627e\u4e0d\u5230\u7684\u60c5\u51b5\uff0c\u9047\u52305\u6b21\u3002 \uff083\uff09Dogtail\u5de5\u5177\u672c\u8eab\u5b58\u5728\u95ee\u9898\uff0c\u6709\u65f6\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u5019\u5f88\u6162\uff0c\u8ba9\u4eba\u65e0\u6cd5\u63a5\u53d7\uff0c\u76ee\u524d\u51fa\u73b0\u8fc7\u5f88\u591a\u6b21\u3002 \u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u95f4\u6bd4\u5e73\u5e38\u61623\u500d\uff0c\u51fa\u73b04\u6b21\u3002 2\u3001\u89e3\u51b3\u4e86\u4f7f\u7528\u7edd\u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898 \u90e8\u5206\u63a7\u4ef6\u65e0\u6cd5\u6dfb\u52a0 Acessibility \u5c5e\u6027\u4ece\u800c\u4f7f\u7528\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u51fa\u73b0\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898\u3002 \uff081\uff09\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u65b9\u6cd5\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u76ee\u6807\u56fe\u7247\u8d44\u6e90\uff0c\u5728 UI \u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u4f1a\u6d89\u53ca\u5230\u76ee\u6807\u8d44\u6e90\u7684\u66ff\u6362\uff0c\u6bd4\u8f83\u8017\u8d39\u4eba\u529b\u3002 \uff082\uff09\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6cd5\u5bf9\u6bd4\u7cbe\u5ea6\u6bd4\u8f83\u641e\uff0c\u5982\u679cUI \u7684\u53d8\u66f4\u4f1a\u9020\u6210\u65e0\u6cd5\u51c6\u786e\u5b9a\u4f4d\u5230\uff0c\u81ea\u52a8\u5316\u811a\u672c\u5065\u58ee\u6027\u4e0d\u8db3\u3002 3\u3001\u4f7f\u7528\u673a\u5668\u5206\u79bb\uff0c\u89e3\u51b3\u4e86\u81ea\u52a8\u5316\u811a\u672c\u5bf9\u5e94\u7528\u7684\u5f71\u54cd\uff0c\u771f\u5b9e\u8fd8\u539f\u7528\u6237\u7684\u4f7f\u7528\u573a\u666f \u673a\u5668\u5206\u79bb\u7684\u67b6\u6784\u8bbe\u8ba1\uff0c\u4fdd\u8bc1\u4e86\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u73af\u5883\u5b8c\u5168\u7b49\u540c\u4e8e\u7528\u6237\uff0c\u6392\u9664\u6d4b\u8bd5\u811a\u672c\u7684\u5f71\u54cd\u3002 \uff081\uff09\u76ee\u524d\u7684\u529f\u80fd\u81ea\u52a8\u5316\u662f\u5728\u6d4b\u8bd5\u673a\u4e0a\u76f4\u63a5\u8fd0\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\uff0c\u52a0\u4e0a\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u6211\u4eec\u6dfb\u52a0\u4e86\u4e00\u4e9b\u8fdb\u7a0b\u76d1\u63a7\u3001\u89c6\u9891\u5f55\u5236\u7b49\u529f\u80fd\uff0c\u81ea\u52a8\u5316\u811a\u672c\u672c\u8eab\u4f1a\u6d88\u8017\u4e00\u4e9b\u7cfb\u7edf\u8d44\u6e90\uff0c\u65e0\u6cd5\u8fd8\u539f\u771f\u662f\u7684\u7528\u6237\u4f7f\u7528\u573a\u666f\u3002 \uff082\uff09\u6027\u80fd\u6d4b\u8bd5\u9700\u8981\u6392\u9664\u5176\u4ed6\u7a0b\u5e8f\u7684\u8d44\u6e90\u6d88\u8017\u5f71\u54cd\uff0c\u6027\u80fd\u81ea\u52a8\u5316\u91c7\u7528\u673a\u5668\u5206\u79bb\uff0c\u4fdd\u8bc1\u4e86\u6027\u80fd\u6570\u636e\u7684\u51c6\u786e\u6027\u3002 \u4ee5\u524d\u7684\u7528\u4f8b\u6267\u884c\u8017\u65f6\u6ca1\u6761\u572830\u79d2\u5de6\u53f3\uff0c\u73b0\u5728\u7528\u4f8b\u8017\u65f6\u572810\u79d2\u3002 4\u3001\u89e3\u51b3\u4e86UI \u8c03\u6574\u5bfc\u81f4\u5b9a\u4f4d\u5931\u8d25\u7684\u4e0d\u7a33\u5b9a\u6027\u95ee\u9898 \uff081\uff09\u89e3\u51b3\u4e86\u56e0 UI \u8c03\u6574\u5bfc\u81f4\u63a7\u4ef6\u4f4d\u7f6e\u53d8\u5316\u6216\u8272\u5dee\u53d8\u5316\u540e\u5b9a\u4f4d\u4e0d\u51c6\u786e\u7684\u95ee\u9898\uff0c\u53ea\u8981\u63a7\u4ef6\u6587\u6848\u548c\u63a7\u4ef6\u5916\u8fb9\u6846\u65e0\u53d8\u5316\u5747\u53ef\u51c6\u786e\u5b9a\u4f4d\uff1b \uff082\uff09\u76ee\u524d\u4e5f\u4f1a\u91c7\u7528\u57fa\u4e8eUI\u7684\u5b9a\u4f4d\u65b9\u6848\uff0c\u5982\u679cUI\u4f4d\u7f6e\u6709\u8c03\u6574\uff0c\u4f1a\u5bfc\u81f4\u5143\u7d20\u65e0\u6cd5\u5b9a\u4f4d\u3002 5\u3001\u7b80\u5316\u4e86\u7528\u4f8b\u7ed3\u6784\uff0c\u63d0\u5347\u7f16\u5199\u53cb\u597d\u5ea6 \uff081\uff09\u667a\u80fd\u81ea\u52a8\u5316\u8bc6\u522b\u5143\u7d20\u7684\u65b9\u6cd5\u53ea\u6709\u4e00\u4e2a\uff0c\u5c31\u662f\u57fa\u4e8e\u6211\u4eec\u8bad\u7ec3\u7684\u6a21\u578b\u8bc6\u522b\u89c6\u9891\u6d41\u4e2d\u7684\u5143\u7d20\uff0c\u7ecf\u8fc7\u811a\u672c\u5c01\u88c5\u4e4b\u540e\uff0c\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u4e2d\u6240\u6709\u5b9a\u4f4d\u7684\u64cd\u4f5c\u90fd\u53ea\u9700\u8981\u8c03\u7528\u8fd9\u4e00\u4e2a\u65b9\u6cd5\u5c31\u884c\u4e86\uff0c\u7f16\u5199\u81ea\u52a8\u5316\u811a\u672c\u7684\u96be\u5ea6\u5927\u5927\u964d\u4f4e\u3002 \uff082\uff09\u4e5f\u662f\u7531\u4e8e\u8c03\u7528\u65b9\u6cd5\u7b80\u5355\uff0c\u5728 UI \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u4e2d\u7684\u5206\u5c42\u7ed3\u6784\u5c06\u4f1a\u51cf\u5c11\uff0c\u591a\u7ee7\u627f\u7684\u60c5\u51b5\u4f1a\u51cf\u5c11\uff0c\u81ea\u52a8\u5316\u4ee3\u7801\u7684\u8c03\u7528\u7ed3\u6784\u4e5f\u4f1a\u53d8\u5f97\u7b80\u5355\uff0c\u800c\u4e14\u529f\u80fd\u6d4b\u8bd5\u540c\u5b66\u7f16\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u66f4\u52a0\u5bb9\u6613\u4e0a\u624b\u3002 \u4ee5\u524d\u5199\u7528\u4f8b\u7531\u4e8e\u9700\u8981\u7ed3\u5408\u4e0d\u540c\u7684\u6a21\u5757\uff0c\u8c03\u7528\u4e0d\u540c\u7684\u65b9\u6cd5\uff0c\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u5e76\u5b8c\u6210\u8c03\u8bd5\u7684\u65f6\u95f4\u5e73\u5747\u572820-30\u5206\u949f\uff0c\u73b0\u5728\u5199\u7528\u4f8b\u811a\u672c\u80fd\u57285\u5206\u949f\u5de6\u53f3\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":"# =============================================\n# Attribution : Application Test Department III\n# Time : 2023/1/3\n# Author : ut003281\n# =============================================\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u7b80\u8ff0","text":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5 \u901a\u8fc7\u81ea\u52a8\u5316\u624b\u6bb5\u5bf9\u5e94\u7528\u8fdb\u884c\u6027\u80fd\u6d4b\u8bd5\uff0c\u63d0\u4f9b\u65b9\u4fbf\u7684\u73af\u5883\u90e8\u7f72\u3001\u8fd0\u884c\u914d\u7f6e\u3001\u7528\u4f8b\u7f16\u5199\u7b49\uff0c\u7528\u4e8e\u684c\u9762\u5e94\u7528\u7684\u51b7\u70ed\u542f\u52a8\u3001\u8d44\u6e90\u62f7\u8d1d\u3001\u9875\u9762\u8df3\u8f6c\u7b49\u6027\u80fd\u573a\u666f\u6d4b\u8bd5\u3002 \u4ed3\u5e93\u5730\u5740\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-perf-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u4ee3\u7801\u7ed3\u6784","text":"autotest-perf-aitest\n\u251c\u2500\u2500 apps # \u5b58\u653e\u6240\u6709\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u811a\u672c\n\u251c\u2500\u2500 conftest.py # pytest hook\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 CURRENT # \u7248\u672c\u5185\u5bb9\n\u251c\u2500\u2500 docs # \u6587\u6863\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u952e\u503c\u5bf9\u7167\u8868.pdf # \u4e32\u53e3\u7ebfcode\u4e0e\u6309\u952e\u7684\u5bf9\u7167\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u6027\u80fd\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\u6267\u884c\u5668\u4f7f\u7528\u6307\u5357.md # \u6267\u884c\u5668\u811a\u672c\u4f7f\u7528\u6307\u5357\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 USB\u4e32\u53e3\u8f6cUSB\u952e\u76d8\u9f20\u6807\u7ebf\u534f\u8bae\u6587\u4ef6V1.0.pdf # \u4e32\u53e3\u534f\u8bae\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput-0.28.2.zip # Linux\u4e0b\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\u7684\u6e90\u7801\uff0c\u53ef\u6839\u636e\u67b6\u6784\u6253\u5305\n\u251c\u2500\u2500 manage.py # \u529f\u80fd\u4e3b\u5165\u53e3\n\u251c\u2500\u2500 pytest.ini # pytst \u914d\u7f6e\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 setting # \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 client.ini # \u6d4b\u8bd5\u673a IP \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5168\u5c40\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dev_env.sh # \u5bbf\u4e3b\u673a\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose_no_relay.yml # \u65e0\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose.yml # \u6709\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker_login.sh # docker \u767b\u9646\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 res\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 black.png # \u5168\u9ed1\u56fe\u7247\uff0c\u7528\u4e8e\u4fee\u6539\u58c1\u7eb8\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_5000.deb # 3A5000 \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_amd64.deb # amd \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_arm64.deb # arm \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_mips64.deb # mips \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_sw_64.deb # sw \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 server.ini # \u670d\u52a1\u5668\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 setup.sh # \u5bb9\u5668\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 template # \u521b\u5efa app \u57fa\u7840\u811a\u672c\u6a21\u677f\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 app_template\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ${app_name}_widget.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 control-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 images\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 test_${app_name}_01_scene.json-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 test_${app_name}_01_scene.py-tpl\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 uos_docker # \u5bb9\u5668\u73af\u5883\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dockerfile\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 requirements.txt\n\u2514\u2500\u2500 src\n \u251c\u2500\u2500 analysis_save.py # \u89e3\u6790\u56fe\u7247\u6d41\u7ed3\u679c\uff0c\u6c47\u603b\u751f\u6210 excel \u62a5\u544a\n\u251c\u2500\u2500 base_widget.py # \u5c01\u88c5\u7684\u57fa\u7840\u64cd\u4f5c\uff0c\u5e94\u7528\u8c03\u7528\u7684\u4e3b\u5165\u53e3\u65b9\u6cd5\n\u251c\u2500\u2500 cmdctl.py # \u8c03\u7528\u547d\u4ee4\u884c\u4f7f\u7528\n\u251c\u2500\u2500 global_value.py # \u5168\u5c40\u53d8\u91cf\n\u251c\u2500\u2500 image_utils.py # \u56fe\u7247\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 __init__.py\n \u251c\u2500\u2500 logger_utils.py # \u65e5\u5fd7\u914d\u7f6e\n\u251c\u2500\u2500 pdocr.py # ocr \u914d\u7f6e\n\u251c\u2500\u2500 public_method.py # \u4e00\u4e9b\u65b9\u4fbf\u7684\u5c01\u4f4f\n\u251c\u2500\u2500 record.py # \u5f55\u5c4f\u76f8\u5173\n\u251c\u2500\u2500 rtk # \u8fd0\u884c\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 _base.py # \u4e00\u4e9b\u679a\u4e3e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 install_env.py # \u5b89\u88c5\u73af\u5883\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 local_runner.py # \u8fd0\u884c\u7528\u4f8b\n\u251c\u2500\u2500 serial_communication # \u4e32\u53e3\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 power_control.py # \u7ee7\u7535\u5668\u64cd\u4f5c\uff0c\u4f7f\u7528\u7ee7\u7535\u5668\u8fde\u63a5\u4e3b\u673a\u7535\u6e90\uff0c\u63a7\u5236\u5f00\u5173\u673a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 serial_common.py # \u4e32\u53e3\u516c\u5171\u65b9\u6cd5\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 usb_mk.py # \u952e\u9f20\u64cd\u4f5c\u57fa\u7840\u5c01\u88c5\n\u251c\u2500\u2500 shortcut_key.py # \u5feb\u6377\u952e\u7684\u5c01\u88c5\n\u251c\u2500\u2500 singleton.py # \u5355\u4f8b\u6a21\u5f0f\n\u251c\u2500\u2500 start_app.py # \u521b\u5efa app\n\u2514\u2500\u2500 write_xlsx.py # \u751f\u6210 excel\n# __init__.py \u6587\u4ef6\u4e3a\u6807\u8bc6\u8be5\u76ee\u5f55\u662f\u4e00\u4e2aPython\u7684\u6a21\u5757\u5305\uff0c\u9879\u76ee\u4e2d\u7684__init__.py\u5747\u4e3a\u7a7a\u6587\u4ef6\u3002\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u73af\u5883\u642d\u5efa","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\u3002 \u670d\u52a1\u7aef\u4e00\u53f0\u3002\uff08\u4ec5\u652f\u6301 AMD \u67b6\u6784\uff0c\u82e5\u9700\u5176\u4ed6\u67b6\u6784\uff0c\u54a8\u8be2\u76f8\u5173\u5f00\u53d1\u4eba\u5458\uff09 \u91c7\u96c6\u76d2\u4e00\u4e2a\u3002 \uff08ACASIS HDMI \u89c6\u9891\u91c7\u96c6\u76d2\uff0chttps://item.jd.com/100013302599.html#crumb-wrap \uff09 USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\u3002\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"\uff082\uff09\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\u3002 USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff08USB3.0 \u63a5\u53e3\u4e0a\uff09\u3002 \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5 USB \u5ef6\u957f\u7ebf\u3002 \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u670d\u52a1\u7aef\u63a8\u8350\u914d\u7f6e","text":"\u914d\u7f6e\u8d8a\u9ad8\uff0c\u89e3\u6790\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"2\u3001\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa","text":" \u6253\u5f00\u63a7\u5236\u4e2d\u5fc3\uff0c\u8d26\u6237\u8bbe\u7f6e\u4e3a\u3010\u81ea\u52a8\u767b\u5f55\u3011\u548c\u3010\u65e0\u5bc6\u7801\u767b\u5f55\u3011\uff0c\u7535\u6e90\u7ba1\u7406\u4e2d\u4f7f\u7528\u7535\u6e90\u5168\u90e8\u8bbe\u7f6e\u4e3a\u3010\u4ece\u4e0d\u3011\uff0c\u5f00\u542f\u5f00\u53d1\u8005\u6a21\u5f0f\u3002 \u6839\u636e\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u8981\u6c42\uff0c\u5bfc\u5165\u76f8\u5173\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\uff1a\u5bfc\u5165\u76f8\u518c\u3001\u5f71\u9662\u3001\u97f3\u4e50\u7684\u6d4b\u8bd5\u8d44\u6e90\u3002 \u5728\u670d\u52a1\u7aef\u6253\u5f00\u76f8\u673a\u5e94\u7528\u540e\uff0c\u5c06\u6d4b\u8bd5\u673a\u684c\u9762\u58c1\u7eb8\u66f4\u6362\u4e3a\u7eaf\u8272\u58c1\u7eb8\uff08\u6ce8\u610f\uff0c\u670d\u52a1\u7aef\u9700\u63d0\u524d\u5f00\u542f\u76f8\u673a\u540e\u518d\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u58c1\u7eb8\uff0c\u5efa\u8bae\u7eaf\u9ed1\u58c1\u7eb8 setting/res/black.png\uff09 \u5728\u6587\u4ef6\u7ba1\u7406\u5668\u4e2d\uff0c\u5c06\u9009\u9879 \u4e3b\u83dc\u5355-\u8bbe\u7f6e-\u9884\u89c8-\u56fe\u7247\u9884\u89c8 \u53d6\u6d88\u52fe\u9009\uff08\u5982\u4e0d\u53d6\u6d88\uff0c\u4f1a\u5f71\u54cd\u622a\u56fe\u5f55\u5c4f\u5e94\u7528\u7684\u6027\u80fd\u6570\u636e\uff09 \u79fb\u52a8\u6216\u5220\u9664\u7cfb\u7edf Logo \uff0c\u6392\u9664\u684c\u9762\u53f3\u4e0b\u89d2 Logo \u7684\u5f71\u54cd\uff08\u91cd\u542f\u751f\u6548\uff09\u3002 sudo mv /usr/share/deepin/uos_logo.svg ~/Pictures/\n \u5b89\u88c5\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\uff08\u5fc5\u987b\u5b89\u88c5\uff01\uff01\uff09 AMD \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_amd64.deb ARM \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_arm64.deb MIPS \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_mips64.deb 3A5000 \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_5000.deb \u5b89\u88c5\u547d\u4ee4 sudo dkpg -i xserver-xorg-input-libinput_0.28.2-2_amd64.deb\n \u5b89\u88c5\u65f6\u4f1a\u63d0\u793a\u5df2\u5b58\u5728\u76f8\u540c\u7248\u672c\uff0c\u8bf7\u5ffd\u7565\uff0c\u76f4\u63a5\u8986\u76d6\u5b89\u88c5\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u4e3b\u673a\u624d\u751f\u6548"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u670d\u52a1\u7aef\u4e00\u952e\u73af\u5883\u90e8\u7f72","text":"\u73af\u5883\u642d\u5efa\u524d\u5fc5\u987b\u5148\u8fde\u63a5\u4e0a USB \u4e32\u53e3\u7ebf\u548c\u91c7\u96c6\u76d2\u3002 \u5bbf\u4e3b\u673a\u73af\u5883\u5b89\u88c5 python3 manage.py install --env host\n \u5bb9\u5668\u73af\u5883\u5b89\u88c5 python3 manage.py install --env docker\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u56db\u3001\u914d\u7f6e\u9879","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u670d\u52a1\u7aef\u914d\u7f6e","text":"setting/config/server.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u914d\u7f6e\u9879\uff0c\u5305\u542b\u4e86\u6240\u6709\u670d\u52a1\u7aef\u6240\u6709\u7684\u53ef\u914d\u7f6e\u9879\u3002 \u672c\u5730\u65e0\u7f51\u7edc\u8fd0\u884c \u5c06\u914d\u7f6e\u9879 network=0 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u672c\u5730\u6709\u7f51\u7edc\u8fd0\u884c \u914d\u7f6e\u9879 network=1 (1)\u914d\u7f6e\u9879 client_alias= \u914d\u7f6e\u4e3a\u4f60\u8981\u6d4b\u8bd5\u7684\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5982 Alias1 \u6d4b\u8bd5\u673a\u522b\u540d\u5728 setting/config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 (2)\u914d\u7f6e\u9879 client_alias= \u4e3a\u7a7a\uff0c\u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager --client_alias Alias1\uff0c\u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002(Alias1 \u4e3a\u4f60\u914d\u7f6e\u7684\u6d4b\u8bd5\u673a\u522b\u540d) (1)\u548c(2)\u53ea\u8981\u4f7f\u7528\u5176\u4e00\u5373\u53ef\u3002 \u6709\u7f51\u7edc\u8fd0\u884c\uff0c\u4e14\u9700\u8981\u901a\u8fc7 Jenkins \u4e0a\u8fd0\u884c\u4e00\u4e2a job \uff0c\u540c\u65f6\u63a7\u5236\u591a\u53f0\u673a\u5668\u3002 \u914d\u7f6e\u9879 network=1 \u914d\u7f6e\u9879 client_alias= \u4e0d\u7528\u914d\u7f6e\uff0c\u5728\u8fd0\u884c run.sh \u7684\u65f6\u5019\u76f4\u63a5\u7a7a\u683c\u52a0\u522b\u540d\u5373\u53ef\uff0c\u6bd4\u5982\uff1a\u6d4b\u8bd5\u673a\u522b\u540d\u4e3a Alias1 \uff0c\u4e14\u5df2\u7ecf\u5728 config/client.ini \u4e2d\u914d\u7f6e\u4e86 Alias1 \u7684user ip password \uff0c\u5219\u8fd0\u884c bash run.sh Alias1 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u5728 Jenkins pipeline \u91cc\u9762\u901a\u8fc7\u5e76\u884c stage \u6216\u5e76\u884c\u8c03\u7528\u4e0b\u5c42\u4efb\u52a1\u7684\u65b9\u5f0f\u53ef\u4ee5\u5b9e\u73b0\u5927\u89c4\u6a21\u7684\u6027\u80fd\u6d4b\u8bd5\u9700\u6c42\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;1\u3001KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2\u3001KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f, e.g. TAGS = L1 or smoke\n[case_conf]\n# \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\uff0cocr\u6587\u6848\u8bc6\u522b\u8f83\u6162\uff0c\u4e0d\u63a8\u8350\u4f7f\u7528\nfind_by = stage\n# \u6700\u540e\u4e00\u4e2a\u7a33\u5b9a\u9636\u6bb5\u7684\u5e27\u6570\u8bc6\u522b\n# \u9996\u5e27\u5b58\u5728\u540e\u7684\u7b2c\u4e00\u4e2a\u5927\u4e8e\u8be5\u914d\u7f6e\u5e27\u6570\u7684\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u5c3e\u5e27\nfinal_stable_num=100\n# \u4ece\u8be5\u5e27\u6570\u5f00\u59cb\u8bc6\u522b\u6587\u6848\u6216\u56fe\u7247\uff0c\u51cf\u5c11\u5206\u6790\u65f6\u95f4\nstart_num = 150\n# \u8bc6\u522b\u7684\u6587\u6848\ntext=\n# \u8bc6\u522b\u56fe\u7247\nmatch=apps/xxx/images/match.png\n# \u8bc6\u522b\u76f8\u4f3c\u5ea6\nmatch_rate=0.9\n# \u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6bd4\u5982\u70ed\u542f\u52a8\u7528\u4f8b\uff0c\u4ece\u70b9\u51fb\u6253\u5f00\u5230\u505c\u6b62\u5f55\u5c4f\uff0c\u4e2d\u95f4\u7b49\u5f855\u79d2\uff1b\nduration = 15\n# \u5355\u6761\u7528\u4f8b\u6267\u884c\u7684\u6b21\u6570\ncount = 5\n# \u7a33\u5b9a\u9636\u6bb5\u5212\u5206\u7684\u76f8\u4f3c\u5ea6\nstable_similarity = 0.9997\n[server]\n# \u8c03\u8bd5\u6a21\u5f0f=1\uff0c\u4e3a\u5f00\u542f\u8c03\u8bd5\u6a21\u5f0f\uff0c0\u4e3a\u5173\u95ed\u3002\n# \u8c03\u8bd5\u6a21\u5f0f\u4e0b\u9ed8\u8ba4\u53ea\u6267\u884c\u4e00\u6b21\u7528\u4f8b\uff0c\u4e0d\u5173\u673a\n# \u7f16\u5199\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u5efa\u8bae\u5f00\u542fmaintain\u3002\nMAINTAIN = 0\n# \u8fd0\u884c\u7684\u73af\u5883docker\u5bb9\u5668\u73af\u5883\uff0chost\u5bbf\u4e3b\u673a\u73af\u5883\nENV = docker\n# \u670d\u52a1\u7aef\u5bc6\u7801\nPASSWORD=1\n# \u6307\u5b9a\u6d4b\u8bd5\u673a\u522b\u540d\n# \u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6bd4\u5982\uff1a\n# [AMD]\n# ip=10.8.15.86\n# user=uos\n# \u5176\u4e2d AMD \u4e3a\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5219client_alias=AMD\nCLIENT_ALIAS = x86\uff08Intel-i7\uff09\n# 1 \u5f00\u542f\u7f51\u7edc, 0 \u5173\u95ed\u7f51\u7edc\n# \uff081\uff09\u670d\u52a1\u7aef\u4e0e\u6d4b\u8bd5\u673a\u987b\u5728\u540c\u4e00\u7f51\u6bb5\u4e0b\uff0c\u4f60\u53ef\u4ee5\u5c1d\u8bd5\u5728\u670d\u52a1\u7aef\u901a\u8fc7ssh\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c\u5982\u679c\u53ef\u4ee5\u8fde\u63a5\uff0c\u8bf4\u660e\u7f51\u7edc\u6b63\u5e38\u3002\n# \uff082\uff09\u5f53input_type=FILE_NAME \u65f6\uff0c\u5fc5\u987b\u5f00\u542f\u7f51\u7edc\u3002\nNETWORK = 1\n# \u6027\u80fd\u7ed3\u679c\u7edf\u8ba1\u5355\u4f4d \u6beb\u79d2\u2014ms, \u79d2\u2014s\nUNIT=ms\n# \u6d4b\u8bd5\u673a\u5f00\u673a\u8fdb\u5165\u684c\u9762\u540e\u7b49\u5f85\u65f6\u95f4,\u5355\u4f4d/\u79d2\nSTARTUP_DELAY = 60\n# 1\u4e3a\u5220\u9664\u7f13\u5b58\uff0c0\u4e3a\u4e0d\u5220\u9664\u7f13\u5b58\n# \u7528\u4f8b\u6267\u884c\u5b8c\u540e\u4f1a\u5728report\u76ee\u5f55\u4e0b\u751f\u6210\u667a\u80fd\u89e3\u6790\u7684\u4e00\u4e9b\u7f13\u5b58\u56fe\u7247\u3002\nCACHE = 0\n# \u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u62a5\u544a\u4f1a\u4fdd\u5b58\u5728\u9879\u76ee\u4e0breport\u76ee\u5f55\u4e2d\uff1b\n# \u6307\u5b9a\u62a5\u544a\u76ee\u5f55\u5219\u5b58\u653e\u5230\u6307\u5b9a\u76ee\u5f55\u3002\nREPORT_PATH = report\n# \u670d\u52a1\u7aef\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684icon\u8d44\u6e90\u4f1a\u7f13\u5b58\u5728\u9879\u76ee\u4e0binput\u76ee\u5f55\u4e2d\nINPUT = input/\n# 1\u4e3a\u6d4b\u8bd5\u5b8c\u5173\u673a\uff0c0\u4e3a\u6d4b\u8bd5\u5b8c\u4e0d\u5173\u673a\nSHUTDOWN = 0\n# \u89e3\u6790\u8fdb\u7a0b\u6570\uff08\u4e0d\u63a8\u8350\u4fee\u6539\uff09\n# 3\u4e2a\u8fdb\u7a0b\u89e3\u6790\u89c6\u9891\u5df2\u7ecf\u80fd\u591f\u6ee1\u8db3\uff0c\u5373\u4f7f\u589e\u52a0\u8fdb\u7a0b\u6570\u4e5f\u4e0d\u80fd\u51cf\u5c11\u6574\u4f53\u8017\u65f6\n# \u53e6\u5916\u8fd8\u8981\u770bCPU\u6838\u6570\u662f\u5426\u652f\u6301\u3002\nPARSING_PROCESS = 3\n# 1\u4e3a\u4f7f\u7528\u7ee7\u7535\u5668\u5f00\u5173\u673a\uff0c0\u4e3a\u4f7f\u7528reboot\u547d\u4ee4\u91cd\u542f\u3002\u4f9d\u8d56\u7ee7\u7535\u5668\u786c\u4ef6\u8bbe\u5907\uff0c\u9700\u8981\u4f7f\u7528\u8054\u7cfb\u5f00\u53d1\u8005\nRELAY = 0\n# \u83b7\u53d6\u6d4b\u8bd5\u5e94\u7528\u7684\u7248\u672c, %s \u5360\u4f4d\u5e94\u7528\u540d\n# \u5982\u679c\u8be5\u914d\u7f6e\u4e3a\u7a7a\uff0c\u5219\u4e0d\u83b7\u53d6\u5e94\u7528\u7684\u7248\u672c\u4fe1\u606f\u3002\nCOMMAND = apt policy %s 2>/dev/null|grep \"\u5df2\u5b89\u88c5\"|awk -F \"\uff1a\" \"{print \\$2}\"\n# \u5173\u673a\u7b49\u5f85\u5f00\u542f\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6839\u636e\u6d4b\u8bd5\u673a\u6027\u80fd\u4e0d\u540c\uff0c\u5f00\u5173\u673a\u8017\u65f6\u53ef\u80fd\u4e0d\u540c\uff0c\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u673a\u60c5\u51b5\u914d\u7f6e\u3002\nSHUTDOWN_DELAY = 30\n# \u53ef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u56fe\u7247\u683c\u5f0f\uff0c\u4ee5\u82f1\u6587\u9017\u53f7\u9694\u5f00\u3002\n# \u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u76ee\u524d\u6211\u4eec\u4ec5\u9a8c\u8bc1\u4e86jpg,jpeg,png\u8fd9\u4e09\u79cd\u5e38\u7528\u7684\u56fe\u7247\u683c\u5f0f\u3002\nINPUT_TYPES = jpg,jpeg,png\n# \u6027\u80fd\u5206\u6790\u8865\u5e27\uff0c\u7b49\u4e8e\u6216\u4f4e\u4e8e\u8be5\u503c\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u9700\u8981\u51cf\u6389\u3002\nUN_STAB_START = 3\n# \u670d\u52a1\u7aef\u83b7\u53d6\u6d4b\u8bd5\u673a\u56fe\u50cf\u7684\u5e27\u7387\uff0c\u5373\u6bcf\u79d2\u83b7\u53d6\u591a\u5c11\u5f20\u6d4b\u8bd5\u673a\u4e0a\u7684\u56fe\u50cf\u3002\n# \u9ed8\u8ba4\u5e27\u7387\u4e3a30\u5e27/\u79d2\uff0c\u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u53ef\u80fd\u4f1a\u5bf9\u89e3\u6790\u7ed3\u679c\u9020\u6210\u504f\u5dee\u3002\nFPS = 30\n# \u4ee5\u4e0b\u573a\u666f\u7c7b\u578b\u4f1a\u91cd\u542f\u6d4b\u8bd5\u673a,\u591a\u79cd\u573a\u666f\u4f7f\u7528\u9017\u53f7\u9694\u5f00\nSCENE = cold\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = http://10.8.13.78:8890\n#\u5c4f\u5e55\u56fe\u7247\u4e34\u65f6\u5b58\u653e\u4f4d\u7f6e\nSCREEN_CACHE = /tmp/screen\n# =======================================\n[log]\n# \u65e5\u5fd7\u7ea7\u522b\uff0cOFF\u3001FATAL\u3001ERROR\u3001WARN\u3001INFO\u3001DEBUG\u3001ALL\n# \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u65e5\u5fd7\u8f93\u51fa\uff0clog_cli=INFO\u8868\u793a \u4ec5\u8f93\u51faINFO\u53ca\u4ee5\u4e0a\u7ea7\u522b\u7684\u65e5\u5fd7\u3002\nLOG_LEVEL = DEBUG\n# \u65e5\u5fd7\u6587\u4ef6\u4fdd\u5b58\u8def\u5f84\nLOG_PATH= logs\n# =======================================\n[dockerhub]\n# \u5bb9\u5668\u767b\u9646\u8d26\u53f7\nDOCKER_USER = user\n# \u5bb9\u5668\u767b\u9646\u5bc6\u7801\nDOCKER_PASSWORD = User1234\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u6d4b\u8bd5\u673a\u914d\u7f6e","text":"setting/config/client.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u4fe1\u606f\u3002 \u6709\u7f51\u7edc\u7684\u60c5\u51b5\u4e0b\uff0c\u670d\u52a1\u7aef\u9700\u8981\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u56e0\u6b64\u4f60\u9700\u8981\u5199\u5165 \u6d4b\u8bd5\u673a\u522b\u540d \u3001 user \u3001ip\u3001 password \u3002 # \u6d4b\u8bd5\u673a\u522b\u540d\n[Alias1] # \u6d4b\u8bd5\u673aip\nip=10.8.15.86 # \u6d4b\u8bd5\u673a\u7528\u6237\u540d\nuser=uos\n \u547d\u540d\u5efa\u8bae\uff1aAliasA1\u3001AliasA2\u3001AliasB1\u3001AliasB2\uff0c\u4e0d\u8981\u91cd\u540d\u3002 \u65e0\u7f51\u7edc\u60c5\u51b5\u4e0b\uff0c\u4ec5\u9700\u8981\u5173\u6ce8\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\u9879 width=\u3001 height= \u5373\u53ef\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a [client]\n# \u9ed8\u8ba4\u6d4b\u8bd5\u673a\u7528\u6237\u540d\uff0c\u5bc6\u7801\uff0cip\nip=\nuser=\n# \u6d4b\u8bd5\u673a\u5bc6\u7801\npassword=1\n# \u6d4b\u8bd5\u673a\u4e3b\u9898\ntheme=bloom\n# \u6d4b\u8bd5\u673aicon\u76ee\u5f55\npath=/usr/share/icons\n# \u7cfb\u7edfdesktop\u6587\u4ef6\u7684\u5b58\u653e\u76ee\u5f55\uff0cUOS\u7cfb\u7edf\u9ed8\u8ba4\u4e3a/usr/share/applications\ndesktop_path=/usr/share/applications\n# \u7528\u4e8e\u5224\u65ad\u6d4b\u8bd5\u673a\u662f\u5426\u5f00\u673a\u8fdb\u5165\u684c\u9762\u7684\u8bc6\u522b\u6807\u8bc6\u3002\n# 1\u3001\u901a\u8fc7\u684c\u9762\u56fe\u6807\u8bc6\u522b\u3002\n# - type=FILE_NAME\u65f6\uff0c\u670d\u52a1\u5668\u548c\u6d4b\u8bd5\u673a\u5fc5\u987b\u5728\u540c\u4e00\u5c40\u57df\u7f51\u5185\u3002\n# - power_on=dde-computer\u8868\u793a\u901a\u8fc7\u684c\u9762\u8ba1\u7b97\u673a\u56fe\u6807\u5224\u65ad\u5f00\u673a\u8fdb\u5165\u684c\u9762\u3002\n# 2\u3001\u901a\u8fc7\u672c\u5730\u56fe\u7247\u4f5c\u4e3a\u5f00\u673a\u8bc6\u522b\u3002\n# - type= \u4f20\u5165\u4e3a\u56fe\u7247\u683c\u5f0f\uff0ctype\u652f\u6301\u7684\u7c7b\u578b\u5305\u542b\u5728server.ini\u5185\u914d\u7f6e\u9879input_type=jpg,jpeg,png\u3002\n# - power_on= \u4f20\u5165\u7684\u662f\u672c\u5730\u56fe\u7247\u7684\u8def\u5f84\u3002\ntype=FILE_NAME\npower_on=dde-computer\n# \u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\uff08\u6d4b\u8bd5\u673a\u8fde\u63a5\u91c7\u96c6\u76d2\uff0c\u91c7\u96c6\u76d2\u7684\u5206\u8fa8\u7387\uff09\nheight=1080\nwidth=1920\n[AliasA1] ip=10.8.15.86\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n[AliasA2]\nip=10.8.15.20\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_2","title":"3\u3001\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e","text":"\u968f\u7740\u6d4b\u8bd5\u573a\u666f\u7684\u4e0d\u65ad\u5f15\u5165\uff0c\u53d1\u73b0\u73b0\u6709\u670d\u52a1\u7aef\u91cc\u7684\u914d\u7f6e\u9879\u5e76\u4e0d\u9002\u7528\u4e8e\u6240\u6709\u7684\u6027\u80fd\u573a\u666f\uff0c\u4e8e\u662f\u5c06\u670d\u52a1\u7aef\u914d\u7f6e\u8fdb\u884c\u4e00\u4e2a\u63d0\u53d6\uff0c\u53ef\u505a\u5355\u4e2a\u573a\u666f\u7684\u4e2a\u6027\u5316\u914d\u7f6e\uff0c\u5f53\u7136\u539f\u6765\u7684\u670d\u52a1\u7aef\u914d\u7f6e\u529f\u80fd\u4fdd\u7559\uff0c\u53ea\u662f\u5f53\u4f60\u914d\u7f6e\u4e86\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e\u540e\uff0c\u4f18\u5148\u4f7f\u7528\u4e2a\u6027\u5316\u914d\u7f6e\u91cc\u9762\u7684\u5185\u5bb9\uff0c\u4ee5\u4e0b\u662f\u5bf9\u4e2a\u6027\u5316\u914d\u7f6e\u7684\u4ecb\u7ecd\u3002 \u76ee\u524d\u6bcf\u4e00\u4e2a py \u6587\u4ef6\u5bf9\u5e94\u4e00\u4e2a\u6027\u80fd\u6d4b\u8bd5\u573a\u666f\uff0c\u4e8e\u662f\u5728\u540c\u7ea7\u76ee\u5f55\u4e0b\u521b\u5efa\u4e00\u4e2a\u4e0e\u4e4b\u540c\u540d\u7684 json \u6587\u4ef6\uff0c\u4f5c\u4e3a\u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6 apps\n\u251c\u2500\u2500 album\n \u251c\u2500\u2500 test_album_01_start.json # \u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6\n\u2514\u2500\u2500 test_album_01_start.py # \u6027\u80fd\u573a\u666f\u6587\u4ef6\n \u4ee5\u4e0b\u662f\u5bf9 json \u6587\u4ef6\u4e2d\u914d\u7f6e\u7684\u89e3\u91ca\uff0c\u82e5\u67d0\u9879\u914d\u7f6e\u4e0d\u9700\u8981\uff0c\u53ef\u4ee5\u7f3a\u5931\uff0c\u4f46\u4e0d\u80fd\u4e3a\u7a7a\uff1b {\n\"title\": \"test_album_start\", # \u6807\u9898\uff1b\u5fc5\u987b\n\"app_name\": \"deepin-album\", # \u573a\u666f\u6240\u5c5e\u7684\u5e94\u7528\uff1b\u5fc5\u987b\n\"scene\": \"hot\", # \u573a\u666f\u522b\u540d\uff1b\u5fc5\u987b\n\"icon\": [\"deepin-album\"], # \u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684icon\u5230\u670d\u52a1\u7aef\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\uff1b\u53ef\u7f3a\u5931\n# \u6ce8\u610f\uff1a\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684desktop\u6587\u4ef6\u540d\u4e3adeepin-album.desktop\uff0c\n# \u53ea\u9700\u8981\u5199deepin-album\u5373\u53ef\uff0c\u201c.desktop\u201d\u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002\n\"size\": { # \u56fe\u7247\u5bf9\u6bd4\u7684\u533a\u57df\u8bbe\u7f6e\u9879\uff0c\u67d0\u4e9b\u5e94\u7528\u5f53\u524d\u5c4f\u5e55\u7684\u90e8\u5206\u533a\u57df\u9700\u8981\u5c06\u5176\u53bb\u6389\uff0c\u53ef\u4ee5\u8bbe\u7f6e\u6b64\u9879\uff0c\u5982\u679c\u6ca1\u6709\u5219\u53ef\u4e0d\u5199\uff1b\u53ef\u786e\u5b9e\n\"x-coordinate\": 0, # \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n\"y-coordinate\": 0, # \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n\"width\": 850, # \u6a2a\u5411\u957f\u5ea6\n\"height\": 1920 # \u7eb5\u5411\u9ad8\u5ea6\n},\n\"count\": 5, # \u573a\u666f\u6267\u884c\u7684\u6b21\u6570\uff1b\u5fc5\u987b\n\"duration\": 5, # \u8be5\u6761\u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff0c\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7279\u5b9a\u573a\u666f\uff0c\u8be5\u914d\u7f6e\u4e3a\u53ef\u9009\u9879\uff0c\u8986\u76d6 server.ini \u4e2d\u7684\u914d\u7f6e\uff1b\u53ef\u7f3a\u5931\n\"stable_similarity\": 0.9997, # \u6027\u80fd\u573a\u666f\u5206\u9636\u6bb5\u65f6\u7684\u56fe\u7247\u76f8\u4f3c\u5ea6\u5bf9\u6bd4\uff0c\u524d\u540e\u56fe\u7247\u4f4e\u4e8e\u8be5\u503c\uff0c\u5219\u5206\u4e3a\u4e0d\u7a33\u5b9a\u9636\u6bb5\uff1b\u53ef\u7f3a\u5931\n\"find_by\": \"stage\", # \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\n\"final_stable_num\": 100, # \u67e5\u627e\u6700\u540e\u4e00\u4e2a\u5927\u4e8e\u8be5\u503c\u7684\u7a33\u5b9a\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u7684\u5c3e\u796f\uff1b\u53ef\u7f3a\u5931\n\"start_num\": 150,\n\"text\": \"\", # ocr\u8bc6\u522b\u7684\u6587\u6848\n\"match\": \"apps/xxx/images/match.png\", # \u56fe\u50cf\u5339\u914d\u7684\u56fe\u7247\u6587\u4ef6\u8def\u5f84\n\"match_rate\": 0.9 # \u5339\u914d\u76f8\u4f3c\u5ea6\n}\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e94\u3001\u6d4b\u8bd5\u6d41\u7a0b","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516d\u3001\u7528\u4f8b\u7f16\u5199\u53ca\u65b9\u6cd5\u53c2\u6570\u6307\u5f15","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"1\u3001\u7528\u4f8b\u5b9e\u4f8b\u8bf4\u660e","text":"# \u6807\u51c6\u5e93\u5bfc\u5165\nfrom time import sleep\n# \u5bfc\u5165\u4e09\u65b9\u5e93pytest\nimport pytest\n# \u5bfc\u5165\u7528\u4f8b\u6267\u884c\u8981\u7528\u5230\u7684Widget\u7c7b\nfrom src.base_widget import BaseWidget\nclass TestStart:\n# class\u7ea7\u522b\u7684fixture\uff0c\u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u6267\u884c\u3002autouse=True \u81ea\u52a8\u5728\u5f53\u524d\u4f5c\u7528\u57df\u4e0b\u4f7f\u7528\u3002\n@pytest.fixture(scope=\"class\", autouse=True)\n# \u6d4b\u8bd5\u70ed\u542f\u52a8\u4e4b\u524d\u9700\u8981\u9884\u542f\u52a8\u3002\ndef application_pre_start(self):\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().right_click_element(\"deepin-album\")\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().click_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\")\nsleep(2)\n# \u5feb\u6377\u952e\u5173\u95ed\u7a97\u53e3\nBaseWidget().hot_key(\"alt\", \"f4\")\nsleep(2)\n# \u9ed8\u8ba4\u4e3afunction\u7ea7\u522b\u7684fixture\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\uff0cclass\u7ea7\u522bfixture\u6267\u884c\u4e4b\u540e\u6267\u884c\u3002\n@pytest.fixture(autouse=True)\ndef setup_start(self):\n# \u53f3\u952e\u70b9\u51fb deepin-album \u56fe\u6807\nBaseWidget().right_click_element(\"deepin-album\")\n# \u79fb\u52a8\u5230\u53f3\u952e\u83dc\u5355\u4e2d\u6253\u5f00\uff08open.png\uff09\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().move_to(*BaseWidget().find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))\n# \u7b49\u5f85\u79fb\u52a8\u5b8c\u6210\nsleep(0.5)\ndef test_album_start(self):\n# \u70b9\u51fb\u201c\u6253\u5f00\u201d\nBaseWidget().click() \n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"2\u3001\u65b9\u6cd5\u53c2\u6570\u8bf4\u660e","text":"2.1\u3001find_element \u65b9\u6cd5 def find_element(element: str, input_type: str = \"FILE_NAME\", fill_color_position: tuple = (-1, -1), size: tuple = (25, 70)):\npass\n \u53c2\u6570 element \u548c input_type \uff081\uff09\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u5143\u7d20 - `input_type` \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a `FIEL_NAME` \uff0c\u8868\u793a\u901a\u8fc7\u5e94\u7528 `icon` \u5bfb\u627e\u5143\u7d20\uff0c\u6b64\u65b9\u6cd5\u4f1a\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u5e94\u7528 `icon` \u56fe\u6807\u3002\n \u4e3e\u4f8b\uff1a\u9ed8\u8ba4\u60c5\u51b5\u4e0b input_type \u53c2\u6570\u4e0d\u9700\u8981\u4f20\u5165\uff0c find_element(\"deepin-album\")\uff0c\u8868\u793a\u901a\u8fc7 deepin-album \u7684\u5e94\u7528 icon \u6765\u83b7\u53d6\u5750\u6807\uff0c\u6ce8\u610f\uff0c\u6b64\u65f6\u4f20\u5165\u7684 deepin-album \u53c2\u6570\u5b9e\u9645\u662f desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u548c2.3\u4e2d\u7684 icon \u53d8\u91cf\u4e00\u81f4\u3002 \u6211\u4eec\u5efa\u8bae\u4f18\u5148\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\uff0c\u4f46\u6b64\u65b9\u6cd5\u4f9d\u8d56\u7f51\u7edc\uff0c\u8bf7\u6839\u636e\u6d4b\u8bd5\u73af\u5883\u5b9e\u9645\u60c5\u51b5\u9009\u62e9\u3002 \uff082\uff09\u901a\u8fc7\u672c\u5730\u56fe\u7247\u8bc6\u522b\u5143\u7d20 - \u53c2\u6570 `input_type` \u4f20\u5165\u56fe\u7247\u683c\u5f0f\uff0c\u6bd4\u5982\u622a\u53d6\u7684\u672c\u5730\u56fe\u7247\u683c\u5f0f\u4e3a `png`\uff0c\u90a3\u4e48 `input_type=\"png\"`\uff0c\u6b64\u65f6\u53c2\u6570 `element ` \u4f20\u5165\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5efa\u8bae\u5b58\u653e\u5728\u5bf9\u5e94\u7684\u4ea7\u54c1 `apps/app/picture/` \u76ee\u5f55\u4e0b\uff0c\u8def\u5f84\u4e3a\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u7684\u76f8\u5bf9\u8def\u5f84\u3002\n- \u4e3e\u4f8b\uff1a`find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))`\uff0c\u8868\u793a\u901a\u8fc7\u672c\u5730\u56fe\u7247 `open.png` \u8bc6\u522b\u5143\u7d20\u3002\n \u53c2\u6570 fill_color_position fill_color_position \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (-1, -1)\uff0c(-1, -1) \u8868\u793a\u53d6\u5c4f\u5e55\u4e2d\u53f3\u4e0b\u89d2\u6700\u540e\u4e00\u4e2a\u50cf\u7d20\u70b9\u4f5c\u4e3a\u586b\u5145\u5750\u6807\uff0c\u5728 1920x1080 \u5c4f\u5e55\u5206\u8fa8\u7387\u4e0b\u5373\u5b9e\u9645\u5750\u6807\u4e3a (1919, 1079) \uff0c\u8fd9\u6837\u7684\u5199\u6cd5\u53ef\u4ee5\u9002\u914d\u4e0d\u540c\u5927\u5c0f\u7684\u5c4f\u5e55\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0d\u540c\u65b9\u4f4d\uff1a \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0b\u65b9\uff0c\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u4e0d\u9700\u8981\u4f20\u5165\u8be5\u53c2\u6570\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u5de6\u8fb9\uff0cfill_color_position=(1, 1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u53f3\u8fb9\uff0cfill_color_position=(-1, -1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0a\u8fb9\uff0cfill_color_position=(1, 1) \u4ece\u684c\u9762\u542f\u52a8\u5e94\u7528\uff0c\u5219\u9700\u8981\u4f20\u5165\u9664\u4efb\u52a1\u680f\u4ee5\u5916\u5176\u4ed6\u4f4d\u7f6e\u7684\u5750\u6807\uff0c\u6bd4\u5982(100, 100)\uff0c\u53ea\u8981\u8fd9\u4e2a\u5750\u6807\u4e3a\u9664\u5e94\u7528\u548c\u4efb\u52a1\u680f\u533a\u57df\u90fd\u53ef\u4ee5\u3002 \u4ece\u542f\u52a8\u5668\u91cc\u9762\u542f\u52a8\u5e94\u7528\uff0c\u9700\u8981\u586b\u5145\u7684\u5750\u6807\u4e3a\u542f\u52a8\u5668\u533a\u57df\u3002 \u6ce8\uff1a\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u65f6\uff0c\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684 icon \u539f\u6587\u4ef6\u4e3a svg \u77e2\u91cf\u56fe\uff0c\u8f6c\u6362\u4e3a png \u4e4b\u540e\u9700\u8981\u586b\u5145\u8fb9\u7f18\u900f\u660e\u90e8\u5206\u3002 \u53c2\u6570 size size \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (25, 70)\uff0c\u8868\u793a\u6d4b\u8bd5\u673a\u4e0a dock \u680f\u4e0a\u5e94\u7528\u56fe\u6807\u7684\u5927\u5c0f\u8303\u56f4\u3002 UOS \u7cfb\u7edf dock \u680f\u662f\u53ef\u4ee5\u4e0a\u4e0b\u62d6\u52a8\u5927\u5c0f\u7684\uff0c\u968f\u7740 dock \u680f\u5927\u5c0f\u6539\u53d8\uff0c\u5e94\u7528\u56fe\u6807\u7684\u8303\u56f4\u4e3a25\u523070\u4e4b\u95f4\u3002 \u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u64cd\u4f5c\u7cfb\u7edf\u4e0a dock \u680f\u5927\u5c0f\u4e0d\u4e00\u6837\uff0c\u53ef\u4ee5\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u4f20\u5165\u5927\u5c0f\u8303\u56f4\u3002 2.2\u3001click_element\u3001 right_click_element\uff0c double_click_element \u8fd9\u51e0\u4e2a\u65b9\u6cd5\u53c2\u6570\u89c4\u5219\u4e0e find_element \u65b9\u6cd5\u4e00\u6837\u3002\u4ed6\u4eec\u5b9e\u9645\u4e0a\u662f\u5728 find_element \u65b9\u6cd5\u57fa\u7840\u4e4b\u4e0a\u505a\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u589e\u52a0\u4e86\u9f20\u6807\u7684\u52a8\u4f5c\uff0c\u5982\u679c\u4f60\u4e0d\u60f3\u4f7f\u7528\u8fd9\u51e0\u4e2a\u65b9\u6cd5\uff0c\u5728\u7528\u4f8b\u4e2d\u4e5f\u53ef\u4ee5\u901a\u8fc7 find_element \u83b7\u53d6\u5230\u5750\u6807\uff0c\u7136\u540e\u5c06\u5750\u6807\u4f20\u5165\u5230\u952e\u9f20\u7684\u65b9\u6cd5\u4e2d\uff0c\u53ef\u4ee5\u5b9e\u73b0\u540c\u6837\u7684\u6548\u679c\u3002 2.3\u3001\u7528\u4f8b\u7c7b\u4e2d\u6709\u4e2a\u7c7b\u53d8\u91cf icon = [\"deepin-album\"] \u9700\u8981\u7279\u6b8a\u8bf4\u660e\uff0c\u5217\u8868\u4e2d\u7684\u5143\u7d20\u4e3a\u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709 icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684 icon \u5230\u670d\u52a1\u7aef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528 desktop \u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684 desktop \u6587\u4ef6\u540d\u4e3a deepin-album.desktop\uff0c\u53ea\u9700\u8981\u5199 deepin-album \u5373\u53ef\uff0c.desktop \u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e03\u3001\u6267\u884c\u5165\u53e3","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"1\u3001\u7528\u4f8b\u7ec4\u7ec7","text":"\u5728 setting/config/server.ini \u6587\u4ef6\u4e2d APP_NAME= \u5b57\u6bb5\u4e3a\u7528\u4f8b\u7684\u6267\u884c\u7684\u76ee\u5f55\uff0c\u9ed8\u8ba4\u4e3a apps \u76ee\u5f55\u4e0b\u6240\u6709\u7528\u4f8b\u3002\u5982\u679c\u4f60\u60f3\u6307\u5b9a\u6267\u884c\u67d0\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4f60\u53ef\u4ee5\u5c06\u8be5\u914d\u7f6e\u9879\u6307\u5b9a\u5230\u5e94\u7528\u7684\u7528\u4f8b\u76ee\u5f55\uff0c\u6bd4\u5982\uff1aAPP_NAME=deepin_album\uff0c \u8868\u793a\u6267\u884c\u76f8\u518c\u76ee\u5f55\u4e0b\u7684\u7528\u4f8b\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a python3 manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music\n -k KEYWORDS, --keywords KEYWORDS\n \u7528\u4f8b\u7684\u5173\u952e\u8bcd\n -t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e\n --log_level LOG_LEVEL \u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n --env {host,docker} \u5728\u5bbf\u4e3b\u673a\u6216\u5bb9\u5668\u73af\u5883\u6267\u884c\n --client_alias \u9009\u62e9\u6d4b\u8bd5\u673a\u522b\u540d, \u53ef\u9009\u9879\u4e3aclient.ini\u4e2d\u5df2\u914d\u7f6e, \u9ed8\u8ba4\u503c\u4e3a zx-x86.\n --count \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a python3 manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\" --env docker\n \u6ce8\uff1a\u5728\u5bb9\u5668\u4e2d\u6267\u884c\u65f6\uff0c\u82e5\u5f3a\u5236\u9000\u51fa\uff0c\u5bb9\u5668\u5e76\u4e0d\u4f1a\u505c\u6b62\u8fd0\u884c\uff01"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_9","title":"\u516b\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1json","title":"1\u3001Json \u62a5\u544a","text":"\u81ea\u7814\u89c6\u9891\u89e3\u6790\u5de5\u5177\u4f1a\u5bf9\u5355\u6761\u7528\u4f8b\u6267\u884c\u4e00\u8f6e\u751f\u6210\u4e00\u4e2a json \u6587\u4ef6\uff0c\u5b58\u653e\u4e8e report/{app_name}/{scene}/{run_num} \u76ee\u5f55\u4e0b\uff0c\u547d\u540d\u683c\u5f0f\u4e3a\uff1a report.json json \u5185\u5bb9\u4e3e\u4f8b\uff1a [\n{\n\"Stab1\": {\n\"images\": [1,2...150,151],\n\"startStub\": 0,\n\"type\": \"Stab\"\n}\n},\n{\n\"Stab2\": {\n\"images\": [152,153...169,170],\n\"startStub\": 1,\n\"type\": \"UnStab\"\n}\n},\n{\n\"Stab3\": {\n\"images\": [171,172...300,301],\n\"startStub\": 0,\n\"type\": \"UnStab\"\n}\n}\n]\n \u8bf4\u660e\uff1a Stab \uff1a\u8868\u793a\u89e3\u6790\u8fc7\u7a0b\u4e2d\u4e0d\u540c\u7684\u9636\u6bb5\u3002 images \uff1a\u8868\u793a\u6bcf\u4e00\u5e27\u7684\u56fe\u7247\u5e8f\u53f7\u3002 startStub\uff1a \u4e3a\u8bc6\u522b\u5c3e\u5e27\u7684\u9636\u6bb5\u8868\u793a\uff0c\u5982\u679c \"startStub\": 1 \uff0c\u8bf4\u660e\u5c3e\u5e27\u51fa\u73b0\u5728\u8be5\u9636\u6bb5\u3002 type\uff1a \u4e3a Stab \u6216 UnStab \uff0c\u8868\u793a\u7a33\u5b9a\u9636\u6bb5\u6216\u4e0d\u7a33\u5b9a\u9636\u6bb5\u3002 \u5404\u9636\u6bb5\u6709\u5e27\u6570\u8865\u507f\uff0c\u9ed8\u8ba4\u8865\u507f\u7684\u5e27\u6570\u4e3a 3 \u5e27\uff08\u53ef\u4ee5\u901a\u8fc7 server.ini \u91cc\u9762 un_stab_start=3 \u8fdb\u884c\u914d\u7f6e\uff09\uff0c\u8868\u793a\u5c0f\u4e8e\u7b49\u4e8e 3 \u5e27\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u524d\u540e\u5747\u9700\u8981\u51cf\u6389\u3002 \u5e94\u7528\u542f\u52a8\u9636\u6bb5\u5c31\u662f\u5728 Stab2 \u9636\u6bb5\uff0c\u542f\u52a8\u65f6\u95f4\u4e3a\uff1a171 \u51cf 151 \u518d\u51cf\u6389\u524d\u540e\u8865\u507f\u5e27\u6570 6 \u5e27\uff0c\u5373 14 \u5e27\uff0c\u89c6\u9891\u5e27\u7387 30 \u5e27/\u79d2\uff0c\u56e0\u6b64\u542f\u52a8\u8017\u65f6\u4e3a\uff1a14 * 33 = 462 ms"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2excel","title":"2\u3001Excel \u62a5\u544a","text":"\u6240\u6709\u7528\u4f8b\u6267\u884c\u5e76\u89e3\u6790\u5b8c\u4e4b\u540e\u4f1a report \u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a\u6c47\u603b\u6570\u636e\u7684 Excel \u6587\u4ef6\uff0c\u6587\u4ef6\u540d\u4e3a\uff1a{time}_perf_time.xlsx\u3002 \u6ce8\u610f\uff0creport \u76ee\u5f55\u4e3a\u53ef\u914d\u7f6e\u9879\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u4f1a\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u751f\u6210\uff0c\u5982\u679c\u4f60\u5c06 report\uff0c\u6307\u5b9a\u5230\u9879\u76ee\u4e0b\u5176\u4ed6\u8def\u5f84\uff0c\u5219\u4f1a\u5728\u5bf9\u5e94\u7684\u8def\u5f84\u4e0b\u751f\u6210 json \u548c Excel \u6587\u4ef6\u3002 \u4f60\u4e5f\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8bfb\u53d6\u6240\u6709 json / excel \u62a5\u544a\u7684\u6570\u636e\uff0c\u751f\u6210\u4f60\u81ea\u5df1\u60f3\u8981\u7684\u4e00\u4e9b\u6d4b\u8bd5\u62a5\u544a\u5f62\u5f0f\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#usb","title":"\u4e5d\u3001USB \u4e32\u53e3\u9a71\u52a8\u952e\u9f20\u65b9\u6cd5","text":"\u4f4d\u4e8e src/utils/control/serial_communication \u76ee\u5f55\u4e0b\u7684 usb_mk.py \u6587\u4ef6 usb_mk = UsbMk()\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up()\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u652f\u6301\u4f20\u5165\u6c49\u5b57\uff0c\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click()\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() \n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() \n \uff084\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() \n \uff085\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() \n \uff086\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() \n \uff087\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff088\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff0810\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_10","title":"\u5341\u3001\u7ee7\u7535\u5668\u63a7\u5236\u4e3b\u673a\u5f00\u673a/\u91cd\u542f","text":"\uff08\u82e5\u4e0d\u4f7f\u7528\u7ee7\u7535\u5668\uff0c\u53ef\u5ffd\u7565\u8be5\u6b65\u9aa4\uff0c\u6267\u884c\u65f6\u4f1a\u901a\u8fc7\u547d\u4ee4 reboot\uff09"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u7ee7\u7535\u5668\u8bbe\u5907","text":"LCUS-2 \u578b \u53cc\u8def USB \u667a\u80fd\u4e32\u53e3\u63a7\u5236\u7ee7\u7535\u5668\u3002 https://item.taobao.com/item.htm?spm=a1z09.2.0.0.41d72e8dUYx2pi&id=582653718178&_u=i25r20ia6a2e "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2usb","title":"2\u3001USB \u5ef6\u957f\u7ebf","text":"\u666e\u901a\u7684 USB \u7ebf\u5373\u53ef\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_3","title":"3\u3001\u675c\u90a6\u7ebf","text":"3.1\u300140P \u6bcd\u5bf9\u516c\u675c\u90a6\u7ebf\u3002 3.2\u3001\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"4\u3001\u5b89\u88c5\u56fe\u6587\u6559\u7a0b","text":"4.1\u3001\u4f7f\u7528 USB \u5ef6\u957f\u7ebf\u8fde\u63a5\u63a7\u5236\u7aef\u548c\u7ee7\u7535\u5668\u3002 4.2\u3001\u5728\u7ee7\u7535\u5668\u5e38\u7aef\u548c\u516c\u5171\u7aef\u5747\u8fde\u63a5\u4e00\u6839\u675c\u90a6\u7ebf\u3002 4.3\u3001\u5728\u4e3b\u677f\u4e0a\u5f00\u673a\u9488\u548c\u91cd\u542f\u9488\u4e0a\u63d2\u4e0a\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 4.4\u3001\u5c06\u5f00\u673a\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76841\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1\u5de6\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 4.5\u3001\u5c06\u91cd\u542f\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76842\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1 \u53f3\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 \u82e5\u60f3\u4fdd\u7559\u539f\u7535\u6e90\u5f00\u5173\u7684\u7535\u6e90\u706f\uff0c\u53ef\u6839\u636e\u5982\u4e0a\u56fe\u6240\u793a\uff0c\u4f7f\u7528\u675c\u90a6\u7ebf\u8fde\u63a5\u4e3b\u677f\u4e0a\u7684\u7535\u6e90\u706f\u548c\u539f\u7535\u6e90\u5f00\u5173"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_11","title":"\u5341\u4e00\u3001\u5e38\u89c1\u95ee\u9898\u8bf4\u660e","text":"1\u3001ERROR: for uos Cannot restart container 2301b1a1395d7959ee6523d61b61c87084649af530786cdb8fb5b3ecbcbd1068: linux runtime spec devices: error gathering device information while adding custom device \"/dev/ttyACM0\": no such file or directory \u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u8fde\u63a5\u72b6\u6001\uff0c\u67e5\u770b /dev/ttyACM0 \u662f\u5426\u5b58\u5728\uff0c\u82e5\u5b58\u5728 /dev/ttyACMn\uff08n\u4e3a\u4efb\u610f\u6570\u5b57\uff09\uff0c\u91cd\u542f\u7535\u8111\u89e3\u51b3\u3002 2\u3001Error response from daemon: Container 5e700fdc769e8c74666d68a7f2bc3de58268b4594cf88706609d59f8dbc7362d is not running \u5bb9\u5668\u542f\u52a8\u5931\u8d25 1\uff09\u68c0\u67e5\u54ea\u4e00\u4e2a\u5bb9\u5668\u672a\u542f\u52a8 sudo docker container ls # \u5217\u51fa\u8fd0\u884c\u4e2d\u7684 Docker \u5bb9\u5668\n 2\uff09\u7f3a\u5c11 uos \u5bb9\u5668\uff0c\u68c0\u67e5 USB \u4e32\u53e3\u8fde\u63a5\u7ebf\u548c\u91c7\u96c6\u76d2\u8fde\u63a5\u7ebf\u662f\u5426\u6b63\u5e38\uff0c\u91cd\u542f\u540e\u6267\u884c bash install/setup.up # \u91cd\u65b0\u5b8c\u6574\u90e8\u7f72\u73af\u5883\n \u6216\u6267\u884c sudo docker-compose up -d --build # \u4ec5\u91cd\u65b0\u6784\u5efa Docker \u955c\u50cf\n 3\u3001\u82e5\u90e8\u7f72\u65f6\u63d0\u793a\u6302\u8f7d ttyACM0\u3001video0 \u5931\u8d25\uff0c\u8bf7\u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u53ca\u91c7\u96c6\u76d2\u662f\u5426\u63a5\u89e6\u826f\u597d\uff0c\u82e5\u63a5\u89e6\u826f\u597d\uff0c\u91cd\u542f\u5373\u53ef\u89e3\u51b3\u3002 4\u3001\u82e5\u51fa\u73b0\u56fe\u7247\u80fd\u8bc6\u522b\uff0c\u4f46\u662f\u9f20\u6807\u672a\u79fb\u52a8\u64cd\u4f5c\u65f6\uff0c\u5b89\u88c5\u7edd\u5bf9\u9f20\u6807\u64cd\u4f5c\u7684\u4f9d\u8d56\u5305\uff0c\u89c1\u7b2c\u4e09\u8282\u7b2c\u4e8c\u5c0f\u8282\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u6d4b\u8bd5\u673a\u3002 5\u3001\u7531\u4e8e\u901a\u8fc7\u91c7\u96c6\u5361\u83b7\u53d6\u7684\u6d4b\u8bd5\u673a\u5b9e\u65f6\u753b\u9762\uff0c\u5305\u542b\u4e86\u9f20\u6807\u7684\u6837\u5f0f\uff0c\u6240\u4ee5\u5bf9\u56fe\u7247\u8bc6\u522b\u65f6\uff0c\u9f20\u6807\u82e5\u505c\u7559\u5728\u56fe\u6807\u4e0a\u5c42\uff0c\u5219\u4f1a\u5bf9\u8bc6\u522b\u7ed3\u679c\u9020\u6210\u5f71\u54cd\uff0c\u9700\u8981\u5c06\u9f20\u6807\u79fb\u52a8\u81f3\u5176\u4ed6\u4f4d\u7f6e\uff0c\u6216\u8005\u9690\u85cf\u9f20\u6807\u89e3\u51b3\u3002 6\u3001Excel \u62a5\u544a\u4e2d\uff0c\u6d4b\u8bd5\u573a\u666f\u5217\u4e0e\u7528\u4f8b\u4e2d\u7684\u4e0d\u4e00\u81f4\uff0c\u5173\u952e\u5b57scene\u3001app_name\u3001\u67b6\u6784\u522b\u540d\uff0c\u4e0d\u80fd\u5305\u542b\u4e0b\u5212\u7ebf\u548c\u82f1\u6587\u7b26\u53f7\u7684\u5706\u62ec\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/","title":"\u6846\u67b6\u529f\u80fd\u4ecb\u7ecd","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2023/1/12\n# Author : Mikigo\n# =============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_2","title":"\u4e00\u3001\u4e00\u53e5\u8bdd\u7b80\u4ecb","text":"\u6b64\u6587\u6863\u4e3b\u8981\u60f3\u5bf9 YouQu \u6846\u67b6\u4e00\u4e9b\u91cd\u70b9\u7684\u529f\u80fd\u505a\u8be6\u7ec6\u7684\u4ecb\u7ecd\uff0c\u5305\u62ec\u5bf9\u4e00\u4e9b\u529f\u80fd\u5f00\u53d1\u7684\u80cc\u666f\u3001\u8981\u89e3\u51b3\u7684\u95ee\u9898\u3001\u5b9e\u73b0\u903b\u8f91\u3001\u4ee3\u7801\u7b49\u65b9\u9762\u7684\u4ecb\u7ecd\uff0c\u4ee5\u6b64\u8ba9\u5927\u5bb6\u80fd\u66f4\u52a0\u6e05\u6670\u7684\u7406\u89e3\u5404\u9879\u529f\u80fd\uff0c\u4ece\u800c\u5728\u4f7f\u7528\u7684\u65f6\u5019\u80fd\u66f4\u52a0\u7684\u5f97\u5fc3\u5e94\u624b\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_3","title":"\u4e8c\u3001\u56fe\u50cf\u8bc6\u522b","text":"\u56fe\u50cf\u8bc6\u522b\u5728 UI \u81ea\u52a8\u5316\u4e2d\u662f\u4e0d\u53ef\u7f3a\u5c11\u7684\uff0c\u5e02\u9762\u4e0a\u751a\u81f3\u6709\u5b8c\u5168\u57fa\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\uff0c\u6bd4\u5982 Airtest\u3001Sikuli \u7b49\uff0c\u5728\u6e38\u620f\u7b49\u7279\u5b9a\u9886\u57df\u4e5f\u6709\u4e0d\u9519\u7684\u6548\u679c\uff0c\u8fd9\u4e9b\u5de5\u5177\u5b9e\u9645\u4e0a\u4e5f\u662f\u7528\u7684 OpenCV \u8fdb\u884c\u4e86\u5c01\u88c5\uff0cYouQu \u6846\u67b6\u57fa\u4e8e OpenCV \u5f00\u53d1\u4e86\u81ea\u5df1\u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\uff0c\u5b83\u53ef\u4ee5\u65b9\u4fbf\u7684\u7528\u4e8e\u754c\u9762\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u65ad\u8a00\uff1b YouQu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u51e0\u4e4e\u6ee1\u8db3\u4e86\u4f60\u7684\u6240\u6709\u8981\u6c42\uff0c\u6211\u4eec\u5728\u957f\u65f6\u95f4\u7684\u601d\u8003\u548c\u6478\u7d22\u4e2d\uff0c\u9488\u5bf9\u5e38\u89c4\u573a\u666f\u53ca\u4e00\u4e9b\u7279\u6b8a\u573a\u666f\u63a2\u7d22\u9664\u4e86\u4e00\u4e9b\u5b9e\u7528\u4e14\u6709\u6548\u7684\u65b9\u6848\uff0c\u4e14\u542c\u6211\u6162\u6162\u9053\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1","title":"1\u3001\u5e38\u89c4\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5e38\u89c4\u8bc6\u522b\u5f88\u597d\u7406\u89e3\uff0c\u4e00\u53e5\u8bdd\u8bb2\u5c31\u662f\uff0c\u8981\u83b7\u53d6\u5230\u76ee\u6807\u5143\u7d20\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u3002 \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u5728\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u9700\u8981\u83b7\u53d6\u7684\u5750\u6807\u662f\u76f8\u5bf9\u4e8e\u6574\u4e2a\u5c4f\u5e55\u7684\u5750\u6807\uff0c\u6211\u4eec\u53ef\u4ee5\u622a\u53d6\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u56fe\u7247\uff08screen\uff09\uff1b \u5728\u5143\u7d20\u8bc6\u522b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u622a\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5c0f\u56fe\u8fdb\u884c\u8bc6\u522b\uff0c\u6bd4\u5982\u622a\u53d6\u64ad\u653e\u6309\u94ae\uff1a \u90a3\u4e48\u5b9e\u9645\u4e0a\uff0c\u5143\u7d20\u5b9a\u4f4d\u7684\u95ee\u9898\u5c31\u8f6c\u6362\u4e3a\uff0c\u5c06\u622a\u56fe\u7684\u5c0f\u56fe\uff08play_btn\uff09\u62ff\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u5927\u56fe\uff08screen\uff09\u4e2d\u53bb\u505a\u5339\u914d\uff0c\u5982\u679c\u5339\u914d\u6210\u529f\uff0c\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff08 x, y \uff09\u5373\u53ef\u3002 \u4e3a\u4e86\u65b9\u4fbf\u63cf\u8ff0\uff0c\u4ee5\u4e0b\u6211\u5c06\u6574\u4e2a\u5c4f\u5e55\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5927\u56fe\uff0c\u67d0\u4e2a\u5143\u7d20\u56fe\u7247\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5c0f\u56fe\u3002 \u57fa\u4e8e OpenCV \u7684\u6a21\u677f\u5339\u914d cv.matchTemplate() \u529f\u80fd\uff0c\u6211\u4eec\u5b9e\u73b0\u4e86\u56fe\u50cf\u5b9a\u4f4d\u7684\u529f\u80fd\uff0c\u6846\u67b6\u63d0\u4f9b\u4e86\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u5e95\u5c42\u63a5\u53e3\uff08\u4e00\u822c\u4e0d\u5bf9\u4e0a\u5c42\u63d0\u4f9b\u8c03\u7528\uff09\uff1a def _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\n# \u8be6\u7ec6\u4ee3\u7801\u592a\u957f\u4e0d\u8d34\u4e86\uff0c\u611f\u5174\u8da3\u8bf7\u67e5\u770b\u6e90\u7801\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001image_path image_path \u662f\u5c0f\u56fe\u7684\u7edd\u5bf9\u8def\u5f84; \u901a\u5e38\u5728 AT \u5de5\u7a0b\u91cc\u9762\uff0c\u6211\u4eec\u7ea6\u5b9a\u5c06\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u5b9e\u9645\u7684\u5143\u7d20\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1aplay_btn.png \uff1b \u7528\u4e8e\u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 case/assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1amusic_001.png \uff1b \u8fd9\u6837\u662f\u4e3a\u4e86\u65b9\u4fbf\u7ba1\u7406\u548c\u7ef4\u62a4\u3002 2\u3001rate \u56fe\u50cf\u8bc6\u522b\u7684\u7684\u5339\u914d\u5ea6\u6216\u8005\u8bf4\u76f8\u4f3c\u5ea6\uff0c\u6846\u67b6\u9ed8\u8ba4\u7684\u914d\u7f6e\u4e3a 0.9\uff0c\u4e5f\u5c31\u662f\u8bf4\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u5b58\u5728\u4e00\u4e2a\u76f8\u4f3c\u5ea6 90% \u7684\u56fe\u6807\u5373\u8fd4\u56de\u5176\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff1b \u5982\u679c\u4f60\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u8c03\u6574\u8bc6\u522b\u5ea6\uff0c\u4f60\u53ef\u4ee5\u5728\u8c03\u7528\u51fd\u6570\u7684\u65f6\u5019\uff0c\u4f20\u5165\u4e0d\u540c\u7684\u8bc6\u522b\u5ea6\u7684\u503c\u3002 3\u3001multiple \u9ed8\u8ba4\u60c5\u51b5\u4e0b multiple=False\uff0c\u8868\u793a\u53ea\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u7b2c\u4e00\u4e2a\uff0c\u5982\u679c multiple=True \u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\uff0c\u56e0\u4e3a\u5927\u56fe\u4e2d\u53ef\u80fd\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u5c0f\u56fe\uff0c\u5728\u67d0\u4e9b\u573a\u666f\u4e0b\u4f60\u53ef\u80fd\u9700\u8981\u5168\u90e8\u83b7\u53d6\u5230\u6240\u6709\u5339\u914d\u5230\u7684\u5750\u6807\u3002 4\u3001picture_abspath \u9ed8\u8ba4\u60c5\u51b5\u4e0b picture_abspath=None \u8868\u793a\u5927\u56fe\u4e3a\u622a\u53d6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u5982\u679c\u4f60\u4e0d\u5e0c\u671b\u5927\u56fe\u662f\u5c4f\u5e55\u7684\u622a\u56fe\uff0c\u800c\u662f\u4f60\u81ea\u5b9a\u4e49\u4f20\u5165\u7684\u67d0\u4e2a\u56fe\u7247\uff0c\u4f60\u53ea\u9700\u8981\u5c06\u4f60\u7684\u56fe\u7247\u8def\u5f84\u4f20\u9012\u7ed9\u8fd9\u4e2a\u53c2\u6570\u5c31\u884c\uff0c\u6bd4\u5982\uff1a picture_abspath=\"~/Desktop/big.png\" \uff1b 5\u3001screen_bbox \u5927\u56fe\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u622a\u53d6\u6574\u4e2a\u5c4f\u5e55\uff0cscreen_bbox = [x, y, w, h] \u53ef\u4ee5\u6307\u5b9a\u622a\u53d6\u5c4f\u5e55\u4e2d\u7684\u56fa\u5b9a\u533a\u57df\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\uff0c\u53ef\u4ee5\u6392\u9664\u90e8\u5206\u533a\u57df\u5bf9\u8bc6\u522b\u7ed3\u679c\u7684\u5f71\u54cd\u3002 \u3010\u9690\u5f0f\u7b49\u5f85\u3011 \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\uff0c\u6709\u65f6\u5019\u9875\u9762\u8df3\u8f6c\u6709\u5ef6\u65f6\uff0c\u6709\u53ef\u80fd\u5b58\u5728\u8bc6\u522b\u7684\u90a3\u4e00\u523b\u9875\u9762\u4e5f\u6ca1\u6709\u8df3\u8f6c\u51fa\u6765\uff0c\u6216\u8005\u6216\u8005\u8bc6\u522b\u7684\u90a3\u4e00\u523b\uff1b \u56e0\u6b64\u6211\u4eec\u9700\u8981\u4e00\u79cd\u7b49\u5f85\u673a\u5236\uff0c\u5373\u5728\u4e00\u5b9a\u7684\u65f6\u95f4\u5185\uff0c\u5982\u679c\u8bc6\u522b\u4e0d\u5230\uff0c\u91cd\u590d\u53bb\u8bc6\u522b\uff1a def find_image(\ncls,\n*widget, rate: [float, int] = None,\nmultiple: bool = False,\nmatch_number: int = None,\npicture_abspath: str = None,\nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u5728\u5c4f\u5e55\u4e2d\u533a\u5bfb\u627e\u5c0f\u56fe\uff0c\u8fd4\u56de\u5750\u6807\uff0c\n \u5982\u679c\u627e\u4e0d\u5230\uff0c\u6839\u636e\u914d\u7f6e\u91cd\u8bd5\u6b21\u6570\uff0c\u6bcf\u6b21\u95f4\u96941\u79d2\n :param widget: \u6a21\u677f\u56fe\u7247\u8def\u5f84\n :param rate: \u76f8\u4f3c\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param match_number: \u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\n :return: \u5750\u6807\u5143\u7ec4\n \"\"\"\nif rate is None:\nrate = float(GlobalConfig.IMAGE_RATE)\ntry:\nfor element in widget:\nfor _ in range((match_number or int(GlobalConfig.IMAGE_MATCH_NUMBER)) + 1):\nlocate = cls._match_image_by_opencv(\nelement,\nrate,\nmultiple=multiple,\npicture_abspath=picture_abspath,\nscreen_bbox=screen_bbox\n)\nif not locate:\nsleep(int(GlobalConfig.IMAGE_MATCH_WAIT_TIME))\nelse:\nreturn locate\nraise TemplateElementNotFound(*widget)\nexcept Exception as e:\nraise e\n \u53c2\u6570 match_number \u7528\u4e8e\u63a7\u5236\u91cd\u590d\u8bc6\u522b\u7684\u6b21\u6570\uff0c\u9ed8\u8ba4\u4e0d\u4f20\u53c2\uff0c\u53d6\u5168\u5c40\u914d\u7f6e setting/globalconfig.ini \u91cc\u9762\u7684 IMAGE_MATCH_NUMBER \u914d\u7f6e\u9879\u7684\u503c\uff0c\u9ed8\u8ba4IMAGE_MATCH_NUMBER = 1\uff0c\u5373\u91cd\u8bd5 1 \u6b21\uff1b find_image \u662f\u6846\u67b6\u63d0\u4f9b\u7684\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u51fd\u6570\u63a5\u53e3\uff0c\u8fd9\u4e2a\u51fd\u6570\u63d0\u4f9b\u4e86\u9690\u5f0f\u7b49\u5f85\u7684\u529f\u80fd\uff0c\u4e14\u5305\u542b\u4e0a\u9762\u4ecb\u7ecd\u7684 _match_image_by_opencv \u51fd\u6570\u7684\u6240\u6709\u529f\u80fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2","title":"2\u3001\u6c14\u6ce1\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u6c14\u6ce1\u8bc6\u522b\u6307\u7684\u662f\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\u8981\u5b9a\u4f4d\u7684\u5143\u7d20\u662f\u4e00\u4e9b\u4f1a\u6d88\u5931\u7684\u5c0f\u5f39\u7a97\uff0c\u8fd9\u7c7b\u573a\u666f\u5728\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\u5c31\u53ef\u80fd\u5b58\u5728\u4e0d\u7a33\u5b9a\u6027\uff0c\u6709\u53ef\u80fd\u56fe\u50cf\u8bc6\u522b\u7684\u65f6\u5019\u6c14\u6ce1\u5df2\u7ecf\u6d88\u5931\u4e86\uff0c\u4e5f\u6709\u53ef\u80fd\u6c14\u6ce1\u51fa\u73b0\u7684\u65f6\u95f4\u592a\u77ed\u4e86\uff0c\u4e0d\u5bb9\u6613\u6355\u6349\u5230\uff0c\u5c31\u50cf\u6c14\u6ce1\u4e00\u6837\uff0c\u51fa\u73b0\u4e00\u4e0b\u5c31\u6d88\u5931\uff0c\u56e0\u6b64\u6211\u4eec\u5f62\u8c61\u7684\u79f0\u4e4b\u4e3a \u201c\u6c14\u6ce1\u8bc6\u522b\u201d\uff1b \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u4e3a\u4e86\u80fd\u7a33\u5b9a\u7684\u8bc6\u522b\u6c14\u6ce1\u7c7b\u573a\u666f\uff0c\u6211\u4eec\u91c7\u7528\u7684\u65b9\u6848\u662f\uff1a \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\uff08\u5305\u542b\u6c14\u6ce1\u4ece\u51fa\u73b0\u5230\u6d88\u5931\uff09\uff0c\u4e0d\u505c\u7684\u622a\u53d6\u8fd9\u6bb5\u65f6\u95f4\u5185\u7684\u5927\u56fe\uff0c\u4ee5\u6b64\u786e\u4fdd\u5728\u622a\u53d6\u7684\u4e00\u5806\u56fe\u7247\u4e2d\uff0c\u80af\u5b9a\u6709\u81f3\u5c11\u4e00\u5f20\u56fe\u7247\u80fd\u6355\u6349\u5230\u6c14\u6ce1\uff0c\u6700\u540e\u518d\u5bf9\u8fd9\u4e00\u5806\u56fe\u7247\u9010\u4e2a\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def get_during(\ncls,\nimage_path: str,\nscreen_time: [float, int],\nrate: float = None,\npause: [int, float] = None,\nmax_range: int = 10000\n):\n\"\"\"\n \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u622a\u56fe\u591a\u5f20\u56fe\u7247\u8fdb\u884c\u8bc6\u522b\uff0c\u5176\u4e2d\u6709\u4e00\u5f20\u56fe\u7247\u8bc6\u522b\u6210\u529f\u5373\u8fd4\u56de\u7ed3\u679c;\n \u9002\u7528\u4e8e\u6c14\u6ce1\u7c7b\u7684\u65ad\u8a00\uff0c\u6bd4\u5982\u6c14\u6ce1\u57281\u79d2\u5185\u6d88\u5931\uff0c\u5982\u679c\u7528\u5e38\u89c4\u7684\u56fe\u50cf\u8bc6\u522b\u5219\u6709\u53ef\u80fd\u65e0\u6cd5\u8bc6\u522b\u5230\uff1b\n :param image_path: \u8981\u8bc6\u522b\u7684\u6a21\u677f\u56fe\u7247\uff1b\n :param screen_time: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff1b\n :param rate: \u8bc6\u522b\u7387\uff1b\n :param pause: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u4e0d\u95f4\u9694\uff1b\n :param max_range: \u622a\u56fe\u7684\u6700\u5927\u6b21\u6570\uff0c\u8fd9\u662f\u4e00\u4e2a\u9884\u8bbe\u503c\uff0c\u4e00\u822c\u60c5\u51b5\u4e0b\u4e0d\u6d89\u53ca\u4fee\u6539\uff1b\n \"\"\"\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001screen_time \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5728\u6b64\u65f6\u95f4\u5185\u4f1a\u4e0d\u65ad\u7684\u8fdb\u884c\u622a\u56fe\u64cd\u4f5c\uff0c\u5c31\u50cf\u5f55\u5236\u89c6\u9891\u4e00\u6837\uff1b 2\u3001pause \u6bcf\u6b21\u622a\u53d6\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u4e00\u523b\u4e0d\u505c\u7684\u622a\u56fe\uff0c\u5982\u679c\u4f60\u60f3\u6bcf\u6b21\u622a\u56fe\u5b58\u5728\u4e00\u4e9b\u95f4\u9694\u65f6\u95f4\u4f20\u5165\u5bf9\u5e94\u7684\u65f6\u95f4\u95f4\u9694\u5373\u53ef\uff0c\u5355\u4f4d\u662f\u79d2\uff0c\u6bd4\u5982\uff1apause = 0.03\uff0c\u8868\u793a 30 ms\uff0c\u76f8\u5f53\u4e8e\u5e27\u7387\u4e3a 30 \u5e27\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-opencv","title":"3\u3001\u4e0d\u4f9d\u8d56 OpenCV \u7684\u56fe\u50cf\u8bc6\u522b\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31","title":"3.1\u3001\u81ea\u7814\u56fe\u50cf\u8bc6\u522b\u6280\u672f","text":"\u3010\u539f\u7406\u3011 \u4e3a\u4e86\u5b9e\u73b0\u8bc6\u522b\u56fe\u50cf\u7684\u76ee\u7684\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u5c06\u56fe\u7247\u7684\u6bcf\u4e2a\u50cf\u7d20\u7684RGB\u503c\uff0c\u4e0e\u6574\u4e2a\u5c4f\u5e55\u4e2d\u7684RGB\u8fdb\u884c\u5bf9\u6bd4\uff0c\u5982\u679c\u5c0f\u56fe\u4e0a\u7684RGB\u503c\u4e0e\u5bf9\u5e94\u5927\u56fe\u4f4d\u7f6e\u7684RGB\u90fd\u76f8\u7b49\uff0c\u5219\u5339\u914d\u6210\u529f\uff0c\u5373\u53ef\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u70b9\u3002 1\u3001\u8bfb\u53d6\u5c0f\u56fe\u548c\u5927\u56fe\u7684RGB\u503c \uff081\uff09\u5c0f\u56fe\u7684RGB\u503c small_data = small_pic.load() # load()\u4f1a\u5c06\u56fe\u7247\u7684RGB\u503c\u83b7\u53d6\u5230\uff0c\u6570\u636e\u683c\u5f0f\u4e3a\u4e00\u4e2a\u4e8c\u7ef4\u5217\u8868\uff0c\u8d4b\u503c\u7ed9\u4e00\u4e2a\u53d8\u91cfsmall_data\u3002\n \uff082\uff09\u5927\u56fe\u7684RGB\u503c big_data = big_pic.load()\n 2\u3001\u5c06\u5c0f\u56fe\u4e0e\u5927\u56fe\u7684RGB\u503c\u8fdb\u884c\u5339\u914d \uff081\uff09\u5339\u914d\u4ece\u5927\u56fe\u7684\u5750\u6807\uff080\uff0c0\uff09\u5f00\u59cb\u5339\u914d\uff0c\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff082\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\uff080\uff0c0\uff09\u5bf9\u5e94\u7684\u6240\u6709\u5c0f\u56fe\u7684RGB\u503c\u4e0d\u76f8\u7b49\uff0c\u5219\u79fb\u52a8\u5230\u4e0b\u4e00\u4e2a\u5750\u6807\u70b9\uff081\uff0c0\uff09\uff0c\u540c\u6837\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff083\uff09\u6309\u7167\u8fd9\u6837\u7684\u89c4\u5f8b\u5c06\u8fd9\u4e00\u884c\u6bcf\u79fb\u52a8\u4e00\u4e2a\u5750\u6807\u70b9\uff0c\u90fd\u5c06\u5c0f\u56fe\u6240\u6709\u7684RGB\u4e0e\u5bf9\u5e94\u5927\u56fe\u7684\u503c\u8fdb\u884c\u5339\u914d\uff1b \uff084\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\u5176\u4e2d\u4e00\u4e2a\u5750\u6807\u70b9\u4e0a\u5339\u914d\u5230\u4e86\u5c0f\u56fe\u7684\u6240\u6709RGB\u503c\uff0c\u5219\u6b64\u65f6\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\u70b9\uff1b \uff085\uff09\u5982\u679c\u5339\u914d\u4e86\u5927\u56fe\u6240\u6709\u7684\u5750\u6807\u70b9\uff0c\u90fd\u6ca1\u6709\u5339\u914d\u5230\uff0c\u5219\u8bf4\u660e\u5927\u56fe\u4e2d\u4e0d\u5b58\u5728\u5c0f\u56fe\uff0c\u5339\u914d\u5931\u8d25\uff1b \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 class ImageRgb:\n@staticmethod\ndef _check_match(_x, _y, small, bdata, sdata, rate):\n\"\"\"\n Matching degree of small graph and large graph matching\n \"\"\"\n@staticmethod\ndef _pre_random_point(small):\n\"\"\"\n Pre matching, take 10-20 points at random each time,\n and take coordinates randomly in the small graph\n \"\"\"\n@staticmethod\ndef _pre_random_match(_x, _y, point_list, bdata, sdata, rate):\n\"\"\"\n In the small graph, several points are randomly\n selected for matching, and the matching degree is\n also set for the random points\n \"\"\"\n@classmethod\ndef match_image_by_rgb(cls, image_name=None, image_path=None, rate=0.9):\n\"\"\"\n By comparing the RGB values of the small image with the large\n image on the screen, the coordinates of the small image on\n the screen are returned.\n \"\"\"\n \u901a\u8fc7 match_image_by_rgb() \u8fd9\u4e2a\u51fd\u6570\uff0c\u4f20\u5165\u76ee\u6807\u5c0f\u56fe\u7684\u6587\u4ef6\u540d\u79f0\uff0c\u5373\u53ef\u8fd4\u56de\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u3002 \u6709\u540c\u5b66\u8981\u95ee\u4e86\uff0c\u6709 OpenCV \u5e72\u561b\u4e0d\u7528\uff0c\u6709\u5fc5\u8981\u81ea\u5df1\u5b9e\u73b0\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u529f\u80fd\u5417\uff0c\u4f60\u4eec\u662f\u4e0d\u662f\u95f2\u7684\u554a\uff1f \u8fd9\u4e48\u95ee\u7684\u8bdd\uff0c\u5c0f\u4e86\uff0c\u683c\u5c40\u5c0f\u4e86\uff1b\u6211\u4eec\u81ea\u5df1\u5b9e\u73b0\u4e3b\u8981\u6709\u51e0\u65b9\u9762\u539f\u56e0\uff1a \u51cf\u5c11\u73af\u5883\u4f9d\u8d56\uff0c\u5373\u4e0d\u7528\u5b89\u88c5 OpenCV\uff0c\u6211\u4eec\u4e5f\u80fd\u5b9e\u73b0\u5176\u529f\u80fd\uff0c\u73af\u5883\u4f9d\u8d56\u8fd9\u5757\u540e\u9762\u4f1a\u5355\u72ec\u8be6\u7ec6\u8bb2\uff0c\u51cf\u5c11\u73af\u5883\u4f9d\u8d56\u5bf9\u4e8e\u4efb\u4f55\u8f6f\u4ef6\u5de5\u7a0b\u90fd\u975e\u5e38\u91cd\u8981\uff1b OpenCV \u5728\u5176\u4ed6\u56fd\u4ea7 CPU \u67b6\u6784\u4e0a\u5b89\u88c5\u5e76\u4e0d\u80fd\u4fdd\u8bc1100%\u6210\u529f\uff0c\u751a\u81f3\u6709\u6ca1\u6709\u53ef\u80fd\u5728\u4e00\u4e9b\u67b6\u6784\u4e0a\u538b\u6839\u513f\u5c31\u4e0d\u80fd\u5b89\u88c5\u4f7f\u7528 OpenCV \uff1f \u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 OpenCV \uff1f\u5c31\u50cf\u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 Windows \u5462\uff1f\u8fd9\u4e9b\u95ee\u9898\u503c\u5f97\u601d\u8003\u3002 \u5f53\u7136\uff0c\u6211\u4eec\u627f\u8ba4\u8fd9\u5957\u65b9\u6848\uff0c\u867d\u7136\u8bc6\u522b\u51c6\u786e\u7387\u6ca1\u95ee\u9898\uff0c\u4f46\u5728\u8bc6\u522b\u6548\u7387\u4e0a\u8fd8\u6ca1\u6709\u8fbe\u5230 OpenCV \u6a21\u677f\u5339\u914d\u7684\u6548\u679c\uff0c\u6211\u4eec\u7684\u65b9\u6848\u6bcf\u6b21\u8bc6\u522b\u5728 1.5s \u5de6\u53f3\uff0c\u800c OpenCV \u5728 1s \u5de6\u53f3\uff1b \u6574\u4f53\u8bc6\u522b\u6548\u679c\u6765\u8bb2\uff0c\u6211\u8ba4\u4e3a\u8fd8\u662f\u53ef\u4ee5\u63a5\u53d7\u7684\uff0c\u4e5f\u5e0c\u671b\u6709\u5fd7\u4e4b\u58eb\u80fd\u4e00\u8d77\u4f18\u5316\u6b64\u65b9\u6848\uff0c\u4e00\u8d77\u6280\u672f\u62a5\u56fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32-rpc","title":"3.2\u3001\u57fa\u4e8e RPC \u670d\u52a1\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b","text":"\u5728\u8fdc\u7a0b\u670d\u52a1\u5668\u4e0a\u90e8\u7f72 OpenCV \u7684\u73af\u5883\uff0c\u5e76\u5c06\u5176\u90e8\u7f72\u4e3a RPC \u670d\u52a1\uff0c\u6d4b\u8bd5\u673a\u4e0a\u4e0d\u7528\u5b89\u88c5 OpenCV \u4f9d\u8d56\uff0c\u800c\u662f\u901a\u8fc7\u8bf7\u6c42 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u3010\u539f\u7406\u3011 \u6d4b\u8bd5\u673a\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u56fe\u7247\u4ee5\u53ca\u6a21\u677f\u56fe\u7247\uff0c\u53d1\u9001\u7ed9 RPC \u670d\u52a1\u7aef\uff0c\u670d\u52a1\u7aef\u62ff\u5230\u4e24\u5f20\u56fe\u7247\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u6700\u540e\u5c06\u8bc6\u522b\u7ed3\u679c\u8fd4\u56de\u7ed9\u6d4b\u8bd5\u673a\uff1b \u8981\u7279\u6b8a\u8bf4\u660e\u7684\u662f\uff1a RPC \u662f\u4e00\u79cd\u534f\u8bae\uff0c\u8bb8\u591a\u8bed\u8a00\u90fd\u662f\u652f\u6301\u7684\uff0c\u6bd4\u5982\u8bf4\u670d\u52a1\u7aef\u4e5f\u53ef\u4ee5\u7528 C++ \u6765\u5b9e\u73b0\uff0c\u5ba2\u6237\u7aef\u4f7f\u7528 Python \u4e5f\u662f\u53ef\u4ee5\u8c03\u7528\u7684\u3002 \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 \u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nimport cv2 as cv\nimport numpy as np\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\nif __name__ == \"__main__\":\nserver = ThreadXMLRPCServer((\"x.x.x.x\", 8889), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(match_image_by_opencv, \"match_image_by_opencv\")\nserver.serve_forever()\n \u8fd9\u6837\uff0c\u6211\u4eec\u57fa\u4e8e Python \u6807\u51c6\u5e93 xmlrpc \u642d\u5efa\u4e86\u4e00\u4e2a RPC \u670d\u52a1\u5668\uff0c\u6ce8\u518c\u4e86 image_put \u548c match_image_by_opencv \u4e24\u4e2a\u529f\u80fd\u63a5\u53e3\uff0c\u5728\u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u901a\u8fc7 IP \u548c\u7aef\u53e3\u8fdb\u884c RPC \u8bf7\u6c42\uff1b \u5ba2\u6237\u7aef\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from xmlrpc.client import Binary\nfrom xmlrpc.client import ServerProxy\nserver = ServerProxy(GlobalConfig.OPENCV_SERVER_HOST, allow_none=True)\nscreen_rb = open(screen, \"rb\")\ntemplate_rb = open(template_path, \"rb\")\ntry:\nscreen_path = server.image_put(Binary(screen_rb.read()))\nscreen_rb.close()\ntpl_path = server.image_put(Binary(template_rb.read()))\ntemplate_rb.close()\nreturn server.match_image_by_opencv(\ntpl_path, screen_path, rate, multiple\n)\nexcept OSError as exc:\nraise EnvironmentError(\nf\"RPC\u670d\u52a1\u5668\u94fe\u63a5\u5931\u8d25. {GlobalConfig.OPENCV_SERVER_HOST}\"\n) from exc\n \u901a\u8fc7\u8fd4\u56de server.match_image_by_opencv \u5c31\u83b7\u53d6\u4e86\u5728\u670d\u52a1\u7aef\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4","title":"4\u3001\u53f3\u952e\u83dc\u5355\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41","title":"4.1\u3001\u53f3\u952e\u83dc\u5355\u5b9a\u4f4d\u7684\u65b9\u6848\u53ca\u95ee\u9898","text":"\u53f3\u952e\u83dc\u5355\u7684\u5143\u7d20\u5b9a\u4f4d\u662f\u4e00\u4e2a\u96be\u70b9\uff0c\u8fc7\u53bb\u6211\u4eec\u8c03\u7814\u548c\u4f7f\u7528\u8fc7\u7684\u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u65b9\u6cd5\u6709 4 \u79cd\uff1a \u7b2c\u4e00\u79cd\uff1a\u6b65\u957f\u64cd\u4f5c\u6cd5 \u5728\u53f3\u952e\u83dc\u5355\u547c\u51fa\u6765\u4e4b\u540e\uff0c\u901a\u8fc7\u952e\u76d8\u7684 up\u3001down \u6309\u952e\uff0c\u8fdb\u884c\u9009\u62e9\u83dc\u5355\u9009\u62e9\uff0c\u9009\u4e2d\u76ee\u6807\u4e4b\u540e enter \u5373\u53ef\uff1b\u6bd4\u5982\uff1a\u5728\u684c\u9762\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\uff0c\u6309 1 \u6b21 down \uff0c\u4f1a\u51fa\u73b0\u4e0b\u56fe\uff1a \u7ee7\u7eed\u518d\u6309 2 \u6b21 down\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u518d\u6309 enter\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u5982\u6b64\uff0c\u201c\u6392\u5e8f\u65b9\u5f0f\u201d\u7684\u6b65\u957f\u4e3a 3\uff1b\u901a\u8fc7\u4f7f\u7528\u952e\u76d8\u4e0a\u4e0b\u952e\uff0c\u5c31\u5b9e\u73b0\u4e86\u5bf9\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\uff1b \u4f46\u662f\uff0c\u8fd9\u79cd\u65b9\u5f0f\u6709\u4e2a\u5f88\u70e6\u4eba\u7684\u95ee\u9898\uff0c\u5c31\u662f\u53f3\u952e\u83dc\u5355\u7684\u9009\u9879\u4f4d\u7f6e\u4e0d\u53ef\u80fd\u4e00\u76f4\u4e0d\u53d8\uff0c\u5728\u9700\u6c42\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\uff0c\u83dc\u5355\u9009\u9879\u7684\u53d8\u5316\u662f\u5f88\u5927\u7684\uff0c\u751a\u81f3\u6709\u4e9b\u5e94\u7528\u652f\u6301\u81ea\u5b9a\u4e49\u83dc\u5355\uff0c\u6bd4\u5982\u6587\u7ba1\u53f3\u952e\u83dc\u5355\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff1b \u4e5f\u5c31\u662f\u8bf4\u4f60\u5f97\u7ecf\u5e38\u53bb\u7ef4\u62a4\u83dc\u5355\u9009\u9879\u7684\u6b65\u957f\uff0c\u4e00\u4e2a\u9009\u9879\u73b0\u5728\u7684\u6b65\u957f\u662f 3\uff0c\u4e0b\u4e2a\u8fed\u4ee3\u53ef\u80fd\u5c31\u662f 4 \u6216\u8005 5\u3002 \u7b2c\u4e8c\u79cd\uff1a\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u6cd5 \u628a\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5355\u72ec\u622a\u56fe\u4fdd\u5b58\uff0c\u56fe\u7247\u4e2d\u4ec5\u5305\u542b\u4e00\u4e2a\u83dc\u5355\u9009\u9879\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u8fd9\u6837\uff0c\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5c31\u53ef\u4ee5\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u65b9\u5f0f\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u8fd9\u79cd\u65b9\u5f0f\u4e0d\u7528\u62c5\u5fc3\u83dc\u5355\u9009\u9879\u7684\u987a\u5e8f\u6216\u4f4d\u7f6e\uff0c\u4f46\u662f\u9700\u8981\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff0c\u4e14\u5bb9\u6613\u53d7\u5230\u5b57\u4f53 UI \u53d8\u66f4\u7c7b\u9700\u6c42\u7684\u5f71\u54cd\uff0c\u6bd4\u5982\uff1a\u5b57\u4f53\u5927\u5c0f\u3001\u5b57\u4f53\u95f4\u8ddd\u7b49\u7b49\u9700\u6c42\u53d8\u66f4\u90fd\u4f1a\u5f71\u54cd\uff0c\u6bcf\u6b21\u53d8\u66f4\u4e4b\u540e\u5c31\u9700\u8981\u8fdb\u884c\u5927\u91cf\u56fe\u7247\u8d44\u6e90\u7684\u91cd\u65b0\u622a\u56fe\u66ff\u6362\uff0c\u662f\u4e2a\u6bd4\u8f83\u9ebb\u70e6\u7684\u4e8b\u60c5\uff1b \u7b2c\u4e09\u79cd\uff1a\u76f8\u5bf9\u4f4d\u79fb\u6cd5 \u9f20\u6807\u70b9\u51fb\u53f3\u952e\u7684\u65f6\u5019\uff0c\u9f20\u6807\u7684\u5f53\u524d\u5750\u6807\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u7684\uff0c\u83dc\u5355\u9009\u9879\u7684\u5bbd\uff08 w \uff09\u4e00\u822c\u662f\u56fa\u5b9a\u7684\uff0c\u53d8\u5316\u7684\u662f\u83dc\u5355\u7684\u957f\u5ea6\uff08 h \uff09\uff0c\u53ef\u4ee5\u901a\u8fc7\u67d0\u4e2a\u9009\u9879\u76f8\u5bf9\u4e8e\u9f20\u6807\u7684\u8ddd\u79bb\u5728\u786e\u5b9a\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u901a\u8fc7\u7ef4\u62a4\u83dc\u5355\u9009\u9879\uff08\u76f8\u5bf9\u4f4d\u7f6e\uff09\u76f8\u5bf9\u4e8e\u9f20\u6807\u4f4d\u7f6e\u7684\u8ddd\u79bb\uff0c\u5373\u53ef\u8f7b\u677e\u8ba1\u7b97\u51fa\u83dc\u5355\u9009\u9879\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\u3002 \u4ece\u7406\u8bba\u4e0a\u6b64\u65b9\u6848\u662f\u53ef\u884c\u7684\uff0c\u4f46\u662f\u8fd9\u91cc\u4ecd\u7136\u5b58\u5728\u4e24\u4e2a\u4e25\u91cd\u7684\u95ee\u9898\uff1a \u83dc\u5355\u987a\u5e8f\u6539\u53d8\uff0c\u5bfc\u81f4\u76f8\u5bf9\u8ddd\u79bb\u6539\u53d8\uff0c\u800c\u4e14\u8ddd\u79bb\u662f\u901a\u8fc7\u50cf\u7d20\uff08px\uff09\u6765\u8868\u793a\u7684\uff0c\u4e0d\u60f3\u6b65\u957f\u90a3\u4e48\u53ea\u7ba1\uff0c\u6bcf\u6b21\u9700\u8981\u53bb\u91cf\u4e00\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u70b9\u9ebb\u70e6\uff1b \u9f20\u6807\u5728\u684c\u9762\u4e0d\u540c\u4f4d\u7f6e\u70b9\u51fb\u53f3\u952e\uff0c\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u4f4d\u7f6e\u662f\u4e0d\u540c\u7684\uff0c\u4e0a\u56fe\u7684\u83dc\u5355\u662f\u5728\u9f20\u6807\u7684\u5de6\u4e0b\u65b9\uff0c\u5982\u679c\u4f60\u79fb\u52a8\u9f20\u6807\u5230\u5c4f\u5e55\u56db\u8fb9\uff0c\u4f60\u4f1a\u53d1\u73b0\uff0c\u53f3\u952e\u83dc\u5355\u53ef\u80fd\u51fa\u73b0\u5728\u9f20\u6807\u7684\u56db\u4e2a\u65b9\u5411\uff0c\u4e5f\u5c31\u662f\u8bf4\u4f60\u9700\u8981\u6839\u636e\u9f20\u6807\u7684\u4e0d\u540c\u4f4d\u7f6e\u6765\u5224\u65ad\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u65b9\u5411\uff0c\u800c\u4e0d\u540c\u7684\u65b9\u5411\u4e0a\u8ba1\u7b97\u65b9\u6cd5\u662f\u4e0d\u540c\u7684\uff0c\u6bd4\u5982\uff1a\u53f3\u952e\u83dc\u5355\u5728\u9f20\u6807\u7684\u5de6\u4e0a\uff0c\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\u8ba1\u7b97\u65b9\u6cd5\u4e3a\uff08x - w / 2\uff0c y - h\uff09\uff0c\u8fd9\u6837\u7ef4\u62a4\u8d77\u6765\u53ef\u4ee5\u8bf4\u975e\u5e38\u590d\u6742\uff1b \u57fa\u4e8e\u4ee5\u4e0a\u4e24\u4e2a\u539f\u56e0\uff0c\u6211\u4eec\u5e76\u4e0d\u63a8\u8350\u8fd9\u79cd\u64cd\u4f5c\u65b9\u6848\u3002 \u7b2c\u56db\u79cd\uff1a\u5c5e\u6027\u5b9a\u4f4d \u6709\u540c\u5b66\u8bf4\u5e72\u561b\u4e0d\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u5462\uff0c\u5176\u5b9e\uff0c\u6211\u4eec\u6700\u5f00\u59cb\u60f3\u5230\u7684\u65b9\u6848\u5c31\u662f\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\uff0c\u4f46\u662f\u5728\u5c5e\u6027\u7684 DOM \u6811\u91cc\u600e\u4e48\u4e5f\u627e\u4e0d\u5230\uff0c\u65e0\u6cd5\u5b9a\u4f4d\u5230\uff0c\u6211\u4eec\u4e5f\u8054\u5408\u7814\u53d1\u540c\u5b66\u4e00\u8d77\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u4f46\u6700\u7ec8\u8fd8\u662f\u6ca1\u80fd\u89e3\u51b3\uff0c\u975e\u5e38\u9057\u61be\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42","title":"4.2\u3001\u6700\u65b0\u7684\u53f3\u952e\u83dc\u5355\u7ec8\u6781\u89e3\u51b3\u65b9\u6848","text":"\u7531\u4e8e\u53f3\u952e\u83dc\u5355\u9009\u9879\u51e0\u4e4e\u90fd\u662f\u6587\u672c\uff0c\u90a3\u4e48\u901a\u8fc7 OCR \u8bc6\u522b\uff0c\u51e0\u4e4e\u662f\u6700\u4f18\u7684\u65b9\u6848\uff1a \u4e0d\u7528\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff1b \u4e0d\u4f1a\u53d7\u5230\u83dc\u5355\u9009\u9879\u987a\u5e8f\u6539\u53d8\u7684\u5f71\u54cd\uff1b \u4e0d\u4f1a\u53d7\u5230\u5b57\u4f53 UI \u53d8\u5316\u7684\u5f71\u54cd\uff1b \u5173\u4e8e OCR \u8bc6\u522b\u6211\u4eec\u5728\u540e\u9762\u4f1a\u8be6\u7ec6\u8bb2\u5230\uff0c\u672c\u7ae0\u8282\u4e3b\u8981\u8bb2\u57fa\u4e8e OCR \u8bc6\u522b\uff0c\u6211\u4eec\u5728\u53f3\u952e\u83dc\u5355\u8bc6\u522b\u4e0a\u7684\u7a81\u7834\u548c\u521b\u65b0\uff1b \u4f7f\u7528 OCR \u8bc6\u522b\u53f3\u952e\u83dc\u5355\u867d\u7136\u5df2\u7ecf\u5f88\u5b8c\u7f8e\u4e86\uff0c\u4f46\u662f\u5728\u4e00\u4e9b\u60c5\u51b5\u4e0b\u4ecd\u7136\u5b58\u5728\u4e00\u70b9\u95ee\u9898\uff0c\u5c31\u662f\u5c4f\u5e55\u4e2d\u51fa\u73b0\u591a\u4e2a\u548c\u83dc\u5355\u9009\u9879\u6587\u5b57\u76f8\u540c\u7684\u6587\u5b57\u65f6\uff0c\u6bd4\u5982\u4e0b\u9762\u8fd9\u79cd\u60c5\u51b5\uff1a \u5c4f\u5e55\u6070\u597d\u51fa\u73b0\u4e86\u4e24\u4e2a\u201c\u590d\u5236\u201d\uff0c\u6b64\u65f6\u8981\u5b9a\u4f4d\u5230\u83dc\u5355\u4e2d\u7684 \u201c\u590d\u5236\u201d\uff0c\u5c31\u9700\u8981\u8fdb\u4e00\u6b65\u505a\u6570\u636e\u5904\u7406\uff0c\u6bd4\u5982\uff1aOCR \u8fd4\u56de 2 \u4e2a\u201c\u590d\u5236\u201d\u7684\u5750\u6807\uff0c\u7528\u4f8b\u91cc\u9762\u6765\u5224\u65ad\u7528\u54ea\u4e2a\uff0c\u4ece\u4e1a\u52a1\u4e0a\u5c06\u5904\u7406\u8d77\u6765\u6bd4\u8f83\u9ebb\u70e6\uff0c\u56e0\u4e3a\u4f60\u5f97\u660e\u786e\u77e5\u9053\u83dc\u5355\u5728\u5de6\u8fb9\u8fd8\u662f\u53f3\u8fb9\uff0c\u7136\u540e\u8fd9\u672c\u8eab\u5c31\u662f\u4e0d\u786e\u5b9a\u7684\uff1b \u600e\u4e48\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u5462\uff0c\u8fd9\u5c31\u8981\u8bf4\u9053\u672c\u7ae0\u7684\u4e3b\u9898\uff1a\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b\u3002 \u3010\u539f\u7406\u3011 \u5728\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u524d\u622a\u4e00\u5f20\u56fe\uff0c\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\u518d\u622a\u53d6\u4e00\u5f20\u56fe\uff0c\u4e24\u5f20\u56fe\u552f\u4e00\u53d8\u5316\u7684\u5c31\u662f\u53f3\u952e\u83dc\u5355\uff0c\u5c06\u5176\u4ed6\u76f8\u540c\u7684\u5730\u65b9\u90fd\u5c4f\u853d\u6389\uff0c\u53ea\u7559\u4e0b\u83dc\u5355\u754c\u9762\uff0c\u5982\u6b64\u5373\u53ef\u6d88\u9664\u5e72\u6270\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u5c06\u4e24\u79cd\u56fe\u505a\u524d\u540e\u5bf9\u6bd4\u63d0\u53d6\u53ef\u4ee5\u5f97\u5230\u8fd9\u6837\u7684\u56fe\uff1a \u4f60\u770b\uff0c\u901a\u8fc7\u524d\u540e\u56fe\u7247\u7684\u5bf9\u6bd4\uff0c\u5c06\u76f8\u540c\u7684\u90e8\u5206\u7ed9\u6d88\u9664\u6389\uff0c\u518d\u8fdb\u884c OCR \u8bc6\u522b\uff0c\u8fd9\u6837\u5c31\u4e0d\u4f1a\u6709\u5e72\u6270\u4e86\uff1b \u4ee3\u7801\u5b9e\u73b0\u8bf7\u67e5\u770b src/filter_image.py \uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def filter_image(action):\n\"\"\"\n \u5bf9\u6bd4\u52a8\u4f5c\u524d\u540e\u4e24\u5f20\u56fe\u7247\uff0c\u63d0\u53d6\u4e0d\u540c\u7684\u90e8\u5206\u751f\u6210\u4e00\u5f20\u65b0\u7684\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u65b0\u56fe\u7247\u7684\u8def\u5f84\n :param action: \u52a8\u4f5c\u51fd\u6570\u7684\u51fd\u6570\u5bf9\u8c61\n :return: \u65b0\u56fe\u7247\u7684\u8def\u5f84\n \"\"\"\n action \u662f\u9f20\u6807\u4e8b\u4ef6\uff0c\u56e0\u4e3a\u6b64\u7c7b\u573a\u666f\u4e0d\u4ec5\u4ec5\u5728\u53f3\u952e\u5b58\u5728\uff0c\u5355\u51fb\u3001\u53cc\u51fb\u7b49\u7b49\uff0c\u53ea\u8981\u64cd\u4f5c\u524d\u540e\u540e\u53d8\u5316\u7684\u90fd\u53ef\u4ee5\uff1a from src.mouse_key import MouseKey\naction = (\nMouseKey.click,\nMouseKey.right_click,\nMouseKey.double_click,\nMouseKey.move_to,\n)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5","title":"5\u3001\u52a8\u6001\u56fe\u50cf\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5728\u684c\u9762\u58c1\u7eb8\u5207\u6362\uff0c\u6216\u770b\u56fe\u3001\u76f8\u518c\u5207\u6362\u56fe\u7247\u7c7b\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u7531\u4e8e\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u662f\u4e0d\u56fa\u5b9a\u7684\uff08\u4e0d\u540c\u7248\u672c\u7684\u7cfb\u7edf\u58c1\u7eb8\u4e0d\u540c\u3001\u58c1\u7eb8\u987a\u5e8f\u4e0d\u540c\uff0c\u770b\u56fe\u76f8\u518c\u5728\u56fe\u7247\u8d44\u6e90\u4e0d\u4e00\u5b9a\u56fa\u5b9a\uff09\uff0c\u90a3\u4e48\u5728\u6d4b\u8bd5\u5207\u6362\u58c1\u7eb8\u6216\u8005\u5207\u6362\u56fe\u7247\u7684\u573a\u666f\u65f6\u5c31\u4f1a\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u4f60\u4e0d\u77e5\u9053\u9884\u671f\u662f\u5565\uff0c\u7528\u4f8b\u64cd\u4f5c\u52a8\u6001\u7684\uff0c\u4e5f\u662f\u6781\u4e0d\u7a33\u5b9a\u3002 \u3010\u539f\u7406\u3011 \u5728\u5207\u6362\u56fe\u7247\u4e4b\u524d\u622a\u56fe\u4fdd\u5b58\u5e76\u8fd4\u56de\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u6b21\u8bc6\u522b\u8fd9\u5f20\u56fe\u7247\uff0c\u5982\u679c\u4e0d\u5b58\u5728\uff0c\u8bf4\u660e\u56fe\u7247\u5df2\u7ecf\u5207\u6362\u4e86\uff1b \u793a\u610f\u56fe\uff1a \u8fd9\u6837\uff0c\u6211\u4eec\u622a\u53d6\u4e86\u5f53\u524d\u56fe\u7247\u4e2d\u6bd4\u8f83\u6709\u4ee3\u8868\u6027\u7684\u4f4d\u7f6e\uff08\u4e00\u53ea\u9e1f\uff09\uff0c\u5728\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u7528\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1a \u6211\u4eec\u518d\u62ff\u7740\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd9\u6837\u5728\u5f53\u524d\u56fe\u7247\u4e2d\uff0c\u5c31\u4e0d\u80fd\u627e\u5230\u8fd9\u53ea\u9e1f\u4e86\uff0c\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u662f False\uff0c\u90a3\u4e48\u4e5f\u5c31\u53ef\u4ee5\u5224\u65ad\u56fe\u7247\u5207\u6362\u662f\u6210\u529f\u7684\u3002 \u4ee3\u7801\u793a\u610f\uff1a def save_temporary_picture(_x: int, _y: int, width: int, height: int):\n\"\"\"\n \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u56fe\u7247\u8def\u5f84\n :param x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n :param y: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n :param width: \u5bbd\u5ea6\n :param height: \u9ad8\u5ea6\n :return: \u56fe\u7247\u8def\u5f84\n \"\"\"\n \u6b64\u51fd\u6570\u7528\u4e8e\u5728\u64cd\u4f5c\u4e4b\u524d\u622a\u56fe\u4e00\u5f20\u4e34\u65f6\u56fe\u7247\uff0c\u8fd4\u56de\u56fe\u7247\u8def\u5f84\uff0c\u6700\u540e\u5728\u65ad\u8a00\u7684\u65f6\u5019\u518d\u5c06\u56fe\u7247\u8def\u5f84\u4f5c\u4e3a\u53c2\u6570\u4f20\u5165\u65ad\u8a00\u8bed\u53e5\u5373\u53ef\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ui","title":"\u4e09\u3001\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_1","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u662f\u6211\u4eec\u81ea\u7814\u7684\u4e00\u79cd\u4f7f\u7528\u7b80\u5355\uff0c\u4e14\u6548\u7387\u6781\u9ad8\u3001\u7a33\u5b9a\u6027\u597d\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u57fa\u4e8e\u5143\u7d20\u6309\u94ae\u5728\u5e94\u7528\u4e2d\u7684\u76f8\u5bf9\u4f4d\u7f6e\uff0c\u52a8\u6001\u83b7\u53d6\u5143\u7d20\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff0c\u9002\u7528\u4e8e\u5404\u79cd\u5c4f\u5e55\u5206\u8fa8\u7387\uff08\u5305\u62ec\u9ad8\u5206\u5c4f\u3001\u5bbd\u5c4f\u3001\u5e26\u9c7c\u5c4f\uff09\uff0c\u5f53\u5143\u7d20\u6309\u94ae\u4f4d\u7f6e\u76f8\u5bf9\u4e8e\u5e94\u7528\u754c\u9762\u4f4d\u7f6e\u53d1\u751f\u4fee\u6539\u4e4b\u540e\uff0c\u53ea\u9700\u8981\u6839\u636e UI \u8bbe\u8ba1\u56fe\u4e0a\u7684\u6e90\u6570\u636e\u4fee\u6539\u5bf9\u5e94\u5750\u6807\u6570\u636e\u5c31\u597d\uff0c\u7ef4\u62a4\u975e\u5e38\u7684\u65b9\u4fbf\u3002 \u6b64\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u9002\u7528\u4e8e\u4e00\u4e9b\u5143\u7d20\u4f4d\u7f6e\u76f8\u5bf9\u4e0e\u5e94\u7528\u754c\u9762\u6bd4\u8f83\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u97f3\u4e50\uff0899% \u7684\u5143\u7d20\u5b9a\u4f4d\u91c7\u7528\u8fd9\u79cd\uff0c\u6548\u679c\u975e\u5e38\u597d\uff09\uff0c\u4e0d\u9002\u7528\u4e8e\u754c\u9762\u4e0d\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u622a\u56fe\u5f55\u5c4f\uff0c\u5f88\u660e\u663e\u4e0d\u9002\u7528\u4e8e\u8fd9\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u3002\u8fd9\u79cd\u5168\u65b0\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u6709\u5b83\u7684\u9002\u7528\u6761\u4ef6\uff0c\u5982\u679c\u4f60\u53d1\u73b0\u4f7f\u7528\u5e38\u89c4\u7684\uff08\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u5b9a\u4f4d\uff09\u4e0d\u597d\u505a\u65f6\uff0c\u4e0d\u59a8\u8003\u8651\u4f7f\u7528\u8fd9\u79cd\uff0c\u5176\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff0c\u5e76\u4e14\u8fc5\u901f\u7231\u4e0a\u4ed6\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_1","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5728 UI \u8bbe\u8ba1\u56fe\u4e2d\u6211\u4eec\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u8fb9\u6846\u7684\u8ddd\u79bb\u7684\uff0c\u7136\u540e\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u6280\u672f\u624b\u6bb5\u83b7\u53d6\u5230\u5e94\u7528\u754c\u9762\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u53ca\u5e94\u7528\u7a97\u53e3\u7684\u5927\u5c0f\uff0c\u793a\u610f\u56fe\u5982\u4e0b\uff1a \uff08x1, y1\uff09\u4e3a\u5e94\u7528\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\uff1b\uff08x2, y2\uff09\u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u5de6\u4e0a\u89d2\uff08x1, y1\uff09\u7684\u5750\u6807\uff0c\u90a3\u4e48\u5b9e\u9645\u4e0a\u3010\u64ad\u653e\u6240\u6709\u3011\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\u4e3a\uff1a\uff08 x1 + x2, y1 + y2 \uff09\uff1b \u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5927\u5c0f\uff08w2, h2\uff09\uff0c\u53ef\u4ee5\u4ece UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\uff1b \u5728 UI \u8bbe\u8ba1\u7a3f\u4e0a\u70b9\u51fb\u3010\u64ad\u653e\u6240\u6709\u3011\u56fe\u6807\uff0c\u7136\u540e\u79fb\u52a8\u9f20\u6807\u5c31\u5c31\u53ef\u4ee5\u770b\u5230\u4e0a\u56fe\u7684\u53c2\u8003\u7ebf\u53ca\u6570\u636e\uff1b \u6240\u4ee5\uff0c\u6211\u4eec\u53ef\u4ee5\u8f7b\u677e\u7684\u83b7\u53d6\u5230\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u4e2d\u5fc3\u5750\u6807\u4e3a\uff1a\uff08 x1 + x2 + (w2 / 2), y1 + y2 + ( h2 / 2) \uff09 \u8be6\u7ec6\u6e90\u4ee3\u7801\u8bf7\u67e5\u770b AT \u57fa\u7840\u6846\u67b6: src/button_center.py \u83b7\u53d6\u5e94\u7528\u7a97\u53e3\u7684\u4fe1\u606f \u4f7f\u7528 xdotool \u548c xwininfo \u83b7\u53d6\u5230\u5e94\u7528\u7a97\u53e3\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u5de6\u4e0a\u89d2\uff09\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a app_id = CmdCtl.run_cmd(f\"xdotool search --classname --onlyvisible {self.app_name}\"\n).split(\"\\n\")\napp_id_list = [int(_id) for _id in app_id if _id]\nreturn CmdCtl.run_cmd(f\"xwininfo -id {app_id_list[self.number]}\")\n \u4f7f\u7528\u6b63\u5219\u83b7\u53d6\u7a97\u53e3\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u83b7\u53d6\u914d\u7f6e \u8bfb ini \u914d\u7f6e\u6587\u4ef6\uff0c\u83b7\u53d6\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e0e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a conf = ConfigParser()\nconf.read(self.config_path)\ndirection = conf.get(btn_name, \"direction\")\nposition = [int(i.strip()) for i in conf.get(btn_name, \"location\").split(\",\")]\n \u8ba1\u7b97\u5143\u7d20\u6309\u94ae\u5750\u6807 \u6839\u636e\u5e94\u7528\u7a97\u53e3\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u5927\u5c0f\u3001\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u5927\u5c0f\uff0c\u4f7f\u7528\u4e00\u5b9a\u7684\u7b97\u6cd5\u5373\u53ef\u8ba1\u7b97\u51fa\u5143\u7d20\u6309\u94ae\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u4e2d\u5fc3\u5750\u6807\uff09\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3","title":"3\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u3010\u914d\u7f6e\u65b9\u6cd5\u3011 \u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u7684\u6570\u636e\u6e90\u662f\u5e94\u7528\u5e93\u4e2d\u7684 ui.ini \u914d\u7f6e\u6587\u4ef6\uff1a ;section\n[\u65b0\u5efa\u6b4c\u5355+] ;key = value\ndirection = left_top\nlocation = 180, 268, 21, 21\n section \u662f\u4f60\u6839\u636e\u5bf9\u5e94\u7684\u5143\u7d20\u6309\u94ae\u547d\u540d\uff0c\u4f60\u53ef\u4ee5\u4efb\u610f\u547d\u540d\uff0c\u4f46\u6700\u597d\u6709\u5177\u4f53\u542b\u4e49\uff0c\u4e14\u80fd\u660e\u786e\u8868\u793a\u8fd9\u4e2a\u5143\u7d20\u6309\u94ae\u7684\u540d\u79f0\uff1b\u7528\u4e2d\u62ec\u53f7\u62ec\u8d77\u6765\u5c31\u884c\uff0c\u6bd4\u5982\uff1a[\u65b0\u5efa\u6b4c\u5355+] \uff1b direction \u662f\u914d\u7f6e\u8be5\u5143\u7d20\u7684\u53c2\u8003\u7cfb\uff0c\u5206\u522b\u4e3a\uff1a left_top \u5de6\u4e0a\uff1b left_bottom \u5de6\u4e0b\uff1b right_top \u53f3\u4e0a\uff1b right_bottom \u53f3\u4e0b\uff1b \u53c2\u8003\u7cfb\u7684\u9009\u53d6\u6807\u51c6\uff1a\u62c9\u52a8\u6539\u53d8\u7a97\u53e3\u5927\u5c0f\u65f6\uff0c\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u53c2\u8003\u7cfb\u4f4d\u7f6e\u662f\u4e0d\u53d8\u7684\uff1b location \u662f\u8be5\u5143\u7d20\u6309\u94ae\u7684\u76f8\u5bf9\u4e0e\u53c2\u8003\u7cfb\u7684 x, y \u7684\u8ddd\u79bb\uff0c\u53ca\u5927\u5c0f(w, h)\uff0c\u8fd9\u56db\u4e2a\u6570\u636e\u53ef\u4ee5\u901a\u8fc7 UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\u6570\u636e\uff0c\u5728\u7f16\u8f91\u6a21\u5f0f\u4e0b\uff0c\u70b9\u51fb UI \u56fe\u4e0a\u7684\u6309\u94ae\uff0c\u53f3\u4fa7\u5c31\u4f1a\u51fa\u73b0\u8be5\u5143\u7d20\u6309\u94ae\u7684 x, y, w, h \u6570\u636e\u3002 \u5982\u679c UI \u56fe\u4e0a\u6ca1\u6709\u63d0\u4f9b\u4f60\u60f3\u8981\u7684\u5143\u7d20\u6570\u636e\uff0c\u4f60\u53ef\u4ee5\u76f4\u63a5\u5728\u7cfb\u7edf\u4e2d\u4f7f\u7528\u622a\u56fe\u5f55\u5c4f\u8fdb\u884c\u5c3a\u91cf\uff0c\u8fd9\u662f\u4e00\u79cd\u4e0d\u63a8\u8350\u4f46\u80fd\u7528\u7684\u65b9\u6cd5\u3002 \u3010\u8c03\u7528\u65b9\u6cd5\u3011 \u5728\u5e94\u7528\u5e93\u65b9\u6cd5\u5c42\u8fd9\u6837\u5199\uff1a def click_add_music_list_btn_in_music_by_ui(self):\n\"\"\"\u70b9\u51fb\u65b0\u5efa\u6b4c\u5355\u6309\u94ae\"\"\"\nself.click(*self.ui.btn_center(\"\u65b0\u5efa\u6b4c\u5355+\"))\n self.ui.btn_center() \u662f\u56fa\u5b9a\u5199\u6cd5\uff0c\u53c2\u6570\u5c31\u662f\u914d\u7f6e\u91cc\u9762\u7684 section \u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ocr","title":"\u56db\u3001OCR \u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_2","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 OCR \u65b9\u6848\u5927\u591a\u91c7\u7528\u8c37\u6b4c OCR\uff08Tesseract\uff09\u65b9\u6848\uff0c\u4f46\u662f\u5b83\u5bf9\u4e8e\u4e2d\u6587\u7684\u8bc6\u522b\u975e\u5e38\u5dee\uff0c\u7ecf\u8fc7\u5927\u91cf\u7684\u8c03\u7814\uff0c\u6211\u4eec\u4f7f\u7528 PaddleOCR\uff0c\u5b83\u662f\u4e00\u4e2a\u5f00\u6e90\u7684\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u8bc6\u522b\u5de5\u5177\uff0c\u4e5f\u662f PaddlePaddle \u6700\u6709\u540d\u7684\u4e00\u4e2a\u5f00\u6e90\u9879\u76ee\uff0c\u611f\u5174\u8da3\u7684\u53ef\u4ee5\u70b9\u8fd9\u91cc\u4e86\u89e3\uff0c\u591a\u7684\u4e0d\u8bf4\u4e86\uff0c\u4f60\u53ea\u9700\u8981\u77e5\u9053\u5b83\u5c31\u662f\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_2","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5b89\u88c5\u4ed6\u662f\u4e2a\u5f88\u9ebb\u70e6\u7684\u4e8b\u60c5\uff0c\u867d\u7136\u64cd\u4f5c\u5f88\u7b80\u5355\uff0c\u4f46\u5176\u5b9e\u5b89\u88c5\u5305\u6709\u70b9\u5927\uff0c\u56e0\u6b64\u6211\u4eec\u4e0d\u5e0c\u671b\u76f4\u63a5\u5728 env.sh \u4e2d\u52a0\u5165\u5b83\uff0c\u8fd9\u4f1a\u8ba9\u6574\u4e2a\u81ea\u52a8\u5316\u73af\u5883\u53d8\u5f97\u975e\u5e38\u81c3\u80bf\uff1b \u56e0\u6b64\uff0c\u6211\u4eec\u60f3\u5230\u5c06\u5b83\u505a\u6210\u4e00\u4e2a RPC \u670d\u52a1\u5728\u5176\u4ed6\u673a\u5668\u4e0a\u90e8\u7f72\uff0c\u6d4b\u8bd5\u673a\u901a\u8fc7\u8fdc\u7a0b\u8c03\u7528 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u4f7f\u7528\u5b83\uff1b RPC \u7684\u8c03\u7528\u903b\u8f91\uff1a \u8fd9\u6837\u6211\u4eec\u53ea\u9700\u8981\u5728\u670d\u52a1\u7aef\u90e8\u7f72\u597d OCR \u8bc6\u522b\u7684\u670d\u52a1\uff0c\u7136\u540e\u901a\u8fc7 RPC \u670d\u52a1\u5c06\u529f\u80fd\u63d0\u4f9b\u51fa\u6765\uff0c\u6846\u67b6\u91cc\u9762\u53ea\u9700\u8981\u8c03\u7528\u5bf9\u5e94\u7684 RPC \u63a5\u53e3\u5c31\u884c\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_1","title":"3\u3001\u4f7f\u7528\u8bf4\u660e","text":"\u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nfrom paddleocr import PaddleOCR\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef paddle_ocr(pic_path, lang):\n\"\"\"\n Paddleocr\u76ee\u524d\u652f\u6301\u7684\u591a\u8bed\u8a00\u8bed\u79cd\u53ef\u4ee5\u901a\u8fc7\u4fee\u6539lang\u53c2\u6570\u8fdb\u884c\u5207\u6362\n \u4f8b\u5982`ch`, `en`, `fr`, `german`, `korean`, `japan`\n :param file_name:\n :param lang:\n :return:\n \"\"\"\nif __name__ == \"__main__\":\nIP = popen(\"hostname -I\").read().split(\" \")[0]\nPORT = 8890\nSCREEN_CACHE = \"/tmp/screen.png\"\nserver = ThreadXMLRPCServer((IP, PORT), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(paddle_ocr, \"paddle_ocr\")\nprint(\"\u76d1\u542c\u5ba2\u6237\u7aef\u8bf7\u6c42\u3002\u3002\")\nserver.serve_forever()\n \u6846\u67b6\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from src import OCR\nOCR.ocr(*target_strings, picture_abspath=None, similarity=0.6, return_default=False, return_first=False, lang=\"ch\"):\n# \u901a\u8fc7 OCR \u8fdb\u884c\u8bc6\u522b\u3002\n# target_strings:\n# \u76ee\u6807\u5b57\u7b26,\u8bc6\u522b\u4e00\u4e2a\u5b57\u7b26\u4e32\u6216\u591a\u4e2a\u5b57\u7b26\u4e32,\u5e76\u8fd4\u56de\u5176\u5728\u56fe\u7247\u4e2d\u7684\u5750\u6807;\n# \u5982\u679c\u4e0d\u4f20\u53c2\uff0c\u8fd4\u56de\u56fe\u7247\u4e2d\u8bc6\u522b\u5230\u7684\u6240\u6709\u5b57\u7b26\u4e32\u3002\n# picture_abspath: \u8981\u8bc6\u522b\u7684\u56fe\u7247\u8def\u5f84\uff0c\u5982\u679c\u4e0d\u4f20\u9ed8\u8ba4\u622a\u53d6\u5168\u5c4f\u8bc6\u522b\u3002\n# similarity: \u5339\u914d\u5ea6\u3002\n# return_default: \u8fd4\u56de\u8bc6\u522b\u7684\u539f\u751f\u6570\u636e\u3002\n# return_first: \u53ea\u8fd4\u56de\u7b2c\u4e00\u4e2a,\u9ed8\u8ba4\u4e3a False,\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u6240\u6709\u6570\u636e\u3002\n# lang: `ch`, `en`, `fr`, `german`, `korean`, `japan`\n \u6b64\u65b9\u6848\u5728\u6846\u67b6\u5185\u6ca1\u6709\u5f15\u5165\u4efb\u4f55\u4e09\u65b9\u4f9d\u8d56\u5b8c\u5168\u91c7\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\uff0c\u800c\u4e14\u4f7f\u7528\u65b9\u6cd5\u975e\u5e38\u7b80\u5355\uff0c\u53ea\u9700\u8981\u901a\u8fc7 OCR.ocr() \u5373\u53ef\uff1b \u5bf9\u4e8e\u4e00\u4e9b\u6587\u6848\u7684\u573a\u666f\u975e\u5e38\u9002\u7528\uff0c\u6b64\u65b9\u6cd5\u76f4\u63a5\u8fd4\u56de\u5750\u6807\uff0c\u53ef\u4ee5\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u3002 \u4e5f\u53ef\u4ee5\u7528\u4e8e\u6587\u5b57\u65ad\u8a00\uff0c\u4ee3\u7801\u793a\u610f\uff1a def assert_ocr_exist(\n*args, picture_abspath=None, similarity=0.6, return_first=False, lang=\"ch\"\n):\n\"\"\"\u65ad\u8a00\u6587\u6848\u5b58\u5728\"\"\"\npic = None\nif picture_abspath is not None:\npic = picture_abspath + \".png\"\nres = OCR.ocr(\n*args,\npicture_abspath=pic,\nsimilarity=similarity,\nreturn_first=return_first,\nlang=lang,\n)\nif res is False:\nraise AssertionError(\n(f\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{args}\", f\"{pic if pic else GlobalConfig.SCREEN_CACHE}\")\n)\nif isinstance(res, tuple):\npass\nelif isinstance(res, dict) and False in res.values():\nres = filter(lambda x: x[1] is False, res.items())\nraise AssertionError(\n(\nf\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{dict(res)}\",\nf\"{pic if pic else GlobalConfig.SCREEN_CACHE}\",\n)\n)\n \u5728\u7528\u4f8b\u4e2d\u4f7f\u7528\u65ad\u8a00\uff0c\u793a\u4f8b\uff1a def test_font_manager_021(self):\n\"\"\"\u53f3\u4fa7\u2665-\u6536\u85cf/\u53d6\u6d88\u6536\u85cf\u5b57\u4f53\"\"\"\n# \u5b57\u4f53\u7ba1\u7406\u5668\u754c\u9762\u53f3\u4fa7\u8be6\u60c5\u5217\u8868\uff0c\u9009\u62e9\u672a\u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e / \u6536\u85cf\u5b57\u4f53\n# \u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e\u83dc\u5355\u663e\u793a\u201c\u53d6\u6d88\u6536\u85cf\u201d\uff1b\n...\nself.assert_ocr_exist(\"\u53d6\u6d88\u6536\u85cf\")\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_1","title":"4\u3001\u670d\u52a1\u7aef\u90e8\u7f72","text":"\u6211\u4eec\u76ee\u524d\u662f\u5c06 OCR \u670d\u52a1\u90e8\u7f72\u5728\u666e\u901a\u7684\u529e\u516c\u673a\u4e0a\u7684\uff0c\u5982\u679c\u4f60\u89c9\u5f97\u73b0\u6709\u7684 OCR \u8bc6\u522b\u6027\u80fd\u4e0d\u591f\u597d\uff0c\u6070\u597d\u4f60\u6709\u66f4\u597d\u7684\u673a\u5668\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u5176\u79c1\u6709\u5316\u90e8\u7f72\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41_1","title":"4.1\u3001\u73af\u5883\u5b89\u88c5","text":"\u63a8\u8350\u4f7f\u7528 pipenv \u8fdb\u884c\u73af\u5883\u642d\u5efa\uff1b \u5b89\u88c5 pipenv \uff1a sudo pip3 install pipenv\n \u65b0\u5efa\u4e00\u4e2a\u76ee\u5f55\u4f5c\u4e3a\u73af\u5883\u5305 ocr_env\uff1a cd ~\nmkdir ocr_env\n \u521b\u5efa python 3.7 \u73af\u5883\uff1a cd ocr_env\npipenv --python 3.7\n \u5b89\u88c5 OCR \u4f9d\u8d56\u5305\uff1a pipenv install paddlepaddle -i https://mirror.baidu.com/pypi/simple\npipenv install \"paddleocr>=2.0.1\" -i https://mirror.baidu.com/pypi/simple\n \u4e0d\u51fa\u610f\u5916\uff0c\u8fd9\u6837\u5c31\u628a\u4f9d\u8d56\u5b89\u88c5\u597d\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42_1","title":"4.2\u3001\u542f\u52a8\u670d\u52a1","text":"\u5c06\u57fa\u7840\u6846\u67b6\u4e2d\u7684 scr/ocr/pdocr_rpc_server.py \u6587\u4ef6\u62f7\u8d1d\u5230 ocr_env \u76ee\u5f55\uff0c\u540e\u53f0\u6267\u884c\u5b83\u5c31\u597d\u4e86\uff1a cd ocr_env\nnohup pipenv run python pdocr_rpc_server.py &\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#43","title":"4.3\u3001\u914d\u7f6e\u5f00\u673a\u81ea\u542f\uff08\u901a\u7528\uff09","text":"\u4f60\u80af\u5b9a\u4e0d\u60f3\u6bcf\u6b21\u673a\u5668\u91cd\u542f\u4e4b\u540e\u90fd\u9700\u8981\u624b\u52a8\u542f\u52a8\u670d\u52a1\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u914d\u7f6e\u5f00\u673a\u81ea\u542f\u3002 \u5199\u5f00\u673a\u81ea\u542f\u670d\u52a1\u6587\u4ef6\uff1a sudo vim /lib/systemd/system/ocr.service\n autoocr \u540d\u79f0\u4f60\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff0c\u5199\u5165\u4ee5\u4e0b\u5185\u5bb9\uff1a [Unit]\nDescription=OCR Service\nAfter=multi-user.target\n\n[Service]\nUser=uos\nGroup=uos\nType=idle\nWorkingDirectory=/home/uos/ocr_env\nExecStart=pipenv run python pdocr_rpc_server.py\n\n[Install]\nWantedBy=multi-user.target\n \u6ce8\u610f\u66ff\u6362\u4f60\u7684${USER} \u4fee\u6539\u914d\u7f6e\u6587\u4ef6\u7684\u6743\u9650\uff1a sudo chmod 644 /lib/systemd/system/ocr.service\n \u81ea\u542f\u670d\u52a1\u751f\u6548\uff1a sudo systemctl daemon-reload\nsudo systemctl enable ocr.service\n \u67e5\u770b\u670d\u52a1\u72b6\u6001\uff1a sudo systemctl status ocr.service\n \u4f60\u53ef\u4ee5\u518d\u91cd\u542f\u4e0b\u7535\u8111\uff0c\u770b\u770b\u670d\u52a1\u662f\u4e0d\u662f\u6b63\u5e38\u542f\u52a8\u4e86\uff0c\u6ca1\u62a5\u9519\u5c31 OK \u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_4","title":"\u4e94\u3001\u5c5e\u6027\u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_3","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 UI \u81ea\u52a8\u5316\u5927\u591a\u90fd\u662f\u57fa\u4e8e\u6d4f\u89c8\u5668\u7684\uff0c\u6838\u5fc3\u662f\u5728\u7f51\u9875\u7684 DOM \u6811\u4e0a\u67e5\u627e\u5143\u7d20\uff0c\u5e76\u5bf9\u5176\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\uff1b Linux \u684c\u9762\u5e94\u7528\u5927\u591a\u662f\u91c7\u7528 Qt \u7f16\u5199\u7684\uff0c\u5728 Qt \u4e2d\u4e5f\u662f\u4ece\u6700\u9876\u5c42\u7684 MainWindow \u5f00\u59cb\u6784\u5efa\u5e94\u7528\uff0c\u6240\u4ee5\u903b\u8f91\u4e5f\u662f\u4e00\u6837\u7684\uff0cQt \u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u540c\u6837\u53ef\u4ee5\u901a\u8fc7 DOM \u6811\uff08\u5c5e\u6027\u6811\uff09\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff0c\u6211\u4eec\u79f0\u4e4b\u4e3a\u5c5e\u6027\u5b9a\u4f4d\u3002 \u501f\u52a9\u5f00\u6e90\u5de5\u5177 dogtail \u6211\u4eec\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u83b7\u53d6\uff0c\u4ece\u800c\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\u3002dogtail \u7684\u9879\u76ee\u4ecb\u7ecd\u53ef\u4ee5\u731b\u6233\u8fd9\u91cc\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_3","title":"2\u3001\u4f7f\u7528\u65b9\u6cd5","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#21sniff","title":"2.1\u3001sniff\uff08\u55c5\u63a2\u5668\uff09\u4f7f\u7528","text":"\u5728\u7ec8\u7aef\u8f93\u5165 sniff \u542f\u52a8 AT-SPI Browser mikigo@mikigo-PC:~$ sniff\n \u67e5\u770b\u5e94\u7528\u7684\u6807\u7b7e \u5728 sniff \u91cc\u9762\u53ef\u4ee5\u770b\u5230\u7cfb\u7edf\u4e2d\u5df2\u542f\u52a8\u7684\u5e94\u7528\uff0c\u70b9\u51fb\u5e94\u7528\u540d\u79f0\u524d\u9762\u7684\u4e09\u89d2\u5f62\u56fe\u6807\uff0c\u53ef\u4ee5\u5c55\u5f00\u5e94\u7528\u7684\u6807\u7b7e\uff0c\u6240\u6709\u6807\u7b7e\u4ee5 tree \u7684\u5f62\u5f0f\u5c55\u793a\uff0c\u5bf9\u5e94\u5e94\u7528\u91cc\u9762\u7684\u7236\u7a97\u53e3\u548c\u5b50\u7a97\u53e3\u3002 \u83b7\u53d6\u5143\u7d20\u63a7\u4ef6\u7684\u6807\u7b7e\u540d\u79f0 \u9996\u5148\uff0c\u4e3a\u4e86\u65b9\u4fbf\u67e5\u770b\u5143\u7d20\u63a7\u4ef6\u5bf9\u5e94\u7684\u4f4d\u7f6e\uff0c\u5efa\u8bae\u73b0\u5728\u4e0a\u65b9\u5de5\u5177\u680f\u70b9\u51fb Actions\uff0c\u7136\u540e\u52fe\u9009 Hightlight Items\uff0c\u8fd9\u6837\u5728 sniff \u4e2d\u9f20\u6807\u9009\u4e2d\u5143\u7d20\u6807\u7b7e\u7684\u65f6\u5019\uff0c\u5e94\u7528\u4e2d\u4f1a\u6709\u76f8\u5e94\u7684\u5149\u6807\u9501\u5b9a\u3002 \u5728 sniff \u91cc\u9762\u70b9\u51fb\u8fdb\u5165\u5e94\u7528\u7684\u6807\u7b7e tree \u4e2d\u540e\uff0c\u70b9\u51fb\u76f8\u5e94\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5728\u5de5\u5177\u4e0b\u65b9\uff0c\u4f1a\u5c55\u793a\u5143\u7d20\u63a7\u4ef6\u7684 Name\uff0c\u8fd9\u4e2a\u5c31\u662f\u6807\u7b7e\u540d\u79f0\u3002 \u5728 tree \u4e2d\u6709\u4e9b\u5730\u65b9\u662f\u7a7a\u767d\u7684\u6216\u8005\u662f Form\uff0c\u662f\u56e0\u4e3a\u5f00\u53d1\u4eba\u5458\u5728\u6dfb\u52a0\u6807\u7b7e\u7684\u65f6\u5019\u6ca1\u6709\u6dfb\u52a0\uff0c\u6216\u8005\u6709\u4e9b\u7236\u7a97\u53e3\u4e0d\u9700\u8981\u6dfb\u52a0\uff0c\u8fd9\u79cd\u5728\u5b9e\u9645\u4e1a\u52a1\u4e2d\u662f\u4e0d\u5f71\u54cd\u7684\uff0c\u6211\u4eec\u53ea\u8981\u4fdd\u8bc1\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\u4e2d\uff0c\u8981\u7528\u5230\u7684\u5143\u7d20\u90fd\u6dfb\u52a0\u4e86\u6807\u7b7e\u5373\u53ef\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#22","title":"2.2\u3001\u5143\u7d20\u64cd\u4f5c","text":"\u83b7\u53d6\u5e94\u7528\u5bf9\u8c61 dogtail \u83b7\u53d6\u5e94\u7528\u5bf9\u8c61\u7684\u65f6\u5019\uff0c\u4f7f\u7528\u7684\u662f tree \u5e93\u91cc\u9762\u7684 application() \u65b9\u6cd5\uff1a from dogtail.tree import root\napp_obj = root.application('deepin-music')\n app_obj\u5c31\u662f\u5e94\u7528\u7684\u5bf9\u8c61\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\uff0c\u662f\u5e94\u7528\u5bf9\u8c61\u4f7f\u7528child()\u65b9\u6cd5\uff1a element = app_obj.child('element_name')\n \u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u4f20\u5165\u5143\u7d20\u7684 Name\uff0c\u83b7\u53d6\u5230\u76f8\u5e94\u5143\u7d20\u7684\u5bf9\u8c61\u3002Name \u53ef\u4ee5\u901a\u8fc7 sniff \u67e5\u770b\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\u5217\u8868: element_list = element.children\n \u83b7\u53d6\u5230\u8fd9\u4e2a\u5143\u7d20\u4e0b\u9762\u6240\u6709\u7684\u5143\u7d20\u5217\u8868\u3002 \u8fd9\u4e2a\u65b9\u6cd5\u9002\u7528\u4e8e\u6709\u4e9b\u6807\u7b7e\u6ca1\u6709\u6dfb\u52a0\uff0c\u4f46\u662f\u4f4d\u7f6e\u662f\u56fa\u5b9a\u7684\uff0c\u6211\u4eec\u901a\u8fc7\u7d22\u5f15\u53ef\u4ee5\u53d6\u5f97\u5143\u7d20\u3002 element_list[0]\n \u5bf9\u5143\u7d20\u7684\u64cd\u4f5c \u5728\u83b7\u53d6\u5230\u5143\u7d20\u4e4b\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u76f8\u5e94\u7684\u64cd\u4f5c\u3002 \u5355\u51fb element.click(button=1)\n button 1 \u2014>\u5de6\u952e\uff0c2 \u2014>\u6eda\u8f6e\uff0c3 \u2014>\u53f3\u952e\uff0c\u9ed8\u8ba4\u4e3a 1 \u53cc\u51fb element.doubleClick(button=1)\n \u9f20\u6807\u60ac\u505c element.point()\n \u9f20\u6807\u79fb\u52a8\u5230\u5143\u7d20\u4e2d\u5fc3\u4f4d\u7f6e \u6587\u672c\u8f93\u5165 element.typeText(string)\n \u5411\u5143\u7d20\u5bf9\u8c61\u8f93\u5165\u5b57\u7b26\u4e32 \uff0c\u6bd4\u5982\u8f93\u5165\u6846 \u7ec4\u5408\u952e element.keyCombo(comboString)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#23","title":"2.3\u3001\u6846\u67b6\u5c01\u88c5","text":"\u4ee3\u7801\u793a\u4f8b\uff1a # \u8be6\u7ec6\u4ee3\u7801\u8bf7\u67e5\u770b src/dogtail_utils.py\nclass DogtailUtils:\ndef __init__(self, name=None, description=None):\nself.name = name\nself.description = description\nself.obj = root.application(self.name, self.description)\ndef app_element(self, *args, **kwargs):\n\"\"\"\n \u83b7\u53d6app\u5143\u7d20\u7684\u5bf9\u8c61\n :return: \u5143\u7d20\u7684\u5bf9\u8c61\n \"\"\"\nreturn self.obj.child(*args, **kwargs, retry=False)\ndef element_center(self, element) -> tuple:\n\"\"\"\n \u83b7\u53d6\u5143\u7d20\u7684\u4e2d\u5fc3\u4f4d\u7f6e\n :param element:\n :return: \u5143\u7d20\u4e2d\u5fc3\u5750\u6807\n \"\"\"\n_x, _y, _w, _h = self.app_element(element).extents\n_x = _x + _w / 2\n_y = _y + _h / 2\nreturn _x, _y\n \u6846\u67b6\u63d0\u4f9b\u7684\u63a5\u53e3\u975e\u5e38\u7b80\u6d01\uff0c\u5728\u8c03\u7528\u65f6\uff1a self.dog.element_center(\"\u64ad\u653e\")\n \u8fd9\u6837\u5c31\u80fd\u83b7\u53d6\u5230\u6b64\u5143\u7d20\u7684\u4e2d\u5fc3\u5750\u6807\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_5","title":"\u516d\u3001\u6807\u7b7e\u5316\u7ba1\u7406","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_4","title":"1\u3001\u6807\u7b7e\u8bf4\u660e","text":"\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u811a\u672c ID\uff1a\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c/\u51fd\u6570 ID\uff1b PMS\u7528\u4f8bID\uff1aPMS \u4e0a\u5bf9\u5e94\u7684\u7528\u4f8b ID\uff08\u7528\u4f8b\u5e93 ID\uff09\uff1b \u9ed8\u8ba4\u4f7f\u7528\u7528\u4f8b\u5e93 ID\uff0c\u5bf9\u4e8e\u6682\u65f6\u6ca1\u6709\u4f7f\u7528\u7528\u4f8b\u5e93\u7ba1\u7406\u7528\u4f8b\u7684\u9879\u76ee\uff0c\u53ef\u4ee5\u4f7f\u7528\u4ea7\u54c1\u5e93\u7528\u4f8b ID\uff1b \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1aFUNC\uff08\u529f\u80fd\uff09\u3001API\uff08\u63a5\u53e3\uff09\u3001BASELINE\uff08\u57fa\u7ebf\uff09\u3001PERF\uff08\u6027\u80fd\uff09\u3001STR\uff08\u538b\u529b\uff09\u3001SEC\uff08\u5b89\u5168\uff09\u3001CTS\uff08\u517c\u5bb9\u6027\uff09 \u4e0a\u7ebf\u5bf9\u8c61\uff1aCICD\uff0c\u8868\u793a\u4e0a\u7ebf\u5230 CICD \u6d41\u6c34\u7ebf\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u53ef\u4e00\u952e\u751f\u6210 case_list.csv \u6587\u4ef6\uff0c\u7528\u4e8e\u5bfc\u5165\u5230\u660e\u9053\u4e91 AT \u7528\u4f8b\u5217\u8868\u4e2d\u63a7\u5236 CICD \u8dd1\u6d4b\u8303\u56f4\uff1b \u6d4b\u8bd5\u7ea7\u522b\uff1aC1 / C2 / C3 / C4\uff0c\u5177\u4f53\u5b9a\u4e49\u53c2\u8003\u6d41\u6c34\u7ebf\u4f7f\u7528\u6307\u5bfc\uff1b \u8df3\u8fc7\u539f\u56e0\uff1askip-XXX\uff0c\u7528\u4e8e\u63a7\u5236\u7528\u4f8b\u662f\u5426\u6267\u884c\uff1b \u786e\u8ba4\u4fee\u590d\uff1afixed-XXX\uff0c\u7528\u4e8e\u6807\u8bb0\u7528\u4f8b\u7684\u4fee\u590d\u72b6\u6001\uff08\u540e\u9762\u8be6\u7ec6\u8bb2\u89e3\u7528\u6cd5\uff09\uff1b \u5e9f\u5f03\u7528\u4f8b\uff1aremoved-\u5df2\u5e9f\u5f03\uff0c\u7528\u4e8e\u6807\u8bb0\u5df2\u7ecf\u5e9f\u5f03\u7684\u7528\u4f8b\uff0c\u6b64\u7528\u4f8b\u6807\u7b7e\u4e0d\u4f1a\u88ab\u6dfb\u52a0\uff0c\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff1b \u793a\u4f8b\uff1a \u811a\u672cID PMS\u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u4e0a\u7ebf\u5bf9\u8c61 \u6d4b\u8bd5\u7ea7\u522b \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b ... 001 679537 L1 FUNC CICD C1 skip-XXX fixed-XXX removed-\u5df2\u5e9f\u5f03 ..."},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_4","title":"2\u3001\u64cd\u4f5c\u6b65\u9aa4","text":"2.1\u3001\u5728\u5b50\u9879\u76ee\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u4ee5\u7528\u4f8b\u7684 py \u6587\u4ef6\u9664\u53bb\u9996\u5b57\u7b26\u4e32 \"test_\" \u548c\u7528\u4f8b\u5e8f\u53f7\u540e\u7684\u5b57\u7b26\u4e32\u4f5c\u4e3a csv \u7684\u6587\u4ef6\u540d\u3002 \u4f8b\u5982: \u76f8\u518c\u7684\u7528\u4f8b\u6587\u4ef6\u4e3a test_album_xxx.py\uff0cxxx \u8868\u793a\u4efb\u610f\u4e09\u4f4d\u6570\u5b57\u4ee3\u8868\u7528\u4f8b\u5e8f\u53f7\uff0c\u6b64\u65f6 csv \u6587\u4ef6\u540d\u5c31\u5e94\u4e3a album.csv\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u6240\u6709 csv \u6587\u4ef6\u5efa\u8bae\u653e\u5728\u4e00\u4e2a tags \u76ee\u5f55\u4e0b\u3002 \u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 2.2\u3001\u7b2c\u4e00\u5217\u4e3a\u811a\u672c ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b\u7528\u4f8b\u6807\u7b7e\u53ef\u4ee5\u65e0\u5e8f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_2","title":"3\u3001\u589e\u52a0\u8bf4\u660e","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_1","title":"3.1\u3001\u8df3\u8fc7\u7528\u4f8b","text":"\u4f20\u7edf\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668(@pytest.mark.skip)\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a; \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#311","title":"3.1.1\u3001\u56fa\u5b9a\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u7b7e\u5f00\u5934\u4e3a \u201cskip-XXX\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\uff0c\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\u5219\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u7b7e\u4e3a SKIPED\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#312","title":"3.1.2\u3001\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skipif_platform-aarch64&mips64 \u67d0\u4e9b\u7528\u4f8b\u4f1a\u56e0\u4e3a\u4e0d\u540c\u7684\u73af\u5883\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\uff0c\u5e38\u89c1\u7684\u573a\u666f\u4e3a\u5728\u4e0d\u540c\u67b6\u6784\u4e0a\u5224\u65ad\u662f\u5426\u6267\u884c\uff0c\u8df3\u8fc7\u7684\u539f\u56e0\u6807\u7b7e\u4e3a \u201cskipif_platform-\u201d \u52a0\u67b6\u6784\u540d\uff0c\u591a\u4e2a\u67b6\u6784\u4e4b\u95f4\u4f7f\u7528 \u201c&\u201d \u62fc\u63a5\uff1b \u4ee5\u4e0a\u4f8b\u5b50\u4e3a\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u5224\u65ad\u5f53\u524d\u67b6\u6784\u662f\u5426\u4e3a arrch64 \u6216\u8005 mips64\uff0c\u82e5\u662f\uff0c\u5219\u8df3\u8fc7\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u82e5\u5426\u5219\u6267\u884c\u7528\u4f8b\uff1b \u76ee\u524d\u6846\u67b6\u9ed8\u8ba4\u4ec5\u652f\u6301\u67b6\u6784\u7684\u6761\u4ef6\u5224\u65ad\uff0c\u4f46\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u903b\u8f91\u652f\u6301\u81ea\u5b9a\u4e49\u6dfb\u52a0\u3002 \u5728\u9879\u76ee\u76ee\u5f55\u8def\u5f84\u4e0b\u5b58\u5728\u6587\u4ef6 setting/skipif.py\uff0c\u6240\u6709\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u7684\u51fd\u6570\u5199\u5728\u6b64\u6587\u4ef6\u4e2d\u3002 \u9ed8\u8ba4\u67b6\u6784\u5224\u65ad\u4f8b\u5b50\uff1a def skipif_platform(args: str):\n\"\"\"\u5e73\u53f0\u8df3\u8fc7\"\"\"\n_skip_key = args.split(\"&\")\nfor key in _skip_key:\nif GlobalConfig.SYS_ARCH == key:\nreturn True\nreturn False\n \u65b9\u6cd5\u7f16\u5199\u89c4\u8303\uff1a \u65b9\u6cd5\u540d\u5fc5\u987b\u4ee5 skipif \u5f00\u5934\uff1b \u65b9\u6cd5\u5fc5\u987b\u6709\u8fd4\u56de\u7ed3\u679c\u5e76\u4e14\u4e3a\u5e03\u5c14\u503c\uff08True \u4ee3\u8868\u8df3\u8fc7\uff0cFalse \u4ee3\u8868\u4e0d\u8df3\u8fc7\uff09\uff1b \u65b9\u6cd5\u53ea\u80fd\u6709\u4e00\u4e2a\u5165\u53c2\uff1b \u5728 csv \u6587\u4ef6\u8df3\u8fc7\u539f\u56e0\u4e00\u680f\u4e2d\u586b\u5199\u4e3a \u201c{\u51fd\u6570\u540d}-{\u53c2\u6570}\u201d\uff0c\u4f8b\u5982\uff1askipif_platform-aarch64\uff1b\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u4f1a\u4ee5\u7b2c\u4e00\u4e2a \u201c-\u201d \u8fdb\u884c\u5206\u5272\uff0c\u622a\u53d6\u7684\u5de6\u4fa7\u5b57\u7b26\u4e32\u4f5c\u4e3a\u51fd\u6570\u540d\uff0c\u5728 skipif.py \u6587\u4ef6\u4e2d\u67e5\u627e\u662f\u5426\u6709\u540c\u540d\u51fd\u6570\uff0c\u5e76\u5c06\u622a\u53d6\u7684\u53f3\u4fa7\u4f5c\u4e3a\u53c2\u6570\u4f20\u9012\u7ed9\u8be5\u51fd\u6570\uff0c\u901a\u8fc7\u83b7\u53d6\u8be5\u51fd\u6570\u8fd4\u56de\u7684\u5e03\u5c14\u503c\uff0c\u8fd4\u56de True\uff0c\u5219\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u8fd4\u56de False\uff0c\u5219\u6267\u884c\u8be5\u7528\u4f8b\u3002 \u82e5\u51fd\u6570\u9700\u8981\u591a\u4e2a\u53c2\u6570\uff0c\u53ef\u81ea\u5b9a\u4e49\u591a\u4e2a\u53c2\u6570\u4e4b\u95f4\u7684\u8fde\u63a5\u7b26\uff0c\u8fde\u63a5\u7b26\u53f7\u4e0d\u53ef\u4f7f\u7528\u4e0b\u5212\u7ebf\u548c\u9017\u53f7\uff0c\u63a8\u8350\u7edf\u4e00\u4f7f\u7528 & \u7b26\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32","title":"3.2\u3001\u786e\u8ba4\u4fee\u590d","text":"\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7528\u4f8b\u4fee\u590d\u540e\uff0c\u4f46\u4e0d\u80fd\u7acb\u5373\u5220\u9664\u8df3\u8fc7\u539f\u56e0\uff08skip-XXX\uff09\u7684\u7528\u4f8b\uff0c\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u786e\u8ba4\u4fee\u590d\u201d\uff0c\u4f5c\u4e3a\u6807\u8bb0\u8be5\u7528\u4f8b\u662f\u5426\u5df2\u7ecf\u4fee\u590d\uff0c\u56fa\u5b9a\u586b\u5165\u5b57\u6bb5\u4e3a \u201cfixed-\u5df2\u4fee\u590d\u201d\u3002\u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u5373\u4f7f\u540c\u65f6\u6807\u8bb0\u4e86 skip-XXX \u4e5f\u4f1a\u6b63\u5e38\u6267\u884c\u3002 \u793a\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d \u3010\u540c\u65f6\u6807\u8bb0\u4e86skip \u548c fixed\uff0c\u4f46\u4ecd\u7136\u60f3\u8981\u8df3\u8fc7\u7528\u4f8b\u3011 \u5f53 \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u540c\u65f6\u586b\u5165\u540e\uff0c\u547d\u4ee4\u884c\u4f20\u9012\u53c2\u6570 --ifixed yes\uff0c\u5219\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\u8be5\u6761\u7528\u4f8b\u3002 python3 manage.py run --ifixed yes\n \u770b\u5230\u8fd9\u91cc\u6709\u4e9b\u540c\u5b66\u53ef\u80fd\u8981\u95ee\u4e86\uff0c\u6211\u60f3\u6062\u590d\u8df3\u8fc7\u6267\u884c\uff0c\u76f4\u63a5\u628a skip-XXX \u8fd9\u4e00\u5217\u6807\u7b7e\u5220\u6389\u4e0d\u5c31\u597d\u4e86\uff0c\u8fd8\u641e\u4ec0\u4e48\u786e\u8ba4\u4fee\u590d\u5e72\u5565\uff1f \u8fd9\u91cc\u7ed9\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u89e3\u91ca\u4e00\u4e0b\uff1a \uff08\u4ee5\u4e0b\u6d41\u6c34\u7ebf\u6307\u7684\u662f\u6bcf\u65e5\u6784\u5efa\u7684\u6d41\u6c34\u7ebf\uff0c\u8dd1 AT \u7684\u5168\u91cf\u7528\u4f8b\uff09 \u9996\u5148\uff0c\u6d41\u6c34\u7ebf\u4e0a\u8dd1\u7684\u662f AT \u5386\u53f2 Tag\uff0c\u8df3\u8fc7\u7528\u4f8b\u7684\u6807\u7b7e(skip-XXX) \u662f\u5728\u6700\u65b0\u7684\u4ee3\u7801\u4e0a\u63d0\u4ea4\u7684\uff0c\u6211\u4eec\u91c7\u7528\u6700\u65b0\u7684 csv \u6587\u4ef6\u8986\u76d6\u5386\u53f2 csv \u6587\u4ef6\u7684\u8bbe\u8ba1\u6765\u5b9e\u73b0\u4e86\u5bf9\u5386\u53f2 Tag \u4e0a\u7528\u4f8b\u7684\u8df3\u8fc7\uff1b \u7136\u540e\uff0c\u5728\u65e5\u5e38\u8df3\u8fc7\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u540c\u65f6\u4e5f\u5728\u4fee\u590d\u4e00\u4e9b\u7528\u4f8b\uff0c\u4fee\u590d\u540e\u7684\u8fd9\u4e9b\u7528\u4f8b\u5728\u672c\u5730\u8c03\u8bd5\u7684\u65f6\u5019\u6211\u4eec\u4e0d\u5e0c\u671b\u7ee7\u7eed\u8df3\u8fc7\uff0c\u4f46\u662f\u6b64\u65f6\uff0c\u4fee\u590d\u7684\u8fd9\u4e9b\u7528\u4f8b\u53ef\u80fd\u8fd8\u4e0d\u7a33\u5b9a\uff0c\u4e0d\u9002\u5408\u9a6c\u4e0a\u653e\u5230\u6d41\u6c34\u7ebf\u53bb\u8dd1\uff0c\u4e5f\u5c31\u662f\u8bf4\u6d41\u6c34\u7ebf\u4e0a\u6211\u4eec\u662f\u5e0c\u671b\u4ed6\u7ee7\u7eed\u8df3\u8fc7\u7684\uff0c\u56e0\u6b64\uff0c\u54b1\u4e0d\u80fd\u76f4\u63a5\u628a skip-XXX \u5e72\u6389\uff1b \u8fd9\u91cc\u5c31\u77db\u76fe\u4e86\uff0c\u4e00\u4e2a\u9700\u6c42\u662f\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u53e6\u4e00\u4e2a\u9700\u6c42\u53c8\u4e0d\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u600e\u4e48\u529e\u5462\uff1f \u6211\u4eec\u4f7f\u7528\u201c\u786e\u8ba4\u4fee\u590d\u201d\u6765\u6807\u8bb0\u8fd9\u6761\u7528\u4f8b\u5df2\u7ecf\u4fee\u590d\u4e86\uff0c\u8fd9\u6837\u4f60\u672c\u5730\u8c03\u8bd5\u7528\u4f8b\u7684\u65f6\u5019\u8fd9\u6761\u5df2\u4fee\u590d\u7684\u7528\u4f8b\u662f\u4f1a\u6267\u884c\u7684\uff0c\u540c\u65f6\u5728\u6d41\u6c34\u7ebf\u4e0a\u5c06 --ifixed yes \u53c2\u6570\u52a0\u4e0a\uff0c\u90a3\u4e48\u6d41\u6c34\u7ebf\u4e0a\u6267\u884c\u65f6\u8fd9\u6761\u7528\u4f8b\u4ecd\u7136\u662f\u8df3\u8fc7\u7684\u72b6\u6001\uff0c\u540e\u7eed\u4f60\u6253 Tag \u7684\u65f6\u5019\uff0c\u628a \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u7684\u6807\u7b7e\u5168\u90e8\u5220\u6389\u5c31\u53ef\u4ee5\u4e86\u3002 \u8fd9\u5c31\u662f\u201c\u786e\u8ba4\u4fee\u590d\u201d\u8fd9\u4e2a\u6807\u7b7e\u7684\u80cc\u666f\uff0c\u9700\u8981\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u54c1\u4e00\u54c1\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#33","title":"3.3\u3001\u5e9f\u5f03\u7528\u4f8b","text":"\u9488\u5bf9\u67d0\u4e9b\u7528\u4f8b\uff0c\u7531\u4e8e\u9700\u6c42\u53d8\u66f4\uff0c\u73af\u5883\u5f71\u54cd\u6216\u8bc4\u4f30\u4e0d\u518d\u9002\u7528\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u65f6\uff0c\u7528\u4f8b\u9700\u8981\u5e9f\u5f03\uff0c\u5219\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u5e9f\u5f03\u7528\u4f8b\u201d\uff0c\u8be5\u5217\u5b58\u5728 \u201cremoved-{\u5e9f\u5f03\u539f\u56e0}\u201d\uff0c\u5219\u7528\u4f8b\u4e0d\u4f1a\u6267\u884c\u3002 \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d removed-\u5df2\u5e9f\u5f03 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_2","title":"4\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u4e0a\u9762\u4ecb\u7ecd Pytest \u6846\u67b6\u63d0\u4f9b\u7684\u6807\u7b7e\u529f\u80fd mark\uff0c\u4f7f\u7528\u65f6\u9700\u8981\u4e3a\u6bcf\u4e00\u4e2a\u7528\u4f8b\u6dfb\u52a0\u6807\u7b7e\u88c5\u9970\u5668\uff0c\u5219\u64cd\u4f5c\u590d\u6742\uff0c\u53ef\u7ef4\u62a4\u6027\u5dee\uff0c\u5176\u6839\u672c\u95ee\u9898\u5c31\u662f\u6807\u7b7e\u5206\u6563\u5728\u6bcf\u4e00\u6761\u7528\u4f8b\u7684\u88c5\u9970\u5668\u4e0a\uff0c\u96be\u4ee5\u96c6\u4e2d\u7ef4\u62a4\uff1b\u4e8e\u662f\u4e4e\u5c06\u6240\u6709\u6807\u7b7e\u4f7f\u7528 csv \u6587\u4ef6\u8fdb\u884c\u96c6\u4e2d\u7ba1\u7406\uff0c\u5e76\u901a\u8fc7 Pytest \u7684\u94a9\u5b50\u51fd\u6570\uff0c\u8bfb\u53d6 csv \u6587\u4ef6\uff0c\u52a8\u6001\u6dfb\u52a0\u6807\u7b7e\u5230\u7528\u4e2d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5csv","title":"5\u3001CSV\u6587\u4ef6\u683c\u5f0f","text":"\u6b64\u914d\u7f6e\u6587\u4ef6\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u6807\u7b7e\u6570\u636e\uff0c\u4e14\u8981\u65b9\u4fbf\u80fd\u4f7f\u7528Excel\u6253\u5f00\u8fdb\u884c\u7f16\u8f91\u67e5\u770b\uff0c\u66f4\u91cd\u8981\u7684\u662f\u6211\u4eec\u4e0d\u60f3\u5f15\u5165\u4e09\u65b9\u4f9d\u8d56\uff0cCSV \u6587\u4ef6\u51e0\u4e4e\u662f\u552f\u4e00\u80fd\u6ee1\u8db3\u6240\u6709\u7684\u8981\u6c42\u7684\u6587\u4ef6\u683c\u5f0f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_6","title":"\u4e03\u3001\u65e5\u5fd7\u7cfb\u7edf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_5","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e YouQu \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u64cd\u4f5c\u65b9\u6cd5\u5c01\u88c5\u5199\u6cd5\uff0c\u901a\u5e38\u662f\u8fd9\u6837\u7684\uff1a\u7c7b\u91cc\u9762\u4e00\u4e2a\u51fd\u6570\u53ea\u5305\u542b\u4e00\u4e2a\u64cd\u4f5c\u6216\u591a\u6b21\u8c03\u7528\u7684\u4e00\u7cfb\u5217\u53ef\u5408\u5e76\u7684\u64cd\u4f5c\uff1b \u4f20\u7edf\u7684\u65e5\u5fd7\u8f93\u51fa\u65b9\u5f0f\uff0c\u9700\u8981\u5728\u6bcf\u4e2a\u51fd\u6570\u91cc\u9762\u4e3b\u52a8\u7f16\u5199\u65e5\u5fd7\u8f93\u51fa\u4ee3\u7801 \uff0c\u4f8b\u5982\uff1a class XXXWidget:\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\nlogger.info(\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\")\n...\n# \u7701\u7565\u4ee3\u7801\u90e8\u5206\n \u4e00\u4e2a\u51fd\u6570\u91cc\u9762\u81f3\u5c11\u5305\u542b\u4e00\u6761\u65e5\u5fd7\u4fe1\u606f\uff0c\u5982\u679c\u6bd4\u8f83\u590d\u6742\u64cd\u4f5c\u6b65\u9aa4\uff0c\u53ef\u80fd\u5305\u542b\u591a\u6761\u65e5\u5fd7\u4fe1\u606f\uff1b \u4e00\u4e2a\u5e94\u7528\u542b\u6709\u5927\u91cf\u7684\u64cd\u4f5c\u51fd\u6570\uff0c\u4e5f\u5c31\u662f\u8bf4\u6211\u4eec\u9700\u8981\u5199\u5927\u91cf\u7684\u65e5\u5fd7\u4ee3\u7801\uff1b \u901a\u8fc7\u7ecf\u9a8c\u89c2\u5bdf\uff0c\u6211\u4eec\u53d1\u73b0\uff0c\u51fd\u6570\u8bf4\u660e\u4ee5\u53ca\u51fd\u6570\u64cd\u4f5c\u65e5\u5fd7\uff0c\u5177\u6709\u8f83\u9ad8\u7684\u91cd\u590d\u5ea6\uff08\u4ece\u4e0a\u9762\u7684\u4f8b\u5b50\u4e5f\u53ef\u4ee5\u770b\u51fa\u6765\uff09\uff0c\u56e0\u6b64\u6211\u4eec\u5927\u80c6\u7684\u8bbe\u60f3\uff0c\u80fd\u4e0d\u80fd\u57fa\u4e8e\u6846\u67b6\u6267\u884c\u65f6\uff0c\u81ea\u52a8\u7684\u5c06\u51fd\u6570\u8bf4\u660e\u4f5c\u4e3a\u65e5\u5fd7\u6253\u5370\u51fa\u6765\uff0c\u4ece\u800c\u51cf\u5c11\u5927\u91cf\u65e5\u5fd7\u4ee3\u7801\u91cf\u548c\u91cd\u590d\u7f16\u5199\uff0c\u90a3\u771f\u662f\u5999\u554a~\u3002 \u57fa\u4e8e\u6b64\u201c\u5929\u771f\u201d\u7684\u60f3\u6cd5\uff0c\u6211\u4eec\u8bbe\u8ba1\u51fa\u4e86 youqu \u7684\u65e5\u5fd7\u7cfb\u7edf\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_5","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u6838\u5fc3\u539f\u7406\uff1a \u901a\u8fc7\u7ed9\u7c7b\u52a0\u4e0a\u4e00\u4e2a\u88c5\u9970\u5668 @log\uff0c\u52a8\u6001\u7ed9\u8be5\u7c7b\u4e0b\u6240\u6709\u7684\u51fd\u6570\u53ca\u7236\u7c7b\u51fd\u6570\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668 @_trace\uff0c\u5728\u6b64\u88c5\u9970\u5668\u4e2d\u6211\u4eec\u80fd\u52a8\u6001\u7684\u6355\u83b7\u6240\u8c03\u7528\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff08func.__doc__\uff09\uff0c\u901a\u8fc7\u65e5\u5fd7\u8f93\u51fa\u5668\u5c06\u5176\u8f93\u51fa\u5373\u53ef\u3002 \u5b9e\u73b0\u6b65\u9aa4\uff1a \u901a\u8fc7 inspect.getmembers \u83b7\u53d6\u88ab\u88c5\u9970\u7684\u7c7b\u4e0b\u6240\u6709\u51fd\u6570\uff0c\u5305\u542b\u9759\u6001\u65b9\u6cd5\uff0c\u7c7b\u65b9\u6cd5\uff0c\u5b9e\u4f8b\u65b9\u6cd5\uff1b \u901a\u8fc7 setattr(\u7c7b, \u65b9\u6cd5, _trace\uff09 \u7684\u65b9\u5f0f\uff0c\u7ed9\u7b26\u5408\u6761\u4ef6\u7684\u51fd\u6570\uff0c\u52a8\u6001\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_3","title":"3\u3001\u65e5\u5fd7\u914d\u7f6e","text":"[log_cli]\n;\u65e5\u5fd7\u76f8\u5173\u914d\u7f6e\uff08\u4e0d\u6253\u5370\u6784\u9020\u51fd\u6570\u548c\u9b54\u6cd5\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff09\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = INFO\n# ============= \u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u914d\u7f6e ================\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u5f00\u5934\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7, \u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_STARTSWITH = Assert\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u7ed3\u5c3e\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_ENDSWITH = Widget\n;\u652f\u6301\u7c7b\u540d\u5305\u542b xxx \u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_CONTAIN = ShortCut\n# ==============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_3","title":"4\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u5728\u5e94\u7528\u5e93 widget \u65b9\u6cd5\u5e93\u91cc\u9762\uff0c\u53ea\u9700\u8981\u5728\u51fa\u53e3\u6587\u4ef6\u52a0\u4e0a\u7c7b\u88c5\u9970\u5668\uff0c\u5c31\u53ef\u4ee5\u5b9e\u73b0\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u4e86\uff1b # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6ce8\u610f\uff0c\u662f\u7c7b\u88c5\u9970\u5668\u3002 \u5b9e\u4f8b\uff1a # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\n@classmethod\ndef find_dfm_image(cls, *elements, multiple=False, rate=0.9):\n\"\"\"\n \u67e5\u627e\u56fe\u7247 {{elements}}.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e {{rate}} \u7684\u5750\u6807\n :param elements:\n :param multiple:\n :return:\n \"\"\"\nelement = tuple(map(lambda x: f\"{Config.PIC_RES_PATH}/{x}\", elements))\nreturn cls.find_image(*element, multiple=multiple)\n \u8c03\u7528\u65b9\u6cd5\u65f6\uff1a DfmWidget.find_dfm_image(\"dfm_001\")\n \u81ea\u52a8\u8f93\u51fa\u7684\u65e5\u5fd7\uff1a >> x86_64-uos-6: 02/28 17:48:47 | INFO | logger_utils: [find_dfm_image]: \u67e5\u627e\u56fe\u7247 dfm_001.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e 0.9 \u7684\u5750\u6807\n \u52a0\u4e0a\u88c5\u9970\u5668 @log \u4e4b\u540e\uff0c\u65b9\u6cd5\u5c42\u6240\u6709\u7684\u51fd\u6570\uff08\u5305\u62ec\u5b9e\u4f8b\u65b9\u6cd5\u3001\u7c7b\u65b9\u6cd5\u3001\u9759\u6001\u65b9\u6cd5\uff09\u90fd\u4e0d\u9700\u8981\u518d\u5199\u65e5\u5fd7\u4ee3\u7801\uff0c\u6267\u884c\u7684\u65f6\u5019\u4f1a\u81ea\u52a8\u8f93\u51fa\uff0c\u5e76\u4e14\u6240\u6709\u8c03\u7528\u7684\u65b9\u6cd5\u4f1a\u4ee5 allure.step \u7684\u65b9\u5f0f\uff0c\u5c55\u793a\u5728 allure \u62a5\u544a\u4e2d\uff0c\u5728\u62a5\u544a\u4e2d\u66f4\u80fd\u4e00\u76ee\u4e86\u7136\u7684\u770b\u5230\u7528\u4f8b\u6267\u884c\u6b65\u9aa4\u3002 \u3010\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\u3011 \u901a\u8fc7\u89c2\u5bdf\u524d\u9762\u7684\u4f8b\u5b50\uff0c\u7ec6\u5fc3\u7684\u540c\u5b66\u53ef\u80fd\u8fd8\u53d1\u73b0\u4e86\u4e00\u4e2a\u5c0f\u7ec6\u8282\uff1a\u51fd\u6570\u529f\u80fd\u8bf4\u660e\u4e2d\uff0c\u4e24\u5bf9\u5927\u62ec\u53f7\u4e2d\u7684\u5185\u5bb9 {{elements}} \u4f5c\u4e3a\u53d8\u91cf\u8f93\u51fa\u51fa\u6765\u4e86\uff1b \u6ca1\u9519\uff0c\u8fd9\u5c31\u662f\u6211\u4eec\u53c2\u8003Django \u548c jinja2 \u7684\u6a21\u677f\u8bed\u6cd5\u8bbe\u8ba1\u51fa\u7684\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\uff0c\u4f7f\u7528\u65b9\u6cd5\u5f88\u7b80\u5355\uff0c\u7528\u4e24\u5bf9\u5927\u62ec\u53f7\u628a\u51fd\u6570\u7684\u53c2\u6570\u62ec\u8d77\u6765\uff0c\u8fd9\u6837\u5728\u65e5\u5fd7\u8f93\u51fa\u7684\u65f6\u5019\u5c31\u80fd\u628a\u8c03\u7528\u51fd\u6570\u65f6\u53c2\u6570\u7684\u503c\u8f93\u51fa\u51fa\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_7","title":"\u516b\u3001\u73af\u5883\u90e8\u7f72","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_6","title":"1\u3001\u539f\u5219","text":"YouQu \u7684\u73af\u5883\u4f9d\u8d56\u4e00\u76f4\u575a\u6301 2 \u4e2a\u539f\u5219\uff1a \u6700\u5c0f\u73af\u5883\u4f9d\u8d56\u539f\u5219 \u6709\u4e9b\u540c\u5b66\u5199\u4e00\u4e9b\u529f\u80fd\uff0c\u9996\u5148\u60f3\u5230\u7684\u5c31\u662f\u53bb\u641c\u7d22\u5f15\u64ce\u641c\u4e00\u4e0b\uff0c\u770b\u6709\u6ca1\u6709\u73b0\u6210\u7684\u5de5\u5177\u6216\u8005\u4ee3\u7801\u76f4\u63a5\u80fd\u7528\uff0c\u7f8e\u5176\u540d\u66f0\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\uff0c\u522b\u4eba\u5df2\u7ecf\u9020\u597d\u4e86\u8f6e\u5b50\u54b1\u4eec\u5c31\u4e0d\u8981\u91cd\u590d\u53bb\u9020\u4e86\uff0c\u7136\u540e\u4e00\u5207\u4f3c\u4e4e\u90fd\u53d8\u5f97\u90a3\u4e48\u7684\u7406\u6240\u5e94\u5f53\u3002 \u5f53\u7136\u8fd9\u6837\u505a\u65e0\u53ef\u539a\u975e\uff0c\u6211\u76f8\u4fe1\u6709\u8fd9\u6837\u60f3\u6cd5\u5e76\u4e14\u4e00\u76f4\u8df5\u884c\u8fd9\u6837\u505a\u6cd5\u7684\u540c\u5b66\u4e0d\u5728\u5c11\u6570\uff0c\u4f46\u8fd9\u6837\u505a\u6709\u4e00\u4e2a\u5f88\u4e25\u91cd\u7684\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f60\u5199\u4e00\u4e2a\u5927\u578b\u9879\u76ee\u65f6\uff0c\u4f60\u4f1a\u5f15\u5165\u975e\u5e38\u975e\u5e38\u975e\u5e38\u591a\u7684\u4f9d\u8d56\uff0c\u6bd4\u5982\u8981\u505a\u4e2a\u63a5\u53e3\u8bf7\u6c42\u8981\u7528 requests\u3001\u8bfb\u5199\u4e2a\u6570\u636e\u7528 pandas\u3001\u5199\u4e2a\u8868\u683c\u7528 pyopenxl\u3001\u89e3\u6790\u4e2a\u6587\u672c\u8981\u7528\u8fd9\u4e2a\u90a3\u4e2a\u4e09\u65b9\u5e93 ... \u3002 \u6211\u8ba4\u4e3a\u8fd9\u662f\u975e\u5e38\u4e0d\u597d\u7684\u4e60\u60ef\uff0c\u5728\u5b9e\u73b0\u4e00\u4e2a\u529f\u80fd\u7684\u65f6\u5019\uff0c\u9996\u5148\u6211\u4eec\u5e94\u8be5\u53bb\u60f3\u81ea\u5df1\u600e\u4e48\u6837\u53bb\u5b9e\u73b0\uff0c\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff1b \u5982\u679c\u4f60\u4e0d\u4f1a\uff0c\u4f60\u53ef\u4ee5\u53bb\u5b66\u4e60\u4e09\u65b9\u5e93\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u522b\u4eba\u4e09\u65b9\u5e93\u4e5f\u662f\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\u7684\uff0c\u4e3a\u4ec0\u4e48\u54b1\u4eec\u4e0d\u884c\u5462\uff1b\u5982\u679c\u522b\u4eba\u7684\u4f60\u5b9e\u5728\u662f\u770b\u4e0d\u61c2\uff0c\u60f3\u5c3d\u4e00\u5207\u529e\u6cd5\u786e\u5b9e\u505a\u4e0d\u51fa\u6765\uff0c\u90a3\u518d\u8003\u8651\u5f15\u5165\u8fd9\u4e2a\u4e09\u65b9\u5e93\uff0c\u6211\u8ba4\u4e3a\u8fd9\u6837\u662f\u6ca1\u95ee\u9898\u7684\uff0c\u6bd5\u7adf\u54b1\u4eec\u6bb5\u4f4d\u8fd8\u4e0d\u591f\uff0c\u4f46\u5e0c\u671b\u5c06\u6765\u6709\u4e00\u5929\u6211\u4eec\u53ef\u4ee5\u3002 \u8fd9\u6837\u7684\u505a\u6cd5\u624d\u5e94\u8be5\u662f\u201c\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\u201d\u6b63\u786e\u7684\u64cd\u4f5c\u3002\u4e0d\u4f1a\u6ca1\u5173\u7cfb\uff0c\u770b\u770b\u522b\u4eba\u662f\u600e\u4e48\u5b9e\u73b0\u7684\uff0c\u81ea\u5df1\u518d\u6478\u7d22\u7740\u5199\u51fa\u6765\uff0c\u8fd9\u6837\u81ea\u5df1\u624d\u80fd\u6709\u6240\u63d0\u9ad8\uff0c\u4e0d\u7136\u4f60\u5c31\u53ea\u4f1a\u7528\u522b\u4eba\u7684\u4e1c\u897f\uff1b\u90a3\u4e9b\u5632\u7b11\u3001\u6279\u8bc4\u6211\u4eec\u91cd\u590d\u9020\u8f6e\u5b50\u7684\u4eba\uff0c\u5148\u60f3\u60f3\u81ea\u5df1\u4f1a\u9020\u8f6e\u5b50\u5417\u3002 \u672c\u7740\u81ea\u5df1\u5b9e\u73b0\u80fd\u5b9e\u73b0\u7684\u4e00\u5207\u7684\u539f\u5219\uff0cYouQu \u6846\u67b6\u505a\u5230\u4e86\u975e\u5e38\u5c11\u7684\u73af\u5883\u4f9d\u8d56\uff0c\u800c\u4e14\u6211\u4eec\u4ecd\u5728\u4e0d\u65ad\u52aa\u529b\uff0c\u51cf\u5c11\u73af\u5883\u90e8\u7f72\u7684\u4f9d\u8d56\u3002 \u6700\u5c0f\u4ed3\u5e93\u4f53\u79ef\u539f\u5219 \u5927\u6587\u4ef6\u4e0d\u80fd\u4e0a\u4f20\u5230\u5de5\u7a0b\u91cc\u9762\uff0c\u4fdd\u6301\u6574\u4e2a\u5de5\u7a0b\u7684\u8f7b\u91cf\u5316\uff0c\u8fd9\u6837\u5728\u514b\u9686\u4ee3\u7801\u7684\u65f6\u5019\u624d\u80fd\u975e\u5e38\u5feb\u901f\u65b9\u4fbf\u4f7f\u7528\uff0c\u6211\u4eec\u89c1\u8fc7\u4e00\u4e2a AT \u5de5\u7a0b clone \u5927\u5c0f\u8fbe\u5230\u597d\u51e0\u4e2a G\uff0c\u7b80\u76f4\u4e0d\u53ef\u601d\u8bae\u3002 \u5176\u5b9e\u4ee3\u7801\u6587\u4ef6\u7684\u5927\u5c0f\u662f\u5f88\u5c0f\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u7eaf\u5199\u4ee3\u7801\u968f\u4fbf\u5199\u5de5\u7a0b\u4e5f\u4e0d\u4f1a\u592a\u5927\uff0c\u800c\u6587\u6863\uff08\u5305\u542b\u63d2\u56fe\uff09\u7b49\u8d44\u6e90\u5374\u662f\u5f88\u5360\u7a7a\u95f4\u3002 \u56e0\u6b64\u6211\u4eec\u9009\u62e9\u5c06 YouQu \u7684\u6587\u6863\u5de5\u7a0b\u5355\u72ec\u8fc1\u51fa\u5230\u72ec\u7acb\u7684\u4ed3\u5e93 youqu-docs \u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_6","title":"2\u3001\u5b89\u88c5","text":"\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u8fd0\u884c env.sh \u5373\u53ef\u3002 bash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_4","title":"3\u3001\u5b9a\u5236\u4f9d\u8d56","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_2","title":"3.1\u3001\u65b0\u589e\u4f9d\u8d56","text":"\u5982\u679c\u5e94\u7528\u5e93\u8fd8\u9700\u8981\u5176\u4ed6 Python \u4f9d\u8d56\u5e93\uff0c\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a requirement.txt \u6587\u4ef6\uff1b autotest_xxx\n\u251c\u2500\u2500 requirement.txt\n\u251c\u2500\u2500 case ...\n \u91cc\u9762\u5199\u5165\u9700\u8981\u5b89\u88c5\u7684\u4e09\u65b9\u4f9d\u8d56\uff0c\u6bd4\u5982\u50cf\u8fd9\u6837\uff1a # requirement.txt\nPyYAML==6.0 # \u6307\u5b9a\u5b89\u88c5\u67d0\u4e2a\u7248\u672c\nrequests # \u672a\u6307\u5b9a\u7248\u672c\u5219\u5b89\u88c5\u6700\u65b0\u7248\n \u5728\u6267\u884c bash env.sh \u65f6\u4f1a\u4e00\u5e76\u5c06\u5176\u5b89\u88c5\u3002 \u5982\u679c\u591a\u4e2a\u5e94\u7528\u5e93\u90fd\u5b58\u5728 requirement.txt \u6587\u4ef6\uff0c\u6267\u884c env.sh \u65f6\u4f1a\u5c06\u591a\u4e2a requirement.txt \u6587\u4ef6\u4e00\u5e76\u52a0\u8f7d\uff1b\u90a3\u4e48\u4e00\u5b9a\u8981\u6ce8\u610f\u591a\u4e2a requirement.txt \u6587\u4ef6\u53ef\u80fd\u5b58\u5728\u76f8\u540c\u7684\u4f9d\u8d56\u88ab\u6307\u5b9a\u5b89\u88c5\u4e0d\u540c\u7248\u672c\u7b49\u7b49\u517c\u5bb9\u6027\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32_1","title":"3.2\u3001\u88c1\u526a\u4f9d\u8d56","text":"\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0c\u53ef\u80fd\u4f60\u53ea\u9700\u8981\u5b89\u88c5\u4e00\u4e9b\u6700\u6700\u57fa\u7840\u7684\u4f9d\u8d56\uff0c\u5176\u4ed6\u7684\u90fd\u4e0d\u9700\u8981\uff0c\u6bd4\u5982\u7eaf\u63a5\u53e3\u81ea\u52a8\u5316\u7684\u9879\u76ee\uff0c\u5b83\u4e0d\u9700\u8981 UI \u81ea\u52a8\u5316\u76f8\u5173\u7684\u4f9d\u8d56\u3002 \u4f60\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\uff0c\u5b58\u653e\u4e00\u4e2a BASICENV \u7684\u666e\u901a\u6587\u4ef6\uff0c\u91cc\u9762\u4e0d\u9700\u8981\u5199\u4efb\u4f55\u5185\u5bb9\uff0c\u8fd9\u6837\u6267\u884c env.sh \u65f6\uff0c\u53ea\u4f1a\u5b89\u88c5\u6700\u57fa\u7840\u7684\u4f9d\u8d56\u3002 autotest_xxx\n\u251c\u2500\u2500 BASICENV # \u53ef\u4ee5\u4f7f\u7528\uff1atouch BASICENV \u521b\u5efa\u6587\u4ef6\n\u251c\u2500\u2500 case ...\n \u57fa\u7840\u4f9d\u8d56\u4ec5\u5b89\u88c5\u4ee5\u4e0b\u51e0\u4e2a\u5305\uff1a pytest # pytest\npytest-rerunfailures # \u5931\u8d25\u91cd\u8dd1\u63d2\u4ef6\npytest-timeout # \u7528\u4f8b\u8d85\u65f6\u63d2\u4ef6\nallure-pytest # \u751f\u6210 allure \u62a5\u544a\u63d2\u4ef6\nallure.deb # allure \u62a5\u544a\u67e5\u770b\u5de5\u5177\n \u88c1\u526a\u4f9d\u8d56 \u548c \u65b0\u589e\u4f9d\u8d56 \u662f\u4e0d\u51b2\u7a81\u7684\uff0c\u53ef\u4ee5\u540c\u65f6\u4f7f\u7528\u3002 \u6b64\u65b9\u6848\u9ed8\u8ba4\u4e3a\u865a\u62df\u73af\u5883\u90e8\u7f72\uff0c\u5982\u679c\u4f60\u60f3\u76f4\u63a5\u90e8\u7f72\u5728\u672c\u673a\u4e0a\uff1a bash env_dev.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_8","title":"\u4e5d\u3001\u5931\u8d25\u5f55\u5c4f","text":"\u5f55\u5c4f\u5176\u5b9e\u662f\u4e00\u79cd\u89c6\u9891\u5f62\u5f0f\u7684\u65e5\u5fd7\uff0c\u56e0\u4e3a\u5f88\u591a\u65f6\u5019\u6211\u4eec\u5728\u67e5\u770b\u65e5\u5fd7\u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u51c6\u786e\u7684\u5b9a\u4f4d\u5230\u7528\u4f8b\u5931\u8d25\u7684\u5177\u4f53\u539f\u56e0\uff0c\u56e0\u6b64\u7528\u4f8b\u7684\u5f55\u5c4f\u80fd\u8ba9\u6211\u4eec\u770b\u5230\u7528\u4f8b\u5728\u6267\u884c\u8fc7\u7a0b\uff1b \u3010\u4f7f\u7528\u65b9\u6cd5\u3011 \u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u5173\u6ce8 2 \u4e2a\u53c2\u6570\uff1b ;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\u3002\n;\u6ce8\u610f\uff0c\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u4e0d\u80fd\u5c0f\u4e8e\u5931\u8d25\u5f55\u5c4f\u6b21\u6570\uff0c\u5373 RERUN >= RECORD_FAILED_CASE\nRECORD_FAILED_CASE = 1\n \u9ed8\u8ba4\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u662f 1 \u6b21\uff1b RECORD_FAILED_CASE = 1 \u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff1b RECORD_FAILED_CASE = 0 \u8868\u793a\u4e0d\u7ba1\u7528\u4f8b\u6210\u529f\u6216\u5931\u8d25\u90fd\u5f55\u5c4f\uff1b \u5f55\u5c4f\u662f\u8981\u5360\u7528\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u7279\u522b\u662f\u5728\u4e00\u4e9b\u914d\u7f6e\u8f83\u4f4e\u7684\u673a\u5668\u4e0a\u4f1a\u5f88\u660e\u663e\uff0c\u6240\u4ee5\u4f60\u9700\u8981\u8003\u8651\u662f\u5426\u6709\u5fc5\u8981\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1b \u4f7f\u7528 manage.py \u6267\u884c\u7528\u4f8b\u9ed8\u8ba4\u8bfb\u53d6\u5230 globalconfig.ini \u91cc\u9762\u7684\u53c2\u6570\uff0c\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report/record \u76ee\u5f55\u4e0b\u4fdd\u5b58\u5931\u8d25\u7528\u4f8b\u7684\u5f55\u5c4f\u548c\u65ad\u8a00\u7684\u90a3\u4e2a\u65f6\u95f4\u70b9\u7684\u622a\u5c4f\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7\u89c6\u9891\u6587\u4ef6\u770b\u5230\u5931\u8d25\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u90fd\u53d1\u751f\u4e86\u4ec0\u4e48\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#wayland","title":"\u5341\u3001Wayland \u9002\u914d","text":"Wayland \u4e0b\u81ea\u52a8\u5316\u4e3b\u8981\u95ee\u9898\u662f X11 \u4e0b\u7684\u952e\u9f20\u64cd\u4f5c\u65b9\u6cd5\u65e0\u6cd5\u4f7f\u7528\uff0c\u6bd4\u5982 Xdotool\u3001 PyAutoGUI\u3001Xwininfo \u7b49\u7b49\uff1b YouQu \u5728 Wayland \u4e0b\u517c\u5bb9\u9002\u914d\uff0cenv.sh \u5728 Wayland \u4e0b\u6267\u884c\u65f6\u4f1a\u5b89\u88c5\u81ea\u7814\u7684\u952e\u9f20\u64cd\u4f5c\u670d\u52a1\uff08\u53ef\u80fd\u5b58\u5728\u4e00\u4e9b\u4f9d\u8d56\u62a5\u9519\uff0c\u6309\u7167\u6ce8\u91ca\u89e3\u51b3\u5373\u53ef\uff09\uff0c\u6846\u67b6\u6838\u5fc3\u5e93\u4e5f\u9488\u5bf9\u6027\u7684\u505a\u4e86\u9002\u914d\uff0c\u4e0a\u5c42\u7528\u4f8b\u5b8c\u5168\u4e0d\u7528\u5173\u5fc3\u673a\u5668\u662fWayland \u8fd8\u662f X11\uff0c\u6846\u67b6\u4f1a\u6839\u636e\u6267\u884c\u65f6\u72b6\u6001\u81ea\u52a8\u5224\u65ad\u8d70\u4e0d\u540c\u7684\u903b\u8f91\uff1b \u7b80\u5355\u8bb2\u5c31\u662f\uff0c\u5e94\u7528\u5e93\u53ea\u9700\u8981\u7ef4\u62a4\u4e00\u5957\u7528\u4f8b\u811a\u672c\u5373\u53ef\u3002 \u3010\u7528\u4f8b\u517c\u5bb9\u3011 \u56e0\u4e3a Wayland \u4e0b\u6709\u4e9b\u5e94\u7528\u7684\u754c\u9762\u663e\u793a\u548c\u529f\u80fd\u672c\u8eab\u5b58\u5728\u4e00\u4e9b\u5dee\u5f02\uff0c\u7528\u4f8b\u5c42\u53ef\u80fd\u9700\u8981\u5bf9\u8fd9\u90e8\u5206\u7528\u4f8b\u505a\u903b\u8f91\u5224\u65ad\uff0c\u4f7f\u7528\u5168\u5c40\u914d\u7f6e\u91cc\u9762\u7684\u5e38\u91cf\u8fdb\u884c\u903b\u8f91\u7f16\u5199\u5373\u53ef\uff1a from setting.globalconfig import GlobalConfig\n# GlobalConfig.IS_WAYLAND \u83b7\u53d6\u5230\u5f53\u524d\u7684\u663e\u793a\u670d\u52a1\u5668\uff08bool\uff09\n# \u5e94\u7528\u5e93 Config \u7ee7\u627f GlobalConfig\nif Config.IS_WAYLAND:\npass\nif Config.IS_X11:\npass\n \u6bd4\u5982\u7528\u4f8b\u91cc\u9762\u5982\u679c\u65ad\u8a00\u7684\u56fe\u7247\u4e0d\u540c\uff1a if Config.IS_WAYLAND:\nself.assert_image_exist(\"wayland_XXX\")\nelse:\nself.assert_image_exist(\"x11_XXX\")\n \u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u811a\u672c\u5728 Wayland \u548c X11 \u4e0b\u90fd\u53ef\u4ee5\u8dd1\uff0cso easy \u662f\u4e0d\u662f\uff1f\u5b8c\u5168\u6ca1\u5fc5\u8981\u4e13\u95e8\u62c9\u65b0\u5206\u652f\u8fdb\u884c Wayland \u9002\u914d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_9","title":"\u5341\u4e00\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_7","title":"1. \u76ee\u5f55\u7ed3\u6784","text":"\u6267\u884c\u65f6\u4f1a\u5728\u6839\u76ee\u5f55\u4e0b\u52a8\u6001\u751f\u6210 report \u76ee\u5f55\uff0c\u6240\u6709\u7684\u62a5\u544a\u76f8\u5173\u7684\u6587\u4ef6\u4f1a\u7edf\u4e00\u5b58\u653e\u5728\u91cc\u9762\uff0c\u793a\u4f8b\uff1a /report\n \u251c\u2500\u2500 allure # allure\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json\n \u251c\u2500\u2500 allure_html # \u751f\u6210\u7684html\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 index.html \u251c\u2500\u2500 allure_back # allure\u62a5\u544a\u5907\u4efd\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 20221108114823\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json\n \u251c\u2500\u2500 json # json\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 result_deepin-music_20221109134736_1081333.json\n \u251c\u2500\u2500 logs # \u65e5\u5fd7\u6587\u4ef6\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 2022-11-10_debug.log \u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-10_error.log\n \u251c\u2500\u2500 record # \u5f55\u5c4f\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-09\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 15\u65f614\u520609\u79d2_test_music_303_2_autotest.mp4\n \u2514\u2500\u2500 xml # xml\u62a5\u544a\n\u2514\u2500\u2500 autotest_deepin_music-20221109134736.xml\n \u9ed8\u8ba4\u60c5\u51b5\u4e0b\u540c\u65f6\u751f\u6210 html\u3001xml\u3001json\u4e09\u79cd\u5f62\u5f0f\u7684\u62a5\u544a\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_7","title":"2. \u5b9a\u5236\u62a5\u544a","text":"\u6211\u4eec\u5bf9 allure \u62a5\u544a\u8fdb\u884c\u4e86\u4e00\u7cfb\u5217\u7684\u5b9a\u5236\uff1a \u5b9a\u5236 logo\u3001title\u3001\u62a5\u544a\u9ed8\u8ba4\u8bed\u8a00\u4e3a\u4e2d\u6587\uff1b \u52a0\u5165\u4e86\u7528\u4f8b\u65ad\u8a00\u5931\u8d25\u65f6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u4ee5\u53ca\u6b64\u65f6\u56fe\u50cf\u5bf9\u6bd4\u7684\u6a21\u677f\u56fe\u7247\uff1b \u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\uff0c\u4f60\u53ef\u4ee5\u5728 html \u62a5\u544a\u4e2d\u76f4\u63a5\u770b\u5f55\u5236\u7684\u89c6\u9891\uff1b \u52a0\u5165\u4e86 IP \u5730\u5740\u3001\u7cfb\u7edf\u4fe1\u606f\u3001\u955c\u50cf\u7248\u672c\u7b49\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_5","title":"3. \u67e5\u770b\u62a5\u544a","text":" \u672c\u5730\u6267\u884c \u5728 report/allure \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u4e00\u5806\u6587\u672c\u6587\u4ef6\uff0c\u8fd9\u4e9b\u662f allure \u63d2\u4ef6\u751f\u6210\u7684\u62a5\u544a\u6e90\u6570\u636e\uff0c\u6211\u4eec\u5728 report/allure_html \u76ee\u5f55\u4e0b\u7ed9\u4f60\u751f\u6210\u4e86 html \u6587\u4ef6\uff0c\u4f46\u662f\u4f60\u4e0d\u80fd\u76f4\u63a5\u901a\u8fc7\u6d4f\u89c8\u5668\u6253\u5f00 index.html \u6587\u4ef6\uff0c\u56e0\u4e3a allure \u7684\u62a5\u544a\u90fd\u662f\u57fa\u4e8e\u5728\u7ebf\u7684\u670d\u52a1\uff0c\u4f60\u5e94\u8be5\u8fd9\u6837\u6253\u5f00\uff1a allure open report/allure_html\n \u4f7f\u7528 manage.py \u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u5728\u7ec8\u7aef\u7684\u6700\u540e\u4e00\u884c\uff0c\u6211\u4eec\u4f1a\u7ed9\u4f60\u8f93\u51fa\u6253\u5f00\u62a5\u544a\u7684\u547d\u4ee4\uff0c\u76f4\u63a5\u590d\u5236\u5b83\u5728\u7ec8\u7aef\u6267\u884c\u5c31\u53ef\u4ee5\u67e5\u770b\u4e86\uff0c\u50cf\u8fd9\u6837\uff1a \u7ec8\u7aef\u6267\u884c\u547d\u4ee4: allure open /tmp/youqu/report/allure_html \u67e5\u770b\u62a5\u544a \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 Pycharm \u91cc\u9762\u627e\u5230 index.html \u6587\u4ef6\uff0c\u7136\u540e\u53f3\u952e\u9009\u62e9\u6d4f\u89c8\u5668\u6253\u5f00\uff0c\u6216\u8005\u4f60\u53ef\u4ee5\u7528\u4e00\u4e2a http \u670d\u52a1\u6253\u5f00\u3002 \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 report/allure \u76ee\u5f55\u4e0b\u67e5\u770b\u62a5\u544a\uff1a allure serve report/allure\n \u8fdc\u7a0b\u6267\u884c \u8fdc\u7a0b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\uff0c\u4f1a\u5c06\u6240\u6709\u8fdc\u7a0b\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u62a5\u544a\u90fd\u6536\u96c6\u5230 report/allure \u76ee\u5f55\u4e0b\uff0c\u5206\u522b\u6309\u7167\u673a\u5668\u7684 IP \u7b49\u5efa\u4e86\u4e0d\u540c\u7684\u76ee\u5f55\uff0c\u4f60\u53ef\u4ee5\u5728\u8fd9\u4e9b\u76ee\u5f55\u91cc\u9762\u53bb\u67e5\u770b\u5bf9\u5e94\u7684\u6d4b\u8bd5\u62a5\u544a\uff0c\u67e5\u770b\u65b9\u6cd5\u548c\u524d\u9762\u672c\u5730\u6267\u884c\u67e5\u770b\u7684\u65b9\u6cd5\u4e00\u6837\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_10","title":"\u5341\u4e8c\u3001\u9759\u6001\u4ee3\u7801\u626b\u63cf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_8","title":"1. \u63d0\u524d\u89e3\u51b3\u4ee3\u7801\u95ee\u9898","text":"\u4e3a\u4e86\u5e2e\u52a9\u5f00\u53d1\u8005\u7edf\u4e00\u4ee3\u7801\u98ce\u683c\uff0cPython \u793e\u533a\u63d0\u51fa\u4e86 PEP8 \u4ee3\u7801\u7f16\u7801\u98ce\u683c\uff0cPython \u5b98\u65b9\u540c\u65f6\u63a8\u51fa\u4e86\u4e00\u4e2a\u68c0\u67e5\u4ee3\u7801\u98ce\u683c\u662f\u5426\u7b26\u5408 PEP8 \u7684\u5de5\u5177\uff0c\u540d\u5b57\u4e5f\u53eb PEP8\u3002 \u4f46\u662f\uff0cPycharm \u91cc\u9762\u7684 PEP8 \u63d2\u4ef6\u5b9e\u9645\u4e0a\u5e76\u4e0d\u80fd\u53d1\u73b0\u5f88\u591a\u4ee3\u7801\u95ee\u9898\uff0c\u8fd9\u4e9b\u95ee\u9898\u5e76\u4e0d\u4f1a\u5728\u8fd0\u884c\u65f6\u62a5\u9519\uff0c\u56e0\u4e3a\u4ece Python \u8bed\u8a00\u89d2\u5ea6\u5e76\u4e0d\u5173\u5fc3\u8fd9\u4e9b\u95ee\u9898\uff0c\u5728 Pycharm \u7f16\u8f91\u5668\u91cc\u9762\u4f7f\u7528\u5feb\u6377\u952e ctrl + alt + L\uff0c\u6709\u4e00\u70b9\u70b9\u683c\u5f0f\u5316\u7684\u6548\u679c\uff0c\u80fd\u89e3\u51b3\u4e00\u4e9b\u7a7a\u683c\u3001\u6362\u884c\u7b49\u5c0f\u95ee\u9898\u3002 \u8fd9\u91cc\u63a8\u8350\u4e00\u4e2a Python \u793e\u533a\u6d41\u884c\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff1a Black\uff0c\u53f7\u79f0\u4e0d\u59a5\u534f\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff0c\u5b83\u68c0\u6d4b\u5230\u4e0d\u7b26\u5408\u89c4\u8303\u7684\u4ee3\u7801\u98ce\u683c\u76f4\u63a5\u5c31\u5e2e\u4f60\u5168\u90e8\u683c\u5f0f\u5316\u597d\uff0c\u5c31\u662f\u8fd9\u4e48\u521a\uff01 \u5b89\u88c5\uff1a sudo pip3 install black \n \u4f7f\u7528\u65b9\u6cd5\uff1a black ${CheckPath}\n \u4f7f\u7528\u8fd9\u4e2a\u5de5\u5177\u683c\u5f0f\u5316\u4e4b\u540e\uff0c\u4ee3\u7801\u4f1a\u88ab\u81ea\u52a8\u8c03\u6574\uff0c\u521a\u5f00\u59cb\u4f60\u53ef\u80fd\u4f1a\u89c9\u5f97\u8c03\u6574\u5f97\u5f88\u5938\u5f20\uff0c\u6ca1\u5173\u7cfb\u575a\u6301\u770b\uff0c\u4e60\u60ef\u4e4b\u540e\uff0c\u4f60\u4f1a\u89c9\u5f97\u5f88\u4f18\u96c5\uff0c\u6ca1\u9519\uff0c\u8fd9\u5c31\u662f Pythonic Code \u7684\u6838\u5fc3\uff0c\u8bf7\u4fdd\u6301\u4f18\u96c5\uff5e\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_8","title":"2. \u4ee3\u7801\u626b\u63cf\u5de5\u5177","text":"\u4f7f\u7528\u6839\u76ee\u5f55\u4e0b pylint.sh \u626b\u63cf\u4ee3\u7801\uff0c\u5728 report \u76ee\u5f55\u4e0b\u67e5\u770b\u4ee3\u7801\u626b\u63cf\u62a5\u544a\uff0c\u5982\u679c\u6709\u4ee3\u7801\u95ee\u9898\u8bf7\u63d0\u524d\u89e3\u51b3\u4e4b\u540e\u518d\u63d0\u4ea4\u3002 \u6b64\u811a\u672c\u5df2\u7ecf\u4f7f\u7528 Python \u793e\u533a\u6700\u6d41\u884c\u7684\u4ee3\u7801\u626b\u63cf\u5de5\u5177 Pylint \u8fdb\u884c\u4ee3\u7801\u626b\u63cf\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a bash pylint.sh\n \u8fd0\u884c\u4e4b\u540e\u4f1a\u63d0\u793a\u4f60\u8981\u626b\u63cf\u7684\u76ee\u5f55\uff0c\u6bd4\u5982\u8f93\u5165 apps \uff0c\u5219\u4f1a\u626b\u63cf apps \u4e0b\u7684\u6240\u6709 Python \u4ee3\u7801\u3002 \u5728 setting/pylintrc.cfg \u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u76f8\u5173\u914d\u7f6e\uff0c\u626b\u63cf\u5b8c\u6210\u4e4b\u540e\u5728 report/pylints \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u626b\u63cf\u62a5\u544a\u3002 \u4ee3\u7801\u63d0\u4ea4\u9700\u901a\u8fc7 git review \u63d0\u4ea4\u5230 gerrit \uff0c\u4eba\u5de5 Code Review \u901a\u8fc7\u4e4b\u540e\u5408\u5165\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_11","title":"\u5341\u4e09\u3001\u63d0\u4ea4\u4ee3\u7801","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_9","title":"1. \u5b89\u88c5\u4f9d\u8d56","text":"sudo apt install git-review\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_9","title":"2. \u63d0\u4ea4\u6a21\u677f","text":"\u5728 ~ \u76ee\u5f55\u4e0b\u65b0\u5efa\u6587\u4ef6\uff0c\u5e76\u547d\u540d\u4e3a gitcommit_template \u5c06\u4ee5\u4e0b\u5185\u5bb9\u5199\u5165\u6587\u4ef6\u5f53\u4e2d\uff1a # commit type :fix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style(\u98ce\u683c\u4fee\u6539)\u3001refactor(\u91cd\u6784)\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test(\u6d4b\u8bd5) + \u7b80\u5355\u63cf\u8ff0. \u9ed8\u8ba4fix,\u6839\u636e\u60c5\u51b5\u4fee\u6539\nfix: \n\n# \u8be6\u7ec6\u8bf4\u660e\u4ee3\u7801\u7684\u6539\u52a8\uff0c\u5305\u542b\u4ee3\u7801\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u4ee5\u53ca\u4e3a\u4ec0\u4e48\u8fd9\u4e48\u505a\uff0c\u53ef\u80fd\u4f1a\u5f71\u54cd\u54ea\u4e9b\u529f\u80fd\u3002\u5bf9\u4e8e\u4ee3\u7801\u7684\u5ba1\u6838\u8005\uff0c\u9700\u8981\u4ece\u8fd9\u6bb5\u63cf\u8ff0\u4e2d\u80fd\u5b8c\u5168\u7406\u89e3\u4ee3\u7801\u4e2d\u6240\u6709\u6539\u52a8\u7684\u5185\u5bb9\nDescription: \n\n# \u5199\u4e00\u6bb5\u9762\u5411\u4e8e\u4ea7\u54c1\u7684\u603b\u7ed3\u6027\u5185\u5bb9\uff0c\u7528\u4e8e\u81ea\u52a8\u751f\u6210crp\u4e0a\u7684changlog\uff0c\u9700\u8981\u6ce8\u610f\u7684\u4e8b\uff0c\u8fd9\u6bb5\u63cf\u8ff0\u5fc5\u987b\u4ece\u4ea7\u54c1\u7684\u89d2\u5ea6\u8003\u8651\u3002\nLog: \n\n# \u5173\u8054pms\u4e0a\u7684bug\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94bug\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4fee\u590dbug\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Bug: \n\n# \u4fee\u590d github issue \n#Issue: \n\n# \u5173\u8054pms\u4e0a\u7684\u4efb\u52a1\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94\u4efb\u52a1\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4efb\u52a1\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Task: \n \u547d\u4ee4\u884c\u6267\u884c: git config --global commit.template ~/gitcommit_template\n \u6b64\u547d\u4ee4\u5c06\u6a21\u677f\u52a0\u5165\u5230 git \u7684\u63d0\u4ea4\u6a21\u677f\u4e2d\u3002 \u540e\u7eed\u63d0\u4ea4\u7684\u65f6\u5019\u9700\u8981\u5173\u6ce8\u4e00\u4e0b\u51e0\u70b9\uff1a commit type \u5bf9\u5e94\u4e0d\u540c\u7684\u4fee\u6539\u7c7b\u578b\uff1afix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style \uff08\u98ce\u683c\u4fee\u6539\uff09\u3001refactor \uff08\u91cd\u6784\uff09\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test \uff08\u6d4b\u8bd5\uff09 commit type \u5192\u53f7\u540e\u9762\u52a0\u7a7a\u683c\u3002 Description \u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u9700\u8981\u8fdb\u884c\u8be6\u7ec6\u8bf4\u660e\uff0c\u6bd4\u5982\u5bf9\u529f\u80fd\u8fdb\u884c\u5927\u6539\u7b49\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_6","title":"3. \u63a8\u9001\u4ee3\u7801","text":"\u9996\u5148\u6dfb\u52a0 commit \u4fe1\u606f git add \u540e\u9762\u52a0\u6587\u4ef6\u540d\u79f0\n git add . # \u8868\u793a\u6dfb\u52a0\u6240\u6709\u6587\u4ef6\n \u4f7f\u7528\u8fd9\u6761\u547d\u4ee4\u6ce8\u610f\u6709\u4e9b\u4e34\u65f6\u6587\u4ef6\u4e0d\u8981\u63d0\u4ea4\u5230\u4ed3\u5e93\u4e86\u3002 git commit -a\n \u4e4b\u540e\u5728 fix: \u540e\u9762\uff08\u6ce8\u610f\u5192\u53f7\u540e\u9762\u5fc5\u987b\u52a0\u7a7a\u683c\uff0c\u4e0d\u7136\u76f4\u63a5-1\uff09\u5199\u672c\u5730\u63d0\u4ea4\u7684 commit \u4fe1\u606f\uff0c\u7136\u540e\u5c31\u53ef\u4ee5\u63d0\u4ea4\u4ee3\u7801\u4e86 git review branch(\u5f53\u524d\u5206\u652f) -r origin\n \u6700\u597d\u4e00\u6b21 commit\uff0c\u4e00\u6b21 git review \uff0c\u7ecf\u5e38\u6709\u540c\u5b66\u5728\u672c\u5730\u75af\u72c2 commit \u6700\u540e git review \u62a5\u9519\u4e0d\u77e5\u9053\u548b\u56de\u4e8b\u513f\u3002 \u82e5\u4e0d\u60f3\u6bcf\u6b21\u63d0\u4ea4\u90fd\u52a0\u4e0a -r \u9009\u9879\uff0c\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a git config --global gitreview.remote origin \u63d0\u4ea4\u4ee3\u7801\uff0c\u76f4\u63a5\u4f7f\u7528 git review branch<\u76ee\u6807\u5206\u652f>\uff0c\u4f8b\u5982 git review master"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git","title":"4. Git\u6807\u7b7e","text":"Git \u6807\u7b7e\u5b9e\u9645\u4e0a\u662f commit \u7684\u4e00\u4e2a\u522b\u540d\uff0c\u4e3b\u8981\u7528\u4e8e\u7ba1\u7406\u5386\u53f2\u7248\u672c\u3002 \u60f3\u8c61\u4e00\u4e0b\u9886\u5bfc\u8ba9\u4f60\u628a\u4e4b\u524d\u7684\u67d0\u4e2a\u7248\u672c\u7684\u4ee3\u7801\u62c9\u51fa\u6765\u8dd1\uff0c\u4f60\u662f\u4e0d\u662f\u4e56\u4e56\u7684\u53bb\u628a\u6240\u6709\u63d0\u4ea4\u8bb0\u5f55\u62c9\u51fa\u6765\u627e\uff0c\u7136\u540e\u627e\u5230\u90a3\u4e2a\u54c8\u5e0c\u503c\uff0c\u901a\u8fc7\u54c8\u5e0c\u503c\u6765\u68c0\u51fa\u4ee3\u7801\u3002 \u8fd9\u4e00\u5957\u64cd\u4f5c\u4e0b\u6765\u662f\u4e0d\u662f\u5f88\u9ebb\u70e6\uff0c\u8d39\u65f6\u95f4\u8fd8\u4e0d\u4e00\u5b9a\u80fd\u627e\u5f97\u5230\uff0c\u6ca1\u4eba\u80fd\u8bb0\u4f4f\u6bcf\u4e2a\u63d0\u4ea4\u54c8\u5e0c\u503c\u4ee5\u53ca\u8fd9\u6b21\u63d0\u4ea4\u90fd\u6539\u4e86\u54ea\u4e9b\u4ee3\u7801\u3002 \u56e0\u6b64\u7ed9\u63d0\u4ea4\u6253\u4e2a\u6807\u7b7e\uff0c\u5c31\u662f\u628a\u54c8\u5e0c\u503c\u8f6c\u6362\u6210\u4eba\u7c7b\u80fd\u7406\u89e3\u7684\u8bed\u8a00\uff0c\u6bd4\u5982 v1.0\uff0c\u5c31\u53ef\u4ee5\u76f4\u63a5\u901a\u8fc7\u6807\u7b7e\u627e\u5230\u5bf9\u5e94\u7684\u63d0\u4ea4\u3002 \u65b0\u5efa\u6807\u7b7e git tag -a <tagname>\n \u56de\u8f66\u4e4b\u540e\uff0cGit \u4f1a\u6253\u5f00\u4f60\u7684\u7f16\u8f91\u5668\uff0c\u8ba9\u4f60\u5199\u4e00\u53e5\u6807\u7b7e\u6ce8\u89e3\uff0c\u5c31\u50cf\u4f60\u7ed9\u63d0\u4ea4\u5199\u6ce8\u89e3\u4e00\u6837\u3002 \u67e5\u770b\u6240\u6709\u6807\u7b7e git tag -l\n# git tag \u4e5f\u884c\n \u5220\u9664\u6807\u7b7e git tag -d <tagname>\n \u63a8\u9001\u6807\u7b7e\u81f3\u8fdc\u7a0b git push \u547d\u4ee4\u5e76\u4e0d\u4f1a\u4f20\u9001\u6807\u7b7e\u5230\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\uff0c\u5fc5\u987b\u663e\u5f0f\u5730\u63a8\u9001\u6807\u7b7e\u3002 git push origin <tagname>\n \u63a8\u9001\u6240\u6709\u4e0d\u5728\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\u7684\u6807\u7b7e git push origin --tag\n \u5220\u9664\u8fdc\u7a0b\u6807\u7b7e git push origin :refs/tag/<tagname>\n \u540e\u671f\u6253\u6807\u7b7e \u5148\u7528 git log --pretty=oneline \u67e5\u8be2\u63d0\u4ea4\u8bb0\u5f55\uff0c\u83b7\u53d6\u6821\u9a8c\u7801\u3002 git tag -a <tagname> 9fceb02(\u6821\u9a8c\u7801)\n \u68c0\u51fa\u6807\u7b7e git checkout <tagname>\n \u6b64\u65f6\uff0c\u4ed3\u5e93\u4f1a\u5904\u4e8e\u201c\u5206\u79bb\u5934\u6307\u9488\uff08detached HEAD\uff09\u201d\u7684\u72b6\u6001\u3002 \u5728\u201c\u5206\u79bb\u5934\u6307\u9488\u201d\u72b6\u6001\u4e0b\uff0c\u5982\u679c\u4f60\u505a\u4e86\u67d0\u4e9b\u66f4\u6539\u7136\u540e\u63d0\u4ea4\u5b83\u4eec\uff0c\u6807\u7b7e\u4e0d\u4f1a\u53d1\u751f\u53d8\u5316\uff0c \u4f46\u4f60\u7684\u65b0\u63d0\u4ea4\u5c06\u4e0d\u5c5e\u4e8e\u4efb\u4f55\u5206\u652f\uff0c\u5e76\u4e14\u5c06\u65e0\u6cd5\u8bbf\u95ee\uff0c\u9664\u975e\u901a\u8fc7\u786e\u5207\u7684\u63d0\u4ea4\u54c8\u5e0c\u624d\u80fd\u8bbf\u95ee\u3002 \u56e0\u6b64\uff0c\u5982\u679c\u4f60\u9700\u8981\u8fdb\u884c\u66f4\u6539\uff0c\u6bd4\u5982\u4f60\u8981\u4fee\u590d\u65e7\u7248\u672c\u4e2d\u7684\u9519\u8bef\uff0c\u90a3\u4e48\u901a\u5e38\u9700\u8981\u521b\u5efa\u4e00\u4e2a\u65b0\u5206\u652f\uff1a git checkout -b <NewBranchName> <tagname>\n \u65b0\u5206\u652f\u4e0a\u53ef\u4ee5\u8fdb\u884c\u63d0\u4ea4\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_12","title":"\u5341\u56db\u3001\u5e38\u89c1\u95ee\u9898","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_10","title":"1. \u63d0\u4ea4\u4ee3\u7801\u65f6\u63d0\u793a\u90ae\u7bb1\u6216\u8005\u540d\u79f0\u4e0d\u5bf9","text":"\u91cd\u65b0\u914d\u7f6e\u90ae\u7bb1\u6216\u8005\u540d\u79f0\uff0c\u7136\u540e\u91cd\u7f6e\u751f\u6548\uff1a git commit --amend --reset-author\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_10","title":"2. \u600e\u4e48\u56de\u6eda\u5230\u4e4b\u524d\u7684\u7248\u672c","text":"(1)\u67e5\u8be2\u5386\u53f2\u63d0\u4ea4\u8bb0\u5f55 git log\n \u627e\u5230\u4f60\u8981\u56de\u6eda\u7684\u7248\u672c\uff0c\u590d\u5236 hash \u503c\u3002 \u6ce8\u610f\uff1a\u662f commit \u7a7a\u683c\u4e4b\u540e\u7684 hash \u503c\uff0c\u4e4b\u524d\u6709\u540c\u5b66\u590d\u5236\u7684 Change-Id: \u8fd9\u6837\u80af\u5b9a\u62a5\u9519\u3002 (2)\u56de\u6eda\u7248\u672c\uff0c\u4e0d\u6e05\u9664\u4ee3\u7801 git reset --soft ${hash}\n (3)\u56de\u6eda\u7248\u672c\uff0c\u6e05\u9664\u4ee3\u7801\uff0c\u614e\u7528\u54c8 git reset --hard ${hash}\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-f-s-e","title":"3. \u6d4b\u8bd5\u62a5\u544a\u91cc\u9762 F S . E \u662f\u4ec0\u4e48\u610f\u601d","text":"F \u8868\u793a\u5931\u8d25\uff0c. \uff08\u70b9\uff09\u8868\u793a\u901a\u8fc7\uff0cS \u8868\u793a\u8df3\u8fc7\uff0cE \u8868\u793a error \u6709\u62a5\u9519"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git-status","title":"4. \u89e3\u51b3 git status \u4e2d\u6587\u663e\u793a\u7684\u95ee\u9898","text":"git config --global core.quotePath false\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5-apps","title":"5. apps \u76ee\u5f55\u4e0b\u989c\u8272\u6709\u4e9b\u662f\u9ec4\u8272\u7684","text":"\u5728 Pycharm \u4e2d apps \u76ee\u5f55\u4e0b\u5e94\u7528\u5e93\u6587\u4ef6\u662f\u9ec4\u8272\u7684\uff0c\u7f16\u8f91\u5668\u8bc6\u522b\u4e0d\u5230\u4ee3\u7801\u65b0\u589e\u548c\u4fee\u6539\uff1b \u7531\u4e8e\u793e\u533a\u7248 Pycharm \u4e0d\u80fd\u52a8\u6001\u8bc6\u522b\u591a\u4ed3\u5e93\uff0c\u9700\u8981\u5728 setting \u91cc\u9762\u624b\u52a8\u6ce8\u518c\uff0c\u64cd\u4f5c\u6b65\u9aa4\uff1a File \u2014> Settings \u2014> Version Control \u2014> \u70b9 + \u53f7 \u2014> Directory \u9009\u4e2d\u5e94\u7528\u5e93\u5de5\u7a0b\u76ee\u5f55 \u2014> VCS \u9009\u4e2d Git \u2014> Apply \u5982\u6b64\u5c31\u53ef\u4ee5\u4e86\u3002 \u4e13\u4e1a\u7248 Pycharm \u4e0d\u5b58\u5728\u8fd9\u4e2a\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#6-envsh-r","title":"6. \u6267\u884c env.sh \u62a5\u9519 $'\\r':\u672a\u627e\u5230\u547d\u4ee4","text":"\u51fa\u73b0\u8fd9\u4e2a\u95ee\u9898\u4f60\u5e94\u8be5\u662f\u5728 windows \u4e0a\u6253\u5f00\u6216\u7f16\u8f91\u8fc7 env.sh \u811a\u672c\uff0cwindows\u4e0b\u7684\u6362\u884c\u662f\u56de\u8f66\u7b26+\u6362\u884c\u7b26\uff0c\u4e5f\u5c31\u662f\\r\\n\uff0c\u800c Linxu \u4e0b\u662f\u6362\u884c\u7b26 \\n\uff0cLinux \u4e0b\u4e0d\u8bc6\u522b \\r\uff0c\u56e0\u6b64\u62a5\u9519\u3002 \u89e3\u51b3\u65b9\u6848\uff1a # \u5c06 \\r \u66ff\u6362\u4e3a\u7a7a\nsudo sed -i 's/\\r//' env.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#7","title":"7.\u600e\u6837\u4e3a\u5355\u72ec\u67d0\u4e00\u6761\u7528\u4f8b\u914d\u7f6e\u6267\u884c\u8d85\u65f6\u65f6\u95f4","text":"\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u5982\u4e0b\uff1a @pytest.mark.timeout(300) # \u5355\u4f4d\u79d2\ndef test_xxx_001():\npass\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#8-youqu","title":"8. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u6240\u6709\u4ee3\u7801\uff0c\u5305\u542b\u5b50\u4ed3\u5e93","text":"\u524d\u7f6e\u6761\u4ef6\uff1a\u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 # \u7b2c\u4e00\u6b21\u5b58\u50a8\u5bc6\u7801\uff0c\u63d0\u4f9b\u540e\u9762\u62c9\u4ee3\u7801(gerrit: ldap\u8d26\u53f7\u548c\u5bc6\u7801\uff0cgit\u62c9\u53d6\u7b2c\u4e00\u6b21\u8f93\u5165\u4fdd\u5b58\uff0c\u540e\u9762\u76f4\u63a5\u4f7f\u7528)\ngit config --global credential.helper store\n\n# \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\uff0c\u5e76\u9012\u5f52\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\" --recursive\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#9-youqu","title":"9. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\u6307\u5b9a\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u524d\u7f6e\u6761\u4ef6\uff1a \u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 \u5df2\u5b58\u50a8\u8bbf\u95ee\u5bc6\u7801 # \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\"\n# \u6307\u5b9a\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ncd youqu\ngit submodule update --init apps/autotest_xxx_xxx\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#10-youqu","title":"10. \u5982\u4f55\u66f4\u65b0 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\uff0c\u6240\u6709\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u66f4\u65b0\u6240\u6709\u5b50\u4ed3\u5e93\u4ee3\u7801 cd youqu\ngit pull & git submodule foreach git pull\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#11-youqu-master-detached-head","title":"11. \u5982\u4f55\u4fee\u590d YouQu \u6240\u6709\u5b50\u4ed3\u5e93 master \u5206\u652f\u6e38\u79bb\u5934\uff08detached head\uff09","text":"\u4fee\u590d\u6240\u6709\u5b50\u4ed3\u5e93\u9ed8\u8ba4master \u5206\u652f\u6e38\u79bb\u5934 cd youqu\ngit submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/","title":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212 \u5206\u7c7b\uff1a/ \u67b6\u6784\u5e08\uff1a/ \u76ee\u6807\uff1a \u5e94\u7528 AT \u67b6\u6784\u5de5\u7a0b\u5316\uff0c\u53c2\u8003\u6027\u80fd\u81ea\u52a8\u5316\u5de5\u7a0b\u5b8c\u6210\u5de5\u7a0b\u5316\u6539\u9020\u3002 \u5e94\u7528\u95f4\u7528\u4f8b\u89e3\u8026\uff0c\u89e3\u9664\u6240\u6709\u4ea4\u53c9\u8c03\u7528\u7684\u65b9\u6cd5\uff0c\u5404\u5e94\u7528\u80fd\u8ddf\u968f\u81ea\u8eab\u8fed\u4ee3\u5468\u671f\u72ec\u7acb\u7ef4\u62a4 AT \u7528\u4f8b\u3002 \u5b8c\u6210\u516c\u5171\u65b9\u6cd5\u7684\u62bd\u53d6\u6574\u5408\uff0c\u5f62\u6210\u4e00\u5957\u72ec\u7acb\u4e8e\u5e94\u7528\u95f4\u7684\u516c\u5171\u65b9\u6cd5\u5e93\uff0c\u5404\u5e94\u7528\u65b9\u6cd5\u91cc\u9762\u4e0d\u5b58\u5728\u88ab\u591a\u4e2a\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\u3002 \u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u4e3a\u5c06\u6765\u9002\u914d\u66f4\u591a\u7684 AT \u8fd0\u7528\u573a\u666f\u63d0\u4f9b\u652f\u6491\uff0c\u539f\u5219\u4e0a\u53ef\u5b9e\u73b0\u65e0\u9650\u6269\u5c55\uff0c\u5728\u6bcf\u65e5\u6784\u5efa\u548c\u6301\u7eed\u96c6\u6210\u6d41\u7a0b\u843d\u5730\u4f7f\u7528\u3002 \u4ee3\u7801\u89c4\u8303\u95ee\u9898\u6e05\u96f6\uff0c\u7b26\u5408 Shell Check\u3001Pylint\u3001\u7cfb\u7edf\u90e8\u76f8\u5173\u7f16\u7801\u89c4\u8303\u8981\u6c42\u3002 \u610f\u4e49\uff1a \u7edf\u4e00\u6210\u7814 AT \u67b6\u6784\u8bbe\u8ba1\u601d\u8def\uff0c\u6d88\u9664 AT \u4ee3\u7801\u5b9e\u73b0\u548c\u7ef4\u62a4\u4e0a\u53ef\u80fd\u51fa\u73b0\u7684\u5206\u6b67\uff0c\u6539\u5584\u5386\u53f2 AT \u65e0\u5de5\u7a0b\u5316\u8bbe\u8ba1\u7684\u7f3a\u9677\uff0c\u63d0\u9ad8\u67b6\u6784\u4e13\u4e1a\u6027\u3002 \u5404\u5e94\u7528 AT \u4ee3\u7801\u76f8\u4e92\u72ec\u7acb\uff0c\u5951\u5408\u5e94\u7528\u72ec\u7acb\u53d1\u5e03\u7279\u6027\uff0c\u53ef\u652f\u6301\u8fed\u4ee3\u671f\u95f4\u72ec\u7acb\u65b0\u589e\u3001\u7ef4\u62a4\u548c\u6267\u884c\u3002 \u65b9\u6cd5\u8c03\u7528\u903b\u8f91\u5f97\u5230\u7b80\u5316\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u66f4\u9ad8\u6548\uff1b\u516c\u5171\u5e93\u62bd\u53d6\uff0c\u51cf\u5c11\u65b9\u6cd5\u91cd\u590d\u7f16\u5199\uff0c\u63d0\u9ad8\u4ee3\u7801\u5229\u7528\u7387\uff1b\u5e73\u5747\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u4ece40\u5206\u949f\u964d\u4f4e\u81f330\u5206\u949f\uff0c\u65e5\u4ea7\u51fa\u7528\u4f8b\u4ece12\u6761/\u5929\u63d0\u5347\u81f316\u6761/\u5929\u3002 \u53ef\u7075\u6d3b\u652f\u6491\u4e0d\u540c\u7684\u81ea\u52a8\u5316\u8fd0\u7528\u573a\u666f\uff0c\u5982 CI\u3001\u5192\u70df\u6d4b\u8bd5\u3001\u96c6\u6210\u6d4b\u8bd5\u3001\u56de\u5f52\u6d4b\u8bd5\u3001\u4e13\u9879\u6d4b\u8bd5\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_2","title":"\u4e00\u3001\u80cc\u666f\u4ecb\u7ecd","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1","title":"1\u3001\u73b0\u6709\u67b6\u6784\u4ecb\u7ecd","text":"\u73b0\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u6574\u4f53\u5206\u4e3a\u4e09\u5c42\uff1a\u7528\u4f8b\u5c42\uff08\u4e1a\u52a1\u903b\u8f91\u5c42\uff09\u3001\u4e2d\u95f4\u5c42\uff08\u5143\u7d20\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff09\u3001\u6838\u5fc3\u5c42\uff08\u5e95\u5c42\u529f\u80fd\u5e93\u5c42\uff09\u3002 \u7528\u4f8b\u5c42\uff1a\u5373\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4e13\u6ce8\u4e8e\u4e1a\u52a1\u529f\u80fd\u903b\u8f91\uff0c\u4e0d\u5173\u5fc3\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\uff1b \u4e2d\u95f4\u5c42\uff1a\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff0c\u6bcf\u4e2a\u65b9\u6cd5\u5747\u5bf9\u5e94\u4e00\u4e2a\u5143\u7d20\u7684\u4e00\u4e2a\u5177\u4f53\u64cd\u4f5c\uff0c\u4e5f\u53ef\u4ee5\u662f\u591a\u4e2a\u64cd\u4f5c\u7684\u7ec4\u5408\u64cd\u4f5c\uff0c\u4e2d\u95f4\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u7528\u4f8b\u5c42\uff0c\u5177\u6709\u53ef\u6269\u5c55\u6027\u548c\u590d\u7528\u6027\uff1b \u6838\u5fc3\u5c42\uff1a\u4e3b\u8981\u5c01\u88c5\u7684\u5e95\u5c42\u529f\u80fd\u5b9e\u73b0\uff0c\u6b64\u5c42\u5728\u6846\u67b6\u4e2d\u63d0\u4f9b\u4e00\u4e9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u529f\u80fd\u6a21\u5757\u76f8\u5bf9\u72ec\u7acb\uff0c\u6838\u5fc3\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u64cd\u4f5c\u5c42\uff0c\u6bd4\u5982\uff1a\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7 UI \u5750\u6807\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u952e\u9f20\u64cd\u4f5c\u7684\u57fa\u7840\u65b9\u64cd\u4f5c\u6a21\u5757\u3001Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757\u3001\u6587\u4ef6\u7684\u589e\u5220\u6539\u67e5\u64cd\u4f5c\u6a21\u5757\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2","title":"2\u3001\u81ea\u52a8\u5316\u7684\u5e94\u7528","text":"2.1\u3001CI \u6d41\u7a0b \u6bcf\u65e5\u6784\u5efa\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u7814\u53d1\u6bcf\u65e5\u63d0\u4ea4\u7684\u4ee3\u7801\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u73ed\u4e4b\u540e\u4f1a\u5c06\u5404\u5e94\u7528\u8fdb\u884c\u6253\u5305\uff0c\u7136\u540e\u5728\u6d4b\u8bd5\u673a\u4e0a\u5b89\u88c5\u66f4\u65b0 deb \u5305\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u5e94\u7528\u63d0\u4ea4\u96c6\u6210\u7684\u7248\u672c\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u8f7d\u6700\u65b0\u7684 ISO \u8fdb\u884c PXE \u90e8\u7f72\uff0c\u7136\u540e\u6d4b\u8bd5\u673a\u5b89\u88c5\u6700\u65b0\u7684\u955c\u50cf\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 2.2\u3001\u9a8c\u6536\u6d4b\u8bd5 \u5728\u5404\u9a8c\u6536\u8282\u70b9\u8fdb\u884c\u81ea\u52a8\u5316\u9a8c\u6536\uff0c\u76ee\u524d\u7684\u7b56\u7565\u662f\u5168\u7528\u4f8b\u8986\u76d6\u5168\u67b6\u6784\u3002 2.3\u3001\u56de\u5f52\u6d4b\u8bd5 \u56de\u5f52\u6d4b\u8bd5\u4eca\u5e74\u89c4\u5212\u5efa\u8bbe\u4e2d\uff0c\u65e8\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u6267\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\uff0c\u51cf\u5c11\u529f\u80fd\u6d4b\u8bd5\u7684\u91cd\u590d\u52b3\u52a8\u529b\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3","title":"3\u3001\u5b58\u5728\u7684\u95ee\u9898","text":" \u5404\u5e94\u7528\u4e4b\u95f4\u5b58\u5728\u8026\u5408 \u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u521d\u671f\uff0c\u6240\u6709\u5e94\u7528\u662f\u6574\u4f53\u53d1\u5e03\uff0c\u6211\u4eec\u662f\u5c06\u6240\u6709\u5e94\u7528\u770b\u6210\u662f\u4e00\u4e2a\u6574\u4f53\uff0c\u5404\u5e94\u7528\u4f5c\u4e3a\u5176\u4e2d\u7684\u4e00\u4e2a\u6a21\u5757\uff0c\u6240\u4ee5\u5b58\u5728\u5e94\u7528\u95f4\u65b9\u6cd5\u4ea4\u53c9\u8c03\u7528\u7684\u95ee\u9898\uff0c\u8fd9\u6837\u4ece\u6700\u521d\u7684\u8bbe\u8ba1\u6765\u8bb2\u786e\u5b9e\u80fd\u591f\u51cf\u5c11\u91cd\u590d\u4ee3\u7801\u7684\u7f16\u5199\u3002\u4f46\u662f\u73b0\u5728\u5e94\u7528\u8d70\u72ec\u7acb\u53d1\u5e03\uff0c\u5404\u5e94\u7528\u90fd\u6709\u81ea\u5df1\u7684\u8fed\u4ee3\u8282\u594f\uff0c\u5728\u65b0\u9700\u6c42\u5feb\u901f\u53d8\u5316\u7684\u8fc7\u7a0b\u4e2d\uff0c\u81ea\u52a8\u5316\u7ef4\u62a4\u53d8\u5f97\u5f02\u5e38\u56f0\u96be\uff0c\u539f\u56e0\u5c31\u662f\u81ea\u52a8\u5316\u9879\u76ee\u91cc\u9762\u5404\u4e2a\u5e94\u7528\u7684\u6709\u6bd4\u8f83\u591a\u7684\u8026\u5408\u5173\u7cfb\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u8fdb\u884c\u89e3\u8026\uff0c\u4ee5\u9002\u5e94\u5e94\u7528\u4e0d\u540c\u7684\u8fed\u4ee3\u5468\u671f\u3002 \u65e0\u6cd5\u7cbe\u51c6\u7684\u5212\u5206\u7528\u4f8b\u8303\u56f4 \u7528\u4f8b\u6267\u884c\u7684\u8303\u56f4\u4e0d\u591f\u7cbe\u51c6\uff0c\u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u4e3b\u8981\u901a\u8fc7\u7528\u4f8b\u7684\u5173\u952e\u8bcd core\uff08\u6838\u5fc3\uff09\u6765\u533a\u5206\u7528\u4f8b\u662f\u5426\u4e3a\u6838\u5fc3\u7528\u4f8b\uff0c\u4f46\u662f\u8fd9\u6837\u7684\u533a\u5206\u592a\u5bbd\u6cdb\u4e86\uff0c\u4e0d\u80fd\u9002\u5e94\u81ea\u52a8\u5316\u6d4b\u8bd5\u5728\u591a\u573a\u666f\u4e0b\u7684\u5e94\u7528\u3002\u5f88\u591a\u573a\u666f\u4e0b\u6211\u4eec\u8fd8\u9700\u8981\u6839\u636e\u7528\u4f8b\u7684\u7b49\u7ea7\u3001\u7528\u4f8b\u7684\u7c7b\u578b\u3001\u7528\u4f8b\u6765\u6e90\u7b49\u7b49\uff0c\u4e0d\u540c\u7684\u7ef4\u5ea6\u6765\u6311\u9009\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u5173\u952e\u5b57\u9700\u8981\u4eba\u5de5\u4e00\u6761\u6761\u7684\u6539\uff0c\u8d39\u65f6\u8d39\u529b\uff0c\u800c\u4e14\u4e0d\u597d\u7ef4\u62a4\u3002 \u53d7\u65b0\u9700\u6c42\u5f71\u54cd\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u597d\u7ef4\u62a4 \u76ee\u524d\u9700\u8981\u8df3\u8fc7\u7684\u7528\u4f8b\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684\u7528\u4f8b\u811a\u672c\u91cc\u9762\uff0c\u6dfb\u52a0\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\uff0c\u540e\u7eed\u89e3\u9664\u8df3\u8fc7\u7684\u65f6\u5019\u53c8\u9700\u8981\u627e\u5230\u8fd9\u6761\u811a\u672c\uff0c\u5220\u6389\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\u3002\u5728\u8df3\u8fc7\u7528\u4f8b\u8f83\u591a\u7684\u60c5\u51b5\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u96be\u5ea6\u3002 \u7f16\u5199\u7528\u4f8b\u65f6\u903b\u8f91\u6bd4\u8f83\u590d\u6742\uff0c\u9700\u8981\u8c03\u7528\u591a\u4e2a\u5e94\u7528\u7684\u65b9\u6cd5\u6a21\u5757\u3002 \u6846\u67b6\u6269\u5c55\u6027\u4e0d\u8db3\uff0c\u65e0\u6cd5\u6574\u5408\u6027\u80fd\u81ea\u52a8\u5316\u3001\u538b\u6d4b\u81ea\u52a8\u5316\u3001\u5b89\u5168\u81ea\u52a8\u5316\u7b49\u4e13\u9879\u6d4b\u8bd5\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_3","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u4e3a\u89e3\u51b3\u73b0\u6709\u95ee\u9898\uff0c\u9002\u5e94\u4e0d\u65ad\u4e30\u5bcc\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u66f4\u597d\u7684\u53d1\u6325\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4f5c\u7528\uff0c\u9700\u8981\u5bf9\u81ea\u52a8\u5316\u67b6\u6784\u53ca\u5404\u529f\u80fd\u6a21\u5757\u8fdb\u884c\u91cd\u65b0\u8bbe\u8ba1\u89c4\u5212\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_1","title":"1\u3001\u67b6\u6784\u8bbe\u8ba1","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_1","title":"2\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u6846\u67b6\u7684\u8fd0\u884c\u903b\u8f91\uff1a\u901a\u8fc7\u6838\u5fc3\u5c42\u63d0\u4f9b\u4e00\u4e2a\u57fa\u7840\u80fd\u529b\uff0c\u4e1a\u52a1\u5c42\u6839\u636e\u5b9e\u9645\u4e1a\u52a1\u9700\u6c42\uff08\u6d4b\u8bd5\u7528\u4f8b\uff09\u52a8\u6001\u52a0\u8f7d\u6838\u5fc3\u5c42\uff0c\u6267\u884c\u5165\u53e3\u52a0\u8f7d\u76f8\u5e94\u7684\u7528\u4f8b\u96c6\u5e76\u63a7\u5236\u6267\u884c\uff0c\u5e94\u7528\u5c42\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u9700\u6c42\uff0c\u901a\u8fc7\u76f8\u5e94\u7684\u914d\u7f6e\u9879\u8fdb\u884c\u914d\u7f6e\uff0c\u4ece\u800c\u89e6\u53d1\u81ea\u52a8\u5316\u6d4b\u8bd5\u4efb\u52a1\u3002 \u6838\u5fc3\u5c42\uff1a\u57fa\u672c\u4fdd\u6301\u4e0d\u53d8\uff0c\u90e8\u5206\u6a21\u5757\u4f1a\u6d89\u53ca\u5230\u65b0\u529f\u80fd\u5f00\u53d1\uff0c\u6838\u5fc3\u5c42\u5404\u529f\u80fd\u6a21\u5757\u4fdd\u6301\u72ec\u7acb\u6027\uff0c\u63d0\u4f9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u4f9b\u4e0a\u5c42\u8c03\u7528\uff1b \u5e95\u5c42\u6838\u5fc3\u6a21\u5757\u5305\u62ec\uff1a \u56fe\u50cf\u8bc6\u522b\u6a21\u5757 UI \u5b9a\u4f4d\u6a21\u5757 Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757 \u5c5e\u6027\u5b9a\u4f4d\u6a21\u5757 \u65e5\u5fd7\u6a21\u5757 \u952e\u9f20\u64cd\u4f5c\u6a21\u5757 \u6587\u4ef6\u64cd\u4f5c\u6a21\u5757 \u5f55\u5c4f\u6a21\u5757 \u81ea\u5b9a\u4e49\u65ad\u8a00\u6a21\u5757 \u7528\u4f8b\u6267\u884c\u6a21\u5757 PXE \u88c5\u673a\u6a21\u5757 \u952e\u9f20\u4fe1\u53f7\u6a21\u62df\u6a21\u5757 OCR \u6a21\u5757 \u4e1a\u52a1\u5c42\uff1a\u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e94\u7528\u5185\u5305\u542b\u591a\u4e2a\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5982\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7b49\uff0c\u540e\u7eed\u53ef\u4ee5\u6839\u636e\u9700\u8981\u5ac1\u63a5\u8fdb\u6765\u3002\u5176\u4e2d\u529f\u80fd\u6d4b\u8bd5\u8bbe\u8ba1\u601d\u8def\uff1a \u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e76\u5c06\u6d4b\u8bd5\u6570\u636e\u548c\u6d4b\u8bd5\u8d44\u6e90\u6574\u5408\u8fdb\u6765\uff0c\u589e\u52a0\u7528\u4f8b\u6807\u7b7e csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ed9\u6bcf\u6761\u7528\u4f8b\u6253\u6807\u7b7e\u3002 \u5404\u6807\u7b7e\u6240\u4f7f\u7528\u5bf9\u5e94\u7684\u5b57\u6bb5\u540d\u79f0\uff0c\u4f7f\u7528 csv \u6587\u4ef6\u7ef4\u62a4\u7528\u4f8b\u4e0e\u6807\u7b7e\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u5bf9\u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u53ef\u4ee5\u7ec4\u5408\u5176\u4e2d\u7684\u6807\u7b7e\u800c\u4ece\u9a71\u52a8\u5bf9\u5e94\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\uff0c\u517c\u5bb9\u73b0\u6709\u7528\u4f8b\u6807\u7b7e\uff0c\u4e14\u652f\u6301\u7528\u4f8b\u6807\u7b7e\u53ef\u6269\u5c55\uff1b \u4f7f\u7528 csv \u683c\u5f0f\u6587\u4ef6\u53ef\u4ee5\u65b9\u4fbf\u7684\u4f7f\u7528 Excel \u8868\u683c\u6253\u5f00\u8fdb\u884c\u7f16\u8f91\uff0c\u540c\u65f6\u7531\u4e8e csv \u6587\u4ef6\u5b9e\u9645\u662f\u4ee5\u90fd\u597d\u5206\u9694\u7684\u6587\u672c\u6587\u4ef6\uff0c\u4ee3\u7801\u4e2d\u53ef\u4ee5\u5728\u4e0d\u4f9d\u8d56\u4e09\u65b9\u5e93\u7684\u60c5\u51b5\u4e0b\u65b9\u4fbf\u5feb\u901f\u7684\u89e3\u6790\u5b83\uff0c\u53ef\u64cd\u4f5c\u6027\u548c\u53ef\u7ef4\u62a4\u6027\u8f83\u9ad8\u3002 \u5404\u4e2a\u5e94\u7528\u4e4b\u95f4\uff0c\u7528\u4f8b\u3001\u65b9\u6cd5\u3001\u6807\u7b7e\u548c\u8d44\u6e90\u90fd\u662f\u76f8\u4e92\u72ec\u7acb\u7684\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u7528\u4f8b\u65f6\u53ea\u9700\u8981\u81ea\u5df1\u5e94\u7528\u4e0b\u7684\u65b9\u6cd5\u548c\u516c\u5171\u5e93\u5373\u53ef\u3002 \u7ed3\u6784\u4e3e\u4f8b\uff1a .\n\u251c\u2500\u2500 apps\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_album # \u5e94\u7528\u540d (\u7528\u4e0b\u5212\u7ebf\u8fde\u63a5\u662f Python \u7f16\u7801\u89c4\u8303)\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_assert # \u65ad\u8a00\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_function_tag.csv # \u7528\u4f8b\u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 asan_cases # \u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases # \u529f\u80fd\u6d4b\u8bd5\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 res # \u6d4b\u8bd5\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config # \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_widget # \u5e94\u7528\u81ea\u5df1\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_widget # \u65b9\u6cd5\u57fa\u7c7b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 other_widget # \u8c03\u7528\u5176\u4ed6\u5e94\u7528\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_camera\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases\n\u2502\u00a0\u00a0 \u2502\u00a0 ...\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 public_widget # \u516c\u5171\u65b9\u6cd5\u5e93\n\u251c\u2500\u2500 config # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n...\n config \u914d\u7f6e\u6a21\u5757\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u76f8\u5e94\u914d\u7f6e\uff0c\u6d4b\u8bd5\u540c\u5b66\u53ef\u4ee5\u6839\u636e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5728 config \u91cc\u9762\u8fdb\u884c\u914d\u7f6e\u3002 \u5168\u5c40\u914d\u7f6e\uff1a \u6267\u884c\u4e00\u4e2a\u6216\u591a\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff1a\u5728 pattern \u91cc\u9762\u5199\u5165\u5e94\u7528\u5305\u540d\uff0c\u591a\u4e2a\u5e94\u7528\u4e4b\u95f4\u7528 or \u8fde\u63a5\uff0c\u5982 deepin-music or deepin-movie\uff1b \u5192\u70df\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a smoke\uff1b \u96c6\u6210\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a core \uff1b \u5168\u91cf\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u4e3a\u7a7a\u5373\u53ef\uff1b \u901a\u8fc7 tags \u7684\u914d\u7f6e\u6bd4\u8f83\u7075\u6d3b\uff0c\u540e\u9762\u6807\u7b7e\u5316\u7ba1\u7406\u7ae0\u8282\u4f1a\u8bb2\u5230\uff0c\u652f\u6301\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u7075\u6d3b\u914d\u7f6e\u3002 \u6307\u5b9a\u67d0\u53f0\u673a\u5668\u5728\u6307\u5b9a\u955c\u50cf\u7248\u672c\u4e0a\u6267\u884c\u7528\u4f8b\uff1a\u5728 IP \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a IP\uff0c\u5e76\u5728 URL \u91cc\u9762\u586b\u5165\u955c\u50cf\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u6846\u67b6\u4f1a\u8c03\u7528 PXE \u8fdb\u884c\u81ea\u52a8\u88c5\u673a\uff0c\u88c5\u673a\u5b8c\u4e4b\u540e\u81ea\u52a8\u5f00\u59cb\u6267\u884c\u914d\u7f6e\u7684\u6d4b\u8bd5\u7528\u4f8b\u3002 \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\uff1a \u6bcf\u4e2a\u5e94\u7528\u5185\u90e8\u4f1a\u6709\u4e00\u4e2a\u5355\u72ec\u7684\u914d\u7f6e\u6a21\u5757\uff0c\u4f1a\u5305\u542b\u4e00\u4e9b\u672c\u5e94\u7528\u7684\u6d4b\u8bd5\u8d44\u6e90\u7684\u8def\u5f84\u3001\u6267\u884c\u7528\u4f8b\u7684\u6807\u7b7e\u914d\u7f6e\u7b49\u7b49\uff0c\u5982\u679c\u5728\u5c40\u90e8\u914d\u7f6e\u91cc\u9762\u914d\u7f6e\u4e86\u7528\u4f8b\u6267\u884c\u6807\u7b7e\uff0c\u800c\u5916\u5c42 runner \u51fa\u6ca1\u6709\u6307\u5b9a\u6267\u884c\u6807\u7b7e\uff0c\u5219\u5728\u6267\u884c\u65f6\u53ea\u4f1a\u6267\u884c\u5c40\u90e8\u914d\u7f6e\u5df2\u914d\u7f6e\u7684\uff0c\u82e5\u5916\u5c42 runner \u4e5f\u914d\u7f6e\u4e86\u6267\u884c\u6807\u7b7e\uff0c\u5219\u4f1a\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u7528\u4f8b\u3002 \u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u914d\u7f6e\u90fd\u5728\u540c\u4e00\u4e2a\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\uff0cpy \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684\u7c7b\uff0cini \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684 option\u3002 \u5168\u5c40\u914d\u7f6e\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u7b56\u7565\u5982\u4e0b\uff1a \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5c40\u90e8\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5e94\u7528\u5c42\uff1arunner \u662f\u6d4b\u8bd5\u6267\u884c\u7684\u5165\u53e3\uff0c\u5b83\u4f1a\u6839\u636e\u914d\u7f6e\u91cc\u9762\u7684\u914d\u7f6e\u9879\uff0c\u8fdb\u884c\u7528\u4f8b\u7684\u52a0\u8f7d\u548c\u6267\u884c\u3002\u5b83\u63d0\u4f9b\u63a5\u53e3\u7ed9\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\uff0c\u5e73\u53f0\u4e0a\u7684\u6307\u4ee4\u5b9e\u9645\u4e0a\u90fd\u662f\u901a\u8fc7\u4e0b\u53d1\u7ed9 runner\uff0c\u7136\u540e\u7531 runner \u6765\u6267\u884c\u76f8\u5e94\u7684\u6d4b\u8bd5\u3002 \u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u662f\u4e00\u4e2a\u524d\u7aef\u7cfb\u7edf\uff0c\u53ef\u4ee5\u8fdb\u884c\u6d4b\u8bd5\u673a\u7ba1\u7406\u3001\u81ea\u52a8\u5b89\u88c5\u955c\u50cf\u3001\u81ea\u52a8\u5b89\u88c5\u6307\u5b9a\u5e94\u7528\u7248\u672c\u3001\u8fdb\u884c\u6d4b\u8bd5\u7528\u4f8b\u8303\u56f4\u9009\u62e9\u3001\u7528\u4f8b\u89e6\u53d1\u6267\u884c\u63a7\u5236\u3001\u7ed3\u679c\u5c55\u793a\u8f93\u51fa\u7b49\u3002 \u4e00\u4e2a\u5e94\u7528\u7684\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\u90fd\u53ef\u4ee5\u5355\u72ec\u89e6\u53d1\u3002 \u517c\u5bb9\u6027\u6d4b\u8bd5\u4e3b\u8981\u901a\u8fc7 PXE \u670d\u52a1\u5668\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u88c5\u673a\uff0c\u7136\u540e\u914d\u5408 AT \u8fdb\u884c\u6d4b\u8bd5\uff0c\u53ef\u4ee5\u5b9e\u73b0\u4e0d\u540c\u7cfb\u7edf\u7248\u672c\u3001\u4e0d\u540c\u5e94\u7528\u7248\u672c\u73af\u5883\u4e0a\u90fd\u53ef\u4ee5\u8fdb\u884c\u81ea\u52a8\u5316\u7684 AT \u6267\u884c\uff0c\u63d0\u9ad8\u517c\u5bb9\u6027\u6d4b\u8bd5\u6548\u7387\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_4","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_2","title":"1\u3001\u7528\u4f8b\u89e3\u8026","text":"\u5b58\u5728\u8026\u5408\u5173\u7cfb\u7684\u65b9\u6cd5\uff1a\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u88ab\u5916\u90e8\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\uff0c\u5219\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u8026\u5408\u5173\u7cfb\u3002 1.1\u3001\u901a\u8fc7\u7f16\u8f91\u5668 Find Usages \u67e5\u770b\u6bcf\u4e2a\u65b9\u6cd5\u88ab\u8c03\u7528\u7684\u8def\u5f84\u548c\u88ab\u8c03\u7528\u6b21\u6570\uff1b 1.2\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 1 \u4e2a\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728\u5916\u90e8\u5e94\u7528\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1b 1.3\u3001\u64cd\u4f5c\u5c42\u6587\u4ef6\u540d\u5747\u4ee5 widget \u7ed3\u5c3e\uff0c\u7c7b\u540d\u4ee5 Widget \u7ed3\u5c3e\uff0c\u5982\uff1a\u6587\u4ef6\u540d music_widget.py \uff1a class MusicWidget:\n\"\"\"\u97f3\u4e50\u7684\u64cd\u4f5c\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_2","title":"2\u3001\u516c\u5171\u5e93\u5efa\u8bbe","text":"2.1\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 2 \u4e2a\u53ca\u4ee5\u4e0a\u7684\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728 public_widget \u76ee\u5f55\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1bpublic_widget \u5373\u4e3a\u516c\u5171\u65b9\u6cd5\u5e93\uff1b 2.2\u3001\u5728\u7528\u4f8b\u5c42\u4fee\u6539\u7528\u4f8b\u4e2d\u7c7b\u7684\u5bfc\u5165\u8def\u5f84\uff0c\u5c5e\u4e8e\u516c\u5171\u65b9\u6cd5\u7684\u5219\u8c03\u7528 public_widget \u4e2d\u7684\u7c7b\uff0c\u5916\u90e8\u5e94\u7528\u7684\u64cd\u4f5c\u65b9\u6cd5\uff0c\u5219\u8c03\u7528\u672c\u5e94\u7528\u76ee\u5f55\u4e0b\u91cd\u5199\u7684\u5916\u90e8\u5e94\u7528\u65b9\u6cd5\u3002 \u6bd4\u5982\uff1a\u51e0\u4e4e\u6240\u6709\u591a\u5a92\u4f53\u5e94\u7528\u90fd\u9700\u8981\u901a\u8fc7\u6587\u7ba1\u52a0\u8f7d\u8d44\u6e90\uff0c\u8c03\u8d77\u7684\u6587\u7ba1\u5bf9\u8bdd\u6846\u5b9e\u9645\u4e3a dde-desktop\uff0c\u56e0\u6b64\u5c06 desktop_widget.py \u653e\u5230 public_widget \u91cc\u9762\uff1a class DdeDesktopPublicWidget:\n\"\"\"\u516c\u5171-\u684c\u9762\u7684\u64cd\u4f5c\u65b9\u6cd5\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3_1","title":"3\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406","text":"3.1\u3001\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1a\u5bf9\u5e94 core\u3001smoke\uff0c\u6216\u4e3a\u7a7a\uff1b \u7528\u4f8b\u6765\u6e90\uff1a\u5bf9\u5e94 PMS \u7528\u4f8b\u6765\u6e90\uff0c\u5206\u522b\u7528 acp1\u3001acp2\u3001acp3\u3001acp4 \u8868\u793a\u3002 acp1 \uff1a\u4e1a\u52a1\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5199\u7684\u7528\u4f8b\uff0c\u88ab\u7528\u4e8e\u9a8c\u6536\u6d4b\u8bd5\u7684\uff1b acp2 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5f15\u5165\u7684\u4ea7\u54c1\u9a8c\u6536\u6d4b\u8bc4\u90e8\u7684\u7528\u4f8b\uff1b acp3 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u6839\u636e\u4ea7\u54c1\u9700\u6c42\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\uff1b acp4 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u901a\u8fc7\u793e\u533a\u3001\u8bba\u575b\u7528\u6237\u53cd\u9988\u95ee\u9898\u603b\u7ed3\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\u3002 \u4e3e\u4f8b\uff1a \u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u7528\u4f8b\u6765\u6e90 001 L1 core acp1 \u6807\u7b7e\u91c7\u7528\u679a\u4e3e\u7684\u65b9\u5f0f\u8fdb\u884c\u4ee3\u53f7\u7ba1\u7406\u65b9\u4fbf\u7ba1\u7406\u4ee5\u53ca\u540e\u7eed\u6269\u5c55\u3002 3.2\u3001\u5728\u6bcf\u4e2a\u5e94\u7528\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u7b2c\u4e00\u5217\u4e3a\u7528\u4f8b\u7684 ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ba1\u7406\u6a21\u5757\u5185\u7684\u7528\u4f8b\u6807\u7b7e\u3002\u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 3.3\u3001\u5bf9\u7167 PMS \u4e0a\u7528\u4f8b\u7b49\u7ea7\u3001\u7528\u4f8b\u7c7b\u578b\u548c\u7528\u4f8b\u6765\u6e90\uff0c\u6807\u8bb0\u6240\u6709\u5df2\u5b9e\u73b0\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u540e\u7eed\u7f16\u5199\u65b0\u589e\u81ea\u52a8\u5316\u7528\u4f8b\u65f6\uff0c\u6bcf\u5199\u4e00\u6761\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684 csv \u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u6b64\u6761\u7528\u4f8b\u7684\u6807\u7b7e\u3002 3.4\u3001\u8df3\u8fc7\u7528\u4f8b\u6807\u7b7e\u5316 \u73b0\u6709\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a\uff1a \u4e3e\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u8bb0\u4e3a \u201cskip-\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u8bb0\uff0c\u5982\u679c\u5df2\u7ecf\u6807\u8bb0\u4e86\u8df3\u8fc7\u539f\u56e0\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u8bb0\u4e3a SKIPED\uff0c\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\u3002 \u6240\u6709\u7684\u6807\u7b7e\u5728 docs \u76ee\u5f55\u4e0b\u4f1a\u6709\u4e00\u4e2a\u6587\u6863\uff0c\u6587\u6863\u6682\u5b9a\u540d\u79f0\u4e3a\uff1atags_info.md\uff0c\u7528\u4e8e\u8bf4\u660e\u73b0\u5728\u5df2\u7ecf\u4f7f\u7528\u5230\u7684\u6807\u7b7e\uff0c\u4ee5\u53ca\u8fd9\u4e9b\u6807\u7b7e\u7684\u89e3\u91ca\u548c\u7528\u6cd5\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#4","title":"4\u3001\u7528\u4f8b\u6267\u884c","text":"4.1\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u7684\u9a71\u52a8\u6267\u884c\u903b\u8f91\u529f\u80fd\u5b9e\u73b0 \u5f00\u53d1\u6839\u636e\u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\u91cc\u9762\u7684\u7528\u4f8b\u6807\u7b7e\u6267\u884c\u5bf9\u5e94\u7528\u4f8b\u7684\u529f\u80fd\uff0c\u80fd\u652f\u6301\u591a\u4e2a\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u6267\u884c\u5165\u53e3\u80fd\u968f\u610f\u901a\u8fc7\u7528\u4f8b\u6807\u7b7e\u6307\u5b9a\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002 \u7528\u4f8b\u6807\u7b7e\u7684\u9a71\u52a8\u65b9\u5f0f\u5fc5\u987b\u80fd\u652f\u6301\u6807\u7b7e\u7684\u6269\u5c55\uff0c\u672a\u6765\u968f\u7740\u4e1a\u52a1\u7684\u53d8\u5316\u53ef\u80fd\u9700\u8981\u589e\u52a0\u5404\u79cd\u5404\u6837\u7684\u6807\u7b7e\u3002 4.2\u3001\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u6267\u884c \u529f\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u3001\u6027\u80fd\u6d4b\u8bd5\u7b49\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u662f\u5206\u5f00\u6267\u884c\u7684\uff0c\u4e5f\u5c31\u662f\u5728\u4e00\u6b21\u6267\u884c\u4e2d\uff0c\u53ea\u80fd\u6267\u884c\u5176\u4e2d\u4e00\u79cd\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5177\u4f53\u8981\u6267\u884c\u54ea\u4e00\u79cd\u540c\u6837\u901a\u8fc7\u53c2\u6570\u6765\u63a7\u5236\u3002 4.3\u3001\u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c \u7531\u4e8e\u6d4b\u8bd5\u673a\u8d44\u6e90\u6709\u9650\uff0c\u968f\u7740\u81ea\u52a8\u5316\u7528\u4f8b\u6570\u91cf\u7684\u589e\u52a0\uff0cCI \u6267\u884c\u65f6\u95f4\u4f1a\u8d8a\u6765\u8d8a\u957f\u3002 \u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c\u7684\u529f\u80fd\uff1a \u540c\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\u5206\u6563\u5230\u4e0d\u540c\u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u4e0a\u6267\u884c\uff0c\u7f29\u77ed\u6267\u884c\u603b\u65f6\u95f4\uff1b \u7b2c\u4e8c\u5929\u8dd1\u7684\u65f6\u5019\u540c\u4e00\u4e2a\u673a\u5668\u4e0a\u4f1a\u6267\u884c\u6628\u5929\u6ca1\u6709\u6267\u884c\u5230\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u6267\u884c\u540c\u7406\uff1b \u53ef\u4ee5\u5b9e\u73b0\u5728\u5168\u67b6\u6784\u6d4b\u8bd5\u673a\u4e0a\u8f6e\u6d41\u6267\u884c\u7528\u4f8b\uff0c\u65e2\u80fd\u4fdd\u8bc1\u6267\u884c\u4e86\u6240\u6709\u7684\u7528\u4f8b\uff0c\u53c8\u80fd\u5728\u8d44\u6e90\u6709\u9650\u7684\u60c5\u51b5\u4e0b\u8986\u76d6\u4e86\u6240\u6709\u7684\u67b6\u6784\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#5","title":"5\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0","text":"5.1\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u4f5c\u4e3a\u524d\u7aef\u754c\u9762\u7cfb\u7edf\uff0c\u901a\u8fc7\u9875\u9762\u4e0a\u7684\u4e00\u4e9b\u529f\u80fd\u9009\u9879\u8fdb\u884c\u5bf9\u5e94\u6d4b\u8bd5\u4efb\u52a1\u7684\u7ba1\u7406\u6216\u89e6\u53d1\uff0c\u4e1a\u5185\u6bd4\u8f83\u6d41\u884c\u7684\u5b9e\u73b0\u65b9\u6848\u662f\u4f7f\u7528 Vue + DRF \u5b9e\u73b0\u4e00\u4e2a\u524d\u540e\u7aef\u5206\u79bb\u7684\u7cfb\u7edf\u3002 \u6d4b\u8bd5\u5e73\u53f0\u53ef\u80fd\u4f1a\u6d89\u53ca\u5230\u7684\u6a21\u5757\u6709\uff1a\u6d4b\u8bd5\u673a\u8d44\u6e90\u7ba1\u7406\u6a21\u5757\u3001\u7528\u4f8b\u6267\u884c\u63a7\u5236\u6a21\u5757\u3001\u7ed3\u679c\u5c55\u793a\u6a21\u5757\u3001PXE \u955c\u50cf\u5b89\u88c5\u6a21\u5757\u7b49\u3002 \u7528\u6237\uff08\u6d4b\u8bd5\u3001\u7814\u53d1\u540c\u5b66\u7b49\uff09\u53ef\u4ee5\u914d\u7f6e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5982\u6267\u884c\u54ea\u4e2a\u5e94\u7528\u3001\u6267\u884c\u7528\u4f8b\u7684\u8303\u56f4\u3001\u5728\u54ea\u53f0\u673a\u5668\u4e0a\u6267\u884c\u3001\u955c\u50cf\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u5e94\u7528\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u6267\u884c\u65f6\u95f4\u3002 5.2\u3001\u6267\u884c\u5165\u53e3 runner \u63d0\u4f9b\u7ed9\u6d4b\u8bd5\u5e73\u53f0\u7684\u63a5\u53e3\u5305\u62ec\uff1a\u7528\u4f8b\u6267\u884c\u63a5\u53e3\u3001\u7ed3\u679c\u8fd4\u56de\u63a5\u53e3\u3001\u955c\u50cf\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u955c\u50cf\u5b89\u88c5\u63a5\u53e3\u3001\u5e94\u7528\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u5e94\u7528\u5b89\u88c5\u66f4\u65b0\u63a5\u53e3\u7b49\u3002 \u524d\u7aef\u5e73\u53f0\u76ee\u524d\u8fd8\u6ca1\u6709\u592a\u591a\u8be6\u7ec6\u7684\u65b9\u6848\uff0c\u672c\u6b21\u8bbe\u8ba1\u4e3b\u8981\u96c6\u4e2d\u5728\u540e\u7aef\u8fd9\u90e8\u5206\u67b6\u6784\u7684\u8bbe\u8ba1\u4e0a\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_5","title":"\u56db\u3001\u5b9e\u65bd\u8ba1\u5212","text":"\u8fd1\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u6587\u7ba1\u4ee3\u7801\u89e3\u8026 2022/3/28 2022/4/8 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u56fe\u5f62\u56fe\u50cf\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u97f3\u89c6\u9891\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5168\u5c40\u641c\u7d22\u4ee3\u7801\u89e3\u8026 2022/4/25 2022/4/26 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u516c\u5171\u5e93\u5efa\u8bbe 2022/4/27 2022/5/5 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5c01\u88c5\u7684\u65b9\u6cd5\u6574\u7406\u6210\u4e00\u4e2a\u8868 2022/5/6 2022/5/10 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7528\u4f8b\u6807\u7b7e\u5206\u7c7b\u8bc4\u4f30 2022/5/11 2022/5/11 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u6807\u7b7e\u5316\u6267\u884c\u9a71\u52a8\u7a0b\u5e8f\u7f16\u5199 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u9700\u5b9e\u73b0\u81ea\u52a8\u89e3\u6790 csv \u8868\u683c\u4e2d\u7684\u7528\u4f8b\u7f16\u53f7 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u722c\u866b\u811a\u672c\uff0c\u722c\u53d6 pms \u4e0a\u7528\u4f8b\u7684\u6807\u7b7e 2022/5/11 2022/5/13 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u5b9a\u65f6\u81ea\u52a8\u7ef4\u62a4\u672c\u5730 csv \u6587\u4ef6\u811a\u672c 2022/5/11 2022/5/20 \u4e2d\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u76ee\u5f55\u7ed3\u6784\u8c03\u6574 2022/5/20 2022/6/2 \u5b8c\u6210\u5168\u5c40\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u5177\u4f53\u65b9\u6848\u548c\u903b\u8f91\u5b9e\u73b0 2022/6/6 2022/6/17 \u9759\u6001\u626b\u63cf\u95ee\u9898\u6e05\u96f6 2022/6/20 2022/7/1 \u5b8c\u6210\u65b0\u6846\u67b6\u4f7f\u7528\u57f9\u8bad 2022/7/4 2022/7/11 \u843d\u5730\u8fd0\u884c 2022/7/12 2022/7/20 \u5e95\u5c42\u5e93\u7528\u9014\u8bf4\u660e\u6587\u6863\u7f16\u5199 2022/7/21 2022/7/28"}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\u200b\\u3000\\-\u3001\u3002\uff0c\uff0e\uff1f\uff01\uff1b]+","pipeline":["stemmer"]},"docs":[{"location":"","title":"\u9996\u9875","text":""},{"location":"#youqu","title":"\u6709\u8da3\uff08YouQu\uff09","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/4/1\n# Author : Mikigo\n# =============================================\n \u672c\u7ad9\u603b\u8bbf\u95ee\u91cf \u6b21 \u6b22\u8fce\u5728\u6d4f\u89c8\u5668\u8bbf\u95ee\u3010\u516c\u7f51\u6587\u6863\u3011 \u7edf\u4fe1\u516c\u53f8\u5185\u7f51\u8fd8\u53ef\u4ee5\u8bbf\u95ee\u3010\u5185\u7f51\u6587\u6863\u3011\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u54e6~~"},{"location":"#_1","title":"\u4e00\u3001\u7b80\u4ecb","text":"\u6709\u8da3\uff08YouQu\uff09\u662f\u6df1\u5ea6\u79d1\u6280\u8bbe\u8ba1\u548c\u5f00\u53d1\u7684\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff0c\u91c7\u7528\u7ed3\u6784\u5206\u5c42\u7684\u8bbe\u8ba1\u7406\u5ff5\uff0c\u652f\u6301\u591a\u5143\u5316\u5143\u7d20\u5b9a\u4f4d\u548c\u65ad\u8a00\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\u3001\u5f3a\u5927\u7684\u65e5\u5fd7\u548c\u62a5\u544a\u8f93\u51fa\u7b49\u7279\u8272\u529f\u80fd\uff0c\u540c\u65f6\u5b8c\u7f8e\u517c\u5bb9X11\u3001Wayland\u663e\u793a\u534f\u8bae\uff0c\u73af\u5883\u90e8\u7f72\u7b80\u5355\uff0c\u64cd\u4f5c\u6613\u4e0a\u624b\u3002"},{"location":"#17","title":"\u7231\u4e0a \u201c\u6709\u8da3\u201d \u7684 17 \u4e2a\u7406\u7531","text":" \u6838\u5fc3\u5e93\u63d0\u4f9b\u4e86\u7edf\u4e00\u7684\u63a5\u53e3\uff0c\u7f16\u5199\u65b9\u6cd5\u65f6\u53ea\u9700\u8981\u5bfc\u5165\u4e00\u4e2a\u5305\u5c31\u53ef\u4ee5\u4f7f\u7528\u5230\u6838\u5fc3\u5e93\u63d0\u4f9b\u7684\u6240\u6709\u529f\u80fd\uff1b \u516c\u5171\u5e93\u5c01\u88c5\u4e86\u5f88\u591a\u5e38\u7528\u6a21\u5757\u7684\u76f8\u5173\u65b9\u6cd5\uff0c\u6bd4\u5982\uff1a\u4efb\u52a1\u680f\u7684\u64cd\u4f5c\u3001\u684c\u9762\u7684\u64cd\u4f5c\u3001\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\u7b49\u7b49\uff1b \u9664\u4e86\u5e38\u7528\u7684\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u8bc6\u522b\u4ee5\u5916\uff0c\u6211\u4eec\u8fd8\u63d0\u4f9b\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u5176\u4f7f\u7528\u7b80\u5355\u4e14\u9ad8\u6548\uff0c\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff1b \u5bf9\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u5c06\u7f16\u5199\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u53d8\u5f97\u7b80\u5355\u800c\u4f18\u96c5\uff1b \u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u6280\u672f\u8fdb\u884c\u529f\u80fd\u5347\u7ea7\uff0c\u9664\u4e86\u652f\u6301\u5355\u4e2a\u5750\u6807\u8fd4\u56de\uff0c\u8fd8\u652f\u6301\u540c\u4e00\u754c\u9762\u4e0b\u591a\u4e2a\u76f8\u540c\u5143\u7d20\u8fd4\u56de\u591a\u4e2a\u5750\u6807\u7684\u529f\u80fd\uff1b \u63d0\u4f9b\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u548c\u6279\u91cf\u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u4e0d\u5230\u4e00\u4e2a csv \u6587\u4ef6\u539f\u6765\u80fd\u5e72\u8fd9\u4e48\u591a\u4e8b\u60c5\uff1b \u63d0\u4f9b\u4e86\u529f\u80fd\u5f3a\u5927\u7684\u6267\u884c\u5668\u5165\u53e3\uff0c\u8ba9\u4f60\u53ef\u4ee5\u65b9\u4fbf\u7684\u5728\u672c\u5730\u6267\u884c\u4efb\u4f55\u7528\u4f8b\u96c6\u7684\u7528\u4f8b\uff0c\u5176\u4e30\u5bcc\u7684\u81ea\u5b9a\u4e49\u914d\u7f6e\u9879\uff0c\u6ee1\u8db3\u4f60\u5bf9\u6267\u884c\u5668\u6240\u6709\u7684\u5e7b\u60f3\uff1b \u63d0\u4f9b\u8fdc\u7a0b\u6267\u884c\u7684\u529f\u80fd\uff0c\u53ef\u4ee5\u63a7\u5236\u591a\u53f0\u673a\u5668\u5e76\u884c\u8dd1\uff0c\u6216\u8005\u5206\u5e03\u5f0f\u8dd1\uff0c\u8fd9\u79cd\u4ed8\u8d39\u529f\u80fd\u73b0\u5728\u514d\u8d39\u7ed9\u4f60\u7528\uff1b \u63d0\u4f9b\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u529f\u80fd\uff0c\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u6bcf\u4e2a\u65b9\u6cd5\u5355\u72ec\u5199\u8f93\u51fa\u65e5\u5fd7\u7684\u4ee3\u7801\uff0c\u4e00\u5207\u6211\u4eec\u7ed9\u4f60\u641e\u5b9a\u4e86\uff0c\u65e5\u5fd7\u8f93\u51fa\u4e0d\u4ec5\u5185\u5bb9\u4e30\u5bcc\uff0c\u989c\u503c\u4e5f\u7edd\u5bf9\u5728\u7ebf\uff0c\u6211\u4eec\u8fd8\u81ea\u5df1\u8bbe\u8ba1\u4e86\u4e00\u6b3e\u7ec8\u7aef\u8f93\u51fa\u4e3b\u9898\u53eb\u300a\u4e94\u5f69\u6591\u6593\u7684\u9ed1\u300b\uff1b \u63d0\u4f9b\u4e86\u4e00\u952e\u90e8\u7f72\u81ea\u52a8\u5316\u6d4b\u8bd5\u73af\u5883\u7684\u529f\u80fd\uff0c\u8fde\u4ee3\u7801\u7f16\u8f91\u5668\u90fd\u7ed9\u4f60\u88c5\u597d\u4e86\uff0c\u8ba9\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u73af\u5883\u90e8\u7f72\u800c\u70e6\u607c\uff1b \u63d0\u4f9b\u4e86\u81ea\u52a8\u751f\u6210\u591a\u79cd\u62a5\u544a\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u8f93\u51fa\u4ec0\u4e48\u62a5\u544a\u5f62\u5f0f\u90fd\u884c\uff0c\u800c\u4e14\u6211\u4eec\u5728\u62a5\u544a\u4e2d\u8fd8\u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\u548c\u5931\u8d25\u622a\u56fe\u7684\u529f\u80fd\uff1b \u5bf9\u65ad\u8a00\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u63d0\u4f9b\u66f4\u53cb\u597d\u5316\u7684\u9519\u8bef\u63d0\u793a\uff0c\u8ba9\u5b9a\u4f4d\u95ee\u9898\u7cbe\u51c6\u9ad8\u6548\uff1b \u4e0d\u4ec5\u652f\u6301\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u63a7\u5236\uff0c\u800c\u4e14\u8fd8\u652f\u6301\u52a8\u6001\u63a7\u5236\u7528\u4f8b\u6279\u91cf\u6267\u884c\u7684\u603b\u65f6\u95f4\uff0c\u786e\u4fdd CI \u73af\u5883\u4e0b\u80fd\u987a\u7545\u8fd0\u884c\uff1b \u652f\u6301\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\u6267\u884c\u3001PMS \u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6807\u7b7e\u5316\u6267\u884c\u65b9\u6848\uff0c\u6ee1\u8db3\u4f60\u5404\u79cd\u573a\u666f\u4e0b\u7684\u6267\u884c\u9700\u6c42\uff1b \u652f\u6301\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u529f\u80fd\uff0c\u53ef\u5b9a\u4f4d\u53ef\u65ad\u8a00\uff0c\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\uff1b \u5b8c\u7f8e\u517c\u5bb9 Wayland \u548c X11\uff0c\u771f\u6b63\u505a\u5230\u4e00\u5957\u4ee3\u7801\uff0c\u968f\u5904\u6267\u884c\uff1b \u652f\u6301\u591a\u79cd\u65b9\u5f0f\u7684\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u5176\u4e2d\u5f02\u6b65\u56de\u586b\u7684\u65b9\u6848\uff0c\u5b8c\u7f8e\u89e3\u51b3\u4e86\u6570\u636e\u56de\u586b\u7684\u8017\u65f6\u95ee\u9898\uff1b \u3010\u89c6\u9891\u4ecb\u7ecd\u3011"},{"location":"#_2","title":"\u4e8c\u3001\u5b89\u88c5\u4f7f\u7528","text":"\u57fa\u7840\u6846\u67b6\uff1ahttps://github.com/linuxdeepin/deepin-autotest-framework \u4ece PyPI \u5b89\u88c5: sudo pip3 install youqu\n \u521b\u5efa\u9879\u76ee: youqu-startproject youqu\n \u5b89\u88c5\u4f9d\u8d56: cd youqu\nbash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002 \u5e94\u7528\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684\u5e94\u7528\u540d\u79f0\u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music cd apps/\n \u5c06\u5e94\u7528\u5e93\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u50cf\u8fd9\u6837\uff1a youqu\n\u251c\u2500\u2500 apps\n\u2502 \u251c\u2500\u2500 autotest_deepin_music # \u5e94\u7528\u5e93\n...\n \u5e94\u7528\u5e93\u7684\u540d\u79f0\u4e0d\u53ef\u4ee5\u4fee\u6539\u3002"},{"location":"#_3","title":"\u4e09\u3001\u8fd0\u884c","text":""},{"location":"#1","title":"1. \u5de5\u4f5c\u7a7a\u95f4","text":"\u57fa\u7840\u6846\u67b6\u5de5\u7a0b\u76ee\u5f55\u5efa\u8bae\u653e\u5728 ~ \u76ee\u5f55\u4e0b\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u4e5f\u53ef\u4ee5\u8fd0\u884c\uff0c\u4f46\u662f\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u9700\u8981\u505a\u73af\u5883\u6e05\u7406\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u5b58\u5728\u4ee3\u7801\u88ab\u5220\u9664\u7684\u98ce\u9669\u3002 \u5982\u679c\u4f60\u7684\u673a\u5668\u4e0a\u4e0d\u540c\u76ee\u5f55\u4e0b\u5b58\u5728\u591a\u4e2a YouQu \u5de5\u7a0b\uff0c\u90a3\u4e48\u5728\u8fd0\u884c\u4e4b\u524d\uff0c\u8bf7\u5148\u6267\u884c env.sh \u6821\u6b63\u76f8\u5173\u73af\u5883\u3002"},{"location":"#2","title":"2. \u6267\u884c\u5668","text":"\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u6709\u4e00\u4e2a manage.py \uff0c\u5b83\u662f\u4e00\u4e2a\u6267\u884c\u5668\u5165\u53e3\uff0c\u63d0\u4f9b\u4e86\u672c\u5730\u6267\u884c\u3001\u8fdc\u7a0b\u6267\u884c\u7b49\u7684\u529f\u80fd\u3002 \u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6765\u6267\u884c\uff1a youqu manage.py run -a deepin-music\n"},{"location":"#21","title":"2.1. \u672c\u5730\u6267\u884c","text":"youqu manage.py run\n"},{"location":"#211","title":"2.1.1. \u914d\u7f6e\u6587\u4ef6","text":"\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u914d\u7f6e\u53c2\u6570 \u5728\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u91cc\u9762\u652f\u6301\u914d\u7f6e\u5bf9\u6267\u884c\u7684\u4e00\u4e9b\u53c2\u6570\u8fdb\u884c\u914d\u7f6e\uff0c\u5e38\u7528\u7684\u5982\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;-----------------------------------------------\n;1.KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2.KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f\n;e.g. TAGS = L1 or smoke\n;-----------------------------------------------\n;\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\uff0c\u5c06\u8981\u6267\u884c\u7684\u7528\u4f8b\u5199\u5165\u6307\u5b9a\u7684 csv \u6587\u4ef6\n;\u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u4ece\u57fa\u7840\u6846\u67b6\u6839\u76ee\u5f55\u5f00\u59cb\uff1ae.g. CASE_FILE = case_list.txt\n;\u5982\u679c\u8fd9\u91cc\u6709\u503c\uff0cAPP_NAME KEYWORDS TAGS \u7684\u914d\u7f6e\u5747\u4e0d\u751f\u6548\nCASE_FILE =\n;=============================== RUNNER CONFIG ===================================\n[runner]\n;\u6700\u5927\u5931\u8d25\u7528\u4f8b\u6570\u91cf\u7684\u5360\u6bd4\n;\u6bd4\u5982\uff1a\u603b\u6267\u884c\u7528\u4f8b\u6570\u4e3a 100, \u82e5 MAX_FAIL = 0.5,\u5219\u5931\u8d25\u7528\u4f8b\u6570\u8fbe\u5230 50 \u5c31\u4f1a\u7ec8\u6b62\u6d4b\u8bd5\u3002\nMAX_FAIL = 1\n;\u5355\u6761\u7528\u4f8b\u7684\u8d85\u65f6\u65f6\u95f4\uff0c\u5982\u679c\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u8d85\u65f6\uff0c\u8fd9\u6761\u7528\u4f8b\u4f1a\u88ab\u505c\u6b62\uff0c\u540e\u7eed\u7528\u4f8b\u7ee7\u7eed\u6267\u884c\u3002\n;\u5355\u4f4d\u4e3a\u79d2\n;\u8fd9\u662f\u4e00\u4e2a\u5168\u5c40\u7edf\u4e00\u914d\u7f6e\uff0c\u5982\u679c\u67d0\u6761\u7528\u4f8b\u9700\u8981\u5355\u72ec\u914d\u7f6e\u8d85\u65f6\u65f6\u95f4\uff0c\u53ef\u4ee5\u5728\u7528\u4f8b\u4e2d\u8fd9\u6837\u5199\uff1a\n;@pytest.mark.timeout(500)\n;def test_xxx_001():\n; ...\n;\u4f1a\u8bdd\u8d85\u65f6\uff08\u6240\u6709\u7528\u4f8b\u6267\u884c\u7684\u8d85\u65f6\u65f6\u95f4\uff09\u662f\u6839\u636e\u5168\u5c40\u8d85\u65f6\u914d\u7f6e\u548c\u7528\u4f8b\u5355\u72ec\u8d85\u65f6\u914d\u7f6e\u81ea\u52a8\u8ba1\u7b97\u7684\u3002\nCASE_TIME_OUT = 200\n;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\n;\u6ce8\u610f\uff0cRERUN = 1 \u8868\u793a\u91cd\u8dd1 1 \u6b21\uff0c\u5373\u7b2c\u4e00\u6b21\u7528\u4f8b\u6267\u884c\u5931\u8d25\u4f1a\u81ea\u52a8\u91cd\u8dd1 1 \u6b21\uff0c\u603b\u5171\u6267\u884c 2 \u6b21\uff1b\n;\u5982\u679c\u7b2c 2 \u6b21\u6267\u884c\u6210\u529f\uff0c\u7ed3\u679c\u6210\u529f\uff0c\u5931\u8d25\u4ea6\u4e3a\u5931\u8d25\u3002\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c 1 \u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff0cRERUN >= RECORD_FAILED_CASE\u3002\n;1.\u5173\u95ed\u5f55\u5c4f\uff1aRECORD_FAILED_CASE > RERUN\n;2.\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1aRECORD_FAILED_CASE = 0\nRECORD_FAILED_CASE = 1\n;yes \u6bcf\u6761\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u8fdb\u884c\u73af\u5883\u6e05\u7406\nCLEAN_ALL = yes\n;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387, \u6bd4\u5982\uff1a1920x1080\n;no: \u8868\u793a\u4e0d\u505a\u5206\u8fa8\u7387\u6821\u9a8c\nRESOLUTION = 1920x1080\n;\u4e0d\u8df3\u8fc7\u7528\u4f8b\uff0ccsv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86 skip-xxx\u7684\u7528\u4f8b\u4e0d\u8df3\u8fc7\nNOSKIP = no\n;ignore fixed\n;no\uff0c\u53ea\u8981\u6807\u8bb0\u4e86fixed\u7684\u7528\u4f8b\uff0c\u5373\u4f7f\u6807\u8bb0\u4e86skip-\uff0c\u4e5f\u4f1a\u6267\u884c\uff1b\n;yes\uff0cfixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\uff1b\nIFIXED = no\n;\u8981\u5b89\u88c5deb\u5305\u7684\u8def\u5f84\n;e.g : ~/Downloads/ \u5b89\u88c5\u4e0b\u8f7d\u76ee\u5f55\u4e0b\u7684deb\u5305\uff0c\u5982\u679c\u662f\u8fdc\u7a0b\u6267\u884c\uff0c\u4f1a\u81ea\u52a8\u62f7\u8d1d\u5230\u8fdc\u7a0b\u5e76\u5b89\u88c5\u3002\nDEB_PATH =\n;DEBUG \u6a21\u5f0f\u6267\u884c\u7528\u4f8b\uff0c\u53ea\u6536\u96c6\u4e0d\u6267\u884c\u7528\u4f8b\uff0c\u4e5f\u4e0d\u505a\u8bbe\u5907\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002\nDEBUG = no\n;\u8bb0\u5f55top\u547d\u4ee4\u67e5\u8be2\u7684\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0cTOP = 3 \u8868\u793a\u8bb0\u5f55\u524d3\u4e2a\u8fdb\u7a0b\u3002\nTOP =\n;\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\nREPEAT =\n;\u9ed8\u8ba4\u5728\u6240\u6709\u6d4b\u8bd5\u5b8c\u6210\u4e4b\u540e\u8f93\u51fa\u62a5\u9519\u4fe1\u606f.\n;yes, \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\nDURING_FAIL = no\n;\u6ce8\u518c\u81ea\u542f\u670d\u52a1\nAUTOSTART = no\n;=============================== REPORT CONFIG ===================================\n[report]\n;\u6d4b\u8bd5\u62a5\u544a\u7684title\nREPORT_TITLE = YouQu Report\n;\u6d4b\u8bd5\u62a5\u544a\u7684name\nREPORT_NAME = YouQu Report\n;\u6d4b\u8bd5\u62a5\u544a\u7684\u9ed8\u8ba4\u8bed\u8a00\n;en:English\n;ru:\u0420\u0443\u0441\u0441\u043a\u0438\u0439\n;zh:\u4e2d\u6587\n;de:Deutsch\n;nl:Nederlands\n;he:Hebrew\n;br:Brazil\n;pl:Polski\n;ja:\u65e5\u672c\u8a9e\n;es:Espa\u00f1ol\n;kr:\ud55c\uad6d\uc5b4\n;fr:Fran\u00e7ais\n;az:Az\u0259rbaycanca\nREPORT_LANGUAGE = zh\n;\u7528\u4f8b\u6267\u884c\u5b8c\u540e\u751f\u6210\u7684\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n;\u76ee\u524d\u652f\u6301 allure, xml, json \uff08\u652f\u6301\u540c\u65f6\u751f\u6210\uff09\nREPORT_FORMAT = allure, xml, json\n;\u6307\u5b9a\u62a5\u544a\u751f\u6210\u7684\u8def\u5f84\uff08\u76f8\u5bf9\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\uff09\nALLURE_REPORT_PATH = report/\nXML_REPORT_PATH = report/\nJSON_REPORT_PATH = report/\n;=============================== GLOBAL CONFIG ===================================\n[globalconfig]\n;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\nPASSWORD = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\nIMAGE_MATCH_NUMBER = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6bcf\u6b21\u95f4\u9694\u7b49\u5f85\u65f6\u95f4\nIMAGE_MATCH_WAIT_TIME = 1\n;\u56fe\u50cf\u8bc6\u522b\u5339\u914d\u5ea6\nIMAGE_RATE = 0.9\n;\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u5b9e\u65f6\u56fe\u50cf\u4fdd\u5b58\u8def\u5f84\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u5750\u6807\nSCREEN_CACHE = /tmp/screen.png\n;\u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\u7684\u8def\u5f84\nTMPDIR = /tmp/tmpdir\n;\u7cfb\u7edf\u4e3b\u9898\nSYS_THEME = deepin\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = youqu-dev.uniontech.com\n;OpenCV\u670d\u52a1\u7aef\u5730\u5740\nOPENCV_SERVER_HOST = youqu-dev.uniontech.com\n;=============================== PMS CONFIG ===================================\n;PMS\u76f8\u5173\u914d\u7f6e\uff0c\u5305\u542b\u4ee5\u4e0b\u51e0\u4e2a\u65b9\u9762\uff1a\n;1.PMS\u6d4b\u8bd5\u5957\u6267\u884c\n;2.\u81ea\u52a8\u4ecePMS\u722c\u53d6\u6570\u636e\u5e76\u540c\u6b65\u672c\u5730CSV\u6587\u4ef6\n;3.PMS\u6570\u636e\u56de\u586b\n[pms]\n;PMS\u7684\u7528\u6237\u540d,\u5982: ut001234\nPMS_USER =\n;PMS\u7684\u5bc6\u7801\nPMS_PASSWORD =\n;PMS\u6d4b\u8bd5\u5957\u7684ID\n;\u5728PMS\u4e0a\u67e5\u770b\u7528\u4f8b\u201c\u5957\u4ef6\u201d\u94fe\u63a5: https://pms.uniontech.com/testsuite-view-495.html\n;\u6d4b\u8bd5\u5957ID\u4e3a: 495\nSUITE_ID =\n;\u6570\u636e\u56de\u586b\u5fc5\u987b\u5173\u8054PMS\u6d4b\u8bd5\u5355\n;\u5728PMS\u4e0a\u67e5\u770b\u6d4b\u8bd5\u5355\u94fe\u63a5: https://pms.uniontech.com/testtask-cases-20747.html\n;\u6d4b\u8bd5\u5355ID\u4e3a: 20747\nTASK_ID =\n;\u5c06\u6d4b\u8bd5\u7ed3\u679c\u6570\u636e\u56de\u586b\u5230PMS\n;\u4e3a\u7a7a: \u8868\u793a\u4e0d\u56de\u586b,\u4e0d\u4f1a\u5728\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u751f\u6210json\u7ed3\u679c\u6587\u4ef6;\n;async: \u8868\u793a\u9010\u6761\u5f02\u6b65\u56de\u586b,\u540e\u9762\u4e00\u6761\u6267\u884c\u5f00\u59cb\u65f6\u901a\u8fc7\u5b50\u7ebf\u7a0b\u5bf9\u524d\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u8fdb\u884c\u56de\u586b\uff0c\u5982\u6b64\u5b9e\u73b0\u65f6\u95f4\u6548\u7387\u6700\u5927\u5316;\n;finish: \u8868\u793a\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u6210\u4e4b\u540e\u9010\u4e2a\u56de\u586b(PMS\u4e0d\u652f\u6301\u5e76\u53d1);\nSEND_PMS =\n;\u6570\u636e\u56de\u586b\u7684\u89e6\u53d1\u8005\n;auto: \u6846\u67b6\u81ea\u52a8\u56de\u586b,\u914d\u5408SEND_PMS\u914d\u7f6e\u4f7f\u7528,\u4f60\u53ef\u4ee5\u9009\u62e9\u5728\u4e0d\u540c\u7684\u9636\u6bb5\u8fdb\u884c\u6570\u636e\u56de\u586b;\n;hand: \u624b\u52a8\u56de\u586b,\u6bcf\u6761\u7528\u4f8b\u4ecd\u7136\u4f1a\u751f\u6210json\u6587\u4ef6,\u4f46\u6846\u67b6\u4e0d\u4f1a\u8fdb\u884c\u6570\u636e\u56de\u586b,\u9700\u8981\u4f60\u53ef\u4ee5\u5728\u4f60\u60f3\u8981\u53d1\u9001\u7684\u65f6\u95f4\u70b9\u624b\u52a8\u89e6\u53d1\u56de\u586b;\nTRIGGER = auto\n;PMS\u56de\u586b\u7684\u91cd\u8bd5\u6b21\u6570\n;\u5982\u679c\u63a5\u53e3\u8bf7\u6c42\u5931\u8d25,\u4f1a\u8fdb\u884c\u91cd\u8bd5\nSEND_PMS_RETRY_NUMBER = 2\n[csv_link_pms_lib]\n;caselib: \u7528\u4f8b\u5e93\n;testcase: \u4ea7\u54c1\u5e93\u7528\u4f8b\nCASE_FROM = caselib\n[csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/caselib-browse-81.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 81\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic =\n[export_csv]\n;\u5bfc\u51fa\u7684csv\u6587\u4ef6\u540d\u79f0\uff0c\u9ed8\u8ba4 case_list.csv\nCSV_FILE = case_list.csv\n;exportcsv \u547d\u4ee4\u5bfc\u51fa case_list.csv \u6587\u4ef6\u65f6\u914d\u7f6e\u7684\u5b57\u6bb5\u540d\uff0c\u7528\u4f8b\u540d\u79f0\u9ed8\u8ba4\u5b58\u5728\u7b2c\u4e00\u5217\uff0c\u65e0\u9700\u6dfb\u52a0\nCSV_HEARD = \u7528\u4f8b\u7ea7\u522b,\u7528\u4f8b\u7c7b\u578b,\u6d4b\u8bd5\u7ea7\u522b,\u662f\u5426\u8df3\u8fc7\n[log_cli]\n;\u65e5\u5fd7\u76f8\u5173\u914d\u7f6e\uff08\u4e0d\u6253\u5370\u6784\u9020\u51fd\u6570\u548c\u9b54\u6cd5\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff09\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = DEBUG\n# ============= \u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u914d\u7f6e ================\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u5f00\u5934\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7, \u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_STARTSWITH = Assert\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u7ed3\u5c3e\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_ENDSWITH = Widget\n;\u652f\u6301\u7c7b\u540d\u5305\u542b xxx \u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_CONTAIN = ShortCut\n# ==============================================\n \u914d\u7f6e\u5b8c\u6210\u4e4b\u540e\uff0c\u76f4\u63a5\u5728\u547d\u4ee4\u884c\u6267\u884c manage.py \u5c31\u597d\u4e86\u3002 youqu manage.py run\n"},{"location":"#212","title":"2.1.2. \u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a youqu manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -h, --help show this help message and exit\n-a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--record_failed_case RECORD_FAILED_CASE\n\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--max_fail MAX_FAIL \u6700\u5927\u5931\u8d25\u7387\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--resolution RESOLUTION\n\u68c0\u67e5\u5206\u8fa8\u7387\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms {,async,finish}\n\u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--trigger {,auto,hand}\n\u89e6\u53d1\u8005\n-f CASE_FILE, --case_file CASE_FILE\n\u6839\u636e\u6587\u4ef6\u6267\u884c\u7528\u4f8b\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n--pms_user PMS_USER pms \u7528\u6237\u540d\n--pms_password PMS_PASSWORD\npms \u5bc6\u7801\n--suite_id SUITE_ID pms \u6d4b\u8bd5\u5957ID\n--pms_info_file PMS_INFO_FILE\npms \u4fe1\u606f\u6587\u4ef6\n--top TOP \u8fc7\u7a0b\u4e2d\u8bb0\u5f55top\u547d\u4ee4\u4e2d\u7684\u503c\n--lastfailed \u4ec5\u6267\u884c\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\n--duringfail \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\n--repeat REPEAT \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n--project_name PROJECT_NAME\n\u5de5\u7a0b\u540d\u79f0\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--build_location BUILD_LOCATION\n\u6784\u5efa\u5730\u533a\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--line LINE \u6267\u884c\u7684\u4e1a\u52a1\u7ebf\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--autostart AUTOSTART \u7528\u4f8b\u6267\u884c\u7a0b\u5e8f\u6ce8\u518c\u5230\u5f00\u673a\u81ea\u542f\u670d\u52a1\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a youqu manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\"\n \u547d\u4ee4\u884c\u53c2\u6570\u4f18\u5148\u7ea7\u662f\u9ad8\u4e8e\u914d\u7f6e\u6587\u4ef6\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u4e86\u5bf9\u5e94\u7684\u53c2\u6570\uff0c\u914d\u7f6e\u6587\u4ef6\u4e2d\u4e0d\u7ba1\u662f\u5426\u914d\u7f6e\u5747\u4e0d\u751f\u6548\u3002 --app \u5165\u53c2\u8fd8\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\uff0c\u4e0b\u9762\u7684\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u540c\u6837\u652f\u6301\u3002"},{"location":"#22","title":"2.2. \u8fdc\u7a0b\u6267\u884c","text":"\u8fdc\u7a0b\u6267\u884c\u5c31\u662f\u7528\u672c\u5730\u4f5c\u4e3a\u670d\u52a1\u7aef\u63a7\u5236\u8fdc\u7a0b\u673a\u5668\u6267\u884c\uff0c\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u76f8\u540c\uff1b \u4f7f\u7528 remote \u547d\u4ee4\uff1a youqu manage.py remote\n"},{"location":"#221","title":"2.2.1. \u8fdc\u7a0b\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u6267\u884c","text":"\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u6267\u884c\u5c31\u662f\u7531\u672c\u5730 YouQu \u4f5c\u4e3a\u670d\u52a1\u7aef\uff0c\u63a7\u5236\u8fdc\u7a0b N \u53f0\u673a\u5668\u6267\u884c\u76f8\u540c\u7684\u7528\u4f8b\uff0c\u6267\u884c\u5b8c\u4e4b\u540e\u6240\u6709\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u7ed3\u679c\u4f1a\u8fd4\u56de\u7ed9\u670d\u52a1\u7aef report \u76ee\u5f55\u4e0b\uff1b \u8fdc\u7a0b\u6267\u884c\u540c\u6837\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u8fdb\u884c\u7528\u4f8b\u76f8\u5173\u914d\u7f6e\uff1b \u9700\u8981\u91cd\u70b9\u8bf4\u4e00\u4e0b\u8fdc\u7a0b\u6267\u884c\u65f6\u7684\u6d4b\u8bd5\u673a\u4fe1\u606f\u914d\u7f6e\uff0c\u5728\u914d\u7f6e\u6587\u4ef6 setting/remote.ini \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\u3001IP\u3001\u5bc6\u7801\u3002 ;=============================== CLIENT LIST =====================================\n; \u6d4b\u8bd5\u673a\u914d\u7f6e\u5217\u8868\n;[client{number}] ;\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u6709\u591a\u5c11\u53f0\u6d4b\u8bd5\u673a\u5c31\u5199\u591a\u5c11\u4e2a client\uff0c\u522b\u540d\u5fc5\u987b\u5305\u542b client \u5b57\u7b26\uff0c\u4e14\u4e0d\u80fd\u91cd\u590d\u3002\n;user = ;\u6d4b\u8bd5\u673a user\n;ip = ;\u6d4b\u8bd5\u673a ip\n;password = 1 ;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801, \u53ef\u4ee5\u4e0d\u914d\u7f6e\u6b64\u9879\uff0c\u9ed8\u8ba4\u53d6 CLIENT_PASSWORD \u7684\u503c\uff1b\n;\u5982\u679c\u4f60\u6240\u6709\u6d4b\u8bd5\u673a\u5bc6\u7801\u90fd\u76f8\u540c\uff0c\u90a3\u4e48\u53ea\u9700\u8981\u914d\u7f6e CLIENT_PASSWORD \u5c31\u53ef\u4ee5\u4e86\n;=================================================================================\n[client1]\nuser = uos\nip = 10.8.15.xx\n[client2]\nuser = uos\nip = 10.8.15.xx\n[client3]\nuser = uos\nip = 10.8.11.xx\n \u6709\u591a\u5c11\u53f0\u673a\u5668\u5c31\u50cf\u8fd9\u6837\u53c2\u8003\u4e0a\u9762\u7684\u683c\u5f0f\u5199\u5c31\u884c\u4e86\u3002 \u7136\u540e\u5728\u547d\u4ee4\u884c\uff1a youqu manage.py remote\n \u8fd9\u6837\u8fd0\u884c\u662f\u4ece\u914d\u7f6e\u6587\u4ef6\u53bb\u8bfb\u53d6\u76f8\u5173\u914d\u7f6e\u3002 \u5982\u679c\u4f60\u4e0d\u60f3\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\uff0c\u4f60\u4ecd\u7136\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u8fdb\u884c\u4f20\u53c2\uff0c \u4ee5\u4e0b\u4e3a python3 manage.py remote \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -h, --help show this help message and exit\n-c CLIENTS, --clients CLIENTS\n\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679cpassword\u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6sett\ning/remote.ini\u4e2dCLIENT_PASSWORD\u7684\u503c,\u6bd4\u5982: uos@10.8.13.33:1\n\u6216 uos@10.8.13.33\n-s, --send_code \u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a\uff08\u4e0d\u542breport\u76ee\u5f55\uff09\n-e, --build_env \u642d\u5efa\u6d4b\u8bd5\u73af\u5883,\u5982\u679c\u4e3ayes\uff0c\u4e0d\u7ba1send_code\u662f\u5426\u4e3ayes\u90fd\u4f1a\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a.\n-p CLIENT_PASSWORD, --client_password CLIENT_PASSWORD\n\u6d4b\u8bd5\u673a\u5bc6\u7801\uff08\u5168\u5c40\uff09\n-y PARALLEL, --parallel PARALLEL\nyes:\u8868\u793a\u6240\u6709\u6d4b\u8bd5\u673a\u5e76\u884c\u8dd1\uff0c\u6267\u884c\u76f8\u540c\u7684\u6d4b\u8bd5\u7528\u4f8b;no:\u8868\u793a\u6d4b\u8bd5\u673a\u5206\u5e03\u5f0f\u6267\u884c\uff0c\u670d\u52a1\u7aef\u4f1a\u6839\u636e\u6536\u96c6\u5230\u7684\u6d4b\u8bd5\u7528\u4f8b\u81ea\n\u52a8\u5206\u914d\u7ed9\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u3002\n \u9664\u4e86\u8fd9\u4e9b\u7279\u6709\u53c2\u6570\u4ee5\u5916\uff0c\u5b83\u540c\u6837\u652f\u6301\u672c\u5730\u6267\u884c\u7684\u6240\u6709\u53c2\u6570\uff1b \u5728\u547d\u4ee4\u884c\u8fd9\u6837\u8fd0\u884c\uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\"\n \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report \u76ee\u5f55\u4e0b\u56de\u6536\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u7684\u6d4b\u8bd5\u62a5\u544a\u3002 \u6ce8\u610f\uff0c\u5982\u679c\u8fdc\u7a0b\u673a\u5668\u6ca1\u6709\u642d\u5efa\u81ea\u52a8\u5316\u6d4b\u8bd5\u73af\u5883\uff0c\u8bb0\u5f97\u52a0\u4e0a\u53c2\u6570 -e \uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\" -e\n \u6267\u884c\u524d\u786e\u4fdd\u8fdc\u7a0b\u673a\u5668\u5df2\u7ecf\u5f00\u542f\u4e86 ssh \u670d\u52a1\uff0c\u5426\u5219\u4f1a\u63d0\u793a\u65e0\u6cd5\u8fde\u63a5\uff0c\u5982\u679c\u6ca1\u6709\u5f00\u542f\uff0c\u8bf7\u624b\u52a8\u5f00\u542f\uff1a sudo systemctl restart ssh\nsudo systemctl enable ssh\n \u914d\u7f6e\u6587\u4ef6\u5176\u4ed6\u76f8\u5173\u914d\u7f6e\u9879\u8be6\u7ec6\u8bf4\u660e\uff0c\u8bf7\u67e5\u770b\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u6ce8\u91ca\u5185\u5bb9\u3002"},{"location":"#222","title":"2.2.2. \u8fdc\u7a0b\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u8d1f\u8f7d\u5747\u8861\u6267\u884c","text":"\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u8d1f\u8f7d\u5747\u8861\u6267\u884c\u4e5f\u662f\u7528\u672c\u5730\u4f5c\u4e3a\u670d\u52a1\u7aef\u63a7\u5236\u8fdc\u7a0b\u673a\u5668\u6267\u884c\uff0c\u4f46\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u4e0d\u540c\uff0c\u800c\u662f\u6240\u6709\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u4e4b\u548c\uff0c\u4e3a\u4f60\u60f3\u8981\u6267\u884c\u7684\u7528\u4f8b\u96c6\uff1b \u4f3c\u4e4e\u6709\u70b9\u96be\u4ee5\u7406\u89e3\uff0c\u6211\u7528\u5927\u767d\u8bdd\u4e3e\u4f8b\u63cf\u8ff0\u4e0b\u5c31\u662f\uff0c\u670d\u52a1\u7aef\u60f3\u8981\u6267\u884c 10 \u6761\u7528\u4f8b\uff0c\u73b0\u5728\u8fdc\u7a0b\u673a\u5668\u6709 5 \u53f0\uff1b \u7136\u540e\u670d\u52a1\u7aef\u5c31\u5148\u62ff\u7740\u7b2c 1 \u6761\u7528\u4f8b\u7ed9\u8fdc\u7a0b 1 \u53f7\u673a\u6267\u884c\uff0c\u62ff\u7b2c 2 \u6761\u7528\u4f8b\u7ed9\u8fdc\u7a0b 2 \u53f7\u673a\u6267\u884c...\uff0c\u5982\u6b64\u5faa\u73af\u76f4\u5230\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\uff0c\u8fd9\u5c31\u662f\u8d1f\u8f7d\u5747\u8861\u6267\u884c\u3002 \u4f7f\u7528\u65b9\u6cd5\u548c\u524d\u9762\u4e00\u6837\uff0c\u53ea\u662f\u9700\u8981\u589e\u52a0\u4e00\u4e2a\u53c2\u6570\uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\" --parallel no\n"},{"location":"#23-pms","title":"2.3. PMS \u6570\u636e\u56de\u586b","text":"\u6d4b\u8bd5\u5355\u5173\u8054\u7684\u7528\u4f8b\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u5bf9\u5e94\u7684\u53bb\u8dd1\u8fd9\u4e9b\u5173\u8054\u7684\u7528\u4f8b\uff0c\u5e76\u4e14\u5c06\u6267\u884c\u7684\u7ed3\u679c\u56de\u586b\u7684\u6d4b\u8bd5\u7528\u4f8b\u7684\u72b6\u6001\u91cc\u9762\u3002 PMS \u6570\u636e\u56de\u586b\u4e3b\u8981\u6709\u4e09\u79cd\u65b9\u5f0f\uff1a \uff081\uff09\u5f02\u6b65\u56de\u586b \u5728\u7528\u4f8b\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\uff0c\u91c7\u7528\u5f02\u6b65\u7684\u65b9\u5f0f\u53bb\u8fdb\u884c\u6570\u636e\u56de\u586b\uff0c\u76f4\u767d\u7684\u8bb2\u5c31\u662f\uff0c\u7b2c\u4e8c\u6761\u7528\u4f8b\u5f00\u59cb\u8dd1\u7684\u65f6\u5019\uff0c\u901a\u8fc7\u5b50\u7ebf\u7a0b\u53bb\u505a\u7b2c\u4e00\u6761\u7528\u4f8b\u7684\u6570\u636e\u56de\u586b\uff0c\u5982\u6b64\u5faa\u73af\uff0c\u76f4\u5230\u6240\u6709\u7528\u4f8b\u6267\u884c\u7ed3\u675f\uff1b \u8fd9\u79cd\u65b9\u6848\u7684\u65f6\u95f4\u6548\u7387\u6700\u9ad8\u7684\uff0c\u56e0\u4e3a\u7406\u8bba\u4e0a\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u662f\u5927\u4e8e\u6570\u636e\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\u65f6\u95f4\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u5f53\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u6570\u636e\u56de\u586b\u4e5f\u5b8c\u6210\u4e86\u3002 \u4f7f\u7528\u65b9\u6cd5\uff0c\u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u4ee5\u4e0b\u53c2\u6570\uff1a\uff08\u4ee5\u4e0b\u6d89\u53ca\u5230\u7684\u53c2\u6570\u914d\u7f6e\u90fd\u662f\u5728\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u914d\u7f6e\uff09 PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = async\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \u8fd9\u4e2a\u53c2\u6570\u53ef\u586b\u53ef\u4e0d\u586b\uff0c\u4f46\u662f\u586b\u4e86\u53ef\u4ee5\u63d0\u9ad8\u7528\u4f8b\u7684\u6267\u884c\u901f\u5ea6\uff0c\u56e0\u4e3a\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u53ef\u4ee5\u6307\u5b9a\u5230\u5177\u4f53\u7684\u5e94\u7528\u5e93\u3002\uff08\u4e0b\u540c\uff09\n \uff082\uff09\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u56de\u586b \u7b49\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u518d\u9010\u4e2a\u8fdb\u884c\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u6b64\u65b9\u6848\u65f6\u95f4\u6548\u7387\u6bd4\u8f83\u4f4e\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \uff083\uff09\u624b\u52a8\u56de\u586b \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4e0d\u505a\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u540e\u7eed\u624b\u52a8\u5c06\u7ed3\u679c\u8fdb\u884c\u56de\u586b\u8bf7\u6c42\u3002 \u7528\u4f8b\u6267\u884c\u65f6\u914d\u7f6e\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = hand\nAPP_NAME = \u540e\u7eed\u624b\u52a8\u56de\u586b\u65b9\u6cd5\uff1a youqu manage.py pms --send2task yes\n"},{"location":"#_4","title":"\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898","text":"\u7531\u540c\u5b66\u53ef\u80fd\u4f1a\u53d1\u73b0\uff0c\u600e\u4e48\u56de\u586b\u4e00\u6b21\u4e4b\u540e\uff0c\u540e\u9762\u60f3\u518d\u6b21\u56de\u586b\u5c31\u4e0d\u751f\u6548\u4e86\uff1b \u8fd9\u662f\u56e0\u4e3a\u4e3a\u4e86\u5e94\u5bf9\u524d\u9762\u63d0\u5230\u7684\u591a\u79cd\u6570\u636e\u56de\u586b\u7684\u65b9\u5f0f\uff0c\u5728 report \u76ee\u5f55\u4e0b\u4f1a\u7531 pms_xxx \u5f00\u5934\u7684\u76ee\u5f55\uff0c\u8bb0\u5f55\u4e86\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u548c\u56de\u586b\u60c5\u51b5\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u4e4b\u524d\u5df2\u7ecf\u56de\u586b\u8fc7\u4e86\uff0c\u540e\u7eed\u5c31\u4e0d\u4f1a\u518d\u6b64\u89e6\u53d1\u56de\u586b\u4e86\uff1b \u5982\u679c\u4f60\u60f3\u91cd\u65b0\u505a\u56de\u586b\uff0c\u4f60\u53ef\u4ee5\u628a report/pms_xxx \u76ee\u5f55\u5220\u6389\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u91cd\u65b0\u505a\u6570\u636e\u56de\u586b\u4e86\uff1b"},{"location":"#24-csv","title":"2.4. \u5bfc\u51fa CSV \u6587\u4ef6","text":"\u6846\u67b6\u63d0\u4f9b\u5bfc\u51fa\u6307\u5b9a\u6807\u7b7e\u7528\u4f8b\u7684\u529f\u80fd\uff1a youqu manage.py exportcsv -a deepin-album -t CICD\n \u8868\u793a\u5bfc\u51fa deepin-album \u7684\u7528\u4f8b\u4e2d\u6807\u8bb0\u4e86 CICD \u6807\u7b7e\u7684\u7528\u4f8b\uff0c\u5bfc\u51fa CSV \u6587\u4ef6\u7684\u5b57\u6bb5\u683c\u5f0f\u5df2\u7ecf\u9002\u914d\u4e86 CICD \u7684\u8981\u6c42\u3002"},{"location":"#25-app","title":"2.5. \u811a\u624b\u67b6\u65b0\u5efa APP \u5de5\u7a0b","text":"\u65b0\u5efa\u4e00\u4e2a APP \u5de5\u7a0b\uff1a youqu manage.py startapp autotest_deepin_some \u8fd9\u6837\u5728 apps \u76ee\u5f55\u4e0b\u4f1a\u521b\u5efa\u4e00\u4e2a\u5b50\u9879\u76ee\u5de5\u7a0b autotest_deepin_some\uff0c\u540c\u65f6\u65b0\u5efa\u597d\u5de5\u7a0b\u6a21\u677f\u76ee\u5f55\u548c\u6a21\u677f\u6587\u4ef6\uff1a apps\n\u2514\u2500\u2500 autotest_deepin_some\n \u00a0\u00a0 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_case.py\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 config.ini\n \u00a0\u00a0 \u251c\u2500\u2500 config.py\n \u00a0\u00a0 \u251c\u2500\u2500 conftest.py\n \u00a0\u00a0 \u251c\u2500\u2500 control\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_assert.py\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some.csv\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u2514\u2500\u2500 widget\n \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 case_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 other.ini\n \u00a0\u00a0 \u251c\u2500\u2500 other_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 pic_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2514\u2500\u2500 ui.ini\n autotest_deepin_some \u662f\u4f60\u7684\u5de5\u7a0b\u540d\u79f0\uff0c\u6bd4\u5982\uff1aautotest_deepin_music \uff1b \u5728\u6b64\u57fa\u7840\u4e0a\uff0c\u4f60\u53ef\u4ee5\u5feb\u901f\u7684\u5f00\u59cb\u4f60\u7684 AT \u9879\u76ee\u3002"},{"location":"#26","title":"2.6. \u7528\u4f8b\u6807\u7b7e\u81ea\u52a8\u540c\u6b65","text":"\u7528\u4e8e\u81ea\u52a8\u540c\u6b65 PMS \u7528\u4f8b\u6807\u7b7e\u6570\u636e\u81f3\u672c\u5730 CSV \u6587\u4ef6\uff0c\u4e3b\u8981\u901a\u8fc7\u4ee5\u4e0b\u51e0\u4e2a\u914d\u7f6e\u6765\u63a7\u5236\uff1a APP_NAME = # \u6307\u5b9a\u8981\u540c\u6b65\u7684\u5e94\u7528\u540d\u79f0\nPMS_USER = # PMS\u7684\u7528\u6237\u540d\nPMS_PASSWORD = # PMS\u7684\u5bc6\u7801\n \u5728 [csv_link_pms_id] \u8282\u70b9\u4e0b\u6307\u5b9a csv \u6587\u4ef6\u540d\u4e0e PMS \u7528\u4f8b\u6a21\u5757\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u6bd4\u5982\uff1a [csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/testcase-browse-53.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 53\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic = 53\n \u5c06\u4ee5\u4e0a\u4fe1\u606f\u914d\u7f6e\u597d\u4e4b\u540e\uff0c\u5728\u547d\u4ee4\u884c\u6267\u884c\uff1a youqu manage.py pms --pms2csv yes\n \u6bcf\u6b21\u6267\u884c\u65f6\u539f csv \u6587\u4ef6\u4f1a\u81ea\u52a8\u5907\u4efd\u5728 report/csv_back \u76ee\u5f55\u4e0b\uff0c\u56e0\u6b64\u4f60\u4e0d\u7528\u62c5\u5fc3\u811a\u672c\u6267\u884c\u5bfc\u81f4\u4f60\u7684\u6570\u636e\u4e22\u5931\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u57fa\u7840\u6846\u67b6\u8bbe\u8ba1\u65b9\u6848","text":"# ====================================\n# Author : Mikigo\n# Time : 2022/3/18\n# version \uff1a1.0\n# ====================================\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"\u505a\u4e00\u4e2a\u7b80\u5355\u3001\u597d\u7528\u3001\u529f\u80fd\u5f3a\u5927\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u3002 \u4f5c\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4e00\u4e2a\u57fa\u7840\u6846\u67b6\uff0c\u4efb\u4f55\u5e94\u7528\u90fd\u80fd\u5f88\u65b9\u4fbf\u7684\u63a5\u5165\u8fdb\u6765\uff1b \u63d0\u4f9b\u6240\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u9700\u8981\u7684\u5e95\u5c42\u529f\u80fd\uff0c\u5e76\u5bf9\u5916\u63d0\u4f9b\u552f\u4e00\u7684\u63a5\u53e3\uff0c\u65b9\u4fbf\u5e94\u7528\u5e93\u4f7f\u7528\uff1b \u6574\u5408\u516c\u5171\u5e93\uff0c\u51cf\u5c11\u5e94\u7528\u5e93\u4ee3\u7801\u91cf\u548c\u65b9\u6cd5\u7ef4\u62a4\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u8bbe\u8ba1\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u7edf\u4e00\u6982\u5ff5","text":" \u57fa\u7840\u6846\u67b6 \u672c\u9879\u76ee\u662f\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\uff08AutoTest Basic Frame\uff09\uff0c\u5168\u79f0\u4e3a\u201c\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff08AT \u57fa\u7840\u6846\u67b6\uff09\u201d\u3002 AT \u57fa\u7840\u6846\u67b6\u662f\u505a\u4e3a\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\u6765\u8bbe\u8ba1\u7684\uff0c\u5b83\u63d0\u4f9b\u4e86\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u57fa\u7840\u529f\u80fd\uff0c\u4efb\u4f55\u5e94\u7528\u63a5\u5165\u8fdb\u6765\u90fd\u80fd\u5feb\u901f\u65b9\u4fbf\u7684\u8fdb\u884c\u65b9\u6cd5\u548c\u7528\u4f8b\u7f16\u5199\uff0c\u540c\u65f6\u5728\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u3001\u6807\u7b7e\u5316\u6267\u884c\u3001\u5206\u5e03\u5f0f\u6267\u884c\u3001\u591a\u79cd\u62a5\u544a\u8f93\u51fa\u3001\u4f18\u7f8e\u7684\u6267\u884c\u65e5\u5fd7\u3001\u5931\u8d25\u81ea\u52a8\u5f55\u5c4f\u548c\u622a\u56fe\u3001\u81ea\u52a8\u73af\u5883\u6e05\u7406\u7b49\u7b49\uff0c\u5b83\u90fd\u63d0\u4f9b\u4e86\u5b8c\u5584\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u66f4\u91cd\u8981\u7684\u662f\u8fd9\u4e00\u5207\u4f7f\u7528\u8d77\u6765\u90fd\u975e\u5e38\u7b80\u5355\u3002 \u57fa\u7840\u6846\u67b6\u4e2d\u5305\u542b\u5e94\u7528\u5e93\uff08apps\uff09\u3001\u6838\u5fc3\u5e93\uff08src\uff09\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09\u3002 \u5e94\u7528\u5e93\uff08apps\uff09 \u5404\u4e2a\u5e94\u7528\u81ea\u5df1\u7684\u4ed3\u5e93\uff0c\u91cc\u9762\u4e3b\u8981\u5305\u542b\u7684\u662f\u7528\u4f8b\u3001\u65b9\u6cd5\u53ca\u4e00\u4e9b\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u53eb autotest-dde-file-manager \u3002 \u6838\u5fc3\u5e93\uff08src\uff09 \u6838\u5fc3\u5e93\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u5230\u6240\u6709\u5e95\u5c42\u6838\u5fc3\u529f\u80fd\uff0c\u8fd9\u662f\u6700\u91cd\u8981\u7684\u4e00\u4e2a\u90e8\u5206\uff0c\u7075\u9b42\u3002\u5177\u4f53\u529f\u80fd\u6a21\u5757\u53ca\u8bf4\u660e\u4f1a\u5728\u4e0b\u9762\u7b2c\u56db\u4e2a\u7ae0\u8282\u8be6\u7ec6\u63cf\u8ff0\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09 \u591a\u4e2a\u5e94\u7528\u90fd\u8981\u7528\u5230\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\uff0c\u6309\u7167\u5e94\u7528\u5212\u5206\u5b58\u653e\uff0c\u4e3b\u8981\u662f\u4e3a\u4e86\u51cf\u5c11\u4ee3\u7801\u91cf\uff0c\u6d88\u9664\u5e94\u7528\u95f4\u7684\u8026\u5408\u5173\u7cfb\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u67b6\u6784\u56fe","text":"\u6574\u4f53\u7684\u6846\u67b6\u8bbe\u8ba1\u5728\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u300b\u6587\u6863\u91cc\u9762\u5df2\u7ecf\u6709\u8be6\u7ec6\u63cf\u8ff0\u4e86\uff0c\u8fd9\u91cc\u8d34\u4e00\u4e0b\u6574\u4f53\u7684\u67b6\u6784\u56fe\uff1a \u4e3a\u4e86\u7a81\u663e\u672c\u6587\u7684\u91cd\u70b9\uff0c\u62bd\u53d6\u5176\u4e2d\u91cd\u8981\u529f\u80fd\u6a21\u5757\uff0c\u5982\u4e0b\u56fe\uff1a "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-basic-frame # \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\n\u251c\u2500\u2500 apps # \u5e94\u7528\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-dde-file-manager # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\uff08\u5e94\u7528\u5e93\u8be6\u7ec6\u76ee\u5f55\u7ed3\u6784\u8bf7\u770b\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\uff09\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 tag # \u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u2514\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u2502 \u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 xxx.png\n\u2502 \u2502 ...\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-deepin-music # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 public # \u516c\u5171\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget # dde_dock \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget # dde_desktop \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 src # \u6838\u5fc3\u5e93\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 button_center.py\n\u2502 \u251c\u2500\u2500 cmdtrl.py\n\u2502 \u251c\u2500\u2500 dogtails.py\n\u2502 \u251c\u2500\u2500 find_image.py\n\u2502 \u251c\u2500\u2500 global_config.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 setting # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 config.py\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 global_config.ini\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\u6a21\u5757\uff08Hook\uff09\n\u251c\u2500\u2500 pytest.ini # Pytest \u9ed8\u8ba4\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 docs # \u6587\u6863\u76ee\u5f55\n\u2514\u2500\u2500 manage.py # \u6267\u884c\u5668\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1apps","title":"1\u3001\u5e94\u7528\u5e93\uff08apps\uff09","text":"\u6240\u6709\u5e94\u7528\u5e93\u5747\u653e\u7f6e\u5728\u57fa\u7840\u6846\u67b6\u4e0b\u7684 apps \u76ee\u5f55\u4e0b\uff08\u89c1\u7b2c\u4e8c\u7ae0\u8282\u7b2c3\u6bb5\u76ee\u5f55\u7ed3\u6784\u5185\u5bb9\uff09\u3002\u5e94\u7528\u5e93\u7684\u67b6\u6784\u8bbe\u8ba1\u53ef\u4ee5\u53c2\u8003\u300aAT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b\u6587\u6863\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2src","title":"2\u3001\u6838\u5fc3\u5e93\uff08src\uff09","text":"\u5728 src \u76ee\u5f55\u4e0b\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u5e95\u5c42\u6838\u5fc3\u7ec4\u4ef6\uff0c\u901a\u5e38\u6765\u8bb2\u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5230\u5176\u4e2d\u67d0\u4e00\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4e48\u4f60\u9700\u8981\u663e\u793a\u7684\u5bfc\u5165\u8fd9\u4e2a\u6a21\u5757\uff0c\u7136\u540e\u624d\u80fd\u4f7f\u7528\u8be5\u6a21\u5757\u4e0b\u7684\u529f\u80fd\uff0c\u5982\u679c\u4f60\u7528\u5230\u4e86\u5341\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4f60\u5c31\u9700\u8981\u5bfc\u5165\u5341\u4e2a\u3002\u4f46\u662f\u6211\u4eec\u60f3\u8ba9\u4e8b\u60c5\u53d8\u5f97\u7b80\u5355\uff0c\u4e00\u6b21\u5bfc\u5165\uff0c\u4f7f\u7528\u6240\u6709\u3002 \u5c06\u6240\u6709\u7684\u529f\u80fd\u6a21\u5757\u90fd\u8fdb\u5165\u5230 src \u7684\u540d\u79f0\u7a7a\u95f4\uff0c\u5728 src/__init__.py \u91cc\u9762\u6211\u4eec\u8bbe\u8ba1\u6210\u8fd9\u6837\uff1a # src/__init__.py\nfrom .cmdctl import CmdCtl\nfrom .dogtails import Dogtail\nfrom .find_image import FindImage\nfrom .button_center import ButtonCenter\nclass Src(CmdCtl, FindImage):\ndef __init__(self, **kwargs):\n\"\"\"dogtail or button center param\n :param kwargs: app_name, desc, number\n \"\"\"\nif kwargs:\napp_name = kwargs.get(\"APP_NAME\")\ndesc = kwargs.get(\"DESC\")\nif app_name is None or desc is None:\nraise ValueError\nnumber = kwargs.get(\"number\")\nnumber = number if isinstance(number, int) else -1\n# \u5bf9\u8c61\u7ec4\u5408\nself.dog = Dogtail(app_name, desc, number)\nself.ui = ButtonCenter(app_name, number)\n \u9700\u8981\u4f20\u9012\u53c2\u6570\u7684\u91c7\u7528\u5bf9\u8c61\u7ec4\u5408\uff0c\u6ca1\u6709\u53c2\u6570\u7684\u4f7f\u7528\u7ee7\u627f\uff0c\u7ee7\u627f\u7684\u7c7b\u7b26\u5408 Mixin \u8bbe\u8ba1\u6a21\u5f0f\u3002 \u5e94\u7528\u5e93\u91cc\u9762\u4f7f\u7528\u7684\u65f6\u5019\u5728 widget/base_widget.py \u91cc\u9762\u53ea\u9700\u8981\u552f\u4e00\u7ee7\u627f Src \uff1a # \u5e94\u7528\u5e93\u91cc\u9762\u65b9\u6cd5\u57fa\u7c7b\n# widget/base_widget.py\nfrom src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n \u8981\u4f7f\u7528\u6838\u5fc3\u5e93\u7684\u529f\u80fd\uff0c\u53ea\u9700\u8981\u5199\u4e00\u4e2a\u5bfc\u5165 from src import Src \u5373\u53ef\u3002 \u5199 __init__ \u6784\u9020\u51fd\u6570\u7684\u539f\u56e0\u662f\u901a\u8fc7\u53c2\u6570\u6784\u9020\u5e94\u7528\uff0c\u5e76\u4e14\u4f20\u9012 number \u8fdb\u6765\uff0c\u53ef\u4ee5\u5b9e\u73b0\u591a\u7a97\u53e3\u7684\u63a7\u5236\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3public","title":"3\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09","text":"\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6bcf\u4e2a\u5e94\u7528\u90fd\u662f\u4e00\u4e2a\u5355\u72ec\u7684 py \u6587\u4ef6\uff0c\u76f8\u4e92\u4e4b\u95f4\u662f\u72ec\u7acb\u7684\uff0c\u6bcf\u4e2a py \u6587\u4ef6\u91cc\u9762\u662f\u8be5\u5e94\u7528\u7684\u65b9\u6cd5\u7c7b\uff0c\u6bd4\u5982\uff1a\u6700\u5e38\u7528\u7684\u65b9\u6cd5\u7c7b dde_desktop_public_widget.py # dde_desktop_widget.py\nfrom src import Src\nclass _DdeDesktopPublicBaseWidget(Src):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-desktop\"\nDESC = \"/usr/bin/dde-desktop\"\ndef __init__(self):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC)\nclass DdeDesktopPublicWidget(_DdeDesktopPublicBaseWidget):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u7c7b\"\"\"\ndef click_music_dir_by_ui(self):\n\"\"\"\u5728\u6587\u4ef6\u9009\u62e9\u6846\u70b9\u51fb\u97f3\u4e50\u76ee\u5f55\"\"\"\nself.click(*self.ui.btn_center(\"\u4fa7\u8fb9\u680f-\u97f3\u4e50\")) \ndef click_xxx_by_attr(self):\npass\n \u516c\u5171\u65b9\u6cd5\u5e93\u610f\u4e49\uff1a \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6240\u5c01\u88c5\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\u90fd\u662f\u81f3\u5c11\u88ab2\u4e2a\u5e94\u7528\u90fd\u7528\u5230\u7684\uff0c\u8fd9\u6837\u505a\u53ef\u4ee5\u51cf\u5c11\u6574\u4f53\u4ee3\u7801\u91cf\uff0c\u4ece\u800c\u51cf\u8f7b\u5e94\u7528\u5e93\u4ee3\u7801\u7684\u7ef4\u62a4\u5de5\u4f5c\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u7f16\u5199\u5f62\u5f0f\uff08\u547d\u540d\u89c4\u5219\u3001\u5b9a\u4f4d\u7684\u65b9\u6848\u5199\u6cd5\u3001\u6ce8\u91ca\u7684\u5199\u6cd5\u7b49\u7b49\uff09\u5177\u6709\u4e00\u5b9a\u7684\u6a21\u677f\u4f5c\u7528\uff0c\u8fd9\u6837\u5373\u4f7f\u662f\u5404\u4e2a\u5e94\u7528\u5e93\u90fd\u72ec\u7acb\u7ef4\u62a4\uff0c\u6240\u6709\u7684\u7f16\u7801\u98ce\u683c\u90fd\u662f\u8d8b\u4e8e\u76f8\u540c\u7684\uff0c\u56e0\u4e3a\u5927\u5bb6\u90fd\u5e94\u8be5\u53c2\u7167\u516c\u5171\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u5199\u6cd5\u6765\u5199\u81ea\u5df1\u5e94\u7528\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\u7c7b\uff0c\u8fd9\u6837\u4f7f\u5f97\u4ece\u516c\u53f8\u7684\u89d2\u5ea6\u53bb\u770b\u6240\u6709\u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u90fd\u662f\u7edf\u4e00\u7684\u3002 \u53ef\u4ee5\u901a\u8fc7\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\uff0c\u4e86\u89e3\u5230\u5176\u4ed6\u5e94\u7528\u7684\u529f\u80fd\uff0c\u5bf9\u4e8e\u6211\u4eec\u9700\u6c42\u7406\u89e3\uff0c\u4e86\u89e3\u7cfb\u7edf\u7684\u65b9\u65b9\u9762\u9762\u4e5f\u6709\u597d\u5904\u3002 \u5f53\u7136\uff0c\u5982\u679c\u4f60\u7684\u5e94\u7528\u672c\u8eab\u662f\u5c5e\u4e8e\u6839\u672c\u5c31\u4e0d\u9700\u8981\u548c\u5176\u4ed6\u5e94\u7528\u4ea4\u4e92\u7684\uff0c\u90a3\u4e48\u4f60\u53ef\u80fd\u4e0d\u4f1a\u7528\u5230\u8fd9\u91cc\u9762\u7684\u529f\u80fd\uff0c\u6ca1\u5173\u7cfb\uff0c\u4f60\u6240\u6709\u7684\u65b9\u6cd5\u90fd\u53ef\u4ee5\u76f4\u63a5\u5199\u5728\u5e94\u7528\u5e93\u7684\u4e1a\u52a1\u5c42\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4conftestpy","title":"4\u3001conftest.py","text":"conftest.py \u4ece\u529f\u80fd\u4e0a\u5c06\u662f\u5c5e\u4e8e\u6838\u5fc3\u5e93\uff08src\uff09\u7684\u5185\u5bb9\uff0c\u4f46\u662f\u7531\u4e8e\u5b83\u7684\u7279\u6b8a\u6027\uff0c\u5373\u5b83\u662f\u5bf9\u5e94\u7528\u5e93\u4e2d\u7684\u7528\u4f8b\u751f\u6548\u7684\uff0c\u800c\u4e14\u5b83\u7684\u4f5c\u7528\u57df\u662f\u5f53\u524d\u76ee\u5f55\u53ca\u4ee5\u4e0b\uff0c\u56e0\u6b64\u6211\u4eec\u5c06\u5b83\u653e\u5230\u9879\u76ee\u6839\u76ee\u5f55\u3002\u6211\u4eec\u6846\u67b6\u4e2d\u6709\u4e0d\u5c11\u6838\u5fc3\u529f\u80fd\u90fd\u662f\u5728\u8fd9\u91cc\u9762\u8fdb\u884c\u5f00\u53d1\u7684\uff0c\u540e\u9762\u7b2c\u56db\u7ae0\u4f1a\u8bb2\u5230\u7ec6\u8282\u3002 pytest.ini \u4f5c\u7528\u548c conftest.py \u7c7b\u4f3c\uff0c\u662f Pytest \u6846\u67b6\u7684\u56fa\u5b9a\u914d\u7f6e\u6587\u4ef6\uff0c\u76ee\u524d\u914d\u7f6e\u4e86\u4e00\u4e9b\u901a\u7528\u7684\u547d\u4ee4\u884c\u6267\u884c\u53c2\u6570\uff0c\u4e5f\u653e\u5728\u9879\u76ee\u6839\u76ee\u5f55\u3002 \u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 Hook \u51fd\u6570\uff0capps \u76ee\u5f55\u4e0b\u7684 \u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 fixture \u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5setting","title":"5\u3001setting","text":"\u5168\u5c40\u914d\u7f6e\u6a21\u5757\uff0c\u5305\u542b\u4e86\u4ee5\u4e0b\u914d\u7f6e\u6587\u4ef6\uff1a \uff081\uff09ini \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u914d\u7f6e\u4e00\u4e9b\u5168\u5c40\u7684\u914d\u7f6e\u9879\uff0c\u8b6c\u5982\uff1a\u5931\u8d25\u91cd\u8dd1\u6b21\u6570\u3001\u662f\u5426\u5931\u8d25\u5f55\u5c4f\u3001\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\u3001\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4\u3001\u6267\u884c\u65f6\u65e5\u5fd7\u7ea7\u522b\u3001\u751f\u6210\u7684\u62a5\u544a\u7c7b\u578b\u3001\u4ee5\u53ca\u5206\u5e03\u5f0f\u6267\u884c\u7684\u4e00\u4e9b\u7b56\u7565\u914d\u7f6e\u9879\u7b49\u7b49\u3002 \uff082\uff09config.py \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u63d0\u4f9b\u914d\u7f6e\u6587\u4ef6\u8bfb\u53d6\u3001\u52a8\u6001\u83b7\u53d6\u4e00\u4e9b\u5e38\u91cf\uff08\u5982\u9879\u76ee\u6839\u76ee\u5f55\u7edd\u5bf9\u8def\u5f84 (BASE_DIR)\u3001\u7cfb\u7edf\u67b6\u6784\uff08SYS_FRAME\uff09\u3001\u65f6\u95f4\u5b57\u7b26\u4e32\uff08strftime\uff09\u3001\u672c\u673a USERNAME IP \u7b49\u7b49\uff09\u3001\u516c\u5171 URL \u7b49\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u89c4\u8303","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u7248\u672c\u53ca\u4f9d\u8d56","text":"\u57fa\u7840\u6846\u67b6\u4f1a\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u8fdb\u884c\u7248\u672c\u53d1\u5e03\uff0c\u4e0d\u4e0e\u67d0\u4e2a\u5e94\u7528\u7248\u672c\u7ed1\u5b9a\uff0c\u4f46\u662f\uff0c\u5e94\u7528\u5e93\u4f1a\u4f9d\u8d56\u4e8e\u57fa\u7840\u6846\u67b6\u7684\u7248\u672c\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u5efa\u8bae\u5728\u5e94\u7528\u5e93\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a\u6587\u672c\u6587\u4ef6\u7528\u4e8e\u8bb0\u5f55\u6240\u4f9d\u8d56\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\uff0c\u7c7b\u4f3c\u4e8e\u5f00\u53d1\u5e94\u7528\u7684 debian/control \u6587\u4ef6\u7684\u529f\u80fd\uff0c\u4e3a\u4e86\u4fdd\u6301\u7edf\u4e00\uff0c\u8fd9\u4e2a\u6587\u4ef6\u5c31\u547d\u540d\u4e3a control\uff0c\u653e\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u6838\u5fc3\u5e93\u72ec\u7acb\u6027","text":"\u6838\u5fc3\u5e93\u4e0d\u5efa\u8bae\u9488\u5bf9\u67d0\u4e00\u4e2a\u5e94\u7528\u5355\u72ec\u505a\u4ee3\u7801\u4e0a\u7279\u6b8a\u5904\u7406\uff0c\u901a\u5e38\u8003\u8651\u9488\u5bf9\u67d0\u4e00\u79cd\u573a\u666f\u8fdb\u884c\u5904\u7406\uff0c\u8fd9\u4e9b\u573a\u666f\u901a\u5e38\u662f\u5b58\u5728\u4e00\u4e9b\u5171\u6027\u7684\u3002\u6bd4\u5982\u8bf4\uff1a\u684c\u9762\u7684ID\u5206\u914d\u5b58\u5728\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u903b\u8f91\u5904\u7406\u89e3\u51b3ID\u5206\u914d\u9519\u8bef\u7684\u95ee\u9898\uff0c\u4f46\u662f\u8fd9\u90e8\u5206\u903b\u8f91\u6211\u4eec\u4f1a\u5728\u684c\u9762\u7684\u65b9\u6cd5\u5c42\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u517c\u5bb9\u6027","text":"\u4e3a\u4e86\u4fdd\u6301\u517c\u5bb9\u6027\uff0c\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u539f\u5219\u4e0a\u4e0d\u5bf9\u8001\u65b9\u6cd5\u8fdb\u884c\u4fee\u6539\u6216\u5220\u9664\uff0c\u53ea\u8fdb\u884c\u65b0\u589e\u3002\u6d89\u53ca\u5230\u8001\u65b9\u6cd5\u4fee\u6539\u6216\u5220\u9664\u7684\uff0c\u4f1a\u8fdb\u884c\u63d0\u524d\u9884\u544a\uff0c\u5e76\u5728\u7b2c\u4e8c\u4e2a\u7248\u672c\u4e4b\u540e\uff08\u4e2d\u95f4\u4f1a\u9694\u4e00\u4e2a\u7248\u672c\u8fc7\u5ea6\uff09\u6b63\u5f0f\u5b9e\u65bd\u4fee\u6539\u6216\u5220\u9664\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u547d\u540d\u89c4\u8303","text":" \u7528\u4f8b ID \u6bcf\u4e2a\u5e94\u7528\u81ea\u5df1\u7ef4\u62a4\u4e00\u5957 ID\uff0c\u5728PMS\u4e0a\u7528\u4f8b\u6807\u9898\u4e0a\u5c06\u81ea\u52a8\u5316ID\u4ee5\u6807\u7b7e\u7684\u5f62\u5f0f\u5199\u5165\uff0c\u6bd4\u5982\uff1a[101]\u6253\u5f00-\u542f\u52a8\u5e94\u7528\u540edock\u53f3\u952e\u83dc\u5355 \u4e00\u4e2a\u7528\u4f8b\u7c7b\u91cc\u9762\u6709\u591a\u4e2a\u7528\u4f8b\u65f6\uff0c\u5728\u7528\u4f8b\u540d\u79f0\u540e\u9762\u52a0\u5e8f\u53f7\u3002 class TestFileManager(BaseCase):\n\"\"\"\u6587\u7ba1\u7528\u4f8b\"\"\"\ndef test_xxx_015_1(self):\npass\ndef test_xxx_015_2(self):\npass\n \u6ce8\u610f 015_1\uff0c\u4e0d\u8981\u5199015_01\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 PMS \u4e0a\u7684\u7528\u4f8bID\uff1a PMS \u4e0a\u662f6\u4f4d\u6570\uff0c\u4e0d\u591f\u76f4\u89c2\uff0c\u4e5f\u4e0d\u597d\u7ef4\u62a4\uff0c\u5728\u81ea\u52a8\u5316\u4e0b\u9762\u53bb\u627e\u4e00\u4e2a\u5e26\u6709 6 \u4f4d\u6570\u7684\u6587\u4ef6\u662f\u4e00\u4e2a\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 PMS \u4e0a\u7684 ID \u53ef\u80fd\u4f1a\u53d1\u751f\u53d8\u5316\uff0c\u6bd4\u5982\u5bfc\u51fa\u6765\u5bfc\u8fdb\u53bb\u7684\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u5b58\u5728\u95ee\u9898\uff0c\u5982\u679c\u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u8981\u60f3\u627e\u51fa\u6765\u5bf9\u5e94\u4fee\u6539\u81ea\u52a8\u5316\u7528\u4f8b ID\uff0c\u5c06\u4f1a\u662f\u4ef6\u975e\u5e38\u75db\u82e6\u7684\u4e8b\u60c5\u3002 \u51fd\u6570\u547d\u540d\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5de6\u952e\u70b9\u51fb click \u53f3\u952e\u70b9\u51fb right_click \u53cc\u51fb double_click \u79fb\u52a8 move_to \u62d6\u52a8 drag \u65b0\u5efa new \u62d6\u52a8\u5230 drag_to \u4ece\u54ea\u91cc\u62d6\u52a8\u5230\u54ea\u91cc drag_something_from_xxx_to_xxx \u83b7\u53d6 get \u83b7\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5750\u6807 get_location \u975e\u7279\u6b8a\u6587\u4ef6 file word\u6587\u4ef6 doc text\u6587\u4ef6 text \u6587\u4ef6\u5939 dir \u5173\u952e\u8bcd\u6301\u7eed\u589e\u52a0 \u5e38\u91cf\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5e94\u7528\u540d\u79f0 APP_NAME \u5e94\u7528\u63cf\u8ff0 DESC \u672c\u5e94\u7528\u4ee5\u5916\u7684\u5176\u4ed6\u5e94\u7528\uff0c\u6bd4\u5982\u5e2e\u52a9 HELP \u5176\u4ed6\u540d\u79f0\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u65b9\u6cd5\u5305\u540d widget \u65b9\u6cd5\u6587\u4ef6\u540d\uff08\u6587\u7ba1\u4e3e\u4f8b\uff09 dfm_widget.pytitle_widget.pyright_view_widget.pyleft_view_widget.pypop_widget.pybase_widget.pydfm_assert.py \u65ad\u8a00\u8bed\u53e5\u547d\u540d\u89c4\u8303 \u65ad\u8a00\u8bed\u53e5\u90fd\u662f\u4ee5 assert \u5f00\u5934 \u65ad\u8a00 \u8bed\u53e5 \u5224\u65ad\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_existsassert_file_not_exists \u5224\u65ad\u684c\u9762\u76ee\u5f55\u4e0b\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_exists_in_desktopassert_file_not_exists_in_desktop \u5224\u65ad\u56fe\u7247\u5b58\u5728 assert_image_existsassert_image_not_exists \u5224\u65ad\u5f71\u9662\u4e2d\u662f\u5426\u5b58\u5728\u56fe\u7247 assert_image_exists_in_movieassert_image_not_exists_in_movie \u5224\u65ad\u5143\u7d20\u662f\u5426\u5b58\u5728 assert_element_existassert_element_not_exist \u5224\u65ad\u662f\u5426\u76f8\u7b49 assert_equalassert_not_equal \u5224\u65ad\u662f\u5426\u4e3a\u771f assert_trueassert_false"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5fixture","title":"5\u3001fixture \u89c4\u8303","text":"\u7531\u4e8e Pytest \u6846\u67b6\u4e2d\u652f\u6301 fixture \u7684\u5199\u6cd5\u548c Xunit \u5199\u6cd5\u7684\uff0c\u6240\u4ee5\u5e94\u7528\u5e93\u4e2d\u53ef\u80fd\u5b58\u5728\u6df7\u7528\u7684\u60c5\u51b5\uff0c\u4e3a\u7edf\u4e00\u7f16\u7801\u98ce\u683c\u65b9\u4fbf\u540e\u7eed\u7528\u4f8b\u4ee3\u7801\u7ef4\u62a4\uff0c\u73b0\u505a\u4ee5\u4e0b\u89c4\u8303\u8bf4\u660e\uff1a \u629b\u5f03 Xunit \u7684\u5199\u6cd5\uff0c\u7edf\u4e00\u91c7\u7528 Pytest fixture \u7684\u5199\u6cd5\u3002 \u5e94\u7528\u5185 fixture \u8c28\u614e\u4f7f\u7528 autouse=True \uff0c\u975e\u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u975e\u5e38\u4e0d\u5efa\u8bae\u4f7f\u7528\u8fd9\u4e2a\u53c2\u6570\u3002 \u8c03\u7528 fixture \u4e0d\u80fd\u4f7f\u7528 @pytest.mark.usefixture()\uff0c\u4f7f\u7528\u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u4f20\u5165\u51fd\u6570\u5bf9\u8c61\u3002 \u5efa\u8bae\u5728\u4e00\u4e2a conftest.py \u91cc\u9762\u53bb\u5199\uff0c\u4e00\u4e2a\u5e94\u7528\u4e5f\u5c3d\u91cf\u7ef4\u62a4\u4e00\u4e2a conftest.py\u6587\u4ef6\u3002 fixture \u4e5f\u9700\u8981\u5199\u529f\u80fd\u8bf4\u660e\uff0c\u51fd\u6570\u540d\u79f0\u8981\u6709\u5177\u4f53\u542b\u4e49\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#6","title":"6\u3001\u65b9\u6cd5\u7f16\u5199\u89c4\u8303","text":" \u65b9\u6cd5\u7c7b\u578b\uff1a if \u6ca1\u6709\u7528\u5230\u5b9e\u4f8b\u5bf9\u8c61\uff1a\nif \u6ca1\u6709\u7528\u5230\u7c7b\u5bf9\u8c61\uff1a\n\u5199\u9759\u6001\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @staticmethod\nelse\uff1a\n\u5199\u7c7b\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @classmethod\nelse:\n\u76f4\u63a5\u5199\u5b9e\u4f8b\u65b9\u6cd5\n \u4e3e\u4f8b: class TitleWidget:\ndef click_xxx_by_ui(self):\npass\n@staticmethod\ndef click_xxx_by_ui():\npass\n@classmethod\ndef click_xxx_by_ui(cls):\npass\n \u51fd\u6570\u540d\u79f0\u4e0d\u51fa\u73b0\u6570\u5b57\uff0c\u9700\u8981\u8868\u793a\u6570\u91cf\u7684\u7528\u5355\u8bcd\u8868\u793a\u3002 \u51fd\u6570\u529f\u80fd\u6ce8\u91ca\u3002 \u6ca1\u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg2:xxx\n\"\"\"\n \u6709\u53c2\u6570\uff0c\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg1:xxx\nreturn: xxx\n\"\"\"\n \u200b \u7528 Pycharm \u7684\u6ce8\u91ca\u6a21\u677f\u4e5f\u53ef\u4ee5\uff0c\u53ea\u8981\u4f53\u73b0\u4e86\u53c2\u6570\u7684\u7c7b\u578b\u548c\u8fd4\u56de\u5c31\u884c\u4e86\u3002 \u6682\u4e0d\u8981\u6c42\u5199\u7c7b\u578b\u6ce8\u89e3\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#7case","title":"7\u3001\u7528\u4f8b\uff08case\uff09\u89c4\u8303","text":" \u4ee5\u7c7b\u7684\u5f62\u5f0f\u5199\u7528\u4f8b\uff0c\u7528\u4f8b\u7c7b\u96c6\u6210\u7528\u4f8b\u57fa\u7c7b\u3002 \u7528\u4f8b\u7c7b\u9700\u8981\u5199\u6ce8\u91ca\u3002 \u6d4b\u8bd5\u7528\u4f8b\u51fd\u6570\u8bf4\u660e\uff08\u5efa\u8bae\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u540d\u79f0\uff09 \"\"\"\u53f3\u4fa7\u9884\u89c8-\u56fe\u7247\u7c7b\u578b\u4fe1\u606f\u680f\u57fa\u672c\u4fe1\u606f\"\"\"\n \u4e0d\u5199\u8c03\u8bd5\u4ee3\u7801 if __name__ == '__main__':\npytest.main()\n \u6240\u6709\u7528\u4f8b\u90fd\u7ee7\u627f BaseCase\u3002 BaseCase \u91cc\u9762\u653e\u4e00\u4e9b\u6d4b\u8bd5\u6570\u636e\u7684\u5e38\u91cf\uff0c\u6bd4\u5982\u6587\u4ef6\u540d\u79f0\uff0c\u5e94\u7528\u540d\u79f0\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u4e00\u4e9b\u901a\u7528\u7684\u5b57\u7b26\u4e32\u3002 \u8fd9\u7c7b\u662f\u5c5e\u4e8e\u6d4b\u8bd5\u6570\u636e\u3002 class BaseCase(DfmAssert):\n\"\"\"\u7528\u4f8b\u57fa\u7c7b\"\"\"\nNEW_FILE = \"\u65b0\u5efa\u6587\u672c.txt\"\nTEST_FILE = \"test.txt\"\nNEW_DIR = \"\u65b0\u5efa\u6587\u4ef6\u5939\"\nNEW_WORD = \"\u65b0\u5efaWord\u6587\u6863.doc\"\nAPP_HELP = \"damn\"\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\n\"\"\"\u7528\u4f8b\u6807\u9898\uff08\u590d\u5236PMS\u4e0a\u7528\u4f8b\u6807\u9898\uff09\"\"\"\ndfm = DfmWidget()\ndfm.click_xxx_by_attr(self.NEW_FILE)\ndfm.new_file_in_desktop_by_cmd(self.NEW_FILE)\nself.assert_true(dfm.get_process_status(self.APP_NAME))\n \u7528\u4f8b\u91cc\u9762\u5c3d\u91cf\u51cf\u5c11\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\uff0c\u66f4\u8981\u51cf\u5c11\u76f8\u540c\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\u3002 \u7edf\u4e00\u6587\u4ef6\u6ce8\u91ca\u5934\u3002 #!/usr/bin/env python3\n# _*_ coding:utf-8 _*_\n\"\"\"\n:Author:email@uniontech.com\n:Date :${DATE} ${TIME}\n\"\"\"\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#8","title":"8\u3001\u5176\u4ed6\u89c4\u8303","text":" \u65e5\u5fd7\u6253\u5370\u8981\u5728\u65b9\u6cd5\u6700\u524d\u9762\uff0c\u5426\u5219\u4ee3\u7801\u62a5\u9519\u6ca1\u6709\u65e5\u5fd7\u8f93\u51fa\uff0c\u4e0d\u597d\u5b9a\u4f4d\u95ee\u9898\u3002\uff08\u6211\u4eec\u4f1a\u8003\u8651\u7ee7\u7eed\u4f7f\u7528\u62e6\u622a\u5668\u6253\u5370\u65e5\u5fd7\uff09 \u6240\u6709\u7684\u64cd\u4f5c\u90fd\u9700\u8981\u6709\u65e5\u5fd7\uff0c\u5305\u62ec sleep()\uff0c\u6211\u4eec\u4f1a\u91cd\u5199\u4e00\u4e2a\u6709\u65e5\u5fd7\u8f93\u5165\u7684 sleep\u3002 \u4e1a\u52a1\u5c42\u65e5\u5fd7\u7ea7\u522b\u4e3a INFO\u3002 hook \u51fd\u6570\u53ea\u80fd\u5199\u5230\u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u91cc\u9762\u3002 apps \u76ee\u5f55\u4e0b\u7684 conftest.py \u539f\u5219\u4e0a\u4e0d\u4f1a\u65b0\u589e fixture\u3002 \u56fa\u5b9a\u76ee\u5f55\u6216\u5143\u7d20\u63a7\u4ef6\u7684\u64cd\u4f5c\uff0c\u5c06\u64cd\u4f5c\u65b9\u6cd5\u5199\u6b7b\uff0c\u6587\u4ef6\u7c7b\u64cd\u4f5c\u5c06\u6587\u4ef6\u540d\u7559\u53c2\u6570\u3002 \u8def\u5f84\u62fc\u63a5\u89c4\u8303\uff1a \u7cfb\u7edf\u4e2d\u56fa\u5b9a\u76ee\u5f55\uff0c\u8def\u5f84\u62fc\u63a5\u65f6\u4f7f\u7528\u6ce2\u6d6a\u7b26\u53f7\uff0c\u6bd4\u5982\uff1a~/Desktop/\uff0c\u4e0b\u5c42\u4f7f\u7528 os.path.expanduser()\uff0c\u5b83\u53ef\u4ee5\u81ea\u52a8\u8bc6\u522b\u6ce2\u6d6a\u7b26\u53f7\u3002 \u9879\u76ee\u4e0b\u8def\u5f84\u4f7f\u7528\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u8def\u5f84\uff0c\u6bd4\u5982\uff1aConfig.BASE_PATH\uff0c\u56e0\u4e3a\u9879\u76ee\u662f\u53ef\u4ee5\u5728\u4efb\u610f\u8def\u5f84\u8fd0\u884c\u7684\uff0c\u9700\u8981\u52a8\u6001\u62fc\u63a5\u8def\u5f84\u3002 "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848","text":"# =================================================\n# Author : Mikigo\n# Time : 2022/3/16\n# version \uff1a1.0\n# =================================================\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"AT \u5e94\u7528\u5e93\u6539\u9020\u662f\u57fa\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u8fdb\u884c\u7528\u4f8b\u65b9\u6cd5\u548c\u4e1a\u52a1\u903b\u8f91\u7684\u91cd\u65b0\u8bbe\u8ba1\uff0c\u4ee5\u5b9e\u73b0\u5e94\u7528\u5e93\u9ad8\u6548\u7684\u7f16\u5199\u3001\u7ef4\u62a4\u7528\u4f8b\u53ca\u5176\u65b9\u6cd5\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u6587\u4ef6\u7ba1\u7406\u5668\u4ece\u4e1a\u52a1\u590d\u6742\u5ea6\u548c\u7528\u4f8b\u91cf\u6765\u8bb2\uff0c\u5728\u7cfb\u7edf\u6240\u6709\u5e94\u7528\u4e2d\uff0c\u662f\u5f88\u6709\u4ee3\u8868\u6027\u7684\uff0c\u96be\u5ea6\u4e5f\u662f\u6700\u5927\u7684\uff0c\u56e0\u6b64\u6211\u4eec\u9009\u53d6\u6587\u4ef6\u7ba1\u7406\u5668\u4f5c\u4e3a\u5e94\u7528\u5e93\u6539\u9020\u7684\u5b9e\u9a8c\u5e94\u7528\uff0c\u7ed9\u540e\u7eed\u5176\u4ed6\u5e94\u7528\u6539\u9020\u63d0\u4f9b\u5207\u5b9e\u53ef\u884c\u7684\u601d\u8def\u548c\u65b9\u6848\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u5206\u5c42\u8bbe\u8ba1\u56fe","text":"\u6574\u4f53\u4ecd\u7136\u9075\u5faa PO \u8bbe\u8ba1\u7406\u5ff5\uff0c\u6839\u636e\u4e1a\u52a1\u9700\u8981\uff0c\u5c06\u6587\u7ba1\u4e1a\u52a1\u5c42\u8fdb\u884c 3 \u5c42\u5212\u5206\uff1a "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-dde-file-manager # \u5e94\u7528\u4ed3\u5e93\n\u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 test_xxx_001.py\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u00a0\u251c\u2500\u2500 __init__.py\n\u2502 \u00a0\u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u00a0\u251c\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u00a0\u251c\u2500\u2500 base_widget.py # \u65b9\u6cd5\u57fa\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 title_widget.py # title \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 right_view_widget.py # right view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 left_view_widget.py # left view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 pop_widget.py # pop \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 dfm_widget.py # \u65b9\u6cd5\u7684\u7edf\u4e00\u51fa\u53e3\n\u2502 \u00a0\u2514\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 tag # \u7528\u4f8b\u6807\u7b7e\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 xxx.csv # \u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2514\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u57fa\u7c7b","text":" \u7ee7\u627f\u6838\u5fc3\u5c42\u7684\u5404\u4e2a\u6a21\u5757\u7c7b\u3002 \u62bd\u53d6\u64cd\u4f5c\u5c42\u7684\u4e00\u4e9b\u57fa\u7840\u65b9\u6cd5\u3002 \u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u7684\u4e00\u4e9b\u516c\u5171\u65b9\u6cd5\u3002 \u8def\u5f84\u7ec4\u88c5\u65b9\u6cd5\u3002 \u4e00\u4e9b\u4e1a\u52a1\u5c42\u76f8\u5173\u7684\u53d8\u91cf\u3001\u5e38\u91cf\u3001shell\u547d\u4ee4\u3001\u5750\u6807\u3002 \u65b9\u6cd5\u57fa\u7c7b\u7684\u5199\u6cd5\uff1a from src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u64cd\u4f5c\u5c42","text":" \u6a21\u5757\u5212\u5206 \u6309\u7167\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u6587\u7ba1\u4e3b\u754c\u9762\u5206\u4e3a\u4e09\u4e2a\u533a\u57df\uff1a\u6807\u9898\u680f\u3001\u53f3\u8fb9\u89c6\u56fe\u533a\u57df\u3001\u5de6\u8fb9\u89c6\u56fe\u533a\u57df \u5f39\u7a97\uff1a\u8bbe\u7f6e\u754c\u9762\u5f39\u7a97\u3001\u4fdd\u9669\u7bb1\u5f39\u7a97\u3001\u5220\u9664\u786e\u8ba4\u5f39\u7a97\u3001\u53ca\u5404\u79cd\u7f51\u7edc\u5f39\u7a97 \u53f3\u952e\u83dc\u5355\uff1a\u6682\u65f6\u4e0d\u8003\u8651\u4e3a\u5355\u72ec\u7684\u6a21\u5757\uff0c\u8003\u8651\u4ee5\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6848\u505a\u6210\u516c\u5171\u5e93\u3002 \u5404\u4e2a\u6a21\u5757\u53ea\u7ee7\u627f\u57fa\u7c7b from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u6784\u9020\u51fd\u6570\u91cc\u9762\u4e0d\u6784\u9020\u5bf9\u8c61\uff0c\u53ef\u4ee5\u521d\u59cb\u5316\u4e00\u4e9b\u53d8\u91cf\u3002 \u4e0d\u540c\u7684\u5b9a\u4f4d\u65b9\u6848\u8c03\u7528\u4e0d\u540c\u7684\u5b9a\u4f4d\u5de5\u5177\u5bf9\u8c61\u3002 self.dog\nself.ui\nself.d_bus\n \u65b9\u6cd5\u7f16\u5199 \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u5e94\u7528\u5c42","text":" \u7ee7\u627f\u64cd\u4f5c\u5c42\u7684\u6240\u6709\u7c7b\u3002 \u4ec5\u4ec5\u7528\u4e8e\u7528\u4f8b\u4e2d\u5bfc\u5165\u65b9\u4fbf\uff0c\u4e0d\u505a\u5176\u4ed6\u4e8b\u60c5\u3002 class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n DfmAssert \u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u7ee7\u627f\uff0c\u65b9\u4fbf\u4f7f\u7528\u65ad\u8a00\u8bed\u53e5\u3002 from apps.dde_file_manager.widget.dfm_widget import DfmWidget\nfrom public.assert import Assert\nclass DfmAssert(Assert):\ndef assert_file_exists_in_desktop(self, file_name):\nself.assert_file_exists(f\"~/Desktop{file_name}\")\n...\nDfmWidget().get_file_in_desktop()\n \u7528\u4f8b\u91cc\u9762\u76f4\u63a5\u7ee7\u627f\uff0c\u65b9\u4fbf\u5728\u7528\u4f8b\u91cc\u9762\u4f7f\u7528 self \u8fdb\u884c\u65ad\u8a00\uff0c\u66f4\u7b26\u5408\u65ad\u8a00\u7684\u4f7f\u7528\u4e60\u60ef\uff0c\u7528\u4f8b\u903b\u8f91\u4e0a\u66f4\u6e05\u695a\u3002 class BaseCase(DfmAssert):\npass\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\nself.assert_file_exists_in_desktop(\"xxx\")\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u903b\u8f91\u4e3e\u4f8b","text":"\u7528\u4f8b\u4ee3\u7801\u8c03\u7528\u903b\u8f91\u4e3e\u4f8b\uff1a # BaseWidget\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n# =============================================\n# TitleWidget\nclass TitleWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_title_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# RightViewWidget\nclass RightViewWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_right_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# =============================================\n# \u51fa\u53e3 DfmWidget\nclass DfmWidget(TitleWidget, RightViewWidget):\npass\n# =============================================\n# in case\nfrom apps.dde_file_manager.widget.dfm_widget import DfmWidget\ndfm = DfmWidget()\ndfm.click_xxx_title_by_ui()\ndfm.click_xxx_right_by_ui()\ndfm.dog.print_desc()\ndfm.ui.print_number()\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u5de5\u7a0b\u6539\u9020\u5b9e\u65bd\u6b65\u9aa4","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_2","title":"1\u3001\u5de5\u7a0b\u4ee3\u7801\u62c9\u53d6","text":"1.1. \u5c06\u81ea\u52a8\u5316\u57fa\u7840\u6846\u67b6\u7684\u529f\u80fd\u62c9\u5230\u672c\u5730 Autotest Basic Frame \uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame 1.2. \u5c06\u5e94\u7528\u5e93\u4ee3\u7801\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u5e94\u7528\u5e93\u7684\u4ed3\u5e93\u547d\u540d\u5e94\u8be5\u662f\u957f\u8fd9\u6837\u7684 autotest_deepin_xxx\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_2","title":"2\u3001\u8c03\u6574\u5de5\u7a0b\u76ee\u5f55","text":"\u6309\u7167 \u65b9\u6848\u8bbe\u8ba1-\u76ee\u5f55\u7ed3\u6784 \u8fdb\u884c\u76ee\u5f55\u8c03\u6574\uff0c\u5c3d\u91cf\u4f7f\u7528\u7f16\u8f91\u5668\u8fdb\u884c\u76f8\u5e94\u7684\u8c03\u6574\uff0c\u7f16\u8f91\u5668\u63a8\u8350\u4f7f\u7528 Pycharm \uff0c\u4ee5\u4e0b\u64cd\u4f5c\u5747\u5728 Pycharm \u91cc\u9762\u53ef\u5b9e\u73b0\u3002 2.1. \u9700\u8981\u79fb\u52a8 py \u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u76f4\u63a5\u5728\u7f16\u8f91\u5668\u91cc\u9762\uff0c\u4f7f\u7528\u9f20\u6807\u9009\u4e2d\u5e76\u6309\u4f4f\uff0c\u4e4b\u540e\u62d6\u52a8\u5230\u76ee\u6807\u4f4d\u7f6e\u5373\u53ef\uff0cPycharm \u4f1a\u5c3d\u53ef\u80fd\u7684\u81ea\u52a8\u89e3\u51b3\u79fb\u52a8\u5bfc\u81f4\u7684\u8def\u5f84\u95ee\u9898\u3002\u6ce8\u610f\uff0c\u6211\u8bf4\u7684\u662f\u201c\u5c3d\u53ef\u80fd\u201d\uff0c\u6709\u4e9b\u9a9a\u64cd\u4f5c\u7f16\u8f91\u5668\u662f\u65e0\u6cd5\u81ea\u52a8\u5904\u7406\u7684\u3002\u5982\u679c\u6ca1\u6709\u88ab\u7f16\u8f91\u5668\u81ea\u52a8\u5904\u7406\u7684\u8def\u5f84\u95ee\u9898\uff0c\u540e\u7eed\u53ea\u80fd\u624b\u52a8\u89e3\u51b3\u3002 2.2. \u9700\u8981\u91cd\u547d\u540d\u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u5728\u7f16\u8f91\u5668\u91cc\u9762\u9009\u4e2d\u6587\u4ef6\uff0c\u7136\u540e\u4f7f\u7528\u5feb\u6377\u952e Shift + F6 \uff08\u5982\u679c\u5feb\u6377\u952e\u6ca1\u53cd\u5e94\uff0c\u6587\u4ef6\u53f3\u952e\u83dc\u5355 Refactor \u2014\u2014 Rename\uff09\uff0c\u7136\u540e\u5728\u8f93\u5165\u6846\u4e2d\u8f93\u5165\u8981\u91cd\u547d\u540d\u7684\u540d\u79f0\uff0c\u540c\u65f6\uff0c\u786e\u8ba4\u52fe\u9009 Search for references \u548c Search in comments and strings \u8fd9\u4e24\u4e2a\u9009\u9879\uff0c\u6700\u540e\u6309\u56de\u8f66\u6216\u8005\u9f20\u6807\u70b9 Refactor \u3002 \u6ce8\u610f\uff0c\u6b64\u65f6\u7f16\u8f91\u5668\u53ef\u80fd\u4f1a\u63d0\u793a\u4f60\uff0c\u4f60\u8fd9\u4e2a\u91cd\u547d\u540d\u7684\u64cd\u4f5c\u5173\u8054\u4e86\u591a\u4e2a\u6a21\u5757\uff0c\u5b83\u88ab\u591a\u4e2a\u5730\u65b9\u90fd\u4f7f\u7528\u5230\u4e86\uff0c\u76f8\u5173\u7684\u6a21\u5757\u662f\u5426\u4e5f\u4e00\u8d77\u6539\u540d\u4e86\uff0c\u8fd9\u4e0d\u5e9f\u8bdd\u5417\uff0c\u7528\u8fd9\u4e2a\u529f\u80fd\u5c31\u662f\u60f3\u628a\u5173\u8054\u5230\u7684\u90fd\u4fee\u6539\uff0c\u4e0d\u7136\u6211\u4e3a\u4ec0\u4e48\u4e0d\u7528\u6587\u7ba1\u7684\u91cd\u547d\u540d\u529f\u80fd\u5462\uff0c\u522b\u60f3\u4e86\uff0c\u76f4\u63a5\u70b9\u5de6\u4e0b\u89d2\u7684 Refactor \u6309\u94ae\uff0c\u5c31\u662f\u5e72\u3002 \u7c7b\u540d\u3001\u51fd\u6570\u540d\u7684\u91cd\u547d\u540d\u90fd\u5c3d\u91cf\u91c7\u7528\u8fd9\u79cd\u65b9\u6848\uff0c\u56e0\u4e3a\u7f16\u8f91\u5668\u4f1a\u81ea\u52a8\u7ed9\u6211\u4eec\u627e\u5230\u5173\u8054\u7684\u5730\u65b9\uff0c\u7136\u540e\u540c\u6b65\u4fee\u6539\u6389\u3002\u4f60\u53ef\u5343\u4e07\u522b\u76f4\u63a5\u5220\u4e86\u4fee\u6539\u540d\u79f0\uff0c\u4e0d\u7136\u4f60\u53ef\u80fd\u4f1a\u82b1\u4e0a\u4e00\u5929\u7684\u65f6\u95f4\u6765\u89e3\u51b3\u91cd\u547d\u540d\u7684\u95ee\u9898\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u5b9e\u73b0\u6838\u5fc3\u5e93\u63a5\u53e3","text":"3.1. BaseWidget \u5728 BaseWidget \u91cc\u9762\u628a\u8be5\u5199\u7684\u90fd\u5199\u597d\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u4e0a\u9762\u7684\u8bbe\u8ba1\u7406\u5ff5\u6765\u5199\u3002 \u5982\u679c\u4f60\u5acc\u9ebb\u70e6\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u6587\u7ba1\u7684\u5b9e\u9645\u5de5\u7a0b\u4ee3\u7801 autotest_dde_file_manager : https://gerrit.uniontech.com/admin/repos/autotest_dde_file_manager \u3002 3.2. \u64cd\u4f5c\u5c42 \u5982\u679c\u4f60\u662f\u65b0\u5199\u9879\u76ee\uff0c\u4f60\u4f1a\u53d1\u73b0\u4e00\u5207\u90fd\u662f\u90a3\u4e48\u7684\u7b80\u5355\u3001\u76f4\u63a5\uff0c\u6309\u7167\u6211\u4eec\u63d0\u4f9b\u7ed9\u4f60\u7684\u63a5\u53e3\u5199\u7528\u4f8b\u7684\u64cd\u4f5c\u65b9\u6cd5\u5c31\u597d\u4e86\u3002 \u5982\u679c\u4f60\u662f\u60f3\u5bf9\u539f\u6765\u7684\u5de5\u7a0b\u8fdb\u884c\u6539\u9020\uff0c\u4f60\u9700\u8981\u6309\u7167\u6838\u5fc3\u5e93\u65b9\u6cd5\u7684\u8c03\u7528\uff0c\u5c06\u4f60\u4e4b\u524d\u5199\u7684\u6bcf\u4e2a\u65b9\u6848\u8fdb\u884c\u5bf9\u5e94\u7684\u4fee\u6539\uff0c\u5305\u62ec\u7c7b\u548c\u65b9\u6cd5\u7684\u547d\u540d\u3001\u65b9\u6cd5\u5185\u6240\u8981\u7528\u5230\u4e0d\u540c\u5b9a\u4f4d\u65b9\u6cd5\u7684\u5199\u6cd5\u4fee\u6539\u3002 \u8fd9\u65f6\u5019\u4f60\u53ef\u80fd\u4f60\u7684\u4ee3\u7801\u4e2d\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u62a5\u9519\uff0c\u4e0d\u7528\u62c5\u5fc3\uff0c\u4f60\u53ef\u4ee5\u4ece\u4e1a\u52a1\u903b\u8f91\u51fa\u53d1\uff0c\u60f3\u6e05\u695a\u8fd9\u4e2a\u65b9\u6cd5\u662f\u5e72\u4ec0\u4e48\u7684\u3001\u64cd\u4f5c\u7684\u5bf9\u8c61\u662f\u4ec0\u4e48\u3001\u53c2\u6570\u662f\u4ec0\u4e48\uff0c\u6ce8\u610f\u8fd9\u4e9b\u4fee\u6539\u662f\u4f1a\u5f71\u54cd\u5230\u7528\u4f8b\u4ee3\u7801\u91cc\u9762\u7684\uff0c\u6ca1\u5173\u7cfb\uff0c\u7528\u4f8b\u91cc\u9762\u672c\u6765\u4e5f\u5e94\u8be5\u88ab\u5173\u8054\u4fee\u6539\u3002 3.3. \u628a\u914d\u7f6e\u6a21\u5757\u5199\u597d\uff0c\u8fd9\u90e8\u5206\u57fa\u672c\u53ef\u4ee5\u590d\u5236\u6587\u7ba1\u7684\u4ee3\u7801\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4_1","title":"4\u3001\u8def\u5f84\u5904\u7406","text":"4.1. \u5bfc\u5165\u8def\u5f84 \u65b9\u6cd5\u548c\u7528\u4f8b\u4e2d\u90fd\u4f1a\u6d89\u53ca\u5230\u5bfc\u5165\u8def\u5f84\u7684\u4fee\u6539\uff0c\u5728\u4fee\u6539\u8def\u5f84\u65f6\uff0c\u5efa\u8bae\u4f60\u4f7f\u7528 Ctrl + Shift + R \u5168\u5c40\u66ff\u6362\uff0c\u4f1a\u5c06\u6574\u4e2a\u9879\u76ee\u4e0b\u7684\u76f8\u540c\u5730\u65b9\u90fd\u4fee\u6539\u5230\uff0c\u5f53\u7136\uff0c\u4f60\u4e5f\u53ef\u4ee5\u5728\u5c0f\u5f39\u7a97\u4e2d\u4fee\u6539\u5168\u5c40\u66ff\u6362\u4e3a\u5c40\u90e8\u76ee\u5f55\u4e0b\u66ff\u6362\u3002\u5904\u7406\u90a3\u79cd\u6ca1\u6709\u5173\u8054\u5173\u7cfb\uff0c\u4f46\u662f\u53c8\u662f\u76f8\u540c\u540d\u79f0\u7684\u91cd\u547d\u540d\uff0c\u6211\u4e5f\u63a8\u8350\u4f7f\u7528\u8fd9\u79cd\u65b9\u5f0f\u8fdb\u884c\u91cd\u547d\u540d\u3002 \u6ce8\u610f\uff0c\u5168\u5c40\u66ff\u6362\u7684\u65b9\u5f0f\u4efb\u7136\u65e0\u6cd5\u4fdd\u8bc1\u771f\u7684\u5168\u5c40\u88ab\u66ff\u6362\u4e86\uff08\u53ef\u80fd\u662f\u7f16\u8f91\u5668\u7684 Bug \u5427\uff09\uff0c\u6240\u4ee5\u4f60\u4ecd\u7136\u9700\u8981\u624b\u52a8\u770b\u4e0b\u5404\u5904\u662f\u5426\u4fee\u6539\u5230\u4f4d\u3002 4.2. \u8d44\u6e90\u8def\u5f84 \u4e00\u4e9b\u7528\u4f8b\u8d44\u6e90\u9700\u8981\u6839\u636e config.py \u91cc\u9762\u7684\u8def\u5f84\u914d\u7f6e\u8fdb\u884c\u8d44\u6e90\u8def\u5f84\u7684\u62fc\u63a5\uff0c\u5982\u679c\u4f60\u539f\u6765\u672c\u6765\u5c31\u6709\u4e00\u4e2a\u51fd\u6570\u4e13\u95e8\u7528\u4e8e\u7ec4\u88c5\u8def\u5f84\u7684\uff0c\u90a3\u4f60\u53ea\u9700\u8981\u4fee\u6539\u8fd9\u4e00\u4e2a\u5730\u65b9\u5c31\u597d\u4e86\uff0c\u5982\u679c\u4f60\u4e4b\u524d\u5e76\u6ca1\u6709\u8fd9\u6837\u7684\u8bbe\u8ba1\uff0c\u90a3\u53ef\u80fd\u9700\u8981\u4fee\u6539\u5927\u91cf\u6d89\u53ca\u5230\u8d44\u6e90\u8def\u5f84\u7684\u5730\u65b9\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5","title":"5\u3001\u8c03\u8bd5\u548c\u7f16\u5199\u7528\u4f8b","text":"\u4ee5\u4e0a\u51e0\u4e2a\u6b65\u9aa4\u505a\u5b8c\uff0c\u57fa\u672c\u5c31\u53ef\u4ee5\u8fdb\u884c\u7528\u4f8b\u4ee3\u7801\u7684\u8c03\u8bd5\u4e86\uff0c\u8fd9\u90e8\u5206\u5de5\u4f5c\u4e3b\u8981\u89e3\u51b3\u4f60\u4e4b\u524d\u51e0\u4e2a\u6b65\u9aa4\u9057\u6f0f\u7684\u95ee\u9898\uff0c\u5982\u679c\u6240\u6709\u7528\u4f8b\u90fd\u8c03\u8bd5\u901a\u8fc7\u4e86\uff0c\u90a3\u4e48\u5de5\u7a0b\u6539\u9020\u5c31\u5168\u90e8\u5b8c\u6210\u4e86\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/","title":"AT \u5f00\u53d1\u89c4\u8303","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u5f00\u53d1\u89c4\u8303\u662f\u6839\u636e\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fd0\u884c\u4e24\u5e74\u591a\u6765\uff0c\u9047\u5230\u95ee\u9898\u89e3\u51b3\u95ee\u9898\u800c\u5f62\u6210\u7684\u4e00\u4e9b\u89e3\u51b3\u65b9\u6848\uff0c\u6216\u8005\u8bf4\u7ecf\u9a8c\u603b\u7ed3\uff1b\u8fd9\u4e9b\u7ecf\u9a8c\u7b26\u5408\u6211\u4eec\u73b0\u9636\u6bb5 AT \u6240\u5e94\u7528\u7684\u573a\u666f\u9700\u8981\uff0c\u4e5f\u662f\u6211\u4eec\u7ecf\u8fc7\u957f\u671f\u601d\u8003\uff0c\u4e0d\u65ad\u8bd5\u9519\u4e0d\u65ad\u4fee\u6b63\uff0c\u5e76\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u5b9e\u8df5\u4e2d\u68c0\u9a8c\u8fc7\u53ef\u884c\u7684\u3002\u4ee5\u6b64\uff0c\u5e0c\u671b\u80fd\u5e2e\u52a9\u53c2\u4e0e\u5230\u81ea\u52a8\u5316\u7684\u76f8\u5173\u4eba\u5458\u51cf\u5c11\u8bd5\u9519\u6210\u672c\uff0c\u66f4\u597d\u3001\u66f4\u5feb\u7684\u7f16\u5199\u7528\u4f8b\u53ca\u7ef4\u62a4\u7528\u4f8b\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_1","title":"\u4e00\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u89c4\u8303","text":"\u6807\u7b7e\u5316\u7ba1\u7406\u6587\u6863\u8bf7\u53c2\u8003\uff1a \u300a\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u64cd\u4f5c\u6307\u5f15\u300b \u4ee5\u4e0b\u8bf4\u51e0\u4e2a\u5bb9\u6613\u51fa\u73b0\u7684\u95ee\u9898\uff1a"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1","title":"1. \u5bf9\u5e94\u5173\u7cfb","text":" \u5199\u5b8c\u81ea\u52a8\u5316\u7528\u4f8b\u4e4b\u540e\uff0c\u8bf7\u5728 CSV \u6587\u4ef6\u4e2d\u6807\u8bb0\u7528\u4f8b\u7684 ID\u3001\u7b49\u7ea7\u3002\u4e3a\u4e86\u63d0\u9192\u6807\u8bb0\uff0c\u6267\u884c\u7528\u4f8b\u65f6\u5728\u9996\u884c\u4f1a\u8f93\u51fa ERROR \u65e5\u5fd7\uff1a CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94\u7684 ID\uff1b \u5728\u6700\u7ec8\u63d0\u4ea4\u4ee3\u7801\u4e4b\u524d\uff0c\u4f60\u9700\u8981\u5728 CSV \u6587\u4ef6\u91cc\u9762\u5c06ID\u3001\u7528\u4f8b\u7b49\u7ea7\u7b49\u6807\u7b7e\u8865\u5168\uff0c\u5982\u679c CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94 ID\uff0c\u540e\u7eed\u5728\u6279\u91cf\u6267\u884c\u7684\u65f6\u5019\uff0c\u8fd9\u4e9b\u7528\u4f8b\u662f\u4e0d\u4f1a\u6267\u884c\u7684\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2","title":"2. \u540d\u79f0\u4e00\u81f4","text":" CSV \u6587\u4ef6\u7684\u6587\u4ef6\u540d\u3001\u7528\u4f8b\u51fd\u6570\u4e2d\u95f4\u7684\u540d\u79f0\u4e00\u81f4\u3001\u7528\u4f8b py \u6587\u4ef6\u4e2d\u95f4\u7684\u540d\u79f0\uff0c\u8fd9\u4e09\u4e2a\u540d\u79f0\u4e00\u81f4\u3002 \u4e3e\u4f8b\uff1a # test_music_001.py\ndef test_music_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u90a3\u4e48 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e3a music.csv\u3002 AT \u6846\u67b6\u5e95\u5c42\u4ee3\u7801\u5b9e\u73b0\u662f\u5c06 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e0e\u7528\u4f8b\u51fd\u6570\u540d\u79f0\u540d\u79f0\uff08item.name\uff09\u8fdb\u884c\u5bf9\u5e94\uff0c\u56e0\u6b64\uff0c\u6ce8\u610f CSV \u6587\u4ef6\u540d\u79f0\u5bf9\u5e94\u7684\u662f\u7528\u4f8b\u51fd\u6570\u540d\u79f0\uff0c\u5373 def test_music_001 \u91cc\u9762\u7684 music \uff0c\u800c\u4e0d\u662f test_music_001.py \u91cc\u9762\u7684 music \u3002 \u8fd9\u91cc\u7ec6\u7ec6\u54c1\u4e00\u4e0b\u54c8~ \u5982\u679c\u4f60\u5c06\u4e0a\u4f8b\u5199\u6210\u4e86\u8fd9\u6837: # test_music_001.py\ndef test_movie_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u7528\u4f8b\u6267\u884c\u6ca1\u95ee\u9898\uff0c\u4f46\u662f\u6807\u7b7e\u5316\u7ba1\u7406\u662f\u4e0d\u751f\u6548\u7684\uff0c\u6846\u67b6\u65e0\u6cd5\u5c06 music.csv\u6587\u4ef6\u91cc\u9762\u6807\u7b7e\uff0c\u6dfb\u52a0\u5230 test_movie_001\u8fd9\u4e2a\u7528\u4f8b\u4e2d\uff0c\u56e0\u4e3a\u4ed6\u4eec\u6ca1\u6709\u5bf9\u5e94\u5173\u7cfb\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#tag","title":"\u4e8c\u3001\u5206\u652f\u53ca tag \u7ba1\u7406\u89c4\u8303","text":"\u53c2\u8003\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u4ee3\u7801\u7ba1\u7406\u89c4\u8303\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2-tag","title":"2. \u5e94\u7528\u5e93 tag","text":" \u5e94\u7528\u5e93 tag \u6839\u636e\u5e94\u7528\u4ea4\u4ed8\u8282\u70b9\u751f\u6210\uff0c\u6bcf\u6b21\u6253 tag \u4e4b\u524d\uff0c\u76f8\u5173\u6d4b\u8bd5\u4eba\u5458\u9700\u8981\u8fdb\u884c\u7528\u4f8b\u8c03\u8bd5\uff1b \u8c03\u8bd5\u7528\u4f8b\u662f\u6307\u7684\u5728\u5168\u67b6\u6784\uff08x86\u3001arm\u3001mips\uff09\u4e0a\u8c03\u8bd5\u901a\u8fc7\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\u8fbe\u5230 90% \u4ee5\u4e0a\u624d\u80fd\u6253 tag\uff0c\u901a\u8fc7 Jenkins \u6267\u884c\u5668\u6267\u884c\u7528\u4f8b\uff0c\u4fdd\u7559\u901a\u8fc7\u7387\u7ed3\u679c\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\uff1a\u901a\u8fc7\u7528\u4f8b\u6570 / (\u603b\u7528\u4f8b\u6570 - \u5df2\u5e9f\u5f03\u7528\u4f8b) \u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u7b97\u901a\u8fc7 Jenkins \u6267\u884c\u5668 \u4f60\u53ef\u80fd\u4f1a\u5728\u4e00\u4e2a\u4ea4\u4ed8\u5468\u671f\u5185\u6301\u7eed\u7684\u8fdb\u884cAT\u7528\u4f8b\u8c03\u8bd5\uff0c\u4f46\u662f\u6700\u7ec8 AT \u7528\u4f8b\u6253 tag \u7684\u5e94\u7528\u7248\u672c\uff0c\u9700\u8981\u4f7f\u7528\u5e94\u7528\u96c6\u6210\u4ea4\u4ed8\u7684\u6700\u65b0\u5e94\u7528\u7248\u672c\uff0c\u53ef\u4ee5\u4f7f\u7528\u5e94\u7528\u7684\u63d0\u6d4b\u7248\u672c\uff1b\u4e00\u5b9a\u8981\u786e\u4fdd\u8c03\u8bd5\u7528\u4f8b\u7684\u5e94\u7528\u7248\u672c\u662f\u6700\u65b0\u7684\uff0c\u4e0d\u7136\u96c6\u6210\u8fdb\u53bb\u4e4b\u540e\uff0c\u6301\u7eed\u96c6\u6210\u5c31\u4f1a\u51fa\u95ee\u9898\uff1b tag \u53f7\u600e\u4e48\u6253\uff1f \u6839\u636e\u6301\u7eed\u96c6\u6210\u7684\u8981\u6c42\u751f\u6210\uff0c\u5176\u4e2d\u5e94\u7528\u7248\u672c\u53f7\u9700\u8981\u4e0e\u9879\u76ee\u7ecf\u7406\u786e\u8ba4\u672c\u6b21\u5373\u5c06\u96c6\u6210\u7684\u5e94\u7528\u7248\u672c\u53f7\u662f\u591a\u5c11\uff1b tag \u7684 commit \u4fe1\u606f\u683c\u5f0f\uff1a # commit msg\nversion:5.6.5\n \u5176\u4e2d 5.6.5 \u5199\u5e94\u7528\u7684\u96c6\u6210\u7248\u672c\u53f7\u3002 \u751f\u6210 tag \u7684\u547d\u4ee4\u53c2\u8003\uff1a\u300aGit \u6807\u7b7e\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3-tag","title":"3. \u57fa\u7840\u6846\u67b6 tag","text":"\u57fa\u7840\u6846\u67b6 tag \u4e0d\u4e0e\u4e1a\u52a1\u6302\u94a9\uff0c\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u6309\u9700\u53d1\u5e03\u7248\u672c\uff0c\u5728\u6839\u76ee\u5f55\u4e0b CURRENT \u6587\u4ef6\u4e2d\u8bb0\u5f55\u7684\u5f53\u524d\u7248\u672c\u53f7\u548c\u5386\u53f2\u7248\u672c\u53f7\uff0c\u53ca\u5176\u5bf9\u5e94\u65b0\u589e\u4e86\u54ea\u4e9b\u529f\u80fd\uff0c\u6709\u52a9\u4e8e\u5e94\u7528\u9009\u62e9\u5408\u9002\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\u3002 # CURRENT\n[current]\ntag = 0.9.5\n \u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u7684 control \u6587\u4ef6\u8bb0\u5f55\u5f53\u524d\u5e94\u7528\u5e93\u4f9d\u8d56\u7684\u57fa\u7840\u5e93\u7248\u672c\u3002 # control\n[Depends]\nautotest-basic-frame = 0.9.5\n \u7528\u4f8b\u5728\u6267\u884c\u65f6\u4f1a\u6821\u9a8c\u4e24\u4e2a\u6587\u4ef6\u7684\u7248\u672c\u53f7\u662f\u5426\u4e00\u81f4\uff0c\u5982\u679c\u4e0d\u4e00\u81f4\uff0c\u4f1a\u6253\u5370 error \u65e5\u5fd7\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_2","title":"\u4e09\u3001\u4ed3\u5e93\u6743\u9650\u7ba1\u7406","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_1","title":"1. \u57fa\u7840\u6846\u67b6","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u4ed3\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame \u57fa\u7840\u6846\u67b6\u4e0d\u5141\u8bb8\u533f\u540d\u8bbf\u95ee\uff0c\u5982\u679c\u4f60\u767b\u5f55 gerrit \u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u8bbf\u95ee\u4ee5\u4e0a\u94fe\u63a5\uff0c\u5219\u9700\u8981\u7533\u8bf7\u8bbf\u95ee\u6743\u9650\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_1","title":"2. \u5e94\u7528\u4ed3\u5e93","text":" \u81ea\u52a8\u5316\u5e94\u7528\u4ed3\u5e93\uff1a https://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684 app_name \u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_3","title":"\u56db\u3001\u65b9\u6cd5\u7f16\u5199&\u8c03\u7528\u89c4\u8303","text":"\u65b9\u6cd5\u7f16\u5199\u6574\u4f53\u8bbe\u8ba1\u601d\u8def\u53c2\u8003\uff1a[\u300aAT\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b]"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_2","title":"1. \u65b9\u6cd5\u7f16\u5199","text":"\u5199\u65b9\u6cd5\u7684\u65f6\u5019\u6ce8\u610f\u65b9\u6cd5\u5f52\u5c5e\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget\uff0c\u65b9\u6cd5\u662f\u5728\u54ea\u4e2a\u533a\u57df\u64cd\u4f5c\u7684\uff0c\u5c31\u5199\u5728\u54ea\u4e2a\u7c7b\u91cc\u9762\u3002 \u4e3e\u4f8b\uff1a from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n\"\"\"\u70b9\u51fb\u6807\u9898\u680fxxx\"\"\"\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_2","title":"2. \u65b9\u6cd5\u8c03\u7528","text":" \u5728\u7528\u4f8b\u4e2d\u8c03\u7528\u65b9\u6cd5\uff0c\u901a\u8fc7\u8be5\u5e94\u7528\u552f\u4e00\u7684\u51fa\u53e3\u8fdb\u884c\u8c03\u7528\uff0c\u6bd4\u5982\u6587\u7ba1\uff1a class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n \u4e0d\u8981\u5728\u7528\u4f8b\u4e2d\u5355\u72ec\u53bb\u8c03\u7528 TitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u8fd9\u4e9b\u7c7b\uff0c\u5426\u5219\u540e\u671f\u7528\u4f8b\u4f1a\u53d8\u5f97\u4e0d\u597d\u7ef4\u62a4\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_4","title":"\u4e94\u3001\u7528\u4f8b\u7f16\u5199\u89c4\u8303","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_3","title":"1. \u57fa\u4e8e\u7c7b\u5199\u7528\u4f8b","text":"\u6240\u6709\u7528\u4f8b\u90fd\u5e94\u8be5\u57fa\u4e8e\u7c7b\u53bb\u5199\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001(self):\n\"\"\"\u97f3\u4e50\u542f\u52a8\"\"\"\n \u6ce8\u610f\u4ee5\u4e0b\u51e0\u70b9\uff1a \u7c7b\u540d\u4e0d\u8981\u968f\u4fbf\u53d6\uff0c\u540c\u4e00\u4e2a\u5e94\u7528\u5e94\u8be5\u4f7f\u7528\u540c\u4e00\u4e2a\u7c7b\u540d\uff0c\u7528\u4f8b\u7c7b\u540d\u79f0\u5fc5\u987b\u4ee5 Test \u5f00\u5934\uff0c\u9075\u5faa\u5927\u9a7c\u5cf0\u547d\u540d\u89c4\u8303\uff1b \u7528\u4f8b\u7c7b\u7ee7\u627f BaseCase\uff0c\u4e00\u4e2a\u5e94\u7528\u53ea\u6709\u4e00\u4e2a BaseCase \u4e00\u4e2a py \u6587\u4ef6\u91cc\u9762\u53ea\u6709\u4e00\u4e2a\u7c7b\uff0c\u6211\u4eec\u79f0\u4e3a\u4e00\u4e2a\u6d4b\u8bd5\u7c7b\uff1b \u4e00\u4e2a\u7c7b\u91cc\u9762\u53ef\u4ee5\u6709\u591a\u4e2a\u7528\u4f8b\u51fd\u6570\uff0c\u8fd9\u53d6\u51b3\u8fd9\u6761\u7528\u4f8b\u6709\u591a\u5c11\u4e2a\u6d4b\u8bd5\u70b9\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001_1(self):\n\"\"\"\u4efb\u52a1\u680f\u542f\u52a8\u97f3\u4e50\"\"\"\ndef test_music_001_2(self):\n\"\"\"\u542f\u52a8\u5668\u542f\u52a8\u97f3\u4e50\"\"\" \ndef test_music_001_3(self):\n\"\"\"\u684c\u9762\u542f\u52a8\u97f3\u4e50\"\"\"\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_3","title":"2. \u7528\u4f8b\u51fd\u6570\u89c4\u8303","text":" \u7528\u4f8b\u51fd\u6570\u4ee5 test \u5f00\u5934\uff0c\u9075\u5faa\u86c7\u5f62\u547d\u540d\u89c4\u8303\uff0c\u4e2d\u95f4\u4e3a\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0\uff0c\u540e\u9762\u52a0\u7528\u4f8b ID\uff0c\u6700\u540e\u52a0\u6d4b\u8bd5\u70b9\u5e8f\u53f7\uff0c\u5373 test_${module}_${case_id}[_${index}] \uff1b \u6bd4\u5982\uff1atest_music_001_1\uff0cindex \u4ece 1 \u5f00\u59cb\u3002 \u51fd\u6570\u529f\u80fd\u8bf4\u660e\u91cc\u9762\u5199\u7528\u4f8b\u6807\u9898\uff0c\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u6807\u9898\u5373\u53ef\uff0c\u6ce8\u610f\u7528\u4e09\u5bf9\u53cc\u5f15\u53f7\uff0c\u4e0d\u8981\u7528\u5176\u4ed6\u6ce8\u91ca\uff0c\u66f4\u4e0d\u8981\u7528\u4e95\u53f7\u6ce8\u91ca\u5199\u7528\u4f8b\u6807\u9898\uff1b \u76f4\u63a5\u590d\u5236 PMS \u7528\u4f8b \u7528\u4f8b\u6b65\u9aa4\u76f4\u63a5\u5c06 PMS \u4e0a\u7528\u4f8b\u6b65\u9aa4\u548c\u9884\u671f\u590d\u5236\u8fdb\u6765\uff0c\u7136\u540e\u8fdb\u884c\u6279\u91cf\u6ce8\u91ca\uff08ctrl + /\uff09\uff0c\u5728\u6ce8\u91ca\u7684\u57fa\u7840\u4e0a\u53bb\u5199\u7528\u4f8b\u811a\u672c\u4f1a\u66f4\u52a0\u65b9\u4fbf\u5168\u9762\uff0c\u4e5f\u6bd4\u4f60\u81ea\u5df1\u5199\u6ce8\u91ca\u66f4\u8282\u7ea6\u65f6\u95f4\uff1a \u4e3e\u4f8b\uff0cPMS \u7528\u4f8b\uff1a \u76f4\u63a5\u9009\u4e2d\u7528\u4f8b\u5185\u5bb9\uff0c\u590d\u5236\u4e0b\u6765\uff0c\u7136\u540e\u7c98\u8d34\u5230\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c\u4e2d\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\n \u4e0a\u4f8b\u4e2d\u4e95\u53f7\u6ce8\u91ca\u90e8\u5206\u5c31\u662f\u76f4\u63a5\u4ece PMS \u4e0a\u590d\u5236\u8fc7\u6765\u7684\uff0c\u5728\u6b64\u57fa\u7840\u4e0a\u5199\u7528\u4f8b\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\nmusic = DeepinMusicWidget()\nmusic.click_singer_btn_in_music_by_ui()\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\nmusic.click_icon_mode_in_music_by_ui()\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\nmusic.double_click_first_singer_in_singer_icon_view_by_ui()\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\nself.assert_xxx\n \u4f60\u770b\uff0c\u975e\u5e38\u6e05\u695a\u6bcf\u4e00\u6b65\u5728\u505a\u4ec0\u4e48\uff0c\u91cd\u70b9\u662f\u7701\u53bb\u4e86\u5199\u6ce8\u91ca\u7684\u65f6\u95f4\uff0c\u771f\u7684\u7092\u9e21\u65b9\u4fbf\u3002 \u4e0d\u5199 if __name__ == '__main__':\uff0c\u4e0d\u5199\u591a\u4f59\u7684\u4ee3\u7801\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3","title":"3. \u6570\u636e\u9a71\u52a8","text":" \u5982\u679c\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u662f\u76f8\u540c\u7684\uff0c\u53ea\u662f\u4e00\u4e9b\u53c2\u6570\u53d8\u5316\uff0c\u5c3d\u91cf\u4f7f\u7528\u6570\u636e\u9a71\u52a8\u6765\u5b9e\u73b0\u7528\u4f8b\uff1b \u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u6570\u636e\u9a71\u52a8\u7684\u6570\u636e\uff0c\u4e0d\u80fd\u56e0\u6b64\u5f15\u5165\u4f9d\u8d56\uff0c\u5c3d\u91cf\u4f7f\u7528\u4e00\u4e9b\u6807\u51c6\u5e93\u80fd\u8bfb\u53d6\u7684\u6587\u4ef6\u683c\u5f0f\uff0c\u6bd4\u5982 json\u3001ini\u3001CSV\u3001xml\u3001txt \u7b49\u6587\u4ef6\u683c\u5f0f\uff1b\u4e0d\u5efa\u8bae\u4f7f\u7528 Yaml\u3001Excel\u3001MySQL \u7b49\u6570\u636e\u683c\u5f0f\uff1b \u8bfb\u53d6\u6570\u636e\u65f6\u4e5f\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff0c\u5982\u4f7f\u7528 pandas \u5904\u7406 CSV \u5c31\u5c5e\u4e8e\u5927\u6750\u5c0f\u7528\u4e86\uff0c\u6b63\u5e38\u7684\u6570\u636e\u9a71\u52a8\u8fd8\u6ca1\u5230\u9700\u8981\u5927\u6570\u636e\u5206\u6790\u6765\u5904\u7406\u7684\u5730\u6b65\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u5728 widget/ddt/ \u76ee\u5f55\u4e0b\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5199\u6cd5\uff1a @pytest.mark.parametrize(\"value\", data)\ndef test_smb_049(self, value):\n \u4ee5\u4e0a\u8fd9\u79cd\u53c2\u6570\u5316\u7684\u5199\u6cd5\u672c\u8eab\u6ca1\u4ec0\u4e48\u95ee\u9898\uff0c\u4f46\u662f\uff0c\u8fd9\u91cc\u5fc5\u987b\u8981\u8865\u5145\u4e00\u4e2a\u6ca1\u6709\u7528\u7684\u5c0f\u77e5\u8bc6\uff1a \u5982\u679c\u53c2\u6570\u5316\u6570\u636e\u91cc\u9762\u7684\u5b57\u7b26\u4f1a\u539f\u5c01\u4e0d\u52a8\u7684\u8f93\u51fa\u5230 item.name \u91cc\u9762\uff0c\u663e\u793a\u975e\u5e38\u4e0d\u4f18\u96c5\uff0c\u800c\u4e14\u53ef\u4ee5\u4f1a\u5f15\u5165\u4e00\u4e9b\u610f\u60f3\u4e0d\u5230\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u611f\u53d7\u4e00\u4e0b\uff1a \u53c2\u6570\uff1a data = [\n\"\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\", \"qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678\",\n]\n \u73b0\u8c61\u662f\u8fd9\u6837\u8272\u513f\u7684\uff1a test_smb_049.py::TestFileManager::test_smb_049[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09]\ntest_smb_049.py::TestFileManager::test_smb_049[qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui]\ntest_smb_049.py::TestFileManager::test_smb_049[12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678]\n \u8bf4\u5b9e\u8bdd\uff0c\u770b\u7740\u5fc3\u91cc\u5835\u5f97\u614c\uff0c\u5982\u679c\u8fd9\u91cc\u9762\u5305\u542b\u4e00\u4e9b\u7279\u6b8a\u5b57\u7b26\u6216\u8005\u662f\u8d85\u957f\uff0c\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u5f88\u5947\u5999\u7684\u4e8b\u60c5\u53d1\u751f\u3002 parametrize \u91cc\u9762\u6709\u4e2a\u53c2\u6570\uff1aids\uff0c\u53ef\u4ee5\u89e3\u51b3\u6b64\u7c7b\u95ee\u9898\uff0c\u5c31\u50cf\u8fd9\u6837\uff1a @pytest.mark.parametrize(\"value\", data, ids=[1, 2, 3])\ndef test_smb_049(self, value):\n \u518d\u6765\u611f\u53d7\u4e00\u4e0b\uff1a test_smb_049.py::TestFileManager::test_smb_049[1]\ntest_smb_049.py::TestFileManager::test_smb_049[2]\ntest_smb_049.py::TestFileManager::test_smb_049[3]\n \u660e\u663e\u597d\u591a\u4e86\uff0c\u6240\u4ee5\u5c3d\u91cf\u4f7f\u7528 ids \u8fd9\u4e2a\u53c2\u6570\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 fixture \u7684\u6570\u636e\u9a71\u52a8\u65b9\u5f0f\uff0c\u6846\u67b6\u867d\u7136\u652f\u6301\uff0c\u4f46\u53ef\u8bfb\u6027\u6bd4\u8f83\u5dee\uff1b\u5982\u679c\u4f60\u4e0d\u77e5\u9053\u8fd9\u53e5\u8bdd\u5728\u8bf4\u5565\uff0c\u90a3\u4f60\u53ef\u4ee5\u5ffd\u7565\uff0c\u6211\u4e5f\u4e0d\u6253\u7b97\u8be6\u7ec6\u8bf4\u8fd9\u79cd\u5b9e\u73b0\u65b9\u5f0f\uff0c\u64cd\u4f5c\u6bd4\u8f83\u9a9a\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4","title":"4. \u65ad\u8a00\u8d44\u6e90","text":" \u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u76f4\u63a5\u653e\u5728\u7528\u4f8b\u6a21\u5757\u7684\u540c\u7ea7\u76ee\u5f55\u4e0b\u7684 assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0 + \u7528\u4f8b ID \u547d\u540d\uff1b \u56fe\u50cf\u8bc6\u522b\u65ad\u8a00\uff0c\u4e0d\u8981\u622a\u53d6\u4e00\u5f20\u5f88\u5927\u7684\u56fe\uff0c\u56fe\u7247\u8d44\u6e90\u5305\u542b\u7684\u5143\u7d20\u592a\u591a\u4e86\uff0c\u975e\u5e38\u5bb9\u6613\u53d7\u5230\u9700\u6c42\u5f71\u54cd\uff0c\u5efa\u8bae\u662f\u8fdb\u884c\u5c40\u90e8\u7684\u65ad\u8a00\uff1b \u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u5339\u914d\u5ea6\u662f 0.9\uff0c\u5982\u679c\u65ad\u8a00\u7684\u573a\u666f\u5bf9\u4e8e\u7cbe\u786e\u5ea6\u8981\u6c42\u6ca1\u90a3\u4e48\u9ad8\uff0c\u53ef\u4ee5\u5728\u65ad\u8a00\u8bed\u53e5\u91cc\u9762\u4f20\u5165\u5c0f\u4e8e 0.9 \u7684\u53c2\u6570\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5","title":"5. \u5143\u7d20\u5b9a\u4f4d","text":" \u7528\u4e8e\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u4e2d\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u547d\u540d\u4e3a\u8be5\u5143\u7d20\u7684\u540d\u79f0\uff1b \u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u622a\u53d6\u65f6\u5c3d\u91cf\u7cbe\u786e\u5230\u8fd9\u4e2a\u5177\u4f53\u7684\u6309\u94ae\uff0c\u56fe\u7247\u4e5f\u4e0d\u8981\u592a\u5927\uff1b \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u64cd\u4f5c\u8f83\u5feb\uff0c\u5408\u7406\u52a0\u5165\u7b49\u5f85\u65f6\u95f4\u80fd\u63d0\u9ad8\u7528\u4f8b\u7684\u7a33\u5b9a\u6027\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6","title":"6. \u7528\u4f8b\u8d44\u6e90","text":" \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u4f7f\u7528\u5230\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u6bd4\u5982\u97f3\u4e50\u53ef\u80fd\u9700\u8981\u4e00\u4e9b mp3 \u7684\u8d44\u6e90\u7528\u4e8e\u6d4b\u8bd5\uff0c\u5b58\u653e\u5728 widget/case_res \u76ee\u5f55\u4e0b\uff0c\u524d\u63d0\u662f\u8fd9\u4e9b\u8d44\u6e90\u4e0d\u8d85\u8fc7 10M\uff1b \u5982\u679c\u662f\u4e00\u4e9b\u6bd4\u8f83\u5927\u7684\u8d44\u6e90\uff0c\u5efa\u8bae\u653e\u5230\u7edf\u4e00\u7684 ftp \u670d\u52a1\u5668 \uff08ftp://10.8.10.245\uff09\uff0c\u9700\u8981\u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\u518d\u4e0b\u8f7d\u4e0b\u6765\uff1b f\"wget ftp://{Config.FTP_IP}/uploads/\u591a\u5a92\u4f53/\u5f71\u9662/auto/{file_name};unzip {file_name};rm -rf {file_name};\"\n \u6d4b\u8bd5\u8d44\u6e90\u4e0b\u8f7d\u5230\u5e94\u7528 widget/case_res \u76ee\u5f55\u4e0b\uff1b \u7981\u6b62\u5c06\u6d4b\u8bd5\u8d44\u6e90\u5b58\u653e\u5728\u4e2a\u4eba\u7684\u673a\u5668\u4e0a\uff1b \u5e94\u8be5\u5c3d\u91cf\u4fdd\u8bc1\uff0c\u4e00\u4e2a\u8d44\u6e90\u5728\u4e00\u6b21\u7528\u4f8b\u6267\u884c\u4e2d\u53ea\u9700\u8981\u4e0b\u8f7d\u4e00\u6b21\uff0c\u6240\u4ee5\u4f60\u4e0d\u80fd\u6bcf\u6b21\u4f7f\u7528\u7684\u65f6\u5019\u90fd\u53bb\u4e0b\u8f7d\uff0c\u8fd9\u6837\u53ef\u80fd\u4f1a\u8017\u8d39\u5927\u91cf\u7684\u7f51\u7edc\u8d44\u6e90\uff0c\u800c\u56e0\u4e3a\u5148\u5224\u65ad\u672c\u5730\u662f\u5426\u5b58\u5728\u6b64\u8d44\u6e90\uff0c\u5982\u679c\u4e0d\u5b58\u5728\u518d\u53bb\u4e0b\u8f7d\uff1b \u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u5c06\u8d44\u6e90\u62f7\u8d1d\u5230\u5bf9\u5e94\u7684\u6d4b\u8bd5\u76ee\u5f55\u4e0b\uff0c\u6bd4\u5982\u5c06 mp3 \u6587\u4ef6\u62f7\u8d1d\u5230 ~/Music \u76ee\u5f55\u4e0b\uff0c\u4f46\u662f\u6211\u4eec\u66f4\u5efa\u8bae\u4f60\u4f7f\u7528\u53d1\u9001\u5feb\u6377\u94fe\u63a5\u7684\u65b9\u5f0f\u66ff\u4ee3\u62f7\u8d1d\u7684\u64cd\u4f5c\uff0c\u56e0\u4e3a\u5728\u62f7\u8d1d\u5927\u6587\u4ef6\u65f6\u662f\u5f88\u6d88\u8017\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u800c\u521b\u5efa\u94fe\u63a5\u5219\u4e0d\u4f1a\uff1b @classmethod\ndef recovery_many_movies_in_movie_by_cmd(cls):\n\"\"\"\u6062\u590d\u591a\u4e2a\u89c6\u9891\u6587\u4ef6\u81f3\u89c6\u9891\u76ee\u5f55\u4e2d\"\"\"\nwork_path = f\"/home/{Config.USERNAME}/Videos/auto\"\ncode_path = f\"{Config.CASE_RES_PATH}/auto\"\ncls.run_cmd(f\"rm -rf {work_path};mkdir {work_path}\")\nsleep(1)\nflag = False\nif not exists(code_path):\ncls.run_cmd(f\"mkdir -p {code_path}\")\nflag = True\nlogger.info(f\"ln -s {code_path}/* {work_path}/\")\ncls.run_cmd(\nf\"cd {code_path}/;\"\nf\"{cls.wget_file('auto.zip') if flag else ''}\"\nf\"ln -s {code_path}/* {work_path}/ > /dev/null 2>&1\"\n)\n \u8d44\u6e90\u4e0b\u8f7d\u8fc7\u7a0b\u4e2d\u6ce8\u610f\u8d85\u65f6\u7684\u95ee\u9898\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u5f88\u5927\uff0c\u8981\u7279\u522b\u6ce8\u610f\u8fd9\u95ee\u9898\uff0c\u5982\u679c\u4f60\u4f7f\u7528\u5f3a\u5236\u7b49\u5f85\u4e0b\u8f7d\u7ed3\u675f( os.system )\uff0c\u53ef\u80fd\u4f1a\u9020\u6210\u7528\u4f8b\u6267\u884c\u65f6\u957f\u53d8\u5f97\u4e0d\u53ef\u63a5\u53d7\uff0c\u76ee\u524d\u6211\u4eec\u53d1\u73b0\u5728\u6301\u7eed\u96c6\u6210\u73af\u5883\u6267\u884c\u65f6\u7f51\u7edc\u4e0b\u8f7d\u901f\u5ea6\u5f88\u6162\uff0c\u6240\u4ee5\u8d85\u65f6\u673a\u5236\u662f\u5f88\u6709\u5fc5\u8981\u7684\uff1brun_cmd \u65b9\u6cd5\u6709\u4e00\u4e2a\u9ed8\u8ba4\u8d85\u65f6\u7684\u65f6\u95f4\uff0c\u4f60\u53ef\u4ee5\u6839\u636e\u8d44\u6e90\u5927\u5c0f\u5bf9\u8d85\u65f6\u65f6\u95f4\u8fdb\u884c\u8c03\u6574\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_5","title":"\u516d\u3001\u7528\u4f8b\u8c03\u8bd5\u6280\u5de7","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_4","title":"1. \u65e5\u5fd7","text":" \u4e00\u5b9a\u8981\u5148\u770b\u62a5\u9519\uff0c\u770b error \u65e5\u5fd7\uff0c\u901a\u5e38\u80fd\u660e\u786e\u7684\u544a\u8bc9\u4f60\u5177\u4f53\u54ea\u91cc\u4ee3\u7801\u62a5\u9519\uff1b \u7ed3\u5408\u62a5\u9519\u70b9\u524d\u9762\u7684error\u3001 info \u548c debug \u65e5\u5fd7\u770b\u5426\u662f\u6b63\u5e38\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_4","title":"2. \u65ad\u70b9\u8c03\u8bd5","text":" \u65b9\u6cd5\u62a5\u9519\uff1a \u5728\u65b9\u6cd5\u5e93\u4e2d\u627e\u5230\u5bf9\u5e94\u7684\u65b9\u6cd5\uff0c\u5355\u72ec\u8c03\u7528\uff0c\u770b\u662f\u5426\u80fd\u6b63\u5e38\u6267\u884c\uff1b \u901a\u5e38\u5355\u4e2a\u65b9\u6cd5\u7684\u6267\u884c\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u62a5\u9519\uff0c\u5f88\u5feb\u5c31\u80fd\u6392\u67e5\u51fa\u95ee\u9898\uff1b\u5728\u65b9\u6cd5\u5185\u90e8\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u65b9\u6cd5\u5185\u90e8\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u8c03\u7528\u6ca1\u95ee\u9898\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u62a5\u9519\u7684\u65b9\u6cd5\u524d\u9762\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u7528\u4f8b\u7684\u4e1a\u52a1\u903b\u8f91\u548c\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u65ad\u8a00\u62a5\u9519\uff1a \u65ad\u8a00\u4e3a\u6570\u636e\u65ad\u8a00\uff0c\u6839\u636e\u8868\u8fbe\u5f0f\u8fdb\u884c\u65ad\u8a00\u8bed\u53e5\u8fdb\u884c\u4fee\u6539\uff1b \u6587\u4ef6\u751f\u6210\u7c7b\u65ad\u8a00\uff0c\u67e5\u770b\u662f\u5426\u9700\u8981\u52a0\u7b49\u5f85\u65f6\u95f4\uff1b \u56fe\u50cf\u65ad\u8a00\uff0c\u5728\u65ad\u8a00\u8bed\u53e5\u5904\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u7528\u4f8b\u8fd0\u884c\u5230\u65ad\u8a00\u5904\u4f1a\u505c\u6b62\uff0c\u67e5\u770b\u6b64\u65f6\u65ad\u8a00\u7684\u56fe\u7247\u4e0e\u7528\u4f8b\u6267\u884c\u7684\u73b0\u573a\u5b58\u5728\u4ec0\u4e48\u5dee\u5f02\uff0c\u6b64\u65f6\u4e5f\u53ef\u4ee5\u8fdb\u884c\u91cd\u65b0\u622a\u56fe\uff0c\u4ece\u800c\u66ff\u6362\u65b0\u7684\u56fe\u7247\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3_1","title":"3. \u8fdc\u7a0b\u6267\u884c","text":" \u8fdc\u7a0b\u6267\u884c\u6307\u7684\u662f\u7f16\u8f91\u5668\u901a\u8fc7\u6307\u5b9a\u8fdc\u7a0b\u89e3\u91ca\u5668\u6267\u884c\u81ea\u52a8\u5316\u4ee3\u7801\uff1b \u8fdc\u7a0b\u6267\u884c\u7684\u597d\u5904\u662f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u7684 Debug \u8fd0\u884c\uff0c\u4e0d\u7528\u5728\u6d4b\u8bd5\u673a\u4e0a\u6253\u5f00\u7f16\u8f91\u5668\uff0c\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u66f4\u5feb\uff1b \u652f\u6301\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u7684\u7f16\u8f91\u5668\uff1a \u4e13\u4e1a\u7248 Pycharm VScode \uff0c\u9700\u8981\u4f7f\u7528\u63d2\u4ef6 Remote-SSH \u8fdc\u7a0b\u6267\u884c\u914d\u7f6e \u4ee5 Pycharm \u4e3a\u4f8b\uff1a File \u2014> Settings \u2014> Project \u2014> Python Interpreter \u2014> \u53f3\u8fb9\u8bbe\u7f6e\u6309\u94ae \u2014> Add... \u2014> SSH Interpreter \u2014> New server configuration(\u586b\u5165host\u548cusername) \u2014> Next \u2014> password\uff08\u6d4b\u8bd5\u673a\u5bc6\u7801\uff09 \u2014> Interpreter(\u9009\u62e9\u8fdc\u7a0b\u89e3\u91ca\u5668) \u2014> Finish "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4_1","title":"4. \u73af\u5883\u6e05\u7406","text":" \u5982\u679c\u7528\u4f8b\u91cc\u9762\u7684 teardown \u6ca1\u6709\u6267\u884c\uff0c\u5927\u6982\u7387\u662f\u56e0\u4e3a setup \u91cc\u9762\u4ee3\u7801\u62a5\u9519\uff0c\u8fd9\u4e24\u4e2a\u662f\u4e00\u5bf9\u7684\uff0csetup \u91cc\u9762\u62a5\u9519\uff0cteardown \u91cc\u9762\u7684\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\uff1b \u76ee\u524d\u6211\u4eec\u5df2\u7ecf\u5c06\u5404\u5e94\u7528\u7684 clean_all \u8fd9\u4e2a fixture \u6539\u6210\u4e86\u7ec8\u7ed3\u5668\uff0c\u786e\u4fdd\u59cb\u7ec8\u80fd\u6267\u884c\u5230\u8fd9\u6b65\uff0c\u4f46\u662f\u7528\u4f8b\u91cc\u9762\u7684 fixture\uff0c\u8fd8\u662f\u9700\u8981\u6211\u4eec\u5c0f\u5fc3\u5904\u7406\uff1b \u8981\u6267\u884c clean_all \u9700\u8981\u5728\u7f16\u8f91\u5668\u8fd0\u884c\u53c2\u6570\u52a0 --clean yes\uff0c\u5199\u7528\u4f8b\u7684\u65f6\u5019\u8bf7\u52a0\u4e0a\uff0c\u4e0d\u7136\u4f60\u4e0d\u786e\u5b9a\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u7684\u73af\u5883\u662f\u5426\u6062\u590d\uff1b setup \u53ef\u4ee5\u4e0d\u8981\uff0c\u5c06 setup \u653e\u5230\u7528\u4f8b\u91cc\u9762\u662f\u4e00\u79cd\u7a33\u59a5\u7684\u505a\u6cd5\uff0cteardown \u4e00\u5b9a\u8981\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5_1","title":"5. \u5143\u7d20\u5b9a\u4f4d\u4e0d\u51c6\uff08\u5750\u6807\u8fd4\u56de\u4e0d\u5bf9\uff09","text":" \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u53ef\u80fd\u53d7\u5230\u7a97\u53e3 ID \u7684\u53d8\u5316\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u9ed8\u8ba4\u53d6\u6700\u65b0\u7684\u4e00\u4e2a\u7a97\u53e3\u7528\u4e8e\u5b9a\u4f4d\uff0c\u4f46\u5982\u679c\u5b9e\u9645\u9700\u8981\u5b9a\u4f4d\u7684\u4e0d\u662f\u6700\u65b0\u7684\u7a97\u53e3\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u91cd\u65b0\u5b9e\u4f8b\u5316\u65b9\u6cd5\u7c7b\u5bf9\u8c61\uff0c\u5e76\u5728\u7c7b\u4e2d\u4f20\u5165\u5bf9\u5e94\u7684\u7a97\u53e3\u5e8f\u53f7\uff1b \u57fa\u4e8e\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u76ee\u524d\u9047\u5230\u7684\u7b14\u8bb0\u672c\u4e0a\uff0c\u7531\u4e8e\u5c4f\u5e55\u7f29\u653e\u6bd4\u4f8b\u4e3a 1.25\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u6211\u4eec\u9ed8\u8ba4\u4f7f\u7528\u7f29\u653e\u6bd4\u4f8b\u4e3a 1\uff1b \u57fa\u4e8e\u56fe\u50cf\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u76ee\u6807\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b \u57fa\u4e8e OCR \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u6587\u5b57\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u540c\u6837\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6_1","title":"6. \u952e\u9f20\u64cd\u4f5c\u4e0d\u51c6","text":" \u9f20\u6807\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6bd4\u5982\u53f3\u952e\u3001\u53cc\u51fb\u65e0\u54cd\u5e94\uff1b \u952e\u76d8\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6216\u8005\u5ef6\u8fdf\u8f93\u5165\uff0c\u6bd4\u5982\u7528\u4f8b\u9700\u8981\u8f93\u5165\u201c\u6211\u662f\u4e2d\u56fd\u4eba\u201d\uff0c\u5b9e\u9645\u53ea\u8f93\u5165\u4e86\u201c\u6211\u56fd\u4eba\u201d\uff1b \u4ee5\u4e0a\u95ee\u9898\u6392\u9664\u5e94\u7528\u5361\u987f\u7b49\u95ee\u9898\uff0c\u5927\u6982\u7387\u662f\u7531\u4e8e\u5de5\u5177\u7684\u95ee\u9898\uff0c\u76ee\u524d\u952e\u9f20\u64cd\u4f5c\u6211\u4eec\u4f7f\u7528\u4e09\u4e2a\u5de5\u5177\uff1aDogtail \u63d0\u4f9b\u7684\u952e\u9f20\u5de5\u5177\u3001PyAutoGUI\u3001Xdotool \uff1b \u6709\u540c\u5b66\u53ef\u80fd\u8981\u8bf4\u4e3a\u5565\u8981\u7528\u4e09\u4e2a\u554a\uff0c\u7528\u4e00\u4e2a\u4e0d\u5c31\u597d\u4e86\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u5404\u6709\u4f18\u70b9\u5404\u6709\u7f3a\u70b9\u3002 \u5982\u679c\u4f60\u9047\u5230\u952e\u9f20\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u8bd5\u8bd5\u901a\u8fc7\u4e0d\u540c\u7684\u5de5\u5177\u64cd\u4f5c\uff1b\u952e\u76d8\u8f93\u5165\u5ef6\u8fdf\u7684\u95ee\u9898\uff0c\u4e00\u822c\u662f\u56e0\u4e3a\u8f93\u5165\u901f\u5ea6\u592a\u5feb\u4e86\uff0c\u7cfb\u7edf\u6ca1\u53cd\u5e94\u8fc7\u6765\uff0c\u5e38\u89c1\u4e8e ARM \u548c MIPS \u4e0a\uff0c\u4fee\u6539\u53c2\u6570 delay_time \u7684\u503c\uff0c\u5355\u4f4d\u4e3a\u6beb\u79d2\uff1b # mouse_key.py\n@classmethod\ndef input_message(cls, message, delay_time=300, interval=0.2):\n\"\"\"\n \u8f93\u5165\u5b57\u7b26\u4e32\n :param message: \u8f93\u5165\u7684\u5185\u5bb9\n :param delay_time: \u5ef6\u8fdf\u65f6\u95f4\n :param interval:\n :return:\n \"\"\"\n \u5982\u679c\u4e0d\u662f\u65b9\u6cd5\u7684\u95ee\u9898\uff0c\u5219\u9700\u8981\u7ee7\u7eed\u548c\u5f00\u53d1\u4e00\u8d77\u6392\u9664\uff0c\u662f\u5426\u4e3a\u5e94\u7528\u63a5\u53d7\u952e\u9f20\u4fe1\u53f7\u5904\u7406\u7684\u95ee\u9898\uff0c\u8fd9\u7c7b\u60c5\u51b5\u6211\u4eec\u4e5f\u662f\u9047\u5230\u8fc7\u7684\uff0c\u5177\u4f53\u95ee\u9898\u5177\u4f53\u5206\u6790\u3002 \u6bd4\u5982\u5f71\u9662\u5c31\u91cd\u5199\u4e86\u4e00\u4e2a\u53f3\u952e\u7684\u65b9\u6cd5\uff1a # base_widget.py\n@classmethod\ndef right_click(cls, _x=None, _y=None):\n\"\"\"\n \u91cd\u5199\u5e95\u5c42\u5355\u51fb\u9f20\u6807\u53f3\u952e\n \u89e3\u51b3\u5f71\u9662\u53f3\u952e\u89e6\u53d1release\u4e8b\u4ef6\u7684\u95ee\u9898\uff08\u53f3\u952e\u4e3b\u7a97\u53e3\u4f1a\u64ad\u653e\u89c6\u9891\uff09\n \"\"\"\ncls.mouse_down(_x, _y, button=3)\nsleep(0.1)\ncls.mouse_up(button=3)\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_6","title":"\u4e03\u3001\u5176\u4ed6\u4e0d\u4e3a\u4eba\u77e5\u7684\u7ec6\u8282","text":" \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u5c3d\u91cf\u7f16\u5199\u540c\u4e00\u4e2a\u5e94\u7528\u6216\u6a21\u5757\u7684\u7528\u4f8b\uff0c\u80fd\u5bf9\u8be5\u7528\u4f8b\u5df2\u6709\u65b9\u6cd5\u719f\u6089\uff0c\u907f\u514d\u8fc7\u591a\u91cd\u590d\u4e1a\u52a1\u4ee3\u7801\u7684\u5c01\u88c5\uff1b \u76f8\u540c\u7684\u573a\u666f\u4e0b\uff0c\u5404\u67b6\u6784\u7b49\u5f85\u65f6\u95f4\u4e0d\u540c\uff0c\u5efa\u8bae\u4f7f\u7528\u6846\u67b6\u63d0\u4f9b\u7684 sleep\uff0c\u6211\u4eec\u505a\u4e86\u4e0d\u540c\u67b6\u6784\u7684\u500d\u6570\u653e\u5927\uff1b \u7f16\u5199\u7528\u4f8b\u65f6\uff0c\u5c3d\u91cf\u8003\u8651\u5230\u6bcf\u4e00\u6b65\u5f02\u5e38\u540e\u7684\u73af\u5883\u6062\u590d\uff0c\u9700\u8981\u5efa\u8bae\u8fd9\u79cd\u610f\u8bc6\uff0c\u968f\u65f6\u8981\u8003\u8651\u5230\uff0c\u8fd9\u6b65\u64cd\u4f5c\u6709\u6ca1\u6709\u53ef\u80fd\u51fa\u9519\uff0c\u51fa\u9519\u4e86\u6539\u600e\u4e48\u529e\uff1b \u63d0\u4ea4\u4ee3\u7801\u7684\u65f6\u5019\u6ce8\u610f\u4e0d\u8981\u628a\u4e00\u4e9b\u4e34\u65f6\u7684\u6d4b\u8bd5\u8d44\u6e90\u63d0\u4ea4\u8fdb\u53bb\u4e86\uff0c\u6bd4\u5982\u6d4b\u8bd5\u4e86\u4e00\u4e2a\u5f71\u7247\uff0c\u6709\u4e9b\u540c\u5b66\u4e60\u60ef\u4f7f\u7528 git add . \uff0c\u7136\u540e\u5c31\u5168\u90e8\u63d0\u4ea4\u5230\u4ee3\u7801\u4ed3\u5e93\u4e86\uff0c\u8fd9\u6837\u5373\u4f7f\u540e\u671f\u628a\u5927\u6587\u4ef6\u5220\u4e86\uff0c.git \u6587\u4ef6\u91cc\u9762\u4e5f\u4f1a\u5f88\u5927\uff0c\u9020\u6210\u4ee3\u7801\u4ed3\u5e93\u53d8\u5f97\u5341\u5206\u81c3\u80bf\u3002 \u66f4\u591a\u7ec6\u8282\u67e5\u770b\uff1a\u300aAT\u7ecf\u9a8c\u603b\u7ed3\u300b"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/","title":"AT \u6267\u884c\u5668\u4f7f\u7528\u6307\u5317","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/5/25\n# Author : litao\n# =============================================\n Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1","title":"1\u3001\u529f\u80fd\u4ecb\u7ecd","text":" \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7cfb\u7edf\u8bed\u8a00\u8bbe\u7f6e\uff0c\u5206\u8fa8\u7387\u8bbe\u7f6e\u53ca\u7528\u4f8b\u6267\u884c\u73af\u5883\u642d\u5efa\uff1b \u652f\u6301 IP \u4e3a 15 \u7f51\u6bb5\u7684 AMD \u67b6\u6784\u6d4b\u8bd5\u673a\u955c\u50cf\u88c5\u673a\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u6307\u5b9a\u5e94\u7528\uff0c\u6307\u5b9a\u8303\u56f4\u6807\u7b7e\u7684\u7528\u4f8b\u6267\u884c\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u72b6\u6001\u68c0\u67e5\uff0c\u662f\u5426\u6709\u6b63\u5728\u8fd0\u884c\u7684\u6d4b\u8bd5\uff1b \u652f\u6301\u914d\u7f6e\u7528\u4f8b\u6267\u884c\u65f6\u957f\uff0c\u9632\u6b62\u4efb\u52a1\u963b\u585e\uff1b \u652f\u6301\u6839\u636e\u5e94\u7528\u7248\u672c\u81ea\u52a8\u67e5\u627e\u5bf9\u5e94\u7684\u7528\u4f8b tag\uff1b \u652f\u6301\u5f02\u5e38\u5904\u7406\u548c\u6d4b\u8bd5\u5b8c\u6210\u7684\u5b9e\u65f6\u6d88\u606f\u901a\u77e5\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2job","title":"2\u3001Job \u4ecb\u7ecd","text":"\u4ee5\u4e0b\u6309\u6267\u884c\u6d41\u7a0b\u7684\u987a\u5e8f\u4ecb\u7ecd\uff0c\u6bcf\u4e00\u6b65\u90fd\u53ef\u4ee5\u5355\u72ec\u6267\u884c\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1_1","title":"1\u3001\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/AT_test/ \u6574\u4e2a\u6d41\u7a0b\u7684\u4e3b\u5165\u53e3\uff0c\u901a\u8fc7\u8fd9\u4e2a\u5165\u53e3\uff0c\u8fde\u540c\u6574\u4e2a\u6d4b\u8bd5\u6d41\u7a0b\uff0c\u955c\u50cf\u88c5\u673a\uff0c\u73af\u5883\u90e8\u7f72\uff0c\u6d4b\u8bd5\u5e94\u7528\u53ca\u751f\u6210\u62a5\u544a\u3002 \u53c2\u6570\u4ecb\u7ecd\uff1a \u6d4b\u8bd5\u673a\uff1a\u6240\u6709\u89c4\u6574\u5230\u56fa\u5b9a\u533a\u57df\u7684\u6d4b\u8bd5\u673a\uff0c\u901a\u8fc7\u6d4b\u8bd5\u540c\u5b66\u5bf9\u6d4b\u8bd5\u673a\u7684\u4e60\u60ef\u547d\u540d\uff0c\u5728\u540e\u53f0\u6620\u5c04\u6d4b\u8bd5\u673a\u7684\u8be6\u7ec6\u4fe1\u606f\uff0c\u62ec\u53f7\u4e2d\u4e3a\u6d4b\u8bd5\u673a IP \u7684\u6700\u540e\u4e00\u4f4d\uff1b \u6d4b\u8bd5\u5e94\u7528\uff1a\u6307\u5b9a\u7684\u6d4b\u8bd5\u5e94\u7528\u7684\u5305\u540d\uff0c\u7cfb\u7edf\u6839\u636e\u540d\u79f0\u81ea\u52a8\u62c9\u53d6\u5bf9\u5e94\u7684\u4ed3\u5e93\u4ee3\u7801\uff1b deb\u5305\u4e0b\u8f7d\u5730\u5740\uff1a\u6d4b\u8bd5\u4e0a\u8ff0\u5e94\u7528\u65f6\uff0c\u9700\u8981\u5b89\u88c5\u7684deb\u5305\u4e0b\u8f7d\u5730\u5740\uff0c\u591a\u4e2a\u5730\u5740\u7528\u201c,\u201d\u9694\u5f00\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff1b \u8303\u56f4\u6807\u7b7e\uff1a\u6267\u884c\u6d4b\u8bd5\u7528\u4f8b\u7684\u6807\u7b7e\u8303\u56f4\uff0c\u5bf9\u5e94\u7528\u4f8b\u4ee3\u7801 csv \u6587\u4ef6\u4e2d\u7684\u6807\u7b7e\u4fe1\u606f\uff0c\u4ee5 pytest \u7684mark\u8bed\u6cd5\u7f16\u5199\uff1b \u7cfb\u7edf\u8bed\u8a00\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u8bed\u8a00\u73af\u5883\uff1b \u5206\u8fa8\u7387\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u5206\u8fa8\u7387\u73af\u5883\uff1b \u955c\u50cf\u5730\u5740\uff1a\u955c\u50cf\u4ed3\u5e93\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u901a\u8fc7 PXE \u88c5\u673a\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u88c5\u673a\u73af\u8282\uff08\u76ee\u524d\u4ec5\u652f\u6301\u90e8\u5206 AMD \u67b6\u6784\u7684\u88c5\u673a\uff09\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2pxe","title":"2\u3001PXE \u88c5\u673a","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/IOS_install/ \u8f93\u5165\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\uff0cIP\uff0c\u5bc6\u7801\uff0c\u955c\u50cf\u5730\u5740\u540e\uff0c\u81ea\u52a8\u88c5\u673a\uff0c\u76ee\u524d\u4ec5\u652f\u6301\u56fa\u5b9a 15 \u7f51\u6bb5\u7684\u90e8\u5206 AMD \u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#3","title":"3\u3001\u6b21\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/all_client_test/ \u8be5\u5165\u53e3\u4e0e\u4e3b\u5165\u53e3\u529f\u80fd\u57fa\u672c\u4e00\u81f4\uff0c\u53ea\u662f\u5265\u79bb\u4e86PXE\u88c5\u673a\u6d41\u7a0b\uff0c\u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7684\u6267\u884c\u6d41\u7a0b\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#4","title":"4\u3001\u73af\u5883\u90e8\u7f72","text":"Jenkins url\uff1ahttps://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/env/build?delay=0sec \u8bbe\u7f6e\u6d4b\u8bd5\u673a\u7684\u7cfb\u7edf\u8bed\u8a00\uff0c\u5206\u8fa8\u7387\u53ca\u5b89\u88c5\u6d4b\u8bd5\u6240\u9700\u7684\u4f9d\u8d56\u5305\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#5","title":"5\u3001\u53d1\u9001\u4ee3\u7801","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/send_code/ \u6839\u636e\u6d4b\u8bd5\u5e94\u7528\u540d\u79f0\uff0c\u62c9\u53d6\u5bf9\u5e94\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u5e76\u6839\u636e\u6d4b\u8bd5\u673a\u4e0a\u5e94\u7528\u7248\u672c\u5207\u6362\u5230\u5bf9\u5e94\u7684tag\u7248\u672c\uff0c\u82e5\u672a\u627e\u5230tag\u7248\u672c\uff0c\u5219\u4f7f\u7528\u6700\u65b0\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u518d\u6839\u636e\u5e94\u7528\u5e93\u4ee3\u7801\u4e2d\u914d\u7f6e\u7684\u57fa\u7840\u5e93\u7248\u672c\uff0c\u62c9\u53d6\u57fa\u7840\u5e93\u4ee3\u7801\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#6","title":"6\u3001\u7528\u4f8b\u6267\u884c","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/run_test/ \u8fd0\u884c\u6d4b\u8bd5\u673a\u4e0a\u7684\u7528\u4f8b"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/","title":"AT \u7528\u4f8b\u7b5b\u9009\u6307\u5317","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u7528\u4f8b\u7b5b\u9009\u6807\u51c6\uff0c\u662f\u6311\u9009\u5408\u9002\u7684\u6587\u672c\u7528\u4f8b\u8fdb\u884c\u81ea\u52a8\u5316\u7528\u4f8b\u8f6c\u5316\u7684\u4e00\u4e9b\u901a\u7528\u6807\u51c6\u3002 \u8fc7\u53bb\u6211\u4eec\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u5b9e\u8df5\u8fc7\u7a0b\u4e2d\uff0c\u5199\u4e86\u4e0d\u5c11\u81ea\u52a8\u5316\u7528\u4f8b\uff0c\u968f\u7740\u9700\u6c42\u7684\u8fed\u4ee3\uff0c\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u81ea\u7136\u8150\u5316\uff0c\u56e0\u800c\u9700\u8981\u5728\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\u5bf9\u81ea\u52a8\u5316\u7528\u4f8b\u8fdb\u884c\u7ef4\u62a4\uff0c\u5728\u7ef4\u62a4\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u6211\u4eec\u53d1\u73b0\uff0c\u6709\u4e9b\u7528\u4f8b\u7ef4\u62a4\u8d77\u6765\u592a\u96be\u4e86\uff0c\u8c03\u8bd5\u7528\u4f8b\u8017\u8d39\u5927\u91cf\u65f6\u95f4\uff0c\u6210\u672c\u5f88\u9ad8\u3002 \u56e0\u6b64\uff0c\u6211\u4eec\u603b\u7ed3\u4e00\u4e9b\u81ea\u52a8\u5316\u7528\u4f8b\u9009\u578b\u7684\u6807\u51c6\uff0c\u4ee5\u4f18\u5316\u540e\u7eed\u81ea\u52a8\u5316\u7528\u4f8b\u7ed3\u6784\uff0c\u671f\u5f85\u6211\u4eec\u80fd\u7f16\u5199\u51fa\u9ad8\u6548\u3001\u7a33\u5b9a\u3001\u6613\u4e8e\u7ef4\u62a4\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_1","title":"\u4e00\u3001\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u53ef\u4ee5\u5206\u4e3a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u548c\u4e13\u9879\u81ea\u52a8\u5316\u6d4b\u8bd5\uff0c\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e00\u822c\u53ea\u9488\u5bf9\u4e00\u4e9b\u5e38\u89c4\u7684\u529f\u80fd\u6d4b\u8bd5\uff0c\u5176\u4ed6\u975e\u5e38\u89c4\u529f\u80fd\u7684\u7528\u4f8b\uff0c\u5e94\u8be5\u91c7\u7528\u4e13\u9879\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u6848\uff1b \u4ee5\u4e0b\u662f\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1","title":"1. \u7a33\u5b9a\u6027\u3001\u538b\u6d4b\u7528\u4f8b","text":"\u7a33\u5b9a\u6027\u6d4b\u8bd5\u3001\u538b\u6d4b\u7528\u4f8b\u5e94\u8be5\u662f\u5c5e\u4e8e\u6027\u80fd\u76f8\u5173\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u5982\uff1a\u53cd\u590d\u591a\u6b21\u70b9\u51fb\u6309\u94ae\uff0c\u68c0\u9a8c\u5176\u529f\u80fd\u7a33\u5b9a\u6027\u3002\u56e0\u4e3a\u8fd9\u4e9b\u7528\u4f8b\u65ad\u8a00\u7684\u9884\u671f\u53ef\u80fd\u4e0d\u662f\u5f88\u660e\u786e\uff0c\u66f4\u6709\u751a\u8005\u4e0d\u9700\u8981\u65ad\u8a00\uff0c\u7528\u4f8b\u65f6\u957f\u6bd4\u8f83\u957f\uff0c\u800c\u4e14\u4e0d\u53ef\u63a7\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u76ee\u524d\u6211\u4eec\u6709\u6027\u80fd\u81ea\u52a8\u5316\u7684\u4e13\u9879\u65b9\u6848\uff0c\u4ee5\u53ca\u4e00\u4e9b\u7a33\u5b9a\u6027\u6d4b\u8bd5\u7684\u4e13\u9879\u65b9\u6848\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u6b64\u7c7b\u7528\u4f8b\u653e\u5230\u4e13\u9879\u81ea\u52a8\u5316\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2","title":"2. \u6d89\u53ca\u591a\u4e2a\u7528\u6237\u64cd\u4f5c","text":"\u5e38\u89c1\u4e0e\u6587\u7ba1\u7684\u7528\u4f8b\u4e2d\uff0c\u591a\u7528\u6237\u64cd\u4f5c\u7684\u7528\u4f8b\u4e00\u822c\u90fd\u4f1a\u6d89\u53ca\u5230\u5728\u7cfb\u7edf\u4e2d\u8fdb\u884c\u591a\u4e2a\u7528\u6237\u95f4\u7684\u5207\u6362\uff0c\u81ea\u52a8\u5316\u811a\u672c\u4e00\u822c\u662f\u8fd0\u884c\u5728\u4e00\u4e2a\u7528\u6237\u7a7a\u95f4\u4e0b\u7684\uff0c\u6240\u4ee5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u591a\u7528\u6237\u95f4\u7684\u5207\u6362\u3002 \u6b64\u7c7b\u4e0d\u5efa\u8bae\u91c7\u7528\u81ea\u52a8\u5316\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3","title":"3. \u4e0e\u5f00\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4ea4\u4e92","text":"\u6b64\u7c7b\u573a\u666f\u591a\u4e3a\u5e94\u7528\u7684\u5f02\u5e38\u573a\u666f\u6d4b\u8bd5\uff0c\u6bd4\u5982\uff1a\u590d\u5236\u5927\u6587\u4ef6\u8fc7\u7a0b\u4e2d\u6ce8\u9500\u673a\u5668\u3002 \u81ea\u52a8\u5316\u811a\u672c\u5728\u7cfb\u7edf\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4e4b\u540e\u662f\u4f1a\u505c\u6b62\u8fd0\u884c\u7684\uff1b\u6b64\u7c7b\u7528\u4f8b\u53ef\u4ee5\u505a\u81ea\u52a8\u5316\uff0c\u4f46\u662f\u540c\u6837\u9700\u8981\u505a\u4e13\u9879\u65b9\u6848\uff0c\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u7684\u5904\u7406\u903b\u8f91\u5b8c\u5168\u4e0d\u540c\u3002 \u540e\u7eed\u81ea\u52a8\u5316\u9700\u8981\u516c\u5173\u7684\u70b9\uff1a \u81ea\u52a8\u5316\u811a\u672c\u5728\u672c\u673a\u8fd0\u884c\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u81f3\u5c11\u9700\u8981\u63d0\u4f9b\u4ee5\u4e0b\u529f\u80fd\uff1a \u91cd\u542f\u4e4b\u540e\u7528\u4f8b\u80fd\u81ea\u52a8\u8fd0\u884c\uff1b\u53ef\u4ee5\u8003\u8651\u5c06\u6267\u884c\u7528\u4f8b\u5199\u6210\u4e00\u4e2a\u5f00\u673a\u81ea\u542f\u7684\u670d\u52a1\uff1b \u80fd\u8bb0\u5f55\u5173\u673a\u4e4b\u524d\u7528\u4f8b\u6267\u884c\u7684\u4f4d\u7f6e\uff0c\u91cd\u542f\u4e4b\u540e\u80fd\u4ece\u6b64\u4f4d\u7f6e\u5f00\u59cb\u6267\u884c\uff1b \u50cf\u6027\u80fd\u81ea\u52a8\u5316\u4e00\u6837\uff0c\u7531\u670d\u52a1\u7aef\u63a7\u5236\uff1b \u5b8c\u5168\u57fa\u4e8e\u56fe\u5f62\u8bc6\u522b\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u4e32\u53e3\u7ebf\u63a7\u5236\u952e\u9f20\u7a33\u5b9a\u6027\uff1b "},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4","title":"4. \u6d4b\u8bd5\u6267\u884c\u65f6\u95f4\u957f","text":"\u7528\u4f8b\u6267\u884c\u65f6\u95f4\u63a7\u5236\u57282\u5206\u949f\u4ee5\u5185\uff0c\u6781\u7aef\u60c5\u51b5\u4e0d\u8981\u8d85\u8fc75\u5206\u949f\uff0c\u6240\u6709\u7528\u4f8b\u7684\u5e73\u5747\u65f6\u957f\u5e94\u8be5\u57281\u5206\u949f\u5de6\u53f3\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u95f4\u592a\u957f\uff0c\u7f16\u5199\u7528\u4f8b\u3001\u8c03\u8bd5\u7528\u4f8b\u3001\u6267\u884c\u7528\u4f8b\u3001\u7ef4\u62a4\u7528\u4f8b\u90fd\u975e\u5e38\u7684\u8017\u65f6\uff0c\u4eba\u529b\u6210\u672c\u65f6\u95f4\u6210\u672c\u6295\u5165\u592a\u9ad8\u3002 \u4f60\u60f3\uff0c\u8fd9\u6761\u7528\u4f8b\u6267\u884c\u9700\u89815\u5206\u949f\uff0c\u90a3\u4f60\u5199\u8fd9\u6761\u7528\u4f8b\u7684\u65f6\u95f4\u4e0d\u53ef\u80fd\u4e00\u904d\u8fc7\uff0c\u5199\u7684\u8fc7\u7a0b\u4e2d\u8dd1\u4e0d\u901a\u8fd8\u5f97\u91cd\u8dd1\u81f3\u5c1115\u5206\u949f\u4e0d\u8fc7\u5206\uff0c\u5199\u5b8c\u4e86\u8fd8\u5f97\u5728\u5176\u4ed6\u67b6\u6784\u4e0a\u8c03\u8bd5\uff0c\u534a\u4e2a\u5c0f\u65f6\u8fc7\u53bb\u4e86\uff0c\u8fd9\u8fd8\u53ea\u662f\u7b2c\u4e00\u6b21\u5199\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u540e\u7eed\u5982\u679c\u7528\u4f8b\u7ef4\u62a4\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u7ecf\u5e38\u6295\u5165\u76f8\u5f53\u957f\u65f6\u95f4\uff0c\u8fd9\u6837\u5176\u5b9e\u662f\u5931\u53bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u7684\u3002\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u5c31\u5e94\u8be5\u662f\u5feb\u51c6\u72e0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5","title":"5. \u8fb9\u7f18\u6027\u6d4b\u8bd5","text":"\u6709\u4e9b\u529f\u80fd\u6a21\u5757\u672c\u8eab\u662f\u5c5e\u4e8e\u6bd4\u8f83\u8fb9\u7f18\u6027\u7684\uff0c\u5373\u6781\u5c11\u7528\u6237\u4f1a\u4f7f\u7528\u5230\u7684\u529f\u80fd\uff0c\u8fd9\u7c7b\u529f\u80fd\u6a21\u5757\u4e0d\u9700\u8981\u5927\u89c4\u6a21\u5b9e\u73b0\u81ea\u52a8\u5316\uff0c\u4e00\u4e24\u4e2a\u573a\u666f\u8986\u76d6\u57fa\u672c\u529f\u80fd\u5c31\u884c\u4e86\uff0c\u56e0\u6b64\u6211\u4eec\u5728\u6311\u9009\u6b64\u7c7b\u7528\u4f8b\u7684\u65f6\u5019\u53ef\u4ee5\u7ed3\u5408\u6574\u4e2a\u529f\u80fd\u6a21\u5757\u7684\u8986\u76d6\u60c5\u51b5\u6765\u51b3\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6","title":"6. \u9700\u8981\u4f9d\u8d56\u4eba\u5de5\u4ecb\u5165\u7684","text":"\u81ea\u52a8\u5316\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\u662f\u6ca1\u6709\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bd4\u5982\u8981\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u90a3\u4e48\u5c31\u80cc\u79bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u3002 \u6bd4\u5982\u5149\u9a71\u6a21\u5757\uff0c\u5149\u9a71\u523b\u5f55\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u4f46\u662f\u5149\u9a71\u523b\u5f55\u4e4b\u540e\u5149\u76d8\u4f1a\u5f39\u51fa\u6765\uff0c\u9700\u8981\u4eba\u5de5\u66f4\u6362\u5149\u76d8\uff0c\u518d\u624b\u52a8\u63a8\u8fdb\u5149\u9a71\u4e2d\u3002 \u8fd9\u79cd\u529f\u80fd\u6a21\u5757\u5373\u4f7f\u505a\u81ea\u52a8\u5316\uff0c\u80fd\u6d89\u53ca\u5230\u7684\u529f\u80fd\u975e\u5e38\u6709\u9650\uff0c\u800c\u4e14\u4e0d\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u6240\u4ee5\u660e\u663e\u5c31\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7","title":"7. \u96be\u4ee5\u5b9e\u73b0\u7684","text":"\u7528\u4f8b\u6240\u6d89\u53ca\u5230\u7684\u65b9\u6cd5\u5b9e\u73b0\u8d77\u6765\u53ef\u80fd\u6709\u96be\u5ea6\uff0c\u751a\u81f3\u73b0\u9636\u6bb5\u65e0\u6cd5\u5b9e\u73b0\u7684\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002 \u6bd4\u5982\u5f71\u9662\u6d4b\u8bd5\u753b\u9762\u6e05\u6670\u5ea6\u3001\u6d41\u7545\u5ea6\u3001\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u4e4b\u540e\u7684\u89c6\u9891\u662f\u5426\u5b58\u5728\u5361\u987f\u7b49\u7528\u4f8b\uff0c\u73b0\u9636\u6bb5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#8","title":"8. \u529f\u80fd\u4e0d\u7a33\u5b9a","text":"\u8fd9\u4e2a\u4e0d\u662f\u8bf4\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\uff0c\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\u4e0d\u7a33\u5b9a\u662f\u6b63\u5e38\u7684\uff0c\u8fd9\u79cd\u6211\u4eec\u53ef\u4ee5\u7b49\u5f00\u53d1\u63d0\u6d4b\u4e4b\u540e\u518d\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u3002 \u529f\u80fd\u4e0d\u7a33\u5b9a\u6307\u7684\u662f\u7528\u4f8b\u6240\u6d89\u53ca\u7684\u529f\u80fd\uff0c\u53ef\u80fd\u5b58\u5728\u591a\u79cd\u53d8\u5316\uff0c\u6bcf\u6b21\u6267\u884c\u7528\u4f8b\u53ef\u80fd\u65ad\u8a00\u7684\u9884\u671f\u90fd\u4e0d\u540c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#9","title":"9. \u52a8\u6001\u65ad\u8a00","text":"\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u76f4\u5230\u7528\u4f8b\u7ed3\u675f\uff0c\u4e00\u76f4\u662f\u4e00\u4e2a\u52a8\u6001\u53d8\u5316\u7684\u8fc7\u7a0b\uff0c\u800c\u4e14\u65e0\u6cd5\u901a\u8fc7\u5176\u4ed6\u624b\u6bb5\u505c\u4e0b\u6765\uff1b \u6bd4\u5982\uff1a\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u65f6\uff0c\u53f3\u4e0b\u89d2\u7684\u5f55\u5236\u65f6\u95f4\u662f\u4e00\u76f4\u5728\u53d8\u5316\u7684\uff0c\u7528\u4f8b\u9700\u8981\u6d4b\u8bd5\u5f55\u52361\u5206\u949f\u4e4b\u540e\uff0c\u5f55\u5236\u65f6\u95f4\u662f\u521a\u597d\u505c\u572860\u79d2\uff1b \u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fd8\u505a\u4e0d\u5230\u65f6\u95f4\u7cbe\u51c6\u63a7\u5236\uff0c\u7a0b\u5e8f\u6267\u884c\u65f6\u95f4\u662f\u6709\u6ce2\u52a8\u7684\uff0c\u800c\u4e14\u8981\u9002\u914d\u591a\u4e2a\u5e73\u53f0\uff0c\u6240\u4ee5\u6b64\u7c7b\u7528\u4f8b\u5927\u6982\u7387\u4f1a\u6267\u884c\u5931\u8d25\u3002\u7279\u522b\u662f\u5728\u6027\u80fd\u8f83\u5dee\u7684\u56fd\u4ea7\u5316\u67b6\u6784\u4e0a\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u592a\u53ef\u80fd\u7a33\u5b9a\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#10","title":"10. \u63a2\u7d22\u6027\u6d4b\u8bd5","text":"\u63a2\u7d22\u6027\u6d4b\u8bd5\u901a\u5e38\u662f\u4e00\u4e9b\u4e0d\u786e\u5b9a\u7684\u64cd\u4f5c\uff0c\u591a\u53d8\u5207\u590d\u6742\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u9884\u671f\u4e5f\u53ef\u80fd\u662f\u4e0d\u786e\u5b9a\u7684\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u9a9a\u64cd\u4f5c\u592a\u591a\u4e86\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6b64\u7c7b\u7528\u4f8b\u9002\u5408\u91c7\u7528\u624b\u5de5\u6d4b\u8bd5\uff0c\u662f\u624b\u5de5\u6d4b\u8bd5\u771f\u6b63\u7684\u4ef7\u503c\u4f53\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#11","title":"11. \u6613\u7528\u6027\u6d4b\u8bd5","text":"\u5bf9\u4e8e\u6613\u7528\u6027\u7684\u5224\u65ad\u901a\u5e38\u662f\u4e3b\u89c2\u7684\uff0c\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\u5f88\u96be\u53bb\u5b9a\u4e49\u4ec0\u4e48\u6837\u7684\u60c5\u51b5\u5bf9\u7528\u6237\u662f\u6613\u7528\u7684\uff0c\u81ea\u52a8\u5316\u9700\u8981\u6709\u660e\u786e\u7684\u53ef\u5b9e\u73b0\u7684\u9884\u671f\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_2","title":"\u4e8c\u3001\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u524d\u9762\u8bb2\u4e86\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u4e00\u4e9b\u7528\u4f8b\u60c5\u51b5\uff0c\u6709\u540c\u5b66\u5c31\u8bf4\u4e86\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\u4e0d\u7528\u8bb2\u4e86\uff0c\u5c31\u662f\u4e0d\u9002\u5408\u7684\u53cd\u9762\u3002\u6ca1\u6bdb\u75c5\u54c8\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\uff0c\u6211\u4eec\u5927\u4f53\u8fd8\u53ef\u4ee5\u5206\u4e3a\u4e24\u7c7b\uff1a \u7b2c\u4e00\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u597d\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u7b2c\u4e8c\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u4e00\u822c\uff0c\u9700\u8981\u6295\u5165\u66f4\u591a\u7cbe\u529b\u624d\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u4ee5\u4e0b\u4ecb\u7ecd\u4e00\u4e9b\u6211\u4eec\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1_1","title":"1. \u64cd\u4f5c\u76f8\u5bf9\u7b80\u5355","text":"\u7528\u4f8b\u6b65\u9aa4\u76f8\u5bf9\u8f83\u5c11\uff0c\u8fd9\u79cd\u7528\u4f8b\u901a\u5e38\u662f\u4e00\u4e9b\u8def\u5f84\u5f88\u6d45\u7684\u7528\u4f8b\uff0c\u4e00\u822c\u4e5f\u662f\u4e00\u4e9b\u57fa\u7840\u7528\u4f8b\u3002\u7528\u4f8b\u7f16\u5199\u3001\u7ef4\u62a4\u90fd\u53ef\u4ee5\u8f7b\u677e\u641e\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2_1","title":"2. \u5bb9\u6613\u5b9e\u73b0","text":"\u73b0\u6709\u6280\u672f\u662f\u53ef\u5b9e\u73b0\u7684\uff0c\u6ca1\u6709\u96be\u5ea6\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3_1","title":"3. \u7ecf\u5e38\u7528\u4e8e\u56de\u5f52\u6d4b\u8bd5","text":"\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bcf\u6b21\u56de\u5f52\u6d4b\u8bd5\u5fc5\u987b\u8981\u6267\u884c\u7684\u7528\u4f8b\uff0c\u90a3\u4e48\u8fd9\u6761\u7528\u4f8b\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u3002 \u56de\u5f52\u6d4b\u8bd5\u65f6\u6211\u4eec\u9996\u5148\u5e94\u8be5\u4fdd\u8bc1\u5e94\u7528\u5386\u53f2\u57fa\u672c\u529f\u80fd\u6b63\u5e38\uff0c\u6240\u4ee5\u90a3\u4e9b\u6bcf\u6b21\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u90fd\u8981\u6267\u884c\u7684\u7528\u4f8b\u9002\u5408\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4_1","title":"4. \u529f\u80fd\u7a33\u5b9a\u7684\u6838\u5fc3\u529f\u80fd","text":"\u6d89\u53ca\u6838\u5fc3\u529f\u80fd\u7684\u7528\u4f8b\u662f\u6700\u6700\u91cd\u8981\u7684\u7528\u4f8b\uff0c\u4e5f\u662f\u6211\u4eec\u4ea4\u4ed8\u65f6\u5fc5\u987b\u8981\u4fdd\u8bc1\u8d28\u91cf\u7684\u76f8\u5173\u529f\u80fd\uff0c\u56e0\u6b64\u5e94\u8be5\u5c3d\u53ef\u80fd\u7684\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5_1","title":"5. \u8f93\u5165\u6570\u636e\u6d4b\u8bd5","text":"\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u901a\u5e38\u662f\u68c0\u9a8c\u88ab\u6d4b\u5e94\u7528\u63a5\u53d7\u6709\u6548\u6570\u636e\u3001\u62d2\u7edd\u65e0\u6548\u6570\u636e\u7684\u80fd\u529b\u3002\u5982\uff1a\u63d0\u4ea4\u8d85\u957f\u5b57\u7b26\u4e32\u3001\u7279\u6b8a\u5b57\u7b26\u4e32\u7b49\u7b49\u3002 \u6b64\u7c7b\u7528\u4f8b\u624b\u5de5\u6d4b\u8bd5\u5f88\u96be\u6bd4\u8f83\u5168\u9762\u7684\u8986\u76d6\u5230\u6240\u6709\u7684\u8f93\u5165\u60c5\u51b5\uff0c\u4f46\u662f\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\uff0c\u6b64\u7c7b\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u90fd\u662f\u4e00\u6837\u7684\uff0c\u53d8\u5316\u7684\u4ec5\u662f\u8f93\u5165\u53c2\u6570\u548c\u65ad\u8a00\u7ed3\u679c\uff0c\u91c7\u7528\u6570\u636e\u9a71\u52a8\uff0c\u53ef\u4ee5\u8f7b\u677e\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6_1","title":"6. \u683c\u5f0f\u8986\u76d6","text":"\u539f\u56e0\u540c\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u7c7b\u7528\u4f8b\u4e00\u6837\uff0c\u591a\u79cd\u683c\u5f0f\u7684\u8986\u76d6\u4e5f\u662f\u4e00\u4e2a\u5f88\u7e41\u7410\u7684\u4e8b\u60c5\uff0c\u4ea4\u7ed9\u81ea\u52a8\u5316\u6765\u505a\u518d\u5408\u9002\u4e0d\u8fc7\u4e86\u3002 \u6bd4\u5982\u5f71\u9662\u5bf9\u5f71\u7247\u683c\u5f0f\u7684\u68c0\u67e5\u3001\u622a\u56fe\u5f55\u5c4f\u5bf9\u4fdd\u5b58\u683c\u5f0f\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7_1","title":"7. \u68c0\u67e5\u5143\u7d20\u72b6\u6001","text":"\u67e5\u770b\u88ab\u6d4b\u5e94\u7528\u7684\u5143\u7d20\u5c5e\u6027\u3002\u5982\uff1a\u56fe\u7247\u7684\u5927\u5c0f\u548c\u6392\u5217\uff1b\u6309\u94ae\u7684\u53ef\u7528\u548c\u4e0d\u53ef\u7528\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/","title":"AT \u7ecf\u9a8c\u603b\u7ed3","text":"\u6b22\u8fce\u6240\u6709\u4eba\u63d0\u4ea4\u4f60\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u9762\u7684\u4f18\u79c0\u5b9e\u8df5\u7ecf\u9a8c\uff0c\u4ee5\u5e2e\u52a9\u5927\u5bb6\u89e3\u51b3\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#1","title":"1\u3001\u7ec8\u7ed3\u5668","text":"# litaoa@uniontech.com\n \u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4 pytest \u5b9e\u73b0\u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4\u7684\u65b9\u5f0f\u6709\u4e24\u79cd\uff0cyield \u548c\u7ec8\u7ed3\u51fd\u6570\uff1b yield \u5b9e\u73b0\uff0cyield\u524d\u9762\u4e3a\u7528\u4f8b\u7684\u524d\u7f6e\u6b65\u9aa4\uff0cyield \u540e\u9762\u4e3a\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4\u3002 @pytest.fixture\ndef clean_env():\nprint(\"setup\")\nyield\nprint(\"teardown\")\n \u7ec8\u7ed3\u51fd\u6570\u5b9e\u73b0\uff0c\u4f7f\u7528 request.addfinalizer \u6ce8\u518c\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4 @pytest.fixture\ndef clean_env(request):\ndef clean():\nprint(\"teardown\")\nrequest.addfinalizer(clean)\nprint(\"setup\")\n yield\u7684\u4f18\u7f3a\u70b9\uff1a \u4f18\u70b9\uff1a\u4ee3\u7801\u7b80\u6d01\uff0c\u76f4\u89c2\uff0c\u53ef\u4f7f\u7528yield\u5728\u7528\u4f8b\u4e2d\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c \u7f3a\u70b9\uff1a\u82e5\u524d\u7f6e\u6b65\u9aa4\u4e2d\u51fa\u73b0\u9519\u8bef\uff0c\u5219\u540e\u7f6e\u6b65\u9aa4\u4e0d\u4f1a\u6267\u884c \u7ec8\u7ed3\u51fd\u6570\uff1a \u4f18\u70b9\uff1a\u524d\u7f6e\u6b65\u9aa4\u5931\u8d25\u7684\u8bdd\uff0c\u540e\u7f6e\u6b65\u9aa4\u4ecd\u4f1a\u6267\u884c\u4e14\u53ef\u4ee5\u6ce8\u518c\u591a\u4e2a\u540e\u7f6e\u6b65\u9aa4\uff08\u524d\u63d0\uff1a\u9700\u8981\u5728\u4ee3\u7801\u62a5\u9519\u4e4b\u524d\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff09\uff0c\u652f\u6301\u7075\u6d3b\u4f7f\u7528\u540e\u7f6e\u6761\u4ef6 \u7f3a\u70b9\uff1a\u4ee3\u7801\u8f83\u4e3a\u590d\u6742\uff0c\u65e0\u6cd5\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c\uff08\u672c\u4eba\u76ee\u524d\u672a\u5b9e\u73b0\uff09 \u603b\u7ed3\uff1a\u5728\u524d\u7f6e\u6b65\u9aa4\u4fdd\u8bc1\u7edd\u5bf9\u4e0d\u4f1a\u51fa\u9519\u65f6\uff0c\u4f7f\u7528yield\u66f4\u4f73\u7b80\u4fbf\uff0c\u5f53\u524d\u7f6e\u6b65\u9aa4\u6613\u51fa\u73b0\u95ee\u9898\u65f6\uff0c\u63a8\u8350\u4f7f\u7528\u7ec8\u7ed3\u51fd\u6570\u3002 \u573a\u666f\uff1a\u4fdd\u9669\u7bb1\u7528\u4f8b\uff0c\u524d\u7f6e\u6b65\u9aa4\u4e2d\u5f00\u542f\u4fdd\u9669\u7bb1\uff0c\u540e\u7f6e\u6b65\u9aa4\u5220\u9664\u4fdd\u9669\u7bb1\u3002 @pytest.fixture(scope=\"session\", autouse=True)\ndef vault_fixture(request):\nDfmWidget.reset_vault_by_cmd() # 1\u3001\u91cd\u7f6e\u4fdd\u9669\u7bb1\nDdeDockPublicWidget().close_file_manager_by_cmd() # 2\u3001\u5173\u95ed\u6587\u7ba1\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 3\u3001\u5f00\u542f\u6587\u7ba1\nvault = DfmWidget()\nvault.create_file_vault() # 4\u3001\u521b\u5efa\u4fdd\u9669\u7bb1\ndef delete_vault(): # 8\u3001\u5220\u9664\u4fdd\u9669\u7bb1\u7684\u540e\u7f6e\u6b65\u9aa4\nsleep(2)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr()\nvault = DfmWidget()\nvault.delete_file_vault()\nDfmWidget.reset_vault_by_cmd()\nDdeDockPublicWidget().close_file_manager_by_cmd()\nrequest.addfinalizer(delete_vault) # 5\u3001\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\nDdeDockPublicWidget().close_file_manager_by_cmd() # 6\u3001\u5173\u95ed\u6587\u7ba1\nsleep(1)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 7\u3001\u5f00\u542f\u6587\u7ba1\n \u4ee3\u7801\u6309\u6ce8\u91ca\u4e2d\u7684\u5e8f\u53f7\u6267\u884c\u6b65\u9aa4 \u4ee3\u7801\u5728\u6b65\u9aa41-4\u4efb\u610f\u4f4d\u7f6e\u62a5\u9519\uff0c\u5219\u4e0d\u4f1a\u6267\u884c\u6b65\u9aa48\uff0c\u56e0\u4e3a\u672a\u6267\u884c\u5230\u6b65\u9aa45\uff0c\u6b65\u9aa48\u8fd8\u672a\u6ce8\u518c \u4ee3\u7801\u5728\u6b65\u9aa46-7\u62a5\u9519\uff0c\u4ecd\u4f1a\u6267\u884c\u6b65\u9aa47\uff0c\u56e0\u4e3a\u5728\u6b65\u9aa45\u4e2d\u5df2\u7ecf\u5c06\u6b65\u9aa47\u6ce8\u518c \u53ef\u4ee5\u7075\u6d3b\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff0c\u80fd\u5b9e\u73b0\u67d0\u4e2a\u524d\u7f6e\u6b65\u9aa4\u6267\u884c\u4e4b\u540e\uff0c\u624d\u4f1a\u6267\u884c\u540e\u7f6e\u6b65\u9aa4\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#2","title":"2\u3001\u542f\u52a8\u5e94\u7528\u7684\u65b9\u5f0f","text":"# huangmingqiang@uniontech.com\n \uff081\uff09\u547d\u4ee4\u884c\u542f\u52a8 \u5728 AT \u4ee3\u7801\u4e2d\u4f7f\u7528\u547d\u4ee4\u884c\u542f\u52a8\u5e94\u7528\uff0c\u4e3e\u4f8b\uff1a os.popen(\"deepin-music\")\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f7f\u7528 ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6\uff0cdogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u3002 \uff082\uff09\u901a\u8fc7 UI \u64cd\u4f5c\u542f\u52a8 \u901a\u8fc7\u4efb\u52a1\u680f\u3001\u542f\u52a8\u5668\u3001\u684c\u9762\u7b49UI\u65b9\u5f0f\u542f\u52a8\uff0c\u6bd4\u5982\u53cc\u51fb\u6253\u5f00\u3001\u53f3\u952e\u6253\u5f00\u7b49\uff0c\u8fd9\u79cd\u64cd\u4f5c\u65b9\u5f0f\u4e0d\u5b58\u5728ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6dogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u7684\u95ee\u9898\uff0c\u4e5f\u66f4\u52a0\u7b26\u5408\u7528\u6237\u7684\u64cd\u4f5c\u884c\u4e3a\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#3","title":"3\u3001\u6587\u4ef6\u9009\u62e9\u6846\u5c5e\u6027\u5b9a\u4f4d\u5076\u73b0\u65e0\u6cd5\u627e\u5230","text":"\u6587\u4ef6\u9009\u62e9\u6846\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5728\u8c03\u7528\u6587\u4ef6\u9009\u62e9\u6846\u65f6\uff0c\u6709\u4e00\u5b9a\u7684\u6982\u7387\u51fa\u73b0\uff0c\u754c\u9762\u5df2\u7ecf\u6e32\u67d3\u51fa\u6765\u4e86\uff0c\u4f46\u662f\u5c5e\u6027\u6811\u5e76\u6ca1\u6709\u5199\u5165\uff0c\u5bfc\u81f4\u901a\u8fc7\u5c5e\u6027\u65e0\u6cd5\u627e\u5230\u5143\u7d20\uff0c\u76ee\u524d\u4e5f\u6ca1\u6709\u5f88\u597d\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u4e3a\u4e86\u7528\u4f8b\u7a33\u5b9a\u6027\uff0c\u6587\u4ef6\u9009\u62e9\u6846\u7684\u64cd\u4f5c\u5efa\u8bae\u4f7f\u7528UI\u6216\u8005\u56fe\u7247\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u53ef\u4ee5\u901a\u8fc7\u641c\u7d22\u5185\u5bb9\u56fa\u5b9a\u6587\u4ef6\u4f4d\u7f6e\u3002 # litaoa@uniontech.com\n desk = DdeDesktopPublicWidget()\n# \u9009\u62e9\u89c6\u9891\u76ee\u5f55\ndesk.click_videos_dir_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.ctrl_f()\nsleep(1)\ndesk.input_message(\"\u5143\u7d20\u540d\u79f0\")\nsleep(0.5)\ndesk.enter()\nsleep(1)\n# \u9009\u62e9\u7b2c\u4e00\u4e2a\u6587\u4ef6\ndesk.click_list_view_btn_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.click_first_file_in_desktop_plugs_by_ui()\nsleep(1)\n# \u6587\u7ba1\u63d2\u4ef6\u4e2d\u70b9\u51fb\u6253\u5f00\ndesk.click_open_btn_in_desktop_plugs_by_ui()\n"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#4","title":"4\u3001\u5e94\u7528\u542f\u52a8","text":"# mikigo\n \u5728UI\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u4e00\u5207\u64cd\u4f5c\u7684\u90fd\u662f\u4ece\u5e94\u7528\u542f\u52a8\u5f00\u59cb\u7684\uff0c\u800c\u5728Linux\u684c\u9762\u5e94\u7528\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u6211\u4eec\u542f\u52a8\u5e94\u7528\u7684\u65b9\u6cd5\u6709\u591a\u79cd\uff0c\u4e0b\u9762\u505a\u4e00\u4e2a\u7b80\u5355\u7684\u4ecb\u7ecd\uff1a \u3010\u4f7f\u7528dogtail\u542f\u52a8\u3011 dogtail\u63d0\u4f9b\u4e86\u5e94\u7528\u542f\u52a8\u7684\u65b9\u6cd5\uff0c\u5728utils\u5e93\u4e2d\uff0c\u4f7f\u7528run\u65b9\u6cd5\u542f\u52a8\uff1a \u9996\u5148\u5bfc\u5165\u65b9\u6cd5\uff1a from dogtail.utils import *\n \u8c03\u7528run\u65b9\u6cd5 run('deepin-music')\n \u5373\u53ef\u542f\u52a8\u97f3\u4e50 \u8fd9\u79cd\u65b9\u6cd5\u7684\u4f18\u70b9\u662f\u91c7\u7528\u8fdb\u7a0b\u7684\u65b9\u5f0f\u76f4\u63a5\u542f\u52a8\uff0c\u4e0d\u4f9d\u8d56\u4e0eUI\uff0c\u65e0\u8bba\u684c\u9762\u6216\u4efb\u52a1\u680f\u4e0a\u662f\u5426\u5b58\u5728\u5e94\u7528\u56fe\u6807\uff0c\u90fd\u53ef\u4ee5\u6b63\u5e38\u542f\u52a8\u3002 \u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c \u5982\u679c\u4f7f\u7528ssh\u8fdc\u7a0b\u8c03\u7528\uff0c\u6216\u8005Jenkins\u4e2d\u6267\u884c\u6d4b\u8bd5\u811a\u672c\u7684\u65f6\u5019\uff0c\u5728sniff\u4e2d\u4f1a\u51fa\u73b0\u627e\u4e0d\u5230\u5e94\u7528\uff0c\u7ecf\u8fc7\u5206\u6790\uff0c\u53ef\u80fd\u662f\u56e0\u4e3a\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\u542f\u52a8\u7684\u65f6\u5019\uff0c\u5b9e\u9645\u662f\u91c7\u7528\u4e00\u4e2a\u5b50\u8fdb\u7a0b\u542f\u52a8\u4e86\u5e94\u7528\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u5230\u3002 \u3010\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u3011 \u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807 \u901a\u5e38\u6709\u4e24\u79cd\u65b9\u6cd5\uff1a \uff081\uff09\u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807\u3002 \uff082\uff09\u5df2\u77e5\u5e94\u7528\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u7684\u4f4d\u7f6e\uff0c\u7136\u540e\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u5bf9\u5e94\u5750\u6807\u3002 \u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u7f3a\u70b9\u662f\u4f4d\u7f6e\u5fc5\u987b\u56fa\u5b9a\uff0c\u5982\u679c\u79fb\u52a8\u4f4d\u7f6e\u5c31\u4e0d\u884c\u4e86\uff0c\u800c\u4f7f\u7528\u7b2c\u4e00\u79cd\u65b9\u6cd5\uff0c\u65e0\u8bba\u4f4d\u7f6e\u5728\u54ea\u91cc\uff0c\u53ea\u8981\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u5b58\u5728\u5373\u53ef\u3002 \u3010\u70b9\u51fb\u684c\u9762\u56fe\u6807\u542f\u52a8\u3011 \u684c\u9762\u56fe\u6807\u76ee\u524d\u662f\u91c7\u7528\u56fe\u50cf\u8bc6\u522b\u6280\u672f\uff0c\u5b9a\u4f4d\u5230\u5e94\u7528\u56fe\u6807\u7684\u5750\u6807\uff0c\u7136\u540e\u901a\u8fc7pyauogui\u8fdb\u884c\u70b9\u51fb\u64cd\u4f5c\u3002 \u8be6\u7ec6\u6280\u672f\u65b9\u6848\u53ef\u4ee5\u53c2\u8003\u6211\u7684\u53e6\u5916\u4e24\u7bc7\u535a\u5ba2: \u57fa\u4e8eopencv\u7684\u6a21\u677f\u5339\u914d\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd4\u56de\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 Python\u4e09\u65b9\u5e93PyAutoGui\u7684\u4f7f\u7528\u65b9\u6cd5 \u3010\u4ece\u542f\u52a8\u5668\u542f\u52a8\uff08\u4fd7\u79f0\u5f00\u59cb\u83dc\u5355\uff09\u3011 \u542f\u52a8\u4e2d\u542f\u52a8\u7684\u5b9e\u73b0\u903b\u8f91\u5b9e\u9645\u548c\u4efb\u52a1\u680f\u4e0a\u542f\u52a8\u5dee\u4e0d\u591a\u3002 \u9996\u5148\uff0c\u9700\u8981\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u542f\u52a8\u5668\u56fe\u6807\uff0c\u6216\u8005\u952e\u76d8super\u952e\uff0c\u5c06\u542f\u52a8\u5668\u547c\u51fa\u6765\uff0c \u7136\u540e\uff0c\u5728\u542f\u52a8\u5668\u4e2d\u70b9\u51fb\u5bf9\u5e94\u7684\u56fe\u6807\uff0c \u4f46\u662f\u8fd9\u91cc\u6709\u4e2a\u95ee\u9898\uff0c\u542f\u52a8\u5668\u4e2d\u7684\u5e94\u7528\u5217\u8868\uff0c\u4e00\u9875\u5c55\u793a\u4e0d\u5b8c\uff0c\u6240\u4ee5\u5982\u679c\u6211\u4eec\u8981\u70b9\u51fb\u7684\u5e94\u7528\u56fe\u6807\u4e0d\u5728\u7b2c\u4e00\u9875\u600e\u4e48\u529e\uff0c\u901a\u5e38\u89e3\u51b3\u65b9\u6848\u6709\u4e24\u79cd\uff1a \uff081\uff09\u9700\u8981\u8fdb\u884c\u5411\u4e0b\u6ed1\u52a8\uff0c\u8fd9\u91cc\u5c31\u6d89\u53ca\u5230\u76f8\u5e94\u7684\u8bc6\u522b\u65b9\u6848\uff0c\u5224\u65ad\u5982\u679c\u4e0d\u5728\u7b2c\u4e00\u9875\u5c31\u5f80\u4e0b\u6ed1\u52a8\u7ffb\u9875\u3002 \uff082\uff09\u542f\u52a8\u5668\u63d0\u4f9b\u641c\u7d22\u7684\u529f\u80fd\uff0c\u8f93\u5165\u5e94\u7528\u540d\u79f0\u641c\u7d22\uff0c\u7136\u540e\u8fdb\u884c\u70b9\u51fb\u3002 \u4ece\u5b9e\u9645\u64cd\u4f5c\u4e2d\u6765\u770b\uff0c\u91c7\u7528\u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u6548\u7387\u4f1a\u9ad8\u4e00\u70b9\u3002 \u3010\u7ec8\u7aef\u547d\u4ee4\u542f\u52a8\u3011 \u5728python\u4e2d\uff0c\u4f7f\u7528os.popen()\u6216os.system()\u6216\u8005subprocess.Popen()\uff0c\u5b9e\u73b0\u547d\u4ee4\u884c\u542f\u52a8\uff0c\u6bd4\u5982\uff1a import os\nos.popen('deepin-music')\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u8fdc\u7a0b\u6267\u884c\u811a\u672c\u7684\u65f6\u5019\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u7684\u95ee\u9898\u3002 \u3010\u603b\u7ed3\u3011 \u4ee5\u4e0a\u51e0\u79cd\u65b9\u6cd5\uff0c\u5404\u6709\u4f18\u7f3a\u70b9\uff0c\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff1a \uff081\uff09\u5982\u679c\u9700\u8981\u5728Jenkins\u4e2d\u505a\u6301\u7eed\u96c6\u6210\uff0c\u5efa\u8bae\u4f7f\u7528\u7b2c\u4e8c\u79cd\u4efb\u52a1\u680f\u542f\u52a8\u7684\u65b9\u6cd5\u3002 \uff082\uff09\u5982\u679c\u4e0d\u4f1a\u91c7\u7528\u8fdc\u7a0b\u6267\u884c\u7684\uff0c\u5efa\u8bae\u91c7\u7528\u7b2c\u4e00\u79cd\u6216\u8005\u6700\u540e\u4e00\u79cd\u65b9\u6848\u3002 \uff083\uff09\u7b2c\u4e09\u79cd\u548c\u7b2c\u56db\u79cd\u542f\u52a8\u65b9\u6cd5\uff0c\u901a\u5e38\u5728\u6d4b\u8bd5\u7528\u4f8b\u4e2d\u4f1a\u6d89\u53ca\u5230\uff0c\u6240\u4ee5\u5076\u5c14\u4f1a\u7528\u3002"},{"location":"RELEASE/","title":"\u7248\u672c\u66f4\u65b0\u8bb0\u5f55","text":""},{"location":"RELEASE/#220202395","title":"2.2.0\uff082023/9/5\uff09","text":"new \u6b63\u5f0f\u542f\u7528 letmego \u6280\u672f\u65b9\u6848\uff1b fix \u5bf9 docs \u91cc\u9762\u7ec6\u5316\u4e86\u8fdc\u7a0b\u6267\u884c\u7ae0\u8282\u7684\u63cf\u8ff0\uff1b "},{"location":"RELEASE/#2152023831","title":"2.1.5\uff082023/8/31\uff09","text":"new \u5c06\u6709\u8da3\u7684\u6587\u6863\u7cfb\u7edf\u8fc1\u79fb\u5230 linuxdeepin \uff0c\u5265\u79bb\u6587\u6863\u4e2d\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u91c7\u7528 CDN \u52a0\u901f\u65b9\u5f0f\u52a0\u8f7d\uff1b \u5c1d\u8bd5\u5408\u5165\u4e00\u4e2a\u6709\u8da3\u7684\u529f\u80fd\uff1b fix \u4fee\u590d\u4e86 Wayland \u952e\u9f20\u5de5\u5177\u6ca1\u6709\u9f20\u6807\u76f8\u5bf9\u79fb\u52a8\u65b9\u6cd5 moveRel \u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 Wayland \u4e0b\u83b7\u53d6\u7a97\u53e3\u4fe1\u606f\u529f\u80fd\u6a21\u5757\u4e2d\u73af\u5883\u53d8\u91cf\u7684\u95ee\u9898\uff1b \u4f18\u5316\u4e86 startproject \u529f\u80fd\u7684\u4e00\u4e9b\u4fe1\u606f\u8f93\u51fa\uff1b \u4fee\u590d\u4e86\u7279\u6b8a\u573a\u666f\u4e0b env_dev.sh \u5f00\u53d1\u73af\u5883\u90e8\u7f72\u662f\u53ef\u80fd\u5f71\u54cd\u5230\u6b63\u5f0f\u73af\u5883 env.sh \u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#2122023822","title":"2.1.2\uff082023/8/22\uff09","text":"new \u589e\u52a0 OCR \u8bc6\u522b\u81ea\u52a8\u91cd\u8bd5\u673a\u5236\uff0c\u9ed8\u8ba4\u91cd\u8bd5 2 \u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u91cd\u8bd5\u6b21\u6570\uff1b \u4f7f\u7528\u7a97\u7ba1\u6700\u65b0\u63d0\u4f9b\u7684\u4e8c\u8fdb\u5236\u63a5\u53e3\uff0c\u4f18\u5316\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u5728 Wayland \u4e0b\u83b7\u53d6\u7a97\u53e3\u4fe1\u606f\u7684\u65b9\u6cd5\uff1b\u611f\u8c22\u684c\u9762\u6d4b\u8bd5\u90e8 @\u4f55\u6743 @\u5b59\u7fe0 \u3001\u7a97\u7ba1\u7814\u53d1 @\u9ec4\u6cfd\u94ed \u7684\u5927\u529b\u652f\u6301\u3002 \u6269\u5145 skipif \u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\u51fd\u6570\uff1a skipif_xdg_type \u652f\u6301 x11 \u6216 wayland \u4e0a\u8df3\u8fc7\uff1b skipif_cpu_name \u652f\u6301\u4e0d\u540c cpu \u4e0a\u8df3\u8fc7\uff0c\u6bd4\u5982\uff1askipif_cpu_name-KLVVW5821\uff1b "},{"location":"RELEASE/#2102023818","title":"2.1.0\uff082023/8/18\uff09","text":"fix \u4fee\u590d SW \u67b6\u6784\u73af\u5883\u4f9d\u8d56\u7684\u95ee\u9898\uff0c\u539f\u56e0\u662f\u4e4b\u524d\u6211\u8fd9\u91cc\u672c\u5730\u6ca1\u6709 SW \u7684\u673a\u5668\uff0c\u6ca1\u6709\u505a\u76f8\u5173\u9002\u914d\uff1b \u4fee\u590d\u5b50\u9879\u76ee\u5355\u72ec\u9700\u8981\u4e09\u65b9\u5305 pexpect\uff0c\u7531\u4e8e\u4e4b\u524d\u662f\u9884\u88c5\u5230\u955c\u50cf\u91cc\u9762\u7684\uff0c\u4f46\u57fa\u7840\u6846\u67b6\u4e0d\u9700\u8981\uff0c\u56e0\u6b64\u6ca1\u6709\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u91cc\u9762\uff0c\u5bfc\u81f4\u5b50\u9879\u76ee\u4f9d\u8d56\u62a5\u9519\u3002 \u4fee\u590d\u5b50\u9879\u76ee cv \u5bfc\u5165\u62a5\u9519\u7684\u95ee\u9898\uff1b \u539f\u56e0\u4e3a\uff1ayouqu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u517c\u5bb9\u4e24\u79cd\u60c5\u51b5\uff0c\u4e00\u79cd\u662f\u9762\u5411\u670d\u52a1\uff0c\u5c31\u662f\u672c\u5730\u6d4b\u8bd5\u673a\u4e0d\u9700\u8981\u5b89\u88c5 OpenCV\uff0c\u7528\u4f8b\u4e2d\u7684\u56fe\u50cf\u8bc6\u522b\u4f1a\u901a\u8fc7\u8fdc\u7a0b\u670d\u52a1\u63a5\u53e3\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u548c\u7ed3\u679c\u83b7\u53d6\uff1b\u7b2c\u4e8c\u79cd\u662f\u539f\u751f\uff0c\u5c31\u662f\u672c\u5730\u76f4\u63a5\u5b89\u88c5 OpenCV \u76f4\u63a5\u7528\u3002\u4e24\u4e2a\u60c5\u51b5\u7684\u4f18\u5148\u7ea7\u662f\u4f18\u5148\u5224\u65ad\u672c\u5730\u5b58\u5728\uff0c\u5426\u5219\u8d70\u670d\u52a1\u3002 \u524d\u9762\u6211\u4eec\u5df2\u7ecf\u628a OCR \u529f\u80fd\u505a\u4e86\u670d\u52a1\u5316\uff0c\u57fa\u4e8e 1 \u5e74\u591a\u4ee5\u6765\u7684\u89c2\u5bdf\uff0c\u7528\u8d77\u6765\u5f88\u7a33\u5b9a\uff0c\u518d\u4e00\u4e2a\u5c31\u662f OpenCV \u5b89\u88c5\u5305\u662f\u6bd4\u8f83\u81c3\u80bf\u7684\uff0c\u7c97\u7565\u6570\u4e86\u4e0b\u4f9d\u8d56\u6709 30+ \u4e2a\uff0c\u800c\u4e14\u5728\u5404\u67b6\u6784\u4e0a\u4f9d\u8d56\u5305\u8fd8\u4e0d\u5c3d\u76f8\u540c\uff0c\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u65b9\u6848\u4e2d\u4e0d\u592a\u597d\u5904\u7406\uff0c\u6240\u4ee5\u672c\u6b21 2.0 \u7248\u672c\u6211\u4eec\u5927\u80c6\u7684\u5c06\u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u529f\u80fd\u4fee\u6539\u4e3a\u9762\u5411\u670d\u52a1\u7684\u65b9\u5f0f\uff0c\u524d\u671f\u6d4b\u8bd5\u4e00\u5207\u770b\u8d77\u6765\u90fd\u5f88\u548c\u8c10\u3002 \u4f46\u662f\u6ca1\u6ce8\u610f\u5230\u4e4b\u524d\u7ed9\u6d77\u71d5\u59d0\u90a3\u8fb9\u9879\u76ee\u5355\u72ec\u5b9a\u5236\u505a\u4e86\u4e2a\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\uff08\u4e3a\u4e86\u80fd\u7b80\u5355\u5e73\u6ed1\u7684\u8fc1\u79fb\u5230 youqu\uff09\uff0c\u6b64\u63a5\u53e3\u5e95\u5c42\u6ca1\u6709\u517c\u5bb9\u670d\u52a1\u5316\uff0c\u6240\u4ee5\u5979\u90a3\u8fb9\u7684\u9879\u76ee\u8c03\u7528\u6b64\u5b9a\u5236\u63a5\u53e3\u4f1a\u62a5 cv \u5bfc\u5165\u7684\u95ee\u9898\u3002 \u7531\u4e8e\u5c06\u8fd9\u4e2a\u5b9a\u5236\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\u8fdb\u884c\u670d\u52a1\u5316\u517c\u5bb9\u6539\u9020\u9700\u8981\u4e00\u5b9a\u65f6\u95f4\uff0c\u6539\u5b8c\u8fd8\u9700\u8981\u6d4b\u8bd5\uff0c\u4f46\u672c\u6b21\u65f6\u95f4\u6bd4\u8f83\u7d27\uff0c\u56e0\u6b64\u5148\u628a OpenCV \u88c5\u8fdb\u865a\u62df\u73af\u5883\uff0c\u540e\u7eed\u7248\u672c\u518d\u8003\u8651\u9488\u5bf9\u6b64\u63a5\u53e3\u505a\u4fee\u6539\u3002"},{"location":"RELEASE/#2002023816","title":"2.0.0\uff082023/8/16\uff09","text":"YouQu\uff08\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff09\u5f00\u6e90\u4e86\uff0c\u540c\u65f6\u63a8\u51fa\u4e86 2.0 \u7248\u672c\u3002 \u611f\u8c22\u738b\u6ce2\u603b\u3001\u67b6\u6784\u5e08\u5f90\u5c0f\u4e1c\u3001\u7814\u53d1\u7ecf\u7406\u90d1\u5e7c\u6208\u3001\u5218\u90d1\u7b49\u7814\u53d1\u540c\u4e8b\u7684\u5927\u529b\u652f\u6301\u3002 new 1\u3001\u65b0\u7684\u57fa\u7840\u6846\u67b6\u4ee3\u7801\u83b7\u53d6\u65b9\u5f0f\u53ca\u65b0\u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4 YouQu \u540e\u7eed\u5747\u901a\u8fc7 PyPI \u8fdb\u884c\u5305\u7684\u53d1\u5e03\uff0c\u4e5f\u5c31\u662f\u8bf4\u540e\u7eed\u53ef\u4ee5\u4f7f\u7528 pip \u8fdb\u884c\u5b89\u88c5\uff1a sudo pip3 install youqu==2.0.0\n \u8fd9\u91cc\u6709 2 \u4e2a\u5c0f\u70b9\u8981\u6ce8\u610f\uff1a \u63a8\u8350\u4f7f\u7528 sudo pip3 \uff08\u52a0 sudo\uff09\u8fdb\u884c\u5b89\u88c5\uff1b \u5982\u679c\u4e0d\u52a0 sudo \u6709\u4e9b\u673a\u5668\u53ef\u80fd $HOME/.local/bin \u4e0d\u5728\u7cfb\u7edf PATH \u73af\u5883\u76ee\u5f55\u4e0b\uff0c\u5728\u4e0d\u6dfb\u52a0\u73af\u5883\u53d8\u91cf\u7684\u60c5\u51b5\u4e0b\uff0c\u4f1a\u51fa\u73b0 YouQu \u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4\uff08youqu-startproject\uff09\u65e0\u6cd5\u4f7f\u7528\u7684\u95ee\u9898\uff1b \u5f53\u7136\uff0c\u5c06\u4e0a\u8ff0\u8def\u5f84\u6dfb\u52a0\u5230\u73af\u5883\u53d8\u91cf\u4e4b\u540e\u4e5f\u662f\u53ef\u4ee5\u7528\u7684\uff0c\u6240\u4ee5\u6211\u8fd9\u91cc\u662f\u63a8\u8350\u52a0 sudo\uff0c\u4e0d\u52a0 sudo \u4e5f\u662f\u53ef\u4ee5\u7684\uff0c\u53ea\u662f\u9700\u8981\u5173\u6ce8\u4e0b\u73af\u5883\u53d8\u91cf\u7684\u95ee\u9898\u3002 \u63a8\u8350\u6307\u5b9a\u7248\u672c\u53f7\uff08youqu==2.0.0\uff09\u5b89\u88c5\uff0c\u5982\u679c\u4e0d\u6307\u5b9a\u7248\u672c\u53f7\u9ed8\u8ba4\u662f\u5b89\u88c5\u6700\u65b0\u53d1\u5e03\u7684 YouQu \u7248\u672c\uff0c\u4f60\u53ef\u4ee5\u5728 PyPI \u4e0a\u7684 Release history \u91cc\u9762\u67e5\u770b\u6709\u54ea\u4e9b\u7248\u672c\u3002 \u5b89\u88c5\u4e4b\u540e\u4f1a\u81ea\u52a8\u751f\u6210\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu-startproject\uff0c\u4f7f\u7528\u5b83\u53ef\u4ee5\u521d\u59cb\u5316\u5de5\u7a0b\uff0c\u8fd9\u91cc\u4ee5\u97f3\u4e50\u4e3e\u4f8b\uff1b youqu-startproject autotest_deepin_music\n \u8fd9\u6837\u5c31\u4f1a\u5728\u5f53\u524d\u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a autotest_deepin_music \u76ee\u5f55\uff0c\u91cc\u9762\u5305\u542b\u4e86\u57fa\u7840\u6846\u67b6\u6240\u6709\u7684\u4ee3\u7801\uff1b \u4e4b\u540e\uff0c\u8fd8\u662f\u5728 apps \u76ee\u5f55\u4e0b\uff0c\u653e\u5165\u5b50\u9879\u76ee\u7684AT\u4ee3\u7801\u5373\u53ef\uff0c\u4f7f\u7528\u65b9\u6cd5\u548c\u8fc7\u53bb\u4e00\u6837\uff0c\u8fd9\u91cc\u5c31\u4e0d\u591a\u4ecb\u7ecd\u3002 \u53e6\u5916\uff0c\u9664\u4e86\u901a\u8fc7 pip \u83b7\u53d6\u4ee5\u5916\uff0c\u4ecd\u7136\u53ef\u4ee5\u901a\u8fc7\u6e90\u7801\u83b7\u53d6\uff08\u76f4\u63a5 git clone\uff09\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u4f7f\u7528 pip \u5b89\u88c5 YouQu \u65f6\uff0cYouQu \u5305\u7684\u5927\u5c0f\u624d 600+ k\uff0c\u5b89\u88c5\u901f\u5ea6\u8d77\u98de\u3002 2\u3001\u65b0\u7684AT\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848 \u4e3a\u4e86\u89e3\u51b3\u4ee5\u4e0b\u95ee\u9898\uff1a \u8fc7\u53bb\u4e00\u6bb5\u65f6\u95f4\u54b1\u4eec\u7ecf\u5e38\u51fa\u73b0\u7684\uff0c\u4e0d\u540c\u7684AT\u9879\u76ee\u5728\u540c\u4e00\u53f0\u673a\u5668\u4e0a\u90e8\u7f72\u73af\u5883\u65f6\u4f9d\u8d56\u7248\u672c\u51b2\u7a81\u7684\u95ee\u9898\uff0c\u65b0\u65b9\u6848\u4e0d\u540c\u7684\u9879\u76ee\u4f1a\u52a8\u6001\u751f\u6210\u81ea\u5df1\u7684\u865a\u62df\u73af\u5883\uff0c\u76f8\u4e92\u4e4b\u95f4\u4e0d\u5f71\u54cd\uff1b \u4e1a\u5185\u4e3a\u4e86\u89e3\u51b3\u7248\u672c\u51b2\u7a81\u95ee\u9898\u4e00\u822c\u90fd\u4f1a\u4f7f\u7528Python\u865a\u62df\u73af\u5883\u7684\u5de5\u5177\uff0c\u4f46\u662f\u90fd\u6709\u4e2a\u95ee\u9898\uff0c\u65e0\u6cd5\u7ba1\u7406 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u5305\uff0c\u672c\u6b21\u6211\u4eec\u89e3\u51b3\u4e86\u8fd9\u4e2a\u95ee\u9898\uff0c\u80fd\u591f\u5b8c\u5168\u7ba1\u7406\u5e38\u89c4\u7684Python\u5305\uff0c\u4e5f\u80fd\u7ba1\u7406\u5230 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u4e09\u65b9\u5305\uff1b \u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u4f7f\u7528\u65b9\u6cd5\uff1a bash env.sh\n \u53ef\u4ee5\u770b\u51fa\u6765\u548c\u539f\u6765\u4f7f\u7528\u65b9\u6cd5\u6ca1\u6709\u53d8\u5316\uff0c\u4e5f\u5c31\u662f\u8bf4\u4ece\u4f7f\u7528\u7684\u89d2\u5ea6\u662f\u5b8c\u5168\u6ca1\u6709\u533a\u522b\u7684\uff0c\u53ea\u662f\u5185\u90e8\u505a\u4e86\u4e0d\u540c\u7684\u4e8b\u60c5\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u672c\u673a\u90e8\u7f72\u7684\u529f\u80fd\u4ecd\u7136\u4fdd\u7559 env_dev.sh\uff0c\u53ef\u4ee5\u4f5c\u4e3a\u5f00\u53d1\u65f6\u7684\u73af\u5883\u90e8\u7f72\u3002 3\u3001\u65b0\u7684\u9a71\u52a8\u547d\u4ee4 \u8fc7\u53bb\u54b1\u4eec\u90fd\u662f\u4f7f\u7528\u8fd9\u6837\u7684\u547d\u4ee4\u6765\u9a71\u52a8\u6267\u884c\uff1a python3 manage.py run\n \u7531\u4e8e\u9ed8\u8ba4\u57fa\u4e8e\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848\uff0c\u56e0\u6b64\u6211\u4eec\u589e\u52a0\u4e86\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu\uff1b \u65b0\u7684\u9a71\u52a8\u65b9\u5f0f\uff1a youqu manage.py run\n \u53ea\u9700\u8981\u628a python3 \u66ff\u6362\u6210 youqu \u5c31\u53ef\u4ee5\u4e86\uff0c\u770b\u8d77\u6765\u5f88\u548c\u8c10~ 4\u3001\u65b0\u7684\u6587\u6863\u5730\u5740 \u8fc7\u53bb\u54b1\u4eec YouQu \u7684\u5728\u7ebf\u6587\u6863\u662f\u90e8\u7f72\u5728\u516c\u53f8\u5185\u7f51\u7684\uff0c\u73b0\u5728\u5f00\u6e90\u5230 github \u4e86\uff0c\u5916\u90e8\u5f00\u53d1\u8005\u80af\u5b9a\u8bbf\u95ee\u4e0d\u5230\u5185\u7f51\u7684\u6587\u6863\uff0c\u56e0\u6b64\u9700\u8981\u5c06\u6587\u6863\u90e8\u7f72\u5230\u516c\u7f51\u3010\u516c\u7f51\u6587\u6863\u3011\uff1b \u516c\u7f51\u6587\u6863\u4f7f\u7528\u7684\u662f github pages\uff08\u767d\u5ad6\u602a\u4e00\u987f\u72c2\u559c~~\uff09\uff0c\u4f46\u53ef\u80fd\u4f1a\u51fa\u73b0\u6587\u6863\u901f\u5ea6\u6162\u7684\u95ee\u9898\uff08\u4ee3\u7406\u4e0b\u5c31\u597d\u4e86\uff09\uff0c\u4e0d\u8fc7\u6ca1\u5173\u7cfb\uff0c\u54b1\u4eec\u3010\u5185\u7f51\u6587\u6863\u3011\u4ecd\u7136\u4fdd\u7559\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u3002 5\u3001\u5176\u4ed6\u4e00\u4e9b\u5c0f\u5c0f\u529f\u80fd\u66f4\u65b0\uff1a \uff081\uff09\u65b0\u589e\u5173\u95ed\u5206\u8fa8\u7387\u68c0\u6d4b\u7684\u53c2\u6570\u503c\uff1b youqu manage.py run --resolution no\n \u6216\u8005\u4fee\u6539 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387, \u6bd4\u5982\uff1a1920x1080\n;no: \u8868\u793a\u4e0d\u505a\u5206\u8fa8\u7387\u6821\u9a8c\nRESOLUTION = 1920x1080\n resolution \u8fd9\u4e2a\u53c2\u6570\u4e00\u76f4\u90fd\u6709\u7684\uff0c\u53ea\u4e0d\u8fc7\u4e4b\u524d\u662f\u7528\u4e8e\u6307\u5b9a\u5206\u8fa8\u7387\u5927\u5c0f\uff0c\u6bd4\u5982 --resolution 1920x1080\uff0c\u4f46\u6709\u4e9b\u63a5\u53e3\u7684\u9879\u76ee\u4e0d\u9700\u8981\u8fd9\u4e2a\u68c0\u67e5\uff0c\u53ef\u4ee5\u7ed9\u5b83\u4e2a no \u5c31\u597d\u4e86\uff0c\u5f53\u7136 CICD \u4e0a\u5173\u95ed\uff0c\u9700\u8981\u6d41\u6c34\u7ebf\u4e0a\u628a\u8fd9\u4e2a\u53c2\u6570\u52a0\u4e0a\uff1b \uff082\uff09\u65b0\u589e\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u7684\u547d\u4ee4\u884c\u53c2\u6570 \u4e4b\u524d\u8fd9\u4e2a\u914d\u7f6e\u9879\u53ea\u80fd\u5728 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c 1 \u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff0cRERUN >= RECORD_FAILED_CASE\u3002\n;1.\u5173\u95ed\u5f55\u5c4f\uff1aRECORD_FAILED_CASE > RERUN\n;2.\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1aRECORD_FAILED_CASE = 0\nRECORD_FAILED_CASE = 1\n \u73b0\u5728\u5c06\u5f00\u53d1\u5230\u547d\u4ee4\u884c\u53c2\u6570\u3002 youqu manage.py run --record_failed_case 2\n fix \u4fee\u590d remote \u6267\u884c\u65f6\uff0c\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u65e0\u6cd5\u751f\u6210\u6d4b\u8bd5\u62a5\u544a\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1302023710","title":"1.3.0\uff082023/7/10\uff09","text":"fix \u8fdb\u4e00\u6b65\u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b\u53c2\u8003\uff1a\u914d\u7f6ePython\u6e90\u7684\u51e0\u79cd\u65b9\u6cd5 \u4fee\u590d wayland_autotool \u53d7\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86wayland\u4e0b\u5076\u73b0\u627e\u4e0d\u5230 .Xauthority \u6587\u4ef6\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1292023626","title":"1.2.9\uff082023/6/26\uff09","text":"fix \u4f18\u5316\u8fdc\u7a0b\u6267\u884c remote \u7684\u53c2\u6570\u76f4\u63a5\u4f20\u7ed9\u8fdc\u7a0b\u673a\u5668\u7684 run \u547d\u4ee4\uff0c\u4e0d\u7528\u518d\u5355\u72ec\u5904\u7406\u8fdc\u7a0b\u6267\u884c\u7684\u53c2\u6570\u903b\u8f91\uff0c\u540e\u7eed\u4e13\u6ce8\u4e8e\u672c\u5730\u6267\u884c\u529f\u80fd\u5f00\u53d1\uff0c\u8fdc\u7a0b\u6267\u884c\u81ea\u52a8\u9002\u7528\uff1b env.sh \u79fb\u9664 pyyaml \u5b89\u88c5\uff0c\u7531\u5b50\u9879\u76ee\u5728 requirement.txt \u91cc\u9762\u5b9a\u4e49\uff0c\u6846\u67b6\u81ea\u52a8\u52a0\u8f7d\uff1b \u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b "},{"location":"RELEASE/#128202369","title":"1.2.8\uff082023/6/9\uff09","text":"fix \u4fee\u590d\u4e86 pypi \u5b89\u88c5 numpy \u5b58\u5728\u7cfb\u7edf\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#127202368","title":"1.2.7\uff082023/6/8\uff09","text":"fix env.sh \u4e2d\u5b89\u88c5 Python \u5305\u672a\u6307\u5b9a\u7248\u672c\u65f6\uff0c\u65e5\u5fd7\u8f93\u51fa\u5b89\u88c5\u7684\u7248\u672c\uff1b pdocr-rpc 2.0.1\nallure-custom 1.2.1\nfunnylog 1.1.3\n \u4fee\u590d -f \u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u62a5\u9519\u7684\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#126202367","title":"1.2.6\uff082023/6/7\uff09","text":"fix \u4fee\u590d wayland \u4e0a\u8c03\u7528\u9f20\u6807\u4e2d\u952e\u3001\u53f3\u952e\u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b \u4fee\u590d pubilic/dde_desktop_public_widget \u91cc\u9762\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u5b9a\u4f4d\u684c\u9762\u6587\u4ef6\u7684\u65b9\u6cd5\uff0c\u5750\u6807\u6ca1\u6709\u62c6\u5305\u7684\u95ee\u9898\uff1b \u4f18\u5316\u4e86\u7b49\u5f85\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b pycreeze \u7248\u672c\u5347\u7ea7\u5230 0.1.29\uff0c\u5bfc\u81f4\u4e0e pyautogui 0.9.53 \u4e0d\u517c\u5bb9\uff0cenv.sh \u91cc\u9762\u589e\u52a0\u6307\u5b9a pycreeze \u7248\u672c\u4e3a 0.1.28\uff1b "},{"location":"RELEASE/#1252023516","title":"1.2.5\uff082023/5/16\uff09","text":"new --app \u53c2\u6570\u540e\u9762\u65b0\u589e\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u76ee\u524d\u652f\u6301\u4e09\u79cd\u53c2\u6570\u4f20\u5165\u65b9\u5f0f\uff1a ~$: youqu run -a deepin-music\n~$: youqu run -a autotest_deepin_music\n~$: youqu run -a apps/autotest_deepin_music\n \u200b \u540e\u4e24\u79cd\u5165\u53c2\u65b9\u5f0f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\u3002 remote \u8fdc\u7a0b\u6267\u884c\u65b0\u589e\u4ece\u547d\u4ee4\u884c\u4f20\u5165\u6d4b\u8bd5\u673a\u4fe1\u606f\uff0c\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679c password \u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6 setting/remote.ini \u4e2d CLIENT_PASSWORD \u7684\u503c,\u6bd4\u5982\uff1auos@10.8.13.33:1 \u6216 uos@10.8.13.33 \uff1b python3 manage.py remote -c uos@10.8.13.33/uos@10.8.13.34\npython3 manage.py remote -c uos@10.8.13.33:1/uos@10.8.13.34:2\n fix \u65e5\u5fd7\u6a21\u5757\u4fee\u6539\u4e3a\u51fd\u6570\u6267\u884c\u4e4b\u524d\u6253\u5370\u65e5\u5fd7\uff1b \u65e5\u5fd7\u6a21\u5757\u589e\u52a0\u767d\u540d\u5355\uff0c\u901a\u8fc7\u7c7b\u540d\u5f00\u5934\uff0c\u7ed3\u675f\uff0c\u5305\u542b\u7b49\u5173\u952e\u5b57\u63a7\u5236\u9700\u8981\u6253\u5370\u7684\u51fd\u6570\u65e5\u5fd7\uff1b \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5982\u679c\u4f20\u5165\u4e86 app_name \u53ea\u4f1a\u5c06 apps \u76ee\u5f55\u4e0b app_name \u7684\u76ee\u5f55\u53d1\u9001\u5230\u6d4b\u8bd5\u673a\uff1b env.sh \u79fb\u9664 python3-dev\uff1b \u4fee\u590d Wayland \u4e0b env.sh \u73af\u5883\u5b89\u88c5\u5931\u8d25\u7684\u95ee\u9898\uff0c\u4f18\u5316\u4e86 deb \u4f9d\u8d56\u5b89\u88c5\u7684\u903b\u8f91\uff1b \u5c06 env.sh \u5237\u65b0\u6e90\u7684\u65e5\u5fd7\u5728\u7ec8\u7aef\u663e\u793a\uff0c\u89e3\u51b3\u5728 CI \u73af\u5883\u4e0b\uff0c\u957f\u65f6\u95f4\u4e0d\u8f93\u51fa\u65e5\u5fd7\u8fde\u63a5\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d1060 \u534e\u4e3a\u673a\u578b\u5b89\u88c5\u952e\u9f20\u5de5\u5177\u65f6\u4f9d\u8d56\u4e0d\u517c\u5bb9\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1242023227","title":"1.2.4\uff082023/2/27\uff09","text":"fix \u4fee\u6539 CURRENT \u6587\u4ef6\uff1b "},{"location":"RELEASE/#1232023227","title":"1.2.3\uff082023/2/27\uff09","text":"new pylint.sh \u652f\u6301\u901a\u8fc7\u4f4d\u7f6e\u53c2\u6570\u4f20\u5165\u6587\u4ef6\u8def\u5f84\uff1abash pylint.sh apps/autotest_deepin_music,\u597d\u5904\u662f\u53c2\u6570\u8def\u5f84\u53ef\u4ee5\u5728\u7ec8\u7aef\u8865\u5168\uff1b \u65b0\u589e\u7cfb\u7edf\u547d\u4ee4 youqu-pylint \uff0c\u7528\u4e8e\u9759\u6001\u4ee3\u7801\u626b\u63cf\uff0c\u4f7f\u7528\u65b9\u6cd5: youqu-pylint apps/autotest_deepin_music\uff1b \u7531\u4e8e\u7cfb\u7edf\u4e00\u4e9b dbus \u63a5\u53e3\u6539\u53d8\uff0c\u516c\u5171\u5e93\u4e2d\u7684 dbus \u65b9\u6cd5\u5c06\u4e0d\u518d\u7ef4\u62a4\uff0c\u7531\u5b50\u9879\u76ee\u5728 other_widget.py \u91cc\u9762\u8fdb\u884c\u7ef4\u62a4\uff1b fix \u4fee\u590d ssh \u73af\u5883\u4e0b\u8fd0\u884c\u63d0\u793a \u201c\u65e0\u6cd5\u8fde\u63a5\u201d \u7684\u95ee\u9898\uff1b \u4fee\u590d\u8fd0\u884c\u65f6\u7a0b\u5e8f\u9000\u51fa\uff0c\u4e0d\u8f93\u51fa\u5f02\u5e38\u65e5\u5fd7\u7684\u95ee\u9898\uff1b \u4fee\u590dyouqu remote xxx \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5728\u670d\u52a1\u7aef Ctrl + C \u65e0\u6cd5\u505c\u6b62\u7a0b\u5e8f\u8fd0\u884c\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#122202328","title":"1.2.2\uff082023/2/8\uff09","text":"new \u65b0\u589e\u6c14\u6ce1\u7c7b\u56fe\u50cf\u8bc6\u522b\u65b9\u6848\uff1bimage_utils.py::ImageUtil::get_during\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u533a\u57df\u8bc6\u522b\uff0c\u4f20\u5165 [x, y, w, h]\uff0cx: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u76ee\u6807\u56fe\u7247\uff0c\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\uff1b env.sh \u79fb\u9664 pypinyin; \u4f18\u5316\u6267\u884c env.sh \u65f6\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b manage.py \u79fb\u9664\u4e86\u53c2\u6570 session_timeout \uff0c\u6846\u67b6\u6839\u636e\u5168\u5c40\u7684 timeout \u4ee5\u53ca\u7528\u4f8b\u81ea\u5b9a\u4e49\u7684 timeout \u81ea\u52a8\u8ba1\u7b97\u51fa sessiontimeout \u7684\u503c\uff1b \u65b0\u589e ocr \u670d\u52a1\u5668\u94fe\u63a5\u91cd\u8bd5\uff0c\u9ed8\u8ba4\u91cd\u8bd51\u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u53c2\u6570\uff1b fix \u4fee\u590d\u4e86\u4e00\u4e9b pylint \u626b\u63cf\u7684\u4ee3\u7801\u98ce\u683c\u95ee\u9898\uff1b \u91cd\u65b0\u8bbe\u8ba1\u4e86\u6d4b\u8bd5\u62a5\u544a\u4e3b\u9898\uff1b "},{"location":"RELEASE/#121202316","title":"1.2.1\uff082023/1/6\uff09","text":"new \u652f\u6301\u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6267\u884c\u7528\u4f8b\uff1b\u53ef\u5c06python3 manage.py \u66ff\u6362\u4e3a youqu \uff1a youqu run -a deepin-music -k 001\n RPC \u670d\u52a1 IP \u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u6307\u5b9a\u4e0d\u540c\u7684\u7aef\u53e3\uff1b \u5728\u7ebf\u6587\u6863\u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u539f\u6765\u7684\u5730\u5740 10.8.10.215 \u5c06\u4e0d\u5728\u4f7f\u7528\uff1b fix \u4fee\u590d --count \u53c2\u6570\u53ef\u80fd\u51fa\u73b0\u4e0e\u5176\u4ed6\u6846\u67b6\u7684\u5de5\u7a0b\u4f9d\u8d56\u5b58\u5728\u51b2\u7a81\uff0c\u62a5\u9519\u91cd\u590d\u6ce8\u518c\u7684\u95ee\u9898\uff1b \u4fee\u590d CI \u73af\u5883\u4e0b\u591a\u4e2a\u5de5\u7a0b\u5b58\u5728 Python \u73af\u5883\u53d8\u91cf\u6307\u5411\u9519\u8bef\uff0c\u5bfc\u5305\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u5355\u72ec\u8fd0\u884c\u65b9\u6cd5\u65f6\u65e0\u65e5\u5fd7\u8f93\u51fa\u7684 Bug\uff1b "},{"location":"RELEASE/#12020221230","title":"1.2.0\uff082022/12/30\uff09","text":"1.1.4 \u7248\u672c\u9002\u914d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e14\u65b0\u589e\u4e86\u8f83\u591a\u65b0\u7279\u6027\uff0c\u6211\u4eec\u8ba1\u5212\u4f7f\u7528 1.1.4 \u7248\u672c\u8fd0\u884c\u4e00\u6bb5\u65f6\u95f4\uff0c1.2.0 \u7248\u672c\u5c06\u4fee\u590d\u671f\u95f4\u51fa\u73b0\u7684 Bug\uff0c\u7136\u540e\u4f5c\u4e3a\u7a33\u5b9a\u7248\u672c\u53d1\u5e03\u3002 new \u4fee\u6539\u5de5\u7a0b\u540d\u79f0\u4e3a youqu\uff1b \u5c06 sphinx \u6587\u6863\u5de5\u7a0b\u8fc1\u79fb\u5230\u5355\u72ec\u7684\u4ed3\u5e93\uff1b fix \u4fee\u590d startapp \u521b\u5efa\u5de5\u7a0b\u65f6\u5b58\u5728\u5de5\u7a0b\u540d\u79f0\u65f6\u65e0\u6cd5\u7ee7\u7eed\u521b\u5efa\uff1b \u4fee\u590d\u4e86 OCR \u670d\u52a1\u5728\u5e76\u53d1\u65f6\u53ef\u80fd\u51fa\u73b0\u65e0\u6cd5\u8fd4\u56de\u7ed3\u679c\u7684\u95ee\u9898\uff0c\u63d0\u5347 OCR \u670d\u52a1\u9ad8\u5e76\u53d1\u7a33\u5b9a\u6027\uff1b \u4fee\u590d PMS \u540c\u6b65\u6807\u7b7e\u5230 CSV \u6587\u4ef6\u4e0d\u652f\u6301\u7528\u4f8b\u5e93\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11420221214","title":"1.1.4\uff082022/12/14\uff09","text":"new \u65b0\u589e startapp \u5b50\u547d\u4ee4\u521b\u5efa\u5b50\u9879\u76ee\u5de5\u7a0b\u6a21\u677f: python3 manage.py startapp autotest_deepin_xxx \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u91cd\u590d\u6267\u884c\u6b21\u6570\uff1b \u53bb\u6389\u6279\u91cf\u6267\u884c\u524d\u6536\u96c6\u7528\u4f8b\u7684\u6b65\u9aa4\uff1b \u589e\u52a0\u5f00\u59cb\u6267\u884c\u65f6\u6253\u5370\u4e00\u4e9b\u6267\u884c\u53c2\u6570\uff0c\u5982\uff1a \u7528\u4f8b\u6536\u96c6\u6570\u91cf: 99\n\u5931\u8d25\u91cd\u8dd1\u6b21\u6570: 1\n\u6700\u5927\u5931\u8d25\u6b21\u6570: 49\n\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4: 200.0s (03\u520620\u79d2)\n\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4: 11880s (3\u5c0f\u65f618\u52060\u79d2)\n \u5b9a\u5236\u4fee\u6539allure\u62a5\u544alogo\u3001title\u3001\u9ed8\u8ba4\u8bed\u8a00\uff1b manage.py \u6267\u884c\u5f00\u59cb\u65f6\u6253\u5370 logo \u548c\u5f53\u524d\u7248\u672c\uff1a \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u255a\u2588\u2588\u2557 \u2588\u2588\u2554\u255d \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2584\u2584 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2580\u2580\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u2584\u2588 \u2584\u2588 \u2588 \u2588 \u2588 \u2584 \u2588 \u2584 \u2580\u2580\u2588 \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\uff1b \u88c5\u9970\u5668\u65b9\u6cd5\u6307\u5b9a\u6b21\u6570\uff1b @pytest.mark.count(2)\ndef test_music_001():\npass\n \u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u6b21\u6570\uff1b python3 manage.py run -a deepin-music -k 001 --count 2\n \u200b image_utils \u589e\u52a0\u51fd\u6570 save_temporary_picture\uff0c\u652f\u6301\u6307\u5b9a\u5c4f\u5e55\u533a\u57df\u622a\u56fe\u5e76\u8fd4\u56de\u56fe\u7247\u5b58\u653e\u7684\u672c\u5730\u8def\u5f84\uff0c\u540e\u7eed\u4f7f\u7528 assert_image_exist \u8fdb\u884c\u65ad\u8a00 Python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(x, y, width, height) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) button_center \u65b0\u589e btn_size \u83b7\u53d6\u63a7\u4ef6\u5de6\u4e0a\u89d2\u5750\u6807\u53ca\u957f\u5bbd\uff0c\u7528\u4e8e\u52a8\u6001\u7684\u622a\u53d6\u5143\u7d20\u7684\u56fe\u7247\uff0c\u53ef\u7528\u4e8e\u5b9a\u4f4d\u65ad\u8a00 python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u6240\u6709\u97f3\u4e50\u6309\u94ae\")) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) allure \u62a5\u544a\u4e2d\u5b9a\u4f4d\u95ee\u9898\u9664\u4e86\u65e5\u5fd7\u3001\u622a\u56fe\u3001\u5f55\u5c4f\u5916\uff0c\u8c03\u7528\u7684\u51fd\u6570\u589e\u52a0\u4e86 step \u6b65\u9aa4\u5c55\u793a\uff1b env.sh \u65b0\u589e\u5b89\u88c5\u5b50\u9879\u76ee Python \u4e09\u65b9\u4f9d\u8d56\uff0c\u5728\u5b50\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u5199 requirement.txt \u6587\u4ef6\uff0cenv.sh \u4f1a\u81ea\u52a8\u52a0\u8f7d\uff1b ocr \u8bc6\u522b\u65b0\u589e\u652f\u6301\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\u8fdb\u884c\u6587\u5b57\u8bc6\u522b\uff0c\u51cf\u5c11\u56e0\u5168\u5c4f\u8bc6\u522b\u65f6\uff0c\u5176\u4ed6\u6587\u5b57\u7684\u5e72\u6270 Python # \u65ad\u8a00\u97f3\u4e50\u7684\u5220\u9664\u5f39\u7a97\u4e2d\uff0c\u5305\u542b\u4e86\u201c\u786e\u8ba4\u201d\u7684\u6587\u5b57 self.assert_ocr_exist(\"\u786e\u8ba4\", picture_abspath=DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u5220\u9664\u5f39\u7a97\"))) \u65ad\u8a00\u51fd\u6570\u7684\u8c03\u7528\u4e5f\u4f1a\u81ea\u52a8\u6253\u5370\u65e5\u5fd7; env.sh \u65b0\u589e\u88c1\u526a\u4f9d\u8d56\u7684\u65b9\u6848\uff1b fix \u4fee\u590d Jenkins \u73af\u5883\u4e0b\uff0c apps \u76ee\u5f55\u4e0b\u5b50\u9879\u76ee\u5b58\u5728 auotest_deepin_xxx@tmp \u76ee\u5f55\uff0c\u5728\u4f20\u5165 app_name \u540e\u65e0\u6cd5\u6267\u884c\u7528\u4f8b\u7684\u95ee\u9898\uff1b \u4fee\u590d\u81ea\u52a8\u751f\u6210 case_list.csv \u6587\u4ef6\u65f6\uff0c\u7528\u4f8b\u987a\u5e8f\u88ab\u8c03\u6574\u7684\u95ee\u9898\uff1b env.sh \u73af\u5883\u5b89\u88c5\u79fb\u9664 git \u548c curl\uff1b \u4fee\u590d\u7528\u4f8b\u5728 setup \u9636\u6bb5\u62a5\u9519\u540e\uff0c\u672a\u5199\u5165 ci_result.json \u7684\u95ee\u9898\uff1b \u79fb\u9664 uos_ci.py\uff1b "},{"location":"RELEASE/#11320221028","title":"1.1.3\uff082022/10/28\uff09","text":"new \u65b0\u589e\u56fe\u50cf\u65ad\u8a00\u6210\u529f\u8f93\u51fa\u5339\u914d\u5ea6\uff1b \u65b0\u589e\u73af\u5883\u5b89\u88c5 yaml \u4f9d\u8d56\uff1b \u65b0\u589e\u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6570\u636e\u56de\u586b\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b \u65b0\u589e\u6d4b\u8bd5\u7ed3\u679c\u8868\u60c5\u663e\u793a\uff0c\u5e76\u4f18\u5316\u4e86\u65e5\u5fd7\u7684\u6392\u7248\uff1b \u65b0\u589e --top {number} \u7528\u4e8e\u8bb0\u5f55\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0c\u65e5\u5fd7\u751f\u6210\u5230 report/logs/top.log\uff1b fix \u4fee\u590d\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4f46\u7ec8\u7aef\u6ca1\u6709\u9519\u8bef\u65e5\u5fd7\u8f93\u51fa\u7684\u95ee\u9898\uff1b \u4fee\u6539\u5931\u8d25\u7528\u4f8b\u56de\u6eaf\u65e5\u5fd7\u4e3a\u8be6\u7ec6\u7ea7\u522b\uff1b \u4fee\u590d\u4e86\u6267\u884c\u8fdb\u5ea6\u672a\u8ba1\u7b97\u8df3\u8fc7\u7528\u4f8b\u7684\u95ee\u9898\uff0c\u5e76\u4f18\u5316\u4e86\u8fdb\u5ea6\u83b7\u53d6\u7684\u7b97\u6cd5\uff1b \u4fee\u590d env.sh \u5728 V23 \u73af\u5883\u4e0b\u5b89\u88c5\u65e0\u6cd5\u8bfb\u53d6\u5bc6\u7801\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 pms \u6d4b\u8bd5\u5957\u6267\u884c\u6216\u6d4b\u8bd5\u5355\u6267\u884c\u65f6\uff0c\u7528\u4f8bID\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b env.sh \u91cc\u9762 hub.deepin.com \u66f4\u6362\u6210 it.uniontech.com\uff1b uos_ci.py \u6d4b\u8bd5\u7ed3\u679c\u7edf\u8ba1\u65f6\uff0c\u603b\u6570\u5254\u9664 skip \u7684\u6570\u91cf "},{"location":"RELEASE/#11220220921","title":"1.1.2\uff082022/09/21\uff09","text":"new \u5728\u6ca1\u6709\u5b89\u88c5 dogtail \u7684\u60c5\u51b5\u4e0b\uff0c\u4e5f\u80fd\u4f7f\u7528 sniff \u5de5\u5177\uff1b fix \u4fee\u590d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e2d\u6ca1\u6709\u5b89\u88c5 AT \u73af\u5883\u6267\u884c uos_ci.py \u62a5\u9519\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11120220919","title":"1.1.1\uff082022/09/19\uff09","text":"new \u65b0\u589e\u6267\u884c\u8fdb\u5ea6\u663e\u793a\uff0c\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u65f6\u65e5\u5fd7\u8f93\u51fa\u5f53\u524d\u8fdb\u5ea6\uff1a[\u5f53\u524d\u6307\u5b9a\u7b2c\u51e0\u6761/\u7528\u4f8b\u603b\u6570]\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u7528\u4f8b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\u6240\u6709\u5931\u8d25\u7528\u4f8b\u7684\u5217\u8868\uff1b \u5173\u95ed\u7ec8\u7aef\u8f93\u51fa\u6355\u83b7\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u65e5\u5fd7\u5feb\u7167\uff1b \u4f18\u5316\u7ec8\u7aef\u8f93\u51fa\u5931\u8d25\u4fe1\u606f\u5197\u957f\u4e3a\u7b80\u8981\u4fe1\u606f\u8f93\u51fa\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u663e\u793a 10 \u4e2a\u6267\u884c\u6700\u6162\u7684\u7528\u4f8b\u5217\u8868\uff0c\u5e76\u8be6\u7ec6\u5217\u51fa\u5404\u4e2a\u9636\u6bb5\u7684\u8017\u65f6\uff1b \u5931\u8d25\u91cd\u8dd1\u7528\u4f8b\u91cd\u8dd1\u4e4b\u524d\u5ef6\u8fdf 1 \u79d2\uff1b \u65b0\u589e\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4ecd\u7136\u5f3a\u5236\u6267\u884c\uff1b \u7528\u4f8b\u6536\u96c6\u65f6\u4ec5\u5728 apps \u76ee\u5f55\u4e0b\u8fdb\u884c\uff0c\u5ffd\u7565 src,setting,public \u76ee\u5f55\uff1b \u65b0\u589e allure \u62a5\u544a\u5907\u4efd\u529f\u80fd\uff0c\u9ed8\u8ba4\u5907\u4efd\u81f3 allure_back \u76ee\u5f55\u4e0b\uff1b manage.py\u65b0\u589e\u53c2\u6570 --lastfailed \u7528\u4e8e\u53ea\u8dd1\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\u7684\u529f\u80fd\uff1b fix \u4fee\u590d\u4e86\u5728\u6ca1\u6709\u6307\u5b9a\u5e94\u7528\u540d\u79f0\u6267\u884c\u65f6\uff0cxml \u62a5\u544a\u751f\u6210\u8def\u5f84\u5f02\u5e38\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 uos_ci.py \u4f20\u5165 timeout \u548c session_timeout \u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11020220916","title":"1.1.0\uff082022/09/16\uff09","text":"new \u65b0\u589ePMS\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u652f\u6301\u591a\u79cd\u6570\u636e\u56de\u586b\u6a21\u5f0f\uff1b \u4f18\u5316\u4e86\u901a\u8fc7\u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u65f6PMS \u722c\u866b\u7684\u6027\u80fd\uff1b \u65b0\u589e .gitmodules \u6587\u4ef6\uff0c\u7528\u4e8e\u6807\u8bb0\u6240\u6709\u5b50\u9879\u76ee\uff0c\u65b9\u4fbf\u7edf\u4e00\u62c9\u53d6\u4ee3\u7801\uff1b env.sh \u9002\u914d\u793e\u533a\u7248\u4e0a\u5b89\u88c5\u81ea\u52a8\u5316\u73af\u5883\uff1b \u589e\u52a0\u6267\u884c\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u9519\u8bef\u7684\u529f\u80fd\uff1b README.md \u589e\u52a0 Wayland \u4e0b\u4f7f\u7528\u3001\u6d4b\u8bd5\u62a5\u544a\u67e5\u770b\u3001\u5e38\u89c1\u95ee\u9898\u7b49\u7684\u6587\u6863\u8bf4\u660e\uff1b \u589e\u52a0\u4e86\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u5bf9 setup\u3001call\u3001teardown \u8fdb\u884c\u65e5\u5fd7\u5206\u6bb5\uff1b fix \u4fee\u590d\u4e86 \u786e\u8ba4\u4fee\u590d \u5217\u6ca1\u5199\u8868\u5934\uff0c\u4f46\u5199\u4e86 fixed-xxx \u6807\u7b7e\uff0c\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u540c\u4e00\u5e94\u7528\u5185\u591a\u4e2a csv \u6587\u4ef6\u4e2d \u786e\u8ba4\u4fee\u590d \u5217\u6709\u7684\u5199\u4e86\uff0c\u6709\u7684\u6ca1\u5199\uff0c\u53ef\u80fd\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 INFO \u65e5\u5fd7\uff0c\u663e\u793a\u4e3a DEBUG \u7684\u95ee\u9898\uff1b\u4fee\u590d\u4e86\u90e8\u5206\u673a\u5668\u4e0a INFO \u65e5\u5fd7\u5185\u5bb9\u663e\u793a\u4e3a\u7ea2\u8272\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\u770b\u4e0d\u5230\u8be6\u7ec6\u4fe1\u606f\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10220220822","title":"1.0.2\uff082022/08/22\uff09","text":"new \u79fb\u9664 loguru\uff0c\u66ff\u6362\u4e3a logging\uff0c\u63a5\u53e3\u4fdd\u6301\u4e0d\u53d8\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u53d7\u5f71\u54cd\uff1b \u9ed8\u8ba4\u5f00\u542f coredump\uff1b fix \u4fee\u590d\u4e86\u4e09\u65b9\u5e93 loguru \u5076\u73b0\u5f02\u5e38\uff0c\u5bfc\u81f4\u7a0b\u5e8f\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7b2c\u4e00\u6b21\u5931\u8d25\u4e0d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10120220812","title":"1.0.1\uff082022/08/12\uff09","text":"new \u65b0\u589e RELEASE.md \u6587\u4ef6\uff0c\u7528\u4e8e\u8bb0\u5f55\u5386\u53f2\u53d1\u5e03\u7248\u672c\u7684\u66f4\u65b0\u5185\u5bb9\uff1b \u517c\u5bb9 Wayland \u6a21\u5f0f\u4e0b\u6267\u884c\u7528\u4f8b\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u7528\u7ba1\u5f53\u524d\u6d4b\u8bd5\u673a\u6267\u884c\u73af\u5883\uff0c\u6846\u67b6\u4f1a\u81ea\u52a8\u6839\u636e\u5f53\u524d\u73af\u5883\u8d70\u4e0d\u540c\u7684\u4ee3\u7801\u903b\u8f91\uff1b \u7531\u4e8e\u9700\u8981\u4fee\u6539 dogtail \u6e90\u4ee3\u7801\uff0c\u56e0\u6b64\u5c06\u4fee\u6539\u540e\u7684\u6e90\u7801\u653e\u5165\u5230\u6838\u5fc3\u5e93\u91cc\u9762 src/depends/dogtail \u540e\u7eed\u7248\u672c\u5c06\u4e0d\u9700\u8981\u5728\u7cfb\u7edf\u4e2d\u5b89\u88c5dogtail\uff1b \u5982\u679c\u5e94\u7528\u5e93\u540c\u6837\u4f7f\u7528\u4e86\u7cfb\u7edf\u5b89\u88c5\u7684 dogtail \u53ef\u80fd\u4f1a\u62a5\u9519\uff0c\u89e3\u51b3\u65b9\u6848\u662f\u5c06\u4ee3\u7801\u4e2d\u7684 import dogtail \u4fee\u6539\u4e3a from src.depends import dogtail ; fix \u91cd\u8dd1\u5931\u8d25\u4e4b\u540e\u624d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff0c\u4fee\u6539\u4e3a\u5931\u8d25\u4e4b\u540e\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":"# Attribution \uff1achengdu Test Team\n# Date \uff1a2021/08/20\n \u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d \u4ed3\u5e93\u5730\u5740\uff1ahttps://gitlabcd.uniontech.com/autotest/cd-desktop-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u65b9\u6848\u6982\u8ff0","text":"\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u667a\u80fd\u8bc6\u522b\u5e94\u7528\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u7528\u4e8e\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u64cd\u4f5c\u8fc7\u7a0b\u4e2d\u7684\u5143\u7d20\u5b9a\u4f4d\u4ee5\u53ca\u5224\u65ad\u7ed3\u679c\u65f6\u7684\u65ad\u8a00\u5904\u7406\uff1b\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\uff0c\u6d4b\u8bd5\u673a\u4e0a\u7684\u753b\u9762\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u5230\u670d\u52a1\u5668\u4e0a\uff0c\u670d\u52a1\u5668\u5bf9\u89c6\u9891\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\u540e\uff0c\u670d\u52a1\u5668\u667a\u80fd\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\u6210\u529f\uff0c\u7136\u540e\u5bf9\u6d4b\u8bd5\u673a\u4e0b\u53d1\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\uff0c\u6d4b\u8bd5\u673a\u63a5\u53d7\u5e76\u6267\u884c\u4e0b\u4e00\u6b65\u64cd\u4f5c\u3002 \u670d\u52a1\u5668\u4e0e\u6d4b\u8bd5\u673a\u4e4b\u95f4\u7684\u94fe\u63a5\uff1a \u670d\u52a1\u5668\u901a\u8fc7 USB \u4e32\u53e3\u8bbe\u5907\uff08USB-HID \u534f\u8bae\uff09\u6a21\u62df\u9f20\u6807\u952e\u76d8\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u64cd\u4f5c\u3002 \u901a\u8fc7\u89c6\u9891\u91c7\u96c6\u8bbe\u5907\u6355\u83b7\u6d4b\u8bd5\u673a\u7684\u5b9e\u65f6\u753b\u9762\u4f20\u8f93\u7ed9\u670d\u52a1\u5668\u3002 \u670d\u52a1\u5668\u5bf9\u91c7\u96c6\u7684\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\uff0c\u8bc6\u522b\u5176\u4e2d\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5e76\u8fd4\u56de\u5143\u7d20\u63a7\u4ef6\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\uff0c\u670d\u52a1\u5668\u901a\u8fc7\u667a\u80fd\u5316\u5206\u6790\uff0c\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e00\u81f4\u5c06\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\u901a\u8fc7\u4e32\u53e3\u6a21\u62df\u952e\u9f20\u4fe1\u53f7\u53d1\u9001\u7ed9\u6d4b\u8bd5\u673a\uff1b\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e0d\u4e00\u81f4\u5c06\u4f1a\u8fdb\u5165\u4e2d\u65ad\u5904\u7406\u53ca\u5f02\u5e38\u7ed3\u679c\u8f93\u51fa\uff0c\u7ee7\u7eed\u6267\u884c\u540e\u7eed\u573a\u666f\uff0c\u76f4\u81f3\u6240\u6709\u7528\u4f8b\u6d4b\u8bd5\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u6df1\u5ea6\u5b66\u4e60\u73af\u5883\u642d\u5efa","text":"\u6a21\u578b\u8bad\u7ec3\u4e3b\u8981\u5bf9 GPU \u6709\u8981\u6c42\uff0c\u8bad\u7ec3\u6a21\u578b\u7684\u673a\u5668\u663e\u5b58\u4e0d\u4f4e\u4e8e 6G\uff0c\u5176\u4ed6\u914d\u7f6e\u65e0\u7279\u6b8a\u8981\u6c42\u3002 \u63a8\u8350\u6027\u4ef7\u6bd4\u8f83\u9ad8\u914d\u7f6e \u64cd\u4f5c\u7cfb\u7edf: UnionTech OS Desktop 20 Professional Linux version 4.19.0-desktop-amd64 (deepin@deepin-PC) (Uos 8.3.0.3-3+rebuild) \u5904\u7406\u5668: Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz (\u516b\u6838 / \u5341\u516d\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460M-HDV(RD)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))/8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: TU116 [GeForce GTX 1660]\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u865a\u62df\u73af\u5883\u5b89\u88c5","text":"cd ~\nwget -c https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh\nbash Miniconda3-latest-Linux-x86_64.sh\n \u4e00\u8def\u56de\u8f66 \u7b2c\u4e00\u6b21\u63d0\u793a\u8f93\u5165 yes/no \uff1a\u8f93\u5165 yes \u7ee7\u7eed\u4e00\u8def\u56de\u8f66 \u7b2c\u4e8c\u6b21\u63d0\u793a\uff1a\u8f93\u5165 no cd ~/miniconda3/bin\nsudo chmod 777 activate\n \u6fc0\u6d3bconda\u73af\u5883 . ./activate\n \u6dfb\u52a0\u516c\u53f8\u5185\u7f51\u6e90 conda config --add channels bioconda\nconda config --add channels conda-forge\n \u5982\u679c\u662f\u5916\u7f51\u6dfb\u52a0\u5916\u7f51\u6e90 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/\n \u5982\u679c\u8981\u5220\u9664\u6e90 conda config --remove-key channels\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"2\u3001\u5b89\u88c5\u4f9d\u8d56","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u521b\u5efa\u865a\u62df\u73af\u5883","text":"conda remove --name mmlab --all # \u79fb\u9664\u6240\u6709\u865a\u62df\u73af\u5883\n conda create -n mmlab python=3.7\n conda activate mmlab\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-pytorch","title":"\uff082\uff09\u5b89\u88c5 Pytorch","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install torch==1.7.0+cu101 torchvision==0.8.1+cu101 torchaudio==0.7.0 -f https://download.pytorch.org/whl/torch_stable.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-mmcv","title":"\uff083\uff09\u5b89\u88c5 MMCV","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install mmcv-full==1.3.3 -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.7.0/index.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"\uff084\uff09\u5b89\u88c5\u663e\u5361\u9a71\u52a8","text":"\u6839\u636e\u4f60\u7684\u663e\u5361\u4e0b\u8f7d\u5bf9\u5e94\u9a71\u52a8\uff0c\u6bd4\u5982\u6211\u7684\u663e\u5361\u4e3a GTX1660\uff0c\u9a71\u52a8\u7248\u672c\u4e3a 430\uff0c\u9a71\u52a8\u4e0b\u8f7d\u5730\u5740\uff1ahttps://www.nvidia.cn/Download/Find.aspx?lang=cn CTRL+ALT+F2 \u8fdb\u5165tty\n \u7981\u7528 nouveau \u9a71\u52a8 sudo vim /etc/modprobe.d/blacklist-nouveau.conf\n \u586b\u5165\uff1a blacklist nouveau options nouveau modeset=0\n \u5237\u65b0\u914d\u7f6e\u6587\u4ef6 sudo update-initramfs -u reboot \u91cd\u542f\u540e\u518d\u8fdb\u5165 tty \u5173\u95ed\u56fe\u50cf\u754c\u9762\uff0c\u8f93\u5165\u547d\u4ee4\u5173\u95ed\u56fe\u50cf\u754c\u9762 sudo service lightdm stop\n \u5b89\u88c5\u9a71\u52a8 sudo chmod a+x NVIDIA-Linux-x86_64-430.run\nsudo ./NVIDIA-Linux-x86_64-430.run\n reboot\u91cd\u542f\uff0cnvidia-smi\u67e5\u770b\u5b89\u88c5\u72b6\u6001\u3002\u6ce8\u610f\u770b\u4e0bcuda\u7248\u672c\uff0c10.1\uff0cdriver\u7248\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u6570\u636e\u6807\u6ce8","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u6570\u636e\u6807\u6ce8","text":"\u6807\u6ce8\u4e4b\u524d\u9700\u8981\u5148\u8f6c\u6362\u56fe\u7247\u5927\u5c0f\uff0c\u5e76\u4e14\u4ee5\u6570\u5b57\u547d\u540d\uff0c\u6bcf\u7ec4\u547d\u540d\u9012\u589e"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"\uff081\uff09\u8f6c\u6362\u5927\u5c0f\u5e76\u91cd\u547d\u540d","text":"rename_pic.py import os\nimport sys\nimport cv2\nimport time\nimport getpass\nusername = getpass.getuser()\nsource_path = f\"/home/{username}/Desktop/right_menu\" # \u56fe\u7247\u8def\u5f84\nsource_dest = os.path.join('/'.join(source_path.split(\"/\")[:-1]), 'tmp')\nif not os.path.exists(source_dest):\nos.mkdir(source_dest)\nstart_name = sys.argv[1]\nfile_name_list = list()\nfor file in os.listdir(source_path):\nif file.endswith('.png'):\nfile_name_list.append(file)\nstart_name = int(start_name)\nfor file in file_name_list:\nos.rename(os.path.join(source_path,file), os.path.join(source_path, f\"{str(start_name)}.png\"))\nstart_name += 1\ntime.sleep(1)\nfor file in os.listdir(source_path):\nimage = os.path.join(source_path, str(file))\nsrc = cv2.imread(image)\nresult = cv2.resize(src, (960, 540))\nresizeImage = os.path.join(source_dest, str(file))\nprint(resizeImage)\ncv2.imwrite(str(resizeImage), result)\ncv2.waitKey(0)\ncv2.destroyAllWindows()\ntime.sleep(1)\nos.system(f'rm -rf {source_path}/*')\nos.system(f'mv {source_dest}/* {source_path}')\nos.system(f'rm -rf {source_dest}')\nprint(\"\u4e0b\u4e00\u4e2a\u5e8f\u53f7\uff1a\", start_name)\n \u6839\u636e\u7ec8\u7aef\u8f93\u51fa\u7684\u4e0b\u4e00\u4e2a\u5e8f\u53f7\u7684\u63d0\u793a\uff0c\u6267\u884c Python \u6587\u4ef6\u7684\u65f6\u5019\u4f20\u53c2\u3002 python rename_pic.py 249\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"\uff082\uff09\u5de5\u5177\u6807\u6ce8","text":"\u4f7f\u7528\u5de5\u5177 labelImg \u6807\u6ce8 sudo pip3 install PyQt5==5.13\nsudo pip3 install labelImg\n \u7ec8\u7aef\u76f4\u63a5\u8f93\u5165 labelImg\uff0c\u56de\u8f66 \u6807\u6ce8\u6a21\u5f0f\u9009\u62e9\uff1aPascalVOC"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u667a\u80fd\u6807\u6ce8","text":"\u6253\u5f00\u5c4f\u5e55\u5f55\u5236\u8f6f\u4ef6\uff0c\u5f55\u5236\u624b\u52a8\u64cd\u4f5c\u4e00\u6b21\u6d4b\u8bd5\u7528\u4f8b\uff0c\u7136\u540e\u5c06\u5f55\u5236\u7684\u89c6\u9891\u8fdb\u884c\u5206\u5e27\uff0c\u7136\u540e\u5bf9\u6bd4\u524d\u4e24\u5e27\u56fe\u6807\u76f8\u4f3c\u5ea6\uff0c\u5254\u9664\u76f8\u4f3c\u5ea6\u8fc7\u9ad8\u7684\u56fe\u7247\uff0c\u5728\u4fdd\u8bc1\u7d20\u6750\u591a\u6837\u6027\u7684\u524d\u63d0\u4e0b\uff0c\u5254\u9664\u91cd\u590d\u591a\u4f59\u7684\u56fe\u7247\u751f\u6210\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u96c6\uff0c\u7136\u540e\u53d6\u51fa\u63a7\u4ef6\u6a21\u677f\u6570\u636e\u96c6\uff0c\u901a\u8fc7 OpenCV \u6a21\u677f\u5339\u914d\u83b7\u53d6\u63a7\u4ef6\u5728\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u56fe\u7247\u4e2d\u6240\u5728\u7684\u5de6\u4e0a\u3001\u5de6\u4e0b\u3001\u53f3\u4e0a\u3001\u53f3\u4e0b\u56db\u5904\u5750\u6807\uff0c\u4ece\u800c\u6839\u636e\u6a21\u677f\u6570\u636e\u96c6\u751f\u6210\u6807\u6ce8\u6570\u636e\u3002\u53c2\u8003\u76ee\u5f55 AnnotationMaterial"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"\uff081\uff09\u6a21\u677f\u6570\u636e\u96c6\u51c6\u5907","text":"1\u3001\u5728\u754c\u9762\u622a\u53d6\u9700\u8981\u6807\u6ce8\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u653e\u5728\u76ee\u5f55\u4e0b AnnotationMaterial/template/img 2\u3001\u7ef4\u62a4\u63a7\u4ef6\u540d\u4e0e\u5143\u7d20\u63a7\u4ef6\u7684\u952e\u5bf9\uff0c\u4e00\u4e2a\u63a7\u4ef6\u540d\u53ef\u5bf9\u5e94\u591a\u4e2a\u5143\u7d20\u63a7\u4ef6 menu:\n- menu.jpg\n- menu1.jpg\n- menu2.jpg\n- menu3.jpg\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"\uff082\uff09\u7d20\u6750\u96c6\u51c6\u5907","text":"\u5f55\u5236\u89c6\u9891\u6216\u6216\u5c4f\u5e55\u622a\u56fe\u653e\u7f6e\u76ee\u5f55 AnnotationMaterial/source"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u5f00\u59cb\u6807\u6ce8","text":"python3 AnnotationMaterial/main.py\n \u751f\u6210\u7684\u6807\u6ce8\u6570\u636e\u5b58\u653e\u5728 AnnotationMaterial/result"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#mmdetection","title":"\u56db\u3001MMDetection","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1-mmdetection","title":"1\u3001 MMDetection \u4ee3\u7801","text":"MMDetection \u662f\u4e00\u4e2a\u6709\u540d\u7684\u6df1\u5ea6\u5b66\u4e60\u76ee\u6807\u68c0\u6d4b\u5f00\u6e90\u9879\u76ee\uff0c\u4e5f\u662f openMMlab \u7684\u62db\u724c\u9879\u76ee\uff0c\u4e3a\u4ec0\u4e48\u9009\u62e9\u5b83\uff0c\u5c0f\u5b69\u513f\u6ca1\u5a18\u8bf4\u6765\u8bdd\u957f\uff0c\u611f\u5174\u8da3\u53ef\u4ee5\u81ea\u884c\u6df1\u5165\u4e86\u89e3\uff1b \u4f60\u53ef\u4ee5\u76f4\u63a5\u5728 GitHub \u4e0a\u514b\u9686\u4ee3\u7801\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u54b1\u4eec\u4ed3\u5e93\u4e0b Train \u76ee\u5f55\u4e2d\u4ee3\u7801\uff0cTrain \u4e2d\u7684\u4ee3\u7801\u4e5f\u662f\u4ece GitHub \u4e0a\u62c9\u53d6\u7684\uff0c\u4e0d\u8fc7\u6211\u4eec\u6839\u636e\u9879\u76ee\u9700\u8981\u505a\u4e86\u4e00\u4e9b\u4e8c\u6b21\u5f00\u53d1\uff0c\u63a8\u8350\u76f4\u63a5\u4f7f\u7528\u5b83\u3002 \u5982\u679c\u4f60\u60f3\u4ece GitHub \u4e0a\u62c9\uff1a git clone https://github.com/open-mmlab/mmdetection.git\n# \u4e0d\u80fd\u76f4\u63a5\u62c9\u53d6\u4e3b\u5206\u652f\uff0c\u5efa\u8bae\u4f7f\u75282.12\u7248\u672c\uff0c\u4e0d\u540c\u7684\u7248\u672c\u5bf9\u5e94\u7684mmcv\u7248\u672c\u662f\u4e0d\u540c\u7684\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-voc2coco","title":"2\u3001\u62c9\u53d6 voc2coco \u4ee3\u7801","text":"git clone https://github.com/Tony607/voc2coco.git\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-coco","title":"3\u3001\u8f6c\u6362 coco \u6570\u636e\u96c6","text":"\u5c06\u6240\u6709\u7684\u56fe\u7247\u548cxml\u6587\u4ef6\u653e\u5165train2017\uff0c\u4ece\u4e2d\u6311\u9009\u51e0\u7ec4\u653e\u5165val2017\uff08\u6d4b\u8bd5\u96c6\uff09 cd mmdetection/data/coco\npython voc2coco.py train2017 annotations/instances_train2017.json\npython voc2coco.py val2017 annotations/instances_val2017.json\n \u751f\u6210json\u6587\u4ef6"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4_1","title":"4\u3001\u4fee\u6539\u914d\u7f6e","text":"\uff081\uff09\u8bfb\u53d6\u6a21\u578b\u540d\u79f0 import json\nmodule_name = []\nwith open('./instances_train2017.json', \"r+\") as f:\njson_file = f.read()\njson_dict = json.loads(json_file)\nmodule_list = json_dict.get('categories')\nfor module_info in module_list:\nname = module_info.get('name')\nmodule_name.append(name)\nprint(module_name)\nprint(\"module_num:\", len(module_name))\n # \u6ce8\u610f\u5bf9\u6bd4instances_train2017.json\u91cc\u9762\u6a21\u578b\u540d\u79f0\u7684\u987a\u5e8f\uff0c\u4e0eCLASSES\u548ccoco_classes\u91cc\u9762\u7684\u987a\u5e8f\u4fdd\u6301\u4e00\u81f4\u3002\n \uff082\uff09\u4fee\u6539 faster_rcnn_r101_2x_coco.py mmdetection/xianjin/faster_rcnn_r101_2x_coco.py \u4fee\u653946\u884c\uff0cnum_clasess\u7684\u503c\uff0c\u65b0\u589e1\u4e2a\uff0c\u5c31 +1\uff1b \uff083\uff09\u4fee\u6539 coco.py mmdetection/mmdet/datasets/coco.py CLASSES = ()\uff0c\u5728\u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b \uff084\uff09\u4fee\u6539 class_names.py mmdetection/mmdet/core/evaluation/class_names.py coco_classes \u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#5","title":"5\u3001\u7f13\u5b58\u6e05\u7406","text":"\u5220\u9664 mmdetection/build \u76ee\u5f55 python setup.py install\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#6","title":"6\u3001\u8bad\u7ec3\u6a21\u578b","text":"\uff081\uff09\u6307\u5b9a\u81ea\u5df1\u914d\u7f6e\u7684\u8bad\u7ec3\u6a21\u578b\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py --gpus 1\n \uff082\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u6d4b\u8bd5\u96c6\u7ed3\u679c\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py xianjin/epoch_24.pth --show\n \uff083\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u51c6\u786e\u5ea6\uff1b python tools/analysis_tools/analyze_logs.py plot_curve xianjin/20210530_011907.log.json --keys acc\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#7","title":"7\u3001\u5feb\u6377\u64cd\u4f5c","text":"python3 run.py\n \u5c06\u4ee5\u4e0a 4 - 7 \u6b65\u64cd\u4f5c\u6574\u5408\u6210 run.py\uff0c\u4e00\u952e\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u4e94\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\uff1b \u670d\u52a1\u7aef\u4e00\u53f0\uff08\u76ee\u524d\u4ec5\u652f\u6301AMD\u67b6\u6784\uff09\uff1b \u91c7\u96c6\u76d2\u4e00\u4e2a \uff08ACASIS hdmi\u89c6\u9891\u91c7\u96c6\u5361\uff0chttps://item.jd.com/10024310742602.html \uff09\uff1b USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\uff1b USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff1b \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5USB\u5ef6\u957f\u7ebf\uff1b \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u63a8\u8350\u914d\u7f6e","text":"\u6267\u884c\u7528\u4f8b\u7684\u670d\u52a1\u7aef\u5bf9\u914d\u7f6e\u6ca1\u6709\u7279\u6b8a\u8981\u6c42\uff0c\u5982\u679c\u6761\u4ef6\u5141\u8bb8\u914d\u7f6e\u8d8a\u9ad8\uff0c\u8bc6\u522b\u901f\u5ea6\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n \u6d4b\u8bd5\u673a\u4e0a\u4e0d\u6267\u884c\u4efb\u4f55\u811a\u672c\uff0c\u5177\u4f53\u914d\u7f6e\u6839\u636e\u6d4b\u8bd5\u9700\u8981\u51b3\u5b9a\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#usb_mk","title":"\u516d\u3001USB_MK\u4e32\u53e3\u9a71\u52a8\u65b9\u6cd5","text":"\u4f4d\u4e8econtrol_method\u76ee\u5f55\u4e0b\u7684usb_mk.py\u6587\u4ef6 \uff081\uff09\u5217\u51fa\u53ef\u901a\u4fe1\u7684\u7aef\u53e3 python3 -m serial.tools.list_ports -v\n \uff082\uff09\u4fee\u6539\u4e32\u53e3\u7684\u6743\u9650 sudo chmod 777 /dev/ttyACM0\n \uff083\uff09\u5b9e\u4f8b\u5316USB_MK import UsbMk\nusb_mk = UsbMk(\"/dev/ttyACM0\", 9600) # \u8bbe\u5907\u9ed8\u8ba49600\u4e3a\u6ce2\u7279\u7387\uff0c\u63a7\u5236\u4f20\u8f93\u901f\u7387\n \uff084\uff09USB\u4e32\u53e3\u8bbe\u5907\u9ed8\u8ba4\u6ce2\u7279\u7387\u4e3a9600\uff08\u7ecf\u6d4b\u8bd5\u6ce2\u7279\u73879600\u51c6\u786e\u6027\u6700\u597d\uff09\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up() # \u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u6c49\u5b57\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e\n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff083\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff084\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff085\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() # \u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2\n \uff086\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff087\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff088\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e03\u3001\u65b9\u6cd5\u8c03\u7528\u5165\u53c2\u89c4\u5219","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_7","title":"1\u3001\u57fa\u7c7b","text":"class Base:\ndef __init__(self):\nself._obj = image\nself._usb = usb_mk\ndef find_element_by_ai(self, element):\nreturn self._obj.find_element(element)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_6","title":"2\u3001\u5165\u53c2\u8bf4\u660e","text":"\u56fe\u50cf\u8bc6\u522b\u65b9\u6cd5\u5165\u53e3\u4e3a Base \u7c7b\u4e0b\u7684 find_element_by_ai \u3002\u4ec5\u63a5\u53d7\u4e00\u4e2a\u53c2\u6570 element\uff0c\u7c7b\u578b\u4e3a string\u3002 \u53ef\u8bc6\u522b\u7684 string \u683c\u5f0f\uff1a \uff081\uff09\u5927\u56fe\u6807\uff08 \u56fe\u6807\u5927\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\uff0c\u4f8b\uff1a Base().find_element_by_ai(\"window\")\n \uff082\uff09\u5927\u56fe\u6807 / \u5c0f\u56fe\u6807\uff08\u56fe\u6807\u5c0f\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5c0f\u56fe\u6807\uff0c\u4f8b\uff1awindow/search_btn Base().find_element_by_ai(\"window/search_btn\")\n \uff083\uff09\u5927\u56fe\u6807 / OCR\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\u5185\u7684\u6587\u5b57\uff0c\u4f8b\uff1amenu/\u5c5e\u6027 Base().find_element_by_ai(\"menu/\u5c5e\u6027\")\n \uff084\uff09OCR\uff1a\u5168\u5c4f\u8bc6\u522b\u6587\u5b57 Base().find_element_by_ai(\"\u641c\u7d22\")\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516b\u3001\u9690\u85cf\u9f20\u6807","text":"\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u8fc7\u6765\u7684\u89c6\u9891\u6d41\uff0c\u5728\u8bc6\u522b\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u53d7\u5230\u9f20\u6807\u5f71\u54cd\uff0c\u56e0\u6b64\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u9690\u85cf\u9f20\u6807\u3002 \u5c4f\u853d\u9f20\u6807\u5149\u6807\u663e\u793a ```shell script /etc/lightdm/lightdm.conf \u5728`[Seat:*]`\u4e0b\u9762\u6dfb\u52a0\u53c2\u6570\n```shell script\nxserver-command=X -bs -core -nocursor\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e5d\u3001\u667a\u80fd\u81ea\u52a8\u5316\u7684\u610f\u4e49","text":"1\u3001\u6539\u5584 Acessibility \u5b9a\u4f4d\u7684\u7a33\u5b9a\u6027\u95ee\u9898 Acessibility \u5c5e\u6027\u5b9a\u4f4d\u5b58\u5728\u5076\u5c14\u5931\u6548\u7684\u60c5\u51b5 \uff081\uff09\u5f00\u53d1\u5728\u505a\u65b0\u9700\u6c42\u5f00\u53d1\u65f6\u53ef\u80fd\u6d89\u53ca\u5230\u5bf9\u5c5e\u6027\u6807\u7b7e\u7684\u4fee\u6539\u6216\u8005\u5c42\u7ea7\u7684\u8c03\u6574\uff0c\u53ef\u80fd\u9020\u6210\u81ea\u52a8\u5316\u7528\u4f8b\u65e0\u6cd5\u5b9a\u4f4d\u5230\u5143\u7d20\u3002 \u6bd4\u59821040\u9636\u6bb5\uff0c\u97f3\u4e50\u91cd\u6784\u7684\u65f6\u5019\uff0c\u5f00\u53d1\u5bf9\u90e8\u5206\u5c5e\u6027\u548c\u5c42\u7ea7\u505a\u4e86\u4fee\u6539\uff0c\u5bfc\u81f4\u81ea\u52a8\u5316\u7528\u4f8b\u5b9a\u4f4d\u65b9\u6cd580%\u9700\u8981\u4fee\u6539\u3002 \u5f00\u53d1\u65b0\u529f\u80fd\u7684\u65f6\u5019\u5076\u5c14\u4e5f\u4f1a\u5bf9\u5c5e\u6027\u505a\u8c03\u6574\uff0c\u9047\u52305\u6b21\u3002 \uff082\uff09\u76ee\u524d\u4e3b\u8981\u4f7f\u7528Dogtail\u8bc6\u522b\u5e94\u7528Acessibility\u5c5e\u6027\u8fdb\u884c\u5b9a\u4f4d\uff0c\u662f\u83b7\u53d6\u5e94\u7528\u5f53\u524d\u754c\u9762\u7684\u5c5e\u6027tree\uff0c\u5728\u5e94\u7528\u8df3\u8f6c\u540e\uff0cDogtail\u5b58\u5728\u65e0\u6cd5\u53ca\u65f6\u83b7\u53d6\u5f53\u524d\u5c5e\u6027\u5217\u8868\u7684\u60c5\u51b5\u3002 \u591a\u5a92\u4f53\u8c03\u7528\u6587\u7ba1\u7a97\u53e3\u7684\u65f6\u5019\uff0c\u51fa\u73b0\u627e\u4e0d\u5230\u6587\u7ba1\u91cc\u9762\u5143\u7d20\u7684\u60c5\u51b5\uff0c\u76ee\u524d\u51fa\u73b010+\u6b21\u3002 \u5e94\u7528\u8bbe\u7f6e\u9875\u9762\u7684\u5c5e\u6027\u5076\u5c14\u5b58\u5728\u627e\u4e0d\u5230\u7684\u60c5\u51b5\uff0c\u9047\u52305\u6b21\u3002 \uff083\uff09Dogtail\u5de5\u5177\u672c\u8eab\u5b58\u5728\u95ee\u9898\uff0c\u6709\u65f6\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u5019\u5f88\u6162\uff0c\u8ba9\u4eba\u65e0\u6cd5\u63a5\u53d7\uff0c\u76ee\u524d\u51fa\u73b0\u8fc7\u5f88\u591a\u6b21\u3002 \u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u95f4\u6bd4\u5e73\u5e38\u61623\u500d\uff0c\u51fa\u73b04\u6b21\u3002 2\u3001\u89e3\u51b3\u4e86\u4f7f\u7528\u7edd\u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898 \u90e8\u5206\u63a7\u4ef6\u65e0\u6cd5\u6dfb\u52a0 Acessibility \u5c5e\u6027\u4ece\u800c\u4f7f\u7528\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u51fa\u73b0\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898\u3002 \uff081\uff09\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u65b9\u6cd5\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u76ee\u6807\u56fe\u7247\u8d44\u6e90\uff0c\u5728 UI \u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u4f1a\u6d89\u53ca\u5230\u76ee\u6807\u8d44\u6e90\u7684\u66ff\u6362\uff0c\u6bd4\u8f83\u8017\u8d39\u4eba\u529b\u3002 \uff082\uff09\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6cd5\u5bf9\u6bd4\u7cbe\u5ea6\u6bd4\u8f83\u641e\uff0c\u5982\u679cUI \u7684\u53d8\u66f4\u4f1a\u9020\u6210\u65e0\u6cd5\u51c6\u786e\u5b9a\u4f4d\u5230\uff0c\u81ea\u52a8\u5316\u811a\u672c\u5065\u58ee\u6027\u4e0d\u8db3\u3002 3\u3001\u4f7f\u7528\u673a\u5668\u5206\u79bb\uff0c\u89e3\u51b3\u4e86\u81ea\u52a8\u5316\u811a\u672c\u5bf9\u5e94\u7528\u7684\u5f71\u54cd\uff0c\u771f\u5b9e\u8fd8\u539f\u7528\u6237\u7684\u4f7f\u7528\u573a\u666f \u673a\u5668\u5206\u79bb\u7684\u67b6\u6784\u8bbe\u8ba1\uff0c\u4fdd\u8bc1\u4e86\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u73af\u5883\u5b8c\u5168\u7b49\u540c\u4e8e\u7528\u6237\uff0c\u6392\u9664\u6d4b\u8bd5\u811a\u672c\u7684\u5f71\u54cd\u3002 \uff081\uff09\u76ee\u524d\u7684\u529f\u80fd\u81ea\u52a8\u5316\u662f\u5728\u6d4b\u8bd5\u673a\u4e0a\u76f4\u63a5\u8fd0\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\uff0c\u52a0\u4e0a\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u6211\u4eec\u6dfb\u52a0\u4e86\u4e00\u4e9b\u8fdb\u7a0b\u76d1\u63a7\u3001\u89c6\u9891\u5f55\u5236\u7b49\u529f\u80fd\uff0c\u81ea\u52a8\u5316\u811a\u672c\u672c\u8eab\u4f1a\u6d88\u8017\u4e00\u4e9b\u7cfb\u7edf\u8d44\u6e90\uff0c\u65e0\u6cd5\u8fd8\u539f\u771f\u662f\u7684\u7528\u6237\u4f7f\u7528\u573a\u666f\u3002 \uff082\uff09\u6027\u80fd\u6d4b\u8bd5\u9700\u8981\u6392\u9664\u5176\u4ed6\u7a0b\u5e8f\u7684\u8d44\u6e90\u6d88\u8017\u5f71\u54cd\uff0c\u6027\u80fd\u81ea\u52a8\u5316\u91c7\u7528\u673a\u5668\u5206\u79bb\uff0c\u4fdd\u8bc1\u4e86\u6027\u80fd\u6570\u636e\u7684\u51c6\u786e\u6027\u3002 \u4ee5\u524d\u7684\u7528\u4f8b\u6267\u884c\u8017\u65f6\u6ca1\u6761\u572830\u79d2\u5de6\u53f3\uff0c\u73b0\u5728\u7528\u4f8b\u8017\u65f6\u572810\u79d2\u3002 4\u3001\u89e3\u51b3\u4e86UI \u8c03\u6574\u5bfc\u81f4\u5b9a\u4f4d\u5931\u8d25\u7684\u4e0d\u7a33\u5b9a\u6027\u95ee\u9898 \uff081\uff09\u89e3\u51b3\u4e86\u56e0 UI \u8c03\u6574\u5bfc\u81f4\u63a7\u4ef6\u4f4d\u7f6e\u53d8\u5316\u6216\u8272\u5dee\u53d8\u5316\u540e\u5b9a\u4f4d\u4e0d\u51c6\u786e\u7684\u95ee\u9898\uff0c\u53ea\u8981\u63a7\u4ef6\u6587\u6848\u548c\u63a7\u4ef6\u5916\u8fb9\u6846\u65e0\u53d8\u5316\u5747\u53ef\u51c6\u786e\u5b9a\u4f4d\uff1b \uff082\uff09\u76ee\u524d\u4e5f\u4f1a\u91c7\u7528\u57fa\u4e8eUI\u7684\u5b9a\u4f4d\u65b9\u6848\uff0c\u5982\u679cUI\u4f4d\u7f6e\u6709\u8c03\u6574\uff0c\u4f1a\u5bfc\u81f4\u5143\u7d20\u65e0\u6cd5\u5b9a\u4f4d\u3002 5\u3001\u7b80\u5316\u4e86\u7528\u4f8b\u7ed3\u6784\uff0c\u63d0\u5347\u7f16\u5199\u53cb\u597d\u5ea6 \uff081\uff09\u667a\u80fd\u81ea\u52a8\u5316\u8bc6\u522b\u5143\u7d20\u7684\u65b9\u6cd5\u53ea\u6709\u4e00\u4e2a\uff0c\u5c31\u662f\u57fa\u4e8e\u6211\u4eec\u8bad\u7ec3\u7684\u6a21\u578b\u8bc6\u522b\u89c6\u9891\u6d41\u4e2d\u7684\u5143\u7d20\uff0c\u7ecf\u8fc7\u811a\u672c\u5c01\u88c5\u4e4b\u540e\uff0c\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u4e2d\u6240\u6709\u5b9a\u4f4d\u7684\u64cd\u4f5c\u90fd\u53ea\u9700\u8981\u8c03\u7528\u8fd9\u4e00\u4e2a\u65b9\u6cd5\u5c31\u884c\u4e86\uff0c\u7f16\u5199\u81ea\u52a8\u5316\u811a\u672c\u7684\u96be\u5ea6\u5927\u5927\u964d\u4f4e\u3002 \uff082\uff09\u4e5f\u662f\u7531\u4e8e\u8c03\u7528\u65b9\u6cd5\u7b80\u5355\uff0c\u5728 UI \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u4e2d\u7684\u5206\u5c42\u7ed3\u6784\u5c06\u4f1a\u51cf\u5c11\uff0c\u591a\u7ee7\u627f\u7684\u60c5\u51b5\u4f1a\u51cf\u5c11\uff0c\u81ea\u52a8\u5316\u4ee3\u7801\u7684\u8c03\u7528\u7ed3\u6784\u4e5f\u4f1a\u53d8\u5f97\u7b80\u5355\uff0c\u800c\u4e14\u529f\u80fd\u6d4b\u8bd5\u540c\u5b66\u7f16\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u66f4\u52a0\u5bb9\u6613\u4e0a\u624b\u3002 \u4ee5\u524d\u5199\u7528\u4f8b\u7531\u4e8e\u9700\u8981\u7ed3\u5408\u4e0d\u540c\u7684\u6a21\u5757\uff0c\u8c03\u7528\u4e0d\u540c\u7684\u65b9\u6cd5\uff0c\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u5e76\u5b8c\u6210\u8c03\u8bd5\u7684\u65f6\u95f4\u5e73\u5747\u572820-30\u5206\u949f\uff0c\u73b0\u5728\u5199\u7528\u4f8b\u811a\u672c\u80fd\u57285\u5206\u949f\u5de6\u53f3\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":"# =============================================\n# Attribution : Application Test Department III\n# Time : 2023/1/3\n# Author : ut003281\n# =============================================\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u7b80\u8ff0","text":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5 \u901a\u8fc7\u81ea\u52a8\u5316\u624b\u6bb5\u5bf9\u5e94\u7528\u8fdb\u884c\u6027\u80fd\u6d4b\u8bd5\uff0c\u63d0\u4f9b\u65b9\u4fbf\u7684\u73af\u5883\u90e8\u7f72\u3001\u8fd0\u884c\u914d\u7f6e\u3001\u7528\u4f8b\u7f16\u5199\u7b49\uff0c\u7528\u4e8e\u684c\u9762\u5e94\u7528\u7684\u51b7\u70ed\u542f\u52a8\u3001\u8d44\u6e90\u62f7\u8d1d\u3001\u9875\u9762\u8df3\u8f6c\u7b49\u6027\u80fd\u573a\u666f\u6d4b\u8bd5\u3002 \u4ed3\u5e93\u5730\u5740\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-perf-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u4ee3\u7801\u7ed3\u6784","text":"autotest-perf-aitest\n\u251c\u2500\u2500 apps # \u5b58\u653e\u6240\u6709\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u811a\u672c\n\u251c\u2500\u2500 conftest.py # pytest hook\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 CURRENT # \u7248\u672c\u5185\u5bb9\n\u251c\u2500\u2500 docs # \u6587\u6863\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u952e\u503c\u5bf9\u7167\u8868.pdf # \u4e32\u53e3\u7ebfcode\u4e0e\u6309\u952e\u7684\u5bf9\u7167\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u6027\u80fd\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\u6267\u884c\u5668\u4f7f\u7528\u6307\u5357.md # \u6267\u884c\u5668\u811a\u672c\u4f7f\u7528\u6307\u5357\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 USB\u4e32\u53e3\u8f6cUSB\u952e\u76d8\u9f20\u6807\u7ebf\u534f\u8bae\u6587\u4ef6V1.0.pdf # \u4e32\u53e3\u534f\u8bae\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput-0.28.2.zip # Linux\u4e0b\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\u7684\u6e90\u7801\uff0c\u53ef\u6839\u636e\u67b6\u6784\u6253\u5305\n\u251c\u2500\u2500 manage.py # \u529f\u80fd\u4e3b\u5165\u53e3\n\u251c\u2500\u2500 pytest.ini # pytst \u914d\u7f6e\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 setting # \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 client.ini # \u6d4b\u8bd5\u673a IP \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5168\u5c40\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dev_env.sh # \u5bbf\u4e3b\u673a\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose_no_relay.yml # \u65e0\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose.yml # \u6709\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker_login.sh # docker \u767b\u9646\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 res\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 black.png # \u5168\u9ed1\u56fe\u7247\uff0c\u7528\u4e8e\u4fee\u6539\u58c1\u7eb8\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_5000.deb # 3A5000 \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_amd64.deb # amd \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_arm64.deb # arm \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_mips64.deb # mips \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_sw_64.deb # sw \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 server.ini # \u670d\u52a1\u5668\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 setup.sh # \u5bb9\u5668\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 template # \u521b\u5efa app \u57fa\u7840\u811a\u672c\u6a21\u677f\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 app_template\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ${app_name}_widget.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 control-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 images\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 test_${app_name}_01_scene.json-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 test_${app_name}_01_scene.py-tpl\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 uos_docker # \u5bb9\u5668\u73af\u5883\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dockerfile\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 requirements.txt\n\u2514\u2500\u2500 src\n \u251c\u2500\u2500 analysis_save.py # \u89e3\u6790\u56fe\u7247\u6d41\u7ed3\u679c\uff0c\u6c47\u603b\u751f\u6210 excel \u62a5\u544a\n\u251c\u2500\u2500 base_widget.py # \u5c01\u88c5\u7684\u57fa\u7840\u64cd\u4f5c\uff0c\u5e94\u7528\u8c03\u7528\u7684\u4e3b\u5165\u53e3\u65b9\u6cd5\n\u251c\u2500\u2500 cmdctl.py # \u8c03\u7528\u547d\u4ee4\u884c\u4f7f\u7528\n\u251c\u2500\u2500 global_value.py # \u5168\u5c40\u53d8\u91cf\n\u251c\u2500\u2500 image_utils.py # \u56fe\u7247\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 __init__.py\n \u251c\u2500\u2500 logger_utils.py # \u65e5\u5fd7\u914d\u7f6e\n\u251c\u2500\u2500 pdocr.py # ocr \u914d\u7f6e\n\u251c\u2500\u2500 public_method.py # \u4e00\u4e9b\u65b9\u4fbf\u7684\u5c01\u4f4f\n\u251c\u2500\u2500 record.py # \u5f55\u5c4f\u76f8\u5173\n\u251c\u2500\u2500 rtk # \u8fd0\u884c\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 _base.py # \u4e00\u4e9b\u679a\u4e3e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 install_env.py # \u5b89\u88c5\u73af\u5883\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 local_runner.py # \u8fd0\u884c\u7528\u4f8b\n\u251c\u2500\u2500 serial_communication # \u4e32\u53e3\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 power_control.py # \u7ee7\u7535\u5668\u64cd\u4f5c\uff0c\u4f7f\u7528\u7ee7\u7535\u5668\u8fde\u63a5\u4e3b\u673a\u7535\u6e90\uff0c\u63a7\u5236\u5f00\u5173\u673a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 serial_common.py # \u4e32\u53e3\u516c\u5171\u65b9\u6cd5\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 usb_mk.py # \u952e\u9f20\u64cd\u4f5c\u57fa\u7840\u5c01\u88c5\n\u251c\u2500\u2500 shortcut_key.py # \u5feb\u6377\u952e\u7684\u5c01\u88c5\n\u251c\u2500\u2500 singleton.py # \u5355\u4f8b\u6a21\u5f0f\n\u251c\u2500\u2500 start_app.py # \u521b\u5efa app\n\u2514\u2500\u2500 write_xlsx.py # \u751f\u6210 excel\n# __init__.py \u6587\u4ef6\u4e3a\u6807\u8bc6\u8be5\u76ee\u5f55\u662f\u4e00\u4e2aPython\u7684\u6a21\u5757\u5305\uff0c\u9879\u76ee\u4e2d\u7684__init__.py\u5747\u4e3a\u7a7a\u6587\u4ef6\u3002\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u73af\u5883\u642d\u5efa","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\u3002 \u670d\u52a1\u7aef\u4e00\u53f0\u3002\uff08\u4ec5\u652f\u6301 AMD \u67b6\u6784\uff0c\u82e5\u9700\u5176\u4ed6\u67b6\u6784\uff0c\u54a8\u8be2\u76f8\u5173\u5f00\u53d1\u4eba\u5458\uff09 \u91c7\u96c6\u76d2\u4e00\u4e2a\u3002 \uff08ACASIS HDMI \u89c6\u9891\u91c7\u96c6\u76d2\uff0chttps://item.jd.com/100013302599.html#crumb-wrap \uff09 USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\u3002\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"\uff082\uff09\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\u3002 USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff08USB3.0 \u63a5\u53e3\u4e0a\uff09\u3002 \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5 USB \u5ef6\u957f\u7ebf\u3002 \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u670d\u52a1\u7aef\u63a8\u8350\u914d\u7f6e","text":"\u914d\u7f6e\u8d8a\u9ad8\uff0c\u89e3\u6790\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"2\u3001\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa","text":" \u6253\u5f00\u63a7\u5236\u4e2d\u5fc3\uff0c\u8d26\u6237\u8bbe\u7f6e\u4e3a\u3010\u81ea\u52a8\u767b\u5f55\u3011\u548c\u3010\u65e0\u5bc6\u7801\u767b\u5f55\u3011\uff0c\u7535\u6e90\u7ba1\u7406\u4e2d\u4f7f\u7528\u7535\u6e90\u5168\u90e8\u8bbe\u7f6e\u4e3a\u3010\u4ece\u4e0d\u3011\uff0c\u5f00\u542f\u5f00\u53d1\u8005\u6a21\u5f0f\u3002 \u6839\u636e\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u8981\u6c42\uff0c\u5bfc\u5165\u76f8\u5173\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\uff1a\u5bfc\u5165\u76f8\u518c\u3001\u5f71\u9662\u3001\u97f3\u4e50\u7684\u6d4b\u8bd5\u8d44\u6e90\u3002 \u5728\u670d\u52a1\u7aef\u6253\u5f00\u76f8\u673a\u5e94\u7528\u540e\uff0c\u5c06\u6d4b\u8bd5\u673a\u684c\u9762\u58c1\u7eb8\u66f4\u6362\u4e3a\u7eaf\u8272\u58c1\u7eb8\uff08\u6ce8\u610f\uff0c\u670d\u52a1\u7aef\u9700\u63d0\u524d\u5f00\u542f\u76f8\u673a\u540e\u518d\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u58c1\u7eb8\uff0c\u5efa\u8bae\u7eaf\u9ed1\u58c1\u7eb8 setting/res/black.png\uff09 \u5728\u6587\u4ef6\u7ba1\u7406\u5668\u4e2d\uff0c\u5c06\u9009\u9879 \u4e3b\u83dc\u5355-\u8bbe\u7f6e-\u9884\u89c8-\u56fe\u7247\u9884\u89c8 \u53d6\u6d88\u52fe\u9009\uff08\u5982\u4e0d\u53d6\u6d88\uff0c\u4f1a\u5f71\u54cd\u622a\u56fe\u5f55\u5c4f\u5e94\u7528\u7684\u6027\u80fd\u6570\u636e\uff09 \u79fb\u52a8\u6216\u5220\u9664\u7cfb\u7edf Logo \uff0c\u6392\u9664\u684c\u9762\u53f3\u4e0b\u89d2 Logo \u7684\u5f71\u54cd\uff08\u91cd\u542f\u751f\u6548\uff09\u3002 sudo mv /usr/share/deepin/uos_logo.svg ~/Pictures/\n \u5b89\u88c5\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\uff08\u5fc5\u987b\u5b89\u88c5\uff01\uff01\uff09 AMD \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_amd64.deb ARM \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_arm64.deb MIPS \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_mips64.deb 3A5000 \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_5000.deb \u5b89\u88c5\u547d\u4ee4 sudo dkpg -i xserver-xorg-input-libinput_0.28.2-2_amd64.deb\n \u5b89\u88c5\u65f6\u4f1a\u63d0\u793a\u5df2\u5b58\u5728\u76f8\u540c\u7248\u672c\uff0c\u8bf7\u5ffd\u7565\uff0c\u76f4\u63a5\u8986\u76d6\u5b89\u88c5\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u4e3b\u673a\u624d\u751f\u6548"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u670d\u52a1\u7aef\u4e00\u952e\u73af\u5883\u90e8\u7f72","text":"\u73af\u5883\u642d\u5efa\u524d\u5fc5\u987b\u5148\u8fde\u63a5\u4e0a USB \u4e32\u53e3\u7ebf\u548c\u91c7\u96c6\u76d2\u3002 \u5bbf\u4e3b\u673a\u73af\u5883\u5b89\u88c5 python3 manage.py install --env host\n \u5bb9\u5668\u73af\u5883\u5b89\u88c5 python3 manage.py install --env docker\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u56db\u3001\u914d\u7f6e\u9879","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u670d\u52a1\u7aef\u914d\u7f6e","text":"setting/config/server.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u914d\u7f6e\u9879\uff0c\u5305\u542b\u4e86\u6240\u6709\u670d\u52a1\u7aef\u6240\u6709\u7684\u53ef\u914d\u7f6e\u9879\u3002 \u672c\u5730\u65e0\u7f51\u7edc\u8fd0\u884c \u5c06\u914d\u7f6e\u9879 network=0 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u672c\u5730\u6709\u7f51\u7edc\u8fd0\u884c \u914d\u7f6e\u9879 network=1 (1)\u914d\u7f6e\u9879 client_alias= \u914d\u7f6e\u4e3a\u4f60\u8981\u6d4b\u8bd5\u7684\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5982 Alias1 \u6d4b\u8bd5\u673a\u522b\u540d\u5728 setting/config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 (2)\u914d\u7f6e\u9879 client_alias= \u4e3a\u7a7a\uff0c\u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager --client_alias Alias1\uff0c\u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002(Alias1 \u4e3a\u4f60\u914d\u7f6e\u7684\u6d4b\u8bd5\u673a\u522b\u540d) (1)\u548c(2)\u53ea\u8981\u4f7f\u7528\u5176\u4e00\u5373\u53ef\u3002 \u6709\u7f51\u7edc\u8fd0\u884c\uff0c\u4e14\u9700\u8981\u901a\u8fc7 Jenkins \u4e0a\u8fd0\u884c\u4e00\u4e2a job \uff0c\u540c\u65f6\u63a7\u5236\u591a\u53f0\u673a\u5668\u3002 \u914d\u7f6e\u9879 network=1 \u914d\u7f6e\u9879 client_alias= \u4e0d\u7528\u914d\u7f6e\uff0c\u5728\u8fd0\u884c run.sh \u7684\u65f6\u5019\u76f4\u63a5\u7a7a\u683c\u52a0\u522b\u540d\u5373\u53ef\uff0c\u6bd4\u5982\uff1a\u6d4b\u8bd5\u673a\u522b\u540d\u4e3a Alias1 \uff0c\u4e14\u5df2\u7ecf\u5728 config/client.ini \u4e2d\u914d\u7f6e\u4e86 Alias1 \u7684user ip password \uff0c\u5219\u8fd0\u884c bash run.sh Alias1 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u5728 Jenkins pipeline \u91cc\u9762\u901a\u8fc7\u5e76\u884c stage \u6216\u5e76\u884c\u8c03\u7528\u4e0b\u5c42\u4efb\u52a1\u7684\u65b9\u5f0f\u53ef\u4ee5\u5b9e\u73b0\u5927\u89c4\u6a21\u7684\u6027\u80fd\u6d4b\u8bd5\u9700\u6c42\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;1\u3001KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2\u3001KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f, e.g. TAGS = L1 or smoke\n[case_conf]\n# \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\uff0cocr\u6587\u6848\u8bc6\u522b\u8f83\u6162\uff0c\u4e0d\u63a8\u8350\u4f7f\u7528\nfind_by = stage\n# \u6700\u540e\u4e00\u4e2a\u7a33\u5b9a\u9636\u6bb5\u7684\u5e27\u6570\u8bc6\u522b\n# \u9996\u5e27\u5b58\u5728\u540e\u7684\u7b2c\u4e00\u4e2a\u5927\u4e8e\u8be5\u914d\u7f6e\u5e27\u6570\u7684\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u5c3e\u5e27\nfinal_stable_num=100\n# \u4ece\u8be5\u5e27\u6570\u5f00\u59cb\u8bc6\u522b\u6587\u6848\u6216\u56fe\u7247\uff0c\u51cf\u5c11\u5206\u6790\u65f6\u95f4\nstart_num = 150\n# \u8bc6\u522b\u7684\u6587\u6848\ntext=\n# \u8bc6\u522b\u56fe\u7247\nmatch=apps/xxx/images/match.png\n# \u8bc6\u522b\u76f8\u4f3c\u5ea6\nmatch_rate=0.9\n# \u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6bd4\u5982\u70ed\u542f\u52a8\u7528\u4f8b\uff0c\u4ece\u70b9\u51fb\u6253\u5f00\u5230\u505c\u6b62\u5f55\u5c4f\uff0c\u4e2d\u95f4\u7b49\u5f855\u79d2\uff1b\nduration = 15\n# \u5355\u6761\u7528\u4f8b\u6267\u884c\u7684\u6b21\u6570\ncount = 5\n# \u7a33\u5b9a\u9636\u6bb5\u5212\u5206\u7684\u76f8\u4f3c\u5ea6\nstable_similarity = 0.9997\n[server]\n# \u8c03\u8bd5\u6a21\u5f0f=1\uff0c\u4e3a\u5f00\u542f\u8c03\u8bd5\u6a21\u5f0f\uff0c0\u4e3a\u5173\u95ed\u3002\n# \u8c03\u8bd5\u6a21\u5f0f\u4e0b\u9ed8\u8ba4\u53ea\u6267\u884c\u4e00\u6b21\u7528\u4f8b\uff0c\u4e0d\u5173\u673a\n# \u7f16\u5199\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u5efa\u8bae\u5f00\u542fmaintain\u3002\nMAINTAIN = 0\n# \u8fd0\u884c\u7684\u73af\u5883docker\u5bb9\u5668\u73af\u5883\uff0chost\u5bbf\u4e3b\u673a\u73af\u5883\nENV = docker\n# \u670d\u52a1\u7aef\u5bc6\u7801\nPASSWORD=1\n# \u6307\u5b9a\u6d4b\u8bd5\u673a\u522b\u540d\n# \u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6bd4\u5982\uff1a\n# [AMD]\n# ip=10.8.15.86\n# user=uos\n# \u5176\u4e2d AMD \u4e3a\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5219client_alias=AMD\nCLIENT_ALIAS = x86\uff08Intel-i7\uff09\n# 1 \u5f00\u542f\u7f51\u7edc, 0 \u5173\u95ed\u7f51\u7edc\n# \uff081\uff09\u670d\u52a1\u7aef\u4e0e\u6d4b\u8bd5\u673a\u987b\u5728\u540c\u4e00\u7f51\u6bb5\u4e0b\uff0c\u4f60\u53ef\u4ee5\u5c1d\u8bd5\u5728\u670d\u52a1\u7aef\u901a\u8fc7ssh\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c\u5982\u679c\u53ef\u4ee5\u8fde\u63a5\uff0c\u8bf4\u660e\u7f51\u7edc\u6b63\u5e38\u3002\n# \uff082\uff09\u5f53input_type=FILE_NAME \u65f6\uff0c\u5fc5\u987b\u5f00\u542f\u7f51\u7edc\u3002\nNETWORK = 1\n# \u6027\u80fd\u7ed3\u679c\u7edf\u8ba1\u5355\u4f4d \u6beb\u79d2\u2014ms, \u79d2\u2014s\nUNIT=ms\n# \u6d4b\u8bd5\u673a\u5f00\u673a\u8fdb\u5165\u684c\u9762\u540e\u7b49\u5f85\u65f6\u95f4,\u5355\u4f4d/\u79d2\nSTARTUP_DELAY = 60\n# 1\u4e3a\u5220\u9664\u7f13\u5b58\uff0c0\u4e3a\u4e0d\u5220\u9664\u7f13\u5b58\n# \u7528\u4f8b\u6267\u884c\u5b8c\u540e\u4f1a\u5728report\u76ee\u5f55\u4e0b\u751f\u6210\u667a\u80fd\u89e3\u6790\u7684\u4e00\u4e9b\u7f13\u5b58\u56fe\u7247\u3002\nCACHE = 0\n# \u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u62a5\u544a\u4f1a\u4fdd\u5b58\u5728\u9879\u76ee\u4e0breport\u76ee\u5f55\u4e2d\uff1b\n# \u6307\u5b9a\u62a5\u544a\u76ee\u5f55\u5219\u5b58\u653e\u5230\u6307\u5b9a\u76ee\u5f55\u3002\nREPORT_PATH = report\n# \u670d\u52a1\u7aef\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684icon\u8d44\u6e90\u4f1a\u7f13\u5b58\u5728\u9879\u76ee\u4e0binput\u76ee\u5f55\u4e2d\nINPUT = input/\n# 1\u4e3a\u6d4b\u8bd5\u5b8c\u5173\u673a\uff0c0\u4e3a\u6d4b\u8bd5\u5b8c\u4e0d\u5173\u673a\nSHUTDOWN = 0\n# \u89e3\u6790\u8fdb\u7a0b\u6570\uff08\u4e0d\u63a8\u8350\u4fee\u6539\uff09\n# 3\u4e2a\u8fdb\u7a0b\u89e3\u6790\u89c6\u9891\u5df2\u7ecf\u80fd\u591f\u6ee1\u8db3\uff0c\u5373\u4f7f\u589e\u52a0\u8fdb\u7a0b\u6570\u4e5f\u4e0d\u80fd\u51cf\u5c11\u6574\u4f53\u8017\u65f6\n# \u53e6\u5916\u8fd8\u8981\u770bCPU\u6838\u6570\u662f\u5426\u652f\u6301\u3002\nPARSING_PROCESS = 3\n# 1\u4e3a\u4f7f\u7528\u7ee7\u7535\u5668\u5f00\u5173\u673a\uff0c0\u4e3a\u4f7f\u7528reboot\u547d\u4ee4\u91cd\u542f\u3002\u4f9d\u8d56\u7ee7\u7535\u5668\u786c\u4ef6\u8bbe\u5907\uff0c\u9700\u8981\u4f7f\u7528\u8054\u7cfb\u5f00\u53d1\u8005\nRELAY = 0\n# \u83b7\u53d6\u6d4b\u8bd5\u5e94\u7528\u7684\u7248\u672c, %s \u5360\u4f4d\u5e94\u7528\u540d\n# \u5982\u679c\u8be5\u914d\u7f6e\u4e3a\u7a7a\uff0c\u5219\u4e0d\u83b7\u53d6\u5e94\u7528\u7684\u7248\u672c\u4fe1\u606f\u3002\nCOMMAND = apt policy %s 2>/dev/null|grep \"\u5df2\u5b89\u88c5\"|awk -F \"\uff1a\" \"{print \\$2}\"\n# \u5173\u673a\u7b49\u5f85\u5f00\u542f\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6839\u636e\u6d4b\u8bd5\u673a\u6027\u80fd\u4e0d\u540c\uff0c\u5f00\u5173\u673a\u8017\u65f6\u53ef\u80fd\u4e0d\u540c\uff0c\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u673a\u60c5\u51b5\u914d\u7f6e\u3002\nSHUTDOWN_DELAY = 30\n# \u53ef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u56fe\u7247\u683c\u5f0f\uff0c\u4ee5\u82f1\u6587\u9017\u53f7\u9694\u5f00\u3002\n# \u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u76ee\u524d\u6211\u4eec\u4ec5\u9a8c\u8bc1\u4e86jpg,jpeg,png\u8fd9\u4e09\u79cd\u5e38\u7528\u7684\u56fe\u7247\u683c\u5f0f\u3002\nINPUT_TYPES = jpg,jpeg,png\n# \u6027\u80fd\u5206\u6790\u8865\u5e27\uff0c\u7b49\u4e8e\u6216\u4f4e\u4e8e\u8be5\u503c\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u9700\u8981\u51cf\u6389\u3002\nUN_STAB_START = 3\n# \u670d\u52a1\u7aef\u83b7\u53d6\u6d4b\u8bd5\u673a\u56fe\u50cf\u7684\u5e27\u7387\uff0c\u5373\u6bcf\u79d2\u83b7\u53d6\u591a\u5c11\u5f20\u6d4b\u8bd5\u673a\u4e0a\u7684\u56fe\u50cf\u3002\n# \u9ed8\u8ba4\u5e27\u7387\u4e3a30\u5e27/\u79d2\uff0c\u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u53ef\u80fd\u4f1a\u5bf9\u89e3\u6790\u7ed3\u679c\u9020\u6210\u504f\u5dee\u3002\nFPS = 30\n# \u4ee5\u4e0b\u573a\u666f\u7c7b\u578b\u4f1a\u91cd\u542f\u6d4b\u8bd5\u673a,\u591a\u79cd\u573a\u666f\u4f7f\u7528\u9017\u53f7\u9694\u5f00\nSCENE = cold\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = http://10.8.13.78:8890\n#\u5c4f\u5e55\u56fe\u7247\u4e34\u65f6\u5b58\u653e\u4f4d\u7f6e\nSCREEN_CACHE = /tmp/screen\n# =======================================\n[log]\n# \u65e5\u5fd7\u7ea7\u522b\uff0cOFF\u3001FATAL\u3001ERROR\u3001WARN\u3001INFO\u3001DEBUG\u3001ALL\n# \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u65e5\u5fd7\u8f93\u51fa\uff0clog_cli=INFO\u8868\u793a \u4ec5\u8f93\u51faINFO\u53ca\u4ee5\u4e0a\u7ea7\u522b\u7684\u65e5\u5fd7\u3002\nLOG_LEVEL = DEBUG\n# \u65e5\u5fd7\u6587\u4ef6\u4fdd\u5b58\u8def\u5f84\nLOG_PATH= logs\n# =======================================\n[dockerhub]\n# \u5bb9\u5668\u767b\u9646\u8d26\u53f7\nDOCKER_USER = user\n# \u5bb9\u5668\u767b\u9646\u5bc6\u7801\nDOCKER_PASSWORD = User1234\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u6d4b\u8bd5\u673a\u914d\u7f6e","text":"setting/config/client.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u4fe1\u606f\u3002 \u6709\u7f51\u7edc\u7684\u60c5\u51b5\u4e0b\uff0c\u670d\u52a1\u7aef\u9700\u8981\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u56e0\u6b64\u4f60\u9700\u8981\u5199\u5165 \u6d4b\u8bd5\u673a\u522b\u540d \u3001 user \u3001ip\u3001 password \u3002 # \u6d4b\u8bd5\u673a\u522b\u540d\n[Alias1] # \u6d4b\u8bd5\u673aip\nip=10.8.15.86 # \u6d4b\u8bd5\u673a\u7528\u6237\u540d\nuser=uos\n \u547d\u540d\u5efa\u8bae\uff1aAliasA1\u3001AliasA2\u3001AliasB1\u3001AliasB2\uff0c\u4e0d\u8981\u91cd\u540d\u3002 \u65e0\u7f51\u7edc\u60c5\u51b5\u4e0b\uff0c\u4ec5\u9700\u8981\u5173\u6ce8\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\u9879 width=\u3001 height= \u5373\u53ef\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a [client]\n# \u9ed8\u8ba4\u6d4b\u8bd5\u673a\u7528\u6237\u540d\uff0c\u5bc6\u7801\uff0cip\nip=\nuser=\n# \u6d4b\u8bd5\u673a\u5bc6\u7801\npassword=1\n# \u6d4b\u8bd5\u673a\u4e3b\u9898\ntheme=bloom\n# \u6d4b\u8bd5\u673aicon\u76ee\u5f55\npath=/usr/share/icons\n# \u7cfb\u7edfdesktop\u6587\u4ef6\u7684\u5b58\u653e\u76ee\u5f55\uff0cUOS\u7cfb\u7edf\u9ed8\u8ba4\u4e3a/usr/share/applications\ndesktop_path=/usr/share/applications\n# \u7528\u4e8e\u5224\u65ad\u6d4b\u8bd5\u673a\u662f\u5426\u5f00\u673a\u8fdb\u5165\u684c\u9762\u7684\u8bc6\u522b\u6807\u8bc6\u3002\n# 1\u3001\u901a\u8fc7\u684c\u9762\u56fe\u6807\u8bc6\u522b\u3002\n# - type=FILE_NAME\u65f6\uff0c\u670d\u52a1\u5668\u548c\u6d4b\u8bd5\u673a\u5fc5\u987b\u5728\u540c\u4e00\u5c40\u57df\u7f51\u5185\u3002\n# - power_on=dde-computer\u8868\u793a\u901a\u8fc7\u684c\u9762\u8ba1\u7b97\u673a\u56fe\u6807\u5224\u65ad\u5f00\u673a\u8fdb\u5165\u684c\u9762\u3002\n# 2\u3001\u901a\u8fc7\u672c\u5730\u56fe\u7247\u4f5c\u4e3a\u5f00\u673a\u8bc6\u522b\u3002\n# - type= \u4f20\u5165\u4e3a\u56fe\u7247\u683c\u5f0f\uff0ctype\u652f\u6301\u7684\u7c7b\u578b\u5305\u542b\u5728server.ini\u5185\u914d\u7f6e\u9879input_type=jpg,jpeg,png\u3002\n# - power_on= \u4f20\u5165\u7684\u662f\u672c\u5730\u56fe\u7247\u7684\u8def\u5f84\u3002\ntype=FILE_NAME\npower_on=dde-computer\n# \u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\uff08\u6d4b\u8bd5\u673a\u8fde\u63a5\u91c7\u96c6\u76d2\uff0c\u91c7\u96c6\u76d2\u7684\u5206\u8fa8\u7387\uff09\nheight=1080\nwidth=1920\n[AliasA1] ip=10.8.15.86\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n[AliasA2]\nip=10.8.15.20\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_2","title":"3\u3001\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e","text":"\u968f\u7740\u6d4b\u8bd5\u573a\u666f\u7684\u4e0d\u65ad\u5f15\u5165\uff0c\u53d1\u73b0\u73b0\u6709\u670d\u52a1\u7aef\u91cc\u7684\u914d\u7f6e\u9879\u5e76\u4e0d\u9002\u7528\u4e8e\u6240\u6709\u7684\u6027\u80fd\u573a\u666f\uff0c\u4e8e\u662f\u5c06\u670d\u52a1\u7aef\u914d\u7f6e\u8fdb\u884c\u4e00\u4e2a\u63d0\u53d6\uff0c\u53ef\u505a\u5355\u4e2a\u573a\u666f\u7684\u4e2a\u6027\u5316\u914d\u7f6e\uff0c\u5f53\u7136\u539f\u6765\u7684\u670d\u52a1\u7aef\u914d\u7f6e\u529f\u80fd\u4fdd\u7559\uff0c\u53ea\u662f\u5f53\u4f60\u914d\u7f6e\u4e86\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e\u540e\uff0c\u4f18\u5148\u4f7f\u7528\u4e2a\u6027\u5316\u914d\u7f6e\u91cc\u9762\u7684\u5185\u5bb9\uff0c\u4ee5\u4e0b\u662f\u5bf9\u4e2a\u6027\u5316\u914d\u7f6e\u7684\u4ecb\u7ecd\u3002 \u76ee\u524d\u6bcf\u4e00\u4e2a py \u6587\u4ef6\u5bf9\u5e94\u4e00\u4e2a\u6027\u80fd\u6d4b\u8bd5\u573a\u666f\uff0c\u4e8e\u662f\u5728\u540c\u7ea7\u76ee\u5f55\u4e0b\u521b\u5efa\u4e00\u4e2a\u4e0e\u4e4b\u540c\u540d\u7684 json \u6587\u4ef6\uff0c\u4f5c\u4e3a\u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6 apps\n\u251c\u2500\u2500 album\n \u251c\u2500\u2500 test_album_01_start.json # \u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6\n\u2514\u2500\u2500 test_album_01_start.py # \u6027\u80fd\u573a\u666f\u6587\u4ef6\n \u4ee5\u4e0b\u662f\u5bf9 json \u6587\u4ef6\u4e2d\u914d\u7f6e\u7684\u89e3\u91ca\uff0c\u82e5\u67d0\u9879\u914d\u7f6e\u4e0d\u9700\u8981\uff0c\u53ef\u4ee5\u7f3a\u5931\uff0c\u4f46\u4e0d\u80fd\u4e3a\u7a7a\uff1b {\n\"title\": \"test_album_start\", # \u6807\u9898\uff1b\u5fc5\u987b\n\"app_name\": \"deepin-album\", # \u573a\u666f\u6240\u5c5e\u7684\u5e94\u7528\uff1b\u5fc5\u987b\n\"scene\": \"hot\", # \u573a\u666f\u522b\u540d\uff1b\u5fc5\u987b\n\"icon\": [\"deepin-album\"], # \u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684icon\u5230\u670d\u52a1\u7aef\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\uff1b\u53ef\u7f3a\u5931\n# \u6ce8\u610f\uff1a\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684desktop\u6587\u4ef6\u540d\u4e3adeepin-album.desktop\uff0c\n# \u53ea\u9700\u8981\u5199deepin-album\u5373\u53ef\uff0c\u201c.desktop\u201d\u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002\n\"size\": { # \u56fe\u7247\u5bf9\u6bd4\u7684\u533a\u57df\u8bbe\u7f6e\u9879\uff0c\u67d0\u4e9b\u5e94\u7528\u5f53\u524d\u5c4f\u5e55\u7684\u90e8\u5206\u533a\u57df\u9700\u8981\u5c06\u5176\u53bb\u6389\uff0c\u53ef\u4ee5\u8bbe\u7f6e\u6b64\u9879\uff0c\u5982\u679c\u6ca1\u6709\u5219\u53ef\u4e0d\u5199\uff1b\u53ef\u786e\u5b9e\n\"x-coordinate\": 0, # \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n\"y-coordinate\": 0, # \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n\"width\": 850, # \u6a2a\u5411\u957f\u5ea6\n\"height\": 1920 # \u7eb5\u5411\u9ad8\u5ea6\n},\n\"count\": 5, # \u573a\u666f\u6267\u884c\u7684\u6b21\u6570\uff1b\u5fc5\u987b\n\"duration\": 5, # \u8be5\u6761\u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff0c\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7279\u5b9a\u573a\u666f\uff0c\u8be5\u914d\u7f6e\u4e3a\u53ef\u9009\u9879\uff0c\u8986\u76d6 server.ini \u4e2d\u7684\u914d\u7f6e\uff1b\u53ef\u7f3a\u5931\n\"stable_similarity\": 0.9997, # \u6027\u80fd\u573a\u666f\u5206\u9636\u6bb5\u65f6\u7684\u56fe\u7247\u76f8\u4f3c\u5ea6\u5bf9\u6bd4\uff0c\u524d\u540e\u56fe\u7247\u4f4e\u4e8e\u8be5\u503c\uff0c\u5219\u5206\u4e3a\u4e0d\u7a33\u5b9a\u9636\u6bb5\uff1b\u53ef\u7f3a\u5931\n\"find_by\": \"stage\", # \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\n\"final_stable_num\": 100, # \u67e5\u627e\u6700\u540e\u4e00\u4e2a\u5927\u4e8e\u8be5\u503c\u7684\u7a33\u5b9a\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u7684\u5c3e\u796f\uff1b\u53ef\u7f3a\u5931\n\"start_num\": 150,\n\"text\": \"\", # ocr\u8bc6\u522b\u7684\u6587\u6848\n\"match\": \"apps/xxx/images/match.png\", # \u56fe\u50cf\u5339\u914d\u7684\u56fe\u7247\u6587\u4ef6\u8def\u5f84\n\"match_rate\": 0.9 # \u5339\u914d\u76f8\u4f3c\u5ea6\n}\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e94\u3001\u6d4b\u8bd5\u6d41\u7a0b","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516d\u3001\u7528\u4f8b\u7f16\u5199\u53ca\u65b9\u6cd5\u53c2\u6570\u6307\u5f15","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"1\u3001\u7528\u4f8b\u5b9e\u4f8b\u8bf4\u660e","text":"# \u6807\u51c6\u5e93\u5bfc\u5165\nfrom time import sleep\n# \u5bfc\u5165\u4e09\u65b9\u5e93pytest\nimport pytest\n# \u5bfc\u5165\u7528\u4f8b\u6267\u884c\u8981\u7528\u5230\u7684Widget\u7c7b\nfrom src.base_widget import BaseWidget\nclass TestStart:\n# class\u7ea7\u522b\u7684fixture\uff0c\u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u6267\u884c\u3002autouse=True \u81ea\u52a8\u5728\u5f53\u524d\u4f5c\u7528\u57df\u4e0b\u4f7f\u7528\u3002\n@pytest.fixture(scope=\"class\", autouse=True)\n# \u6d4b\u8bd5\u70ed\u542f\u52a8\u4e4b\u524d\u9700\u8981\u9884\u542f\u52a8\u3002\ndef application_pre_start(self):\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().right_click_element(\"deepin-album\")\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().click_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\")\nsleep(2)\n# \u5feb\u6377\u952e\u5173\u95ed\u7a97\u53e3\nBaseWidget().hot_key(\"alt\", \"f4\")\nsleep(2)\n# \u9ed8\u8ba4\u4e3afunction\u7ea7\u522b\u7684fixture\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\uff0cclass\u7ea7\u522bfixture\u6267\u884c\u4e4b\u540e\u6267\u884c\u3002\n@pytest.fixture(autouse=True)\ndef setup_start(self):\n# \u53f3\u952e\u70b9\u51fb deepin-album \u56fe\u6807\nBaseWidget().right_click_element(\"deepin-album\")\n# \u79fb\u52a8\u5230\u53f3\u952e\u83dc\u5355\u4e2d\u6253\u5f00\uff08open.png\uff09\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().move_to(*BaseWidget().find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))\n# \u7b49\u5f85\u79fb\u52a8\u5b8c\u6210\nsleep(0.5)\ndef test_album_start(self):\n# \u70b9\u51fb\u201c\u6253\u5f00\u201d\nBaseWidget().click() \n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"2\u3001\u65b9\u6cd5\u53c2\u6570\u8bf4\u660e","text":"2.1\u3001find_element \u65b9\u6cd5 def find_element(element: str, input_type: str = \"FILE_NAME\", fill_color_position: tuple = (-1, -1), size: tuple = (25, 70)):\npass\n \u53c2\u6570 element \u548c input_type \uff081\uff09\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u5143\u7d20 - `input_type` \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a `FIEL_NAME` \uff0c\u8868\u793a\u901a\u8fc7\u5e94\u7528 `icon` \u5bfb\u627e\u5143\u7d20\uff0c\u6b64\u65b9\u6cd5\u4f1a\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u5e94\u7528 `icon` \u56fe\u6807\u3002\n \u4e3e\u4f8b\uff1a\u9ed8\u8ba4\u60c5\u51b5\u4e0b input_type \u53c2\u6570\u4e0d\u9700\u8981\u4f20\u5165\uff0c find_element(\"deepin-album\")\uff0c\u8868\u793a\u901a\u8fc7 deepin-album \u7684\u5e94\u7528 icon \u6765\u83b7\u53d6\u5750\u6807\uff0c\u6ce8\u610f\uff0c\u6b64\u65f6\u4f20\u5165\u7684 deepin-album \u53c2\u6570\u5b9e\u9645\u662f desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u548c2.3\u4e2d\u7684 icon \u53d8\u91cf\u4e00\u81f4\u3002 \u6211\u4eec\u5efa\u8bae\u4f18\u5148\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\uff0c\u4f46\u6b64\u65b9\u6cd5\u4f9d\u8d56\u7f51\u7edc\uff0c\u8bf7\u6839\u636e\u6d4b\u8bd5\u73af\u5883\u5b9e\u9645\u60c5\u51b5\u9009\u62e9\u3002 \uff082\uff09\u901a\u8fc7\u672c\u5730\u56fe\u7247\u8bc6\u522b\u5143\u7d20 - \u53c2\u6570 `input_type` \u4f20\u5165\u56fe\u7247\u683c\u5f0f\uff0c\u6bd4\u5982\u622a\u53d6\u7684\u672c\u5730\u56fe\u7247\u683c\u5f0f\u4e3a `png`\uff0c\u90a3\u4e48 `input_type=\"png\"`\uff0c\u6b64\u65f6\u53c2\u6570 `element ` \u4f20\u5165\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5efa\u8bae\u5b58\u653e\u5728\u5bf9\u5e94\u7684\u4ea7\u54c1 `apps/app/picture/` \u76ee\u5f55\u4e0b\uff0c\u8def\u5f84\u4e3a\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u7684\u76f8\u5bf9\u8def\u5f84\u3002\n- \u4e3e\u4f8b\uff1a`find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))`\uff0c\u8868\u793a\u901a\u8fc7\u672c\u5730\u56fe\u7247 `open.png` \u8bc6\u522b\u5143\u7d20\u3002\n \u53c2\u6570 fill_color_position fill_color_position \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (-1, -1)\uff0c(-1, -1) \u8868\u793a\u53d6\u5c4f\u5e55\u4e2d\u53f3\u4e0b\u89d2\u6700\u540e\u4e00\u4e2a\u50cf\u7d20\u70b9\u4f5c\u4e3a\u586b\u5145\u5750\u6807\uff0c\u5728 1920x1080 \u5c4f\u5e55\u5206\u8fa8\u7387\u4e0b\u5373\u5b9e\u9645\u5750\u6807\u4e3a (1919, 1079) \uff0c\u8fd9\u6837\u7684\u5199\u6cd5\u53ef\u4ee5\u9002\u914d\u4e0d\u540c\u5927\u5c0f\u7684\u5c4f\u5e55\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0d\u540c\u65b9\u4f4d\uff1a \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0b\u65b9\uff0c\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u4e0d\u9700\u8981\u4f20\u5165\u8be5\u53c2\u6570\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u5de6\u8fb9\uff0cfill_color_position=(1, 1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u53f3\u8fb9\uff0cfill_color_position=(-1, -1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0a\u8fb9\uff0cfill_color_position=(1, 1) \u4ece\u684c\u9762\u542f\u52a8\u5e94\u7528\uff0c\u5219\u9700\u8981\u4f20\u5165\u9664\u4efb\u52a1\u680f\u4ee5\u5916\u5176\u4ed6\u4f4d\u7f6e\u7684\u5750\u6807\uff0c\u6bd4\u5982(100, 100)\uff0c\u53ea\u8981\u8fd9\u4e2a\u5750\u6807\u4e3a\u9664\u5e94\u7528\u548c\u4efb\u52a1\u680f\u533a\u57df\u90fd\u53ef\u4ee5\u3002 \u4ece\u542f\u52a8\u5668\u91cc\u9762\u542f\u52a8\u5e94\u7528\uff0c\u9700\u8981\u586b\u5145\u7684\u5750\u6807\u4e3a\u542f\u52a8\u5668\u533a\u57df\u3002 \u6ce8\uff1a\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u65f6\uff0c\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684 icon \u539f\u6587\u4ef6\u4e3a svg \u77e2\u91cf\u56fe\uff0c\u8f6c\u6362\u4e3a png \u4e4b\u540e\u9700\u8981\u586b\u5145\u8fb9\u7f18\u900f\u660e\u90e8\u5206\u3002 \u53c2\u6570 size size \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (25, 70)\uff0c\u8868\u793a\u6d4b\u8bd5\u673a\u4e0a dock \u680f\u4e0a\u5e94\u7528\u56fe\u6807\u7684\u5927\u5c0f\u8303\u56f4\u3002 UOS \u7cfb\u7edf dock \u680f\u662f\u53ef\u4ee5\u4e0a\u4e0b\u62d6\u52a8\u5927\u5c0f\u7684\uff0c\u968f\u7740 dock \u680f\u5927\u5c0f\u6539\u53d8\uff0c\u5e94\u7528\u56fe\u6807\u7684\u8303\u56f4\u4e3a25\u523070\u4e4b\u95f4\u3002 \u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u64cd\u4f5c\u7cfb\u7edf\u4e0a dock \u680f\u5927\u5c0f\u4e0d\u4e00\u6837\uff0c\u53ef\u4ee5\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u4f20\u5165\u5927\u5c0f\u8303\u56f4\u3002 2.2\u3001click_element\u3001 right_click_element\uff0c double_click_element \u8fd9\u51e0\u4e2a\u65b9\u6cd5\u53c2\u6570\u89c4\u5219\u4e0e find_element \u65b9\u6cd5\u4e00\u6837\u3002\u4ed6\u4eec\u5b9e\u9645\u4e0a\u662f\u5728 find_element \u65b9\u6cd5\u57fa\u7840\u4e4b\u4e0a\u505a\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u589e\u52a0\u4e86\u9f20\u6807\u7684\u52a8\u4f5c\uff0c\u5982\u679c\u4f60\u4e0d\u60f3\u4f7f\u7528\u8fd9\u51e0\u4e2a\u65b9\u6cd5\uff0c\u5728\u7528\u4f8b\u4e2d\u4e5f\u53ef\u4ee5\u901a\u8fc7 find_element \u83b7\u53d6\u5230\u5750\u6807\uff0c\u7136\u540e\u5c06\u5750\u6807\u4f20\u5165\u5230\u952e\u9f20\u7684\u65b9\u6cd5\u4e2d\uff0c\u53ef\u4ee5\u5b9e\u73b0\u540c\u6837\u7684\u6548\u679c\u3002 2.3\u3001\u7528\u4f8b\u7c7b\u4e2d\u6709\u4e2a\u7c7b\u53d8\u91cf icon = [\"deepin-album\"] \u9700\u8981\u7279\u6b8a\u8bf4\u660e\uff0c\u5217\u8868\u4e2d\u7684\u5143\u7d20\u4e3a\u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709 icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684 icon \u5230\u670d\u52a1\u7aef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528 desktop \u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684 desktop \u6587\u4ef6\u540d\u4e3a deepin-album.desktop\uff0c\u53ea\u9700\u8981\u5199 deepin-album \u5373\u53ef\uff0c.desktop \u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e03\u3001\u6267\u884c\u5165\u53e3","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"1\u3001\u7528\u4f8b\u7ec4\u7ec7","text":"\u5728 setting/config/server.ini \u6587\u4ef6\u4e2d APP_NAME= \u5b57\u6bb5\u4e3a\u7528\u4f8b\u7684\u6267\u884c\u7684\u76ee\u5f55\uff0c\u9ed8\u8ba4\u4e3a apps \u76ee\u5f55\u4e0b\u6240\u6709\u7528\u4f8b\u3002\u5982\u679c\u4f60\u60f3\u6307\u5b9a\u6267\u884c\u67d0\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4f60\u53ef\u4ee5\u5c06\u8be5\u914d\u7f6e\u9879\u6307\u5b9a\u5230\u5e94\u7528\u7684\u7528\u4f8b\u76ee\u5f55\uff0c\u6bd4\u5982\uff1aAPP_NAME=deepin_album\uff0c \u8868\u793a\u6267\u884c\u76f8\u518c\u76ee\u5f55\u4e0b\u7684\u7528\u4f8b\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a python3 manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music\n -k KEYWORDS, --keywords KEYWORDS\n \u7528\u4f8b\u7684\u5173\u952e\u8bcd\n -t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e\n --log_level LOG_LEVEL \u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n --env {host,docker} \u5728\u5bbf\u4e3b\u673a\u6216\u5bb9\u5668\u73af\u5883\u6267\u884c\n --client_alias \u9009\u62e9\u6d4b\u8bd5\u673a\u522b\u540d, \u53ef\u9009\u9879\u4e3aclient.ini\u4e2d\u5df2\u914d\u7f6e, \u9ed8\u8ba4\u503c\u4e3a zx-x86.\n --count \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a python3 manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\" --env docker\n \u6ce8\uff1a\u5728\u5bb9\u5668\u4e2d\u6267\u884c\u65f6\uff0c\u82e5\u5f3a\u5236\u9000\u51fa\uff0c\u5bb9\u5668\u5e76\u4e0d\u4f1a\u505c\u6b62\u8fd0\u884c\uff01"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_9","title":"\u516b\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1json","title":"1\u3001Json \u62a5\u544a","text":"\u81ea\u7814\u89c6\u9891\u89e3\u6790\u5de5\u5177\u4f1a\u5bf9\u5355\u6761\u7528\u4f8b\u6267\u884c\u4e00\u8f6e\u751f\u6210\u4e00\u4e2a json \u6587\u4ef6\uff0c\u5b58\u653e\u4e8e report/{app_name}/{scene}/{run_num} \u76ee\u5f55\u4e0b\uff0c\u547d\u540d\u683c\u5f0f\u4e3a\uff1a report.json json \u5185\u5bb9\u4e3e\u4f8b\uff1a [\n{\n\"Stab1\": {\n\"images\": [1,2...150,151],\n\"startStub\": 0,\n\"type\": \"Stab\"\n}\n},\n{\n\"Stab2\": {\n\"images\": [152,153...169,170],\n\"startStub\": 1,\n\"type\": \"UnStab\"\n}\n},\n{\n\"Stab3\": {\n\"images\": [171,172...300,301],\n\"startStub\": 0,\n\"type\": \"UnStab\"\n}\n}\n]\n \u8bf4\u660e\uff1a Stab \uff1a\u8868\u793a\u89e3\u6790\u8fc7\u7a0b\u4e2d\u4e0d\u540c\u7684\u9636\u6bb5\u3002 images \uff1a\u8868\u793a\u6bcf\u4e00\u5e27\u7684\u56fe\u7247\u5e8f\u53f7\u3002 startStub\uff1a \u4e3a\u8bc6\u522b\u5c3e\u5e27\u7684\u9636\u6bb5\u8868\u793a\uff0c\u5982\u679c \"startStub\": 1 \uff0c\u8bf4\u660e\u5c3e\u5e27\u51fa\u73b0\u5728\u8be5\u9636\u6bb5\u3002 type\uff1a \u4e3a Stab \u6216 UnStab \uff0c\u8868\u793a\u7a33\u5b9a\u9636\u6bb5\u6216\u4e0d\u7a33\u5b9a\u9636\u6bb5\u3002 \u5404\u9636\u6bb5\u6709\u5e27\u6570\u8865\u507f\uff0c\u9ed8\u8ba4\u8865\u507f\u7684\u5e27\u6570\u4e3a 3 \u5e27\uff08\u53ef\u4ee5\u901a\u8fc7 server.ini \u91cc\u9762 un_stab_start=3 \u8fdb\u884c\u914d\u7f6e\uff09\uff0c\u8868\u793a\u5c0f\u4e8e\u7b49\u4e8e 3 \u5e27\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u524d\u540e\u5747\u9700\u8981\u51cf\u6389\u3002 \u5e94\u7528\u542f\u52a8\u9636\u6bb5\u5c31\u662f\u5728 Stab2 \u9636\u6bb5\uff0c\u542f\u52a8\u65f6\u95f4\u4e3a\uff1a171 \u51cf 151 \u518d\u51cf\u6389\u524d\u540e\u8865\u507f\u5e27\u6570 6 \u5e27\uff0c\u5373 14 \u5e27\uff0c\u89c6\u9891\u5e27\u7387 30 \u5e27/\u79d2\uff0c\u56e0\u6b64\u542f\u52a8\u8017\u65f6\u4e3a\uff1a14 * 33 = 462 ms"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2excel","title":"2\u3001Excel \u62a5\u544a","text":"\u6240\u6709\u7528\u4f8b\u6267\u884c\u5e76\u89e3\u6790\u5b8c\u4e4b\u540e\u4f1a report \u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a\u6c47\u603b\u6570\u636e\u7684 Excel \u6587\u4ef6\uff0c\u6587\u4ef6\u540d\u4e3a\uff1a{time}_perf_time.xlsx\u3002 \u6ce8\u610f\uff0creport \u76ee\u5f55\u4e3a\u53ef\u914d\u7f6e\u9879\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u4f1a\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u751f\u6210\uff0c\u5982\u679c\u4f60\u5c06 report\uff0c\u6307\u5b9a\u5230\u9879\u76ee\u4e0b\u5176\u4ed6\u8def\u5f84\uff0c\u5219\u4f1a\u5728\u5bf9\u5e94\u7684\u8def\u5f84\u4e0b\u751f\u6210 json \u548c Excel \u6587\u4ef6\u3002 \u4f60\u4e5f\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8bfb\u53d6\u6240\u6709 json / excel \u62a5\u544a\u7684\u6570\u636e\uff0c\u751f\u6210\u4f60\u81ea\u5df1\u60f3\u8981\u7684\u4e00\u4e9b\u6d4b\u8bd5\u62a5\u544a\u5f62\u5f0f\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#usb","title":"\u4e5d\u3001USB \u4e32\u53e3\u9a71\u52a8\u952e\u9f20\u65b9\u6cd5","text":"\u4f4d\u4e8e src/utils/control/serial_communication \u76ee\u5f55\u4e0b\u7684 usb_mk.py \u6587\u4ef6 usb_mk = UsbMk()\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up()\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u652f\u6301\u4f20\u5165\u6c49\u5b57\uff0c\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click()\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() \n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() \n \uff084\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() \n \uff085\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() \n \uff086\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() \n \uff087\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff088\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff0810\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_10","title":"\u5341\u3001\u7ee7\u7535\u5668\u63a7\u5236\u4e3b\u673a\u5f00\u673a/\u91cd\u542f","text":"\uff08\u82e5\u4e0d\u4f7f\u7528\u7ee7\u7535\u5668\uff0c\u53ef\u5ffd\u7565\u8be5\u6b65\u9aa4\uff0c\u6267\u884c\u65f6\u4f1a\u901a\u8fc7\u547d\u4ee4 reboot\uff09"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u7ee7\u7535\u5668\u8bbe\u5907","text":"LCUS-2 \u578b \u53cc\u8def USB \u667a\u80fd\u4e32\u53e3\u63a7\u5236\u7ee7\u7535\u5668\u3002 https://item.taobao.com/item.htm?spm=a1z09.2.0.0.41d72e8dUYx2pi&id=582653718178&_u=i25r20ia6a2e "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2usb","title":"2\u3001USB \u5ef6\u957f\u7ebf","text":"\u666e\u901a\u7684 USB \u7ebf\u5373\u53ef\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_3","title":"3\u3001\u675c\u90a6\u7ebf","text":"3.1\u300140P \u6bcd\u5bf9\u516c\u675c\u90a6\u7ebf\u3002 3.2\u3001\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"4\u3001\u5b89\u88c5\u56fe\u6587\u6559\u7a0b","text":"4.1\u3001\u4f7f\u7528 USB \u5ef6\u957f\u7ebf\u8fde\u63a5\u63a7\u5236\u7aef\u548c\u7ee7\u7535\u5668\u3002 4.2\u3001\u5728\u7ee7\u7535\u5668\u5e38\u7aef\u548c\u516c\u5171\u7aef\u5747\u8fde\u63a5\u4e00\u6839\u675c\u90a6\u7ebf\u3002 4.3\u3001\u5728\u4e3b\u677f\u4e0a\u5f00\u673a\u9488\u548c\u91cd\u542f\u9488\u4e0a\u63d2\u4e0a\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 4.4\u3001\u5c06\u5f00\u673a\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76841\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1\u5de6\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 4.5\u3001\u5c06\u91cd\u542f\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76842\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1 \u53f3\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 \u82e5\u60f3\u4fdd\u7559\u539f\u7535\u6e90\u5f00\u5173\u7684\u7535\u6e90\u706f\uff0c\u53ef\u6839\u636e\u5982\u4e0a\u56fe\u6240\u793a\uff0c\u4f7f\u7528\u675c\u90a6\u7ebf\u8fde\u63a5\u4e3b\u677f\u4e0a\u7684\u7535\u6e90\u706f\u548c\u539f\u7535\u6e90\u5f00\u5173"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_11","title":"\u5341\u4e00\u3001\u5e38\u89c1\u95ee\u9898\u8bf4\u660e","text":"1\u3001ERROR: for uos Cannot restart container 2301b1a1395d7959ee6523d61b61c87084649af530786cdb8fb5b3ecbcbd1068: linux runtime spec devices: error gathering device information while adding custom device \"/dev/ttyACM0\": no such file or directory \u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u8fde\u63a5\u72b6\u6001\uff0c\u67e5\u770b /dev/ttyACM0 \u662f\u5426\u5b58\u5728\uff0c\u82e5\u5b58\u5728 /dev/ttyACMn\uff08n\u4e3a\u4efb\u610f\u6570\u5b57\uff09\uff0c\u91cd\u542f\u7535\u8111\u89e3\u51b3\u3002 2\u3001Error response from daemon: Container 5e700fdc769e8c74666d68a7f2bc3de58268b4594cf88706609d59f8dbc7362d is not running \u5bb9\u5668\u542f\u52a8\u5931\u8d25 1\uff09\u68c0\u67e5\u54ea\u4e00\u4e2a\u5bb9\u5668\u672a\u542f\u52a8 sudo docker container ls # \u5217\u51fa\u8fd0\u884c\u4e2d\u7684 Docker \u5bb9\u5668\n 2\uff09\u7f3a\u5c11 uos \u5bb9\u5668\uff0c\u68c0\u67e5 USB \u4e32\u53e3\u8fde\u63a5\u7ebf\u548c\u91c7\u96c6\u76d2\u8fde\u63a5\u7ebf\u662f\u5426\u6b63\u5e38\uff0c\u91cd\u542f\u540e\u6267\u884c bash install/setup.up # \u91cd\u65b0\u5b8c\u6574\u90e8\u7f72\u73af\u5883\n \u6216\u6267\u884c sudo docker-compose up -d --build # \u4ec5\u91cd\u65b0\u6784\u5efa Docker \u955c\u50cf\n 3\u3001\u82e5\u90e8\u7f72\u65f6\u63d0\u793a\u6302\u8f7d ttyACM0\u3001video0 \u5931\u8d25\uff0c\u8bf7\u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u53ca\u91c7\u96c6\u76d2\u662f\u5426\u63a5\u89e6\u826f\u597d\uff0c\u82e5\u63a5\u89e6\u826f\u597d\uff0c\u91cd\u542f\u5373\u53ef\u89e3\u51b3\u3002 4\u3001\u82e5\u51fa\u73b0\u56fe\u7247\u80fd\u8bc6\u522b\uff0c\u4f46\u662f\u9f20\u6807\u672a\u79fb\u52a8\u64cd\u4f5c\u65f6\uff0c\u5b89\u88c5\u7edd\u5bf9\u9f20\u6807\u64cd\u4f5c\u7684\u4f9d\u8d56\u5305\uff0c\u89c1\u7b2c\u4e09\u8282\u7b2c\u4e8c\u5c0f\u8282\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u6d4b\u8bd5\u673a\u3002 5\u3001\u7531\u4e8e\u901a\u8fc7\u91c7\u96c6\u5361\u83b7\u53d6\u7684\u6d4b\u8bd5\u673a\u5b9e\u65f6\u753b\u9762\uff0c\u5305\u542b\u4e86\u9f20\u6807\u7684\u6837\u5f0f\uff0c\u6240\u4ee5\u5bf9\u56fe\u7247\u8bc6\u522b\u65f6\uff0c\u9f20\u6807\u82e5\u505c\u7559\u5728\u56fe\u6807\u4e0a\u5c42\uff0c\u5219\u4f1a\u5bf9\u8bc6\u522b\u7ed3\u679c\u9020\u6210\u5f71\u54cd\uff0c\u9700\u8981\u5c06\u9f20\u6807\u79fb\u52a8\u81f3\u5176\u4ed6\u4f4d\u7f6e\uff0c\u6216\u8005\u9690\u85cf\u9f20\u6807\u89e3\u51b3\u3002 6\u3001Excel \u62a5\u544a\u4e2d\uff0c\u6d4b\u8bd5\u573a\u666f\u5217\u4e0e\u7528\u4f8b\u4e2d\u7684\u4e0d\u4e00\u81f4\uff0c\u5173\u952e\u5b57scene\u3001app_name\u3001\u67b6\u6784\u522b\u540d\uff0c\u4e0d\u80fd\u5305\u542b\u4e0b\u5212\u7ebf\u548c\u82f1\u6587\u7b26\u53f7\u7684\u5706\u62ec\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/","title":"\u6846\u67b6\u529f\u80fd\u4ecb\u7ecd","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2023/1/12\n# Author : Mikigo\n# =============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_2","title":"\u4e00\u3001\u4e00\u53e5\u8bdd\u7b80\u4ecb","text":"\u6b64\u6587\u6863\u4e3b\u8981\u60f3\u5bf9 YouQu \u6846\u67b6\u4e00\u4e9b\u91cd\u70b9\u7684\u529f\u80fd\u505a\u8be6\u7ec6\u7684\u4ecb\u7ecd\uff0c\u5305\u62ec\u5bf9\u4e00\u4e9b\u529f\u80fd\u5f00\u53d1\u7684\u80cc\u666f\u3001\u8981\u89e3\u51b3\u7684\u95ee\u9898\u3001\u5b9e\u73b0\u903b\u8f91\u3001\u4ee3\u7801\u7b49\u65b9\u9762\u7684\u4ecb\u7ecd\uff0c\u4ee5\u6b64\u8ba9\u5927\u5bb6\u80fd\u66f4\u52a0\u6e05\u6670\u7684\u7406\u89e3\u5404\u9879\u529f\u80fd\uff0c\u4ece\u800c\u5728\u4f7f\u7528\u7684\u65f6\u5019\u80fd\u66f4\u52a0\u7684\u5f97\u5fc3\u5e94\u624b\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_3","title":"\u4e8c\u3001\u56fe\u50cf\u8bc6\u522b","text":"\u56fe\u50cf\u8bc6\u522b\u5728 UI \u81ea\u52a8\u5316\u4e2d\u662f\u4e0d\u53ef\u7f3a\u5c11\u7684\uff0c\u5e02\u9762\u4e0a\u751a\u81f3\u6709\u5b8c\u5168\u57fa\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\uff0c\u6bd4\u5982 Airtest\u3001Sikuli \u7b49\uff0c\u5728\u6e38\u620f\u7b49\u7279\u5b9a\u9886\u57df\u4e5f\u6709\u4e0d\u9519\u7684\u6548\u679c\uff0c\u8fd9\u4e9b\u5de5\u5177\u5b9e\u9645\u4e0a\u4e5f\u662f\u7528\u7684 OpenCV \u8fdb\u884c\u4e86\u5c01\u88c5\uff0cYouQu \u6846\u67b6\u57fa\u4e8e OpenCV \u5f00\u53d1\u4e86\u81ea\u5df1\u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\uff0c\u5b83\u53ef\u4ee5\u65b9\u4fbf\u7684\u7528\u4e8e\u754c\u9762\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u65ad\u8a00\uff1b YouQu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u51e0\u4e4e\u6ee1\u8db3\u4e86\u4f60\u7684\u6240\u6709\u8981\u6c42\uff0c\u6211\u4eec\u5728\u957f\u65f6\u95f4\u7684\u601d\u8003\u548c\u6478\u7d22\u4e2d\uff0c\u9488\u5bf9\u5e38\u89c4\u573a\u666f\u53ca\u4e00\u4e9b\u7279\u6b8a\u573a\u666f\u63a2\u7d22\u9664\u4e86\u4e00\u4e9b\u5b9e\u7528\u4e14\u6709\u6548\u7684\u65b9\u6848\uff0c\u4e14\u542c\u6211\u6162\u6162\u9053\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1","title":"1\u3001\u5e38\u89c4\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5e38\u89c4\u8bc6\u522b\u5f88\u597d\u7406\u89e3\uff0c\u4e00\u53e5\u8bdd\u8bb2\u5c31\u662f\uff0c\u8981\u83b7\u53d6\u5230\u76ee\u6807\u5143\u7d20\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u3002 \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u5728\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u9700\u8981\u83b7\u53d6\u7684\u5750\u6807\u662f\u76f8\u5bf9\u4e8e\u6574\u4e2a\u5c4f\u5e55\u7684\u5750\u6807\uff0c\u6211\u4eec\u53ef\u4ee5\u622a\u53d6\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u56fe\u7247\uff08screen\uff09\uff1b \u5728\u5143\u7d20\u8bc6\u522b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u622a\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5c0f\u56fe\u8fdb\u884c\u8bc6\u522b\uff0c\u6bd4\u5982\u622a\u53d6\u64ad\u653e\u6309\u94ae\uff1a \u90a3\u4e48\u5b9e\u9645\u4e0a\uff0c\u5143\u7d20\u5b9a\u4f4d\u7684\u95ee\u9898\u5c31\u8f6c\u6362\u4e3a\uff0c\u5c06\u622a\u56fe\u7684\u5c0f\u56fe\uff08play_btn\uff09\u62ff\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u5927\u56fe\uff08screen\uff09\u4e2d\u53bb\u505a\u5339\u914d\uff0c\u5982\u679c\u5339\u914d\u6210\u529f\uff0c\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff08 x, y \uff09\u5373\u53ef\u3002 \u4e3a\u4e86\u65b9\u4fbf\u63cf\u8ff0\uff0c\u4ee5\u4e0b\u6211\u5c06\u6574\u4e2a\u5c4f\u5e55\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5927\u56fe\uff0c\u67d0\u4e2a\u5143\u7d20\u56fe\u7247\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5c0f\u56fe\u3002 \u57fa\u4e8e OpenCV \u7684\u6a21\u677f\u5339\u914d cv.matchTemplate() \u529f\u80fd\uff0c\u6211\u4eec\u5b9e\u73b0\u4e86\u56fe\u50cf\u5b9a\u4f4d\u7684\u529f\u80fd\uff0c\u6846\u67b6\u63d0\u4f9b\u4e86\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u5e95\u5c42\u63a5\u53e3\uff08\u4e00\u822c\u4e0d\u5bf9\u4e0a\u5c42\u63d0\u4f9b\u8c03\u7528\uff09\uff1a def _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\n# \u8be6\u7ec6\u4ee3\u7801\u592a\u957f\u4e0d\u8d34\u4e86\uff0c\u611f\u5174\u8da3\u8bf7\u67e5\u770b\u6e90\u7801\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001image_path image_path \u662f\u5c0f\u56fe\u7684\u7edd\u5bf9\u8def\u5f84; \u901a\u5e38\u5728 AT \u5de5\u7a0b\u91cc\u9762\uff0c\u6211\u4eec\u7ea6\u5b9a\u5c06\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u5b9e\u9645\u7684\u5143\u7d20\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1aplay_btn.png \uff1b \u7528\u4e8e\u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 case/assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1amusic_001.png \uff1b \u8fd9\u6837\u662f\u4e3a\u4e86\u65b9\u4fbf\u7ba1\u7406\u548c\u7ef4\u62a4\u3002 2\u3001rate \u56fe\u50cf\u8bc6\u522b\u7684\u7684\u5339\u914d\u5ea6\u6216\u8005\u8bf4\u76f8\u4f3c\u5ea6\uff0c\u6846\u67b6\u9ed8\u8ba4\u7684\u914d\u7f6e\u4e3a 0.9\uff0c\u4e5f\u5c31\u662f\u8bf4\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u5b58\u5728\u4e00\u4e2a\u76f8\u4f3c\u5ea6 90% \u7684\u56fe\u6807\u5373\u8fd4\u56de\u5176\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff1b \u5982\u679c\u4f60\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u8c03\u6574\u8bc6\u522b\u5ea6\uff0c\u4f60\u53ef\u4ee5\u5728\u8c03\u7528\u51fd\u6570\u7684\u65f6\u5019\uff0c\u4f20\u5165\u4e0d\u540c\u7684\u8bc6\u522b\u5ea6\u7684\u503c\u3002 3\u3001multiple \u9ed8\u8ba4\u60c5\u51b5\u4e0b multiple=False\uff0c\u8868\u793a\u53ea\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u7b2c\u4e00\u4e2a\uff0c\u5982\u679c multiple=True \u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\uff0c\u56e0\u4e3a\u5927\u56fe\u4e2d\u53ef\u80fd\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u5c0f\u56fe\uff0c\u5728\u67d0\u4e9b\u573a\u666f\u4e0b\u4f60\u53ef\u80fd\u9700\u8981\u5168\u90e8\u83b7\u53d6\u5230\u6240\u6709\u5339\u914d\u5230\u7684\u5750\u6807\u3002 4\u3001picture_abspath \u9ed8\u8ba4\u60c5\u51b5\u4e0b picture_abspath=None \u8868\u793a\u5927\u56fe\u4e3a\u622a\u53d6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u5982\u679c\u4f60\u4e0d\u5e0c\u671b\u5927\u56fe\u662f\u5c4f\u5e55\u7684\u622a\u56fe\uff0c\u800c\u662f\u4f60\u81ea\u5b9a\u4e49\u4f20\u5165\u7684\u67d0\u4e2a\u56fe\u7247\uff0c\u4f60\u53ea\u9700\u8981\u5c06\u4f60\u7684\u56fe\u7247\u8def\u5f84\u4f20\u9012\u7ed9\u8fd9\u4e2a\u53c2\u6570\u5c31\u884c\uff0c\u6bd4\u5982\uff1a picture_abspath=\"~/Desktop/big.png\" \uff1b 5\u3001screen_bbox \u5927\u56fe\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u622a\u53d6\u6574\u4e2a\u5c4f\u5e55\uff0cscreen_bbox = [x, y, w, h] \u53ef\u4ee5\u6307\u5b9a\u622a\u53d6\u5c4f\u5e55\u4e2d\u7684\u56fa\u5b9a\u533a\u57df\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\uff0c\u53ef\u4ee5\u6392\u9664\u90e8\u5206\u533a\u57df\u5bf9\u8bc6\u522b\u7ed3\u679c\u7684\u5f71\u54cd\u3002 \u3010\u9690\u5f0f\u7b49\u5f85\u3011 \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\uff0c\u6709\u65f6\u5019\u9875\u9762\u8df3\u8f6c\u6709\u5ef6\u65f6\uff0c\u6709\u53ef\u80fd\u5b58\u5728\u8bc6\u522b\u7684\u90a3\u4e00\u523b\u9875\u9762\u4e5f\u6ca1\u6709\u8df3\u8f6c\u51fa\u6765\uff0c\u6216\u8005\u6216\u8005\u8bc6\u522b\u7684\u90a3\u4e00\u523b\uff1b \u56e0\u6b64\u6211\u4eec\u9700\u8981\u4e00\u79cd\u7b49\u5f85\u673a\u5236\uff0c\u5373\u5728\u4e00\u5b9a\u7684\u65f6\u95f4\u5185\uff0c\u5982\u679c\u8bc6\u522b\u4e0d\u5230\uff0c\u91cd\u590d\u53bb\u8bc6\u522b\uff1a def find_image(\ncls,\n*widget, rate: [float, int] = None,\nmultiple: bool = False,\nmatch_number: int = None,\npicture_abspath: str = None,\nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u5728\u5c4f\u5e55\u4e2d\u533a\u5bfb\u627e\u5c0f\u56fe\uff0c\u8fd4\u56de\u5750\u6807\uff0c\n \u5982\u679c\u627e\u4e0d\u5230\uff0c\u6839\u636e\u914d\u7f6e\u91cd\u8bd5\u6b21\u6570\uff0c\u6bcf\u6b21\u95f4\u96941\u79d2\n :param widget: \u6a21\u677f\u56fe\u7247\u8def\u5f84\n :param rate: \u76f8\u4f3c\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param match_number: \u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\n :return: \u5750\u6807\u5143\u7ec4\n \"\"\"\nif rate is None:\nrate = float(GlobalConfig.IMAGE_RATE)\ntry:\nfor element in widget:\nfor _ in range((match_number or int(GlobalConfig.IMAGE_MATCH_NUMBER)) + 1):\nlocate = cls._match_image_by_opencv(\nelement,\nrate,\nmultiple=multiple,\npicture_abspath=picture_abspath,\nscreen_bbox=screen_bbox\n)\nif not locate:\nsleep(int(GlobalConfig.IMAGE_MATCH_WAIT_TIME))\nelse:\nreturn locate\nraise TemplateElementNotFound(*widget)\nexcept Exception as e:\nraise e\n \u53c2\u6570 match_number \u7528\u4e8e\u63a7\u5236\u91cd\u590d\u8bc6\u522b\u7684\u6b21\u6570\uff0c\u9ed8\u8ba4\u4e0d\u4f20\u53c2\uff0c\u53d6\u5168\u5c40\u914d\u7f6e setting/globalconfig.ini \u91cc\u9762\u7684 IMAGE_MATCH_NUMBER \u914d\u7f6e\u9879\u7684\u503c\uff0c\u9ed8\u8ba4IMAGE_MATCH_NUMBER = 1\uff0c\u5373\u91cd\u8bd5 1 \u6b21\uff1b find_image \u662f\u6846\u67b6\u63d0\u4f9b\u7684\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u51fd\u6570\u63a5\u53e3\uff0c\u8fd9\u4e2a\u51fd\u6570\u63d0\u4f9b\u4e86\u9690\u5f0f\u7b49\u5f85\u7684\u529f\u80fd\uff0c\u4e14\u5305\u542b\u4e0a\u9762\u4ecb\u7ecd\u7684 _match_image_by_opencv \u51fd\u6570\u7684\u6240\u6709\u529f\u80fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2","title":"2\u3001\u6c14\u6ce1\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u6c14\u6ce1\u8bc6\u522b\u6307\u7684\u662f\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\u8981\u5b9a\u4f4d\u7684\u5143\u7d20\u662f\u4e00\u4e9b\u4f1a\u6d88\u5931\u7684\u5c0f\u5f39\u7a97\uff0c\u8fd9\u7c7b\u573a\u666f\u5728\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\u5c31\u53ef\u80fd\u5b58\u5728\u4e0d\u7a33\u5b9a\u6027\uff0c\u6709\u53ef\u80fd\u56fe\u50cf\u8bc6\u522b\u7684\u65f6\u5019\u6c14\u6ce1\u5df2\u7ecf\u6d88\u5931\u4e86\uff0c\u4e5f\u6709\u53ef\u80fd\u6c14\u6ce1\u51fa\u73b0\u7684\u65f6\u95f4\u592a\u77ed\u4e86\uff0c\u4e0d\u5bb9\u6613\u6355\u6349\u5230\uff0c\u5c31\u50cf\u6c14\u6ce1\u4e00\u6837\uff0c\u51fa\u73b0\u4e00\u4e0b\u5c31\u6d88\u5931\uff0c\u56e0\u6b64\u6211\u4eec\u5f62\u8c61\u7684\u79f0\u4e4b\u4e3a \u201c\u6c14\u6ce1\u8bc6\u522b\u201d\uff1b \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u4e3a\u4e86\u80fd\u7a33\u5b9a\u7684\u8bc6\u522b\u6c14\u6ce1\u7c7b\u573a\u666f\uff0c\u6211\u4eec\u91c7\u7528\u7684\u65b9\u6848\u662f\uff1a \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\uff08\u5305\u542b\u6c14\u6ce1\u4ece\u51fa\u73b0\u5230\u6d88\u5931\uff09\uff0c\u4e0d\u505c\u7684\u622a\u53d6\u8fd9\u6bb5\u65f6\u95f4\u5185\u7684\u5927\u56fe\uff0c\u4ee5\u6b64\u786e\u4fdd\u5728\u622a\u53d6\u7684\u4e00\u5806\u56fe\u7247\u4e2d\uff0c\u80af\u5b9a\u6709\u81f3\u5c11\u4e00\u5f20\u56fe\u7247\u80fd\u6355\u6349\u5230\u6c14\u6ce1\uff0c\u6700\u540e\u518d\u5bf9\u8fd9\u4e00\u5806\u56fe\u7247\u9010\u4e2a\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def get_during(\ncls,\nimage_path: str,\nscreen_time: [float, int],\nrate: float = None,\npause: [int, float] = None,\nmax_range: int = 10000\n):\n\"\"\"\n \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u622a\u56fe\u591a\u5f20\u56fe\u7247\u8fdb\u884c\u8bc6\u522b\uff0c\u5176\u4e2d\u6709\u4e00\u5f20\u56fe\u7247\u8bc6\u522b\u6210\u529f\u5373\u8fd4\u56de\u7ed3\u679c;\n \u9002\u7528\u4e8e\u6c14\u6ce1\u7c7b\u7684\u65ad\u8a00\uff0c\u6bd4\u5982\u6c14\u6ce1\u57281\u79d2\u5185\u6d88\u5931\uff0c\u5982\u679c\u7528\u5e38\u89c4\u7684\u56fe\u50cf\u8bc6\u522b\u5219\u6709\u53ef\u80fd\u65e0\u6cd5\u8bc6\u522b\u5230\uff1b\n :param image_path: \u8981\u8bc6\u522b\u7684\u6a21\u677f\u56fe\u7247\uff1b\n :param screen_time: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff1b\n :param rate: \u8bc6\u522b\u7387\uff1b\n :param pause: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u4e0d\u95f4\u9694\uff1b\n :param max_range: \u622a\u56fe\u7684\u6700\u5927\u6b21\u6570\uff0c\u8fd9\u662f\u4e00\u4e2a\u9884\u8bbe\u503c\uff0c\u4e00\u822c\u60c5\u51b5\u4e0b\u4e0d\u6d89\u53ca\u4fee\u6539\uff1b\n \"\"\"\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001screen_time \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5728\u6b64\u65f6\u95f4\u5185\u4f1a\u4e0d\u65ad\u7684\u8fdb\u884c\u622a\u56fe\u64cd\u4f5c\uff0c\u5c31\u50cf\u5f55\u5236\u89c6\u9891\u4e00\u6837\uff1b 2\u3001pause \u6bcf\u6b21\u622a\u53d6\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u4e00\u523b\u4e0d\u505c\u7684\u622a\u56fe\uff0c\u5982\u679c\u4f60\u60f3\u6bcf\u6b21\u622a\u56fe\u5b58\u5728\u4e00\u4e9b\u95f4\u9694\u65f6\u95f4\u4f20\u5165\u5bf9\u5e94\u7684\u65f6\u95f4\u95f4\u9694\u5373\u53ef\uff0c\u5355\u4f4d\u662f\u79d2\uff0c\u6bd4\u5982\uff1apause = 0.03\uff0c\u8868\u793a 30 ms\uff0c\u76f8\u5f53\u4e8e\u5e27\u7387\u4e3a 30 \u5e27\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-opencv","title":"3\u3001\u4e0d\u4f9d\u8d56 OpenCV \u7684\u56fe\u50cf\u8bc6\u522b\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31","title":"3.1\u3001\u81ea\u7814\u56fe\u50cf\u8bc6\u522b\u6280\u672f","text":"\u3010\u539f\u7406\u3011 \u4e3a\u4e86\u5b9e\u73b0\u8bc6\u522b\u56fe\u50cf\u7684\u76ee\u7684\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u5c06\u56fe\u7247\u7684\u6bcf\u4e2a\u50cf\u7d20\u7684RGB\u503c\uff0c\u4e0e\u6574\u4e2a\u5c4f\u5e55\u4e2d\u7684RGB\u8fdb\u884c\u5bf9\u6bd4\uff0c\u5982\u679c\u5c0f\u56fe\u4e0a\u7684RGB\u503c\u4e0e\u5bf9\u5e94\u5927\u56fe\u4f4d\u7f6e\u7684RGB\u90fd\u76f8\u7b49\uff0c\u5219\u5339\u914d\u6210\u529f\uff0c\u5373\u53ef\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u70b9\u3002 1\u3001\u8bfb\u53d6\u5c0f\u56fe\u548c\u5927\u56fe\u7684RGB\u503c \uff081\uff09\u5c0f\u56fe\u7684RGB\u503c small_data = small_pic.load() # load()\u4f1a\u5c06\u56fe\u7247\u7684RGB\u503c\u83b7\u53d6\u5230\uff0c\u6570\u636e\u683c\u5f0f\u4e3a\u4e00\u4e2a\u4e8c\u7ef4\u5217\u8868\uff0c\u8d4b\u503c\u7ed9\u4e00\u4e2a\u53d8\u91cfsmall_data\u3002\n \uff082\uff09\u5927\u56fe\u7684RGB\u503c big_data = big_pic.load()\n 2\u3001\u5c06\u5c0f\u56fe\u4e0e\u5927\u56fe\u7684RGB\u503c\u8fdb\u884c\u5339\u914d \uff081\uff09\u5339\u914d\u4ece\u5927\u56fe\u7684\u5750\u6807\uff080\uff0c0\uff09\u5f00\u59cb\u5339\u914d\uff0c\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff082\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\uff080\uff0c0\uff09\u5bf9\u5e94\u7684\u6240\u6709\u5c0f\u56fe\u7684RGB\u503c\u4e0d\u76f8\u7b49\uff0c\u5219\u79fb\u52a8\u5230\u4e0b\u4e00\u4e2a\u5750\u6807\u70b9\uff081\uff0c0\uff09\uff0c\u540c\u6837\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff083\uff09\u6309\u7167\u8fd9\u6837\u7684\u89c4\u5f8b\u5c06\u8fd9\u4e00\u884c\u6bcf\u79fb\u52a8\u4e00\u4e2a\u5750\u6807\u70b9\uff0c\u90fd\u5c06\u5c0f\u56fe\u6240\u6709\u7684RGB\u4e0e\u5bf9\u5e94\u5927\u56fe\u7684\u503c\u8fdb\u884c\u5339\u914d\uff1b \uff084\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\u5176\u4e2d\u4e00\u4e2a\u5750\u6807\u70b9\u4e0a\u5339\u914d\u5230\u4e86\u5c0f\u56fe\u7684\u6240\u6709RGB\u503c\uff0c\u5219\u6b64\u65f6\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\u70b9\uff1b \uff085\uff09\u5982\u679c\u5339\u914d\u4e86\u5927\u56fe\u6240\u6709\u7684\u5750\u6807\u70b9\uff0c\u90fd\u6ca1\u6709\u5339\u914d\u5230\uff0c\u5219\u8bf4\u660e\u5927\u56fe\u4e2d\u4e0d\u5b58\u5728\u5c0f\u56fe\uff0c\u5339\u914d\u5931\u8d25\uff1b \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 class ImageRgb:\n@staticmethod\ndef _check_match(_x, _y, small, bdata, sdata, rate):\n\"\"\"\n Matching degree of small graph and large graph matching\n \"\"\"\n@staticmethod\ndef _pre_random_point(small):\n\"\"\"\n Pre matching, take 10-20 points at random each time,\n and take coordinates randomly in the small graph\n \"\"\"\n@staticmethod\ndef _pre_random_match(_x, _y, point_list, bdata, sdata, rate):\n\"\"\"\n In the small graph, several points are randomly\n selected for matching, and the matching degree is\n also set for the random points\n \"\"\"\n@classmethod\ndef match_image_by_rgb(cls, image_name=None, image_path=None, rate=0.9):\n\"\"\"\n By comparing the RGB values of the small image with the large\n image on the screen, the coordinates of the small image on\n the screen are returned.\n \"\"\"\n \u901a\u8fc7 match_image_by_rgb() \u8fd9\u4e2a\u51fd\u6570\uff0c\u4f20\u5165\u76ee\u6807\u5c0f\u56fe\u7684\u6587\u4ef6\u540d\u79f0\uff0c\u5373\u53ef\u8fd4\u56de\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u3002 \u6709\u540c\u5b66\u8981\u95ee\u4e86\uff0c\u6709 OpenCV \u5e72\u561b\u4e0d\u7528\uff0c\u6709\u5fc5\u8981\u81ea\u5df1\u5b9e\u73b0\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u529f\u80fd\u5417\uff0c\u4f60\u4eec\u662f\u4e0d\u662f\u95f2\u7684\u554a\uff1f \u8fd9\u4e48\u95ee\u7684\u8bdd\uff0c\u5c0f\u4e86\uff0c\u683c\u5c40\u5c0f\u4e86\uff1b\u6211\u4eec\u81ea\u5df1\u5b9e\u73b0\u4e3b\u8981\u6709\u51e0\u65b9\u9762\u539f\u56e0\uff1a \u51cf\u5c11\u73af\u5883\u4f9d\u8d56\uff0c\u5373\u4e0d\u7528\u5b89\u88c5 OpenCV\uff0c\u6211\u4eec\u4e5f\u80fd\u5b9e\u73b0\u5176\u529f\u80fd\uff0c\u73af\u5883\u4f9d\u8d56\u8fd9\u5757\u540e\u9762\u4f1a\u5355\u72ec\u8be6\u7ec6\u8bb2\uff0c\u51cf\u5c11\u73af\u5883\u4f9d\u8d56\u5bf9\u4e8e\u4efb\u4f55\u8f6f\u4ef6\u5de5\u7a0b\u90fd\u975e\u5e38\u91cd\u8981\uff1b OpenCV \u5728\u5176\u4ed6\u56fd\u4ea7 CPU \u67b6\u6784\u4e0a\u5b89\u88c5\u5e76\u4e0d\u80fd\u4fdd\u8bc1100%\u6210\u529f\uff0c\u751a\u81f3\u6709\u6ca1\u6709\u53ef\u80fd\u5728\u4e00\u4e9b\u67b6\u6784\u4e0a\u538b\u6839\u513f\u5c31\u4e0d\u80fd\u5b89\u88c5\u4f7f\u7528 OpenCV \uff1f \u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 OpenCV \uff1f\u5c31\u50cf\u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 Windows \u5462\uff1f\u8fd9\u4e9b\u95ee\u9898\u503c\u5f97\u601d\u8003\u3002 \u5f53\u7136\uff0c\u6211\u4eec\u627f\u8ba4\u8fd9\u5957\u65b9\u6848\uff0c\u867d\u7136\u8bc6\u522b\u51c6\u786e\u7387\u6ca1\u95ee\u9898\uff0c\u4f46\u5728\u8bc6\u522b\u6548\u7387\u4e0a\u8fd8\u6ca1\u6709\u8fbe\u5230 OpenCV \u6a21\u677f\u5339\u914d\u7684\u6548\u679c\uff0c\u6211\u4eec\u7684\u65b9\u6848\u6bcf\u6b21\u8bc6\u522b\u5728 1.5s \u5de6\u53f3\uff0c\u800c OpenCV \u5728 1s \u5de6\u53f3\uff1b \u6574\u4f53\u8bc6\u522b\u6548\u679c\u6765\u8bb2\uff0c\u6211\u8ba4\u4e3a\u8fd8\u662f\u53ef\u4ee5\u63a5\u53d7\u7684\uff0c\u4e5f\u5e0c\u671b\u6709\u5fd7\u4e4b\u58eb\u80fd\u4e00\u8d77\u4f18\u5316\u6b64\u65b9\u6848\uff0c\u4e00\u8d77\u6280\u672f\u62a5\u56fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32-rpc","title":"3.2\u3001\u57fa\u4e8e RPC \u670d\u52a1\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b","text":"\u5728\u8fdc\u7a0b\u670d\u52a1\u5668\u4e0a\u90e8\u7f72 OpenCV \u7684\u73af\u5883\uff0c\u5e76\u5c06\u5176\u90e8\u7f72\u4e3a RPC \u670d\u52a1\uff0c\u6d4b\u8bd5\u673a\u4e0a\u4e0d\u7528\u5b89\u88c5 OpenCV \u4f9d\u8d56\uff0c\u800c\u662f\u901a\u8fc7\u8bf7\u6c42 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u3010\u539f\u7406\u3011 \u6d4b\u8bd5\u673a\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u56fe\u7247\u4ee5\u53ca\u6a21\u677f\u56fe\u7247\uff0c\u53d1\u9001\u7ed9 RPC \u670d\u52a1\u7aef\uff0c\u670d\u52a1\u7aef\u62ff\u5230\u4e24\u5f20\u56fe\u7247\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u6700\u540e\u5c06\u8bc6\u522b\u7ed3\u679c\u8fd4\u56de\u7ed9\u6d4b\u8bd5\u673a\uff1b \u8981\u7279\u6b8a\u8bf4\u660e\u7684\u662f\uff1a RPC \u662f\u4e00\u79cd\u534f\u8bae\uff0c\u8bb8\u591a\u8bed\u8a00\u90fd\u662f\u652f\u6301\u7684\uff0c\u6bd4\u5982\u8bf4\u670d\u52a1\u7aef\u4e5f\u53ef\u4ee5\u7528 C++ \u6765\u5b9e\u73b0\uff0c\u5ba2\u6237\u7aef\u4f7f\u7528 Python \u4e5f\u662f\u53ef\u4ee5\u8c03\u7528\u7684\u3002 \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 \u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nimport cv2 as cv\nimport numpy as np\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\nif __name__ == \"__main__\":\nserver = ThreadXMLRPCServer((\"x.x.x.x\", 8889), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(match_image_by_opencv, \"match_image_by_opencv\")\nserver.serve_forever()\n \u8fd9\u6837\uff0c\u6211\u4eec\u57fa\u4e8e Python \u6807\u51c6\u5e93 xmlrpc \u642d\u5efa\u4e86\u4e00\u4e2a RPC \u670d\u52a1\u5668\uff0c\u6ce8\u518c\u4e86 image_put \u548c match_image_by_opencv \u4e24\u4e2a\u529f\u80fd\u63a5\u53e3\uff0c\u5728\u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u901a\u8fc7 IP \u548c\u7aef\u53e3\u8fdb\u884c RPC \u8bf7\u6c42\uff1b \u5ba2\u6237\u7aef\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from xmlrpc.client import Binary\nfrom xmlrpc.client import ServerProxy\nserver = ServerProxy(GlobalConfig.OPENCV_SERVER_HOST, allow_none=True)\nscreen_rb = open(screen, \"rb\")\ntemplate_rb = open(template_path, \"rb\")\ntry:\nscreen_path = server.image_put(Binary(screen_rb.read()))\nscreen_rb.close()\ntpl_path = server.image_put(Binary(template_rb.read()))\ntemplate_rb.close()\nreturn server.match_image_by_opencv(\ntpl_path, screen_path, rate, multiple\n)\nexcept OSError as exc:\nraise EnvironmentError(\nf\"RPC\u670d\u52a1\u5668\u94fe\u63a5\u5931\u8d25. {GlobalConfig.OPENCV_SERVER_HOST}\"\n) from exc\n \u901a\u8fc7\u8fd4\u56de server.match_image_by_opencv \u5c31\u83b7\u53d6\u4e86\u5728\u670d\u52a1\u7aef\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4","title":"4\u3001\u53f3\u952e\u83dc\u5355\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41","title":"4.1\u3001\u53f3\u952e\u83dc\u5355\u5b9a\u4f4d\u7684\u65b9\u6848\u53ca\u95ee\u9898","text":"\u53f3\u952e\u83dc\u5355\u7684\u5143\u7d20\u5b9a\u4f4d\u662f\u4e00\u4e2a\u96be\u70b9\uff0c\u8fc7\u53bb\u6211\u4eec\u8c03\u7814\u548c\u4f7f\u7528\u8fc7\u7684\u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u65b9\u6cd5\u6709 4 \u79cd\uff1a \u7b2c\u4e00\u79cd\uff1a\u6b65\u957f\u64cd\u4f5c\u6cd5 \u5728\u53f3\u952e\u83dc\u5355\u547c\u51fa\u6765\u4e4b\u540e\uff0c\u901a\u8fc7\u952e\u76d8\u7684 up\u3001down \u6309\u952e\uff0c\u8fdb\u884c\u9009\u62e9\u83dc\u5355\u9009\u62e9\uff0c\u9009\u4e2d\u76ee\u6807\u4e4b\u540e enter \u5373\u53ef\uff1b\u6bd4\u5982\uff1a\u5728\u684c\u9762\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\uff0c\u6309 1 \u6b21 down \uff0c\u4f1a\u51fa\u73b0\u4e0b\u56fe\uff1a \u7ee7\u7eed\u518d\u6309 2 \u6b21 down\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u518d\u6309 enter\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u5982\u6b64\uff0c\u201c\u6392\u5e8f\u65b9\u5f0f\u201d\u7684\u6b65\u957f\u4e3a 3\uff1b\u901a\u8fc7\u4f7f\u7528\u952e\u76d8\u4e0a\u4e0b\u952e\uff0c\u5c31\u5b9e\u73b0\u4e86\u5bf9\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\uff1b \u4f46\u662f\uff0c\u8fd9\u79cd\u65b9\u5f0f\u6709\u4e2a\u5f88\u70e6\u4eba\u7684\u95ee\u9898\uff0c\u5c31\u662f\u53f3\u952e\u83dc\u5355\u7684\u9009\u9879\u4f4d\u7f6e\u4e0d\u53ef\u80fd\u4e00\u76f4\u4e0d\u53d8\uff0c\u5728\u9700\u6c42\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\uff0c\u83dc\u5355\u9009\u9879\u7684\u53d8\u5316\u662f\u5f88\u5927\u7684\uff0c\u751a\u81f3\u6709\u4e9b\u5e94\u7528\u652f\u6301\u81ea\u5b9a\u4e49\u83dc\u5355\uff0c\u6bd4\u5982\u6587\u7ba1\u53f3\u952e\u83dc\u5355\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff1b \u4e5f\u5c31\u662f\u8bf4\u4f60\u5f97\u7ecf\u5e38\u53bb\u7ef4\u62a4\u83dc\u5355\u9009\u9879\u7684\u6b65\u957f\uff0c\u4e00\u4e2a\u9009\u9879\u73b0\u5728\u7684\u6b65\u957f\u662f 3\uff0c\u4e0b\u4e2a\u8fed\u4ee3\u53ef\u80fd\u5c31\u662f 4 \u6216\u8005 5\u3002 \u7b2c\u4e8c\u79cd\uff1a\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u6cd5 \u628a\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5355\u72ec\u622a\u56fe\u4fdd\u5b58\uff0c\u56fe\u7247\u4e2d\u4ec5\u5305\u542b\u4e00\u4e2a\u83dc\u5355\u9009\u9879\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u8fd9\u6837\uff0c\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5c31\u53ef\u4ee5\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u65b9\u5f0f\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u8fd9\u79cd\u65b9\u5f0f\u4e0d\u7528\u62c5\u5fc3\u83dc\u5355\u9009\u9879\u7684\u987a\u5e8f\u6216\u4f4d\u7f6e\uff0c\u4f46\u662f\u9700\u8981\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff0c\u4e14\u5bb9\u6613\u53d7\u5230\u5b57\u4f53 UI \u53d8\u66f4\u7c7b\u9700\u6c42\u7684\u5f71\u54cd\uff0c\u6bd4\u5982\uff1a\u5b57\u4f53\u5927\u5c0f\u3001\u5b57\u4f53\u95f4\u8ddd\u7b49\u7b49\u9700\u6c42\u53d8\u66f4\u90fd\u4f1a\u5f71\u54cd\uff0c\u6bcf\u6b21\u53d8\u66f4\u4e4b\u540e\u5c31\u9700\u8981\u8fdb\u884c\u5927\u91cf\u56fe\u7247\u8d44\u6e90\u7684\u91cd\u65b0\u622a\u56fe\u66ff\u6362\uff0c\u662f\u4e2a\u6bd4\u8f83\u9ebb\u70e6\u7684\u4e8b\u60c5\uff1b \u7b2c\u4e09\u79cd\uff1a\u76f8\u5bf9\u4f4d\u79fb\u6cd5 \u9f20\u6807\u70b9\u51fb\u53f3\u952e\u7684\u65f6\u5019\uff0c\u9f20\u6807\u7684\u5f53\u524d\u5750\u6807\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u7684\uff0c\u83dc\u5355\u9009\u9879\u7684\u5bbd\uff08 w \uff09\u4e00\u822c\u662f\u56fa\u5b9a\u7684\uff0c\u53d8\u5316\u7684\u662f\u83dc\u5355\u7684\u957f\u5ea6\uff08 h \uff09\uff0c\u53ef\u4ee5\u901a\u8fc7\u67d0\u4e2a\u9009\u9879\u76f8\u5bf9\u4e8e\u9f20\u6807\u7684\u8ddd\u79bb\u5728\u786e\u5b9a\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u901a\u8fc7\u7ef4\u62a4\u83dc\u5355\u9009\u9879\uff08\u76f8\u5bf9\u4f4d\u7f6e\uff09\u76f8\u5bf9\u4e8e\u9f20\u6807\u4f4d\u7f6e\u7684\u8ddd\u79bb\uff0c\u5373\u53ef\u8f7b\u677e\u8ba1\u7b97\u51fa\u83dc\u5355\u9009\u9879\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\u3002 \u4ece\u7406\u8bba\u4e0a\u6b64\u65b9\u6848\u662f\u53ef\u884c\u7684\uff0c\u4f46\u662f\u8fd9\u91cc\u4ecd\u7136\u5b58\u5728\u4e24\u4e2a\u4e25\u91cd\u7684\u95ee\u9898\uff1a \u83dc\u5355\u987a\u5e8f\u6539\u53d8\uff0c\u5bfc\u81f4\u76f8\u5bf9\u8ddd\u79bb\u6539\u53d8\uff0c\u800c\u4e14\u8ddd\u79bb\u662f\u901a\u8fc7\u50cf\u7d20\uff08px\uff09\u6765\u8868\u793a\u7684\uff0c\u4e0d\u60f3\u6b65\u957f\u90a3\u4e48\u53ea\u7ba1\uff0c\u6bcf\u6b21\u9700\u8981\u53bb\u91cf\u4e00\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u70b9\u9ebb\u70e6\uff1b \u9f20\u6807\u5728\u684c\u9762\u4e0d\u540c\u4f4d\u7f6e\u70b9\u51fb\u53f3\u952e\uff0c\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u4f4d\u7f6e\u662f\u4e0d\u540c\u7684\uff0c\u4e0a\u56fe\u7684\u83dc\u5355\u662f\u5728\u9f20\u6807\u7684\u5de6\u4e0b\u65b9\uff0c\u5982\u679c\u4f60\u79fb\u52a8\u9f20\u6807\u5230\u5c4f\u5e55\u56db\u8fb9\uff0c\u4f60\u4f1a\u53d1\u73b0\uff0c\u53f3\u952e\u83dc\u5355\u53ef\u80fd\u51fa\u73b0\u5728\u9f20\u6807\u7684\u56db\u4e2a\u65b9\u5411\uff0c\u4e5f\u5c31\u662f\u8bf4\u4f60\u9700\u8981\u6839\u636e\u9f20\u6807\u7684\u4e0d\u540c\u4f4d\u7f6e\u6765\u5224\u65ad\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u65b9\u5411\uff0c\u800c\u4e0d\u540c\u7684\u65b9\u5411\u4e0a\u8ba1\u7b97\u65b9\u6cd5\u662f\u4e0d\u540c\u7684\uff0c\u6bd4\u5982\uff1a\u53f3\u952e\u83dc\u5355\u5728\u9f20\u6807\u7684\u5de6\u4e0a\uff0c\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\u8ba1\u7b97\u65b9\u6cd5\u4e3a\uff08x - w / 2\uff0c y - h\uff09\uff0c\u8fd9\u6837\u7ef4\u62a4\u8d77\u6765\u53ef\u4ee5\u8bf4\u975e\u5e38\u590d\u6742\uff1b \u57fa\u4e8e\u4ee5\u4e0a\u4e24\u4e2a\u539f\u56e0\uff0c\u6211\u4eec\u5e76\u4e0d\u63a8\u8350\u8fd9\u79cd\u64cd\u4f5c\u65b9\u6848\u3002 \u7b2c\u56db\u79cd\uff1a\u5c5e\u6027\u5b9a\u4f4d \u6709\u540c\u5b66\u8bf4\u5e72\u561b\u4e0d\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u5462\uff0c\u5176\u5b9e\uff0c\u6211\u4eec\u6700\u5f00\u59cb\u60f3\u5230\u7684\u65b9\u6848\u5c31\u662f\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\uff0c\u4f46\u662f\u5728\u5c5e\u6027\u7684 DOM \u6811\u91cc\u600e\u4e48\u4e5f\u627e\u4e0d\u5230\uff0c\u65e0\u6cd5\u5b9a\u4f4d\u5230\uff0c\u6211\u4eec\u4e5f\u8054\u5408\u7814\u53d1\u540c\u5b66\u4e00\u8d77\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u4f46\u6700\u7ec8\u8fd8\u662f\u6ca1\u80fd\u89e3\u51b3\uff0c\u975e\u5e38\u9057\u61be\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42","title":"4.2\u3001\u6700\u65b0\u7684\u53f3\u952e\u83dc\u5355\u7ec8\u6781\u89e3\u51b3\u65b9\u6848","text":"\u7531\u4e8e\u53f3\u952e\u83dc\u5355\u9009\u9879\u51e0\u4e4e\u90fd\u662f\u6587\u672c\uff0c\u90a3\u4e48\u901a\u8fc7 OCR \u8bc6\u522b\uff0c\u51e0\u4e4e\u662f\u6700\u4f18\u7684\u65b9\u6848\uff1a \u4e0d\u7528\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff1b \u4e0d\u4f1a\u53d7\u5230\u83dc\u5355\u9009\u9879\u987a\u5e8f\u6539\u53d8\u7684\u5f71\u54cd\uff1b \u4e0d\u4f1a\u53d7\u5230\u5b57\u4f53 UI \u53d8\u5316\u7684\u5f71\u54cd\uff1b \u5173\u4e8e OCR \u8bc6\u522b\u6211\u4eec\u5728\u540e\u9762\u4f1a\u8be6\u7ec6\u8bb2\u5230\uff0c\u672c\u7ae0\u8282\u4e3b\u8981\u8bb2\u57fa\u4e8e OCR \u8bc6\u522b\uff0c\u6211\u4eec\u5728\u53f3\u952e\u83dc\u5355\u8bc6\u522b\u4e0a\u7684\u7a81\u7834\u548c\u521b\u65b0\uff1b \u4f7f\u7528 OCR \u8bc6\u522b\u53f3\u952e\u83dc\u5355\u867d\u7136\u5df2\u7ecf\u5f88\u5b8c\u7f8e\u4e86\uff0c\u4f46\u662f\u5728\u4e00\u4e9b\u60c5\u51b5\u4e0b\u4ecd\u7136\u5b58\u5728\u4e00\u70b9\u95ee\u9898\uff0c\u5c31\u662f\u5c4f\u5e55\u4e2d\u51fa\u73b0\u591a\u4e2a\u548c\u83dc\u5355\u9009\u9879\u6587\u5b57\u76f8\u540c\u7684\u6587\u5b57\u65f6\uff0c\u6bd4\u5982\u4e0b\u9762\u8fd9\u79cd\u60c5\u51b5\uff1a \u5c4f\u5e55\u6070\u597d\u51fa\u73b0\u4e86\u4e24\u4e2a\u201c\u590d\u5236\u201d\uff0c\u6b64\u65f6\u8981\u5b9a\u4f4d\u5230\u83dc\u5355\u4e2d\u7684 \u201c\u590d\u5236\u201d\uff0c\u5c31\u9700\u8981\u8fdb\u4e00\u6b65\u505a\u6570\u636e\u5904\u7406\uff0c\u6bd4\u5982\uff1aOCR \u8fd4\u56de 2 \u4e2a\u201c\u590d\u5236\u201d\u7684\u5750\u6807\uff0c\u7528\u4f8b\u91cc\u9762\u6765\u5224\u65ad\u7528\u54ea\u4e2a\uff0c\u4ece\u4e1a\u52a1\u4e0a\u5c06\u5904\u7406\u8d77\u6765\u6bd4\u8f83\u9ebb\u70e6\uff0c\u56e0\u4e3a\u4f60\u5f97\u660e\u786e\u77e5\u9053\u83dc\u5355\u5728\u5de6\u8fb9\u8fd8\u662f\u53f3\u8fb9\uff0c\u7136\u540e\u8fd9\u672c\u8eab\u5c31\u662f\u4e0d\u786e\u5b9a\u7684\uff1b \u600e\u4e48\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u5462\uff0c\u8fd9\u5c31\u8981\u8bf4\u9053\u672c\u7ae0\u7684\u4e3b\u9898\uff1a\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b\u3002 \u3010\u539f\u7406\u3011 \u5728\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u524d\u622a\u4e00\u5f20\u56fe\uff0c\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\u518d\u622a\u53d6\u4e00\u5f20\u56fe\uff0c\u4e24\u5f20\u56fe\u552f\u4e00\u53d8\u5316\u7684\u5c31\u662f\u53f3\u952e\u83dc\u5355\uff0c\u5c06\u5176\u4ed6\u76f8\u540c\u7684\u5730\u65b9\u90fd\u5c4f\u853d\u6389\uff0c\u53ea\u7559\u4e0b\u83dc\u5355\u754c\u9762\uff0c\u5982\u6b64\u5373\u53ef\u6d88\u9664\u5e72\u6270\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u5c06\u4e24\u79cd\u56fe\u505a\u524d\u540e\u5bf9\u6bd4\u63d0\u53d6\u53ef\u4ee5\u5f97\u5230\u8fd9\u6837\u7684\u56fe\uff1a \u4f60\u770b\uff0c\u901a\u8fc7\u524d\u540e\u56fe\u7247\u7684\u5bf9\u6bd4\uff0c\u5c06\u76f8\u540c\u7684\u90e8\u5206\u7ed9\u6d88\u9664\u6389\uff0c\u518d\u8fdb\u884c OCR \u8bc6\u522b\uff0c\u8fd9\u6837\u5c31\u4e0d\u4f1a\u6709\u5e72\u6270\u4e86\uff1b \u4ee3\u7801\u5b9e\u73b0\u8bf7\u67e5\u770b src/filter_image.py \uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def filter_image(action):\n\"\"\"\n \u5bf9\u6bd4\u52a8\u4f5c\u524d\u540e\u4e24\u5f20\u56fe\u7247\uff0c\u63d0\u53d6\u4e0d\u540c\u7684\u90e8\u5206\u751f\u6210\u4e00\u5f20\u65b0\u7684\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u65b0\u56fe\u7247\u7684\u8def\u5f84\n :param action: \u52a8\u4f5c\u51fd\u6570\u7684\u51fd\u6570\u5bf9\u8c61\n :return: \u65b0\u56fe\u7247\u7684\u8def\u5f84\n \"\"\"\n action \u662f\u9f20\u6807\u4e8b\u4ef6\uff0c\u56e0\u4e3a\u6b64\u7c7b\u573a\u666f\u4e0d\u4ec5\u4ec5\u5728\u53f3\u952e\u5b58\u5728\uff0c\u5355\u51fb\u3001\u53cc\u51fb\u7b49\u7b49\uff0c\u53ea\u8981\u64cd\u4f5c\u524d\u540e\u540e\u53d8\u5316\u7684\u90fd\u53ef\u4ee5\uff1a from src.mouse_key import MouseKey\naction = (\nMouseKey.click,\nMouseKey.right_click,\nMouseKey.double_click,\nMouseKey.move_to,\n)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5","title":"5\u3001\u52a8\u6001\u56fe\u50cf\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5728\u684c\u9762\u58c1\u7eb8\u5207\u6362\uff0c\u6216\u770b\u56fe\u3001\u76f8\u518c\u5207\u6362\u56fe\u7247\u7c7b\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u7531\u4e8e\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u662f\u4e0d\u56fa\u5b9a\u7684\uff08\u4e0d\u540c\u7248\u672c\u7684\u7cfb\u7edf\u58c1\u7eb8\u4e0d\u540c\u3001\u58c1\u7eb8\u987a\u5e8f\u4e0d\u540c\uff0c\u770b\u56fe\u76f8\u518c\u5728\u56fe\u7247\u8d44\u6e90\u4e0d\u4e00\u5b9a\u56fa\u5b9a\uff09\uff0c\u90a3\u4e48\u5728\u6d4b\u8bd5\u5207\u6362\u58c1\u7eb8\u6216\u8005\u5207\u6362\u56fe\u7247\u7684\u573a\u666f\u65f6\u5c31\u4f1a\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u4f60\u4e0d\u77e5\u9053\u9884\u671f\u662f\u5565\uff0c\u7528\u4f8b\u64cd\u4f5c\u52a8\u6001\u7684\uff0c\u4e5f\u662f\u6781\u4e0d\u7a33\u5b9a\u3002 \u3010\u539f\u7406\u3011 \u5728\u5207\u6362\u56fe\u7247\u4e4b\u524d\u622a\u56fe\u4fdd\u5b58\u5e76\u8fd4\u56de\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u6b21\u8bc6\u522b\u8fd9\u5f20\u56fe\u7247\uff0c\u5982\u679c\u4e0d\u5b58\u5728\uff0c\u8bf4\u660e\u56fe\u7247\u5df2\u7ecf\u5207\u6362\u4e86\uff1b \u793a\u610f\u56fe\uff1a \u8fd9\u6837\uff0c\u6211\u4eec\u622a\u53d6\u4e86\u5f53\u524d\u56fe\u7247\u4e2d\u6bd4\u8f83\u6709\u4ee3\u8868\u6027\u7684\u4f4d\u7f6e\uff08\u4e00\u53ea\u9e1f\uff09\uff0c\u5728\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u7528\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1a \u6211\u4eec\u518d\u62ff\u7740\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd9\u6837\u5728\u5f53\u524d\u56fe\u7247\u4e2d\uff0c\u5c31\u4e0d\u80fd\u627e\u5230\u8fd9\u53ea\u9e1f\u4e86\uff0c\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u662f False\uff0c\u90a3\u4e48\u4e5f\u5c31\u53ef\u4ee5\u5224\u65ad\u56fe\u7247\u5207\u6362\u662f\u6210\u529f\u7684\u3002 \u4ee3\u7801\u793a\u610f\uff1a def save_temporary_picture(_x: int, _y: int, width: int, height: int):\n\"\"\"\n \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u56fe\u7247\u8def\u5f84\n :param x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n :param y: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n :param width: \u5bbd\u5ea6\n :param height: \u9ad8\u5ea6\n :return: \u56fe\u7247\u8def\u5f84\n \"\"\"\n \u6b64\u51fd\u6570\u7528\u4e8e\u5728\u64cd\u4f5c\u4e4b\u524d\u622a\u56fe\u4e00\u5f20\u4e34\u65f6\u56fe\u7247\uff0c\u8fd4\u56de\u56fe\u7247\u8def\u5f84\uff0c\u6700\u540e\u5728\u65ad\u8a00\u7684\u65f6\u5019\u518d\u5c06\u56fe\u7247\u8def\u5f84\u4f5c\u4e3a\u53c2\u6570\u4f20\u5165\u65ad\u8a00\u8bed\u53e5\u5373\u53ef\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ui","title":"\u4e09\u3001\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_1","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u662f\u6211\u4eec\u81ea\u7814\u7684\u4e00\u79cd\u4f7f\u7528\u7b80\u5355\uff0c\u4e14\u6548\u7387\u6781\u9ad8\u3001\u7a33\u5b9a\u6027\u597d\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u57fa\u4e8e\u5143\u7d20\u6309\u94ae\u5728\u5e94\u7528\u4e2d\u7684\u76f8\u5bf9\u4f4d\u7f6e\uff0c\u52a8\u6001\u83b7\u53d6\u5143\u7d20\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff0c\u9002\u7528\u4e8e\u5404\u79cd\u5c4f\u5e55\u5206\u8fa8\u7387\uff08\u5305\u62ec\u9ad8\u5206\u5c4f\u3001\u5bbd\u5c4f\u3001\u5e26\u9c7c\u5c4f\uff09\uff0c\u5f53\u5143\u7d20\u6309\u94ae\u4f4d\u7f6e\u76f8\u5bf9\u4e8e\u5e94\u7528\u754c\u9762\u4f4d\u7f6e\u53d1\u751f\u4fee\u6539\u4e4b\u540e\uff0c\u53ea\u9700\u8981\u6839\u636e UI \u8bbe\u8ba1\u56fe\u4e0a\u7684\u6e90\u6570\u636e\u4fee\u6539\u5bf9\u5e94\u5750\u6807\u6570\u636e\u5c31\u597d\uff0c\u7ef4\u62a4\u975e\u5e38\u7684\u65b9\u4fbf\u3002 \u6b64\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u9002\u7528\u4e8e\u4e00\u4e9b\u5143\u7d20\u4f4d\u7f6e\u76f8\u5bf9\u4e0e\u5e94\u7528\u754c\u9762\u6bd4\u8f83\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u97f3\u4e50\uff0899% \u7684\u5143\u7d20\u5b9a\u4f4d\u91c7\u7528\u8fd9\u79cd\uff0c\u6548\u679c\u975e\u5e38\u597d\uff09\uff0c\u4e0d\u9002\u7528\u4e8e\u754c\u9762\u4e0d\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u622a\u56fe\u5f55\u5c4f\uff0c\u5f88\u660e\u663e\u4e0d\u9002\u7528\u4e8e\u8fd9\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u3002\u8fd9\u79cd\u5168\u65b0\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u6709\u5b83\u7684\u9002\u7528\u6761\u4ef6\uff0c\u5982\u679c\u4f60\u53d1\u73b0\u4f7f\u7528\u5e38\u89c4\u7684\uff08\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u5b9a\u4f4d\uff09\u4e0d\u597d\u505a\u65f6\uff0c\u4e0d\u59a8\u8003\u8651\u4f7f\u7528\u8fd9\u79cd\uff0c\u5176\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff0c\u5e76\u4e14\u8fc5\u901f\u7231\u4e0a\u4ed6\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_1","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5728 UI \u8bbe\u8ba1\u56fe\u4e2d\u6211\u4eec\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u8fb9\u6846\u7684\u8ddd\u79bb\u7684\uff0c\u7136\u540e\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u6280\u672f\u624b\u6bb5\u83b7\u53d6\u5230\u5e94\u7528\u754c\u9762\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u53ca\u5e94\u7528\u7a97\u53e3\u7684\u5927\u5c0f\uff0c\u793a\u610f\u56fe\u5982\u4e0b\uff1a \uff08x1, y1\uff09\u4e3a\u5e94\u7528\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\uff1b\uff08x2, y2\uff09\u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u5de6\u4e0a\u89d2\uff08x1, y1\uff09\u7684\u5750\u6807\uff0c\u90a3\u4e48\u5b9e\u9645\u4e0a\u3010\u64ad\u653e\u6240\u6709\u3011\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\u4e3a\uff1a\uff08 x1 + x2, y1 + y2 \uff09\uff1b \u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5927\u5c0f\uff08w2, h2\uff09\uff0c\u53ef\u4ee5\u4ece UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\uff1b \u5728 UI \u8bbe\u8ba1\u7a3f\u4e0a\u70b9\u51fb\u3010\u64ad\u653e\u6240\u6709\u3011\u56fe\u6807\uff0c\u7136\u540e\u79fb\u52a8\u9f20\u6807\u5c31\u5c31\u53ef\u4ee5\u770b\u5230\u4e0a\u56fe\u7684\u53c2\u8003\u7ebf\u53ca\u6570\u636e\uff1b \u6240\u4ee5\uff0c\u6211\u4eec\u53ef\u4ee5\u8f7b\u677e\u7684\u83b7\u53d6\u5230\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u4e2d\u5fc3\u5750\u6807\u4e3a\uff1a\uff08 x1 + x2 + (w2 / 2), y1 + y2 + ( h2 / 2) \uff09 \u8be6\u7ec6\u6e90\u4ee3\u7801\u8bf7\u67e5\u770b AT \u57fa\u7840\u6846\u67b6: src/button_center.py \u83b7\u53d6\u5e94\u7528\u7a97\u53e3\u7684\u4fe1\u606f \u4f7f\u7528 xdotool \u548c xwininfo \u83b7\u53d6\u5230\u5e94\u7528\u7a97\u53e3\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u5de6\u4e0a\u89d2\uff09\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a app_id = CmdCtl.run_cmd(f\"xdotool search --classname --onlyvisible {self.app_name}\"\n).split(\"\\n\")\napp_id_list = [int(_id) for _id in app_id if _id]\nreturn CmdCtl.run_cmd(f\"xwininfo -id {app_id_list[self.number]}\")\n \u4f7f\u7528\u6b63\u5219\u83b7\u53d6\u7a97\u53e3\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u83b7\u53d6\u914d\u7f6e \u8bfb ini \u914d\u7f6e\u6587\u4ef6\uff0c\u83b7\u53d6\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e0e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a conf = ConfigParser()\nconf.read(self.config_path)\ndirection = conf.get(btn_name, \"direction\")\nposition = [int(i.strip()) for i in conf.get(btn_name, \"location\").split(\",\")]\n \u8ba1\u7b97\u5143\u7d20\u6309\u94ae\u5750\u6807 \u6839\u636e\u5e94\u7528\u7a97\u53e3\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u5927\u5c0f\u3001\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u5927\u5c0f\uff0c\u4f7f\u7528\u4e00\u5b9a\u7684\u7b97\u6cd5\u5373\u53ef\u8ba1\u7b97\u51fa\u5143\u7d20\u6309\u94ae\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u4e2d\u5fc3\u5750\u6807\uff09\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3","title":"3\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u3010\u914d\u7f6e\u65b9\u6cd5\u3011 \u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u7684\u6570\u636e\u6e90\u662f\u5e94\u7528\u5e93\u4e2d\u7684 ui.ini \u914d\u7f6e\u6587\u4ef6\uff1a ;section\n[\u65b0\u5efa\u6b4c\u5355+] ;key = value\ndirection = left_top\nlocation = 180, 268, 21, 21\n section \u662f\u4f60\u6839\u636e\u5bf9\u5e94\u7684\u5143\u7d20\u6309\u94ae\u547d\u540d\uff0c\u4f60\u53ef\u4ee5\u4efb\u610f\u547d\u540d\uff0c\u4f46\u6700\u597d\u6709\u5177\u4f53\u542b\u4e49\uff0c\u4e14\u80fd\u660e\u786e\u8868\u793a\u8fd9\u4e2a\u5143\u7d20\u6309\u94ae\u7684\u540d\u79f0\uff1b\u7528\u4e2d\u62ec\u53f7\u62ec\u8d77\u6765\u5c31\u884c\uff0c\u6bd4\u5982\uff1a[\u65b0\u5efa\u6b4c\u5355+] \uff1b direction \u662f\u914d\u7f6e\u8be5\u5143\u7d20\u7684\u53c2\u8003\u7cfb\uff0c\u5206\u522b\u4e3a\uff1a left_top \u5de6\u4e0a\uff1b left_bottom \u5de6\u4e0b\uff1b right_top \u53f3\u4e0a\uff1b right_bottom \u53f3\u4e0b\uff1b \u53c2\u8003\u7cfb\u7684\u9009\u53d6\u6807\u51c6\uff1a\u62c9\u52a8\u6539\u53d8\u7a97\u53e3\u5927\u5c0f\u65f6\uff0c\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u53c2\u8003\u7cfb\u4f4d\u7f6e\u662f\u4e0d\u53d8\u7684\uff1b location \u662f\u8be5\u5143\u7d20\u6309\u94ae\u7684\u76f8\u5bf9\u4e0e\u53c2\u8003\u7cfb\u7684 x, y \u7684\u8ddd\u79bb\uff0c\u53ca\u5927\u5c0f(w, h)\uff0c\u8fd9\u56db\u4e2a\u6570\u636e\u53ef\u4ee5\u901a\u8fc7 UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\u6570\u636e\uff0c\u5728\u7f16\u8f91\u6a21\u5f0f\u4e0b\uff0c\u70b9\u51fb UI \u56fe\u4e0a\u7684\u6309\u94ae\uff0c\u53f3\u4fa7\u5c31\u4f1a\u51fa\u73b0\u8be5\u5143\u7d20\u6309\u94ae\u7684 x, y, w, h \u6570\u636e\u3002 \u5982\u679c UI \u56fe\u4e0a\u6ca1\u6709\u63d0\u4f9b\u4f60\u60f3\u8981\u7684\u5143\u7d20\u6570\u636e\uff0c\u4f60\u53ef\u4ee5\u76f4\u63a5\u5728\u7cfb\u7edf\u4e2d\u4f7f\u7528\u622a\u56fe\u5f55\u5c4f\u8fdb\u884c\u5c3a\u91cf\uff0c\u8fd9\u662f\u4e00\u79cd\u4e0d\u63a8\u8350\u4f46\u80fd\u7528\u7684\u65b9\u6cd5\u3002 \u3010\u8c03\u7528\u65b9\u6cd5\u3011 \u5728\u5e94\u7528\u5e93\u65b9\u6cd5\u5c42\u8fd9\u6837\u5199\uff1a def click_add_music_list_btn_in_music_by_ui(self):\n\"\"\"\u70b9\u51fb\u65b0\u5efa\u6b4c\u5355\u6309\u94ae\"\"\"\nself.click(*self.ui.btn_center(\"\u65b0\u5efa\u6b4c\u5355+\"))\n self.ui.btn_center() \u662f\u56fa\u5b9a\u5199\u6cd5\uff0c\u53c2\u6570\u5c31\u662f\u914d\u7f6e\u91cc\u9762\u7684 section \u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ocr","title":"\u56db\u3001OCR \u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_2","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 OCR \u65b9\u6848\u5927\u591a\u91c7\u7528\u8c37\u6b4c OCR\uff08Tesseract\uff09\u65b9\u6848\uff0c\u4f46\u662f\u5b83\u5bf9\u4e8e\u4e2d\u6587\u7684\u8bc6\u522b\u975e\u5e38\u5dee\uff0c\u7ecf\u8fc7\u5927\u91cf\u7684\u8c03\u7814\uff0c\u6211\u4eec\u4f7f\u7528 PaddleOCR\uff0c\u5b83\u662f\u4e00\u4e2a\u5f00\u6e90\u7684\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u8bc6\u522b\u5de5\u5177\uff0c\u4e5f\u662f PaddlePaddle \u6700\u6709\u540d\u7684\u4e00\u4e2a\u5f00\u6e90\u9879\u76ee\uff0c\u611f\u5174\u8da3\u7684\u53ef\u4ee5\u70b9\u8fd9\u91cc\u4e86\u89e3\uff0c\u591a\u7684\u4e0d\u8bf4\u4e86\uff0c\u4f60\u53ea\u9700\u8981\u77e5\u9053\u5b83\u5c31\u662f\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_2","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5b89\u88c5\u4ed6\u662f\u4e2a\u5f88\u9ebb\u70e6\u7684\u4e8b\u60c5\uff0c\u867d\u7136\u64cd\u4f5c\u5f88\u7b80\u5355\uff0c\u4f46\u5176\u5b9e\u5b89\u88c5\u5305\u6709\u70b9\u5927\uff0c\u56e0\u6b64\u6211\u4eec\u4e0d\u5e0c\u671b\u76f4\u63a5\u5728 env.sh \u4e2d\u52a0\u5165\u5b83\uff0c\u8fd9\u4f1a\u8ba9\u6574\u4e2a\u81ea\u52a8\u5316\u73af\u5883\u53d8\u5f97\u975e\u5e38\u81c3\u80bf\uff1b \u56e0\u6b64\uff0c\u6211\u4eec\u60f3\u5230\u5c06\u5b83\u505a\u6210\u4e00\u4e2a RPC \u670d\u52a1\u5728\u5176\u4ed6\u673a\u5668\u4e0a\u90e8\u7f72\uff0c\u6d4b\u8bd5\u673a\u901a\u8fc7\u8fdc\u7a0b\u8c03\u7528 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u4f7f\u7528\u5b83\uff1b RPC \u7684\u8c03\u7528\u903b\u8f91\uff1a \u8fd9\u6837\u6211\u4eec\u53ea\u9700\u8981\u5728\u670d\u52a1\u7aef\u90e8\u7f72\u597d OCR \u8bc6\u522b\u7684\u670d\u52a1\uff0c\u7136\u540e\u901a\u8fc7 RPC \u670d\u52a1\u5c06\u529f\u80fd\u63d0\u4f9b\u51fa\u6765\uff0c\u6846\u67b6\u91cc\u9762\u53ea\u9700\u8981\u8c03\u7528\u5bf9\u5e94\u7684 RPC \u63a5\u53e3\u5c31\u884c\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_1","title":"3\u3001\u4f7f\u7528\u8bf4\u660e","text":"\u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nfrom paddleocr import PaddleOCR\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef paddle_ocr(pic_path, lang):\n\"\"\"\n Paddleocr\u76ee\u524d\u652f\u6301\u7684\u591a\u8bed\u8a00\u8bed\u79cd\u53ef\u4ee5\u901a\u8fc7\u4fee\u6539lang\u53c2\u6570\u8fdb\u884c\u5207\u6362\n \u4f8b\u5982`ch`, `en`, `fr`, `german`, `korean`, `japan`\n :param file_name:\n :param lang:\n :return:\n \"\"\"\nif __name__ == \"__main__\":\nIP = popen(\"hostname -I\").read().split(\" \")[0]\nPORT = 8890\nSCREEN_CACHE = \"/tmp/screen.png\"\nserver = ThreadXMLRPCServer((IP, PORT), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(paddle_ocr, \"paddle_ocr\")\nprint(\"\u76d1\u542c\u5ba2\u6237\u7aef\u8bf7\u6c42\u3002\u3002\")\nserver.serve_forever()\n \u6846\u67b6\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from src import OCR\nOCR.ocr(*target_strings, picture_abspath=None, similarity=0.6, return_default=False, return_first=False, lang=\"ch\"):\n# \u901a\u8fc7 OCR \u8fdb\u884c\u8bc6\u522b\u3002\n# target_strings:\n# \u76ee\u6807\u5b57\u7b26,\u8bc6\u522b\u4e00\u4e2a\u5b57\u7b26\u4e32\u6216\u591a\u4e2a\u5b57\u7b26\u4e32,\u5e76\u8fd4\u56de\u5176\u5728\u56fe\u7247\u4e2d\u7684\u5750\u6807;\n# \u5982\u679c\u4e0d\u4f20\u53c2\uff0c\u8fd4\u56de\u56fe\u7247\u4e2d\u8bc6\u522b\u5230\u7684\u6240\u6709\u5b57\u7b26\u4e32\u3002\n# picture_abspath: \u8981\u8bc6\u522b\u7684\u56fe\u7247\u8def\u5f84\uff0c\u5982\u679c\u4e0d\u4f20\u9ed8\u8ba4\u622a\u53d6\u5168\u5c4f\u8bc6\u522b\u3002\n# similarity: \u5339\u914d\u5ea6\u3002\n# return_default: \u8fd4\u56de\u8bc6\u522b\u7684\u539f\u751f\u6570\u636e\u3002\n# return_first: \u53ea\u8fd4\u56de\u7b2c\u4e00\u4e2a,\u9ed8\u8ba4\u4e3a False,\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u6240\u6709\u6570\u636e\u3002\n# lang: `ch`, `en`, `fr`, `german`, `korean`, `japan`\n \u6b64\u65b9\u6848\u5728\u6846\u67b6\u5185\u6ca1\u6709\u5f15\u5165\u4efb\u4f55\u4e09\u65b9\u4f9d\u8d56\u5b8c\u5168\u91c7\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\uff0c\u800c\u4e14\u4f7f\u7528\u65b9\u6cd5\u975e\u5e38\u7b80\u5355\uff0c\u53ea\u9700\u8981\u901a\u8fc7 OCR.ocr() \u5373\u53ef\uff1b \u5bf9\u4e8e\u4e00\u4e9b\u6587\u6848\u7684\u573a\u666f\u975e\u5e38\u9002\u7528\uff0c\u6b64\u65b9\u6cd5\u76f4\u63a5\u8fd4\u56de\u5750\u6807\uff0c\u53ef\u4ee5\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u3002 \u4e5f\u53ef\u4ee5\u7528\u4e8e\u6587\u5b57\u65ad\u8a00\uff0c\u4ee3\u7801\u793a\u610f\uff1a def assert_ocr_exist(\n*args, picture_abspath=None, similarity=0.6, return_first=False, lang=\"ch\"\n):\n\"\"\"\u65ad\u8a00\u6587\u6848\u5b58\u5728\"\"\"\npic = None\nif picture_abspath is not None:\npic = picture_abspath + \".png\"\nres = OCR.ocr(\n*args,\npicture_abspath=pic,\nsimilarity=similarity,\nreturn_first=return_first,\nlang=lang,\n)\nif res is False:\nraise AssertionError(\n(f\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{args}\", f\"{pic if pic else GlobalConfig.SCREEN_CACHE}\")\n)\nif isinstance(res, tuple):\npass\nelif isinstance(res, dict) and False in res.values():\nres = filter(lambda x: x[1] is False, res.items())\nraise AssertionError(\n(\nf\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{dict(res)}\",\nf\"{pic if pic else GlobalConfig.SCREEN_CACHE}\",\n)\n)\n \u5728\u7528\u4f8b\u4e2d\u4f7f\u7528\u65ad\u8a00\uff0c\u793a\u4f8b\uff1a def test_font_manager_021(self):\n\"\"\"\u53f3\u4fa7\u2665-\u6536\u85cf/\u53d6\u6d88\u6536\u85cf\u5b57\u4f53\"\"\"\n# \u5b57\u4f53\u7ba1\u7406\u5668\u754c\u9762\u53f3\u4fa7\u8be6\u60c5\u5217\u8868\uff0c\u9009\u62e9\u672a\u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e / \u6536\u85cf\u5b57\u4f53\n# \u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e\u83dc\u5355\u663e\u793a\u201c\u53d6\u6d88\u6536\u85cf\u201d\uff1b\n...\nself.assert_ocr_exist(\"\u53d6\u6d88\u6536\u85cf\")\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_1","title":"4\u3001\u670d\u52a1\u7aef\u90e8\u7f72","text":"\u6211\u4eec\u76ee\u524d\u662f\u5c06 OCR \u670d\u52a1\u90e8\u7f72\u5728\u666e\u901a\u7684\u529e\u516c\u673a\u4e0a\u7684\uff0c\u5982\u679c\u4f60\u89c9\u5f97\u73b0\u6709\u7684 OCR \u8bc6\u522b\u6027\u80fd\u4e0d\u591f\u597d\uff0c\u6070\u597d\u4f60\u6709\u66f4\u597d\u7684\u673a\u5668\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u5176\u79c1\u6709\u5316\u90e8\u7f72\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41_1","title":"4.1\u3001\u73af\u5883\u5b89\u88c5","text":"\u63a8\u8350\u4f7f\u7528 pipenv \u8fdb\u884c\u73af\u5883\u642d\u5efa\uff1b \u5b89\u88c5 pipenv \uff1a sudo pip3 install pipenv\n \u65b0\u5efa\u4e00\u4e2a\u76ee\u5f55\u4f5c\u4e3a\u73af\u5883\u5305 ocr_env\uff1a cd ~\nmkdir ocr_env\n \u521b\u5efa python 3.7 \u73af\u5883\uff1a cd ocr_env\npipenv --python 3.7\n \u5b89\u88c5 OCR \u4f9d\u8d56\u5305\uff1a pipenv install paddlepaddle -i https://mirror.baidu.com/pypi/simple\npipenv install \"paddleocr>=2.0.1\" -i https://mirror.baidu.com/pypi/simple\n \u4e0d\u51fa\u610f\u5916\uff0c\u8fd9\u6837\u5c31\u628a\u4f9d\u8d56\u5b89\u88c5\u597d\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42_1","title":"4.2\u3001\u542f\u52a8\u670d\u52a1","text":"\u5c06\u57fa\u7840\u6846\u67b6\u4e2d\u7684 scr/ocr/pdocr_rpc_server.py \u6587\u4ef6\u62f7\u8d1d\u5230 ocr_env \u76ee\u5f55\uff0c\u540e\u53f0\u6267\u884c\u5b83\u5c31\u597d\u4e86\uff1a cd ocr_env\nnohup pipenv run python pdocr_rpc_server.py &\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#43","title":"4.3\u3001\u914d\u7f6e\u5f00\u673a\u81ea\u542f\uff08\u901a\u7528\uff09","text":"\u4f60\u80af\u5b9a\u4e0d\u60f3\u6bcf\u6b21\u673a\u5668\u91cd\u542f\u4e4b\u540e\u90fd\u9700\u8981\u624b\u52a8\u542f\u52a8\u670d\u52a1\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u914d\u7f6e\u5f00\u673a\u81ea\u542f\u3002 \u5199\u5f00\u673a\u81ea\u542f\u670d\u52a1\u6587\u4ef6\uff1a sudo vim /lib/systemd/system/ocr.service\n autoocr \u540d\u79f0\u4f60\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff0c\u5199\u5165\u4ee5\u4e0b\u5185\u5bb9\uff1a [Unit]\nDescription=OCR Service\nAfter=multi-user.target\n\n[Service]\nUser=uos\nGroup=uos\nType=idle\nWorkingDirectory=/home/uos/ocr_env\nExecStart=pipenv run python pdocr_rpc_server.py\n\n[Install]\nWantedBy=multi-user.target\n \u6ce8\u610f\u66ff\u6362\u4f60\u7684${USER} \u4fee\u6539\u914d\u7f6e\u6587\u4ef6\u7684\u6743\u9650\uff1a sudo chmod 644 /lib/systemd/system/ocr.service\n \u81ea\u542f\u670d\u52a1\u751f\u6548\uff1a sudo systemctl daemon-reload\nsudo systemctl enable ocr.service\n \u67e5\u770b\u670d\u52a1\u72b6\u6001\uff1a sudo systemctl status ocr.service\n \u4f60\u53ef\u4ee5\u518d\u91cd\u542f\u4e0b\u7535\u8111\uff0c\u770b\u770b\u670d\u52a1\u662f\u4e0d\u662f\u6b63\u5e38\u542f\u52a8\u4e86\uff0c\u6ca1\u62a5\u9519\u5c31 OK \u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_4","title":"\u4e94\u3001\u5c5e\u6027\u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_3","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 UI \u81ea\u52a8\u5316\u5927\u591a\u90fd\u662f\u57fa\u4e8e\u6d4f\u89c8\u5668\u7684\uff0c\u6838\u5fc3\u662f\u5728\u7f51\u9875\u7684 DOM \u6811\u4e0a\u67e5\u627e\u5143\u7d20\uff0c\u5e76\u5bf9\u5176\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\uff1b Linux \u684c\u9762\u5e94\u7528\u5927\u591a\u662f\u91c7\u7528 Qt \u7f16\u5199\u7684\uff0c\u5728 Qt \u4e2d\u4e5f\u662f\u4ece\u6700\u9876\u5c42\u7684 MainWindow \u5f00\u59cb\u6784\u5efa\u5e94\u7528\uff0c\u6240\u4ee5\u903b\u8f91\u4e5f\u662f\u4e00\u6837\u7684\uff0cQt \u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u540c\u6837\u53ef\u4ee5\u901a\u8fc7 DOM \u6811\uff08\u5c5e\u6027\u6811\uff09\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff0c\u6211\u4eec\u79f0\u4e4b\u4e3a\u5c5e\u6027\u5b9a\u4f4d\u3002 \u501f\u52a9\u5f00\u6e90\u5de5\u5177 dogtail \u6211\u4eec\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u83b7\u53d6\uff0c\u4ece\u800c\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\u3002dogtail \u7684\u9879\u76ee\u4ecb\u7ecd\u53ef\u4ee5\u731b\u6233\u8fd9\u91cc\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_3","title":"2\u3001\u4f7f\u7528\u65b9\u6cd5","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#21sniff","title":"2.1\u3001sniff\uff08\u55c5\u63a2\u5668\uff09\u4f7f\u7528","text":"\u5728\u7ec8\u7aef\u8f93\u5165 sniff \u542f\u52a8 AT-SPI Browser mikigo@mikigo-PC:~$ sniff\n \u67e5\u770b\u5e94\u7528\u7684\u6807\u7b7e \u5728 sniff \u91cc\u9762\u53ef\u4ee5\u770b\u5230\u7cfb\u7edf\u4e2d\u5df2\u542f\u52a8\u7684\u5e94\u7528\uff0c\u70b9\u51fb\u5e94\u7528\u540d\u79f0\u524d\u9762\u7684\u4e09\u89d2\u5f62\u56fe\u6807\uff0c\u53ef\u4ee5\u5c55\u5f00\u5e94\u7528\u7684\u6807\u7b7e\uff0c\u6240\u6709\u6807\u7b7e\u4ee5 tree \u7684\u5f62\u5f0f\u5c55\u793a\uff0c\u5bf9\u5e94\u5e94\u7528\u91cc\u9762\u7684\u7236\u7a97\u53e3\u548c\u5b50\u7a97\u53e3\u3002 \u83b7\u53d6\u5143\u7d20\u63a7\u4ef6\u7684\u6807\u7b7e\u540d\u79f0 \u9996\u5148\uff0c\u4e3a\u4e86\u65b9\u4fbf\u67e5\u770b\u5143\u7d20\u63a7\u4ef6\u5bf9\u5e94\u7684\u4f4d\u7f6e\uff0c\u5efa\u8bae\u73b0\u5728\u4e0a\u65b9\u5de5\u5177\u680f\u70b9\u51fb Actions\uff0c\u7136\u540e\u52fe\u9009 Hightlight Items\uff0c\u8fd9\u6837\u5728 sniff \u4e2d\u9f20\u6807\u9009\u4e2d\u5143\u7d20\u6807\u7b7e\u7684\u65f6\u5019\uff0c\u5e94\u7528\u4e2d\u4f1a\u6709\u76f8\u5e94\u7684\u5149\u6807\u9501\u5b9a\u3002 \u5728 sniff \u91cc\u9762\u70b9\u51fb\u8fdb\u5165\u5e94\u7528\u7684\u6807\u7b7e tree \u4e2d\u540e\uff0c\u70b9\u51fb\u76f8\u5e94\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5728\u5de5\u5177\u4e0b\u65b9\uff0c\u4f1a\u5c55\u793a\u5143\u7d20\u63a7\u4ef6\u7684 Name\uff0c\u8fd9\u4e2a\u5c31\u662f\u6807\u7b7e\u540d\u79f0\u3002 \u5728 tree \u4e2d\u6709\u4e9b\u5730\u65b9\u662f\u7a7a\u767d\u7684\u6216\u8005\u662f Form\uff0c\u662f\u56e0\u4e3a\u5f00\u53d1\u4eba\u5458\u5728\u6dfb\u52a0\u6807\u7b7e\u7684\u65f6\u5019\u6ca1\u6709\u6dfb\u52a0\uff0c\u6216\u8005\u6709\u4e9b\u7236\u7a97\u53e3\u4e0d\u9700\u8981\u6dfb\u52a0\uff0c\u8fd9\u79cd\u5728\u5b9e\u9645\u4e1a\u52a1\u4e2d\u662f\u4e0d\u5f71\u54cd\u7684\uff0c\u6211\u4eec\u53ea\u8981\u4fdd\u8bc1\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\u4e2d\uff0c\u8981\u7528\u5230\u7684\u5143\u7d20\u90fd\u6dfb\u52a0\u4e86\u6807\u7b7e\u5373\u53ef\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#22","title":"2.2\u3001\u5143\u7d20\u64cd\u4f5c","text":"\u83b7\u53d6\u5e94\u7528\u5bf9\u8c61 dogtail \u83b7\u53d6\u5e94\u7528\u5bf9\u8c61\u7684\u65f6\u5019\uff0c\u4f7f\u7528\u7684\u662f tree \u5e93\u91cc\u9762\u7684 application() \u65b9\u6cd5\uff1a from dogtail.tree import root\napp_obj = root.application('deepin-music')\n app_obj\u5c31\u662f\u5e94\u7528\u7684\u5bf9\u8c61\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\uff0c\u662f\u5e94\u7528\u5bf9\u8c61\u4f7f\u7528child()\u65b9\u6cd5\uff1a element = app_obj.child('element_name')\n \u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u4f20\u5165\u5143\u7d20\u7684 Name\uff0c\u83b7\u53d6\u5230\u76f8\u5e94\u5143\u7d20\u7684\u5bf9\u8c61\u3002Name \u53ef\u4ee5\u901a\u8fc7 sniff \u67e5\u770b\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\u5217\u8868: element_list = element.children\n \u83b7\u53d6\u5230\u8fd9\u4e2a\u5143\u7d20\u4e0b\u9762\u6240\u6709\u7684\u5143\u7d20\u5217\u8868\u3002 \u8fd9\u4e2a\u65b9\u6cd5\u9002\u7528\u4e8e\u6709\u4e9b\u6807\u7b7e\u6ca1\u6709\u6dfb\u52a0\uff0c\u4f46\u662f\u4f4d\u7f6e\u662f\u56fa\u5b9a\u7684\uff0c\u6211\u4eec\u901a\u8fc7\u7d22\u5f15\u53ef\u4ee5\u53d6\u5f97\u5143\u7d20\u3002 element_list[0]\n \u5bf9\u5143\u7d20\u7684\u64cd\u4f5c \u5728\u83b7\u53d6\u5230\u5143\u7d20\u4e4b\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u76f8\u5e94\u7684\u64cd\u4f5c\u3002 \u5355\u51fb element.click(button=1)\n button 1 \u2014>\u5de6\u952e\uff0c2 \u2014>\u6eda\u8f6e\uff0c3 \u2014>\u53f3\u952e\uff0c\u9ed8\u8ba4\u4e3a 1 \u53cc\u51fb element.doubleClick(button=1)\n \u9f20\u6807\u60ac\u505c element.point()\n \u9f20\u6807\u79fb\u52a8\u5230\u5143\u7d20\u4e2d\u5fc3\u4f4d\u7f6e \u6587\u672c\u8f93\u5165 element.typeText(string)\n \u5411\u5143\u7d20\u5bf9\u8c61\u8f93\u5165\u5b57\u7b26\u4e32 \uff0c\u6bd4\u5982\u8f93\u5165\u6846 \u7ec4\u5408\u952e element.keyCombo(comboString)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#23","title":"2.3\u3001\u6846\u67b6\u5c01\u88c5","text":"\u4ee3\u7801\u793a\u4f8b\uff1a # \u8be6\u7ec6\u4ee3\u7801\u8bf7\u67e5\u770b src/dogtail_utils.py\nclass DogtailUtils:\ndef __init__(self, name=None, description=None):\nself.name = name\nself.description = description\nself.obj = root.application(self.name, self.description)\ndef app_element(self, *args, **kwargs):\n\"\"\"\n \u83b7\u53d6app\u5143\u7d20\u7684\u5bf9\u8c61\n :return: \u5143\u7d20\u7684\u5bf9\u8c61\n \"\"\"\nreturn self.obj.child(*args, **kwargs, retry=False)\ndef element_center(self, element) -> tuple:\n\"\"\"\n \u83b7\u53d6\u5143\u7d20\u7684\u4e2d\u5fc3\u4f4d\u7f6e\n :param element:\n :return: \u5143\u7d20\u4e2d\u5fc3\u5750\u6807\n \"\"\"\n_x, _y, _w, _h = self.app_element(element).extents\n_x = _x + _w / 2\n_y = _y + _h / 2\nreturn _x, _y\n \u6846\u67b6\u63d0\u4f9b\u7684\u63a5\u53e3\u975e\u5e38\u7b80\u6d01\uff0c\u5728\u8c03\u7528\u65f6\uff1a self.dog.element_center(\"\u64ad\u653e\")\n \u8fd9\u6837\u5c31\u80fd\u83b7\u53d6\u5230\u6b64\u5143\u7d20\u7684\u4e2d\u5fc3\u5750\u6807\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_5","title":"\u516d\u3001\u6807\u7b7e\u5316\u7ba1\u7406","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_4","title":"1\u3001\u6807\u7b7e\u8bf4\u660e","text":"\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u811a\u672c ID\uff1a\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c/\u51fd\u6570 ID\uff1b PMS\u7528\u4f8bID\uff1aPMS \u4e0a\u5bf9\u5e94\u7684\u7528\u4f8b ID\uff08\u7528\u4f8b\u5e93 ID\uff09\uff1b \u9ed8\u8ba4\u4f7f\u7528\u7528\u4f8b\u5e93 ID\uff0c\u5bf9\u4e8e\u6682\u65f6\u6ca1\u6709\u4f7f\u7528\u7528\u4f8b\u5e93\u7ba1\u7406\u7528\u4f8b\u7684\u9879\u76ee\uff0c\u53ef\u4ee5\u4f7f\u7528\u4ea7\u54c1\u5e93\u7528\u4f8b ID\uff1b \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1aFUNC\uff08\u529f\u80fd\uff09\u3001PERF\uff08\u6027\u80fd\uff09\u3001STR\uff08\u538b\u529b\uff09\u3001SEC\uff08\u5b89\u5168\uff09\u3001CTS\uff08\u517c\u5bb9\u6027\uff09\u3001API\uff08\u63a5\u53e3\uff09\u3001BASELINE\uff08\u57fa\u7ebf-\u9884\u7559\uff09 \u8bbe\u5907\u7c7b\u578b\uff1aPPL\uff08\u4f9d\u8d56\u5916\u8bbe\u7684\u7528\u4f8b\uff09\u3001COL\uff08\u4f9d\u8d56\u4e3b\u63a7\u673a\u7684\u7528\u4f8b\uff09 \u7528\u4f8b\u6765\u6e90\uff1aBUG\uff08\u7531 Bug \u8f6c\u7684\u7528\u4f8b\uff09 \u4e0a\u7ebf\u5bf9\u8c61\uff1aCICD\uff0c\u8868\u793a\u4e0a\u7ebf\u5230 CICD \u6d41\u6c34\u7ebf\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u53ef\u4e00\u952e\u751f\u6210 case_list.csv \u6587\u4ef6\uff0c\u7528\u4e8e\u5bfc\u5165\u5230\u660e\u9053\u4e91 AT \u7528\u4f8b\u5217\u8868\u4e2d\u63a7\u5236 CICD \u8dd1\u6d4b\u8303\u56f4\uff1b \u6d4b\u8bd5\u7ea7\u522b\uff1aC1 / C2 / C3 / C4\uff0c\u5177\u4f53\u5b9a\u4e49\u53c2\u8003\u6d41\u6c34\u7ebf\u4f7f\u7528\u6307\u5bfc\uff1b \u8df3\u8fc7\u539f\u56e0\uff1askip-XXX\uff0c\u7528\u4e8e\u63a7\u5236\u7528\u4f8b\u662f\u5426\u6267\u884c\uff1b \u786e\u8ba4\u4fee\u590d\uff1afixed-XXX\uff0c\u7528\u4e8e\u6807\u8bb0\u7528\u4f8b\u7684\u4fee\u590d\u72b6\u6001\uff08\u540e\u9762\u8be6\u7ec6\u8bb2\u89e3\u7528\u6cd5\uff09\uff1b \u5e9f\u5f03\u7528\u4f8b\uff1aremoved-\u5df2\u5e9f\u5f03\uff0c\u7528\u4e8e\u6807\u8bb0\u5df2\u7ecf\u5e9f\u5f03\u7684\u7528\u4f8b\uff0c\u6b64\u7528\u4f8b\u6807\u7b7e\u4e0d\u4f1a\u88ab\u6dfb\u52a0\uff0c\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff1b \u793a\u4f8b\uff1a \u811a\u672cID PMS\u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u8bbe\u5907\u7c7b\u578b \u7528\u4f8b\u6765\u6e90 \u4e0a\u7ebf\u5bf9\u8c61 \u6d4b\u8bd5\u7ea7\u522b \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b ... 679537 679537 L1 FUNC PPL CICD C1 skip-XXX fixed-XXX removed-\u5df2\u5e9f\u5f03 ..."},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_4","title":"2\u3001\u64cd\u4f5c\u6b65\u9aa4","text":"2.1\u3001\u5728\u5b50\u9879\u76ee\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u4ee5\u7528\u4f8b\u7684 py \u6587\u4ef6\u9664\u53bb\u9996\u5b57\u7b26\u4e32 \"test_\" \u548c\u7528\u4f8b\u5e8f\u53f7\u540e\u7684\u5b57\u7b26\u4e32\u4f5c\u4e3a csv \u7684\u6587\u4ef6\u540d\u3002 \u4f8b\u5982: \u76f8\u518c\u7684\u7528\u4f8b\u6587\u4ef6\u4e3a test_album_xxx.py\uff0cxxx \u8868\u793a\u7528\u4f8b\u7684ID\uff08\u4e5f\u53ef\u4ee5\u662f\u81ea\u5b9a\u4e49\u7684\u6570\u5b57\u4ee3\u8868\u7528\u4f8b\u5e8f\u53f7\uff09\uff0c\u6b64\u65f6 csv \u6587\u4ef6\u540d\u5c31\u5e94\u4e3a album.csv\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u6240\u6709 csv \u6587\u4ef6\u5efa\u8bae\u653e\u5728\u4e00\u4e2a tags \u76ee\u5f55\u4e0b\u3002 \u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 2.2\u3001\u7b2c\u4e00\u5217\u4e3a\u811a\u672c ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b\u7528\u4f8b\u6807\u7b7e\u53ef\u4ee5\u65e0\u5e8f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_2","title":"3\u3001\u589e\u52a0\u8bf4\u660e","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_1","title":"3.1\u3001\u8df3\u8fc7\u7528\u4f8b","text":"\u4f20\u7edf\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668(@pytest.mark.skip)\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a; \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#311","title":"3.1.1\u3001\u56fa\u5b9a\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 679537 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u7b7e\u5f00\u5934\u4e3a \u201cskip-XXX\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\uff0c\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\u5219\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u7b7e\u4e3a SKIPED\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#312","title":"3.1.2\u3001\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skipif_platform-aarch64&mips64 \u67d0\u4e9b\u7528\u4f8b\u4f1a\u56e0\u4e3a\u4e0d\u540c\u7684\u73af\u5883\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\uff0c\u5e38\u89c1\u7684\u573a\u666f\u4e3a\u5728\u4e0d\u540c\u67b6\u6784\u4e0a\u5224\u65ad\u662f\u5426\u6267\u884c\uff0c\u8df3\u8fc7\u7684\u539f\u56e0\u6807\u7b7e\u4e3a \u201cskipif_platform-\u201d \u52a0\u67b6\u6784\u540d\uff0c\u591a\u4e2a\u67b6\u6784\u4e4b\u95f4\u4f7f\u7528 \u201c&\u201d \u62fc\u63a5\uff1b \u4ee5\u4e0a\u4f8b\u5b50\u4e3a\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u5224\u65ad\u5f53\u524d\u67b6\u6784\u662f\u5426\u4e3a arrch64 \u6216\u8005 mips64\uff0c\u82e5\u662f\uff0c\u5219\u8df3\u8fc7\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u82e5\u5426\u5219\u6267\u884c\u7528\u4f8b\uff1b \u76ee\u524d\u6846\u67b6\u9ed8\u8ba4\u4ec5\u652f\u6301\u67b6\u6784\u7684\u6761\u4ef6\u5224\u65ad\uff0c\u4f46\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u903b\u8f91\u652f\u6301\u81ea\u5b9a\u4e49\u6dfb\u52a0\u3002 \u5728\u9879\u76ee\u76ee\u5f55\u8def\u5f84\u4e0b\u5b58\u5728\u6587\u4ef6 setting/skipif.py\uff0c\u6240\u6709\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u7684\u51fd\u6570\u5199\u5728\u6b64\u6587\u4ef6\u4e2d\u3002 \u9ed8\u8ba4\u67b6\u6784\u5224\u65ad\u4f8b\u5b50\uff1a def skipif_platform(args: str):\n\"\"\"\u5e73\u53f0\u8df3\u8fc7\"\"\"\n_skip_key = args.split(\"&\")\nfor key in _skip_key:\nif GlobalConfig.SYS_ARCH == key:\nreturn True\nreturn False\n \u65b9\u6cd5\u7f16\u5199\u89c4\u8303\uff1a \u65b9\u6cd5\u540d\u5fc5\u987b\u4ee5 skipif \u5f00\u5934\uff1b \u65b9\u6cd5\u5fc5\u987b\u6709\u8fd4\u56de\u7ed3\u679c\u5e76\u4e14\u4e3a\u5e03\u5c14\u503c\uff08True \u4ee3\u8868\u8df3\u8fc7\uff0cFalse \u4ee3\u8868\u4e0d\u8df3\u8fc7\uff09\uff1b \u65b9\u6cd5\u53ea\u80fd\u6709\u4e00\u4e2a\u5165\u53c2\uff1b \u5728 csv \u6587\u4ef6\u8df3\u8fc7\u539f\u56e0\u4e00\u680f\u4e2d\u586b\u5199\u4e3a \u201c{\u51fd\u6570\u540d}-{\u53c2\u6570}\u201d\uff0c\u4f8b\u5982\uff1askipif_platform-aarch64\uff1b\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u4f1a\u4ee5\u7b2c\u4e00\u4e2a \u201c-\u201d \u8fdb\u884c\u5206\u5272\uff0c\u622a\u53d6\u7684\u5de6\u4fa7\u5b57\u7b26\u4e32\u4f5c\u4e3a\u51fd\u6570\u540d\uff0c\u5728 skipif.py \u6587\u4ef6\u4e2d\u67e5\u627e\u662f\u5426\u6709\u540c\u540d\u51fd\u6570\uff0c\u5e76\u5c06\u622a\u53d6\u7684\u53f3\u4fa7\u4f5c\u4e3a\u53c2\u6570\u4f20\u9012\u7ed9\u8be5\u51fd\u6570\uff0c\u901a\u8fc7\u83b7\u53d6\u8be5\u51fd\u6570\u8fd4\u56de\u7684\u5e03\u5c14\u503c\uff0c\u8fd4\u56de True\uff0c\u5219\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u8fd4\u56de False\uff0c\u5219\u6267\u884c\u8be5\u7528\u4f8b\u3002 \u82e5\u51fd\u6570\u9700\u8981\u591a\u4e2a\u53c2\u6570\uff0c\u53ef\u81ea\u5b9a\u4e49\u591a\u4e2a\u53c2\u6570\u4e4b\u95f4\u7684\u8fde\u63a5\u7b26\uff0c\u8fde\u63a5\u7b26\u53f7\u4e0d\u53ef\u4f7f\u7528\u4e0b\u5212\u7ebf\u548c\u9017\u53f7\uff0c\u63a8\u8350\u7edf\u4e00\u4f7f\u7528 & \u7b26\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32","title":"3.2\u3001\u786e\u8ba4\u4fee\u590d","text":"\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7528\u4f8b\u4fee\u590d\u540e\uff0c\u4f46\u4e0d\u80fd\u7acb\u5373\u5220\u9664\u8df3\u8fc7\u539f\u56e0\uff08skip-XXX\uff09\u7684\u7528\u4f8b\uff0c\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u786e\u8ba4\u4fee\u590d\u201d\uff0c\u4f5c\u4e3a\u6807\u8bb0\u8be5\u7528\u4f8b\u662f\u5426\u5df2\u7ecf\u4fee\u590d\uff0c\u56fa\u5b9a\u586b\u5165\u5b57\u6bb5\u4e3a \u201cfixed-\u5df2\u4fee\u590d\u201d\u3002\u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u5373\u4f7f\u540c\u65f6\u6807\u8bb0\u4e86 skip-XXX \u4e5f\u4f1a\u6b63\u5e38\u6267\u884c\u3002 \u793a\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d 679537 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d \u3010\u540c\u65f6\u6807\u8bb0\u4e86skip \u548c fixed\uff0c\u4f46\u4ecd\u7136\u60f3\u8981\u8df3\u8fc7\u7528\u4f8b\u3011 \u5f53 \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u540c\u65f6\u586b\u5165\u540e\uff0c\u547d\u4ee4\u884c\u4f20\u9012\u53c2\u6570 --ifixed yes\uff0c\u5219\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\u8be5\u6761\u7528\u4f8b\u3002 python3 manage.py run --ifixed yes\n \u770b\u5230\u8fd9\u91cc\u6709\u4e9b\u540c\u5b66\u53ef\u80fd\u8981\u95ee\u4e86\uff0c\u6211\u60f3\u6062\u590d\u8df3\u8fc7\u6267\u884c\uff0c\u76f4\u63a5\u628a skip-XXX \u8fd9\u4e00\u5217\u6807\u7b7e\u5220\u6389\u4e0d\u5c31\u597d\u4e86\uff0c\u8fd8\u641e\u4ec0\u4e48\u786e\u8ba4\u4fee\u590d\u5e72\u5565\uff1f \u8fd9\u91cc\u7ed9\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u89e3\u91ca\u4e00\u4e0b\uff1a \uff08\u4ee5\u4e0b\u6d41\u6c34\u7ebf\u6307\u7684\u662f\u6bcf\u65e5\u6784\u5efa\u7684\u6d41\u6c34\u7ebf\uff0c\u8dd1 AT \u7684\u5168\u91cf\u7528\u4f8b\uff09 \u9996\u5148\uff0c\u6d41\u6c34\u7ebf\u4e0a\u8dd1\u7684\u662f AT \u5386\u53f2 Tag\uff0c\u8df3\u8fc7\u7528\u4f8b\u7684\u6807\u7b7e(skip-XXX) \u662f\u5728\u6700\u65b0\u7684\u4ee3\u7801\u4e0a\u63d0\u4ea4\u7684\uff0c\u6211\u4eec\u91c7\u7528\u6700\u65b0\u7684 csv \u6587\u4ef6\u8986\u76d6\u5386\u53f2 csv \u6587\u4ef6\u7684\u8bbe\u8ba1\u6765\u5b9e\u73b0\u4e86\u5bf9\u5386\u53f2 Tag \u4e0a\u7528\u4f8b\u7684\u8df3\u8fc7\uff1b \u7136\u540e\uff0c\u5728\u65e5\u5e38\u8df3\u8fc7\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u540c\u65f6\u4e5f\u5728\u4fee\u590d\u4e00\u4e9b\u7528\u4f8b\uff0c\u4fee\u590d\u540e\u7684\u8fd9\u4e9b\u7528\u4f8b\u5728\u672c\u5730\u8c03\u8bd5\u7684\u65f6\u5019\u6211\u4eec\u4e0d\u5e0c\u671b\u7ee7\u7eed\u8df3\u8fc7\uff0c\u4f46\u662f\u6b64\u65f6\uff0c\u4fee\u590d\u7684\u8fd9\u4e9b\u7528\u4f8b\u53ef\u80fd\u8fd8\u4e0d\u7a33\u5b9a\uff0c\u4e0d\u9002\u5408\u9a6c\u4e0a\u653e\u5230\u6d41\u6c34\u7ebf\u53bb\u8dd1\uff0c\u4e5f\u5c31\u662f\u8bf4\u6d41\u6c34\u7ebf\u4e0a\u6211\u4eec\u662f\u5e0c\u671b\u4ed6\u7ee7\u7eed\u8df3\u8fc7\u7684\uff0c\u56e0\u6b64\uff0c\u54b1\u4e0d\u80fd\u76f4\u63a5\u628a skip-XXX \u5e72\u6389\uff1b \u8fd9\u91cc\u5c31\u77db\u76fe\u4e86\uff0c\u4e00\u4e2a\u9700\u6c42\u662f\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u53e6\u4e00\u4e2a\u9700\u6c42\u53c8\u4e0d\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u600e\u4e48\u529e\u5462\uff1f \u6211\u4eec\u4f7f\u7528\u201c\u786e\u8ba4\u4fee\u590d\u201d\u6765\u6807\u8bb0\u8fd9\u6761\u7528\u4f8b\u5df2\u7ecf\u4fee\u590d\u4e86\uff0c\u8fd9\u6837\u4f60\u672c\u5730\u8c03\u8bd5\u7528\u4f8b\u7684\u65f6\u5019\u8fd9\u6761\u5df2\u4fee\u590d\u7684\u7528\u4f8b\u662f\u4f1a\u6267\u884c\u7684\uff0c\u540c\u65f6\u5728\u6d41\u6c34\u7ebf\u4e0a\u5c06 --ifixed yes \u53c2\u6570\u52a0\u4e0a\uff0c\u90a3\u4e48\u6d41\u6c34\u7ebf\u4e0a\u6267\u884c\u65f6\u8fd9\u6761\u7528\u4f8b\u4ecd\u7136\u662f\u8df3\u8fc7\u7684\u72b6\u6001\uff0c\u540e\u7eed\u4f60\u6253 Tag \u7684\u65f6\u5019\uff0c\u628a \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u7684\u6807\u7b7e\u5168\u90e8\u5220\u6389\u5c31\u53ef\u4ee5\u4e86\u3002 \u8fd9\u5c31\u662f\u201c\u786e\u8ba4\u4fee\u590d\u201d\u8fd9\u4e2a\u6807\u7b7e\u7684\u80cc\u666f\uff0c\u9700\u8981\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u54c1\u4e00\u54c1\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#33","title":"3.3\u3001\u5e9f\u5f03\u7528\u4f8b","text":"\u9488\u5bf9\u67d0\u4e9b\u7528\u4f8b\uff0c\u7531\u4e8e\u9700\u6c42\u53d8\u66f4\uff0c\u73af\u5883\u5f71\u54cd\u6216\u8bc4\u4f30\u4e0d\u518d\u9002\u7528\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u65f6\uff0c\u7528\u4f8b\u9700\u8981\u5e9f\u5f03\uff0c\u5219\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u5e9f\u5f03\u7528\u4f8b\u201d\uff0c\u8be5\u5217\u5b58\u5728 \u201cremoved-{\u5e9f\u5f03\u539f\u56e0}\u201d\uff0c\u5219\u7528\u4f8b\u4e0d\u4f1a\u6267\u884c\u3002 \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d removed-\u5df2\u5e9f\u5f03 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_2","title":"4\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u4e0a\u9762\u4ecb\u7ecd Pytest \u6846\u67b6\u63d0\u4f9b\u7684\u6807\u7b7e\u529f\u80fd mark\uff0c\u4f7f\u7528\u65f6\u9700\u8981\u4e3a\u6bcf\u4e00\u4e2a\u7528\u4f8b\u6dfb\u52a0\u6807\u7b7e\u88c5\u9970\u5668\uff0c\u5219\u64cd\u4f5c\u590d\u6742\uff0c\u53ef\u7ef4\u62a4\u6027\u5dee\uff0c\u5176\u6839\u672c\u95ee\u9898\u5c31\u662f\u6807\u7b7e\u5206\u6563\u5728\u6bcf\u4e00\u6761\u7528\u4f8b\u7684\u88c5\u9970\u5668\u4e0a\uff0c\u96be\u4ee5\u96c6\u4e2d\u7ef4\u62a4\uff1b\u4e8e\u662f\u4e4e\u5c06\u6240\u6709\u6807\u7b7e\u4f7f\u7528 csv \u6587\u4ef6\u8fdb\u884c\u96c6\u4e2d\u7ba1\u7406\uff0c\u5e76\u901a\u8fc7 Pytest \u7684\u94a9\u5b50\u51fd\u6570\uff0c\u8bfb\u53d6 csv \u6587\u4ef6\uff0c\u52a8\u6001\u6dfb\u52a0\u6807\u7b7e\u5230\u7528\u4e2d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5csv","title":"5\u3001CSV\u6587\u4ef6\u683c\u5f0f","text":"\u6b64\u914d\u7f6e\u6587\u4ef6\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u6807\u7b7e\u6570\u636e\uff0c\u4e14\u8981\u65b9\u4fbf\u80fd\u4f7f\u7528 Excel \u6253\u5f00\u8fdb\u884c\u7f16\u8f91\u67e5\u770b\uff0c\u66f4\u91cd\u8981\u7684\u662f\u6211\u4eec\u4e0d\u60f3\u5f15\u5165\u4e09\u65b9\u4f9d\u8d56\uff0cCSV \u6587\u4ef6\u51e0\u4e4e\u662f\u552f\u4e00\u80fd\u6ee1\u8db3\u6240\u6709\u7684\u8981\u6c42\u7684\u6587\u4ef6\u683c\u5f0f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_6","title":"\u4e03\u3001\u65e5\u5fd7\u7cfb\u7edf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_5","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e YouQu \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u64cd\u4f5c\u65b9\u6cd5\u5c01\u88c5\u5199\u6cd5\uff0c\u901a\u5e38\u662f\u8fd9\u6837\u7684\uff1a\u7c7b\u91cc\u9762\u4e00\u4e2a\u51fd\u6570\u53ea\u5305\u542b\u4e00\u4e2a\u64cd\u4f5c\u6216\u591a\u6b21\u8c03\u7528\u7684\u4e00\u7cfb\u5217\u53ef\u5408\u5e76\u7684\u64cd\u4f5c\uff1b \u4f20\u7edf\u7684\u65e5\u5fd7\u8f93\u51fa\u65b9\u5f0f\uff0c\u9700\u8981\u5728\u6bcf\u4e2a\u51fd\u6570\u91cc\u9762\u4e3b\u52a8\u7f16\u5199\u65e5\u5fd7\u8f93\u51fa\u4ee3\u7801 \uff0c\u4f8b\u5982\uff1a class XXXWidget:\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\nlogger.info(\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\")\n...\n# \u7701\u7565\u4ee3\u7801\u90e8\u5206\n \u4e00\u4e2a\u51fd\u6570\u91cc\u9762\u81f3\u5c11\u5305\u542b\u4e00\u6761\u65e5\u5fd7\u4fe1\u606f\uff0c\u5982\u679c\u6bd4\u8f83\u590d\u6742\u64cd\u4f5c\u6b65\u9aa4\uff0c\u53ef\u80fd\u5305\u542b\u591a\u6761\u65e5\u5fd7\u4fe1\u606f\uff1b \u4e00\u4e2a\u5e94\u7528\u542b\u6709\u5927\u91cf\u7684\u64cd\u4f5c\u51fd\u6570\uff0c\u4e5f\u5c31\u662f\u8bf4\u6211\u4eec\u9700\u8981\u5199\u5927\u91cf\u7684\u65e5\u5fd7\u4ee3\u7801\uff1b \u901a\u8fc7\u7ecf\u9a8c\u89c2\u5bdf\uff0c\u6211\u4eec\u53d1\u73b0\uff0c\u51fd\u6570\u8bf4\u660e\u4ee5\u53ca\u51fd\u6570\u64cd\u4f5c\u65e5\u5fd7\uff0c\u5177\u6709\u8f83\u9ad8\u7684\u91cd\u590d\u5ea6\uff08\u4ece\u4e0a\u9762\u7684\u4f8b\u5b50\u4e5f\u53ef\u4ee5\u770b\u51fa\u6765\uff09\uff0c\u56e0\u6b64\u6211\u4eec\u5927\u80c6\u7684\u8bbe\u60f3\uff0c\u80fd\u4e0d\u80fd\u57fa\u4e8e\u6846\u67b6\u6267\u884c\u65f6\uff0c\u81ea\u52a8\u7684\u5c06\u51fd\u6570\u8bf4\u660e\u4f5c\u4e3a\u65e5\u5fd7\u6253\u5370\u51fa\u6765\uff0c\u4ece\u800c\u51cf\u5c11\u5927\u91cf\u65e5\u5fd7\u4ee3\u7801\u91cf\u548c\u91cd\u590d\u7f16\u5199\uff0c\u90a3\u771f\u662f\u5999\u554a~\u3002 \u57fa\u4e8e\u6b64\u201c\u5929\u771f\u201d\u7684\u60f3\u6cd5\uff0c\u6211\u4eec\u8bbe\u8ba1\u51fa\u4e86 youqu \u7684\u65e5\u5fd7\u7cfb\u7edf\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_5","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u6838\u5fc3\u539f\u7406\uff1a \u901a\u8fc7\u7ed9\u7c7b\u52a0\u4e0a\u4e00\u4e2a\u88c5\u9970\u5668 @log\uff0c\u52a8\u6001\u7ed9\u8be5\u7c7b\u4e0b\u6240\u6709\u7684\u51fd\u6570\u53ca\u7236\u7c7b\u51fd\u6570\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668 @_trace\uff0c\u5728\u6b64\u88c5\u9970\u5668\u4e2d\u6211\u4eec\u80fd\u52a8\u6001\u7684\u6355\u83b7\u6240\u8c03\u7528\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff08func.__doc__\uff09\uff0c\u901a\u8fc7\u65e5\u5fd7\u8f93\u51fa\u5668\u5c06\u5176\u8f93\u51fa\u5373\u53ef\u3002 \u5b9e\u73b0\u6b65\u9aa4\uff1a \u901a\u8fc7 inspect.getmembers \u83b7\u53d6\u88ab\u88c5\u9970\u7684\u7c7b\u4e0b\u6240\u6709\u51fd\u6570\uff0c\u5305\u542b\u9759\u6001\u65b9\u6cd5\uff0c\u7c7b\u65b9\u6cd5\uff0c\u5b9e\u4f8b\u65b9\u6cd5\uff1b \u901a\u8fc7 setattr(\u7c7b, \u65b9\u6cd5, _trace\uff09 \u7684\u65b9\u5f0f\uff0c\u7ed9\u7b26\u5408\u6761\u4ef6\u7684\u51fd\u6570\uff0c\u52a8\u6001\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_3","title":"3\u3001\u65e5\u5fd7\u914d\u7f6e","text":"[log_cli]\n;\u65e5\u5fd7\u76f8\u5173\u914d\u7f6e\uff08\u4e0d\u6253\u5370\u6784\u9020\u51fd\u6570\u548c\u9b54\u6cd5\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff09\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = INFO\n# ============= \u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u914d\u7f6e ================\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u5f00\u5934\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7, \u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_STARTSWITH = Assert\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u7ed3\u5c3e\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_ENDSWITH = Widget\n;\u652f\u6301\u7c7b\u540d\u5305\u542b xxx \u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_CONTAIN = ShortCut\n# ==============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_3","title":"4\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u5728\u5e94\u7528\u5e93 widget \u65b9\u6cd5\u5e93\u91cc\u9762\uff0c\u53ea\u9700\u8981\u5728\u51fa\u53e3\u6587\u4ef6\u52a0\u4e0a\u7c7b\u88c5\u9970\u5668\uff0c\u5c31\u53ef\u4ee5\u5b9e\u73b0\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u4e86\uff1b # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6ce8\u610f\uff0c\u662f\u7c7b\u88c5\u9970\u5668\u3002 \u5b9e\u4f8b\uff1a # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\n@classmethod\ndef find_dfm_image(cls, *elements, multiple=False, rate=0.9):\n\"\"\"\n \u67e5\u627e\u56fe\u7247 {{elements}}.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e {{rate}} \u7684\u5750\u6807\n :param elements:\n :param multiple:\n :return:\n \"\"\"\nelement = tuple(map(lambda x: f\"{Config.PIC_RES_PATH}/{x}\", elements))\nreturn cls.find_image(*element, multiple=multiple)\n \u8c03\u7528\u65b9\u6cd5\u65f6\uff1a DfmWidget.find_dfm_image(\"dfm_001\")\n \u81ea\u52a8\u8f93\u51fa\u7684\u65e5\u5fd7\uff1a >> x86_64-uos-6: 02/28 17:48:47 | INFO | logger_utils: [find_dfm_image]: \u67e5\u627e\u56fe\u7247 dfm_001.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e 0.9 \u7684\u5750\u6807\n \u52a0\u4e0a\u88c5\u9970\u5668 @log \u4e4b\u540e\uff0c\u65b9\u6cd5\u5c42\u6240\u6709\u7684\u51fd\u6570\uff08\u5305\u62ec\u5b9e\u4f8b\u65b9\u6cd5\u3001\u7c7b\u65b9\u6cd5\u3001\u9759\u6001\u65b9\u6cd5\uff09\u90fd\u4e0d\u9700\u8981\u518d\u5199\u65e5\u5fd7\u4ee3\u7801\uff0c\u6267\u884c\u7684\u65f6\u5019\u4f1a\u81ea\u52a8\u8f93\u51fa\uff0c\u5e76\u4e14\u6240\u6709\u8c03\u7528\u7684\u65b9\u6cd5\u4f1a\u4ee5 allure.step \u7684\u65b9\u5f0f\uff0c\u5c55\u793a\u5728 allure \u62a5\u544a\u4e2d\uff0c\u5728\u62a5\u544a\u4e2d\u66f4\u80fd\u4e00\u76ee\u4e86\u7136\u7684\u770b\u5230\u7528\u4f8b\u6267\u884c\u6b65\u9aa4\u3002 \u3010\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\u3011 \u901a\u8fc7\u89c2\u5bdf\u524d\u9762\u7684\u4f8b\u5b50\uff0c\u7ec6\u5fc3\u7684\u540c\u5b66\u53ef\u80fd\u8fd8\u53d1\u73b0\u4e86\u4e00\u4e2a\u5c0f\u7ec6\u8282\uff1a\u51fd\u6570\u529f\u80fd\u8bf4\u660e\u4e2d\uff0c\u4e24\u5bf9\u5927\u62ec\u53f7\u4e2d\u7684\u5185\u5bb9 {{elements}} \u4f5c\u4e3a\u53d8\u91cf\u8f93\u51fa\u51fa\u6765\u4e86\uff1b \u6ca1\u9519\uff0c\u8fd9\u5c31\u662f\u6211\u4eec\u53c2\u8003Django \u548c jinja2 \u7684\u6a21\u677f\u8bed\u6cd5\u8bbe\u8ba1\u51fa\u7684\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\uff0c\u4f7f\u7528\u65b9\u6cd5\u5f88\u7b80\u5355\uff0c\u7528\u4e24\u5bf9\u5927\u62ec\u53f7\u628a\u51fd\u6570\u7684\u53c2\u6570\u62ec\u8d77\u6765\uff0c\u8fd9\u6837\u5728\u65e5\u5fd7\u8f93\u51fa\u7684\u65f6\u5019\u5c31\u80fd\u628a\u8c03\u7528\u51fd\u6570\u65f6\u53c2\u6570\u7684\u503c\u8f93\u51fa\u51fa\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_7","title":"\u516b\u3001\u73af\u5883\u90e8\u7f72","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_6","title":"1\u3001\u539f\u5219","text":"YouQu \u7684\u73af\u5883\u4f9d\u8d56\u4e00\u76f4\u575a\u6301 2 \u4e2a\u539f\u5219\uff1a \u6700\u5c0f\u73af\u5883\u4f9d\u8d56\u539f\u5219 \u6709\u4e9b\u540c\u5b66\u5199\u4e00\u4e9b\u529f\u80fd\uff0c\u9996\u5148\u60f3\u5230\u7684\u5c31\u662f\u53bb\u641c\u7d22\u5f15\u64ce\u641c\u4e00\u4e0b\uff0c\u770b\u6709\u6ca1\u6709\u73b0\u6210\u7684\u5de5\u5177\u6216\u8005\u4ee3\u7801\u76f4\u63a5\u80fd\u7528\uff0c\u7f8e\u5176\u540d\u66f0\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\uff0c\u522b\u4eba\u5df2\u7ecf\u9020\u597d\u4e86\u8f6e\u5b50\u54b1\u4eec\u5c31\u4e0d\u8981\u91cd\u590d\u53bb\u9020\u4e86\uff0c\u7136\u540e\u4e00\u5207\u4f3c\u4e4e\u90fd\u53d8\u5f97\u90a3\u4e48\u7684\u7406\u6240\u5e94\u5f53\u3002 \u5f53\u7136\u8fd9\u6837\u505a\u65e0\u53ef\u539a\u975e\uff0c\u6211\u76f8\u4fe1\u6709\u8fd9\u6837\u60f3\u6cd5\u5e76\u4e14\u4e00\u76f4\u8df5\u884c\u8fd9\u6837\u505a\u6cd5\u7684\u540c\u5b66\u4e0d\u5728\u5c11\u6570\uff0c\u4f46\u8fd9\u6837\u505a\u6709\u4e00\u4e2a\u5f88\u4e25\u91cd\u7684\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f60\u5199\u4e00\u4e2a\u5927\u578b\u9879\u76ee\u65f6\uff0c\u4f60\u4f1a\u5f15\u5165\u975e\u5e38\u975e\u5e38\u975e\u5e38\u591a\u7684\u4f9d\u8d56\uff0c\u6bd4\u5982\u8981\u505a\u4e2a\u63a5\u53e3\u8bf7\u6c42\u8981\u7528 requests\u3001\u8bfb\u5199\u4e2a\u6570\u636e\u7528 pandas\u3001\u5199\u4e2a\u8868\u683c\u7528 pyopenxl\u3001\u89e3\u6790\u4e2a\u6587\u672c\u8981\u7528\u8fd9\u4e2a\u90a3\u4e2a\u4e09\u65b9\u5e93 ... \u3002 \u6211\u8ba4\u4e3a\u8fd9\u662f\u975e\u5e38\u4e0d\u597d\u7684\u4e60\u60ef\uff0c\u5728\u5b9e\u73b0\u4e00\u4e2a\u529f\u80fd\u7684\u65f6\u5019\uff0c\u9996\u5148\u6211\u4eec\u5e94\u8be5\u53bb\u60f3\u81ea\u5df1\u600e\u4e48\u6837\u53bb\u5b9e\u73b0\uff0c\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff1b \u5982\u679c\u4f60\u4e0d\u4f1a\uff0c\u4f60\u53ef\u4ee5\u53bb\u5b66\u4e60\u4e09\u65b9\u5e93\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u522b\u4eba\u4e09\u65b9\u5e93\u4e5f\u662f\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\u7684\uff0c\u4e3a\u4ec0\u4e48\u54b1\u4eec\u4e0d\u884c\u5462\uff1b\u5982\u679c\u522b\u4eba\u7684\u4f60\u5b9e\u5728\u662f\u770b\u4e0d\u61c2\uff0c\u60f3\u5c3d\u4e00\u5207\u529e\u6cd5\u786e\u5b9e\u505a\u4e0d\u51fa\u6765\uff0c\u90a3\u518d\u8003\u8651\u5f15\u5165\u8fd9\u4e2a\u4e09\u65b9\u5e93\uff0c\u6211\u8ba4\u4e3a\u8fd9\u6837\u662f\u6ca1\u95ee\u9898\u7684\uff0c\u6bd5\u7adf\u54b1\u4eec\u6bb5\u4f4d\u8fd8\u4e0d\u591f\uff0c\u4f46\u5e0c\u671b\u5c06\u6765\u6709\u4e00\u5929\u6211\u4eec\u53ef\u4ee5\u3002 \u8fd9\u6837\u7684\u505a\u6cd5\u624d\u5e94\u8be5\u662f\u201c\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\u201d\u6b63\u786e\u7684\u64cd\u4f5c\u3002\u4e0d\u4f1a\u6ca1\u5173\u7cfb\uff0c\u770b\u770b\u522b\u4eba\u662f\u600e\u4e48\u5b9e\u73b0\u7684\uff0c\u81ea\u5df1\u518d\u6478\u7d22\u7740\u5199\u51fa\u6765\uff0c\u8fd9\u6837\u81ea\u5df1\u624d\u80fd\u6709\u6240\u63d0\u9ad8\uff0c\u4e0d\u7136\u4f60\u5c31\u53ea\u4f1a\u7528\u522b\u4eba\u7684\u4e1c\u897f\uff1b\u90a3\u4e9b\u5632\u7b11\u3001\u6279\u8bc4\u6211\u4eec\u91cd\u590d\u9020\u8f6e\u5b50\u7684\u4eba\uff0c\u5148\u60f3\u60f3\u81ea\u5df1\u4f1a\u9020\u8f6e\u5b50\u5417\u3002 \u672c\u7740\u81ea\u5df1\u5b9e\u73b0\u80fd\u5b9e\u73b0\u7684\u4e00\u5207\u7684\u539f\u5219\uff0cYouQu \u6846\u67b6\u505a\u5230\u4e86\u975e\u5e38\u5c11\u7684\u73af\u5883\u4f9d\u8d56\uff0c\u800c\u4e14\u6211\u4eec\u4ecd\u5728\u4e0d\u65ad\u52aa\u529b\uff0c\u51cf\u5c11\u73af\u5883\u90e8\u7f72\u7684\u4f9d\u8d56\u3002 \u6700\u5c0f\u4ed3\u5e93\u4f53\u79ef\u539f\u5219 \u5927\u6587\u4ef6\u4e0d\u80fd\u4e0a\u4f20\u5230\u5de5\u7a0b\u91cc\u9762\uff0c\u4fdd\u6301\u6574\u4e2a\u5de5\u7a0b\u7684\u8f7b\u91cf\u5316\uff0c\u8fd9\u6837\u5728\u514b\u9686\u4ee3\u7801\u7684\u65f6\u5019\u624d\u80fd\u975e\u5e38\u5feb\u901f\u65b9\u4fbf\u4f7f\u7528\uff0c\u6211\u4eec\u89c1\u8fc7\u4e00\u4e2a AT \u5de5\u7a0b clone \u5927\u5c0f\u8fbe\u5230\u597d\u51e0\u4e2a G\uff0c\u7b80\u76f4\u4e0d\u53ef\u601d\u8bae\u3002 \u5176\u5b9e\u4ee3\u7801\u6587\u4ef6\u7684\u5927\u5c0f\u662f\u5f88\u5c0f\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u7eaf\u5199\u4ee3\u7801\u968f\u4fbf\u5199\u5de5\u7a0b\u4e5f\u4e0d\u4f1a\u592a\u5927\uff0c\u800c\u6587\u6863\uff08\u5305\u542b\u63d2\u56fe\uff09\u7b49\u8d44\u6e90\u5374\u662f\u5f88\u5360\u7a7a\u95f4\u3002 \u56e0\u6b64\u6211\u4eec\u9009\u62e9\u5c06 YouQu \u7684\u6587\u6863\u5de5\u7a0b\u6d89\u53ca\u5230\u7684\u56fe\u7247\u8d44\u6e90\u90fd\u91c7\u7528\u5916\u94fe\u52a0\u8f7d\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_6","title":"2\u3001\u5b89\u88c5","text":"\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u8fd0\u884c env.sh \u5373\u53ef\u3002 bash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_4","title":"3\u3001\u5b9a\u5236\u4f9d\u8d56","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_2","title":"3.1\u3001\u65b0\u589e\u4f9d\u8d56","text":"\u5982\u679c\u5e94\u7528\u5e93\u8fd8\u9700\u8981\u5176\u4ed6 Python \u4f9d\u8d56\u5e93\uff0c\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a requirement.txt \u6587\u4ef6\uff1b autotest_xxx\n\u251c\u2500\u2500 requirement.txt\n\u251c\u2500\u2500 case ...\n \u91cc\u9762\u5199\u5165\u9700\u8981\u5b89\u88c5\u7684\u4e09\u65b9\u4f9d\u8d56\uff0c\u6bd4\u5982\u50cf\u8fd9\u6837\uff1a # requirement.txt\nPyYAML==6.0 # \u6307\u5b9a\u5b89\u88c5\u67d0\u4e2a\u7248\u672c\nrequests # \u672a\u6307\u5b9a\u7248\u672c\u5219\u5b89\u88c5\u6700\u65b0\u7248\n \u5728\u6267\u884c bash env.sh \u65f6\u4f1a\u4e00\u5e76\u5c06\u5176\u5b89\u88c5\u3002 \u5982\u679c\u591a\u4e2a\u5e94\u7528\u5e93\u90fd\u5b58\u5728 requirement.txt \u6587\u4ef6\uff0c\u6267\u884c env.sh \u65f6\u4f1a\u5c06\u591a\u4e2a requirement.txt \u6587\u4ef6\u4e00\u5e76\u52a0\u8f7d\uff1b\u90a3\u4e48\u4e00\u5b9a\u8981\u6ce8\u610f\u591a\u4e2a requirement.txt \u6587\u4ef6\u53ef\u80fd\u5b58\u5728\u76f8\u540c\u7684\u4f9d\u8d56\u88ab\u6307\u5b9a\u5b89\u88c5\u4e0d\u540c\u7248\u672c\u7b49\u7b49\u517c\u5bb9\u6027\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32_1","title":"3.2\u3001\u88c1\u526a\u4f9d\u8d56","text":"\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0c\u53ef\u80fd\u4f60\u53ea\u9700\u8981\u5b89\u88c5\u4e00\u4e9b\u6700\u6700\u57fa\u7840\u7684\u4f9d\u8d56\uff0c\u5176\u4ed6\u7684\u90fd\u4e0d\u9700\u8981\uff0c\u6bd4\u5982\u7eaf\u63a5\u53e3\u81ea\u52a8\u5316\u7684\u9879\u76ee\uff0c\u5b83\u4e0d\u9700\u8981 UI \u81ea\u52a8\u5316\u76f8\u5173\u7684\u4f9d\u8d56\u3002 \u4f60\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\uff0c\u5b58\u653e\u4e00\u4e2a BASICENV \u7684\u666e\u901a\u6587\u4ef6\uff0c\u91cc\u9762\u4e0d\u9700\u8981\u5199\u4efb\u4f55\u5185\u5bb9\uff0c\u8fd9\u6837\u6267\u884c env.sh \u65f6\uff0c\u53ea\u4f1a\u5b89\u88c5\u6700\u57fa\u7840\u7684\u4f9d\u8d56\u3002 autotest_xxx\n\u251c\u2500\u2500 BASICENV # \u53ef\u4ee5\u4f7f\u7528\uff1atouch BASICENV \u521b\u5efa\u6587\u4ef6\n\u251c\u2500\u2500 case ...\n \u57fa\u7840\u4f9d\u8d56\u4ec5\u5b89\u88c5\u4ee5\u4e0b\u51e0\u4e2a\u5305\uff1a pytest # pytest\npytest-rerunfailures # \u5931\u8d25\u91cd\u8dd1\u63d2\u4ef6\npytest-timeout # \u7528\u4f8b\u8d85\u65f6\u63d2\u4ef6\nallure-pytest # \u751f\u6210 allure \u62a5\u544a\u63d2\u4ef6\nallure.deb # allure \u62a5\u544a\u67e5\u770b\u5de5\u5177\n \u88c1\u526a\u4f9d\u8d56 \u548c \u65b0\u589e\u4f9d\u8d56 \u662f\u4e0d\u51b2\u7a81\u7684\uff0c\u53ef\u4ee5\u540c\u65f6\u4f7f\u7528\u3002 \u6b64\u65b9\u6848\u9ed8\u8ba4\u4e3a\u865a\u62df\u73af\u5883\u90e8\u7f72\uff0c\u5982\u679c\u4f60\u60f3\u76f4\u63a5\u90e8\u7f72\u5728\u672c\u673a\u4e0a\uff1a bash env_dev.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_4","title":"4\u3001\u865a\u62df\u5316\u90e8\u7f72","text":"YouQu\u9ed8\u8ba4\u91c7\u7528\u865a\u62df\u5316\u90e8\u5206\uff0c\u865a\u62df\u5316\u73af\u5883\u5b9e\u9645\u5b89\u88c5\u7684\u4f4d\u7f6e\u662f\u5728 $HOME/.local/share/virtualenvs/youqu-oHTM7l7G \u76ee\u5f55\u4e0b youqu-oHTM7l7G \u6b64\u76ee\u5f55\u540d\u79f0\u524d\u9762\u90e8\u5206\u662f\u4f60\u7684\u4ee3\u7801\u6839\u76ee\u5f55\u7684\u540d\u79f0\uff0c\u540e\u9762\u90e8\u5206\u662f\u751f\u6210\u7684\u968f\u673a\u5b57\u7b26\u4e32\uff1b \u540c\u5b66\u4eec\u5728\u8fdc\u7a0b\u673a\u5668\u4e0a\u5b9a\u4f4d\u95ee\u9898\u7684\u65f6\u5019\uff0c\u5982\u679c\u4f7f\u7528 Pycharm \u8c03\u8bd5\uff0c\u5c31\u5c06\u89e3\u91ca\u5668\u6307\u5b9a\u5230\u8fd9\u4e2a\u76ee\u5f55\u7684\u5c31\u884c\u4e86\uff1b \u5f53\u7136\uff0c\u6211\u4eec\u4e5f\u63d0\u4f9b\u4e86\u672c\u673a\u5f00\u53d1\u73af\u5883\u90e8\u7f72\uff1a bash env_dev.sh\n \u5982\u679c\u4f60\u662f\u672c\u5730\u5f00\u53d1\u73af\u5883\u53ef\u4ee5\u7528\u5b83\uff0c\u533a\u522b\u5c31\u662f\u9a71\u52a8\u6267\u884c\u7684\u65f6\u5019\u4f7f\u7528\uff1apython3 manage.py xxx"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_8","title":"\u4e5d\u3001\u5931\u8d25\u5f55\u5c4f","text":"\u5f55\u5c4f\u5176\u5b9e\u662f\u4e00\u79cd\u89c6\u9891\u5f62\u5f0f\u7684\u65e5\u5fd7\uff0c\u56e0\u4e3a\u5f88\u591a\u65f6\u5019\u6211\u4eec\u5728\u67e5\u770b\u65e5\u5fd7\u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u51c6\u786e\u7684\u5b9a\u4f4d\u5230\u7528\u4f8b\u5931\u8d25\u7684\u5177\u4f53\u539f\u56e0\uff0c\u56e0\u6b64\u7528\u4f8b\u7684\u5f55\u5c4f\u80fd\u8ba9\u6211\u4eec\u770b\u5230\u7528\u4f8b\u5728\u6267\u884c\u8fc7\u7a0b\uff1b \u3010\u4f7f\u7528\u65b9\u6cd5\u3011 \u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u5173\u6ce8 2 \u4e2a\u53c2\u6570\uff1b ;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\u3002\n;\u6ce8\u610f\uff0c\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u4e0d\u80fd\u5c0f\u4e8e\u5931\u8d25\u5f55\u5c4f\u6b21\u6570\uff0c\u5373 RERUN >= RECORD_FAILED_CASE\nRECORD_FAILED_CASE = 1\n \u9ed8\u8ba4\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u662f 1 \u6b21\uff1b RECORD_FAILED_CASE = 1 \u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff1b RECORD_FAILED_CASE = 0 \u8868\u793a\u4e0d\u7ba1\u7528\u4f8b\u6210\u529f\u6216\u5931\u8d25\u90fd\u5f55\u5c4f\uff1b \u5f55\u5c4f\u662f\u8981\u5360\u7528\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u7279\u522b\u662f\u5728\u4e00\u4e9b\u914d\u7f6e\u8f83\u4f4e\u7684\u673a\u5668\u4e0a\u4f1a\u5f88\u660e\u663e\uff0c\u6240\u4ee5\u4f60\u9700\u8981\u8003\u8651\u662f\u5426\u6709\u5fc5\u8981\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1b \u4f7f\u7528 manage.py \u6267\u884c\u7528\u4f8b\u9ed8\u8ba4\u8bfb\u53d6\u5230 globalconfig.ini \u91cc\u9762\u7684\u53c2\u6570\uff0c\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report/record \u76ee\u5f55\u4e0b\u4fdd\u5b58\u5931\u8d25\u7528\u4f8b\u7684\u5f55\u5c4f\u548c\u65ad\u8a00\u7684\u90a3\u4e2a\u65f6\u95f4\u70b9\u7684\u622a\u5c4f\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7\u89c6\u9891\u6587\u4ef6\u770b\u5230\u5931\u8d25\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u90fd\u53d1\u751f\u4e86\u4ec0\u4e48\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#wayland","title":"\u5341\u3001Wayland \u9002\u914d","text":"Wayland \u4e0b\u81ea\u52a8\u5316\u4e3b\u8981\u95ee\u9898\u662f X11 \u4e0b\u7684\u952e\u9f20\u64cd\u4f5c\u65b9\u6cd5\u65e0\u6cd5\u4f7f\u7528\uff0c\u6bd4\u5982 Xdotool\u3001 PyAutoGUI\u3001Xwininfo \u7b49\u7b49\uff1b YouQu \u5728 Wayland \u4e0b\u517c\u5bb9\u9002\u914d\uff0cenv.sh \u5728 Wayland \u4e0b\u6267\u884c\u65f6\u4f1a\u5b89\u88c5\u81ea\u7814\u7684\u952e\u9f20\u64cd\u4f5c\u670d\u52a1\uff08\u53ef\u80fd\u5b58\u5728\u4e00\u4e9b\u4f9d\u8d56\u62a5\u9519\uff0c\u6309\u7167\u6ce8\u91ca\u89e3\u51b3\u5373\u53ef\uff09\uff0c\u6846\u67b6\u6838\u5fc3\u5e93\u4e5f\u9488\u5bf9\u6027\u7684\u505a\u4e86\u9002\u914d\uff0c\u4e0a\u5c42\u7528\u4f8b\u5b8c\u5168\u4e0d\u7528\u5173\u5fc3\u673a\u5668\u662fWayland \u8fd8\u662f X11\uff0c\u6846\u67b6\u4f1a\u6839\u636e\u6267\u884c\u65f6\u72b6\u6001\u81ea\u52a8\u5224\u65ad\u8d70\u4e0d\u540c\u7684\u903b\u8f91\uff1b \u7b80\u5355\u8bb2\u5c31\u662f\uff0c\u5e94\u7528\u5e93\u53ea\u9700\u8981\u7ef4\u62a4\u4e00\u5957\u7528\u4f8b\u811a\u672c\u5373\u53ef\u3002 \u3010\u7528\u4f8b\u517c\u5bb9\u3011 \u56e0\u4e3a Wayland \u4e0b\u6709\u4e9b\u5e94\u7528\u7684\u754c\u9762\u663e\u793a\u548c\u529f\u80fd\u672c\u8eab\u5b58\u5728\u4e00\u4e9b\u5dee\u5f02\uff0c\u7528\u4f8b\u5c42\u53ef\u80fd\u9700\u8981\u5bf9\u8fd9\u90e8\u5206\u7528\u4f8b\u505a\u903b\u8f91\u5224\u65ad\uff0c\u4f7f\u7528\u5168\u5c40\u914d\u7f6e\u91cc\u9762\u7684\u5e38\u91cf\u8fdb\u884c\u903b\u8f91\u7f16\u5199\u5373\u53ef\uff1a from setting.globalconfig import GlobalConfig\n# GlobalConfig.IS_WAYLAND \u83b7\u53d6\u5230\u5f53\u524d\u7684\u663e\u793a\u670d\u52a1\u5668\uff08bool\uff09\n# \u5e94\u7528\u5e93 Config \u7ee7\u627f GlobalConfig\nif Config.IS_WAYLAND:\npass\nif Config.IS_X11:\npass\n \u6bd4\u5982\u7528\u4f8b\u91cc\u9762\u5982\u679c\u65ad\u8a00\u7684\u56fe\u7247\u4e0d\u540c\uff1a if Config.IS_WAYLAND:\nself.assert_image_exist(\"wayland_XXX\")\nelse:\nself.assert_image_exist(\"x11_XXX\")\n \u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u811a\u672c\u5728 Wayland \u548c X11 \u4e0b\u90fd\u53ef\u4ee5\u8dd1\uff0cso easy \u662f\u4e0d\u662f\uff1f\u5b8c\u5168\u6ca1\u5fc5\u8981\u4e13\u95e8\u62c9\u65b0\u5206\u652f\u8fdb\u884c Wayland \u9002\u914d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_9","title":"\u5341\u4e00\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_7","title":"1. \u76ee\u5f55\u7ed3\u6784","text":"\u6267\u884c\u65f6\u4f1a\u5728\u6839\u76ee\u5f55\u4e0b\u52a8\u6001\u751f\u6210 report \u76ee\u5f55\uff0c\u6240\u6709\u7684\u62a5\u544a\u76f8\u5173\u7684\u6587\u4ef6\u4f1a\u7edf\u4e00\u5b58\u653e\u5728\u91cc\u9762\uff0c\u793a\u4f8b\uff1a /report\n \u251c\u2500\u2500 allure # allure\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json\n \u251c\u2500\u2500 allure_html # \u751f\u6210\u7684html\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 index.html \u251c\u2500\u2500 allure_back # allure\u62a5\u544a\u5907\u4efd\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 20221108114823\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json\n \u251c\u2500\u2500 json # json\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 result_deepin-music_20221109134736_1081333.json\n \u251c\u2500\u2500 logs # \u65e5\u5fd7\u6587\u4ef6\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 2022-11-10_debug.log \u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-10_error.log\n \u251c\u2500\u2500 record # \u5f55\u5c4f\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-09\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 15\u65f614\u520609\u79d2_test_music_303_2_autotest.mp4\n \u2514\u2500\u2500 xml # xml\u62a5\u544a\n\u2514\u2500\u2500 autotest_deepin_music-20221109134736.xml\n \u9ed8\u8ba4\u60c5\u51b5\u4e0b\u540c\u65f6\u751f\u6210 html\u3001xml\u3001json\u4e09\u79cd\u5f62\u5f0f\u7684\u62a5\u544a\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_7","title":"2. \u5b9a\u5236\u62a5\u544a","text":"\u6211\u4eec\u5bf9 allure \u62a5\u544a\u8fdb\u884c\u4e86\u4e00\u7cfb\u5217\u7684\u5b9a\u5236\uff1a \u5b9a\u5236 logo\u3001title\u3001\u62a5\u544a\u9ed8\u8ba4\u8bed\u8a00\u4e3a\u4e2d\u6587\uff1b \u52a0\u5165\u4e86\u7528\u4f8b\u65ad\u8a00\u5931\u8d25\u65f6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u4ee5\u53ca\u6b64\u65f6\u56fe\u50cf\u5bf9\u6bd4\u7684\u6a21\u677f\u56fe\u7247\uff1b \u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\uff0c\u4f60\u53ef\u4ee5\u5728 html \u62a5\u544a\u4e2d\u76f4\u63a5\u770b\u5f55\u5236\u7684\u89c6\u9891\uff1b \u52a0\u5165\u4e86 IP \u5730\u5740\u3001\u7cfb\u7edf\u4fe1\u606f\u3001\u955c\u50cf\u7248\u672c\u7b49\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_5","title":"3. \u67e5\u770b\u62a5\u544a","text":" \u672c\u5730\u6267\u884c \u5728 report/allure \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u4e00\u5806\u6587\u672c\u6587\u4ef6\uff0c\u8fd9\u4e9b\u662f allure \u63d2\u4ef6\u751f\u6210\u7684\u62a5\u544a\u6e90\u6570\u636e\uff0c\u6211\u4eec\u5728 report/allure_html \u76ee\u5f55\u4e0b\u7ed9\u4f60\u751f\u6210\u4e86 html \u6587\u4ef6\uff0c\u4f46\u662f\u4f60\u4e0d\u80fd\u76f4\u63a5\u901a\u8fc7\u6d4f\u89c8\u5668\u6253\u5f00 index.html \u6587\u4ef6\uff0c\u56e0\u4e3a allure \u7684\u62a5\u544a\u90fd\u662f\u57fa\u4e8e\u5728\u7ebf\u7684\u670d\u52a1\uff0c\u4f60\u5e94\u8be5\u8fd9\u6837\u6253\u5f00\uff1a allure open report/allure_html\n \u4f7f\u7528 manage.py \u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u5728\u7ec8\u7aef\u7684\u6700\u540e\u4e00\u884c\uff0c\u6211\u4eec\u4f1a\u7ed9\u4f60\u8f93\u51fa\u6253\u5f00\u62a5\u544a\u7684\u547d\u4ee4\uff0c\u76f4\u63a5\u590d\u5236\u5b83\u5728\u7ec8\u7aef\u6267\u884c\u5c31\u53ef\u4ee5\u67e5\u770b\u4e86\uff0c\u50cf\u8fd9\u6837\uff1a \u7ec8\u7aef\u6267\u884c\u547d\u4ee4: allure open /tmp/youqu/report/allure_html \u67e5\u770b\u62a5\u544a \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 Pycharm \u91cc\u9762\u627e\u5230 index.html \u6587\u4ef6\uff0c\u7136\u540e\u53f3\u952e\u9009\u62e9\u6d4f\u89c8\u5668\u6253\u5f00\uff0c\u6216\u8005\u4f60\u53ef\u4ee5\u7528\u4e00\u4e2a http \u670d\u52a1\u6253\u5f00\u3002 \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 report/allure \u76ee\u5f55\u4e0b\u67e5\u770b\u62a5\u544a\uff1a allure serve report/allure\n \u8fdc\u7a0b\u6267\u884c \u8fdc\u7a0b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\uff0c\u4f1a\u5c06\u6240\u6709\u8fdc\u7a0b\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u62a5\u544a\u90fd\u6536\u96c6\u5230 report/allure \u76ee\u5f55\u4e0b\uff0c\u5206\u522b\u6309\u7167\u673a\u5668\u7684 IP \u7b49\u5efa\u4e86\u4e0d\u540c\u7684\u76ee\u5f55\uff0c\u4f60\u53ef\u4ee5\u5728\u8fd9\u4e9b\u76ee\u5f55\u91cc\u9762\u53bb\u67e5\u770b\u5bf9\u5e94\u7684\u6d4b\u8bd5\u62a5\u544a\uff0c\u67e5\u770b\u65b9\u6cd5\u548c\u524d\u9762\u672c\u5730\u6267\u884c\u67e5\u770b\u7684\u65b9\u6cd5\u4e00\u6837\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_10","title":"\u5341\u4e8c\u3001\u9759\u6001\u4ee3\u7801\u626b\u63cf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_8","title":"1. \u63d0\u524d\u89e3\u51b3\u4ee3\u7801\u95ee\u9898","text":"\u4e3a\u4e86\u5e2e\u52a9\u5f00\u53d1\u8005\u7edf\u4e00\u4ee3\u7801\u98ce\u683c\uff0cPython \u793e\u533a\u63d0\u51fa\u4e86 PEP8 \u4ee3\u7801\u7f16\u7801\u98ce\u683c\uff0cPython \u5b98\u65b9\u540c\u65f6\u63a8\u51fa\u4e86\u4e00\u4e2a\u68c0\u67e5\u4ee3\u7801\u98ce\u683c\u662f\u5426\u7b26\u5408 PEP8 \u7684\u5de5\u5177\uff0c\u540d\u5b57\u4e5f\u53eb PEP8\u3002 \u4f46\u662f\uff0cPycharm \u91cc\u9762\u7684 PEP8 \u63d2\u4ef6\u5b9e\u9645\u4e0a\u5e76\u4e0d\u80fd\u53d1\u73b0\u5f88\u591a\u4ee3\u7801\u95ee\u9898\uff0c\u8fd9\u4e9b\u95ee\u9898\u5e76\u4e0d\u4f1a\u5728\u8fd0\u884c\u65f6\u62a5\u9519\uff0c\u56e0\u4e3a\u4ece Python \u8bed\u8a00\u89d2\u5ea6\u5e76\u4e0d\u5173\u5fc3\u8fd9\u4e9b\u95ee\u9898\uff0c\u5728 Pycharm \u7f16\u8f91\u5668\u91cc\u9762\u4f7f\u7528\u5feb\u6377\u952e ctrl + alt + L\uff0c\u6709\u4e00\u70b9\u70b9\u683c\u5f0f\u5316\u7684\u6548\u679c\uff0c\u80fd\u89e3\u51b3\u4e00\u4e9b\u7a7a\u683c\u3001\u6362\u884c\u7b49\u5c0f\u95ee\u9898\u3002 \u8fd9\u91cc\u63a8\u8350\u4e00\u4e2a Python \u793e\u533a\u6d41\u884c\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff1a Black\uff0c\u53f7\u79f0\u4e0d\u59a5\u534f\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff0c\u5b83\u68c0\u6d4b\u5230\u4e0d\u7b26\u5408\u89c4\u8303\u7684\u4ee3\u7801\u98ce\u683c\u76f4\u63a5\u5c31\u5e2e\u4f60\u5168\u90e8\u683c\u5f0f\u5316\u597d\uff0c\u5c31\u662f\u8fd9\u4e48\u521a\uff01 \u5b89\u88c5\uff1a sudo pip3 install black \n \u4f7f\u7528\u65b9\u6cd5\uff1a black ${CheckPath}\n \u4f7f\u7528\u8fd9\u4e2a\u5de5\u5177\u683c\u5f0f\u5316\u4e4b\u540e\uff0c\u4ee3\u7801\u4f1a\u88ab\u81ea\u52a8\u8c03\u6574\uff0c\u521a\u5f00\u59cb\u4f60\u53ef\u80fd\u4f1a\u89c9\u5f97\u8c03\u6574\u5f97\u5f88\u5938\u5f20\uff0c\u6ca1\u5173\u7cfb\u575a\u6301\u770b\uff0c\u4e60\u60ef\u4e4b\u540e\uff0c\u4f60\u4f1a\u89c9\u5f97\u5f88\u4f18\u96c5\uff0c\u6ca1\u9519\uff0c\u8fd9\u5c31\u662f Pythonic Code \u7684\u6838\u5fc3\uff0c\u8bf7\u4fdd\u6301\u4f18\u96c5\uff5e\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_8","title":"2. \u4ee3\u7801\u626b\u63cf\u5de5\u5177","text":"\u4f7f\u7528\u6839\u76ee\u5f55\u4e0b pylint.sh \u626b\u63cf\u4ee3\u7801\uff0c\u5728 report \u76ee\u5f55\u4e0b\u67e5\u770b\u4ee3\u7801\u626b\u63cf\u62a5\u544a\uff0c\u5982\u679c\u6709\u4ee3\u7801\u95ee\u9898\u8bf7\u63d0\u524d\u89e3\u51b3\u4e4b\u540e\u518d\u63d0\u4ea4\u3002 \u6b64\u811a\u672c\u5df2\u7ecf\u4f7f\u7528 Python \u793e\u533a\u6700\u6d41\u884c\u7684\u4ee3\u7801\u626b\u63cf\u5de5\u5177 Pylint \u8fdb\u884c\u4ee3\u7801\u626b\u63cf\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a bash pylint.sh\n \u8fd0\u884c\u4e4b\u540e\u4f1a\u63d0\u793a\u4f60\u8981\u626b\u63cf\u7684\u76ee\u5f55\uff0c\u6bd4\u5982\u8f93\u5165 apps \uff0c\u5219\u4f1a\u626b\u63cf apps \u4e0b\u7684\u6240\u6709 Python \u4ee3\u7801\u3002 \u5728 setting/pylintrc.cfg \u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u76f8\u5173\u914d\u7f6e\uff0c\u626b\u63cf\u5b8c\u6210\u4e4b\u540e\u5728 report/pylints \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u626b\u63cf\u62a5\u544a\u3002 \u4ee3\u7801\u63d0\u4ea4\u9700\u901a\u8fc7 git review \u63d0\u4ea4\u5230 gerrit \uff0c\u4eba\u5de5 Code Review \u901a\u8fc7\u4e4b\u540e\u5408\u5165\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_11","title":"\u5341\u4e09\u3001\u63d0\u4ea4\u4ee3\u7801","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_9","title":"1. \u5b89\u88c5\u4f9d\u8d56","text":"sudo apt install git-review\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_9","title":"2. \u63d0\u4ea4\u6a21\u677f","text":"\u5728 ~ \u76ee\u5f55\u4e0b\u65b0\u5efa\u6587\u4ef6\uff0c\u5e76\u547d\u540d\u4e3a gitcommit_template \u5c06\u4ee5\u4e0b\u5185\u5bb9\u5199\u5165\u6587\u4ef6\u5f53\u4e2d\uff1a # commit type :fix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style(\u98ce\u683c\u4fee\u6539)\u3001refactor(\u91cd\u6784)\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test(\u6d4b\u8bd5) + \u7b80\u5355\u63cf\u8ff0. \u9ed8\u8ba4fix,\u6839\u636e\u60c5\u51b5\u4fee\u6539\nfix: \n\n# \u8be6\u7ec6\u8bf4\u660e\u4ee3\u7801\u7684\u6539\u52a8\uff0c\u5305\u542b\u4ee3\u7801\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u4ee5\u53ca\u4e3a\u4ec0\u4e48\u8fd9\u4e48\u505a\uff0c\u53ef\u80fd\u4f1a\u5f71\u54cd\u54ea\u4e9b\u529f\u80fd\u3002\u5bf9\u4e8e\u4ee3\u7801\u7684\u5ba1\u6838\u8005\uff0c\u9700\u8981\u4ece\u8fd9\u6bb5\u63cf\u8ff0\u4e2d\u80fd\u5b8c\u5168\u7406\u89e3\u4ee3\u7801\u4e2d\u6240\u6709\u6539\u52a8\u7684\u5185\u5bb9\nDescription: \n\n# \u5199\u4e00\u6bb5\u9762\u5411\u4e8e\u4ea7\u54c1\u7684\u603b\u7ed3\u6027\u5185\u5bb9\uff0c\u7528\u4e8e\u81ea\u52a8\u751f\u6210crp\u4e0a\u7684changlog\uff0c\u9700\u8981\u6ce8\u610f\u7684\u4e8b\uff0c\u8fd9\u6bb5\u63cf\u8ff0\u5fc5\u987b\u4ece\u4ea7\u54c1\u7684\u89d2\u5ea6\u8003\u8651\u3002\nLog: \n\n# \u5173\u8054pms\u4e0a\u7684bug\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94bug\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4fee\u590dbug\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Bug: \n\n# \u4fee\u590d github issue \n#Issue: \n\n# \u5173\u8054pms\u4e0a\u7684\u4efb\u52a1\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94\u4efb\u52a1\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4efb\u52a1\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Task: \n \u547d\u4ee4\u884c\u6267\u884c: git config --global commit.template ~/gitcommit_template\n \u6b64\u547d\u4ee4\u5c06\u6a21\u677f\u52a0\u5165\u5230 git \u7684\u63d0\u4ea4\u6a21\u677f\u4e2d\u3002 \u540e\u7eed\u63d0\u4ea4\u7684\u65f6\u5019\u9700\u8981\u5173\u6ce8\u4e00\u4e0b\u51e0\u70b9\uff1a commit type \u5bf9\u5e94\u4e0d\u540c\u7684\u4fee\u6539\u7c7b\u578b\uff1afix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style \uff08\u98ce\u683c\u4fee\u6539\uff09\u3001refactor \uff08\u91cd\u6784\uff09\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test \uff08\u6d4b\u8bd5\uff09 commit type \u5192\u53f7\u540e\u9762\u52a0\u7a7a\u683c\u3002 Description \u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u9700\u8981\u8fdb\u884c\u8be6\u7ec6\u8bf4\u660e\uff0c\u6bd4\u5982\u5bf9\u529f\u80fd\u8fdb\u884c\u5927\u6539\u7b49\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_6","title":"3. \u63a8\u9001\u4ee3\u7801","text":"\u9996\u5148\u6dfb\u52a0 commit \u4fe1\u606f git add \u540e\u9762\u52a0\u6587\u4ef6\u540d\u79f0\n git add . # \u8868\u793a\u6dfb\u52a0\u6240\u6709\u6587\u4ef6\n \u4f7f\u7528\u8fd9\u6761\u547d\u4ee4\u6ce8\u610f\u6709\u4e9b\u4e34\u65f6\u6587\u4ef6\u4e0d\u8981\u63d0\u4ea4\u5230\u4ed3\u5e93\u4e86\u3002 git commit -a\n \u4e4b\u540e\u5728 fix: \u540e\u9762\uff08\u6ce8\u610f\u5192\u53f7\u540e\u9762\u5fc5\u987b\u52a0\u7a7a\u683c\uff0c\u4e0d\u7136\u76f4\u63a5-1\uff09\u5199\u672c\u5730\u63d0\u4ea4\u7684 commit \u4fe1\u606f\uff0c\u7136\u540e\u5c31\u53ef\u4ee5\u63d0\u4ea4\u4ee3\u7801\u4e86 git review branch(\u5f53\u524d\u5206\u652f) -r origin\n \u6700\u597d\u4e00\u6b21 commit\uff0c\u4e00\u6b21 git review \uff0c\u7ecf\u5e38\u6709\u540c\u5b66\u5728\u672c\u5730\u75af\u72c2 commit \u6700\u540e git review \u62a5\u9519\u4e0d\u77e5\u9053\u548b\u56de\u4e8b\u513f\u3002 \u82e5\u4e0d\u60f3\u6bcf\u6b21\u63d0\u4ea4\u90fd\u52a0\u4e0a -r \u9009\u9879\uff0c\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a git config --global gitreview.remote origin \u63d0\u4ea4\u4ee3\u7801\uff0c\u76f4\u63a5\u4f7f\u7528 git review branch<\u76ee\u6807\u5206\u652f>\uff0c\u4f8b\u5982 git review master"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git","title":"4. Git\u6807\u7b7e","text":"Git \u6807\u7b7e\u5b9e\u9645\u4e0a\u662f commit \u7684\u4e00\u4e2a\u522b\u540d\uff0c\u4e3b\u8981\u7528\u4e8e\u7ba1\u7406\u5386\u53f2\u7248\u672c\u3002 \u60f3\u8c61\u4e00\u4e0b\u9886\u5bfc\u8ba9\u4f60\u628a\u4e4b\u524d\u7684\u67d0\u4e2a\u7248\u672c\u7684\u4ee3\u7801\u62c9\u51fa\u6765\u8dd1\uff0c\u4f60\u662f\u4e0d\u662f\u4e56\u4e56\u7684\u53bb\u628a\u6240\u6709\u63d0\u4ea4\u8bb0\u5f55\u62c9\u51fa\u6765\u627e\uff0c\u7136\u540e\u627e\u5230\u90a3\u4e2a\u54c8\u5e0c\u503c\uff0c\u901a\u8fc7\u54c8\u5e0c\u503c\u6765\u68c0\u51fa\u4ee3\u7801\u3002 \u8fd9\u4e00\u5957\u64cd\u4f5c\u4e0b\u6765\u662f\u4e0d\u662f\u5f88\u9ebb\u70e6\uff0c\u8d39\u65f6\u95f4\u8fd8\u4e0d\u4e00\u5b9a\u80fd\u627e\u5f97\u5230\uff0c\u6ca1\u4eba\u80fd\u8bb0\u4f4f\u6bcf\u4e2a\u63d0\u4ea4\u54c8\u5e0c\u503c\u4ee5\u53ca\u8fd9\u6b21\u63d0\u4ea4\u90fd\u6539\u4e86\u54ea\u4e9b\u4ee3\u7801\u3002 \u56e0\u6b64\u7ed9\u63d0\u4ea4\u6253\u4e2a\u6807\u7b7e\uff0c\u5c31\u662f\u628a\u54c8\u5e0c\u503c\u8f6c\u6362\u6210\u4eba\u7c7b\u80fd\u7406\u89e3\u7684\u8bed\u8a00\uff0c\u6bd4\u5982 v1.0\uff0c\u5c31\u53ef\u4ee5\u76f4\u63a5\u901a\u8fc7\u6807\u7b7e\u627e\u5230\u5bf9\u5e94\u7684\u63d0\u4ea4\u3002 \u65b0\u5efa\u6807\u7b7e git tag -a <tagname>\n \u56de\u8f66\u4e4b\u540e\uff0cGit \u4f1a\u6253\u5f00\u4f60\u7684\u7f16\u8f91\u5668\uff0c\u8ba9\u4f60\u5199\u4e00\u53e5\u6807\u7b7e\u6ce8\u89e3\uff0c\u5c31\u50cf\u4f60\u7ed9\u63d0\u4ea4\u5199\u6ce8\u89e3\u4e00\u6837\u3002 \u67e5\u770b\u6240\u6709\u6807\u7b7e git tag -l\n# git tag \u4e5f\u884c\n \u5220\u9664\u6807\u7b7e git tag -d <tagname>\n \u63a8\u9001\u6807\u7b7e\u81f3\u8fdc\u7a0b git push \u547d\u4ee4\u5e76\u4e0d\u4f1a\u4f20\u9001\u6807\u7b7e\u5230\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\uff0c\u5fc5\u987b\u663e\u5f0f\u5730\u63a8\u9001\u6807\u7b7e\u3002 git push origin <tagname>\n \u63a8\u9001\u6240\u6709\u4e0d\u5728\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\u7684\u6807\u7b7e git push origin --tag\n \u5220\u9664\u8fdc\u7a0b\u6807\u7b7e git push origin :refs/tag/<tagname>\n \u540e\u671f\u6253\u6807\u7b7e \u5148\u7528 git log --pretty=oneline \u67e5\u8be2\u63d0\u4ea4\u8bb0\u5f55\uff0c\u83b7\u53d6\u6821\u9a8c\u7801\u3002 git tag -a <tagname> 9fceb02(\u6821\u9a8c\u7801)\n \u68c0\u51fa\u6807\u7b7e git checkout <tagname>\n \u6b64\u65f6\uff0c\u4ed3\u5e93\u4f1a\u5904\u4e8e\u201c\u5206\u79bb\u5934\u6307\u9488\uff08detached HEAD\uff09\u201d\u7684\u72b6\u6001\u3002 \u5728\u201c\u5206\u79bb\u5934\u6307\u9488\u201d\u72b6\u6001\u4e0b\uff0c\u5982\u679c\u4f60\u505a\u4e86\u67d0\u4e9b\u66f4\u6539\u7136\u540e\u63d0\u4ea4\u5b83\u4eec\uff0c\u6807\u7b7e\u4e0d\u4f1a\u53d1\u751f\u53d8\u5316\uff0c \u4f46\u4f60\u7684\u65b0\u63d0\u4ea4\u5c06\u4e0d\u5c5e\u4e8e\u4efb\u4f55\u5206\u652f\uff0c\u5e76\u4e14\u5c06\u65e0\u6cd5\u8bbf\u95ee\uff0c\u9664\u975e\u901a\u8fc7\u786e\u5207\u7684\u63d0\u4ea4\u54c8\u5e0c\u624d\u80fd\u8bbf\u95ee\u3002 \u56e0\u6b64\uff0c\u5982\u679c\u4f60\u9700\u8981\u8fdb\u884c\u66f4\u6539\uff0c\u6bd4\u5982\u4f60\u8981\u4fee\u590d\u65e7\u7248\u672c\u4e2d\u7684\u9519\u8bef\uff0c\u90a3\u4e48\u901a\u5e38\u9700\u8981\u521b\u5efa\u4e00\u4e2a\u65b0\u5206\u652f\uff1a git checkout -b <NewBranchName> <tagname>\n \u65b0\u5206\u652f\u4e0a\u53ef\u4ee5\u8fdb\u884c\u63d0\u4ea4\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_12","title":"\u5341\u56db\u3001\u5e38\u89c1\u95ee\u9898","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_10","title":"1. \u63d0\u4ea4\u4ee3\u7801\u65f6\u63d0\u793a\u90ae\u7bb1\u6216\u8005\u540d\u79f0\u4e0d\u5bf9","text":"\u91cd\u65b0\u914d\u7f6e\u90ae\u7bb1\u6216\u8005\u540d\u79f0\uff0c\u7136\u540e\u91cd\u7f6e\u751f\u6548\uff1a git commit --amend --reset-author\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_10","title":"2. \u600e\u4e48\u56de\u6eda\u5230\u4e4b\u524d\u7684\u7248\u672c","text":"(1)\u67e5\u8be2\u5386\u53f2\u63d0\u4ea4\u8bb0\u5f55 git log\n \u627e\u5230\u4f60\u8981\u56de\u6eda\u7684\u7248\u672c\uff0c\u590d\u5236 hash \u503c\u3002 \u6ce8\u610f\uff1a\u662f commit \u7a7a\u683c\u4e4b\u540e\u7684 hash \u503c\uff0c\u4e4b\u524d\u6709\u540c\u5b66\u590d\u5236\u7684 Change-Id: \u8fd9\u6837\u80af\u5b9a\u62a5\u9519\u3002 (2)\u56de\u6eda\u7248\u672c\uff0c\u4e0d\u6e05\u9664\u4ee3\u7801 git reset --soft ${hash}\n (3)\u56de\u6eda\u7248\u672c\uff0c\u6e05\u9664\u4ee3\u7801\uff0c\u614e\u7528\u54c8 git reset --hard ${hash}\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-f-s-e","title":"3. \u6d4b\u8bd5\u62a5\u544a\u91cc\u9762 F S . E \u662f\u4ec0\u4e48\u610f\u601d","text":"F \u8868\u793a\u5931\u8d25\uff0c. \uff08\u70b9\uff09\u8868\u793a\u901a\u8fc7\uff0cS \u8868\u793a\u8df3\u8fc7\uff0cE \u8868\u793a error \u6709\u62a5\u9519"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git-status","title":"4. \u89e3\u51b3 git status \u4e2d\u6587\u663e\u793a\u7684\u95ee\u9898","text":"git config --global core.quotePath false\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5-apps","title":"5. apps \u76ee\u5f55\u4e0b\u989c\u8272\u6709\u4e9b\u662f\u9ec4\u8272\u7684","text":"\u5728 Pycharm \u4e2d apps \u76ee\u5f55\u4e0b\u5e94\u7528\u5e93\u6587\u4ef6\u662f\u9ec4\u8272\u7684\uff0c\u7f16\u8f91\u5668\u8bc6\u522b\u4e0d\u5230\u4ee3\u7801\u65b0\u589e\u548c\u4fee\u6539\uff1b \u7531\u4e8e\u793e\u533a\u7248 Pycharm \u4e0d\u80fd\u52a8\u6001\u8bc6\u522b\u591a\u4ed3\u5e93\uff0c\u9700\u8981\u5728 setting \u91cc\u9762\u624b\u52a8\u6ce8\u518c\uff0c\u64cd\u4f5c\u6b65\u9aa4\uff1a File \u2014> Settings \u2014> Version Control \u2014> \u70b9 + \u53f7 \u2014> Directory \u9009\u4e2d\u5e94\u7528\u5e93\u5de5\u7a0b\u76ee\u5f55 \u2014> VCS \u9009\u4e2d Git \u2014> Apply \u5982\u6b64\u5c31\u53ef\u4ee5\u4e86\u3002 \u4e13\u4e1a\u7248 Pycharm \u4e0d\u5b58\u5728\u8fd9\u4e2a\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#6-envsh-r","title":"6. \u6267\u884c env.sh \u62a5\u9519 $'\\r':\u672a\u627e\u5230\u547d\u4ee4","text":"\u51fa\u73b0\u8fd9\u4e2a\u95ee\u9898\u4f60\u5e94\u8be5\u662f\u5728 windows \u4e0a\u6253\u5f00\u6216\u7f16\u8f91\u8fc7 env.sh \u811a\u672c\uff0cwindows\u4e0b\u7684\u6362\u884c\u662f\u56de\u8f66\u7b26+\u6362\u884c\u7b26\uff0c\u4e5f\u5c31\u662f\\r\\n\uff0c\u800c Linxu \u4e0b\u662f\u6362\u884c\u7b26 \\n\uff0cLinux \u4e0b\u4e0d\u8bc6\u522b \\r\uff0c\u56e0\u6b64\u62a5\u9519\u3002 \u89e3\u51b3\u65b9\u6848\uff1a # \u5c06 \\r \u66ff\u6362\u4e3a\u7a7a\nsudo sed -i 's/\\r//' env.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#7","title":"7.\u600e\u6837\u4e3a\u5355\u72ec\u67d0\u4e00\u6761\u7528\u4f8b\u914d\u7f6e\u6267\u884c\u8d85\u65f6\u65f6\u95f4","text":"\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u5982\u4e0b\uff1a @pytest.mark.timeout(300) # \u5355\u4f4d\u79d2\ndef test_xxx_001():\npass\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#8-youqu","title":"8. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u6240\u6709\u4ee3\u7801\uff0c\u5305\u542b\u5b50\u4ed3\u5e93","text":"\u524d\u7f6e\u6761\u4ef6\uff1a\u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 # \u7b2c\u4e00\u6b21\u5b58\u50a8\u5bc6\u7801\uff0c\u63d0\u4f9b\u540e\u9762\u62c9\u4ee3\u7801(gerrit: ldap\u8d26\u53f7\u548c\u5bc6\u7801\uff0cgit\u62c9\u53d6\u7b2c\u4e00\u6b21\u8f93\u5165\u4fdd\u5b58\uff0c\u540e\u9762\u76f4\u63a5\u4f7f\u7528)\ngit config --global credential.helper store\n\n# \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\uff0c\u5e76\u9012\u5f52\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\" --recursive\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#9-youqu","title":"9. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\u6307\u5b9a\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u524d\u7f6e\u6761\u4ef6\uff1a \u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 \u5df2\u5b58\u50a8\u8bbf\u95ee\u5bc6\u7801 # \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\"\n# \u6307\u5b9a\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ncd youqu\ngit submodule update --init apps/autotest_xxx_xxx\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#10-youqu","title":"10. \u5982\u4f55\u66f4\u65b0 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\uff0c\u6240\u6709\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u66f4\u65b0\u6240\u6709\u5b50\u4ed3\u5e93\u4ee3\u7801 cd youqu\ngit pull & git submodule foreach git pull\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#11-youqu-master-detached-head","title":"11. \u5982\u4f55\u4fee\u590d YouQu \u6240\u6709\u5b50\u4ed3\u5e93 master \u5206\u652f\u6e38\u79bb\u5934\uff08detached head\uff09","text":"\u4fee\u590d\u6240\u6709\u5b50\u4ed3\u5e93\u9ed8\u8ba4master \u5206\u652f\u6e38\u79bb\u5934 cd youqu\ngit submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/","title":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212 \u5206\u7c7b\uff1a/ \u67b6\u6784\u5e08\uff1a/ \u76ee\u6807\uff1a \u5e94\u7528 AT \u67b6\u6784\u5de5\u7a0b\u5316\uff0c\u53c2\u8003\u6027\u80fd\u81ea\u52a8\u5316\u5de5\u7a0b\u5b8c\u6210\u5de5\u7a0b\u5316\u6539\u9020\u3002 \u5e94\u7528\u95f4\u7528\u4f8b\u89e3\u8026\uff0c\u89e3\u9664\u6240\u6709\u4ea4\u53c9\u8c03\u7528\u7684\u65b9\u6cd5\uff0c\u5404\u5e94\u7528\u80fd\u8ddf\u968f\u81ea\u8eab\u8fed\u4ee3\u5468\u671f\u72ec\u7acb\u7ef4\u62a4 AT \u7528\u4f8b\u3002 \u5b8c\u6210\u516c\u5171\u65b9\u6cd5\u7684\u62bd\u53d6\u6574\u5408\uff0c\u5f62\u6210\u4e00\u5957\u72ec\u7acb\u4e8e\u5e94\u7528\u95f4\u7684\u516c\u5171\u65b9\u6cd5\u5e93\uff0c\u5404\u5e94\u7528\u65b9\u6cd5\u91cc\u9762\u4e0d\u5b58\u5728\u88ab\u591a\u4e2a\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\u3002 \u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u4e3a\u5c06\u6765\u9002\u914d\u66f4\u591a\u7684 AT \u8fd0\u7528\u573a\u666f\u63d0\u4f9b\u652f\u6491\uff0c\u539f\u5219\u4e0a\u53ef\u5b9e\u73b0\u65e0\u9650\u6269\u5c55\uff0c\u5728\u6bcf\u65e5\u6784\u5efa\u548c\u6301\u7eed\u96c6\u6210\u6d41\u7a0b\u843d\u5730\u4f7f\u7528\u3002 \u4ee3\u7801\u89c4\u8303\u95ee\u9898\u6e05\u96f6\uff0c\u7b26\u5408 Shell Check\u3001Pylint\u3001\u7cfb\u7edf\u90e8\u76f8\u5173\u7f16\u7801\u89c4\u8303\u8981\u6c42\u3002 \u610f\u4e49\uff1a \u7edf\u4e00\u6210\u7814 AT \u67b6\u6784\u8bbe\u8ba1\u601d\u8def\uff0c\u6d88\u9664 AT \u4ee3\u7801\u5b9e\u73b0\u548c\u7ef4\u62a4\u4e0a\u53ef\u80fd\u51fa\u73b0\u7684\u5206\u6b67\uff0c\u6539\u5584\u5386\u53f2 AT \u65e0\u5de5\u7a0b\u5316\u8bbe\u8ba1\u7684\u7f3a\u9677\uff0c\u63d0\u9ad8\u67b6\u6784\u4e13\u4e1a\u6027\u3002 \u5404\u5e94\u7528 AT \u4ee3\u7801\u76f8\u4e92\u72ec\u7acb\uff0c\u5951\u5408\u5e94\u7528\u72ec\u7acb\u53d1\u5e03\u7279\u6027\uff0c\u53ef\u652f\u6301\u8fed\u4ee3\u671f\u95f4\u72ec\u7acb\u65b0\u589e\u3001\u7ef4\u62a4\u548c\u6267\u884c\u3002 \u65b9\u6cd5\u8c03\u7528\u903b\u8f91\u5f97\u5230\u7b80\u5316\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u66f4\u9ad8\u6548\uff1b\u516c\u5171\u5e93\u62bd\u53d6\uff0c\u51cf\u5c11\u65b9\u6cd5\u91cd\u590d\u7f16\u5199\uff0c\u63d0\u9ad8\u4ee3\u7801\u5229\u7528\u7387\uff1b\u5e73\u5747\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u4ece40\u5206\u949f\u964d\u4f4e\u81f330\u5206\u949f\uff0c\u65e5\u4ea7\u51fa\u7528\u4f8b\u4ece12\u6761/\u5929\u63d0\u5347\u81f316\u6761/\u5929\u3002 \u53ef\u7075\u6d3b\u652f\u6491\u4e0d\u540c\u7684\u81ea\u52a8\u5316\u8fd0\u7528\u573a\u666f\uff0c\u5982 CI\u3001\u5192\u70df\u6d4b\u8bd5\u3001\u96c6\u6210\u6d4b\u8bd5\u3001\u56de\u5f52\u6d4b\u8bd5\u3001\u4e13\u9879\u6d4b\u8bd5\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_2","title":"\u4e00\u3001\u80cc\u666f\u4ecb\u7ecd","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1","title":"1\u3001\u73b0\u6709\u67b6\u6784\u4ecb\u7ecd","text":"\u73b0\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u6574\u4f53\u5206\u4e3a\u4e09\u5c42\uff1a\u7528\u4f8b\u5c42\uff08\u4e1a\u52a1\u903b\u8f91\u5c42\uff09\u3001\u4e2d\u95f4\u5c42\uff08\u5143\u7d20\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff09\u3001\u6838\u5fc3\u5c42\uff08\u5e95\u5c42\u529f\u80fd\u5e93\u5c42\uff09\u3002 \u7528\u4f8b\u5c42\uff1a\u5373\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4e13\u6ce8\u4e8e\u4e1a\u52a1\u529f\u80fd\u903b\u8f91\uff0c\u4e0d\u5173\u5fc3\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\uff1b \u4e2d\u95f4\u5c42\uff1a\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff0c\u6bcf\u4e2a\u65b9\u6cd5\u5747\u5bf9\u5e94\u4e00\u4e2a\u5143\u7d20\u7684\u4e00\u4e2a\u5177\u4f53\u64cd\u4f5c\uff0c\u4e5f\u53ef\u4ee5\u662f\u591a\u4e2a\u64cd\u4f5c\u7684\u7ec4\u5408\u64cd\u4f5c\uff0c\u4e2d\u95f4\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u7528\u4f8b\u5c42\uff0c\u5177\u6709\u53ef\u6269\u5c55\u6027\u548c\u590d\u7528\u6027\uff1b \u6838\u5fc3\u5c42\uff1a\u4e3b\u8981\u5c01\u88c5\u7684\u5e95\u5c42\u529f\u80fd\u5b9e\u73b0\uff0c\u6b64\u5c42\u5728\u6846\u67b6\u4e2d\u63d0\u4f9b\u4e00\u4e9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u529f\u80fd\u6a21\u5757\u76f8\u5bf9\u72ec\u7acb\uff0c\u6838\u5fc3\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u64cd\u4f5c\u5c42\uff0c\u6bd4\u5982\uff1a\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7 UI \u5750\u6807\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u952e\u9f20\u64cd\u4f5c\u7684\u57fa\u7840\u65b9\u64cd\u4f5c\u6a21\u5757\u3001Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757\u3001\u6587\u4ef6\u7684\u589e\u5220\u6539\u67e5\u64cd\u4f5c\u6a21\u5757\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2","title":"2\u3001\u81ea\u52a8\u5316\u7684\u5e94\u7528","text":"2.1\u3001CI \u6d41\u7a0b \u6bcf\u65e5\u6784\u5efa\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u7814\u53d1\u6bcf\u65e5\u63d0\u4ea4\u7684\u4ee3\u7801\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u73ed\u4e4b\u540e\u4f1a\u5c06\u5404\u5e94\u7528\u8fdb\u884c\u6253\u5305\uff0c\u7136\u540e\u5728\u6d4b\u8bd5\u673a\u4e0a\u5b89\u88c5\u66f4\u65b0 deb \u5305\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u5e94\u7528\u63d0\u4ea4\u96c6\u6210\u7684\u7248\u672c\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u8f7d\u6700\u65b0\u7684 ISO \u8fdb\u884c PXE \u90e8\u7f72\uff0c\u7136\u540e\u6d4b\u8bd5\u673a\u5b89\u88c5\u6700\u65b0\u7684\u955c\u50cf\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 2.2\u3001\u9a8c\u6536\u6d4b\u8bd5 \u5728\u5404\u9a8c\u6536\u8282\u70b9\u8fdb\u884c\u81ea\u52a8\u5316\u9a8c\u6536\uff0c\u76ee\u524d\u7684\u7b56\u7565\u662f\u5168\u7528\u4f8b\u8986\u76d6\u5168\u67b6\u6784\u3002 2.3\u3001\u56de\u5f52\u6d4b\u8bd5 \u56de\u5f52\u6d4b\u8bd5\u4eca\u5e74\u89c4\u5212\u5efa\u8bbe\u4e2d\uff0c\u65e8\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u6267\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\uff0c\u51cf\u5c11\u529f\u80fd\u6d4b\u8bd5\u7684\u91cd\u590d\u52b3\u52a8\u529b\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3","title":"3\u3001\u5b58\u5728\u7684\u95ee\u9898","text":" \u5404\u5e94\u7528\u4e4b\u95f4\u5b58\u5728\u8026\u5408 \u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u521d\u671f\uff0c\u6240\u6709\u5e94\u7528\u662f\u6574\u4f53\u53d1\u5e03\uff0c\u6211\u4eec\u662f\u5c06\u6240\u6709\u5e94\u7528\u770b\u6210\u662f\u4e00\u4e2a\u6574\u4f53\uff0c\u5404\u5e94\u7528\u4f5c\u4e3a\u5176\u4e2d\u7684\u4e00\u4e2a\u6a21\u5757\uff0c\u6240\u4ee5\u5b58\u5728\u5e94\u7528\u95f4\u65b9\u6cd5\u4ea4\u53c9\u8c03\u7528\u7684\u95ee\u9898\uff0c\u8fd9\u6837\u4ece\u6700\u521d\u7684\u8bbe\u8ba1\u6765\u8bb2\u786e\u5b9e\u80fd\u591f\u51cf\u5c11\u91cd\u590d\u4ee3\u7801\u7684\u7f16\u5199\u3002\u4f46\u662f\u73b0\u5728\u5e94\u7528\u8d70\u72ec\u7acb\u53d1\u5e03\uff0c\u5404\u5e94\u7528\u90fd\u6709\u81ea\u5df1\u7684\u8fed\u4ee3\u8282\u594f\uff0c\u5728\u65b0\u9700\u6c42\u5feb\u901f\u53d8\u5316\u7684\u8fc7\u7a0b\u4e2d\uff0c\u81ea\u52a8\u5316\u7ef4\u62a4\u53d8\u5f97\u5f02\u5e38\u56f0\u96be\uff0c\u539f\u56e0\u5c31\u662f\u81ea\u52a8\u5316\u9879\u76ee\u91cc\u9762\u5404\u4e2a\u5e94\u7528\u7684\u6709\u6bd4\u8f83\u591a\u7684\u8026\u5408\u5173\u7cfb\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u8fdb\u884c\u89e3\u8026\uff0c\u4ee5\u9002\u5e94\u5e94\u7528\u4e0d\u540c\u7684\u8fed\u4ee3\u5468\u671f\u3002 \u65e0\u6cd5\u7cbe\u51c6\u7684\u5212\u5206\u7528\u4f8b\u8303\u56f4 \u7528\u4f8b\u6267\u884c\u7684\u8303\u56f4\u4e0d\u591f\u7cbe\u51c6\uff0c\u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u4e3b\u8981\u901a\u8fc7\u7528\u4f8b\u7684\u5173\u952e\u8bcd core\uff08\u6838\u5fc3\uff09\u6765\u533a\u5206\u7528\u4f8b\u662f\u5426\u4e3a\u6838\u5fc3\u7528\u4f8b\uff0c\u4f46\u662f\u8fd9\u6837\u7684\u533a\u5206\u592a\u5bbd\u6cdb\u4e86\uff0c\u4e0d\u80fd\u9002\u5e94\u81ea\u52a8\u5316\u6d4b\u8bd5\u5728\u591a\u573a\u666f\u4e0b\u7684\u5e94\u7528\u3002\u5f88\u591a\u573a\u666f\u4e0b\u6211\u4eec\u8fd8\u9700\u8981\u6839\u636e\u7528\u4f8b\u7684\u7b49\u7ea7\u3001\u7528\u4f8b\u7684\u7c7b\u578b\u3001\u7528\u4f8b\u6765\u6e90\u7b49\u7b49\uff0c\u4e0d\u540c\u7684\u7ef4\u5ea6\u6765\u6311\u9009\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u5173\u952e\u5b57\u9700\u8981\u4eba\u5de5\u4e00\u6761\u6761\u7684\u6539\uff0c\u8d39\u65f6\u8d39\u529b\uff0c\u800c\u4e14\u4e0d\u597d\u7ef4\u62a4\u3002 \u53d7\u65b0\u9700\u6c42\u5f71\u54cd\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u597d\u7ef4\u62a4 \u76ee\u524d\u9700\u8981\u8df3\u8fc7\u7684\u7528\u4f8b\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684\u7528\u4f8b\u811a\u672c\u91cc\u9762\uff0c\u6dfb\u52a0\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\uff0c\u540e\u7eed\u89e3\u9664\u8df3\u8fc7\u7684\u65f6\u5019\u53c8\u9700\u8981\u627e\u5230\u8fd9\u6761\u811a\u672c\uff0c\u5220\u6389\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\u3002\u5728\u8df3\u8fc7\u7528\u4f8b\u8f83\u591a\u7684\u60c5\u51b5\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u96be\u5ea6\u3002 \u7f16\u5199\u7528\u4f8b\u65f6\u903b\u8f91\u6bd4\u8f83\u590d\u6742\uff0c\u9700\u8981\u8c03\u7528\u591a\u4e2a\u5e94\u7528\u7684\u65b9\u6cd5\u6a21\u5757\u3002 \u6846\u67b6\u6269\u5c55\u6027\u4e0d\u8db3\uff0c\u65e0\u6cd5\u6574\u5408\u6027\u80fd\u81ea\u52a8\u5316\u3001\u538b\u6d4b\u81ea\u52a8\u5316\u3001\u5b89\u5168\u81ea\u52a8\u5316\u7b49\u4e13\u9879\u6d4b\u8bd5\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_3","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u4e3a\u89e3\u51b3\u73b0\u6709\u95ee\u9898\uff0c\u9002\u5e94\u4e0d\u65ad\u4e30\u5bcc\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u66f4\u597d\u7684\u53d1\u6325\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4f5c\u7528\uff0c\u9700\u8981\u5bf9\u81ea\u52a8\u5316\u67b6\u6784\u53ca\u5404\u529f\u80fd\u6a21\u5757\u8fdb\u884c\u91cd\u65b0\u8bbe\u8ba1\u89c4\u5212\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_1","title":"1\u3001\u67b6\u6784\u8bbe\u8ba1","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_1","title":"2\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u6846\u67b6\u7684\u8fd0\u884c\u903b\u8f91\uff1a\u901a\u8fc7\u6838\u5fc3\u5c42\u63d0\u4f9b\u4e00\u4e2a\u57fa\u7840\u80fd\u529b\uff0c\u4e1a\u52a1\u5c42\u6839\u636e\u5b9e\u9645\u4e1a\u52a1\u9700\u6c42\uff08\u6d4b\u8bd5\u7528\u4f8b\uff09\u52a8\u6001\u52a0\u8f7d\u6838\u5fc3\u5c42\uff0c\u6267\u884c\u5165\u53e3\u52a0\u8f7d\u76f8\u5e94\u7684\u7528\u4f8b\u96c6\u5e76\u63a7\u5236\u6267\u884c\uff0c\u5e94\u7528\u5c42\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u9700\u6c42\uff0c\u901a\u8fc7\u76f8\u5e94\u7684\u914d\u7f6e\u9879\u8fdb\u884c\u914d\u7f6e\uff0c\u4ece\u800c\u89e6\u53d1\u81ea\u52a8\u5316\u6d4b\u8bd5\u4efb\u52a1\u3002 \u6838\u5fc3\u5c42\uff1a\u57fa\u672c\u4fdd\u6301\u4e0d\u53d8\uff0c\u90e8\u5206\u6a21\u5757\u4f1a\u6d89\u53ca\u5230\u65b0\u529f\u80fd\u5f00\u53d1\uff0c\u6838\u5fc3\u5c42\u5404\u529f\u80fd\u6a21\u5757\u4fdd\u6301\u72ec\u7acb\u6027\uff0c\u63d0\u4f9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u4f9b\u4e0a\u5c42\u8c03\u7528\uff1b \u5e95\u5c42\u6838\u5fc3\u6a21\u5757\u5305\u62ec\uff1a \u56fe\u50cf\u8bc6\u522b\u6a21\u5757 UI \u5b9a\u4f4d\u6a21\u5757 Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757 \u5c5e\u6027\u5b9a\u4f4d\u6a21\u5757 \u65e5\u5fd7\u6a21\u5757 \u952e\u9f20\u64cd\u4f5c\u6a21\u5757 \u6587\u4ef6\u64cd\u4f5c\u6a21\u5757 \u5f55\u5c4f\u6a21\u5757 \u81ea\u5b9a\u4e49\u65ad\u8a00\u6a21\u5757 \u7528\u4f8b\u6267\u884c\u6a21\u5757 PXE \u88c5\u673a\u6a21\u5757 \u952e\u9f20\u4fe1\u53f7\u6a21\u62df\u6a21\u5757 OCR \u6a21\u5757 \u4e1a\u52a1\u5c42\uff1a\u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e94\u7528\u5185\u5305\u542b\u591a\u4e2a\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5982\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7b49\uff0c\u540e\u7eed\u53ef\u4ee5\u6839\u636e\u9700\u8981\u5ac1\u63a5\u8fdb\u6765\u3002\u5176\u4e2d\u529f\u80fd\u6d4b\u8bd5\u8bbe\u8ba1\u601d\u8def\uff1a \u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e76\u5c06\u6d4b\u8bd5\u6570\u636e\u548c\u6d4b\u8bd5\u8d44\u6e90\u6574\u5408\u8fdb\u6765\uff0c\u589e\u52a0\u7528\u4f8b\u6807\u7b7e csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ed9\u6bcf\u6761\u7528\u4f8b\u6253\u6807\u7b7e\u3002 \u5404\u6807\u7b7e\u6240\u4f7f\u7528\u5bf9\u5e94\u7684\u5b57\u6bb5\u540d\u79f0\uff0c\u4f7f\u7528 csv \u6587\u4ef6\u7ef4\u62a4\u7528\u4f8b\u4e0e\u6807\u7b7e\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u5bf9\u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u53ef\u4ee5\u7ec4\u5408\u5176\u4e2d\u7684\u6807\u7b7e\u800c\u4ece\u9a71\u52a8\u5bf9\u5e94\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\uff0c\u517c\u5bb9\u73b0\u6709\u7528\u4f8b\u6807\u7b7e\uff0c\u4e14\u652f\u6301\u7528\u4f8b\u6807\u7b7e\u53ef\u6269\u5c55\uff1b \u4f7f\u7528 csv \u683c\u5f0f\u6587\u4ef6\u53ef\u4ee5\u65b9\u4fbf\u7684\u4f7f\u7528 Excel \u8868\u683c\u6253\u5f00\u8fdb\u884c\u7f16\u8f91\uff0c\u540c\u65f6\u7531\u4e8e csv \u6587\u4ef6\u5b9e\u9645\u662f\u4ee5\u90fd\u597d\u5206\u9694\u7684\u6587\u672c\u6587\u4ef6\uff0c\u4ee3\u7801\u4e2d\u53ef\u4ee5\u5728\u4e0d\u4f9d\u8d56\u4e09\u65b9\u5e93\u7684\u60c5\u51b5\u4e0b\u65b9\u4fbf\u5feb\u901f\u7684\u89e3\u6790\u5b83\uff0c\u53ef\u64cd\u4f5c\u6027\u548c\u53ef\u7ef4\u62a4\u6027\u8f83\u9ad8\u3002 \u5404\u4e2a\u5e94\u7528\u4e4b\u95f4\uff0c\u7528\u4f8b\u3001\u65b9\u6cd5\u3001\u6807\u7b7e\u548c\u8d44\u6e90\u90fd\u662f\u76f8\u4e92\u72ec\u7acb\u7684\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u7528\u4f8b\u65f6\u53ea\u9700\u8981\u81ea\u5df1\u5e94\u7528\u4e0b\u7684\u65b9\u6cd5\u548c\u516c\u5171\u5e93\u5373\u53ef\u3002 \u7ed3\u6784\u4e3e\u4f8b\uff1a .\n\u251c\u2500\u2500 apps\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_album # \u5e94\u7528\u540d (\u7528\u4e0b\u5212\u7ebf\u8fde\u63a5\u662f Python \u7f16\u7801\u89c4\u8303)\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_assert # \u65ad\u8a00\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_function_tag.csv # \u7528\u4f8b\u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 asan_cases # \u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases # \u529f\u80fd\u6d4b\u8bd5\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 res # \u6d4b\u8bd5\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config # \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_widget # \u5e94\u7528\u81ea\u5df1\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_widget # \u65b9\u6cd5\u57fa\u7c7b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 other_widget # \u8c03\u7528\u5176\u4ed6\u5e94\u7528\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_camera\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases\n\u2502\u00a0\u00a0 \u2502\u00a0 ...\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 public_widget # \u516c\u5171\u65b9\u6cd5\u5e93\n\u251c\u2500\u2500 config # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n...\n config \u914d\u7f6e\u6a21\u5757\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u76f8\u5e94\u914d\u7f6e\uff0c\u6d4b\u8bd5\u540c\u5b66\u53ef\u4ee5\u6839\u636e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5728 config \u91cc\u9762\u8fdb\u884c\u914d\u7f6e\u3002 \u5168\u5c40\u914d\u7f6e\uff1a \u6267\u884c\u4e00\u4e2a\u6216\u591a\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff1a\u5728 pattern \u91cc\u9762\u5199\u5165\u5e94\u7528\u5305\u540d\uff0c\u591a\u4e2a\u5e94\u7528\u4e4b\u95f4\u7528 or \u8fde\u63a5\uff0c\u5982 deepin-music or deepin-movie\uff1b \u5192\u70df\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a smoke\uff1b \u96c6\u6210\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a core \uff1b \u5168\u91cf\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u4e3a\u7a7a\u5373\u53ef\uff1b \u901a\u8fc7 tags \u7684\u914d\u7f6e\u6bd4\u8f83\u7075\u6d3b\uff0c\u540e\u9762\u6807\u7b7e\u5316\u7ba1\u7406\u7ae0\u8282\u4f1a\u8bb2\u5230\uff0c\u652f\u6301\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u7075\u6d3b\u914d\u7f6e\u3002 \u6307\u5b9a\u67d0\u53f0\u673a\u5668\u5728\u6307\u5b9a\u955c\u50cf\u7248\u672c\u4e0a\u6267\u884c\u7528\u4f8b\uff1a\u5728 IP \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a IP\uff0c\u5e76\u5728 URL \u91cc\u9762\u586b\u5165\u955c\u50cf\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u6846\u67b6\u4f1a\u8c03\u7528 PXE \u8fdb\u884c\u81ea\u52a8\u88c5\u673a\uff0c\u88c5\u673a\u5b8c\u4e4b\u540e\u81ea\u52a8\u5f00\u59cb\u6267\u884c\u914d\u7f6e\u7684\u6d4b\u8bd5\u7528\u4f8b\u3002 \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\uff1a \u6bcf\u4e2a\u5e94\u7528\u5185\u90e8\u4f1a\u6709\u4e00\u4e2a\u5355\u72ec\u7684\u914d\u7f6e\u6a21\u5757\uff0c\u4f1a\u5305\u542b\u4e00\u4e9b\u672c\u5e94\u7528\u7684\u6d4b\u8bd5\u8d44\u6e90\u7684\u8def\u5f84\u3001\u6267\u884c\u7528\u4f8b\u7684\u6807\u7b7e\u914d\u7f6e\u7b49\u7b49\uff0c\u5982\u679c\u5728\u5c40\u90e8\u914d\u7f6e\u91cc\u9762\u914d\u7f6e\u4e86\u7528\u4f8b\u6267\u884c\u6807\u7b7e\uff0c\u800c\u5916\u5c42 runner \u51fa\u6ca1\u6709\u6307\u5b9a\u6267\u884c\u6807\u7b7e\uff0c\u5219\u5728\u6267\u884c\u65f6\u53ea\u4f1a\u6267\u884c\u5c40\u90e8\u914d\u7f6e\u5df2\u914d\u7f6e\u7684\uff0c\u82e5\u5916\u5c42 runner \u4e5f\u914d\u7f6e\u4e86\u6267\u884c\u6807\u7b7e\uff0c\u5219\u4f1a\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u7528\u4f8b\u3002 \u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u914d\u7f6e\u90fd\u5728\u540c\u4e00\u4e2a\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\uff0cpy \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684\u7c7b\uff0cini \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684 option\u3002 \u5168\u5c40\u914d\u7f6e\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u7b56\u7565\u5982\u4e0b\uff1a \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5c40\u90e8\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5e94\u7528\u5c42\uff1arunner \u662f\u6d4b\u8bd5\u6267\u884c\u7684\u5165\u53e3\uff0c\u5b83\u4f1a\u6839\u636e\u914d\u7f6e\u91cc\u9762\u7684\u914d\u7f6e\u9879\uff0c\u8fdb\u884c\u7528\u4f8b\u7684\u52a0\u8f7d\u548c\u6267\u884c\u3002\u5b83\u63d0\u4f9b\u63a5\u53e3\u7ed9\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\uff0c\u5e73\u53f0\u4e0a\u7684\u6307\u4ee4\u5b9e\u9645\u4e0a\u90fd\u662f\u901a\u8fc7\u4e0b\u53d1\u7ed9 runner\uff0c\u7136\u540e\u7531 runner \u6765\u6267\u884c\u76f8\u5e94\u7684\u6d4b\u8bd5\u3002 \u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u662f\u4e00\u4e2a\u524d\u7aef\u7cfb\u7edf\uff0c\u53ef\u4ee5\u8fdb\u884c\u6d4b\u8bd5\u673a\u7ba1\u7406\u3001\u81ea\u52a8\u5b89\u88c5\u955c\u50cf\u3001\u81ea\u52a8\u5b89\u88c5\u6307\u5b9a\u5e94\u7528\u7248\u672c\u3001\u8fdb\u884c\u6d4b\u8bd5\u7528\u4f8b\u8303\u56f4\u9009\u62e9\u3001\u7528\u4f8b\u89e6\u53d1\u6267\u884c\u63a7\u5236\u3001\u7ed3\u679c\u5c55\u793a\u8f93\u51fa\u7b49\u3002 \u4e00\u4e2a\u5e94\u7528\u7684\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\u90fd\u53ef\u4ee5\u5355\u72ec\u89e6\u53d1\u3002 \u517c\u5bb9\u6027\u6d4b\u8bd5\u4e3b\u8981\u901a\u8fc7 PXE \u670d\u52a1\u5668\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u88c5\u673a\uff0c\u7136\u540e\u914d\u5408 AT \u8fdb\u884c\u6d4b\u8bd5\uff0c\u53ef\u4ee5\u5b9e\u73b0\u4e0d\u540c\u7cfb\u7edf\u7248\u672c\u3001\u4e0d\u540c\u5e94\u7528\u7248\u672c\u73af\u5883\u4e0a\u90fd\u53ef\u4ee5\u8fdb\u884c\u81ea\u52a8\u5316\u7684 AT \u6267\u884c\uff0c\u63d0\u9ad8\u517c\u5bb9\u6027\u6d4b\u8bd5\u6548\u7387\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_4","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_2","title":"1\u3001\u7528\u4f8b\u89e3\u8026","text":"\u5b58\u5728\u8026\u5408\u5173\u7cfb\u7684\u65b9\u6cd5\uff1a\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u88ab\u5916\u90e8\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\uff0c\u5219\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u8026\u5408\u5173\u7cfb\u3002 1.1\u3001\u901a\u8fc7\u7f16\u8f91\u5668 Find Usages \u67e5\u770b\u6bcf\u4e2a\u65b9\u6cd5\u88ab\u8c03\u7528\u7684\u8def\u5f84\u548c\u88ab\u8c03\u7528\u6b21\u6570\uff1b 1.2\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 1 \u4e2a\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728\u5916\u90e8\u5e94\u7528\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1b 1.3\u3001\u64cd\u4f5c\u5c42\u6587\u4ef6\u540d\u5747\u4ee5 widget \u7ed3\u5c3e\uff0c\u7c7b\u540d\u4ee5 Widget \u7ed3\u5c3e\uff0c\u5982\uff1a\u6587\u4ef6\u540d music_widget.py \uff1a class MusicWidget:\n\"\"\"\u97f3\u4e50\u7684\u64cd\u4f5c\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_2","title":"2\u3001\u516c\u5171\u5e93\u5efa\u8bbe","text":"2.1\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 2 \u4e2a\u53ca\u4ee5\u4e0a\u7684\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728 public_widget \u76ee\u5f55\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1bpublic_widget \u5373\u4e3a\u516c\u5171\u65b9\u6cd5\u5e93\uff1b 2.2\u3001\u5728\u7528\u4f8b\u5c42\u4fee\u6539\u7528\u4f8b\u4e2d\u7c7b\u7684\u5bfc\u5165\u8def\u5f84\uff0c\u5c5e\u4e8e\u516c\u5171\u65b9\u6cd5\u7684\u5219\u8c03\u7528 public_widget \u4e2d\u7684\u7c7b\uff0c\u5916\u90e8\u5e94\u7528\u7684\u64cd\u4f5c\u65b9\u6cd5\uff0c\u5219\u8c03\u7528\u672c\u5e94\u7528\u76ee\u5f55\u4e0b\u91cd\u5199\u7684\u5916\u90e8\u5e94\u7528\u65b9\u6cd5\u3002 \u6bd4\u5982\uff1a\u51e0\u4e4e\u6240\u6709\u591a\u5a92\u4f53\u5e94\u7528\u90fd\u9700\u8981\u901a\u8fc7\u6587\u7ba1\u52a0\u8f7d\u8d44\u6e90\uff0c\u8c03\u8d77\u7684\u6587\u7ba1\u5bf9\u8bdd\u6846\u5b9e\u9645\u4e3a dde-desktop\uff0c\u56e0\u6b64\u5c06 desktop_widget.py \u653e\u5230 public_widget \u91cc\u9762\uff1a class DdeDesktopPublicWidget:\n\"\"\"\u516c\u5171-\u684c\u9762\u7684\u64cd\u4f5c\u65b9\u6cd5\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3_1","title":"3\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406","text":"3.1\u3001\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1a\u5bf9\u5e94 core\u3001smoke\uff0c\u6216\u4e3a\u7a7a\uff1b \u7528\u4f8b\u6765\u6e90\uff1a\u5bf9\u5e94 PMS \u7528\u4f8b\u6765\u6e90\uff0c\u5206\u522b\u7528 acp1\u3001acp2\u3001acp3\u3001acp4 \u8868\u793a\u3002 acp1 \uff1a\u4e1a\u52a1\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5199\u7684\u7528\u4f8b\uff0c\u88ab\u7528\u4e8e\u9a8c\u6536\u6d4b\u8bd5\u7684\uff1b acp2 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5f15\u5165\u7684\u4ea7\u54c1\u9a8c\u6536\u6d4b\u8bc4\u90e8\u7684\u7528\u4f8b\uff1b acp3 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u6839\u636e\u4ea7\u54c1\u9700\u6c42\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\uff1b acp4 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u901a\u8fc7\u793e\u533a\u3001\u8bba\u575b\u7528\u6237\u53cd\u9988\u95ee\u9898\u603b\u7ed3\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\u3002 \u4e3e\u4f8b\uff1a \u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u7528\u4f8b\u6765\u6e90 001 L1 core acp1 \u6807\u7b7e\u91c7\u7528\u679a\u4e3e\u7684\u65b9\u5f0f\u8fdb\u884c\u4ee3\u53f7\u7ba1\u7406\u65b9\u4fbf\u7ba1\u7406\u4ee5\u53ca\u540e\u7eed\u6269\u5c55\u3002 3.2\u3001\u5728\u6bcf\u4e2a\u5e94\u7528\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u7b2c\u4e00\u5217\u4e3a\u7528\u4f8b\u7684 ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ba1\u7406\u6a21\u5757\u5185\u7684\u7528\u4f8b\u6807\u7b7e\u3002\u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 3.3\u3001\u5bf9\u7167 PMS \u4e0a\u7528\u4f8b\u7b49\u7ea7\u3001\u7528\u4f8b\u7c7b\u578b\u548c\u7528\u4f8b\u6765\u6e90\uff0c\u6807\u8bb0\u6240\u6709\u5df2\u5b9e\u73b0\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u540e\u7eed\u7f16\u5199\u65b0\u589e\u81ea\u52a8\u5316\u7528\u4f8b\u65f6\uff0c\u6bcf\u5199\u4e00\u6761\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684 csv \u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u6b64\u6761\u7528\u4f8b\u7684\u6807\u7b7e\u3002 3.4\u3001\u8df3\u8fc7\u7528\u4f8b\u6807\u7b7e\u5316 \u73b0\u6709\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a\uff1a \u4e3e\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u8bb0\u4e3a \u201cskip-\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u8bb0\uff0c\u5982\u679c\u5df2\u7ecf\u6807\u8bb0\u4e86\u8df3\u8fc7\u539f\u56e0\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u8bb0\u4e3a SKIPED\uff0c\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\u3002 \u6240\u6709\u7684\u6807\u7b7e\u5728 docs \u76ee\u5f55\u4e0b\u4f1a\u6709\u4e00\u4e2a\u6587\u6863\uff0c\u6587\u6863\u6682\u5b9a\u540d\u79f0\u4e3a\uff1atags_info.md\uff0c\u7528\u4e8e\u8bf4\u660e\u73b0\u5728\u5df2\u7ecf\u4f7f\u7528\u5230\u7684\u6807\u7b7e\uff0c\u4ee5\u53ca\u8fd9\u4e9b\u6807\u7b7e\u7684\u89e3\u91ca\u548c\u7528\u6cd5\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#4","title":"4\u3001\u7528\u4f8b\u6267\u884c","text":"4.1\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u7684\u9a71\u52a8\u6267\u884c\u903b\u8f91\u529f\u80fd\u5b9e\u73b0 \u5f00\u53d1\u6839\u636e\u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\u91cc\u9762\u7684\u7528\u4f8b\u6807\u7b7e\u6267\u884c\u5bf9\u5e94\u7528\u4f8b\u7684\u529f\u80fd\uff0c\u80fd\u652f\u6301\u591a\u4e2a\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u6267\u884c\u5165\u53e3\u80fd\u968f\u610f\u901a\u8fc7\u7528\u4f8b\u6807\u7b7e\u6307\u5b9a\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002 \u7528\u4f8b\u6807\u7b7e\u7684\u9a71\u52a8\u65b9\u5f0f\u5fc5\u987b\u80fd\u652f\u6301\u6807\u7b7e\u7684\u6269\u5c55\uff0c\u672a\u6765\u968f\u7740\u4e1a\u52a1\u7684\u53d8\u5316\u53ef\u80fd\u9700\u8981\u589e\u52a0\u5404\u79cd\u5404\u6837\u7684\u6807\u7b7e\u3002 4.2\u3001\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u6267\u884c \u529f\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u3001\u6027\u80fd\u6d4b\u8bd5\u7b49\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u662f\u5206\u5f00\u6267\u884c\u7684\uff0c\u4e5f\u5c31\u662f\u5728\u4e00\u6b21\u6267\u884c\u4e2d\uff0c\u53ea\u80fd\u6267\u884c\u5176\u4e2d\u4e00\u79cd\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5177\u4f53\u8981\u6267\u884c\u54ea\u4e00\u79cd\u540c\u6837\u901a\u8fc7\u53c2\u6570\u6765\u63a7\u5236\u3002 4.3\u3001\u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c \u7531\u4e8e\u6d4b\u8bd5\u673a\u8d44\u6e90\u6709\u9650\uff0c\u968f\u7740\u81ea\u52a8\u5316\u7528\u4f8b\u6570\u91cf\u7684\u589e\u52a0\uff0cCI \u6267\u884c\u65f6\u95f4\u4f1a\u8d8a\u6765\u8d8a\u957f\u3002 \u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c\u7684\u529f\u80fd\uff1a \u540c\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\u5206\u6563\u5230\u4e0d\u540c\u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u4e0a\u6267\u884c\uff0c\u7f29\u77ed\u6267\u884c\u603b\u65f6\u95f4\uff1b \u7b2c\u4e8c\u5929\u8dd1\u7684\u65f6\u5019\u540c\u4e00\u4e2a\u673a\u5668\u4e0a\u4f1a\u6267\u884c\u6628\u5929\u6ca1\u6709\u6267\u884c\u5230\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u6267\u884c\u540c\u7406\uff1b \u53ef\u4ee5\u5b9e\u73b0\u5728\u5168\u67b6\u6784\u6d4b\u8bd5\u673a\u4e0a\u8f6e\u6d41\u6267\u884c\u7528\u4f8b\uff0c\u65e2\u80fd\u4fdd\u8bc1\u6267\u884c\u4e86\u6240\u6709\u7684\u7528\u4f8b\uff0c\u53c8\u80fd\u5728\u8d44\u6e90\u6709\u9650\u7684\u60c5\u51b5\u4e0b\u8986\u76d6\u4e86\u6240\u6709\u7684\u67b6\u6784\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#5","title":"5\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0","text":"5.1\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u4f5c\u4e3a\u524d\u7aef\u754c\u9762\u7cfb\u7edf\uff0c\u901a\u8fc7\u9875\u9762\u4e0a\u7684\u4e00\u4e9b\u529f\u80fd\u9009\u9879\u8fdb\u884c\u5bf9\u5e94\u6d4b\u8bd5\u4efb\u52a1\u7684\u7ba1\u7406\u6216\u89e6\u53d1\uff0c\u4e1a\u5185\u6bd4\u8f83\u6d41\u884c\u7684\u5b9e\u73b0\u65b9\u6848\u662f\u4f7f\u7528 Vue + DRF \u5b9e\u73b0\u4e00\u4e2a\u524d\u540e\u7aef\u5206\u79bb\u7684\u7cfb\u7edf\u3002 \u6d4b\u8bd5\u5e73\u53f0\u53ef\u80fd\u4f1a\u6d89\u53ca\u5230\u7684\u6a21\u5757\u6709\uff1a\u6d4b\u8bd5\u673a\u8d44\u6e90\u7ba1\u7406\u6a21\u5757\u3001\u7528\u4f8b\u6267\u884c\u63a7\u5236\u6a21\u5757\u3001\u7ed3\u679c\u5c55\u793a\u6a21\u5757\u3001PXE \u955c\u50cf\u5b89\u88c5\u6a21\u5757\u7b49\u3002 \u7528\u6237\uff08\u6d4b\u8bd5\u3001\u7814\u53d1\u540c\u5b66\u7b49\uff09\u53ef\u4ee5\u914d\u7f6e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5982\u6267\u884c\u54ea\u4e2a\u5e94\u7528\u3001\u6267\u884c\u7528\u4f8b\u7684\u8303\u56f4\u3001\u5728\u54ea\u53f0\u673a\u5668\u4e0a\u6267\u884c\u3001\u955c\u50cf\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u5e94\u7528\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u6267\u884c\u65f6\u95f4\u3002 5.2\u3001\u6267\u884c\u5165\u53e3 runner \u63d0\u4f9b\u7ed9\u6d4b\u8bd5\u5e73\u53f0\u7684\u63a5\u53e3\u5305\u62ec\uff1a\u7528\u4f8b\u6267\u884c\u63a5\u53e3\u3001\u7ed3\u679c\u8fd4\u56de\u63a5\u53e3\u3001\u955c\u50cf\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u955c\u50cf\u5b89\u88c5\u63a5\u53e3\u3001\u5e94\u7528\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u5e94\u7528\u5b89\u88c5\u66f4\u65b0\u63a5\u53e3\u7b49\u3002 \u524d\u7aef\u5e73\u53f0\u76ee\u524d\u8fd8\u6ca1\u6709\u592a\u591a\u8be6\u7ec6\u7684\u65b9\u6848\uff0c\u672c\u6b21\u8bbe\u8ba1\u4e3b\u8981\u96c6\u4e2d\u5728\u540e\u7aef\u8fd9\u90e8\u5206\u67b6\u6784\u7684\u8bbe\u8ba1\u4e0a\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_5","title":"\u56db\u3001\u5b9e\u65bd\u8ba1\u5212","text":"\u8fd1\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u6587\u7ba1\u4ee3\u7801\u89e3\u8026 2022/3/28 2022/4/8 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u56fe\u5f62\u56fe\u50cf\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u97f3\u89c6\u9891\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5168\u5c40\u641c\u7d22\u4ee3\u7801\u89e3\u8026 2022/4/25 2022/4/26 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u516c\u5171\u5e93\u5efa\u8bbe 2022/4/27 2022/5/5 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5c01\u88c5\u7684\u65b9\u6cd5\u6574\u7406\u6210\u4e00\u4e2a\u8868 2022/5/6 2022/5/10 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7528\u4f8b\u6807\u7b7e\u5206\u7c7b\u8bc4\u4f30 2022/5/11 2022/5/11 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u6807\u7b7e\u5316\u6267\u884c\u9a71\u52a8\u7a0b\u5e8f\u7f16\u5199 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u9700\u5b9e\u73b0\u81ea\u52a8\u89e3\u6790 csv \u8868\u683c\u4e2d\u7684\u7528\u4f8b\u7f16\u53f7 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u722c\u866b\u811a\u672c\uff0c\u722c\u53d6 pms \u4e0a\u7528\u4f8b\u7684\u6807\u7b7e 2022/5/11 2022/5/13 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u5b9a\u65f6\u81ea\u52a8\u7ef4\u62a4\u672c\u5730 csv \u6587\u4ef6\u811a\u672c 2022/5/11 2022/5/20 \u4e2d\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u76ee\u5f55\u7ed3\u6784\u8c03\u6574 2022/5/20 2022/6/2 \u5b8c\u6210\u5168\u5c40\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u5177\u4f53\u65b9\u6848\u548c\u903b\u8f91\u5b9e\u73b0 2022/6/6 2022/6/17 \u9759\u6001\u626b\u63cf\u95ee\u9898\u6e05\u96f6 2022/6/20 2022/7/1 \u5b8c\u6210\u65b0\u6846\u67b6\u4f7f\u7528\u57f9\u8bad 2022/7/4 2022/7/11 \u843d\u5730\u8fd0\u884c 2022/7/12 2022/7/20 \u5e95\u5c42\u5e93\u7528\u9014\u8bf4\u660e\u6587\u6863\u7f16\u5199 2022/7/21 2022/7/28"}]} \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz index 8ffaebc1..e0b7bbfc 100644 Binary files a/sitemap.xml.gz and b/sitemap.xml.gz differ diff --git "a/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" "b/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" index 25f669d5..97100667 100644 --- "a/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" +++ "b/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs @@ -1215,8 +1215,7 @@ 智能化功能测试# Attribution :chengdu Test Team # Date :2021/08/20 -此方案仍在演进中 -此方案仍在演进中 +此方案仍在演进中 仓库地址:https://gitlabcd.uniontech.com/autotest/cd-desktop-aitest 一、方案概述¶ 基于深度学习智能识别应用的元素控件,用于在自动化测试操作过程中的元素定位以及判断结果时的断言处理;自动化测试过程中,测试机上的画面通过采集盒传输到服务器上,服务器对视频画面进行智能识别后,服务器智能判断用例是否执行成功,然后对测试机下发下一步操作指令,测试机接受并执行下一步操作。 diff --git "a/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" "b/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" index cdf9ccde..06c9e9a5 100644 --- "a/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" +++ "b/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" @@ -95,7 +95,7 @@ - + @@ -226,7 +226,7 @@ - + YouQu Docs diff --git "a/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" "b/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" index 121b4507..72123668 100644 --- "a/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" +++ "b/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs @@ -752,6 +752,13 @@ + + + + + 4、虚拟化部署 + + @@ -1661,6 +1668,13 @@ + + + + + 4、虚拟化部署 + + @@ -2604,18 +2618,12 @@ 1、标签说明流水线使用指导; 跳过原因:skip-XXX,用于控制用例是否执行; 确认修复:fixed-XXX,用于标记用例的修复状态(后面详细讲解用法); @@ -2629,26 +2637,30 @@ 1、标签说明PMS用例ID 用例级别 用例类型 +设备类型 +用例来源 上线对象 测试级别 跳过原因 确认修复 -废弃用例 -... +废弃用例 +... -001 +679537 679537 L1 FUNC +PPL + CICD C1 skip-XXX fixed-XXX -removed-已废弃 -... +removed-已废弃 +... @@ -2656,7 +2668,7 @@ 2、操作步骤csv 的文件名。 例如: -相册的用例文件为 test_album_xxx.py,xxx 表示任意三位数字代表用例序号,此时 csv 文件名就应为 album.csv; +相册的用例文件为 test_album_xxx.py,xxx 表示用例的ID(也可以是自定义的数字代表用例序号),此时 csv 文件名就应为 album.csv; 对于用例规模比较大的应用,比如文件管理器,建议分模块,每个模块建立一个 csv 文件,所有 csv 文件建议放在一个 tags 目录下。 是否分模块维护 csv 取决于应用的用例复杂度,同时我们应该充分考虑后期的可维护性,csv 文件太多了也是一个很糟糕的事情。 @@ -2677,7 +2689,7 @@ 3.1.1、固定跳过001 +679537 ... skip-受到某新需求影响 @@ -2742,7 +2754,7 @@ 3.2、确认修复001 +679537 ... skip-受到某新需求影响 fixed-已修复 @@ -2787,7 +2799,7 @@ 3.3、废弃用例4、设计思路¶ 上面介绍 Pytest 框架提供的标签功能 mark,使用时需要为每一个用例添加标签装饰器,则操作复杂,可维护性差,其根本问题就是标签分散在每一条用例的装饰器上,难以集中维护;于是乎将所有标签使用 csv 文件进行集中管理,并通过 Pytest 的钩子函数,读取 csv 文件,动态添加标签到用中。 5、CSV文件格式¶ -此配置文件需要维护大量的标签数据,且要方便能使用Excel打开进行编辑查看,更重要的是我们不想引入三方依赖,CSV 文件几乎是唯一能满足所有的要求的文件格式。 +此配置文件需要维护大量的标签数据,且要方便能使用 Excel 打开进行编辑查看,更重要的是我们不想引入三方依赖,CSV 文件几乎是唯一能满足所有的要求的文件格式。 七、日志系统¶ 1、背景¶ 基于 YouQu 自动化测试框架操作方法封装写法,通常是这样的:类里面一个函数只包含一个操作或多次调用的一系列可合并的操作; @@ -2888,7 +2900,7 @@ 1、原则 大文件不能上传到工程里面,保持整个工程的轻量化,这样在克隆代码的时候才能非常快速方便使用,我们见过一个 AT 工程 clone 大小达到好几个 G,简直不可思议。 其实代码文件的大小是很小的,也就是说,纯写代码随便写工程也不会太大,而文档(包含插图)等资源却是很占空间。 -因此我们选择将 YouQu 的文档工程单独迁出到独立的仓库 youqu-docs 。 +因此我们选择将 YouQu 的文档工程涉及到的图片资源都采用外链加载; 2、安装¶ 项目根目录下运行 env.sh 即可。 bash env.sh @@ -2930,17 +2942,25 @@ 3.2、裁剪依赖bash env_dev.sh +4、虚拟化部署¶ +YouQu默认采用虚拟化部分,虚拟化环境实际安装的位置是在 $HOME/.local/share/virtualenvs/youqu-oHTM7l7G 目录下 +youqu-oHTM7l7G 此目录名称前面部分是你的代码根目录的名称,后面部分是生成的随机字符串; +同学们在远程机器上定位问题的时候,如果使用 Pycharm 调试,就将解释器指定到这个目录的就行了; +当然,我们也提供了本机开发环境部署: +bash env_dev.sh + +如果你是本地开发环境可以用它,区别就是驱动执行的时候使用:python3 manage.py xxx 九、失败录屏¶ 录屏其实是一种视频形式的日志,因为很多时候我们在查看日志之后仍然无法准确的定位到用例失败的具体原因,因此用例的录屏能让我们看到用例在执行过程; 【使用方法】 在 globalconfig.ini 里面配置关注 2 个参数; -;失败用例重跑次数 -RERUN = 1 - -;失败录屏从第几次开始录制视频。 -;比如 RECORD_FAILED_CASE = 1 ,表示用例第1次执行失败之后开始录屏。 -;注意,用例失败重跑的次数不能小于失败录屏次数,即 RERUN >= RECORD_FAILED_CASE -RECORD_FAILED_CASE = 1 +;失败用例重跑次数 +RERUN = 1 + +;失败录屏从第几次开始录制视频。 +;比如 RECORD_FAILED_CASE = 1 ,表示用例第1次执行失败之后开始录屏。 +;注意,用例失败重跑的次数不能小于失败录屏次数,即 RERUN >= RECORD_FAILED_CASE +RECORD_FAILED_CASE = 1 默认失败重跑的次数是 1 次; RECORD_FAILED_CASE = 1 表示用例第1次执行失败之后开始录屏; @@ -2953,48 +2973,48 @@ 十、Wayland 适配简单讲就是,应用库只需要维护一套用例脚本即可。 【用例兼容】 因为 Wayland 下有些应用的界面显示和功能本身存在一些差异,用例层可能需要对这部分用例做逻辑判断,使用全局配置里面的常量进行逻辑编写即可: -from setting.globalconfig import GlobalConfig - -# GlobalConfig.IS_WAYLAND 获取到当前的显示服务器(bool) -# 应用库 Config 继承 GlobalConfig -if Config.IS_WAYLAND: - pass -if Config.IS_X11: - pass +from setting.globalconfig import GlobalConfig + +# GlobalConfig.IS_WAYLAND 获取到当前的显示服务器(bool) +# 应用库 Config 继承 GlobalConfig +if Config.IS_WAYLAND: + pass +if Config.IS_X11: + pass 比如用例里面如果断言的图片不同: -if Config.IS_WAYLAND: - self.assert_image_exist("wayland_XXX") -else: - self.assert_image_exist("x11_XXX") +if Config.IS_WAYLAND: + self.assert_image_exist("wayland_XXX") +else: + self.assert_image_exist("x11_XXX") 这样这条用例脚本在 Wayland 和 X11 下都可以跑,so easy 是不是?完全没必要专门拉新分支进行 Wayland 适配。 十一、测试报告¶ 1. 目录结构¶ 执行时会在根目录下动态生成 report 目录,所有的报告相关的文件会统一存放在里面,示例: -/report - ├── allure # allure报告 - │ ├── ... - │ └── ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json - ├── allure_html # 生成的html报告 - │ ├── ... - │ └── index.html - ├── allure_back # allure报告备份 - │ └── 20221108114823 - │ ├── ... - │ └── f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json - ├── json # json报告 - │ ├── ... - │ └── result_deepin-music_20221109134736_1081333.json - ├── logs # 日志文件 - │ ├── 2022-11-10_debug.log - │ └── 2022-11-10_error.log - ├── record # 录屏 - │ └── 2022-11-09 - │ ├── ... - │ └── 15时14分09秒_test_music_303_2_autotest.mp4 - └── xml # xml报告 - └── autotest_deepin_music-20221109134736.xml +/report + ├── allure # allure报告 + │ ├── ... + │ └── ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json + ├── allure_html # 生成的html报告 + │ ├── ... + │ └── index.html + ├── allure_back # allure报告备份 + │ └── 20221108114823 + │ ├── ... + │ └── f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json + ├── json # json报告 + │ ├── ... + │ └── result_deepin-music_20221109134736_1081333.json + ├── logs # 日志文件 + │ ├── 2022-11-10_debug.log + │ └── 2022-11-10_error.log + ├── record # 录屏 + │ └── 2022-11-09 + │ ├── ... + │ └── 15时14分09秒_test_music_303_2_autotest.mp4 + └── xml # xml报告 + └── autotest_deepin_music-20221109134736.xml 默认情况下同时生成 html、xml、json三种形式的报告。 2. 定制报告¶ @@ -3011,14 +3031,14 @@ 3. 查看报告allure open report/allure_html +allure open report/allure_html 使用 manage.py 执行完之后,在终端的最后一行,我们会给你输出打开报告的命令,直接复制它在终端执行就可以查看了,像这样: - 终端执行命令: allure open /tmp/youqu/report/allure_html 查看报告 + 终端执行命令: allure open /tmp/youqu/report/allure_html 查看报告 你也可以直接在 Pycharm 里面找到 index.html 文件,然后右键选择浏览器打开,或者你可以用一个 http 服务打开。 你也可以直接在 report/allure 目录下查看报告: - allure serve report/allure + allure serve report/allure 远程执行 @@ -3031,48 +3051,48 @@ 1. 提前解决代码问题这里推荐一个 Python 社区流行的代码格式化工具: Black,号称不妥协的代码格式化工具,它检测到不符合规范的代码风格直接就帮你全部格式化好,就是这么刚! 安装: -sudo pip3 install black +sudo pip3 install black 使用方法: -black ${CheckPath} +black ${CheckPath} 使用这个工具格式化之后,代码会被自动调整,刚开始你可能会觉得调整得很夸张,没关系坚持看,习惯之后,你会觉得很优雅,没错,这就是 Pythonic Code 的核心,请保持优雅~。 2. 代码扫描工具¶ 使用根目录下 pylint.sh 扫描代码,在 report 目录下查看代码扫描报告,如果有代码问题请提前解决之后再提交。 此脚本已经使用 Python 社区最流行的代码扫描工具 Pylint 进行代码扫描。 使用方法: -bash pylint.sh +bash pylint.sh 运行之后会提示你要扫描的目录,比如输入 apps ,则会扫描 apps 下的所有 Python 代码。 在 setting/pylintrc.cfg 配置文件里面进行相关配置,扫描完成之后在 report/pylints 目录下会生成扫描报告。 代码提交需通过 git review 提交到 gerrit ,人工 Code Review 通过之后合入代码。 十三、提交代码¶ 1. 安装依赖¶ -sudo apt install git-review +sudo apt install git-review 2. 提交模板¶ 在 ~ 目录下新建文件,并命名为 gitcommit_template 将以下内容写入文件当中: -# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 -fix: - -# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 -Description: - -# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 -Log: - -# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 -#Bug: - -# 修复 github issue -#Issue: - -# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 -#Task: +# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 +fix: + +# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 +Description: + +# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 +Log: + +# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 +#Bug: + +# 修复 github issue +#Issue: + +# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 +#Task: 命令行执行: -git config --global commit.template ~/gitcommit_template +git config --global commit.template ~/gitcommit_template 此命令将模板加入到 git 的提交模板中。 后续提交的时候需要关注一下几点: @@ -3083,19 +3103,19 @@ 2. 提交模板3. 推送代码¶ 首先添加 commit 信息 -git add 后面加文件名称 +git add 后面加文件名称 -git add . # 表示添加所有文件 +git add . # 表示添加所有文件 使用这条命令注意有些临时文件不要提交到仓库了。 -git commit -a +git commit -a 之后在 fix: 后面(注意冒号后面必须加空格,不然直接-1)写本地提交的 commit 信息,然后就可以提交代码了 -git review branch(当前分支) -r origin +git review branch(当前分支) -r origin 最好一次 commit,一次 git review ,经常有同学在本地疯狂 commit 最后 git review 报错不知道咋回事儿。 若不想每次提交都加上 -r 选项,执行以下命令: -git config --global gitreview.remote origin +git config --global gitreview.remote origin 提交代码,直接使用 git review branch<目标分支>,例如 git review master 4. Git标签¶ @@ -3106,74 +3126,74 @@ 4. Git标签git tag -a <tagname> +git tag -a <tagname> 回车之后,Git 会打开你的编辑器,让你写一句标签注解,就像你给提交写注解一样。 查看所有标签 -git tag -l -# git tag 也行 +git tag -l +# git tag 也行 删除标签 -git tag -d <tagname> +git tag -d <tagname> 推送标签至远程 git push 命令并不会传送标签到远程仓库服务器上,必须显式地推送标签。 -git push origin <tagname> +git push origin <tagname> 推送所有不在远程仓库服务器上的标签 -git push origin --tag +git push origin --tag 删除远程标签 -git push origin :refs/tag/<tagname> +git push origin :refs/tag/<tagname> 后期打标签 先用 git log --pretty=oneline 查询提交记录,获取校验码。 -git tag -a <tagname> 9fceb02(校验码) +git tag -a <tagname> 9fceb02(校验码) 检出标签 -git checkout <tagname> +git checkout <tagname> 此时,仓库会处于“分离头指针(detached HEAD)”的状态。 在“分离头指针”状态下,如果你做了某些更改然后提交它们,标签不会发生变化, 但你的新提交将不属于任何分支,并且将无法访问,除非通过确切的提交哈希才能访问。 因此,如果你需要进行更改,比如你要修复旧版本中的错误,那么通常需要创建一个新分支: -git checkout -b <NewBranchName> <tagname> +git checkout -b <NewBranchName> <tagname> 新分支上可以进行提交代码。 十四、常见问题¶ 1. 提交代码时提示邮箱或者名称不对¶ 重新配置邮箱或者名称,然后重置生效: -git commit --amend --reset-author +git commit --amend --reset-author 2. 怎么回滚到之前的版本¶ (1)查询历史提交记录 -git log +git log 找到你要回滚的版本,复制 hash 值。 注意:是 commit 空格之后的 hash 值,之前有同学复制的 Change-Id: 这样肯定报错。 (2)回滚版本,不清除代码 -git reset --soft ${hash} +git reset --soft ${hash} (3)回滚版本,清除代码,慎用哈 -git reset --hard ${hash} +git reset --hard ${hash} 3. 测试报告里面 F S . E 是什么意思¶ F 表示失败,. (点)表示通过,S 表示跳过,E 表示 error 有报错 4. 解决 git status 中文显示的问题¶ -git config --global core.quotePath false +git config --global core.quotePath false 5. apps 目录下颜色有些是黄色的¶ 在 Pycharm 中 apps 目录下应用库文件是黄色的,编辑器识别不到代码新增和修改; @@ -3184,22 +3204,22 @@ 5. apps 目录下颜色有些是黄色的6. 执行 env.sh 报错 $'\r':未找到命令¶ 出现这个问题你应该是在 windows 上打开或编辑过 env.sh 脚本,windows下的换行是回车符+换行符,也就是\r\n,而 Linxu 下是换行符 \n,Linux 下不识别 \r,因此报错。 解决方案: -# 将 \r 替换为空 -sudo sed -i 's/\r//' env.sh +# 将 \r 替换为空 +sudo sed -i 's/\r//' env.sh 7.怎样为单独某一条用例配置执行超时时间¶ 在用例脚本中添加装饰器,如下: -@pytest.mark.timeout(300) # 单位秒 -def test_xxx_001(): - pass +@pytest.mark.timeout(300) # 单位秒 +def test_xxx_001(): + pass 8. 如何拉取 YouQu 自动化项目所有代码,包含子仓库¶ 前置条件:已申请访问 YouQu 权限群组 -# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) -git config --global credential.helper store - -# 拉取YouQu框架代码,并递归拉取子仓库代码 -git clone "http://gerrit.uniontech.com/youqu" --recursive +# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) +git config --global credential.helper store + +# 拉取YouQu框架代码,并递归拉取子仓库代码 +git clone "http://gerrit.uniontech.com/youqu" --recursive 9. 如何拉取 YouQu 自动化项目中指定子仓库的代码¶ 前置条件: @@ -3207,22 +3227,22 @@ 9. 如何拉取 YouQu 自动化项目中指定子仓库的代 已申请访问 YouQu 权限群组 已存储访问密码 -# 拉取YouQu框架代码 -git clone "http://gerrit.uniontech.com/youqu" - -# 指定拉取子仓库代码 -cd youqu -git submodule update --init apps/autotest_xxx_xxx +# 拉取YouQu框架代码 +git clone "http://gerrit.uniontech.com/youqu" + +# 指定拉取子仓库代码 +cd youqu +git submodule update --init apps/autotest_xxx_xxx 10. 如何更新 YouQu 自动化项目中,所有子仓库的代码¶ 更新所有子仓库代码 -cd youqu -git pull & git submodule foreach git pull +cd youqu +git pull & git submodule foreach git pull 11. 如何修复 YouQu 所有子仓库 master 分支游离头(detached head)¶ 修复所有子仓库默认master 分支游离头 -cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
通过命令行参数配置参数
以下为 youqu manage.py run 提供的一些参数选项:
youqu manage.py run
-a APP, --app APP 应用名称:deepin-music 或 autotest_deepin_music 或 - apps/autotest_deepin_music - -k KEYWORDS, --keywords KEYWORDS - 用例的关键词,支持and/or/not逻辑组合 - -t TAGS, --tags TAGS 用例的标签,支持and/or/not逻辑组合 - --rerun RERUN 失败重跑次数 - --clean {yes,} 清理环境 - --report_formats REPORT_FORMATS - 测试报告格式 - --max_fail MAX_FAIL 最大失败率 - --log_level LOG_LEVEL - 日志输出级别 - --timeout TIMEOUT 单条用例超时时间 - --resolution RESOLUTION - 检查分辨率 - --debug DEBUG 调试模式 - --noskip {yes,} csv文件里面标记了skip跳过的用例不生效 - --ifixed {yes,} fixed不生效,仅通过skip跳过用例 - --send_pms {,async,finish} - 数据回填 - --task_id TASK_ID 测试单ID - --trigger {,auto,hand} - 触发者 - -f CASE_FILE, --case_file CASE_FILE - 根据文件执行用例 - --deb_path DEB_PATH 需要安装deb包的本地路径 - --pms_user PMS_USER pms 用户名 - --pms_password PMS_PASSWORD - pms 密码 - --suite_id SUITE_ID pms 测试套ID - --pms_info_file PMS_INFO_FILE - pms 信息文件 - --top TOP 过程中记录top命令中的值 - --lastfailed 仅执行上次失败用例 - --duringfail 测试过程中立即显示报错 - --repeat REPEAT 指定用例执行次数 - --project_name PROJECT_NAME - 工程名称(写入json文件) - --build_location BUILD_LOCATION - 构建地区(写入json文件) - --line LINE 执行的业务线(写入json文件) + -h, --help show this help message and exit + -a APP, --app APP 应用名称:deepin-music 或 autotest_deepin_music 或 + apps/autotest_deepin_music + -k KEYWORDS, --keywords KEYWORDS + 用例的关键词,支持and/or/not逻辑组合 + -t TAGS, --tags TAGS 用例的标签,支持and/or/not逻辑组合 + --rerun RERUN 失败重跑次数 + --record_failed_case RECORD_FAILED_CASE + 失败录屏从第几次失败开始录制视频 + --clean {yes,} 清理环境 + --report_formats REPORT_FORMATS + 测试报告格式 + --max_fail MAX_FAIL 最大失败率 + --log_level LOG_LEVEL + 日志输出级别 + --timeout TIMEOUT 单条用例超时时间 + --resolution RESOLUTION + 检查分辨率 + --debug DEBUG 调试模式 + --noskip {yes,} csv文件里面标记了skip跳过的用例不生效 + --ifixed {yes,} fixed不生效,仅通过skip跳过用例 + --send_pms {,async,finish} + 数据回填 + --task_id TASK_ID 测试单ID + --trigger {,auto,hand} + 触发者 + -f CASE_FILE, --case_file CASE_FILE + 根据文件执行用例 + --deb_path DEB_PATH 需要安装deb包的本地路径 + --pms_user PMS_USER pms 用户名 + --pms_password PMS_PASSWORD + pms 密码 + --suite_id SUITE_ID pms 测试套ID + --pms_info_file PMS_INFO_FILE + pms 信息文件 + --top TOP 过程中记录top命令中的值 + --lastfailed 仅执行上次失败用例 + --duringfail 测试过程中立即显示报错 + --repeat REPEAT 指定用例执行次数 + --project_name PROJECT_NAME + 工程名称(写入json文件) + --build_location BUILD_LOCATION + 构建地区(写入json文件) + --line LINE 执行的业务线(写入json文件) + --autostart AUTOSTART 用例执行程序注册到开机自启服务 在一些 CI 环境下使用命令行参数会更加方便: youqu manage.py run --app deepin-music --keywords "xxx" --tags "xxx" @@ -1181,8 +1269,13 @@ 2.1.2. 命令行参数2.2. 远程执行¶ +远程执行就是用本地作为服务端控制远程机器执行,远程机器执行的用例相同; +使用 remote 命令: youqu manage.py remote +2.2.1. 远程多机器分布式异步执行¶ + +多机器分布式异步执行就是由本地 YouQu 作为服务端,控制远程 N 台机器执行相同的用例,执行完之后所有测试机的测试结果会返回给服务端 report 目录下; 远程执行同样通过配置文件 setting/globalconfig.ini 进行用例相关配置; 需要重点说一下远程执行时的测试机信息配置,在配置文件 setting/remote.ini 里面配置测试机的用户名、IP、密码。 ;=============================== CLIENT LIST ===================================== @@ -1206,49 +1299,47 @@ 2.2. 远程执行user = uos ip = 10.8.11.xx -有多少台机器就像这样挨着写就行了。 +有多少台机器就像这样参考上面的格式写就行了。 然后在命令行: youqu manage.py remote 这样运行是从配置文件去读取相关配置。 如果你不想通过配置文件,你仍然通过命令行参数进行传参, 以下为 python3 manage.py remote 提供的一些参数选项: - -a APP, --app APP 应用名称:deepin-music 或 autotest_deepin_music 或 - apps/autotest_deepin_music - -c CLIENTS, --clients CLIENTS - 远程机器的user@ip:password,多个机器用'/'连接,如果password不传入,默认取 - setting/remote.ini 中 CLIENT_PASSWORD - 的值,比如:uos@10.8.13.33:1 或 uos@10.8.13.33 - -k KEYWORDS, --keywords KEYWORDS - 用例的关键词,支持and/or/not逻辑组合 - -t TAGS, --tags TAGS 用例的标签,支持and/or/not逻辑组合 - -s {yes,no,}, --send_code {yes,no,} - 发送代码到测试机(不含report目录) - -e, --build_env 搭建测试环境,如果为yes,不管send_code是否为yes都会发送代码到测试机. - -p CLIENT_PASSWORD, --client_password CLIENT_PASSWORD - 测试机密码(全局) - -y PARALLEL, --parallel PARALLEL - yes:表示所有测试机并行跑,执行相同的测试用例,no - :表示测试机分布式执行,服务端会根据收集到的测试用例自动分配给各个测试机执行。 - --rerun RERUN 失败重跑次数 - --clean {yes,} 清理环境 - --report_formats REPORT_FORMATS - 测试报告格式 - --log_level LOG_LEVEL - 日志输出级别 - --timeout TIMEOUT 单条用例超时时间 - --debug DEBUG 调试模式 - --noskip {yes,} csv文件里面标记了skip跳过的用例不生效 - --ifixed {yes,} fixed不生效,仅通过skip跳过用例 - --send_pms SEND_PMS 数据回填 - --task_id TASK_ID 测试单ID - --deb_path DEB_PATH 需要安装deb包的本地路径 + -h, --help show this help message and exit + -c CLIENTS, --clients CLIENTS + 远程机器的user@ip:password,多个机器用'/'连接,如果password不传入,默认取sett + ing/remote.ini中CLIENT_PASSWORD的值,比如: uos@10.8.13.33:1 + 或 uos@10.8.13.33 + -s, --send_code 发送代码到测试机(不含report目录) + -e, --build_env 搭建测试环境,如果为yes,不管send_code是否为yes都会发送代码到测试机. + -p CLIENT_PASSWORD, --client_password CLIENT_PASSWORD + 测试机密码(全局) + -y PARALLEL, --parallel PARALLEL + yes:表示所有测试机并行跑,执行相同的测试用例;no:表示测试机分布式执行,服务端会根据收集到的测试用例自 + 动分配给各个测试机执行。 +除了这些特有参数以外,它同样支持本地执行的所有参数; 在命令行这样运行: youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k "xxx" -t "xxx" 所有用例执行完之后会在 report 目录下回收各个测试机执行的测试报告。 +注意,如果远程机器没有搭建自动化测试环境,记得加上参数 -e : +youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k "xxx" -t "xxx" -e + +执行前确保远程机器已经开启了 ssh 服务,否则会提示无法连接,如果没有开启,请手动开启: +sudo systemctl restart ssh +sudo systemctl enable ssh + 配置文件其他相关配置项详细说明,请查看配置文件中的注释内容。 +2.2.2. 远程多机器分布式异步负载均衡执行¶ +多机器分布式异步负载均衡执行也是用本地作为服务端控制远程机器执行,但远程机器执行的用例不同,而是所有远程机器执行的用例之和,为你想要执行的用例集; +似乎有点难以理解,我用大白话举例描述下就是,服务端想要执行 10 条用例,现在远程机器有 5 台; +然后服务端就先拿着第 1 条用例给远程 1 号机执行,拿第 2 条用例给远程 2 号机执行...,如此循环直到所有用例执行完,这就是负载均衡执行。 + +使用方法和前面一样,只是需要增加一个参数: +youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k "xxx" -t "xxx" --parallel no + 2.3. PMS 数据回填¶ 测试单关联的用例,自动化测试对应的去跑这些关联的用例,并且将执行的结果回填的测试用例的状态里面。 PMS 数据回填主要有三种方式: @@ -1256,35 +1347,35 @@ 2.3. PMS 数据回填在用例执行的过程中,采用异步的方式去进行数据回填,直白的讲就是,第二条用例开始跑的时候,通过子线程去做第一条用例的数据回填,如此循环,直到所有用例执行结束; 这种方案的时间效率最高的,因为理论上用例的执行时间是大于数据回填的接口请求时间的,也就是说,当用例执行完之后,数据回填也完成了。 使用方法,在 globalconfig.ini 里面配置以下参数:(以下涉及到的参数配置都是在配置文件里面进行配置) -PMS_USER = PMS账号 -PMS_PASSWORD = PMS密码 -SEND_PMS = async -TASK_ID = 测试单ID -TRIGGER = auto -APP_NAME = 这个参数可填可不填,但是填了可以提高用例的执行速度,因为在用例收集阶段可以指定到具体的应用库。(下同) +PMS_USER = PMS账号 +PMS_PASSWORD = PMS密码 +SEND_PMS = async +TASK_ID = 测试单ID +TRIGGER = auto +APP_NAME = 这个参数可填可不填,但是填了可以提高用例的执行速度,因为在用例收集阶段可以指定到具体的应用库。(下同) (2)用例执行完之后回填 等所有用例执行完之后,再逐个进行回填的接口请求,此方案时间效率比较低。 使用方法: -PMS_USER = PMS账号 -PMS_PASSWORD = PMS密码 -SEND_PMS = finish -TASK_ID = 测试单ID -TRIGGER = auto -APP_NAME = +PMS_USER = PMS账号 +PMS_PASSWORD = PMS密码 +SEND_PMS = finish +TASK_ID = 测试单ID +TRIGGER = auto +APP_NAME = (3)手动回填 所有用例执行完之后不做回填的接口请求,后续手动将结果进行回填请求。 用例执行时配置: -PMS_USER = PMS账号 -PMS_PASSWORD = PMS密码 -SEND_PMS = finish -TASK_ID = 测试单ID -TRIGGER = hand -APP_NAME = +PMS_USER = PMS账号 +PMS_PASSWORD = PMS密码 +SEND_PMS = finish +TASK_ID = 测试单ID +TRIGGER = hand +APP_NAME = 后续手动回填方法: -youqu manage.py pms --send2task yes +youqu manage.py pms --send2task yes 可能遇到的问题¶ 由同学可能会发现,怎么回填一次之后,后面想再次回填就不生效了; @@ -1292,62 +1383,62 @@ 可能遇到的问题2.4. 导出 CSV 文件¶ 框架提供导出指定标签用例的功能: -youqu manage.py exportcsv -a deepin-album -t CICD +youqu manage.py exportcsv -a deepin-album -t CICD 表示导出 deepin-album 的用例中标记了 CICD 标签的用例,导出 CSV 文件的字段格式已经适配了 CICD 的要求。 2.5. 脚手架新建 APP 工程¶ 新建一个 APP 工程: -youqu manage.py startapp autotest_deepin_some +youqu manage.py startapp autotest_deepin_some 这样在 apps 目录下会创建一个子项目工程 autotest_deepin_some,同时新建好工程模板目录和模板文件: -apps -└── autotest_deepin_some - ├── case - │ ├── assert_res - │ │ └── readme - │ ├── base_case.py - │ └── __init__.py - ├── config.ini - ├── config.py - ├── conftest.py - ├── control - ├── deepin_some_assert.py - ├── deepin_some.csv - ├── __init__.py - └── widget - ├── base_widget.py - ├── case_res - │ └── readme - ├── deepin_some_widget.py - ├── __init__.py - ├── other.ini - ├── other_widget.py - ├── pic_res - │ └── readme - └── ui.ini +apps +└── autotest_deepin_some + ├── case + │ ├── assert_res + │ │ └── readme + │ ├── base_case.py + │ └── __init__.py + ├── config.ini + ├── config.py + ├── conftest.py + ├── control + ├── deepin_some_assert.py + ├── deepin_some.csv + ├── __init__.py + └── widget + ├── base_widget.py + ├── case_res + │ └── readme + ├── deepin_some_widget.py + ├── __init__.py + ├── other.ini + ├── other_widget.py + ├── pic_res + │ └── readme + └── ui.ini autotest_deepin_some 是你的工程名称,比如:autotest_deepin_music ; 在此基础上,你可以快速的开始你的 AT 项目。 2.6. 用例标签自动同步¶ 用于自动同步 PMS 用例标签数据至本地 CSV 文件,主要通过以下几个配置来控制: -APP_NAME = # 指定要同步的应用名称 -PMS_USER = # PMS的用户名 -PMS_PASSWORD = # PMS的密码 +APP_NAME = # 指定要同步的应用名称 +PMS_USER = # PMS的用户名 +PMS_PASSWORD = # PMS的密码 在 [csv_link_pms_id] 节点下指定 csv 文件名与 PMS 用例模块的对应关系,比如: -[csv_link_pms_id] -;同步PMS数据到本地CSV文件,必须要配置的配置项 -;key是本地CSV文件的文件名称; -;value是对应PMS上的模块ID; -;比如要同步音乐的数据, 首先需要将配置 APP_NAME = deepin-music, -;CSV文件名称为music.csv,其在PMS上的用例为: https://pms.uniontech.com/testcase-browse-53.html -;因此应该配置为: music = 53 -;这样才能将PMS与本地CSV文件建立联系。 -;如果你的应用分了很多模块,只需要将对应的信息依次配置好就行了。 -music = 53 +[csv_link_pms_id] +;同步PMS数据到本地CSV文件,必须要配置的配置项 +;key是本地CSV文件的文件名称; +;value是对应PMS上的模块ID; +;比如要同步音乐的数据, 首先需要将配置 APP_NAME = deepin-music, +;CSV文件名称为music.csv,其在PMS上的用例为: https://pms.uniontech.com/testcase-browse-53.html +;因此应该配置为: music = 53 +;这样才能将PMS与本地CSV文件建立联系。 +;如果你的应用分了很多模块,只需要将对应的信息依次配置好就行了。 +music = 53 将以上信息配置好之后,在命令行执行: -youqu manage.py pms --pms2csv yes +youqu manage.py pms --pms2csv yes 每次执行时原 csv 文件会自动备份在 report/csv_back 目录下,因此你不用担心脚本执行导致你的数据丢失。 diff --git a/search/search_index.json b/search/search_index.json index 91ebe84c..c7cfc7a2 100644 --- a/search/search_index.json +++ b/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\u200b\\u3000\\-\u3001\u3002\uff0c\uff0e\uff1f\uff01\uff1b]+","pipeline":["stemmer"]},"docs":[{"location":"","title":"\u9996\u9875","text":""},{"location":"#youqu","title":"\u6709\u8da3\uff08YouQu\uff09","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/4/1\n# Author : Mikigo\n# =============================================\n \u672c\u7ad9\u603b\u8bbf\u95ee\u91cf \u6b21 \u6b22\u8fce\u5728\u6d4f\u89c8\u5668\u8bbf\u95ee\u3010\u516c\u7f51\u6587\u6863\u3011 \u7edf\u4fe1\u516c\u53f8\u5185\u7f51\u8fd8\u53ef\u4ee5\u8bbf\u95ee\u3010\u5185\u7f51\u6587\u6863\u3011\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u54e6~~"},{"location":"#_1","title":"\u4e00\u3001\u7b80\u4ecb","text":"\u6709\u8da3\uff08YouQu\uff09\u662f\u6df1\u5ea6\u79d1\u6280\u8bbe\u8ba1\u548c\u5f00\u53d1\u7684\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff0c\u91c7\u7528\u7ed3\u6784\u5206\u5c42\u7684\u8bbe\u8ba1\u7406\u5ff5\uff0c\u652f\u6301\u591a\u5143\u5316\u5143\u7d20\u5b9a\u4f4d\u548c\u65ad\u8a00\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\u3001\u5f3a\u5927\u7684\u65e5\u5fd7\u548c\u62a5\u544a\u8f93\u51fa\u7b49\u7279\u8272\u529f\u80fd\uff0c\u540c\u65f6\u5b8c\u7f8e\u517c\u5bb9X11\u3001Wayland\u663e\u793a\u534f\u8bae\uff0c\u73af\u5883\u90e8\u7f72\u7b80\u5355\uff0c\u64cd\u4f5c\u6613\u4e0a\u624b\u3002"},{"location":"#17","title":"\u7231\u4e0a \u201c\u6709\u8da3\u201d \u7684 17 \u4e2a\u7406\u7531","text":" \u6838\u5fc3\u5e93\u63d0\u4f9b\u4e86\u7edf\u4e00\u7684\u63a5\u53e3\uff0c\u7f16\u5199\u65b9\u6cd5\u65f6\u53ea\u9700\u8981\u5bfc\u5165\u4e00\u4e2a\u5305\u5c31\u53ef\u4ee5\u4f7f\u7528\u5230\u6838\u5fc3\u5e93\u63d0\u4f9b\u7684\u6240\u6709\u529f\u80fd\uff1b \u516c\u5171\u5e93\u5c01\u88c5\u4e86\u5f88\u591a\u5e38\u7528\u6a21\u5757\u7684\u76f8\u5173\u65b9\u6cd5\uff0c\u6bd4\u5982\uff1a\u4efb\u52a1\u680f\u7684\u64cd\u4f5c\u3001\u684c\u9762\u7684\u64cd\u4f5c\u3001\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\u7b49\u7b49\uff1b \u9664\u4e86\u5e38\u7528\u7684\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u8bc6\u522b\u4ee5\u5916\uff0c\u6211\u4eec\u8fd8\u63d0\u4f9b\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u5176\u4f7f\u7528\u7b80\u5355\u4e14\u9ad8\u6548\uff0c\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff1b \u5bf9\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u5c06\u7f16\u5199\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u53d8\u5f97\u7b80\u5355\u800c\u4f18\u96c5\uff1b \u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u6280\u672f\u8fdb\u884c\u529f\u80fd\u5347\u7ea7\uff0c\u9664\u4e86\u652f\u6301\u5355\u4e2a\u5750\u6807\u8fd4\u56de\uff0c\u8fd8\u652f\u6301\u540c\u4e00\u754c\u9762\u4e0b\u591a\u4e2a\u76f8\u540c\u5143\u7d20\u8fd4\u56de\u591a\u4e2a\u5750\u6807\u7684\u529f\u80fd\uff1b \u63d0\u4f9b\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u548c\u6279\u91cf\u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u4e0d\u5230\u4e00\u4e2a csv \u6587\u4ef6\u539f\u6765\u80fd\u5e72\u8fd9\u4e48\u591a\u4e8b\u60c5\uff1b \u63d0\u4f9b\u4e86\u529f\u80fd\u5f3a\u5927\u7684\u6267\u884c\u5668\u5165\u53e3\uff0c\u8ba9\u4f60\u53ef\u4ee5\u65b9\u4fbf\u7684\u5728\u672c\u5730\u6267\u884c\u4efb\u4f55\u7528\u4f8b\u96c6\u7684\u7528\u4f8b\uff0c\u5176\u4e30\u5bcc\u7684\u81ea\u5b9a\u4e49\u914d\u7f6e\u9879\uff0c\u6ee1\u8db3\u4f60\u5bf9\u6267\u884c\u5668\u6240\u6709\u7684\u5e7b\u60f3\uff1b \u63d0\u4f9b\u8fdc\u7a0b\u6267\u884c\u7684\u529f\u80fd\uff0c\u53ef\u4ee5\u63a7\u5236\u591a\u53f0\u673a\u5668\u5e76\u884c\u8dd1\uff0c\u6216\u8005\u5206\u5e03\u5f0f\u8dd1\uff0c\u8fd9\u79cd\u4ed8\u8d39\u529f\u80fd\u73b0\u5728\u514d\u8d39\u7ed9\u4f60\u7528\uff1b \u63d0\u4f9b\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u529f\u80fd\uff0c\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u6bcf\u4e2a\u65b9\u6cd5\u5355\u72ec\u5199\u8f93\u51fa\u65e5\u5fd7\u7684\u4ee3\u7801\uff0c\u4e00\u5207\u6211\u4eec\u7ed9\u4f60\u641e\u5b9a\u4e86\uff0c\u65e5\u5fd7\u8f93\u51fa\u4e0d\u4ec5\u5185\u5bb9\u4e30\u5bcc\uff0c\u989c\u503c\u4e5f\u7edd\u5bf9\u5728\u7ebf\uff0c\u6211\u4eec\u8fd8\u81ea\u5df1\u8bbe\u8ba1\u4e86\u4e00\u6b3e\u7ec8\u7aef\u8f93\u51fa\u4e3b\u9898\u53eb\u300a\u4e94\u5f69\u6591\u6593\u7684\u9ed1\u300b\uff1b \u63d0\u4f9b\u4e86\u4e00\u952e\u90e8\u7f72\u81ea\u52a8\u5316\u6d4b\u8bd5\u73af\u5883\u7684\u529f\u80fd\uff0c\u8fde\u4ee3\u7801\u7f16\u8f91\u5668\u90fd\u7ed9\u4f60\u88c5\u597d\u4e86\uff0c\u8ba9\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u73af\u5883\u90e8\u7f72\u800c\u70e6\u607c\uff1b \u63d0\u4f9b\u4e86\u81ea\u52a8\u751f\u6210\u591a\u79cd\u62a5\u544a\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u8f93\u51fa\u4ec0\u4e48\u62a5\u544a\u5f62\u5f0f\u90fd\u884c\uff0c\u800c\u4e14\u6211\u4eec\u5728\u62a5\u544a\u4e2d\u8fd8\u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\u548c\u5931\u8d25\u622a\u56fe\u7684\u529f\u80fd\uff1b \u5bf9\u65ad\u8a00\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u63d0\u4f9b\u66f4\u53cb\u597d\u5316\u7684\u9519\u8bef\u63d0\u793a\uff0c\u8ba9\u5b9a\u4f4d\u95ee\u9898\u7cbe\u51c6\u9ad8\u6548\uff1b \u4e0d\u4ec5\u652f\u6301\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u63a7\u5236\uff0c\u800c\u4e14\u8fd8\u652f\u6301\u52a8\u6001\u63a7\u5236\u7528\u4f8b\u6279\u91cf\u6267\u884c\u7684\u603b\u65f6\u95f4\uff0c\u786e\u4fdd CI \u73af\u5883\u4e0b\u80fd\u987a\u7545\u8fd0\u884c\uff1b \u652f\u6301\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\u6267\u884c\u3001PMS \u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6807\u7b7e\u5316\u6267\u884c\u65b9\u6848\uff0c\u6ee1\u8db3\u4f60\u5404\u79cd\u573a\u666f\u4e0b\u7684\u6267\u884c\u9700\u6c42\uff1b \u652f\u6301\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u529f\u80fd\uff0c\u53ef\u5b9a\u4f4d\u53ef\u65ad\u8a00\uff0c\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\uff1b \u5b8c\u7f8e\u517c\u5bb9 Wayland \u548c X11\uff0c\u771f\u6b63\u505a\u5230\u4e00\u5957\u4ee3\u7801\uff0c\u968f\u5904\u6267\u884c\uff1b \u652f\u6301\u591a\u79cd\u65b9\u5f0f\u7684\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u5176\u4e2d\u5f02\u6b65\u56de\u586b\u7684\u65b9\u6848\uff0c\u5b8c\u7f8e\u89e3\u51b3\u4e86\u6570\u636e\u56de\u586b\u7684\u8017\u65f6\u95ee\u9898\uff1b \u3010\u89c6\u9891\u4ecb\u7ecd\u3011"},{"location":"#_2","title":"\u4e8c\u3001\u5b89\u88c5\u4f7f\u7528","text":"\u57fa\u7840\u6846\u67b6\uff1ahttps://github.com/linuxdeepin/deepin-autotest-framework \u4ece PyPI \u5b89\u88c5: sudo pip3 install youqu\n \u521b\u5efa\u9879\u76ee: youqu-startproject youqu\n \u5b89\u88c5\u4f9d\u8d56: cd youqu\nbash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002 \u5e94\u7528\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684\u5e94\u7528\u540d\u79f0\u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music cd apps/\n \u5c06\u5e94\u7528\u5e93\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u50cf\u8fd9\u6837\uff1a youqu\n\u251c\u2500\u2500 apps\n\u2502 \u251c\u2500\u2500 autotest_deepin_music # \u5e94\u7528\u5e93\n...\n \u5e94\u7528\u5e93\u7684\u540d\u79f0\u4e0d\u53ef\u4ee5\u4fee\u6539\u3002"},{"location":"#_3","title":"\u4e09\u3001\u8fd0\u884c","text":""},{"location":"#1","title":"1. \u5de5\u4f5c\u7a7a\u95f4","text":"\u57fa\u7840\u6846\u67b6\u5de5\u7a0b\u76ee\u5f55\u5efa\u8bae\u653e\u5728 ~ \u76ee\u5f55\u4e0b\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u4e5f\u53ef\u4ee5\u8fd0\u884c\uff0c\u4f46\u662f\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u9700\u8981\u505a\u73af\u5883\u6e05\u7406\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u5b58\u5728\u4ee3\u7801\u88ab\u5220\u9664\u7684\u98ce\u9669\u3002 \u5982\u679c\u4f60\u7684\u673a\u5668\u4e0a\u4e0d\u540c\u76ee\u5f55\u4e0b\u5b58\u5728\u591a\u4e2a YouQu \u5de5\u7a0b\uff0c\u90a3\u4e48\u5728\u8fd0\u884c\u4e4b\u524d\uff0c\u8bf7\u5148\u6267\u884c env.sh \u6821\u6b63\u76f8\u5173\u73af\u5883\u3002"},{"location":"#2","title":"2. \u6267\u884c\u5668","text":"\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u6709\u4e00\u4e2a manage.py \uff0c\u5b83\u662f\u4e00\u4e2a\u6267\u884c\u5668\u5165\u53e3\uff0c\u63d0\u4f9b\u4e86\u672c\u5730\u6267\u884c\u3001\u8fdc\u7a0b\u6267\u884c\u7b49\u7684\u529f\u80fd\u3002 \u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6765\u6267\u884c\uff1a youqu manage.py run -a deepin-music\n"},{"location":"#21","title":"2.1. \u672c\u5730\u6267\u884c","text":"youqu manage.py run\n"},{"location":"#211","title":"2.1.1. \u914d\u7f6e\u6587\u4ef6","text":"\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u914d\u7f6e\u53c2\u6570 \u5728\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u91cc\u9762\u652f\u6301\u914d\u7f6e\u5bf9\u6267\u884c\u7684\u4e00\u4e9b\u53c2\u6570\u8fdb\u884c\u914d\u7f6e\uff0c\u5e38\u7528\u7684\u5982\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;1\u3001KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2\u3001KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f, e.g. TAGS = L1 or smoke\n;\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\uff0c\u5c06\u8981\u6267\u884c\u7684\u7528\u4f8b\u5199\u5165\u6307\u5b9a\u7684 csv \u6587\u4ef6\n;\u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u4ece\u57fa\u7840\u6846\u67b6\u6839\u76ee\u5f55\u5f00\u59cb\uff1ae.g. CASE_FILE = case_list.txt\n;\u5982\u679c\u8fd9\u91cc\u6709\u503c\uff0cAPP_NAME KEYWORDS TAGS \u7684\u914d\u7f6e\u5747\u4e0d\u751f\u6548\nCASE_FILE =\n;=============================== RUNNER CONFIG ===================================\n[runner]\n;\u6700\u5927\u5931\u8d25\u7528\u4f8b\u6570\u91cf\u7684\u5360\u6bd4\n;\u6bd4\u5982\uff1a\u603b\u6267\u884c\u7528\u4f8b\u6570\u4e3a100, \u82e5 MAX_FAIL = 0.5,\u5219\u5931\u8d25\u7528\u4f8b\u6570\u8fbe\u523050\u5c31\u4f1a\u7ec8\u6b62\u6d4b\u8bd5\u3002\nMAX_FAIL = 0.5\n;\u5355\u6761\u7528\u4f8b\u7684\u8d85\u65f6\u65f6\u95f4\uff0c\u5982\u679c\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u8d85\u65f6\uff0c\u8fd9\u6761\u7528\u4f8b\u4f1a\u88ab\u505c\u6b62\uff0c\u540e\u7eed\u7528\u4f8b\u7ee7\u7eed\u6267\u884c\u3002\n;\u5355\u4f4d\u4e3a\u79d2\n; \u8fd9\u662f\u4e00\u4e2a\u5168\u5c40\u7edf\u4e00\u914d\u7f6e\uff0c\u5982\u679c\u67d0\u6761\u7528\u4f8b\u9700\u8981\u5355\u72ec\u914d\u7f6e\u8d85\u65f6\u65f6\u95f4\uff0c\u53ef\u4ee5\u5728\u7528\u4f8b\u4e2d\u8fd9\u6837\u5199\uff1a\n;@pytest.mark.timeout(500)\n;def test_xxx_001():\n; ...\n;\u4f1a\u8bdd\uff08\u6240\u6709\u7528\u4f8b\u6267\u884c\u7684\uff09\u8d85\u65f6\u662f\u6839\u636e\u5168\u5c40\u8d85\u65f6\u914d\u7f6e\u548c\u7528\u4f8b\u5355\u72ec\u8d85\u65f6\u914d\u7f6e\u81ea\u52a8\u8ba1\u7b97\u7684\uff1b\nCASE_TIME_OUT = 200\n;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\u3002\n;\u6ce8\u610f\uff0c\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u4e0d\u80fd\u5c0f\u4e8e\u5931\u8d25\u5f55\u5c4f\u6b21\u6570\uff0c\u5373 RERUN >= RECORD_FAILED_CASE\nRECORD_FAILED_CASE = 1\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = INFO\n;yes \u6bcf\u6761\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u8fdb\u884c\u73af\u5883\u6e05\u7406\nCLEAN_ALL = yes\n;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\nRESOLUTION = 1920x1080\n;\u4e0d\u8df3\u8fc7\u7528\u4f8b\uff0ccsv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86 skip-xxx\u7684\u7528\u4f8b\u4e0d\u8df3\u8fc7\nNOSKIP = no\n;ignore fixed\n;no\uff0c\u53ea\u8981\u6807\u8bb0\u4e86fixed\u7684\u7528\u4f8b\uff0c\u5373\u4f7f\u6807\u8bb0\u4e86skip-\uff0c\u4e5f\u4f1a\u6267\u884c\uff1b\n;yes\uff0cfixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\uff1b\nIFIXED = no\n;\u8981\u5b89\u88c5deb\u5305\u7684\u8def\u5f84\n;e.g : ~/Downloads/ \u5b89\u88c5\u4e0b\u8f7d\u76ee\u5f55\u4e0b\u7684deb\u5305\uff0c\u5982\u679c\u662f\u8fdc\u7a0b\u6267\u884c\uff0c\u4f1a\u81ea\u52a8\u62f7\u8d1d\u5230\u8fdc\u7a0b\u5e76\u5b89\u88c5\u3002\nDEB_PATH =\n;DEBUG \u6a21\u5f0f\u6267\u884c\u7528\u4f8b\uff0c\u53ea\u6536\u96c6\u4e0d\u6267\u884c\u7528\u4f8b\uff0c\u4e5f\u4e0d\u505a\u8bbe\u5907\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002\nDEBUG = no\n;\u8bb0\u5f55top\u547d\u4ee4\u67e5\u8be2\u7684\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0cTOP = 3 \u8868\u793a\u8bb0\u5f55\u524d3\u4e2a\u8fdb\u7a0b\u3002\nTOP =\n;\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\nREPEAT =\n;\u9ed8\u8ba4\u5728\u6240\u6709\u6d4b\u8bd5\u5b8c\u6210\u4e4b\u540e\u8f93\u51fa\u62a5\u9519\u4fe1\u606f.\n;yes, \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\nDURING_FAIL = no\n;=============================== REPORT CONFIG ===================================\n[report]\n;\u7528\u4f8b\u6267\u884c\u5b8c\u540e\u751f\u6210\u7684\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n;\u76ee\u524d\u652f\u6301 allure, xml, json \uff08\u652f\u6301\u540c\u65f6\u751f\u6210\uff09\nREPORT_FORMAT = allure, xml, json\n;\u6307\u5b9a\u62a5\u544a\u751f\u6210\u7684\u8def\u5f84\uff08\u76f8\u5bf9\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\uff09\nALLURE_REPORT_PATH = report/\nXML_REPORT_PATH = report/\nJSON_REPORT_PATH = report/\n;=============================== GLOBAL CONFIG ===================================\n[globalconfig]\n;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\nPASSWORD = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\nIMAGE_MATCH_NUMBER = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6bcf\u6b21\u95f4\u9694\u7b49\u5f85\u65f6\u95f4\nIMAGE_MATCH_WAIT_TIME = 1\n;\u56fe\u50cf\u8bc6\u522b\u5339\u914d\u5ea6\nIMAGE_RATE = 0.9\n;\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u5b9e\u65f6\u56fe\u50cf\u4fdd\u5b58\u8def\u5f84\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u5750\u6807\nSCREEN_CACHE = /tmp/screen.png\n;\u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\u7684\u8def\u5f84\nTMPDIR = /tmp/tmpdir\n;\u7cfb\u7edf\u4e3b\u9898\nSYS_THEME = deepin\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = http://youqu-dev.uniontech.com:8890\n;OpenCV\u670d\u52a1\u7aef\u5730\u5740\nOPENCV_SERVER_HOST = http://youqu-dev.uniontech.com:8889\n;=============================== PMS CONFIG ===================================\n;PMS\u76f8\u5173\u914d\u7f6e\uff0c\u5305\u542b\u4ee5\u4e0b\u51e0\u4e2a\u65b9\u9762\uff1a\n;1.PMS\u6d4b\u8bd5\u5957\u6267\u884c\n;2.\u81ea\u52a8\u4ecePMS\u722c\u53d6\u6570\u636e\u5e76\u540c\u6b65\u672c\u5730CSV\u6587\u4ef6\n;3.PMS\u6570\u636e\u56de\u586b\n[pms]\n;PMS\u7684\u7528\u6237\u540d: ut001234\nPMS_USER =\n;PMS\u7684\u5bc6\u7801\nPMS_PASSWORD =\n;PMS\u6d4b\u8bd5\u5957\u7684ID\n;\u5728PMS\u4e0a\u67e5\u770b\u7528\u4f8b\u201c\u5957\u4ef6\u201d\u94fe\u63a5: https://pms.uniontech.com/testsuite-view-495.html\n;\u6d4b\u8bd5\u5957ID\u4e3a: 495\nSUITE_ID =\n;\u6570\u636e\u56de\u586b\u5fc5\u987b\u5173\u8054PMS\u6d4b\u8bd5\u5355\n;\u5728PMS\u4e0a\u67e5\u770b\u6d4b\u8bd5\u5355\u94fe\u63a5: https://pms.uniontech.com/testtask-cases-20747.html\n;\u6d4b\u8bd5\u5355ID\u4e3a: 20747\nTASK_ID =\n;\u5c06\u6d4b\u8bd5\u7ed3\u679c\u6570\u636e\u56de\u586b\u5230PMS\n;\u4e3a\u7a7a: \u8868\u793a\u4e0d\u56de\u586b,\u4e0d\u4f1a\u5728\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u751f\u6210json\u7ed3\u679c\u6587\u4ef6;\n;async: \u8868\u793a\u9010\u6761\u5f02\u6b65\u56de\u586b,\u540e\u9762\u4e00\u6761\u6267\u884c\u5f00\u59cb\u65f6\u901a\u8fc7\u5b50\u7ebf\u7a0b\u5bf9\u524d\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u8fdb\u884c\u56de\u586b\uff0c\u5982\u6b64\u5b9e\u73b0\u65f6\u95f4\u6548\u7387\u6700\u5927\u5316;\n;finish: \u8868\u793a\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u6210\u4e4b\u540e\u9010\u4e2a\u56de\u586b(PMS\u4e0d\u652f\u6301\u5e76\u53d1);\nSEND_PMS =\n;\u6570\u636e\u56de\u586b\u7684\u89e6\u53d1\u8005\n;auto: \u6846\u67b6\u81ea\u52a8\u56de\u586b,\u914d\u5408SEND_PMS\u914d\u7f6e\u4f7f\u7528,\u4f60\u53ef\u4ee5\u9009\u62e9\u5728\u4e0d\u540c\u7684\u9636\u6bb5\u8fdb\u884c\u6570\u636e\u56de\u586b;\n;hand: \u624b\u52a8\u56de\u586b,\u6bcf\u6761\u7528\u4f8b\u4ecd\u7136\u4f1a\u751f\u6210json\u6587\u4ef6,\u4f46\u6846\u67b6\u4e0d\u4f1a\u8fdb\u884c\u6570\u636e\u56de\u586b,\u9700\u8981\u4f60\u53ef\u4ee5\u5728\u4f60\u60f3\u8981\u53d1\u9001\u7684\u65f6\u95f4\u70b9\u624b\u52a8\u89e6\u53d1\u56de\u586b;\nTRIGGER = auto\n;PMS\u56de\u586b\u7684\u91cd\u8bd5\u6b21\u6570\n;\u5982\u679c\u63a5\u53e3\u8bf7\u6c42\u5931\u8d25,\u4f1a\u8fdb\u884c\u91cd\u8bd5\nSEND_PMS_RETRY_NUMBER = 2\n[csv_link_pms_lib]\n;caselib: \u7528\u4f8b\u5e93\n;testcase: \u4ea7\u54c1\u5e93\u7528\u4f8b\nCASE_FROM = caselib\n[csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/caselib-browse-81.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 81\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic =\n[export_csv]\n;\u5bfc\u51fa\u7684csv\u6587\u4ef6\u540d\u79f0\uff0c\u9ed8\u8ba4 case_list.csv\nCSV_FILE = case_list.csv\n;exportcsv \u547d\u4ee4\u5bfc\u51fa case_list.csv \u6587\u4ef6\u65f6\u914d\u7f6e\u7684\u5b57\u6bb5\u540d\uff0c\u7528\u4f8b\u540d\u79f0\u9ed8\u8ba4\u5b58\u5728\u7b2c\u4e00\u5217\uff0c\u65e0\u9700\u6dfb\u52a0\nCSV_HEARD = \u7528\u4f8b\u7ea7\u522b,\u7528\u4f8b\u7c7b\u578b,\u6d4b\u8bd5\u7ea7\u522b,\u662f\u5426\u8df3\u8fc7\n \u914d\u7f6e\u5b8c\u6210\u4e4b\u540e\uff0c\u76f4\u63a5\u5728\u547d\u4ee4\u884c\u6267\u884c manage.py \u5c31\u597d\u4e86\u3002 youqu manage.py run\n"},{"location":"#212","title":"2.1.2. \u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a youqu manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--max_fail MAX_FAIL \u6700\u5927\u5931\u8d25\u7387\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--resolution RESOLUTION\n\u68c0\u67e5\u5206\u8fa8\u7387\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms {,async,finish}\n\u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--trigger {,auto,hand}\n\u89e6\u53d1\u8005\n-f CASE_FILE, --case_file CASE_FILE\n\u6839\u636e\u6587\u4ef6\u6267\u884c\u7528\u4f8b\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n--pms_user PMS_USER pms \u7528\u6237\u540d\n--pms_password PMS_PASSWORD\npms \u5bc6\u7801\n--suite_id SUITE_ID pms \u6d4b\u8bd5\u5957ID\n--pms_info_file PMS_INFO_FILE\npms \u4fe1\u606f\u6587\u4ef6\n--top TOP \u8fc7\u7a0b\u4e2d\u8bb0\u5f55top\u547d\u4ee4\u4e2d\u7684\u503c\n--lastfailed \u4ec5\u6267\u884c\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\n--duringfail \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\n--repeat REPEAT \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n--project_name PROJECT_NAME\n\u5de5\u7a0b\u540d\u79f0\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--build_location BUILD_LOCATION\n\u6784\u5efa\u5730\u533a\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--line LINE \u6267\u884c\u7684\u4e1a\u52a1\u7ebf\uff08\u5199\u5165json\u6587\u4ef6\uff09\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a youqu manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\"\n \u547d\u4ee4\u884c\u53c2\u6570\u4f18\u5148\u7ea7\u662f\u9ad8\u4e8e\u914d\u7f6e\u6587\u4ef6\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u4e86\u5bf9\u5e94\u7684\u53c2\u6570\uff0c\u914d\u7f6e\u6587\u4ef6\u4e2d\u4e0d\u7ba1\u662f\u5426\u914d\u7f6e\u5747\u4e0d\u751f\u6548\u3002 --app \u5165\u53c2\u8fd8\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\uff0c\u4e0b\u9762\u7684\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u540c\u6837\u652f\u6301\u3002"},{"location":"#22","title":"2.2. \u8fdc\u7a0b\u6267\u884c","text":"youqu manage.py remote\n \u8fdc\u7a0b\u6267\u884c\u540c\u6837\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u8fdb\u884c\u7528\u4f8b\u76f8\u5173\u914d\u7f6e\uff1b \u9700\u8981\u91cd\u70b9\u8bf4\u4e00\u4e0b\u8fdc\u7a0b\u6267\u884c\u65f6\u7684\u6d4b\u8bd5\u673a\u4fe1\u606f\u914d\u7f6e\uff0c\u5728\u914d\u7f6e\u6587\u4ef6 setting/remote.ini \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\u3001IP\u3001\u5bc6\u7801\u3002 ;=============================== CLIENT LIST =====================================\n; \u6d4b\u8bd5\u673a\u914d\u7f6e\u5217\u8868\n;[client{number}] ;\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u6709\u591a\u5c11\u53f0\u6d4b\u8bd5\u673a\u5c31\u5199\u591a\u5c11\u4e2a client\uff0c\u522b\u540d\u5fc5\u987b\u5305\u542b client \u5b57\u7b26\uff0c\u4e14\u4e0d\u80fd\u91cd\u590d\u3002\n;user = ;\u6d4b\u8bd5\u673a user\n;ip = ;\u6d4b\u8bd5\u673a ip\n;password = 1 ;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801, \u53ef\u4ee5\u4e0d\u914d\u7f6e\u6b64\u9879\uff0c\u9ed8\u8ba4\u53d6 CLIENT_PASSWORD \u7684\u503c\uff1b\n;\u5982\u679c\u4f60\u6240\u6709\u6d4b\u8bd5\u673a\u5bc6\u7801\u90fd\u76f8\u540c\uff0c\u90a3\u4e48\u53ea\u9700\u8981\u914d\u7f6e CLIENT_PASSWORD \u5c31\u53ef\u4ee5\u4e86\n;=================================================================================\n[client1]\nuser = uos\nip = 10.8.15.xx\n[client2]\nuser = uos\nip = 10.8.15.xx\n[client3]\nuser = uos\nip = 10.8.11.xx\n \u6709\u591a\u5c11\u53f0\u673a\u5668\u5c31\u50cf\u8fd9\u6837\u6328\u7740\u5199\u5c31\u884c\u4e86\u3002 \u7136\u540e\u5728\u547d\u4ee4\u884c\uff1a youqu manage.py remote\n \u8fd9\u6837\u8fd0\u884c\u662f\u4ece\u914d\u7f6e\u6587\u4ef6\u53bb\u8bfb\u53d6\u76f8\u5173\u914d\u7f6e\u3002 \u5982\u679c\u4f60\u4e0d\u60f3\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\uff0c\u4f60\u4ecd\u7136\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u8fdb\u884c\u4f20\u53c2\uff0c \u4ee5\u4e0b\u4e3a python3 manage.py remote \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-c CLIENTS, --clients CLIENTS\n\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679cpassword\u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6\nsetting/remote.ini \u4e2d CLIENT_PASSWORD\n\u7684\u503c,\u6bd4\u5982\uff1auos@10.8.13.33:1 \u6216 uos@10.8.13.33\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-s {yes,no,}, --send_code {yes,no,}\n\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a\uff08\u4e0d\u542breport\u76ee\u5f55\uff09\n-e, --build_env \u642d\u5efa\u6d4b\u8bd5\u73af\u5883,\u5982\u679c\u4e3ayes\uff0c\u4e0d\u7ba1send_code\u662f\u5426\u4e3ayes\u90fd\u4f1a\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a.\n-p CLIENT_PASSWORD, --client_password CLIENT_PASSWORD\n\u6d4b\u8bd5\u673a\u5bc6\u7801\uff08\u5168\u5c40\uff09\n-y PARALLEL, --parallel PARALLEL\nyes:\u8868\u793a\u6240\u6709\u6d4b\u8bd5\u673a\u5e76\u884c\u8dd1\uff0c\u6267\u884c\u76f8\u540c\u7684\u6d4b\u8bd5\u7528\u4f8b\uff0cno\n:\u8868\u793a\u6d4b\u8bd5\u673a\u5206\u5e03\u5f0f\u6267\u884c\uff0c\u670d\u52a1\u7aef\u4f1a\u6839\u636e\u6536\u96c6\u5230\u7684\u6d4b\u8bd5\u7528\u4f8b\u81ea\u52a8\u5206\u914d\u7ed9\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u3002\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms SEND_PMS \u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n \u5728\u547d\u4ee4\u884c\u8fd9\u6837\u8fd0\u884c\uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\"\n \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report \u76ee\u5f55\u4e0b\u56de\u6536\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u7684\u6d4b\u8bd5\u62a5\u544a\u3002 \u914d\u7f6e\u6587\u4ef6\u5176\u4ed6\u76f8\u5173\u914d\u7f6e\u9879\u8be6\u7ec6\u8bf4\u660e\uff0c\u8bf7\u67e5\u770b\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u6ce8\u91ca\u5185\u5bb9\u3002"},{"location":"#23-pms","title":"2.3. PMS \u6570\u636e\u56de\u586b","text":"\u6d4b\u8bd5\u5355\u5173\u8054\u7684\u7528\u4f8b\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u5bf9\u5e94\u7684\u53bb\u8dd1\u8fd9\u4e9b\u5173\u8054\u7684\u7528\u4f8b\uff0c\u5e76\u4e14\u5c06\u6267\u884c\u7684\u7ed3\u679c\u56de\u586b\u7684\u6d4b\u8bd5\u7528\u4f8b\u7684\u72b6\u6001\u91cc\u9762\u3002 PMS \u6570\u636e\u56de\u586b\u4e3b\u8981\u6709\u4e09\u79cd\u65b9\u5f0f\uff1a \uff081\uff09\u5f02\u6b65\u56de\u586b \u5728\u7528\u4f8b\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\uff0c\u91c7\u7528\u5f02\u6b65\u7684\u65b9\u5f0f\u53bb\u8fdb\u884c\u6570\u636e\u56de\u586b\uff0c\u76f4\u767d\u7684\u8bb2\u5c31\u662f\uff0c\u7b2c\u4e8c\u6761\u7528\u4f8b\u5f00\u59cb\u8dd1\u7684\u65f6\u5019\uff0c\u901a\u8fc7\u5b50\u7ebf\u7a0b\u53bb\u505a\u7b2c\u4e00\u6761\u7528\u4f8b\u7684\u6570\u636e\u56de\u586b\uff0c\u5982\u6b64\u5faa\u73af\uff0c\u76f4\u5230\u6240\u6709\u7528\u4f8b\u6267\u884c\u7ed3\u675f\uff1b \u8fd9\u79cd\u65b9\u6848\u7684\u65f6\u95f4\u6548\u7387\u6700\u9ad8\u7684\uff0c\u56e0\u4e3a\u7406\u8bba\u4e0a\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u662f\u5927\u4e8e\u6570\u636e\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\u65f6\u95f4\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u5f53\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u6570\u636e\u56de\u586b\u4e5f\u5b8c\u6210\u4e86\u3002 \u4f7f\u7528\u65b9\u6cd5\uff0c\u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u4ee5\u4e0b\u53c2\u6570\uff1a\uff08\u4ee5\u4e0b\u6d89\u53ca\u5230\u7684\u53c2\u6570\u914d\u7f6e\u90fd\u662f\u5728\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u914d\u7f6e\uff09 PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = async\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \u8fd9\u4e2a\u53c2\u6570\u53ef\u586b\u53ef\u4e0d\u586b\uff0c\u4f46\u662f\u586b\u4e86\u53ef\u4ee5\u63d0\u9ad8\u7528\u4f8b\u7684\u6267\u884c\u901f\u5ea6\uff0c\u56e0\u4e3a\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u53ef\u4ee5\u6307\u5b9a\u5230\u5177\u4f53\u7684\u5e94\u7528\u5e93\u3002\uff08\u4e0b\u540c\uff09\n \uff082\uff09\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u56de\u586b \u7b49\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u518d\u9010\u4e2a\u8fdb\u884c\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u6b64\u65b9\u6848\u65f6\u95f4\u6548\u7387\u6bd4\u8f83\u4f4e\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \uff083\uff09\u624b\u52a8\u56de\u586b \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4e0d\u505a\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u540e\u7eed\u624b\u52a8\u5c06\u7ed3\u679c\u8fdb\u884c\u56de\u586b\u8bf7\u6c42\u3002 \u7528\u4f8b\u6267\u884c\u65f6\u914d\u7f6e\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = hand\nAPP_NAME = \u540e\u7eed\u624b\u52a8\u56de\u586b\u65b9\u6cd5\uff1a youqu manage.py pms --send2task yes\n"},{"location":"#_4","title":"\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898","text":"\u7531\u540c\u5b66\u53ef\u80fd\u4f1a\u53d1\u73b0\uff0c\u600e\u4e48\u56de\u586b\u4e00\u6b21\u4e4b\u540e\uff0c\u540e\u9762\u60f3\u518d\u6b21\u56de\u586b\u5c31\u4e0d\u751f\u6548\u4e86\uff1b \u8fd9\u662f\u56e0\u4e3a\u4e3a\u4e86\u5e94\u5bf9\u524d\u9762\u63d0\u5230\u7684\u591a\u79cd\u6570\u636e\u56de\u586b\u7684\u65b9\u5f0f\uff0c\u5728 report \u76ee\u5f55\u4e0b\u4f1a\u7531 pms_xxx \u5f00\u5934\u7684\u76ee\u5f55\uff0c\u8bb0\u5f55\u4e86\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u548c\u56de\u586b\u60c5\u51b5\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u4e4b\u524d\u5df2\u7ecf\u56de\u586b\u8fc7\u4e86\uff0c\u540e\u7eed\u5c31\u4e0d\u4f1a\u518d\u6b64\u89e6\u53d1\u56de\u586b\u4e86\uff1b \u5982\u679c\u4f60\u60f3\u91cd\u65b0\u505a\u56de\u586b\uff0c\u4f60\u53ef\u4ee5\u628a report/pms_xxx \u76ee\u5f55\u5220\u6389\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u91cd\u65b0\u505a\u6570\u636e\u56de\u586b\u4e86\uff1b"},{"location":"#24-csv","title":"2.4. \u5bfc\u51fa CSV \u6587\u4ef6","text":"\u6846\u67b6\u63d0\u4f9b\u5bfc\u51fa\u6307\u5b9a\u6807\u7b7e\u7528\u4f8b\u7684\u529f\u80fd\uff1a youqu manage.py exportcsv -a deepin-album -t CICD\n \u8868\u793a\u5bfc\u51fa deepin-album \u7684\u7528\u4f8b\u4e2d\u6807\u8bb0\u4e86 CICD \u6807\u7b7e\u7684\u7528\u4f8b\uff0c\u5bfc\u51fa CSV \u6587\u4ef6\u7684\u5b57\u6bb5\u683c\u5f0f\u5df2\u7ecf\u9002\u914d\u4e86 CICD \u7684\u8981\u6c42\u3002"},{"location":"#25-app","title":"2.5. \u811a\u624b\u67b6\u65b0\u5efa APP \u5de5\u7a0b","text":"\u65b0\u5efa\u4e00\u4e2a APP \u5de5\u7a0b\uff1a youqu manage.py startapp autotest_deepin_some \u8fd9\u6837\u5728 apps \u76ee\u5f55\u4e0b\u4f1a\u521b\u5efa\u4e00\u4e2a\u5b50\u9879\u76ee\u5de5\u7a0b autotest_deepin_some\uff0c\u540c\u65f6\u65b0\u5efa\u597d\u5de5\u7a0b\u6a21\u677f\u76ee\u5f55\u548c\u6a21\u677f\u6587\u4ef6\uff1a apps\n\u2514\u2500\u2500 autotest_deepin_some\n \u00a0\u00a0 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_case.py\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 config.ini\n \u00a0\u00a0 \u251c\u2500\u2500 config.py\n \u00a0\u00a0 \u251c\u2500\u2500 conftest.py\n \u00a0\u00a0 \u251c\u2500\u2500 control\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_assert.py\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some.csv\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u2514\u2500\u2500 widget\n \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 case_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 other.ini\n \u00a0\u00a0 \u251c\u2500\u2500 other_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 pic_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2514\u2500\u2500 ui.ini\n autotest_deepin_some \u662f\u4f60\u7684\u5de5\u7a0b\u540d\u79f0\uff0c\u6bd4\u5982\uff1aautotest_deepin_music \uff1b \u5728\u6b64\u57fa\u7840\u4e0a\uff0c\u4f60\u53ef\u4ee5\u5feb\u901f\u7684\u5f00\u59cb\u4f60\u7684 AT \u9879\u76ee\u3002"},{"location":"#26","title":"2.6. \u7528\u4f8b\u6807\u7b7e\u81ea\u52a8\u540c\u6b65","text":"\u7528\u4e8e\u81ea\u52a8\u540c\u6b65 PMS \u7528\u4f8b\u6807\u7b7e\u6570\u636e\u81f3\u672c\u5730 CSV \u6587\u4ef6\uff0c\u4e3b\u8981\u901a\u8fc7\u4ee5\u4e0b\u51e0\u4e2a\u914d\u7f6e\u6765\u63a7\u5236\uff1a APP_NAME = # \u6307\u5b9a\u8981\u540c\u6b65\u7684\u5e94\u7528\u540d\u79f0\nPMS_USER = # PMS\u7684\u7528\u6237\u540d\nPMS_PASSWORD = # PMS\u7684\u5bc6\u7801\n \u5728 [csv_link_pms_id] \u8282\u70b9\u4e0b\u6307\u5b9a csv \u6587\u4ef6\u540d\u4e0e PMS \u7528\u4f8b\u6a21\u5757\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u6bd4\u5982\uff1a [csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/testcase-browse-53.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 53\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic = 53\n \u5c06\u4ee5\u4e0a\u4fe1\u606f\u914d\u7f6e\u597d\u4e4b\u540e\uff0c\u5728\u547d\u4ee4\u884c\u6267\u884c\uff1a youqu manage.py pms --pms2csv yes\n \u6bcf\u6b21\u6267\u884c\u65f6\u539f csv \u6587\u4ef6\u4f1a\u81ea\u52a8\u5907\u4efd\u5728 report/csv_back \u76ee\u5f55\u4e0b\uff0c\u56e0\u6b64\u4f60\u4e0d\u7528\u62c5\u5fc3\u811a\u672c\u6267\u884c\u5bfc\u81f4\u4f60\u7684\u6570\u636e\u4e22\u5931\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u57fa\u7840\u6846\u67b6\u8bbe\u8ba1\u65b9\u6848","text":"# ====================================\n# Author : Mikigo\n# Time : 2022/3/18\n# version \uff1a1.0\n# ====================================\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"\u505a\u4e00\u4e2a\u7b80\u5355\u3001\u597d\u7528\u3001\u529f\u80fd\u5f3a\u5927\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u3002 \u4f5c\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4e00\u4e2a\u57fa\u7840\u6846\u67b6\uff0c\u4efb\u4f55\u5e94\u7528\u90fd\u80fd\u5f88\u65b9\u4fbf\u7684\u63a5\u5165\u8fdb\u6765\uff1b \u63d0\u4f9b\u6240\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u9700\u8981\u7684\u5e95\u5c42\u529f\u80fd\uff0c\u5e76\u5bf9\u5916\u63d0\u4f9b\u552f\u4e00\u7684\u63a5\u53e3\uff0c\u65b9\u4fbf\u5e94\u7528\u5e93\u4f7f\u7528\uff1b \u6574\u5408\u516c\u5171\u5e93\uff0c\u51cf\u5c11\u5e94\u7528\u5e93\u4ee3\u7801\u91cf\u548c\u65b9\u6cd5\u7ef4\u62a4\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u8bbe\u8ba1\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u7edf\u4e00\u6982\u5ff5","text":" \u57fa\u7840\u6846\u67b6 \u672c\u9879\u76ee\u662f\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\uff08AutoTest Basic Frame\uff09\uff0c\u5168\u79f0\u4e3a\u201c\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff08AT \u57fa\u7840\u6846\u67b6\uff09\u201d\u3002 AT \u57fa\u7840\u6846\u67b6\u662f\u505a\u4e3a\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\u6765\u8bbe\u8ba1\u7684\uff0c\u5b83\u63d0\u4f9b\u4e86\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u57fa\u7840\u529f\u80fd\uff0c\u4efb\u4f55\u5e94\u7528\u63a5\u5165\u8fdb\u6765\u90fd\u80fd\u5feb\u901f\u65b9\u4fbf\u7684\u8fdb\u884c\u65b9\u6cd5\u548c\u7528\u4f8b\u7f16\u5199\uff0c\u540c\u65f6\u5728\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u3001\u6807\u7b7e\u5316\u6267\u884c\u3001\u5206\u5e03\u5f0f\u6267\u884c\u3001\u591a\u79cd\u62a5\u544a\u8f93\u51fa\u3001\u4f18\u7f8e\u7684\u6267\u884c\u65e5\u5fd7\u3001\u5931\u8d25\u81ea\u52a8\u5f55\u5c4f\u548c\u622a\u56fe\u3001\u81ea\u52a8\u73af\u5883\u6e05\u7406\u7b49\u7b49\uff0c\u5b83\u90fd\u63d0\u4f9b\u4e86\u5b8c\u5584\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u66f4\u91cd\u8981\u7684\u662f\u8fd9\u4e00\u5207\u4f7f\u7528\u8d77\u6765\u90fd\u975e\u5e38\u7b80\u5355\u3002 \u57fa\u7840\u6846\u67b6\u4e2d\u5305\u542b\u5e94\u7528\u5e93\uff08apps\uff09\u3001\u6838\u5fc3\u5e93\uff08src\uff09\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09\u3002 \u5e94\u7528\u5e93\uff08apps\uff09 \u5404\u4e2a\u5e94\u7528\u81ea\u5df1\u7684\u4ed3\u5e93\uff0c\u91cc\u9762\u4e3b\u8981\u5305\u542b\u7684\u662f\u7528\u4f8b\u3001\u65b9\u6cd5\u53ca\u4e00\u4e9b\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u53eb autotest-dde-file-manager \u3002 \u6838\u5fc3\u5e93\uff08src\uff09 \u6838\u5fc3\u5e93\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u5230\u6240\u6709\u5e95\u5c42\u6838\u5fc3\u529f\u80fd\uff0c\u8fd9\u662f\u6700\u91cd\u8981\u7684\u4e00\u4e2a\u90e8\u5206\uff0c\u7075\u9b42\u3002\u5177\u4f53\u529f\u80fd\u6a21\u5757\u53ca\u8bf4\u660e\u4f1a\u5728\u4e0b\u9762\u7b2c\u56db\u4e2a\u7ae0\u8282\u8be6\u7ec6\u63cf\u8ff0\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09 \u591a\u4e2a\u5e94\u7528\u90fd\u8981\u7528\u5230\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\uff0c\u6309\u7167\u5e94\u7528\u5212\u5206\u5b58\u653e\uff0c\u4e3b\u8981\u662f\u4e3a\u4e86\u51cf\u5c11\u4ee3\u7801\u91cf\uff0c\u6d88\u9664\u5e94\u7528\u95f4\u7684\u8026\u5408\u5173\u7cfb\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u67b6\u6784\u56fe","text":"\u6574\u4f53\u7684\u6846\u67b6\u8bbe\u8ba1\u5728\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u300b\u6587\u6863\u91cc\u9762\u5df2\u7ecf\u6709\u8be6\u7ec6\u63cf\u8ff0\u4e86\uff0c\u8fd9\u91cc\u8d34\u4e00\u4e0b\u6574\u4f53\u7684\u67b6\u6784\u56fe\uff1a \u4e3a\u4e86\u7a81\u663e\u672c\u6587\u7684\u91cd\u70b9\uff0c\u62bd\u53d6\u5176\u4e2d\u91cd\u8981\u529f\u80fd\u6a21\u5757\uff0c\u5982\u4e0b\u56fe\uff1a "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-basic-frame # \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\n\u251c\u2500\u2500 apps # \u5e94\u7528\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-dde-file-manager # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\uff08\u5e94\u7528\u5e93\u8be6\u7ec6\u76ee\u5f55\u7ed3\u6784\u8bf7\u770b\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\uff09\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 tag # \u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u2514\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u2502 \u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 xxx.png\n\u2502 \u2502 ...\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-deepin-music # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 public # \u516c\u5171\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget # dde_dock \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget # dde_desktop \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 src # \u6838\u5fc3\u5e93\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 button_center.py\n\u2502 \u251c\u2500\u2500 cmdtrl.py\n\u2502 \u251c\u2500\u2500 dogtails.py\n\u2502 \u251c\u2500\u2500 find_image.py\n\u2502 \u251c\u2500\u2500 global_config.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 setting # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 config.py\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 global_config.ini\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\u6a21\u5757\uff08Hook\uff09\n\u251c\u2500\u2500 pytest.ini # Pytest \u9ed8\u8ba4\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 docs # \u6587\u6863\u76ee\u5f55\n\u2514\u2500\u2500 manage.py # \u6267\u884c\u5668\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1apps","title":"1\u3001\u5e94\u7528\u5e93\uff08apps\uff09","text":"\u6240\u6709\u5e94\u7528\u5e93\u5747\u653e\u7f6e\u5728\u57fa\u7840\u6846\u67b6\u4e0b\u7684 apps \u76ee\u5f55\u4e0b\uff08\u89c1\u7b2c\u4e8c\u7ae0\u8282\u7b2c3\u6bb5\u76ee\u5f55\u7ed3\u6784\u5185\u5bb9\uff09\u3002\u5e94\u7528\u5e93\u7684\u67b6\u6784\u8bbe\u8ba1\u53ef\u4ee5\u53c2\u8003\u300aAT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b\u6587\u6863\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2src","title":"2\u3001\u6838\u5fc3\u5e93\uff08src\uff09","text":"\u5728 src \u76ee\u5f55\u4e0b\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u5e95\u5c42\u6838\u5fc3\u7ec4\u4ef6\uff0c\u901a\u5e38\u6765\u8bb2\u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5230\u5176\u4e2d\u67d0\u4e00\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4e48\u4f60\u9700\u8981\u663e\u793a\u7684\u5bfc\u5165\u8fd9\u4e2a\u6a21\u5757\uff0c\u7136\u540e\u624d\u80fd\u4f7f\u7528\u8be5\u6a21\u5757\u4e0b\u7684\u529f\u80fd\uff0c\u5982\u679c\u4f60\u7528\u5230\u4e86\u5341\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4f60\u5c31\u9700\u8981\u5bfc\u5165\u5341\u4e2a\u3002\u4f46\u662f\u6211\u4eec\u60f3\u8ba9\u4e8b\u60c5\u53d8\u5f97\u7b80\u5355\uff0c\u4e00\u6b21\u5bfc\u5165\uff0c\u4f7f\u7528\u6240\u6709\u3002 \u5c06\u6240\u6709\u7684\u529f\u80fd\u6a21\u5757\u90fd\u8fdb\u5165\u5230 src \u7684\u540d\u79f0\u7a7a\u95f4\uff0c\u5728 src/__init__.py \u91cc\u9762\u6211\u4eec\u8bbe\u8ba1\u6210\u8fd9\u6837\uff1a # src/__init__.py\nfrom .cmdctl import CmdCtl\nfrom .dogtails import Dogtail\nfrom .find_image import FindImage\nfrom .button_center import ButtonCenter\nclass Src(CmdCtl, FindImage):\ndef __init__(self, **kwargs):\n\"\"\"dogtail or button center param\n :param kwargs: app_name, desc, number\n \"\"\"\nif kwargs:\napp_name = kwargs.get(\"APP_NAME\")\ndesc = kwargs.get(\"DESC\")\nif app_name is None or desc is None:\nraise ValueError\nnumber = kwargs.get(\"number\")\nnumber = number if isinstance(number, int) else -1\n# \u5bf9\u8c61\u7ec4\u5408\nself.dog = Dogtail(app_name, desc, number)\nself.ui = ButtonCenter(app_name, number)\n \u9700\u8981\u4f20\u9012\u53c2\u6570\u7684\u91c7\u7528\u5bf9\u8c61\u7ec4\u5408\uff0c\u6ca1\u6709\u53c2\u6570\u7684\u4f7f\u7528\u7ee7\u627f\uff0c\u7ee7\u627f\u7684\u7c7b\u7b26\u5408 Mixin \u8bbe\u8ba1\u6a21\u5f0f\u3002 \u5e94\u7528\u5e93\u91cc\u9762\u4f7f\u7528\u7684\u65f6\u5019\u5728 widget/base_widget.py \u91cc\u9762\u53ea\u9700\u8981\u552f\u4e00\u7ee7\u627f Src \uff1a # \u5e94\u7528\u5e93\u91cc\u9762\u65b9\u6cd5\u57fa\u7c7b\n# widget/base_widget.py\nfrom src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n \u8981\u4f7f\u7528\u6838\u5fc3\u5e93\u7684\u529f\u80fd\uff0c\u53ea\u9700\u8981\u5199\u4e00\u4e2a\u5bfc\u5165 from src import Src \u5373\u53ef\u3002 \u5199 __init__ \u6784\u9020\u51fd\u6570\u7684\u539f\u56e0\u662f\u901a\u8fc7\u53c2\u6570\u6784\u9020\u5e94\u7528\uff0c\u5e76\u4e14\u4f20\u9012 number \u8fdb\u6765\uff0c\u53ef\u4ee5\u5b9e\u73b0\u591a\u7a97\u53e3\u7684\u63a7\u5236\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3public","title":"3\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09","text":"\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6bcf\u4e2a\u5e94\u7528\u90fd\u662f\u4e00\u4e2a\u5355\u72ec\u7684 py \u6587\u4ef6\uff0c\u76f8\u4e92\u4e4b\u95f4\u662f\u72ec\u7acb\u7684\uff0c\u6bcf\u4e2a py \u6587\u4ef6\u91cc\u9762\u662f\u8be5\u5e94\u7528\u7684\u65b9\u6cd5\u7c7b\uff0c\u6bd4\u5982\uff1a\u6700\u5e38\u7528\u7684\u65b9\u6cd5\u7c7b dde_desktop_public_widget.py # dde_desktop_widget.py\nfrom src import Src\nclass _DdeDesktopPublicBaseWidget(Src):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-desktop\"\nDESC = \"/usr/bin/dde-desktop\"\ndef __init__(self):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC)\nclass DdeDesktopPublicWidget(_DdeDesktopPublicBaseWidget):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u7c7b\"\"\"\ndef click_music_dir_by_ui(self):\n\"\"\"\u5728\u6587\u4ef6\u9009\u62e9\u6846\u70b9\u51fb\u97f3\u4e50\u76ee\u5f55\"\"\"\nself.click(*self.ui.btn_center(\"\u4fa7\u8fb9\u680f-\u97f3\u4e50\")) \ndef click_xxx_by_attr(self):\npass\n \u516c\u5171\u65b9\u6cd5\u5e93\u610f\u4e49\uff1a \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6240\u5c01\u88c5\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\u90fd\u662f\u81f3\u5c11\u88ab2\u4e2a\u5e94\u7528\u90fd\u7528\u5230\u7684\uff0c\u8fd9\u6837\u505a\u53ef\u4ee5\u51cf\u5c11\u6574\u4f53\u4ee3\u7801\u91cf\uff0c\u4ece\u800c\u51cf\u8f7b\u5e94\u7528\u5e93\u4ee3\u7801\u7684\u7ef4\u62a4\u5de5\u4f5c\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u7f16\u5199\u5f62\u5f0f\uff08\u547d\u540d\u89c4\u5219\u3001\u5b9a\u4f4d\u7684\u65b9\u6848\u5199\u6cd5\u3001\u6ce8\u91ca\u7684\u5199\u6cd5\u7b49\u7b49\uff09\u5177\u6709\u4e00\u5b9a\u7684\u6a21\u677f\u4f5c\u7528\uff0c\u8fd9\u6837\u5373\u4f7f\u662f\u5404\u4e2a\u5e94\u7528\u5e93\u90fd\u72ec\u7acb\u7ef4\u62a4\uff0c\u6240\u6709\u7684\u7f16\u7801\u98ce\u683c\u90fd\u662f\u8d8b\u4e8e\u76f8\u540c\u7684\uff0c\u56e0\u4e3a\u5927\u5bb6\u90fd\u5e94\u8be5\u53c2\u7167\u516c\u5171\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u5199\u6cd5\u6765\u5199\u81ea\u5df1\u5e94\u7528\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\u7c7b\uff0c\u8fd9\u6837\u4f7f\u5f97\u4ece\u516c\u53f8\u7684\u89d2\u5ea6\u53bb\u770b\u6240\u6709\u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u90fd\u662f\u7edf\u4e00\u7684\u3002 \u53ef\u4ee5\u901a\u8fc7\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\uff0c\u4e86\u89e3\u5230\u5176\u4ed6\u5e94\u7528\u7684\u529f\u80fd\uff0c\u5bf9\u4e8e\u6211\u4eec\u9700\u6c42\u7406\u89e3\uff0c\u4e86\u89e3\u7cfb\u7edf\u7684\u65b9\u65b9\u9762\u9762\u4e5f\u6709\u597d\u5904\u3002 \u5f53\u7136\uff0c\u5982\u679c\u4f60\u7684\u5e94\u7528\u672c\u8eab\u662f\u5c5e\u4e8e\u6839\u672c\u5c31\u4e0d\u9700\u8981\u548c\u5176\u4ed6\u5e94\u7528\u4ea4\u4e92\u7684\uff0c\u90a3\u4e48\u4f60\u53ef\u80fd\u4e0d\u4f1a\u7528\u5230\u8fd9\u91cc\u9762\u7684\u529f\u80fd\uff0c\u6ca1\u5173\u7cfb\uff0c\u4f60\u6240\u6709\u7684\u65b9\u6cd5\u90fd\u53ef\u4ee5\u76f4\u63a5\u5199\u5728\u5e94\u7528\u5e93\u7684\u4e1a\u52a1\u5c42\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4conftestpy","title":"4\u3001conftest.py","text":"conftest.py \u4ece\u529f\u80fd\u4e0a\u5c06\u662f\u5c5e\u4e8e\u6838\u5fc3\u5e93\uff08src\uff09\u7684\u5185\u5bb9\uff0c\u4f46\u662f\u7531\u4e8e\u5b83\u7684\u7279\u6b8a\u6027\uff0c\u5373\u5b83\u662f\u5bf9\u5e94\u7528\u5e93\u4e2d\u7684\u7528\u4f8b\u751f\u6548\u7684\uff0c\u800c\u4e14\u5b83\u7684\u4f5c\u7528\u57df\u662f\u5f53\u524d\u76ee\u5f55\u53ca\u4ee5\u4e0b\uff0c\u56e0\u6b64\u6211\u4eec\u5c06\u5b83\u653e\u5230\u9879\u76ee\u6839\u76ee\u5f55\u3002\u6211\u4eec\u6846\u67b6\u4e2d\u6709\u4e0d\u5c11\u6838\u5fc3\u529f\u80fd\u90fd\u662f\u5728\u8fd9\u91cc\u9762\u8fdb\u884c\u5f00\u53d1\u7684\uff0c\u540e\u9762\u7b2c\u56db\u7ae0\u4f1a\u8bb2\u5230\u7ec6\u8282\u3002 pytest.ini \u4f5c\u7528\u548c conftest.py \u7c7b\u4f3c\uff0c\u662f Pytest \u6846\u67b6\u7684\u56fa\u5b9a\u914d\u7f6e\u6587\u4ef6\uff0c\u76ee\u524d\u914d\u7f6e\u4e86\u4e00\u4e9b\u901a\u7528\u7684\u547d\u4ee4\u884c\u6267\u884c\u53c2\u6570\uff0c\u4e5f\u653e\u5728\u9879\u76ee\u6839\u76ee\u5f55\u3002 \u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 Hook \u51fd\u6570\uff0capps \u76ee\u5f55\u4e0b\u7684 \u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 fixture \u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5setting","title":"5\u3001setting","text":"\u5168\u5c40\u914d\u7f6e\u6a21\u5757\uff0c\u5305\u542b\u4e86\u4ee5\u4e0b\u914d\u7f6e\u6587\u4ef6\uff1a \uff081\uff09ini \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u914d\u7f6e\u4e00\u4e9b\u5168\u5c40\u7684\u914d\u7f6e\u9879\uff0c\u8b6c\u5982\uff1a\u5931\u8d25\u91cd\u8dd1\u6b21\u6570\u3001\u662f\u5426\u5931\u8d25\u5f55\u5c4f\u3001\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\u3001\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4\u3001\u6267\u884c\u65f6\u65e5\u5fd7\u7ea7\u522b\u3001\u751f\u6210\u7684\u62a5\u544a\u7c7b\u578b\u3001\u4ee5\u53ca\u5206\u5e03\u5f0f\u6267\u884c\u7684\u4e00\u4e9b\u7b56\u7565\u914d\u7f6e\u9879\u7b49\u7b49\u3002 \uff082\uff09config.py \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u63d0\u4f9b\u914d\u7f6e\u6587\u4ef6\u8bfb\u53d6\u3001\u52a8\u6001\u83b7\u53d6\u4e00\u4e9b\u5e38\u91cf\uff08\u5982\u9879\u76ee\u6839\u76ee\u5f55\u7edd\u5bf9\u8def\u5f84 (BASE_DIR)\u3001\u7cfb\u7edf\u67b6\u6784\uff08SYS_FRAME\uff09\u3001\u65f6\u95f4\u5b57\u7b26\u4e32\uff08strftime\uff09\u3001\u672c\u673a USERNAME IP \u7b49\u7b49\uff09\u3001\u516c\u5171 URL \u7b49\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u89c4\u8303","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u7248\u672c\u53ca\u4f9d\u8d56","text":"\u57fa\u7840\u6846\u67b6\u4f1a\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u8fdb\u884c\u7248\u672c\u53d1\u5e03\uff0c\u4e0d\u4e0e\u67d0\u4e2a\u5e94\u7528\u7248\u672c\u7ed1\u5b9a\uff0c\u4f46\u662f\uff0c\u5e94\u7528\u5e93\u4f1a\u4f9d\u8d56\u4e8e\u57fa\u7840\u6846\u67b6\u7684\u7248\u672c\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u5efa\u8bae\u5728\u5e94\u7528\u5e93\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a\u6587\u672c\u6587\u4ef6\u7528\u4e8e\u8bb0\u5f55\u6240\u4f9d\u8d56\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\uff0c\u7c7b\u4f3c\u4e8e\u5f00\u53d1\u5e94\u7528\u7684 debian/control \u6587\u4ef6\u7684\u529f\u80fd\uff0c\u4e3a\u4e86\u4fdd\u6301\u7edf\u4e00\uff0c\u8fd9\u4e2a\u6587\u4ef6\u5c31\u547d\u540d\u4e3a control\uff0c\u653e\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u6838\u5fc3\u5e93\u72ec\u7acb\u6027","text":"\u6838\u5fc3\u5e93\u4e0d\u5efa\u8bae\u9488\u5bf9\u67d0\u4e00\u4e2a\u5e94\u7528\u5355\u72ec\u505a\u4ee3\u7801\u4e0a\u7279\u6b8a\u5904\u7406\uff0c\u901a\u5e38\u8003\u8651\u9488\u5bf9\u67d0\u4e00\u79cd\u573a\u666f\u8fdb\u884c\u5904\u7406\uff0c\u8fd9\u4e9b\u573a\u666f\u901a\u5e38\u662f\u5b58\u5728\u4e00\u4e9b\u5171\u6027\u7684\u3002\u6bd4\u5982\u8bf4\uff1a\u684c\u9762\u7684ID\u5206\u914d\u5b58\u5728\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u903b\u8f91\u5904\u7406\u89e3\u51b3ID\u5206\u914d\u9519\u8bef\u7684\u95ee\u9898\uff0c\u4f46\u662f\u8fd9\u90e8\u5206\u903b\u8f91\u6211\u4eec\u4f1a\u5728\u684c\u9762\u7684\u65b9\u6cd5\u5c42\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u517c\u5bb9\u6027","text":"\u4e3a\u4e86\u4fdd\u6301\u517c\u5bb9\u6027\uff0c\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u539f\u5219\u4e0a\u4e0d\u5bf9\u8001\u65b9\u6cd5\u8fdb\u884c\u4fee\u6539\u6216\u5220\u9664\uff0c\u53ea\u8fdb\u884c\u65b0\u589e\u3002\u6d89\u53ca\u5230\u8001\u65b9\u6cd5\u4fee\u6539\u6216\u5220\u9664\u7684\uff0c\u4f1a\u8fdb\u884c\u63d0\u524d\u9884\u544a\uff0c\u5e76\u5728\u7b2c\u4e8c\u4e2a\u7248\u672c\u4e4b\u540e\uff08\u4e2d\u95f4\u4f1a\u9694\u4e00\u4e2a\u7248\u672c\u8fc7\u5ea6\uff09\u6b63\u5f0f\u5b9e\u65bd\u4fee\u6539\u6216\u5220\u9664\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u547d\u540d\u89c4\u8303","text":" \u7528\u4f8b ID \u6bcf\u4e2a\u5e94\u7528\u81ea\u5df1\u7ef4\u62a4\u4e00\u5957 ID\uff0c\u5728PMS\u4e0a\u7528\u4f8b\u6807\u9898\u4e0a\u5c06\u81ea\u52a8\u5316ID\u4ee5\u6807\u7b7e\u7684\u5f62\u5f0f\u5199\u5165\uff0c\u6bd4\u5982\uff1a[101]\u6253\u5f00-\u542f\u52a8\u5e94\u7528\u540edock\u53f3\u952e\u83dc\u5355 \u4e00\u4e2a\u7528\u4f8b\u7c7b\u91cc\u9762\u6709\u591a\u4e2a\u7528\u4f8b\u65f6\uff0c\u5728\u7528\u4f8b\u540d\u79f0\u540e\u9762\u52a0\u5e8f\u53f7\u3002 class TestFileManager(BaseCase):\n\"\"\"\u6587\u7ba1\u7528\u4f8b\"\"\"\ndef test_xxx_015_1(self):\npass\ndef test_xxx_015_2(self):\npass\n \u6ce8\u610f 015_1\uff0c\u4e0d\u8981\u5199015_01\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 PMS \u4e0a\u7684\u7528\u4f8bID\uff1a PMS \u4e0a\u662f6\u4f4d\u6570\uff0c\u4e0d\u591f\u76f4\u89c2\uff0c\u4e5f\u4e0d\u597d\u7ef4\u62a4\uff0c\u5728\u81ea\u52a8\u5316\u4e0b\u9762\u53bb\u627e\u4e00\u4e2a\u5e26\u6709 6 \u4f4d\u6570\u7684\u6587\u4ef6\u662f\u4e00\u4e2a\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 PMS \u4e0a\u7684 ID \u53ef\u80fd\u4f1a\u53d1\u751f\u53d8\u5316\uff0c\u6bd4\u5982\u5bfc\u51fa\u6765\u5bfc\u8fdb\u53bb\u7684\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u5b58\u5728\u95ee\u9898\uff0c\u5982\u679c\u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u8981\u60f3\u627e\u51fa\u6765\u5bf9\u5e94\u4fee\u6539\u81ea\u52a8\u5316\u7528\u4f8b ID\uff0c\u5c06\u4f1a\u662f\u4ef6\u975e\u5e38\u75db\u82e6\u7684\u4e8b\u60c5\u3002 \u51fd\u6570\u547d\u540d\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5de6\u952e\u70b9\u51fb click \u53f3\u952e\u70b9\u51fb right_click \u53cc\u51fb double_click \u79fb\u52a8 move_to \u62d6\u52a8 drag \u65b0\u5efa new \u62d6\u52a8\u5230 drag_to \u4ece\u54ea\u91cc\u62d6\u52a8\u5230\u54ea\u91cc drag_something_from_xxx_to_xxx \u83b7\u53d6 get \u83b7\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5750\u6807 get_location \u975e\u7279\u6b8a\u6587\u4ef6 file word\u6587\u4ef6 doc text\u6587\u4ef6 text \u6587\u4ef6\u5939 dir \u5173\u952e\u8bcd\u6301\u7eed\u589e\u52a0 \u5e38\u91cf\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5e94\u7528\u540d\u79f0 APP_NAME \u5e94\u7528\u63cf\u8ff0 DESC \u672c\u5e94\u7528\u4ee5\u5916\u7684\u5176\u4ed6\u5e94\u7528\uff0c\u6bd4\u5982\u5e2e\u52a9 HELP \u5176\u4ed6\u540d\u79f0\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u65b9\u6cd5\u5305\u540d widget \u65b9\u6cd5\u6587\u4ef6\u540d\uff08\u6587\u7ba1\u4e3e\u4f8b\uff09 dfm_widget.pytitle_widget.pyright_view_widget.pyleft_view_widget.pypop_widget.pybase_widget.pydfm_assert.py \u65ad\u8a00\u8bed\u53e5\u547d\u540d\u89c4\u8303 \u65ad\u8a00\u8bed\u53e5\u90fd\u662f\u4ee5 assert \u5f00\u5934 \u65ad\u8a00 \u8bed\u53e5 \u5224\u65ad\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_existsassert_file_not_exists \u5224\u65ad\u684c\u9762\u76ee\u5f55\u4e0b\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_exists_in_desktopassert_file_not_exists_in_desktop \u5224\u65ad\u56fe\u7247\u5b58\u5728 assert_image_existsassert_image_not_exists \u5224\u65ad\u5f71\u9662\u4e2d\u662f\u5426\u5b58\u5728\u56fe\u7247 assert_image_exists_in_movieassert_image_not_exists_in_movie \u5224\u65ad\u5143\u7d20\u662f\u5426\u5b58\u5728 assert_element_existassert_element_not_exist \u5224\u65ad\u662f\u5426\u76f8\u7b49 assert_equalassert_not_equal \u5224\u65ad\u662f\u5426\u4e3a\u771f assert_trueassert_false"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5fixture","title":"5\u3001fixture \u89c4\u8303","text":"\u7531\u4e8e Pytest \u6846\u67b6\u4e2d\u652f\u6301 fixture \u7684\u5199\u6cd5\u548c Xunit \u5199\u6cd5\u7684\uff0c\u6240\u4ee5\u5e94\u7528\u5e93\u4e2d\u53ef\u80fd\u5b58\u5728\u6df7\u7528\u7684\u60c5\u51b5\uff0c\u4e3a\u7edf\u4e00\u7f16\u7801\u98ce\u683c\u65b9\u4fbf\u540e\u7eed\u7528\u4f8b\u4ee3\u7801\u7ef4\u62a4\uff0c\u73b0\u505a\u4ee5\u4e0b\u89c4\u8303\u8bf4\u660e\uff1a \u629b\u5f03 Xunit \u7684\u5199\u6cd5\uff0c\u7edf\u4e00\u91c7\u7528 Pytest fixture \u7684\u5199\u6cd5\u3002 \u5e94\u7528\u5185 fixture \u8c28\u614e\u4f7f\u7528 autouse=True \uff0c\u975e\u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u975e\u5e38\u4e0d\u5efa\u8bae\u4f7f\u7528\u8fd9\u4e2a\u53c2\u6570\u3002 \u8c03\u7528 fixture \u4e0d\u80fd\u4f7f\u7528 @pytest.mark.usefixture()\uff0c\u4f7f\u7528\u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u4f20\u5165\u51fd\u6570\u5bf9\u8c61\u3002 \u5efa\u8bae\u5728\u4e00\u4e2a conftest.py \u91cc\u9762\u53bb\u5199\uff0c\u4e00\u4e2a\u5e94\u7528\u4e5f\u5c3d\u91cf\u7ef4\u62a4\u4e00\u4e2a conftest.py\u6587\u4ef6\u3002 fixture \u4e5f\u9700\u8981\u5199\u529f\u80fd\u8bf4\u660e\uff0c\u51fd\u6570\u540d\u79f0\u8981\u6709\u5177\u4f53\u542b\u4e49\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#6","title":"6\u3001\u65b9\u6cd5\u7f16\u5199\u89c4\u8303","text":" \u65b9\u6cd5\u7c7b\u578b\uff1a if \u6ca1\u6709\u7528\u5230\u5b9e\u4f8b\u5bf9\u8c61\uff1a\nif \u6ca1\u6709\u7528\u5230\u7c7b\u5bf9\u8c61\uff1a\n\u5199\u9759\u6001\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @staticmethod\nelse\uff1a\n\u5199\u7c7b\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @classmethod\nelse:\n\u76f4\u63a5\u5199\u5b9e\u4f8b\u65b9\u6cd5\n \u4e3e\u4f8b: class TitleWidget:\ndef click_xxx_by_ui(self):\npass\n@staticmethod\ndef click_xxx_by_ui():\npass\n@classmethod\ndef click_xxx_by_ui(cls):\npass\n \u51fd\u6570\u540d\u79f0\u4e0d\u51fa\u73b0\u6570\u5b57\uff0c\u9700\u8981\u8868\u793a\u6570\u91cf\u7684\u7528\u5355\u8bcd\u8868\u793a\u3002 \u51fd\u6570\u529f\u80fd\u6ce8\u91ca\u3002 \u6ca1\u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg2:xxx\n\"\"\"\n \u6709\u53c2\u6570\uff0c\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg1:xxx\nreturn: xxx\n\"\"\"\n \u200b \u7528 Pycharm \u7684\u6ce8\u91ca\u6a21\u677f\u4e5f\u53ef\u4ee5\uff0c\u53ea\u8981\u4f53\u73b0\u4e86\u53c2\u6570\u7684\u7c7b\u578b\u548c\u8fd4\u56de\u5c31\u884c\u4e86\u3002 \u6682\u4e0d\u8981\u6c42\u5199\u7c7b\u578b\u6ce8\u89e3\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#7case","title":"7\u3001\u7528\u4f8b\uff08case\uff09\u89c4\u8303","text":" \u4ee5\u7c7b\u7684\u5f62\u5f0f\u5199\u7528\u4f8b\uff0c\u7528\u4f8b\u7c7b\u96c6\u6210\u7528\u4f8b\u57fa\u7c7b\u3002 \u7528\u4f8b\u7c7b\u9700\u8981\u5199\u6ce8\u91ca\u3002 \u6d4b\u8bd5\u7528\u4f8b\u51fd\u6570\u8bf4\u660e\uff08\u5efa\u8bae\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u540d\u79f0\uff09 \"\"\"\u53f3\u4fa7\u9884\u89c8-\u56fe\u7247\u7c7b\u578b\u4fe1\u606f\u680f\u57fa\u672c\u4fe1\u606f\"\"\"\n \u4e0d\u5199\u8c03\u8bd5\u4ee3\u7801 if __name__ == '__main__':\npytest.main()\n \u6240\u6709\u7528\u4f8b\u90fd\u7ee7\u627f BaseCase\u3002 BaseCase \u91cc\u9762\u653e\u4e00\u4e9b\u6d4b\u8bd5\u6570\u636e\u7684\u5e38\u91cf\uff0c\u6bd4\u5982\u6587\u4ef6\u540d\u79f0\uff0c\u5e94\u7528\u540d\u79f0\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u4e00\u4e9b\u901a\u7528\u7684\u5b57\u7b26\u4e32\u3002 \u8fd9\u7c7b\u662f\u5c5e\u4e8e\u6d4b\u8bd5\u6570\u636e\u3002 class BaseCase(DfmAssert):\n\"\"\"\u7528\u4f8b\u57fa\u7c7b\"\"\"\nNEW_FILE = \"\u65b0\u5efa\u6587\u672c.txt\"\nTEST_FILE = \"test.txt\"\nNEW_DIR = \"\u65b0\u5efa\u6587\u4ef6\u5939\"\nNEW_WORD = \"\u65b0\u5efaWord\u6587\u6863.doc\"\nAPP_HELP = \"damn\"\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\n\"\"\"\u7528\u4f8b\u6807\u9898\uff08\u590d\u5236PMS\u4e0a\u7528\u4f8b\u6807\u9898\uff09\"\"\"\ndfm = DfmWidget()\ndfm.click_xxx_by_attr(self.NEW_FILE)\ndfm.new_file_in_desktop_by_cmd(self.NEW_FILE)\nself.assert_true(dfm.get_process_status(self.APP_NAME))\n \u7528\u4f8b\u91cc\u9762\u5c3d\u91cf\u51cf\u5c11\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\uff0c\u66f4\u8981\u51cf\u5c11\u76f8\u540c\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\u3002 \u7edf\u4e00\u6587\u4ef6\u6ce8\u91ca\u5934\u3002 #!/usr/bin/env python3\n# _*_ coding:utf-8 _*_\n\"\"\"\n:Author:email@uniontech.com\n:Date :${DATE} ${TIME}\n\"\"\"\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#8","title":"8\u3001\u5176\u4ed6\u89c4\u8303","text":" \u65e5\u5fd7\u6253\u5370\u8981\u5728\u65b9\u6cd5\u6700\u524d\u9762\uff0c\u5426\u5219\u4ee3\u7801\u62a5\u9519\u6ca1\u6709\u65e5\u5fd7\u8f93\u51fa\uff0c\u4e0d\u597d\u5b9a\u4f4d\u95ee\u9898\u3002\uff08\u6211\u4eec\u4f1a\u8003\u8651\u7ee7\u7eed\u4f7f\u7528\u62e6\u622a\u5668\u6253\u5370\u65e5\u5fd7\uff09 \u6240\u6709\u7684\u64cd\u4f5c\u90fd\u9700\u8981\u6709\u65e5\u5fd7\uff0c\u5305\u62ec sleep()\uff0c\u6211\u4eec\u4f1a\u91cd\u5199\u4e00\u4e2a\u6709\u65e5\u5fd7\u8f93\u5165\u7684 sleep\u3002 \u4e1a\u52a1\u5c42\u65e5\u5fd7\u7ea7\u522b\u4e3a INFO\u3002 hook \u51fd\u6570\u53ea\u80fd\u5199\u5230\u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u91cc\u9762\u3002 apps \u76ee\u5f55\u4e0b\u7684 conftest.py \u539f\u5219\u4e0a\u4e0d\u4f1a\u65b0\u589e fixture\u3002 \u56fa\u5b9a\u76ee\u5f55\u6216\u5143\u7d20\u63a7\u4ef6\u7684\u64cd\u4f5c\uff0c\u5c06\u64cd\u4f5c\u65b9\u6cd5\u5199\u6b7b\uff0c\u6587\u4ef6\u7c7b\u64cd\u4f5c\u5c06\u6587\u4ef6\u540d\u7559\u53c2\u6570\u3002 \u8def\u5f84\u62fc\u63a5\u89c4\u8303\uff1a \u7cfb\u7edf\u4e2d\u56fa\u5b9a\u76ee\u5f55\uff0c\u8def\u5f84\u62fc\u63a5\u65f6\u4f7f\u7528\u6ce2\u6d6a\u7b26\u53f7\uff0c\u6bd4\u5982\uff1a~/Desktop/\uff0c\u4e0b\u5c42\u4f7f\u7528 os.path.expanduser()\uff0c\u5b83\u53ef\u4ee5\u81ea\u52a8\u8bc6\u522b\u6ce2\u6d6a\u7b26\u53f7\u3002 \u9879\u76ee\u4e0b\u8def\u5f84\u4f7f\u7528\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u8def\u5f84\uff0c\u6bd4\u5982\uff1aConfig.BASE_PATH\uff0c\u56e0\u4e3a\u9879\u76ee\u662f\u53ef\u4ee5\u5728\u4efb\u610f\u8def\u5f84\u8fd0\u884c\u7684\uff0c\u9700\u8981\u52a8\u6001\u62fc\u63a5\u8def\u5f84\u3002 "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848","text":"# =================================================\n# Author : Mikigo\n# Time : 2022/3/16\n# version \uff1a1.0\n# =================================================\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"AT \u5e94\u7528\u5e93\u6539\u9020\u662f\u57fa\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u8fdb\u884c\u7528\u4f8b\u65b9\u6cd5\u548c\u4e1a\u52a1\u903b\u8f91\u7684\u91cd\u65b0\u8bbe\u8ba1\uff0c\u4ee5\u5b9e\u73b0\u5e94\u7528\u5e93\u9ad8\u6548\u7684\u7f16\u5199\u3001\u7ef4\u62a4\u7528\u4f8b\u53ca\u5176\u65b9\u6cd5\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u6587\u4ef6\u7ba1\u7406\u5668\u4ece\u4e1a\u52a1\u590d\u6742\u5ea6\u548c\u7528\u4f8b\u91cf\u6765\u8bb2\uff0c\u5728\u7cfb\u7edf\u6240\u6709\u5e94\u7528\u4e2d\uff0c\u662f\u5f88\u6709\u4ee3\u8868\u6027\u7684\uff0c\u96be\u5ea6\u4e5f\u662f\u6700\u5927\u7684\uff0c\u56e0\u6b64\u6211\u4eec\u9009\u53d6\u6587\u4ef6\u7ba1\u7406\u5668\u4f5c\u4e3a\u5e94\u7528\u5e93\u6539\u9020\u7684\u5b9e\u9a8c\u5e94\u7528\uff0c\u7ed9\u540e\u7eed\u5176\u4ed6\u5e94\u7528\u6539\u9020\u63d0\u4f9b\u5207\u5b9e\u53ef\u884c\u7684\u601d\u8def\u548c\u65b9\u6848\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u5206\u5c42\u8bbe\u8ba1\u56fe","text":"\u6574\u4f53\u4ecd\u7136\u9075\u5faa PO \u8bbe\u8ba1\u7406\u5ff5\uff0c\u6839\u636e\u4e1a\u52a1\u9700\u8981\uff0c\u5c06\u6587\u7ba1\u4e1a\u52a1\u5c42\u8fdb\u884c 3 \u5c42\u5212\u5206\uff1a "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-dde-file-manager # \u5e94\u7528\u4ed3\u5e93\n\u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 test_xxx_001.py\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u00a0\u251c\u2500\u2500 __init__.py\n\u2502 \u00a0\u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u00a0\u251c\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u00a0\u251c\u2500\u2500 base_widget.py # \u65b9\u6cd5\u57fa\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 title_widget.py # title \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 right_view_widget.py # right view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 left_view_widget.py # left view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 pop_widget.py # pop \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 dfm_widget.py # \u65b9\u6cd5\u7684\u7edf\u4e00\u51fa\u53e3\n\u2502 \u00a0\u2514\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 tag # \u7528\u4f8b\u6807\u7b7e\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 xxx.csv # \u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2514\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u57fa\u7c7b","text":" \u7ee7\u627f\u6838\u5fc3\u5c42\u7684\u5404\u4e2a\u6a21\u5757\u7c7b\u3002 \u62bd\u53d6\u64cd\u4f5c\u5c42\u7684\u4e00\u4e9b\u57fa\u7840\u65b9\u6cd5\u3002 \u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u7684\u4e00\u4e9b\u516c\u5171\u65b9\u6cd5\u3002 \u8def\u5f84\u7ec4\u88c5\u65b9\u6cd5\u3002 \u4e00\u4e9b\u4e1a\u52a1\u5c42\u76f8\u5173\u7684\u53d8\u91cf\u3001\u5e38\u91cf\u3001shell\u547d\u4ee4\u3001\u5750\u6807\u3002 \u65b9\u6cd5\u57fa\u7c7b\u7684\u5199\u6cd5\uff1a from src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u64cd\u4f5c\u5c42","text":" \u6a21\u5757\u5212\u5206 \u6309\u7167\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u6587\u7ba1\u4e3b\u754c\u9762\u5206\u4e3a\u4e09\u4e2a\u533a\u57df\uff1a\u6807\u9898\u680f\u3001\u53f3\u8fb9\u89c6\u56fe\u533a\u57df\u3001\u5de6\u8fb9\u89c6\u56fe\u533a\u57df \u5f39\u7a97\uff1a\u8bbe\u7f6e\u754c\u9762\u5f39\u7a97\u3001\u4fdd\u9669\u7bb1\u5f39\u7a97\u3001\u5220\u9664\u786e\u8ba4\u5f39\u7a97\u3001\u53ca\u5404\u79cd\u7f51\u7edc\u5f39\u7a97 \u53f3\u952e\u83dc\u5355\uff1a\u6682\u65f6\u4e0d\u8003\u8651\u4e3a\u5355\u72ec\u7684\u6a21\u5757\uff0c\u8003\u8651\u4ee5\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6848\u505a\u6210\u516c\u5171\u5e93\u3002 \u5404\u4e2a\u6a21\u5757\u53ea\u7ee7\u627f\u57fa\u7c7b from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u6784\u9020\u51fd\u6570\u91cc\u9762\u4e0d\u6784\u9020\u5bf9\u8c61\uff0c\u53ef\u4ee5\u521d\u59cb\u5316\u4e00\u4e9b\u53d8\u91cf\u3002 \u4e0d\u540c\u7684\u5b9a\u4f4d\u65b9\u6848\u8c03\u7528\u4e0d\u540c\u7684\u5b9a\u4f4d\u5de5\u5177\u5bf9\u8c61\u3002 self.dog\nself.ui\nself.d_bus\n \u65b9\u6cd5\u7f16\u5199 \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u5e94\u7528\u5c42","text":" \u7ee7\u627f\u64cd\u4f5c\u5c42\u7684\u6240\u6709\u7c7b\u3002 \u4ec5\u4ec5\u7528\u4e8e\u7528\u4f8b\u4e2d\u5bfc\u5165\u65b9\u4fbf\uff0c\u4e0d\u505a\u5176\u4ed6\u4e8b\u60c5\u3002 class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n DfmAssert \u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u7ee7\u627f\uff0c\u65b9\u4fbf\u4f7f\u7528\u65ad\u8a00\u8bed\u53e5\u3002 from apps.dde_file_manager.widget.dfm_widget import DfmWidget\nfrom public.assert import Assert\nclass DfmAssert(Assert):\ndef assert_file_exists_in_desktop(self, file_name):\nself.assert_file_exists(f\"~/Desktop{file_name}\")\n...\nDfmWidget().get_file_in_desktop()\n \u7528\u4f8b\u91cc\u9762\u76f4\u63a5\u7ee7\u627f\uff0c\u65b9\u4fbf\u5728\u7528\u4f8b\u91cc\u9762\u4f7f\u7528 self \u8fdb\u884c\u65ad\u8a00\uff0c\u66f4\u7b26\u5408\u65ad\u8a00\u7684\u4f7f\u7528\u4e60\u60ef\uff0c\u7528\u4f8b\u903b\u8f91\u4e0a\u66f4\u6e05\u695a\u3002 class BaseCase(DfmAssert):\npass\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\nself.assert_file_exists_in_desktop(\"xxx\")\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u903b\u8f91\u4e3e\u4f8b","text":"\u7528\u4f8b\u4ee3\u7801\u8c03\u7528\u903b\u8f91\u4e3e\u4f8b\uff1a # BaseWidget\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n# =============================================\n# TitleWidget\nclass TitleWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_title_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# RightViewWidget\nclass RightViewWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_right_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# =============================================\n# \u51fa\u53e3 DfmWidget\nclass DfmWidget(TitleWidget, RightViewWidget):\npass\n# =============================================\n# in case\nfrom apps.dde_file_manager.widget.dfm_widget import DfmWidget\ndfm = DfmWidget()\ndfm.click_xxx_title_by_ui()\ndfm.click_xxx_right_by_ui()\ndfm.dog.print_desc()\ndfm.ui.print_number()\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u5de5\u7a0b\u6539\u9020\u5b9e\u65bd\u6b65\u9aa4","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_2","title":"1\u3001\u5de5\u7a0b\u4ee3\u7801\u62c9\u53d6","text":"1.1. \u5c06\u81ea\u52a8\u5316\u57fa\u7840\u6846\u67b6\u7684\u529f\u80fd\u62c9\u5230\u672c\u5730 Autotest Basic Frame \uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame 1.2. \u5c06\u5e94\u7528\u5e93\u4ee3\u7801\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u5e94\u7528\u5e93\u7684\u4ed3\u5e93\u547d\u540d\u5e94\u8be5\u662f\u957f\u8fd9\u6837\u7684 autotest_deepin_xxx\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_2","title":"2\u3001\u8c03\u6574\u5de5\u7a0b\u76ee\u5f55","text":"\u6309\u7167 \u65b9\u6848\u8bbe\u8ba1-\u76ee\u5f55\u7ed3\u6784 \u8fdb\u884c\u76ee\u5f55\u8c03\u6574\uff0c\u5c3d\u91cf\u4f7f\u7528\u7f16\u8f91\u5668\u8fdb\u884c\u76f8\u5e94\u7684\u8c03\u6574\uff0c\u7f16\u8f91\u5668\u63a8\u8350\u4f7f\u7528 Pycharm \uff0c\u4ee5\u4e0b\u64cd\u4f5c\u5747\u5728 Pycharm \u91cc\u9762\u53ef\u5b9e\u73b0\u3002 2.1. \u9700\u8981\u79fb\u52a8 py \u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u76f4\u63a5\u5728\u7f16\u8f91\u5668\u91cc\u9762\uff0c\u4f7f\u7528\u9f20\u6807\u9009\u4e2d\u5e76\u6309\u4f4f\uff0c\u4e4b\u540e\u62d6\u52a8\u5230\u76ee\u6807\u4f4d\u7f6e\u5373\u53ef\uff0cPycharm \u4f1a\u5c3d\u53ef\u80fd\u7684\u81ea\u52a8\u89e3\u51b3\u79fb\u52a8\u5bfc\u81f4\u7684\u8def\u5f84\u95ee\u9898\u3002\u6ce8\u610f\uff0c\u6211\u8bf4\u7684\u662f\u201c\u5c3d\u53ef\u80fd\u201d\uff0c\u6709\u4e9b\u9a9a\u64cd\u4f5c\u7f16\u8f91\u5668\u662f\u65e0\u6cd5\u81ea\u52a8\u5904\u7406\u7684\u3002\u5982\u679c\u6ca1\u6709\u88ab\u7f16\u8f91\u5668\u81ea\u52a8\u5904\u7406\u7684\u8def\u5f84\u95ee\u9898\uff0c\u540e\u7eed\u53ea\u80fd\u624b\u52a8\u89e3\u51b3\u3002 2.2. \u9700\u8981\u91cd\u547d\u540d\u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u5728\u7f16\u8f91\u5668\u91cc\u9762\u9009\u4e2d\u6587\u4ef6\uff0c\u7136\u540e\u4f7f\u7528\u5feb\u6377\u952e Shift + F6 \uff08\u5982\u679c\u5feb\u6377\u952e\u6ca1\u53cd\u5e94\uff0c\u6587\u4ef6\u53f3\u952e\u83dc\u5355 Refactor \u2014\u2014 Rename\uff09\uff0c\u7136\u540e\u5728\u8f93\u5165\u6846\u4e2d\u8f93\u5165\u8981\u91cd\u547d\u540d\u7684\u540d\u79f0\uff0c\u540c\u65f6\uff0c\u786e\u8ba4\u52fe\u9009 Search for references \u548c Search in comments and strings \u8fd9\u4e24\u4e2a\u9009\u9879\uff0c\u6700\u540e\u6309\u56de\u8f66\u6216\u8005\u9f20\u6807\u70b9 Refactor \u3002 \u6ce8\u610f\uff0c\u6b64\u65f6\u7f16\u8f91\u5668\u53ef\u80fd\u4f1a\u63d0\u793a\u4f60\uff0c\u4f60\u8fd9\u4e2a\u91cd\u547d\u540d\u7684\u64cd\u4f5c\u5173\u8054\u4e86\u591a\u4e2a\u6a21\u5757\uff0c\u5b83\u88ab\u591a\u4e2a\u5730\u65b9\u90fd\u4f7f\u7528\u5230\u4e86\uff0c\u76f8\u5173\u7684\u6a21\u5757\u662f\u5426\u4e5f\u4e00\u8d77\u6539\u540d\u4e86\uff0c\u8fd9\u4e0d\u5e9f\u8bdd\u5417\uff0c\u7528\u8fd9\u4e2a\u529f\u80fd\u5c31\u662f\u60f3\u628a\u5173\u8054\u5230\u7684\u90fd\u4fee\u6539\uff0c\u4e0d\u7136\u6211\u4e3a\u4ec0\u4e48\u4e0d\u7528\u6587\u7ba1\u7684\u91cd\u547d\u540d\u529f\u80fd\u5462\uff0c\u522b\u60f3\u4e86\uff0c\u76f4\u63a5\u70b9\u5de6\u4e0b\u89d2\u7684 Refactor \u6309\u94ae\uff0c\u5c31\u662f\u5e72\u3002 \u7c7b\u540d\u3001\u51fd\u6570\u540d\u7684\u91cd\u547d\u540d\u90fd\u5c3d\u91cf\u91c7\u7528\u8fd9\u79cd\u65b9\u6848\uff0c\u56e0\u4e3a\u7f16\u8f91\u5668\u4f1a\u81ea\u52a8\u7ed9\u6211\u4eec\u627e\u5230\u5173\u8054\u7684\u5730\u65b9\uff0c\u7136\u540e\u540c\u6b65\u4fee\u6539\u6389\u3002\u4f60\u53ef\u5343\u4e07\u522b\u76f4\u63a5\u5220\u4e86\u4fee\u6539\u540d\u79f0\uff0c\u4e0d\u7136\u4f60\u53ef\u80fd\u4f1a\u82b1\u4e0a\u4e00\u5929\u7684\u65f6\u95f4\u6765\u89e3\u51b3\u91cd\u547d\u540d\u7684\u95ee\u9898\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u5b9e\u73b0\u6838\u5fc3\u5e93\u63a5\u53e3","text":"3.1. BaseWidget \u5728 BaseWidget \u91cc\u9762\u628a\u8be5\u5199\u7684\u90fd\u5199\u597d\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u4e0a\u9762\u7684\u8bbe\u8ba1\u7406\u5ff5\u6765\u5199\u3002 \u5982\u679c\u4f60\u5acc\u9ebb\u70e6\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u6587\u7ba1\u7684\u5b9e\u9645\u5de5\u7a0b\u4ee3\u7801 autotest_dde_file_manager : https://gerrit.uniontech.com/admin/repos/autotest_dde_file_manager \u3002 3.2. \u64cd\u4f5c\u5c42 \u5982\u679c\u4f60\u662f\u65b0\u5199\u9879\u76ee\uff0c\u4f60\u4f1a\u53d1\u73b0\u4e00\u5207\u90fd\u662f\u90a3\u4e48\u7684\u7b80\u5355\u3001\u76f4\u63a5\uff0c\u6309\u7167\u6211\u4eec\u63d0\u4f9b\u7ed9\u4f60\u7684\u63a5\u53e3\u5199\u7528\u4f8b\u7684\u64cd\u4f5c\u65b9\u6cd5\u5c31\u597d\u4e86\u3002 \u5982\u679c\u4f60\u662f\u60f3\u5bf9\u539f\u6765\u7684\u5de5\u7a0b\u8fdb\u884c\u6539\u9020\uff0c\u4f60\u9700\u8981\u6309\u7167\u6838\u5fc3\u5e93\u65b9\u6cd5\u7684\u8c03\u7528\uff0c\u5c06\u4f60\u4e4b\u524d\u5199\u7684\u6bcf\u4e2a\u65b9\u6848\u8fdb\u884c\u5bf9\u5e94\u7684\u4fee\u6539\uff0c\u5305\u62ec\u7c7b\u548c\u65b9\u6cd5\u7684\u547d\u540d\u3001\u65b9\u6cd5\u5185\u6240\u8981\u7528\u5230\u4e0d\u540c\u5b9a\u4f4d\u65b9\u6cd5\u7684\u5199\u6cd5\u4fee\u6539\u3002 \u8fd9\u65f6\u5019\u4f60\u53ef\u80fd\u4f60\u7684\u4ee3\u7801\u4e2d\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u62a5\u9519\uff0c\u4e0d\u7528\u62c5\u5fc3\uff0c\u4f60\u53ef\u4ee5\u4ece\u4e1a\u52a1\u903b\u8f91\u51fa\u53d1\uff0c\u60f3\u6e05\u695a\u8fd9\u4e2a\u65b9\u6cd5\u662f\u5e72\u4ec0\u4e48\u7684\u3001\u64cd\u4f5c\u7684\u5bf9\u8c61\u662f\u4ec0\u4e48\u3001\u53c2\u6570\u662f\u4ec0\u4e48\uff0c\u6ce8\u610f\u8fd9\u4e9b\u4fee\u6539\u662f\u4f1a\u5f71\u54cd\u5230\u7528\u4f8b\u4ee3\u7801\u91cc\u9762\u7684\uff0c\u6ca1\u5173\u7cfb\uff0c\u7528\u4f8b\u91cc\u9762\u672c\u6765\u4e5f\u5e94\u8be5\u88ab\u5173\u8054\u4fee\u6539\u3002 3.3. \u628a\u914d\u7f6e\u6a21\u5757\u5199\u597d\uff0c\u8fd9\u90e8\u5206\u57fa\u672c\u53ef\u4ee5\u590d\u5236\u6587\u7ba1\u7684\u4ee3\u7801\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4_1","title":"4\u3001\u8def\u5f84\u5904\u7406","text":"4.1. \u5bfc\u5165\u8def\u5f84 \u65b9\u6cd5\u548c\u7528\u4f8b\u4e2d\u90fd\u4f1a\u6d89\u53ca\u5230\u5bfc\u5165\u8def\u5f84\u7684\u4fee\u6539\uff0c\u5728\u4fee\u6539\u8def\u5f84\u65f6\uff0c\u5efa\u8bae\u4f60\u4f7f\u7528 Ctrl + Shift + R \u5168\u5c40\u66ff\u6362\uff0c\u4f1a\u5c06\u6574\u4e2a\u9879\u76ee\u4e0b\u7684\u76f8\u540c\u5730\u65b9\u90fd\u4fee\u6539\u5230\uff0c\u5f53\u7136\uff0c\u4f60\u4e5f\u53ef\u4ee5\u5728\u5c0f\u5f39\u7a97\u4e2d\u4fee\u6539\u5168\u5c40\u66ff\u6362\u4e3a\u5c40\u90e8\u76ee\u5f55\u4e0b\u66ff\u6362\u3002\u5904\u7406\u90a3\u79cd\u6ca1\u6709\u5173\u8054\u5173\u7cfb\uff0c\u4f46\u662f\u53c8\u662f\u76f8\u540c\u540d\u79f0\u7684\u91cd\u547d\u540d\uff0c\u6211\u4e5f\u63a8\u8350\u4f7f\u7528\u8fd9\u79cd\u65b9\u5f0f\u8fdb\u884c\u91cd\u547d\u540d\u3002 \u6ce8\u610f\uff0c\u5168\u5c40\u66ff\u6362\u7684\u65b9\u5f0f\u4efb\u7136\u65e0\u6cd5\u4fdd\u8bc1\u771f\u7684\u5168\u5c40\u88ab\u66ff\u6362\u4e86\uff08\u53ef\u80fd\u662f\u7f16\u8f91\u5668\u7684 Bug \u5427\uff09\uff0c\u6240\u4ee5\u4f60\u4ecd\u7136\u9700\u8981\u624b\u52a8\u770b\u4e0b\u5404\u5904\u662f\u5426\u4fee\u6539\u5230\u4f4d\u3002 4.2. \u8d44\u6e90\u8def\u5f84 \u4e00\u4e9b\u7528\u4f8b\u8d44\u6e90\u9700\u8981\u6839\u636e config.py \u91cc\u9762\u7684\u8def\u5f84\u914d\u7f6e\u8fdb\u884c\u8d44\u6e90\u8def\u5f84\u7684\u62fc\u63a5\uff0c\u5982\u679c\u4f60\u539f\u6765\u672c\u6765\u5c31\u6709\u4e00\u4e2a\u51fd\u6570\u4e13\u95e8\u7528\u4e8e\u7ec4\u88c5\u8def\u5f84\u7684\uff0c\u90a3\u4f60\u53ea\u9700\u8981\u4fee\u6539\u8fd9\u4e00\u4e2a\u5730\u65b9\u5c31\u597d\u4e86\uff0c\u5982\u679c\u4f60\u4e4b\u524d\u5e76\u6ca1\u6709\u8fd9\u6837\u7684\u8bbe\u8ba1\uff0c\u90a3\u53ef\u80fd\u9700\u8981\u4fee\u6539\u5927\u91cf\u6d89\u53ca\u5230\u8d44\u6e90\u8def\u5f84\u7684\u5730\u65b9\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5","title":"5\u3001\u8c03\u8bd5\u548c\u7f16\u5199\u7528\u4f8b","text":"\u4ee5\u4e0a\u51e0\u4e2a\u6b65\u9aa4\u505a\u5b8c\uff0c\u57fa\u672c\u5c31\u53ef\u4ee5\u8fdb\u884c\u7528\u4f8b\u4ee3\u7801\u7684\u8c03\u8bd5\u4e86\uff0c\u8fd9\u90e8\u5206\u5de5\u4f5c\u4e3b\u8981\u89e3\u51b3\u4f60\u4e4b\u524d\u51e0\u4e2a\u6b65\u9aa4\u9057\u6f0f\u7684\u95ee\u9898\uff0c\u5982\u679c\u6240\u6709\u7528\u4f8b\u90fd\u8c03\u8bd5\u901a\u8fc7\u4e86\uff0c\u90a3\u4e48\u5de5\u7a0b\u6539\u9020\u5c31\u5168\u90e8\u5b8c\u6210\u4e86\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/","title":"AT \u5f00\u53d1\u89c4\u8303","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u5f00\u53d1\u89c4\u8303\u662f\u6839\u636e\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fd0\u884c\u4e24\u5e74\u591a\u6765\uff0c\u9047\u5230\u95ee\u9898\u89e3\u51b3\u95ee\u9898\u800c\u5f62\u6210\u7684\u4e00\u4e9b\u89e3\u51b3\u65b9\u6848\uff0c\u6216\u8005\u8bf4\u7ecf\u9a8c\u603b\u7ed3\uff1b\u8fd9\u4e9b\u7ecf\u9a8c\u7b26\u5408\u6211\u4eec\u73b0\u9636\u6bb5 AT \u6240\u5e94\u7528\u7684\u573a\u666f\u9700\u8981\uff0c\u4e5f\u662f\u6211\u4eec\u7ecf\u8fc7\u957f\u671f\u601d\u8003\uff0c\u4e0d\u65ad\u8bd5\u9519\u4e0d\u65ad\u4fee\u6b63\uff0c\u5e76\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u5b9e\u8df5\u4e2d\u68c0\u9a8c\u8fc7\u53ef\u884c\u7684\u3002\u4ee5\u6b64\uff0c\u5e0c\u671b\u80fd\u5e2e\u52a9\u53c2\u4e0e\u5230\u81ea\u52a8\u5316\u7684\u76f8\u5173\u4eba\u5458\u51cf\u5c11\u8bd5\u9519\u6210\u672c\uff0c\u66f4\u597d\u3001\u66f4\u5feb\u7684\u7f16\u5199\u7528\u4f8b\u53ca\u7ef4\u62a4\u7528\u4f8b\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_1","title":"\u4e00\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u89c4\u8303","text":"\u6807\u7b7e\u5316\u7ba1\u7406\u6587\u6863\u8bf7\u53c2\u8003\uff1a \u300a\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u64cd\u4f5c\u6307\u5f15\u300b \u4ee5\u4e0b\u8bf4\u51e0\u4e2a\u5bb9\u6613\u51fa\u73b0\u7684\u95ee\u9898\uff1a"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1","title":"1. \u5bf9\u5e94\u5173\u7cfb","text":" \u5199\u5b8c\u81ea\u52a8\u5316\u7528\u4f8b\u4e4b\u540e\uff0c\u8bf7\u5728 CSV \u6587\u4ef6\u4e2d\u6807\u8bb0\u7528\u4f8b\u7684 ID\u3001\u7b49\u7ea7\u3002\u4e3a\u4e86\u63d0\u9192\u6807\u8bb0\uff0c\u6267\u884c\u7528\u4f8b\u65f6\u5728\u9996\u884c\u4f1a\u8f93\u51fa ERROR \u65e5\u5fd7\uff1a CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94\u7684 ID\uff1b \u5728\u6700\u7ec8\u63d0\u4ea4\u4ee3\u7801\u4e4b\u524d\uff0c\u4f60\u9700\u8981\u5728 CSV \u6587\u4ef6\u91cc\u9762\u5c06ID\u3001\u7528\u4f8b\u7b49\u7ea7\u7b49\u6807\u7b7e\u8865\u5168\uff0c\u5982\u679c CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94 ID\uff0c\u540e\u7eed\u5728\u6279\u91cf\u6267\u884c\u7684\u65f6\u5019\uff0c\u8fd9\u4e9b\u7528\u4f8b\u662f\u4e0d\u4f1a\u6267\u884c\u7684\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2","title":"2. \u540d\u79f0\u4e00\u81f4","text":" CSV \u6587\u4ef6\u7684\u6587\u4ef6\u540d\u3001\u7528\u4f8b\u51fd\u6570\u4e2d\u95f4\u7684\u540d\u79f0\u4e00\u81f4\u3001\u7528\u4f8b py \u6587\u4ef6\u4e2d\u95f4\u7684\u540d\u79f0\uff0c\u8fd9\u4e09\u4e2a\u540d\u79f0\u4e00\u81f4\u3002 \u4e3e\u4f8b\uff1a # test_music_001.py\ndef test_music_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u90a3\u4e48 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e3a music.csv\u3002 AT \u6846\u67b6\u5e95\u5c42\u4ee3\u7801\u5b9e\u73b0\u662f\u5c06 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e0e\u7528\u4f8b\u51fd\u6570\u540d\u79f0\u540d\u79f0\uff08item.name\uff09\u8fdb\u884c\u5bf9\u5e94\uff0c\u56e0\u6b64\uff0c\u6ce8\u610f CSV \u6587\u4ef6\u540d\u79f0\u5bf9\u5e94\u7684\u662f\u7528\u4f8b\u51fd\u6570\u540d\u79f0\uff0c\u5373 def test_music_001 \u91cc\u9762\u7684 music \uff0c\u800c\u4e0d\u662f test_music_001.py \u91cc\u9762\u7684 music \u3002 \u8fd9\u91cc\u7ec6\u7ec6\u54c1\u4e00\u4e0b\u54c8~ \u5982\u679c\u4f60\u5c06\u4e0a\u4f8b\u5199\u6210\u4e86\u8fd9\u6837: # test_music_001.py\ndef test_movie_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u7528\u4f8b\u6267\u884c\u6ca1\u95ee\u9898\uff0c\u4f46\u662f\u6807\u7b7e\u5316\u7ba1\u7406\u662f\u4e0d\u751f\u6548\u7684\uff0c\u6846\u67b6\u65e0\u6cd5\u5c06 music.csv\u6587\u4ef6\u91cc\u9762\u6807\u7b7e\uff0c\u6dfb\u52a0\u5230 test_movie_001\u8fd9\u4e2a\u7528\u4f8b\u4e2d\uff0c\u56e0\u4e3a\u4ed6\u4eec\u6ca1\u6709\u5bf9\u5e94\u5173\u7cfb\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#tag","title":"\u4e8c\u3001\u5206\u652f\u53ca tag \u7ba1\u7406\u89c4\u8303","text":"\u53c2\u8003\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u4ee3\u7801\u7ba1\u7406\u89c4\u8303\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2-tag","title":"2. \u5e94\u7528\u5e93 tag","text":" \u5e94\u7528\u5e93 tag \u6839\u636e\u5e94\u7528\u4ea4\u4ed8\u8282\u70b9\u751f\u6210\uff0c\u6bcf\u6b21\u6253 tag \u4e4b\u524d\uff0c\u76f8\u5173\u6d4b\u8bd5\u4eba\u5458\u9700\u8981\u8fdb\u884c\u7528\u4f8b\u8c03\u8bd5\uff1b \u8c03\u8bd5\u7528\u4f8b\u662f\u6307\u7684\u5728\u5168\u67b6\u6784\uff08x86\u3001arm\u3001mips\uff09\u4e0a\u8c03\u8bd5\u901a\u8fc7\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\u8fbe\u5230 90% \u4ee5\u4e0a\u624d\u80fd\u6253 tag\uff0c\u901a\u8fc7 Jenkins \u6267\u884c\u5668\u6267\u884c\u7528\u4f8b\uff0c\u4fdd\u7559\u901a\u8fc7\u7387\u7ed3\u679c\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\uff1a\u901a\u8fc7\u7528\u4f8b\u6570 / (\u603b\u7528\u4f8b\u6570 - \u5df2\u5e9f\u5f03\u7528\u4f8b) \u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u7b97\u901a\u8fc7 Jenkins \u6267\u884c\u5668 \u4f60\u53ef\u80fd\u4f1a\u5728\u4e00\u4e2a\u4ea4\u4ed8\u5468\u671f\u5185\u6301\u7eed\u7684\u8fdb\u884cAT\u7528\u4f8b\u8c03\u8bd5\uff0c\u4f46\u662f\u6700\u7ec8 AT \u7528\u4f8b\u6253 tag \u7684\u5e94\u7528\u7248\u672c\uff0c\u9700\u8981\u4f7f\u7528\u5e94\u7528\u96c6\u6210\u4ea4\u4ed8\u7684\u6700\u65b0\u5e94\u7528\u7248\u672c\uff0c\u53ef\u4ee5\u4f7f\u7528\u5e94\u7528\u7684\u63d0\u6d4b\u7248\u672c\uff1b\u4e00\u5b9a\u8981\u786e\u4fdd\u8c03\u8bd5\u7528\u4f8b\u7684\u5e94\u7528\u7248\u672c\u662f\u6700\u65b0\u7684\uff0c\u4e0d\u7136\u96c6\u6210\u8fdb\u53bb\u4e4b\u540e\uff0c\u6301\u7eed\u96c6\u6210\u5c31\u4f1a\u51fa\u95ee\u9898\uff1b tag \u53f7\u600e\u4e48\u6253\uff1f \u6839\u636e\u6301\u7eed\u96c6\u6210\u7684\u8981\u6c42\u751f\u6210\uff0c\u5176\u4e2d\u5e94\u7528\u7248\u672c\u53f7\u9700\u8981\u4e0e\u9879\u76ee\u7ecf\u7406\u786e\u8ba4\u672c\u6b21\u5373\u5c06\u96c6\u6210\u7684\u5e94\u7528\u7248\u672c\u53f7\u662f\u591a\u5c11\uff1b tag \u7684 commit \u4fe1\u606f\u683c\u5f0f\uff1a # commit msg\nversion:5.6.5\n \u5176\u4e2d 5.6.5 \u5199\u5e94\u7528\u7684\u96c6\u6210\u7248\u672c\u53f7\u3002 \u751f\u6210 tag \u7684\u547d\u4ee4\u53c2\u8003\uff1a\u300aGit \u6807\u7b7e\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3-tag","title":"3. \u57fa\u7840\u6846\u67b6 tag","text":"\u57fa\u7840\u6846\u67b6 tag \u4e0d\u4e0e\u4e1a\u52a1\u6302\u94a9\uff0c\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u6309\u9700\u53d1\u5e03\u7248\u672c\uff0c\u5728\u6839\u76ee\u5f55\u4e0b CURRENT \u6587\u4ef6\u4e2d\u8bb0\u5f55\u7684\u5f53\u524d\u7248\u672c\u53f7\u548c\u5386\u53f2\u7248\u672c\u53f7\uff0c\u53ca\u5176\u5bf9\u5e94\u65b0\u589e\u4e86\u54ea\u4e9b\u529f\u80fd\uff0c\u6709\u52a9\u4e8e\u5e94\u7528\u9009\u62e9\u5408\u9002\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\u3002 # CURRENT\n[current]\ntag = 0.9.5\n \u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u7684 control \u6587\u4ef6\u8bb0\u5f55\u5f53\u524d\u5e94\u7528\u5e93\u4f9d\u8d56\u7684\u57fa\u7840\u5e93\u7248\u672c\u3002 # control\n[Depends]\nautotest-basic-frame = 0.9.5\n \u7528\u4f8b\u5728\u6267\u884c\u65f6\u4f1a\u6821\u9a8c\u4e24\u4e2a\u6587\u4ef6\u7684\u7248\u672c\u53f7\u662f\u5426\u4e00\u81f4\uff0c\u5982\u679c\u4e0d\u4e00\u81f4\uff0c\u4f1a\u6253\u5370 error \u65e5\u5fd7\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_2","title":"\u4e09\u3001\u4ed3\u5e93\u6743\u9650\u7ba1\u7406","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_1","title":"1. \u57fa\u7840\u6846\u67b6","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u4ed3\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame \u57fa\u7840\u6846\u67b6\u4e0d\u5141\u8bb8\u533f\u540d\u8bbf\u95ee\uff0c\u5982\u679c\u4f60\u767b\u5f55 gerrit \u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u8bbf\u95ee\u4ee5\u4e0a\u94fe\u63a5\uff0c\u5219\u9700\u8981\u7533\u8bf7\u8bbf\u95ee\u6743\u9650\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_1","title":"2. \u5e94\u7528\u4ed3\u5e93","text":" \u81ea\u52a8\u5316\u5e94\u7528\u4ed3\u5e93\uff1a https://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684 app_name \u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_3","title":"\u56db\u3001\u65b9\u6cd5\u7f16\u5199&\u8c03\u7528\u89c4\u8303","text":"\u65b9\u6cd5\u7f16\u5199\u6574\u4f53\u8bbe\u8ba1\u601d\u8def\u53c2\u8003\uff1a[\u300aAT\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b]"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_2","title":"1. \u65b9\u6cd5\u7f16\u5199","text":"\u5199\u65b9\u6cd5\u7684\u65f6\u5019\u6ce8\u610f\u65b9\u6cd5\u5f52\u5c5e\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget\uff0c\u65b9\u6cd5\u662f\u5728\u54ea\u4e2a\u533a\u57df\u64cd\u4f5c\u7684\uff0c\u5c31\u5199\u5728\u54ea\u4e2a\u7c7b\u91cc\u9762\u3002 \u4e3e\u4f8b\uff1a from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n\"\"\"\u70b9\u51fb\u6807\u9898\u680fxxx\"\"\"\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_2","title":"2. \u65b9\u6cd5\u8c03\u7528","text":" \u5728\u7528\u4f8b\u4e2d\u8c03\u7528\u65b9\u6cd5\uff0c\u901a\u8fc7\u8be5\u5e94\u7528\u552f\u4e00\u7684\u51fa\u53e3\u8fdb\u884c\u8c03\u7528\uff0c\u6bd4\u5982\u6587\u7ba1\uff1a class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n \u4e0d\u8981\u5728\u7528\u4f8b\u4e2d\u5355\u72ec\u53bb\u8c03\u7528 TitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u8fd9\u4e9b\u7c7b\uff0c\u5426\u5219\u540e\u671f\u7528\u4f8b\u4f1a\u53d8\u5f97\u4e0d\u597d\u7ef4\u62a4\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_4","title":"\u4e94\u3001\u7528\u4f8b\u7f16\u5199\u89c4\u8303","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_3","title":"1. \u57fa\u4e8e\u7c7b\u5199\u7528\u4f8b","text":"\u6240\u6709\u7528\u4f8b\u90fd\u5e94\u8be5\u57fa\u4e8e\u7c7b\u53bb\u5199\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001(self):\n\"\"\"\u97f3\u4e50\u542f\u52a8\"\"\"\n \u6ce8\u610f\u4ee5\u4e0b\u51e0\u70b9\uff1a \u7c7b\u540d\u4e0d\u8981\u968f\u4fbf\u53d6\uff0c\u540c\u4e00\u4e2a\u5e94\u7528\u5e94\u8be5\u4f7f\u7528\u540c\u4e00\u4e2a\u7c7b\u540d\uff0c\u7528\u4f8b\u7c7b\u540d\u79f0\u5fc5\u987b\u4ee5 Test \u5f00\u5934\uff0c\u9075\u5faa\u5927\u9a7c\u5cf0\u547d\u540d\u89c4\u8303\uff1b \u7528\u4f8b\u7c7b\u7ee7\u627f BaseCase\uff0c\u4e00\u4e2a\u5e94\u7528\u53ea\u6709\u4e00\u4e2a BaseCase \u4e00\u4e2a py \u6587\u4ef6\u91cc\u9762\u53ea\u6709\u4e00\u4e2a\u7c7b\uff0c\u6211\u4eec\u79f0\u4e3a\u4e00\u4e2a\u6d4b\u8bd5\u7c7b\uff1b \u4e00\u4e2a\u7c7b\u91cc\u9762\u53ef\u4ee5\u6709\u591a\u4e2a\u7528\u4f8b\u51fd\u6570\uff0c\u8fd9\u53d6\u51b3\u8fd9\u6761\u7528\u4f8b\u6709\u591a\u5c11\u4e2a\u6d4b\u8bd5\u70b9\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001_1(self):\n\"\"\"\u4efb\u52a1\u680f\u542f\u52a8\u97f3\u4e50\"\"\"\ndef test_music_001_2(self):\n\"\"\"\u542f\u52a8\u5668\u542f\u52a8\u97f3\u4e50\"\"\" \ndef test_music_001_3(self):\n\"\"\"\u684c\u9762\u542f\u52a8\u97f3\u4e50\"\"\"\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_3","title":"2. \u7528\u4f8b\u51fd\u6570\u89c4\u8303","text":" \u7528\u4f8b\u51fd\u6570\u4ee5 test \u5f00\u5934\uff0c\u9075\u5faa\u86c7\u5f62\u547d\u540d\u89c4\u8303\uff0c\u4e2d\u95f4\u4e3a\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0\uff0c\u540e\u9762\u52a0\u7528\u4f8b ID\uff0c\u6700\u540e\u52a0\u6d4b\u8bd5\u70b9\u5e8f\u53f7\uff0c\u5373 test_${module}_${case_id}[_${index}] \uff1b \u6bd4\u5982\uff1atest_music_001_1\uff0cindex \u4ece 1 \u5f00\u59cb\u3002 \u51fd\u6570\u529f\u80fd\u8bf4\u660e\u91cc\u9762\u5199\u7528\u4f8b\u6807\u9898\uff0c\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u6807\u9898\u5373\u53ef\uff0c\u6ce8\u610f\u7528\u4e09\u5bf9\u53cc\u5f15\u53f7\uff0c\u4e0d\u8981\u7528\u5176\u4ed6\u6ce8\u91ca\uff0c\u66f4\u4e0d\u8981\u7528\u4e95\u53f7\u6ce8\u91ca\u5199\u7528\u4f8b\u6807\u9898\uff1b \u76f4\u63a5\u590d\u5236 PMS \u7528\u4f8b \u7528\u4f8b\u6b65\u9aa4\u76f4\u63a5\u5c06 PMS \u4e0a\u7528\u4f8b\u6b65\u9aa4\u548c\u9884\u671f\u590d\u5236\u8fdb\u6765\uff0c\u7136\u540e\u8fdb\u884c\u6279\u91cf\u6ce8\u91ca\uff08ctrl + /\uff09\uff0c\u5728\u6ce8\u91ca\u7684\u57fa\u7840\u4e0a\u53bb\u5199\u7528\u4f8b\u811a\u672c\u4f1a\u66f4\u52a0\u65b9\u4fbf\u5168\u9762\uff0c\u4e5f\u6bd4\u4f60\u81ea\u5df1\u5199\u6ce8\u91ca\u66f4\u8282\u7ea6\u65f6\u95f4\uff1a \u4e3e\u4f8b\uff0cPMS \u7528\u4f8b\uff1a \u76f4\u63a5\u9009\u4e2d\u7528\u4f8b\u5185\u5bb9\uff0c\u590d\u5236\u4e0b\u6765\uff0c\u7136\u540e\u7c98\u8d34\u5230\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c\u4e2d\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\n \u4e0a\u4f8b\u4e2d\u4e95\u53f7\u6ce8\u91ca\u90e8\u5206\u5c31\u662f\u76f4\u63a5\u4ece PMS \u4e0a\u590d\u5236\u8fc7\u6765\u7684\uff0c\u5728\u6b64\u57fa\u7840\u4e0a\u5199\u7528\u4f8b\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\nmusic = DeepinMusicWidget()\nmusic.click_singer_btn_in_music_by_ui()\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\nmusic.click_icon_mode_in_music_by_ui()\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\nmusic.double_click_first_singer_in_singer_icon_view_by_ui()\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\nself.assert_xxx\n \u4f60\u770b\uff0c\u975e\u5e38\u6e05\u695a\u6bcf\u4e00\u6b65\u5728\u505a\u4ec0\u4e48\uff0c\u91cd\u70b9\u662f\u7701\u53bb\u4e86\u5199\u6ce8\u91ca\u7684\u65f6\u95f4\uff0c\u771f\u7684\u7092\u9e21\u65b9\u4fbf\u3002 \u4e0d\u5199 if __name__ == '__main__':\uff0c\u4e0d\u5199\u591a\u4f59\u7684\u4ee3\u7801\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3","title":"3. \u6570\u636e\u9a71\u52a8","text":" \u5982\u679c\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u662f\u76f8\u540c\u7684\uff0c\u53ea\u662f\u4e00\u4e9b\u53c2\u6570\u53d8\u5316\uff0c\u5c3d\u91cf\u4f7f\u7528\u6570\u636e\u9a71\u52a8\u6765\u5b9e\u73b0\u7528\u4f8b\uff1b \u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u6570\u636e\u9a71\u52a8\u7684\u6570\u636e\uff0c\u4e0d\u80fd\u56e0\u6b64\u5f15\u5165\u4f9d\u8d56\uff0c\u5c3d\u91cf\u4f7f\u7528\u4e00\u4e9b\u6807\u51c6\u5e93\u80fd\u8bfb\u53d6\u7684\u6587\u4ef6\u683c\u5f0f\uff0c\u6bd4\u5982 json\u3001ini\u3001CSV\u3001xml\u3001txt \u7b49\u6587\u4ef6\u683c\u5f0f\uff1b\u4e0d\u5efa\u8bae\u4f7f\u7528 Yaml\u3001Excel\u3001MySQL \u7b49\u6570\u636e\u683c\u5f0f\uff1b \u8bfb\u53d6\u6570\u636e\u65f6\u4e5f\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff0c\u5982\u4f7f\u7528 pandas \u5904\u7406 CSV \u5c31\u5c5e\u4e8e\u5927\u6750\u5c0f\u7528\u4e86\uff0c\u6b63\u5e38\u7684\u6570\u636e\u9a71\u52a8\u8fd8\u6ca1\u5230\u9700\u8981\u5927\u6570\u636e\u5206\u6790\u6765\u5904\u7406\u7684\u5730\u6b65\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u5728 widget/ddt/ \u76ee\u5f55\u4e0b\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5199\u6cd5\uff1a @pytest.mark.parametrize(\"value\", data)\ndef test_smb_049(self, value):\n \u4ee5\u4e0a\u8fd9\u79cd\u53c2\u6570\u5316\u7684\u5199\u6cd5\u672c\u8eab\u6ca1\u4ec0\u4e48\u95ee\u9898\uff0c\u4f46\u662f\uff0c\u8fd9\u91cc\u5fc5\u987b\u8981\u8865\u5145\u4e00\u4e2a\u6ca1\u6709\u7528\u7684\u5c0f\u77e5\u8bc6\uff1a \u5982\u679c\u53c2\u6570\u5316\u6570\u636e\u91cc\u9762\u7684\u5b57\u7b26\u4f1a\u539f\u5c01\u4e0d\u52a8\u7684\u8f93\u51fa\u5230 item.name \u91cc\u9762\uff0c\u663e\u793a\u975e\u5e38\u4e0d\u4f18\u96c5\uff0c\u800c\u4e14\u53ef\u4ee5\u4f1a\u5f15\u5165\u4e00\u4e9b\u610f\u60f3\u4e0d\u5230\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u611f\u53d7\u4e00\u4e0b\uff1a \u53c2\u6570\uff1a data = [\n\"\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\", \"qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678\",\n]\n \u73b0\u8c61\u662f\u8fd9\u6837\u8272\u513f\u7684\uff1a test_smb_049.py::TestFileManager::test_smb_049[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09]\ntest_smb_049.py::TestFileManager::test_smb_049[qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui]\ntest_smb_049.py::TestFileManager::test_smb_049[12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678]\n \u8bf4\u5b9e\u8bdd\uff0c\u770b\u7740\u5fc3\u91cc\u5835\u5f97\u614c\uff0c\u5982\u679c\u8fd9\u91cc\u9762\u5305\u542b\u4e00\u4e9b\u7279\u6b8a\u5b57\u7b26\u6216\u8005\u662f\u8d85\u957f\uff0c\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u5f88\u5947\u5999\u7684\u4e8b\u60c5\u53d1\u751f\u3002 parametrize \u91cc\u9762\u6709\u4e2a\u53c2\u6570\uff1aids\uff0c\u53ef\u4ee5\u89e3\u51b3\u6b64\u7c7b\u95ee\u9898\uff0c\u5c31\u50cf\u8fd9\u6837\uff1a @pytest.mark.parametrize(\"value\", data, ids=[1, 2, 3])\ndef test_smb_049(self, value):\n \u518d\u6765\u611f\u53d7\u4e00\u4e0b\uff1a test_smb_049.py::TestFileManager::test_smb_049[1]\ntest_smb_049.py::TestFileManager::test_smb_049[2]\ntest_smb_049.py::TestFileManager::test_smb_049[3]\n \u660e\u663e\u597d\u591a\u4e86\uff0c\u6240\u4ee5\u5c3d\u91cf\u4f7f\u7528 ids \u8fd9\u4e2a\u53c2\u6570\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 fixture \u7684\u6570\u636e\u9a71\u52a8\u65b9\u5f0f\uff0c\u6846\u67b6\u867d\u7136\u652f\u6301\uff0c\u4f46\u53ef\u8bfb\u6027\u6bd4\u8f83\u5dee\uff1b\u5982\u679c\u4f60\u4e0d\u77e5\u9053\u8fd9\u53e5\u8bdd\u5728\u8bf4\u5565\uff0c\u90a3\u4f60\u53ef\u4ee5\u5ffd\u7565\uff0c\u6211\u4e5f\u4e0d\u6253\u7b97\u8be6\u7ec6\u8bf4\u8fd9\u79cd\u5b9e\u73b0\u65b9\u5f0f\uff0c\u64cd\u4f5c\u6bd4\u8f83\u9a9a\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4","title":"4. \u65ad\u8a00\u8d44\u6e90","text":" \u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u76f4\u63a5\u653e\u5728\u7528\u4f8b\u6a21\u5757\u7684\u540c\u7ea7\u76ee\u5f55\u4e0b\u7684 assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0 + \u7528\u4f8b ID \u547d\u540d\uff1b \u56fe\u50cf\u8bc6\u522b\u65ad\u8a00\uff0c\u4e0d\u8981\u622a\u53d6\u4e00\u5f20\u5f88\u5927\u7684\u56fe\uff0c\u56fe\u7247\u8d44\u6e90\u5305\u542b\u7684\u5143\u7d20\u592a\u591a\u4e86\uff0c\u975e\u5e38\u5bb9\u6613\u53d7\u5230\u9700\u6c42\u5f71\u54cd\uff0c\u5efa\u8bae\u662f\u8fdb\u884c\u5c40\u90e8\u7684\u65ad\u8a00\uff1b \u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u5339\u914d\u5ea6\u662f 0.9\uff0c\u5982\u679c\u65ad\u8a00\u7684\u573a\u666f\u5bf9\u4e8e\u7cbe\u786e\u5ea6\u8981\u6c42\u6ca1\u90a3\u4e48\u9ad8\uff0c\u53ef\u4ee5\u5728\u65ad\u8a00\u8bed\u53e5\u91cc\u9762\u4f20\u5165\u5c0f\u4e8e 0.9 \u7684\u53c2\u6570\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5","title":"5. \u5143\u7d20\u5b9a\u4f4d","text":" \u7528\u4e8e\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u4e2d\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u547d\u540d\u4e3a\u8be5\u5143\u7d20\u7684\u540d\u79f0\uff1b \u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u622a\u53d6\u65f6\u5c3d\u91cf\u7cbe\u786e\u5230\u8fd9\u4e2a\u5177\u4f53\u7684\u6309\u94ae\uff0c\u56fe\u7247\u4e5f\u4e0d\u8981\u592a\u5927\uff1b \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u64cd\u4f5c\u8f83\u5feb\uff0c\u5408\u7406\u52a0\u5165\u7b49\u5f85\u65f6\u95f4\u80fd\u63d0\u9ad8\u7528\u4f8b\u7684\u7a33\u5b9a\u6027\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6","title":"6. \u7528\u4f8b\u8d44\u6e90","text":" \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u4f7f\u7528\u5230\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u6bd4\u5982\u97f3\u4e50\u53ef\u80fd\u9700\u8981\u4e00\u4e9b mp3 \u7684\u8d44\u6e90\u7528\u4e8e\u6d4b\u8bd5\uff0c\u5b58\u653e\u5728 widget/case_res \u76ee\u5f55\u4e0b\uff0c\u524d\u63d0\u662f\u8fd9\u4e9b\u8d44\u6e90\u4e0d\u8d85\u8fc7 10M\uff1b \u5982\u679c\u662f\u4e00\u4e9b\u6bd4\u8f83\u5927\u7684\u8d44\u6e90\uff0c\u5efa\u8bae\u653e\u5230\u7edf\u4e00\u7684 ftp \u670d\u52a1\u5668 \uff08ftp://10.8.10.245\uff09\uff0c\u9700\u8981\u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\u518d\u4e0b\u8f7d\u4e0b\u6765\uff1b f\"wget ftp://{Config.FTP_IP}/uploads/\u591a\u5a92\u4f53/\u5f71\u9662/auto/{file_name};unzip {file_name};rm -rf {file_name};\"\n \u6d4b\u8bd5\u8d44\u6e90\u4e0b\u8f7d\u5230\u5e94\u7528 widget/case_res \u76ee\u5f55\u4e0b\uff1b \u7981\u6b62\u5c06\u6d4b\u8bd5\u8d44\u6e90\u5b58\u653e\u5728\u4e2a\u4eba\u7684\u673a\u5668\u4e0a\uff1b \u5e94\u8be5\u5c3d\u91cf\u4fdd\u8bc1\uff0c\u4e00\u4e2a\u8d44\u6e90\u5728\u4e00\u6b21\u7528\u4f8b\u6267\u884c\u4e2d\u53ea\u9700\u8981\u4e0b\u8f7d\u4e00\u6b21\uff0c\u6240\u4ee5\u4f60\u4e0d\u80fd\u6bcf\u6b21\u4f7f\u7528\u7684\u65f6\u5019\u90fd\u53bb\u4e0b\u8f7d\uff0c\u8fd9\u6837\u53ef\u80fd\u4f1a\u8017\u8d39\u5927\u91cf\u7684\u7f51\u7edc\u8d44\u6e90\uff0c\u800c\u56e0\u4e3a\u5148\u5224\u65ad\u672c\u5730\u662f\u5426\u5b58\u5728\u6b64\u8d44\u6e90\uff0c\u5982\u679c\u4e0d\u5b58\u5728\u518d\u53bb\u4e0b\u8f7d\uff1b \u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u5c06\u8d44\u6e90\u62f7\u8d1d\u5230\u5bf9\u5e94\u7684\u6d4b\u8bd5\u76ee\u5f55\u4e0b\uff0c\u6bd4\u5982\u5c06 mp3 \u6587\u4ef6\u62f7\u8d1d\u5230 ~/Music \u76ee\u5f55\u4e0b\uff0c\u4f46\u662f\u6211\u4eec\u66f4\u5efa\u8bae\u4f60\u4f7f\u7528\u53d1\u9001\u5feb\u6377\u94fe\u63a5\u7684\u65b9\u5f0f\u66ff\u4ee3\u62f7\u8d1d\u7684\u64cd\u4f5c\uff0c\u56e0\u4e3a\u5728\u62f7\u8d1d\u5927\u6587\u4ef6\u65f6\u662f\u5f88\u6d88\u8017\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u800c\u521b\u5efa\u94fe\u63a5\u5219\u4e0d\u4f1a\uff1b @classmethod\ndef recovery_many_movies_in_movie_by_cmd(cls):\n\"\"\"\u6062\u590d\u591a\u4e2a\u89c6\u9891\u6587\u4ef6\u81f3\u89c6\u9891\u76ee\u5f55\u4e2d\"\"\"\nwork_path = f\"/home/{Config.USERNAME}/Videos/auto\"\ncode_path = f\"{Config.CASE_RES_PATH}/auto\"\ncls.run_cmd(f\"rm -rf {work_path};mkdir {work_path}\")\nsleep(1)\nflag = False\nif not exists(code_path):\ncls.run_cmd(f\"mkdir -p {code_path}\")\nflag = True\nlogger.info(f\"ln -s {code_path}/* {work_path}/\")\ncls.run_cmd(\nf\"cd {code_path}/;\"\nf\"{cls.wget_file('auto.zip') if flag else ''}\"\nf\"ln -s {code_path}/* {work_path}/ > /dev/null 2>&1\"\n)\n \u8d44\u6e90\u4e0b\u8f7d\u8fc7\u7a0b\u4e2d\u6ce8\u610f\u8d85\u65f6\u7684\u95ee\u9898\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u5f88\u5927\uff0c\u8981\u7279\u522b\u6ce8\u610f\u8fd9\u95ee\u9898\uff0c\u5982\u679c\u4f60\u4f7f\u7528\u5f3a\u5236\u7b49\u5f85\u4e0b\u8f7d\u7ed3\u675f( os.system )\uff0c\u53ef\u80fd\u4f1a\u9020\u6210\u7528\u4f8b\u6267\u884c\u65f6\u957f\u53d8\u5f97\u4e0d\u53ef\u63a5\u53d7\uff0c\u76ee\u524d\u6211\u4eec\u53d1\u73b0\u5728\u6301\u7eed\u96c6\u6210\u73af\u5883\u6267\u884c\u65f6\u7f51\u7edc\u4e0b\u8f7d\u901f\u5ea6\u5f88\u6162\uff0c\u6240\u4ee5\u8d85\u65f6\u673a\u5236\u662f\u5f88\u6709\u5fc5\u8981\u7684\uff1brun_cmd \u65b9\u6cd5\u6709\u4e00\u4e2a\u9ed8\u8ba4\u8d85\u65f6\u7684\u65f6\u95f4\uff0c\u4f60\u53ef\u4ee5\u6839\u636e\u8d44\u6e90\u5927\u5c0f\u5bf9\u8d85\u65f6\u65f6\u95f4\u8fdb\u884c\u8c03\u6574\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_5","title":"\u516d\u3001\u7528\u4f8b\u8c03\u8bd5\u6280\u5de7","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_4","title":"1. \u65e5\u5fd7","text":" \u4e00\u5b9a\u8981\u5148\u770b\u62a5\u9519\uff0c\u770b error \u65e5\u5fd7\uff0c\u901a\u5e38\u80fd\u660e\u786e\u7684\u544a\u8bc9\u4f60\u5177\u4f53\u54ea\u91cc\u4ee3\u7801\u62a5\u9519\uff1b \u7ed3\u5408\u62a5\u9519\u70b9\u524d\u9762\u7684error\u3001 info \u548c debug \u65e5\u5fd7\u770b\u5426\u662f\u6b63\u5e38\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_4","title":"2. \u65ad\u70b9\u8c03\u8bd5","text":" \u65b9\u6cd5\u62a5\u9519\uff1a \u5728\u65b9\u6cd5\u5e93\u4e2d\u627e\u5230\u5bf9\u5e94\u7684\u65b9\u6cd5\uff0c\u5355\u72ec\u8c03\u7528\uff0c\u770b\u662f\u5426\u80fd\u6b63\u5e38\u6267\u884c\uff1b \u901a\u5e38\u5355\u4e2a\u65b9\u6cd5\u7684\u6267\u884c\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u62a5\u9519\uff0c\u5f88\u5feb\u5c31\u80fd\u6392\u67e5\u51fa\u95ee\u9898\uff1b\u5728\u65b9\u6cd5\u5185\u90e8\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u65b9\u6cd5\u5185\u90e8\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u8c03\u7528\u6ca1\u95ee\u9898\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u62a5\u9519\u7684\u65b9\u6cd5\u524d\u9762\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u7528\u4f8b\u7684\u4e1a\u52a1\u903b\u8f91\u548c\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u65ad\u8a00\u62a5\u9519\uff1a \u65ad\u8a00\u4e3a\u6570\u636e\u65ad\u8a00\uff0c\u6839\u636e\u8868\u8fbe\u5f0f\u8fdb\u884c\u65ad\u8a00\u8bed\u53e5\u8fdb\u884c\u4fee\u6539\uff1b \u6587\u4ef6\u751f\u6210\u7c7b\u65ad\u8a00\uff0c\u67e5\u770b\u662f\u5426\u9700\u8981\u52a0\u7b49\u5f85\u65f6\u95f4\uff1b \u56fe\u50cf\u65ad\u8a00\uff0c\u5728\u65ad\u8a00\u8bed\u53e5\u5904\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u7528\u4f8b\u8fd0\u884c\u5230\u65ad\u8a00\u5904\u4f1a\u505c\u6b62\uff0c\u67e5\u770b\u6b64\u65f6\u65ad\u8a00\u7684\u56fe\u7247\u4e0e\u7528\u4f8b\u6267\u884c\u7684\u73b0\u573a\u5b58\u5728\u4ec0\u4e48\u5dee\u5f02\uff0c\u6b64\u65f6\u4e5f\u53ef\u4ee5\u8fdb\u884c\u91cd\u65b0\u622a\u56fe\uff0c\u4ece\u800c\u66ff\u6362\u65b0\u7684\u56fe\u7247\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3_1","title":"3. \u8fdc\u7a0b\u6267\u884c","text":" \u8fdc\u7a0b\u6267\u884c\u6307\u7684\u662f\u7f16\u8f91\u5668\u901a\u8fc7\u6307\u5b9a\u8fdc\u7a0b\u89e3\u91ca\u5668\u6267\u884c\u81ea\u52a8\u5316\u4ee3\u7801\uff1b \u8fdc\u7a0b\u6267\u884c\u7684\u597d\u5904\u662f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u7684 Debug \u8fd0\u884c\uff0c\u4e0d\u7528\u5728\u6d4b\u8bd5\u673a\u4e0a\u6253\u5f00\u7f16\u8f91\u5668\uff0c\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u66f4\u5feb\uff1b \u652f\u6301\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u7684\u7f16\u8f91\u5668\uff1a \u4e13\u4e1a\u7248 Pycharm VScode \uff0c\u9700\u8981\u4f7f\u7528\u63d2\u4ef6 Remote-SSH \u8fdc\u7a0b\u6267\u884c\u914d\u7f6e \u4ee5 Pycharm \u4e3a\u4f8b\uff1a File \u2014> Settings \u2014> Project \u2014> Python Interpreter \u2014> \u53f3\u8fb9\u8bbe\u7f6e\u6309\u94ae \u2014> Add... \u2014> SSH Interpreter \u2014> New server configuration(\u586b\u5165host\u548cusername) \u2014> Next \u2014> password\uff08\u6d4b\u8bd5\u673a\u5bc6\u7801\uff09 \u2014> Interpreter(\u9009\u62e9\u8fdc\u7a0b\u89e3\u91ca\u5668) \u2014> Finish "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4_1","title":"4. \u73af\u5883\u6e05\u7406","text":" \u5982\u679c\u7528\u4f8b\u91cc\u9762\u7684 teardown \u6ca1\u6709\u6267\u884c\uff0c\u5927\u6982\u7387\u662f\u56e0\u4e3a setup \u91cc\u9762\u4ee3\u7801\u62a5\u9519\uff0c\u8fd9\u4e24\u4e2a\u662f\u4e00\u5bf9\u7684\uff0csetup \u91cc\u9762\u62a5\u9519\uff0cteardown \u91cc\u9762\u7684\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\uff1b \u76ee\u524d\u6211\u4eec\u5df2\u7ecf\u5c06\u5404\u5e94\u7528\u7684 clean_all \u8fd9\u4e2a fixture \u6539\u6210\u4e86\u7ec8\u7ed3\u5668\uff0c\u786e\u4fdd\u59cb\u7ec8\u80fd\u6267\u884c\u5230\u8fd9\u6b65\uff0c\u4f46\u662f\u7528\u4f8b\u91cc\u9762\u7684 fixture\uff0c\u8fd8\u662f\u9700\u8981\u6211\u4eec\u5c0f\u5fc3\u5904\u7406\uff1b \u8981\u6267\u884c clean_all \u9700\u8981\u5728\u7f16\u8f91\u5668\u8fd0\u884c\u53c2\u6570\u52a0 --clean yes\uff0c\u5199\u7528\u4f8b\u7684\u65f6\u5019\u8bf7\u52a0\u4e0a\uff0c\u4e0d\u7136\u4f60\u4e0d\u786e\u5b9a\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u7684\u73af\u5883\u662f\u5426\u6062\u590d\uff1b setup \u53ef\u4ee5\u4e0d\u8981\uff0c\u5c06 setup \u653e\u5230\u7528\u4f8b\u91cc\u9762\u662f\u4e00\u79cd\u7a33\u59a5\u7684\u505a\u6cd5\uff0cteardown \u4e00\u5b9a\u8981\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5_1","title":"5. \u5143\u7d20\u5b9a\u4f4d\u4e0d\u51c6\uff08\u5750\u6807\u8fd4\u56de\u4e0d\u5bf9\uff09","text":" \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u53ef\u80fd\u53d7\u5230\u7a97\u53e3 ID \u7684\u53d8\u5316\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u9ed8\u8ba4\u53d6\u6700\u65b0\u7684\u4e00\u4e2a\u7a97\u53e3\u7528\u4e8e\u5b9a\u4f4d\uff0c\u4f46\u5982\u679c\u5b9e\u9645\u9700\u8981\u5b9a\u4f4d\u7684\u4e0d\u662f\u6700\u65b0\u7684\u7a97\u53e3\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u91cd\u65b0\u5b9e\u4f8b\u5316\u65b9\u6cd5\u7c7b\u5bf9\u8c61\uff0c\u5e76\u5728\u7c7b\u4e2d\u4f20\u5165\u5bf9\u5e94\u7684\u7a97\u53e3\u5e8f\u53f7\uff1b \u57fa\u4e8e\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u76ee\u524d\u9047\u5230\u7684\u7b14\u8bb0\u672c\u4e0a\uff0c\u7531\u4e8e\u5c4f\u5e55\u7f29\u653e\u6bd4\u4f8b\u4e3a 1.25\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u6211\u4eec\u9ed8\u8ba4\u4f7f\u7528\u7f29\u653e\u6bd4\u4f8b\u4e3a 1\uff1b \u57fa\u4e8e\u56fe\u50cf\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u76ee\u6807\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b \u57fa\u4e8e OCR \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u6587\u5b57\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u540c\u6837\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6_1","title":"6. \u952e\u9f20\u64cd\u4f5c\u4e0d\u51c6","text":" \u9f20\u6807\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6bd4\u5982\u53f3\u952e\u3001\u53cc\u51fb\u65e0\u54cd\u5e94\uff1b \u952e\u76d8\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6216\u8005\u5ef6\u8fdf\u8f93\u5165\uff0c\u6bd4\u5982\u7528\u4f8b\u9700\u8981\u8f93\u5165\u201c\u6211\u662f\u4e2d\u56fd\u4eba\u201d\uff0c\u5b9e\u9645\u53ea\u8f93\u5165\u4e86\u201c\u6211\u56fd\u4eba\u201d\uff1b \u4ee5\u4e0a\u95ee\u9898\u6392\u9664\u5e94\u7528\u5361\u987f\u7b49\u95ee\u9898\uff0c\u5927\u6982\u7387\u662f\u7531\u4e8e\u5de5\u5177\u7684\u95ee\u9898\uff0c\u76ee\u524d\u952e\u9f20\u64cd\u4f5c\u6211\u4eec\u4f7f\u7528\u4e09\u4e2a\u5de5\u5177\uff1aDogtail \u63d0\u4f9b\u7684\u952e\u9f20\u5de5\u5177\u3001PyAutoGUI\u3001Xdotool \uff1b \u6709\u540c\u5b66\u53ef\u80fd\u8981\u8bf4\u4e3a\u5565\u8981\u7528\u4e09\u4e2a\u554a\uff0c\u7528\u4e00\u4e2a\u4e0d\u5c31\u597d\u4e86\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u5404\u6709\u4f18\u70b9\u5404\u6709\u7f3a\u70b9\u3002 \u5982\u679c\u4f60\u9047\u5230\u952e\u9f20\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u8bd5\u8bd5\u901a\u8fc7\u4e0d\u540c\u7684\u5de5\u5177\u64cd\u4f5c\uff1b\u952e\u76d8\u8f93\u5165\u5ef6\u8fdf\u7684\u95ee\u9898\uff0c\u4e00\u822c\u662f\u56e0\u4e3a\u8f93\u5165\u901f\u5ea6\u592a\u5feb\u4e86\uff0c\u7cfb\u7edf\u6ca1\u53cd\u5e94\u8fc7\u6765\uff0c\u5e38\u89c1\u4e8e ARM \u548c MIPS \u4e0a\uff0c\u4fee\u6539\u53c2\u6570 delay_time \u7684\u503c\uff0c\u5355\u4f4d\u4e3a\u6beb\u79d2\uff1b # mouse_key.py\n@classmethod\ndef input_message(cls, message, delay_time=300, interval=0.2):\n\"\"\"\n \u8f93\u5165\u5b57\u7b26\u4e32\n :param message: \u8f93\u5165\u7684\u5185\u5bb9\n :param delay_time: \u5ef6\u8fdf\u65f6\u95f4\n :param interval:\n :return:\n \"\"\"\n \u5982\u679c\u4e0d\u662f\u65b9\u6cd5\u7684\u95ee\u9898\uff0c\u5219\u9700\u8981\u7ee7\u7eed\u548c\u5f00\u53d1\u4e00\u8d77\u6392\u9664\uff0c\u662f\u5426\u4e3a\u5e94\u7528\u63a5\u53d7\u952e\u9f20\u4fe1\u53f7\u5904\u7406\u7684\u95ee\u9898\uff0c\u8fd9\u7c7b\u60c5\u51b5\u6211\u4eec\u4e5f\u662f\u9047\u5230\u8fc7\u7684\uff0c\u5177\u4f53\u95ee\u9898\u5177\u4f53\u5206\u6790\u3002 \u6bd4\u5982\u5f71\u9662\u5c31\u91cd\u5199\u4e86\u4e00\u4e2a\u53f3\u952e\u7684\u65b9\u6cd5\uff1a # base_widget.py\n@classmethod\ndef right_click(cls, _x=None, _y=None):\n\"\"\"\n \u91cd\u5199\u5e95\u5c42\u5355\u51fb\u9f20\u6807\u53f3\u952e\n \u89e3\u51b3\u5f71\u9662\u53f3\u952e\u89e6\u53d1release\u4e8b\u4ef6\u7684\u95ee\u9898\uff08\u53f3\u952e\u4e3b\u7a97\u53e3\u4f1a\u64ad\u653e\u89c6\u9891\uff09\n \"\"\"\ncls.mouse_down(_x, _y, button=3)\nsleep(0.1)\ncls.mouse_up(button=3)\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_6","title":"\u4e03\u3001\u5176\u4ed6\u4e0d\u4e3a\u4eba\u77e5\u7684\u7ec6\u8282","text":" \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u5c3d\u91cf\u7f16\u5199\u540c\u4e00\u4e2a\u5e94\u7528\u6216\u6a21\u5757\u7684\u7528\u4f8b\uff0c\u80fd\u5bf9\u8be5\u7528\u4f8b\u5df2\u6709\u65b9\u6cd5\u719f\u6089\uff0c\u907f\u514d\u8fc7\u591a\u91cd\u590d\u4e1a\u52a1\u4ee3\u7801\u7684\u5c01\u88c5\uff1b \u76f8\u540c\u7684\u573a\u666f\u4e0b\uff0c\u5404\u67b6\u6784\u7b49\u5f85\u65f6\u95f4\u4e0d\u540c\uff0c\u5efa\u8bae\u4f7f\u7528\u6846\u67b6\u63d0\u4f9b\u7684 sleep\uff0c\u6211\u4eec\u505a\u4e86\u4e0d\u540c\u67b6\u6784\u7684\u500d\u6570\u653e\u5927\uff1b \u7f16\u5199\u7528\u4f8b\u65f6\uff0c\u5c3d\u91cf\u8003\u8651\u5230\u6bcf\u4e00\u6b65\u5f02\u5e38\u540e\u7684\u73af\u5883\u6062\u590d\uff0c\u9700\u8981\u5efa\u8bae\u8fd9\u79cd\u610f\u8bc6\uff0c\u968f\u65f6\u8981\u8003\u8651\u5230\uff0c\u8fd9\u6b65\u64cd\u4f5c\u6709\u6ca1\u6709\u53ef\u80fd\u51fa\u9519\uff0c\u51fa\u9519\u4e86\u6539\u600e\u4e48\u529e\uff1b \u63d0\u4ea4\u4ee3\u7801\u7684\u65f6\u5019\u6ce8\u610f\u4e0d\u8981\u628a\u4e00\u4e9b\u4e34\u65f6\u7684\u6d4b\u8bd5\u8d44\u6e90\u63d0\u4ea4\u8fdb\u53bb\u4e86\uff0c\u6bd4\u5982\u6d4b\u8bd5\u4e86\u4e00\u4e2a\u5f71\u7247\uff0c\u6709\u4e9b\u540c\u5b66\u4e60\u60ef\u4f7f\u7528 git add . \uff0c\u7136\u540e\u5c31\u5168\u90e8\u63d0\u4ea4\u5230\u4ee3\u7801\u4ed3\u5e93\u4e86\uff0c\u8fd9\u6837\u5373\u4f7f\u540e\u671f\u628a\u5927\u6587\u4ef6\u5220\u4e86\uff0c.git \u6587\u4ef6\u91cc\u9762\u4e5f\u4f1a\u5f88\u5927\uff0c\u9020\u6210\u4ee3\u7801\u4ed3\u5e93\u53d8\u5f97\u5341\u5206\u81c3\u80bf\u3002 \u66f4\u591a\u7ec6\u8282\u67e5\u770b\uff1a\u300aAT\u7ecf\u9a8c\u603b\u7ed3\u300b"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/","title":"AT \u6267\u884c\u5668\u4f7f\u7528\u6307\u5317","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/5/25\n# Author : litao\n# =============================================\n Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1","title":"1\u3001\u529f\u80fd\u4ecb\u7ecd","text":" \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7cfb\u7edf\u8bed\u8a00\u8bbe\u7f6e\uff0c\u5206\u8fa8\u7387\u8bbe\u7f6e\u53ca\u7528\u4f8b\u6267\u884c\u73af\u5883\u642d\u5efa\uff1b \u652f\u6301 IP \u4e3a 15 \u7f51\u6bb5\u7684 AMD \u67b6\u6784\u6d4b\u8bd5\u673a\u955c\u50cf\u88c5\u673a\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u6307\u5b9a\u5e94\u7528\uff0c\u6307\u5b9a\u8303\u56f4\u6807\u7b7e\u7684\u7528\u4f8b\u6267\u884c\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u72b6\u6001\u68c0\u67e5\uff0c\u662f\u5426\u6709\u6b63\u5728\u8fd0\u884c\u7684\u6d4b\u8bd5\uff1b \u652f\u6301\u914d\u7f6e\u7528\u4f8b\u6267\u884c\u65f6\u957f\uff0c\u9632\u6b62\u4efb\u52a1\u963b\u585e\uff1b \u652f\u6301\u6839\u636e\u5e94\u7528\u7248\u672c\u81ea\u52a8\u67e5\u627e\u5bf9\u5e94\u7684\u7528\u4f8b tag\uff1b \u652f\u6301\u5f02\u5e38\u5904\u7406\u548c\u6d4b\u8bd5\u5b8c\u6210\u7684\u5b9e\u65f6\u6d88\u606f\u901a\u77e5\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2job","title":"2\u3001Job \u4ecb\u7ecd","text":"\u4ee5\u4e0b\u6309\u6267\u884c\u6d41\u7a0b\u7684\u987a\u5e8f\u4ecb\u7ecd\uff0c\u6bcf\u4e00\u6b65\u90fd\u53ef\u4ee5\u5355\u72ec\u6267\u884c\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1_1","title":"1\u3001\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/AT_test/ \u6574\u4e2a\u6d41\u7a0b\u7684\u4e3b\u5165\u53e3\uff0c\u901a\u8fc7\u8fd9\u4e2a\u5165\u53e3\uff0c\u8fde\u540c\u6574\u4e2a\u6d4b\u8bd5\u6d41\u7a0b\uff0c\u955c\u50cf\u88c5\u673a\uff0c\u73af\u5883\u90e8\u7f72\uff0c\u6d4b\u8bd5\u5e94\u7528\u53ca\u751f\u6210\u62a5\u544a\u3002 \u53c2\u6570\u4ecb\u7ecd\uff1a \u6d4b\u8bd5\u673a\uff1a\u6240\u6709\u89c4\u6574\u5230\u56fa\u5b9a\u533a\u57df\u7684\u6d4b\u8bd5\u673a\uff0c\u901a\u8fc7\u6d4b\u8bd5\u540c\u5b66\u5bf9\u6d4b\u8bd5\u673a\u7684\u4e60\u60ef\u547d\u540d\uff0c\u5728\u540e\u53f0\u6620\u5c04\u6d4b\u8bd5\u673a\u7684\u8be6\u7ec6\u4fe1\u606f\uff0c\u62ec\u53f7\u4e2d\u4e3a\u6d4b\u8bd5\u673a IP \u7684\u6700\u540e\u4e00\u4f4d\uff1b \u6d4b\u8bd5\u5e94\u7528\uff1a\u6307\u5b9a\u7684\u6d4b\u8bd5\u5e94\u7528\u7684\u5305\u540d\uff0c\u7cfb\u7edf\u6839\u636e\u540d\u79f0\u81ea\u52a8\u62c9\u53d6\u5bf9\u5e94\u7684\u4ed3\u5e93\u4ee3\u7801\uff1b deb\u5305\u4e0b\u8f7d\u5730\u5740\uff1a\u6d4b\u8bd5\u4e0a\u8ff0\u5e94\u7528\u65f6\uff0c\u9700\u8981\u5b89\u88c5\u7684deb\u5305\u4e0b\u8f7d\u5730\u5740\uff0c\u591a\u4e2a\u5730\u5740\u7528\u201c,\u201d\u9694\u5f00\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff1b \u8303\u56f4\u6807\u7b7e\uff1a\u6267\u884c\u6d4b\u8bd5\u7528\u4f8b\u7684\u6807\u7b7e\u8303\u56f4\uff0c\u5bf9\u5e94\u7528\u4f8b\u4ee3\u7801 csv \u6587\u4ef6\u4e2d\u7684\u6807\u7b7e\u4fe1\u606f\uff0c\u4ee5 pytest \u7684mark\u8bed\u6cd5\u7f16\u5199\uff1b \u7cfb\u7edf\u8bed\u8a00\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u8bed\u8a00\u73af\u5883\uff1b \u5206\u8fa8\u7387\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u5206\u8fa8\u7387\u73af\u5883\uff1b \u955c\u50cf\u5730\u5740\uff1a\u955c\u50cf\u4ed3\u5e93\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u901a\u8fc7 PXE \u88c5\u673a\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u88c5\u673a\u73af\u8282\uff08\u76ee\u524d\u4ec5\u652f\u6301\u90e8\u5206 AMD \u67b6\u6784\u7684\u88c5\u673a\uff09\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2pxe","title":"2\u3001PXE \u88c5\u673a","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/IOS_install/ \u8f93\u5165\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\uff0cIP\uff0c\u5bc6\u7801\uff0c\u955c\u50cf\u5730\u5740\u540e\uff0c\u81ea\u52a8\u88c5\u673a\uff0c\u76ee\u524d\u4ec5\u652f\u6301\u56fa\u5b9a 15 \u7f51\u6bb5\u7684\u90e8\u5206 AMD \u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#3","title":"3\u3001\u6b21\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/all_client_test/ \u8be5\u5165\u53e3\u4e0e\u4e3b\u5165\u53e3\u529f\u80fd\u57fa\u672c\u4e00\u81f4\uff0c\u53ea\u662f\u5265\u79bb\u4e86PXE\u88c5\u673a\u6d41\u7a0b\uff0c\u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7684\u6267\u884c\u6d41\u7a0b\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#4","title":"4\u3001\u73af\u5883\u90e8\u7f72","text":"Jenkins url\uff1ahttps://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/env/build?delay=0sec \u8bbe\u7f6e\u6d4b\u8bd5\u673a\u7684\u7cfb\u7edf\u8bed\u8a00\uff0c\u5206\u8fa8\u7387\u53ca\u5b89\u88c5\u6d4b\u8bd5\u6240\u9700\u7684\u4f9d\u8d56\u5305\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#5","title":"5\u3001\u53d1\u9001\u4ee3\u7801","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/send_code/ \u6839\u636e\u6d4b\u8bd5\u5e94\u7528\u540d\u79f0\uff0c\u62c9\u53d6\u5bf9\u5e94\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u5e76\u6839\u636e\u6d4b\u8bd5\u673a\u4e0a\u5e94\u7528\u7248\u672c\u5207\u6362\u5230\u5bf9\u5e94\u7684tag\u7248\u672c\uff0c\u82e5\u672a\u627e\u5230tag\u7248\u672c\uff0c\u5219\u4f7f\u7528\u6700\u65b0\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u518d\u6839\u636e\u5e94\u7528\u5e93\u4ee3\u7801\u4e2d\u914d\u7f6e\u7684\u57fa\u7840\u5e93\u7248\u672c\uff0c\u62c9\u53d6\u57fa\u7840\u5e93\u4ee3\u7801\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#6","title":"6\u3001\u7528\u4f8b\u6267\u884c","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/run_test/ \u8fd0\u884c\u6d4b\u8bd5\u673a\u4e0a\u7684\u7528\u4f8b"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/","title":"AT \u7528\u4f8b\u7b5b\u9009\u6307\u5317","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u7528\u4f8b\u7b5b\u9009\u6807\u51c6\uff0c\u662f\u6311\u9009\u5408\u9002\u7684\u6587\u672c\u7528\u4f8b\u8fdb\u884c\u81ea\u52a8\u5316\u7528\u4f8b\u8f6c\u5316\u7684\u4e00\u4e9b\u901a\u7528\u6807\u51c6\u3002 \u8fc7\u53bb\u6211\u4eec\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u5b9e\u8df5\u8fc7\u7a0b\u4e2d\uff0c\u5199\u4e86\u4e0d\u5c11\u81ea\u52a8\u5316\u7528\u4f8b\uff0c\u968f\u7740\u9700\u6c42\u7684\u8fed\u4ee3\uff0c\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u81ea\u7136\u8150\u5316\uff0c\u56e0\u800c\u9700\u8981\u5728\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\u5bf9\u81ea\u52a8\u5316\u7528\u4f8b\u8fdb\u884c\u7ef4\u62a4\uff0c\u5728\u7ef4\u62a4\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u6211\u4eec\u53d1\u73b0\uff0c\u6709\u4e9b\u7528\u4f8b\u7ef4\u62a4\u8d77\u6765\u592a\u96be\u4e86\uff0c\u8c03\u8bd5\u7528\u4f8b\u8017\u8d39\u5927\u91cf\u65f6\u95f4\uff0c\u6210\u672c\u5f88\u9ad8\u3002 \u56e0\u6b64\uff0c\u6211\u4eec\u603b\u7ed3\u4e00\u4e9b\u81ea\u52a8\u5316\u7528\u4f8b\u9009\u578b\u7684\u6807\u51c6\uff0c\u4ee5\u4f18\u5316\u540e\u7eed\u81ea\u52a8\u5316\u7528\u4f8b\u7ed3\u6784\uff0c\u671f\u5f85\u6211\u4eec\u80fd\u7f16\u5199\u51fa\u9ad8\u6548\u3001\u7a33\u5b9a\u3001\u6613\u4e8e\u7ef4\u62a4\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_1","title":"\u4e00\u3001\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u53ef\u4ee5\u5206\u4e3a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u548c\u4e13\u9879\u81ea\u52a8\u5316\u6d4b\u8bd5\uff0c\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e00\u822c\u53ea\u9488\u5bf9\u4e00\u4e9b\u5e38\u89c4\u7684\u529f\u80fd\u6d4b\u8bd5\uff0c\u5176\u4ed6\u975e\u5e38\u89c4\u529f\u80fd\u7684\u7528\u4f8b\uff0c\u5e94\u8be5\u91c7\u7528\u4e13\u9879\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u6848\uff1b \u4ee5\u4e0b\u662f\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1","title":"1. \u7a33\u5b9a\u6027\u3001\u538b\u6d4b\u7528\u4f8b","text":"\u7a33\u5b9a\u6027\u6d4b\u8bd5\u3001\u538b\u6d4b\u7528\u4f8b\u5e94\u8be5\u662f\u5c5e\u4e8e\u6027\u80fd\u76f8\u5173\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u5982\uff1a\u53cd\u590d\u591a\u6b21\u70b9\u51fb\u6309\u94ae\uff0c\u68c0\u9a8c\u5176\u529f\u80fd\u7a33\u5b9a\u6027\u3002\u56e0\u4e3a\u8fd9\u4e9b\u7528\u4f8b\u65ad\u8a00\u7684\u9884\u671f\u53ef\u80fd\u4e0d\u662f\u5f88\u660e\u786e\uff0c\u66f4\u6709\u751a\u8005\u4e0d\u9700\u8981\u65ad\u8a00\uff0c\u7528\u4f8b\u65f6\u957f\u6bd4\u8f83\u957f\uff0c\u800c\u4e14\u4e0d\u53ef\u63a7\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u76ee\u524d\u6211\u4eec\u6709\u6027\u80fd\u81ea\u52a8\u5316\u7684\u4e13\u9879\u65b9\u6848\uff0c\u4ee5\u53ca\u4e00\u4e9b\u7a33\u5b9a\u6027\u6d4b\u8bd5\u7684\u4e13\u9879\u65b9\u6848\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u6b64\u7c7b\u7528\u4f8b\u653e\u5230\u4e13\u9879\u81ea\u52a8\u5316\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2","title":"2. \u6d89\u53ca\u591a\u4e2a\u7528\u6237\u64cd\u4f5c","text":"\u5e38\u89c1\u4e0e\u6587\u7ba1\u7684\u7528\u4f8b\u4e2d\uff0c\u591a\u7528\u6237\u64cd\u4f5c\u7684\u7528\u4f8b\u4e00\u822c\u90fd\u4f1a\u6d89\u53ca\u5230\u5728\u7cfb\u7edf\u4e2d\u8fdb\u884c\u591a\u4e2a\u7528\u6237\u95f4\u7684\u5207\u6362\uff0c\u81ea\u52a8\u5316\u811a\u672c\u4e00\u822c\u662f\u8fd0\u884c\u5728\u4e00\u4e2a\u7528\u6237\u7a7a\u95f4\u4e0b\u7684\uff0c\u6240\u4ee5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u591a\u7528\u6237\u95f4\u7684\u5207\u6362\u3002 \u6b64\u7c7b\u4e0d\u5efa\u8bae\u91c7\u7528\u81ea\u52a8\u5316\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3","title":"3. \u4e0e\u5f00\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4ea4\u4e92","text":"\u6b64\u7c7b\u573a\u666f\u591a\u4e3a\u5e94\u7528\u7684\u5f02\u5e38\u573a\u666f\u6d4b\u8bd5\uff0c\u6bd4\u5982\uff1a\u590d\u5236\u5927\u6587\u4ef6\u8fc7\u7a0b\u4e2d\u6ce8\u9500\u673a\u5668\u3002 \u81ea\u52a8\u5316\u811a\u672c\u5728\u7cfb\u7edf\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4e4b\u540e\u662f\u4f1a\u505c\u6b62\u8fd0\u884c\u7684\uff1b\u6b64\u7c7b\u7528\u4f8b\u53ef\u4ee5\u505a\u81ea\u52a8\u5316\uff0c\u4f46\u662f\u540c\u6837\u9700\u8981\u505a\u4e13\u9879\u65b9\u6848\uff0c\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u7684\u5904\u7406\u903b\u8f91\u5b8c\u5168\u4e0d\u540c\u3002 \u540e\u7eed\u81ea\u52a8\u5316\u9700\u8981\u516c\u5173\u7684\u70b9\uff1a \u81ea\u52a8\u5316\u811a\u672c\u5728\u672c\u673a\u8fd0\u884c\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u81f3\u5c11\u9700\u8981\u63d0\u4f9b\u4ee5\u4e0b\u529f\u80fd\uff1a \u91cd\u542f\u4e4b\u540e\u7528\u4f8b\u80fd\u81ea\u52a8\u8fd0\u884c\uff1b\u53ef\u4ee5\u8003\u8651\u5c06\u6267\u884c\u7528\u4f8b\u5199\u6210\u4e00\u4e2a\u5f00\u673a\u81ea\u542f\u7684\u670d\u52a1\uff1b \u80fd\u8bb0\u5f55\u5173\u673a\u4e4b\u524d\u7528\u4f8b\u6267\u884c\u7684\u4f4d\u7f6e\uff0c\u91cd\u542f\u4e4b\u540e\u80fd\u4ece\u6b64\u4f4d\u7f6e\u5f00\u59cb\u6267\u884c\uff1b \u50cf\u6027\u80fd\u81ea\u52a8\u5316\u4e00\u6837\uff0c\u7531\u670d\u52a1\u7aef\u63a7\u5236\uff1b \u5b8c\u5168\u57fa\u4e8e\u56fe\u5f62\u8bc6\u522b\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u4e32\u53e3\u7ebf\u63a7\u5236\u952e\u9f20\u7a33\u5b9a\u6027\uff1b "},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4","title":"4. \u6d4b\u8bd5\u6267\u884c\u65f6\u95f4\u957f","text":"\u7528\u4f8b\u6267\u884c\u65f6\u95f4\u63a7\u5236\u57282\u5206\u949f\u4ee5\u5185\uff0c\u6781\u7aef\u60c5\u51b5\u4e0d\u8981\u8d85\u8fc75\u5206\u949f\uff0c\u6240\u6709\u7528\u4f8b\u7684\u5e73\u5747\u65f6\u957f\u5e94\u8be5\u57281\u5206\u949f\u5de6\u53f3\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u95f4\u592a\u957f\uff0c\u7f16\u5199\u7528\u4f8b\u3001\u8c03\u8bd5\u7528\u4f8b\u3001\u6267\u884c\u7528\u4f8b\u3001\u7ef4\u62a4\u7528\u4f8b\u90fd\u975e\u5e38\u7684\u8017\u65f6\uff0c\u4eba\u529b\u6210\u672c\u65f6\u95f4\u6210\u672c\u6295\u5165\u592a\u9ad8\u3002 \u4f60\u60f3\uff0c\u8fd9\u6761\u7528\u4f8b\u6267\u884c\u9700\u89815\u5206\u949f\uff0c\u90a3\u4f60\u5199\u8fd9\u6761\u7528\u4f8b\u7684\u65f6\u95f4\u4e0d\u53ef\u80fd\u4e00\u904d\u8fc7\uff0c\u5199\u7684\u8fc7\u7a0b\u4e2d\u8dd1\u4e0d\u901a\u8fd8\u5f97\u91cd\u8dd1\u81f3\u5c1115\u5206\u949f\u4e0d\u8fc7\u5206\uff0c\u5199\u5b8c\u4e86\u8fd8\u5f97\u5728\u5176\u4ed6\u67b6\u6784\u4e0a\u8c03\u8bd5\uff0c\u534a\u4e2a\u5c0f\u65f6\u8fc7\u53bb\u4e86\uff0c\u8fd9\u8fd8\u53ea\u662f\u7b2c\u4e00\u6b21\u5199\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u540e\u7eed\u5982\u679c\u7528\u4f8b\u7ef4\u62a4\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u7ecf\u5e38\u6295\u5165\u76f8\u5f53\u957f\u65f6\u95f4\uff0c\u8fd9\u6837\u5176\u5b9e\u662f\u5931\u53bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u7684\u3002\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u5c31\u5e94\u8be5\u662f\u5feb\u51c6\u72e0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5","title":"5. \u8fb9\u7f18\u6027\u6d4b\u8bd5","text":"\u6709\u4e9b\u529f\u80fd\u6a21\u5757\u672c\u8eab\u662f\u5c5e\u4e8e\u6bd4\u8f83\u8fb9\u7f18\u6027\u7684\uff0c\u5373\u6781\u5c11\u7528\u6237\u4f1a\u4f7f\u7528\u5230\u7684\u529f\u80fd\uff0c\u8fd9\u7c7b\u529f\u80fd\u6a21\u5757\u4e0d\u9700\u8981\u5927\u89c4\u6a21\u5b9e\u73b0\u81ea\u52a8\u5316\uff0c\u4e00\u4e24\u4e2a\u573a\u666f\u8986\u76d6\u57fa\u672c\u529f\u80fd\u5c31\u884c\u4e86\uff0c\u56e0\u6b64\u6211\u4eec\u5728\u6311\u9009\u6b64\u7c7b\u7528\u4f8b\u7684\u65f6\u5019\u53ef\u4ee5\u7ed3\u5408\u6574\u4e2a\u529f\u80fd\u6a21\u5757\u7684\u8986\u76d6\u60c5\u51b5\u6765\u51b3\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6","title":"6. \u9700\u8981\u4f9d\u8d56\u4eba\u5de5\u4ecb\u5165\u7684","text":"\u81ea\u52a8\u5316\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\u662f\u6ca1\u6709\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bd4\u5982\u8981\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u90a3\u4e48\u5c31\u80cc\u79bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u3002 \u6bd4\u5982\u5149\u9a71\u6a21\u5757\uff0c\u5149\u9a71\u523b\u5f55\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u4f46\u662f\u5149\u9a71\u523b\u5f55\u4e4b\u540e\u5149\u76d8\u4f1a\u5f39\u51fa\u6765\uff0c\u9700\u8981\u4eba\u5de5\u66f4\u6362\u5149\u76d8\uff0c\u518d\u624b\u52a8\u63a8\u8fdb\u5149\u9a71\u4e2d\u3002 \u8fd9\u79cd\u529f\u80fd\u6a21\u5757\u5373\u4f7f\u505a\u81ea\u52a8\u5316\uff0c\u80fd\u6d89\u53ca\u5230\u7684\u529f\u80fd\u975e\u5e38\u6709\u9650\uff0c\u800c\u4e14\u4e0d\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u6240\u4ee5\u660e\u663e\u5c31\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7","title":"7. \u96be\u4ee5\u5b9e\u73b0\u7684","text":"\u7528\u4f8b\u6240\u6d89\u53ca\u5230\u7684\u65b9\u6cd5\u5b9e\u73b0\u8d77\u6765\u53ef\u80fd\u6709\u96be\u5ea6\uff0c\u751a\u81f3\u73b0\u9636\u6bb5\u65e0\u6cd5\u5b9e\u73b0\u7684\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002 \u6bd4\u5982\u5f71\u9662\u6d4b\u8bd5\u753b\u9762\u6e05\u6670\u5ea6\u3001\u6d41\u7545\u5ea6\u3001\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u4e4b\u540e\u7684\u89c6\u9891\u662f\u5426\u5b58\u5728\u5361\u987f\u7b49\u7528\u4f8b\uff0c\u73b0\u9636\u6bb5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#8","title":"8. \u529f\u80fd\u4e0d\u7a33\u5b9a","text":"\u8fd9\u4e2a\u4e0d\u662f\u8bf4\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\uff0c\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\u4e0d\u7a33\u5b9a\u662f\u6b63\u5e38\u7684\uff0c\u8fd9\u79cd\u6211\u4eec\u53ef\u4ee5\u7b49\u5f00\u53d1\u63d0\u6d4b\u4e4b\u540e\u518d\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u3002 \u529f\u80fd\u4e0d\u7a33\u5b9a\u6307\u7684\u662f\u7528\u4f8b\u6240\u6d89\u53ca\u7684\u529f\u80fd\uff0c\u53ef\u80fd\u5b58\u5728\u591a\u79cd\u53d8\u5316\uff0c\u6bcf\u6b21\u6267\u884c\u7528\u4f8b\u53ef\u80fd\u65ad\u8a00\u7684\u9884\u671f\u90fd\u4e0d\u540c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#9","title":"9. \u52a8\u6001\u65ad\u8a00","text":"\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u76f4\u5230\u7528\u4f8b\u7ed3\u675f\uff0c\u4e00\u76f4\u662f\u4e00\u4e2a\u52a8\u6001\u53d8\u5316\u7684\u8fc7\u7a0b\uff0c\u800c\u4e14\u65e0\u6cd5\u901a\u8fc7\u5176\u4ed6\u624b\u6bb5\u505c\u4e0b\u6765\uff1b \u6bd4\u5982\uff1a\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u65f6\uff0c\u53f3\u4e0b\u89d2\u7684\u5f55\u5236\u65f6\u95f4\u662f\u4e00\u76f4\u5728\u53d8\u5316\u7684\uff0c\u7528\u4f8b\u9700\u8981\u6d4b\u8bd5\u5f55\u52361\u5206\u949f\u4e4b\u540e\uff0c\u5f55\u5236\u65f6\u95f4\u662f\u521a\u597d\u505c\u572860\u79d2\uff1b \u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fd8\u505a\u4e0d\u5230\u65f6\u95f4\u7cbe\u51c6\u63a7\u5236\uff0c\u7a0b\u5e8f\u6267\u884c\u65f6\u95f4\u662f\u6709\u6ce2\u52a8\u7684\uff0c\u800c\u4e14\u8981\u9002\u914d\u591a\u4e2a\u5e73\u53f0\uff0c\u6240\u4ee5\u6b64\u7c7b\u7528\u4f8b\u5927\u6982\u7387\u4f1a\u6267\u884c\u5931\u8d25\u3002\u7279\u522b\u662f\u5728\u6027\u80fd\u8f83\u5dee\u7684\u56fd\u4ea7\u5316\u67b6\u6784\u4e0a\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u592a\u53ef\u80fd\u7a33\u5b9a\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#10","title":"10. \u63a2\u7d22\u6027\u6d4b\u8bd5","text":"\u63a2\u7d22\u6027\u6d4b\u8bd5\u901a\u5e38\u662f\u4e00\u4e9b\u4e0d\u786e\u5b9a\u7684\u64cd\u4f5c\uff0c\u591a\u53d8\u5207\u590d\u6742\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u9884\u671f\u4e5f\u53ef\u80fd\u662f\u4e0d\u786e\u5b9a\u7684\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u9a9a\u64cd\u4f5c\u592a\u591a\u4e86\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6b64\u7c7b\u7528\u4f8b\u9002\u5408\u91c7\u7528\u624b\u5de5\u6d4b\u8bd5\uff0c\u662f\u624b\u5de5\u6d4b\u8bd5\u771f\u6b63\u7684\u4ef7\u503c\u4f53\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#11","title":"11. \u6613\u7528\u6027\u6d4b\u8bd5","text":"\u5bf9\u4e8e\u6613\u7528\u6027\u7684\u5224\u65ad\u901a\u5e38\u662f\u4e3b\u89c2\u7684\uff0c\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\u5f88\u96be\u53bb\u5b9a\u4e49\u4ec0\u4e48\u6837\u7684\u60c5\u51b5\u5bf9\u7528\u6237\u662f\u6613\u7528\u7684\uff0c\u81ea\u52a8\u5316\u9700\u8981\u6709\u660e\u786e\u7684\u53ef\u5b9e\u73b0\u7684\u9884\u671f\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_2","title":"\u4e8c\u3001\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u524d\u9762\u8bb2\u4e86\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u4e00\u4e9b\u7528\u4f8b\u60c5\u51b5\uff0c\u6709\u540c\u5b66\u5c31\u8bf4\u4e86\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\u4e0d\u7528\u8bb2\u4e86\uff0c\u5c31\u662f\u4e0d\u9002\u5408\u7684\u53cd\u9762\u3002\u6ca1\u6bdb\u75c5\u54c8\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\uff0c\u6211\u4eec\u5927\u4f53\u8fd8\u53ef\u4ee5\u5206\u4e3a\u4e24\u7c7b\uff1a \u7b2c\u4e00\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u597d\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u7b2c\u4e8c\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u4e00\u822c\uff0c\u9700\u8981\u6295\u5165\u66f4\u591a\u7cbe\u529b\u624d\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u4ee5\u4e0b\u4ecb\u7ecd\u4e00\u4e9b\u6211\u4eec\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1_1","title":"1. \u64cd\u4f5c\u76f8\u5bf9\u7b80\u5355","text":"\u7528\u4f8b\u6b65\u9aa4\u76f8\u5bf9\u8f83\u5c11\uff0c\u8fd9\u79cd\u7528\u4f8b\u901a\u5e38\u662f\u4e00\u4e9b\u8def\u5f84\u5f88\u6d45\u7684\u7528\u4f8b\uff0c\u4e00\u822c\u4e5f\u662f\u4e00\u4e9b\u57fa\u7840\u7528\u4f8b\u3002\u7528\u4f8b\u7f16\u5199\u3001\u7ef4\u62a4\u90fd\u53ef\u4ee5\u8f7b\u677e\u641e\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2_1","title":"2. \u5bb9\u6613\u5b9e\u73b0","text":"\u73b0\u6709\u6280\u672f\u662f\u53ef\u5b9e\u73b0\u7684\uff0c\u6ca1\u6709\u96be\u5ea6\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3_1","title":"3. \u7ecf\u5e38\u7528\u4e8e\u56de\u5f52\u6d4b\u8bd5","text":"\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bcf\u6b21\u56de\u5f52\u6d4b\u8bd5\u5fc5\u987b\u8981\u6267\u884c\u7684\u7528\u4f8b\uff0c\u90a3\u4e48\u8fd9\u6761\u7528\u4f8b\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u3002 \u56de\u5f52\u6d4b\u8bd5\u65f6\u6211\u4eec\u9996\u5148\u5e94\u8be5\u4fdd\u8bc1\u5e94\u7528\u5386\u53f2\u57fa\u672c\u529f\u80fd\u6b63\u5e38\uff0c\u6240\u4ee5\u90a3\u4e9b\u6bcf\u6b21\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u90fd\u8981\u6267\u884c\u7684\u7528\u4f8b\u9002\u5408\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4_1","title":"4. \u529f\u80fd\u7a33\u5b9a\u7684\u6838\u5fc3\u529f\u80fd","text":"\u6d89\u53ca\u6838\u5fc3\u529f\u80fd\u7684\u7528\u4f8b\u662f\u6700\u6700\u91cd\u8981\u7684\u7528\u4f8b\uff0c\u4e5f\u662f\u6211\u4eec\u4ea4\u4ed8\u65f6\u5fc5\u987b\u8981\u4fdd\u8bc1\u8d28\u91cf\u7684\u76f8\u5173\u529f\u80fd\uff0c\u56e0\u6b64\u5e94\u8be5\u5c3d\u53ef\u80fd\u7684\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5_1","title":"5. \u8f93\u5165\u6570\u636e\u6d4b\u8bd5","text":"\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u901a\u5e38\u662f\u68c0\u9a8c\u88ab\u6d4b\u5e94\u7528\u63a5\u53d7\u6709\u6548\u6570\u636e\u3001\u62d2\u7edd\u65e0\u6548\u6570\u636e\u7684\u80fd\u529b\u3002\u5982\uff1a\u63d0\u4ea4\u8d85\u957f\u5b57\u7b26\u4e32\u3001\u7279\u6b8a\u5b57\u7b26\u4e32\u7b49\u7b49\u3002 \u6b64\u7c7b\u7528\u4f8b\u624b\u5de5\u6d4b\u8bd5\u5f88\u96be\u6bd4\u8f83\u5168\u9762\u7684\u8986\u76d6\u5230\u6240\u6709\u7684\u8f93\u5165\u60c5\u51b5\uff0c\u4f46\u662f\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\uff0c\u6b64\u7c7b\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u90fd\u662f\u4e00\u6837\u7684\uff0c\u53d8\u5316\u7684\u4ec5\u662f\u8f93\u5165\u53c2\u6570\u548c\u65ad\u8a00\u7ed3\u679c\uff0c\u91c7\u7528\u6570\u636e\u9a71\u52a8\uff0c\u53ef\u4ee5\u8f7b\u677e\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6_1","title":"6. \u683c\u5f0f\u8986\u76d6","text":"\u539f\u56e0\u540c\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u7c7b\u7528\u4f8b\u4e00\u6837\uff0c\u591a\u79cd\u683c\u5f0f\u7684\u8986\u76d6\u4e5f\u662f\u4e00\u4e2a\u5f88\u7e41\u7410\u7684\u4e8b\u60c5\uff0c\u4ea4\u7ed9\u81ea\u52a8\u5316\u6765\u505a\u518d\u5408\u9002\u4e0d\u8fc7\u4e86\u3002 \u6bd4\u5982\u5f71\u9662\u5bf9\u5f71\u7247\u683c\u5f0f\u7684\u68c0\u67e5\u3001\u622a\u56fe\u5f55\u5c4f\u5bf9\u4fdd\u5b58\u683c\u5f0f\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7_1","title":"7. \u68c0\u67e5\u5143\u7d20\u72b6\u6001","text":"\u67e5\u770b\u88ab\u6d4b\u5e94\u7528\u7684\u5143\u7d20\u5c5e\u6027\u3002\u5982\uff1a\u56fe\u7247\u7684\u5927\u5c0f\u548c\u6392\u5217\uff1b\u6309\u94ae\u7684\u53ef\u7528\u548c\u4e0d\u53ef\u7528\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/","title":"AT \u7ecf\u9a8c\u603b\u7ed3","text":"\u6b22\u8fce\u6240\u6709\u4eba\u63d0\u4ea4\u4f60\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u9762\u7684\u4f18\u79c0\u5b9e\u8df5\u7ecf\u9a8c\uff0c\u4ee5\u5e2e\u52a9\u5927\u5bb6\u89e3\u51b3\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#1","title":"1\u3001\u7ec8\u7ed3\u5668","text":"# litaoa@uniontech.com\n \u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4 pytest \u5b9e\u73b0\u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4\u7684\u65b9\u5f0f\u6709\u4e24\u79cd\uff0cyield \u548c\u7ec8\u7ed3\u51fd\u6570\uff1b yield \u5b9e\u73b0\uff0cyield\u524d\u9762\u4e3a\u7528\u4f8b\u7684\u524d\u7f6e\u6b65\u9aa4\uff0cyield \u540e\u9762\u4e3a\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4\u3002 @pytest.fixture\ndef clean_env():\nprint(\"setup\")\nyield\nprint(\"teardown\")\n \u7ec8\u7ed3\u51fd\u6570\u5b9e\u73b0\uff0c\u4f7f\u7528 request.addfinalizer \u6ce8\u518c\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4 @pytest.fixture\ndef clean_env(request):\ndef clean():\nprint(\"teardown\")\nrequest.addfinalizer(clean)\nprint(\"setup\")\n yield\u7684\u4f18\u7f3a\u70b9\uff1a \u4f18\u70b9\uff1a\u4ee3\u7801\u7b80\u6d01\uff0c\u76f4\u89c2\uff0c\u53ef\u4f7f\u7528yield\u5728\u7528\u4f8b\u4e2d\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c \u7f3a\u70b9\uff1a\u82e5\u524d\u7f6e\u6b65\u9aa4\u4e2d\u51fa\u73b0\u9519\u8bef\uff0c\u5219\u540e\u7f6e\u6b65\u9aa4\u4e0d\u4f1a\u6267\u884c \u7ec8\u7ed3\u51fd\u6570\uff1a \u4f18\u70b9\uff1a\u524d\u7f6e\u6b65\u9aa4\u5931\u8d25\u7684\u8bdd\uff0c\u540e\u7f6e\u6b65\u9aa4\u4ecd\u4f1a\u6267\u884c\u4e14\u53ef\u4ee5\u6ce8\u518c\u591a\u4e2a\u540e\u7f6e\u6b65\u9aa4\uff08\u524d\u63d0\uff1a\u9700\u8981\u5728\u4ee3\u7801\u62a5\u9519\u4e4b\u524d\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff09\uff0c\u652f\u6301\u7075\u6d3b\u4f7f\u7528\u540e\u7f6e\u6761\u4ef6 \u7f3a\u70b9\uff1a\u4ee3\u7801\u8f83\u4e3a\u590d\u6742\uff0c\u65e0\u6cd5\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c\uff08\u672c\u4eba\u76ee\u524d\u672a\u5b9e\u73b0\uff09 \u603b\u7ed3\uff1a\u5728\u524d\u7f6e\u6b65\u9aa4\u4fdd\u8bc1\u7edd\u5bf9\u4e0d\u4f1a\u51fa\u9519\u65f6\uff0c\u4f7f\u7528yield\u66f4\u4f73\u7b80\u4fbf\uff0c\u5f53\u524d\u7f6e\u6b65\u9aa4\u6613\u51fa\u73b0\u95ee\u9898\u65f6\uff0c\u63a8\u8350\u4f7f\u7528\u7ec8\u7ed3\u51fd\u6570\u3002 \u573a\u666f\uff1a\u4fdd\u9669\u7bb1\u7528\u4f8b\uff0c\u524d\u7f6e\u6b65\u9aa4\u4e2d\u5f00\u542f\u4fdd\u9669\u7bb1\uff0c\u540e\u7f6e\u6b65\u9aa4\u5220\u9664\u4fdd\u9669\u7bb1\u3002 @pytest.fixture(scope=\"session\", autouse=True)\ndef vault_fixture(request):\nDfmWidget.reset_vault_by_cmd() # 1\u3001\u91cd\u7f6e\u4fdd\u9669\u7bb1\nDdeDockPublicWidget().close_file_manager_by_cmd() # 2\u3001\u5173\u95ed\u6587\u7ba1\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 3\u3001\u5f00\u542f\u6587\u7ba1\nvault = DfmWidget()\nvault.create_file_vault() # 4\u3001\u521b\u5efa\u4fdd\u9669\u7bb1\ndef delete_vault(): # 8\u3001\u5220\u9664\u4fdd\u9669\u7bb1\u7684\u540e\u7f6e\u6b65\u9aa4\nsleep(2)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr()\nvault = DfmWidget()\nvault.delete_file_vault()\nDfmWidget.reset_vault_by_cmd()\nDdeDockPublicWidget().close_file_manager_by_cmd()\nrequest.addfinalizer(delete_vault) # 5\u3001\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\nDdeDockPublicWidget().close_file_manager_by_cmd() # 6\u3001\u5173\u95ed\u6587\u7ba1\nsleep(1)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 7\u3001\u5f00\u542f\u6587\u7ba1\n \u4ee3\u7801\u6309\u6ce8\u91ca\u4e2d\u7684\u5e8f\u53f7\u6267\u884c\u6b65\u9aa4 \u4ee3\u7801\u5728\u6b65\u9aa41-4\u4efb\u610f\u4f4d\u7f6e\u62a5\u9519\uff0c\u5219\u4e0d\u4f1a\u6267\u884c\u6b65\u9aa48\uff0c\u56e0\u4e3a\u672a\u6267\u884c\u5230\u6b65\u9aa45\uff0c\u6b65\u9aa48\u8fd8\u672a\u6ce8\u518c \u4ee3\u7801\u5728\u6b65\u9aa46-7\u62a5\u9519\uff0c\u4ecd\u4f1a\u6267\u884c\u6b65\u9aa47\uff0c\u56e0\u4e3a\u5728\u6b65\u9aa45\u4e2d\u5df2\u7ecf\u5c06\u6b65\u9aa47\u6ce8\u518c \u53ef\u4ee5\u7075\u6d3b\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff0c\u80fd\u5b9e\u73b0\u67d0\u4e2a\u524d\u7f6e\u6b65\u9aa4\u6267\u884c\u4e4b\u540e\uff0c\u624d\u4f1a\u6267\u884c\u540e\u7f6e\u6b65\u9aa4\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#2","title":"2\u3001\u542f\u52a8\u5e94\u7528\u7684\u65b9\u5f0f","text":"# huangmingqiang@uniontech.com\n \uff081\uff09\u547d\u4ee4\u884c\u542f\u52a8 \u5728 AT \u4ee3\u7801\u4e2d\u4f7f\u7528\u547d\u4ee4\u884c\u542f\u52a8\u5e94\u7528\uff0c\u4e3e\u4f8b\uff1a os.popen(\"deepin-music\")\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f7f\u7528 ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6\uff0cdogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u3002 \uff082\uff09\u901a\u8fc7 UI \u64cd\u4f5c\u542f\u52a8 \u901a\u8fc7\u4efb\u52a1\u680f\u3001\u542f\u52a8\u5668\u3001\u684c\u9762\u7b49UI\u65b9\u5f0f\u542f\u52a8\uff0c\u6bd4\u5982\u53cc\u51fb\u6253\u5f00\u3001\u53f3\u952e\u6253\u5f00\u7b49\uff0c\u8fd9\u79cd\u64cd\u4f5c\u65b9\u5f0f\u4e0d\u5b58\u5728ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6dogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u7684\u95ee\u9898\uff0c\u4e5f\u66f4\u52a0\u7b26\u5408\u7528\u6237\u7684\u64cd\u4f5c\u884c\u4e3a\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#3","title":"3\u3001\u6587\u4ef6\u9009\u62e9\u6846\u5c5e\u6027\u5b9a\u4f4d\u5076\u73b0\u65e0\u6cd5\u627e\u5230","text":"\u6587\u4ef6\u9009\u62e9\u6846\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5728\u8c03\u7528\u6587\u4ef6\u9009\u62e9\u6846\u65f6\uff0c\u6709\u4e00\u5b9a\u7684\u6982\u7387\u51fa\u73b0\uff0c\u754c\u9762\u5df2\u7ecf\u6e32\u67d3\u51fa\u6765\u4e86\uff0c\u4f46\u662f\u5c5e\u6027\u6811\u5e76\u6ca1\u6709\u5199\u5165\uff0c\u5bfc\u81f4\u901a\u8fc7\u5c5e\u6027\u65e0\u6cd5\u627e\u5230\u5143\u7d20\uff0c\u76ee\u524d\u4e5f\u6ca1\u6709\u5f88\u597d\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u4e3a\u4e86\u7528\u4f8b\u7a33\u5b9a\u6027\uff0c\u6587\u4ef6\u9009\u62e9\u6846\u7684\u64cd\u4f5c\u5efa\u8bae\u4f7f\u7528UI\u6216\u8005\u56fe\u7247\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u53ef\u4ee5\u901a\u8fc7\u641c\u7d22\u5185\u5bb9\u56fa\u5b9a\u6587\u4ef6\u4f4d\u7f6e\u3002 # litaoa@uniontech.com\n desk = DdeDesktopPublicWidget()\n# \u9009\u62e9\u89c6\u9891\u76ee\u5f55\ndesk.click_videos_dir_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.ctrl_f()\nsleep(1)\ndesk.input_message(\"\u5143\u7d20\u540d\u79f0\")\nsleep(0.5)\ndesk.enter()\nsleep(1)\n# \u9009\u62e9\u7b2c\u4e00\u4e2a\u6587\u4ef6\ndesk.click_list_view_btn_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.click_first_file_in_desktop_plugs_by_ui()\nsleep(1)\n# \u6587\u7ba1\u63d2\u4ef6\u4e2d\u70b9\u51fb\u6253\u5f00\ndesk.click_open_btn_in_desktop_plugs_by_ui()\n"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#4","title":"4\u3001\u5e94\u7528\u542f\u52a8","text":"# mikigo\n \u5728UI\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u4e00\u5207\u64cd\u4f5c\u7684\u90fd\u662f\u4ece\u5e94\u7528\u542f\u52a8\u5f00\u59cb\u7684\uff0c\u800c\u5728Linux\u684c\u9762\u5e94\u7528\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u6211\u4eec\u542f\u52a8\u5e94\u7528\u7684\u65b9\u6cd5\u6709\u591a\u79cd\uff0c\u4e0b\u9762\u505a\u4e00\u4e2a\u7b80\u5355\u7684\u4ecb\u7ecd\uff1a \u3010\u4f7f\u7528dogtail\u542f\u52a8\u3011 dogtail\u63d0\u4f9b\u4e86\u5e94\u7528\u542f\u52a8\u7684\u65b9\u6cd5\uff0c\u5728utils\u5e93\u4e2d\uff0c\u4f7f\u7528run\u65b9\u6cd5\u542f\u52a8\uff1a \u9996\u5148\u5bfc\u5165\u65b9\u6cd5\uff1a from dogtail.utils import *\n \u8c03\u7528run\u65b9\u6cd5 run('deepin-music')\n \u5373\u53ef\u542f\u52a8\u97f3\u4e50 \u8fd9\u79cd\u65b9\u6cd5\u7684\u4f18\u70b9\u662f\u91c7\u7528\u8fdb\u7a0b\u7684\u65b9\u5f0f\u76f4\u63a5\u542f\u52a8\uff0c\u4e0d\u4f9d\u8d56\u4e0eUI\uff0c\u65e0\u8bba\u684c\u9762\u6216\u4efb\u52a1\u680f\u4e0a\u662f\u5426\u5b58\u5728\u5e94\u7528\u56fe\u6807\uff0c\u90fd\u53ef\u4ee5\u6b63\u5e38\u542f\u52a8\u3002 \u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c \u5982\u679c\u4f7f\u7528ssh\u8fdc\u7a0b\u8c03\u7528\uff0c\u6216\u8005Jenkins\u4e2d\u6267\u884c\u6d4b\u8bd5\u811a\u672c\u7684\u65f6\u5019\uff0c\u5728sniff\u4e2d\u4f1a\u51fa\u73b0\u627e\u4e0d\u5230\u5e94\u7528\uff0c\u7ecf\u8fc7\u5206\u6790\uff0c\u53ef\u80fd\u662f\u56e0\u4e3a\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\u542f\u52a8\u7684\u65f6\u5019\uff0c\u5b9e\u9645\u662f\u91c7\u7528\u4e00\u4e2a\u5b50\u8fdb\u7a0b\u542f\u52a8\u4e86\u5e94\u7528\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u5230\u3002 \u3010\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u3011 \u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807 \u901a\u5e38\u6709\u4e24\u79cd\u65b9\u6cd5\uff1a \uff081\uff09\u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807\u3002 \uff082\uff09\u5df2\u77e5\u5e94\u7528\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u7684\u4f4d\u7f6e\uff0c\u7136\u540e\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u5bf9\u5e94\u5750\u6807\u3002 \u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u7f3a\u70b9\u662f\u4f4d\u7f6e\u5fc5\u987b\u56fa\u5b9a\uff0c\u5982\u679c\u79fb\u52a8\u4f4d\u7f6e\u5c31\u4e0d\u884c\u4e86\uff0c\u800c\u4f7f\u7528\u7b2c\u4e00\u79cd\u65b9\u6cd5\uff0c\u65e0\u8bba\u4f4d\u7f6e\u5728\u54ea\u91cc\uff0c\u53ea\u8981\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u5b58\u5728\u5373\u53ef\u3002 \u3010\u70b9\u51fb\u684c\u9762\u56fe\u6807\u542f\u52a8\u3011 \u684c\u9762\u56fe\u6807\u76ee\u524d\u662f\u91c7\u7528\u56fe\u50cf\u8bc6\u522b\u6280\u672f\uff0c\u5b9a\u4f4d\u5230\u5e94\u7528\u56fe\u6807\u7684\u5750\u6807\uff0c\u7136\u540e\u901a\u8fc7pyauogui\u8fdb\u884c\u70b9\u51fb\u64cd\u4f5c\u3002 \u8be6\u7ec6\u6280\u672f\u65b9\u6848\u53ef\u4ee5\u53c2\u8003\u6211\u7684\u53e6\u5916\u4e24\u7bc7\u535a\u5ba2: \u57fa\u4e8eopencv\u7684\u6a21\u677f\u5339\u914d\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd4\u56de\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 Python\u4e09\u65b9\u5e93PyAutoGui\u7684\u4f7f\u7528\u65b9\u6cd5 \u3010\u4ece\u542f\u52a8\u5668\u542f\u52a8\uff08\u4fd7\u79f0\u5f00\u59cb\u83dc\u5355\uff09\u3011 \u542f\u52a8\u4e2d\u542f\u52a8\u7684\u5b9e\u73b0\u903b\u8f91\u5b9e\u9645\u548c\u4efb\u52a1\u680f\u4e0a\u542f\u52a8\u5dee\u4e0d\u591a\u3002 \u9996\u5148\uff0c\u9700\u8981\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u542f\u52a8\u5668\u56fe\u6807\uff0c\u6216\u8005\u952e\u76d8super\u952e\uff0c\u5c06\u542f\u52a8\u5668\u547c\u51fa\u6765\uff0c \u7136\u540e\uff0c\u5728\u542f\u52a8\u5668\u4e2d\u70b9\u51fb\u5bf9\u5e94\u7684\u56fe\u6807\uff0c \u4f46\u662f\u8fd9\u91cc\u6709\u4e2a\u95ee\u9898\uff0c\u542f\u52a8\u5668\u4e2d\u7684\u5e94\u7528\u5217\u8868\uff0c\u4e00\u9875\u5c55\u793a\u4e0d\u5b8c\uff0c\u6240\u4ee5\u5982\u679c\u6211\u4eec\u8981\u70b9\u51fb\u7684\u5e94\u7528\u56fe\u6807\u4e0d\u5728\u7b2c\u4e00\u9875\u600e\u4e48\u529e\uff0c\u901a\u5e38\u89e3\u51b3\u65b9\u6848\u6709\u4e24\u79cd\uff1a \uff081\uff09\u9700\u8981\u8fdb\u884c\u5411\u4e0b\u6ed1\u52a8\uff0c\u8fd9\u91cc\u5c31\u6d89\u53ca\u5230\u76f8\u5e94\u7684\u8bc6\u522b\u65b9\u6848\uff0c\u5224\u65ad\u5982\u679c\u4e0d\u5728\u7b2c\u4e00\u9875\u5c31\u5f80\u4e0b\u6ed1\u52a8\u7ffb\u9875\u3002 \uff082\uff09\u542f\u52a8\u5668\u63d0\u4f9b\u641c\u7d22\u7684\u529f\u80fd\uff0c\u8f93\u5165\u5e94\u7528\u540d\u79f0\u641c\u7d22\uff0c\u7136\u540e\u8fdb\u884c\u70b9\u51fb\u3002 \u4ece\u5b9e\u9645\u64cd\u4f5c\u4e2d\u6765\u770b\uff0c\u91c7\u7528\u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u6548\u7387\u4f1a\u9ad8\u4e00\u70b9\u3002 \u3010\u7ec8\u7aef\u547d\u4ee4\u542f\u52a8\u3011 \u5728python\u4e2d\uff0c\u4f7f\u7528os.popen()\u6216os.system()\u6216\u8005subprocess.Popen()\uff0c\u5b9e\u73b0\u547d\u4ee4\u884c\u542f\u52a8\uff0c\u6bd4\u5982\uff1a import os\nos.popen('deepin-music')\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u8fdc\u7a0b\u6267\u884c\u811a\u672c\u7684\u65f6\u5019\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u7684\u95ee\u9898\u3002 \u3010\u603b\u7ed3\u3011 \u4ee5\u4e0a\u51e0\u79cd\u65b9\u6cd5\uff0c\u5404\u6709\u4f18\u7f3a\u70b9\uff0c\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff1a \uff081\uff09\u5982\u679c\u9700\u8981\u5728Jenkins\u4e2d\u505a\u6301\u7eed\u96c6\u6210\uff0c\u5efa\u8bae\u4f7f\u7528\u7b2c\u4e8c\u79cd\u4efb\u52a1\u680f\u542f\u52a8\u7684\u65b9\u6cd5\u3002 \uff082\uff09\u5982\u679c\u4e0d\u4f1a\u91c7\u7528\u8fdc\u7a0b\u6267\u884c\u7684\uff0c\u5efa\u8bae\u91c7\u7528\u7b2c\u4e00\u79cd\u6216\u8005\u6700\u540e\u4e00\u79cd\u65b9\u6848\u3002 \uff083\uff09\u7b2c\u4e09\u79cd\u548c\u7b2c\u56db\u79cd\u542f\u52a8\u65b9\u6cd5\uff0c\u901a\u5e38\u5728\u6d4b\u8bd5\u7528\u4f8b\u4e2d\u4f1a\u6d89\u53ca\u5230\uff0c\u6240\u4ee5\u5076\u5c14\u4f1a\u7528\u3002"},{"location":"RELEASE/","title":"\u7248\u672c\u66f4\u65b0\u8bb0\u5f55","text":""},{"location":"RELEASE/#2122023822","title":"2.1.2\uff082023/8/22\uff09","text":"new \u589e\u52a0 OCR \u8bc6\u522b\u81ea\u52a8\u91cd\u8bd5\u673a\u5236\uff0c\u9ed8\u8ba4\u91cd\u8bd5 2 \u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u91cd\u8bd5\u6b21\u6570\uff1b \u4f7f\u7528\u7a97\u7ba1\u6700\u65b0\u63d0\u4f9b\u7684\u4e8c\u8fdb\u5236\u63a5\u53e3\uff0c\u4f18\u5316\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u5728 Wayland \u4e0b\u83b7\u53d6\u7a97\u53e3\u4fe1\u606f\u7684\u65b9\u6cd5\uff1b\u611f\u8c22\u684c\u9762\u6d4b\u8bd5\u90e8 @\u4f55\u6743 @\u5b59\u7fe0 \u3001\u7a97\u7ba1\u7814\u53d1 @\u9ec4\u6cfd\u94ed \u7684\u5927\u529b\u652f\u6301\u3002 \u6269\u5145 skipif \u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\u51fd\u6570\uff1a skipif_xdg_type \u652f\u6301 x11 \u6216 wayland \u4e0a\u8df3\u8fc7\uff1b skipif_cpu_name \u652f\u6301\u4e0d\u540c cpu \u4e0a\u8df3\u8fc7\uff0c\u6bd4\u5982\uff1askipif_cpu_name-KLVVW5821\uff1b "},{"location":"RELEASE/#2102023818","title":"2.1.0\uff082023/8/18\uff09","text":"fix \u4fee\u590d SW \u67b6\u6784\u73af\u5883\u4f9d\u8d56\u7684\u95ee\u9898\uff0c\u539f\u56e0\u662f\u4e4b\u524d\u6211\u8fd9\u91cc\u672c\u5730\u6ca1\u6709 SW \u7684\u673a\u5668\uff0c\u6ca1\u6709\u505a\u76f8\u5173\u9002\u914d\uff1b \u4fee\u590d\u5b50\u9879\u76ee\u5355\u72ec\u9700\u8981\u4e09\u65b9\u5305 pexpect\uff0c\u7531\u4e8e\u4e4b\u524d\u662f\u9884\u88c5\u5230\u955c\u50cf\u91cc\u9762\u7684\uff0c\u4f46\u57fa\u7840\u6846\u67b6\u4e0d\u9700\u8981\uff0c\u56e0\u6b64\u6ca1\u6709\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u91cc\u9762\uff0c\u5bfc\u81f4\u5b50\u9879\u76ee\u4f9d\u8d56\u62a5\u9519\u3002 \u4fee\u590d\u5b50\u9879\u76ee cv \u5bfc\u5165\u62a5\u9519\u7684\u95ee\u9898\uff1b \u539f\u56e0\u4e3a\uff1ayouqu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u517c\u5bb9\u4e24\u79cd\u60c5\u51b5\uff0c\u4e00\u79cd\u662f\u9762\u5411\u670d\u52a1\uff0c\u5c31\u662f\u672c\u5730\u6d4b\u8bd5\u673a\u4e0d\u9700\u8981\u5b89\u88c5 OpenCV\uff0c\u7528\u4f8b\u4e2d\u7684\u56fe\u50cf\u8bc6\u522b\u4f1a\u901a\u8fc7\u8fdc\u7a0b\u670d\u52a1\u63a5\u53e3\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u548c\u7ed3\u679c\u83b7\u53d6\uff1b\u7b2c\u4e8c\u79cd\u662f\u539f\u751f\uff0c\u5c31\u662f\u672c\u5730\u76f4\u63a5\u5b89\u88c5 OpenCV \u76f4\u63a5\u7528\u3002\u4e24\u4e2a\u60c5\u51b5\u7684\u4f18\u5148\u7ea7\u662f\u4f18\u5148\u5224\u65ad\u672c\u5730\u5b58\u5728\uff0c\u5426\u5219\u8d70\u670d\u52a1\u3002 \u524d\u9762\u6211\u4eec\u5df2\u7ecf\u628a OCR \u529f\u80fd\u505a\u4e86\u670d\u52a1\u5316\uff0c\u57fa\u4e8e 1 \u5e74\u591a\u4ee5\u6765\u7684\u89c2\u5bdf\uff0c\u7528\u8d77\u6765\u5f88\u7a33\u5b9a\uff0c\u518d\u4e00\u4e2a\u5c31\u662f OpenCV \u5b89\u88c5\u5305\u662f\u6bd4\u8f83\u81c3\u80bf\u7684\uff0c\u7c97\u7565\u6570\u4e86\u4e0b\u4f9d\u8d56\u6709 30+ \u4e2a\uff0c\u800c\u4e14\u5728\u5404\u67b6\u6784\u4e0a\u4f9d\u8d56\u5305\u8fd8\u4e0d\u5c3d\u76f8\u540c\uff0c\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u65b9\u6848\u4e2d\u4e0d\u592a\u597d\u5904\u7406\uff0c\u6240\u4ee5\u672c\u6b21 2.0 \u7248\u672c\u6211\u4eec\u5927\u80c6\u7684\u5c06\u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u529f\u80fd\u4fee\u6539\u4e3a\u9762\u5411\u670d\u52a1\u7684\u65b9\u5f0f\uff0c\u524d\u671f\u6d4b\u8bd5\u4e00\u5207\u770b\u8d77\u6765\u90fd\u5f88\u548c\u8c10\u3002 \u4f46\u662f\u6ca1\u6ce8\u610f\u5230\u4e4b\u524d\u7ed9\u6d77\u71d5\u59d0\u90a3\u8fb9\u9879\u76ee\u5355\u72ec\u5b9a\u5236\u505a\u4e86\u4e2a\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\uff08\u4e3a\u4e86\u80fd\u7b80\u5355\u5e73\u6ed1\u7684\u8fc1\u79fb\u5230 youqu\uff09\uff0c\u6b64\u63a5\u53e3\u5e95\u5c42\u6ca1\u6709\u517c\u5bb9\u670d\u52a1\u5316\uff0c\u6240\u4ee5\u5979\u90a3\u8fb9\u7684\u9879\u76ee\u8c03\u7528\u6b64\u5b9a\u5236\u63a5\u53e3\u4f1a\u62a5 cv \u5bfc\u5165\u7684\u95ee\u9898\u3002 \u7531\u4e8e\u5c06\u8fd9\u4e2a\u5b9a\u5236\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\u8fdb\u884c\u670d\u52a1\u5316\u517c\u5bb9\u6539\u9020\u9700\u8981\u4e00\u5b9a\u65f6\u95f4\uff0c\u6539\u5b8c\u8fd8\u9700\u8981\u6d4b\u8bd5\uff0c\u4f46\u672c\u6b21\u65f6\u95f4\u6bd4\u8f83\u7d27\uff0c\u56e0\u6b64\u5148\u628a OpenCV \u88c5\u8fdb\u865a\u62df\u73af\u5883\uff0c\u540e\u7eed\u7248\u672c\u518d\u8003\u8651\u9488\u5bf9\u6b64\u63a5\u53e3\u505a\u4fee\u6539\u3002"},{"location":"RELEASE/#2002023816","title":"2.0.0\uff082023/8/16\uff09","text":"YouQu\uff08\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff09\u5f00\u6e90\u4e86\uff0c\u540c\u65f6\u63a8\u51fa\u4e86 2.0 \u7248\u672c\u3002 \u611f\u8c22\u738b\u6ce2\u603b\u3001\u67b6\u6784\u5e08\u5f90\u5c0f\u4e1c\u3001\u7814\u53d1\u7ecf\u7406\u90d1\u5e7c\u6208\u3001\u5218\u90d1\u7b49\u7814\u53d1\u540c\u4e8b\u7684\u5927\u529b\u652f\u6301\u3002 new 1\u3001\u65b0\u7684\u57fa\u7840\u6846\u67b6\u4ee3\u7801\u83b7\u53d6\u65b9\u5f0f\u53ca\u65b0\u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4 YouQu \u540e\u7eed\u5747\u901a\u8fc7 PyPI \u8fdb\u884c\u5305\u7684\u53d1\u5e03\uff0c\u4e5f\u5c31\u662f\u8bf4\u540e\u7eed\u53ef\u4ee5\u4f7f\u7528 pip \u8fdb\u884c\u5b89\u88c5\uff1a sudo pip3 install youqu==2.0.0\n \u8fd9\u91cc\u6709 2 \u4e2a\u5c0f\u70b9\u8981\u6ce8\u610f\uff1a \u63a8\u8350\u4f7f\u7528 sudo pip3 \uff08\u52a0 sudo\uff09\u8fdb\u884c\u5b89\u88c5\uff1b \u5982\u679c\u4e0d\u52a0 sudo \u6709\u4e9b\u673a\u5668\u53ef\u80fd $HOME/.local/bin \u4e0d\u5728\u7cfb\u7edf PATH \u73af\u5883\u76ee\u5f55\u4e0b\uff0c\u5728\u4e0d\u6dfb\u52a0\u73af\u5883\u53d8\u91cf\u7684\u60c5\u51b5\u4e0b\uff0c\u4f1a\u51fa\u73b0 YouQu \u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4\uff08youqu-startproject\uff09\u65e0\u6cd5\u4f7f\u7528\u7684\u95ee\u9898\uff1b \u5f53\u7136\uff0c\u5c06\u4e0a\u8ff0\u8def\u5f84\u6dfb\u52a0\u5230\u73af\u5883\u53d8\u91cf\u4e4b\u540e\u4e5f\u662f\u53ef\u4ee5\u7528\u7684\uff0c\u6240\u4ee5\u6211\u8fd9\u91cc\u662f\u63a8\u8350\u52a0 sudo\uff0c\u4e0d\u52a0 sudo \u4e5f\u662f\u53ef\u4ee5\u7684\uff0c\u53ea\u662f\u9700\u8981\u5173\u6ce8\u4e0b\u73af\u5883\u53d8\u91cf\u7684\u95ee\u9898\u3002 \u63a8\u8350\u6307\u5b9a\u7248\u672c\u53f7\uff08youqu==2.0.0\uff09\u5b89\u88c5\uff0c\u5982\u679c\u4e0d\u6307\u5b9a\u7248\u672c\u53f7\u9ed8\u8ba4\u662f\u5b89\u88c5\u6700\u65b0\u53d1\u5e03\u7684 YouQu \u7248\u672c\uff0c\u4f60\u53ef\u4ee5\u5728 PyPI \u4e0a\u7684 Release history \u91cc\u9762\u67e5\u770b\u6709\u54ea\u4e9b\u7248\u672c\u3002 \u5b89\u88c5\u4e4b\u540e\u4f1a\u81ea\u52a8\u751f\u6210\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu-startproject\uff0c\u4f7f\u7528\u5b83\u53ef\u4ee5\u521d\u59cb\u5316\u5de5\u7a0b\uff0c\u8fd9\u91cc\u4ee5\u97f3\u4e50\u4e3e\u4f8b\uff1b youqu-startproject autotest_deepin_music\n \u8fd9\u6837\u5c31\u4f1a\u5728\u5f53\u524d\u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a autotest_deepin_music \u76ee\u5f55\uff0c\u91cc\u9762\u5305\u542b\u4e86\u57fa\u7840\u6846\u67b6\u6240\u6709\u7684\u4ee3\u7801\uff1b \u4e4b\u540e\uff0c\u8fd8\u662f\u5728 apps \u76ee\u5f55\u4e0b\uff0c\u653e\u5165\u5b50\u9879\u76ee\u7684AT\u4ee3\u7801\u5373\u53ef\uff0c\u4f7f\u7528\u65b9\u6cd5\u548c\u8fc7\u53bb\u4e00\u6837\uff0c\u8fd9\u91cc\u5c31\u4e0d\u591a\u4ecb\u7ecd\u3002 \u53e6\u5916\uff0c\u9664\u4e86\u901a\u8fc7 pip \u83b7\u53d6\u4ee5\u5916\uff0c\u4ecd\u7136\u53ef\u4ee5\u901a\u8fc7\u6e90\u7801\u83b7\u53d6\uff08\u76f4\u63a5 git clone\uff09\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u4f7f\u7528 pip \u5b89\u88c5 YouQu \u65f6\uff0cYouQu \u5305\u7684\u5927\u5c0f\u624d 600+ k\uff0c\u5b89\u88c5\u901f\u5ea6\u8d77\u98de\u3002 2\u3001\u65b0\u7684AT\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848 \u4e3a\u4e86\u89e3\u51b3\u4ee5\u4e0b\u95ee\u9898\uff1a \u8fc7\u53bb\u4e00\u6bb5\u65f6\u95f4\u54b1\u4eec\u7ecf\u5e38\u51fa\u73b0\u7684\uff0c\u4e0d\u540c\u7684AT\u9879\u76ee\u5728\u540c\u4e00\u53f0\u673a\u5668\u4e0a\u90e8\u7f72\u73af\u5883\u65f6\u4f9d\u8d56\u7248\u672c\u51b2\u7a81\u7684\u95ee\u9898\uff0c\u65b0\u65b9\u6848\u4e0d\u540c\u7684\u9879\u76ee\u4f1a\u52a8\u6001\u751f\u6210\u81ea\u5df1\u7684\u865a\u62df\u73af\u5883\uff0c\u76f8\u4e92\u4e4b\u95f4\u4e0d\u5f71\u54cd\uff1b \u4e1a\u5185\u4e3a\u4e86\u89e3\u51b3\u7248\u672c\u51b2\u7a81\u95ee\u9898\u4e00\u822c\u90fd\u4f1a\u4f7f\u7528Python\u865a\u62df\u73af\u5883\u7684\u5de5\u5177\uff0c\u4f46\u662f\u90fd\u6709\u4e2a\u95ee\u9898\uff0c\u65e0\u6cd5\u7ba1\u7406 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u5305\uff0c\u672c\u6b21\u6211\u4eec\u89e3\u51b3\u4e86\u8fd9\u4e2a\u95ee\u9898\uff0c\u80fd\u591f\u5b8c\u5168\u7ba1\u7406\u5e38\u89c4\u7684Python\u5305\uff0c\u4e5f\u80fd\u7ba1\u7406\u5230 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u4e09\u65b9\u5305\uff1b \u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u4f7f\u7528\u65b9\u6cd5\uff1a bash env.sh\n \u53ef\u4ee5\u770b\u51fa\u6765\u548c\u539f\u6765\u4f7f\u7528\u65b9\u6cd5\u6ca1\u6709\u53d8\u5316\uff0c\u4e5f\u5c31\u662f\u8bf4\u4ece\u4f7f\u7528\u7684\u89d2\u5ea6\u662f\u5b8c\u5168\u6ca1\u6709\u533a\u522b\u7684\uff0c\u53ea\u662f\u5185\u90e8\u505a\u4e86\u4e0d\u540c\u7684\u4e8b\u60c5\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u672c\u673a\u90e8\u7f72\u7684\u529f\u80fd\u4ecd\u7136\u4fdd\u7559 env_dev.sh\uff0c\u53ef\u4ee5\u4f5c\u4e3a\u5f00\u53d1\u65f6\u7684\u73af\u5883\u90e8\u7f72\u3002 3\u3001\u65b0\u7684\u9a71\u52a8\u547d\u4ee4 \u8fc7\u53bb\u54b1\u4eec\u90fd\u662f\u4f7f\u7528\u8fd9\u6837\u7684\u547d\u4ee4\u6765\u9a71\u52a8\u6267\u884c\uff1a python3 manage.py run\n \u7531\u4e8e\u9ed8\u8ba4\u57fa\u4e8e\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848\uff0c\u56e0\u6b64\u6211\u4eec\u589e\u52a0\u4e86\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu\uff1b \u65b0\u7684\u9a71\u52a8\u65b9\u5f0f\uff1a youqu manage.py run\n \u53ea\u9700\u8981\u628a python3 \u66ff\u6362\u6210 youqu \u5c31\u53ef\u4ee5\u4e86\uff0c\u770b\u8d77\u6765\u5f88\u548c\u8c10~ 4\u3001\u65b0\u7684\u6587\u6863\u5730\u5740 \u8fc7\u53bb\u54b1\u4eec YouQu \u7684\u5728\u7ebf\u6587\u6863\u662f\u90e8\u7f72\u5728\u516c\u53f8\u5185\u7f51\u7684\uff0c\u73b0\u5728\u5f00\u6e90\u5230 github \u4e86\uff0c\u5916\u90e8\u5f00\u53d1\u8005\u80af\u5b9a\u8bbf\u95ee\u4e0d\u5230\u5185\u7f51\u7684\u6587\u6863\uff0c\u56e0\u6b64\u9700\u8981\u5c06\u6587\u6863\u90e8\u7f72\u5230\u516c\u7f51\u3010\u516c\u7f51\u6587\u6863\u3011\uff1b \u516c\u7f51\u6587\u6863\u4f7f\u7528\u7684\u662f github pages\uff08\u767d\u5ad6\u602a\u4e00\u987f\u72c2\u559c~~\uff09\uff0c\u4f46\u53ef\u80fd\u4f1a\u51fa\u73b0\u6587\u6863\u901f\u5ea6\u6162\u7684\u95ee\u9898\uff08\u4ee3\u7406\u4e0b\u5c31\u597d\u4e86\uff09\uff0c\u4e0d\u8fc7\u6ca1\u5173\u7cfb\uff0c\u54b1\u4eec\u3010\u5185\u7f51\u6587\u6863\u3011\u4ecd\u7136\u4fdd\u7559\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u3002 5\u3001\u5176\u4ed6\u4e00\u4e9b\u5c0f\u5c0f\u529f\u80fd\u66f4\u65b0\uff1a \uff081\uff09\u65b0\u589e\u5173\u95ed\u5206\u8fa8\u7387\u68c0\u6d4b\u7684\u53c2\u6570\u503c\uff1b youqu manage.py run --resolution no\n \u6216\u8005\u4fee\u6539 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387, \u6bd4\u5982\uff1a1920x1080\n;no: \u8868\u793a\u4e0d\u505a\u5206\u8fa8\u7387\u6821\u9a8c\nRESOLUTION = 1920x1080\n resolution \u8fd9\u4e2a\u53c2\u6570\u4e00\u76f4\u90fd\u6709\u7684\uff0c\u53ea\u4e0d\u8fc7\u4e4b\u524d\u662f\u7528\u4e8e\u6307\u5b9a\u5206\u8fa8\u7387\u5927\u5c0f\uff0c\u6bd4\u5982 --resolution 1920x1080\uff0c\u4f46\u6709\u4e9b\u63a5\u53e3\u7684\u9879\u76ee\u4e0d\u9700\u8981\u8fd9\u4e2a\u68c0\u67e5\uff0c\u53ef\u4ee5\u7ed9\u5b83\u4e2a no \u5c31\u597d\u4e86\uff0c\u5f53\u7136 CICD \u4e0a\u5173\u95ed\uff0c\u9700\u8981\u6d41\u6c34\u7ebf\u4e0a\u628a\u8fd9\u4e2a\u53c2\u6570\u52a0\u4e0a\uff1b \uff082\uff09\u65b0\u589e\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u7684\u547d\u4ee4\u884c\u53c2\u6570 \u4e4b\u524d\u8fd9\u4e2a\u914d\u7f6e\u9879\u53ea\u80fd\u5728 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c 1 \u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff0cRERUN >= RECORD_FAILED_CASE\u3002\n;1.\u5173\u95ed\u5f55\u5c4f\uff1aRECORD_FAILED_CASE > RERUN\n;2.\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1aRECORD_FAILED_CASE = 0\nRECORD_FAILED_CASE = 1\n \u73b0\u5728\u5c06\u5f00\u53d1\u5230\u547d\u4ee4\u884c\u53c2\u6570\u3002 youqu manage.py run --record_failed_case 2\n fix \u4fee\u590d remote \u6267\u884c\u65f6\uff0c\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u65e0\u6cd5\u751f\u6210\u6d4b\u8bd5\u62a5\u544a\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1302023710","title":"1.3.0\uff082023/7/10\uff09","text":"fix \u8fdb\u4e00\u6b65\u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b\u53c2\u8003\uff1a\u914d\u7f6ePython\u6e90\u7684\u51e0\u79cd\u65b9\u6cd5 \u4fee\u590d wayland_autotool \u53d7\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86wayland\u4e0b\u5076\u73b0\u627e\u4e0d\u5230 .Xauthority \u6587\u4ef6\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1292023626","title":"1.2.9\uff082023/6/26\uff09","text":"fix \u4f18\u5316\u8fdc\u7a0b\u6267\u884c remote \u7684\u53c2\u6570\u76f4\u63a5\u4f20\u7ed9\u8fdc\u7a0b\u673a\u5668\u7684 run \u547d\u4ee4\uff0c\u4e0d\u7528\u518d\u5355\u72ec\u5904\u7406\u8fdc\u7a0b\u6267\u884c\u7684\u53c2\u6570\u903b\u8f91\uff0c\u540e\u7eed\u4e13\u6ce8\u4e8e\u672c\u5730\u6267\u884c\u529f\u80fd\u5f00\u53d1\uff0c\u8fdc\u7a0b\u6267\u884c\u81ea\u52a8\u9002\u7528\uff1b env.sh \u79fb\u9664 pyyaml \u5b89\u88c5\uff0c\u7531\u5b50\u9879\u76ee\u5728 requirement.txt \u91cc\u9762\u5b9a\u4e49\uff0c\u6846\u67b6\u81ea\u52a8\u52a0\u8f7d\uff1b \u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b "},{"location":"RELEASE/#128202369","title":"1.2.8\uff082023/6/9\uff09","text":"fix \u4fee\u590d\u4e86 pypi \u5b89\u88c5 numpy \u5b58\u5728\u7cfb\u7edf\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#127202368","title":"1.2.7\uff082023/6/8\uff09","text":"fix env.sh \u4e2d\u5b89\u88c5 Python \u5305\u672a\u6307\u5b9a\u7248\u672c\u65f6\uff0c\u65e5\u5fd7\u8f93\u51fa\u5b89\u88c5\u7684\u7248\u672c\uff1b pdocr-rpc 2.0.1\nallure-custom 1.2.1\nfunnylog 1.1.3\n \u4fee\u590d -f \u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u62a5\u9519\u7684\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#126202367","title":"1.2.6\uff082023/6/7\uff09","text":"fix \u4fee\u590d wayland \u4e0a\u8c03\u7528\u9f20\u6807\u4e2d\u952e\u3001\u53f3\u952e\u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b \u4fee\u590d pubilic/dde_desktop_public_widget \u91cc\u9762\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u5b9a\u4f4d\u684c\u9762\u6587\u4ef6\u7684\u65b9\u6cd5\uff0c\u5750\u6807\u6ca1\u6709\u62c6\u5305\u7684\u95ee\u9898\uff1b \u4f18\u5316\u4e86\u7b49\u5f85\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b pycreeze \u7248\u672c\u5347\u7ea7\u5230 0.1.29\uff0c\u5bfc\u81f4\u4e0e pyautogui 0.9.53 \u4e0d\u517c\u5bb9\uff0cenv.sh \u91cc\u9762\u589e\u52a0\u6307\u5b9a pycreeze \u7248\u672c\u4e3a 0.1.28\uff1b "},{"location":"RELEASE/#1252023516","title":"1.2.5\uff082023/5/16\uff09","text":"new --app \u53c2\u6570\u540e\u9762\u65b0\u589e\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u76ee\u524d\u652f\u6301\u4e09\u79cd\u53c2\u6570\u4f20\u5165\u65b9\u5f0f\uff1a ~$: youqu run -a deepin-music\n~$: youqu run -a autotest_deepin_music\n~$: youqu run -a apps/autotest_deepin_music\n \u200b \u540e\u4e24\u79cd\u5165\u53c2\u65b9\u5f0f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\u3002 remote \u8fdc\u7a0b\u6267\u884c\u65b0\u589e\u4ece\u547d\u4ee4\u884c\u4f20\u5165\u6d4b\u8bd5\u673a\u4fe1\u606f\uff0c\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679c password \u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6 setting/remote.ini \u4e2d CLIENT_PASSWORD \u7684\u503c,\u6bd4\u5982\uff1auos@10.8.13.33:1 \u6216 uos@10.8.13.33 \uff1b python3 manage.py remote -c uos@10.8.13.33/uos@10.8.13.34\npython3 manage.py remote -c uos@10.8.13.33:1/uos@10.8.13.34:2\n fix \u65e5\u5fd7\u6a21\u5757\u4fee\u6539\u4e3a\u51fd\u6570\u6267\u884c\u4e4b\u524d\u6253\u5370\u65e5\u5fd7\uff1b \u65e5\u5fd7\u6a21\u5757\u589e\u52a0\u767d\u540d\u5355\uff0c\u901a\u8fc7\u7c7b\u540d\u5f00\u5934\uff0c\u7ed3\u675f\uff0c\u5305\u542b\u7b49\u5173\u952e\u5b57\u63a7\u5236\u9700\u8981\u6253\u5370\u7684\u51fd\u6570\u65e5\u5fd7\uff1b \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5982\u679c\u4f20\u5165\u4e86 app_name \u53ea\u4f1a\u5c06 apps \u76ee\u5f55\u4e0b app_name \u7684\u76ee\u5f55\u53d1\u9001\u5230\u6d4b\u8bd5\u673a\uff1b env.sh \u79fb\u9664 python3-dev\uff1b \u4fee\u590d Wayland \u4e0b env.sh \u73af\u5883\u5b89\u88c5\u5931\u8d25\u7684\u95ee\u9898\uff0c\u4f18\u5316\u4e86 deb \u4f9d\u8d56\u5b89\u88c5\u7684\u903b\u8f91\uff1b \u5c06 env.sh \u5237\u65b0\u6e90\u7684\u65e5\u5fd7\u5728\u7ec8\u7aef\u663e\u793a\uff0c\u89e3\u51b3\u5728 CI \u73af\u5883\u4e0b\uff0c\u957f\u65f6\u95f4\u4e0d\u8f93\u51fa\u65e5\u5fd7\u8fde\u63a5\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d1060 \u534e\u4e3a\u673a\u578b\u5b89\u88c5\u952e\u9f20\u5de5\u5177\u65f6\u4f9d\u8d56\u4e0d\u517c\u5bb9\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1242023227","title":"1.2.4\uff082023/2/27\uff09","text":"fix \u4fee\u6539 CURRENT \u6587\u4ef6\uff1b "},{"location":"RELEASE/#1232023227","title":"1.2.3\uff082023/2/27\uff09","text":"new pylint.sh \u652f\u6301\u901a\u8fc7\u4f4d\u7f6e\u53c2\u6570\u4f20\u5165\u6587\u4ef6\u8def\u5f84\uff1abash pylint.sh apps/autotest_deepin_music,\u597d\u5904\u662f\u53c2\u6570\u8def\u5f84\u53ef\u4ee5\u5728\u7ec8\u7aef\u8865\u5168\uff1b \u65b0\u589e\u7cfb\u7edf\u547d\u4ee4 youqu-pylint \uff0c\u7528\u4e8e\u9759\u6001\u4ee3\u7801\u626b\u63cf\uff0c\u4f7f\u7528\u65b9\u6cd5: youqu-pylint apps/autotest_deepin_music\uff1b \u7531\u4e8e\u7cfb\u7edf\u4e00\u4e9b dbus \u63a5\u53e3\u6539\u53d8\uff0c\u516c\u5171\u5e93\u4e2d\u7684 dbus \u65b9\u6cd5\u5c06\u4e0d\u518d\u7ef4\u62a4\uff0c\u7531\u5b50\u9879\u76ee\u5728 other_widget.py \u91cc\u9762\u8fdb\u884c\u7ef4\u62a4\uff1b fix \u4fee\u590d ssh \u73af\u5883\u4e0b\u8fd0\u884c\u63d0\u793a \u201c\u65e0\u6cd5\u8fde\u63a5\u201d \u7684\u95ee\u9898\uff1b \u4fee\u590d\u8fd0\u884c\u65f6\u7a0b\u5e8f\u9000\u51fa\uff0c\u4e0d\u8f93\u51fa\u5f02\u5e38\u65e5\u5fd7\u7684\u95ee\u9898\uff1b \u4fee\u590dyouqu remote xxx \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5728\u670d\u52a1\u7aef Ctrl + C \u65e0\u6cd5\u505c\u6b62\u7a0b\u5e8f\u8fd0\u884c\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#122202328","title":"1.2.2\uff082023/2/8\uff09","text":"new \u65b0\u589e\u6c14\u6ce1\u7c7b\u56fe\u50cf\u8bc6\u522b\u65b9\u6848\uff1bimage_utils.py::ImageUtil::get_during\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u533a\u57df\u8bc6\u522b\uff0c\u4f20\u5165 [x, y, w, h]\uff0cx: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u76ee\u6807\u56fe\u7247\uff0c\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\uff1b env.sh \u79fb\u9664 pypinyin; \u4f18\u5316\u6267\u884c env.sh \u65f6\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b manage.py \u79fb\u9664\u4e86\u53c2\u6570 session_timeout \uff0c\u6846\u67b6\u6839\u636e\u5168\u5c40\u7684 timeout \u4ee5\u53ca\u7528\u4f8b\u81ea\u5b9a\u4e49\u7684 timeout \u81ea\u52a8\u8ba1\u7b97\u51fa sessiontimeout \u7684\u503c\uff1b \u65b0\u589e ocr \u670d\u52a1\u5668\u94fe\u63a5\u91cd\u8bd5\uff0c\u9ed8\u8ba4\u91cd\u8bd51\u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u53c2\u6570\uff1b fix \u4fee\u590d\u4e86\u4e00\u4e9b pylint \u626b\u63cf\u7684\u4ee3\u7801\u98ce\u683c\u95ee\u9898\uff1b \u91cd\u65b0\u8bbe\u8ba1\u4e86\u6d4b\u8bd5\u62a5\u544a\u4e3b\u9898\uff1b "},{"location":"RELEASE/#121202316","title":"1.2.1\uff082023/1/6\uff09","text":"new \u652f\u6301\u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6267\u884c\u7528\u4f8b\uff1b\u53ef\u5c06python3 manage.py \u66ff\u6362\u4e3a youqu \uff1a youqu run -a deepin-music -k 001\n RPC \u670d\u52a1 IP \u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u6307\u5b9a\u4e0d\u540c\u7684\u7aef\u53e3\uff1b \u5728\u7ebf\u6587\u6863\u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u539f\u6765\u7684\u5730\u5740 10.8.10.215 \u5c06\u4e0d\u5728\u4f7f\u7528\uff1b fix \u4fee\u590d --count \u53c2\u6570\u53ef\u80fd\u51fa\u73b0\u4e0e\u5176\u4ed6\u6846\u67b6\u7684\u5de5\u7a0b\u4f9d\u8d56\u5b58\u5728\u51b2\u7a81\uff0c\u62a5\u9519\u91cd\u590d\u6ce8\u518c\u7684\u95ee\u9898\uff1b \u4fee\u590d CI \u73af\u5883\u4e0b\u591a\u4e2a\u5de5\u7a0b\u5b58\u5728 Python \u73af\u5883\u53d8\u91cf\u6307\u5411\u9519\u8bef\uff0c\u5bfc\u5305\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u5355\u72ec\u8fd0\u884c\u65b9\u6cd5\u65f6\u65e0\u65e5\u5fd7\u8f93\u51fa\u7684 Bug\uff1b "},{"location":"RELEASE/#12020221230","title":"1.2.0\uff082022/12/30\uff09","text":"1.1.4 \u7248\u672c\u9002\u914d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e14\u65b0\u589e\u4e86\u8f83\u591a\u65b0\u7279\u6027\uff0c\u6211\u4eec\u8ba1\u5212\u4f7f\u7528 1.1.4 \u7248\u672c\u8fd0\u884c\u4e00\u6bb5\u65f6\u95f4\uff0c1.2.0 \u7248\u672c\u5c06\u4fee\u590d\u671f\u95f4\u51fa\u73b0\u7684 Bug\uff0c\u7136\u540e\u4f5c\u4e3a\u7a33\u5b9a\u7248\u672c\u53d1\u5e03\u3002 new \u4fee\u6539\u5de5\u7a0b\u540d\u79f0\u4e3a youqu\uff1b \u5c06 sphinx \u6587\u6863\u5de5\u7a0b\u8fc1\u79fb\u5230\u5355\u72ec\u7684\u4ed3\u5e93\uff1b fix \u4fee\u590d startapp \u521b\u5efa\u5de5\u7a0b\u65f6\u5b58\u5728\u5de5\u7a0b\u540d\u79f0\u65f6\u65e0\u6cd5\u7ee7\u7eed\u521b\u5efa\uff1b \u4fee\u590d\u4e86 OCR \u670d\u52a1\u5728\u5e76\u53d1\u65f6\u53ef\u80fd\u51fa\u73b0\u65e0\u6cd5\u8fd4\u56de\u7ed3\u679c\u7684\u95ee\u9898\uff0c\u63d0\u5347 OCR \u670d\u52a1\u9ad8\u5e76\u53d1\u7a33\u5b9a\u6027\uff1b \u4fee\u590d PMS \u540c\u6b65\u6807\u7b7e\u5230 CSV \u6587\u4ef6\u4e0d\u652f\u6301\u7528\u4f8b\u5e93\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11420221214","title":"1.1.4\uff082022/12/14\uff09","text":"new \u65b0\u589e startapp \u5b50\u547d\u4ee4\u521b\u5efa\u5b50\u9879\u76ee\u5de5\u7a0b\u6a21\u677f: python3 manage.py startapp autotest_deepin_xxx \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u91cd\u590d\u6267\u884c\u6b21\u6570\uff1b \u53bb\u6389\u6279\u91cf\u6267\u884c\u524d\u6536\u96c6\u7528\u4f8b\u7684\u6b65\u9aa4\uff1b \u589e\u52a0\u5f00\u59cb\u6267\u884c\u65f6\u6253\u5370\u4e00\u4e9b\u6267\u884c\u53c2\u6570\uff0c\u5982\uff1a \u7528\u4f8b\u6536\u96c6\u6570\u91cf: 99\n\u5931\u8d25\u91cd\u8dd1\u6b21\u6570: 1\n\u6700\u5927\u5931\u8d25\u6b21\u6570: 49\n\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4: 200.0s (03\u520620\u79d2)\n\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4: 11880s (3\u5c0f\u65f618\u52060\u79d2)\n \u5b9a\u5236\u4fee\u6539allure\u62a5\u544alogo\u3001title\u3001\u9ed8\u8ba4\u8bed\u8a00\uff1b manage.py \u6267\u884c\u5f00\u59cb\u65f6\u6253\u5370 logo \u548c\u5f53\u524d\u7248\u672c\uff1a \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u255a\u2588\u2588\u2557 \u2588\u2588\u2554\u255d \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2584\u2584 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2580\u2580\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u2584\u2588 \u2584\u2588 \u2588 \u2588 \u2588 \u2584 \u2588 \u2584 \u2580\u2580\u2588 \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\uff1b \u88c5\u9970\u5668\u65b9\u6cd5\u6307\u5b9a\u6b21\u6570\uff1b @pytest.mark.count(2)\ndef test_music_001():\npass\n \u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u6b21\u6570\uff1b python3 manage.py run -a deepin-music -k 001 --count 2\n \u200b image_utils \u589e\u52a0\u51fd\u6570 save_temporary_picture\uff0c\u652f\u6301\u6307\u5b9a\u5c4f\u5e55\u533a\u57df\u622a\u56fe\u5e76\u8fd4\u56de\u56fe\u7247\u5b58\u653e\u7684\u672c\u5730\u8def\u5f84\uff0c\u540e\u7eed\u4f7f\u7528 assert_image_exist \u8fdb\u884c\u65ad\u8a00 Python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(x, y, width, height) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) button_center \u65b0\u589e btn_size \u83b7\u53d6\u63a7\u4ef6\u5de6\u4e0a\u89d2\u5750\u6807\u53ca\u957f\u5bbd\uff0c\u7528\u4e8e\u52a8\u6001\u7684\u622a\u53d6\u5143\u7d20\u7684\u56fe\u7247\uff0c\u53ef\u7528\u4e8e\u5b9a\u4f4d\u65ad\u8a00 python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u6240\u6709\u97f3\u4e50\u6309\u94ae\")) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) allure \u62a5\u544a\u4e2d\u5b9a\u4f4d\u95ee\u9898\u9664\u4e86\u65e5\u5fd7\u3001\u622a\u56fe\u3001\u5f55\u5c4f\u5916\uff0c\u8c03\u7528\u7684\u51fd\u6570\u589e\u52a0\u4e86 step \u6b65\u9aa4\u5c55\u793a\uff1b env.sh \u65b0\u589e\u5b89\u88c5\u5b50\u9879\u76ee Python \u4e09\u65b9\u4f9d\u8d56\uff0c\u5728\u5b50\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u5199 requirement.txt \u6587\u4ef6\uff0cenv.sh \u4f1a\u81ea\u52a8\u52a0\u8f7d\uff1b ocr \u8bc6\u522b\u65b0\u589e\u652f\u6301\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\u8fdb\u884c\u6587\u5b57\u8bc6\u522b\uff0c\u51cf\u5c11\u56e0\u5168\u5c4f\u8bc6\u522b\u65f6\uff0c\u5176\u4ed6\u6587\u5b57\u7684\u5e72\u6270 Python # \u65ad\u8a00\u97f3\u4e50\u7684\u5220\u9664\u5f39\u7a97\u4e2d\uff0c\u5305\u542b\u4e86\u201c\u786e\u8ba4\u201d\u7684\u6587\u5b57 self.assert_ocr_exist(\"\u786e\u8ba4\", picture_abspath=DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u5220\u9664\u5f39\u7a97\"))) \u65ad\u8a00\u51fd\u6570\u7684\u8c03\u7528\u4e5f\u4f1a\u81ea\u52a8\u6253\u5370\u65e5\u5fd7; env.sh \u65b0\u589e\u88c1\u526a\u4f9d\u8d56\u7684\u65b9\u6848\uff1b fix \u4fee\u590d Jenkins \u73af\u5883\u4e0b\uff0c apps \u76ee\u5f55\u4e0b\u5b50\u9879\u76ee\u5b58\u5728 auotest_deepin_xxx@tmp \u76ee\u5f55\uff0c\u5728\u4f20\u5165 app_name \u540e\u65e0\u6cd5\u6267\u884c\u7528\u4f8b\u7684\u95ee\u9898\uff1b \u4fee\u590d\u81ea\u52a8\u751f\u6210 case_list.csv \u6587\u4ef6\u65f6\uff0c\u7528\u4f8b\u987a\u5e8f\u88ab\u8c03\u6574\u7684\u95ee\u9898\uff1b env.sh \u73af\u5883\u5b89\u88c5\u79fb\u9664 git \u548c curl\uff1b \u4fee\u590d\u7528\u4f8b\u5728 setup \u9636\u6bb5\u62a5\u9519\u540e\uff0c\u672a\u5199\u5165 ci_result.json \u7684\u95ee\u9898\uff1b \u79fb\u9664 uos_ci.py\uff1b "},{"location":"RELEASE/#11320221028","title":"1.1.3\uff082022/10/28\uff09","text":"new \u65b0\u589e\u56fe\u50cf\u65ad\u8a00\u6210\u529f\u8f93\u51fa\u5339\u914d\u5ea6\uff1b \u65b0\u589e\u73af\u5883\u5b89\u88c5 yaml \u4f9d\u8d56\uff1b \u65b0\u589e\u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6570\u636e\u56de\u586b\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b \u65b0\u589e\u6d4b\u8bd5\u7ed3\u679c\u8868\u60c5\u663e\u793a\uff0c\u5e76\u4f18\u5316\u4e86\u65e5\u5fd7\u7684\u6392\u7248\uff1b \u65b0\u589e --top {number} \u7528\u4e8e\u8bb0\u5f55\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0c\u65e5\u5fd7\u751f\u6210\u5230 report/logs/top.log\uff1b fix \u4fee\u590d\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4f46\u7ec8\u7aef\u6ca1\u6709\u9519\u8bef\u65e5\u5fd7\u8f93\u51fa\u7684\u95ee\u9898\uff1b \u4fee\u6539\u5931\u8d25\u7528\u4f8b\u56de\u6eaf\u65e5\u5fd7\u4e3a\u8be6\u7ec6\u7ea7\u522b\uff1b \u4fee\u590d\u4e86\u6267\u884c\u8fdb\u5ea6\u672a\u8ba1\u7b97\u8df3\u8fc7\u7528\u4f8b\u7684\u95ee\u9898\uff0c\u5e76\u4f18\u5316\u4e86\u8fdb\u5ea6\u83b7\u53d6\u7684\u7b97\u6cd5\uff1b \u4fee\u590d env.sh \u5728 V23 \u73af\u5883\u4e0b\u5b89\u88c5\u65e0\u6cd5\u8bfb\u53d6\u5bc6\u7801\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 pms \u6d4b\u8bd5\u5957\u6267\u884c\u6216\u6d4b\u8bd5\u5355\u6267\u884c\u65f6\uff0c\u7528\u4f8bID\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b env.sh \u91cc\u9762 hub.deepin.com \u66f4\u6362\u6210 it.uniontech.com\uff1b uos_ci.py \u6d4b\u8bd5\u7ed3\u679c\u7edf\u8ba1\u65f6\uff0c\u603b\u6570\u5254\u9664 skip \u7684\u6570\u91cf "},{"location":"RELEASE/#11220220921","title":"1.1.2\uff082022/09/21\uff09","text":"new \u5728\u6ca1\u6709\u5b89\u88c5 dogtail \u7684\u60c5\u51b5\u4e0b\uff0c\u4e5f\u80fd\u4f7f\u7528 sniff \u5de5\u5177\uff1b fix \u4fee\u590d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e2d\u6ca1\u6709\u5b89\u88c5 AT \u73af\u5883\u6267\u884c uos_ci.py \u62a5\u9519\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11120220919","title":"1.1.1\uff082022/09/19\uff09","text":"new \u65b0\u589e\u6267\u884c\u8fdb\u5ea6\u663e\u793a\uff0c\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u65f6\u65e5\u5fd7\u8f93\u51fa\u5f53\u524d\u8fdb\u5ea6\uff1a[\u5f53\u524d\u6307\u5b9a\u7b2c\u51e0\u6761/\u7528\u4f8b\u603b\u6570]\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u7528\u4f8b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\u6240\u6709\u5931\u8d25\u7528\u4f8b\u7684\u5217\u8868\uff1b \u5173\u95ed\u7ec8\u7aef\u8f93\u51fa\u6355\u83b7\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u65e5\u5fd7\u5feb\u7167\uff1b \u4f18\u5316\u7ec8\u7aef\u8f93\u51fa\u5931\u8d25\u4fe1\u606f\u5197\u957f\u4e3a\u7b80\u8981\u4fe1\u606f\u8f93\u51fa\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u663e\u793a 10 \u4e2a\u6267\u884c\u6700\u6162\u7684\u7528\u4f8b\u5217\u8868\uff0c\u5e76\u8be6\u7ec6\u5217\u51fa\u5404\u4e2a\u9636\u6bb5\u7684\u8017\u65f6\uff1b \u5931\u8d25\u91cd\u8dd1\u7528\u4f8b\u91cd\u8dd1\u4e4b\u524d\u5ef6\u8fdf 1 \u79d2\uff1b \u65b0\u589e\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4ecd\u7136\u5f3a\u5236\u6267\u884c\uff1b \u7528\u4f8b\u6536\u96c6\u65f6\u4ec5\u5728 apps \u76ee\u5f55\u4e0b\u8fdb\u884c\uff0c\u5ffd\u7565 src,setting,public \u76ee\u5f55\uff1b \u65b0\u589e allure \u62a5\u544a\u5907\u4efd\u529f\u80fd\uff0c\u9ed8\u8ba4\u5907\u4efd\u81f3 allure_back \u76ee\u5f55\u4e0b\uff1b manage.py\u65b0\u589e\u53c2\u6570 --lastfailed \u7528\u4e8e\u53ea\u8dd1\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\u7684\u529f\u80fd\uff1b fix \u4fee\u590d\u4e86\u5728\u6ca1\u6709\u6307\u5b9a\u5e94\u7528\u540d\u79f0\u6267\u884c\u65f6\uff0cxml \u62a5\u544a\u751f\u6210\u8def\u5f84\u5f02\u5e38\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 uos_ci.py \u4f20\u5165 timeout \u548c session_timeout \u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11020220916","title":"1.1.0\uff082022/09/16\uff09","text":"new \u65b0\u589ePMS\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u652f\u6301\u591a\u79cd\u6570\u636e\u56de\u586b\u6a21\u5f0f\uff1b \u4f18\u5316\u4e86\u901a\u8fc7\u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u65f6PMS \u722c\u866b\u7684\u6027\u80fd\uff1b \u65b0\u589e .gitmodules \u6587\u4ef6\uff0c\u7528\u4e8e\u6807\u8bb0\u6240\u6709\u5b50\u9879\u76ee\uff0c\u65b9\u4fbf\u7edf\u4e00\u62c9\u53d6\u4ee3\u7801\uff1b env.sh \u9002\u914d\u793e\u533a\u7248\u4e0a\u5b89\u88c5\u81ea\u52a8\u5316\u73af\u5883\uff1b \u589e\u52a0\u6267\u884c\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u9519\u8bef\u7684\u529f\u80fd\uff1b README.md \u589e\u52a0 Wayland \u4e0b\u4f7f\u7528\u3001\u6d4b\u8bd5\u62a5\u544a\u67e5\u770b\u3001\u5e38\u89c1\u95ee\u9898\u7b49\u7684\u6587\u6863\u8bf4\u660e\uff1b \u589e\u52a0\u4e86\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u5bf9 setup\u3001call\u3001teardown \u8fdb\u884c\u65e5\u5fd7\u5206\u6bb5\uff1b fix \u4fee\u590d\u4e86 \u786e\u8ba4\u4fee\u590d \u5217\u6ca1\u5199\u8868\u5934\uff0c\u4f46\u5199\u4e86 fixed-xxx \u6807\u7b7e\uff0c\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u540c\u4e00\u5e94\u7528\u5185\u591a\u4e2a csv \u6587\u4ef6\u4e2d \u786e\u8ba4\u4fee\u590d \u5217\u6709\u7684\u5199\u4e86\uff0c\u6709\u7684\u6ca1\u5199\uff0c\u53ef\u80fd\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 INFO \u65e5\u5fd7\uff0c\u663e\u793a\u4e3a DEBUG \u7684\u95ee\u9898\uff1b\u4fee\u590d\u4e86\u90e8\u5206\u673a\u5668\u4e0a INFO \u65e5\u5fd7\u5185\u5bb9\u663e\u793a\u4e3a\u7ea2\u8272\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\u770b\u4e0d\u5230\u8be6\u7ec6\u4fe1\u606f\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10220220822","title":"1.0.2\uff082022/08/22\uff09","text":"new \u79fb\u9664 loguru\uff0c\u66ff\u6362\u4e3a logging\uff0c\u63a5\u53e3\u4fdd\u6301\u4e0d\u53d8\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u53d7\u5f71\u54cd\uff1b \u9ed8\u8ba4\u5f00\u542f coredump\uff1b fix \u4fee\u590d\u4e86\u4e09\u65b9\u5e93 loguru \u5076\u73b0\u5f02\u5e38\uff0c\u5bfc\u81f4\u7a0b\u5e8f\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7b2c\u4e00\u6b21\u5931\u8d25\u4e0d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10120220812","title":"1.0.1\uff082022/08/12\uff09","text":"new \u65b0\u589e RELEASE.md \u6587\u4ef6\uff0c\u7528\u4e8e\u8bb0\u5f55\u5386\u53f2\u53d1\u5e03\u7248\u672c\u7684\u66f4\u65b0\u5185\u5bb9\uff1b \u517c\u5bb9 Wayland \u6a21\u5f0f\u4e0b\u6267\u884c\u7528\u4f8b\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u7528\u7ba1\u5f53\u524d\u6d4b\u8bd5\u673a\u6267\u884c\u73af\u5883\uff0c\u6846\u67b6\u4f1a\u81ea\u52a8\u6839\u636e\u5f53\u524d\u73af\u5883\u8d70\u4e0d\u540c\u7684\u4ee3\u7801\u903b\u8f91\uff1b \u7531\u4e8e\u9700\u8981\u4fee\u6539 dogtail \u6e90\u4ee3\u7801\uff0c\u56e0\u6b64\u5c06\u4fee\u6539\u540e\u7684\u6e90\u7801\u653e\u5165\u5230\u6838\u5fc3\u5e93\u91cc\u9762 src/depends/dogtail \u540e\u7eed\u7248\u672c\u5c06\u4e0d\u9700\u8981\u5728\u7cfb\u7edf\u4e2d\u5b89\u88c5dogtail\uff1b \u5982\u679c\u5e94\u7528\u5e93\u540c\u6837\u4f7f\u7528\u4e86\u7cfb\u7edf\u5b89\u88c5\u7684 dogtail \u53ef\u80fd\u4f1a\u62a5\u9519\uff0c\u89e3\u51b3\u65b9\u6848\u662f\u5c06\u4ee3\u7801\u4e2d\u7684 import dogtail \u4fee\u6539\u4e3a from src.depends import dogtail ; fix \u91cd\u8dd1\u5931\u8d25\u4e4b\u540e\u624d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff0c\u4fee\u6539\u4e3a\u5931\u8d25\u4e4b\u540e\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":"# Attribution \uff1achengdu Test Team\n# Date \uff1a2021/08/20\n \u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d \u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d \u4ed3\u5e93\u5730\u5740\uff1ahttps://gitlabcd.uniontech.com/autotest/cd-desktop-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u65b9\u6848\u6982\u8ff0","text":"\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u667a\u80fd\u8bc6\u522b\u5e94\u7528\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u7528\u4e8e\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u64cd\u4f5c\u8fc7\u7a0b\u4e2d\u7684\u5143\u7d20\u5b9a\u4f4d\u4ee5\u53ca\u5224\u65ad\u7ed3\u679c\u65f6\u7684\u65ad\u8a00\u5904\u7406\uff1b\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\uff0c\u6d4b\u8bd5\u673a\u4e0a\u7684\u753b\u9762\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u5230\u670d\u52a1\u5668\u4e0a\uff0c\u670d\u52a1\u5668\u5bf9\u89c6\u9891\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\u540e\uff0c\u670d\u52a1\u5668\u667a\u80fd\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\u6210\u529f\uff0c\u7136\u540e\u5bf9\u6d4b\u8bd5\u673a\u4e0b\u53d1\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\uff0c\u6d4b\u8bd5\u673a\u63a5\u53d7\u5e76\u6267\u884c\u4e0b\u4e00\u6b65\u64cd\u4f5c\u3002 \u670d\u52a1\u5668\u4e0e\u6d4b\u8bd5\u673a\u4e4b\u95f4\u7684\u94fe\u63a5\uff1a \u670d\u52a1\u5668\u901a\u8fc7 USB \u4e32\u53e3\u8bbe\u5907\uff08USB-HID \u534f\u8bae\uff09\u6a21\u62df\u9f20\u6807\u952e\u76d8\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u64cd\u4f5c\u3002 \u901a\u8fc7\u89c6\u9891\u91c7\u96c6\u8bbe\u5907\u6355\u83b7\u6d4b\u8bd5\u673a\u7684\u5b9e\u65f6\u753b\u9762\u4f20\u8f93\u7ed9\u670d\u52a1\u5668\u3002 \u670d\u52a1\u5668\u5bf9\u91c7\u96c6\u7684\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\uff0c\u8bc6\u522b\u5176\u4e2d\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5e76\u8fd4\u56de\u5143\u7d20\u63a7\u4ef6\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\uff0c\u670d\u52a1\u5668\u901a\u8fc7\u667a\u80fd\u5316\u5206\u6790\uff0c\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e00\u81f4\u5c06\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\u901a\u8fc7\u4e32\u53e3\u6a21\u62df\u952e\u9f20\u4fe1\u53f7\u53d1\u9001\u7ed9\u6d4b\u8bd5\u673a\uff1b\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e0d\u4e00\u81f4\u5c06\u4f1a\u8fdb\u5165\u4e2d\u65ad\u5904\u7406\u53ca\u5f02\u5e38\u7ed3\u679c\u8f93\u51fa\uff0c\u7ee7\u7eed\u6267\u884c\u540e\u7eed\u573a\u666f\uff0c\u76f4\u81f3\u6240\u6709\u7528\u4f8b\u6d4b\u8bd5\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u6df1\u5ea6\u5b66\u4e60\u73af\u5883\u642d\u5efa","text":"\u6a21\u578b\u8bad\u7ec3\u4e3b\u8981\u5bf9 GPU \u6709\u8981\u6c42\uff0c\u8bad\u7ec3\u6a21\u578b\u7684\u673a\u5668\u663e\u5b58\u4e0d\u4f4e\u4e8e 6G\uff0c\u5176\u4ed6\u914d\u7f6e\u65e0\u7279\u6b8a\u8981\u6c42\u3002 \u63a8\u8350\u6027\u4ef7\u6bd4\u8f83\u9ad8\u914d\u7f6e \u64cd\u4f5c\u7cfb\u7edf: UnionTech OS Desktop 20 Professional Linux version 4.19.0-desktop-amd64 (deepin@deepin-PC) (Uos 8.3.0.3-3+rebuild) \u5904\u7406\u5668: Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz (\u516b\u6838 / \u5341\u516d\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460M-HDV(RD)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))/8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: TU116 [GeForce GTX 1660]\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u865a\u62df\u73af\u5883\u5b89\u88c5","text":"cd ~\nwget -c https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh\nbash Miniconda3-latest-Linux-x86_64.sh\n \u4e00\u8def\u56de\u8f66 \u7b2c\u4e00\u6b21\u63d0\u793a\u8f93\u5165 yes/no \uff1a\u8f93\u5165 yes \u7ee7\u7eed\u4e00\u8def\u56de\u8f66 \u7b2c\u4e8c\u6b21\u63d0\u793a\uff1a\u8f93\u5165 no cd ~/miniconda3/bin\nsudo chmod 777 activate\n \u6fc0\u6d3bconda\u73af\u5883 . ./activate\n \u6dfb\u52a0\u516c\u53f8\u5185\u7f51\u6e90 conda config --add channels bioconda\nconda config --add channels conda-forge\n \u5982\u679c\u662f\u5916\u7f51\u6dfb\u52a0\u5916\u7f51\u6e90 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/\n \u5982\u679c\u8981\u5220\u9664\u6e90 conda config --remove-key channels\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"2\u3001\u5b89\u88c5\u4f9d\u8d56","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u521b\u5efa\u865a\u62df\u73af\u5883","text":"conda remove --name mmlab --all # \u79fb\u9664\u6240\u6709\u865a\u62df\u73af\u5883\n conda create -n mmlab python=3.7\n conda activate mmlab\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-pytorch","title":"\uff082\uff09\u5b89\u88c5 Pytorch","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install torch==1.7.0+cu101 torchvision==0.8.1+cu101 torchaudio==0.7.0 -f https://download.pytorch.org/whl/torch_stable.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-mmcv","title":"\uff083\uff09\u5b89\u88c5 MMCV","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install mmcv-full==1.3.3 -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.7.0/index.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"\uff084\uff09\u5b89\u88c5\u663e\u5361\u9a71\u52a8","text":"\u6839\u636e\u4f60\u7684\u663e\u5361\u4e0b\u8f7d\u5bf9\u5e94\u9a71\u52a8\uff0c\u6bd4\u5982\u6211\u7684\u663e\u5361\u4e3a GTX1660\uff0c\u9a71\u52a8\u7248\u672c\u4e3a 430\uff0c\u9a71\u52a8\u4e0b\u8f7d\u5730\u5740\uff1ahttps://www.nvidia.cn/Download/Find.aspx?lang=cn CTRL+ALT+F2 \u8fdb\u5165tty\n \u7981\u7528 nouveau \u9a71\u52a8 sudo vim /etc/modprobe.d/blacklist-nouveau.conf\n \u586b\u5165\uff1a blacklist nouveau options nouveau modeset=0\n \u5237\u65b0\u914d\u7f6e\u6587\u4ef6 sudo update-initramfs -u reboot \u91cd\u542f\u540e\u518d\u8fdb\u5165 tty \u5173\u95ed\u56fe\u50cf\u754c\u9762\uff0c\u8f93\u5165\u547d\u4ee4\u5173\u95ed\u56fe\u50cf\u754c\u9762 sudo service lightdm stop\n \u5b89\u88c5\u9a71\u52a8 sudo chmod a+x NVIDIA-Linux-x86_64-430.run\nsudo ./NVIDIA-Linux-x86_64-430.run\n reboot\u91cd\u542f\uff0cnvidia-smi\u67e5\u770b\u5b89\u88c5\u72b6\u6001\u3002\u6ce8\u610f\u770b\u4e0bcuda\u7248\u672c\uff0c10.1\uff0cdriver\u7248\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u6570\u636e\u6807\u6ce8","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u6570\u636e\u6807\u6ce8","text":"\u6807\u6ce8\u4e4b\u524d\u9700\u8981\u5148\u8f6c\u6362\u56fe\u7247\u5927\u5c0f\uff0c\u5e76\u4e14\u4ee5\u6570\u5b57\u547d\u540d\uff0c\u6bcf\u7ec4\u547d\u540d\u9012\u589e"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"\uff081\uff09\u8f6c\u6362\u5927\u5c0f\u5e76\u91cd\u547d\u540d","text":"rename_pic.py import os\nimport sys\nimport cv2\nimport time\nimport getpass\nusername = getpass.getuser()\nsource_path = f\"/home/{username}/Desktop/right_menu\" # \u56fe\u7247\u8def\u5f84\nsource_dest = os.path.join('/'.join(source_path.split(\"/\")[:-1]), 'tmp')\nif not os.path.exists(source_dest):\nos.mkdir(source_dest)\nstart_name = sys.argv[1]\nfile_name_list = list()\nfor file in os.listdir(source_path):\nif file.endswith('.png'):\nfile_name_list.append(file)\nstart_name = int(start_name)\nfor file in file_name_list:\nos.rename(os.path.join(source_path,file), os.path.join(source_path, f\"{str(start_name)}.png\"))\nstart_name += 1\ntime.sleep(1)\nfor file in os.listdir(source_path):\nimage = os.path.join(source_path, str(file))\nsrc = cv2.imread(image)\nresult = cv2.resize(src, (960, 540))\nresizeImage = os.path.join(source_dest, str(file))\nprint(resizeImage)\ncv2.imwrite(str(resizeImage), result)\ncv2.waitKey(0)\ncv2.destroyAllWindows()\ntime.sleep(1)\nos.system(f'rm -rf {source_path}/*')\nos.system(f'mv {source_dest}/* {source_path}')\nos.system(f'rm -rf {source_dest}')\nprint(\"\u4e0b\u4e00\u4e2a\u5e8f\u53f7\uff1a\", start_name)\n \u6839\u636e\u7ec8\u7aef\u8f93\u51fa\u7684\u4e0b\u4e00\u4e2a\u5e8f\u53f7\u7684\u63d0\u793a\uff0c\u6267\u884c Python \u6587\u4ef6\u7684\u65f6\u5019\u4f20\u53c2\u3002 python rename_pic.py 249\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"\uff082\uff09\u5de5\u5177\u6807\u6ce8","text":"\u4f7f\u7528\u5de5\u5177 labelImg \u6807\u6ce8 sudo pip3 install PyQt5==5.13\nsudo pip3 install labelImg\n \u7ec8\u7aef\u76f4\u63a5\u8f93\u5165 labelImg\uff0c\u56de\u8f66 \u6807\u6ce8\u6a21\u5f0f\u9009\u62e9\uff1aPascalVOC"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u667a\u80fd\u6807\u6ce8","text":"\u6253\u5f00\u5c4f\u5e55\u5f55\u5236\u8f6f\u4ef6\uff0c\u5f55\u5236\u624b\u52a8\u64cd\u4f5c\u4e00\u6b21\u6d4b\u8bd5\u7528\u4f8b\uff0c\u7136\u540e\u5c06\u5f55\u5236\u7684\u89c6\u9891\u8fdb\u884c\u5206\u5e27\uff0c\u7136\u540e\u5bf9\u6bd4\u524d\u4e24\u5e27\u56fe\u6807\u76f8\u4f3c\u5ea6\uff0c\u5254\u9664\u76f8\u4f3c\u5ea6\u8fc7\u9ad8\u7684\u56fe\u7247\uff0c\u5728\u4fdd\u8bc1\u7d20\u6750\u591a\u6837\u6027\u7684\u524d\u63d0\u4e0b\uff0c\u5254\u9664\u91cd\u590d\u591a\u4f59\u7684\u56fe\u7247\u751f\u6210\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u96c6\uff0c\u7136\u540e\u53d6\u51fa\u63a7\u4ef6\u6a21\u677f\u6570\u636e\u96c6\uff0c\u901a\u8fc7 OpenCV \u6a21\u677f\u5339\u914d\u83b7\u53d6\u63a7\u4ef6\u5728\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u56fe\u7247\u4e2d\u6240\u5728\u7684\u5de6\u4e0a\u3001\u5de6\u4e0b\u3001\u53f3\u4e0a\u3001\u53f3\u4e0b\u56db\u5904\u5750\u6807\uff0c\u4ece\u800c\u6839\u636e\u6a21\u677f\u6570\u636e\u96c6\u751f\u6210\u6807\u6ce8\u6570\u636e\u3002\u53c2\u8003\u76ee\u5f55 AnnotationMaterial"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"\uff081\uff09\u6a21\u677f\u6570\u636e\u96c6\u51c6\u5907","text":"1\u3001\u5728\u754c\u9762\u622a\u53d6\u9700\u8981\u6807\u6ce8\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u653e\u5728\u76ee\u5f55\u4e0b AnnotationMaterial/template/img 2\u3001\u7ef4\u62a4\u63a7\u4ef6\u540d\u4e0e\u5143\u7d20\u63a7\u4ef6\u7684\u952e\u5bf9\uff0c\u4e00\u4e2a\u63a7\u4ef6\u540d\u53ef\u5bf9\u5e94\u591a\u4e2a\u5143\u7d20\u63a7\u4ef6 menu:\n- menu.jpg\n- menu1.jpg\n- menu2.jpg\n- menu3.jpg\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"\uff082\uff09\u7d20\u6750\u96c6\u51c6\u5907","text":"\u5f55\u5236\u89c6\u9891\u6216\u6216\u5c4f\u5e55\u622a\u56fe\u653e\u7f6e\u76ee\u5f55 AnnotationMaterial/source"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u5f00\u59cb\u6807\u6ce8","text":"python3 AnnotationMaterial/main.py\n \u751f\u6210\u7684\u6807\u6ce8\u6570\u636e\u5b58\u653e\u5728 AnnotationMaterial/result"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#mmdetection","title":"\u56db\u3001MMDetection","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1-mmdetection","title":"1\u3001 MMDetection \u4ee3\u7801","text":"MMDetection \u662f\u4e00\u4e2a\u6709\u540d\u7684\u6df1\u5ea6\u5b66\u4e60\u76ee\u6807\u68c0\u6d4b\u5f00\u6e90\u9879\u76ee\uff0c\u4e5f\u662f openMMlab \u7684\u62db\u724c\u9879\u76ee\uff0c\u4e3a\u4ec0\u4e48\u9009\u62e9\u5b83\uff0c\u5c0f\u5b69\u513f\u6ca1\u5a18\u8bf4\u6765\u8bdd\u957f\uff0c\u611f\u5174\u8da3\u53ef\u4ee5\u81ea\u884c\u6df1\u5165\u4e86\u89e3\uff1b \u4f60\u53ef\u4ee5\u76f4\u63a5\u5728 GitHub \u4e0a\u514b\u9686\u4ee3\u7801\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u54b1\u4eec\u4ed3\u5e93\u4e0b Train \u76ee\u5f55\u4e2d\u4ee3\u7801\uff0cTrain \u4e2d\u7684\u4ee3\u7801\u4e5f\u662f\u4ece GitHub \u4e0a\u62c9\u53d6\u7684\uff0c\u4e0d\u8fc7\u6211\u4eec\u6839\u636e\u9879\u76ee\u9700\u8981\u505a\u4e86\u4e00\u4e9b\u4e8c\u6b21\u5f00\u53d1\uff0c\u63a8\u8350\u76f4\u63a5\u4f7f\u7528\u5b83\u3002 \u5982\u679c\u4f60\u60f3\u4ece GitHub \u4e0a\u62c9\uff1a git clone https://github.com/open-mmlab/mmdetection.git\n# \u4e0d\u80fd\u76f4\u63a5\u62c9\u53d6\u4e3b\u5206\u652f\uff0c\u5efa\u8bae\u4f7f\u75282.12\u7248\u672c\uff0c\u4e0d\u540c\u7684\u7248\u672c\u5bf9\u5e94\u7684mmcv\u7248\u672c\u662f\u4e0d\u540c\u7684\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-voc2coco","title":"2\u3001\u62c9\u53d6 voc2coco \u4ee3\u7801","text":"git clone https://github.com/Tony607/voc2coco.git\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-coco","title":"3\u3001\u8f6c\u6362 coco \u6570\u636e\u96c6","text":"\u5c06\u6240\u6709\u7684\u56fe\u7247\u548cxml\u6587\u4ef6\u653e\u5165train2017\uff0c\u4ece\u4e2d\u6311\u9009\u51e0\u7ec4\u653e\u5165val2017\uff08\u6d4b\u8bd5\u96c6\uff09 cd mmdetection/data/coco\npython voc2coco.py train2017 annotations/instances_train2017.json\npython voc2coco.py val2017 annotations/instances_val2017.json\n \u751f\u6210json\u6587\u4ef6"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4_1","title":"4\u3001\u4fee\u6539\u914d\u7f6e","text":"\uff081\uff09\u8bfb\u53d6\u6a21\u578b\u540d\u79f0 import json\nmodule_name = []\nwith open('./instances_train2017.json', \"r+\") as f:\njson_file = f.read()\njson_dict = json.loads(json_file)\nmodule_list = json_dict.get('categories')\nfor module_info in module_list:\nname = module_info.get('name')\nmodule_name.append(name)\nprint(module_name)\nprint(\"module_num:\", len(module_name))\n # \u6ce8\u610f\u5bf9\u6bd4instances_train2017.json\u91cc\u9762\u6a21\u578b\u540d\u79f0\u7684\u987a\u5e8f\uff0c\u4e0eCLASSES\u548ccoco_classes\u91cc\u9762\u7684\u987a\u5e8f\u4fdd\u6301\u4e00\u81f4\u3002\n \uff082\uff09\u4fee\u6539 faster_rcnn_r101_2x_coco.py mmdetection/xianjin/faster_rcnn_r101_2x_coco.py \u4fee\u653946\u884c\uff0cnum_clasess\u7684\u503c\uff0c\u65b0\u589e1\u4e2a\uff0c\u5c31 +1\uff1b \uff083\uff09\u4fee\u6539 coco.py mmdetection/mmdet/datasets/coco.py CLASSES = ()\uff0c\u5728\u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b \uff084\uff09\u4fee\u6539 class_names.py mmdetection/mmdet/core/evaluation/class_names.py coco_classes \u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#5","title":"5\u3001\u7f13\u5b58\u6e05\u7406","text":"\u5220\u9664 mmdetection/build \u76ee\u5f55 python setup.py install\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#6","title":"6\u3001\u8bad\u7ec3\u6a21\u578b","text":"\uff081\uff09\u6307\u5b9a\u81ea\u5df1\u914d\u7f6e\u7684\u8bad\u7ec3\u6a21\u578b\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py --gpus 1\n \uff082\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u6d4b\u8bd5\u96c6\u7ed3\u679c\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py xianjin/epoch_24.pth --show\n \uff083\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u51c6\u786e\u5ea6\uff1b python tools/analysis_tools/analyze_logs.py plot_curve xianjin/20210530_011907.log.json --keys acc\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#7","title":"7\u3001\u5feb\u6377\u64cd\u4f5c","text":"python3 run.py\n \u5c06\u4ee5\u4e0a 4 - 7 \u6b65\u64cd\u4f5c\u6574\u5408\u6210 run.py\uff0c\u4e00\u952e\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u4e94\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\uff1b \u670d\u52a1\u7aef\u4e00\u53f0\uff08\u76ee\u524d\u4ec5\u652f\u6301AMD\u67b6\u6784\uff09\uff1b \u91c7\u96c6\u76d2\u4e00\u4e2a \uff08ACASIS hdmi\u89c6\u9891\u91c7\u96c6\u5361\uff0chttps://item.jd.com/10024310742602.html \uff09\uff1b USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\uff1b USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff1b \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5USB\u5ef6\u957f\u7ebf\uff1b \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u63a8\u8350\u914d\u7f6e","text":"\u6267\u884c\u7528\u4f8b\u7684\u670d\u52a1\u7aef\u5bf9\u914d\u7f6e\u6ca1\u6709\u7279\u6b8a\u8981\u6c42\uff0c\u5982\u679c\u6761\u4ef6\u5141\u8bb8\u914d\u7f6e\u8d8a\u9ad8\uff0c\u8bc6\u522b\u901f\u5ea6\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n \u6d4b\u8bd5\u673a\u4e0a\u4e0d\u6267\u884c\u4efb\u4f55\u811a\u672c\uff0c\u5177\u4f53\u914d\u7f6e\u6839\u636e\u6d4b\u8bd5\u9700\u8981\u51b3\u5b9a\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#usb_mk","title":"\u516d\u3001USB_MK\u4e32\u53e3\u9a71\u52a8\u65b9\u6cd5","text":"\u4f4d\u4e8econtrol_method\u76ee\u5f55\u4e0b\u7684usb_mk.py\u6587\u4ef6 \uff081\uff09\u5217\u51fa\u53ef\u901a\u4fe1\u7684\u7aef\u53e3 python3 -m serial.tools.list_ports -v\n \uff082\uff09\u4fee\u6539\u4e32\u53e3\u7684\u6743\u9650 sudo chmod 777 /dev/ttyACM0\n \uff083\uff09\u5b9e\u4f8b\u5316USB_MK import UsbMk\nusb_mk = UsbMk(\"/dev/ttyACM0\", 9600) # \u8bbe\u5907\u9ed8\u8ba49600\u4e3a\u6ce2\u7279\u7387\uff0c\u63a7\u5236\u4f20\u8f93\u901f\u7387\n \uff084\uff09USB\u4e32\u53e3\u8bbe\u5907\u9ed8\u8ba4\u6ce2\u7279\u7387\u4e3a9600\uff08\u7ecf\u6d4b\u8bd5\u6ce2\u7279\u73879600\u51c6\u786e\u6027\u6700\u597d\uff09\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up() # \u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u6c49\u5b57\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e\n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff083\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff084\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff085\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() # \u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2\n \uff086\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff087\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff088\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e03\u3001\u65b9\u6cd5\u8c03\u7528\u5165\u53c2\u89c4\u5219","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_7","title":"1\u3001\u57fa\u7c7b","text":"class Base:\ndef __init__(self):\nself._obj = image\nself._usb = usb_mk\ndef find_element_by_ai(self, element):\nreturn self._obj.find_element(element)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_6","title":"2\u3001\u5165\u53c2\u8bf4\u660e","text":"\u56fe\u50cf\u8bc6\u522b\u65b9\u6cd5\u5165\u53e3\u4e3a Base \u7c7b\u4e0b\u7684 find_element_by_ai \u3002\u4ec5\u63a5\u53d7\u4e00\u4e2a\u53c2\u6570 element\uff0c\u7c7b\u578b\u4e3a string\u3002 \u53ef\u8bc6\u522b\u7684 string \u683c\u5f0f\uff1a \uff081\uff09\u5927\u56fe\u6807\uff08 \u56fe\u6807\u5927\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\uff0c\u4f8b\uff1a Base().find_element_by_ai(\"window\")\n \uff082\uff09\u5927\u56fe\u6807 / \u5c0f\u56fe\u6807\uff08\u56fe\u6807\u5c0f\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5c0f\u56fe\u6807\uff0c\u4f8b\uff1awindow/search_btn Base().find_element_by_ai(\"window/search_btn\")\n \uff083\uff09\u5927\u56fe\u6807 / OCR\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\u5185\u7684\u6587\u5b57\uff0c\u4f8b\uff1amenu/\u5c5e\u6027 Base().find_element_by_ai(\"menu/\u5c5e\u6027\")\n \uff084\uff09OCR\uff1a\u5168\u5c4f\u8bc6\u522b\u6587\u5b57 Base().find_element_by_ai(\"\u641c\u7d22\")\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516b\u3001\u9690\u85cf\u9f20\u6807","text":"\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u8fc7\u6765\u7684\u89c6\u9891\u6d41\uff0c\u5728\u8bc6\u522b\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u53d7\u5230\u9f20\u6807\u5f71\u54cd\uff0c\u56e0\u6b64\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u9690\u85cf\u9f20\u6807\u3002 \u5c4f\u853d\u9f20\u6807\u5149\u6807\u663e\u793a ```shell script /etc/lightdm/lightdm.conf \u5728`[Seat:*]`\u4e0b\u9762\u6dfb\u52a0\u53c2\u6570\n```shell script\nxserver-command=X -bs -core -nocursor\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e5d\u3001\u667a\u80fd\u81ea\u52a8\u5316\u7684\u610f\u4e49","text":"1\u3001\u6539\u5584 Acessibility \u5b9a\u4f4d\u7684\u7a33\u5b9a\u6027\u95ee\u9898 Acessibility \u5c5e\u6027\u5b9a\u4f4d\u5b58\u5728\u5076\u5c14\u5931\u6548\u7684\u60c5\u51b5 \uff081\uff09\u5f00\u53d1\u5728\u505a\u65b0\u9700\u6c42\u5f00\u53d1\u65f6\u53ef\u80fd\u6d89\u53ca\u5230\u5bf9\u5c5e\u6027\u6807\u7b7e\u7684\u4fee\u6539\u6216\u8005\u5c42\u7ea7\u7684\u8c03\u6574\uff0c\u53ef\u80fd\u9020\u6210\u81ea\u52a8\u5316\u7528\u4f8b\u65e0\u6cd5\u5b9a\u4f4d\u5230\u5143\u7d20\u3002 \u6bd4\u59821040\u9636\u6bb5\uff0c\u97f3\u4e50\u91cd\u6784\u7684\u65f6\u5019\uff0c\u5f00\u53d1\u5bf9\u90e8\u5206\u5c5e\u6027\u548c\u5c42\u7ea7\u505a\u4e86\u4fee\u6539\uff0c\u5bfc\u81f4\u81ea\u52a8\u5316\u7528\u4f8b\u5b9a\u4f4d\u65b9\u6cd580%\u9700\u8981\u4fee\u6539\u3002 \u5f00\u53d1\u65b0\u529f\u80fd\u7684\u65f6\u5019\u5076\u5c14\u4e5f\u4f1a\u5bf9\u5c5e\u6027\u505a\u8c03\u6574\uff0c\u9047\u52305\u6b21\u3002 \uff082\uff09\u76ee\u524d\u4e3b\u8981\u4f7f\u7528Dogtail\u8bc6\u522b\u5e94\u7528Acessibility\u5c5e\u6027\u8fdb\u884c\u5b9a\u4f4d\uff0c\u662f\u83b7\u53d6\u5e94\u7528\u5f53\u524d\u754c\u9762\u7684\u5c5e\u6027tree\uff0c\u5728\u5e94\u7528\u8df3\u8f6c\u540e\uff0cDogtail\u5b58\u5728\u65e0\u6cd5\u53ca\u65f6\u83b7\u53d6\u5f53\u524d\u5c5e\u6027\u5217\u8868\u7684\u60c5\u51b5\u3002 \u591a\u5a92\u4f53\u8c03\u7528\u6587\u7ba1\u7a97\u53e3\u7684\u65f6\u5019\uff0c\u51fa\u73b0\u627e\u4e0d\u5230\u6587\u7ba1\u91cc\u9762\u5143\u7d20\u7684\u60c5\u51b5\uff0c\u76ee\u524d\u51fa\u73b010+\u6b21\u3002 \u5e94\u7528\u8bbe\u7f6e\u9875\u9762\u7684\u5c5e\u6027\u5076\u5c14\u5b58\u5728\u627e\u4e0d\u5230\u7684\u60c5\u51b5\uff0c\u9047\u52305\u6b21\u3002 \uff083\uff09Dogtail\u5de5\u5177\u672c\u8eab\u5b58\u5728\u95ee\u9898\uff0c\u6709\u65f6\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u5019\u5f88\u6162\uff0c\u8ba9\u4eba\u65e0\u6cd5\u63a5\u53d7\uff0c\u76ee\u524d\u51fa\u73b0\u8fc7\u5f88\u591a\u6b21\u3002 \u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u95f4\u6bd4\u5e73\u5e38\u61623\u500d\uff0c\u51fa\u73b04\u6b21\u3002 2\u3001\u89e3\u51b3\u4e86\u4f7f\u7528\u7edd\u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898 \u90e8\u5206\u63a7\u4ef6\u65e0\u6cd5\u6dfb\u52a0 Acessibility \u5c5e\u6027\u4ece\u800c\u4f7f\u7528\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u51fa\u73b0\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898\u3002 \uff081\uff09\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u65b9\u6cd5\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u76ee\u6807\u56fe\u7247\u8d44\u6e90\uff0c\u5728 UI \u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u4f1a\u6d89\u53ca\u5230\u76ee\u6807\u8d44\u6e90\u7684\u66ff\u6362\uff0c\u6bd4\u8f83\u8017\u8d39\u4eba\u529b\u3002 \uff082\uff09\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6cd5\u5bf9\u6bd4\u7cbe\u5ea6\u6bd4\u8f83\u641e\uff0c\u5982\u679cUI \u7684\u53d8\u66f4\u4f1a\u9020\u6210\u65e0\u6cd5\u51c6\u786e\u5b9a\u4f4d\u5230\uff0c\u81ea\u52a8\u5316\u811a\u672c\u5065\u58ee\u6027\u4e0d\u8db3\u3002 3\u3001\u4f7f\u7528\u673a\u5668\u5206\u79bb\uff0c\u89e3\u51b3\u4e86\u81ea\u52a8\u5316\u811a\u672c\u5bf9\u5e94\u7528\u7684\u5f71\u54cd\uff0c\u771f\u5b9e\u8fd8\u539f\u7528\u6237\u7684\u4f7f\u7528\u573a\u666f \u673a\u5668\u5206\u79bb\u7684\u67b6\u6784\u8bbe\u8ba1\uff0c\u4fdd\u8bc1\u4e86\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u73af\u5883\u5b8c\u5168\u7b49\u540c\u4e8e\u7528\u6237\uff0c\u6392\u9664\u6d4b\u8bd5\u811a\u672c\u7684\u5f71\u54cd\u3002 \uff081\uff09\u76ee\u524d\u7684\u529f\u80fd\u81ea\u52a8\u5316\u662f\u5728\u6d4b\u8bd5\u673a\u4e0a\u76f4\u63a5\u8fd0\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\uff0c\u52a0\u4e0a\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u6211\u4eec\u6dfb\u52a0\u4e86\u4e00\u4e9b\u8fdb\u7a0b\u76d1\u63a7\u3001\u89c6\u9891\u5f55\u5236\u7b49\u529f\u80fd\uff0c\u81ea\u52a8\u5316\u811a\u672c\u672c\u8eab\u4f1a\u6d88\u8017\u4e00\u4e9b\u7cfb\u7edf\u8d44\u6e90\uff0c\u65e0\u6cd5\u8fd8\u539f\u771f\u662f\u7684\u7528\u6237\u4f7f\u7528\u573a\u666f\u3002 \uff082\uff09\u6027\u80fd\u6d4b\u8bd5\u9700\u8981\u6392\u9664\u5176\u4ed6\u7a0b\u5e8f\u7684\u8d44\u6e90\u6d88\u8017\u5f71\u54cd\uff0c\u6027\u80fd\u81ea\u52a8\u5316\u91c7\u7528\u673a\u5668\u5206\u79bb\uff0c\u4fdd\u8bc1\u4e86\u6027\u80fd\u6570\u636e\u7684\u51c6\u786e\u6027\u3002 \u4ee5\u524d\u7684\u7528\u4f8b\u6267\u884c\u8017\u65f6\u6ca1\u6761\u572830\u79d2\u5de6\u53f3\uff0c\u73b0\u5728\u7528\u4f8b\u8017\u65f6\u572810\u79d2\u3002 4\u3001\u89e3\u51b3\u4e86UI \u8c03\u6574\u5bfc\u81f4\u5b9a\u4f4d\u5931\u8d25\u7684\u4e0d\u7a33\u5b9a\u6027\u95ee\u9898 \uff081\uff09\u89e3\u51b3\u4e86\u56e0 UI \u8c03\u6574\u5bfc\u81f4\u63a7\u4ef6\u4f4d\u7f6e\u53d8\u5316\u6216\u8272\u5dee\u53d8\u5316\u540e\u5b9a\u4f4d\u4e0d\u51c6\u786e\u7684\u95ee\u9898\uff0c\u53ea\u8981\u63a7\u4ef6\u6587\u6848\u548c\u63a7\u4ef6\u5916\u8fb9\u6846\u65e0\u53d8\u5316\u5747\u53ef\u51c6\u786e\u5b9a\u4f4d\uff1b \uff082\uff09\u76ee\u524d\u4e5f\u4f1a\u91c7\u7528\u57fa\u4e8eUI\u7684\u5b9a\u4f4d\u65b9\u6848\uff0c\u5982\u679cUI\u4f4d\u7f6e\u6709\u8c03\u6574\uff0c\u4f1a\u5bfc\u81f4\u5143\u7d20\u65e0\u6cd5\u5b9a\u4f4d\u3002 5\u3001\u7b80\u5316\u4e86\u7528\u4f8b\u7ed3\u6784\uff0c\u63d0\u5347\u7f16\u5199\u53cb\u597d\u5ea6 \uff081\uff09\u667a\u80fd\u81ea\u52a8\u5316\u8bc6\u522b\u5143\u7d20\u7684\u65b9\u6cd5\u53ea\u6709\u4e00\u4e2a\uff0c\u5c31\u662f\u57fa\u4e8e\u6211\u4eec\u8bad\u7ec3\u7684\u6a21\u578b\u8bc6\u522b\u89c6\u9891\u6d41\u4e2d\u7684\u5143\u7d20\uff0c\u7ecf\u8fc7\u811a\u672c\u5c01\u88c5\u4e4b\u540e\uff0c\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u4e2d\u6240\u6709\u5b9a\u4f4d\u7684\u64cd\u4f5c\u90fd\u53ea\u9700\u8981\u8c03\u7528\u8fd9\u4e00\u4e2a\u65b9\u6cd5\u5c31\u884c\u4e86\uff0c\u7f16\u5199\u81ea\u52a8\u5316\u811a\u672c\u7684\u96be\u5ea6\u5927\u5927\u964d\u4f4e\u3002 \uff082\uff09\u4e5f\u662f\u7531\u4e8e\u8c03\u7528\u65b9\u6cd5\u7b80\u5355\uff0c\u5728 UI \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u4e2d\u7684\u5206\u5c42\u7ed3\u6784\u5c06\u4f1a\u51cf\u5c11\uff0c\u591a\u7ee7\u627f\u7684\u60c5\u51b5\u4f1a\u51cf\u5c11\uff0c\u81ea\u52a8\u5316\u4ee3\u7801\u7684\u8c03\u7528\u7ed3\u6784\u4e5f\u4f1a\u53d8\u5f97\u7b80\u5355\uff0c\u800c\u4e14\u529f\u80fd\u6d4b\u8bd5\u540c\u5b66\u7f16\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u66f4\u52a0\u5bb9\u6613\u4e0a\u624b\u3002 \u4ee5\u524d\u5199\u7528\u4f8b\u7531\u4e8e\u9700\u8981\u7ed3\u5408\u4e0d\u540c\u7684\u6a21\u5757\uff0c\u8c03\u7528\u4e0d\u540c\u7684\u65b9\u6cd5\uff0c\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u5e76\u5b8c\u6210\u8c03\u8bd5\u7684\u65f6\u95f4\u5e73\u5747\u572820-30\u5206\u949f\uff0c\u73b0\u5728\u5199\u7528\u4f8b\u811a\u672c\u80fd\u57285\u5206\u949f\u5de6\u53f3\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":"# =============================================\n# Attribution : Application Test Department III\n# Time : 2023/1/3\n# Author : ut003281\n# =============================================\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u7b80\u8ff0","text":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5 \u901a\u8fc7\u81ea\u52a8\u5316\u624b\u6bb5\u5bf9\u5e94\u7528\u8fdb\u884c\u6027\u80fd\u6d4b\u8bd5\uff0c\u63d0\u4f9b\u65b9\u4fbf\u7684\u73af\u5883\u90e8\u7f72\u3001\u8fd0\u884c\u914d\u7f6e\u3001\u7528\u4f8b\u7f16\u5199\u7b49\uff0c\u7528\u4e8e\u684c\u9762\u5e94\u7528\u7684\u51b7\u70ed\u542f\u52a8\u3001\u8d44\u6e90\u62f7\u8d1d\u3001\u9875\u9762\u8df3\u8f6c\u7b49\u6027\u80fd\u573a\u666f\u6d4b\u8bd5\u3002 \u4ed3\u5e93\u5730\u5740\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-perf-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u4ee3\u7801\u7ed3\u6784","text":"autotest-perf-aitest\n\u251c\u2500\u2500 apps # \u5b58\u653e\u6240\u6709\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u811a\u672c\n\u251c\u2500\u2500 conftest.py # pytest hook\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 CURRENT # \u7248\u672c\u5185\u5bb9\n\u251c\u2500\u2500 docs # \u6587\u6863\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u952e\u503c\u5bf9\u7167\u8868.pdf # \u4e32\u53e3\u7ebfcode\u4e0e\u6309\u952e\u7684\u5bf9\u7167\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u6027\u80fd\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\u6267\u884c\u5668\u4f7f\u7528\u6307\u5357.md # \u6267\u884c\u5668\u811a\u672c\u4f7f\u7528\u6307\u5357\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 USB\u4e32\u53e3\u8f6cUSB\u952e\u76d8\u9f20\u6807\u7ebf\u534f\u8bae\u6587\u4ef6V1.0.pdf # \u4e32\u53e3\u534f\u8bae\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput-0.28.2.zip # Linux\u4e0b\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\u7684\u6e90\u7801\uff0c\u53ef\u6839\u636e\u67b6\u6784\u6253\u5305\n\u251c\u2500\u2500 manage.py # \u529f\u80fd\u4e3b\u5165\u53e3\n\u251c\u2500\u2500 pytest.ini # pytst \u914d\u7f6e\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 setting # \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 client.ini # \u6d4b\u8bd5\u673a IP \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5168\u5c40\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dev_env.sh # \u5bbf\u4e3b\u673a\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose_no_relay.yml # \u65e0\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose.yml # \u6709\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker_login.sh # docker \u767b\u9646\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 res\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 black.png # \u5168\u9ed1\u56fe\u7247\uff0c\u7528\u4e8e\u4fee\u6539\u58c1\u7eb8\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_5000.deb # 3A5000 \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_amd64.deb # amd \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_arm64.deb # arm \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_mips64.deb # mips \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_sw_64.deb # sw \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 server.ini # \u670d\u52a1\u5668\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 setup.sh # \u5bb9\u5668\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 template # \u521b\u5efa app \u57fa\u7840\u811a\u672c\u6a21\u677f\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 app_template\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ${app_name}_widget.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 control-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 images\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 test_${app_name}_01_scene.json-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 test_${app_name}_01_scene.py-tpl\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 uos_docker # \u5bb9\u5668\u73af\u5883\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dockerfile\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 requirements.txt\n\u2514\u2500\u2500 src\n \u251c\u2500\u2500 analysis_save.py # \u89e3\u6790\u56fe\u7247\u6d41\u7ed3\u679c\uff0c\u6c47\u603b\u751f\u6210 excel \u62a5\u544a\n\u251c\u2500\u2500 base_widget.py # \u5c01\u88c5\u7684\u57fa\u7840\u64cd\u4f5c\uff0c\u5e94\u7528\u8c03\u7528\u7684\u4e3b\u5165\u53e3\u65b9\u6cd5\n\u251c\u2500\u2500 cmdctl.py # \u8c03\u7528\u547d\u4ee4\u884c\u4f7f\u7528\n\u251c\u2500\u2500 global_value.py # \u5168\u5c40\u53d8\u91cf\n\u251c\u2500\u2500 image_utils.py # \u56fe\u7247\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 __init__.py\n \u251c\u2500\u2500 logger_utils.py # \u65e5\u5fd7\u914d\u7f6e\n\u251c\u2500\u2500 pdocr.py # ocr \u914d\u7f6e\n\u251c\u2500\u2500 public_method.py # \u4e00\u4e9b\u65b9\u4fbf\u7684\u5c01\u4f4f\n\u251c\u2500\u2500 record.py # \u5f55\u5c4f\u76f8\u5173\n\u251c\u2500\u2500 rtk # \u8fd0\u884c\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 _base.py # \u4e00\u4e9b\u679a\u4e3e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 install_env.py # \u5b89\u88c5\u73af\u5883\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 local_runner.py # \u8fd0\u884c\u7528\u4f8b\n\u251c\u2500\u2500 serial_communication # \u4e32\u53e3\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 power_control.py # \u7ee7\u7535\u5668\u64cd\u4f5c\uff0c\u4f7f\u7528\u7ee7\u7535\u5668\u8fde\u63a5\u4e3b\u673a\u7535\u6e90\uff0c\u63a7\u5236\u5f00\u5173\u673a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 serial_common.py # \u4e32\u53e3\u516c\u5171\u65b9\u6cd5\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 usb_mk.py # \u952e\u9f20\u64cd\u4f5c\u57fa\u7840\u5c01\u88c5\n\u251c\u2500\u2500 shortcut_key.py # \u5feb\u6377\u952e\u7684\u5c01\u88c5\n\u251c\u2500\u2500 singleton.py # \u5355\u4f8b\u6a21\u5f0f\n\u251c\u2500\u2500 start_app.py # \u521b\u5efa app\n\u2514\u2500\u2500 write_xlsx.py # \u751f\u6210 excel\n# __init__.py \u6587\u4ef6\u4e3a\u6807\u8bc6\u8be5\u76ee\u5f55\u662f\u4e00\u4e2aPython\u7684\u6a21\u5757\u5305\uff0c\u9879\u76ee\u4e2d\u7684__init__.py\u5747\u4e3a\u7a7a\u6587\u4ef6\u3002\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u73af\u5883\u642d\u5efa","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\u3002 \u670d\u52a1\u7aef\u4e00\u53f0\u3002\uff08\u4ec5\u652f\u6301 AMD \u67b6\u6784\uff0c\u82e5\u9700\u5176\u4ed6\u67b6\u6784\uff0c\u54a8\u8be2\u76f8\u5173\u5f00\u53d1\u4eba\u5458\uff09 \u91c7\u96c6\u76d2\u4e00\u4e2a\u3002 \uff08ACASIS HDMI \u89c6\u9891\u91c7\u96c6\u76d2\uff0chttps://item.jd.com/100013302599.html#crumb-wrap \uff09 USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\u3002\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"\uff082\uff09\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\u3002 USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff08USB3.0 \u63a5\u53e3\u4e0a\uff09\u3002 \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5 USB \u5ef6\u957f\u7ebf\u3002 \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u670d\u52a1\u7aef\u63a8\u8350\u914d\u7f6e","text":"\u914d\u7f6e\u8d8a\u9ad8\uff0c\u89e3\u6790\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"2\u3001\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa","text":" \u6253\u5f00\u63a7\u5236\u4e2d\u5fc3\uff0c\u8d26\u6237\u8bbe\u7f6e\u4e3a\u3010\u81ea\u52a8\u767b\u5f55\u3011\u548c\u3010\u65e0\u5bc6\u7801\u767b\u5f55\u3011\uff0c\u7535\u6e90\u7ba1\u7406\u4e2d\u4f7f\u7528\u7535\u6e90\u5168\u90e8\u8bbe\u7f6e\u4e3a\u3010\u4ece\u4e0d\u3011\uff0c\u5f00\u542f\u5f00\u53d1\u8005\u6a21\u5f0f\u3002 \u6839\u636e\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u8981\u6c42\uff0c\u5bfc\u5165\u76f8\u5173\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\uff1a\u5bfc\u5165\u76f8\u518c\u3001\u5f71\u9662\u3001\u97f3\u4e50\u7684\u6d4b\u8bd5\u8d44\u6e90\u3002 \u5728\u670d\u52a1\u7aef\u6253\u5f00\u76f8\u673a\u5e94\u7528\u540e\uff0c\u5c06\u6d4b\u8bd5\u673a\u684c\u9762\u58c1\u7eb8\u66f4\u6362\u4e3a\u7eaf\u8272\u58c1\u7eb8\uff08\u6ce8\u610f\uff0c\u670d\u52a1\u7aef\u9700\u63d0\u524d\u5f00\u542f\u76f8\u673a\u540e\u518d\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u58c1\u7eb8\uff0c\u5efa\u8bae\u7eaf\u9ed1\u58c1\u7eb8 setting/res/black.png\uff09 \u5728\u6587\u4ef6\u7ba1\u7406\u5668\u4e2d\uff0c\u5c06\u9009\u9879 \u4e3b\u83dc\u5355-\u8bbe\u7f6e-\u9884\u89c8-\u56fe\u7247\u9884\u89c8 \u53d6\u6d88\u52fe\u9009\uff08\u5982\u4e0d\u53d6\u6d88\uff0c\u4f1a\u5f71\u54cd\u622a\u56fe\u5f55\u5c4f\u5e94\u7528\u7684\u6027\u80fd\u6570\u636e\uff09 \u79fb\u52a8\u6216\u5220\u9664\u7cfb\u7edf Logo \uff0c\u6392\u9664\u684c\u9762\u53f3\u4e0b\u89d2 Logo \u7684\u5f71\u54cd\uff08\u91cd\u542f\u751f\u6548\uff09\u3002 sudo mv /usr/share/deepin/uos_logo.svg ~/Pictures/\n \u5b89\u88c5\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\uff08\u5fc5\u987b\u5b89\u88c5\uff01\uff01\uff09 AMD \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_amd64.deb ARM \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_arm64.deb MIPS \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_mips64.deb 3A5000 \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_5000.deb \u5b89\u88c5\u547d\u4ee4 sudo dkpg -i xserver-xorg-input-libinput_0.28.2-2_amd64.deb\n \u5b89\u88c5\u65f6\u4f1a\u63d0\u793a\u5df2\u5b58\u5728\u76f8\u540c\u7248\u672c\uff0c\u8bf7\u5ffd\u7565\uff0c\u76f4\u63a5\u8986\u76d6\u5b89\u88c5\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u4e3b\u673a\u624d\u751f\u6548"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u670d\u52a1\u7aef\u4e00\u952e\u73af\u5883\u90e8\u7f72","text":"\u73af\u5883\u642d\u5efa\u524d\u5fc5\u987b\u5148\u8fde\u63a5\u4e0a USB \u4e32\u53e3\u7ebf\u548c\u91c7\u96c6\u76d2\u3002 \u5bbf\u4e3b\u673a\u73af\u5883\u5b89\u88c5 python3 manage.py install --env host\n \u5bb9\u5668\u73af\u5883\u5b89\u88c5 python3 manage.py install --env docker\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u56db\u3001\u914d\u7f6e\u9879","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u670d\u52a1\u7aef\u914d\u7f6e","text":"setting/config/server.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u914d\u7f6e\u9879\uff0c\u5305\u542b\u4e86\u6240\u6709\u670d\u52a1\u7aef\u6240\u6709\u7684\u53ef\u914d\u7f6e\u9879\u3002 \u672c\u5730\u65e0\u7f51\u7edc\u8fd0\u884c \u5c06\u914d\u7f6e\u9879 network=0 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u672c\u5730\u6709\u7f51\u7edc\u8fd0\u884c \u914d\u7f6e\u9879 network=1 (1)\u914d\u7f6e\u9879 client_alias= \u914d\u7f6e\u4e3a\u4f60\u8981\u6d4b\u8bd5\u7684\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5982 Alias1 \u6d4b\u8bd5\u673a\u522b\u540d\u5728 setting/config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 (2)\u914d\u7f6e\u9879 client_alias= \u4e3a\u7a7a\uff0c\u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager --client_alias Alias1\uff0c\u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002(Alias1 \u4e3a\u4f60\u914d\u7f6e\u7684\u6d4b\u8bd5\u673a\u522b\u540d) (1)\u548c(2)\u53ea\u8981\u4f7f\u7528\u5176\u4e00\u5373\u53ef\u3002 \u6709\u7f51\u7edc\u8fd0\u884c\uff0c\u4e14\u9700\u8981\u901a\u8fc7 Jenkins \u4e0a\u8fd0\u884c\u4e00\u4e2a job \uff0c\u540c\u65f6\u63a7\u5236\u591a\u53f0\u673a\u5668\u3002 \u914d\u7f6e\u9879 network=1 \u914d\u7f6e\u9879 client_alias= \u4e0d\u7528\u914d\u7f6e\uff0c\u5728\u8fd0\u884c run.sh \u7684\u65f6\u5019\u76f4\u63a5\u7a7a\u683c\u52a0\u522b\u540d\u5373\u53ef\uff0c\u6bd4\u5982\uff1a\u6d4b\u8bd5\u673a\u522b\u540d\u4e3a Alias1 \uff0c\u4e14\u5df2\u7ecf\u5728 config/client.ini \u4e2d\u914d\u7f6e\u4e86 Alias1 \u7684user ip password \uff0c\u5219\u8fd0\u884c bash run.sh Alias1 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u5728 Jenkins pipeline \u91cc\u9762\u901a\u8fc7\u5e76\u884c stage \u6216\u5e76\u884c\u8c03\u7528\u4e0b\u5c42\u4efb\u52a1\u7684\u65b9\u5f0f\u53ef\u4ee5\u5b9e\u73b0\u5927\u89c4\u6a21\u7684\u6027\u80fd\u6d4b\u8bd5\u9700\u6c42\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;1\u3001KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2\u3001KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f, e.g. TAGS = L1 or smoke\n[case_conf]\n# \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\uff0cocr\u6587\u6848\u8bc6\u522b\u8f83\u6162\uff0c\u4e0d\u63a8\u8350\u4f7f\u7528\nfind_by = stage\n# \u6700\u540e\u4e00\u4e2a\u7a33\u5b9a\u9636\u6bb5\u7684\u5e27\u6570\u8bc6\u522b\n# \u9996\u5e27\u5b58\u5728\u540e\u7684\u7b2c\u4e00\u4e2a\u5927\u4e8e\u8be5\u914d\u7f6e\u5e27\u6570\u7684\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u5c3e\u5e27\nfinal_stable_num=100\n# \u4ece\u8be5\u5e27\u6570\u5f00\u59cb\u8bc6\u522b\u6587\u6848\u6216\u56fe\u7247\uff0c\u51cf\u5c11\u5206\u6790\u65f6\u95f4\nstart_num = 150\n# \u8bc6\u522b\u7684\u6587\u6848\ntext=\n# \u8bc6\u522b\u56fe\u7247\nmatch=apps/xxx/images/match.png\n# \u8bc6\u522b\u76f8\u4f3c\u5ea6\nmatch_rate=0.9\n# \u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6bd4\u5982\u70ed\u542f\u52a8\u7528\u4f8b\uff0c\u4ece\u70b9\u51fb\u6253\u5f00\u5230\u505c\u6b62\u5f55\u5c4f\uff0c\u4e2d\u95f4\u7b49\u5f855\u79d2\uff1b\nduration = 15\n# \u5355\u6761\u7528\u4f8b\u6267\u884c\u7684\u6b21\u6570\ncount = 5\n# \u7a33\u5b9a\u9636\u6bb5\u5212\u5206\u7684\u76f8\u4f3c\u5ea6\nstable_similarity = 0.9997\n[server]\n# \u8c03\u8bd5\u6a21\u5f0f=1\uff0c\u4e3a\u5f00\u542f\u8c03\u8bd5\u6a21\u5f0f\uff0c0\u4e3a\u5173\u95ed\u3002\n# \u8c03\u8bd5\u6a21\u5f0f\u4e0b\u9ed8\u8ba4\u53ea\u6267\u884c\u4e00\u6b21\u7528\u4f8b\uff0c\u4e0d\u5173\u673a\n# \u7f16\u5199\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u5efa\u8bae\u5f00\u542fmaintain\u3002\nMAINTAIN = 0\n# \u8fd0\u884c\u7684\u73af\u5883docker\u5bb9\u5668\u73af\u5883\uff0chost\u5bbf\u4e3b\u673a\u73af\u5883\nENV = docker\n# \u670d\u52a1\u7aef\u5bc6\u7801\nPASSWORD=1\n# \u6307\u5b9a\u6d4b\u8bd5\u673a\u522b\u540d\n# \u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6bd4\u5982\uff1a\n# [AMD]\n# ip=10.8.15.86\n# user=uos\n# \u5176\u4e2d AMD \u4e3a\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5219client_alias=AMD\nCLIENT_ALIAS = x86\uff08Intel-i7\uff09\n# 1 \u5f00\u542f\u7f51\u7edc, 0 \u5173\u95ed\u7f51\u7edc\n# \uff081\uff09\u670d\u52a1\u7aef\u4e0e\u6d4b\u8bd5\u673a\u987b\u5728\u540c\u4e00\u7f51\u6bb5\u4e0b\uff0c\u4f60\u53ef\u4ee5\u5c1d\u8bd5\u5728\u670d\u52a1\u7aef\u901a\u8fc7ssh\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c\u5982\u679c\u53ef\u4ee5\u8fde\u63a5\uff0c\u8bf4\u660e\u7f51\u7edc\u6b63\u5e38\u3002\n# \uff082\uff09\u5f53input_type=FILE_NAME \u65f6\uff0c\u5fc5\u987b\u5f00\u542f\u7f51\u7edc\u3002\nNETWORK = 1\n# \u6027\u80fd\u7ed3\u679c\u7edf\u8ba1\u5355\u4f4d \u6beb\u79d2\u2014ms, \u79d2\u2014s\nUNIT=ms\n# \u6d4b\u8bd5\u673a\u5f00\u673a\u8fdb\u5165\u684c\u9762\u540e\u7b49\u5f85\u65f6\u95f4,\u5355\u4f4d/\u79d2\nSTARTUP_DELAY = 60\n# 1\u4e3a\u5220\u9664\u7f13\u5b58\uff0c0\u4e3a\u4e0d\u5220\u9664\u7f13\u5b58\n# \u7528\u4f8b\u6267\u884c\u5b8c\u540e\u4f1a\u5728report\u76ee\u5f55\u4e0b\u751f\u6210\u667a\u80fd\u89e3\u6790\u7684\u4e00\u4e9b\u7f13\u5b58\u56fe\u7247\u3002\nCACHE = 0\n# \u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u62a5\u544a\u4f1a\u4fdd\u5b58\u5728\u9879\u76ee\u4e0breport\u76ee\u5f55\u4e2d\uff1b\n# \u6307\u5b9a\u62a5\u544a\u76ee\u5f55\u5219\u5b58\u653e\u5230\u6307\u5b9a\u76ee\u5f55\u3002\nREPORT_PATH = report\n# \u670d\u52a1\u7aef\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684icon\u8d44\u6e90\u4f1a\u7f13\u5b58\u5728\u9879\u76ee\u4e0binput\u76ee\u5f55\u4e2d\nINPUT = input/\n# 1\u4e3a\u6d4b\u8bd5\u5b8c\u5173\u673a\uff0c0\u4e3a\u6d4b\u8bd5\u5b8c\u4e0d\u5173\u673a\nSHUTDOWN = 0\n# \u89e3\u6790\u8fdb\u7a0b\u6570\uff08\u4e0d\u63a8\u8350\u4fee\u6539\uff09\n# 3\u4e2a\u8fdb\u7a0b\u89e3\u6790\u89c6\u9891\u5df2\u7ecf\u80fd\u591f\u6ee1\u8db3\uff0c\u5373\u4f7f\u589e\u52a0\u8fdb\u7a0b\u6570\u4e5f\u4e0d\u80fd\u51cf\u5c11\u6574\u4f53\u8017\u65f6\n# \u53e6\u5916\u8fd8\u8981\u770bCPU\u6838\u6570\u662f\u5426\u652f\u6301\u3002\nPARSING_PROCESS = 3\n# 1\u4e3a\u4f7f\u7528\u7ee7\u7535\u5668\u5f00\u5173\u673a\uff0c0\u4e3a\u4f7f\u7528reboot\u547d\u4ee4\u91cd\u542f\u3002\u4f9d\u8d56\u7ee7\u7535\u5668\u786c\u4ef6\u8bbe\u5907\uff0c\u9700\u8981\u4f7f\u7528\u8054\u7cfb\u5f00\u53d1\u8005\nRELAY = 0\n# \u83b7\u53d6\u6d4b\u8bd5\u5e94\u7528\u7684\u7248\u672c, %s \u5360\u4f4d\u5e94\u7528\u540d\n# \u5982\u679c\u8be5\u914d\u7f6e\u4e3a\u7a7a\uff0c\u5219\u4e0d\u83b7\u53d6\u5e94\u7528\u7684\u7248\u672c\u4fe1\u606f\u3002\nCOMMAND = apt policy %s 2>/dev/null|grep \"\u5df2\u5b89\u88c5\"|awk -F \"\uff1a\" \"{print \\$2}\"\n# \u5173\u673a\u7b49\u5f85\u5f00\u542f\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6839\u636e\u6d4b\u8bd5\u673a\u6027\u80fd\u4e0d\u540c\uff0c\u5f00\u5173\u673a\u8017\u65f6\u53ef\u80fd\u4e0d\u540c\uff0c\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u673a\u60c5\u51b5\u914d\u7f6e\u3002\nSHUTDOWN_DELAY = 30\n# \u53ef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u56fe\u7247\u683c\u5f0f\uff0c\u4ee5\u82f1\u6587\u9017\u53f7\u9694\u5f00\u3002\n# \u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u76ee\u524d\u6211\u4eec\u4ec5\u9a8c\u8bc1\u4e86jpg,jpeg,png\u8fd9\u4e09\u79cd\u5e38\u7528\u7684\u56fe\u7247\u683c\u5f0f\u3002\nINPUT_TYPES = jpg,jpeg,png\n# \u6027\u80fd\u5206\u6790\u8865\u5e27\uff0c\u7b49\u4e8e\u6216\u4f4e\u4e8e\u8be5\u503c\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u9700\u8981\u51cf\u6389\u3002\nUN_STAB_START = 3\n# \u670d\u52a1\u7aef\u83b7\u53d6\u6d4b\u8bd5\u673a\u56fe\u50cf\u7684\u5e27\u7387\uff0c\u5373\u6bcf\u79d2\u83b7\u53d6\u591a\u5c11\u5f20\u6d4b\u8bd5\u673a\u4e0a\u7684\u56fe\u50cf\u3002\n# \u9ed8\u8ba4\u5e27\u7387\u4e3a30\u5e27/\u79d2\uff0c\u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u53ef\u80fd\u4f1a\u5bf9\u89e3\u6790\u7ed3\u679c\u9020\u6210\u504f\u5dee\u3002\nFPS = 30\n# \u4ee5\u4e0b\u573a\u666f\u7c7b\u578b\u4f1a\u91cd\u542f\u6d4b\u8bd5\u673a,\u591a\u79cd\u573a\u666f\u4f7f\u7528\u9017\u53f7\u9694\u5f00\nSCENE = cold\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = http://10.8.13.78:8890\n#\u5c4f\u5e55\u56fe\u7247\u4e34\u65f6\u5b58\u653e\u4f4d\u7f6e\nSCREEN_CACHE = /tmp/screen\n# =======================================\n[log]\n# \u65e5\u5fd7\u7ea7\u522b\uff0cOFF\u3001FATAL\u3001ERROR\u3001WARN\u3001INFO\u3001DEBUG\u3001ALL\n# \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u65e5\u5fd7\u8f93\u51fa\uff0clog_cli=INFO\u8868\u793a \u4ec5\u8f93\u51faINFO\u53ca\u4ee5\u4e0a\u7ea7\u522b\u7684\u65e5\u5fd7\u3002\nLOG_LEVEL = DEBUG\n# \u65e5\u5fd7\u6587\u4ef6\u4fdd\u5b58\u8def\u5f84\nLOG_PATH= logs\n# =======================================\n[dockerhub]\n# \u5bb9\u5668\u767b\u9646\u8d26\u53f7\nDOCKER_USER = user\n# \u5bb9\u5668\u767b\u9646\u5bc6\u7801\nDOCKER_PASSWORD = User1234\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u6d4b\u8bd5\u673a\u914d\u7f6e","text":"setting/config/client.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u4fe1\u606f\u3002 \u6709\u7f51\u7edc\u7684\u60c5\u51b5\u4e0b\uff0c\u670d\u52a1\u7aef\u9700\u8981\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u56e0\u6b64\u4f60\u9700\u8981\u5199\u5165 \u6d4b\u8bd5\u673a\u522b\u540d \u3001 user \u3001ip\u3001 password \u3002 # \u6d4b\u8bd5\u673a\u522b\u540d\n[Alias1] # \u6d4b\u8bd5\u673aip\nip=10.8.15.86 # \u6d4b\u8bd5\u673a\u7528\u6237\u540d\nuser=uos\n \u547d\u540d\u5efa\u8bae\uff1aAliasA1\u3001AliasA2\u3001AliasB1\u3001AliasB2\uff0c\u4e0d\u8981\u91cd\u540d\u3002 \u65e0\u7f51\u7edc\u60c5\u51b5\u4e0b\uff0c\u4ec5\u9700\u8981\u5173\u6ce8\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\u9879 width=\u3001 height= \u5373\u53ef\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a [client]\n# \u9ed8\u8ba4\u6d4b\u8bd5\u673a\u7528\u6237\u540d\uff0c\u5bc6\u7801\uff0cip\nip=\nuser=\n# \u6d4b\u8bd5\u673a\u5bc6\u7801\npassword=1\n# \u6d4b\u8bd5\u673a\u4e3b\u9898\ntheme=bloom\n# \u6d4b\u8bd5\u673aicon\u76ee\u5f55\npath=/usr/share/icons\n# \u7cfb\u7edfdesktop\u6587\u4ef6\u7684\u5b58\u653e\u76ee\u5f55\uff0cUOS\u7cfb\u7edf\u9ed8\u8ba4\u4e3a/usr/share/applications\ndesktop_path=/usr/share/applications\n# \u7528\u4e8e\u5224\u65ad\u6d4b\u8bd5\u673a\u662f\u5426\u5f00\u673a\u8fdb\u5165\u684c\u9762\u7684\u8bc6\u522b\u6807\u8bc6\u3002\n# 1\u3001\u901a\u8fc7\u684c\u9762\u56fe\u6807\u8bc6\u522b\u3002\n# - type=FILE_NAME\u65f6\uff0c\u670d\u52a1\u5668\u548c\u6d4b\u8bd5\u673a\u5fc5\u987b\u5728\u540c\u4e00\u5c40\u57df\u7f51\u5185\u3002\n# - power_on=dde-computer\u8868\u793a\u901a\u8fc7\u684c\u9762\u8ba1\u7b97\u673a\u56fe\u6807\u5224\u65ad\u5f00\u673a\u8fdb\u5165\u684c\u9762\u3002\n# 2\u3001\u901a\u8fc7\u672c\u5730\u56fe\u7247\u4f5c\u4e3a\u5f00\u673a\u8bc6\u522b\u3002\n# - type= \u4f20\u5165\u4e3a\u56fe\u7247\u683c\u5f0f\uff0ctype\u652f\u6301\u7684\u7c7b\u578b\u5305\u542b\u5728server.ini\u5185\u914d\u7f6e\u9879input_type=jpg,jpeg,png\u3002\n# - power_on= \u4f20\u5165\u7684\u662f\u672c\u5730\u56fe\u7247\u7684\u8def\u5f84\u3002\ntype=FILE_NAME\npower_on=dde-computer\n# \u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\uff08\u6d4b\u8bd5\u673a\u8fde\u63a5\u91c7\u96c6\u76d2\uff0c\u91c7\u96c6\u76d2\u7684\u5206\u8fa8\u7387\uff09\nheight=1080\nwidth=1920\n[AliasA1] ip=10.8.15.86\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n[AliasA2]\nip=10.8.15.20\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_2","title":"3\u3001\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e","text":"\u968f\u7740\u6d4b\u8bd5\u573a\u666f\u7684\u4e0d\u65ad\u5f15\u5165\uff0c\u53d1\u73b0\u73b0\u6709\u670d\u52a1\u7aef\u91cc\u7684\u914d\u7f6e\u9879\u5e76\u4e0d\u9002\u7528\u4e8e\u6240\u6709\u7684\u6027\u80fd\u573a\u666f\uff0c\u4e8e\u662f\u5c06\u670d\u52a1\u7aef\u914d\u7f6e\u8fdb\u884c\u4e00\u4e2a\u63d0\u53d6\uff0c\u53ef\u505a\u5355\u4e2a\u573a\u666f\u7684\u4e2a\u6027\u5316\u914d\u7f6e\uff0c\u5f53\u7136\u539f\u6765\u7684\u670d\u52a1\u7aef\u914d\u7f6e\u529f\u80fd\u4fdd\u7559\uff0c\u53ea\u662f\u5f53\u4f60\u914d\u7f6e\u4e86\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e\u540e\uff0c\u4f18\u5148\u4f7f\u7528\u4e2a\u6027\u5316\u914d\u7f6e\u91cc\u9762\u7684\u5185\u5bb9\uff0c\u4ee5\u4e0b\u662f\u5bf9\u4e2a\u6027\u5316\u914d\u7f6e\u7684\u4ecb\u7ecd\u3002 \u76ee\u524d\u6bcf\u4e00\u4e2a py \u6587\u4ef6\u5bf9\u5e94\u4e00\u4e2a\u6027\u80fd\u6d4b\u8bd5\u573a\u666f\uff0c\u4e8e\u662f\u5728\u540c\u7ea7\u76ee\u5f55\u4e0b\u521b\u5efa\u4e00\u4e2a\u4e0e\u4e4b\u540c\u540d\u7684 json \u6587\u4ef6\uff0c\u4f5c\u4e3a\u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6 apps\n\u251c\u2500\u2500 album\n \u251c\u2500\u2500 test_album_01_start.json # \u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6\n\u2514\u2500\u2500 test_album_01_start.py # \u6027\u80fd\u573a\u666f\u6587\u4ef6\n \u4ee5\u4e0b\u662f\u5bf9 json \u6587\u4ef6\u4e2d\u914d\u7f6e\u7684\u89e3\u91ca\uff0c\u82e5\u67d0\u9879\u914d\u7f6e\u4e0d\u9700\u8981\uff0c\u53ef\u4ee5\u7f3a\u5931\uff0c\u4f46\u4e0d\u80fd\u4e3a\u7a7a\uff1b {\n\"title\": \"test_album_start\", # \u6807\u9898\uff1b\u5fc5\u987b\n\"app_name\": \"deepin-album\", # \u573a\u666f\u6240\u5c5e\u7684\u5e94\u7528\uff1b\u5fc5\u987b\n\"scene\": \"hot\", # \u573a\u666f\u522b\u540d\uff1b\u5fc5\u987b\n\"icon\": [\"deepin-album\"], # \u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684icon\u5230\u670d\u52a1\u7aef\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\uff1b\u53ef\u7f3a\u5931\n# \u6ce8\u610f\uff1a\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684desktop\u6587\u4ef6\u540d\u4e3adeepin-album.desktop\uff0c\n# \u53ea\u9700\u8981\u5199deepin-album\u5373\u53ef\uff0c\u201c.desktop\u201d\u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002\n\"size\": { # \u56fe\u7247\u5bf9\u6bd4\u7684\u533a\u57df\u8bbe\u7f6e\u9879\uff0c\u67d0\u4e9b\u5e94\u7528\u5f53\u524d\u5c4f\u5e55\u7684\u90e8\u5206\u533a\u57df\u9700\u8981\u5c06\u5176\u53bb\u6389\uff0c\u53ef\u4ee5\u8bbe\u7f6e\u6b64\u9879\uff0c\u5982\u679c\u6ca1\u6709\u5219\u53ef\u4e0d\u5199\uff1b\u53ef\u786e\u5b9e\n\"x-coordinate\": 0, # \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n\"y-coordinate\": 0, # \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n\"width\": 850, # \u6a2a\u5411\u957f\u5ea6\n\"height\": 1920 # \u7eb5\u5411\u9ad8\u5ea6\n},\n\"count\": 5, # \u573a\u666f\u6267\u884c\u7684\u6b21\u6570\uff1b\u5fc5\u987b\n\"duration\": 5, # \u8be5\u6761\u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff0c\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7279\u5b9a\u573a\u666f\uff0c\u8be5\u914d\u7f6e\u4e3a\u53ef\u9009\u9879\uff0c\u8986\u76d6 server.ini \u4e2d\u7684\u914d\u7f6e\uff1b\u53ef\u7f3a\u5931\n\"stable_similarity\": 0.9997, # \u6027\u80fd\u573a\u666f\u5206\u9636\u6bb5\u65f6\u7684\u56fe\u7247\u76f8\u4f3c\u5ea6\u5bf9\u6bd4\uff0c\u524d\u540e\u56fe\u7247\u4f4e\u4e8e\u8be5\u503c\uff0c\u5219\u5206\u4e3a\u4e0d\u7a33\u5b9a\u9636\u6bb5\uff1b\u53ef\u7f3a\u5931\n\"find_by\": \"stage\", # \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\n\"final_stable_num\": 100, # \u67e5\u627e\u6700\u540e\u4e00\u4e2a\u5927\u4e8e\u8be5\u503c\u7684\u7a33\u5b9a\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u7684\u5c3e\u796f\uff1b\u53ef\u7f3a\u5931\n\"start_num\": 150,\n\"text\": \"\", # ocr\u8bc6\u522b\u7684\u6587\u6848\n\"match\": \"apps/xxx/images/match.png\", # \u56fe\u50cf\u5339\u914d\u7684\u56fe\u7247\u6587\u4ef6\u8def\u5f84\n\"match_rate\": 0.9 # \u5339\u914d\u76f8\u4f3c\u5ea6\n}\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e94\u3001\u6d4b\u8bd5\u6d41\u7a0b","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516d\u3001\u7528\u4f8b\u7f16\u5199\u53ca\u65b9\u6cd5\u53c2\u6570\u6307\u5f15","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"1\u3001\u7528\u4f8b\u5b9e\u4f8b\u8bf4\u660e","text":"# \u6807\u51c6\u5e93\u5bfc\u5165\nfrom time import sleep\n# \u5bfc\u5165\u4e09\u65b9\u5e93pytest\nimport pytest\n# \u5bfc\u5165\u7528\u4f8b\u6267\u884c\u8981\u7528\u5230\u7684Widget\u7c7b\nfrom src.base_widget import BaseWidget\nclass TestStart:\n# class\u7ea7\u522b\u7684fixture\uff0c\u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u6267\u884c\u3002autouse=True \u81ea\u52a8\u5728\u5f53\u524d\u4f5c\u7528\u57df\u4e0b\u4f7f\u7528\u3002\n@pytest.fixture(scope=\"class\", autouse=True)\n# \u6d4b\u8bd5\u70ed\u542f\u52a8\u4e4b\u524d\u9700\u8981\u9884\u542f\u52a8\u3002\ndef application_pre_start(self):\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().right_click_element(\"deepin-album\")\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().click_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\")\nsleep(2)\n# \u5feb\u6377\u952e\u5173\u95ed\u7a97\u53e3\nBaseWidget().hot_key(\"alt\", \"f4\")\nsleep(2)\n# \u9ed8\u8ba4\u4e3afunction\u7ea7\u522b\u7684fixture\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\uff0cclass\u7ea7\u522bfixture\u6267\u884c\u4e4b\u540e\u6267\u884c\u3002\n@pytest.fixture(autouse=True)\ndef setup_start(self):\n# \u53f3\u952e\u70b9\u51fb deepin-album \u56fe\u6807\nBaseWidget().right_click_element(\"deepin-album\")\n# \u79fb\u52a8\u5230\u53f3\u952e\u83dc\u5355\u4e2d\u6253\u5f00\uff08open.png\uff09\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().move_to(*BaseWidget().find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))\n# \u7b49\u5f85\u79fb\u52a8\u5b8c\u6210\nsleep(0.5)\ndef test_album_start(self):\n# \u70b9\u51fb\u201c\u6253\u5f00\u201d\nBaseWidget().click() \n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"2\u3001\u65b9\u6cd5\u53c2\u6570\u8bf4\u660e","text":"2.1\u3001find_element \u65b9\u6cd5 def find_element(element: str, input_type: str = \"FILE_NAME\", fill_color_position: tuple = (-1, -1), size: tuple = (25, 70)):\npass\n \u53c2\u6570 element \u548c input_type \uff081\uff09\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u5143\u7d20 - `input_type` \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a `FIEL_NAME` \uff0c\u8868\u793a\u901a\u8fc7\u5e94\u7528 `icon` \u5bfb\u627e\u5143\u7d20\uff0c\u6b64\u65b9\u6cd5\u4f1a\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u5e94\u7528 `icon` \u56fe\u6807\u3002\n \u4e3e\u4f8b\uff1a\u9ed8\u8ba4\u60c5\u51b5\u4e0b input_type \u53c2\u6570\u4e0d\u9700\u8981\u4f20\u5165\uff0c find_element(\"deepin-album\")\uff0c\u8868\u793a\u901a\u8fc7 deepin-album \u7684\u5e94\u7528 icon \u6765\u83b7\u53d6\u5750\u6807\uff0c\u6ce8\u610f\uff0c\u6b64\u65f6\u4f20\u5165\u7684 deepin-album \u53c2\u6570\u5b9e\u9645\u662f desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u548c2.3\u4e2d\u7684 icon \u53d8\u91cf\u4e00\u81f4\u3002 \u6211\u4eec\u5efa\u8bae\u4f18\u5148\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\uff0c\u4f46\u6b64\u65b9\u6cd5\u4f9d\u8d56\u7f51\u7edc\uff0c\u8bf7\u6839\u636e\u6d4b\u8bd5\u73af\u5883\u5b9e\u9645\u60c5\u51b5\u9009\u62e9\u3002 \uff082\uff09\u901a\u8fc7\u672c\u5730\u56fe\u7247\u8bc6\u522b\u5143\u7d20 - \u53c2\u6570 `input_type` \u4f20\u5165\u56fe\u7247\u683c\u5f0f\uff0c\u6bd4\u5982\u622a\u53d6\u7684\u672c\u5730\u56fe\u7247\u683c\u5f0f\u4e3a `png`\uff0c\u90a3\u4e48 `input_type=\"png\"`\uff0c\u6b64\u65f6\u53c2\u6570 `element ` \u4f20\u5165\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5efa\u8bae\u5b58\u653e\u5728\u5bf9\u5e94\u7684\u4ea7\u54c1 `apps/app/picture/` \u76ee\u5f55\u4e0b\uff0c\u8def\u5f84\u4e3a\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u7684\u76f8\u5bf9\u8def\u5f84\u3002\n- \u4e3e\u4f8b\uff1a`find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))`\uff0c\u8868\u793a\u901a\u8fc7\u672c\u5730\u56fe\u7247 `open.png` \u8bc6\u522b\u5143\u7d20\u3002\n \u53c2\u6570 fill_color_position fill_color_position \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (-1, -1)\uff0c(-1, -1) \u8868\u793a\u53d6\u5c4f\u5e55\u4e2d\u53f3\u4e0b\u89d2\u6700\u540e\u4e00\u4e2a\u50cf\u7d20\u70b9\u4f5c\u4e3a\u586b\u5145\u5750\u6807\uff0c\u5728 1920x1080 \u5c4f\u5e55\u5206\u8fa8\u7387\u4e0b\u5373\u5b9e\u9645\u5750\u6807\u4e3a (1919, 1079) \uff0c\u8fd9\u6837\u7684\u5199\u6cd5\u53ef\u4ee5\u9002\u914d\u4e0d\u540c\u5927\u5c0f\u7684\u5c4f\u5e55\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0d\u540c\u65b9\u4f4d\uff1a \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0b\u65b9\uff0c\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u4e0d\u9700\u8981\u4f20\u5165\u8be5\u53c2\u6570\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u5de6\u8fb9\uff0cfill_color_position=(1, 1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u53f3\u8fb9\uff0cfill_color_position=(-1, -1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0a\u8fb9\uff0cfill_color_position=(1, 1) \u4ece\u684c\u9762\u542f\u52a8\u5e94\u7528\uff0c\u5219\u9700\u8981\u4f20\u5165\u9664\u4efb\u52a1\u680f\u4ee5\u5916\u5176\u4ed6\u4f4d\u7f6e\u7684\u5750\u6807\uff0c\u6bd4\u5982(100, 100)\uff0c\u53ea\u8981\u8fd9\u4e2a\u5750\u6807\u4e3a\u9664\u5e94\u7528\u548c\u4efb\u52a1\u680f\u533a\u57df\u90fd\u53ef\u4ee5\u3002 \u4ece\u542f\u52a8\u5668\u91cc\u9762\u542f\u52a8\u5e94\u7528\uff0c\u9700\u8981\u586b\u5145\u7684\u5750\u6807\u4e3a\u542f\u52a8\u5668\u533a\u57df\u3002 \u6ce8\uff1a\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u65f6\uff0c\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684 icon \u539f\u6587\u4ef6\u4e3a svg \u77e2\u91cf\u56fe\uff0c\u8f6c\u6362\u4e3a png \u4e4b\u540e\u9700\u8981\u586b\u5145\u8fb9\u7f18\u900f\u660e\u90e8\u5206\u3002 \u53c2\u6570 size size \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (25, 70)\uff0c\u8868\u793a\u6d4b\u8bd5\u673a\u4e0a dock \u680f\u4e0a\u5e94\u7528\u56fe\u6807\u7684\u5927\u5c0f\u8303\u56f4\u3002 UOS \u7cfb\u7edf dock \u680f\u662f\u53ef\u4ee5\u4e0a\u4e0b\u62d6\u52a8\u5927\u5c0f\u7684\uff0c\u968f\u7740 dock \u680f\u5927\u5c0f\u6539\u53d8\uff0c\u5e94\u7528\u56fe\u6807\u7684\u8303\u56f4\u4e3a25\u523070\u4e4b\u95f4\u3002 \u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u64cd\u4f5c\u7cfb\u7edf\u4e0a dock \u680f\u5927\u5c0f\u4e0d\u4e00\u6837\uff0c\u53ef\u4ee5\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u4f20\u5165\u5927\u5c0f\u8303\u56f4\u3002 2.2\u3001click_element\u3001 right_click_element\uff0c double_click_element \u8fd9\u51e0\u4e2a\u65b9\u6cd5\u53c2\u6570\u89c4\u5219\u4e0e find_element \u65b9\u6cd5\u4e00\u6837\u3002\u4ed6\u4eec\u5b9e\u9645\u4e0a\u662f\u5728 find_element \u65b9\u6cd5\u57fa\u7840\u4e4b\u4e0a\u505a\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u589e\u52a0\u4e86\u9f20\u6807\u7684\u52a8\u4f5c\uff0c\u5982\u679c\u4f60\u4e0d\u60f3\u4f7f\u7528\u8fd9\u51e0\u4e2a\u65b9\u6cd5\uff0c\u5728\u7528\u4f8b\u4e2d\u4e5f\u53ef\u4ee5\u901a\u8fc7 find_element \u83b7\u53d6\u5230\u5750\u6807\uff0c\u7136\u540e\u5c06\u5750\u6807\u4f20\u5165\u5230\u952e\u9f20\u7684\u65b9\u6cd5\u4e2d\uff0c\u53ef\u4ee5\u5b9e\u73b0\u540c\u6837\u7684\u6548\u679c\u3002 2.3\u3001\u7528\u4f8b\u7c7b\u4e2d\u6709\u4e2a\u7c7b\u53d8\u91cf icon = [\"deepin-album\"] \u9700\u8981\u7279\u6b8a\u8bf4\u660e\uff0c\u5217\u8868\u4e2d\u7684\u5143\u7d20\u4e3a\u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709 icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684 icon \u5230\u670d\u52a1\u7aef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528 desktop \u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684 desktop \u6587\u4ef6\u540d\u4e3a deepin-album.desktop\uff0c\u53ea\u9700\u8981\u5199 deepin-album \u5373\u53ef\uff0c.desktop \u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e03\u3001\u6267\u884c\u5165\u53e3","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"1\u3001\u7528\u4f8b\u7ec4\u7ec7","text":"\u5728 setting/config/server.ini \u6587\u4ef6\u4e2d APP_NAME= \u5b57\u6bb5\u4e3a\u7528\u4f8b\u7684\u6267\u884c\u7684\u76ee\u5f55\uff0c\u9ed8\u8ba4\u4e3a apps \u76ee\u5f55\u4e0b\u6240\u6709\u7528\u4f8b\u3002\u5982\u679c\u4f60\u60f3\u6307\u5b9a\u6267\u884c\u67d0\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4f60\u53ef\u4ee5\u5c06\u8be5\u914d\u7f6e\u9879\u6307\u5b9a\u5230\u5e94\u7528\u7684\u7528\u4f8b\u76ee\u5f55\uff0c\u6bd4\u5982\uff1aAPP_NAME=deepin_album\uff0c \u8868\u793a\u6267\u884c\u76f8\u518c\u76ee\u5f55\u4e0b\u7684\u7528\u4f8b\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a python3 manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music\n -k KEYWORDS, --keywords KEYWORDS\n \u7528\u4f8b\u7684\u5173\u952e\u8bcd\n -t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e\n --log_level LOG_LEVEL \u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n --env {host,docker} \u5728\u5bbf\u4e3b\u673a\u6216\u5bb9\u5668\u73af\u5883\u6267\u884c\n --client_alias \u9009\u62e9\u6d4b\u8bd5\u673a\u522b\u540d, \u53ef\u9009\u9879\u4e3aclient.ini\u4e2d\u5df2\u914d\u7f6e, \u9ed8\u8ba4\u503c\u4e3a zx-x86.\n --count \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a python3 manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\" --env docker\n \u6ce8\uff1a\u5728\u5bb9\u5668\u4e2d\u6267\u884c\u65f6\uff0c\u82e5\u5f3a\u5236\u9000\u51fa\uff0c\u5bb9\u5668\u5e76\u4e0d\u4f1a\u505c\u6b62\u8fd0\u884c\uff01"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_9","title":"\u516b\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1json","title":"1\u3001Json \u62a5\u544a","text":"\u81ea\u7814\u89c6\u9891\u89e3\u6790\u5de5\u5177\u4f1a\u5bf9\u5355\u6761\u7528\u4f8b\u6267\u884c\u4e00\u8f6e\u751f\u6210\u4e00\u4e2a json \u6587\u4ef6\uff0c\u5b58\u653e\u4e8e report/{app_name}/{scene}/{run_num} \u76ee\u5f55\u4e0b\uff0c\u547d\u540d\u683c\u5f0f\u4e3a\uff1a report.json json \u5185\u5bb9\u4e3e\u4f8b\uff1a [\n{\n\"Stab1\": {\n\"images\": [1,2...150,151],\n\"startStub\": 0,\n\"type\": \"Stab\"\n}\n},\n{\n\"Stab2\": {\n\"images\": [152,153...169,170],\n\"startStub\": 1,\n\"type\": \"UnStab\"\n}\n},\n{\n\"Stab3\": {\n\"images\": [171,172...300,301],\n\"startStub\": 0,\n\"type\": \"UnStab\"\n}\n}\n]\n \u8bf4\u660e\uff1a Stab \uff1a\u8868\u793a\u89e3\u6790\u8fc7\u7a0b\u4e2d\u4e0d\u540c\u7684\u9636\u6bb5\u3002 images \uff1a\u8868\u793a\u6bcf\u4e00\u5e27\u7684\u56fe\u7247\u5e8f\u53f7\u3002 startStub\uff1a \u4e3a\u8bc6\u522b\u5c3e\u5e27\u7684\u9636\u6bb5\u8868\u793a\uff0c\u5982\u679c \"startStub\": 1 \uff0c\u8bf4\u660e\u5c3e\u5e27\u51fa\u73b0\u5728\u8be5\u9636\u6bb5\u3002 type\uff1a \u4e3a Stab \u6216 UnStab \uff0c\u8868\u793a\u7a33\u5b9a\u9636\u6bb5\u6216\u4e0d\u7a33\u5b9a\u9636\u6bb5\u3002 \u5404\u9636\u6bb5\u6709\u5e27\u6570\u8865\u507f\uff0c\u9ed8\u8ba4\u8865\u507f\u7684\u5e27\u6570\u4e3a 3 \u5e27\uff08\u53ef\u4ee5\u901a\u8fc7 server.ini \u91cc\u9762 un_stab_start=3 \u8fdb\u884c\u914d\u7f6e\uff09\uff0c\u8868\u793a\u5c0f\u4e8e\u7b49\u4e8e 3 \u5e27\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u524d\u540e\u5747\u9700\u8981\u51cf\u6389\u3002 \u5e94\u7528\u542f\u52a8\u9636\u6bb5\u5c31\u662f\u5728 Stab2 \u9636\u6bb5\uff0c\u542f\u52a8\u65f6\u95f4\u4e3a\uff1a171 \u51cf 151 \u518d\u51cf\u6389\u524d\u540e\u8865\u507f\u5e27\u6570 6 \u5e27\uff0c\u5373 14 \u5e27\uff0c\u89c6\u9891\u5e27\u7387 30 \u5e27/\u79d2\uff0c\u56e0\u6b64\u542f\u52a8\u8017\u65f6\u4e3a\uff1a14 * 33 = 462 ms"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2excel","title":"2\u3001Excel \u62a5\u544a","text":"\u6240\u6709\u7528\u4f8b\u6267\u884c\u5e76\u89e3\u6790\u5b8c\u4e4b\u540e\u4f1a report \u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a\u6c47\u603b\u6570\u636e\u7684 Excel \u6587\u4ef6\uff0c\u6587\u4ef6\u540d\u4e3a\uff1a{time}_perf_time.xlsx\u3002 \u6ce8\u610f\uff0creport \u76ee\u5f55\u4e3a\u53ef\u914d\u7f6e\u9879\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u4f1a\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u751f\u6210\uff0c\u5982\u679c\u4f60\u5c06 report\uff0c\u6307\u5b9a\u5230\u9879\u76ee\u4e0b\u5176\u4ed6\u8def\u5f84\uff0c\u5219\u4f1a\u5728\u5bf9\u5e94\u7684\u8def\u5f84\u4e0b\u751f\u6210 json \u548c Excel \u6587\u4ef6\u3002 \u4f60\u4e5f\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8bfb\u53d6\u6240\u6709 json / excel \u62a5\u544a\u7684\u6570\u636e\uff0c\u751f\u6210\u4f60\u81ea\u5df1\u60f3\u8981\u7684\u4e00\u4e9b\u6d4b\u8bd5\u62a5\u544a\u5f62\u5f0f\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#usb","title":"\u4e5d\u3001USB \u4e32\u53e3\u9a71\u52a8\u952e\u9f20\u65b9\u6cd5","text":"\u4f4d\u4e8e src/utils/control/serial_communication \u76ee\u5f55\u4e0b\u7684 usb_mk.py \u6587\u4ef6 usb_mk = UsbMk()\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up()\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u652f\u6301\u4f20\u5165\u6c49\u5b57\uff0c\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click()\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() \n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() \n \uff084\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() \n \uff085\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() \n \uff086\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() \n \uff087\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff088\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff0810\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_10","title":"\u5341\u3001\u7ee7\u7535\u5668\u63a7\u5236\u4e3b\u673a\u5f00\u673a/\u91cd\u542f","text":"\uff08\u82e5\u4e0d\u4f7f\u7528\u7ee7\u7535\u5668\uff0c\u53ef\u5ffd\u7565\u8be5\u6b65\u9aa4\uff0c\u6267\u884c\u65f6\u4f1a\u901a\u8fc7\u547d\u4ee4 reboot\uff09"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u7ee7\u7535\u5668\u8bbe\u5907","text":"LCUS-2 \u578b \u53cc\u8def USB \u667a\u80fd\u4e32\u53e3\u63a7\u5236\u7ee7\u7535\u5668\u3002 https://item.taobao.com/item.htm?spm=a1z09.2.0.0.41d72e8dUYx2pi&id=582653718178&_u=i25r20ia6a2e "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2usb","title":"2\u3001USB \u5ef6\u957f\u7ebf","text":"\u666e\u901a\u7684 USB \u7ebf\u5373\u53ef\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_3","title":"3\u3001\u675c\u90a6\u7ebf","text":"3.1\u300140P \u6bcd\u5bf9\u516c\u675c\u90a6\u7ebf\u3002 3.2\u3001\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"4\u3001\u5b89\u88c5\u56fe\u6587\u6559\u7a0b","text":"4.1\u3001\u4f7f\u7528 USB \u5ef6\u957f\u7ebf\u8fde\u63a5\u63a7\u5236\u7aef\u548c\u7ee7\u7535\u5668\u3002 4.2\u3001\u5728\u7ee7\u7535\u5668\u5e38\u7aef\u548c\u516c\u5171\u7aef\u5747\u8fde\u63a5\u4e00\u6839\u675c\u90a6\u7ebf\u3002 4.3\u3001\u5728\u4e3b\u677f\u4e0a\u5f00\u673a\u9488\u548c\u91cd\u542f\u9488\u4e0a\u63d2\u4e0a\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 4.4\u3001\u5c06\u5f00\u673a\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76841\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1\u5de6\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 4.5\u3001\u5c06\u91cd\u542f\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76842\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1 \u53f3\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 \u82e5\u60f3\u4fdd\u7559\u539f\u7535\u6e90\u5f00\u5173\u7684\u7535\u6e90\u706f\uff0c\u53ef\u6839\u636e\u5982\u4e0a\u56fe\u6240\u793a\uff0c\u4f7f\u7528\u675c\u90a6\u7ebf\u8fde\u63a5\u4e3b\u677f\u4e0a\u7684\u7535\u6e90\u706f\u548c\u539f\u7535\u6e90\u5f00\u5173"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_11","title":"\u5341\u4e00\u3001\u5e38\u89c1\u95ee\u9898\u8bf4\u660e","text":"1\u3001ERROR: for uos Cannot restart container 2301b1a1395d7959ee6523d61b61c87084649af530786cdb8fb5b3ecbcbd1068: linux runtime spec devices: error gathering device information while adding custom device \"/dev/ttyACM0\": no such file or directory \u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u8fde\u63a5\u72b6\u6001\uff0c\u67e5\u770b /dev/ttyACM0 \u662f\u5426\u5b58\u5728\uff0c\u82e5\u5b58\u5728 /dev/ttyACMn\uff08n\u4e3a\u4efb\u610f\u6570\u5b57\uff09\uff0c\u91cd\u542f\u7535\u8111\u89e3\u51b3\u3002 2\u3001Error response from daemon: Container 5e700fdc769e8c74666d68a7f2bc3de58268b4594cf88706609d59f8dbc7362d is not running \u5bb9\u5668\u542f\u52a8\u5931\u8d25 1\uff09\u68c0\u67e5\u54ea\u4e00\u4e2a\u5bb9\u5668\u672a\u542f\u52a8 sudo docker container ls # \u5217\u51fa\u8fd0\u884c\u4e2d\u7684 Docker \u5bb9\u5668\n 2\uff09\u7f3a\u5c11 uos \u5bb9\u5668\uff0c\u68c0\u67e5 USB \u4e32\u53e3\u8fde\u63a5\u7ebf\u548c\u91c7\u96c6\u76d2\u8fde\u63a5\u7ebf\u662f\u5426\u6b63\u5e38\uff0c\u91cd\u542f\u540e\u6267\u884c bash install/setup.up # \u91cd\u65b0\u5b8c\u6574\u90e8\u7f72\u73af\u5883\n \u6216\u6267\u884c sudo docker-compose up -d --build # \u4ec5\u91cd\u65b0\u6784\u5efa Docker \u955c\u50cf\n 3\u3001\u82e5\u90e8\u7f72\u65f6\u63d0\u793a\u6302\u8f7d ttyACM0\u3001video0 \u5931\u8d25\uff0c\u8bf7\u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u53ca\u91c7\u96c6\u76d2\u662f\u5426\u63a5\u89e6\u826f\u597d\uff0c\u82e5\u63a5\u89e6\u826f\u597d\uff0c\u91cd\u542f\u5373\u53ef\u89e3\u51b3\u3002 4\u3001\u82e5\u51fa\u73b0\u56fe\u7247\u80fd\u8bc6\u522b\uff0c\u4f46\u662f\u9f20\u6807\u672a\u79fb\u52a8\u64cd\u4f5c\u65f6\uff0c\u5b89\u88c5\u7edd\u5bf9\u9f20\u6807\u64cd\u4f5c\u7684\u4f9d\u8d56\u5305\uff0c\u89c1\u7b2c\u4e09\u8282\u7b2c\u4e8c\u5c0f\u8282\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u6d4b\u8bd5\u673a\u3002 5\u3001\u7531\u4e8e\u901a\u8fc7\u91c7\u96c6\u5361\u83b7\u53d6\u7684\u6d4b\u8bd5\u673a\u5b9e\u65f6\u753b\u9762\uff0c\u5305\u542b\u4e86\u9f20\u6807\u7684\u6837\u5f0f\uff0c\u6240\u4ee5\u5bf9\u56fe\u7247\u8bc6\u522b\u65f6\uff0c\u9f20\u6807\u82e5\u505c\u7559\u5728\u56fe\u6807\u4e0a\u5c42\uff0c\u5219\u4f1a\u5bf9\u8bc6\u522b\u7ed3\u679c\u9020\u6210\u5f71\u54cd\uff0c\u9700\u8981\u5c06\u9f20\u6807\u79fb\u52a8\u81f3\u5176\u4ed6\u4f4d\u7f6e\uff0c\u6216\u8005\u9690\u85cf\u9f20\u6807\u89e3\u51b3\u3002 6\u3001Excel \u62a5\u544a\u4e2d\uff0c\u6d4b\u8bd5\u573a\u666f\u5217\u4e0e\u7528\u4f8b\u4e2d\u7684\u4e0d\u4e00\u81f4\uff0c\u5173\u952e\u5b57scene\u3001app_name\u3001\u67b6\u6784\u522b\u540d\uff0c\u4e0d\u80fd\u5305\u542b\u4e0b\u5212\u7ebf\u548c\u82f1\u6587\u7b26\u53f7\u7684\u5706\u62ec\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/","title":"\u6846\u67b6\u529f\u80fd\u4ecb\u7ecd","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2023/1/12\n# Author : Mikigo\n# =============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_2","title":"\u4e00\u3001\u4e00\u53e5\u8bdd\u7b80\u4ecb","text":"\u6b64\u6587\u6863\u4e3b\u8981\u60f3\u5bf9 YouQu \u6846\u67b6\u4e00\u4e9b\u91cd\u70b9\u7684\u529f\u80fd\u505a\u8be6\u7ec6\u7684\u4ecb\u7ecd\uff0c\u5305\u62ec\u5bf9\u4e00\u4e9b\u529f\u80fd\u5f00\u53d1\u7684\u80cc\u666f\u3001\u8981\u89e3\u51b3\u7684\u95ee\u9898\u3001\u5b9e\u73b0\u903b\u8f91\u3001\u4ee3\u7801\u7b49\u65b9\u9762\u7684\u4ecb\u7ecd\uff0c\u4ee5\u6b64\u8ba9\u5927\u5bb6\u80fd\u66f4\u52a0\u6e05\u6670\u7684\u7406\u89e3\u5404\u9879\u529f\u80fd\uff0c\u4ece\u800c\u5728\u4f7f\u7528\u7684\u65f6\u5019\u80fd\u66f4\u52a0\u7684\u5f97\u5fc3\u5e94\u624b\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_3","title":"\u4e8c\u3001\u56fe\u50cf\u8bc6\u522b","text":"\u56fe\u50cf\u8bc6\u522b\u5728 UI \u81ea\u52a8\u5316\u4e2d\u662f\u4e0d\u53ef\u7f3a\u5c11\u7684\uff0c\u5e02\u9762\u4e0a\u751a\u81f3\u6709\u5b8c\u5168\u57fa\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\uff0c\u6bd4\u5982 Airtest\u3001Sikuli \u7b49\uff0c\u5728\u6e38\u620f\u7b49\u7279\u5b9a\u9886\u57df\u4e5f\u6709\u4e0d\u9519\u7684\u6548\u679c\uff0c\u8fd9\u4e9b\u5de5\u5177\u5b9e\u9645\u4e0a\u4e5f\u662f\u7528\u7684 OpenCV \u8fdb\u884c\u4e86\u5c01\u88c5\uff0cYouQu \u6846\u67b6\u57fa\u4e8e OpenCV \u5f00\u53d1\u4e86\u81ea\u5df1\u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\uff0c\u5b83\u53ef\u4ee5\u65b9\u4fbf\u7684\u7528\u4e8e\u754c\u9762\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u65ad\u8a00\uff1b YouQu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u51e0\u4e4e\u6ee1\u8db3\u4e86\u4f60\u7684\u6240\u6709\u8981\u6c42\uff0c\u6211\u4eec\u5728\u957f\u65f6\u95f4\u7684\u601d\u8003\u548c\u6478\u7d22\u4e2d\uff0c\u9488\u5bf9\u5e38\u89c4\u573a\u666f\u53ca\u4e00\u4e9b\u7279\u6b8a\u573a\u666f\u63a2\u7d22\u9664\u4e86\u4e00\u4e9b\u5b9e\u7528\u4e14\u6709\u6548\u7684\u65b9\u6848\uff0c\u4e14\u542c\u6211\u6162\u6162\u9053\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1","title":"1\u3001\u5e38\u89c4\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5e38\u89c4\u8bc6\u522b\u5f88\u597d\u7406\u89e3\uff0c\u4e00\u53e5\u8bdd\u8bb2\u5c31\u662f\uff0c\u8981\u83b7\u53d6\u5230\u76ee\u6807\u5143\u7d20\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u3002 \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u5728\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u9700\u8981\u83b7\u53d6\u7684\u5750\u6807\u662f\u76f8\u5bf9\u4e8e\u6574\u4e2a\u5c4f\u5e55\u7684\u5750\u6807\uff0c\u6211\u4eec\u53ef\u4ee5\u622a\u53d6\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u56fe\u7247\uff08screen\uff09\uff1b \u5728\u5143\u7d20\u8bc6\u522b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u622a\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5c0f\u56fe\u8fdb\u884c\u8bc6\u522b\uff0c\u6bd4\u5982\u622a\u53d6\u64ad\u653e\u6309\u94ae\uff1a \u90a3\u4e48\u5b9e\u9645\u4e0a\uff0c\u5143\u7d20\u5b9a\u4f4d\u7684\u95ee\u9898\u5c31\u8f6c\u6362\u4e3a\uff0c\u5c06\u622a\u56fe\u7684\u5c0f\u56fe\uff08play_btn\uff09\u62ff\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u5927\u56fe\uff08screen\uff09\u4e2d\u53bb\u505a\u5339\u914d\uff0c\u5982\u679c\u5339\u914d\u6210\u529f\uff0c\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff08 x, y \uff09\u5373\u53ef\u3002 \u4e3a\u4e86\u65b9\u4fbf\u63cf\u8ff0\uff0c\u4ee5\u4e0b\u6211\u5c06\u6574\u4e2a\u5c4f\u5e55\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5927\u56fe\uff0c\u67d0\u4e2a\u5143\u7d20\u56fe\u7247\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5c0f\u56fe\u3002 \u57fa\u4e8e OpenCV \u7684\u6a21\u677f\u5339\u914d cv.matchTemplate() \u529f\u80fd\uff0c\u6211\u4eec\u5b9e\u73b0\u4e86\u56fe\u50cf\u5b9a\u4f4d\u7684\u529f\u80fd\uff0c\u6846\u67b6\u63d0\u4f9b\u4e86\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u5e95\u5c42\u63a5\u53e3\uff08\u4e00\u822c\u4e0d\u5bf9\u4e0a\u5c42\u63d0\u4f9b\u8c03\u7528\uff09\uff1a def _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\n# \u8be6\u7ec6\u4ee3\u7801\u592a\u957f\u4e0d\u8d34\u4e86\uff0c\u611f\u5174\u8da3\u8bf7\u67e5\u770b\u6e90\u7801\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001image_path image_path \u662f\u5c0f\u56fe\u7684\u7edd\u5bf9\u8def\u5f84; \u901a\u5e38\u5728 AT \u5de5\u7a0b\u91cc\u9762\uff0c\u6211\u4eec\u7ea6\u5b9a\u5c06\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u5b9e\u9645\u7684\u5143\u7d20\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1aplay_btn.png \uff1b \u7528\u4e8e\u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 case/assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1amusic_001.png \uff1b \u8fd9\u6837\u662f\u4e3a\u4e86\u65b9\u4fbf\u7ba1\u7406\u548c\u7ef4\u62a4\u3002 2\u3001rate \u56fe\u50cf\u8bc6\u522b\u7684\u7684\u5339\u914d\u5ea6\u6216\u8005\u8bf4\u76f8\u4f3c\u5ea6\uff0c\u6846\u67b6\u9ed8\u8ba4\u7684\u914d\u7f6e\u4e3a 0.9\uff0c\u4e5f\u5c31\u662f\u8bf4\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u5b58\u5728\u4e00\u4e2a\u76f8\u4f3c\u5ea6 90% \u7684\u56fe\u6807\u5373\u8fd4\u56de\u5176\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff1b \u5982\u679c\u4f60\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u8c03\u6574\u8bc6\u522b\u5ea6\uff0c\u4f60\u53ef\u4ee5\u5728\u8c03\u7528\u51fd\u6570\u7684\u65f6\u5019\uff0c\u4f20\u5165\u4e0d\u540c\u7684\u8bc6\u522b\u5ea6\u7684\u503c\u3002 3\u3001multiple \u9ed8\u8ba4\u60c5\u51b5\u4e0b multiple=False\uff0c\u8868\u793a\u53ea\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u7b2c\u4e00\u4e2a\uff0c\u5982\u679c multiple=True \u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\uff0c\u56e0\u4e3a\u5927\u56fe\u4e2d\u53ef\u80fd\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u5c0f\u56fe\uff0c\u5728\u67d0\u4e9b\u573a\u666f\u4e0b\u4f60\u53ef\u80fd\u9700\u8981\u5168\u90e8\u83b7\u53d6\u5230\u6240\u6709\u5339\u914d\u5230\u7684\u5750\u6807\u3002 4\u3001picture_abspath \u9ed8\u8ba4\u60c5\u51b5\u4e0b picture_abspath=None \u8868\u793a\u5927\u56fe\u4e3a\u622a\u53d6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u5982\u679c\u4f60\u4e0d\u5e0c\u671b\u5927\u56fe\u662f\u5c4f\u5e55\u7684\u622a\u56fe\uff0c\u800c\u662f\u4f60\u81ea\u5b9a\u4e49\u4f20\u5165\u7684\u67d0\u4e2a\u56fe\u7247\uff0c\u4f60\u53ea\u9700\u8981\u5c06\u4f60\u7684\u56fe\u7247\u8def\u5f84\u4f20\u9012\u7ed9\u8fd9\u4e2a\u53c2\u6570\u5c31\u884c\uff0c\u6bd4\u5982\uff1a picture_abspath=\"~/Desktop/big.png\" \uff1b 5\u3001screen_bbox \u5927\u56fe\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u622a\u53d6\u6574\u4e2a\u5c4f\u5e55\uff0cscreen_bbox = [x, y, w, h] \u53ef\u4ee5\u6307\u5b9a\u622a\u53d6\u5c4f\u5e55\u4e2d\u7684\u56fa\u5b9a\u533a\u57df\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\uff0c\u53ef\u4ee5\u6392\u9664\u90e8\u5206\u533a\u57df\u5bf9\u8bc6\u522b\u7ed3\u679c\u7684\u5f71\u54cd\u3002 \u3010\u9690\u5f0f\u7b49\u5f85\u3011 \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\uff0c\u6709\u65f6\u5019\u9875\u9762\u8df3\u8f6c\u6709\u5ef6\u65f6\uff0c\u6709\u53ef\u80fd\u5b58\u5728\u8bc6\u522b\u7684\u90a3\u4e00\u523b\u9875\u9762\u4e5f\u6ca1\u6709\u8df3\u8f6c\u51fa\u6765\uff0c\u6216\u8005\u6216\u8005\u8bc6\u522b\u7684\u90a3\u4e00\u523b\uff1b \u56e0\u6b64\u6211\u4eec\u9700\u8981\u4e00\u79cd\u7b49\u5f85\u673a\u5236\uff0c\u5373\u5728\u4e00\u5b9a\u7684\u65f6\u95f4\u5185\uff0c\u5982\u679c\u8bc6\u522b\u4e0d\u5230\uff0c\u91cd\u590d\u53bb\u8bc6\u522b\uff1a def find_image(\ncls,\n*widget, rate: [float, int] = None,\nmultiple: bool = False,\nmatch_number: int = None,\npicture_abspath: str = None,\nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u5728\u5c4f\u5e55\u4e2d\u533a\u5bfb\u627e\u5c0f\u56fe\uff0c\u8fd4\u56de\u5750\u6807\uff0c\n \u5982\u679c\u627e\u4e0d\u5230\uff0c\u6839\u636e\u914d\u7f6e\u91cd\u8bd5\u6b21\u6570\uff0c\u6bcf\u6b21\u95f4\u96941\u79d2\n :param widget: \u6a21\u677f\u56fe\u7247\u8def\u5f84\n :param rate: \u76f8\u4f3c\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param match_number: \u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\n :return: \u5750\u6807\u5143\u7ec4\n \"\"\"\nif rate is None:\nrate = float(GlobalConfig.IMAGE_RATE)\ntry:\nfor element in widget:\nfor _ in range((match_number or int(GlobalConfig.IMAGE_MATCH_NUMBER)) + 1):\nlocate = cls._match_image_by_opencv(\nelement,\nrate,\nmultiple=multiple,\npicture_abspath=picture_abspath,\nscreen_bbox=screen_bbox\n)\nif not locate:\nsleep(int(GlobalConfig.IMAGE_MATCH_WAIT_TIME))\nelse:\nreturn locate\nraise TemplateElementNotFound(*widget)\nexcept Exception as e:\nraise e\n \u53c2\u6570 match_number \u7528\u4e8e\u63a7\u5236\u91cd\u590d\u8bc6\u522b\u7684\u6b21\u6570\uff0c\u9ed8\u8ba4\u4e0d\u4f20\u53c2\uff0c\u53d6\u5168\u5c40\u914d\u7f6e setting/globalconfig.ini \u91cc\u9762\u7684 IMAGE_MATCH_NUMBER \u914d\u7f6e\u9879\u7684\u503c\uff0c\u9ed8\u8ba4IMAGE_MATCH_NUMBER = 1\uff0c\u5373\u91cd\u8bd5 1 \u6b21\uff1b find_image \u662f\u6846\u67b6\u63d0\u4f9b\u7684\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u51fd\u6570\u63a5\u53e3\uff0c\u8fd9\u4e2a\u51fd\u6570\u63d0\u4f9b\u4e86\u9690\u5f0f\u7b49\u5f85\u7684\u529f\u80fd\uff0c\u4e14\u5305\u542b\u4e0a\u9762\u4ecb\u7ecd\u7684 _match_image_by_opencv \u51fd\u6570\u7684\u6240\u6709\u529f\u80fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2","title":"2\u3001\u6c14\u6ce1\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u6c14\u6ce1\u8bc6\u522b\u6307\u7684\u662f\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\u8981\u5b9a\u4f4d\u7684\u5143\u7d20\u662f\u4e00\u4e9b\u4f1a\u6d88\u5931\u7684\u5c0f\u5f39\u7a97\uff0c\u8fd9\u7c7b\u573a\u666f\u5728\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\u5c31\u53ef\u80fd\u5b58\u5728\u4e0d\u7a33\u5b9a\u6027\uff0c\u6709\u53ef\u80fd\u56fe\u50cf\u8bc6\u522b\u7684\u65f6\u5019\u6c14\u6ce1\u5df2\u7ecf\u6d88\u5931\u4e86\uff0c\u4e5f\u6709\u53ef\u80fd\u6c14\u6ce1\u51fa\u73b0\u7684\u65f6\u95f4\u592a\u77ed\u4e86\uff0c\u4e0d\u5bb9\u6613\u6355\u6349\u5230\uff0c\u5c31\u50cf\u6c14\u6ce1\u4e00\u6837\uff0c\u51fa\u73b0\u4e00\u4e0b\u5c31\u6d88\u5931\uff0c\u56e0\u6b64\u6211\u4eec\u5f62\u8c61\u7684\u79f0\u4e4b\u4e3a \u201c\u6c14\u6ce1\u8bc6\u522b\u201d\uff1b \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u4e3a\u4e86\u80fd\u7a33\u5b9a\u7684\u8bc6\u522b\u6c14\u6ce1\u7c7b\u573a\u666f\uff0c\u6211\u4eec\u91c7\u7528\u7684\u65b9\u6848\u662f\uff1a \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\uff08\u5305\u542b\u6c14\u6ce1\u4ece\u51fa\u73b0\u5230\u6d88\u5931\uff09\uff0c\u4e0d\u505c\u7684\u622a\u53d6\u8fd9\u6bb5\u65f6\u95f4\u5185\u7684\u5927\u56fe\uff0c\u4ee5\u6b64\u786e\u4fdd\u5728\u622a\u53d6\u7684\u4e00\u5806\u56fe\u7247\u4e2d\uff0c\u80af\u5b9a\u6709\u81f3\u5c11\u4e00\u5f20\u56fe\u7247\u80fd\u6355\u6349\u5230\u6c14\u6ce1\uff0c\u6700\u540e\u518d\u5bf9\u8fd9\u4e00\u5806\u56fe\u7247\u9010\u4e2a\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def get_during(\ncls,\nimage_path: str,\nscreen_time: [float, int],\nrate: float = None,\npause: [int, float] = None,\nmax_range: int = 10000\n):\n\"\"\"\n \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u622a\u56fe\u591a\u5f20\u56fe\u7247\u8fdb\u884c\u8bc6\u522b\uff0c\u5176\u4e2d\u6709\u4e00\u5f20\u56fe\u7247\u8bc6\u522b\u6210\u529f\u5373\u8fd4\u56de\u7ed3\u679c;\n \u9002\u7528\u4e8e\u6c14\u6ce1\u7c7b\u7684\u65ad\u8a00\uff0c\u6bd4\u5982\u6c14\u6ce1\u57281\u79d2\u5185\u6d88\u5931\uff0c\u5982\u679c\u7528\u5e38\u89c4\u7684\u56fe\u50cf\u8bc6\u522b\u5219\u6709\u53ef\u80fd\u65e0\u6cd5\u8bc6\u522b\u5230\uff1b\n :param image_path: \u8981\u8bc6\u522b\u7684\u6a21\u677f\u56fe\u7247\uff1b\n :param screen_time: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff1b\n :param rate: \u8bc6\u522b\u7387\uff1b\n :param pause: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u4e0d\u95f4\u9694\uff1b\n :param max_range: \u622a\u56fe\u7684\u6700\u5927\u6b21\u6570\uff0c\u8fd9\u662f\u4e00\u4e2a\u9884\u8bbe\u503c\uff0c\u4e00\u822c\u60c5\u51b5\u4e0b\u4e0d\u6d89\u53ca\u4fee\u6539\uff1b\n \"\"\"\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001screen_time \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5728\u6b64\u65f6\u95f4\u5185\u4f1a\u4e0d\u65ad\u7684\u8fdb\u884c\u622a\u56fe\u64cd\u4f5c\uff0c\u5c31\u50cf\u5f55\u5236\u89c6\u9891\u4e00\u6837\uff1b 2\u3001pause \u6bcf\u6b21\u622a\u53d6\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u4e00\u523b\u4e0d\u505c\u7684\u622a\u56fe\uff0c\u5982\u679c\u4f60\u60f3\u6bcf\u6b21\u622a\u56fe\u5b58\u5728\u4e00\u4e9b\u95f4\u9694\u65f6\u95f4\u4f20\u5165\u5bf9\u5e94\u7684\u65f6\u95f4\u95f4\u9694\u5373\u53ef\uff0c\u5355\u4f4d\u662f\u79d2\uff0c\u6bd4\u5982\uff1apause = 0.03\uff0c\u8868\u793a 30 ms\uff0c\u76f8\u5f53\u4e8e\u5e27\u7387\u4e3a 30 \u5e27\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-opencv","title":"3\u3001\u4e0d\u4f9d\u8d56 OpenCV \u7684\u56fe\u50cf\u8bc6\u522b\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31","title":"3.1\u3001\u81ea\u7814\u56fe\u50cf\u8bc6\u522b\u6280\u672f","text":"\u3010\u539f\u7406\u3011 \u4e3a\u4e86\u5b9e\u73b0\u8bc6\u522b\u56fe\u50cf\u7684\u76ee\u7684\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u5c06\u56fe\u7247\u7684\u6bcf\u4e2a\u50cf\u7d20\u7684RGB\u503c\uff0c\u4e0e\u6574\u4e2a\u5c4f\u5e55\u4e2d\u7684RGB\u8fdb\u884c\u5bf9\u6bd4\uff0c\u5982\u679c\u5c0f\u56fe\u4e0a\u7684RGB\u503c\u4e0e\u5bf9\u5e94\u5927\u56fe\u4f4d\u7f6e\u7684RGB\u90fd\u76f8\u7b49\uff0c\u5219\u5339\u914d\u6210\u529f\uff0c\u5373\u53ef\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u70b9\u3002 1\u3001\u8bfb\u53d6\u5c0f\u56fe\u548c\u5927\u56fe\u7684RGB\u503c \uff081\uff09\u5c0f\u56fe\u7684RGB\u503c small_data = small_pic.load() # load()\u4f1a\u5c06\u56fe\u7247\u7684RGB\u503c\u83b7\u53d6\u5230\uff0c\u6570\u636e\u683c\u5f0f\u4e3a\u4e00\u4e2a\u4e8c\u7ef4\u5217\u8868\uff0c\u8d4b\u503c\u7ed9\u4e00\u4e2a\u53d8\u91cfsmall_data\u3002\n \uff082\uff09\u5927\u56fe\u7684RGB\u503c big_data = big_pic.load()\n 2\u3001\u5c06\u5c0f\u56fe\u4e0e\u5927\u56fe\u7684RGB\u503c\u8fdb\u884c\u5339\u914d \uff081\uff09\u5339\u914d\u4ece\u5927\u56fe\u7684\u5750\u6807\uff080\uff0c0\uff09\u5f00\u59cb\u5339\u914d\uff0c\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff082\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\uff080\uff0c0\uff09\u5bf9\u5e94\u7684\u6240\u6709\u5c0f\u56fe\u7684RGB\u503c\u4e0d\u76f8\u7b49\uff0c\u5219\u79fb\u52a8\u5230\u4e0b\u4e00\u4e2a\u5750\u6807\u70b9\uff081\uff0c0\uff09\uff0c\u540c\u6837\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff083\uff09\u6309\u7167\u8fd9\u6837\u7684\u89c4\u5f8b\u5c06\u8fd9\u4e00\u884c\u6bcf\u79fb\u52a8\u4e00\u4e2a\u5750\u6807\u70b9\uff0c\u90fd\u5c06\u5c0f\u56fe\u6240\u6709\u7684RGB\u4e0e\u5bf9\u5e94\u5927\u56fe\u7684\u503c\u8fdb\u884c\u5339\u914d\uff1b \uff084\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\u5176\u4e2d\u4e00\u4e2a\u5750\u6807\u70b9\u4e0a\u5339\u914d\u5230\u4e86\u5c0f\u56fe\u7684\u6240\u6709RGB\u503c\uff0c\u5219\u6b64\u65f6\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\u70b9\uff1b \uff085\uff09\u5982\u679c\u5339\u914d\u4e86\u5927\u56fe\u6240\u6709\u7684\u5750\u6807\u70b9\uff0c\u90fd\u6ca1\u6709\u5339\u914d\u5230\uff0c\u5219\u8bf4\u660e\u5927\u56fe\u4e2d\u4e0d\u5b58\u5728\u5c0f\u56fe\uff0c\u5339\u914d\u5931\u8d25\uff1b \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 class ImageRgb:\n@staticmethod\ndef _check_match(_x, _y, small, bdata, sdata, rate):\n\"\"\"\n Matching degree of small graph and large graph matching\n \"\"\"\n@staticmethod\ndef _pre_random_point(small):\n\"\"\"\n Pre matching, take 10-20 points at random each time,\n and take coordinates randomly in the small graph\n \"\"\"\n@staticmethod\ndef _pre_random_match(_x, _y, point_list, bdata, sdata, rate):\n\"\"\"\n In the small graph, several points are randomly\n selected for matching, and the matching degree is\n also set for the random points\n \"\"\"\n@classmethod\ndef match_image_by_rgb(cls, image_name=None, image_path=None, rate=0.9):\n\"\"\"\n By comparing the RGB values of the small image with the large\n image on the screen, the coordinates of the small image on\n the screen are returned.\n \"\"\"\n \u901a\u8fc7 match_image_by_rgb() \u8fd9\u4e2a\u51fd\u6570\uff0c\u4f20\u5165\u76ee\u6807\u5c0f\u56fe\u7684\u6587\u4ef6\u540d\u79f0\uff0c\u5373\u53ef\u8fd4\u56de\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u3002 \u6709\u540c\u5b66\u8981\u95ee\u4e86\uff0c\u6709 OpenCV \u5e72\u561b\u4e0d\u7528\uff0c\u6709\u5fc5\u8981\u81ea\u5df1\u5b9e\u73b0\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u529f\u80fd\u5417\uff0c\u4f60\u4eec\u662f\u4e0d\u662f\u95f2\u7684\u554a\uff1f \u8fd9\u4e48\u95ee\u7684\u8bdd\uff0c\u5c0f\u4e86\uff0c\u683c\u5c40\u5c0f\u4e86\uff1b\u6211\u4eec\u81ea\u5df1\u5b9e\u73b0\u4e3b\u8981\u6709\u51e0\u65b9\u9762\u539f\u56e0\uff1a \u51cf\u5c11\u73af\u5883\u4f9d\u8d56\uff0c\u5373\u4e0d\u7528\u5b89\u88c5 OpenCV\uff0c\u6211\u4eec\u4e5f\u80fd\u5b9e\u73b0\u5176\u529f\u80fd\uff0c\u73af\u5883\u4f9d\u8d56\u8fd9\u5757\u540e\u9762\u4f1a\u5355\u72ec\u8be6\u7ec6\u8bb2\uff0c\u51cf\u5c11\u73af\u5883\u4f9d\u8d56\u5bf9\u4e8e\u4efb\u4f55\u8f6f\u4ef6\u5de5\u7a0b\u90fd\u975e\u5e38\u91cd\u8981\uff1b OpenCV \u5728\u5176\u4ed6\u56fd\u4ea7 CPU \u67b6\u6784\u4e0a\u5b89\u88c5\u5e76\u4e0d\u80fd\u4fdd\u8bc1100%\u6210\u529f\uff0c\u751a\u81f3\u6709\u6ca1\u6709\u53ef\u80fd\u5728\u4e00\u4e9b\u67b6\u6784\u4e0a\u538b\u6839\u513f\u5c31\u4e0d\u80fd\u5b89\u88c5\u4f7f\u7528 OpenCV \uff1f \u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 OpenCV \uff1f\u5c31\u50cf\u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 Windows \u5462\uff1f\u8fd9\u4e9b\u95ee\u9898\u503c\u5f97\u601d\u8003\u3002 \u5f53\u7136\uff0c\u6211\u4eec\u627f\u8ba4\u8fd9\u5957\u65b9\u6848\uff0c\u867d\u7136\u8bc6\u522b\u51c6\u786e\u7387\u6ca1\u95ee\u9898\uff0c\u4f46\u5728\u8bc6\u522b\u6548\u7387\u4e0a\u8fd8\u6ca1\u6709\u8fbe\u5230 OpenCV \u6a21\u677f\u5339\u914d\u7684\u6548\u679c\uff0c\u6211\u4eec\u7684\u65b9\u6848\u6bcf\u6b21\u8bc6\u522b\u5728 1.5s \u5de6\u53f3\uff0c\u800c OpenCV \u5728 1s \u5de6\u53f3\uff1b \u6574\u4f53\u8bc6\u522b\u6548\u679c\u6765\u8bb2\uff0c\u6211\u8ba4\u4e3a\u8fd8\u662f\u53ef\u4ee5\u63a5\u53d7\u7684\uff0c\u4e5f\u5e0c\u671b\u6709\u5fd7\u4e4b\u58eb\u80fd\u4e00\u8d77\u4f18\u5316\u6b64\u65b9\u6848\uff0c\u4e00\u8d77\u6280\u672f\u62a5\u56fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32-rpc","title":"3.2\u3001\u57fa\u4e8e RPC \u670d\u52a1\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b","text":"\u5728\u8fdc\u7a0b\u670d\u52a1\u5668\u4e0a\u90e8\u7f72 OpenCV \u7684\u73af\u5883\uff0c\u5e76\u5c06\u5176\u90e8\u7f72\u4e3a RPC \u670d\u52a1\uff0c\u6d4b\u8bd5\u673a\u4e0a\u4e0d\u7528\u5b89\u88c5 OpenCV \u4f9d\u8d56\uff0c\u800c\u662f\u901a\u8fc7\u8bf7\u6c42 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u3010\u539f\u7406\u3011 \u6d4b\u8bd5\u673a\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u56fe\u7247\u4ee5\u53ca\u6a21\u677f\u56fe\u7247\uff0c\u53d1\u9001\u7ed9 RPC \u670d\u52a1\u7aef\uff0c\u670d\u52a1\u7aef\u62ff\u5230\u4e24\u5f20\u56fe\u7247\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u6700\u540e\u5c06\u8bc6\u522b\u7ed3\u679c\u8fd4\u56de\u7ed9\u6d4b\u8bd5\u673a\uff1b \u8981\u7279\u6b8a\u8bf4\u660e\u7684\u662f\uff1a RPC \u662f\u4e00\u79cd\u534f\u8bae\uff0c\u8bb8\u591a\u8bed\u8a00\u90fd\u662f\u652f\u6301\u7684\uff0c\u6bd4\u5982\u8bf4\u670d\u52a1\u7aef\u4e5f\u53ef\u4ee5\u7528 C++ \u6765\u5b9e\u73b0\uff0c\u5ba2\u6237\u7aef\u4f7f\u7528 Python \u4e5f\u662f\u53ef\u4ee5\u8c03\u7528\u7684\u3002 \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 \u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nimport cv2 as cv\nimport numpy as np\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\nif __name__ == \"__main__\":\nserver = ThreadXMLRPCServer((\"x.x.x.x\", 8889), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(match_image_by_opencv, \"match_image_by_opencv\")\nserver.serve_forever()\n \u8fd9\u6837\uff0c\u6211\u4eec\u57fa\u4e8e Python \u6807\u51c6\u5e93 xmlrpc \u642d\u5efa\u4e86\u4e00\u4e2a RPC \u670d\u52a1\u5668\uff0c\u6ce8\u518c\u4e86 image_put \u548c match_image_by_opencv \u4e24\u4e2a\u529f\u80fd\u63a5\u53e3\uff0c\u5728\u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u901a\u8fc7 IP \u548c\u7aef\u53e3\u8fdb\u884c RPC \u8bf7\u6c42\uff1b \u5ba2\u6237\u7aef\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from xmlrpc.client import Binary\nfrom xmlrpc.client import ServerProxy\nserver = ServerProxy(GlobalConfig.OPENCV_SERVER_HOST, allow_none=True)\nscreen_rb = open(screen, \"rb\")\ntemplate_rb = open(template_path, \"rb\")\ntry:\nscreen_path = server.image_put(Binary(screen_rb.read()))\nscreen_rb.close()\ntpl_path = server.image_put(Binary(template_rb.read()))\ntemplate_rb.close()\nreturn server.match_image_by_opencv(\ntpl_path, screen_path, rate, multiple\n)\nexcept OSError as exc:\nraise EnvironmentError(\nf\"RPC\u670d\u52a1\u5668\u94fe\u63a5\u5931\u8d25. {GlobalConfig.OPENCV_SERVER_HOST}\"\n) from exc\n \u901a\u8fc7\u8fd4\u56de server.match_image_by_opencv \u5c31\u83b7\u53d6\u4e86\u5728\u670d\u52a1\u7aef\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4","title":"4\u3001\u53f3\u952e\u83dc\u5355\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41","title":"4.1\u3001\u53f3\u952e\u83dc\u5355\u5b9a\u4f4d\u7684\u65b9\u6848\u53ca\u95ee\u9898","text":"\u53f3\u952e\u83dc\u5355\u7684\u5143\u7d20\u5b9a\u4f4d\u662f\u4e00\u4e2a\u96be\u70b9\uff0c\u8fc7\u53bb\u6211\u4eec\u8c03\u7814\u548c\u4f7f\u7528\u8fc7\u7684\u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u65b9\u6cd5\u6709 4 \u79cd\uff1a \u7b2c\u4e00\u79cd\uff1a\u6b65\u957f\u64cd\u4f5c\u6cd5 \u5728\u53f3\u952e\u83dc\u5355\u547c\u51fa\u6765\u4e4b\u540e\uff0c\u901a\u8fc7\u952e\u76d8\u7684 up\u3001down \u6309\u952e\uff0c\u8fdb\u884c\u9009\u62e9\u83dc\u5355\u9009\u62e9\uff0c\u9009\u4e2d\u76ee\u6807\u4e4b\u540e enter \u5373\u53ef\uff1b\u6bd4\u5982\uff1a\u5728\u684c\u9762\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\uff0c\u6309 1 \u6b21 down \uff0c\u4f1a\u51fa\u73b0\u4e0b\u56fe\uff1a \u7ee7\u7eed\u518d\u6309 2 \u6b21 down\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u518d\u6309 enter\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u5982\u6b64\uff0c\u201c\u6392\u5e8f\u65b9\u5f0f\u201d\u7684\u6b65\u957f\u4e3a 3\uff1b\u901a\u8fc7\u4f7f\u7528\u952e\u76d8\u4e0a\u4e0b\u952e\uff0c\u5c31\u5b9e\u73b0\u4e86\u5bf9\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\uff1b \u4f46\u662f\uff0c\u8fd9\u79cd\u65b9\u5f0f\u6709\u4e2a\u5f88\u70e6\u4eba\u7684\u95ee\u9898\uff0c\u5c31\u662f\u53f3\u952e\u83dc\u5355\u7684\u9009\u9879\u4f4d\u7f6e\u4e0d\u53ef\u80fd\u4e00\u76f4\u4e0d\u53d8\uff0c\u5728\u9700\u6c42\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\uff0c\u83dc\u5355\u9009\u9879\u7684\u53d8\u5316\u662f\u5f88\u5927\u7684\uff0c\u751a\u81f3\u6709\u4e9b\u5e94\u7528\u652f\u6301\u81ea\u5b9a\u4e49\u83dc\u5355\uff0c\u6bd4\u5982\u6587\u7ba1\u53f3\u952e\u83dc\u5355\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff1b \u4e5f\u5c31\u662f\u8bf4\u4f60\u5f97\u7ecf\u5e38\u53bb\u7ef4\u62a4\u83dc\u5355\u9009\u9879\u7684\u6b65\u957f\uff0c\u4e00\u4e2a\u9009\u9879\u73b0\u5728\u7684\u6b65\u957f\u662f 3\uff0c\u4e0b\u4e2a\u8fed\u4ee3\u53ef\u80fd\u5c31\u662f 4 \u6216\u8005 5\u3002 \u7b2c\u4e8c\u79cd\uff1a\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u6cd5 \u628a\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5355\u72ec\u622a\u56fe\u4fdd\u5b58\uff0c\u56fe\u7247\u4e2d\u4ec5\u5305\u542b\u4e00\u4e2a\u83dc\u5355\u9009\u9879\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u8fd9\u6837\uff0c\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5c31\u53ef\u4ee5\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u65b9\u5f0f\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u8fd9\u79cd\u65b9\u5f0f\u4e0d\u7528\u62c5\u5fc3\u83dc\u5355\u9009\u9879\u7684\u987a\u5e8f\u6216\u4f4d\u7f6e\uff0c\u4f46\u662f\u9700\u8981\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff0c\u4e14\u5bb9\u6613\u53d7\u5230\u5b57\u4f53 UI \u53d8\u66f4\u7c7b\u9700\u6c42\u7684\u5f71\u54cd\uff0c\u6bd4\u5982\uff1a\u5b57\u4f53\u5927\u5c0f\u3001\u5b57\u4f53\u95f4\u8ddd\u7b49\u7b49\u9700\u6c42\u53d8\u66f4\u90fd\u4f1a\u5f71\u54cd\uff0c\u6bcf\u6b21\u53d8\u66f4\u4e4b\u540e\u5c31\u9700\u8981\u8fdb\u884c\u5927\u91cf\u56fe\u7247\u8d44\u6e90\u7684\u91cd\u65b0\u622a\u56fe\u66ff\u6362\uff0c\u662f\u4e2a\u6bd4\u8f83\u9ebb\u70e6\u7684\u4e8b\u60c5\uff1b \u7b2c\u4e09\u79cd\uff1a\u76f8\u5bf9\u4f4d\u79fb\u6cd5 \u9f20\u6807\u70b9\u51fb\u53f3\u952e\u7684\u65f6\u5019\uff0c\u9f20\u6807\u7684\u5f53\u524d\u5750\u6807\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u7684\uff0c\u83dc\u5355\u9009\u9879\u7684\u5bbd\uff08 w \uff09\u4e00\u822c\u662f\u56fa\u5b9a\u7684\uff0c\u53d8\u5316\u7684\u662f\u83dc\u5355\u7684\u957f\u5ea6\uff08 h \uff09\uff0c\u53ef\u4ee5\u901a\u8fc7\u67d0\u4e2a\u9009\u9879\u76f8\u5bf9\u4e8e\u9f20\u6807\u7684\u8ddd\u79bb\u5728\u786e\u5b9a\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u901a\u8fc7\u7ef4\u62a4\u83dc\u5355\u9009\u9879\uff08\u76f8\u5bf9\u4f4d\u7f6e\uff09\u76f8\u5bf9\u4e8e\u9f20\u6807\u4f4d\u7f6e\u7684\u8ddd\u79bb\uff0c\u5373\u53ef\u8f7b\u677e\u8ba1\u7b97\u51fa\u83dc\u5355\u9009\u9879\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\u3002 \u4ece\u7406\u8bba\u4e0a\u6b64\u65b9\u6848\u662f\u53ef\u884c\u7684\uff0c\u4f46\u662f\u8fd9\u91cc\u4ecd\u7136\u5b58\u5728\u4e24\u4e2a\u4e25\u91cd\u7684\u95ee\u9898\uff1a \u83dc\u5355\u987a\u5e8f\u6539\u53d8\uff0c\u5bfc\u81f4\u76f8\u5bf9\u8ddd\u79bb\u6539\u53d8\uff0c\u800c\u4e14\u8ddd\u79bb\u662f\u901a\u8fc7\u50cf\u7d20\uff08px\uff09\u6765\u8868\u793a\u7684\uff0c\u4e0d\u60f3\u6b65\u957f\u90a3\u4e48\u53ea\u7ba1\uff0c\u6bcf\u6b21\u9700\u8981\u53bb\u91cf\u4e00\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u70b9\u9ebb\u70e6\uff1b \u9f20\u6807\u5728\u684c\u9762\u4e0d\u540c\u4f4d\u7f6e\u70b9\u51fb\u53f3\u952e\uff0c\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u4f4d\u7f6e\u662f\u4e0d\u540c\u7684\uff0c\u4e0a\u56fe\u7684\u83dc\u5355\u662f\u5728\u9f20\u6807\u7684\u5de6\u4e0b\u65b9\uff0c\u5982\u679c\u4f60\u79fb\u52a8\u9f20\u6807\u5230\u5c4f\u5e55\u56db\u8fb9\uff0c\u4f60\u4f1a\u53d1\u73b0\uff0c\u53f3\u952e\u83dc\u5355\u53ef\u80fd\u51fa\u73b0\u5728\u9f20\u6807\u7684\u56db\u4e2a\u65b9\u5411\uff0c\u4e5f\u5c31\u662f\u8bf4\u4f60\u9700\u8981\u6839\u636e\u9f20\u6807\u7684\u4e0d\u540c\u4f4d\u7f6e\u6765\u5224\u65ad\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u65b9\u5411\uff0c\u800c\u4e0d\u540c\u7684\u65b9\u5411\u4e0a\u8ba1\u7b97\u65b9\u6cd5\u662f\u4e0d\u540c\u7684\uff0c\u6bd4\u5982\uff1a\u53f3\u952e\u83dc\u5355\u5728\u9f20\u6807\u7684\u5de6\u4e0a\uff0c\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\u8ba1\u7b97\u65b9\u6cd5\u4e3a\uff08x - w / 2\uff0c y - h\uff09\uff0c\u8fd9\u6837\u7ef4\u62a4\u8d77\u6765\u53ef\u4ee5\u8bf4\u975e\u5e38\u590d\u6742\uff1b \u57fa\u4e8e\u4ee5\u4e0a\u4e24\u4e2a\u539f\u56e0\uff0c\u6211\u4eec\u5e76\u4e0d\u63a8\u8350\u8fd9\u79cd\u64cd\u4f5c\u65b9\u6848\u3002 \u7b2c\u56db\u79cd\uff1a\u5c5e\u6027\u5b9a\u4f4d \u6709\u540c\u5b66\u8bf4\u5e72\u561b\u4e0d\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u5462\uff0c\u5176\u5b9e\uff0c\u6211\u4eec\u6700\u5f00\u59cb\u60f3\u5230\u7684\u65b9\u6848\u5c31\u662f\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\uff0c\u4f46\u662f\u5728\u5c5e\u6027\u7684 DOM \u6811\u91cc\u600e\u4e48\u4e5f\u627e\u4e0d\u5230\uff0c\u65e0\u6cd5\u5b9a\u4f4d\u5230\uff0c\u6211\u4eec\u4e5f\u8054\u5408\u7814\u53d1\u540c\u5b66\u4e00\u8d77\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u4f46\u6700\u7ec8\u8fd8\u662f\u6ca1\u80fd\u89e3\u51b3\uff0c\u975e\u5e38\u9057\u61be\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42","title":"4.2\u3001\u6700\u65b0\u7684\u53f3\u952e\u83dc\u5355\u7ec8\u6781\u89e3\u51b3\u65b9\u6848","text":"\u7531\u4e8e\u53f3\u952e\u83dc\u5355\u9009\u9879\u51e0\u4e4e\u90fd\u662f\u6587\u672c\uff0c\u90a3\u4e48\u901a\u8fc7 OCR \u8bc6\u522b\uff0c\u51e0\u4e4e\u662f\u6700\u4f18\u7684\u65b9\u6848\uff1a \u4e0d\u7528\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff1b \u4e0d\u4f1a\u53d7\u5230\u83dc\u5355\u9009\u9879\u987a\u5e8f\u6539\u53d8\u7684\u5f71\u54cd\uff1b \u4e0d\u4f1a\u53d7\u5230\u5b57\u4f53 UI \u53d8\u5316\u7684\u5f71\u54cd\uff1b \u5173\u4e8e OCR \u8bc6\u522b\u6211\u4eec\u5728\u540e\u9762\u4f1a\u8be6\u7ec6\u8bb2\u5230\uff0c\u672c\u7ae0\u8282\u4e3b\u8981\u8bb2\u57fa\u4e8e OCR \u8bc6\u522b\uff0c\u6211\u4eec\u5728\u53f3\u952e\u83dc\u5355\u8bc6\u522b\u4e0a\u7684\u7a81\u7834\u548c\u521b\u65b0\uff1b \u4f7f\u7528 OCR \u8bc6\u522b\u53f3\u952e\u83dc\u5355\u867d\u7136\u5df2\u7ecf\u5f88\u5b8c\u7f8e\u4e86\uff0c\u4f46\u662f\u5728\u4e00\u4e9b\u60c5\u51b5\u4e0b\u4ecd\u7136\u5b58\u5728\u4e00\u70b9\u95ee\u9898\uff0c\u5c31\u662f\u5c4f\u5e55\u4e2d\u51fa\u73b0\u591a\u4e2a\u548c\u83dc\u5355\u9009\u9879\u6587\u5b57\u76f8\u540c\u7684\u6587\u5b57\u65f6\uff0c\u6bd4\u5982\u4e0b\u9762\u8fd9\u79cd\u60c5\u51b5\uff1a \u5c4f\u5e55\u6070\u597d\u51fa\u73b0\u4e86\u4e24\u4e2a\u201c\u590d\u5236\u201d\uff0c\u6b64\u65f6\u8981\u5b9a\u4f4d\u5230\u83dc\u5355\u4e2d\u7684 \u201c\u590d\u5236\u201d\uff0c\u5c31\u9700\u8981\u8fdb\u4e00\u6b65\u505a\u6570\u636e\u5904\u7406\uff0c\u6bd4\u5982\uff1aOCR \u8fd4\u56de 2 \u4e2a\u201c\u590d\u5236\u201d\u7684\u5750\u6807\uff0c\u7528\u4f8b\u91cc\u9762\u6765\u5224\u65ad\u7528\u54ea\u4e2a\uff0c\u4ece\u4e1a\u52a1\u4e0a\u5c06\u5904\u7406\u8d77\u6765\u6bd4\u8f83\u9ebb\u70e6\uff0c\u56e0\u4e3a\u4f60\u5f97\u660e\u786e\u77e5\u9053\u83dc\u5355\u5728\u5de6\u8fb9\u8fd8\u662f\u53f3\u8fb9\uff0c\u7136\u540e\u8fd9\u672c\u8eab\u5c31\u662f\u4e0d\u786e\u5b9a\u7684\uff1b \u600e\u4e48\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u5462\uff0c\u8fd9\u5c31\u8981\u8bf4\u9053\u672c\u7ae0\u7684\u4e3b\u9898\uff1a\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b\u3002 \u3010\u539f\u7406\u3011 \u5728\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u524d\u622a\u4e00\u5f20\u56fe\uff0c\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\u518d\u622a\u53d6\u4e00\u5f20\u56fe\uff0c\u4e24\u5f20\u56fe\u552f\u4e00\u53d8\u5316\u7684\u5c31\u662f\u53f3\u952e\u83dc\u5355\uff0c\u5c06\u5176\u4ed6\u76f8\u540c\u7684\u5730\u65b9\u90fd\u5c4f\u853d\u6389\uff0c\u53ea\u7559\u4e0b\u83dc\u5355\u754c\u9762\uff0c\u5982\u6b64\u5373\u53ef\u6d88\u9664\u5e72\u6270\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u5c06\u4e24\u79cd\u56fe\u505a\u524d\u540e\u5bf9\u6bd4\u63d0\u53d6\u53ef\u4ee5\u5f97\u5230\u8fd9\u6837\u7684\u56fe\uff1a \u4f60\u770b\uff0c\u901a\u8fc7\u524d\u540e\u56fe\u7247\u7684\u5bf9\u6bd4\uff0c\u5c06\u76f8\u540c\u7684\u90e8\u5206\u7ed9\u6d88\u9664\u6389\uff0c\u518d\u8fdb\u884c OCR \u8bc6\u522b\uff0c\u8fd9\u6837\u5c31\u4e0d\u4f1a\u6709\u5e72\u6270\u4e86\uff1b \u4ee3\u7801\u5b9e\u73b0\u8bf7\u67e5\u770b src/filter_image.py \uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def filter_image(action):\n\"\"\"\n \u5bf9\u6bd4\u52a8\u4f5c\u524d\u540e\u4e24\u5f20\u56fe\u7247\uff0c\u63d0\u53d6\u4e0d\u540c\u7684\u90e8\u5206\u751f\u6210\u4e00\u5f20\u65b0\u7684\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u65b0\u56fe\u7247\u7684\u8def\u5f84\n :param action: \u52a8\u4f5c\u51fd\u6570\u7684\u51fd\u6570\u5bf9\u8c61\n :return: \u65b0\u56fe\u7247\u7684\u8def\u5f84\n \"\"\"\n action \u662f\u9f20\u6807\u4e8b\u4ef6\uff0c\u56e0\u4e3a\u6b64\u7c7b\u573a\u666f\u4e0d\u4ec5\u4ec5\u5728\u53f3\u952e\u5b58\u5728\uff0c\u5355\u51fb\u3001\u53cc\u51fb\u7b49\u7b49\uff0c\u53ea\u8981\u64cd\u4f5c\u524d\u540e\u540e\u53d8\u5316\u7684\u90fd\u53ef\u4ee5\uff1a from src.mouse_key import MouseKey\naction = (\nMouseKey.click,\nMouseKey.right_click,\nMouseKey.double_click,\nMouseKey.move_to,\n)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5","title":"5\u3001\u52a8\u6001\u56fe\u50cf\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5728\u684c\u9762\u58c1\u7eb8\u5207\u6362\uff0c\u6216\u770b\u56fe\u3001\u76f8\u518c\u5207\u6362\u56fe\u7247\u7c7b\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u7531\u4e8e\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u662f\u4e0d\u56fa\u5b9a\u7684\uff08\u4e0d\u540c\u7248\u672c\u7684\u7cfb\u7edf\u58c1\u7eb8\u4e0d\u540c\u3001\u58c1\u7eb8\u987a\u5e8f\u4e0d\u540c\uff0c\u770b\u56fe\u76f8\u518c\u5728\u56fe\u7247\u8d44\u6e90\u4e0d\u4e00\u5b9a\u56fa\u5b9a\uff09\uff0c\u90a3\u4e48\u5728\u6d4b\u8bd5\u5207\u6362\u58c1\u7eb8\u6216\u8005\u5207\u6362\u56fe\u7247\u7684\u573a\u666f\u65f6\u5c31\u4f1a\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u4f60\u4e0d\u77e5\u9053\u9884\u671f\u662f\u5565\uff0c\u7528\u4f8b\u64cd\u4f5c\u52a8\u6001\u7684\uff0c\u4e5f\u662f\u6781\u4e0d\u7a33\u5b9a\u3002 \u3010\u539f\u7406\u3011 \u5728\u5207\u6362\u56fe\u7247\u4e4b\u524d\u622a\u56fe\u4fdd\u5b58\u5e76\u8fd4\u56de\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u6b21\u8bc6\u522b\u8fd9\u5f20\u56fe\u7247\uff0c\u5982\u679c\u4e0d\u5b58\u5728\uff0c\u8bf4\u660e\u56fe\u7247\u5df2\u7ecf\u5207\u6362\u4e86\uff1b \u793a\u610f\u56fe\uff1a \u8fd9\u6837\uff0c\u6211\u4eec\u622a\u53d6\u4e86\u5f53\u524d\u56fe\u7247\u4e2d\u6bd4\u8f83\u6709\u4ee3\u8868\u6027\u7684\u4f4d\u7f6e\uff08\u4e00\u53ea\u9e1f\uff09\uff0c\u5728\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u7528\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1a \u6211\u4eec\u518d\u62ff\u7740\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd9\u6837\u5728\u5f53\u524d\u56fe\u7247\u4e2d\uff0c\u5c31\u4e0d\u80fd\u627e\u5230\u8fd9\u53ea\u9e1f\u4e86\uff0c\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u662f False\uff0c\u90a3\u4e48\u4e5f\u5c31\u53ef\u4ee5\u5224\u65ad\u56fe\u7247\u5207\u6362\u662f\u6210\u529f\u7684\u3002 \u4ee3\u7801\u793a\u610f\uff1a def save_temporary_picture(_x: int, _y: int, width: int, height: int):\n\"\"\"\n \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u56fe\u7247\u8def\u5f84\n :param x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n :param y: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n :param width: \u5bbd\u5ea6\n :param height: \u9ad8\u5ea6\n :return: \u56fe\u7247\u8def\u5f84\n \"\"\"\n \u6b64\u51fd\u6570\u7528\u4e8e\u5728\u64cd\u4f5c\u4e4b\u524d\u622a\u56fe\u4e00\u5f20\u4e34\u65f6\u56fe\u7247\uff0c\u8fd4\u56de\u56fe\u7247\u8def\u5f84\uff0c\u6700\u540e\u5728\u65ad\u8a00\u7684\u65f6\u5019\u518d\u5c06\u56fe\u7247\u8def\u5f84\u4f5c\u4e3a\u53c2\u6570\u4f20\u5165\u65ad\u8a00\u8bed\u53e5\u5373\u53ef\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ui","title":"\u4e09\u3001\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_1","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u662f\u6211\u4eec\u81ea\u7814\u7684\u4e00\u79cd\u4f7f\u7528\u7b80\u5355\uff0c\u4e14\u6548\u7387\u6781\u9ad8\u3001\u7a33\u5b9a\u6027\u597d\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u57fa\u4e8e\u5143\u7d20\u6309\u94ae\u5728\u5e94\u7528\u4e2d\u7684\u76f8\u5bf9\u4f4d\u7f6e\uff0c\u52a8\u6001\u83b7\u53d6\u5143\u7d20\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff0c\u9002\u7528\u4e8e\u5404\u79cd\u5c4f\u5e55\u5206\u8fa8\u7387\uff08\u5305\u62ec\u9ad8\u5206\u5c4f\u3001\u5bbd\u5c4f\u3001\u5e26\u9c7c\u5c4f\uff09\uff0c\u5f53\u5143\u7d20\u6309\u94ae\u4f4d\u7f6e\u76f8\u5bf9\u4e8e\u5e94\u7528\u754c\u9762\u4f4d\u7f6e\u53d1\u751f\u4fee\u6539\u4e4b\u540e\uff0c\u53ea\u9700\u8981\u6839\u636e UI \u8bbe\u8ba1\u56fe\u4e0a\u7684\u6e90\u6570\u636e\u4fee\u6539\u5bf9\u5e94\u5750\u6807\u6570\u636e\u5c31\u597d\uff0c\u7ef4\u62a4\u975e\u5e38\u7684\u65b9\u4fbf\u3002 \u6b64\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u9002\u7528\u4e8e\u4e00\u4e9b\u5143\u7d20\u4f4d\u7f6e\u76f8\u5bf9\u4e0e\u5e94\u7528\u754c\u9762\u6bd4\u8f83\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u97f3\u4e50\uff0899% \u7684\u5143\u7d20\u5b9a\u4f4d\u91c7\u7528\u8fd9\u79cd\uff0c\u6548\u679c\u975e\u5e38\u597d\uff09\uff0c\u4e0d\u9002\u7528\u4e8e\u754c\u9762\u4e0d\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u622a\u56fe\u5f55\u5c4f\uff0c\u5f88\u660e\u663e\u4e0d\u9002\u7528\u4e8e\u8fd9\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u3002\u8fd9\u79cd\u5168\u65b0\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u6709\u5b83\u7684\u9002\u7528\u6761\u4ef6\uff0c\u5982\u679c\u4f60\u53d1\u73b0\u4f7f\u7528\u5e38\u89c4\u7684\uff08\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u5b9a\u4f4d\uff09\u4e0d\u597d\u505a\u65f6\uff0c\u4e0d\u59a8\u8003\u8651\u4f7f\u7528\u8fd9\u79cd\uff0c\u5176\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff0c\u5e76\u4e14\u8fc5\u901f\u7231\u4e0a\u4ed6\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_1","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5728 UI \u8bbe\u8ba1\u56fe\u4e2d\u6211\u4eec\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u8fb9\u6846\u7684\u8ddd\u79bb\u7684\uff0c\u7136\u540e\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u6280\u672f\u624b\u6bb5\u83b7\u53d6\u5230\u5e94\u7528\u754c\u9762\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u53ca\u5e94\u7528\u7a97\u53e3\u7684\u5927\u5c0f\uff0c\u793a\u610f\u56fe\u5982\u4e0b\uff1a \uff08x1, y1\uff09\u4e3a\u5e94\u7528\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\uff1b\uff08x2, y2\uff09\u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u5de6\u4e0a\u89d2\uff08x1, y1\uff09\u7684\u5750\u6807\uff0c\u90a3\u4e48\u5b9e\u9645\u4e0a\u3010\u64ad\u653e\u6240\u6709\u3011\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\u4e3a\uff1a\uff08 x1 + x2, y1 + y2 \uff09\uff1b \u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5927\u5c0f\uff08w2, h2\uff09\uff0c\u53ef\u4ee5\u4ece UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\uff1b \u5728 UI \u8bbe\u8ba1\u7a3f\u4e0a\u70b9\u51fb\u3010\u64ad\u653e\u6240\u6709\u3011\u56fe\u6807\uff0c\u7136\u540e\u79fb\u52a8\u9f20\u6807\u5c31\u5c31\u53ef\u4ee5\u770b\u5230\u4e0a\u56fe\u7684\u53c2\u8003\u7ebf\u53ca\u6570\u636e\uff1b \u6240\u4ee5\uff0c\u6211\u4eec\u53ef\u4ee5\u8f7b\u677e\u7684\u83b7\u53d6\u5230\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u4e2d\u5fc3\u5750\u6807\u4e3a\uff1a\uff08 x1 + x2 + (w2 / 2), y1 + y2 + ( h2 / 2) \uff09 \u8be6\u7ec6\u6e90\u4ee3\u7801\u8bf7\u67e5\u770b AT \u57fa\u7840\u6846\u67b6: src/button_center.py \u83b7\u53d6\u5e94\u7528\u7a97\u53e3\u7684\u4fe1\u606f \u4f7f\u7528 xdotool \u548c xwininfo \u83b7\u53d6\u5230\u5e94\u7528\u7a97\u53e3\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u5de6\u4e0a\u89d2\uff09\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a app_id = CmdCtl.run_cmd(f\"xdotool search --classname --onlyvisible {self.app_name}\"\n).split(\"\\n\")\napp_id_list = [int(_id) for _id in app_id if _id]\nreturn CmdCtl.run_cmd(f\"xwininfo -id {app_id_list[self.number]}\")\n \u4f7f\u7528\u6b63\u5219\u83b7\u53d6\u7a97\u53e3\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u83b7\u53d6\u914d\u7f6e \u8bfb ini \u914d\u7f6e\u6587\u4ef6\uff0c\u83b7\u53d6\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e0e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a conf = ConfigParser()\nconf.read(self.config_path)\ndirection = conf.get(btn_name, \"direction\")\nposition = [int(i.strip()) for i in conf.get(btn_name, \"location\").split(\",\")]\n \u8ba1\u7b97\u5143\u7d20\u6309\u94ae\u5750\u6807 \u6839\u636e\u5e94\u7528\u7a97\u53e3\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u5927\u5c0f\u3001\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u5927\u5c0f\uff0c\u4f7f\u7528\u4e00\u5b9a\u7684\u7b97\u6cd5\u5373\u53ef\u8ba1\u7b97\u51fa\u5143\u7d20\u6309\u94ae\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u4e2d\u5fc3\u5750\u6807\uff09\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3","title":"3\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u3010\u914d\u7f6e\u65b9\u6cd5\u3011 \u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u7684\u6570\u636e\u6e90\u662f\u5e94\u7528\u5e93\u4e2d\u7684 ui.ini \u914d\u7f6e\u6587\u4ef6\uff1a ;section\n[\u65b0\u5efa\u6b4c\u5355+] ;key = value\ndirection = left_top\nlocation = 180, 268, 21, 21\n section \u662f\u4f60\u6839\u636e\u5bf9\u5e94\u7684\u5143\u7d20\u6309\u94ae\u547d\u540d\uff0c\u4f60\u53ef\u4ee5\u4efb\u610f\u547d\u540d\uff0c\u4f46\u6700\u597d\u6709\u5177\u4f53\u542b\u4e49\uff0c\u4e14\u80fd\u660e\u786e\u8868\u793a\u8fd9\u4e2a\u5143\u7d20\u6309\u94ae\u7684\u540d\u79f0\uff1b\u7528\u4e2d\u62ec\u53f7\u62ec\u8d77\u6765\u5c31\u884c\uff0c\u6bd4\u5982\uff1a[\u65b0\u5efa\u6b4c\u5355+] \uff1b direction \u662f\u914d\u7f6e\u8be5\u5143\u7d20\u7684\u53c2\u8003\u7cfb\uff0c\u5206\u522b\u4e3a\uff1a left_top \u5de6\u4e0a\uff1b left_bottom \u5de6\u4e0b\uff1b right_top \u53f3\u4e0a\uff1b right_bottom \u53f3\u4e0b\uff1b \u53c2\u8003\u7cfb\u7684\u9009\u53d6\u6807\u51c6\uff1a\u62c9\u52a8\u6539\u53d8\u7a97\u53e3\u5927\u5c0f\u65f6\uff0c\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u53c2\u8003\u7cfb\u4f4d\u7f6e\u662f\u4e0d\u53d8\u7684\uff1b location \u662f\u8be5\u5143\u7d20\u6309\u94ae\u7684\u76f8\u5bf9\u4e0e\u53c2\u8003\u7cfb\u7684 x, y \u7684\u8ddd\u79bb\uff0c\u53ca\u5927\u5c0f(w, h)\uff0c\u8fd9\u56db\u4e2a\u6570\u636e\u53ef\u4ee5\u901a\u8fc7 UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\u6570\u636e\uff0c\u5728\u7f16\u8f91\u6a21\u5f0f\u4e0b\uff0c\u70b9\u51fb UI \u56fe\u4e0a\u7684\u6309\u94ae\uff0c\u53f3\u4fa7\u5c31\u4f1a\u51fa\u73b0\u8be5\u5143\u7d20\u6309\u94ae\u7684 x, y, w, h \u6570\u636e\u3002 \u5982\u679c UI \u56fe\u4e0a\u6ca1\u6709\u63d0\u4f9b\u4f60\u60f3\u8981\u7684\u5143\u7d20\u6570\u636e\uff0c\u4f60\u53ef\u4ee5\u76f4\u63a5\u5728\u7cfb\u7edf\u4e2d\u4f7f\u7528\u622a\u56fe\u5f55\u5c4f\u8fdb\u884c\u5c3a\u91cf\uff0c\u8fd9\u662f\u4e00\u79cd\u4e0d\u63a8\u8350\u4f46\u80fd\u7528\u7684\u65b9\u6cd5\u3002 \u3010\u8c03\u7528\u65b9\u6cd5\u3011 \u5728\u5e94\u7528\u5e93\u65b9\u6cd5\u5c42\u8fd9\u6837\u5199\uff1a def click_add_music_list_btn_in_music_by_ui(self):\n\"\"\"\u70b9\u51fb\u65b0\u5efa\u6b4c\u5355\u6309\u94ae\"\"\"\nself.click(*self.ui.btn_center(\"\u65b0\u5efa\u6b4c\u5355+\"))\n self.ui.btn_center() \u662f\u56fa\u5b9a\u5199\u6cd5\uff0c\u53c2\u6570\u5c31\u662f\u914d\u7f6e\u91cc\u9762\u7684 section \u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ocr","title":"\u56db\u3001OCR \u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_2","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 OCR \u65b9\u6848\u5927\u591a\u91c7\u7528\u8c37\u6b4c OCR\uff08Tesseract\uff09\u65b9\u6848\uff0c\u4f46\u662f\u5b83\u5bf9\u4e8e\u4e2d\u6587\u7684\u8bc6\u522b\u975e\u5e38\u5dee\uff0c\u7ecf\u8fc7\u5927\u91cf\u7684\u8c03\u7814\uff0c\u6211\u4eec\u4f7f\u7528 PaddleOCR\uff0c\u5b83\u662f\u4e00\u4e2a\u5f00\u6e90\u7684\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u8bc6\u522b\u5de5\u5177\uff0c\u4e5f\u662f PaddlePaddle \u6700\u6709\u540d\u7684\u4e00\u4e2a\u5f00\u6e90\u9879\u76ee\uff0c\u611f\u5174\u8da3\u7684\u53ef\u4ee5\u70b9\u8fd9\u91cc\u4e86\u89e3\uff0c\u591a\u7684\u4e0d\u8bf4\u4e86\uff0c\u4f60\u53ea\u9700\u8981\u77e5\u9053\u5b83\u5c31\u662f\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_2","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5b89\u88c5\u4ed6\u662f\u4e2a\u5f88\u9ebb\u70e6\u7684\u4e8b\u60c5\uff0c\u867d\u7136\u64cd\u4f5c\u5f88\u7b80\u5355\uff0c\u4f46\u5176\u5b9e\u5b89\u88c5\u5305\u6709\u70b9\u5927\uff0c\u56e0\u6b64\u6211\u4eec\u4e0d\u5e0c\u671b\u76f4\u63a5\u5728 env.sh \u4e2d\u52a0\u5165\u5b83\uff0c\u8fd9\u4f1a\u8ba9\u6574\u4e2a\u81ea\u52a8\u5316\u73af\u5883\u53d8\u5f97\u975e\u5e38\u81c3\u80bf\uff1b \u56e0\u6b64\uff0c\u6211\u4eec\u60f3\u5230\u5c06\u5b83\u505a\u6210\u4e00\u4e2a RPC \u670d\u52a1\u5728\u5176\u4ed6\u673a\u5668\u4e0a\u90e8\u7f72\uff0c\u6d4b\u8bd5\u673a\u901a\u8fc7\u8fdc\u7a0b\u8c03\u7528 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u4f7f\u7528\u5b83\uff1b RPC \u7684\u8c03\u7528\u903b\u8f91\uff1a \u8fd9\u6837\u6211\u4eec\u53ea\u9700\u8981\u5728\u670d\u52a1\u7aef\u90e8\u7f72\u597d OCR \u8bc6\u522b\u7684\u670d\u52a1\uff0c\u7136\u540e\u901a\u8fc7 RPC \u670d\u52a1\u5c06\u529f\u80fd\u63d0\u4f9b\u51fa\u6765\uff0c\u6846\u67b6\u91cc\u9762\u53ea\u9700\u8981\u8c03\u7528\u5bf9\u5e94\u7684 RPC \u63a5\u53e3\u5c31\u884c\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_1","title":"3\u3001\u4f7f\u7528\u8bf4\u660e","text":"\u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nfrom paddleocr import PaddleOCR\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef paddle_ocr(pic_path, lang):\n\"\"\"\n Paddleocr\u76ee\u524d\u652f\u6301\u7684\u591a\u8bed\u8a00\u8bed\u79cd\u53ef\u4ee5\u901a\u8fc7\u4fee\u6539lang\u53c2\u6570\u8fdb\u884c\u5207\u6362\n \u4f8b\u5982`ch`, `en`, `fr`, `german`, `korean`, `japan`\n :param file_name:\n :param lang:\n :return:\n \"\"\"\nif __name__ == \"__main__\":\nIP = popen(\"hostname -I\").read().split(\" \")[0]\nPORT = 8890\nSCREEN_CACHE = \"/tmp/screen.png\"\nserver = ThreadXMLRPCServer((IP, PORT), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(paddle_ocr, \"paddle_ocr\")\nprint(\"\u76d1\u542c\u5ba2\u6237\u7aef\u8bf7\u6c42\u3002\u3002\")\nserver.serve_forever()\n \u6846\u67b6\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from src import OCR\nOCR.ocr(*target_strings, picture_abspath=None, similarity=0.6, return_default=False, return_first=False, lang=\"ch\"):\n# \u901a\u8fc7 OCR \u8fdb\u884c\u8bc6\u522b\u3002\n# target_strings:\n# \u76ee\u6807\u5b57\u7b26,\u8bc6\u522b\u4e00\u4e2a\u5b57\u7b26\u4e32\u6216\u591a\u4e2a\u5b57\u7b26\u4e32,\u5e76\u8fd4\u56de\u5176\u5728\u56fe\u7247\u4e2d\u7684\u5750\u6807;\n# \u5982\u679c\u4e0d\u4f20\u53c2\uff0c\u8fd4\u56de\u56fe\u7247\u4e2d\u8bc6\u522b\u5230\u7684\u6240\u6709\u5b57\u7b26\u4e32\u3002\n# picture_abspath: \u8981\u8bc6\u522b\u7684\u56fe\u7247\u8def\u5f84\uff0c\u5982\u679c\u4e0d\u4f20\u9ed8\u8ba4\u622a\u53d6\u5168\u5c4f\u8bc6\u522b\u3002\n# similarity: \u5339\u914d\u5ea6\u3002\n# return_default: \u8fd4\u56de\u8bc6\u522b\u7684\u539f\u751f\u6570\u636e\u3002\n# return_first: \u53ea\u8fd4\u56de\u7b2c\u4e00\u4e2a,\u9ed8\u8ba4\u4e3a False,\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u6240\u6709\u6570\u636e\u3002\n# lang: `ch`, `en`, `fr`, `german`, `korean`, `japan`\n \u6b64\u65b9\u6848\u5728\u6846\u67b6\u5185\u6ca1\u6709\u5f15\u5165\u4efb\u4f55\u4e09\u65b9\u4f9d\u8d56\u5b8c\u5168\u91c7\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\uff0c\u800c\u4e14\u4f7f\u7528\u65b9\u6cd5\u975e\u5e38\u7b80\u5355\uff0c\u53ea\u9700\u8981\u901a\u8fc7 OCR.ocr() \u5373\u53ef\uff1b \u5bf9\u4e8e\u4e00\u4e9b\u6587\u6848\u7684\u573a\u666f\u975e\u5e38\u9002\u7528\uff0c\u6b64\u65b9\u6cd5\u76f4\u63a5\u8fd4\u56de\u5750\u6807\uff0c\u53ef\u4ee5\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u3002 \u4e5f\u53ef\u4ee5\u7528\u4e8e\u6587\u5b57\u65ad\u8a00\uff0c\u4ee3\u7801\u793a\u610f\uff1a def assert_ocr_exist(\n*args, picture_abspath=None, similarity=0.6, return_first=False, lang=\"ch\"\n):\n\"\"\"\u65ad\u8a00\u6587\u6848\u5b58\u5728\"\"\"\npic = None\nif picture_abspath is not None:\npic = picture_abspath + \".png\"\nres = OCR.ocr(\n*args,\npicture_abspath=pic,\nsimilarity=similarity,\nreturn_first=return_first,\nlang=lang,\n)\nif res is False:\nraise AssertionError(\n(f\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{args}\", f\"{pic if pic else GlobalConfig.SCREEN_CACHE}\")\n)\nif isinstance(res, tuple):\npass\nelif isinstance(res, dict) and False in res.values():\nres = filter(lambda x: x[1] is False, res.items())\nraise AssertionError(\n(\nf\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{dict(res)}\",\nf\"{pic if pic else GlobalConfig.SCREEN_CACHE}\",\n)\n)\n \u5728\u7528\u4f8b\u4e2d\u4f7f\u7528\u65ad\u8a00\uff0c\u793a\u4f8b\uff1a def test_font_manager_021(self):\n\"\"\"\u53f3\u4fa7\u2665-\u6536\u85cf/\u53d6\u6d88\u6536\u85cf\u5b57\u4f53\"\"\"\n# \u5b57\u4f53\u7ba1\u7406\u5668\u754c\u9762\u53f3\u4fa7\u8be6\u60c5\u5217\u8868\uff0c\u9009\u62e9\u672a\u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e / \u6536\u85cf\u5b57\u4f53\n# \u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e\u83dc\u5355\u663e\u793a\u201c\u53d6\u6d88\u6536\u85cf\u201d\uff1b\n...\nself.assert_ocr_exist(\"\u53d6\u6d88\u6536\u85cf\")\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_1","title":"4\u3001\u670d\u52a1\u7aef\u90e8\u7f72","text":"\u6211\u4eec\u76ee\u524d\u662f\u5c06 OCR \u670d\u52a1\u90e8\u7f72\u5728\u666e\u901a\u7684\u529e\u516c\u673a\u4e0a\u7684\uff0c\u5982\u679c\u4f60\u89c9\u5f97\u73b0\u6709\u7684 OCR \u8bc6\u522b\u6027\u80fd\u4e0d\u591f\u597d\uff0c\u6070\u597d\u4f60\u6709\u66f4\u597d\u7684\u673a\u5668\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u5176\u79c1\u6709\u5316\u90e8\u7f72\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41_1","title":"4.1\u3001\u73af\u5883\u5b89\u88c5","text":"\u63a8\u8350\u4f7f\u7528 pipenv \u8fdb\u884c\u73af\u5883\u642d\u5efa\uff1b \u5b89\u88c5 pipenv \uff1a sudo pip3 install pipenv\n \u65b0\u5efa\u4e00\u4e2a\u76ee\u5f55\u4f5c\u4e3a\u73af\u5883\u5305 ocr_env\uff1a cd ~\nmkdir ocr_env\n \u521b\u5efa python 3.7 \u73af\u5883\uff1a cd ocr_env\npipenv --python 3.7\n \u5b89\u88c5 OCR \u4f9d\u8d56\u5305\uff1a pipenv install paddlepaddle -i https://mirror.baidu.com/pypi/simple\npipenv install \"paddleocr>=2.0.1\" -i https://mirror.baidu.com/pypi/simple\n \u4e0d\u51fa\u610f\u5916\uff0c\u8fd9\u6837\u5c31\u628a\u4f9d\u8d56\u5b89\u88c5\u597d\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42_1","title":"4.2\u3001\u542f\u52a8\u670d\u52a1","text":"\u5c06\u57fa\u7840\u6846\u67b6\u4e2d\u7684 scr/ocr/pdocr_rpc_server.py \u6587\u4ef6\u62f7\u8d1d\u5230 ocr_env \u76ee\u5f55\uff0c\u540e\u53f0\u6267\u884c\u5b83\u5c31\u597d\u4e86\uff1a cd ocr_env\nnohup pipenv run python pdocr_rpc_server.py &\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#43","title":"4.3\u3001\u914d\u7f6e\u5f00\u673a\u81ea\u542f\uff08\u901a\u7528\uff09","text":"\u4f60\u80af\u5b9a\u4e0d\u60f3\u6bcf\u6b21\u673a\u5668\u91cd\u542f\u4e4b\u540e\u90fd\u9700\u8981\u624b\u52a8\u542f\u52a8\u670d\u52a1\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u914d\u7f6e\u5f00\u673a\u81ea\u542f\u3002 \u5199\u5f00\u673a\u81ea\u542f\u670d\u52a1\u6587\u4ef6\uff1a sudo vim /lib/systemd/system/ocr.service\n autoocr \u540d\u79f0\u4f60\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff0c\u5199\u5165\u4ee5\u4e0b\u5185\u5bb9\uff1a [Unit]\nDescription=OCR Service\nAfter=multi-user.target\n\n[Service]\nUser=uos\nGroup=uos\nType=idle\nWorkingDirectory=/home/uos/ocr_env\nExecStart=pipenv run python pdocr_rpc_server.py\n\n[Install]\nWantedBy=multi-user.target\n \u6ce8\u610f\u66ff\u6362\u4f60\u7684${USER} \u4fee\u6539\u914d\u7f6e\u6587\u4ef6\u7684\u6743\u9650\uff1a sudo chmod 644 /lib/systemd/system/ocr.service\n \u81ea\u542f\u670d\u52a1\u751f\u6548\uff1a sudo systemctl daemon-reload\nsudo systemctl enable ocr.service\n \u67e5\u770b\u670d\u52a1\u72b6\u6001\uff1a sudo systemctl status ocr.service\n \u4f60\u53ef\u4ee5\u518d\u91cd\u542f\u4e0b\u7535\u8111\uff0c\u770b\u770b\u670d\u52a1\u662f\u4e0d\u662f\u6b63\u5e38\u542f\u52a8\u4e86\uff0c\u6ca1\u62a5\u9519\u5c31 OK \u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_4","title":"\u4e94\u3001\u5c5e\u6027\u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_3","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 UI \u81ea\u52a8\u5316\u5927\u591a\u90fd\u662f\u57fa\u4e8e\u6d4f\u89c8\u5668\u7684\uff0c\u6838\u5fc3\u662f\u5728\u7f51\u9875\u7684 DOM \u6811\u4e0a\u67e5\u627e\u5143\u7d20\uff0c\u5e76\u5bf9\u5176\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\uff1b Linux \u684c\u9762\u5e94\u7528\u5927\u591a\u662f\u91c7\u7528 Qt \u7f16\u5199\u7684\uff0c\u5728 Qt \u4e2d\u4e5f\u662f\u4ece\u6700\u9876\u5c42\u7684 MainWindow \u5f00\u59cb\u6784\u5efa\u5e94\u7528\uff0c\u6240\u4ee5\u903b\u8f91\u4e5f\u662f\u4e00\u6837\u7684\uff0cQt \u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u540c\u6837\u53ef\u4ee5\u901a\u8fc7 DOM \u6811\uff08\u5c5e\u6027\u6811\uff09\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff0c\u6211\u4eec\u79f0\u4e4b\u4e3a\u5c5e\u6027\u5b9a\u4f4d\u3002 \u501f\u52a9\u5f00\u6e90\u5de5\u5177 dogtail \u6211\u4eec\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u83b7\u53d6\uff0c\u4ece\u800c\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\u3002dogtail \u7684\u9879\u76ee\u4ecb\u7ecd\u53ef\u4ee5\u731b\u6233\u8fd9\u91cc\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_3","title":"2\u3001\u4f7f\u7528\u65b9\u6cd5","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#21sniff","title":"2.1\u3001sniff\uff08\u55c5\u63a2\u5668\uff09\u4f7f\u7528","text":"\u5728\u7ec8\u7aef\u8f93\u5165 sniff \u542f\u52a8 AT-SPI Browser mikigo@mikigo-PC:~$ sniff\n \u67e5\u770b\u5e94\u7528\u7684\u6807\u7b7e \u5728 sniff \u91cc\u9762\u53ef\u4ee5\u770b\u5230\u7cfb\u7edf\u4e2d\u5df2\u542f\u52a8\u7684\u5e94\u7528\uff0c\u70b9\u51fb\u5e94\u7528\u540d\u79f0\u524d\u9762\u7684\u4e09\u89d2\u5f62\u56fe\u6807\uff0c\u53ef\u4ee5\u5c55\u5f00\u5e94\u7528\u7684\u6807\u7b7e\uff0c\u6240\u6709\u6807\u7b7e\u4ee5 tree \u7684\u5f62\u5f0f\u5c55\u793a\uff0c\u5bf9\u5e94\u5e94\u7528\u91cc\u9762\u7684\u7236\u7a97\u53e3\u548c\u5b50\u7a97\u53e3\u3002 \u83b7\u53d6\u5143\u7d20\u63a7\u4ef6\u7684\u6807\u7b7e\u540d\u79f0 \u9996\u5148\uff0c\u4e3a\u4e86\u65b9\u4fbf\u67e5\u770b\u5143\u7d20\u63a7\u4ef6\u5bf9\u5e94\u7684\u4f4d\u7f6e\uff0c\u5efa\u8bae\u73b0\u5728\u4e0a\u65b9\u5de5\u5177\u680f\u70b9\u51fb Actions\uff0c\u7136\u540e\u52fe\u9009 Hightlight Items\uff0c\u8fd9\u6837\u5728 sniff \u4e2d\u9f20\u6807\u9009\u4e2d\u5143\u7d20\u6807\u7b7e\u7684\u65f6\u5019\uff0c\u5e94\u7528\u4e2d\u4f1a\u6709\u76f8\u5e94\u7684\u5149\u6807\u9501\u5b9a\u3002 \u5728 sniff \u91cc\u9762\u70b9\u51fb\u8fdb\u5165\u5e94\u7528\u7684\u6807\u7b7e tree \u4e2d\u540e\uff0c\u70b9\u51fb\u76f8\u5e94\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5728\u5de5\u5177\u4e0b\u65b9\uff0c\u4f1a\u5c55\u793a\u5143\u7d20\u63a7\u4ef6\u7684 Name\uff0c\u8fd9\u4e2a\u5c31\u662f\u6807\u7b7e\u540d\u79f0\u3002 \u5728 tree \u4e2d\u6709\u4e9b\u5730\u65b9\u662f\u7a7a\u767d\u7684\u6216\u8005\u662f Form\uff0c\u662f\u56e0\u4e3a\u5f00\u53d1\u4eba\u5458\u5728\u6dfb\u52a0\u6807\u7b7e\u7684\u65f6\u5019\u6ca1\u6709\u6dfb\u52a0\uff0c\u6216\u8005\u6709\u4e9b\u7236\u7a97\u53e3\u4e0d\u9700\u8981\u6dfb\u52a0\uff0c\u8fd9\u79cd\u5728\u5b9e\u9645\u4e1a\u52a1\u4e2d\u662f\u4e0d\u5f71\u54cd\u7684\uff0c\u6211\u4eec\u53ea\u8981\u4fdd\u8bc1\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\u4e2d\uff0c\u8981\u7528\u5230\u7684\u5143\u7d20\u90fd\u6dfb\u52a0\u4e86\u6807\u7b7e\u5373\u53ef\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#22","title":"2.2\u3001\u5143\u7d20\u64cd\u4f5c","text":"\u83b7\u53d6\u5e94\u7528\u5bf9\u8c61 dogtail \u83b7\u53d6\u5e94\u7528\u5bf9\u8c61\u7684\u65f6\u5019\uff0c\u4f7f\u7528\u7684\u662f tree \u5e93\u91cc\u9762\u7684 application() \u65b9\u6cd5\uff1a from dogtail.tree import root\napp_obj = root.application('deepin-music')\n app_obj\u5c31\u662f\u5e94\u7528\u7684\u5bf9\u8c61\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\uff0c\u662f\u5e94\u7528\u5bf9\u8c61\u4f7f\u7528child()\u65b9\u6cd5\uff1a element = app_obj.child('element_name')\n \u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u4f20\u5165\u5143\u7d20\u7684 Name\uff0c\u83b7\u53d6\u5230\u76f8\u5e94\u5143\u7d20\u7684\u5bf9\u8c61\u3002Name \u53ef\u4ee5\u901a\u8fc7 sniff \u67e5\u770b\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\u5217\u8868: element_list = element.children\n \u83b7\u53d6\u5230\u8fd9\u4e2a\u5143\u7d20\u4e0b\u9762\u6240\u6709\u7684\u5143\u7d20\u5217\u8868\u3002 \u8fd9\u4e2a\u65b9\u6cd5\u9002\u7528\u4e8e\u6709\u4e9b\u6807\u7b7e\u6ca1\u6709\u6dfb\u52a0\uff0c\u4f46\u662f\u4f4d\u7f6e\u662f\u56fa\u5b9a\u7684\uff0c\u6211\u4eec\u901a\u8fc7\u7d22\u5f15\u53ef\u4ee5\u53d6\u5f97\u5143\u7d20\u3002 element_list[0]\n \u5bf9\u5143\u7d20\u7684\u64cd\u4f5c \u5728\u83b7\u53d6\u5230\u5143\u7d20\u4e4b\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u76f8\u5e94\u7684\u64cd\u4f5c\u3002 \u5355\u51fb element.click(button=1)\n button 1 \u2014>\u5de6\u952e\uff0c2 \u2014>\u6eda\u8f6e\uff0c3 \u2014>\u53f3\u952e\uff0c\u9ed8\u8ba4\u4e3a 1 \u53cc\u51fb element.doubleClick(button=1)\n \u9f20\u6807\u60ac\u505c element.point()\n \u9f20\u6807\u79fb\u52a8\u5230\u5143\u7d20\u4e2d\u5fc3\u4f4d\u7f6e \u6587\u672c\u8f93\u5165 element.typeText(string)\n \u5411\u5143\u7d20\u5bf9\u8c61\u8f93\u5165\u5b57\u7b26\u4e32 \uff0c\u6bd4\u5982\u8f93\u5165\u6846 \u7ec4\u5408\u952e element.keyCombo(comboString)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#23","title":"2.3\u3001\u6846\u67b6\u5c01\u88c5","text":"\u4ee3\u7801\u793a\u4f8b\uff1a # \u8be6\u7ec6\u4ee3\u7801\u8bf7\u67e5\u770b src/dogtail_utils.py\nclass DogtailUtils:\ndef __init__(self, name=None, description=None):\nself.name = name\nself.description = description\nself.obj = root.application(self.name, self.description)\ndef app_element(self, *args, **kwargs):\n\"\"\"\n \u83b7\u53d6app\u5143\u7d20\u7684\u5bf9\u8c61\n :return: \u5143\u7d20\u7684\u5bf9\u8c61\n \"\"\"\nreturn self.obj.child(*args, **kwargs, retry=False)\ndef element_center(self, element) -> tuple:\n\"\"\"\n \u83b7\u53d6\u5143\u7d20\u7684\u4e2d\u5fc3\u4f4d\u7f6e\n :param element:\n :return: \u5143\u7d20\u4e2d\u5fc3\u5750\u6807\n \"\"\"\n_x, _y, _w, _h = self.app_element(element).extents\n_x = _x + _w / 2\n_y = _y + _h / 2\nreturn _x, _y\n \u6846\u67b6\u63d0\u4f9b\u7684\u63a5\u53e3\u975e\u5e38\u7b80\u6d01\uff0c\u5728\u8c03\u7528\u65f6\uff1a self.dog.element_center(\"\u64ad\u653e\")\n \u8fd9\u6837\u5c31\u80fd\u83b7\u53d6\u5230\u6b64\u5143\u7d20\u7684\u4e2d\u5fc3\u5750\u6807\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_5","title":"\u516d\u3001\u6807\u7b7e\u5316\u7ba1\u7406","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_4","title":"1\u3001\u6807\u7b7e\u8bf4\u660e","text":"\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u811a\u672c ID\uff1a\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c/\u51fd\u6570 ID\uff1b PMS\u7528\u4f8bID\uff1aPMS \u4e0a\u5bf9\u5e94\u7684\u7528\u4f8b ID\uff08\u7528\u4f8b\u5e93 ID\uff09\uff1b \u9ed8\u8ba4\u4f7f\u7528\u7528\u4f8b\u5e93 ID\uff0c\u5bf9\u4e8e\u6682\u65f6\u6ca1\u6709\u4f7f\u7528\u7528\u4f8b\u5e93\u7ba1\u7406\u7528\u4f8b\u7684\u9879\u76ee\uff0c\u53ef\u4ee5\u4f7f\u7528\u4ea7\u54c1\u5e93\u7528\u4f8b ID\uff1b \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1aFUNC\uff08\u529f\u80fd\uff09\u3001API\uff08\u63a5\u53e3\uff09\u3001BASELINE\uff08\u57fa\u7ebf\uff09\u3001PERF\uff08\u6027\u80fd\uff09\u3001STR\uff08\u538b\u529b\uff09\u3001SEC\uff08\u5b89\u5168\uff09\u3001CTS\uff08\u517c\u5bb9\u6027\uff09 \u4e0a\u7ebf\u5bf9\u8c61\uff1aCICD\uff0c\u8868\u793a\u4e0a\u7ebf\u5230 CICD \u6d41\u6c34\u7ebf\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u53ef\u4e00\u952e\u751f\u6210 case_list.csv \u6587\u4ef6\uff0c\u7528\u4e8e\u5bfc\u5165\u5230\u660e\u9053\u4e91 AT \u7528\u4f8b\u5217\u8868\u4e2d\u63a7\u5236 CICD \u8dd1\u6d4b\u8303\u56f4\uff1b \u6d4b\u8bd5\u7ea7\u522b\uff1aC1 / C2 / C3 / C4\uff0c\u5177\u4f53\u5b9a\u4e49\u53c2\u8003\u6d41\u6c34\u7ebf\u4f7f\u7528\u6307\u5bfc\uff1b \u8df3\u8fc7\u539f\u56e0\uff1askip-XXX\uff0c\u7528\u4e8e\u63a7\u5236\u7528\u4f8b\u662f\u5426\u6267\u884c\uff1b \u786e\u8ba4\u4fee\u590d\uff1afixed-XXX\uff0c\u7528\u4e8e\u6807\u8bb0\u7528\u4f8b\u7684\u4fee\u590d\u72b6\u6001\uff08\u540e\u9762\u8be6\u7ec6\u8bb2\u89e3\u7528\u6cd5\uff09\uff1b \u5e9f\u5f03\u7528\u4f8b\uff1aremoved-\u5df2\u5e9f\u5f03\uff0c\u7528\u4e8e\u6807\u8bb0\u5df2\u7ecf\u5e9f\u5f03\u7684\u7528\u4f8b\uff0c\u6b64\u7528\u4f8b\u6807\u7b7e\u4e0d\u4f1a\u88ab\u6dfb\u52a0\uff0c\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff1b \u793a\u4f8b\uff1a \u811a\u672cID PMS\u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u4e0a\u7ebf\u5bf9\u8c61 \u6d4b\u8bd5\u7ea7\u522b \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b ... 001 679537 L1 FUNC CICD C1 skip-XXX fixed-XXX removed-\u5df2\u5e9f\u5f03 ..."},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_4","title":"2\u3001\u64cd\u4f5c\u6b65\u9aa4","text":"2.1\u3001\u5728\u5b50\u9879\u76ee\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u4ee5\u7528\u4f8b\u7684 py \u6587\u4ef6\u9664\u53bb\u9996\u5b57\u7b26\u4e32 \"test_\" \u548c\u7528\u4f8b\u5e8f\u53f7\u540e\u7684\u5b57\u7b26\u4e32\u4f5c\u4e3a csv \u7684\u6587\u4ef6\u540d\u3002 \u4f8b\u5982: \u76f8\u518c\u7684\u7528\u4f8b\u6587\u4ef6\u4e3a test_album_xxx.py\uff0cxxx \u8868\u793a\u4efb\u610f\u4e09\u4f4d\u6570\u5b57\u4ee3\u8868\u7528\u4f8b\u5e8f\u53f7\uff0c\u6b64\u65f6 csv \u6587\u4ef6\u540d\u5c31\u5e94\u4e3a album.csv\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u6240\u6709 csv \u6587\u4ef6\u5efa\u8bae\u653e\u5728\u4e00\u4e2a tags \u76ee\u5f55\u4e0b\u3002 \u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 2.2\u3001\u7b2c\u4e00\u5217\u4e3a\u811a\u672c ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b\u7528\u4f8b\u6807\u7b7e\u53ef\u4ee5\u65e0\u5e8f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_2","title":"3\u3001\u589e\u52a0\u8bf4\u660e","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_1","title":"3.1\u3001\u8df3\u8fc7\u7528\u4f8b","text":"\u4f20\u7edf\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668(@pytest.mark.skip)\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a; \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#311","title":"3.1.1\u3001\u56fa\u5b9a\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u7b7e\u5f00\u5934\u4e3a \u201cskip-XXX\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\uff0c\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\u5219\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u7b7e\u4e3a SKIPED\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#312","title":"3.1.2\u3001\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skipif_platform-aarch64&mips64 \u67d0\u4e9b\u7528\u4f8b\u4f1a\u56e0\u4e3a\u4e0d\u540c\u7684\u73af\u5883\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\uff0c\u5e38\u89c1\u7684\u573a\u666f\u4e3a\u5728\u4e0d\u540c\u67b6\u6784\u4e0a\u5224\u65ad\u662f\u5426\u6267\u884c\uff0c\u8df3\u8fc7\u7684\u539f\u56e0\u6807\u7b7e\u4e3a \u201cskipif_platform-\u201d \u52a0\u67b6\u6784\u540d\uff0c\u591a\u4e2a\u67b6\u6784\u4e4b\u95f4\u4f7f\u7528 \u201c&\u201d \u62fc\u63a5\uff1b \u4ee5\u4e0a\u4f8b\u5b50\u4e3a\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u5224\u65ad\u5f53\u524d\u67b6\u6784\u662f\u5426\u4e3a arrch64 \u6216\u8005 mips64\uff0c\u82e5\u662f\uff0c\u5219\u8df3\u8fc7\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u82e5\u5426\u5219\u6267\u884c\u7528\u4f8b\uff1b \u76ee\u524d\u6846\u67b6\u9ed8\u8ba4\u4ec5\u652f\u6301\u67b6\u6784\u7684\u6761\u4ef6\u5224\u65ad\uff0c\u4f46\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u903b\u8f91\u652f\u6301\u81ea\u5b9a\u4e49\u6dfb\u52a0\u3002 \u5728\u9879\u76ee\u76ee\u5f55\u8def\u5f84\u4e0b\u5b58\u5728\u6587\u4ef6 setting/skipif.py\uff0c\u6240\u6709\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u7684\u51fd\u6570\u5199\u5728\u6b64\u6587\u4ef6\u4e2d\u3002 \u9ed8\u8ba4\u67b6\u6784\u5224\u65ad\u4f8b\u5b50\uff1a def skipif_platform(args: str):\n\"\"\"\u5e73\u53f0\u8df3\u8fc7\"\"\"\n_skip_key = args.split(\"&\")\nfor key in _skip_key:\nif GlobalConfig.SYS_ARCH == key:\nreturn True\nreturn False\n \u65b9\u6cd5\u7f16\u5199\u89c4\u8303\uff1a \u65b9\u6cd5\u540d\u5fc5\u987b\u4ee5 skipif \u5f00\u5934\uff1b \u65b9\u6cd5\u5fc5\u987b\u6709\u8fd4\u56de\u7ed3\u679c\u5e76\u4e14\u4e3a\u5e03\u5c14\u503c\uff08True \u4ee3\u8868\u8df3\u8fc7\uff0cFalse \u4ee3\u8868\u4e0d\u8df3\u8fc7\uff09\uff1b \u65b9\u6cd5\u53ea\u80fd\u6709\u4e00\u4e2a\u5165\u53c2\uff1b \u5728 csv \u6587\u4ef6\u8df3\u8fc7\u539f\u56e0\u4e00\u680f\u4e2d\u586b\u5199\u4e3a \u201c{\u51fd\u6570\u540d}-{\u53c2\u6570}\u201d\uff0c\u4f8b\u5982\uff1askipif_platform-aarch64\uff1b\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u4f1a\u4ee5\u7b2c\u4e00\u4e2a \u201c-\u201d \u8fdb\u884c\u5206\u5272\uff0c\u622a\u53d6\u7684\u5de6\u4fa7\u5b57\u7b26\u4e32\u4f5c\u4e3a\u51fd\u6570\u540d\uff0c\u5728 skipif.py \u6587\u4ef6\u4e2d\u67e5\u627e\u662f\u5426\u6709\u540c\u540d\u51fd\u6570\uff0c\u5e76\u5c06\u622a\u53d6\u7684\u53f3\u4fa7\u4f5c\u4e3a\u53c2\u6570\u4f20\u9012\u7ed9\u8be5\u51fd\u6570\uff0c\u901a\u8fc7\u83b7\u53d6\u8be5\u51fd\u6570\u8fd4\u56de\u7684\u5e03\u5c14\u503c\uff0c\u8fd4\u56de True\uff0c\u5219\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u8fd4\u56de False\uff0c\u5219\u6267\u884c\u8be5\u7528\u4f8b\u3002 \u82e5\u51fd\u6570\u9700\u8981\u591a\u4e2a\u53c2\u6570\uff0c\u53ef\u81ea\u5b9a\u4e49\u591a\u4e2a\u53c2\u6570\u4e4b\u95f4\u7684\u8fde\u63a5\u7b26\uff0c\u8fde\u63a5\u7b26\u53f7\u4e0d\u53ef\u4f7f\u7528\u4e0b\u5212\u7ebf\u548c\u9017\u53f7\uff0c\u63a8\u8350\u7edf\u4e00\u4f7f\u7528 & \u7b26\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32","title":"3.2\u3001\u786e\u8ba4\u4fee\u590d","text":"\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7528\u4f8b\u4fee\u590d\u540e\uff0c\u4f46\u4e0d\u80fd\u7acb\u5373\u5220\u9664\u8df3\u8fc7\u539f\u56e0\uff08skip-XXX\uff09\u7684\u7528\u4f8b\uff0c\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u786e\u8ba4\u4fee\u590d\u201d\uff0c\u4f5c\u4e3a\u6807\u8bb0\u8be5\u7528\u4f8b\u662f\u5426\u5df2\u7ecf\u4fee\u590d\uff0c\u56fa\u5b9a\u586b\u5165\u5b57\u6bb5\u4e3a \u201cfixed-\u5df2\u4fee\u590d\u201d\u3002\u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u5373\u4f7f\u540c\u65f6\u6807\u8bb0\u4e86 skip-XXX \u4e5f\u4f1a\u6b63\u5e38\u6267\u884c\u3002 \u793a\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d \u3010\u540c\u65f6\u6807\u8bb0\u4e86skip \u548c fixed\uff0c\u4f46\u4ecd\u7136\u60f3\u8981\u8df3\u8fc7\u7528\u4f8b\u3011 \u5f53 \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u540c\u65f6\u586b\u5165\u540e\uff0c\u547d\u4ee4\u884c\u4f20\u9012\u53c2\u6570 --ifixed yes\uff0c\u5219\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\u8be5\u6761\u7528\u4f8b\u3002 python3 manage.py run --ifixed yes\n \u770b\u5230\u8fd9\u91cc\u6709\u4e9b\u540c\u5b66\u53ef\u80fd\u8981\u95ee\u4e86\uff0c\u6211\u60f3\u6062\u590d\u8df3\u8fc7\u6267\u884c\uff0c\u76f4\u63a5\u628a skip-XXX \u8fd9\u4e00\u5217\u6807\u7b7e\u5220\u6389\u4e0d\u5c31\u597d\u4e86\uff0c\u8fd8\u641e\u4ec0\u4e48\u786e\u8ba4\u4fee\u590d\u5e72\u5565\uff1f \u8fd9\u91cc\u7ed9\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u89e3\u91ca\u4e00\u4e0b\uff1a \uff08\u4ee5\u4e0b\u6d41\u6c34\u7ebf\u6307\u7684\u662f\u6bcf\u65e5\u6784\u5efa\u7684\u6d41\u6c34\u7ebf\uff0c\u8dd1 AT \u7684\u5168\u91cf\u7528\u4f8b\uff09 \u9996\u5148\uff0c\u6d41\u6c34\u7ebf\u4e0a\u8dd1\u7684\u662f AT \u5386\u53f2 Tag\uff0c\u8df3\u8fc7\u7528\u4f8b\u7684\u6807\u7b7e(skip-XXX) \u662f\u5728\u6700\u65b0\u7684\u4ee3\u7801\u4e0a\u63d0\u4ea4\u7684\uff0c\u6211\u4eec\u91c7\u7528\u6700\u65b0\u7684 csv \u6587\u4ef6\u8986\u76d6\u5386\u53f2 csv \u6587\u4ef6\u7684\u8bbe\u8ba1\u6765\u5b9e\u73b0\u4e86\u5bf9\u5386\u53f2 Tag \u4e0a\u7528\u4f8b\u7684\u8df3\u8fc7\uff1b \u7136\u540e\uff0c\u5728\u65e5\u5e38\u8df3\u8fc7\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u540c\u65f6\u4e5f\u5728\u4fee\u590d\u4e00\u4e9b\u7528\u4f8b\uff0c\u4fee\u590d\u540e\u7684\u8fd9\u4e9b\u7528\u4f8b\u5728\u672c\u5730\u8c03\u8bd5\u7684\u65f6\u5019\u6211\u4eec\u4e0d\u5e0c\u671b\u7ee7\u7eed\u8df3\u8fc7\uff0c\u4f46\u662f\u6b64\u65f6\uff0c\u4fee\u590d\u7684\u8fd9\u4e9b\u7528\u4f8b\u53ef\u80fd\u8fd8\u4e0d\u7a33\u5b9a\uff0c\u4e0d\u9002\u5408\u9a6c\u4e0a\u653e\u5230\u6d41\u6c34\u7ebf\u53bb\u8dd1\uff0c\u4e5f\u5c31\u662f\u8bf4\u6d41\u6c34\u7ebf\u4e0a\u6211\u4eec\u662f\u5e0c\u671b\u4ed6\u7ee7\u7eed\u8df3\u8fc7\u7684\uff0c\u56e0\u6b64\uff0c\u54b1\u4e0d\u80fd\u76f4\u63a5\u628a skip-XXX \u5e72\u6389\uff1b \u8fd9\u91cc\u5c31\u77db\u76fe\u4e86\uff0c\u4e00\u4e2a\u9700\u6c42\u662f\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u53e6\u4e00\u4e2a\u9700\u6c42\u53c8\u4e0d\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u600e\u4e48\u529e\u5462\uff1f \u6211\u4eec\u4f7f\u7528\u201c\u786e\u8ba4\u4fee\u590d\u201d\u6765\u6807\u8bb0\u8fd9\u6761\u7528\u4f8b\u5df2\u7ecf\u4fee\u590d\u4e86\uff0c\u8fd9\u6837\u4f60\u672c\u5730\u8c03\u8bd5\u7528\u4f8b\u7684\u65f6\u5019\u8fd9\u6761\u5df2\u4fee\u590d\u7684\u7528\u4f8b\u662f\u4f1a\u6267\u884c\u7684\uff0c\u540c\u65f6\u5728\u6d41\u6c34\u7ebf\u4e0a\u5c06 --ifixed yes \u53c2\u6570\u52a0\u4e0a\uff0c\u90a3\u4e48\u6d41\u6c34\u7ebf\u4e0a\u6267\u884c\u65f6\u8fd9\u6761\u7528\u4f8b\u4ecd\u7136\u662f\u8df3\u8fc7\u7684\u72b6\u6001\uff0c\u540e\u7eed\u4f60\u6253 Tag \u7684\u65f6\u5019\uff0c\u628a \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u7684\u6807\u7b7e\u5168\u90e8\u5220\u6389\u5c31\u53ef\u4ee5\u4e86\u3002 \u8fd9\u5c31\u662f\u201c\u786e\u8ba4\u4fee\u590d\u201d\u8fd9\u4e2a\u6807\u7b7e\u7684\u80cc\u666f\uff0c\u9700\u8981\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u54c1\u4e00\u54c1\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#33","title":"3.3\u3001\u5e9f\u5f03\u7528\u4f8b","text":"\u9488\u5bf9\u67d0\u4e9b\u7528\u4f8b\uff0c\u7531\u4e8e\u9700\u6c42\u53d8\u66f4\uff0c\u73af\u5883\u5f71\u54cd\u6216\u8bc4\u4f30\u4e0d\u518d\u9002\u7528\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u65f6\uff0c\u7528\u4f8b\u9700\u8981\u5e9f\u5f03\uff0c\u5219\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u5e9f\u5f03\u7528\u4f8b\u201d\uff0c\u8be5\u5217\u5b58\u5728 \u201cremoved-{\u5e9f\u5f03\u539f\u56e0}\u201d\uff0c\u5219\u7528\u4f8b\u4e0d\u4f1a\u6267\u884c\u3002 \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d removed-\u5df2\u5e9f\u5f03 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_2","title":"4\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u4e0a\u9762\u4ecb\u7ecd Pytest \u6846\u67b6\u63d0\u4f9b\u7684\u6807\u7b7e\u529f\u80fd mark\uff0c\u4f7f\u7528\u65f6\u9700\u8981\u4e3a\u6bcf\u4e00\u4e2a\u7528\u4f8b\u6dfb\u52a0\u6807\u7b7e\u88c5\u9970\u5668\uff0c\u5219\u64cd\u4f5c\u590d\u6742\uff0c\u53ef\u7ef4\u62a4\u6027\u5dee\uff0c\u5176\u6839\u672c\u95ee\u9898\u5c31\u662f\u6807\u7b7e\u5206\u6563\u5728\u6bcf\u4e00\u6761\u7528\u4f8b\u7684\u88c5\u9970\u5668\u4e0a\uff0c\u96be\u4ee5\u96c6\u4e2d\u7ef4\u62a4\uff1b\u4e8e\u662f\u4e4e\u5c06\u6240\u6709\u6807\u7b7e\u4f7f\u7528 csv \u6587\u4ef6\u8fdb\u884c\u96c6\u4e2d\u7ba1\u7406\uff0c\u5e76\u901a\u8fc7 Pytest \u7684\u94a9\u5b50\u51fd\u6570\uff0c\u8bfb\u53d6 csv \u6587\u4ef6\uff0c\u52a8\u6001\u6dfb\u52a0\u6807\u7b7e\u5230\u7528\u4e2d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5csv","title":"5\u3001CSV\u6587\u4ef6\u683c\u5f0f","text":"\u6b64\u914d\u7f6e\u6587\u4ef6\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u6807\u7b7e\u6570\u636e\uff0c\u4e14\u8981\u65b9\u4fbf\u80fd\u4f7f\u7528Excel\u6253\u5f00\u8fdb\u884c\u7f16\u8f91\u67e5\u770b\uff0c\u66f4\u91cd\u8981\u7684\u662f\u6211\u4eec\u4e0d\u60f3\u5f15\u5165\u4e09\u65b9\u4f9d\u8d56\uff0cCSV \u6587\u4ef6\u51e0\u4e4e\u662f\u552f\u4e00\u80fd\u6ee1\u8db3\u6240\u6709\u7684\u8981\u6c42\u7684\u6587\u4ef6\u683c\u5f0f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_6","title":"\u4e03\u3001\u65e5\u5fd7\u7cfb\u7edf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_5","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e YouQu \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u64cd\u4f5c\u65b9\u6cd5\u5c01\u88c5\u5199\u6cd5\uff0c\u901a\u5e38\u662f\u8fd9\u6837\u7684\uff1a\u7c7b\u91cc\u9762\u4e00\u4e2a\u51fd\u6570\u53ea\u5305\u542b\u4e00\u4e2a\u64cd\u4f5c\u6216\u591a\u6b21\u8c03\u7528\u7684\u4e00\u7cfb\u5217\u53ef\u5408\u5e76\u7684\u64cd\u4f5c\uff1b \u4f20\u7edf\u7684\u65e5\u5fd7\u8f93\u51fa\u65b9\u5f0f\uff0c\u9700\u8981\u5728\u6bcf\u4e2a\u51fd\u6570\u91cc\u9762\u4e3b\u52a8\u7f16\u5199\u65e5\u5fd7\u8f93\u51fa\u4ee3\u7801 \uff0c\u4f8b\u5982\uff1a class XXXWidget:\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\nlogger.info(\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\")\n...\n# \u7701\u7565\u4ee3\u7801\u90e8\u5206\n \u4e00\u4e2a\u51fd\u6570\u91cc\u9762\u81f3\u5c11\u5305\u542b\u4e00\u6761\u65e5\u5fd7\u4fe1\u606f\uff0c\u5982\u679c\u6bd4\u8f83\u590d\u6742\u64cd\u4f5c\u6b65\u9aa4\uff0c\u53ef\u80fd\u5305\u542b\u591a\u6761\u65e5\u5fd7\u4fe1\u606f\uff1b \u4e00\u4e2a\u5e94\u7528\u542b\u6709\u5927\u91cf\u7684\u64cd\u4f5c\u51fd\u6570\uff0c\u4e5f\u5c31\u662f\u8bf4\u6211\u4eec\u9700\u8981\u5199\u5927\u91cf\u7684\u65e5\u5fd7\u4ee3\u7801\uff1b \u901a\u8fc7\u7ecf\u9a8c\u89c2\u5bdf\uff0c\u6211\u4eec\u53d1\u73b0\uff0c\u51fd\u6570\u8bf4\u660e\u4ee5\u53ca\u51fd\u6570\u64cd\u4f5c\u65e5\u5fd7\uff0c\u5177\u6709\u8f83\u9ad8\u7684\u91cd\u590d\u5ea6\uff08\u4ece\u4e0a\u9762\u7684\u4f8b\u5b50\u4e5f\u53ef\u4ee5\u770b\u51fa\u6765\uff09\uff0c\u56e0\u6b64\u6211\u4eec\u5927\u80c6\u7684\u8bbe\u60f3\uff0c\u80fd\u4e0d\u80fd\u57fa\u4e8e\u6846\u67b6\u6267\u884c\u65f6\uff0c\u81ea\u52a8\u7684\u5c06\u51fd\u6570\u8bf4\u660e\u4f5c\u4e3a\u65e5\u5fd7\u6253\u5370\u51fa\u6765\uff0c\u4ece\u800c\u51cf\u5c11\u5927\u91cf\u65e5\u5fd7\u4ee3\u7801\u91cf\u548c\u91cd\u590d\u7f16\u5199\uff0c\u90a3\u771f\u662f\u5999\u554a~\u3002 \u57fa\u4e8e\u6b64\u201c\u5929\u771f\u201d\u7684\u60f3\u6cd5\uff0c\u6211\u4eec\u8bbe\u8ba1\u51fa\u4e86 youqu \u7684\u65e5\u5fd7\u7cfb\u7edf\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_5","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u6838\u5fc3\u539f\u7406\uff1a \u901a\u8fc7\u7ed9\u7c7b\u52a0\u4e0a\u4e00\u4e2a\u88c5\u9970\u5668 @log\uff0c\u52a8\u6001\u7ed9\u8be5\u7c7b\u4e0b\u6240\u6709\u7684\u51fd\u6570\u53ca\u7236\u7c7b\u51fd\u6570\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668 @_trace\uff0c\u5728\u6b64\u88c5\u9970\u5668\u4e2d\u6211\u4eec\u80fd\u52a8\u6001\u7684\u6355\u83b7\u6240\u8c03\u7528\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff08func.__doc__\uff09\uff0c\u901a\u8fc7\u65e5\u5fd7\u8f93\u51fa\u5668\u5c06\u5176\u8f93\u51fa\u5373\u53ef\u3002 \u5b9e\u73b0\u6b65\u9aa4\uff1a \u901a\u8fc7 inspect.getmembers \u83b7\u53d6\u88ab\u88c5\u9970\u7684\u7c7b\u4e0b\u6240\u6709\u51fd\u6570\uff0c\u5305\u542b\u9759\u6001\u65b9\u6cd5\uff0c\u7c7b\u65b9\u6cd5\uff0c\u5b9e\u4f8b\u65b9\u6cd5\uff1b \u901a\u8fc7 setattr(\u7c7b, \u65b9\u6cd5, _trace\uff09 \u7684\u65b9\u5f0f\uff0c\u7ed9\u7b26\u5408\u6761\u4ef6\u7684\u51fd\u6570\uff0c\u52a8\u6001\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_3","title":"3\u3001\u65e5\u5fd7\u914d\u7f6e","text":"[log_cli]\n;\u65e5\u5fd7\u76f8\u5173\u914d\u7f6e\uff08\u4e0d\u6253\u5370\u6784\u9020\u51fd\u6570\u548c\u9b54\u6cd5\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff09\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = INFO\n# ============= \u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u914d\u7f6e ================\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u5f00\u5934\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7, \u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_STARTSWITH = Assert\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u7ed3\u5c3e\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_ENDSWITH = Widget\n;\u652f\u6301\u7c7b\u540d\u5305\u542b xxx \u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_CONTAIN = ShortCut\n# ==============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_3","title":"4\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u5728\u5e94\u7528\u5e93 widget \u65b9\u6cd5\u5e93\u91cc\u9762\uff0c\u53ea\u9700\u8981\u5728\u51fa\u53e3\u6587\u4ef6\u52a0\u4e0a\u7c7b\u88c5\u9970\u5668\uff0c\u5c31\u53ef\u4ee5\u5b9e\u73b0\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u4e86\uff1b # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6ce8\u610f\uff0c\u662f\u7c7b\u88c5\u9970\u5668\u3002 \u5b9e\u4f8b\uff1a # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\n@classmethod\ndef find_dfm_image(cls, *elements, multiple=False, rate=0.9):\n\"\"\"\n \u67e5\u627e\u56fe\u7247 {{elements}}.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e {{rate}} \u7684\u5750\u6807\n :param elements:\n :param multiple:\n :return:\n \"\"\"\nelement = tuple(map(lambda x: f\"{Config.PIC_RES_PATH}/{x}\", elements))\nreturn cls.find_image(*element, multiple=multiple)\n \u8c03\u7528\u65b9\u6cd5\u65f6\uff1a DfmWidget.find_dfm_image(\"dfm_001\")\n \u81ea\u52a8\u8f93\u51fa\u7684\u65e5\u5fd7\uff1a >> x86_64-uos-6: 02/28 17:48:47 | INFO | logger_utils: [find_dfm_image]: \u67e5\u627e\u56fe\u7247 dfm_001.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e 0.9 \u7684\u5750\u6807\n \u52a0\u4e0a\u88c5\u9970\u5668 @log \u4e4b\u540e\uff0c\u65b9\u6cd5\u5c42\u6240\u6709\u7684\u51fd\u6570\uff08\u5305\u62ec\u5b9e\u4f8b\u65b9\u6cd5\u3001\u7c7b\u65b9\u6cd5\u3001\u9759\u6001\u65b9\u6cd5\uff09\u90fd\u4e0d\u9700\u8981\u518d\u5199\u65e5\u5fd7\u4ee3\u7801\uff0c\u6267\u884c\u7684\u65f6\u5019\u4f1a\u81ea\u52a8\u8f93\u51fa\uff0c\u5e76\u4e14\u6240\u6709\u8c03\u7528\u7684\u65b9\u6cd5\u4f1a\u4ee5 allure.step \u7684\u65b9\u5f0f\uff0c\u5c55\u793a\u5728 allure \u62a5\u544a\u4e2d\uff0c\u5728\u62a5\u544a\u4e2d\u66f4\u80fd\u4e00\u76ee\u4e86\u7136\u7684\u770b\u5230\u7528\u4f8b\u6267\u884c\u6b65\u9aa4\u3002 \u3010\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\u3011 \u901a\u8fc7\u89c2\u5bdf\u524d\u9762\u7684\u4f8b\u5b50\uff0c\u7ec6\u5fc3\u7684\u540c\u5b66\u53ef\u80fd\u8fd8\u53d1\u73b0\u4e86\u4e00\u4e2a\u5c0f\u7ec6\u8282\uff1a\u51fd\u6570\u529f\u80fd\u8bf4\u660e\u4e2d\uff0c\u4e24\u5bf9\u5927\u62ec\u53f7\u4e2d\u7684\u5185\u5bb9 {{elements}} \u4f5c\u4e3a\u53d8\u91cf\u8f93\u51fa\u51fa\u6765\u4e86\uff1b \u6ca1\u9519\uff0c\u8fd9\u5c31\u662f\u6211\u4eec\u53c2\u8003Django \u548c jinja2 \u7684\u6a21\u677f\u8bed\u6cd5\u8bbe\u8ba1\u51fa\u7684\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\uff0c\u4f7f\u7528\u65b9\u6cd5\u5f88\u7b80\u5355\uff0c\u7528\u4e24\u5bf9\u5927\u62ec\u53f7\u628a\u51fd\u6570\u7684\u53c2\u6570\u62ec\u8d77\u6765\uff0c\u8fd9\u6837\u5728\u65e5\u5fd7\u8f93\u51fa\u7684\u65f6\u5019\u5c31\u80fd\u628a\u8c03\u7528\u51fd\u6570\u65f6\u53c2\u6570\u7684\u503c\u8f93\u51fa\u51fa\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_7","title":"\u516b\u3001\u73af\u5883\u90e8\u7f72","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_6","title":"1\u3001\u539f\u5219","text":"YouQu \u7684\u73af\u5883\u4f9d\u8d56\u4e00\u76f4\u575a\u6301 2 \u4e2a\u539f\u5219\uff1a \u6700\u5c0f\u73af\u5883\u4f9d\u8d56\u539f\u5219 \u6709\u4e9b\u540c\u5b66\u5199\u4e00\u4e9b\u529f\u80fd\uff0c\u9996\u5148\u60f3\u5230\u7684\u5c31\u662f\u53bb\u641c\u7d22\u5f15\u64ce\u641c\u4e00\u4e0b\uff0c\u770b\u6709\u6ca1\u6709\u73b0\u6210\u7684\u5de5\u5177\u6216\u8005\u4ee3\u7801\u76f4\u63a5\u80fd\u7528\uff0c\u7f8e\u5176\u540d\u66f0\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\uff0c\u522b\u4eba\u5df2\u7ecf\u9020\u597d\u4e86\u8f6e\u5b50\u54b1\u4eec\u5c31\u4e0d\u8981\u91cd\u590d\u53bb\u9020\u4e86\uff0c\u7136\u540e\u4e00\u5207\u4f3c\u4e4e\u90fd\u53d8\u5f97\u90a3\u4e48\u7684\u7406\u6240\u5e94\u5f53\u3002 \u5f53\u7136\u8fd9\u6837\u505a\u65e0\u53ef\u539a\u975e\uff0c\u6211\u76f8\u4fe1\u6709\u8fd9\u6837\u60f3\u6cd5\u5e76\u4e14\u4e00\u76f4\u8df5\u884c\u8fd9\u6837\u505a\u6cd5\u7684\u540c\u5b66\u4e0d\u5728\u5c11\u6570\uff0c\u4f46\u8fd9\u6837\u505a\u6709\u4e00\u4e2a\u5f88\u4e25\u91cd\u7684\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f60\u5199\u4e00\u4e2a\u5927\u578b\u9879\u76ee\u65f6\uff0c\u4f60\u4f1a\u5f15\u5165\u975e\u5e38\u975e\u5e38\u975e\u5e38\u591a\u7684\u4f9d\u8d56\uff0c\u6bd4\u5982\u8981\u505a\u4e2a\u63a5\u53e3\u8bf7\u6c42\u8981\u7528 requests\u3001\u8bfb\u5199\u4e2a\u6570\u636e\u7528 pandas\u3001\u5199\u4e2a\u8868\u683c\u7528 pyopenxl\u3001\u89e3\u6790\u4e2a\u6587\u672c\u8981\u7528\u8fd9\u4e2a\u90a3\u4e2a\u4e09\u65b9\u5e93 ... \u3002 \u6211\u8ba4\u4e3a\u8fd9\u662f\u975e\u5e38\u4e0d\u597d\u7684\u4e60\u60ef\uff0c\u5728\u5b9e\u73b0\u4e00\u4e2a\u529f\u80fd\u7684\u65f6\u5019\uff0c\u9996\u5148\u6211\u4eec\u5e94\u8be5\u53bb\u60f3\u81ea\u5df1\u600e\u4e48\u6837\u53bb\u5b9e\u73b0\uff0c\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff1b \u5982\u679c\u4f60\u4e0d\u4f1a\uff0c\u4f60\u53ef\u4ee5\u53bb\u5b66\u4e60\u4e09\u65b9\u5e93\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u522b\u4eba\u4e09\u65b9\u5e93\u4e5f\u662f\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\u7684\uff0c\u4e3a\u4ec0\u4e48\u54b1\u4eec\u4e0d\u884c\u5462\uff1b\u5982\u679c\u522b\u4eba\u7684\u4f60\u5b9e\u5728\u662f\u770b\u4e0d\u61c2\uff0c\u60f3\u5c3d\u4e00\u5207\u529e\u6cd5\u786e\u5b9e\u505a\u4e0d\u51fa\u6765\uff0c\u90a3\u518d\u8003\u8651\u5f15\u5165\u8fd9\u4e2a\u4e09\u65b9\u5e93\uff0c\u6211\u8ba4\u4e3a\u8fd9\u6837\u662f\u6ca1\u95ee\u9898\u7684\uff0c\u6bd5\u7adf\u54b1\u4eec\u6bb5\u4f4d\u8fd8\u4e0d\u591f\uff0c\u4f46\u5e0c\u671b\u5c06\u6765\u6709\u4e00\u5929\u6211\u4eec\u53ef\u4ee5\u3002 \u8fd9\u6837\u7684\u505a\u6cd5\u624d\u5e94\u8be5\u662f\u201c\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\u201d\u6b63\u786e\u7684\u64cd\u4f5c\u3002\u4e0d\u4f1a\u6ca1\u5173\u7cfb\uff0c\u770b\u770b\u522b\u4eba\u662f\u600e\u4e48\u5b9e\u73b0\u7684\uff0c\u81ea\u5df1\u518d\u6478\u7d22\u7740\u5199\u51fa\u6765\uff0c\u8fd9\u6837\u81ea\u5df1\u624d\u80fd\u6709\u6240\u63d0\u9ad8\uff0c\u4e0d\u7136\u4f60\u5c31\u53ea\u4f1a\u7528\u522b\u4eba\u7684\u4e1c\u897f\uff1b\u90a3\u4e9b\u5632\u7b11\u3001\u6279\u8bc4\u6211\u4eec\u91cd\u590d\u9020\u8f6e\u5b50\u7684\u4eba\uff0c\u5148\u60f3\u60f3\u81ea\u5df1\u4f1a\u9020\u8f6e\u5b50\u5417\u3002 \u672c\u7740\u81ea\u5df1\u5b9e\u73b0\u80fd\u5b9e\u73b0\u7684\u4e00\u5207\u7684\u539f\u5219\uff0cYouQu \u6846\u67b6\u505a\u5230\u4e86\u975e\u5e38\u5c11\u7684\u73af\u5883\u4f9d\u8d56\uff0c\u800c\u4e14\u6211\u4eec\u4ecd\u5728\u4e0d\u65ad\u52aa\u529b\uff0c\u51cf\u5c11\u73af\u5883\u90e8\u7f72\u7684\u4f9d\u8d56\u3002 \u6700\u5c0f\u4ed3\u5e93\u4f53\u79ef\u539f\u5219 \u5927\u6587\u4ef6\u4e0d\u80fd\u4e0a\u4f20\u5230\u5de5\u7a0b\u91cc\u9762\uff0c\u4fdd\u6301\u6574\u4e2a\u5de5\u7a0b\u7684\u8f7b\u91cf\u5316\uff0c\u8fd9\u6837\u5728\u514b\u9686\u4ee3\u7801\u7684\u65f6\u5019\u624d\u80fd\u975e\u5e38\u5feb\u901f\u65b9\u4fbf\u4f7f\u7528\uff0c\u6211\u4eec\u89c1\u8fc7\u4e00\u4e2a AT \u5de5\u7a0b clone \u5927\u5c0f\u8fbe\u5230\u597d\u51e0\u4e2a G\uff0c\u7b80\u76f4\u4e0d\u53ef\u601d\u8bae\u3002 \u5176\u5b9e\u4ee3\u7801\u6587\u4ef6\u7684\u5927\u5c0f\u662f\u5f88\u5c0f\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u7eaf\u5199\u4ee3\u7801\u968f\u4fbf\u5199\u5de5\u7a0b\u4e5f\u4e0d\u4f1a\u592a\u5927\uff0c\u800c\u6587\u6863\uff08\u5305\u542b\u63d2\u56fe\uff09\u7b49\u8d44\u6e90\u5374\u662f\u5f88\u5360\u7a7a\u95f4\u3002 \u56e0\u6b64\u6211\u4eec\u9009\u62e9\u5c06 YouQu \u7684\u6587\u6863\u5de5\u7a0b\u5355\u72ec\u8fc1\u51fa\u5230\u72ec\u7acb\u7684\u4ed3\u5e93 youqu-docs \u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_6","title":"2\u3001\u5b89\u88c5","text":"\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u8fd0\u884c env.sh \u5373\u53ef\u3002 bash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_4","title":"3\u3001\u5b9a\u5236\u4f9d\u8d56","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_2","title":"3.1\u3001\u65b0\u589e\u4f9d\u8d56","text":"\u5982\u679c\u5e94\u7528\u5e93\u8fd8\u9700\u8981\u5176\u4ed6 Python \u4f9d\u8d56\u5e93\uff0c\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a requirement.txt \u6587\u4ef6\uff1b autotest_xxx\n\u251c\u2500\u2500 requirement.txt\n\u251c\u2500\u2500 case ...\n \u91cc\u9762\u5199\u5165\u9700\u8981\u5b89\u88c5\u7684\u4e09\u65b9\u4f9d\u8d56\uff0c\u6bd4\u5982\u50cf\u8fd9\u6837\uff1a # requirement.txt\nPyYAML==6.0 # \u6307\u5b9a\u5b89\u88c5\u67d0\u4e2a\u7248\u672c\nrequests # \u672a\u6307\u5b9a\u7248\u672c\u5219\u5b89\u88c5\u6700\u65b0\u7248\n \u5728\u6267\u884c bash env.sh \u65f6\u4f1a\u4e00\u5e76\u5c06\u5176\u5b89\u88c5\u3002 \u5982\u679c\u591a\u4e2a\u5e94\u7528\u5e93\u90fd\u5b58\u5728 requirement.txt \u6587\u4ef6\uff0c\u6267\u884c env.sh \u65f6\u4f1a\u5c06\u591a\u4e2a requirement.txt \u6587\u4ef6\u4e00\u5e76\u52a0\u8f7d\uff1b\u90a3\u4e48\u4e00\u5b9a\u8981\u6ce8\u610f\u591a\u4e2a requirement.txt \u6587\u4ef6\u53ef\u80fd\u5b58\u5728\u76f8\u540c\u7684\u4f9d\u8d56\u88ab\u6307\u5b9a\u5b89\u88c5\u4e0d\u540c\u7248\u672c\u7b49\u7b49\u517c\u5bb9\u6027\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32_1","title":"3.2\u3001\u88c1\u526a\u4f9d\u8d56","text":"\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0c\u53ef\u80fd\u4f60\u53ea\u9700\u8981\u5b89\u88c5\u4e00\u4e9b\u6700\u6700\u57fa\u7840\u7684\u4f9d\u8d56\uff0c\u5176\u4ed6\u7684\u90fd\u4e0d\u9700\u8981\uff0c\u6bd4\u5982\u7eaf\u63a5\u53e3\u81ea\u52a8\u5316\u7684\u9879\u76ee\uff0c\u5b83\u4e0d\u9700\u8981 UI \u81ea\u52a8\u5316\u76f8\u5173\u7684\u4f9d\u8d56\u3002 \u4f60\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\uff0c\u5b58\u653e\u4e00\u4e2a BASICENV \u7684\u666e\u901a\u6587\u4ef6\uff0c\u91cc\u9762\u4e0d\u9700\u8981\u5199\u4efb\u4f55\u5185\u5bb9\uff0c\u8fd9\u6837\u6267\u884c env.sh \u65f6\uff0c\u53ea\u4f1a\u5b89\u88c5\u6700\u57fa\u7840\u7684\u4f9d\u8d56\u3002 autotest_xxx\n\u251c\u2500\u2500 BASICENV # \u53ef\u4ee5\u4f7f\u7528\uff1atouch BASICENV \u521b\u5efa\u6587\u4ef6\n\u251c\u2500\u2500 case ...\n \u57fa\u7840\u4f9d\u8d56\u4ec5\u5b89\u88c5\u4ee5\u4e0b\u51e0\u4e2a\u5305\uff1a pytest # pytest\npytest-rerunfailures # \u5931\u8d25\u91cd\u8dd1\u63d2\u4ef6\npytest-timeout # \u7528\u4f8b\u8d85\u65f6\u63d2\u4ef6\nallure-pytest # \u751f\u6210 allure \u62a5\u544a\u63d2\u4ef6\nallure.deb # allure \u62a5\u544a\u67e5\u770b\u5de5\u5177\n \u88c1\u526a\u4f9d\u8d56 \u548c \u65b0\u589e\u4f9d\u8d56 \u662f\u4e0d\u51b2\u7a81\u7684\uff0c\u53ef\u4ee5\u540c\u65f6\u4f7f\u7528\u3002 \u6b64\u65b9\u6848\u9ed8\u8ba4\u4e3a\u865a\u62df\u73af\u5883\u90e8\u7f72\uff0c\u5982\u679c\u4f60\u60f3\u76f4\u63a5\u90e8\u7f72\u5728\u672c\u673a\u4e0a\uff1a bash env_dev.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_8","title":"\u4e5d\u3001\u5931\u8d25\u5f55\u5c4f","text":"\u5f55\u5c4f\u5176\u5b9e\u662f\u4e00\u79cd\u89c6\u9891\u5f62\u5f0f\u7684\u65e5\u5fd7\uff0c\u56e0\u4e3a\u5f88\u591a\u65f6\u5019\u6211\u4eec\u5728\u67e5\u770b\u65e5\u5fd7\u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u51c6\u786e\u7684\u5b9a\u4f4d\u5230\u7528\u4f8b\u5931\u8d25\u7684\u5177\u4f53\u539f\u56e0\uff0c\u56e0\u6b64\u7528\u4f8b\u7684\u5f55\u5c4f\u80fd\u8ba9\u6211\u4eec\u770b\u5230\u7528\u4f8b\u5728\u6267\u884c\u8fc7\u7a0b\uff1b \u3010\u4f7f\u7528\u65b9\u6cd5\u3011 \u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u5173\u6ce8 2 \u4e2a\u53c2\u6570\uff1b ;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\u3002\n;\u6ce8\u610f\uff0c\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u4e0d\u80fd\u5c0f\u4e8e\u5931\u8d25\u5f55\u5c4f\u6b21\u6570\uff0c\u5373 RERUN >= RECORD_FAILED_CASE\nRECORD_FAILED_CASE = 1\n \u9ed8\u8ba4\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u662f 1 \u6b21\uff1b RECORD_FAILED_CASE = 1 \u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff1b RECORD_FAILED_CASE = 0 \u8868\u793a\u4e0d\u7ba1\u7528\u4f8b\u6210\u529f\u6216\u5931\u8d25\u90fd\u5f55\u5c4f\uff1b \u5f55\u5c4f\u662f\u8981\u5360\u7528\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u7279\u522b\u662f\u5728\u4e00\u4e9b\u914d\u7f6e\u8f83\u4f4e\u7684\u673a\u5668\u4e0a\u4f1a\u5f88\u660e\u663e\uff0c\u6240\u4ee5\u4f60\u9700\u8981\u8003\u8651\u662f\u5426\u6709\u5fc5\u8981\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1b \u4f7f\u7528 manage.py \u6267\u884c\u7528\u4f8b\u9ed8\u8ba4\u8bfb\u53d6\u5230 globalconfig.ini \u91cc\u9762\u7684\u53c2\u6570\uff0c\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report/record \u76ee\u5f55\u4e0b\u4fdd\u5b58\u5931\u8d25\u7528\u4f8b\u7684\u5f55\u5c4f\u548c\u65ad\u8a00\u7684\u90a3\u4e2a\u65f6\u95f4\u70b9\u7684\u622a\u5c4f\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7\u89c6\u9891\u6587\u4ef6\u770b\u5230\u5931\u8d25\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u90fd\u53d1\u751f\u4e86\u4ec0\u4e48\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#wayland","title":"\u5341\u3001Wayland \u9002\u914d","text":"Wayland \u4e0b\u81ea\u52a8\u5316\u4e3b\u8981\u95ee\u9898\u662f X11 \u4e0b\u7684\u952e\u9f20\u64cd\u4f5c\u65b9\u6cd5\u65e0\u6cd5\u4f7f\u7528\uff0c\u6bd4\u5982 Xdotool\u3001 PyAutoGUI\u3001Xwininfo \u7b49\u7b49\uff1b YouQu \u5728 Wayland \u4e0b\u517c\u5bb9\u9002\u914d\uff0cenv.sh \u5728 Wayland \u4e0b\u6267\u884c\u65f6\u4f1a\u5b89\u88c5\u81ea\u7814\u7684\u952e\u9f20\u64cd\u4f5c\u670d\u52a1\uff08\u53ef\u80fd\u5b58\u5728\u4e00\u4e9b\u4f9d\u8d56\u62a5\u9519\uff0c\u6309\u7167\u6ce8\u91ca\u89e3\u51b3\u5373\u53ef\uff09\uff0c\u6846\u67b6\u6838\u5fc3\u5e93\u4e5f\u9488\u5bf9\u6027\u7684\u505a\u4e86\u9002\u914d\uff0c\u4e0a\u5c42\u7528\u4f8b\u5b8c\u5168\u4e0d\u7528\u5173\u5fc3\u673a\u5668\u662fWayland \u8fd8\u662f X11\uff0c\u6846\u67b6\u4f1a\u6839\u636e\u6267\u884c\u65f6\u72b6\u6001\u81ea\u52a8\u5224\u65ad\u8d70\u4e0d\u540c\u7684\u903b\u8f91\uff1b \u7b80\u5355\u8bb2\u5c31\u662f\uff0c\u5e94\u7528\u5e93\u53ea\u9700\u8981\u7ef4\u62a4\u4e00\u5957\u7528\u4f8b\u811a\u672c\u5373\u53ef\u3002 \u3010\u7528\u4f8b\u517c\u5bb9\u3011 \u56e0\u4e3a Wayland \u4e0b\u6709\u4e9b\u5e94\u7528\u7684\u754c\u9762\u663e\u793a\u548c\u529f\u80fd\u672c\u8eab\u5b58\u5728\u4e00\u4e9b\u5dee\u5f02\uff0c\u7528\u4f8b\u5c42\u53ef\u80fd\u9700\u8981\u5bf9\u8fd9\u90e8\u5206\u7528\u4f8b\u505a\u903b\u8f91\u5224\u65ad\uff0c\u4f7f\u7528\u5168\u5c40\u914d\u7f6e\u91cc\u9762\u7684\u5e38\u91cf\u8fdb\u884c\u903b\u8f91\u7f16\u5199\u5373\u53ef\uff1a from setting.globalconfig import GlobalConfig\n# GlobalConfig.IS_WAYLAND \u83b7\u53d6\u5230\u5f53\u524d\u7684\u663e\u793a\u670d\u52a1\u5668\uff08bool\uff09\n# \u5e94\u7528\u5e93 Config \u7ee7\u627f GlobalConfig\nif Config.IS_WAYLAND:\npass\nif Config.IS_X11:\npass\n \u6bd4\u5982\u7528\u4f8b\u91cc\u9762\u5982\u679c\u65ad\u8a00\u7684\u56fe\u7247\u4e0d\u540c\uff1a if Config.IS_WAYLAND:\nself.assert_image_exist(\"wayland_XXX\")\nelse:\nself.assert_image_exist(\"x11_XXX\")\n \u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u811a\u672c\u5728 Wayland \u548c X11 \u4e0b\u90fd\u53ef\u4ee5\u8dd1\uff0cso easy \u662f\u4e0d\u662f\uff1f\u5b8c\u5168\u6ca1\u5fc5\u8981\u4e13\u95e8\u62c9\u65b0\u5206\u652f\u8fdb\u884c Wayland \u9002\u914d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_9","title":"\u5341\u4e00\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_7","title":"1. \u76ee\u5f55\u7ed3\u6784","text":"\u6267\u884c\u65f6\u4f1a\u5728\u6839\u76ee\u5f55\u4e0b\u52a8\u6001\u751f\u6210 report \u76ee\u5f55\uff0c\u6240\u6709\u7684\u62a5\u544a\u76f8\u5173\u7684\u6587\u4ef6\u4f1a\u7edf\u4e00\u5b58\u653e\u5728\u91cc\u9762\uff0c\u793a\u4f8b\uff1a /report\n \u251c\u2500\u2500 allure # allure\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json\n \u251c\u2500\u2500 allure_html # \u751f\u6210\u7684html\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 index.html \u251c\u2500\u2500 allure_back # allure\u62a5\u544a\u5907\u4efd\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 20221108114823\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json\n \u251c\u2500\u2500 json # json\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 result_deepin-music_20221109134736_1081333.json\n \u251c\u2500\u2500 logs # \u65e5\u5fd7\u6587\u4ef6\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 2022-11-10_debug.log \u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-10_error.log\n \u251c\u2500\u2500 record # \u5f55\u5c4f\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-09\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 15\u65f614\u520609\u79d2_test_music_303_2_autotest.mp4\n \u2514\u2500\u2500 xml # xml\u62a5\u544a\n\u2514\u2500\u2500 autotest_deepin_music-20221109134736.xml\n \u9ed8\u8ba4\u60c5\u51b5\u4e0b\u540c\u65f6\u751f\u6210 html\u3001xml\u3001json\u4e09\u79cd\u5f62\u5f0f\u7684\u62a5\u544a\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_7","title":"2. \u5b9a\u5236\u62a5\u544a","text":"\u6211\u4eec\u5bf9 allure \u62a5\u544a\u8fdb\u884c\u4e86\u4e00\u7cfb\u5217\u7684\u5b9a\u5236\uff1a \u5b9a\u5236 logo\u3001title\u3001\u62a5\u544a\u9ed8\u8ba4\u8bed\u8a00\u4e3a\u4e2d\u6587\uff1b \u52a0\u5165\u4e86\u7528\u4f8b\u65ad\u8a00\u5931\u8d25\u65f6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u4ee5\u53ca\u6b64\u65f6\u56fe\u50cf\u5bf9\u6bd4\u7684\u6a21\u677f\u56fe\u7247\uff1b \u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\uff0c\u4f60\u53ef\u4ee5\u5728 html \u62a5\u544a\u4e2d\u76f4\u63a5\u770b\u5f55\u5236\u7684\u89c6\u9891\uff1b \u52a0\u5165\u4e86 IP \u5730\u5740\u3001\u7cfb\u7edf\u4fe1\u606f\u3001\u955c\u50cf\u7248\u672c\u7b49\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_5","title":"3. \u67e5\u770b\u62a5\u544a","text":" \u672c\u5730\u6267\u884c \u5728 report/allure \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u4e00\u5806\u6587\u672c\u6587\u4ef6\uff0c\u8fd9\u4e9b\u662f allure \u63d2\u4ef6\u751f\u6210\u7684\u62a5\u544a\u6e90\u6570\u636e\uff0c\u6211\u4eec\u5728 report/allure_html \u76ee\u5f55\u4e0b\u7ed9\u4f60\u751f\u6210\u4e86 html \u6587\u4ef6\uff0c\u4f46\u662f\u4f60\u4e0d\u80fd\u76f4\u63a5\u901a\u8fc7\u6d4f\u89c8\u5668\u6253\u5f00 index.html \u6587\u4ef6\uff0c\u56e0\u4e3a allure \u7684\u62a5\u544a\u90fd\u662f\u57fa\u4e8e\u5728\u7ebf\u7684\u670d\u52a1\uff0c\u4f60\u5e94\u8be5\u8fd9\u6837\u6253\u5f00\uff1a allure open report/allure_html\n \u4f7f\u7528 manage.py \u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u5728\u7ec8\u7aef\u7684\u6700\u540e\u4e00\u884c\uff0c\u6211\u4eec\u4f1a\u7ed9\u4f60\u8f93\u51fa\u6253\u5f00\u62a5\u544a\u7684\u547d\u4ee4\uff0c\u76f4\u63a5\u590d\u5236\u5b83\u5728\u7ec8\u7aef\u6267\u884c\u5c31\u53ef\u4ee5\u67e5\u770b\u4e86\uff0c\u50cf\u8fd9\u6837\uff1a \u7ec8\u7aef\u6267\u884c\u547d\u4ee4: allure open /tmp/youqu/report/allure_html \u67e5\u770b\u62a5\u544a \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 Pycharm \u91cc\u9762\u627e\u5230 index.html \u6587\u4ef6\uff0c\u7136\u540e\u53f3\u952e\u9009\u62e9\u6d4f\u89c8\u5668\u6253\u5f00\uff0c\u6216\u8005\u4f60\u53ef\u4ee5\u7528\u4e00\u4e2a http \u670d\u52a1\u6253\u5f00\u3002 \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 report/allure \u76ee\u5f55\u4e0b\u67e5\u770b\u62a5\u544a\uff1a allure serve report/allure\n \u8fdc\u7a0b\u6267\u884c \u8fdc\u7a0b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\uff0c\u4f1a\u5c06\u6240\u6709\u8fdc\u7a0b\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u62a5\u544a\u90fd\u6536\u96c6\u5230 report/allure \u76ee\u5f55\u4e0b\uff0c\u5206\u522b\u6309\u7167\u673a\u5668\u7684 IP \u7b49\u5efa\u4e86\u4e0d\u540c\u7684\u76ee\u5f55\uff0c\u4f60\u53ef\u4ee5\u5728\u8fd9\u4e9b\u76ee\u5f55\u91cc\u9762\u53bb\u67e5\u770b\u5bf9\u5e94\u7684\u6d4b\u8bd5\u62a5\u544a\uff0c\u67e5\u770b\u65b9\u6cd5\u548c\u524d\u9762\u672c\u5730\u6267\u884c\u67e5\u770b\u7684\u65b9\u6cd5\u4e00\u6837\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_10","title":"\u5341\u4e8c\u3001\u9759\u6001\u4ee3\u7801\u626b\u63cf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_8","title":"1. \u63d0\u524d\u89e3\u51b3\u4ee3\u7801\u95ee\u9898","text":"\u4e3a\u4e86\u5e2e\u52a9\u5f00\u53d1\u8005\u7edf\u4e00\u4ee3\u7801\u98ce\u683c\uff0cPython \u793e\u533a\u63d0\u51fa\u4e86 PEP8 \u4ee3\u7801\u7f16\u7801\u98ce\u683c\uff0cPython \u5b98\u65b9\u540c\u65f6\u63a8\u51fa\u4e86\u4e00\u4e2a\u68c0\u67e5\u4ee3\u7801\u98ce\u683c\u662f\u5426\u7b26\u5408 PEP8 \u7684\u5de5\u5177\uff0c\u540d\u5b57\u4e5f\u53eb PEP8\u3002 \u4f46\u662f\uff0cPycharm \u91cc\u9762\u7684 PEP8 \u63d2\u4ef6\u5b9e\u9645\u4e0a\u5e76\u4e0d\u80fd\u53d1\u73b0\u5f88\u591a\u4ee3\u7801\u95ee\u9898\uff0c\u8fd9\u4e9b\u95ee\u9898\u5e76\u4e0d\u4f1a\u5728\u8fd0\u884c\u65f6\u62a5\u9519\uff0c\u56e0\u4e3a\u4ece Python \u8bed\u8a00\u89d2\u5ea6\u5e76\u4e0d\u5173\u5fc3\u8fd9\u4e9b\u95ee\u9898\uff0c\u5728 Pycharm \u7f16\u8f91\u5668\u91cc\u9762\u4f7f\u7528\u5feb\u6377\u952e ctrl + alt + L\uff0c\u6709\u4e00\u70b9\u70b9\u683c\u5f0f\u5316\u7684\u6548\u679c\uff0c\u80fd\u89e3\u51b3\u4e00\u4e9b\u7a7a\u683c\u3001\u6362\u884c\u7b49\u5c0f\u95ee\u9898\u3002 \u8fd9\u91cc\u63a8\u8350\u4e00\u4e2a Python \u793e\u533a\u6d41\u884c\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff1a Black\uff0c\u53f7\u79f0\u4e0d\u59a5\u534f\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff0c\u5b83\u68c0\u6d4b\u5230\u4e0d\u7b26\u5408\u89c4\u8303\u7684\u4ee3\u7801\u98ce\u683c\u76f4\u63a5\u5c31\u5e2e\u4f60\u5168\u90e8\u683c\u5f0f\u5316\u597d\uff0c\u5c31\u662f\u8fd9\u4e48\u521a\uff01 \u5b89\u88c5\uff1a sudo pip3 install black \n \u4f7f\u7528\u65b9\u6cd5\uff1a black ${CheckPath}\n \u4f7f\u7528\u8fd9\u4e2a\u5de5\u5177\u683c\u5f0f\u5316\u4e4b\u540e\uff0c\u4ee3\u7801\u4f1a\u88ab\u81ea\u52a8\u8c03\u6574\uff0c\u521a\u5f00\u59cb\u4f60\u53ef\u80fd\u4f1a\u89c9\u5f97\u8c03\u6574\u5f97\u5f88\u5938\u5f20\uff0c\u6ca1\u5173\u7cfb\u575a\u6301\u770b\uff0c\u4e60\u60ef\u4e4b\u540e\uff0c\u4f60\u4f1a\u89c9\u5f97\u5f88\u4f18\u96c5\uff0c\u6ca1\u9519\uff0c\u8fd9\u5c31\u662f Pythonic Code \u7684\u6838\u5fc3\uff0c\u8bf7\u4fdd\u6301\u4f18\u96c5\uff5e\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_8","title":"2. \u4ee3\u7801\u626b\u63cf\u5de5\u5177","text":"\u4f7f\u7528\u6839\u76ee\u5f55\u4e0b pylint.sh \u626b\u63cf\u4ee3\u7801\uff0c\u5728 report \u76ee\u5f55\u4e0b\u67e5\u770b\u4ee3\u7801\u626b\u63cf\u62a5\u544a\uff0c\u5982\u679c\u6709\u4ee3\u7801\u95ee\u9898\u8bf7\u63d0\u524d\u89e3\u51b3\u4e4b\u540e\u518d\u63d0\u4ea4\u3002 \u6b64\u811a\u672c\u5df2\u7ecf\u4f7f\u7528 Python \u793e\u533a\u6700\u6d41\u884c\u7684\u4ee3\u7801\u626b\u63cf\u5de5\u5177 Pylint \u8fdb\u884c\u4ee3\u7801\u626b\u63cf\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a bash pylint.sh\n \u8fd0\u884c\u4e4b\u540e\u4f1a\u63d0\u793a\u4f60\u8981\u626b\u63cf\u7684\u76ee\u5f55\uff0c\u6bd4\u5982\u8f93\u5165 apps \uff0c\u5219\u4f1a\u626b\u63cf apps \u4e0b\u7684\u6240\u6709 Python \u4ee3\u7801\u3002 \u5728 setting/pylintrc.cfg \u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u76f8\u5173\u914d\u7f6e\uff0c\u626b\u63cf\u5b8c\u6210\u4e4b\u540e\u5728 report/pylints \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u626b\u63cf\u62a5\u544a\u3002 \u4ee3\u7801\u63d0\u4ea4\u9700\u901a\u8fc7 git review \u63d0\u4ea4\u5230 gerrit \uff0c\u4eba\u5de5 Code Review \u901a\u8fc7\u4e4b\u540e\u5408\u5165\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_11","title":"\u5341\u4e09\u3001\u63d0\u4ea4\u4ee3\u7801","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_9","title":"1. \u5b89\u88c5\u4f9d\u8d56","text":"sudo apt install git-review\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_9","title":"2. \u63d0\u4ea4\u6a21\u677f","text":"\u5728 ~ \u76ee\u5f55\u4e0b\u65b0\u5efa\u6587\u4ef6\uff0c\u5e76\u547d\u540d\u4e3a gitcommit_template \u5c06\u4ee5\u4e0b\u5185\u5bb9\u5199\u5165\u6587\u4ef6\u5f53\u4e2d\uff1a # commit type :fix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style(\u98ce\u683c\u4fee\u6539)\u3001refactor(\u91cd\u6784)\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test(\u6d4b\u8bd5) + \u7b80\u5355\u63cf\u8ff0. \u9ed8\u8ba4fix,\u6839\u636e\u60c5\u51b5\u4fee\u6539\nfix: \n\n# \u8be6\u7ec6\u8bf4\u660e\u4ee3\u7801\u7684\u6539\u52a8\uff0c\u5305\u542b\u4ee3\u7801\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u4ee5\u53ca\u4e3a\u4ec0\u4e48\u8fd9\u4e48\u505a\uff0c\u53ef\u80fd\u4f1a\u5f71\u54cd\u54ea\u4e9b\u529f\u80fd\u3002\u5bf9\u4e8e\u4ee3\u7801\u7684\u5ba1\u6838\u8005\uff0c\u9700\u8981\u4ece\u8fd9\u6bb5\u63cf\u8ff0\u4e2d\u80fd\u5b8c\u5168\u7406\u89e3\u4ee3\u7801\u4e2d\u6240\u6709\u6539\u52a8\u7684\u5185\u5bb9\nDescription: \n\n# \u5199\u4e00\u6bb5\u9762\u5411\u4e8e\u4ea7\u54c1\u7684\u603b\u7ed3\u6027\u5185\u5bb9\uff0c\u7528\u4e8e\u81ea\u52a8\u751f\u6210crp\u4e0a\u7684changlog\uff0c\u9700\u8981\u6ce8\u610f\u7684\u4e8b\uff0c\u8fd9\u6bb5\u63cf\u8ff0\u5fc5\u987b\u4ece\u4ea7\u54c1\u7684\u89d2\u5ea6\u8003\u8651\u3002\nLog: \n\n# \u5173\u8054pms\u4e0a\u7684bug\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94bug\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4fee\u590dbug\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Bug: \n\n# \u4fee\u590d github issue \n#Issue: \n\n# \u5173\u8054pms\u4e0a\u7684\u4efb\u52a1\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94\u4efb\u52a1\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4efb\u52a1\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Task: \n \u547d\u4ee4\u884c\u6267\u884c: git config --global commit.template ~/gitcommit_template\n \u6b64\u547d\u4ee4\u5c06\u6a21\u677f\u52a0\u5165\u5230 git \u7684\u63d0\u4ea4\u6a21\u677f\u4e2d\u3002 \u540e\u7eed\u63d0\u4ea4\u7684\u65f6\u5019\u9700\u8981\u5173\u6ce8\u4e00\u4e0b\u51e0\u70b9\uff1a commit type \u5bf9\u5e94\u4e0d\u540c\u7684\u4fee\u6539\u7c7b\u578b\uff1afix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style \uff08\u98ce\u683c\u4fee\u6539\uff09\u3001refactor \uff08\u91cd\u6784\uff09\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test \uff08\u6d4b\u8bd5\uff09 commit type \u5192\u53f7\u540e\u9762\u52a0\u7a7a\u683c\u3002 Description \u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u9700\u8981\u8fdb\u884c\u8be6\u7ec6\u8bf4\u660e\uff0c\u6bd4\u5982\u5bf9\u529f\u80fd\u8fdb\u884c\u5927\u6539\u7b49\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_6","title":"3. \u63a8\u9001\u4ee3\u7801","text":"\u9996\u5148\u6dfb\u52a0 commit \u4fe1\u606f git add \u540e\u9762\u52a0\u6587\u4ef6\u540d\u79f0\n git add . # \u8868\u793a\u6dfb\u52a0\u6240\u6709\u6587\u4ef6\n \u4f7f\u7528\u8fd9\u6761\u547d\u4ee4\u6ce8\u610f\u6709\u4e9b\u4e34\u65f6\u6587\u4ef6\u4e0d\u8981\u63d0\u4ea4\u5230\u4ed3\u5e93\u4e86\u3002 git commit -a\n \u4e4b\u540e\u5728 fix: \u540e\u9762\uff08\u6ce8\u610f\u5192\u53f7\u540e\u9762\u5fc5\u987b\u52a0\u7a7a\u683c\uff0c\u4e0d\u7136\u76f4\u63a5-1\uff09\u5199\u672c\u5730\u63d0\u4ea4\u7684 commit \u4fe1\u606f\uff0c\u7136\u540e\u5c31\u53ef\u4ee5\u63d0\u4ea4\u4ee3\u7801\u4e86 git review branch(\u5f53\u524d\u5206\u652f) -r origin\n \u6700\u597d\u4e00\u6b21 commit\uff0c\u4e00\u6b21 git review \uff0c\u7ecf\u5e38\u6709\u540c\u5b66\u5728\u672c\u5730\u75af\u72c2 commit \u6700\u540e git review \u62a5\u9519\u4e0d\u77e5\u9053\u548b\u56de\u4e8b\u513f\u3002 \u82e5\u4e0d\u60f3\u6bcf\u6b21\u63d0\u4ea4\u90fd\u52a0\u4e0a -r \u9009\u9879\uff0c\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a git config --global gitreview.remote origin \u63d0\u4ea4\u4ee3\u7801\uff0c\u76f4\u63a5\u4f7f\u7528 git review branch<\u76ee\u6807\u5206\u652f>\uff0c\u4f8b\u5982 git review master"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git","title":"4. Git\u6807\u7b7e","text":"Git \u6807\u7b7e\u5b9e\u9645\u4e0a\u662f commit \u7684\u4e00\u4e2a\u522b\u540d\uff0c\u4e3b\u8981\u7528\u4e8e\u7ba1\u7406\u5386\u53f2\u7248\u672c\u3002 \u60f3\u8c61\u4e00\u4e0b\u9886\u5bfc\u8ba9\u4f60\u628a\u4e4b\u524d\u7684\u67d0\u4e2a\u7248\u672c\u7684\u4ee3\u7801\u62c9\u51fa\u6765\u8dd1\uff0c\u4f60\u662f\u4e0d\u662f\u4e56\u4e56\u7684\u53bb\u628a\u6240\u6709\u63d0\u4ea4\u8bb0\u5f55\u62c9\u51fa\u6765\u627e\uff0c\u7136\u540e\u627e\u5230\u90a3\u4e2a\u54c8\u5e0c\u503c\uff0c\u901a\u8fc7\u54c8\u5e0c\u503c\u6765\u68c0\u51fa\u4ee3\u7801\u3002 \u8fd9\u4e00\u5957\u64cd\u4f5c\u4e0b\u6765\u662f\u4e0d\u662f\u5f88\u9ebb\u70e6\uff0c\u8d39\u65f6\u95f4\u8fd8\u4e0d\u4e00\u5b9a\u80fd\u627e\u5f97\u5230\uff0c\u6ca1\u4eba\u80fd\u8bb0\u4f4f\u6bcf\u4e2a\u63d0\u4ea4\u54c8\u5e0c\u503c\u4ee5\u53ca\u8fd9\u6b21\u63d0\u4ea4\u90fd\u6539\u4e86\u54ea\u4e9b\u4ee3\u7801\u3002 \u56e0\u6b64\u7ed9\u63d0\u4ea4\u6253\u4e2a\u6807\u7b7e\uff0c\u5c31\u662f\u628a\u54c8\u5e0c\u503c\u8f6c\u6362\u6210\u4eba\u7c7b\u80fd\u7406\u89e3\u7684\u8bed\u8a00\uff0c\u6bd4\u5982 v1.0\uff0c\u5c31\u53ef\u4ee5\u76f4\u63a5\u901a\u8fc7\u6807\u7b7e\u627e\u5230\u5bf9\u5e94\u7684\u63d0\u4ea4\u3002 \u65b0\u5efa\u6807\u7b7e git tag -a <tagname>\n \u56de\u8f66\u4e4b\u540e\uff0cGit \u4f1a\u6253\u5f00\u4f60\u7684\u7f16\u8f91\u5668\uff0c\u8ba9\u4f60\u5199\u4e00\u53e5\u6807\u7b7e\u6ce8\u89e3\uff0c\u5c31\u50cf\u4f60\u7ed9\u63d0\u4ea4\u5199\u6ce8\u89e3\u4e00\u6837\u3002 \u67e5\u770b\u6240\u6709\u6807\u7b7e git tag -l\n# git tag \u4e5f\u884c\n \u5220\u9664\u6807\u7b7e git tag -d <tagname>\n \u63a8\u9001\u6807\u7b7e\u81f3\u8fdc\u7a0b git push \u547d\u4ee4\u5e76\u4e0d\u4f1a\u4f20\u9001\u6807\u7b7e\u5230\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\uff0c\u5fc5\u987b\u663e\u5f0f\u5730\u63a8\u9001\u6807\u7b7e\u3002 git push origin <tagname>\n \u63a8\u9001\u6240\u6709\u4e0d\u5728\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\u7684\u6807\u7b7e git push origin --tag\n \u5220\u9664\u8fdc\u7a0b\u6807\u7b7e git push origin :refs/tag/<tagname>\n \u540e\u671f\u6253\u6807\u7b7e \u5148\u7528 git log --pretty=oneline \u67e5\u8be2\u63d0\u4ea4\u8bb0\u5f55\uff0c\u83b7\u53d6\u6821\u9a8c\u7801\u3002 git tag -a <tagname> 9fceb02(\u6821\u9a8c\u7801)\n \u68c0\u51fa\u6807\u7b7e git checkout <tagname>\n \u6b64\u65f6\uff0c\u4ed3\u5e93\u4f1a\u5904\u4e8e\u201c\u5206\u79bb\u5934\u6307\u9488\uff08detached HEAD\uff09\u201d\u7684\u72b6\u6001\u3002 \u5728\u201c\u5206\u79bb\u5934\u6307\u9488\u201d\u72b6\u6001\u4e0b\uff0c\u5982\u679c\u4f60\u505a\u4e86\u67d0\u4e9b\u66f4\u6539\u7136\u540e\u63d0\u4ea4\u5b83\u4eec\uff0c\u6807\u7b7e\u4e0d\u4f1a\u53d1\u751f\u53d8\u5316\uff0c \u4f46\u4f60\u7684\u65b0\u63d0\u4ea4\u5c06\u4e0d\u5c5e\u4e8e\u4efb\u4f55\u5206\u652f\uff0c\u5e76\u4e14\u5c06\u65e0\u6cd5\u8bbf\u95ee\uff0c\u9664\u975e\u901a\u8fc7\u786e\u5207\u7684\u63d0\u4ea4\u54c8\u5e0c\u624d\u80fd\u8bbf\u95ee\u3002 \u56e0\u6b64\uff0c\u5982\u679c\u4f60\u9700\u8981\u8fdb\u884c\u66f4\u6539\uff0c\u6bd4\u5982\u4f60\u8981\u4fee\u590d\u65e7\u7248\u672c\u4e2d\u7684\u9519\u8bef\uff0c\u90a3\u4e48\u901a\u5e38\u9700\u8981\u521b\u5efa\u4e00\u4e2a\u65b0\u5206\u652f\uff1a git checkout -b <NewBranchName> <tagname>\n \u65b0\u5206\u652f\u4e0a\u53ef\u4ee5\u8fdb\u884c\u63d0\u4ea4\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_12","title":"\u5341\u56db\u3001\u5e38\u89c1\u95ee\u9898","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_10","title":"1. \u63d0\u4ea4\u4ee3\u7801\u65f6\u63d0\u793a\u90ae\u7bb1\u6216\u8005\u540d\u79f0\u4e0d\u5bf9","text":"\u91cd\u65b0\u914d\u7f6e\u90ae\u7bb1\u6216\u8005\u540d\u79f0\uff0c\u7136\u540e\u91cd\u7f6e\u751f\u6548\uff1a git commit --amend --reset-author\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_10","title":"2. \u600e\u4e48\u56de\u6eda\u5230\u4e4b\u524d\u7684\u7248\u672c","text":"(1)\u67e5\u8be2\u5386\u53f2\u63d0\u4ea4\u8bb0\u5f55 git log\n \u627e\u5230\u4f60\u8981\u56de\u6eda\u7684\u7248\u672c\uff0c\u590d\u5236 hash \u503c\u3002 \u6ce8\u610f\uff1a\u662f commit \u7a7a\u683c\u4e4b\u540e\u7684 hash \u503c\uff0c\u4e4b\u524d\u6709\u540c\u5b66\u590d\u5236\u7684 Change-Id: \u8fd9\u6837\u80af\u5b9a\u62a5\u9519\u3002 (2)\u56de\u6eda\u7248\u672c\uff0c\u4e0d\u6e05\u9664\u4ee3\u7801 git reset --soft ${hash}\n (3)\u56de\u6eda\u7248\u672c\uff0c\u6e05\u9664\u4ee3\u7801\uff0c\u614e\u7528\u54c8 git reset --hard ${hash}\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-f-s-e","title":"3. \u6d4b\u8bd5\u62a5\u544a\u91cc\u9762 F S . E \u662f\u4ec0\u4e48\u610f\u601d","text":"F \u8868\u793a\u5931\u8d25\uff0c. \uff08\u70b9\uff09\u8868\u793a\u901a\u8fc7\uff0cS \u8868\u793a\u8df3\u8fc7\uff0cE \u8868\u793a error \u6709\u62a5\u9519"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git-status","title":"4. \u89e3\u51b3 git status \u4e2d\u6587\u663e\u793a\u7684\u95ee\u9898","text":"git config --global core.quotePath false\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5-apps","title":"5. apps \u76ee\u5f55\u4e0b\u989c\u8272\u6709\u4e9b\u662f\u9ec4\u8272\u7684","text":"\u5728 Pycharm \u4e2d apps \u76ee\u5f55\u4e0b\u5e94\u7528\u5e93\u6587\u4ef6\u662f\u9ec4\u8272\u7684\uff0c\u7f16\u8f91\u5668\u8bc6\u522b\u4e0d\u5230\u4ee3\u7801\u65b0\u589e\u548c\u4fee\u6539\uff1b \u7531\u4e8e\u793e\u533a\u7248 Pycharm \u4e0d\u80fd\u52a8\u6001\u8bc6\u522b\u591a\u4ed3\u5e93\uff0c\u9700\u8981\u5728 setting \u91cc\u9762\u624b\u52a8\u6ce8\u518c\uff0c\u64cd\u4f5c\u6b65\u9aa4\uff1a File \u2014> Settings \u2014> Version Control \u2014> \u70b9 + \u53f7 \u2014> Directory \u9009\u4e2d\u5e94\u7528\u5e93\u5de5\u7a0b\u76ee\u5f55 \u2014> VCS \u9009\u4e2d Git \u2014> Apply \u5982\u6b64\u5c31\u53ef\u4ee5\u4e86\u3002 \u4e13\u4e1a\u7248 Pycharm \u4e0d\u5b58\u5728\u8fd9\u4e2a\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#6-envsh-r","title":"6. \u6267\u884c env.sh \u62a5\u9519 $'\\r':\u672a\u627e\u5230\u547d\u4ee4","text":"\u51fa\u73b0\u8fd9\u4e2a\u95ee\u9898\u4f60\u5e94\u8be5\u662f\u5728 windows \u4e0a\u6253\u5f00\u6216\u7f16\u8f91\u8fc7 env.sh \u811a\u672c\uff0cwindows\u4e0b\u7684\u6362\u884c\u662f\u56de\u8f66\u7b26+\u6362\u884c\u7b26\uff0c\u4e5f\u5c31\u662f\\r\\n\uff0c\u800c Linxu \u4e0b\u662f\u6362\u884c\u7b26 \\n\uff0cLinux \u4e0b\u4e0d\u8bc6\u522b \\r\uff0c\u56e0\u6b64\u62a5\u9519\u3002 \u89e3\u51b3\u65b9\u6848\uff1a # \u5c06 \\r \u66ff\u6362\u4e3a\u7a7a\nsudo sed -i 's/\\r//' env.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#7","title":"7.\u600e\u6837\u4e3a\u5355\u72ec\u67d0\u4e00\u6761\u7528\u4f8b\u914d\u7f6e\u6267\u884c\u8d85\u65f6\u65f6\u95f4","text":"\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u5982\u4e0b\uff1a @pytest.mark.timeout(300) # \u5355\u4f4d\u79d2\ndef test_xxx_001():\npass\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#8-youqu","title":"8. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u6240\u6709\u4ee3\u7801\uff0c\u5305\u542b\u5b50\u4ed3\u5e93","text":"\u524d\u7f6e\u6761\u4ef6\uff1a\u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 # \u7b2c\u4e00\u6b21\u5b58\u50a8\u5bc6\u7801\uff0c\u63d0\u4f9b\u540e\u9762\u62c9\u4ee3\u7801(gerrit: ldap\u8d26\u53f7\u548c\u5bc6\u7801\uff0cgit\u62c9\u53d6\u7b2c\u4e00\u6b21\u8f93\u5165\u4fdd\u5b58\uff0c\u540e\u9762\u76f4\u63a5\u4f7f\u7528)\ngit config --global credential.helper store\n\n# \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\uff0c\u5e76\u9012\u5f52\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\" --recursive\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#9-youqu","title":"9. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\u6307\u5b9a\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u524d\u7f6e\u6761\u4ef6\uff1a \u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 \u5df2\u5b58\u50a8\u8bbf\u95ee\u5bc6\u7801 # \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\"\n# \u6307\u5b9a\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ncd youqu\ngit submodule update --init apps/autotest_xxx_xxx\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#10-youqu","title":"10. \u5982\u4f55\u66f4\u65b0 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\uff0c\u6240\u6709\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u66f4\u65b0\u6240\u6709\u5b50\u4ed3\u5e93\u4ee3\u7801 cd youqu\ngit pull & git submodule foreach git pull\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#11-youqu-master-detached-head","title":"11. \u5982\u4f55\u4fee\u590d YouQu \u6240\u6709\u5b50\u4ed3\u5e93 master \u5206\u652f\u6e38\u79bb\u5934\uff08detached head\uff09","text":"\u4fee\u590d\u6240\u6709\u5b50\u4ed3\u5e93\u9ed8\u8ba4master \u5206\u652f\u6e38\u79bb\u5934 cd youqu\ngit submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/","title":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212 \u5206\u7c7b\uff1a/ \u67b6\u6784\u5e08\uff1a/ \u76ee\u6807\uff1a \u5e94\u7528 AT \u67b6\u6784\u5de5\u7a0b\u5316\uff0c\u53c2\u8003\u6027\u80fd\u81ea\u52a8\u5316\u5de5\u7a0b\u5b8c\u6210\u5de5\u7a0b\u5316\u6539\u9020\u3002 \u5e94\u7528\u95f4\u7528\u4f8b\u89e3\u8026\uff0c\u89e3\u9664\u6240\u6709\u4ea4\u53c9\u8c03\u7528\u7684\u65b9\u6cd5\uff0c\u5404\u5e94\u7528\u80fd\u8ddf\u968f\u81ea\u8eab\u8fed\u4ee3\u5468\u671f\u72ec\u7acb\u7ef4\u62a4 AT \u7528\u4f8b\u3002 \u5b8c\u6210\u516c\u5171\u65b9\u6cd5\u7684\u62bd\u53d6\u6574\u5408\uff0c\u5f62\u6210\u4e00\u5957\u72ec\u7acb\u4e8e\u5e94\u7528\u95f4\u7684\u516c\u5171\u65b9\u6cd5\u5e93\uff0c\u5404\u5e94\u7528\u65b9\u6cd5\u91cc\u9762\u4e0d\u5b58\u5728\u88ab\u591a\u4e2a\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\u3002 \u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u4e3a\u5c06\u6765\u9002\u914d\u66f4\u591a\u7684 AT \u8fd0\u7528\u573a\u666f\u63d0\u4f9b\u652f\u6491\uff0c\u539f\u5219\u4e0a\u53ef\u5b9e\u73b0\u65e0\u9650\u6269\u5c55\uff0c\u5728\u6bcf\u65e5\u6784\u5efa\u548c\u6301\u7eed\u96c6\u6210\u6d41\u7a0b\u843d\u5730\u4f7f\u7528\u3002 \u4ee3\u7801\u89c4\u8303\u95ee\u9898\u6e05\u96f6\uff0c\u7b26\u5408 Shell Check\u3001Pylint\u3001\u7cfb\u7edf\u90e8\u76f8\u5173\u7f16\u7801\u89c4\u8303\u8981\u6c42\u3002 \u610f\u4e49\uff1a \u7edf\u4e00\u6210\u7814 AT \u67b6\u6784\u8bbe\u8ba1\u601d\u8def\uff0c\u6d88\u9664 AT \u4ee3\u7801\u5b9e\u73b0\u548c\u7ef4\u62a4\u4e0a\u53ef\u80fd\u51fa\u73b0\u7684\u5206\u6b67\uff0c\u6539\u5584\u5386\u53f2 AT \u65e0\u5de5\u7a0b\u5316\u8bbe\u8ba1\u7684\u7f3a\u9677\uff0c\u63d0\u9ad8\u67b6\u6784\u4e13\u4e1a\u6027\u3002 \u5404\u5e94\u7528 AT \u4ee3\u7801\u76f8\u4e92\u72ec\u7acb\uff0c\u5951\u5408\u5e94\u7528\u72ec\u7acb\u53d1\u5e03\u7279\u6027\uff0c\u53ef\u652f\u6301\u8fed\u4ee3\u671f\u95f4\u72ec\u7acb\u65b0\u589e\u3001\u7ef4\u62a4\u548c\u6267\u884c\u3002 \u65b9\u6cd5\u8c03\u7528\u903b\u8f91\u5f97\u5230\u7b80\u5316\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u66f4\u9ad8\u6548\uff1b\u516c\u5171\u5e93\u62bd\u53d6\uff0c\u51cf\u5c11\u65b9\u6cd5\u91cd\u590d\u7f16\u5199\uff0c\u63d0\u9ad8\u4ee3\u7801\u5229\u7528\u7387\uff1b\u5e73\u5747\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u4ece40\u5206\u949f\u964d\u4f4e\u81f330\u5206\u949f\uff0c\u65e5\u4ea7\u51fa\u7528\u4f8b\u4ece12\u6761/\u5929\u63d0\u5347\u81f316\u6761/\u5929\u3002 \u53ef\u7075\u6d3b\u652f\u6491\u4e0d\u540c\u7684\u81ea\u52a8\u5316\u8fd0\u7528\u573a\u666f\uff0c\u5982 CI\u3001\u5192\u70df\u6d4b\u8bd5\u3001\u96c6\u6210\u6d4b\u8bd5\u3001\u56de\u5f52\u6d4b\u8bd5\u3001\u4e13\u9879\u6d4b\u8bd5\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_2","title":"\u4e00\u3001\u80cc\u666f\u4ecb\u7ecd","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1","title":"1\u3001\u73b0\u6709\u67b6\u6784\u4ecb\u7ecd","text":"\u73b0\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u6574\u4f53\u5206\u4e3a\u4e09\u5c42\uff1a\u7528\u4f8b\u5c42\uff08\u4e1a\u52a1\u903b\u8f91\u5c42\uff09\u3001\u4e2d\u95f4\u5c42\uff08\u5143\u7d20\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff09\u3001\u6838\u5fc3\u5c42\uff08\u5e95\u5c42\u529f\u80fd\u5e93\u5c42\uff09\u3002 \u7528\u4f8b\u5c42\uff1a\u5373\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4e13\u6ce8\u4e8e\u4e1a\u52a1\u529f\u80fd\u903b\u8f91\uff0c\u4e0d\u5173\u5fc3\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\uff1b \u4e2d\u95f4\u5c42\uff1a\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff0c\u6bcf\u4e2a\u65b9\u6cd5\u5747\u5bf9\u5e94\u4e00\u4e2a\u5143\u7d20\u7684\u4e00\u4e2a\u5177\u4f53\u64cd\u4f5c\uff0c\u4e5f\u53ef\u4ee5\u662f\u591a\u4e2a\u64cd\u4f5c\u7684\u7ec4\u5408\u64cd\u4f5c\uff0c\u4e2d\u95f4\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u7528\u4f8b\u5c42\uff0c\u5177\u6709\u53ef\u6269\u5c55\u6027\u548c\u590d\u7528\u6027\uff1b \u6838\u5fc3\u5c42\uff1a\u4e3b\u8981\u5c01\u88c5\u7684\u5e95\u5c42\u529f\u80fd\u5b9e\u73b0\uff0c\u6b64\u5c42\u5728\u6846\u67b6\u4e2d\u63d0\u4f9b\u4e00\u4e9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u529f\u80fd\u6a21\u5757\u76f8\u5bf9\u72ec\u7acb\uff0c\u6838\u5fc3\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u64cd\u4f5c\u5c42\uff0c\u6bd4\u5982\uff1a\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7 UI \u5750\u6807\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u952e\u9f20\u64cd\u4f5c\u7684\u57fa\u7840\u65b9\u64cd\u4f5c\u6a21\u5757\u3001Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757\u3001\u6587\u4ef6\u7684\u589e\u5220\u6539\u67e5\u64cd\u4f5c\u6a21\u5757\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2","title":"2\u3001\u81ea\u52a8\u5316\u7684\u5e94\u7528","text":"2.1\u3001CI \u6d41\u7a0b \u6bcf\u65e5\u6784\u5efa\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u7814\u53d1\u6bcf\u65e5\u63d0\u4ea4\u7684\u4ee3\u7801\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u73ed\u4e4b\u540e\u4f1a\u5c06\u5404\u5e94\u7528\u8fdb\u884c\u6253\u5305\uff0c\u7136\u540e\u5728\u6d4b\u8bd5\u673a\u4e0a\u5b89\u88c5\u66f4\u65b0 deb \u5305\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u5e94\u7528\u63d0\u4ea4\u96c6\u6210\u7684\u7248\u672c\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u8f7d\u6700\u65b0\u7684 ISO \u8fdb\u884c PXE \u90e8\u7f72\uff0c\u7136\u540e\u6d4b\u8bd5\u673a\u5b89\u88c5\u6700\u65b0\u7684\u955c\u50cf\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 2.2\u3001\u9a8c\u6536\u6d4b\u8bd5 \u5728\u5404\u9a8c\u6536\u8282\u70b9\u8fdb\u884c\u81ea\u52a8\u5316\u9a8c\u6536\uff0c\u76ee\u524d\u7684\u7b56\u7565\u662f\u5168\u7528\u4f8b\u8986\u76d6\u5168\u67b6\u6784\u3002 2.3\u3001\u56de\u5f52\u6d4b\u8bd5 \u56de\u5f52\u6d4b\u8bd5\u4eca\u5e74\u89c4\u5212\u5efa\u8bbe\u4e2d\uff0c\u65e8\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u6267\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\uff0c\u51cf\u5c11\u529f\u80fd\u6d4b\u8bd5\u7684\u91cd\u590d\u52b3\u52a8\u529b\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3","title":"3\u3001\u5b58\u5728\u7684\u95ee\u9898","text":" \u5404\u5e94\u7528\u4e4b\u95f4\u5b58\u5728\u8026\u5408 \u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u521d\u671f\uff0c\u6240\u6709\u5e94\u7528\u662f\u6574\u4f53\u53d1\u5e03\uff0c\u6211\u4eec\u662f\u5c06\u6240\u6709\u5e94\u7528\u770b\u6210\u662f\u4e00\u4e2a\u6574\u4f53\uff0c\u5404\u5e94\u7528\u4f5c\u4e3a\u5176\u4e2d\u7684\u4e00\u4e2a\u6a21\u5757\uff0c\u6240\u4ee5\u5b58\u5728\u5e94\u7528\u95f4\u65b9\u6cd5\u4ea4\u53c9\u8c03\u7528\u7684\u95ee\u9898\uff0c\u8fd9\u6837\u4ece\u6700\u521d\u7684\u8bbe\u8ba1\u6765\u8bb2\u786e\u5b9e\u80fd\u591f\u51cf\u5c11\u91cd\u590d\u4ee3\u7801\u7684\u7f16\u5199\u3002\u4f46\u662f\u73b0\u5728\u5e94\u7528\u8d70\u72ec\u7acb\u53d1\u5e03\uff0c\u5404\u5e94\u7528\u90fd\u6709\u81ea\u5df1\u7684\u8fed\u4ee3\u8282\u594f\uff0c\u5728\u65b0\u9700\u6c42\u5feb\u901f\u53d8\u5316\u7684\u8fc7\u7a0b\u4e2d\uff0c\u81ea\u52a8\u5316\u7ef4\u62a4\u53d8\u5f97\u5f02\u5e38\u56f0\u96be\uff0c\u539f\u56e0\u5c31\u662f\u81ea\u52a8\u5316\u9879\u76ee\u91cc\u9762\u5404\u4e2a\u5e94\u7528\u7684\u6709\u6bd4\u8f83\u591a\u7684\u8026\u5408\u5173\u7cfb\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u8fdb\u884c\u89e3\u8026\uff0c\u4ee5\u9002\u5e94\u5e94\u7528\u4e0d\u540c\u7684\u8fed\u4ee3\u5468\u671f\u3002 \u65e0\u6cd5\u7cbe\u51c6\u7684\u5212\u5206\u7528\u4f8b\u8303\u56f4 \u7528\u4f8b\u6267\u884c\u7684\u8303\u56f4\u4e0d\u591f\u7cbe\u51c6\uff0c\u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u4e3b\u8981\u901a\u8fc7\u7528\u4f8b\u7684\u5173\u952e\u8bcd core\uff08\u6838\u5fc3\uff09\u6765\u533a\u5206\u7528\u4f8b\u662f\u5426\u4e3a\u6838\u5fc3\u7528\u4f8b\uff0c\u4f46\u662f\u8fd9\u6837\u7684\u533a\u5206\u592a\u5bbd\u6cdb\u4e86\uff0c\u4e0d\u80fd\u9002\u5e94\u81ea\u52a8\u5316\u6d4b\u8bd5\u5728\u591a\u573a\u666f\u4e0b\u7684\u5e94\u7528\u3002\u5f88\u591a\u573a\u666f\u4e0b\u6211\u4eec\u8fd8\u9700\u8981\u6839\u636e\u7528\u4f8b\u7684\u7b49\u7ea7\u3001\u7528\u4f8b\u7684\u7c7b\u578b\u3001\u7528\u4f8b\u6765\u6e90\u7b49\u7b49\uff0c\u4e0d\u540c\u7684\u7ef4\u5ea6\u6765\u6311\u9009\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u5173\u952e\u5b57\u9700\u8981\u4eba\u5de5\u4e00\u6761\u6761\u7684\u6539\uff0c\u8d39\u65f6\u8d39\u529b\uff0c\u800c\u4e14\u4e0d\u597d\u7ef4\u62a4\u3002 \u53d7\u65b0\u9700\u6c42\u5f71\u54cd\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u597d\u7ef4\u62a4 \u76ee\u524d\u9700\u8981\u8df3\u8fc7\u7684\u7528\u4f8b\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684\u7528\u4f8b\u811a\u672c\u91cc\u9762\uff0c\u6dfb\u52a0\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\uff0c\u540e\u7eed\u89e3\u9664\u8df3\u8fc7\u7684\u65f6\u5019\u53c8\u9700\u8981\u627e\u5230\u8fd9\u6761\u811a\u672c\uff0c\u5220\u6389\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\u3002\u5728\u8df3\u8fc7\u7528\u4f8b\u8f83\u591a\u7684\u60c5\u51b5\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u96be\u5ea6\u3002 \u7f16\u5199\u7528\u4f8b\u65f6\u903b\u8f91\u6bd4\u8f83\u590d\u6742\uff0c\u9700\u8981\u8c03\u7528\u591a\u4e2a\u5e94\u7528\u7684\u65b9\u6cd5\u6a21\u5757\u3002 \u6846\u67b6\u6269\u5c55\u6027\u4e0d\u8db3\uff0c\u65e0\u6cd5\u6574\u5408\u6027\u80fd\u81ea\u52a8\u5316\u3001\u538b\u6d4b\u81ea\u52a8\u5316\u3001\u5b89\u5168\u81ea\u52a8\u5316\u7b49\u4e13\u9879\u6d4b\u8bd5\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_3","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u4e3a\u89e3\u51b3\u73b0\u6709\u95ee\u9898\uff0c\u9002\u5e94\u4e0d\u65ad\u4e30\u5bcc\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u66f4\u597d\u7684\u53d1\u6325\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4f5c\u7528\uff0c\u9700\u8981\u5bf9\u81ea\u52a8\u5316\u67b6\u6784\u53ca\u5404\u529f\u80fd\u6a21\u5757\u8fdb\u884c\u91cd\u65b0\u8bbe\u8ba1\u89c4\u5212\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_1","title":"1\u3001\u67b6\u6784\u8bbe\u8ba1","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_1","title":"2\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u6846\u67b6\u7684\u8fd0\u884c\u903b\u8f91\uff1a\u901a\u8fc7\u6838\u5fc3\u5c42\u63d0\u4f9b\u4e00\u4e2a\u57fa\u7840\u80fd\u529b\uff0c\u4e1a\u52a1\u5c42\u6839\u636e\u5b9e\u9645\u4e1a\u52a1\u9700\u6c42\uff08\u6d4b\u8bd5\u7528\u4f8b\uff09\u52a8\u6001\u52a0\u8f7d\u6838\u5fc3\u5c42\uff0c\u6267\u884c\u5165\u53e3\u52a0\u8f7d\u76f8\u5e94\u7684\u7528\u4f8b\u96c6\u5e76\u63a7\u5236\u6267\u884c\uff0c\u5e94\u7528\u5c42\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u9700\u6c42\uff0c\u901a\u8fc7\u76f8\u5e94\u7684\u914d\u7f6e\u9879\u8fdb\u884c\u914d\u7f6e\uff0c\u4ece\u800c\u89e6\u53d1\u81ea\u52a8\u5316\u6d4b\u8bd5\u4efb\u52a1\u3002 \u6838\u5fc3\u5c42\uff1a\u57fa\u672c\u4fdd\u6301\u4e0d\u53d8\uff0c\u90e8\u5206\u6a21\u5757\u4f1a\u6d89\u53ca\u5230\u65b0\u529f\u80fd\u5f00\u53d1\uff0c\u6838\u5fc3\u5c42\u5404\u529f\u80fd\u6a21\u5757\u4fdd\u6301\u72ec\u7acb\u6027\uff0c\u63d0\u4f9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u4f9b\u4e0a\u5c42\u8c03\u7528\uff1b \u5e95\u5c42\u6838\u5fc3\u6a21\u5757\u5305\u62ec\uff1a \u56fe\u50cf\u8bc6\u522b\u6a21\u5757 UI \u5b9a\u4f4d\u6a21\u5757 Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757 \u5c5e\u6027\u5b9a\u4f4d\u6a21\u5757 \u65e5\u5fd7\u6a21\u5757 \u952e\u9f20\u64cd\u4f5c\u6a21\u5757 \u6587\u4ef6\u64cd\u4f5c\u6a21\u5757 \u5f55\u5c4f\u6a21\u5757 \u81ea\u5b9a\u4e49\u65ad\u8a00\u6a21\u5757 \u7528\u4f8b\u6267\u884c\u6a21\u5757 PXE \u88c5\u673a\u6a21\u5757 \u952e\u9f20\u4fe1\u53f7\u6a21\u62df\u6a21\u5757 OCR \u6a21\u5757 \u4e1a\u52a1\u5c42\uff1a\u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e94\u7528\u5185\u5305\u542b\u591a\u4e2a\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5982\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7b49\uff0c\u540e\u7eed\u53ef\u4ee5\u6839\u636e\u9700\u8981\u5ac1\u63a5\u8fdb\u6765\u3002\u5176\u4e2d\u529f\u80fd\u6d4b\u8bd5\u8bbe\u8ba1\u601d\u8def\uff1a \u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e76\u5c06\u6d4b\u8bd5\u6570\u636e\u548c\u6d4b\u8bd5\u8d44\u6e90\u6574\u5408\u8fdb\u6765\uff0c\u589e\u52a0\u7528\u4f8b\u6807\u7b7e csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ed9\u6bcf\u6761\u7528\u4f8b\u6253\u6807\u7b7e\u3002 \u5404\u6807\u7b7e\u6240\u4f7f\u7528\u5bf9\u5e94\u7684\u5b57\u6bb5\u540d\u79f0\uff0c\u4f7f\u7528 csv \u6587\u4ef6\u7ef4\u62a4\u7528\u4f8b\u4e0e\u6807\u7b7e\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u5bf9\u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u53ef\u4ee5\u7ec4\u5408\u5176\u4e2d\u7684\u6807\u7b7e\u800c\u4ece\u9a71\u52a8\u5bf9\u5e94\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\uff0c\u517c\u5bb9\u73b0\u6709\u7528\u4f8b\u6807\u7b7e\uff0c\u4e14\u652f\u6301\u7528\u4f8b\u6807\u7b7e\u53ef\u6269\u5c55\uff1b \u4f7f\u7528 csv \u683c\u5f0f\u6587\u4ef6\u53ef\u4ee5\u65b9\u4fbf\u7684\u4f7f\u7528 Excel \u8868\u683c\u6253\u5f00\u8fdb\u884c\u7f16\u8f91\uff0c\u540c\u65f6\u7531\u4e8e csv \u6587\u4ef6\u5b9e\u9645\u662f\u4ee5\u90fd\u597d\u5206\u9694\u7684\u6587\u672c\u6587\u4ef6\uff0c\u4ee3\u7801\u4e2d\u53ef\u4ee5\u5728\u4e0d\u4f9d\u8d56\u4e09\u65b9\u5e93\u7684\u60c5\u51b5\u4e0b\u65b9\u4fbf\u5feb\u901f\u7684\u89e3\u6790\u5b83\uff0c\u53ef\u64cd\u4f5c\u6027\u548c\u53ef\u7ef4\u62a4\u6027\u8f83\u9ad8\u3002 \u5404\u4e2a\u5e94\u7528\u4e4b\u95f4\uff0c\u7528\u4f8b\u3001\u65b9\u6cd5\u3001\u6807\u7b7e\u548c\u8d44\u6e90\u90fd\u662f\u76f8\u4e92\u72ec\u7acb\u7684\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u7528\u4f8b\u65f6\u53ea\u9700\u8981\u81ea\u5df1\u5e94\u7528\u4e0b\u7684\u65b9\u6cd5\u548c\u516c\u5171\u5e93\u5373\u53ef\u3002 \u7ed3\u6784\u4e3e\u4f8b\uff1a .\n\u251c\u2500\u2500 apps\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_album # \u5e94\u7528\u540d (\u7528\u4e0b\u5212\u7ebf\u8fde\u63a5\u662f Python \u7f16\u7801\u89c4\u8303)\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_assert # \u65ad\u8a00\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_function_tag.csv # \u7528\u4f8b\u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 asan_cases # \u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases # \u529f\u80fd\u6d4b\u8bd5\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 res # \u6d4b\u8bd5\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config # \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_widget # \u5e94\u7528\u81ea\u5df1\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_widget # \u65b9\u6cd5\u57fa\u7c7b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 other_widget # \u8c03\u7528\u5176\u4ed6\u5e94\u7528\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_camera\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases\n\u2502\u00a0\u00a0 \u2502\u00a0 ...\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 public_widget # \u516c\u5171\u65b9\u6cd5\u5e93\n\u251c\u2500\u2500 config # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n...\n config \u914d\u7f6e\u6a21\u5757\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u76f8\u5e94\u914d\u7f6e\uff0c\u6d4b\u8bd5\u540c\u5b66\u53ef\u4ee5\u6839\u636e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5728 config \u91cc\u9762\u8fdb\u884c\u914d\u7f6e\u3002 \u5168\u5c40\u914d\u7f6e\uff1a \u6267\u884c\u4e00\u4e2a\u6216\u591a\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff1a\u5728 pattern \u91cc\u9762\u5199\u5165\u5e94\u7528\u5305\u540d\uff0c\u591a\u4e2a\u5e94\u7528\u4e4b\u95f4\u7528 or \u8fde\u63a5\uff0c\u5982 deepin-music or deepin-movie\uff1b \u5192\u70df\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a smoke\uff1b \u96c6\u6210\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a core \uff1b \u5168\u91cf\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u4e3a\u7a7a\u5373\u53ef\uff1b \u901a\u8fc7 tags \u7684\u914d\u7f6e\u6bd4\u8f83\u7075\u6d3b\uff0c\u540e\u9762\u6807\u7b7e\u5316\u7ba1\u7406\u7ae0\u8282\u4f1a\u8bb2\u5230\uff0c\u652f\u6301\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u7075\u6d3b\u914d\u7f6e\u3002 \u6307\u5b9a\u67d0\u53f0\u673a\u5668\u5728\u6307\u5b9a\u955c\u50cf\u7248\u672c\u4e0a\u6267\u884c\u7528\u4f8b\uff1a\u5728 IP \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a IP\uff0c\u5e76\u5728 URL \u91cc\u9762\u586b\u5165\u955c\u50cf\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u6846\u67b6\u4f1a\u8c03\u7528 PXE \u8fdb\u884c\u81ea\u52a8\u88c5\u673a\uff0c\u88c5\u673a\u5b8c\u4e4b\u540e\u81ea\u52a8\u5f00\u59cb\u6267\u884c\u914d\u7f6e\u7684\u6d4b\u8bd5\u7528\u4f8b\u3002 \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\uff1a \u6bcf\u4e2a\u5e94\u7528\u5185\u90e8\u4f1a\u6709\u4e00\u4e2a\u5355\u72ec\u7684\u914d\u7f6e\u6a21\u5757\uff0c\u4f1a\u5305\u542b\u4e00\u4e9b\u672c\u5e94\u7528\u7684\u6d4b\u8bd5\u8d44\u6e90\u7684\u8def\u5f84\u3001\u6267\u884c\u7528\u4f8b\u7684\u6807\u7b7e\u914d\u7f6e\u7b49\u7b49\uff0c\u5982\u679c\u5728\u5c40\u90e8\u914d\u7f6e\u91cc\u9762\u914d\u7f6e\u4e86\u7528\u4f8b\u6267\u884c\u6807\u7b7e\uff0c\u800c\u5916\u5c42 runner \u51fa\u6ca1\u6709\u6307\u5b9a\u6267\u884c\u6807\u7b7e\uff0c\u5219\u5728\u6267\u884c\u65f6\u53ea\u4f1a\u6267\u884c\u5c40\u90e8\u914d\u7f6e\u5df2\u914d\u7f6e\u7684\uff0c\u82e5\u5916\u5c42 runner \u4e5f\u914d\u7f6e\u4e86\u6267\u884c\u6807\u7b7e\uff0c\u5219\u4f1a\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u7528\u4f8b\u3002 \u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u914d\u7f6e\u90fd\u5728\u540c\u4e00\u4e2a\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\uff0cpy \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684\u7c7b\uff0cini \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684 option\u3002 \u5168\u5c40\u914d\u7f6e\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u7b56\u7565\u5982\u4e0b\uff1a \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5c40\u90e8\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5e94\u7528\u5c42\uff1arunner \u662f\u6d4b\u8bd5\u6267\u884c\u7684\u5165\u53e3\uff0c\u5b83\u4f1a\u6839\u636e\u914d\u7f6e\u91cc\u9762\u7684\u914d\u7f6e\u9879\uff0c\u8fdb\u884c\u7528\u4f8b\u7684\u52a0\u8f7d\u548c\u6267\u884c\u3002\u5b83\u63d0\u4f9b\u63a5\u53e3\u7ed9\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\uff0c\u5e73\u53f0\u4e0a\u7684\u6307\u4ee4\u5b9e\u9645\u4e0a\u90fd\u662f\u901a\u8fc7\u4e0b\u53d1\u7ed9 runner\uff0c\u7136\u540e\u7531 runner \u6765\u6267\u884c\u76f8\u5e94\u7684\u6d4b\u8bd5\u3002 \u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u662f\u4e00\u4e2a\u524d\u7aef\u7cfb\u7edf\uff0c\u53ef\u4ee5\u8fdb\u884c\u6d4b\u8bd5\u673a\u7ba1\u7406\u3001\u81ea\u52a8\u5b89\u88c5\u955c\u50cf\u3001\u81ea\u52a8\u5b89\u88c5\u6307\u5b9a\u5e94\u7528\u7248\u672c\u3001\u8fdb\u884c\u6d4b\u8bd5\u7528\u4f8b\u8303\u56f4\u9009\u62e9\u3001\u7528\u4f8b\u89e6\u53d1\u6267\u884c\u63a7\u5236\u3001\u7ed3\u679c\u5c55\u793a\u8f93\u51fa\u7b49\u3002 \u4e00\u4e2a\u5e94\u7528\u7684\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\u90fd\u53ef\u4ee5\u5355\u72ec\u89e6\u53d1\u3002 \u517c\u5bb9\u6027\u6d4b\u8bd5\u4e3b\u8981\u901a\u8fc7 PXE \u670d\u52a1\u5668\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u88c5\u673a\uff0c\u7136\u540e\u914d\u5408 AT \u8fdb\u884c\u6d4b\u8bd5\uff0c\u53ef\u4ee5\u5b9e\u73b0\u4e0d\u540c\u7cfb\u7edf\u7248\u672c\u3001\u4e0d\u540c\u5e94\u7528\u7248\u672c\u73af\u5883\u4e0a\u90fd\u53ef\u4ee5\u8fdb\u884c\u81ea\u52a8\u5316\u7684 AT \u6267\u884c\uff0c\u63d0\u9ad8\u517c\u5bb9\u6027\u6d4b\u8bd5\u6548\u7387\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_4","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_2","title":"1\u3001\u7528\u4f8b\u89e3\u8026","text":"\u5b58\u5728\u8026\u5408\u5173\u7cfb\u7684\u65b9\u6cd5\uff1a\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u88ab\u5916\u90e8\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\uff0c\u5219\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u8026\u5408\u5173\u7cfb\u3002 1.1\u3001\u901a\u8fc7\u7f16\u8f91\u5668 Find Usages \u67e5\u770b\u6bcf\u4e2a\u65b9\u6cd5\u88ab\u8c03\u7528\u7684\u8def\u5f84\u548c\u88ab\u8c03\u7528\u6b21\u6570\uff1b 1.2\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 1 \u4e2a\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728\u5916\u90e8\u5e94\u7528\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1b 1.3\u3001\u64cd\u4f5c\u5c42\u6587\u4ef6\u540d\u5747\u4ee5 widget \u7ed3\u5c3e\uff0c\u7c7b\u540d\u4ee5 Widget \u7ed3\u5c3e\uff0c\u5982\uff1a\u6587\u4ef6\u540d music_widget.py \uff1a class MusicWidget:\n\"\"\"\u97f3\u4e50\u7684\u64cd\u4f5c\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_2","title":"2\u3001\u516c\u5171\u5e93\u5efa\u8bbe","text":"2.1\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 2 \u4e2a\u53ca\u4ee5\u4e0a\u7684\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728 public_widget \u76ee\u5f55\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1bpublic_widget \u5373\u4e3a\u516c\u5171\u65b9\u6cd5\u5e93\uff1b 2.2\u3001\u5728\u7528\u4f8b\u5c42\u4fee\u6539\u7528\u4f8b\u4e2d\u7c7b\u7684\u5bfc\u5165\u8def\u5f84\uff0c\u5c5e\u4e8e\u516c\u5171\u65b9\u6cd5\u7684\u5219\u8c03\u7528 public_widget \u4e2d\u7684\u7c7b\uff0c\u5916\u90e8\u5e94\u7528\u7684\u64cd\u4f5c\u65b9\u6cd5\uff0c\u5219\u8c03\u7528\u672c\u5e94\u7528\u76ee\u5f55\u4e0b\u91cd\u5199\u7684\u5916\u90e8\u5e94\u7528\u65b9\u6cd5\u3002 \u6bd4\u5982\uff1a\u51e0\u4e4e\u6240\u6709\u591a\u5a92\u4f53\u5e94\u7528\u90fd\u9700\u8981\u901a\u8fc7\u6587\u7ba1\u52a0\u8f7d\u8d44\u6e90\uff0c\u8c03\u8d77\u7684\u6587\u7ba1\u5bf9\u8bdd\u6846\u5b9e\u9645\u4e3a dde-desktop\uff0c\u56e0\u6b64\u5c06 desktop_widget.py \u653e\u5230 public_widget \u91cc\u9762\uff1a class DdeDesktopPublicWidget:\n\"\"\"\u516c\u5171-\u684c\u9762\u7684\u64cd\u4f5c\u65b9\u6cd5\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3_1","title":"3\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406","text":"3.1\u3001\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1a\u5bf9\u5e94 core\u3001smoke\uff0c\u6216\u4e3a\u7a7a\uff1b \u7528\u4f8b\u6765\u6e90\uff1a\u5bf9\u5e94 PMS \u7528\u4f8b\u6765\u6e90\uff0c\u5206\u522b\u7528 acp1\u3001acp2\u3001acp3\u3001acp4 \u8868\u793a\u3002 acp1 \uff1a\u4e1a\u52a1\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5199\u7684\u7528\u4f8b\uff0c\u88ab\u7528\u4e8e\u9a8c\u6536\u6d4b\u8bd5\u7684\uff1b acp2 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5f15\u5165\u7684\u4ea7\u54c1\u9a8c\u6536\u6d4b\u8bc4\u90e8\u7684\u7528\u4f8b\uff1b acp3 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u6839\u636e\u4ea7\u54c1\u9700\u6c42\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\uff1b acp4 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u901a\u8fc7\u793e\u533a\u3001\u8bba\u575b\u7528\u6237\u53cd\u9988\u95ee\u9898\u603b\u7ed3\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\u3002 \u4e3e\u4f8b\uff1a \u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u7528\u4f8b\u6765\u6e90 001 L1 core acp1 \u6807\u7b7e\u91c7\u7528\u679a\u4e3e\u7684\u65b9\u5f0f\u8fdb\u884c\u4ee3\u53f7\u7ba1\u7406\u65b9\u4fbf\u7ba1\u7406\u4ee5\u53ca\u540e\u7eed\u6269\u5c55\u3002 3.2\u3001\u5728\u6bcf\u4e2a\u5e94\u7528\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u7b2c\u4e00\u5217\u4e3a\u7528\u4f8b\u7684 ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ba1\u7406\u6a21\u5757\u5185\u7684\u7528\u4f8b\u6807\u7b7e\u3002\u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 3.3\u3001\u5bf9\u7167 PMS \u4e0a\u7528\u4f8b\u7b49\u7ea7\u3001\u7528\u4f8b\u7c7b\u578b\u548c\u7528\u4f8b\u6765\u6e90\uff0c\u6807\u8bb0\u6240\u6709\u5df2\u5b9e\u73b0\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u540e\u7eed\u7f16\u5199\u65b0\u589e\u81ea\u52a8\u5316\u7528\u4f8b\u65f6\uff0c\u6bcf\u5199\u4e00\u6761\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684 csv \u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u6b64\u6761\u7528\u4f8b\u7684\u6807\u7b7e\u3002 3.4\u3001\u8df3\u8fc7\u7528\u4f8b\u6807\u7b7e\u5316 \u73b0\u6709\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a\uff1a \u4e3e\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u8bb0\u4e3a \u201cskip-\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u8bb0\uff0c\u5982\u679c\u5df2\u7ecf\u6807\u8bb0\u4e86\u8df3\u8fc7\u539f\u56e0\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u8bb0\u4e3a SKIPED\uff0c\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\u3002 \u6240\u6709\u7684\u6807\u7b7e\u5728 docs \u76ee\u5f55\u4e0b\u4f1a\u6709\u4e00\u4e2a\u6587\u6863\uff0c\u6587\u6863\u6682\u5b9a\u540d\u79f0\u4e3a\uff1atags_info.md\uff0c\u7528\u4e8e\u8bf4\u660e\u73b0\u5728\u5df2\u7ecf\u4f7f\u7528\u5230\u7684\u6807\u7b7e\uff0c\u4ee5\u53ca\u8fd9\u4e9b\u6807\u7b7e\u7684\u89e3\u91ca\u548c\u7528\u6cd5\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#4","title":"4\u3001\u7528\u4f8b\u6267\u884c","text":"4.1\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u7684\u9a71\u52a8\u6267\u884c\u903b\u8f91\u529f\u80fd\u5b9e\u73b0 \u5f00\u53d1\u6839\u636e\u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\u91cc\u9762\u7684\u7528\u4f8b\u6807\u7b7e\u6267\u884c\u5bf9\u5e94\u7528\u4f8b\u7684\u529f\u80fd\uff0c\u80fd\u652f\u6301\u591a\u4e2a\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u6267\u884c\u5165\u53e3\u80fd\u968f\u610f\u901a\u8fc7\u7528\u4f8b\u6807\u7b7e\u6307\u5b9a\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002 \u7528\u4f8b\u6807\u7b7e\u7684\u9a71\u52a8\u65b9\u5f0f\u5fc5\u987b\u80fd\u652f\u6301\u6807\u7b7e\u7684\u6269\u5c55\uff0c\u672a\u6765\u968f\u7740\u4e1a\u52a1\u7684\u53d8\u5316\u53ef\u80fd\u9700\u8981\u589e\u52a0\u5404\u79cd\u5404\u6837\u7684\u6807\u7b7e\u3002 4.2\u3001\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u6267\u884c \u529f\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u3001\u6027\u80fd\u6d4b\u8bd5\u7b49\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u662f\u5206\u5f00\u6267\u884c\u7684\uff0c\u4e5f\u5c31\u662f\u5728\u4e00\u6b21\u6267\u884c\u4e2d\uff0c\u53ea\u80fd\u6267\u884c\u5176\u4e2d\u4e00\u79cd\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5177\u4f53\u8981\u6267\u884c\u54ea\u4e00\u79cd\u540c\u6837\u901a\u8fc7\u53c2\u6570\u6765\u63a7\u5236\u3002 4.3\u3001\u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c \u7531\u4e8e\u6d4b\u8bd5\u673a\u8d44\u6e90\u6709\u9650\uff0c\u968f\u7740\u81ea\u52a8\u5316\u7528\u4f8b\u6570\u91cf\u7684\u589e\u52a0\uff0cCI \u6267\u884c\u65f6\u95f4\u4f1a\u8d8a\u6765\u8d8a\u957f\u3002 \u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c\u7684\u529f\u80fd\uff1a \u540c\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\u5206\u6563\u5230\u4e0d\u540c\u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u4e0a\u6267\u884c\uff0c\u7f29\u77ed\u6267\u884c\u603b\u65f6\u95f4\uff1b \u7b2c\u4e8c\u5929\u8dd1\u7684\u65f6\u5019\u540c\u4e00\u4e2a\u673a\u5668\u4e0a\u4f1a\u6267\u884c\u6628\u5929\u6ca1\u6709\u6267\u884c\u5230\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u6267\u884c\u540c\u7406\uff1b \u53ef\u4ee5\u5b9e\u73b0\u5728\u5168\u67b6\u6784\u6d4b\u8bd5\u673a\u4e0a\u8f6e\u6d41\u6267\u884c\u7528\u4f8b\uff0c\u65e2\u80fd\u4fdd\u8bc1\u6267\u884c\u4e86\u6240\u6709\u7684\u7528\u4f8b\uff0c\u53c8\u80fd\u5728\u8d44\u6e90\u6709\u9650\u7684\u60c5\u51b5\u4e0b\u8986\u76d6\u4e86\u6240\u6709\u7684\u67b6\u6784\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#5","title":"5\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0","text":"5.1\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u4f5c\u4e3a\u524d\u7aef\u754c\u9762\u7cfb\u7edf\uff0c\u901a\u8fc7\u9875\u9762\u4e0a\u7684\u4e00\u4e9b\u529f\u80fd\u9009\u9879\u8fdb\u884c\u5bf9\u5e94\u6d4b\u8bd5\u4efb\u52a1\u7684\u7ba1\u7406\u6216\u89e6\u53d1\uff0c\u4e1a\u5185\u6bd4\u8f83\u6d41\u884c\u7684\u5b9e\u73b0\u65b9\u6848\u662f\u4f7f\u7528 Vue + DRF \u5b9e\u73b0\u4e00\u4e2a\u524d\u540e\u7aef\u5206\u79bb\u7684\u7cfb\u7edf\u3002 \u6d4b\u8bd5\u5e73\u53f0\u53ef\u80fd\u4f1a\u6d89\u53ca\u5230\u7684\u6a21\u5757\u6709\uff1a\u6d4b\u8bd5\u673a\u8d44\u6e90\u7ba1\u7406\u6a21\u5757\u3001\u7528\u4f8b\u6267\u884c\u63a7\u5236\u6a21\u5757\u3001\u7ed3\u679c\u5c55\u793a\u6a21\u5757\u3001PXE \u955c\u50cf\u5b89\u88c5\u6a21\u5757\u7b49\u3002 \u7528\u6237\uff08\u6d4b\u8bd5\u3001\u7814\u53d1\u540c\u5b66\u7b49\uff09\u53ef\u4ee5\u914d\u7f6e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5982\u6267\u884c\u54ea\u4e2a\u5e94\u7528\u3001\u6267\u884c\u7528\u4f8b\u7684\u8303\u56f4\u3001\u5728\u54ea\u53f0\u673a\u5668\u4e0a\u6267\u884c\u3001\u955c\u50cf\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u5e94\u7528\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u6267\u884c\u65f6\u95f4\u3002 5.2\u3001\u6267\u884c\u5165\u53e3 runner \u63d0\u4f9b\u7ed9\u6d4b\u8bd5\u5e73\u53f0\u7684\u63a5\u53e3\u5305\u62ec\uff1a\u7528\u4f8b\u6267\u884c\u63a5\u53e3\u3001\u7ed3\u679c\u8fd4\u56de\u63a5\u53e3\u3001\u955c\u50cf\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u955c\u50cf\u5b89\u88c5\u63a5\u53e3\u3001\u5e94\u7528\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u5e94\u7528\u5b89\u88c5\u66f4\u65b0\u63a5\u53e3\u7b49\u3002 \u524d\u7aef\u5e73\u53f0\u76ee\u524d\u8fd8\u6ca1\u6709\u592a\u591a\u8be6\u7ec6\u7684\u65b9\u6848\uff0c\u672c\u6b21\u8bbe\u8ba1\u4e3b\u8981\u96c6\u4e2d\u5728\u540e\u7aef\u8fd9\u90e8\u5206\u67b6\u6784\u7684\u8bbe\u8ba1\u4e0a\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_5","title":"\u56db\u3001\u5b9e\u65bd\u8ba1\u5212","text":"\u8fd1\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u6587\u7ba1\u4ee3\u7801\u89e3\u8026 2022/3/28 2022/4/8 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u56fe\u5f62\u56fe\u50cf\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u97f3\u89c6\u9891\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5168\u5c40\u641c\u7d22\u4ee3\u7801\u89e3\u8026 2022/4/25 2022/4/26 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u516c\u5171\u5e93\u5efa\u8bbe 2022/4/27 2022/5/5 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5c01\u88c5\u7684\u65b9\u6cd5\u6574\u7406\u6210\u4e00\u4e2a\u8868 2022/5/6 2022/5/10 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7528\u4f8b\u6807\u7b7e\u5206\u7c7b\u8bc4\u4f30 2022/5/11 2022/5/11 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u6807\u7b7e\u5316\u6267\u884c\u9a71\u52a8\u7a0b\u5e8f\u7f16\u5199 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u9700\u5b9e\u73b0\u81ea\u52a8\u89e3\u6790 csv \u8868\u683c\u4e2d\u7684\u7528\u4f8b\u7f16\u53f7 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u722c\u866b\u811a\u672c\uff0c\u722c\u53d6 pms \u4e0a\u7528\u4f8b\u7684\u6807\u7b7e 2022/5/11 2022/5/13 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u5b9a\u65f6\u81ea\u52a8\u7ef4\u62a4\u672c\u5730 csv \u6587\u4ef6\u811a\u672c 2022/5/11 2022/5/20 \u4e2d\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u76ee\u5f55\u7ed3\u6784\u8c03\u6574 2022/5/20 2022/6/2 \u5b8c\u6210\u5168\u5c40\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u5177\u4f53\u65b9\u6848\u548c\u903b\u8f91\u5b9e\u73b0 2022/6/6 2022/6/17 \u9759\u6001\u626b\u63cf\u95ee\u9898\u6e05\u96f6 2022/6/20 2022/7/1 \u5b8c\u6210\u65b0\u6846\u67b6\u4f7f\u7528\u57f9\u8bad 2022/7/4 2022/7/11 \u843d\u5730\u8fd0\u884c 2022/7/12 2022/7/20 \u5e95\u5c42\u5e93\u7528\u9014\u8bf4\u660e\u6587\u6863\u7f16\u5199 2022/7/21 2022/7/28"}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\u200b\\u3000\\-\u3001\u3002\uff0c\uff0e\uff1f\uff01\uff1b]+","pipeline":["stemmer"]},"docs":[{"location":"","title":"\u9996\u9875","text":""},{"location":"#youqu","title":"\u6709\u8da3\uff08YouQu\uff09","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/4/1\n# Author : Mikigo\n# =============================================\n \u672c\u7ad9\u603b\u8bbf\u95ee\u91cf \u6b21 \u6b22\u8fce\u5728\u6d4f\u89c8\u5668\u8bbf\u95ee\u3010\u516c\u7f51\u6587\u6863\u3011 \u7edf\u4fe1\u516c\u53f8\u5185\u7f51\u8fd8\u53ef\u4ee5\u8bbf\u95ee\u3010\u5185\u7f51\u6587\u6863\u3011\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u54e6~~"},{"location":"#_1","title":"\u4e00\u3001\u7b80\u4ecb","text":"\u6709\u8da3\uff08YouQu\uff09\u662f\u6df1\u5ea6\u79d1\u6280\u8bbe\u8ba1\u548c\u5f00\u53d1\u7684\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff0c\u91c7\u7528\u7ed3\u6784\u5206\u5c42\u7684\u8bbe\u8ba1\u7406\u5ff5\uff0c\u652f\u6301\u591a\u5143\u5316\u5143\u7d20\u5b9a\u4f4d\u548c\u65ad\u8a00\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\u3001\u5f3a\u5927\u7684\u65e5\u5fd7\u548c\u62a5\u544a\u8f93\u51fa\u7b49\u7279\u8272\u529f\u80fd\uff0c\u540c\u65f6\u5b8c\u7f8e\u517c\u5bb9X11\u3001Wayland\u663e\u793a\u534f\u8bae\uff0c\u73af\u5883\u90e8\u7f72\u7b80\u5355\uff0c\u64cd\u4f5c\u6613\u4e0a\u624b\u3002"},{"location":"#17","title":"\u7231\u4e0a \u201c\u6709\u8da3\u201d \u7684 17 \u4e2a\u7406\u7531","text":" \u6838\u5fc3\u5e93\u63d0\u4f9b\u4e86\u7edf\u4e00\u7684\u63a5\u53e3\uff0c\u7f16\u5199\u65b9\u6cd5\u65f6\u53ea\u9700\u8981\u5bfc\u5165\u4e00\u4e2a\u5305\u5c31\u53ef\u4ee5\u4f7f\u7528\u5230\u6838\u5fc3\u5e93\u63d0\u4f9b\u7684\u6240\u6709\u529f\u80fd\uff1b \u516c\u5171\u5e93\u5c01\u88c5\u4e86\u5f88\u591a\u5e38\u7528\u6a21\u5757\u7684\u76f8\u5173\u65b9\u6cd5\uff0c\u6bd4\u5982\uff1a\u4efb\u52a1\u680f\u7684\u64cd\u4f5c\u3001\u684c\u9762\u7684\u64cd\u4f5c\u3001\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\u7b49\u7b49\uff1b \u9664\u4e86\u5e38\u7528\u7684\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u8bc6\u522b\u4ee5\u5916\uff0c\u6211\u4eec\u8fd8\u63d0\u4f9b\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u5176\u4f7f\u7528\u7b80\u5355\u4e14\u9ad8\u6548\uff0c\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff1b \u5bf9\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u5c06\u7f16\u5199\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u53d8\u5f97\u7b80\u5355\u800c\u4f18\u96c5\uff1b \u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u6280\u672f\u8fdb\u884c\u529f\u80fd\u5347\u7ea7\uff0c\u9664\u4e86\u652f\u6301\u5355\u4e2a\u5750\u6807\u8fd4\u56de\uff0c\u8fd8\u652f\u6301\u540c\u4e00\u754c\u9762\u4e0b\u591a\u4e2a\u76f8\u540c\u5143\u7d20\u8fd4\u56de\u591a\u4e2a\u5750\u6807\u7684\u529f\u80fd\uff1b \u63d0\u4f9b\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u548c\u6279\u91cf\u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u4e0d\u5230\u4e00\u4e2a csv \u6587\u4ef6\u539f\u6765\u80fd\u5e72\u8fd9\u4e48\u591a\u4e8b\u60c5\uff1b \u63d0\u4f9b\u4e86\u529f\u80fd\u5f3a\u5927\u7684\u6267\u884c\u5668\u5165\u53e3\uff0c\u8ba9\u4f60\u53ef\u4ee5\u65b9\u4fbf\u7684\u5728\u672c\u5730\u6267\u884c\u4efb\u4f55\u7528\u4f8b\u96c6\u7684\u7528\u4f8b\uff0c\u5176\u4e30\u5bcc\u7684\u81ea\u5b9a\u4e49\u914d\u7f6e\u9879\uff0c\u6ee1\u8db3\u4f60\u5bf9\u6267\u884c\u5668\u6240\u6709\u7684\u5e7b\u60f3\uff1b \u63d0\u4f9b\u8fdc\u7a0b\u6267\u884c\u7684\u529f\u80fd\uff0c\u53ef\u4ee5\u63a7\u5236\u591a\u53f0\u673a\u5668\u5e76\u884c\u8dd1\uff0c\u6216\u8005\u5206\u5e03\u5f0f\u8dd1\uff0c\u8fd9\u79cd\u4ed8\u8d39\u529f\u80fd\u73b0\u5728\u514d\u8d39\u7ed9\u4f60\u7528\uff1b \u63d0\u4f9b\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u529f\u80fd\uff0c\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u6bcf\u4e2a\u65b9\u6cd5\u5355\u72ec\u5199\u8f93\u51fa\u65e5\u5fd7\u7684\u4ee3\u7801\uff0c\u4e00\u5207\u6211\u4eec\u7ed9\u4f60\u641e\u5b9a\u4e86\uff0c\u65e5\u5fd7\u8f93\u51fa\u4e0d\u4ec5\u5185\u5bb9\u4e30\u5bcc\uff0c\u989c\u503c\u4e5f\u7edd\u5bf9\u5728\u7ebf\uff0c\u6211\u4eec\u8fd8\u81ea\u5df1\u8bbe\u8ba1\u4e86\u4e00\u6b3e\u7ec8\u7aef\u8f93\u51fa\u4e3b\u9898\u53eb\u300a\u4e94\u5f69\u6591\u6593\u7684\u9ed1\u300b\uff1b \u63d0\u4f9b\u4e86\u4e00\u952e\u90e8\u7f72\u81ea\u52a8\u5316\u6d4b\u8bd5\u73af\u5883\u7684\u529f\u80fd\uff0c\u8fde\u4ee3\u7801\u7f16\u8f91\u5668\u90fd\u7ed9\u4f60\u88c5\u597d\u4e86\uff0c\u8ba9\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u73af\u5883\u90e8\u7f72\u800c\u70e6\u607c\uff1b \u63d0\u4f9b\u4e86\u81ea\u52a8\u751f\u6210\u591a\u79cd\u62a5\u544a\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u8f93\u51fa\u4ec0\u4e48\u62a5\u544a\u5f62\u5f0f\u90fd\u884c\uff0c\u800c\u4e14\u6211\u4eec\u5728\u62a5\u544a\u4e2d\u8fd8\u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\u548c\u5931\u8d25\u622a\u56fe\u7684\u529f\u80fd\uff1b \u5bf9\u65ad\u8a00\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u63d0\u4f9b\u66f4\u53cb\u597d\u5316\u7684\u9519\u8bef\u63d0\u793a\uff0c\u8ba9\u5b9a\u4f4d\u95ee\u9898\u7cbe\u51c6\u9ad8\u6548\uff1b \u4e0d\u4ec5\u652f\u6301\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u63a7\u5236\uff0c\u800c\u4e14\u8fd8\u652f\u6301\u52a8\u6001\u63a7\u5236\u7528\u4f8b\u6279\u91cf\u6267\u884c\u7684\u603b\u65f6\u95f4\uff0c\u786e\u4fdd CI \u73af\u5883\u4e0b\u80fd\u987a\u7545\u8fd0\u884c\uff1b \u652f\u6301\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\u6267\u884c\u3001PMS \u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6807\u7b7e\u5316\u6267\u884c\u65b9\u6848\uff0c\u6ee1\u8db3\u4f60\u5404\u79cd\u573a\u666f\u4e0b\u7684\u6267\u884c\u9700\u6c42\uff1b \u652f\u6301\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u529f\u80fd\uff0c\u53ef\u5b9a\u4f4d\u53ef\u65ad\u8a00\uff0c\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\uff1b \u5b8c\u7f8e\u517c\u5bb9 Wayland \u548c X11\uff0c\u771f\u6b63\u505a\u5230\u4e00\u5957\u4ee3\u7801\uff0c\u968f\u5904\u6267\u884c\uff1b \u652f\u6301\u591a\u79cd\u65b9\u5f0f\u7684\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u5176\u4e2d\u5f02\u6b65\u56de\u586b\u7684\u65b9\u6848\uff0c\u5b8c\u7f8e\u89e3\u51b3\u4e86\u6570\u636e\u56de\u586b\u7684\u8017\u65f6\u95ee\u9898\uff1b \u3010\u89c6\u9891\u4ecb\u7ecd\u3011"},{"location":"#_2","title":"\u4e8c\u3001\u5b89\u88c5\u4f7f\u7528","text":"\u57fa\u7840\u6846\u67b6\uff1ahttps://github.com/linuxdeepin/deepin-autotest-framework \u4ece PyPI \u5b89\u88c5: sudo pip3 install youqu\n \u521b\u5efa\u9879\u76ee: youqu-startproject youqu\n \u5b89\u88c5\u4f9d\u8d56: cd youqu\nbash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002 \u5e94\u7528\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684\u5e94\u7528\u540d\u79f0\u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music cd apps/\n \u5c06\u5e94\u7528\u5e93\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u50cf\u8fd9\u6837\uff1a youqu\n\u251c\u2500\u2500 apps\n\u2502 \u251c\u2500\u2500 autotest_deepin_music # \u5e94\u7528\u5e93\n...\n \u5e94\u7528\u5e93\u7684\u540d\u79f0\u4e0d\u53ef\u4ee5\u4fee\u6539\u3002"},{"location":"#_3","title":"\u4e09\u3001\u8fd0\u884c","text":""},{"location":"#1","title":"1. \u5de5\u4f5c\u7a7a\u95f4","text":"\u57fa\u7840\u6846\u67b6\u5de5\u7a0b\u76ee\u5f55\u5efa\u8bae\u653e\u5728 ~ \u76ee\u5f55\u4e0b\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u4e5f\u53ef\u4ee5\u8fd0\u884c\uff0c\u4f46\u662f\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u9700\u8981\u505a\u73af\u5883\u6e05\u7406\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u5b58\u5728\u4ee3\u7801\u88ab\u5220\u9664\u7684\u98ce\u9669\u3002 \u5982\u679c\u4f60\u7684\u673a\u5668\u4e0a\u4e0d\u540c\u76ee\u5f55\u4e0b\u5b58\u5728\u591a\u4e2a YouQu \u5de5\u7a0b\uff0c\u90a3\u4e48\u5728\u8fd0\u884c\u4e4b\u524d\uff0c\u8bf7\u5148\u6267\u884c env.sh \u6821\u6b63\u76f8\u5173\u73af\u5883\u3002"},{"location":"#2","title":"2. \u6267\u884c\u5668","text":"\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u6709\u4e00\u4e2a manage.py \uff0c\u5b83\u662f\u4e00\u4e2a\u6267\u884c\u5668\u5165\u53e3\uff0c\u63d0\u4f9b\u4e86\u672c\u5730\u6267\u884c\u3001\u8fdc\u7a0b\u6267\u884c\u7b49\u7684\u529f\u80fd\u3002 \u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6765\u6267\u884c\uff1a youqu manage.py run -a deepin-music\n"},{"location":"#21","title":"2.1. \u672c\u5730\u6267\u884c","text":"youqu manage.py run\n"},{"location":"#211","title":"2.1.1. \u914d\u7f6e\u6587\u4ef6","text":"\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u914d\u7f6e\u53c2\u6570 \u5728\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u91cc\u9762\u652f\u6301\u914d\u7f6e\u5bf9\u6267\u884c\u7684\u4e00\u4e9b\u53c2\u6570\u8fdb\u884c\u914d\u7f6e\uff0c\u5e38\u7528\u7684\u5982\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;-----------------------------------------------\n;1.KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2.KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f\n;e.g. TAGS = L1 or smoke\n;-----------------------------------------------\n;\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\uff0c\u5c06\u8981\u6267\u884c\u7684\u7528\u4f8b\u5199\u5165\u6307\u5b9a\u7684 csv \u6587\u4ef6\n;\u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u4ece\u57fa\u7840\u6846\u67b6\u6839\u76ee\u5f55\u5f00\u59cb\uff1ae.g. CASE_FILE = case_list.txt\n;\u5982\u679c\u8fd9\u91cc\u6709\u503c\uff0cAPP_NAME KEYWORDS TAGS \u7684\u914d\u7f6e\u5747\u4e0d\u751f\u6548\nCASE_FILE =\n;=============================== RUNNER CONFIG ===================================\n[runner]\n;\u6700\u5927\u5931\u8d25\u7528\u4f8b\u6570\u91cf\u7684\u5360\u6bd4\n;\u6bd4\u5982\uff1a\u603b\u6267\u884c\u7528\u4f8b\u6570\u4e3a 100, \u82e5 MAX_FAIL = 0.5,\u5219\u5931\u8d25\u7528\u4f8b\u6570\u8fbe\u5230 50 \u5c31\u4f1a\u7ec8\u6b62\u6d4b\u8bd5\u3002\nMAX_FAIL = 1\n;\u5355\u6761\u7528\u4f8b\u7684\u8d85\u65f6\u65f6\u95f4\uff0c\u5982\u679c\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u8d85\u65f6\uff0c\u8fd9\u6761\u7528\u4f8b\u4f1a\u88ab\u505c\u6b62\uff0c\u540e\u7eed\u7528\u4f8b\u7ee7\u7eed\u6267\u884c\u3002\n;\u5355\u4f4d\u4e3a\u79d2\n;\u8fd9\u662f\u4e00\u4e2a\u5168\u5c40\u7edf\u4e00\u914d\u7f6e\uff0c\u5982\u679c\u67d0\u6761\u7528\u4f8b\u9700\u8981\u5355\u72ec\u914d\u7f6e\u8d85\u65f6\u65f6\u95f4\uff0c\u53ef\u4ee5\u5728\u7528\u4f8b\u4e2d\u8fd9\u6837\u5199\uff1a\n;@pytest.mark.timeout(500)\n;def test_xxx_001():\n; ...\n;\u4f1a\u8bdd\u8d85\u65f6\uff08\u6240\u6709\u7528\u4f8b\u6267\u884c\u7684\u8d85\u65f6\u65f6\u95f4\uff09\u662f\u6839\u636e\u5168\u5c40\u8d85\u65f6\u914d\u7f6e\u548c\u7528\u4f8b\u5355\u72ec\u8d85\u65f6\u914d\u7f6e\u81ea\u52a8\u8ba1\u7b97\u7684\u3002\nCASE_TIME_OUT = 200\n;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\n;\u6ce8\u610f\uff0cRERUN = 1 \u8868\u793a\u91cd\u8dd1 1 \u6b21\uff0c\u5373\u7b2c\u4e00\u6b21\u7528\u4f8b\u6267\u884c\u5931\u8d25\u4f1a\u81ea\u52a8\u91cd\u8dd1 1 \u6b21\uff0c\u603b\u5171\u6267\u884c 2 \u6b21\uff1b\n;\u5982\u679c\u7b2c 2 \u6b21\u6267\u884c\u6210\u529f\uff0c\u7ed3\u679c\u6210\u529f\uff0c\u5931\u8d25\u4ea6\u4e3a\u5931\u8d25\u3002\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c 1 \u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff0cRERUN >= RECORD_FAILED_CASE\u3002\n;1.\u5173\u95ed\u5f55\u5c4f\uff1aRECORD_FAILED_CASE > RERUN\n;2.\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1aRECORD_FAILED_CASE = 0\nRECORD_FAILED_CASE = 1\n;yes \u6bcf\u6761\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u8fdb\u884c\u73af\u5883\u6e05\u7406\nCLEAN_ALL = yes\n;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387, \u6bd4\u5982\uff1a1920x1080\n;no: \u8868\u793a\u4e0d\u505a\u5206\u8fa8\u7387\u6821\u9a8c\nRESOLUTION = 1920x1080\n;\u4e0d\u8df3\u8fc7\u7528\u4f8b\uff0ccsv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86 skip-xxx\u7684\u7528\u4f8b\u4e0d\u8df3\u8fc7\nNOSKIP = no\n;ignore fixed\n;no\uff0c\u53ea\u8981\u6807\u8bb0\u4e86fixed\u7684\u7528\u4f8b\uff0c\u5373\u4f7f\u6807\u8bb0\u4e86skip-\uff0c\u4e5f\u4f1a\u6267\u884c\uff1b\n;yes\uff0cfixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\uff1b\nIFIXED = no\n;\u8981\u5b89\u88c5deb\u5305\u7684\u8def\u5f84\n;e.g : ~/Downloads/ \u5b89\u88c5\u4e0b\u8f7d\u76ee\u5f55\u4e0b\u7684deb\u5305\uff0c\u5982\u679c\u662f\u8fdc\u7a0b\u6267\u884c\uff0c\u4f1a\u81ea\u52a8\u62f7\u8d1d\u5230\u8fdc\u7a0b\u5e76\u5b89\u88c5\u3002\nDEB_PATH =\n;DEBUG \u6a21\u5f0f\u6267\u884c\u7528\u4f8b\uff0c\u53ea\u6536\u96c6\u4e0d\u6267\u884c\u7528\u4f8b\uff0c\u4e5f\u4e0d\u505a\u8bbe\u5907\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002\nDEBUG = no\n;\u8bb0\u5f55top\u547d\u4ee4\u67e5\u8be2\u7684\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0cTOP = 3 \u8868\u793a\u8bb0\u5f55\u524d3\u4e2a\u8fdb\u7a0b\u3002\nTOP =\n;\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\nREPEAT =\n;\u9ed8\u8ba4\u5728\u6240\u6709\u6d4b\u8bd5\u5b8c\u6210\u4e4b\u540e\u8f93\u51fa\u62a5\u9519\u4fe1\u606f.\n;yes, \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\nDURING_FAIL = no\n;\u6ce8\u518c\u81ea\u542f\u670d\u52a1\nAUTOSTART = no\n;=============================== REPORT CONFIG ===================================\n[report]\n;\u6d4b\u8bd5\u62a5\u544a\u7684title\nREPORT_TITLE = YouQu Report\n;\u6d4b\u8bd5\u62a5\u544a\u7684name\nREPORT_NAME = YouQu Report\n;\u6d4b\u8bd5\u62a5\u544a\u7684\u9ed8\u8ba4\u8bed\u8a00\n;en:English\n;ru:\u0420\u0443\u0441\u0441\u043a\u0438\u0439\n;zh:\u4e2d\u6587\n;de:Deutsch\n;nl:Nederlands\n;he:Hebrew\n;br:Brazil\n;pl:Polski\n;ja:\u65e5\u672c\u8a9e\n;es:Espa\u00f1ol\n;kr:\ud55c\uad6d\uc5b4\n;fr:Fran\u00e7ais\n;az:Az\u0259rbaycanca\nREPORT_LANGUAGE = zh\n;\u7528\u4f8b\u6267\u884c\u5b8c\u540e\u751f\u6210\u7684\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n;\u76ee\u524d\u652f\u6301 allure, xml, json \uff08\u652f\u6301\u540c\u65f6\u751f\u6210\uff09\nREPORT_FORMAT = allure, xml, json\n;\u6307\u5b9a\u62a5\u544a\u751f\u6210\u7684\u8def\u5f84\uff08\u76f8\u5bf9\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\uff09\nALLURE_REPORT_PATH = report/\nXML_REPORT_PATH = report/\nJSON_REPORT_PATH = report/\n;=============================== GLOBAL CONFIG ===================================\n[globalconfig]\n;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\nPASSWORD = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\nIMAGE_MATCH_NUMBER = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6bcf\u6b21\u95f4\u9694\u7b49\u5f85\u65f6\u95f4\nIMAGE_MATCH_WAIT_TIME = 1\n;\u56fe\u50cf\u8bc6\u522b\u5339\u914d\u5ea6\nIMAGE_RATE = 0.9\n;\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u5b9e\u65f6\u56fe\u50cf\u4fdd\u5b58\u8def\u5f84\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u5750\u6807\nSCREEN_CACHE = /tmp/screen.png\n;\u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\u7684\u8def\u5f84\nTMPDIR = /tmp/tmpdir\n;\u7cfb\u7edf\u4e3b\u9898\nSYS_THEME = deepin\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = youqu-dev.uniontech.com\n;OpenCV\u670d\u52a1\u7aef\u5730\u5740\nOPENCV_SERVER_HOST = youqu-dev.uniontech.com\n;=============================== PMS CONFIG ===================================\n;PMS\u76f8\u5173\u914d\u7f6e\uff0c\u5305\u542b\u4ee5\u4e0b\u51e0\u4e2a\u65b9\u9762\uff1a\n;1.PMS\u6d4b\u8bd5\u5957\u6267\u884c\n;2.\u81ea\u52a8\u4ecePMS\u722c\u53d6\u6570\u636e\u5e76\u540c\u6b65\u672c\u5730CSV\u6587\u4ef6\n;3.PMS\u6570\u636e\u56de\u586b\n[pms]\n;PMS\u7684\u7528\u6237\u540d,\u5982: ut001234\nPMS_USER =\n;PMS\u7684\u5bc6\u7801\nPMS_PASSWORD =\n;PMS\u6d4b\u8bd5\u5957\u7684ID\n;\u5728PMS\u4e0a\u67e5\u770b\u7528\u4f8b\u201c\u5957\u4ef6\u201d\u94fe\u63a5: https://pms.uniontech.com/testsuite-view-495.html\n;\u6d4b\u8bd5\u5957ID\u4e3a: 495\nSUITE_ID =\n;\u6570\u636e\u56de\u586b\u5fc5\u987b\u5173\u8054PMS\u6d4b\u8bd5\u5355\n;\u5728PMS\u4e0a\u67e5\u770b\u6d4b\u8bd5\u5355\u94fe\u63a5: https://pms.uniontech.com/testtask-cases-20747.html\n;\u6d4b\u8bd5\u5355ID\u4e3a: 20747\nTASK_ID =\n;\u5c06\u6d4b\u8bd5\u7ed3\u679c\u6570\u636e\u56de\u586b\u5230PMS\n;\u4e3a\u7a7a: \u8868\u793a\u4e0d\u56de\u586b,\u4e0d\u4f1a\u5728\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u751f\u6210json\u7ed3\u679c\u6587\u4ef6;\n;async: \u8868\u793a\u9010\u6761\u5f02\u6b65\u56de\u586b,\u540e\u9762\u4e00\u6761\u6267\u884c\u5f00\u59cb\u65f6\u901a\u8fc7\u5b50\u7ebf\u7a0b\u5bf9\u524d\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u8fdb\u884c\u56de\u586b\uff0c\u5982\u6b64\u5b9e\u73b0\u65f6\u95f4\u6548\u7387\u6700\u5927\u5316;\n;finish: \u8868\u793a\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u6210\u4e4b\u540e\u9010\u4e2a\u56de\u586b(PMS\u4e0d\u652f\u6301\u5e76\u53d1);\nSEND_PMS =\n;\u6570\u636e\u56de\u586b\u7684\u89e6\u53d1\u8005\n;auto: \u6846\u67b6\u81ea\u52a8\u56de\u586b,\u914d\u5408SEND_PMS\u914d\u7f6e\u4f7f\u7528,\u4f60\u53ef\u4ee5\u9009\u62e9\u5728\u4e0d\u540c\u7684\u9636\u6bb5\u8fdb\u884c\u6570\u636e\u56de\u586b;\n;hand: \u624b\u52a8\u56de\u586b,\u6bcf\u6761\u7528\u4f8b\u4ecd\u7136\u4f1a\u751f\u6210json\u6587\u4ef6,\u4f46\u6846\u67b6\u4e0d\u4f1a\u8fdb\u884c\u6570\u636e\u56de\u586b,\u9700\u8981\u4f60\u53ef\u4ee5\u5728\u4f60\u60f3\u8981\u53d1\u9001\u7684\u65f6\u95f4\u70b9\u624b\u52a8\u89e6\u53d1\u56de\u586b;\nTRIGGER = auto\n;PMS\u56de\u586b\u7684\u91cd\u8bd5\u6b21\u6570\n;\u5982\u679c\u63a5\u53e3\u8bf7\u6c42\u5931\u8d25,\u4f1a\u8fdb\u884c\u91cd\u8bd5\nSEND_PMS_RETRY_NUMBER = 2\n[csv_link_pms_lib]\n;caselib: \u7528\u4f8b\u5e93\n;testcase: \u4ea7\u54c1\u5e93\u7528\u4f8b\nCASE_FROM = caselib\n[csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/caselib-browse-81.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 81\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic =\n[export_csv]\n;\u5bfc\u51fa\u7684csv\u6587\u4ef6\u540d\u79f0\uff0c\u9ed8\u8ba4 case_list.csv\nCSV_FILE = case_list.csv\n;exportcsv \u547d\u4ee4\u5bfc\u51fa case_list.csv \u6587\u4ef6\u65f6\u914d\u7f6e\u7684\u5b57\u6bb5\u540d\uff0c\u7528\u4f8b\u540d\u79f0\u9ed8\u8ba4\u5b58\u5728\u7b2c\u4e00\u5217\uff0c\u65e0\u9700\u6dfb\u52a0\nCSV_HEARD = \u7528\u4f8b\u7ea7\u522b,\u7528\u4f8b\u7c7b\u578b,\u6d4b\u8bd5\u7ea7\u522b,\u662f\u5426\u8df3\u8fc7\n[log_cli]\n;\u65e5\u5fd7\u76f8\u5173\u914d\u7f6e\uff08\u4e0d\u6253\u5370\u6784\u9020\u51fd\u6570\u548c\u9b54\u6cd5\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff09\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = DEBUG\n# ============= \u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u914d\u7f6e ================\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u5f00\u5934\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7, \u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_STARTSWITH = Assert\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u7ed3\u5c3e\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_ENDSWITH = Widget\n;\u652f\u6301\u7c7b\u540d\u5305\u542b xxx \u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_CONTAIN = ShortCut\n# ==============================================\n \u914d\u7f6e\u5b8c\u6210\u4e4b\u540e\uff0c\u76f4\u63a5\u5728\u547d\u4ee4\u884c\u6267\u884c manage.py \u5c31\u597d\u4e86\u3002 youqu manage.py run\n"},{"location":"#212","title":"2.1.2. \u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a youqu manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -h, --help show this help message and exit\n-a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--record_failed_case RECORD_FAILED_CASE\n\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--max_fail MAX_FAIL \u6700\u5927\u5931\u8d25\u7387\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--resolution RESOLUTION\n\u68c0\u67e5\u5206\u8fa8\u7387\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms {,async,finish}\n\u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--trigger {,auto,hand}\n\u89e6\u53d1\u8005\n-f CASE_FILE, --case_file CASE_FILE\n\u6839\u636e\u6587\u4ef6\u6267\u884c\u7528\u4f8b\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n--pms_user PMS_USER pms \u7528\u6237\u540d\n--pms_password PMS_PASSWORD\npms \u5bc6\u7801\n--suite_id SUITE_ID pms \u6d4b\u8bd5\u5957ID\n--pms_info_file PMS_INFO_FILE\npms \u4fe1\u606f\u6587\u4ef6\n--top TOP \u8fc7\u7a0b\u4e2d\u8bb0\u5f55top\u547d\u4ee4\u4e2d\u7684\u503c\n--lastfailed \u4ec5\u6267\u884c\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\n--duringfail \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\n--repeat REPEAT \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n--project_name PROJECT_NAME\n\u5de5\u7a0b\u540d\u79f0\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--build_location BUILD_LOCATION\n\u6784\u5efa\u5730\u533a\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--line LINE \u6267\u884c\u7684\u4e1a\u52a1\u7ebf\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--autostart AUTOSTART \u7528\u4f8b\u6267\u884c\u7a0b\u5e8f\u6ce8\u518c\u5230\u5f00\u673a\u81ea\u542f\u670d\u52a1\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a youqu manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\"\n \u547d\u4ee4\u884c\u53c2\u6570\u4f18\u5148\u7ea7\u662f\u9ad8\u4e8e\u914d\u7f6e\u6587\u4ef6\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u4e86\u5bf9\u5e94\u7684\u53c2\u6570\uff0c\u914d\u7f6e\u6587\u4ef6\u4e2d\u4e0d\u7ba1\u662f\u5426\u914d\u7f6e\u5747\u4e0d\u751f\u6548\u3002 --app \u5165\u53c2\u8fd8\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\uff0c\u4e0b\u9762\u7684\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u540c\u6837\u652f\u6301\u3002"},{"location":"#22","title":"2.2. \u8fdc\u7a0b\u6267\u884c","text":"\u8fdc\u7a0b\u6267\u884c\u5c31\u662f\u7528\u672c\u5730\u4f5c\u4e3a\u670d\u52a1\u7aef\u63a7\u5236\u8fdc\u7a0b\u673a\u5668\u6267\u884c\uff0c\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u76f8\u540c\uff1b \u4f7f\u7528 remote \u547d\u4ee4\uff1a youqu manage.py remote\n"},{"location":"#221","title":"2.2.1. \u8fdc\u7a0b\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u6267\u884c","text":"\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u6267\u884c\u5c31\u662f\u7531\u672c\u5730 YouQu \u4f5c\u4e3a\u670d\u52a1\u7aef\uff0c\u63a7\u5236\u8fdc\u7a0b N \u53f0\u673a\u5668\u6267\u884c\u76f8\u540c\u7684\u7528\u4f8b\uff0c\u6267\u884c\u5b8c\u4e4b\u540e\u6240\u6709\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u7ed3\u679c\u4f1a\u8fd4\u56de\u7ed9\u670d\u52a1\u7aef report \u76ee\u5f55\u4e0b\uff1b \u8fdc\u7a0b\u6267\u884c\u540c\u6837\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u8fdb\u884c\u7528\u4f8b\u76f8\u5173\u914d\u7f6e\uff1b \u9700\u8981\u91cd\u70b9\u8bf4\u4e00\u4e0b\u8fdc\u7a0b\u6267\u884c\u65f6\u7684\u6d4b\u8bd5\u673a\u4fe1\u606f\u914d\u7f6e\uff0c\u5728\u914d\u7f6e\u6587\u4ef6 setting/remote.ini \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\u3001IP\u3001\u5bc6\u7801\u3002 ;=============================== CLIENT LIST =====================================\n; \u6d4b\u8bd5\u673a\u914d\u7f6e\u5217\u8868\n;[client{number}] ;\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u6709\u591a\u5c11\u53f0\u6d4b\u8bd5\u673a\u5c31\u5199\u591a\u5c11\u4e2a client\uff0c\u522b\u540d\u5fc5\u987b\u5305\u542b client \u5b57\u7b26\uff0c\u4e14\u4e0d\u80fd\u91cd\u590d\u3002\n;user = ;\u6d4b\u8bd5\u673a user\n;ip = ;\u6d4b\u8bd5\u673a ip\n;password = 1 ;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801, \u53ef\u4ee5\u4e0d\u914d\u7f6e\u6b64\u9879\uff0c\u9ed8\u8ba4\u53d6 CLIENT_PASSWORD \u7684\u503c\uff1b\n;\u5982\u679c\u4f60\u6240\u6709\u6d4b\u8bd5\u673a\u5bc6\u7801\u90fd\u76f8\u540c\uff0c\u90a3\u4e48\u53ea\u9700\u8981\u914d\u7f6e CLIENT_PASSWORD \u5c31\u53ef\u4ee5\u4e86\n;=================================================================================\n[client1]\nuser = uos\nip = 10.8.15.xx\n[client2]\nuser = uos\nip = 10.8.15.xx\n[client3]\nuser = uos\nip = 10.8.11.xx\n \u6709\u591a\u5c11\u53f0\u673a\u5668\u5c31\u50cf\u8fd9\u6837\u53c2\u8003\u4e0a\u9762\u7684\u683c\u5f0f\u5199\u5c31\u884c\u4e86\u3002 \u7136\u540e\u5728\u547d\u4ee4\u884c\uff1a youqu manage.py remote\n \u8fd9\u6837\u8fd0\u884c\u662f\u4ece\u914d\u7f6e\u6587\u4ef6\u53bb\u8bfb\u53d6\u76f8\u5173\u914d\u7f6e\u3002 \u5982\u679c\u4f60\u4e0d\u60f3\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\uff0c\u4f60\u4ecd\u7136\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u8fdb\u884c\u4f20\u53c2\uff0c \u4ee5\u4e0b\u4e3a python3 manage.py remote \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -h, --help show this help message and exit\n-c CLIENTS, --clients CLIENTS\n\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679cpassword\u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6sett\ning/remote.ini\u4e2dCLIENT_PASSWORD\u7684\u503c,\u6bd4\u5982: uos@10.8.13.33:1\n\u6216 uos@10.8.13.33\n-s, --send_code \u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a\uff08\u4e0d\u542breport\u76ee\u5f55\uff09\n-e, --build_env \u642d\u5efa\u6d4b\u8bd5\u73af\u5883,\u5982\u679c\u4e3ayes\uff0c\u4e0d\u7ba1send_code\u662f\u5426\u4e3ayes\u90fd\u4f1a\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a.\n-p CLIENT_PASSWORD, --client_password CLIENT_PASSWORD\n\u6d4b\u8bd5\u673a\u5bc6\u7801\uff08\u5168\u5c40\uff09\n-y PARALLEL, --parallel PARALLEL\nyes:\u8868\u793a\u6240\u6709\u6d4b\u8bd5\u673a\u5e76\u884c\u8dd1\uff0c\u6267\u884c\u76f8\u540c\u7684\u6d4b\u8bd5\u7528\u4f8b;no:\u8868\u793a\u6d4b\u8bd5\u673a\u5206\u5e03\u5f0f\u6267\u884c\uff0c\u670d\u52a1\u7aef\u4f1a\u6839\u636e\u6536\u96c6\u5230\u7684\u6d4b\u8bd5\u7528\u4f8b\u81ea\n\u52a8\u5206\u914d\u7ed9\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u3002\n \u9664\u4e86\u8fd9\u4e9b\u7279\u6709\u53c2\u6570\u4ee5\u5916\uff0c\u5b83\u540c\u6837\u652f\u6301\u672c\u5730\u6267\u884c\u7684\u6240\u6709\u53c2\u6570\uff1b \u5728\u547d\u4ee4\u884c\u8fd9\u6837\u8fd0\u884c\uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\"\n \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report \u76ee\u5f55\u4e0b\u56de\u6536\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u7684\u6d4b\u8bd5\u62a5\u544a\u3002 \u6ce8\u610f\uff0c\u5982\u679c\u8fdc\u7a0b\u673a\u5668\u6ca1\u6709\u642d\u5efa\u81ea\u52a8\u5316\u6d4b\u8bd5\u73af\u5883\uff0c\u8bb0\u5f97\u52a0\u4e0a\u53c2\u6570 -e \uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\" -e\n \u6267\u884c\u524d\u786e\u4fdd\u8fdc\u7a0b\u673a\u5668\u5df2\u7ecf\u5f00\u542f\u4e86 ssh \u670d\u52a1\uff0c\u5426\u5219\u4f1a\u63d0\u793a\u65e0\u6cd5\u8fde\u63a5\uff0c\u5982\u679c\u6ca1\u6709\u5f00\u542f\uff0c\u8bf7\u624b\u52a8\u5f00\u542f\uff1a sudo systemctl restart ssh\nsudo systemctl enable ssh\n \u914d\u7f6e\u6587\u4ef6\u5176\u4ed6\u76f8\u5173\u914d\u7f6e\u9879\u8be6\u7ec6\u8bf4\u660e\uff0c\u8bf7\u67e5\u770b\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u6ce8\u91ca\u5185\u5bb9\u3002"},{"location":"#222","title":"2.2.2. \u8fdc\u7a0b\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u8d1f\u8f7d\u5747\u8861\u6267\u884c","text":"\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u8d1f\u8f7d\u5747\u8861\u6267\u884c\u4e5f\u662f\u7528\u672c\u5730\u4f5c\u4e3a\u670d\u52a1\u7aef\u63a7\u5236\u8fdc\u7a0b\u673a\u5668\u6267\u884c\uff0c\u4f46\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u4e0d\u540c\uff0c\u800c\u662f\u6240\u6709\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u4e4b\u548c\uff0c\u4e3a\u4f60\u60f3\u8981\u6267\u884c\u7684\u7528\u4f8b\u96c6\uff1b \u4f3c\u4e4e\u6709\u70b9\u96be\u4ee5\u7406\u89e3\uff0c\u6211\u7528\u5927\u767d\u8bdd\u4e3e\u4f8b\u63cf\u8ff0\u4e0b\u5c31\u662f\uff0c\u670d\u52a1\u7aef\u60f3\u8981\u6267\u884c 10 \u6761\u7528\u4f8b\uff0c\u73b0\u5728\u8fdc\u7a0b\u673a\u5668\u6709 5 \u53f0\uff1b \u7136\u540e\u670d\u52a1\u7aef\u5c31\u5148\u62ff\u7740\u7b2c 1 \u6761\u7528\u4f8b\u7ed9\u8fdc\u7a0b 1 \u53f7\u673a\u6267\u884c\uff0c\u62ff\u7b2c 2 \u6761\u7528\u4f8b\u7ed9\u8fdc\u7a0b 2 \u53f7\u673a\u6267\u884c...\uff0c\u5982\u6b64\u5faa\u73af\u76f4\u5230\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\uff0c\u8fd9\u5c31\u662f\u8d1f\u8f7d\u5747\u8861\u6267\u884c\u3002 \u4f7f\u7528\u65b9\u6cd5\u548c\u524d\u9762\u4e00\u6837\uff0c\u53ea\u662f\u9700\u8981\u589e\u52a0\u4e00\u4e2a\u53c2\u6570\uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\" --parallel no\n"},{"location":"#23-pms","title":"2.3. PMS \u6570\u636e\u56de\u586b","text":"\u6d4b\u8bd5\u5355\u5173\u8054\u7684\u7528\u4f8b\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u5bf9\u5e94\u7684\u53bb\u8dd1\u8fd9\u4e9b\u5173\u8054\u7684\u7528\u4f8b\uff0c\u5e76\u4e14\u5c06\u6267\u884c\u7684\u7ed3\u679c\u56de\u586b\u7684\u6d4b\u8bd5\u7528\u4f8b\u7684\u72b6\u6001\u91cc\u9762\u3002 PMS \u6570\u636e\u56de\u586b\u4e3b\u8981\u6709\u4e09\u79cd\u65b9\u5f0f\uff1a \uff081\uff09\u5f02\u6b65\u56de\u586b \u5728\u7528\u4f8b\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\uff0c\u91c7\u7528\u5f02\u6b65\u7684\u65b9\u5f0f\u53bb\u8fdb\u884c\u6570\u636e\u56de\u586b\uff0c\u76f4\u767d\u7684\u8bb2\u5c31\u662f\uff0c\u7b2c\u4e8c\u6761\u7528\u4f8b\u5f00\u59cb\u8dd1\u7684\u65f6\u5019\uff0c\u901a\u8fc7\u5b50\u7ebf\u7a0b\u53bb\u505a\u7b2c\u4e00\u6761\u7528\u4f8b\u7684\u6570\u636e\u56de\u586b\uff0c\u5982\u6b64\u5faa\u73af\uff0c\u76f4\u5230\u6240\u6709\u7528\u4f8b\u6267\u884c\u7ed3\u675f\uff1b \u8fd9\u79cd\u65b9\u6848\u7684\u65f6\u95f4\u6548\u7387\u6700\u9ad8\u7684\uff0c\u56e0\u4e3a\u7406\u8bba\u4e0a\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u662f\u5927\u4e8e\u6570\u636e\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\u65f6\u95f4\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u5f53\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u6570\u636e\u56de\u586b\u4e5f\u5b8c\u6210\u4e86\u3002 \u4f7f\u7528\u65b9\u6cd5\uff0c\u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u4ee5\u4e0b\u53c2\u6570\uff1a\uff08\u4ee5\u4e0b\u6d89\u53ca\u5230\u7684\u53c2\u6570\u914d\u7f6e\u90fd\u662f\u5728\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u914d\u7f6e\uff09 PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = async\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \u8fd9\u4e2a\u53c2\u6570\u53ef\u586b\u53ef\u4e0d\u586b\uff0c\u4f46\u662f\u586b\u4e86\u53ef\u4ee5\u63d0\u9ad8\u7528\u4f8b\u7684\u6267\u884c\u901f\u5ea6\uff0c\u56e0\u4e3a\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u53ef\u4ee5\u6307\u5b9a\u5230\u5177\u4f53\u7684\u5e94\u7528\u5e93\u3002\uff08\u4e0b\u540c\uff09\n \uff082\uff09\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u56de\u586b \u7b49\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u518d\u9010\u4e2a\u8fdb\u884c\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u6b64\u65b9\u6848\u65f6\u95f4\u6548\u7387\u6bd4\u8f83\u4f4e\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \uff083\uff09\u624b\u52a8\u56de\u586b \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4e0d\u505a\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u540e\u7eed\u624b\u52a8\u5c06\u7ed3\u679c\u8fdb\u884c\u56de\u586b\u8bf7\u6c42\u3002 \u7528\u4f8b\u6267\u884c\u65f6\u914d\u7f6e\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = hand\nAPP_NAME = \u540e\u7eed\u624b\u52a8\u56de\u586b\u65b9\u6cd5\uff1a youqu manage.py pms --send2task yes\n"},{"location":"#_4","title":"\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898","text":"\u7531\u540c\u5b66\u53ef\u80fd\u4f1a\u53d1\u73b0\uff0c\u600e\u4e48\u56de\u586b\u4e00\u6b21\u4e4b\u540e\uff0c\u540e\u9762\u60f3\u518d\u6b21\u56de\u586b\u5c31\u4e0d\u751f\u6548\u4e86\uff1b \u8fd9\u662f\u56e0\u4e3a\u4e3a\u4e86\u5e94\u5bf9\u524d\u9762\u63d0\u5230\u7684\u591a\u79cd\u6570\u636e\u56de\u586b\u7684\u65b9\u5f0f\uff0c\u5728 report \u76ee\u5f55\u4e0b\u4f1a\u7531 pms_xxx \u5f00\u5934\u7684\u76ee\u5f55\uff0c\u8bb0\u5f55\u4e86\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u548c\u56de\u586b\u60c5\u51b5\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u4e4b\u524d\u5df2\u7ecf\u56de\u586b\u8fc7\u4e86\uff0c\u540e\u7eed\u5c31\u4e0d\u4f1a\u518d\u6b64\u89e6\u53d1\u56de\u586b\u4e86\uff1b \u5982\u679c\u4f60\u60f3\u91cd\u65b0\u505a\u56de\u586b\uff0c\u4f60\u53ef\u4ee5\u628a report/pms_xxx \u76ee\u5f55\u5220\u6389\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u91cd\u65b0\u505a\u6570\u636e\u56de\u586b\u4e86\uff1b"},{"location":"#24-csv","title":"2.4. \u5bfc\u51fa CSV \u6587\u4ef6","text":"\u6846\u67b6\u63d0\u4f9b\u5bfc\u51fa\u6307\u5b9a\u6807\u7b7e\u7528\u4f8b\u7684\u529f\u80fd\uff1a youqu manage.py exportcsv -a deepin-album -t CICD\n \u8868\u793a\u5bfc\u51fa deepin-album \u7684\u7528\u4f8b\u4e2d\u6807\u8bb0\u4e86 CICD \u6807\u7b7e\u7684\u7528\u4f8b\uff0c\u5bfc\u51fa CSV \u6587\u4ef6\u7684\u5b57\u6bb5\u683c\u5f0f\u5df2\u7ecf\u9002\u914d\u4e86 CICD \u7684\u8981\u6c42\u3002"},{"location":"#25-app","title":"2.5. \u811a\u624b\u67b6\u65b0\u5efa APP \u5de5\u7a0b","text":"\u65b0\u5efa\u4e00\u4e2a APP \u5de5\u7a0b\uff1a youqu manage.py startapp autotest_deepin_some \u8fd9\u6837\u5728 apps \u76ee\u5f55\u4e0b\u4f1a\u521b\u5efa\u4e00\u4e2a\u5b50\u9879\u76ee\u5de5\u7a0b autotest_deepin_some\uff0c\u540c\u65f6\u65b0\u5efa\u597d\u5de5\u7a0b\u6a21\u677f\u76ee\u5f55\u548c\u6a21\u677f\u6587\u4ef6\uff1a apps\n\u2514\u2500\u2500 autotest_deepin_some\n \u00a0\u00a0 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_case.py\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 config.ini\n \u00a0\u00a0 \u251c\u2500\u2500 config.py\n \u00a0\u00a0 \u251c\u2500\u2500 conftest.py\n \u00a0\u00a0 \u251c\u2500\u2500 control\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_assert.py\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some.csv\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u2514\u2500\u2500 widget\n \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 case_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 other.ini\n \u00a0\u00a0 \u251c\u2500\u2500 other_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 pic_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2514\u2500\u2500 ui.ini\n autotest_deepin_some \u662f\u4f60\u7684\u5de5\u7a0b\u540d\u79f0\uff0c\u6bd4\u5982\uff1aautotest_deepin_music \uff1b \u5728\u6b64\u57fa\u7840\u4e0a\uff0c\u4f60\u53ef\u4ee5\u5feb\u901f\u7684\u5f00\u59cb\u4f60\u7684 AT \u9879\u76ee\u3002"},{"location":"#26","title":"2.6. \u7528\u4f8b\u6807\u7b7e\u81ea\u52a8\u540c\u6b65","text":"\u7528\u4e8e\u81ea\u52a8\u540c\u6b65 PMS \u7528\u4f8b\u6807\u7b7e\u6570\u636e\u81f3\u672c\u5730 CSV \u6587\u4ef6\uff0c\u4e3b\u8981\u901a\u8fc7\u4ee5\u4e0b\u51e0\u4e2a\u914d\u7f6e\u6765\u63a7\u5236\uff1a APP_NAME = # \u6307\u5b9a\u8981\u540c\u6b65\u7684\u5e94\u7528\u540d\u79f0\nPMS_USER = # PMS\u7684\u7528\u6237\u540d\nPMS_PASSWORD = # PMS\u7684\u5bc6\u7801\n \u5728 [csv_link_pms_id] \u8282\u70b9\u4e0b\u6307\u5b9a csv \u6587\u4ef6\u540d\u4e0e PMS \u7528\u4f8b\u6a21\u5757\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u6bd4\u5982\uff1a [csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/testcase-browse-53.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 53\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic = 53\n \u5c06\u4ee5\u4e0a\u4fe1\u606f\u914d\u7f6e\u597d\u4e4b\u540e\uff0c\u5728\u547d\u4ee4\u884c\u6267\u884c\uff1a youqu manage.py pms --pms2csv yes\n \u6bcf\u6b21\u6267\u884c\u65f6\u539f csv \u6587\u4ef6\u4f1a\u81ea\u52a8\u5907\u4efd\u5728 report/csv_back \u76ee\u5f55\u4e0b\uff0c\u56e0\u6b64\u4f60\u4e0d\u7528\u62c5\u5fc3\u811a\u672c\u6267\u884c\u5bfc\u81f4\u4f60\u7684\u6570\u636e\u4e22\u5931\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u57fa\u7840\u6846\u67b6\u8bbe\u8ba1\u65b9\u6848","text":"# ====================================\n# Author : Mikigo\n# Time : 2022/3/18\n# version \uff1a1.0\n# ====================================\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"\u505a\u4e00\u4e2a\u7b80\u5355\u3001\u597d\u7528\u3001\u529f\u80fd\u5f3a\u5927\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u3002 \u4f5c\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4e00\u4e2a\u57fa\u7840\u6846\u67b6\uff0c\u4efb\u4f55\u5e94\u7528\u90fd\u80fd\u5f88\u65b9\u4fbf\u7684\u63a5\u5165\u8fdb\u6765\uff1b \u63d0\u4f9b\u6240\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u9700\u8981\u7684\u5e95\u5c42\u529f\u80fd\uff0c\u5e76\u5bf9\u5916\u63d0\u4f9b\u552f\u4e00\u7684\u63a5\u53e3\uff0c\u65b9\u4fbf\u5e94\u7528\u5e93\u4f7f\u7528\uff1b \u6574\u5408\u516c\u5171\u5e93\uff0c\u51cf\u5c11\u5e94\u7528\u5e93\u4ee3\u7801\u91cf\u548c\u65b9\u6cd5\u7ef4\u62a4\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u8bbe\u8ba1\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u7edf\u4e00\u6982\u5ff5","text":" \u57fa\u7840\u6846\u67b6 \u672c\u9879\u76ee\u662f\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\uff08AutoTest Basic Frame\uff09\uff0c\u5168\u79f0\u4e3a\u201c\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff08AT \u57fa\u7840\u6846\u67b6\uff09\u201d\u3002 AT \u57fa\u7840\u6846\u67b6\u662f\u505a\u4e3a\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\u6765\u8bbe\u8ba1\u7684\uff0c\u5b83\u63d0\u4f9b\u4e86\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u57fa\u7840\u529f\u80fd\uff0c\u4efb\u4f55\u5e94\u7528\u63a5\u5165\u8fdb\u6765\u90fd\u80fd\u5feb\u901f\u65b9\u4fbf\u7684\u8fdb\u884c\u65b9\u6cd5\u548c\u7528\u4f8b\u7f16\u5199\uff0c\u540c\u65f6\u5728\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u3001\u6807\u7b7e\u5316\u6267\u884c\u3001\u5206\u5e03\u5f0f\u6267\u884c\u3001\u591a\u79cd\u62a5\u544a\u8f93\u51fa\u3001\u4f18\u7f8e\u7684\u6267\u884c\u65e5\u5fd7\u3001\u5931\u8d25\u81ea\u52a8\u5f55\u5c4f\u548c\u622a\u56fe\u3001\u81ea\u52a8\u73af\u5883\u6e05\u7406\u7b49\u7b49\uff0c\u5b83\u90fd\u63d0\u4f9b\u4e86\u5b8c\u5584\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u66f4\u91cd\u8981\u7684\u662f\u8fd9\u4e00\u5207\u4f7f\u7528\u8d77\u6765\u90fd\u975e\u5e38\u7b80\u5355\u3002 \u57fa\u7840\u6846\u67b6\u4e2d\u5305\u542b\u5e94\u7528\u5e93\uff08apps\uff09\u3001\u6838\u5fc3\u5e93\uff08src\uff09\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09\u3002 \u5e94\u7528\u5e93\uff08apps\uff09 \u5404\u4e2a\u5e94\u7528\u81ea\u5df1\u7684\u4ed3\u5e93\uff0c\u91cc\u9762\u4e3b\u8981\u5305\u542b\u7684\u662f\u7528\u4f8b\u3001\u65b9\u6cd5\u53ca\u4e00\u4e9b\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u53eb autotest-dde-file-manager \u3002 \u6838\u5fc3\u5e93\uff08src\uff09 \u6838\u5fc3\u5e93\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u5230\u6240\u6709\u5e95\u5c42\u6838\u5fc3\u529f\u80fd\uff0c\u8fd9\u662f\u6700\u91cd\u8981\u7684\u4e00\u4e2a\u90e8\u5206\uff0c\u7075\u9b42\u3002\u5177\u4f53\u529f\u80fd\u6a21\u5757\u53ca\u8bf4\u660e\u4f1a\u5728\u4e0b\u9762\u7b2c\u56db\u4e2a\u7ae0\u8282\u8be6\u7ec6\u63cf\u8ff0\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09 \u591a\u4e2a\u5e94\u7528\u90fd\u8981\u7528\u5230\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\uff0c\u6309\u7167\u5e94\u7528\u5212\u5206\u5b58\u653e\uff0c\u4e3b\u8981\u662f\u4e3a\u4e86\u51cf\u5c11\u4ee3\u7801\u91cf\uff0c\u6d88\u9664\u5e94\u7528\u95f4\u7684\u8026\u5408\u5173\u7cfb\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u67b6\u6784\u56fe","text":"\u6574\u4f53\u7684\u6846\u67b6\u8bbe\u8ba1\u5728\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u300b\u6587\u6863\u91cc\u9762\u5df2\u7ecf\u6709\u8be6\u7ec6\u63cf\u8ff0\u4e86\uff0c\u8fd9\u91cc\u8d34\u4e00\u4e0b\u6574\u4f53\u7684\u67b6\u6784\u56fe\uff1a \u4e3a\u4e86\u7a81\u663e\u672c\u6587\u7684\u91cd\u70b9\uff0c\u62bd\u53d6\u5176\u4e2d\u91cd\u8981\u529f\u80fd\u6a21\u5757\uff0c\u5982\u4e0b\u56fe\uff1a "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-basic-frame # \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\n\u251c\u2500\u2500 apps # \u5e94\u7528\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-dde-file-manager # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\uff08\u5e94\u7528\u5e93\u8be6\u7ec6\u76ee\u5f55\u7ed3\u6784\u8bf7\u770b\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\uff09\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 tag # \u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u2514\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u2502 \u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 xxx.png\n\u2502 \u2502 ...\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-deepin-music # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 public # \u516c\u5171\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget # dde_dock \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget # dde_desktop \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 src # \u6838\u5fc3\u5e93\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 button_center.py\n\u2502 \u251c\u2500\u2500 cmdtrl.py\n\u2502 \u251c\u2500\u2500 dogtails.py\n\u2502 \u251c\u2500\u2500 find_image.py\n\u2502 \u251c\u2500\u2500 global_config.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 setting # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 config.py\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 global_config.ini\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\u6a21\u5757\uff08Hook\uff09\n\u251c\u2500\u2500 pytest.ini # Pytest \u9ed8\u8ba4\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 docs # \u6587\u6863\u76ee\u5f55\n\u2514\u2500\u2500 manage.py # \u6267\u884c\u5668\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1apps","title":"1\u3001\u5e94\u7528\u5e93\uff08apps\uff09","text":"\u6240\u6709\u5e94\u7528\u5e93\u5747\u653e\u7f6e\u5728\u57fa\u7840\u6846\u67b6\u4e0b\u7684 apps \u76ee\u5f55\u4e0b\uff08\u89c1\u7b2c\u4e8c\u7ae0\u8282\u7b2c3\u6bb5\u76ee\u5f55\u7ed3\u6784\u5185\u5bb9\uff09\u3002\u5e94\u7528\u5e93\u7684\u67b6\u6784\u8bbe\u8ba1\u53ef\u4ee5\u53c2\u8003\u300aAT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b\u6587\u6863\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2src","title":"2\u3001\u6838\u5fc3\u5e93\uff08src\uff09","text":"\u5728 src \u76ee\u5f55\u4e0b\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u5e95\u5c42\u6838\u5fc3\u7ec4\u4ef6\uff0c\u901a\u5e38\u6765\u8bb2\u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5230\u5176\u4e2d\u67d0\u4e00\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4e48\u4f60\u9700\u8981\u663e\u793a\u7684\u5bfc\u5165\u8fd9\u4e2a\u6a21\u5757\uff0c\u7136\u540e\u624d\u80fd\u4f7f\u7528\u8be5\u6a21\u5757\u4e0b\u7684\u529f\u80fd\uff0c\u5982\u679c\u4f60\u7528\u5230\u4e86\u5341\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4f60\u5c31\u9700\u8981\u5bfc\u5165\u5341\u4e2a\u3002\u4f46\u662f\u6211\u4eec\u60f3\u8ba9\u4e8b\u60c5\u53d8\u5f97\u7b80\u5355\uff0c\u4e00\u6b21\u5bfc\u5165\uff0c\u4f7f\u7528\u6240\u6709\u3002 \u5c06\u6240\u6709\u7684\u529f\u80fd\u6a21\u5757\u90fd\u8fdb\u5165\u5230 src \u7684\u540d\u79f0\u7a7a\u95f4\uff0c\u5728 src/__init__.py \u91cc\u9762\u6211\u4eec\u8bbe\u8ba1\u6210\u8fd9\u6837\uff1a # src/__init__.py\nfrom .cmdctl import CmdCtl\nfrom .dogtails import Dogtail\nfrom .find_image import FindImage\nfrom .button_center import ButtonCenter\nclass Src(CmdCtl, FindImage):\ndef __init__(self, **kwargs):\n\"\"\"dogtail or button center param\n :param kwargs: app_name, desc, number\n \"\"\"\nif kwargs:\napp_name = kwargs.get(\"APP_NAME\")\ndesc = kwargs.get(\"DESC\")\nif app_name is None or desc is None:\nraise ValueError\nnumber = kwargs.get(\"number\")\nnumber = number if isinstance(number, int) else -1\n# \u5bf9\u8c61\u7ec4\u5408\nself.dog = Dogtail(app_name, desc, number)\nself.ui = ButtonCenter(app_name, number)\n \u9700\u8981\u4f20\u9012\u53c2\u6570\u7684\u91c7\u7528\u5bf9\u8c61\u7ec4\u5408\uff0c\u6ca1\u6709\u53c2\u6570\u7684\u4f7f\u7528\u7ee7\u627f\uff0c\u7ee7\u627f\u7684\u7c7b\u7b26\u5408 Mixin \u8bbe\u8ba1\u6a21\u5f0f\u3002 \u5e94\u7528\u5e93\u91cc\u9762\u4f7f\u7528\u7684\u65f6\u5019\u5728 widget/base_widget.py \u91cc\u9762\u53ea\u9700\u8981\u552f\u4e00\u7ee7\u627f Src \uff1a # \u5e94\u7528\u5e93\u91cc\u9762\u65b9\u6cd5\u57fa\u7c7b\n# widget/base_widget.py\nfrom src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n \u8981\u4f7f\u7528\u6838\u5fc3\u5e93\u7684\u529f\u80fd\uff0c\u53ea\u9700\u8981\u5199\u4e00\u4e2a\u5bfc\u5165 from src import Src \u5373\u53ef\u3002 \u5199 __init__ \u6784\u9020\u51fd\u6570\u7684\u539f\u56e0\u662f\u901a\u8fc7\u53c2\u6570\u6784\u9020\u5e94\u7528\uff0c\u5e76\u4e14\u4f20\u9012 number \u8fdb\u6765\uff0c\u53ef\u4ee5\u5b9e\u73b0\u591a\u7a97\u53e3\u7684\u63a7\u5236\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3public","title":"3\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09","text":"\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6bcf\u4e2a\u5e94\u7528\u90fd\u662f\u4e00\u4e2a\u5355\u72ec\u7684 py \u6587\u4ef6\uff0c\u76f8\u4e92\u4e4b\u95f4\u662f\u72ec\u7acb\u7684\uff0c\u6bcf\u4e2a py \u6587\u4ef6\u91cc\u9762\u662f\u8be5\u5e94\u7528\u7684\u65b9\u6cd5\u7c7b\uff0c\u6bd4\u5982\uff1a\u6700\u5e38\u7528\u7684\u65b9\u6cd5\u7c7b dde_desktop_public_widget.py # dde_desktop_widget.py\nfrom src import Src\nclass _DdeDesktopPublicBaseWidget(Src):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-desktop\"\nDESC = \"/usr/bin/dde-desktop\"\ndef __init__(self):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC)\nclass DdeDesktopPublicWidget(_DdeDesktopPublicBaseWidget):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u7c7b\"\"\"\ndef click_music_dir_by_ui(self):\n\"\"\"\u5728\u6587\u4ef6\u9009\u62e9\u6846\u70b9\u51fb\u97f3\u4e50\u76ee\u5f55\"\"\"\nself.click(*self.ui.btn_center(\"\u4fa7\u8fb9\u680f-\u97f3\u4e50\")) \ndef click_xxx_by_attr(self):\npass\n \u516c\u5171\u65b9\u6cd5\u5e93\u610f\u4e49\uff1a \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6240\u5c01\u88c5\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\u90fd\u662f\u81f3\u5c11\u88ab2\u4e2a\u5e94\u7528\u90fd\u7528\u5230\u7684\uff0c\u8fd9\u6837\u505a\u53ef\u4ee5\u51cf\u5c11\u6574\u4f53\u4ee3\u7801\u91cf\uff0c\u4ece\u800c\u51cf\u8f7b\u5e94\u7528\u5e93\u4ee3\u7801\u7684\u7ef4\u62a4\u5de5\u4f5c\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u7f16\u5199\u5f62\u5f0f\uff08\u547d\u540d\u89c4\u5219\u3001\u5b9a\u4f4d\u7684\u65b9\u6848\u5199\u6cd5\u3001\u6ce8\u91ca\u7684\u5199\u6cd5\u7b49\u7b49\uff09\u5177\u6709\u4e00\u5b9a\u7684\u6a21\u677f\u4f5c\u7528\uff0c\u8fd9\u6837\u5373\u4f7f\u662f\u5404\u4e2a\u5e94\u7528\u5e93\u90fd\u72ec\u7acb\u7ef4\u62a4\uff0c\u6240\u6709\u7684\u7f16\u7801\u98ce\u683c\u90fd\u662f\u8d8b\u4e8e\u76f8\u540c\u7684\uff0c\u56e0\u4e3a\u5927\u5bb6\u90fd\u5e94\u8be5\u53c2\u7167\u516c\u5171\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u5199\u6cd5\u6765\u5199\u81ea\u5df1\u5e94\u7528\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\u7c7b\uff0c\u8fd9\u6837\u4f7f\u5f97\u4ece\u516c\u53f8\u7684\u89d2\u5ea6\u53bb\u770b\u6240\u6709\u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u90fd\u662f\u7edf\u4e00\u7684\u3002 \u53ef\u4ee5\u901a\u8fc7\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\uff0c\u4e86\u89e3\u5230\u5176\u4ed6\u5e94\u7528\u7684\u529f\u80fd\uff0c\u5bf9\u4e8e\u6211\u4eec\u9700\u6c42\u7406\u89e3\uff0c\u4e86\u89e3\u7cfb\u7edf\u7684\u65b9\u65b9\u9762\u9762\u4e5f\u6709\u597d\u5904\u3002 \u5f53\u7136\uff0c\u5982\u679c\u4f60\u7684\u5e94\u7528\u672c\u8eab\u662f\u5c5e\u4e8e\u6839\u672c\u5c31\u4e0d\u9700\u8981\u548c\u5176\u4ed6\u5e94\u7528\u4ea4\u4e92\u7684\uff0c\u90a3\u4e48\u4f60\u53ef\u80fd\u4e0d\u4f1a\u7528\u5230\u8fd9\u91cc\u9762\u7684\u529f\u80fd\uff0c\u6ca1\u5173\u7cfb\uff0c\u4f60\u6240\u6709\u7684\u65b9\u6cd5\u90fd\u53ef\u4ee5\u76f4\u63a5\u5199\u5728\u5e94\u7528\u5e93\u7684\u4e1a\u52a1\u5c42\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4conftestpy","title":"4\u3001conftest.py","text":"conftest.py \u4ece\u529f\u80fd\u4e0a\u5c06\u662f\u5c5e\u4e8e\u6838\u5fc3\u5e93\uff08src\uff09\u7684\u5185\u5bb9\uff0c\u4f46\u662f\u7531\u4e8e\u5b83\u7684\u7279\u6b8a\u6027\uff0c\u5373\u5b83\u662f\u5bf9\u5e94\u7528\u5e93\u4e2d\u7684\u7528\u4f8b\u751f\u6548\u7684\uff0c\u800c\u4e14\u5b83\u7684\u4f5c\u7528\u57df\u662f\u5f53\u524d\u76ee\u5f55\u53ca\u4ee5\u4e0b\uff0c\u56e0\u6b64\u6211\u4eec\u5c06\u5b83\u653e\u5230\u9879\u76ee\u6839\u76ee\u5f55\u3002\u6211\u4eec\u6846\u67b6\u4e2d\u6709\u4e0d\u5c11\u6838\u5fc3\u529f\u80fd\u90fd\u662f\u5728\u8fd9\u91cc\u9762\u8fdb\u884c\u5f00\u53d1\u7684\uff0c\u540e\u9762\u7b2c\u56db\u7ae0\u4f1a\u8bb2\u5230\u7ec6\u8282\u3002 pytest.ini \u4f5c\u7528\u548c conftest.py \u7c7b\u4f3c\uff0c\u662f Pytest \u6846\u67b6\u7684\u56fa\u5b9a\u914d\u7f6e\u6587\u4ef6\uff0c\u76ee\u524d\u914d\u7f6e\u4e86\u4e00\u4e9b\u901a\u7528\u7684\u547d\u4ee4\u884c\u6267\u884c\u53c2\u6570\uff0c\u4e5f\u653e\u5728\u9879\u76ee\u6839\u76ee\u5f55\u3002 \u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 Hook \u51fd\u6570\uff0capps \u76ee\u5f55\u4e0b\u7684 \u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 fixture \u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5setting","title":"5\u3001setting","text":"\u5168\u5c40\u914d\u7f6e\u6a21\u5757\uff0c\u5305\u542b\u4e86\u4ee5\u4e0b\u914d\u7f6e\u6587\u4ef6\uff1a \uff081\uff09ini \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u914d\u7f6e\u4e00\u4e9b\u5168\u5c40\u7684\u914d\u7f6e\u9879\uff0c\u8b6c\u5982\uff1a\u5931\u8d25\u91cd\u8dd1\u6b21\u6570\u3001\u662f\u5426\u5931\u8d25\u5f55\u5c4f\u3001\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\u3001\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4\u3001\u6267\u884c\u65f6\u65e5\u5fd7\u7ea7\u522b\u3001\u751f\u6210\u7684\u62a5\u544a\u7c7b\u578b\u3001\u4ee5\u53ca\u5206\u5e03\u5f0f\u6267\u884c\u7684\u4e00\u4e9b\u7b56\u7565\u914d\u7f6e\u9879\u7b49\u7b49\u3002 \uff082\uff09config.py \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u63d0\u4f9b\u914d\u7f6e\u6587\u4ef6\u8bfb\u53d6\u3001\u52a8\u6001\u83b7\u53d6\u4e00\u4e9b\u5e38\u91cf\uff08\u5982\u9879\u76ee\u6839\u76ee\u5f55\u7edd\u5bf9\u8def\u5f84 (BASE_DIR)\u3001\u7cfb\u7edf\u67b6\u6784\uff08SYS_FRAME\uff09\u3001\u65f6\u95f4\u5b57\u7b26\u4e32\uff08strftime\uff09\u3001\u672c\u673a USERNAME IP \u7b49\u7b49\uff09\u3001\u516c\u5171 URL \u7b49\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u89c4\u8303","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u7248\u672c\u53ca\u4f9d\u8d56","text":"\u57fa\u7840\u6846\u67b6\u4f1a\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u8fdb\u884c\u7248\u672c\u53d1\u5e03\uff0c\u4e0d\u4e0e\u67d0\u4e2a\u5e94\u7528\u7248\u672c\u7ed1\u5b9a\uff0c\u4f46\u662f\uff0c\u5e94\u7528\u5e93\u4f1a\u4f9d\u8d56\u4e8e\u57fa\u7840\u6846\u67b6\u7684\u7248\u672c\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u5efa\u8bae\u5728\u5e94\u7528\u5e93\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a\u6587\u672c\u6587\u4ef6\u7528\u4e8e\u8bb0\u5f55\u6240\u4f9d\u8d56\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\uff0c\u7c7b\u4f3c\u4e8e\u5f00\u53d1\u5e94\u7528\u7684 debian/control \u6587\u4ef6\u7684\u529f\u80fd\uff0c\u4e3a\u4e86\u4fdd\u6301\u7edf\u4e00\uff0c\u8fd9\u4e2a\u6587\u4ef6\u5c31\u547d\u540d\u4e3a control\uff0c\u653e\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u6838\u5fc3\u5e93\u72ec\u7acb\u6027","text":"\u6838\u5fc3\u5e93\u4e0d\u5efa\u8bae\u9488\u5bf9\u67d0\u4e00\u4e2a\u5e94\u7528\u5355\u72ec\u505a\u4ee3\u7801\u4e0a\u7279\u6b8a\u5904\u7406\uff0c\u901a\u5e38\u8003\u8651\u9488\u5bf9\u67d0\u4e00\u79cd\u573a\u666f\u8fdb\u884c\u5904\u7406\uff0c\u8fd9\u4e9b\u573a\u666f\u901a\u5e38\u662f\u5b58\u5728\u4e00\u4e9b\u5171\u6027\u7684\u3002\u6bd4\u5982\u8bf4\uff1a\u684c\u9762\u7684ID\u5206\u914d\u5b58\u5728\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u903b\u8f91\u5904\u7406\u89e3\u51b3ID\u5206\u914d\u9519\u8bef\u7684\u95ee\u9898\uff0c\u4f46\u662f\u8fd9\u90e8\u5206\u903b\u8f91\u6211\u4eec\u4f1a\u5728\u684c\u9762\u7684\u65b9\u6cd5\u5c42\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u517c\u5bb9\u6027","text":"\u4e3a\u4e86\u4fdd\u6301\u517c\u5bb9\u6027\uff0c\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u539f\u5219\u4e0a\u4e0d\u5bf9\u8001\u65b9\u6cd5\u8fdb\u884c\u4fee\u6539\u6216\u5220\u9664\uff0c\u53ea\u8fdb\u884c\u65b0\u589e\u3002\u6d89\u53ca\u5230\u8001\u65b9\u6cd5\u4fee\u6539\u6216\u5220\u9664\u7684\uff0c\u4f1a\u8fdb\u884c\u63d0\u524d\u9884\u544a\uff0c\u5e76\u5728\u7b2c\u4e8c\u4e2a\u7248\u672c\u4e4b\u540e\uff08\u4e2d\u95f4\u4f1a\u9694\u4e00\u4e2a\u7248\u672c\u8fc7\u5ea6\uff09\u6b63\u5f0f\u5b9e\u65bd\u4fee\u6539\u6216\u5220\u9664\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u547d\u540d\u89c4\u8303","text":" \u7528\u4f8b ID \u6bcf\u4e2a\u5e94\u7528\u81ea\u5df1\u7ef4\u62a4\u4e00\u5957 ID\uff0c\u5728PMS\u4e0a\u7528\u4f8b\u6807\u9898\u4e0a\u5c06\u81ea\u52a8\u5316ID\u4ee5\u6807\u7b7e\u7684\u5f62\u5f0f\u5199\u5165\uff0c\u6bd4\u5982\uff1a[101]\u6253\u5f00-\u542f\u52a8\u5e94\u7528\u540edock\u53f3\u952e\u83dc\u5355 \u4e00\u4e2a\u7528\u4f8b\u7c7b\u91cc\u9762\u6709\u591a\u4e2a\u7528\u4f8b\u65f6\uff0c\u5728\u7528\u4f8b\u540d\u79f0\u540e\u9762\u52a0\u5e8f\u53f7\u3002 class TestFileManager(BaseCase):\n\"\"\"\u6587\u7ba1\u7528\u4f8b\"\"\"\ndef test_xxx_015_1(self):\npass\ndef test_xxx_015_2(self):\npass\n \u6ce8\u610f 015_1\uff0c\u4e0d\u8981\u5199015_01\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 PMS \u4e0a\u7684\u7528\u4f8bID\uff1a PMS \u4e0a\u662f6\u4f4d\u6570\uff0c\u4e0d\u591f\u76f4\u89c2\uff0c\u4e5f\u4e0d\u597d\u7ef4\u62a4\uff0c\u5728\u81ea\u52a8\u5316\u4e0b\u9762\u53bb\u627e\u4e00\u4e2a\u5e26\u6709 6 \u4f4d\u6570\u7684\u6587\u4ef6\u662f\u4e00\u4e2a\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 PMS \u4e0a\u7684 ID \u53ef\u80fd\u4f1a\u53d1\u751f\u53d8\u5316\uff0c\u6bd4\u5982\u5bfc\u51fa\u6765\u5bfc\u8fdb\u53bb\u7684\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u5b58\u5728\u95ee\u9898\uff0c\u5982\u679c\u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u8981\u60f3\u627e\u51fa\u6765\u5bf9\u5e94\u4fee\u6539\u81ea\u52a8\u5316\u7528\u4f8b ID\uff0c\u5c06\u4f1a\u662f\u4ef6\u975e\u5e38\u75db\u82e6\u7684\u4e8b\u60c5\u3002 \u51fd\u6570\u547d\u540d\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5de6\u952e\u70b9\u51fb click \u53f3\u952e\u70b9\u51fb right_click \u53cc\u51fb double_click \u79fb\u52a8 move_to \u62d6\u52a8 drag \u65b0\u5efa new \u62d6\u52a8\u5230 drag_to \u4ece\u54ea\u91cc\u62d6\u52a8\u5230\u54ea\u91cc drag_something_from_xxx_to_xxx \u83b7\u53d6 get \u83b7\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5750\u6807 get_location \u975e\u7279\u6b8a\u6587\u4ef6 file word\u6587\u4ef6 doc text\u6587\u4ef6 text \u6587\u4ef6\u5939 dir \u5173\u952e\u8bcd\u6301\u7eed\u589e\u52a0 \u5e38\u91cf\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5e94\u7528\u540d\u79f0 APP_NAME \u5e94\u7528\u63cf\u8ff0 DESC \u672c\u5e94\u7528\u4ee5\u5916\u7684\u5176\u4ed6\u5e94\u7528\uff0c\u6bd4\u5982\u5e2e\u52a9 HELP \u5176\u4ed6\u540d\u79f0\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u65b9\u6cd5\u5305\u540d widget \u65b9\u6cd5\u6587\u4ef6\u540d\uff08\u6587\u7ba1\u4e3e\u4f8b\uff09 dfm_widget.pytitle_widget.pyright_view_widget.pyleft_view_widget.pypop_widget.pybase_widget.pydfm_assert.py \u65ad\u8a00\u8bed\u53e5\u547d\u540d\u89c4\u8303 \u65ad\u8a00\u8bed\u53e5\u90fd\u662f\u4ee5 assert \u5f00\u5934 \u65ad\u8a00 \u8bed\u53e5 \u5224\u65ad\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_existsassert_file_not_exists \u5224\u65ad\u684c\u9762\u76ee\u5f55\u4e0b\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_exists_in_desktopassert_file_not_exists_in_desktop \u5224\u65ad\u56fe\u7247\u5b58\u5728 assert_image_existsassert_image_not_exists \u5224\u65ad\u5f71\u9662\u4e2d\u662f\u5426\u5b58\u5728\u56fe\u7247 assert_image_exists_in_movieassert_image_not_exists_in_movie \u5224\u65ad\u5143\u7d20\u662f\u5426\u5b58\u5728 assert_element_existassert_element_not_exist \u5224\u65ad\u662f\u5426\u76f8\u7b49 assert_equalassert_not_equal \u5224\u65ad\u662f\u5426\u4e3a\u771f assert_trueassert_false"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5fixture","title":"5\u3001fixture \u89c4\u8303","text":"\u7531\u4e8e Pytest \u6846\u67b6\u4e2d\u652f\u6301 fixture \u7684\u5199\u6cd5\u548c Xunit \u5199\u6cd5\u7684\uff0c\u6240\u4ee5\u5e94\u7528\u5e93\u4e2d\u53ef\u80fd\u5b58\u5728\u6df7\u7528\u7684\u60c5\u51b5\uff0c\u4e3a\u7edf\u4e00\u7f16\u7801\u98ce\u683c\u65b9\u4fbf\u540e\u7eed\u7528\u4f8b\u4ee3\u7801\u7ef4\u62a4\uff0c\u73b0\u505a\u4ee5\u4e0b\u89c4\u8303\u8bf4\u660e\uff1a \u629b\u5f03 Xunit \u7684\u5199\u6cd5\uff0c\u7edf\u4e00\u91c7\u7528 Pytest fixture \u7684\u5199\u6cd5\u3002 \u5e94\u7528\u5185 fixture \u8c28\u614e\u4f7f\u7528 autouse=True \uff0c\u975e\u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u975e\u5e38\u4e0d\u5efa\u8bae\u4f7f\u7528\u8fd9\u4e2a\u53c2\u6570\u3002 \u8c03\u7528 fixture \u4e0d\u80fd\u4f7f\u7528 @pytest.mark.usefixture()\uff0c\u4f7f\u7528\u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u4f20\u5165\u51fd\u6570\u5bf9\u8c61\u3002 \u5efa\u8bae\u5728\u4e00\u4e2a conftest.py \u91cc\u9762\u53bb\u5199\uff0c\u4e00\u4e2a\u5e94\u7528\u4e5f\u5c3d\u91cf\u7ef4\u62a4\u4e00\u4e2a conftest.py\u6587\u4ef6\u3002 fixture \u4e5f\u9700\u8981\u5199\u529f\u80fd\u8bf4\u660e\uff0c\u51fd\u6570\u540d\u79f0\u8981\u6709\u5177\u4f53\u542b\u4e49\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#6","title":"6\u3001\u65b9\u6cd5\u7f16\u5199\u89c4\u8303","text":" \u65b9\u6cd5\u7c7b\u578b\uff1a if \u6ca1\u6709\u7528\u5230\u5b9e\u4f8b\u5bf9\u8c61\uff1a\nif \u6ca1\u6709\u7528\u5230\u7c7b\u5bf9\u8c61\uff1a\n\u5199\u9759\u6001\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @staticmethod\nelse\uff1a\n\u5199\u7c7b\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @classmethod\nelse:\n\u76f4\u63a5\u5199\u5b9e\u4f8b\u65b9\u6cd5\n \u4e3e\u4f8b: class TitleWidget:\ndef click_xxx_by_ui(self):\npass\n@staticmethod\ndef click_xxx_by_ui():\npass\n@classmethod\ndef click_xxx_by_ui(cls):\npass\n \u51fd\u6570\u540d\u79f0\u4e0d\u51fa\u73b0\u6570\u5b57\uff0c\u9700\u8981\u8868\u793a\u6570\u91cf\u7684\u7528\u5355\u8bcd\u8868\u793a\u3002 \u51fd\u6570\u529f\u80fd\u6ce8\u91ca\u3002 \u6ca1\u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg2:xxx\n\"\"\"\n \u6709\u53c2\u6570\uff0c\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg1:xxx\nreturn: xxx\n\"\"\"\n \u200b \u7528 Pycharm \u7684\u6ce8\u91ca\u6a21\u677f\u4e5f\u53ef\u4ee5\uff0c\u53ea\u8981\u4f53\u73b0\u4e86\u53c2\u6570\u7684\u7c7b\u578b\u548c\u8fd4\u56de\u5c31\u884c\u4e86\u3002 \u6682\u4e0d\u8981\u6c42\u5199\u7c7b\u578b\u6ce8\u89e3\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#7case","title":"7\u3001\u7528\u4f8b\uff08case\uff09\u89c4\u8303","text":" \u4ee5\u7c7b\u7684\u5f62\u5f0f\u5199\u7528\u4f8b\uff0c\u7528\u4f8b\u7c7b\u96c6\u6210\u7528\u4f8b\u57fa\u7c7b\u3002 \u7528\u4f8b\u7c7b\u9700\u8981\u5199\u6ce8\u91ca\u3002 \u6d4b\u8bd5\u7528\u4f8b\u51fd\u6570\u8bf4\u660e\uff08\u5efa\u8bae\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u540d\u79f0\uff09 \"\"\"\u53f3\u4fa7\u9884\u89c8-\u56fe\u7247\u7c7b\u578b\u4fe1\u606f\u680f\u57fa\u672c\u4fe1\u606f\"\"\"\n \u4e0d\u5199\u8c03\u8bd5\u4ee3\u7801 if __name__ == '__main__':\npytest.main()\n \u6240\u6709\u7528\u4f8b\u90fd\u7ee7\u627f BaseCase\u3002 BaseCase \u91cc\u9762\u653e\u4e00\u4e9b\u6d4b\u8bd5\u6570\u636e\u7684\u5e38\u91cf\uff0c\u6bd4\u5982\u6587\u4ef6\u540d\u79f0\uff0c\u5e94\u7528\u540d\u79f0\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u4e00\u4e9b\u901a\u7528\u7684\u5b57\u7b26\u4e32\u3002 \u8fd9\u7c7b\u662f\u5c5e\u4e8e\u6d4b\u8bd5\u6570\u636e\u3002 class BaseCase(DfmAssert):\n\"\"\"\u7528\u4f8b\u57fa\u7c7b\"\"\"\nNEW_FILE = \"\u65b0\u5efa\u6587\u672c.txt\"\nTEST_FILE = \"test.txt\"\nNEW_DIR = \"\u65b0\u5efa\u6587\u4ef6\u5939\"\nNEW_WORD = \"\u65b0\u5efaWord\u6587\u6863.doc\"\nAPP_HELP = \"damn\"\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\n\"\"\"\u7528\u4f8b\u6807\u9898\uff08\u590d\u5236PMS\u4e0a\u7528\u4f8b\u6807\u9898\uff09\"\"\"\ndfm = DfmWidget()\ndfm.click_xxx_by_attr(self.NEW_FILE)\ndfm.new_file_in_desktop_by_cmd(self.NEW_FILE)\nself.assert_true(dfm.get_process_status(self.APP_NAME))\n \u7528\u4f8b\u91cc\u9762\u5c3d\u91cf\u51cf\u5c11\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\uff0c\u66f4\u8981\u51cf\u5c11\u76f8\u540c\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\u3002 \u7edf\u4e00\u6587\u4ef6\u6ce8\u91ca\u5934\u3002 #!/usr/bin/env python3\n# _*_ coding:utf-8 _*_\n\"\"\"\n:Author:email@uniontech.com\n:Date :${DATE} ${TIME}\n\"\"\"\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#8","title":"8\u3001\u5176\u4ed6\u89c4\u8303","text":" \u65e5\u5fd7\u6253\u5370\u8981\u5728\u65b9\u6cd5\u6700\u524d\u9762\uff0c\u5426\u5219\u4ee3\u7801\u62a5\u9519\u6ca1\u6709\u65e5\u5fd7\u8f93\u51fa\uff0c\u4e0d\u597d\u5b9a\u4f4d\u95ee\u9898\u3002\uff08\u6211\u4eec\u4f1a\u8003\u8651\u7ee7\u7eed\u4f7f\u7528\u62e6\u622a\u5668\u6253\u5370\u65e5\u5fd7\uff09 \u6240\u6709\u7684\u64cd\u4f5c\u90fd\u9700\u8981\u6709\u65e5\u5fd7\uff0c\u5305\u62ec sleep()\uff0c\u6211\u4eec\u4f1a\u91cd\u5199\u4e00\u4e2a\u6709\u65e5\u5fd7\u8f93\u5165\u7684 sleep\u3002 \u4e1a\u52a1\u5c42\u65e5\u5fd7\u7ea7\u522b\u4e3a INFO\u3002 hook \u51fd\u6570\u53ea\u80fd\u5199\u5230\u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u91cc\u9762\u3002 apps \u76ee\u5f55\u4e0b\u7684 conftest.py \u539f\u5219\u4e0a\u4e0d\u4f1a\u65b0\u589e fixture\u3002 \u56fa\u5b9a\u76ee\u5f55\u6216\u5143\u7d20\u63a7\u4ef6\u7684\u64cd\u4f5c\uff0c\u5c06\u64cd\u4f5c\u65b9\u6cd5\u5199\u6b7b\uff0c\u6587\u4ef6\u7c7b\u64cd\u4f5c\u5c06\u6587\u4ef6\u540d\u7559\u53c2\u6570\u3002 \u8def\u5f84\u62fc\u63a5\u89c4\u8303\uff1a \u7cfb\u7edf\u4e2d\u56fa\u5b9a\u76ee\u5f55\uff0c\u8def\u5f84\u62fc\u63a5\u65f6\u4f7f\u7528\u6ce2\u6d6a\u7b26\u53f7\uff0c\u6bd4\u5982\uff1a~/Desktop/\uff0c\u4e0b\u5c42\u4f7f\u7528 os.path.expanduser()\uff0c\u5b83\u53ef\u4ee5\u81ea\u52a8\u8bc6\u522b\u6ce2\u6d6a\u7b26\u53f7\u3002 \u9879\u76ee\u4e0b\u8def\u5f84\u4f7f\u7528\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u8def\u5f84\uff0c\u6bd4\u5982\uff1aConfig.BASE_PATH\uff0c\u56e0\u4e3a\u9879\u76ee\u662f\u53ef\u4ee5\u5728\u4efb\u610f\u8def\u5f84\u8fd0\u884c\u7684\uff0c\u9700\u8981\u52a8\u6001\u62fc\u63a5\u8def\u5f84\u3002 "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848","text":"# =================================================\n# Author : Mikigo\n# Time : 2022/3/16\n# version \uff1a1.0\n# =================================================\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"AT \u5e94\u7528\u5e93\u6539\u9020\u662f\u57fa\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u8fdb\u884c\u7528\u4f8b\u65b9\u6cd5\u548c\u4e1a\u52a1\u903b\u8f91\u7684\u91cd\u65b0\u8bbe\u8ba1\uff0c\u4ee5\u5b9e\u73b0\u5e94\u7528\u5e93\u9ad8\u6548\u7684\u7f16\u5199\u3001\u7ef4\u62a4\u7528\u4f8b\u53ca\u5176\u65b9\u6cd5\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u6587\u4ef6\u7ba1\u7406\u5668\u4ece\u4e1a\u52a1\u590d\u6742\u5ea6\u548c\u7528\u4f8b\u91cf\u6765\u8bb2\uff0c\u5728\u7cfb\u7edf\u6240\u6709\u5e94\u7528\u4e2d\uff0c\u662f\u5f88\u6709\u4ee3\u8868\u6027\u7684\uff0c\u96be\u5ea6\u4e5f\u662f\u6700\u5927\u7684\uff0c\u56e0\u6b64\u6211\u4eec\u9009\u53d6\u6587\u4ef6\u7ba1\u7406\u5668\u4f5c\u4e3a\u5e94\u7528\u5e93\u6539\u9020\u7684\u5b9e\u9a8c\u5e94\u7528\uff0c\u7ed9\u540e\u7eed\u5176\u4ed6\u5e94\u7528\u6539\u9020\u63d0\u4f9b\u5207\u5b9e\u53ef\u884c\u7684\u601d\u8def\u548c\u65b9\u6848\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u5206\u5c42\u8bbe\u8ba1\u56fe","text":"\u6574\u4f53\u4ecd\u7136\u9075\u5faa PO \u8bbe\u8ba1\u7406\u5ff5\uff0c\u6839\u636e\u4e1a\u52a1\u9700\u8981\uff0c\u5c06\u6587\u7ba1\u4e1a\u52a1\u5c42\u8fdb\u884c 3 \u5c42\u5212\u5206\uff1a "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-dde-file-manager # \u5e94\u7528\u4ed3\u5e93\n\u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 test_xxx_001.py\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u00a0\u251c\u2500\u2500 __init__.py\n\u2502 \u00a0\u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u00a0\u251c\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u00a0\u251c\u2500\u2500 base_widget.py # \u65b9\u6cd5\u57fa\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 title_widget.py # title \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 right_view_widget.py # right view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 left_view_widget.py # left view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 pop_widget.py # pop \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 dfm_widget.py # \u65b9\u6cd5\u7684\u7edf\u4e00\u51fa\u53e3\n\u2502 \u00a0\u2514\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 tag # \u7528\u4f8b\u6807\u7b7e\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 xxx.csv # \u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2514\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u57fa\u7c7b","text":" \u7ee7\u627f\u6838\u5fc3\u5c42\u7684\u5404\u4e2a\u6a21\u5757\u7c7b\u3002 \u62bd\u53d6\u64cd\u4f5c\u5c42\u7684\u4e00\u4e9b\u57fa\u7840\u65b9\u6cd5\u3002 \u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u7684\u4e00\u4e9b\u516c\u5171\u65b9\u6cd5\u3002 \u8def\u5f84\u7ec4\u88c5\u65b9\u6cd5\u3002 \u4e00\u4e9b\u4e1a\u52a1\u5c42\u76f8\u5173\u7684\u53d8\u91cf\u3001\u5e38\u91cf\u3001shell\u547d\u4ee4\u3001\u5750\u6807\u3002 \u65b9\u6cd5\u57fa\u7c7b\u7684\u5199\u6cd5\uff1a from src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u64cd\u4f5c\u5c42","text":" \u6a21\u5757\u5212\u5206 \u6309\u7167\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u6587\u7ba1\u4e3b\u754c\u9762\u5206\u4e3a\u4e09\u4e2a\u533a\u57df\uff1a\u6807\u9898\u680f\u3001\u53f3\u8fb9\u89c6\u56fe\u533a\u57df\u3001\u5de6\u8fb9\u89c6\u56fe\u533a\u57df \u5f39\u7a97\uff1a\u8bbe\u7f6e\u754c\u9762\u5f39\u7a97\u3001\u4fdd\u9669\u7bb1\u5f39\u7a97\u3001\u5220\u9664\u786e\u8ba4\u5f39\u7a97\u3001\u53ca\u5404\u79cd\u7f51\u7edc\u5f39\u7a97 \u53f3\u952e\u83dc\u5355\uff1a\u6682\u65f6\u4e0d\u8003\u8651\u4e3a\u5355\u72ec\u7684\u6a21\u5757\uff0c\u8003\u8651\u4ee5\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6848\u505a\u6210\u516c\u5171\u5e93\u3002 \u5404\u4e2a\u6a21\u5757\u53ea\u7ee7\u627f\u57fa\u7c7b from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u6784\u9020\u51fd\u6570\u91cc\u9762\u4e0d\u6784\u9020\u5bf9\u8c61\uff0c\u53ef\u4ee5\u521d\u59cb\u5316\u4e00\u4e9b\u53d8\u91cf\u3002 \u4e0d\u540c\u7684\u5b9a\u4f4d\u65b9\u6848\u8c03\u7528\u4e0d\u540c\u7684\u5b9a\u4f4d\u5de5\u5177\u5bf9\u8c61\u3002 self.dog\nself.ui\nself.d_bus\n \u65b9\u6cd5\u7f16\u5199 \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u5e94\u7528\u5c42","text":" \u7ee7\u627f\u64cd\u4f5c\u5c42\u7684\u6240\u6709\u7c7b\u3002 \u4ec5\u4ec5\u7528\u4e8e\u7528\u4f8b\u4e2d\u5bfc\u5165\u65b9\u4fbf\uff0c\u4e0d\u505a\u5176\u4ed6\u4e8b\u60c5\u3002 class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n DfmAssert \u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u7ee7\u627f\uff0c\u65b9\u4fbf\u4f7f\u7528\u65ad\u8a00\u8bed\u53e5\u3002 from apps.dde_file_manager.widget.dfm_widget import DfmWidget\nfrom public.assert import Assert\nclass DfmAssert(Assert):\ndef assert_file_exists_in_desktop(self, file_name):\nself.assert_file_exists(f\"~/Desktop{file_name}\")\n...\nDfmWidget().get_file_in_desktop()\n \u7528\u4f8b\u91cc\u9762\u76f4\u63a5\u7ee7\u627f\uff0c\u65b9\u4fbf\u5728\u7528\u4f8b\u91cc\u9762\u4f7f\u7528 self \u8fdb\u884c\u65ad\u8a00\uff0c\u66f4\u7b26\u5408\u65ad\u8a00\u7684\u4f7f\u7528\u4e60\u60ef\uff0c\u7528\u4f8b\u903b\u8f91\u4e0a\u66f4\u6e05\u695a\u3002 class BaseCase(DfmAssert):\npass\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\nself.assert_file_exists_in_desktop(\"xxx\")\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u903b\u8f91\u4e3e\u4f8b","text":"\u7528\u4f8b\u4ee3\u7801\u8c03\u7528\u903b\u8f91\u4e3e\u4f8b\uff1a # BaseWidget\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n# =============================================\n# TitleWidget\nclass TitleWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_title_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# RightViewWidget\nclass RightViewWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_right_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# =============================================\n# \u51fa\u53e3 DfmWidget\nclass DfmWidget(TitleWidget, RightViewWidget):\npass\n# =============================================\n# in case\nfrom apps.dde_file_manager.widget.dfm_widget import DfmWidget\ndfm = DfmWidget()\ndfm.click_xxx_title_by_ui()\ndfm.click_xxx_right_by_ui()\ndfm.dog.print_desc()\ndfm.ui.print_number()\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u5de5\u7a0b\u6539\u9020\u5b9e\u65bd\u6b65\u9aa4","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_2","title":"1\u3001\u5de5\u7a0b\u4ee3\u7801\u62c9\u53d6","text":"1.1. \u5c06\u81ea\u52a8\u5316\u57fa\u7840\u6846\u67b6\u7684\u529f\u80fd\u62c9\u5230\u672c\u5730 Autotest Basic Frame \uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame 1.2. \u5c06\u5e94\u7528\u5e93\u4ee3\u7801\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u5e94\u7528\u5e93\u7684\u4ed3\u5e93\u547d\u540d\u5e94\u8be5\u662f\u957f\u8fd9\u6837\u7684 autotest_deepin_xxx\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_2","title":"2\u3001\u8c03\u6574\u5de5\u7a0b\u76ee\u5f55","text":"\u6309\u7167 \u65b9\u6848\u8bbe\u8ba1-\u76ee\u5f55\u7ed3\u6784 \u8fdb\u884c\u76ee\u5f55\u8c03\u6574\uff0c\u5c3d\u91cf\u4f7f\u7528\u7f16\u8f91\u5668\u8fdb\u884c\u76f8\u5e94\u7684\u8c03\u6574\uff0c\u7f16\u8f91\u5668\u63a8\u8350\u4f7f\u7528 Pycharm \uff0c\u4ee5\u4e0b\u64cd\u4f5c\u5747\u5728 Pycharm \u91cc\u9762\u53ef\u5b9e\u73b0\u3002 2.1. \u9700\u8981\u79fb\u52a8 py \u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u76f4\u63a5\u5728\u7f16\u8f91\u5668\u91cc\u9762\uff0c\u4f7f\u7528\u9f20\u6807\u9009\u4e2d\u5e76\u6309\u4f4f\uff0c\u4e4b\u540e\u62d6\u52a8\u5230\u76ee\u6807\u4f4d\u7f6e\u5373\u53ef\uff0cPycharm \u4f1a\u5c3d\u53ef\u80fd\u7684\u81ea\u52a8\u89e3\u51b3\u79fb\u52a8\u5bfc\u81f4\u7684\u8def\u5f84\u95ee\u9898\u3002\u6ce8\u610f\uff0c\u6211\u8bf4\u7684\u662f\u201c\u5c3d\u53ef\u80fd\u201d\uff0c\u6709\u4e9b\u9a9a\u64cd\u4f5c\u7f16\u8f91\u5668\u662f\u65e0\u6cd5\u81ea\u52a8\u5904\u7406\u7684\u3002\u5982\u679c\u6ca1\u6709\u88ab\u7f16\u8f91\u5668\u81ea\u52a8\u5904\u7406\u7684\u8def\u5f84\u95ee\u9898\uff0c\u540e\u7eed\u53ea\u80fd\u624b\u52a8\u89e3\u51b3\u3002 2.2. \u9700\u8981\u91cd\u547d\u540d\u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u5728\u7f16\u8f91\u5668\u91cc\u9762\u9009\u4e2d\u6587\u4ef6\uff0c\u7136\u540e\u4f7f\u7528\u5feb\u6377\u952e Shift + F6 \uff08\u5982\u679c\u5feb\u6377\u952e\u6ca1\u53cd\u5e94\uff0c\u6587\u4ef6\u53f3\u952e\u83dc\u5355 Refactor \u2014\u2014 Rename\uff09\uff0c\u7136\u540e\u5728\u8f93\u5165\u6846\u4e2d\u8f93\u5165\u8981\u91cd\u547d\u540d\u7684\u540d\u79f0\uff0c\u540c\u65f6\uff0c\u786e\u8ba4\u52fe\u9009 Search for references \u548c Search in comments and strings \u8fd9\u4e24\u4e2a\u9009\u9879\uff0c\u6700\u540e\u6309\u56de\u8f66\u6216\u8005\u9f20\u6807\u70b9 Refactor \u3002 \u6ce8\u610f\uff0c\u6b64\u65f6\u7f16\u8f91\u5668\u53ef\u80fd\u4f1a\u63d0\u793a\u4f60\uff0c\u4f60\u8fd9\u4e2a\u91cd\u547d\u540d\u7684\u64cd\u4f5c\u5173\u8054\u4e86\u591a\u4e2a\u6a21\u5757\uff0c\u5b83\u88ab\u591a\u4e2a\u5730\u65b9\u90fd\u4f7f\u7528\u5230\u4e86\uff0c\u76f8\u5173\u7684\u6a21\u5757\u662f\u5426\u4e5f\u4e00\u8d77\u6539\u540d\u4e86\uff0c\u8fd9\u4e0d\u5e9f\u8bdd\u5417\uff0c\u7528\u8fd9\u4e2a\u529f\u80fd\u5c31\u662f\u60f3\u628a\u5173\u8054\u5230\u7684\u90fd\u4fee\u6539\uff0c\u4e0d\u7136\u6211\u4e3a\u4ec0\u4e48\u4e0d\u7528\u6587\u7ba1\u7684\u91cd\u547d\u540d\u529f\u80fd\u5462\uff0c\u522b\u60f3\u4e86\uff0c\u76f4\u63a5\u70b9\u5de6\u4e0b\u89d2\u7684 Refactor \u6309\u94ae\uff0c\u5c31\u662f\u5e72\u3002 \u7c7b\u540d\u3001\u51fd\u6570\u540d\u7684\u91cd\u547d\u540d\u90fd\u5c3d\u91cf\u91c7\u7528\u8fd9\u79cd\u65b9\u6848\uff0c\u56e0\u4e3a\u7f16\u8f91\u5668\u4f1a\u81ea\u52a8\u7ed9\u6211\u4eec\u627e\u5230\u5173\u8054\u7684\u5730\u65b9\uff0c\u7136\u540e\u540c\u6b65\u4fee\u6539\u6389\u3002\u4f60\u53ef\u5343\u4e07\u522b\u76f4\u63a5\u5220\u4e86\u4fee\u6539\u540d\u79f0\uff0c\u4e0d\u7136\u4f60\u53ef\u80fd\u4f1a\u82b1\u4e0a\u4e00\u5929\u7684\u65f6\u95f4\u6765\u89e3\u51b3\u91cd\u547d\u540d\u7684\u95ee\u9898\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u5b9e\u73b0\u6838\u5fc3\u5e93\u63a5\u53e3","text":"3.1. BaseWidget \u5728 BaseWidget \u91cc\u9762\u628a\u8be5\u5199\u7684\u90fd\u5199\u597d\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u4e0a\u9762\u7684\u8bbe\u8ba1\u7406\u5ff5\u6765\u5199\u3002 \u5982\u679c\u4f60\u5acc\u9ebb\u70e6\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u6587\u7ba1\u7684\u5b9e\u9645\u5de5\u7a0b\u4ee3\u7801 autotest_dde_file_manager : https://gerrit.uniontech.com/admin/repos/autotest_dde_file_manager \u3002 3.2. \u64cd\u4f5c\u5c42 \u5982\u679c\u4f60\u662f\u65b0\u5199\u9879\u76ee\uff0c\u4f60\u4f1a\u53d1\u73b0\u4e00\u5207\u90fd\u662f\u90a3\u4e48\u7684\u7b80\u5355\u3001\u76f4\u63a5\uff0c\u6309\u7167\u6211\u4eec\u63d0\u4f9b\u7ed9\u4f60\u7684\u63a5\u53e3\u5199\u7528\u4f8b\u7684\u64cd\u4f5c\u65b9\u6cd5\u5c31\u597d\u4e86\u3002 \u5982\u679c\u4f60\u662f\u60f3\u5bf9\u539f\u6765\u7684\u5de5\u7a0b\u8fdb\u884c\u6539\u9020\uff0c\u4f60\u9700\u8981\u6309\u7167\u6838\u5fc3\u5e93\u65b9\u6cd5\u7684\u8c03\u7528\uff0c\u5c06\u4f60\u4e4b\u524d\u5199\u7684\u6bcf\u4e2a\u65b9\u6848\u8fdb\u884c\u5bf9\u5e94\u7684\u4fee\u6539\uff0c\u5305\u62ec\u7c7b\u548c\u65b9\u6cd5\u7684\u547d\u540d\u3001\u65b9\u6cd5\u5185\u6240\u8981\u7528\u5230\u4e0d\u540c\u5b9a\u4f4d\u65b9\u6cd5\u7684\u5199\u6cd5\u4fee\u6539\u3002 \u8fd9\u65f6\u5019\u4f60\u53ef\u80fd\u4f60\u7684\u4ee3\u7801\u4e2d\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u62a5\u9519\uff0c\u4e0d\u7528\u62c5\u5fc3\uff0c\u4f60\u53ef\u4ee5\u4ece\u4e1a\u52a1\u903b\u8f91\u51fa\u53d1\uff0c\u60f3\u6e05\u695a\u8fd9\u4e2a\u65b9\u6cd5\u662f\u5e72\u4ec0\u4e48\u7684\u3001\u64cd\u4f5c\u7684\u5bf9\u8c61\u662f\u4ec0\u4e48\u3001\u53c2\u6570\u662f\u4ec0\u4e48\uff0c\u6ce8\u610f\u8fd9\u4e9b\u4fee\u6539\u662f\u4f1a\u5f71\u54cd\u5230\u7528\u4f8b\u4ee3\u7801\u91cc\u9762\u7684\uff0c\u6ca1\u5173\u7cfb\uff0c\u7528\u4f8b\u91cc\u9762\u672c\u6765\u4e5f\u5e94\u8be5\u88ab\u5173\u8054\u4fee\u6539\u3002 3.3. \u628a\u914d\u7f6e\u6a21\u5757\u5199\u597d\uff0c\u8fd9\u90e8\u5206\u57fa\u672c\u53ef\u4ee5\u590d\u5236\u6587\u7ba1\u7684\u4ee3\u7801\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4_1","title":"4\u3001\u8def\u5f84\u5904\u7406","text":"4.1. \u5bfc\u5165\u8def\u5f84 \u65b9\u6cd5\u548c\u7528\u4f8b\u4e2d\u90fd\u4f1a\u6d89\u53ca\u5230\u5bfc\u5165\u8def\u5f84\u7684\u4fee\u6539\uff0c\u5728\u4fee\u6539\u8def\u5f84\u65f6\uff0c\u5efa\u8bae\u4f60\u4f7f\u7528 Ctrl + Shift + R \u5168\u5c40\u66ff\u6362\uff0c\u4f1a\u5c06\u6574\u4e2a\u9879\u76ee\u4e0b\u7684\u76f8\u540c\u5730\u65b9\u90fd\u4fee\u6539\u5230\uff0c\u5f53\u7136\uff0c\u4f60\u4e5f\u53ef\u4ee5\u5728\u5c0f\u5f39\u7a97\u4e2d\u4fee\u6539\u5168\u5c40\u66ff\u6362\u4e3a\u5c40\u90e8\u76ee\u5f55\u4e0b\u66ff\u6362\u3002\u5904\u7406\u90a3\u79cd\u6ca1\u6709\u5173\u8054\u5173\u7cfb\uff0c\u4f46\u662f\u53c8\u662f\u76f8\u540c\u540d\u79f0\u7684\u91cd\u547d\u540d\uff0c\u6211\u4e5f\u63a8\u8350\u4f7f\u7528\u8fd9\u79cd\u65b9\u5f0f\u8fdb\u884c\u91cd\u547d\u540d\u3002 \u6ce8\u610f\uff0c\u5168\u5c40\u66ff\u6362\u7684\u65b9\u5f0f\u4efb\u7136\u65e0\u6cd5\u4fdd\u8bc1\u771f\u7684\u5168\u5c40\u88ab\u66ff\u6362\u4e86\uff08\u53ef\u80fd\u662f\u7f16\u8f91\u5668\u7684 Bug \u5427\uff09\uff0c\u6240\u4ee5\u4f60\u4ecd\u7136\u9700\u8981\u624b\u52a8\u770b\u4e0b\u5404\u5904\u662f\u5426\u4fee\u6539\u5230\u4f4d\u3002 4.2. \u8d44\u6e90\u8def\u5f84 \u4e00\u4e9b\u7528\u4f8b\u8d44\u6e90\u9700\u8981\u6839\u636e config.py \u91cc\u9762\u7684\u8def\u5f84\u914d\u7f6e\u8fdb\u884c\u8d44\u6e90\u8def\u5f84\u7684\u62fc\u63a5\uff0c\u5982\u679c\u4f60\u539f\u6765\u672c\u6765\u5c31\u6709\u4e00\u4e2a\u51fd\u6570\u4e13\u95e8\u7528\u4e8e\u7ec4\u88c5\u8def\u5f84\u7684\uff0c\u90a3\u4f60\u53ea\u9700\u8981\u4fee\u6539\u8fd9\u4e00\u4e2a\u5730\u65b9\u5c31\u597d\u4e86\uff0c\u5982\u679c\u4f60\u4e4b\u524d\u5e76\u6ca1\u6709\u8fd9\u6837\u7684\u8bbe\u8ba1\uff0c\u90a3\u53ef\u80fd\u9700\u8981\u4fee\u6539\u5927\u91cf\u6d89\u53ca\u5230\u8d44\u6e90\u8def\u5f84\u7684\u5730\u65b9\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5","title":"5\u3001\u8c03\u8bd5\u548c\u7f16\u5199\u7528\u4f8b","text":"\u4ee5\u4e0a\u51e0\u4e2a\u6b65\u9aa4\u505a\u5b8c\uff0c\u57fa\u672c\u5c31\u53ef\u4ee5\u8fdb\u884c\u7528\u4f8b\u4ee3\u7801\u7684\u8c03\u8bd5\u4e86\uff0c\u8fd9\u90e8\u5206\u5de5\u4f5c\u4e3b\u8981\u89e3\u51b3\u4f60\u4e4b\u524d\u51e0\u4e2a\u6b65\u9aa4\u9057\u6f0f\u7684\u95ee\u9898\uff0c\u5982\u679c\u6240\u6709\u7528\u4f8b\u90fd\u8c03\u8bd5\u901a\u8fc7\u4e86\uff0c\u90a3\u4e48\u5de5\u7a0b\u6539\u9020\u5c31\u5168\u90e8\u5b8c\u6210\u4e86\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/","title":"AT \u5f00\u53d1\u89c4\u8303","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u5f00\u53d1\u89c4\u8303\u662f\u6839\u636e\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fd0\u884c\u4e24\u5e74\u591a\u6765\uff0c\u9047\u5230\u95ee\u9898\u89e3\u51b3\u95ee\u9898\u800c\u5f62\u6210\u7684\u4e00\u4e9b\u89e3\u51b3\u65b9\u6848\uff0c\u6216\u8005\u8bf4\u7ecf\u9a8c\u603b\u7ed3\uff1b\u8fd9\u4e9b\u7ecf\u9a8c\u7b26\u5408\u6211\u4eec\u73b0\u9636\u6bb5 AT \u6240\u5e94\u7528\u7684\u573a\u666f\u9700\u8981\uff0c\u4e5f\u662f\u6211\u4eec\u7ecf\u8fc7\u957f\u671f\u601d\u8003\uff0c\u4e0d\u65ad\u8bd5\u9519\u4e0d\u65ad\u4fee\u6b63\uff0c\u5e76\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u5b9e\u8df5\u4e2d\u68c0\u9a8c\u8fc7\u53ef\u884c\u7684\u3002\u4ee5\u6b64\uff0c\u5e0c\u671b\u80fd\u5e2e\u52a9\u53c2\u4e0e\u5230\u81ea\u52a8\u5316\u7684\u76f8\u5173\u4eba\u5458\u51cf\u5c11\u8bd5\u9519\u6210\u672c\uff0c\u66f4\u597d\u3001\u66f4\u5feb\u7684\u7f16\u5199\u7528\u4f8b\u53ca\u7ef4\u62a4\u7528\u4f8b\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_1","title":"\u4e00\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u89c4\u8303","text":"\u6807\u7b7e\u5316\u7ba1\u7406\u6587\u6863\u8bf7\u53c2\u8003\uff1a \u300a\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u64cd\u4f5c\u6307\u5f15\u300b \u4ee5\u4e0b\u8bf4\u51e0\u4e2a\u5bb9\u6613\u51fa\u73b0\u7684\u95ee\u9898\uff1a"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1","title":"1. \u5bf9\u5e94\u5173\u7cfb","text":" \u5199\u5b8c\u81ea\u52a8\u5316\u7528\u4f8b\u4e4b\u540e\uff0c\u8bf7\u5728 CSV \u6587\u4ef6\u4e2d\u6807\u8bb0\u7528\u4f8b\u7684 ID\u3001\u7b49\u7ea7\u3002\u4e3a\u4e86\u63d0\u9192\u6807\u8bb0\uff0c\u6267\u884c\u7528\u4f8b\u65f6\u5728\u9996\u884c\u4f1a\u8f93\u51fa ERROR \u65e5\u5fd7\uff1a CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94\u7684 ID\uff1b \u5728\u6700\u7ec8\u63d0\u4ea4\u4ee3\u7801\u4e4b\u524d\uff0c\u4f60\u9700\u8981\u5728 CSV \u6587\u4ef6\u91cc\u9762\u5c06ID\u3001\u7528\u4f8b\u7b49\u7ea7\u7b49\u6807\u7b7e\u8865\u5168\uff0c\u5982\u679c CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94 ID\uff0c\u540e\u7eed\u5728\u6279\u91cf\u6267\u884c\u7684\u65f6\u5019\uff0c\u8fd9\u4e9b\u7528\u4f8b\u662f\u4e0d\u4f1a\u6267\u884c\u7684\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2","title":"2. \u540d\u79f0\u4e00\u81f4","text":" CSV \u6587\u4ef6\u7684\u6587\u4ef6\u540d\u3001\u7528\u4f8b\u51fd\u6570\u4e2d\u95f4\u7684\u540d\u79f0\u4e00\u81f4\u3001\u7528\u4f8b py \u6587\u4ef6\u4e2d\u95f4\u7684\u540d\u79f0\uff0c\u8fd9\u4e09\u4e2a\u540d\u79f0\u4e00\u81f4\u3002 \u4e3e\u4f8b\uff1a # test_music_001.py\ndef test_music_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u90a3\u4e48 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e3a music.csv\u3002 AT \u6846\u67b6\u5e95\u5c42\u4ee3\u7801\u5b9e\u73b0\u662f\u5c06 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e0e\u7528\u4f8b\u51fd\u6570\u540d\u79f0\u540d\u79f0\uff08item.name\uff09\u8fdb\u884c\u5bf9\u5e94\uff0c\u56e0\u6b64\uff0c\u6ce8\u610f CSV \u6587\u4ef6\u540d\u79f0\u5bf9\u5e94\u7684\u662f\u7528\u4f8b\u51fd\u6570\u540d\u79f0\uff0c\u5373 def test_music_001 \u91cc\u9762\u7684 music \uff0c\u800c\u4e0d\u662f test_music_001.py \u91cc\u9762\u7684 music \u3002 \u8fd9\u91cc\u7ec6\u7ec6\u54c1\u4e00\u4e0b\u54c8~ \u5982\u679c\u4f60\u5c06\u4e0a\u4f8b\u5199\u6210\u4e86\u8fd9\u6837: # test_music_001.py\ndef test_movie_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u7528\u4f8b\u6267\u884c\u6ca1\u95ee\u9898\uff0c\u4f46\u662f\u6807\u7b7e\u5316\u7ba1\u7406\u662f\u4e0d\u751f\u6548\u7684\uff0c\u6846\u67b6\u65e0\u6cd5\u5c06 music.csv\u6587\u4ef6\u91cc\u9762\u6807\u7b7e\uff0c\u6dfb\u52a0\u5230 test_movie_001\u8fd9\u4e2a\u7528\u4f8b\u4e2d\uff0c\u56e0\u4e3a\u4ed6\u4eec\u6ca1\u6709\u5bf9\u5e94\u5173\u7cfb\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#tag","title":"\u4e8c\u3001\u5206\u652f\u53ca tag \u7ba1\u7406\u89c4\u8303","text":"\u53c2\u8003\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u4ee3\u7801\u7ba1\u7406\u89c4\u8303\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2-tag","title":"2. \u5e94\u7528\u5e93 tag","text":" \u5e94\u7528\u5e93 tag \u6839\u636e\u5e94\u7528\u4ea4\u4ed8\u8282\u70b9\u751f\u6210\uff0c\u6bcf\u6b21\u6253 tag \u4e4b\u524d\uff0c\u76f8\u5173\u6d4b\u8bd5\u4eba\u5458\u9700\u8981\u8fdb\u884c\u7528\u4f8b\u8c03\u8bd5\uff1b \u8c03\u8bd5\u7528\u4f8b\u662f\u6307\u7684\u5728\u5168\u67b6\u6784\uff08x86\u3001arm\u3001mips\uff09\u4e0a\u8c03\u8bd5\u901a\u8fc7\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\u8fbe\u5230 90% \u4ee5\u4e0a\u624d\u80fd\u6253 tag\uff0c\u901a\u8fc7 Jenkins \u6267\u884c\u5668\u6267\u884c\u7528\u4f8b\uff0c\u4fdd\u7559\u901a\u8fc7\u7387\u7ed3\u679c\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\uff1a\u901a\u8fc7\u7528\u4f8b\u6570 / (\u603b\u7528\u4f8b\u6570 - \u5df2\u5e9f\u5f03\u7528\u4f8b) \u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u7b97\u901a\u8fc7 Jenkins \u6267\u884c\u5668 \u4f60\u53ef\u80fd\u4f1a\u5728\u4e00\u4e2a\u4ea4\u4ed8\u5468\u671f\u5185\u6301\u7eed\u7684\u8fdb\u884cAT\u7528\u4f8b\u8c03\u8bd5\uff0c\u4f46\u662f\u6700\u7ec8 AT \u7528\u4f8b\u6253 tag \u7684\u5e94\u7528\u7248\u672c\uff0c\u9700\u8981\u4f7f\u7528\u5e94\u7528\u96c6\u6210\u4ea4\u4ed8\u7684\u6700\u65b0\u5e94\u7528\u7248\u672c\uff0c\u53ef\u4ee5\u4f7f\u7528\u5e94\u7528\u7684\u63d0\u6d4b\u7248\u672c\uff1b\u4e00\u5b9a\u8981\u786e\u4fdd\u8c03\u8bd5\u7528\u4f8b\u7684\u5e94\u7528\u7248\u672c\u662f\u6700\u65b0\u7684\uff0c\u4e0d\u7136\u96c6\u6210\u8fdb\u53bb\u4e4b\u540e\uff0c\u6301\u7eed\u96c6\u6210\u5c31\u4f1a\u51fa\u95ee\u9898\uff1b tag \u53f7\u600e\u4e48\u6253\uff1f \u6839\u636e\u6301\u7eed\u96c6\u6210\u7684\u8981\u6c42\u751f\u6210\uff0c\u5176\u4e2d\u5e94\u7528\u7248\u672c\u53f7\u9700\u8981\u4e0e\u9879\u76ee\u7ecf\u7406\u786e\u8ba4\u672c\u6b21\u5373\u5c06\u96c6\u6210\u7684\u5e94\u7528\u7248\u672c\u53f7\u662f\u591a\u5c11\uff1b tag \u7684 commit \u4fe1\u606f\u683c\u5f0f\uff1a # commit msg\nversion:5.6.5\n \u5176\u4e2d 5.6.5 \u5199\u5e94\u7528\u7684\u96c6\u6210\u7248\u672c\u53f7\u3002 \u751f\u6210 tag \u7684\u547d\u4ee4\u53c2\u8003\uff1a\u300aGit \u6807\u7b7e\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3-tag","title":"3. \u57fa\u7840\u6846\u67b6 tag","text":"\u57fa\u7840\u6846\u67b6 tag \u4e0d\u4e0e\u4e1a\u52a1\u6302\u94a9\uff0c\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u6309\u9700\u53d1\u5e03\u7248\u672c\uff0c\u5728\u6839\u76ee\u5f55\u4e0b CURRENT \u6587\u4ef6\u4e2d\u8bb0\u5f55\u7684\u5f53\u524d\u7248\u672c\u53f7\u548c\u5386\u53f2\u7248\u672c\u53f7\uff0c\u53ca\u5176\u5bf9\u5e94\u65b0\u589e\u4e86\u54ea\u4e9b\u529f\u80fd\uff0c\u6709\u52a9\u4e8e\u5e94\u7528\u9009\u62e9\u5408\u9002\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\u3002 # CURRENT\n[current]\ntag = 0.9.5\n \u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u7684 control \u6587\u4ef6\u8bb0\u5f55\u5f53\u524d\u5e94\u7528\u5e93\u4f9d\u8d56\u7684\u57fa\u7840\u5e93\u7248\u672c\u3002 # control\n[Depends]\nautotest-basic-frame = 0.9.5\n \u7528\u4f8b\u5728\u6267\u884c\u65f6\u4f1a\u6821\u9a8c\u4e24\u4e2a\u6587\u4ef6\u7684\u7248\u672c\u53f7\u662f\u5426\u4e00\u81f4\uff0c\u5982\u679c\u4e0d\u4e00\u81f4\uff0c\u4f1a\u6253\u5370 error \u65e5\u5fd7\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_2","title":"\u4e09\u3001\u4ed3\u5e93\u6743\u9650\u7ba1\u7406","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_1","title":"1. \u57fa\u7840\u6846\u67b6","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u4ed3\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame \u57fa\u7840\u6846\u67b6\u4e0d\u5141\u8bb8\u533f\u540d\u8bbf\u95ee\uff0c\u5982\u679c\u4f60\u767b\u5f55 gerrit \u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u8bbf\u95ee\u4ee5\u4e0a\u94fe\u63a5\uff0c\u5219\u9700\u8981\u7533\u8bf7\u8bbf\u95ee\u6743\u9650\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_1","title":"2. \u5e94\u7528\u4ed3\u5e93","text":" \u81ea\u52a8\u5316\u5e94\u7528\u4ed3\u5e93\uff1a https://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684 app_name \u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_3","title":"\u56db\u3001\u65b9\u6cd5\u7f16\u5199&\u8c03\u7528\u89c4\u8303","text":"\u65b9\u6cd5\u7f16\u5199\u6574\u4f53\u8bbe\u8ba1\u601d\u8def\u53c2\u8003\uff1a[\u300aAT\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b]"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_2","title":"1. \u65b9\u6cd5\u7f16\u5199","text":"\u5199\u65b9\u6cd5\u7684\u65f6\u5019\u6ce8\u610f\u65b9\u6cd5\u5f52\u5c5e\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget\uff0c\u65b9\u6cd5\u662f\u5728\u54ea\u4e2a\u533a\u57df\u64cd\u4f5c\u7684\uff0c\u5c31\u5199\u5728\u54ea\u4e2a\u7c7b\u91cc\u9762\u3002 \u4e3e\u4f8b\uff1a from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n\"\"\"\u70b9\u51fb\u6807\u9898\u680fxxx\"\"\"\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_2","title":"2. \u65b9\u6cd5\u8c03\u7528","text":" \u5728\u7528\u4f8b\u4e2d\u8c03\u7528\u65b9\u6cd5\uff0c\u901a\u8fc7\u8be5\u5e94\u7528\u552f\u4e00\u7684\u51fa\u53e3\u8fdb\u884c\u8c03\u7528\uff0c\u6bd4\u5982\u6587\u7ba1\uff1a class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n \u4e0d\u8981\u5728\u7528\u4f8b\u4e2d\u5355\u72ec\u53bb\u8c03\u7528 TitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u8fd9\u4e9b\u7c7b\uff0c\u5426\u5219\u540e\u671f\u7528\u4f8b\u4f1a\u53d8\u5f97\u4e0d\u597d\u7ef4\u62a4\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_4","title":"\u4e94\u3001\u7528\u4f8b\u7f16\u5199\u89c4\u8303","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_3","title":"1. \u57fa\u4e8e\u7c7b\u5199\u7528\u4f8b","text":"\u6240\u6709\u7528\u4f8b\u90fd\u5e94\u8be5\u57fa\u4e8e\u7c7b\u53bb\u5199\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001(self):\n\"\"\"\u97f3\u4e50\u542f\u52a8\"\"\"\n \u6ce8\u610f\u4ee5\u4e0b\u51e0\u70b9\uff1a \u7c7b\u540d\u4e0d\u8981\u968f\u4fbf\u53d6\uff0c\u540c\u4e00\u4e2a\u5e94\u7528\u5e94\u8be5\u4f7f\u7528\u540c\u4e00\u4e2a\u7c7b\u540d\uff0c\u7528\u4f8b\u7c7b\u540d\u79f0\u5fc5\u987b\u4ee5 Test \u5f00\u5934\uff0c\u9075\u5faa\u5927\u9a7c\u5cf0\u547d\u540d\u89c4\u8303\uff1b \u7528\u4f8b\u7c7b\u7ee7\u627f BaseCase\uff0c\u4e00\u4e2a\u5e94\u7528\u53ea\u6709\u4e00\u4e2a BaseCase \u4e00\u4e2a py \u6587\u4ef6\u91cc\u9762\u53ea\u6709\u4e00\u4e2a\u7c7b\uff0c\u6211\u4eec\u79f0\u4e3a\u4e00\u4e2a\u6d4b\u8bd5\u7c7b\uff1b \u4e00\u4e2a\u7c7b\u91cc\u9762\u53ef\u4ee5\u6709\u591a\u4e2a\u7528\u4f8b\u51fd\u6570\uff0c\u8fd9\u53d6\u51b3\u8fd9\u6761\u7528\u4f8b\u6709\u591a\u5c11\u4e2a\u6d4b\u8bd5\u70b9\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001_1(self):\n\"\"\"\u4efb\u52a1\u680f\u542f\u52a8\u97f3\u4e50\"\"\"\ndef test_music_001_2(self):\n\"\"\"\u542f\u52a8\u5668\u542f\u52a8\u97f3\u4e50\"\"\" \ndef test_music_001_3(self):\n\"\"\"\u684c\u9762\u542f\u52a8\u97f3\u4e50\"\"\"\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_3","title":"2. \u7528\u4f8b\u51fd\u6570\u89c4\u8303","text":" \u7528\u4f8b\u51fd\u6570\u4ee5 test \u5f00\u5934\uff0c\u9075\u5faa\u86c7\u5f62\u547d\u540d\u89c4\u8303\uff0c\u4e2d\u95f4\u4e3a\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0\uff0c\u540e\u9762\u52a0\u7528\u4f8b ID\uff0c\u6700\u540e\u52a0\u6d4b\u8bd5\u70b9\u5e8f\u53f7\uff0c\u5373 test_${module}_${case_id}[_${index}] \uff1b \u6bd4\u5982\uff1atest_music_001_1\uff0cindex \u4ece 1 \u5f00\u59cb\u3002 \u51fd\u6570\u529f\u80fd\u8bf4\u660e\u91cc\u9762\u5199\u7528\u4f8b\u6807\u9898\uff0c\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u6807\u9898\u5373\u53ef\uff0c\u6ce8\u610f\u7528\u4e09\u5bf9\u53cc\u5f15\u53f7\uff0c\u4e0d\u8981\u7528\u5176\u4ed6\u6ce8\u91ca\uff0c\u66f4\u4e0d\u8981\u7528\u4e95\u53f7\u6ce8\u91ca\u5199\u7528\u4f8b\u6807\u9898\uff1b \u76f4\u63a5\u590d\u5236 PMS \u7528\u4f8b \u7528\u4f8b\u6b65\u9aa4\u76f4\u63a5\u5c06 PMS \u4e0a\u7528\u4f8b\u6b65\u9aa4\u548c\u9884\u671f\u590d\u5236\u8fdb\u6765\uff0c\u7136\u540e\u8fdb\u884c\u6279\u91cf\u6ce8\u91ca\uff08ctrl + /\uff09\uff0c\u5728\u6ce8\u91ca\u7684\u57fa\u7840\u4e0a\u53bb\u5199\u7528\u4f8b\u811a\u672c\u4f1a\u66f4\u52a0\u65b9\u4fbf\u5168\u9762\uff0c\u4e5f\u6bd4\u4f60\u81ea\u5df1\u5199\u6ce8\u91ca\u66f4\u8282\u7ea6\u65f6\u95f4\uff1a \u4e3e\u4f8b\uff0cPMS \u7528\u4f8b\uff1a \u76f4\u63a5\u9009\u4e2d\u7528\u4f8b\u5185\u5bb9\uff0c\u590d\u5236\u4e0b\u6765\uff0c\u7136\u540e\u7c98\u8d34\u5230\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c\u4e2d\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\n \u4e0a\u4f8b\u4e2d\u4e95\u53f7\u6ce8\u91ca\u90e8\u5206\u5c31\u662f\u76f4\u63a5\u4ece PMS \u4e0a\u590d\u5236\u8fc7\u6765\u7684\uff0c\u5728\u6b64\u57fa\u7840\u4e0a\u5199\u7528\u4f8b\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\nmusic = DeepinMusicWidget()\nmusic.click_singer_btn_in_music_by_ui()\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\nmusic.click_icon_mode_in_music_by_ui()\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\nmusic.double_click_first_singer_in_singer_icon_view_by_ui()\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\nself.assert_xxx\n \u4f60\u770b\uff0c\u975e\u5e38\u6e05\u695a\u6bcf\u4e00\u6b65\u5728\u505a\u4ec0\u4e48\uff0c\u91cd\u70b9\u662f\u7701\u53bb\u4e86\u5199\u6ce8\u91ca\u7684\u65f6\u95f4\uff0c\u771f\u7684\u7092\u9e21\u65b9\u4fbf\u3002 \u4e0d\u5199 if __name__ == '__main__':\uff0c\u4e0d\u5199\u591a\u4f59\u7684\u4ee3\u7801\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3","title":"3. \u6570\u636e\u9a71\u52a8","text":" \u5982\u679c\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u662f\u76f8\u540c\u7684\uff0c\u53ea\u662f\u4e00\u4e9b\u53c2\u6570\u53d8\u5316\uff0c\u5c3d\u91cf\u4f7f\u7528\u6570\u636e\u9a71\u52a8\u6765\u5b9e\u73b0\u7528\u4f8b\uff1b \u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u6570\u636e\u9a71\u52a8\u7684\u6570\u636e\uff0c\u4e0d\u80fd\u56e0\u6b64\u5f15\u5165\u4f9d\u8d56\uff0c\u5c3d\u91cf\u4f7f\u7528\u4e00\u4e9b\u6807\u51c6\u5e93\u80fd\u8bfb\u53d6\u7684\u6587\u4ef6\u683c\u5f0f\uff0c\u6bd4\u5982 json\u3001ini\u3001CSV\u3001xml\u3001txt \u7b49\u6587\u4ef6\u683c\u5f0f\uff1b\u4e0d\u5efa\u8bae\u4f7f\u7528 Yaml\u3001Excel\u3001MySQL \u7b49\u6570\u636e\u683c\u5f0f\uff1b \u8bfb\u53d6\u6570\u636e\u65f6\u4e5f\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff0c\u5982\u4f7f\u7528 pandas \u5904\u7406 CSV \u5c31\u5c5e\u4e8e\u5927\u6750\u5c0f\u7528\u4e86\uff0c\u6b63\u5e38\u7684\u6570\u636e\u9a71\u52a8\u8fd8\u6ca1\u5230\u9700\u8981\u5927\u6570\u636e\u5206\u6790\u6765\u5904\u7406\u7684\u5730\u6b65\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u5728 widget/ddt/ \u76ee\u5f55\u4e0b\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5199\u6cd5\uff1a @pytest.mark.parametrize(\"value\", data)\ndef test_smb_049(self, value):\n \u4ee5\u4e0a\u8fd9\u79cd\u53c2\u6570\u5316\u7684\u5199\u6cd5\u672c\u8eab\u6ca1\u4ec0\u4e48\u95ee\u9898\uff0c\u4f46\u662f\uff0c\u8fd9\u91cc\u5fc5\u987b\u8981\u8865\u5145\u4e00\u4e2a\u6ca1\u6709\u7528\u7684\u5c0f\u77e5\u8bc6\uff1a \u5982\u679c\u53c2\u6570\u5316\u6570\u636e\u91cc\u9762\u7684\u5b57\u7b26\u4f1a\u539f\u5c01\u4e0d\u52a8\u7684\u8f93\u51fa\u5230 item.name \u91cc\u9762\uff0c\u663e\u793a\u975e\u5e38\u4e0d\u4f18\u96c5\uff0c\u800c\u4e14\u53ef\u4ee5\u4f1a\u5f15\u5165\u4e00\u4e9b\u610f\u60f3\u4e0d\u5230\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u611f\u53d7\u4e00\u4e0b\uff1a \u53c2\u6570\uff1a data = [\n\"\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\", \"qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678\",\n]\n \u73b0\u8c61\u662f\u8fd9\u6837\u8272\u513f\u7684\uff1a test_smb_049.py::TestFileManager::test_smb_049[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09]\ntest_smb_049.py::TestFileManager::test_smb_049[qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui]\ntest_smb_049.py::TestFileManager::test_smb_049[12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678]\n \u8bf4\u5b9e\u8bdd\uff0c\u770b\u7740\u5fc3\u91cc\u5835\u5f97\u614c\uff0c\u5982\u679c\u8fd9\u91cc\u9762\u5305\u542b\u4e00\u4e9b\u7279\u6b8a\u5b57\u7b26\u6216\u8005\u662f\u8d85\u957f\uff0c\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u5f88\u5947\u5999\u7684\u4e8b\u60c5\u53d1\u751f\u3002 parametrize \u91cc\u9762\u6709\u4e2a\u53c2\u6570\uff1aids\uff0c\u53ef\u4ee5\u89e3\u51b3\u6b64\u7c7b\u95ee\u9898\uff0c\u5c31\u50cf\u8fd9\u6837\uff1a @pytest.mark.parametrize(\"value\", data, ids=[1, 2, 3])\ndef test_smb_049(self, value):\n \u518d\u6765\u611f\u53d7\u4e00\u4e0b\uff1a test_smb_049.py::TestFileManager::test_smb_049[1]\ntest_smb_049.py::TestFileManager::test_smb_049[2]\ntest_smb_049.py::TestFileManager::test_smb_049[3]\n \u660e\u663e\u597d\u591a\u4e86\uff0c\u6240\u4ee5\u5c3d\u91cf\u4f7f\u7528 ids \u8fd9\u4e2a\u53c2\u6570\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 fixture \u7684\u6570\u636e\u9a71\u52a8\u65b9\u5f0f\uff0c\u6846\u67b6\u867d\u7136\u652f\u6301\uff0c\u4f46\u53ef\u8bfb\u6027\u6bd4\u8f83\u5dee\uff1b\u5982\u679c\u4f60\u4e0d\u77e5\u9053\u8fd9\u53e5\u8bdd\u5728\u8bf4\u5565\uff0c\u90a3\u4f60\u53ef\u4ee5\u5ffd\u7565\uff0c\u6211\u4e5f\u4e0d\u6253\u7b97\u8be6\u7ec6\u8bf4\u8fd9\u79cd\u5b9e\u73b0\u65b9\u5f0f\uff0c\u64cd\u4f5c\u6bd4\u8f83\u9a9a\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4","title":"4. \u65ad\u8a00\u8d44\u6e90","text":" \u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u76f4\u63a5\u653e\u5728\u7528\u4f8b\u6a21\u5757\u7684\u540c\u7ea7\u76ee\u5f55\u4e0b\u7684 assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0 + \u7528\u4f8b ID \u547d\u540d\uff1b \u56fe\u50cf\u8bc6\u522b\u65ad\u8a00\uff0c\u4e0d\u8981\u622a\u53d6\u4e00\u5f20\u5f88\u5927\u7684\u56fe\uff0c\u56fe\u7247\u8d44\u6e90\u5305\u542b\u7684\u5143\u7d20\u592a\u591a\u4e86\uff0c\u975e\u5e38\u5bb9\u6613\u53d7\u5230\u9700\u6c42\u5f71\u54cd\uff0c\u5efa\u8bae\u662f\u8fdb\u884c\u5c40\u90e8\u7684\u65ad\u8a00\uff1b \u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u5339\u914d\u5ea6\u662f 0.9\uff0c\u5982\u679c\u65ad\u8a00\u7684\u573a\u666f\u5bf9\u4e8e\u7cbe\u786e\u5ea6\u8981\u6c42\u6ca1\u90a3\u4e48\u9ad8\uff0c\u53ef\u4ee5\u5728\u65ad\u8a00\u8bed\u53e5\u91cc\u9762\u4f20\u5165\u5c0f\u4e8e 0.9 \u7684\u53c2\u6570\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5","title":"5. \u5143\u7d20\u5b9a\u4f4d","text":" \u7528\u4e8e\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u4e2d\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u547d\u540d\u4e3a\u8be5\u5143\u7d20\u7684\u540d\u79f0\uff1b \u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u622a\u53d6\u65f6\u5c3d\u91cf\u7cbe\u786e\u5230\u8fd9\u4e2a\u5177\u4f53\u7684\u6309\u94ae\uff0c\u56fe\u7247\u4e5f\u4e0d\u8981\u592a\u5927\uff1b \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u64cd\u4f5c\u8f83\u5feb\uff0c\u5408\u7406\u52a0\u5165\u7b49\u5f85\u65f6\u95f4\u80fd\u63d0\u9ad8\u7528\u4f8b\u7684\u7a33\u5b9a\u6027\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6","title":"6. \u7528\u4f8b\u8d44\u6e90","text":" \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u4f7f\u7528\u5230\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u6bd4\u5982\u97f3\u4e50\u53ef\u80fd\u9700\u8981\u4e00\u4e9b mp3 \u7684\u8d44\u6e90\u7528\u4e8e\u6d4b\u8bd5\uff0c\u5b58\u653e\u5728 widget/case_res \u76ee\u5f55\u4e0b\uff0c\u524d\u63d0\u662f\u8fd9\u4e9b\u8d44\u6e90\u4e0d\u8d85\u8fc7 10M\uff1b \u5982\u679c\u662f\u4e00\u4e9b\u6bd4\u8f83\u5927\u7684\u8d44\u6e90\uff0c\u5efa\u8bae\u653e\u5230\u7edf\u4e00\u7684 ftp \u670d\u52a1\u5668 \uff08ftp://10.8.10.245\uff09\uff0c\u9700\u8981\u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\u518d\u4e0b\u8f7d\u4e0b\u6765\uff1b f\"wget ftp://{Config.FTP_IP}/uploads/\u591a\u5a92\u4f53/\u5f71\u9662/auto/{file_name};unzip {file_name};rm -rf {file_name};\"\n \u6d4b\u8bd5\u8d44\u6e90\u4e0b\u8f7d\u5230\u5e94\u7528 widget/case_res \u76ee\u5f55\u4e0b\uff1b \u7981\u6b62\u5c06\u6d4b\u8bd5\u8d44\u6e90\u5b58\u653e\u5728\u4e2a\u4eba\u7684\u673a\u5668\u4e0a\uff1b \u5e94\u8be5\u5c3d\u91cf\u4fdd\u8bc1\uff0c\u4e00\u4e2a\u8d44\u6e90\u5728\u4e00\u6b21\u7528\u4f8b\u6267\u884c\u4e2d\u53ea\u9700\u8981\u4e0b\u8f7d\u4e00\u6b21\uff0c\u6240\u4ee5\u4f60\u4e0d\u80fd\u6bcf\u6b21\u4f7f\u7528\u7684\u65f6\u5019\u90fd\u53bb\u4e0b\u8f7d\uff0c\u8fd9\u6837\u53ef\u80fd\u4f1a\u8017\u8d39\u5927\u91cf\u7684\u7f51\u7edc\u8d44\u6e90\uff0c\u800c\u56e0\u4e3a\u5148\u5224\u65ad\u672c\u5730\u662f\u5426\u5b58\u5728\u6b64\u8d44\u6e90\uff0c\u5982\u679c\u4e0d\u5b58\u5728\u518d\u53bb\u4e0b\u8f7d\uff1b \u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u5c06\u8d44\u6e90\u62f7\u8d1d\u5230\u5bf9\u5e94\u7684\u6d4b\u8bd5\u76ee\u5f55\u4e0b\uff0c\u6bd4\u5982\u5c06 mp3 \u6587\u4ef6\u62f7\u8d1d\u5230 ~/Music \u76ee\u5f55\u4e0b\uff0c\u4f46\u662f\u6211\u4eec\u66f4\u5efa\u8bae\u4f60\u4f7f\u7528\u53d1\u9001\u5feb\u6377\u94fe\u63a5\u7684\u65b9\u5f0f\u66ff\u4ee3\u62f7\u8d1d\u7684\u64cd\u4f5c\uff0c\u56e0\u4e3a\u5728\u62f7\u8d1d\u5927\u6587\u4ef6\u65f6\u662f\u5f88\u6d88\u8017\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u800c\u521b\u5efa\u94fe\u63a5\u5219\u4e0d\u4f1a\uff1b @classmethod\ndef recovery_many_movies_in_movie_by_cmd(cls):\n\"\"\"\u6062\u590d\u591a\u4e2a\u89c6\u9891\u6587\u4ef6\u81f3\u89c6\u9891\u76ee\u5f55\u4e2d\"\"\"\nwork_path = f\"/home/{Config.USERNAME}/Videos/auto\"\ncode_path = f\"{Config.CASE_RES_PATH}/auto\"\ncls.run_cmd(f\"rm -rf {work_path};mkdir {work_path}\")\nsleep(1)\nflag = False\nif not exists(code_path):\ncls.run_cmd(f\"mkdir -p {code_path}\")\nflag = True\nlogger.info(f\"ln -s {code_path}/* {work_path}/\")\ncls.run_cmd(\nf\"cd {code_path}/;\"\nf\"{cls.wget_file('auto.zip') if flag else ''}\"\nf\"ln -s {code_path}/* {work_path}/ > /dev/null 2>&1\"\n)\n \u8d44\u6e90\u4e0b\u8f7d\u8fc7\u7a0b\u4e2d\u6ce8\u610f\u8d85\u65f6\u7684\u95ee\u9898\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u5f88\u5927\uff0c\u8981\u7279\u522b\u6ce8\u610f\u8fd9\u95ee\u9898\uff0c\u5982\u679c\u4f60\u4f7f\u7528\u5f3a\u5236\u7b49\u5f85\u4e0b\u8f7d\u7ed3\u675f( os.system )\uff0c\u53ef\u80fd\u4f1a\u9020\u6210\u7528\u4f8b\u6267\u884c\u65f6\u957f\u53d8\u5f97\u4e0d\u53ef\u63a5\u53d7\uff0c\u76ee\u524d\u6211\u4eec\u53d1\u73b0\u5728\u6301\u7eed\u96c6\u6210\u73af\u5883\u6267\u884c\u65f6\u7f51\u7edc\u4e0b\u8f7d\u901f\u5ea6\u5f88\u6162\uff0c\u6240\u4ee5\u8d85\u65f6\u673a\u5236\u662f\u5f88\u6709\u5fc5\u8981\u7684\uff1brun_cmd \u65b9\u6cd5\u6709\u4e00\u4e2a\u9ed8\u8ba4\u8d85\u65f6\u7684\u65f6\u95f4\uff0c\u4f60\u53ef\u4ee5\u6839\u636e\u8d44\u6e90\u5927\u5c0f\u5bf9\u8d85\u65f6\u65f6\u95f4\u8fdb\u884c\u8c03\u6574\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_5","title":"\u516d\u3001\u7528\u4f8b\u8c03\u8bd5\u6280\u5de7","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_4","title":"1. \u65e5\u5fd7","text":" \u4e00\u5b9a\u8981\u5148\u770b\u62a5\u9519\uff0c\u770b error \u65e5\u5fd7\uff0c\u901a\u5e38\u80fd\u660e\u786e\u7684\u544a\u8bc9\u4f60\u5177\u4f53\u54ea\u91cc\u4ee3\u7801\u62a5\u9519\uff1b \u7ed3\u5408\u62a5\u9519\u70b9\u524d\u9762\u7684error\u3001 info \u548c debug \u65e5\u5fd7\u770b\u5426\u662f\u6b63\u5e38\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_4","title":"2. \u65ad\u70b9\u8c03\u8bd5","text":" \u65b9\u6cd5\u62a5\u9519\uff1a \u5728\u65b9\u6cd5\u5e93\u4e2d\u627e\u5230\u5bf9\u5e94\u7684\u65b9\u6cd5\uff0c\u5355\u72ec\u8c03\u7528\uff0c\u770b\u662f\u5426\u80fd\u6b63\u5e38\u6267\u884c\uff1b \u901a\u5e38\u5355\u4e2a\u65b9\u6cd5\u7684\u6267\u884c\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u62a5\u9519\uff0c\u5f88\u5feb\u5c31\u80fd\u6392\u67e5\u51fa\u95ee\u9898\uff1b\u5728\u65b9\u6cd5\u5185\u90e8\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u65b9\u6cd5\u5185\u90e8\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u8c03\u7528\u6ca1\u95ee\u9898\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u62a5\u9519\u7684\u65b9\u6cd5\u524d\u9762\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u7528\u4f8b\u7684\u4e1a\u52a1\u903b\u8f91\u548c\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u65ad\u8a00\u62a5\u9519\uff1a \u65ad\u8a00\u4e3a\u6570\u636e\u65ad\u8a00\uff0c\u6839\u636e\u8868\u8fbe\u5f0f\u8fdb\u884c\u65ad\u8a00\u8bed\u53e5\u8fdb\u884c\u4fee\u6539\uff1b \u6587\u4ef6\u751f\u6210\u7c7b\u65ad\u8a00\uff0c\u67e5\u770b\u662f\u5426\u9700\u8981\u52a0\u7b49\u5f85\u65f6\u95f4\uff1b \u56fe\u50cf\u65ad\u8a00\uff0c\u5728\u65ad\u8a00\u8bed\u53e5\u5904\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u7528\u4f8b\u8fd0\u884c\u5230\u65ad\u8a00\u5904\u4f1a\u505c\u6b62\uff0c\u67e5\u770b\u6b64\u65f6\u65ad\u8a00\u7684\u56fe\u7247\u4e0e\u7528\u4f8b\u6267\u884c\u7684\u73b0\u573a\u5b58\u5728\u4ec0\u4e48\u5dee\u5f02\uff0c\u6b64\u65f6\u4e5f\u53ef\u4ee5\u8fdb\u884c\u91cd\u65b0\u622a\u56fe\uff0c\u4ece\u800c\u66ff\u6362\u65b0\u7684\u56fe\u7247\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3_1","title":"3. \u8fdc\u7a0b\u6267\u884c","text":" \u8fdc\u7a0b\u6267\u884c\u6307\u7684\u662f\u7f16\u8f91\u5668\u901a\u8fc7\u6307\u5b9a\u8fdc\u7a0b\u89e3\u91ca\u5668\u6267\u884c\u81ea\u52a8\u5316\u4ee3\u7801\uff1b \u8fdc\u7a0b\u6267\u884c\u7684\u597d\u5904\u662f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u7684 Debug \u8fd0\u884c\uff0c\u4e0d\u7528\u5728\u6d4b\u8bd5\u673a\u4e0a\u6253\u5f00\u7f16\u8f91\u5668\uff0c\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u66f4\u5feb\uff1b \u652f\u6301\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u7684\u7f16\u8f91\u5668\uff1a \u4e13\u4e1a\u7248 Pycharm VScode \uff0c\u9700\u8981\u4f7f\u7528\u63d2\u4ef6 Remote-SSH \u8fdc\u7a0b\u6267\u884c\u914d\u7f6e \u4ee5 Pycharm \u4e3a\u4f8b\uff1a File \u2014> Settings \u2014> Project \u2014> Python Interpreter \u2014> \u53f3\u8fb9\u8bbe\u7f6e\u6309\u94ae \u2014> Add... \u2014> SSH Interpreter \u2014> New server configuration(\u586b\u5165host\u548cusername) \u2014> Next \u2014> password\uff08\u6d4b\u8bd5\u673a\u5bc6\u7801\uff09 \u2014> Interpreter(\u9009\u62e9\u8fdc\u7a0b\u89e3\u91ca\u5668) \u2014> Finish "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4_1","title":"4. \u73af\u5883\u6e05\u7406","text":" \u5982\u679c\u7528\u4f8b\u91cc\u9762\u7684 teardown \u6ca1\u6709\u6267\u884c\uff0c\u5927\u6982\u7387\u662f\u56e0\u4e3a setup \u91cc\u9762\u4ee3\u7801\u62a5\u9519\uff0c\u8fd9\u4e24\u4e2a\u662f\u4e00\u5bf9\u7684\uff0csetup \u91cc\u9762\u62a5\u9519\uff0cteardown \u91cc\u9762\u7684\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\uff1b \u76ee\u524d\u6211\u4eec\u5df2\u7ecf\u5c06\u5404\u5e94\u7528\u7684 clean_all \u8fd9\u4e2a fixture \u6539\u6210\u4e86\u7ec8\u7ed3\u5668\uff0c\u786e\u4fdd\u59cb\u7ec8\u80fd\u6267\u884c\u5230\u8fd9\u6b65\uff0c\u4f46\u662f\u7528\u4f8b\u91cc\u9762\u7684 fixture\uff0c\u8fd8\u662f\u9700\u8981\u6211\u4eec\u5c0f\u5fc3\u5904\u7406\uff1b \u8981\u6267\u884c clean_all \u9700\u8981\u5728\u7f16\u8f91\u5668\u8fd0\u884c\u53c2\u6570\u52a0 --clean yes\uff0c\u5199\u7528\u4f8b\u7684\u65f6\u5019\u8bf7\u52a0\u4e0a\uff0c\u4e0d\u7136\u4f60\u4e0d\u786e\u5b9a\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u7684\u73af\u5883\u662f\u5426\u6062\u590d\uff1b setup \u53ef\u4ee5\u4e0d\u8981\uff0c\u5c06 setup \u653e\u5230\u7528\u4f8b\u91cc\u9762\u662f\u4e00\u79cd\u7a33\u59a5\u7684\u505a\u6cd5\uff0cteardown \u4e00\u5b9a\u8981\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5_1","title":"5. \u5143\u7d20\u5b9a\u4f4d\u4e0d\u51c6\uff08\u5750\u6807\u8fd4\u56de\u4e0d\u5bf9\uff09","text":" \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u53ef\u80fd\u53d7\u5230\u7a97\u53e3 ID \u7684\u53d8\u5316\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u9ed8\u8ba4\u53d6\u6700\u65b0\u7684\u4e00\u4e2a\u7a97\u53e3\u7528\u4e8e\u5b9a\u4f4d\uff0c\u4f46\u5982\u679c\u5b9e\u9645\u9700\u8981\u5b9a\u4f4d\u7684\u4e0d\u662f\u6700\u65b0\u7684\u7a97\u53e3\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u91cd\u65b0\u5b9e\u4f8b\u5316\u65b9\u6cd5\u7c7b\u5bf9\u8c61\uff0c\u5e76\u5728\u7c7b\u4e2d\u4f20\u5165\u5bf9\u5e94\u7684\u7a97\u53e3\u5e8f\u53f7\uff1b \u57fa\u4e8e\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u76ee\u524d\u9047\u5230\u7684\u7b14\u8bb0\u672c\u4e0a\uff0c\u7531\u4e8e\u5c4f\u5e55\u7f29\u653e\u6bd4\u4f8b\u4e3a 1.25\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u6211\u4eec\u9ed8\u8ba4\u4f7f\u7528\u7f29\u653e\u6bd4\u4f8b\u4e3a 1\uff1b \u57fa\u4e8e\u56fe\u50cf\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u76ee\u6807\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b \u57fa\u4e8e OCR \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u6587\u5b57\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u540c\u6837\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6_1","title":"6. \u952e\u9f20\u64cd\u4f5c\u4e0d\u51c6","text":" \u9f20\u6807\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6bd4\u5982\u53f3\u952e\u3001\u53cc\u51fb\u65e0\u54cd\u5e94\uff1b \u952e\u76d8\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6216\u8005\u5ef6\u8fdf\u8f93\u5165\uff0c\u6bd4\u5982\u7528\u4f8b\u9700\u8981\u8f93\u5165\u201c\u6211\u662f\u4e2d\u56fd\u4eba\u201d\uff0c\u5b9e\u9645\u53ea\u8f93\u5165\u4e86\u201c\u6211\u56fd\u4eba\u201d\uff1b \u4ee5\u4e0a\u95ee\u9898\u6392\u9664\u5e94\u7528\u5361\u987f\u7b49\u95ee\u9898\uff0c\u5927\u6982\u7387\u662f\u7531\u4e8e\u5de5\u5177\u7684\u95ee\u9898\uff0c\u76ee\u524d\u952e\u9f20\u64cd\u4f5c\u6211\u4eec\u4f7f\u7528\u4e09\u4e2a\u5de5\u5177\uff1aDogtail \u63d0\u4f9b\u7684\u952e\u9f20\u5de5\u5177\u3001PyAutoGUI\u3001Xdotool \uff1b \u6709\u540c\u5b66\u53ef\u80fd\u8981\u8bf4\u4e3a\u5565\u8981\u7528\u4e09\u4e2a\u554a\uff0c\u7528\u4e00\u4e2a\u4e0d\u5c31\u597d\u4e86\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u5404\u6709\u4f18\u70b9\u5404\u6709\u7f3a\u70b9\u3002 \u5982\u679c\u4f60\u9047\u5230\u952e\u9f20\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u8bd5\u8bd5\u901a\u8fc7\u4e0d\u540c\u7684\u5de5\u5177\u64cd\u4f5c\uff1b\u952e\u76d8\u8f93\u5165\u5ef6\u8fdf\u7684\u95ee\u9898\uff0c\u4e00\u822c\u662f\u56e0\u4e3a\u8f93\u5165\u901f\u5ea6\u592a\u5feb\u4e86\uff0c\u7cfb\u7edf\u6ca1\u53cd\u5e94\u8fc7\u6765\uff0c\u5e38\u89c1\u4e8e ARM \u548c MIPS \u4e0a\uff0c\u4fee\u6539\u53c2\u6570 delay_time \u7684\u503c\uff0c\u5355\u4f4d\u4e3a\u6beb\u79d2\uff1b # mouse_key.py\n@classmethod\ndef input_message(cls, message, delay_time=300, interval=0.2):\n\"\"\"\n \u8f93\u5165\u5b57\u7b26\u4e32\n :param message: \u8f93\u5165\u7684\u5185\u5bb9\n :param delay_time: \u5ef6\u8fdf\u65f6\u95f4\n :param interval:\n :return:\n \"\"\"\n \u5982\u679c\u4e0d\u662f\u65b9\u6cd5\u7684\u95ee\u9898\uff0c\u5219\u9700\u8981\u7ee7\u7eed\u548c\u5f00\u53d1\u4e00\u8d77\u6392\u9664\uff0c\u662f\u5426\u4e3a\u5e94\u7528\u63a5\u53d7\u952e\u9f20\u4fe1\u53f7\u5904\u7406\u7684\u95ee\u9898\uff0c\u8fd9\u7c7b\u60c5\u51b5\u6211\u4eec\u4e5f\u662f\u9047\u5230\u8fc7\u7684\uff0c\u5177\u4f53\u95ee\u9898\u5177\u4f53\u5206\u6790\u3002 \u6bd4\u5982\u5f71\u9662\u5c31\u91cd\u5199\u4e86\u4e00\u4e2a\u53f3\u952e\u7684\u65b9\u6cd5\uff1a # base_widget.py\n@classmethod\ndef right_click(cls, _x=None, _y=None):\n\"\"\"\n \u91cd\u5199\u5e95\u5c42\u5355\u51fb\u9f20\u6807\u53f3\u952e\n \u89e3\u51b3\u5f71\u9662\u53f3\u952e\u89e6\u53d1release\u4e8b\u4ef6\u7684\u95ee\u9898\uff08\u53f3\u952e\u4e3b\u7a97\u53e3\u4f1a\u64ad\u653e\u89c6\u9891\uff09\n \"\"\"\ncls.mouse_down(_x, _y, button=3)\nsleep(0.1)\ncls.mouse_up(button=3)\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_6","title":"\u4e03\u3001\u5176\u4ed6\u4e0d\u4e3a\u4eba\u77e5\u7684\u7ec6\u8282","text":" \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u5c3d\u91cf\u7f16\u5199\u540c\u4e00\u4e2a\u5e94\u7528\u6216\u6a21\u5757\u7684\u7528\u4f8b\uff0c\u80fd\u5bf9\u8be5\u7528\u4f8b\u5df2\u6709\u65b9\u6cd5\u719f\u6089\uff0c\u907f\u514d\u8fc7\u591a\u91cd\u590d\u4e1a\u52a1\u4ee3\u7801\u7684\u5c01\u88c5\uff1b \u76f8\u540c\u7684\u573a\u666f\u4e0b\uff0c\u5404\u67b6\u6784\u7b49\u5f85\u65f6\u95f4\u4e0d\u540c\uff0c\u5efa\u8bae\u4f7f\u7528\u6846\u67b6\u63d0\u4f9b\u7684 sleep\uff0c\u6211\u4eec\u505a\u4e86\u4e0d\u540c\u67b6\u6784\u7684\u500d\u6570\u653e\u5927\uff1b \u7f16\u5199\u7528\u4f8b\u65f6\uff0c\u5c3d\u91cf\u8003\u8651\u5230\u6bcf\u4e00\u6b65\u5f02\u5e38\u540e\u7684\u73af\u5883\u6062\u590d\uff0c\u9700\u8981\u5efa\u8bae\u8fd9\u79cd\u610f\u8bc6\uff0c\u968f\u65f6\u8981\u8003\u8651\u5230\uff0c\u8fd9\u6b65\u64cd\u4f5c\u6709\u6ca1\u6709\u53ef\u80fd\u51fa\u9519\uff0c\u51fa\u9519\u4e86\u6539\u600e\u4e48\u529e\uff1b \u63d0\u4ea4\u4ee3\u7801\u7684\u65f6\u5019\u6ce8\u610f\u4e0d\u8981\u628a\u4e00\u4e9b\u4e34\u65f6\u7684\u6d4b\u8bd5\u8d44\u6e90\u63d0\u4ea4\u8fdb\u53bb\u4e86\uff0c\u6bd4\u5982\u6d4b\u8bd5\u4e86\u4e00\u4e2a\u5f71\u7247\uff0c\u6709\u4e9b\u540c\u5b66\u4e60\u60ef\u4f7f\u7528 git add . \uff0c\u7136\u540e\u5c31\u5168\u90e8\u63d0\u4ea4\u5230\u4ee3\u7801\u4ed3\u5e93\u4e86\uff0c\u8fd9\u6837\u5373\u4f7f\u540e\u671f\u628a\u5927\u6587\u4ef6\u5220\u4e86\uff0c.git \u6587\u4ef6\u91cc\u9762\u4e5f\u4f1a\u5f88\u5927\uff0c\u9020\u6210\u4ee3\u7801\u4ed3\u5e93\u53d8\u5f97\u5341\u5206\u81c3\u80bf\u3002 \u66f4\u591a\u7ec6\u8282\u67e5\u770b\uff1a\u300aAT\u7ecf\u9a8c\u603b\u7ed3\u300b"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/","title":"AT \u6267\u884c\u5668\u4f7f\u7528\u6307\u5317","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/5/25\n# Author : litao\n# =============================================\n Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1","title":"1\u3001\u529f\u80fd\u4ecb\u7ecd","text":" \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7cfb\u7edf\u8bed\u8a00\u8bbe\u7f6e\uff0c\u5206\u8fa8\u7387\u8bbe\u7f6e\u53ca\u7528\u4f8b\u6267\u884c\u73af\u5883\u642d\u5efa\uff1b \u652f\u6301 IP \u4e3a 15 \u7f51\u6bb5\u7684 AMD \u67b6\u6784\u6d4b\u8bd5\u673a\u955c\u50cf\u88c5\u673a\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u6307\u5b9a\u5e94\u7528\uff0c\u6307\u5b9a\u8303\u56f4\u6807\u7b7e\u7684\u7528\u4f8b\u6267\u884c\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u72b6\u6001\u68c0\u67e5\uff0c\u662f\u5426\u6709\u6b63\u5728\u8fd0\u884c\u7684\u6d4b\u8bd5\uff1b \u652f\u6301\u914d\u7f6e\u7528\u4f8b\u6267\u884c\u65f6\u957f\uff0c\u9632\u6b62\u4efb\u52a1\u963b\u585e\uff1b \u652f\u6301\u6839\u636e\u5e94\u7528\u7248\u672c\u81ea\u52a8\u67e5\u627e\u5bf9\u5e94\u7684\u7528\u4f8b tag\uff1b \u652f\u6301\u5f02\u5e38\u5904\u7406\u548c\u6d4b\u8bd5\u5b8c\u6210\u7684\u5b9e\u65f6\u6d88\u606f\u901a\u77e5\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2job","title":"2\u3001Job \u4ecb\u7ecd","text":"\u4ee5\u4e0b\u6309\u6267\u884c\u6d41\u7a0b\u7684\u987a\u5e8f\u4ecb\u7ecd\uff0c\u6bcf\u4e00\u6b65\u90fd\u53ef\u4ee5\u5355\u72ec\u6267\u884c\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1_1","title":"1\u3001\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/AT_test/ \u6574\u4e2a\u6d41\u7a0b\u7684\u4e3b\u5165\u53e3\uff0c\u901a\u8fc7\u8fd9\u4e2a\u5165\u53e3\uff0c\u8fde\u540c\u6574\u4e2a\u6d4b\u8bd5\u6d41\u7a0b\uff0c\u955c\u50cf\u88c5\u673a\uff0c\u73af\u5883\u90e8\u7f72\uff0c\u6d4b\u8bd5\u5e94\u7528\u53ca\u751f\u6210\u62a5\u544a\u3002 \u53c2\u6570\u4ecb\u7ecd\uff1a \u6d4b\u8bd5\u673a\uff1a\u6240\u6709\u89c4\u6574\u5230\u56fa\u5b9a\u533a\u57df\u7684\u6d4b\u8bd5\u673a\uff0c\u901a\u8fc7\u6d4b\u8bd5\u540c\u5b66\u5bf9\u6d4b\u8bd5\u673a\u7684\u4e60\u60ef\u547d\u540d\uff0c\u5728\u540e\u53f0\u6620\u5c04\u6d4b\u8bd5\u673a\u7684\u8be6\u7ec6\u4fe1\u606f\uff0c\u62ec\u53f7\u4e2d\u4e3a\u6d4b\u8bd5\u673a IP \u7684\u6700\u540e\u4e00\u4f4d\uff1b \u6d4b\u8bd5\u5e94\u7528\uff1a\u6307\u5b9a\u7684\u6d4b\u8bd5\u5e94\u7528\u7684\u5305\u540d\uff0c\u7cfb\u7edf\u6839\u636e\u540d\u79f0\u81ea\u52a8\u62c9\u53d6\u5bf9\u5e94\u7684\u4ed3\u5e93\u4ee3\u7801\uff1b deb\u5305\u4e0b\u8f7d\u5730\u5740\uff1a\u6d4b\u8bd5\u4e0a\u8ff0\u5e94\u7528\u65f6\uff0c\u9700\u8981\u5b89\u88c5\u7684deb\u5305\u4e0b\u8f7d\u5730\u5740\uff0c\u591a\u4e2a\u5730\u5740\u7528\u201c,\u201d\u9694\u5f00\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff1b \u8303\u56f4\u6807\u7b7e\uff1a\u6267\u884c\u6d4b\u8bd5\u7528\u4f8b\u7684\u6807\u7b7e\u8303\u56f4\uff0c\u5bf9\u5e94\u7528\u4f8b\u4ee3\u7801 csv \u6587\u4ef6\u4e2d\u7684\u6807\u7b7e\u4fe1\u606f\uff0c\u4ee5 pytest \u7684mark\u8bed\u6cd5\u7f16\u5199\uff1b \u7cfb\u7edf\u8bed\u8a00\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u8bed\u8a00\u73af\u5883\uff1b \u5206\u8fa8\u7387\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u5206\u8fa8\u7387\u73af\u5883\uff1b \u955c\u50cf\u5730\u5740\uff1a\u955c\u50cf\u4ed3\u5e93\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u901a\u8fc7 PXE \u88c5\u673a\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u88c5\u673a\u73af\u8282\uff08\u76ee\u524d\u4ec5\u652f\u6301\u90e8\u5206 AMD \u67b6\u6784\u7684\u88c5\u673a\uff09\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2pxe","title":"2\u3001PXE \u88c5\u673a","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/IOS_install/ \u8f93\u5165\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\uff0cIP\uff0c\u5bc6\u7801\uff0c\u955c\u50cf\u5730\u5740\u540e\uff0c\u81ea\u52a8\u88c5\u673a\uff0c\u76ee\u524d\u4ec5\u652f\u6301\u56fa\u5b9a 15 \u7f51\u6bb5\u7684\u90e8\u5206 AMD \u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#3","title":"3\u3001\u6b21\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/all_client_test/ \u8be5\u5165\u53e3\u4e0e\u4e3b\u5165\u53e3\u529f\u80fd\u57fa\u672c\u4e00\u81f4\uff0c\u53ea\u662f\u5265\u79bb\u4e86PXE\u88c5\u673a\u6d41\u7a0b\uff0c\u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7684\u6267\u884c\u6d41\u7a0b\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#4","title":"4\u3001\u73af\u5883\u90e8\u7f72","text":"Jenkins url\uff1ahttps://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/env/build?delay=0sec \u8bbe\u7f6e\u6d4b\u8bd5\u673a\u7684\u7cfb\u7edf\u8bed\u8a00\uff0c\u5206\u8fa8\u7387\u53ca\u5b89\u88c5\u6d4b\u8bd5\u6240\u9700\u7684\u4f9d\u8d56\u5305\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#5","title":"5\u3001\u53d1\u9001\u4ee3\u7801","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/send_code/ \u6839\u636e\u6d4b\u8bd5\u5e94\u7528\u540d\u79f0\uff0c\u62c9\u53d6\u5bf9\u5e94\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u5e76\u6839\u636e\u6d4b\u8bd5\u673a\u4e0a\u5e94\u7528\u7248\u672c\u5207\u6362\u5230\u5bf9\u5e94\u7684tag\u7248\u672c\uff0c\u82e5\u672a\u627e\u5230tag\u7248\u672c\uff0c\u5219\u4f7f\u7528\u6700\u65b0\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u518d\u6839\u636e\u5e94\u7528\u5e93\u4ee3\u7801\u4e2d\u914d\u7f6e\u7684\u57fa\u7840\u5e93\u7248\u672c\uff0c\u62c9\u53d6\u57fa\u7840\u5e93\u4ee3\u7801\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#6","title":"6\u3001\u7528\u4f8b\u6267\u884c","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/run_test/ \u8fd0\u884c\u6d4b\u8bd5\u673a\u4e0a\u7684\u7528\u4f8b"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/","title":"AT \u7528\u4f8b\u7b5b\u9009\u6307\u5317","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u7528\u4f8b\u7b5b\u9009\u6807\u51c6\uff0c\u662f\u6311\u9009\u5408\u9002\u7684\u6587\u672c\u7528\u4f8b\u8fdb\u884c\u81ea\u52a8\u5316\u7528\u4f8b\u8f6c\u5316\u7684\u4e00\u4e9b\u901a\u7528\u6807\u51c6\u3002 \u8fc7\u53bb\u6211\u4eec\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u5b9e\u8df5\u8fc7\u7a0b\u4e2d\uff0c\u5199\u4e86\u4e0d\u5c11\u81ea\u52a8\u5316\u7528\u4f8b\uff0c\u968f\u7740\u9700\u6c42\u7684\u8fed\u4ee3\uff0c\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u81ea\u7136\u8150\u5316\uff0c\u56e0\u800c\u9700\u8981\u5728\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\u5bf9\u81ea\u52a8\u5316\u7528\u4f8b\u8fdb\u884c\u7ef4\u62a4\uff0c\u5728\u7ef4\u62a4\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u6211\u4eec\u53d1\u73b0\uff0c\u6709\u4e9b\u7528\u4f8b\u7ef4\u62a4\u8d77\u6765\u592a\u96be\u4e86\uff0c\u8c03\u8bd5\u7528\u4f8b\u8017\u8d39\u5927\u91cf\u65f6\u95f4\uff0c\u6210\u672c\u5f88\u9ad8\u3002 \u56e0\u6b64\uff0c\u6211\u4eec\u603b\u7ed3\u4e00\u4e9b\u81ea\u52a8\u5316\u7528\u4f8b\u9009\u578b\u7684\u6807\u51c6\uff0c\u4ee5\u4f18\u5316\u540e\u7eed\u81ea\u52a8\u5316\u7528\u4f8b\u7ed3\u6784\uff0c\u671f\u5f85\u6211\u4eec\u80fd\u7f16\u5199\u51fa\u9ad8\u6548\u3001\u7a33\u5b9a\u3001\u6613\u4e8e\u7ef4\u62a4\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_1","title":"\u4e00\u3001\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u53ef\u4ee5\u5206\u4e3a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u548c\u4e13\u9879\u81ea\u52a8\u5316\u6d4b\u8bd5\uff0c\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e00\u822c\u53ea\u9488\u5bf9\u4e00\u4e9b\u5e38\u89c4\u7684\u529f\u80fd\u6d4b\u8bd5\uff0c\u5176\u4ed6\u975e\u5e38\u89c4\u529f\u80fd\u7684\u7528\u4f8b\uff0c\u5e94\u8be5\u91c7\u7528\u4e13\u9879\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u6848\uff1b \u4ee5\u4e0b\u662f\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1","title":"1. \u7a33\u5b9a\u6027\u3001\u538b\u6d4b\u7528\u4f8b","text":"\u7a33\u5b9a\u6027\u6d4b\u8bd5\u3001\u538b\u6d4b\u7528\u4f8b\u5e94\u8be5\u662f\u5c5e\u4e8e\u6027\u80fd\u76f8\u5173\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u5982\uff1a\u53cd\u590d\u591a\u6b21\u70b9\u51fb\u6309\u94ae\uff0c\u68c0\u9a8c\u5176\u529f\u80fd\u7a33\u5b9a\u6027\u3002\u56e0\u4e3a\u8fd9\u4e9b\u7528\u4f8b\u65ad\u8a00\u7684\u9884\u671f\u53ef\u80fd\u4e0d\u662f\u5f88\u660e\u786e\uff0c\u66f4\u6709\u751a\u8005\u4e0d\u9700\u8981\u65ad\u8a00\uff0c\u7528\u4f8b\u65f6\u957f\u6bd4\u8f83\u957f\uff0c\u800c\u4e14\u4e0d\u53ef\u63a7\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u76ee\u524d\u6211\u4eec\u6709\u6027\u80fd\u81ea\u52a8\u5316\u7684\u4e13\u9879\u65b9\u6848\uff0c\u4ee5\u53ca\u4e00\u4e9b\u7a33\u5b9a\u6027\u6d4b\u8bd5\u7684\u4e13\u9879\u65b9\u6848\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u6b64\u7c7b\u7528\u4f8b\u653e\u5230\u4e13\u9879\u81ea\u52a8\u5316\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2","title":"2. \u6d89\u53ca\u591a\u4e2a\u7528\u6237\u64cd\u4f5c","text":"\u5e38\u89c1\u4e0e\u6587\u7ba1\u7684\u7528\u4f8b\u4e2d\uff0c\u591a\u7528\u6237\u64cd\u4f5c\u7684\u7528\u4f8b\u4e00\u822c\u90fd\u4f1a\u6d89\u53ca\u5230\u5728\u7cfb\u7edf\u4e2d\u8fdb\u884c\u591a\u4e2a\u7528\u6237\u95f4\u7684\u5207\u6362\uff0c\u81ea\u52a8\u5316\u811a\u672c\u4e00\u822c\u662f\u8fd0\u884c\u5728\u4e00\u4e2a\u7528\u6237\u7a7a\u95f4\u4e0b\u7684\uff0c\u6240\u4ee5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u591a\u7528\u6237\u95f4\u7684\u5207\u6362\u3002 \u6b64\u7c7b\u4e0d\u5efa\u8bae\u91c7\u7528\u81ea\u52a8\u5316\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3","title":"3. \u4e0e\u5f00\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4ea4\u4e92","text":"\u6b64\u7c7b\u573a\u666f\u591a\u4e3a\u5e94\u7528\u7684\u5f02\u5e38\u573a\u666f\u6d4b\u8bd5\uff0c\u6bd4\u5982\uff1a\u590d\u5236\u5927\u6587\u4ef6\u8fc7\u7a0b\u4e2d\u6ce8\u9500\u673a\u5668\u3002 \u81ea\u52a8\u5316\u811a\u672c\u5728\u7cfb\u7edf\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4e4b\u540e\u662f\u4f1a\u505c\u6b62\u8fd0\u884c\u7684\uff1b\u6b64\u7c7b\u7528\u4f8b\u53ef\u4ee5\u505a\u81ea\u52a8\u5316\uff0c\u4f46\u662f\u540c\u6837\u9700\u8981\u505a\u4e13\u9879\u65b9\u6848\uff0c\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u7684\u5904\u7406\u903b\u8f91\u5b8c\u5168\u4e0d\u540c\u3002 \u540e\u7eed\u81ea\u52a8\u5316\u9700\u8981\u516c\u5173\u7684\u70b9\uff1a \u81ea\u52a8\u5316\u811a\u672c\u5728\u672c\u673a\u8fd0\u884c\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u81f3\u5c11\u9700\u8981\u63d0\u4f9b\u4ee5\u4e0b\u529f\u80fd\uff1a \u91cd\u542f\u4e4b\u540e\u7528\u4f8b\u80fd\u81ea\u52a8\u8fd0\u884c\uff1b\u53ef\u4ee5\u8003\u8651\u5c06\u6267\u884c\u7528\u4f8b\u5199\u6210\u4e00\u4e2a\u5f00\u673a\u81ea\u542f\u7684\u670d\u52a1\uff1b \u80fd\u8bb0\u5f55\u5173\u673a\u4e4b\u524d\u7528\u4f8b\u6267\u884c\u7684\u4f4d\u7f6e\uff0c\u91cd\u542f\u4e4b\u540e\u80fd\u4ece\u6b64\u4f4d\u7f6e\u5f00\u59cb\u6267\u884c\uff1b \u50cf\u6027\u80fd\u81ea\u52a8\u5316\u4e00\u6837\uff0c\u7531\u670d\u52a1\u7aef\u63a7\u5236\uff1b \u5b8c\u5168\u57fa\u4e8e\u56fe\u5f62\u8bc6\u522b\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u4e32\u53e3\u7ebf\u63a7\u5236\u952e\u9f20\u7a33\u5b9a\u6027\uff1b "},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4","title":"4. \u6d4b\u8bd5\u6267\u884c\u65f6\u95f4\u957f","text":"\u7528\u4f8b\u6267\u884c\u65f6\u95f4\u63a7\u5236\u57282\u5206\u949f\u4ee5\u5185\uff0c\u6781\u7aef\u60c5\u51b5\u4e0d\u8981\u8d85\u8fc75\u5206\u949f\uff0c\u6240\u6709\u7528\u4f8b\u7684\u5e73\u5747\u65f6\u957f\u5e94\u8be5\u57281\u5206\u949f\u5de6\u53f3\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u95f4\u592a\u957f\uff0c\u7f16\u5199\u7528\u4f8b\u3001\u8c03\u8bd5\u7528\u4f8b\u3001\u6267\u884c\u7528\u4f8b\u3001\u7ef4\u62a4\u7528\u4f8b\u90fd\u975e\u5e38\u7684\u8017\u65f6\uff0c\u4eba\u529b\u6210\u672c\u65f6\u95f4\u6210\u672c\u6295\u5165\u592a\u9ad8\u3002 \u4f60\u60f3\uff0c\u8fd9\u6761\u7528\u4f8b\u6267\u884c\u9700\u89815\u5206\u949f\uff0c\u90a3\u4f60\u5199\u8fd9\u6761\u7528\u4f8b\u7684\u65f6\u95f4\u4e0d\u53ef\u80fd\u4e00\u904d\u8fc7\uff0c\u5199\u7684\u8fc7\u7a0b\u4e2d\u8dd1\u4e0d\u901a\u8fd8\u5f97\u91cd\u8dd1\u81f3\u5c1115\u5206\u949f\u4e0d\u8fc7\u5206\uff0c\u5199\u5b8c\u4e86\u8fd8\u5f97\u5728\u5176\u4ed6\u67b6\u6784\u4e0a\u8c03\u8bd5\uff0c\u534a\u4e2a\u5c0f\u65f6\u8fc7\u53bb\u4e86\uff0c\u8fd9\u8fd8\u53ea\u662f\u7b2c\u4e00\u6b21\u5199\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u540e\u7eed\u5982\u679c\u7528\u4f8b\u7ef4\u62a4\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u7ecf\u5e38\u6295\u5165\u76f8\u5f53\u957f\u65f6\u95f4\uff0c\u8fd9\u6837\u5176\u5b9e\u662f\u5931\u53bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u7684\u3002\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u5c31\u5e94\u8be5\u662f\u5feb\u51c6\u72e0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5","title":"5. \u8fb9\u7f18\u6027\u6d4b\u8bd5","text":"\u6709\u4e9b\u529f\u80fd\u6a21\u5757\u672c\u8eab\u662f\u5c5e\u4e8e\u6bd4\u8f83\u8fb9\u7f18\u6027\u7684\uff0c\u5373\u6781\u5c11\u7528\u6237\u4f1a\u4f7f\u7528\u5230\u7684\u529f\u80fd\uff0c\u8fd9\u7c7b\u529f\u80fd\u6a21\u5757\u4e0d\u9700\u8981\u5927\u89c4\u6a21\u5b9e\u73b0\u81ea\u52a8\u5316\uff0c\u4e00\u4e24\u4e2a\u573a\u666f\u8986\u76d6\u57fa\u672c\u529f\u80fd\u5c31\u884c\u4e86\uff0c\u56e0\u6b64\u6211\u4eec\u5728\u6311\u9009\u6b64\u7c7b\u7528\u4f8b\u7684\u65f6\u5019\u53ef\u4ee5\u7ed3\u5408\u6574\u4e2a\u529f\u80fd\u6a21\u5757\u7684\u8986\u76d6\u60c5\u51b5\u6765\u51b3\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6","title":"6. \u9700\u8981\u4f9d\u8d56\u4eba\u5de5\u4ecb\u5165\u7684","text":"\u81ea\u52a8\u5316\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\u662f\u6ca1\u6709\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bd4\u5982\u8981\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u90a3\u4e48\u5c31\u80cc\u79bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u3002 \u6bd4\u5982\u5149\u9a71\u6a21\u5757\uff0c\u5149\u9a71\u523b\u5f55\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u4f46\u662f\u5149\u9a71\u523b\u5f55\u4e4b\u540e\u5149\u76d8\u4f1a\u5f39\u51fa\u6765\uff0c\u9700\u8981\u4eba\u5de5\u66f4\u6362\u5149\u76d8\uff0c\u518d\u624b\u52a8\u63a8\u8fdb\u5149\u9a71\u4e2d\u3002 \u8fd9\u79cd\u529f\u80fd\u6a21\u5757\u5373\u4f7f\u505a\u81ea\u52a8\u5316\uff0c\u80fd\u6d89\u53ca\u5230\u7684\u529f\u80fd\u975e\u5e38\u6709\u9650\uff0c\u800c\u4e14\u4e0d\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u6240\u4ee5\u660e\u663e\u5c31\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7","title":"7. \u96be\u4ee5\u5b9e\u73b0\u7684","text":"\u7528\u4f8b\u6240\u6d89\u53ca\u5230\u7684\u65b9\u6cd5\u5b9e\u73b0\u8d77\u6765\u53ef\u80fd\u6709\u96be\u5ea6\uff0c\u751a\u81f3\u73b0\u9636\u6bb5\u65e0\u6cd5\u5b9e\u73b0\u7684\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002 \u6bd4\u5982\u5f71\u9662\u6d4b\u8bd5\u753b\u9762\u6e05\u6670\u5ea6\u3001\u6d41\u7545\u5ea6\u3001\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u4e4b\u540e\u7684\u89c6\u9891\u662f\u5426\u5b58\u5728\u5361\u987f\u7b49\u7528\u4f8b\uff0c\u73b0\u9636\u6bb5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#8","title":"8. \u529f\u80fd\u4e0d\u7a33\u5b9a","text":"\u8fd9\u4e2a\u4e0d\u662f\u8bf4\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\uff0c\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\u4e0d\u7a33\u5b9a\u662f\u6b63\u5e38\u7684\uff0c\u8fd9\u79cd\u6211\u4eec\u53ef\u4ee5\u7b49\u5f00\u53d1\u63d0\u6d4b\u4e4b\u540e\u518d\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u3002 \u529f\u80fd\u4e0d\u7a33\u5b9a\u6307\u7684\u662f\u7528\u4f8b\u6240\u6d89\u53ca\u7684\u529f\u80fd\uff0c\u53ef\u80fd\u5b58\u5728\u591a\u79cd\u53d8\u5316\uff0c\u6bcf\u6b21\u6267\u884c\u7528\u4f8b\u53ef\u80fd\u65ad\u8a00\u7684\u9884\u671f\u90fd\u4e0d\u540c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#9","title":"9. \u52a8\u6001\u65ad\u8a00","text":"\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u76f4\u5230\u7528\u4f8b\u7ed3\u675f\uff0c\u4e00\u76f4\u662f\u4e00\u4e2a\u52a8\u6001\u53d8\u5316\u7684\u8fc7\u7a0b\uff0c\u800c\u4e14\u65e0\u6cd5\u901a\u8fc7\u5176\u4ed6\u624b\u6bb5\u505c\u4e0b\u6765\uff1b \u6bd4\u5982\uff1a\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u65f6\uff0c\u53f3\u4e0b\u89d2\u7684\u5f55\u5236\u65f6\u95f4\u662f\u4e00\u76f4\u5728\u53d8\u5316\u7684\uff0c\u7528\u4f8b\u9700\u8981\u6d4b\u8bd5\u5f55\u52361\u5206\u949f\u4e4b\u540e\uff0c\u5f55\u5236\u65f6\u95f4\u662f\u521a\u597d\u505c\u572860\u79d2\uff1b \u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fd8\u505a\u4e0d\u5230\u65f6\u95f4\u7cbe\u51c6\u63a7\u5236\uff0c\u7a0b\u5e8f\u6267\u884c\u65f6\u95f4\u662f\u6709\u6ce2\u52a8\u7684\uff0c\u800c\u4e14\u8981\u9002\u914d\u591a\u4e2a\u5e73\u53f0\uff0c\u6240\u4ee5\u6b64\u7c7b\u7528\u4f8b\u5927\u6982\u7387\u4f1a\u6267\u884c\u5931\u8d25\u3002\u7279\u522b\u662f\u5728\u6027\u80fd\u8f83\u5dee\u7684\u56fd\u4ea7\u5316\u67b6\u6784\u4e0a\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u592a\u53ef\u80fd\u7a33\u5b9a\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#10","title":"10. \u63a2\u7d22\u6027\u6d4b\u8bd5","text":"\u63a2\u7d22\u6027\u6d4b\u8bd5\u901a\u5e38\u662f\u4e00\u4e9b\u4e0d\u786e\u5b9a\u7684\u64cd\u4f5c\uff0c\u591a\u53d8\u5207\u590d\u6742\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u9884\u671f\u4e5f\u53ef\u80fd\u662f\u4e0d\u786e\u5b9a\u7684\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u9a9a\u64cd\u4f5c\u592a\u591a\u4e86\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6b64\u7c7b\u7528\u4f8b\u9002\u5408\u91c7\u7528\u624b\u5de5\u6d4b\u8bd5\uff0c\u662f\u624b\u5de5\u6d4b\u8bd5\u771f\u6b63\u7684\u4ef7\u503c\u4f53\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#11","title":"11. \u6613\u7528\u6027\u6d4b\u8bd5","text":"\u5bf9\u4e8e\u6613\u7528\u6027\u7684\u5224\u65ad\u901a\u5e38\u662f\u4e3b\u89c2\u7684\uff0c\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\u5f88\u96be\u53bb\u5b9a\u4e49\u4ec0\u4e48\u6837\u7684\u60c5\u51b5\u5bf9\u7528\u6237\u662f\u6613\u7528\u7684\uff0c\u81ea\u52a8\u5316\u9700\u8981\u6709\u660e\u786e\u7684\u53ef\u5b9e\u73b0\u7684\u9884\u671f\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_2","title":"\u4e8c\u3001\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u524d\u9762\u8bb2\u4e86\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u4e00\u4e9b\u7528\u4f8b\u60c5\u51b5\uff0c\u6709\u540c\u5b66\u5c31\u8bf4\u4e86\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\u4e0d\u7528\u8bb2\u4e86\uff0c\u5c31\u662f\u4e0d\u9002\u5408\u7684\u53cd\u9762\u3002\u6ca1\u6bdb\u75c5\u54c8\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\uff0c\u6211\u4eec\u5927\u4f53\u8fd8\u53ef\u4ee5\u5206\u4e3a\u4e24\u7c7b\uff1a \u7b2c\u4e00\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u597d\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u7b2c\u4e8c\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u4e00\u822c\uff0c\u9700\u8981\u6295\u5165\u66f4\u591a\u7cbe\u529b\u624d\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u4ee5\u4e0b\u4ecb\u7ecd\u4e00\u4e9b\u6211\u4eec\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1_1","title":"1. \u64cd\u4f5c\u76f8\u5bf9\u7b80\u5355","text":"\u7528\u4f8b\u6b65\u9aa4\u76f8\u5bf9\u8f83\u5c11\uff0c\u8fd9\u79cd\u7528\u4f8b\u901a\u5e38\u662f\u4e00\u4e9b\u8def\u5f84\u5f88\u6d45\u7684\u7528\u4f8b\uff0c\u4e00\u822c\u4e5f\u662f\u4e00\u4e9b\u57fa\u7840\u7528\u4f8b\u3002\u7528\u4f8b\u7f16\u5199\u3001\u7ef4\u62a4\u90fd\u53ef\u4ee5\u8f7b\u677e\u641e\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2_1","title":"2. \u5bb9\u6613\u5b9e\u73b0","text":"\u73b0\u6709\u6280\u672f\u662f\u53ef\u5b9e\u73b0\u7684\uff0c\u6ca1\u6709\u96be\u5ea6\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3_1","title":"3. \u7ecf\u5e38\u7528\u4e8e\u56de\u5f52\u6d4b\u8bd5","text":"\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bcf\u6b21\u56de\u5f52\u6d4b\u8bd5\u5fc5\u987b\u8981\u6267\u884c\u7684\u7528\u4f8b\uff0c\u90a3\u4e48\u8fd9\u6761\u7528\u4f8b\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u3002 \u56de\u5f52\u6d4b\u8bd5\u65f6\u6211\u4eec\u9996\u5148\u5e94\u8be5\u4fdd\u8bc1\u5e94\u7528\u5386\u53f2\u57fa\u672c\u529f\u80fd\u6b63\u5e38\uff0c\u6240\u4ee5\u90a3\u4e9b\u6bcf\u6b21\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u90fd\u8981\u6267\u884c\u7684\u7528\u4f8b\u9002\u5408\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4_1","title":"4. \u529f\u80fd\u7a33\u5b9a\u7684\u6838\u5fc3\u529f\u80fd","text":"\u6d89\u53ca\u6838\u5fc3\u529f\u80fd\u7684\u7528\u4f8b\u662f\u6700\u6700\u91cd\u8981\u7684\u7528\u4f8b\uff0c\u4e5f\u662f\u6211\u4eec\u4ea4\u4ed8\u65f6\u5fc5\u987b\u8981\u4fdd\u8bc1\u8d28\u91cf\u7684\u76f8\u5173\u529f\u80fd\uff0c\u56e0\u6b64\u5e94\u8be5\u5c3d\u53ef\u80fd\u7684\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5_1","title":"5. \u8f93\u5165\u6570\u636e\u6d4b\u8bd5","text":"\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u901a\u5e38\u662f\u68c0\u9a8c\u88ab\u6d4b\u5e94\u7528\u63a5\u53d7\u6709\u6548\u6570\u636e\u3001\u62d2\u7edd\u65e0\u6548\u6570\u636e\u7684\u80fd\u529b\u3002\u5982\uff1a\u63d0\u4ea4\u8d85\u957f\u5b57\u7b26\u4e32\u3001\u7279\u6b8a\u5b57\u7b26\u4e32\u7b49\u7b49\u3002 \u6b64\u7c7b\u7528\u4f8b\u624b\u5de5\u6d4b\u8bd5\u5f88\u96be\u6bd4\u8f83\u5168\u9762\u7684\u8986\u76d6\u5230\u6240\u6709\u7684\u8f93\u5165\u60c5\u51b5\uff0c\u4f46\u662f\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\uff0c\u6b64\u7c7b\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u90fd\u662f\u4e00\u6837\u7684\uff0c\u53d8\u5316\u7684\u4ec5\u662f\u8f93\u5165\u53c2\u6570\u548c\u65ad\u8a00\u7ed3\u679c\uff0c\u91c7\u7528\u6570\u636e\u9a71\u52a8\uff0c\u53ef\u4ee5\u8f7b\u677e\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6_1","title":"6. \u683c\u5f0f\u8986\u76d6","text":"\u539f\u56e0\u540c\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u7c7b\u7528\u4f8b\u4e00\u6837\uff0c\u591a\u79cd\u683c\u5f0f\u7684\u8986\u76d6\u4e5f\u662f\u4e00\u4e2a\u5f88\u7e41\u7410\u7684\u4e8b\u60c5\uff0c\u4ea4\u7ed9\u81ea\u52a8\u5316\u6765\u505a\u518d\u5408\u9002\u4e0d\u8fc7\u4e86\u3002 \u6bd4\u5982\u5f71\u9662\u5bf9\u5f71\u7247\u683c\u5f0f\u7684\u68c0\u67e5\u3001\u622a\u56fe\u5f55\u5c4f\u5bf9\u4fdd\u5b58\u683c\u5f0f\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7_1","title":"7. \u68c0\u67e5\u5143\u7d20\u72b6\u6001","text":"\u67e5\u770b\u88ab\u6d4b\u5e94\u7528\u7684\u5143\u7d20\u5c5e\u6027\u3002\u5982\uff1a\u56fe\u7247\u7684\u5927\u5c0f\u548c\u6392\u5217\uff1b\u6309\u94ae\u7684\u53ef\u7528\u548c\u4e0d\u53ef\u7528\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/","title":"AT \u7ecf\u9a8c\u603b\u7ed3","text":"\u6b22\u8fce\u6240\u6709\u4eba\u63d0\u4ea4\u4f60\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u9762\u7684\u4f18\u79c0\u5b9e\u8df5\u7ecf\u9a8c\uff0c\u4ee5\u5e2e\u52a9\u5927\u5bb6\u89e3\u51b3\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#1","title":"1\u3001\u7ec8\u7ed3\u5668","text":"# litaoa@uniontech.com\n \u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4 pytest \u5b9e\u73b0\u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4\u7684\u65b9\u5f0f\u6709\u4e24\u79cd\uff0cyield \u548c\u7ec8\u7ed3\u51fd\u6570\uff1b yield \u5b9e\u73b0\uff0cyield\u524d\u9762\u4e3a\u7528\u4f8b\u7684\u524d\u7f6e\u6b65\u9aa4\uff0cyield \u540e\u9762\u4e3a\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4\u3002 @pytest.fixture\ndef clean_env():\nprint(\"setup\")\nyield\nprint(\"teardown\")\n \u7ec8\u7ed3\u51fd\u6570\u5b9e\u73b0\uff0c\u4f7f\u7528 request.addfinalizer \u6ce8\u518c\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4 @pytest.fixture\ndef clean_env(request):\ndef clean():\nprint(\"teardown\")\nrequest.addfinalizer(clean)\nprint(\"setup\")\n yield\u7684\u4f18\u7f3a\u70b9\uff1a \u4f18\u70b9\uff1a\u4ee3\u7801\u7b80\u6d01\uff0c\u76f4\u89c2\uff0c\u53ef\u4f7f\u7528yield\u5728\u7528\u4f8b\u4e2d\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c \u7f3a\u70b9\uff1a\u82e5\u524d\u7f6e\u6b65\u9aa4\u4e2d\u51fa\u73b0\u9519\u8bef\uff0c\u5219\u540e\u7f6e\u6b65\u9aa4\u4e0d\u4f1a\u6267\u884c \u7ec8\u7ed3\u51fd\u6570\uff1a \u4f18\u70b9\uff1a\u524d\u7f6e\u6b65\u9aa4\u5931\u8d25\u7684\u8bdd\uff0c\u540e\u7f6e\u6b65\u9aa4\u4ecd\u4f1a\u6267\u884c\u4e14\u53ef\u4ee5\u6ce8\u518c\u591a\u4e2a\u540e\u7f6e\u6b65\u9aa4\uff08\u524d\u63d0\uff1a\u9700\u8981\u5728\u4ee3\u7801\u62a5\u9519\u4e4b\u524d\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff09\uff0c\u652f\u6301\u7075\u6d3b\u4f7f\u7528\u540e\u7f6e\u6761\u4ef6 \u7f3a\u70b9\uff1a\u4ee3\u7801\u8f83\u4e3a\u590d\u6742\uff0c\u65e0\u6cd5\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c\uff08\u672c\u4eba\u76ee\u524d\u672a\u5b9e\u73b0\uff09 \u603b\u7ed3\uff1a\u5728\u524d\u7f6e\u6b65\u9aa4\u4fdd\u8bc1\u7edd\u5bf9\u4e0d\u4f1a\u51fa\u9519\u65f6\uff0c\u4f7f\u7528yield\u66f4\u4f73\u7b80\u4fbf\uff0c\u5f53\u524d\u7f6e\u6b65\u9aa4\u6613\u51fa\u73b0\u95ee\u9898\u65f6\uff0c\u63a8\u8350\u4f7f\u7528\u7ec8\u7ed3\u51fd\u6570\u3002 \u573a\u666f\uff1a\u4fdd\u9669\u7bb1\u7528\u4f8b\uff0c\u524d\u7f6e\u6b65\u9aa4\u4e2d\u5f00\u542f\u4fdd\u9669\u7bb1\uff0c\u540e\u7f6e\u6b65\u9aa4\u5220\u9664\u4fdd\u9669\u7bb1\u3002 @pytest.fixture(scope=\"session\", autouse=True)\ndef vault_fixture(request):\nDfmWidget.reset_vault_by_cmd() # 1\u3001\u91cd\u7f6e\u4fdd\u9669\u7bb1\nDdeDockPublicWidget().close_file_manager_by_cmd() # 2\u3001\u5173\u95ed\u6587\u7ba1\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 3\u3001\u5f00\u542f\u6587\u7ba1\nvault = DfmWidget()\nvault.create_file_vault() # 4\u3001\u521b\u5efa\u4fdd\u9669\u7bb1\ndef delete_vault(): # 8\u3001\u5220\u9664\u4fdd\u9669\u7bb1\u7684\u540e\u7f6e\u6b65\u9aa4\nsleep(2)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr()\nvault = DfmWidget()\nvault.delete_file_vault()\nDfmWidget.reset_vault_by_cmd()\nDdeDockPublicWidget().close_file_manager_by_cmd()\nrequest.addfinalizer(delete_vault) # 5\u3001\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\nDdeDockPublicWidget().close_file_manager_by_cmd() # 6\u3001\u5173\u95ed\u6587\u7ba1\nsleep(1)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 7\u3001\u5f00\u542f\u6587\u7ba1\n \u4ee3\u7801\u6309\u6ce8\u91ca\u4e2d\u7684\u5e8f\u53f7\u6267\u884c\u6b65\u9aa4 \u4ee3\u7801\u5728\u6b65\u9aa41-4\u4efb\u610f\u4f4d\u7f6e\u62a5\u9519\uff0c\u5219\u4e0d\u4f1a\u6267\u884c\u6b65\u9aa48\uff0c\u56e0\u4e3a\u672a\u6267\u884c\u5230\u6b65\u9aa45\uff0c\u6b65\u9aa48\u8fd8\u672a\u6ce8\u518c \u4ee3\u7801\u5728\u6b65\u9aa46-7\u62a5\u9519\uff0c\u4ecd\u4f1a\u6267\u884c\u6b65\u9aa47\uff0c\u56e0\u4e3a\u5728\u6b65\u9aa45\u4e2d\u5df2\u7ecf\u5c06\u6b65\u9aa47\u6ce8\u518c \u53ef\u4ee5\u7075\u6d3b\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff0c\u80fd\u5b9e\u73b0\u67d0\u4e2a\u524d\u7f6e\u6b65\u9aa4\u6267\u884c\u4e4b\u540e\uff0c\u624d\u4f1a\u6267\u884c\u540e\u7f6e\u6b65\u9aa4\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#2","title":"2\u3001\u542f\u52a8\u5e94\u7528\u7684\u65b9\u5f0f","text":"# huangmingqiang@uniontech.com\n \uff081\uff09\u547d\u4ee4\u884c\u542f\u52a8 \u5728 AT \u4ee3\u7801\u4e2d\u4f7f\u7528\u547d\u4ee4\u884c\u542f\u52a8\u5e94\u7528\uff0c\u4e3e\u4f8b\uff1a os.popen(\"deepin-music\")\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f7f\u7528 ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6\uff0cdogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u3002 \uff082\uff09\u901a\u8fc7 UI \u64cd\u4f5c\u542f\u52a8 \u901a\u8fc7\u4efb\u52a1\u680f\u3001\u542f\u52a8\u5668\u3001\u684c\u9762\u7b49UI\u65b9\u5f0f\u542f\u52a8\uff0c\u6bd4\u5982\u53cc\u51fb\u6253\u5f00\u3001\u53f3\u952e\u6253\u5f00\u7b49\uff0c\u8fd9\u79cd\u64cd\u4f5c\u65b9\u5f0f\u4e0d\u5b58\u5728ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6dogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u7684\u95ee\u9898\uff0c\u4e5f\u66f4\u52a0\u7b26\u5408\u7528\u6237\u7684\u64cd\u4f5c\u884c\u4e3a\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#3","title":"3\u3001\u6587\u4ef6\u9009\u62e9\u6846\u5c5e\u6027\u5b9a\u4f4d\u5076\u73b0\u65e0\u6cd5\u627e\u5230","text":"\u6587\u4ef6\u9009\u62e9\u6846\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5728\u8c03\u7528\u6587\u4ef6\u9009\u62e9\u6846\u65f6\uff0c\u6709\u4e00\u5b9a\u7684\u6982\u7387\u51fa\u73b0\uff0c\u754c\u9762\u5df2\u7ecf\u6e32\u67d3\u51fa\u6765\u4e86\uff0c\u4f46\u662f\u5c5e\u6027\u6811\u5e76\u6ca1\u6709\u5199\u5165\uff0c\u5bfc\u81f4\u901a\u8fc7\u5c5e\u6027\u65e0\u6cd5\u627e\u5230\u5143\u7d20\uff0c\u76ee\u524d\u4e5f\u6ca1\u6709\u5f88\u597d\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u4e3a\u4e86\u7528\u4f8b\u7a33\u5b9a\u6027\uff0c\u6587\u4ef6\u9009\u62e9\u6846\u7684\u64cd\u4f5c\u5efa\u8bae\u4f7f\u7528UI\u6216\u8005\u56fe\u7247\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u53ef\u4ee5\u901a\u8fc7\u641c\u7d22\u5185\u5bb9\u56fa\u5b9a\u6587\u4ef6\u4f4d\u7f6e\u3002 # litaoa@uniontech.com\n desk = DdeDesktopPublicWidget()\n# \u9009\u62e9\u89c6\u9891\u76ee\u5f55\ndesk.click_videos_dir_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.ctrl_f()\nsleep(1)\ndesk.input_message(\"\u5143\u7d20\u540d\u79f0\")\nsleep(0.5)\ndesk.enter()\nsleep(1)\n# \u9009\u62e9\u7b2c\u4e00\u4e2a\u6587\u4ef6\ndesk.click_list_view_btn_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.click_first_file_in_desktop_plugs_by_ui()\nsleep(1)\n# \u6587\u7ba1\u63d2\u4ef6\u4e2d\u70b9\u51fb\u6253\u5f00\ndesk.click_open_btn_in_desktop_plugs_by_ui()\n"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#4","title":"4\u3001\u5e94\u7528\u542f\u52a8","text":"# mikigo\n \u5728UI\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u4e00\u5207\u64cd\u4f5c\u7684\u90fd\u662f\u4ece\u5e94\u7528\u542f\u52a8\u5f00\u59cb\u7684\uff0c\u800c\u5728Linux\u684c\u9762\u5e94\u7528\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u6211\u4eec\u542f\u52a8\u5e94\u7528\u7684\u65b9\u6cd5\u6709\u591a\u79cd\uff0c\u4e0b\u9762\u505a\u4e00\u4e2a\u7b80\u5355\u7684\u4ecb\u7ecd\uff1a \u3010\u4f7f\u7528dogtail\u542f\u52a8\u3011 dogtail\u63d0\u4f9b\u4e86\u5e94\u7528\u542f\u52a8\u7684\u65b9\u6cd5\uff0c\u5728utils\u5e93\u4e2d\uff0c\u4f7f\u7528run\u65b9\u6cd5\u542f\u52a8\uff1a \u9996\u5148\u5bfc\u5165\u65b9\u6cd5\uff1a from dogtail.utils import *\n \u8c03\u7528run\u65b9\u6cd5 run('deepin-music')\n \u5373\u53ef\u542f\u52a8\u97f3\u4e50 \u8fd9\u79cd\u65b9\u6cd5\u7684\u4f18\u70b9\u662f\u91c7\u7528\u8fdb\u7a0b\u7684\u65b9\u5f0f\u76f4\u63a5\u542f\u52a8\uff0c\u4e0d\u4f9d\u8d56\u4e0eUI\uff0c\u65e0\u8bba\u684c\u9762\u6216\u4efb\u52a1\u680f\u4e0a\u662f\u5426\u5b58\u5728\u5e94\u7528\u56fe\u6807\uff0c\u90fd\u53ef\u4ee5\u6b63\u5e38\u542f\u52a8\u3002 \u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c \u5982\u679c\u4f7f\u7528ssh\u8fdc\u7a0b\u8c03\u7528\uff0c\u6216\u8005Jenkins\u4e2d\u6267\u884c\u6d4b\u8bd5\u811a\u672c\u7684\u65f6\u5019\uff0c\u5728sniff\u4e2d\u4f1a\u51fa\u73b0\u627e\u4e0d\u5230\u5e94\u7528\uff0c\u7ecf\u8fc7\u5206\u6790\uff0c\u53ef\u80fd\u662f\u56e0\u4e3a\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\u542f\u52a8\u7684\u65f6\u5019\uff0c\u5b9e\u9645\u662f\u91c7\u7528\u4e00\u4e2a\u5b50\u8fdb\u7a0b\u542f\u52a8\u4e86\u5e94\u7528\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u5230\u3002 \u3010\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u3011 \u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807 \u901a\u5e38\u6709\u4e24\u79cd\u65b9\u6cd5\uff1a \uff081\uff09\u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807\u3002 \uff082\uff09\u5df2\u77e5\u5e94\u7528\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u7684\u4f4d\u7f6e\uff0c\u7136\u540e\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u5bf9\u5e94\u5750\u6807\u3002 \u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u7f3a\u70b9\u662f\u4f4d\u7f6e\u5fc5\u987b\u56fa\u5b9a\uff0c\u5982\u679c\u79fb\u52a8\u4f4d\u7f6e\u5c31\u4e0d\u884c\u4e86\uff0c\u800c\u4f7f\u7528\u7b2c\u4e00\u79cd\u65b9\u6cd5\uff0c\u65e0\u8bba\u4f4d\u7f6e\u5728\u54ea\u91cc\uff0c\u53ea\u8981\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u5b58\u5728\u5373\u53ef\u3002 \u3010\u70b9\u51fb\u684c\u9762\u56fe\u6807\u542f\u52a8\u3011 \u684c\u9762\u56fe\u6807\u76ee\u524d\u662f\u91c7\u7528\u56fe\u50cf\u8bc6\u522b\u6280\u672f\uff0c\u5b9a\u4f4d\u5230\u5e94\u7528\u56fe\u6807\u7684\u5750\u6807\uff0c\u7136\u540e\u901a\u8fc7pyauogui\u8fdb\u884c\u70b9\u51fb\u64cd\u4f5c\u3002 \u8be6\u7ec6\u6280\u672f\u65b9\u6848\u53ef\u4ee5\u53c2\u8003\u6211\u7684\u53e6\u5916\u4e24\u7bc7\u535a\u5ba2: \u57fa\u4e8eopencv\u7684\u6a21\u677f\u5339\u914d\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd4\u56de\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 Python\u4e09\u65b9\u5e93PyAutoGui\u7684\u4f7f\u7528\u65b9\u6cd5 \u3010\u4ece\u542f\u52a8\u5668\u542f\u52a8\uff08\u4fd7\u79f0\u5f00\u59cb\u83dc\u5355\uff09\u3011 \u542f\u52a8\u4e2d\u542f\u52a8\u7684\u5b9e\u73b0\u903b\u8f91\u5b9e\u9645\u548c\u4efb\u52a1\u680f\u4e0a\u542f\u52a8\u5dee\u4e0d\u591a\u3002 \u9996\u5148\uff0c\u9700\u8981\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u542f\u52a8\u5668\u56fe\u6807\uff0c\u6216\u8005\u952e\u76d8super\u952e\uff0c\u5c06\u542f\u52a8\u5668\u547c\u51fa\u6765\uff0c \u7136\u540e\uff0c\u5728\u542f\u52a8\u5668\u4e2d\u70b9\u51fb\u5bf9\u5e94\u7684\u56fe\u6807\uff0c \u4f46\u662f\u8fd9\u91cc\u6709\u4e2a\u95ee\u9898\uff0c\u542f\u52a8\u5668\u4e2d\u7684\u5e94\u7528\u5217\u8868\uff0c\u4e00\u9875\u5c55\u793a\u4e0d\u5b8c\uff0c\u6240\u4ee5\u5982\u679c\u6211\u4eec\u8981\u70b9\u51fb\u7684\u5e94\u7528\u56fe\u6807\u4e0d\u5728\u7b2c\u4e00\u9875\u600e\u4e48\u529e\uff0c\u901a\u5e38\u89e3\u51b3\u65b9\u6848\u6709\u4e24\u79cd\uff1a \uff081\uff09\u9700\u8981\u8fdb\u884c\u5411\u4e0b\u6ed1\u52a8\uff0c\u8fd9\u91cc\u5c31\u6d89\u53ca\u5230\u76f8\u5e94\u7684\u8bc6\u522b\u65b9\u6848\uff0c\u5224\u65ad\u5982\u679c\u4e0d\u5728\u7b2c\u4e00\u9875\u5c31\u5f80\u4e0b\u6ed1\u52a8\u7ffb\u9875\u3002 \uff082\uff09\u542f\u52a8\u5668\u63d0\u4f9b\u641c\u7d22\u7684\u529f\u80fd\uff0c\u8f93\u5165\u5e94\u7528\u540d\u79f0\u641c\u7d22\uff0c\u7136\u540e\u8fdb\u884c\u70b9\u51fb\u3002 \u4ece\u5b9e\u9645\u64cd\u4f5c\u4e2d\u6765\u770b\uff0c\u91c7\u7528\u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u6548\u7387\u4f1a\u9ad8\u4e00\u70b9\u3002 \u3010\u7ec8\u7aef\u547d\u4ee4\u542f\u52a8\u3011 \u5728python\u4e2d\uff0c\u4f7f\u7528os.popen()\u6216os.system()\u6216\u8005subprocess.Popen()\uff0c\u5b9e\u73b0\u547d\u4ee4\u884c\u542f\u52a8\uff0c\u6bd4\u5982\uff1a import os\nos.popen('deepin-music')\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u8fdc\u7a0b\u6267\u884c\u811a\u672c\u7684\u65f6\u5019\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u7684\u95ee\u9898\u3002 \u3010\u603b\u7ed3\u3011 \u4ee5\u4e0a\u51e0\u79cd\u65b9\u6cd5\uff0c\u5404\u6709\u4f18\u7f3a\u70b9\uff0c\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff1a \uff081\uff09\u5982\u679c\u9700\u8981\u5728Jenkins\u4e2d\u505a\u6301\u7eed\u96c6\u6210\uff0c\u5efa\u8bae\u4f7f\u7528\u7b2c\u4e8c\u79cd\u4efb\u52a1\u680f\u542f\u52a8\u7684\u65b9\u6cd5\u3002 \uff082\uff09\u5982\u679c\u4e0d\u4f1a\u91c7\u7528\u8fdc\u7a0b\u6267\u884c\u7684\uff0c\u5efa\u8bae\u91c7\u7528\u7b2c\u4e00\u79cd\u6216\u8005\u6700\u540e\u4e00\u79cd\u65b9\u6848\u3002 \uff083\uff09\u7b2c\u4e09\u79cd\u548c\u7b2c\u56db\u79cd\u542f\u52a8\u65b9\u6cd5\uff0c\u901a\u5e38\u5728\u6d4b\u8bd5\u7528\u4f8b\u4e2d\u4f1a\u6d89\u53ca\u5230\uff0c\u6240\u4ee5\u5076\u5c14\u4f1a\u7528\u3002"},{"location":"RELEASE/","title":"\u7248\u672c\u66f4\u65b0\u8bb0\u5f55","text":""},{"location":"RELEASE/#220202395","title":"2.2.0\uff082023/9/5\uff09","text":"new \u6b63\u5f0f\u542f\u7528 letmego \u6280\u672f\u65b9\u6848\uff1b fix \u5bf9 docs \u91cc\u9762\u7ec6\u5316\u4e86\u8fdc\u7a0b\u6267\u884c\u7ae0\u8282\u7684\u63cf\u8ff0\uff1b "},{"location":"RELEASE/#2152023831","title":"2.1.5\uff082023/8/31\uff09","text":"new \u5c06\u6709\u8da3\u7684\u6587\u6863\u7cfb\u7edf\u8fc1\u79fb\u5230 linuxdeepin \uff0c\u5265\u79bb\u6587\u6863\u4e2d\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u91c7\u7528 CDN \u52a0\u901f\u65b9\u5f0f\u52a0\u8f7d\uff1b \u5c1d\u8bd5\u5408\u5165\u4e00\u4e2a\u6709\u8da3\u7684\u529f\u80fd\uff1b fix \u4fee\u590d\u4e86 Wayland \u952e\u9f20\u5de5\u5177\u6ca1\u6709\u9f20\u6807\u76f8\u5bf9\u79fb\u52a8\u65b9\u6cd5 moveRel \u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 Wayland \u4e0b\u83b7\u53d6\u7a97\u53e3\u4fe1\u606f\u529f\u80fd\u6a21\u5757\u4e2d\u73af\u5883\u53d8\u91cf\u7684\u95ee\u9898\uff1b \u4f18\u5316\u4e86 startproject \u529f\u80fd\u7684\u4e00\u4e9b\u4fe1\u606f\u8f93\u51fa\uff1b \u4fee\u590d\u4e86\u7279\u6b8a\u573a\u666f\u4e0b env_dev.sh \u5f00\u53d1\u73af\u5883\u90e8\u7f72\u662f\u53ef\u80fd\u5f71\u54cd\u5230\u6b63\u5f0f\u73af\u5883 env.sh \u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#2122023822","title":"2.1.2\uff082023/8/22\uff09","text":"new \u589e\u52a0 OCR \u8bc6\u522b\u81ea\u52a8\u91cd\u8bd5\u673a\u5236\uff0c\u9ed8\u8ba4\u91cd\u8bd5 2 \u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u91cd\u8bd5\u6b21\u6570\uff1b \u4f7f\u7528\u7a97\u7ba1\u6700\u65b0\u63d0\u4f9b\u7684\u4e8c\u8fdb\u5236\u63a5\u53e3\uff0c\u4f18\u5316\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u5728 Wayland \u4e0b\u83b7\u53d6\u7a97\u53e3\u4fe1\u606f\u7684\u65b9\u6cd5\uff1b\u611f\u8c22\u684c\u9762\u6d4b\u8bd5\u90e8 @\u4f55\u6743 @\u5b59\u7fe0 \u3001\u7a97\u7ba1\u7814\u53d1 @\u9ec4\u6cfd\u94ed \u7684\u5927\u529b\u652f\u6301\u3002 \u6269\u5145 skipif \u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\u51fd\u6570\uff1a skipif_xdg_type \u652f\u6301 x11 \u6216 wayland \u4e0a\u8df3\u8fc7\uff1b skipif_cpu_name \u652f\u6301\u4e0d\u540c cpu \u4e0a\u8df3\u8fc7\uff0c\u6bd4\u5982\uff1askipif_cpu_name-KLVVW5821\uff1b "},{"location":"RELEASE/#2102023818","title":"2.1.0\uff082023/8/18\uff09","text":"fix \u4fee\u590d SW \u67b6\u6784\u73af\u5883\u4f9d\u8d56\u7684\u95ee\u9898\uff0c\u539f\u56e0\u662f\u4e4b\u524d\u6211\u8fd9\u91cc\u672c\u5730\u6ca1\u6709 SW \u7684\u673a\u5668\uff0c\u6ca1\u6709\u505a\u76f8\u5173\u9002\u914d\uff1b \u4fee\u590d\u5b50\u9879\u76ee\u5355\u72ec\u9700\u8981\u4e09\u65b9\u5305 pexpect\uff0c\u7531\u4e8e\u4e4b\u524d\u662f\u9884\u88c5\u5230\u955c\u50cf\u91cc\u9762\u7684\uff0c\u4f46\u57fa\u7840\u6846\u67b6\u4e0d\u9700\u8981\uff0c\u56e0\u6b64\u6ca1\u6709\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u91cc\u9762\uff0c\u5bfc\u81f4\u5b50\u9879\u76ee\u4f9d\u8d56\u62a5\u9519\u3002 \u4fee\u590d\u5b50\u9879\u76ee cv \u5bfc\u5165\u62a5\u9519\u7684\u95ee\u9898\uff1b \u539f\u56e0\u4e3a\uff1ayouqu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u517c\u5bb9\u4e24\u79cd\u60c5\u51b5\uff0c\u4e00\u79cd\u662f\u9762\u5411\u670d\u52a1\uff0c\u5c31\u662f\u672c\u5730\u6d4b\u8bd5\u673a\u4e0d\u9700\u8981\u5b89\u88c5 OpenCV\uff0c\u7528\u4f8b\u4e2d\u7684\u56fe\u50cf\u8bc6\u522b\u4f1a\u901a\u8fc7\u8fdc\u7a0b\u670d\u52a1\u63a5\u53e3\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u548c\u7ed3\u679c\u83b7\u53d6\uff1b\u7b2c\u4e8c\u79cd\u662f\u539f\u751f\uff0c\u5c31\u662f\u672c\u5730\u76f4\u63a5\u5b89\u88c5 OpenCV \u76f4\u63a5\u7528\u3002\u4e24\u4e2a\u60c5\u51b5\u7684\u4f18\u5148\u7ea7\u662f\u4f18\u5148\u5224\u65ad\u672c\u5730\u5b58\u5728\uff0c\u5426\u5219\u8d70\u670d\u52a1\u3002 \u524d\u9762\u6211\u4eec\u5df2\u7ecf\u628a OCR \u529f\u80fd\u505a\u4e86\u670d\u52a1\u5316\uff0c\u57fa\u4e8e 1 \u5e74\u591a\u4ee5\u6765\u7684\u89c2\u5bdf\uff0c\u7528\u8d77\u6765\u5f88\u7a33\u5b9a\uff0c\u518d\u4e00\u4e2a\u5c31\u662f OpenCV \u5b89\u88c5\u5305\u662f\u6bd4\u8f83\u81c3\u80bf\u7684\uff0c\u7c97\u7565\u6570\u4e86\u4e0b\u4f9d\u8d56\u6709 30+ \u4e2a\uff0c\u800c\u4e14\u5728\u5404\u67b6\u6784\u4e0a\u4f9d\u8d56\u5305\u8fd8\u4e0d\u5c3d\u76f8\u540c\uff0c\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u65b9\u6848\u4e2d\u4e0d\u592a\u597d\u5904\u7406\uff0c\u6240\u4ee5\u672c\u6b21 2.0 \u7248\u672c\u6211\u4eec\u5927\u80c6\u7684\u5c06\u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u529f\u80fd\u4fee\u6539\u4e3a\u9762\u5411\u670d\u52a1\u7684\u65b9\u5f0f\uff0c\u524d\u671f\u6d4b\u8bd5\u4e00\u5207\u770b\u8d77\u6765\u90fd\u5f88\u548c\u8c10\u3002 \u4f46\u662f\u6ca1\u6ce8\u610f\u5230\u4e4b\u524d\u7ed9\u6d77\u71d5\u59d0\u90a3\u8fb9\u9879\u76ee\u5355\u72ec\u5b9a\u5236\u505a\u4e86\u4e2a\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\uff08\u4e3a\u4e86\u80fd\u7b80\u5355\u5e73\u6ed1\u7684\u8fc1\u79fb\u5230 youqu\uff09\uff0c\u6b64\u63a5\u53e3\u5e95\u5c42\u6ca1\u6709\u517c\u5bb9\u670d\u52a1\u5316\uff0c\u6240\u4ee5\u5979\u90a3\u8fb9\u7684\u9879\u76ee\u8c03\u7528\u6b64\u5b9a\u5236\u63a5\u53e3\u4f1a\u62a5 cv \u5bfc\u5165\u7684\u95ee\u9898\u3002 \u7531\u4e8e\u5c06\u8fd9\u4e2a\u5b9a\u5236\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\u8fdb\u884c\u670d\u52a1\u5316\u517c\u5bb9\u6539\u9020\u9700\u8981\u4e00\u5b9a\u65f6\u95f4\uff0c\u6539\u5b8c\u8fd8\u9700\u8981\u6d4b\u8bd5\uff0c\u4f46\u672c\u6b21\u65f6\u95f4\u6bd4\u8f83\u7d27\uff0c\u56e0\u6b64\u5148\u628a OpenCV \u88c5\u8fdb\u865a\u62df\u73af\u5883\uff0c\u540e\u7eed\u7248\u672c\u518d\u8003\u8651\u9488\u5bf9\u6b64\u63a5\u53e3\u505a\u4fee\u6539\u3002"},{"location":"RELEASE/#2002023816","title":"2.0.0\uff082023/8/16\uff09","text":"YouQu\uff08\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff09\u5f00\u6e90\u4e86\uff0c\u540c\u65f6\u63a8\u51fa\u4e86 2.0 \u7248\u672c\u3002 \u611f\u8c22\u738b\u6ce2\u603b\u3001\u67b6\u6784\u5e08\u5f90\u5c0f\u4e1c\u3001\u7814\u53d1\u7ecf\u7406\u90d1\u5e7c\u6208\u3001\u5218\u90d1\u7b49\u7814\u53d1\u540c\u4e8b\u7684\u5927\u529b\u652f\u6301\u3002 new 1\u3001\u65b0\u7684\u57fa\u7840\u6846\u67b6\u4ee3\u7801\u83b7\u53d6\u65b9\u5f0f\u53ca\u65b0\u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4 YouQu \u540e\u7eed\u5747\u901a\u8fc7 PyPI \u8fdb\u884c\u5305\u7684\u53d1\u5e03\uff0c\u4e5f\u5c31\u662f\u8bf4\u540e\u7eed\u53ef\u4ee5\u4f7f\u7528 pip \u8fdb\u884c\u5b89\u88c5\uff1a sudo pip3 install youqu==2.0.0\n \u8fd9\u91cc\u6709 2 \u4e2a\u5c0f\u70b9\u8981\u6ce8\u610f\uff1a \u63a8\u8350\u4f7f\u7528 sudo pip3 \uff08\u52a0 sudo\uff09\u8fdb\u884c\u5b89\u88c5\uff1b \u5982\u679c\u4e0d\u52a0 sudo \u6709\u4e9b\u673a\u5668\u53ef\u80fd $HOME/.local/bin \u4e0d\u5728\u7cfb\u7edf PATH \u73af\u5883\u76ee\u5f55\u4e0b\uff0c\u5728\u4e0d\u6dfb\u52a0\u73af\u5883\u53d8\u91cf\u7684\u60c5\u51b5\u4e0b\uff0c\u4f1a\u51fa\u73b0 YouQu \u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4\uff08youqu-startproject\uff09\u65e0\u6cd5\u4f7f\u7528\u7684\u95ee\u9898\uff1b \u5f53\u7136\uff0c\u5c06\u4e0a\u8ff0\u8def\u5f84\u6dfb\u52a0\u5230\u73af\u5883\u53d8\u91cf\u4e4b\u540e\u4e5f\u662f\u53ef\u4ee5\u7528\u7684\uff0c\u6240\u4ee5\u6211\u8fd9\u91cc\u662f\u63a8\u8350\u52a0 sudo\uff0c\u4e0d\u52a0 sudo \u4e5f\u662f\u53ef\u4ee5\u7684\uff0c\u53ea\u662f\u9700\u8981\u5173\u6ce8\u4e0b\u73af\u5883\u53d8\u91cf\u7684\u95ee\u9898\u3002 \u63a8\u8350\u6307\u5b9a\u7248\u672c\u53f7\uff08youqu==2.0.0\uff09\u5b89\u88c5\uff0c\u5982\u679c\u4e0d\u6307\u5b9a\u7248\u672c\u53f7\u9ed8\u8ba4\u662f\u5b89\u88c5\u6700\u65b0\u53d1\u5e03\u7684 YouQu \u7248\u672c\uff0c\u4f60\u53ef\u4ee5\u5728 PyPI \u4e0a\u7684 Release history \u91cc\u9762\u67e5\u770b\u6709\u54ea\u4e9b\u7248\u672c\u3002 \u5b89\u88c5\u4e4b\u540e\u4f1a\u81ea\u52a8\u751f\u6210\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu-startproject\uff0c\u4f7f\u7528\u5b83\u53ef\u4ee5\u521d\u59cb\u5316\u5de5\u7a0b\uff0c\u8fd9\u91cc\u4ee5\u97f3\u4e50\u4e3e\u4f8b\uff1b youqu-startproject autotest_deepin_music\n \u8fd9\u6837\u5c31\u4f1a\u5728\u5f53\u524d\u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a autotest_deepin_music \u76ee\u5f55\uff0c\u91cc\u9762\u5305\u542b\u4e86\u57fa\u7840\u6846\u67b6\u6240\u6709\u7684\u4ee3\u7801\uff1b \u4e4b\u540e\uff0c\u8fd8\u662f\u5728 apps \u76ee\u5f55\u4e0b\uff0c\u653e\u5165\u5b50\u9879\u76ee\u7684AT\u4ee3\u7801\u5373\u53ef\uff0c\u4f7f\u7528\u65b9\u6cd5\u548c\u8fc7\u53bb\u4e00\u6837\uff0c\u8fd9\u91cc\u5c31\u4e0d\u591a\u4ecb\u7ecd\u3002 \u53e6\u5916\uff0c\u9664\u4e86\u901a\u8fc7 pip \u83b7\u53d6\u4ee5\u5916\uff0c\u4ecd\u7136\u53ef\u4ee5\u901a\u8fc7\u6e90\u7801\u83b7\u53d6\uff08\u76f4\u63a5 git clone\uff09\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u4f7f\u7528 pip \u5b89\u88c5 YouQu \u65f6\uff0cYouQu \u5305\u7684\u5927\u5c0f\u624d 600+ k\uff0c\u5b89\u88c5\u901f\u5ea6\u8d77\u98de\u3002 2\u3001\u65b0\u7684AT\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848 \u4e3a\u4e86\u89e3\u51b3\u4ee5\u4e0b\u95ee\u9898\uff1a \u8fc7\u53bb\u4e00\u6bb5\u65f6\u95f4\u54b1\u4eec\u7ecf\u5e38\u51fa\u73b0\u7684\uff0c\u4e0d\u540c\u7684AT\u9879\u76ee\u5728\u540c\u4e00\u53f0\u673a\u5668\u4e0a\u90e8\u7f72\u73af\u5883\u65f6\u4f9d\u8d56\u7248\u672c\u51b2\u7a81\u7684\u95ee\u9898\uff0c\u65b0\u65b9\u6848\u4e0d\u540c\u7684\u9879\u76ee\u4f1a\u52a8\u6001\u751f\u6210\u81ea\u5df1\u7684\u865a\u62df\u73af\u5883\uff0c\u76f8\u4e92\u4e4b\u95f4\u4e0d\u5f71\u54cd\uff1b \u4e1a\u5185\u4e3a\u4e86\u89e3\u51b3\u7248\u672c\u51b2\u7a81\u95ee\u9898\u4e00\u822c\u90fd\u4f1a\u4f7f\u7528Python\u865a\u62df\u73af\u5883\u7684\u5de5\u5177\uff0c\u4f46\u662f\u90fd\u6709\u4e2a\u95ee\u9898\uff0c\u65e0\u6cd5\u7ba1\u7406 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u5305\uff0c\u672c\u6b21\u6211\u4eec\u89e3\u51b3\u4e86\u8fd9\u4e2a\u95ee\u9898\uff0c\u80fd\u591f\u5b8c\u5168\u7ba1\u7406\u5e38\u89c4\u7684Python\u5305\uff0c\u4e5f\u80fd\u7ba1\u7406\u5230 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u4e09\u65b9\u5305\uff1b \u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u4f7f\u7528\u65b9\u6cd5\uff1a bash env.sh\n \u53ef\u4ee5\u770b\u51fa\u6765\u548c\u539f\u6765\u4f7f\u7528\u65b9\u6cd5\u6ca1\u6709\u53d8\u5316\uff0c\u4e5f\u5c31\u662f\u8bf4\u4ece\u4f7f\u7528\u7684\u89d2\u5ea6\u662f\u5b8c\u5168\u6ca1\u6709\u533a\u522b\u7684\uff0c\u53ea\u662f\u5185\u90e8\u505a\u4e86\u4e0d\u540c\u7684\u4e8b\u60c5\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u672c\u673a\u90e8\u7f72\u7684\u529f\u80fd\u4ecd\u7136\u4fdd\u7559 env_dev.sh\uff0c\u53ef\u4ee5\u4f5c\u4e3a\u5f00\u53d1\u65f6\u7684\u73af\u5883\u90e8\u7f72\u3002 3\u3001\u65b0\u7684\u9a71\u52a8\u547d\u4ee4 \u8fc7\u53bb\u54b1\u4eec\u90fd\u662f\u4f7f\u7528\u8fd9\u6837\u7684\u547d\u4ee4\u6765\u9a71\u52a8\u6267\u884c\uff1a python3 manage.py run\n \u7531\u4e8e\u9ed8\u8ba4\u57fa\u4e8e\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848\uff0c\u56e0\u6b64\u6211\u4eec\u589e\u52a0\u4e86\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu\uff1b \u65b0\u7684\u9a71\u52a8\u65b9\u5f0f\uff1a youqu manage.py run\n \u53ea\u9700\u8981\u628a python3 \u66ff\u6362\u6210 youqu \u5c31\u53ef\u4ee5\u4e86\uff0c\u770b\u8d77\u6765\u5f88\u548c\u8c10~ 4\u3001\u65b0\u7684\u6587\u6863\u5730\u5740 \u8fc7\u53bb\u54b1\u4eec YouQu \u7684\u5728\u7ebf\u6587\u6863\u662f\u90e8\u7f72\u5728\u516c\u53f8\u5185\u7f51\u7684\uff0c\u73b0\u5728\u5f00\u6e90\u5230 github \u4e86\uff0c\u5916\u90e8\u5f00\u53d1\u8005\u80af\u5b9a\u8bbf\u95ee\u4e0d\u5230\u5185\u7f51\u7684\u6587\u6863\uff0c\u56e0\u6b64\u9700\u8981\u5c06\u6587\u6863\u90e8\u7f72\u5230\u516c\u7f51\u3010\u516c\u7f51\u6587\u6863\u3011\uff1b \u516c\u7f51\u6587\u6863\u4f7f\u7528\u7684\u662f github pages\uff08\u767d\u5ad6\u602a\u4e00\u987f\u72c2\u559c~~\uff09\uff0c\u4f46\u53ef\u80fd\u4f1a\u51fa\u73b0\u6587\u6863\u901f\u5ea6\u6162\u7684\u95ee\u9898\uff08\u4ee3\u7406\u4e0b\u5c31\u597d\u4e86\uff09\uff0c\u4e0d\u8fc7\u6ca1\u5173\u7cfb\uff0c\u54b1\u4eec\u3010\u5185\u7f51\u6587\u6863\u3011\u4ecd\u7136\u4fdd\u7559\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u3002 5\u3001\u5176\u4ed6\u4e00\u4e9b\u5c0f\u5c0f\u529f\u80fd\u66f4\u65b0\uff1a \uff081\uff09\u65b0\u589e\u5173\u95ed\u5206\u8fa8\u7387\u68c0\u6d4b\u7684\u53c2\u6570\u503c\uff1b youqu manage.py run --resolution no\n \u6216\u8005\u4fee\u6539 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387, \u6bd4\u5982\uff1a1920x1080\n;no: \u8868\u793a\u4e0d\u505a\u5206\u8fa8\u7387\u6821\u9a8c\nRESOLUTION = 1920x1080\n resolution \u8fd9\u4e2a\u53c2\u6570\u4e00\u76f4\u90fd\u6709\u7684\uff0c\u53ea\u4e0d\u8fc7\u4e4b\u524d\u662f\u7528\u4e8e\u6307\u5b9a\u5206\u8fa8\u7387\u5927\u5c0f\uff0c\u6bd4\u5982 --resolution 1920x1080\uff0c\u4f46\u6709\u4e9b\u63a5\u53e3\u7684\u9879\u76ee\u4e0d\u9700\u8981\u8fd9\u4e2a\u68c0\u67e5\uff0c\u53ef\u4ee5\u7ed9\u5b83\u4e2a no \u5c31\u597d\u4e86\uff0c\u5f53\u7136 CICD \u4e0a\u5173\u95ed\uff0c\u9700\u8981\u6d41\u6c34\u7ebf\u4e0a\u628a\u8fd9\u4e2a\u53c2\u6570\u52a0\u4e0a\uff1b \uff082\uff09\u65b0\u589e\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u7684\u547d\u4ee4\u884c\u53c2\u6570 \u4e4b\u524d\u8fd9\u4e2a\u914d\u7f6e\u9879\u53ea\u80fd\u5728 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c 1 \u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff0cRERUN >= RECORD_FAILED_CASE\u3002\n;1.\u5173\u95ed\u5f55\u5c4f\uff1aRECORD_FAILED_CASE > RERUN\n;2.\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1aRECORD_FAILED_CASE = 0\nRECORD_FAILED_CASE = 1\n \u73b0\u5728\u5c06\u5f00\u53d1\u5230\u547d\u4ee4\u884c\u53c2\u6570\u3002 youqu manage.py run --record_failed_case 2\n fix \u4fee\u590d remote \u6267\u884c\u65f6\uff0c\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u65e0\u6cd5\u751f\u6210\u6d4b\u8bd5\u62a5\u544a\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1302023710","title":"1.3.0\uff082023/7/10\uff09","text":"fix \u8fdb\u4e00\u6b65\u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b\u53c2\u8003\uff1a\u914d\u7f6ePython\u6e90\u7684\u51e0\u79cd\u65b9\u6cd5 \u4fee\u590d wayland_autotool \u53d7\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86wayland\u4e0b\u5076\u73b0\u627e\u4e0d\u5230 .Xauthority \u6587\u4ef6\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1292023626","title":"1.2.9\uff082023/6/26\uff09","text":"fix \u4f18\u5316\u8fdc\u7a0b\u6267\u884c remote \u7684\u53c2\u6570\u76f4\u63a5\u4f20\u7ed9\u8fdc\u7a0b\u673a\u5668\u7684 run \u547d\u4ee4\uff0c\u4e0d\u7528\u518d\u5355\u72ec\u5904\u7406\u8fdc\u7a0b\u6267\u884c\u7684\u53c2\u6570\u903b\u8f91\uff0c\u540e\u7eed\u4e13\u6ce8\u4e8e\u672c\u5730\u6267\u884c\u529f\u80fd\u5f00\u53d1\uff0c\u8fdc\u7a0b\u6267\u884c\u81ea\u52a8\u9002\u7528\uff1b env.sh \u79fb\u9664 pyyaml \u5b89\u88c5\uff0c\u7531\u5b50\u9879\u76ee\u5728 requirement.txt \u91cc\u9762\u5b9a\u4e49\uff0c\u6846\u67b6\u81ea\u52a8\u52a0\u8f7d\uff1b \u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b "},{"location":"RELEASE/#128202369","title":"1.2.8\uff082023/6/9\uff09","text":"fix \u4fee\u590d\u4e86 pypi \u5b89\u88c5 numpy \u5b58\u5728\u7cfb\u7edf\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#127202368","title":"1.2.7\uff082023/6/8\uff09","text":"fix env.sh \u4e2d\u5b89\u88c5 Python \u5305\u672a\u6307\u5b9a\u7248\u672c\u65f6\uff0c\u65e5\u5fd7\u8f93\u51fa\u5b89\u88c5\u7684\u7248\u672c\uff1b pdocr-rpc 2.0.1\nallure-custom 1.2.1\nfunnylog 1.1.3\n \u4fee\u590d -f \u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u62a5\u9519\u7684\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#126202367","title":"1.2.6\uff082023/6/7\uff09","text":"fix \u4fee\u590d wayland \u4e0a\u8c03\u7528\u9f20\u6807\u4e2d\u952e\u3001\u53f3\u952e\u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b \u4fee\u590d pubilic/dde_desktop_public_widget \u91cc\u9762\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u5b9a\u4f4d\u684c\u9762\u6587\u4ef6\u7684\u65b9\u6cd5\uff0c\u5750\u6807\u6ca1\u6709\u62c6\u5305\u7684\u95ee\u9898\uff1b \u4f18\u5316\u4e86\u7b49\u5f85\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b pycreeze \u7248\u672c\u5347\u7ea7\u5230 0.1.29\uff0c\u5bfc\u81f4\u4e0e pyautogui 0.9.53 \u4e0d\u517c\u5bb9\uff0cenv.sh \u91cc\u9762\u589e\u52a0\u6307\u5b9a pycreeze \u7248\u672c\u4e3a 0.1.28\uff1b "},{"location":"RELEASE/#1252023516","title":"1.2.5\uff082023/5/16\uff09","text":"new --app \u53c2\u6570\u540e\u9762\u65b0\u589e\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u76ee\u524d\u652f\u6301\u4e09\u79cd\u53c2\u6570\u4f20\u5165\u65b9\u5f0f\uff1a ~$: youqu run -a deepin-music\n~$: youqu run -a autotest_deepin_music\n~$: youqu run -a apps/autotest_deepin_music\n \u200b \u540e\u4e24\u79cd\u5165\u53c2\u65b9\u5f0f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\u3002 remote \u8fdc\u7a0b\u6267\u884c\u65b0\u589e\u4ece\u547d\u4ee4\u884c\u4f20\u5165\u6d4b\u8bd5\u673a\u4fe1\u606f\uff0c\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679c password \u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6 setting/remote.ini \u4e2d CLIENT_PASSWORD \u7684\u503c,\u6bd4\u5982\uff1auos@10.8.13.33:1 \u6216 uos@10.8.13.33 \uff1b python3 manage.py remote -c uos@10.8.13.33/uos@10.8.13.34\npython3 manage.py remote -c uos@10.8.13.33:1/uos@10.8.13.34:2\n fix \u65e5\u5fd7\u6a21\u5757\u4fee\u6539\u4e3a\u51fd\u6570\u6267\u884c\u4e4b\u524d\u6253\u5370\u65e5\u5fd7\uff1b \u65e5\u5fd7\u6a21\u5757\u589e\u52a0\u767d\u540d\u5355\uff0c\u901a\u8fc7\u7c7b\u540d\u5f00\u5934\uff0c\u7ed3\u675f\uff0c\u5305\u542b\u7b49\u5173\u952e\u5b57\u63a7\u5236\u9700\u8981\u6253\u5370\u7684\u51fd\u6570\u65e5\u5fd7\uff1b \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5982\u679c\u4f20\u5165\u4e86 app_name \u53ea\u4f1a\u5c06 apps \u76ee\u5f55\u4e0b app_name \u7684\u76ee\u5f55\u53d1\u9001\u5230\u6d4b\u8bd5\u673a\uff1b env.sh \u79fb\u9664 python3-dev\uff1b \u4fee\u590d Wayland \u4e0b env.sh \u73af\u5883\u5b89\u88c5\u5931\u8d25\u7684\u95ee\u9898\uff0c\u4f18\u5316\u4e86 deb \u4f9d\u8d56\u5b89\u88c5\u7684\u903b\u8f91\uff1b \u5c06 env.sh \u5237\u65b0\u6e90\u7684\u65e5\u5fd7\u5728\u7ec8\u7aef\u663e\u793a\uff0c\u89e3\u51b3\u5728 CI \u73af\u5883\u4e0b\uff0c\u957f\u65f6\u95f4\u4e0d\u8f93\u51fa\u65e5\u5fd7\u8fde\u63a5\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d1060 \u534e\u4e3a\u673a\u578b\u5b89\u88c5\u952e\u9f20\u5de5\u5177\u65f6\u4f9d\u8d56\u4e0d\u517c\u5bb9\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1242023227","title":"1.2.4\uff082023/2/27\uff09","text":"fix \u4fee\u6539 CURRENT \u6587\u4ef6\uff1b "},{"location":"RELEASE/#1232023227","title":"1.2.3\uff082023/2/27\uff09","text":"new pylint.sh \u652f\u6301\u901a\u8fc7\u4f4d\u7f6e\u53c2\u6570\u4f20\u5165\u6587\u4ef6\u8def\u5f84\uff1abash pylint.sh apps/autotest_deepin_music,\u597d\u5904\u662f\u53c2\u6570\u8def\u5f84\u53ef\u4ee5\u5728\u7ec8\u7aef\u8865\u5168\uff1b \u65b0\u589e\u7cfb\u7edf\u547d\u4ee4 youqu-pylint \uff0c\u7528\u4e8e\u9759\u6001\u4ee3\u7801\u626b\u63cf\uff0c\u4f7f\u7528\u65b9\u6cd5: youqu-pylint apps/autotest_deepin_music\uff1b \u7531\u4e8e\u7cfb\u7edf\u4e00\u4e9b dbus \u63a5\u53e3\u6539\u53d8\uff0c\u516c\u5171\u5e93\u4e2d\u7684 dbus \u65b9\u6cd5\u5c06\u4e0d\u518d\u7ef4\u62a4\uff0c\u7531\u5b50\u9879\u76ee\u5728 other_widget.py \u91cc\u9762\u8fdb\u884c\u7ef4\u62a4\uff1b fix \u4fee\u590d ssh \u73af\u5883\u4e0b\u8fd0\u884c\u63d0\u793a \u201c\u65e0\u6cd5\u8fde\u63a5\u201d \u7684\u95ee\u9898\uff1b \u4fee\u590d\u8fd0\u884c\u65f6\u7a0b\u5e8f\u9000\u51fa\uff0c\u4e0d\u8f93\u51fa\u5f02\u5e38\u65e5\u5fd7\u7684\u95ee\u9898\uff1b \u4fee\u590dyouqu remote xxx \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5728\u670d\u52a1\u7aef Ctrl + C \u65e0\u6cd5\u505c\u6b62\u7a0b\u5e8f\u8fd0\u884c\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#122202328","title":"1.2.2\uff082023/2/8\uff09","text":"new \u65b0\u589e\u6c14\u6ce1\u7c7b\u56fe\u50cf\u8bc6\u522b\u65b9\u6848\uff1bimage_utils.py::ImageUtil::get_during\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u533a\u57df\u8bc6\u522b\uff0c\u4f20\u5165 [x, y, w, h]\uff0cx: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u76ee\u6807\u56fe\u7247\uff0c\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\uff1b env.sh \u79fb\u9664 pypinyin; \u4f18\u5316\u6267\u884c env.sh \u65f6\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b manage.py \u79fb\u9664\u4e86\u53c2\u6570 session_timeout \uff0c\u6846\u67b6\u6839\u636e\u5168\u5c40\u7684 timeout \u4ee5\u53ca\u7528\u4f8b\u81ea\u5b9a\u4e49\u7684 timeout \u81ea\u52a8\u8ba1\u7b97\u51fa sessiontimeout \u7684\u503c\uff1b \u65b0\u589e ocr \u670d\u52a1\u5668\u94fe\u63a5\u91cd\u8bd5\uff0c\u9ed8\u8ba4\u91cd\u8bd51\u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u53c2\u6570\uff1b fix \u4fee\u590d\u4e86\u4e00\u4e9b pylint \u626b\u63cf\u7684\u4ee3\u7801\u98ce\u683c\u95ee\u9898\uff1b \u91cd\u65b0\u8bbe\u8ba1\u4e86\u6d4b\u8bd5\u62a5\u544a\u4e3b\u9898\uff1b "},{"location":"RELEASE/#121202316","title":"1.2.1\uff082023/1/6\uff09","text":"new \u652f\u6301\u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6267\u884c\u7528\u4f8b\uff1b\u53ef\u5c06python3 manage.py \u66ff\u6362\u4e3a youqu \uff1a youqu run -a deepin-music -k 001\n RPC \u670d\u52a1 IP \u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u6307\u5b9a\u4e0d\u540c\u7684\u7aef\u53e3\uff1b \u5728\u7ebf\u6587\u6863\u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u539f\u6765\u7684\u5730\u5740 10.8.10.215 \u5c06\u4e0d\u5728\u4f7f\u7528\uff1b fix \u4fee\u590d --count \u53c2\u6570\u53ef\u80fd\u51fa\u73b0\u4e0e\u5176\u4ed6\u6846\u67b6\u7684\u5de5\u7a0b\u4f9d\u8d56\u5b58\u5728\u51b2\u7a81\uff0c\u62a5\u9519\u91cd\u590d\u6ce8\u518c\u7684\u95ee\u9898\uff1b \u4fee\u590d CI \u73af\u5883\u4e0b\u591a\u4e2a\u5de5\u7a0b\u5b58\u5728 Python \u73af\u5883\u53d8\u91cf\u6307\u5411\u9519\u8bef\uff0c\u5bfc\u5305\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u5355\u72ec\u8fd0\u884c\u65b9\u6cd5\u65f6\u65e0\u65e5\u5fd7\u8f93\u51fa\u7684 Bug\uff1b "},{"location":"RELEASE/#12020221230","title":"1.2.0\uff082022/12/30\uff09","text":"1.1.4 \u7248\u672c\u9002\u914d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e14\u65b0\u589e\u4e86\u8f83\u591a\u65b0\u7279\u6027\uff0c\u6211\u4eec\u8ba1\u5212\u4f7f\u7528 1.1.4 \u7248\u672c\u8fd0\u884c\u4e00\u6bb5\u65f6\u95f4\uff0c1.2.0 \u7248\u672c\u5c06\u4fee\u590d\u671f\u95f4\u51fa\u73b0\u7684 Bug\uff0c\u7136\u540e\u4f5c\u4e3a\u7a33\u5b9a\u7248\u672c\u53d1\u5e03\u3002 new \u4fee\u6539\u5de5\u7a0b\u540d\u79f0\u4e3a youqu\uff1b \u5c06 sphinx \u6587\u6863\u5de5\u7a0b\u8fc1\u79fb\u5230\u5355\u72ec\u7684\u4ed3\u5e93\uff1b fix \u4fee\u590d startapp \u521b\u5efa\u5de5\u7a0b\u65f6\u5b58\u5728\u5de5\u7a0b\u540d\u79f0\u65f6\u65e0\u6cd5\u7ee7\u7eed\u521b\u5efa\uff1b \u4fee\u590d\u4e86 OCR \u670d\u52a1\u5728\u5e76\u53d1\u65f6\u53ef\u80fd\u51fa\u73b0\u65e0\u6cd5\u8fd4\u56de\u7ed3\u679c\u7684\u95ee\u9898\uff0c\u63d0\u5347 OCR \u670d\u52a1\u9ad8\u5e76\u53d1\u7a33\u5b9a\u6027\uff1b \u4fee\u590d PMS \u540c\u6b65\u6807\u7b7e\u5230 CSV \u6587\u4ef6\u4e0d\u652f\u6301\u7528\u4f8b\u5e93\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11420221214","title":"1.1.4\uff082022/12/14\uff09","text":"new \u65b0\u589e startapp \u5b50\u547d\u4ee4\u521b\u5efa\u5b50\u9879\u76ee\u5de5\u7a0b\u6a21\u677f: python3 manage.py startapp autotest_deepin_xxx \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u91cd\u590d\u6267\u884c\u6b21\u6570\uff1b \u53bb\u6389\u6279\u91cf\u6267\u884c\u524d\u6536\u96c6\u7528\u4f8b\u7684\u6b65\u9aa4\uff1b \u589e\u52a0\u5f00\u59cb\u6267\u884c\u65f6\u6253\u5370\u4e00\u4e9b\u6267\u884c\u53c2\u6570\uff0c\u5982\uff1a \u7528\u4f8b\u6536\u96c6\u6570\u91cf: 99\n\u5931\u8d25\u91cd\u8dd1\u6b21\u6570: 1\n\u6700\u5927\u5931\u8d25\u6b21\u6570: 49\n\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4: 200.0s (03\u520620\u79d2)\n\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4: 11880s (3\u5c0f\u65f618\u52060\u79d2)\n \u5b9a\u5236\u4fee\u6539allure\u62a5\u544alogo\u3001title\u3001\u9ed8\u8ba4\u8bed\u8a00\uff1b manage.py \u6267\u884c\u5f00\u59cb\u65f6\u6253\u5370 logo \u548c\u5f53\u524d\u7248\u672c\uff1a \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u255a\u2588\u2588\u2557 \u2588\u2588\u2554\u255d \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2584\u2584 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2580\u2580\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u2584\u2588 \u2584\u2588 \u2588 \u2588 \u2588 \u2584 \u2588 \u2584 \u2580\u2580\u2588 \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\uff1b \u88c5\u9970\u5668\u65b9\u6cd5\u6307\u5b9a\u6b21\u6570\uff1b @pytest.mark.count(2)\ndef test_music_001():\npass\n \u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u6b21\u6570\uff1b python3 manage.py run -a deepin-music -k 001 --count 2\n \u200b image_utils \u589e\u52a0\u51fd\u6570 save_temporary_picture\uff0c\u652f\u6301\u6307\u5b9a\u5c4f\u5e55\u533a\u57df\u622a\u56fe\u5e76\u8fd4\u56de\u56fe\u7247\u5b58\u653e\u7684\u672c\u5730\u8def\u5f84\uff0c\u540e\u7eed\u4f7f\u7528 assert_image_exist \u8fdb\u884c\u65ad\u8a00 Python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(x, y, width, height) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) button_center \u65b0\u589e btn_size \u83b7\u53d6\u63a7\u4ef6\u5de6\u4e0a\u89d2\u5750\u6807\u53ca\u957f\u5bbd\uff0c\u7528\u4e8e\u52a8\u6001\u7684\u622a\u53d6\u5143\u7d20\u7684\u56fe\u7247\uff0c\u53ef\u7528\u4e8e\u5b9a\u4f4d\u65ad\u8a00 python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u6240\u6709\u97f3\u4e50\u6309\u94ae\")) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) allure \u62a5\u544a\u4e2d\u5b9a\u4f4d\u95ee\u9898\u9664\u4e86\u65e5\u5fd7\u3001\u622a\u56fe\u3001\u5f55\u5c4f\u5916\uff0c\u8c03\u7528\u7684\u51fd\u6570\u589e\u52a0\u4e86 step \u6b65\u9aa4\u5c55\u793a\uff1b env.sh \u65b0\u589e\u5b89\u88c5\u5b50\u9879\u76ee Python \u4e09\u65b9\u4f9d\u8d56\uff0c\u5728\u5b50\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u5199 requirement.txt \u6587\u4ef6\uff0cenv.sh \u4f1a\u81ea\u52a8\u52a0\u8f7d\uff1b ocr \u8bc6\u522b\u65b0\u589e\u652f\u6301\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\u8fdb\u884c\u6587\u5b57\u8bc6\u522b\uff0c\u51cf\u5c11\u56e0\u5168\u5c4f\u8bc6\u522b\u65f6\uff0c\u5176\u4ed6\u6587\u5b57\u7684\u5e72\u6270 Python # \u65ad\u8a00\u97f3\u4e50\u7684\u5220\u9664\u5f39\u7a97\u4e2d\uff0c\u5305\u542b\u4e86\u201c\u786e\u8ba4\u201d\u7684\u6587\u5b57 self.assert_ocr_exist(\"\u786e\u8ba4\", picture_abspath=DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u5220\u9664\u5f39\u7a97\"))) \u65ad\u8a00\u51fd\u6570\u7684\u8c03\u7528\u4e5f\u4f1a\u81ea\u52a8\u6253\u5370\u65e5\u5fd7; env.sh \u65b0\u589e\u88c1\u526a\u4f9d\u8d56\u7684\u65b9\u6848\uff1b fix \u4fee\u590d Jenkins \u73af\u5883\u4e0b\uff0c apps \u76ee\u5f55\u4e0b\u5b50\u9879\u76ee\u5b58\u5728 auotest_deepin_xxx@tmp \u76ee\u5f55\uff0c\u5728\u4f20\u5165 app_name \u540e\u65e0\u6cd5\u6267\u884c\u7528\u4f8b\u7684\u95ee\u9898\uff1b \u4fee\u590d\u81ea\u52a8\u751f\u6210 case_list.csv \u6587\u4ef6\u65f6\uff0c\u7528\u4f8b\u987a\u5e8f\u88ab\u8c03\u6574\u7684\u95ee\u9898\uff1b env.sh \u73af\u5883\u5b89\u88c5\u79fb\u9664 git \u548c curl\uff1b \u4fee\u590d\u7528\u4f8b\u5728 setup \u9636\u6bb5\u62a5\u9519\u540e\uff0c\u672a\u5199\u5165 ci_result.json \u7684\u95ee\u9898\uff1b \u79fb\u9664 uos_ci.py\uff1b "},{"location":"RELEASE/#11320221028","title":"1.1.3\uff082022/10/28\uff09","text":"new \u65b0\u589e\u56fe\u50cf\u65ad\u8a00\u6210\u529f\u8f93\u51fa\u5339\u914d\u5ea6\uff1b \u65b0\u589e\u73af\u5883\u5b89\u88c5 yaml \u4f9d\u8d56\uff1b \u65b0\u589e\u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6570\u636e\u56de\u586b\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b \u65b0\u589e\u6d4b\u8bd5\u7ed3\u679c\u8868\u60c5\u663e\u793a\uff0c\u5e76\u4f18\u5316\u4e86\u65e5\u5fd7\u7684\u6392\u7248\uff1b \u65b0\u589e --top {number} \u7528\u4e8e\u8bb0\u5f55\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0c\u65e5\u5fd7\u751f\u6210\u5230 report/logs/top.log\uff1b fix \u4fee\u590d\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4f46\u7ec8\u7aef\u6ca1\u6709\u9519\u8bef\u65e5\u5fd7\u8f93\u51fa\u7684\u95ee\u9898\uff1b \u4fee\u6539\u5931\u8d25\u7528\u4f8b\u56de\u6eaf\u65e5\u5fd7\u4e3a\u8be6\u7ec6\u7ea7\u522b\uff1b \u4fee\u590d\u4e86\u6267\u884c\u8fdb\u5ea6\u672a\u8ba1\u7b97\u8df3\u8fc7\u7528\u4f8b\u7684\u95ee\u9898\uff0c\u5e76\u4f18\u5316\u4e86\u8fdb\u5ea6\u83b7\u53d6\u7684\u7b97\u6cd5\uff1b \u4fee\u590d env.sh \u5728 V23 \u73af\u5883\u4e0b\u5b89\u88c5\u65e0\u6cd5\u8bfb\u53d6\u5bc6\u7801\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 pms \u6d4b\u8bd5\u5957\u6267\u884c\u6216\u6d4b\u8bd5\u5355\u6267\u884c\u65f6\uff0c\u7528\u4f8bID\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b env.sh \u91cc\u9762 hub.deepin.com \u66f4\u6362\u6210 it.uniontech.com\uff1b uos_ci.py \u6d4b\u8bd5\u7ed3\u679c\u7edf\u8ba1\u65f6\uff0c\u603b\u6570\u5254\u9664 skip \u7684\u6570\u91cf "},{"location":"RELEASE/#11220220921","title":"1.1.2\uff082022/09/21\uff09","text":"new \u5728\u6ca1\u6709\u5b89\u88c5 dogtail \u7684\u60c5\u51b5\u4e0b\uff0c\u4e5f\u80fd\u4f7f\u7528 sniff \u5de5\u5177\uff1b fix \u4fee\u590d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e2d\u6ca1\u6709\u5b89\u88c5 AT \u73af\u5883\u6267\u884c uos_ci.py \u62a5\u9519\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11120220919","title":"1.1.1\uff082022/09/19\uff09","text":"new \u65b0\u589e\u6267\u884c\u8fdb\u5ea6\u663e\u793a\uff0c\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u65f6\u65e5\u5fd7\u8f93\u51fa\u5f53\u524d\u8fdb\u5ea6\uff1a[\u5f53\u524d\u6307\u5b9a\u7b2c\u51e0\u6761/\u7528\u4f8b\u603b\u6570]\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u7528\u4f8b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\u6240\u6709\u5931\u8d25\u7528\u4f8b\u7684\u5217\u8868\uff1b \u5173\u95ed\u7ec8\u7aef\u8f93\u51fa\u6355\u83b7\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u65e5\u5fd7\u5feb\u7167\uff1b \u4f18\u5316\u7ec8\u7aef\u8f93\u51fa\u5931\u8d25\u4fe1\u606f\u5197\u957f\u4e3a\u7b80\u8981\u4fe1\u606f\u8f93\u51fa\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u663e\u793a 10 \u4e2a\u6267\u884c\u6700\u6162\u7684\u7528\u4f8b\u5217\u8868\uff0c\u5e76\u8be6\u7ec6\u5217\u51fa\u5404\u4e2a\u9636\u6bb5\u7684\u8017\u65f6\uff1b \u5931\u8d25\u91cd\u8dd1\u7528\u4f8b\u91cd\u8dd1\u4e4b\u524d\u5ef6\u8fdf 1 \u79d2\uff1b \u65b0\u589e\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4ecd\u7136\u5f3a\u5236\u6267\u884c\uff1b \u7528\u4f8b\u6536\u96c6\u65f6\u4ec5\u5728 apps \u76ee\u5f55\u4e0b\u8fdb\u884c\uff0c\u5ffd\u7565 src,setting,public \u76ee\u5f55\uff1b \u65b0\u589e allure \u62a5\u544a\u5907\u4efd\u529f\u80fd\uff0c\u9ed8\u8ba4\u5907\u4efd\u81f3 allure_back \u76ee\u5f55\u4e0b\uff1b manage.py\u65b0\u589e\u53c2\u6570 --lastfailed \u7528\u4e8e\u53ea\u8dd1\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\u7684\u529f\u80fd\uff1b fix \u4fee\u590d\u4e86\u5728\u6ca1\u6709\u6307\u5b9a\u5e94\u7528\u540d\u79f0\u6267\u884c\u65f6\uff0cxml \u62a5\u544a\u751f\u6210\u8def\u5f84\u5f02\u5e38\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 uos_ci.py \u4f20\u5165 timeout \u548c session_timeout \u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11020220916","title":"1.1.0\uff082022/09/16\uff09","text":"new \u65b0\u589ePMS\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u652f\u6301\u591a\u79cd\u6570\u636e\u56de\u586b\u6a21\u5f0f\uff1b \u4f18\u5316\u4e86\u901a\u8fc7\u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u65f6PMS \u722c\u866b\u7684\u6027\u80fd\uff1b \u65b0\u589e .gitmodules \u6587\u4ef6\uff0c\u7528\u4e8e\u6807\u8bb0\u6240\u6709\u5b50\u9879\u76ee\uff0c\u65b9\u4fbf\u7edf\u4e00\u62c9\u53d6\u4ee3\u7801\uff1b env.sh \u9002\u914d\u793e\u533a\u7248\u4e0a\u5b89\u88c5\u81ea\u52a8\u5316\u73af\u5883\uff1b \u589e\u52a0\u6267\u884c\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u9519\u8bef\u7684\u529f\u80fd\uff1b README.md \u589e\u52a0 Wayland \u4e0b\u4f7f\u7528\u3001\u6d4b\u8bd5\u62a5\u544a\u67e5\u770b\u3001\u5e38\u89c1\u95ee\u9898\u7b49\u7684\u6587\u6863\u8bf4\u660e\uff1b \u589e\u52a0\u4e86\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u5bf9 setup\u3001call\u3001teardown \u8fdb\u884c\u65e5\u5fd7\u5206\u6bb5\uff1b fix \u4fee\u590d\u4e86 \u786e\u8ba4\u4fee\u590d \u5217\u6ca1\u5199\u8868\u5934\uff0c\u4f46\u5199\u4e86 fixed-xxx \u6807\u7b7e\uff0c\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u540c\u4e00\u5e94\u7528\u5185\u591a\u4e2a csv \u6587\u4ef6\u4e2d \u786e\u8ba4\u4fee\u590d \u5217\u6709\u7684\u5199\u4e86\uff0c\u6709\u7684\u6ca1\u5199\uff0c\u53ef\u80fd\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 INFO \u65e5\u5fd7\uff0c\u663e\u793a\u4e3a DEBUG \u7684\u95ee\u9898\uff1b\u4fee\u590d\u4e86\u90e8\u5206\u673a\u5668\u4e0a INFO \u65e5\u5fd7\u5185\u5bb9\u663e\u793a\u4e3a\u7ea2\u8272\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\u770b\u4e0d\u5230\u8be6\u7ec6\u4fe1\u606f\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10220220822","title":"1.0.2\uff082022/08/22\uff09","text":"new \u79fb\u9664 loguru\uff0c\u66ff\u6362\u4e3a logging\uff0c\u63a5\u53e3\u4fdd\u6301\u4e0d\u53d8\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u53d7\u5f71\u54cd\uff1b \u9ed8\u8ba4\u5f00\u542f coredump\uff1b fix \u4fee\u590d\u4e86\u4e09\u65b9\u5e93 loguru \u5076\u73b0\u5f02\u5e38\uff0c\u5bfc\u81f4\u7a0b\u5e8f\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7b2c\u4e00\u6b21\u5931\u8d25\u4e0d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10120220812","title":"1.0.1\uff082022/08/12\uff09","text":"new \u65b0\u589e RELEASE.md \u6587\u4ef6\uff0c\u7528\u4e8e\u8bb0\u5f55\u5386\u53f2\u53d1\u5e03\u7248\u672c\u7684\u66f4\u65b0\u5185\u5bb9\uff1b \u517c\u5bb9 Wayland \u6a21\u5f0f\u4e0b\u6267\u884c\u7528\u4f8b\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u7528\u7ba1\u5f53\u524d\u6d4b\u8bd5\u673a\u6267\u884c\u73af\u5883\uff0c\u6846\u67b6\u4f1a\u81ea\u52a8\u6839\u636e\u5f53\u524d\u73af\u5883\u8d70\u4e0d\u540c\u7684\u4ee3\u7801\u903b\u8f91\uff1b \u7531\u4e8e\u9700\u8981\u4fee\u6539 dogtail \u6e90\u4ee3\u7801\uff0c\u56e0\u6b64\u5c06\u4fee\u6539\u540e\u7684\u6e90\u7801\u653e\u5165\u5230\u6838\u5fc3\u5e93\u91cc\u9762 src/depends/dogtail \u540e\u7eed\u7248\u672c\u5c06\u4e0d\u9700\u8981\u5728\u7cfb\u7edf\u4e2d\u5b89\u88c5dogtail\uff1b \u5982\u679c\u5e94\u7528\u5e93\u540c\u6837\u4f7f\u7528\u4e86\u7cfb\u7edf\u5b89\u88c5\u7684 dogtail \u53ef\u80fd\u4f1a\u62a5\u9519\uff0c\u89e3\u51b3\u65b9\u6848\u662f\u5c06\u4ee3\u7801\u4e2d\u7684 import dogtail \u4fee\u6539\u4e3a from src.depends import dogtail ; fix \u91cd\u8dd1\u5931\u8d25\u4e4b\u540e\u624d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff0c\u4fee\u6539\u4e3a\u5931\u8d25\u4e4b\u540e\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":"# Attribution \uff1achengdu Test Team\n# Date \uff1a2021/08/20\n \u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d \u4ed3\u5e93\u5730\u5740\uff1ahttps://gitlabcd.uniontech.com/autotest/cd-desktop-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u65b9\u6848\u6982\u8ff0","text":"\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u667a\u80fd\u8bc6\u522b\u5e94\u7528\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u7528\u4e8e\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u64cd\u4f5c\u8fc7\u7a0b\u4e2d\u7684\u5143\u7d20\u5b9a\u4f4d\u4ee5\u53ca\u5224\u65ad\u7ed3\u679c\u65f6\u7684\u65ad\u8a00\u5904\u7406\uff1b\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\uff0c\u6d4b\u8bd5\u673a\u4e0a\u7684\u753b\u9762\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u5230\u670d\u52a1\u5668\u4e0a\uff0c\u670d\u52a1\u5668\u5bf9\u89c6\u9891\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\u540e\uff0c\u670d\u52a1\u5668\u667a\u80fd\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\u6210\u529f\uff0c\u7136\u540e\u5bf9\u6d4b\u8bd5\u673a\u4e0b\u53d1\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\uff0c\u6d4b\u8bd5\u673a\u63a5\u53d7\u5e76\u6267\u884c\u4e0b\u4e00\u6b65\u64cd\u4f5c\u3002 \u670d\u52a1\u5668\u4e0e\u6d4b\u8bd5\u673a\u4e4b\u95f4\u7684\u94fe\u63a5\uff1a \u670d\u52a1\u5668\u901a\u8fc7 USB \u4e32\u53e3\u8bbe\u5907\uff08USB-HID \u534f\u8bae\uff09\u6a21\u62df\u9f20\u6807\u952e\u76d8\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u64cd\u4f5c\u3002 \u901a\u8fc7\u89c6\u9891\u91c7\u96c6\u8bbe\u5907\u6355\u83b7\u6d4b\u8bd5\u673a\u7684\u5b9e\u65f6\u753b\u9762\u4f20\u8f93\u7ed9\u670d\u52a1\u5668\u3002 \u670d\u52a1\u5668\u5bf9\u91c7\u96c6\u7684\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\uff0c\u8bc6\u522b\u5176\u4e2d\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5e76\u8fd4\u56de\u5143\u7d20\u63a7\u4ef6\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\uff0c\u670d\u52a1\u5668\u901a\u8fc7\u667a\u80fd\u5316\u5206\u6790\uff0c\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e00\u81f4\u5c06\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\u901a\u8fc7\u4e32\u53e3\u6a21\u62df\u952e\u9f20\u4fe1\u53f7\u53d1\u9001\u7ed9\u6d4b\u8bd5\u673a\uff1b\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e0d\u4e00\u81f4\u5c06\u4f1a\u8fdb\u5165\u4e2d\u65ad\u5904\u7406\u53ca\u5f02\u5e38\u7ed3\u679c\u8f93\u51fa\uff0c\u7ee7\u7eed\u6267\u884c\u540e\u7eed\u573a\u666f\uff0c\u76f4\u81f3\u6240\u6709\u7528\u4f8b\u6d4b\u8bd5\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u6df1\u5ea6\u5b66\u4e60\u73af\u5883\u642d\u5efa","text":"\u6a21\u578b\u8bad\u7ec3\u4e3b\u8981\u5bf9 GPU \u6709\u8981\u6c42\uff0c\u8bad\u7ec3\u6a21\u578b\u7684\u673a\u5668\u663e\u5b58\u4e0d\u4f4e\u4e8e 6G\uff0c\u5176\u4ed6\u914d\u7f6e\u65e0\u7279\u6b8a\u8981\u6c42\u3002 \u63a8\u8350\u6027\u4ef7\u6bd4\u8f83\u9ad8\u914d\u7f6e \u64cd\u4f5c\u7cfb\u7edf: UnionTech OS Desktop 20 Professional Linux version 4.19.0-desktop-amd64 (deepin@deepin-PC) (Uos 8.3.0.3-3+rebuild) \u5904\u7406\u5668: Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz (\u516b\u6838 / \u5341\u516d\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460M-HDV(RD)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))/8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: TU116 [GeForce GTX 1660]\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u865a\u62df\u73af\u5883\u5b89\u88c5","text":"cd ~\nwget -c https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh\nbash Miniconda3-latest-Linux-x86_64.sh\n \u4e00\u8def\u56de\u8f66 \u7b2c\u4e00\u6b21\u63d0\u793a\u8f93\u5165 yes/no \uff1a\u8f93\u5165 yes \u7ee7\u7eed\u4e00\u8def\u56de\u8f66 \u7b2c\u4e8c\u6b21\u63d0\u793a\uff1a\u8f93\u5165 no cd ~/miniconda3/bin\nsudo chmod 777 activate\n \u6fc0\u6d3bconda\u73af\u5883 . ./activate\n \u6dfb\u52a0\u516c\u53f8\u5185\u7f51\u6e90 conda config --add channels bioconda\nconda config --add channels conda-forge\n \u5982\u679c\u662f\u5916\u7f51\u6dfb\u52a0\u5916\u7f51\u6e90 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/\n \u5982\u679c\u8981\u5220\u9664\u6e90 conda config --remove-key channels\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"2\u3001\u5b89\u88c5\u4f9d\u8d56","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u521b\u5efa\u865a\u62df\u73af\u5883","text":"conda remove --name mmlab --all # \u79fb\u9664\u6240\u6709\u865a\u62df\u73af\u5883\n conda create -n mmlab python=3.7\n conda activate mmlab\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-pytorch","title":"\uff082\uff09\u5b89\u88c5 Pytorch","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install torch==1.7.0+cu101 torchvision==0.8.1+cu101 torchaudio==0.7.0 -f https://download.pytorch.org/whl/torch_stable.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-mmcv","title":"\uff083\uff09\u5b89\u88c5 MMCV","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install mmcv-full==1.3.3 -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.7.0/index.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"\uff084\uff09\u5b89\u88c5\u663e\u5361\u9a71\u52a8","text":"\u6839\u636e\u4f60\u7684\u663e\u5361\u4e0b\u8f7d\u5bf9\u5e94\u9a71\u52a8\uff0c\u6bd4\u5982\u6211\u7684\u663e\u5361\u4e3a GTX1660\uff0c\u9a71\u52a8\u7248\u672c\u4e3a 430\uff0c\u9a71\u52a8\u4e0b\u8f7d\u5730\u5740\uff1ahttps://www.nvidia.cn/Download/Find.aspx?lang=cn CTRL+ALT+F2 \u8fdb\u5165tty\n \u7981\u7528 nouveau \u9a71\u52a8 sudo vim /etc/modprobe.d/blacklist-nouveau.conf\n \u586b\u5165\uff1a blacklist nouveau options nouveau modeset=0\n \u5237\u65b0\u914d\u7f6e\u6587\u4ef6 sudo update-initramfs -u reboot \u91cd\u542f\u540e\u518d\u8fdb\u5165 tty \u5173\u95ed\u56fe\u50cf\u754c\u9762\uff0c\u8f93\u5165\u547d\u4ee4\u5173\u95ed\u56fe\u50cf\u754c\u9762 sudo service lightdm stop\n \u5b89\u88c5\u9a71\u52a8 sudo chmod a+x NVIDIA-Linux-x86_64-430.run\nsudo ./NVIDIA-Linux-x86_64-430.run\n reboot\u91cd\u542f\uff0cnvidia-smi\u67e5\u770b\u5b89\u88c5\u72b6\u6001\u3002\u6ce8\u610f\u770b\u4e0bcuda\u7248\u672c\uff0c10.1\uff0cdriver\u7248\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u6570\u636e\u6807\u6ce8","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u6570\u636e\u6807\u6ce8","text":"\u6807\u6ce8\u4e4b\u524d\u9700\u8981\u5148\u8f6c\u6362\u56fe\u7247\u5927\u5c0f\uff0c\u5e76\u4e14\u4ee5\u6570\u5b57\u547d\u540d\uff0c\u6bcf\u7ec4\u547d\u540d\u9012\u589e"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"\uff081\uff09\u8f6c\u6362\u5927\u5c0f\u5e76\u91cd\u547d\u540d","text":"rename_pic.py import os\nimport sys\nimport cv2\nimport time\nimport getpass\nusername = getpass.getuser()\nsource_path = f\"/home/{username}/Desktop/right_menu\" # \u56fe\u7247\u8def\u5f84\nsource_dest = os.path.join('/'.join(source_path.split(\"/\")[:-1]), 'tmp')\nif not os.path.exists(source_dest):\nos.mkdir(source_dest)\nstart_name = sys.argv[1]\nfile_name_list = list()\nfor file in os.listdir(source_path):\nif file.endswith('.png'):\nfile_name_list.append(file)\nstart_name = int(start_name)\nfor file in file_name_list:\nos.rename(os.path.join(source_path,file), os.path.join(source_path, f\"{str(start_name)}.png\"))\nstart_name += 1\ntime.sleep(1)\nfor file in os.listdir(source_path):\nimage = os.path.join(source_path, str(file))\nsrc = cv2.imread(image)\nresult = cv2.resize(src, (960, 540))\nresizeImage = os.path.join(source_dest, str(file))\nprint(resizeImage)\ncv2.imwrite(str(resizeImage), result)\ncv2.waitKey(0)\ncv2.destroyAllWindows()\ntime.sleep(1)\nos.system(f'rm -rf {source_path}/*')\nos.system(f'mv {source_dest}/* {source_path}')\nos.system(f'rm -rf {source_dest}')\nprint(\"\u4e0b\u4e00\u4e2a\u5e8f\u53f7\uff1a\", start_name)\n \u6839\u636e\u7ec8\u7aef\u8f93\u51fa\u7684\u4e0b\u4e00\u4e2a\u5e8f\u53f7\u7684\u63d0\u793a\uff0c\u6267\u884c Python \u6587\u4ef6\u7684\u65f6\u5019\u4f20\u53c2\u3002 python rename_pic.py 249\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"\uff082\uff09\u5de5\u5177\u6807\u6ce8","text":"\u4f7f\u7528\u5de5\u5177 labelImg \u6807\u6ce8 sudo pip3 install PyQt5==5.13\nsudo pip3 install labelImg\n \u7ec8\u7aef\u76f4\u63a5\u8f93\u5165 labelImg\uff0c\u56de\u8f66 \u6807\u6ce8\u6a21\u5f0f\u9009\u62e9\uff1aPascalVOC"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u667a\u80fd\u6807\u6ce8","text":"\u6253\u5f00\u5c4f\u5e55\u5f55\u5236\u8f6f\u4ef6\uff0c\u5f55\u5236\u624b\u52a8\u64cd\u4f5c\u4e00\u6b21\u6d4b\u8bd5\u7528\u4f8b\uff0c\u7136\u540e\u5c06\u5f55\u5236\u7684\u89c6\u9891\u8fdb\u884c\u5206\u5e27\uff0c\u7136\u540e\u5bf9\u6bd4\u524d\u4e24\u5e27\u56fe\u6807\u76f8\u4f3c\u5ea6\uff0c\u5254\u9664\u76f8\u4f3c\u5ea6\u8fc7\u9ad8\u7684\u56fe\u7247\uff0c\u5728\u4fdd\u8bc1\u7d20\u6750\u591a\u6837\u6027\u7684\u524d\u63d0\u4e0b\uff0c\u5254\u9664\u91cd\u590d\u591a\u4f59\u7684\u56fe\u7247\u751f\u6210\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u96c6\uff0c\u7136\u540e\u53d6\u51fa\u63a7\u4ef6\u6a21\u677f\u6570\u636e\u96c6\uff0c\u901a\u8fc7 OpenCV \u6a21\u677f\u5339\u914d\u83b7\u53d6\u63a7\u4ef6\u5728\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u56fe\u7247\u4e2d\u6240\u5728\u7684\u5de6\u4e0a\u3001\u5de6\u4e0b\u3001\u53f3\u4e0a\u3001\u53f3\u4e0b\u56db\u5904\u5750\u6807\uff0c\u4ece\u800c\u6839\u636e\u6a21\u677f\u6570\u636e\u96c6\u751f\u6210\u6807\u6ce8\u6570\u636e\u3002\u53c2\u8003\u76ee\u5f55 AnnotationMaterial"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"\uff081\uff09\u6a21\u677f\u6570\u636e\u96c6\u51c6\u5907","text":"1\u3001\u5728\u754c\u9762\u622a\u53d6\u9700\u8981\u6807\u6ce8\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u653e\u5728\u76ee\u5f55\u4e0b AnnotationMaterial/template/img 2\u3001\u7ef4\u62a4\u63a7\u4ef6\u540d\u4e0e\u5143\u7d20\u63a7\u4ef6\u7684\u952e\u5bf9\uff0c\u4e00\u4e2a\u63a7\u4ef6\u540d\u53ef\u5bf9\u5e94\u591a\u4e2a\u5143\u7d20\u63a7\u4ef6 menu:\n- menu.jpg\n- menu1.jpg\n- menu2.jpg\n- menu3.jpg\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"\uff082\uff09\u7d20\u6750\u96c6\u51c6\u5907","text":"\u5f55\u5236\u89c6\u9891\u6216\u6216\u5c4f\u5e55\u622a\u56fe\u653e\u7f6e\u76ee\u5f55 AnnotationMaterial/source"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u5f00\u59cb\u6807\u6ce8","text":"python3 AnnotationMaterial/main.py\n \u751f\u6210\u7684\u6807\u6ce8\u6570\u636e\u5b58\u653e\u5728 AnnotationMaterial/result"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#mmdetection","title":"\u56db\u3001MMDetection","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1-mmdetection","title":"1\u3001 MMDetection \u4ee3\u7801","text":"MMDetection \u662f\u4e00\u4e2a\u6709\u540d\u7684\u6df1\u5ea6\u5b66\u4e60\u76ee\u6807\u68c0\u6d4b\u5f00\u6e90\u9879\u76ee\uff0c\u4e5f\u662f openMMlab \u7684\u62db\u724c\u9879\u76ee\uff0c\u4e3a\u4ec0\u4e48\u9009\u62e9\u5b83\uff0c\u5c0f\u5b69\u513f\u6ca1\u5a18\u8bf4\u6765\u8bdd\u957f\uff0c\u611f\u5174\u8da3\u53ef\u4ee5\u81ea\u884c\u6df1\u5165\u4e86\u89e3\uff1b \u4f60\u53ef\u4ee5\u76f4\u63a5\u5728 GitHub \u4e0a\u514b\u9686\u4ee3\u7801\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u54b1\u4eec\u4ed3\u5e93\u4e0b Train \u76ee\u5f55\u4e2d\u4ee3\u7801\uff0cTrain \u4e2d\u7684\u4ee3\u7801\u4e5f\u662f\u4ece GitHub \u4e0a\u62c9\u53d6\u7684\uff0c\u4e0d\u8fc7\u6211\u4eec\u6839\u636e\u9879\u76ee\u9700\u8981\u505a\u4e86\u4e00\u4e9b\u4e8c\u6b21\u5f00\u53d1\uff0c\u63a8\u8350\u76f4\u63a5\u4f7f\u7528\u5b83\u3002 \u5982\u679c\u4f60\u60f3\u4ece GitHub \u4e0a\u62c9\uff1a git clone https://github.com/open-mmlab/mmdetection.git\n# \u4e0d\u80fd\u76f4\u63a5\u62c9\u53d6\u4e3b\u5206\u652f\uff0c\u5efa\u8bae\u4f7f\u75282.12\u7248\u672c\uff0c\u4e0d\u540c\u7684\u7248\u672c\u5bf9\u5e94\u7684mmcv\u7248\u672c\u662f\u4e0d\u540c\u7684\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-voc2coco","title":"2\u3001\u62c9\u53d6 voc2coco \u4ee3\u7801","text":"git clone https://github.com/Tony607/voc2coco.git\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-coco","title":"3\u3001\u8f6c\u6362 coco \u6570\u636e\u96c6","text":"\u5c06\u6240\u6709\u7684\u56fe\u7247\u548cxml\u6587\u4ef6\u653e\u5165train2017\uff0c\u4ece\u4e2d\u6311\u9009\u51e0\u7ec4\u653e\u5165val2017\uff08\u6d4b\u8bd5\u96c6\uff09 cd mmdetection/data/coco\npython voc2coco.py train2017 annotations/instances_train2017.json\npython voc2coco.py val2017 annotations/instances_val2017.json\n \u751f\u6210json\u6587\u4ef6"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4_1","title":"4\u3001\u4fee\u6539\u914d\u7f6e","text":"\uff081\uff09\u8bfb\u53d6\u6a21\u578b\u540d\u79f0 import json\nmodule_name = []\nwith open('./instances_train2017.json', \"r+\") as f:\njson_file = f.read()\njson_dict = json.loads(json_file)\nmodule_list = json_dict.get('categories')\nfor module_info in module_list:\nname = module_info.get('name')\nmodule_name.append(name)\nprint(module_name)\nprint(\"module_num:\", len(module_name))\n # \u6ce8\u610f\u5bf9\u6bd4instances_train2017.json\u91cc\u9762\u6a21\u578b\u540d\u79f0\u7684\u987a\u5e8f\uff0c\u4e0eCLASSES\u548ccoco_classes\u91cc\u9762\u7684\u987a\u5e8f\u4fdd\u6301\u4e00\u81f4\u3002\n \uff082\uff09\u4fee\u6539 faster_rcnn_r101_2x_coco.py mmdetection/xianjin/faster_rcnn_r101_2x_coco.py \u4fee\u653946\u884c\uff0cnum_clasess\u7684\u503c\uff0c\u65b0\u589e1\u4e2a\uff0c\u5c31 +1\uff1b \uff083\uff09\u4fee\u6539 coco.py mmdetection/mmdet/datasets/coco.py CLASSES = ()\uff0c\u5728\u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b \uff084\uff09\u4fee\u6539 class_names.py mmdetection/mmdet/core/evaluation/class_names.py coco_classes \u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#5","title":"5\u3001\u7f13\u5b58\u6e05\u7406","text":"\u5220\u9664 mmdetection/build \u76ee\u5f55 python setup.py install\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#6","title":"6\u3001\u8bad\u7ec3\u6a21\u578b","text":"\uff081\uff09\u6307\u5b9a\u81ea\u5df1\u914d\u7f6e\u7684\u8bad\u7ec3\u6a21\u578b\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py --gpus 1\n \uff082\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u6d4b\u8bd5\u96c6\u7ed3\u679c\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py xianjin/epoch_24.pth --show\n \uff083\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u51c6\u786e\u5ea6\uff1b python tools/analysis_tools/analyze_logs.py plot_curve xianjin/20210530_011907.log.json --keys acc\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#7","title":"7\u3001\u5feb\u6377\u64cd\u4f5c","text":"python3 run.py\n \u5c06\u4ee5\u4e0a 4 - 7 \u6b65\u64cd\u4f5c\u6574\u5408\u6210 run.py\uff0c\u4e00\u952e\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u4e94\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\uff1b \u670d\u52a1\u7aef\u4e00\u53f0\uff08\u76ee\u524d\u4ec5\u652f\u6301AMD\u67b6\u6784\uff09\uff1b \u91c7\u96c6\u76d2\u4e00\u4e2a \uff08ACASIS hdmi\u89c6\u9891\u91c7\u96c6\u5361\uff0chttps://item.jd.com/10024310742602.html \uff09\uff1b USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\uff1b USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff1b \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5USB\u5ef6\u957f\u7ebf\uff1b \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u63a8\u8350\u914d\u7f6e","text":"\u6267\u884c\u7528\u4f8b\u7684\u670d\u52a1\u7aef\u5bf9\u914d\u7f6e\u6ca1\u6709\u7279\u6b8a\u8981\u6c42\uff0c\u5982\u679c\u6761\u4ef6\u5141\u8bb8\u914d\u7f6e\u8d8a\u9ad8\uff0c\u8bc6\u522b\u901f\u5ea6\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n \u6d4b\u8bd5\u673a\u4e0a\u4e0d\u6267\u884c\u4efb\u4f55\u811a\u672c\uff0c\u5177\u4f53\u914d\u7f6e\u6839\u636e\u6d4b\u8bd5\u9700\u8981\u51b3\u5b9a\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#usb_mk","title":"\u516d\u3001USB_MK\u4e32\u53e3\u9a71\u52a8\u65b9\u6cd5","text":"\u4f4d\u4e8econtrol_method\u76ee\u5f55\u4e0b\u7684usb_mk.py\u6587\u4ef6 \uff081\uff09\u5217\u51fa\u53ef\u901a\u4fe1\u7684\u7aef\u53e3 python3 -m serial.tools.list_ports -v\n \uff082\uff09\u4fee\u6539\u4e32\u53e3\u7684\u6743\u9650 sudo chmod 777 /dev/ttyACM0\n \uff083\uff09\u5b9e\u4f8b\u5316USB_MK import UsbMk\nusb_mk = UsbMk(\"/dev/ttyACM0\", 9600) # \u8bbe\u5907\u9ed8\u8ba49600\u4e3a\u6ce2\u7279\u7387\uff0c\u63a7\u5236\u4f20\u8f93\u901f\u7387\n \uff084\uff09USB\u4e32\u53e3\u8bbe\u5907\u9ed8\u8ba4\u6ce2\u7279\u7387\u4e3a9600\uff08\u7ecf\u6d4b\u8bd5\u6ce2\u7279\u73879600\u51c6\u786e\u6027\u6700\u597d\uff09\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up() # \u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u6c49\u5b57\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e\n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff083\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff084\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff085\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() # \u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2\n \uff086\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff087\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff088\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e03\u3001\u65b9\u6cd5\u8c03\u7528\u5165\u53c2\u89c4\u5219","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_7","title":"1\u3001\u57fa\u7c7b","text":"class Base:\ndef __init__(self):\nself._obj = image\nself._usb = usb_mk\ndef find_element_by_ai(self, element):\nreturn self._obj.find_element(element)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_6","title":"2\u3001\u5165\u53c2\u8bf4\u660e","text":"\u56fe\u50cf\u8bc6\u522b\u65b9\u6cd5\u5165\u53e3\u4e3a Base \u7c7b\u4e0b\u7684 find_element_by_ai \u3002\u4ec5\u63a5\u53d7\u4e00\u4e2a\u53c2\u6570 element\uff0c\u7c7b\u578b\u4e3a string\u3002 \u53ef\u8bc6\u522b\u7684 string \u683c\u5f0f\uff1a \uff081\uff09\u5927\u56fe\u6807\uff08 \u56fe\u6807\u5927\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\uff0c\u4f8b\uff1a Base().find_element_by_ai(\"window\")\n \uff082\uff09\u5927\u56fe\u6807 / \u5c0f\u56fe\u6807\uff08\u56fe\u6807\u5c0f\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5c0f\u56fe\u6807\uff0c\u4f8b\uff1awindow/search_btn Base().find_element_by_ai(\"window/search_btn\")\n \uff083\uff09\u5927\u56fe\u6807 / OCR\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\u5185\u7684\u6587\u5b57\uff0c\u4f8b\uff1amenu/\u5c5e\u6027 Base().find_element_by_ai(\"menu/\u5c5e\u6027\")\n \uff084\uff09OCR\uff1a\u5168\u5c4f\u8bc6\u522b\u6587\u5b57 Base().find_element_by_ai(\"\u641c\u7d22\")\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516b\u3001\u9690\u85cf\u9f20\u6807","text":"\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u8fc7\u6765\u7684\u89c6\u9891\u6d41\uff0c\u5728\u8bc6\u522b\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u53d7\u5230\u9f20\u6807\u5f71\u54cd\uff0c\u56e0\u6b64\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u9690\u85cf\u9f20\u6807\u3002 \u5c4f\u853d\u9f20\u6807\u5149\u6807\u663e\u793a ```shell script /etc/lightdm/lightdm.conf \u5728`[Seat:*]`\u4e0b\u9762\u6dfb\u52a0\u53c2\u6570\n```shell script\nxserver-command=X -bs -core -nocursor\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e5d\u3001\u667a\u80fd\u81ea\u52a8\u5316\u7684\u610f\u4e49","text":"1\u3001\u6539\u5584 Acessibility \u5b9a\u4f4d\u7684\u7a33\u5b9a\u6027\u95ee\u9898 Acessibility \u5c5e\u6027\u5b9a\u4f4d\u5b58\u5728\u5076\u5c14\u5931\u6548\u7684\u60c5\u51b5 \uff081\uff09\u5f00\u53d1\u5728\u505a\u65b0\u9700\u6c42\u5f00\u53d1\u65f6\u53ef\u80fd\u6d89\u53ca\u5230\u5bf9\u5c5e\u6027\u6807\u7b7e\u7684\u4fee\u6539\u6216\u8005\u5c42\u7ea7\u7684\u8c03\u6574\uff0c\u53ef\u80fd\u9020\u6210\u81ea\u52a8\u5316\u7528\u4f8b\u65e0\u6cd5\u5b9a\u4f4d\u5230\u5143\u7d20\u3002 \u6bd4\u59821040\u9636\u6bb5\uff0c\u97f3\u4e50\u91cd\u6784\u7684\u65f6\u5019\uff0c\u5f00\u53d1\u5bf9\u90e8\u5206\u5c5e\u6027\u548c\u5c42\u7ea7\u505a\u4e86\u4fee\u6539\uff0c\u5bfc\u81f4\u81ea\u52a8\u5316\u7528\u4f8b\u5b9a\u4f4d\u65b9\u6cd580%\u9700\u8981\u4fee\u6539\u3002 \u5f00\u53d1\u65b0\u529f\u80fd\u7684\u65f6\u5019\u5076\u5c14\u4e5f\u4f1a\u5bf9\u5c5e\u6027\u505a\u8c03\u6574\uff0c\u9047\u52305\u6b21\u3002 \uff082\uff09\u76ee\u524d\u4e3b\u8981\u4f7f\u7528Dogtail\u8bc6\u522b\u5e94\u7528Acessibility\u5c5e\u6027\u8fdb\u884c\u5b9a\u4f4d\uff0c\u662f\u83b7\u53d6\u5e94\u7528\u5f53\u524d\u754c\u9762\u7684\u5c5e\u6027tree\uff0c\u5728\u5e94\u7528\u8df3\u8f6c\u540e\uff0cDogtail\u5b58\u5728\u65e0\u6cd5\u53ca\u65f6\u83b7\u53d6\u5f53\u524d\u5c5e\u6027\u5217\u8868\u7684\u60c5\u51b5\u3002 \u591a\u5a92\u4f53\u8c03\u7528\u6587\u7ba1\u7a97\u53e3\u7684\u65f6\u5019\uff0c\u51fa\u73b0\u627e\u4e0d\u5230\u6587\u7ba1\u91cc\u9762\u5143\u7d20\u7684\u60c5\u51b5\uff0c\u76ee\u524d\u51fa\u73b010+\u6b21\u3002 \u5e94\u7528\u8bbe\u7f6e\u9875\u9762\u7684\u5c5e\u6027\u5076\u5c14\u5b58\u5728\u627e\u4e0d\u5230\u7684\u60c5\u51b5\uff0c\u9047\u52305\u6b21\u3002 \uff083\uff09Dogtail\u5de5\u5177\u672c\u8eab\u5b58\u5728\u95ee\u9898\uff0c\u6709\u65f6\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u5019\u5f88\u6162\uff0c\u8ba9\u4eba\u65e0\u6cd5\u63a5\u53d7\uff0c\u76ee\u524d\u51fa\u73b0\u8fc7\u5f88\u591a\u6b21\u3002 \u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u95f4\u6bd4\u5e73\u5e38\u61623\u500d\uff0c\u51fa\u73b04\u6b21\u3002 2\u3001\u89e3\u51b3\u4e86\u4f7f\u7528\u7edd\u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898 \u90e8\u5206\u63a7\u4ef6\u65e0\u6cd5\u6dfb\u52a0 Acessibility \u5c5e\u6027\u4ece\u800c\u4f7f\u7528\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u51fa\u73b0\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898\u3002 \uff081\uff09\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u65b9\u6cd5\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u76ee\u6807\u56fe\u7247\u8d44\u6e90\uff0c\u5728 UI \u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u4f1a\u6d89\u53ca\u5230\u76ee\u6807\u8d44\u6e90\u7684\u66ff\u6362\uff0c\u6bd4\u8f83\u8017\u8d39\u4eba\u529b\u3002 \uff082\uff09\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6cd5\u5bf9\u6bd4\u7cbe\u5ea6\u6bd4\u8f83\u641e\uff0c\u5982\u679cUI \u7684\u53d8\u66f4\u4f1a\u9020\u6210\u65e0\u6cd5\u51c6\u786e\u5b9a\u4f4d\u5230\uff0c\u81ea\u52a8\u5316\u811a\u672c\u5065\u58ee\u6027\u4e0d\u8db3\u3002 3\u3001\u4f7f\u7528\u673a\u5668\u5206\u79bb\uff0c\u89e3\u51b3\u4e86\u81ea\u52a8\u5316\u811a\u672c\u5bf9\u5e94\u7528\u7684\u5f71\u54cd\uff0c\u771f\u5b9e\u8fd8\u539f\u7528\u6237\u7684\u4f7f\u7528\u573a\u666f \u673a\u5668\u5206\u79bb\u7684\u67b6\u6784\u8bbe\u8ba1\uff0c\u4fdd\u8bc1\u4e86\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u73af\u5883\u5b8c\u5168\u7b49\u540c\u4e8e\u7528\u6237\uff0c\u6392\u9664\u6d4b\u8bd5\u811a\u672c\u7684\u5f71\u54cd\u3002 \uff081\uff09\u76ee\u524d\u7684\u529f\u80fd\u81ea\u52a8\u5316\u662f\u5728\u6d4b\u8bd5\u673a\u4e0a\u76f4\u63a5\u8fd0\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\uff0c\u52a0\u4e0a\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u6211\u4eec\u6dfb\u52a0\u4e86\u4e00\u4e9b\u8fdb\u7a0b\u76d1\u63a7\u3001\u89c6\u9891\u5f55\u5236\u7b49\u529f\u80fd\uff0c\u81ea\u52a8\u5316\u811a\u672c\u672c\u8eab\u4f1a\u6d88\u8017\u4e00\u4e9b\u7cfb\u7edf\u8d44\u6e90\uff0c\u65e0\u6cd5\u8fd8\u539f\u771f\u662f\u7684\u7528\u6237\u4f7f\u7528\u573a\u666f\u3002 \uff082\uff09\u6027\u80fd\u6d4b\u8bd5\u9700\u8981\u6392\u9664\u5176\u4ed6\u7a0b\u5e8f\u7684\u8d44\u6e90\u6d88\u8017\u5f71\u54cd\uff0c\u6027\u80fd\u81ea\u52a8\u5316\u91c7\u7528\u673a\u5668\u5206\u79bb\uff0c\u4fdd\u8bc1\u4e86\u6027\u80fd\u6570\u636e\u7684\u51c6\u786e\u6027\u3002 \u4ee5\u524d\u7684\u7528\u4f8b\u6267\u884c\u8017\u65f6\u6ca1\u6761\u572830\u79d2\u5de6\u53f3\uff0c\u73b0\u5728\u7528\u4f8b\u8017\u65f6\u572810\u79d2\u3002 4\u3001\u89e3\u51b3\u4e86UI \u8c03\u6574\u5bfc\u81f4\u5b9a\u4f4d\u5931\u8d25\u7684\u4e0d\u7a33\u5b9a\u6027\u95ee\u9898 \uff081\uff09\u89e3\u51b3\u4e86\u56e0 UI \u8c03\u6574\u5bfc\u81f4\u63a7\u4ef6\u4f4d\u7f6e\u53d8\u5316\u6216\u8272\u5dee\u53d8\u5316\u540e\u5b9a\u4f4d\u4e0d\u51c6\u786e\u7684\u95ee\u9898\uff0c\u53ea\u8981\u63a7\u4ef6\u6587\u6848\u548c\u63a7\u4ef6\u5916\u8fb9\u6846\u65e0\u53d8\u5316\u5747\u53ef\u51c6\u786e\u5b9a\u4f4d\uff1b \uff082\uff09\u76ee\u524d\u4e5f\u4f1a\u91c7\u7528\u57fa\u4e8eUI\u7684\u5b9a\u4f4d\u65b9\u6848\uff0c\u5982\u679cUI\u4f4d\u7f6e\u6709\u8c03\u6574\uff0c\u4f1a\u5bfc\u81f4\u5143\u7d20\u65e0\u6cd5\u5b9a\u4f4d\u3002 5\u3001\u7b80\u5316\u4e86\u7528\u4f8b\u7ed3\u6784\uff0c\u63d0\u5347\u7f16\u5199\u53cb\u597d\u5ea6 \uff081\uff09\u667a\u80fd\u81ea\u52a8\u5316\u8bc6\u522b\u5143\u7d20\u7684\u65b9\u6cd5\u53ea\u6709\u4e00\u4e2a\uff0c\u5c31\u662f\u57fa\u4e8e\u6211\u4eec\u8bad\u7ec3\u7684\u6a21\u578b\u8bc6\u522b\u89c6\u9891\u6d41\u4e2d\u7684\u5143\u7d20\uff0c\u7ecf\u8fc7\u811a\u672c\u5c01\u88c5\u4e4b\u540e\uff0c\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u4e2d\u6240\u6709\u5b9a\u4f4d\u7684\u64cd\u4f5c\u90fd\u53ea\u9700\u8981\u8c03\u7528\u8fd9\u4e00\u4e2a\u65b9\u6cd5\u5c31\u884c\u4e86\uff0c\u7f16\u5199\u81ea\u52a8\u5316\u811a\u672c\u7684\u96be\u5ea6\u5927\u5927\u964d\u4f4e\u3002 \uff082\uff09\u4e5f\u662f\u7531\u4e8e\u8c03\u7528\u65b9\u6cd5\u7b80\u5355\uff0c\u5728 UI \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u4e2d\u7684\u5206\u5c42\u7ed3\u6784\u5c06\u4f1a\u51cf\u5c11\uff0c\u591a\u7ee7\u627f\u7684\u60c5\u51b5\u4f1a\u51cf\u5c11\uff0c\u81ea\u52a8\u5316\u4ee3\u7801\u7684\u8c03\u7528\u7ed3\u6784\u4e5f\u4f1a\u53d8\u5f97\u7b80\u5355\uff0c\u800c\u4e14\u529f\u80fd\u6d4b\u8bd5\u540c\u5b66\u7f16\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u66f4\u52a0\u5bb9\u6613\u4e0a\u624b\u3002 \u4ee5\u524d\u5199\u7528\u4f8b\u7531\u4e8e\u9700\u8981\u7ed3\u5408\u4e0d\u540c\u7684\u6a21\u5757\uff0c\u8c03\u7528\u4e0d\u540c\u7684\u65b9\u6cd5\uff0c\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u5e76\u5b8c\u6210\u8c03\u8bd5\u7684\u65f6\u95f4\u5e73\u5747\u572820-30\u5206\u949f\uff0c\u73b0\u5728\u5199\u7528\u4f8b\u811a\u672c\u80fd\u57285\u5206\u949f\u5de6\u53f3\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":"# =============================================\n# Attribution : Application Test Department III\n# Time : 2023/1/3\n# Author : ut003281\n# =============================================\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u7b80\u8ff0","text":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5 \u901a\u8fc7\u81ea\u52a8\u5316\u624b\u6bb5\u5bf9\u5e94\u7528\u8fdb\u884c\u6027\u80fd\u6d4b\u8bd5\uff0c\u63d0\u4f9b\u65b9\u4fbf\u7684\u73af\u5883\u90e8\u7f72\u3001\u8fd0\u884c\u914d\u7f6e\u3001\u7528\u4f8b\u7f16\u5199\u7b49\uff0c\u7528\u4e8e\u684c\u9762\u5e94\u7528\u7684\u51b7\u70ed\u542f\u52a8\u3001\u8d44\u6e90\u62f7\u8d1d\u3001\u9875\u9762\u8df3\u8f6c\u7b49\u6027\u80fd\u573a\u666f\u6d4b\u8bd5\u3002 \u4ed3\u5e93\u5730\u5740\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-perf-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u4ee3\u7801\u7ed3\u6784","text":"autotest-perf-aitest\n\u251c\u2500\u2500 apps # \u5b58\u653e\u6240\u6709\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u811a\u672c\n\u251c\u2500\u2500 conftest.py # pytest hook\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 CURRENT # \u7248\u672c\u5185\u5bb9\n\u251c\u2500\u2500 docs # \u6587\u6863\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u952e\u503c\u5bf9\u7167\u8868.pdf # \u4e32\u53e3\u7ebfcode\u4e0e\u6309\u952e\u7684\u5bf9\u7167\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u6027\u80fd\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\u6267\u884c\u5668\u4f7f\u7528\u6307\u5357.md # \u6267\u884c\u5668\u811a\u672c\u4f7f\u7528\u6307\u5357\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 USB\u4e32\u53e3\u8f6cUSB\u952e\u76d8\u9f20\u6807\u7ebf\u534f\u8bae\u6587\u4ef6V1.0.pdf # \u4e32\u53e3\u534f\u8bae\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput-0.28.2.zip # Linux\u4e0b\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\u7684\u6e90\u7801\uff0c\u53ef\u6839\u636e\u67b6\u6784\u6253\u5305\n\u251c\u2500\u2500 manage.py # \u529f\u80fd\u4e3b\u5165\u53e3\n\u251c\u2500\u2500 pytest.ini # pytst \u914d\u7f6e\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 setting # \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 client.ini # \u6d4b\u8bd5\u673a IP \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5168\u5c40\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dev_env.sh # \u5bbf\u4e3b\u673a\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose_no_relay.yml # \u65e0\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose.yml # \u6709\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker_login.sh # docker \u767b\u9646\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 res\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 black.png # \u5168\u9ed1\u56fe\u7247\uff0c\u7528\u4e8e\u4fee\u6539\u58c1\u7eb8\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_5000.deb # 3A5000 \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_amd64.deb # amd \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_arm64.deb # arm \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_mips64.deb # mips \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_sw_64.deb # sw \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 server.ini # \u670d\u52a1\u5668\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 setup.sh # \u5bb9\u5668\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 template # \u521b\u5efa app \u57fa\u7840\u811a\u672c\u6a21\u677f\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 app_template\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ${app_name}_widget.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 control-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 images\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 test_${app_name}_01_scene.json-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 test_${app_name}_01_scene.py-tpl\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 uos_docker # \u5bb9\u5668\u73af\u5883\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dockerfile\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 requirements.txt\n\u2514\u2500\u2500 src\n \u251c\u2500\u2500 analysis_save.py # \u89e3\u6790\u56fe\u7247\u6d41\u7ed3\u679c\uff0c\u6c47\u603b\u751f\u6210 excel \u62a5\u544a\n\u251c\u2500\u2500 base_widget.py # \u5c01\u88c5\u7684\u57fa\u7840\u64cd\u4f5c\uff0c\u5e94\u7528\u8c03\u7528\u7684\u4e3b\u5165\u53e3\u65b9\u6cd5\n\u251c\u2500\u2500 cmdctl.py # \u8c03\u7528\u547d\u4ee4\u884c\u4f7f\u7528\n\u251c\u2500\u2500 global_value.py # \u5168\u5c40\u53d8\u91cf\n\u251c\u2500\u2500 image_utils.py # \u56fe\u7247\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 __init__.py\n \u251c\u2500\u2500 logger_utils.py # \u65e5\u5fd7\u914d\u7f6e\n\u251c\u2500\u2500 pdocr.py # ocr \u914d\u7f6e\n\u251c\u2500\u2500 public_method.py # \u4e00\u4e9b\u65b9\u4fbf\u7684\u5c01\u4f4f\n\u251c\u2500\u2500 record.py # \u5f55\u5c4f\u76f8\u5173\n\u251c\u2500\u2500 rtk # \u8fd0\u884c\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 _base.py # \u4e00\u4e9b\u679a\u4e3e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 install_env.py # \u5b89\u88c5\u73af\u5883\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 local_runner.py # \u8fd0\u884c\u7528\u4f8b\n\u251c\u2500\u2500 serial_communication # \u4e32\u53e3\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 power_control.py # \u7ee7\u7535\u5668\u64cd\u4f5c\uff0c\u4f7f\u7528\u7ee7\u7535\u5668\u8fde\u63a5\u4e3b\u673a\u7535\u6e90\uff0c\u63a7\u5236\u5f00\u5173\u673a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 serial_common.py # \u4e32\u53e3\u516c\u5171\u65b9\u6cd5\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 usb_mk.py # \u952e\u9f20\u64cd\u4f5c\u57fa\u7840\u5c01\u88c5\n\u251c\u2500\u2500 shortcut_key.py # \u5feb\u6377\u952e\u7684\u5c01\u88c5\n\u251c\u2500\u2500 singleton.py # \u5355\u4f8b\u6a21\u5f0f\n\u251c\u2500\u2500 start_app.py # \u521b\u5efa app\n\u2514\u2500\u2500 write_xlsx.py # \u751f\u6210 excel\n# __init__.py \u6587\u4ef6\u4e3a\u6807\u8bc6\u8be5\u76ee\u5f55\u662f\u4e00\u4e2aPython\u7684\u6a21\u5757\u5305\uff0c\u9879\u76ee\u4e2d\u7684__init__.py\u5747\u4e3a\u7a7a\u6587\u4ef6\u3002\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u73af\u5883\u642d\u5efa","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\u3002 \u670d\u52a1\u7aef\u4e00\u53f0\u3002\uff08\u4ec5\u652f\u6301 AMD \u67b6\u6784\uff0c\u82e5\u9700\u5176\u4ed6\u67b6\u6784\uff0c\u54a8\u8be2\u76f8\u5173\u5f00\u53d1\u4eba\u5458\uff09 \u91c7\u96c6\u76d2\u4e00\u4e2a\u3002 \uff08ACASIS HDMI \u89c6\u9891\u91c7\u96c6\u76d2\uff0chttps://item.jd.com/100013302599.html#crumb-wrap \uff09 USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\u3002\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"\uff082\uff09\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\u3002 USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff08USB3.0 \u63a5\u53e3\u4e0a\uff09\u3002 \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5 USB \u5ef6\u957f\u7ebf\u3002 \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u670d\u52a1\u7aef\u63a8\u8350\u914d\u7f6e","text":"\u914d\u7f6e\u8d8a\u9ad8\uff0c\u89e3\u6790\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"2\u3001\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa","text":" \u6253\u5f00\u63a7\u5236\u4e2d\u5fc3\uff0c\u8d26\u6237\u8bbe\u7f6e\u4e3a\u3010\u81ea\u52a8\u767b\u5f55\u3011\u548c\u3010\u65e0\u5bc6\u7801\u767b\u5f55\u3011\uff0c\u7535\u6e90\u7ba1\u7406\u4e2d\u4f7f\u7528\u7535\u6e90\u5168\u90e8\u8bbe\u7f6e\u4e3a\u3010\u4ece\u4e0d\u3011\uff0c\u5f00\u542f\u5f00\u53d1\u8005\u6a21\u5f0f\u3002 \u6839\u636e\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u8981\u6c42\uff0c\u5bfc\u5165\u76f8\u5173\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\uff1a\u5bfc\u5165\u76f8\u518c\u3001\u5f71\u9662\u3001\u97f3\u4e50\u7684\u6d4b\u8bd5\u8d44\u6e90\u3002 \u5728\u670d\u52a1\u7aef\u6253\u5f00\u76f8\u673a\u5e94\u7528\u540e\uff0c\u5c06\u6d4b\u8bd5\u673a\u684c\u9762\u58c1\u7eb8\u66f4\u6362\u4e3a\u7eaf\u8272\u58c1\u7eb8\uff08\u6ce8\u610f\uff0c\u670d\u52a1\u7aef\u9700\u63d0\u524d\u5f00\u542f\u76f8\u673a\u540e\u518d\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u58c1\u7eb8\uff0c\u5efa\u8bae\u7eaf\u9ed1\u58c1\u7eb8 setting/res/black.png\uff09 \u5728\u6587\u4ef6\u7ba1\u7406\u5668\u4e2d\uff0c\u5c06\u9009\u9879 \u4e3b\u83dc\u5355-\u8bbe\u7f6e-\u9884\u89c8-\u56fe\u7247\u9884\u89c8 \u53d6\u6d88\u52fe\u9009\uff08\u5982\u4e0d\u53d6\u6d88\uff0c\u4f1a\u5f71\u54cd\u622a\u56fe\u5f55\u5c4f\u5e94\u7528\u7684\u6027\u80fd\u6570\u636e\uff09 \u79fb\u52a8\u6216\u5220\u9664\u7cfb\u7edf Logo \uff0c\u6392\u9664\u684c\u9762\u53f3\u4e0b\u89d2 Logo \u7684\u5f71\u54cd\uff08\u91cd\u542f\u751f\u6548\uff09\u3002 sudo mv /usr/share/deepin/uos_logo.svg ~/Pictures/\n \u5b89\u88c5\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\uff08\u5fc5\u987b\u5b89\u88c5\uff01\uff01\uff09 AMD \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_amd64.deb ARM \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_arm64.deb MIPS \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_mips64.deb 3A5000 \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_5000.deb \u5b89\u88c5\u547d\u4ee4 sudo dkpg -i xserver-xorg-input-libinput_0.28.2-2_amd64.deb\n \u5b89\u88c5\u65f6\u4f1a\u63d0\u793a\u5df2\u5b58\u5728\u76f8\u540c\u7248\u672c\uff0c\u8bf7\u5ffd\u7565\uff0c\u76f4\u63a5\u8986\u76d6\u5b89\u88c5\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u4e3b\u673a\u624d\u751f\u6548"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u670d\u52a1\u7aef\u4e00\u952e\u73af\u5883\u90e8\u7f72","text":"\u73af\u5883\u642d\u5efa\u524d\u5fc5\u987b\u5148\u8fde\u63a5\u4e0a USB \u4e32\u53e3\u7ebf\u548c\u91c7\u96c6\u76d2\u3002 \u5bbf\u4e3b\u673a\u73af\u5883\u5b89\u88c5 python3 manage.py install --env host\n \u5bb9\u5668\u73af\u5883\u5b89\u88c5 python3 manage.py install --env docker\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u56db\u3001\u914d\u7f6e\u9879","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u670d\u52a1\u7aef\u914d\u7f6e","text":"setting/config/server.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u914d\u7f6e\u9879\uff0c\u5305\u542b\u4e86\u6240\u6709\u670d\u52a1\u7aef\u6240\u6709\u7684\u53ef\u914d\u7f6e\u9879\u3002 \u672c\u5730\u65e0\u7f51\u7edc\u8fd0\u884c \u5c06\u914d\u7f6e\u9879 network=0 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u672c\u5730\u6709\u7f51\u7edc\u8fd0\u884c \u914d\u7f6e\u9879 network=1 (1)\u914d\u7f6e\u9879 client_alias= \u914d\u7f6e\u4e3a\u4f60\u8981\u6d4b\u8bd5\u7684\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5982 Alias1 \u6d4b\u8bd5\u673a\u522b\u540d\u5728 setting/config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 (2)\u914d\u7f6e\u9879 client_alias= \u4e3a\u7a7a\uff0c\u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager --client_alias Alias1\uff0c\u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002(Alias1 \u4e3a\u4f60\u914d\u7f6e\u7684\u6d4b\u8bd5\u673a\u522b\u540d) (1)\u548c(2)\u53ea\u8981\u4f7f\u7528\u5176\u4e00\u5373\u53ef\u3002 \u6709\u7f51\u7edc\u8fd0\u884c\uff0c\u4e14\u9700\u8981\u901a\u8fc7 Jenkins \u4e0a\u8fd0\u884c\u4e00\u4e2a job \uff0c\u540c\u65f6\u63a7\u5236\u591a\u53f0\u673a\u5668\u3002 \u914d\u7f6e\u9879 network=1 \u914d\u7f6e\u9879 client_alias= \u4e0d\u7528\u914d\u7f6e\uff0c\u5728\u8fd0\u884c run.sh \u7684\u65f6\u5019\u76f4\u63a5\u7a7a\u683c\u52a0\u522b\u540d\u5373\u53ef\uff0c\u6bd4\u5982\uff1a\u6d4b\u8bd5\u673a\u522b\u540d\u4e3a Alias1 \uff0c\u4e14\u5df2\u7ecf\u5728 config/client.ini \u4e2d\u914d\u7f6e\u4e86 Alias1 \u7684user ip password \uff0c\u5219\u8fd0\u884c bash run.sh Alias1 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u5728 Jenkins pipeline \u91cc\u9762\u901a\u8fc7\u5e76\u884c stage \u6216\u5e76\u884c\u8c03\u7528\u4e0b\u5c42\u4efb\u52a1\u7684\u65b9\u5f0f\u53ef\u4ee5\u5b9e\u73b0\u5927\u89c4\u6a21\u7684\u6027\u80fd\u6d4b\u8bd5\u9700\u6c42\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;1\u3001KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2\u3001KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f, e.g. TAGS = L1 or smoke\n[case_conf]\n# \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\uff0cocr\u6587\u6848\u8bc6\u522b\u8f83\u6162\uff0c\u4e0d\u63a8\u8350\u4f7f\u7528\nfind_by = stage\n# \u6700\u540e\u4e00\u4e2a\u7a33\u5b9a\u9636\u6bb5\u7684\u5e27\u6570\u8bc6\u522b\n# \u9996\u5e27\u5b58\u5728\u540e\u7684\u7b2c\u4e00\u4e2a\u5927\u4e8e\u8be5\u914d\u7f6e\u5e27\u6570\u7684\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u5c3e\u5e27\nfinal_stable_num=100\n# \u4ece\u8be5\u5e27\u6570\u5f00\u59cb\u8bc6\u522b\u6587\u6848\u6216\u56fe\u7247\uff0c\u51cf\u5c11\u5206\u6790\u65f6\u95f4\nstart_num = 150\n# \u8bc6\u522b\u7684\u6587\u6848\ntext=\n# \u8bc6\u522b\u56fe\u7247\nmatch=apps/xxx/images/match.png\n# \u8bc6\u522b\u76f8\u4f3c\u5ea6\nmatch_rate=0.9\n# \u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6bd4\u5982\u70ed\u542f\u52a8\u7528\u4f8b\uff0c\u4ece\u70b9\u51fb\u6253\u5f00\u5230\u505c\u6b62\u5f55\u5c4f\uff0c\u4e2d\u95f4\u7b49\u5f855\u79d2\uff1b\nduration = 15\n# \u5355\u6761\u7528\u4f8b\u6267\u884c\u7684\u6b21\u6570\ncount = 5\n# \u7a33\u5b9a\u9636\u6bb5\u5212\u5206\u7684\u76f8\u4f3c\u5ea6\nstable_similarity = 0.9997\n[server]\n# \u8c03\u8bd5\u6a21\u5f0f=1\uff0c\u4e3a\u5f00\u542f\u8c03\u8bd5\u6a21\u5f0f\uff0c0\u4e3a\u5173\u95ed\u3002\n# \u8c03\u8bd5\u6a21\u5f0f\u4e0b\u9ed8\u8ba4\u53ea\u6267\u884c\u4e00\u6b21\u7528\u4f8b\uff0c\u4e0d\u5173\u673a\n# \u7f16\u5199\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u5efa\u8bae\u5f00\u542fmaintain\u3002\nMAINTAIN = 0\n# \u8fd0\u884c\u7684\u73af\u5883docker\u5bb9\u5668\u73af\u5883\uff0chost\u5bbf\u4e3b\u673a\u73af\u5883\nENV = docker\n# \u670d\u52a1\u7aef\u5bc6\u7801\nPASSWORD=1\n# \u6307\u5b9a\u6d4b\u8bd5\u673a\u522b\u540d\n# \u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6bd4\u5982\uff1a\n# [AMD]\n# ip=10.8.15.86\n# user=uos\n# \u5176\u4e2d AMD \u4e3a\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5219client_alias=AMD\nCLIENT_ALIAS = x86\uff08Intel-i7\uff09\n# 1 \u5f00\u542f\u7f51\u7edc, 0 \u5173\u95ed\u7f51\u7edc\n# \uff081\uff09\u670d\u52a1\u7aef\u4e0e\u6d4b\u8bd5\u673a\u987b\u5728\u540c\u4e00\u7f51\u6bb5\u4e0b\uff0c\u4f60\u53ef\u4ee5\u5c1d\u8bd5\u5728\u670d\u52a1\u7aef\u901a\u8fc7ssh\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c\u5982\u679c\u53ef\u4ee5\u8fde\u63a5\uff0c\u8bf4\u660e\u7f51\u7edc\u6b63\u5e38\u3002\n# \uff082\uff09\u5f53input_type=FILE_NAME \u65f6\uff0c\u5fc5\u987b\u5f00\u542f\u7f51\u7edc\u3002\nNETWORK = 1\n# \u6027\u80fd\u7ed3\u679c\u7edf\u8ba1\u5355\u4f4d \u6beb\u79d2\u2014ms, \u79d2\u2014s\nUNIT=ms\n# \u6d4b\u8bd5\u673a\u5f00\u673a\u8fdb\u5165\u684c\u9762\u540e\u7b49\u5f85\u65f6\u95f4,\u5355\u4f4d/\u79d2\nSTARTUP_DELAY = 60\n# 1\u4e3a\u5220\u9664\u7f13\u5b58\uff0c0\u4e3a\u4e0d\u5220\u9664\u7f13\u5b58\n# \u7528\u4f8b\u6267\u884c\u5b8c\u540e\u4f1a\u5728report\u76ee\u5f55\u4e0b\u751f\u6210\u667a\u80fd\u89e3\u6790\u7684\u4e00\u4e9b\u7f13\u5b58\u56fe\u7247\u3002\nCACHE = 0\n# \u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u62a5\u544a\u4f1a\u4fdd\u5b58\u5728\u9879\u76ee\u4e0breport\u76ee\u5f55\u4e2d\uff1b\n# \u6307\u5b9a\u62a5\u544a\u76ee\u5f55\u5219\u5b58\u653e\u5230\u6307\u5b9a\u76ee\u5f55\u3002\nREPORT_PATH = report\n# \u670d\u52a1\u7aef\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684icon\u8d44\u6e90\u4f1a\u7f13\u5b58\u5728\u9879\u76ee\u4e0binput\u76ee\u5f55\u4e2d\nINPUT = input/\n# 1\u4e3a\u6d4b\u8bd5\u5b8c\u5173\u673a\uff0c0\u4e3a\u6d4b\u8bd5\u5b8c\u4e0d\u5173\u673a\nSHUTDOWN = 0\n# \u89e3\u6790\u8fdb\u7a0b\u6570\uff08\u4e0d\u63a8\u8350\u4fee\u6539\uff09\n# 3\u4e2a\u8fdb\u7a0b\u89e3\u6790\u89c6\u9891\u5df2\u7ecf\u80fd\u591f\u6ee1\u8db3\uff0c\u5373\u4f7f\u589e\u52a0\u8fdb\u7a0b\u6570\u4e5f\u4e0d\u80fd\u51cf\u5c11\u6574\u4f53\u8017\u65f6\n# \u53e6\u5916\u8fd8\u8981\u770bCPU\u6838\u6570\u662f\u5426\u652f\u6301\u3002\nPARSING_PROCESS = 3\n# 1\u4e3a\u4f7f\u7528\u7ee7\u7535\u5668\u5f00\u5173\u673a\uff0c0\u4e3a\u4f7f\u7528reboot\u547d\u4ee4\u91cd\u542f\u3002\u4f9d\u8d56\u7ee7\u7535\u5668\u786c\u4ef6\u8bbe\u5907\uff0c\u9700\u8981\u4f7f\u7528\u8054\u7cfb\u5f00\u53d1\u8005\nRELAY = 0\n# \u83b7\u53d6\u6d4b\u8bd5\u5e94\u7528\u7684\u7248\u672c, %s \u5360\u4f4d\u5e94\u7528\u540d\n# \u5982\u679c\u8be5\u914d\u7f6e\u4e3a\u7a7a\uff0c\u5219\u4e0d\u83b7\u53d6\u5e94\u7528\u7684\u7248\u672c\u4fe1\u606f\u3002\nCOMMAND = apt policy %s 2>/dev/null|grep \"\u5df2\u5b89\u88c5\"|awk -F \"\uff1a\" \"{print \\$2}\"\n# \u5173\u673a\u7b49\u5f85\u5f00\u542f\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6839\u636e\u6d4b\u8bd5\u673a\u6027\u80fd\u4e0d\u540c\uff0c\u5f00\u5173\u673a\u8017\u65f6\u53ef\u80fd\u4e0d\u540c\uff0c\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u673a\u60c5\u51b5\u914d\u7f6e\u3002\nSHUTDOWN_DELAY = 30\n# \u53ef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u56fe\u7247\u683c\u5f0f\uff0c\u4ee5\u82f1\u6587\u9017\u53f7\u9694\u5f00\u3002\n# \u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u76ee\u524d\u6211\u4eec\u4ec5\u9a8c\u8bc1\u4e86jpg,jpeg,png\u8fd9\u4e09\u79cd\u5e38\u7528\u7684\u56fe\u7247\u683c\u5f0f\u3002\nINPUT_TYPES = jpg,jpeg,png\n# \u6027\u80fd\u5206\u6790\u8865\u5e27\uff0c\u7b49\u4e8e\u6216\u4f4e\u4e8e\u8be5\u503c\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u9700\u8981\u51cf\u6389\u3002\nUN_STAB_START = 3\n# \u670d\u52a1\u7aef\u83b7\u53d6\u6d4b\u8bd5\u673a\u56fe\u50cf\u7684\u5e27\u7387\uff0c\u5373\u6bcf\u79d2\u83b7\u53d6\u591a\u5c11\u5f20\u6d4b\u8bd5\u673a\u4e0a\u7684\u56fe\u50cf\u3002\n# \u9ed8\u8ba4\u5e27\u7387\u4e3a30\u5e27/\u79d2\uff0c\u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u53ef\u80fd\u4f1a\u5bf9\u89e3\u6790\u7ed3\u679c\u9020\u6210\u504f\u5dee\u3002\nFPS = 30\n# \u4ee5\u4e0b\u573a\u666f\u7c7b\u578b\u4f1a\u91cd\u542f\u6d4b\u8bd5\u673a,\u591a\u79cd\u573a\u666f\u4f7f\u7528\u9017\u53f7\u9694\u5f00\nSCENE = cold\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = http://10.8.13.78:8890\n#\u5c4f\u5e55\u56fe\u7247\u4e34\u65f6\u5b58\u653e\u4f4d\u7f6e\nSCREEN_CACHE = /tmp/screen\n# =======================================\n[log]\n# \u65e5\u5fd7\u7ea7\u522b\uff0cOFF\u3001FATAL\u3001ERROR\u3001WARN\u3001INFO\u3001DEBUG\u3001ALL\n# \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u65e5\u5fd7\u8f93\u51fa\uff0clog_cli=INFO\u8868\u793a \u4ec5\u8f93\u51faINFO\u53ca\u4ee5\u4e0a\u7ea7\u522b\u7684\u65e5\u5fd7\u3002\nLOG_LEVEL = DEBUG\n# \u65e5\u5fd7\u6587\u4ef6\u4fdd\u5b58\u8def\u5f84\nLOG_PATH= logs\n# =======================================\n[dockerhub]\n# \u5bb9\u5668\u767b\u9646\u8d26\u53f7\nDOCKER_USER = user\n# \u5bb9\u5668\u767b\u9646\u5bc6\u7801\nDOCKER_PASSWORD = User1234\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u6d4b\u8bd5\u673a\u914d\u7f6e","text":"setting/config/client.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u4fe1\u606f\u3002 \u6709\u7f51\u7edc\u7684\u60c5\u51b5\u4e0b\uff0c\u670d\u52a1\u7aef\u9700\u8981\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u56e0\u6b64\u4f60\u9700\u8981\u5199\u5165 \u6d4b\u8bd5\u673a\u522b\u540d \u3001 user \u3001ip\u3001 password \u3002 # \u6d4b\u8bd5\u673a\u522b\u540d\n[Alias1] # \u6d4b\u8bd5\u673aip\nip=10.8.15.86 # \u6d4b\u8bd5\u673a\u7528\u6237\u540d\nuser=uos\n \u547d\u540d\u5efa\u8bae\uff1aAliasA1\u3001AliasA2\u3001AliasB1\u3001AliasB2\uff0c\u4e0d\u8981\u91cd\u540d\u3002 \u65e0\u7f51\u7edc\u60c5\u51b5\u4e0b\uff0c\u4ec5\u9700\u8981\u5173\u6ce8\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\u9879 width=\u3001 height= \u5373\u53ef\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a [client]\n# \u9ed8\u8ba4\u6d4b\u8bd5\u673a\u7528\u6237\u540d\uff0c\u5bc6\u7801\uff0cip\nip=\nuser=\n# \u6d4b\u8bd5\u673a\u5bc6\u7801\npassword=1\n# \u6d4b\u8bd5\u673a\u4e3b\u9898\ntheme=bloom\n# \u6d4b\u8bd5\u673aicon\u76ee\u5f55\npath=/usr/share/icons\n# \u7cfb\u7edfdesktop\u6587\u4ef6\u7684\u5b58\u653e\u76ee\u5f55\uff0cUOS\u7cfb\u7edf\u9ed8\u8ba4\u4e3a/usr/share/applications\ndesktop_path=/usr/share/applications\n# \u7528\u4e8e\u5224\u65ad\u6d4b\u8bd5\u673a\u662f\u5426\u5f00\u673a\u8fdb\u5165\u684c\u9762\u7684\u8bc6\u522b\u6807\u8bc6\u3002\n# 1\u3001\u901a\u8fc7\u684c\u9762\u56fe\u6807\u8bc6\u522b\u3002\n# - type=FILE_NAME\u65f6\uff0c\u670d\u52a1\u5668\u548c\u6d4b\u8bd5\u673a\u5fc5\u987b\u5728\u540c\u4e00\u5c40\u57df\u7f51\u5185\u3002\n# - power_on=dde-computer\u8868\u793a\u901a\u8fc7\u684c\u9762\u8ba1\u7b97\u673a\u56fe\u6807\u5224\u65ad\u5f00\u673a\u8fdb\u5165\u684c\u9762\u3002\n# 2\u3001\u901a\u8fc7\u672c\u5730\u56fe\u7247\u4f5c\u4e3a\u5f00\u673a\u8bc6\u522b\u3002\n# - type= \u4f20\u5165\u4e3a\u56fe\u7247\u683c\u5f0f\uff0ctype\u652f\u6301\u7684\u7c7b\u578b\u5305\u542b\u5728server.ini\u5185\u914d\u7f6e\u9879input_type=jpg,jpeg,png\u3002\n# - power_on= \u4f20\u5165\u7684\u662f\u672c\u5730\u56fe\u7247\u7684\u8def\u5f84\u3002\ntype=FILE_NAME\npower_on=dde-computer\n# \u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\uff08\u6d4b\u8bd5\u673a\u8fde\u63a5\u91c7\u96c6\u76d2\uff0c\u91c7\u96c6\u76d2\u7684\u5206\u8fa8\u7387\uff09\nheight=1080\nwidth=1920\n[AliasA1] ip=10.8.15.86\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n[AliasA2]\nip=10.8.15.20\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_2","title":"3\u3001\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e","text":"\u968f\u7740\u6d4b\u8bd5\u573a\u666f\u7684\u4e0d\u65ad\u5f15\u5165\uff0c\u53d1\u73b0\u73b0\u6709\u670d\u52a1\u7aef\u91cc\u7684\u914d\u7f6e\u9879\u5e76\u4e0d\u9002\u7528\u4e8e\u6240\u6709\u7684\u6027\u80fd\u573a\u666f\uff0c\u4e8e\u662f\u5c06\u670d\u52a1\u7aef\u914d\u7f6e\u8fdb\u884c\u4e00\u4e2a\u63d0\u53d6\uff0c\u53ef\u505a\u5355\u4e2a\u573a\u666f\u7684\u4e2a\u6027\u5316\u914d\u7f6e\uff0c\u5f53\u7136\u539f\u6765\u7684\u670d\u52a1\u7aef\u914d\u7f6e\u529f\u80fd\u4fdd\u7559\uff0c\u53ea\u662f\u5f53\u4f60\u914d\u7f6e\u4e86\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e\u540e\uff0c\u4f18\u5148\u4f7f\u7528\u4e2a\u6027\u5316\u914d\u7f6e\u91cc\u9762\u7684\u5185\u5bb9\uff0c\u4ee5\u4e0b\u662f\u5bf9\u4e2a\u6027\u5316\u914d\u7f6e\u7684\u4ecb\u7ecd\u3002 \u76ee\u524d\u6bcf\u4e00\u4e2a py \u6587\u4ef6\u5bf9\u5e94\u4e00\u4e2a\u6027\u80fd\u6d4b\u8bd5\u573a\u666f\uff0c\u4e8e\u662f\u5728\u540c\u7ea7\u76ee\u5f55\u4e0b\u521b\u5efa\u4e00\u4e2a\u4e0e\u4e4b\u540c\u540d\u7684 json \u6587\u4ef6\uff0c\u4f5c\u4e3a\u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6 apps\n\u251c\u2500\u2500 album\n \u251c\u2500\u2500 test_album_01_start.json # \u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6\n\u2514\u2500\u2500 test_album_01_start.py # \u6027\u80fd\u573a\u666f\u6587\u4ef6\n \u4ee5\u4e0b\u662f\u5bf9 json \u6587\u4ef6\u4e2d\u914d\u7f6e\u7684\u89e3\u91ca\uff0c\u82e5\u67d0\u9879\u914d\u7f6e\u4e0d\u9700\u8981\uff0c\u53ef\u4ee5\u7f3a\u5931\uff0c\u4f46\u4e0d\u80fd\u4e3a\u7a7a\uff1b {\n\"title\": \"test_album_start\", # \u6807\u9898\uff1b\u5fc5\u987b\n\"app_name\": \"deepin-album\", # \u573a\u666f\u6240\u5c5e\u7684\u5e94\u7528\uff1b\u5fc5\u987b\n\"scene\": \"hot\", # \u573a\u666f\u522b\u540d\uff1b\u5fc5\u987b\n\"icon\": [\"deepin-album\"], # \u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684icon\u5230\u670d\u52a1\u7aef\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\uff1b\u53ef\u7f3a\u5931\n# \u6ce8\u610f\uff1a\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684desktop\u6587\u4ef6\u540d\u4e3adeepin-album.desktop\uff0c\n# \u53ea\u9700\u8981\u5199deepin-album\u5373\u53ef\uff0c\u201c.desktop\u201d\u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002\n\"size\": { # \u56fe\u7247\u5bf9\u6bd4\u7684\u533a\u57df\u8bbe\u7f6e\u9879\uff0c\u67d0\u4e9b\u5e94\u7528\u5f53\u524d\u5c4f\u5e55\u7684\u90e8\u5206\u533a\u57df\u9700\u8981\u5c06\u5176\u53bb\u6389\uff0c\u53ef\u4ee5\u8bbe\u7f6e\u6b64\u9879\uff0c\u5982\u679c\u6ca1\u6709\u5219\u53ef\u4e0d\u5199\uff1b\u53ef\u786e\u5b9e\n\"x-coordinate\": 0, # \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n\"y-coordinate\": 0, # \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n\"width\": 850, # \u6a2a\u5411\u957f\u5ea6\n\"height\": 1920 # \u7eb5\u5411\u9ad8\u5ea6\n},\n\"count\": 5, # \u573a\u666f\u6267\u884c\u7684\u6b21\u6570\uff1b\u5fc5\u987b\n\"duration\": 5, # \u8be5\u6761\u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff0c\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7279\u5b9a\u573a\u666f\uff0c\u8be5\u914d\u7f6e\u4e3a\u53ef\u9009\u9879\uff0c\u8986\u76d6 server.ini \u4e2d\u7684\u914d\u7f6e\uff1b\u53ef\u7f3a\u5931\n\"stable_similarity\": 0.9997, # \u6027\u80fd\u573a\u666f\u5206\u9636\u6bb5\u65f6\u7684\u56fe\u7247\u76f8\u4f3c\u5ea6\u5bf9\u6bd4\uff0c\u524d\u540e\u56fe\u7247\u4f4e\u4e8e\u8be5\u503c\uff0c\u5219\u5206\u4e3a\u4e0d\u7a33\u5b9a\u9636\u6bb5\uff1b\u53ef\u7f3a\u5931\n\"find_by\": \"stage\", # \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\n\"final_stable_num\": 100, # \u67e5\u627e\u6700\u540e\u4e00\u4e2a\u5927\u4e8e\u8be5\u503c\u7684\u7a33\u5b9a\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u7684\u5c3e\u796f\uff1b\u53ef\u7f3a\u5931\n\"start_num\": 150,\n\"text\": \"\", # ocr\u8bc6\u522b\u7684\u6587\u6848\n\"match\": \"apps/xxx/images/match.png\", # \u56fe\u50cf\u5339\u914d\u7684\u56fe\u7247\u6587\u4ef6\u8def\u5f84\n\"match_rate\": 0.9 # \u5339\u914d\u76f8\u4f3c\u5ea6\n}\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e94\u3001\u6d4b\u8bd5\u6d41\u7a0b","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516d\u3001\u7528\u4f8b\u7f16\u5199\u53ca\u65b9\u6cd5\u53c2\u6570\u6307\u5f15","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"1\u3001\u7528\u4f8b\u5b9e\u4f8b\u8bf4\u660e","text":"# \u6807\u51c6\u5e93\u5bfc\u5165\nfrom time import sleep\n# \u5bfc\u5165\u4e09\u65b9\u5e93pytest\nimport pytest\n# \u5bfc\u5165\u7528\u4f8b\u6267\u884c\u8981\u7528\u5230\u7684Widget\u7c7b\nfrom src.base_widget import BaseWidget\nclass TestStart:\n# class\u7ea7\u522b\u7684fixture\uff0c\u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u6267\u884c\u3002autouse=True \u81ea\u52a8\u5728\u5f53\u524d\u4f5c\u7528\u57df\u4e0b\u4f7f\u7528\u3002\n@pytest.fixture(scope=\"class\", autouse=True)\n# \u6d4b\u8bd5\u70ed\u542f\u52a8\u4e4b\u524d\u9700\u8981\u9884\u542f\u52a8\u3002\ndef application_pre_start(self):\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().right_click_element(\"deepin-album\")\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().click_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\")\nsleep(2)\n# \u5feb\u6377\u952e\u5173\u95ed\u7a97\u53e3\nBaseWidget().hot_key(\"alt\", \"f4\")\nsleep(2)\n# \u9ed8\u8ba4\u4e3afunction\u7ea7\u522b\u7684fixture\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\uff0cclass\u7ea7\u522bfixture\u6267\u884c\u4e4b\u540e\u6267\u884c\u3002\n@pytest.fixture(autouse=True)\ndef setup_start(self):\n# \u53f3\u952e\u70b9\u51fb deepin-album \u56fe\u6807\nBaseWidget().right_click_element(\"deepin-album\")\n# \u79fb\u52a8\u5230\u53f3\u952e\u83dc\u5355\u4e2d\u6253\u5f00\uff08open.png\uff09\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().move_to(*BaseWidget().find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))\n# \u7b49\u5f85\u79fb\u52a8\u5b8c\u6210\nsleep(0.5)\ndef test_album_start(self):\n# \u70b9\u51fb\u201c\u6253\u5f00\u201d\nBaseWidget().click() \n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"2\u3001\u65b9\u6cd5\u53c2\u6570\u8bf4\u660e","text":"2.1\u3001find_element \u65b9\u6cd5 def find_element(element: str, input_type: str = \"FILE_NAME\", fill_color_position: tuple = (-1, -1), size: tuple = (25, 70)):\npass\n \u53c2\u6570 element \u548c input_type \uff081\uff09\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u5143\u7d20 - `input_type` \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a `FIEL_NAME` \uff0c\u8868\u793a\u901a\u8fc7\u5e94\u7528 `icon` \u5bfb\u627e\u5143\u7d20\uff0c\u6b64\u65b9\u6cd5\u4f1a\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u5e94\u7528 `icon` \u56fe\u6807\u3002\n \u4e3e\u4f8b\uff1a\u9ed8\u8ba4\u60c5\u51b5\u4e0b input_type \u53c2\u6570\u4e0d\u9700\u8981\u4f20\u5165\uff0c find_element(\"deepin-album\")\uff0c\u8868\u793a\u901a\u8fc7 deepin-album \u7684\u5e94\u7528 icon \u6765\u83b7\u53d6\u5750\u6807\uff0c\u6ce8\u610f\uff0c\u6b64\u65f6\u4f20\u5165\u7684 deepin-album \u53c2\u6570\u5b9e\u9645\u662f desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u548c2.3\u4e2d\u7684 icon \u53d8\u91cf\u4e00\u81f4\u3002 \u6211\u4eec\u5efa\u8bae\u4f18\u5148\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\uff0c\u4f46\u6b64\u65b9\u6cd5\u4f9d\u8d56\u7f51\u7edc\uff0c\u8bf7\u6839\u636e\u6d4b\u8bd5\u73af\u5883\u5b9e\u9645\u60c5\u51b5\u9009\u62e9\u3002 \uff082\uff09\u901a\u8fc7\u672c\u5730\u56fe\u7247\u8bc6\u522b\u5143\u7d20 - \u53c2\u6570 `input_type` \u4f20\u5165\u56fe\u7247\u683c\u5f0f\uff0c\u6bd4\u5982\u622a\u53d6\u7684\u672c\u5730\u56fe\u7247\u683c\u5f0f\u4e3a `png`\uff0c\u90a3\u4e48 `input_type=\"png\"`\uff0c\u6b64\u65f6\u53c2\u6570 `element ` \u4f20\u5165\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5efa\u8bae\u5b58\u653e\u5728\u5bf9\u5e94\u7684\u4ea7\u54c1 `apps/app/picture/` \u76ee\u5f55\u4e0b\uff0c\u8def\u5f84\u4e3a\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u7684\u76f8\u5bf9\u8def\u5f84\u3002\n- \u4e3e\u4f8b\uff1a`find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))`\uff0c\u8868\u793a\u901a\u8fc7\u672c\u5730\u56fe\u7247 `open.png` \u8bc6\u522b\u5143\u7d20\u3002\n \u53c2\u6570 fill_color_position fill_color_position \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (-1, -1)\uff0c(-1, -1) \u8868\u793a\u53d6\u5c4f\u5e55\u4e2d\u53f3\u4e0b\u89d2\u6700\u540e\u4e00\u4e2a\u50cf\u7d20\u70b9\u4f5c\u4e3a\u586b\u5145\u5750\u6807\uff0c\u5728 1920x1080 \u5c4f\u5e55\u5206\u8fa8\u7387\u4e0b\u5373\u5b9e\u9645\u5750\u6807\u4e3a (1919, 1079) \uff0c\u8fd9\u6837\u7684\u5199\u6cd5\u53ef\u4ee5\u9002\u914d\u4e0d\u540c\u5927\u5c0f\u7684\u5c4f\u5e55\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0d\u540c\u65b9\u4f4d\uff1a \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0b\u65b9\uff0c\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u4e0d\u9700\u8981\u4f20\u5165\u8be5\u53c2\u6570\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u5de6\u8fb9\uff0cfill_color_position=(1, 1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u53f3\u8fb9\uff0cfill_color_position=(-1, -1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0a\u8fb9\uff0cfill_color_position=(1, 1) \u4ece\u684c\u9762\u542f\u52a8\u5e94\u7528\uff0c\u5219\u9700\u8981\u4f20\u5165\u9664\u4efb\u52a1\u680f\u4ee5\u5916\u5176\u4ed6\u4f4d\u7f6e\u7684\u5750\u6807\uff0c\u6bd4\u5982(100, 100)\uff0c\u53ea\u8981\u8fd9\u4e2a\u5750\u6807\u4e3a\u9664\u5e94\u7528\u548c\u4efb\u52a1\u680f\u533a\u57df\u90fd\u53ef\u4ee5\u3002 \u4ece\u542f\u52a8\u5668\u91cc\u9762\u542f\u52a8\u5e94\u7528\uff0c\u9700\u8981\u586b\u5145\u7684\u5750\u6807\u4e3a\u542f\u52a8\u5668\u533a\u57df\u3002 \u6ce8\uff1a\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u65f6\uff0c\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684 icon \u539f\u6587\u4ef6\u4e3a svg \u77e2\u91cf\u56fe\uff0c\u8f6c\u6362\u4e3a png \u4e4b\u540e\u9700\u8981\u586b\u5145\u8fb9\u7f18\u900f\u660e\u90e8\u5206\u3002 \u53c2\u6570 size size \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (25, 70)\uff0c\u8868\u793a\u6d4b\u8bd5\u673a\u4e0a dock \u680f\u4e0a\u5e94\u7528\u56fe\u6807\u7684\u5927\u5c0f\u8303\u56f4\u3002 UOS \u7cfb\u7edf dock \u680f\u662f\u53ef\u4ee5\u4e0a\u4e0b\u62d6\u52a8\u5927\u5c0f\u7684\uff0c\u968f\u7740 dock \u680f\u5927\u5c0f\u6539\u53d8\uff0c\u5e94\u7528\u56fe\u6807\u7684\u8303\u56f4\u4e3a25\u523070\u4e4b\u95f4\u3002 \u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u64cd\u4f5c\u7cfb\u7edf\u4e0a dock \u680f\u5927\u5c0f\u4e0d\u4e00\u6837\uff0c\u53ef\u4ee5\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u4f20\u5165\u5927\u5c0f\u8303\u56f4\u3002 2.2\u3001click_element\u3001 right_click_element\uff0c double_click_element \u8fd9\u51e0\u4e2a\u65b9\u6cd5\u53c2\u6570\u89c4\u5219\u4e0e find_element \u65b9\u6cd5\u4e00\u6837\u3002\u4ed6\u4eec\u5b9e\u9645\u4e0a\u662f\u5728 find_element \u65b9\u6cd5\u57fa\u7840\u4e4b\u4e0a\u505a\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u589e\u52a0\u4e86\u9f20\u6807\u7684\u52a8\u4f5c\uff0c\u5982\u679c\u4f60\u4e0d\u60f3\u4f7f\u7528\u8fd9\u51e0\u4e2a\u65b9\u6cd5\uff0c\u5728\u7528\u4f8b\u4e2d\u4e5f\u53ef\u4ee5\u901a\u8fc7 find_element \u83b7\u53d6\u5230\u5750\u6807\uff0c\u7136\u540e\u5c06\u5750\u6807\u4f20\u5165\u5230\u952e\u9f20\u7684\u65b9\u6cd5\u4e2d\uff0c\u53ef\u4ee5\u5b9e\u73b0\u540c\u6837\u7684\u6548\u679c\u3002 2.3\u3001\u7528\u4f8b\u7c7b\u4e2d\u6709\u4e2a\u7c7b\u53d8\u91cf icon = [\"deepin-album\"] \u9700\u8981\u7279\u6b8a\u8bf4\u660e\uff0c\u5217\u8868\u4e2d\u7684\u5143\u7d20\u4e3a\u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709 icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684 icon \u5230\u670d\u52a1\u7aef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528 desktop \u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684 desktop \u6587\u4ef6\u540d\u4e3a deepin-album.desktop\uff0c\u53ea\u9700\u8981\u5199 deepin-album \u5373\u53ef\uff0c.desktop \u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e03\u3001\u6267\u884c\u5165\u53e3","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"1\u3001\u7528\u4f8b\u7ec4\u7ec7","text":"\u5728 setting/config/server.ini \u6587\u4ef6\u4e2d APP_NAME= \u5b57\u6bb5\u4e3a\u7528\u4f8b\u7684\u6267\u884c\u7684\u76ee\u5f55\uff0c\u9ed8\u8ba4\u4e3a apps \u76ee\u5f55\u4e0b\u6240\u6709\u7528\u4f8b\u3002\u5982\u679c\u4f60\u60f3\u6307\u5b9a\u6267\u884c\u67d0\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4f60\u53ef\u4ee5\u5c06\u8be5\u914d\u7f6e\u9879\u6307\u5b9a\u5230\u5e94\u7528\u7684\u7528\u4f8b\u76ee\u5f55\uff0c\u6bd4\u5982\uff1aAPP_NAME=deepin_album\uff0c \u8868\u793a\u6267\u884c\u76f8\u518c\u76ee\u5f55\u4e0b\u7684\u7528\u4f8b\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a python3 manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music\n -k KEYWORDS, --keywords KEYWORDS\n \u7528\u4f8b\u7684\u5173\u952e\u8bcd\n -t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e\n --log_level LOG_LEVEL \u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n --env {host,docker} \u5728\u5bbf\u4e3b\u673a\u6216\u5bb9\u5668\u73af\u5883\u6267\u884c\n --client_alias \u9009\u62e9\u6d4b\u8bd5\u673a\u522b\u540d, \u53ef\u9009\u9879\u4e3aclient.ini\u4e2d\u5df2\u914d\u7f6e, \u9ed8\u8ba4\u503c\u4e3a zx-x86.\n --count \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a python3 manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\" --env docker\n \u6ce8\uff1a\u5728\u5bb9\u5668\u4e2d\u6267\u884c\u65f6\uff0c\u82e5\u5f3a\u5236\u9000\u51fa\uff0c\u5bb9\u5668\u5e76\u4e0d\u4f1a\u505c\u6b62\u8fd0\u884c\uff01"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_9","title":"\u516b\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1json","title":"1\u3001Json \u62a5\u544a","text":"\u81ea\u7814\u89c6\u9891\u89e3\u6790\u5de5\u5177\u4f1a\u5bf9\u5355\u6761\u7528\u4f8b\u6267\u884c\u4e00\u8f6e\u751f\u6210\u4e00\u4e2a json \u6587\u4ef6\uff0c\u5b58\u653e\u4e8e report/{app_name}/{scene}/{run_num} \u76ee\u5f55\u4e0b\uff0c\u547d\u540d\u683c\u5f0f\u4e3a\uff1a report.json json \u5185\u5bb9\u4e3e\u4f8b\uff1a [\n{\n\"Stab1\": {\n\"images\": [1,2...150,151],\n\"startStub\": 0,\n\"type\": \"Stab\"\n}\n},\n{\n\"Stab2\": {\n\"images\": [152,153...169,170],\n\"startStub\": 1,\n\"type\": \"UnStab\"\n}\n},\n{\n\"Stab3\": {\n\"images\": [171,172...300,301],\n\"startStub\": 0,\n\"type\": \"UnStab\"\n}\n}\n]\n \u8bf4\u660e\uff1a Stab \uff1a\u8868\u793a\u89e3\u6790\u8fc7\u7a0b\u4e2d\u4e0d\u540c\u7684\u9636\u6bb5\u3002 images \uff1a\u8868\u793a\u6bcf\u4e00\u5e27\u7684\u56fe\u7247\u5e8f\u53f7\u3002 startStub\uff1a \u4e3a\u8bc6\u522b\u5c3e\u5e27\u7684\u9636\u6bb5\u8868\u793a\uff0c\u5982\u679c \"startStub\": 1 \uff0c\u8bf4\u660e\u5c3e\u5e27\u51fa\u73b0\u5728\u8be5\u9636\u6bb5\u3002 type\uff1a \u4e3a Stab \u6216 UnStab \uff0c\u8868\u793a\u7a33\u5b9a\u9636\u6bb5\u6216\u4e0d\u7a33\u5b9a\u9636\u6bb5\u3002 \u5404\u9636\u6bb5\u6709\u5e27\u6570\u8865\u507f\uff0c\u9ed8\u8ba4\u8865\u507f\u7684\u5e27\u6570\u4e3a 3 \u5e27\uff08\u53ef\u4ee5\u901a\u8fc7 server.ini \u91cc\u9762 un_stab_start=3 \u8fdb\u884c\u914d\u7f6e\uff09\uff0c\u8868\u793a\u5c0f\u4e8e\u7b49\u4e8e 3 \u5e27\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u524d\u540e\u5747\u9700\u8981\u51cf\u6389\u3002 \u5e94\u7528\u542f\u52a8\u9636\u6bb5\u5c31\u662f\u5728 Stab2 \u9636\u6bb5\uff0c\u542f\u52a8\u65f6\u95f4\u4e3a\uff1a171 \u51cf 151 \u518d\u51cf\u6389\u524d\u540e\u8865\u507f\u5e27\u6570 6 \u5e27\uff0c\u5373 14 \u5e27\uff0c\u89c6\u9891\u5e27\u7387 30 \u5e27/\u79d2\uff0c\u56e0\u6b64\u542f\u52a8\u8017\u65f6\u4e3a\uff1a14 * 33 = 462 ms"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2excel","title":"2\u3001Excel \u62a5\u544a","text":"\u6240\u6709\u7528\u4f8b\u6267\u884c\u5e76\u89e3\u6790\u5b8c\u4e4b\u540e\u4f1a report \u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a\u6c47\u603b\u6570\u636e\u7684 Excel \u6587\u4ef6\uff0c\u6587\u4ef6\u540d\u4e3a\uff1a{time}_perf_time.xlsx\u3002 \u6ce8\u610f\uff0creport \u76ee\u5f55\u4e3a\u53ef\u914d\u7f6e\u9879\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u4f1a\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u751f\u6210\uff0c\u5982\u679c\u4f60\u5c06 report\uff0c\u6307\u5b9a\u5230\u9879\u76ee\u4e0b\u5176\u4ed6\u8def\u5f84\uff0c\u5219\u4f1a\u5728\u5bf9\u5e94\u7684\u8def\u5f84\u4e0b\u751f\u6210 json \u548c Excel \u6587\u4ef6\u3002 \u4f60\u4e5f\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8bfb\u53d6\u6240\u6709 json / excel \u62a5\u544a\u7684\u6570\u636e\uff0c\u751f\u6210\u4f60\u81ea\u5df1\u60f3\u8981\u7684\u4e00\u4e9b\u6d4b\u8bd5\u62a5\u544a\u5f62\u5f0f\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#usb","title":"\u4e5d\u3001USB \u4e32\u53e3\u9a71\u52a8\u952e\u9f20\u65b9\u6cd5","text":"\u4f4d\u4e8e src/utils/control/serial_communication \u76ee\u5f55\u4e0b\u7684 usb_mk.py \u6587\u4ef6 usb_mk = UsbMk()\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up()\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u652f\u6301\u4f20\u5165\u6c49\u5b57\uff0c\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click()\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() \n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() \n \uff084\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() \n \uff085\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() \n \uff086\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() \n \uff087\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff088\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff0810\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_10","title":"\u5341\u3001\u7ee7\u7535\u5668\u63a7\u5236\u4e3b\u673a\u5f00\u673a/\u91cd\u542f","text":"\uff08\u82e5\u4e0d\u4f7f\u7528\u7ee7\u7535\u5668\uff0c\u53ef\u5ffd\u7565\u8be5\u6b65\u9aa4\uff0c\u6267\u884c\u65f6\u4f1a\u901a\u8fc7\u547d\u4ee4 reboot\uff09"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u7ee7\u7535\u5668\u8bbe\u5907","text":"LCUS-2 \u578b \u53cc\u8def USB \u667a\u80fd\u4e32\u53e3\u63a7\u5236\u7ee7\u7535\u5668\u3002 https://item.taobao.com/item.htm?spm=a1z09.2.0.0.41d72e8dUYx2pi&id=582653718178&_u=i25r20ia6a2e "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2usb","title":"2\u3001USB \u5ef6\u957f\u7ebf","text":"\u666e\u901a\u7684 USB \u7ebf\u5373\u53ef\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_3","title":"3\u3001\u675c\u90a6\u7ebf","text":"3.1\u300140P \u6bcd\u5bf9\u516c\u675c\u90a6\u7ebf\u3002 3.2\u3001\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"4\u3001\u5b89\u88c5\u56fe\u6587\u6559\u7a0b","text":"4.1\u3001\u4f7f\u7528 USB \u5ef6\u957f\u7ebf\u8fde\u63a5\u63a7\u5236\u7aef\u548c\u7ee7\u7535\u5668\u3002 4.2\u3001\u5728\u7ee7\u7535\u5668\u5e38\u7aef\u548c\u516c\u5171\u7aef\u5747\u8fde\u63a5\u4e00\u6839\u675c\u90a6\u7ebf\u3002 4.3\u3001\u5728\u4e3b\u677f\u4e0a\u5f00\u673a\u9488\u548c\u91cd\u542f\u9488\u4e0a\u63d2\u4e0a\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 4.4\u3001\u5c06\u5f00\u673a\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76841\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1\u5de6\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 4.5\u3001\u5c06\u91cd\u542f\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76842\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1 \u53f3\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 \u82e5\u60f3\u4fdd\u7559\u539f\u7535\u6e90\u5f00\u5173\u7684\u7535\u6e90\u706f\uff0c\u53ef\u6839\u636e\u5982\u4e0a\u56fe\u6240\u793a\uff0c\u4f7f\u7528\u675c\u90a6\u7ebf\u8fde\u63a5\u4e3b\u677f\u4e0a\u7684\u7535\u6e90\u706f\u548c\u539f\u7535\u6e90\u5f00\u5173"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_11","title":"\u5341\u4e00\u3001\u5e38\u89c1\u95ee\u9898\u8bf4\u660e","text":"1\u3001ERROR: for uos Cannot restart container 2301b1a1395d7959ee6523d61b61c87084649af530786cdb8fb5b3ecbcbd1068: linux runtime spec devices: error gathering device information while adding custom device \"/dev/ttyACM0\": no such file or directory \u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u8fde\u63a5\u72b6\u6001\uff0c\u67e5\u770b /dev/ttyACM0 \u662f\u5426\u5b58\u5728\uff0c\u82e5\u5b58\u5728 /dev/ttyACMn\uff08n\u4e3a\u4efb\u610f\u6570\u5b57\uff09\uff0c\u91cd\u542f\u7535\u8111\u89e3\u51b3\u3002 2\u3001Error response from daemon: Container 5e700fdc769e8c74666d68a7f2bc3de58268b4594cf88706609d59f8dbc7362d is not running \u5bb9\u5668\u542f\u52a8\u5931\u8d25 1\uff09\u68c0\u67e5\u54ea\u4e00\u4e2a\u5bb9\u5668\u672a\u542f\u52a8 sudo docker container ls # \u5217\u51fa\u8fd0\u884c\u4e2d\u7684 Docker \u5bb9\u5668\n 2\uff09\u7f3a\u5c11 uos \u5bb9\u5668\uff0c\u68c0\u67e5 USB \u4e32\u53e3\u8fde\u63a5\u7ebf\u548c\u91c7\u96c6\u76d2\u8fde\u63a5\u7ebf\u662f\u5426\u6b63\u5e38\uff0c\u91cd\u542f\u540e\u6267\u884c bash install/setup.up # \u91cd\u65b0\u5b8c\u6574\u90e8\u7f72\u73af\u5883\n \u6216\u6267\u884c sudo docker-compose up -d --build # \u4ec5\u91cd\u65b0\u6784\u5efa Docker \u955c\u50cf\n 3\u3001\u82e5\u90e8\u7f72\u65f6\u63d0\u793a\u6302\u8f7d ttyACM0\u3001video0 \u5931\u8d25\uff0c\u8bf7\u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u53ca\u91c7\u96c6\u76d2\u662f\u5426\u63a5\u89e6\u826f\u597d\uff0c\u82e5\u63a5\u89e6\u826f\u597d\uff0c\u91cd\u542f\u5373\u53ef\u89e3\u51b3\u3002 4\u3001\u82e5\u51fa\u73b0\u56fe\u7247\u80fd\u8bc6\u522b\uff0c\u4f46\u662f\u9f20\u6807\u672a\u79fb\u52a8\u64cd\u4f5c\u65f6\uff0c\u5b89\u88c5\u7edd\u5bf9\u9f20\u6807\u64cd\u4f5c\u7684\u4f9d\u8d56\u5305\uff0c\u89c1\u7b2c\u4e09\u8282\u7b2c\u4e8c\u5c0f\u8282\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u6d4b\u8bd5\u673a\u3002 5\u3001\u7531\u4e8e\u901a\u8fc7\u91c7\u96c6\u5361\u83b7\u53d6\u7684\u6d4b\u8bd5\u673a\u5b9e\u65f6\u753b\u9762\uff0c\u5305\u542b\u4e86\u9f20\u6807\u7684\u6837\u5f0f\uff0c\u6240\u4ee5\u5bf9\u56fe\u7247\u8bc6\u522b\u65f6\uff0c\u9f20\u6807\u82e5\u505c\u7559\u5728\u56fe\u6807\u4e0a\u5c42\uff0c\u5219\u4f1a\u5bf9\u8bc6\u522b\u7ed3\u679c\u9020\u6210\u5f71\u54cd\uff0c\u9700\u8981\u5c06\u9f20\u6807\u79fb\u52a8\u81f3\u5176\u4ed6\u4f4d\u7f6e\uff0c\u6216\u8005\u9690\u85cf\u9f20\u6807\u89e3\u51b3\u3002 6\u3001Excel \u62a5\u544a\u4e2d\uff0c\u6d4b\u8bd5\u573a\u666f\u5217\u4e0e\u7528\u4f8b\u4e2d\u7684\u4e0d\u4e00\u81f4\uff0c\u5173\u952e\u5b57scene\u3001app_name\u3001\u67b6\u6784\u522b\u540d\uff0c\u4e0d\u80fd\u5305\u542b\u4e0b\u5212\u7ebf\u548c\u82f1\u6587\u7b26\u53f7\u7684\u5706\u62ec\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/","title":"\u6846\u67b6\u529f\u80fd\u4ecb\u7ecd","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2023/1/12\n# Author : Mikigo\n# =============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_2","title":"\u4e00\u3001\u4e00\u53e5\u8bdd\u7b80\u4ecb","text":"\u6b64\u6587\u6863\u4e3b\u8981\u60f3\u5bf9 YouQu \u6846\u67b6\u4e00\u4e9b\u91cd\u70b9\u7684\u529f\u80fd\u505a\u8be6\u7ec6\u7684\u4ecb\u7ecd\uff0c\u5305\u62ec\u5bf9\u4e00\u4e9b\u529f\u80fd\u5f00\u53d1\u7684\u80cc\u666f\u3001\u8981\u89e3\u51b3\u7684\u95ee\u9898\u3001\u5b9e\u73b0\u903b\u8f91\u3001\u4ee3\u7801\u7b49\u65b9\u9762\u7684\u4ecb\u7ecd\uff0c\u4ee5\u6b64\u8ba9\u5927\u5bb6\u80fd\u66f4\u52a0\u6e05\u6670\u7684\u7406\u89e3\u5404\u9879\u529f\u80fd\uff0c\u4ece\u800c\u5728\u4f7f\u7528\u7684\u65f6\u5019\u80fd\u66f4\u52a0\u7684\u5f97\u5fc3\u5e94\u624b\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_3","title":"\u4e8c\u3001\u56fe\u50cf\u8bc6\u522b","text":"\u56fe\u50cf\u8bc6\u522b\u5728 UI \u81ea\u52a8\u5316\u4e2d\u662f\u4e0d\u53ef\u7f3a\u5c11\u7684\uff0c\u5e02\u9762\u4e0a\u751a\u81f3\u6709\u5b8c\u5168\u57fa\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\uff0c\u6bd4\u5982 Airtest\u3001Sikuli \u7b49\uff0c\u5728\u6e38\u620f\u7b49\u7279\u5b9a\u9886\u57df\u4e5f\u6709\u4e0d\u9519\u7684\u6548\u679c\uff0c\u8fd9\u4e9b\u5de5\u5177\u5b9e\u9645\u4e0a\u4e5f\u662f\u7528\u7684 OpenCV \u8fdb\u884c\u4e86\u5c01\u88c5\uff0cYouQu \u6846\u67b6\u57fa\u4e8e OpenCV \u5f00\u53d1\u4e86\u81ea\u5df1\u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\uff0c\u5b83\u53ef\u4ee5\u65b9\u4fbf\u7684\u7528\u4e8e\u754c\u9762\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u65ad\u8a00\uff1b YouQu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u51e0\u4e4e\u6ee1\u8db3\u4e86\u4f60\u7684\u6240\u6709\u8981\u6c42\uff0c\u6211\u4eec\u5728\u957f\u65f6\u95f4\u7684\u601d\u8003\u548c\u6478\u7d22\u4e2d\uff0c\u9488\u5bf9\u5e38\u89c4\u573a\u666f\u53ca\u4e00\u4e9b\u7279\u6b8a\u573a\u666f\u63a2\u7d22\u9664\u4e86\u4e00\u4e9b\u5b9e\u7528\u4e14\u6709\u6548\u7684\u65b9\u6848\uff0c\u4e14\u542c\u6211\u6162\u6162\u9053\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1","title":"1\u3001\u5e38\u89c4\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5e38\u89c4\u8bc6\u522b\u5f88\u597d\u7406\u89e3\uff0c\u4e00\u53e5\u8bdd\u8bb2\u5c31\u662f\uff0c\u8981\u83b7\u53d6\u5230\u76ee\u6807\u5143\u7d20\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u3002 \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u5728\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u9700\u8981\u83b7\u53d6\u7684\u5750\u6807\u662f\u76f8\u5bf9\u4e8e\u6574\u4e2a\u5c4f\u5e55\u7684\u5750\u6807\uff0c\u6211\u4eec\u53ef\u4ee5\u622a\u53d6\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u56fe\u7247\uff08screen\uff09\uff1b \u5728\u5143\u7d20\u8bc6\u522b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u622a\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5c0f\u56fe\u8fdb\u884c\u8bc6\u522b\uff0c\u6bd4\u5982\u622a\u53d6\u64ad\u653e\u6309\u94ae\uff1a \u90a3\u4e48\u5b9e\u9645\u4e0a\uff0c\u5143\u7d20\u5b9a\u4f4d\u7684\u95ee\u9898\u5c31\u8f6c\u6362\u4e3a\uff0c\u5c06\u622a\u56fe\u7684\u5c0f\u56fe\uff08play_btn\uff09\u62ff\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u5927\u56fe\uff08screen\uff09\u4e2d\u53bb\u505a\u5339\u914d\uff0c\u5982\u679c\u5339\u914d\u6210\u529f\uff0c\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff08 x, y \uff09\u5373\u53ef\u3002 \u4e3a\u4e86\u65b9\u4fbf\u63cf\u8ff0\uff0c\u4ee5\u4e0b\u6211\u5c06\u6574\u4e2a\u5c4f\u5e55\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5927\u56fe\uff0c\u67d0\u4e2a\u5143\u7d20\u56fe\u7247\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5c0f\u56fe\u3002 \u57fa\u4e8e OpenCV \u7684\u6a21\u677f\u5339\u914d cv.matchTemplate() \u529f\u80fd\uff0c\u6211\u4eec\u5b9e\u73b0\u4e86\u56fe\u50cf\u5b9a\u4f4d\u7684\u529f\u80fd\uff0c\u6846\u67b6\u63d0\u4f9b\u4e86\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u5e95\u5c42\u63a5\u53e3\uff08\u4e00\u822c\u4e0d\u5bf9\u4e0a\u5c42\u63d0\u4f9b\u8c03\u7528\uff09\uff1a def _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\n# \u8be6\u7ec6\u4ee3\u7801\u592a\u957f\u4e0d\u8d34\u4e86\uff0c\u611f\u5174\u8da3\u8bf7\u67e5\u770b\u6e90\u7801\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001image_path image_path \u662f\u5c0f\u56fe\u7684\u7edd\u5bf9\u8def\u5f84; \u901a\u5e38\u5728 AT \u5de5\u7a0b\u91cc\u9762\uff0c\u6211\u4eec\u7ea6\u5b9a\u5c06\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u5b9e\u9645\u7684\u5143\u7d20\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1aplay_btn.png \uff1b \u7528\u4e8e\u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 case/assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1amusic_001.png \uff1b \u8fd9\u6837\u662f\u4e3a\u4e86\u65b9\u4fbf\u7ba1\u7406\u548c\u7ef4\u62a4\u3002 2\u3001rate \u56fe\u50cf\u8bc6\u522b\u7684\u7684\u5339\u914d\u5ea6\u6216\u8005\u8bf4\u76f8\u4f3c\u5ea6\uff0c\u6846\u67b6\u9ed8\u8ba4\u7684\u914d\u7f6e\u4e3a 0.9\uff0c\u4e5f\u5c31\u662f\u8bf4\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u5b58\u5728\u4e00\u4e2a\u76f8\u4f3c\u5ea6 90% \u7684\u56fe\u6807\u5373\u8fd4\u56de\u5176\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff1b \u5982\u679c\u4f60\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u8c03\u6574\u8bc6\u522b\u5ea6\uff0c\u4f60\u53ef\u4ee5\u5728\u8c03\u7528\u51fd\u6570\u7684\u65f6\u5019\uff0c\u4f20\u5165\u4e0d\u540c\u7684\u8bc6\u522b\u5ea6\u7684\u503c\u3002 3\u3001multiple \u9ed8\u8ba4\u60c5\u51b5\u4e0b multiple=False\uff0c\u8868\u793a\u53ea\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u7b2c\u4e00\u4e2a\uff0c\u5982\u679c multiple=True \u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\uff0c\u56e0\u4e3a\u5927\u56fe\u4e2d\u53ef\u80fd\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u5c0f\u56fe\uff0c\u5728\u67d0\u4e9b\u573a\u666f\u4e0b\u4f60\u53ef\u80fd\u9700\u8981\u5168\u90e8\u83b7\u53d6\u5230\u6240\u6709\u5339\u914d\u5230\u7684\u5750\u6807\u3002 4\u3001picture_abspath \u9ed8\u8ba4\u60c5\u51b5\u4e0b picture_abspath=None \u8868\u793a\u5927\u56fe\u4e3a\u622a\u53d6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u5982\u679c\u4f60\u4e0d\u5e0c\u671b\u5927\u56fe\u662f\u5c4f\u5e55\u7684\u622a\u56fe\uff0c\u800c\u662f\u4f60\u81ea\u5b9a\u4e49\u4f20\u5165\u7684\u67d0\u4e2a\u56fe\u7247\uff0c\u4f60\u53ea\u9700\u8981\u5c06\u4f60\u7684\u56fe\u7247\u8def\u5f84\u4f20\u9012\u7ed9\u8fd9\u4e2a\u53c2\u6570\u5c31\u884c\uff0c\u6bd4\u5982\uff1a picture_abspath=\"~/Desktop/big.png\" \uff1b 5\u3001screen_bbox \u5927\u56fe\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u622a\u53d6\u6574\u4e2a\u5c4f\u5e55\uff0cscreen_bbox = [x, y, w, h] \u53ef\u4ee5\u6307\u5b9a\u622a\u53d6\u5c4f\u5e55\u4e2d\u7684\u56fa\u5b9a\u533a\u57df\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\uff0c\u53ef\u4ee5\u6392\u9664\u90e8\u5206\u533a\u57df\u5bf9\u8bc6\u522b\u7ed3\u679c\u7684\u5f71\u54cd\u3002 \u3010\u9690\u5f0f\u7b49\u5f85\u3011 \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\uff0c\u6709\u65f6\u5019\u9875\u9762\u8df3\u8f6c\u6709\u5ef6\u65f6\uff0c\u6709\u53ef\u80fd\u5b58\u5728\u8bc6\u522b\u7684\u90a3\u4e00\u523b\u9875\u9762\u4e5f\u6ca1\u6709\u8df3\u8f6c\u51fa\u6765\uff0c\u6216\u8005\u6216\u8005\u8bc6\u522b\u7684\u90a3\u4e00\u523b\uff1b \u56e0\u6b64\u6211\u4eec\u9700\u8981\u4e00\u79cd\u7b49\u5f85\u673a\u5236\uff0c\u5373\u5728\u4e00\u5b9a\u7684\u65f6\u95f4\u5185\uff0c\u5982\u679c\u8bc6\u522b\u4e0d\u5230\uff0c\u91cd\u590d\u53bb\u8bc6\u522b\uff1a def find_image(\ncls,\n*widget, rate: [float, int] = None,\nmultiple: bool = False,\nmatch_number: int = None,\npicture_abspath: str = None,\nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u5728\u5c4f\u5e55\u4e2d\u533a\u5bfb\u627e\u5c0f\u56fe\uff0c\u8fd4\u56de\u5750\u6807\uff0c\n \u5982\u679c\u627e\u4e0d\u5230\uff0c\u6839\u636e\u914d\u7f6e\u91cd\u8bd5\u6b21\u6570\uff0c\u6bcf\u6b21\u95f4\u96941\u79d2\n :param widget: \u6a21\u677f\u56fe\u7247\u8def\u5f84\n :param rate: \u76f8\u4f3c\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param match_number: \u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\n :return: \u5750\u6807\u5143\u7ec4\n \"\"\"\nif rate is None:\nrate = float(GlobalConfig.IMAGE_RATE)\ntry:\nfor element in widget:\nfor _ in range((match_number or int(GlobalConfig.IMAGE_MATCH_NUMBER)) + 1):\nlocate = cls._match_image_by_opencv(\nelement,\nrate,\nmultiple=multiple,\npicture_abspath=picture_abspath,\nscreen_bbox=screen_bbox\n)\nif not locate:\nsleep(int(GlobalConfig.IMAGE_MATCH_WAIT_TIME))\nelse:\nreturn locate\nraise TemplateElementNotFound(*widget)\nexcept Exception as e:\nraise e\n \u53c2\u6570 match_number \u7528\u4e8e\u63a7\u5236\u91cd\u590d\u8bc6\u522b\u7684\u6b21\u6570\uff0c\u9ed8\u8ba4\u4e0d\u4f20\u53c2\uff0c\u53d6\u5168\u5c40\u914d\u7f6e setting/globalconfig.ini \u91cc\u9762\u7684 IMAGE_MATCH_NUMBER \u914d\u7f6e\u9879\u7684\u503c\uff0c\u9ed8\u8ba4IMAGE_MATCH_NUMBER = 1\uff0c\u5373\u91cd\u8bd5 1 \u6b21\uff1b find_image \u662f\u6846\u67b6\u63d0\u4f9b\u7684\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u51fd\u6570\u63a5\u53e3\uff0c\u8fd9\u4e2a\u51fd\u6570\u63d0\u4f9b\u4e86\u9690\u5f0f\u7b49\u5f85\u7684\u529f\u80fd\uff0c\u4e14\u5305\u542b\u4e0a\u9762\u4ecb\u7ecd\u7684 _match_image_by_opencv \u51fd\u6570\u7684\u6240\u6709\u529f\u80fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2","title":"2\u3001\u6c14\u6ce1\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u6c14\u6ce1\u8bc6\u522b\u6307\u7684\u662f\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\u8981\u5b9a\u4f4d\u7684\u5143\u7d20\u662f\u4e00\u4e9b\u4f1a\u6d88\u5931\u7684\u5c0f\u5f39\u7a97\uff0c\u8fd9\u7c7b\u573a\u666f\u5728\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\u5c31\u53ef\u80fd\u5b58\u5728\u4e0d\u7a33\u5b9a\u6027\uff0c\u6709\u53ef\u80fd\u56fe\u50cf\u8bc6\u522b\u7684\u65f6\u5019\u6c14\u6ce1\u5df2\u7ecf\u6d88\u5931\u4e86\uff0c\u4e5f\u6709\u53ef\u80fd\u6c14\u6ce1\u51fa\u73b0\u7684\u65f6\u95f4\u592a\u77ed\u4e86\uff0c\u4e0d\u5bb9\u6613\u6355\u6349\u5230\uff0c\u5c31\u50cf\u6c14\u6ce1\u4e00\u6837\uff0c\u51fa\u73b0\u4e00\u4e0b\u5c31\u6d88\u5931\uff0c\u56e0\u6b64\u6211\u4eec\u5f62\u8c61\u7684\u79f0\u4e4b\u4e3a \u201c\u6c14\u6ce1\u8bc6\u522b\u201d\uff1b \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u4e3a\u4e86\u80fd\u7a33\u5b9a\u7684\u8bc6\u522b\u6c14\u6ce1\u7c7b\u573a\u666f\uff0c\u6211\u4eec\u91c7\u7528\u7684\u65b9\u6848\u662f\uff1a \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\uff08\u5305\u542b\u6c14\u6ce1\u4ece\u51fa\u73b0\u5230\u6d88\u5931\uff09\uff0c\u4e0d\u505c\u7684\u622a\u53d6\u8fd9\u6bb5\u65f6\u95f4\u5185\u7684\u5927\u56fe\uff0c\u4ee5\u6b64\u786e\u4fdd\u5728\u622a\u53d6\u7684\u4e00\u5806\u56fe\u7247\u4e2d\uff0c\u80af\u5b9a\u6709\u81f3\u5c11\u4e00\u5f20\u56fe\u7247\u80fd\u6355\u6349\u5230\u6c14\u6ce1\uff0c\u6700\u540e\u518d\u5bf9\u8fd9\u4e00\u5806\u56fe\u7247\u9010\u4e2a\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def get_during(\ncls,\nimage_path: str,\nscreen_time: [float, int],\nrate: float = None,\npause: [int, float] = None,\nmax_range: int = 10000\n):\n\"\"\"\n \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u622a\u56fe\u591a\u5f20\u56fe\u7247\u8fdb\u884c\u8bc6\u522b\uff0c\u5176\u4e2d\u6709\u4e00\u5f20\u56fe\u7247\u8bc6\u522b\u6210\u529f\u5373\u8fd4\u56de\u7ed3\u679c;\n \u9002\u7528\u4e8e\u6c14\u6ce1\u7c7b\u7684\u65ad\u8a00\uff0c\u6bd4\u5982\u6c14\u6ce1\u57281\u79d2\u5185\u6d88\u5931\uff0c\u5982\u679c\u7528\u5e38\u89c4\u7684\u56fe\u50cf\u8bc6\u522b\u5219\u6709\u53ef\u80fd\u65e0\u6cd5\u8bc6\u522b\u5230\uff1b\n :param image_path: \u8981\u8bc6\u522b\u7684\u6a21\u677f\u56fe\u7247\uff1b\n :param screen_time: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff1b\n :param rate: \u8bc6\u522b\u7387\uff1b\n :param pause: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u4e0d\u95f4\u9694\uff1b\n :param max_range: \u622a\u56fe\u7684\u6700\u5927\u6b21\u6570\uff0c\u8fd9\u662f\u4e00\u4e2a\u9884\u8bbe\u503c\uff0c\u4e00\u822c\u60c5\u51b5\u4e0b\u4e0d\u6d89\u53ca\u4fee\u6539\uff1b\n \"\"\"\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001screen_time \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5728\u6b64\u65f6\u95f4\u5185\u4f1a\u4e0d\u65ad\u7684\u8fdb\u884c\u622a\u56fe\u64cd\u4f5c\uff0c\u5c31\u50cf\u5f55\u5236\u89c6\u9891\u4e00\u6837\uff1b 2\u3001pause \u6bcf\u6b21\u622a\u53d6\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u4e00\u523b\u4e0d\u505c\u7684\u622a\u56fe\uff0c\u5982\u679c\u4f60\u60f3\u6bcf\u6b21\u622a\u56fe\u5b58\u5728\u4e00\u4e9b\u95f4\u9694\u65f6\u95f4\u4f20\u5165\u5bf9\u5e94\u7684\u65f6\u95f4\u95f4\u9694\u5373\u53ef\uff0c\u5355\u4f4d\u662f\u79d2\uff0c\u6bd4\u5982\uff1apause = 0.03\uff0c\u8868\u793a 30 ms\uff0c\u76f8\u5f53\u4e8e\u5e27\u7387\u4e3a 30 \u5e27\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-opencv","title":"3\u3001\u4e0d\u4f9d\u8d56 OpenCV \u7684\u56fe\u50cf\u8bc6\u522b\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31","title":"3.1\u3001\u81ea\u7814\u56fe\u50cf\u8bc6\u522b\u6280\u672f","text":"\u3010\u539f\u7406\u3011 \u4e3a\u4e86\u5b9e\u73b0\u8bc6\u522b\u56fe\u50cf\u7684\u76ee\u7684\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u5c06\u56fe\u7247\u7684\u6bcf\u4e2a\u50cf\u7d20\u7684RGB\u503c\uff0c\u4e0e\u6574\u4e2a\u5c4f\u5e55\u4e2d\u7684RGB\u8fdb\u884c\u5bf9\u6bd4\uff0c\u5982\u679c\u5c0f\u56fe\u4e0a\u7684RGB\u503c\u4e0e\u5bf9\u5e94\u5927\u56fe\u4f4d\u7f6e\u7684RGB\u90fd\u76f8\u7b49\uff0c\u5219\u5339\u914d\u6210\u529f\uff0c\u5373\u53ef\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u70b9\u3002 1\u3001\u8bfb\u53d6\u5c0f\u56fe\u548c\u5927\u56fe\u7684RGB\u503c \uff081\uff09\u5c0f\u56fe\u7684RGB\u503c small_data = small_pic.load() # load()\u4f1a\u5c06\u56fe\u7247\u7684RGB\u503c\u83b7\u53d6\u5230\uff0c\u6570\u636e\u683c\u5f0f\u4e3a\u4e00\u4e2a\u4e8c\u7ef4\u5217\u8868\uff0c\u8d4b\u503c\u7ed9\u4e00\u4e2a\u53d8\u91cfsmall_data\u3002\n \uff082\uff09\u5927\u56fe\u7684RGB\u503c big_data = big_pic.load()\n 2\u3001\u5c06\u5c0f\u56fe\u4e0e\u5927\u56fe\u7684RGB\u503c\u8fdb\u884c\u5339\u914d \uff081\uff09\u5339\u914d\u4ece\u5927\u56fe\u7684\u5750\u6807\uff080\uff0c0\uff09\u5f00\u59cb\u5339\u914d\uff0c\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff082\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\uff080\uff0c0\uff09\u5bf9\u5e94\u7684\u6240\u6709\u5c0f\u56fe\u7684RGB\u503c\u4e0d\u76f8\u7b49\uff0c\u5219\u79fb\u52a8\u5230\u4e0b\u4e00\u4e2a\u5750\u6807\u70b9\uff081\uff0c0\uff09\uff0c\u540c\u6837\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff083\uff09\u6309\u7167\u8fd9\u6837\u7684\u89c4\u5f8b\u5c06\u8fd9\u4e00\u884c\u6bcf\u79fb\u52a8\u4e00\u4e2a\u5750\u6807\u70b9\uff0c\u90fd\u5c06\u5c0f\u56fe\u6240\u6709\u7684RGB\u4e0e\u5bf9\u5e94\u5927\u56fe\u7684\u503c\u8fdb\u884c\u5339\u914d\uff1b \uff084\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\u5176\u4e2d\u4e00\u4e2a\u5750\u6807\u70b9\u4e0a\u5339\u914d\u5230\u4e86\u5c0f\u56fe\u7684\u6240\u6709RGB\u503c\uff0c\u5219\u6b64\u65f6\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\u70b9\uff1b \uff085\uff09\u5982\u679c\u5339\u914d\u4e86\u5927\u56fe\u6240\u6709\u7684\u5750\u6807\u70b9\uff0c\u90fd\u6ca1\u6709\u5339\u914d\u5230\uff0c\u5219\u8bf4\u660e\u5927\u56fe\u4e2d\u4e0d\u5b58\u5728\u5c0f\u56fe\uff0c\u5339\u914d\u5931\u8d25\uff1b \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 class ImageRgb:\n@staticmethod\ndef _check_match(_x, _y, small, bdata, sdata, rate):\n\"\"\"\n Matching degree of small graph and large graph matching\n \"\"\"\n@staticmethod\ndef _pre_random_point(small):\n\"\"\"\n Pre matching, take 10-20 points at random each time,\n and take coordinates randomly in the small graph\n \"\"\"\n@staticmethod\ndef _pre_random_match(_x, _y, point_list, bdata, sdata, rate):\n\"\"\"\n In the small graph, several points are randomly\n selected for matching, and the matching degree is\n also set for the random points\n \"\"\"\n@classmethod\ndef match_image_by_rgb(cls, image_name=None, image_path=None, rate=0.9):\n\"\"\"\n By comparing the RGB values of the small image with the large\n image on the screen, the coordinates of the small image on\n the screen are returned.\n \"\"\"\n \u901a\u8fc7 match_image_by_rgb() \u8fd9\u4e2a\u51fd\u6570\uff0c\u4f20\u5165\u76ee\u6807\u5c0f\u56fe\u7684\u6587\u4ef6\u540d\u79f0\uff0c\u5373\u53ef\u8fd4\u56de\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u3002 \u6709\u540c\u5b66\u8981\u95ee\u4e86\uff0c\u6709 OpenCV \u5e72\u561b\u4e0d\u7528\uff0c\u6709\u5fc5\u8981\u81ea\u5df1\u5b9e\u73b0\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u529f\u80fd\u5417\uff0c\u4f60\u4eec\u662f\u4e0d\u662f\u95f2\u7684\u554a\uff1f \u8fd9\u4e48\u95ee\u7684\u8bdd\uff0c\u5c0f\u4e86\uff0c\u683c\u5c40\u5c0f\u4e86\uff1b\u6211\u4eec\u81ea\u5df1\u5b9e\u73b0\u4e3b\u8981\u6709\u51e0\u65b9\u9762\u539f\u56e0\uff1a \u51cf\u5c11\u73af\u5883\u4f9d\u8d56\uff0c\u5373\u4e0d\u7528\u5b89\u88c5 OpenCV\uff0c\u6211\u4eec\u4e5f\u80fd\u5b9e\u73b0\u5176\u529f\u80fd\uff0c\u73af\u5883\u4f9d\u8d56\u8fd9\u5757\u540e\u9762\u4f1a\u5355\u72ec\u8be6\u7ec6\u8bb2\uff0c\u51cf\u5c11\u73af\u5883\u4f9d\u8d56\u5bf9\u4e8e\u4efb\u4f55\u8f6f\u4ef6\u5de5\u7a0b\u90fd\u975e\u5e38\u91cd\u8981\uff1b OpenCV \u5728\u5176\u4ed6\u56fd\u4ea7 CPU \u67b6\u6784\u4e0a\u5b89\u88c5\u5e76\u4e0d\u80fd\u4fdd\u8bc1100%\u6210\u529f\uff0c\u751a\u81f3\u6709\u6ca1\u6709\u53ef\u80fd\u5728\u4e00\u4e9b\u67b6\u6784\u4e0a\u538b\u6839\u513f\u5c31\u4e0d\u80fd\u5b89\u88c5\u4f7f\u7528 OpenCV \uff1f \u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 OpenCV \uff1f\u5c31\u50cf\u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 Windows \u5462\uff1f\u8fd9\u4e9b\u95ee\u9898\u503c\u5f97\u601d\u8003\u3002 \u5f53\u7136\uff0c\u6211\u4eec\u627f\u8ba4\u8fd9\u5957\u65b9\u6848\uff0c\u867d\u7136\u8bc6\u522b\u51c6\u786e\u7387\u6ca1\u95ee\u9898\uff0c\u4f46\u5728\u8bc6\u522b\u6548\u7387\u4e0a\u8fd8\u6ca1\u6709\u8fbe\u5230 OpenCV \u6a21\u677f\u5339\u914d\u7684\u6548\u679c\uff0c\u6211\u4eec\u7684\u65b9\u6848\u6bcf\u6b21\u8bc6\u522b\u5728 1.5s \u5de6\u53f3\uff0c\u800c OpenCV \u5728 1s \u5de6\u53f3\uff1b \u6574\u4f53\u8bc6\u522b\u6548\u679c\u6765\u8bb2\uff0c\u6211\u8ba4\u4e3a\u8fd8\u662f\u53ef\u4ee5\u63a5\u53d7\u7684\uff0c\u4e5f\u5e0c\u671b\u6709\u5fd7\u4e4b\u58eb\u80fd\u4e00\u8d77\u4f18\u5316\u6b64\u65b9\u6848\uff0c\u4e00\u8d77\u6280\u672f\u62a5\u56fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32-rpc","title":"3.2\u3001\u57fa\u4e8e RPC \u670d\u52a1\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b","text":"\u5728\u8fdc\u7a0b\u670d\u52a1\u5668\u4e0a\u90e8\u7f72 OpenCV \u7684\u73af\u5883\uff0c\u5e76\u5c06\u5176\u90e8\u7f72\u4e3a RPC \u670d\u52a1\uff0c\u6d4b\u8bd5\u673a\u4e0a\u4e0d\u7528\u5b89\u88c5 OpenCV \u4f9d\u8d56\uff0c\u800c\u662f\u901a\u8fc7\u8bf7\u6c42 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u3010\u539f\u7406\u3011 \u6d4b\u8bd5\u673a\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u56fe\u7247\u4ee5\u53ca\u6a21\u677f\u56fe\u7247\uff0c\u53d1\u9001\u7ed9 RPC \u670d\u52a1\u7aef\uff0c\u670d\u52a1\u7aef\u62ff\u5230\u4e24\u5f20\u56fe\u7247\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u6700\u540e\u5c06\u8bc6\u522b\u7ed3\u679c\u8fd4\u56de\u7ed9\u6d4b\u8bd5\u673a\uff1b \u8981\u7279\u6b8a\u8bf4\u660e\u7684\u662f\uff1a RPC \u662f\u4e00\u79cd\u534f\u8bae\uff0c\u8bb8\u591a\u8bed\u8a00\u90fd\u662f\u652f\u6301\u7684\uff0c\u6bd4\u5982\u8bf4\u670d\u52a1\u7aef\u4e5f\u53ef\u4ee5\u7528 C++ \u6765\u5b9e\u73b0\uff0c\u5ba2\u6237\u7aef\u4f7f\u7528 Python \u4e5f\u662f\u53ef\u4ee5\u8c03\u7528\u7684\u3002 \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 \u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nimport cv2 as cv\nimport numpy as np\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\nif __name__ == \"__main__\":\nserver = ThreadXMLRPCServer((\"x.x.x.x\", 8889), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(match_image_by_opencv, \"match_image_by_opencv\")\nserver.serve_forever()\n \u8fd9\u6837\uff0c\u6211\u4eec\u57fa\u4e8e Python \u6807\u51c6\u5e93 xmlrpc \u642d\u5efa\u4e86\u4e00\u4e2a RPC \u670d\u52a1\u5668\uff0c\u6ce8\u518c\u4e86 image_put \u548c match_image_by_opencv \u4e24\u4e2a\u529f\u80fd\u63a5\u53e3\uff0c\u5728\u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u901a\u8fc7 IP \u548c\u7aef\u53e3\u8fdb\u884c RPC \u8bf7\u6c42\uff1b \u5ba2\u6237\u7aef\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from xmlrpc.client import Binary\nfrom xmlrpc.client import ServerProxy\nserver = ServerProxy(GlobalConfig.OPENCV_SERVER_HOST, allow_none=True)\nscreen_rb = open(screen, \"rb\")\ntemplate_rb = open(template_path, \"rb\")\ntry:\nscreen_path = server.image_put(Binary(screen_rb.read()))\nscreen_rb.close()\ntpl_path = server.image_put(Binary(template_rb.read()))\ntemplate_rb.close()\nreturn server.match_image_by_opencv(\ntpl_path, screen_path, rate, multiple\n)\nexcept OSError as exc:\nraise EnvironmentError(\nf\"RPC\u670d\u52a1\u5668\u94fe\u63a5\u5931\u8d25. {GlobalConfig.OPENCV_SERVER_HOST}\"\n) from exc\n \u901a\u8fc7\u8fd4\u56de server.match_image_by_opencv \u5c31\u83b7\u53d6\u4e86\u5728\u670d\u52a1\u7aef\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4","title":"4\u3001\u53f3\u952e\u83dc\u5355\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41","title":"4.1\u3001\u53f3\u952e\u83dc\u5355\u5b9a\u4f4d\u7684\u65b9\u6848\u53ca\u95ee\u9898","text":"\u53f3\u952e\u83dc\u5355\u7684\u5143\u7d20\u5b9a\u4f4d\u662f\u4e00\u4e2a\u96be\u70b9\uff0c\u8fc7\u53bb\u6211\u4eec\u8c03\u7814\u548c\u4f7f\u7528\u8fc7\u7684\u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u65b9\u6cd5\u6709 4 \u79cd\uff1a \u7b2c\u4e00\u79cd\uff1a\u6b65\u957f\u64cd\u4f5c\u6cd5 \u5728\u53f3\u952e\u83dc\u5355\u547c\u51fa\u6765\u4e4b\u540e\uff0c\u901a\u8fc7\u952e\u76d8\u7684 up\u3001down \u6309\u952e\uff0c\u8fdb\u884c\u9009\u62e9\u83dc\u5355\u9009\u62e9\uff0c\u9009\u4e2d\u76ee\u6807\u4e4b\u540e enter \u5373\u53ef\uff1b\u6bd4\u5982\uff1a\u5728\u684c\u9762\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\uff0c\u6309 1 \u6b21 down \uff0c\u4f1a\u51fa\u73b0\u4e0b\u56fe\uff1a \u7ee7\u7eed\u518d\u6309 2 \u6b21 down\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u518d\u6309 enter\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u5982\u6b64\uff0c\u201c\u6392\u5e8f\u65b9\u5f0f\u201d\u7684\u6b65\u957f\u4e3a 3\uff1b\u901a\u8fc7\u4f7f\u7528\u952e\u76d8\u4e0a\u4e0b\u952e\uff0c\u5c31\u5b9e\u73b0\u4e86\u5bf9\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\uff1b \u4f46\u662f\uff0c\u8fd9\u79cd\u65b9\u5f0f\u6709\u4e2a\u5f88\u70e6\u4eba\u7684\u95ee\u9898\uff0c\u5c31\u662f\u53f3\u952e\u83dc\u5355\u7684\u9009\u9879\u4f4d\u7f6e\u4e0d\u53ef\u80fd\u4e00\u76f4\u4e0d\u53d8\uff0c\u5728\u9700\u6c42\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\uff0c\u83dc\u5355\u9009\u9879\u7684\u53d8\u5316\u662f\u5f88\u5927\u7684\uff0c\u751a\u81f3\u6709\u4e9b\u5e94\u7528\u652f\u6301\u81ea\u5b9a\u4e49\u83dc\u5355\uff0c\u6bd4\u5982\u6587\u7ba1\u53f3\u952e\u83dc\u5355\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff1b \u4e5f\u5c31\u662f\u8bf4\u4f60\u5f97\u7ecf\u5e38\u53bb\u7ef4\u62a4\u83dc\u5355\u9009\u9879\u7684\u6b65\u957f\uff0c\u4e00\u4e2a\u9009\u9879\u73b0\u5728\u7684\u6b65\u957f\u662f 3\uff0c\u4e0b\u4e2a\u8fed\u4ee3\u53ef\u80fd\u5c31\u662f 4 \u6216\u8005 5\u3002 \u7b2c\u4e8c\u79cd\uff1a\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u6cd5 \u628a\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5355\u72ec\u622a\u56fe\u4fdd\u5b58\uff0c\u56fe\u7247\u4e2d\u4ec5\u5305\u542b\u4e00\u4e2a\u83dc\u5355\u9009\u9879\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u8fd9\u6837\uff0c\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5c31\u53ef\u4ee5\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u65b9\u5f0f\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u8fd9\u79cd\u65b9\u5f0f\u4e0d\u7528\u62c5\u5fc3\u83dc\u5355\u9009\u9879\u7684\u987a\u5e8f\u6216\u4f4d\u7f6e\uff0c\u4f46\u662f\u9700\u8981\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff0c\u4e14\u5bb9\u6613\u53d7\u5230\u5b57\u4f53 UI \u53d8\u66f4\u7c7b\u9700\u6c42\u7684\u5f71\u54cd\uff0c\u6bd4\u5982\uff1a\u5b57\u4f53\u5927\u5c0f\u3001\u5b57\u4f53\u95f4\u8ddd\u7b49\u7b49\u9700\u6c42\u53d8\u66f4\u90fd\u4f1a\u5f71\u54cd\uff0c\u6bcf\u6b21\u53d8\u66f4\u4e4b\u540e\u5c31\u9700\u8981\u8fdb\u884c\u5927\u91cf\u56fe\u7247\u8d44\u6e90\u7684\u91cd\u65b0\u622a\u56fe\u66ff\u6362\uff0c\u662f\u4e2a\u6bd4\u8f83\u9ebb\u70e6\u7684\u4e8b\u60c5\uff1b \u7b2c\u4e09\u79cd\uff1a\u76f8\u5bf9\u4f4d\u79fb\u6cd5 \u9f20\u6807\u70b9\u51fb\u53f3\u952e\u7684\u65f6\u5019\uff0c\u9f20\u6807\u7684\u5f53\u524d\u5750\u6807\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u7684\uff0c\u83dc\u5355\u9009\u9879\u7684\u5bbd\uff08 w \uff09\u4e00\u822c\u662f\u56fa\u5b9a\u7684\uff0c\u53d8\u5316\u7684\u662f\u83dc\u5355\u7684\u957f\u5ea6\uff08 h \uff09\uff0c\u53ef\u4ee5\u901a\u8fc7\u67d0\u4e2a\u9009\u9879\u76f8\u5bf9\u4e8e\u9f20\u6807\u7684\u8ddd\u79bb\u5728\u786e\u5b9a\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u901a\u8fc7\u7ef4\u62a4\u83dc\u5355\u9009\u9879\uff08\u76f8\u5bf9\u4f4d\u7f6e\uff09\u76f8\u5bf9\u4e8e\u9f20\u6807\u4f4d\u7f6e\u7684\u8ddd\u79bb\uff0c\u5373\u53ef\u8f7b\u677e\u8ba1\u7b97\u51fa\u83dc\u5355\u9009\u9879\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\u3002 \u4ece\u7406\u8bba\u4e0a\u6b64\u65b9\u6848\u662f\u53ef\u884c\u7684\uff0c\u4f46\u662f\u8fd9\u91cc\u4ecd\u7136\u5b58\u5728\u4e24\u4e2a\u4e25\u91cd\u7684\u95ee\u9898\uff1a \u83dc\u5355\u987a\u5e8f\u6539\u53d8\uff0c\u5bfc\u81f4\u76f8\u5bf9\u8ddd\u79bb\u6539\u53d8\uff0c\u800c\u4e14\u8ddd\u79bb\u662f\u901a\u8fc7\u50cf\u7d20\uff08px\uff09\u6765\u8868\u793a\u7684\uff0c\u4e0d\u60f3\u6b65\u957f\u90a3\u4e48\u53ea\u7ba1\uff0c\u6bcf\u6b21\u9700\u8981\u53bb\u91cf\u4e00\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u70b9\u9ebb\u70e6\uff1b \u9f20\u6807\u5728\u684c\u9762\u4e0d\u540c\u4f4d\u7f6e\u70b9\u51fb\u53f3\u952e\uff0c\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u4f4d\u7f6e\u662f\u4e0d\u540c\u7684\uff0c\u4e0a\u56fe\u7684\u83dc\u5355\u662f\u5728\u9f20\u6807\u7684\u5de6\u4e0b\u65b9\uff0c\u5982\u679c\u4f60\u79fb\u52a8\u9f20\u6807\u5230\u5c4f\u5e55\u56db\u8fb9\uff0c\u4f60\u4f1a\u53d1\u73b0\uff0c\u53f3\u952e\u83dc\u5355\u53ef\u80fd\u51fa\u73b0\u5728\u9f20\u6807\u7684\u56db\u4e2a\u65b9\u5411\uff0c\u4e5f\u5c31\u662f\u8bf4\u4f60\u9700\u8981\u6839\u636e\u9f20\u6807\u7684\u4e0d\u540c\u4f4d\u7f6e\u6765\u5224\u65ad\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u65b9\u5411\uff0c\u800c\u4e0d\u540c\u7684\u65b9\u5411\u4e0a\u8ba1\u7b97\u65b9\u6cd5\u662f\u4e0d\u540c\u7684\uff0c\u6bd4\u5982\uff1a\u53f3\u952e\u83dc\u5355\u5728\u9f20\u6807\u7684\u5de6\u4e0a\uff0c\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\u8ba1\u7b97\u65b9\u6cd5\u4e3a\uff08x - w / 2\uff0c y - h\uff09\uff0c\u8fd9\u6837\u7ef4\u62a4\u8d77\u6765\u53ef\u4ee5\u8bf4\u975e\u5e38\u590d\u6742\uff1b \u57fa\u4e8e\u4ee5\u4e0a\u4e24\u4e2a\u539f\u56e0\uff0c\u6211\u4eec\u5e76\u4e0d\u63a8\u8350\u8fd9\u79cd\u64cd\u4f5c\u65b9\u6848\u3002 \u7b2c\u56db\u79cd\uff1a\u5c5e\u6027\u5b9a\u4f4d \u6709\u540c\u5b66\u8bf4\u5e72\u561b\u4e0d\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u5462\uff0c\u5176\u5b9e\uff0c\u6211\u4eec\u6700\u5f00\u59cb\u60f3\u5230\u7684\u65b9\u6848\u5c31\u662f\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\uff0c\u4f46\u662f\u5728\u5c5e\u6027\u7684 DOM \u6811\u91cc\u600e\u4e48\u4e5f\u627e\u4e0d\u5230\uff0c\u65e0\u6cd5\u5b9a\u4f4d\u5230\uff0c\u6211\u4eec\u4e5f\u8054\u5408\u7814\u53d1\u540c\u5b66\u4e00\u8d77\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u4f46\u6700\u7ec8\u8fd8\u662f\u6ca1\u80fd\u89e3\u51b3\uff0c\u975e\u5e38\u9057\u61be\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42","title":"4.2\u3001\u6700\u65b0\u7684\u53f3\u952e\u83dc\u5355\u7ec8\u6781\u89e3\u51b3\u65b9\u6848","text":"\u7531\u4e8e\u53f3\u952e\u83dc\u5355\u9009\u9879\u51e0\u4e4e\u90fd\u662f\u6587\u672c\uff0c\u90a3\u4e48\u901a\u8fc7 OCR \u8bc6\u522b\uff0c\u51e0\u4e4e\u662f\u6700\u4f18\u7684\u65b9\u6848\uff1a \u4e0d\u7528\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff1b \u4e0d\u4f1a\u53d7\u5230\u83dc\u5355\u9009\u9879\u987a\u5e8f\u6539\u53d8\u7684\u5f71\u54cd\uff1b \u4e0d\u4f1a\u53d7\u5230\u5b57\u4f53 UI \u53d8\u5316\u7684\u5f71\u54cd\uff1b \u5173\u4e8e OCR \u8bc6\u522b\u6211\u4eec\u5728\u540e\u9762\u4f1a\u8be6\u7ec6\u8bb2\u5230\uff0c\u672c\u7ae0\u8282\u4e3b\u8981\u8bb2\u57fa\u4e8e OCR \u8bc6\u522b\uff0c\u6211\u4eec\u5728\u53f3\u952e\u83dc\u5355\u8bc6\u522b\u4e0a\u7684\u7a81\u7834\u548c\u521b\u65b0\uff1b \u4f7f\u7528 OCR \u8bc6\u522b\u53f3\u952e\u83dc\u5355\u867d\u7136\u5df2\u7ecf\u5f88\u5b8c\u7f8e\u4e86\uff0c\u4f46\u662f\u5728\u4e00\u4e9b\u60c5\u51b5\u4e0b\u4ecd\u7136\u5b58\u5728\u4e00\u70b9\u95ee\u9898\uff0c\u5c31\u662f\u5c4f\u5e55\u4e2d\u51fa\u73b0\u591a\u4e2a\u548c\u83dc\u5355\u9009\u9879\u6587\u5b57\u76f8\u540c\u7684\u6587\u5b57\u65f6\uff0c\u6bd4\u5982\u4e0b\u9762\u8fd9\u79cd\u60c5\u51b5\uff1a \u5c4f\u5e55\u6070\u597d\u51fa\u73b0\u4e86\u4e24\u4e2a\u201c\u590d\u5236\u201d\uff0c\u6b64\u65f6\u8981\u5b9a\u4f4d\u5230\u83dc\u5355\u4e2d\u7684 \u201c\u590d\u5236\u201d\uff0c\u5c31\u9700\u8981\u8fdb\u4e00\u6b65\u505a\u6570\u636e\u5904\u7406\uff0c\u6bd4\u5982\uff1aOCR \u8fd4\u56de 2 \u4e2a\u201c\u590d\u5236\u201d\u7684\u5750\u6807\uff0c\u7528\u4f8b\u91cc\u9762\u6765\u5224\u65ad\u7528\u54ea\u4e2a\uff0c\u4ece\u4e1a\u52a1\u4e0a\u5c06\u5904\u7406\u8d77\u6765\u6bd4\u8f83\u9ebb\u70e6\uff0c\u56e0\u4e3a\u4f60\u5f97\u660e\u786e\u77e5\u9053\u83dc\u5355\u5728\u5de6\u8fb9\u8fd8\u662f\u53f3\u8fb9\uff0c\u7136\u540e\u8fd9\u672c\u8eab\u5c31\u662f\u4e0d\u786e\u5b9a\u7684\uff1b \u600e\u4e48\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u5462\uff0c\u8fd9\u5c31\u8981\u8bf4\u9053\u672c\u7ae0\u7684\u4e3b\u9898\uff1a\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b\u3002 \u3010\u539f\u7406\u3011 \u5728\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u524d\u622a\u4e00\u5f20\u56fe\uff0c\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\u518d\u622a\u53d6\u4e00\u5f20\u56fe\uff0c\u4e24\u5f20\u56fe\u552f\u4e00\u53d8\u5316\u7684\u5c31\u662f\u53f3\u952e\u83dc\u5355\uff0c\u5c06\u5176\u4ed6\u76f8\u540c\u7684\u5730\u65b9\u90fd\u5c4f\u853d\u6389\uff0c\u53ea\u7559\u4e0b\u83dc\u5355\u754c\u9762\uff0c\u5982\u6b64\u5373\u53ef\u6d88\u9664\u5e72\u6270\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u5c06\u4e24\u79cd\u56fe\u505a\u524d\u540e\u5bf9\u6bd4\u63d0\u53d6\u53ef\u4ee5\u5f97\u5230\u8fd9\u6837\u7684\u56fe\uff1a \u4f60\u770b\uff0c\u901a\u8fc7\u524d\u540e\u56fe\u7247\u7684\u5bf9\u6bd4\uff0c\u5c06\u76f8\u540c\u7684\u90e8\u5206\u7ed9\u6d88\u9664\u6389\uff0c\u518d\u8fdb\u884c OCR \u8bc6\u522b\uff0c\u8fd9\u6837\u5c31\u4e0d\u4f1a\u6709\u5e72\u6270\u4e86\uff1b \u4ee3\u7801\u5b9e\u73b0\u8bf7\u67e5\u770b src/filter_image.py \uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def filter_image(action):\n\"\"\"\n \u5bf9\u6bd4\u52a8\u4f5c\u524d\u540e\u4e24\u5f20\u56fe\u7247\uff0c\u63d0\u53d6\u4e0d\u540c\u7684\u90e8\u5206\u751f\u6210\u4e00\u5f20\u65b0\u7684\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u65b0\u56fe\u7247\u7684\u8def\u5f84\n :param action: \u52a8\u4f5c\u51fd\u6570\u7684\u51fd\u6570\u5bf9\u8c61\n :return: \u65b0\u56fe\u7247\u7684\u8def\u5f84\n \"\"\"\n action \u662f\u9f20\u6807\u4e8b\u4ef6\uff0c\u56e0\u4e3a\u6b64\u7c7b\u573a\u666f\u4e0d\u4ec5\u4ec5\u5728\u53f3\u952e\u5b58\u5728\uff0c\u5355\u51fb\u3001\u53cc\u51fb\u7b49\u7b49\uff0c\u53ea\u8981\u64cd\u4f5c\u524d\u540e\u540e\u53d8\u5316\u7684\u90fd\u53ef\u4ee5\uff1a from src.mouse_key import MouseKey\naction = (\nMouseKey.click,\nMouseKey.right_click,\nMouseKey.double_click,\nMouseKey.move_to,\n)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5","title":"5\u3001\u52a8\u6001\u56fe\u50cf\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5728\u684c\u9762\u58c1\u7eb8\u5207\u6362\uff0c\u6216\u770b\u56fe\u3001\u76f8\u518c\u5207\u6362\u56fe\u7247\u7c7b\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u7531\u4e8e\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u662f\u4e0d\u56fa\u5b9a\u7684\uff08\u4e0d\u540c\u7248\u672c\u7684\u7cfb\u7edf\u58c1\u7eb8\u4e0d\u540c\u3001\u58c1\u7eb8\u987a\u5e8f\u4e0d\u540c\uff0c\u770b\u56fe\u76f8\u518c\u5728\u56fe\u7247\u8d44\u6e90\u4e0d\u4e00\u5b9a\u56fa\u5b9a\uff09\uff0c\u90a3\u4e48\u5728\u6d4b\u8bd5\u5207\u6362\u58c1\u7eb8\u6216\u8005\u5207\u6362\u56fe\u7247\u7684\u573a\u666f\u65f6\u5c31\u4f1a\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u4f60\u4e0d\u77e5\u9053\u9884\u671f\u662f\u5565\uff0c\u7528\u4f8b\u64cd\u4f5c\u52a8\u6001\u7684\uff0c\u4e5f\u662f\u6781\u4e0d\u7a33\u5b9a\u3002 \u3010\u539f\u7406\u3011 \u5728\u5207\u6362\u56fe\u7247\u4e4b\u524d\u622a\u56fe\u4fdd\u5b58\u5e76\u8fd4\u56de\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u6b21\u8bc6\u522b\u8fd9\u5f20\u56fe\u7247\uff0c\u5982\u679c\u4e0d\u5b58\u5728\uff0c\u8bf4\u660e\u56fe\u7247\u5df2\u7ecf\u5207\u6362\u4e86\uff1b \u793a\u610f\u56fe\uff1a \u8fd9\u6837\uff0c\u6211\u4eec\u622a\u53d6\u4e86\u5f53\u524d\u56fe\u7247\u4e2d\u6bd4\u8f83\u6709\u4ee3\u8868\u6027\u7684\u4f4d\u7f6e\uff08\u4e00\u53ea\u9e1f\uff09\uff0c\u5728\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u7528\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1a \u6211\u4eec\u518d\u62ff\u7740\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd9\u6837\u5728\u5f53\u524d\u56fe\u7247\u4e2d\uff0c\u5c31\u4e0d\u80fd\u627e\u5230\u8fd9\u53ea\u9e1f\u4e86\uff0c\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u662f False\uff0c\u90a3\u4e48\u4e5f\u5c31\u53ef\u4ee5\u5224\u65ad\u56fe\u7247\u5207\u6362\u662f\u6210\u529f\u7684\u3002 \u4ee3\u7801\u793a\u610f\uff1a def save_temporary_picture(_x: int, _y: int, width: int, height: int):\n\"\"\"\n \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u56fe\u7247\u8def\u5f84\n :param x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n :param y: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n :param width: \u5bbd\u5ea6\n :param height: \u9ad8\u5ea6\n :return: \u56fe\u7247\u8def\u5f84\n \"\"\"\n \u6b64\u51fd\u6570\u7528\u4e8e\u5728\u64cd\u4f5c\u4e4b\u524d\u622a\u56fe\u4e00\u5f20\u4e34\u65f6\u56fe\u7247\uff0c\u8fd4\u56de\u56fe\u7247\u8def\u5f84\uff0c\u6700\u540e\u5728\u65ad\u8a00\u7684\u65f6\u5019\u518d\u5c06\u56fe\u7247\u8def\u5f84\u4f5c\u4e3a\u53c2\u6570\u4f20\u5165\u65ad\u8a00\u8bed\u53e5\u5373\u53ef\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ui","title":"\u4e09\u3001\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_1","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u662f\u6211\u4eec\u81ea\u7814\u7684\u4e00\u79cd\u4f7f\u7528\u7b80\u5355\uff0c\u4e14\u6548\u7387\u6781\u9ad8\u3001\u7a33\u5b9a\u6027\u597d\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u57fa\u4e8e\u5143\u7d20\u6309\u94ae\u5728\u5e94\u7528\u4e2d\u7684\u76f8\u5bf9\u4f4d\u7f6e\uff0c\u52a8\u6001\u83b7\u53d6\u5143\u7d20\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff0c\u9002\u7528\u4e8e\u5404\u79cd\u5c4f\u5e55\u5206\u8fa8\u7387\uff08\u5305\u62ec\u9ad8\u5206\u5c4f\u3001\u5bbd\u5c4f\u3001\u5e26\u9c7c\u5c4f\uff09\uff0c\u5f53\u5143\u7d20\u6309\u94ae\u4f4d\u7f6e\u76f8\u5bf9\u4e8e\u5e94\u7528\u754c\u9762\u4f4d\u7f6e\u53d1\u751f\u4fee\u6539\u4e4b\u540e\uff0c\u53ea\u9700\u8981\u6839\u636e UI \u8bbe\u8ba1\u56fe\u4e0a\u7684\u6e90\u6570\u636e\u4fee\u6539\u5bf9\u5e94\u5750\u6807\u6570\u636e\u5c31\u597d\uff0c\u7ef4\u62a4\u975e\u5e38\u7684\u65b9\u4fbf\u3002 \u6b64\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u9002\u7528\u4e8e\u4e00\u4e9b\u5143\u7d20\u4f4d\u7f6e\u76f8\u5bf9\u4e0e\u5e94\u7528\u754c\u9762\u6bd4\u8f83\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u97f3\u4e50\uff0899% \u7684\u5143\u7d20\u5b9a\u4f4d\u91c7\u7528\u8fd9\u79cd\uff0c\u6548\u679c\u975e\u5e38\u597d\uff09\uff0c\u4e0d\u9002\u7528\u4e8e\u754c\u9762\u4e0d\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u622a\u56fe\u5f55\u5c4f\uff0c\u5f88\u660e\u663e\u4e0d\u9002\u7528\u4e8e\u8fd9\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u3002\u8fd9\u79cd\u5168\u65b0\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u6709\u5b83\u7684\u9002\u7528\u6761\u4ef6\uff0c\u5982\u679c\u4f60\u53d1\u73b0\u4f7f\u7528\u5e38\u89c4\u7684\uff08\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u5b9a\u4f4d\uff09\u4e0d\u597d\u505a\u65f6\uff0c\u4e0d\u59a8\u8003\u8651\u4f7f\u7528\u8fd9\u79cd\uff0c\u5176\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff0c\u5e76\u4e14\u8fc5\u901f\u7231\u4e0a\u4ed6\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_1","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5728 UI \u8bbe\u8ba1\u56fe\u4e2d\u6211\u4eec\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u8fb9\u6846\u7684\u8ddd\u79bb\u7684\uff0c\u7136\u540e\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u6280\u672f\u624b\u6bb5\u83b7\u53d6\u5230\u5e94\u7528\u754c\u9762\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u53ca\u5e94\u7528\u7a97\u53e3\u7684\u5927\u5c0f\uff0c\u793a\u610f\u56fe\u5982\u4e0b\uff1a \uff08x1, y1\uff09\u4e3a\u5e94\u7528\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\uff1b\uff08x2, y2\uff09\u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u5de6\u4e0a\u89d2\uff08x1, y1\uff09\u7684\u5750\u6807\uff0c\u90a3\u4e48\u5b9e\u9645\u4e0a\u3010\u64ad\u653e\u6240\u6709\u3011\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\u4e3a\uff1a\uff08 x1 + x2, y1 + y2 \uff09\uff1b \u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5927\u5c0f\uff08w2, h2\uff09\uff0c\u53ef\u4ee5\u4ece UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\uff1b \u5728 UI \u8bbe\u8ba1\u7a3f\u4e0a\u70b9\u51fb\u3010\u64ad\u653e\u6240\u6709\u3011\u56fe\u6807\uff0c\u7136\u540e\u79fb\u52a8\u9f20\u6807\u5c31\u5c31\u53ef\u4ee5\u770b\u5230\u4e0a\u56fe\u7684\u53c2\u8003\u7ebf\u53ca\u6570\u636e\uff1b \u6240\u4ee5\uff0c\u6211\u4eec\u53ef\u4ee5\u8f7b\u677e\u7684\u83b7\u53d6\u5230\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u4e2d\u5fc3\u5750\u6807\u4e3a\uff1a\uff08 x1 + x2 + (w2 / 2), y1 + y2 + ( h2 / 2) \uff09 \u8be6\u7ec6\u6e90\u4ee3\u7801\u8bf7\u67e5\u770b AT \u57fa\u7840\u6846\u67b6: src/button_center.py \u83b7\u53d6\u5e94\u7528\u7a97\u53e3\u7684\u4fe1\u606f \u4f7f\u7528 xdotool \u548c xwininfo \u83b7\u53d6\u5230\u5e94\u7528\u7a97\u53e3\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u5de6\u4e0a\u89d2\uff09\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a app_id = CmdCtl.run_cmd(f\"xdotool search --classname --onlyvisible {self.app_name}\"\n).split(\"\\n\")\napp_id_list = [int(_id) for _id in app_id if _id]\nreturn CmdCtl.run_cmd(f\"xwininfo -id {app_id_list[self.number]}\")\n \u4f7f\u7528\u6b63\u5219\u83b7\u53d6\u7a97\u53e3\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u83b7\u53d6\u914d\u7f6e \u8bfb ini \u914d\u7f6e\u6587\u4ef6\uff0c\u83b7\u53d6\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e0e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a conf = ConfigParser()\nconf.read(self.config_path)\ndirection = conf.get(btn_name, \"direction\")\nposition = [int(i.strip()) for i in conf.get(btn_name, \"location\").split(\",\")]\n \u8ba1\u7b97\u5143\u7d20\u6309\u94ae\u5750\u6807 \u6839\u636e\u5e94\u7528\u7a97\u53e3\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u5927\u5c0f\u3001\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u5927\u5c0f\uff0c\u4f7f\u7528\u4e00\u5b9a\u7684\u7b97\u6cd5\u5373\u53ef\u8ba1\u7b97\u51fa\u5143\u7d20\u6309\u94ae\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u4e2d\u5fc3\u5750\u6807\uff09\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3","title":"3\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u3010\u914d\u7f6e\u65b9\u6cd5\u3011 \u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u7684\u6570\u636e\u6e90\u662f\u5e94\u7528\u5e93\u4e2d\u7684 ui.ini \u914d\u7f6e\u6587\u4ef6\uff1a ;section\n[\u65b0\u5efa\u6b4c\u5355+] ;key = value\ndirection = left_top\nlocation = 180, 268, 21, 21\n section \u662f\u4f60\u6839\u636e\u5bf9\u5e94\u7684\u5143\u7d20\u6309\u94ae\u547d\u540d\uff0c\u4f60\u53ef\u4ee5\u4efb\u610f\u547d\u540d\uff0c\u4f46\u6700\u597d\u6709\u5177\u4f53\u542b\u4e49\uff0c\u4e14\u80fd\u660e\u786e\u8868\u793a\u8fd9\u4e2a\u5143\u7d20\u6309\u94ae\u7684\u540d\u79f0\uff1b\u7528\u4e2d\u62ec\u53f7\u62ec\u8d77\u6765\u5c31\u884c\uff0c\u6bd4\u5982\uff1a[\u65b0\u5efa\u6b4c\u5355+] \uff1b direction \u662f\u914d\u7f6e\u8be5\u5143\u7d20\u7684\u53c2\u8003\u7cfb\uff0c\u5206\u522b\u4e3a\uff1a left_top \u5de6\u4e0a\uff1b left_bottom \u5de6\u4e0b\uff1b right_top \u53f3\u4e0a\uff1b right_bottom \u53f3\u4e0b\uff1b \u53c2\u8003\u7cfb\u7684\u9009\u53d6\u6807\u51c6\uff1a\u62c9\u52a8\u6539\u53d8\u7a97\u53e3\u5927\u5c0f\u65f6\uff0c\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u53c2\u8003\u7cfb\u4f4d\u7f6e\u662f\u4e0d\u53d8\u7684\uff1b location \u662f\u8be5\u5143\u7d20\u6309\u94ae\u7684\u76f8\u5bf9\u4e0e\u53c2\u8003\u7cfb\u7684 x, y \u7684\u8ddd\u79bb\uff0c\u53ca\u5927\u5c0f(w, h)\uff0c\u8fd9\u56db\u4e2a\u6570\u636e\u53ef\u4ee5\u901a\u8fc7 UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\u6570\u636e\uff0c\u5728\u7f16\u8f91\u6a21\u5f0f\u4e0b\uff0c\u70b9\u51fb UI \u56fe\u4e0a\u7684\u6309\u94ae\uff0c\u53f3\u4fa7\u5c31\u4f1a\u51fa\u73b0\u8be5\u5143\u7d20\u6309\u94ae\u7684 x, y, w, h \u6570\u636e\u3002 \u5982\u679c UI \u56fe\u4e0a\u6ca1\u6709\u63d0\u4f9b\u4f60\u60f3\u8981\u7684\u5143\u7d20\u6570\u636e\uff0c\u4f60\u53ef\u4ee5\u76f4\u63a5\u5728\u7cfb\u7edf\u4e2d\u4f7f\u7528\u622a\u56fe\u5f55\u5c4f\u8fdb\u884c\u5c3a\u91cf\uff0c\u8fd9\u662f\u4e00\u79cd\u4e0d\u63a8\u8350\u4f46\u80fd\u7528\u7684\u65b9\u6cd5\u3002 \u3010\u8c03\u7528\u65b9\u6cd5\u3011 \u5728\u5e94\u7528\u5e93\u65b9\u6cd5\u5c42\u8fd9\u6837\u5199\uff1a def click_add_music_list_btn_in_music_by_ui(self):\n\"\"\"\u70b9\u51fb\u65b0\u5efa\u6b4c\u5355\u6309\u94ae\"\"\"\nself.click(*self.ui.btn_center(\"\u65b0\u5efa\u6b4c\u5355+\"))\n self.ui.btn_center() \u662f\u56fa\u5b9a\u5199\u6cd5\uff0c\u53c2\u6570\u5c31\u662f\u914d\u7f6e\u91cc\u9762\u7684 section \u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ocr","title":"\u56db\u3001OCR \u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_2","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 OCR \u65b9\u6848\u5927\u591a\u91c7\u7528\u8c37\u6b4c OCR\uff08Tesseract\uff09\u65b9\u6848\uff0c\u4f46\u662f\u5b83\u5bf9\u4e8e\u4e2d\u6587\u7684\u8bc6\u522b\u975e\u5e38\u5dee\uff0c\u7ecf\u8fc7\u5927\u91cf\u7684\u8c03\u7814\uff0c\u6211\u4eec\u4f7f\u7528 PaddleOCR\uff0c\u5b83\u662f\u4e00\u4e2a\u5f00\u6e90\u7684\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u8bc6\u522b\u5de5\u5177\uff0c\u4e5f\u662f PaddlePaddle \u6700\u6709\u540d\u7684\u4e00\u4e2a\u5f00\u6e90\u9879\u76ee\uff0c\u611f\u5174\u8da3\u7684\u53ef\u4ee5\u70b9\u8fd9\u91cc\u4e86\u89e3\uff0c\u591a\u7684\u4e0d\u8bf4\u4e86\uff0c\u4f60\u53ea\u9700\u8981\u77e5\u9053\u5b83\u5c31\u662f\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_2","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5b89\u88c5\u4ed6\u662f\u4e2a\u5f88\u9ebb\u70e6\u7684\u4e8b\u60c5\uff0c\u867d\u7136\u64cd\u4f5c\u5f88\u7b80\u5355\uff0c\u4f46\u5176\u5b9e\u5b89\u88c5\u5305\u6709\u70b9\u5927\uff0c\u56e0\u6b64\u6211\u4eec\u4e0d\u5e0c\u671b\u76f4\u63a5\u5728 env.sh \u4e2d\u52a0\u5165\u5b83\uff0c\u8fd9\u4f1a\u8ba9\u6574\u4e2a\u81ea\u52a8\u5316\u73af\u5883\u53d8\u5f97\u975e\u5e38\u81c3\u80bf\uff1b \u56e0\u6b64\uff0c\u6211\u4eec\u60f3\u5230\u5c06\u5b83\u505a\u6210\u4e00\u4e2a RPC \u670d\u52a1\u5728\u5176\u4ed6\u673a\u5668\u4e0a\u90e8\u7f72\uff0c\u6d4b\u8bd5\u673a\u901a\u8fc7\u8fdc\u7a0b\u8c03\u7528 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u4f7f\u7528\u5b83\uff1b RPC \u7684\u8c03\u7528\u903b\u8f91\uff1a \u8fd9\u6837\u6211\u4eec\u53ea\u9700\u8981\u5728\u670d\u52a1\u7aef\u90e8\u7f72\u597d OCR \u8bc6\u522b\u7684\u670d\u52a1\uff0c\u7136\u540e\u901a\u8fc7 RPC \u670d\u52a1\u5c06\u529f\u80fd\u63d0\u4f9b\u51fa\u6765\uff0c\u6846\u67b6\u91cc\u9762\u53ea\u9700\u8981\u8c03\u7528\u5bf9\u5e94\u7684 RPC \u63a5\u53e3\u5c31\u884c\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_1","title":"3\u3001\u4f7f\u7528\u8bf4\u660e","text":"\u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nfrom paddleocr import PaddleOCR\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef paddle_ocr(pic_path, lang):\n\"\"\"\n Paddleocr\u76ee\u524d\u652f\u6301\u7684\u591a\u8bed\u8a00\u8bed\u79cd\u53ef\u4ee5\u901a\u8fc7\u4fee\u6539lang\u53c2\u6570\u8fdb\u884c\u5207\u6362\n \u4f8b\u5982`ch`, `en`, `fr`, `german`, `korean`, `japan`\n :param file_name:\n :param lang:\n :return:\n \"\"\"\nif __name__ == \"__main__\":\nIP = popen(\"hostname -I\").read().split(\" \")[0]\nPORT = 8890\nSCREEN_CACHE = \"/tmp/screen.png\"\nserver = ThreadXMLRPCServer((IP, PORT), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(paddle_ocr, \"paddle_ocr\")\nprint(\"\u76d1\u542c\u5ba2\u6237\u7aef\u8bf7\u6c42\u3002\u3002\")\nserver.serve_forever()\n \u6846\u67b6\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from src import OCR\nOCR.ocr(*target_strings, picture_abspath=None, similarity=0.6, return_default=False, return_first=False, lang=\"ch\"):\n# \u901a\u8fc7 OCR \u8fdb\u884c\u8bc6\u522b\u3002\n# target_strings:\n# \u76ee\u6807\u5b57\u7b26,\u8bc6\u522b\u4e00\u4e2a\u5b57\u7b26\u4e32\u6216\u591a\u4e2a\u5b57\u7b26\u4e32,\u5e76\u8fd4\u56de\u5176\u5728\u56fe\u7247\u4e2d\u7684\u5750\u6807;\n# \u5982\u679c\u4e0d\u4f20\u53c2\uff0c\u8fd4\u56de\u56fe\u7247\u4e2d\u8bc6\u522b\u5230\u7684\u6240\u6709\u5b57\u7b26\u4e32\u3002\n# picture_abspath: \u8981\u8bc6\u522b\u7684\u56fe\u7247\u8def\u5f84\uff0c\u5982\u679c\u4e0d\u4f20\u9ed8\u8ba4\u622a\u53d6\u5168\u5c4f\u8bc6\u522b\u3002\n# similarity: \u5339\u914d\u5ea6\u3002\n# return_default: \u8fd4\u56de\u8bc6\u522b\u7684\u539f\u751f\u6570\u636e\u3002\n# return_first: \u53ea\u8fd4\u56de\u7b2c\u4e00\u4e2a,\u9ed8\u8ba4\u4e3a False,\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u6240\u6709\u6570\u636e\u3002\n# lang: `ch`, `en`, `fr`, `german`, `korean`, `japan`\n \u6b64\u65b9\u6848\u5728\u6846\u67b6\u5185\u6ca1\u6709\u5f15\u5165\u4efb\u4f55\u4e09\u65b9\u4f9d\u8d56\u5b8c\u5168\u91c7\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\uff0c\u800c\u4e14\u4f7f\u7528\u65b9\u6cd5\u975e\u5e38\u7b80\u5355\uff0c\u53ea\u9700\u8981\u901a\u8fc7 OCR.ocr() \u5373\u53ef\uff1b \u5bf9\u4e8e\u4e00\u4e9b\u6587\u6848\u7684\u573a\u666f\u975e\u5e38\u9002\u7528\uff0c\u6b64\u65b9\u6cd5\u76f4\u63a5\u8fd4\u56de\u5750\u6807\uff0c\u53ef\u4ee5\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u3002 \u4e5f\u53ef\u4ee5\u7528\u4e8e\u6587\u5b57\u65ad\u8a00\uff0c\u4ee3\u7801\u793a\u610f\uff1a def assert_ocr_exist(\n*args, picture_abspath=None, similarity=0.6, return_first=False, lang=\"ch\"\n):\n\"\"\"\u65ad\u8a00\u6587\u6848\u5b58\u5728\"\"\"\npic = None\nif picture_abspath is not None:\npic = picture_abspath + \".png\"\nres = OCR.ocr(\n*args,\npicture_abspath=pic,\nsimilarity=similarity,\nreturn_first=return_first,\nlang=lang,\n)\nif res is False:\nraise AssertionError(\n(f\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{args}\", f\"{pic if pic else GlobalConfig.SCREEN_CACHE}\")\n)\nif isinstance(res, tuple):\npass\nelif isinstance(res, dict) and False in res.values():\nres = filter(lambda x: x[1] is False, res.items())\nraise AssertionError(\n(\nf\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{dict(res)}\",\nf\"{pic if pic else GlobalConfig.SCREEN_CACHE}\",\n)\n)\n \u5728\u7528\u4f8b\u4e2d\u4f7f\u7528\u65ad\u8a00\uff0c\u793a\u4f8b\uff1a def test_font_manager_021(self):\n\"\"\"\u53f3\u4fa7\u2665-\u6536\u85cf/\u53d6\u6d88\u6536\u85cf\u5b57\u4f53\"\"\"\n# \u5b57\u4f53\u7ba1\u7406\u5668\u754c\u9762\u53f3\u4fa7\u8be6\u60c5\u5217\u8868\uff0c\u9009\u62e9\u672a\u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e / \u6536\u85cf\u5b57\u4f53\n# \u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e\u83dc\u5355\u663e\u793a\u201c\u53d6\u6d88\u6536\u85cf\u201d\uff1b\n...\nself.assert_ocr_exist(\"\u53d6\u6d88\u6536\u85cf\")\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_1","title":"4\u3001\u670d\u52a1\u7aef\u90e8\u7f72","text":"\u6211\u4eec\u76ee\u524d\u662f\u5c06 OCR \u670d\u52a1\u90e8\u7f72\u5728\u666e\u901a\u7684\u529e\u516c\u673a\u4e0a\u7684\uff0c\u5982\u679c\u4f60\u89c9\u5f97\u73b0\u6709\u7684 OCR \u8bc6\u522b\u6027\u80fd\u4e0d\u591f\u597d\uff0c\u6070\u597d\u4f60\u6709\u66f4\u597d\u7684\u673a\u5668\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u5176\u79c1\u6709\u5316\u90e8\u7f72\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41_1","title":"4.1\u3001\u73af\u5883\u5b89\u88c5","text":"\u63a8\u8350\u4f7f\u7528 pipenv \u8fdb\u884c\u73af\u5883\u642d\u5efa\uff1b \u5b89\u88c5 pipenv \uff1a sudo pip3 install pipenv\n \u65b0\u5efa\u4e00\u4e2a\u76ee\u5f55\u4f5c\u4e3a\u73af\u5883\u5305 ocr_env\uff1a cd ~\nmkdir ocr_env\n \u521b\u5efa python 3.7 \u73af\u5883\uff1a cd ocr_env\npipenv --python 3.7\n \u5b89\u88c5 OCR \u4f9d\u8d56\u5305\uff1a pipenv install paddlepaddle -i https://mirror.baidu.com/pypi/simple\npipenv install \"paddleocr>=2.0.1\" -i https://mirror.baidu.com/pypi/simple\n \u4e0d\u51fa\u610f\u5916\uff0c\u8fd9\u6837\u5c31\u628a\u4f9d\u8d56\u5b89\u88c5\u597d\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42_1","title":"4.2\u3001\u542f\u52a8\u670d\u52a1","text":"\u5c06\u57fa\u7840\u6846\u67b6\u4e2d\u7684 scr/ocr/pdocr_rpc_server.py \u6587\u4ef6\u62f7\u8d1d\u5230 ocr_env \u76ee\u5f55\uff0c\u540e\u53f0\u6267\u884c\u5b83\u5c31\u597d\u4e86\uff1a cd ocr_env\nnohup pipenv run python pdocr_rpc_server.py &\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#43","title":"4.3\u3001\u914d\u7f6e\u5f00\u673a\u81ea\u542f\uff08\u901a\u7528\uff09","text":"\u4f60\u80af\u5b9a\u4e0d\u60f3\u6bcf\u6b21\u673a\u5668\u91cd\u542f\u4e4b\u540e\u90fd\u9700\u8981\u624b\u52a8\u542f\u52a8\u670d\u52a1\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u914d\u7f6e\u5f00\u673a\u81ea\u542f\u3002 \u5199\u5f00\u673a\u81ea\u542f\u670d\u52a1\u6587\u4ef6\uff1a sudo vim /lib/systemd/system/ocr.service\n autoocr \u540d\u79f0\u4f60\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff0c\u5199\u5165\u4ee5\u4e0b\u5185\u5bb9\uff1a [Unit]\nDescription=OCR Service\nAfter=multi-user.target\n\n[Service]\nUser=uos\nGroup=uos\nType=idle\nWorkingDirectory=/home/uos/ocr_env\nExecStart=pipenv run python pdocr_rpc_server.py\n\n[Install]\nWantedBy=multi-user.target\n \u6ce8\u610f\u66ff\u6362\u4f60\u7684${USER} \u4fee\u6539\u914d\u7f6e\u6587\u4ef6\u7684\u6743\u9650\uff1a sudo chmod 644 /lib/systemd/system/ocr.service\n \u81ea\u542f\u670d\u52a1\u751f\u6548\uff1a sudo systemctl daemon-reload\nsudo systemctl enable ocr.service\n \u67e5\u770b\u670d\u52a1\u72b6\u6001\uff1a sudo systemctl status ocr.service\n \u4f60\u53ef\u4ee5\u518d\u91cd\u542f\u4e0b\u7535\u8111\uff0c\u770b\u770b\u670d\u52a1\u662f\u4e0d\u662f\u6b63\u5e38\u542f\u52a8\u4e86\uff0c\u6ca1\u62a5\u9519\u5c31 OK \u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_4","title":"\u4e94\u3001\u5c5e\u6027\u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_3","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 UI \u81ea\u52a8\u5316\u5927\u591a\u90fd\u662f\u57fa\u4e8e\u6d4f\u89c8\u5668\u7684\uff0c\u6838\u5fc3\u662f\u5728\u7f51\u9875\u7684 DOM \u6811\u4e0a\u67e5\u627e\u5143\u7d20\uff0c\u5e76\u5bf9\u5176\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\uff1b Linux \u684c\u9762\u5e94\u7528\u5927\u591a\u662f\u91c7\u7528 Qt \u7f16\u5199\u7684\uff0c\u5728 Qt \u4e2d\u4e5f\u662f\u4ece\u6700\u9876\u5c42\u7684 MainWindow \u5f00\u59cb\u6784\u5efa\u5e94\u7528\uff0c\u6240\u4ee5\u903b\u8f91\u4e5f\u662f\u4e00\u6837\u7684\uff0cQt \u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u540c\u6837\u53ef\u4ee5\u901a\u8fc7 DOM \u6811\uff08\u5c5e\u6027\u6811\uff09\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff0c\u6211\u4eec\u79f0\u4e4b\u4e3a\u5c5e\u6027\u5b9a\u4f4d\u3002 \u501f\u52a9\u5f00\u6e90\u5de5\u5177 dogtail \u6211\u4eec\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u83b7\u53d6\uff0c\u4ece\u800c\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\u3002dogtail \u7684\u9879\u76ee\u4ecb\u7ecd\u53ef\u4ee5\u731b\u6233\u8fd9\u91cc\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_3","title":"2\u3001\u4f7f\u7528\u65b9\u6cd5","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#21sniff","title":"2.1\u3001sniff\uff08\u55c5\u63a2\u5668\uff09\u4f7f\u7528","text":"\u5728\u7ec8\u7aef\u8f93\u5165 sniff \u542f\u52a8 AT-SPI Browser mikigo@mikigo-PC:~$ sniff\n \u67e5\u770b\u5e94\u7528\u7684\u6807\u7b7e \u5728 sniff \u91cc\u9762\u53ef\u4ee5\u770b\u5230\u7cfb\u7edf\u4e2d\u5df2\u542f\u52a8\u7684\u5e94\u7528\uff0c\u70b9\u51fb\u5e94\u7528\u540d\u79f0\u524d\u9762\u7684\u4e09\u89d2\u5f62\u56fe\u6807\uff0c\u53ef\u4ee5\u5c55\u5f00\u5e94\u7528\u7684\u6807\u7b7e\uff0c\u6240\u6709\u6807\u7b7e\u4ee5 tree \u7684\u5f62\u5f0f\u5c55\u793a\uff0c\u5bf9\u5e94\u5e94\u7528\u91cc\u9762\u7684\u7236\u7a97\u53e3\u548c\u5b50\u7a97\u53e3\u3002 \u83b7\u53d6\u5143\u7d20\u63a7\u4ef6\u7684\u6807\u7b7e\u540d\u79f0 \u9996\u5148\uff0c\u4e3a\u4e86\u65b9\u4fbf\u67e5\u770b\u5143\u7d20\u63a7\u4ef6\u5bf9\u5e94\u7684\u4f4d\u7f6e\uff0c\u5efa\u8bae\u73b0\u5728\u4e0a\u65b9\u5de5\u5177\u680f\u70b9\u51fb Actions\uff0c\u7136\u540e\u52fe\u9009 Hightlight Items\uff0c\u8fd9\u6837\u5728 sniff \u4e2d\u9f20\u6807\u9009\u4e2d\u5143\u7d20\u6807\u7b7e\u7684\u65f6\u5019\uff0c\u5e94\u7528\u4e2d\u4f1a\u6709\u76f8\u5e94\u7684\u5149\u6807\u9501\u5b9a\u3002 \u5728 sniff \u91cc\u9762\u70b9\u51fb\u8fdb\u5165\u5e94\u7528\u7684\u6807\u7b7e tree \u4e2d\u540e\uff0c\u70b9\u51fb\u76f8\u5e94\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5728\u5de5\u5177\u4e0b\u65b9\uff0c\u4f1a\u5c55\u793a\u5143\u7d20\u63a7\u4ef6\u7684 Name\uff0c\u8fd9\u4e2a\u5c31\u662f\u6807\u7b7e\u540d\u79f0\u3002 \u5728 tree \u4e2d\u6709\u4e9b\u5730\u65b9\u662f\u7a7a\u767d\u7684\u6216\u8005\u662f Form\uff0c\u662f\u56e0\u4e3a\u5f00\u53d1\u4eba\u5458\u5728\u6dfb\u52a0\u6807\u7b7e\u7684\u65f6\u5019\u6ca1\u6709\u6dfb\u52a0\uff0c\u6216\u8005\u6709\u4e9b\u7236\u7a97\u53e3\u4e0d\u9700\u8981\u6dfb\u52a0\uff0c\u8fd9\u79cd\u5728\u5b9e\u9645\u4e1a\u52a1\u4e2d\u662f\u4e0d\u5f71\u54cd\u7684\uff0c\u6211\u4eec\u53ea\u8981\u4fdd\u8bc1\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\u4e2d\uff0c\u8981\u7528\u5230\u7684\u5143\u7d20\u90fd\u6dfb\u52a0\u4e86\u6807\u7b7e\u5373\u53ef\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#22","title":"2.2\u3001\u5143\u7d20\u64cd\u4f5c","text":"\u83b7\u53d6\u5e94\u7528\u5bf9\u8c61 dogtail \u83b7\u53d6\u5e94\u7528\u5bf9\u8c61\u7684\u65f6\u5019\uff0c\u4f7f\u7528\u7684\u662f tree \u5e93\u91cc\u9762\u7684 application() \u65b9\u6cd5\uff1a from dogtail.tree import root\napp_obj = root.application('deepin-music')\n app_obj\u5c31\u662f\u5e94\u7528\u7684\u5bf9\u8c61\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\uff0c\u662f\u5e94\u7528\u5bf9\u8c61\u4f7f\u7528child()\u65b9\u6cd5\uff1a element = app_obj.child('element_name')\n \u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u4f20\u5165\u5143\u7d20\u7684 Name\uff0c\u83b7\u53d6\u5230\u76f8\u5e94\u5143\u7d20\u7684\u5bf9\u8c61\u3002Name \u53ef\u4ee5\u901a\u8fc7 sniff \u67e5\u770b\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\u5217\u8868: element_list = element.children\n \u83b7\u53d6\u5230\u8fd9\u4e2a\u5143\u7d20\u4e0b\u9762\u6240\u6709\u7684\u5143\u7d20\u5217\u8868\u3002 \u8fd9\u4e2a\u65b9\u6cd5\u9002\u7528\u4e8e\u6709\u4e9b\u6807\u7b7e\u6ca1\u6709\u6dfb\u52a0\uff0c\u4f46\u662f\u4f4d\u7f6e\u662f\u56fa\u5b9a\u7684\uff0c\u6211\u4eec\u901a\u8fc7\u7d22\u5f15\u53ef\u4ee5\u53d6\u5f97\u5143\u7d20\u3002 element_list[0]\n \u5bf9\u5143\u7d20\u7684\u64cd\u4f5c \u5728\u83b7\u53d6\u5230\u5143\u7d20\u4e4b\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u76f8\u5e94\u7684\u64cd\u4f5c\u3002 \u5355\u51fb element.click(button=1)\n button 1 \u2014>\u5de6\u952e\uff0c2 \u2014>\u6eda\u8f6e\uff0c3 \u2014>\u53f3\u952e\uff0c\u9ed8\u8ba4\u4e3a 1 \u53cc\u51fb element.doubleClick(button=1)\n \u9f20\u6807\u60ac\u505c element.point()\n \u9f20\u6807\u79fb\u52a8\u5230\u5143\u7d20\u4e2d\u5fc3\u4f4d\u7f6e \u6587\u672c\u8f93\u5165 element.typeText(string)\n \u5411\u5143\u7d20\u5bf9\u8c61\u8f93\u5165\u5b57\u7b26\u4e32 \uff0c\u6bd4\u5982\u8f93\u5165\u6846 \u7ec4\u5408\u952e element.keyCombo(comboString)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#23","title":"2.3\u3001\u6846\u67b6\u5c01\u88c5","text":"\u4ee3\u7801\u793a\u4f8b\uff1a # \u8be6\u7ec6\u4ee3\u7801\u8bf7\u67e5\u770b src/dogtail_utils.py\nclass DogtailUtils:\ndef __init__(self, name=None, description=None):\nself.name = name\nself.description = description\nself.obj = root.application(self.name, self.description)\ndef app_element(self, *args, **kwargs):\n\"\"\"\n \u83b7\u53d6app\u5143\u7d20\u7684\u5bf9\u8c61\n :return: \u5143\u7d20\u7684\u5bf9\u8c61\n \"\"\"\nreturn self.obj.child(*args, **kwargs, retry=False)\ndef element_center(self, element) -> tuple:\n\"\"\"\n \u83b7\u53d6\u5143\u7d20\u7684\u4e2d\u5fc3\u4f4d\u7f6e\n :param element:\n :return: \u5143\u7d20\u4e2d\u5fc3\u5750\u6807\n \"\"\"\n_x, _y, _w, _h = self.app_element(element).extents\n_x = _x + _w / 2\n_y = _y + _h / 2\nreturn _x, _y\n \u6846\u67b6\u63d0\u4f9b\u7684\u63a5\u53e3\u975e\u5e38\u7b80\u6d01\uff0c\u5728\u8c03\u7528\u65f6\uff1a self.dog.element_center(\"\u64ad\u653e\")\n \u8fd9\u6837\u5c31\u80fd\u83b7\u53d6\u5230\u6b64\u5143\u7d20\u7684\u4e2d\u5fc3\u5750\u6807\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_5","title":"\u516d\u3001\u6807\u7b7e\u5316\u7ba1\u7406","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_4","title":"1\u3001\u6807\u7b7e\u8bf4\u660e","text":"\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u811a\u672c ID\uff1a\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c/\u51fd\u6570 ID\uff1b PMS\u7528\u4f8bID\uff1aPMS \u4e0a\u5bf9\u5e94\u7684\u7528\u4f8b ID\uff08\u7528\u4f8b\u5e93 ID\uff09\uff1b \u9ed8\u8ba4\u4f7f\u7528\u7528\u4f8b\u5e93 ID\uff0c\u5bf9\u4e8e\u6682\u65f6\u6ca1\u6709\u4f7f\u7528\u7528\u4f8b\u5e93\u7ba1\u7406\u7528\u4f8b\u7684\u9879\u76ee\uff0c\u53ef\u4ee5\u4f7f\u7528\u4ea7\u54c1\u5e93\u7528\u4f8b ID\uff1b \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1aFUNC\uff08\u529f\u80fd\uff09\u3001PERF\uff08\u6027\u80fd\uff09\u3001STR\uff08\u538b\u529b\uff09\u3001SEC\uff08\u5b89\u5168\uff09\u3001CTS\uff08\u517c\u5bb9\u6027\uff09\u3001API\uff08\u63a5\u53e3\uff09\u3001BASELINE\uff08\u57fa\u7ebf-\u9884\u7559\uff09 \u8bbe\u5907\u7c7b\u578b\uff1aPPL\uff08\u4f9d\u8d56\u5916\u8bbe\u7684\u7528\u4f8b\uff09\u3001COL\uff08\u4f9d\u8d56\u4e3b\u63a7\u673a\u7684\u7528\u4f8b\uff09 \u7528\u4f8b\u6765\u6e90\uff1aBUG\uff08\u7531 Bug \u8f6c\u7684\u7528\u4f8b\uff09 \u4e0a\u7ebf\u5bf9\u8c61\uff1aCICD\uff0c\u8868\u793a\u4e0a\u7ebf\u5230 CICD \u6d41\u6c34\u7ebf\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u53ef\u4e00\u952e\u751f\u6210 case_list.csv \u6587\u4ef6\uff0c\u7528\u4e8e\u5bfc\u5165\u5230\u660e\u9053\u4e91 AT \u7528\u4f8b\u5217\u8868\u4e2d\u63a7\u5236 CICD \u8dd1\u6d4b\u8303\u56f4\uff1b \u6d4b\u8bd5\u7ea7\u522b\uff1aC1 / C2 / C3 / C4\uff0c\u5177\u4f53\u5b9a\u4e49\u53c2\u8003\u6d41\u6c34\u7ebf\u4f7f\u7528\u6307\u5bfc\uff1b \u8df3\u8fc7\u539f\u56e0\uff1askip-XXX\uff0c\u7528\u4e8e\u63a7\u5236\u7528\u4f8b\u662f\u5426\u6267\u884c\uff1b \u786e\u8ba4\u4fee\u590d\uff1afixed-XXX\uff0c\u7528\u4e8e\u6807\u8bb0\u7528\u4f8b\u7684\u4fee\u590d\u72b6\u6001\uff08\u540e\u9762\u8be6\u7ec6\u8bb2\u89e3\u7528\u6cd5\uff09\uff1b \u5e9f\u5f03\u7528\u4f8b\uff1aremoved-\u5df2\u5e9f\u5f03\uff0c\u7528\u4e8e\u6807\u8bb0\u5df2\u7ecf\u5e9f\u5f03\u7684\u7528\u4f8b\uff0c\u6b64\u7528\u4f8b\u6807\u7b7e\u4e0d\u4f1a\u88ab\u6dfb\u52a0\uff0c\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff1b \u793a\u4f8b\uff1a \u811a\u672cID PMS\u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u8bbe\u5907\u7c7b\u578b \u7528\u4f8b\u6765\u6e90 \u4e0a\u7ebf\u5bf9\u8c61 \u6d4b\u8bd5\u7ea7\u522b \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b ... 679537 679537 L1 FUNC PPL CICD C1 skip-XXX fixed-XXX removed-\u5df2\u5e9f\u5f03 ..."},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_4","title":"2\u3001\u64cd\u4f5c\u6b65\u9aa4","text":"2.1\u3001\u5728\u5b50\u9879\u76ee\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u4ee5\u7528\u4f8b\u7684 py \u6587\u4ef6\u9664\u53bb\u9996\u5b57\u7b26\u4e32 \"test_\" \u548c\u7528\u4f8b\u5e8f\u53f7\u540e\u7684\u5b57\u7b26\u4e32\u4f5c\u4e3a csv \u7684\u6587\u4ef6\u540d\u3002 \u4f8b\u5982: \u76f8\u518c\u7684\u7528\u4f8b\u6587\u4ef6\u4e3a test_album_xxx.py\uff0cxxx \u8868\u793a\u7528\u4f8b\u7684ID\uff08\u4e5f\u53ef\u4ee5\u662f\u81ea\u5b9a\u4e49\u7684\u6570\u5b57\u4ee3\u8868\u7528\u4f8b\u5e8f\u53f7\uff09\uff0c\u6b64\u65f6 csv \u6587\u4ef6\u540d\u5c31\u5e94\u4e3a album.csv\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u6240\u6709 csv \u6587\u4ef6\u5efa\u8bae\u653e\u5728\u4e00\u4e2a tags \u76ee\u5f55\u4e0b\u3002 \u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 2.2\u3001\u7b2c\u4e00\u5217\u4e3a\u811a\u672c ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b\u7528\u4f8b\u6807\u7b7e\u53ef\u4ee5\u65e0\u5e8f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_2","title":"3\u3001\u589e\u52a0\u8bf4\u660e","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_1","title":"3.1\u3001\u8df3\u8fc7\u7528\u4f8b","text":"\u4f20\u7edf\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668(@pytest.mark.skip)\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a; \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#311","title":"3.1.1\u3001\u56fa\u5b9a\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 679537 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u7b7e\u5f00\u5934\u4e3a \u201cskip-XXX\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\uff0c\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\u5219\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u7b7e\u4e3a SKIPED\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#312","title":"3.1.2\u3001\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skipif_platform-aarch64&mips64 \u67d0\u4e9b\u7528\u4f8b\u4f1a\u56e0\u4e3a\u4e0d\u540c\u7684\u73af\u5883\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\uff0c\u5e38\u89c1\u7684\u573a\u666f\u4e3a\u5728\u4e0d\u540c\u67b6\u6784\u4e0a\u5224\u65ad\u662f\u5426\u6267\u884c\uff0c\u8df3\u8fc7\u7684\u539f\u56e0\u6807\u7b7e\u4e3a \u201cskipif_platform-\u201d \u52a0\u67b6\u6784\u540d\uff0c\u591a\u4e2a\u67b6\u6784\u4e4b\u95f4\u4f7f\u7528 \u201c&\u201d \u62fc\u63a5\uff1b \u4ee5\u4e0a\u4f8b\u5b50\u4e3a\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u5224\u65ad\u5f53\u524d\u67b6\u6784\u662f\u5426\u4e3a arrch64 \u6216\u8005 mips64\uff0c\u82e5\u662f\uff0c\u5219\u8df3\u8fc7\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u82e5\u5426\u5219\u6267\u884c\u7528\u4f8b\uff1b \u76ee\u524d\u6846\u67b6\u9ed8\u8ba4\u4ec5\u652f\u6301\u67b6\u6784\u7684\u6761\u4ef6\u5224\u65ad\uff0c\u4f46\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u903b\u8f91\u652f\u6301\u81ea\u5b9a\u4e49\u6dfb\u52a0\u3002 \u5728\u9879\u76ee\u76ee\u5f55\u8def\u5f84\u4e0b\u5b58\u5728\u6587\u4ef6 setting/skipif.py\uff0c\u6240\u6709\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u7684\u51fd\u6570\u5199\u5728\u6b64\u6587\u4ef6\u4e2d\u3002 \u9ed8\u8ba4\u67b6\u6784\u5224\u65ad\u4f8b\u5b50\uff1a def skipif_platform(args: str):\n\"\"\"\u5e73\u53f0\u8df3\u8fc7\"\"\"\n_skip_key = args.split(\"&\")\nfor key in _skip_key:\nif GlobalConfig.SYS_ARCH == key:\nreturn True\nreturn False\n \u65b9\u6cd5\u7f16\u5199\u89c4\u8303\uff1a \u65b9\u6cd5\u540d\u5fc5\u987b\u4ee5 skipif \u5f00\u5934\uff1b \u65b9\u6cd5\u5fc5\u987b\u6709\u8fd4\u56de\u7ed3\u679c\u5e76\u4e14\u4e3a\u5e03\u5c14\u503c\uff08True \u4ee3\u8868\u8df3\u8fc7\uff0cFalse \u4ee3\u8868\u4e0d\u8df3\u8fc7\uff09\uff1b \u65b9\u6cd5\u53ea\u80fd\u6709\u4e00\u4e2a\u5165\u53c2\uff1b \u5728 csv \u6587\u4ef6\u8df3\u8fc7\u539f\u56e0\u4e00\u680f\u4e2d\u586b\u5199\u4e3a \u201c{\u51fd\u6570\u540d}-{\u53c2\u6570}\u201d\uff0c\u4f8b\u5982\uff1askipif_platform-aarch64\uff1b\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u4f1a\u4ee5\u7b2c\u4e00\u4e2a \u201c-\u201d \u8fdb\u884c\u5206\u5272\uff0c\u622a\u53d6\u7684\u5de6\u4fa7\u5b57\u7b26\u4e32\u4f5c\u4e3a\u51fd\u6570\u540d\uff0c\u5728 skipif.py \u6587\u4ef6\u4e2d\u67e5\u627e\u662f\u5426\u6709\u540c\u540d\u51fd\u6570\uff0c\u5e76\u5c06\u622a\u53d6\u7684\u53f3\u4fa7\u4f5c\u4e3a\u53c2\u6570\u4f20\u9012\u7ed9\u8be5\u51fd\u6570\uff0c\u901a\u8fc7\u83b7\u53d6\u8be5\u51fd\u6570\u8fd4\u56de\u7684\u5e03\u5c14\u503c\uff0c\u8fd4\u56de True\uff0c\u5219\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u8fd4\u56de False\uff0c\u5219\u6267\u884c\u8be5\u7528\u4f8b\u3002 \u82e5\u51fd\u6570\u9700\u8981\u591a\u4e2a\u53c2\u6570\uff0c\u53ef\u81ea\u5b9a\u4e49\u591a\u4e2a\u53c2\u6570\u4e4b\u95f4\u7684\u8fde\u63a5\u7b26\uff0c\u8fde\u63a5\u7b26\u53f7\u4e0d\u53ef\u4f7f\u7528\u4e0b\u5212\u7ebf\u548c\u9017\u53f7\uff0c\u63a8\u8350\u7edf\u4e00\u4f7f\u7528 & \u7b26\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32","title":"3.2\u3001\u786e\u8ba4\u4fee\u590d","text":"\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7528\u4f8b\u4fee\u590d\u540e\uff0c\u4f46\u4e0d\u80fd\u7acb\u5373\u5220\u9664\u8df3\u8fc7\u539f\u56e0\uff08skip-XXX\uff09\u7684\u7528\u4f8b\uff0c\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u786e\u8ba4\u4fee\u590d\u201d\uff0c\u4f5c\u4e3a\u6807\u8bb0\u8be5\u7528\u4f8b\u662f\u5426\u5df2\u7ecf\u4fee\u590d\uff0c\u56fa\u5b9a\u586b\u5165\u5b57\u6bb5\u4e3a \u201cfixed-\u5df2\u4fee\u590d\u201d\u3002\u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u5373\u4f7f\u540c\u65f6\u6807\u8bb0\u4e86 skip-XXX \u4e5f\u4f1a\u6b63\u5e38\u6267\u884c\u3002 \u793a\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d 679537 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d \u3010\u540c\u65f6\u6807\u8bb0\u4e86skip \u548c fixed\uff0c\u4f46\u4ecd\u7136\u60f3\u8981\u8df3\u8fc7\u7528\u4f8b\u3011 \u5f53 \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u540c\u65f6\u586b\u5165\u540e\uff0c\u547d\u4ee4\u884c\u4f20\u9012\u53c2\u6570 --ifixed yes\uff0c\u5219\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\u8be5\u6761\u7528\u4f8b\u3002 python3 manage.py run --ifixed yes\n \u770b\u5230\u8fd9\u91cc\u6709\u4e9b\u540c\u5b66\u53ef\u80fd\u8981\u95ee\u4e86\uff0c\u6211\u60f3\u6062\u590d\u8df3\u8fc7\u6267\u884c\uff0c\u76f4\u63a5\u628a skip-XXX \u8fd9\u4e00\u5217\u6807\u7b7e\u5220\u6389\u4e0d\u5c31\u597d\u4e86\uff0c\u8fd8\u641e\u4ec0\u4e48\u786e\u8ba4\u4fee\u590d\u5e72\u5565\uff1f \u8fd9\u91cc\u7ed9\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u89e3\u91ca\u4e00\u4e0b\uff1a \uff08\u4ee5\u4e0b\u6d41\u6c34\u7ebf\u6307\u7684\u662f\u6bcf\u65e5\u6784\u5efa\u7684\u6d41\u6c34\u7ebf\uff0c\u8dd1 AT \u7684\u5168\u91cf\u7528\u4f8b\uff09 \u9996\u5148\uff0c\u6d41\u6c34\u7ebf\u4e0a\u8dd1\u7684\u662f AT \u5386\u53f2 Tag\uff0c\u8df3\u8fc7\u7528\u4f8b\u7684\u6807\u7b7e(skip-XXX) \u662f\u5728\u6700\u65b0\u7684\u4ee3\u7801\u4e0a\u63d0\u4ea4\u7684\uff0c\u6211\u4eec\u91c7\u7528\u6700\u65b0\u7684 csv \u6587\u4ef6\u8986\u76d6\u5386\u53f2 csv \u6587\u4ef6\u7684\u8bbe\u8ba1\u6765\u5b9e\u73b0\u4e86\u5bf9\u5386\u53f2 Tag \u4e0a\u7528\u4f8b\u7684\u8df3\u8fc7\uff1b \u7136\u540e\uff0c\u5728\u65e5\u5e38\u8df3\u8fc7\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u540c\u65f6\u4e5f\u5728\u4fee\u590d\u4e00\u4e9b\u7528\u4f8b\uff0c\u4fee\u590d\u540e\u7684\u8fd9\u4e9b\u7528\u4f8b\u5728\u672c\u5730\u8c03\u8bd5\u7684\u65f6\u5019\u6211\u4eec\u4e0d\u5e0c\u671b\u7ee7\u7eed\u8df3\u8fc7\uff0c\u4f46\u662f\u6b64\u65f6\uff0c\u4fee\u590d\u7684\u8fd9\u4e9b\u7528\u4f8b\u53ef\u80fd\u8fd8\u4e0d\u7a33\u5b9a\uff0c\u4e0d\u9002\u5408\u9a6c\u4e0a\u653e\u5230\u6d41\u6c34\u7ebf\u53bb\u8dd1\uff0c\u4e5f\u5c31\u662f\u8bf4\u6d41\u6c34\u7ebf\u4e0a\u6211\u4eec\u662f\u5e0c\u671b\u4ed6\u7ee7\u7eed\u8df3\u8fc7\u7684\uff0c\u56e0\u6b64\uff0c\u54b1\u4e0d\u80fd\u76f4\u63a5\u628a skip-XXX \u5e72\u6389\uff1b \u8fd9\u91cc\u5c31\u77db\u76fe\u4e86\uff0c\u4e00\u4e2a\u9700\u6c42\u662f\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u53e6\u4e00\u4e2a\u9700\u6c42\u53c8\u4e0d\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u600e\u4e48\u529e\u5462\uff1f \u6211\u4eec\u4f7f\u7528\u201c\u786e\u8ba4\u4fee\u590d\u201d\u6765\u6807\u8bb0\u8fd9\u6761\u7528\u4f8b\u5df2\u7ecf\u4fee\u590d\u4e86\uff0c\u8fd9\u6837\u4f60\u672c\u5730\u8c03\u8bd5\u7528\u4f8b\u7684\u65f6\u5019\u8fd9\u6761\u5df2\u4fee\u590d\u7684\u7528\u4f8b\u662f\u4f1a\u6267\u884c\u7684\uff0c\u540c\u65f6\u5728\u6d41\u6c34\u7ebf\u4e0a\u5c06 --ifixed yes \u53c2\u6570\u52a0\u4e0a\uff0c\u90a3\u4e48\u6d41\u6c34\u7ebf\u4e0a\u6267\u884c\u65f6\u8fd9\u6761\u7528\u4f8b\u4ecd\u7136\u662f\u8df3\u8fc7\u7684\u72b6\u6001\uff0c\u540e\u7eed\u4f60\u6253 Tag \u7684\u65f6\u5019\uff0c\u628a \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u7684\u6807\u7b7e\u5168\u90e8\u5220\u6389\u5c31\u53ef\u4ee5\u4e86\u3002 \u8fd9\u5c31\u662f\u201c\u786e\u8ba4\u4fee\u590d\u201d\u8fd9\u4e2a\u6807\u7b7e\u7684\u80cc\u666f\uff0c\u9700\u8981\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u54c1\u4e00\u54c1\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#33","title":"3.3\u3001\u5e9f\u5f03\u7528\u4f8b","text":"\u9488\u5bf9\u67d0\u4e9b\u7528\u4f8b\uff0c\u7531\u4e8e\u9700\u6c42\u53d8\u66f4\uff0c\u73af\u5883\u5f71\u54cd\u6216\u8bc4\u4f30\u4e0d\u518d\u9002\u7528\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u65f6\uff0c\u7528\u4f8b\u9700\u8981\u5e9f\u5f03\uff0c\u5219\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u5e9f\u5f03\u7528\u4f8b\u201d\uff0c\u8be5\u5217\u5b58\u5728 \u201cremoved-{\u5e9f\u5f03\u539f\u56e0}\u201d\uff0c\u5219\u7528\u4f8b\u4e0d\u4f1a\u6267\u884c\u3002 \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d removed-\u5df2\u5e9f\u5f03 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_2","title":"4\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u4e0a\u9762\u4ecb\u7ecd Pytest \u6846\u67b6\u63d0\u4f9b\u7684\u6807\u7b7e\u529f\u80fd mark\uff0c\u4f7f\u7528\u65f6\u9700\u8981\u4e3a\u6bcf\u4e00\u4e2a\u7528\u4f8b\u6dfb\u52a0\u6807\u7b7e\u88c5\u9970\u5668\uff0c\u5219\u64cd\u4f5c\u590d\u6742\uff0c\u53ef\u7ef4\u62a4\u6027\u5dee\uff0c\u5176\u6839\u672c\u95ee\u9898\u5c31\u662f\u6807\u7b7e\u5206\u6563\u5728\u6bcf\u4e00\u6761\u7528\u4f8b\u7684\u88c5\u9970\u5668\u4e0a\uff0c\u96be\u4ee5\u96c6\u4e2d\u7ef4\u62a4\uff1b\u4e8e\u662f\u4e4e\u5c06\u6240\u6709\u6807\u7b7e\u4f7f\u7528 csv \u6587\u4ef6\u8fdb\u884c\u96c6\u4e2d\u7ba1\u7406\uff0c\u5e76\u901a\u8fc7 Pytest \u7684\u94a9\u5b50\u51fd\u6570\uff0c\u8bfb\u53d6 csv \u6587\u4ef6\uff0c\u52a8\u6001\u6dfb\u52a0\u6807\u7b7e\u5230\u7528\u4e2d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5csv","title":"5\u3001CSV\u6587\u4ef6\u683c\u5f0f","text":"\u6b64\u914d\u7f6e\u6587\u4ef6\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u6807\u7b7e\u6570\u636e\uff0c\u4e14\u8981\u65b9\u4fbf\u80fd\u4f7f\u7528 Excel \u6253\u5f00\u8fdb\u884c\u7f16\u8f91\u67e5\u770b\uff0c\u66f4\u91cd\u8981\u7684\u662f\u6211\u4eec\u4e0d\u60f3\u5f15\u5165\u4e09\u65b9\u4f9d\u8d56\uff0cCSV \u6587\u4ef6\u51e0\u4e4e\u662f\u552f\u4e00\u80fd\u6ee1\u8db3\u6240\u6709\u7684\u8981\u6c42\u7684\u6587\u4ef6\u683c\u5f0f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_6","title":"\u4e03\u3001\u65e5\u5fd7\u7cfb\u7edf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_5","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e YouQu \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u64cd\u4f5c\u65b9\u6cd5\u5c01\u88c5\u5199\u6cd5\uff0c\u901a\u5e38\u662f\u8fd9\u6837\u7684\uff1a\u7c7b\u91cc\u9762\u4e00\u4e2a\u51fd\u6570\u53ea\u5305\u542b\u4e00\u4e2a\u64cd\u4f5c\u6216\u591a\u6b21\u8c03\u7528\u7684\u4e00\u7cfb\u5217\u53ef\u5408\u5e76\u7684\u64cd\u4f5c\uff1b \u4f20\u7edf\u7684\u65e5\u5fd7\u8f93\u51fa\u65b9\u5f0f\uff0c\u9700\u8981\u5728\u6bcf\u4e2a\u51fd\u6570\u91cc\u9762\u4e3b\u52a8\u7f16\u5199\u65e5\u5fd7\u8f93\u51fa\u4ee3\u7801 \uff0c\u4f8b\u5982\uff1a class XXXWidget:\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\nlogger.info(\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\")\n...\n# \u7701\u7565\u4ee3\u7801\u90e8\u5206\n \u4e00\u4e2a\u51fd\u6570\u91cc\u9762\u81f3\u5c11\u5305\u542b\u4e00\u6761\u65e5\u5fd7\u4fe1\u606f\uff0c\u5982\u679c\u6bd4\u8f83\u590d\u6742\u64cd\u4f5c\u6b65\u9aa4\uff0c\u53ef\u80fd\u5305\u542b\u591a\u6761\u65e5\u5fd7\u4fe1\u606f\uff1b \u4e00\u4e2a\u5e94\u7528\u542b\u6709\u5927\u91cf\u7684\u64cd\u4f5c\u51fd\u6570\uff0c\u4e5f\u5c31\u662f\u8bf4\u6211\u4eec\u9700\u8981\u5199\u5927\u91cf\u7684\u65e5\u5fd7\u4ee3\u7801\uff1b \u901a\u8fc7\u7ecf\u9a8c\u89c2\u5bdf\uff0c\u6211\u4eec\u53d1\u73b0\uff0c\u51fd\u6570\u8bf4\u660e\u4ee5\u53ca\u51fd\u6570\u64cd\u4f5c\u65e5\u5fd7\uff0c\u5177\u6709\u8f83\u9ad8\u7684\u91cd\u590d\u5ea6\uff08\u4ece\u4e0a\u9762\u7684\u4f8b\u5b50\u4e5f\u53ef\u4ee5\u770b\u51fa\u6765\uff09\uff0c\u56e0\u6b64\u6211\u4eec\u5927\u80c6\u7684\u8bbe\u60f3\uff0c\u80fd\u4e0d\u80fd\u57fa\u4e8e\u6846\u67b6\u6267\u884c\u65f6\uff0c\u81ea\u52a8\u7684\u5c06\u51fd\u6570\u8bf4\u660e\u4f5c\u4e3a\u65e5\u5fd7\u6253\u5370\u51fa\u6765\uff0c\u4ece\u800c\u51cf\u5c11\u5927\u91cf\u65e5\u5fd7\u4ee3\u7801\u91cf\u548c\u91cd\u590d\u7f16\u5199\uff0c\u90a3\u771f\u662f\u5999\u554a~\u3002 \u57fa\u4e8e\u6b64\u201c\u5929\u771f\u201d\u7684\u60f3\u6cd5\uff0c\u6211\u4eec\u8bbe\u8ba1\u51fa\u4e86 youqu \u7684\u65e5\u5fd7\u7cfb\u7edf\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_5","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u6838\u5fc3\u539f\u7406\uff1a \u901a\u8fc7\u7ed9\u7c7b\u52a0\u4e0a\u4e00\u4e2a\u88c5\u9970\u5668 @log\uff0c\u52a8\u6001\u7ed9\u8be5\u7c7b\u4e0b\u6240\u6709\u7684\u51fd\u6570\u53ca\u7236\u7c7b\u51fd\u6570\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668 @_trace\uff0c\u5728\u6b64\u88c5\u9970\u5668\u4e2d\u6211\u4eec\u80fd\u52a8\u6001\u7684\u6355\u83b7\u6240\u8c03\u7528\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff08func.__doc__\uff09\uff0c\u901a\u8fc7\u65e5\u5fd7\u8f93\u51fa\u5668\u5c06\u5176\u8f93\u51fa\u5373\u53ef\u3002 \u5b9e\u73b0\u6b65\u9aa4\uff1a \u901a\u8fc7 inspect.getmembers \u83b7\u53d6\u88ab\u88c5\u9970\u7684\u7c7b\u4e0b\u6240\u6709\u51fd\u6570\uff0c\u5305\u542b\u9759\u6001\u65b9\u6cd5\uff0c\u7c7b\u65b9\u6cd5\uff0c\u5b9e\u4f8b\u65b9\u6cd5\uff1b \u901a\u8fc7 setattr(\u7c7b, \u65b9\u6cd5, _trace\uff09 \u7684\u65b9\u5f0f\uff0c\u7ed9\u7b26\u5408\u6761\u4ef6\u7684\u51fd\u6570\uff0c\u52a8\u6001\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_3","title":"3\u3001\u65e5\u5fd7\u914d\u7f6e","text":"[log_cli]\n;\u65e5\u5fd7\u76f8\u5173\u914d\u7f6e\uff08\u4e0d\u6253\u5370\u6784\u9020\u51fd\u6570\u548c\u9b54\u6cd5\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff09\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = INFO\n# ============= \u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u914d\u7f6e ================\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u5f00\u5934\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7, \u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_STARTSWITH = Assert\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u7ed3\u5c3e\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_ENDSWITH = Widget\n;\u652f\u6301\u7c7b\u540d\u5305\u542b xxx \u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_CONTAIN = ShortCut\n# ==============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_3","title":"4\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u5728\u5e94\u7528\u5e93 widget \u65b9\u6cd5\u5e93\u91cc\u9762\uff0c\u53ea\u9700\u8981\u5728\u51fa\u53e3\u6587\u4ef6\u52a0\u4e0a\u7c7b\u88c5\u9970\u5668\uff0c\u5c31\u53ef\u4ee5\u5b9e\u73b0\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u4e86\uff1b # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6ce8\u610f\uff0c\u662f\u7c7b\u88c5\u9970\u5668\u3002 \u5b9e\u4f8b\uff1a # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\n@classmethod\ndef find_dfm_image(cls, *elements, multiple=False, rate=0.9):\n\"\"\"\n \u67e5\u627e\u56fe\u7247 {{elements}}.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e {{rate}} \u7684\u5750\u6807\n :param elements:\n :param multiple:\n :return:\n \"\"\"\nelement = tuple(map(lambda x: f\"{Config.PIC_RES_PATH}/{x}\", elements))\nreturn cls.find_image(*element, multiple=multiple)\n \u8c03\u7528\u65b9\u6cd5\u65f6\uff1a DfmWidget.find_dfm_image(\"dfm_001\")\n \u81ea\u52a8\u8f93\u51fa\u7684\u65e5\u5fd7\uff1a >> x86_64-uos-6: 02/28 17:48:47 | INFO | logger_utils: [find_dfm_image]: \u67e5\u627e\u56fe\u7247 dfm_001.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e 0.9 \u7684\u5750\u6807\n \u52a0\u4e0a\u88c5\u9970\u5668 @log \u4e4b\u540e\uff0c\u65b9\u6cd5\u5c42\u6240\u6709\u7684\u51fd\u6570\uff08\u5305\u62ec\u5b9e\u4f8b\u65b9\u6cd5\u3001\u7c7b\u65b9\u6cd5\u3001\u9759\u6001\u65b9\u6cd5\uff09\u90fd\u4e0d\u9700\u8981\u518d\u5199\u65e5\u5fd7\u4ee3\u7801\uff0c\u6267\u884c\u7684\u65f6\u5019\u4f1a\u81ea\u52a8\u8f93\u51fa\uff0c\u5e76\u4e14\u6240\u6709\u8c03\u7528\u7684\u65b9\u6cd5\u4f1a\u4ee5 allure.step \u7684\u65b9\u5f0f\uff0c\u5c55\u793a\u5728 allure \u62a5\u544a\u4e2d\uff0c\u5728\u62a5\u544a\u4e2d\u66f4\u80fd\u4e00\u76ee\u4e86\u7136\u7684\u770b\u5230\u7528\u4f8b\u6267\u884c\u6b65\u9aa4\u3002 \u3010\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\u3011 \u901a\u8fc7\u89c2\u5bdf\u524d\u9762\u7684\u4f8b\u5b50\uff0c\u7ec6\u5fc3\u7684\u540c\u5b66\u53ef\u80fd\u8fd8\u53d1\u73b0\u4e86\u4e00\u4e2a\u5c0f\u7ec6\u8282\uff1a\u51fd\u6570\u529f\u80fd\u8bf4\u660e\u4e2d\uff0c\u4e24\u5bf9\u5927\u62ec\u53f7\u4e2d\u7684\u5185\u5bb9 {{elements}} \u4f5c\u4e3a\u53d8\u91cf\u8f93\u51fa\u51fa\u6765\u4e86\uff1b \u6ca1\u9519\uff0c\u8fd9\u5c31\u662f\u6211\u4eec\u53c2\u8003Django \u548c jinja2 \u7684\u6a21\u677f\u8bed\u6cd5\u8bbe\u8ba1\u51fa\u7684\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\uff0c\u4f7f\u7528\u65b9\u6cd5\u5f88\u7b80\u5355\uff0c\u7528\u4e24\u5bf9\u5927\u62ec\u53f7\u628a\u51fd\u6570\u7684\u53c2\u6570\u62ec\u8d77\u6765\uff0c\u8fd9\u6837\u5728\u65e5\u5fd7\u8f93\u51fa\u7684\u65f6\u5019\u5c31\u80fd\u628a\u8c03\u7528\u51fd\u6570\u65f6\u53c2\u6570\u7684\u503c\u8f93\u51fa\u51fa\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_7","title":"\u516b\u3001\u73af\u5883\u90e8\u7f72","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_6","title":"1\u3001\u539f\u5219","text":"YouQu \u7684\u73af\u5883\u4f9d\u8d56\u4e00\u76f4\u575a\u6301 2 \u4e2a\u539f\u5219\uff1a \u6700\u5c0f\u73af\u5883\u4f9d\u8d56\u539f\u5219 \u6709\u4e9b\u540c\u5b66\u5199\u4e00\u4e9b\u529f\u80fd\uff0c\u9996\u5148\u60f3\u5230\u7684\u5c31\u662f\u53bb\u641c\u7d22\u5f15\u64ce\u641c\u4e00\u4e0b\uff0c\u770b\u6709\u6ca1\u6709\u73b0\u6210\u7684\u5de5\u5177\u6216\u8005\u4ee3\u7801\u76f4\u63a5\u80fd\u7528\uff0c\u7f8e\u5176\u540d\u66f0\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\uff0c\u522b\u4eba\u5df2\u7ecf\u9020\u597d\u4e86\u8f6e\u5b50\u54b1\u4eec\u5c31\u4e0d\u8981\u91cd\u590d\u53bb\u9020\u4e86\uff0c\u7136\u540e\u4e00\u5207\u4f3c\u4e4e\u90fd\u53d8\u5f97\u90a3\u4e48\u7684\u7406\u6240\u5e94\u5f53\u3002 \u5f53\u7136\u8fd9\u6837\u505a\u65e0\u53ef\u539a\u975e\uff0c\u6211\u76f8\u4fe1\u6709\u8fd9\u6837\u60f3\u6cd5\u5e76\u4e14\u4e00\u76f4\u8df5\u884c\u8fd9\u6837\u505a\u6cd5\u7684\u540c\u5b66\u4e0d\u5728\u5c11\u6570\uff0c\u4f46\u8fd9\u6837\u505a\u6709\u4e00\u4e2a\u5f88\u4e25\u91cd\u7684\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f60\u5199\u4e00\u4e2a\u5927\u578b\u9879\u76ee\u65f6\uff0c\u4f60\u4f1a\u5f15\u5165\u975e\u5e38\u975e\u5e38\u975e\u5e38\u591a\u7684\u4f9d\u8d56\uff0c\u6bd4\u5982\u8981\u505a\u4e2a\u63a5\u53e3\u8bf7\u6c42\u8981\u7528 requests\u3001\u8bfb\u5199\u4e2a\u6570\u636e\u7528 pandas\u3001\u5199\u4e2a\u8868\u683c\u7528 pyopenxl\u3001\u89e3\u6790\u4e2a\u6587\u672c\u8981\u7528\u8fd9\u4e2a\u90a3\u4e2a\u4e09\u65b9\u5e93 ... \u3002 \u6211\u8ba4\u4e3a\u8fd9\u662f\u975e\u5e38\u4e0d\u597d\u7684\u4e60\u60ef\uff0c\u5728\u5b9e\u73b0\u4e00\u4e2a\u529f\u80fd\u7684\u65f6\u5019\uff0c\u9996\u5148\u6211\u4eec\u5e94\u8be5\u53bb\u60f3\u81ea\u5df1\u600e\u4e48\u6837\u53bb\u5b9e\u73b0\uff0c\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff1b \u5982\u679c\u4f60\u4e0d\u4f1a\uff0c\u4f60\u53ef\u4ee5\u53bb\u5b66\u4e60\u4e09\u65b9\u5e93\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u522b\u4eba\u4e09\u65b9\u5e93\u4e5f\u662f\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\u7684\uff0c\u4e3a\u4ec0\u4e48\u54b1\u4eec\u4e0d\u884c\u5462\uff1b\u5982\u679c\u522b\u4eba\u7684\u4f60\u5b9e\u5728\u662f\u770b\u4e0d\u61c2\uff0c\u60f3\u5c3d\u4e00\u5207\u529e\u6cd5\u786e\u5b9e\u505a\u4e0d\u51fa\u6765\uff0c\u90a3\u518d\u8003\u8651\u5f15\u5165\u8fd9\u4e2a\u4e09\u65b9\u5e93\uff0c\u6211\u8ba4\u4e3a\u8fd9\u6837\u662f\u6ca1\u95ee\u9898\u7684\uff0c\u6bd5\u7adf\u54b1\u4eec\u6bb5\u4f4d\u8fd8\u4e0d\u591f\uff0c\u4f46\u5e0c\u671b\u5c06\u6765\u6709\u4e00\u5929\u6211\u4eec\u53ef\u4ee5\u3002 \u8fd9\u6837\u7684\u505a\u6cd5\u624d\u5e94\u8be5\u662f\u201c\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\u201d\u6b63\u786e\u7684\u64cd\u4f5c\u3002\u4e0d\u4f1a\u6ca1\u5173\u7cfb\uff0c\u770b\u770b\u522b\u4eba\u662f\u600e\u4e48\u5b9e\u73b0\u7684\uff0c\u81ea\u5df1\u518d\u6478\u7d22\u7740\u5199\u51fa\u6765\uff0c\u8fd9\u6837\u81ea\u5df1\u624d\u80fd\u6709\u6240\u63d0\u9ad8\uff0c\u4e0d\u7136\u4f60\u5c31\u53ea\u4f1a\u7528\u522b\u4eba\u7684\u4e1c\u897f\uff1b\u90a3\u4e9b\u5632\u7b11\u3001\u6279\u8bc4\u6211\u4eec\u91cd\u590d\u9020\u8f6e\u5b50\u7684\u4eba\uff0c\u5148\u60f3\u60f3\u81ea\u5df1\u4f1a\u9020\u8f6e\u5b50\u5417\u3002 \u672c\u7740\u81ea\u5df1\u5b9e\u73b0\u80fd\u5b9e\u73b0\u7684\u4e00\u5207\u7684\u539f\u5219\uff0cYouQu \u6846\u67b6\u505a\u5230\u4e86\u975e\u5e38\u5c11\u7684\u73af\u5883\u4f9d\u8d56\uff0c\u800c\u4e14\u6211\u4eec\u4ecd\u5728\u4e0d\u65ad\u52aa\u529b\uff0c\u51cf\u5c11\u73af\u5883\u90e8\u7f72\u7684\u4f9d\u8d56\u3002 \u6700\u5c0f\u4ed3\u5e93\u4f53\u79ef\u539f\u5219 \u5927\u6587\u4ef6\u4e0d\u80fd\u4e0a\u4f20\u5230\u5de5\u7a0b\u91cc\u9762\uff0c\u4fdd\u6301\u6574\u4e2a\u5de5\u7a0b\u7684\u8f7b\u91cf\u5316\uff0c\u8fd9\u6837\u5728\u514b\u9686\u4ee3\u7801\u7684\u65f6\u5019\u624d\u80fd\u975e\u5e38\u5feb\u901f\u65b9\u4fbf\u4f7f\u7528\uff0c\u6211\u4eec\u89c1\u8fc7\u4e00\u4e2a AT \u5de5\u7a0b clone \u5927\u5c0f\u8fbe\u5230\u597d\u51e0\u4e2a G\uff0c\u7b80\u76f4\u4e0d\u53ef\u601d\u8bae\u3002 \u5176\u5b9e\u4ee3\u7801\u6587\u4ef6\u7684\u5927\u5c0f\u662f\u5f88\u5c0f\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u7eaf\u5199\u4ee3\u7801\u968f\u4fbf\u5199\u5de5\u7a0b\u4e5f\u4e0d\u4f1a\u592a\u5927\uff0c\u800c\u6587\u6863\uff08\u5305\u542b\u63d2\u56fe\uff09\u7b49\u8d44\u6e90\u5374\u662f\u5f88\u5360\u7a7a\u95f4\u3002 \u56e0\u6b64\u6211\u4eec\u9009\u62e9\u5c06 YouQu \u7684\u6587\u6863\u5de5\u7a0b\u6d89\u53ca\u5230\u7684\u56fe\u7247\u8d44\u6e90\u90fd\u91c7\u7528\u5916\u94fe\u52a0\u8f7d\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_6","title":"2\u3001\u5b89\u88c5","text":"\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u8fd0\u884c env.sh \u5373\u53ef\u3002 bash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_4","title":"3\u3001\u5b9a\u5236\u4f9d\u8d56","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_2","title":"3.1\u3001\u65b0\u589e\u4f9d\u8d56","text":"\u5982\u679c\u5e94\u7528\u5e93\u8fd8\u9700\u8981\u5176\u4ed6 Python \u4f9d\u8d56\u5e93\uff0c\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a requirement.txt \u6587\u4ef6\uff1b autotest_xxx\n\u251c\u2500\u2500 requirement.txt\n\u251c\u2500\u2500 case ...\n \u91cc\u9762\u5199\u5165\u9700\u8981\u5b89\u88c5\u7684\u4e09\u65b9\u4f9d\u8d56\uff0c\u6bd4\u5982\u50cf\u8fd9\u6837\uff1a # requirement.txt\nPyYAML==6.0 # \u6307\u5b9a\u5b89\u88c5\u67d0\u4e2a\u7248\u672c\nrequests # \u672a\u6307\u5b9a\u7248\u672c\u5219\u5b89\u88c5\u6700\u65b0\u7248\n \u5728\u6267\u884c bash env.sh \u65f6\u4f1a\u4e00\u5e76\u5c06\u5176\u5b89\u88c5\u3002 \u5982\u679c\u591a\u4e2a\u5e94\u7528\u5e93\u90fd\u5b58\u5728 requirement.txt \u6587\u4ef6\uff0c\u6267\u884c env.sh \u65f6\u4f1a\u5c06\u591a\u4e2a requirement.txt \u6587\u4ef6\u4e00\u5e76\u52a0\u8f7d\uff1b\u90a3\u4e48\u4e00\u5b9a\u8981\u6ce8\u610f\u591a\u4e2a requirement.txt \u6587\u4ef6\u53ef\u80fd\u5b58\u5728\u76f8\u540c\u7684\u4f9d\u8d56\u88ab\u6307\u5b9a\u5b89\u88c5\u4e0d\u540c\u7248\u672c\u7b49\u7b49\u517c\u5bb9\u6027\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32_1","title":"3.2\u3001\u88c1\u526a\u4f9d\u8d56","text":"\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0c\u53ef\u80fd\u4f60\u53ea\u9700\u8981\u5b89\u88c5\u4e00\u4e9b\u6700\u6700\u57fa\u7840\u7684\u4f9d\u8d56\uff0c\u5176\u4ed6\u7684\u90fd\u4e0d\u9700\u8981\uff0c\u6bd4\u5982\u7eaf\u63a5\u53e3\u81ea\u52a8\u5316\u7684\u9879\u76ee\uff0c\u5b83\u4e0d\u9700\u8981 UI \u81ea\u52a8\u5316\u76f8\u5173\u7684\u4f9d\u8d56\u3002 \u4f60\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\uff0c\u5b58\u653e\u4e00\u4e2a BASICENV \u7684\u666e\u901a\u6587\u4ef6\uff0c\u91cc\u9762\u4e0d\u9700\u8981\u5199\u4efb\u4f55\u5185\u5bb9\uff0c\u8fd9\u6837\u6267\u884c env.sh \u65f6\uff0c\u53ea\u4f1a\u5b89\u88c5\u6700\u57fa\u7840\u7684\u4f9d\u8d56\u3002 autotest_xxx\n\u251c\u2500\u2500 BASICENV # \u53ef\u4ee5\u4f7f\u7528\uff1atouch BASICENV \u521b\u5efa\u6587\u4ef6\n\u251c\u2500\u2500 case ...\n \u57fa\u7840\u4f9d\u8d56\u4ec5\u5b89\u88c5\u4ee5\u4e0b\u51e0\u4e2a\u5305\uff1a pytest # pytest\npytest-rerunfailures # \u5931\u8d25\u91cd\u8dd1\u63d2\u4ef6\npytest-timeout # \u7528\u4f8b\u8d85\u65f6\u63d2\u4ef6\nallure-pytest # \u751f\u6210 allure \u62a5\u544a\u63d2\u4ef6\nallure.deb # allure \u62a5\u544a\u67e5\u770b\u5de5\u5177\n \u88c1\u526a\u4f9d\u8d56 \u548c \u65b0\u589e\u4f9d\u8d56 \u662f\u4e0d\u51b2\u7a81\u7684\uff0c\u53ef\u4ee5\u540c\u65f6\u4f7f\u7528\u3002 \u6b64\u65b9\u6848\u9ed8\u8ba4\u4e3a\u865a\u62df\u73af\u5883\u90e8\u7f72\uff0c\u5982\u679c\u4f60\u60f3\u76f4\u63a5\u90e8\u7f72\u5728\u672c\u673a\u4e0a\uff1a bash env_dev.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_4","title":"4\u3001\u865a\u62df\u5316\u90e8\u7f72","text":"YouQu\u9ed8\u8ba4\u91c7\u7528\u865a\u62df\u5316\u90e8\u5206\uff0c\u865a\u62df\u5316\u73af\u5883\u5b9e\u9645\u5b89\u88c5\u7684\u4f4d\u7f6e\u662f\u5728 $HOME/.local/share/virtualenvs/youqu-oHTM7l7G \u76ee\u5f55\u4e0b youqu-oHTM7l7G \u6b64\u76ee\u5f55\u540d\u79f0\u524d\u9762\u90e8\u5206\u662f\u4f60\u7684\u4ee3\u7801\u6839\u76ee\u5f55\u7684\u540d\u79f0\uff0c\u540e\u9762\u90e8\u5206\u662f\u751f\u6210\u7684\u968f\u673a\u5b57\u7b26\u4e32\uff1b \u540c\u5b66\u4eec\u5728\u8fdc\u7a0b\u673a\u5668\u4e0a\u5b9a\u4f4d\u95ee\u9898\u7684\u65f6\u5019\uff0c\u5982\u679c\u4f7f\u7528 Pycharm \u8c03\u8bd5\uff0c\u5c31\u5c06\u89e3\u91ca\u5668\u6307\u5b9a\u5230\u8fd9\u4e2a\u76ee\u5f55\u7684\u5c31\u884c\u4e86\uff1b \u5f53\u7136\uff0c\u6211\u4eec\u4e5f\u63d0\u4f9b\u4e86\u672c\u673a\u5f00\u53d1\u73af\u5883\u90e8\u7f72\uff1a bash env_dev.sh\n \u5982\u679c\u4f60\u662f\u672c\u5730\u5f00\u53d1\u73af\u5883\u53ef\u4ee5\u7528\u5b83\uff0c\u533a\u522b\u5c31\u662f\u9a71\u52a8\u6267\u884c\u7684\u65f6\u5019\u4f7f\u7528\uff1apython3 manage.py xxx"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_8","title":"\u4e5d\u3001\u5931\u8d25\u5f55\u5c4f","text":"\u5f55\u5c4f\u5176\u5b9e\u662f\u4e00\u79cd\u89c6\u9891\u5f62\u5f0f\u7684\u65e5\u5fd7\uff0c\u56e0\u4e3a\u5f88\u591a\u65f6\u5019\u6211\u4eec\u5728\u67e5\u770b\u65e5\u5fd7\u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u51c6\u786e\u7684\u5b9a\u4f4d\u5230\u7528\u4f8b\u5931\u8d25\u7684\u5177\u4f53\u539f\u56e0\uff0c\u56e0\u6b64\u7528\u4f8b\u7684\u5f55\u5c4f\u80fd\u8ba9\u6211\u4eec\u770b\u5230\u7528\u4f8b\u5728\u6267\u884c\u8fc7\u7a0b\uff1b \u3010\u4f7f\u7528\u65b9\u6cd5\u3011 \u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u5173\u6ce8 2 \u4e2a\u53c2\u6570\uff1b ;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\u3002\n;\u6ce8\u610f\uff0c\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u4e0d\u80fd\u5c0f\u4e8e\u5931\u8d25\u5f55\u5c4f\u6b21\u6570\uff0c\u5373 RERUN >= RECORD_FAILED_CASE\nRECORD_FAILED_CASE = 1\n \u9ed8\u8ba4\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u662f 1 \u6b21\uff1b RECORD_FAILED_CASE = 1 \u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff1b RECORD_FAILED_CASE = 0 \u8868\u793a\u4e0d\u7ba1\u7528\u4f8b\u6210\u529f\u6216\u5931\u8d25\u90fd\u5f55\u5c4f\uff1b \u5f55\u5c4f\u662f\u8981\u5360\u7528\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u7279\u522b\u662f\u5728\u4e00\u4e9b\u914d\u7f6e\u8f83\u4f4e\u7684\u673a\u5668\u4e0a\u4f1a\u5f88\u660e\u663e\uff0c\u6240\u4ee5\u4f60\u9700\u8981\u8003\u8651\u662f\u5426\u6709\u5fc5\u8981\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1b \u4f7f\u7528 manage.py \u6267\u884c\u7528\u4f8b\u9ed8\u8ba4\u8bfb\u53d6\u5230 globalconfig.ini \u91cc\u9762\u7684\u53c2\u6570\uff0c\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report/record \u76ee\u5f55\u4e0b\u4fdd\u5b58\u5931\u8d25\u7528\u4f8b\u7684\u5f55\u5c4f\u548c\u65ad\u8a00\u7684\u90a3\u4e2a\u65f6\u95f4\u70b9\u7684\u622a\u5c4f\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7\u89c6\u9891\u6587\u4ef6\u770b\u5230\u5931\u8d25\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u90fd\u53d1\u751f\u4e86\u4ec0\u4e48\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#wayland","title":"\u5341\u3001Wayland \u9002\u914d","text":"Wayland \u4e0b\u81ea\u52a8\u5316\u4e3b\u8981\u95ee\u9898\u662f X11 \u4e0b\u7684\u952e\u9f20\u64cd\u4f5c\u65b9\u6cd5\u65e0\u6cd5\u4f7f\u7528\uff0c\u6bd4\u5982 Xdotool\u3001 PyAutoGUI\u3001Xwininfo \u7b49\u7b49\uff1b YouQu \u5728 Wayland \u4e0b\u517c\u5bb9\u9002\u914d\uff0cenv.sh \u5728 Wayland \u4e0b\u6267\u884c\u65f6\u4f1a\u5b89\u88c5\u81ea\u7814\u7684\u952e\u9f20\u64cd\u4f5c\u670d\u52a1\uff08\u53ef\u80fd\u5b58\u5728\u4e00\u4e9b\u4f9d\u8d56\u62a5\u9519\uff0c\u6309\u7167\u6ce8\u91ca\u89e3\u51b3\u5373\u53ef\uff09\uff0c\u6846\u67b6\u6838\u5fc3\u5e93\u4e5f\u9488\u5bf9\u6027\u7684\u505a\u4e86\u9002\u914d\uff0c\u4e0a\u5c42\u7528\u4f8b\u5b8c\u5168\u4e0d\u7528\u5173\u5fc3\u673a\u5668\u662fWayland \u8fd8\u662f X11\uff0c\u6846\u67b6\u4f1a\u6839\u636e\u6267\u884c\u65f6\u72b6\u6001\u81ea\u52a8\u5224\u65ad\u8d70\u4e0d\u540c\u7684\u903b\u8f91\uff1b \u7b80\u5355\u8bb2\u5c31\u662f\uff0c\u5e94\u7528\u5e93\u53ea\u9700\u8981\u7ef4\u62a4\u4e00\u5957\u7528\u4f8b\u811a\u672c\u5373\u53ef\u3002 \u3010\u7528\u4f8b\u517c\u5bb9\u3011 \u56e0\u4e3a Wayland \u4e0b\u6709\u4e9b\u5e94\u7528\u7684\u754c\u9762\u663e\u793a\u548c\u529f\u80fd\u672c\u8eab\u5b58\u5728\u4e00\u4e9b\u5dee\u5f02\uff0c\u7528\u4f8b\u5c42\u53ef\u80fd\u9700\u8981\u5bf9\u8fd9\u90e8\u5206\u7528\u4f8b\u505a\u903b\u8f91\u5224\u65ad\uff0c\u4f7f\u7528\u5168\u5c40\u914d\u7f6e\u91cc\u9762\u7684\u5e38\u91cf\u8fdb\u884c\u903b\u8f91\u7f16\u5199\u5373\u53ef\uff1a from setting.globalconfig import GlobalConfig\n# GlobalConfig.IS_WAYLAND \u83b7\u53d6\u5230\u5f53\u524d\u7684\u663e\u793a\u670d\u52a1\u5668\uff08bool\uff09\n# \u5e94\u7528\u5e93 Config \u7ee7\u627f GlobalConfig\nif Config.IS_WAYLAND:\npass\nif Config.IS_X11:\npass\n \u6bd4\u5982\u7528\u4f8b\u91cc\u9762\u5982\u679c\u65ad\u8a00\u7684\u56fe\u7247\u4e0d\u540c\uff1a if Config.IS_WAYLAND:\nself.assert_image_exist(\"wayland_XXX\")\nelse:\nself.assert_image_exist(\"x11_XXX\")\n \u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u811a\u672c\u5728 Wayland \u548c X11 \u4e0b\u90fd\u53ef\u4ee5\u8dd1\uff0cso easy \u662f\u4e0d\u662f\uff1f\u5b8c\u5168\u6ca1\u5fc5\u8981\u4e13\u95e8\u62c9\u65b0\u5206\u652f\u8fdb\u884c Wayland \u9002\u914d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_9","title":"\u5341\u4e00\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_7","title":"1. \u76ee\u5f55\u7ed3\u6784","text":"\u6267\u884c\u65f6\u4f1a\u5728\u6839\u76ee\u5f55\u4e0b\u52a8\u6001\u751f\u6210 report \u76ee\u5f55\uff0c\u6240\u6709\u7684\u62a5\u544a\u76f8\u5173\u7684\u6587\u4ef6\u4f1a\u7edf\u4e00\u5b58\u653e\u5728\u91cc\u9762\uff0c\u793a\u4f8b\uff1a /report\n \u251c\u2500\u2500 allure # allure\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json\n \u251c\u2500\u2500 allure_html # \u751f\u6210\u7684html\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 index.html \u251c\u2500\u2500 allure_back # allure\u62a5\u544a\u5907\u4efd\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 20221108114823\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json\n \u251c\u2500\u2500 json # json\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 result_deepin-music_20221109134736_1081333.json\n \u251c\u2500\u2500 logs # \u65e5\u5fd7\u6587\u4ef6\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 2022-11-10_debug.log \u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-10_error.log\n \u251c\u2500\u2500 record # \u5f55\u5c4f\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-09\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 15\u65f614\u520609\u79d2_test_music_303_2_autotest.mp4\n \u2514\u2500\u2500 xml # xml\u62a5\u544a\n\u2514\u2500\u2500 autotest_deepin_music-20221109134736.xml\n \u9ed8\u8ba4\u60c5\u51b5\u4e0b\u540c\u65f6\u751f\u6210 html\u3001xml\u3001json\u4e09\u79cd\u5f62\u5f0f\u7684\u62a5\u544a\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_7","title":"2. \u5b9a\u5236\u62a5\u544a","text":"\u6211\u4eec\u5bf9 allure \u62a5\u544a\u8fdb\u884c\u4e86\u4e00\u7cfb\u5217\u7684\u5b9a\u5236\uff1a \u5b9a\u5236 logo\u3001title\u3001\u62a5\u544a\u9ed8\u8ba4\u8bed\u8a00\u4e3a\u4e2d\u6587\uff1b \u52a0\u5165\u4e86\u7528\u4f8b\u65ad\u8a00\u5931\u8d25\u65f6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u4ee5\u53ca\u6b64\u65f6\u56fe\u50cf\u5bf9\u6bd4\u7684\u6a21\u677f\u56fe\u7247\uff1b \u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\uff0c\u4f60\u53ef\u4ee5\u5728 html \u62a5\u544a\u4e2d\u76f4\u63a5\u770b\u5f55\u5236\u7684\u89c6\u9891\uff1b \u52a0\u5165\u4e86 IP \u5730\u5740\u3001\u7cfb\u7edf\u4fe1\u606f\u3001\u955c\u50cf\u7248\u672c\u7b49\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_5","title":"3. \u67e5\u770b\u62a5\u544a","text":" \u672c\u5730\u6267\u884c \u5728 report/allure \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u4e00\u5806\u6587\u672c\u6587\u4ef6\uff0c\u8fd9\u4e9b\u662f allure \u63d2\u4ef6\u751f\u6210\u7684\u62a5\u544a\u6e90\u6570\u636e\uff0c\u6211\u4eec\u5728 report/allure_html \u76ee\u5f55\u4e0b\u7ed9\u4f60\u751f\u6210\u4e86 html \u6587\u4ef6\uff0c\u4f46\u662f\u4f60\u4e0d\u80fd\u76f4\u63a5\u901a\u8fc7\u6d4f\u89c8\u5668\u6253\u5f00 index.html \u6587\u4ef6\uff0c\u56e0\u4e3a allure \u7684\u62a5\u544a\u90fd\u662f\u57fa\u4e8e\u5728\u7ebf\u7684\u670d\u52a1\uff0c\u4f60\u5e94\u8be5\u8fd9\u6837\u6253\u5f00\uff1a allure open report/allure_html\n \u4f7f\u7528 manage.py \u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u5728\u7ec8\u7aef\u7684\u6700\u540e\u4e00\u884c\uff0c\u6211\u4eec\u4f1a\u7ed9\u4f60\u8f93\u51fa\u6253\u5f00\u62a5\u544a\u7684\u547d\u4ee4\uff0c\u76f4\u63a5\u590d\u5236\u5b83\u5728\u7ec8\u7aef\u6267\u884c\u5c31\u53ef\u4ee5\u67e5\u770b\u4e86\uff0c\u50cf\u8fd9\u6837\uff1a \u7ec8\u7aef\u6267\u884c\u547d\u4ee4: allure open /tmp/youqu/report/allure_html \u67e5\u770b\u62a5\u544a \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 Pycharm \u91cc\u9762\u627e\u5230 index.html \u6587\u4ef6\uff0c\u7136\u540e\u53f3\u952e\u9009\u62e9\u6d4f\u89c8\u5668\u6253\u5f00\uff0c\u6216\u8005\u4f60\u53ef\u4ee5\u7528\u4e00\u4e2a http \u670d\u52a1\u6253\u5f00\u3002 \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 report/allure \u76ee\u5f55\u4e0b\u67e5\u770b\u62a5\u544a\uff1a allure serve report/allure\n \u8fdc\u7a0b\u6267\u884c \u8fdc\u7a0b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\uff0c\u4f1a\u5c06\u6240\u6709\u8fdc\u7a0b\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u62a5\u544a\u90fd\u6536\u96c6\u5230 report/allure \u76ee\u5f55\u4e0b\uff0c\u5206\u522b\u6309\u7167\u673a\u5668\u7684 IP \u7b49\u5efa\u4e86\u4e0d\u540c\u7684\u76ee\u5f55\uff0c\u4f60\u53ef\u4ee5\u5728\u8fd9\u4e9b\u76ee\u5f55\u91cc\u9762\u53bb\u67e5\u770b\u5bf9\u5e94\u7684\u6d4b\u8bd5\u62a5\u544a\uff0c\u67e5\u770b\u65b9\u6cd5\u548c\u524d\u9762\u672c\u5730\u6267\u884c\u67e5\u770b\u7684\u65b9\u6cd5\u4e00\u6837\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_10","title":"\u5341\u4e8c\u3001\u9759\u6001\u4ee3\u7801\u626b\u63cf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_8","title":"1. \u63d0\u524d\u89e3\u51b3\u4ee3\u7801\u95ee\u9898","text":"\u4e3a\u4e86\u5e2e\u52a9\u5f00\u53d1\u8005\u7edf\u4e00\u4ee3\u7801\u98ce\u683c\uff0cPython \u793e\u533a\u63d0\u51fa\u4e86 PEP8 \u4ee3\u7801\u7f16\u7801\u98ce\u683c\uff0cPython \u5b98\u65b9\u540c\u65f6\u63a8\u51fa\u4e86\u4e00\u4e2a\u68c0\u67e5\u4ee3\u7801\u98ce\u683c\u662f\u5426\u7b26\u5408 PEP8 \u7684\u5de5\u5177\uff0c\u540d\u5b57\u4e5f\u53eb PEP8\u3002 \u4f46\u662f\uff0cPycharm \u91cc\u9762\u7684 PEP8 \u63d2\u4ef6\u5b9e\u9645\u4e0a\u5e76\u4e0d\u80fd\u53d1\u73b0\u5f88\u591a\u4ee3\u7801\u95ee\u9898\uff0c\u8fd9\u4e9b\u95ee\u9898\u5e76\u4e0d\u4f1a\u5728\u8fd0\u884c\u65f6\u62a5\u9519\uff0c\u56e0\u4e3a\u4ece Python \u8bed\u8a00\u89d2\u5ea6\u5e76\u4e0d\u5173\u5fc3\u8fd9\u4e9b\u95ee\u9898\uff0c\u5728 Pycharm \u7f16\u8f91\u5668\u91cc\u9762\u4f7f\u7528\u5feb\u6377\u952e ctrl + alt + L\uff0c\u6709\u4e00\u70b9\u70b9\u683c\u5f0f\u5316\u7684\u6548\u679c\uff0c\u80fd\u89e3\u51b3\u4e00\u4e9b\u7a7a\u683c\u3001\u6362\u884c\u7b49\u5c0f\u95ee\u9898\u3002 \u8fd9\u91cc\u63a8\u8350\u4e00\u4e2a Python \u793e\u533a\u6d41\u884c\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff1a Black\uff0c\u53f7\u79f0\u4e0d\u59a5\u534f\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff0c\u5b83\u68c0\u6d4b\u5230\u4e0d\u7b26\u5408\u89c4\u8303\u7684\u4ee3\u7801\u98ce\u683c\u76f4\u63a5\u5c31\u5e2e\u4f60\u5168\u90e8\u683c\u5f0f\u5316\u597d\uff0c\u5c31\u662f\u8fd9\u4e48\u521a\uff01 \u5b89\u88c5\uff1a sudo pip3 install black \n \u4f7f\u7528\u65b9\u6cd5\uff1a black ${CheckPath}\n \u4f7f\u7528\u8fd9\u4e2a\u5de5\u5177\u683c\u5f0f\u5316\u4e4b\u540e\uff0c\u4ee3\u7801\u4f1a\u88ab\u81ea\u52a8\u8c03\u6574\uff0c\u521a\u5f00\u59cb\u4f60\u53ef\u80fd\u4f1a\u89c9\u5f97\u8c03\u6574\u5f97\u5f88\u5938\u5f20\uff0c\u6ca1\u5173\u7cfb\u575a\u6301\u770b\uff0c\u4e60\u60ef\u4e4b\u540e\uff0c\u4f60\u4f1a\u89c9\u5f97\u5f88\u4f18\u96c5\uff0c\u6ca1\u9519\uff0c\u8fd9\u5c31\u662f Pythonic Code \u7684\u6838\u5fc3\uff0c\u8bf7\u4fdd\u6301\u4f18\u96c5\uff5e\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_8","title":"2. \u4ee3\u7801\u626b\u63cf\u5de5\u5177","text":"\u4f7f\u7528\u6839\u76ee\u5f55\u4e0b pylint.sh \u626b\u63cf\u4ee3\u7801\uff0c\u5728 report \u76ee\u5f55\u4e0b\u67e5\u770b\u4ee3\u7801\u626b\u63cf\u62a5\u544a\uff0c\u5982\u679c\u6709\u4ee3\u7801\u95ee\u9898\u8bf7\u63d0\u524d\u89e3\u51b3\u4e4b\u540e\u518d\u63d0\u4ea4\u3002 \u6b64\u811a\u672c\u5df2\u7ecf\u4f7f\u7528 Python \u793e\u533a\u6700\u6d41\u884c\u7684\u4ee3\u7801\u626b\u63cf\u5de5\u5177 Pylint \u8fdb\u884c\u4ee3\u7801\u626b\u63cf\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a bash pylint.sh\n \u8fd0\u884c\u4e4b\u540e\u4f1a\u63d0\u793a\u4f60\u8981\u626b\u63cf\u7684\u76ee\u5f55\uff0c\u6bd4\u5982\u8f93\u5165 apps \uff0c\u5219\u4f1a\u626b\u63cf apps \u4e0b\u7684\u6240\u6709 Python \u4ee3\u7801\u3002 \u5728 setting/pylintrc.cfg \u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u76f8\u5173\u914d\u7f6e\uff0c\u626b\u63cf\u5b8c\u6210\u4e4b\u540e\u5728 report/pylints \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u626b\u63cf\u62a5\u544a\u3002 \u4ee3\u7801\u63d0\u4ea4\u9700\u901a\u8fc7 git review \u63d0\u4ea4\u5230 gerrit \uff0c\u4eba\u5de5 Code Review \u901a\u8fc7\u4e4b\u540e\u5408\u5165\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_11","title":"\u5341\u4e09\u3001\u63d0\u4ea4\u4ee3\u7801","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_9","title":"1. \u5b89\u88c5\u4f9d\u8d56","text":"sudo apt install git-review\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_9","title":"2. \u63d0\u4ea4\u6a21\u677f","text":"\u5728 ~ \u76ee\u5f55\u4e0b\u65b0\u5efa\u6587\u4ef6\uff0c\u5e76\u547d\u540d\u4e3a gitcommit_template \u5c06\u4ee5\u4e0b\u5185\u5bb9\u5199\u5165\u6587\u4ef6\u5f53\u4e2d\uff1a # commit type :fix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style(\u98ce\u683c\u4fee\u6539)\u3001refactor(\u91cd\u6784)\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test(\u6d4b\u8bd5) + \u7b80\u5355\u63cf\u8ff0. \u9ed8\u8ba4fix,\u6839\u636e\u60c5\u51b5\u4fee\u6539\nfix: \n\n# \u8be6\u7ec6\u8bf4\u660e\u4ee3\u7801\u7684\u6539\u52a8\uff0c\u5305\u542b\u4ee3\u7801\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u4ee5\u53ca\u4e3a\u4ec0\u4e48\u8fd9\u4e48\u505a\uff0c\u53ef\u80fd\u4f1a\u5f71\u54cd\u54ea\u4e9b\u529f\u80fd\u3002\u5bf9\u4e8e\u4ee3\u7801\u7684\u5ba1\u6838\u8005\uff0c\u9700\u8981\u4ece\u8fd9\u6bb5\u63cf\u8ff0\u4e2d\u80fd\u5b8c\u5168\u7406\u89e3\u4ee3\u7801\u4e2d\u6240\u6709\u6539\u52a8\u7684\u5185\u5bb9\nDescription: \n\n# \u5199\u4e00\u6bb5\u9762\u5411\u4e8e\u4ea7\u54c1\u7684\u603b\u7ed3\u6027\u5185\u5bb9\uff0c\u7528\u4e8e\u81ea\u52a8\u751f\u6210crp\u4e0a\u7684changlog\uff0c\u9700\u8981\u6ce8\u610f\u7684\u4e8b\uff0c\u8fd9\u6bb5\u63cf\u8ff0\u5fc5\u987b\u4ece\u4ea7\u54c1\u7684\u89d2\u5ea6\u8003\u8651\u3002\nLog: \n\n# \u5173\u8054pms\u4e0a\u7684bug\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94bug\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4fee\u590dbug\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Bug: \n\n# \u4fee\u590d github issue \n#Issue: \n\n# \u5173\u8054pms\u4e0a\u7684\u4efb\u52a1\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94\u4efb\u52a1\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4efb\u52a1\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Task: \n \u547d\u4ee4\u884c\u6267\u884c: git config --global commit.template ~/gitcommit_template\n \u6b64\u547d\u4ee4\u5c06\u6a21\u677f\u52a0\u5165\u5230 git \u7684\u63d0\u4ea4\u6a21\u677f\u4e2d\u3002 \u540e\u7eed\u63d0\u4ea4\u7684\u65f6\u5019\u9700\u8981\u5173\u6ce8\u4e00\u4e0b\u51e0\u70b9\uff1a commit type \u5bf9\u5e94\u4e0d\u540c\u7684\u4fee\u6539\u7c7b\u578b\uff1afix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style \uff08\u98ce\u683c\u4fee\u6539\uff09\u3001refactor \uff08\u91cd\u6784\uff09\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test \uff08\u6d4b\u8bd5\uff09 commit type \u5192\u53f7\u540e\u9762\u52a0\u7a7a\u683c\u3002 Description \u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u9700\u8981\u8fdb\u884c\u8be6\u7ec6\u8bf4\u660e\uff0c\u6bd4\u5982\u5bf9\u529f\u80fd\u8fdb\u884c\u5927\u6539\u7b49\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_6","title":"3. \u63a8\u9001\u4ee3\u7801","text":"\u9996\u5148\u6dfb\u52a0 commit \u4fe1\u606f git add \u540e\u9762\u52a0\u6587\u4ef6\u540d\u79f0\n git add . # \u8868\u793a\u6dfb\u52a0\u6240\u6709\u6587\u4ef6\n \u4f7f\u7528\u8fd9\u6761\u547d\u4ee4\u6ce8\u610f\u6709\u4e9b\u4e34\u65f6\u6587\u4ef6\u4e0d\u8981\u63d0\u4ea4\u5230\u4ed3\u5e93\u4e86\u3002 git commit -a\n \u4e4b\u540e\u5728 fix: \u540e\u9762\uff08\u6ce8\u610f\u5192\u53f7\u540e\u9762\u5fc5\u987b\u52a0\u7a7a\u683c\uff0c\u4e0d\u7136\u76f4\u63a5-1\uff09\u5199\u672c\u5730\u63d0\u4ea4\u7684 commit \u4fe1\u606f\uff0c\u7136\u540e\u5c31\u53ef\u4ee5\u63d0\u4ea4\u4ee3\u7801\u4e86 git review branch(\u5f53\u524d\u5206\u652f) -r origin\n \u6700\u597d\u4e00\u6b21 commit\uff0c\u4e00\u6b21 git review \uff0c\u7ecf\u5e38\u6709\u540c\u5b66\u5728\u672c\u5730\u75af\u72c2 commit \u6700\u540e git review \u62a5\u9519\u4e0d\u77e5\u9053\u548b\u56de\u4e8b\u513f\u3002 \u82e5\u4e0d\u60f3\u6bcf\u6b21\u63d0\u4ea4\u90fd\u52a0\u4e0a -r \u9009\u9879\uff0c\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a git config --global gitreview.remote origin \u63d0\u4ea4\u4ee3\u7801\uff0c\u76f4\u63a5\u4f7f\u7528 git review branch<\u76ee\u6807\u5206\u652f>\uff0c\u4f8b\u5982 git review master"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git","title":"4. Git\u6807\u7b7e","text":"Git \u6807\u7b7e\u5b9e\u9645\u4e0a\u662f commit \u7684\u4e00\u4e2a\u522b\u540d\uff0c\u4e3b\u8981\u7528\u4e8e\u7ba1\u7406\u5386\u53f2\u7248\u672c\u3002 \u60f3\u8c61\u4e00\u4e0b\u9886\u5bfc\u8ba9\u4f60\u628a\u4e4b\u524d\u7684\u67d0\u4e2a\u7248\u672c\u7684\u4ee3\u7801\u62c9\u51fa\u6765\u8dd1\uff0c\u4f60\u662f\u4e0d\u662f\u4e56\u4e56\u7684\u53bb\u628a\u6240\u6709\u63d0\u4ea4\u8bb0\u5f55\u62c9\u51fa\u6765\u627e\uff0c\u7136\u540e\u627e\u5230\u90a3\u4e2a\u54c8\u5e0c\u503c\uff0c\u901a\u8fc7\u54c8\u5e0c\u503c\u6765\u68c0\u51fa\u4ee3\u7801\u3002 \u8fd9\u4e00\u5957\u64cd\u4f5c\u4e0b\u6765\u662f\u4e0d\u662f\u5f88\u9ebb\u70e6\uff0c\u8d39\u65f6\u95f4\u8fd8\u4e0d\u4e00\u5b9a\u80fd\u627e\u5f97\u5230\uff0c\u6ca1\u4eba\u80fd\u8bb0\u4f4f\u6bcf\u4e2a\u63d0\u4ea4\u54c8\u5e0c\u503c\u4ee5\u53ca\u8fd9\u6b21\u63d0\u4ea4\u90fd\u6539\u4e86\u54ea\u4e9b\u4ee3\u7801\u3002 \u56e0\u6b64\u7ed9\u63d0\u4ea4\u6253\u4e2a\u6807\u7b7e\uff0c\u5c31\u662f\u628a\u54c8\u5e0c\u503c\u8f6c\u6362\u6210\u4eba\u7c7b\u80fd\u7406\u89e3\u7684\u8bed\u8a00\uff0c\u6bd4\u5982 v1.0\uff0c\u5c31\u53ef\u4ee5\u76f4\u63a5\u901a\u8fc7\u6807\u7b7e\u627e\u5230\u5bf9\u5e94\u7684\u63d0\u4ea4\u3002 \u65b0\u5efa\u6807\u7b7e git tag -a <tagname>\n \u56de\u8f66\u4e4b\u540e\uff0cGit \u4f1a\u6253\u5f00\u4f60\u7684\u7f16\u8f91\u5668\uff0c\u8ba9\u4f60\u5199\u4e00\u53e5\u6807\u7b7e\u6ce8\u89e3\uff0c\u5c31\u50cf\u4f60\u7ed9\u63d0\u4ea4\u5199\u6ce8\u89e3\u4e00\u6837\u3002 \u67e5\u770b\u6240\u6709\u6807\u7b7e git tag -l\n# git tag \u4e5f\u884c\n \u5220\u9664\u6807\u7b7e git tag -d <tagname>\n \u63a8\u9001\u6807\u7b7e\u81f3\u8fdc\u7a0b git push \u547d\u4ee4\u5e76\u4e0d\u4f1a\u4f20\u9001\u6807\u7b7e\u5230\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\uff0c\u5fc5\u987b\u663e\u5f0f\u5730\u63a8\u9001\u6807\u7b7e\u3002 git push origin <tagname>\n \u63a8\u9001\u6240\u6709\u4e0d\u5728\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\u7684\u6807\u7b7e git push origin --tag\n \u5220\u9664\u8fdc\u7a0b\u6807\u7b7e git push origin :refs/tag/<tagname>\n \u540e\u671f\u6253\u6807\u7b7e \u5148\u7528 git log --pretty=oneline \u67e5\u8be2\u63d0\u4ea4\u8bb0\u5f55\uff0c\u83b7\u53d6\u6821\u9a8c\u7801\u3002 git tag -a <tagname> 9fceb02(\u6821\u9a8c\u7801)\n \u68c0\u51fa\u6807\u7b7e git checkout <tagname>\n \u6b64\u65f6\uff0c\u4ed3\u5e93\u4f1a\u5904\u4e8e\u201c\u5206\u79bb\u5934\u6307\u9488\uff08detached HEAD\uff09\u201d\u7684\u72b6\u6001\u3002 \u5728\u201c\u5206\u79bb\u5934\u6307\u9488\u201d\u72b6\u6001\u4e0b\uff0c\u5982\u679c\u4f60\u505a\u4e86\u67d0\u4e9b\u66f4\u6539\u7136\u540e\u63d0\u4ea4\u5b83\u4eec\uff0c\u6807\u7b7e\u4e0d\u4f1a\u53d1\u751f\u53d8\u5316\uff0c \u4f46\u4f60\u7684\u65b0\u63d0\u4ea4\u5c06\u4e0d\u5c5e\u4e8e\u4efb\u4f55\u5206\u652f\uff0c\u5e76\u4e14\u5c06\u65e0\u6cd5\u8bbf\u95ee\uff0c\u9664\u975e\u901a\u8fc7\u786e\u5207\u7684\u63d0\u4ea4\u54c8\u5e0c\u624d\u80fd\u8bbf\u95ee\u3002 \u56e0\u6b64\uff0c\u5982\u679c\u4f60\u9700\u8981\u8fdb\u884c\u66f4\u6539\uff0c\u6bd4\u5982\u4f60\u8981\u4fee\u590d\u65e7\u7248\u672c\u4e2d\u7684\u9519\u8bef\uff0c\u90a3\u4e48\u901a\u5e38\u9700\u8981\u521b\u5efa\u4e00\u4e2a\u65b0\u5206\u652f\uff1a git checkout -b <NewBranchName> <tagname>\n \u65b0\u5206\u652f\u4e0a\u53ef\u4ee5\u8fdb\u884c\u63d0\u4ea4\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_12","title":"\u5341\u56db\u3001\u5e38\u89c1\u95ee\u9898","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_10","title":"1. \u63d0\u4ea4\u4ee3\u7801\u65f6\u63d0\u793a\u90ae\u7bb1\u6216\u8005\u540d\u79f0\u4e0d\u5bf9","text":"\u91cd\u65b0\u914d\u7f6e\u90ae\u7bb1\u6216\u8005\u540d\u79f0\uff0c\u7136\u540e\u91cd\u7f6e\u751f\u6548\uff1a git commit --amend --reset-author\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_10","title":"2. \u600e\u4e48\u56de\u6eda\u5230\u4e4b\u524d\u7684\u7248\u672c","text":"(1)\u67e5\u8be2\u5386\u53f2\u63d0\u4ea4\u8bb0\u5f55 git log\n \u627e\u5230\u4f60\u8981\u56de\u6eda\u7684\u7248\u672c\uff0c\u590d\u5236 hash \u503c\u3002 \u6ce8\u610f\uff1a\u662f commit \u7a7a\u683c\u4e4b\u540e\u7684 hash \u503c\uff0c\u4e4b\u524d\u6709\u540c\u5b66\u590d\u5236\u7684 Change-Id: \u8fd9\u6837\u80af\u5b9a\u62a5\u9519\u3002 (2)\u56de\u6eda\u7248\u672c\uff0c\u4e0d\u6e05\u9664\u4ee3\u7801 git reset --soft ${hash}\n (3)\u56de\u6eda\u7248\u672c\uff0c\u6e05\u9664\u4ee3\u7801\uff0c\u614e\u7528\u54c8 git reset --hard ${hash}\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-f-s-e","title":"3. \u6d4b\u8bd5\u62a5\u544a\u91cc\u9762 F S . E \u662f\u4ec0\u4e48\u610f\u601d","text":"F \u8868\u793a\u5931\u8d25\uff0c. \uff08\u70b9\uff09\u8868\u793a\u901a\u8fc7\uff0cS \u8868\u793a\u8df3\u8fc7\uff0cE \u8868\u793a error \u6709\u62a5\u9519"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git-status","title":"4. \u89e3\u51b3 git status \u4e2d\u6587\u663e\u793a\u7684\u95ee\u9898","text":"git config --global core.quotePath false\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5-apps","title":"5. apps \u76ee\u5f55\u4e0b\u989c\u8272\u6709\u4e9b\u662f\u9ec4\u8272\u7684","text":"\u5728 Pycharm \u4e2d apps \u76ee\u5f55\u4e0b\u5e94\u7528\u5e93\u6587\u4ef6\u662f\u9ec4\u8272\u7684\uff0c\u7f16\u8f91\u5668\u8bc6\u522b\u4e0d\u5230\u4ee3\u7801\u65b0\u589e\u548c\u4fee\u6539\uff1b \u7531\u4e8e\u793e\u533a\u7248 Pycharm \u4e0d\u80fd\u52a8\u6001\u8bc6\u522b\u591a\u4ed3\u5e93\uff0c\u9700\u8981\u5728 setting \u91cc\u9762\u624b\u52a8\u6ce8\u518c\uff0c\u64cd\u4f5c\u6b65\u9aa4\uff1a File \u2014> Settings \u2014> Version Control \u2014> \u70b9 + \u53f7 \u2014> Directory \u9009\u4e2d\u5e94\u7528\u5e93\u5de5\u7a0b\u76ee\u5f55 \u2014> VCS \u9009\u4e2d Git \u2014> Apply \u5982\u6b64\u5c31\u53ef\u4ee5\u4e86\u3002 \u4e13\u4e1a\u7248 Pycharm \u4e0d\u5b58\u5728\u8fd9\u4e2a\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#6-envsh-r","title":"6. \u6267\u884c env.sh \u62a5\u9519 $'\\r':\u672a\u627e\u5230\u547d\u4ee4","text":"\u51fa\u73b0\u8fd9\u4e2a\u95ee\u9898\u4f60\u5e94\u8be5\u662f\u5728 windows \u4e0a\u6253\u5f00\u6216\u7f16\u8f91\u8fc7 env.sh \u811a\u672c\uff0cwindows\u4e0b\u7684\u6362\u884c\u662f\u56de\u8f66\u7b26+\u6362\u884c\u7b26\uff0c\u4e5f\u5c31\u662f\\r\\n\uff0c\u800c Linxu \u4e0b\u662f\u6362\u884c\u7b26 \\n\uff0cLinux \u4e0b\u4e0d\u8bc6\u522b \\r\uff0c\u56e0\u6b64\u62a5\u9519\u3002 \u89e3\u51b3\u65b9\u6848\uff1a # \u5c06 \\r \u66ff\u6362\u4e3a\u7a7a\nsudo sed -i 's/\\r//' env.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#7","title":"7.\u600e\u6837\u4e3a\u5355\u72ec\u67d0\u4e00\u6761\u7528\u4f8b\u914d\u7f6e\u6267\u884c\u8d85\u65f6\u65f6\u95f4","text":"\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u5982\u4e0b\uff1a @pytest.mark.timeout(300) # \u5355\u4f4d\u79d2\ndef test_xxx_001():\npass\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#8-youqu","title":"8. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u6240\u6709\u4ee3\u7801\uff0c\u5305\u542b\u5b50\u4ed3\u5e93","text":"\u524d\u7f6e\u6761\u4ef6\uff1a\u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 # \u7b2c\u4e00\u6b21\u5b58\u50a8\u5bc6\u7801\uff0c\u63d0\u4f9b\u540e\u9762\u62c9\u4ee3\u7801(gerrit: ldap\u8d26\u53f7\u548c\u5bc6\u7801\uff0cgit\u62c9\u53d6\u7b2c\u4e00\u6b21\u8f93\u5165\u4fdd\u5b58\uff0c\u540e\u9762\u76f4\u63a5\u4f7f\u7528)\ngit config --global credential.helper store\n\n# \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\uff0c\u5e76\u9012\u5f52\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\" --recursive\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#9-youqu","title":"9. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\u6307\u5b9a\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u524d\u7f6e\u6761\u4ef6\uff1a \u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 \u5df2\u5b58\u50a8\u8bbf\u95ee\u5bc6\u7801 # \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\"\n# \u6307\u5b9a\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ncd youqu\ngit submodule update --init apps/autotest_xxx_xxx\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#10-youqu","title":"10. \u5982\u4f55\u66f4\u65b0 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\uff0c\u6240\u6709\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u66f4\u65b0\u6240\u6709\u5b50\u4ed3\u5e93\u4ee3\u7801 cd youqu\ngit pull & git submodule foreach git pull\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#11-youqu-master-detached-head","title":"11. \u5982\u4f55\u4fee\u590d YouQu \u6240\u6709\u5b50\u4ed3\u5e93 master \u5206\u652f\u6e38\u79bb\u5934\uff08detached head\uff09","text":"\u4fee\u590d\u6240\u6709\u5b50\u4ed3\u5e93\u9ed8\u8ba4master \u5206\u652f\u6e38\u79bb\u5934 cd youqu\ngit submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/","title":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212 \u5206\u7c7b\uff1a/ \u67b6\u6784\u5e08\uff1a/ \u76ee\u6807\uff1a \u5e94\u7528 AT \u67b6\u6784\u5de5\u7a0b\u5316\uff0c\u53c2\u8003\u6027\u80fd\u81ea\u52a8\u5316\u5de5\u7a0b\u5b8c\u6210\u5de5\u7a0b\u5316\u6539\u9020\u3002 \u5e94\u7528\u95f4\u7528\u4f8b\u89e3\u8026\uff0c\u89e3\u9664\u6240\u6709\u4ea4\u53c9\u8c03\u7528\u7684\u65b9\u6cd5\uff0c\u5404\u5e94\u7528\u80fd\u8ddf\u968f\u81ea\u8eab\u8fed\u4ee3\u5468\u671f\u72ec\u7acb\u7ef4\u62a4 AT \u7528\u4f8b\u3002 \u5b8c\u6210\u516c\u5171\u65b9\u6cd5\u7684\u62bd\u53d6\u6574\u5408\uff0c\u5f62\u6210\u4e00\u5957\u72ec\u7acb\u4e8e\u5e94\u7528\u95f4\u7684\u516c\u5171\u65b9\u6cd5\u5e93\uff0c\u5404\u5e94\u7528\u65b9\u6cd5\u91cc\u9762\u4e0d\u5b58\u5728\u88ab\u591a\u4e2a\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\u3002 \u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u4e3a\u5c06\u6765\u9002\u914d\u66f4\u591a\u7684 AT \u8fd0\u7528\u573a\u666f\u63d0\u4f9b\u652f\u6491\uff0c\u539f\u5219\u4e0a\u53ef\u5b9e\u73b0\u65e0\u9650\u6269\u5c55\uff0c\u5728\u6bcf\u65e5\u6784\u5efa\u548c\u6301\u7eed\u96c6\u6210\u6d41\u7a0b\u843d\u5730\u4f7f\u7528\u3002 \u4ee3\u7801\u89c4\u8303\u95ee\u9898\u6e05\u96f6\uff0c\u7b26\u5408 Shell Check\u3001Pylint\u3001\u7cfb\u7edf\u90e8\u76f8\u5173\u7f16\u7801\u89c4\u8303\u8981\u6c42\u3002 \u610f\u4e49\uff1a \u7edf\u4e00\u6210\u7814 AT \u67b6\u6784\u8bbe\u8ba1\u601d\u8def\uff0c\u6d88\u9664 AT \u4ee3\u7801\u5b9e\u73b0\u548c\u7ef4\u62a4\u4e0a\u53ef\u80fd\u51fa\u73b0\u7684\u5206\u6b67\uff0c\u6539\u5584\u5386\u53f2 AT \u65e0\u5de5\u7a0b\u5316\u8bbe\u8ba1\u7684\u7f3a\u9677\uff0c\u63d0\u9ad8\u67b6\u6784\u4e13\u4e1a\u6027\u3002 \u5404\u5e94\u7528 AT \u4ee3\u7801\u76f8\u4e92\u72ec\u7acb\uff0c\u5951\u5408\u5e94\u7528\u72ec\u7acb\u53d1\u5e03\u7279\u6027\uff0c\u53ef\u652f\u6301\u8fed\u4ee3\u671f\u95f4\u72ec\u7acb\u65b0\u589e\u3001\u7ef4\u62a4\u548c\u6267\u884c\u3002 \u65b9\u6cd5\u8c03\u7528\u903b\u8f91\u5f97\u5230\u7b80\u5316\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u66f4\u9ad8\u6548\uff1b\u516c\u5171\u5e93\u62bd\u53d6\uff0c\u51cf\u5c11\u65b9\u6cd5\u91cd\u590d\u7f16\u5199\uff0c\u63d0\u9ad8\u4ee3\u7801\u5229\u7528\u7387\uff1b\u5e73\u5747\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u4ece40\u5206\u949f\u964d\u4f4e\u81f330\u5206\u949f\uff0c\u65e5\u4ea7\u51fa\u7528\u4f8b\u4ece12\u6761/\u5929\u63d0\u5347\u81f316\u6761/\u5929\u3002 \u53ef\u7075\u6d3b\u652f\u6491\u4e0d\u540c\u7684\u81ea\u52a8\u5316\u8fd0\u7528\u573a\u666f\uff0c\u5982 CI\u3001\u5192\u70df\u6d4b\u8bd5\u3001\u96c6\u6210\u6d4b\u8bd5\u3001\u56de\u5f52\u6d4b\u8bd5\u3001\u4e13\u9879\u6d4b\u8bd5\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_2","title":"\u4e00\u3001\u80cc\u666f\u4ecb\u7ecd","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1","title":"1\u3001\u73b0\u6709\u67b6\u6784\u4ecb\u7ecd","text":"\u73b0\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u6574\u4f53\u5206\u4e3a\u4e09\u5c42\uff1a\u7528\u4f8b\u5c42\uff08\u4e1a\u52a1\u903b\u8f91\u5c42\uff09\u3001\u4e2d\u95f4\u5c42\uff08\u5143\u7d20\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff09\u3001\u6838\u5fc3\u5c42\uff08\u5e95\u5c42\u529f\u80fd\u5e93\u5c42\uff09\u3002 \u7528\u4f8b\u5c42\uff1a\u5373\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4e13\u6ce8\u4e8e\u4e1a\u52a1\u529f\u80fd\u903b\u8f91\uff0c\u4e0d\u5173\u5fc3\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\uff1b \u4e2d\u95f4\u5c42\uff1a\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff0c\u6bcf\u4e2a\u65b9\u6cd5\u5747\u5bf9\u5e94\u4e00\u4e2a\u5143\u7d20\u7684\u4e00\u4e2a\u5177\u4f53\u64cd\u4f5c\uff0c\u4e5f\u53ef\u4ee5\u662f\u591a\u4e2a\u64cd\u4f5c\u7684\u7ec4\u5408\u64cd\u4f5c\uff0c\u4e2d\u95f4\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u7528\u4f8b\u5c42\uff0c\u5177\u6709\u53ef\u6269\u5c55\u6027\u548c\u590d\u7528\u6027\uff1b \u6838\u5fc3\u5c42\uff1a\u4e3b\u8981\u5c01\u88c5\u7684\u5e95\u5c42\u529f\u80fd\u5b9e\u73b0\uff0c\u6b64\u5c42\u5728\u6846\u67b6\u4e2d\u63d0\u4f9b\u4e00\u4e9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u529f\u80fd\u6a21\u5757\u76f8\u5bf9\u72ec\u7acb\uff0c\u6838\u5fc3\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u64cd\u4f5c\u5c42\uff0c\u6bd4\u5982\uff1a\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7 UI \u5750\u6807\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u952e\u9f20\u64cd\u4f5c\u7684\u57fa\u7840\u65b9\u64cd\u4f5c\u6a21\u5757\u3001Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757\u3001\u6587\u4ef6\u7684\u589e\u5220\u6539\u67e5\u64cd\u4f5c\u6a21\u5757\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2","title":"2\u3001\u81ea\u52a8\u5316\u7684\u5e94\u7528","text":"2.1\u3001CI \u6d41\u7a0b \u6bcf\u65e5\u6784\u5efa\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u7814\u53d1\u6bcf\u65e5\u63d0\u4ea4\u7684\u4ee3\u7801\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u73ed\u4e4b\u540e\u4f1a\u5c06\u5404\u5e94\u7528\u8fdb\u884c\u6253\u5305\uff0c\u7136\u540e\u5728\u6d4b\u8bd5\u673a\u4e0a\u5b89\u88c5\u66f4\u65b0 deb \u5305\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u5e94\u7528\u63d0\u4ea4\u96c6\u6210\u7684\u7248\u672c\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u8f7d\u6700\u65b0\u7684 ISO \u8fdb\u884c PXE \u90e8\u7f72\uff0c\u7136\u540e\u6d4b\u8bd5\u673a\u5b89\u88c5\u6700\u65b0\u7684\u955c\u50cf\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 2.2\u3001\u9a8c\u6536\u6d4b\u8bd5 \u5728\u5404\u9a8c\u6536\u8282\u70b9\u8fdb\u884c\u81ea\u52a8\u5316\u9a8c\u6536\uff0c\u76ee\u524d\u7684\u7b56\u7565\u662f\u5168\u7528\u4f8b\u8986\u76d6\u5168\u67b6\u6784\u3002 2.3\u3001\u56de\u5f52\u6d4b\u8bd5 \u56de\u5f52\u6d4b\u8bd5\u4eca\u5e74\u89c4\u5212\u5efa\u8bbe\u4e2d\uff0c\u65e8\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u6267\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\uff0c\u51cf\u5c11\u529f\u80fd\u6d4b\u8bd5\u7684\u91cd\u590d\u52b3\u52a8\u529b\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3","title":"3\u3001\u5b58\u5728\u7684\u95ee\u9898","text":" \u5404\u5e94\u7528\u4e4b\u95f4\u5b58\u5728\u8026\u5408 \u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u521d\u671f\uff0c\u6240\u6709\u5e94\u7528\u662f\u6574\u4f53\u53d1\u5e03\uff0c\u6211\u4eec\u662f\u5c06\u6240\u6709\u5e94\u7528\u770b\u6210\u662f\u4e00\u4e2a\u6574\u4f53\uff0c\u5404\u5e94\u7528\u4f5c\u4e3a\u5176\u4e2d\u7684\u4e00\u4e2a\u6a21\u5757\uff0c\u6240\u4ee5\u5b58\u5728\u5e94\u7528\u95f4\u65b9\u6cd5\u4ea4\u53c9\u8c03\u7528\u7684\u95ee\u9898\uff0c\u8fd9\u6837\u4ece\u6700\u521d\u7684\u8bbe\u8ba1\u6765\u8bb2\u786e\u5b9e\u80fd\u591f\u51cf\u5c11\u91cd\u590d\u4ee3\u7801\u7684\u7f16\u5199\u3002\u4f46\u662f\u73b0\u5728\u5e94\u7528\u8d70\u72ec\u7acb\u53d1\u5e03\uff0c\u5404\u5e94\u7528\u90fd\u6709\u81ea\u5df1\u7684\u8fed\u4ee3\u8282\u594f\uff0c\u5728\u65b0\u9700\u6c42\u5feb\u901f\u53d8\u5316\u7684\u8fc7\u7a0b\u4e2d\uff0c\u81ea\u52a8\u5316\u7ef4\u62a4\u53d8\u5f97\u5f02\u5e38\u56f0\u96be\uff0c\u539f\u56e0\u5c31\u662f\u81ea\u52a8\u5316\u9879\u76ee\u91cc\u9762\u5404\u4e2a\u5e94\u7528\u7684\u6709\u6bd4\u8f83\u591a\u7684\u8026\u5408\u5173\u7cfb\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u8fdb\u884c\u89e3\u8026\uff0c\u4ee5\u9002\u5e94\u5e94\u7528\u4e0d\u540c\u7684\u8fed\u4ee3\u5468\u671f\u3002 \u65e0\u6cd5\u7cbe\u51c6\u7684\u5212\u5206\u7528\u4f8b\u8303\u56f4 \u7528\u4f8b\u6267\u884c\u7684\u8303\u56f4\u4e0d\u591f\u7cbe\u51c6\uff0c\u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u4e3b\u8981\u901a\u8fc7\u7528\u4f8b\u7684\u5173\u952e\u8bcd core\uff08\u6838\u5fc3\uff09\u6765\u533a\u5206\u7528\u4f8b\u662f\u5426\u4e3a\u6838\u5fc3\u7528\u4f8b\uff0c\u4f46\u662f\u8fd9\u6837\u7684\u533a\u5206\u592a\u5bbd\u6cdb\u4e86\uff0c\u4e0d\u80fd\u9002\u5e94\u81ea\u52a8\u5316\u6d4b\u8bd5\u5728\u591a\u573a\u666f\u4e0b\u7684\u5e94\u7528\u3002\u5f88\u591a\u573a\u666f\u4e0b\u6211\u4eec\u8fd8\u9700\u8981\u6839\u636e\u7528\u4f8b\u7684\u7b49\u7ea7\u3001\u7528\u4f8b\u7684\u7c7b\u578b\u3001\u7528\u4f8b\u6765\u6e90\u7b49\u7b49\uff0c\u4e0d\u540c\u7684\u7ef4\u5ea6\u6765\u6311\u9009\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u5173\u952e\u5b57\u9700\u8981\u4eba\u5de5\u4e00\u6761\u6761\u7684\u6539\uff0c\u8d39\u65f6\u8d39\u529b\uff0c\u800c\u4e14\u4e0d\u597d\u7ef4\u62a4\u3002 \u53d7\u65b0\u9700\u6c42\u5f71\u54cd\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u597d\u7ef4\u62a4 \u76ee\u524d\u9700\u8981\u8df3\u8fc7\u7684\u7528\u4f8b\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684\u7528\u4f8b\u811a\u672c\u91cc\u9762\uff0c\u6dfb\u52a0\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\uff0c\u540e\u7eed\u89e3\u9664\u8df3\u8fc7\u7684\u65f6\u5019\u53c8\u9700\u8981\u627e\u5230\u8fd9\u6761\u811a\u672c\uff0c\u5220\u6389\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\u3002\u5728\u8df3\u8fc7\u7528\u4f8b\u8f83\u591a\u7684\u60c5\u51b5\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u96be\u5ea6\u3002 \u7f16\u5199\u7528\u4f8b\u65f6\u903b\u8f91\u6bd4\u8f83\u590d\u6742\uff0c\u9700\u8981\u8c03\u7528\u591a\u4e2a\u5e94\u7528\u7684\u65b9\u6cd5\u6a21\u5757\u3002 \u6846\u67b6\u6269\u5c55\u6027\u4e0d\u8db3\uff0c\u65e0\u6cd5\u6574\u5408\u6027\u80fd\u81ea\u52a8\u5316\u3001\u538b\u6d4b\u81ea\u52a8\u5316\u3001\u5b89\u5168\u81ea\u52a8\u5316\u7b49\u4e13\u9879\u6d4b\u8bd5\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_3","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u4e3a\u89e3\u51b3\u73b0\u6709\u95ee\u9898\uff0c\u9002\u5e94\u4e0d\u65ad\u4e30\u5bcc\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u66f4\u597d\u7684\u53d1\u6325\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4f5c\u7528\uff0c\u9700\u8981\u5bf9\u81ea\u52a8\u5316\u67b6\u6784\u53ca\u5404\u529f\u80fd\u6a21\u5757\u8fdb\u884c\u91cd\u65b0\u8bbe\u8ba1\u89c4\u5212\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_1","title":"1\u3001\u67b6\u6784\u8bbe\u8ba1","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_1","title":"2\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u6846\u67b6\u7684\u8fd0\u884c\u903b\u8f91\uff1a\u901a\u8fc7\u6838\u5fc3\u5c42\u63d0\u4f9b\u4e00\u4e2a\u57fa\u7840\u80fd\u529b\uff0c\u4e1a\u52a1\u5c42\u6839\u636e\u5b9e\u9645\u4e1a\u52a1\u9700\u6c42\uff08\u6d4b\u8bd5\u7528\u4f8b\uff09\u52a8\u6001\u52a0\u8f7d\u6838\u5fc3\u5c42\uff0c\u6267\u884c\u5165\u53e3\u52a0\u8f7d\u76f8\u5e94\u7684\u7528\u4f8b\u96c6\u5e76\u63a7\u5236\u6267\u884c\uff0c\u5e94\u7528\u5c42\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u9700\u6c42\uff0c\u901a\u8fc7\u76f8\u5e94\u7684\u914d\u7f6e\u9879\u8fdb\u884c\u914d\u7f6e\uff0c\u4ece\u800c\u89e6\u53d1\u81ea\u52a8\u5316\u6d4b\u8bd5\u4efb\u52a1\u3002 \u6838\u5fc3\u5c42\uff1a\u57fa\u672c\u4fdd\u6301\u4e0d\u53d8\uff0c\u90e8\u5206\u6a21\u5757\u4f1a\u6d89\u53ca\u5230\u65b0\u529f\u80fd\u5f00\u53d1\uff0c\u6838\u5fc3\u5c42\u5404\u529f\u80fd\u6a21\u5757\u4fdd\u6301\u72ec\u7acb\u6027\uff0c\u63d0\u4f9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u4f9b\u4e0a\u5c42\u8c03\u7528\uff1b \u5e95\u5c42\u6838\u5fc3\u6a21\u5757\u5305\u62ec\uff1a \u56fe\u50cf\u8bc6\u522b\u6a21\u5757 UI \u5b9a\u4f4d\u6a21\u5757 Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757 \u5c5e\u6027\u5b9a\u4f4d\u6a21\u5757 \u65e5\u5fd7\u6a21\u5757 \u952e\u9f20\u64cd\u4f5c\u6a21\u5757 \u6587\u4ef6\u64cd\u4f5c\u6a21\u5757 \u5f55\u5c4f\u6a21\u5757 \u81ea\u5b9a\u4e49\u65ad\u8a00\u6a21\u5757 \u7528\u4f8b\u6267\u884c\u6a21\u5757 PXE \u88c5\u673a\u6a21\u5757 \u952e\u9f20\u4fe1\u53f7\u6a21\u62df\u6a21\u5757 OCR \u6a21\u5757 \u4e1a\u52a1\u5c42\uff1a\u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e94\u7528\u5185\u5305\u542b\u591a\u4e2a\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5982\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7b49\uff0c\u540e\u7eed\u53ef\u4ee5\u6839\u636e\u9700\u8981\u5ac1\u63a5\u8fdb\u6765\u3002\u5176\u4e2d\u529f\u80fd\u6d4b\u8bd5\u8bbe\u8ba1\u601d\u8def\uff1a \u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e76\u5c06\u6d4b\u8bd5\u6570\u636e\u548c\u6d4b\u8bd5\u8d44\u6e90\u6574\u5408\u8fdb\u6765\uff0c\u589e\u52a0\u7528\u4f8b\u6807\u7b7e csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ed9\u6bcf\u6761\u7528\u4f8b\u6253\u6807\u7b7e\u3002 \u5404\u6807\u7b7e\u6240\u4f7f\u7528\u5bf9\u5e94\u7684\u5b57\u6bb5\u540d\u79f0\uff0c\u4f7f\u7528 csv \u6587\u4ef6\u7ef4\u62a4\u7528\u4f8b\u4e0e\u6807\u7b7e\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u5bf9\u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u53ef\u4ee5\u7ec4\u5408\u5176\u4e2d\u7684\u6807\u7b7e\u800c\u4ece\u9a71\u52a8\u5bf9\u5e94\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\uff0c\u517c\u5bb9\u73b0\u6709\u7528\u4f8b\u6807\u7b7e\uff0c\u4e14\u652f\u6301\u7528\u4f8b\u6807\u7b7e\u53ef\u6269\u5c55\uff1b \u4f7f\u7528 csv \u683c\u5f0f\u6587\u4ef6\u53ef\u4ee5\u65b9\u4fbf\u7684\u4f7f\u7528 Excel \u8868\u683c\u6253\u5f00\u8fdb\u884c\u7f16\u8f91\uff0c\u540c\u65f6\u7531\u4e8e csv \u6587\u4ef6\u5b9e\u9645\u662f\u4ee5\u90fd\u597d\u5206\u9694\u7684\u6587\u672c\u6587\u4ef6\uff0c\u4ee3\u7801\u4e2d\u53ef\u4ee5\u5728\u4e0d\u4f9d\u8d56\u4e09\u65b9\u5e93\u7684\u60c5\u51b5\u4e0b\u65b9\u4fbf\u5feb\u901f\u7684\u89e3\u6790\u5b83\uff0c\u53ef\u64cd\u4f5c\u6027\u548c\u53ef\u7ef4\u62a4\u6027\u8f83\u9ad8\u3002 \u5404\u4e2a\u5e94\u7528\u4e4b\u95f4\uff0c\u7528\u4f8b\u3001\u65b9\u6cd5\u3001\u6807\u7b7e\u548c\u8d44\u6e90\u90fd\u662f\u76f8\u4e92\u72ec\u7acb\u7684\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u7528\u4f8b\u65f6\u53ea\u9700\u8981\u81ea\u5df1\u5e94\u7528\u4e0b\u7684\u65b9\u6cd5\u548c\u516c\u5171\u5e93\u5373\u53ef\u3002 \u7ed3\u6784\u4e3e\u4f8b\uff1a .\n\u251c\u2500\u2500 apps\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_album # \u5e94\u7528\u540d (\u7528\u4e0b\u5212\u7ebf\u8fde\u63a5\u662f Python \u7f16\u7801\u89c4\u8303)\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_assert # \u65ad\u8a00\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_function_tag.csv # \u7528\u4f8b\u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 asan_cases # \u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases # \u529f\u80fd\u6d4b\u8bd5\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 res # \u6d4b\u8bd5\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config # \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_widget # \u5e94\u7528\u81ea\u5df1\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_widget # \u65b9\u6cd5\u57fa\u7c7b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 other_widget # \u8c03\u7528\u5176\u4ed6\u5e94\u7528\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_camera\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases\n\u2502\u00a0\u00a0 \u2502\u00a0 ...\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 public_widget # \u516c\u5171\u65b9\u6cd5\u5e93\n\u251c\u2500\u2500 config # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n...\n config \u914d\u7f6e\u6a21\u5757\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u76f8\u5e94\u914d\u7f6e\uff0c\u6d4b\u8bd5\u540c\u5b66\u53ef\u4ee5\u6839\u636e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5728 config \u91cc\u9762\u8fdb\u884c\u914d\u7f6e\u3002 \u5168\u5c40\u914d\u7f6e\uff1a \u6267\u884c\u4e00\u4e2a\u6216\u591a\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff1a\u5728 pattern \u91cc\u9762\u5199\u5165\u5e94\u7528\u5305\u540d\uff0c\u591a\u4e2a\u5e94\u7528\u4e4b\u95f4\u7528 or \u8fde\u63a5\uff0c\u5982 deepin-music or deepin-movie\uff1b \u5192\u70df\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a smoke\uff1b \u96c6\u6210\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a core \uff1b \u5168\u91cf\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u4e3a\u7a7a\u5373\u53ef\uff1b \u901a\u8fc7 tags \u7684\u914d\u7f6e\u6bd4\u8f83\u7075\u6d3b\uff0c\u540e\u9762\u6807\u7b7e\u5316\u7ba1\u7406\u7ae0\u8282\u4f1a\u8bb2\u5230\uff0c\u652f\u6301\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u7075\u6d3b\u914d\u7f6e\u3002 \u6307\u5b9a\u67d0\u53f0\u673a\u5668\u5728\u6307\u5b9a\u955c\u50cf\u7248\u672c\u4e0a\u6267\u884c\u7528\u4f8b\uff1a\u5728 IP \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a IP\uff0c\u5e76\u5728 URL \u91cc\u9762\u586b\u5165\u955c\u50cf\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u6846\u67b6\u4f1a\u8c03\u7528 PXE \u8fdb\u884c\u81ea\u52a8\u88c5\u673a\uff0c\u88c5\u673a\u5b8c\u4e4b\u540e\u81ea\u52a8\u5f00\u59cb\u6267\u884c\u914d\u7f6e\u7684\u6d4b\u8bd5\u7528\u4f8b\u3002 \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\uff1a \u6bcf\u4e2a\u5e94\u7528\u5185\u90e8\u4f1a\u6709\u4e00\u4e2a\u5355\u72ec\u7684\u914d\u7f6e\u6a21\u5757\uff0c\u4f1a\u5305\u542b\u4e00\u4e9b\u672c\u5e94\u7528\u7684\u6d4b\u8bd5\u8d44\u6e90\u7684\u8def\u5f84\u3001\u6267\u884c\u7528\u4f8b\u7684\u6807\u7b7e\u914d\u7f6e\u7b49\u7b49\uff0c\u5982\u679c\u5728\u5c40\u90e8\u914d\u7f6e\u91cc\u9762\u914d\u7f6e\u4e86\u7528\u4f8b\u6267\u884c\u6807\u7b7e\uff0c\u800c\u5916\u5c42 runner \u51fa\u6ca1\u6709\u6307\u5b9a\u6267\u884c\u6807\u7b7e\uff0c\u5219\u5728\u6267\u884c\u65f6\u53ea\u4f1a\u6267\u884c\u5c40\u90e8\u914d\u7f6e\u5df2\u914d\u7f6e\u7684\uff0c\u82e5\u5916\u5c42 runner \u4e5f\u914d\u7f6e\u4e86\u6267\u884c\u6807\u7b7e\uff0c\u5219\u4f1a\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u7528\u4f8b\u3002 \u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u914d\u7f6e\u90fd\u5728\u540c\u4e00\u4e2a\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\uff0cpy \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684\u7c7b\uff0cini \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684 option\u3002 \u5168\u5c40\u914d\u7f6e\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u7b56\u7565\u5982\u4e0b\uff1a \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5c40\u90e8\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5e94\u7528\u5c42\uff1arunner \u662f\u6d4b\u8bd5\u6267\u884c\u7684\u5165\u53e3\uff0c\u5b83\u4f1a\u6839\u636e\u914d\u7f6e\u91cc\u9762\u7684\u914d\u7f6e\u9879\uff0c\u8fdb\u884c\u7528\u4f8b\u7684\u52a0\u8f7d\u548c\u6267\u884c\u3002\u5b83\u63d0\u4f9b\u63a5\u53e3\u7ed9\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\uff0c\u5e73\u53f0\u4e0a\u7684\u6307\u4ee4\u5b9e\u9645\u4e0a\u90fd\u662f\u901a\u8fc7\u4e0b\u53d1\u7ed9 runner\uff0c\u7136\u540e\u7531 runner \u6765\u6267\u884c\u76f8\u5e94\u7684\u6d4b\u8bd5\u3002 \u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u662f\u4e00\u4e2a\u524d\u7aef\u7cfb\u7edf\uff0c\u53ef\u4ee5\u8fdb\u884c\u6d4b\u8bd5\u673a\u7ba1\u7406\u3001\u81ea\u52a8\u5b89\u88c5\u955c\u50cf\u3001\u81ea\u52a8\u5b89\u88c5\u6307\u5b9a\u5e94\u7528\u7248\u672c\u3001\u8fdb\u884c\u6d4b\u8bd5\u7528\u4f8b\u8303\u56f4\u9009\u62e9\u3001\u7528\u4f8b\u89e6\u53d1\u6267\u884c\u63a7\u5236\u3001\u7ed3\u679c\u5c55\u793a\u8f93\u51fa\u7b49\u3002 \u4e00\u4e2a\u5e94\u7528\u7684\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\u90fd\u53ef\u4ee5\u5355\u72ec\u89e6\u53d1\u3002 \u517c\u5bb9\u6027\u6d4b\u8bd5\u4e3b\u8981\u901a\u8fc7 PXE \u670d\u52a1\u5668\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u88c5\u673a\uff0c\u7136\u540e\u914d\u5408 AT \u8fdb\u884c\u6d4b\u8bd5\uff0c\u53ef\u4ee5\u5b9e\u73b0\u4e0d\u540c\u7cfb\u7edf\u7248\u672c\u3001\u4e0d\u540c\u5e94\u7528\u7248\u672c\u73af\u5883\u4e0a\u90fd\u53ef\u4ee5\u8fdb\u884c\u81ea\u52a8\u5316\u7684 AT \u6267\u884c\uff0c\u63d0\u9ad8\u517c\u5bb9\u6027\u6d4b\u8bd5\u6548\u7387\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_4","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_2","title":"1\u3001\u7528\u4f8b\u89e3\u8026","text":"\u5b58\u5728\u8026\u5408\u5173\u7cfb\u7684\u65b9\u6cd5\uff1a\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u88ab\u5916\u90e8\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\uff0c\u5219\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u8026\u5408\u5173\u7cfb\u3002 1.1\u3001\u901a\u8fc7\u7f16\u8f91\u5668 Find Usages \u67e5\u770b\u6bcf\u4e2a\u65b9\u6cd5\u88ab\u8c03\u7528\u7684\u8def\u5f84\u548c\u88ab\u8c03\u7528\u6b21\u6570\uff1b 1.2\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 1 \u4e2a\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728\u5916\u90e8\u5e94\u7528\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1b 1.3\u3001\u64cd\u4f5c\u5c42\u6587\u4ef6\u540d\u5747\u4ee5 widget \u7ed3\u5c3e\uff0c\u7c7b\u540d\u4ee5 Widget \u7ed3\u5c3e\uff0c\u5982\uff1a\u6587\u4ef6\u540d music_widget.py \uff1a class MusicWidget:\n\"\"\"\u97f3\u4e50\u7684\u64cd\u4f5c\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_2","title":"2\u3001\u516c\u5171\u5e93\u5efa\u8bbe","text":"2.1\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 2 \u4e2a\u53ca\u4ee5\u4e0a\u7684\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728 public_widget \u76ee\u5f55\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1bpublic_widget \u5373\u4e3a\u516c\u5171\u65b9\u6cd5\u5e93\uff1b 2.2\u3001\u5728\u7528\u4f8b\u5c42\u4fee\u6539\u7528\u4f8b\u4e2d\u7c7b\u7684\u5bfc\u5165\u8def\u5f84\uff0c\u5c5e\u4e8e\u516c\u5171\u65b9\u6cd5\u7684\u5219\u8c03\u7528 public_widget \u4e2d\u7684\u7c7b\uff0c\u5916\u90e8\u5e94\u7528\u7684\u64cd\u4f5c\u65b9\u6cd5\uff0c\u5219\u8c03\u7528\u672c\u5e94\u7528\u76ee\u5f55\u4e0b\u91cd\u5199\u7684\u5916\u90e8\u5e94\u7528\u65b9\u6cd5\u3002 \u6bd4\u5982\uff1a\u51e0\u4e4e\u6240\u6709\u591a\u5a92\u4f53\u5e94\u7528\u90fd\u9700\u8981\u901a\u8fc7\u6587\u7ba1\u52a0\u8f7d\u8d44\u6e90\uff0c\u8c03\u8d77\u7684\u6587\u7ba1\u5bf9\u8bdd\u6846\u5b9e\u9645\u4e3a dde-desktop\uff0c\u56e0\u6b64\u5c06 desktop_widget.py \u653e\u5230 public_widget \u91cc\u9762\uff1a class DdeDesktopPublicWidget:\n\"\"\"\u516c\u5171-\u684c\u9762\u7684\u64cd\u4f5c\u65b9\u6cd5\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3_1","title":"3\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406","text":"3.1\u3001\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1a\u5bf9\u5e94 core\u3001smoke\uff0c\u6216\u4e3a\u7a7a\uff1b \u7528\u4f8b\u6765\u6e90\uff1a\u5bf9\u5e94 PMS \u7528\u4f8b\u6765\u6e90\uff0c\u5206\u522b\u7528 acp1\u3001acp2\u3001acp3\u3001acp4 \u8868\u793a\u3002 acp1 \uff1a\u4e1a\u52a1\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5199\u7684\u7528\u4f8b\uff0c\u88ab\u7528\u4e8e\u9a8c\u6536\u6d4b\u8bd5\u7684\uff1b acp2 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5f15\u5165\u7684\u4ea7\u54c1\u9a8c\u6536\u6d4b\u8bc4\u90e8\u7684\u7528\u4f8b\uff1b acp3 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u6839\u636e\u4ea7\u54c1\u9700\u6c42\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\uff1b acp4 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u901a\u8fc7\u793e\u533a\u3001\u8bba\u575b\u7528\u6237\u53cd\u9988\u95ee\u9898\u603b\u7ed3\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\u3002 \u4e3e\u4f8b\uff1a \u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u7528\u4f8b\u6765\u6e90 001 L1 core acp1 \u6807\u7b7e\u91c7\u7528\u679a\u4e3e\u7684\u65b9\u5f0f\u8fdb\u884c\u4ee3\u53f7\u7ba1\u7406\u65b9\u4fbf\u7ba1\u7406\u4ee5\u53ca\u540e\u7eed\u6269\u5c55\u3002 3.2\u3001\u5728\u6bcf\u4e2a\u5e94\u7528\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u7b2c\u4e00\u5217\u4e3a\u7528\u4f8b\u7684 ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ba1\u7406\u6a21\u5757\u5185\u7684\u7528\u4f8b\u6807\u7b7e\u3002\u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 3.3\u3001\u5bf9\u7167 PMS \u4e0a\u7528\u4f8b\u7b49\u7ea7\u3001\u7528\u4f8b\u7c7b\u578b\u548c\u7528\u4f8b\u6765\u6e90\uff0c\u6807\u8bb0\u6240\u6709\u5df2\u5b9e\u73b0\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u540e\u7eed\u7f16\u5199\u65b0\u589e\u81ea\u52a8\u5316\u7528\u4f8b\u65f6\uff0c\u6bcf\u5199\u4e00\u6761\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684 csv \u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u6b64\u6761\u7528\u4f8b\u7684\u6807\u7b7e\u3002 3.4\u3001\u8df3\u8fc7\u7528\u4f8b\u6807\u7b7e\u5316 \u73b0\u6709\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a\uff1a \u4e3e\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u8bb0\u4e3a \u201cskip-\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u8bb0\uff0c\u5982\u679c\u5df2\u7ecf\u6807\u8bb0\u4e86\u8df3\u8fc7\u539f\u56e0\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u8bb0\u4e3a SKIPED\uff0c\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\u3002 \u6240\u6709\u7684\u6807\u7b7e\u5728 docs \u76ee\u5f55\u4e0b\u4f1a\u6709\u4e00\u4e2a\u6587\u6863\uff0c\u6587\u6863\u6682\u5b9a\u540d\u79f0\u4e3a\uff1atags_info.md\uff0c\u7528\u4e8e\u8bf4\u660e\u73b0\u5728\u5df2\u7ecf\u4f7f\u7528\u5230\u7684\u6807\u7b7e\uff0c\u4ee5\u53ca\u8fd9\u4e9b\u6807\u7b7e\u7684\u89e3\u91ca\u548c\u7528\u6cd5\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#4","title":"4\u3001\u7528\u4f8b\u6267\u884c","text":"4.1\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u7684\u9a71\u52a8\u6267\u884c\u903b\u8f91\u529f\u80fd\u5b9e\u73b0 \u5f00\u53d1\u6839\u636e\u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\u91cc\u9762\u7684\u7528\u4f8b\u6807\u7b7e\u6267\u884c\u5bf9\u5e94\u7528\u4f8b\u7684\u529f\u80fd\uff0c\u80fd\u652f\u6301\u591a\u4e2a\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u6267\u884c\u5165\u53e3\u80fd\u968f\u610f\u901a\u8fc7\u7528\u4f8b\u6807\u7b7e\u6307\u5b9a\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002 \u7528\u4f8b\u6807\u7b7e\u7684\u9a71\u52a8\u65b9\u5f0f\u5fc5\u987b\u80fd\u652f\u6301\u6807\u7b7e\u7684\u6269\u5c55\uff0c\u672a\u6765\u968f\u7740\u4e1a\u52a1\u7684\u53d8\u5316\u53ef\u80fd\u9700\u8981\u589e\u52a0\u5404\u79cd\u5404\u6837\u7684\u6807\u7b7e\u3002 4.2\u3001\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u6267\u884c \u529f\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u3001\u6027\u80fd\u6d4b\u8bd5\u7b49\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u662f\u5206\u5f00\u6267\u884c\u7684\uff0c\u4e5f\u5c31\u662f\u5728\u4e00\u6b21\u6267\u884c\u4e2d\uff0c\u53ea\u80fd\u6267\u884c\u5176\u4e2d\u4e00\u79cd\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5177\u4f53\u8981\u6267\u884c\u54ea\u4e00\u79cd\u540c\u6837\u901a\u8fc7\u53c2\u6570\u6765\u63a7\u5236\u3002 4.3\u3001\u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c \u7531\u4e8e\u6d4b\u8bd5\u673a\u8d44\u6e90\u6709\u9650\uff0c\u968f\u7740\u81ea\u52a8\u5316\u7528\u4f8b\u6570\u91cf\u7684\u589e\u52a0\uff0cCI \u6267\u884c\u65f6\u95f4\u4f1a\u8d8a\u6765\u8d8a\u957f\u3002 \u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c\u7684\u529f\u80fd\uff1a \u540c\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\u5206\u6563\u5230\u4e0d\u540c\u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u4e0a\u6267\u884c\uff0c\u7f29\u77ed\u6267\u884c\u603b\u65f6\u95f4\uff1b \u7b2c\u4e8c\u5929\u8dd1\u7684\u65f6\u5019\u540c\u4e00\u4e2a\u673a\u5668\u4e0a\u4f1a\u6267\u884c\u6628\u5929\u6ca1\u6709\u6267\u884c\u5230\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u6267\u884c\u540c\u7406\uff1b \u53ef\u4ee5\u5b9e\u73b0\u5728\u5168\u67b6\u6784\u6d4b\u8bd5\u673a\u4e0a\u8f6e\u6d41\u6267\u884c\u7528\u4f8b\uff0c\u65e2\u80fd\u4fdd\u8bc1\u6267\u884c\u4e86\u6240\u6709\u7684\u7528\u4f8b\uff0c\u53c8\u80fd\u5728\u8d44\u6e90\u6709\u9650\u7684\u60c5\u51b5\u4e0b\u8986\u76d6\u4e86\u6240\u6709\u7684\u67b6\u6784\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#5","title":"5\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0","text":"5.1\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u4f5c\u4e3a\u524d\u7aef\u754c\u9762\u7cfb\u7edf\uff0c\u901a\u8fc7\u9875\u9762\u4e0a\u7684\u4e00\u4e9b\u529f\u80fd\u9009\u9879\u8fdb\u884c\u5bf9\u5e94\u6d4b\u8bd5\u4efb\u52a1\u7684\u7ba1\u7406\u6216\u89e6\u53d1\uff0c\u4e1a\u5185\u6bd4\u8f83\u6d41\u884c\u7684\u5b9e\u73b0\u65b9\u6848\u662f\u4f7f\u7528 Vue + DRF \u5b9e\u73b0\u4e00\u4e2a\u524d\u540e\u7aef\u5206\u79bb\u7684\u7cfb\u7edf\u3002 \u6d4b\u8bd5\u5e73\u53f0\u53ef\u80fd\u4f1a\u6d89\u53ca\u5230\u7684\u6a21\u5757\u6709\uff1a\u6d4b\u8bd5\u673a\u8d44\u6e90\u7ba1\u7406\u6a21\u5757\u3001\u7528\u4f8b\u6267\u884c\u63a7\u5236\u6a21\u5757\u3001\u7ed3\u679c\u5c55\u793a\u6a21\u5757\u3001PXE \u955c\u50cf\u5b89\u88c5\u6a21\u5757\u7b49\u3002 \u7528\u6237\uff08\u6d4b\u8bd5\u3001\u7814\u53d1\u540c\u5b66\u7b49\uff09\u53ef\u4ee5\u914d\u7f6e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5982\u6267\u884c\u54ea\u4e2a\u5e94\u7528\u3001\u6267\u884c\u7528\u4f8b\u7684\u8303\u56f4\u3001\u5728\u54ea\u53f0\u673a\u5668\u4e0a\u6267\u884c\u3001\u955c\u50cf\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u5e94\u7528\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u6267\u884c\u65f6\u95f4\u3002 5.2\u3001\u6267\u884c\u5165\u53e3 runner \u63d0\u4f9b\u7ed9\u6d4b\u8bd5\u5e73\u53f0\u7684\u63a5\u53e3\u5305\u62ec\uff1a\u7528\u4f8b\u6267\u884c\u63a5\u53e3\u3001\u7ed3\u679c\u8fd4\u56de\u63a5\u53e3\u3001\u955c\u50cf\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u955c\u50cf\u5b89\u88c5\u63a5\u53e3\u3001\u5e94\u7528\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u5e94\u7528\u5b89\u88c5\u66f4\u65b0\u63a5\u53e3\u7b49\u3002 \u524d\u7aef\u5e73\u53f0\u76ee\u524d\u8fd8\u6ca1\u6709\u592a\u591a\u8be6\u7ec6\u7684\u65b9\u6848\uff0c\u672c\u6b21\u8bbe\u8ba1\u4e3b\u8981\u96c6\u4e2d\u5728\u540e\u7aef\u8fd9\u90e8\u5206\u67b6\u6784\u7684\u8bbe\u8ba1\u4e0a\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_5","title":"\u56db\u3001\u5b9e\u65bd\u8ba1\u5212","text":"\u8fd1\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u6587\u7ba1\u4ee3\u7801\u89e3\u8026 2022/3/28 2022/4/8 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u56fe\u5f62\u56fe\u50cf\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u97f3\u89c6\u9891\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5168\u5c40\u641c\u7d22\u4ee3\u7801\u89e3\u8026 2022/4/25 2022/4/26 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u516c\u5171\u5e93\u5efa\u8bbe 2022/4/27 2022/5/5 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5c01\u88c5\u7684\u65b9\u6cd5\u6574\u7406\u6210\u4e00\u4e2a\u8868 2022/5/6 2022/5/10 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7528\u4f8b\u6807\u7b7e\u5206\u7c7b\u8bc4\u4f30 2022/5/11 2022/5/11 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u6807\u7b7e\u5316\u6267\u884c\u9a71\u52a8\u7a0b\u5e8f\u7f16\u5199 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u9700\u5b9e\u73b0\u81ea\u52a8\u89e3\u6790 csv \u8868\u683c\u4e2d\u7684\u7528\u4f8b\u7f16\u53f7 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u722c\u866b\u811a\u672c\uff0c\u722c\u53d6 pms \u4e0a\u7528\u4f8b\u7684\u6807\u7b7e 2022/5/11 2022/5/13 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u5b9a\u65f6\u81ea\u52a8\u7ef4\u62a4\u672c\u5730 csv \u6587\u4ef6\u811a\u672c 2022/5/11 2022/5/20 \u4e2d\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u76ee\u5f55\u7ed3\u6784\u8c03\u6574 2022/5/20 2022/6/2 \u5b8c\u6210\u5168\u5c40\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u5177\u4f53\u65b9\u6848\u548c\u903b\u8f91\u5b9e\u73b0 2022/6/6 2022/6/17 \u9759\u6001\u626b\u63cf\u95ee\u9898\u6e05\u96f6 2022/6/20 2022/7/1 \u5b8c\u6210\u65b0\u6846\u67b6\u4f7f\u7528\u57f9\u8bad 2022/7/4 2022/7/11 \u843d\u5730\u8fd0\u884c 2022/7/12 2022/7/20 \u5e95\u5c42\u5e93\u7528\u9014\u8bf4\u660e\u6587\u6863\u7f16\u5199 2022/7/21 2022/7/28"}]} \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz index 8ffaebc1..e0b7bbfc 100644 Binary files a/sitemap.xml.gz and b/sitemap.xml.gz differ diff --git "a/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" "b/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" index 25f669d5..97100667 100644 --- "a/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" +++ "b/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs @@ -1215,8 +1215,7 @@ 智能化功能测试# Attribution :chengdu Test Team # Date :2021/08/20 -此方案仍在演进中 -此方案仍在演进中 +此方案仍在演进中 仓库地址:https://gitlabcd.uniontech.com/autotest/cd-desktop-aitest 一、方案概述¶ 基于深度学习智能识别应用的元素控件,用于在自动化测试操作过程中的元素定位以及判断结果时的断言处理;自动化测试过程中,测试机上的画面通过采集盒传输到服务器上,服务器对视频画面进行智能识别后,服务器智能判断用例是否执行成功,然后对测试机下发下一步操作指令,测试机接受并执行下一步操作。 diff --git "a/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" "b/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" index cdf9ccde..06c9e9a5 100644 --- "a/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" +++ "b/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" @@ -95,7 +95,7 @@ - + @@ -226,7 +226,7 @@ - + YouQu Docs diff --git "a/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" "b/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" index 121b4507..72123668 100644 --- "a/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" +++ "b/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs @@ -752,6 +752,13 @@ + + + + + 4、虚拟化部署 + + @@ -1661,6 +1668,13 @@ + + + + + 4、虚拟化部署 + + @@ -2604,18 +2618,12 @@ 1、标签说明流水线使用指导; 跳过原因:skip-XXX,用于控制用例是否执行; 确认修复:fixed-XXX,用于标记用例的修复状态(后面详细讲解用法); @@ -2629,26 +2637,30 @@ 1、标签说明PMS用例ID 用例级别 用例类型 +设备类型 +用例来源 上线对象 测试级别 跳过原因 确认修复 -废弃用例 -... +废弃用例 +... -001 +679537 679537 L1 FUNC +PPL + CICD C1 skip-XXX fixed-XXX -removed-已废弃 -... +removed-已废弃 +... @@ -2656,7 +2668,7 @@ 2、操作步骤csv 的文件名。 例如: -相册的用例文件为 test_album_xxx.py,xxx 表示任意三位数字代表用例序号,此时 csv 文件名就应为 album.csv; +相册的用例文件为 test_album_xxx.py,xxx 表示用例的ID(也可以是自定义的数字代表用例序号),此时 csv 文件名就应为 album.csv; 对于用例规模比较大的应用,比如文件管理器,建议分模块,每个模块建立一个 csv 文件,所有 csv 文件建议放在一个 tags 目录下。 是否分模块维护 csv 取决于应用的用例复杂度,同时我们应该充分考虑后期的可维护性,csv 文件太多了也是一个很糟糕的事情。 @@ -2677,7 +2689,7 @@ 3.1.1、固定跳过001 +679537 ... skip-受到某新需求影响 @@ -2742,7 +2754,7 @@ 3.2、确认修复001 +679537 ... skip-受到某新需求影响 fixed-已修复 @@ -2787,7 +2799,7 @@ 3.3、废弃用例4、设计思路¶ 上面介绍 Pytest 框架提供的标签功能 mark,使用时需要为每一个用例添加标签装饰器,则操作复杂,可维护性差,其根本问题就是标签分散在每一条用例的装饰器上,难以集中维护;于是乎将所有标签使用 csv 文件进行集中管理,并通过 Pytest 的钩子函数,读取 csv 文件,动态添加标签到用中。 5、CSV文件格式¶ -此配置文件需要维护大量的标签数据,且要方便能使用Excel打开进行编辑查看,更重要的是我们不想引入三方依赖,CSV 文件几乎是唯一能满足所有的要求的文件格式。 +此配置文件需要维护大量的标签数据,且要方便能使用 Excel 打开进行编辑查看,更重要的是我们不想引入三方依赖,CSV 文件几乎是唯一能满足所有的要求的文件格式。 七、日志系统¶ 1、背景¶ 基于 YouQu 自动化测试框架操作方法封装写法,通常是这样的:类里面一个函数只包含一个操作或多次调用的一系列可合并的操作; @@ -2888,7 +2900,7 @@ 1、原则 大文件不能上传到工程里面,保持整个工程的轻量化,这样在克隆代码的时候才能非常快速方便使用,我们见过一个 AT 工程 clone 大小达到好几个 G,简直不可思议。 其实代码文件的大小是很小的,也就是说,纯写代码随便写工程也不会太大,而文档(包含插图)等资源却是很占空间。 -因此我们选择将 YouQu 的文档工程单独迁出到独立的仓库 youqu-docs 。 +因此我们选择将 YouQu 的文档工程涉及到的图片资源都采用外链加载; 2、安装¶ 项目根目录下运行 env.sh 即可。 bash env.sh @@ -2930,17 +2942,25 @@ 3.2、裁剪依赖bash env_dev.sh +4、虚拟化部署¶ +YouQu默认采用虚拟化部分,虚拟化环境实际安装的位置是在 $HOME/.local/share/virtualenvs/youqu-oHTM7l7G 目录下 +youqu-oHTM7l7G 此目录名称前面部分是你的代码根目录的名称,后面部分是生成的随机字符串; +同学们在远程机器上定位问题的时候,如果使用 Pycharm 调试,就将解释器指定到这个目录的就行了; +当然,我们也提供了本机开发环境部署: +bash env_dev.sh + +如果你是本地开发环境可以用它,区别就是驱动执行的时候使用:python3 manage.py xxx 九、失败录屏¶ 录屏其实是一种视频形式的日志,因为很多时候我们在查看日志之后仍然无法准确的定位到用例失败的具体原因,因此用例的录屏能让我们看到用例在执行过程; 【使用方法】 在 globalconfig.ini 里面配置关注 2 个参数; -;失败用例重跑次数 -RERUN = 1 - -;失败录屏从第几次开始录制视频。 -;比如 RECORD_FAILED_CASE = 1 ,表示用例第1次执行失败之后开始录屏。 -;注意,用例失败重跑的次数不能小于失败录屏次数,即 RERUN >= RECORD_FAILED_CASE -RECORD_FAILED_CASE = 1 +;失败用例重跑次数 +RERUN = 1 + +;失败录屏从第几次开始录制视频。 +;比如 RECORD_FAILED_CASE = 1 ,表示用例第1次执行失败之后开始录屏。 +;注意,用例失败重跑的次数不能小于失败录屏次数,即 RERUN >= RECORD_FAILED_CASE +RECORD_FAILED_CASE = 1 默认失败重跑的次数是 1 次; RECORD_FAILED_CASE = 1 表示用例第1次执行失败之后开始录屏; @@ -2953,48 +2973,48 @@ 十、Wayland 适配简单讲就是,应用库只需要维护一套用例脚本即可。 【用例兼容】 因为 Wayland 下有些应用的界面显示和功能本身存在一些差异,用例层可能需要对这部分用例做逻辑判断,使用全局配置里面的常量进行逻辑编写即可: -from setting.globalconfig import GlobalConfig - -# GlobalConfig.IS_WAYLAND 获取到当前的显示服务器(bool) -# 应用库 Config 继承 GlobalConfig -if Config.IS_WAYLAND: - pass -if Config.IS_X11: - pass +from setting.globalconfig import GlobalConfig + +# GlobalConfig.IS_WAYLAND 获取到当前的显示服务器(bool) +# 应用库 Config 继承 GlobalConfig +if Config.IS_WAYLAND: + pass +if Config.IS_X11: + pass 比如用例里面如果断言的图片不同: -if Config.IS_WAYLAND: - self.assert_image_exist("wayland_XXX") -else: - self.assert_image_exist("x11_XXX") +if Config.IS_WAYLAND: + self.assert_image_exist("wayland_XXX") +else: + self.assert_image_exist("x11_XXX") 这样这条用例脚本在 Wayland 和 X11 下都可以跑,so easy 是不是?完全没必要专门拉新分支进行 Wayland 适配。 十一、测试报告¶ 1. 目录结构¶ 执行时会在根目录下动态生成 report 目录,所有的报告相关的文件会统一存放在里面,示例: -/report - ├── allure # allure报告 - │ ├── ... - │ └── ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json - ├── allure_html # 生成的html报告 - │ ├── ... - │ └── index.html - ├── allure_back # allure报告备份 - │ └── 20221108114823 - │ ├── ... - │ └── f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json - ├── json # json报告 - │ ├── ... - │ └── result_deepin-music_20221109134736_1081333.json - ├── logs # 日志文件 - │ ├── 2022-11-10_debug.log - │ └── 2022-11-10_error.log - ├── record # 录屏 - │ └── 2022-11-09 - │ ├── ... - │ └── 15时14分09秒_test_music_303_2_autotest.mp4 - └── xml # xml报告 - └── autotest_deepin_music-20221109134736.xml +/report + ├── allure # allure报告 + │ ├── ... + │ └── ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json + ├── allure_html # 生成的html报告 + │ ├── ... + │ └── index.html + ├── allure_back # allure报告备份 + │ └── 20221108114823 + │ ├── ... + │ └── f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json + ├── json # json报告 + │ ├── ... + │ └── result_deepin-music_20221109134736_1081333.json + ├── logs # 日志文件 + │ ├── 2022-11-10_debug.log + │ └── 2022-11-10_error.log + ├── record # 录屏 + │ └── 2022-11-09 + │ ├── ... + │ └── 15时14分09秒_test_music_303_2_autotest.mp4 + └── xml # xml报告 + └── autotest_deepin_music-20221109134736.xml 默认情况下同时生成 html、xml、json三种形式的报告。 2. 定制报告¶ @@ -3011,14 +3031,14 @@ 3. 查看报告allure open report/allure_html +allure open report/allure_html 使用 manage.py 执行完之后,在终端的最后一行,我们会给你输出打开报告的命令,直接复制它在终端执行就可以查看了,像这样: - 终端执行命令: allure open /tmp/youqu/report/allure_html 查看报告 + 终端执行命令: allure open /tmp/youqu/report/allure_html 查看报告 你也可以直接在 Pycharm 里面找到 index.html 文件,然后右键选择浏览器打开,或者你可以用一个 http 服务打开。 你也可以直接在 report/allure 目录下查看报告: - allure serve report/allure + allure serve report/allure 远程执行 @@ -3031,48 +3051,48 @@ 1. 提前解决代码问题这里推荐一个 Python 社区流行的代码格式化工具: Black,号称不妥协的代码格式化工具,它检测到不符合规范的代码风格直接就帮你全部格式化好,就是这么刚! 安装: -sudo pip3 install black +sudo pip3 install black 使用方法: -black ${CheckPath} +black ${CheckPath} 使用这个工具格式化之后,代码会被自动调整,刚开始你可能会觉得调整得很夸张,没关系坚持看,习惯之后,你会觉得很优雅,没错,这就是 Pythonic Code 的核心,请保持优雅~。 2. 代码扫描工具¶ 使用根目录下 pylint.sh 扫描代码,在 report 目录下查看代码扫描报告,如果有代码问题请提前解决之后再提交。 此脚本已经使用 Python 社区最流行的代码扫描工具 Pylint 进行代码扫描。 使用方法: -bash pylint.sh +bash pylint.sh 运行之后会提示你要扫描的目录,比如输入 apps ,则会扫描 apps 下的所有 Python 代码。 在 setting/pylintrc.cfg 配置文件里面进行相关配置,扫描完成之后在 report/pylints 目录下会生成扫描报告。 代码提交需通过 git review 提交到 gerrit ,人工 Code Review 通过之后合入代码。 十三、提交代码¶ 1. 安装依赖¶ -sudo apt install git-review +sudo apt install git-review 2. 提交模板¶ 在 ~ 目录下新建文件,并命名为 gitcommit_template 将以下内容写入文件当中: -# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 -fix: - -# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 -Description: - -# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 -Log: - -# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 -#Bug: - -# 修复 github issue -#Issue: - -# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 -#Task: +# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 +fix: + +# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 +Description: + +# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 +Log: + +# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 +#Bug: + +# 修复 github issue +#Issue: + +# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 +#Task: 命令行执行: -git config --global commit.template ~/gitcommit_template +git config --global commit.template ~/gitcommit_template 此命令将模板加入到 git 的提交模板中。 后续提交的时候需要关注一下几点: @@ -3083,19 +3103,19 @@ 2. 提交模板3. 推送代码¶ 首先添加 commit 信息 -git add 后面加文件名称 +git add 后面加文件名称 -git add . # 表示添加所有文件 +git add . # 表示添加所有文件 使用这条命令注意有些临时文件不要提交到仓库了。 -git commit -a +git commit -a 之后在 fix: 后面(注意冒号后面必须加空格,不然直接-1)写本地提交的 commit 信息,然后就可以提交代码了 -git review branch(当前分支) -r origin +git review branch(当前分支) -r origin 最好一次 commit,一次 git review ,经常有同学在本地疯狂 commit 最后 git review 报错不知道咋回事儿。 若不想每次提交都加上 -r 选项,执行以下命令: -git config --global gitreview.remote origin +git config --global gitreview.remote origin 提交代码,直接使用 git review branch<目标分支>,例如 git review master 4. Git标签¶ @@ -3106,74 +3126,74 @@ 4. Git标签git tag -a <tagname> +git tag -a <tagname> 回车之后,Git 会打开你的编辑器,让你写一句标签注解,就像你给提交写注解一样。 查看所有标签 -git tag -l -# git tag 也行 +git tag -l +# git tag 也行 删除标签 -git tag -d <tagname> +git tag -d <tagname> 推送标签至远程 git push 命令并不会传送标签到远程仓库服务器上,必须显式地推送标签。 -git push origin <tagname> +git push origin <tagname> 推送所有不在远程仓库服务器上的标签 -git push origin --tag +git push origin --tag 删除远程标签 -git push origin :refs/tag/<tagname> +git push origin :refs/tag/<tagname> 后期打标签 先用 git log --pretty=oneline 查询提交记录,获取校验码。 -git tag -a <tagname> 9fceb02(校验码) +git tag -a <tagname> 9fceb02(校验码) 检出标签 -git checkout <tagname> +git checkout <tagname> 此时,仓库会处于“分离头指针(detached HEAD)”的状态。 在“分离头指针”状态下,如果你做了某些更改然后提交它们,标签不会发生变化, 但你的新提交将不属于任何分支,并且将无法访问,除非通过确切的提交哈希才能访问。 因此,如果你需要进行更改,比如你要修复旧版本中的错误,那么通常需要创建一个新分支: -git checkout -b <NewBranchName> <tagname> +git checkout -b <NewBranchName> <tagname> 新分支上可以进行提交代码。 十四、常见问题¶ 1. 提交代码时提示邮箱或者名称不对¶ 重新配置邮箱或者名称,然后重置生效: -git commit --amend --reset-author +git commit --amend --reset-author 2. 怎么回滚到之前的版本¶ (1)查询历史提交记录 -git log +git log 找到你要回滚的版本,复制 hash 值。 注意:是 commit 空格之后的 hash 值,之前有同学复制的 Change-Id: 这样肯定报错。 (2)回滚版本,不清除代码 -git reset --soft ${hash} +git reset --soft ${hash} (3)回滚版本,清除代码,慎用哈 -git reset --hard ${hash} +git reset --hard ${hash} 3. 测试报告里面 F S . E 是什么意思¶ F 表示失败,. (点)表示通过,S 表示跳过,E 表示 error 有报错 4. 解决 git status 中文显示的问题¶ -git config --global core.quotePath false +git config --global core.quotePath false 5. apps 目录下颜色有些是黄色的¶ 在 Pycharm 中 apps 目录下应用库文件是黄色的,编辑器识别不到代码新增和修改; @@ -3184,22 +3204,22 @@ 5. apps 目录下颜色有些是黄色的6. 执行 env.sh 报错 $'\r':未找到命令¶ 出现这个问题你应该是在 windows 上打开或编辑过 env.sh 脚本,windows下的换行是回车符+换行符,也就是\r\n,而 Linxu 下是换行符 \n,Linux 下不识别 \r,因此报错。 解决方案: -# 将 \r 替换为空 -sudo sed -i 's/\r//' env.sh +# 将 \r 替换为空 +sudo sed -i 's/\r//' env.sh 7.怎样为单独某一条用例配置执行超时时间¶ 在用例脚本中添加装饰器,如下: -@pytest.mark.timeout(300) # 单位秒 -def test_xxx_001(): - pass +@pytest.mark.timeout(300) # 单位秒 +def test_xxx_001(): + pass 8. 如何拉取 YouQu 自动化项目所有代码,包含子仓库¶ 前置条件:已申请访问 YouQu 权限群组 -# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) -git config --global credential.helper store - -# 拉取YouQu框架代码,并递归拉取子仓库代码 -git clone "http://gerrit.uniontech.com/youqu" --recursive +# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) +git config --global credential.helper store + +# 拉取YouQu框架代码,并递归拉取子仓库代码 +git clone "http://gerrit.uniontech.com/youqu" --recursive 9. 如何拉取 YouQu 自动化项目中指定子仓库的代码¶ 前置条件: @@ -3207,22 +3227,22 @@ 9. 如何拉取 YouQu 自动化项目中指定子仓库的代 已申请访问 YouQu 权限群组 已存储访问密码 -# 拉取YouQu框架代码 -git clone "http://gerrit.uniontech.com/youqu" - -# 指定拉取子仓库代码 -cd youqu -git submodule update --init apps/autotest_xxx_xxx +# 拉取YouQu框架代码 +git clone "http://gerrit.uniontech.com/youqu" + +# 指定拉取子仓库代码 +cd youqu +git submodule update --init apps/autotest_xxx_xxx 10. 如何更新 YouQu 自动化项目中,所有子仓库的代码¶ 更新所有子仓库代码 -cd youqu -git pull & git submodule foreach git pull +cd youqu +git pull & git submodule foreach git pull 11. 如何修复 YouQu 所有子仓库 master 分支游离头(detached head)¶ 修复所有子仓库默认master 分支游离头 -cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
-h, --help show this help message and exit + -a APP, --app APP 应用名称:deepin-music 或 autotest_deepin_music 或 + apps/autotest_deepin_music + -k KEYWORDS, --keywords KEYWORDS + 用例的关键词,支持and/or/not逻辑组合 + -t TAGS, --tags TAGS 用例的标签,支持and/or/not逻辑组合 + --rerun RERUN 失败重跑次数 + --record_failed_case RECORD_FAILED_CASE + 失败录屏从第几次失败开始录制视频 + --clean {yes,} 清理环境 + --report_formats REPORT_FORMATS + 测试报告格式 + --max_fail MAX_FAIL 最大失败率 + --log_level LOG_LEVEL + 日志输出级别 + --timeout TIMEOUT 单条用例超时时间 + --resolution RESOLUTION + 检查分辨率 + --debug DEBUG 调试模式 + --noskip {yes,} csv文件里面标记了skip跳过的用例不生效 + --ifixed {yes,} fixed不生效,仅通过skip跳过用例 + --send_pms {,async,finish} + 数据回填 + --task_id TASK_ID 测试单ID + --trigger {,auto,hand} + 触发者 + -f CASE_FILE, --case_file CASE_FILE + 根据文件执行用例 + --deb_path DEB_PATH 需要安装deb包的本地路径 + --pms_user PMS_USER pms 用户名 + --pms_password PMS_PASSWORD + pms 密码 + --suite_id SUITE_ID pms 测试套ID + --pms_info_file PMS_INFO_FILE + pms 信息文件 + --top TOP 过程中记录top命令中的值 + --lastfailed 仅执行上次失败用例 + --duringfail 测试过程中立即显示报错 + --repeat REPEAT 指定用例执行次数 + --project_name PROJECT_NAME + 工程名称(写入json文件) + --build_location BUILD_LOCATION + 构建地区(写入json文件) + --line LINE 执行的业务线(写入json文件) + --autostart AUTOSTART 用例执行程序注册到开机自启服务
在一些 CI 环境下使用命令行参数会更加方便:
youqu manage.py run --app deepin-music --keywords "xxx" --tags "xxx" @@ -1181,8 +1269,13 @@ 2.1.2. 命令行参数2.2. 远程执行¶ +远程执行就是用本地作为服务端控制远程机器执行,远程机器执行的用例相同; +使用 remote 命令: youqu manage.py remote +2.2.1. 远程多机器分布式异步执行¶ + +多机器分布式异步执行就是由本地 YouQu 作为服务端,控制远程 N 台机器执行相同的用例,执行完之后所有测试机的测试结果会返回给服务端 report 目录下; 远程执行同样通过配置文件 setting/globalconfig.ini 进行用例相关配置; 需要重点说一下远程执行时的测试机信息配置,在配置文件 setting/remote.ini 里面配置测试机的用户名、IP、密码。 ;=============================== CLIENT LIST ===================================== @@ -1206,49 +1299,47 @@ 2.2. 远程执行user = uos ip = 10.8.11.xx -有多少台机器就像这样挨着写就行了。 +有多少台机器就像这样参考上面的格式写就行了。 然后在命令行: youqu manage.py remote 这样运行是从配置文件去读取相关配置。 如果你不想通过配置文件,你仍然通过命令行参数进行传参, 以下为 python3 manage.py remote 提供的一些参数选项: - -a APP, --app APP 应用名称:deepin-music 或 autotest_deepin_music 或 - apps/autotest_deepin_music - -c CLIENTS, --clients CLIENTS - 远程机器的user@ip:password,多个机器用'/'连接,如果password不传入,默认取 - setting/remote.ini 中 CLIENT_PASSWORD - 的值,比如:uos@10.8.13.33:1 或 uos@10.8.13.33 - -k KEYWORDS, --keywords KEYWORDS - 用例的关键词,支持and/or/not逻辑组合 - -t TAGS, --tags TAGS 用例的标签,支持and/or/not逻辑组合 - -s {yes,no,}, --send_code {yes,no,} - 发送代码到测试机(不含report目录) - -e, --build_env 搭建测试环境,如果为yes,不管send_code是否为yes都会发送代码到测试机. - -p CLIENT_PASSWORD, --client_password CLIENT_PASSWORD - 测试机密码(全局) - -y PARALLEL, --parallel PARALLEL - yes:表示所有测试机并行跑,执行相同的测试用例,no - :表示测试机分布式执行,服务端会根据收集到的测试用例自动分配给各个测试机执行。 - --rerun RERUN 失败重跑次数 - --clean {yes,} 清理环境 - --report_formats REPORT_FORMATS - 测试报告格式 - --log_level LOG_LEVEL - 日志输出级别 - --timeout TIMEOUT 单条用例超时时间 - --debug DEBUG 调试模式 - --noskip {yes,} csv文件里面标记了skip跳过的用例不生效 - --ifixed {yes,} fixed不生效,仅通过skip跳过用例 - --send_pms SEND_PMS 数据回填 - --task_id TASK_ID 测试单ID - --deb_path DEB_PATH 需要安装deb包的本地路径 + -h, --help show this help message and exit + -c CLIENTS, --clients CLIENTS + 远程机器的user@ip:password,多个机器用'/'连接,如果password不传入,默认取sett + ing/remote.ini中CLIENT_PASSWORD的值,比如: uos@10.8.13.33:1 + 或 uos@10.8.13.33 + -s, --send_code 发送代码到测试机(不含report目录) + -e, --build_env 搭建测试环境,如果为yes,不管send_code是否为yes都会发送代码到测试机. + -p CLIENT_PASSWORD, --client_password CLIENT_PASSWORD + 测试机密码(全局) + -y PARALLEL, --parallel PARALLEL + yes:表示所有测试机并行跑,执行相同的测试用例;no:表示测试机分布式执行,服务端会根据收集到的测试用例自 + 动分配给各个测试机执行。 +除了这些特有参数以外,它同样支持本地执行的所有参数; 在命令行这样运行: youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k "xxx" -t "xxx" 所有用例执行完之后会在 report 目录下回收各个测试机执行的测试报告。 +注意,如果远程机器没有搭建自动化测试环境,记得加上参数 -e : +youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k "xxx" -t "xxx" -e + +执行前确保远程机器已经开启了 ssh 服务,否则会提示无法连接,如果没有开启,请手动开启: +sudo systemctl restart ssh +sudo systemctl enable ssh + 配置文件其他相关配置项详细说明,请查看配置文件中的注释内容。 +2.2.2. 远程多机器分布式异步负载均衡执行¶ +多机器分布式异步负载均衡执行也是用本地作为服务端控制远程机器执行,但远程机器执行的用例不同,而是所有远程机器执行的用例之和,为你想要执行的用例集; +似乎有点难以理解,我用大白话举例描述下就是,服务端想要执行 10 条用例,现在远程机器有 5 台; +然后服务端就先拿着第 1 条用例给远程 1 号机执行,拿第 2 条用例给远程 2 号机执行...,如此循环直到所有用例执行完,这就是负载均衡执行。 + +使用方法和前面一样,只是需要增加一个参数: +youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k "xxx" -t "xxx" --parallel no + 2.3. PMS 数据回填¶ 测试单关联的用例,自动化测试对应的去跑这些关联的用例,并且将执行的结果回填的测试用例的状态里面。 PMS 数据回填主要有三种方式: @@ -1256,35 +1347,35 @@ 2.3. PMS 数据回填在用例执行的过程中,采用异步的方式去进行数据回填,直白的讲就是,第二条用例开始跑的时候,通过子线程去做第一条用例的数据回填,如此循环,直到所有用例执行结束; 这种方案的时间效率最高的,因为理论上用例的执行时间是大于数据回填的接口请求时间的,也就是说,当用例执行完之后,数据回填也完成了。 使用方法,在 globalconfig.ini 里面配置以下参数:(以下涉及到的参数配置都是在配置文件里面进行配置) -PMS_USER = PMS账号 -PMS_PASSWORD = PMS密码 -SEND_PMS = async -TASK_ID = 测试单ID -TRIGGER = auto -APP_NAME = 这个参数可填可不填,但是填了可以提高用例的执行速度,因为在用例收集阶段可以指定到具体的应用库。(下同) +PMS_USER = PMS账号 +PMS_PASSWORD = PMS密码 +SEND_PMS = async +TASK_ID = 测试单ID +TRIGGER = auto +APP_NAME = 这个参数可填可不填,但是填了可以提高用例的执行速度,因为在用例收集阶段可以指定到具体的应用库。(下同) (2)用例执行完之后回填 等所有用例执行完之后,再逐个进行回填的接口请求,此方案时间效率比较低。 使用方法: -PMS_USER = PMS账号 -PMS_PASSWORD = PMS密码 -SEND_PMS = finish -TASK_ID = 测试单ID -TRIGGER = auto -APP_NAME = +PMS_USER = PMS账号 +PMS_PASSWORD = PMS密码 +SEND_PMS = finish +TASK_ID = 测试单ID +TRIGGER = auto +APP_NAME = (3)手动回填 所有用例执行完之后不做回填的接口请求,后续手动将结果进行回填请求。 用例执行时配置: -PMS_USER = PMS账号 -PMS_PASSWORD = PMS密码 -SEND_PMS = finish -TASK_ID = 测试单ID -TRIGGER = hand -APP_NAME = +PMS_USER = PMS账号 +PMS_PASSWORD = PMS密码 +SEND_PMS = finish +TASK_ID = 测试单ID +TRIGGER = hand +APP_NAME = 后续手动回填方法: -youqu manage.py pms --send2task yes +youqu manage.py pms --send2task yes 可能遇到的问题¶ 由同学可能会发现,怎么回填一次之后,后面想再次回填就不生效了; @@ -1292,62 +1383,62 @@ 可能遇到的问题2.4. 导出 CSV 文件¶ 框架提供导出指定标签用例的功能: -youqu manage.py exportcsv -a deepin-album -t CICD +youqu manage.py exportcsv -a deepin-album -t CICD 表示导出 deepin-album 的用例中标记了 CICD 标签的用例,导出 CSV 文件的字段格式已经适配了 CICD 的要求。 2.5. 脚手架新建 APP 工程¶ 新建一个 APP 工程: -youqu manage.py startapp autotest_deepin_some +youqu manage.py startapp autotest_deepin_some 这样在 apps 目录下会创建一个子项目工程 autotest_deepin_some,同时新建好工程模板目录和模板文件: -apps -└── autotest_deepin_some - ├── case - │ ├── assert_res - │ │ └── readme - │ ├── base_case.py - │ └── __init__.py - ├── config.ini - ├── config.py - ├── conftest.py - ├── control - ├── deepin_some_assert.py - ├── deepin_some.csv - ├── __init__.py - └── widget - ├── base_widget.py - ├── case_res - │ └── readme - ├── deepin_some_widget.py - ├── __init__.py - ├── other.ini - ├── other_widget.py - ├── pic_res - │ └── readme - └── ui.ini +apps +└── autotest_deepin_some + ├── case + │ ├── assert_res + │ │ └── readme + │ ├── base_case.py + │ └── __init__.py + ├── config.ini + ├── config.py + ├── conftest.py + ├── control + ├── deepin_some_assert.py + ├── deepin_some.csv + ├── __init__.py + └── widget + ├── base_widget.py + ├── case_res + │ └── readme + ├── deepin_some_widget.py + ├── __init__.py + ├── other.ini + ├── other_widget.py + ├── pic_res + │ └── readme + └── ui.ini autotest_deepin_some 是你的工程名称,比如:autotest_deepin_music ; 在此基础上,你可以快速的开始你的 AT 项目。 2.6. 用例标签自动同步¶ 用于自动同步 PMS 用例标签数据至本地 CSV 文件,主要通过以下几个配置来控制: -APP_NAME = # 指定要同步的应用名称 -PMS_USER = # PMS的用户名 -PMS_PASSWORD = # PMS的密码 +APP_NAME = # 指定要同步的应用名称 +PMS_USER = # PMS的用户名 +PMS_PASSWORD = # PMS的密码 在 [csv_link_pms_id] 节点下指定 csv 文件名与 PMS 用例模块的对应关系,比如: -[csv_link_pms_id] -;同步PMS数据到本地CSV文件,必须要配置的配置项 -;key是本地CSV文件的文件名称; -;value是对应PMS上的模块ID; -;比如要同步音乐的数据, 首先需要将配置 APP_NAME = deepin-music, -;CSV文件名称为music.csv,其在PMS上的用例为: https://pms.uniontech.com/testcase-browse-53.html -;因此应该配置为: music = 53 -;这样才能将PMS与本地CSV文件建立联系。 -;如果你的应用分了很多模块,只需要将对应的信息依次配置好就行了。 -music = 53 +[csv_link_pms_id] +;同步PMS数据到本地CSV文件,必须要配置的配置项 +;key是本地CSV文件的文件名称; +;value是对应PMS上的模块ID; +;比如要同步音乐的数据, 首先需要将配置 APP_NAME = deepin-music, +;CSV文件名称为music.csv,其在PMS上的用例为: https://pms.uniontech.com/testcase-browse-53.html +;因此应该配置为: music = 53 +;这样才能将PMS与本地CSV文件建立联系。 +;如果你的应用分了很多模块,只需要将对应的信息依次配置好就行了。 +music = 53 将以上信息配置好之后,在命令行执行: -youqu manage.py pms --pms2csv yes +youqu manage.py pms --pms2csv yes 每次执行时原 csv 文件会自动备份在 report/csv_back 目录下,因此你不用担心脚本执行导致你的数据丢失。 diff --git a/search/search_index.json b/search/search_index.json index 91ebe84c..c7cfc7a2 100644 --- a/search/search_index.json +++ b/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\u200b\\u3000\\-\u3001\u3002\uff0c\uff0e\uff1f\uff01\uff1b]+","pipeline":["stemmer"]},"docs":[{"location":"","title":"\u9996\u9875","text":""},{"location":"#youqu","title":"\u6709\u8da3\uff08YouQu\uff09","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/4/1\n# Author : Mikigo\n# =============================================\n \u672c\u7ad9\u603b\u8bbf\u95ee\u91cf \u6b21 \u6b22\u8fce\u5728\u6d4f\u89c8\u5668\u8bbf\u95ee\u3010\u516c\u7f51\u6587\u6863\u3011 \u7edf\u4fe1\u516c\u53f8\u5185\u7f51\u8fd8\u53ef\u4ee5\u8bbf\u95ee\u3010\u5185\u7f51\u6587\u6863\u3011\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u54e6~~"},{"location":"#_1","title":"\u4e00\u3001\u7b80\u4ecb","text":"\u6709\u8da3\uff08YouQu\uff09\u662f\u6df1\u5ea6\u79d1\u6280\u8bbe\u8ba1\u548c\u5f00\u53d1\u7684\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff0c\u91c7\u7528\u7ed3\u6784\u5206\u5c42\u7684\u8bbe\u8ba1\u7406\u5ff5\uff0c\u652f\u6301\u591a\u5143\u5316\u5143\u7d20\u5b9a\u4f4d\u548c\u65ad\u8a00\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\u3001\u5f3a\u5927\u7684\u65e5\u5fd7\u548c\u62a5\u544a\u8f93\u51fa\u7b49\u7279\u8272\u529f\u80fd\uff0c\u540c\u65f6\u5b8c\u7f8e\u517c\u5bb9X11\u3001Wayland\u663e\u793a\u534f\u8bae\uff0c\u73af\u5883\u90e8\u7f72\u7b80\u5355\uff0c\u64cd\u4f5c\u6613\u4e0a\u624b\u3002"},{"location":"#17","title":"\u7231\u4e0a \u201c\u6709\u8da3\u201d \u7684 17 \u4e2a\u7406\u7531","text":" \u6838\u5fc3\u5e93\u63d0\u4f9b\u4e86\u7edf\u4e00\u7684\u63a5\u53e3\uff0c\u7f16\u5199\u65b9\u6cd5\u65f6\u53ea\u9700\u8981\u5bfc\u5165\u4e00\u4e2a\u5305\u5c31\u53ef\u4ee5\u4f7f\u7528\u5230\u6838\u5fc3\u5e93\u63d0\u4f9b\u7684\u6240\u6709\u529f\u80fd\uff1b \u516c\u5171\u5e93\u5c01\u88c5\u4e86\u5f88\u591a\u5e38\u7528\u6a21\u5757\u7684\u76f8\u5173\u65b9\u6cd5\uff0c\u6bd4\u5982\uff1a\u4efb\u52a1\u680f\u7684\u64cd\u4f5c\u3001\u684c\u9762\u7684\u64cd\u4f5c\u3001\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\u7b49\u7b49\uff1b \u9664\u4e86\u5e38\u7528\u7684\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u8bc6\u522b\u4ee5\u5916\uff0c\u6211\u4eec\u8fd8\u63d0\u4f9b\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u5176\u4f7f\u7528\u7b80\u5355\u4e14\u9ad8\u6548\uff0c\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff1b \u5bf9\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u5c06\u7f16\u5199\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u53d8\u5f97\u7b80\u5355\u800c\u4f18\u96c5\uff1b \u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u6280\u672f\u8fdb\u884c\u529f\u80fd\u5347\u7ea7\uff0c\u9664\u4e86\u652f\u6301\u5355\u4e2a\u5750\u6807\u8fd4\u56de\uff0c\u8fd8\u652f\u6301\u540c\u4e00\u754c\u9762\u4e0b\u591a\u4e2a\u76f8\u540c\u5143\u7d20\u8fd4\u56de\u591a\u4e2a\u5750\u6807\u7684\u529f\u80fd\uff1b \u63d0\u4f9b\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u548c\u6279\u91cf\u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u4e0d\u5230\u4e00\u4e2a csv \u6587\u4ef6\u539f\u6765\u80fd\u5e72\u8fd9\u4e48\u591a\u4e8b\u60c5\uff1b \u63d0\u4f9b\u4e86\u529f\u80fd\u5f3a\u5927\u7684\u6267\u884c\u5668\u5165\u53e3\uff0c\u8ba9\u4f60\u53ef\u4ee5\u65b9\u4fbf\u7684\u5728\u672c\u5730\u6267\u884c\u4efb\u4f55\u7528\u4f8b\u96c6\u7684\u7528\u4f8b\uff0c\u5176\u4e30\u5bcc\u7684\u81ea\u5b9a\u4e49\u914d\u7f6e\u9879\uff0c\u6ee1\u8db3\u4f60\u5bf9\u6267\u884c\u5668\u6240\u6709\u7684\u5e7b\u60f3\uff1b \u63d0\u4f9b\u8fdc\u7a0b\u6267\u884c\u7684\u529f\u80fd\uff0c\u53ef\u4ee5\u63a7\u5236\u591a\u53f0\u673a\u5668\u5e76\u884c\u8dd1\uff0c\u6216\u8005\u5206\u5e03\u5f0f\u8dd1\uff0c\u8fd9\u79cd\u4ed8\u8d39\u529f\u80fd\u73b0\u5728\u514d\u8d39\u7ed9\u4f60\u7528\uff1b \u63d0\u4f9b\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u529f\u80fd\uff0c\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u6bcf\u4e2a\u65b9\u6cd5\u5355\u72ec\u5199\u8f93\u51fa\u65e5\u5fd7\u7684\u4ee3\u7801\uff0c\u4e00\u5207\u6211\u4eec\u7ed9\u4f60\u641e\u5b9a\u4e86\uff0c\u65e5\u5fd7\u8f93\u51fa\u4e0d\u4ec5\u5185\u5bb9\u4e30\u5bcc\uff0c\u989c\u503c\u4e5f\u7edd\u5bf9\u5728\u7ebf\uff0c\u6211\u4eec\u8fd8\u81ea\u5df1\u8bbe\u8ba1\u4e86\u4e00\u6b3e\u7ec8\u7aef\u8f93\u51fa\u4e3b\u9898\u53eb\u300a\u4e94\u5f69\u6591\u6593\u7684\u9ed1\u300b\uff1b \u63d0\u4f9b\u4e86\u4e00\u952e\u90e8\u7f72\u81ea\u52a8\u5316\u6d4b\u8bd5\u73af\u5883\u7684\u529f\u80fd\uff0c\u8fde\u4ee3\u7801\u7f16\u8f91\u5668\u90fd\u7ed9\u4f60\u88c5\u597d\u4e86\uff0c\u8ba9\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u73af\u5883\u90e8\u7f72\u800c\u70e6\u607c\uff1b \u63d0\u4f9b\u4e86\u81ea\u52a8\u751f\u6210\u591a\u79cd\u62a5\u544a\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u8f93\u51fa\u4ec0\u4e48\u62a5\u544a\u5f62\u5f0f\u90fd\u884c\uff0c\u800c\u4e14\u6211\u4eec\u5728\u62a5\u544a\u4e2d\u8fd8\u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\u548c\u5931\u8d25\u622a\u56fe\u7684\u529f\u80fd\uff1b \u5bf9\u65ad\u8a00\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u63d0\u4f9b\u66f4\u53cb\u597d\u5316\u7684\u9519\u8bef\u63d0\u793a\uff0c\u8ba9\u5b9a\u4f4d\u95ee\u9898\u7cbe\u51c6\u9ad8\u6548\uff1b \u4e0d\u4ec5\u652f\u6301\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u63a7\u5236\uff0c\u800c\u4e14\u8fd8\u652f\u6301\u52a8\u6001\u63a7\u5236\u7528\u4f8b\u6279\u91cf\u6267\u884c\u7684\u603b\u65f6\u95f4\uff0c\u786e\u4fdd CI \u73af\u5883\u4e0b\u80fd\u987a\u7545\u8fd0\u884c\uff1b \u652f\u6301\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\u6267\u884c\u3001PMS \u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6807\u7b7e\u5316\u6267\u884c\u65b9\u6848\uff0c\u6ee1\u8db3\u4f60\u5404\u79cd\u573a\u666f\u4e0b\u7684\u6267\u884c\u9700\u6c42\uff1b \u652f\u6301\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u529f\u80fd\uff0c\u53ef\u5b9a\u4f4d\u53ef\u65ad\u8a00\uff0c\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\uff1b \u5b8c\u7f8e\u517c\u5bb9 Wayland \u548c X11\uff0c\u771f\u6b63\u505a\u5230\u4e00\u5957\u4ee3\u7801\uff0c\u968f\u5904\u6267\u884c\uff1b \u652f\u6301\u591a\u79cd\u65b9\u5f0f\u7684\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u5176\u4e2d\u5f02\u6b65\u56de\u586b\u7684\u65b9\u6848\uff0c\u5b8c\u7f8e\u89e3\u51b3\u4e86\u6570\u636e\u56de\u586b\u7684\u8017\u65f6\u95ee\u9898\uff1b \u3010\u89c6\u9891\u4ecb\u7ecd\u3011"},{"location":"#_2","title":"\u4e8c\u3001\u5b89\u88c5\u4f7f\u7528","text":"\u57fa\u7840\u6846\u67b6\uff1ahttps://github.com/linuxdeepin/deepin-autotest-framework \u4ece PyPI \u5b89\u88c5: sudo pip3 install youqu\n \u521b\u5efa\u9879\u76ee: youqu-startproject youqu\n \u5b89\u88c5\u4f9d\u8d56: cd youqu\nbash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002 \u5e94\u7528\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684\u5e94\u7528\u540d\u79f0\u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music cd apps/\n \u5c06\u5e94\u7528\u5e93\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u50cf\u8fd9\u6837\uff1a youqu\n\u251c\u2500\u2500 apps\n\u2502 \u251c\u2500\u2500 autotest_deepin_music # \u5e94\u7528\u5e93\n...\n \u5e94\u7528\u5e93\u7684\u540d\u79f0\u4e0d\u53ef\u4ee5\u4fee\u6539\u3002"},{"location":"#_3","title":"\u4e09\u3001\u8fd0\u884c","text":""},{"location":"#1","title":"1. \u5de5\u4f5c\u7a7a\u95f4","text":"\u57fa\u7840\u6846\u67b6\u5de5\u7a0b\u76ee\u5f55\u5efa\u8bae\u653e\u5728 ~ \u76ee\u5f55\u4e0b\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u4e5f\u53ef\u4ee5\u8fd0\u884c\uff0c\u4f46\u662f\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u9700\u8981\u505a\u73af\u5883\u6e05\u7406\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u5b58\u5728\u4ee3\u7801\u88ab\u5220\u9664\u7684\u98ce\u9669\u3002 \u5982\u679c\u4f60\u7684\u673a\u5668\u4e0a\u4e0d\u540c\u76ee\u5f55\u4e0b\u5b58\u5728\u591a\u4e2a YouQu \u5de5\u7a0b\uff0c\u90a3\u4e48\u5728\u8fd0\u884c\u4e4b\u524d\uff0c\u8bf7\u5148\u6267\u884c env.sh \u6821\u6b63\u76f8\u5173\u73af\u5883\u3002"},{"location":"#2","title":"2. \u6267\u884c\u5668","text":"\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u6709\u4e00\u4e2a manage.py \uff0c\u5b83\u662f\u4e00\u4e2a\u6267\u884c\u5668\u5165\u53e3\uff0c\u63d0\u4f9b\u4e86\u672c\u5730\u6267\u884c\u3001\u8fdc\u7a0b\u6267\u884c\u7b49\u7684\u529f\u80fd\u3002 \u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6765\u6267\u884c\uff1a youqu manage.py run -a deepin-music\n"},{"location":"#21","title":"2.1. \u672c\u5730\u6267\u884c","text":"youqu manage.py run\n"},{"location":"#211","title":"2.1.1. \u914d\u7f6e\u6587\u4ef6","text":"\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u914d\u7f6e\u53c2\u6570 \u5728\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u91cc\u9762\u652f\u6301\u914d\u7f6e\u5bf9\u6267\u884c\u7684\u4e00\u4e9b\u53c2\u6570\u8fdb\u884c\u914d\u7f6e\uff0c\u5e38\u7528\u7684\u5982\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;1\u3001KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2\u3001KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f, e.g. TAGS = L1 or smoke\n;\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\uff0c\u5c06\u8981\u6267\u884c\u7684\u7528\u4f8b\u5199\u5165\u6307\u5b9a\u7684 csv \u6587\u4ef6\n;\u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u4ece\u57fa\u7840\u6846\u67b6\u6839\u76ee\u5f55\u5f00\u59cb\uff1ae.g. CASE_FILE = case_list.txt\n;\u5982\u679c\u8fd9\u91cc\u6709\u503c\uff0cAPP_NAME KEYWORDS TAGS \u7684\u914d\u7f6e\u5747\u4e0d\u751f\u6548\nCASE_FILE =\n;=============================== RUNNER CONFIG ===================================\n[runner]\n;\u6700\u5927\u5931\u8d25\u7528\u4f8b\u6570\u91cf\u7684\u5360\u6bd4\n;\u6bd4\u5982\uff1a\u603b\u6267\u884c\u7528\u4f8b\u6570\u4e3a100, \u82e5 MAX_FAIL = 0.5,\u5219\u5931\u8d25\u7528\u4f8b\u6570\u8fbe\u523050\u5c31\u4f1a\u7ec8\u6b62\u6d4b\u8bd5\u3002\nMAX_FAIL = 0.5\n;\u5355\u6761\u7528\u4f8b\u7684\u8d85\u65f6\u65f6\u95f4\uff0c\u5982\u679c\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u8d85\u65f6\uff0c\u8fd9\u6761\u7528\u4f8b\u4f1a\u88ab\u505c\u6b62\uff0c\u540e\u7eed\u7528\u4f8b\u7ee7\u7eed\u6267\u884c\u3002\n;\u5355\u4f4d\u4e3a\u79d2\n; \u8fd9\u662f\u4e00\u4e2a\u5168\u5c40\u7edf\u4e00\u914d\u7f6e\uff0c\u5982\u679c\u67d0\u6761\u7528\u4f8b\u9700\u8981\u5355\u72ec\u914d\u7f6e\u8d85\u65f6\u65f6\u95f4\uff0c\u53ef\u4ee5\u5728\u7528\u4f8b\u4e2d\u8fd9\u6837\u5199\uff1a\n;@pytest.mark.timeout(500)\n;def test_xxx_001():\n; ...\n;\u4f1a\u8bdd\uff08\u6240\u6709\u7528\u4f8b\u6267\u884c\u7684\uff09\u8d85\u65f6\u662f\u6839\u636e\u5168\u5c40\u8d85\u65f6\u914d\u7f6e\u548c\u7528\u4f8b\u5355\u72ec\u8d85\u65f6\u914d\u7f6e\u81ea\u52a8\u8ba1\u7b97\u7684\uff1b\nCASE_TIME_OUT = 200\n;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\u3002\n;\u6ce8\u610f\uff0c\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u4e0d\u80fd\u5c0f\u4e8e\u5931\u8d25\u5f55\u5c4f\u6b21\u6570\uff0c\u5373 RERUN >= RECORD_FAILED_CASE\nRECORD_FAILED_CASE = 1\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = INFO\n;yes \u6bcf\u6761\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u8fdb\u884c\u73af\u5883\u6e05\u7406\nCLEAN_ALL = yes\n;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\nRESOLUTION = 1920x1080\n;\u4e0d\u8df3\u8fc7\u7528\u4f8b\uff0ccsv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86 skip-xxx\u7684\u7528\u4f8b\u4e0d\u8df3\u8fc7\nNOSKIP = no\n;ignore fixed\n;no\uff0c\u53ea\u8981\u6807\u8bb0\u4e86fixed\u7684\u7528\u4f8b\uff0c\u5373\u4f7f\u6807\u8bb0\u4e86skip-\uff0c\u4e5f\u4f1a\u6267\u884c\uff1b\n;yes\uff0cfixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\uff1b\nIFIXED = no\n;\u8981\u5b89\u88c5deb\u5305\u7684\u8def\u5f84\n;e.g : ~/Downloads/ \u5b89\u88c5\u4e0b\u8f7d\u76ee\u5f55\u4e0b\u7684deb\u5305\uff0c\u5982\u679c\u662f\u8fdc\u7a0b\u6267\u884c\uff0c\u4f1a\u81ea\u52a8\u62f7\u8d1d\u5230\u8fdc\u7a0b\u5e76\u5b89\u88c5\u3002\nDEB_PATH =\n;DEBUG \u6a21\u5f0f\u6267\u884c\u7528\u4f8b\uff0c\u53ea\u6536\u96c6\u4e0d\u6267\u884c\u7528\u4f8b\uff0c\u4e5f\u4e0d\u505a\u8bbe\u5907\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002\nDEBUG = no\n;\u8bb0\u5f55top\u547d\u4ee4\u67e5\u8be2\u7684\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0cTOP = 3 \u8868\u793a\u8bb0\u5f55\u524d3\u4e2a\u8fdb\u7a0b\u3002\nTOP =\n;\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\nREPEAT =\n;\u9ed8\u8ba4\u5728\u6240\u6709\u6d4b\u8bd5\u5b8c\u6210\u4e4b\u540e\u8f93\u51fa\u62a5\u9519\u4fe1\u606f.\n;yes, \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\nDURING_FAIL = no\n;=============================== REPORT CONFIG ===================================\n[report]\n;\u7528\u4f8b\u6267\u884c\u5b8c\u540e\u751f\u6210\u7684\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n;\u76ee\u524d\u652f\u6301 allure, xml, json \uff08\u652f\u6301\u540c\u65f6\u751f\u6210\uff09\nREPORT_FORMAT = allure, xml, json\n;\u6307\u5b9a\u62a5\u544a\u751f\u6210\u7684\u8def\u5f84\uff08\u76f8\u5bf9\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\uff09\nALLURE_REPORT_PATH = report/\nXML_REPORT_PATH = report/\nJSON_REPORT_PATH = report/\n;=============================== GLOBAL CONFIG ===================================\n[globalconfig]\n;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\nPASSWORD = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\nIMAGE_MATCH_NUMBER = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6bcf\u6b21\u95f4\u9694\u7b49\u5f85\u65f6\u95f4\nIMAGE_MATCH_WAIT_TIME = 1\n;\u56fe\u50cf\u8bc6\u522b\u5339\u914d\u5ea6\nIMAGE_RATE = 0.9\n;\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u5b9e\u65f6\u56fe\u50cf\u4fdd\u5b58\u8def\u5f84\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u5750\u6807\nSCREEN_CACHE = /tmp/screen.png\n;\u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\u7684\u8def\u5f84\nTMPDIR = /tmp/tmpdir\n;\u7cfb\u7edf\u4e3b\u9898\nSYS_THEME = deepin\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = http://youqu-dev.uniontech.com:8890\n;OpenCV\u670d\u52a1\u7aef\u5730\u5740\nOPENCV_SERVER_HOST = http://youqu-dev.uniontech.com:8889\n;=============================== PMS CONFIG ===================================\n;PMS\u76f8\u5173\u914d\u7f6e\uff0c\u5305\u542b\u4ee5\u4e0b\u51e0\u4e2a\u65b9\u9762\uff1a\n;1.PMS\u6d4b\u8bd5\u5957\u6267\u884c\n;2.\u81ea\u52a8\u4ecePMS\u722c\u53d6\u6570\u636e\u5e76\u540c\u6b65\u672c\u5730CSV\u6587\u4ef6\n;3.PMS\u6570\u636e\u56de\u586b\n[pms]\n;PMS\u7684\u7528\u6237\u540d: ut001234\nPMS_USER =\n;PMS\u7684\u5bc6\u7801\nPMS_PASSWORD =\n;PMS\u6d4b\u8bd5\u5957\u7684ID\n;\u5728PMS\u4e0a\u67e5\u770b\u7528\u4f8b\u201c\u5957\u4ef6\u201d\u94fe\u63a5: https://pms.uniontech.com/testsuite-view-495.html\n;\u6d4b\u8bd5\u5957ID\u4e3a: 495\nSUITE_ID =\n;\u6570\u636e\u56de\u586b\u5fc5\u987b\u5173\u8054PMS\u6d4b\u8bd5\u5355\n;\u5728PMS\u4e0a\u67e5\u770b\u6d4b\u8bd5\u5355\u94fe\u63a5: https://pms.uniontech.com/testtask-cases-20747.html\n;\u6d4b\u8bd5\u5355ID\u4e3a: 20747\nTASK_ID =\n;\u5c06\u6d4b\u8bd5\u7ed3\u679c\u6570\u636e\u56de\u586b\u5230PMS\n;\u4e3a\u7a7a: \u8868\u793a\u4e0d\u56de\u586b,\u4e0d\u4f1a\u5728\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u751f\u6210json\u7ed3\u679c\u6587\u4ef6;\n;async: \u8868\u793a\u9010\u6761\u5f02\u6b65\u56de\u586b,\u540e\u9762\u4e00\u6761\u6267\u884c\u5f00\u59cb\u65f6\u901a\u8fc7\u5b50\u7ebf\u7a0b\u5bf9\u524d\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u8fdb\u884c\u56de\u586b\uff0c\u5982\u6b64\u5b9e\u73b0\u65f6\u95f4\u6548\u7387\u6700\u5927\u5316;\n;finish: \u8868\u793a\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u6210\u4e4b\u540e\u9010\u4e2a\u56de\u586b(PMS\u4e0d\u652f\u6301\u5e76\u53d1);\nSEND_PMS =\n;\u6570\u636e\u56de\u586b\u7684\u89e6\u53d1\u8005\n;auto: \u6846\u67b6\u81ea\u52a8\u56de\u586b,\u914d\u5408SEND_PMS\u914d\u7f6e\u4f7f\u7528,\u4f60\u53ef\u4ee5\u9009\u62e9\u5728\u4e0d\u540c\u7684\u9636\u6bb5\u8fdb\u884c\u6570\u636e\u56de\u586b;\n;hand: \u624b\u52a8\u56de\u586b,\u6bcf\u6761\u7528\u4f8b\u4ecd\u7136\u4f1a\u751f\u6210json\u6587\u4ef6,\u4f46\u6846\u67b6\u4e0d\u4f1a\u8fdb\u884c\u6570\u636e\u56de\u586b,\u9700\u8981\u4f60\u53ef\u4ee5\u5728\u4f60\u60f3\u8981\u53d1\u9001\u7684\u65f6\u95f4\u70b9\u624b\u52a8\u89e6\u53d1\u56de\u586b;\nTRIGGER = auto\n;PMS\u56de\u586b\u7684\u91cd\u8bd5\u6b21\u6570\n;\u5982\u679c\u63a5\u53e3\u8bf7\u6c42\u5931\u8d25,\u4f1a\u8fdb\u884c\u91cd\u8bd5\nSEND_PMS_RETRY_NUMBER = 2\n[csv_link_pms_lib]\n;caselib: \u7528\u4f8b\u5e93\n;testcase: \u4ea7\u54c1\u5e93\u7528\u4f8b\nCASE_FROM = caselib\n[csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/caselib-browse-81.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 81\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic =\n[export_csv]\n;\u5bfc\u51fa\u7684csv\u6587\u4ef6\u540d\u79f0\uff0c\u9ed8\u8ba4 case_list.csv\nCSV_FILE = case_list.csv\n;exportcsv \u547d\u4ee4\u5bfc\u51fa case_list.csv \u6587\u4ef6\u65f6\u914d\u7f6e\u7684\u5b57\u6bb5\u540d\uff0c\u7528\u4f8b\u540d\u79f0\u9ed8\u8ba4\u5b58\u5728\u7b2c\u4e00\u5217\uff0c\u65e0\u9700\u6dfb\u52a0\nCSV_HEARD = \u7528\u4f8b\u7ea7\u522b,\u7528\u4f8b\u7c7b\u578b,\u6d4b\u8bd5\u7ea7\u522b,\u662f\u5426\u8df3\u8fc7\n \u914d\u7f6e\u5b8c\u6210\u4e4b\u540e\uff0c\u76f4\u63a5\u5728\u547d\u4ee4\u884c\u6267\u884c manage.py \u5c31\u597d\u4e86\u3002 youqu manage.py run\n"},{"location":"#212","title":"2.1.2. \u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a youqu manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--max_fail MAX_FAIL \u6700\u5927\u5931\u8d25\u7387\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--resolution RESOLUTION\n\u68c0\u67e5\u5206\u8fa8\u7387\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms {,async,finish}\n\u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--trigger {,auto,hand}\n\u89e6\u53d1\u8005\n-f CASE_FILE, --case_file CASE_FILE\n\u6839\u636e\u6587\u4ef6\u6267\u884c\u7528\u4f8b\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n--pms_user PMS_USER pms \u7528\u6237\u540d\n--pms_password PMS_PASSWORD\npms \u5bc6\u7801\n--suite_id SUITE_ID pms \u6d4b\u8bd5\u5957ID\n--pms_info_file PMS_INFO_FILE\npms \u4fe1\u606f\u6587\u4ef6\n--top TOP \u8fc7\u7a0b\u4e2d\u8bb0\u5f55top\u547d\u4ee4\u4e2d\u7684\u503c\n--lastfailed \u4ec5\u6267\u884c\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\n--duringfail \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\n--repeat REPEAT \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n--project_name PROJECT_NAME\n\u5de5\u7a0b\u540d\u79f0\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--build_location BUILD_LOCATION\n\u6784\u5efa\u5730\u533a\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--line LINE \u6267\u884c\u7684\u4e1a\u52a1\u7ebf\uff08\u5199\u5165json\u6587\u4ef6\uff09\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a youqu manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\"\n \u547d\u4ee4\u884c\u53c2\u6570\u4f18\u5148\u7ea7\u662f\u9ad8\u4e8e\u914d\u7f6e\u6587\u4ef6\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u4e86\u5bf9\u5e94\u7684\u53c2\u6570\uff0c\u914d\u7f6e\u6587\u4ef6\u4e2d\u4e0d\u7ba1\u662f\u5426\u914d\u7f6e\u5747\u4e0d\u751f\u6548\u3002 --app \u5165\u53c2\u8fd8\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\uff0c\u4e0b\u9762\u7684\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u540c\u6837\u652f\u6301\u3002"},{"location":"#22","title":"2.2. \u8fdc\u7a0b\u6267\u884c","text":"youqu manage.py remote\n \u8fdc\u7a0b\u6267\u884c\u540c\u6837\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u8fdb\u884c\u7528\u4f8b\u76f8\u5173\u914d\u7f6e\uff1b \u9700\u8981\u91cd\u70b9\u8bf4\u4e00\u4e0b\u8fdc\u7a0b\u6267\u884c\u65f6\u7684\u6d4b\u8bd5\u673a\u4fe1\u606f\u914d\u7f6e\uff0c\u5728\u914d\u7f6e\u6587\u4ef6 setting/remote.ini \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\u3001IP\u3001\u5bc6\u7801\u3002 ;=============================== CLIENT LIST =====================================\n; \u6d4b\u8bd5\u673a\u914d\u7f6e\u5217\u8868\n;[client{number}] ;\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u6709\u591a\u5c11\u53f0\u6d4b\u8bd5\u673a\u5c31\u5199\u591a\u5c11\u4e2a client\uff0c\u522b\u540d\u5fc5\u987b\u5305\u542b client \u5b57\u7b26\uff0c\u4e14\u4e0d\u80fd\u91cd\u590d\u3002\n;user = ;\u6d4b\u8bd5\u673a user\n;ip = ;\u6d4b\u8bd5\u673a ip\n;password = 1 ;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801, \u53ef\u4ee5\u4e0d\u914d\u7f6e\u6b64\u9879\uff0c\u9ed8\u8ba4\u53d6 CLIENT_PASSWORD \u7684\u503c\uff1b\n;\u5982\u679c\u4f60\u6240\u6709\u6d4b\u8bd5\u673a\u5bc6\u7801\u90fd\u76f8\u540c\uff0c\u90a3\u4e48\u53ea\u9700\u8981\u914d\u7f6e CLIENT_PASSWORD \u5c31\u53ef\u4ee5\u4e86\n;=================================================================================\n[client1]\nuser = uos\nip = 10.8.15.xx\n[client2]\nuser = uos\nip = 10.8.15.xx\n[client3]\nuser = uos\nip = 10.8.11.xx\n \u6709\u591a\u5c11\u53f0\u673a\u5668\u5c31\u50cf\u8fd9\u6837\u6328\u7740\u5199\u5c31\u884c\u4e86\u3002 \u7136\u540e\u5728\u547d\u4ee4\u884c\uff1a youqu manage.py remote\n \u8fd9\u6837\u8fd0\u884c\u662f\u4ece\u914d\u7f6e\u6587\u4ef6\u53bb\u8bfb\u53d6\u76f8\u5173\u914d\u7f6e\u3002 \u5982\u679c\u4f60\u4e0d\u60f3\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\uff0c\u4f60\u4ecd\u7136\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u8fdb\u884c\u4f20\u53c2\uff0c \u4ee5\u4e0b\u4e3a python3 manage.py remote \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-c CLIENTS, --clients CLIENTS\n\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679cpassword\u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6\nsetting/remote.ini \u4e2d CLIENT_PASSWORD\n\u7684\u503c,\u6bd4\u5982\uff1auos@10.8.13.33:1 \u6216 uos@10.8.13.33\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-s {yes,no,}, --send_code {yes,no,}\n\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a\uff08\u4e0d\u542breport\u76ee\u5f55\uff09\n-e, --build_env \u642d\u5efa\u6d4b\u8bd5\u73af\u5883,\u5982\u679c\u4e3ayes\uff0c\u4e0d\u7ba1send_code\u662f\u5426\u4e3ayes\u90fd\u4f1a\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a.\n-p CLIENT_PASSWORD, --client_password CLIENT_PASSWORD\n\u6d4b\u8bd5\u673a\u5bc6\u7801\uff08\u5168\u5c40\uff09\n-y PARALLEL, --parallel PARALLEL\nyes:\u8868\u793a\u6240\u6709\u6d4b\u8bd5\u673a\u5e76\u884c\u8dd1\uff0c\u6267\u884c\u76f8\u540c\u7684\u6d4b\u8bd5\u7528\u4f8b\uff0cno\n:\u8868\u793a\u6d4b\u8bd5\u673a\u5206\u5e03\u5f0f\u6267\u884c\uff0c\u670d\u52a1\u7aef\u4f1a\u6839\u636e\u6536\u96c6\u5230\u7684\u6d4b\u8bd5\u7528\u4f8b\u81ea\u52a8\u5206\u914d\u7ed9\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u3002\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms SEND_PMS \u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n \u5728\u547d\u4ee4\u884c\u8fd9\u6837\u8fd0\u884c\uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\"\n \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report \u76ee\u5f55\u4e0b\u56de\u6536\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u7684\u6d4b\u8bd5\u62a5\u544a\u3002 \u914d\u7f6e\u6587\u4ef6\u5176\u4ed6\u76f8\u5173\u914d\u7f6e\u9879\u8be6\u7ec6\u8bf4\u660e\uff0c\u8bf7\u67e5\u770b\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u6ce8\u91ca\u5185\u5bb9\u3002"},{"location":"#23-pms","title":"2.3. PMS \u6570\u636e\u56de\u586b","text":"\u6d4b\u8bd5\u5355\u5173\u8054\u7684\u7528\u4f8b\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u5bf9\u5e94\u7684\u53bb\u8dd1\u8fd9\u4e9b\u5173\u8054\u7684\u7528\u4f8b\uff0c\u5e76\u4e14\u5c06\u6267\u884c\u7684\u7ed3\u679c\u56de\u586b\u7684\u6d4b\u8bd5\u7528\u4f8b\u7684\u72b6\u6001\u91cc\u9762\u3002 PMS \u6570\u636e\u56de\u586b\u4e3b\u8981\u6709\u4e09\u79cd\u65b9\u5f0f\uff1a \uff081\uff09\u5f02\u6b65\u56de\u586b \u5728\u7528\u4f8b\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\uff0c\u91c7\u7528\u5f02\u6b65\u7684\u65b9\u5f0f\u53bb\u8fdb\u884c\u6570\u636e\u56de\u586b\uff0c\u76f4\u767d\u7684\u8bb2\u5c31\u662f\uff0c\u7b2c\u4e8c\u6761\u7528\u4f8b\u5f00\u59cb\u8dd1\u7684\u65f6\u5019\uff0c\u901a\u8fc7\u5b50\u7ebf\u7a0b\u53bb\u505a\u7b2c\u4e00\u6761\u7528\u4f8b\u7684\u6570\u636e\u56de\u586b\uff0c\u5982\u6b64\u5faa\u73af\uff0c\u76f4\u5230\u6240\u6709\u7528\u4f8b\u6267\u884c\u7ed3\u675f\uff1b \u8fd9\u79cd\u65b9\u6848\u7684\u65f6\u95f4\u6548\u7387\u6700\u9ad8\u7684\uff0c\u56e0\u4e3a\u7406\u8bba\u4e0a\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u662f\u5927\u4e8e\u6570\u636e\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\u65f6\u95f4\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u5f53\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u6570\u636e\u56de\u586b\u4e5f\u5b8c\u6210\u4e86\u3002 \u4f7f\u7528\u65b9\u6cd5\uff0c\u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u4ee5\u4e0b\u53c2\u6570\uff1a\uff08\u4ee5\u4e0b\u6d89\u53ca\u5230\u7684\u53c2\u6570\u914d\u7f6e\u90fd\u662f\u5728\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u914d\u7f6e\uff09 PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = async\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \u8fd9\u4e2a\u53c2\u6570\u53ef\u586b\u53ef\u4e0d\u586b\uff0c\u4f46\u662f\u586b\u4e86\u53ef\u4ee5\u63d0\u9ad8\u7528\u4f8b\u7684\u6267\u884c\u901f\u5ea6\uff0c\u56e0\u4e3a\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u53ef\u4ee5\u6307\u5b9a\u5230\u5177\u4f53\u7684\u5e94\u7528\u5e93\u3002\uff08\u4e0b\u540c\uff09\n \uff082\uff09\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u56de\u586b \u7b49\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u518d\u9010\u4e2a\u8fdb\u884c\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u6b64\u65b9\u6848\u65f6\u95f4\u6548\u7387\u6bd4\u8f83\u4f4e\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \uff083\uff09\u624b\u52a8\u56de\u586b \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4e0d\u505a\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u540e\u7eed\u624b\u52a8\u5c06\u7ed3\u679c\u8fdb\u884c\u56de\u586b\u8bf7\u6c42\u3002 \u7528\u4f8b\u6267\u884c\u65f6\u914d\u7f6e\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = hand\nAPP_NAME = \u540e\u7eed\u624b\u52a8\u56de\u586b\u65b9\u6cd5\uff1a youqu manage.py pms --send2task yes\n"},{"location":"#_4","title":"\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898","text":"\u7531\u540c\u5b66\u53ef\u80fd\u4f1a\u53d1\u73b0\uff0c\u600e\u4e48\u56de\u586b\u4e00\u6b21\u4e4b\u540e\uff0c\u540e\u9762\u60f3\u518d\u6b21\u56de\u586b\u5c31\u4e0d\u751f\u6548\u4e86\uff1b \u8fd9\u662f\u56e0\u4e3a\u4e3a\u4e86\u5e94\u5bf9\u524d\u9762\u63d0\u5230\u7684\u591a\u79cd\u6570\u636e\u56de\u586b\u7684\u65b9\u5f0f\uff0c\u5728 report \u76ee\u5f55\u4e0b\u4f1a\u7531 pms_xxx \u5f00\u5934\u7684\u76ee\u5f55\uff0c\u8bb0\u5f55\u4e86\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u548c\u56de\u586b\u60c5\u51b5\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u4e4b\u524d\u5df2\u7ecf\u56de\u586b\u8fc7\u4e86\uff0c\u540e\u7eed\u5c31\u4e0d\u4f1a\u518d\u6b64\u89e6\u53d1\u56de\u586b\u4e86\uff1b \u5982\u679c\u4f60\u60f3\u91cd\u65b0\u505a\u56de\u586b\uff0c\u4f60\u53ef\u4ee5\u628a report/pms_xxx \u76ee\u5f55\u5220\u6389\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u91cd\u65b0\u505a\u6570\u636e\u56de\u586b\u4e86\uff1b"},{"location":"#24-csv","title":"2.4. \u5bfc\u51fa CSV \u6587\u4ef6","text":"\u6846\u67b6\u63d0\u4f9b\u5bfc\u51fa\u6307\u5b9a\u6807\u7b7e\u7528\u4f8b\u7684\u529f\u80fd\uff1a youqu manage.py exportcsv -a deepin-album -t CICD\n \u8868\u793a\u5bfc\u51fa deepin-album \u7684\u7528\u4f8b\u4e2d\u6807\u8bb0\u4e86 CICD \u6807\u7b7e\u7684\u7528\u4f8b\uff0c\u5bfc\u51fa CSV \u6587\u4ef6\u7684\u5b57\u6bb5\u683c\u5f0f\u5df2\u7ecf\u9002\u914d\u4e86 CICD \u7684\u8981\u6c42\u3002"},{"location":"#25-app","title":"2.5. \u811a\u624b\u67b6\u65b0\u5efa APP \u5de5\u7a0b","text":"\u65b0\u5efa\u4e00\u4e2a APP \u5de5\u7a0b\uff1a youqu manage.py startapp autotest_deepin_some \u8fd9\u6837\u5728 apps \u76ee\u5f55\u4e0b\u4f1a\u521b\u5efa\u4e00\u4e2a\u5b50\u9879\u76ee\u5de5\u7a0b autotest_deepin_some\uff0c\u540c\u65f6\u65b0\u5efa\u597d\u5de5\u7a0b\u6a21\u677f\u76ee\u5f55\u548c\u6a21\u677f\u6587\u4ef6\uff1a apps\n\u2514\u2500\u2500 autotest_deepin_some\n \u00a0\u00a0 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_case.py\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 config.ini\n \u00a0\u00a0 \u251c\u2500\u2500 config.py\n \u00a0\u00a0 \u251c\u2500\u2500 conftest.py\n \u00a0\u00a0 \u251c\u2500\u2500 control\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_assert.py\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some.csv\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u2514\u2500\u2500 widget\n \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 case_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 other.ini\n \u00a0\u00a0 \u251c\u2500\u2500 other_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 pic_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2514\u2500\u2500 ui.ini\n autotest_deepin_some \u662f\u4f60\u7684\u5de5\u7a0b\u540d\u79f0\uff0c\u6bd4\u5982\uff1aautotest_deepin_music \uff1b \u5728\u6b64\u57fa\u7840\u4e0a\uff0c\u4f60\u53ef\u4ee5\u5feb\u901f\u7684\u5f00\u59cb\u4f60\u7684 AT \u9879\u76ee\u3002"},{"location":"#26","title":"2.6. \u7528\u4f8b\u6807\u7b7e\u81ea\u52a8\u540c\u6b65","text":"\u7528\u4e8e\u81ea\u52a8\u540c\u6b65 PMS \u7528\u4f8b\u6807\u7b7e\u6570\u636e\u81f3\u672c\u5730 CSV \u6587\u4ef6\uff0c\u4e3b\u8981\u901a\u8fc7\u4ee5\u4e0b\u51e0\u4e2a\u914d\u7f6e\u6765\u63a7\u5236\uff1a APP_NAME = # \u6307\u5b9a\u8981\u540c\u6b65\u7684\u5e94\u7528\u540d\u79f0\nPMS_USER = # PMS\u7684\u7528\u6237\u540d\nPMS_PASSWORD = # PMS\u7684\u5bc6\u7801\n \u5728 [csv_link_pms_id] \u8282\u70b9\u4e0b\u6307\u5b9a csv \u6587\u4ef6\u540d\u4e0e PMS \u7528\u4f8b\u6a21\u5757\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u6bd4\u5982\uff1a [csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/testcase-browse-53.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 53\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic = 53\n \u5c06\u4ee5\u4e0a\u4fe1\u606f\u914d\u7f6e\u597d\u4e4b\u540e\uff0c\u5728\u547d\u4ee4\u884c\u6267\u884c\uff1a youqu manage.py pms --pms2csv yes\n \u6bcf\u6b21\u6267\u884c\u65f6\u539f csv \u6587\u4ef6\u4f1a\u81ea\u52a8\u5907\u4efd\u5728 report/csv_back \u76ee\u5f55\u4e0b\uff0c\u56e0\u6b64\u4f60\u4e0d\u7528\u62c5\u5fc3\u811a\u672c\u6267\u884c\u5bfc\u81f4\u4f60\u7684\u6570\u636e\u4e22\u5931\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u57fa\u7840\u6846\u67b6\u8bbe\u8ba1\u65b9\u6848","text":"# ====================================\n# Author : Mikigo\n# Time : 2022/3/18\n# version \uff1a1.0\n# ====================================\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"\u505a\u4e00\u4e2a\u7b80\u5355\u3001\u597d\u7528\u3001\u529f\u80fd\u5f3a\u5927\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u3002 \u4f5c\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4e00\u4e2a\u57fa\u7840\u6846\u67b6\uff0c\u4efb\u4f55\u5e94\u7528\u90fd\u80fd\u5f88\u65b9\u4fbf\u7684\u63a5\u5165\u8fdb\u6765\uff1b \u63d0\u4f9b\u6240\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u9700\u8981\u7684\u5e95\u5c42\u529f\u80fd\uff0c\u5e76\u5bf9\u5916\u63d0\u4f9b\u552f\u4e00\u7684\u63a5\u53e3\uff0c\u65b9\u4fbf\u5e94\u7528\u5e93\u4f7f\u7528\uff1b \u6574\u5408\u516c\u5171\u5e93\uff0c\u51cf\u5c11\u5e94\u7528\u5e93\u4ee3\u7801\u91cf\u548c\u65b9\u6cd5\u7ef4\u62a4\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u8bbe\u8ba1\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u7edf\u4e00\u6982\u5ff5","text":" \u57fa\u7840\u6846\u67b6 \u672c\u9879\u76ee\u662f\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\uff08AutoTest Basic Frame\uff09\uff0c\u5168\u79f0\u4e3a\u201c\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff08AT \u57fa\u7840\u6846\u67b6\uff09\u201d\u3002 AT \u57fa\u7840\u6846\u67b6\u662f\u505a\u4e3a\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\u6765\u8bbe\u8ba1\u7684\uff0c\u5b83\u63d0\u4f9b\u4e86\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u57fa\u7840\u529f\u80fd\uff0c\u4efb\u4f55\u5e94\u7528\u63a5\u5165\u8fdb\u6765\u90fd\u80fd\u5feb\u901f\u65b9\u4fbf\u7684\u8fdb\u884c\u65b9\u6cd5\u548c\u7528\u4f8b\u7f16\u5199\uff0c\u540c\u65f6\u5728\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u3001\u6807\u7b7e\u5316\u6267\u884c\u3001\u5206\u5e03\u5f0f\u6267\u884c\u3001\u591a\u79cd\u62a5\u544a\u8f93\u51fa\u3001\u4f18\u7f8e\u7684\u6267\u884c\u65e5\u5fd7\u3001\u5931\u8d25\u81ea\u52a8\u5f55\u5c4f\u548c\u622a\u56fe\u3001\u81ea\u52a8\u73af\u5883\u6e05\u7406\u7b49\u7b49\uff0c\u5b83\u90fd\u63d0\u4f9b\u4e86\u5b8c\u5584\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u66f4\u91cd\u8981\u7684\u662f\u8fd9\u4e00\u5207\u4f7f\u7528\u8d77\u6765\u90fd\u975e\u5e38\u7b80\u5355\u3002 \u57fa\u7840\u6846\u67b6\u4e2d\u5305\u542b\u5e94\u7528\u5e93\uff08apps\uff09\u3001\u6838\u5fc3\u5e93\uff08src\uff09\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09\u3002 \u5e94\u7528\u5e93\uff08apps\uff09 \u5404\u4e2a\u5e94\u7528\u81ea\u5df1\u7684\u4ed3\u5e93\uff0c\u91cc\u9762\u4e3b\u8981\u5305\u542b\u7684\u662f\u7528\u4f8b\u3001\u65b9\u6cd5\u53ca\u4e00\u4e9b\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u53eb autotest-dde-file-manager \u3002 \u6838\u5fc3\u5e93\uff08src\uff09 \u6838\u5fc3\u5e93\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u5230\u6240\u6709\u5e95\u5c42\u6838\u5fc3\u529f\u80fd\uff0c\u8fd9\u662f\u6700\u91cd\u8981\u7684\u4e00\u4e2a\u90e8\u5206\uff0c\u7075\u9b42\u3002\u5177\u4f53\u529f\u80fd\u6a21\u5757\u53ca\u8bf4\u660e\u4f1a\u5728\u4e0b\u9762\u7b2c\u56db\u4e2a\u7ae0\u8282\u8be6\u7ec6\u63cf\u8ff0\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09 \u591a\u4e2a\u5e94\u7528\u90fd\u8981\u7528\u5230\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\uff0c\u6309\u7167\u5e94\u7528\u5212\u5206\u5b58\u653e\uff0c\u4e3b\u8981\u662f\u4e3a\u4e86\u51cf\u5c11\u4ee3\u7801\u91cf\uff0c\u6d88\u9664\u5e94\u7528\u95f4\u7684\u8026\u5408\u5173\u7cfb\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u67b6\u6784\u56fe","text":"\u6574\u4f53\u7684\u6846\u67b6\u8bbe\u8ba1\u5728\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u300b\u6587\u6863\u91cc\u9762\u5df2\u7ecf\u6709\u8be6\u7ec6\u63cf\u8ff0\u4e86\uff0c\u8fd9\u91cc\u8d34\u4e00\u4e0b\u6574\u4f53\u7684\u67b6\u6784\u56fe\uff1a \u4e3a\u4e86\u7a81\u663e\u672c\u6587\u7684\u91cd\u70b9\uff0c\u62bd\u53d6\u5176\u4e2d\u91cd\u8981\u529f\u80fd\u6a21\u5757\uff0c\u5982\u4e0b\u56fe\uff1a "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-basic-frame # \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\n\u251c\u2500\u2500 apps # \u5e94\u7528\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-dde-file-manager # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\uff08\u5e94\u7528\u5e93\u8be6\u7ec6\u76ee\u5f55\u7ed3\u6784\u8bf7\u770b\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\uff09\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 tag # \u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u2514\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u2502 \u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 xxx.png\n\u2502 \u2502 ...\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-deepin-music # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 public # \u516c\u5171\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget # dde_dock \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget # dde_desktop \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 src # \u6838\u5fc3\u5e93\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 button_center.py\n\u2502 \u251c\u2500\u2500 cmdtrl.py\n\u2502 \u251c\u2500\u2500 dogtails.py\n\u2502 \u251c\u2500\u2500 find_image.py\n\u2502 \u251c\u2500\u2500 global_config.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 setting # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 config.py\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 global_config.ini\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\u6a21\u5757\uff08Hook\uff09\n\u251c\u2500\u2500 pytest.ini # Pytest \u9ed8\u8ba4\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 docs # \u6587\u6863\u76ee\u5f55\n\u2514\u2500\u2500 manage.py # \u6267\u884c\u5668\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1apps","title":"1\u3001\u5e94\u7528\u5e93\uff08apps\uff09","text":"\u6240\u6709\u5e94\u7528\u5e93\u5747\u653e\u7f6e\u5728\u57fa\u7840\u6846\u67b6\u4e0b\u7684 apps \u76ee\u5f55\u4e0b\uff08\u89c1\u7b2c\u4e8c\u7ae0\u8282\u7b2c3\u6bb5\u76ee\u5f55\u7ed3\u6784\u5185\u5bb9\uff09\u3002\u5e94\u7528\u5e93\u7684\u67b6\u6784\u8bbe\u8ba1\u53ef\u4ee5\u53c2\u8003\u300aAT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b\u6587\u6863\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2src","title":"2\u3001\u6838\u5fc3\u5e93\uff08src\uff09","text":"\u5728 src \u76ee\u5f55\u4e0b\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u5e95\u5c42\u6838\u5fc3\u7ec4\u4ef6\uff0c\u901a\u5e38\u6765\u8bb2\u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5230\u5176\u4e2d\u67d0\u4e00\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4e48\u4f60\u9700\u8981\u663e\u793a\u7684\u5bfc\u5165\u8fd9\u4e2a\u6a21\u5757\uff0c\u7136\u540e\u624d\u80fd\u4f7f\u7528\u8be5\u6a21\u5757\u4e0b\u7684\u529f\u80fd\uff0c\u5982\u679c\u4f60\u7528\u5230\u4e86\u5341\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4f60\u5c31\u9700\u8981\u5bfc\u5165\u5341\u4e2a\u3002\u4f46\u662f\u6211\u4eec\u60f3\u8ba9\u4e8b\u60c5\u53d8\u5f97\u7b80\u5355\uff0c\u4e00\u6b21\u5bfc\u5165\uff0c\u4f7f\u7528\u6240\u6709\u3002 \u5c06\u6240\u6709\u7684\u529f\u80fd\u6a21\u5757\u90fd\u8fdb\u5165\u5230 src \u7684\u540d\u79f0\u7a7a\u95f4\uff0c\u5728 src/__init__.py \u91cc\u9762\u6211\u4eec\u8bbe\u8ba1\u6210\u8fd9\u6837\uff1a # src/__init__.py\nfrom .cmdctl import CmdCtl\nfrom .dogtails import Dogtail\nfrom .find_image import FindImage\nfrom .button_center import ButtonCenter\nclass Src(CmdCtl, FindImage):\ndef __init__(self, **kwargs):\n\"\"\"dogtail or button center param\n :param kwargs: app_name, desc, number\n \"\"\"\nif kwargs:\napp_name = kwargs.get(\"APP_NAME\")\ndesc = kwargs.get(\"DESC\")\nif app_name is None or desc is None:\nraise ValueError\nnumber = kwargs.get(\"number\")\nnumber = number if isinstance(number, int) else -1\n# \u5bf9\u8c61\u7ec4\u5408\nself.dog = Dogtail(app_name, desc, number)\nself.ui = ButtonCenter(app_name, number)\n \u9700\u8981\u4f20\u9012\u53c2\u6570\u7684\u91c7\u7528\u5bf9\u8c61\u7ec4\u5408\uff0c\u6ca1\u6709\u53c2\u6570\u7684\u4f7f\u7528\u7ee7\u627f\uff0c\u7ee7\u627f\u7684\u7c7b\u7b26\u5408 Mixin \u8bbe\u8ba1\u6a21\u5f0f\u3002 \u5e94\u7528\u5e93\u91cc\u9762\u4f7f\u7528\u7684\u65f6\u5019\u5728 widget/base_widget.py \u91cc\u9762\u53ea\u9700\u8981\u552f\u4e00\u7ee7\u627f Src \uff1a # \u5e94\u7528\u5e93\u91cc\u9762\u65b9\u6cd5\u57fa\u7c7b\n# widget/base_widget.py\nfrom src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n \u8981\u4f7f\u7528\u6838\u5fc3\u5e93\u7684\u529f\u80fd\uff0c\u53ea\u9700\u8981\u5199\u4e00\u4e2a\u5bfc\u5165 from src import Src \u5373\u53ef\u3002 \u5199 __init__ \u6784\u9020\u51fd\u6570\u7684\u539f\u56e0\u662f\u901a\u8fc7\u53c2\u6570\u6784\u9020\u5e94\u7528\uff0c\u5e76\u4e14\u4f20\u9012 number \u8fdb\u6765\uff0c\u53ef\u4ee5\u5b9e\u73b0\u591a\u7a97\u53e3\u7684\u63a7\u5236\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3public","title":"3\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09","text":"\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6bcf\u4e2a\u5e94\u7528\u90fd\u662f\u4e00\u4e2a\u5355\u72ec\u7684 py \u6587\u4ef6\uff0c\u76f8\u4e92\u4e4b\u95f4\u662f\u72ec\u7acb\u7684\uff0c\u6bcf\u4e2a py \u6587\u4ef6\u91cc\u9762\u662f\u8be5\u5e94\u7528\u7684\u65b9\u6cd5\u7c7b\uff0c\u6bd4\u5982\uff1a\u6700\u5e38\u7528\u7684\u65b9\u6cd5\u7c7b dde_desktop_public_widget.py # dde_desktop_widget.py\nfrom src import Src\nclass _DdeDesktopPublicBaseWidget(Src):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-desktop\"\nDESC = \"/usr/bin/dde-desktop\"\ndef __init__(self):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC)\nclass DdeDesktopPublicWidget(_DdeDesktopPublicBaseWidget):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u7c7b\"\"\"\ndef click_music_dir_by_ui(self):\n\"\"\"\u5728\u6587\u4ef6\u9009\u62e9\u6846\u70b9\u51fb\u97f3\u4e50\u76ee\u5f55\"\"\"\nself.click(*self.ui.btn_center(\"\u4fa7\u8fb9\u680f-\u97f3\u4e50\")) \ndef click_xxx_by_attr(self):\npass\n \u516c\u5171\u65b9\u6cd5\u5e93\u610f\u4e49\uff1a \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6240\u5c01\u88c5\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\u90fd\u662f\u81f3\u5c11\u88ab2\u4e2a\u5e94\u7528\u90fd\u7528\u5230\u7684\uff0c\u8fd9\u6837\u505a\u53ef\u4ee5\u51cf\u5c11\u6574\u4f53\u4ee3\u7801\u91cf\uff0c\u4ece\u800c\u51cf\u8f7b\u5e94\u7528\u5e93\u4ee3\u7801\u7684\u7ef4\u62a4\u5de5\u4f5c\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u7f16\u5199\u5f62\u5f0f\uff08\u547d\u540d\u89c4\u5219\u3001\u5b9a\u4f4d\u7684\u65b9\u6848\u5199\u6cd5\u3001\u6ce8\u91ca\u7684\u5199\u6cd5\u7b49\u7b49\uff09\u5177\u6709\u4e00\u5b9a\u7684\u6a21\u677f\u4f5c\u7528\uff0c\u8fd9\u6837\u5373\u4f7f\u662f\u5404\u4e2a\u5e94\u7528\u5e93\u90fd\u72ec\u7acb\u7ef4\u62a4\uff0c\u6240\u6709\u7684\u7f16\u7801\u98ce\u683c\u90fd\u662f\u8d8b\u4e8e\u76f8\u540c\u7684\uff0c\u56e0\u4e3a\u5927\u5bb6\u90fd\u5e94\u8be5\u53c2\u7167\u516c\u5171\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u5199\u6cd5\u6765\u5199\u81ea\u5df1\u5e94\u7528\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\u7c7b\uff0c\u8fd9\u6837\u4f7f\u5f97\u4ece\u516c\u53f8\u7684\u89d2\u5ea6\u53bb\u770b\u6240\u6709\u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u90fd\u662f\u7edf\u4e00\u7684\u3002 \u53ef\u4ee5\u901a\u8fc7\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\uff0c\u4e86\u89e3\u5230\u5176\u4ed6\u5e94\u7528\u7684\u529f\u80fd\uff0c\u5bf9\u4e8e\u6211\u4eec\u9700\u6c42\u7406\u89e3\uff0c\u4e86\u89e3\u7cfb\u7edf\u7684\u65b9\u65b9\u9762\u9762\u4e5f\u6709\u597d\u5904\u3002 \u5f53\u7136\uff0c\u5982\u679c\u4f60\u7684\u5e94\u7528\u672c\u8eab\u662f\u5c5e\u4e8e\u6839\u672c\u5c31\u4e0d\u9700\u8981\u548c\u5176\u4ed6\u5e94\u7528\u4ea4\u4e92\u7684\uff0c\u90a3\u4e48\u4f60\u53ef\u80fd\u4e0d\u4f1a\u7528\u5230\u8fd9\u91cc\u9762\u7684\u529f\u80fd\uff0c\u6ca1\u5173\u7cfb\uff0c\u4f60\u6240\u6709\u7684\u65b9\u6cd5\u90fd\u53ef\u4ee5\u76f4\u63a5\u5199\u5728\u5e94\u7528\u5e93\u7684\u4e1a\u52a1\u5c42\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4conftestpy","title":"4\u3001conftest.py","text":"conftest.py \u4ece\u529f\u80fd\u4e0a\u5c06\u662f\u5c5e\u4e8e\u6838\u5fc3\u5e93\uff08src\uff09\u7684\u5185\u5bb9\uff0c\u4f46\u662f\u7531\u4e8e\u5b83\u7684\u7279\u6b8a\u6027\uff0c\u5373\u5b83\u662f\u5bf9\u5e94\u7528\u5e93\u4e2d\u7684\u7528\u4f8b\u751f\u6548\u7684\uff0c\u800c\u4e14\u5b83\u7684\u4f5c\u7528\u57df\u662f\u5f53\u524d\u76ee\u5f55\u53ca\u4ee5\u4e0b\uff0c\u56e0\u6b64\u6211\u4eec\u5c06\u5b83\u653e\u5230\u9879\u76ee\u6839\u76ee\u5f55\u3002\u6211\u4eec\u6846\u67b6\u4e2d\u6709\u4e0d\u5c11\u6838\u5fc3\u529f\u80fd\u90fd\u662f\u5728\u8fd9\u91cc\u9762\u8fdb\u884c\u5f00\u53d1\u7684\uff0c\u540e\u9762\u7b2c\u56db\u7ae0\u4f1a\u8bb2\u5230\u7ec6\u8282\u3002 pytest.ini \u4f5c\u7528\u548c conftest.py \u7c7b\u4f3c\uff0c\u662f Pytest \u6846\u67b6\u7684\u56fa\u5b9a\u914d\u7f6e\u6587\u4ef6\uff0c\u76ee\u524d\u914d\u7f6e\u4e86\u4e00\u4e9b\u901a\u7528\u7684\u547d\u4ee4\u884c\u6267\u884c\u53c2\u6570\uff0c\u4e5f\u653e\u5728\u9879\u76ee\u6839\u76ee\u5f55\u3002 \u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 Hook \u51fd\u6570\uff0capps \u76ee\u5f55\u4e0b\u7684 \u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 fixture \u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5setting","title":"5\u3001setting","text":"\u5168\u5c40\u914d\u7f6e\u6a21\u5757\uff0c\u5305\u542b\u4e86\u4ee5\u4e0b\u914d\u7f6e\u6587\u4ef6\uff1a \uff081\uff09ini \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u914d\u7f6e\u4e00\u4e9b\u5168\u5c40\u7684\u914d\u7f6e\u9879\uff0c\u8b6c\u5982\uff1a\u5931\u8d25\u91cd\u8dd1\u6b21\u6570\u3001\u662f\u5426\u5931\u8d25\u5f55\u5c4f\u3001\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\u3001\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4\u3001\u6267\u884c\u65f6\u65e5\u5fd7\u7ea7\u522b\u3001\u751f\u6210\u7684\u62a5\u544a\u7c7b\u578b\u3001\u4ee5\u53ca\u5206\u5e03\u5f0f\u6267\u884c\u7684\u4e00\u4e9b\u7b56\u7565\u914d\u7f6e\u9879\u7b49\u7b49\u3002 \uff082\uff09config.py \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u63d0\u4f9b\u914d\u7f6e\u6587\u4ef6\u8bfb\u53d6\u3001\u52a8\u6001\u83b7\u53d6\u4e00\u4e9b\u5e38\u91cf\uff08\u5982\u9879\u76ee\u6839\u76ee\u5f55\u7edd\u5bf9\u8def\u5f84 (BASE_DIR)\u3001\u7cfb\u7edf\u67b6\u6784\uff08SYS_FRAME\uff09\u3001\u65f6\u95f4\u5b57\u7b26\u4e32\uff08strftime\uff09\u3001\u672c\u673a USERNAME IP \u7b49\u7b49\uff09\u3001\u516c\u5171 URL \u7b49\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u89c4\u8303","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u7248\u672c\u53ca\u4f9d\u8d56","text":"\u57fa\u7840\u6846\u67b6\u4f1a\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u8fdb\u884c\u7248\u672c\u53d1\u5e03\uff0c\u4e0d\u4e0e\u67d0\u4e2a\u5e94\u7528\u7248\u672c\u7ed1\u5b9a\uff0c\u4f46\u662f\uff0c\u5e94\u7528\u5e93\u4f1a\u4f9d\u8d56\u4e8e\u57fa\u7840\u6846\u67b6\u7684\u7248\u672c\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u5efa\u8bae\u5728\u5e94\u7528\u5e93\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a\u6587\u672c\u6587\u4ef6\u7528\u4e8e\u8bb0\u5f55\u6240\u4f9d\u8d56\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\uff0c\u7c7b\u4f3c\u4e8e\u5f00\u53d1\u5e94\u7528\u7684 debian/control \u6587\u4ef6\u7684\u529f\u80fd\uff0c\u4e3a\u4e86\u4fdd\u6301\u7edf\u4e00\uff0c\u8fd9\u4e2a\u6587\u4ef6\u5c31\u547d\u540d\u4e3a control\uff0c\u653e\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u6838\u5fc3\u5e93\u72ec\u7acb\u6027","text":"\u6838\u5fc3\u5e93\u4e0d\u5efa\u8bae\u9488\u5bf9\u67d0\u4e00\u4e2a\u5e94\u7528\u5355\u72ec\u505a\u4ee3\u7801\u4e0a\u7279\u6b8a\u5904\u7406\uff0c\u901a\u5e38\u8003\u8651\u9488\u5bf9\u67d0\u4e00\u79cd\u573a\u666f\u8fdb\u884c\u5904\u7406\uff0c\u8fd9\u4e9b\u573a\u666f\u901a\u5e38\u662f\u5b58\u5728\u4e00\u4e9b\u5171\u6027\u7684\u3002\u6bd4\u5982\u8bf4\uff1a\u684c\u9762\u7684ID\u5206\u914d\u5b58\u5728\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u903b\u8f91\u5904\u7406\u89e3\u51b3ID\u5206\u914d\u9519\u8bef\u7684\u95ee\u9898\uff0c\u4f46\u662f\u8fd9\u90e8\u5206\u903b\u8f91\u6211\u4eec\u4f1a\u5728\u684c\u9762\u7684\u65b9\u6cd5\u5c42\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u517c\u5bb9\u6027","text":"\u4e3a\u4e86\u4fdd\u6301\u517c\u5bb9\u6027\uff0c\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u539f\u5219\u4e0a\u4e0d\u5bf9\u8001\u65b9\u6cd5\u8fdb\u884c\u4fee\u6539\u6216\u5220\u9664\uff0c\u53ea\u8fdb\u884c\u65b0\u589e\u3002\u6d89\u53ca\u5230\u8001\u65b9\u6cd5\u4fee\u6539\u6216\u5220\u9664\u7684\uff0c\u4f1a\u8fdb\u884c\u63d0\u524d\u9884\u544a\uff0c\u5e76\u5728\u7b2c\u4e8c\u4e2a\u7248\u672c\u4e4b\u540e\uff08\u4e2d\u95f4\u4f1a\u9694\u4e00\u4e2a\u7248\u672c\u8fc7\u5ea6\uff09\u6b63\u5f0f\u5b9e\u65bd\u4fee\u6539\u6216\u5220\u9664\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u547d\u540d\u89c4\u8303","text":" \u7528\u4f8b ID \u6bcf\u4e2a\u5e94\u7528\u81ea\u5df1\u7ef4\u62a4\u4e00\u5957 ID\uff0c\u5728PMS\u4e0a\u7528\u4f8b\u6807\u9898\u4e0a\u5c06\u81ea\u52a8\u5316ID\u4ee5\u6807\u7b7e\u7684\u5f62\u5f0f\u5199\u5165\uff0c\u6bd4\u5982\uff1a[101]\u6253\u5f00-\u542f\u52a8\u5e94\u7528\u540edock\u53f3\u952e\u83dc\u5355 \u4e00\u4e2a\u7528\u4f8b\u7c7b\u91cc\u9762\u6709\u591a\u4e2a\u7528\u4f8b\u65f6\uff0c\u5728\u7528\u4f8b\u540d\u79f0\u540e\u9762\u52a0\u5e8f\u53f7\u3002 class TestFileManager(BaseCase):\n\"\"\"\u6587\u7ba1\u7528\u4f8b\"\"\"\ndef test_xxx_015_1(self):\npass\ndef test_xxx_015_2(self):\npass\n \u6ce8\u610f 015_1\uff0c\u4e0d\u8981\u5199015_01\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 PMS \u4e0a\u7684\u7528\u4f8bID\uff1a PMS \u4e0a\u662f6\u4f4d\u6570\uff0c\u4e0d\u591f\u76f4\u89c2\uff0c\u4e5f\u4e0d\u597d\u7ef4\u62a4\uff0c\u5728\u81ea\u52a8\u5316\u4e0b\u9762\u53bb\u627e\u4e00\u4e2a\u5e26\u6709 6 \u4f4d\u6570\u7684\u6587\u4ef6\u662f\u4e00\u4e2a\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 PMS \u4e0a\u7684 ID \u53ef\u80fd\u4f1a\u53d1\u751f\u53d8\u5316\uff0c\u6bd4\u5982\u5bfc\u51fa\u6765\u5bfc\u8fdb\u53bb\u7684\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u5b58\u5728\u95ee\u9898\uff0c\u5982\u679c\u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u8981\u60f3\u627e\u51fa\u6765\u5bf9\u5e94\u4fee\u6539\u81ea\u52a8\u5316\u7528\u4f8b ID\uff0c\u5c06\u4f1a\u662f\u4ef6\u975e\u5e38\u75db\u82e6\u7684\u4e8b\u60c5\u3002 \u51fd\u6570\u547d\u540d\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5de6\u952e\u70b9\u51fb click \u53f3\u952e\u70b9\u51fb right_click \u53cc\u51fb double_click \u79fb\u52a8 move_to \u62d6\u52a8 drag \u65b0\u5efa new \u62d6\u52a8\u5230 drag_to \u4ece\u54ea\u91cc\u62d6\u52a8\u5230\u54ea\u91cc drag_something_from_xxx_to_xxx \u83b7\u53d6 get \u83b7\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5750\u6807 get_location \u975e\u7279\u6b8a\u6587\u4ef6 file word\u6587\u4ef6 doc text\u6587\u4ef6 text \u6587\u4ef6\u5939 dir \u5173\u952e\u8bcd\u6301\u7eed\u589e\u52a0 \u5e38\u91cf\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5e94\u7528\u540d\u79f0 APP_NAME \u5e94\u7528\u63cf\u8ff0 DESC \u672c\u5e94\u7528\u4ee5\u5916\u7684\u5176\u4ed6\u5e94\u7528\uff0c\u6bd4\u5982\u5e2e\u52a9 HELP \u5176\u4ed6\u540d\u79f0\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u65b9\u6cd5\u5305\u540d widget \u65b9\u6cd5\u6587\u4ef6\u540d\uff08\u6587\u7ba1\u4e3e\u4f8b\uff09 dfm_widget.pytitle_widget.pyright_view_widget.pyleft_view_widget.pypop_widget.pybase_widget.pydfm_assert.py \u65ad\u8a00\u8bed\u53e5\u547d\u540d\u89c4\u8303 \u65ad\u8a00\u8bed\u53e5\u90fd\u662f\u4ee5 assert \u5f00\u5934 \u65ad\u8a00 \u8bed\u53e5 \u5224\u65ad\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_existsassert_file_not_exists \u5224\u65ad\u684c\u9762\u76ee\u5f55\u4e0b\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_exists_in_desktopassert_file_not_exists_in_desktop \u5224\u65ad\u56fe\u7247\u5b58\u5728 assert_image_existsassert_image_not_exists \u5224\u65ad\u5f71\u9662\u4e2d\u662f\u5426\u5b58\u5728\u56fe\u7247 assert_image_exists_in_movieassert_image_not_exists_in_movie \u5224\u65ad\u5143\u7d20\u662f\u5426\u5b58\u5728 assert_element_existassert_element_not_exist \u5224\u65ad\u662f\u5426\u76f8\u7b49 assert_equalassert_not_equal \u5224\u65ad\u662f\u5426\u4e3a\u771f assert_trueassert_false"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5fixture","title":"5\u3001fixture \u89c4\u8303","text":"\u7531\u4e8e Pytest \u6846\u67b6\u4e2d\u652f\u6301 fixture \u7684\u5199\u6cd5\u548c Xunit \u5199\u6cd5\u7684\uff0c\u6240\u4ee5\u5e94\u7528\u5e93\u4e2d\u53ef\u80fd\u5b58\u5728\u6df7\u7528\u7684\u60c5\u51b5\uff0c\u4e3a\u7edf\u4e00\u7f16\u7801\u98ce\u683c\u65b9\u4fbf\u540e\u7eed\u7528\u4f8b\u4ee3\u7801\u7ef4\u62a4\uff0c\u73b0\u505a\u4ee5\u4e0b\u89c4\u8303\u8bf4\u660e\uff1a \u629b\u5f03 Xunit \u7684\u5199\u6cd5\uff0c\u7edf\u4e00\u91c7\u7528 Pytest fixture \u7684\u5199\u6cd5\u3002 \u5e94\u7528\u5185 fixture \u8c28\u614e\u4f7f\u7528 autouse=True \uff0c\u975e\u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u975e\u5e38\u4e0d\u5efa\u8bae\u4f7f\u7528\u8fd9\u4e2a\u53c2\u6570\u3002 \u8c03\u7528 fixture \u4e0d\u80fd\u4f7f\u7528 @pytest.mark.usefixture()\uff0c\u4f7f\u7528\u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u4f20\u5165\u51fd\u6570\u5bf9\u8c61\u3002 \u5efa\u8bae\u5728\u4e00\u4e2a conftest.py \u91cc\u9762\u53bb\u5199\uff0c\u4e00\u4e2a\u5e94\u7528\u4e5f\u5c3d\u91cf\u7ef4\u62a4\u4e00\u4e2a conftest.py\u6587\u4ef6\u3002 fixture \u4e5f\u9700\u8981\u5199\u529f\u80fd\u8bf4\u660e\uff0c\u51fd\u6570\u540d\u79f0\u8981\u6709\u5177\u4f53\u542b\u4e49\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#6","title":"6\u3001\u65b9\u6cd5\u7f16\u5199\u89c4\u8303","text":" \u65b9\u6cd5\u7c7b\u578b\uff1a if \u6ca1\u6709\u7528\u5230\u5b9e\u4f8b\u5bf9\u8c61\uff1a\nif \u6ca1\u6709\u7528\u5230\u7c7b\u5bf9\u8c61\uff1a\n\u5199\u9759\u6001\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @staticmethod\nelse\uff1a\n\u5199\u7c7b\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @classmethod\nelse:\n\u76f4\u63a5\u5199\u5b9e\u4f8b\u65b9\u6cd5\n \u4e3e\u4f8b: class TitleWidget:\ndef click_xxx_by_ui(self):\npass\n@staticmethod\ndef click_xxx_by_ui():\npass\n@classmethod\ndef click_xxx_by_ui(cls):\npass\n \u51fd\u6570\u540d\u79f0\u4e0d\u51fa\u73b0\u6570\u5b57\uff0c\u9700\u8981\u8868\u793a\u6570\u91cf\u7684\u7528\u5355\u8bcd\u8868\u793a\u3002 \u51fd\u6570\u529f\u80fd\u6ce8\u91ca\u3002 \u6ca1\u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg2:xxx\n\"\"\"\n \u6709\u53c2\u6570\uff0c\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg1:xxx\nreturn: xxx\n\"\"\"\n \u200b \u7528 Pycharm \u7684\u6ce8\u91ca\u6a21\u677f\u4e5f\u53ef\u4ee5\uff0c\u53ea\u8981\u4f53\u73b0\u4e86\u53c2\u6570\u7684\u7c7b\u578b\u548c\u8fd4\u56de\u5c31\u884c\u4e86\u3002 \u6682\u4e0d\u8981\u6c42\u5199\u7c7b\u578b\u6ce8\u89e3\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#7case","title":"7\u3001\u7528\u4f8b\uff08case\uff09\u89c4\u8303","text":" \u4ee5\u7c7b\u7684\u5f62\u5f0f\u5199\u7528\u4f8b\uff0c\u7528\u4f8b\u7c7b\u96c6\u6210\u7528\u4f8b\u57fa\u7c7b\u3002 \u7528\u4f8b\u7c7b\u9700\u8981\u5199\u6ce8\u91ca\u3002 \u6d4b\u8bd5\u7528\u4f8b\u51fd\u6570\u8bf4\u660e\uff08\u5efa\u8bae\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u540d\u79f0\uff09 \"\"\"\u53f3\u4fa7\u9884\u89c8-\u56fe\u7247\u7c7b\u578b\u4fe1\u606f\u680f\u57fa\u672c\u4fe1\u606f\"\"\"\n \u4e0d\u5199\u8c03\u8bd5\u4ee3\u7801 if __name__ == '__main__':\npytest.main()\n \u6240\u6709\u7528\u4f8b\u90fd\u7ee7\u627f BaseCase\u3002 BaseCase \u91cc\u9762\u653e\u4e00\u4e9b\u6d4b\u8bd5\u6570\u636e\u7684\u5e38\u91cf\uff0c\u6bd4\u5982\u6587\u4ef6\u540d\u79f0\uff0c\u5e94\u7528\u540d\u79f0\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u4e00\u4e9b\u901a\u7528\u7684\u5b57\u7b26\u4e32\u3002 \u8fd9\u7c7b\u662f\u5c5e\u4e8e\u6d4b\u8bd5\u6570\u636e\u3002 class BaseCase(DfmAssert):\n\"\"\"\u7528\u4f8b\u57fa\u7c7b\"\"\"\nNEW_FILE = \"\u65b0\u5efa\u6587\u672c.txt\"\nTEST_FILE = \"test.txt\"\nNEW_DIR = \"\u65b0\u5efa\u6587\u4ef6\u5939\"\nNEW_WORD = \"\u65b0\u5efaWord\u6587\u6863.doc\"\nAPP_HELP = \"damn\"\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\n\"\"\"\u7528\u4f8b\u6807\u9898\uff08\u590d\u5236PMS\u4e0a\u7528\u4f8b\u6807\u9898\uff09\"\"\"\ndfm = DfmWidget()\ndfm.click_xxx_by_attr(self.NEW_FILE)\ndfm.new_file_in_desktop_by_cmd(self.NEW_FILE)\nself.assert_true(dfm.get_process_status(self.APP_NAME))\n \u7528\u4f8b\u91cc\u9762\u5c3d\u91cf\u51cf\u5c11\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\uff0c\u66f4\u8981\u51cf\u5c11\u76f8\u540c\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\u3002 \u7edf\u4e00\u6587\u4ef6\u6ce8\u91ca\u5934\u3002 #!/usr/bin/env python3\n# _*_ coding:utf-8 _*_\n\"\"\"\n:Author:email@uniontech.com\n:Date :${DATE} ${TIME}\n\"\"\"\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#8","title":"8\u3001\u5176\u4ed6\u89c4\u8303","text":" \u65e5\u5fd7\u6253\u5370\u8981\u5728\u65b9\u6cd5\u6700\u524d\u9762\uff0c\u5426\u5219\u4ee3\u7801\u62a5\u9519\u6ca1\u6709\u65e5\u5fd7\u8f93\u51fa\uff0c\u4e0d\u597d\u5b9a\u4f4d\u95ee\u9898\u3002\uff08\u6211\u4eec\u4f1a\u8003\u8651\u7ee7\u7eed\u4f7f\u7528\u62e6\u622a\u5668\u6253\u5370\u65e5\u5fd7\uff09 \u6240\u6709\u7684\u64cd\u4f5c\u90fd\u9700\u8981\u6709\u65e5\u5fd7\uff0c\u5305\u62ec sleep()\uff0c\u6211\u4eec\u4f1a\u91cd\u5199\u4e00\u4e2a\u6709\u65e5\u5fd7\u8f93\u5165\u7684 sleep\u3002 \u4e1a\u52a1\u5c42\u65e5\u5fd7\u7ea7\u522b\u4e3a INFO\u3002 hook \u51fd\u6570\u53ea\u80fd\u5199\u5230\u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u91cc\u9762\u3002 apps \u76ee\u5f55\u4e0b\u7684 conftest.py \u539f\u5219\u4e0a\u4e0d\u4f1a\u65b0\u589e fixture\u3002 \u56fa\u5b9a\u76ee\u5f55\u6216\u5143\u7d20\u63a7\u4ef6\u7684\u64cd\u4f5c\uff0c\u5c06\u64cd\u4f5c\u65b9\u6cd5\u5199\u6b7b\uff0c\u6587\u4ef6\u7c7b\u64cd\u4f5c\u5c06\u6587\u4ef6\u540d\u7559\u53c2\u6570\u3002 \u8def\u5f84\u62fc\u63a5\u89c4\u8303\uff1a \u7cfb\u7edf\u4e2d\u56fa\u5b9a\u76ee\u5f55\uff0c\u8def\u5f84\u62fc\u63a5\u65f6\u4f7f\u7528\u6ce2\u6d6a\u7b26\u53f7\uff0c\u6bd4\u5982\uff1a~/Desktop/\uff0c\u4e0b\u5c42\u4f7f\u7528 os.path.expanduser()\uff0c\u5b83\u53ef\u4ee5\u81ea\u52a8\u8bc6\u522b\u6ce2\u6d6a\u7b26\u53f7\u3002 \u9879\u76ee\u4e0b\u8def\u5f84\u4f7f\u7528\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u8def\u5f84\uff0c\u6bd4\u5982\uff1aConfig.BASE_PATH\uff0c\u56e0\u4e3a\u9879\u76ee\u662f\u53ef\u4ee5\u5728\u4efb\u610f\u8def\u5f84\u8fd0\u884c\u7684\uff0c\u9700\u8981\u52a8\u6001\u62fc\u63a5\u8def\u5f84\u3002 "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848","text":"# =================================================\n# Author : Mikigo\n# Time : 2022/3/16\n# version \uff1a1.0\n# =================================================\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"AT \u5e94\u7528\u5e93\u6539\u9020\u662f\u57fa\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u8fdb\u884c\u7528\u4f8b\u65b9\u6cd5\u548c\u4e1a\u52a1\u903b\u8f91\u7684\u91cd\u65b0\u8bbe\u8ba1\uff0c\u4ee5\u5b9e\u73b0\u5e94\u7528\u5e93\u9ad8\u6548\u7684\u7f16\u5199\u3001\u7ef4\u62a4\u7528\u4f8b\u53ca\u5176\u65b9\u6cd5\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u6587\u4ef6\u7ba1\u7406\u5668\u4ece\u4e1a\u52a1\u590d\u6742\u5ea6\u548c\u7528\u4f8b\u91cf\u6765\u8bb2\uff0c\u5728\u7cfb\u7edf\u6240\u6709\u5e94\u7528\u4e2d\uff0c\u662f\u5f88\u6709\u4ee3\u8868\u6027\u7684\uff0c\u96be\u5ea6\u4e5f\u662f\u6700\u5927\u7684\uff0c\u56e0\u6b64\u6211\u4eec\u9009\u53d6\u6587\u4ef6\u7ba1\u7406\u5668\u4f5c\u4e3a\u5e94\u7528\u5e93\u6539\u9020\u7684\u5b9e\u9a8c\u5e94\u7528\uff0c\u7ed9\u540e\u7eed\u5176\u4ed6\u5e94\u7528\u6539\u9020\u63d0\u4f9b\u5207\u5b9e\u53ef\u884c\u7684\u601d\u8def\u548c\u65b9\u6848\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u5206\u5c42\u8bbe\u8ba1\u56fe","text":"\u6574\u4f53\u4ecd\u7136\u9075\u5faa PO \u8bbe\u8ba1\u7406\u5ff5\uff0c\u6839\u636e\u4e1a\u52a1\u9700\u8981\uff0c\u5c06\u6587\u7ba1\u4e1a\u52a1\u5c42\u8fdb\u884c 3 \u5c42\u5212\u5206\uff1a "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-dde-file-manager # \u5e94\u7528\u4ed3\u5e93\n\u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 test_xxx_001.py\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u00a0\u251c\u2500\u2500 __init__.py\n\u2502 \u00a0\u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u00a0\u251c\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u00a0\u251c\u2500\u2500 base_widget.py # \u65b9\u6cd5\u57fa\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 title_widget.py # title \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 right_view_widget.py # right view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 left_view_widget.py # left view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 pop_widget.py # pop \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 dfm_widget.py # \u65b9\u6cd5\u7684\u7edf\u4e00\u51fa\u53e3\n\u2502 \u00a0\u2514\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 tag # \u7528\u4f8b\u6807\u7b7e\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 xxx.csv # \u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2514\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u57fa\u7c7b","text":" \u7ee7\u627f\u6838\u5fc3\u5c42\u7684\u5404\u4e2a\u6a21\u5757\u7c7b\u3002 \u62bd\u53d6\u64cd\u4f5c\u5c42\u7684\u4e00\u4e9b\u57fa\u7840\u65b9\u6cd5\u3002 \u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u7684\u4e00\u4e9b\u516c\u5171\u65b9\u6cd5\u3002 \u8def\u5f84\u7ec4\u88c5\u65b9\u6cd5\u3002 \u4e00\u4e9b\u4e1a\u52a1\u5c42\u76f8\u5173\u7684\u53d8\u91cf\u3001\u5e38\u91cf\u3001shell\u547d\u4ee4\u3001\u5750\u6807\u3002 \u65b9\u6cd5\u57fa\u7c7b\u7684\u5199\u6cd5\uff1a from src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u64cd\u4f5c\u5c42","text":" \u6a21\u5757\u5212\u5206 \u6309\u7167\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u6587\u7ba1\u4e3b\u754c\u9762\u5206\u4e3a\u4e09\u4e2a\u533a\u57df\uff1a\u6807\u9898\u680f\u3001\u53f3\u8fb9\u89c6\u56fe\u533a\u57df\u3001\u5de6\u8fb9\u89c6\u56fe\u533a\u57df \u5f39\u7a97\uff1a\u8bbe\u7f6e\u754c\u9762\u5f39\u7a97\u3001\u4fdd\u9669\u7bb1\u5f39\u7a97\u3001\u5220\u9664\u786e\u8ba4\u5f39\u7a97\u3001\u53ca\u5404\u79cd\u7f51\u7edc\u5f39\u7a97 \u53f3\u952e\u83dc\u5355\uff1a\u6682\u65f6\u4e0d\u8003\u8651\u4e3a\u5355\u72ec\u7684\u6a21\u5757\uff0c\u8003\u8651\u4ee5\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6848\u505a\u6210\u516c\u5171\u5e93\u3002 \u5404\u4e2a\u6a21\u5757\u53ea\u7ee7\u627f\u57fa\u7c7b from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u6784\u9020\u51fd\u6570\u91cc\u9762\u4e0d\u6784\u9020\u5bf9\u8c61\uff0c\u53ef\u4ee5\u521d\u59cb\u5316\u4e00\u4e9b\u53d8\u91cf\u3002 \u4e0d\u540c\u7684\u5b9a\u4f4d\u65b9\u6848\u8c03\u7528\u4e0d\u540c\u7684\u5b9a\u4f4d\u5de5\u5177\u5bf9\u8c61\u3002 self.dog\nself.ui\nself.d_bus\n \u65b9\u6cd5\u7f16\u5199 \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u5e94\u7528\u5c42","text":" \u7ee7\u627f\u64cd\u4f5c\u5c42\u7684\u6240\u6709\u7c7b\u3002 \u4ec5\u4ec5\u7528\u4e8e\u7528\u4f8b\u4e2d\u5bfc\u5165\u65b9\u4fbf\uff0c\u4e0d\u505a\u5176\u4ed6\u4e8b\u60c5\u3002 class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n DfmAssert \u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u7ee7\u627f\uff0c\u65b9\u4fbf\u4f7f\u7528\u65ad\u8a00\u8bed\u53e5\u3002 from apps.dde_file_manager.widget.dfm_widget import DfmWidget\nfrom public.assert import Assert\nclass DfmAssert(Assert):\ndef assert_file_exists_in_desktop(self, file_name):\nself.assert_file_exists(f\"~/Desktop{file_name}\")\n...\nDfmWidget().get_file_in_desktop()\n \u7528\u4f8b\u91cc\u9762\u76f4\u63a5\u7ee7\u627f\uff0c\u65b9\u4fbf\u5728\u7528\u4f8b\u91cc\u9762\u4f7f\u7528 self \u8fdb\u884c\u65ad\u8a00\uff0c\u66f4\u7b26\u5408\u65ad\u8a00\u7684\u4f7f\u7528\u4e60\u60ef\uff0c\u7528\u4f8b\u903b\u8f91\u4e0a\u66f4\u6e05\u695a\u3002 class BaseCase(DfmAssert):\npass\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\nself.assert_file_exists_in_desktop(\"xxx\")\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u903b\u8f91\u4e3e\u4f8b","text":"\u7528\u4f8b\u4ee3\u7801\u8c03\u7528\u903b\u8f91\u4e3e\u4f8b\uff1a # BaseWidget\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n# =============================================\n# TitleWidget\nclass TitleWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_title_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# RightViewWidget\nclass RightViewWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_right_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# =============================================\n# \u51fa\u53e3 DfmWidget\nclass DfmWidget(TitleWidget, RightViewWidget):\npass\n# =============================================\n# in case\nfrom apps.dde_file_manager.widget.dfm_widget import DfmWidget\ndfm = DfmWidget()\ndfm.click_xxx_title_by_ui()\ndfm.click_xxx_right_by_ui()\ndfm.dog.print_desc()\ndfm.ui.print_number()\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u5de5\u7a0b\u6539\u9020\u5b9e\u65bd\u6b65\u9aa4","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_2","title":"1\u3001\u5de5\u7a0b\u4ee3\u7801\u62c9\u53d6","text":"1.1. \u5c06\u81ea\u52a8\u5316\u57fa\u7840\u6846\u67b6\u7684\u529f\u80fd\u62c9\u5230\u672c\u5730 Autotest Basic Frame \uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame 1.2. \u5c06\u5e94\u7528\u5e93\u4ee3\u7801\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u5e94\u7528\u5e93\u7684\u4ed3\u5e93\u547d\u540d\u5e94\u8be5\u662f\u957f\u8fd9\u6837\u7684 autotest_deepin_xxx\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_2","title":"2\u3001\u8c03\u6574\u5de5\u7a0b\u76ee\u5f55","text":"\u6309\u7167 \u65b9\u6848\u8bbe\u8ba1-\u76ee\u5f55\u7ed3\u6784 \u8fdb\u884c\u76ee\u5f55\u8c03\u6574\uff0c\u5c3d\u91cf\u4f7f\u7528\u7f16\u8f91\u5668\u8fdb\u884c\u76f8\u5e94\u7684\u8c03\u6574\uff0c\u7f16\u8f91\u5668\u63a8\u8350\u4f7f\u7528 Pycharm \uff0c\u4ee5\u4e0b\u64cd\u4f5c\u5747\u5728 Pycharm \u91cc\u9762\u53ef\u5b9e\u73b0\u3002 2.1. \u9700\u8981\u79fb\u52a8 py \u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u76f4\u63a5\u5728\u7f16\u8f91\u5668\u91cc\u9762\uff0c\u4f7f\u7528\u9f20\u6807\u9009\u4e2d\u5e76\u6309\u4f4f\uff0c\u4e4b\u540e\u62d6\u52a8\u5230\u76ee\u6807\u4f4d\u7f6e\u5373\u53ef\uff0cPycharm \u4f1a\u5c3d\u53ef\u80fd\u7684\u81ea\u52a8\u89e3\u51b3\u79fb\u52a8\u5bfc\u81f4\u7684\u8def\u5f84\u95ee\u9898\u3002\u6ce8\u610f\uff0c\u6211\u8bf4\u7684\u662f\u201c\u5c3d\u53ef\u80fd\u201d\uff0c\u6709\u4e9b\u9a9a\u64cd\u4f5c\u7f16\u8f91\u5668\u662f\u65e0\u6cd5\u81ea\u52a8\u5904\u7406\u7684\u3002\u5982\u679c\u6ca1\u6709\u88ab\u7f16\u8f91\u5668\u81ea\u52a8\u5904\u7406\u7684\u8def\u5f84\u95ee\u9898\uff0c\u540e\u7eed\u53ea\u80fd\u624b\u52a8\u89e3\u51b3\u3002 2.2. \u9700\u8981\u91cd\u547d\u540d\u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u5728\u7f16\u8f91\u5668\u91cc\u9762\u9009\u4e2d\u6587\u4ef6\uff0c\u7136\u540e\u4f7f\u7528\u5feb\u6377\u952e Shift + F6 \uff08\u5982\u679c\u5feb\u6377\u952e\u6ca1\u53cd\u5e94\uff0c\u6587\u4ef6\u53f3\u952e\u83dc\u5355 Refactor \u2014\u2014 Rename\uff09\uff0c\u7136\u540e\u5728\u8f93\u5165\u6846\u4e2d\u8f93\u5165\u8981\u91cd\u547d\u540d\u7684\u540d\u79f0\uff0c\u540c\u65f6\uff0c\u786e\u8ba4\u52fe\u9009 Search for references \u548c Search in comments and strings \u8fd9\u4e24\u4e2a\u9009\u9879\uff0c\u6700\u540e\u6309\u56de\u8f66\u6216\u8005\u9f20\u6807\u70b9 Refactor \u3002 \u6ce8\u610f\uff0c\u6b64\u65f6\u7f16\u8f91\u5668\u53ef\u80fd\u4f1a\u63d0\u793a\u4f60\uff0c\u4f60\u8fd9\u4e2a\u91cd\u547d\u540d\u7684\u64cd\u4f5c\u5173\u8054\u4e86\u591a\u4e2a\u6a21\u5757\uff0c\u5b83\u88ab\u591a\u4e2a\u5730\u65b9\u90fd\u4f7f\u7528\u5230\u4e86\uff0c\u76f8\u5173\u7684\u6a21\u5757\u662f\u5426\u4e5f\u4e00\u8d77\u6539\u540d\u4e86\uff0c\u8fd9\u4e0d\u5e9f\u8bdd\u5417\uff0c\u7528\u8fd9\u4e2a\u529f\u80fd\u5c31\u662f\u60f3\u628a\u5173\u8054\u5230\u7684\u90fd\u4fee\u6539\uff0c\u4e0d\u7136\u6211\u4e3a\u4ec0\u4e48\u4e0d\u7528\u6587\u7ba1\u7684\u91cd\u547d\u540d\u529f\u80fd\u5462\uff0c\u522b\u60f3\u4e86\uff0c\u76f4\u63a5\u70b9\u5de6\u4e0b\u89d2\u7684 Refactor \u6309\u94ae\uff0c\u5c31\u662f\u5e72\u3002 \u7c7b\u540d\u3001\u51fd\u6570\u540d\u7684\u91cd\u547d\u540d\u90fd\u5c3d\u91cf\u91c7\u7528\u8fd9\u79cd\u65b9\u6848\uff0c\u56e0\u4e3a\u7f16\u8f91\u5668\u4f1a\u81ea\u52a8\u7ed9\u6211\u4eec\u627e\u5230\u5173\u8054\u7684\u5730\u65b9\uff0c\u7136\u540e\u540c\u6b65\u4fee\u6539\u6389\u3002\u4f60\u53ef\u5343\u4e07\u522b\u76f4\u63a5\u5220\u4e86\u4fee\u6539\u540d\u79f0\uff0c\u4e0d\u7136\u4f60\u53ef\u80fd\u4f1a\u82b1\u4e0a\u4e00\u5929\u7684\u65f6\u95f4\u6765\u89e3\u51b3\u91cd\u547d\u540d\u7684\u95ee\u9898\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u5b9e\u73b0\u6838\u5fc3\u5e93\u63a5\u53e3","text":"3.1. BaseWidget \u5728 BaseWidget \u91cc\u9762\u628a\u8be5\u5199\u7684\u90fd\u5199\u597d\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u4e0a\u9762\u7684\u8bbe\u8ba1\u7406\u5ff5\u6765\u5199\u3002 \u5982\u679c\u4f60\u5acc\u9ebb\u70e6\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u6587\u7ba1\u7684\u5b9e\u9645\u5de5\u7a0b\u4ee3\u7801 autotest_dde_file_manager : https://gerrit.uniontech.com/admin/repos/autotest_dde_file_manager \u3002 3.2. \u64cd\u4f5c\u5c42 \u5982\u679c\u4f60\u662f\u65b0\u5199\u9879\u76ee\uff0c\u4f60\u4f1a\u53d1\u73b0\u4e00\u5207\u90fd\u662f\u90a3\u4e48\u7684\u7b80\u5355\u3001\u76f4\u63a5\uff0c\u6309\u7167\u6211\u4eec\u63d0\u4f9b\u7ed9\u4f60\u7684\u63a5\u53e3\u5199\u7528\u4f8b\u7684\u64cd\u4f5c\u65b9\u6cd5\u5c31\u597d\u4e86\u3002 \u5982\u679c\u4f60\u662f\u60f3\u5bf9\u539f\u6765\u7684\u5de5\u7a0b\u8fdb\u884c\u6539\u9020\uff0c\u4f60\u9700\u8981\u6309\u7167\u6838\u5fc3\u5e93\u65b9\u6cd5\u7684\u8c03\u7528\uff0c\u5c06\u4f60\u4e4b\u524d\u5199\u7684\u6bcf\u4e2a\u65b9\u6848\u8fdb\u884c\u5bf9\u5e94\u7684\u4fee\u6539\uff0c\u5305\u62ec\u7c7b\u548c\u65b9\u6cd5\u7684\u547d\u540d\u3001\u65b9\u6cd5\u5185\u6240\u8981\u7528\u5230\u4e0d\u540c\u5b9a\u4f4d\u65b9\u6cd5\u7684\u5199\u6cd5\u4fee\u6539\u3002 \u8fd9\u65f6\u5019\u4f60\u53ef\u80fd\u4f60\u7684\u4ee3\u7801\u4e2d\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u62a5\u9519\uff0c\u4e0d\u7528\u62c5\u5fc3\uff0c\u4f60\u53ef\u4ee5\u4ece\u4e1a\u52a1\u903b\u8f91\u51fa\u53d1\uff0c\u60f3\u6e05\u695a\u8fd9\u4e2a\u65b9\u6cd5\u662f\u5e72\u4ec0\u4e48\u7684\u3001\u64cd\u4f5c\u7684\u5bf9\u8c61\u662f\u4ec0\u4e48\u3001\u53c2\u6570\u662f\u4ec0\u4e48\uff0c\u6ce8\u610f\u8fd9\u4e9b\u4fee\u6539\u662f\u4f1a\u5f71\u54cd\u5230\u7528\u4f8b\u4ee3\u7801\u91cc\u9762\u7684\uff0c\u6ca1\u5173\u7cfb\uff0c\u7528\u4f8b\u91cc\u9762\u672c\u6765\u4e5f\u5e94\u8be5\u88ab\u5173\u8054\u4fee\u6539\u3002 3.3. \u628a\u914d\u7f6e\u6a21\u5757\u5199\u597d\uff0c\u8fd9\u90e8\u5206\u57fa\u672c\u53ef\u4ee5\u590d\u5236\u6587\u7ba1\u7684\u4ee3\u7801\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4_1","title":"4\u3001\u8def\u5f84\u5904\u7406","text":"4.1. \u5bfc\u5165\u8def\u5f84 \u65b9\u6cd5\u548c\u7528\u4f8b\u4e2d\u90fd\u4f1a\u6d89\u53ca\u5230\u5bfc\u5165\u8def\u5f84\u7684\u4fee\u6539\uff0c\u5728\u4fee\u6539\u8def\u5f84\u65f6\uff0c\u5efa\u8bae\u4f60\u4f7f\u7528 Ctrl + Shift + R \u5168\u5c40\u66ff\u6362\uff0c\u4f1a\u5c06\u6574\u4e2a\u9879\u76ee\u4e0b\u7684\u76f8\u540c\u5730\u65b9\u90fd\u4fee\u6539\u5230\uff0c\u5f53\u7136\uff0c\u4f60\u4e5f\u53ef\u4ee5\u5728\u5c0f\u5f39\u7a97\u4e2d\u4fee\u6539\u5168\u5c40\u66ff\u6362\u4e3a\u5c40\u90e8\u76ee\u5f55\u4e0b\u66ff\u6362\u3002\u5904\u7406\u90a3\u79cd\u6ca1\u6709\u5173\u8054\u5173\u7cfb\uff0c\u4f46\u662f\u53c8\u662f\u76f8\u540c\u540d\u79f0\u7684\u91cd\u547d\u540d\uff0c\u6211\u4e5f\u63a8\u8350\u4f7f\u7528\u8fd9\u79cd\u65b9\u5f0f\u8fdb\u884c\u91cd\u547d\u540d\u3002 \u6ce8\u610f\uff0c\u5168\u5c40\u66ff\u6362\u7684\u65b9\u5f0f\u4efb\u7136\u65e0\u6cd5\u4fdd\u8bc1\u771f\u7684\u5168\u5c40\u88ab\u66ff\u6362\u4e86\uff08\u53ef\u80fd\u662f\u7f16\u8f91\u5668\u7684 Bug \u5427\uff09\uff0c\u6240\u4ee5\u4f60\u4ecd\u7136\u9700\u8981\u624b\u52a8\u770b\u4e0b\u5404\u5904\u662f\u5426\u4fee\u6539\u5230\u4f4d\u3002 4.2. \u8d44\u6e90\u8def\u5f84 \u4e00\u4e9b\u7528\u4f8b\u8d44\u6e90\u9700\u8981\u6839\u636e config.py \u91cc\u9762\u7684\u8def\u5f84\u914d\u7f6e\u8fdb\u884c\u8d44\u6e90\u8def\u5f84\u7684\u62fc\u63a5\uff0c\u5982\u679c\u4f60\u539f\u6765\u672c\u6765\u5c31\u6709\u4e00\u4e2a\u51fd\u6570\u4e13\u95e8\u7528\u4e8e\u7ec4\u88c5\u8def\u5f84\u7684\uff0c\u90a3\u4f60\u53ea\u9700\u8981\u4fee\u6539\u8fd9\u4e00\u4e2a\u5730\u65b9\u5c31\u597d\u4e86\uff0c\u5982\u679c\u4f60\u4e4b\u524d\u5e76\u6ca1\u6709\u8fd9\u6837\u7684\u8bbe\u8ba1\uff0c\u90a3\u53ef\u80fd\u9700\u8981\u4fee\u6539\u5927\u91cf\u6d89\u53ca\u5230\u8d44\u6e90\u8def\u5f84\u7684\u5730\u65b9\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5","title":"5\u3001\u8c03\u8bd5\u548c\u7f16\u5199\u7528\u4f8b","text":"\u4ee5\u4e0a\u51e0\u4e2a\u6b65\u9aa4\u505a\u5b8c\uff0c\u57fa\u672c\u5c31\u53ef\u4ee5\u8fdb\u884c\u7528\u4f8b\u4ee3\u7801\u7684\u8c03\u8bd5\u4e86\uff0c\u8fd9\u90e8\u5206\u5de5\u4f5c\u4e3b\u8981\u89e3\u51b3\u4f60\u4e4b\u524d\u51e0\u4e2a\u6b65\u9aa4\u9057\u6f0f\u7684\u95ee\u9898\uff0c\u5982\u679c\u6240\u6709\u7528\u4f8b\u90fd\u8c03\u8bd5\u901a\u8fc7\u4e86\uff0c\u90a3\u4e48\u5de5\u7a0b\u6539\u9020\u5c31\u5168\u90e8\u5b8c\u6210\u4e86\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/","title":"AT \u5f00\u53d1\u89c4\u8303","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u5f00\u53d1\u89c4\u8303\u662f\u6839\u636e\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fd0\u884c\u4e24\u5e74\u591a\u6765\uff0c\u9047\u5230\u95ee\u9898\u89e3\u51b3\u95ee\u9898\u800c\u5f62\u6210\u7684\u4e00\u4e9b\u89e3\u51b3\u65b9\u6848\uff0c\u6216\u8005\u8bf4\u7ecf\u9a8c\u603b\u7ed3\uff1b\u8fd9\u4e9b\u7ecf\u9a8c\u7b26\u5408\u6211\u4eec\u73b0\u9636\u6bb5 AT \u6240\u5e94\u7528\u7684\u573a\u666f\u9700\u8981\uff0c\u4e5f\u662f\u6211\u4eec\u7ecf\u8fc7\u957f\u671f\u601d\u8003\uff0c\u4e0d\u65ad\u8bd5\u9519\u4e0d\u65ad\u4fee\u6b63\uff0c\u5e76\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u5b9e\u8df5\u4e2d\u68c0\u9a8c\u8fc7\u53ef\u884c\u7684\u3002\u4ee5\u6b64\uff0c\u5e0c\u671b\u80fd\u5e2e\u52a9\u53c2\u4e0e\u5230\u81ea\u52a8\u5316\u7684\u76f8\u5173\u4eba\u5458\u51cf\u5c11\u8bd5\u9519\u6210\u672c\uff0c\u66f4\u597d\u3001\u66f4\u5feb\u7684\u7f16\u5199\u7528\u4f8b\u53ca\u7ef4\u62a4\u7528\u4f8b\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_1","title":"\u4e00\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u89c4\u8303","text":"\u6807\u7b7e\u5316\u7ba1\u7406\u6587\u6863\u8bf7\u53c2\u8003\uff1a \u300a\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u64cd\u4f5c\u6307\u5f15\u300b \u4ee5\u4e0b\u8bf4\u51e0\u4e2a\u5bb9\u6613\u51fa\u73b0\u7684\u95ee\u9898\uff1a"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1","title":"1. \u5bf9\u5e94\u5173\u7cfb","text":" \u5199\u5b8c\u81ea\u52a8\u5316\u7528\u4f8b\u4e4b\u540e\uff0c\u8bf7\u5728 CSV \u6587\u4ef6\u4e2d\u6807\u8bb0\u7528\u4f8b\u7684 ID\u3001\u7b49\u7ea7\u3002\u4e3a\u4e86\u63d0\u9192\u6807\u8bb0\uff0c\u6267\u884c\u7528\u4f8b\u65f6\u5728\u9996\u884c\u4f1a\u8f93\u51fa ERROR \u65e5\u5fd7\uff1a CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94\u7684 ID\uff1b \u5728\u6700\u7ec8\u63d0\u4ea4\u4ee3\u7801\u4e4b\u524d\uff0c\u4f60\u9700\u8981\u5728 CSV \u6587\u4ef6\u91cc\u9762\u5c06ID\u3001\u7528\u4f8b\u7b49\u7ea7\u7b49\u6807\u7b7e\u8865\u5168\uff0c\u5982\u679c CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94 ID\uff0c\u540e\u7eed\u5728\u6279\u91cf\u6267\u884c\u7684\u65f6\u5019\uff0c\u8fd9\u4e9b\u7528\u4f8b\u662f\u4e0d\u4f1a\u6267\u884c\u7684\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2","title":"2. \u540d\u79f0\u4e00\u81f4","text":" CSV \u6587\u4ef6\u7684\u6587\u4ef6\u540d\u3001\u7528\u4f8b\u51fd\u6570\u4e2d\u95f4\u7684\u540d\u79f0\u4e00\u81f4\u3001\u7528\u4f8b py \u6587\u4ef6\u4e2d\u95f4\u7684\u540d\u79f0\uff0c\u8fd9\u4e09\u4e2a\u540d\u79f0\u4e00\u81f4\u3002 \u4e3e\u4f8b\uff1a # test_music_001.py\ndef test_music_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u90a3\u4e48 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e3a music.csv\u3002 AT \u6846\u67b6\u5e95\u5c42\u4ee3\u7801\u5b9e\u73b0\u662f\u5c06 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e0e\u7528\u4f8b\u51fd\u6570\u540d\u79f0\u540d\u79f0\uff08item.name\uff09\u8fdb\u884c\u5bf9\u5e94\uff0c\u56e0\u6b64\uff0c\u6ce8\u610f CSV \u6587\u4ef6\u540d\u79f0\u5bf9\u5e94\u7684\u662f\u7528\u4f8b\u51fd\u6570\u540d\u79f0\uff0c\u5373 def test_music_001 \u91cc\u9762\u7684 music \uff0c\u800c\u4e0d\u662f test_music_001.py \u91cc\u9762\u7684 music \u3002 \u8fd9\u91cc\u7ec6\u7ec6\u54c1\u4e00\u4e0b\u54c8~ \u5982\u679c\u4f60\u5c06\u4e0a\u4f8b\u5199\u6210\u4e86\u8fd9\u6837: # test_music_001.py\ndef test_movie_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u7528\u4f8b\u6267\u884c\u6ca1\u95ee\u9898\uff0c\u4f46\u662f\u6807\u7b7e\u5316\u7ba1\u7406\u662f\u4e0d\u751f\u6548\u7684\uff0c\u6846\u67b6\u65e0\u6cd5\u5c06 music.csv\u6587\u4ef6\u91cc\u9762\u6807\u7b7e\uff0c\u6dfb\u52a0\u5230 test_movie_001\u8fd9\u4e2a\u7528\u4f8b\u4e2d\uff0c\u56e0\u4e3a\u4ed6\u4eec\u6ca1\u6709\u5bf9\u5e94\u5173\u7cfb\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#tag","title":"\u4e8c\u3001\u5206\u652f\u53ca tag \u7ba1\u7406\u89c4\u8303","text":"\u53c2\u8003\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u4ee3\u7801\u7ba1\u7406\u89c4\u8303\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2-tag","title":"2. \u5e94\u7528\u5e93 tag","text":" \u5e94\u7528\u5e93 tag \u6839\u636e\u5e94\u7528\u4ea4\u4ed8\u8282\u70b9\u751f\u6210\uff0c\u6bcf\u6b21\u6253 tag \u4e4b\u524d\uff0c\u76f8\u5173\u6d4b\u8bd5\u4eba\u5458\u9700\u8981\u8fdb\u884c\u7528\u4f8b\u8c03\u8bd5\uff1b \u8c03\u8bd5\u7528\u4f8b\u662f\u6307\u7684\u5728\u5168\u67b6\u6784\uff08x86\u3001arm\u3001mips\uff09\u4e0a\u8c03\u8bd5\u901a\u8fc7\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\u8fbe\u5230 90% \u4ee5\u4e0a\u624d\u80fd\u6253 tag\uff0c\u901a\u8fc7 Jenkins \u6267\u884c\u5668\u6267\u884c\u7528\u4f8b\uff0c\u4fdd\u7559\u901a\u8fc7\u7387\u7ed3\u679c\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\uff1a\u901a\u8fc7\u7528\u4f8b\u6570 / (\u603b\u7528\u4f8b\u6570 - \u5df2\u5e9f\u5f03\u7528\u4f8b) \u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u7b97\u901a\u8fc7 Jenkins \u6267\u884c\u5668 \u4f60\u53ef\u80fd\u4f1a\u5728\u4e00\u4e2a\u4ea4\u4ed8\u5468\u671f\u5185\u6301\u7eed\u7684\u8fdb\u884cAT\u7528\u4f8b\u8c03\u8bd5\uff0c\u4f46\u662f\u6700\u7ec8 AT \u7528\u4f8b\u6253 tag \u7684\u5e94\u7528\u7248\u672c\uff0c\u9700\u8981\u4f7f\u7528\u5e94\u7528\u96c6\u6210\u4ea4\u4ed8\u7684\u6700\u65b0\u5e94\u7528\u7248\u672c\uff0c\u53ef\u4ee5\u4f7f\u7528\u5e94\u7528\u7684\u63d0\u6d4b\u7248\u672c\uff1b\u4e00\u5b9a\u8981\u786e\u4fdd\u8c03\u8bd5\u7528\u4f8b\u7684\u5e94\u7528\u7248\u672c\u662f\u6700\u65b0\u7684\uff0c\u4e0d\u7136\u96c6\u6210\u8fdb\u53bb\u4e4b\u540e\uff0c\u6301\u7eed\u96c6\u6210\u5c31\u4f1a\u51fa\u95ee\u9898\uff1b tag \u53f7\u600e\u4e48\u6253\uff1f \u6839\u636e\u6301\u7eed\u96c6\u6210\u7684\u8981\u6c42\u751f\u6210\uff0c\u5176\u4e2d\u5e94\u7528\u7248\u672c\u53f7\u9700\u8981\u4e0e\u9879\u76ee\u7ecf\u7406\u786e\u8ba4\u672c\u6b21\u5373\u5c06\u96c6\u6210\u7684\u5e94\u7528\u7248\u672c\u53f7\u662f\u591a\u5c11\uff1b tag \u7684 commit \u4fe1\u606f\u683c\u5f0f\uff1a # commit msg\nversion:5.6.5\n \u5176\u4e2d 5.6.5 \u5199\u5e94\u7528\u7684\u96c6\u6210\u7248\u672c\u53f7\u3002 \u751f\u6210 tag \u7684\u547d\u4ee4\u53c2\u8003\uff1a\u300aGit \u6807\u7b7e\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3-tag","title":"3. \u57fa\u7840\u6846\u67b6 tag","text":"\u57fa\u7840\u6846\u67b6 tag \u4e0d\u4e0e\u4e1a\u52a1\u6302\u94a9\uff0c\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u6309\u9700\u53d1\u5e03\u7248\u672c\uff0c\u5728\u6839\u76ee\u5f55\u4e0b CURRENT \u6587\u4ef6\u4e2d\u8bb0\u5f55\u7684\u5f53\u524d\u7248\u672c\u53f7\u548c\u5386\u53f2\u7248\u672c\u53f7\uff0c\u53ca\u5176\u5bf9\u5e94\u65b0\u589e\u4e86\u54ea\u4e9b\u529f\u80fd\uff0c\u6709\u52a9\u4e8e\u5e94\u7528\u9009\u62e9\u5408\u9002\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\u3002 # CURRENT\n[current]\ntag = 0.9.5\n \u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u7684 control \u6587\u4ef6\u8bb0\u5f55\u5f53\u524d\u5e94\u7528\u5e93\u4f9d\u8d56\u7684\u57fa\u7840\u5e93\u7248\u672c\u3002 # control\n[Depends]\nautotest-basic-frame = 0.9.5\n \u7528\u4f8b\u5728\u6267\u884c\u65f6\u4f1a\u6821\u9a8c\u4e24\u4e2a\u6587\u4ef6\u7684\u7248\u672c\u53f7\u662f\u5426\u4e00\u81f4\uff0c\u5982\u679c\u4e0d\u4e00\u81f4\uff0c\u4f1a\u6253\u5370 error \u65e5\u5fd7\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_2","title":"\u4e09\u3001\u4ed3\u5e93\u6743\u9650\u7ba1\u7406","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_1","title":"1. \u57fa\u7840\u6846\u67b6","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u4ed3\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame \u57fa\u7840\u6846\u67b6\u4e0d\u5141\u8bb8\u533f\u540d\u8bbf\u95ee\uff0c\u5982\u679c\u4f60\u767b\u5f55 gerrit \u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u8bbf\u95ee\u4ee5\u4e0a\u94fe\u63a5\uff0c\u5219\u9700\u8981\u7533\u8bf7\u8bbf\u95ee\u6743\u9650\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_1","title":"2. \u5e94\u7528\u4ed3\u5e93","text":" \u81ea\u52a8\u5316\u5e94\u7528\u4ed3\u5e93\uff1a https://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684 app_name \u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_3","title":"\u56db\u3001\u65b9\u6cd5\u7f16\u5199&\u8c03\u7528\u89c4\u8303","text":"\u65b9\u6cd5\u7f16\u5199\u6574\u4f53\u8bbe\u8ba1\u601d\u8def\u53c2\u8003\uff1a[\u300aAT\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b]"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_2","title":"1. \u65b9\u6cd5\u7f16\u5199","text":"\u5199\u65b9\u6cd5\u7684\u65f6\u5019\u6ce8\u610f\u65b9\u6cd5\u5f52\u5c5e\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget\uff0c\u65b9\u6cd5\u662f\u5728\u54ea\u4e2a\u533a\u57df\u64cd\u4f5c\u7684\uff0c\u5c31\u5199\u5728\u54ea\u4e2a\u7c7b\u91cc\u9762\u3002 \u4e3e\u4f8b\uff1a from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n\"\"\"\u70b9\u51fb\u6807\u9898\u680fxxx\"\"\"\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_2","title":"2. \u65b9\u6cd5\u8c03\u7528","text":" \u5728\u7528\u4f8b\u4e2d\u8c03\u7528\u65b9\u6cd5\uff0c\u901a\u8fc7\u8be5\u5e94\u7528\u552f\u4e00\u7684\u51fa\u53e3\u8fdb\u884c\u8c03\u7528\uff0c\u6bd4\u5982\u6587\u7ba1\uff1a class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n \u4e0d\u8981\u5728\u7528\u4f8b\u4e2d\u5355\u72ec\u53bb\u8c03\u7528 TitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u8fd9\u4e9b\u7c7b\uff0c\u5426\u5219\u540e\u671f\u7528\u4f8b\u4f1a\u53d8\u5f97\u4e0d\u597d\u7ef4\u62a4\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_4","title":"\u4e94\u3001\u7528\u4f8b\u7f16\u5199\u89c4\u8303","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_3","title":"1. \u57fa\u4e8e\u7c7b\u5199\u7528\u4f8b","text":"\u6240\u6709\u7528\u4f8b\u90fd\u5e94\u8be5\u57fa\u4e8e\u7c7b\u53bb\u5199\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001(self):\n\"\"\"\u97f3\u4e50\u542f\u52a8\"\"\"\n \u6ce8\u610f\u4ee5\u4e0b\u51e0\u70b9\uff1a \u7c7b\u540d\u4e0d\u8981\u968f\u4fbf\u53d6\uff0c\u540c\u4e00\u4e2a\u5e94\u7528\u5e94\u8be5\u4f7f\u7528\u540c\u4e00\u4e2a\u7c7b\u540d\uff0c\u7528\u4f8b\u7c7b\u540d\u79f0\u5fc5\u987b\u4ee5 Test \u5f00\u5934\uff0c\u9075\u5faa\u5927\u9a7c\u5cf0\u547d\u540d\u89c4\u8303\uff1b \u7528\u4f8b\u7c7b\u7ee7\u627f BaseCase\uff0c\u4e00\u4e2a\u5e94\u7528\u53ea\u6709\u4e00\u4e2a BaseCase \u4e00\u4e2a py \u6587\u4ef6\u91cc\u9762\u53ea\u6709\u4e00\u4e2a\u7c7b\uff0c\u6211\u4eec\u79f0\u4e3a\u4e00\u4e2a\u6d4b\u8bd5\u7c7b\uff1b \u4e00\u4e2a\u7c7b\u91cc\u9762\u53ef\u4ee5\u6709\u591a\u4e2a\u7528\u4f8b\u51fd\u6570\uff0c\u8fd9\u53d6\u51b3\u8fd9\u6761\u7528\u4f8b\u6709\u591a\u5c11\u4e2a\u6d4b\u8bd5\u70b9\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001_1(self):\n\"\"\"\u4efb\u52a1\u680f\u542f\u52a8\u97f3\u4e50\"\"\"\ndef test_music_001_2(self):\n\"\"\"\u542f\u52a8\u5668\u542f\u52a8\u97f3\u4e50\"\"\" \ndef test_music_001_3(self):\n\"\"\"\u684c\u9762\u542f\u52a8\u97f3\u4e50\"\"\"\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_3","title":"2. \u7528\u4f8b\u51fd\u6570\u89c4\u8303","text":" \u7528\u4f8b\u51fd\u6570\u4ee5 test \u5f00\u5934\uff0c\u9075\u5faa\u86c7\u5f62\u547d\u540d\u89c4\u8303\uff0c\u4e2d\u95f4\u4e3a\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0\uff0c\u540e\u9762\u52a0\u7528\u4f8b ID\uff0c\u6700\u540e\u52a0\u6d4b\u8bd5\u70b9\u5e8f\u53f7\uff0c\u5373 test_${module}_${case_id}[_${index}] \uff1b \u6bd4\u5982\uff1atest_music_001_1\uff0cindex \u4ece 1 \u5f00\u59cb\u3002 \u51fd\u6570\u529f\u80fd\u8bf4\u660e\u91cc\u9762\u5199\u7528\u4f8b\u6807\u9898\uff0c\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u6807\u9898\u5373\u53ef\uff0c\u6ce8\u610f\u7528\u4e09\u5bf9\u53cc\u5f15\u53f7\uff0c\u4e0d\u8981\u7528\u5176\u4ed6\u6ce8\u91ca\uff0c\u66f4\u4e0d\u8981\u7528\u4e95\u53f7\u6ce8\u91ca\u5199\u7528\u4f8b\u6807\u9898\uff1b \u76f4\u63a5\u590d\u5236 PMS \u7528\u4f8b \u7528\u4f8b\u6b65\u9aa4\u76f4\u63a5\u5c06 PMS \u4e0a\u7528\u4f8b\u6b65\u9aa4\u548c\u9884\u671f\u590d\u5236\u8fdb\u6765\uff0c\u7136\u540e\u8fdb\u884c\u6279\u91cf\u6ce8\u91ca\uff08ctrl + /\uff09\uff0c\u5728\u6ce8\u91ca\u7684\u57fa\u7840\u4e0a\u53bb\u5199\u7528\u4f8b\u811a\u672c\u4f1a\u66f4\u52a0\u65b9\u4fbf\u5168\u9762\uff0c\u4e5f\u6bd4\u4f60\u81ea\u5df1\u5199\u6ce8\u91ca\u66f4\u8282\u7ea6\u65f6\u95f4\uff1a \u4e3e\u4f8b\uff0cPMS \u7528\u4f8b\uff1a \u76f4\u63a5\u9009\u4e2d\u7528\u4f8b\u5185\u5bb9\uff0c\u590d\u5236\u4e0b\u6765\uff0c\u7136\u540e\u7c98\u8d34\u5230\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c\u4e2d\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\n \u4e0a\u4f8b\u4e2d\u4e95\u53f7\u6ce8\u91ca\u90e8\u5206\u5c31\u662f\u76f4\u63a5\u4ece PMS \u4e0a\u590d\u5236\u8fc7\u6765\u7684\uff0c\u5728\u6b64\u57fa\u7840\u4e0a\u5199\u7528\u4f8b\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\nmusic = DeepinMusicWidget()\nmusic.click_singer_btn_in_music_by_ui()\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\nmusic.click_icon_mode_in_music_by_ui()\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\nmusic.double_click_first_singer_in_singer_icon_view_by_ui()\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\nself.assert_xxx\n \u4f60\u770b\uff0c\u975e\u5e38\u6e05\u695a\u6bcf\u4e00\u6b65\u5728\u505a\u4ec0\u4e48\uff0c\u91cd\u70b9\u662f\u7701\u53bb\u4e86\u5199\u6ce8\u91ca\u7684\u65f6\u95f4\uff0c\u771f\u7684\u7092\u9e21\u65b9\u4fbf\u3002 \u4e0d\u5199 if __name__ == '__main__':\uff0c\u4e0d\u5199\u591a\u4f59\u7684\u4ee3\u7801\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3","title":"3. \u6570\u636e\u9a71\u52a8","text":" \u5982\u679c\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u662f\u76f8\u540c\u7684\uff0c\u53ea\u662f\u4e00\u4e9b\u53c2\u6570\u53d8\u5316\uff0c\u5c3d\u91cf\u4f7f\u7528\u6570\u636e\u9a71\u52a8\u6765\u5b9e\u73b0\u7528\u4f8b\uff1b \u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u6570\u636e\u9a71\u52a8\u7684\u6570\u636e\uff0c\u4e0d\u80fd\u56e0\u6b64\u5f15\u5165\u4f9d\u8d56\uff0c\u5c3d\u91cf\u4f7f\u7528\u4e00\u4e9b\u6807\u51c6\u5e93\u80fd\u8bfb\u53d6\u7684\u6587\u4ef6\u683c\u5f0f\uff0c\u6bd4\u5982 json\u3001ini\u3001CSV\u3001xml\u3001txt \u7b49\u6587\u4ef6\u683c\u5f0f\uff1b\u4e0d\u5efa\u8bae\u4f7f\u7528 Yaml\u3001Excel\u3001MySQL \u7b49\u6570\u636e\u683c\u5f0f\uff1b \u8bfb\u53d6\u6570\u636e\u65f6\u4e5f\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff0c\u5982\u4f7f\u7528 pandas \u5904\u7406 CSV \u5c31\u5c5e\u4e8e\u5927\u6750\u5c0f\u7528\u4e86\uff0c\u6b63\u5e38\u7684\u6570\u636e\u9a71\u52a8\u8fd8\u6ca1\u5230\u9700\u8981\u5927\u6570\u636e\u5206\u6790\u6765\u5904\u7406\u7684\u5730\u6b65\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u5728 widget/ddt/ \u76ee\u5f55\u4e0b\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5199\u6cd5\uff1a @pytest.mark.parametrize(\"value\", data)\ndef test_smb_049(self, value):\n \u4ee5\u4e0a\u8fd9\u79cd\u53c2\u6570\u5316\u7684\u5199\u6cd5\u672c\u8eab\u6ca1\u4ec0\u4e48\u95ee\u9898\uff0c\u4f46\u662f\uff0c\u8fd9\u91cc\u5fc5\u987b\u8981\u8865\u5145\u4e00\u4e2a\u6ca1\u6709\u7528\u7684\u5c0f\u77e5\u8bc6\uff1a \u5982\u679c\u53c2\u6570\u5316\u6570\u636e\u91cc\u9762\u7684\u5b57\u7b26\u4f1a\u539f\u5c01\u4e0d\u52a8\u7684\u8f93\u51fa\u5230 item.name \u91cc\u9762\uff0c\u663e\u793a\u975e\u5e38\u4e0d\u4f18\u96c5\uff0c\u800c\u4e14\u53ef\u4ee5\u4f1a\u5f15\u5165\u4e00\u4e9b\u610f\u60f3\u4e0d\u5230\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u611f\u53d7\u4e00\u4e0b\uff1a \u53c2\u6570\uff1a data = [\n\"\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\", \"qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678\",\n]\n \u73b0\u8c61\u662f\u8fd9\u6837\u8272\u513f\u7684\uff1a test_smb_049.py::TestFileManager::test_smb_049[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09]\ntest_smb_049.py::TestFileManager::test_smb_049[qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui]\ntest_smb_049.py::TestFileManager::test_smb_049[12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678]\n \u8bf4\u5b9e\u8bdd\uff0c\u770b\u7740\u5fc3\u91cc\u5835\u5f97\u614c\uff0c\u5982\u679c\u8fd9\u91cc\u9762\u5305\u542b\u4e00\u4e9b\u7279\u6b8a\u5b57\u7b26\u6216\u8005\u662f\u8d85\u957f\uff0c\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u5f88\u5947\u5999\u7684\u4e8b\u60c5\u53d1\u751f\u3002 parametrize \u91cc\u9762\u6709\u4e2a\u53c2\u6570\uff1aids\uff0c\u53ef\u4ee5\u89e3\u51b3\u6b64\u7c7b\u95ee\u9898\uff0c\u5c31\u50cf\u8fd9\u6837\uff1a @pytest.mark.parametrize(\"value\", data, ids=[1, 2, 3])\ndef test_smb_049(self, value):\n \u518d\u6765\u611f\u53d7\u4e00\u4e0b\uff1a test_smb_049.py::TestFileManager::test_smb_049[1]\ntest_smb_049.py::TestFileManager::test_smb_049[2]\ntest_smb_049.py::TestFileManager::test_smb_049[3]\n \u660e\u663e\u597d\u591a\u4e86\uff0c\u6240\u4ee5\u5c3d\u91cf\u4f7f\u7528 ids \u8fd9\u4e2a\u53c2\u6570\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 fixture \u7684\u6570\u636e\u9a71\u52a8\u65b9\u5f0f\uff0c\u6846\u67b6\u867d\u7136\u652f\u6301\uff0c\u4f46\u53ef\u8bfb\u6027\u6bd4\u8f83\u5dee\uff1b\u5982\u679c\u4f60\u4e0d\u77e5\u9053\u8fd9\u53e5\u8bdd\u5728\u8bf4\u5565\uff0c\u90a3\u4f60\u53ef\u4ee5\u5ffd\u7565\uff0c\u6211\u4e5f\u4e0d\u6253\u7b97\u8be6\u7ec6\u8bf4\u8fd9\u79cd\u5b9e\u73b0\u65b9\u5f0f\uff0c\u64cd\u4f5c\u6bd4\u8f83\u9a9a\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4","title":"4. \u65ad\u8a00\u8d44\u6e90","text":" \u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u76f4\u63a5\u653e\u5728\u7528\u4f8b\u6a21\u5757\u7684\u540c\u7ea7\u76ee\u5f55\u4e0b\u7684 assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0 + \u7528\u4f8b ID \u547d\u540d\uff1b \u56fe\u50cf\u8bc6\u522b\u65ad\u8a00\uff0c\u4e0d\u8981\u622a\u53d6\u4e00\u5f20\u5f88\u5927\u7684\u56fe\uff0c\u56fe\u7247\u8d44\u6e90\u5305\u542b\u7684\u5143\u7d20\u592a\u591a\u4e86\uff0c\u975e\u5e38\u5bb9\u6613\u53d7\u5230\u9700\u6c42\u5f71\u54cd\uff0c\u5efa\u8bae\u662f\u8fdb\u884c\u5c40\u90e8\u7684\u65ad\u8a00\uff1b \u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u5339\u914d\u5ea6\u662f 0.9\uff0c\u5982\u679c\u65ad\u8a00\u7684\u573a\u666f\u5bf9\u4e8e\u7cbe\u786e\u5ea6\u8981\u6c42\u6ca1\u90a3\u4e48\u9ad8\uff0c\u53ef\u4ee5\u5728\u65ad\u8a00\u8bed\u53e5\u91cc\u9762\u4f20\u5165\u5c0f\u4e8e 0.9 \u7684\u53c2\u6570\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5","title":"5. \u5143\u7d20\u5b9a\u4f4d","text":" \u7528\u4e8e\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u4e2d\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u547d\u540d\u4e3a\u8be5\u5143\u7d20\u7684\u540d\u79f0\uff1b \u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u622a\u53d6\u65f6\u5c3d\u91cf\u7cbe\u786e\u5230\u8fd9\u4e2a\u5177\u4f53\u7684\u6309\u94ae\uff0c\u56fe\u7247\u4e5f\u4e0d\u8981\u592a\u5927\uff1b \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u64cd\u4f5c\u8f83\u5feb\uff0c\u5408\u7406\u52a0\u5165\u7b49\u5f85\u65f6\u95f4\u80fd\u63d0\u9ad8\u7528\u4f8b\u7684\u7a33\u5b9a\u6027\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6","title":"6. \u7528\u4f8b\u8d44\u6e90","text":" \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u4f7f\u7528\u5230\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u6bd4\u5982\u97f3\u4e50\u53ef\u80fd\u9700\u8981\u4e00\u4e9b mp3 \u7684\u8d44\u6e90\u7528\u4e8e\u6d4b\u8bd5\uff0c\u5b58\u653e\u5728 widget/case_res \u76ee\u5f55\u4e0b\uff0c\u524d\u63d0\u662f\u8fd9\u4e9b\u8d44\u6e90\u4e0d\u8d85\u8fc7 10M\uff1b \u5982\u679c\u662f\u4e00\u4e9b\u6bd4\u8f83\u5927\u7684\u8d44\u6e90\uff0c\u5efa\u8bae\u653e\u5230\u7edf\u4e00\u7684 ftp \u670d\u52a1\u5668 \uff08ftp://10.8.10.245\uff09\uff0c\u9700\u8981\u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\u518d\u4e0b\u8f7d\u4e0b\u6765\uff1b f\"wget ftp://{Config.FTP_IP}/uploads/\u591a\u5a92\u4f53/\u5f71\u9662/auto/{file_name};unzip {file_name};rm -rf {file_name};\"\n \u6d4b\u8bd5\u8d44\u6e90\u4e0b\u8f7d\u5230\u5e94\u7528 widget/case_res \u76ee\u5f55\u4e0b\uff1b \u7981\u6b62\u5c06\u6d4b\u8bd5\u8d44\u6e90\u5b58\u653e\u5728\u4e2a\u4eba\u7684\u673a\u5668\u4e0a\uff1b \u5e94\u8be5\u5c3d\u91cf\u4fdd\u8bc1\uff0c\u4e00\u4e2a\u8d44\u6e90\u5728\u4e00\u6b21\u7528\u4f8b\u6267\u884c\u4e2d\u53ea\u9700\u8981\u4e0b\u8f7d\u4e00\u6b21\uff0c\u6240\u4ee5\u4f60\u4e0d\u80fd\u6bcf\u6b21\u4f7f\u7528\u7684\u65f6\u5019\u90fd\u53bb\u4e0b\u8f7d\uff0c\u8fd9\u6837\u53ef\u80fd\u4f1a\u8017\u8d39\u5927\u91cf\u7684\u7f51\u7edc\u8d44\u6e90\uff0c\u800c\u56e0\u4e3a\u5148\u5224\u65ad\u672c\u5730\u662f\u5426\u5b58\u5728\u6b64\u8d44\u6e90\uff0c\u5982\u679c\u4e0d\u5b58\u5728\u518d\u53bb\u4e0b\u8f7d\uff1b \u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u5c06\u8d44\u6e90\u62f7\u8d1d\u5230\u5bf9\u5e94\u7684\u6d4b\u8bd5\u76ee\u5f55\u4e0b\uff0c\u6bd4\u5982\u5c06 mp3 \u6587\u4ef6\u62f7\u8d1d\u5230 ~/Music \u76ee\u5f55\u4e0b\uff0c\u4f46\u662f\u6211\u4eec\u66f4\u5efa\u8bae\u4f60\u4f7f\u7528\u53d1\u9001\u5feb\u6377\u94fe\u63a5\u7684\u65b9\u5f0f\u66ff\u4ee3\u62f7\u8d1d\u7684\u64cd\u4f5c\uff0c\u56e0\u4e3a\u5728\u62f7\u8d1d\u5927\u6587\u4ef6\u65f6\u662f\u5f88\u6d88\u8017\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u800c\u521b\u5efa\u94fe\u63a5\u5219\u4e0d\u4f1a\uff1b @classmethod\ndef recovery_many_movies_in_movie_by_cmd(cls):\n\"\"\"\u6062\u590d\u591a\u4e2a\u89c6\u9891\u6587\u4ef6\u81f3\u89c6\u9891\u76ee\u5f55\u4e2d\"\"\"\nwork_path = f\"/home/{Config.USERNAME}/Videos/auto\"\ncode_path = f\"{Config.CASE_RES_PATH}/auto\"\ncls.run_cmd(f\"rm -rf {work_path};mkdir {work_path}\")\nsleep(1)\nflag = False\nif not exists(code_path):\ncls.run_cmd(f\"mkdir -p {code_path}\")\nflag = True\nlogger.info(f\"ln -s {code_path}/* {work_path}/\")\ncls.run_cmd(\nf\"cd {code_path}/;\"\nf\"{cls.wget_file('auto.zip') if flag else ''}\"\nf\"ln -s {code_path}/* {work_path}/ > /dev/null 2>&1\"\n)\n \u8d44\u6e90\u4e0b\u8f7d\u8fc7\u7a0b\u4e2d\u6ce8\u610f\u8d85\u65f6\u7684\u95ee\u9898\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u5f88\u5927\uff0c\u8981\u7279\u522b\u6ce8\u610f\u8fd9\u95ee\u9898\uff0c\u5982\u679c\u4f60\u4f7f\u7528\u5f3a\u5236\u7b49\u5f85\u4e0b\u8f7d\u7ed3\u675f( os.system )\uff0c\u53ef\u80fd\u4f1a\u9020\u6210\u7528\u4f8b\u6267\u884c\u65f6\u957f\u53d8\u5f97\u4e0d\u53ef\u63a5\u53d7\uff0c\u76ee\u524d\u6211\u4eec\u53d1\u73b0\u5728\u6301\u7eed\u96c6\u6210\u73af\u5883\u6267\u884c\u65f6\u7f51\u7edc\u4e0b\u8f7d\u901f\u5ea6\u5f88\u6162\uff0c\u6240\u4ee5\u8d85\u65f6\u673a\u5236\u662f\u5f88\u6709\u5fc5\u8981\u7684\uff1brun_cmd \u65b9\u6cd5\u6709\u4e00\u4e2a\u9ed8\u8ba4\u8d85\u65f6\u7684\u65f6\u95f4\uff0c\u4f60\u53ef\u4ee5\u6839\u636e\u8d44\u6e90\u5927\u5c0f\u5bf9\u8d85\u65f6\u65f6\u95f4\u8fdb\u884c\u8c03\u6574\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_5","title":"\u516d\u3001\u7528\u4f8b\u8c03\u8bd5\u6280\u5de7","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_4","title":"1. \u65e5\u5fd7","text":" \u4e00\u5b9a\u8981\u5148\u770b\u62a5\u9519\uff0c\u770b error \u65e5\u5fd7\uff0c\u901a\u5e38\u80fd\u660e\u786e\u7684\u544a\u8bc9\u4f60\u5177\u4f53\u54ea\u91cc\u4ee3\u7801\u62a5\u9519\uff1b \u7ed3\u5408\u62a5\u9519\u70b9\u524d\u9762\u7684error\u3001 info \u548c debug \u65e5\u5fd7\u770b\u5426\u662f\u6b63\u5e38\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_4","title":"2. \u65ad\u70b9\u8c03\u8bd5","text":" \u65b9\u6cd5\u62a5\u9519\uff1a \u5728\u65b9\u6cd5\u5e93\u4e2d\u627e\u5230\u5bf9\u5e94\u7684\u65b9\u6cd5\uff0c\u5355\u72ec\u8c03\u7528\uff0c\u770b\u662f\u5426\u80fd\u6b63\u5e38\u6267\u884c\uff1b \u901a\u5e38\u5355\u4e2a\u65b9\u6cd5\u7684\u6267\u884c\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u62a5\u9519\uff0c\u5f88\u5feb\u5c31\u80fd\u6392\u67e5\u51fa\u95ee\u9898\uff1b\u5728\u65b9\u6cd5\u5185\u90e8\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u65b9\u6cd5\u5185\u90e8\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u8c03\u7528\u6ca1\u95ee\u9898\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u62a5\u9519\u7684\u65b9\u6cd5\u524d\u9762\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u7528\u4f8b\u7684\u4e1a\u52a1\u903b\u8f91\u548c\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u65ad\u8a00\u62a5\u9519\uff1a \u65ad\u8a00\u4e3a\u6570\u636e\u65ad\u8a00\uff0c\u6839\u636e\u8868\u8fbe\u5f0f\u8fdb\u884c\u65ad\u8a00\u8bed\u53e5\u8fdb\u884c\u4fee\u6539\uff1b \u6587\u4ef6\u751f\u6210\u7c7b\u65ad\u8a00\uff0c\u67e5\u770b\u662f\u5426\u9700\u8981\u52a0\u7b49\u5f85\u65f6\u95f4\uff1b \u56fe\u50cf\u65ad\u8a00\uff0c\u5728\u65ad\u8a00\u8bed\u53e5\u5904\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u7528\u4f8b\u8fd0\u884c\u5230\u65ad\u8a00\u5904\u4f1a\u505c\u6b62\uff0c\u67e5\u770b\u6b64\u65f6\u65ad\u8a00\u7684\u56fe\u7247\u4e0e\u7528\u4f8b\u6267\u884c\u7684\u73b0\u573a\u5b58\u5728\u4ec0\u4e48\u5dee\u5f02\uff0c\u6b64\u65f6\u4e5f\u53ef\u4ee5\u8fdb\u884c\u91cd\u65b0\u622a\u56fe\uff0c\u4ece\u800c\u66ff\u6362\u65b0\u7684\u56fe\u7247\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3_1","title":"3. \u8fdc\u7a0b\u6267\u884c","text":" \u8fdc\u7a0b\u6267\u884c\u6307\u7684\u662f\u7f16\u8f91\u5668\u901a\u8fc7\u6307\u5b9a\u8fdc\u7a0b\u89e3\u91ca\u5668\u6267\u884c\u81ea\u52a8\u5316\u4ee3\u7801\uff1b \u8fdc\u7a0b\u6267\u884c\u7684\u597d\u5904\u662f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u7684 Debug \u8fd0\u884c\uff0c\u4e0d\u7528\u5728\u6d4b\u8bd5\u673a\u4e0a\u6253\u5f00\u7f16\u8f91\u5668\uff0c\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u66f4\u5feb\uff1b \u652f\u6301\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u7684\u7f16\u8f91\u5668\uff1a \u4e13\u4e1a\u7248 Pycharm VScode \uff0c\u9700\u8981\u4f7f\u7528\u63d2\u4ef6 Remote-SSH \u8fdc\u7a0b\u6267\u884c\u914d\u7f6e \u4ee5 Pycharm \u4e3a\u4f8b\uff1a File \u2014> Settings \u2014> Project \u2014> Python Interpreter \u2014> \u53f3\u8fb9\u8bbe\u7f6e\u6309\u94ae \u2014> Add... \u2014> SSH Interpreter \u2014> New server configuration(\u586b\u5165host\u548cusername) \u2014> Next \u2014> password\uff08\u6d4b\u8bd5\u673a\u5bc6\u7801\uff09 \u2014> Interpreter(\u9009\u62e9\u8fdc\u7a0b\u89e3\u91ca\u5668) \u2014> Finish "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4_1","title":"4. \u73af\u5883\u6e05\u7406","text":" \u5982\u679c\u7528\u4f8b\u91cc\u9762\u7684 teardown \u6ca1\u6709\u6267\u884c\uff0c\u5927\u6982\u7387\u662f\u56e0\u4e3a setup \u91cc\u9762\u4ee3\u7801\u62a5\u9519\uff0c\u8fd9\u4e24\u4e2a\u662f\u4e00\u5bf9\u7684\uff0csetup \u91cc\u9762\u62a5\u9519\uff0cteardown \u91cc\u9762\u7684\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\uff1b \u76ee\u524d\u6211\u4eec\u5df2\u7ecf\u5c06\u5404\u5e94\u7528\u7684 clean_all \u8fd9\u4e2a fixture \u6539\u6210\u4e86\u7ec8\u7ed3\u5668\uff0c\u786e\u4fdd\u59cb\u7ec8\u80fd\u6267\u884c\u5230\u8fd9\u6b65\uff0c\u4f46\u662f\u7528\u4f8b\u91cc\u9762\u7684 fixture\uff0c\u8fd8\u662f\u9700\u8981\u6211\u4eec\u5c0f\u5fc3\u5904\u7406\uff1b \u8981\u6267\u884c clean_all \u9700\u8981\u5728\u7f16\u8f91\u5668\u8fd0\u884c\u53c2\u6570\u52a0 --clean yes\uff0c\u5199\u7528\u4f8b\u7684\u65f6\u5019\u8bf7\u52a0\u4e0a\uff0c\u4e0d\u7136\u4f60\u4e0d\u786e\u5b9a\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u7684\u73af\u5883\u662f\u5426\u6062\u590d\uff1b setup \u53ef\u4ee5\u4e0d\u8981\uff0c\u5c06 setup \u653e\u5230\u7528\u4f8b\u91cc\u9762\u662f\u4e00\u79cd\u7a33\u59a5\u7684\u505a\u6cd5\uff0cteardown \u4e00\u5b9a\u8981\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5_1","title":"5. \u5143\u7d20\u5b9a\u4f4d\u4e0d\u51c6\uff08\u5750\u6807\u8fd4\u56de\u4e0d\u5bf9\uff09","text":" \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u53ef\u80fd\u53d7\u5230\u7a97\u53e3 ID \u7684\u53d8\u5316\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u9ed8\u8ba4\u53d6\u6700\u65b0\u7684\u4e00\u4e2a\u7a97\u53e3\u7528\u4e8e\u5b9a\u4f4d\uff0c\u4f46\u5982\u679c\u5b9e\u9645\u9700\u8981\u5b9a\u4f4d\u7684\u4e0d\u662f\u6700\u65b0\u7684\u7a97\u53e3\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u91cd\u65b0\u5b9e\u4f8b\u5316\u65b9\u6cd5\u7c7b\u5bf9\u8c61\uff0c\u5e76\u5728\u7c7b\u4e2d\u4f20\u5165\u5bf9\u5e94\u7684\u7a97\u53e3\u5e8f\u53f7\uff1b \u57fa\u4e8e\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u76ee\u524d\u9047\u5230\u7684\u7b14\u8bb0\u672c\u4e0a\uff0c\u7531\u4e8e\u5c4f\u5e55\u7f29\u653e\u6bd4\u4f8b\u4e3a 1.25\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u6211\u4eec\u9ed8\u8ba4\u4f7f\u7528\u7f29\u653e\u6bd4\u4f8b\u4e3a 1\uff1b \u57fa\u4e8e\u56fe\u50cf\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u76ee\u6807\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b \u57fa\u4e8e OCR \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u6587\u5b57\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u540c\u6837\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6_1","title":"6. \u952e\u9f20\u64cd\u4f5c\u4e0d\u51c6","text":" \u9f20\u6807\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6bd4\u5982\u53f3\u952e\u3001\u53cc\u51fb\u65e0\u54cd\u5e94\uff1b \u952e\u76d8\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6216\u8005\u5ef6\u8fdf\u8f93\u5165\uff0c\u6bd4\u5982\u7528\u4f8b\u9700\u8981\u8f93\u5165\u201c\u6211\u662f\u4e2d\u56fd\u4eba\u201d\uff0c\u5b9e\u9645\u53ea\u8f93\u5165\u4e86\u201c\u6211\u56fd\u4eba\u201d\uff1b \u4ee5\u4e0a\u95ee\u9898\u6392\u9664\u5e94\u7528\u5361\u987f\u7b49\u95ee\u9898\uff0c\u5927\u6982\u7387\u662f\u7531\u4e8e\u5de5\u5177\u7684\u95ee\u9898\uff0c\u76ee\u524d\u952e\u9f20\u64cd\u4f5c\u6211\u4eec\u4f7f\u7528\u4e09\u4e2a\u5de5\u5177\uff1aDogtail \u63d0\u4f9b\u7684\u952e\u9f20\u5de5\u5177\u3001PyAutoGUI\u3001Xdotool \uff1b \u6709\u540c\u5b66\u53ef\u80fd\u8981\u8bf4\u4e3a\u5565\u8981\u7528\u4e09\u4e2a\u554a\uff0c\u7528\u4e00\u4e2a\u4e0d\u5c31\u597d\u4e86\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u5404\u6709\u4f18\u70b9\u5404\u6709\u7f3a\u70b9\u3002 \u5982\u679c\u4f60\u9047\u5230\u952e\u9f20\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u8bd5\u8bd5\u901a\u8fc7\u4e0d\u540c\u7684\u5de5\u5177\u64cd\u4f5c\uff1b\u952e\u76d8\u8f93\u5165\u5ef6\u8fdf\u7684\u95ee\u9898\uff0c\u4e00\u822c\u662f\u56e0\u4e3a\u8f93\u5165\u901f\u5ea6\u592a\u5feb\u4e86\uff0c\u7cfb\u7edf\u6ca1\u53cd\u5e94\u8fc7\u6765\uff0c\u5e38\u89c1\u4e8e ARM \u548c MIPS \u4e0a\uff0c\u4fee\u6539\u53c2\u6570 delay_time \u7684\u503c\uff0c\u5355\u4f4d\u4e3a\u6beb\u79d2\uff1b # mouse_key.py\n@classmethod\ndef input_message(cls, message, delay_time=300, interval=0.2):\n\"\"\"\n \u8f93\u5165\u5b57\u7b26\u4e32\n :param message: \u8f93\u5165\u7684\u5185\u5bb9\n :param delay_time: \u5ef6\u8fdf\u65f6\u95f4\n :param interval:\n :return:\n \"\"\"\n \u5982\u679c\u4e0d\u662f\u65b9\u6cd5\u7684\u95ee\u9898\uff0c\u5219\u9700\u8981\u7ee7\u7eed\u548c\u5f00\u53d1\u4e00\u8d77\u6392\u9664\uff0c\u662f\u5426\u4e3a\u5e94\u7528\u63a5\u53d7\u952e\u9f20\u4fe1\u53f7\u5904\u7406\u7684\u95ee\u9898\uff0c\u8fd9\u7c7b\u60c5\u51b5\u6211\u4eec\u4e5f\u662f\u9047\u5230\u8fc7\u7684\uff0c\u5177\u4f53\u95ee\u9898\u5177\u4f53\u5206\u6790\u3002 \u6bd4\u5982\u5f71\u9662\u5c31\u91cd\u5199\u4e86\u4e00\u4e2a\u53f3\u952e\u7684\u65b9\u6cd5\uff1a # base_widget.py\n@classmethod\ndef right_click(cls, _x=None, _y=None):\n\"\"\"\n \u91cd\u5199\u5e95\u5c42\u5355\u51fb\u9f20\u6807\u53f3\u952e\n \u89e3\u51b3\u5f71\u9662\u53f3\u952e\u89e6\u53d1release\u4e8b\u4ef6\u7684\u95ee\u9898\uff08\u53f3\u952e\u4e3b\u7a97\u53e3\u4f1a\u64ad\u653e\u89c6\u9891\uff09\n \"\"\"\ncls.mouse_down(_x, _y, button=3)\nsleep(0.1)\ncls.mouse_up(button=3)\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_6","title":"\u4e03\u3001\u5176\u4ed6\u4e0d\u4e3a\u4eba\u77e5\u7684\u7ec6\u8282","text":" \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u5c3d\u91cf\u7f16\u5199\u540c\u4e00\u4e2a\u5e94\u7528\u6216\u6a21\u5757\u7684\u7528\u4f8b\uff0c\u80fd\u5bf9\u8be5\u7528\u4f8b\u5df2\u6709\u65b9\u6cd5\u719f\u6089\uff0c\u907f\u514d\u8fc7\u591a\u91cd\u590d\u4e1a\u52a1\u4ee3\u7801\u7684\u5c01\u88c5\uff1b \u76f8\u540c\u7684\u573a\u666f\u4e0b\uff0c\u5404\u67b6\u6784\u7b49\u5f85\u65f6\u95f4\u4e0d\u540c\uff0c\u5efa\u8bae\u4f7f\u7528\u6846\u67b6\u63d0\u4f9b\u7684 sleep\uff0c\u6211\u4eec\u505a\u4e86\u4e0d\u540c\u67b6\u6784\u7684\u500d\u6570\u653e\u5927\uff1b \u7f16\u5199\u7528\u4f8b\u65f6\uff0c\u5c3d\u91cf\u8003\u8651\u5230\u6bcf\u4e00\u6b65\u5f02\u5e38\u540e\u7684\u73af\u5883\u6062\u590d\uff0c\u9700\u8981\u5efa\u8bae\u8fd9\u79cd\u610f\u8bc6\uff0c\u968f\u65f6\u8981\u8003\u8651\u5230\uff0c\u8fd9\u6b65\u64cd\u4f5c\u6709\u6ca1\u6709\u53ef\u80fd\u51fa\u9519\uff0c\u51fa\u9519\u4e86\u6539\u600e\u4e48\u529e\uff1b \u63d0\u4ea4\u4ee3\u7801\u7684\u65f6\u5019\u6ce8\u610f\u4e0d\u8981\u628a\u4e00\u4e9b\u4e34\u65f6\u7684\u6d4b\u8bd5\u8d44\u6e90\u63d0\u4ea4\u8fdb\u53bb\u4e86\uff0c\u6bd4\u5982\u6d4b\u8bd5\u4e86\u4e00\u4e2a\u5f71\u7247\uff0c\u6709\u4e9b\u540c\u5b66\u4e60\u60ef\u4f7f\u7528 git add . \uff0c\u7136\u540e\u5c31\u5168\u90e8\u63d0\u4ea4\u5230\u4ee3\u7801\u4ed3\u5e93\u4e86\uff0c\u8fd9\u6837\u5373\u4f7f\u540e\u671f\u628a\u5927\u6587\u4ef6\u5220\u4e86\uff0c.git \u6587\u4ef6\u91cc\u9762\u4e5f\u4f1a\u5f88\u5927\uff0c\u9020\u6210\u4ee3\u7801\u4ed3\u5e93\u53d8\u5f97\u5341\u5206\u81c3\u80bf\u3002 \u66f4\u591a\u7ec6\u8282\u67e5\u770b\uff1a\u300aAT\u7ecf\u9a8c\u603b\u7ed3\u300b"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/","title":"AT \u6267\u884c\u5668\u4f7f\u7528\u6307\u5317","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/5/25\n# Author : litao\n# =============================================\n Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1","title":"1\u3001\u529f\u80fd\u4ecb\u7ecd","text":" \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7cfb\u7edf\u8bed\u8a00\u8bbe\u7f6e\uff0c\u5206\u8fa8\u7387\u8bbe\u7f6e\u53ca\u7528\u4f8b\u6267\u884c\u73af\u5883\u642d\u5efa\uff1b \u652f\u6301 IP \u4e3a 15 \u7f51\u6bb5\u7684 AMD \u67b6\u6784\u6d4b\u8bd5\u673a\u955c\u50cf\u88c5\u673a\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u6307\u5b9a\u5e94\u7528\uff0c\u6307\u5b9a\u8303\u56f4\u6807\u7b7e\u7684\u7528\u4f8b\u6267\u884c\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u72b6\u6001\u68c0\u67e5\uff0c\u662f\u5426\u6709\u6b63\u5728\u8fd0\u884c\u7684\u6d4b\u8bd5\uff1b \u652f\u6301\u914d\u7f6e\u7528\u4f8b\u6267\u884c\u65f6\u957f\uff0c\u9632\u6b62\u4efb\u52a1\u963b\u585e\uff1b \u652f\u6301\u6839\u636e\u5e94\u7528\u7248\u672c\u81ea\u52a8\u67e5\u627e\u5bf9\u5e94\u7684\u7528\u4f8b tag\uff1b \u652f\u6301\u5f02\u5e38\u5904\u7406\u548c\u6d4b\u8bd5\u5b8c\u6210\u7684\u5b9e\u65f6\u6d88\u606f\u901a\u77e5\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2job","title":"2\u3001Job \u4ecb\u7ecd","text":"\u4ee5\u4e0b\u6309\u6267\u884c\u6d41\u7a0b\u7684\u987a\u5e8f\u4ecb\u7ecd\uff0c\u6bcf\u4e00\u6b65\u90fd\u53ef\u4ee5\u5355\u72ec\u6267\u884c\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1_1","title":"1\u3001\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/AT_test/ \u6574\u4e2a\u6d41\u7a0b\u7684\u4e3b\u5165\u53e3\uff0c\u901a\u8fc7\u8fd9\u4e2a\u5165\u53e3\uff0c\u8fde\u540c\u6574\u4e2a\u6d4b\u8bd5\u6d41\u7a0b\uff0c\u955c\u50cf\u88c5\u673a\uff0c\u73af\u5883\u90e8\u7f72\uff0c\u6d4b\u8bd5\u5e94\u7528\u53ca\u751f\u6210\u62a5\u544a\u3002 \u53c2\u6570\u4ecb\u7ecd\uff1a \u6d4b\u8bd5\u673a\uff1a\u6240\u6709\u89c4\u6574\u5230\u56fa\u5b9a\u533a\u57df\u7684\u6d4b\u8bd5\u673a\uff0c\u901a\u8fc7\u6d4b\u8bd5\u540c\u5b66\u5bf9\u6d4b\u8bd5\u673a\u7684\u4e60\u60ef\u547d\u540d\uff0c\u5728\u540e\u53f0\u6620\u5c04\u6d4b\u8bd5\u673a\u7684\u8be6\u7ec6\u4fe1\u606f\uff0c\u62ec\u53f7\u4e2d\u4e3a\u6d4b\u8bd5\u673a IP \u7684\u6700\u540e\u4e00\u4f4d\uff1b \u6d4b\u8bd5\u5e94\u7528\uff1a\u6307\u5b9a\u7684\u6d4b\u8bd5\u5e94\u7528\u7684\u5305\u540d\uff0c\u7cfb\u7edf\u6839\u636e\u540d\u79f0\u81ea\u52a8\u62c9\u53d6\u5bf9\u5e94\u7684\u4ed3\u5e93\u4ee3\u7801\uff1b deb\u5305\u4e0b\u8f7d\u5730\u5740\uff1a\u6d4b\u8bd5\u4e0a\u8ff0\u5e94\u7528\u65f6\uff0c\u9700\u8981\u5b89\u88c5\u7684deb\u5305\u4e0b\u8f7d\u5730\u5740\uff0c\u591a\u4e2a\u5730\u5740\u7528\u201c,\u201d\u9694\u5f00\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff1b \u8303\u56f4\u6807\u7b7e\uff1a\u6267\u884c\u6d4b\u8bd5\u7528\u4f8b\u7684\u6807\u7b7e\u8303\u56f4\uff0c\u5bf9\u5e94\u7528\u4f8b\u4ee3\u7801 csv \u6587\u4ef6\u4e2d\u7684\u6807\u7b7e\u4fe1\u606f\uff0c\u4ee5 pytest \u7684mark\u8bed\u6cd5\u7f16\u5199\uff1b \u7cfb\u7edf\u8bed\u8a00\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u8bed\u8a00\u73af\u5883\uff1b \u5206\u8fa8\u7387\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u5206\u8fa8\u7387\u73af\u5883\uff1b \u955c\u50cf\u5730\u5740\uff1a\u955c\u50cf\u4ed3\u5e93\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u901a\u8fc7 PXE \u88c5\u673a\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u88c5\u673a\u73af\u8282\uff08\u76ee\u524d\u4ec5\u652f\u6301\u90e8\u5206 AMD \u67b6\u6784\u7684\u88c5\u673a\uff09\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2pxe","title":"2\u3001PXE \u88c5\u673a","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/IOS_install/ \u8f93\u5165\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\uff0cIP\uff0c\u5bc6\u7801\uff0c\u955c\u50cf\u5730\u5740\u540e\uff0c\u81ea\u52a8\u88c5\u673a\uff0c\u76ee\u524d\u4ec5\u652f\u6301\u56fa\u5b9a 15 \u7f51\u6bb5\u7684\u90e8\u5206 AMD \u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#3","title":"3\u3001\u6b21\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/all_client_test/ \u8be5\u5165\u53e3\u4e0e\u4e3b\u5165\u53e3\u529f\u80fd\u57fa\u672c\u4e00\u81f4\uff0c\u53ea\u662f\u5265\u79bb\u4e86PXE\u88c5\u673a\u6d41\u7a0b\uff0c\u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7684\u6267\u884c\u6d41\u7a0b\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#4","title":"4\u3001\u73af\u5883\u90e8\u7f72","text":"Jenkins url\uff1ahttps://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/env/build?delay=0sec \u8bbe\u7f6e\u6d4b\u8bd5\u673a\u7684\u7cfb\u7edf\u8bed\u8a00\uff0c\u5206\u8fa8\u7387\u53ca\u5b89\u88c5\u6d4b\u8bd5\u6240\u9700\u7684\u4f9d\u8d56\u5305\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#5","title":"5\u3001\u53d1\u9001\u4ee3\u7801","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/send_code/ \u6839\u636e\u6d4b\u8bd5\u5e94\u7528\u540d\u79f0\uff0c\u62c9\u53d6\u5bf9\u5e94\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u5e76\u6839\u636e\u6d4b\u8bd5\u673a\u4e0a\u5e94\u7528\u7248\u672c\u5207\u6362\u5230\u5bf9\u5e94\u7684tag\u7248\u672c\uff0c\u82e5\u672a\u627e\u5230tag\u7248\u672c\uff0c\u5219\u4f7f\u7528\u6700\u65b0\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u518d\u6839\u636e\u5e94\u7528\u5e93\u4ee3\u7801\u4e2d\u914d\u7f6e\u7684\u57fa\u7840\u5e93\u7248\u672c\uff0c\u62c9\u53d6\u57fa\u7840\u5e93\u4ee3\u7801\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#6","title":"6\u3001\u7528\u4f8b\u6267\u884c","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/run_test/ \u8fd0\u884c\u6d4b\u8bd5\u673a\u4e0a\u7684\u7528\u4f8b"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/","title":"AT \u7528\u4f8b\u7b5b\u9009\u6307\u5317","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u7528\u4f8b\u7b5b\u9009\u6807\u51c6\uff0c\u662f\u6311\u9009\u5408\u9002\u7684\u6587\u672c\u7528\u4f8b\u8fdb\u884c\u81ea\u52a8\u5316\u7528\u4f8b\u8f6c\u5316\u7684\u4e00\u4e9b\u901a\u7528\u6807\u51c6\u3002 \u8fc7\u53bb\u6211\u4eec\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u5b9e\u8df5\u8fc7\u7a0b\u4e2d\uff0c\u5199\u4e86\u4e0d\u5c11\u81ea\u52a8\u5316\u7528\u4f8b\uff0c\u968f\u7740\u9700\u6c42\u7684\u8fed\u4ee3\uff0c\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u81ea\u7136\u8150\u5316\uff0c\u56e0\u800c\u9700\u8981\u5728\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\u5bf9\u81ea\u52a8\u5316\u7528\u4f8b\u8fdb\u884c\u7ef4\u62a4\uff0c\u5728\u7ef4\u62a4\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u6211\u4eec\u53d1\u73b0\uff0c\u6709\u4e9b\u7528\u4f8b\u7ef4\u62a4\u8d77\u6765\u592a\u96be\u4e86\uff0c\u8c03\u8bd5\u7528\u4f8b\u8017\u8d39\u5927\u91cf\u65f6\u95f4\uff0c\u6210\u672c\u5f88\u9ad8\u3002 \u56e0\u6b64\uff0c\u6211\u4eec\u603b\u7ed3\u4e00\u4e9b\u81ea\u52a8\u5316\u7528\u4f8b\u9009\u578b\u7684\u6807\u51c6\uff0c\u4ee5\u4f18\u5316\u540e\u7eed\u81ea\u52a8\u5316\u7528\u4f8b\u7ed3\u6784\uff0c\u671f\u5f85\u6211\u4eec\u80fd\u7f16\u5199\u51fa\u9ad8\u6548\u3001\u7a33\u5b9a\u3001\u6613\u4e8e\u7ef4\u62a4\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_1","title":"\u4e00\u3001\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u53ef\u4ee5\u5206\u4e3a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u548c\u4e13\u9879\u81ea\u52a8\u5316\u6d4b\u8bd5\uff0c\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e00\u822c\u53ea\u9488\u5bf9\u4e00\u4e9b\u5e38\u89c4\u7684\u529f\u80fd\u6d4b\u8bd5\uff0c\u5176\u4ed6\u975e\u5e38\u89c4\u529f\u80fd\u7684\u7528\u4f8b\uff0c\u5e94\u8be5\u91c7\u7528\u4e13\u9879\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u6848\uff1b \u4ee5\u4e0b\u662f\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1","title":"1. \u7a33\u5b9a\u6027\u3001\u538b\u6d4b\u7528\u4f8b","text":"\u7a33\u5b9a\u6027\u6d4b\u8bd5\u3001\u538b\u6d4b\u7528\u4f8b\u5e94\u8be5\u662f\u5c5e\u4e8e\u6027\u80fd\u76f8\u5173\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u5982\uff1a\u53cd\u590d\u591a\u6b21\u70b9\u51fb\u6309\u94ae\uff0c\u68c0\u9a8c\u5176\u529f\u80fd\u7a33\u5b9a\u6027\u3002\u56e0\u4e3a\u8fd9\u4e9b\u7528\u4f8b\u65ad\u8a00\u7684\u9884\u671f\u53ef\u80fd\u4e0d\u662f\u5f88\u660e\u786e\uff0c\u66f4\u6709\u751a\u8005\u4e0d\u9700\u8981\u65ad\u8a00\uff0c\u7528\u4f8b\u65f6\u957f\u6bd4\u8f83\u957f\uff0c\u800c\u4e14\u4e0d\u53ef\u63a7\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u76ee\u524d\u6211\u4eec\u6709\u6027\u80fd\u81ea\u52a8\u5316\u7684\u4e13\u9879\u65b9\u6848\uff0c\u4ee5\u53ca\u4e00\u4e9b\u7a33\u5b9a\u6027\u6d4b\u8bd5\u7684\u4e13\u9879\u65b9\u6848\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u6b64\u7c7b\u7528\u4f8b\u653e\u5230\u4e13\u9879\u81ea\u52a8\u5316\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2","title":"2. \u6d89\u53ca\u591a\u4e2a\u7528\u6237\u64cd\u4f5c","text":"\u5e38\u89c1\u4e0e\u6587\u7ba1\u7684\u7528\u4f8b\u4e2d\uff0c\u591a\u7528\u6237\u64cd\u4f5c\u7684\u7528\u4f8b\u4e00\u822c\u90fd\u4f1a\u6d89\u53ca\u5230\u5728\u7cfb\u7edf\u4e2d\u8fdb\u884c\u591a\u4e2a\u7528\u6237\u95f4\u7684\u5207\u6362\uff0c\u81ea\u52a8\u5316\u811a\u672c\u4e00\u822c\u662f\u8fd0\u884c\u5728\u4e00\u4e2a\u7528\u6237\u7a7a\u95f4\u4e0b\u7684\uff0c\u6240\u4ee5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u591a\u7528\u6237\u95f4\u7684\u5207\u6362\u3002 \u6b64\u7c7b\u4e0d\u5efa\u8bae\u91c7\u7528\u81ea\u52a8\u5316\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3","title":"3. \u4e0e\u5f00\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4ea4\u4e92","text":"\u6b64\u7c7b\u573a\u666f\u591a\u4e3a\u5e94\u7528\u7684\u5f02\u5e38\u573a\u666f\u6d4b\u8bd5\uff0c\u6bd4\u5982\uff1a\u590d\u5236\u5927\u6587\u4ef6\u8fc7\u7a0b\u4e2d\u6ce8\u9500\u673a\u5668\u3002 \u81ea\u52a8\u5316\u811a\u672c\u5728\u7cfb\u7edf\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4e4b\u540e\u662f\u4f1a\u505c\u6b62\u8fd0\u884c\u7684\uff1b\u6b64\u7c7b\u7528\u4f8b\u53ef\u4ee5\u505a\u81ea\u52a8\u5316\uff0c\u4f46\u662f\u540c\u6837\u9700\u8981\u505a\u4e13\u9879\u65b9\u6848\uff0c\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u7684\u5904\u7406\u903b\u8f91\u5b8c\u5168\u4e0d\u540c\u3002 \u540e\u7eed\u81ea\u52a8\u5316\u9700\u8981\u516c\u5173\u7684\u70b9\uff1a \u81ea\u52a8\u5316\u811a\u672c\u5728\u672c\u673a\u8fd0\u884c\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u81f3\u5c11\u9700\u8981\u63d0\u4f9b\u4ee5\u4e0b\u529f\u80fd\uff1a \u91cd\u542f\u4e4b\u540e\u7528\u4f8b\u80fd\u81ea\u52a8\u8fd0\u884c\uff1b\u53ef\u4ee5\u8003\u8651\u5c06\u6267\u884c\u7528\u4f8b\u5199\u6210\u4e00\u4e2a\u5f00\u673a\u81ea\u542f\u7684\u670d\u52a1\uff1b \u80fd\u8bb0\u5f55\u5173\u673a\u4e4b\u524d\u7528\u4f8b\u6267\u884c\u7684\u4f4d\u7f6e\uff0c\u91cd\u542f\u4e4b\u540e\u80fd\u4ece\u6b64\u4f4d\u7f6e\u5f00\u59cb\u6267\u884c\uff1b \u50cf\u6027\u80fd\u81ea\u52a8\u5316\u4e00\u6837\uff0c\u7531\u670d\u52a1\u7aef\u63a7\u5236\uff1b \u5b8c\u5168\u57fa\u4e8e\u56fe\u5f62\u8bc6\u522b\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u4e32\u53e3\u7ebf\u63a7\u5236\u952e\u9f20\u7a33\u5b9a\u6027\uff1b "},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4","title":"4. \u6d4b\u8bd5\u6267\u884c\u65f6\u95f4\u957f","text":"\u7528\u4f8b\u6267\u884c\u65f6\u95f4\u63a7\u5236\u57282\u5206\u949f\u4ee5\u5185\uff0c\u6781\u7aef\u60c5\u51b5\u4e0d\u8981\u8d85\u8fc75\u5206\u949f\uff0c\u6240\u6709\u7528\u4f8b\u7684\u5e73\u5747\u65f6\u957f\u5e94\u8be5\u57281\u5206\u949f\u5de6\u53f3\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u95f4\u592a\u957f\uff0c\u7f16\u5199\u7528\u4f8b\u3001\u8c03\u8bd5\u7528\u4f8b\u3001\u6267\u884c\u7528\u4f8b\u3001\u7ef4\u62a4\u7528\u4f8b\u90fd\u975e\u5e38\u7684\u8017\u65f6\uff0c\u4eba\u529b\u6210\u672c\u65f6\u95f4\u6210\u672c\u6295\u5165\u592a\u9ad8\u3002 \u4f60\u60f3\uff0c\u8fd9\u6761\u7528\u4f8b\u6267\u884c\u9700\u89815\u5206\u949f\uff0c\u90a3\u4f60\u5199\u8fd9\u6761\u7528\u4f8b\u7684\u65f6\u95f4\u4e0d\u53ef\u80fd\u4e00\u904d\u8fc7\uff0c\u5199\u7684\u8fc7\u7a0b\u4e2d\u8dd1\u4e0d\u901a\u8fd8\u5f97\u91cd\u8dd1\u81f3\u5c1115\u5206\u949f\u4e0d\u8fc7\u5206\uff0c\u5199\u5b8c\u4e86\u8fd8\u5f97\u5728\u5176\u4ed6\u67b6\u6784\u4e0a\u8c03\u8bd5\uff0c\u534a\u4e2a\u5c0f\u65f6\u8fc7\u53bb\u4e86\uff0c\u8fd9\u8fd8\u53ea\u662f\u7b2c\u4e00\u6b21\u5199\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u540e\u7eed\u5982\u679c\u7528\u4f8b\u7ef4\u62a4\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u7ecf\u5e38\u6295\u5165\u76f8\u5f53\u957f\u65f6\u95f4\uff0c\u8fd9\u6837\u5176\u5b9e\u662f\u5931\u53bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u7684\u3002\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u5c31\u5e94\u8be5\u662f\u5feb\u51c6\u72e0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5","title":"5. \u8fb9\u7f18\u6027\u6d4b\u8bd5","text":"\u6709\u4e9b\u529f\u80fd\u6a21\u5757\u672c\u8eab\u662f\u5c5e\u4e8e\u6bd4\u8f83\u8fb9\u7f18\u6027\u7684\uff0c\u5373\u6781\u5c11\u7528\u6237\u4f1a\u4f7f\u7528\u5230\u7684\u529f\u80fd\uff0c\u8fd9\u7c7b\u529f\u80fd\u6a21\u5757\u4e0d\u9700\u8981\u5927\u89c4\u6a21\u5b9e\u73b0\u81ea\u52a8\u5316\uff0c\u4e00\u4e24\u4e2a\u573a\u666f\u8986\u76d6\u57fa\u672c\u529f\u80fd\u5c31\u884c\u4e86\uff0c\u56e0\u6b64\u6211\u4eec\u5728\u6311\u9009\u6b64\u7c7b\u7528\u4f8b\u7684\u65f6\u5019\u53ef\u4ee5\u7ed3\u5408\u6574\u4e2a\u529f\u80fd\u6a21\u5757\u7684\u8986\u76d6\u60c5\u51b5\u6765\u51b3\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6","title":"6. \u9700\u8981\u4f9d\u8d56\u4eba\u5de5\u4ecb\u5165\u7684","text":"\u81ea\u52a8\u5316\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\u662f\u6ca1\u6709\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bd4\u5982\u8981\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u90a3\u4e48\u5c31\u80cc\u79bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u3002 \u6bd4\u5982\u5149\u9a71\u6a21\u5757\uff0c\u5149\u9a71\u523b\u5f55\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u4f46\u662f\u5149\u9a71\u523b\u5f55\u4e4b\u540e\u5149\u76d8\u4f1a\u5f39\u51fa\u6765\uff0c\u9700\u8981\u4eba\u5de5\u66f4\u6362\u5149\u76d8\uff0c\u518d\u624b\u52a8\u63a8\u8fdb\u5149\u9a71\u4e2d\u3002 \u8fd9\u79cd\u529f\u80fd\u6a21\u5757\u5373\u4f7f\u505a\u81ea\u52a8\u5316\uff0c\u80fd\u6d89\u53ca\u5230\u7684\u529f\u80fd\u975e\u5e38\u6709\u9650\uff0c\u800c\u4e14\u4e0d\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u6240\u4ee5\u660e\u663e\u5c31\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7","title":"7. \u96be\u4ee5\u5b9e\u73b0\u7684","text":"\u7528\u4f8b\u6240\u6d89\u53ca\u5230\u7684\u65b9\u6cd5\u5b9e\u73b0\u8d77\u6765\u53ef\u80fd\u6709\u96be\u5ea6\uff0c\u751a\u81f3\u73b0\u9636\u6bb5\u65e0\u6cd5\u5b9e\u73b0\u7684\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002 \u6bd4\u5982\u5f71\u9662\u6d4b\u8bd5\u753b\u9762\u6e05\u6670\u5ea6\u3001\u6d41\u7545\u5ea6\u3001\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u4e4b\u540e\u7684\u89c6\u9891\u662f\u5426\u5b58\u5728\u5361\u987f\u7b49\u7528\u4f8b\uff0c\u73b0\u9636\u6bb5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#8","title":"8. \u529f\u80fd\u4e0d\u7a33\u5b9a","text":"\u8fd9\u4e2a\u4e0d\u662f\u8bf4\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\uff0c\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\u4e0d\u7a33\u5b9a\u662f\u6b63\u5e38\u7684\uff0c\u8fd9\u79cd\u6211\u4eec\u53ef\u4ee5\u7b49\u5f00\u53d1\u63d0\u6d4b\u4e4b\u540e\u518d\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u3002 \u529f\u80fd\u4e0d\u7a33\u5b9a\u6307\u7684\u662f\u7528\u4f8b\u6240\u6d89\u53ca\u7684\u529f\u80fd\uff0c\u53ef\u80fd\u5b58\u5728\u591a\u79cd\u53d8\u5316\uff0c\u6bcf\u6b21\u6267\u884c\u7528\u4f8b\u53ef\u80fd\u65ad\u8a00\u7684\u9884\u671f\u90fd\u4e0d\u540c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#9","title":"9. \u52a8\u6001\u65ad\u8a00","text":"\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u76f4\u5230\u7528\u4f8b\u7ed3\u675f\uff0c\u4e00\u76f4\u662f\u4e00\u4e2a\u52a8\u6001\u53d8\u5316\u7684\u8fc7\u7a0b\uff0c\u800c\u4e14\u65e0\u6cd5\u901a\u8fc7\u5176\u4ed6\u624b\u6bb5\u505c\u4e0b\u6765\uff1b \u6bd4\u5982\uff1a\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u65f6\uff0c\u53f3\u4e0b\u89d2\u7684\u5f55\u5236\u65f6\u95f4\u662f\u4e00\u76f4\u5728\u53d8\u5316\u7684\uff0c\u7528\u4f8b\u9700\u8981\u6d4b\u8bd5\u5f55\u52361\u5206\u949f\u4e4b\u540e\uff0c\u5f55\u5236\u65f6\u95f4\u662f\u521a\u597d\u505c\u572860\u79d2\uff1b \u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fd8\u505a\u4e0d\u5230\u65f6\u95f4\u7cbe\u51c6\u63a7\u5236\uff0c\u7a0b\u5e8f\u6267\u884c\u65f6\u95f4\u662f\u6709\u6ce2\u52a8\u7684\uff0c\u800c\u4e14\u8981\u9002\u914d\u591a\u4e2a\u5e73\u53f0\uff0c\u6240\u4ee5\u6b64\u7c7b\u7528\u4f8b\u5927\u6982\u7387\u4f1a\u6267\u884c\u5931\u8d25\u3002\u7279\u522b\u662f\u5728\u6027\u80fd\u8f83\u5dee\u7684\u56fd\u4ea7\u5316\u67b6\u6784\u4e0a\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u592a\u53ef\u80fd\u7a33\u5b9a\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#10","title":"10. \u63a2\u7d22\u6027\u6d4b\u8bd5","text":"\u63a2\u7d22\u6027\u6d4b\u8bd5\u901a\u5e38\u662f\u4e00\u4e9b\u4e0d\u786e\u5b9a\u7684\u64cd\u4f5c\uff0c\u591a\u53d8\u5207\u590d\u6742\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u9884\u671f\u4e5f\u53ef\u80fd\u662f\u4e0d\u786e\u5b9a\u7684\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u9a9a\u64cd\u4f5c\u592a\u591a\u4e86\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6b64\u7c7b\u7528\u4f8b\u9002\u5408\u91c7\u7528\u624b\u5de5\u6d4b\u8bd5\uff0c\u662f\u624b\u5de5\u6d4b\u8bd5\u771f\u6b63\u7684\u4ef7\u503c\u4f53\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#11","title":"11. \u6613\u7528\u6027\u6d4b\u8bd5","text":"\u5bf9\u4e8e\u6613\u7528\u6027\u7684\u5224\u65ad\u901a\u5e38\u662f\u4e3b\u89c2\u7684\uff0c\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\u5f88\u96be\u53bb\u5b9a\u4e49\u4ec0\u4e48\u6837\u7684\u60c5\u51b5\u5bf9\u7528\u6237\u662f\u6613\u7528\u7684\uff0c\u81ea\u52a8\u5316\u9700\u8981\u6709\u660e\u786e\u7684\u53ef\u5b9e\u73b0\u7684\u9884\u671f\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_2","title":"\u4e8c\u3001\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u524d\u9762\u8bb2\u4e86\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u4e00\u4e9b\u7528\u4f8b\u60c5\u51b5\uff0c\u6709\u540c\u5b66\u5c31\u8bf4\u4e86\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\u4e0d\u7528\u8bb2\u4e86\uff0c\u5c31\u662f\u4e0d\u9002\u5408\u7684\u53cd\u9762\u3002\u6ca1\u6bdb\u75c5\u54c8\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\uff0c\u6211\u4eec\u5927\u4f53\u8fd8\u53ef\u4ee5\u5206\u4e3a\u4e24\u7c7b\uff1a \u7b2c\u4e00\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u597d\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u7b2c\u4e8c\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u4e00\u822c\uff0c\u9700\u8981\u6295\u5165\u66f4\u591a\u7cbe\u529b\u624d\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u4ee5\u4e0b\u4ecb\u7ecd\u4e00\u4e9b\u6211\u4eec\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1_1","title":"1. \u64cd\u4f5c\u76f8\u5bf9\u7b80\u5355","text":"\u7528\u4f8b\u6b65\u9aa4\u76f8\u5bf9\u8f83\u5c11\uff0c\u8fd9\u79cd\u7528\u4f8b\u901a\u5e38\u662f\u4e00\u4e9b\u8def\u5f84\u5f88\u6d45\u7684\u7528\u4f8b\uff0c\u4e00\u822c\u4e5f\u662f\u4e00\u4e9b\u57fa\u7840\u7528\u4f8b\u3002\u7528\u4f8b\u7f16\u5199\u3001\u7ef4\u62a4\u90fd\u53ef\u4ee5\u8f7b\u677e\u641e\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2_1","title":"2. \u5bb9\u6613\u5b9e\u73b0","text":"\u73b0\u6709\u6280\u672f\u662f\u53ef\u5b9e\u73b0\u7684\uff0c\u6ca1\u6709\u96be\u5ea6\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3_1","title":"3. \u7ecf\u5e38\u7528\u4e8e\u56de\u5f52\u6d4b\u8bd5","text":"\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bcf\u6b21\u56de\u5f52\u6d4b\u8bd5\u5fc5\u987b\u8981\u6267\u884c\u7684\u7528\u4f8b\uff0c\u90a3\u4e48\u8fd9\u6761\u7528\u4f8b\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u3002 \u56de\u5f52\u6d4b\u8bd5\u65f6\u6211\u4eec\u9996\u5148\u5e94\u8be5\u4fdd\u8bc1\u5e94\u7528\u5386\u53f2\u57fa\u672c\u529f\u80fd\u6b63\u5e38\uff0c\u6240\u4ee5\u90a3\u4e9b\u6bcf\u6b21\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u90fd\u8981\u6267\u884c\u7684\u7528\u4f8b\u9002\u5408\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4_1","title":"4. \u529f\u80fd\u7a33\u5b9a\u7684\u6838\u5fc3\u529f\u80fd","text":"\u6d89\u53ca\u6838\u5fc3\u529f\u80fd\u7684\u7528\u4f8b\u662f\u6700\u6700\u91cd\u8981\u7684\u7528\u4f8b\uff0c\u4e5f\u662f\u6211\u4eec\u4ea4\u4ed8\u65f6\u5fc5\u987b\u8981\u4fdd\u8bc1\u8d28\u91cf\u7684\u76f8\u5173\u529f\u80fd\uff0c\u56e0\u6b64\u5e94\u8be5\u5c3d\u53ef\u80fd\u7684\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5_1","title":"5. \u8f93\u5165\u6570\u636e\u6d4b\u8bd5","text":"\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u901a\u5e38\u662f\u68c0\u9a8c\u88ab\u6d4b\u5e94\u7528\u63a5\u53d7\u6709\u6548\u6570\u636e\u3001\u62d2\u7edd\u65e0\u6548\u6570\u636e\u7684\u80fd\u529b\u3002\u5982\uff1a\u63d0\u4ea4\u8d85\u957f\u5b57\u7b26\u4e32\u3001\u7279\u6b8a\u5b57\u7b26\u4e32\u7b49\u7b49\u3002 \u6b64\u7c7b\u7528\u4f8b\u624b\u5de5\u6d4b\u8bd5\u5f88\u96be\u6bd4\u8f83\u5168\u9762\u7684\u8986\u76d6\u5230\u6240\u6709\u7684\u8f93\u5165\u60c5\u51b5\uff0c\u4f46\u662f\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\uff0c\u6b64\u7c7b\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u90fd\u662f\u4e00\u6837\u7684\uff0c\u53d8\u5316\u7684\u4ec5\u662f\u8f93\u5165\u53c2\u6570\u548c\u65ad\u8a00\u7ed3\u679c\uff0c\u91c7\u7528\u6570\u636e\u9a71\u52a8\uff0c\u53ef\u4ee5\u8f7b\u677e\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6_1","title":"6. \u683c\u5f0f\u8986\u76d6","text":"\u539f\u56e0\u540c\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u7c7b\u7528\u4f8b\u4e00\u6837\uff0c\u591a\u79cd\u683c\u5f0f\u7684\u8986\u76d6\u4e5f\u662f\u4e00\u4e2a\u5f88\u7e41\u7410\u7684\u4e8b\u60c5\uff0c\u4ea4\u7ed9\u81ea\u52a8\u5316\u6765\u505a\u518d\u5408\u9002\u4e0d\u8fc7\u4e86\u3002 \u6bd4\u5982\u5f71\u9662\u5bf9\u5f71\u7247\u683c\u5f0f\u7684\u68c0\u67e5\u3001\u622a\u56fe\u5f55\u5c4f\u5bf9\u4fdd\u5b58\u683c\u5f0f\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7_1","title":"7. \u68c0\u67e5\u5143\u7d20\u72b6\u6001","text":"\u67e5\u770b\u88ab\u6d4b\u5e94\u7528\u7684\u5143\u7d20\u5c5e\u6027\u3002\u5982\uff1a\u56fe\u7247\u7684\u5927\u5c0f\u548c\u6392\u5217\uff1b\u6309\u94ae\u7684\u53ef\u7528\u548c\u4e0d\u53ef\u7528\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/","title":"AT \u7ecf\u9a8c\u603b\u7ed3","text":"\u6b22\u8fce\u6240\u6709\u4eba\u63d0\u4ea4\u4f60\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u9762\u7684\u4f18\u79c0\u5b9e\u8df5\u7ecf\u9a8c\uff0c\u4ee5\u5e2e\u52a9\u5927\u5bb6\u89e3\u51b3\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#1","title":"1\u3001\u7ec8\u7ed3\u5668","text":"# litaoa@uniontech.com\n \u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4 pytest \u5b9e\u73b0\u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4\u7684\u65b9\u5f0f\u6709\u4e24\u79cd\uff0cyield \u548c\u7ec8\u7ed3\u51fd\u6570\uff1b yield \u5b9e\u73b0\uff0cyield\u524d\u9762\u4e3a\u7528\u4f8b\u7684\u524d\u7f6e\u6b65\u9aa4\uff0cyield \u540e\u9762\u4e3a\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4\u3002 @pytest.fixture\ndef clean_env():\nprint(\"setup\")\nyield\nprint(\"teardown\")\n \u7ec8\u7ed3\u51fd\u6570\u5b9e\u73b0\uff0c\u4f7f\u7528 request.addfinalizer \u6ce8\u518c\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4 @pytest.fixture\ndef clean_env(request):\ndef clean():\nprint(\"teardown\")\nrequest.addfinalizer(clean)\nprint(\"setup\")\n yield\u7684\u4f18\u7f3a\u70b9\uff1a \u4f18\u70b9\uff1a\u4ee3\u7801\u7b80\u6d01\uff0c\u76f4\u89c2\uff0c\u53ef\u4f7f\u7528yield\u5728\u7528\u4f8b\u4e2d\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c \u7f3a\u70b9\uff1a\u82e5\u524d\u7f6e\u6b65\u9aa4\u4e2d\u51fa\u73b0\u9519\u8bef\uff0c\u5219\u540e\u7f6e\u6b65\u9aa4\u4e0d\u4f1a\u6267\u884c \u7ec8\u7ed3\u51fd\u6570\uff1a \u4f18\u70b9\uff1a\u524d\u7f6e\u6b65\u9aa4\u5931\u8d25\u7684\u8bdd\uff0c\u540e\u7f6e\u6b65\u9aa4\u4ecd\u4f1a\u6267\u884c\u4e14\u53ef\u4ee5\u6ce8\u518c\u591a\u4e2a\u540e\u7f6e\u6b65\u9aa4\uff08\u524d\u63d0\uff1a\u9700\u8981\u5728\u4ee3\u7801\u62a5\u9519\u4e4b\u524d\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff09\uff0c\u652f\u6301\u7075\u6d3b\u4f7f\u7528\u540e\u7f6e\u6761\u4ef6 \u7f3a\u70b9\uff1a\u4ee3\u7801\u8f83\u4e3a\u590d\u6742\uff0c\u65e0\u6cd5\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c\uff08\u672c\u4eba\u76ee\u524d\u672a\u5b9e\u73b0\uff09 \u603b\u7ed3\uff1a\u5728\u524d\u7f6e\u6b65\u9aa4\u4fdd\u8bc1\u7edd\u5bf9\u4e0d\u4f1a\u51fa\u9519\u65f6\uff0c\u4f7f\u7528yield\u66f4\u4f73\u7b80\u4fbf\uff0c\u5f53\u524d\u7f6e\u6b65\u9aa4\u6613\u51fa\u73b0\u95ee\u9898\u65f6\uff0c\u63a8\u8350\u4f7f\u7528\u7ec8\u7ed3\u51fd\u6570\u3002 \u573a\u666f\uff1a\u4fdd\u9669\u7bb1\u7528\u4f8b\uff0c\u524d\u7f6e\u6b65\u9aa4\u4e2d\u5f00\u542f\u4fdd\u9669\u7bb1\uff0c\u540e\u7f6e\u6b65\u9aa4\u5220\u9664\u4fdd\u9669\u7bb1\u3002 @pytest.fixture(scope=\"session\", autouse=True)\ndef vault_fixture(request):\nDfmWidget.reset_vault_by_cmd() # 1\u3001\u91cd\u7f6e\u4fdd\u9669\u7bb1\nDdeDockPublicWidget().close_file_manager_by_cmd() # 2\u3001\u5173\u95ed\u6587\u7ba1\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 3\u3001\u5f00\u542f\u6587\u7ba1\nvault = DfmWidget()\nvault.create_file_vault() # 4\u3001\u521b\u5efa\u4fdd\u9669\u7bb1\ndef delete_vault(): # 8\u3001\u5220\u9664\u4fdd\u9669\u7bb1\u7684\u540e\u7f6e\u6b65\u9aa4\nsleep(2)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr()\nvault = DfmWidget()\nvault.delete_file_vault()\nDfmWidget.reset_vault_by_cmd()\nDdeDockPublicWidget().close_file_manager_by_cmd()\nrequest.addfinalizer(delete_vault) # 5\u3001\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\nDdeDockPublicWidget().close_file_manager_by_cmd() # 6\u3001\u5173\u95ed\u6587\u7ba1\nsleep(1)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 7\u3001\u5f00\u542f\u6587\u7ba1\n \u4ee3\u7801\u6309\u6ce8\u91ca\u4e2d\u7684\u5e8f\u53f7\u6267\u884c\u6b65\u9aa4 \u4ee3\u7801\u5728\u6b65\u9aa41-4\u4efb\u610f\u4f4d\u7f6e\u62a5\u9519\uff0c\u5219\u4e0d\u4f1a\u6267\u884c\u6b65\u9aa48\uff0c\u56e0\u4e3a\u672a\u6267\u884c\u5230\u6b65\u9aa45\uff0c\u6b65\u9aa48\u8fd8\u672a\u6ce8\u518c \u4ee3\u7801\u5728\u6b65\u9aa46-7\u62a5\u9519\uff0c\u4ecd\u4f1a\u6267\u884c\u6b65\u9aa47\uff0c\u56e0\u4e3a\u5728\u6b65\u9aa45\u4e2d\u5df2\u7ecf\u5c06\u6b65\u9aa47\u6ce8\u518c \u53ef\u4ee5\u7075\u6d3b\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff0c\u80fd\u5b9e\u73b0\u67d0\u4e2a\u524d\u7f6e\u6b65\u9aa4\u6267\u884c\u4e4b\u540e\uff0c\u624d\u4f1a\u6267\u884c\u540e\u7f6e\u6b65\u9aa4\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#2","title":"2\u3001\u542f\u52a8\u5e94\u7528\u7684\u65b9\u5f0f","text":"# huangmingqiang@uniontech.com\n \uff081\uff09\u547d\u4ee4\u884c\u542f\u52a8 \u5728 AT \u4ee3\u7801\u4e2d\u4f7f\u7528\u547d\u4ee4\u884c\u542f\u52a8\u5e94\u7528\uff0c\u4e3e\u4f8b\uff1a os.popen(\"deepin-music\")\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f7f\u7528 ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6\uff0cdogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u3002 \uff082\uff09\u901a\u8fc7 UI \u64cd\u4f5c\u542f\u52a8 \u901a\u8fc7\u4efb\u52a1\u680f\u3001\u542f\u52a8\u5668\u3001\u684c\u9762\u7b49UI\u65b9\u5f0f\u542f\u52a8\uff0c\u6bd4\u5982\u53cc\u51fb\u6253\u5f00\u3001\u53f3\u952e\u6253\u5f00\u7b49\uff0c\u8fd9\u79cd\u64cd\u4f5c\u65b9\u5f0f\u4e0d\u5b58\u5728ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6dogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u7684\u95ee\u9898\uff0c\u4e5f\u66f4\u52a0\u7b26\u5408\u7528\u6237\u7684\u64cd\u4f5c\u884c\u4e3a\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#3","title":"3\u3001\u6587\u4ef6\u9009\u62e9\u6846\u5c5e\u6027\u5b9a\u4f4d\u5076\u73b0\u65e0\u6cd5\u627e\u5230","text":"\u6587\u4ef6\u9009\u62e9\u6846\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5728\u8c03\u7528\u6587\u4ef6\u9009\u62e9\u6846\u65f6\uff0c\u6709\u4e00\u5b9a\u7684\u6982\u7387\u51fa\u73b0\uff0c\u754c\u9762\u5df2\u7ecf\u6e32\u67d3\u51fa\u6765\u4e86\uff0c\u4f46\u662f\u5c5e\u6027\u6811\u5e76\u6ca1\u6709\u5199\u5165\uff0c\u5bfc\u81f4\u901a\u8fc7\u5c5e\u6027\u65e0\u6cd5\u627e\u5230\u5143\u7d20\uff0c\u76ee\u524d\u4e5f\u6ca1\u6709\u5f88\u597d\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u4e3a\u4e86\u7528\u4f8b\u7a33\u5b9a\u6027\uff0c\u6587\u4ef6\u9009\u62e9\u6846\u7684\u64cd\u4f5c\u5efa\u8bae\u4f7f\u7528UI\u6216\u8005\u56fe\u7247\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u53ef\u4ee5\u901a\u8fc7\u641c\u7d22\u5185\u5bb9\u56fa\u5b9a\u6587\u4ef6\u4f4d\u7f6e\u3002 # litaoa@uniontech.com\n desk = DdeDesktopPublicWidget()\n# \u9009\u62e9\u89c6\u9891\u76ee\u5f55\ndesk.click_videos_dir_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.ctrl_f()\nsleep(1)\ndesk.input_message(\"\u5143\u7d20\u540d\u79f0\")\nsleep(0.5)\ndesk.enter()\nsleep(1)\n# \u9009\u62e9\u7b2c\u4e00\u4e2a\u6587\u4ef6\ndesk.click_list_view_btn_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.click_first_file_in_desktop_plugs_by_ui()\nsleep(1)\n# \u6587\u7ba1\u63d2\u4ef6\u4e2d\u70b9\u51fb\u6253\u5f00\ndesk.click_open_btn_in_desktop_plugs_by_ui()\n"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#4","title":"4\u3001\u5e94\u7528\u542f\u52a8","text":"# mikigo\n \u5728UI\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u4e00\u5207\u64cd\u4f5c\u7684\u90fd\u662f\u4ece\u5e94\u7528\u542f\u52a8\u5f00\u59cb\u7684\uff0c\u800c\u5728Linux\u684c\u9762\u5e94\u7528\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u6211\u4eec\u542f\u52a8\u5e94\u7528\u7684\u65b9\u6cd5\u6709\u591a\u79cd\uff0c\u4e0b\u9762\u505a\u4e00\u4e2a\u7b80\u5355\u7684\u4ecb\u7ecd\uff1a \u3010\u4f7f\u7528dogtail\u542f\u52a8\u3011 dogtail\u63d0\u4f9b\u4e86\u5e94\u7528\u542f\u52a8\u7684\u65b9\u6cd5\uff0c\u5728utils\u5e93\u4e2d\uff0c\u4f7f\u7528run\u65b9\u6cd5\u542f\u52a8\uff1a \u9996\u5148\u5bfc\u5165\u65b9\u6cd5\uff1a from dogtail.utils import *\n \u8c03\u7528run\u65b9\u6cd5 run('deepin-music')\n \u5373\u53ef\u542f\u52a8\u97f3\u4e50 \u8fd9\u79cd\u65b9\u6cd5\u7684\u4f18\u70b9\u662f\u91c7\u7528\u8fdb\u7a0b\u7684\u65b9\u5f0f\u76f4\u63a5\u542f\u52a8\uff0c\u4e0d\u4f9d\u8d56\u4e0eUI\uff0c\u65e0\u8bba\u684c\u9762\u6216\u4efb\u52a1\u680f\u4e0a\u662f\u5426\u5b58\u5728\u5e94\u7528\u56fe\u6807\uff0c\u90fd\u53ef\u4ee5\u6b63\u5e38\u542f\u52a8\u3002 \u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c \u5982\u679c\u4f7f\u7528ssh\u8fdc\u7a0b\u8c03\u7528\uff0c\u6216\u8005Jenkins\u4e2d\u6267\u884c\u6d4b\u8bd5\u811a\u672c\u7684\u65f6\u5019\uff0c\u5728sniff\u4e2d\u4f1a\u51fa\u73b0\u627e\u4e0d\u5230\u5e94\u7528\uff0c\u7ecf\u8fc7\u5206\u6790\uff0c\u53ef\u80fd\u662f\u56e0\u4e3a\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\u542f\u52a8\u7684\u65f6\u5019\uff0c\u5b9e\u9645\u662f\u91c7\u7528\u4e00\u4e2a\u5b50\u8fdb\u7a0b\u542f\u52a8\u4e86\u5e94\u7528\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u5230\u3002 \u3010\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u3011 \u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807 \u901a\u5e38\u6709\u4e24\u79cd\u65b9\u6cd5\uff1a \uff081\uff09\u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807\u3002 \uff082\uff09\u5df2\u77e5\u5e94\u7528\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u7684\u4f4d\u7f6e\uff0c\u7136\u540e\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u5bf9\u5e94\u5750\u6807\u3002 \u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u7f3a\u70b9\u662f\u4f4d\u7f6e\u5fc5\u987b\u56fa\u5b9a\uff0c\u5982\u679c\u79fb\u52a8\u4f4d\u7f6e\u5c31\u4e0d\u884c\u4e86\uff0c\u800c\u4f7f\u7528\u7b2c\u4e00\u79cd\u65b9\u6cd5\uff0c\u65e0\u8bba\u4f4d\u7f6e\u5728\u54ea\u91cc\uff0c\u53ea\u8981\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u5b58\u5728\u5373\u53ef\u3002 \u3010\u70b9\u51fb\u684c\u9762\u56fe\u6807\u542f\u52a8\u3011 \u684c\u9762\u56fe\u6807\u76ee\u524d\u662f\u91c7\u7528\u56fe\u50cf\u8bc6\u522b\u6280\u672f\uff0c\u5b9a\u4f4d\u5230\u5e94\u7528\u56fe\u6807\u7684\u5750\u6807\uff0c\u7136\u540e\u901a\u8fc7pyauogui\u8fdb\u884c\u70b9\u51fb\u64cd\u4f5c\u3002 \u8be6\u7ec6\u6280\u672f\u65b9\u6848\u53ef\u4ee5\u53c2\u8003\u6211\u7684\u53e6\u5916\u4e24\u7bc7\u535a\u5ba2: \u57fa\u4e8eopencv\u7684\u6a21\u677f\u5339\u914d\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd4\u56de\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 Python\u4e09\u65b9\u5e93PyAutoGui\u7684\u4f7f\u7528\u65b9\u6cd5 \u3010\u4ece\u542f\u52a8\u5668\u542f\u52a8\uff08\u4fd7\u79f0\u5f00\u59cb\u83dc\u5355\uff09\u3011 \u542f\u52a8\u4e2d\u542f\u52a8\u7684\u5b9e\u73b0\u903b\u8f91\u5b9e\u9645\u548c\u4efb\u52a1\u680f\u4e0a\u542f\u52a8\u5dee\u4e0d\u591a\u3002 \u9996\u5148\uff0c\u9700\u8981\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u542f\u52a8\u5668\u56fe\u6807\uff0c\u6216\u8005\u952e\u76d8super\u952e\uff0c\u5c06\u542f\u52a8\u5668\u547c\u51fa\u6765\uff0c \u7136\u540e\uff0c\u5728\u542f\u52a8\u5668\u4e2d\u70b9\u51fb\u5bf9\u5e94\u7684\u56fe\u6807\uff0c \u4f46\u662f\u8fd9\u91cc\u6709\u4e2a\u95ee\u9898\uff0c\u542f\u52a8\u5668\u4e2d\u7684\u5e94\u7528\u5217\u8868\uff0c\u4e00\u9875\u5c55\u793a\u4e0d\u5b8c\uff0c\u6240\u4ee5\u5982\u679c\u6211\u4eec\u8981\u70b9\u51fb\u7684\u5e94\u7528\u56fe\u6807\u4e0d\u5728\u7b2c\u4e00\u9875\u600e\u4e48\u529e\uff0c\u901a\u5e38\u89e3\u51b3\u65b9\u6848\u6709\u4e24\u79cd\uff1a \uff081\uff09\u9700\u8981\u8fdb\u884c\u5411\u4e0b\u6ed1\u52a8\uff0c\u8fd9\u91cc\u5c31\u6d89\u53ca\u5230\u76f8\u5e94\u7684\u8bc6\u522b\u65b9\u6848\uff0c\u5224\u65ad\u5982\u679c\u4e0d\u5728\u7b2c\u4e00\u9875\u5c31\u5f80\u4e0b\u6ed1\u52a8\u7ffb\u9875\u3002 \uff082\uff09\u542f\u52a8\u5668\u63d0\u4f9b\u641c\u7d22\u7684\u529f\u80fd\uff0c\u8f93\u5165\u5e94\u7528\u540d\u79f0\u641c\u7d22\uff0c\u7136\u540e\u8fdb\u884c\u70b9\u51fb\u3002 \u4ece\u5b9e\u9645\u64cd\u4f5c\u4e2d\u6765\u770b\uff0c\u91c7\u7528\u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u6548\u7387\u4f1a\u9ad8\u4e00\u70b9\u3002 \u3010\u7ec8\u7aef\u547d\u4ee4\u542f\u52a8\u3011 \u5728python\u4e2d\uff0c\u4f7f\u7528os.popen()\u6216os.system()\u6216\u8005subprocess.Popen()\uff0c\u5b9e\u73b0\u547d\u4ee4\u884c\u542f\u52a8\uff0c\u6bd4\u5982\uff1a import os\nos.popen('deepin-music')\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u8fdc\u7a0b\u6267\u884c\u811a\u672c\u7684\u65f6\u5019\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u7684\u95ee\u9898\u3002 \u3010\u603b\u7ed3\u3011 \u4ee5\u4e0a\u51e0\u79cd\u65b9\u6cd5\uff0c\u5404\u6709\u4f18\u7f3a\u70b9\uff0c\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff1a \uff081\uff09\u5982\u679c\u9700\u8981\u5728Jenkins\u4e2d\u505a\u6301\u7eed\u96c6\u6210\uff0c\u5efa\u8bae\u4f7f\u7528\u7b2c\u4e8c\u79cd\u4efb\u52a1\u680f\u542f\u52a8\u7684\u65b9\u6cd5\u3002 \uff082\uff09\u5982\u679c\u4e0d\u4f1a\u91c7\u7528\u8fdc\u7a0b\u6267\u884c\u7684\uff0c\u5efa\u8bae\u91c7\u7528\u7b2c\u4e00\u79cd\u6216\u8005\u6700\u540e\u4e00\u79cd\u65b9\u6848\u3002 \uff083\uff09\u7b2c\u4e09\u79cd\u548c\u7b2c\u56db\u79cd\u542f\u52a8\u65b9\u6cd5\uff0c\u901a\u5e38\u5728\u6d4b\u8bd5\u7528\u4f8b\u4e2d\u4f1a\u6d89\u53ca\u5230\uff0c\u6240\u4ee5\u5076\u5c14\u4f1a\u7528\u3002"},{"location":"RELEASE/","title":"\u7248\u672c\u66f4\u65b0\u8bb0\u5f55","text":""},{"location":"RELEASE/#2122023822","title":"2.1.2\uff082023/8/22\uff09","text":"new \u589e\u52a0 OCR \u8bc6\u522b\u81ea\u52a8\u91cd\u8bd5\u673a\u5236\uff0c\u9ed8\u8ba4\u91cd\u8bd5 2 \u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u91cd\u8bd5\u6b21\u6570\uff1b \u4f7f\u7528\u7a97\u7ba1\u6700\u65b0\u63d0\u4f9b\u7684\u4e8c\u8fdb\u5236\u63a5\u53e3\uff0c\u4f18\u5316\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u5728 Wayland \u4e0b\u83b7\u53d6\u7a97\u53e3\u4fe1\u606f\u7684\u65b9\u6cd5\uff1b\u611f\u8c22\u684c\u9762\u6d4b\u8bd5\u90e8 @\u4f55\u6743 @\u5b59\u7fe0 \u3001\u7a97\u7ba1\u7814\u53d1 @\u9ec4\u6cfd\u94ed \u7684\u5927\u529b\u652f\u6301\u3002 \u6269\u5145 skipif \u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\u51fd\u6570\uff1a skipif_xdg_type \u652f\u6301 x11 \u6216 wayland \u4e0a\u8df3\u8fc7\uff1b skipif_cpu_name \u652f\u6301\u4e0d\u540c cpu \u4e0a\u8df3\u8fc7\uff0c\u6bd4\u5982\uff1askipif_cpu_name-KLVVW5821\uff1b "},{"location":"RELEASE/#2102023818","title":"2.1.0\uff082023/8/18\uff09","text":"fix \u4fee\u590d SW \u67b6\u6784\u73af\u5883\u4f9d\u8d56\u7684\u95ee\u9898\uff0c\u539f\u56e0\u662f\u4e4b\u524d\u6211\u8fd9\u91cc\u672c\u5730\u6ca1\u6709 SW \u7684\u673a\u5668\uff0c\u6ca1\u6709\u505a\u76f8\u5173\u9002\u914d\uff1b \u4fee\u590d\u5b50\u9879\u76ee\u5355\u72ec\u9700\u8981\u4e09\u65b9\u5305 pexpect\uff0c\u7531\u4e8e\u4e4b\u524d\u662f\u9884\u88c5\u5230\u955c\u50cf\u91cc\u9762\u7684\uff0c\u4f46\u57fa\u7840\u6846\u67b6\u4e0d\u9700\u8981\uff0c\u56e0\u6b64\u6ca1\u6709\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u91cc\u9762\uff0c\u5bfc\u81f4\u5b50\u9879\u76ee\u4f9d\u8d56\u62a5\u9519\u3002 \u4fee\u590d\u5b50\u9879\u76ee cv \u5bfc\u5165\u62a5\u9519\u7684\u95ee\u9898\uff1b \u539f\u56e0\u4e3a\uff1ayouqu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u517c\u5bb9\u4e24\u79cd\u60c5\u51b5\uff0c\u4e00\u79cd\u662f\u9762\u5411\u670d\u52a1\uff0c\u5c31\u662f\u672c\u5730\u6d4b\u8bd5\u673a\u4e0d\u9700\u8981\u5b89\u88c5 OpenCV\uff0c\u7528\u4f8b\u4e2d\u7684\u56fe\u50cf\u8bc6\u522b\u4f1a\u901a\u8fc7\u8fdc\u7a0b\u670d\u52a1\u63a5\u53e3\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u548c\u7ed3\u679c\u83b7\u53d6\uff1b\u7b2c\u4e8c\u79cd\u662f\u539f\u751f\uff0c\u5c31\u662f\u672c\u5730\u76f4\u63a5\u5b89\u88c5 OpenCV \u76f4\u63a5\u7528\u3002\u4e24\u4e2a\u60c5\u51b5\u7684\u4f18\u5148\u7ea7\u662f\u4f18\u5148\u5224\u65ad\u672c\u5730\u5b58\u5728\uff0c\u5426\u5219\u8d70\u670d\u52a1\u3002 \u524d\u9762\u6211\u4eec\u5df2\u7ecf\u628a OCR \u529f\u80fd\u505a\u4e86\u670d\u52a1\u5316\uff0c\u57fa\u4e8e 1 \u5e74\u591a\u4ee5\u6765\u7684\u89c2\u5bdf\uff0c\u7528\u8d77\u6765\u5f88\u7a33\u5b9a\uff0c\u518d\u4e00\u4e2a\u5c31\u662f OpenCV \u5b89\u88c5\u5305\u662f\u6bd4\u8f83\u81c3\u80bf\u7684\uff0c\u7c97\u7565\u6570\u4e86\u4e0b\u4f9d\u8d56\u6709 30+ \u4e2a\uff0c\u800c\u4e14\u5728\u5404\u67b6\u6784\u4e0a\u4f9d\u8d56\u5305\u8fd8\u4e0d\u5c3d\u76f8\u540c\uff0c\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u65b9\u6848\u4e2d\u4e0d\u592a\u597d\u5904\u7406\uff0c\u6240\u4ee5\u672c\u6b21 2.0 \u7248\u672c\u6211\u4eec\u5927\u80c6\u7684\u5c06\u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u529f\u80fd\u4fee\u6539\u4e3a\u9762\u5411\u670d\u52a1\u7684\u65b9\u5f0f\uff0c\u524d\u671f\u6d4b\u8bd5\u4e00\u5207\u770b\u8d77\u6765\u90fd\u5f88\u548c\u8c10\u3002 \u4f46\u662f\u6ca1\u6ce8\u610f\u5230\u4e4b\u524d\u7ed9\u6d77\u71d5\u59d0\u90a3\u8fb9\u9879\u76ee\u5355\u72ec\u5b9a\u5236\u505a\u4e86\u4e2a\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\uff08\u4e3a\u4e86\u80fd\u7b80\u5355\u5e73\u6ed1\u7684\u8fc1\u79fb\u5230 youqu\uff09\uff0c\u6b64\u63a5\u53e3\u5e95\u5c42\u6ca1\u6709\u517c\u5bb9\u670d\u52a1\u5316\uff0c\u6240\u4ee5\u5979\u90a3\u8fb9\u7684\u9879\u76ee\u8c03\u7528\u6b64\u5b9a\u5236\u63a5\u53e3\u4f1a\u62a5 cv \u5bfc\u5165\u7684\u95ee\u9898\u3002 \u7531\u4e8e\u5c06\u8fd9\u4e2a\u5b9a\u5236\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\u8fdb\u884c\u670d\u52a1\u5316\u517c\u5bb9\u6539\u9020\u9700\u8981\u4e00\u5b9a\u65f6\u95f4\uff0c\u6539\u5b8c\u8fd8\u9700\u8981\u6d4b\u8bd5\uff0c\u4f46\u672c\u6b21\u65f6\u95f4\u6bd4\u8f83\u7d27\uff0c\u56e0\u6b64\u5148\u628a OpenCV \u88c5\u8fdb\u865a\u62df\u73af\u5883\uff0c\u540e\u7eed\u7248\u672c\u518d\u8003\u8651\u9488\u5bf9\u6b64\u63a5\u53e3\u505a\u4fee\u6539\u3002"},{"location":"RELEASE/#2002023816","title":"2.0.0\uff082023/8/16\uff09","text":"YouQu\uff08\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff09\u5f00\u6e90\u4e86\uff0c\u540c\u65f6\u63a8\u51fa\u4e86 2.0 \u7248\u672c\u3002 \u611f\u8c22\u738b\u6ce2\u603b\u3001\u67b6\u6784\u5e08\u5f90\u5c0f\u4e1c\u3001\u7814\u53d1\u7ecf\u7406\u90d1\u5e7c\u6208\u3001\u5218\u90d1\u7b49\u7814\u53d1\u540c\u4e8b\u7684\u5927\u529b\u652f\u6301\u3002 new 1\u3001\u65b0\u7684\u57fa\u7840\u6846\u67b6\u4ee3\u7801\u83b7\u53d6\u65b9\u5f0f\u53ca\u65b0\u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4 YouQu \u540e\u7eed\u5747\u901a\u8fc7 PyPI \u8fdb\u884c\u5305\u7684\u53d1\u5e03\uff0c\u4e5f\u5c31\u662f\u8bf4\u540e\u7eed\u53ef\u4ee5\u4f7f\u7528 pip \u8fdb\u884c\u5b89\u88c5\uff1a sudo pip3 install youqu==2.0.0\n \u8fd9\u91cc\u6709 2 \u4e2a\u5c0f\u70b9\u8981\u6ce8\u610f\uff1a \u63a8\u8350\u4f7f\u7528 sudo pip3 \uff08\u52a0 sudo\uff09\u8fdb\u884c\u5b89\u88c5\uff1b \u5982\u679c\u4e0d\u52a0 sudo \u6709\u4e9b\u673a\u5668\u53ef\u80fd $HOME/.local/bin \u4e0d\u5728\u7cfb\u7edf PATH \u73af\u5883\u76ee\u5f55\u4e0b\uff0c\u5728\u4e0d\u6dfb\u52a0\u73af\u5883\u53d8\u91cf\u7684\u60c5\u51b5\u4e0b\uff0c\u4f1a\u51fa\u73b0 YouQu \u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4\uff08youqu-startproject\uff09\u65e0\u6cd5\u4f7f\u7528\u7684\u95ee\u9898\uff1b \u5f53\u7136\uff0c\u5c06\u4e0a\u8ff0\u8def\u5f84\u6dfb\u52a0\u5230\u73af\u5883\u53d8\u91cf\u4e4b\u540e\u4e5f\u662f\u53ef\u4ee5\u7528\u7684\uff0c\u6240\u4ee5\u6211\u8fd9\u91cc\u662f\u63a8\u8350\u52a0 sudo\uff0c\u4e0d\u52a0 sudo \u4e5f\u662f\u53ef\u4ee5\u7684\uff0c\u53ea\u662f\u9700\u8981\u5173\u6ce8\u4e0b\u73af\u5883\u53d8\u91cf\u7684\u95ee\u9898\u3002 \u63a8\u8350\u6307\u5b9a\u7248\u672c\u53f7\uff08youqu==2.0.0\uff09\u5b89\u88c5\uff0c\u5982\u679c\u4e0d\u6307\u5b9a\u7248\u672c\u53f7\u9ed8\u8ba4\u662f\u5b89\u88c5\u6700\u65b0\u53d1\u5e03\u7684 YouQu \u7248\u672c\uff0c\u4f60\u53ef\u4ee5\u5728 PyPI \u4e0a\u7684 Release history \u91cc\u9762\u67e5\u770b\u6709\u54ea\u4e9b\u7248\u672c\u3002 \u5b89\u88c5\u4e4b\u540e\u4f1a\u81ea\u52a8\u751f\u6210\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu-startproject\uff0c\u4f7f\u7528\u5b83\u53ef\u4ee5\u521d\u59cb\u5316\u5de5\u7a0b\uff0c\u8fd9\u91cc\u4ee5\u97f3\u4e50\u4e3e\u4f8b\uff1b youqu-startproject autotest_deepin_music\n \u8fd9\u6837\u5c31\u4f1a\u5728\u5f53\u524d\u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a autotest_deepin_music \u76ee\u5f55\uff0c\u91cc\u9762\u5305\u542b\u4e86\u57fa\u7840\u6846\u67b6\u6240\u6709\u7684\u4ee3\u7801\uff1b \u4e4b\u540e\uff0c\u8fd8\u662f\u5728 apps \u76ee\u5f55\u4e0b\uff0c\u653e\u5165\u5b50\u9879\u76ee\u7684AT\u4ee3\u7801\u5373\u53ef\uff0c\u4f7f\u7528\u65b9\u6cd5\u548c\u8fc7\u53bb\u4e00\u6837\uff0c\u8fd9\u91cc\u5c31\u4e0d\u591a\u4ecb\u7ecd\u3002 \u53e6\u5916\uff0c\u9664\u4e86\u901a\u8fc7 pip \u83b7\u53d6\u4ee5\u5916\uff0c\u4ecd\u7136\u53ef\u4ee5\u901a\u8fc7\u6e90\u7801\u83b7\u53d6\uff08\u76f4\u63a5 git clone\uff09\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u4f7f\u7528 pip \u5b89\u88c5 YouQu \u65f6\uff0cYouQu \u5305\u7684\u5927\u5c0f\u624d 600+ k\uff0c\u5b89\u88c5\u901f\u5ea6\u8d77\u98de\u3002 2\u3001\u65b0\u7684AT\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848 \u4e3a\u4e86\u89e3\u51b3\u4ee5\u4e0b\u95ee\u9898\uff1a \u8fc7\u53bb\u4e00\u6bb5\u65f6\u95f4\u54b1\u4eec\u7ecf\u5e38\u51fa\u73b0\u7684\uff0c\u4e0d\u540c\u7684AT\u9879\u76ee\u5728\u540c\u4e00\u53f0\u673a\u5668\u4e0a\u90e8\u7f72\u73af\u5883\u65f6\u4f9d\u8d56\u7248\u672c\u51b2\u7a81\u7684\u95ee\u9898\uff0c\u65b0\u65b9\u6848\u4e0d\u540c\u7684\u9879\u76ee\u4f1a\u52a8\u6001\u751f\u6210\u81ea\u5df1\u7684\u865a\u62df\u73af\u5883\uff0c\u76f8\u4e92\u4e4b\u95f4\u4e0d\u5f71\u54cd\uff1b \u4e1a\u5185\u4e3a\u4e86\u89e3\u51b3\u7248\u672c\u51b2\u7a81\u95ee\u9898\u4e00\u822c\u90fd\u4f1a\u4f7f\u7528Python\u865a\u62df\u73af\u5883\u7684\u5de5\u5177\uff0c\u4f46\u662f\u90fd\u6709\u4e2a\u95ee\u9898\uff0c\u65e0\u6cd5\u7ba1\u7406 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u5305\uff0c\u672c\u6b21\u6211\u4eec\u89e3\u51b3\u4e86\u8fd9\u4e2a\u95ee\u9898\uff0c\u80fd\u591f\u5b8c\u5168\u7ba1\u7406\u5e38\u89c4\u7684Python\u5305\uff0c\u4e5f\u80fd\u7ba1\u7406\u5230 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u4e09\u65b9\u5305\uff1b \u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u4f7f\u7528\u65b9\u6cd5\uff1a bash env.sh\n \u53ef\u4ee5\u770b\u51fa\u6765\u548c\u539f\u6765\u4f7f\u7528\u65b9\u6cd5\u6ca1\u6709\u53d8\u5316\uff0c\u4e5f\u5c31\u662f\u8bf4\u4ece\u4f7f\u7528\u7684\u89d2\u5ea6\u662f\u5b8c\u5168\u6ca1\u6709\u533a\u522b\u7684\uff0c\u53ea\u662f\u5185\u90e8\u505a\u4e86\u4e0d\u540c\u7684\u4e8b\u60c5\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u672c\u673a\u90e8\u7f72\u7684\u529f\u80fd\u4ecd\u7136\u4fdd\u7559 env_dev.sh\uff0c\u53ef\u4ee5\u4f5c\u4e3a\u5f00\u53d1\u65f6\u7684\u73af\u5883\u90e8\u7f72\u3002 3\u3001\u65b0\u7684\u9a71\u52a8\u547d\u4ee4 \u8fc7\u53bb\u54b1\u4eec\u90fd\u662f\u4f7f\u7528\u8fd9\u6837\u7684\u547d\u4ee4\u6765\u9a71\u52a8\u6267\u884c\uff1a python3 manage.py run\n \u7531\u4e8e\u9ed8\u8ba4\u57fa\u4e8e\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848\uff0c\u56e0\u6b64\u6211\u4eec\u589e\u52a0\u4e86\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu\uff1b \u65b0\u7684\u9a71\u52a8\u65b9\u5f0f\uff1a youqu manage.py run\n \u53ea\u9700\u8981\u628a python3 \u66ff\u6362\u6210 youqu \u5c31\u53ef\u4ee5\u4e86\uff0c\u770b\u8d77\u6765\u5f88\u548c\u8c10~ 4\u3001\u65b0\u7684\u6587\u6863\u5730\u5740 \u8fc7\u53bb\u54b1\u4eec YouQu \u7684\u5728\u7ebf\u6587\u6863\u662f\u90e8\u7f72\u5728\u516c\u53f8\u5185\u7f51\u7684\uff0c\u73b0\u5728\u5f00\u6e90\u5230 github \u4e86\uff0c\u5916\u90e8\u5f00\u53d1\u8005\u80af\u5b9a\u8bbf\u95ee\u4e0d\u5230\u5185\u7f51\u7684\u6587\u6863\uff0c\u56e0\u6b64\u9700\u8981\u5c06\u6587\u6863\u90e8\u7f72\u5230\u516c\u7f51\u3010\u516c\u7f51\u6587\u6863\u3011\uff1b \u516c\u7f51\u6587\u6863\u4f7f\u7528\u7684\u662f github pages\uff08\u767d\u5ad6\u602a\u4e00\u987f\u72c2\u559c~~\uff09\uff0c\u4f46\u53ef\u80fd\u4f1a\u51fa\u73b0\u6587\u6863\u901f\u5ea6\u6162\u7684\u95ee\u9898\uff08\u4ee3\u7406\u4e0b\u5c31\u597d\u4e86\uff09\uff0c\u4e0d\u8fc7\u6ca1\u5173\u7cfb\uff0c\u54b1\u4eec\u3010\u5185\u7f51\u6587\u6863\u3011\u4ecd\u7136\u4fdd\u7559\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u3002 5\u3001\u5176\u4ed6\u4e00\u4e9b\u5c0f\u5c0f\u529f\u80fd\u66f4\u65b0\uff1a \uff081\uff09\u65b0\u589e\u5173\u95ed\u5206\u8fa8\u7387\u68c0\u6d4b\u7684\u53c2\u6570\u503c\uff1b youqu manage.py run --resolution no\n \u6216\u8005\u4fee\u6539 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387, \u6bd4\u5982\uff1a1920x1080\n;no: \u8868\u793a\u4e0d\u505a\u5206\u8fa8\u7387\u6821\u9a8c\nRESOLUTION = 1920x1080\n resolution \u8fd9\u4e2a\u53c2\u6570\u4e00\u76f4\u90fd\u6709\u7684\uff0c\u53ea\u4e0d\u8fc7\u4e4b\u524d\u662f\u7528\u4e8e\u6307\u5b9a\u5206\u8fa8\u7387\u5927\u5c0f\uff0c\u6bd4\u5982 --resolution 1920x1080\uff0c\u4f46\u6709\u4e9b\u63a5\u53e3\u7684\u9879\u76ee\u4e0d\u9700\u8981\u8fd9\u4e2a\u68c0\u67e5\uff0c\u53ef\u4ee5\u7ed9\u5b83\u4e2a no \u5c31\u597d\u4e86\uff0c\u5f53\u7136 CICD \u4e0a\u5173\u95ed\uff0c\u9700\u8981\u6d41\u6c34\u7ebf\u4e0a\u628a\u8fd9\u4e2a\u53c2\u6570\u52a0\u4e0a\uff1b \uff082\uff09\u65b0\u589e\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u7684\u547d\u4ee4\u884c\u53c2\u6570 \u4e4b\u524d\u8fd9\u4e2a\u914d\u7f6e\u9879\u53ea\u80fd\u5728 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c 1 \u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff0cRERUN >= RECORD_FAILED_CASE\u3002\n;1.\u5173\u95ed\u5f55\u5c4f\uff1aRECORD_FAILED_CASE > RERUN\n;2.\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1aRECORD_FAILED_CASE = 0\nRECORD_FAILED_CASE = 1\n \u73b0\u5728\u5c06\u5f00\u53d1\u5230\u547d\u4ee4\u884c\u53c2\u6570\u3002 youqu manage.py run --record_failed_case 2\n fix \u4fee\u590d remote \u6267\u884c\u65f6\uff0c\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u65e0\u6cd5\u751f\u6210\u6d4b\u8bd5\u62a5\u544a\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1302023710","title":"1.3.0\uff082023/7/10\uff09","text":"fix \u8fdb\u4e00\u6b65\u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b\u53c2\u8003\uff1a\u914d\u7f6ePython\u6e90\u7684\u51e0\u79cd\u65b9\u6cd5 \u4fee\u590d wayland_autotool \u53d7\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86wayland\u4e0b\u5076\u73b0\u627e\u4e0d\u5230 .Xauthority \u6587\u4ef6\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1292023626","title":"1.2.9\uff082023/6/26\uff09","text":"fix \u4f18\u5316\u8fdc\u7a0b\u6267\u884c remote \u7684\u53c2\u6570\u76f4\u63a5\u4f20\u7ed9\u8fdc\u7a0b\u673a\u5668\u7684 run \u547d\u4ee4\uff0c\u4e0d\u7528\u518d\u5355\u72ec\u5904\u7406\u8fdc\u7a0b\u6267\u884c\u7684\u53c2\u6570\u903b\u8f91\uff0c\u540e\u7eed\u4e13\u6ce8\u4e8e\u672c\u5730\u6267\u884c\u529f\u80fd\u5f00\u53d1\uff0c\u8fdc\u7a0b\u6267\u884c\u81ea\u52a8\u9002\u7528\uff1b env.sh \u79fb\u9664 pyyaml \u5b89\u88c5\uff0c\u7531\u5b50\u9879\u76ee\u5728 requirement.txt \u91cc\u9762\u5b9a\u4e49\uff0c\u6846\u67b6\u81ea\u52a8\u52a0\u8f7d\uff1b \u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b "},{"location":"RELEASE/#128202369","title":"1.2.8\uff082023/6/9\uff09","text":"fix \u4fee\u590d\u4e86 pypi \u5b89\u88c5 numpy \u5b58\u5728\u7cfb\u7edf\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#127202368","title":"1.2.7\uff082023/6/8\uff09","text":"fix env.sh \u4e2d\u5b89\u88c5 Python \u5305\u672a\u6307\u5b9a\u7248\u672c\u65f6\uff0c\u65e5\u5fd7\u8f93\u51fa\u5b89\u88c5\u7684\u7248\u672c\uff1b pdocr-rpc 2.0.1\nallure-custom 1.2.1\nfunnylog 1.1.3\n \u4fee\u590d -f \u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u62a5\u9519\u7684\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#126202367","title":"1.2.6\uff082023/6/7\uff09","text":"fix \u4fee\u590d wayland \u4e0a\u8c03\u7528\u9f20\u6807\u4e2d\u952e\u3001\u53f3\u952e\u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b \u4fee\u590d pubilic/dde_desktop_public_widget \u91cc\u9762\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u5b9a\u4f4d\u684c\u9762\u6587\u4ef6\u7684\u65b9\u6cd5\uff0c\u5750\u6807\u6ca1\u6709\u62c6\u5305\u7684\u95ee\u9898\uff1b \u4f18\u5316\u4e86\u7b49\u5f85\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b pycreeze \u7248\u672c\u5347\u7ea7\u5230 0.1.29\uff0c\u5bfc\u81f4\u4e0e pyautogui 0.9.53 \u4e0d\u517c\u5bb9\uff0cenv.sh \u91cc\u9762\u589e\u52a0\u6307\u5b9a pycreeze \u7248\u672c\u4e3a 0.1.28\uff1b "},{"location":"RELEASE/#1252023516","title":"1.2.5\uff082023/5/16\uff09","text":"new --app \u53c2\u6570\u540e\u9762\u65b0\u589e\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u76ee\u524d\u652f\u6301\u4e09\u79cd\u53c2\u6570\u4f20\u5165\u65b9\u5f0f\uff1a ~$: youqu run -a deepin-music\n~$: youqu run -a autotest_deepin_music\n~$: youqu run -a apps/autotest_deepin_music\n \u200b \u540e\u4e24\u79cd\u5165\u53c2\u65b9\u5f0f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\u3002 remote \u8fdc\u7a0b\u6267\u884c\u65b0\u589e\u4ece\u547d\u4ee4\u884c\u4f20\u5165\u6d4b\u8bd5\u673a\u4fe1\u606f\uff0c\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679c password \u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6 setting/remote.ini \u4e2d CLIENT_PASSWORD \u7684\u503c,\u6bd4\u5982\uff1auos@10.8.13.33:1 \u6216 uos@10.8.13.33 \uff1b python3 manage.py remote -c uos@10.8.13.33/uos@10.8.13.34\npython3 manage.py remote -c uos@10.8.13.33:1/uos@10.8.13.34:2\n fix \u65e5\u5fd7\u6a21\u5757\u4fee\u6539\u4e3a\u51fd\u6570\u6267\u884c\u4e4b\u524d\u6253\u5370\u65e5\u5fd7\uff1b \u65e5\u5fd7\u6a21\u5757\u589e\u52a0\u767d\u540d\u5355\uff0c\u901a\u8fc7\u7c7b\u540d\u5f00\u5934\uff0c\u7ed3\u675f\uff0c\u5305\u542b\u7b49\u5173\u952e\u5b57\u63a7\u5236\u9700\u8981\u6253\u5370\u7684\u51fd\u6570\u65e5\u5fd7\uff1b \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5982\u679c\u4f20\u5165\u4e86 app_name \u53ea\u4f1a\u5c06 apps \u76ee\u5f55\u4e0b app_name \u7684\u76ee\u5f55\u53d1\u9001\u5230\u6d4b\u8bd5\u673a\uff1b env.sh \u79fb\u9664 python3-dev\uff1b \u4fee\u590d Wayland \u4e0b env.sh \u73af\u5883\u5b89\u88c5\u5931\u8d25\u7684\u95ee\u9898\uff0c\u4f18\u5316\u4e86 deb \u4f9d\u8d56\u5b89\u88c5\u7684\u903b\u8f91\uff1b \u5c06 env.sh \u5237\u65b0\u6e90\u7684\u65e5\u5fd7\u5728\u7ec8\u7aef\u663e\u793a\uff0c\u89e3\u51b3\u5728 CI \u73af\u5883\u4e0b\uff0c\u957f\u65f6\u95f4\u4e0d\u8f93\u51fa\u65e5\u5fd7\u8fde\u63a5\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d1060 \u534e\u4e3a\u673a\u578b\u5b89\u88c5\u952e\u9f20\u5de5\u5177\u65f6\u4f9d\u8d56\u4e0d\u517c\u5bb9\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1242023227","title":"1.2.4\uff082023/2/27\uff09","text":"fix \u4fee\u6539 CURRENT \u6587\u4ef6\uff1b "},{"location":"RELEASE/#1232023227","title":"1.2.3\uff082023/2/27\uff09","text":"new pylint.sh \u652f\u6301\u901a\u8fc7\u4f4d\u7f6e\u53c2\u6570\u4f20\u5165\u6587\u4ef6\u8def\u5f84\uff1abash pylint.sh apps/autotest_deepin_music,\u597d\u5904\u662f\u53c2\u6570\u8def\u5f84\u53ef\u4ee5\u5728\u7ec8\u7aef\u8865\u5168\uff1b \u65b0\u589e\u7cfb\u7edf\u547d\u4ee4 youqu-pylint \uff0c\u7528\u4e8e\u9759\u6001\u4ee3\u7801\u626b\u63cf\uff0c\u4f7f\u7528\u65b9\u6cd5: youqu-pylint apps/autotest_deepin_music\uff1b \u7531\u4e8e\u7cfb\u7edf\u4e00\u4e9b dbus \u63a5\u53e3\u6539\u53d8\uff0c\u516c\u5171\u5e93\u4e2d\u7684 dbus \u65b9\u6cd5\u5c06\u4e0d\u518d\u7ef4\u62a4\uff0c\u7531\u5b50\u9879\u76ee\u5728 other_widget.py \u91cc\u9762\u8fdb\u884c\u7ef4\u62a4\uff1b fix \u4fee\u590d ssh \u73af\u5883\u4e0b\u8fd0\u884c\u63d0\u793a \u201c\u65e0\u6cd5\u8fde\u63a5\u201d \u7684\u95ee\u9898\uff1b \u4fee\u590d\u8fd0\u884c\u65f6\u7a0b\u5e8f\u9000\u51fa\uff0c\u4e0d\u8f93\u51fa\u5f02\u5e38\u65e5\u5fd7\u7684\u95ee\u9898\uff1b \u4fee\u590dyouqu remote xxx \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5728\u670d\u52a1\u7aef Ctrl + C \u65e0\u6cd5\u505c\u6b62\u7a0b\u5e8f\u8fd0\u884c\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#122202328","title":"1.2.2\uff082023/2/8\uff09","text":"new \u65b0\u589e\u6c14\u6ce1\u7c7b\u56fe\u50cf\u8bc6\u522b\u65b9\u6848\uff1bimage_utils.py::ImageUtil::get_during\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u533a\u57df\u8bc6\u522b\uff0c\u4f20\u5165 [x, y, w, h]\uff0cx: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u76ee\u6807\u56fe\u7247\uff0c\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\uff1b env.sh \u79fb\u9664 pypinyin; \u4f18\u5316\u6267\u884c env.sh \u65f6\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b manage.py \u79fb\u9664\u4e86\u53c2\u6570 session_timeout \uff0c\u6846\u67b6\u6839\u636e\u5168\u5c40\u7684 timeout \u4ee5\u53ca\u7528\u4f8b\u81ea\u5b9a\u4e49\u7684 timeout \u81ea\u52a8\u8ba1\u7b97\u51fa sessiontimeout \u7684\u503c\uff1b \u65b0\u589e ocr \u670d\u52a1\u5668\u94fe\u63a5\u91cd\u8bd5\uff0c\u9ed8\u8ba4\u91cd\u8bd51\u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u53c2\u6570\uff1b fix \u4fee\u590d\u4e86\u4e00\u4e9b pylint \u626b\u63cf\u7684\u4ee3\u7801\u98ce\u683c\u95ee\u9898\uff1b \u91cd\u65b0\u8bbe\u8ba1\u4e86\u6d4b\u8bd5\u62a5\u544a\u4e3b\u9898\uff1b "},{"location":"RELEASE/#121202316","title":"1.2.1\uff082023/1/6\uff09","text":"new \u652f\u6301\u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6267\u884c\u7528\u4f8b\uff1b\u53ef\u5c06python3 manage.py \u66ff\u6362\u4e3a youqu \uff1a youqu run -a deepin-music -k 001\n RPC \u670d\u52a1 IP \u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u6307\u5b9a\u4e0d\u540c\u7684\u7aef\u53e3\uff1b \u5728\u7ebf\u6587\u6863\u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u539f\u6765\u7684\u5730\u5740 10.8.10.215 \u5c06\u4e0d\u5728\u4f7f\u7528\uff1b fix \u4fee\u590d --count \u53c2\u6570\u53ef\u80fd\u51fa\u73b0\u4e0e\u5176\u4ed6\u6846\u67b6\u7684\u5de5\u7a0b\u4f9d\u8d56\u5b58\u5728\u51b2\u7a81\uff0c\u62a5\u9519\u91cd\u590d\u6ce8\u518c\u7684\u95ee\u9898\uff1b \u4fee\u590d CI \u73af\u5883\u4e0b\u591a\u4e2a\u5de5\u7a0b\u5b58\u5728 Python \u73af\u5883\u53d8\u91cf\u6307\u5411\u9519\u8bef\uff0c\u5bfc\u5305\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u5355\u72ec\u8fd0\u884c\u65b9\u6cd5\u65f6\u65e0\u65e5\u5fd7\u8f93\u51fa\u7684 Bug\uff1b "},{"location":"RELEASE/#12020221230","title":"1.2.0\uff082022/12/30\uff09","text":"1.1.4 \u7248\u672c\u9002\u914d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e14\u65b0\u589e\u4e86\u8f83\u591a\u65b0\u7279\u6027\uff0c\u6211\u4eec\u8ba1\u5212\u4f7f\u7528 1.1.4 \u7248\u672c\u8fd0\u884c\u4e00\u6bb5\u65f6\u95f4\uff0c1.2.0 \u7248\u672c\u5c06\u4fee\u590d\u671f\u95f4\u51fa\u73b0\u7684 Bug\uff0c\u7136\u540e\u4f5c\u4e3a\u7a33\u5b9a\u7248\u672c\u53d1\u5e03\u3002 new \u4fee\u6539\u5de5\u7a0b\u540d\u79f0\u4e3a youqu\uff1b \u5c06 sphinx \u6587\u6863\u5de5\u7a0b\u8fc1\u79fb\u5230\u5355\u72ec\u7684\u4ed3\u5e93\uff1b fix \u4fee\u590d startapp \u521b\u5efa\u5de5\u7a0b\u65f6\u5b58\u5728\u5de5\u7a0b\u540d\u79f0\u65f6\u65e0\u6cd5\u7ee7\u7eed\u521b\u5efa\uff1b \u4fee\u590d\u4e86 OCR \u670d\u52a1\u5728\u5e76\u53d1\u65f6\u53ef\u80fd\u51fa\u73b0\u65e0\u6cd5\u8fd4\u56de\u7ed3\u679c\u7684\u95ee\u9898\uff0c\u63d0\u5347 OCR \u670d\u52a1\u9ad8\u5e76\u53d1\u7a33\u5b9a\u6027\uff1b \u4fee\u590d PMS \u540c\u6b65\u6807\u7b7e\u5230 CSV \u6587\u4ef6\u4e0d\u652f\u6301\u7528\u4f8b\u5e93\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11420221214","title":"1.1.4\uff082022/12/14\uff09","text":"new \u65b0\u589e startapp \u5b50\u547d\u4ee4\u521b\u5efa\u5b50\u9879\u76ee\u5de5\u7a0b\u6a21\u677f: python3 manage.py startapp autotest_deepin_xxx \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u91cd\u590d\u6267\u884c\u6b21\u6570\uff1b \u53bb\u6389\u6279\u91cf\u6267\u884c\u524d\u6536\u96c6\u7528\u4f8b\u7684\u6b65\u9aa4\uff1b \u589e\u52a0\u5f00\u59cb\u6267\u884c\u65f6\u6253\u5370\u4e00\u4e9b\u6267\u884c\u53c2\u6570\uff0c\u5982\uff1a \u7528\u4f8b\u6536\u96c6\u6570\u91cf: 99\n\u5931\u8d25\u91cd\u8dd1\u6b21\u6570: 1\n\u6700\u5927\u5931\u8d25\u6b21\u6570: 49\n\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4: 200.0s (03\u520620\u79d2)\n\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4: 11880s (3\u5c0f\u65f618\u52060\u79d2)\n \u5b9a\u5236\u4fee\u6539allure\u62a5\u544alogo\u3001title\u3001\u9ed8\u8ba4\u8bed\u8a00\uff1b manage.py \u6267\u884c\u5f00\u59cb\u65f6\u6253\u5370 logo \u548c\u5f53\u524d\u7248\u672c\uff1a \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u255a\u2588\u2588\u2557 \u2588\u2588\u2554\u255d \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2584\u2584 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2580\u2580\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u2584\u2588 \u2584\u2588 \u2588 \u2588 \u2588 \u2584 \u2588 \u2584 \u2580\u2580\u2588 \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\uff1b \u88c5\u9970\u5668\u65b9\u6cd5\u6307\u5b9a\u6b21\u6570\uff1b @pytest.mark.count(2)\ndef test_music_001():\npass\n \u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u6b21\u6570\uff1b python3 manage.py run -a deepin-music -k 001 --count 2\n \u200b image_utils \u589e\u52a0\u51fd\u6570 save_temporary_picture\uff0c\u652f\u6301\u6307\u5b9a\u5c4f\u5e55\u533a\u57df\u622a\u56fe\u5e76\u8fd4\u56de\u56fe\u7247\u5b58\u653e\u7684\u672c\u5730\u8def\u5f84\uff0c\u540e\u7eed\u4f7f\u7528 assert_image_exist \u8fdb\u884c\u65ad\u8a00 Python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(x, y, width, height) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) button_center \u65b0\u589e btn_size \u83b7\u53d6\u63a7\u4ef6\u5de6\u4e0a\u89d2\u5750\u6807\u53ca\u957f\u5bbd\uff0c\u7528\u4e8e\u52a8\u6001\u7684\u622a\u53d6\u5143\u7d20\u7684\u56fe\u7247\uff0c\u53ef\u7528\u4e8e\u5b9a\u4f4d\u65ad\u8a00 python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u6240\u6709\u97f3\u4e50\u6309\u94ae\")) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) allure \u62a5\u544a\u4e2d\u5b9a\u4f4d\u95ee\u9898\u9664\u4e86\u65e5\u5fd7\u3001\u622a\u56fe\u3001\u5f55\u5c4f\u5916\uff0c\u8c03\u7528\u7684\u51fd\u6570\u589e\u52a0\u4e86 step \u6b65\u9aa4\u5c55\u793a\uff1b env.sh \u65b0\u589e\u5b89\u88c5\u5b50\u9879\u76ee Python \u4e09\u65b9\u4f9d\u8d56\uff0c\u5728\u5b50\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u5199 requirement.txt \u6587\u4ef6\uff0cenv.sh \u4f1a\u81ea\u52a8\u52a0\u8f7d\uff1b ocr \u8bc6\u522b\u65b0\u589e\u652f\u6301\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\u8fdb\u884c\u6587\u5b57\u8bc6\u522b\uff0c\u51cf\u5c11\u56e0\u5168\u5c4f\u8bc6\u522b\u65f6\uff0c\u5176\u4ed6\u6587\u5b57\u7684\u5e72\u6270 Python # \u65ad\u8a00\u97f3\u4e50\u7684\u5220\u9664\u5f39\u7a97\u4e2d\uff0c\u5305\u542b\u4e86\u201c\u786e\u8ba4\u201d\u7684\u6587\u5b57 self.assert_ocr_exist(\"\u786e\u8ba4\", picture_abspath=DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u5220\u9664\u5f39\u7a97\"))) \u65ad\u8a00\u51fd\u6570\u7684\u8c03\u7528\u4e5f\u4f1a\u81ea\u52a8\u6253\u5370\u65e5\u5fd7; env.sh \u65b0\u589e\u88c1\u526a\u4f9d\u8d56\u7684\u65b9\u6848\uff1b fix \u4fee\u590d Jenkins \u73af\u5883\u4e0b\uff0c apps \u76ee\u5f55\u4e0b\u5b50\u9879\u76ee\u5b58\u5728 auotest_deepin_xxx@tmp \u76ee\u5f55\uff0c\u5728\u4f20\u5165 app_name \u540e\u65e0\u6cd5\u6267\u884c\u7528\u4f8b\u7684\u95ee\u9898\uff1b \u4fee\u590d\u81ea\u52a8\u751f\u6210 case_list.csv \u6587\u4ef6\u65f6\uff0c\u7528\u4f8b\u987a\u5e8f\u88ab\u8c03\u6574\u7684\u95ee\u9898\uff1b env.sh \u73af\u5883\u5b89\u88c5\u79fb\u9664 git \u548c curl\uff1b \u4fee\u590d\u7528\u4f8b\u5728 setup \u9636\u6bb5\u62a5\u9519\u540e\uff0c\u672a\u5199\u5165 ci_result.json \u7684\u95ee\u9898\uff1b \u79fb\u9664 uos_ci.py\uff1b "},{"location":"RELEASE/#11320221028","title":"1.1.3\uff082022/10/28\uff09","text":"new \u65b0\u589e\u56fe\u50cf\u65ad\u8a00\u6210\u529f\u8f93\u51fa\u5339\u914d\u5ea6\uff1b \u65b0\u589e\u73af\u5883\u5b89\u88c5 yaml \u4f9d\u8d56\uff1b \u65b0\u589e\u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6570\u636e\u56de\u586b\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b \u65b0\u589e\u6d4b\u8bd5\u7ed3\u679c\u8868\u60c5\u663e\u793a\uff0c\u5e76\u4f18\u5316\u4e86\u65e5\u5fd7\u7684\u6392\u7248\uff1b \u65b0\u589e --top {number} \u7528\u4e8e\u8bb0\u5f55\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0c\u65e5\u5fd7\u751f\u6210\u5230 report/logs/top.log\uff1b fix \u4fee\u590d\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4f46\u7ec8\u7aef\u6ca1\u6709\u9519\u8bef\u65e5\u5fd7\u8f93\u51fa\u7684\u95ee\u9898\uff1b \u4fee\u6539\u5931\u8d25\u7528\u4f8b\u56de\u6eaf\u65e5\u5fd7\u4e3a\u8be6\u7ec6\u7ea7\u522b\uff1b \u4fee\u590d\u4e86\u6267\u884c\u8fdb\u5ea6\u672a\u8ba1\u7b97\u8df3\u8fc7\u7528\u4f8b\u7684\u95ee\u9898\uff0c\u5e76\u4f18\u5316\u4e86\u8fdb\u5ea6\u83b7\u53d6\u7684\u7b97\u6cd5\uff1b \u4fee\u590d env.sh \u5728 V23 \u73af\u5883\u4e0b\u5b89\u88c5\u65e0\u6cd5\u8bfb\u53d6\u5bc6\u7801\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 pms \u6d4b\u8bd5\u5957\u6267\u884c\u6216\u6d4b\u8bd5\u5355\u6267\u884c\u65f6\uff0c\u7528\u4f8bID\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b env.sh \u91cc\u9762 hub.deepin.com \u66f4\u6362\u6210 it.uniontech.com\uff1b uos_ci.py \u6d4b\u8bd5\u7ed3\u679c\u7edf\u8ba1\u65f6\uff0c\u603b\u6570\u5254\u9664 skip \u7684\u6570\u91cf "},{"location":"RELEASE/#11220220921","title":"1.1.2\uff082022/09/21\uff09","text":"new \u5728\u6ca1\u6709\u5b89\u88c5 dogtail \u7684\u60c5\u51b5\u4e0b\uff0c\u4e5f\u80fd\u4f7f\u7528 sniff \u5de5\u5177\uff1b fix \u4fee\u590d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e2d\u6ca1\u6709\u5b89\u88c5 AT \u73af\u5883\u6267\u884c uos_ci.py \u62a5\u9519\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11120220919","title":"1.1.1\uff082022/09/19\uff09","text":"new \u65b0\u589e\u6267\u884c\u8fdb\u5ea6\u663e\u793a\uff0c\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u65f6\u65e5\u5fd7\u8f93\u51fa\u5f53\u524d\u8fdb\u5ea6\uff1a[\u5f53\u524d\u6307\u5b9a\u7b2c\u51e0\u6761/\u7528\u4f8b\u603b\u6570]\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u7528\u4f8b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\u6240\u6709\u5931\u8d25\u7528\u4f8b\u7684\u5217\u8868\uff1b \u5173\u95ed\u7ec8\u7aef\u8f93\u51fa\u6355\u83b7\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u65e5\u5fd7\u5feb\u7167\uff1b \u4f18\u5316\u7ec8\u7aef\u8f93\u51fa\u5931\u8d25\u4fe1\u606f\u5197\u957f\u4e3a\u7b80\u8981\u4fe1\u606f\u8f93\u51fa\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u663e\u793a 10 \u4e2a\u6267\u884c\u6700\u6162\u7684\u7528\u4f8b\u5217\u8868\uff0c\u5e76\u8be6\u7ec6\u5217\u51fa\u5404\u4e2a\u9636\u6bb5\u7684\u8017\u65f6\uff1b \u5931\u8d25\u91cd\u8dd1\u7528\u4f8b\u91cd\u8dd1\u4e4b\u524d\u5ef6\u8fdf 1 \u79d2\uff1b \u65b0\u589e\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4ecd\u7136\u5f3a\u5236\u6267\u884c\uff1b \u7528\u4f8b\u6536\u96c6\u65f6\u4ec5\u5728 apps \u76ee\u5f55\u4e0b\u8fdb\u884c\uff0c\u5ffd\u7565 src,setting,public \u76ee\u5f55\uff1b \u65b0\u589e allure \u62a5\u544a\u5907\u4efd\u529f\u80fd\uff0c\u9ed8\u8ba4\u5907\u4efd\u81f3 allure_back \u76ee\u5f55\u4e0b\uff1b manage.py\u65b0\u589e\u53c2\u6570 --lastfailed \u7528\u4e8e\u53ea\u8dd1\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\u7684\u529f\u80fd\uff1b fix \u4fee\u590d\u4e86\u5728\u6ca1\u6709\u6307\u5b9a\u5e94\u7528\u540d\u79f0\u6267\u884c\u65f6\uff0cxml \u62a5\u544a\u751f\u6210\u8def\u5f84\u5f02\u5e38\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 uos_ci.py \u4f20\u5165 timeout \u548c session_timeout \u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11020220916","title":"1.1.0\uff082022/09/16\uff09","text":"new \u65b0\u589ePMS\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u652f\u6301\u591a\u79cd\u6570\u636e\u56de\u586b\u6a21\u5f0f\uff1b \u4f18\u5316\u4e86\u901a\u8fc7\u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u65f6PMS \u722c\u866b\u7684\u6027\u80fd\uff1b \u65b0\u589e .gitmodules \u6587\u4ef6\uff0c\u7528\u4e8e\u6807\u8bb0\u6240\u6709\u5b50\u9879\u76ee\uff0c\u65b9\u4fbf\u7edf\u4e00\u62c9\u53d6\u4ee3\u7801\uff1b env.sh \u9002\u914d\u793e\u533a\u7248\u4e0a\u5b89\u88c5\u81ea\u52a8\u5316\u73af\u5883\uff1b \u589e\u52a0\u6267\u884c\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u9519\u8bef\u7684\u529f\u80fd\uff1b README.md \u589e\u52a0 Wayland \u4e0b\u4f7f\u7528\u3001\u6d4b\u8bd5\u62a5\u544a\u67e5\u770b\u3001\u5e38\u89c1\u95ee\u9898\u7b49\u7684\u6587\u6863\u8bf4\u660e\uff1b \u589e\u52a0\u4e86\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u5bf9 setup\u3001call\u3001teardown \u8fdb\u884c\u65e5\u5fd7\u5206\u6bb5\uff1b fix \u4fee\u590d\u4e86 \u786e\u8ba4\u4fee\u590d \u5217\u6ca1\u5199\u8868\u5934\uff0c\u4f46\u5199\u4e86 fixed-xxx \u6807\u7b7e\uff0c\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u540c\u4e00\u5e94\u7528\u5185\u591a\u4e2a csv \u6587\u4ef6\u4e2d \u786e\u8ba4\u4fee\u590d \u5217\u6709\u7684\u5199\u4e86\uff0c\u6709\u7684\u6ca1\u5199\uff0c\u53ef\u80fd\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 INFO \u65e5\u5fd7\uff0c\u663e\u793a\u4e3a DEBUG \u7684\u95ee\u9898\uff1b\u4fee\u590d\u4e86\u90e8\u5206\u673a\u5668\u4e0a INFO \u65e5\u5fd7\u5185\u5bb9\u663e\u793a\u4e3a\u7ea2\u8272\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\u770b\u4e0d\u5230\u8be6\u7ec6\u4fe1\u606f\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10220220822","title":"1.0.2\uff082022/08/22\uff09","text":"new \u79fb\u9664 loguru\uff0c\u66ff\u6362\u4e3a logging\uff0c\u63a5\u53e3\u4fdd\u6301\u4e0d\u53d8\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u53d7\u5f71\u54cd\uff1b \u9ed8\u8ba4\u5f00\u542f coredump\uff1b fix \u4fee\u590d\u4e86\u4e09\u65b9\u5e93 loguru \u5076\u73b0\u5f02\u5e38\uff0c\u5bfc\u81f4\u7a0b\u5e8f\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7b2c\u4e00\u6b21\u5931\u8d25\u4e0d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10120220812","title":"1.0.1\uff082022/08/12\uff09","text":"new \u65b0\u589e RELEASE.md \u6587\u4ef6\uff0c\u7528\u4e8e\u8bb0\u5f55\u5386\u53f2\u53d1\u5e03\u7248\u672c\u7684\u66f4\u65b0\u5185\u5bb9\uff1b \u517c\u5bb9 Wayland \u6a21\u5f0f\u4e0b\u6267\u884c\u7528\u4f8b\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u7528\u7ba1\u5f53\u524d\u6d4b\u8bd5\u673a\u6267\u884c\u73af\u5883\uff0c\u6846\u67b6\u4f1a\u81ea\u52a8\u6839\u636e\u5f53\u524d\u73af\u5883\u8d70\u4e0d\u540c\u7684\u4ee3\u7801\u903b\u8f91\uff1b \u7531\u4e8e\u9700\u8981\u4fee\u6539 dogtail \u6e90\u4ee3\u7801\uff0c\u56e0\u6b64\u5c06\u4fee\u6539\u540e\u7684\u6e90\u7801\u653e\u5165\u5230\u6838\u5fc3\u5e93\u91cc\u9762 src/depends/dogtail \u540e\u7eed\u7248\u672c\u5c06\u4e0d\u9700\u8981\u5728\u7cfb\u7edf\u4e2d\u5b89\u88c5dogtail\uff1b \u5982\u679c\u5e94\u7528\u5e93\u540c\u6837\u4f7f\u7528\u4e86\u7cfb\u7edf\u5b89\u88c5\u7684 dogtail \u53ef\u80fd\u4f1a\u62a5\u9519\uff0c\u89e3\u51b3\u65b9\u6848\u662f\u5c06\u4ee3\u7801\u4e2d\u7684 import dogtail \u4fee\u6539\u4e3a from src.depends import dogtail ; fix \u91cd\u8dd1\u5931\u8d25\u4e4b\u540e\u624d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff0c\u4fee\u6539\u4e3a\u5931\u8d25\u4e4b\u540e\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":"# Attribution \uff1achengdu Test Team\n# Date \uff1a2021/08/20\n \u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d \u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d \u4ed3\u5e93\u5730\u5740\uff1ahttps://gitlabcd.uniontech.com/autotest/cd-desktop-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u65b9\u6848\u6982\u8ff0","text":"\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u667a\u80fd\u8bc6\u522b\u5e94\u7528\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u7528\u4e8e\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u64cd\u4f5c\u8fc7\u7a0b\u4e2d\u7684\u5143\u7d20\u5b9a\u4f4d\u4ee5\u53ca\u5224\u65ad\u7ed3\u679c\u65f6\u7684\u65ad\u8a00\u5904\u7406\uff1b\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\uff0c\u6d4b\u8bd5\u673a\u4e0a\u7684\u753b\u9762\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u5230\u670d\u52a1\u5668\u4e0a\uff0c\u670d\u52a1\u5668\u5bf9\u89c6\u9891\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\u540e\uff0c\u670d\u52a1\u5668\u667a\u80fd\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\u6210\u529f\uff0c\u7136\u540e\u5bf9\u6d4b\u8bd5\u673a\u4e0b\u53d1\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\uff0c\u6d4b\u8bd5\u673a\u63a5\u53d7\u5e76\u6267\u884c\u4e0b\u4e00\u6b65\u64cd\u4f5c\u3002 \u670d\u52a1\u5668\u4e0e\u6d4b\u8bd5\u673a\u4e4b\u95f4\u7684\u94fe\u63a5\uff1a \u670d\u52a1\u5668\u901a\u8fc7 USB \u4e32\u53e3\u8bbe\u5907\uff08USB-HID \u534f\u8bae\uff09\u6a21\u62df\u9f20\u6807\u952e\u76d8\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u64cd\u4f5c\u3002 \u901a\u8fc7\u89c6\u9891\u91c7\u96c6\u8bbe\u5907\u6355\u83b7\u6d4b\u8bd5\u673a\u7684\u5b9e\u65f6\u753b\u9762\u4f20\u8f93\u7ed9\u670d\u52a1\u5668\u3002 \u670d\u52a1\u5668\u5bf9\u91c7\u96c6\u7684\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\uff0c\u8bc6\u522b\u5176\u4e2d\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5e76\u8fd4\u56de\u5143\u7d20\u63a7\u4ef6\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\uff0c\u670d\u52a1\u5668\u901a\u8fc7\u667a\u80fd\u5316\u5206\u6790\uff0c\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e00\u81f4\u5c06\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\u901a\u8fc7\u4e32\u53e3\u6a21\u62df\u952e\u9f20\u4fe1\u53f7\u53d1\u9001\u7ed9\u6d4b\u8bd5\u673a\uff1b\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e0d\u4e00\u81f4\u5c06\u4f1a\u8fdb\u5165\u4e2d\u65ad\u5904\u7406\u53ca\u5f02\u5e38\u7ed3\u679c\u8f93\u51fa\uff0c\u7ee7\u7eed\u6267\u884c\u540e\u7eed\u573a\u666f\uff0c\u76f4\u81f3\u6240\u6709\u7528\u4f8b\u6d4b\u8bd5\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u6df1\u5ea6\u5b66\u4e60\u73af\u5883\u642d\u5efa","text":"\u6a21\u578b\u8bad\u7ec3\u4e3b\u8981\u5bf9 GPU \u6709\u8981\u6c42\uff0c\u8bad\u7ec3\u6a21\u578b\u7684\u673a\u5668\u663e\u5b58\u4e0d\u4f4e\u4e8e 6G\uff0c\u5176\u4ed6\u914d\u7f6e\u65e0\u7279\u6b8a\u8981\u6c42\u3002 \u63a8\u8350\u6027\u4ef7\u6bd4\u8f83\u9ad8\u914d\u7f6e \u64cd\u4f5c\u7cfb\u7edf: UnionTech OS Desktop 20 Professional Linux version 4.19.0-desktop-amd64 (deepin@deepin-PC) (Uos 8.3.0.3-3+rebuild) \u5904\u7406\u5668: Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz (\u516b\u6838 / \u5341\u516d\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460M-HDV(RD)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))/8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: TU116 [GeForce GTX 1660]\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u865a\u62df\u73af\u5883\u5b89\u88c5","text":"cd ~\nwget -c https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh\nbash Miniconda3-latest-Linux-x86_64.sh\n \u4e00\u8def\u56de\u8f66 \u7b2c\u4e00\u6b21\u63d0\u793a\u8f93\u5165 yes/no \uff1a\u8f93\u5165 yes \u7ee7\u7eed\u4e00\u8def\u56de\u8f66 \u7b2c\u4e8c\u6b21\u63d0\u793a\uff1a\u8f93\u5165 no cd ~/miniconda3/bin\nsudo chmod 777 activate\n \u6fc0\u6d3bconda\u73af\u5883 . ./activate\n \u6dfb\u52a0\u516c\u53f8\u5185\u7f51\u6e90 conda config --add channels bioconda\nconda config --add channels conda-forge\n \u5982\u679c\u662f\u5916\u7f51\u6dfb\u52a0\u5916\u7f51\u6e90 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/\n \u5982\u679c\u8981\u5220\u9664\u6e90 conda config --remove-key channels\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"2\u3001\u5b89\u88c5\u4f9d\u8d56","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u521b\u5efa\u865a\u62df\u73af\u5883","text":"conda remove --name mmlab --all # \u79fb\u9664\u6240\u6709\u865a\u62df\u73af\u5883\n conda create -n mmlab python=3.7\n conda activate mmlab\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-pytorch","title":"\uff082\uff09\u5b89\u88c5 Pytorch","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install torch==1.7.0+cu101 torchvision==0.8.1+cu101 torchaudio==0.7.0 -f https://download.pytorch.org/whl/torch_stable.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-mmcv","title":"\uff083\uff09\u5b89\u88c5 MMCV","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install mmcv-full==1.3.3 -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.7.0/index.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"\uff084\uff09\u5b89\u88c5\u663e\u5361\u9a71\u52a8","text":"\u6839\u636e\u4f60\u7684\u663e\u5361\u4e0b\u8f7d\u5bf9\u5e94\u9a71\u52a8\uff0c\u6bd4\u5982\u6211\u7684\u663e\u5361\u4e3a GTX1660\uff0c\u9a71\u52a8\u7248\u672c\u4e3a 430\uff0c\u9a71\u52a8\u4e0b\u8f7d\u5730\u5740\uff1ahttps://www.nvidia.cn/Download/Find.aspx?lang=cn CTRL+ALT+F2 \u8fdb\u5165tty\n \u7981\u7528 nouveau \u9a71\u52a8 sudo vim /etc/modprobe.d/blacklist-nouveau.conf\n \u586b\u5165\uff1a blacklist nouveau options nouveau modeset=0\n \u5237\u65b0\u914d\u7f6e\u6587\u4ef6 sudo update-initramfs -u reboot \u91cd\u542f\u540e\u518d\u8fdb\u5165 tty \u5173\u95ed\u56fe\u50cf\u754c\u9762\uff0c\u8f93\u5165\u547d\u4ee4\u5173\u95ed\u56fe\u50cf\u754c\u9762 sudo service lightdm stop\n \u5b89\u88c5\u9a71\u52a8 sudo chmod a+x NVIDIA-Linux-x86_64-430.run\nsudo ./NVIDIA-Linux-x86_64-430.run\n reboot\u91cd\u542f\uff0cnvidia-smi\u67e5\u770b\u5b89\u88c5\u72b6\u6001\u3002\u6ce8\u610f\u770b\u4e0bcuda\u7248\u672c\uff0c10.1\uff0cdriver\u7248\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u6570\u636e\u6807\u6ce8","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u6570\u636e\u6807\u6ce8","text":"\u6807\u6ce8\u4e4b\u524d\u9700\u8981\u5148\u8f6c\u6362\u56fe\u7247\u5927\u5c0f\uff0c\u5e76\u4e14\u4ee5\u6570\u5b57\u547d\u540d\uff0c\u6bcf\u7ec4\u547d\u540d\u9012\u589e"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"\uff081\uff09\u8f6c\u6362\u5927\u5c0f\u5e76\u91cd\u547d\u540d","text":"rename_pic.py import os\nimport sys\nimport cv2\nimport time\nimport getpass\nusername = getpass.getuser()\nsource_path = f\"/home/{username}/Desktop/right_menu\" # \u56fe\u7247\u8def\u5f84\nsource_dest = os.path.join('/'.join(source_path.split(\"/\")[:-1]), 'tmp')\nif not os.path.exists(source_dest):\nos.mkdir(source_dest)\nstart_name = sys.argv[1]\nfile_name_list = list()\nfor file in os.listdir(source_path):\nif file.endswith('.png'):\nfile_name_list.append(file)\nstart_name = int(start_name)\nfor file in file_name_list:\nos.rename(os.path.join(source_path,file), os.path.join(source_path, f\"{str(start_name)}.png\"))\nstart_name += 1\ntime.sleep(1)\nfor file in os.listdir(source_path):\nimage = os.path.join(source_path, str(file))\nsrc = cv2.imread(image)\nresult = cv2.resize(src, (960, 540))\nresizeImage = os.path.join(source_dest, str(file))\nprint(resizeImage)\ncv2.imwrite(str(resizeImage), result)\ncv2.waitKey(0)\ncv2.destroyAllWindows()\ntime.sleep(1)\nos.system(f'rm -rf {source_path}/*')\nos.system(f'mv {source_dest}/* {source_path}')\nos.system(f'rm -rf {source_dest}')\nprint(\"\u4e0b\u4e00\u4e2a\u5e8f\u53f7\uff1a\", start_name)\n \u6839\u636e\u7ec8\u7aef\u8f93\u51fa\u7684\u4e0b\u4e00\u4e2a\u5e8f\u53f7\u7684\u63d0\u793a\uff0c\u6267\u884c Python \u6587\u4ef6\u7684\u65f6\u5019\u4f20\u53c2\u3002 python rename_pic.py 249\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"\uff082\uff09\u5de5\u5177\u6807\u6ce8","text":"\u4f7f\u7528\u5de5\u5177 labelImg \u6807\u6ce8 sudo pip3 install PyQt5==5.13\nsudo pip3 install labelImg\n \u7ec8\u7aef\u76f4\u63a5\u8f93\u5165 labelImg\uff0c\u56de\u8f66 \u6807\u6ce8\u6a21\u5f0f\u9009\u62e9\uff1aPascalVOC"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u667a\u80fd\u6807\u6ce8","text":"\u6253\u5f00\u5c4f\u5e55\u5f55\u5236\u8f6f\u4ef6\uff0c\u5f55\u5236\u624b\u52a8\u64cd\u4f5c\u4e00\u6b21\u6d4b\u8bd5\u7528\u4f8b\uff0c\u7136\u540e\u5c06\u5f55\u5236\u7684\u89c6\u9891\u8fdb\u884c\u5206\u5e27\uff0c\u7136\u540e\u5bf9\u6bd4\u524d\u4e24\u5e27\u56fe\u6807\u76f8\u4f3c\u5ea6\uff0c\u5254\u9664\u76f8\u4f3c\u5ea6\u8fc7\u9ad8\u7684\u56fe\u7247\uff0c\u5728\u4fdd\u8bc1\u7d20\u6750\u591a\u6837\u6027\u7684\u524d\u63d0\u4e0b\uff0c\u5254\u9664\u91cd\u590d\u591a\u4f59\u7684\u56fe\u7247\u751f\u6210\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u96c6\uff0c\u7136\u540e\u53d6\u51fa\u63a7\u4ef6\u6a21\u677f\u6570\u636e\u96c6\uff0c\u901a\u8fc7 OpenCV \u6a21\u677f\u5339\u914d\u83b7\u53d6\u63a7\u4ef6\u5728\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u56fe\u7247\u4e2d\u6240\u5728\u7684\u5de6\u4e0a\u3001\u5de6\u4e0b\u3001\u53f3\u4e0a\u3001\u53f3\u4e0b\u56db\u5904\u5750\u6807\uff0c\u4ece\u800c\u6839\u636e\u6a21\u677f\u6570\u636e\u96c6\u751f\u6210\u6807\u6ce8\u6570\u636e\u3002\u53c2\u8003\u76ee\u5f55 AnnotationMaterial"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"\uff081\uff09\u6a21\u677f\u6570\u636e\u96c6\u51c6\u5907","text":"1\u3001\u5728\u754c\u9762\u622a\u53d6\u9700\u8981\u6807\u6ce8\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u653e\u5728\u76ee\u5f55\u4e0b AnnotationMaterial/template/img 2\u3001\u7ef4\u62a4\u63a7\u4ef6\u540d\u4e0e\u5143\u7d20\u63a7\u4ef6\u7684\u952e\u5bf9\uff0c\u4e00\u4e2a\u63a7\u4ef6\u540d\u53ef\u5bf9\u5e94\u591a\u4e2a\u5143\u7d20\u63a7\u4ef6 menu:\n- menu.jpg\n- menu1.jpg\n- menu2.jpg\n- menu3.jpg\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"\uff082\uff09\u7d20\u6750\u96c6\u51c6\u5907","text":"\u5f55\u5236\u89c6\u9891\u6216\u6216\u5c4f\u5e55\u622a\u56fe\u653e\u7f6e\u76ee\u5f55 AnnotationMaterial/source"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u5f00\u59cb\u6807\u6ce8","text":"python3 AnnotationMaterial/main.py\n \u751f\u6210\u7684\u6807\u6ce8\u6570\u636e\u5b58\u653e\u5728 AnnotationMaterial/result"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#mmdetection","title":"\u56db\u3001MMDetection","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1-mmdetection","title":"1\u3001 MMDetection \u4ee3\u7801","text":"MMDetection \u662f\u4e00\u4e2a\u6709\u540d\u7684\u6df1\u5ea6\u5b66\u4e60\u76ee\u6807\u68c0\u6d4b\u5f00\u6e90\u9879\u76ee\uff0c\u4e5f\u662f openMMlab \u7684\u62db\u724c\u9879\u76ee\uff0c\u4e3a\u4ec0\u4e48\u9009\u62e9\u5b83\uff0c\u5c0f\u5b69\u513f\u6ca1\u5a18\u8bf4\u6765\u8bdd\u957f\uff0c\u611f\u5174\u8da3\u53ef\u4ee5\u81ea\u884c\u6df1\u5165\u4e86\u89e3\uff1b \u4f60\u53ef\u4ee5\u76f4\u63a5\u5728 GitHub \u4e0a\u514b\u9686\u4ee3\u7801\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u54b1\u4eec\u4ed3\u5e93\u4e0b Train \u76ee\u5f55\u4e2d\u4ee3\u7801\uff0cTrain \u4e2d\u7684\u4ee3\u7801\u4e5f\u662f\u4ece GitHub \u4e0a\u62c9\u53d6\u7684\uff0c\u4e0d\u8fc7\u6211\u4eec\u6839\u636e\u9879\u76ee\u9700\u8981\u505a\u4e86\u4e00\u4e9b\u4e8c\u6b21\u5f00\u53d1\uff0c\u63a8\u8350\u76f4\u63a5\u4f7f\u7528\u5b83\u3002 \u5982\u679c\u4f60\u60f3\u4ece GitHub \u4e0a\u62c9\uff1a git clone https://github.com/open-mmlab/mmdetection.git\n# \u4e0d\u80fd\u76f4\u63a5\u62c9\u53d6\u4e3b\u5206\u652f\uff0c\u5efa\u8bae\u4f7f\u75282.12\u7248\u672c\uff0c\u4e0d\u540c\u7684\u7248\u672c\u5bf9\u5e94\u7684mmcv\u7248\u672c\u662f\u4e0d\u540c\u7684\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-voc2coco","title":"2\u3001\u62c9\u53d6 voc2coco \u4ee3\u7801","text":"git clone https://github.com/Tony607/voc2coco.git\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-coco","title":"3\u3001\u8f6c\u6362 coco \u6570\u636e\u96c6","text":"\u5c06\u6240\u6709\u7684\u56fe\u7247\u548cxml\u6587\u4ef6\u653e\u5165train2017\uff0c\u4ece\u4e2d\u6311\u9009\u51e0\u7ec4\u653e\u5165val2017\uff08\u6d4b\u8bd5\u96c6\uff09 cd mmdetection/data/coco\npython voc2coco.py train2017 annotations/instances_train2017.json\npython voc2coco.py val2017 annotations/instances_val2017.json\n \u751f\u6210json\u6587\u4ef6"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4_1","title":"4\u3001\u4fee\u6539\u914d\u7f6e","text":"\uff081\uff09\u8bfb\u53d6\u6a21\u578b\u540d\u79f0 import json\nmodule_name = []\nwith open('./instances_train2017.json', \"r+\") as f:\njson_file = f.read()\njson_dict = json.loads(json_file)\nmodule_list = json_dict.get('categories')\nfor module_info in module_list:\nname = module_info.get('name')\nmodule_name.append(name)\nprint(module_name)\nprint(\"module_num:\", len(module_name))\n # \u6ce8\u610f\u5bf9\u6bd4instances_train2017.json\u91cc\u9762\u6a21\u578b\u540d\u79f0\u7684\u987a\u5e8f\uff0c\u4e0eCLASSES\u548ccoco_classes\u91cc\u9762\u7684\u987a\u5e8f\u4fdd\u6301\u4e00\u81f4\u3002\n \uff082\uff09\u4fee\u6539 faster_rcnn_r101_2x_coco.py mmdetection/xianjin/faster_rcnn_r101_2x_coco.py \u4fee\u653946\u884c\uff0cnum_clasess\u7684\u503c\uff0c\u65b0\u589e1\u4e2a\uff0c\u5c31 +1\uff1b \uff083\uff09\u4fee\u6539 coco.py mmdetection/mmdet/datasets/coco.py CLASSES = ()\uff0c\u5728\u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b \uff084\uff09\u4fee\u6539 class_names.py mmdetection/mmdet/core/evaluation/class_names.py coco_classes \u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#5","title":"5\u3001\u7f13\u5b58\u6e05\u7406","text":"\u5220\u9664 mmdetection/build \u76ee\u5f55 python setup.py install\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#6","title":"6\u3001\u8bad\u7ec3\u6a21\u578b","text":"\uff081\uff09\u6307\u5b9a\u81ea\u5df1\u914d\u7f6e\u7684\u8bad\u7ec3\u6a21\u578b\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py --gpus 1\n \uff082\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u6d4b\u8bd5\u96c6\u7ed3\u679c\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py xianjin/epoch_24.pth --show\n \uff083\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u51c6\u786e\u5ea6\uff1b python tools/analysis_tools/analyze_logs.py plot_curve xianjin/20210530_011907.log.json --keys acc\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#7","title":"7\u3001\u5feb\u6377\u64cd\u4f5c","text":"python3 run.py\n \u5c06\u4ee5\u4e0a 4 - 7 \u6b65\u64cd\u4f5c\u6574\u5408\u6210 run.py\uff0c\u4e00\u952e\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u4e94\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\uff1b \u670d\u52a1\u7aef\u4e00\u53f0\uff08\u76ee\u524d\u4ec5\u652f\u6301AMD\u67b6\u6784\uff09\uff1b \u91c7\u96c6\u76d2\u4e00\u4e2a \uff08ACASIS hdmi\u89c6\u9891\u91c7\u96c6\u5361\uff0chttps://item.jd.com/10024310742602.html \uff09\uff1b USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\uff1b USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff1b \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5USB\u5ef6\u957f\u7ebf\uff1b \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u63a8\u8350\u914d\u7f6e","text":"\u6267\u884c\u7528\u4f8b\u7684\u670d\u52a1\u7aef\u5bf9\u914d\u7f6e\u6ca1\u6709\u7279\u6b8a\u8981\u6c42\uff0c\u5982\u679c\u6761\u4ef6\u5141\u8bb8\u914d\u7f6e\u8d8a\u9ad8\uff0c\u8bc6\u522b\u901f\u5ea6\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n \u6d4b\u8bd5\u673a\u4e0a\u4e0d\u6267\u884c\u4efb\u4f55\u811a\u672c\uff0c\u5177\u4f53\u914d\u7f6e\u6839\u636e\u6d4b\u8bd5\u9700\u8981\u51b3\u5b9a\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#usb_mk","title":"\u516d\u3001USB_MK\u4e32\u53e3\u9a71\u52a8\u65b9\u6cd5","text":"\u4f4d\u4e8econtrol_method\u76ee\u5f55\u4e0b\u7684usb_mk.py\u6587\u4ef6 \uff081\uff09\u5217\u51fa\u53ef\u901a\u4fe1\u7684\u7aef\u53e3 python3 -m serial.tools.list_ports -v\n \uff082\uff09\u4fee\u6539\u4e32\u53e3\u7684\u6743\u9650 sudo chmod 777 /dev/ttyACM0\n \uff083\uff09\u5b9e\u4f8b\u5316USB_MK import UsbMk\nusb_mk = UsbMk(\"/dev/ttyACM0\", 9600) # \u8bbe\u5907\u9ed8\u8ba49600\u4e3a\u6ce2\u7279\u7387\uff0c\u63a7\u5236\u4f20\u8f93\u901f\u7387\n \uff084\uff09USB\u4e32\u53e3\u8bbe\u5907\u9ed8\u8ba4\u6ce2\u7279\u7387\u4e3a9600\uff08\u7ecf\u6d4b\u8bd5\u6ce2\u7279\u73879600\u51c6\u786e\u6027\u6700\u597d\uff09\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up() # \u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u6c49\u5b57\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e\n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff083\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff084\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff085\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() # \u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2\n \uff086\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff087\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff088\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e03\u3001\u65b9\u6cd5\u8c03\u7528\u5165\u53c2\u89c4\u5219","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_7","title":"1\u3001\u57fa\u7c7b","text":"class Base:\ndef __init__(self):\nself._obj = image\nself._usb = usb_mk\ndef find_element_by_ai(self, element):\nreturn self._obj.find_element(element)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_6","title":"2\u3001\u5165\u53c2\u8bf4\u660e","text":"\u56fe\u50cf\u8bc6\u522b\u65b9\u6cd5\u5165\u53e3\u4e3a Base \u7c7b\u4e0b\u7684 find_element_by_ai \u3002\u4ec5\u63a5\u53d7\u4e00\u4e2a\u53c2\u6570 element\uff0c\u7c7b\u578b\u4e3a string\u3002 \u53ef\u8bc6\u522b\u7684 string \u683c\u5f0f\uff1a \uff081\uff09\u5927\u56fe\u6807\uff08 \u56fe\u6807\u5927\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\uff0c\u4f8b\uff1a Base().find_element_by_ai(\"window\")\n \uff082\uff09\u5927\u56fe\u6807 / \u5c0f\u56fe\u6807\uff08\u56fe\u6807\u5c0f\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5c0f\u56fe\u6807\uff0c\u4f8b\uff1awindow/search_btn Base().find_element_by_ai(\"window/search_btn\")\n \uff083\uff09\u5927\u56fe\u6807 / OCR\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\u5185\u7684\u6587\u5b57\uff0c\u4f8b\uff1amenu/\u5c5e\u6027 Base().find_element_by_ai(\"menu/\u5c5e\u6027\")\n \uff084\uff09OCR\uff1a\u5168\u5c4f\u8bc6\u522b\u6587\u5b57 Base().find_element_by_ai(\"\u641c\u7d22\")\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516b\u3001\u9690\u85cf\u9f20\u6807","text":"\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u8fc7\u6765\u7684\u89c6\u9891\u6d41\uff0c\u5728\u8bc6\u522b\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u53d7\u5230\u9f20\u6807\u5f71\u54cd\uff0c\u56e0\u6b64\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u9690\u85cf\u9f20\u6807\u3002 \u5c4f\u853d\u9f20\u6807\u5149\u6807\u663e\u793a ```shell script /etc/lightdm/lightdm.conf \u5728`[Seat:*]`\u4e0b\u9762\u6dfb\u52a0\u53c2\u6570\n```shell script\nxserver-command=X -bs -core -nocursor\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e5d\u3001\u667a\u80fd\u81ea\u52a8\u5316\u7684\u610f\u4e49","text":"1\u3001\u6539\u5584 Acessibility \u5b9a\u4f4d\u7684\u7a33\u5b9a\u6027\u95ee\u9898 Acessibility \u5c5e\u6027\u5b9a\u4f4d\u5b58\u5728\u5076\u5c14\u5931\u6548\u7684\u60c5\u51b5 \uff081\uff09\u5f00\u53d1\u5728\u505a\u65b0\u9700\u6c42\u5f00\u53d1\u65f6\u53ef\u80fd\u6d89\u53ca\u5230\u5bf9\u5c5e\u6027\u6807\u7b7e\u7684\u4fee\u6539\u6216\u8005\u5c42\u7ea7\u7684\u8c03\u6574\uff0c\u53ef\u80fd\u9020\u6210\u81ea\u52a8\u5316\u7528\u4f8b\u65e0\u6cd5\u5b9a\u4f4d\u5230\u5143\u7d20\u3002 \u6bd4\u59821040\u9636\u6bb5\uff0c\u97f3\u4e50\u91cd\u6784\u7684\u65f6\u5019\uff0c\u5f00\u53d1\u5bf9\u90e8\u5206\u5c5e\u6027\u548c\u5c42\u7ea7\u505a\u4e86\u4fee\u6539\uff0c\u5bfc\u81f4\u81ea\u52a8\u5316\u7528\u4f8b\u5b9a\u4f4d\u65b9\u6cd580%\u9700\u8981\u4fee\u6539\u3002 \u5f00\u53d1\u65b0\u529f\u80fd\u7684\u65f6\u5019\u5076\u5c14\u4e5f\u4f1a\u5bf9\u5c5e\u6027\u505a\u8c03\u6574\uff0c\u9047\u52305\u6b21\u3002 \uff082\uff09\u76ee\u524d\u4e3b\u8981\u4f7f\u7528Dogtail\u8bc6\u522b\u5e94\u7528Acessibility\u5c5e\u6027\u8fdb\u884c\u5b9a\u4f4d\uff0c\u662f\u83b7\u53d6\u5e94\u7528\u5f53\u524d\u754c\u9762\u7684\u5c5e\u6027tree\uff0c\u5728\u5e94\u7528\u8df3\u8f6c\u540e\uff0cDogtail\u5b58\u5728\u65e0\u6cd5\u53ca\u65f6\u83b7\u53d6\u5f53\u524d\u5c5e\u6027\u5217\u8868\u7684\u60c5\u51b5\u3002 \u591a\u5a92\u4f53\u8c03\u7528\u6587\u7ba1\u7a97\u53e3\u7684\u65f6\u5019\uff0c\u51fa\u73b0\u627e\u4e0d\u5230\u6587\u7ba1\u91cc\u9762\u5143\u7d20\u7684\u60c5\u51b5\uff0c\u76ee\u524d\u51fa\u73b010+\u6b21\u3002 \u5e94\u7528\u8bbe\u7f6e\u9875\u9762\u7684\u5c5e\u6027\u5076\u5c14\u5b58\u5728\u627e\u4e0d\u5230\u7684\u60c5\u51b5\uff0c\u9047\u52305\u6b21\u3002 \uff083\uff09Dogtail\u5de5\u5177\u672c\u8eab\u5b58\u5728\u95ee\u9898\uff0c\u6709\u65f6\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u5019\u5f88\u6162\uff0c\u8ba9\u4eba\u65e0\u6cd5\u63a5\u53d7\uff0c\u76ee\u524d\u51fa\u73b0\u8fc7\u5f88\u591a\u6b21\u3002 \u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u95f4\u6bd4\u5e73\u5e38\u61623\u500d\uff0c\u51fa\u73b04\u6b21\u3002 2\u3001\u89e3\u51b3\u4e86\u4f7f\u7528\u7edd\u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898 \u90e8\u5206\u63a7\u4ef6\u65e0\u6cd5\u6dfb\u52a0 Acessibility \u5c5e\u6027\u4ece\u800c\u4f7f\u7528\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u51fa\u73b0\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898\u3002 \uff081\uff09\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u65b9\u6cd5\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u76ee\u6807\u56fe\u7247\u8d44\u6e90\uff0c\u5728 UI \u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u4f1a\u6d89\u53ca\u5230\u76ee\u6807\u8d44\u6e90\u7684\u66ff\u6362\uff0c\u6bd4\u8f83\u8017\u8d39\u4eba\u529b\u3002 \uff082\uff09\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6cd5\u5bf9\u6bd4\u7cbe\u5ea6\u6bd4\u8f83\u641e\uff0c\u5982\u679cUI \u7684\u53d8\u66f4\u4f1a\u9020\u6210\u65e0\u6cd5\u51c6\u786e\u5b9a\u4f4d\u5230\uff0c\u81ea\u52a8\u5316\u811a\u672c\u5065\u58ee\u6027\u4e0d\u8db3\u3002 3\u3001\u4f7f\u7528\u673a\u5668\u5206\u79bb\uff0c\u89e3\u51b3\u4e86\u81ea\u52a8\u5316\u811a\u672c\u5bf9\u5e94\u7528\u7684\u5f71\u54cd\uff0c\u771f\u5b9e\u8fd8\u539f\u7528\u6237\u7684\u4f7f\u7528\u573a\u666f \u673a\u5668\u5206\u79bb\u7684\u67b6\u6784\u8bbe\u8ba1\uff0c\u4fdd\u8bc1\u4e86\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u73af\u5883\u5b8c\u5168\u7b49\u540c\u4e8e\u7528\u6237\uff0c\u6392\u9664\u6d4b\u8bd5\u811a\u672c\u7684\u5f71\u54cd\u3002 \uff081\uff09\u76ee\u524d\u7684\u529f\u80fd\u81ea\u52a8\u5316\u662f\u5728\u6d4b\u8bd5\u673a\u4e0a\u76f4\u63a5\u8fd0\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\uff0c\u52a0\u4e0a\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u6211\u4eec\u6dfb\u52a0\u4e86\u4e00\u4e9b\u8fdb\u7a0b\u76d1\u63a7\u3001\u89c6\u9891\u5f55\u5236\u7b49\u529f\u80fd\uff0c\u81ea\u52a8\u5316\u811a\u672c\u672c\u8eab\u4f1a\u6d88\u8017\u4e00\u4e9b\u7cfb\u7edf\u8d44\u6e90\uff0c\u65e0\u6cd5\u8fd8\u539f\u771f\u662f\u7684\u7528\u6237\u4f7f\u7528\u573a\u666f\u3002 \uff082\uff09\u6027\u80fd\u6d4b\u8bd5\u9700\u8981\u6392\u9664\u5176\u4ed6\u7a0b\u5e8f\u7684\u8d44\u6e90\u6d88\u8017\u5f71\u54cd\uff0c\u6027\u80fd\u81ea\u52a8\u5316\u91c7\u7528\u673a\u5668\u5206\u79bb\uff0c\u4fdd\u8bc1\u4e86\u6027\u80fd\u6570\u636e\u7684\u51c6\u786e\u6027\u3002 \u4ee5\u524d\u7684\u7528\u4f8b\u6267\u884c\u8017\u65f6\u6ca1\u6761\u572830\u79d2\u5de6\u53f3\uff0c\u73b0\u5728\u7528\u4f8b\u8017\u65f6\u572810\u79d2\u3002 4\u3001\u89e3\u51b3\u4e86UI \u8c03\u6574\u5bfc\u81f4\u5b9a\u4f4d\u5931\u8d25\u7684\u4e0d\u7a33\u5b9a\u6027\u95ee\u9898 \uff081\uff09\u89e3\u51b3\u4e86\u56e0 UI \u8c03\u6574\u5bfc\u81f4\u63a7\u4ef6\u4f4d\u7f6e\u53d8\u5316\u6216\u8272\u5dee\u53d8\u5316\u540e\u5b9a\u4f4d\u4e0d\u51c6\u786e\u7684\u95ee\u9898\uff0c\u53ea\u8981\u63a7\u4ef6\u6587\u6848\u548c\u63a7\u4ef6\u5916\u8fb9\u6846\u65e0\u53d8\u5316\u5747\u53ef\u51c6\u786e\u5b9a\u4f4d\uff1b \uff082\uff09\u76ee\u524d\u4e5f\u4f1a\u91c7\u7528\u57fa\u4e8eUI\u7684\u5b9a\u4f4d\u65b9\u6848\uff0c\u5982\u679cUI\u4f4d\u7f6e\u6709\u8c03\u6574\uff0c\u4f1a\u5bfc\u81f4\u5143\u7d20\u65e0\u6cd5\u5b9a\u4f4d\u3002 5\u3001\u7b80\u5316\u4e86\u7528\u4f8b\u7ed3\u6784\uff0c\u63d0\u5347\u7f16\u5199\u53cb\u597d\u5ea6 \uff081\uff09\u667a\u80fd\u81ea\u52a8\u5316\u8bc6\u522b\u5143\u7d20\u7684\u65b9\u6cd5\u53ea\u6709\u4e00\u4e2a\uff0c\u5c31\u662f\u57fa\u4e8e\u6211\u4eec\u8bad\u7ec3\u7684\u6a21\u578b\u8bc6\u522b\u89c6\u9891\u6d41\u4e2d\u7684\u5143\u7d20\uff0c\u7ecf\u8fc7\u811a\u672c\u5c01\u88c5\u4e4b\u540e\uff0c\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u4e2d\u6240\u6709\u5b9a\u4f4d\u7684\u64cd\u4f5c\u90fd\u53ea\u9700\u8981\u8c03\u7528\u8fd9\u4e00\u4e2a\u65b9\u6cd5\u5c31\u884c\u4e86\uff0c\u7f16\u5199\u81ea\u52a8\u5316\u811a\u672c\u7684\u96be\u5ea6\u5927\u5927\u964d\u4f4e\u3002 \uff082\uff09\u4e5f\u662f\u7531\u4e8e\u8c03\u7528\u65b9\u6cd5\u7b80\u5355\uff0c\u5728 UI \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u4e2d\u7684\u5206\u5c42\u7ed3\u6784\u5c06\u4f1a\u51cf\u5c11\uff0c\u591a\u7ee7\u627f\u7684\u60c5\u51b5\u4f1a\u51cf\u5c11\uff0c\u81ea\u52a8\u5316\u4ee3\u7801\u7684\u8c03\u7528\u7ed3\u6784\u4e5f\u4f1a\u53d8\u5f97\u7b80\u5355\uff0c\u800c\u4e14\u529f\u80fd\u6d4b\u8bd5\u540c\u5b66\u7f16\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u66f4\u52a0\u5bb9\u6613\u4e0a\u624b\u3002 \u4ee5\u524d\u5199\u7528\u4f8b\u7531\u4e8e\u9700\u8981\u7ed3\u5408\u4e0d\u540c\u7684\u6a21\u5757\uff0c\u8c03\u7528\u4e0d\u540c\u7684\u65b9\u6cd5\uff0c\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u5e76\u5b8c\u6210\u8c03\u8bd5\u7684\u65f6\u95f4\u5e73\u5747\u572820-30\u5206\u949f\uff0c\u73b0\u5728\u5199\u7528\u4f8b\u811a\u672c\u80fd\u57285\u5206\u949f\u5de6\u53f3\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":"# =============================================\n# Attribution : Application Test Department III\n# Time : 2023/1/3\n# Author : ut003281\n# =============================================\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u7b80\u8ff0","text":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5 \u901a\u8fc7\u81ea\u52a8\u5316\u624b\u6bb5\u5bf9\u5e94\u7528\u8fdb\u884c\u6027\u80fd\u6d4b\u8bd5\uff0c\u63d0\u4f9b\u65b9\u4fbf\u7684\u73af\u5883\u90e8\u7f72\u3001\u8fd0\u884c\u914d\u7f6e\u3001\u7528\u4f8b\u7f16\u5199\u7b49\uff0c\u7528\u4e8e\u684c\u9762\u5e94\u7528\u7684\u51b7\u70ed\u542f\u52a8\u3001\u8d44\u6e90\u62f7\u8d1d\u3001\u9875\u9762\u8df3\u8f6c\u7b49\u6027\u80fd\u573a\u666f\u6d4b\u8bd5\u3002 \u4ed3\u5e93\u5730\u5740\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-perf-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u4ee3\u7801\u7ed3\u6784","text":"autotest-perf-aitest\n\u251c\u2500\u2500 apps # \u5b58\u653e\u6240\u6709\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u811a\u672c\n\u251c\u2500\u2500 conftest.py # pytest hook\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 CURRENT # \u7248\u672c\u5185\u5bb9\n\u251c\u2500\u2500 docs # \u6587\u6863\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u952e\u503c\u5bf9\u7167\u8868.pdf # \u4e32\u53e3\u7ebfcode\u4e0e\u6309\u952e\u7684\u5bf9\u7167\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u6027\u80fd\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\u6267\u884c\u5668\u4f7f\u7528\u6307\u5357.md # \u6267\u884c\u5668\u811a\u672c\u4f7f\u7528\u6307\u5357\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 USB\u4e32\u53e3\u8f6cUSB\u952e\u76d8\u9f20\u6807\u7ebf\u534f\u8bae\u6587\u4ef6V1.0.pdf # \u4e32\u53e3\u534f\u8bae\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput-0.28.2.zip # Linux\u4e0b\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\u7684\u6e90\u7801\uff0c\u53ef\u6839\u636e\u67b6\u6784\u6253\u5305\n\u251c\u2500\u2500 manage.py # \u529f\u80fd\u4e3b\u5165\u53e3\n\u251c\u2500\u2500 pytest.ini # pytst \u914d\u7f6e\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 setting # \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 client.ini # \u6d4b\u8bd5\u673a IP \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5168\u5c40\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dev_env.sh # \u5bbf\u4e3b\u673a\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose_no_relay.yml # \u65e0\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose.yml # \u6709\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker_login.sh # docker \u767b\u9646\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 res\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 black.png # \u5168\u9ed1\u56fe\u7247\uff0c\u7528\u4e8e\u4fee\u6539\u58c1\u7eb8\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_5000.deb # 3A5000 \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_amd64.deb # amd \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_arm64.deb # arm \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_mips64.deb # mips \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_sw_64.deb # sw \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 server.ini # \u670d\u52a1\u5668\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 setup.sh # \u5bb9\u5668\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 template # \u521b\u5efa app \u57fa\u7840\u811a\u672c\u6a21\u677f\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 app_template\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ${app_name}_widget.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 control-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 images\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 test_${app_name}_01_scene.json-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 test_${app_name}_01_scene.py-tpl\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 uos_docker # \u5bb9\u5668\u73af\u5883\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dockerfile\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 requirements.txt\n\u2514\u2500\u2500 src\n \u251c\u2500\u2500 analysis_save.py # \u89e3\u6790\u56fe\u7247\u6d41\u7ed3\u679c\uff0c\u6c47\u603b\u751f\u6210 excel \u62a5\u544a\n\u251c\u2500\u2500 base_widget.py # \u5c01\u88c5\u7684\u57fa\u7840\u64cd\u4f5c\uff0c\u5e94\u7528\u8c03\u7528\u7684\u4e3b\u5165\u53e3\u65b9\u6cd5\n\u251c\u2500\u2500 cmdctl.py # \u8c03\u7528\u547d\u4ee4\u884c\u4f7f\u7528\n\u251c\u2500\u2500 global_value.py # \u5168\u5c40\u53d8\u91cf\n\u251c\u2500\u2500 image_utils.py # \u56fe\u7247\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 __init__.py\n \u251c\u2500\u2500 logger_utils.py # \u65e5\u5fd7\u914d\u7f6e\n\u251c\u2500\u2500 pdocr.py # ocr \u914d\u7f6e\n\u251c\u2500\u2500 public_method.py # \u4e00\u4e9b\u65b9\u4fbf\u7684\u5c01\u4f4f\n\u251c\u2500\u2500 record.py # \u5f55\u5c4f\u76f8\u5173\n\u251c\u2500\u2500 rtk # \u8fd0\u884c\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 _base.py # \u4e00\u4e9b\u679a\u4e3e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 install_env.py # \u5b89\u88c5\u73af\u5883\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 local_runner.py # \u8fd0\u884c\u7528\u4f8b\n\u251c\u2500\u2500 serial_communication # \u4e32\u53e3\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 power_control.py # \u7ee7\u7535\u5668\u64cd\u4f5c\uff0c\u4f7f\u7528\u7ee7\u7535\u5668\u8fde\u63a5\u4e3b\u673a\u7535\u6e90\uff0c\u63a7\u5236\u5f00\u5173\u673a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 serial_common.py # \u4e32\u53e3\u516c\u5171\u65b9\u6cd5\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 usb_mk.py # \u952e\u9f20\u64cd\u4f5c\u57fa\u7840\u5c01\u88c5\n\u251c\u2500\u2500 shortcut_key.py # \u5feb\u6377\u952e\u7684\u5c01\u88c5\n\u251c\u2500\u2500 singleton.py # \u5355\u4f8b\u6a21\u5f0f\n\u251c\u2500\u2500 start_app.py # \u521b\u5efa app\n\u2514\u2500\u2500 write_xlsx.py # \u751f\u6210 excel\n# __init__.py \u6587\u4ef6\u4e3a\u6807\u8bc6\u8be5\u76ee\u5f55\u662f\u4e00\u4e2aPython\u7684\u6a21\u5757\u5305\uff0c\u9879\u76ee\u4e2d\u7684__init__.py\u5747\u4e3a\u7a7a\u6587\u4ef6\u3002\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u73af\u5883\u642d\u5efa","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\u3002 \u670d\u52a1\u7aef\u4e00\u53f0\u3002\uff08\u4ec5\u652f\u6301 AMD \u67b6\u6784\uff0c\u82e5\u9700\u5176\u4ed6\u67b6\u6784\uff0c\u54a8\u8be2\u76f8\u5173\u5f00\u53d1\u4eba\u5458\uff09 \u91c7\u96c6\u76d2\u4e00\u4e2a\u3002 \uff08ACASIS HDMI \u89c6\u9891\u91c7\u96c6\u76d2\uff0chttps://item.jd.com/100013302599.html#crumb-wrap \uff09 USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\u3002\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"\uff082\uff09\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\u3002 USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff08USB3.0 \u63a5\u53e3\u4e0a\uff09\u3002 \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5 USB \u5ef6\u957f\u7ebf\u3002 \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u670d\u52a1\u7aef\u63a8\u8350\u914d\u7f6e","text":"\u914d\u7f6e\u8d8a\u9ad8\uff0c\u89e3\u6790\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"2\u3001\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa","text":" \u6253\u5f00\u63a7\u5236\u4e2d\u5fc3\uff0c\u8d26\u6237\u8bbe\u7f6e\u4e3a\u3010\u81ea\u52a8\u767b\u5f55\u3011\u548c\u3010\u65e0\u5bc6\u7801\u767b\u5f55\u3011\uff0c\u7535\u6e90\u7ba1\u7406\u4e2d\u4f7f\u7528\u7535\u6e90\u5168\u90e8\u8bbe\u7f6e\u4e3a\u3010\u4ece\u4e0d\u3011\uff0c\u5f00\u542f\u5f00\u53d1\u8005\u6a21\u5f0f\u3002 \u6839\u636e\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u8981\u6c42\uff0c\u5bfc\u5165\u76f8\u5173\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\uff1a\u5bfc\u5165\u76f8\u518c\u3001\u5f71\u9662\u3001\u97f3\u4e50\u7684\u6d4b\u8bd5\u8d44\u6e90\u3002 \u5728\u670d\u52a1\u7aef\u6253\u5f00\u76f8\u673a\u5e94\u7528\u540e\uff0c\u5c06\u6d4b\u8bd5\u673a\u684c\u9762\u58c1\u7eb8\u66f4\u6362\u4e3a\u7eaf\u8272\u58c1\u7eb8\uff08\u6ce8\u610f\uff0c\u670d\u52a1\u7aef\u9700\u63d0\u524d\u5f00\u542f\u76f8\u673a\u540e\u518d\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u58c1\u7eb8\uff0c\u5efa\u8bae\u7eaf\u9ed1\u58c1\u7eb8 setting/res/black.png\uff09 \u5728\u6587\u4ef6\u7ba1\u7406\u5668\u4e2d\uff0c\u5c06\u9009\u9879 \u4e3b\u83dc\u5355-\u8bbe\u7f6e-\u9884\u89c8-\u56fe\u7247\u9884\u89c8 \u53d6\u6d88\u52fe\u9009\uff08\u5982\u4e0d\u53d6\u6d88\uff0c\u4f1a\u5f71\u54cd\u622a\u56fe\u5f55\u5c4f\u5e94\u7528\u7684\u6027\u80fd\u6570\u636e\uff09 \u79fb\u52a8\u6216\u5220\u9664\u7cfb\u7edf Logo \uff0c\u6392\u9664\u684c\u9762\u53f3\u4e0b\u89d2 Logo \u7684\u5f71\u54cd\uff08\u91cd\u542f\u751f\u6548\uff09\u3002 sudo mv /usr/share/deepin/uos_logo.svg ~/Pictures/\n \u5b89\u88c5\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\uff08\u5fc5\u987b\u5b89\u88c5\uff01\uff01\uff09 AMD \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_amd64.deb ARM \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_arm64.deb MIPS \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_mips64.deb 3A5000 \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_5000.deb \u5b89\u88c5\u547d\u4ee4 sudo dkpg -i xserver-xorg-input-libinput_0.28.2-2_amd64.deb\n \u5b89\u88c5\u65f6\u4f1a\u63d0\u793a\u5df2\u5b58\u5728\u76f8\u540c\u7248\u672c\uff0c\u8bf7\u5ffd\u7565\uff0c\u76f4\u63a5\u8986\u76d6\u5b89\u88c5\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u4e3b\u673a\u624d\u751f\u6548"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u670d\u52a1\u7aef\u4e00\u952e\u73af\u5883\u90e8\u7f72","text":"\u73af\u5883\u642d\u5efa\u524d\u5fc5\u987b\u5148\u8fde\u63a5\u4e0a USB \u4e32\u53e3\u7ebf\u548c\u91c7\u96c6\u76d2\u3002 \u5bbf\u4e3b\u673a\u73af\u5883\u5b89\u88c5 python3 manage.py install --env host\n \u5bb9\u5668\u73af\u5883\u5b89\u88c5 python3 manage.py install --env docker\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u56db\u3001\u914d\u7f6e\u9879","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u670d\u52a1\u7aef\u914d\u7f6e","text":"setting/config/server.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u914d\u7f6e\u9879\uff0c\u5305\u542b\u4e86\u6240\u6709\u670d\u52a1\u7aef\u6240\u6709\u7684\u53ef\u914d\u7f6e\u9879\u3002 \u672c\u5730\u65e0\u7f51\u7edc\u8fd0\u884c \u5c06\u914d\u7f6e\u9879 network=0 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u672c\u5730\u6709\u7f51\u7edc\u8fd0\u884c \u914d\u7f6e\u9879 network=1 (1)\u914d\u7f6e\u9879 client_alias= \u914d\u7f6e\u4e3a\u4f60\u8981\u6d4b\u8bd5\u7684\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5982 Alias1 \u6d4b\u8bd5\u673a\u522b\u540d\u5728 setting/config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 (2)\u914d\u7f6e\u9879 client_alias= \u4e3a\u7a7a\uff0c\u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager --client_alias Alias1\uff0c\u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002(Alias1 \u4e3a\u4f60\u914d\u7f6e\u7684\u6d4b\u8bd5\u673a\u522b\u540d) (1)\u548c(2)\u53ea\u8981\u4f7f\u7528\u5176\u4e00\u5373\u53ef\u3002 \u6709\u7f51\u7edc\u8fd0\u884c\uff0c\u4e14\u9700\u8981\u901a\u8fc7 Jenkins \u4e0a\u8fd0\u884c\u4e00\u4e2a job \uff0c\u540c\u65f6\u63a7\u5236\u591a\u53f0\u673a\u5668\u3002 \u914d\u7f6e\u9879 network=1 \u914d\u7f6e\u9879 client_alias= \u4e0d\u7528\u914d\u7f6e\uff0c\u5728\u8fd0\u884c run.sh \u7684\u65f6\u5019\u76f4\u63a5\u7a7a\u683c\u52a0\u522b\u540d\u5373\u53ef\uff0c\u6bd4\u5982\uff1a\u6d4b\u8bd5\u673a\u522b\u540d\u4e3a Alias1 \uff0c\u4e14\u5df2\u7ecf\u5728 config/client.ini \u4e2d\u914d\u7f6e\u4e86 Alias1 \u7684user ip password \uff0c\u5219\u8fd0\u884c bash run.sh Alias1 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u5728 Jenkins pipeline \u91cc\u9762\u901a\u8fc7\u5e76\u884c stage \u6216\u5e76\u884c\u8c03\u7528\u4e0b\u5c42\u4efb\u52a1\u7684\u65b9\u5f0f\u53ef\u4ee5\u5b9e\u73b0\u5927\u89c4\u6a21\u7684\u6027\u80fd\u6d4b\u8bd5\u9700\u6c42\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;1\u3001KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2\u3001KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f, e.g. TAGS = L1 or smoke\n[case_conf]\n# \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\uff0cocr\u6587\u6848\u8bc6\u522b\u8f83\u6162\uff0c\u4e0d\u63a8\u8350\u4f7f\u7528\nfind_by = stage\n# \u6700\u540e\u4e00\u4e2a\u7a33\u5b9a\u9636\u6bb5\u7684\u5e27\u6570\u8bc6\u522b\n# \u9996\u5e27\u5b58\u5728\u540e\u7684\u7b2c\u4e00\u4e2a\u5927\u4e8e\u8be5\u914d\u7f6e\u5e27\u6570\u7684\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u5c3e\u5e27\nfinal_stable_num=100\n# \u4ece\u8be5\u5e27\u6570\u5f00\u59cb\u8bc6\u522b\u6587\u6848\u6216\u56fe\u7247\uff0c\u51cf\u5c11\u5206\u6790\u65f6\u95f4\nstart_num = 150\n# \u8bc6\u522b\u7684\u6587\u6848\ntext=\n# \u8bc6\u522b\u56fe\u7247\nmatch=apps/xxx/images/match.png\n# \u8bc6\u522b\u76f8\u4f3c\u5ea6\nmatch_rate=0.9\n# \u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6bd4\u5982\u70ed\u542f\u52a8\u7528\u4f8b\uff0c\u4ece\u70b9\u51fb\u6253\u5f00\u5230\u505c\u6b62\u5f55\u5c4f\uff0c\u4e2d\u95f4\u7b49\u5f855\u79d2\uff1b\nduration = 15\n# \u5355\u6761\u7528\u4f8b\u6267\u884c\u7684\u6b21\u6570\ncount = 5\n# \u7a33\u5b9a\u9636\u6bb5\u5212\u5206\u7684\u76f8\u4f3c\u5ea6\nstable_similarity = 0.9997\n[server]\n# \u8c03\u8bd5\u6a21\u5f0f=1\uff0c\u4e3a\u5f00\u542f\u8c03\u8bd5\u6a21\u5f0f\uff0c0\u4e3a\u5173\u95ed\u3002\n# \u8c03\u8bd5\u6a21\u5f0f\u4e0b\u9ed8\u8ba4\u53ea\u6267\u884c\u4e00\u6b21\u7528\u4f8b\uff0c\u4e0d\u5173\u673a\n# \u7f16\u5199\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u5efa\u8bae\u5f00\u542fmaintain\u3002\nMAINTAIN = 0\n# \u8fd0\u884c\u7684\u73af\u5883docker\u5bb9\u5668\u73af\u5883\uff0chost\u5bbf\u4e3b\u673a\u73af\u5883\nENV = docker\n# \u670d\u52a1\u7aef\u5bc6\u7801\nPASSWORD=1\n# \u6307\u5b9a\u6d4b\u8bd5\u673a\u522b\u540d\n# \u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6bd4\u5982\uff1a\n# [AMD]\n# ip=10.8.15.86\n# user=uos\n# \u5176\u4e2d AMD \u4e3a\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5219client_alias=AMD\nCLIENT_ALIAS = x86\uff08Intel-i7\uff09\n# 1 \u5f00\u542f\u7f51\u7edc, 0 \u5173\u95ed\u7f51\u7edc\n# \uff081\uff09\u670d\u52a1\u7aef\u4e0e\u6d4b\u8bd5\u673a\u987b\u5728\u540c\u4e00\u7f51\u6bb5\u4e0b\uff0c\u4f60\u53ef\u4ee5\u5c1d\u8bd5\u5728\u670d\u52a1\u7aef\u901a\u8fc7ssh\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c\u5982\u679c\u53ef\u4ee5\u8fde\u63a5\uff0c\u8bf4\u660e\u7f51\u7edc\u6b63\u5e38\u3002\n# \uff082\uff09\u5f53input_type=FILE_NAME \u65f6\uff0c\u5fc5\u987b\u5f00\u542f\u7f51\u7edc\u3002\nNETWORK = 1\n# \u6027\u80fd\u7ed3\u679c\u7edf\u8ba1\u5355\u4f4d \u6beb\u79d2\u2014ms, \u79d2\u2014s\nUNIT=ms\n# \u6d4b\u8bd5\u673a\u5f00\u673a\u8fdb\u5165\u684c\u9762\u540e\u7b49\u5f85\u65f6\u95f4,\u5355\u4f4d/\u79d2\nSTARTUP_DELAY = 60\n# 1\u4e3a\u5220\u9664\u7f13\u5b58\uff0c0\u4e3a\u4e0d\u5220\u9664\u7f13\u5b58\n# \u7528\u4f8b\u6267\u884c\u5b8c\u540e\u4f1a\u5728report\u76ee\u5f55\u4e0b\u751f\u6210\u667a\u80fd\u89e3\u6790\u7684\u4e00\u4e9b\u7f13\u5b58\u56fe\u7247\u3002\nCACHE = 0\n# \u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u62a5\u544a\u4f1a\u4fdd\u5b58\u5728\u9879\u76ee\u4e0breport\u76ee\u5f55\u4e2d\uff1b\n# \u6307\u5b9a\u62a5\u544a\u76ee\u5f55\u5219\u5b58\u653e\u5230\u6307\u5b9a\u76ee\u5f55\u3002\nREPORT_PATH = report\n# \u670d\u52a1\u7aef\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684icon\u8d44\u6e90\u4f1a\u7f13\u5b58\u5728\u9879\u76ee\u4e0binput\u76ee\u5f55\u4e2d\nINPUT = input/\n# 1\u4e3a\u6d4b\u8bd5\u5b8c\u5173\u673a\uff0c0\u4e3a\u6d4b\u8bd5\u5b8c\u4e0d\u5173\u673a\nSHUTDOWN = 0\n# \u89e3\u6790\u8fdb\u7a0b\u6570\uff08\u4e0d\u63a8\u8350\u4fee\u6539\uff09\n# 3\u4e2a\u8fdb\u7a0b\u89e3\u6790\u89c6\u9891\u5df2\u7ecf\u80fd\u591f\u6ee1\u8db3\uff0c\u5373\u4f7f\u589e\u52a0\u8fdb\u7a0b\u6570\u4e5f\u4e0d\u80fd\u51cf\u5c11\u6574\u4f53\u8017\u65f6\n# \u53e6\u5916\u8fd8\u8981\u770bCPU\u6838\u6570\u662f\u5426\u652f\u6301\u3002\nPARSING_PROCESS = 3\n# 1\u4e3a\u4f7f\u7528\u7ee7\u7535\u5668\u5f00\u5173\u673a\uff0c0\u4e3a\u4f7f\u7528reboot\u547d\u4ee4\u91cd\u542f\u3002\u4f9d\u8d56\u7ee7\u7535\u5668\u786c\u4ef6\u8bbe\u5907\uff0c\u9700\u8981\u4f7f\u7528\u8054\u7cfb\u5f00\u53d1\u8005\nRELAY = 0\n# \u83b7\u53d6\u6d4b\u8bd5\u5e94\u7528\u7684\u7248\u672c, %s \u5360\u4f4d\u5e94\u7528\u540d\n# \u5982\u679c\u8be5\u914d\u7f6e\u4e3a\u7a7a\uff0c\u5219\u4e0d\u83b7\u53d6\u5e94\u7528\u7684\u7248\u672c\u4fe1\u606f\u3002\nCOMMAND = apt policy %s 2>/dev/null|grep \"\u5df2\u5b89\u88c5\"|awk -F \"\uff1a\" \"{print \\$2}\"\n# \u5173\u673a\u7b49\u5f85\u5f00\u542f\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6839\u636e\u6d4b\u8bd5\u673a\u6027\u80fd\u4e0d\u540c\uff0c\u5f00\u5173\u673a\u8017\u65f6\u53ef\u80fd\u4e0d\u540c\uff0c\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u673a\u60c5\u51b5\u914d\u7f6e\u3002\nSHUTDOWN_DELAY = 30\n# \u53ef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u56fe\u7247\u683c\u5f0f\uff0c\u4ee5\u82f1\u6587\u9017\u53f7\u9694\u5f00\u3002\n# \u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u76ee\u524d\u6211\u4eec\u4ec5\u9a8c\u8bc1\u4e86jpg,jpeg,png\u8fd9\u4e09\u79cd\u5e38\u7528\u7684\u56fe\u7247\u683c\u5f0f\u3002\nINPUT_TYPES = jpg,jpeg,png\n# \u6027\u80fd\u5206\u6790\u8865\u5e27\uff0c\u7b49\u4e8e\u6216\u4f4e\u4e8e\u8be5\u503c\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u9700\u8981\u51cf\u6389\u3002\nUN_STAB_START = 3\n# \u670d\u52a1\u7aef\u83b7\u53d6\u6d4b\u8bd5\u673a\u56fe\u50cf\u7684\u5e27\u7387\uff0c\u5373\u6bcf\u79d2\u83b7\u53d6\u591a\u5c11\u5f20\u6d4b\u8bd5\u673a\u4e0a\u7684\u56fe\u50cf\u3002\n# \u9ed8\u8ba4\u5e27\u7387\u4e3a30\u5e27/\u79d2\uff0c\u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u53ef\u80fd\u4f1a\u5bf9\u89e3\u6790\u7ed3\u679c\u9020\u6210\u504f\u5dee\u3002\nFPS = 30\n# \u4ee5\u4e0b\u573a\u666f\u7c7b\u578b\u4f1a\u91cd\u542f\u6d4b\u8bd5\u673a,\u591a\u79cd\u573a\u666f\u4f7f\u7528\u9017\u53f7\u9694\u5f00\nSCENE = cold\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = http://10.8.13.78:8890\n#\u5c4f\u5e55\u56fe\u7247\u4e34\u65f6\u5b58\u653e\u4f4d\u7f6e\nSCREEN_CACHE = /tmp/screen\n# =======================================\n[log]\n# \u65e5\u5fd7\u7ea7\u522b\uff0cOFF\u3001FATAL\u3001ERROR\u3001WARN\u3001INFO\u3001DEBUG\u3001ALL\n# \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u65e5\u5fd7\u8f93\u51fa\uff0clog_cli=INFO\u8868\u793a \u4ec5\u8f93\u51faINFO\u53ca\u4ee5\u4e0a\u7ea7\u522b\u7684\u65e5\u5fd7\u3002\nLOG_LEVEL = DEBUG\n# \u65e5\u5fd7\u6587\u4ef6\u4fdd\u5b58\u8def\u5f84\nLOG_PATH= logs\n# =======================================\n[dockerhub]\n# \u5bb9\u5668\u767b\u9646\u8d26\u53f7\nDOCKER_USER = user\n# \u5bb9\u5668\u767b\u9646\u5bc6\u7801\nDOCKER_PASSWORD = User1234\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u6d4b\u8bd5\u673a\u914d\u7f6e","text":"setting/config/client.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u4fe1\u606f\u3002 \u6709\u7f51\u7edc\u7684\u60c5\u51b5\u4e0b\uff0c\u670d\u52a1\u7aef\u9700\u8981\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u56e0\u6b64\u4f60\u9700\u8981\u5199\u5165 \u6d4b\u8bd5\u673a\u522b\u540d \u3001 user \u3001ip\u3001 password \u3002 # \u6d4b\u8bd5\u673a\u522b\u540d\n[Alias1] # \u6d4b\u8bd5\u673aip\nip=10.8.15.86 # \u6d4b\u8bd5\u673a\u7528\u6237\u540d\nuser=uos\n \u547d\u540d\u5efa\u8bae\uff1aAliasA1\u3001AliasA2\u3001AliasB1\u3001AliasB2\uff0c\u4e0d\u8981\u91cd\u540d\u3002 \u65e0\u7f51\u7edc\u60c5\u51b5\u4e0b\uff0c\u4ec5\u9700\u8981\u5173\u6ce8\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\u9879 width=\u3001 height= \u5373\u53ef\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a [client]\n# \u9ed8\u8ba4\u6d4b\u8bd5\u673a\u7528\u6237\u540d\uff0c\u5bc6\u7801\uff0cip\nip=\nuser=\n# \u6d4b\u8bd5\u673a\u5bc6\u7801\npassword=1\n# \u6d4b\u8bd5\u673a\u4e3b\u9898\ntheme=bloom\n# \u6d4b\u8bd5\u673aicon\u76ee\u5f55\npath=/usr/share/icons\n# \u7cfb\u7edfdesktop\u6587\u4ef6\u7684\u5b58\u653e\u76ee\u5f55\uff0cUOS\u7cfb\u7edf\u9ed8\u8ba4\u4e3a/usr/share/applications\ndesktop_path=/usr/share/applications\n# \u7528\u4e8e\u5224\u65ad\u6d4b\u8bd5\u673a\u662f\u5426\u5f00\u673a\u8fdb\u5165\u684c\u9762\u7684\u8bc6\u522b\u6807\u8bc6\u3002\n# 1\u3001\u901a\u8fc7\u684c\u9762\u56fe\u6807\u8bc6\u522b\u3002\n# - type=FILE_NAME\u65f6\uff0c\u670d\u52a1\u5668\u548c\u6d4b\u8bd5\u673a\u5fc5\u987b\u5728\u540c\u4e00\u5c40\u57df\u7f51\u5185\u3002\n# - power_on=dde-computer\u8868\u793a\u901a\u8fc7\u684c\u9762\u8ba1\u7b97\u673a\u56fe\u6807\u5224\u65ad\u5f00\u673a\u8fdb\u5165\u684c\u9762\u3002\n# 2\u3001\u901a\u8fc7\u672c\u5730\u56fe\u7247\u4f5c\u4e3a\u5f00\u673a\u8bc6\u522b\u3002\n# - type= \u4f20\u5165\u4e3a\u56fe\u7247\u683c\u5f0f\uff0ctype\u652f\u6301\u7684\u7c7b\u578b\u5305\u542b\u5728server.ini\u5185\u914d\u7f6e\u9879input_type=jpg,jpeg,png\u3002\n# - power_on= \u4f20\u5165\u7684\u662f\u672c\u5730\u56fe\u7247\u7684\u8def\u5f84\u3002\ntype=FILE_NAME\npower_on=dde-computer\n# \u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\uff08\u6d4b\u8bd5\u673a\u8fde\u63a5\u91c7\u96c6\u76d2\uff0c\u91c7\u96c6\u76d2\u7684\u5206\u8fa8\u7387\uff09\nheight=1080\nwidth=1920\n[AliasA1] ip=10.8.15.86\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n[AliasA2]\nip=10.8.15.20\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_2","title":"3\u3001\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e","text":"\u968f\u7740\u6d4b\u8bd5\u573a\u666f\u7684\u4e0d\u65ad\u5f15\u5165\uff0c\u53d1\u73b0\u73b0\u6709\u670d\u52a1\u7aef\u91cc\u7684\u914d\u7f6e\u9879\u5e76\u4e0d\u9002\u7528\u4e8e\u6240\u6709\u7684\u6027\u80fd\u573a\u666f\uff0c\u4e8e\u662f\u5c06\u670d\u52a1\u7aef\u914d\u7f6e\u8fdb\u884c\u4e00\u4e2a\u63d0\u53d6\uff0c\u53ef\u505a\u5355\u4e2a\u573a\u666f\u7684\u4e2a\u6027\u5316\u914d\u7f6e\uff0c\u5f53\u7136\u539f\u6765\u7684\u670d\u52a1\u7aef\u914d\u7f6e\u529f\u80fd\u4fdd\u7559\uff0c\u53ea\u662f\u5f53\u4f60\u914d\u7f6e\u4e86\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e\u540e\uff0c\u4f18\u5148\u4f7f\u7528\u4e2a\u6027\u5316\u914d\u7f6e\u91cc\u9762\u7684\u5185\u5bb9\uff0c\u4ee5\u4e0b\u662f\u5bf9\u4e2a\u6027\u5316\u914d\u7f6e\u7684\u4ecb\u7ecd\u3002 \u76ee\u524d\u6bcf\u4e00\u4e2a py \u6587\u4ef6\u5bf9\u5e94\u4e00\u4e2a\u6027\u80fd\u6d4b\u8bd5\u573a\u666f\uff0c\u4e8e\u662f\u5728\u540c\u7ea7\u76ee\u5f55\u4e0b\u521b\u5efa\u4e00\u4e2a\u4e0e\u4e4b\u540c\u540d\u7684 json \u6587\u4ef6\uff0c\u4f5c\u4e3a\u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6 apps\n\u251c\u2500\u2500 album\n \u251c\u2500\u2500 test_album_01_start.json # \u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6\n\u2514\u2500\u2500 test_album_01_start.py # \u6027\u80fd\u573a\u666f\u6587\u4ef6\n \u4ee5\u4e0b\u662f\u5bf9 json \u6587\u4ef6\u4e2d\u914d\u7f6e\u7684\u89e3\u91ca\uff0c\u82e5\u67d0\u9879\u914d\u7f6e\u4e0d\u9700\u8981\uff0c\u53ef\u4ee5\u7f3a\u5931\uff0c\u4f46\u4e0d\u80fd\u4e3a\u7a7a\uff1b {\n\"title\": \"test_album_start\", # \u6807\u9898\uff1b\u5fc5\u987b\n\"app_name\": \"deepin-album\", # \u573a\u666f\u6240\u5c5e\u7684\u5e94\u7528\uff1b\u5fc5\u987b\n\"scene\": \"hot\", # \u573a\u666f\u522b\u540d\uff1b\u5fc5\u987b\n\"icon\": [\"deepin-album\"], # \u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684icon\u5230\u670d\u52a1\u7aef\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\uff1b\u53ef\u7f3a\u5931\n# \u6ce8\u610f\uff1a\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684desktop\u6587\u4ef6\u540d\u4e3adeepin-album.desktop\uff0c\n# \u53ea\u9700\u8981\u5199deepin-album\u5373\u53ef\uff0c\u201c.desktop\u201d\u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002\n\"size\": { # \u56fe\u7247\u5bf9\u6bd4\u7684\u533a\u57df\u8bbe\u7f6e\u9879\uff0c\u67d0\u4e9b\u5e94\u7528\u5f53\u524d\u5c4f\u5e55\u7684\u90e8\u5206\u533a\u57df\u9700\u8981\u5c06\u5176\u53bb\u6389\uff0c\u53ef\u4ee5\u8bbe\u7f6e\u6b64\u9879\uff0c\u5982\u679c\u6ca1\u6709\u5219\u53ef\u4e0d\u5199\uff1b\u53ef\u786e\u5b9e\n\"x-coordinate\": 0, # \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n\"y-coordinate\": 0, # \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n\"width\": 850, # \u6a2a\u5411\u957f\u5ea6\n\"height\": 1920 # \u7eb5\u5411\u9ad8\u5ea6\n},\n\"count\": 5, # \u573a\u666f\u6267\u884c\u7684\u6b21\u6570\uff1b\u5fc5\u987b\n\"duration\": 5, # \u8be5\u6761\u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff0c\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7279\u5b9a\u573a\u666f\uff0c\u8be5\u914d\u7f6e\u4e3a\u53ef\u9009\u9879\uff0c\u8986\u76d6 server.ini \u4e2d\u7684\u914d\u7f6e\uff1b\u53ef\u7f3a\u5931\n\"stable_similarity\": 0.9997, # \u6027\u80fd\u573a\u666f\u5206\u9636\u6bb5\u65f6\u7684\u56fe\u7247\u76f8\u4f3c\u5ea6\u5bf9\u6bd4\uff0c\u524d\u540e\u56fe\u7247\u4f4e\u4e8e\u8be5\u503c\uff0c\u5219\u5206\u4e3a\u4e0d\u7a33\u5b9a\u9636\u6bb5\uff1b\u53ef\u7f3a\u5931\n\"find_by\": \"stage\", # \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\n\"final_stable_num\": 100, # \u67e5\u627e\u6700\u540e\u4e00\u4e2a\u5927\u4e8e\u8be5\u503c\u7684\u7a33\u5b9a\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u7684\u5c3e\u796f\uff1b\u53ef\u7f3a\u5931\n\"start_num\": 150,\n\"text\": \"\", # ocr\u8bc6\u522b\u7684\u6587\u6848\n\"match\": \"apps/xxx/images/match.png\", # \u56fe\u50cf\u5339\u914d\u7684\u56fe\u7247\u6587\u4ef6\u8def\u5f84\n\"match_rate\": 0.9 # \u5339\u914d\u76f8\u4f3c\u5ea6\n}\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e94\u3001\u6d4b\u8bd5\u6d41\u7a0b","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516d\u3001\u7528\u4f8b\u7f16\u5199\u53ca\u65b9\u6cd5\u53c2\u6570\u6307\u5f15","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"1\u3001\u7528\u4f8b\u5b9e\u4f8b\u8bf4\u660e","text":"# \u6807\u51c6\u5e93\u5bfc\u5165\nfrom time import sleep\n# \u5bfc\u5165\u4e09\u65b9\u5e93pytest\nimport pytest\n# \u5bfc\u5165\u7528\u4f8b\u6267\u884c\u8981\u7528\u5230\u7684Widget\u7c7b\nfrom src.base_widget import BaseWidget\nclass TestStart:\n# class\u7ea7\u522b\u7684fixture\uff0c\u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u6267\u884c\u3002autouse=True \u81ea\u52a8\u5728\u5f53\u524d\u4f5c\u7528\u57df\u4e0b\u4f7f\u7528\u3002\n@pytest.fixture(scope=\"class\", autouse=True)\n# \u6d4b\u8bd5\u70ed\u542f\u52a8\u4e4b\u524d\u9700\u8981\u9884\u542f\u52a8\u3002\ndef application_pre_start(self):\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().right_click_element(\"deepin-album\")\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().click_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\")\nsleep(2)\n# \u5feb\u6377\u952e\u5173\u95ed\u7a97\u53e3\nBaseWidget().hot_key(\"alt\", \"f4\")\nsleep(2)\n# \u9ed8\u8ba4\u4e3afunction\u7ea7\u522b\u7684fixture\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\uff0cclass\u7ea7\u522bfixture\u6267\u884c\u4e4b\u540e\u6267\u884c\u3002\n@pytest.fixture(autouse=True)\ndef setup_start(self):\n# \u53f3\u952e\u70b9\u51fb deepin-album \u56fe\u6807\nBaseWidget().right_click_element(\"deepin-album\")\n# \u79fb\u52a8\u5230\u53f3\u952e\u83dc\u5355\u4e2d\u6253\u5f00\uff08open.png\uff09\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().move_to(*BaseWidget().find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))\n# \u7b49\u5f85\u79fb\u52a8\u5b8c\u6210\nsleep(0.5)\ndef test_album_start(self):\n# \u70b9\u51fb\u201c\u6253\u5f00\u201d\nBaseWidget().click() \n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"2\u3001\u65b9\u6cd5\u53c2\u6570\u8bf4\u660e","text":"2.1\u3001find_element \u65b9\u6cd5 def find_element(element: str, input_type: str = \"FILE_NAME\", fill_color_position: tuple = (-1, -1), size: tuple = (25, 70)):\npass\n \u53c2\u6570 element \u548c input_type \uff081\uff09\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u5143\u7d20 - `input_type` \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a `FIEL_NAME` \uff0c\u8868\u793a\u901a\u8fc7\u5e94\u7528 `icon` \u5bfb\u627e\u5143\u7d20\uff0c\u6b64\u65b9\u6cd5\u4f1a\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u5e94\u7528 `icon` \u56fe\u6807\u3002\n \u4e3e\u4f8b\uff1a\u9ed8\u8ba4\u60c5\u51b5\u4e0b input_type \u53c2\u6570\u4e0d\u9700\u8981\u4f20\u5165\uff0c find_element(\"deepin-album\")\uff0c\u8868\u793a\u901a\u8fc7 deepin-album \u7684\u5e94\u7528 icon \u6765\u83b7\u53d6\u5750\u6807\uff0c\u6ce8\u610f\uff0c\u6b64\u65f6\u4f20\u5165\u7684 deepin-album \u53c2\u6570\u5b9e\u9645\u662f desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u548c2.3\u4e2d\u7684 icon \u53d8\u91cf\u4e00\u81f4\u3002 \u6211\u4eec\u5efa\u8bae\u4f18\u5148\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\uff0c\u4f46\u6b64\u65b9\u6cd5\u4f9d\u8d56\u7f51\u7edc\uff0c\u8bf7\u6839\u636e\u6d4b\u8bd5\u73af\u5883\u5b9e\u9645\u60c5\u51b5\u9009\u62e9\u3002 \uff082\uff09\u901a\u8fc7\u672c\u5730\u56fe\u7247\u8bc6\u522b\u5143\u7d20 - \u53c2\u6570 `input_type` \u4f20\u5165\u56fe\u7247\u683c\u5f0f\uff0c\u6bd4\u5982\u622a\u53d6\u7684\u672c\u5730\u56fe\u7247\u683c\u5f0f\u4e3a `png`\uff0c\u90a3\u4e48 `input_type=\"png\"`\uff0c\u6b64\u65f6\u53c2\u6570 `element ` \u4f20\u5165\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5efa\u8bae\u5b58\u653e\u5728\u5bf9\u5e94\u7684\u4ea7\u54c1 `apps/app/picture/` \u76ee\u5f55\u4e0b\uff0c\u8def\u5f84\u4e3a\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u7684\u76f8\u5bf9\u8def\u5f84\u3002\n- \u4e3e\u4f8b\uff1a`find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))`\uff0c\u8868\u793a\u901a\u8fc7\u672c\u5730\u56fe\u7247 `open.png` \u8bc6\u522b\u5143\u7d20\u3002\n \u53c2\u6570 fill_color_position fill_color_position \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (-1, -1)\uff0c(-1, -1) \u8868\u793a\u53d6\u5c4f\u5e55\u4e2d\u53f3\u4e0b\u89d2\u6700\u540e\u4e00\u4e2a\u50cf\u7d20\u70b9\u4f5c\u4e3a\u586b\u5145\u5750\u6807\uff0c\u5728 1920x1080 \u5c4f\u5e55\u5206\u8fa8\u7387\u4e0b\u5373\u5b9e\u9645\u5750\u6807\u4e3a (1919, 1079) \uff0c\u8fd9\u6837\u7684\u5199\u6cd5\u53ef\u4ee5\u9002\u914d\u4e0d\u540c\u5927\u5c0f\u7684\u5c4f\u5e55\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0d\u540c\u65b9\u4f4d\uff1a \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0b\u65b9\uff0c\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u4e0d\u9700\u8981\u4f20\u5165\u8be5\u53c2\u6570\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u5de6\u8fb9\uff0cfill_color_position=(1, 1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u53f3\u8fb9\uff0cfill_color_position=(-1, -1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0a\u8fb9\uff0cfill_color_position=(1, 1) \u4ece\u684c\u9762\u542f\u52a8\u5e94\u7528\uff0c\u5219\u9700\u8981\u4f20\u5165\u9664\u4efb\u52a1\u680f\u4ee5\u5916\u5176\u4ed6\u4f4d\u7f6e\u7684\u5750\u6807\uff0c\u6bd4\u5982(100, 100)\uff0c\u53ea\u8981\u8fd9\u4e2a\u5750\u6807\u4e3a\u9664\u5e94\u7528\u548c\u4efb\u52a1\u680f\u533a\u57df\u90fd\u53ef\u4ee5\u3002 \u4ece\u542f\u52a8\u5668\u91cc\u9762\u542f\u52a8\u5e94\u7528\uff0c\u9700\u8981\u586b\u5145\u7684\u5750\u6807\u4e3a\u542f\u52a8\u5668\u533a\u57df\u3002 \u6ce8\uff1a\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u65f6\uff0c\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684 icon \u539f\u6587\u4ef6\u4e3a svg \u77e2\u91cf\u56fe\uff0c\u8f6c\u6362\u4e3a png \u4e4b\u540e\u9700\u8981\u586b\u5145\u8fb9\u7f18\u900f\u660e\u90e8\u5206\u3002 \u53c2\u6570 size size \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (25, 70)\uff0c\u8868\u793a\u6d4b\u8bd5\u673a\u4e0a dock \u680f\u4e0a\u5e94\u7528\u56fe\u6807\u7684\u5927\u5c0f\u8303\u56f4\u3002 UOS \u7cfb\u7edf dock \u680f\u662f\u53ef\u4ee5\u4e0a\u4e0b\u62d6\u52a8\u5927\u5c0f\u7684\uff0c\u968f\u7740 dock \u680f\u5927\u5c0f\u6539\u53d8\uff0c\u5e94\u7528\u56fe\u6807\u7684\u8303\u56f4\u4e3a25\u523070\u4e4b\u95f4\u3002 \u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u64cd\u4f5c\u7cfb\u7edf\u4e0a dock \u680f\u5927\u5c0f\u4e0d\u4e00\u6837\uff0c\u53ef\u4ee5\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u4f20\u5165\u5927\u5c0f\u8303\u56f4\u3002 2.2\u3001click_element\u3001 right_click_element\uff0c double_click_element \u8fd9\u51e0\u4e2a\u65b9\u6cd5\u53c2\u6570\u89c4\u5219\u4e0e find_element \u65b9\u6cd5\u4e00\u6837\u3002\u4ed6\u4eec\u5b9e\u9645\u4e0a\u662f\u5728 find_element \u65b9\u6cd5\u57fa\u7840\u4e4b\u4e0a\u505a\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u589e\u52a0\u4e86\u9f20\u6807\u7684\u52a8\u4f5c\uff0c\u5982\u679c\u4f60\u4e0d\u60f3\u4f7f\u7528\u8fd9\u51e0\u4e2a\u65b9\u6cd5\uff0c\u5728\u7528\u4f8b\u4e2d\u4e5f\u53ef\u4ee5\u901a\u8fc7 find_element \u83b7\u53d6\u5230\u5750\u6807\uff0c\u7136\u540e\u5c06\u5750\u6807\u4f20\u5165\u5230\u952e\u9f20\u7684\u65b9\u6cd5\u4e2d\uff0c\u53ef\u4ee5\u5b9e\u73b0\u540c\u6837\u7684\u6548\u679c\u3002 2.3\u3001\u7528\u4f8b\u7c7b\u4e2d\u6709\u4e2a\u7c7b\u53d8\u91cf icon = [\"deepin-album\"] \u9700\u8981\u7279\u6b8a\u8bf4\u660e\uff0c\u5217\u8868\u4e2d\u7684\u5143\u7d20\u4e3a\u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709 icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684 icon \u5230\u670d\u52a1\u7aef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528 desktop \u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684 desktop \u6587\u4ef6\u540d\u4e3a deepin-album.desktop\uff0c\u53ea\u9700\u8981\u5199 deepin-album \u5373\u53ef\uff0c.desktop \u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e03\u3001\u6267\u884c\u5165\u53e3","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"1\u3001\u7528\u4f8b\u7ec4\u7ec7","text":"\u5728 setting/config/server.ini \u6587\u4ef6\u4e2d APP_NAME= \u5b57\u6bb5\u4e3a\u7528\u4f8b\u7684\u6267\u884c\u7684\u76ee\u5f55\uff0c\u9ed8\u8ba4\u4e3a apps \u76ee\u5f55\u4e0b\u6240\u6709\u7528\u4f8b\u3002\u5982\u679c\u4f60\u60f3\u6307\u5b9a\u6267\u884c\u67d0\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4f60\u53ef\u4ee5\u5c06\u8be5\u914d\u7f6e\u9879\u6307\u5b9a\u5230\u5e94\u7528\u7684\u7528\u4f8b\u76ee\u5f55\uff0c\u6bd4\u5982\uff1aAPP_NAME=deepin_album\uff0c \u8868\u793a\u6267\u884c\u76f8\u518c\u76ee\u5f55\u4e0b\u7684\u7528\u4f8b\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a python3 manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music\n -k KEYWORDS, --keywords KEYWORDS\n \u7528\u4f8b\u7684\u5173\u952e\u8bcd\n -t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e\n --log_level LOG_LEVEL \u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n --env {host,docker} \u5728\u5bbf\u4e3b\u673a\u6216\u5bb9\u5668\u73af\u5883\u6267\u884c\n --client_alias \u9009\u62e9\u6d4b\u8bd5\u673a\u522b\u540d, \u53ef\u9009\u9879\u4e3aclient.ini\u4e2d\u5df2\u914d\u7f6e, \u9ed8\u8ba4\u503c\u4e3a zx-x86.\n --count \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a python3 manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\" --env docker\n \u6ce8\uff1a\u5728\u5bb9\u5668\u4e2d\u6267\u884c\u65f6\uff0c\u82e5\u5f3a\u5236\u9000\u51fa\uff0c\u5bb9\u5668\u5e76\u4e0d\u4f1a\u505c\u6b62\u8fd0\u884c\uff01"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_9","title":"\u516b\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1json","title":"1\u3001Json \u62a5\u544a","text":"\u81ea\u7814\u89c6\u9891\u89e3\u6790\u5de5\u5177\u4f1a\u5bf9\u5355\u6761\u7528\u4f8b\u6267\u884c\u4e00\u8f6e\u751f\u6210\u4e00\u4e2a json \u6587\u4ef6\uff0c\u5b58\u653e\u4e8e report/{app_name}/{scene}/{run_num} \u76ee\u5f55\u4e0b\uff0c\u547d\u540d\u683c\u5f0f\u4e3a\uff1a report.json json \u5185\u5bb9\u4e3e\u4f8b\uff1a [\n{\n\"Stab1\": {\n\"images\": [1,2...150,151],\n\"startStub\": 0,\n\"type\": \"Stab\"\n}\n},\n{\n\"Stab2\": {\n\"images\": [152,153...169,170],\n\"startStub\": 1,\n\"type\": \"UnStab\"\n}\n},\n{\n\"Stab3\": {\n\"images\": [171,172...300,301],\n\"startStub\": 0,\n\"type\": \"UnStab\"\n}\n}\n]\n \u8bf4\u660e\uff1a Stab \uff1a\u8868\u793a\u89e3\u6790\u8fc7\u7a0b\u4e2d\u4e0d\u540c\u7684\u9636\u6bb5\u3002 images \uff1a\u8868\u793a\u6bcf\u4e00\u5e27\u7684\u56fe\u7247\u5e8f\u53f7\u3002 startStub\uff1a \u4e3a\u8bc6\u522b\u5c3e\u5e27\u7684\u9636\u6bb5\u8868\u793a\uff0c\u5982\u679c \"startStub\": 1 \uff0c\u8bf4\u660e\u5c3e\u5e27\u51fa\u73b0\u5728\u8be5\u9636\u6bb5\u3002 type\uff1a \u4e3a Stab \u6216 UnStab \uff0c\u8868\u793a\u7a33\u5b9a\u9636\u6bb5\u6216\u4e0d\u7a33\u5b9a\u9636\u6bb5\u3002 \u5404\u9636\u6bb5\u6709\u5e27\u6570\u8865\u507f\uff0c\u9ed8\u8ba4\u8865\u507f\u7684\u5e27\u6570\u4e3a 3 \u5e27\uff08\u53ef\u4ee5\u901a\u8fc7 server.ini \u91cc\u9762 un_stab_start=3 \u8fdb\u884c\u914d\u7f6e\uff09\uff0c\u8868\u793a\u5c0f\u4e8e\u7b49\u4e8e 3 \u5e27\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u524d\u540e\u5747\u9700\u8981\u51cf\u6389\u3002 \u5e94\u7528\u542f\u52a8\u9636\u6bb5\u5c31\u662f\u5728 Stab2 \u9636\u6bb5\uff0c\u542f\u52a8\u65f6\u95f4\u4e3a\uff1a171 \u51cf 151 \u518d\u51cf\u6389\u524d\u540e\u8865\u507f\u5e27\u6570 6 \u5e27\uff0c\u5373 14 \u5e27\uff0c\u89c6\u9891\u5e27\u7387 30 \u5e27/\u79d2\uff0c\u56e0\u6b64\u542f\u52a8\u8017\u65f6\u4e3a\uff1a14 * 33 = 462 ms"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2excel","title":"2\u3001Excel \u62a5\u544a","text":"\u6240\u6709\u7528\u4f8b\u6267\u884c\u5e76\u89e3\u6790\u5b8c\u4e4b\u540e\u4f1a report \u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a\u6c47\u603b\u6570\u636e\u7684 Excel \u6587\u4ef6\uff0c\u6587\u4ef6\u540d\u4e3a\uff1a{time}_perf_time.xlsx\u3002 \u6ce8\u610f\uff0creport \u76ee\u5f55\u4e3a\u53ef\u914d\u7f6e\u9879\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u4f1a\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u751f\u6210\uff0c\u5982\u679c\u4f60\u5c06 report\uff0c\u6307\u5b9a\u5230\u9879\u76ee\u4e0b\u5176\u4ed6\u8def\u5f84\uff0c\u5219\u4f1a\u5728\u5bf9\u5e94\u7684\u8def\u5f84\u4e0b\u751f\u6210 json \u548c Excel \u6587\u4ef6\u3002 \u4f60\u4e5f\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8bfb\u53d6\u6240\u6709 json / excel \u62a5\u544a\u7684\u6570\u636e\uff0c\u751f\u6210\u4f60\u81ea\u5df1\u60f3\u8981\u7684\u4e00\u4e9b\u6d4b\u8bd5\u62a5\u544a\u5f62\u5f0f\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#usb","title":"\u4e5d\u3001USB \u4e32\u53e3\u9a71\u52a8\u952e\u9f20\u65b9\u6cd5","text":"\u4f4d\u4e8e src/utils/control/serial_communication \u76ee\u5f55\u4e0b\u7684 usb_mk.py \u6587\u4ef6 usb_mk = UsbMk()\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up()\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u652f\u6301\u4f20\u5165\u6c49\u5b57\uff0c\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click()\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() \n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() \n \uff084\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() \n \uff085\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() \n \uff086\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() \n \uff087\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff088\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff0810\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_10","title":"\u5341\u3001\u7ee7\u7535\u5668\u63a7\u5236\u4e3b\u673a\u5f00\u673a/\u91cd\u542f","text":"\uff08\u82e5\u4e0d\u4f7f\u7528\u7ee7\u7535\u5668\uff0c\u53ef\u5ffd\u7565\u8be5\u6b65\u9aa4\uff0c\u6267\u884c\u65f6\u4f1a\u901a\u8fc7\u547d\u4ee4 reboot\uff09"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u7ee7\u7535\u5668\u8bbe\u5907","text":"LCUS-2 \u578b \u53cc\u8def USB \u667a\u80fd\u4e32\u53e3\u63a7\u5236\u7ee7\u7535\u5668\u3002 https://item.taobao.com/item.htm?spm=a1z09.2.0.0.41d72e8dUYx2pi&id=582653718178&_u=i25r20ia6a2e "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2usb","title":"2\u3001USB \u5ef6\u957f\u7ebf","text":"\u666e\u901a\u7684 USB \u7ebf\u5373\u53ef\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_3","title":"3\u3001\u675c\u90a6\u7ebf","text":"3.1\u300140P \u6bcd\u5bf9\u516c\u675c\u90a6\u7ebf\u3002 3.2\u3001\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"4\u3001\u5b89\u88c5\u56fe\u6587\u6559\u7a0b","text":"4.1\u3001\u4f7f\u7528 USB \u5ef6\u957f\u7ebf\u8fde\u63a5\u63a7\u5236\u7aef\u548c\u7ee7\u7535\u5668\u3002 4.2\u3001\u5728\u7ee7\u7535\u5668\u5e38\u7aef\u548c\u516c\u5171\u7aef\u5747\u8fde\u63a5\u4e00\u6839\u675c\u90a6\u7ebf\u3002 4.3\u3001\u5728\u4e3b\u677f\u4e0a\u5f00\u673a\u9488\u548c\u91cd\u542f\u9488\u4e0a\u63d2\u4e0a\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 4.4\u3001\u5c06\u5f00\u673a\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76841\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1\u5de6\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 4.5\u3001\u5c06\u91cd\u542f\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76842\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1 \u53f3\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 \u82e5\u60f3\u4fdd\u7559\u539f\u7535\u6e90\u5f00\u5173\u7684\u7535\u6e90\u706f\uff0c\u53ef\u6839\u636e\u5982\u4e0a\u56fe\u6240\u793a\uff0c\u4f7f\u7528\u675c\u90a6\u7ebf\u8fde\u63a5\u4e3b\u677f\u4e0a\u7684\u7535\u6e90\u706f\u548c\u539f\u7535\u6e90\u5f00\u5173"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_11","title":"\u5341\u4e00\u3001\u5e38\u89c1\u95ee\u9898\u8bf4\u660e","text":"1\u3001ERROR: for uos Cannot restart container 2301b1a1395d7959ee6523d61b61c87084649af530786cdb8fb5b3ecbcbd1068: linux runtime spec devices: error gathering device information while adding custom device \"/dev/ttyACM0\": no such file or directory \u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u8fde\u63a5\u72b6\u6001\uff0c\u67e5\u770b /dev/ttyACM0 \u662f\u5426\u5b58\u5728\uff0c\u82e5\u5b58\u5728 /dev/ttyACMn\uff08n\u4e3a\u4efb\u610f\u6570\u5b57\uff09\uff0c\u91cd\u542f\u7535\u8111\u89e3\u51b3\u3002 2\u3001Error response from daemon: Container 5e700fdc769e8c74666d68a7f2bc3de58268b4594cf88706609d59f8dbc7362d is not running \u5bb9\u5668\u542f\u52a8\u5931\u8d25 1\uff09\u68c0\u67e5\u54ea\u4e00\u4e2a\u5bb9\u5668\u672a\u542f\u52a8 sudo docker container ls # \u5217\u51fa\u8fd0\u884c\u4e2d\u7684 Docker \u5bb9\u5668\n 2\uff09\u7f3a\u5c11 uos \u5bb9\u5668\uff0c\u68c0\u67e5 USB \u4e32\u53e3\u8fde\u63a5\u7ebf\u548c\u91c7\u96c6\u76d2\u8fde\u63a5\u7ebf\u662f\u5426\u6b63\u5e38\uff0c\u91cd\u542f\u540e\u6267\u884c bash install/setup.up # \u91cd\u65b0\u5b8c\u6574\u90e8\u7f72\u73af\u5883\n \u6216\u6267\u884c sudo docker-compose up -d --build # \u4ec5\u91cd\u65b0\u6784\u5efa Docker \u955c\u50cf\n 3\u3001\u82e5\u90e8\u7f72\u65f6\u63d0\u793a\u6302\u8f7d ttyACM0\u3001video0 \u5931\u8d25\uff0c\u8bf7\u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u53ca\u91c7\u96c6\u76d2\u662f\u5426\u63a5\u89e6\u826f\u597d\uff0c\u82e5\u63a5\u89e6\u826f\u597d\uff0c\u91cd\u542f\u5373\u53ef\u89e3\u51b3\u3002 4\u3001\u82e5\u51fa\u73b0\u56fe\u7247\u80fd\u8bc6\u522b\uff0c\u4f46\u662f\u9f20\u6807\u672a\u79fb\u52a8\u64cd\u4f5c\u65f6\uff0c\u5b89\u88c5\u7edd\u5bf9\u9f20\u6807\u64cd\u4f5c\u7684\u4f9d\u8d56\u5305\uff0c\u89c1\u7b2c\u4e09\u8282\u7b2c\u4e8c\u5c0f\u8282\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u6d4b\u8bd5\u673a\u3002 5\u3001\u7531\u4e8e\u901a\u8fc7\u91c7\u96c6\u5361\u83b7\u53d6\u7684\u6d4b\u8bd5\u673a\u5b9e\u65f6\u753b\u9762\uff0c\u5305\u542b\u4e86\u9f20\u6807\u7684\u6837\u5f0f\uff0c\u6240\u4ee5\u5bf9\u56fe\u7247\u8bc6\u522b\u65f6\uff0c\u9f20\u6807\u82e5\u505c\u7559\u5728\u56fe\u6807\u4e0a\u5c42\uff0c\u5219\u4f1a\u5bf9\u8bc6\u522b\u7ed3\u679c\u9020\u6210\u5f71\u54cd\uff0c\u9700\u8981\u5c06\u9f20\u6807\u79fb\u52a8\u81f3\u5176\u4ed6\u4f4d\u7f6e\uff0c\u6216\u8005\u9690\u85cf\u9f20\u6807\u89e3\u51b3\u3002 6\u3001Excel \u62a5\u544a\u4e2d\uff0c\u6d4b\u8bd5\u573a\u666f\u5217\u4e0e\u7528\u4f8b\u4e2d\u7684\u4e0d\u4e00\u81f4\uff0c\u5173\u952e\u5b57scene\u3001app_name\u3001\u67b6\u6784\u522b\u540d\uff0c\u4e0d\u80fd\u5305\u542b\u4e0b\u5212\u7ebf\u548c\u82f1\u6587\u7b26\u53f7\u7684\u5706\u62ec\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/","title":"\u6846\u67b6\u529f\u80fd\u4ecb\u7ecd","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2023/1/12\n# Author : Mikigo\n# =============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_2","title":"\u4e00\u3001\u4e00\u53e5\u8bdd\u7b80\u4ecb","text":"\u6b64\u6587\u6863\u4e3b\u8981\u60f3\u5bf9 YouQu \u6846\u67b6\u4e00\u4e9b\u91cd\u70b9\u7684\u529f\u80fd\u505a\u8be6\u7ec6\u7684\u4ecb\u7ecd\uff0c\u5305\u62ec\u5bf9\u4e00\u4e9b\u529f\u80fd\u5f00\u53d1\u7684\u80cc\u666f\u3001\u8981\u89e3\u51b3\u7684\u95ee\u9898\u3001\u5b9e\u73b0\u903b\u8f91\u3001\u4ee3\u7801\u7b49\u65b9\u9762\u7684\u4ecb\u7ecd\uff0c\u4ee5\u6b64\u8ba9\u5927\u5bb6\u80fd\u66f4\u52a0\u6e05\u6670\u7684\u7406\u89e3\u5404\u9879\u529f\u80fd\uff0c\u4ece\u800c\u5728\u4f7f\u7528\u7684\u65f6\u5019\u80fd\u66f4\u52a0\u7684\u5f97\u5fc3\u5e94\u624b\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_3","title":"\u4e8c\u3001\u56fe\u50cf\u8bc6\u522b","text":"\u56fe\u50cf\u8bc6\u522b\u5728 UI \u81ea\u52a8\u5316\u4e2d\u662f\u4e0d\u53ef\u7f3a\u5c11\u7684\uff0c\u5e02\u9762\u4e0a\u751a\u81f3\u6709\u5b8c\u5168\u57fa\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\uff0c\u6bd4\u5982 Airtest\u3001Sikuli \u7b49\uff0c\u5728\u6e38\u620f\u7b49\u7279\u5b9a\u9886\u57df\u4e5f\u6709\u4e0d\u9519\u7684\u6548\u679c\uff0c\u8fd9\u4e9b\u5de5\u5177\u5b9e\u9645\u4e0a\u4e5f\u662f\u7528\u7684 OpenCV \u8fdb\u884c\u4e86\u5c01\u88c5\uff0cYouQu \u6846\u67b6\u57fa\u4e8e OpenCV \u5f00\u53d1\u4e86\u81ea\u5df1\u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\uff0c\u5b83\u53ef\u4ee5\u65b9\u4fbf\u7684\u7528\u4e8e\u754c\u9762\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u65ad\u8a00\uff1b YouQu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u51e0\u4e4e\u6ee1\u8db3\u4e86\u4f60\u7684\u6240\u6709\u8981\u6c42\uff0c\u6211\u4eec\u5728\u957f\u65f6\u95f4\u7684\u601d\u8003\u548c\u6478\u7d22\u4e2d\uff0c\u9488\u5bf9\u5e38\u89c4\u573a\u666f\u53ca\u4e00\u4e9b\u7279\u6b8a\u573a\u666f\u63a2\u7d22\u9664\u4e86\u4e00\u4e9b\u5b9e\u7528\u4e14\u6709\u6548\u7684\u65b9\u6848\uff0c\u4e14\u542c\u6211\u6162\u6162\u9053\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1","title":"1\u3001\u5e38\u89c4\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5e38\u89c4\u8bc6\u522b\u5f88\u597d\u7406\u89e3\uff0c\u4e00\u53e5\u8bdd\u8bb2\u5c31\u662f\uff0c\u8981\u83b7\u53d6\u5230\u76ee\u6807\u5143\u7d20\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u3002 \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u5728\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u9700\u8981\u83b7\u53d6\u7684\u5750\u6807\u662f\u76f8\u5bf9\u4e8e\u6574\u4e2a\u5c4f\u5e55\u7684\u5750\u6807\uff0c\u6211\u4eec\u53ef\u4ee5\u622a\u53d6\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u56fe\u7247\uff08screen\uff09\uff1b \u5728\u5143\u7d20\u8bc6\u522b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u622a\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5c0f\u56fe\u8fdb\u884c\u8bc6\u522b\uff0c\u6bd4\u5982\u622a\u53d6\u64ad\u653e\u6309\u94ae\uff1a \u90a3\u4e48\u5b9e\u9645\u4e0a\uff0c\u5143\u7d20\u5b9a\u4f4d\u7684\u95ee\u9898\u5c31\u8f6c\u6362\u4e3a\uff0c\u5c06\u622a\u56fe\u7684\u5c0f\u56fe\uff08play_btn\uff09\u62ff\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u5927\u56fe\uff08screen\uff09\u4e2d\u53bb\u505a\u5339\u914d\uff0c\u5982\u679c\u5339\u914d\u6210\u529f\uff0c\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff08 x, y \uff09\u5373\u53ef\u3002 \u4e3a\u4e86\u65b9\u4fbf\u63cf\u8ff0\uff0c\u4ee5\u4e0b\u6211\u5c06\u6574\u4e2a\u5c4f\u5e55\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5927\u56fe\uff0c\u67d0\u4e2a\u5143\u7d20\u56fe\u7247\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5c0f\u56fe\u3002 \u57fa\u4e8e OpenCV \u7684\u6a21\u677f\u5339\u914d cv.matchTemplate() \u529f\u80fd\uff0c\u6211\u4eec\u5b9e\u73b0\u4e86\u56fe\u50cf\u5b9a\u4f4d\u7684\u529f\u80fd\uff0c\u6846\u67b6\u63d0\u4f9b\u4e86\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u5e95\u5c42\u63a5\u53e3\uff08\u4e00\u822c\u4e0d\u5bf9\u4e0a\u5c42\u63d0\u4f9b\u8c03\u7528\uff09\uff1a def _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\n# \u8be6\u7ec6\u4ee3\u7801\u592a\u957f\u4e0d\u8d34\u4e86\uff0c\u611f\u5174\u8da3\u8bf7\u67e5\u770b\u6e90\u7801\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001image_path image_path \u662f\u5c0f\u56fe\u7684\u7edd\u5bf9\u8def\u5f84; \u901a\u5e38\u5728 AT \u5de5\u7a0b\u91cc\u9762\uff0c\u6211\u4eec\u7ea6\u5b9a\u5c06\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u5b9e\u9645\u7684\u5143\u7d20\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1aplay_btn.png \uff1b \u7528\u4e8e\u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 case/assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1amusic_001.png \uff1b \u8fd9\u6837\u662f\u4e3a\u4e86\u65b9\u4fbf\u7ba1\u7406\u548c\u7ef4\u62a4\u3002 2\u3001rate \u56fe\u50cf\u8bc6\u522b\u7684\u7684\u5339\u914d\u5ea6\u6216\u8005\u8bf4\u76f8\u4f3c\u5ea6\uff0c\u6846\u67b6\u9ed8\u8ba4\u7684\u914d\u7f6e\u4e3a 0.9\uff0c\u4e5f\u5c31\u662f\u8bf4\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u5b58\u5728\u4e00\u4e2a\u76f8\u4f3c\u5ea6 90% \u7684\u56fe\u6807\u5373\u8fd4\u56de\u5176\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff1b \u5982\u679c\u4f60\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u8c03\u6574\u8bc6\u522b\u5ea6\uff0c\u4f60\u53ef\u4ee5\u5728\u8c03\u7528\u51fd\u6570\u7684\u65f6\u5019\uff0c\u4f20\u5165\u4e0d\u540c\u7684\u8bc6\u522b\u5ea6\u7684\u503c\u3002 3\u3001multiple \u9ed8\u8ba4\u60c5\u51b5\u4e0b multiple=False\uff0c\u8868\u793a\u53ea\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u7b2c\u4e00\u4e2a\uff0c\u5982\u679c multiple=True \u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\uff0c\u56e0\u4e3a\u5927\u56fe\u4e2d\u53ef\u80fd\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u5c0f\u56fe\uff0c\u5728\u67d0\u4e9b\u573a\u666f\u4e0b\u4f60\u53ef\u80fd\u9700\u8981\u5168\u90e8\u83b7\u53d6\u5230\u6240\u6709\u5339\u914d\u5230\u7684\u5750\u6807\u3002 4\u3001picture_abspath \u9ed8\u8ba4\u60c5\u51b5\u4e0b picture_abspath=None \u8868\u793a\u5927\u56fe\u4e3a\u622a\u53d6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u5982\u679c\u4f60\u4e0d\u5e0c\u671b\u5927\u56fe\u662f\u5c4f\u5e55\u7684\u622a\u56fe\uff0c\u800c\u662f\u4f60\u81ea\u5b9a\u4e49\u4f20\u5165\u7684\u67d0\u4e2a\u56fe\u7247\uff0c\u4f60\u53ea\u9700\u8981\u5c06\u4f60\u7684\u56fe\u7247\u8def\u5f84\u4f20\u9012\u7ed9\u8fd9\u4e2a\u53c2\u6570\u5c31\u884c\uff0c\u6bd4\u5982\uff1a picture_abspath=\"~/Desktop/big.png\" \uff1b 5\u3001screen_bbox \u5927\u56fe\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u622a\u53d6\u6574\u4e2a\u5c4f\u5e55\uff0cscreen_bbox = [x, y, w, h] \u53ef\u4ee5\u6307\u5b9a\u622a\u53d6\u5c4f\u5e55\u4e2d\u7684\u56fa\u5b9a\u533a\u57df\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\uff0c\u53ef\u4ee5\u6392\u9664\u90e8\u5206\u533a\u57df\u5bf9\u8bc6\u522b\u7ed3\u679c\u7684\u5f71\u54cd\u3002 \u3010\u9690\u5f0f\u7b49\u5f85\u3011 \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\uff0c\u6709\u65f6\u5019\u9875\u9762\u8df3\u8f6c\u6709\u5ef6\u65f6\uff0c\u6709\u53ef\u80fd\u5b58\u5728\u8bc6\u522b\u7684\u90a3\u4e00\u523b\u9875\u9762\u4e5f\u6ca1\u6709\u8df3\u8f6c\u51fa\u6765\uff0c\u6216\u8005\u6216\u8005\u8bc6\u522b\u7684\u90a3\u4e00\u523b\uff1b \u56e0\u6b64\u6211\u4eec\u9700\u8981\u4e00\u79cd\u7b49\u5f85\u673a\u5236\uff0c\u5373\u5728\u4e00\u5b9a\u7684\u65f6\u95f4\u5185\uff0c\u5982\u679c\u8bc6\u522b\u4e0d\u5230\uff0c\u91cd\u590d\u53bb\u8bc6\u522b\uff1a def find_image(\ncls,\n*widget, rate: [float, int] = None,\nmultiple: bool = False,\nmatch_number: int = None,\npicture_abspath: str = None,\nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u5728\u5c4f\u5e55\u4e2d\u533a\u5bfb\u627e\u5c0f\u56fe\uff0c\u8fd4\u56de\u5750\u6807\uff0c\n \u5982\u679c\u627e\u4e0d\u5230\uff0c\u6839\u636e\u914d\u7f6e\u91cd\u8bd5\u6b21\u6570\uff0c\u6bcf\u6b21\u95f4\u96941\u79d2\n :param widget: \u6a21\u677f\u56fe\u7247\u8def\u5f84\n :param rate: \u76f8\u4f3c\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param match_number: \u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\n :return: \u5750\u6807\u5143\u7ec4\n \"\"\"\nif rate is None:\nrate = float(GlobalConfig.IMAGE_RATE)\ntry:\nfor element in widget:\nfor _ in range((match_number or int(GlobalConfig.IMAGE_MATCH_NUMBER)) + 1):\nlocate = cls._match_image_by_opencv(\nelement,\nrate,\nmultiple=multiple,\npicture_abspath=picture_abspath,\nscreen_bbox=screen_bbox\n)\nif not locate:\nsleep(int(GlobalConfig.IMAGE_MATCH_WAIT_TIME))\nelse:\nreturn locate\nraise TemplateElementNotFound(*widget)\nexcept Exception as e:\nraise e\n \u53c2\u6570 match_number \u7528\u4e8e\u63a7\u5236\u91cd\u590d\u8bc6\u522b\u7684\u6b21\u6570\uff0c\u9ed8\u8ba4\u4e0d\u4f20\u53c2\uff0c\u53d6\u5168\u5c40\u914d\u7f6e setting/globalconfig.ini \u91cc\u9762\u7684 IMAGE_MATCH_NUMBER \u914d\u7f6e\u9879\u7684\u503c\uff0c\u9ed8\u8ba4IMAGE_MATCH_NUMBER = 1\uff0c\u5373\u91cd\u8bd5 1 \u6b21\uff1b find_image \u662f\u6846\u67b6\u63d0\u4f9b\u7684\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u51fd\u6570\u63a5\u53e3\uff0c\u8fd9\u4e2a\u51fd\u6570\u63d0\u4f9b\u4e86\u9690\u5f0f\u7b49\u5f85\u7684\u529f\u80fd\uff0c\u4e14\u5305\u542b\u4e0a\u9762\u4ecb\u7ecd\u7684 _match_image_by_opencv \u51fd\u6570\u7684\u6240\u6709\u529f\u80fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2","title":"2\u3001\u6c14\u6ce1\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u6c14\u6ce1\u8bc6\u522b\u6307\u7684\u662f\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\u8981\u5b9a\u4f4d\u7684\u5143\u7d20\u662f\u4e00\u4e9b\u4f1a\u6d88\u5931\u7684\u5c0f\u5f39\u7a97\uff0c\u8fd9\u7c7b\u573a\u666f\u5728\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\u5c31\u53ef\u80fd\u5b58\u5728\u4e0d\u7a33\u5b9a\u6027\uff0c\u6709\u53ef\u80fd\u56fe\u50cf\u8bc6\u522b\u7684\u65f6\u5019\u6c14\u6ce1\u5df2\u7ecf\u6d88\u5931\u4e86\uff0c\u4e5f\u6709\u53ef\u80fd\u6c14\u6ce1\u51fa\u73b0\u7684\u65f6\u95f4\u592a\u77ed\u4e86\uff0c\u4e0d\u5bb9\u6613\u6355\u6349\u5230\uff0c\u5c31\u50cf\u6c14\u6ce1\u4e00\u6837\uff0c\u51fa\u73b0\u4e00\u4e0b\u5c31\u6d88\u5931\uff0c\u56e0\u6b64\u6211\u4eec\u5f62\u8c61\u7684\u79f0\u4e4b\u4e3a \u201c\u6c14\u6ce1\u8bc6\u522b\u201d\uff1b \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u4e3a\u4e86\u80fd\u7a33\u5b9a\u7684\u8bc6\u522b\u6c14\u6ce1\u7c7b\u573a\u666f\uff0c\u6211\u4eec\u91c7\u7528\u7684\u65b9\u6848\u662f\uff1a \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\uff08\u5305\u542b\u6c14\u6ce1\u4ece\u51fa\u73b0\u5230\u6d88\u5931\uff09\uff0c\u4e0d\u505c\u7684\u622a\u53d6\u8fd9\u6bb5\u65f6\u95f4\u5185\u7684\u5927\u56fe\uff0c\u4ee5\u6b64\u786e\u4fdd\u5728\u622a\u53d6\u7684\u4e00\u5806\u56fe\u7247\u4e2d\uff0c\u80af\u5b9a\u6709\u81f3\u5c11\u4e00\u5f20\u56fe\u7247\u80fd\u6355\u6349\u5230\u6c14\u6ce1\uff0c\u6700\u540e\u518d\u5bf9\u8fd9\u4e00\u5806\u56fe\u7247\u9010\u4e2a\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def get_during(\ncls,\nimage_path: str,\nscreen_time: [float, int],\nrate: float = None,\npause: [int, float] = None,\nmax_range: int = 10000\n):\n\"\"\"\n \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u622a\u56fe\u591a\u5f20\u56fe\u7247\u8fdb\u884c\u8bc6\u522b\uff0c\u5176\u4e2d\u6709\u4e00\u5f20\u56fe\u7247\u8bc6\u522b\u6210\u529f\u5373\u8fd4\u56de\u7ed3\u679c;\n \u9002\u7528\u4e8e\u6c14\u6ce1\u7c7b\u7684\u65ad\u8a00\uff0c\u6bd4\u5982\u6c14\u6ce1\u57281\u79d2\u5185\u6d88\u5931\uff0c\u5982\u679c\u7528\u5e38\u89c4\u7684\u56fe\u50cf\u8bc6\u522b\u5219\u6709\u53ef\u80fd\u65e0\u6cd5\u8bc6\u522b\u5230\uff1b\n :param image_path: \u8981\u8bc6\u522b\u7684\u6a21\u677f\u56fe\u7247\uff1b\n :param screen_time: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff1b\n :param rate: \u8bc6\u522b\u7387\uff1b\n :param pause: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u4e0d\u95f4\u9694\uff1b\n :param max_range: \u622a\u56fe\u7684\u6700\u5927\u6b21\u6570\uff0c\u8fd9\u662f\u4e00\u4e2a\u9884\u8bbe\u503c\uff0c\u4e00\u822c\u60c5\u51b5\u4e0b\u4e0d\u6d89\u53ca\u4fee\u6539\uff1b\n \"\"\"\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001screen_time \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5728\u6b64\u65f6\u95f4\u5185\u4f1a\u4e0d\u65ad\u7684\u8fdb\u884c\u622a\u56fe\u64cd\u4f5c\uff0c\u5c31\u50cf\u5f55\u5236\u89c6\u9891\u4e00\u6837\uff1b 2\u3001pause \u6bcf\u6b21\u622a\u53d6\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u4e00\u523b\u4e0d\u505c\u7684\u622a\u56fe\uff0c\u5982\u679c\u4f60\u60f3\u6bcf\u6b21\u622a\u56fe\u5b58\u5728\u4e00\u4e9b\u95f4\u9694\u65f6\u95f4\u4f20\u5165\u5bf9\u5e94\u7684\u65f6\u95f4\u95f4\u9694\u5373\u53ef\uff0c\u5355\u4f4d\u662f\u79d2\uff0c\u6bd4\u5982\uff1apause = 0.03\uff0c\u8868\u793a 30 ms\uff0c\u76f8\u5f53\u4e8e\u5e27\u7387\u4e3a 30 \u5e27\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-opencv","title":"3\u3001\u4e0d\u4f9d\u8d56 OpenCV \u7684\u56fe\u50cf\u8bc6\u522b\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31","title":"3.1\u3001\u81ea\u7814\u56fe\u50cf\u8bc6\u522b\u6280\u672f","text":"\u3010\u539f\u7406\u3011 \u4e3a\u4e86\u5b9e\u73b0\u8bc6\u522b\u56fe\u50cf\u7684\u76ee\u7684\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u5c06\u56fe\u7247\u7684\u6bcf\u4e2a\u50cf\u7d20\u7684RGB\u503c\uff0c\u4e0e\u6574\u4e2a\u5c4f\u5e55\u4e2d\u7684RGB\u8fdb\u884c\u5bf9\u6bd4\uff0c\u5982\u679c\u5c0f\u56fe\u4e0a\u7684RGB\u503c\u4e0e\u5bf9\u5e94\u5927\u56fe\u4f4d\u7f6e\u7684RGB\u90fd\u76f8\u7b49\uff0c\u5219\u5339\u914d\u6210\u529f\uff0c\u5373\u53ef\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u70b9\u3002 1\u3001\u8bfb\u53d6\u5c0f\u56fe\u548c\u5927\u56fe\u7684RGB\u503c \uff081\uff09\u5c0f\u56fe\u7684RGB\u503c small_data = small_pic.load() # load()\u4f1a\u5c06\u56fe\u7247\u7684RGB\u503c\u83b7\u53d6\u5230\uff0c\u6570\u636e\u683c\u5f0f\u4e3a\u4e00\u4e2a\u4e8c\u7ef4\u5217\u8868\uff0c\u8d4b\u503c\u7ed9\u4e00\u4e2a\u53d8\u91cfsmall_data\u3002\n \uff082\uff09\u5927\u56fe\u7684RGB\u503c big_data = big_pic.load()\n 2\u3001\u5c06\u5c0f\u56fe\u4e0e\u5927\u56fe\u7684RGB\u503c\u8fdb\u884c\u5339\u914d \uff081\uff09\u5339\u914d\u4ece\u5927\u56fe\u7684\u5750\u6807\uff080\uff0c0\uff09\u5f00\u59cb\u5339\u914d\uff0c\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff082\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\uff080\uff0c0\uff09\u5bf9\u5e94\u7684\u6240\u6709\u5c0f\u56fe\u7684RGB\u503c\u4e0d\u76f8\u7b49\uff0c\u5219\u79fb\u52a8\u5230\u4e0b\u4e00\u4e2a\u5750\u6807\u70b9\uff081\uff0c0\uff09\uff0c\u540c\u6837\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff083\uff09\u6309\u7167\u8fd9\u6837\u7684\u89c4\u5f8b\u5c06\u8fd9\u4e00\u884c\u6bcf\u79fb\u52a8\u4e00\u4e2a\u5750\u6807\u70b9\uff0c\u90fd\u5c06\u5c0f\u56fe\u6240\u6709\u7684RGB\u4e0e\u5bf9\u5e94\u5927\u56fe\u7684\u503c\u8fdb\u884c\u5339\u914d\uff1b \uff084\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\u5176\u4e2d\u4e00\u4e2a\u5750\u6807\u70b9\u4e0a\u5339\u914d\u5230\u4e86\u5c0f\u56fe\u7684\u6240\u6709RGB\u503c\uff0c\u5219\u6b64\u65f6\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\u70b9\uff1b \uff085\uff09\u5982\u679c\u5339\u914d\u4e86\u5927\u56fe\u6240\u6709\u7684\u5750\u6807\u70b9\uff0c\u90fd\u6ca1\u6709\u5339\u914d\u5230\uff0c\u5219\u8bf4\u660e\u5927\u56fe\u4e2d\u4e0d\u5b58\u5728\u5c0f\u56fe\uff0c\u5339\u914d\u5931\u8d25\uff1b \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 class ImageRgb:\n@staticmethod\ndef _check_match(_x, _y, small, bdata, sdata, rate):\n\"\"\"\n Matching degree of small graph and large graph matching\n \"\"\"\n@staticmethod\ndef _pre_random_point(small):\n\"\"\"\n Pre matching, take 10-20 points at random each time,\n and take coordinates randomly in the small graph\n \"\"\"\n@staticmethod\ndef _pre_random_match(_x, _y, point_list, bdata, sdata, rate):\n\"\"\"\n In the small graph, several points are randomly\n selected for matching, and the matching degree is\n also set for the random points\n \"\"\"\n@classmethod\ndef match_image_by_rgb(cls, image_name=None, image_path=None, rate=0.9):\n\"\"\"\n By comparing the RGB values of the small image with the large\n image on the screen, the coordinates of the small image on\n the screen are returned.\n \"\"\"\n \u901a\u8fc7 match_image_by_rgb() \u8fd9\u4e2a\u51fd\u6570\uff0c\u4f20\u5165\u76ee\u6807\u5c0f\u56fe\u7684\u6587\u4ef6\u540d\u79f0\uff0c\u5373\u53ef\u8fd4\u56de\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u3002 \u6709\u540c\u5b66\u8981\u95ee\u4e86\uff0c\u6709 OpenCV \u5e72\u561b\u4e0d\u7528\uff0c\u6709\u5fc5\u8981\u81ea\u5df1\u5b9e\u73b0\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u529f\u80fd\u5417\uff0c\u4f60\u4eec\u662f\u4e0d\u662f\u95f2\u7684\u554a\uff1f \u8fd9\u4e48\u95ee\u7684\u8bdd\uff0c\u5c0f\u4e86\uff0c\u683c\u5c40\u5c0f\u4e86\uff1b\u6211\u4eec\u81ea\u5df1\u5b9e\u73b0\u4e3b\u8981\u6709\u51e0\u65b9\u9762\u539f\u56e0\uff1a \u51cf\u5c11\u73af\u5883\u4f9d\u8d56\uff0c\u5373\u4e0d\u7528\u5b89\u88c5 OpenCV\uff0c\u6211\u4eec\u4e5f\u80fd\u5b9e\u73b0\u5176\u529f\u80fd\uff0c\u73af\u5883\u4f9d\u8d56\u8fd9\u5757\u540e\u9762\u4f1a\u5355\u72ec\u8be6\u7ec6\u8bb2\uff0c\u51cf\u5c11\u73af\u5883\u4f9d\u8d56\u5bf9\u4e8e\u4efb\u4f55\u8f6f\u4ef6\u5de5\u7a0b\u90fd\u975e\u5e38\u91cd\u8981\uff1b OpenCV \u5728\u5176\u4ed6\u56fd\u4ea7 CPU \u67b6\u6784\u4e0a\u5b89\u88c5\u5e76\u4e0d\u80fd\u4fdd\u8bc1100%\u6210\u529f\uff0c\u751a\u81f3\u6709\u6ca1\u6709\u53ef\u80fd\u5728\u4e00\u4e9b\u67b6\u6784\u4e0a\u538b\u6839\u513f\u5c31\u4e0d\u80fd\u5b89\u88c5\u4f7f\u7528 OpenCV \uff1f \u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 OpenCV \uff1f\u5c31\u50cf\u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 Windows \u5462\uff1f\u8fd9\u4e9b\u95ee\u9898\u503c\u5f97\u601d\u8003\u3002 \u5f53\u7136\uff0c\u6211\u4eec\u627f\u8ba4\u8fd9\u5957\u65b9\u6848\uff0c\u867d\u7136\u8bc6\u522b\u51c6\u786e\u7387\u6ca1\u95ee\u9898\uff0c\u4f46\u5728\u8bc6\u522b\u6548\u7387\u4e0a\u8fd8\u6ca1\u6709\u8fbe\u5230 OpenCV \u6a21\u677f\u5339\u914d\u7684\u6548\u679c\uff0c\u6211\u4eec\u7684\u65b9\u6848\u6bcf\u6b21\u8bc6\u522b\u5728 1.5s \u5de6\u53f3\uff0c\u800c OpenCV \u5728 1s \u5de6\u53f3\uff1b \u6574\u4f53\u8bc6\u522b\u6548\u679c\u6765\u8bb2\uff0c\u6211\u8ba4\u4e3a\u8fd8\u662f\u53ef\u4ee5\u63a5\u53d7\u7684\uff0c\u4e5f\u5e0c\u671b\u6709\u5fd7\u4e4b\u58eb\u80fd\u4e00\u8d77\u4f18\u5316\u6b64\u65b9\u6848\uff0c\u4e00\u8d77\u6280\u672f\u62a5\u56fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32-rpc","title":"3.2\u3001\u57fa\u4e8e RPC \u670d\u52a1\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b","text":"\u5728\u8fdc\u7a0b\u670d\u52a1\u5668\u4e0a\u90e8\u7f72 OpenCV \u7684\u73af\u5883\uff0c\u5e76\u5c06\u5176\u90e8\u7f72\u4e3a RPC \u670d\u52a1\uff0c\u6d4b\u8bd5\u673a\u4e0a\u4e0d\u7528\u5b89\u88c5 OpenCV \u4f9d\u8d56\uff0c\u800c\u662f\u901a\u8fc7\u8bf7\u6c42 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u3010\u539f\u7406\u3011 \u6d4b\u8bd5\u673a\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u56fe\u7247\u4ee5\u53ca\u6a21\u677f\u56fe\u7247\uff0c\u53d1\u9001\u7ed9 RPC \u670d\u52a1\u7aef\uff0c\u670d\u52a1\u7aef\u62ff\u5230\u4e24\u5f20\u56fe\u7247\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u6700\u540e\u5c06\u8bc6\u522b\u7ed3\u679c\u8fd4\u56de\u7ed9\u6d4b\u8bd5\u673a\uff1b \u8981\u7279\u6b8a\u8bf4\u660e\u7684\u662f\uff1a RPC \u662f\u4e00\u79cd\u534f\u8bae\uff0c\u8bb8\u591a\u8bed\u8a00\u90fd\u662f\u652f\u6301\u7684\uff0c\u6bd4\u5982\u8bf4\u670d\u52a1\u7aef\u4e5f\u53ef\u4ee5\u7528 C++ \u6765\u5b9e\u73b0\uff0c\u5ba2\u6237\u7aef\u4f7f\u7528 Python \u4e5f\u662f\u53ef\u4ee5\u8c03\u7528\u7684\u3002 \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 \u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nimport cv2 as cv\nimport numpy as np\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\nif __name__ == \"__main__\":\nserver = ThreadXMLRPCServer((\"x.x.x.x\", 8889), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(match_image_by_opencv, \"match_image_by_opencv\")\nserver.serve_forever()\n \u8fd9\u6837\uff0c\u6211\u4eec\u57fa\u4e8e Python \u6807\u51c6\u5e93 xmlrpc \u642d\u5efa\u4e86\u4e00\u4e2a RPC \u670d\u52a1\u5668\uff0c\u6ce8\u518c\u4e86 image_put \u548c match_image_by_opencv \u4e24\u4e2a\u529f\u80fd\u63a5\u53e3\uff0c\u5728\u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u901a\u8fc7 IP \u548c\u7aef\u53e3\u8fdb\u884c RPC \u8bf7\u6c42\uff1b \u5ba2\u6237\u7aef\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from xmlrpc.client import Binary\nfrom xmlrpc.client import ServerProxy\nserver = ServerProxy(GlobalConfig.OPENCV_SERVER_HOST, allow_none=True)\nscreen_rb = open(screen, \"rb\")\ntemplate_rb = open(template_path, \"rb\")\ntry:\nscreen_path = server.image_put(Binary(screen_rb.read()))\nscreen_rb.close()\ntpl_path = server.image_put(Binary(template_rb.read()))\ntemplate_rb.close()\nreturn server.match_image_by_opencv(\ntpl_path, screen_path, rate, multiple\n)\nexcept OSError as exc:\nraise EnvironmentError(\nf\"RPC\u670d\u52a1\u5668\u94fe\u63a5\u5931\u8d25. {GlobalConfig.OPENCV_SERVER_HOST}\"\n) from exc\n \u901a\u8fc7\u8fd4\u56de server.match_image_by_opencv \u5c31\u83b7\u53d6\u4e86\u5728\u670d\u52a1\u7aef\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4","title":"4\u3001\u53f3\u952e\u83dc\u5355\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41","title":"4.1\u3001\u53f3\u952e\u83dc\u5355\u5b9a\u4f4d\u7684\u65b9\u6848\u53ca\u95ee\u9898","text":"\u53f3\u952e\u83dc\u5355\u7684\u5143\u7d20\u5b9a\u4f4d\u662f\u4e00\u4e2a\u96be\u70b9\uff0c\u8fc7\u53bb\u6211\u4eec\u8c03\u7814\u548c\u4f7f\u7528\u8fc7\u7684\u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u65b9\u6cd5\u6709 4 \u79cd\uff1a \u7b2c\u4e00\u79cd\uff1a\u6b65\u957f\u64cd\u4f5c\u6cd5 \u5728\u53f3\u952e\u83dc\u5355\u547c\u51fa\u6765\u4e4b\u540e\uff0c\u901a\u8fc7\u952e\u76d8\u7684 up\u3001down \u6309\u952e\uff0c\u8fdb\u884c\u9009\u62e9\u83dc\u5355\u9009\u62e9\uff0c\u9009\u4e2d\u76ee\u6807\u4e4b\u540e enter \u5373\u53ef\uff1b\u6bd4\u5982\uff1a\u5728\u684c\u9762\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\uff0c\u6309 1 \u6b21 down \uff0c\u4f1a\u51fa\u73b0\u4e0b\u56fe\uff1a \u7ee7\u7eed\u518d\u6309 2 \u6b21 down\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u518d\u6309 enter\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u5982\u6b64\uff0c\u201c\u6392\u5e8f\u65b9\u5f0f\u201d\u7684\u6b65\u957f\u4e3a 3\uff1b\u901a\u8fc7\u4f7f\u7528\u952e\u76d8\u4e0a\u4e0b\u952e\uff0c\u5c31\u5b9e\u73b0\u4e86\u5bf9\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\uff1b \u4f46\u662f\uff0c\u8fd9\u79cd\u65b9\u5f0f\u6709\u4e2a\u5f88\u70e6\u4eba\u7684\u95ee\u9898\uff0c\u5c31\u662f\u53f3\u952e\u83dc\u5355\u7684\u9009\u9879\u4f4d\u7f6e\u4e0d\u53ef\u80fd\u4e00\u76f4\u4e0d\u53d8\uff0c\u5728\u9700\u6c42\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\uff0c\u83dc\u5355\u9009\u9879\u7684\u53d8\u5316\u662f\u5f88\u5927\u7684\uff0c\u751a\u81f3\u6709\u4e9b\u5e94\u7528\u652f\u6301\u81ea\u5b9a\u4e49\u83dc\u5355\uff0c\u6bd4\u5982\u6587\u7ba1\u53f3\u952e\u83dc\u5355\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff1b \u4e5f\u5c31\u662f\u8bf4\u4f60\u5f97\u7ecf\u5e38\u53bb\u7ef4\u62a4\u83dc\u5355\u9009\u9879\u7684\u6b65\u957f\uff0c\u4e00\u4e2a\u9009\u9879\u73b0\u5728\u7684\u6b65\u957f\u662f 3\uff0c\u4e0b\u4e2a\u8fed\u4ee3\u53ef\u80fd\u5c31\u662f 4 \u6216\u8005 5\u3002 \u7b2c\u4e8c\u79cd\uff1a\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u6cd5 \u628a\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5355\u72ec\u622a\u56fe\u4fdd\u5b58\uff0c\u56fe\u7247\u4e2d\u4ec5\u5305\u542b\u4e00\u4e2a\u83dc\u5355\u9009\u9879\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u8fd9\u6837\uff0c\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5c31\u53ef\u4ee5\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u65b9\u5f0f\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u8fd9\u79cd\u65b9\u5f0f\u4e0d\u7528\u62c5\u5fc3\u83dc\u5355\u9009\u9879\u7684\u987a\u5e8f\u6216\u4f4d\u7f6e\uff0c\u4f46\u662f\u9700\u8981\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff0c\u4e14\u5bb9\u6613\u53d7\u5230\u5b57\u4f53 UI \u53d8\u66f4\u7c7b\u9700\u6c42\u7684\u5f71\u54cd\uff0c\u6bd4\u5982\uff1a\u5b57\u4f53\u5927\u5c0f\u3001\u5b57\u4f53\u95f4\u8ddd\u7b49\u7b49\u9700\u6c42\u53d8\u66f4\u90fd\u4f1a\u5f71\u54cd\uff0c\u6bcf\u6b21\u53d8\u66f4\u4e4b\u540e\u5c31\u9700\u8981\u8fdb\u884c\u5927\u91cf\u56fe\u7247\u8d44\u6e90\u7684\u91cd\u65b0\u622a\u56fe\u66ff\u6362\uff0c\u662f\u4e2a\u6bd4\u8f83\u9ebb\u70e6\u7684\u4e8b\u60c5\uff1b \u7b2c\u4e09\u79cd\uff1a\u76f8\u5bf9\u4f4d\u79fb\u6cd5 \u9f20\u6807\u70b9\u51fb\u53f3\u952e\u7684\u65f6\u5019\uff0c\u9f20\u6807\u7684\u5f53\u524d\u5750\u6807\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u7684\uff0c\u83dc\u5355\u9009\u9879\u7684\u5bbd\uff08 w \uff09\u4e00\u822c\u662f\u56fa\u5b9a\u7684\uff0c\u53d8\u5316\u7684\u662f\u83dc\u5355\u7684\u957f\u5ea6\uff08 h \uff09\uff0c\u53ef\u4ee5\u901a\u8fc7\u67d0\u4e2a\u9009\u9879\u76f8\u5bf9\u4e8e\u9f20\u6807\u7684\u8ddd\u79bb\u5728\u786e\u5b9a\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u901a\u8fc7\u7ef4\u62a4\u83dc\u5355\u9009\u9879\uff08\u76f8\u5bf9\u4f4d\u7f6e\uff09\u76f8\u5bf9\u4e8e\u9f20\u6807\u4f4d\u7f6e\u7684\u8ddd\u79bb\uff0c\u5373\u53ef\u8f7b\u677e\u8ba1\u7b97\u51fa\u83dc\u5355\u9009\u9879\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\u3002 \u4ece\u7406\u8bba\u4e0a\u6b64\u65b9\u6848\u662f\u53ef\u884c\u7684\uff0c\u4f46\u662f\u8fd9\u91cc\u4ecd\u7136\u5b58\u5728\u4e24\u4e2a\u4e25\u91cd\u7684\u95ee\u9898\uff1a \u83dc\u5355\u987a\u5e8f\u6539\u53d8\uff0c\u5bfc\u81f4\u76f8\u5bf9\u8ddd\u79bb\u6539\u53d8\uff0c\u800c\u4e14\u8ddd\u79bb\u662f\u901a\u8fc7\u50cf\u7d20\uff08px\uff09\u6765\u8868\u793a\u7684\uff0c\u4e0d\u60f3\u6b65\u957f\u90a3\u4e48\u53ea\u7ba1\uff0c\u6bcf\u6b21\u9700\u8981\u53bb\u91cf\u4e00\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u70b9\u9ebb\u70e6\uff1b \u9f20\u6807\u5728\u684c\u9762\u4e0d\u540c\u4f4d\u7f6e\u70b9\u51fb\u53f3\u952e\uff0c\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u4f4d\u7f6e\u662f\u4e0d\u540c\u7684\uff0c\u4e0a\u56fe\u7684\u83dc\u5355\u662f\u5728\u9f20\u6807\u7684\u5de6\u4e0b\u65b9\uff0c\u5982\u679c\u4f60\u79fb\u52a8\u9f20\u6807\u5230\u5c4f\u5e55\u56db\u8fb9\uff0c\u4f60\u4f1a\u53d1\u73b0\uff0c\u53f3\u952e\u83dc\u5355\u53ef\u80fd\u51fa\u73b0\u5728\u9f20\u6807\u7684\u56db\u4e2a\u65b9\u5411\uff0c\u4e5f\u5c31\u662f\u8bf4\u4f60\u9700\u8981\u6839\u636e\u9f20\u6807\u7684\u4e0d\u540c\u4f4d\u7f6e\u6765\u5224\u65ad\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u65b9\u5411\uff0c\u800c\u4e0d\u540c\u7684\u65b9\u5411\u4e0a\u8ba1\u7b97\u65b9\u6cd5\u662f\u4e0d\u540c\u7684\uff0c\u6bd4\u5982\uff1a\u53f3\u952e\u83dc\u5355\u5728\u9f20\u6807\u7684\u5de6\u4e0a\uff0c\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\u8ba1\u7b97\u65b9\u6cd5\u4e3a\uff08x - w / 2\uff0c y - h\uff09\uff0c\u8fd9\u6837\u7ef4\u62a4\u8d77\u6765\u53ef\u4ee5\u8bf4\u975e\u5e38\u590d\u6742\uff1b \u57fa\u4e8e\u4ee5\u4e0a\u4e24\u4e2a\u539f\u56e0\uff0c\u6211\u4eec\u5e76\u4e0d\u63a8\u8350\u8fd9\u79cd\u64cd\u4f5c\u65b9\u6848\u3002 \u7b2c\u56db\u79cd\uff1a\u5c5e\u6027\u5b9a\u4f4d \u6709\u540c\u5b66\u8bf4\u5e72\u561b\u4e0d\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u5462\uff0c\u5176\u5b9e\uff0c\u6211\u4eec\u6700\u5f00\u59cb\u60f3\u5230\u7684\u65b9\u6848\u5c31\u662f\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\uff0c\u4f46\u662f\u5728\u5c5e\u6027\u7684 DOM \u6811\u91cc\u600e\u4e48\u4e5f\u627e\u4e0d\u5230\uff0c\u65e0\u6cd5\u5b9a\u4f4d\u5230\uff0c\u6211\u4eec\u4e5f\u8054\u5408\u7814\u53d1\u540c\u5b66\u4e00\u8d77\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u4f46\u6700\u7ec8\u8fd8\u662f\u6ca1\u80fd\u89e3\u51b3\uff0c\u975e\u5e38\u9057\u61be\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42","title":"4.2\u3001\u6700\u65b0\u7684\u53f3\u952e\u83dc\u5355\u7ec8\u6781\u89e3\u51b3\u65b9\u6848","text":"\u7531\u4e8e\u53f3\u952e\u83dc\u5355\u9009\u9879\u51e0\u4e4e\u90fd\u662f\u6587\u672c\uff0c\u90a3\u4e48\u901a\u8fc7 OCR \u8bc6\u522b\uff0c\u51e0\u4e4e\u662f\u6700\u4f18\u7684\u65b9\u6848\uff1a \u4e0d\u7528\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff1b \u4e0d\u4f1a\u53d7\u5230\u83dc\u5355\u9009\u9879\u987a\u5e8f\u6539\u53d8\u7684\u5f71\u54cd\uff1b \u4e0d\u4f1a\u53d7\u5230\u5b57\u4f53 UI \u53d8\u5316\u7684\u5f71\u54cd\uff1b \u5173\u4e8e OCR \u8bc6\u522b\u6211\u4eec\u5728\u540e\u9762\u4f1a\u8be6\u7ec6\u8bb2\u5230\uff0c\u672c\u7ae0\u8282\u4e3b\u8981\u8bb2\u57fa\u4e8e OCR \u8bc6\u522b\uff0c\u6211\u4eec\u5728\u53f3\u952e\u83dc\u5355\u8bc6\u522b\u4e0a\u7684\u7a81\u7834\u548c\u521b\u65b0\uff1b \u4f7f\u7528 OCR \u8bc6\u522b\u53f3\u952e\u83dc\u5355\u867d\u7136\u5df2\u7ecf\u5f88\u5b8c\u7f8e\u4e86\uff0c\u4f46\u662f\u5728\u4e00\u4e9b\u60c5\u51b5\u4e0b\u4ecd\u7136\u5b58\u5728\u4e00\u70b9\u95ee\u9898\uff0c\u5c31\u662f\u5c4f\u5e55\u4e2d\u51fa\u73b0\u591a\u4e2a\u548c\u83dc\u5355\u9009\u9879\u6587\u5b57\u76f8\u540c\u7684\u6587\u5b57\u65f6\uff0c\u6bd4\u5982\u4e0b\u9762\u8fd9\u79cd\u60c5\u51b5\uff1a \u5c4f\u5e55\u6070\u597d\u51fa\u73b0\u4e86\u4e24\u4e2a\u201c\u590d\u5236\u201d\uff0c\u6b64\u65f6\u8981\u5b9a\u4f4d\u5230\u83dc\u5355\u4e2d\u7684 \u201c\u590d\u5236\u201d\uff0c\u5c31\u9700\u8981\u8fdb\u4e00\u6b65\u505a\u6570\u636e\u5904\u7406\uff0c\u6bd4\u5982\uff1aOCR \u8fd4\u56de 2 \u4e2a\u201c\u590d\u5236\u201d\u7684\u5750\u6807\uff0c\u7528\u4f8b\u91cc\u9762\u6765\u5224\u65ad\u7528\u54ea\u4e2a\uff0c\u4ece\u4e1a\u52a1\u4e0a\u5c06\u5904\u7406\u8d77\u6765\u6bd4\u8f83\u9ebb\u70e6\uff0c\u56e0\u4e3a\u4f60\u5f97\u660e\u786e\u77e5\u9053\u83dc\u5355\u5728\u5de6\u8fb9\u8fd8\u662f\u53f3\u8fb9\uff0c\u7136\u540e\u8fd9\u672c\u8eab\u5c31\u662f\u4e0d\u786e\u5b9a\u7684\uff1b \u600e\u4e48\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u5462\uff0c\u8fd9\u5c31\u8981\u8bf4\u9053\u672c\u7ae0\u7684\u4e3b\u9898\uff1a\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b\u3002 \u3010\u539f\u7406\u3011 \u5728\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u524d\u622a\u4e00\u5f20\u56fe\uff0c\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\u518d\u622a\u53d6\u4e00\u5f20\u56fe\uff0c\u4e24\u5f20\u56fe\u552f\u4e00\u53d8\u5316\u7684\u5c31\u662f\u53f3\u952e\u83dc\u5355\uff0c\u5c06\u5176\u4ed6\u76f8\u540c\u7684\u5730\u65b9\u90fd\u5c4f\u853d\u6389\uff0c\u53ea\u7559\u4e0b\u83dc\u5355\u754c\u9762\uff0c\u5982\u6b64\u5373\u53ef\u6d88\u9664\u5e72\u6270\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u5c06\u4e24\u79cd\u56fe\u505a\u524d\u540e\u5bf9\u6bd4\u63d0\u53d6\u53ef\u4ee5\u5f97\u5230\u8fd9\u6837\u7684\u56fe\uff1a \u4f60\u770b\uff0c\u901a\u8fc7\u524d\u540e\u56fe\u7247\u7684\u5bf9\u6bd4\uff0c\u5c06\u76f8\u540c\u7684\u90e8\u5206\u7ed9\u6d88\u9664\u6389\uff0c\u518d\u8fdb\u884c OCR \u8bc6\u522b\uff0c\u8fd9\u6837\u5c31\u4e0d\u4f1a\u6709\u5e72\u6270\u4e86\uff1b \u4ee3\u7801\u5b9e\u73b0\u8bf7\u67e5\u770b src/filter_image.py \uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def filter_image(action):\n\"\"\"\n \u5bf9\u6bd4\u52a8\u4f5c\u524d\u540e\u4e24\u5f20\u56fe\u7247\uff0c\u63d0\u53d6\u4e0d\u540c\u7684\u90e8\u5206\u751f\u6210\u4e00\u5f20\u65b0\u7684\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u65b0\u56fe\u7247\u7684\u8def\u5f84\n :param action: \u52a8\u4f5c\u51fd\u6570\u7684\u51fd\u6570\u5bf9\u8c61\n :return: \u65b0\u56fe\u7247\u7684\u8def\u5f84\n \"\"\"\n action \u662f\u9f20\u6807\u4e8b\u4ef6\uff0c\u56e0\u4e3a\u6b64\u7c7b\u573a\u666f\u4e0d\u4ec5\u4ec5\u5728\u53f3\u952e\u5b58\u5728\uff0c\u5355\u51fb\u3001\u53cc\u51fb\u7b49\u7b49\uff0c\u53ea\u8981\u64cd\u4f5c\u524d\u540e\u540e\u53d8\u5316\u7684\u90fd\u53ef\u4ee5\uff1a from src.mouse_key import MouseKey\naction = (\nMouseKey.click,\nMouseKey.right_click,\nMouseKey.double_click,\nMouseKey.move_to,\n)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5","title":"5\u3001\u52a8\u6001\u56fe\u50cf\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5728\u684c\u9762\u58c1\u7eb8\u5207\u6362\uff0c\u6216\u770b\u56fe\u3001\u76f8\u518c\u5207\u6362\u56fe\u7247\u7c7b\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u7531\u4e8e\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u662f\u4e0d\u56fa\u5b9a\u7684\uff08\u4e0d\u540c\u7248\u672c\u7684\u7cfb\u7edf\u58c1\u7eb8\u4e0d\u540c\u3001\u58c1\u7eb8\u987a\u5e8f\u4e0d\u540c\uff0c\u770b\u56fe\u76f8\u518c\u5728\u56fe\u7247\u8d44\u6e90\u4e0d\u4e00\u5b9a\u56fa\u5b9a\uff09\uff0c\u90a3\u4e48\u5728\u6d4b\u8bd5\u5207\u6362\u58c1\u7eb8\u6216\u8005\u5207\u6362\u56fe\u7247\u7684\u573a\u666f\u65f6\u5c31\u4f1a\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u4f60\u4e0d\u77e5\u9053\u9884\u671f\u662f\u5565\uff0c\u7528\u4f8b\u64cd\u4f5c\u52a8\u6001\u7684\uff0c\u4e5f\u662f\u6781\u4e0d\u7a33\u5b9a\u3002 \u3010\u539f\u7406\u3011 \u5728\u5207\u6362\u56fe\u7247\u4e4b\u524d\u622a\u56fe\u4fdd\u5b58\u5e76\u8fd4\u56de\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u6b21\u8bc6\u522b\u8fd9\u5f20\u56fe\u7247\uff0c\u5982\u679c\u4e0d\u5b58\u5728\uff0c\u8bf4\u660e\u56fe\u7247\u5df2\u7ecf\u5207\u6362\u4e86\uff1b \u793a\u610f\u56fe\uff1a \u8fd9\u6837\uff0c\u6211\u4eec\u622a\u53d6\u4e86\u5f53\u524d\u56fe\u7247\u4e2d\u6bd4\u8f83\u6709\u4ee3\u8868\u6027\u7684\u4f4d\u7f6e\uff08\u4e00\u53ea\u9e1f\uff09\uff0c\u5728\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u7528\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1a \u6211\u4eec\u518d\u62ff\u7740\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd9\u6837\u5728\u5f53\u524d\u56fe\u7247\u4e2d\uff0c\u5c31\u4e0d\u80fd\u627e\u5230\u8fd9\u53ea\u9e1f\u4e86\uff0c\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u662f False\uff0c\u90a3\u4e48\u4e5f\u5c31\u53ef\u4ee5\u5224\u65ad\u56fe\u7247\u5207\u6362\u662f\u6210\u529f\u7684\u3002 \u4ee3\u7801\u793a\u610f\uff1a def save_temporary_picture(_x: int, _y: int, width: int, height: int):\n\"\"\"\n \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u56fe\u7247\u8def\u5f84\n :param x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n :param y: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n :param width: \u5bbd\u5ea6\n :param height: \u9ad8\u5ea6\n :return: \u56fe\u7247\u8def\u5f84\n \"\"\"\n \u6b64\u51fd\u6570\u7528\u4e8e\u5728\u64cd\u4f5c\u4e4b\u524d\u622a\u56fe\u4e00\u5f20\u4e34\u65f6\u56fe\u7247\uff0c\u8fd4\u56de\u56fe\u7247\u8def\u5f84\uff0c\u6700\u540e\u5728\u65ad\u8a00\u7684\u65f6\u5019\u518d\u5c06\u56fe\u7247\u8def\u5f84\u4f5c\u4e3a\u53c2\u6570\u4f20\u5165\u65ad\u8a00\u8bed\u53e5\u5373\u53ef\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ui","title":"\u4e09\u3001\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_1","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u662f\u6211\u4eec\u81ea\u7814\u7684\u4e00\u79cd\u4f7f\u7528\u7b80\u5355\uff0c\u4e14\u6548\u7387\u6781\u9ad8\u3001\u7a33\u5b9a\u6027\u597d\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u57fa\u4e8e\u5143\u7d20\u6309\u94ae\u5728\u5e94\u7528\u4e2d\u7684\u76f8\u5bf9\u4f4d\u7f6e\uff0c\u52a8\u6001\u83b7\u53d6\u5143\u7d20\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff0c\u9002\u7528\u4e8e\u5404\u79cd\u5c4f\u5e55\u5206\u8fa8\u7387\uff08\u5305\u62ec\u9ad8\u5206\u5c4f\u3001\u5bbd\u5c4f\u3001\u5e26\u9c7c\u5c4f\uff09\uff0c\u5f53\u5143\u7d20\u6309\u94ae\u4f4d\u7f6e\u76f8\u5bf9\u4e8e\u5e94\u7528\u754c\u9762\u4f4d\u7f6e\u53d1\u751f\u4fee\u6539\u4e4b\u540e\uff0c\u53ea\u9700\u8981\u6839\u636e UI \u8bbe\u8ba1\u56fe\u4e0a\u7684\u6e90\u6570\u636e\u4fee\u6539\u5bf9\u5e94\u5750\u6807\u6570\u636e\u5c31\u597d\uff0c\u7ef4\u62a4\u975e\u5e38\u7684\u65b9\u4fbf\u3002 \u6b64\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u9002\u7528\u4e8e\u4e00\u4e9b\u5143\u7d20\u4f4d\u7f6e\u76f8\u5bf9\u4e0e\u5e94\u7528\u754c\u9762\u6bd4\u8f83\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u97f3\u4e50\uff0899% \u7684\u5143\u7d20\u5b9a\u4f4d\u91c7\u7528\u8fd9\u79cd\uff0c\u6548\u679c\u975e\u5e38\u597d\uff09\uff0c\u4e0d\u9002\u7528\u4e8e\u754c\u9762\u4e0d\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u622a\u56fe\u5f55\u5c4f\uff0c\u5f88\u660e\u663e\u4e0d\u9002\u7528\u4e8e\u8fd9\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u3002\u8fd9\u79cd\u5168\u65b0\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u6709\u5b83\u7684\u9002\u7528\u6761\u4ef6\uff0c\u5982\u679c\u4f60\u53d1\u73b0\u4f7f\u7528\u5e38\u89c4\u7684\uff08\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u5b9a\u4f4d\uff09\u4e0d\u597d\u505a\u65f6\uff0c\u4e0d\u59a8\u8003\u8651\u4f7f\u7528\u8fd9\u79cd\uff0c\u5176\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff0c\u5e76\u4e14\u8fc5\u901f\u7231\u4e0a\u4ed6\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_1","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5728 UI \u8bbe\u8ba1\u56fe\u4e2d\u6211\u4eec\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u8fb9\u6846\u7684\u8ddd\u79bb\u7684\uff0c\u7136\u540e\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u6280\u672f\u624b\u6bb5\u83b7\u53d6\u5230\u5e94\u7528\u754c\u9762\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u53ca\u5e94\u7528\u7a97\u53e3\u7684\u5927\u5c0f\uff0c\u793a\u610f\u56fe\u5982\u4e0b\uff1a \uff08x1, y1\uff09\u4e3a\u5e94\u7528\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\uff1b\uff08x2, y2\uff09\u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u5de6\u4e0a\u89d2\uff08x1, y1\uff09\u7684\u5750\u6807\uff0c\u90a3\u4e48\u5b9e\u9645\u4e0a\u3010\u64ad\u653e\u6240\u6709\u3011\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\u4e3a\uff1a\uff08 x1 + x2, y1 + y2 \uff09\uff1b \u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5927\u5c0f\uff08w2, h2\uff09\uff0c\u53ef\u4ee5\u4ece UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\uff1b \u5728 UI \u8bbe\u8ba1\u7a3f\u4e0a\u70b9\u51fb\u3010\u64ad\u653e\u6240\u6709\u3011\u56fe\u6807\uff0c\u7136\u540e\u79fb\u52a8\u9f20\u6807\u5c31\u5c31\u53ef\u4ee5\u770b\u5230\u4e0a\u56fe\u7684\u53c2\u8003\u7ebf\u53ca\u6570\u636e\uff1b \u6240\u4ee5\uff0c\u6211\u4eec\u53ef\u4ee5\u8f7b\u677e\u7684\u83b7\u53d6\u5230\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u4e2d\u5fc3\u5750\u6807\u4e3a\uff1a\uff08 x1 + x2 + (w2 / 2), y1 + y2 + ( h2 / 2) \uff09 \u8be6\u7ec6\u6e90\u4ee3\u7801\u8bf7\u67e5\u770b AT \u57fa\u7840\u6846\u67b6: src/button_center.py \u83b7\u53d6\u5e94\u7528\u7a97\u53e3\u7684\u4fe1\u606f \u4f7f\u7528 xdotool \u548c xwininfo \u83b7\u53d6\u5230\u5e94\u7528\u7a97\u53e3\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u5de6\u4e0a\u89d2\uff09\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a app_id = CmdCtl.run_cmd(f\"xdotool search --classname --onlyvisible {self.app_name}\"\n).split(\"\\n\")\napp_id_list = [int(_id) for _id in app_id if _id]\nreturn CmdCtl.run_cmd(f\"xwininfo -id {app_id_list[self.number]}\")\n \u4f7f\u7528\u6b63\u5219\u83b7\u53d6\u7a97\u53e3\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u83b7\u53d6\u914d\u7f6e \u8bfb ini \u914d\u7f6e\u6587\u4ef6\uff0c\u83b7\u53d6\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e0e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a conf = ConfigParser()\nconf.read(self.config_path)\ndirection = conf.get(btn_name, \"direction\")\nposition = [int(i.strip()) for i in conf.get(btn_name, \"location\").split(\",\")]\n \u8ba1\u7b97\u5143\u7d20\u6309\u94ae\u5750\u6807 \u6839\u636e\u5e94\u7528\u7a97\u53e3\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u5927\u5c0f\u3001\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u5927\u5c0f\uff0c\u4f7f\u7528\u4e00\u5b9a\u7684\u7b97\u6cd5\u5373\u53ef\u8ba1\u7b97\u51fa\u5143\u7d20\u6309\u94ae\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u4e2d\u5fc3\u5750\u6807\uff09\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3","title":"3\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u3010\u914d\u7f6e\u65b9\u6cd5\u3011 \u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u7684\u6570\u636e\u6e90\u662f\u5e94\u7528\u5e93\u4e2d\u7684 ui.ini \u914d\u7f6e\u6587\u4ef6\uff1a ;section\n[\u65b0\u5efa\u6b4c\u5355+] ;key = value\ndirection = left_top\nlocation = 180, 268, 21, 21\n section \u662f\u4f60\u6839\u636e\u5bf9\u5e94\u7684\u5143\u7d20\u6309\u94ae\u547d\u540d\uff0c\u4f60\u53ef\u4ee5\u4efb\u610f\u547d\u540d\uff0c\u4f46\u6700\u597d\u6709\u5177\u4f53\u542b\u4e49\uff0c\u4e14\u80fd\u660e\u786e\u8868\u793a\u8fd9\u4e2a\u5143\u7d20\u6309\u94ae\u7684\u540d\u79f0\uff1b\u7528\u4e2d\u62ec\u53f7\u62ec\u8d77\u6765\u5c31\u884c\uff0c\u6bd4\u5982\uff1a[\u65b0\u5efa\u6b4c\u5355+] \uff1b direction \u662f\u914d\u7f6e\u8be5\u5143\u7d20\u7684\u53c2\u8003\u7cfb\uff0c\u5206\u522b\u4e3a\uff1a left_top \u5de6\u4e0a\uff1b left_bottom \u5de6\u4e0b\uff1b right_top \u53f3\u4e0a\uff1b right_bottom \u53f3\u4e0b\uff1b \u53c2\u8003\u7cfb\u7684\u9009\u53d6\u6807\u51c6\uff1a\u62c9\u52a8\u6539\u53d8\u7a97\u53e3\u5927\u5c0f\u65f6\uff0c\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u53c2\u8003\u7cfb\u4f4d\u7f6e\u662f\u4e0d\u53d8\u7684\uff1b location \u662f\u8be5\u5143\u7d20\u6309\u94ae\u7684\u76f8\u5bf9\u4e0e\u53c2\u8003\u7cfb\u7684 x, y \u7684\u8ddd\u79bb\uff0c\u53ca\u5927\u5c0f(w, h)\uff0c\u8fd9\u56db\u4e2a\u6570\u636e\u53ef\u4ee5\u901a\u8fc7 UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\u6570\u636e\uff0c\u5728\u7f16\u8f91\u6a21\u5f0f\u4e0b\uff0c\u70b9\u51fb UI \u56fe\u4e0a\u7684\u6309\u94ae\uff0c\u53f3\u4fa7\u5c31\u4f1a\u51fa\u73b0\u8be5\u5143\u7d20\u6309\u94ae\u7684 x, y, w, h \u6570\u636e\u3002 \u5982\u679c UI \u56fe\u4e0a\u6ca1\u6709\u63d0\u4f9b\u4f60\u60f3\u8981\u7684\u5143\u7d20\u6570\u636e\uff0c\u4f60\u53ef\u4ee5\u76f4\u63a5\u5728\u7cfb\u7edf\u4e2d\u4f7f\u7528\u622a\u56fe\u5f55\u5c4f\u8fdb\u884c\u5c3a\u91cf\uff0c\u8fd9\u662f\u4e00\u79cd\u4e0d\u63a8\u8350\u4f46\u80fd\u7528\u7684\u65b9\u6cd5\u3002 \u3010\u8c03\u7528\u65b9\u6cd5\u3011 \u5728\u5e94\u7528\u5e93\u65b9\u6cd5\u5c42\u8fd9\u6837\u5199\uff1a def click_add_music_list_btn_in_music_by_ui(self):\n\"\"\"\u70b9\u51fb\u65b0\u5efa\u6b4c\u5355\u6309\u94ae\"\"\"\nself.click(*self.ui.btn_center(\"\u65b0\u5efa\u6b4c\u5355+\"))\n self.ui.btn_center() \u662f\u56fa\u5b9a\u5199\u6cd5\uff0c\u53c2\u6570\u5c31\u662f\u914d\u7f6e\u91cc\u9762\u7684 section \u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ocr","title":"\u56db\u3001OCR \u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_2","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 OCR \u65b9\u6848\u5927\u591a\u91c7\u7528\u8c37\u6b4c OCR\uff08Tesseract\uff09\u65b9\u6848\uff0c\u4f46\u662f\u5b83\u5bf9\u4e8e\u4e2d\u6587\u7684\u8bc6\u522b\u975e\u5e38\u5dee\uff0c\u7ecf\u8fc7\u5927\u91cf\u7684\u8c03\u7814\uff0c\u6211\u4eec\u4f7f\u7528 PaddleOCR\uff0c\u5b83\u662f\u4e00\u4e2a\u5f00\u6e90\u7684\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u8bc6\u522b\u5de5\u5177\uff0c\u4e5f\u662f PaddlePaddle \u6700\u6709\u540d\u7684\u4e00\u4e2a\u5f00\u6e90\u9879\u76ee\uff0c\u611f\u5174\u8da3\u7684\u53ef\u4ee5\u70b9\u8fd9\u91cc\u4e86\u89e3\uff0c\u591a\u7684\u4e0d\u8bf4\u4e86\uff0c\u4f60\u53ea\u9700\u8981\u77e5\u9053\u5b83\u5c31\u662f\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_2","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5b89\u88c5\u4ed6\u662f\u4e2a\u5f88\u9ebb\u70e6\u7684\u4e8b\u60c5\uff0c\u867d\u7136\u64cd\u4f5c\u5f88\u7b80\u5355\uff0c\u4f46\u5176\u5b9e\u5b89\u88c5\u5305\u6709\u70b9\u5927\uff0c\u56e0\u6b64\u6211\u4eec\u4e0d\u5e0c\u671b\u76f4\u63a5\u5728 env.sh \u4e2d\u52a0\u5165\u5b83\uff0c\u8fd9\u4f1a\u8ba9\u6574\u4e2a\u81ea\u52a8\u5316\u73af\u5883\u53d8\u5f97\u975e\u5e38\u81c3\u80bf\uff1b \u56e0\u6b64\uff0c\u6211\u4eec\u60f3\u5230\u5c06\u5b83\u505a\u6210\u4e00\u4e2a RPC \u670d\u52a1\u5728\u5176\u4ed6\u673a\u5668\u4e0a\u90e8\u7f72\uff0c\u6d4b\u8bd5\u673a\u901a\u8fc7\u8fdc\u7a0b\u8c03\u7528 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u4f7f\u7528\u5b83\uff1b RPC \u7684\u8c03\u7528\u903b\u8f91\uff1a \u8fd9\u6837\u6211\u4eec\u53ea\u9700\u8981\u5728\u670d\u52a1\u7aef\u90e8\u7f72\u597d OCR \u8bc6\u522b\u7684\u670d\u52a1\uff0c\u7136\u540e\u901a\u8fc7 RPC \u670d\u52a1\u5c06\u529f\u80fd\u63d0\u4f9b\u51fa\u6765\uff0c\u6846\u67b6\u91cc\u9762\u53ea\u9700\u8981\u8c03\u7528\u5bf9\u5e94\u7684 RPC \u63a5\u53e3\u5c31\u884c\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_1","title":"3\u3001\u4f7f\u7528\u8bf4\u660e","text":"\u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nfrom paddleocr import PaddleOCR\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef paddle_ocr(pic_path, lang):\n\"\"\"\n Paddleocr\u76ee\u524d\u652f\u6301\u7684\u591a\u8bed\u8a00\u8bed\u79cd\u53ef\u4ee5\u901a\u8fc7\u4fee\u6539lang\u53c2\u6570\u8fdb\u884c\u5207\u6362\n \u4f8b\u5982`ch`, `en`, `fr`, `german`, `korean`, `japan`\n :param file_name:\n :param lang:\n :return:\n \"\"\"\nif __name__ == \"__main__\":\nIP = popen(\"hostname -I\").read().split(\" \")[0]\nPORT = 8890\nSCREEN_CACHE = \"/tmp/screen.png\"\nserver = ThreadXMLRPCServer((IP, PORT), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(paddle_ocr, \"paddle_ocr\")\nprint(\"\u76d1\u542c\u5ba2\u6237\u7aef\u8bf7\u6c42\u3002\u3002\")\nserver.serve_forever()\n \u6846\u67b6\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from src import OCR\nOCR.ocr(*target_strings, picture_abspath=None, similarity=0.6, return_default=False, return_first=False, lang=\"ch\"):\n# \u901a\u8fc7 OCR \u8fdb\u884c\u8bc6\u522b\u3002\n# target_strings:\n# \u76ee\u6807\u5b57\u7b26,\u8bc6\u522b\u4e00\u4e2a\u5b57\u7b26\u4e32\u6216\u591a\u4e2a\u5b57\u7b26\u4e32,\u5e76\u8fd4\u56de\u5176\u5728\u56fe\u7247\u4e2d\u7684\u5750\u6807;\n# \u5982\u679c\u4e0d\u4f20\u53c2\uff0c\u8fd4\u56de\u56fe\u7247\u4e2d\u8bc6\u522b\u5230\u7684\u6240\u6709\u5b57\u7b26\u4e32\u3002\n# picture_abspath: \u8981\u8bc6\u522b\u7684\u56fe\u7247\u8def\u5f84\uff0c\u5982\u679c\u4e0d\u4f20\u9ed8\u8ba4\u622a\u53d6\u5168\u5c4f\u8bc6\u522b\u3002\n# similarity: \u5339\u914d\u5ea6\u3002\n# return_default: \u8fd4\u56de\u8bc6\u522b\u7684\u539f\u751f\u6570\u636e\u3002\n# return_first: \u53ea\u8fd4\u56de\u7b2c\u4e00\u4e2a,\u9ed8\u8ba4\u4e3a False,\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u6240\u6709\u6570\u636e\u3002\n# lang: `ch`, `en`, `fr`, `german`, `korean`, `japan`\n \u6b64\u65b9\u6848\u5728\u6846\u67b6\u5185\u6ca1\u6709\u5f15\u5165\u4efb\u4f55\u4e09\u65b9\u4f9d\u8d56\u5b8c\u5168\u91c7\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\uff0c\u800c\u4e14\u4f7f\u7528\u65b9\u6cd5\u975e\u5e38\u7b80\u5355\uff0c\u53ea\u9700\u8981\u901a\u8fc7 OCR.ocr() \u5373\u53ef\uff1b \u5bf9\u4e8e\u4e00\u4e9b\u6587\u6848\u7684\u573a\u666f\u975e\u5e38\u9002\u7528\uff0c\u6b64\u65b9\u6cd5\u76f4\u63a5\u8fd4\u56de\u5750\u6807\uff0c\u53ef\u4ee5\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u3002 \u4e5f\u53ef\u4ee5\u7528\u4e8e\u6587\u5b57\u65ad\u8a00\uff0c\u4ee3\u7801\u793a\u610f\uff1a def assert_ocr_exist(\n*args, picture_abspath=None, similarity=0.6, return_first=False, lang=\"ch\"\n):\n\"\"\"\u65ad\u8a00\u6587\u6848\u5b58\u5728\"\"\"\npic = None\nif picture_abspath is not None:\npic = picture_abspath + \".png\"\nres = OCR.ocr(\n*args,\npicture_abspath=pic,\nsimilarity=similarity,\nreturn_first=return_first,\nlang=lang,\n)\nif res is False:\nraise AssertionError(\n(f\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{args}\", f\"{pic if pic else GlobalConfig.SCREEN_CACHE}\")\n)\nif isinstance(res, tuple):\npass\nelif isinstance(res, dict) and False in res.values():\nres = filter(lambda x: x[1] is False, res.items())\nraise AssertionError(\n(\nf\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{dict(res)}\",\nf\"{pic if pic else GlobalConfig.SCREEN_CACHE}\",\n)\n)\n \u5728\u7528\u4f8b\u4e2d\u4f7f\u7528\u65ad\u8a00\uff0c\u793a\u4f8b\uff1a def test_font_manager_021(self):\n\"\"\"\u53f3\u4fa7\u2665-\u6536\u85cf/\u53d6\u6d88\u6536\u85cf\u5b57\u4f53\"\"\"\n# \u5b57\u4f53\u7ba1\u7406\u5668\u754c\u9762\u53f3\u4fa7\u8be6\u60c5\u5217\u8868\uff0c\u9009\u62e9\u672a\u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e / \u6536\u85cf\u5b57\u4f53\n# \u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e\u83dc\u5355\u663e\u793a\u201c\u53d6\u6d88\u6536\u85cf\u201d\uff1b\n...\nself.assert_ocr_exist(\"\u53d6\u6d88\u6536\u85cf\")\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_1","title":"4\u3001\u670d\u52a1\u7aef\u90e8\u7f72","text":"\u6211\u4eec\u76ee\u524d\u662f\u5c06 OCR \u670d\u52a1\u90e8\u7f72\u5728\u666e\u901a\u7684\u529e\u516c\u673a\u4e0a\u7684\uff0c\u5982\u679c\u4f60\u89c9\u5f97\u73b0\u6709\u7684 OCR \u8bc6\u522b\u6027\u80fd\u4e0d\u591f\u597d\uff0c\u6070\u597d\u4f60\u6709\u66f4\u597d\u7684\u673a\u5668\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u5176\u79c1\u6709\u5316\u90e8\u7f72\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41_1","title":"4.1\u3001\u73af\u5883\u5b89\u88c5","text":"\u63a8\u8350\u4f7f\u7528 pipenv \u8fdb\u884c\u73af\u5883\u642d\u5efa\uff1b \u5b89\u88c5 pipenv \uff1a sudo pip3 install pipenv\n \u65b0\u5efa\u4e00\u4e2a\u76ee\u5f55\u4f5c\u4e3a\u73af\u5883\u5305 ocr_env\uff1a cd ~\nmkdir ocr_env\n \u521b\u5efa python 3.7 \u73af\u5883\uff1a cd ocr_env\npipenv --python 3.7\n \u5b89\u88c5 OCR \u4f9d\u8d56\u5305\uff1a pipenv install paddlepaddle -i https://mirror.baidu.com/pypi/simple\npipenv install \"paddleocr>=2.0.1\" -i https://mirror.baidu.com/pypi/simple\n \u4e0d\u51fa\u610f\u5916\uff0c\u8fd9\u6837\u5c31\u628a\u4f9d\u8d56\u5b89\u88c5\u597d\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42_1","title":"4.2\u3001\u542f\u52a8\u670d\u52a1","text":"\u5c06\u57fa\u7840\u6846\u67b6\u4e2d\u7684 scr/ocr/pdocr_rpc_server.py \u6587\u4ef6\u62f7\u8d1d\u5230 ocr_env \u76ee\u5f55\uff0c\u540e\u53f0\u6267\u884c\u5b83\u5c31\u597d\u4e86\uff1a cd ocr_env\nnohup pipenv run python pdocr_rpc_server.py &\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#43","title":"4.3\u3001\u914d\u7f6e\u5f00\u673a\u81ea\u542f\uff08\u901a\u7528\uff09","text":"\u4f60\u80af\u5b9a\u4e0d\u60f3\u6bcf\u6b21\u673a\u5668\u91cd\u542f\u4e4b\u540e\u90fd\u9700\u8981\u624b\u52a8\u542f\u52a8\u670d\u52a1\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u914d\u7f6e\u5f00\u673a\u81ea\u542f\u3002 \u5199\u5f00\u673a\u81ea\u542f\u670d\u52a1\u6587\u4ef6\uff1a sudo vim /lib/systemd/system/ocr.service\n autoocr \u540d\u79f0\u4f60\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff0c\u5199\u5165\u4ee5\u4e0b\u5185\u5bb9\uff1a [Unit]\nDescription=OCR Service\nAfter=multi-user.target\n\n[Service]\nUser=uos\nGroup=uos\nType=idle\nWorkingDirectory=/home/uos/ocr_env\nExecStart=pipenv run python pdocr_rpc_server.py\n\n[Install]\nWantedBy=multi-user.target\n \u6ce8\u610f\u66ff\u6362\u4f60\u7684${USER} \u4fee\u6539\u914d\u7f6e\u6587\u4ef6\u7684\u6743\u9650\uff1a sudo chmod 644 /lib/systemd/system/ocr.service\n \u81ea\u542f\u670d\u52a1\u751f\u6548\uff1a sudo systemctl daemon-reload\nsudo systemctl enable ocr.service\n \u67e5\u770b\u670d\u52a1\u72b6\u6001\uff1a sudo systemctl status ocr.service\n \u4f60\u53ef\u4ee5\u518d\u91cd\u542f\u4e0b\u7535\u8111\uff0c\u770b\u770b\u670d\u52a1\u662f\u4e0d\u662f\u6b63\u5e38\u542f\u52a8\u4e86\uff0c\u6ca1\u62a5\u9519\u5c31 OK \u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_4","title":"\u4e94\u3001\u5c5e\u6027\u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_3","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 UI \u81ea\u52a8\u5316\u5927\u591a\u90fd\u662f\u57fa\u4e8e\u6d4f\u89c8\u5668\u7684\uff0c\u6838\u5fc3\u662f\u5728\u7f51\u9875\u7684 DOM \u6811\u4e0a\u67e5\u627e\u5143\u7d20\uff0c\u5e76\u5bf9\u5176\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\uff1b Linux \u684c\u9762\u5e94\u7528\u5927\u591a\u662f\u91c7\u7528 Qt \u7f16\u5199\u7684\uff0c\u5728 Qt \u4e2d\u4e5f\u662f\u4ece\u6700\u9876\u5c42\u7684 MainWindow \u5f00\u59cb\u6784\u5efa\u5e94\u7528\uff0c\u6240\u4ee5\u903b\u8f91\u4e5f\u662f\u4e00\u6837\u7684\uff0cQt \u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u540c\u6837\u53ef\u4ee5\u901a\u8fc7 DOM \u6811\uff08\u5c5e\u6027\u6811\uff09\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff0c\u6211\u4eec\u79f0\u4e4b\u4e3a\u5c5e\u6027\u5b9a\u4f4d\u3002 \u501f\u52a9\u5f00\u6e90\u5de5\u5177 dogtail \u6211\u4eec\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u83b7\u53d6\uff0c\u4ece\u800c\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\u3002dogtail \u7684\u9879\u76ee\u4ecb\u7ecd\u53ef\u4ee5\u731b\u6233\u8fd9\u91cc\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_3","title":"2\u3001\u4f7f\u7528\u65b9\u6cd5","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#21sniff","title":"2.1\u3001sniff\uff08\u55c5\u63a2\u5668\uff09\u4f7f\u7528","text":"\u5728\u7ec8\u7aef\u8f93\u5165 sniff \u542f\u52a8 AT-SPI Browser mikigo@mikigo-PC:~$ sniff\n \u67e5\u770b\u5e94\u7528\u7684\u6807\u7b7e \u5728 sniff \u91cc\u9762\u53ef\u4ee5\u770b\u5230\u7cfb\u7edf\u4e2d\u5df2\u542f\u52a8\u7684\u5e94\u7528\uff0c\u70b9\u51fb\u5e94\u7528\u540d\u79f0\u524d\u9762\u7684\u4e09\u89d2\u5f62\u56fe\u6807\uff0c\u53ef\u4ee5\u5c55\u5f00\u5e94\u7528\u7684\u6807\u7b7e\uff0c\u6240\u6709\u6807\u7b7e\u4ee5 tree \u7684\u5f62\u5f0f\u5c55\u793a\uff0c\u5bf9\u5e94\u5e94\u7528\u91cc\u9762\u7684\u7236\u7a97\u53e3\u548c\u5b50\u7a97\u53e3\u3002 \u83b7\u53d6\u5143\u7d20\u63a7\u4ef6\u7684\u6807\u7b7e\u540d\u79f0 \u9996\u5148\uff0c\u4e3a\u4e86\u65b9\u4fbf\u67e5\u770b\u5143\u7d20\u63a7\u4ef6\u5bf9\u5e94\u7684\u4f4d\u7f6e\uff0c\u5efa\u8bae\u73b0\u5728\u4e0a\u65b9\u5de5\u5177\u680f\u70b9\u51fb Actions\uff0c\u7136\u540e\u52fe\u9009 Hightlight Items\uff0c\u8fd9\u6837\u5728 sniff \u4e2d\u9f20\u6807\u9009\u4e2d\u5143\u7d20\u6807\u7b7e\u7684\u65f6\u5019\uff0c\u5e94\u7528\u4e2d\u4f1a\u6709\u76f8\u5e94\u7684\u5149\u6807\u9501\u5b9a\u3002 \u5728 sniff \u91cc\u9762\u70b9\u51fb\u8fdb\u5165\u5e94\u7528\u7684\u6807\u7b7e tree \u4e2d\u540e\uff0c\u70b9\u51fb\u76f8\u5e94\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5728\u5de5\u5177\u4e0b\u65b9\uff0c\u4f1a\u5c55\u793a\u5143\u7d20\u63a7\u4ef6\u7684 Name\uff0c\u8fd9\u4e2a\u5c31\u662f\u6807\u7b7e\u540d\u79f0\u3002 \u5728 tree \u4e2d\u6709\u4e9b\u5730\u65b9\u662f\u7a7a\u767d\u7684\u6216\u8005\u662f Form\uff0c\u662f\u56e0\u4e3a\u5f00\u53d1\u4eba\u5458\u5728\u6dfb\u52a0\u6807\u7b7e\u7684\u65f6\u5019\u6ca1\u6709\u6dfb\u52a0\uff0c\u6216\u8005\u6709\u4e9b\u7236\u7a97\u53e3\u4e0d\u9700\u8981\u6dfb\u52a0\uff0c\u8fd9\u79cd\u5728\u5b9e\u9645\u4e1a\u52a1\u4e2d\u662f\u4e0d\u5f71\u54cd\u7684\uff0c\u6211\u4eec\u53ea\u8981\u4fdd\u8bc1\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\u4e2d\uff0c\u8981\u7528\u5230\u7684\u5143\u7d20\u90fd\u6dfb\u52a0\u4e86\u6807\u7b7e\u5373\u53ef\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#22","title":"2.2\u3001\u5143\u7d20\u64cd\u4f5c","text":"\u83b7\u53d6\u5e94\u7528\u5bf9\u8c61 dogtail \u83b7\u53d6\u5e94\u7528\u5bf9\u8c61\u7684\u65f6\u5019\uff0c\u4f7f\u7528\u7684\u662f tree \u5e93\u91cc\u9762\u7684 application() \u65b9\u6cd5\uff1a from dogtail.tree import root\napp_obj = root.application('deepin-music')\n app_obj\u5c31\u662f\u5e94\u7528\u7684\u5bf9\u8c61\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\uff0c\u662f\u5e94\u7528\u5bf9\u8c61\u4f7f\u7528child()\u65b9\u6cd5\uff1a element = app_obj.child('element_name')\n \u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u4f20\u5165\u5143\u7d20\u7684 Name\uff0c\u83b7\u53d6\u5230\u76f8\u5e94\u5143\u7d20\u7684\u5bf9\u8c61\u3002Name \u53ef\u4ee5\u901a\u8fc7 sniff \u67e5\u770b\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\u5217\u8868: element_list = element.children\n \u83b7\u53d6\u5230\u8fd9\u4e2a\u5143\u7d20\u4e0b\u9762\u6240\u6709\u7684\u5143\u7d20\u5217\u8868\u3002 \u8fd9\u4e2a\u65b9\u6cd5\u9002\u7528\u4e8e\u6709\u4e9b\u6807\u7b7e\u6ca1\u6709\u6dfb\u52a0\uff0c\u4f46\u662f\u4f4d\u7f6e\u662f\u56fa\u5b9a\u7684\uff0c\u6211\u4eec\u901a\u8fc7\u7d22\u5f15\u53ef\u4ee5\u53d6\u5f97\u5143\u7d20\u3002 element_list[0]\n \u5bf9\u5143\u7d20\u7684\u64cd\u4f5c \u5728\u83b7\u53d6\u5230\u5143\u7d20\u4e4b\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u76f8\u5e94\u7684\u64cd\u4f5c\u3002 \u5355\u51fb element.click(button=1)\n button 1 \u2014>\u5de6\u952e\uff0c2 \u2014>\u6eda\u8f6e\uff0c3 \u2014>\u53f3\u952e\uff0c\u9ed8\u8ba4\u4e3a 1 \u53cc\u51fb element.doubleClick(button=1)\n \u9f20\u6807\u60ac\u505c element.point()\n \u9f20\u6807\u79fb\u52a8\u5230\u5143\u7d20\u4e2d\u5fc3\u4f4d\u7f6e \u6587\u672c\u8f93\u5165 element.typeText(string)\n \u5411\u5143\u7d20\u5bf9\u8c61\u8f93\u5165\u5b57\u7b26\u4e32 \uff0c\u6bd4\u5982\u8f93\u5165\u6846 \u7ec4\u5408\u952e element.keyCombo(comboString)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#23","title":"2.3\u3001\u6846\u67b6\u5c01\u88c5","text":"\u4ee3\u7801\u793a\u4f8b\uff1a # \u8be6\u7ec6\u4ee3\u7801\u8bf7\u67e5\u770b src/dogtail_utils.py\nclass DogtailUtils:\ndef __init__(self, name=None, description=None):\nself.name = name\nself.description = description\nself.obj = root.application(self.name, self.description)\ndef app_element(self, *args, **kwargs):\n\"\"\"\n \u83b7\u53d6app\u5143\u7d20\u7684\u5bf9\u8c61\n :return: \u5143\u7d20\u7684\u5bf9\u8c61\n \"\"\"\nreturn self.obj.child(*args, **kwargs, retry=False)\ndef element_center(self, element) -> tuple:\n\"\"\"\n \u83b7\u53d6\u5143\u7d20\u7684\u4e2d\u5fc3\u4f4d\u7f6e\n :param element:\n :return: \u5143\u7d20\u4e2d\u5fc3\u5750\u6807\n \"\"\"\n_x, _y, _w, _h = self.app_element(element).extents\n_x = _x + _w / 2\n_y = _y + _h / 2\nreturn _x, _y\n \u6846\u67b6\u63d0\u4f9b\u7684\u63a5\u53e3\u975e\u5e38\u7b80\u6d01\uff0c\u5728\u8c03\u7528\u65f6\uff1a self.dog.element_center(\"\u64ad\u653e\")\n \u8fd9\u6837\u5c31\u80fd\u83b7\u53d6\u5230\u6b64\u5143\u7d20\u7684\u4e2d\u5fc3\u5750\u6807\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_5","title":"\u516d\u3001\u6807\u7b7e\u5316\u7ba1\u7406","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_4","title":"1\u3001\u6807\u7b7e\u8bf4\u660e","text":"\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u811a\u672c ID\uff1a\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c/\u51fd\u6570 ID\uff1b PMS\u7528\u4f8bID\uff1aPMS \u4e0a\u5bf9\u5e94\u7684\u7528\u4f8b ID\uff08\u7528\u4f8b\u5e93 ID\uff09\uff1b \u9ed8\u8ba4\u4f7f\u7528\u7528\u4f8b\u5e93 ID\uff0c\u5bf9\u4e8e\u6682\u65f6\u6ca1\u6709\u4f7f\u7528\u7528\u4f8b\u5e93\u7ba1\u7406\u7528\u4f8b\u7684\u9879\u76ee\uff0c\u53ef\u4ee5\u4f7f\u7528\u4ea7\u54c1\u5e93\u7528\u4f8b ID\uff1b \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1aFUNC\uff08\u529f\u80fd\uff09\u3001API\uff08\u63a5\u53e3\uff09\u3001BASELINE\uff08\u57fa\u7ebf\uff09\u3001PERF\uff08\u6027\u80fd\uff09\u3001STR\uff08\u538b\u529b\uff09\u3001SEC\uff08\u5b89\u5168\uff09\u3001CTS\uff08\u517c\u5bb9\u6027\uff09 \u4e0a\u7ebf\u5bf9\u8c61\uff1aCICD\uff0c\u8868\u793a\u4e0a\u7ebf\u5230 CICD \u6d41\u6c34\u7ebf\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u53ef\u4e00\u952e\u751f\u6210 case_list.csv \u6587\u4ef6\uff0c\u7528\u4e8e\u5bfc\u5165\u5230\u660e\u9053\u4e91 AT \u7528\u4f8b\u5217\u8868\u4e2d\u63a7\u5236 CICD \u8dd1\u6d4b\u8303\u56f4\uff1b \u6d4b\u8bd5\u7ea7\u522b\uff1aC1 / C2 / C3 / C4\uff0c\u5177\u4f53\u5b9a\u4e49\u53c2\u8003\u6d41\u6c34\u7ebf\u4f7f\u7528\u6307\u5bfc\uff1b \u8df3\u8fc7\u539f\u56e0\uff1askip-XXX\uff0c\u7528\u4e8e\u63a7\u5236\u7528\u4f8b\u662f\u5426\u6267\u884c\uff1b \u786e\u8ba4\u4fee\u590d\uff1afixed-XXX\uff0c\u7528\u4e8e\u6807\u8bb0\u7528\u4f8b\u7684\u4fee\u590d\u72b6\u6001\uff08\u540e\u9762\u8be6\u7ec6\u8bb2\u89e3\u7528\u6cd5\uff09\uff1b \u5e9f\u5f03\u7528\u4f8b\uff1aremoved-\u5df2\u5e9f\u5f03\uff0c\u7528\u4e8e\u6807\u8bb0\u5df2\u7ecf\u5e9f\u5f03\u7684\u7528\u4f8b\uff0c\u6b64\u7528\u4f8b\u6807\u7b7e\u4e0d\u4f1a\u88ab\u6dfb\u52a0\uff0c\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff1b \u793a\u4f8b\uff1a \u811a\u672cID PMS\u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u4e0a\u7ebf\u5bf9\u8c61 \u6d4b\u8bd5\u7ea7\u522b \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b ... 001 679537 L1 FUNC CICD C1 skip-XXX fixed-XXX removed-\u5df2\u5e9f\u5f03 ..."},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_4","title":"2\u3001\u64cd\u4f5c\u6b65\u9aa4","text":"2.1\u3001\u5728\u5b50\u9879\u76ee\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u4ee5\u7528\u4f8b\u7684 py \u6587\u4ef6\u9664\u53bb\u9996\u5b57\u7b26\u4e32 \"test_\" \u548c\u7528\u4f8b\u5e8f\u53f7\u540e\u7684\u5b57\u7b26\u4e32\u4f5c\u4e3a csv \u7684\u6587\u4ef6\u540d\u3002 \u4f8b\u5982: \u76f8\u518c\u7684\u7528\u4f8b\u6587\u4ef6\u4e3a test_album_xxx.py\uff0cxxx \u8868\u793a\u4efb\u610f\u4e09\u4f4d\u6570\u5b57\u4ee3\u8868\u7528\u4f8b\u5e8f\u53f7\uff0c\u6b64\u65f6 csv \u6587\u4ef6\u540d\u5c31\u5e94\u4e3a album.csv\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u6240\u6709 csv \u6587\u4ef6\u5efa\u8bae\u653e\u5728\u4e00\u4e2a tags \u76ee\u5f55\u4e0b\u3002 \u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 2.2\u3001\u7b2c\u4e00\u5217\u4e3a\u811a\u672c ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b\u7528\u4f8b\u6807\u7b7e\u53ef\u4ee5\u65e0\u5e8f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_2","title":"3\u3001\u589e\u52a0\u8bf4\u660e","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_1","title":"3.1\u3001\u8df3\u8fc7\u7528\u4f8b","text":"\u4f20\u7edf\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668(@pytest.mark.skip)\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a; \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#311","title":"3.1.1\u3001\u56fa\u5b9a\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u7b7e\u5f00\u5934\u4e3a \u201cskip-XXX\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\uff0c\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\u5219\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u7b7e\u4e3a SKIPED\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#312","title":"3.1.2\u3001\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skipif_platform-aarch64&mips64 \u67d0\u4e9b\u7528\u4f8b\u4f1a\u56e0\u4e3a\u4e0d\u540c\u7684\u73af\u5883\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\uff0c\u5e38\u89c1\u7684\u573a\u666f\u4e3a\u5728\u4e0d\u540c\u67b6\u6784\u4e0a\u5224\u65ad\u662f\u5426\u6267\u884c\uff0c\u8df3\u8fc7\u7684\u539f\u56e0\u6807\u7b7e\u4e3a \u201cskipif_platform-\u201d \u52a0\u67b6\u6784\u540d\uff0c\u591a\u4e2a\u67b6\u6784\u4e4b\u95f4\u4f7f\u7528 \u201c&\u201d \u62fc\u63a5\uff1b \u4ee5\u4e0a\u4f8b\u5b50\u4e3a\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u5224\u65ad\u5f53\u524d\u67b6\u6784\u662f\u5426\u4e3a arrch64 \u6216\u8005 mips64\uff0c\u82e5\u662f\uff0c\u5219\u8df3\u8fc7\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u82e5\u5426\u5219\u6267\u884c\u7528\u4f8b\uff1b \u76ee\u524d\u6846\u67b6\u9ed8\u8ba4\u4ec5\u652f\u6301\u67b6\u6784\u7684\u6761\u4ef6\u5224\u65ad\uff0c\u4f46\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u903b\u8f91\u652f\u6301\u81ea\u5b9a\u4e49\u6dfb\u52a0\u3002 \u5728\u9879\u76ee\u76ee\u5f55\u8def\u5f84\u4e0b\u5b58\u5728\u6587\u4ef6 setting/skipif.py\uff0c\u6240\u6709\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u7684\u51fd\u6570\u5199\u5728\u6b64\u6587\u4ef6\u4e2d\u3002 \u9ed8\u8ba4\u67b6\u6784\u5224\u65ad\u4f8b\u5b50\uff1a def skipif_platform(args: str):\n\"\"\"\u5e73\u53f0\u8df3\u8fc7\"\"\"\n_skip_key = args.split(\"&\")\nfor key in _skip_key:\nif GlobalConfig.SYS_ARCH == key:\nreturn True\nreturn False\n \u65b9\u6cd5\u7f16\u5199\u89c4\u8303\uff1a \u65b9\u6cd5\u540d\u5fc5\u987b\u4ee5 skipif \u5f00\u5934\uff1b \u65b9\u6cd5\u5fc5\u987b\u6709\u8fd4\u56de\u7ed3\u679c\u5e76\u4e14\u4e3a\u5e03\u5c14\u503c\uff08True \u4ee3\u8868\u8df3\u8fc7\uff0cFalse \u4ee3\u8868\u4e0d\u8df3\u8fc7\uff09\uff1b \u65b9\u6cd5\u53ea\u80fd\u6709\u4e00\u4e2a\u5165\u53c2\uff1b \u5728 csv \u6587\u4ef6\u8df3\u8fc7\u539f\u56e0\u4e00\u680f\u4e2d\u586b\u5199\u4e3a \u201c{\u51fd\u6570\u540d}-{\u53c2\u6570}\u201d\uff0c\u4f8b\u5982\uff1askipif_platform-aarch64\uff1b\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u4f1a\u4ee5\u7b2c\u4e00\u4e2a \u201c-\u201d \u8fdb\u884c\u5206\u5272\uff0c\u622a\u53d6\u7684\u5de6\u4fa7\u5b57\u7b26\u4e32\u4f5c\u4e3a\u51fd\u6570\u540d\uff0c\u5728 skipif.py \u6587\u4ef6\u4e2d\u67e5\u627e\u662f\u5426\u6709\u540c\u540d\u51fd\u6570\uff0c\u5e76\u5c06\u622a\u53d6\u7684\u53f3\u4fa7\u4f5c\u4e3a\u53c2\u6570\u4f20\u9012\u7ed9\u8be5\u51fd\u6570\uff0c\u901a\u8fc7\u83b7\u53d6\u8be5\u51fd\u6570\u8fd4\u56de\u7684\u5e03\u5c14\u503c\uff0c\u8fd4\u56de True\uff0c\u5219\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u8fd4\u56de False\uff0c\u5219\u6267\u884c\u8be5\u7528\u4f8b\u3002 \u82e5\u51fd\u6570\u9700\u8981\u591a\u4e2a\u53c2\u6570\uff0c\u53ef\u81ea\u5b9a\u4e49\u591a\u4e2a\u53c2\u6570\u4e4b\u95f4\u7684\u8fde\u63a5\u7b26\uff0c\u8fde\u63a5\u7b26\u53f7\u4e0d\u53ef\u4f7f\u7528\u4e0b\u5212\u7ebf\u548c\u9017\u53f7\uff0c\u63a8\u8350\u7edf\u4e00\u4f7f\u7528 & \u7b26\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32","title":"3.2\u3001\u786e\u8ba4\u4fee\u590d","text":"\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7528\u4f8b\u4fee\u590d\u540e\uff0c\u4f46\u4e0d\u80fd\u7acb\u5373\u5220\u9664\u8df3\u8fc7\u539f\u56e0\uff08skip-XXX\uff09\u7684\u7528\u4f8b\uff0c\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u786e\u8ba4\u4fee\u590d\u201d\uff0c\u4f5c\u4e3a\u6807\u8bb0\u8be5\u7528\u4f8b\u662f\u5426\u5df2\u7ecf\u4fee\u590d\uff0c\u56fa\u5b9a\u586b\u5165\u5b57\u6bb5\u4e3a \u201cfixed-\u5df2\u4fee\u590d\u201d\u3002\u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u5373\u4f7f\u540c\u65f6\u6807\u8bb0\u4e86 skip-XXX \u4e5f\u4f1a\u6b63\u5e38\u6267\u884c\u3002 \u793a\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d \u3010\u540c\u65f6\u6807\u8bb0\u4e86skip \u548c fixed\uff0c\u4f46\u4ecd\u7136\u60f3\u8981\u8df3\u8fc7\u7528\u4f8b\u3011 \u5f53 \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u540c\u65f6\u586b\u5165\u540e\uff0c\u547d\u4ee4\u884c\u4f20\u9012\u53c2\u6570 --ifixed yes\uff0c\u5219\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\u8be5\u6761\u7528\u4f8b\u3002 python3 manage.py run --ifixed yes\n \u770b\u5230\u8fd9\u91cc\u6709\u4e9b\u540c\u5b66\u53ef\u80fd\u8981\u95ee\u4e86\uff0c\u6211\u60f3\u6062\u590d\u8df3\u8fc7\u6267\u884c\uff0c\u76f4\u63a5\u628a skip-XXX \u8fd9\u4e00\u5217\u6807\u7b7e\u5220\u6389\u4e0d\u5c31\u597d\u4e86\uff0c\u8fd8\u641e\u4ec0\u4e48\u786e\u8ba4\u4fee\u590d\u5e72\u5565\uff1f \u8fd9\u91cc\u7ed9\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u89e3\u91ca\u4e00\u4e0b\uff1a \uff08\u4ee5\u4e0b\u6d41\u6c34\u7ebf\u6307\u7684\u662f\u6bcf\u65e5\u6784\u5efa\u7684\u6d41\u6c34\u7ebf\uff0c\u8dd1 AT \u7684\u5168\u91cf\u7528\u4f8b\uff09 \u9996\u5148\uff0c\u6d41\u6c34\u7ebf\u4e0a\u8dd1\u7684\u662f AT \u5386\u53f2 Tag\uff0c\u8df3\u8fc7\u7528\u4f8b\u7684\u6807\u7b7e(skip-XXX) \u662f\u5728\u6700\u65b0\u7684\u4ee3\u7801\u4e0a\u63d0\u4ea4\u7684\uff0c\u6211\u4eec\u91c7\u7528\u6700\u65b0\u7684 csv \u6587\u4ef6\u8986\u76d6\u5386\u53f2 csv \u6587\u4ef6\u7684\u8bbe\u8ba1\u6765\u5b9e\u73b0\u4e86\u5bf9\u5386\u53f2 Tag \u4e0a\u7528\u4f8b\u7684\u8df3\u8fc7\uff1b \u7136\u540e\uff0c\u5728\u65e5\u5e38\u8df3\u8fc7\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u540c\u65f6\u4e5f\u5728\u4fee\u590d\u4e00\u4e9b\u7528\u4f8b\uff0c\u4fee\u590d\u540e\u7684\u8fd9\u4e9b\u7528\u4f8b\u5728\u672c\u5730\u8c03\u8bd5\u7684\u65f6\u5019\u6211\u4eec\u4e0d\u5e0c\u671b\u7ee7\u7eed\u8df3\u8fc7\uff0c\u4f46\u662f\u6b64\u65f6\uff0c\u4fee\u590d\u7684\u8fd9\u4e9b\u7528\u4f8b\u53ef\u80fd\u8fd8\u4e0d\u7a33\u5b9a\uff0c\u4e0d\u9002\u5408\u9a6c\u4e0a\u653e\u5230\u6d41\u6c34\u7ebf\u53bb\u8dd1\uff0c\u4e5f\u5c31\u662f\u8bf4\u6d41\u6c34\u7ebf\u4e0a\u6211\u4eec\u662f\u5e0c\u671b\u4ed6\u7ee7\u7eed\u8df3\u8fc7\u7684\uff0c\u56e0\u6b64\uff0c\u54b1\u4e0d\u80fd\u76f4\u63a5\u628a skip-XXX \u5e72\u6389\uff1b \u8fd9\u91cc\u5c31\u77db\u76fe\u4e86\uff0c\u4e00\u4e2a\u9700\u6c42\u662f\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u53e6\u4e00\u4e2a\u9700\u6c42\u53c8\u4e0d\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u600e\u4e48\u529e\u5462\uff1f \u6211\u4eec\u4f7f\u7528\u201c\u786e\u8ba4\u4fee\u590d\u201d\u6765\u6807\u8bb0\u8fd9\u6761\u7528\u4f8b\u5df2\u7ecf\u4fee\u590d\u4e86\uff0c\u8fd9\u6837\u4f60\u672c\u5730\u8c03\u8bd5\u7528\u4f8b\u7684\u65f6\u5019\u8fd9\u6761\u5df2\u4fee\u590d\u7684\u7528\u4f8b\u662f\u4f1a\u6267\u884c\u7684\uff0c\u540c\u65f6\u5728\u6d41\u6c34\u7ebf\u4e0a\u5c06 --ifixed yes \u53c2\u6570\u52a0\u4e0a\uff0c\u90a3\u4e48\u6d41\u6c34\u7ebf\u4e0a\u6267\u884c\u65f6\u8fd9\u6761\u7528\u4f8b\u4ecd\u7136\u662f\u8df3\u8fc7\u7684\u72b6\u6001\uff0c\u540e\u7eed\u4f60\u6253 Tag \u7684\u65f6\u5019\uff0c\u628a \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u7684\u6807\u7b7e\u5168\u90e8\u5220\u6389\u5c31\u53ef\u4ee5\u4e86\u3002 \u8fd9\u5c31\u662f\u201c\u786e\u8ba4\u4fee\u590d\u201d\u8fd9\u4e2a\u6807\u7b7e\u7684\u80cc\u666f\uff0c\u9700\u8981\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u54c1\u4e00\u54c1\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#33","title":"3.3\u3001\u5e9f\u5f03\u7528\u4f8b","text":"\u9488\u5bf9\u67d0\u4e9b\u7528\u4f8b\uff0c\u7531\u4e8e\u9700\u6c42\u53d8\u66f4\uff0c\u73af\u5883\u5f71\u54cd\u6216\u8bc4\u4f30\u4e0d\u518d\u9002\u7528\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u65f6\uff0c\u7528\u4f8b\u9700\u8981\u5e9f\u5f03\uff0c\u5219\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u5e9f\u5f03\u7528\u4f8b\u201d\uff0c\u8be5\u5217\u5b58\u5728 \u201cremoved-{\u5e9f\u5f03\u539f\u56e0}\u201d\uff0c\u5219\u7528\u4f8b\u4e0d\u4f1a\u6267\u884c\u3002 \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d removed-\u5df2\u5e9f\u5f03 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_2","title":"4\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u4e0a\u9762\u4ecb\u7ecd Pytest \u6846\u67b6\u63d0\u4f9b\u7684\u6807\u7b7e\u529f\u80fd mark\uff0c\u4f7f\u7528\u65f6\u9700\u8981\u4e3a\u6bcf\u4e00\u4e2a\u7528\u4f8b\u6dfb\u52a0\u6807\u7b7e\u88c5\u9970\u5668\uff0c\u5219\u64cd\u4f5c\u590d\u6742\uff0c\u53ef\u7ef4\u62a4\u6027\u5dee\uff0c\u5176\u6839\u672c\u95ee\u9898\u5c31\u662f\u6807\u7b7e\u5206\u6563\u5728\u6bcf\u4e00\u6761\u7528\u4f8b\u7684\u88c5\u9970\u5668\u4e0a\uff0c\u96be\u4ee5\u96c6\u4e2d\u7ef4\u62a4\uff1b\u4e8e\u662f\u4e4e\u5c06\u6240\u6709\u6807\u7b7e\u4f7f\u7528 csv \u6587\u4ef6\u8fdb\u884c\u96c6\u4e2d\u7ba1\u7406\uff0c\u5e76\u901a\u8fc7 Pytest \u7684\u94a9\u5b50\u51fd\u6570\uff0c\u8bfb\u53d6 csv \u6587\u4ef6\uff0c\u52a8\u6001\u6dfb\u52a0\u6807\u7b7e\u5230\u7528\u4e2d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5csv","title":"5\u3001CSV\u6587\u4ef6\u683c\u5f0f","text":"\u6b64\u914d\u7f6e\u6587\u4ef6\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u6807\u7b7e\u6570\u636e\uff0c\u4e14\u8981\u65b9\u4fbf\u80fd\u4f7f\u7528Excel\u6253\u5f00\u8fdb\u884c\u7f16\u8f91\u67e5\u770b\uff0c\u66f4\u91cd\u8981\u7684\u662f\u6211\u4eec\u4e0d\u60f3\u5f15\u5165\u4e09\u65b9\u4f9d\u8d56\uff0cCSV \u6587\u4ef6\u51e0\u4e4e\u662f\u552f\u4e00\u80fd\u6ee1\u8db3\u6240\u6709\u7684\u8981\u6c42\u7684\u6587\u4ef6\u683c\u5f0f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_6","title":"\u4e03\u3001\u65e5\u5fd7\u7cfb\u7edf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_5","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e YouQu \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u64cd\u4f5c\u65b9\u6cd5\u5c01\u88c5\u5199\u6cd5\uff0c\u901a\u5e38\u662f\u8fd9\u6837\u7684\uff1a\u7c7b\u91cc\u9762\u4e00\u4e2a\u51fd\u6570\u53ea\u5305\u542b\u4e00\u4e2a\u64cd\u4f5c\u6216\u591a\u6b21\u8c03\u7528\u7684\u4e00\u7cfb\u5217\u53ef\u5408\u5e76\u7684\u64cd\u4f5c\uff1b \u4f20\u7edf\u7684\u65e5\u5fd7\u8f93\u51fa\u65b9\u5f0f\uff0c\u9700\u8981\u5728\u6bcf\u4e2a\u51fd\u6570\u91cc\u9762\u4e3b\u52a8\u7f16\u5199\u65e5\u5fd7\u8f93\u51fa\u4ee3\u7801 \uff0c\u4f8b\u5982\uff1a class XXXWidget:\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\nlogger.info(\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\")\n...\n# \u7701\u7565\u4ee3\u7801\u90e8\u5206\n \u4e00\u4e2a\u51fd\u6570\u91cc\u9762\u81f3\u5c11\u5305\u542b\u4e00\u6761\u65e5\u5fd7\u4fe1\u606f\uff0c\u5982\u679c\u6bd4\u8f83\u590d\u6742\u64cd\u4f5c\u6b65\u9aa4\uff0c\u53ef\u80fd\u5305\u542b\u591a\u6761\u65e5\u5fd7\u4fe1\u606f\uff1b \u4e00\u4e2a\u5e94\u7528\u542b\u6709\u5927\u91cf\u7684\u64cd\u4f5c\u51fd\u6570\uff0c\u4e5f\u5c31\u662f\u8bf4\u6211\u4eec\u9700\u8981\u5199\u5927\u91cf\u7684\u65e5\u5fd7\u4ee3\u7801\uff1b \u901a\u8fc7\u7ecf\u9a8c\u89c2\u5bdf\uff0c\u6211\u4eec\u53d1\u73b0\uff0c\u51fd\u6570\u8bf4\u660e\u4ee5\u53ca\u51fd\u6570\u64cd\u4f5c\u65e5\u5fd7\uff0c\u5177\u6709\u8f83\u9ad8\u7684\u91cd\u590d\u5ea6\uff08\u4ece\u4e0a\u9762\u7684\u4f8b\u5b50\u4e5f\u53ef\u4ee5\u770b\u51fa\u6765\uff09\uff0c\u56e0\u6b64\u6211\u4eec\u5927\u80c6\u7684\u8bbe\u60f3\uff0c\u80fd\u4e0d\u80fd\u57fa\u4e8e\u6846\u67b6\u6267\u884c\u65f6\uff0c\u81ea\u52a8\u7684\u5c06\u51fd\u6570\u8bf4\u660e\u4f5c\u4e3a\u65e5\u5fd7\u6253\u5370\u51fa\u6765\uff0c\u4ece\u800c\u51cf\u5c11\u5927\u91cf\u65e5\u5fd7\u4ee3\u7801\u91cf\u548c\u91cd\u590d\u7f16\u5199\uff0c\u90a3\u771f\u662f\u5999\u554a~\u3002 \u57fa\u4e8e\u6b64\u201c\u5929\u771f\u201d\u7684\u60f3\u6cd5\uff0c\u6211\u4eec\u8bbe\u8ba1\u51fa\u4e86 youqu \u7684\u65e5\u5fd7\u7cfb\u7edf\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_5","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u6838\u5fc3\u539f\u7406\uff1a \u901a\u8fc7\u7ed9\u7c7b\u52a0\u4e0a\u4e00\u4e2a\u88c5\u9970\u5668 @log\uff0c\u52a8\u6001\u7ed9\u8be5\u7c7b\u4e0b\u6240\u6709\u7684\u51fd\u6570\u53ca\u7236\u7c7b\u51fd\u6570\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668 @_trace\uff0c\u5728\u6b64\u88c5\u9970\u5668\u4e2d\u6211\u4eec\u80fd\u52a8\u6001\u7684\u6355\u83b7\u6240\u8c03\u7528\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff08func.__doc__\uff09\uff0c\u901a\u8fc7\u65e5\u5fd7\u8f93\u51fa\u5668\u5c06\u5176\u8f93\u51fa\u5373\u53ef\u3002 \u5b9e\u73b0\u6b65\u9aa4\uff1a \u901a\u8fc7 inspect.getmembers \u83b7\u53d6\u88ab\u88c5\u9970\u7684\u7c7b\u4e0b\u6240\u6709\u51fd\u6570\uff0c\u5305\u542b\u9759\u6001\u65b9\u6cd5\uff0c\u7c7b\u65b9\u6cd5\uff0c\u5b9e\u4f8b\u65b9\u6cd5\uff1b \u901a\u8fc7 setattr(\u7c7b, \u65b9\u6cd5, _trace\uff09 \u7684\u65b9\u5f0f\uff0c\u7ed9\u7b26\u5408\u6761\u4ef6\u7684\u51fd\u6570\uff0c\u52a8\u6001\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_3","title":"3\u3001\u65e5\u5fd7\u914d\u7f6e","text":"[log_cli]\n;\u65e5\u5fd7\u76f8\u5173\u914d\u7f6e\uff08\u4e0d\u6253\u5370\u6784\u9020\u51fd\u6570\u548c\u9b54\u6cd5\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff09\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = INFO\n# ============= \u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u914d\u7f6e ================\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u5f00\u5934\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7, \u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_STARTSWITH = Assert\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u7ed3\u5c3e\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_ENDSWITH = Widget\n;\u652f\u6301\u7c7b\u540d\u5305\u542b xxx \u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_CONTAIN = ShortCut\n# ==============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_3","title":"4\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u5728\u5e94\u7528\u5e93 widget \u65b9\u6cd5\u5e93\u91cc\u9762\uff0c\u53ea\u9700\u8981\u5728\u51fa\u53e3\u6587\u4ef6\u52a0\u4e0a\u7c7b\u88c5\u9970\u5668\uff0c\u5c31\u53ef\u4ee5\u5b9e\u73b0\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u4e86\uff1b # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6ce8\u610f\uff0c\u662f\u7c7b\u88c5\u9970\u5668\u3002 \u5b9e\u4f8b\uff1a # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\n@classmethod\ndef find_dfm_image(cls, *elements, multiple=False, rate=0.9):\n\"\"\"\n \u67e5\u627e\u56fe\u7247 {{elements}}.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e {{rate}} \u7684\u5750\u6807\n :param elements:\n :param multiple:\n :return:\n \"\"\"\nelement = tuple(map(lambda x: f\"{Config.PIC_RES_PATH}/{x}\", elements))\nreturn cls.find_image(*element, multiple=multiple)\n \u8c03\u7528\u65b9\u6cd5\u65f6\uff1a DfmWidget.find_dfm_image(\"dfm_001\")\n \u81ea\u52a8\u8f93\u51fa\u7684\u65e5\u5fd7\uff1a >> x86_64-uos-6: 02/28 17:48:47 | INFO | logger_utils: [find_dfm_image]: \u67e5\u627e\u56fe\u7247 dfm_001.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e 0.9 \u7684\u5750\u6807\n \u52a0\u4e0a\u88c5\u9970\u5668 @log \u4e4b\u540e\uff0c\u65b9\u6cd5\u5c42\u6240\u6709\u7684\u51fd\u6570\uff08\u5305\u62ec\u5b9e\u4f8b\u65b9\u6cd5\u3001\u7c7b\u65b9\u6cd5\u3001\u9759\u6001\u65b9\u6cd5\uff09\u90fd\u4e0d\u9700\u8981\u518d\u5199\u65e5\u5fd7\u4ee3\u7801\uff0c\u6267\u884c\u7684\u65f6\u5019\u4f1a\u81ea\u52a8\u8f93\u51fa\uff0c\u5e76\u4e14\u6240\u6709\u8c03\u7528\u7684\u65b9\u6cd5\u4f1a\u4ee5 allure.step \u7684\u65b9\u5f0f\uff0c\u5c55\u793a\u5728 allure \u62a5\u544a\u4e2d\uff0c\u5728\u62a5\u544a\u4e2d\u66f4\u80fd\u4e00\u76ee\u4e86\u7136\u7684\u770b\u5230\u7528\u4f8b\u6267\u884c\u6b65\u9aa4\u3002 \u3010\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\u3011 \u901a\u8fc7\u89c2\u5bdf\u524d\u9762\u7684\u4f8b\u5b50\uff0c\u7ec6\u5fc3\u7684\u540c\u5b66\u53ef\u80fd\u8fd8\u53d1\u73b0\u4e86\u4e00\u4e2a\u5c0f\u7ec6\u8282\uff1a\u51fd\u6570\u529f\u80fd\u8bf4\u660e\u4e2d\uff0c\u4e24\u5bf9\u5927\u62ec\u53f7\u4e2d\u7684\u5185\u5bb9 {{elements}} \u4f5c\u4e3a\u53d8\u91cf\u8f93\u51fa\u51fa\u6765\u4e86\uff1b \u6ca1\u9519\uff0c\u8fd9\u5c31\u662f\u6211\u4eec\u53c2\u8003Django \u548c jinja2 \u7684\u6a21\u677f\u8bed\u6cd5\u8bbe\u8ba1\u51fa\u7684\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\uff0c\u4f7f\u7528\u65b9\u6cd5\u5f88\u7b80\u5355\uff0c\u7528\u4e24\u5bf9\u5927\u62ec\u53f7\u628a\u51fd\u6570\u7684\u53c2\u6570\u62ec\u8d77\u6765\uff0c\u8fd9\u6837\u5728\u65e5\u5fd7\u8f93\u51fa\u7684\u65f6\u5019\u5c31\u80fd\u628a\u8c03\u7528\u51fd\u6570\u65f6\u53c2\u6570\u7684\u503c\u8f93\u51fa\u51fa\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_7","title":"\u516b\u3001\u73af\u5883\u90e8\u7f72","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_6","title":"1\u3001\u539f\u5219","text":"YouQu \u7684\u73af\u5883\u4f9d\u8d56\u4e00\u76f4\u575a\u6301 2 \u4e2a\u539f\u5219\uff1a \u6700\u5c0f\u73af\u5883\u4f9d\u8d56\u539f\u5219 \u6709\u4e9b\u540c\u5b66\u5199\u4e00\u4e9b\u529f\u80fd\uff0c\u9996\u5148\u60f3\u5230\u7684\u5c31\u662f\u53bb\u641c\u7d22\u5f15\u64ce\u641c\u4e00\u4e0b\uff0c\u770b\u6709\u6ca1\u6709\u73b0\u6210\u7684\u5de5\u5177\u6216\u8005\u4ee3\u7801\u76f4\u63a5\u80fd\u7528\uff0c\u7f8e\u5176\u540d\u66f0\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\uff0c\u522b\u4eba\u5df2\u7ecf\u9020\u597d\u4e86\u8f6e\u5b50\u54b1\u4eec\u5c31\u4e0d\u8981\u91cd\u590d\u53bb\u9020\u4e86\uff0c\u7136\u540e\u4e00\u5207\u4f3c\u4e4e\u90fd\u53d8\u5f97\u90a3\u4e48\u7684\u7406\u6240\u5e94\u5f53\u3002 \u5f53\u7136\u8fd9\u6837\u505a\u65e0\u53ef\u539a\u975e\uff0c\u6211\u76f8\u4fe1\u6709\u8fd9\u6837\u60f3\u6cd5\u5e76\u4e14\u4e00\u76f4\u8df5\u884c\u8fd9\u6837\u505a\u6cd5\u7684\u540c\u5b66\u4e0d\u5728\u5c11\u6570\uff0c\u4f46\u8fd9\u6837\u505a\u6709\u4e00\u4e2a\u5f88\u4e25\u91cd\u7684\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f60\u5199\u4e00\u4e2a\u5927\u578b\u9879\u76ee\u65f6\uff0c\u4f60\u4f1a\u5f15\u5165\u975e\u5e38\u975e\u5e38\u975e\u5e38\u591a\u7684\u4f9d\u8d56\uff0c\u6bd4\u5982\u8981\u505a\u4e2a\u63a5\u53e3\u8bf7\u6c42\u8981\u7528 requests\u3001\u8bfb\u5199\u4e2a\u6570\u636e\u7528 pandas\u3001\u5199\u4e2a\u8868\u683c\u7528 pyopenxl\u3001\u89e3\u6790\u4e2a\u6587\u672c\u8981\u7528\u8fd9\u4e2a\u90a3\u4e2a\u4e09\u65b9\u5e93 ... \u3002 \u6211\u8ba4\u4e3a\u8fd9\u662f\u975e\u5e38\u4e0d\u597d\u7684\u4e60\u60ef\uff0c\u5728\u5b9e\u73b0\u4e00\u4e2a\u529f\u80fd\u7684\u65f6\u5019\uff0c\u9996\u5148\u6211\u4eec\u5e94\u8be5\u53bb\u60f3\u81ea\u5df1\u600e\u4e48\u6837\u53bb\u5b9e\u73b0\uff0c\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff1b \u5982\u679c\u4f60\u4e0d\u4f1a\uff0c\u4f60\u53ef\u4ee5\u53bb\u5b66\u4e60\u4e09\u65b9\u5e93\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u522b\u4eba\u4e09\u65b9\u5e93\u4e5f\u662f\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\u7684\uff0c\u4e3a\u4ec0\u4e48\u54b1\u4eec\u4e0d\u884c\u5462\uff1b\u5982\u679c\u522b\u4eba\u7684\u4f60\u5b9e\u5728\u662f\u770b\u4e0d\u61c2\uff0c\u60f3\u5c3d\u4e00\u5207\u529e\u6cd5\u786e\u5b9e\u505a\u4e0d\u51fa\u6765\uff0c\u90a3\u518d\u8003\u8651\u5f15\u5165\u8fd9\u4e2a\u4e09\u65b9\u5e93\uff0c\u6211\u8ba4\u4e3a\u8fd9\u6837\u662f\u6ca1\u95ee\u9898\u7684\uff0c\u6bd5\u7adf\u54b1\u4eec\u6bb5\u4f4d\u8fd8\u4e0d\u591f\uff0c\u4f46\u5e0c\u671b\u5c06\u6765\u6709\u4e00\u5929\u6211\u4eec\u53ef\u4ee5\u3002 \u8fd9\u6837\u7684\u505a\u6cd5\u624d\u5e94\u8be5\u662f\u201c\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\u201d\u6b63\u786e\u7684\u64cd\u4f5c\u3002\u4e0d\u4f1a\u6ca1\u5173\u7cfb\uff0c\u770b\u770b\u522b\u4eba\u662f\u600e\u4e48\u5b9e\u73b0\u7684\uff0c\u81ea\u5df1\u518d\u6478\u7d22\u7740\u5199\u51fa\u6765\uff0c\u8fd9\u6837\u81ea\u5df1\u624d\u80fd\u6709\u6240\u63d0\u9ad8\uff0c\u4e0d\u7136\u4f60\u5c31\u53ea\u4f1a\u7528\u522b\u4eba\u7684\u4e1c\u897f\uff1b\u90a3\u4e9b\u5632\u7b11\u3001\u6279\u8bc4\u6211\u4eec\u91cd\u590d\u9020\u8f6e\u5b50\u7684\u4eba\uff0c\u5148\u60f3\u60f3\u81ea\u5df1\u4f1a\u9020\u8f6e\u5b50\u5417\u3002 \u672c\u7740\u81ea\u5df1\u5b9e\u73b0\u80fd\u5b9e\u73b0\u7684\u4e00\u5207\u7684\u539f\u5219\uff0cYouQu \u6846\u67b6\u505a\u5230\u4e86\u975e\u5e38\u5c11\u7684\u73af\u5883\u4f9d\u8d56\uff0c\u800c\u4e14\u6211\u4eec\u4ecd\u5728\u4e0d\u65ad\u52aa\u529b\uff0c\u51cf\u5c11\u73af\u5883\u90e8\u7f72\u7684\u4f9d\u8d56\u3002 \u6700\u5c0f\u4ed3\u5e93\u4f53\u79ef\u539f\u5219 \u5927\u6587\u4ef6\u4e0d\u80fd\u4e0a\u4f20\u5230\u5de5\u7a0b\u91cc\u9762\uff0c\u4fdd\u6301\u6574\u4e2a\u5de5\u7a0b\u7684\u8f7b\u91cf\u5316\uff0c\u8fd9\u6837\u5728\u514b\u9686\u4ee3\u7801\u7684\u65f6\u5019\u624d\u80fd\u975e\u5e38\u5feb\u901f\u65b9\u4fbf\u4f7f\u7528\uff0c\u6211\u4eec\u89c1\u8fc7\u4e00\u4e2a AT \u5de5\u7a0b clone \u5927\u5c0f\u8fbe\u5230\u597d\u51e0\u4e2a G\uff0c\u7b80\u76f4\u4e0d\u53ef\u601d\u8bae\u3002 \u5176\u5b9e\u4ee3\u7801\u6587\u4ef6\u7684\u5927\u5c0f\u662f\u5f88\u5c0f\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u7eaf\u5199\u4ee3\u7801\u968f\u4fbf\u5199\u5de5\u7a0b\u4e5f\u4e0d\u4f1a\u592a\u5927\uff0c\u800c\u6587\u6863\uff08\u5305\u542b\u63d2\u56fe\uff09\u7b49\u8d44\u6e90\u5374\u662f\u5f88\u5360\u7a7a\u95f4\u3002 \u56e0\u6b64\u6211\u4eec\u9009\u62e9\u5c06 YouQu \u7684\u6587\u6863\u5de5\u7a0b\u5355\u72ec\u8fc1\u51fa\u5230\u72ec\u7acb\u7684\u4ed3\u5e93 youqu-docs \u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_6","title":"2\u3001\u5b89\u88c5","text":"\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u8fd0\u884c env.sh \u5373\u53ef\u3002 bash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_4","title":"3\u3001\u5b9a\u5236\u4f9d\u8d56","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_2","title":"3.1\u3001\u65b0\u589e\u4f9d\u8d56","text":"\u5982\u679c\u5e94\u7528\u5e93\u8fd8\u9700\u8981\u5176\u4ed6 Python \u4f9d\u8d56\u5e93\uff0c\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a requirement.txt \u6587\u4ef6\uff1b autotest_xxx\n\u251c\u2500\u2500 requirement.txt\n\u251c\u2500\u2500 case ...\n \u91cc\u9762\u5199\u5165\u9700\u8981\u5b89\u88c5\u7684\u4e09\u65b9\u4f9d\u8d56\uff0c\u6bd4\u5982\u50cf\u8fd9\u6837\uff1a # requirement.txt\nPyYAML==6.0 # \u6307\u5b9a\u5b89\u88c5\u67d0\u4e2a\u7248\u672c\nrequests # \u672a\u6307\u5b9a\u7248\u672c\u5219\u5b89\u88c5\u6700\u65b0\u7248\n \u5728\u6267\u884c bash env.sh \u65f6\u4f1a\u4e00\u5e76\u5c06\u5176\u5b89\u88c5\u3002 \u5982\u679c\u591a\u4e2a\u5e94\u7528\u5e93\u90fd\u5b58\u5728 requirement.txt \u6587\u4ef6\uff0c\u6267\u884c env.sh \u65f6\u4f1a\u5c06\u591a\u4e2a requirement.txt \u6587\u4ef6\u4e00\u5e76\u52a0\u8f7d\uff1b\u90a3\u4e48\u4e00\u5b9a\u8981\u6ce8\u610f\u591a\u4e2a requirement.txt \u6587\u4ef6\u53ef\u80fd\u5b58\u5728\u76f8\u540c\u7684\u4f9d\u8d56\u88ab\u6307\u5b9a\u5b89\u88c5\u4e0d\u540c\u7248\u672c\u7b49\u7b49\u517c\u5bb9\u6027\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32_1","title":"3.2\u3001\u88c1\u526a\u4f9d\u8d56","text":"\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0c\u53ef\u80fd\u4f60\u53ea\u9700\u8981\u5b89\u88c5\u4e00\u4e9b\u6700\u6700\u57fa\u7840\u7684\u4f9d\u8d56\uff0c\u5176\u4ed6\u7684\u90fd\u4e0d\u9700\u8981\uff0c\u6bd4\u5982\u7eaf\u63a5\u53e3\u81ea\u52a8\u5316\u7684\u9879\u76ee\uff0c\u5b83\u4e0d\u9700\u8981 UI \u81ea\u52a8\u5316\u76f8\u5173\u7684\u4f9d\u8d56\u3002 \u4f60\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\uff0c\u5b58\u653e\u4e00\u4e2a BASICENV \u7684\u666e\u901a\u6587\u4ef6\uff0c\u91cc\u9762\u4e0d\u9700\u8981\u5199\u4efb\u4f55\u5185\u5bb9\uff0c\u8fd9\u6837\u6267\u884c env.sh \u65f6\uff0c\u53ea\u4f1a\u5b89\u88c5\u6700\u57fa\u7840\u7684\u4f9d\u8d56\u3002 autotest_xxx\n\u251c\u2500\u2500 BASICENV # \u53ef\u4ee5\u4f7f\u7528\uff1atouch BASICENV \u521b\u5efa\u6587\u4ef6\n\u251c\u2500\u2500 case ...\n \u57fa\u7840\u4f9d\u8d56\u4ec5\u5b89\u88c5\u4ee5\u4e0b\u51e0\u4e2a\u5305\uff1a pytest # pytest\npytest-rerunfailures # \u5931\u8d25\u91cd\u8dd1\u63d2\u4ef6\npytest-timeout # \u7528\u4f8b\u8d85\u65f6\u63d2\u4ef6\nallure-pytest # \u751f\u6210 allure \u62a5\u544a\u63d2\u4ef6\nallure.deb # allure \u62a5\u544a\u67e5\u770b\u5de5\u5177\n \u88c1\u526a\u4f9d\u8d56 \u548c \u65b0\u589e\u4f9d\u8d56 \u662f\u4e0d\u51b2\u7a81\u7684\uff0c\u53ef\u4ee5\u540c\u65f6\u4f7f\u7528\u3002 \u6b64\u65b9\u6848\u9ed8\u8ba4\u4e3a\u865a\u62df\u73af\u5883\u90e8\u7f72\uff0c\u5982\u679c\u4f60\u60f3\u76f4\u63a5\u90e8\u7f72\u5728\u672c\u673a\u4e0a\uff1a bash env_dev.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_8","title":"\u4e5d\u3001\u5931\u8d25\u5f55\u5c4f","text":"\u5f55\u5c4f\u5176\u5b9e\u662f\u4e00\u79cd\u89c6\u9891\u5f62\u5f0f\u7684\u65e5\u5fd7\uff0c\u56e0\u4e3a\u5f88\u591a\u65f6\u5019\u6211\u4eec\u5728\u67e5\u770b\u65e5\u5fd7\u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u51c6\u786e\u7684\u5b9a\u4f4d\u5230\u7528\u4f8b\u5931\u8d25\u7684\u5177\u4f53\u539f\u56e0\uff0c\u56e0\u6b64\u7528\u4f8b\u7684\u5f55\u5c4f\u80fd\u8ba9\u6211\u4eec\u770b\u5230\u7528\u4f8b\u5728\u6267\u884c\u8fc7\u7a0b\uff1b \u3010\u4f7f\u7528\u65b9\u6cd5\u3011 \u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u5173\u6ce8 2 \u4e2a\u53c2\u6570\uff1b ;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\u3002\n;\u6ce8\u610f\uff0c\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u4e0d\u80fd\u5c0f\u4e8e\u5931\u8d25\u5f55\u5c4f\u6b21\u6570\uff0c\u5373 RERUN >= RECORD_FAILED_CASE\nRECORD_FAILED_CASE = 1\n \u9ed8\u8ba4\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u662f 1 \u6b21\uff1b RECORD_FAILED_CASE = 1 \u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff1b RECORD_FAILED_CASE = 0 \u8868\u793a\u4e0d\u7ba1\u7528\u4f8b\u6210\u529f\u6216\u5931\u8d25\u90fd\u5f55\u5c4f\uff1b \u5f55\u5c4f\u662f\u8981\u5360\u7528\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u7279\u522b\u662f\u5728\u4e00\u4e9b\u914d\u7f6e\u8f83\u4f4e\u7684\u673a\u5668\u4e0a\u4f1a\u5f88\u660e\u663e\uff0c\u6240\u4ee5\u4f60\u9700\u8981\u8003\u8651\u662f\u5426\u6709\u5fc5\u8981\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1b \u4f7f\u7528 manage.py \u6267\u884c\u7528\u4f8b\u9ed8\u8ba4\u8bfb\u53d6\u5230 globalconfig.ini \u91cc\u9762\u7684\u53c2\u6570\uff0c\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report/record \u76ee\u5f55\u4e0b\u4fdd\u5b58\u5931\u8d25\u7528\u4f8b\u7684\u5f55\u5c4f\u548c\u65ad\u8a00\u7684\u90a3\u4e2a\u65f6\u95f4\u70b9\u7684\u622a\u5c4f\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7\u89c6\u9891\u6587\u4ef6\u770b\u5230\u5931\u8d25\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u90fd\u53d1\u751f\u4e86\u4ec0\u4e48\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#wayland","title":"\u5341\u3001Wayland \u9002\u914d","text":"Wayland \u4e0b\u81ea\u52a8\u5316\u4e3b\u8981\u95ee\u9898\u662f X11 \u4e0b\u7684\u952e\u9f20\u64cd\u4f5c\u65b9\u6cd5\u65e0\u6cd5\u4f7f\u7528\uff0c\u6bd4\u5982 Xdotool\u3001 PyAutoGUI\u3001Xwininfo \u7b49\u7b49\uff1b YouQu \u5728 Wayland \u4e0b\u517c\u5bb9\u9002\u914d\uff0cenv.sh \u5728 Wayland \u4e0b\u6267\u884c\u65f6\u4f1a\u5b89\u88c5\u81ea\u7814\u7684\u952e\u9f20\u64cd\u4f5c\u670d\u52a1\uff08\u53ef\u80fd\u5b58\u5728\u4e00\u4e9b\u4f9d\u8d56\u62a5\u9519\uff0c\u6309\u7167\u6ce8\u91ca\u89e3\u51b3\u5373\u53ef\uff09\uff0c\u6846\u67b6\u6838\u5fc3\u5e93\u4e5f\u9488\u5bf9\u6027\u7684\u505a\u4e86\u9002\u914d\uff0c\u4e0a\u5c42\u7528\u4f8b\u5b8c\u5168\u4e0d\u7528\u5173\u5fc3\u673a\u5668\u662fWayland \u8fd8\u662f X11\uff0c\u6846\u67b6\u4f1a\u6839\u636e\u6267\u884c\u65f6\u72b6\u6001\u81ea\u52a8\u5224\u65ad\u8d70\u4e0d\u540c\u7684\u903b\u8f91\uff1b \u7b80\u5355\u8bb2\u5c31\u662f\uff0c\u5e94\u7528\u5e93\u53ea\u9700\u8981\u7ef4\u62a4\u4e00\u5957\u7528\u4f8b\u811a\u672c\u5373\u53ef\u3002 \u3010\u7528\u4f8b\u517c\u5bb9\u3011 \u56e0\u4e3a Wayland \u4e0b\u6709\u4e9b\u5e94\u7528\u7684\u754c\u9762\u663e\u793a\u548c\u529f\u80fd\u672c\u8eab\u5b58\u5728\u4e00\u4e9b\u5dee\u5f02\uff0c\u7528\u4f8b\u5c42\u53ef\u80fd\u9700\u8981\u5bf9\u8fd9\u90e8\u5206\u7528\u4f8b\u505a\u903b\u8f91\u5224\u65ad\uff0c\u4f7f\u7528\u5168\u5c40\u914d\u7f6e\u91cc\u9762\u7684\u5e38\u91cf\u8fdb\u884c\u903b\u8f91\u7f16\u5199\u5373\u53ef\uff1a from setting.globalconfig import GlobalConfig\n# GlobalConfig.IS_WAYLAND \u83b7\u53d6\u5230\u5f53\u524d\u7684\u663e\u793a\u670d\u52a1\u5668\uff08bool\uff09\n# \u5e94\u7528\u5e93 Config \u7ee7\u627f GlobalConfig\nif Config.IS_WAYLAND:\npass\nif Config.IS_X11:\npass\n \u6bd4\u5982\u7528\u4f8b\u91cc\u9762\u5982\u679c\u65ad\u8a00\u7684\u56fe\u7247\u4e0d\u540c\uff1a if Config.IS_WAYLAND:\nself.assert_image_exist(\"wayland_XXX\")\nelse:\nself.assert_image_exist(\"x11_XXX\")\n \u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u811a\u672c\u5728 Wayland \u548c X11 \u4e0b\u90fd\u53ef\u4ee5\u8dd1\uff0cso easy \u662f\u4e0d\u662f\uff1f\u5b8c\u5168\u6ca1\u5fc5\u8981\u4e13\u95e8\u62c9\u65b0\u5206\u652f\u8fdb\u884c Wayland \u9002\u914d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_9","title":"\u5341\u4e00\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_7","title":"1. \u76ee\u5f55\u7ed3\u6784","text":"\u6267\u884c\u65f6\u4f1a\u5728\u6839\u76ee\u5f55\u4e0b\u52a8\u6001\u751f\u6210 report \u76ee\u5f55\uff0c\u6240\u6709\u7684\u62a5\u544a\u76f8\u5173\u7684\u6587\u4ef6\u4f1a\u7edf\u4e00\u5b58\u653e\u5728\u91cc\u9762\uff0c\u793a\u4f8b\uff1a /report\n \u251c\u2500\u2500 allure # allure\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json\n \u251c\u2500\u2500 allure_html # \u751f\u6210\u7684html\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 index.html \u251c\u2500\u2500 allure_back # allure\u62a5\u544a\u5907\u4efd\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 20221108114823\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json\n \u251c\u2500\u2500 json # json\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 result_deepin-music_20221109134736_1081333.json\n \u251c\u2500\u2500 logs # \u65e5\u5fd7\u6587\u4ef6\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 2022-11-10_debug.log \u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-10_error.log\n \u251c\u2500\u2500 record # \u5f55\u5c4f\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-09\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 15\u65f614\u520609\u79d2_test_music_303_2_autotest.mp4\n \u2514\u2500\u2500 xml # xml\u62a5\u544a\n\u2514\u2500\u2500 autotest_deepin_music-20221109134736.xml\n \u9ed8\u8ba4\u60c5\u51b5\u4e0b\u540c\u65f6\u751f\u6210 html\u3001xml\u3001json\u4e09\u79cd\u5f62\u5f0f\u7684\u62a5\u544a\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_7","title":"2. \u5b9a\u5236\u62a5\u544a","text":"\u6211\u4eec\u5bf9 allure \u62a5\u544a\u8fdb\u884c\u4e86\u4e00\u7cfb\u5217\u7684\u5b9a\u5236\uff1a \u5b9a\u5236 logo\u3001title\u3001\u62a5\u544a\u9ed8\u8ba4\u8bed\u8a00\u4e3a\u4e2d\u6587\uff1b \u52a0\u5165\u4e86\u7528\u4f8b\u65ad\u8a00\u5931\u8d25\u65f6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u4ee5\u53ca\u6b64\u65f6\u56fe\u50cf\u5bf9\u6bd4\u7684\u6a21\u677f\u56fe\u7247\uff1b \u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\uff0c\u4f60\u53ef\u4ee5\u5728 html \u62a5\u544a\u4e2d\u76f4\u63a5\u770b\u5f55\u5236\u7684\u89c6\u9891\uff1b \u52a0\u5165\u4e86 IP \u5730\u5740\u3001\u7cfb\u7edf\u4fe1\u606f\u3001\u955c\u50cf\u7248\u672c\u7b49\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_5","title":"3. \u67e5\u770b\u62a5\u544a","text":" \u672c\u5730\u6267\u884c \u5728 report/allure \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u4e00\u5806\u6587\u672c\u6587\u4ef6\uff0c\u8fd9\u4e9b\u662f allure \u63d2\u4ef6\u751f\u6210\u7684\u62a5\u544a\u6e90\u6570\u636e\uff0c\u6211\u4eec\u5728 report/allure_html \u76ee\u5f55\u4e0b\u7ed9\u4f60\u751f\u6210\u4e86 html \u6587\u4ef6\uff0c\u4f46\u662f\u4f60\u4e0d\u80fd\u76f4\u63a5\u901a\u8fc7\u6d4f\u89c8\u5668\u6253\u5f00 index.html \u6587\u4ef6\uff0c\u56e0\u4e3a allure \u7684\u62a5\u544a\u90fd\u662f\u57fa\u4e8e\u5728\u7ebf\u7684\u670d\u52a1\uff0c\u4f60\u5e94\u8be5\u8fd9\u6837\u6253\u5f00\uff1a allure open report/allure_html\n \u4f7f\u7528 manage.py \u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u5728\u7ec8\u7aef\u7684\u6700\u540e\u4e00\u884c\uff0c\u6211\u4eec\u4f1a\u7ed9\u4f60\u8f93\u51fa\u6253\u5f00\u62a5\u544a\u7684\u547d\u4ee4\uff0c\u76f4\u63a5\u590d\u5236\u5b83\u5728\u7ec8\u7aef\u6267\u884c\u5c31\u53ef\u4ee5\u67e5\u770b\u4e86\uff0c\u50cf\u8fd9\u6837\uff1a \u7ec8\u7aef\u6267\u884c\u547d\u4ee4: allure open /tmp/youqu/report/allure_html \u67e5\u770b\u62a5\u544a \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 Pycharm \u91cc\u9762\u627e\u5230 index.html \u6587\u4ef6\uff0c\u7136\u540e\u53f3\u952e\u9009\u62e9\u6d4f\u89c8\u5668\u6253\u5f00\uff0c\u6216\u8005\u4f60\u53ef\u4ee5\u7528\u4e00\u4e2a http \u670d\u52a1\u6253\u5f00\u3002 \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 report/allure \u76ee\u5f55\u4e0b\u67e5\u770b\u62a5\u544a\uff1a allure serve report/allure\n \u8fdc\u7a0b\u6267\u884c \u8fdc\u7a0b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\uff0c\u4f1a\u5c06\u6240\u6709\u8fdc\u7a0b\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u62a5\u544a\u90fd\u6536\u96c6\u5230 report/allure \u76ee\u5f55\u4e0b\uff0c\u5206\u522b\u6309\u7167\u673a\u5668\u7684 IP \u7b49\u5efa\u4e86\u4e0d\u540c\u7684\u76ee\u5f55\uff0c\u4f60\u53ef\u4ee5\u5728\u8fd9\u4e9b\u76ee\u5f55\u91cc\u9762\u53bb\u67e5\u770b\u5bf9\u5e94\u7684\u6d4b\u8bd5\u62a5\u544a\uff0c\u67e5\u770b\u65b9\u6cd5\u548c\u524d\u9762\u672c\u5730\u6267\u884c\u67e5\u770b\u7684\u65b9\u6cd5\u4e00\u6837\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_10","title":"\u5341\u4e8c\u3001\u9759\u6001\u4ee3\u7801\u626b\u63cf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_8","title":"1. \u63d0\u524d\u89e3\u51b3\u4ee3\u7801\u95ee\u9898","text":"\u4e3a\u4e86\u5e2e\u52a9\u5f00\u53d1\u8005\u7edf\u4e00\u4ee3\u7801\u98ce\u683c\uff0cPython \u793e\u533a\u63d0\u51fa\u4e86 PEP8 \u4ee3\u7801\u7f16\u7801\u98ce\u683c\uff0cPython \u5b98\u65b9\u540c\u65f6\u63a8\u51fa\u4e86\u4e00\u4e2a\u68c0\u67e5\u4ee3\u7801\u98ce\u683c\u662f\u5426\u7b26\u5408 PEP8 \u7684\u5de5\u5177\uff0c\u540d\u5b57\u4e5f\u53eb PEP8\u3002 \u4f46\u662f\uff0cPycharm \u91cc\u9762\u7684 PEP8 \u63d2\u4ef6\u5b9e\u9645\u4e0a\u5e76\u4e0d\u80fd\u53d1\u73b0\u5f88\u591a\u4ee3\u7801\u95ee\u9898\uff0c\u8fd9\u4e9b\u95ee\u9898\u5e76\u4e0d\u4f1a\u5728\u8fd0\u884c\u65f6\u62a5\u9519\uff0c\u56e0\u4e3a\u4ece Python \u8bed\u8a00\u89d2\u5ea6\u5e76\u4e0d\u5173\u5fc3\u8fd9\u4e9b\u95ee\u9898\uff0c\u5728 Pycharm \u7f16\u8f91\u5668\u91cc\u9762\u4f7f\u7528\u5feb\u6377\u952e ctrl + alt + L\uff0c\u6709\u4e00\u70b9\u70b9\u683c\u5f0f\u5316\u7684\u6548\u679c\uff0c\u80fd\u89e3\u51b3\u4e00\u4e9b\u7a7a\u683c\u3001\u6362\u884c\u7b49\u5c0f\u95ee\u9898\u3002 \u8fd9\u91cc\u63a8\u8350\u4e00\u4e2a Python \u793e\u533a\u6d41\u884c\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff1a Black\uff0c\u53f7\u79f0\u4e0d\u59a5\u534f\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff0c\u5b83\u68c0\u6d4b\u5230\u4e0d\u7b26\u5408\u89c4\u8303\u7684\u4ee3\u7801\u98ce\u683c\u76f4\u63a5\u5c31\u5e2e\u4f60\u5168\u90e8\u683c\u5f0f\u5316\u597d\uff0c\u5c31\u662f\u8fd9\u4e48\u521a\uff01 \u5b89\u88c5\uff1a sudo pip3 install black \n \u4f7f\u7528\u65b9\u6cd5\uff1a black ${CheckPath}\n \u4f7f\u7528\u8fd9\u4e2a\u5de5\u5177\u683c\u5f0f\u5316\u4e4b\u540e\uff0c\u4ee3\u7801\u4f1a\u88ab\u81ea\u52a8\u8c03\u6574\uff0c\u521a\u5f00\u59cb\u4f60\u53ef\u80fd\u4f1a\u89c9\u5f97\u8c03\u6574\u5f97\u5f88\u5938\u5f20\uff0c\u6ca1\u5173\u7cfb\u575a\u6301\u770b\uff0c\u4e60\u60ef\u4e4b\u540e\uff0c\u4f60\u4f1a\u89c9\u5f97\u5f88\u4f18\u96c5\uff0c\u6ca1\u9519\uff0c\u8fd9\u5c31\u662f Pythonic Code \u7684\u6838\u5fc3\uff0c\u8bf7\u4fdd\u6301\u4f18\u96c5\uff5e\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_8","title":"2. \u4ee3\u7801\u626b\u63cf\u5de5\u5177","text":"\u4f7f\u7528\u6839\u76ee\u5f55\u4e0b pylint.sh \u626b\u63cf\u4ee3\u7801\uff0c\u5728 report \u76ee\u5f55\u4e0b\u67e5\u770b\u4ee3\u7801\u626b\u63cf\u62a5\u544a\uff0c\u5982\u679c\u6709\u4ee3\u7801\u95ee\u9898\u8bf7\u63d0\u524d\u89e3\u51b3\u4e4b\u540e\u518d\u63d0\u4ea4\u3002 \u6b64\u811a\u672c\u5df2\u7ecf\u4f7f\u7528 Python \u793e\u533a\u6700\u6d41\u884c\u7684\u4ee3\u7801\u626b\u63cf\u5de5\u5177 Pylint \u8fdb\u884c\u4ee3\u7801\u626b\u63cf\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a bash pylint.sh\n \u8fd0\u884c\u4e4b\u540e\u4f1a\u63d0\u793a\u4f60\u8981\u626b\u63cf\u7684\u76ee\u5f55\uff0c\u6bd4\u5982\u8f93\u5165 apps \uff0c\u5219\u4f1a\u626b\u63cf apps \u4e0b\u7684\u6240\u6709 Python \u4ee3\u7801\u3002 \u5728 setting/pylintrc.cfg \u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u76f8\u5173\u914d\u7f6e\uff0c\u626b\u63cf\u5b8c\u6210\u4e4b\u540e\u5728 report/pylints \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u626b\u63cf\u62a5\u544a\u3002 \u4ee3\u7801\u63d0\u4ea4\u9700\u901a\u8fc7 git review \u63d0\u4ea4\u5230 gerrit \uff0c\u4eba\u5de5 Code Review \u901a\u8fc7\u4e4b\u540e\u5408\u5165\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_11","title":"\u5341\u4e09\u3001\u63d0\u4ea4\u4ee3\u7801","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_9","title":"1. \u5b89\u88c5\u4f9d\u8d56","text":"sudo apt install git-review\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_9","title":"2. \u63d0\u4ea4\u6a21\u677f","text":"\u5728 ~ \u76ee\u5f55\u4e0b\u65b0\u5efa\u6587\u4ef6\uff0c\u5e76\u547d\u540d\u4e3a gitcommit_template \u5c06\u4ee5\u4e0b\u5185\u5bb9\u5199\u5165\u6587\u4ef6\u5f53\u4e2d\uff1a # commit type :fix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style(\u98ce\u683c\u4fee\u6539)\u3001refactor(\u91cd\u6784)\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test(\u6d4b\u8bd5) + \u7b80\u5355\u63cf\u8ff0. \u9ed8\u8ba4fix,\u6839\u636e\u60c5\u51b5\u4fee\u6539\nfix: \n\n# \u8be6\u7ec6\u8bf4\u660e\u4ee3\u7801\u7684\u6539\u52a8\uff0c\u5305\u542b\u4ee3\u7801\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u4ee5\u53ca\u4e3a\u4ec0\u4e48\u8fd9\u4e48\u505a\uff0c\u53ef\u80fd\u4f1a\u5f71\u54cd\u54ea\u4e9b\u529f\u80fd\u3002\u5bf9\u4e8e\u4ee3\u7801\u7684\u5ba1\u6838\u8005\uff0c\u9700\u8981\u4ece\u8fd9\u6bb5\u63cf\u8ff0\u4e2d\u80fd\u5b8c\u5168\u7406\u89e3\u4ee3\u7801\u4e2d\u6240\u6709\u6539\u52a8\u7684\u5185\u5bb9\nDescription: \n\n# \u5199\u4e00\u6bb5\u9762\u5411\u4e8e\u4ea7\u54c1\u7684\u603b\u7ed3\u6027\u5185\u5bb9\uff0c\u7528\u4e8e\u81ea\u52a8\u751f\u6210crp\u4e0a\u7684changlog\uff0c\u9700\u8981\u6ce8\u610f\u7684\u4e8b\uff0c\u8fd9\u6bb5\u63cf\u8ff0\u5fc5\u987b\u4ece\u4ea7\u54c1\u7684\u89d2\u5ea6\u8003\u8651\u3002\nLog: \n\n# \u5173\u8054pms\u4e0a\u7684bug\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94bug\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4fee\u590dbug\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Bug: \n\n# \u4fee\u590d github issue \n#Issue: \n\n# \u5173\u8054pms\u4e0a\u7684\u4efb\u52a1\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94\u4efb\u52a1\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4efb\u52a1\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Task: \n \u547d\u4ee4\u884c\u6267\u884c: git config --global commit.template ~/gitcommit_template\n \u6b64\u547d\u4ee4\u5c06\u6a21\u677f\u52a0\u5165\u5230 git \u7684\u63d0\u4ea4\u6a21\u677f\u4e2d\u3002 \u540e\u7eed\u63d0\u4ea4\u7684\u65f6\u5019\u9700\u8981\u5173\u6ce8\u4e00\u4e0b\u51e0\u70b9\uff1a commit type \u5bf9\u5e94\u4e0d\u540c\u7684\u4fee\u6539\u7c7b\u578b\uff1afix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style \uff08\u98ce\u683c\u4fee\u6539\uff09\u3001refactor \uff08\u91cd\u6784\uff09\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test \uff08\u6d4b\u8bd5\uff09 commit type \u5192\u53f7\u540e\u9762\u52a0\u7a7a\u683c\u3002 Description \u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u9700\u8981\u8fdb\u884c\u8be6\u7ec6\u8bf4\u660e\uff0c\u6bd4\u5982\u5bf9\u529f\u80fd\u8fdb\u884c\u5927\u6539\u7b49\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_6","title":"3. \u63a8\u9001\u4ee3\u7801","text":"\u9996\u5148\u6dfb\u52a0 commit \u4fe1\u606f git add \u540e\u9762\u52a0\u6587\u4ef6\u540d\u79f0\n git add . # \u8868\u793a\u6dfb\u52a0\u6240\u6709\u6587\u4ef6\n \u4f7f\u7528\u8fd9\u6761\u547d\u4ee4\u6ce8\u610f\u6709\u4e9b\u4e34\u65f6\u6587\u4ef6\u4e0d\u8981\u63d0\u4ea4\u5230\u4ed3\u5e93\u4e86\u3002 git commit -a\n \u4e4b\u540e\u5728 fix: \u540e\u9762\uff08\u6ce8\u610f\u5192\u53f7\u540e\u9762\u5fc5\u987b\u52a0\u7a7a\u683c\uff0c\u4e0d\u7136\u76f4\u63a5-1\uff09\u5199\u672c\u5730\u63d0\u4ea4\u7684 commit \u4fe1\u606f\uff0c\u7136\u540e\u5c31\u53ef\u4ee5\u63d0\u4ea4\u4ee3\u7801\u4e86 git review branch(\u5f53\u524d\u5206\u652f) -r origin\n \u6700\u597d\u4e00\u6b21 commit\uff0c\u4e00\u6b21 git review \uff0c\u7ecf\u5e38\u6709\u540c\u5b66\u5728\u672c\u5730\u75af\u72c2 commit \u6700\u540e git review \u62a5\u9519\u4e0d\u77e5\u9053\u548b\u56de\u4e8b\u513f\u3002 \u82e5\u4e0d\u60f3\u6bcf\u6b21\u63d0\u4ea4\u90fd\u52a0\u4e0a -r \u9009\u9879\uff0c\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a git config --global gitreview.remote origin \u63d0\u4ea4\u4ee3\u7801\uff0c\u76f4\u63a5\u4f7f\u7528 git review branch<\u76ee\u6807\u5206\u652f>\uff0c\u4f8b\u5982 git review master"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git","title":"4. Git\u6807\u7b7e","text":"Git \u6807\u7b7e\u5b9e\u9645\u4e0a\u662f commit \u7684\u4e00\u4e2a\u522b\u540d\uff0c\u4e3b\u8981\u7528\u4e8e\u7ba1\u7406\u5386\u53f2\u7248\u672c\u3002 \u60f3\u8c61\u4e00\u4e0b\u9886\u5bfc\u8ba9\u4f60\u628a\u4e4b\u524d\u7684\u67d0\u4e2a\u7248\u672c\u7684\u4ee3\u7801\u62c9\u51fa\u6765\u8dd1\uff0c\u4f60\u662f\u4e0d\u662f\u4e56\u4e56\u7684\u53bb\u628a\u6240\u6709\u63d0\u4ea4\u8bb0\u5f55\u62c9\u51fa\u6765\u627e\uff0c\u7136\u540e\u627e\u5230\u90a3\u4e2a\u54c8\u5e0c\u503c\uff0c\u901a\u8fc7\u54c8\u5e0c\u503c\u6765\u68c0\u51fa\u4ee3\u7801\u3002 \u8fd9\u4e00\u5957\u64cd\u4f5c\u4e0b\u6765\u662f\u4e0d\u662f\u5f88\u9ebb\u70e6\uff0c\u8d39\u65f6\u95f4\u8fd8\u4e0d\u4e00\u5b9a\u80fd\u627e\u5f97\u5230\uff0c\u6ca1\u4eba\u80fd\u8bb0\u4f4f\u6bcf\u4e2a\u63d0\u4ea4\u54c8\u5e0c\u503c\u4ee5\u53ca\u8fd9\u6b21\u63d0\u4ea4\u90fd\u6539\u4e86\u54ea\u4e9b\u4ee3\u7801\u3002 \u56e0\u6b64\u7ed9\u63d0\u4ea4\u6253\u4e2a\u6807\u7b7e\uff0c\u5c31\u662f\u628a\u54c8\u5e0c\u503c\u8f6c\u6362\u6210\u4eba\u7c7b\u80fd\u7406\u89e3\u7684\u8bed\u8a00\uff0c\u6bd4\u5982 v1.0\uff0c\u5c31\u53ef\u4ee5\u76f4\u63a5\u901a\u8fc7\u6807\u7b7e\u627e\u5230\u5bf9\u5e94\u7684\u63d0\u4ea4\u3002 \u65b0\u5efa\u6807\u7b7e git tag -a <tagname>\n \u56de\u8f66\u4e4b\u540e\uff0cGit \u4f1a\u6253\u5f00\u4f60\u7684\u7f16\u8f91\u5668\uff0c\u8ba9\u4f60\u5199\u4e00\u53e5\u6807\u7b7e\u6ce8\u89e3\uff0c\u5c31\u50cf\u4f60\u7ed9\u63d0\u4ea4\u5199\u6ce8\u89e3\u4e00\u6837\u3002 \u67e5\u770b\u6240\u6709\u6807\u7b7e git tag -l\n# git tag \u4e5f\u884c\n \u5220\u9664\u6807\u7b7e git tag -d <tagname>\n \u63a8\u9001\u6807\u7b7e\u81f3\u8fdc\u7a0b git push \u547d\u4ee4\u5e76\u4e0d\u4f1a\u4f20\u9001\u6807\u7b7e\u5230\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\uff0c\u5fc5\u987b\u663e\u5f0f\u5730\u63a8\u9001\u6807\u7b7e\u3002 git push origin <tagname>\n \u63a8\u9001\u6240\u6709\u4e0d\u5728\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\u7684\u6807\u7b7e git push origin --tag\n \u5220\u9664\u8fdc\u7a0b\u6807\u7b7e git push origin :refs/tag/<tagname>\n \u540e\u671f\u6253\u6807\u7b7e \u5148\u7528 git log --pretty=oneline \u67e5\u8be2\u63d0\u4ea4\u8bb0\u5f55\uff0c\u83b7\u53d6\u6821\u9a8c\u7801\u3002 git tag -a <tagname> 9fceb02(\u6821\u9a8c\u7801)\n \u68c0\u51fa\u6807\u7b7e git checkout <tagname>\n \u6b64\u65f6\uff0c\u4ed3\u5e93\u4f1a\u5904\u4e8e\u201c\u5206\u79bb\u5934\u6307\u9488\uff08detached HEAD\uff09\u201d\u7684\u72b6\u6001\u3002 \u5728\u201c\u5206\u79bb\u5934\u6307\u9488\u201d\u72b6\u6001\u4e0b\uff0c\u5982\u679c\u4f60\u505a\u4e86\u67d0\u4e9b\u66f4\u6539\u7136\u540e\u63d0\u4ea4\u5b83\u4eec\uff0c\u6807\u7b7e\u4e0d\u4f1a\u53d1\u751f\u53d8\u5316\uff0c \u4f46\u4f60\u7684\u65b0\u63d0\u4ea4\u5c06\u4e0d\u5c5e\u4e8e\u4efb\u4f55\u5206\u652f\uff0c\u5e76\u4e14\u5c06\u65e0\u6cd5\u8bbf\u95ee\uff0c\u9664\u975e\u901a\u8fc7\u786e\u5207\u7684\u63d0\u4ea4\u54c8\u5e0c\u624d\u80fd\u8bbf\u95ee\u3002 \u56e0\u6b64\uff0c\u5982\u679c\u4f60\u9700\u8981\u8fdb\u884c\u66f4\u6539\uff0c\u6bd4\u5982\u4f60\u8981\u4fee\u590d\u65e7\u7248\u672c\u4e2d\u7684\u9519\u8bef\uff0c\u90a3\u4e48\u901a\u5e38\u9700\u8981\u521b\u5efa\u4e00\u4e2a\u65b0\u5206\u652f\uff1a git checkout -b <NewBranchName> <tagname>\n \u65b0\u5206\u652f\u4e0a\u53ef\u4ee5\u8fdb\u884c\u63d0\u4ea4\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_12","title":"\u5341\u56db\u3001\u5e38\u89c1\u95ee\u9898","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_10","title":"1. \u63d0\u4ea4\u4ee3\u7801\u65f6\u63d0\u793a\u90ae\u7bb1\u6216\u8005\u540d\u79f0\u4e0d\u5bf9","text":"\u91cd\u65b0\u914d\u7f6e\u90ae\u7bb1\u6216\u8005\u540d\u79f0\uff0c\u7136\u540e\u91cd\u7f6e\u751f\u6548\uff1a git commit --amend --reset-author\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_10","title":"2. \u600e\u4e48\u56de\u6eda\u5230\u4e4b\u524d\u7684\u7248\u672c","text":"(1)\u67e5\u8be2\u5386\u53f2\u63d0\u4ea4\u8bb0\u5f55 git log\n \u627e\u5230\u4f60\u8981\u56de\u6eda\u7684\u7248\u672c\uff0c\u590d\u5236 hash \u503c\u3002 \u6ce8\u610f\uff1a\u662f commit \u7a7a\u683c\u4e4b\u540e\u7684 hash \u503c\uff0c\u4e4b\u524d\u6709\u540c\u5b66\u590d\u5236\u7684 Change-Id: \u8fd9\u6837\u80af\u5b9a\u62a5\u9519\u3002 (2)\u56de\u6eda\u7248\u672c\uff0c\u4e0d\u6e05\u9664\u4ee3\u7801 git reset --soft ${hash}\n (3)\u56de\u6eda\u7248\u672c\uff0c\u6e05\u9664\u4ee3\u7801\uff0c\u614e\u7528\u54c8 git reset --hard ${hash}\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-f-s-e","title":"3. \u6d4b\u8bd5\u62a5\u544a\u91cc\u9762 F S . E \u662f\u4ec0\u4e48\u610f\u601d","text":"F \u8868\u793a\u5931\u8d25\uff0c. \uff08\u70b9\uff09\u8868\u793a\u901a\u8fc7\uff0cS \u8868\u793a\u8df3\u8fc7\uff0cE \u8868\u793a error \u6709\u62a5\u9519"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git-status","title":"4. \u89e3\u51b3 git status \u4e2d\u6587\u663e\u793a\u7684\u95ee\u9898","text":"git config --global core.quotePath false\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5-apps","title":"5. apps \u76ee\u5f55\u4e0b\u989c\u8272\u6709\u4e9b\u662f\u9ec4\u8272\u7684","text":"\u5728 Pycharm \u4e2d apps \u76ee\u5f55\u4e0b\u5e94\u7528\u5e93\u6587\u4ef6\u662f\u9ec4\u8272\u7684\uff0c\u7f16\u8f91\u5668\u8bc6\u522b\u4e0d\u5230\u4ee3\u7801\u65b0\u589e\u548c\u4fee\u6539\uff1b \u7531\u4e8e\u793e\u533a\u7248 Pycharm \u4e0d\u80fd\u52a8\u6001\u8bc6\u522b\u591a\u4ed3\u5e93\uff0c\u9700\u8981\u5728 setting \u91cc\u9762\u624b\u52a8\u6ce8\u518c\uff0c\u64cd\u4f5c\u6b65\u9aa4\uff1a File \u2014> Settings \u2014> Version Control \u2014> \u70b9 + \u53f7 \u2014> Directory \u9009\u4e2d\u5e94\u7528\u5e93\u5de5\u7a0b\u76ee\u5f55 \u2014> VCS \u9009\u4e2d Git \u2014> Apply \u5982\u6b64\u5c31\u53ef\u4ee5\u4e86\u3002 \u4e13\u4e1a\u7248 Pycharm \u4e0d\u5b58\u5728\u8fd9\u4e2a\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#6-envsh-r","title":"6. \u6267\u884c env.sh \u62a5\u9519 $'\\r':\u672a\u627e\u5230\u547d\u4ee4","text":"\u51fa\u73b0\u8fd9\u4e2a\u95ee\u9898\u4f60\u5e94\u8be5\u662f\u5728 windows \u4e0a\u6253\u5f00\u6216\u7f16\u8f91\u8fc7 env.sh \u811a\u672c\uff0cwindows\u4e0b\u7684\u6362\u884c\u662f\u56de\u8f66\u7b26+\u6362\u884c\u7b26\uff0c\u4e5f\u5c31\u662f\\r\\n\uff0c\u800c Linxu \u4e0b\u662f\u6362\u884c\u7b26 \\n\uff0cLinux \u4e0b\u4e0d\u8bc6\u522b \\r\uff0c\u56e0\u6b64\u62a5\u9519\u3002 \u89e3\u51b3\u65b9\u6848\uff1a # \u5c06 \\r \u66ff\u6362\u4e3a\u7a7a\nsudo sed -i 's/\\r//' env.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#7","title":"7.\u600e\u6837\u4e3a\u5355\u72ec\u67d0\u4e00\u6761\u7528\u4f8b\u914d\u7f6e\u6267\u884c\u8d85\u65f6\u65f6\u95f4","text":"\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u5982\u4e0b\uff1a @pytest.mark.timeout(300) # \u5355\u4f4d\u79d2\ndef test_xxx_001():\npass\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#8-youqu","title":"8. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u6240\u6709\u4ee3\u7801\uff0c\u5305\u542b\u5b50\u4ed3\u5e93","text":"\u524d\u7f6e\u6761\u4ef6\uff1a\u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 # \u7b2c\u4e00\u6b21\u5b58\u50a8\u5bc6\u7801\uff0c\u63d0\u4f9b\u540e\u9762\u62c9\u4ee3\u7801(gerrit: ldap\u8d26\u53f7\u548c\u5bc6\u7801\uff0cgit\u62c9\u53d6\u7b2c\u4e00\u6b21\u8f93\u5165\u4fdd\u5b58\uff0c\u540e\u9762\u76f4\u63a5\u4f7f\u7528)\ngit config --global credential.helper store\n\n# \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\uff0c\u5e76\u9012\u5f52\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\" --recursive\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#9-youqu","title":"9. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\u6307\u5b9a\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u524d\u7f6e\u6761\u4ef6\uff1a \u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 \u5df2\u5b58\u50a8\u8bbf\u95ee\u5bc6\u7801 # \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\"\n# \u6307\u5b9a\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ncd youqu\ngit submodule update --init apps/autotest_xxx_xxx\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#10-youqu","title":"10. \u5982\u4f55\u66f4\u65b0 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\uff0c\u6240\u6709\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u66f4\u65b0\u6240\u6709\u5b50\u4ed3\u5e93\u4ee3\u7801 cd youqu\ngit pull & git submodule foreach git pull\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#11-youqu-master-detached-head","title":"11. \u5982\u4f55\u4fee\u590d YouQu \u6240\u6709\u5b50\u4ed3\u5e93 master \u5206\u652f\u6e38\u79bb\u5934\uff08detached head\uff09","text":"\u4fee\u590d\u6240\u6709\u5b50\u4ed3\u5e93\u9ed8\u8ba4master \u5206\u652f\u6e38\u79bb\u5934 cd youqu\ngit submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/","title":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212 \u5206\u7c7b\uff1a/ \u67b6\u6784\u5e08\uff1a/ \u76ee\u6807\uff1a \u5e94\u7528 AT \u67b6\u6784\u5de5\u7a0b\u5316\uff0c\u53c2\u8003\u6027\u80fd\u81ea\u52a8\u5316\u5de5\u7a0b\u5b8c\u6210\u5de5\u7a0b\u5316\u6539\u9020\u3002 \u5e94\u7528\u95f4\u7528\u4f8b\u89e3\u8026\uff0c\u89e3\u9664\u6240\u6709\u4ea4\u53c9\u8c03\u7528\u7684\u65b9\u6cd5\uff0c\u5404\u5e94\u7528\u80fd\u8ddf\u968f\u81ea\u8eab\u8fed\u4ee3\u5468\u671f\u72ec\u7acb\u7ef4\u62a4 AT \u7528\u4f8b\u3002 \u5b8c\u6210\u516c\u5171\u65b9\u6cd5\u7684\u62bd\u53d6\u6574\u5408\uff0c\u5f62\u6210\u4e00\u5957\u72ec\u7acb\u4e8e\u5e94\u7528\u95f4\u7684\u516c\u5171\u65b9\u6cd5\u5e93\uff0c\u5404\u5e94\u7528\u65b9\u6cd5\u91cc\u9762\u4e0d\u5b58\u5728\u88ab\u591a\u4e2a\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\u3002 \u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u4e3a\u5c06\u6765\u9002\u914d\u66f4\u591a\u7684 AT \u8fd0\u7528\u573a\u666f\u63d0\u4f9b\u652f\u6491\uff0c\u539f\u5219\u4e0a\u53ef\u5b9e\u73b0\u65e0\u9650\u6269\u5c55\uff0c\u5728\u6bcf\u65e5\u6784\u5efa\u548c\u6301\u7eed\u96c6\u6210\u6d41\u7a0b\u843d\u5730\u4f7f\u7528\u3002 \u4ee3\u7801\u89c4\u8303\u95ee\u9898\u6e05\u96f6\uff0c\u7b26\u5408 Shell Check\u3001Pylint\u3001\u7cfb\u7edf\u90e8\u76f8\u5173\u7f16\u7801\u89c4\u8303\u8981\u6c42\u3002 \u610f\u4e49\uff1a \u7edf\u4e00\u6210\u7814 AT \u67b6\u6784\u8bbe\u8ba1\u601d\u8def\uff0c\u6d88\u9664 AT \u4ee3\u7801\u5b9e\u73b0\u548c\u7ef4\u62a4\u4e0a\u53ef\u80fd\u51fa\u73b0\u7684\u5206\u6b67\uff0c\u6539\u5584\u5386\u53f2 AT \u65e0\u5de5\u7a0b\u5316\u8bbe\u8ba1\u7684\u7f3a\u9677\uff0c\u63d0\u9ad8\u67b6\u6784\u4e13\u4e1a\u6027\u3002 \u5404\u5e94\u7528 AT \u4ee3\u7801\u76f8\u4e92\u72ec\u7acb\uff0c\u5951\u5408\u5e94\u7528\u72ec\u7acb\u53d1\u5e03\u7279\u6027\uff0c\u53ef\u652f\u6301\u8fed\u4ee3\u671f\u95f4\u72ec\u7acb\u65b0\u589e\u3001\u7ef4\u62a4\u548c\u6267\u884c\u3002 \u65b9\u6cd5\u8c03\u7528\u903b\u8f91\u5f97\u5230\u7b80\u5316\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u66f4\u9ad8\u6548\uff1b\u516c\u5171\u5e93\u62bd\u53d6\uff0c\u51cf\u5c11\u65b9\u6cd5\u91cd\u590d\u7f16\u5199\uff0c\u63d0\u9ad8\u4ee3\u7801\u5229\u7528\u7387\uff1b\u5e73\u5747\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u4ece40\u5206\u949f\u964d\u4f4e\u81f330\u5206\u949f\uff0c\u65e5\u4ea7\u51fa\u7528\u4f8b\u4ece12\u6761/\u5929\u63d0\u5347\u81f316\u6761/\u5929\u3002 \u53ef\u7075\u6d3b\u652f\u6491\u4e0d\u540c\u7684\u81ea\u52a8\u5316\u8fd0\u7528\u573a\u666f\uff0c\u5982 CI\u3001\u5192\u70df\u6d4b\u8bd5\u3001\u96c6\u6210\u6d4b\u8bd5\u3001\u56de\u5f52\u6d4b\u8bd5\u3001\u4e13\u9879\u6d4b\u8bd5\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_2","title":"\u4e00\u3001\u80cc\u666f\u4ecb\u7ecd","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1","title":"1\u3001\u73b0\u6709\u67b6\u6784\u4ecb\u7ecd","text":"\u73b0\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u6574\u4f53\u5206\u4e3a\u4e09\u5c42\uff1a\u7528\u4f8b\u5c42\uff08\u4e1a\u52a1\u903b\u8f91\u5c42\uff09\u3001\u4e2d\u95f4\u5c42\uff08\u5143\u7d20\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff09\u3001\u6838\u5fc3\u5c42\uff08\u5e95\u5c42\u529f\u80fd\u5e93\u5c42\uff09\u3002 \u7528\u4f8b\u5c42\uff1a\u5373\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4e13\u6ce8\u4e8e\u4e1a\u52a1\u529f\u80fd\u903b\u8f91\uff0c\u4e0d\u5173\u5fc3\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\uff1b \u4e2d\u95f4\u5c42\uff1a\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff0c\u6bcf\u4e2a\u65b9\u6cd5\u5747\u5bf9\u5e94\u4e00\u4e2a\u5143\u7d20\u7684\u4e00\u4e2a\u5177\u4f53\u64cd\u4f5c\uff0c\u4e5f\u53ef\u4ee5\u662f\u591a\u4e2a\u64cd\u4f5c\u7684\u7ec4\u5408\u64cd\u4f5c\uff0c\u4e2d\u95f4\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u7528\u4f8b\u5c42\uff0c\u5177\u6709\u53ef\u6269\u5c55\u6027\u548c\u590d\u7528\u6027\uff1b \u6838\u5fc3\u5c42\uff1a\u4e3b\u8981\u5c01\u88c5\u7684\u5e95\u5c42\u529f\u80fd\u5b9e\u73b0\uff0c\u6b64\u5c42\u5728\u6846\u67b6\u4e2d\u63d0\u4f9b\u4e00\u4e9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u529f\u80fd\u6a21\u5757\u76f8\u5bf9\u72ec\u7acb\uff0c\u6838\u5fc3\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u64cd\u4f5c\u5c42\uff0c\u6bd4\u5982\uff1a\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7 UI \u5750\u6807\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u952e\u9f20\u64cd\u4f5c\u7684\u57fa\u7840\u65b9\u64cd\u4f5c\u6a21\u5757\u3001Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757\u3001\u6587\u4ef6\u7684\u589e\u5220\u6539\u67e5\u64cd\u4f5c\u6a21\u5757\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2","title":"2\u3001\u81ea\u52a8\u5316\u7684\u5e94\u7528","text":"2.1\u3001CI \u6d41\u7a0b \u6bcf\u65e5\u6784\u5efa\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u7814\u53d1\u6bcf\u65e5\u63d0\u4ea4\u7684\u4ee3\u7801\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u73ed\u4e4b\u540e\u4f1a\u5c06\u5404\u5e94\u7528\u8fdb\u884c\u6253\u5305\uff0c\u7136\u540e\u5728\u6d4b\u8bd5\u673a\u4e0a\u5b89\u88c5\u66f4\u65b0 deb \u5305\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u5e94\u7528\u63d0\u4ea4\u96c6\u6210\u7684\u7248\u672c\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u8f7d\u6700\u65b0\u7684 ISO \u8fdb\u884c PXE \u90e8\u7f72\uff0c\u7136\u540e\u6d4b\u8bd5\u673a\u5b89\u88c5\u6700\u65b0\u7684\u955c\u50cf\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 2.2\u3001\u9a8c\u6536\u6d4b\u8bd5 \u5728\u5404\u9a8c\u6536\u8282\u70b9\u8fdb\u884c\u81ea\u52a8\u5316\u9a8c\u6536\uff0c\u76ee\u524d\u7684\u7b56\u7565\u662f\u5168\u7528\u4f8b\u8986\u76d6\u5168\u67b6\u6784\u3002 2.3\u3001\u56de\u5f52\u6d4b\u8bd5 \u56de\u5f52\u6d4b\u8bd5\u4eca\u5e74\u89c4\u5212\u5efa\u8bbe\u4e2d\uff0c\u65e8\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u6267\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\uff0c\u51cf\u5c11\u529f\u80fd\u6d4b\u8bd5\u7684\u91cd\u590d\u52b3\u52a8\u529b\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3","title":"3\u3001\u5b58\u5728\u7684\u95ee\u9898","text":" \u5404\u5e94\u7528\u4e4b\u95f4\u5b58\u5728\u8026\u5408 \u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u521d\u671f\uff0c\u6240\u6709\u5e94\u7528\u662f\u6574\u4f53\u53d1\u5e03\uff0c\u6211\u4eec\u662f\u5c06\u6240\u6709\u5e94\u7528\u770b\u6210\u662f\u4e00\u4e2a\u6574\u4f53\uff0c\u5404\u5e94\u7528\u4f5c\u4e3a\u5176\u4e2d\u7684\u4e00\u4e2a\u6a21\u5757\uff0c\u6240\u4ee5\u5b58\u5728\u5e94\u7528\u95f4\u65b9\u6cd5\u4ea4\u53c9\u8c03\u7528\u7684\u95ee\u9898\uff0c\u8fd9\u6837\u4ece\u6700\u521d\u7684\u8bbe\u8ba1\u6765\u8bb2\u786e\u5b9e\u80fd\u591f\u51cf\u5c11\u91cd\u590d\u4ee3\u7801\u7684\u7f16\u5199\u3002\u4f46\u662f\u73b0\u5728\u5e94\u7528\u8d70\u72ec\u7acb\u53d1\u5e03\uff0c\u5404\u5e94\u7528\u90fd\u6709\u81ea\u5df1\u7684\u8fed\u4ee3\u8282\u594f\uff0c\u5728\u65b0\u9700\u6c42\u5feb\u901f\u53d8\u5316\u7684\u8fc7\u7a0b\u4e2d\uff0c\u81ea\u52a8\u5316\u7ef4\u62a4\u53d8\u5f97\u5f02\u5e38\u56f0\u96be\uff0c\u539f\u56e0\u5c31\u662f\u81ea\u52a8\u5316\u9879\u76ee\u91cc\u9762\u5404\u4e2a\u5e94\u7528\u7684\u6709\u6bd4\u8f83\u591a\u7684\u8026\u5408\u5173\u7cfb\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u8fdb\u884c\u89e3\u8026\uff0c\u4ee5\u9002\u5e94\u5e94\u7528\u4e0d\u540c\u7684\u8fed\u4ee3\u5468\u671f\u3002 \u65e0\u6cd5\u7cbe\u51c6\u7684\u5212\u5206\u7528\u4f8b\u8303\u56f4 \u7528\u4f8b\u6267\u884c\u7684\u8303\u56f4\u4e0d\u591f\u7cbe\u51c6\uff0c\u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u4e3b\u8981\u901a\u8fc7\u7528\u4f8b\u7684\u5173\u952e\u8bcd core\uff08\u6838\u5fc3\uff09\u6765\u533a\u5206\u7528\u4f8b\u662f\u5426\u4e3a\u6838\u5fc3\u7528\u4f8b\uff0c\u4f46\u662f\u8fd9\u6837\u7684\u533a\u5206\u592a\u5bbd\u6cdb\u4e86\uff0c\u4e0d\u80fd\u9002\u5e94\u81ea\u52a8\u5316\u6d4b\u8bd5\u5728\u591a\u573a\u666f\u4e0b\u7684\u5e94\u7528\u3002\u5f88\u591a\u573a\u666f\u4e0b\u6211\u4eec\u8fd8\u9700\u8981\u6839\u636e\u7528\u4f8b\u7684\u7b49\u7ea7\u3001\u7528\u4f8b\u7684\u7c7b\u578b\u3001\u7528\u4f8b\u6765\u6e90\u7b49\u7b49\uff0c\u4e0d\u540c\u7684\u7ef4\u5ea6\u6765\u6311\u9009\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u5173\u952e\u5b57\u9700\u8981\u4eba\u5de5\u4e00\u6761\u6761\u7684\u6539\uff0c\u8d39\u65f6\u8d39\u529b\uff0c\u800c\u4e14\u4e0d\u597d\u7ef4\u62a4\u3002 \u53d7\u65b0\u9700\u6c42\u5f71\u54cd\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u597d\u7ef4\u62a4 \u76ee\u524d\u9700\u8981\u8df3\u8fc7\u7684\u7528\u4f8b\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684\u7528\u4f8b\u811a\u672c\u91cc\u9762\uff0c\u6dfb\u52a0\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\uff0c\u540e\u7eed\u89e3\u9664\u8df3\u8fc7\u7684\u65f6\u5019\u53c8\u9700\u8981\u627e\u5230\u8fd9\u6761\u811a\u672c\uff0c\u5220\u6389\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\u3002\u5728\u8df3\u8fc7\u7528\u4f8b\u8f83\u591a\u7684\u60c5\u51b5\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u96be\u5ea6\u3002 \u7f16\u5199\u7528\u4f8b\u65f6\u903b\u8f91\u6bd4\u8f83\u590d\u6742\uff0c\u9700\u8981\u8c03\u7528\u591a\u4e2a\u5e94\u7528\u7684\u65b9\u6cd5\u6a21\u5757\u3002 \u6846\u67b6\u6269\u5c55\u6027\u4e0d\u8db3\uff0c\u65e0\u6cd5\u6574\u5408\u6027\u80fd\u81ea\u52a8\u5316\u3001\u538b\u6d4b\u81ea\u52a8\u5316\u3001\u5b89\u5168\u81ea\u52a8\u5316\u7b49\u4e13\u9879\u6d4b\u8bd5\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_3","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u4e3a\u89e3\u51b3\u73b0\u6709\u95ee\u9898\uff0c\u9002\u5e94\u4e0d\u65ad\u4e30\u5bcc\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u66f4\u597d\u7684\u53d1\u6325\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4f5c\u7528\uff0c\u9700\u8981\u5bf9\u81ea\u52a8\u5316\u67b6\u6784\u53ca\u5404\u529f\u80fd\u6a21\u5757\u8fdb\u884c\u91cd\u65b0\u8bbe\u8ba1\u89c4\u5212\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_1","title":"1\u3001\u67b6\u6784\u8bbe\u8ba1","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_1","title":"2\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u6846\u67b6\u7684\u8fd0\u884c\u903b\u8f91\uff1a\u901a\u8fc7\u6838\u5fc3\u5c42\u63d0\u4f9b\u4e00\u4e2a\u57fa\u7840\u80fd\u529b\uff0c\u4e1a\u52a1\u5c42\u6839\u636e\u5b9e\u9645\u4e1a\u52a1\u9700\u6c42\uff08\u6d4b\u8bd5\u7528\u4f8b\uff09\u52a8\u6001\u52a0\u8f7d\u6838\u5fc3\u5c42\uff0c\u6267\u884c\u5165\u53e3\u52a0\u8f7d\u76f8\u5e94\u7684\u7528\u4f8b\u96c6\u5e76\u63a7\u5236\u6267\u884c\uff0c\u5e94\u7528\u5c42\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u9700\u6c42\uff0c\u901a\u8fc7\u76f8\u5e94\u7684\u914d\u7f6e\u9879\u8fdb\u884c\u914d\u7f6e\uff0c\u4ece\u800c\u89e6\u53d1\u81ea\u52a8\u5316\u6d4b\u8bd5\u4efb\u52a1\u3002 \u6838\u5fc3\u5c42\uff1a\u57fa\u672c\u4fdd\u6301\u4e0d\u53d8\uff0c\u90e8\u5206\u6a21\u5757\u4f1a\u6d89\u53ca\u5230\u65b0\u529f\u80fd\u5f00\u53d1\uff0c\u6838\u5fc3\u5c42\u5404\u529f\u80fd\u6a21\u5757\u4fdd\u6301\u72ec\u7acb\u6027\uff0c\u63d0\u4f9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u4f9b\u4e0a\u5c42\u8c03\u7528\uff1b \u5e95\u5c42\u6838\u5fc3\u6a21\u5757\u5305\u62ec\uff1a \u56fe\u50cf\u8bc6\u522b\u6a21\u5757 UI \u5b9a\u4f4d\u6a21\u5757 Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757 \u5c5e\u6027\u5b9a\u4f4d\u6a21\u5757 \u65e5\u5fd7\u6a21\u5757 \u952e\u9f20\u64cd\u4f5c\u6a21\u5757 \u6587\u4ef6\u64cd\u4f5c\u6a21\u5757 \u5f55\u5c4f\u6a21\u5757 \u81ea\u5b9a\u4e49\u65ad\u8a00\u6a21\u5757 \u7528\u4f8b\u6267\u884c\u6a21\u5757 PXE \u88c5\u673a\u6a21\u5757 \u952e\u9f20\u4fe1\u53f7\u6a21\u62df\u6a21\u5757 OCR \u6a21\u5757 \u4e1a\u52a1\u5c42\uff1a\u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e94\u7528\u5185\u5305\u542b\u591a\u4e2a\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5982\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7b49\uff0c\u540e\u7eed\u53ef\u4ee5\u6839\u636e\u9700\u8981\u5ac1\u63a5\u8fdb\u6765\u3002\u5176\u4e2d\u529f\u80fd\u6d4b\u8bd5\u8bbe\u8ba1\u601d\u8def\uff1a \u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e76\u5c06\u6d4b\u8bd5\u6570\u636e\u548c\u6d4b\u8bd5\u8d44\u6e90\u6574\u5408\u8fdb\u6765\uff0c\u589e\u52a0\u7528\u4f8b\u6807\u7b7e csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ed9\u6bcf\u6761\u7528\u4f8b\u6253\u6807\u7b7e\u3002 \u5404\u6807\u7b7e\u6240\u4f7f\u7528\u5bf9\u5e94\u7684\u5b57\u6bb5\u540d\u79f0\uff0c\u4f7f\u7528 csv \u6587\u4ef6\u7ef4\u62a4\u7528\u4f8b\u4e0e\u6807\u7b7e\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u5bf9\u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u53ef\u4ee5\u7ec4\u5408\u5176\u4e2d\u7684\u6807\u7b7e\u800c\u4ece\u9a71\u52a8\u5bf9\u5e94\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\uff0c\u517c\u5bb9\u73b0\u6709\u7528\u4f8b\u6807\u7b7e\uff0c\u4e14\u652f\u6301\u7528\u4f8b\u6807\u7b7e\u53ef\u6269\u5c55\uff1b \u4f7f\u7528 csv \u683c\u5f0f\u6587\u4ef6\u53ef\u4ee5\u65b9\u4fbf\u7684\u4f7f\u7528 Excel \u8868\u683c\u6253\u5f00\u8fdb\u884c\u7f16\u8f91\uff0c\u540c\u65f6\u7531\u4e8e csv \u6587\u4ef6\u5b9e\u9645\u662f\u4ee5\u90fd\u597d\u5206\u9694\u7684\u6587\u672c\u6587\u4ef6\uff0c\u4ee3\u7801\u4e2d\u53ef\u4ee5\u5728\u4e0d\u4f9d\u8d56\u4e09\u65b9\u5e93\u7684\u60c5\u51b5\u4e0b\u65b9\u4fbf\u5feb\u901f\u7684\u89e3\u6790\u5b83\uff0c\u53ef\u64cd\u4f5c\u6027\u548c\u53ef\u7ef4\u62a4\u6027\u8f83\u9ad8\u3002 \u5404\u4e2a\u5e94\u7528\u4e4b\u95f4\uff0c\u7528\u4f8b\u3001\u65b9\u6cd5\u3001\u6807\u7b7e\u548c\u8d44\u6e90\u90fd\u662f\u76f8\u4e92\u72ec\u7acb\u7684\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u7528\u4f8b\u65f6\u53ea\u9700\u8981\u81ea\u5df1\u5e94\u7528\u4e0b\u7684\u65b9\u6cd5\u548c\u516c\u5171\u5e93\u5373\u53ef\u3002 \u7ed3\u6784\u4e3e\u4f8b\uff1a .\n\u251c\u2500\u2500 apps\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_album # \u5e94\u7528\u540d (\u7528\u4e0b\u5212\u7ebf\u8fde\u63a5\u662f Python \u7f16\u7801\u89c4\u8303)\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_assert # \u65ad\u8a00\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_function_tag.csv # \u7528\u4f8b\u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 asan_cases # \u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases # \u529f\u80fd\u6d4b\u8bd5\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 res # \u6d4b\u8bd5\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config # \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_widget # \u5e94\u7528\u81ea\u5df1\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_widget # \u65b9\u6cd5\u57fa\u7c7b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 other_widget # \u8c03\u7528\u5176\u4ed6\u5e94\u7528\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_camera\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases\n\u2502\u00a0\u00a0 \u2502\u00a0 ...\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 public_widget # \u516c\u5171\u65b9\u6cd5\u5e93\n\u251c\u2500\u2500 config # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n...\n config \u914d\u7f6e\u6a21\u5757\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u76f8\u5e94\u914d\u7f6e\uff0c\u6d4b\u8bd5\u540c\u5b66\u53ef\u4ee5\u6839\u636e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5728 config \u91cc\u9762\u8fdb\u884c\u914d\u7f6e\u3002 \u5168\u5c40\u914d\u7f6e\uff1a \u6267\u884c\u4e00\u4e2a\u6216\u591a\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff1a\u5728 pattern \u91cc\u9762\u5199\u5165\u5e94\u7528\u5305\u540d\uff0c\u591a\u4e2a\u5e94\u7528\u4e4b\u95f4\u7528 or \u8fde\u63a5\uff0c\u5982 deepin-music or deepin-movie\uff1b \u5192\u70df\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a smoke\uff1b \u96c6\u6210\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a core \uff1b \u5168\u91cf\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u4e3a\u7a7a\u5373\u53ef\uff1b \u901a\u8fc7 tags \u7684\u914d\u7f6e\u6bd4\u8f83\u7075\u6d3b\uff0c\u540e\u9762\u6807\u7b7e\u5316\u7ba1\u7406\u7ae0\u8282\u4f1a\u8bb2\u5230\uff0c\u652f\u6301\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u7075\u6d3b\u914d\u7f6e\u3002 \u6307\u5b9a\u67d0\u53f0\u673a\u5668\u5728\u6307\u5b9a\u955c\u50cf\u7248\u672c\u4e0a\u6267\u884c\u7528\u4f8b\uff1a\u5728 IP \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a IP\uff0c\u5e76\u5728 URL \u91cc\u9762\u586b\u5165\u955c\u50cf\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u6846\u67b6\u4f1a\u8c03\u7528 PXE \u8fdb\u884c\u81ea\u52a8\u88c5\u673a\uff0c\u88c5\u673a\u5b8c\u4e4b\u540e\u81ea\u52a8\u5f00\u59cb\u6267\u884c\u914d\u7f6e\u7684\u6d4b\u8bd5\u7528\u4f8b\u3002 \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\uff1a \u6bcf\u4e2a\u5e94\u7528\u5185\u90e8\u4f1a\u6709\u4e00\u4e2a\u5355\u72ec\u7684\u914d\u7f6e\u6a21\u5757\uff0c\u4f1a\u5305\u542b\u4e00\u4e9b\u672c\u5e94\u7528\u7684\u6d4b\u8bd5\u8d44\u6e90\u7684\u8def\u5f84\u3001\u6267\u884c\u7528\u4f8b\u7684\u6807\u7b7e\u914d\u7f6e\u7b49\u7b49\uff0c\u5982\u679c\u5728\u5c40\u90e8\u914d\u7f6e\u91cc\u9762\u914d\u7f6e\u4e86\u7528\u4f8b\u6267\u884c\u6807\u7b7e\uff0c\u800c\u5916\u5c42 runner \u51fa\u6ca1\u6709\u6307\u5b9a\u6267\u884c\u6807\u7b7e\uff0c\u5219\u5728\u6267\u884c\u65f6\u53ea\u4f1a\u6267\u884c\u5c40\u90e8\u914d\u7f6e\u5df2\u914d\u7f6e\u7684\uff0c\u82e5\u5916\u5c42 runner \u4e5f\u914d\u7f6e\u4e86\u6267\u884c\u6807\u7b7e\uff0c\u5219\u4f1a\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u7528\u4f8b\u3002 \u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u914d\u7f6e\u90fd\u5728\u540c\u4e00\u4e2a\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\uff0cpy \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684\u7c7b\uff0cini \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684 option\u3002 \u5168\u5c40\u914d\u7f6e\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u7b56\u7565\u5982\u4e0b\uff1a \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5c40\u90e8\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5e94\u7528\u5c42\uff1arunner \u662f\u6d4b\u8bd5\u6267\u884c\u7684\u5165\u53e3\uff0c\u5b83\u4f1a\u6839\u636e\u914d\u7f6e\u91cc\u9762\u7684\u914d\u7f6e\u9879\uff0c\u8fdb\u884c\u7528\u4f8b\u7684\u52a0\u8f7d\u548c\u6267\u884c\u3002\u5b83\u63d0\u4f9b\u63a5\u53e3\u7ed9\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\uff0c\u5e73\u53f0\u4e0a\u7684\u6307\u4ee4\u5b9e\u9645\u4e0a\u90fd\u662f\u901a\u8fc7\u4e0b\u53d1\u7ed9 runner\uff0c\u7136\u540e\u7531 runner \u6765\u6267\u884c\u76f8\u5e94\u7684\u6d4b\u8bd5\u3002 \u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u662f\u4e00\u4e2a\u524d\u7aef\u7cfb\u7edf\uff0c\u53ef\u4ee5\u8fdb\u884c\u6d4b\u8bd5\u673a\u7ba1\u7406\u3001\u81ea\u52a8\u5b89\u88c5\u955c\u50cf\u3001\u81ea\u52a8\u5b89\u88c5\u6307\u5b9a\u5e94\u7528\u7248\u672c\u3001\u8fdb\u884c\u6d4b\u8bd5\u7528\u4f8b\u8303\u56f4\u9009\u62e9\u3001\u7528\u4f8b\u89e6\u53d1\u6267\u884c\u63a7\u5236\u3001\u7ed3\u679c\u5c55\u793a\u8f93\u51fa\u7b49\u3002 \u4e00\u4e2a\u5e94\u7528\u7684\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\u90fd\u53ef\u4ee5\u5355\u72ec\u89e6\u53d1\u3002 \u517c\u5bb9\u6027\u6d4b\u8bd5\u4e3b\u8981\u901a\u8fc7 PXE \u670d\u52a1\u5668\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u88c5\u673a\uff0c\u7136\u540e\u914d\u5408 AT \u8fdb\u884c\u6d4b\u8bd5\uff0c\u53ef\u4ee5\u5b9e\u73b0\u4e0d\u540c\u7cfb\u7edf\u7248\u672c\u3001\u4e0d\u540c\u5e94\u7528\u7248\u672c\u73af\u5883\u4e0a\u90fd\u53ef\u4ee5\u8fdb\u884c\u81ea\u52a8\u5316\u7684 AT \u6267\u884c\uff0c\u63d0\u9ad8\u517c\u5bb9\u6027\u6d4b\u8bd5\u6548\u7387\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_4","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_2","title":"1\u3001\u7528\u4f8b\u89e3\u8026","text":"\u5b58\u5728\u8026\u5408\u5173\u7cfb\u7684\u65b9\u6cd5\uff1a\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u88ab\u5916\u90e8\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\uff0c\u5219\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u8026\u5408\u5173\u7cfb\u3002 1.1\u3001\u901a\u8fc7\u7f16\u8f91\u5668 Find Usages \u67e5\u770b\u6bcf\u4e2a\u65b9\u6cd5\u88ab\u8c03\u7528\u7684\u8def\u5f84\u548c\u88ab\u8c03\u7528\u6b21\u6570\uff1b 1.2\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 1 \u4e2a\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728\u5916\u90e8\u5e94\u7528\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1b 1.3\u3001\u64cd\u4f5c\u5c42\u6587\u4ef6\u540d\u5747\u4ee5 widget \u7ed3\u5c3e\uff0c\u7c7b\u540d\u4ee5 Widget \u7ed3\u5c3e\uff0c\u5982\uff1a\u6587\u4ef6\u540d music_widget.py \uff1a class MusicWidget:\n\"\"\"\u97f3\u4e50\u7684\u64cd\u4f5c\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_2","title":"2\u3001\u516c\u5171\u5e93\u5efa\u8bbe","text":"2.1\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 2 \u4e2a\u53ca\u4ee5\u4e0a\u7684\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728 public_widget \u76ee\u5f55\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1bpublic_widget \u5373\u4e3a\u516c\u5171\u65b9\u6cd5\u5e93\uff1b 2.2\u3001\u5728\u7528\u4f8b\u5c42\u4fee\u6539\u7528\u4f8b\u4e2d\u7c7b\u7684\u5bfc\u5165\u8def\u5f84\uff0c\u5c5e\u4e8e\u516c\u5171\u65b9\u6cd5\u7684\u5219\u8c03\u7528 public_widget \u4e2d\u7684\u7c7b\uff0c\u5916\u90e8\u5e94\u7528\u7684\u64cd\u4f5c\u65b9\u6cd5\uff0c\u5219\u8c03\u7528\u672c\u5e94\u7528\u76ee\u5f55\u4e0b\u91cd\u5199\u7684\u5916\u90e8\u5e94\u7528\u65b9\u6cd5\u3002 \u6bd4\u5982\uff1a\u51e0\u4e4e\u6240\u6709\u591a\u5a92\u4f53\u5e94\u7528\u90fd\u9700\u8981\u901a\u8fc7\u6587\u7ba1\u52a0\u8f7d\u8d44\u6e90\uff0c\u8c03\u8d77\u7684\u6587\u7ba1\u5bf9\u8bdd\u6846\u5b9e\u9645\u4e3a dde-desktop\uff0c\u56e0\u6b64\u5c06 desktop_widget.py \u653e\u5230 public_widget \u91cc\u9762\uff1a class DdeDesktopPublicWidget:\n\"\"\"\u516c\u5171-\u684c\u9762\u7684\u64cd\u4f5c\u65b9\u6cd5\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3_1","title":"3\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406","text":"3.1\u3001\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1a\u5bf9\u5e94 core\u3001smoke\uff0c\u6216\u4e3a\u7a7a\uff1b \u7528\u4f8b\u6765\u6e90\uff1a\u5bf9\u5e94 PMS \u7528\u4f8b\u6765\u6e90\uff0c\u5206\u522b\u7528 acp1\u3001acp2\u3001acp3\u3001acp4 \u8868\u793a\u3002 acp1 \uff1a\u4e1a\u52a1\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5199\u7684\u7528\u4f8b\uff0c\u88ab\u7528\u4e8e\u9a8c\u6536\u6d4b\u8bd5\u7684\uff1b acp2 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5f15\u5165\u7684\u4ea7\u54c1\u9a8c\u6536\u6d4b\u8bc4\u90e8\u7684\u7528\u4f8b\uff1b acp3 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u6839\u636e\u4ea7\u54c1\u9700\u6c42\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\uff1b acp4 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u901a\u8fc7\u793e\u533a\u3001\u8bba\u575b\u7528\u6237\u53cd\u9988\u95ee\u9898\u603b\u7ed3\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\u3002 \u4e3e\u4f8b\uff1a \u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u7528\u4f8b\u6765\u6e90 001 L1 core acp1 \u6807\u7b7e\u91c7\u7528\u679a\u4e3e\u7684\u65b9\u5f0f\u8fdb\u884c\u4ee3\u53f7\u7ba1\u7406\u65b9\u4fbf\u7ba1\u7406\u4ee5\u53ca\u540e\u7eed\u6269\u5c55\u3002 3.2\u3001\u5728\u6bcf\u4e2a\u5e94\u7528\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u7b2c\u4e00\u5217\u4e3a\u7528\u4f8b\u7684 ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ba1\u7406\u6a21\u5757\u5185\u7684\u7528\u4f8b\u6807\u7b7e\u3002\u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 3.3\u3001\u5bf9\u7167 PMS \u4e0a\u7528\u4f8b\u7b49\u7ea7\u3001\u7528\u4f8b\u7c7b\u578b\u548c\u7528\u4f8b\u6765\u6e90\uff0c\u6807\u8bb0\u6240\u6709\u5df2\u5b9e\u73b0\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u540e\u7eed\u7f16\u5199\u65b0\u589e\u81ea\u52a8\u5316\u7528\u4f8b\u65f6\uff0c\u6bcf\u5199\u4e00\u6761\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684 csv \u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u6b64\u6761\u7528\u4f8b\u7684\u6807\u7b7e\u3002 3.4\u3001\u8df3\u8fc7\u7528\u4f8b\u6807\u7b7e\u5316 \u73b0\u6709\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a\uff1a \u4e3e\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u8bb0\u4e3a \u201cskip-\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u8bb0\uff0c\u5982\u679c\u5df2\u7ecf\u6807\u8bb0\u4e86\u8df3\u8fc7\u539f\u56e0\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u8bb0\u4e3a SKIPED\uff0c\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\u3002 \u6240\u6709\u7684\u6807\u7b7e\u5728 docs \u76ee\u5f55\u4e0b\u4f1a\u6709\u4e00\u4e2a\u6587\u6863\uff0c\u6587\u6863\u6682\u5b9a\u540d\u79f0\u4e3a\uff1atags_info.md\uff0c\u7528\u4e8e\u8bf4\u660e\u73b0\u5728\u5df2\u7ecf\u4f7f\u7528\u5230\u7684\u6807\u7b7e\uff0c\u4ee5\u53ca\u8fd9\u4e9b\u6807\u7b7e\u7684\u89e3\u91ca\u548c\u7528\u6cd5\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#4","title":"4\u3001\u7528\u4f8b\u6267\u884c","text":"4.1\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u7684\u9a71\u52a8\u6267\u884c\u903b\u8f91\u529f\u80fd\u5b9e\u73b0 \u5f00\u53d1\u6839\u636e\u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\u91cc\u9762\u7684\u7528\u4f8b\u6807\u7b7e\u6267\u884c\u5bf9\u5e94\u7528\u4f8b\u7684\u529f\u80fd\uff0c\u80fd\u652f\u6301\u591a\u4e2a\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u6267\u884c\u5165\u53e3\u80fd\u968f\u610f\u901a\u8fc7\u7528\u4f8b\u6807\u7b7e\u6307\u5b9a\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002 \u7528\u4f8b\u6807\u7b7e\u7684\u9a71\u52a8\u65b9\u5f0f\u5fc5\u987b\u80fd\u652f\u6301\u6807\u7b7e\u7684\u6269\u5c55\uff0c\u672a\u6765\u968f\u7740\u4e1a\u52a1\u7684\u53d8\u5316\u53ef\u80fd\u9700\u8981\u589e\u52a0\u5404\u79cd\u5404\u6837\u7684\u6807\u7b7e\u3002 4.2\u3001\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u6267\u884c \u529f\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u3001\u6027\u80fd\u6d4b\u8bd5\u7b49\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u662f\u5206\u5f00\u6267\u884c\u7684\uff0c\u4e5f\u5c31\u662f\u5728\u4e00\u6b21\u6267\u884c\u4e2d\uff0c\u53ea\u80fd\u6267\u884c\u5176\u4e2d\u4e00\u79cd\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5177\u4f53\u8981\u6267\u884c\u54ea\u4e00\u79cd\u540c\u6837\u901a\u8fc7\u53c2\u6570\u6765\u63a7\u5236\u3002 4.3\u3001\u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c \u7531\u4e8e\u6d4b\u8bd5\u673a\u8d44\u6e90\u6709\u9650\uff0c\u968f\u7740\u81ea\u52a8\u5316\u7528\u4f8b\u6570\u91cf\u7684\u589e\u52a0\uff0cCI \u6267\u884c\u65f6\u95f4\u4f1a\u8d8a\u6765\u8d8a\u957f\u3002 \u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c\u7684\u529f\u80fd\uff1a \u540c\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\u5206\u6563\u5230\u4e0d\u540c\u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u4e0a\u6267\u884c\uff0c\u7f29\u77ed\u6267\u884c\u603b\u65f6\u95f4\uff1b \u7b2c\u4e8c\u5929\u8dd1\u7684\u65f6\u5019\u540c\u4e00\u4e2a\u673a\u5668\u4e0a\u4f1a\u6267\u884c\u6628\u5929\u6ca1\u6709\u6267\u884c\u5230\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u6267\u884c\u540c\u7406\uff1b \u53ef\u4ee5\u5b9e\u73b0\u5728\u5168\u67b6\u6784\u6d4b\u8bd5\u673a\u4e0a\u8f6e\u6d41\u6267\u884c\u7528\u4f8b\uff0c\u65e2\u80fd\u4fdd\u8bc1\u6267\u884c\u4e86\u6240\u6709\u7684\u7528\u4f8b\uff0c\u53c8\u80fd\u5728\u8d44\u6e90\u6709\u9650\u7684\u60c5\u51b5\u4e0b\u8986\u76d6\u4e86\u6240\u6709\u7684\u67b6\u6784\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#5","title":"5\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0","text":"5.1\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u4f5c\u4e3a\u524d\u7aef\u754c\u9762\u7cfb\u7edf\uff0c\u901a\u8fc7\u9875\u9762\u4e0a\u7684\u4e00\u4e9b\u529f\u80fd\u9009\u9879\u8fdb\u884c\u5bf9\u5e94\u6d4b\u8bd5\u4efb\u52a1\u7684\u7ba1\u7406\u6216\u89e6\u53d1\uff0c\u4e1a\u5185\u6bd4\u8f83\u6d41\u884c\u7684\u5b9e\u73b0\u65b9\u6848\u662f\u4f7f\u7528 Vue + DRF \u5b9e\u73b0\u4e00\u4e2a\u524d\u540e\u7aef\u5206\u79bb\u7684\u7cfb\u7edf\u3002 \u6d4b\u8bd5\u5e73\u53f0\u53ef\u80fd\u4f1a\u6d89\u53ca\u5230\u7684\u6a21\u5757\u6709\uff1a\u6d4b\u8bd5\u673a\u8d44\u6e90\u7ba1\u7406\u6a21\u5757\u3001\u7528\u4f8b\u6267\u884c\u63a7\u5236\u6a21\u5757\u3001\u7ed3\u679c\u5c55\u793a\u6a21\u5757\u3001PXE \u955c\u50cf\u5b89\u88c5\u6a21\u5757\u7b49\u3002 \u7528\u6237\uff08\u6d4b\u8bd5\u3001\u7814\u53d1\u540c\u5b66\u7b49\uff09\u53ef\u4ee5\u914d\u7f6e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5982\u6267\u884c\u54ea\u4e2a\u5e94\u7528\u3001\u6267\u884c\u7528\u4f8b\u7684\u8303\u56f4\u3001\u5728\u54ea\u53f0\u673a\u5668\u4e0a\u6267\u884c\u3001\u955c\u50cf\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u5e94\u7528\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u6267\u884c\u65f6\u95f4\u3002 5.2\u3001\u6267\u884c\u5165\u53e3 runner \u63d0\u4f9b\u7ed9\u6d4b\u8bd5\u5e73\u53f0\u7684\u63a5\u53e3\u5305\u62ec\uff1a\u7528\u4f8b\u6267\u884c\u63a5\u53e3\u3001\u7ed3\u679c\u8fd4\u56de\u63a5\u53e3\u3001\u955c\u50cf\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u955c\u50cf\u5b89\u88c5\u63a5\u53e3\u3001\u5e94\u7528\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u5e94\u7528\u5b89\u88c5\u66f4\u65b0\u63a5\u53e3\u7b49\u3002 \u524d\u7aef\u5e73\u53f0\u76ee\u524d\u8fd8\u6ca1\u6709\u592a\u591a\u8be6\u7ec6\u7684\u65b9\u6848\uff0c\u672c\u6b21\u8bbe\u8ba1\u4e3b\u8981\u96c6\u4e2d\u5728\u540e\u7aef\u8fd9\u90e8\u5206\u67b6\u6784\u7684\u8bbe\u8ba1\u4e0a\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_5","title":"\u56db\u3001\u5b9e\u65bd\u8ba1\u5212","text":"\u8fd1\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u6587\u7ba1\u4ee3\u7801\u89e3\u8026 2022/3/28 2022/4/8 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u56fe\u5f62\u56fe\u50cf\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u97f3\u89c6\u9891\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5168\u5c40\u641c\u7d22\u4ee3\u7801\u89e3\u8026 2022/4/25 2022/4/26 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u516c\u5171\u5e93\u5efa\u8bbe 2022/4/27 2022/5/5 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5c01\u88c5\u7684\u65b9\u6cd5\u6574\u7406\u6210\u4e00\u4e2a\u8868 2022/5/6 2022/5/10 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7528\u4f8b\u6807\u7b7e\u5206\u7c7b\u8bc4\u4f30 2022/5/11 2022/5/11 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u6807\u7b7e\u5316\u6267\u884c\u9a71\u52a8\u7a0b\u5e8f\u7f16\u5199 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u9700\u5b9e\u73b0\u81ea\u52a8\u89e3\u6790 csv \u8868\u683c\u4e2d\u7684\u7528\u4f8b\u7f16\u53f7 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u722c\u866b\u811a\u672c\uff0c\u722c\u53d6 pms \u4e0a\u7528\u4f8b\u7684\u6807\u7b7e 2022/5/11 2022/5/13 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u5b9a\u65f6\u81ea\u52a8\u7ef4\u62a4\u672c\u5730 csv \u6587\u4ef6\u811a\u672c 2022/5/11 2022/5/20 \u4e2d\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u76ee\u5f55\u7ed3\u6784\u8c03\u6574 2022/5/20 2022/6/2 \u5b8c\u6210\u5168\u5c40\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u5177\u4f53\u65b9\u6848\u548c\u903b\u8f91\u5b9e\u73b0 2022/6/6 2022/6/17 \u9759\u6001\u626b\u63cf\u95ee\u9898\u6e05\u96f6 2022/6/20 2022/7/1 \u5b8c\u6210\u65b0\u6846\u67b6\u4f7f\u7528\u57f9\u8bad 2022/7/4 2022/7/11 \u843d\u5730\u8fd0\u884c 2022/7/12 2022/7/20 \u5e95\u5c42\u5e93\u7528\u9014\u8bf4\u660e\u6587\u6863\u7f16\u5199 2022/7/21 2022/7/28"}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\u200b\\u3000\\-\u3001\u3002\uff0c\uff0e\uff1f\uff01\uff1b]+","pipeline":["stemmer"]},"docs":[{"location":"","title":"\u9996\u9875","text":""},{"location":"#youqu","title":"\u6709\u8da3\uff08YouQu\uff09","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/4/1\n# Author : Mikigo\n# =============================================\n \u672c\u7ad9\u603b\u8bbf\u95ee\u91cf \u6b21 \u6b22\u8fce\u5728\u6d4f\u89c8\u5668\u8bbf\u95ee\u3010\u516c\u7f51\u6587\u6863\u3011 \u7edf\u4fe1\u516c\u53f8\u5185\u7f51\u8fd8\u53ef\u4ee5\u8bbf\u95ee\u3010\u5185\u7f51\u6587\u6863\u3011\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u54e6~~"},{"location":"#_1","title":"\u4e00\u3001\u7b80\u4ecb","text":"\u6709\u8da3\uff08YouQu\uff09\u662f\u6df1\u5ea6\u79d1\u6280\u8bbe\u8ba1\u548c\u5f00\u53d1\u7684\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff0c\u91c7\u7528\u7ed3\u6784\u5206\u5c42\u7684\u8bbe\u8ba1\u7406\u5ff5\uff0c\u652f\u6301\u591a\u5143\u5316\u5143\u7d20\u5b9a\u4f4d\u548c\u65ad\u8a00\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\u3001\u5f3a\u5927\u7684\u65e5\u5fd7\u548c\u62a5\u544a\u8f93\u51fa\u7b49\u7279\u8272\u529f\u80fd\uff0c\u540c\u65f6\u5b8c\u7f8e\u517c\u5bb9X11\u3001Wayland\u663e\u793a\u534f\u8bae\uff0c\u73af\u5883\u90e8\u7f72\u7b80\u5355\uff0c\u64cd\u4f5c\u6613\u4e0a\u624b\u3002"},{"location":"#17","title":"\u7231\u4e0a \u201c\u6709\u8da3\u201d \u7684 17 \u4e2a\u7406\u7531","text":" \u6838\u5fc3\u5e93\u63d0\u4f9b\u4e86\u7edf\u4e00\u7684\u63a5\u53e3\uff0c\u7f16\u5199\u65b9\u6cd5\u65f6\u53ea\u9700\u8981\u5bfc\u5165\u4e00\u4e2a\u5305\u5c31\u53ef\u4ee5\u4f7f\u7528\u5230\u6838\u5fc3\u5e93\u63d0\u4f9b\u7684\u6240\u6709\u529f\u80fd\uff1b \u516c\u5171\u5e93\u5c01\u88c5\u4e86\u5f88\u591a\u5e38\u7528\u6a21\u5757\u7684\u76f8\u5173\u65b9\u6cd5\uff0c\u6bd4\u5982\uff1a\u4efb\u52a1\u680f\u7684\u64cd\u4f5c\u3001\u684c\u9762\u7684\u64cd\u4f5c\u3001\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\u7b49\u7b49\uff1b \u9664\u4e86\u5e38\u7528\u7684\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u8bc6\u522b\u4ee5\u5916\uff0c\u6211\u4eec\u8fd8\u63d0\u4f9b\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u5176\u4f7f\u7528\u7b80\u5355\u4e14\u9ad8\u6548\uff0c\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff1b \u5bf9\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u5c06\u7f16\u5199\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u53d8\u5f97\u7b80\u5355\u800c\u4f18\u96c5\uff1b \u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u6280\u672f\u8fdb\u884c\u529f\u80fd\u5347\u7ea7\uff0c\u9664\u4e86\u652f\u6301\u5355\u4e2a\u5750\u6807\u8fd4\u56de\uff0c\u8fd8\u652f\u6301\u540c\u4e00\u754c\u9762\u4e0b\u591a\u4e2a\u76f8\u540c\u5143\u7d20\u8fd4\u56de\u591a\u4e2a\u5750\u6807\u7684\u529f\u80fd\uff1b \u63d0\u4f9b\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u548c\u6279\u91cf\u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u4e0d\u5230\u4e00\u4e2a csv \u6587\u4ef6\u539f\u6765\u80fd\u5e72\u8fd9\u4e48\u591a\u4e8b\u60c5\uff1b \u63d0\u4f9b\u4e86\u529f\u80fd\u5f3a\u5927\u7684\u6267\u884c\u5668\u5165\u53e3\uff0c\u8ba9\u4f60\u53ef\u4ee5\u65b9\u4fbf\u7684\u5728\u672c\u5730\u6267\u884c\u4efb\u4f55\u7528\u4f8b\u96c6\u7684\u7528\u4f8b\uff0c\u5176\u4e30\u5bcc\u7684\u81ea\u5b9a\u4e49\u914d\u7f6e\u9879\uff0c\u6ee1\u8db3\u4f60\u5bf9\u6267\u884c\u5668\u6240\u6709\u7684\u5e7b\u60f3\uff1b \u63d0\u4f9b\u8fdc\u7a0b\u6267\u884c\u7684\u529f\u80fd\uff0c\u53ef\u4ee5\u63a7\u5236\u591a\u53f0\u673a\u5668\u5e76\u884c\u8dd1\uff0c\u6216\u8005\u5206\u5e03\u5f0f\u8dd1\uff0c\u8fd9\u79cd\u4ed8\u8d39\u529f\u80fd\u73b0\u5728\u514d\u8d39\u7ed9\u4f60\u7528\uff1b \u63d0\u4f9b\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u529f\u80fd\uff0c\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u6bcf\u4e2a\u65b9\u6cd5\u5355\u72ec\u5199\u8f93\u51fa\u65e5\u5fd7\u7684\u4ee3\u7801\uff0c\u4e00\u5207\u6211\u4eec\u7ed9\u4f60\u641e\u5b9a\u4e86\uff0c\u65e5\u5fd7\u8f93\u51fa\u4e0d\u4ec5\u5185\u5bb9\u4e30\u5bcc\uff0c\u989c\u503c\u4e5f\u7edd\u5bf9\u5728\u7ebf\uff0c\u6211\u4eec\u8fd8\u81ea\u5df1\u8bbe\u8ba1\u4e86\u4e00\u6b3e\u7ec8\u7aef\u8f93\u51fa\u4e3b\u9898\u53eb\u300a\u4e94\u5f69\u6591\u6593\u7684\u9ed1\u300b\uff1b \u63d0\u4f9b\u4e86\u4e00\u952e\u90e8\u7f72\u81ea\u52a8\u5316\u6d4b\u8bd5\u73af\u5883\u7684\u529f\u80fd\uff0c\u8fde\u4ee3\u7801\u7f16\u8f91\u5668\u90fd\u7ed9\u4f60\u88c5\u597d\u4e86\uff0c\u8ba9\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u73af\u5883\u90e8\u7f72\u800c\u70e6\u607c\uff1b \u63d0\u4f9b\u4e86\u81ea\u52a8\u751f\u6210\u591a\u79cd\u62a5\u544a\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u8f93\u51fa\u4ec0\u4e48\u62a5\u544a\u5f62\u5f0f\u90fd\u884c\uff0c\u800c\u4e14\u6211\u4eec\u5728\u62a5\u544a\u4e2d\u8fd8\u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\u548c\u5931\u8d25\u622a\u56fe\u7684\u529f\u80fd\uff1b \u5bf9\u65ad\u8a00\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u63d0\u4f9b\u66f4\u53cb\u597d\u5316\u7684\u9519\u8bef\u63d0\u793a\uff0c\u8ba9\u5b9a\u4f4d\u95ee\u9898\u7cbe\u51c6\u9ad8\u6548\uff1b \u4e0d\u4ec5\u652f\u6301\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u63a7\u5236\uff0c\u800c\u4e14\u8fd8\u652f\u6301\u52a8\u6001\u63a7\u5236\u7528\u4f8b\u6279\u91cf\u6267\u884c\u7684\u603b\u65f6\u95f4\uff0c\u786e\u4fdd CI \u73af\u5883\u4e0b\u80fd\u987a\u7545\u8fd0\u884c\uff1b \u652f\u6301\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\u6267\u884c\u3001PMS \u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6807\u7b7e\u5316\u6267\u884c\u65b9\u6848\uff0c\u6ee1\u8db3\u4f60\u5404\u79cd\u573a\u666f\u4e0b\u7684\u6267\u884c\u9700\u6c42\uff1b \u652f\u6301\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u529f\u80fd\uff0c\u53ef\u5b9a\u4f4d\u53ef\u65ad\u8a00\uff0c\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\uff1b \u5b8c\u7f8e\u517c\u5bb9 Wayland \u548c X11\uff0c\u771f\u6b63\u505a\u5230\u4e00\u5957\u4ee3\u7801\uff0c\u968f\u5904\u6267\u884c\uff1b \u652f\u6301\u591a\u79cd\u65b9\u5f0f\u7684\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u5176\u4e2d\u5f02\u6b65\u56de\u586b\u7684\u65b9\u6848\uff0c\u5b8c\u7f8e\u89e3\u51b3\u4e86\u6570\u636e\u56de\u586b\u7684\u8017\u65f6\u95ee\u9898\uff1b \u3010\u89c6\u9891\u4ecb\u7ecd\u3011"},{"location":"#_2","title":"\u4e8c\u3001\u5b89\u88c5\u4f7f\u7528","text":"\u57fa\u7840\u6846\u67b6\uff1ahttps://github.com/linuxdeepin/deepin-autotest-framework \u4ece PyPI \u5b89\u88c5: sudo pip3 install youqu\n \u521b\u5efa\u9879\u76ee: youqu-startproject youqu\n \u5b89\u88c5\u4f9d\u8d56: cd youqu\nbash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002 \u5e94\u7528\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684\u5e94\u7528\u540d\u79f0\u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music cd apps/\n \u5c06\u5e94\u7528\u5e93\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u50cf\u8fd9\u6837\uff1a youqu\n\u251c\u2500\u2500 apps\n\u2502 \u251c\u2500\u2500 autotest_deepin_music # \u5e94\u7528\u5e93\n...\n \u5e94\u7528\u5e93\u7684\u540d\u79f0\u4e0d\u53ef\u4ee5\u4fee\u6539\u3002"},{"location":"#_3","title":"\u4e09\u3001\u8fd0\u884c","text":""},{"location":"#1","title":"1. \u5de5\u4f5c\u7a7a\u95f4","text":"\u57fa\u7840\u6846\u67b6\u5de5\u7a0b\u76ee\u5f55\u5efa\u8bae\u653e\u5728 ~ \u76ee\u5f55\u4e0b\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u4e5f\u53ef\u4ee5\u8fd0\u884c\uff0c\u4f46\u662f\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u9700\u8981\u505a\u73af\u5883\u6e05\u7406\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u5b58\u5728\u4ee3\u7801\u88ab\u5220\u9664\u7684\u98ce\u9669\u3002 \u5982\u679c\u4f60\u7684\u673a\u5668\u4e0a\u4e0d\u540c\u76ee\u5f55\u4e0b\u5b58\u5728\u591a\u4e2a YouQu \u5de5\u7a0b\uff0c\u90a3\u4e48\u5728\u8fd0\u884c\u4e4b\u524d\uff0c\u8bf7\u5148\u6267\u884c env.sh \u6821\u6b63\u76f8\u5173\u73af\u5883\u3002"},{"location":"#2","title":"2. \u6267\u884c\u5668","text":"\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u6709\u4e00\u4e2a manage.py \uff0c\u5b83\u662f\u4e00\u4e2a\u6267\u884c\u5668\u5165\u53e3\uff0c\u63d0\u4f9b\u4e86\u672c\u5730\u6267\u884c\u3001\u8fdc\u7a0b\u6267\u884c\u7b49\u7684\u529f\u80fd\u3002 \u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6765\u6267\u884c\uff1a youqu manage.py run -a deepin-music\n"},{"location":"#21","title":"2.1. \u672c\u5730\u6267\u884c","text":"youqu manage.py run\n"},{"location":"#211","title":"2.1.1. \u914d\u7f6e\u6587\u4ef6","text":"\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u914d\u7f6e\u53c2\u6570 \u5728\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u91cc\u9762\u652f\u6301\u914d\u7f6e\u5bf9\u6267\u884c\u7684\u4e00\u4e9b\u53c2\u6570\u8fdb\u884c\u914d\u7f6e\uff0c\u5e38\u7528\u7684\u5982\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;-----------------------------------------------\n;1.KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2.KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f\n;e.g. TAGS = L1 or smoke\n;-----------------------------------------------\n;\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\uff0c\u5c06\u8981\u6267\u884c\u7684\u7528\u4f8b\u5199\u5165\u6307\u5b9a\u7684 csv \u6587\u4ef6\n;\u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u4ece\u57fa\u7840\u6846\u67b6\u6839\u76ee\u5f55\u5f00\u59cb\uff1ae.g. CASE_FILE = case_list.txt\n;\u5982\u679c\u8fd9\u91cc\u6709\u503c\uff0cAPP_NAME KEYWORDS TAGS \u7684\u914d\u7f6e\u5747\u4e0d\u751f\u6548\nCASE_FILE =\n;=============================== RUNNER CONFIG ===================================\n[runner]\n;\u6700\u5927\u5931\u8d25\u7528\u4f8b\u6570\u91cf\u7684\u5360\u6bd4\n;\u6bd4\u5982\uff1a\u603b\u6267\u884c\u7528\u4f8b\u6570\u4e3a 100, \u82e5 MAX_FAIL = 0.5,\u5219\u5931\u8d25\u7528\u4f8b\u6570\u8fbe\u5230 50 \u5c31\u4f1a\u7ec8\u6b62\u6d4b\u8bd5\u3002\nMAX_FAIL = 1\n;\u5355\u6761\u7528\u4f8b\u7684\u8d85\u65f6\u65f6\u95f4\uff0c\u5982\u679c\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u8d85\u65f6\uff0c\u8fd9\u6761\u7528\u4f8b\u4f1a\u88ab\u505c\u6b62\uff0c\u540e\u7eed\u7528\u4f8b\u7ee7\u7eed\u6267\u884c\u3002\n;\u5355\u4f4d\u4e3a\u79d2\n;\u8fd9\u662f\u4e00\u4e2a\u5168\u5c40\u7edf\u4e00\u914d\u7f6e\uff0c\u5982\u679c\u67d0\u6761\u7528\u4f8b\u9700\u8981\u5355\u72ec\u914d\u7f6e\u8d85\u65f6\u65f6\u95f4\uff0c\u53ef\u4ee5\u5728\u7528\u4f8b\u4e2d\u8fd9\u6837\u5199\uff1a\n;@pytest.mark.timeout(500)\n;def test_xxx_001():\n; ...\n;\u4f1a\u8bdd\u8d85\u65f6\uff08\u6240\u6709\u7528\u4f8b\u6267\u884c\u7684\u8d85\u65f6\u65f6\u95f4\uff09\u662f\u6839\u636e\u5168\u5c40\u8d85\u65f6\u914d\u7f6e\u548c\u7528\u4f8b\u5355\u72ec\u8d85\u65f6\u914d\u7f6e\u81ea\u52a8\u8ba1\u7b97\u7684\u3002\nCASE_TIME_OUT = 200\n;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\n;\u6ce8\u610f\uff0cRERUN = 1 \u8868\u793a\u91cd\u8dd1 1 \u6b21\uff0c\u5373\u7b2c\u4e00\u6b21\u7528\u4f8b\u6267\u884c\u5931\u8d25\u4f1a\u81ea\u52a8\u91cd\u8dd1 1 \u6b21\uff0c\u603b\u5171\u6267\u884c 2 \u6b21\uff1b\n;\u5982\u679c\u7b2c 2 \u6b21\u6267\u884c\u6210\u529f\uff0c\u7ed3\u679c\u6210\u529f\uff0c\u5931\u8d25\u4ea6\u4e3a\u5931\u8d25\u3002\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c 1 \u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff0cRERUN >= RECORD_FAILED_CASE\u3002\n;1.\u5173\u95ed\u5f55\u5c4f\uff1aRECORD_FAILED_CASE > RERUN\n;2.\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1aRECORD_FAILED_CASE = 0\nRECORD_FAILED_CASE = 1\n;yes \u6bcf\u6761\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u8fdb\u884c\u73af\u5883\u6e05\u7406\nCLEAN_ALL = yes\n;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387, \u6bd4\u5982\uff1a1920x1080\n;no: \u8868\u793a\u4e0d\u505a\u5206\u8fa8\u7387\u6821\u9a8c\nRESOLUTION = 1920x1080\n;\u4e0d\u8df3\u8fc7\u7528\u4f8b\uff0ccsv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86 skip-xxx\u7684\u7528\u4f8b\u4e0d\u8df3\u8fc7\nNOSKIP = no\n;ignore fixed\n;no\uff0c\u53ea\u8981\u6807\u8bb0\u4e86fixed\u7684\u7528\u4f8b\uff0c\u5373\u4f7f\u6807\u8bb0\u4e86skip-\uff0c\u4e5f\u4f1a\u6267\u884c\uff1b\n;yes\uff0cfixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\uff1b\nIFIXED = no\n;\u8981\u5b89\u88c5deb\u5305\u7684\u8def\u5f84\n;e.g : ~/Downloads/ \u5b89\u88c5\u4e0b\u8f7d\u76ee\u5f55\u4e0b\u7684deb\u5305\uff0c\u5982\u679c\u662f\u8fdc\u7a0b\u6267\u884c\uff0c\u4f1a\u81ea\u52a8\u62f7\u8d1d\u5230\u8fdc\u7a0b\u5e76\u5b89\u88c5\u3002\nDEB_PATH =\n;DEBUG \u6a21\u5f0f\u6267\u884c\u7528\u4f8b\uff0c\u53ea\u6536\u96c6\u4e0d\u6267\u884c\u7528\u4f8b\uff0c\u4e5f\u4e0d\u505a\u8bbe\u5907\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002\nDEBUG = no\n;\u8bb0\u5f55top\u547d\u4ee4\u67e5\u8be2\u7684\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0cTOP = 3 \u8868\u793a\u8bb0\u5f55\u524d3\u4e2a\u8fdb\u7a0b\u3002\nTOP =\n;\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\nREPEAT =\n;\u9ed8\u8ba4\u5728\u6240\u6709\u6d4b\u8bd5\u5b8c\u6210\u4e4b\u540e\u8f93\u51fa\u62a5\u9519\u4fe1\u606f.\n;yes, \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\nDURING_FAIL = no\n;\u6ce8\u518c\u81ea\u542f\u670d\u52a1\nAUTOSTART = no\n;=============================== REPORT CONFIG ===================================\n[report]\n;\u6d4b\u8bd5\u62a5\u544a\u7684title\nREPORT_TITLE = YouQu Report\n;\u6d4b\u8bd5\u62a5\u544a\u7684name\nREPORT_NAME = YouQu Report\n;\u6d4b\u8bd5\u62a5\u544a\u7684\u9ed8\u8ba4\u8bed\u8a00\n;en:English\n;ru:\u0420\u0443\u0441\u0441\u043a\u0438\u0439\n;zh:\u4e2d\u6587\n;de:Deutsch\n;nl:Nederlands\n;he:Hebrew\n;br:Brazil\n;pl:Polski\n;ja:\u65e5\u672c\u8a9e\n;es:Espa\u00f1ol\n;kr:\ud55c\uad6d\uc5b4\n;fr:Fran\u00e7ais\n;az:Az\u0259rbaycanca\nREPORT_LANGUAGE = zh\n;\u7528\u4f8b\u6267\u884c\u5b8c\u540e\u751f\u6210\u7684\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n;\u76ee\u524d\u652f\u6301 allure, xml, json \uff08\u652f\u6301\u540c\u65f6\u751f\u6210\uff09\nREPORT_FORMAT = allure, xml, json\n;\u6307\u5b9a\u62a5\u544a\u751f\u6210\u7684\u8def\u5f84\uff08\u76f8\u5bf9\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\uff09\nALLURE_REPORT_PATH = report/\nXML_REPORT_PATH = report/\nJSON_REPORT_PATH = report/\n;=============================== GLOBAL CONFIG ===================================\n[globalconfig]\n;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\nPASSWORD = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\nIMAGE_MATCH_NUMBER = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6bcf\u6b21\u95f4\u9694\u7b49\u5f85\u65f6\u95f4\nIMAGE_MATCH_WAIT_TIME = 1\n;\u56fe\u50cf\u8bc6\u522b\u5339\u914d\u5ea6\nIMAGE_RATE = 0.9\n;\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u5b9e\u65f6\u56fe\u50cf\u4fdd\u5b58\u8def\u5f84\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u5750\u6807\nSCREEN_CACHE = /tmp/screen.png\n;\u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\u7684\u8def\u5f84\nTMPDIR = /tmp/tmpdir\n;\u7cfb\u7edf\u4e3b\u9898\nSYS_THEME = deepin\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = youqu-dev.uniontech.com\n;OpenCV\u670d\u52a1\u7aef\u5730\u5740\nOPENCV_SERVER_HOST = youqu-dev.uniontech.com\n;=============================== PMS CONFIG ===================================\n;PMS\u76f8\u5173\u914d\u7f6e\uff0c\u5305\u542b\u4ee5\u4e0b\u51e0\u4e2a\u65b9\u9762\uff1a\n;1.PMS\u6d4b\u8bd5\u5957\u6267\u884c\n;2.\u81ea\u52a8\u4ecePMS\u722c\u53d6\u6570\u636e\u5e76\u540c\u6b65\u672c\u5730CSV\u6587\u4ef6\n;3.PMS\u6570\u636e\u56de\u586b\n[pms]\n;PMS\u7684\u7528\u6237\u540d,\u5982: ut001234\nPMS_USER =\n;PMS\u7684\u5bc6\u7801\nPMS_PASSWORD =\n;PMS\u6d4b\u8bd5\u5957\u7684ID\n;\u5728PMS\u4e0a\u67e5\u770b\u7528\u4f8b\u201c\u5957\u4ef6\u201d\u94fe\u63a5: https://pms.uniontech.com/testsuite-view-495.html\n;\u6d4b\u8bd5\u5957ID\u4e3a: 495\nSUITE_ID =\n;\u6570\u636e\u56de\u586b\u5fc5\u987b\u5173\u8054PMS\u6d4b\u8bd5\u5355\n;\u5728PMS\u4e0a\u67e5\u770b\u6d4b\u8bd5\u5355\u94fe\u63a5: https://pms.uniontech.com/testtask-cases-20747.html\n;\u6d4b\u8bd5\u5355ID\u4e3a: 20747\nTASK_ID =\n;\u5c06\u6d4b\u8bd5\u7ed3\u679c\u6570\u636e\u56de\u586b\u5230PMS\n;\u4e3a\u7a7a: \u8868\u793a\u4e0d\u56de\u586b,\u4e0d\u4f1a\u5728\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u751f\u6210json\u7ed3\u679c\u6587\u4ef6;\n;async: \u8868\u793a\u9010\u6761\u5f02\u6b65\u56de\u586b,\u540e\u9762\u4e00\u6761\u6267\u884c\u5f00\u59cb\u65f6\u901a\u8fc7\u5b50\u7ebf\u7a0b\u5bf9\u524d\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u8fdb\u884c\u56de\u586b\uff0c\u5982\u6b64\u5b9e\u73b0\u65f6\u95f4\u6548\u7387\u6700\u5927\u5316;\n;finish: \u8868\u793a\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u6210\u4e4b\u540e\u9010\u4e2a\u56de\u586b(PMS\u4e0d\u652f\u6301\u5e76\u53d1);\nSEND_PMS =\n;\u6570\u636e\u56de\u586b\u7684\u89e6\u53d1\u8005\n;auto: \u6846\u67b6\u81ea\u52a8\u56de\u586b,\u914d\u5408SEND_PMS\u914d\u7f6e\u4f7f\u7528,\u4f60\u53ef\u4ee5\u9009\u62e9\u5728\u4e0d\u540c\u7684\u9636\u6bb5\u8fdb\u884c\u6570\u636e\u56de\u586b;\n;hand: \u624b\u52a8\u56de\u586b,\u6bcf\u6761\u7528\u4f8b\u4ecd\u7136\u4f1a\u751f\u6210json\u6587\u4ef6,\u4f46\u6846\u67b6\u4e0d\u4f1a\u8fdb\u884c\u6570\u636e\u56de\u586b,\u9700\u8981\u4f60\u53ef\u4ee5\u5728\u4f60\u60f3\u8981\u53d1\u9001\u7684\u65f6\u95f4\u70b9\u624b\u52a8\u89e6\u53d1\u56de\u586b;\nTRIGGER = auto\n;PMS\u56de\u586b\u7684\u91cd\u8bd5\u6b21\u6570\n;\u5982\u679c\u63a5\u53e3\u8bf7\u6c42\u5931\u8d25,\u4f1a\u8fdb\u884c\u91cd\u8bd5\nSEND_PMS_RETRY_NUMBER = 2\n[csv_link_pms_lib]\n;caselib: \u7528\u4f8b\u5e93\n;testcase: \u4ea7\u54c1\u5e93\u7528\u4f8b\nCASE_FROM = caselib\n[csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/caselib-browse-81.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 81\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic =\n[export_csv]\n;\u5bfc\u51fa\u7684csv\u6587\u4ef6\u540d\u79f0\uff0c\u9ed8\u8ba4 case_list.csv\nCSV_FILE = case_list.csv\n;exportcsv \u547d\u4ee4\u5bfc\u51fa case_list.csv \u6587\u4ef6\u65f6\u914d\u7f6e\u7684\u5b57\u6bb5\u540d\uff0c\u7528\u4f8b\u540d\u79f0\u9ed8\u8ba4\u5b58\u5728\u7b2c\u4e00\u5217\uff0c\u65e0\u9700\u6dfb\u52a0\nCSV_HEARD = \u7528\u4f8b\u7ea7\u522b,\u7528\u4f8b\u7c7b\u578b,\u6d4b\u8bd5\u7ea7\u522b,\u662f\u5426\u8df3\u8fc7\n[log_cli]\n;\u65e5\u5fd7\u76f8\u5173\u914d\u7f6e\uff08\u4e0d\u6253\u5370\u6784\u9020\u51fd\u6570\u548c\u9b54\u6cd5\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff09\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = DEBUG\n# ============= \u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u914d\u7f6e ================\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u5f00\u5934\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7, \u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_STARTSWITH = Assert\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u7ed3\u5c3e\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_ENDSWITH = Widget\n;\u652f\u6301\u7c7b\u540d\u5305\u542b xxx \u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_CONTAIN = ShortCut\n# ==============================================\n \u914d\u7f6e\u5b8c\u6210\u4e4b\u540e\uff0c\u76f4\u63a5\u5728\u547d\u4ee4\u884c\u6267\u884c manage.py \u5c31\u597d\u4e86\u3002 youqu manage.py run\n"},{"location":"#212","title":"2.1.2. \u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a youqu manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -h, --help show this help message and exit\n-a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--record_failed_case RECORD_FAILED_CASE\n\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--max_fail MAX_FAIL \u6700\u5927\u5931\u8d25\u7387\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--resolution RESOLUTION\n\u68c0\u67e5\u5206\u8fa8\u7387\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms {,async,finish}\n\u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--trigger {,auto,hand}\n\u89e6\u53d1\u8005\n-f CASE_FILE, --case_file CASE_FILE\n\u6839\u636e\u6587\u4ef6\u6267\u884c\u7528\u4f8b\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n--pms_user PMS_USER pms \u7528\u6237\u540d\n--pms_password PMS_PASSWORD\npms \u5bc6\u7801\n--suite_id SUITE_ID pms \u6d4b\u8bd5\u5957ID\n--pms_info_file PMS_INFO_FILE\npms \u4fe1\u606f\u6587\u4ef6\n--top TOP \u8fc7\u7a0b\u4e2d\u8bb0\u5f55top\u547d\u4ee4\u4e2d\u7684\u503c\n--lastfailed \u4ec5\u6267\u884c\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\n--duringfail \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\n--repeat REPEAT \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n--project_name PROJECT_NAME\n\u5de5\u7a0b\u540d\u79f0\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--build_location BUILD_LOCATION\n\u6784\u5efa\u5730\u533a\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--line LINE \u6267\u884c\u7684\u4e1a\u52a1\u7ebf\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--autostart AUTOSTART \u7528\u4f8b\u6267\u884c\u7a0b\u5e8f\u6ce8\u518c\u5230\u5f00\u673a\u81ea\u542f\u670d\u52a1\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a youqu manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\"\n \u547d\u4ee4\u884c\u53c2\u6570\u4f18\u5148\u7ea7\u662f\u9ad8\u4e8e\u914d\u7f6e\u6587\u4ef6\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u4e86\u5bf9\u5e94\u7684\u53c2\u6570\uff0c\u914d\u7f6e\u6587\u4ef6\u4e2d\u4e0d\u7ba1\u662f\u5426\u914d\u7f6e\u5747\u4e0d\u751f\u6548\u3002 --app \u5165\u53c2\u8fd8\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\uff0c\u4e0b\u9762\u7684\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u540c\u6837\u652f\u6301\u3002"},{"location":"#22","title":"2.2. \u8fdc\u7a0b\u6267\u884c","text":"\u8fdc\u7a0b\u6267\u884c\u5c31\u662f\u7528\u672c\u5730\u4f5c\u4e3a\u670d\u52a1\u7aef\u63a7\u5236\u8fdc\u7a0b\u673a\u5668\u6267\u884c\uff0c\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u76f8\u540c\uff1b \u4f7f\u7528 remote \u547d\u4ee4\uff1a youqu manage.py remote\n"},{"location":"#221","title":"2.2.1. \u8fdc\u7a0b\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u6267\u884c","text":"\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u6267\u884c\u5c31\u662f\u7531\u672c\u5730 YouQu \u4f5c\u4e3a\u670d\u52a1\u7aef\uff0c\u63a7\u5236\u8fdc\u7a0b N \u53f0\u673a\u5668\u6267\u884c\u76f8\u540c\u7684\u7528\u4f8b\uff0c\u6267\u884c\u5b8c\u4e4b\u540e\u6240\u6709\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u7ed3\u679c\u4f1a\u8fd4\u56de\u7ed9\u670d\u52a1\u7aef report \u76ee\u5f55\u4e0b\uff1b \u8fdc\u7a0b\u6267\u884c\u540c\u6837\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u8fdb\u884c\u7528\u4f8b\u76f8\u5173\u914d\u7f6e\uff1b \u9700\u8981\u91cd\u70b9\u8bf4\u4e00\u4e0b\u8fdc\u7a0b\u6267\u884c\u65f6\u7684\u6d4b\u8bd5\u673a\u4fe1\u606f\u914d\u7f6e\uff0c\u5728\u914d\u7f6e\u6587\u4ef6 setting/remote.ini \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\u3001IP\u3001\u5bc6\u7801\u3002 ;=============================== CLIENT LIST =====================================\n; \u6d4b\u8bd5\u673a\u914d\u7f6e\u5217\u8868\n;[client{number}] ;\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u6709\u591a\u5c11\u53f0\u6d4b\u8bd5\u673a\u5c31\u5199\u591a\u5c11\u4e2a client\uff0c\u522b\u540d\u5fc5\u987b\u5305\u542b client \u5b57\u7b26\uff0c\u4e14\u4e0d\u80fd\u91cd\u590d\u3002\n;user = ;\u6d4b\u8bd5\u673a user\n;ip = ;\u6d4b\u8bd5\u673a ip\n;password = 1 ;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801, \u53ef\u4ee5\u4e0d\u914d\u7f6e\u6b64\u9879\uff0c\u9ed8\u8ba4\u53d6 CLIENT_PASSWORD \u7684\u503c\uff1b\n;\u5982\u679c\u4f60\u6240\u6709\u6d4b\u8bd5\u673a\u5bc6\u7801\u90fd\u76f8\u540c\uff0c\u90a3\u4e48\u53ea\u9700\u8981\u914d\u7f6e CLIENT_PASSWORD \u5c31\u53ef\u4ee5\u4e86\n;=================================================================================\n[client1]\nuser = uos\nip = 10.8.15.xx\n[client2]\nuser = uos\nip = 10.8.15.xx\n[client3]\nuser = uos\nip = 10.8.11.xx\n \u6709\u591a\u5c11\u53f0\u673a\u5668\u5c31\u50cf\u8fd9\u6837\u53c2\u8003\u4e0a\u9762\u7684\u683c\u5f0f\u5199\u5c31\u884c\u4e86\u3002 \u7136\u540e\u5728\u547d\u4ee4\u884c\uff1a youqu manage.py remote\n \u8fd9\u6837\u8fd0\u884c\u662f\u4ece\u914d\u7f6e\u6587\u4ef6\u53bb\u8bfb\u53d6\u76f8\u5173\u914d\u7f6e\u3002 \u5982\u679c\u4f60\u4e0d\u60f3\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\uff0c\u4f60\u4ecd\u7136\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u8fdb\u884c\u4f20\u53c2\uff0c \u4ee5\u4e0b\u4e3a python3 manage.py remote \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -h, --help show this help message and exit\n-c CLIENTS, --clients CLIENTS\n\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679cpassword\u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6sett\ning/remote.ini\u4e2dCLIENT_PASSWORD\u7684\u503c,\u6bd4\u5982: uos@10.8.13.33:1\n\u6216 uos@10.8.13.33\n-s, --send_code \u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a\uff08\u4e0d\u542breport\u76ee\u5f55\uff09\n-e, --build_env \u642d\u5efa\u6d4b\u8bd5\u73af\u5883,\u5982\u679c\u4e3ayes\uff0c\u4e0d\u7ba1send_code\u662f\u5426\u4e3ayes\u90fd\u4f1a\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a.\n-p CLIENT_PASSWORD, --client_password CLIENT_PASSWORD\n\u6d4b\u8bd5\u673a\u5bc6\u7801\uff08\u5168\u5c40\uff09\n-y PARALLEL, --parallel PARALLEL\nyes:\u8868\u793a\u6240\u6709\u6d4b\u8bd5\u673a\u5e76\u884c\u8dd1\uff0c\u6267\u884c\u76f8\u540c\u7684\u6d4b\u8bd5\u7528\u4f8b;no:\u8868\u793a\u6d4b\u8bd5\u673a\u5206\u5e03\u5f0f\u6267\u884c\uff0c\u670d\u52a1\u7aef\u4f1a\u6839\u636e\u6536\u96c6\u5230\u7684\u6d4b\u8bd5\u7528\u4f8b\u81ea\n\u52a8\u5206\u914d\u7ed9\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u3002\n \u9664\u4e86\u8fd9\u4e9b\u7279\u6709\u53c2\u6570\u4ee5\u5916\uff0c\u5b83\u540c\u6837\u652f\u6301\u672c\u5730\u6267\u884c\u7684\u6240\u6709\u53c2\u6570\uff1b \u5728\u547d\u4ee4\u884c\u8fd9\u6837\u8fd0\u884c\uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\"\n \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report \u76ee\u5f55\u4e0b\u56de\u6536\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u7684\u6d4b\u8bd5\u62a5\u544a\u3002 \u6ce8\u610f\uff0c\u5982\u679c\u8fdc\u7a0b\u673a\u5668\u6ca1\u6709\u642d\u5efa\u81ea\u52a8\u5316\u6d4b\u8bd5\u73af\u5883\uff0c\u8bb0\u5f97\u52a0\u4e0a\u53c2\u6570 -e \uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\" -e\n \u6267\u884c\u524d\u786e\u4fdd\u8fdc\u7a0b\u673a\u5668\u5df2\u7ecf\u5f00\u542f\u4e86 ssh \u670d\u52a1\uff0c\u5426\u5219\u4f1a\u63d0\u793a\u65e0\u6cd5\u8fde\u63a5\uff0c\u5982\u679c\u6ca1\u6709\u5f00\u542f\uff0c\u8bf7\u624b\u52a8\u5f00\u542f\uff1a sudo systemctl restart ssh\nsudo systemctl enable ssh\n \u914d\u7f6e\u6587\u4ef6\u5176\u4ed6\u76f8\u5173\u914d\u7f6e\u9879\u8be6\u7ec6\u8bf4\u660e\uff0c\u8bf7\u67e5\u770b\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u6ce8\u91ca\u5185\u5bb9\u3002"},{"location":"#222","title":"2.2.2. \u8fdc\u7a0b\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u8d1f\u8f7d\u5747\u8861\u6267\u884c","text":"\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u8d1f\u8f7d\u5747\u8861\u6267\u884c\u4e5f\u662f\u7528\u672c\u5730\u4f5c\u4e3a\u670d\u52a1\u7aef\u63a7\u5236\u8fdc\u7a0b\u673a\u5668\u6267\u884c\uff0c\u4f46\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u4e0d\u540c\uff0c\u800c\u662f\u6240\u6709\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u4e4b\u548c\uff0c\u4e3a\u4f60\u60f3\u8981\u6267\u884c\u7684\u7528\u4f8b\u96c6\uff1b \u4f3c\u4e4e\u6709\u70b9\u96be\u4ee5\u7406\u89e3\uff0c\u6211\u7528\u5927\u767d\u8bdd\u4e3e\u4f8b\u63cf\u8ff0\u4e0b\u5c31\u662f\uff0c\u670d\u52a1\u7aef\u60f3\u8981\u6267\u884c 10 \u6761\u7528\u4f8b\uff0c\u73b0\u5728\u8fdc\u7a0b\u673a\u5668\u6709 5 \u53f0\uff1b \u7136\u540e\u670d\u52a1\u7aef\u5c31\u5148\u62ff\u7740\u7b2c 1 \u6761\u7528\u4f8b\u7ed9\u8fdc\u7a0b 1 \u53f7\u673a\u6267\u884c\uff0c\u62ff\u7b2c 2 \u6761\u7528\u4f8b\u7ed9\u8fdc\u7a0b 2 \u53f7\u673a\u6267\u884c...\uff0c\u5982\u6b64\u5faa\u73af\u76f4\u5230\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\uff0c\u8fd9\u5c31\u662f\u8d1f\u8f7d\u5747\u8861\u6267\u884c\u3002 \u4f7f\u7528\u65b9\u6cd5\u548c\u524d\u9762\u4e00\u6837\uff0c\u53ea\u662f\u9700\u8981\u589e\u52a0\u4e00\u4e2a\u53c2\u6570\uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\" --parallel no\n"},{"location":"#23-pms","title":"2.3. PMS \u6570\u636e\u56de\u586b","text":"\u6d4b\u8bd5\u5355\u5173\u8054\u7684\u7528\u4f8b\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u5bf9\u5e94\u7684\u53bb\u8dd1\u8fd9\u4e9b\u5173\u8054\u7684\u7528\u4f8b\uff0c\u5e76\u4e14\u5c06\u6267\u884c\u7684\u7ed3\u679c\u56de\u586b\u7684\u6d4b\u8bd5\u7528\u4f8b\u7684\u72b6\u6001\u91cc\u9762\u3002 PMS \u6570\u636e\u56de\u586b\u4e3b\u8981\u6709\u4e09\u79cd\u65b9\u5f0f\uff1a \uff081\uff09\u5f02\u6b65\u56de\u586b \u5728\u7528\u4f8b\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\uff0c\u91c7\u7528\u5f02\u6b65\u7684\u65b9\u5f0f\u53bb\u8fdb\u884c\u6570\u636e\u56de\u586b\uff0c\u76f4\u767d\u7684\u8bb2\u5c31\u662f\uff0c\u7b2c\u4e8c\u6761\u7528\u4f8b\u5f00\u59cb\u8dd1\u7684\u65f6\u5019\uff0c\u901a\u8fc7\u5b50\u7ebf\u7a0b\u53bb\u505a\u7b2c\u4e00\u6761\u7528\u4f8b\u7684\u6570\u636e\u56de\u586b\uff0c\u5982\u6b64\u5faa\u73af\uff0c\u76f4\u5230\u6240\u6709\u7528\u4f8b\u6267\u884c\u7ed3\u675f\uff1b \u8fd9\u79cd\u65b9\u6848\u7684\u65f6\u95f4\u6548\u7387\u6700\u9ad8\u7684\uff0c\u56e0\u4e3a\u7406\u8bba\u4e0a\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u662f\u5927\u4e8e\u6570\u636e\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\u65f6\u95f4\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u5f53\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u6570\u636e\u56de\u586b\u4e5f\u5b8c\u6210\u4e86\u3002 \u4f7f\u7528\u65b9\u6cd5\uff0c\u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u4ee5\u4e0b\u53c2\u6570\uff1a\uff08\u4ee5\u4e0b\u6d89\u53ca\u5230\u7684\u53c2\u6570\u914d\u7f6e\u90fd\u662f\u5728\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u914d\u7f6e\uff09 PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = async\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \u8fd9\u4e2a\u53c2\u6570\u53ef\u586b\u53ef\u4e0d\u586b\uff0c\u4f46\u662f\u586b\u4e86\u53ef\u4ee5\u63d0\u9ad8\u7528\u4f8b\u7684\u6267\u884c\u901f\u5ea6\uff0c\u56e0\u4e3a\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u53ef\u4ee5\u6307\u5b9a\u5230\u5177\u4f53\u7684\u5e94\u7528\u5e93\u3002\uff08\u4e0b\u540c\uff09\n \uff082\uff09\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u56de\u586b \u7b49\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u518d\u9010\u4e2a\u8fdb\u884c\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u6b64\u65b9\u6848\u65f6\u95f4\u6548\u7387\u6bd4\u8f83\u4f4e\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \uff083\uff09\u624b\u52a8\u56de\u586b \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4e0d\u505a\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u540e\u7eed\u624b\u52a8\u5c06\u7ed3\u679c\u8fdb\u884c\u56de\u586b\u8bf7\u6c42\u3002 \u7528\u4f8b\u6267\u884c\u65f6\u914d\u7f6e\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = hand\nAPP_NAME = \u540e\u7eed\u624b\u52a8\u56de\u586b\u65b9\u6cd5\uff1a youqu manage.py pms --send2task yes\n"},{"location":"#_4","title":"\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898","text":"\u7531\u540c\u5b66\u53ef\u80fd\u4f1a\u53d1\u73b0\uff0c\u600e\u4e48\u56de\u586b\u4e00\u6b21\u4e4b\u540e\uff0c\u540e\u9762\u60f3\u518d\u6b21\u56de\u586b\u5c31\u4e0d\u751f\u6548\u4e86\uff1b \u8fd9\u662f\u56e0\u4e3a\u4e3a\u4e86\u5e94\u5bf9\u524d\u9762\u63d0\u5230\u7684\u591a\u79cd\u6570\u636e\u56de\u586b\u7684\u65b9\u5f0f\uff0c\u5728 report \u76ee\u5f55\u4e0b\u4f1a\u7531 pms_xxx \u5f00\u5934\u7684\u76ee\u5f55\uff0c\u8bb0\u5f55\u4e86\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u548c\u56de\u586b\u60c5\u51b5\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u4e4b\u524d\u5df2\u7ecf\u56de\u586b\u8fc7\u4e86\uff0c\u540e\u7eed\u5c31\u4e0d\u4f1a\u518d\u6b64\u89e6\u53d1\u56de\u586b\u4e86\uff1b \u5982\u679c\u4f60\u60f3\u91cd\u65b0\u505a\u56de\u586b\uff0c\u4f60\u53ef\u4ee5\u628a report/pms_xxx \u76ee\u5f55\u5220\u6389\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u91cd\u65b0\u505a\u6570\u636e\u56de\u586b\u4e86\uff1b"},{"location":"#24-csv","title":"2.4. \u5bfc\u51fa CSV \u6587\u4ef6","text":"\u6846\u67b6\u63d0\u4f9b\u5bfc\u51fa\u6307\u5b9a\u6807\u7b7e\u7528\u4f8b\u7684\u529f\u80fd\uff1a youqu manage.py exportcsv -a deepin-album -t CICD\n \u8868\u793a\u5bfc\u51fa deepin-album \u7684\u7528\u4f8b\u4e2d\u6807\u8bb0\u4e86 CICD \u6807\u7b7e\u7684\u7528\u4f8b\uff0c\u5bfc\u51fa CSV \u6587\u4ef6\u7684\u5b57\u6bb5\u683c\u5f0f\u5df2\u7ecf\u9002\u914d\u4e86 CICD \u7684\u8981\u6c42\u3002"},{"location":"#25-app","title":"2.5. \u811a\u624b\u67b6\u65b0\u5efa APP \u5de5\u7a0b","text":"\u65b0\u5efa\u4e00\u4e2a APP \u5de5\u7a0b\uff1a youqu manage.py startapp autotest_deepin_some \u8fd9\u6837\u5728 apps \u76ee\u5f55\u4e0b\u4f1a\u521b\u5efa\u4e00\u4e2a\u5b50\u9879\u76ee\u5de5\u7a0b autotest_deepin_some\uff0c\u540c\u65f6\u65b0\u5efa\u597d\u5de5\u7a0b\u6a21\u677f\u76ee\u5f55\u548c\u6a21\u677f\u6587\u4ef6\uff1a apps\n\u2514\u2500\u2500 autotest_deepin_some\n \u00a0\u00a0 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_case.py\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 config.ini\n \u00a0\u00a0 \u251c\u2500\u2500 config.py\n \u00a0\u00a0 \u251c\u2500\u2500 conftest.py\n \u00a0\u00a0 \u251c\u2500\u2500 control\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_assert.py\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some.csv\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u2514\u2500\u2500 widget\n \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 case_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 other.ini\n \u00a0\u00a0 \u251c\u2500\u2500 other_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 pic_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2514\u2500\u2500 ui.ini\n autotest_deepin_some \u662f\u4f60\u7684\u5de5\u7a0b\u540d\u79f0\uff0c\u6bd4\u5982\uff1aautotest_deepin_music \uff1b \u5728\u6b64\u57fa\u7840\u4e0a\uff0c\u4f60\u53ef\u4ee5\u5feb\u901f\u7684\u5f00\u59cb\u4f60\u7684 AT \u9879\u76ee\u3002"},{"location":"#26","title":"2.6. \u7528\u4f8b\u6807\u7b7e\u81ea\u52a8\u540c\u6b65","text":"\u7528\u4e8e\u81ea\u52a8\u540c\u6b65 PMS \u7528\u4f8b\u6807\u7b7e\u6570\u636e\u81f3\u672c\u5730 CSV \u6587\u4ef6\uff0c\u4e3b\u8981\u901a\u8fc7\u4ee5\u4e0b\u51e0\u4e2a\u914d\u7f6e\u6765\u63a7\u5236\uff1a APP_NAME = # \u6307\u5b9a\u8981\u540c\u6b65\u7684\u5e94\u7528\u540d\u79f0\nPMS_USER = # PMS\u7684\u7528\u6237\u540d\nPMS_PASSWORD = # PMS\u7684\u5bc6\u7801\n \u5728 [csv_link_pms_id] \u8282\u70b9\u4e0b\u6307\u5b9a csv \u6587\u4ef6\u540d\u4e0e PMS \u7528\u4f8b\u6a21\u5757\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u6bd4\u5982\uff1a [csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/testcase-browse-53.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 53\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic = 53\n \u5c06\u4ee5\u4e0a\u4fe1\u606f\u914d\u7f6e\u597d\u4e4b\u540e\uff0c\u5728\u547d\u4ee4\u884c\u6267\u884c\uff1a youqu manage.py pms --pms2csv yes\n \u6bcf\u6b21\u6267\u884c\u65f6\u539f csv \u6587\u4ef6\u4f1a\u81ea\u52a8\u5907\u4efd\u5728 report/csv_back \u76ee\u5f55\u4e0b\uff0c\u56e0\u6b64\u4f60\u4e0d\u7528\u62c5\u5fc3\u811a\u672c\u6267\u884c\u5bfc\u81f4\u4f60\u7684\u6570\u636e\u4e22\u5931\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u57fa\u7840\u6846\u67b6\u8bbe\u8ba1\u65b9\u6848","text":"# ====================================\n# Author : Mikigo\n# Time : 2022/3/18\n# version \uff1a1.0\n# ====================================\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"\u505a\u4e00\u4e2a\u7b80\u5355\u3001\u597d\u7528\u3001\u529f\u80fd\u5f3a\u5927\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u3002 \u4f5c\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4e00\u4e2a\u57fa\u7840\u6846\u67b6\uff0c\u4efb\u4f55\u5e94\u7528\u90fd\u80fd\u5f88\u65b9\u4fbf\u7684\u63a5\u5165\u8fdb\u6765\uff1b \u63d0\u4f9b\u6240\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u9700\u8981\u7684\u5e95\u5c42\u529f\u80fd\uff0c\u5e76\u5bf9\u5916\u63d0\u4f9b\u552f\u4e00\u7684\u63a5\u53e3\uff0c\u65b9\u4fbf\u5e94\u7528\u5e93\u4f7f\u7528\uff1b \u6574\u5408\u516c\u5171\u5e93\uff0c\u51cf\u5c11\u5e94\u7528\u5e93\u4ee3\u7801\u91cf\u548c\u65b9\u6cd5\u7ef4\u62a4\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u8bbe\u8ba1\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u7edf\u4e00\u6982\u5ff5","text":" \u57fa\u7840\u6846\u67b6 \u672c\u9879\u76ee\u662f\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\uff08AutoTest Basic Frame\uff09\uff0c\u5168\u79f0\u4e3a\u201c\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff08AT \u57fa\u7840\u6846\u67b6\uff09\u201d\u3002 AT \u57fa\u7840\u6846\u67b6\u662f\u505a\u4e3a\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\u6765\u8bbe\u8ba1\u7684\uff0c\u5b83\u63d0\u4f9b\u4e86\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u57fa\u7840\u529f\u80fd\uff0c\u4efb\u4f55\u5e94\u7528\u63a5\u5165\u8fdb\u6765\u90fd\u80fd\u5feb\u901f\u65b9\u4fbf\u7684\u8fdb\u884c\u65b9\u6cd5\u548c\u7528\u4f8b\u7f16\u5199\uff0c\u540c\u65f6\u5728\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u3001\u6807\u7b7e\u5316\u6267\u884c\u3001\u5206\u5e03\u5f0f\u6267\u884c\u3001\u591a\u79cd\u62a5\u544a\u8f93\u51fa\u3001\u4f18\u7f8e\u7684\u6267\u884c\u65e5\u5fd7\u3001\u5931\u8d25\u81ea\u52a8\u5f55\u5c4f\u548c\u622a\u56fe\u3001\u81ea\u52a8\u73af\u5883\u6e05\u7406\u7b49\u7b49\uff0c\u5b83\u90fd\u63d0\u4f9b\u4e86\u5b8c\u5584\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u66f4\u91cd\u8981\u7684\u662f\u8fd9\u4e00\u5207\u4f7f\u7528\u8d77\u6765\u90fd\u975e\u5e38\u7b80\u5355\u3002 \u57fa\u7840\u6846\u67b6\u4e2d\u5305\u542b\u5e94\u7528\u5e93\uff08apps\uff09\u3001\u6838\u5fc3\u5e93\uff08src\uff09\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09\u3002 \u5e94\u7528\u5e93\uff08apps\uff09 \u5404\u4e2a\u5e94\u7528\u81ea\u5df1\u7684\u4ed3\u5e93\uff0c\u91cc\u9762\u4e3b\u8981\u5305\u542b\u7684\u662f\u7528\u4f8b\u3001\u65b9\u6cd5\u53ca\u4e00\u4e9b\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u53eb autotest-dde-file-manager \u3002 \u6838\u5fc3\u5e93\uff08src\uff09 \u6838\u5fc3\u5e93\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u5230\u6240\u6709\u5e95\u5c42\u6838\u5fc3\u529f\u80fd\uff0c\u8fd9\u662f\u6700\u91cd\u8981\u7684\u4e00\u4e2a\u90e8\u5206\uff0c\u7075\u9b42\u3002\u5177\u4f53\u529f\u80fd\u6a21\u5757\u53ca\u8bf4\u660e\u4f1a\u5728\u4e0b\u9762\u7b2c\u56db\u4e2a\u7ae0\u8282\u8be6\u7ec6\u63cf\u8ff0\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09 \u591a\u4e2a\u5e94\u7528\u90fd\u8981\u7528\u5230\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\uff0c\u6309\u7167\u5e94\u7528\u5212\u5206\u5b58\u653e\uff0c\u4e3b\u8981\u662f\u4e3a\u4e86\u51cf\u5c11\u4ee3\u7801\u91cf\uff0c\u6d88\u9664\u5e94\u7528\u95f4\u7684\u8026\u5408\u5173\u7cfb\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u67b6\u6784\u56fe","text":"\u6574\u4f53\u7684\u6846\u67b6\u8bbe\u8ba1\u5728\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u300b\u6587\u6863\u91cc\u9762\u5df2\u7ecf\u6709\u8be6\u7ec6\u63cf\u8ff0\u4e86\uff0c\u8fd9\u91cc\u8d34\u4e00\u4e0b\u6574\u4f53\u7684\u67b6\u6784\u56fe\uff1a \u4e3a\u4e86\u7a81\u663e\u672c\u6587\u7684\u91cd\u70b9\uff0c\u62bd\u53d6\u5176\u4e2d\u91cd\u8981\u529f\u80fd\u6a21\u5757\uff0c\u5982\u4e0b\u56fe\uff1a "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-basic-frame # \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\n\u251c\u2500\u2500 apps # \u5e94\u7528\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-dde-file-manager # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\uff08\u5e94\u7528\u5e93\u8be6\u7ec6\u76ee\u5f55\u7ed3\u6784\u8bf7\u770b\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\uff09\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 tag # \u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u2514\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u2502 \u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 xxx.png\n\u2502 \u2502 ...\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-deepin-music # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 public # \u516c\u5171\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget # dde_dock \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget # dde_desktop \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 src # \u6838\u5fc3\u5e93\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 button_center.py\n\u2502 \u251c\u2500\u2500 cmdtrl.py\n\u2502 \u251c\u2500\u2500 dogtails.py\n\u2502 \u251c\u2500\u2500 find_image.py\n\u2502 \u251c\u2500\u2500 global_config.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 setting # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 config.py\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 global_config.ini\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\u6a21\u5757\uff08Hook\uff09\n\u251c\u2500\u2500 pytest.ini # Pytest \u9ed8\u8ba4\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 docs # \u6587\u6863\u76ee\u5f55\n\u2514\u2500\u2500 manage.py # \u6267\u884c\u5668\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1apps","title":"1\u3001\u5e94\u7528\u5e93\uff08apps\uff09","text":"\u6240\u6709\u5e94\u7528\u5e93\u5747\u653e\u7f6e\u5728\u57fa\u7840\u6846\u67b6\u4e0b\u7684 apps \u76ee\u5f55\u4e0b\uff08\u89c1\u7b2c\u4e8c\u7ae0\u8282\u7b2c3\u6bb5\u76ee\u5f55\u7ed3\u6784\u5185\u5bb9\uff09\u3002\u5e94\u7528\u5e93\u7684\u67b6\u6784\u8bbe\u8ba1\u53ef\u4ee5\u53c2\u8003\u300aAT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b\u6587\u6863\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2src","title":"2\u3001\u6838\u5fc3\u5e93\uff08src\uff09","text":"\u5728 src \u76ee\u5f55\u4e0b\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u5e95\u5c42\u6838\u5fc3\u7ec4\u4ef6\uff0c\u901a\u5e38\u6765\u8bb2\u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5230\u5176\u4e2d\u67d0\u4e00\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4e48\u4f60\u9700\u8981\u663e\u793a\u7684\u5bfc\u5165\u8fd9\u4e2a\u6a21\u5757\uff0c\u7136\u540e\u624d\u80fd\u4f7f\u7528\u8be5\u6a21\u5757\u4e0b\u7684\u529f\u80fd\uff0c\u5982\u679c\u4f60\u7528\u5230\u4e86\u5341\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4f60\u5c31\u9700\u8981\u5bfc\u5165\u5341\u4e2a\u3002\u4f46\u662f\u6211\u4eec\u60f3\u8ba9\u4e8b\u60c5\u53d8\u5f97\u7b80\u5355\uff0c\u4e00\u6b21\u5bfc\u5165\uff0c\u4f7f\u7528\u6240\u6709\u3002 \u5c06\u6240\u6709\u7684\u529f\u80fd\u6a21\u5757\u90fd\u8fdb\u5165\u5230 src \u7684\u540d\u79f0\u7a7a\u95f4\uff0c\u5728 src/__init__.py \u91cc\u9762\u6211\u4eec\u8bbe\u8ba1\u6210\u8fd9\u6837\uff1a # src/__init__.py\nfrom .cmdctl import CmdCtl\nfrom .dogtails import Dogtail\nfrom .find_image import FindImage\nfrom .button_center import ButtonCenter\nclass Src(CmdCtl, FindImage):\ndef __init__(self, **kwargs):\n\"\"\"dogtail or button center param\n :param kwargs: app_name, desc, number\n \"\"\"\nif kwargs:\napp_name = kwargs.get(\"APP_NAME\")\ndesc = kwargs.get(\"DESC\")\nif app_name is None or desc is None:\nraise ValueError\nnumber = kwargs.get(\"number\")\nnumber = number if isinstance(number, int) else -1\n# \u5bf9\u8c61\u7ec4\u5408\nself.dog = Dogtail(app_name, desc, number)\nself.ui = ButtonCenter(app_name, number)\n \u9700\u8981\u4f20\u9012\u53c2\u6570\u7684\u91c7\u7528\u5bf9\u8c61\u7ec4\u5408\uff0c\u6ca1\u6709\u53c2\u6570\u7684\u4f7f\u7528\u7ee7\u627f\uff0c\u7ee7\u627f\u7684\u7c7b\u7b26\u5408 Mixin \u8bbe\u8ba1\u6a21\u5f0f\u3002 \u5e94\u7528\u5e93\u91cc\u9762\u4f7f\u7528\u7684\u65f6\u5019\u5728 widget/base_widget.py \u91cc\u9762\u53ea\u9700\u8981\u552f\u4e00\u7ee7\u627f Src \uff1a # \u5e94\u7528\u5e93\u91cc\u9762\u65b9\u6cd5\u57fa\u7c7b\n# widget/base_widget.py\nfrom src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n \u8981\u4f7f\u7528\u6838\u5fc3\u5e93\u7684\u529f\u80fd\uff0c\u53ea\u9700\u8981\u5199\u4e00\u4e2a\u5bfc\u5165 from src import Src \u5373\u53ef\u3002 \u5199 __init__ \u6784\u9020\u51fd\u6570\u7684\u539f\u56e0\u662f\u901a\u8fc7\u53c2\u6570\u6784\u9020\u5e94\u7528\uff0c\u5e76\u4e14\u4f20\u9012 number \u8fdb\u6765\uff0c\u53ef\u4ee5\u5b9e\u73b0\u591a\u7a97\u53e3\u7684\u63a7\u5236\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3public","title":"3\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09","text":"\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6bcf\u4e2a\u5e94\u7528\u90fd\u662f\u4e00\u4e2a\u5355\u72ec\u7684 py \u6587\u4ef6\uff0c\u76f8\u4e92\u4e4b\u95f4\u662f\u72ec\u7acb\u7684\uff0c\u6bcf\u4e2a py \u6587\u4ef6\u91cc\u9762\u662f\u8be5\u5e94\u7528\u7684\u65b9\u6cd5\u7c7b\uff0c\u6bd4\u5982\uff1a\u6700\u5e38\u7528\u7684\u65b9\u6cd5\u7c7b dde_desktop_public_widget.py # dde_desktop_widget.py\nfrom src import Src\nclass _DdeDesktopPublicBaseWidget(Src):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-desktop\"\nDESC = \"/usr/bin/dde-desktop\"\ndef __init__(self):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC)\nclass DdeDesktopPublicWidget(_DdeDesktopPublicBaseWidget):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u7c7b\"\"\"\ndef click_music_dir_by_ui(self):\n\"\"\"\u5728\u6587\u4ef6\u9009\u62e9\u6846\u70b9\u51fb\u97f3\u4e50\u76ee\u5f55\"\"\"\nself.click(*self.ui.btn_center(\"\u4fa7\u8fb9\u680f-\u97f3\u4e50\")) \ndef click_xxx_by_attr(self):\npass\n \u516c\u5171\u65b9\u6cd5\u5e93\u610f\u4e49\uff1a \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6240\u5c01\u88c5\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\u90fd\u662f\u81f3\u5c11\u88ab2\u4e2a\u5e94\u7528\u90fd\u7528\u5230\u7684\uff0c\u8fd9\u6837\u505a\u53ef\u4ee5\u51cf\u5c11\u6574\u4f53\u4ee3\u7801\u91cf\uff0c\u4ece\u800c\u51cf\u8f7b\u5e94\u7528\u5e93\u4ee3\u7801\u7684\u7ef4\u62a4\u5de5\u4f5c\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u7f16\u5199\u5f62\u5f0f\uff08\u547d\u540d\u89c4\u5219\u3001\u5b9a\u4f4d\u7684\u65b9\u6848\u5199\u6cd5\u3001\u6ce8\u91ca\u7684\u5199\u6cd5\u7b49\u7b49\uff09\u5177\u6709\u4e00\u5b9a\u7684\u6a21\u677f\u4f5c\u7528\uff0c\u8fd9\u6837\u5373\u4f7f\u662f\u5404\u4e2a\u5e94\u7528\u5e93\u90fd\u72ec\u7acb\u7ef4\u62a4\uff0c\u6240\u6709\u7684\u7f16\u7801\u98ce\u683c\u90fd\u662f\u8d8b\u4e8e\u76f8\u540c\u7684\uff0c\u56e0\u4e3a\u5927\u5bb6\u90fd\u5e94\u8be5\u53c2\u7167\u516c\u5171\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u5199\u6cd5\u6765\u5199\u81ea\u5df1\u5e94\u7528\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\u7c7b\uff0c\u8fd9\u6837\u4f7f\u5f97\u4ece\u516c\u53f8\u7684\u89d2\u5ea6\u53bb\u770b\u6240\u6709\u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u90fd\u662f\u7edf\u4e00\u7684\u3002 \u53ef\u4ee5\u901a\u8fc7\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\uff0c\u4e86\u89e3\u5230\u5176\u4ed6\u5e94\u7528\u7684\u529f\u80fd\uff0c\u5bf9\u4e8e\u6211\u4eec\u9700\u6c42\u7406\u89e3\uff0c\u4e86\u89e3\u7cfb\u7edf\u7684\u65b9\u65b9\u9762\u9762\u4e5f\u6709\u597d\u5904\u3002 \u5f53\u7136\uff0c\u5982\u679c\u4f60\u7684\u5e94\u7528\u672c\u8eab\u662f\u5c5e\u4e8e\u6839\u672c\u5c31\u4e0d\u9700\u8981\u548c\u5176\u4ed6\u5e94\u7528\u4ea4\u4e92\u7684\uff0c\u90a3\u4e48\u4f60\u53ef\u80fd\u4e0d\u4f1a\u7528\u5230\u8fd9\u91cc\u9762\u7684\u529f\u80fd\uff0c\u6ca1\u5173\u7cfb\uff0c\u4f60\u6240\u6709\u7684\u65b9\u6cd5\u90fd\u53ef\u4ee5\u76f4\u63a5\u5199\u5728\u5e94\u7528\u5e93\u7684\u4e1a\u52a1\u5c42\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4conftestpy","title":"4\u3001conftest.py","text":"conftest.py \u4ece\u529f\u80fd\u4e0a\u5c06\u662f\u5c5e\u4e8e\u6838\u5fc3\u5e93\uff08src\uff09\u7684\u5185\u5bb9\uff0c\u4f46\u662f\u7531\u4e8e\u5b83\u7684\u7279\u6b8a\u6027\uff0c\u5373\u5b83\u662f\u5bf9\u5e94\u7528\u5e93\u4e2d\u7684\u7528\u4f8b\u751f\u6548\u7684\uff0c\u800c\u4e14\u5b83\u7684\u4f5c\u7528\u57df\u662f\u5f53\u524d\u76ee\u5f55\u53ca\u4ee5\u4e0b\uff0c\u56e0\u6b64\u6211\u4eec\u5c06\u5b83\u653e\u5230\u9879\u76ee\u6839\u76ee\u5f55\u3002\u6211\u4eec\u6846\u67b6\u4e2d\u6709\u4e0d\u5c11\u6838\u5fc3\u529f\u80fd\u90fd\u662f\u5728\u8fd9\u91cc\u9762\u8fdb\u884c\u5f00\u53d1\u7684\uff0c\u540e\u9762\u7b2c\u56db\u7ae0\u4f1a\u8bb2\u5230\u7ec6\u8282\u3002 pytest.ini \u4f5c\u7528\u548c conftest.py \u7c7b\u4f3c\uff0c\u662f Pytest \u6846\u67b6\u7684\u56fa\u5b9a\u914d\u7f6e\u6587\u4ef6\uff0c\u76ee\u524d\u914d\u7f6e\u4e86\u4e00\u4e9b\u901a\u7528\u7684\u547d\u4ee4\u884c\u6267\u884c\u53c2\u6570\uff0c\u4e5f\u653e\u5728\u9879\u76ee\u6839\u76ee\u5f55\u3002 \u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 Hook \u51fd\u6570\uff0capps \u76ee\u5f55\u4e0b\u7684 \u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 fixture \u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5setting","title":"5\u3001setting","text":"\u5168\u5c40\u914d\u7f6e\u6a21\u5757\uff0c\u5305\u542b\u4e86\u4ee5\u4e0b\u914d\u7f6e\u6587\u4ef6\uff1a \uff081\uff09ini \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u914d\u7f6e\u4e00\u4e9b\u5168\u5c40\u7684\u914d\u7f6e\u9879\uff0c\u8b6c\u5982\uff1a\u5931\u8d25\u91cd\u8dd1\u6b21\u6570\u3001\u662f\u5426\u5931\u8d25\u5f55\u5c4f\u3001\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\u3001\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4\u3001\u6267\u884c\u65f6\u65e5\u5fd7\u7ea7\u522b\u3001\u751f\u6210\u7684\u62a5\u544a\u7c7b\u578b\u3001\u4ee5\u53ca\u5206\u5e03\u5f0f\u6267\u884c\u7684\u4e00\u4e9b\u7b56\u7565\u914d\u7f6e\u9879\u7b49\u7b49\u3002 \uff082\uff09config.py \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u63d0\u4f9b\u914d\u7f6e\u6587\u4ef6\u8bfb\u53d6\u3001\u52a8\u6001\u83b7\u53d6\u4e00\u4e9b\u5e38\u91cf\uff08\u5982\u9879\u76ee\u6839\u76ee\u5f55\u7edd\u5bf9\u8def\u5f84 (BASE_DIR)\u3001\u7cfb\u7edf\u67b6\u6784\uff08SYS_FRAME\uff09\u3001\u65f6\u95f4\u5b57\u7b26\u4e32\uff08strftime\uff09\u3001\u672c\u673a USERNAME IP \u7b49\u7b49\uff09\u3001\u516c\u5171 URL \u7b49\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u89c4\u8303","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u7248\u672c\u53ca\u4f9d\u8d56","text":"\u57fa\u7840\u6846\u67b6\u4f1a\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u8fdb\u884c\u7248\u672c\u53d1\u5e03\uff0c\u4e0d\u4e0e\u67d0\u4e2a\u5e94\u7528\u7248\u672c\u7ed1\u5b9a\uff0c\u4f46\u662f\uff0c\u5e94\u7528\u5e93\u4f1a\u4f9d\u8d56\u4e8e\u57fa\u7840\u6846\u67b6\u7684\u7248\u672c\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u5efa\u8bae\u5728\u5e94\u7528\u5e93\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a\u6587\u672c\u6587\u4ef6\u7528\u4e8e\u8bb0\u5f55\u6240\u4f9d\u8d56\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\uff0c\u7c7b\u4f3c\u4e8e\u5f00\u53d1\u5e94\u7528\u7684 debian/control \u6587\u4ef6\u7684\u529f\u80fd\uff0c\u4e3a\u4e86\u4fdd\u6301\u7edf\u4e00\uff0c\u8fd9\u4e2a\u6587\u4ef6\u5c31\u547d\u540d\u4e3a control\uff0c\u653e\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u6838\u5fc3\u5e93\u72ec\u7acb\u6027","text":"\u6838\u5fc3\u5e93\u4e0d\u5efa\u8bae\u9488\u5bf9\u67d0\u4e00\u4e2a\u5e94\u7528\u5355\u72ec\u505a\u4ee3\u7801\u4e0a\u7279\u6b8a\u5904\u7406\uff0c\u901a\u5e38\u8003\u8651\u9488\u5bf9\u67d0\u4e00\u79cd\u573a\u666f\u8fdb\u884c\u5904\u7406\uff0c\u8fd9\u4e9b\u573a\u666f\u901a\u5e38\u662f\u5b58\u5728\u4e00\u4e9b\u5171\u6027\u7684\u3002\u6bd4\u5982\u8bf4\uff1a\u684c\u9762\u7684ID\u5206\u914d\u5b58\u5728\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u903b\u8f91\u5904\u7406\u89e3\u51b3ID\u5206\u914d\u9519\u8bef\u7684\u95ee\u9898\uff0c\u4f46\u662f\u8fd9\u90e8\u5206\u903b\u8f91\u6211\u4eec\u4f1a\u5728\u684c\u9762\u7684\u65b9\u6cd5\u5c42\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u517c\u5bb9\u6027","text":"\u4e3a\u4e86\u4fdd\u6301\u517c\u5bb9\u6027\uff0c\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u539f\u5219\u4e0a\u4e0d\u5bf9\u8001\u65b9\u6cd5\u8fdb\u884c\u4fee\u6539\u6216\u5220\u9664\uff0c\u53ea\u8fdb\u884c\u65b0\u589e\u3002\u6d89\u53ca\u5230\u8001\u65b9\u6cd5\u4fee\u6539\u6216\u5220\u9664\u7684\uff0c\u4f1a\u8fdb\u884c\u63d0\u524d\u9884\u544a\uff0c\u5e76\u5728\u7b2c\u4e8c\u4e2a\u7248\u672c\u4e4b\u540e\uff08\u4e2d\u95f4\u4f1a\u9694\u4e00\u4e2a\u7248\u672c\u8fc7\u5ea6\uff09\u6b63\u5f0f\u5b9e\u65bd\u4fee\u6539\u6216\u5220\u9664\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u547d\u540d\u89c4\u8303","text":" \u7528\u4f8b ID \u6bcf\u4e2a\u5e94\u7528\u81ea\u5df1\u7ef4\u62a4\u4e00\u5957 ID\uff0c\u5728PMS\u4e0a\u7528\u4f8b\u6807\u9898\u4e0a\u5c06\u81ea\u52a8\u5316ID\u4ee5\u6807\u7b7e\u7684\u5f62\u5f0f\u5199\u5165\uff0c\u6bd4\u5982\uff1a[101]\u6253\u5f00-\u542f\u52a8\u5e94\u7528\u540edock\u53f3\u952e\u83dc\u5355 \u4e00\u4e2a\u7528\u4f8b\u7c7b\u91cc\u9762\u6709\u591a\u4e2a\u7528\u4f8b\u65f6\uff0c\u5728\u7528\u4f8b\u540d\u79f0\u540e\u9762\u52a0\u5e8f\u53f7\u3002 class TestFileManager(BaseCase):\n\"\"\"\u6587\u7ba1\u7528\u4f8b\"\"\"\ndef test_xxx_015_1(self):\npass\ndef test_xxx_015_2(self):\npass\n \u6ce8\u610f 015_1\uff0c\u4e0d\u8981\u5199015_01\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 PMS \u4e0a\u7684\u7528\u4f8bID\uff1a PMS \u4e0a\u662f6\u4f4d\u6570\uff0c\u4e0d\u591f\u76f4\u89c2\uff0c\u4e5f\u4e0d\u597d\u7ef4\u62a4\uff0c\u5728\u81ea\u52a8\u5316\u4e0b\u9762\u53bb\u627e\u4e00\u4e2a\u5e26\u6709 6 \u4f4d\u6570\u7684\u6587\u4ef6\u662f\u4e00\u4e2a\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 PMS \u4e0a\u7684 ID \u53ef\u80fd\u4f1a\u53d1\u751f\u53d8\u5316\uff0c\u6bd4\u5982\u5bfc\u51fa\u6765\u5bfc\u8fdb\u53bb\u7684\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u5b58\u5728\u95ee\u9898\uff0c\u5982\u679c\u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u8981\u60f3\u627e\u51fa\u6765\u5bf9\u5e94\u4fee\u6539\u81ea\u52a8\u5316\u7528\u4f8b ID\uff0c\u5c06\u4f1a\u662f\u4ef6\u975e\u5e38\u75db\u82e6\u7684\u4e8b\u60c5\u3002 \u51fd\u6570\u547d\u540d\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5de6\u952e\u70b9\u51fb click \u53f3\u952e\u70b9\u51fb right_click \u53cc\u51fb double_click \u79fb\u52a8 move_to \u62d6\u52a8 drag \u65b0\u5efa new \u62d6\u52a8\u5230 drag_to \u4ece\u54ea\u91cc\u62d6\u52a8\u5230\u54ea\u91cc drag_something_from_xxx_to_xxx \u83b7\u53d6 get \u83b7\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5750\u6807 get_location \u975e\u7279\u6b8a\u6587\u4ef6 file word\u6587\u4ef6 doc text\u6587\u4ef6 text \u6587\u4ef6\u5939 dir \u5173\u952e\u8bcd\u6301\u7eed\u589e\u52a0 \u5e38\u91cf\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5e94\u7528\u540d\u79f0 APP_NAME \u5e94\u7528\u63cf\u8ff0 DESC \u672c\u5e94\u7528\u4ee5\u5916\u7684\u5176\u4ed6\u5e94\u7528\uff0c\u6bd4\u5982\u5e2e\u52a9 HELP \u5176\u4ed6\u540d\u79f0\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u65b9\u6cd5\u5305\u540d widget \u65b9\u6cd5\u6587\u4ef6\u540d\uff08\u6587\u7ba1\u4e3e\u4f8b\uff09 dfm_widget.pytitle_widget.pyright_view_widget.pyleft_view_widget.pypop_widget.pybase_widget.pydfm_assert.py \u65ad\u8a00\u8bed\u53e5\u547d\u540d\u89c4\u8303 \u65ad\u8a00\u8bed\u53e5\u90fd\u662f\u4ee5 assert \u5f00\u5934 \u65ad\u8a00 \u8bed\u53e5 \u5224\u65ad\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_existsassert_file_not_exists \u5224\u65ad\u684c\u9762\u76ee\u5f55\u4e0b\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_exists_in_desktopassert_file_not_exists_in_desktop \u5224\u65ad\u56fe\u7247\u5b58\u5728 assert_image_existsassert_image_not_exists \u5224\u65ad\u5f71\u9662\u4e2d\u662f\u5426\u5b58\u5728\u56fe\u7247 assert_image_exists_in_movieassert_image_not_exists_in_movie \u5224\u65ad\u5143\u7d20\u662f\u5426\u5b58\u5728 assert_element_existassert_element_not_exist \u5224\u65ad\u662f\u5426\u76f8\u7b49 assert_equalassert_not_equal \u5224\u65ad\u662f\u5426\u4e3a\u771f assert_trueassert_false"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5fixture","title":"5\u3001fixture \u89c4\u8303","text":"\u7531\u4e8e Pytest \u6846\u67b6\u4e2d\u652f\u6301 fixture \u7684\u5199\u6cd5\u548c Xunit \u5199\u6cd5\u7684\uff0c\u6240\u4ee5\u5e94\u7528\u5e93\u4e2d\u53ef\u80fd\u5b58\u5728\u6df7\u7528\u7684\u60c5\u51b5\uff0c\u4e3a\u7edf\u4e00\u7f16\u7801\u98ce\u683c\u65b9\u4fbf\u540e\u7eed\u7528\u4f8b\u4ee3\u7801\u7ef4\u62a4\uff0c\u73b0\u505a\u4ee5\u4e0b\u89c4\u8303\u8bf4\u660e\uff1a \u629b\u5f03 Xunit \u7684\u5199\u6cd5\uff0c\u7edf\u4e00\u91c7\u7528 Pytest fixture \u7684\u5199\u6cd5\u3002 \u5e94\u7528\u5185 fixture \u8c28\u614e\u4f7f\u7528 autouse=True \uff0c\u975e\u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u975e\u5e38\u4e0d\u5efa\u8bae\u4f7f\u7528\u8fd9\u4e2a\u53c2\u6570\u3002 \u8c03\u7528 fixture \u4e0d\u80fd\u4f7f\u7528 @pytest.mark.usefixture()\uff0c\u4f7f\u7528\u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u4f20\u5165\u51fd\u6570\u5bf9\u8c61\u3002 \u5efa\u8bae\u5728\u4e00\u4e2a conftest.py \u91cc\u9762\u53bb\u5199\uff0c\u4e00\u4e2a\u5e94\u7528\u4e5f\u5c3d\u91cf\u7ef4\u62a4\u4e00\u4e2a conftest.py\u6587\u4ef6\u3002 fixture \u4e5f\u9700\u8981\u5199\u529f\u80fd\u8bf4\u660e\uff0c\u51fd\u6570\u540d\u79f0\u8981\u6709\u5177\u4f53\u542b\u4e49\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#6","title":"6\u3001\u65b9\u6cd5\u7f16\u5199\u89c4\u8303","text":" \u65b9\u6cd5\u7c7b\u578b\uff1a if \u6ca1\u6709\u7528\u5230\u5b9e\u4f8b\u5bf9\u8c61\uff1a\nif \u6ca1\u6709\u7528\u5230\u7c7b\u5bf9\u8c61\uff1a\n\u5199\u9759\u6001\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @staticmethod\nelse\uff1a\n\u5199\u7c7b\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @classmethod\nelse:\n\u76f4\u63a5\u5199\u5b9e\u4f8b\u65b9\u6cd5\n \u4e3e\u4f8b: class TitleWidget:\ndef click_xxx_by_ui(self):\npass\n@staticmethod\ndef click_xxx_by_ui():\npass\n@classmethod\ndef click_xxx_by_ui(cls):\npass\n \u51fd\u6570\u540d\u79f0\u4e0d\u51fa\u73b0\u6570\u5b57\uff0c\u9700\u8981\u8868\u793a\u6570\u91cf\u7684\u7528\u5355\u8bcd\u8868\u793a\u3002 \u51fd\u6570\u529f\u80fd\u6ce8\u91ca\u3002 \u6ca1\u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg2:xxx\n\"\"\"\n \u6709\u53c2\u6570\uff0c\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg1:xxx\nreturn: xxx\n\"\"\"\n \u200b \u7528 Pycharm \u7684\u6ce8\u91ca\u6a21\u677f\u4e5f\u53ef\u4ee5\uff0c\u53ea\u8981\u4f53\u73b0\u4e86\u53c2\u6570\u7684\u7c7b\u578b\u548c\u8fd4\u56de\u5c31\u884c\u4e86\u3002 \u6682\u4e0d\u8981\u6c42\u5199\u7c7b\u578b\u6ce8\u89e3\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#7case","title":"7\u3001\u7528\u4f8b\uff08case\uff09\u89c4\u8303","text":" \u4ee5\u7c7b\u7684\u5f62\u5f0f\u5199\u7528\u4f8b\uff0c\u7528\u4f8b\u7c7b\u96c6\u6210\u7528\u4f8b\u57fa\u7c7b\u3002 \u7528\u4f8b\u7c7b\u9700\u8981\u5199\u6ce8\u91ca\u3002 \u6d4b\u8bd5\u7528\u4f8b\u51fd\u6570\u8bf4\u660e\uff08\u5efa\u8bae\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u540d\u79f0\uff09 \"\"\"\u53f3\u4fa7\u9884\u89c8-\u56fe\u7247\u7c7b\u578b\u4fe1\u606f\u680f\u57fa\u672c\u4fe1\u606f\"\"\"\n \u4e0d\u5199\u8c03\u8bd5\u4ee3\u7801 if __name__ == '__main__':\npytest.main()\n \u6240\u6709\u7528\u4f8b\u90fd\u7ee7\u627f BaseCase\u3002 BaseCase \u91cc\u9762\u653e\u4e00\u4e9b\u6d4b\u8bd5\u6570\u636e\u7684\u5e38\u91cf\uff0c\u6bd4\u5982\u6587\u4ef6\u540d\u79f0\uff0c\u5e94\u7528\u540d\u79f0\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u4e00\u4e9b\u901a\u7528\u7684\u5b57\u7b26\u4e32\u3002 \u8fd9\u7c7b\u662f\u5c5e\u4e8e\u6d4b\u8bd5\u6570\u636e\u3002 class BaseCase(DfmAssert):\n\"\"\"\u7528\u4f8b\u57fa\u7c7b\"\"\"\nNEW_FILE = \"\u65b0\u5efa\u6587\u672c.txt\"\nTEST_FILE = \"test.txt\"\nNEW_DIR = \"\u65b0\u5efa\u6587\u4ef6\u5939\"\nNEW_WORD = \"\u65b0\u5efaWord\u6587\u6863.doc\"\nAPP_HELP = \"damn\"\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\n\"\"\"\u7528\u4f8b\u6807\u9898\uff08\u590d\u5236PMS\u4e0a\u7528\u4f8b\u6807\u9898\uff09\"\"\"\ndfm = DfmWidget()\ndfm.click_xxx_by_attr(self.NEW_FILE)\ndfm.new_file_in_desktop_by_cmd(self.NEW_FILE)\nself.assert_true(dfm.get_process_status(self.APP_NAME))\n \u7528\u4f8b\u91cc\u9762\u5c3d\u91cf\u51cf\u5c11\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\uff0c\u66f4\u8981\u51cf\u5c11\u76f8\u540c\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\u3002 \u7edf\u4e00\u6587\u4ef6\u6ce8\u91ca\u5934\u3002 #!/usr/bin/env python3\n# _*_ coding:utf-8 _*_\n\"\"\"\n:Author:email@uniontech.com\n:Date :${DATE} ${TIME}\n\"\"\"\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#8","title":"8\u3001\u5176\u4ed6\u89c4\u8303","text":" \u65e5\u5fd7\u6253\u5370\u8981\u5728\u65b9\u6cd5\u6700\u524d\u9762\uff0c\u5426\u5219\u4ee3\u7801\u62a5\u9519\u6ca1\u6709\u65e5\u5fd7\u8f93\u51fa\uff0c\u4e0d\u597d\u5b9a\u4f4d\u95ee\u9898\u3002\uff08\u6211\u4eec\u4f1a\u8003\u8651\u7ee7\u7eed\u4f7f\u7528\u62e6\u622a\u5668\u6253\u5370\u65e5\u5fd7\uff09 \u6240\u6709\u7684\u64cd\u4f5c\u90fd\u9700\u8981\u6709\u65e5\u5fd7\uff0c\u5305\u62ec sleep()\uff0c\u6211\u4eec\u4f1a\u91cd\u5199\u4e00\u4e2a\u6709\u65e5\u5fd7\u8f93\u5165\u7684 sleep\u3002 \u4e1a\u52a1\u5c42\u65e5\u5fd7\u7ea7\u522b\u4e3a INFO\u3002 hook \u51fd\u6570\u53ea\u80fd\u5199\u5230\u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u91cc\u9762\u3002 apps \u76ee\u5f55\u4e0b\u7684 conftest.py \u539f\u5219\u4e0a\u4e0d\u4f1a\u65b0\u589e fixture\u3002 \u56fa\u5b9a\u76ee\u5f55\u6216\u5143\u7d20\u63a7\u4ef6\u7684\u64cd\u4f5c\uff0c\u5c06\u64cd\u4f5c\u65b9\u6cd5\u5199\u6b7b\uff0c\u6587\u4ef6\u7c7b\u64cd\u4f5c\u5c06\u6587\u4ef6\u540d\u7559\u53c2\u6570\u3002 \u8def\u5f84\u62fc\u63a5\u89c4\u8303\uff1a \u7cfb\u7edf\u4e2d\u56fa\u5b9a\u76ee\u5f55\uff0c\u8def\u5f84\u62fc\u63a5\u65f6\u4f7f\u7528\u6ce2\u6d6a\u7b26\u53f7\uff0c\u6bd4\u5982\uff1a~/Desktop/\uff0c\u4e0b\u5c42\u4f7f\u7528 os.path.expanduser()\uff0c\u5b83\u53ef\u4ee5\u81ea\u52a8\u8bc6\u522b\u6ce2\u6d6a\u7b26\u53f7\u3002 \u9879\u76ee\u4e0b\u8def\u5f84\u4f7f\u7528\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u8def\u5f84\uff0c\u6bd4\u5982\uff1aConfig.BASE_PATH\uff0c\u56e0\u4e3a\u9879\u76ee\u662f\u53ef\u4ee5\u5728\u4efb\u610f\u8def\u5f84\u8fd0\u884c\u7684\uff0c\u9700\u8981\u52a8\u6001\u62fc\u63a5\u8def\u5f84\u3002 "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848","text":"# =================================================\n# Author : Mikigo\n# Time : 2022/3/16\n# version \uff1a1.0\n# =================================================\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"AT \u5e94\u7528\u5e93\u6539\u9020\u662f\u57fa\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u8fdb\u884c\u7528\u4f8b\u65b9\u6cd5\u548c\u4e1a\u52a1\u903b\u8f91\u7684\u91cd\u65b0\u8bbe\u8ba1\uff0c\u4ee5\u5b9e\u73b0\u5e94\u7528\u5e93\u9ad8\u6548\u7684\u7f16\u5199\u3001\u7ef4\u62a4\u7528\u4f8b\u53ca\u5176\u65b9\u6cd5\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u6587\u4ef6\u7ba1\u7406\u5668\u4ece\u4e1a\u52a1\u590d\u6742\u5ea6\u548c\u7528\u4f8b\u91cf\u6765\u8bb2\uff0c\u5728\u7cfb\u7edf\u6240\u6709\u5e94\u7528\u4e2d\uff0c\u662f\u5f88\u6709\u4ee3\u8868\u6027\u7684\uff0c\u96be\u5ea6\u4e5f\u662f\u6700\u5927\u7684\uff0c\u56e0\u6b64\u6211\u4eec\u9009\u53d6\u6587\u4ef6\u7ba1\u7406\u5668\u4f5c\u4e3a\u5e94\u7528\u5e93\u6539\u9020\u7684\u5b9e\u9a8c\u5e94\u7528\uff0c\u7ed9\u540e\u7eed\u5176\u4ed6\u5e94\u7528\u6539\u9020\u63d0\u4f9b\u5207\u5b9e\u53ef\u884c\u7684\u601d\u8def\u548c\u65b9\u6848\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u5206\u5c42\u8bbe\u8ba1\u56fe","text":"\u6574\u4f53\u4ecd\u7136\u9075\u5faa PO \u8bbe\u8ba1\u7406\u5ff5\uff0c\u6839\u636e\u4e1a\u52a1\u9700\u8981\uff0c\u5c06\u6587\u7ba1\u4e1a\u52a1\u5c42\u8fdb\u884c 3 \u5c42\u5212\u5206\uff1a "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-dde-file-manager # \u5e94\u7528\u4ed3\u5e93\n\u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 test_xxx_001.py\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u00a0\u251c\u2500\u2500 __init__.py\n\u2502 \u00a0\u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u00a0\u251c\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u00a0\u251c\u2500\u2500 base_widget.py # \u65b9\u6cd5\u57fa\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 title_widget.py # title \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 right_view_widget.py # right view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 left_view_widget.py # left view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 pop_widget.py # pop \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 dfm_widget.py # \u65b9\u6cd5\u7684\u7edf\u4e00\u51fa\u53e3\n\u2502 \u00a0\u2514\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 tag # \u7528\u4f8b\u6807\u7b7e\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 xxx.csv # \u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2514\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u57fa\u7c7b","text":" \u7ee7\u627f\u6838\u5fc3\u5c42\u7684\u5404\u4e2a\u6a21\u5757\u7c7b\u3002 \u62bd\u53d6\u64cd\u4f5c\u5c42\u7684\u4e00\u4e9b\u57fa\u7840\u65b9\u6cd5\u3002 \u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u7684\u4e00\u4e9b\u516c\u5171\u65b9\u6cd5\u3002 \u8def\u5f84\u7ec4\u88c5\u65b9\u6cd5\u3002 \u4e00\u4e9b\u4e1a\u52a1\u5c42\u76f8\u5173\u7684\u53d8\u91cf\u3001\u5e38\u91cf\u3001shell\u547d\u4ee4\u3001\u5750\u6807\u3002 \u65b9\u6cd5\u57fa\u7c7b\u7684\u5199\u6cd5\uff1a from src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u64cd\u4f5c\u5c42","text":" \u6a21\u5757\u5212\u5206 \u6309\u7167\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u6587\u7ba1\u4e3b\u754c\u9762\u5206\u4e3a\u4e09\u4e2a\u533a\u57df\uff1a\u6807\u9898\u680f\u3001\u53f3\u8fb9\u89c6\u56fe\u533a\u57df\u3001\u5de6\u8fb9\u89c6\u56fe\u533a\u57df \u5f39\u7a97\uff1a\u8bbe\u7f6e\u754c\u9762\u5f39\u7a97\u3001\u4fdd\u9669\u7bb1\u5f39\u7a97\u3001\u5220\u9664\u786e\u8ba4\u5f39\u7a97\u3001\u53ca\u5404\u79cd\u7f51\u7edc\u5f39\u7a97 \u53f3\u952e\u83dc\u5355\uff1a\u6682\u65f6\u4e0d\u8003\u8651\u4e3a\u5355\u72ec\u7684\u6a21\u5757\uff0c\u8003\u8651\u4ee5\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6848\u505a\u6210\u516c\u5171\u5e93\u3002 \u5404\u4e2a\u6a21\u5757\u53ea\u7ee7\u627f\u57fa\u7c7b from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u6784\u9020\u51fd\u6570\u91cc\u9762\u4e0d\u6784\u9020\u5bf9\u8c61\uff0c\u53ef\u4ee5\u521d\u59cb\u5316\u4e00\u4e9b\u53d8\u91cf\u3002 \u4e0d\u540c\u7684\u5b9a\u4f4d\u65b9\u6848\u8c03\u7528\u4e0d\u540c\u7684\u5b9a\u4f4d\u5de5\u5177\u5bf9\u8c61\u3002 self.dog\nself.ui\nself.d_bus\n \u65b9\u6cd5\u7f16\u5199 \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u5e94\u7528\u5c42","text":" \u7ee7\u627f\u64cd\u4f5c\u5c42\u7684\u6240\u6709\u7c7b\u3002 \u4ec5\u4ec5\u7528\u4e8e\u7528\u4f8b\u4e2d\u5bfc\u5165\u65b9\u4fbf\uff0c\u4e0d\u505a\u5176\u4ed6\u4e8b\u60c5\u3002 class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n DfmAssert \u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u7ee7\u627f\uff0c\u65b9\u4fbf\u4f7f\u7528\u65ad\u8a00\u8bed\u53e5\u3002 from apps.dde_file_manager.widget.dfm_widget import DfmWidget\nfrom public.assert import Assert\nclass DfmAssert(Assert):\ndef assert_file_exists_in_desktop(self, file_name):\nself.assert_file_exists(f\"~/Desktop{file_name}\")\n...\nDfmWidget().get_file_in_desktop()\n \u7528\u4f8b\u91cc\u9762\u76f4\u63a5\u7ee7\u627f\uff0c\u65b9\u4fbf\u5728\u7528\u4f8b\u91cc\u9762\u4f7f\u7528 self \u8fdb\u884c\u65ad\u8a00\uff0c\u66f4\u7b26\u5408\u65ad\u8a00\u7684\u4f7f\u7528\u4e60\u60ef\uff0c\u7528\u4f8b\u903b\u8f91\u4e0a\u66f4\u6e05\u695a\u3002 class BaseCase(DfmAssert):\npass\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\nself.assert_file_exists_in_desktop(\"xxx\")\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u903b\u8f91\u4e3e\u4f8b","text":"\u7528\u4f8b\u4ee3\u7801\u8c03\u7528\u903b\u8f91\u4e3e\u4f8b\uff1a # BaseWidget\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n# =============================================\n# TitleWidget\nclass TitleWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_title_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# RightViewWidget\nclass RightViewWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_right_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# =============================================\n# \u51fa\u53e3 DfmWidget\nclass DfmWidget(TitleWidget, RightViewWidget):\npass\n# =============================================\n# in case\nfrom apps.dde_file_manager.widget.dfm_widget import DfmWidget\ndfm = DfmWidget()\ndfm.click_xxx_title_by_ui()\ndfm.click_xxx_right_by_ui()\ndfm.dog.print_desc()\ndfm.ui.print_number()\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u5de5\u7a0b\u6539\u9020\u5b9e\u65bd\u6b65\u9aa4","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_2","title":"1\u3001\u5de5\u7a0b\u4ee3\u7801\u62c9\u53d6","text":"1.1. \u5c06\u81ea\u52a8\u5316\u57fa\u7840\u6846\u67b6\u7684\u529f\u80fd\u62c9\u5230\u672c\u5730 Autotest Basic Frame \uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame 1.2. \u5c06\u5e94\u7528\u5e93\u4ee3\u7801\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u5e94\u7528\u5e93\u7684\u4ed3\u5e93\u547d\u540d\u5e94\u8be5\u662f\u957f\u8fd9\u6837\u7684 autotest_deepin_xxx\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_2","title":"2\u3001\u8c03\u6574\u5de5\u7a0b\u76ee\u5f55","text":"\u6309\u7167 \u65b9\u6848\u8bbe\u8ba1-\u76ee\u5f55\u7ed3\u6784 \u8fdb\u884c\u76ee\u5f55\u8c03\u6574\uff0c\u5c3d\u91cf\u4f7f\u7528\u7f16\u8f91\u5668\u8fdb\u884c\u76f8\u5e94\u7684\u8c03\u6574\uff0c\u7f16\u8f91\u5668\u63a8\u8350\u4f7f\u7528 Pycharm \uff0c\u4ee5\u4e0b\u64cd\u4f5c\u5747\u5728 Pycharm \u91cc\u9762\u53ef\u5b9e\u73b0\u3002 2.1. \u9700\u8981\u79fb\u52a8 py \u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u76f4\u63a5\u5728\u7f16\u8f91\u5668\u91cc\u9762\uff0c\u4f7f\u7528\u9f20\u6807\u9009\u4e2d\u5e76\u6309\u4f4f\uff0c\u4e4b\u540e\u62d6\u52a8\u5230\u76ee\u6807\u4f4d\u7f6e\u5373\u53ef\uff0cPycharm \u4f1a\u5c3d\u53ef\u80fd\u7684\u81ea\u52a8\u89e3\u51b3\u79fb\u52a8\u5bfc\u81f4\u7684\u8def\u5f84\u95ee\u9898\u3002\u6ce8\u610f\uff0c\u6211\u8bf4\u7684\u662f\u201c\u5c3d\u53ef\u80fd\u201d\uff0c\u6709\u4e9b\u9a9a\u64cd\u4f5c\u7f16\u8f91\u5668\u662f\u65e0\u6cd5\u81ea\u52a8\u5904\u7406\u7684\u3002\u5982\u679c\u6ca1\u6709\u88ab\u7f16\u8f91\u5668\u81ea\u52a8\u5904\u7406\u7684\u8def\u5f84\u95ee\u9898\uff0c\u540e\u7eed\u53ea\u80fd\u624b\u52a8\u89e3\u51b3\u3002 2.2. \u9700\u8981\u91cd\u547d\u540d\u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u5728\u7f16\u8f91\u5668\u91cc\u9762\u9009\u4e2d\u6587\u4ef6\uff0c\u7136\u540e\u4f7f\u7528\u5feb\u6377\u952e Shift + F6 \uff08\u5982\u679c\u5feb\u6377\u952e\u6ca1\u53cd\u5e94\uff0c\u6587\u4ef6\u53f3\u952e\u83dc\u5355 Refactor \u2014\u2014 Rename\uff09\uff0c\u7136\u540e\u5728\u8f93\u5165\u6846\u4e2d\u8f93\u5165\u8981\u91cd\u547d\u540d\u7684\u540d\u79f0\uff0c\u540c\u65f6\uff0c\u786e\u8ba4\u52fe\u9009 Search for references \u548c Search in comments and strings \u8fd9\u4e24\u4e2a\u9009\u9879\uff0c\u6700\u540e\u6309\u56de\u8f66\u6216\u8005\u9f20\u6807\u70b9 Refactor \u3002 \u6ce8\u610f\uff0c\u6b64\u65f6\u7f16\u8f91\u5668\u53ef\u80fd\u4f1a\u63d0\u793a\u4f60\uff0c\u4f60\u8fd9\u4e2a\u91cd\u547d\u540d\u7684\u64cd\u4f5c\u5173\u8054\u4e86\u591a\u4e2a\u6a21\u5757\uff0c\u5b83\u88ab\u591a\u4e2a\u5730\u65b9\u90fd\u4f7f\u7528\u5230\u4e86\uff0c\u76f8\u5173\u7684\u6a21\u5757\u662f\u5426\u4e5f\u4e00\u8d77\u6539\u540d\u4e86\uff0c\u8fd9\u4e0d\u5e9f\u8bdd\u5417\uff0c\u7528\u8fd9\u4e2a\u529f\u80fd\u5c31\u662f\u60f3\u628a\u5173\u8054\u5230\u7684\u90fd\u4fee\u6539\uff0c\u4e0d\u7136\u6211\u4e3a\u4ec0\u4e48\u4e0d\u7528\u6587\u7ba1\u7684\u91cd\u547d\u540d\u529f\u80fd\u5462\uff0c\u522b\u60f3\u4e86\uff0c\u76f4\u63a5\u70b9\u5de6\u4e0b\u89d2\u7684 Refactor \u6309\u94ae\uff0c\u5c31\u662f\u5e72\u3002 \u7c7b\u540d\u3001\u51fd\u6570\u540d\u7684\u91cd\u547d\u540d\u90fd\u5c3d\u91cf\u91c7\u7528\u8fd9\u79cd\u65b9\u6848\uff0c\u56e0\u4e3a\u7f16\u8f91\u5668\u4f1a\u81ea\u52a8\u7ed9\u6211\u4eec\u627e\u5230\u5173\u8054\u7684\u5730\u65b9\uff0c\u7136\u540e\u540c\u6b65\u4fee\u6539\u6389\u3002\u4f60\u53ef\u5343\u4e07\u522b\u76f4\u63a5\u5220\u4e86\u4fee\u6539\u540d\u79f0\uff0c\u4e0d\u7136\u4f60\u53ef\u80fd\u4f1a\u82b1\u4e0a\u4e00\u5929\u7684\u65f6\u95f4\u6765\u89e3\u51b3\u91cd\u547d\u540d\u7684\u95ee\u9898\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u5b9e\u73b0\u6838\u5fc3\u5e93\u63a5\u53e3","text":"3.1. BaseWidget \u5728 BaseWidget \u91cc\u9762\u628a\u8be5\u5199\u7684\u90fd\u5199\u597d\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u4e0a\u9762\u7684\u8bbe\u8ba1\u7406\u5ff5\u6765\u5199\u3002 \u5982\u679c\u4f60\u5acc\u9ebb\u70e6\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u6587\u7ba1\u7684\u5b9e\u9645\u5de5\u7a0b\u4ee3\u7801 autotest_dde_file_manager : https://gerrit.uniontech.com/admin/repos/autotest_dde_file_manager \u3002 3.2. \u64cd\u4f5c\u5c42 \u5982\u679c\u4f60\u662f\u65b0\u5199\u9879\u76ee\uff0c\u4f60\u4f1a\u53d1\u73b0\u4e00\u5207\u90fd\u662f\u90a3\u4e48\u7684\u7b80\u5355\u3001\u76f4\u63a5\uff0c\u6309\u7167\u6211\u4eec\u63d0\u4f9b\u7ed9\u4f60\u7684\u63a5\u53e3\u5199\u7528\u4f8b\u7684\u64cd\u4f5c\u65b9\u6cd5\u5c31\u597d\u4e86\u3002 \u5982\u679c\u4f60\u662f\u60f3\u5bf9\u539f\u6765\u7684\u5de5\u7a0b\u8fdb\u884c\u6539\u9020\uff0c\u4f60\u9700\u8981\u6309\u7167\u6838\u5fc3\u5e93\u65b9\u6cd5\u7684\u8c03\u7528\uff0c\u5c06\u4f60\u4e4b\u524d\u5199\u7684\u6bcf\u4e2a\u65b9\u6848\u8fdb\u884c\u5bf9\u5e94\u7684\u4fee\u6539\uff0c\u5305\u62ec\u7c7b\u548c\u65b9\u6cd5\u7684\u547d\u540d\u3001\u65b9\u6cd5\u5185\u6240\u8981\u7528\u5230\u4e0d\u540c\u5b9a\u4f4d\u65b9\u6cd5\u7684\u5199\u6cd5\u4fee\u6539\u3002 \u8fd9\u65f6\u5019\u4f60\u53ef\u80fd\u4f60\u7684\u4ee3\u7801\u4e2d\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u62a5\u9519\uff0c\u4e0d\u7528\u62c5\u5fc3\uff0c\u4f60\u53ef\u4ee5\u4ece\u4e1a\u52a1\u903b\u8f91\u51fa\u53d1\uff0c\u60f3\u6e05\u695a\u8fd9\u4e2a\u65b9\u6cd5\u662f\u5e72\u4ec0\u4e48\u7684\u3001\u64cd\u4f5c\u7684\u5bf9\u8c61\u662f\u4ec0\u4e48\u3001\u53c2\u6570\u662f\u4ec0\u4e48\uff0c\u6ce8\u610f\u8fd9\u4e9b\u4fee\u6539\u662f\u4f1a\u5f71\u54cd\u5230\u7528\u4f8b\u4ee3\u7801\u91cc\u9762\u7684\uff0c\u6ca1\u5173\u7cfb\uff0c\u7528\u4f8b\u91cc\u9762\u672c\u6765\u4e5f\u5e94\u8be5\u88ab\u5173\u8054\u4fee\u6539\u3002 3.3. \u628a\u914d\u7f6e\u6a21\u5757\u5199\u597d\uff0c\u8fd9\u90e8\u5206\u57fa\u672c\u53ef\u4ee5\u590d\u5236\u6587\u7ba1\u7684\u4ee3\u7801\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4_1","title":"4\u3001\u8def\u5f84\u5904\u7406","text":"4.1. \u5bfc\u5165\u8def\u5f84 \u65b9\u6cd5\u548c\u7528\u4f8b\u4e2d\u90fd\u4f1a\u6d89\u53ca\u5230\u5bfc\u5165\u8def\u5f84\u7684\u4fee\u6539\uff0c\u5728\u4fee\u6539\u8def\u5f84\u65f6\uff0c\u5efa\u8bae\u4f60\u4f7f\u7528 Ctrl + Shift + R \u5168\u5c40\u66ff\u6362\uff0c\u4f1a\u5c06\u6574\u4e2a\u9879\u76ee\u4e0b\u7684\u76f8\u540c\u5730\u65b9\u90fd\u4fee\u6539\u5230\uff0c\u5f53\u7136\uff0c\u4f60\u4e5f\u53ef\u4ee5\u5728\u5c0f\u5f39\u7a97\u4e2d\u4fee\u6539\u5168\u5c40\u66ff\u6362\u4e3a\u5c40\u90e8\u76ee\u5f55\u4e0b\u66ff\u6362\u3002\u5904\u7406\u90a3\u79cd\u6ca1\u6709\u5173\u8054\u5173\u7cfb\uff0c\u4f46\u662f\u53c8\u662f\u76f8\u540c\u540d\u79f0\u7684\u91cd\u547d\u540d\uff0c\u6211\u4e5f\u63a8\u8350\u4f7f\u7528\u8fd9\u79cd\u65b9\u5f0f\u8fdb\u884c\u91cd\u547d\u540d\u3002 \u6ce8\u610f\uff0c\u5168\u5c40\u66ff\u6362\u7684\u65b9\u5f0f\u4efb\u7136\u65e0\u6cd5\u4fdd\u8bc1\u771f\u7684\u5168\u5c40\u88ab\u66ff\u6362\u4e86\uff08\u53ef\u80fd\u662f\u7f16\u8f91\u5668\u7684 Bug \u5427\uff09\uff0c\u6240\u4ee5\u4f60\u4ecd\u7136\u9700\u8981\u624b\u52a8\u770b\u4e0b\u5404\u5904\u662f\u5426\u4fee\u6539\u5230\u4f4d\u3002 4.2. \u8d44\u6e90\u8def\u5f84 \u4e00\u4e9b\u7528\u4f8b\u8d44\u6e90\u9700\u8981\u6839\u636e config.py \u91cc\u9762\u7684\u8def\u5f84\u914d\u7f6e\u8fdb\u884c\u8d44\u6e90\u8def\u5f84\u7684\u62fc\u63a5\uff0c\u5982\u679c\u4f60\u539f\u6765\u672c\u6765\u5c31\u6709\u4e00\u4e2a\u51fd\u6570\u4e13\u95e8\u7528\u4e8e\u7ec4\u88c5\u8def\u5f84\u7684\uff0c\u90a3\u4f60\u53ea\u9700\u8981\u4fee\u6539\u8fd9\u4e00\u4e2a\u5730\u65b9\u5c31\u597d\u4e86\uff0c\u5982\u679c\u4f60\u4e4b\u524d\u5e76\u6ca1\u6709\u8fd9\u6837\u7684\u8bbe\u8ba1\uff0c\u90a3\u53ef\u80fd\u9700\u8981\u4fee\u6539\u5927\u91cf\u6d89\u53ca\u5230\u8d44\u6e90\u8def\u5f84\u7684\u5730\u65b9\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5","title":"5\u3001\u8c03\u8bd5\u548c\u7f16\u5199\u7528\u4f8b","text":"\u4ee5\u4e0a\u51e0\u4e2a\u6b65\u9aa4\u505a\u5b8c\uff0c\u57fa\u672c\u5c31\u53ef\u4ee5\u8fdb\u884c\u7528\u4f8b\u4ee3\u7801\u7684\u8c03\u8bd5\u4e86\uff0c\u8fd9\u90e8\u5206\u5de5\u4f5c\u4e3b\u8981\u89e3\u51b3\u4f60\u4e4b\u524d\u51e0\u4e2a\u6b65\u9aa4\u9057\u6f0f\u7684\u95ee\u9898\uff0c\u5982\u679c\u6240\u6709\u7528\u4f8b\u90fd\u8c03\u8bd5\u901a\u8fc7\u4e86\uff0c\u90a3\u4e48\u5de5\u7a0b\u6539\u9020\u5c31\u5168\u90e8\u5b8c\u6210\u4e86\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/","title":"AT \u5f00\u53d1\u89c4\u8303","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u5f00\u53d1\u89c4\u8303\u662f\u6839\u636e\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fd0\u884c\u4e24\u5e74\u591a\u6765\uff0c\u9047\u5230\u95ee\u9898\u89e3\u51b3\u95ee\u9898\u800c\u5f62\u6210\u7684\u4e00\u4e9b\u89e3\u51b3\u65b9\u6848\uff0c\u6216\u8005\u8bf4\u7ecf\u9a8c\u603b\u7ed3\uff1b\u8fd9\u4e9b\u7ecf\u9a8c\u7b26\u5408\u6211\u4eec\u73b0\u9636\u6bb5 AT \u6240\u5e94\u7528\u7684\u573a\u666f\u9700\u8981\uff0c\u4e5f\u662f\u6211\u4eec\u7ecf\u8fc7\u957f\u671f\u601d\u8003\uff0c\u4e0d\u65ad\u8bd5\u9519\u4e0d\u65ad\u4fee\u6b63\uff0c\u5e76\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u5b9e\u8df5\u4e2d\u68c0\u9a8c\u8fc7\u53ef\u884c\u7684\u3002\u4ee5\u6b64\uff0c\u5e0c\u671b\u80fd\u5e2e\u52a9\u53c2\u4e0e\u5230\u81ea\u52a8\u5316\u7684\u76f8\u5173\u4eba\u5458\u51cf\u5c11\u8bd5\u9519\u6210\u672c\uff0c\u66f4\u597d\u3001\u66f4\u5feb\u7684\u7f16\u5199\u7528\u4f8b\u53ca\u7ef4\u62a4\u7528\u4f8b\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_1","title":"\u4e00\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u89c4\u8303","text":"\u6807\u7b7e\u5316\u7ba1\u7406\u6587\u6863\u8bf7\u53c2\u8003\uff1a \u300a\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u64cd\u4f5c\u6307\u5f15\u300b \u4ee5\u4e0b\u8bf4\u51e0\u4e2a\u5bb9\u6613\u51fa\u73b0\u7684\u95ee\u9898\uff1a"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1","title":"1. \u5bf9\u5e94\u5173\u7cfb","text":" \u5199\u5b8c\u81ea\u52a8\u5316\u7528\u4f8b\u4e4b\u540e\uff0c\u8bf7\u5728 CSV \u6587\u4ef6\u4e2d\u6807\u8bb0\u7528\u4f8b\u7684 ID\u3001\u7b49\u7ea7\u3002\u4e3a\u4e86\u63d0\u9192\u6807\u8bb0\uff0c\u6267\u884c\u7528\u4f8b\u65f6\u5728\u9996\u884c\u4f1a\u8f93\u51fa ERROR \u65e5\u5fd7\uff1a CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94\u7684 ID\uff1b \u5728\u6700\u7ec8\u63d0\u4ea4\u4ee3\u7801\u4e4b\u524d\uff0c\u4f60\u9700\u8981\u5728 CSV \u6587\u4ef6\u91cc\u9762\u5c06ID\u3001\u7528\u4f8b\u7b49\u7ea7\u7b49\u6807\u7b7e\u8865\u5168\uff0c\u5982\u679c CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94 ID\uff0c\u540e\u7eed\u5728\u6279\u91cf\u6267\u884c\u7684\u65f6\u5019\uff0c\u8fd9\u4e9b\u7528\u4f8b\u662f\u4e0d\u4f1a\u6267\u884c\u7684\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2","title":"2. \u540d\u79f0\u4e00\u81f4","text":" CSV \u6587\u4ef6\u7684\u6587\u4ef6\u540d\u3001\u7528\u4f8b\u51fd\u6570\u4e2d\u95f4\u7684\u540d\u79f0\u4e00\u81f4\u3001\u7528\u4f8b py \u6587\u4ef6\u4e2d\u95f4\u7684\u540d\u79f0\uff0c\u8fd9\u4e09\u4e2a\u540d\u79f0\u4e00\u81f4\u3002 \u4e3e\u4f8b\uff1a # test_music_001.py\ndef test_music_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u90a3\u4e48 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e3a music.csv\u3002 AT \u6846\u67b6\u5e95\u5c42\u4ee3\u7801\u5b9e\u73b0\u662f\u5c06 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e0e\u7528\u4f8b\u51fd\u6570\u540d\u79f0\u540d\u79f0\uff08item.name\uff09\u8fdb\u884c\u5bf9\u5e94\uff0c\u56e0\u6b64\uff0c\u6ce8\u610f CSV \u6587\u4ef6\u540d\u79f0\u5bf9\u5e94\u7684\u662f\u7528\u4f8b\u51fd\u6570\u540d\u79f0\uff0c\u5373 def test_music_001 \u91cc\u9762\u7684 music \uff0c\u800c\u4e0d\u662f test_music_001.py \u91cc\u9762\u7684 music \u3002 \u8fd9\u91cc\u7ec6\u7ec6\u54c1\u4e00\u4e0b\u54c8~ \u5982\u679c\u4f60\u5c06\u4e0a\u4f8b\u5199\u6210\u4e86\u8fd9\u6837: # test_music_001.py\ndef test_movie_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u7528\u4f8b\u6267\u884c\u6ca1\u95ee\u9898\uff0c\u4f46\u662f\u6807\u7b7e\u5316\u7ba1\u7406\u662f\u4e0d\u751f\u6548\u7684\uff0c\u6846\u67b6\u65e0\u6cd5\u5c06 music.csv\u6587\u4ef6\u91cc\u9762\u6807\u7b7e\uff0c\u6dfb\u52a0\u5230 test_movie_001\u8fd9\u4e2a\u7528\u4f8b\u4e2d\uff0c\u56e0\u4e3a\u4ed6\u4eec\u6ca1\u6709\u5bf9\u5e94\u5173\u7cfb\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#tag","title":"\u4e8c\u3001\u5206\u652f\u53ca tag \u7ba1\u7406\u89c4\u8303","text":"\u53c2\u8003\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u4ee3\u7801\u7ba1\u7406\u89c4\u8303\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2-tag","title":"2. \u5e94\u7528\u5e93 tag","text":" \u5e94\u7528\u5e93 tag \u6839\u636e\u5e94\u7528\u4ea4\u4ed8\u8282\u70b9\u751f\u6210\uff0c\u6bcf\u6b21\u6253 tag \u4e4b\u524d\uff0c\u76f8\u5173\u6d4b\u8bd5\u4eba\u5458\u9700\u8981\u8fdb\u884c\u7528\u4f8b\u8c03\u8bd5\uff1b \u8c03\u8bd5\u7528\u4f8b\u662f\u6307\u7684\u5728\u5168\u67b6\u6784\uff08x86\u3001arm\u3001mips\uff09\u4e0a\u8c03\u8bd5\u901a\u8fc7\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\u8fbe\u5230 90% \u4ee5\u4e0a\u624d\u80fd\u6253 tag\uff0c\u901a\u8fc7 Jenkins \u6267\u884c\u5668\u6267\u884c\u7528\u4f8b\uff0c\u4fdd\u7559\u901a\u8fc7\u7387\u7ed3\u679c\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\uff1a\u901a\u8fc7\u7528\u4f8b\u6570 / (\u603b\u7528\u4f8b\u6570 - \u5df2\u5e9f\u5f03\u7528\u4f8b) \u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u7b97\u901a\u8fc7 Jenkins \u6267\u884c\u5668 \u4f60\u53ef\u80fd\u4f1a\u5728\u4e00\u4e2a\u4ea4\u4ed8\u5468\u671f\u5185\u6301\u7eed\u7684\u8fdb\u884cAT\u7528\u4f8b\u8c03\u8bd5\uff0c\u4f46\u662f\u6700\u7ec8 AT \u7528\u4f8b\u6253 tag \u7684\u5e94\u7528\u7248\u672c\uff0c\u9700\u8981\u4f7f\u7528\u5e94\u7528\u96c6\u6210\u4ea4\u4ed8\u7684\u6700\u65b0\u5e94\u7528\u7248\u672c\uff0c\u53ef\u4ee5\u4f7f\u7528\u5e94\u7528\u7684\u63d0\u6d4b\u7248\u672c\uff1b\u4e00\u5b9a\u8981\u786e\u4fdd\u8c03\u8bd5\u7528\u4f8b\u7684\u5e94\u7528\u7248\u672c\u662f\u6700\u65b0\u7684\uff0c\u4e0d\u7136\u96c6\u6210\u8fdb\u53bb\u4e4b\u540e\uff0c\u6301\u7eed\u96c6\u6210\u5c31\u4f1a\u51fa\u95ee\u9898\uff1b tag \u53f7\u600e\u4e48\u6253\uff1f \u6839\u636e\u6301\u7eed\u96c6\u6210\u7684\u8981\u6c42\u751f\u6210\uff0c\u5176\u4e2d\u5e94\u7528\u7248\u672c\u53f7\u9700\u8981\u4e0e\u9879\u76ee\u7ecf\u7406\u786e\u8ba4\u672c\u6b21\u5373\u5c06\u96c6\u6210\u7684\u5e94\u7528\u7248\u672c\u53f7\u662f\u591a\u5c11\uff1b tag \u7684 commit \u4fe1\u606f\u683c\u5f0f\uff1a # commit msg\nversion:5.6.5\n \u5176\u4e2d 5.6.5 \u5199\u5e94\u7528\u7684\u96c6\u6210\u7248\u672c\u53f7\u3002 \u751f\u6210 tag \u7684\u547d\u4ee4\u53c2\u8003\uff1a\u300aGit \u6807\u7b7e\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3-tag","title":"3. \u57fa\u7840\u6846\u67b6 tag","text":"\u57fa\u7840\u6846\u67b6 tag \u4e0d\u4e0e\u4e1a\u52a1\u6302\u94a9\uff0c\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u6309\u9700\u53d1\u5e03\u7248\u672c\uff0c\u5728\u6839\u76ee\u5f55\u4e0b CURRENT \u6587\u4ef6\u4e2d\u8bb0\u5f55\u7684\u5f53\u524d\u7248\u672c\u53f7\u548c\u5386\u53f2\u7248\u672c\u53f7\uff0c\u53ca\u5176\u5bf9\u5e94\u65b0\u589e\u4e86\u54ea\u4e9b\u529f\u80fd\uff0c\u6709\u52a9\u4e8e\u5e94\u7528\u9009\u62e9\u5408\u9002\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\u3002 # CURRENT\n[current]\ntag = 0.9.5\n \u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u7684 control \u6587\u4ef6\u8bb0\u5f55\u5f53\u524d\u5e94\u7528\u5e93\u4f9d\u8d56\u7684\u57fa\u7840\u5e93\u7248\u672c\u3002 # control\n[Depends]\nautotest-basic-frame = 0.9.5\n \u7528\u4f8b\u5728\u6267\u884c\u65f6\u4f1a\u6821\u9a8c\u4e24\u4e2a\u6587\u4ef6\u7684\u7248\u672c\u53f7\u662f\u5426\u4e00\u81f4\uff0c\u5982\u679c\u4e0d\u4e00\u81f4\uff0c\u4f1a\u6253\u5370 error \u65e5\u5fd7\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_2","title":"\u4e09\u3001\u4ed3\u5e93\u6743\u9650\u7ba1\u7406","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_1","title":"1. \u57fa\u7840\u6846\u67b6","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u4ed3\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame \u57fa\u7840\u6846\u67b6\u4e0d\u5141\u8bb8\u533f\u540d\u8bbf\u95ee\uff0c\u5982\u679c\u4f60\u767b\u5f55 gerrit \u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u8bbf\u95ee\u4ee5\u4e0a\u94fe\u63a5\uff0c\u5219\u9700\u8981\u7533\u8bf7\u8bbf\u95ee\u6743\u9650\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_1","title":"2. \u5e94\u7528\u4ed3\u5e93","text":" \u81ea\u52a8\u5316\u5e94\u7528\u4ed3\u5e93\uff1a https://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684 app_name \u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_3","title":"\u56db\u3001\u65b9\u6cd5\u7f16\u5199&\u8c03\u7528\u89c4\u8303","text":"\u65b9\u6cd5\u7f16\u5199\u6574\u4f53\u8bbe\u8ba1\u601d\u8def\u53c2\u8003\uff1a[\u300aAT\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b]"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_2","title":"1. \u65b9\u6cd5\u7f16\u5199","text":"\u5199\u65b9\u6cd5\u7684\u65f6\u5019\u6ce8\u610f\u65b9\u6cd5\u5f52\u5c5e\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget\uff0c\u65b9\u6cd5\u662f\u5728\u54ea\u4e2a\u533a\u57df\u64cd\u4f5c\u7684\uff0c\u5c31\u5199\u5728\u54ea\u4e2a\u7c7b\u91cc\u9762\u3002 \u4e3e\u4f8b\uff1a from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n\"\"\"\u70b9\u51fb\u6807\u9898\u680fxxx\"\"\"\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_2","title":"2. \u65b9\u6cd5\u8c03\u7528","text":" \u5728\u7528\u4f8b\u4e2d\u8c03\u7528\u65b9\u6cd5\uff0c\u901a\u8fc7\u8be5\u5e94\u7528\u552f\u4e00\u7684\u51fa\u53e3\u8fdb\u884c\u8c03\u7528\uff0c\u6bd4\u5982\u6587\u7ba1\uff1a class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n \u4e0d\u8981\u5728\u7528\u4f8b\u4e2d\u5355\u72ec\u53bb\u8c03\u7528 TitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u8fd9\u4e9b\u7c7b\uff0c\u5426\u5219\u540e\u671f\u7528\u4f8b\u4f1a\u53d8\u5f97\u4e0d\u597d\u7ef4\u62a4\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_4","title":"\u4e94\u3001\u7528\u4f8b\u7f16\u5199\u89c4\u8303","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_3","title":"1. \u57fa\u4e8e\u7c7b\u5199\u7528\u4f8b","text":"\u6240\u6709\u7528\u4f8b\u90fd\u5e94\u8be5\u57fa\u4e8e\u7c7b\u53bb\u5199\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001(self):\n\"\"\"\u97f3\u4e50\u542f\u52a8\"\"\"\n \u6ce8\u610f\u4ee5\u4e0b\u51e0\u70b9\uff1a \u7c7b\u540d\u4e0d\u8981\u968f\u4fbf\u53d6\uff0c\u540c\u4e00\u4e2a\u5e94\u7528\u5e94\u8be5\u4f7f\u7528\u540c\u4e00\u4e2a\u7c7b\u540d\uff0c\u7528\u4f8b\u7c7b\u540d\u79f0\u5fc5\u987b\u4ee5 Test \u5f00\u5934\uff0c\u9075\u5faa\u5927\u9a7c\u5cf0\u547d\u540d\u89c4\u8303\uff1b \u7528\u4f8b\u7c7b\u7ee7\u627f BaseCase\uff0c\u4e00\u4e2a\u5e94\u7528\u53ea\u6709\u4e00\u4e2a BaseCase \u4e00\u4e2a py \u6587\u4ef6\u91cc\u9762\u53ea\u6709\u4e00\u4e2a\u7c7b\uff0c\u6211\u4eec\u79f0\u4e3a\u4e00\u4e2a\u6d4b\u8bd5\u7c7b\uff1b \u4e00\u4e2a\u7c7b\u91cc\u9762\u53ef\u4ee5\u6709\u591a\u4e2a\u7528\u4f8b\u51fd\u6570\uff0c\u8fd9\u53d6\u51b3\u8fd9\u6761\u7528\u4f8b\u6709\u591a\u5c11\u4e2a\u6d4b\u8bd5\u70b9\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001_1(self):\n\"\"\"\u4efb\u52a1\u680f\u542f\u52a8\u97f3\u4e50\"\"\"\ndef test_music_001_2(self):\n\"\"\"\u542f\u52a8\u5668\u542f\u52a8\u97f3\u4e50\"\"\" \ndef test_music_001_3(self):\n\"\"\"\u684c\u9762\u542f\u52a8\u97f3\u4e50\"\"\"\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_3","title":"2. \u7528\u4f8b\u51fd\u6570\u89c4\u8303","text":" \u7528\u4f8b\u51fd\u6570\u4ee5 test \u5f00\u5934\uff0c\u9075\u5faa\u86c7\u5f62\u547d\u540d\u89c4\u8303\uff0c\u4e2d\u95f4\u4e3a\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0\uff0c\u540e\u9762\u52a0\u7528\u4f8b ID\uff0c\u6700\u540e\u52a0\u6d4b\u8bd5\u70b9\u5e8f\u53f7\uff0c\u5373 test_${module}_${case_id}[_${index}] \uff1b \u6bd4\u5982\uff1atest_music_001_1\uff0cindex \u4ece 1 \u5f00\u59cb\u3002 \u51fd\u6570\u529f\u80fd\u8bf4\u660e\u91cc\u9762\u5199\u7528\u4f8b\u6807\u9898\uff0c\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u6807\u9898\u5373\u53ef\uff0c\u6ce8\u610f\u7528\u4e09\u5bf9\u53cc\u5f15\u53f7\uff0c\u4e0d\u8981\u7528\u5176\u4ed6\u6ce8\u91ca\uff0c\u66f4\u4e0d\u8981\u7528\u4e95\u53f7\u6ce8\u91ca\u5199\u7528\u4f8b\u6807\u9898\uff1b \u76f4\u63a5\u590d\u5236 PMS \u7528\u4f8b \u7528\u4f8b\u6b65\u9aa4\u76f4\u63a5\u5c06 PMS \u4e0a\u7528\u4f8b\u6b65\u9aa4\u548c\u9884\u671f\u590d\u5236\u8fdb\u6765\uff0c\u7136\u540e\u8fdb\u884c\u6279\u91cf\u6ce8\u91ca\uff08ctrl + /\uff09\uff0c\u5728\u6ce8\u91ca\u7684\u57fa\u7840\u4e0a\u53bb\u5199\u7528\u4f8b\u811a\u672c\u4f1a\u66f4\u52a0\u65b9\u4fbf\u5168\u9762\uff0c\u4e5f\u6bd4\u4f60\u81ea\u5df1\u5199\u6ce8\u91ca\u66f4\u8282\u7ea6\u65f6\u95f4\uff1a \u4e3e\u4f8b\uff0cPMS \u7528\u4f8b\uff1a \u76f4\u63a5\u9009\u4e2d\u7528\u4f8b\u5185\u5bb9\uff0c\u590d\u5236\u4e0b\u6765\uff0c\u7136\u540e\u7c98\u8d34\u5230\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c\u4e2d\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\n \u4e0a\u4f8b\u4e2d\u4e95\u53f7\u6ce8\u91ca\u90e8\u5206\u5c31\u662f\u76f4\u63a5\u4ece PMS \u4e0a\u590d\u5236\u8fc7\u6765\u7684\uff0c\u5728\u6b64\u57fa\u7840\u4e0a\u5199\u7528\u4f8b\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\nmusic = DeepinMusicWidget()\nmusic.click_singer_btn_in_music_by_ui()\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\nmusic.click_icon_mode_in_music_by_ui()\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\nmusic.double_click_first_singer_in_singer_icon_view_by_ui()\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\nself.assert_xxx\n \u4f60\u770b\uff0c\u975e\u5e38\u6e05\u695a\u6bcf\u4e00\u6b65\u5728\u505a\u4ec0\u4e48\uff0c\u91cd\u70b9\u662f\u7701\u53bb\u4e86\u5199\u6ce8\u91ca\u7684\u65f6\u95f4\uff0c\u771f\u7684\u7092\u9e21\u65b9\u4fbf\u3002 \u4e0d\u5199 if __name__ == '__main__':\uff0c\u4e0d\u5199\u591a\u4f59\u7684\u4ee3\u7801\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3","title":"3. \u6570\u636e\u9a71\u52a8","text":" \u5982\u679c\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u662f\u76f8\u540c\u7684\uff0c\u53ea\u662f\u4e00\u4e9b\u53c2\u6570\u53d8\u5316\uff0c\u5c3d\u91cf\u4f7f\u7528\u6570\u636e\u9a71\u52a8\u6765\u5b9e\u73b0\u7528\u4f8b\uff1b \u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u6570\u636e\u9a71\u52a8\u7684\u6570\u636e\uff0c\u4e0d\u80fd\u56e0\u6b64\u5f15\u5165\u4f9d\u8d56\uff0c\u5c3d\u91cf\u4f7f\u7528\u4e00\u4e9b\u6807\u51c6\u5e93\u80fd\u8bfb\u53d6\u7684\u6587\u4ef6\u683c\u5f0f\uff0c\u6bd4\u5982 json\u3001ini\u3001CSV\u3001xml\u3001txt \u7b49\u6587\u4ef6\u683c\u5f0f\uff1b\u4e0d\u5efa\u8bae\u4f7f\u7528 Yaml\u3001Excel\u3001MySQL \u7b49\u6570\u636e\u683c\u5f0f\uff1b \u8bfb\u53d6\u6570\u636e\u65f6\u4e5f\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff0c\u5982\u4f7f\u7528 pandas \u5904\u7406 CSV \u5c31\u5c5e\u4e8e\u5927\u6750\u5c0f\u7528\u4e86\uff0c\u6b63\u5e38\u7684\u6570\u636e\u9a71\u52a8\u8fd8\u6ca1\u5230\u9700\u8981\u5927\u6570\u636e\u5206\u6790\u6765\u5904\u7406\u7684\u5730\u6b65\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u5728 widget/ddt/ \u76ee\u5f55\u4e0b\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5199\u6cd5\uff1a @pytest.mark.parametrize(\"value\", data)\ndef test_smb_049(self, value):\n \u4ee5\u4e0a\u8fd9\u79cd\u53c2\u6570\u5316\u7684\u5199\u6cd5\u672c\u8eab\u6ca1\u4ec0\u4e48\u95ee\u9898\uff0c\u4f46\u662f\uff0c\u8fd9\u91cc\u5fc5\u987b\u8981\u8865\u5145\u4e00\u4e2a\u6ca1\u6709\u7528\u7684\u5c0f\u77e5\u8bc6\uff1a \u5982\u679c\u53c2\u6570\u5316\u6570\u636e\u91cc\u9762\u7684\u5b57\u7b26\u4f1a\u539f\u5c01\u4e0d\u52a8\u7684\u8f93\u51fa\u5230 item.name \u91cc\u9762\uff0c\u663e\u793a\u975e\u5e38\u4e0d\u4f18\u96c5\uff0c\u800c\u4e14\u53ef\u4ee5\u4f1a\u5f15\u5165\u4e00\u4e9b\u610f\u60f3\u4e0d\u5230\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u611f\u53d7\u4e00\u4e0b\uff1a \u53c2\u6570\uff1a data = [\n\"\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\", \"qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678\",\n]\n \u73b0\u8c61\u662f\u8fd9\u6837\u8272\u513f\u7684\uff1a test_smb_049.py::TestFileManager::test_smb_049[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09]\ntest_smb_049.py::TestFileManager::test_smb_049[qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui]\ntest_smb_049.py::TestFileManager::test_smb_049[12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678]\n \u8bf4\u5b9e\u8bdd\uff0c\u770b\u7740\u5fc3\u91cc\u5835\u5f97\u614c\uff0c\u5982\u679c\u8fd9\u91cc\u9762\u5305\u542b\u4e00\u4e9b\u7279\u6b8a\u5b57\u7b26\u6216\u8005\u662f\u8d85\u957f\uff0c\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u5f88\u5947\u5999\u7684\u4e8b\u60c5\u53d1\u751f\u3002 parametrize \u91cc\u9762\u6709\u4e2a\u53c2\u6570\uff1aids\uff0c\u53ef\u4ee5\u89e3\u51b3\u6b64\u7c7b\u95ee\u9898\uff0c\u5c31\u50cf\u8fd9\u6837\uff1a @pytest.mark.parametrize(\"value\", data, ids=[1, 2, 3])\ndef test_smb_049(self, value):\n \u518d\u6765\u611f\u53d7\u4e00\u4e0b\uff1a test_smb_049.py::TestFileManager::test_smb_049[1]\ntest_smb_049.py::TestFileManager::test_smb_049[2]\ntest_smb_049.py::TestFileManager::test_smb_049[3]\n \u660e\u663e\u597d\u591a\u4e86\uff0c\u6240\u4ee5\u5c3d\u91cf\u4f7f\u7528 ids \u8fd9\u4e2a\u53c2\u6570\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 fixture \u7684\u6570\u636e\u9a71\u52a8\u65b9\u5f0f\uff0c\u6846\u67b6\u867d\u7136\u652f\u6301\uff0c\u4f46\u53ef\u8bfb\u6027\u6bd4\u8f83\u5dee\uff1b\u5982\u679c\u4f60\u4e0d\u77e5\u9053\u8fd9\u53e5\u8bdd\u5728\u8bf4\u5565\uff0c\u90a3\u4f60\u53ef\u4ee5\u5ffd\u7565\uff0c\u6211\u4e5f\u4e0d\u6253\u7b97\u8be6\u7ec6\u8bf4\u8fd9\u79cd\u5b9e\u73b0\u65b9\u5f0f\uff0c\u64cd\u4f5c\u6bd4\u8f83\u9a9a\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4","title":"4. \u65ad\u8a00\u8d44\u6e90","text":" \u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u76f4\u63a5\u653e\u5728\u7528\u4f8b\u6a21\u5757\u7684\u540c\u7ea7\u76ee\u5f55\u4e0b\u7684 assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0 + \u7528\u4f8b ID \u547d\u540d\uff1b \u56fe\u50cf\u8bc6\u522b\u65ad\u8a00\uff0c\u4e0d\u8981\u622a\u53d6\u4e00\u5f20\u5f88\u5927\u7684\u56fe\uff0c\u56fe\u7247\u8d44\u6e90\u5305\u542b\u7684\u5143\u7d20\u592a\u591a\u4e86\uff0c\u975e\u5e38\u5bb9\u6613\u53d7\u5230\u9700\u6c42\u5f71\u54cd\uff0c\u5efa\u8bae\u662f\u8fdb\u884c\u5c40\u90e8\u7684\u65ad\u8a00\uff1b \u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u5339\u914d\u5ea6\u662f 0.9\uff0c\u5982\u679c\u65ad\u8a00\u7684\u573a\u666f\u5bf9\u4e8e\u7cbe\u786e\u5ea6\u8981\u6c42\u6ca1\u90a3\u4e48\u9ad8\uff0c\u53ef\u4ee5\u5728\u65ad\u8a00\u8bed\u53e5\u91cc\u9762\u4f20\u5165\u5c0f\u4e8e 0.9 \u7684\u53c2\u6570\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5","title":"5. \u5143\u7d20\u5b9a\u4f4d","text":" \u7528\u4e8e\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u4e2d\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u547d\u540d\u4e3a\u8be5\u5143\u7d20\u7684\u540d\u79f0\uff1b \u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u622a\u53d6\u65f6\u5c3d\u91cf\u7cbe\u786e\u5230\u8fd9\u4e2a\u5177\u4f53\u7684\u6309\u94ae\uff0c\u56fe\u7247\u4e5f\u4e0d\u8981\u592a\u5927\uff1b \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u64cd\u4f5c\u8f83\u5feb\uff0c\u5408\u7406\u52a0\u5165\u7b49\u5f85\u65f6\u95f4\u80fd\u63d0\u9ad8\u7528\u4f8b\u7684\u7a33\u5b9a\u6027\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6","title":"6. \u7528\u4f8b\u8d44\u6e90","text":" \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u4f7f\u7528\u5230\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u6bd4\u5982\u97f3\u4e50\u53ef\u80fd\u9700\u8981\u4e00\u4e9b mp3 \u7684\u8d44\u6e90\u7528\u4e8e\u6d4b\u8bd5\uff0c\u5b58\u653e\u5728 widget/case_res \u76ee\u5f55\u4e0b\uff0c\u524d\u63d0\u662f\u8fd9\u4e9b\u8d44\u6e90\u4e0d\u8d85\u8fc7 10M\uff1b \u5982\u679c\u662f\u4e00\u4e9b\u6bd4\u8f83\u5927\u7684\u8d44\u6e90\uff0c\u5efa\u8bae\u653e\u5230\u7edf\u4e00\u7684 ftp \u670d\u52a1\u5668 \uff08ftp://10.8.10.245\uff09\uff0c\u9700\u8981\u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\u518d\u4e0b\u8f7d\u4e0b\u6765\uff1b f\"wget ftp://{Config.FTP_IP}/uploads/\u591a\u5a92\u4f53/\u5f71\u9662/auto/{file_name};unzip {file_name};rm -rf {file_name};\"\n \u6d4b\u8bd5\u8d44\u6e90\u4e0b\u8f7d\u5230\u5e94\u7528 widget/case_res \u76ee\u5f55\u4e0b\uff1b \u7981\u6b62\u5c06\u6d4b\u8bd5\u8d44\u6e90\u5b58\u653e\u5728\u4e2a\u4eba\u7684\u673a\u5668\u4e0a\uff1b \u5e94\u8be5\u5c3d\u91cf\u4fdd\u8bc1\uff0c\u4e00\u4e2a\u8d44\u6e90\u5728\u4e00\u6b21\u7528\u4f8b\u6267\u884c\u4e2d\u53ea\u9700\u8981\u4e0b\u8f7d\u4e00\u6b21\uff0c\u6240\u4ee5\u4f60\u4e0d\u80fd\u6bcf\u6b21\u4f7f\u7528\u7684\u65f6\u5019\u90fd\u53bb\u4e0b\u8f7d\uff0c\u8fd9\u6837\u53ef\u80fd\u4f1a\u8017\u8d39\u5927\u91cf\u7684\u7f51\u7edc\u8d44\u6e90\uff0c\u800c\u56e0\u4e3a\u5148\u5224\u65ad\u672c\u5730\u662f\u5426\u5b58\u5728\u6b64\u8d44\u6e90\uff0c\u5982\u679c\u4e0d\u5b58\u5728\u518d\u53bb\u4e0b\u8f7d\uff1b \u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u5c06\u8d44\u6e90\u62f7\u8d1d\u5230\u5bf9\u5e94\u7684\u6d4b\u8bd5\u76ee\u5f55\u4e0b\uff0c\u6bd4\u5982\u5c06 mp3 \u6587\u4ef6\u62f7\u8d1d\u5230 ~/Music \u76ee\u5f55\u4e0b\uff0c\u4f46\u662f\u6211\u4eec\u66f4\u5efa\u8bae\u4f60\u4f7f\u7528\u53d1\u9001\u5feb\u6377\u94fe\u63a5\u7684\u65b9\u5f0f\u66ff\u4ee3\u62f7\u8d1d\u7684\u64cd\u4f5c\uff0c\u56e0\u4e3a\u5728\u62f7\u8d1d\u5927\u6587\u4ef6\u65f6\u662f\u5f88\u6d88\u8017\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u800c\u521b\u5efa\u94fe\u63a5\u5219\u4e0d\u4f1a\uff1b @classmethod\ndef recovery_many_movies_in_movie_by_cmd(cls):\n\"\"\"\u6062\u590d\u591a\u4e2a\u89c6\u9891\u6587\u4ef6\u81f3\u89c6\u9891\u76ee\u5f55\u4e2d\"\"\"\nwork_path = f\"/home/{Config.USERNAME}/Videos/auto\"\ncode_path = f\"{Config.CASE_RES_PATH}/auto\"\ncls.run_cmd(f\"rm -rf {work_path};mkdir {work_path}\")\nsleep(1)\nflag = False\nif not exists(code_path):\ncls.run_cmd(f\"mkdir -p {code_path}\")\nflag = True\nlogger.info(f\"ln -s {code_path}/* {work_path}/\")\ncls.run_cmd(\nf\"cd {code_path}/;\"\nf\"{cls.wget_file('auto.zip') if flag else ''}\"\nf\"ln -s {code_path}/* {work_path}/ > /dev/null 2>&1\"\n)\n \u8d44\u6e90\u4e0b\u8f7d\u8fc7\u7a0b\u4e2d\u6ce8\u610f\u8d85\u65f6\u7684\u95ee\u9898\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u5f88\u5927\uff0c\u8981\u7279\u522b\u6ce8\u610f\u8fd9\u95ee\u9898\uff0c\u5982\u679c\u4f60\u4f7f\u7528\u5f3a\u5236\u7b49\u5f85\u4e0b\u8f7d\u7ed3\u675f( os.system )\uff0c\u53ef\u80fd\u4f1a\u9020\u6210\u7528\u4f8b\u6267\u884c\u65f6\u957f\u53d8\u5f97\u4e0d\u53ef\u63a5\u53d7\uff0c\u76ee\u524d\u6211\u4eec\u53d1\u73b0\u5728\u6301\u7eed\u96c6\u6210\u73af\u5883\u6267\u884c\u65f6\u7f51\u7edc\u4e0b\u8f7d\u901f\u5ea6\u5f88\u6162\uff0c\u6240\u4ee5\u8d85\u65f6\u673a\u5236\u662f\u5f88\u6709\u5fc5\u8981\u7684\uff1brun_cmd \u65b9\u6cd5\u6709\u4e00\u4e2a\u9ed8\u8ba4\u8d85\u65f6\u7684\u65f6\u95f4\uff0c\u4f60\u53ef\u4ee5\u6839\u636e\u8d44\u6e90\u5927\u5c0f\u5bf9\u8d85\u65f6\u65f6\u95f4\u8fdb\u884c\u8c03\u6574\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_5","title":"\u516d\u3001\u7528\u4f8b\u8c03\u8bd5\u6280\u5de7","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_4","title":"1. \u65e5\u5fd7","text":" \u4e00\u5b9a\u8981\u5148\u770b\u62a5\u9519\uff0c\u770b error \u65e5\u5fd7\uff0c\u901a\u5e38\u80fd\u660e\u786e\u7684\u544a\u8bc9\u4f60\u5177\u4f53\u54ea\u91cc\u4ee3\u7801\u62a5\u9519\uff1b \u7ed3\u5408\u62a5\u9519\u70b9\u524d\u9762\u7684error\u3001 info \u548c debug \u65e5\u5fd7\u770b\u5426\u662f\u6b63\u5e38\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_4","title":"2. \u65ad\u70b9\u8c03\u8bd5","text":" \u65b9\u6cd5\u62a5\u9519\uff1a \u5728\u65b9\u6cd5\u5e93\u4e2d\u627e\u5230\u5bf9\u5e94\u7684\u65b9\u6cd5\uff0c\u5355\u72ec\u8c03\u7528\uff0c\u770b\u662f\u5426\u80fd\u6b63\u5e38\u6267\u884c\uff1b \u901a\u5e38\u5355\u4e2a\u65b9\u6cd5\u7684\u6267\u884c\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u62a5\u9519\uff0c\u5f88\u5feb\u5c31\u80fd\u6392\u67e5\u51fa\u95ee\u9898\uff1b\u5728\u65b9\u6cd5\u5185\u90e8\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u65b9\u6cd5\u5185\u90e8\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u8c03\u7528\u6ca1\u95ee\u9898\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u62a5\u9519\u7684\u65b9\u6cd5\u524d\u9762\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u7528\u4f8b\u7684\u4e1a\u52a1\u903b\u8f91\u548c\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u65ad\u8a00\u62a5\u9519\uff1a \u65ad\u8a00\u4e3a\u6570\u636e\u65ad\u8a00\uff0c\u6839\u636e\u8868\u8fbe\u5f0f\u8fdb\u884c\u65ad\u8a00\u8bed\u53e5\u8fdb\u884c\u4fee\u6539\uff1b \u6587\u4ef6\u751f\u6210\u7c7b\u65ad\u8a00\uff0c\u67e5\u770b\u662f\u5426\u9700\u8981\u52a0\u7b49\u5f85\u65f6\u95f4\uff1b \u56fe\u50cf\u65ad\u8a00\uff0c\u5728\u65ad\u8a00\u8bed\u53e5\u5904\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u7528\u4f8b\u8fd0\u884c\u5230\u65ad\u8a00\u5904\u4f1a\u505c\u6b62\uff0c\u67e5\u770b\u6b64\u65f6\u65ad\u8a00\u7684\u56fe\u7247\u4e0e\u7528\u4f8b\u6267\u884c\u7684\u73b0\u573a\u5b58\u5728\u4ec0\u4e48\u5dee\u5f02\uff0c\u6b64\u65f6\u4e5f\u53ef\u4ee5\u8fdb\u884c\u91cd\u65b0\u622a\u56fe\uff0c\u4ece\u800c\u66ff\u6362\u65b0\u7684\u56fe\u7247\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3_1","title":"3. \u8fdc\u7a0b\u6267\u884c","text":" \u8fdc\u7a0b\u6267\u884c\u6307\u7684\u662f\u7f16\u8f91\u5668\u901a\u8fc7\u6307\u5b9a\u8fdc\u7a0b\u89e3\u91ca\u5668\u6267\u884c\u81ea\u52a8\u5316\u4ee3\u7801\uff1b \u8fdc\u7a0b\u6267\u884c\u7684\u597d\u5904\u662f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u7684 Debug \u8fd0\u884c\uff0c\u4e0d\u7528\u5728\u6d4b\u8bd5\u673a\u4e0a\u6253\u5f00\u7f16\u8f91\u5668\uff0c\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u66f4\u5feb\uff1b \u652f\u6301\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u7684\u7f16\u8f91\u5668\uff1a \u4e13\u4e1a\u7248 Pycharm VScode \uff0c\u9700\u8981\u4f7f\u7528\u63d2\u4ef6 Remote-SSH \u8fdc\u7a0b\u6267\u884c\u914d\u7f6e \u4ee5 Pycharm \u4e3a\u4f8b\uff1a File \u2014> Settings \u2014> Project \u2014> Python Interpreter \u2014> \u53f3\u8fb9\u8bbe\u7f6e\u6309\u94ae \u2014> Add... \u2014> SSH Interpreter \u2014> New server configuration(\u586b\u5165host\u548cusername) \u2014> Next \u2014> password\uff08\u6d4b\u8bd5\u673a\u5bc6\u7801\uff09 \u2014> Interpreter(\u9009\u62e9\u8fdc\u7a0b\u89e3\u91ca\u5668) \u2014> Finish "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4_1","title":"4. \u73af\u5883\u6e05\u7406","text":" \u5982\u679c\u7528\u4f8b\u91cc\u9762\u7684 teardown \u6ca1\u6709\u6267\u884c\uff0c\u5927\u6982\u7387\u662f\u56e0\u4e3a setup \u91cc\u9762\u4ee3\u7801\u62a5\u9519\uff0c\u8fd9\u4e24\u4e2a\u662f\u4e00\u5bf9\u7684\uff0csetup \u91cc\u9762\u62a5\u9519\uff0cteardown \u91cc\u9762\u7684\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\uff1b \u76ee\u524d\u6211\u4eec\u5df2\u7ecf\u5c06\u5404\u5e94\u7528\u7684 clean_all \u8fd9\u4e2a fixture \u6539\u6210\u4e86\u7ec8\u7ed3\u5668\uff0c\u786e\u4fdd\u59cb\u7ec8\u80fd\u6267\u884c\u5230\u8fd9\u6b65\uff0c\u4f46\u662f\u7528\u4f8b\u91cc\u9762\u7684 fixture\uff0c\u8fd8\u662f\u9700\u8981\u6211\u4eec\u5c0f\u5fc3\u5904\u7406\uff1b \u8981\u6267\u884c clean_all \u9700\u8981\u5728\u7f16\u8f91\u5668\u8fd0\u884c\u53c2\u6570\u52a0 --clean yes\uff0c\u5199\u7528\u4f8b\u7684\u65f6\u5019\u8bf7\u52a0\u4e0a\uff0c\u4e0d\u7136\u4f60\u4e0d\u786e\u5b9a\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u7684\u73af\u5883\u662f\u5426\u6062\u590d\uff1b setup \u53ef\u4ee5\u4e0d\u8981\uff0c\u5c06 setup \u653e\u5230\u7528\u4f8b\u91cc\u9762\u662f\u4e00\u79cd\u7a33\u59a5\u7684\u505a\u6cd5\uff0cteardown \u4e00\u5b9a\u8981\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5_1","title":"5. \u5143\u7d20\u5b9a\u4f4d\u4e0d\u51c6\uff08\u5750\u6807\u8fd4\u56de\u4e0d\u5bf9\uff09","text":" \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u53ef\u80fd\u53d7\u5230\u7a97\u53e3 ID \u7684\u53d8\u5316\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u9ed8\u8ba4\u53d6\u6700\u65b0\u7684\u4e00\u4e2a\u7a97\u53e3\u7528\u4e8e\u5b9a\u4f4d\uff0c\u4f46\u5982\u679c\u5b9e\u9645\u9700\u8981\u5b9a\u4f4d\u7684\u4e0d\u662f\u6700\u65b0\u7684\u7a97\u53e3\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u91cd\u65b0\u5b9e\u4f8b\u5316\u65b9\u6cd5\u7c7b\u5bf9\u8c61\uff0c\u5e76\u5728\u7c7b\u4e2d\u4f20\u5165\u5bf9\u5e94\u7684\u7a97\u53e3\u5e8f\u53f7\uff1b \u57fa\u4e8e\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u76ee\u524d\u9047\u5230\u7684\u7b14\u8bb0\u672c\u4e0a\uff0c\u7531\u4e8e\u5c4f\u5e55\u7f29\u653e\u6bd4\u4f8b\u4e3a 1.25\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u6211\u4eec\u9ed8\u8ba4\u4f7f\u7528\u7f29\u653e\u6bd4\u4f8b\u4e3a 1\uff1b \u57fa\u4e8e\u56fe\u50cf\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u76ee\u6807\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b \u57fa\u4e8e OCR \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u6587\u5b57\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u540c\u6837\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6_1","title":"6. \u952e\u9f20\u64cd\u4f5c\u4e0d\u51c6","text":" \u9f20\u6807\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6bd4\u5982\u53f3\u952e\u3001\u53cc\u51fb\u65e0\u54cd\u5e94\uff1b \u952e\u76d8\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6216\u8005\u5ef6\u8fdf\u8f93\u5165\uff0c\u6bd4\u5982\u7528\u4f8b\u9700\u8981\u8f93\u5165\u201c\u6211\u662f\u4e2d\u56fd\u4eba\u201d\uff0c\u5b9e\u9645\u53ea\u8f93\u5165\u4e86\u201c\u6211\u56fd\u4eba\u201d\uff1b \u4ee5\u4e0a\u95ee\u9898\u6392\u9664\u5e94\u7528\u5361\u987f\u7b49\u95ee\u9898\uff0c\u5927\u6982\u7387\u662f\u7531\u4e8e\u5de5\u5177\u7684\u95ee\u9898\uff0c\u76ee\u524d\u952e\u9f20\u64cd\u4f5c\u6211\u4eec\u4f7f\u7528\u4e09\u4e2a\u5de5\u5177\uff1aDogtail \u63d0\u4f9b\u7684\u952e\u9f20\u5de5\u5177\u3001PyAutoGUI\u3001Xdotool \uff1b \u6709\u540c\u5b66\u53ef\u80fd\u8981\u8bf4\u4e3a\u5565\u8981\u7528\u4e09\u4e2a\u554a\uff0c\u7528\u4e00\u4e2a\u4e0d\u5c31\u597d\u4e86\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u5404\u6709\u4f18\u70b9\u5404\u6709\u7f3a\u70b9\u3002 \u5982\u679c\u4f60\u9047\u5230\u952e\u9f20\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u8bd5\u8bd5\u901a\u8fc7\u4e0d\u540c\u7684\u5de5\u5177\u64cd\u4f5c\uff1b\u952e\u76d8\u8f93\u5165\u5ef6\u8fdf\u7684\u95ee\u9898\uff0c\u4e00\u822c\u662f\u56e0\u4e3a\u8f93\u5165\u901f\u5ea6\u592a\u5feb\u4e86\uff0c\u7cfb\u7edf\u6ca1\u53cd\u5e94\u8fc7\u6765\uff0c\u5e38\u89c1\u4e8e ARM \u548c MIPS \u4e0a\uff0c\u4fee\u6539\u53c2\u6570 delay_time \u7684\u503c\uff0c\u5355\u4f4d\u4e3a\u6beb\u79d2\uff1b # mouse_key.py\n@classmethod\ndef input_message(cls, message, delay_time=300, interval=0.2):\n\"\"\"\n \u8f93\u5165\u5b57\u7b26\u4e32\n :param message: \u8f93\u5165\u7684\u5185\u5bb9\n :param delay_time: \u5ef6\u8fdf\u65f6\u95f4\n :param interval:\n :return:\n \"\"\"\n \u5982\u679c\u4e0d\u662f\u65b9\u6cd5\u7684\u95ee\u9898\uff0c\u5219\u9700\u8981\u7ee7\u7eed\u548c\u5f00\u53d1\u4e00\u8d77\u6392\u9664\uff0c\u662f\u5426\u4e3a\u5e94\u7528\u63a5\u53d7\u952e\u9f20\u4fe1\u53f7\u5904\u7406\u7684\u95ee\u9898\uff0c\u8fd9\u7c7b\u60c5\u51b5\u6211\u4eec\u4e5f\u662f\u9047\u5230\u8fc7\u7684\uff0c\u5177\u4f53\u95ee\u9898\u5177\u4f53\u5206\u6790\u3002 \u6bd4\u5982\u5f71\u9662\u5c31\u91cd\u5199\u4e86\u4e00\u4e2a\u53f3\u952e\u7684\u65b9\u6cd5\uff1a # base_widget.py\n@classmethod\ndef right_click(cls, _x=None, _y=None):\n\"\"\"\n \u91cd\u5199\u5e95\u5c42\u5355\u51fb\u9f20\u6807\u53f3\u952e\n \u89e3\u51b3\u5f71\u9662\u53f3\u952e\u89e6\u53d1release\u4e8b\u4ef6\u7684\u95ee\u9898\uff08\u53f3\u952e\u4e3b\u7a97\u53e3\u4f1a\u64ad\u653e\u89c6\u9891\uff09\n \"\"\"\ncls.mouse_down(_x, _y, button=3)\nsleep(0.1)\ncls.mouse_up(button=3)\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_6","title":"\u4e03\u3001\u5176\u4ed6\u4e0d\u4e3a\u4eba\u77e5\u7684\u7ec6\u8282","text":" \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u5c3d\u91cf\u7f16\u5199\u540c\u4e00\u4e2a\u5e94\u7528\u6216\u6a21\u5757\u7684\u7528\u4f8b\uff0c\u80fd\u5bf9\u8be5\u7528\u4f8b\u5df2\u6709\u65b9\u6cd5\u719f\u6089\uff0c\u907f\u514d\u8fc7\u591a\u91cd\u590d\u4e1a\u52a1\u4ee3\u7801\u7684\u5c01\u88c5\uff1b \u76f8\u540c\u7684\u573a\u666f\u4e0b\uff0c\u5404\u67b6\u6784\u7b49\u5f85\u65f6\u95f4\u4e0d\u540c\uff0c\u5efa\u8bae\u4f7f\u7528\u6846\u67b6\u63d0\u4f9b\u7684 sleep\uff0c\u6211\u4eec\u505a\u4e86\u4e0d\u540c\u67b6\u6784\u7684\u500d\u6570\u653e\u5927\uff1b \u7f16\u5199\u7528\u4f8b\u65f6\uff0c\u5c3d\u91cf\u8003\u8651\u5230\u6bcf\u4e00\u6b65\u5f02\u5e38\u540e\u7684\u73af\u5883\u6062\u590d\uff0c\u9700\u8981\u5efa\u8bae\u8fd9\u79cd\u610f\u8bc6\uff0c\u968f\u65f6\u8981\u8003\u8651\u5230\uff0c\u8fd9\u6b65\u64cd\u4f5c\u6709\u6ca1\u6709\u53ef\u80fd\u51fa\u9519\uff0c\u51fa\u9519\u4e86\u6539\u600e\u4e48\u529e\uff1b \u63d0\u4ea4\u4ee3\u7801\u7684\u65f6\u5019\u6ce8\u610f\u4e0d\u8981\u628a\u4e00\u4e9b\u4e34\u65f6\u7684\u6d4b\u8bd5\u8d44\u6e90\u63d0\u4ea4\u8fdb\u53bb\u4e86\uff0c\u6bd4\u5982\u6d4b\u8bd5\u4e86\u4e00\u4e2a\u5f71\u7247\uff0c\u6709\u4e9b\u540c\u5b66\u4e60\u60ef\u4f7f\u7528 git add . \uff0c\u7136\u540e\u5c31\u5168\u90e8\u63d0\u4ea4\u5230\u4ee3\u7801\u4ed3\u5e93\u4e86\uff0c\u8fd9\u6837\u5373\u4f7f\u540e\u671f\u628a\u5927\u6587\u4ef6\u5220\u4e86\uff0c.git \u6587\u4ef6\u91cc\u9762\u4e5f\u4f1a\u5f88\u5927\uff0c\u9020\u6210\u4ee3\u7801\u4ed3\u5e93\u53d8\u5f97\u5341\u5206\u81c3\u80bf\u3002 \u66f4\u591a\u7ec6\u8282\u67e5\u770b\uff1a\u300aAT\u7ecf\u9a8c\u603b\u7ed3\u300b"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/","title":"AT \u6267\u884c\u5668\u4f7f\u7528\u6307\u5317","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/5/25\n# Author : litao\n# =============================================\n Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1","title":"1\u3001\u529f\u80fd\u4ecb\u7ecd","text":" \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7cfb\u7edf\u8bed\u8a00\u8bbe\u7f6e\uff0c\u5206\u8fa8\u7387\u8bbe\u7f6e\u53ca\u7528\u4f8b\u6267\u884c\u73af\u5883\u642d\u5efa\uff1b \u652f\u6301 IP \u4e3a 15 \u7f51\u6bb5\u7684 AMD \u67b6\u6784\u6d4b\u8bd5\u673a\u955c\u50cf\u88c5\u673a\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u6307\u5b9a\u5e94\u7528\uff0c\u6307\u5b9a\u8303\u56f4\u6807\u7b7e\u7684\u7528\u4f8b\u6267\u884c\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u72b6\u6001\u68c0\u67e5\uff0c\u662f\u5426\u6709\u6b63\u5728\u8fd0\u884c\u7684\u6d4b\u8bd5\uff1b \u652f\u6301\u914d\u7f6e\u7528\u4f8b\u6267\u884c\u65f6\u957f\uff0c\u9632\u6b62\u4efb\u52a1\u963b\u585e\uff1b \u652f\u6301\u6839\u636e\u5e94\u7528\u7248\u672c\u81ea\u52a8\u67e5\u627e\u5bf9\u5e94\u7684\u7528\u4f8b tag\uff1b \u652f\u6301\u5f02\u5e38\u5904\u7406\u548c\u6d4b\u8bd5\u5b8c\u6210\u7684\u5b9e\u65f6\u6d88\u606f\u901a\u77e5\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2job","title":"2\u3001Job \u4ecb\u7ecd","text":"\u4ee5\u4e0b\u6309\u6267\u884c\u6d41\u7a0b\u7684\u987a\u5e8f\u4ecb\u7ecd\uff0c\u6bcf\u4e00\u6b65\u90fd\u53ef\u4ee5\u5355\u72ec\u6267\u884c\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1_1","title":"1\u3001\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/AT_test/ \u6574\u4e2a\u6d41\u7a0b\u7684\u4e3b\u5165\u53e3\uff0c\u901a\u8fc7\u8fd9\u4e2a\u5165\u53e3\uff0c\u8fde\u540c\u6574\u4e2a\u6d4b\u8bd5\u6d41\u7a0b\uff0c\u955c\u50cf\u88c5\u673a\uff0c\u73af\u5883\u90e8\u7f72\uff0c\u6d4b\u8bd5\u5e94\u7528\u53ca\u751f\u6210\u62a5\u544a\u3002 \u53c2\u6570\u4ecb\u7ecd\uff1a \u6d4b\u8bd5\u673a\uff1a\u6240\u6709\u89c4\u6574\u5230\u56fa\u5b9a\u533a\u57df\u7684\u6d4b\u8bd5\u673a\uff0c\u901a\u8fc7\u6d4b\u8bd5\u540c\u5b66\u5bf9\u6d4b\u8bd5\u673a\u7684\u4e60\u60ef\u547d\u540d\uff0c\u5728\u540e\u53f0\u6620\u5c04\u6d4b\u8bd5\u673a\u7684\u8be6\u7ec6\u4fe1\u606f\uff0c\u62ec\u53f7\u4e2d\u4e3a\u6d4b\u8bd5\u673a IP \u7684\u6700\u540e\u4e00\u4f4d\uff1b \u6d4b\u8bd5\u5e94\u7528\uff1a\u6307\u5b9a\u7684\u6d4b\u8bd5\u5e94\u7528\u7684\u5305\u540d\uff0c\u7cfb\u7edf\u6839\u636e\u540d\u79f0\u81ea\u52a8\u62c9\u53d6\u5bf9\u5e94\u7684\u4ed3\u5e93\u4ee3\u7801\uff1b deb\u5305\u4e0b\u8f7d\u5730\u5740\uff1a\u6d4b\u8bd5\u4e0a\u8ff0\u5e94\u7528\u65f6\uff0c\u9700\u8981\u5b89\u88c5\u7684deb\u5305\u4e0b\u8f7d\u5730\u5740\uff0c\u591a\u4e2a\u5730\u5740\u7528\u201c,\u201d\u9694\u5f00\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff1b \u8303\u56f4\u6807\u7b7e\uff1a\u6267\u884c\u6d4b\u8bd5\u7528\u4f8b\u7684\u6807\u7b7e\u8303\u56f4\uff0c\u5bf9\u5e94\u7528\u4f8b\u4ee3\u7801 csv \u6587\u4ef6\u4e2d\u7684\u6807\u7b7e\u4fe1\u606f\uff0c\u4ee5 pytest \u7684mark\u8bed\u6cd5\u7f16\u5199\uff1b \u7cfb\u7edf\u8bed\u8a00\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u8bed\u8a00\u73af\u5883\uff1b \u5206\u8fa8\u7387\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u5206\u8fa8\u7387\u73af\u5883\uff1b \u955c\u50cf\u5730\u5740\uff1a\u955c\u50cf\u4ed3\u5e93\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u901a\u8fc7 PXE \u88c5\u673a\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u88c5\u673a\u73af\u8282\uff08\u76ee\u524d\u4ec5\u652f\u6301\u90e8\u5206 AMD \u67b6\u6784\u7684\u88c5\u673a\uff09\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2pxe","title":"2\u3001PXE \u88c5\u673a","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/IOS_install/ \u8f93\u5165\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\uff0cIP\uff0c\u5bc6\u7801\uff0c\u955c\u50cf\u5730\u5740\u540e\uff0c\u81ea\u52a8\u88c5\u673a\uff0c\u76ee\u524d\u4ec5\u652f\u6301\u56fa\u5b9a 15 \u7f51\u6bb5\u7684\u90e8\u5206 AMD \u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#3","title":"3\u3001\u6b21\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/all_client_test/ \u8be5\u5165\u53e3\u4e0e\u4e3b\u5165\u53e3\u529f\u80fd\u57fa\u672c\u4e00\u81f4\uff0c\u53ea\u662f\u5265\u79bb\u4e86PXE\u88c5\u673a\u6d41\u7a0b\uff0c\u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7684\u6267\u884c\u6d41\u7a0b\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#4","title":"4\u3001\u73af\u5883\u90e8\u7f72","text":"Jenkins url\uff1ahttps://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/env/build?delay=0sec \u8bbe\u7f6e\u6d4b\u8bd5\u673a\u7684\u7cfb\u7edf\u8bed\u8a00\uff0c\u5206\u8fa8\u7387\u53ca\u5b89\u88c5\u6d4b\u8bd5\u6240\u9700\u7684\u4f9d\u8d56\u5305\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#5","title":"5\u3001\u53d1\u9001\u4ee3\u7801","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/send_code/ \u6839\u636e\u6d4b\u8bd5\u5e94\u7528\u540d\u79f0\uff0c\u62c9\u53d6\u5bf9\u5e94\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u5e76\u6839\u636e\u6d4b\u8bd5\u673a\u4e0a\u5e94\u7528\u7248\u672c\u5207\u6362\u5230\u5bf9\u5e94\u7684tag\u7248\u672c\uff0c\u82e5\u672a\u627e\u5230tag\u7248\u672c\uff0c\u5219\u4f7f\u7528\u6700\u65b0\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u518d\u6839\u636e\u5e94\u7528\u5e93\u4ee3\u7801\u4e2d\u914d\u7f6e\u7684\u57fa\u7840\u5e93\u7248\u672c\uff0c\u62c9\u53d6\u57fa\u7840\u5e93\u4ee3\u7801\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#6","title":"6\u3001\u7528\u4f8b\u6267\u884c","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/run_test/ \u8fd0\u884c\u6d4b\u8bd5\u673a\u4e0a\u7684\u7528\u4f8b"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/","title":"AT \u7528\u4f8b\u7b5b\u9009\u6307\u5317","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u7528\u4f8b\u7b5b\u9009\u6807\u51c6\uff0c\u662f\u6311\u9009\u5408\u9002\u7684\u6587\u672c\u7528\u4f8b\u8fdb\u884c\u81ea\u52a8\u5316\u7528\u4f8b\u8f6c\u5316\u7684\u4e00\u4e9b\u901a\u7528\u6807\u51c6\u3002 \u8fc7\u53bb\u6211\u4eec\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u5b9e\u8df5\u8fc7\u7a0b\u4e2d\uff0c\u5199\u4e86\u4e0d\u5c11\u81ea\u52a8\u5316\u7528\u4f8b\uff0c\u968f\u7740\u9700\u6c42\u7684\u8fed\u4ee3\uff0c\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u81ea\u7136\u8150\u5316\uff0c\u56e0\u800c\u9700\u8981\u5728\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\u5bf9\u81ea\u52a8\u5316\u7528\u4f8b\u8fdb\u884c\u7ef4\u62a4\uff0c\u5728\u7ef4\u62a4\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u6211\u4eec\u53d1\u73b0\uff0c\u6709\u4e9b\u7528\u4f8b\u7ef4\u62a4\u8d77\u6765\u592a\u96be\u4e86\uff0c\u8c03\u8bd5\u7528\u4f8b\u8017\u8d39\u5927\u91cf\u65f6\u95f4\uff0c\u6210\u672c\u5f88\u9ad8\u3002 \u56e0\u6b64\uff0c\u6211\u4eec\u603b\u7ed3\u4e00\u4e9b\u81ea\u52a8\u5316\u7528\u4f8b\u9009\u578b\u7684\u6807\u51c6\uff0c\u4ee5\u4f18\u5316\u540e\u7eed\u81ea\u52a8\u5316\u7528\u4f8b\u7ed3\u6784\uff0c\u671f\u5f85\u6211\u4eec\u80fd\u7f16\u5199\u51fa\u9ad8\u6548\u3001\u7a33\u5b9a\u3001\u6613\u4e8e\u7ef4\u62a4\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_1","title":"\u4e00\u3001\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u53ef\u4ee5\u5206\u4e3a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u548c\u4e13\u9879\u81ea\u52a8\u5316\u6d4b\u8bd5\uff0c\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e00\u822c\u53ea\u9488\u5bf9\u4e00\u4e9b\u5e38\u89c4\u7684\u529f\u80fd\u6d4b\u8bd5\uff0c\u5176\u4ed6\u975e\u5e38\u89c4\u529f\u80fd\u7684\u7528\u4f8b\uff0c\u5e94\u8be5\u91c7\u7528\u4e13\u9879\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u6848\uff1b \u4ee5\u4e0b\u662f\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1","title":"1. \u7a33\u5b9a\u6027\u3001\u538b\u6d4b\u7528\u4f8b","text":"\u7a33\u5b9a\u6027\u6d4b\u8bd5\u3001\u538b\u6d4b\u7528\u4f8b\u5e94\u8be5\u662f\u5c5e\u4e8e\u6027\u80fd\u76f8\u5173\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u5982\uff1a\u53cd\u590d\u591a\u6b21\u70b9\u51fb\u6309\u94ae\uff0c\u68c0\u9a8c\u5176\u529f\u80fd\u7a33\u5b9a\u6027\u3002\u56e0\u4e3a\u8fd9\u4e9b\u7528\u4f8b\u65ad\u8a00\u7684\u9884\u671f\u53ef\u80fd\u4e0d\u662f\u5f88\u660e\u786e\uff0c\u66f4\u6709\u751a\u8005\u4e0d\u9700\u8981\u65ad\u8a00\uff0c\u7528\u4f8b\u65f6\u957f\u6bd4\u8f83\u957f\uff0c\u800c\u4e14\u4e0d\u53ef\u63a7\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u76ee\u524d\u6211\u4eec\u6709\u6027\u80fd\u81ea\u52a8\u5316\u7684\u4e13\u9879\u65b9\u6848\uff0c\u4ee5\u53ca\u4e00\u4e9b\u7a33\u5b9a\u6027\u6d4b\u8bd5\u7684\u4e13\u9879\u65b9\u6848\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u6b64\u7c7b\u7528\u4f8b\u653e\u5230\u4e13\u9879\u81ea\u52a8\u5316\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2","title":"2. \u6d89\u53ca\u591a\u4e2a\u7528\u6237\u64cd\u4f5c","text":"\u5e38\u89c1\u4e0e\u6587\u7ba1\u7684\u7528\u4f8b\u4e2d\uff0c\u591a\u7528\u6237\u64cd\u4f5c\u7684\u7528\u4f8b\u4e00\u822c\u90fd\u4f1a\u6d89\u53ca\u5230\u5728\u7cfb\u7edf\u4e2d\u8fdb\u884c\u591a\u4e2a\u7528\u6237\u95f4\u7684\u5207\u6362\uff0c\u81ea\u52a8\u5316\u811a\u672c\u4e00\u822c\u662f\u8fd0\u884c\u5728\u4e00\u4e2a\u7528\u6237\u7a7a\u95f4\u4e0b\u7684\uff0c\u6240\u4ee5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u591a\u7528\u6237\u95f4\u7684\u5207\u6362\u3002 \u6b64\u7c7b\u4e0d\u5efa\u8bae\u91c7\u7528\u81ea\u52a8\u5316\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3","title":"3. \u4e0e\u5f00\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4ea4\u4e92","text":"\u6b64\u7c7b\u573a\u666f\u591a\u4e3a\u5e94\u7528\u7684\u5f02\u5e38\u573a\u666f\u6d4b\u8bd5\uff0c\u6bd4\u5982\uff1a\u590d\u5236\u5927\u6587\u4ef6\u8fc7\u7a0b\u4e2d\u6ce8\u9500\u673a\u5668\u3002 \u81ea\u52a8\u5316\u811a\u672c\u5728\u7cfb\u7edf\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4e4b\u540e\u662f\u4f1a\u505c\u6b62\u8fd0\u884c\u7684\uff1b\u6b64\u7c7b\u7528\u4f8b\u53ef\u4ee5\u505a\u81ea\u52a8\u5316\uff0c\u4f46\u662f\u540c\u6837\u9700\u8981\u505a\u4e13\u9879\u65b9\u6848\uff0c\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u7684\u5904\u7406\u903b\u8f91\u5b8c\u5168\u4e0d\u540c\u3002 \u540e\u7eed\u81ea\u52a8\u5316\u9700\u8981\u516c\u5173\u7684\u70b9\uff1a \u81ea\u52a8\u5316\u811a\u672c\u5728\u672c\u673a\u8fd0\u884c\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u81f3\u5c11\u9700\u8981\u63d0\u4f9b\u4ee5\u4e0b\u529f\u80fd\uff1a \u91cd\u542f\u4e4b\u540e\u7528\u4f8b\u80fd\u81ea\u52a8\u8fd0\u884c\uff1b\u53ef\u4ee5\u8003\u8651\u5c06\u6267\u884c\u7528\u4f8b\u5199\u6210\u4e00\u4e2a\u5f00\u673a\u81ea\u542f\u7684\u670d\u52a1\uff1b \u80fd\u8bb0\u5f55\u5173\u673a\u4e4b\u524d\u7528\u4f8b\u6267\u884c\u7684\u4f4d\u7f6e\uff0c\u91cd\u542f\u4e4b\u540e\u80fd\u4ece\u6b64\u4f4d\u7f6e\u5f00\u59cb\u6267\u884c\uff1b \u50cf\u6027\u80fd\u81ea\u52a8\u5316\u4e00\u6837\uff0c\u7531\u670d\u52a1\u7aef\u63a7\u5236\uff1b \u5b8c\u5168\u57fa\u4e8e\u56fe\u5f62\u8bc6\u522b\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u4e32\u53e3\u7ebf\u63a7\u5236\u952e\u9f20\u7a33\u5b9a\u6027\uff1b "},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4","title":"4. \u6d4b\u8bd5\u6267\u884c\u65f6\u95f4\u957f","text":"\u7528\u4f8b\u6267\u884c\u65f6\u95f4\u63a7\u5236\u57282\u5206\u949f\u4ee5\u5185\uff0c\u6781\u7aef\u60c5\u51b5\u4e0d\u8981\u8d85\u8fc75\u5206\u949f\uff0c\u6240\u6709\u7528\u4f8b\u7684\u5e73\u5747\u65f6\u957f\u5e94\u8be5\u57281\u5206\u949f\u5de6\u53f3\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u95f4\u592a\u957f\uff0c\u7f16\u5199\u7528\u4f8b\u3001\u8c03\u8bd5\u7528\u4f8b\u3001\u6267\u884c\u7528\u4f8b\u3001\u7ef4\u62a4\u7528\u4f8b\u90fd\u975e\u5e38\u7684\u8017\u65f6\uff0c\u4eba\u529b\u6210\u672c\u65f6\u95f4\u6210\u672c\u6295\u5165\u592a\u9ad8\u3002 \u4f60\u60f3\uff0c\u8fd9\u6761\u7528\u4f8b\u6267\u884c\u9700\u89815\u5206\u949f\uff0c\u90a3\u4f60\u5199\u8fd9\u6761\u7528\u4f8b\u7684\u65f6\u95f4\u4e0d\u53ef\u80fd\u4e00\u904d\u8fc7\uff0c\u5199\u7684\u8fc7\u7a0b\u4e2d\u8dd1\u4e0d\u901a\u8fd8\u5f97\u91cd\u8dd1\u81f3\u5c1115\u5206\u949f\u4e0d\u8fc7\u5206\uff0c\u5199\u5b8c\u4e86\u8fd8\u5f97\u5728\u5176\u4ed6\u67b6\u6784\u4e0a\u8c03\u8bd5\uff0c\u534a\u4e2a\u5c0f\u65f6\u8fc7\u53bb\u4e86\uff0c\u8fd9\u8fd8\u53ea\u662f\u7b2c\u4e00\u6b21\u5199\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u540e\u7eed\u5982\u679c\u7528\u4f8b\u7ef4\u62a4\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u7ecf\u5e38\u6295\u5165\u76f8\u5f53\u957f\u65f6\u95f4\uff0c\u8fd9\u6837\u5176\u5b9e\u662f\u5931\u53bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u7684\u3002\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u5c31\u5e94\u8be5\u662f\u5feb\u51c6\u72e0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5","title":"5. \u8fb9\u7f18\u6027\u6d4b\u8bd5","text":"\u6709\u4e9b\u529f\u80fd\u6a21\u5757\u672c\u8eab\u662f\u5c5e\u4e8e\u6bd4\u8f83\u8fb9\u7f18\u6027\u7684\uff0c\u5373\u6781\u5c11\u7528\u6237\u4f1a\u4f7f\u7528\u5230\u7684\u529f\u80fd\uff0c\u8fd9\u7c7b\u529f\u80fd\u6a21\u5757\u4e0d\u9700\u8981\u5927\u89c4\u6a21\u5b9e\u73b0\u81ea\u52a8\u5316\uff0c\u4e00\u4e24\u4e2a\u573a\u666f\u8986\u76d6\u57fa\u672c\u529f\u80fd\u5c31\u884c\u4e86\uff0c\u56e0\u6b64\u6211\u4eec\u5728\u6311\u9009\u6b64\u7c7b\u7528\u4f8b\u7684\u65f6\u5019\u53ef\u4ee5\u7ed3\u5408\u6574\u4e2a\u529f\u80fd\u6a21\u5757\u7684\u8986\u76d6\u60c5\u51b5\u6765\u51b3\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6","title":"6. \u9700\u8981\u4f9d\u8d56\u4eba\u5de5\u4ecb\u5165\u7684","text":"\u81ea\u52a8\u5316\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\u662f\u6ca1\u6709\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bd4\u5982\u8981\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u90a3\u4e48\u5c31\u80cc\u79bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u3002 \u6bd4\u5982\u5149\u9a71\u6a21\u5757\uff0c\u5149\u9a71\u523b\u5f55\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u4f46\u662f\u5149\u9a71\u523b\u5f55\u4e4b\u540e\u5149\u76d8\u4f1a\u5f39\u51fa\u6765\uff0c\u9700\u8981\u4eba\u5de5\u66f4\u6362\u5149\u76d8\uff0c\u518d\u624b\u52a8\u63a8\u8fdb\u5149\u9a71\u4e2d\u3002 \u8fd9\u79cd\u529f\u80fd\u6a21\u5757\u5373\u4f7f\u505a\u81ea\u52a8\u5316\uff0c\u80fd\u6d89\u53ca\u5230\u7684\u529f\u80fd\u975e\u5e38\u6709\u9650\uff0c\u800c\u4e14\u4e0d\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u6240\u4ee5\u660e\u663e\u5c31\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7","title":"7. \u96be\u4ee5\u5b9e\u73b0\u7684","text":"\u7528\u4f8b\u6240\u6d89\u53ca\u5230\u7684\u65b9\u6cd5\u5b9e\u73b0\u8d77\u6765\u53ef\u80fd\u6709\u96be\u5ea6\uff0c\u751a\u81f3\u73b0\u9636\u6bb5\u65e0\u6cd5\u5b9e\u73b0\u7684\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002 \u6bd4\u5982\u5f71\u9662\u6d4b\u8bd5\u753b\u9762\u6e05\u6670\u5ea6\u3001\u6d41\u7545\u5ea6\u3001\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u4e4b\u540e\u7684\u89c6\u9891\u662f\u5426\u5b58\u5728\u5361\u987f\u7b49\u7528\u4f8b\uff0c\u73b0\u9636\u6bb5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#8","title":"8. \u529f\u80fd\u4e0d\u7a33\u5b9a","text":"\u8fd9\u4e2a\u4e0d\u662f\u8bf4\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\uff0c\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\u4e0d\u7a33\u5b9a\u662f\u6b63\u5e38\u7684\uff0c\u8fd9\u79cd\u6211\u4eec\u53ef\u4ee5\u7b49\u5f00\u53d1\u63d0\u6d4b\u4e4b\u540e\u518d\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u3002 \u529f\u80fd\u4e0d\u7a33\u5b9a\u6307\u7684\u662f\u7528\u4f8b\u6240\u6d89\u53ca\u7684\u529f\u80fd\uff0c\u53ef\u80fd\u5b58\u5728\u591a\u79cd\u53d8\u5316\uff0c\u6bcf\u6b21\u6267\u884c\u7528\u4f8b\u53ef\u80fd\u65ad\u8a00\u7684\u9884\u671f\u90fd\u4e0d\u540c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#9","title":"9. \u52a8\u6001\u65ad\u8a00","text":"\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u76f4\u5230\u7528\u4f8b\u7ed3\u675f\uff0c\u4e00\u76f4\u662f\u4e00\u4e2a\u52a8\u6001\u53d8\u5316\u7684\u8fc7\u7a0b\uff0c\u800c\u4e14\u65e0\u6cd5\u901a\u8fc7\u5176\u4ed6\u624b\u6bb5\u505c\u4e0b\u6765\uff1b \u6bd4\u5982\uff1a\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u65f6\uff0c\u53f3\u4e0b\u89d2\u7684\u5f55\u5236\u65f6\u95f4\u662f\u4e00\u76f4\u5728\u53d8\u5316\u7684\uff0c\u7528\u4f8b\u9700\u8981\u6d4b\u8bd5\u5f55\u52361\u5206\u949f\u4e4b\u540e\uff0c\u5f55\u5236\u65f6\u95f4\u662f\u521a\u597d\u505c\u572860\u79d2\uff1b \u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fd8\u505a\u4e0d\u5230\u65f6\u95f4\u7cbe\u51c6\u63a7\u5236\uff0c\u7a0b\u5e8f\u6267\u884c\u65f6\u95f4\u662f\u6709\u6ce2\u52a8\u7684\uff0c\u800c\u4e14\u8981\u9002\u914d\u591a\u4e2a\u5e73\u53f0\uff0c\u6240\u4ee5\u6b64\u7c7b\u7528\u4f8b\u5927\u6982\u7387\u4f1a\u6267\u884c\u5931\u8d25\u3002\u7279\u522b\u662f\u5728\u6027\u80fd\u8f83\u5dee\u7684\u56fd\u4ea7\u5316\u67b6\u6784\u4e0a\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u592a\u53ef\u80fd\u7a33\u5b9a\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#10","title":"10. \u63a2\u7d22\u6027\u6d4b\u8bd5","text":"\u63a2\u7d22\u6027\u6d4b\u8bd5\u901a\u5e38\u662f\u4e00\u4e9b\u4e0d\u786e\u5b9a\u7684\u64cd\u4f5c\uff0c\u591a\u53d8\u5207\u590d\u6742\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u9884\u671f\u4e5f\u53ef\u80fd\u662f\u4e0d\u786e\u5b9a\u7684\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u9a9a\u64cd\u4f5c\u592a\u591a\u4e86\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6b64\u7c7b\u7528\u4f8b\u9002\u5408\u91c7\u7528\u624b\u5de5\u6d4b\u8bd5\uff0c\u662f\u624b\u5de5\u6d4b\u8bd5\u771f\u6b63\u7684\u4ef7\u503c\u4f53\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#11","title":"11. \u6613\u7528\u6027\u6d4b\u8bd5","text":"\u5bf9\u4e8e\u6613\u7528\u6027\u7684\u5224\u65ad\u901a\u5e38\u662f\u4e3b\u89c2\u7684\uff0c\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\u5f88\u96be\u53bb\u5b9a\u4e49\u4ec0\u4e48\u6837\u7684\u60c5\u51b5\u5bf9\u7528\u6237\u662f\u6613\u7528\u7684\uff0c\u81ea\u52a8\u5316\u9700\u8981\u6709\u660e\u786e\u7684\u53ef\u5b9e\u73b0\u7684\u9884\u671f\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_2","title":"\u4e8c\u3001\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u524d\u9762\u8bb2\u4e86\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u4e00\u4e9b\u7528\u4f8b\u60c5\u51b5\uff0c\u6709\u540c\u5b66\u5c31\u8bf4\u4e86\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\u4e0d\u7528\u8bb2\u4e86\uff0c\u5c31\u662f\u4e0d\u9002\u5408\u7684\u53cd\u9762\u3002\u6ca1\u6bdb\u75c5\u54c8\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\uff0c\u6211\u4eec\u5927\u4f53\u8fd8\u53ef\u4ee5\u5206\u4e3a\u4e24\u7c7b\uff1a \u7b2c\u4e00\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u597d\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u7b2c\u4e8c\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u4e00\u822c\uff0c\u9700\u8981\u6295\u5165\u66f4\u591a\u7cbe\u529b\u624d\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u4ee5\u4e0b\u4ecb\u7ecd\u4e00\u4e9b\u6211\u4eec\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1_1","title":"1. \u64cd\u4f5c\u76f8\u5bf9\u7b80\u5355","text":"\u7528\u4f8b\u6b65\u9aa4\u76f8\u5bf9\u8f83\u5c11\uff0c\u8fd9\u79cd\u7528\u4f8b\u901a\u5e38\u662f\u4e00\u4e9b\u8def\u5f84\u5f88\u6d45\u7684\u7528\u4f8b\uff0c\u4e00\u822c\u4e5f\u662f\u4e00\u4e9b\u57fa\u7840\u7528\u4f8b\u3002\u7528\u4f8b\u7f16\u5199\u3001\u7ef4\u62a4\u90fd\u53ef\u4ee5\u8f7b\u677e\u641e\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2_1","title":"2. \u5bb9\u6613\u5b9e\u73b0","text":"\u73b0\u6709\u6280\u672f\u662f\u53ef\u5b9e\u73b0\u7684\uff0c\u6ca1\u6709\u96be\u5ea6\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3_1","title":"3. \u7ecf\u5e38\u7528\u4e8e\u56de\u5f52\u6d4b\u8bd5","text":"\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bcf\u6b21\u56de\u5f52\u6d4b\u8bd5\u5fc5\u987b\u8981\u6267\u884c\u7684\u7528\u4f8b\uff0c\u90a3\u4e48\u8fd9\u6761\u7528\u4f8b\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u3002 \u56de\u5f52\u6d4b\u8bd5\u65f6\u6211\u4eec\u9996\u5148\u5e94\u8be5\u4fdd\u8bc1\u5e94\u7528\u5386\u53f2\u57fa\u672c\u529f\u80fd\u6b63\u5e38\uff0c\u6240\u4ee5\u90a3\u4e9b\u6bcf\u6b21\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u90fd\u8981\u6267\u884c\u7684\u7528\u4f8b\u9002\u5408\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4_1","title":"4. \u529f\u80fd\u7a33\u5b9a\u7684\u6838\u5fc3\u529f\u80fd","text":"\u6d89\u53ca\u6838\u5fc3\u529f\u80fd\u7684\u7528\u4f8b\u662f\u6700\u6700\u91cd\u8981\u7684\u7528\u4f8b\uff0c\u4e5f\u662f\u6211\u4eec\u4ea4\u4ed8\u65f6\u5fc5\u987b\u8981\u4fdd\u8bc1\u8d28\u91cf\u7684\u76f8\u5173\u529f\u80fd\uff0c\u56e0\u6b64\u5e94\u8be5\u5c3d\u53ef\u80fd\u7684\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5_1","title":"5. \u8f93\u5165\u6570\u636e\u6d4b\u8bd5","text":"\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u901a\u5e38\u662f\u68c0\u9a8c\u88ab\u6d4b\u5e94\u7528\u63a5\u53d7\u6709\u6548\u6570\u636e\u3001\u62d2\u7edd\u65e0\u6548\u6570\u636e\u7684\u80fd\u529b\u3002\u5982\uff1a\u63d0\u4ea4\u8d85\u957f\u5b57\u7b26\u4e32\u3001\u7279\u6b8a\u5b57\u7b26\u4e32\u7b49\u7b49\u3002 \u6b64\u7c7b\u7528\u4f8b\u624b\u5de5\u6d4b\u8bd5\u5f88\u96be\u6bd4\u8f83\u5168\u9762\u7684\u8986\u76d6\u5230\u6240\u6709\u7684\u8f93\u5165\u60c5\u51b5\uff0c\u4f46\u662f\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\uff0c\u6b64\u7c7b\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u90fd\u662f\u4e00\u6837\u7684\uff0c\u53d8\u5316\u7684\u4ec5\u662f\u8f93\u5165\u53c2\u6570\u548c\u65ad\u8a00\u7ed3\u679c\uff0c\u91c7\u7528\u6570\u636e\u9a71\u52a8\uff0c\u53ef\u4ee5\u8f7b\u677e\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6_1","title":"6. \u683c\u5f0f\u8986\u76d6","text":"\u539f\u56e0\u540c\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u7c7b\u7528\u4f8b\u4e00\u6837\uff0c\u591a\u79cd\u683c\u5f0f\u7684\u8986\u76d6\u4e5f\u662f\u4e00\u4e2a\u5f88\u7e41\u7410\u7684\u4e8b\u60c5\uff0c\u4ea4\u7ed9\u81ea\u52a8\u5316\u6765\u505a\u518d\u5408\u9002\u4e0d\u8fc7\u4e86\u3002 \u6bd4\u5982\u5f71\u9662\u5bf9\u5f71\u7247\u683c\u5f0f\u7684\u68c0\u67e5\u3001\u622a\u56fe\u5f55\u5c4f\u5bf9\u4fdd\u5b58\u683c\u5f0f\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7_1","title":"7. \u68c0\u67e5\u5143\u7d20\u72b6\u6001","text":"\u67e5\u770b\u88ab\u6d4b\u5e94\u7528\u7684\u5143\u7d20\u5c5e\u6027\u3002\u5982\uff1a\u56fe\u7247\u7684\u5927\u5c0f\u548c\u6392\u5217\uff1b\u6309\u94ae\u7684\u53ef\u7528\u548c\u4e0d\u53ef\u7528\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/","title":"AT \u7ecf\u9a8c\u603b\u7ed3","text":"\u6b22\u8fce\u6240\u6709\u4eba\u63d0\u4ea4\u4f60\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u9762\u7684\u4f18\u79c0\u5b9e\u8df5\u7ecf\u9a8c\uff0c\u4ee5\u5e2e\u52a9\u5927\u5bb6\u89e3\u51b3\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#1","title":"1\u3001\u7ec8\u7ed3\u5668","text":"# litaoa@uniontech.com\n \u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4 pytest \u5b9e\u73b0\u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4\u7684\u65b9\u5f0f\u6709\u4e24\u79cd\uff0cyield \u548c\u7ec8\u7ed3\u51fd\u6570\uff1b yield \u5b9e\u73b0\uff0cyield\u524d\u9762\u4e3a\u7528\u4f8b\u7684\u524d\u7f6e\u6b65\u9aa4\uff0cyield \u540e\u9762\u4e3a\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4\u3002 @pytest.fixture\ndef clean_env():\nprint(\"setup\")\nyield\nprint(\"teardown\")\n \u7ec8\u7ed3\u51fd\u6570\u5b9e\u73b0\uff0c\u4f7f\u7528 request.addfinalizer \u6ce8\u518c\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4 @pytest.fixture\ndef clean_env(request):\ndef clean():\nprint(\"teardown\")\nrequest.addfinalizer(clean)\nprint(\"setup\")\n yield\u7684\u4f18\u7f3a\u70b9\uff1a \u4f18\u70b9\uff1a\u4ee3\u7801\u7b80\u6d01\uff0c\u76f4\u89c2\uff0c\u53ef\u4f7f\u7528yield\u5728\u7528\u4f8b\u4e2d\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c \u7f3a\u70b9\uff1a\u82e5\u524d\u7f6e\u6b65\u9aa4\u4e2d\u51fa\u73b0\u9519\u8bef\uff0c\u5219\u540e\u7f6e\u6b65\u9aa4\u4e0d\u4f1a\u6267\u884c \u7ec8\u7ed3\u51fd\u6570\uff1a \u4f18\u70b9\uff1a\u524d\u7f6e\u6b65\u9aa4\u5931\u8d25\u7684\u8bdd\uff0c\u540e\u7f6e\u6b65\u9aa4\u4ecd\u4f1a\u6267\u884c\u4e14\u53ef\u4ee5\u6ce8\u518c\u591a\u4e2a\u540e\u7f6e\u6b65\u9aa4\uff08\u524d\u63d0\uff1a\u9700\u8981\u5728\u4ee3\u7801\u62a5\u9519\u4e4b\u524d\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff09\uff0c\u652f\u6301\u7075\u6d3b\u4f7f\u7528\u540e\u7f6e\u6761\u4ef6 \u7f3a\u70b9\uff1a\u4ee3\u7801\u8f83\u4e3a\u590d\u6742\uff0c\u65e0\u6cd5\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c\uff08\u672c\u4eba\u76ee\u524d\u672a\u5b9e\u73b0\uff09 \u603b\u7ed3\uff1a\u5728\u524d\u7f6e\u6b65\u9aa4\u4fdd\u8bc1\u7edd\u5bf9\u4e0d\u4f1a\u51fa\u9519\u65f6\uff0c\u4f7f\u7528yield\u66f4\u4f73\u7b80\u4fbf\uff0c\u5f53\u524d\u7f6e\u6b65\u9aa4\u6613\u51fa\u73b0\u95ee\u9898\u65f6\uff0c\u63a8\u8350\u4f7f\u7528\u7ec8\u7ed3\u51fd\u6570\u3002 \u573a\u666f\uff1a\u4fdd\u9669\u7bb1\u7528\u4f8b\uff0c\u524d\u7f6e\u6b65\u9aa4\u4e2d\u5f00\u542f\u4fdd\u9669\u7bb1\uff0c\u540e\u7f6e\u6b65\u9aa4\u5220\u9664\u4fdd\u9669\u7bb1\u3002 @pytest.fixture(scope=\"session\", autouse=True)\ndef vault_fixture(request):\nDfmWidget.reset_vault_by_cmd() # 1\u3001\u91cd\u7f6e\u4fdd\u9669\u7bb1\nDdeDockPublicWidget().close_file_manager_by_cmd() # 2\u3001\u5173\u95ed\u6587\u7ba1\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 3\u3001\u5f00\u542f\u6587\u7ba1\nvault = DfmWidget()\nvault.create_file_vault() # 4\u3001\u521b\u5efa\u4fdd\u9669\u7bb1\ndef delete_vault(): # 8\u3001\u5220\u9664\u4fdd\u9669\u7bb1\u7684\u540e\u7f6e\u6b65\u9aa4\nsleep(2)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr()\nvault = DfmWidget()\nvault.delete_file_vault()\nDfmWidget.reset_vault_by_cmd()\nDdeDockPublicWidget().close_file_manager_by_cmd()\nrequest.addfinalizer(delete_vault) # 5\u3001\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\nDdeDockPublicWidget().close_file_manager_by_cmd() # 6\u3001\u5173\u95ed\u6587\u7ba1\nsleep(1)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 7\u3001\u5f00\u542f\u6587\u7ba1\n \u4ee3\u7801\u6309\u6ce8\u91ca\u4e2d\u7684\u5e8f\u53f7\u6267\u884c\u6b65\u9aa4 \u4ee3\u7801\u5728\u6b65\u9aa41-4\u4efb\u610f\u4f4d\u7f6e\u62a5\u9519\uff0c\u5219\u4e0d\u4f1a\u6267\u884c\u6b65\u9aa48\uff0c\u56e0\u4e3a\u672a\u6267\u884c\u5230\u6b65\u9aa45\uff0c\u6b65\u9aa48\u8fd8\u672a\u6ce8\u518c \u4ee3\u7801\u5728\u6b65\u9aa46-7\u62a5\u9519\uff0c\u4ecd\u4f1a\u6267\u884c\u6b65\u9aa47\uff0c\u56e0\u4e3a\u5728\u6b65\u9aa45\u4e2d\u5df2\u7ecf\u5c06\u6b65\u9aa47\u6ce8\u518c \u53ef\u4ee5\u7075\u6d3b\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff0c\u80fd\u5b9e\u73b0\u67d0\u4e2a\u524d\u7f6e\u6b65\u9aa4\u6267\u884c\u4e4b\u540e\uff0c\u624d\u4f1a\u6267\u884c\u540e\u7f6e\u6b65\u9aa4\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#2","title":"2\u3001\u542f\u52a8\u5e94\u7528\u7684\u65b9\u5f0f","text":"# huangmingqiang@uniontech.com\n \uff081\uff09\u547d\u4ee4\u884c\u542f\u52a8 \u5728 AT \u4ee3\u7801\u4e2d\u4f7f\u7528\u547d\u4ee4\u884c\u542f\u52a8\u5e94\u7528\uff0c\u4e3e\u4f8b\uff1a os.popen(\"deepin-music\")\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f7f\u7528 ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6\uff0cdogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u3002 \uff082\uff09\u901a\u8fc7 UI \u64cd\u4f5c\u542f\u52a8 \u901a\u8fc7\u4efb\u52a1\u680f\u3001\u542f\u52a8\u5668\u3001\u684c\u9762\u7b49UI\u65b9\u5f0f\u542f\u52a8\uff0c\u6bd4\u5982\u53cc\u51fb\u6253\u5f00\u3001\u53f3\u952e\u6253\u5f00\u7b49\uff0c\u8fd9\u79cd\u64cd\u4f5c\u65b9\u5f0f\u4e0d\u5b58\u5728ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6dogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u7684\u95ee\u9898\uff0c\u4e5f\u66f4\u52a0\u7b26\u5408\u7528\u6237\u7684\u64cd\u4f5c\u884c\u4e3a\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#3","title":"3\u3001\u6587\u4ef6\u9009\u62e9\u6846\u5c5e\u6027\u5b9a\u4f4d\u5076\u73b0\u65e0\u6cd5\u627e\u5230","text":"\u6587\u4ef6\u9009\u62e9\u6846\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5728\u8c03\u7528\u6587\u4ef6\u9009\u62e9\u6846\u65f6\uff0c\u6709\u4e00\u5b9a\u7684\u6982\u7387\u51fa\u73b0\uff0c\u754c\u9762\u5df2\u7ecf\u6e32\u67d3\u51fa\u6765\u4e86\uff0c\u4f46\u662f\u5c5e\u6027\u6811\u5e76\u6ca1\u6709\u5199\u5165\uff0c\u5bfc\u81f4\u901a\u8fc7\u5c5e\u6027\u65e0\u6cd5\u627e\u5230\u5143\u7d20\uff0c\u76ee\u524d\u4e5f\u6ca1\u6709\u5f88\u597d\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u4e3a\u4e86\u7528\u4f8b\u7a33\u5b9a\u6027\uff0c\u6587\u4ef6\u9009\u62e9\u6846\u7684\u64cd\u4f5c\u5efa\u8bae\u4f7f\u7528UI\u6216\u8005\u56fe\u7247\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u53ef\u4ee5\u901a\u8fc7\u641c\u7d22\u5185\u5bb9\u56fa\u5b9a\u6587\u4ef6\u4f4d\u7f6e\u3002 # litaoa@uniontech.com\n desk = DdeDesktopPublicWidget()\n# \u9009\u62e9\u89c6\u9891\u76ee\u5f55\ndesk.click_videos_dir_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.ctrl_f()\nsleep(1)\ndesk.input_message(\"\u5143\u7d20\u540d\u79f0\")\nsleep(0.5)\ndesk.enter()\nsleep(1)\n# \u9009\u62e9\u7b2c\u4e00\u4e2a\u6587\u4ef6\ndesk.click_list_view_btn_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.click_first_file_in_desktop_plugs_by_ui()\nsleep(1)\n# \u6587\u7ba1\u63d2\u4ef6\u4e2d\u70b9\u51fb\u6253\u5f00\ndesk.click_open_btn_in_desktop_plugs_by_ui()\n"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#4","title":"4\u3001\u5e94\u7528\u542f\u52a8","text":"# mikigo\n \u5728UI\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u4e00\u5207\u64cd\u4f5c\u7684\u90fd\u662f\u4ece\u5e94\u7528\u542f\u52a8\u5f00\u59cb\u7684\uff0c\u800c\u5728Linux\u684c\u9762\u5e94\u7528\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u6211\u4eec\u542f\u52a8\u5e94\u7528\u7684\u65b9\u6cd5\u6709\u591a\u79cd\uff0c\u4e0b\u9762\u505a\u4e00\u4e2a\u7b80\u5355\u7684\u4ecb\u7ecd\uff1a \u3010\u4f7f\u7528dogtail\u542f\u52a8\u3011 dogtail\u63d0\u4f9b\u4e86\u5e94\u7528\u542f\u52a8\u7684\u65b9\u6cd5\uff0c\u5728utils\u5e93\u4e2d\uff0c\u4f7f\u7528run\u65b9\u6cd5\u542f\u52a8\uff1a \u9996\u5148\u5bfc\u5165\u65b9\u6cd5\uff1a from dogtail.utils import *\n \u8c03\u7528run\u65b9\u6cd5 run('deepin-music')\n \u5373\u53ef\u542f\u52a8\u97f3\u4e50 \u8fd9\u79cd\u65b9\u6cd5\u7684\u4f18\u70b9\u662f\u91c7\u7528\u8fdb\u7a0b\u7684\u65b9\u5f0f\u76f4\u63a5\u542f\u52a8\uff0c\u4e0d\u4f9d\u8d56\u4e0eUI\uff0c\u65e0\u8bba\u684c\u9762\u6216\u4efb\u52a1\u680f\u4e0a\u662f\u5426\u5b58\u5728\u5e94\u7528\u56fe\u6807\uff0c\u90fd\u53ef\u4ee5\u6b63\u5e38\u542f\u52a8\u3002 \u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c \u5982\u679c\u4f7f\u7528ssh\u8fdc\u7a0b\u8c03\u7528\uff0c\u6216\u8005Jenkins\u4e2d\u6267\u884c\u6d4b\u8bd5\u811a\u672c\u7684\u65f6\u5019\uff0c\u5728sniff\u4e2d\u4f1a\u51fa\u73b0\u627e\u4e0d\u5230\u5e94\u7528\uff0c\u7ecf\u8fc7\u5206\u6790\uff0c\u53ef\u80fd\u662f\u56e0\u4e3a\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\u542f\u52a8\u7684\u65f6\u5019\uff0c\u5b9e\u9645\u662f\u91c7\u7528\u4e00\u4e2a\u5b50\u8fdb\u7a0b\u542f\u52a8\u4e86\u5e94\u7528\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u5230\u3002 \u3010\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u3011 \u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807 \u901a\u5e38\u6709\u4e24\u79cd\u65b9\u6cd5\uff1a \uff081\uff09\u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807\u3002 \uff082\uff09\u5df2\u77e5\u5e94\u7528\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u7684\u4f4d\u7f6e\uff0c\u7136\u540e\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u5bf9\u5e94\u5750\u6807\u3002 \u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u7f3a\u70b9\u662f\u4f4d\u7f6e\u5fc5\u987b\u56fa\u5b9a\uff0c\u5982\u679c\u79fb\u52a8\u4f4d\u7f6e\u5c31\u4e0d\u884c\u4e86\uff0c\u800c\u4f7f\u7528\u7b2c\u4e00\u79cd\u65b9\u6cd5\uff0c\u65e0\u8bba\u4f4d\u7f6e\u5728\u54ea\u91cc\uff0c\u53ea\u8981\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u5b58\u5728\u5373\u53ef\u3002 \u3010\u70b9\u51fb\u684c\u9762\u56fe\u6807\u542f\u52a8\u3011 \u684c\u9762\u56fe\u6807\u76ee\u524d\u662f\u91c7\u7528\u56fe\u50cf\u8bc6\u522b\u6280\u672f\uff0c\u5b9a\u4f4d\u5230\u5e94\u7528\u56fe\u6807\u7684\u5750\u6807\uff0c\u7136\u540e\u901a\u8fc7pyauogui\u8fdb\u884c\u70b9\u51fb\u64cd\u4f5c\u3002 \u8be6\u7ec6\u6280\u672f\u65b9\u6848\u53ef\u4ee5\u53c2\u8003\u6211\u7684\u53e6\u5916\u4e24\u7bc7\u535a\u5ba2: \u57fa\u4e8eopencv\u7684\u6a21\u677f\u5339\u914d\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd4\u56de\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 Python\u4e09\u65b9\u5e93PyAutoGui\u7684\u4f7f\u7528\u65b9\u6cd5 \u3010\u4ece\u542f\u52a8\u5668\u542f\u52a8\uff08\u4fd7\u79f0\u5f00\u59cb\u83dc\u5355\uff09\u3011 \u542f\u52a8\u4e2d\u542f\u52a8\u7684\u5b9e\u73b0\u903b\u8f91\u5b9e\u9645\u548c\u4efb\u52a1\u680f\u4e0a\u542f\u52a8\u5dee\u4e0d\u591a\u3002 \u9996\u5148\uff0c\u9700\u8981\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u542f\u52a8\u5668\u56fe\u6807\uff0c\u6216\u8005\u952e\u76d8super\u952e\uff0c\u5c06\u542f\u52a8\u5668\u547c\u51fa\u6765\uff0c \u7136\u540e\uff0c\u5728\u542f\u52a8\u5668\u4e2d\u70b9\u51fb\u5bf9\u5e94\u7684\u56fe\u6807\uff0c \u4f46\u662f\u8fd9\u91cc\u6709\u4e2a\u95ee\u9898\uff0c\u542f\u52a8\u5668\u4e2d\u7684\u5e94\u7528\u5217\u8868\uff0c\u4e00\u9875\u5c55\u793a\u4e0d\u5b8c\uff0c\u6240\u4ee5\u5982\u679c\u6211\u4eec\u8981\u70b9\u51fb\u7684\u5e94\u7528\u56fe\u6807\u4e0d\u5728\u7b2c\u4e00\u9875\u600e\u4e48\u529e\uff0c\u901a\u5e38\u89e3\u51b3\u65b9\u6848\u6709\u4e24\u79cd\uff1a \uff081\uff09\u9700\u8981\u8fdb\u884c\u5411\u4e0b\u6ed1\u52a8\uff0c\u8fd9\u91cc\u5c31\u6d89\u53ca\u5230\u76f8\u5e94\u7684\u8bc6\u522b\u65b9\u6848\uff0c\u5224\u65ad\u5982\u679c\u4e0d\u5728\u7b2c\u4e00\u9875\u5c31\u5f80\u4e0b\u6ed1\u52a8\u7ffb\u9875\u3002 \uff082\uff09\u542f\u52a8\u5668\u63d0\u4f9b\u641c\u7d22\u7684\u529f\u80fd\uff0c\u8f93\u5165\u5e94\u7528\u540d\u79f0\u641c\u7d22\uff0c\u7136\u540e\u8fdb\u884c\u70b9\u51fb\u3002 \u4ece\u5b9e\u9645\u64cd\u4f5c\u4e2d\u6765\u770b\uff0c\u91c7\u7528\u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u6548\u7387\u4f1a\u9ad8\u4e00\u70b9\u3002 \u3010\u7ec8\u7aef\u547d\u4ee4\u542f\u52a8\u3011 \u5728python\u4e2d\uff0c\u4f7f\u7528os.popen()\u6216os.system()\u6216\u8005subprocess.Popen()\uff0c\u5b9e\u73b0\u547d\u4ee4\u884c\u542f\u52a8\uff0c\u6bd4\u5982\uff1a import os\nos.popen('deepin-music')\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u8fdc\u7a0b\u6267\u884c\u811a\u672c\u7684\u65f6\u5019\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u7684\u95ee\u9898\u3002 \u3010\u603b\u7ed3\u3011 \u4ee5\u4e0a\u51e0\u79cd\u65b9\u6cd5\uff0c\u5404\u6709\u4f18\u7f3a\u70b9\uff0c\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff1a \uff081\uff09\u5982\u679c\u9700\u8981\u5728Jenkins\u4e2d\u505a\u6301\u7eed\u96c6\u6210\uff0c\u5efa\u8bae\u4f7f\u7528\u7b2c\u4e8c\u79cd\u4efb\u52a1\u680f\u542f\u52a8\u7684\u65b9\u6cd5\u3002 \uff082\uff09\u5982\u679c\u4e0d\u4f1a\u91c7\u7528\u8fdc\u7a0b\u6267\u884c\u7684\uff0c\u5efa\u8bae\u91c7\u7528\u7b2c\u4e00\u79cd\u6216\u8005\u6700\u540e\u4e00\u79cd\u65b9\u6848\u3002 \uff083\uff09\u7b2c\u4e09\u79cd\u548c\u7b2c\u56db\u79cd\u542f\u52a8\u65b9\u6cd5\uff0c\u901a\u5e38\u5728\u6d4b\u8bd5\u7528\u4f8b\u4e2d\u4f1a\u6d89\u53ca\u5230\uff0c\u6240\u4ee5\u5076\u5c14\u4f1a\u7528\u3002"},{"location":"RELEASE/","title":"\u7248\u672c\u66f4\u65b0\u8bb0\u5f55","text":""},{"location":"RELEASE/#220202395","title":"2.2.0\uff082023/9/5\uff09","text":"new \u6b63\u5f0f\u542f\u7528 letmego \u6280\u672f\u65b9\u6848\uff1b fix \u5bf9 docs \u91cc\u9762\u7ec6\u5316\u4e86\u8fdc\u7a0b\u6267\u884c\u7ae0\u8282\u7684\u63cf\u8ff0\uff1b "},{"location":"RELEASE/#2152023831","title":"2.1.5\uff082023/8/31\uff09","text":"new \u5c06\u6709\u8da3\u7684\u6587\u6863\u7cfb\u7edf\u8fc1\u79fb\u5230 linuxdeepin \uff0c\u5265\u79bb\u6587\u6863\u4e2d\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u91c7\u7528 CDN \u52a0\u901f\u65b9\u5f0f\u52a0\u8f7d\uff1b \u5c1d\u8bd5\u5408\u5165\u4e00\u4e2a\u6709\u8da3\u7684\u529f\u80fd\uff1b fix \u4fee\u590d\u4e86 Wayland \u952e\u9f20\u5de5\u5177\u6ca1\u6709\u9f20\u6807\u76f8\u5bf9\u79fb\u52a8\u65b9\u6cd5 moveRel \u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 Wayland \u4e0b\u83b7\u53d6\u7a97\u53e3\u4fe1\u606f\u529f\u80fd\u6a21\u5757\u4e2d\u73af\u5883\u53d8\u91cf\u7684\u95ee\u9898\uff1b \u4f18\u5316\u4e86 startproject \u529f\u80fd\u7684\u4e00\u4e9b\u4fe1\u606f\u8f93\u51fa\uff1b \u4fee\u590d\u4e86\u7279\u6b8a\u573a\u666f\u4e0b env_dev.sh \u5f00\u53d1\u73af\u5883\u90e8\u7f72\u662f\u53ef\u80fd\u5f71\u54cd\u5230\u6b63\u5f0f\u73af\u5883 env.sh \u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#2122023822","title":"2.1.2\uff082023/8/22\uff09","text":"new \u589e\u52a0 OCR \u8bc6\u522b\u81ea\u52a8\u91cd\u8bd5\u673a\u5236\uff0c\u9ed8\u8ba4\u91cd\u8bd5 2 \u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u91cd\u8bd5\u6b21\u6570\uff1b \u4f7f\u7528\u7a97\u7ba1\u6700\u65b0\u63d0\u4f9b\u7684\u4e8c\u8fdb\u5236\u63a5\u53e3\uff0c\u4f18\u5316\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u5728 Wayland \u4e0b\u83b7\u53d6\u7a97\u53e3\u4fe1\u606f\u7684\u65b9\u6cd5\uff1b\u611f\u8c22\u684c\u9762\u6d4b\u8bd5\u90e8 @\u4f55\u6743 @\u5b59\u7fe0 \u3001\u7a97\u7ba1\u7814\u53d1 @\u9ec4\u6cfd\u94ed \u7684\u5927\u529b\u652f\u6301\u3002 \u6269\u5145 skipif \u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\u51fd\u6570\uff1a skipif_xdg_type \u652f\u6301 x11 \u6216 wayland \u4e0a\u8df3\u8fc7\uff1b skipif_cpu_name \u652f\u6301\u4e0d\u540c cpu \u4e0a\u8df3\u8fc7\uff0c\u6bd4\u5982\uff1askipif_cpu_name-KLVVW5821\uff1b "},{"location":"RELEASE/#2102023818","title":"2.1.0\uff082023/8/18\uff09","text":"fix \u4fee\u590d SW \u67b6\u6784\u73af\u5883\u4f9d\u8d56\u7684\u95ee\u9898\uff0c\u539f\u56e0\u662f\u4e4b\u524d\u6211\u8fd9\u91cc\u672c\u5730\u6ca1\u6709 SW \u7684\u673a\u5668\uff0c\u6ca1\u6709\u505a\u76f8\u5173\u9002\u914d\uff1b \u4fee\u590d\u5b50\u9879\u76ee\u5355\u72ec\u9700\u8981\u4e09\u65b9\u5305 pexpect\uff0c\u7531\u4e8e\u4e4b\u524d\u662f\u9884\u88c5\u5230\u955c\u50cf\u91cc\u9762\u7684\uff0c\u4f46\u57fa\u7840\u6846\u67b6\u4e0d\u9700\u8981\uff0c\u56e0\u6b64\u6ca1\u6709\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u91cc\u9762\uff0c\u5bfc\u81f4\u5b50\u9879\u76ee\u4f9d\u8d56\u62a5\u9519\u3002 \u4fee\u590d\u5b50\u9879\u76ee cv \u5bfc\u5165\u62a5\u9519\u7684\u95ee\u9898\uff1b \u539f\u56e0\u4e3a\uff1ayouqu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u517c\u5bb9\u4e24\u79cd\u60c5\u51b5\uff0c\u4e00\u79cd\u662f\u9762\u5411\u670d\u52a1\uff0c\u5c31\u662f\u672c\u5730\u6d4b\u8bd5\u673a\u4e0d\u9700\u8981\u5b89\u88c5 OpenCV\uff0c\u7528\u4f8b\u4e2d\u7684\u56fe\u50cf\u8bc6\u522b\u4f1a\u901a\u8fc7\u8fdc\u7a0b\u670d\u52a1\u63a5\u53e3\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u548c\u7ed3\u679c\u83b7\u53d6\uff1b\u7b2c\u4e8c\u79cd\u662f\u539f\u751f\uff0c\u5c31\u662f\u672c\u5730\u76f4\u63a5\u5b89\u88c5 OpenCV \u76f4\u63a5\u7528\u3002\u4e24\u4e2a\u60c5\u51b5\u7684\u4f18\u5148\u7ea7\u662f\u4f18\u5148\u5224\u65ad\u672c\u5730\u5b58\u5728\uff0c\u5426\u5219\u8d70\u670d\u52a1\u3002 \u524d\u9762\u6211\u4eec\u5df2\u7ecf\u628a OCR \u529f\u80fd\u505a\u4e86\u670d\u52a1\u5316\uff0c\u57fa\u4e8e 1 \u5e74\u591a\u4ee5\u6765\u7684\u89c2\u5bdf\uff0c\u7528\u8d77\u6765\u5f88\u7a33\u5b9a\uff0c\u518d\u4e00\u4e2a\u5c31\u662f OpenCV \u5b89\u88c5\u5305\u662f\u6bd4\u8f83\u81c3\u80bf\u7684\uff0c\u7c97\u7565\u6570\u4e86\u4e0b\u4f9d\u8d56\u6709 30+ \u4e2a\uff0c\u800c\u4e14\u5728\u5404\u67b6\u6784\u4e0a\u4f9d\u8d56\u5305\u8fd8\u4e0d\u5c3d\u76f8\u540c\uff0c\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u65b9\u6848\u4e2d\u4e0d\u592a\u597d\u5904\u7406\uff0c\u6240\u4ee5\u672c\u6b21 2.0 \u7248\u672c\u6211\u4eec\u5927\u80c6\u7684\u5c06\u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u529f\u80fd\u4fee\u6539\u4e3a\u9762\u5411\u670d\u52a1\u7684\u65b9\u5f0f\uff0c\u524d\u671f\u6d4b\u8bd5\u4e00\u5207\u770b\u8d77\u6765\u90fd\u5f88\u548c\u8c10\u3002 \u4f46\u662f\u6ca1\u6ce8\u610f\u5230\u4e4b\u524d\u7ed9\u6d77\u71d5\u59d0\u90a3\u8fb9\u9879\u76ee\u5355\u72ec\u5b9a\u5236\u505a\u4e86\u4e2a\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\uff08\u4e3a\u4e86\u80fd\u7b80\u5355\u5e73\u6ed1\u7684\u8fc1\u79fb\u5230 youqu\uff09\uff0c\u6b64\u63a5\u53e3\u5e95\u5c42\u6ca1\u6709\u517c\u5bb9\u670d\u52a1\u5316\uff0c\u6240\u4ee5\u5979\u90a3\u8fb9\u7684\u9879\u76ee\u8c03\u7528\u6b64\u5b9a\u5236\u63a5\u53e3\u4f1a\u62a5 cv \u5bfc\u5165\u7684\u95ee\u9898\u3002 \u7531\u4e8e\u5c06\u8fd9\u4e2a\u5b9a\u5236\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\u8fdb\u884c\u670d\u52a1\u5316\u517c\u5bb9\u6539\u9020\u9700\u8981\u4e00\u5b9a\u65f6\u95f4\uff0c\u6539\u5b8c\u8fd8\u9700\u8981\u6d4b\u8bd5\uff0c\u4f46\u672c\u6b21\u65f6\u95f4\u6bd4\u8f83\u7d27\uff0c\u56e0\u6b64\u5148\u628a OpenCV \u88c5\u8fdb\u865a\u62df\u73af\u5883\uff0c\u540e\u7eed\u7248\u672c\u518d\u8003\u8651\u9488\u5bf9\u6b64\u63a5\u53e3\u505a\u4fee\u6539\u3002"},{"location":"RELEASE/#2002023816","title":"2.0.0\uff082023/8/16\uff09","text":"YouQu\uff08\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff09\u5f00\u6e90\u4e86\uff0c\u540c\u65f6\u63a8\u51fa\u4e86 2.0 \u7248\u672c\u3002 \u611f\u8c22\u738b\u6ce2\u603b\u3001\u67b6\u6784\u5e08\u5f90\u5c0f\u4e1c\u3001\u7814\u53d1\u7ecf\u7406\u90d1\u5e7c\u6208\u3001\u5218\u90d1\u7b49\u7814\u53d1\u540c\u4e8b\u7684\u5927\u529b\u652f\u6301\u3002 new 1\u3001\u65b0\u7684\u57fa\u7840\u6846\u67b6\u4ee3\u7801\u83b7\u53d6\u65b9\u5f0f\u53ca\u65b0\u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4 YouQu \u540e\u7eed\u5747\u901a\u8fc7 PyPI \u8fdb\u884c\u5305\u7684\u53d1\u5e03\uff0c\u4e5f\u5c31\u662f\u8bf4\u540e\u7eed\u53ef\u4ee5\u4f7f\u7528 pip \u8fdb\u884c\u5b89\u88c5\uff1a sudo pip3 install youqu==2.0.0\n \u8fd9\u91cc\u6709 2 \u4e2a\u5c0f\u70b9\u8981\u6ce8\u610f\uff1a \u63a8\u8350\u4f7f\u7528 sudo pip3 \uff08\u52a0 sudo\uff09\u8fdb\u884c\u5b89\u88c5\uff1b \u5982\u679c\u4e0d\u52a0 sudo \u6709\u4e9b\u673a\u5668\u53ef\u80fd $HOME/.local/bin \u4e0d\u5728\u7cfb\u7edf PATH \u73af\u5883\u76ee\u5f55\u4e0b\uff0c\u5728\u4e0d\u6dfb\u52a0\u73af\u5883\u53d8\u91cf\u7684\u60c5\u51b5\u4e0b\uff0c\u4f1a\u51fa\u73b0 YouQu \u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4\uff08youqu-startproject\uff09\u65e0\u6cd5\u4f7f\u7528\u7684\u95ee\u9898\uff1b \u5f53\u7136\uff0c\u5c06\u4e0a\u8ff0\u8def\u5f84\u6dfb\u52a0\u5230\u73af\u5883\u53d8\u91cf\u4e4b\u540e\u4e5f\u662f\u53ef\u4ee5\u7528\u7684\uff0c\u6240\u4ee5\u6211\u8fd9\u91cc\u662f\u63a8\u8350\u52a0 sudo\uff0c\u4e0d\u52a0 sudo \u4e5f\u662f\u53ef\u4ee5\u7684\uff0c\u53ea\u662f\u9700\u8981\u5173\u6ce8\u4e0b\u73af\u5883\u53d8\u91cf\u7684\u95ee\u9898\u3002 \u63a8\u8350\u6307\u5b9a\u7248\u672c\u53f7\uff08youqu==2.0.0\uff09\u5b89\u88c5\uff0c\u5982\u679c\u4e0d\u6307\u5b9a\u7248\u672c\u53f7\u9ed8\u8ba4\u662f\u5b89\u88c5\u6700\u65b0\u53d1\u5e03\u7684 YouQu \u7248\u672c\uff0c\u4f60\u53ef\u4ee5\u5728 PyPI \u4e0a\u7684 Release history \u91cc\u9762\u67e5\u770b\u6709\u54ea\u4e9b\u7248\u672c\u3002 \u5b89\u88c5\u4e4b\u540e\u4f1a\u81ea\u52a8\u751f\u6210\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu-startproject\uff0c\u4f7f\u7528\u5b83\u53ef\u4ee5\u521d\u59cb\u5316\u5de5\u7a0b\uff0c\u8fd9\u91cc\u4ee5\u97f3\u4e50\u4e3e\u4f8b\uff1b youqu-startproject autotest_deepin_music\n \u8fd9\u6837\u5c31\u4f1a\u5728\u5f53\u524d\u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a autotest_deepin_music \u76ee\u5f55\uff0c\u91cc\u9762\u5305\u542b\u4e86\u57fa\u7840\u6846\u67b6\u6240\u6709\u7684\u4ee3\u7801\uff1b \u4e4b\u540e\uff0c\u8fd8\u662f\u5728 apps \u76ee\u5f55\u4e0b\uff0c\u653e\u5165\u5b50\u9879\u76ee\u7684AT\u4ee3\u7801\u5373\u53ef\uff0c\u4f7f\u7528\u65b9\u6cd5\u548c\u8fc7\u53bb\u4e00\u6837\uff0c\u8fd9\u91cc\u5c31\u4e0d\u591a\u4ecb\u7ecd\u3002 \u53e6\u5916\uff0c\u9664\u4e86\u901a\u8fc7 pip \u83b7\u53d6\u4ee5\u5916\uff0c\u4ecd\u7136\u53ef\u4ee5\u901a\u8fc7\u6e90\u7801\u83b7\u53d6\uff08\u76f4\u63a5 git clone\uff09\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u4f7f\u7528 pip \u5b89\u88c5 YouQu \u65f6\uff0cYouQu \u5305\u7684\u5927\u5c0f\u624d 600+ k\uff0c\u5b89\u88c5\u901f\u5ea6\u8d77\u98de\u3002 2\u3001\u65b0\u7684AT\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848 \u4e3a\u4e86\u89e3\u51b3\u4ee5\u4e0b\u95ee\u9898\uff1a \u8fc7\u53bb\u4e00\u6bb5\u65f6\u95f4\u54b1\u4eec\u7ecf\u5e38\u51fa\u73b0\u7684\uff0c\u4e0d\u540c\u7684AT\u9879\u76ee\u5728\u540c\u4e00\u53f0\u673a\u5668\u4e0a\u90e8\u7f72\u73af\u5883\u65f6\u4f9d\u8d56\u7248\u672c\u51b2\u7a81\u7684\u95ee\u9898\uff0c\u65b0\u65b9\u6848\u4e0d\u540c\u7684\u9879\u76ee\u4f1a\u52a8\u6001\u751f\u6210\u81ea\u5df1\u7684\u865a\u62df\u73af\u5883\uff0c\u76f8\u4e92\u4e4b\u95f4\u4e0d\u5f71\u54cd\uff1b \u4e1a\u5185\u4e3a\u4e86\u89e3\u51b3\u7248\u672c\u51b2\u7a81\u95ee\u9898\u4e00\u822c\u90fd\u4f1a\u4f7f\u7528Python\u865a\u62df\u73af\u5883\u7684\u5de5\u5177\uff0c\u4f46\u662f\u90fd\u6709\u4e2a\u95ee\u9898\uff0c\u65e0\u6cd5\u7ba1\u7406 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u5305\uff0c\u672c\u6b21\u6211\u4eec\u89e3\u51b3\u4e86\u8fd9\u4e2a\u95ee\u9898\uff0c\u80fd\u591f\u5b8c\u5168\u7ba1\u7406\u5e38\u89c4\u7684Python\u5305\uff0c\u4e5f\u80fd\u7ba1\u7406\u5230 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u4e09\u65b9\u5305\uff1b \u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u4f7f\u7528\u65b9\u6cd5\uff1a bash env.sh\n \u53ef\u4ee5\u770b\u51fa\u6765\u548c\u539f\u6765\u4f7f\u7528\u65b9\u6cd5\u6ca1\u6709\u53d8\u5316\uff0c\u4e5f\u5c31\u662f\u8bf4\u4ece\u4f7f\u7528\u7684\u89d2\u5ea6\u662f\u5b8c\u5168\u6ca1\u6709\u533a\u522b\u7684\uff0c\u53ea\u662f\u5185\u90e8\u505a\u4e86\u4e0d\u540c\u7684\u4e8b\u60c5\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u672c\u673a\u90e8\u7f72\u7684\u529f\u80fd\u4ecd\u7136\u4fdd\u7559 env_dev.sh\uff0c\u53ef\u4ee5\u4f5c\u4e3a\u5f00\u53d1\u65f6\u7684\u73af\u5883\u90e8\u7f72\u3002 3\u3001\u65b0\u7684\u9a71\u52a8\u547d\u4ee4 \u8fc7\u53bb\u54b1\u4eec\u90fd\u662f\u4f7f\u7528\u8fd9\u6837\u7684\u547d\u4ee4\u6765\u9a71\u52a8\u6267\u884c\uff1a python3 manage.py run\n \u7531\u4e8e\u9ed8\u8ba4\u57fa\u4e8e\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848\uff0c\u56e0\u6b64\u6211\u4eec\u589e\u52a0\u4e86\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu\uff1b \u65b0\u7684\u9a71\u52a8\u65b9\u5f0f\uff1a youqu manage.py run\n \u53ea\u9700\u8981\u628a python3 \u66ff\u6362\u6210 youqu \u5c31\u53ef\u4ee5\u4e86\uff0c\u770b\u8d77\u6765\u5f88\u548c\u8c10~ 4\u3001\u65b0\u7684\u6587\u6863\u5730\u5740 \u8fc7\u53bb\u54b1\u4eec YouQu \u7684\u5728\u7ebf\u6587\u6863\u662f\u90e8\u7f72\u5728\u516c\u53f8\u5185\u7f51\u7684\uff0c\u73b0\u5728\u5f00\u6e90\u5230 github \u4e86\uff0c\u5916\u90e8\u5f00\u53d1\u8005\u80af\u5b9a\u8bbf\u95ee\u4e0d\u5230\u5185\u7f51\u7684\u6587\u6863\uff0c\u56e0\u6b64\u9700\u8981\u5c06\u6587\u6863\u90e8\u7f72\u5230\u516c\u7f51\u3010\u516c\u7f51\u6587\u6863\u3011\uff1b \u516c\u7f51\u6587\u6863\u4f7f\u7528\u7684\u662f github pages\uff08\u767d\u5ad6\u602a\u4e00\u987f\u72c2\u559c~~\uff09\uff0c\u4f46\u53ef\u80fd\u4f1a\u51fa\u73b0\u6587\u6863\u901f\u5ea6\u6162\u7684\u95ee\u9898\uff08\u4ee3\u7406\u4e0b\u5c31\u597d\u4e86\uff09\uff0c\u4e0d\u8fc7\u6ca1\u5173\u7cfb\uff0c\u54b1\u4eec\u3010\u5185\u7f51\u6587\u6863\u3011\u4ecd\u7136\u4fdd\u7559\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u3002 5\u3001\u5176\u4ed6\u4e00\u4e9b\u5c0f\u5c0f\u529f\u80fd\u66f4\u65b0\uff1a \uff081\uff09\u65b0\u589e\u5173\u95ed\u5206\u8fa8\u7387\u68c0\u6d4b\u7684\u53c2\u6570\u503c\uff1b youqu manage.py run --resolution no\n \u6216\u8005\u4fee\u6539 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387, \u6bd4\u5982\uff1a1920x1080\n;no: \u8868\u793a\u4e0d\u505a\u5206\u8fa8\u7387\u6821\u9a8c\nRESOLUTION = 1920x1080\n resolution \u8fd9\u4e2a\u53c2\u6570\u4e00\u76f4\u90fd\u6709\u7684\uff0c\u53ea\u4e0d\u8fc7\u4e4b\u524d\u662f\u7528\u4e8e\u6307\u5b9a\u5206\u8fa8\u7387\u5927\u5c0f\uff0c\u6bd4\u5982 --resolution 1920x1080\uff0c\u4f46\u6709\u4e9b\u63a5\u53e3\u7684\u9879\u76ee\u4e0d\u9700\u8981\u8fd9\u4e2a\u68c0\u67e5\uff0c\u53ef\u4ee5\u7ed9\u5b83\u4e2a no \u5c31\u597d\u4e86\uff0c\u5f53\u7136 CICD \u4e0a\u5173\u95ed\uff0c\u9700\u8981\u6d41\u6c34\u7ebf\u4e0a\u628a\u8fd9\u4e2a\u53c2\u6570\u52a0\u4e0a\uff1b \uff082\uff09\u65b0\u589e\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u7684\u547d\u4ee4\u884c\u53c2\u6570 \u4e4b\u524d\u8fd9\u4e2a\u914d\u7f6e\u9879\u53ea\u80fd\u5728 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c 1 \u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff0cRERUN >= RECORD_FAILED_CASE\u3002\n;1.\u5173\u95ed\u5f55\u5c4f\uff1aRECORD_FAILED_CASE > RERUN\n;2.\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1aRECORD_FAILED_CASE = 0\nRECORD_FAILED_CASE = 1\n \u73b0\u5728\u5c06\u5f00\u53d1\u5230\u547d\u4ee4\u884c\u53c2\u6570\u3002 youqu manage.py run --record_failed_case 2\n fix \u4fee\u590d remote \u6267\u884c\u65f6\uff0c\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u65e0\u6cd5\u751f\u6210\u6d4b\u8bd5\u62a5\u544a\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1302023710","title":"1.3.0\uff082023/7/10\uff09","text":"fix \u8fdb\u4e00\u6b65\u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b\u53c2\u8003\uff1a\u914d\u7f6ePython\u6e90\u7684\u51e0\u79cd\u65b9\u6cd5 \u4fee\u590d wayland_autotool \u53d7\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86wayland\u4e0b\u5076\u73b0\u627e\u4e0d\u5230 .Xauthority \u6587\u4ef6\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1292023626","title":"1.2.9\uff082023/6/26\uff09","text":"fix \u4f18\u5316\u8fdc\u7a0b\u6267\u884c remote \u7684\u53c2\u6570\u76f4\u63a5\u4f20\u7ed9\u8fdc\u7a0b\u673a\u5668\u7684 run \u547d\u4ee4\uff0c\u4e0d\u7528\u518d\u5355\u72ec\u5904\u7406\u8fdc\u7a0b\u6267\u884c\u7684\u53c2\u6570\u903b\u8f91\uff0c\u540e\u7eed\u4e13\u6ce8\u4e8e\u672c\u5730\u6267\u884c\u529f\u80fd\u5f00\u53d1\uff0c\u8fdc\u7a0b\u6267\u884c\u81ea\u52a8\u9002\u7528\uff1b env.sh \u79fb\u9664 pyyaml \u5b89\u88c5\uff0c\u7531\u5b50\u9879\u76ee\u5728 requirement.txt \u91cc\u9762\u5b9a\u4e49\uff0c\u6846\u67b6\u81ea\u52a8\u52a0\u8f7d\uff1b \u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b "},{"location":"RELEASE/#128202369","title":"1.2.8\uff082023/6/9\uff09","text":"fix \u4fee\u590d\u4e86 pypi \u5b89\u88c5 numpy \u5b58\u5728\u7cfb\u7edf\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#127202368","title":"1.2.7\uff082023/6/8\uff09","text":"fix env.sh \u4e2d\u5b89\u88c5 Python \u5305\u672a\u6307\u5b9a\u7248\u672c\u65f6\uff0c\u65e5\u5fd7\u8f93\u51fa\u5b89\u88c5\u7684\u7248\u672c\uff1b pdocr-rpc 2.0.1\nallure-custom 1.2.1\nfunnylog 1.1.3\n \u4fee\u590d -f \u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u62a5\u9519\u7684\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#126202367","title":"1.2.6\uff082023/6/7\uff09","text":"fix \u4fee\u590d wayland \u4e0a\u8c03\u7528\u9f20\u6807\u4e2d\u952e\u3001\u53f3\u952e\u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b \u4fee\u590d pubilic/dde_desktop_public_widget \u91cc\u9762\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u5b9a\u4f4d\u684c\u9762\u6587\u4ef6\u7684\u65b9\u6cd5\uff0c\u5750\u6807\u6ca1\u6709\u62c6\u5305\u7684\u95ee\u9898\uff1b \u4f18\u5316\u4e86\u7b49\u5f85\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b pycreeze \u7248\u672c\u5347\u7ea7\u5230 0.1.29\uff0c\u5bfc\u81f4\u4e0e pyautogui 0.9.53 \u4e0d\u517c\u5bb9\uff0cenv.sh \u91cc\u9762\u589e\u52a0\u6307\u5b9a pycreeze \u7248\u672c\u4e3a 0.1.28\uff1b "},{"location":"RELEASE/#1252023516","title":"1.2.5\uff082023/5/16\uff09","text":"new --app \u53c2\u6570\u540e\u9762\u65b0\u589e\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u76ee\u524d\u652f\u6301\u4e09\u79cd\u53c2\u6570\u4f20\u5165\u65b9\u5f0f\uff1a ~$: youqu run -a deepin-music\n~$: youqu run -a autotest_deepin_music\n~$: youqu run -a apps/autotest_deepin_music\n \u200b \u540e\u4e24\u79cd\u5165\u53c2\u65b9\u5f0f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\u3002 remote \u8fdc\u7a0b\u6267\u884c\u65b0\u589e\u4ece\u547d\u4ee4\u884c\u4f20\u5165\u6d4b\u8bd5\u673a\u4fe1\u606f\uff0c\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679c password \u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6 setting/remote.ini \u4e2d CLIENT_PASSWORD \u7684\u503c,\u6bd4\u5982\uff1auos@10.8.13.33:1 \u6216 uos@10.8.13.33 \uff1b python3 manage.py remote -c uos@10.8.13.33/uos@10.8.13.34\npython3 manage.py remote -c uos@10.8.13.33:1/uos@10.8.13.34:2\n fix \u65e5\u5fd7\u6a21\u5757\u4fee\u6539\u4e3a\u51fd\u6570\u6267\u884c\u4e4b\u524d\u6253\u5370\u65e5\u5fd7\uff1b \u65e5\u5fd7\u6a21\u5757\u589e\u52a0\u767d\u540d\u5355\uff0c\u901a\u8fc7\u7c7b\u540d\u5f00\u5934\uff0c\u7ed3\u675f\uff0c\u5305\u542b\u7b49\u5173\u952e\u5b57\u63a7\u5236\u9700\u8981\u6253\u5370\u7684\u51fd\u6570\u65e5\u5fd7\uff1b \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5982\u679c\u4f20\u5165\u4e86 app_name \u53ea\u4f1a\u5c06 apps \u76ee\u5f55\u4e0b app_name \u7684\u76ee\u5f55\u53d1\u9001\u5230\u6d4b\u8bd5\u673a\uff1b env.sh \u79fb\u9664 python3-dev\uff1b \u4fee\u590d Wayland \u4e0b env.sh \u73af\u5883\u5b89\u88c5\u5931\u8d25\u7684\u95ee\u9898\uff0c\u4f18\u5316\u4e86 deb \u4f9d\u8d56\u5b89\u88c5\u7684\u903b\u8f91\uff1b \u5c06 env.sh \u5237\u65b0\u6e90\u7684\u65e5\u5fd7\u5728\u7ec8\u7aef\u663e\u793a\uff0c\u89e3\u51b3\u5728 CI \u73af\u5883\u4e0b\uff0c\u957f\u65f6\u95f4\u4e0d\u8f93\u51fa\u65e5\u5fd7\u8fde\u63a5\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d1060 \u534e\u4e3a\u673a\u578b\u5b89\u88c5\u952e\u9f20\u5de5\u5177\u65f6\u4f9d\u8d56\u4e0d\u517c\u5bb9\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1242023227","title":"1.2.4\uff082023/2/27\uff09","text":"fix \u4fee\u6539 CURRENT \u6587\u4ef6\uff1b "},{"location":"RELEASE/#1232023227","title":"1.2.3\uff082023/2/27\uff09","text":"new pylint.sh \u652f\u6301\u901a\u8fc7\u4f4d\u7f6e\u53c2\u6570\u4f20\u5165\u6587\u4ef6\u8def\u5f84\uff1abash pylint.sh apps/autotest_deepin_music,\u597d\u5904\u662f\u53c2\u6570\u8def\u5f84\u53ef\u4ee5\u5728\u7ec8\u7aef\u8865\u5168\uff1b \u65b0\u589e\u7cfb\u7edf\u547d\u4ee4 youqu-pylint \uff0c\u7528\u4e8e\u9759\u6001\u4ee3\u7801\u626b\u63cf\uff0c\u4f7f\u7528\u65b9\u6cd5: youqu-pylint apps/autotest_deepin_music\uff1b \u7531\u4e8e\u7cfb\u7edf\u4e00\u4e9b dbus \u63a5\u53e3\u6539\u53d8\uff0c\u516c\u5171\u5e93\u4e2d\u7684 dbus \u65b9\u6cd5\u5c06\u4e0d\u518d\u7ef4\u62a4\uff0c\u7531\u5b50\u9879\u76ee\u5728 other_widget.py \u91cc\u9762\u8fdb\u884c\u7ef4\u62a4\uff1b fix \u4fee\u590d ssh \u73af\u5883\u4e0b\u8fd0\u884c\u63d0\u793a \u201c\u65e0\u6cd5\u8fde\u63a5\u201d \u7684\u95ee\u9898\uff1b \u4fee\u590d\u8fd0\u884c\u65f6\u7a0b\u5e8f\u9000\u51fa\uff0c\u4e0d\u8f93\u51fa\u5f02\u5e38\u65e5\u5fd7\u7684\u95ee\u9898\uff1b \u4fee\u590dyouqu remote xxx \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5728\u670d\u52a1\u7aef Ctrl + C \u65e0\u6cd5\u505c\u6b62\u7a0b\u5e8f\u8fd0\u884c\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#122202328","title":"1.2.2\uff082023/2/8\uff09","text":"new \u65b0\u589e\u6c14\u6ce1\u7c7b\u56fe\u50cf\u8bc6\u522b\u65b9\u6848\uff1bimage_utils.py::ImageUtil::get_during\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u533a\u57df\u8bc6\u522b\uff0c\u4f20\u5165 [x, y, w, h]\uff0cx: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u76ee\u6807\u56fe\u7247\uff0c\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\uff1b env.sh \u79fb\u9664 pypinyin; \u4f18\u5316\u6267\u884c env.sh \u65f6\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b manage.py \u79fb\u9664\u4e86\u53c2\u6570 session_timeout \uff0c\u6846\u67b6\u6839\u636e\u5168\u5c40\u7684 timeout \u4ee5\u53ca\u7528\u4f8b\u81ea\u5b9a\u4e49\u7684 timeout \u81ea\u52a8\u8ba1\u7b97\u51fa sessiontimeout \u7684\u503c\uff1b \u65b0\u589e ocr \u670d\u52a1\u5668\u94fe\u63a5\u91cd\u8bd5\uff0c\u9ed8\u8ba4\u91cd\u8bd51\u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u53c2\u6570\uff1b fix \u4fee\u590d\u4e86\u4e00\u4e9b pylint \u626b\u63cf\u7684\u4ee3\u7801\u98ce\u683c\u95ee\u9898\uff1b \u91cd\u65b0\u8bbe\u8ba1\u4e86\u6d4b\u8bd5\u62a5\u544a\u4e3b\u9898\uff1b "},{"location":"RELEASE/#121202316","title":"1.2.1\uff082023/1/6\uff09","text":"new \u652f\u6301\u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6267\u884c\u7528\u4f8b\uff1b\u53ef\u5c06python3 manage.py \u66ff\u6362\u4e3a youqu \uff1a youqu run -a deepin-music -k 001\n RPC \u670d\u52a1 IP \u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u6307\u5b9a\u4e0d\u540c\u7684\u7aef\u53e3\uff1b \u5728\u7ebf\u6587\u6863\u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u539f\u6765\u7684\u5730\u5740 10.8.10.215 \u5c06\u4e0d\u5728\u4f7f\u7528\uff1b fix \u4fee\u590d --count \u53c2\u6570\u53ef\u80fd\u51fa\u73b0\u4e0e\u5176\u4ed6\u6846\u67b6\u7684\u5de5\u7a0b\u4f9d\u8d56\u5b58\u5728\u51b2\u7a81\uff0c\u62a5\u9519\u91cd\u590d\u6ce8\u518c\u7684\u95ee\u9898\uff1b \u4fee\u590d CI \u73af\u5883\u4e0b\u591a\u4e2a\u5de5\u7a0b\u5b58\u5728 Python \u73af\u5883\u53d8\u91cf\u6307\u5411\u9519\u8bef\uff0c\u5bfc\u5305\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u5355\u72ec\u8fd0\u884c\u65b9\u6cd5\u65f6\u65e0\u65e5\u5fd7\u8f93\u51fa\u7684 Bug\uff1b "},{"location":"RELEASE/#12020221230","title":"1.2.0\uff082022/12/30\uff09","text":"1.1.4 \u7248\u672c\u9002\u914d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e14\u65b0\u589e\u4e86\u8f83\u591a\u65b0\u7279\u6027\uff0c\u6211\u4eec\u8ba1\u5212\u4f7f\u7528 1.1.4 \u7248\u672c\u8fd0\u884c\u4e00\u6bb5\u65f6\u95f4\uff0c1.2.0 \u7248\u672c\u5c06\u4fee\u590d\u671f\u95f4\u51fa\u73b0\u7684 Bug\uff0c\u7136\u540e\u4f5c\u4e3a\u7a33\u5b9a\u7248\u672c\u53d1\u5e03\u3002 new \u4fee\u6539\u5de5\u7a0b\u540d\u79f0\u4e3a youqu\uff1b \u5c06 sphinx \u6587\u6863\u5de5\u7a0b\u8fc1\u79fb\u5230\u5355\u72ec\u7684\u4ed3\u5e93\uff1b fix \u4fee\u590d startapp \u521b\u5efa\u5de5\u7a0b\u65f6\u5b58\u5728\u5de5\u7a0b\u540d\u79f0\u65f6\u65e0\u6cd5\u7ee7\u7eed\u521b\u5efa\uff1b \u4fee\u590d\u4e86 OCR \u670d\u52a1\u5728\u5e76\u53d1\u65f6\u53ef\u80fd\u51fa\u73b0\u65e0\u6cd5\u8fd4\u56de\u7ed3\u679c\u7684\u95ee\u9898\uff0c\u63d0\u5347 OCR \u670d\u52a1\u9ad8\u5e76\u53d1\u7a33\u5b9a\u6027\uff1b \u4fee\u590d PMS \u540c\u6b65\u6807\u7b7e\u5230 CSV \u6587\u4ef6\u4e0d\u652f\u6301\u7528\u4f8b\u5e93\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11420221214","title":"1.1.4\uff082022/12/14\uff09","text":"new \u65b0\u589e startapp \u5b50\u547d\u4ee4\u521b\u5efa\u5b50\u9879\u76ee\u5de5\u7a0b\u6a21\u677f: python3 manage.py startapp autotest_deepin_xxx \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u91cd\u590d\u6267\u884c\u6b21\u6570\uff1b \u53bb\u6389\u6279\u91cf\u6267\u884c\u524d\u6536\u96c6\u7528\u4f8b\u7684\u6b65\u9aa4\uff1b \u589e\u52a0\u5f00\u59cb\u6267\u884c\u65f6\u6253\u5370\u4e00\u4e9b\u6267\u884c\u53c2\u6570\uff0c\u5982\uff1a \u7528\u4f8b\u6536\u96c6\u6570\u91cf: 99\n\u5931\u8d25\u91cd\u8dd1\u6b21\u6570: 1\n\u6700\u5927\u5931\u8d25\u6b21\u6570: 49\n\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4: 200.0s (03\u520620\u79d2)\n\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4: 11880s (3\u5c0f\u65f618\u52060\u79d2)\n \u5b9a\u5236\u4fee\u6539allure\u62a5\u544alogo\u3001title\u3001\u9ed8\u8ba4\u8bed\u8a00\uff1b manage.py \u6267\u884c\u5f00\u59cb\u65f6\u6253\u5370 logo \u548c\u5f53\u524d\u7248\u672c\uff1a \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u255a\u2588\u2588\u2557 \u2588\u2588\u2554\u255d \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2584\u2584 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2580\u2580\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u2584\u2588 \u2584\u2588 \u2588 \u2588 \u2588 \u2584 \u2588 \u2584 \u2580\u2580\u2588 \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\uff1b \u88c5\u9970\u5668\u65b9\u6cd5\u6307\u5b9a\u6b21\u6570\uff1b @pytest.mark.count(2)\ndef test_music_001():\npass\n \u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u6b21\u6570\uff1b python3 manage.py run -a deepin-music -k 001 --count 2\n \u200b image_utils \u589e\u52a0\u51fd\u6570 save_temporary_picture\uff0c\u652f\u6301\u6307\u5b9a\u5c4f\u5e55\u533a\u57df\u622a\u56fe\u5e76\u8fd4\u56de\u56fe\u7247\u5b58\u653e\u7684\u672c\u5730\u8def\u5f84\uff0c\u540e\u7eed\u4f7f\u7528 assert_image_exist \u8fdb\u884c\u65ad\u8a00 Python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(x, y, width, height) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) button_center \u65b0\u589e btn_size \u83b7\u53d6\u63a7\u4ef6\u5de6\u4e0a\u89d2\u5750\u6807\u53ca\u957f\u5bbd\uff0c\u7528\u4e8e\u52a8\u6001\u7684\u622a\u53d6\u5143\u7d20\u7684\u56fe\u7247\uff0c\u53ef\u7528\u4e8e\u5b9a\u4f4d\u65ad\u8a00 python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u6240\u6709\u97f3\u4e50\u6309\u94ae\")) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) allure \u62a5\u544a\u4e2d\u5b9a\u4f4d\u95ee\u9898\u9664\u4e86\u65e5\u5fd7\u3001\u622a\u56fe\u3001\u5f55\u5c4f\u5916\uff0c\u8c03\u7528\u7684\u51fd\u6570\u589e\u52a0\u4e86 step \u6b65\u9aa4\u5c55\u793a\uff1b env.sh \u65b0\u589e\u5b89\u88c5\u5b50\u9879\u76ee Python \u4e09\u65b9\u4f9d\u8d56\uff0c\u5728\u5b50\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u5199 requirement.txt \u6587\u4ef6\uff0cenv.sh \u4f1a\u81ea\u52a8\u52a0\u8f7d\uff1b ocr \u8bc6\u522b\u65b0\u589e\u652f\u6301\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\u8fdb\u884c\u6587\u5b57\u8bc6\u522b\uff0c\u51cf\u5c11\u56e0\u5168\u5c4f\u8bc6\u522b\u65f6\uff0c\u5176\u4ed6\u6587\u5b57\u7684\u5e72\u6270 Python # \u65ad\u8a00\u97f3\u4e50\u7684\u5220\u9664\u5f39\u7a97\u4e2d\uff0c\u5305\u542b\u4e86\u201c\u786e\u8ba4\u201d\u7684\u6587\u5b57 self.assert_ocr_exist(\"\u786e\u8ba4\", picture_abspath=DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u5220\u9664\u5f39\u7a97\"))) \u65ad\u8a00\u51fd\u6570\u7684\u8c03\u7528\u4e5f\u4f1a\u81ea\u52a8\u6253\u5370\u65e5\u5fd7; env.sh \u65b0\u589e\u88c1\u526a\u4f9d\u8d56\u7684\u65b9\u6848\uff1b fix \u4fee\u590d Jenkins \u73af\u5883\u4e0b\uff0c apps \u76ee\u5f55\u4e0b\u5b50\u9879\u76ee\u5b58\u5728 auotest_deepin_xxx@tmp \u76ee\u5f55\uff0c\u5728\u4f20\u5165 app_name \u540e\u65e0\u6cd5\u6267\u884c\u7528\u4f8b\u7684\u95ee\u9898\uff1b \u4fee\u590d\u81ea\u52a8\u751f\u6210 case_list.csv \u6587\u4ef6\u65f6\uff0c\u7528\u4f8b\u987a\u5e8f\u88ab\u8c03\u6574\u7684\u95ee\u9898\uff1b env.sh \u73af\u5883\u5b89\u88c5\u79fb\u9664 git \u548c curl\uff1b \u4fee\u590d\u7528\u4f8b\u5728 setup \u9636\u6bb5\u62a5\u9519\u540e\uff0c\u672a\u5199\u5165 ci_result.json \u7684\u95ee\u9898\uff1b \u79fb\u9664 uos_ci.py\uff1b "},{"location":"RELEASE/#11320221028","title":"1.1.3\uff082022/10/28\uff09","text":"new \u65b0\u589e\u56fe\u50cf\u65ad\u8a00\u6210\u529f\u8f93\u51fa\u5339\u914d\u5ea6\uff1b \u65b0\u589e\u73af\u5883\u5b89\u88c5 yaml \u4f9d\u8d56\uff1b \u65b0\u589e\u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6570\u636e\u56de\u586b\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b \u65b0\u589e\u6d4b\u8bd5\u7ed3\u679c\u8868\u60c5\u663e\u793a\uff0c\u5e76\u4f18\u5316\u4e86\u65e5\u5fd7\u7684\u6392\u7248\uff1b \u65b0\u589e --top {number} \u7528\u4e8e\u8bb0\u5f55\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0c\u65e5\u5fd7\u751f\u6210\u5230 report/logs/top.log\uff1b fix \u4fee\u590d\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4f46\u7ec8\u7aef\u6ca1\u6709\u9519\u8bef\u65e5\u5fd7\u8f93\u51fa\u7684\u95ee\u9898\uff1b \u4fee\u6539\u5931\u8d25\u7528\u4f8b\u56de\u6eaf\u65e5\u5fd7\u4e3a\u8be6\u7ec6\u7ea7\u522b\uff1b \u4fee\u590d\u4e86\u6267\u884c\u8fdb\u5ea6\u672a\u8ba1\u7b97\u8df3\u8fc7\u7528\u4f8b\u7684\u95ee\u9898\uff0c\u5e76\u4f18\u5316\u4e86\u8fdb\u5ea6\u83b7\u53d6\u7684\u7b97\u6cd5\uff1b \u4fee\u590d env.sh \u5728 V23 \u73af\u5883\u4e0b\u5b89\u88c5\u65e0\u6cd5\u8bfb\u53d6\u5bc6\u7801\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 pms \u6d4b\u8bd5\u5957\u6267\u884c\u6216\u6d4b\u8bd5\u5355\u6267\u884c\u65f6\uff0c\u7528\u4f8bID\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b env.sh \u91cc\u9762 hub.deepin.com \u66f4\u6362\u6210 it.uniontech.com\uff1b uos_ci.py \u6d4b\u8bd5\u7ed3\u679c\u7edf\u8ba1\u65f6\uff0c\u603b\u6570\u5254\u9664 skip \u7684\u6570\u91cf "},{"location":"RELEASE/#11220220921","title":"1.1.2\uff082022/09/21\uff09","text":"new \u5728\u6ca1\u6709\u5b89\u88c5 dogtail \u7684\u60c5\u51b5\u4e0b\uff0c\u4e5f\u80fd\u4f7f\u7528 sniff \u5de5\u5177\uff1b fix \u4fee\u590d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e2d\u6ca1\u6709\u5b89\u88c5 AT \u73af\u5883\u6267\u884c uos_ci.py \u62a5\u9519\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11120220919","title":"1.1.1\uff082022/09/19\uff09","text":"new \u65b0\u589e\u6267\u884c\u8fdb\u5ea6\u663e\u793a\uff0c\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u65f6\u65e5\u5fd7\u8f93\u51fa\u5f53\u524d\u8fdb\u5ea6\uff1a[\u5f53\u524d\u6307\u5b9a\u7b2c\u51e0\u6761/\u7528\u4f8b\u603b\u6570]\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u7528\u4f8b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\u6240\u6709\u5931\u8d25\u7528\u4f8b\u7684\u5217\u8868\uff1b \u5173\u95ed\u7ec8\u7aef\u8f93\u51fa\u6355\u83b7\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u65e5\u5fd7\u5feb\u7167\uff1b \u4f18\u5316\u7ec8\u7aef\u8f93\u51fa\u5931\u8d25\u4fe1\u606f\u5197\u957f\u4e3a\u7b80\u8981\u4fe1\u606f\u8f93\u51fa\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u663e\u793a 10 \u4e2a\u6267\u884c\u6700\u6162\u7684\u7528\u4f8b\u5217\u8868\uff0c\u5e76\u8be6\u7ec6\u5217\u51fa\u5404\u4e2a\u9636\u6bb5\u7684\u8017\u65f6\uff1b \u5931\u8d25\u91cd\u8dd1\u7528\u4f8b\u91cd\u8dd1\u4e4b\u524d\u5ef6\u8fdf 1 \u79d2\uff1b \u65b0\u589e\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4ecd\u7136\u5f3a\u5236\u6267\u884c\uff1b \u7528\u4f8b\u6536\u96c6\u65f6\u4ec5\u5728 apps \u76ee\u5f55\u4e0b\u8fdb\u884c\uff0c\u5ffd\u7565 src,setting,public \u76ee\u5f55\uff1b \u65b0\u589e allure \u62a5\u544a\u5907\u4efd\u529f\u80fd\uff0c\u9ed8\u8ba4\u5907\u4efd\u81f3 allure_back \u76ee\u5f55\u4e0b\uff1b manage.py\u65b0\u589e\u53c2\u6570 --lastfailed \u7528\u4e8e\u53ea\u8dd1\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\u7684\u529f\u80fd\uff1b fix \u4fee\u590d\u4e86\u5728\u6ca1\u6709\u6307\u5b9a\u5e94\u7528\u540d\u79f0\u6267\u884c\u65f6\uff0cxml \u62a5\u544a\u751f\u6210\u8def\u5f84\u5f02\u5e38\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 uos_ci.py \u4f20\u5165 timeout \u548c session_timeout \u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11020220916","title":"1.1.0\uff082022/09/16\uff09","text":"new \u65b0\u589ePMS\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u652f\u6301\u591a\u79cd\u6570\u636e\u56de\u586b\u6a21\u5f0f\uff1b \u4f18\u5316\u4e86\u901a\u8fc7\u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u65f6PMS \u722c\u866b\u7684\u6027\u80fd\uff1b \u65b0\u589e .gitmodules \u6587\u4ef6\uff0c\u7528\u4e8e\u6807\u8bb0\u6240\u6709\u5b50\u9879\u76ee\uff0c\u65b9\u4fbf\u7edf\u4e00\u62c9\u53d6\u4ee3\u7801\uff1b env.sh \u9002\u914d\u793e\u533a\u7248\u4e0a\u5b89\u88c5\u81ea\u52a8\u5316\u73af\u5883\uff1b \u589e\u52a0\u6267\u884c\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u9519\u8bef\u7684\u529f\u80fd\uff1b README.md \u589e\u52a0 Wayland \u4e0b\u4f7f\u7528\u3001\u6d4b\u8bd5\u62a5\u544a\u67e5\u770b\u3001\u5e38\u89c1\u95ee\u9898\u7b49\u7684\u6587\u6863\u8bf4\u660e\uff1b \u589e\u52a0\u4e86\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u5bf9 setup\u3001call\u3001teardown \u8fdb\u884c\u65e5\u5fd7\u5206\u6bb5\uff1b fix \u4fee\u590d\u4e86 \u786e\u8ba4\u4fee\u590d \u5217\u6ca1\u5199\u8868\u5934\uff0c\u4f46\u5199\u4e86 fixed-xxx \u6807\u7b7e\uff0c\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u540c\u4e00\u5e94\u7528\u5185\u591a\u4e2a csv \u6587\u4ef6\u4e2d \u786e\u8ba4\u4fee\u590d \u5217\u6709\u7684\u5199\u4e86\uff0c\u6709\u7684\u6ca1\u5199\uff0c\u53ef\u80fd\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 INFO \u65e5\u5fd7\uff0c\u663e\u793a\u4e3a DEBUG \u7684\u95ee\u9898\uff1b\u4fee\u590d\u4e86\u90e8\u5206\u673a\u5668\u4e0a INFO \u65e5\u5fd7\u5185\u5bb9\u663e\u793a\u4e3a\u7ea2\u8272\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\u770b\u4e0d\u5230\u8be6\u7ec6\u4fe1\u606f\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10220220822","title":"1.0.2\uff082022/08/22\uff09","text":"new \u79fb\u9664 loguru\uff0c\u66ff\u6362\u4e3a logging\uff0c\u63a5\u53e3\u4fdd\u6301\u4e0d\u53d8\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u53d7\u5f71\u54cd\uff1b \u9ed8\u8ba4\u5f00\u542f coredump\uff1b fix \u4fee\u590d\u4e86\u4e09\u65b9\u5e93 loguru \u5076\u73b0\u5f02\u5e38\uff0c\u5bfc\u81f4\u7a0b\u5e8f\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7b2c\u4e00\u6b21\u5931\u8d25\u4e0d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10120220812","title":"1.0.1\uff082022/08/12\uff09","text":"new \u65b0\u589e RELEASE.md \u6587\u4ef6\uff0c\u7528\u4e8e\u8bb0\u5f55\u5386\u53f2\u53d1\u5e03\u7248\u672c\u7684\u66f4\u65b0\u5185\u5bb9\uff1b \u517c\u5bb9 Wayland \u6a21\u5f0f\u4e0b\u6267\u884c\u7528\u4f8b\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u7528\u7ba1\u5f53\u524d\u6d4b\u8bd5\u673a\u6267\u884c\u73af\u5883\uff0c\u6846\u67b6\u4f1a\u81ea\u52a8\u6839\u636e\u5f53\u524d\u73af\u5883\u8d70\u4e0d\u540c\u7684\u4ee3\u7801\u903b\u8f91\uff1b \u7531\u4e8e\u9700\u8981\u4fee\u6539 dogtail \u6e90\u4ee3\u7801\uff0c\u56e0\u6b64\u5c06\u4fee\u6539\u540e\u7684\u6e90\u7801\u653e\u5165\u5230\u6838\u5fc3\u5e93\u91cc\u9762 src/depends/dogtail \u540e\u7eed\u7248\u672c\u5c06\u4e0d\u9700\u8981\u5728\u7cfb\u7edf\u4e2d\u5b89\u88c5dogtail\uff1b \u5982\u679c\u5e94\u7528\u5e93\u540c\u6837\u4f7f\u7528\u4e86\u7cfb\u7edf\u5b89\u88c5\u7684 dogtail \u53ef\u80fd\u4f1a\u62a5\u9519\uff0c\u89e3\u51b3\u65b9\u6848\u662f\u5c06\u4ee3\u7801\u4e2d\u7684 import dogtail \u4fee\u6539\u4e3a from src.depends import dogtail ; fix \u91cd\u8dd1\u5931\u8d25\u4e4b\u540e\u624d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff0c\u4fee\u6539\u4e3a\u5931\u8d25\u4e4b\u540e\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":"# Attribution \uff1achengdu Test Team\n# Date \uff1a2021/08/20\n \u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d \u4ed3\u5e93\u5730\u5740\uff1ahttps://gitlabcd.uniontech.com/autotest/cd-desktop-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u65b9\u6848\u6982\u8ff0","text":"\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u667a\u80fd\u8bc6\u522b\u5e94\u7528\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u7528\u4e8e\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u64cd\u4f5c\u8fc7\u7a0b\u4e2d\u7684\u5143\u7d20\u5b9a\u4f4d\u4ee5\u53ca\u5224\u65ad\u7ed3\u679c\u65f6\u7684\u65ad\u8a00\u5904\u7406\uff1b\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\uff0c\u6d4b\u8bd5\u673a\u4e0a\u7684\u753b\u9762\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u5230\u670d\u52a1\u5668\u4e0a\uff0c\u670d\u52a1\u5668\u5bf9\u89c6\u9891\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\u540e\uff0c\u670d\u52a1\u5668\u667a\u80fd\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\u6210\u529f\uff0c\u7136\u540e\u5bf9\u6d4b\u8bd5\u673a\u4e0b\u53d1\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\uff0c\u6d4b\u8bd5\u673a\u63a5\u53d7\u5e76\u6267\u884c\u4e0b\u4e00\u6b65\u64cd\u4f5c\u3002 \u670d\u52a1\u5668\u4e0e\u6d4b\u8bd5\u673a\u4e4b\u95f4\u7684\u94fe\u63a5\uff1a \u670d\u52a1\u5668\u901a\u8fc7 USB \u4e32\u53e3\u8bbe\u5907\uff08USB-HID \u534f\u8bae\uff09\u6a21\u62df\u9f20\u6807\u952e\u76d8\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u64cd\u4f5c\u3002 \u901a\u8fc7\u89c6\u9891\u91c7\u96c6\u8bbe\u5907\u6355\u83b7\u6d4b\u8bd5\u673a\u7684\u5b9e\u65f6\u753b\u9762\u4f20\u8f93\u7ed9\u670d\u52a1\u5668\u3002 \u670d\u52a1\u5668\u5bf9\u91c7\u96c6\u7684\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\uff0c\u8bc6\u522b\u5176\u4e2d\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5e76\u8fd4\u56de\u5143\u7d20\u63a7\u4ef6\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\uff0c\u670d\u52a1\u5668\u901a\u8fc7\u667a\u80fd\u5316\u5206\u6790\uff0c\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e00\u81f4\u5c06\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\u901a\u8fc7\u4e32\u53e3\u6a21\u62df\u952e\u9f20\u4fe1\u53f7\u53d1\u9001\u7ed9\u6d4b\u8bd5\u673a\uff1b\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e0d\u4e00\u81f4\u5c06\u4f1a\u8fdb\u5165\u4e2d\u65ad\u5904\u7406\u53ca\u5f02\u5e38\u7ed3\u679c\u8f93\u51fa\uff0c\u7ee7\u7eed\u6267\u884c\u540e\u7eed\u573a\u666f\uff0c\u76f4\u81f3\u6240\u6709\u7528\u4f8b\u6d4b\u8bd5\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u6df1\u5ea6\u5b66\u4e60\u73af\u5883\u642d\u5efa","text":"\u6a21\u578b\u8bad\u7ec3\u4e3b\u8981\u5bf9 GPU \u6709\u8981\u6c42\uff0c\u8bad\u7ec3\u6a21\u578b\u7684\u673a\u5668\u663e\u5b58\u4e0d\u4f4e\u4e8e 6G\uff0c\u5176\u4ed6\u914d\u7f6e\u65e0\u7279\u6b8a\u8981\u6c42\u3002 \u63a8\u8350\u6027\u4ef7\u6bd4\u8f83\u9ad8\u914d\u7f6e \u64cd\u4f5c\u7cfb\u7edf: UnionTech OS Desktop 20 Professional Linux version 4.19.0-desktop-amd64 (deepin@deepin-PC) (Uos 8.3.0.3-3+rebuild) \u5904\u7406\u5668: Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz (\u516b\u6838 / \u5341\u516d\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460M-HDV(RD)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))/8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: TU116 [GeForce GTX 1660]\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u865a\u62df\u73af\u5883\u5b89\u88c5","text":"cd ~\nwget -c https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh\nbash Miniconda3-latest-Linux-x86_64.sh\n \u4e00\u8def\u56de\u8f66 \u7b2c\u4e00\u6b21\u63d0\u793a\u8f93\u5165 yes/no \uff1a\u8f93\u5165 yes \u7ee7\u7eed\u4e00\u8def\u56de\u8f66 \u7b2c\u4e8c\u6b21\u63d0\u793a\uff1a\u8f93\u5165 no cd ~/miniconda3/bin\nsudo chmod 777 activate\n \u6fc0\u6d3bconda\u73af\u5883 . ./activate\n \u6dfb\u52a0\u516c\u53f8\u5185\u7f51\u6e90 conda config --add channels bioconda\nconda config --add channels conda-forge\n \u5982\u679c\u662f\u5916\u7f51\u6dfb\u52a0\u5916\u7f51\u6e90 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/\n \u5982\u679c\u8981\u5220\u9664\u6e90 conda config --remove-key channels\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"2\u3001\u5b89\u88c5\u4f9d\u8d56","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u521b\u5efa\u865a\u62df\u73af\u5883","text":"conda remove --name mmlab --all # \u79fb\u9664\u6240\u6709\u865a\u62df\u73af\u5883\n conda create -n mmlab python=3.7\n conda activate mmlab\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-pytorch","title":"\uff082\uff09\u5b89\u88c5 Pytorch","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install torch==1.7.0+cu101 torchvision==0.8.1+cu101 torchaudio==0.7.0 -f https://download.pytorch.org/whl/torch_stable.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-mmcv","title":"\uff083\uff09\u5b89\u88c5 MMCV","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install mmcv-full==1.3.3 -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.7.0/index.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"\uff084\uff09\u5b89\u88c5\u663e\u5361\u9a71\u52a8","text":"\u6839\u636e\u4f60\u7684\u663e\u5361\u4e0b\u8f7d\u5bf9\u5e94\u9a71\u52a8\uff0c\u6bd4\u5982\u6211\u7684\u663e\u5361\u4e3a GTX1660\uff0c\u9a71\u52a8\u7248\u672c\u4e3a 430\uff0c\u9a71\u52a8\u4e0b\u8f7d\u5730\u5740\uff1ahttps://www.nvidia.cn/Download/Find.aspx?lang=cn CTRL+ALT+F2 \u8fdb\u5165tty\n \u7981\u7528 nouveau \u9a71\u52a8 sudo vim /etc/modprobe.d/blacklist-nouveau.conf\n \u586b\u5165\uff1a blacklist nouveau options nouveau modeset=0\n \u5237\u65b0\u914d\u7f6e\u6587\u4ef6 sudo update-initramfs -u reboot \u91cd\u542f\u540e\u518d\u8fdb\u5165 tty \u5173\u95ed\u56fe\u50cf\u754c\u9762\uff0c\u8f93\u5165\u547d\u4ee4\u5173\u95ed\u56fe\u50cf\u754c\u9762 sudo service lightdm stop\n \u5b89\u88c5\u9a71\u52a8 sudo chmod a+x NVIDIA-Linux-x86_64-430.run\nsudo ./NVIDIA-Linux-x86_64-430.run\n reboot\u91cd\u542f\uff0cnvidia-smi\u67e5\u770b\u5b89\u88c5\u72b6\u6001\u3002\u6ce8\u610f\u770b\u4e0bcuda\u7248\u672c\uff0c10.1\uff0cdriver\u7248\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u6570\u636e\u6807\u6ce8","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u6570\u636e\u6807\u6ce8","text":"\u6807\u6ce8\u4e4b\u524d\u9700\u8981\u5148\u8f6c\u6362\u56fe\u7247\u5927\u5c0f\uff0c\u5e76\u4e14\u4ee5\u6570\u5b57\u547d\u540d\uff0c\u6bcf\u7ec4\u547d\u540d\u9012\u589e"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"\uff081\uff09\u8f6c\u6362\u5927\u5c0f\u5e76\u91cd\u547d\u540d","text":"rename_pic.py import os\nimport sys\nimport cv2\nimport time\nimport getpass\nusername = getpass.getuser()\nsource_path = f\"/home/{username}/Desktop/right_menu\" # \u56fe\u7247\u8def\u5f84\nsource_dest = os.path.join('/'.join(source_path.split(\"/\")[:-1]), 'tmp')\nif not os.path.exists(source_dest):\nos.mkdir(source_dest)\nstart_name = sys.argv[1]\nfile_name_list = list()\nfor file in os.listdir(source_path):\nif file.endswith('.png'):\nfile_name_list.append(file)\nstart_name = int(start_name)\nfor file in file_name_list:\nos.rename(os.path.join(source_path,file), os.path.join(source_path, f\"{str(start_name)}.png\"))\nstart_name += 1\ntime.sleep(1)\nfor file in os.listdir(source_path):\nimage = os.path.join(source_path, str(file))\nsrc = cv2.imread(image)\nresult = cv2.resize(src, (960, 540))\nresizeImage = os.path.join(source_dest, str(file))\nprint(resizeImage)\ncv2.imwrite(str(resizeImage), result)\ncv2.waitKey(0)\ncv2.destroyAllWindows()\ntime.sleep(1)\nos.system(f'rm -rf {source_path}/*')\nos.system(f'mv {source_dest}/* {source_path}')\nos.system(f'rm -rf {source_dest}')\nprint(\"\u4e0b\u4e00\u4e2a\u5e8f\u53f7\uff1a\", start_name)\n \u6839\u636e\u7ec8\u7aef\u8f93\u51fa\u7684\u4e0b\u4e00\u4e2a\u5e8f\u53f7\u7684\u63d0\u793a\uff0c\u6267\u884c Python \u6587\u4ef6\u7684\u65f6\u5019\u4f20\u53c2\u3002 python rename_pic.py 249\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"\uff082\uff09\u5de5\u5177\u6807\u6ce8","text":"\u4f7f\u7528\u5de5\u5177 labelImg \u6807\u6ce8 sudo pip3 install PyQt5==5.13\nsudo pip3 install labelImg\n \u7ec8\u7aef\u76f4\u63a5\u8f93\u5165 labelImg\uff0c\u56de\u8f66 \u6807\u6ce8\u6a21\u5f0f\u9009\u62e9\uff1aPascalVOC"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u667a\u80fd\u6807\u6ce8","text":"\u6253\u5f00\u5c4f\u5e55\u5f55\u5236\u8f6f\u4ef6\uff0c\u5f55\u5236\u624b\u52a8\u64cd\u4f5c\u4e00\u6b21\u6d4b\u8bd5\u7528\u4f8b\uff0c\u7136\u540e\u5c06\u5f55\u5236\u7684\u89c6\u9891\u8fdb\u884c\u5206\u5e27\uff0c\u7136\u540e\u5bf9\u6bd4\u524d\u4e24\u5e27\u56fe\u6807\u76f8\u4f3c\u5ea6\uff0c\u5254\u9664\u76f8\u4f3c\u5ea6\u8fc7\u9ad8\u7684\u56fe\u7247\uff0c\u5728\u4fdd\u8bc1\u7d20\u6750\u591a\u6837\u6027\u7684\u524d\u63d0\u4e0b\uff0c\u5254\u9664\u91cd\u590d\u591a\u4f59\u7684\u56fe\u7247\u751f\u6210\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u96c6\uff0c\u7136\u540e\u53d6\u51fa\u63a7\u4ef6\u6a21\u677f\u6570\u636e\u96c6\uff0c\u901a\u8fc7 OpenCV \u6a21\u677f\u5339\u914d\u83b7\u53d6\u63a7\u4ef6\u5728\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u56fe\u7247\u4e2d\u6240\u5728\u7684\u5de6\u4e0a\u3001\u5de6\u4e0b\u3001\u53f3\u4e0a\u3001\u53f3\u4e0b\u56db\u5904\u5750\u6807\uff0c\u4ece\u800c\u6839\u636e\u6a21\u677f\u6570\u636e\u96c6\u751f\u6210\u6807\u6ce8\u6570\u636e\u3002\u53c2\u8003\u76ee\u5f55 AnnotationMaterial"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"\uff081\uff09\u6a21\u677f\u6570\u636e\u96c6\u51c6\u5907","text":"1\u3001\u5728\u754c\u9762\u622a\u53d6\u9700\u8981\u6807\u6ce8\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u653e\u5728\u76ee\u5f55\u4e0b AnnotationMaterial/template/img 2\u3001\u7ef4\u62a4\u63a7\u4ef6\u540d\u4e0e\u5143\u7d20\u63a7\u4ef6\u7684\u952e\u5bf9\uff0c\u4e00\u4e2a\u63a7\u4ef6\u540d\u53ef\u5bf9\u5e94\u591a\u4e2a\u5143\u7d20\u63a7\u4ef6 menu:\n- menu.jpg\n- menu1.jpg\n- menu2.jpg\n- menu3.jpg\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"\uff082\uff09\u7d20\u6750\u96c6\u51c6\u5907","text":"\u5f55\u5236\u89c6\u9891\u6216\u6216\u5c4f\u5e55\u622a\u56fe\u653e\u7f6e\u76ee\u5f55 AnnotationMaterial/source"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u5f00\u59cb\u6807\u6ce8","text":"python3 AnnotationMaterial/main.py\n \u751f\u6210\u7684\u6807\u6ce8\u6570\u636e\u5b58\u653e\u5728 AnnotationMaterial/result"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#mmdetection","title":"\u56db\u3001MMDetection","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1-mmdetection","title":"1\u3001 MMDetection \u4ee3\u7801","text":"MMDetection \u662f\u4e00\u4e2a\u6709\u540d\u7684\u6df1\u5ea6\u5b66\u4e60\u76ee\u6807\u68c0\u6d4b\u5f00\u6e90\u9879\u76ee\uff0c\u4e5f\u662f openMMlab \u7684\u62db\u724c\u9879\u76ee\uff0c\u4e3a\u4ec0\u4e48\u9009\u62e9\u5b83\uff0c\u5c0f\u5b69\u513f\u6ca1\u5a18\u8bf4\u6765\u8bdd\u957f\uff0c\u611f\u5174\u8da3\u53ef\u4ee5\u81ea\u884c\u6df1\u5165\u4e86\u89e3\uff1b \u4f60\u53ef\u4ee5\u76f4\u63a5\u5728 GitHub \u4e0a\u514b\u9686\u4ee3\u7801\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u54b1\u4eec\u4ed3\u5e93\u4e0b Train \u76ee\u5f55\u4e2d\u4ee3\u7801\uff0cTrain \u4e2d\u7684\u4ee3\u7801\u4e5f\u662f\u4ece GitHub \u4e0a\u62c9\u53d6\u7684\uff0c\u4e0d\u8fc7\u6211\u4eec\u6839\u636e\u9879\u76ee\u9700\u8981\u505a\u4e86\u4e00\u4e9b\u4e8c\u6b21\u5f00\u53d1\uff0c\u63a8\u8350\u76f4\u63a5\u4f7f\u7528\u5b83\u3002 \u5982\u679c\u4f60\u60f3\u4ece GitHub \u4e0a\u62c9\uff1a git clone https://github.com/open-mmlab/mmdetection.git\n# \u4e0d\u80fd\u76f4\u63a5\u62c9\u53d6\u4e3b\u5206\u652f\uff0c\u5efa\u8bae\u4f7f\u75282.12\u7248\u672c\uff0c\u4e0d\u540c\u7684\u7248\u672c\u5bf9\u5e94\u7684mmcv\u7248\u672c\u662f\u4e0d\u540c\u7684\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-voc2coco","title":"2\u3001\u62c9\u53d6 voc2coco \u4ee3\u7801","text":"git clone https://github.com/Tony607/voc2coco.git\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-coco","title":"3\u3001\u8f6c\u6362 coco \u6570\u636e\u96c6","text":"\u5c06\u6240\u6709\u7684\u56fe\u7247\u548cxml\u6587\u4ef6\u653e\u5165train2017\uff0c\u4ece\u4e2d\u6311\u9009\u51e0\u7ec4\u653e\u5165val2017\uff08\u6d4b\u8bd5\u96c6\uff09 cd mmdetection/data/coco\npython voc2coco.py train2017 annotations/instances_train2017.json\npython voc2coco.py val2017 annotations/instances_val2017.json\n \u751f\u6210json\u6587\u4ef6"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4_1","title":"4\u3001\u4fee\u6539\u914d\u7f6e","text":"\uff081\uff09\u8bfb\u53d6\u6a21\u578b\u540d\u79f0 import json\nmodule_name = []\nwith open('./instances_train2017.json', \"r+\") as f:\njson_file = f.read()\njson_dict = json.loads(json_file)\nmodule_list = json_dict.get('categories')\nfor module_info in module_list:\nname = module_info.get('name')\nmodule_name.append(name)\nprint(module_name)\nprint(\"module_num:\", len(module_name))\n # \u6ce8\u610f\u5bf9\u6bd4instances_train2017.json\u91cc\u9762\u6a21\u578b\u540d\u79f0\u7684\u987a\u5e8f\uff0c\u4e0eCLASSES\u548ccoco_classes\u91cc\u9762\u7684\u987a\u5e8f\u4fdd\u6301\u4e00\u81f4\u3002\n \uff082\uff09\u4fee\u6539 faster_rcnn_r101_2x_coco.py mmdetection/xianjin/faster_rcnn_r101_2x_coco.py \u4fee\u653946\u884c\uff0cnum_clasess\u7684\u503c\uff0c\u65b0\u589e1\u4e2a\uff0c\u5c31 +1\uff1b \uff083\uff09\u4fee\u6539 coco.py mmdetection/mmdet/datasets/coco.py CLASSES = ()\uff0c\u5728\u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b \uff084\uff09\u4fee\u6539 class_names.py mmdetection/mmdet/core/evaluation/class_names.py coco_classes \u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#5","title":"5\u3001\u7f13\u5b58\u6e05\u7406","text":"\u5220\u9664 mmdetection/build \u76ee\u5f55 python setup.py install\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#6","title":"6\u3001\u8bad\u7ec3\u6a21\u578b","text":"\uff081\uff09\u6307\u5b9a\u81ea\u5df1\u914d\u7f6e\u7684\u8bad\u7ec3\u6a21\u578b\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py --gpus 1\n \uff082\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u6d4b\u8bd5\u96c6\u7ed3\u679c\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py xianjin/epoch_24.pth --show\n \uff083\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u51c6\u786e\u5ea6\uff1b python tools/analysis_tools/analyze_logs.py plot_curve xianjin/20210530_011907.log.json --keys acc\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#7","title":"7\u3001\u5feb\u6377\u64cd\u4f5c","text":"python3 run.py\n \u5c06\u4ee5\u4e0a 4 - 7 \u6b65\u64cd\u4f5c\u6574\u5408\u6210 run.py\uff0c\u4e00\u952e\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u4e94\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\uff1b \u670d\u52a1\u7aef\u4e00\u53f0\uff08\u76ee\u524d\u4ec5\u652f\u6301AMD\u67b6\u6784\uff09\uff1b \u91c7\u96c6\u76d2\u4e00\u4e2a \uff08ACASIS hdmi\u89c6\u9891\u91c7\u96c6\u5361\uff0chttps://item.jd.com/10024310742602.html \uff09\uff1b USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\uff1b USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff1b \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5USB\u5ef6\u957f\u7ebf\uff1b \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u63a8\u8350\u914d\u7f6e","text":"\u6267\u884c\u7528\u4f8b\u7684\u670d\u52a1\u7aef\u5bf9\u914d\u7f6e\u6ca1\u6709\u7279\u6b8a\u8981\u6c42\uff0c\u5982\u679c\u6761\u4ef6\u5141\u8bb8\u914d\u7f6e\u8d8a\u9ad8\uff0c\u8bc6\u522b\u901f\u5ea6\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n \u6d4b\u8bd5\u673a\u4e0a\u4e0d\u6267\u884c\u4efb\u4f55\u811a\u672c\uff0c\u5177\u4f53\u914d\u7f6e\u6839\u636e\u6d4b\u8bd5\u9700\u8981\u51b3\u5b9a\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#usb_mk","title":"\u516d\u3001USB_MK\u4e32\u53e3\u9a71\u52a8\u65b9\u6cd5","text":"\u4f4d\u4e8econtrol_method\u76ee\u5f55\u4e0b\u7684usb_mk.py\u6587\u4ef6 \uff081\uff09\u5217\u51fa\u53ef\u901a\u4fe1\u7684\u7aef\u53e3 python3 -m serial.tools.list_ports -v\n \uff082\uff09\u4fee\u6539\u4e32\u53e3\u7684\u6743\u9650 sudo chmod 777 /dev/ttyACM0\n \uff083\uff09\u5b9e\u4f8b\u5316USB_MK import UsbMk\nusb_mk = UsbMk(\"/dev/ttyACM0\", 9600) # \u8bbe\u5907\u9ed8\u8ba49600\u4e3a\u6ce2\u7279\u7387\uff0c\u63a7\u5236\u4f20\u8f93\u901f\u7387\n \uff084\uff09USB\u4e32\u53e3\u8bbe\u5907\u9ed8\u8ba4\u6ce2\u7279\u7387\u4e3a9600\uff08\u7ecf\u6d4b\u8bd5\u6ce2\u7279\u73879600\u51c6\u786e\u6027\u6700\u597d\uff09\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up() # \u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u6c49\u5b57\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e\n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff083\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff084\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff085\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() # \u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2\n \uff086\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff087\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff088\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e03\u3001\u65b9\u6cd5\u8c03\u7528\u5165\u53c2\u89c4\u5219","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_7","title":"1\u3001\u57fa\u7c7b","text":"class Base:\ndef __init__(self):\nself._obj = image\nself._usb = usb_mk\ndef find_element_by_ai(self, element):\nreturn self._obj.find_element(element)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_6","title":"2\u3001\u5165\u53c2\u8bf4\u660e","text":"\u56fe\u50cf\u8bc6\u522b\u65b9\u6cd5\u5165\u53e3\u4e3a Base \u7c7b\u4e0b\u7684 find_element_by_ai \u3002\u4ec5\u63a5\u53d7\u4e00\u4e2a\u53c2\u6570 element\uff0c\u7c7b\u578b\u4e3a string\u3002 \u53ef\u8bc6\u522b\u7684 string \u683c\u5f0f\uff1a \uff081\uff09\u5927\u56fe\u6807\uff08 \u56fe\u6807\u5927\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\uff0c\u4f8b\uff1a Base().find_element_by_ai(\"window\")\n \uff082\uff09\u5927\u56fe\u6807 / \u5c0f\u56fe\u6807\uff08\u56fe\u6807\u5c0f\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5c0f\u56fe\u6807\uff0c\u4f8b\uff1awindow/search_btn Base().find_element_by_ai(\"window/search_btn\")\n \uff083\uff09\u5927\u56fe\u6807 / OCR\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\u5185\u7684\u6587\u5b57\uff0c\u4f8b\uff1amenu/\u5c5e\u6027 Base().find_element_by_ai(\"menu/\u5c5e\u6027\")\n \uff084\uff09OCR\uff1a\u5168\u5c4f\u8bc6\u522b\u6587\u5b57 Base().find_element_by_ai(\"\u641c\u7d22\")\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516b\u3001\u9690\u85cf\u9f20\u6807","text":"\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u8fc7\u6765\u7684\u89c6\u9891\u6d41\uff0c\u5728\u8bc6\u522b\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u53d7\u5230\u9f20\u6807\u5f71\u54cd\uff0c\u56e0\u6b64\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u9690\u85cf\u9f20\u6807\u3002 \u5c4f\u853d\u9f20\u6807\u5149\u6807\u663e\u793a ```shell script /etc/lightdm/lightdm.conf \u5728`[Seat:*]`\u4e0b\u9762\u6dfb\u52a0\u53c2\u6570\n```shell script\nxserver-command=X -bs -core -nocursor\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e5d\u3001\u667a\u80fd\u81ea\u52a8\u5316\u7684\u610f\u4e49","text":"1\u3001\u6539\u5584 Acessibility \u5b9a\u4f4d\u7684\u7a33\u5b9a\u6027\u95ee\u9898 Acessibility \u5c5e\u6027\u5b9a\u4f4d\u5b58\u5728\u5076\u5c14\u5931\u6548\u7684\u60c5\u51b5 \uff081\uff09\u5f00\u53d1\u5728\u505a\u65b0\u9700\u6c42\u5f00\u53d1\u65f6\u53ef\u80fd\u6d89\u53ca\u5230\u5bf9\u5c5e\u6027\u6807\u7b7e\u7684\u4fee\u6539\u6216\u8005\u5c42\u7ea7\u7684\u8c03\u6574\uff0c\u53ef\u80fd\u9020\u6210\u81ea\u52a8\u5316\u7528\u4f8b\u65e0\u6cd5\u5b9a\u4f4d\u5230\u5143\u7d20\u3002 \u6bd4\u59821040\u9636\u6bb5\uff0c\u97f3\u4e50\u91cd\u6784\u7684\u65f6\u5019\uff0c\u5f00\u53d1\u5bf9\u90e8\u5206\u5c5e\u6027\u548c\u5c42\u7ea7\u505a\u4e86\u4fee\u6539\uff0c\u5bfc\u81f4\u81ea\u52a8\u5316\u7528\u4f8b\u5b9a\u4f4d\u65b9\u6cd580%\u9700\u8981\u4fee\u6539\u3002 \u5f00\u53d1\u65b0\u529f\u80fd\u7684\u65f6\u5019\u5076\u5c14\u4e5f\u4f1a\u5bf9\u5c5e\u6027\u505a\u8c03\u6574\uff0c\u9047\u52305\u6b21\u3002 \uff082\uff09\u76ee\u524d\u4e3b\u8981\u4f7f\u7528Dogtail\u8bc6\u522b\u5e94\u7528Acessibility\u5c5e\u6027\u8fdb\u884c\u5b9a\u4f4d\uff0c\u662f\u83b7\u53d6\u5e94\u7528\u5f53\u524d\u754c\u9762\u7684\u5c5e\u6027tree\uff0c\u5728\u5e94\u7528\u8df3\u8f6c\u540e\uff0cDogtail\u5b58\u5728\u65e0\u6cd5\u53ca\u65f6\u83b7\u53d6\u5f53\u524d\u5c5e\u6027\u5217\u8868\u7684\u60c5\u51b5\u3002 \u591a\u5a92\u4f53\u8c03\u7528\u6587\u7ba1\u7a97\u53e3\u7684\u65f6\u5019\uff0c\u51fa\u73b0\u627e\u4e0d\u5230\u6587\u7ba1\u91cc\u9762\u5143\u7d20\u7684\u60c5\u51b5\uff0c\u76ee\u524d\u51fa\u73b010+\u6b21\u3002 \u5e94\u7528\u8bbe\u7f6e\u9875\u9762\u7684\u5c5e\u6027\u5076\u5c14\u5b58\u5728\u627e\u4e0d\u5230\u7684\u60c5\u51b5\uff0c\u9047\u52305\u6b21\u3002 \uff083\uff09Dogtail\u5de5\u5177\u672c\u8eab\u5b58\u5728\u95ee\u9898\uff0c\u6709\u65f6\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u5019\u5f88\u6162\uff0c\u8ba9\u4eba\u65e0\u6cd5\u63a5\u53d7\uff0c\u76ee\u524d\u51fa\u73b0\u8fc7\u5f88\u591a\u6b21\u3002 \u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u95f4\u6bd4\u5e73\u5e38\u61623\u500d\uff0c\u51fa\u73b04\u6b21\u3002 2\u3001\u89e3\u51b3\u4e86\u4f7f\u7528\u7edd\u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898 \u90e8\u5206\u63a7\u4ef6\u65e0\u6cd5\u6dfb\u52a0 Acessibility \u5c5e\u6027\u4ece\u800c\u4f7f\u7528\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u51fa\u73b0\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898\u3002 \uff081\uff09\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u65b9\u6cd5\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u76ee\u6807\u56fe\u7247\u8d44\u6e90\uff0c\u5728 UI \u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u4f1a\u6d89\u53ca\u5230\u76ee\u6807\u8d44\u6e90\u7684\u66ff\u6362\uff0c\u6bd4\u8f83\u8017\u8d39\u4eba\u529b\u3002 \uff082\uff09\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6cd5\u5bf9\u6bd4\u7cbe\u5ea6\u6bd4\u8f83\u641e\uff0c\u5982\u679cUI \u7684\u53d8\u66f4\u4f1a\u9020\u6210\u65e0\u6cd5\u51c6\u786e\u5b9a\u4f4d\u5230\uff0c\u81ea\u52a8\u5316\u811a\u672c\u5065\u58ee\u6027\u4e0d\u8db3\u3002 3\u3001\u4f7f\u7528\u673a\u5668\u5206\u79bb\uff0c\u89e3\u51b3\u4e86\u81ea\u52a8\u5316\u811a\u672c\u5bf9\u5e94\u7528\u7684\u5f71\u54cd\uff0c\u771f\u5b9e\u8fd8\u539f\u7528\u6237\u7684\u4f7f\u7528\u573a\u666f \u673a\u5668\u5206\u79bb\u7684\u67b6\u6784\u8bbe\u8ba1\uff0c\u4fdd\u8bc1\u4e86\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u73af\u5883\u5b8c\u5168\u7b49\u540c\u4e8e\u7528\u6237\uff0c\u6392\u9664\u6d4b\u8bd5\u811a\u672c\u7684\u5f71\u54cd\u3002 \uff081\uff09\u76ee\u524d\u7684\u529f\u80fd\u81ea\u52a8\u5316\u662f\u5728\u6d4b\u8bd5\u673a\u4e0a\u76f4\u63a5\u8fd0\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\uff0c\u52a0\u4e0a\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u6211\u4eec\u6dfb\u52a0\u4e86\u4e00\u4e9b\u8fdb\u7a0b\u76d1\u63a7\u3001\u89c6\u9891\u5f55\u5236\u7b49\u529f\u80fd\uff0c\u81ea\u52a8\u5316\u811a\u672c\u672c\u8eab\u4f1a\u6d88\u8017\u4e00\u4e9b\u7cfb\u7edf\u8d44\u6e90\uff0c\u65e0\u6cd5\u8fd8\u539f\u771f\u662f\u7684\u7528\u6237\u4f7f\u7528\u573a\u666f\u3002 \uff082\uff09\u6027\u80fd\u6d4b\u8bd5\u9700\u8981\u6392\u9664\u5176\u4ed6\u7a0b\u5e8f\u7684\u8d44\u6e90\u6d88\u8017\u5f71\u54cd\uff0c\u6027\u80fd\u81ea\u52a8\u5316\u91c7\u7528\u673a\u5668\u5206\u79bb\uff0c\u4fdd\u8bc1\u4e86\u6027\u80fd\u6570\u636e\u7684\u51c6\u786e\u6027\u3002 \u4ee5\u524d\u7684\u7528\u4f8b\u6267\u884c\u8017\u65f6\u6ca1\u6761\u572830\u79d2\u5de6\u53f3\uff0c\u73b0\u5728\u7528\u4f8b\u8017\u65f6\u572810\u79d2\u3002 4\u3001\u89e3\u51b3\u4e86UI \u8c03\u6574\u5bfc\u81f4\u5b9a\u4f4d\u5931\u8d25\u7684\u4e0d\u7a33\u5b9a\u6027\u95ee\u9898 \uff081\uff09\u89e3\u51b3\u4e86\u56e0 UI \u8c03\u6574\u5bfc\u81f4\u63a7\u4ef6\u4f4d\u7f6e\u53d8\u5316\u6216\u8272\u5dee\u53d8\u5316\u540e\u5b9a\u4f4d\u4e0d\u51c6\u786e\u7684\u95ee\u9898\uff0c\u53ea\u8981\u63a7\u4ef6\u6587\u6848\u548c\u63a7\u4ef6\u5916\u8fb9\u6846\u65e0\u53d8\u5316\u5747\u53ef\u51c6\u786e\u5b9a\u4f4d\uff1b \uff082\uff09\u76ee\u524d\u4e5f\u4f1a\u91c7\u7528\u57fa\u4e8eUI\u7684\u5b9a\u4f4d\u65b9\u6848\uff0c\u5982\u679cUI\u4f4d\u7f6e\u6709\u8c03\u6574\uff0c\u4f1a\u5bfc\u81f4\u5143\u7d20\u65e0\u6cd5\u5b9a\u4f4d\u3002 5\u3001\u7b80\u5316\u4e86\u7528\u4f8b\u7ed3\u6784\uff0c\u63d0\u5347\u7f16\u5199\u53cb\u597d\u5ea6 \uff081\uff09\u667a\u80fd\u81ea\u52a8\u5316\u8bc6\u522b\u5143\u7d20\u7684\u65b9\u6cd5\u53ea\u6709\u4e00\u4e2a\uff0c\u5c31\u662f\u57fa\u4e8e\u6211\u4eec\u8bad\u7ec3\u7684\u6a21\u578b\u8bc6\u522b\u89c6\u9891\u6d41\u4e2d\u7684\u5143\u7d20\uff0c\u7ecf\u8fc7\u811a\u672c\u5c01\u88c5\u4e4b\u540e\uff0c\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u4e2d\u6240\u6709\u5b9a\u4f4d\u7684\u64cd\u4f5c\u90fd\u53ea\u9700\u8981\u8c03\u7528\u8fd9\u4e00\u4e2a\u65b9\u6cd5\u5c31\u884c\u4e86\uff0c\u7f16\u5199\u81ea\u52a8\u5316\u811a\u672c\u7684\u96be\u5ea6\u5927\u5927\u964d\u4f4e\u3002 \uff082\uff09\u4e5f\u662f\u7531\u4e8e\u8c03\u7528\u65b9\u6cd5\u7b80\u5355\uff0c\u5728 UI \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u4e2d\u7684\u5206\u5c42\u7ed3\u6784\u5c06\u4f1a\u51cf\u5c11\uff0c\u591a\u7ee7\u627f\u7684\u60c5\u51b5\u4f1a\u51cf\u5c11\uff0c\u81ea\u52a8\u5316\u4ee3\u7801\u7684\u8c03\u7528\u7ed3\u6784\u4e5f\u4f1a\u53d8\u5f97\u7b80\u5355\uff0c\u800c\u4e14\u529f\u80fd\u6d4b\u8bd5\u540c\u5b66\u7f16\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u66f4\u52a0\u5bb9\u6613\u4e0a\u624b\u3002 \u4ee5\u524d\u5199\u7528\u4f8b\u7531\u4e8e\u9700\u8981\u7ed3\u5408\u4e0d\u540c\u7684\u6a21\u5757\uff0c\u8c03\u7528\u4e0d\u540c\u7684\u65b9\u6cd5\uff0c\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u5e76\u5b8c\u6210\u8c03\u8bd5\u7684\u65f6\u95f4\u5e73\u5747\u572820-30\u5206\u949f\uff0c\u73b0\u5728\u5199\u7528\u4f8b\u811a\u672c\u80fd\u57285\u5206\u949f\u5de6\u53f3\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":"# =============================================\n# Attribution : Application Test Department III\n# Time : 2023/1/3\n# Author : ut003281\n# =============================================\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u7b80\u8ff0","text":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5 \u901a\u8fc7\u81ea\u52a8\u5316\u624b\u6bb5\u5bf9\u5e94\u7528\u8fdb\u884c\u6027\u80fd\u6d4b\u8bd5\uff0c\u63d0\u4f9b\u65b9\u4fbf\u7684\u73af\u5883\u90e8\u7f72\u3001\u8fd0\u884c\u914d\u7f6e\u3001\u7528\u4f8b\u7f16\u5199\u7b49\uff0c\u7528\u4e8e\u684c\u9762\u5e94\u7528\u7684\u51b7\u70ed\u542f\u52a8\u3001\u8d44\u6e90\u62f7\u8d1d\u3001\u9875\u9762\u8df3\u8f6c\u7b49\u6027\u80fd\u573a\u666f\u6d4b\u8bd5\u3002 \u4ed3\u5e93\u5730\u5740\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-perf-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u4ee3\u7801\u7ed3\u6784","text":"autotest-perf-aitest\n\u251c\u2500\u2500 apps # \u5b58\u653e\u6240\u6709\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u811a\u672c\n\u251c\u2500\u2500 conftest.py # pytest hook\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 CURRENT # \u7248\u672c\u5185\u5bb9\n\u251c\u2500\u2500 docs # \u6587\u6863\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u952e\u503c\u5bf9\u7167\u8868.pdf # \u4e32\u53e3\u7ebfcode\u4e0e\u6309\u952e\u7684\u5bf9\u7167\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u6027\u80fd\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\u6267\u884c\u5668\u4f7f\u7528\u6307\u5357.md # \u6267\u884c\u5668\u811a\u672c\u4f7f\u7528\u6307\u5357\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 USB\u4e32\u53e3\u8f6cUSB\u952e\u76d8\u9f20\u6807\u7ebf\u534f\u8bae\u6587\u4ef6V1.0.pdf # \u4e32\u53e3\u534f\u8bae\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput-0.28.2.zip # Linux\u4e0b\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\u7684\u6e90\u7801\uff0c\u53ef\u6839\u636e\u67b6\u6784\u6253\u5305\n\u251c\u2500\u2500 manage.py # \u529f\u80fd\u4e3b\u5165\u53e3\n\u251c\u2500\u2500 pytest.ini # pytst \u914d\u7f6e\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 setting # \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 client.ini # \u6d4b\u8bd5\u673a IP \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5168\u5c40\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dev_env.sh # \u5bbf\u4e3b\u673a\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose_no_relay.yml # \u65e0\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose.yml # \u6709\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker_login.sh # docker \u767b\u9646\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 res\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 black.png # \u5168\u9ed1\u56fe\u7247\uff0c\u7528\u4e8e\u4fee\u6539\u58c1\u7eb8\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_5000.deb # 3A5000 \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_amd64.deb # amd \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_arm64.deb # arm \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_mips64.deb # mips \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_sw_64.deb # sw \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 server.ini # \u670d\u52a1\u5668\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 setup.sh # \u5bb9\u5668\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 template # \u521b\u5efa app \u57fa\u7840\u811a\u672c\u6a21\u677f\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 app_template\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ${app_name}_widget.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 control-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 images\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 test_${app_name}_01_scene.json-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 test_${app_name}_01_scene.py-tpl\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 uos_docker # \u5bb9\u5668\u73af\u5883\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dockerfile\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 requirements.txt\n\u2514\u2500\u2500 src\n \u251c\u2500\u2500 analysis_save.py # \u89e3\u6790\u56fe\u7247\u6d41\u7ed3\u679c\uff0c\u6c47\u603b\u751f\u6210 excel \u62a5\u544a\n\u251c\u2500\u2500 base_widget.py # \u5c01\u88c5\u7684\u57fa\u7840\u64cd\u4f5c\uff0c\u5e94\u7528\u8c03\u7528\u7684\u4e3b\u5165\u53e3\u65b9\u6cd5\n\u251c\u2500\u2500 cmdctl.py # \u8c03\u7528\u547d\u4ee4\u884c\u4f7f\u7528\n\u251c\u2500\u2500 global_value.py # \u5168\u5c40\u53d8\u91cf\n\u251c\u2500\u2500 image_utils.py # \u56fe\u7247\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 __init__.py\n \u251c\u2500\u2500 logger_utils.py # \u65e5\u5fd7\u914d\u7f6e\n\u251c\u2500\u2500 pdocr.py # ocr \u914d\u7f6e\n\u251c\u2500\u2500 public_method.py # \u4e00\u4e9b\u65b9\u4fbf\u7684\u5c01\u4f4f\n\u251c\u2500\u2500 record.py # \u5f55\u5c4f\u76f8\u5173\n\u251c\u2500\u2500 rtk # \u8fd0\u884c\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 _base.py # \u4e00\u4e9b\u679a\u4e3e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 install_env.py # \u5b89\u88c5\u73af\u5883\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 local_runner.py # \u8fd0\u884c\u7528\u4f8b\n\u251c\u2500\u2500 serial_communication # \u4e32\u53e3\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 power_control.py # \u7ee7\u7535\u5668\u64cd\u4f5c\uff0c\u4f7f\u7528\u7ee7\u7535\u5668\u8fde\u63a5\u4e3b\u673a\u7535\u6e90\uff0c\u63a7\u5236\u5f00\u5173\u673a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 serial_common.py # \u4e32\u53e3\u516c\u5171\u65b9\u6cd5\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 usb_mk.py # \u952e\u9f20\u64cd\u4f5c\u57fa\u7840\u5c01\u88c5\n\u251c\u2500\u2500 shortcut_key.py # \u5feb\u6377\u952e\u7684\u5c01\u88c5\n\u251c\u2500\u2500 singleton.py # \u5355\u4f8b\u6a21\u5f0f\n\u251c\u2500\u2500 start_app.py # \u521b\u5efa app\n\u2514\u2500\u2500 write_xlsx.py # \u751f\u6210 excel\n# __init__.py \u6587\u4ef6\u4e3a\u6807\u8bc6\u8be5\u76ee\u5f55\u662f\u4e00\u4e2aPython\u7684\u6a21\u5757\u5305\uff0c\u9879\u76ee\u4e2d\u7684__init__.py\u5747\u4e3a\u7a7a\u6587\u4ef6\u3002\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u73af\u5883\u642d\u5efa","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\u3002 \u670d\u52a1\u7aef\u4e00\u53f0\u3002\uff08\u4ec5\u652f\u6301 AMD \u67b6\u6784\uff0c\u82e5\u9700\u5176\u4ed6\u67b6\u6784\uff0c\u54a8\u8be2\u76f8\u5173\u5f00\u53d1\u4eba\u5458\uff09 \u91c7\u96c6\u76d2\u4e00\u4e2a\u3002 \uff08ACASIS HDMI \u89c6\u9891\u91c7\u96c6\u76d2\uff0chttps://item.jd.com/100013302599.html#crumb-wrap \uff09 USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\u3002\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"\uff082\uff09\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\u3002 USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff08USB3.0 \u63a5\u53e3\u4e0a\uff09\u3002 \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5 USB \u5ef6\u957f\u7ebf\u3002 \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u670d\u52a1\u7aef\u63a8\u8350\u914d\u7f6e","text":"\u914d\u7f6e\u8d8a\u9ad8\uff0c\u89e3\u6790\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"2\u3001\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa","text":" \u6253\u5f00\u63a7\u5236\u4e2d\u5fc3\uff0c\u8d26\u6237\u8bbe\u7f6e\u4e3a\u3010\u81ea\u52a8\u767b\u5f55\u3011\u548c\u3010\u65e0\u5bc6\u7801\u767b\u5f55\u3011\uff0c\u7535\u6e90\u7ba1\u7406\u4e2d\u4f7f\u7528\u7535\u6e90\u5168\u90e8\u8bbe\u7f6e\u4e3a\u3010\u4ece\u4e0d\u3011\uff0c\u5f00\u542f\u5f00\u53d1\u8005\u6a21\u5f0f\u3002 \u6839\u636e\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u8981\u6c42\uff0c\u5bfc\u5165\u76f8\u5173\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\uff1a\u5bfc\u5165\u76f8\u518c\u3001\u5f71\u9662\u3001\u97f3\u4e50\u7684\u6d4b\u8bd5\u8d44\u6e90\u3002 \u5728\u670d\u52a1\u7aef\u6253\u5f00\u76f8\u673a\u5e94\u7528\u540e\uff0c\u5c06\u6d4b\u8bd5\u673a\u684c\u9762\u58c1\u7eb8\u66f4\u6362\u4e3a\u7eaf\u8272\u58c1\u7eb8\uff08\u6ce8\u610f\uff0c\u670d\u52a1\u7aef\u9700\u63d0\u524d\u5f00\u542f\u76f8\u673a\u540e\u518d\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u58c1\u7eb8\uff0c\u5efa\u8bae\u7eaf\u9ed1\u58c1\u7eb8 setting/res/black.png\uff09 \u5728\u6587\u4ef6\u7ba1\u7406\u5668\u4e2d\uff0c\u5c06\u9009\u9879 \u4e3b\u83dc\u5355-\u8bbe\u7f6e-\u9884\u89c8-\u56fe\u7247\u9884\u89c8 \u53d6\u6d88\u52fe\u9009\uff08\u5982\u4e0d\u53d6\u6d88\uff0c\u4f1a\u5f71\u54cd\u622a\u56fe\u5f55\u5c4f\u5e94\u7528\u7684\u6027\u80fd\u6570\u636e\uff09 \u79fb\u52a8\u6216\u5220\u9664\u7cfb\u7edf Logo \uff0c\u6392\u9664\u684c\u9762\u53f3\u4e0b\u89d2 Logo \u7684\u5f71\u54cd\uff08\u91cd\u542f\u751f\u6548\uff09\u3002 sudo mv /usr/share/deepin/uos_logo.svg ~/Pictures/\n \u5b89\u88c5\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\uff08\u5fc5\u987b\u5b89\u88c5\uff01\uff01\uff09 AMD \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_amd64.deb ARM \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_arm64.deb MIPS \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_mips64.deb 3A5000 \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_5000.deb \u5b89\u88c5\u547d\u4ee4 sudo dkpg -i xserver-xorg-input-libinput_0.28.2-2_amd64.deb\n \u5b89\u88c5\u65f6\u4f1a\u63d0\u793a\u5df2\u5b58\u5728\u76f8\u540c\u7248\u672c\uff0c\u8bf7\u5ffd\u7565\uff0c\u76f4\u63a5\u8986\u76d6\u5b89\u88c5\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u4e3b\u673a\u624d\u751f\u6548"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u670d\u52a1\u7aef\u4e00\u952e\u73af\u5883\u90e8\u7f72","text":"\u73af\u5883\u642d\u5efa\u524d\u5fc5\u987b\u5148\u8fde\u63a5\u4e0a USB \u4e32\u53e3\u7ebf\u548c\u91c7\u96c6\u76d2\u3002 \u5bbf\u4e3b\u673a\u73af\u5883\u5b89\u88c5 python3 manage.py install --env host\n \u5bb9\u5668\u73af\u5883\u5b89\u88c5 python3 manage.py install --env docker\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u56db\u3001\u914d\u7f6e\u9879","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u670d\u52a1\u7aef\u914d\u7f6e","text":"setting/config/server.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u914d\u7f6e\u9879\uff0c\u5305\u542b\u4e86\u6240\u6709\u670d\u52a1\u7aef\u6240\u6709\u7684\u53ef\u914d\u7f6e\u9879\u3002 \u672c\u5730\u65e0\u7f51\u7edc\u8fd0\u884c \u5c06\u914d\u7f6e\u9879 network=0 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u672c\u5730\u6709\u7f51\u7edc\u8fd0\u884c \u914d\u7f6e\u9879 network=1 (1)\u914d\u7f6e\u9879 client_alias= \u914d\u7f6e\u4e3a\u4f60\u8981\u6d4b\u8bd5\u7684\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5982 Alias1 \u6d4b\u8bd5\u673a\u522b\u540d\u5728 setting/config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 (2)\u914d\u7f6e\u9879 client_alias= \u4e3a\u7a7a\uff0c\u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager --client_alias Alias1\uff0c\u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002(Alias1 \u4e3a\u4f60\u914d\u7f6e\u7684\u6d4b\u8bd5\u673a\u522b\u540d) (1)\u548c(2)\u53ea\u8981\u4f7f\u7528\u5176\u4e00\u5373\u53ef\u3002 \u6709\u7f51\u7edc\u8fd0\u884c\uff0c\u4e14\u9700\u8981\u901a\u8fc7 Jenkins \u4e0a\u8fd0\u884c\u4e00\u4e2a job \uff0c\u540c\u65f6\u63a7\u5236\u591a\u53f0\u673a\u5668\u3002 \u914d\u7f6e\u9879 network=1 \u914d\u7f6e\u9879 client_alias= \u4e0d\u7528\u914d\u7f6e\uff0c\u5728\u8fd0\u884c run.sh \u7684\u65f6\u5019\u76f4\u63a5\u7a7a\u683c\u52a0\u522b\u540d\u5373\u53ef\uff0c\u6bd4\u5982\uff1a\u6d4b\u8bd5\u673a\u522b\u540d\u4e3a Alias1 \uff0c\u4e14\u5df2\u7ecf\u5728 config/client.ini \u4e2d\u914d\u7f6e\u4e86 Alias1 \u7684user ip password \uff0c\u5219\u8fd0\u884c bash run.sh Alias1 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u5728 Jenkins pipeline \u91cc\u9762\u901a\u8fc7\u5e76\u884c stage \u6216\u5e76\u884c\u8c03\u7528\u4e0b\u5c42\u4efb\u52a1\u7684\u65b9\u5f0f\u53ef\u4ee5\u5b9e\u73b0\u5927\u89c4\u6a21\u7684\u6027\u80fd\u6d4b\u8bd5\u9700\u6c42\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;1\u3001KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2\u3001KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f, e.g. TAGS = L1 or smoke\n[case_conf]\n# \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\uff0cocr\u6587\u6848\u8bc6\u522b\u8f83\u6162\uff0c\u4e0d\u63a8\u8350\u4f7f\u7528\nfind_by = stage\n# \u6700\u540e\u4e00\u4e2a\u7a33\u5b9a\u9636\u6bb5\u7684\u5e27\u6570\u8bc6\u522b\n# \u9996\u5e27\u5b58\u5728\u540e\u7684\u7b2c\u4e00\u4e2a\u5927\u4e8e\u8be5\u914d\u7f6e\u5e27\u6570\u7684\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u5c3e\u5e27\nfinal_stable_num=100\n# \u4ece\u8be5\u5e27\u6570\u5f00\u59cb\u8bc6\u522b\u6587\u6848\u6216\u56fe\u7247\uff0c\u51cf\u5c11\u5206\u6790\u65f6\u95f4\nstart_num = 150\n# \u8bc6\u522b\u7684\u6587\u6848\ntext=\n# \u8bc6\u522b\u56fe\u7247\nmatch=apps/xxx/images/match.png\n# \u8bc6\u522b\u76f8\u4f3c\u5ea6\nmatch_rate=0.9\n# \u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6bd4\u5982\u70ed\u542f\u52a8\u7528\u4f8b\uff0c\u4ece\u70b9\u51fb\u6253\u5f00\u5230\u505c\u6b62\u5f55\u5c4f\uff0c\u4e2d\u95f4\u7b49\u5f855\u79d2\uff1b\nduration = 15\n# \u5355\u6761\u7528\u4f8b\u6267\u884c\u7684\u6b21\u6570\ncount = 5\n# \u7a33\u5b9a\u9636\u6bb5\u5212\u5206\u7684\u76f8\u4f3c\u5ea6\nstable_similarity = 0.9997\n[server]\n# \u8c03\u8bd5\u6a21\u5f0f=1\uff0c\u4e3a\u5f00\u542f\u8c03\u8bd5\u6a21\u5f0f\uff0c0\u4e3a\u5173\u95ed\u3002\n# \u8c03\u8bd5\u6a21\u5f0f\u4e0b\u9ed8\u8ba4\u53ea\u6267\u884c\u4e00\u6b21\u7528\u4f8b\uff0c\u4e0d\u5173\u673a\n# \u7f16\u5199\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u5efa\u8bae\u5f00\u542fmaintain\u3002\nMAINTAIN = 0\n# \u8fd0\u884c\u7684\u73af\u5883docker\u5bb9\u5668\u73af\u5883\uff0chost\u5bbf\u4e3b\u673a\u73af\u5883\nENV = docker\n# \u670d\u52a1\u7aef\u5bc6\u7801\nPASSWORD=1\n# \u6307\u5b9a\u6d4b\u8bd5\u673a\u522b\u540d\n# \u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6bd4\u5982\uff1a\n# [AMD]\n# ip=10.8.15.86\n# user=uos\n# \u5176\u4e2d AMD \u4e3a\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5219client_alias=AMD\nCLIENT_ALIAS = x86\uff08Intel-i7\uff09\n# 1 \u5f00\u542f\u7f51\u7edc, 0 \u5173\u95ed\u7f51\u7edc\n# \uff081\uff09\u670d\u52a1\u7aef\u4e0e\u6d4b\u8bd5\u673a\u987b\u5728\u540c\u4e00\u7f51\u6bb5\u4e0b\uff0c\u4f60\u53ef\u4ee5\u5c1d\u8bd5\u5728\u670d\u52a1\u7aef\u901a\u8fc7ssh\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c\u5982\u679c\u53ef\u4ee5\u8fde\u63a5\uff0c\u8bf4\u660e\u7f51\u7edc\u6b63\u5e38\u3002\n# \uff082\uff09\u5f53input_type=FILE_NAME \u65f6\uff0c\u5fc5\u987b\u5f00\u542f\u7f51\u7edc\u3002\nNETWORK = 1\n# \u6027\u80fd\u7ed3\u679c\u7edf\u8ba1\u5355\u4f4d \u6beb\u79d2\u2014ms, \u79d2\u2014s\nUNIT=ms\n# \u6d4b\u8bd5\u673a\u5f00\u673a\u8fdb\u5165\u684c\u9762\u540e\u7b49\u5f85\u65f6\u95f4,\u5355\u4f4d/\u79d2\nSTARTUP_DELAY = 60\n# 1\u4e3a\u5220\u9664\u7f13\u5b58\uff0c0\u4e3a\u4e0d\u5220\u9664\u7f13\u5b58\n# \u7528\u4f8b\u6267\u884c\u5b8c\u540e\u4f1a\u5728report\u76ee\u5f55\u4e0b\u751f\u6210\u667a\u80fd\u89e3\u6790\u7684\u4e00\u4e9b\u7f13\u5b58\u56fe\u7247\u3002\nCACHE = 0\n# \u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u62a5\u544a\u4f1a\u4fdd\u5b58\u5728\u9879\u76ee\u4e0breport\u76ee\u5f55\u4e2d\uff1b\n# \u6307\u5b9a\u62a5\u544a\u76ee\u5f55\u5219\u5b58\u653e\u5230\u6307\u5b9a\u76ee\u5f55\u3002\nREPORT_PATH = report\n# \u670d\u52a1\u7aef\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684icon\u8d44\u6e90\u4f1a\u7f13\u5b58\u5728\u9879\u76ee\u4e0binput\u76ee\u5f55\u4e2d\nINPUT = input/\n# 1\u4e3a\u6d4b\u8bd5\u5b8c\u5173\u673a\uff0c0\u4e3a\u6d4b\u8bd5\u5b8c\u4e0d\u5173\u673a\nSHUTDOWN = 0\n# \u89e3\u6790\u8fdb\u7a0b\u6570\uff08\u4e0d\u63a8\u8350\u4fee\u6539\uff09\n# 3\u4e2a\u8fdb\u7a0b\u89e3\u6790\u89c6\u9891\u5df2\u7ecf\u80fd\u591f\u6ee1\u8db3\uff0c\u5373\u4f7f\u589e\u52a0\u8fdb\u7a0b\u6570\u4e5f\u4e0d\u80fd\u51cf\u5c11\u6574\u4f53\u8017\u65f6\n# \u53e6\u5916\u8fd8\u8981\u770bCPU\u6838\u6570\u662f\u5426\u652f\u6301\u3002\nPARSING_PROCESS = 3\n# 1\u4e3a\u4f7f\u7528\u7ee7\u7535\u5668\u5f00\u5173\u673a\uff0c0\u4e3a\u4f7f\u7528reboot\u547d\u4ee4\u91cd\u542f\u3002\u4f9d\u8d56\u7ee7\u7535\u5668\u786c\u4ef6\u8bbe\u5907\uff0c\u9700\u8981\u4f7f\u7528\u8054\u7cfb\u5f00\u53d1\u8005\nRELAY = 0\n# \u83b7\u53d6\u6d4b\u8bd5\u5e94\u7528\u7684\u7248\u672c, %s \u5360\u4f4d\u5e94\u7528\u540d\n# \u5982\u679c\u8be5\u914d\u7f6e\u4e3a\u7a7a\uff0c\u5219\u4e0d\u83b7\u53d6\u5e94\u7528\u7684\u7248\u672c\u4fe1\u606f\u3002\nCOMMAND = apt policy %s 2>/dev/null|grep \"\u5df2\u5b89\u88c5\"|awk -F \"\uff1a\" \"{print \\$2}\"\n# \u5173\u673a\u7b49\u5f85\u5f00\u542f\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6839\u636e\u6d4b\u8bd5\u673a\u6027\u80fd\u4e0d\u540c\uff0c\u5f00\u5173\u673a\u8017\u65f6\u53ef\u80fd\u4e0d\u540c\uff0c\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u673a\u60c5\u51b5\u914d\u7f6e\u3002\nSHUTDOWN_DELAY = 30\n# \u53ef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u56fe\u7247\u683c\u5f0f\uff0c\u4ee5\u82f1\u6587\u9017\u53f7\u9694\u5f00\u3002\n# \u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u76ee\u524d\u6211\u4eec\u4ec5\u9a8c\u8bc1\u4e86jpg,jpeg,png\u8fd9\u4e09\u79cd\u5e38\u7528\u7684\u56fe\u7247\u683c\u5f0f\u3002\nINPUT_TYPES = jpg,jpeg,png\n# \u6027\u80fd\u5206\u6790\u8865\u5e27\uff0c\u7b49\u4e8e\u6216\u4f4e\u4e8e\u8be5\u503c\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u9700\u8981\u51cf\u6389\u3002\nUN_STAB_START = 3\n# \u670d\u52a1\u7aef\u83b7\u53d6\u6d4b\u8bd5\u673a\u56fe\u50cf\u7684\u5e27\u7387\uff0c\u5373\u6bcf\u79d2\u83b7\u53d6\u591a\u5c11\u5f20\u6d4b\u8bd5\u673a\u4e0a\u7684\u56fe\u50cf\u3002\n# \u9ed8\u8ba4\u5e27\u7387\u4e3a30\u5e27/\u79d2\uff0c\u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u53ef\u80fd\u4f1a\u5bf9\u89e3\u6790\u7ed3\u679c\u9020\u6210\u504f\u5dee\u3002\nFPS = 30\n# \u4ee5\u4e0b\u573a\u666f\u7c7b\u578b\u4f1a\u91cd\u542f\u6d4b\u8bd5\u673a,\u591a\u79cd\u573a\u666f\u4f7f\u7528\u9017\u53f7\u9694\u5f00\nSCENE = cold\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = http://10.8.13.78:8890\n#\u5c4f\u5e55\u56fe\u7247\u4e34\u65f6\u5b58\u653e\u4f4d\u7f6e\nSCREEN_CACHE = /tmp/screen\n# =======================================\n[log]\n# \u65e5\u5fd7\u7ea7\u522b\uff0cOFF\u3001FATAL\u3001ERROR\u3001WARN\u3001INFO\u3001DEBUG\u3001ALL\n# \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u65e5\u5fd7\u8f93\u51fa\uff0clog_cli=INFO\u8868\u793a \u4ec5\u8f93\u51faINFO\u53ca\u4ee5\u4e0a\u7ea7\u522b\u7684\u65e5\u5fd7\u3002\nLOG_LEVEL = DEBUG\n# \u65e5\u5fd7\u6587\u4ef6\u4fdd\u5b58\u8def\u5f84\nLOG_PATH= logs\n# =======================================\n[dockerhub]\n# \u5bb9\u5668\u767b\u9646\u8d26\u53f7\nDOCKER_USER = user\n# \u5bb9\u5668\u767b\u9646\u5bc6\u7801\nDOCKER_PASSWORD = User1234\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u6d4b\u8bd5\u673a\u914d\u7f6e","text":"setting/config/client.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u4fe1\u606f\u3002 \u6709\u7f51\u7edc\u7684\u60c5\u51b5\u4e0b\uff0c\u670d\u52a1\u7aef\u9700\u8981\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u56e0\u6b64\u4f60\u9700\u8981\u5199\u5165 \u6d4b\u8bd5\u673a\u522b\u540d \u3001 user \u3001ip\u3001 password \u3002 # \u6d4b\u8bd5\u673a\u522b\u540d\n[Alias1] # \u6d4b\u8bd5\u673aip\nip=10.8.15.86 # \u6d4b\u8bd5\u673a\u7528\u6237\u540d\nuser=uos\n \u547d\u540d\u5efa\u8bae\uff1aAliasA1\u3001AliasA2\u3001AliasB1\u3001AliasB2\uff0c\u4e0d\u8981\u91cd\u540d\u3002 \u65e0\u7f51\u7edc\u60c5\u51b5\u4e0b\uff0c\u4ec5\u9700\u8981\u5173\u6ce8\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\u9879 width=\u3001 height= \u5373\u53ef\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a [client]\n# \u9ed8\u8ba4\u6d4b\u8bd5\u673a\u7528\u6237\u540d\uff0c\u5bc6\u7801\uff0cip\nip=\nuser=\n# \u6d4b\u8bd5\u673a\u5bc6\u7801\npassword=1\n# \u6d4b\u8bd5\u673a\u4e3b\u9898\ntheme=bloom\n# \u6d4b\u8bd5\u673aicon\u76ee\u5f55\npath=/usr/share/icons\n# \u7cfb\u7edfdesktop\u6587\u4ef6\u7684\u5b58\u653e\u76ee\u5f55\uff0cUOS\u7cfb\u7edf\u9ed8\u8ba4\u4e3a/usr/share/applications\ndesktop_path=/usr/share/applications\n# \u7528\u4e8e\u5224\u65ad\u6d4b\u8bd5\u673a\u662f\u5426\u5f00\u673a\u8fdb\u5165\u684c\u9762\u7684\u8bc6\u522b\u6807\u8bc6\u3002\n# 1\u3001\u901a\u8fc7\u684c\u9762\u56fe\u6807\u8bc6\u522b\u3002\n# - type=FILE_NAME\u65f6\uff0c\u670d\u52a1\u5668\u548c\u6d4b\u8bd5\u673a\u5fc5\u987b\u5728\u540c\u4e00\u5c40\u57df\u7f51\u5185\u3002\n# - power_on=dde-computer\u8868\u793a\u901a\u8fc7\u684c\u9762\u8ba1\u7b97\u673a\u56fe\u6807\u5224\u65ad\u5f00\u673a\u8fdb\u5165\u684c\u9762\u3002\n# 2\u3001\u901a\u8fc7\u672c\u5730\u56fe\u7247\u4f5c\u4e3a\u5f00\u673a\u8bc6\u522b\u3002\n# - type= \u4f20\u5165\u4e3a\u56fe\u7247\u683c\u5f0f\uff0ctype\u652f\u6301\u7684\u7c7b\u578b\u5305\u542b\u5728server.ini\u5185\u914d\u7f6e\u9879input_type=jpg,jpeg,png\u3002\n# - power_on= \u4f20\u5165\u7684\u662f\u672c\u5730\u56fe\u7247\u7684\u8def\u5f84\u3002\ntype=FILE_NAME\npower_on=dde-computer\n# \u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\uff08\u6d4b\u8bd5\u673a\u8fde\u63a5\u91c7\u96c6\u76d2\uff0c\u91c7\u96c6\u76d2\u7684\u5206\u8fa8\u7387\uff09\nheight=1080\nwidth=1920\n[AliasA1] ip=10.8.15.86\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n[AliasA2]\nip=10.8.15.20\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_2","title":"3\u3001\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e","text":"\u968f\u7740\u6d4b\u8bd5\u573a\u666f\u7684\u4e0d\u65ad\u5f15\u5165\uff0c\u53d1\u73b0\u73b0\u6709\u670d\u52a1\u7aef\u91cc\u7684\u914d\u7f6e\u9879\u5e76\u4e0d\u9002\u7528\u4e8e\u6240\u6709\u7684\u6027\u80fd\u573a\u666f\uff0c\u4e8e\u662f\u5c06\u670d\u52a1\u7aef\u914d\u7f6e\u8fdb\u884c\u4e00\u4e2a\u63d0\u53d6\uff0c\u53ef\u505a\u5355\u4e2a\u573a\u666f\u7684\u4e2a\u6027\u5316\u914d\u7f6e\uff0c\u5f53\u7136\u539f\u6765\u7684\u670d\u52a1\u7aef\u914d\u7f6e\u529f\u80fd\u4fdd\u7559\uff0c\u53ea\u662f\u5f53\u4f60\u914d\u7f6e\u4e86\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e\u540e\uff0c\u4f18\u5148\u4f7f\u7528\u4e2a\u6027\u5316\u914d\u7f6e\u91cc\u9762\u7684\u5185\u5bb9\uff0c\u4ee5\u4e0b\u662f\u5bf9\u4e2a\u6027\u5316\u914d\u7f6e\u7684\u4ecb\u7ecd\u3002 \u76ee\u524d\u6bcf\u4e00\u4e2a py \u6587\u4ef6\u5bf9\u5e94\u4e00\u4e2a\u6027\u80fd\u6d4b\u8bd5\u573a\u666f\uff0c\u4e8e\u662f\u5728\u540c\u7ea7\u76ee\u5f55\u4e0b\u521b\u5efa\u4e00\u4e2a\u4e0e\u4e4b\u540c\u540d\u7684 json \u6587\u4ef6\uff0c\u4f5c\u4e3a\u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6 apps\n\u251c\u2500\u2500 album\n \u251c\u2500\u2500 test_album_01_start.json # \u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6\n\u2514\u2500\u2500 test_album_01_start.py # \u6027\u80fd\u573a\u666f\u6587\u4ef6\n \u4ee5\u4e0b\u662f\u5bf9 json \u6587\u4ef6\u4e2d\u914d\u7f6e\u7684\u89e3\u91ca\uff0c\u82e5\u67d0\u9879\u914d\u7f6e\u4e0d\u9700\u8981\uff0c\u53ef\u4ee5\u7f3a\u5931\uff0c\u4f46\u4e0d\u80fd\u4e3a\u7a7a\uff1b {\n\"title\": \"test_album_start\", # \u6807\u9898\uff1b\u5fc5\u987b\n\"app_name\": \"deepin-album\", # \u573a\u666f\u6240\u5c5e\u7684\u5e94\u7528\uff1b\u5fc5\u987b\n\"scene\": \"hot\", # \u573a\u666f\u522b\u540d\uff1b\u5fc5\u987b\n\"icon\": [\"deepin-album\"], # \u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684icon\u5230\u670d\u52a1\u7aef\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\uff1b\u53ef\u7f3a\u5931\n# \u6ce8\u610f\uff1a\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684desktop\u6587\u4ef6\u540d\u4e3adeepin-album.desktop\uff0c\n# \u53ea\u9700\u8981\u5199deepin-album\u5373\u53ef\uff0c\u201c.desktop\u201d\u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002\n\"size\": { # \u56fe\u7247\u5bf9\u6bd4\u7684\u533a\u57df\u8bbe\u7f6e\u9879\uff0c\u67d0\u4e9b\u5e94\u7528\u5f53\u524d\u5c4f\u5e55\u7684\u90e8\u5206\u533a\u57df\u9700\u8981\u5c06\u5176\u53bb\u6389\uff0c\u53ef\u4ee5\u8bbe\u7f6e\u6b64\u9879\uff0c\u5982\u679c\u6ca1\u6709\u5219\u53ef\u4e0d\u5199\uff1b\u53ef\u786e\u5b9e\n\"x-coordinate\": 0, # \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n\"y-coordinate\": 0, # \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n\"width\": 850, # \u6a2a\u5411\u957f\u5ea6\n\"height\": 1920 # \u7eb5\u5411\u9ad8\u5ea6\n},\n\"count\": 5, # \u573a\u666f\u6267\u884c\u7684\u6b21\u6570\uff1b\u5fc5\u987b\n\"duration\": 5, # \u8be5\u6761\u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff0c\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7279\u5b9a\u573a\u666f\uff0c\u8be5\u914d\u7f6e\u4e3a\u53ef\u9009\u9879\uff0c\u8986\u76d6 server.ini \u4e2d\u7684\u914d\u7f6e\uff1b\u53ef\u7f3a\u5931\n\"stable_similarity\": 0.9997, # \u6027\u80fd\u573a\u666f\u5206\u9636\u6bb5\u65f6\u7684\u56fe\u7247\u76f8\u4f3c\u5ea6\u5bf9\u6bd4\uff0c\u524d\u540e\u56fe\u7247\u4f4e\u4e8e\u8be5\u503c\uff0c\u5219\u5206\u4e3a\u4e0d\u7a33\u5b9a\u9636\u6bb5\uff1b\u53ef\u7f3a\u5931\n\"find_by\": \"stage\", # \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\n\"final_stable_num\": 100, # \u67e5\u627e\u6700\u540e\u4e00\u4e2a\u5927\u4e8e\u8be5\u503c\u7684\u7a33\u5b9a\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u7684\u5c3e\u796f\uff1b\u53ef\u7f3a\u5931\n\"start_num\": 150,\n\"text\": \"\", # ocr\u8bc6\u522b\u7684\u6587\u6848\n\"match\": \"apps/xxx/images/match.png\", # \u56fe\u50cf\u5339\u914d\u7684\u56fe\u7247\u6587\u4ef6\u8def\u5f84\n\"match_rate\": 0.9 # \u5339\u914d\u76f8\u4f3c\u5ea6\n}\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e94\u3001\u6d4b\u8bd5\u6d41\u7a0b","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516d\u3001\u7528\u4f8b\u7f16\u5199\u53ca\u65b9\u6cd5\u53c2\u6570\u6307\u5f15","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"1\u3001\u7528\u4f8b\u5b9e\u4f8b\u8bf4\u660e","text":"# \u6807\u51c6\u5e93\u5bfc\u5165\nfrom time import sleep\n# \u5bfc\u5165\u4e09\u65b9\u5e93pytest\nimport pytest\n# \u5bfc\u5165\u7528\u4f8b\u6267\u884c\u8981\u7528\u5230\u7684Widget\u7c7b\nfrom src.base_widget import BaseWidget\nclass TestStart:\n# class\u7ea7\u522b\u7684fixture\uff0c\u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u6267\u884c\u3002autouse=True \u81ea\u52a8\u5728\u5f53\u524d\u4f5c\u7528\u57df\u4e0b\u4f7f\u7528\u3002\n@pytest.fixture(scope=\"class\", autouse=True)\n# \u6d4b\u8bd5\u70ed\u542f\u52a8\u4e4b\u524d\u9700\u8981\u9884\u542f\u52a8\u3002\ndef application_pre_start(self):\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().right_click_element(\"deepin-album\")\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().click_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\")\nsleep(2)\n# \u5feb\u6377\u952e\u5173\u95ed\u7a97\u53e3\nBaseWidget().hot_key(\"alt\", \"f4\")\nsleep(2)\n# \u9ed8\u8ba4\u4e3afunction\u7ea7\u522b\u7684fixture\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\uff0cclass\u7ea7\u522bfixture\u6267\u884c\u4e4b\u540e\u6267\u884c\u3002\n@pytest.fixture(autouse=True)\ndef setup_start(self):\n# \u53f3\u952e\u70b9\u51fb deepin-album \u56fe\u6807\nBaseWidget().right_click_element(\"deepin-album\")\n# \u79fb\u52a8\u5230\u53f3\u952e\u83dc\u5355\u4e2d\u6253\u5f00\uff08open.png\uff09\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().move_to(*BaseWidget().find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))\n# \u7b49\u5f85\u79fb\u52a8\u5b8c\u6210\nsleep(0.5)\ndef test_album_start(self):\n# \u70b9\u51fb\u201c\u6253\u5f00\u201d\nBaseWidget().click() \n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"2\u3001\u65b9\u6cd5\u53c2\u6570\u8bf4\u660e","text":"2.1\u3001find_element \u65b9\u6cd5 def find_element(element: str, input_type: str = \"FILE_NAME\", fill_color_position: tuple = (-1, -1), size: tuple = (25, 70)):\npass\n \u53c2\u6570 element \u548c input_type \uff081\uff09\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u5143\u7d20 - `input_type` \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a `FIEL_NAME` \uff0c\u8868\u793a\u901a\u8fc7\u5e94\u7528 `icon` \u5bfb\u627e\u5143\u7d20\uff0c\u6b64\u65b9\u6cd5\u4f1a\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u5e94\u7528 `icon` \u56fe\u6807\u3002\n \u4e3e\u4f8b\uff1a\u9ed8\u8ba4\u60c5\u51b5\u4e0b input_type \u53c2\u6570\u4e0d\u9700\u8981\u4f20\u5165\uff0c find_element(\"deepin-album\")\uff0c\u8868\u793a\u901a\u8fc7 deepin-album \u7684\u5e94\u7528 icon \u6765\u83b7\u53d6\u5750\u6807\uff0c\u6ce8\u610f\uff0c\u6b64\u65f6\u4f20\u5165\u7684 deepin-album \u53c2\u6570\u5b9e\u9645\u662f desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u548c2.3\u4e2d\u7684 icon \u53d8\u91cf\u4e00\u81f4\u3002 \u6211\u4eec\u5efa\u8bae\u4f18\u5148\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\uff0c\u4f46\u6b64\u65b9\u6cd5\u4f9d\u8d56\u7f51\u7edc\uff0c\u8bf7\u6839\u636e\u6d4b\u8bd5\u73af\u5883\u5b9e\u9645\u60c5\u51b5\u9009\u62e9\u3002 \uff082\uff09\u901a\u8fc7\u672c\u5730\u56fe\u7247\u8bc6\u522b\u5143\u7d20 - \u53c2\u6570 `input_type` \u4f20\u5165\u56fe\u7247\u683c\u5f0f\uff0c\u6bd4\u5982\u622a\u53d6\u7684\u672c\u5730\u56fe\u7247\u683c\u5f0f\u4e3a `png`\uff0c\u90a3\u4e48 `input_type=\"png\"`\uff0c\u6b64\u65f6\u53c2\u6570 `element ` \u4f20\u5165\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5efa\u8bae\u5b58\u653e\u5728\u5bf9\u5e94\u7684\u4ea7\u54c1 `apps/app/picture/` \u76ee\u5f55\u4e0b\uff0c\u8def\u5f84\u4e3a\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u7684\u76f8\u5bf9\u8def\u5f84\u3002\n- \u4e3e\u4f8b\uff1a`find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))`\uff0c\u8868\u793a\u901a\u8fc7\u672c\u5730\u56fe\u7247 `open.png` \u8bc6\u522b\u5143\u7d20\u3002\n \u53c2\u6570 fill_color_position fill_color_position \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (-1, -1)\uff0c(-1, -1) \u8868\u793a\u53d6\u5c4f\u5e55\u4e2d\u53f3\u4e0b\u89d2\u6700\u540e\u4e00\u4e2a\u50cf\u7d20\u70b9\u4f5c\u4e3a\u586b\u5145\u5750\u6807\uff0c\u5728 1920x1080 \u5c4f\u5e55\u5206\u8fa8\u7387\u4e0b\u5373\u5b9e\u9645\u5750\u6807\u4e3a (1919, 1079) \uff0c\u8fd9\u6837\u7684\u5199\u6cd5\u53ef\u4ee5\u9002\u914d\u4e0d\u540c\u5927\u5c0f\u7684\u5c4f\u5e55\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0d\u540c\u65b9\u4f4d\uff1a \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0b\u65b9\uff0c\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u4e0d\u9700\u8981\u4f20\u5165\u8be5\u53c2\u6570\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u5de6\u8fb9\uff0cfill_color_position=(1, 1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u53f3\u8fb9\uff0cfill_color_position=(-1, -1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0a\u8fb9\uff0cfill_color_position=(1, 1) \u4ece\u684c\u9762\u542f\u52a8\u5e94\u7528\uff0c\u5219\u9700\u8981\u4f20\u5165\u9664\u4efb\u52a1\u680f\u4ee5\u5916\u5176\u4ed6\u4f4d\u7f6e\u7684\u5750\u6807\uff0c\u6bd4\u5982(100, 100)\uff0c\u53ea\u8981\u8fd9\u4e2a\u5750\u6807\u4e3a\u9664\u5e94\u7528\u548c\u4efb\u52a1\u680f\u533a\u57df\u90fd\u53ef\u4ee5\u3002 \u4ece\u542f\u52a8\u5668\u91cc\u9762\u542f\u52a8\u5e94\u7528\uff0c\u9700\u8981\u586b\u5145\u7684\u5750\u6807\u4e3a\u542f\u52a8\u5668\u533a\u57df\u3002 \u6ce8\uff1a\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u65f6\uff0c\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684 icon \u539f\u6587\u4ef6\u4e3a svg \u77e2\u91cf\u56fe\uff0c\u8f6c\u6362\u4e3a png \u4e4b\u540e\u9700\u8981\u586b\u5145\u8fb9\u7f18\u900f\u660e\u90e8\u5206\u3002 \u53c2\u6570 size size \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (25, 70)\uff0c\u8868\u793a\u6d4b\u8bd5\u673a\u4e0a dock \u680f\u4e0a\u5e94\u7528\u56fe\u6807\u7684\u5927\u5c0f\u8303\u56f4\u3002 UOS \u7cfb\u7edf dock \u680f\u662f\u53ef\u4ee5\u4e0a\u4e0b\u62d6\u52a8\u5927\u5c0f\u7684\uff0c\u968f\u7740 dock \u680f\u5927\u5c0f\u6539\u53d8\uff0c\u5e94\u7528\u56fe\u6807\u7684\u8303\u56f4\u4e3a25\u523070\u4e4b\u95f4\u3002 \u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u64cd\u4f5c\u7cfb\u7edf\u4e0a dock \u680f\u5927\u5c0f\u4e0d\u4e00\u6837\uff0c\u53ef\u4ee5\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u4f20\u5165\u5927\u5c0f\u8303\u56f4\u3002 2.2\u3001click_element\u3001 right_click_element\uff0c double_click_element \u8fd9\u51e0\u4e2a\u65b9\u6cd5\u53c2\u6570\u89c4\u5219\u4e0e find_element \u65b9\u6cd5\u4e00\u6837\u3002\u4ed6\u4eec\u5b9e\u9645\u4e0a\u662f\u5728 find_element \u65b9\u6cd5\u57fa\u7840\u4e4b\u4e0a\u505a\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u589e\u52a0\u4e86\u9f20\u6807\u7684\u52a8\u4f5c\uff0c\u5982\u679c\u4f60\u4e0d\u60f3\u4f7f\u7528\u8fd9\u51e0\u4e2a\u65b9\u6cd5\uff0c\u5728\u7528\u4f8b\u4e2d\u4e5f\u53ef\u4ee5\u901a\u8fc7 find_element \u83b7\u53d6\u5230\u5750\u6807\uff0c\u7136\u540e\u5c06\u5750\u6807\u4f20\u5165\u5230\u952e\u9f20\u7684\u65b9\u6cd5\u4e2d\uff0c\u53ef\u4ee5\u5b9e\u73b0\u540c\u6837\u7684\u6548\u679c\u3002 2.3\u3001\u7528\u4f8b\u7c7b\u4e2d\u6709\u4e2a\u7c7b\u53d8\u91cf icon = [\"deepin-album\"] \u9700\u8981\u7279\u6b8a\u8bf4\u660e\uff0c\u5217\u8868\u4e2d\u7684\u5143\u7d20\u4e3a\u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709 icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684 icon \u5230\u670d\u52a1\u7aef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528 desktop \u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684 desktop \u6587\u4ef6\u540d\u4e3a deepin-album.desktop\uff0c\u53ea\u9700\u8981\u5199 deepin-album \u5373\u53ef\uff0c.desktop \u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e03\u3001\u6267\u884c\u5165\u53e3","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"1\u3001\u7528\u4f8b\u7ec4\u7ec7","text":"\u5728 setting/config/server.ini \u6587\u4ef6\u4e2d APP_NAME= \u5b57\u6bb5\u4e3a\u7528\u4f8b\u7684\u6267\u884c\u7684\u76ee\u5f55\uff0c\u9ed8\u8ba4\u4e3a apps \u76ee\u5f55\u4e0b\u6240\u6709\u7528\u4f8b\u3002\u5982\u679c\u4f60\u60f3\u6307\u5b9a\u6267\u884c\u67d0\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4f60\u53ef\u4ee5\u5c06\u8be5\u914d\u7f6e\u9879\u6307\u5b9a\u5230\u5e94\u7528\u7684\u7528\u4f8b\u76ee\u5f55\uff0c\u6bd4\u5982\uff1aAPP_NAME=deepin_album\uff0c \u8868\u793a\u6267\u884c\u76f8\u518c\u76ee\u5f55\u4e0b\u7684\u7528\u4f8b\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a python3 manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music\n -k KEYWORDS, --keywords KEYWORDS\n \u7528\u4f8b\u7684\u5173\u952e\u8bcd\n -t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e\n --log_level LOG_LEVEL \u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n --env {host,docker} \u5728\u5bbf\u4e3b\u673a\u6216\u5bb9\u5668\u73af\u5883\u6267\u884c\n --client_alias \u9009\u62e9\u6d4b\u8bd5\u673a\u522b\u540d, \u53ef\u9009\u9879\u4e3aclient.ini\u4e2d\u5df2\u914d\u7f6e, \u9ed8\u8ba4\u503c\u4e3a zx-x86.\n --count \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a python3 manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\" --env docker\n \u6ce8\uff1a\u5728\u5bb9\u5668\u4e2d\u6267\u884c\u65f6\uff0c\u82e5\u5f3a\u5236\u9000\u51fa\uff0c\u5bb9\u5668\u5e76\u4e0d\u4f1a\u505c\u6b62\u8fd0\u884c\uff01"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_9","title":"\u516b\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1json","title":"1\u3001Json \u62a5\u544a","text":"\u81ea\u7814\u89c6\u9891\u89e3\u6790\u5de5\u5177\u4f1a\u5bf9\u5355\u6761\u7528\u4f8b\u6267\u884c\u4e00\u8f6e\u751f\u6210\u4e00\u4e2a json \u6587\u4ef6\uff0c\u5b58\u653e\u4e8e report/{app_name}/{scene}/{run_num} \u76ee\u5f55\u4e0b\uff0c\u547d\u540d\u683c\u5f0f\u4e3a\uff1a report.json json \u5185\u5bb9\u4e3e\u4f8b\uff1a [\n{\n\"Stab1\": {\n\"images\": [1,2...150,151],\n\"startStub\": 0,\n\"type\": \"Stab\"\n}\n},\n{\n\"Stab2\": {\n\"images\": [152,153...169,170],\n\"startStub\": 1,\n\"type\": \"UnStab\"\n}\n},\n{\n\"Stab3\": {\n\"images\": [171,172...300,301],\n\"startStub\": 0,\n\"type\": \"UnStab\"\n}\n}\n]\n \u8bf4\u660e\uff1a Stab \uff1a\u8868\u793a\u89e3\u6790\u8fc7\u7a0b\u4e2d\u4e0d\u540c\u7684\u9636\u6bb5\u3002 images \uff1a\u8868\u793a\u6bcf\u4e00\u5e27\u7684\u56fe\u7247\u5e8f\u53f7\u3002 startStub\uff1a \u4e3a\u8bc6\u522b\u5c3e\u5e27\u7684\u9636\u6bb5\u8868\u793a\uff0c\u5982\u679c \"startStub\": 1 \uff0c\u8bf4\u660e\u5c3e\u5e27\u51fa\u73b0\u5728\u8be5\u9636\u6bb5\u3002 type\uff1a \u4e3a Stab \u6216 UnStab \uff0c\u8868\u793a\u7a33\u5b9a\u9636\u6bb5\u6216\u4e0d\u7a33\u5b9a\u9636\u6bb5\u3002 \u5404\u9636\u6bb5\u6709\u5e27\u6570\u8865\u507f\uff0c\u9ed8\u8ba4\u8865\u507f\u7684\u5e27\u6570\u4e3a 3 \u5e27\uff08\u53ef\u4ee5\u901a\u8fc7 server.ini \u91cc\u9762 un_stab_start=3 \u8fdb\u884c\u914d\u7f6e\uff09\uff0c\u8868\u793a\u5c0f\u4e8e\u7b49\u4e8e 3 \u5e27\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u524d\u540e\u5747\u9700\u8981\u51cf\u6389\u3002 \u5e94\u7528\u542f\u52a8\u9636\u6bb5\u5c31\u662f\u5728 Stab2 \u9636\u6bb5\uff0c\u542f\u52a8\u65f6\u95f4\u4e3a\uff1a171 \u51cf 151 \u518d\u51cf\u6389\u524d\u540e\u8865\u507f\u5e27\u6570 6 \u5e27\uff0c\u5373 14 \u5e27\uff0c\u89c6\u9891\u5e27\u7387 30 \u5e27/\u79d2\uff0c\u56e0\u6b64\u542f\u52a8\u8017\u65f6\u4e3a\uff1a14 * 33 = 462 ms"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2excel","title":"2\u3001Excel \u62a5\u544a","text":"\u6240\u6709\u7528\u4f8b\u6267\u884c\u5e76\u89e3\u6790\u5b8c\u4e4b\u540e\u4f1a report \u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a\u6c47\u603b\u6570\u636e\u7684 Excel \u6587\u4ef6\uff0c\u6587\u4ef6\u540d\u4e3a\uff1a{time}_perf_time.xlsx\u3002 \u6ce8\u610f\uff0creport \u76ee\u5f55\u4e3a\u53ef\u914d\u7f6e\u9879\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u4f1a\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u751f\u6210\uff0c\u5982\u679c\u4f60\u5c06 report\uff0c\u6307\u5b9a\u5230\u9879\u76ee\u4e0b\u5176\u4ed6\u8def\u5f84\uff0c\u5219\u4f1a\u5728\u5bf9\u5e94\u7684\u8def\u5f84\u4e0b\u751f\u6210 json \u548c Excel \u6587\u4ef6\u3002 \u4f60\u4e5f\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8bfb\u53d6\u6240\u6709 json / excel \u62a5\u544a\u7684\u6570\u636e\uff0c\u751f\u6210\u4f60\u81ea\u5df1\u60f3\u8981\u7684\u4e00\u4e9b\u6d4b\u8bd5\u62a5\u544a\u5f62\u5f0f\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#usb","title":"\u4e5d\u3001USB \u4e32\u53e3\u9a71\u52a8\u952e\u9f20\u65b9\u6cd5","text":"\u4f4d\u4e8e src/utils/control/serial_communication \u76ee\u5f55\u4e0b\u7684 usb_mk.py \u6587\u4ef6 usb_mk = UsbMk()\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up()\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u652f\u6301\u4f20\u5165\u6c49\u5b57\uff0c\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click()\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() \n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() \n \uff084\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() \n \uff085\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() \n \uff086\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() \n \uff087\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff088\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff0810\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_10","title":"\u5341\u3001\u7ee7\u7535\u5668\u63a7\u5236\u4e3b\u673a\u5f00\u673a/\u91cd\u542f","text":"\uff08\u82e5\u4e0d\u4f7f\u7528\u7ee7\u7535\u5668\uff0c\u53ef\u5ffd\u7565\u8be5\u6b65\u9aa4\uff0c\u6267\u884c\u65f6\u4f1a\u901a\u8fc7\u547d\u4ee4 reboot\uff09"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u7ee7\u7535\u5668\u8bbe\u5907","text":"LCUS-2 \u578b \u53cc\u8def USB \u667a\u80fd\u4e32\u53e3\u63a7\u5236\u7ee7\u7535\u5668\u3002 https://item.taobao.com/item.htm?spm=a1z09.2.0.0.41d72e8dUYx2pi&id=582653718178&_u=i25r20ia6a2e "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2usb","title":"2\u3001USB \u5ef6\u957f\u7ebf","text":"\u666e\u901a\u7684 USB \u7ebf\u5373\u53ef\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_3","title":"3\u3001\u675c\u90a6\u7ebf","text":"3.1\u300140P \u6bcd\u5bf9\u516c\u675c\u90a6\u7ebf\u3002 3.2\u3001\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"4\u3001\u5b89\u88c5\u56fe\u6587\u6559\u7a0b","text":"4.1\u3001\u4f7f\u7528 USB \u5ef6\u957f\u7ebf\u8fde\u63a5\u63a7\u5236\u7aef\u548c\u7ee7\u7535\u5668\u3002 4.2\u3001\u5728\u7ee7\u7535\u5668\u5e38\u7aef\u548c\u516c\u5171\u7aef\u5747\u8fde\u63a5\u4e00\u6839\u675c\u90a6\u7ebf\u3002 4.3\u3001\u5728\u4e3b\u677f\u4e0a\u5f00\u673a\u9488\u548c\u91cd\u542f\u9488\u4e0a\u63d2\u4e0a\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 4.4\u3001\u5c06\u5f00\u673a\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76841\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1\u5de6\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 4.5\u3001\u5c06\u91cd\u542f\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76842\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1 \u53f3\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 \u82e5\u60f3\u4fdd\u7559\u539f\u7535\u6e90\u5f00\u5173\u7684\u7535\u6e90\u706f\uff0c\u53ef\u6839\u636e\u5982\u4e0a\u56fe\u6240\u793a\uff0c\u4f7f\u7528\u675c\u90a6\u7ebf\u8fde\u63a5\u4e3b\u677f\u4e0a\u7684\u7535\u6e90\u706f\u548c\u539f\u7535\u6e90\u5f00\u5173"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_11","title":"\u5341\u4e00\u3001\u5e38\u89c1\u95ee\u9898\u8bf4\u660e","text":"1\u3001ERROR: for uos Cannot restart container 2301b1a1395d7959ee6523d61b61c87084649af530786cdb8fb5b3ecbcbd1068: linux runtime spec devices: error gathering device information while adding custom device \"/dev/ttyACM0\": no such file or directory \u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u8fde\u63a5\u72b6\u6001\uff0c\u67e5\u770b /dev/ttyACM0 \u662f\u5426\u5b58\u5728\uff0c\u82e5\u5b58\u5728 /dev/ttyACMn\uff08n\u4e3a\u4efb\u610f\u6570\u5b57\uff09\uff0c\u91cd\u542f\u7535\u8111\u89e3\u51b3\u3002 2\u3001Error response from daemon: Container 5e700fdc769e8c74666d68a7f2bc3de58268b4594cf88706609d59f8dbc7362d is not running \u5bb9\u5668\u542f\u52a8\u5931\u8d25 1\uff09\u68c0\u67e5\u54ea\u4e00\u4e2a\u5bb9\u5668\u672a\u542f\u52a8 sudo docker container ls # \u5217\u51fa\u8fd0\u884c\u4e2d\u7684 Docker \u5bb9\u5668\n 2\uff09\u7f3a\u5c11 uos \u5bb9\u5668\uff0c\u68c0\u67e5 USB \u4e32\u53e3\u8fde\u63a5\u7ebf\u548c\u91c7\u96c6\u76d2\u8fde\u63a5\u7ebf\u662f\u5426\u6b63\u5e38\uff0c\u91cd\u542f\u540e\u6267\u884c bash install/setup.up # \u91cd\u65b0\u5b8c\u6574\u90e8\u7f72\u73af\u5883\n \u6216\u6267\u884c sudo docker-compose up -d --build # \u4ec5\u91cd\u65b0\u6784\u5efa Docker \u955c\u50cf\n 3\u3001\u82e5\u90e8\u7f72\u65f6\u63d0\u793a\u6302\u8f7d ttyACM0\u3001video0 \u5931\u8d25\uff0c\u8bf7\u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u53ca\u91c7\u96c6\u76d2\u662f\u5426\u63a5\u89e6\u826f\u597d\uff0c\u82e5\u63a5\u89e6\u826f\u597d\uff0c\u91cd\u542f\u5373\u53ef\u89e3\u51b3\u3002 4\u3001\u82e5\u51fa\u73b0\u56fe\u7247\u80fd\u8bc6\u522b\uff0c\u4f46\u662f\u9f20\u6807\u672a\u79fb\u52a8\u64cd\u4f5c\u65f6\uff0c\u5b89\u88c5\u7edd\u5bf9\u9f20\u6807\u64cd\u4f5c\u7684\u4f9d\u8d56\u5305\uff0c\u89c1\u7b2c\u4e09\u8282\u7b2c\u4e8c\u5c0f\u8282\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u6d4b\u8bd5\u673a\u3002 5\u3001\u7531\u4e8e\u901a\u8fc7\u91c7\u96c6\u5361\u83b7\u53d6\u7684\u6d4b\u8bd5\u673a\u5b9e\u65f6\u753b\u9762\uff0c\u5305\u542b\u4e86\u9f20\u6807\u7684\u6837\u5f0f\uff0c\u6240\u4ee5\u5bf9\u56fe\u7247\u8bc6\u522b\u65f6\uff0c\u9f20\u6807\u82e5\u505c\u7559\u5728\u56fe\u6807\u4e0a\u5c42\uff0c\u5219\u4f1a\u5bf9\u8bc6\u522b\u7ed3\u679c\u9020\u6210\u5f71\u54cd\uff0c\u9700\u8981\u5c06\u9f20\u6807\u79fb\u52a8\u81f3\u5176\u4ed6\u4f4d\u7f6e\uff0c\u6216\u8005\u9690\u85cf\u9f20\u6807\u89e3\u51b3\u3002 6\u3001Excel \u62a5\u544a\u4e2d\uff0c\u6d4b\u8bd5\u573a\u666f\u5217\u4e0e\u7528\u4f8b\u4e2d\u7684\u4e0d\u4e00\u81f4\uff0c\u5173\u952e\u5b57scene\u3001app_name\u3001\u67b6\u6784\u522b\u540d\uff0c\u4e0d\u80fd\u5305\u542b\u4e0b\u5212\u7ebf\u548c\u82f1\u6587\u7b26\u53f7\u7684\u5706\u62ec\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/","title":"\u6846\u67b6\u529f\u80fd\u4ecb\u7ecd","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2023/1/12\n# Author : Mikigo\n# =============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_2","title":"\u4e00\u3001\u4e00\u53e5\u8bdd\u7b80\u4ecb","text":"\u6b64\u6587\u6863\u4e3b\u8981\u60f3\u5bf9 YouQu \u6846\u67b6\u4e00\u4e9b\u91cd\u70b9\u7684\u529f\u80fd\u505a\u8be6\u7ec6\u7684\u4ecb\u7ecd\uff0c\u5305\u62ec\u5bf9\u4e00\u4e9b\u529f\u80fd\u5f00\u53d1\u7684\u80cc\u666f\u3001\u8981\u89e3\u51b3\u7684\u95ee\u9898\u3001\u5b9e\u73b0\u903b\u8f91\u3001\u4ee3\u7801\u7b49\u65b9\u9762\u7684\u4ecb\u7ecd\uff0c\u4ee5\u6b64\u8ba9\u5927\u5bb6\u80fd\u66f4\u52a0\u6e05\u6670\u7684\u7406\u89e3\u5404\u9879\u529f\u80fd\uff0c\u4ece\u800c\u5728\u4f7f\u7528\u7684\u65f6\u5019\u80fd\u66f4\u52a0\u7684\u5f97\u5fc3\u5e94\u624b\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_3","title":"\u4e8c\u3001\u56fe\u50cf\u8bc6\u522b","text":"\u56fe\u50cf\u8bc6\u522b\u5728 UI \u81ea\u52a8\u5316\u4e2d\u662f\u4e0d\u53ef\u7f3a\u5c11\u7684\uff0c\u5e02\u9762\u4e0a\u751a\u81f3\u6709\u5b8c\u5168\u57fa\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\uff0c\u6bd4\u5982 Airtest\u3001Sikuli \u7b49\uff0c\u5728\u6e38\u620f\u7b49\u7279\u5b9a\u9886\u57df\u4e5f\u6709\u4e0d\u9519\u7684\u6548\u679c\uff0c\u8fd9\u4e9b\u5de5\u5177\u5b9e\u9645\u4e0a\u4e5f\u662f\u7528\u7684 OpenCV \u8fdb\u884c\u4e86\u5c01\u88c5\uff0cYouQu \u6846\u67b6\u57fa\u4e8e OpenCV \u5f00\u53d1\u4e86\u81ea\u5df1\u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\uff0c\u5b83\u53ef\u4ee5\u65b9\u4fbf\u7684\u7528\u4e8e\u754c\u9762\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u65ad\u8a00\uff1b YouQu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u51e0\u4e4e\u6ee1\u8db3\u4e86\u4f60\u7684\u6240\u6709\u8981\u6c42\uff0c\u6211\u4eec\u5728\u957f\u65f6\u95f4\u7684\u601d\u8003\u548c\u6478\u7d22\u4e2d\uff0c\u9488\u5bf9\u5e38\u89c4\u573a\u666f\u53ca\u4e00\u4e9b\u7279\u6b8a\u573a\u666f\u63a2\u7d22\u9664\u4e86\u4e00\u4e9b\u5b9e\u7528\u4e14\u6709\u6548\u7684\u65b9\u6848\uff0c\u4e14\u542c\u6211\u6162\u6162\u9053\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1","title":"1\u3001\u5e38\u89c4\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5e38\u89c4\u8bc6\u522b\u5f88\u597d\u7406\u89e3\uff0c\u4e00\u53e5\u8bdd\u8bb2\u5c31\u662f\uff0c\u8981\u83b7\u53d6\u5230\u76ee\u6807\u5143\u7d20\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u3002 \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u5728\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u9700\u8981\u83b7\u53d6\u7684\u5750\u6807\u662f\u76f8\u5bf9\u4e8e\u6574\u4e2a\u5c4f\u5e55\u7684\u5750\u6807\uff0c\u6211\u4eec\u53ef\u4ee5\u622a\u53d6\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u56fe\u7247\uff08screen\uff09\uff1b \u5728\u5143\u7d20\u8bc6\u522b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u622a\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5c0f\u56fe\u8fdb\u884c\u8bc6\u522b\uff0c\u6bd4\u5982\u622a\u53d6\u64ad\u653e\u6309\u94ae\uff1a \u90a3\u4e48\u5b9e\u9645\u4e0a\uff0c\u5143\u7d20\u5b9a\u4f4d\u7684\u95ee\u9898\u5c31\u8f6c\u6362\u4e3a\uff0c\u5c06\u622a\u56fe\u7684\u5c0f\u56fe\uff08play_btn\uff09\u62ff\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u5927\u56fe\uff08screen\uff09\u4e2d\u53bb\u505a\u5339\u914d\uff0c\u5982\u679c\u5339\u914d\u6210\u529f\uff0c\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff08 x, y \uff09\u5373\u53ef\u3002 \u4e3a\u4e86\u65b9\u4fbf\u63cf\u8ff0\uff0c\u4ee5\u4e0b\u6211\u5c06\u6574\u4e2a\u5c4f\u5e55\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5927\u56fe\uff0c\u67d0\u4e2a\u5143\u7d20\u56fe\u7247\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5c0f\u56fe\u3002 \u57fa\u4e8e OpenCV \u7684\u6a21\u677f\u5339\u914d cv.matchTemplate() \u529f\u80fd\uff0c\u6211\u4eec\u5b9e\u73b0\u4e86\u56fe\u50cf\u5b9a\u4f4d\u7684\u529f\u80fd\uff0c\u6846\u67b6\u63d0\u4f9b\u4e86\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u5e95\u5c42\u63a5\u53e3\uff08\u4e00\u822c\u4e0d\u5bf9\u4e0a\u5c42\u63d0\u4f9b\u8c03\u7528\uff09\uff1a def _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\n# \u8be6\u7ec6\u4ee3\u7801\u592a\u957f\u4e0d\u8d34\u4e86\uff0c\u611f\u5174\u8da3\u8bf7\u67e5\u770b\u6e90\u7801\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001image_path image_path \u662f\u5c0f\u56fe\u7684\u7edd\u5bf9\u8def\u5f84; \u901a\u5e38\u5728 AT \u5de5\u7a0b\u91cc\u9762\uff0c\u6211\u4eec\u7ea6\u5b9a\u5c06\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u5b9e\u9645\u7684\u5143\u7d20\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1aplay_btn.png \uff1b \u7528\u4e8e\u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 case/assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1amusic_001.png \uff1b \u8fd9\u6837\u662f\u4e3a\u4e86\u65b9\u4fbf\u7ba1\u7406\u548c\u7ef4\u62a4\u3002 2\u3001rate \u56fe\u50cf\u8bc6\u522b\u7684\u7684\u5339\u914d\u5ea6\u6216\u8005\u8bf4\u76f8\u4f3c\u5ea6\uff0c\u6846\u67b6\u9ed8\u8ba4\u7684\u914d\u7f6e\u4e3a 0.9\uff0c\u4e5f\u5c31\u662f\u8bf4\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u5b58\u5728\u4e00\u4e2a\u76f8\u4f3c\u5ea6 90% \u7684\u56fe\u6807\u5373\u8fd4\u56de\u5176\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff1b \u5982\u679c\u4f60\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u8c03\u6574\u8bc6\u522b\u5ea6\uff0c\u4f60\u53ef\u4ee5\u5728\u8c03\u7528\u51fd\u6570\u7684\u65f6\u5019\uff0c\u4f20\u5165\u4e0d\u540c\u7684\u8bc6\u522b\u5ea6\u7684\u503c\u3002 3\u3001multiple \u9ed8\u8ba4\u60c5\u51b5\u4e0b multiple=False\uff0c\u8868\u793a\u53ea\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u7b2c\u4e00\u4e2a\uff0c\u5982\u679c multiple=True \u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\uff0c\u56e0\u4e3a\u5927\u56fe\u4e2d\u53ef\u80fd\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u5c0f\u56fe\uff0c\u5728\u67d0\u4e9b\u573a\u666f\u4e0b\u4f60\u53ef\u80fd\u9700\u8981\u5168\u90e8\u83b7\u53d6\u5230\u6240\u6709\u5339\u914d\u5230\u7684\u5750\u6807\u3002 4\u3001picture_abspath \u9ed8\u8ba4\u60c5\u51b5\u4e0b picture_abspath=None \u8868\u793a\u5927\u56fe\u4e3a\u622a\u53d6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u5982\u679c\u4f60\u4e0d\u5e0c\u671b\u5927\u56fe\u662f\u5c4f\u5e55\u7684\u622a\u56fe\uff0c\u800c\u662f\u4f60\u81ea\u5b9a\u4e49\u4f20\u5165\u7684\u67d0\u4e2a\u56fe\u7247\uff0c\u4f60\u53ea\u9700\u8981\u5c06\u4f60\u7684\u56fe\u7247\u8def\u5f84\u4f20\u9012\u7ed9\u8fd9\u4e2a\u53c2\u6570\u5c31\u884c\uff0c\u6bd4\u5982\uff1a picture_abspath=\"~/Desktop/big.png\" \uff1b 5\u3001screen_bbox \u5927\u56fe\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u622a\u53d6\u6574\u4e2a\u5c4f\u5e55\uff0cscreen_bbox = [x, y, w, h] \u53ef\u4ee5\u6307\u5b9a\u622a\u53d6\u5c4f\u5e55\u4e2d\u7684\u56fa\u5b9a\u533a\u57df\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\uff0c\u53ef\u4ee5\u6392\u9664\u90e8\u5206\u533a\u57df\u5bf9\u8bc6\u522b\u7ed3\u679c\u7684\u5f71\u54cd\u3002 \u3010\u9690\u5f0f\u7b49\u5f85\u3011 \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\uff0c\u6709\u65f6\u5019\u9875\u9762\u8df3\u8f6c\u6709\u5ef6\u65f6\uff0c\u6709\u53ef\u80fd\u5b58\u5728\u8bc6\u522b\u7684\u90a3\u4e00\u523b\u9875\u9762\u4e5f\u6ca1\u6709\u8df3\u8f6c\u51fa\u6765\uff0c\u6216\u8005\u6216\u8005\u8bc6\u522b\u7684\u90a3\u4e00\u523b\uff1b \u56e0\u6b64\u6211\u4eec\u9700\u8981\u4e00\u79cd\u7b49\u5f85\u673a\u5236\uff0c\u5373\u5728\u4e00\u5b9a\u7684\u65f6\u95f4\u5185\uff0c\u5982\u679c\u8bc6\u522b\u4e0d\u5230\uff0c\u91cd\u590d\u53bb\u8bc6\u522b\uff1a def find_image(\ncls,\n*widget, rate: [float, int] = None,\nmultiple: bool = False,\nmatch_number: int = None,\npicture_abspath: str = None,\nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u5728\u5c4f\u5e55\u4e2d\u533a\u5bfb\u627e\u5c0f\u56fe\uff0c\u8fd4\u56de\u5750\u6807\uff0c\n \u5982\u679c\u627e\u4e0d\u5230\uff0c\u6839\u636e\u914d\u7f6e\u91cd\u8bd5\u6b21\u6570\uff0c\u6bcf\u6b21\u95f4\u96941\u79d2\n :param widget: \u6a21\u677f\u56fe\u7247\u8def\u5f84\n :param rate: \u76f8\u4f3c\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param match_number: \u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\n :return: \u5750\u6807\u5143\u7ec4\n \"\"\"\nif rate is None:\nrate = float(GlobalConfig.IMAGE_RATE)\ntry:\nfor element in widget:\nfor _ in range((match_number or int(GlobalConfig.IMAGE_MATCH_NUMBER)) + 1):\nlocate = cls._match_image_by_opencv(\nelement,\nrate,\nmultiple=multiple,\npicture_abspath=picture_abspath,\nscreen_bbox=screen_bbox\n)\nif not locate:\nsleep(int(GlobalConfig.IMAGE_MATCH_WAIT_TIME))\nelse:\nreturn locate\nraise TemplateElementNotFound(*widget)\nexcept Exception as e:\nraise e\n \u53c2\u6570 match_number \u7528\u4e8e\u63a7\u5236\u91cd\u590d\u8bc6\u522b\u7684\u6b21\u6570\uff0c\u9ed8\u8ba4\u4e0d\u4f20\u53c2\uff0c\u53d6\u5168\u5c40\u914d\u7f6e setting/globalconfig.ini \u91cc\u9762\u7684 IMAGE_MATCH_NUMBER \u914d\u7f6e\u9879\u7684\u503c\uff0c\u9ed8\u8ba4IMAGE_MATCH_NUMBER = 1\uff0c\u5373\u91cd\u8bd5 1 \u6b21\uff1b find_image \u662f\u6846\u67b6\u63d0\u4f9b\u7684\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u51fd\u6570\u63a5\u53e3\uff0c\u8fd9\u4e2a\u51fd\u6570\u63d0\u4f9b\u4e86\u9690\u5f0f\u7b49\u5f85\u7684\u529f\u80fd\uff0c\u4e14\u5305\u542b\u4e0a\u9762\u4ecb\u7ecd\u7684 _match_image_by_opencv \u51fd\u6570\u7684\u6240\u6709\u529f\u80fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2","title":"2\u3001\u6c14\u6ce1\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u6c14\u6ce1\u8bc6\u522b\u6307\u7684\u662f\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\u8981\u5b9a\u4f4d\u7684\u5143\u7d20\u662f\u4e00\u4e9b\u4f1a\u6d88\u5931\u7684\u5c0f\u5f39\u7a97\uff0c\u8fd9\u7c7b\u573a\u666f\u5728\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\u5c31\u53ef\u80fd\u5b58\u5728\u4e0d\u7a33\u5b9a\u6027\uff0c\u6709\u53ef\u80fd\u56fe\u50cf\u8bc6\u522b\u7684\u65f6\u5019\u6c14\u6ce1\u5df2\u7ecf\u6d88\u5931\u4e86\uff0c\u4e5f\u6709\u53ef\u80fd\u6c14\u6ce1\u51fa\u73b0\u7684\u65f6\u95f4\u592a\u77ed\u4e86\uff0c\u4e0d\u5bb9\u6613\u6355\u6349\u5230\uff0c\u5c31\u50cf\u6c14\u6ce1\u4e00\u6837\uff0c\u51fa\u73b0\u4e00\u4e0b\u5c31\u6d88\u5931\uff0c\u56e0\u6b64\u6211\u4eec\u5f62\u8c61\u7684\u79f0\u4e4b\u4e3a \u201c\u6c14\u6ce1\u8bc6\u522b\u201d\uff1b \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u4e3a\u4e86\u80fd\u7a33\u5b9a\u7684\u8bc6\u522b\u6c14\u6ce1\u7c7b\u573a\u666f\uff0c\u6211\u4eec\u91c7\u7528\u7684\u65b9\u6848\u662f\uff1a \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\uff08\u5305\u542b\u6c14\u6ce1\u4ece\u51fa\u73b0\u5230\u6d88\u5931\uff09\uff0c\u4e0d\u505c\u7684\u622a\u53d6\u8fd9\u6bb5\u65f6\u95f4\u5185\u7684\u5927\u56fe\uff0c\u4ee5\u6b64\u786e\u4fdd\u5728\u622a\u53d6\u7684\u4e00\u5806\u56fe\u7247\u4e2d\uff0c\u80af\u5b9a\u6709\u81f3\u5c11\u4e00\u5f20\u56fe\u7247\u80fd\u6355\u6349\u5230\u6c14\u6ce1\uff0c\u6700\u540e\u518d\u5bf9\u8fd9\u4e00\u5806\u56fe\u7247\u9010\u4e2a\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def get_during(\ncls,\nimage_path: str,\nscreen_time: [float, int],\nrate: float = None,\npause: [int, float] = None,\nmax_range: int = 10000\n):\n\"\"\"\n \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u622a\u56fe\u591a\u5f20\u56fe\u7247\u8fdb\u884c\u8bc6\u522b\uff0c\u5176\u4e2d\u6709\u4e00\u5f20\u56fe\u7247\u8bc6\u522b\u6210\u529f\u5373\u8fd4\u56de\u7ed3\u679c;\n \u9002\u7528\u4e8e\u6c14\u6ce1\u7c7b\u7684\u65ad\u8a00\uff0c\u6bd4\u5982\u6c14\u6ce1\u57281\u79d2\u5185\u6d88\u5931\uff0c\u5982\u679c\u7528\u5e38\u89c4\u7684\u56fe\u50cf\u8bc6\u522b\u5219\u6709\u53ef\u80fd\u65e0\u6cd5\u8bc6\u522b\u5230\uff1b\n :param image_path: \u8981\u8bc6\u522b\u7684\u6a21\u677f\u56fe\u7247\uff1b\n :param screen_time: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff1b\n :param rate: \u8bc6\u522b\u7387\uff1b\n :param pause: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u4e0d\u95f4\u9694\uff1b\n :param max_range: \u622a\u56fe\u7684\u6700\u5927\u6b21\u6570\uff0c\u8fd9\u662f\u4e00\u4e2a\u9884\u8bbe\u503c\uff0c\u4e00\u822c\u60c5\u51b5\u4e0b\u4e0d\u6d89\u53ca\u4fee\u6539\uff1b\n \"\"\"\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001screen_time \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5728\u6b64\u65f6\u95f4\u5185\u4f1a\u4e0d\u65ad\u7684\u8fdb\u884c\u622a\u56fe\u64cd\u4f5c\uff0c\u5c31\u50cf\u5f55\u5236\u89c6\u9891\u4e00\u6837\uff1b 2\u3001pause \u6bcf\u6b21\u622a\u53d6\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u4e00\u523b\u4e0d\u505c\u7684\u622a\u56fe\uff0c\u5982\u679c\u4f60\u60f3\u6bcf\u6b21\u622a\u56fe\u5b58\u5728\u4e00\u4e9b\u95f4\u9694\u65f6\u95f4\u4f20\u5165\u5bf9\u5e94\u7684\u65f6\u95f4\u95f4\u9694\u5373\u53ef\uff0c\u5355\u4f4d\u662f\u79d2\uff0c\u6bd4\u5982\uff1apause = 0.03\uff0c\u8868\u793a 30 ms\uff0c\u76f8\u5f53\u4e8e\u5e27\u7387\u4e3a 30 \u5e27\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-opencv","title":"3\u3001\u4e0d\u4f9d\u8d56 OpenCV \u7684\u56fe\u50cf\u8bc6\u522b\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31","title":"3.1\u3001\u81ea\u7814\u56fe\u50cf\u8bc6\u522b\u6280\u672f","text":"\u3010\u539f\u7406\u3011 \u4e3a\u4e86\u5b9e\u73b0\u8bc6\u522b\u56fe\u50cf\u7684\u76ee\u7684\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u5c06\u56fe\u7247\u7684\u6bcf\u4e2a\u50cf\u7d20\u7684RGB\u503c\uff0c\u4e0e\u6574\u4e2a\u5c4f\u5e55\u4e2d\u7684RGB\u8fdb\u884c\u5bf9\u6bd4\uff0c\u5982\u679c\u5c0f\u56fe\u4e0a\u7684RGB\u503c\u4e0e\u5bf9\u5e94\u5927\u56fe\u4f4d\u7f6e\u7684RGB\u90fd\u76f8\u7b49\uff0c\u5219\u5339\u914d\u6210\u529f\uff0c\u5373\u53ef\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u70b9\u3002 1\u3001\u8bfb\u53d6\u5c0f\u56fe\u548c\u5927\u56fe\u7684RGB\u503c \uff081\uff09\u5c0f\u56fe\u7684RGB\u503c small_data = small_pic.load() # load()\u4f1a\u5c06\u56fe\u7247\u7684RGB\u503c\u83b7\u53d6\u5230\uff0c\u6570\u636e\u683c\u5f0f\u4e3a\u4e00\u4e2a\u4e8c\u7ef4\u5217\u8868\uff0c\u8d4b\u503c\u7ed9\u4e00\u4e2a\u53d8\u91cfsmall_data\u3002\n \uff082\uff09\u5927\u56fe\u7684RGB\u503c big_data = big_pic.load()\n 2\u3001\u5c06\u5c0f\u56fe\u4e0e\u5927\u56fe\u7684RGB\u503c\u8fdb\u884c\u5339\u914d \uff081\uff09\u5339\u914d\u4ece\u5927\u56fe\u7684\u5750\u6807\uff080\uff0c0\uff09\u5f00\u59cb\u5339\u914d\uff0c\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff082\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\uff080\uff0c0\uff09\u5bf9\u5e94\u7684\u6240\u6709\u5c0f\u56fe\u7684RGB\u503c\u4e0d\u76f8\u7b49\uff0c\u5219\u79fb\u52a8\u5230\u4e0b\u4e00\u4e2a\u5750\u6807\u70b9\uff081\uff0c0\uff09\uff0c\u540c\u6837\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff083\uff09\u6309\u7167\u8fd9\u6837\u7684\u89c4\u5f8b\u5c06\u8fd9\u4e00\u884c\u6bcf\u79fb\u52a8\u4e00\u4e2a\u5750\u6807\u70b9\uff0c\u90fd\u5c06\u5c0f\u56fe\u6240\u6709\u7684RGB\u4e0e\u5bf9\u5e94\u5927\u56fe\u7684\u503c\u8fdb\u884c\u5339\u914d\uff1b \uff084\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\u5176\u4e2d\u4e00\u4e2a\u5750\u6807\u70b9\u4e0a\u5339\u914d\u5230\u4e86\u5c0f\u56fe\u7684\u6240\u6709RGB\u503c\uff0c\u5219\u6b64\u65f6\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\u70b9\uff1b \uff085\uff09\u5982\u679c\u5339\u914d\u4e86\u5927\u56fe\u6240\u6709\u7684\u5750\u6807\u70b9\uff0c\u90fd\u6ca1\u6709\u5339\u914d\u5230\uff0c\u5219\u8bf4\u660e\u5927\u56fe\u4e2d\u4e0d\u5b58\u5728\u5c0f\u56fe\uff0c\u5339\u914d\u5931\u8d25\uff1b \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 class ImageRgb:\n@staticmethod\ndef _check_match(_x, _y, small, bdata, sdata, rate):\n\"\"\"\n Matching degree of small graph and large graph matching\n \"\"\"\n@staticmethod\ndef _pre_random_point(small):\n\"\"\"\n Pre matching, take 10-20 points at random each time,\n and take coordinates randomly in the small graph\n \"\"\"\n@staticmethod\ndef _pre_random_match(_x, _y, point_list, bdata, sdata, rate):\n\"\"\"\n In the small graph, several points are randomly\n selected for matching, and the matching degree is\n also set for the random points\n \"\"\"\n@classmethod\ndef match_image_by_rgb(cls, image_name=None, image_path=None, rate=0.9):\n\"\"\"\n By comparing the RGB values of the small image with the large\n image on the screen, the coordinates of the small image on\n the screen are returned.\n \"\"\"\n \u901a\u8fc7 match_image_by_rgb() \u8fd9\u4e2a\u51fd\u6570\uff0c\u4f20\u5165\u76ee\u6807\u5c0f\u56fe\u7684\u6587\u4ef6\u540d\u79f0\uff0c\u5373\u53ef\u8fd4\u56de\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u3002 \u6709\u540c\u5b66\u8981\u95ee\u4e86\uff0c\u6709 OpenCV \u5e72\u561b\u4e0d\u7528\uff0c\u6709\u5fc5\u8981\u81ea\u5df1\u5b9e\u73b0\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u529f\u80fd\u5417\uff0c\u4f60\u4eec\u662f\u4e0d\u662f\u95f2\u7684\u554a\uff1f \u8fd9\u4e48\u95ee\u7684\u8bdd\uff0c\u5c0f\u4e86\uff0c\u683c\u5c40\u5c0f\u4e86\uff1b\u6211\u4eec\u81ea\u5df1\u5b9e\u73b0\u4e3b\u8981\u6709\u51e0\u65b9\u9762\u539f\u56e0\uff1a \u51cf\u5c11\u73af\u5883\u4f9d\u8d56\uff0c\u5373\u4e0d\u7528\u5b89\u88c5 OpenCV\uff0c\u6211\u4eec\u4e5f\u80fd\u5b9e\u73b0\u5176\u529f\u80fd\uff0c\u73af\u5883\u4f9d\u8d56\u8fd9\u5757\u540e\u9762\u4f1a\u5355\u72ec\u8be6\u7ec6\u8bb2\uff0c\u51cf\u5c11\u73af\u5883\u4f9d\u8d56\u5bf9\u4e8e\u4efb\u4f55\u8f6f\u4ef6\u5de5\u7a0b\u90fd\u975e\u5e38\u91cd\u8981\uff1b OpenCV \u5728\u5176\u4ed6\u56fd\u4ea7 CPU \u67b6\u6784\u4e0a\u5b89\u88c5\u5e76\u4e0d\u80fd\u4fdd\u8bc1100%\u6210\u529f\uff0c\u751a\u81f3\u6709\u6ca1\u6709\u53ef\u80fd\u5728\u4e00\u4e9b\u67b6\u6784\u4e0a\u538b\u6839\u513f\u5c31\u4e0d\u80fd\u5b89\u88c5\u4f7f\u7528 OpenCV \uff1f \u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 OpenCV \uff1f\u5c31\u50cf\u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 Windows \u5462\uff1f\u8fd9\u4e9b\u95ee\u9898\u503c\u5f97\u601d\u8003\u3002 \u5f53\u7136\uff0c\u6211\u4eec\u627f\u8ba4\u8fd9\u5957\u65b9\u6848\uff0c\u867d\u7136\u8bc6\u522b\u51c6\u786e\u7387\u6ca1\u95ee\u9898\uff0c\u4f46\u5728\u8bc6\u522b\u6548\u7387\u4e0a\u8fd8\u6ca1\u6709\u8fbe\u5230 OpenCV \u6a21\u677f\u5339\u914d\u7684\u6548\u679c\uff0c\u6211\u4eec\u7684\u65b9\u6848\u6bcf\u6b21\u8bc6\u522b\u5728 1.5s \u5de6\u53f3\uff0c\u800c OpenCV \u5728 1s \u5de6\u53f3\uff1b \u6574\u4f53\u8bc6\u522b\u6548\u679c\u6765\u8bb2\uff0c\u6211\u8ba4\u4e3a\u8fd8\u662f\u53ef\u4ee5\u63a5\u53d7\u7684\uff0c\u4e5f\u5e0c\u671b\u6709\u5fd7\u4e4b\u58eb\u80fd\u4e00\u8d77\u4f18\u5316\u6b64\u65b9\u6848\uff0c\u4e00\u8d77\u6280\u672f\u62a5\u56fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32-rpc","title":"3.2\u3001\u57fa\u4e8e RPC \u670d\u52a1\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b","text":"\u5728\u8fdc\u7a0b\u670d\u52a1\u5668\u4e0a\u90e8\u7f72 OpenCV \u7684\u73af\u5883\uff0c\u5e76\u5c06\u5176\u90e8\u7f72\u4e3a RPC \u670d\u52a1\uff0c\u6d4b\u8bd5\u673a\u4e0a\u4e0d\u7528\u5b89\u88c5 OpenCV \u4f9d\u8d56\uff0c\u800c\u662f\u901a\u8fc7\u8bf7\u6c42 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u3010\u539f\u7406\u3011 \u6d4b\u8bd5\u673a\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u56fe\u7247\u4ee5\u53ca\u6a21\u677f\u56fe\u7247\uff0c\u53d1\u9001\u7ed9 RPC \u670d\u52a1\u7aef\uff0c\u670d\u52a1\u7aef\u62ff\u5230\u4e24\u5f20\u56fe\u7247\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u6700\u540e\u5c06\u8bc6\u522b\u7ed3\u679c\u8fd4\u56de\u7ed9\u6d4b\u8bd5\u673a\uff1b \u8981\u7279\u6b8a\u8bf4\u660e\u7684\u662f\uff1a RPC \u662f\u4e00\u79cd\u534f\u8bae\uff0c\u8bb8\u591a\u8bed\u8a00\u90fd\u662f\u652f\u6301\u7684\uff0c\u6bd4\u5982\u8bf4\u670d\u52a1\u7aef\u4e5f\u53ef\u4ee5\u7528 C++ \u6765\u5b9e\u73b0\uff0c\u5ba2\u6237\u7aef\u4f7f\u7528 Python \u4e5f\u662f\u53ef\u4ee5\u8c03\u7528\u7684\u3002 \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 \u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nimport cv2 as cv\nimport numpy as np\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\nif __name__ == \"__main__\":\nserver = ThreadXMLRPCServer((\"x.x.x.x\", 8889), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(match_image_by_opencv, \"match_image_by_opencv\")\nserver.serve_forever()\n \u8fd9\u6837\uff0c\u6211\u4eec\u57fa\u4e8e Python \u6807\u51c6\u5e93 xmlrpc \u642d\u5efa\u4e86\u4e00\u4e2a RPC \u670d\u52a1\u5668\uff0c\u6ce8\u518c\u4e86 image_put \u548c match_image_by_opencv \u4e24\u4e2a\u529f\u80fd\u63a5\u53e3\uff0c\u5728\u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u901a\u8fc7 IP \u548c\u7aef\u53e3\u8fdb\u884c RPC \u8bf7\u6c42\uff1b \u5ba2\u6237\u7aef\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from xmlrpc.client import Binary\nfrom xmlrpc.client import ServerProxy\nserver = ServerProxy(GlobalConfig.OPENCV_SERVER_HOST, allow_none=True)\nscreen_rb = open(screen, \"rb\")\ntemplate_rb = open(template_path, \"rb\")\ntry:\nscreen_path = server.image_put(Binary(screen_rb.read()))\nscreen_rb.close()\ntpl_path = server.image_put(Binary(template_rb.read()))\ntemplate_rb.close()\nreturn server.match_image_by_opencv(\ntpl_path, screen_path, rate, multiple\n)\nexcept OSError as exc:\nraise EnvironmentError(\nf\"RPC\u670d\u52a1\u5668\u94fe\u63a5\u5931\u8d25. {GlobalConfig.OPENCV_SERVER_HOST}\"\n) from exc\n \u901a\u8fc7\u8fd4\u56de server.match_image_by_opencv \u5c31\u83b7\u53d6\u4e86\u5728\u670d\u52a1\u7aef\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4","title":"4\u3001\u53f3\u952e\u83dc\u5355\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41","title":"4.1\u3001\u53f3\u952e\u83dc\u5355\u5b9a\u4f4d\u7684\u65b9\u6848\u53ca\u95ee\u9898","text":"\u53f3\u952e\u83dc\u5355\u7684\u5143\u7d20\u5b9a\u4f4d\u662f\u4e00\u4e2a\u96be\u70b9\uff0c\u8fc7\u53bb\u6211\u4eec\u8c03\u7814\u548c\u4f7f\u7528\u8fc7\u7684\u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u65b9\u6cd5\u6709 4 \u79cd\uff1a \u7b2c\u4e00\u79cd\uff1a\u6b65\u957f\u64cd\u4f5c\u6cd5 \u5728\u53f3\u952e\u83dc\u5355\u547c\u51fa\u6765\u4e4b\u540e\uff0c\u901a\u8fc7\u952e\u76d8\u7684 up\u3001down \u6309\u952e\uff0c\u8fdb\u884c\u9009\u62e9\u83dc\u5355\u9009\u62e9\uff0c\u9009\u4e2d\u76ee\u6807\u4e4b\u540e enter \u5373\u53ef\uff1b\u6bd4\u5982\uff1a\u5728\u684c\u9762\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\uff0c\u6309 1 \u6b21 down \uff0c\u4f1a\u51fa\u73b0\u4e0b\u56fe\uff1a \u7ee7\u7eed\u518d\u6309 2 \u6b21 down\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u518d\u6309 enter\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u5982\u6b64\uff0c\u201c\u6392\u5e8f\u65b9\u5f0f\u201d\u7684\u6b65\u957f\u4e3a 3\uff1b\u901a\u8fc7\u4f7f\u7528\u952e\u76d8\u4e0a\u4e0b\u952e\uff0c\u5c31\u5b9e\u73b0\u4e86\u5bf9\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\uff1b \u4f46\u662f\uff0c\u8fd9\u79cd\u65b9\u5f0f\u6709\u4e2a\u5f88\u70e6\u4eba\u7684\u95ee\u9898\uff0c\u5c31\u662f\u53f3\u952e\u83dc\u5355\u7684\u9009\u9879\u4f4d\u7f6e\u4e0d\u53ef\u80fd\u4e00\u76f4\u4e0d\u53d8\uff0c\u5728\u9700\u6c42\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\uff0c\u83dc\u5355\u9009\u9879\u7684\u53d8\u5316\u662f\u5f88\u5927\u7684\uff0c\u751a\u81f3\u6709\u4e9b\u5e94\u7528\u652f\u6301\u81ea\u5b9a\u4e49\u83dc\u5355\uff0c\u6bd4\u5982\u6587\u7ba1\u53f3\u952e\u83dc\u5355\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff1b \u4e5f\u5c31\u662f\u8bf4\u4f60\u5f97\u7ecf\u5e38\u53bb\u7ef4\u62a4\u83dc\u5355\u9009\u9879\u7684\u6b65\u957f\uff0c\u4e00\u4e2a\u9009\u9879\u73b0\u5728\u7684\u6b65\u957f\u662f 3\uff0c\u4e0b\u4e2a\u8fed\u4ee3\u53ef\u80fd\u5c31\u662f 4 \u6216\u8005 5\u3002 \u7b2c\u4e8c\u79cd\uff1a\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u6cd5 \u628a\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5355\u72ec\u622a\u56fe\u4fdd\u5b58\uff0c\u56fe\u7247\u4e2d\u4ec5\u5305\u542b\u4e00\u4e2a\u83dc\u5355\u9009\u9879\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u8fd9\u6837\uff0c\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5c31\u53ef\u4ee5\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u65b9\u5f0f\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u8fd9\u79cd\u65b9\u5f0f\u4e0d\u7528\u62c5\u5fc3\u83dc\u5355\u9009\u9879\u7684\u987a\u5e8f\u6216\u4f4d\u7f6e\uff0c\u4f46\u662f\u9700\u8981\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff0c\u4e14\u5bb9\u6613\u53d7\u5230\u5b57\u4f53 UI \u53d8\u66f4\u7c7b\u9700\u6c42\u7684\u5f71\u54cd\uff0c\u6bd4\u5982\uff1a\u5b57\u4f53\u5927\u5c0f\u3001\u5b57\u4f53\u95f4\u8ddd\u7b49\u7b49\u9700\u6c42\u53d8\u66f4\u90fd\u4f1a\u5f71\u54cd\uff0c\u6bcf\u6b21\u53d8\u66f4\u4e4b\u540e\u5c31\u9700\u8981\u8fdb\u884c\u5927\u91cf\u56fe\u7247\u8d44\u6e90\u7684\u91cd\u65b0\u622a\u56fe\u66ff\u6362\uff0c\u662f\u4e2a\u6bd4\u8f83\u9ebb\u70e6\u7684\u4e8b\u60c5\uff1b \u7b2c\u4e09\u79cd\uff1a\u76f8\u5bf9\u4f4d\u79fb\u6cd5 \u9f20\u6807\u70b9\u51fb\u53f3\u952e\u7684\u65f6\u5019\uff0c\u9f20\u6807\u7684\u5f53\u524d\u5750\u6807\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u7684\uff0c\u83dc\u5355\u9009\u9879\u7684\u5bbd\uff08 w \uff09\u4e00\u822c\u662f\u56fa\u5b9a\u7684\uff0c\u53d8\u5316\u7684\u662f\u83dc\u5355\u7684\u957f\u5ea6\uff08 h \uff09\uff0c\u53ef\u4ee5\u901a\u8fc7\u67d0\u4e2a\u9009\u9879\u76f8\u5bf9\u4e8e\u9f20\u6807\u7684\u8ddd\u79bb\u5728\u786e\u5b9a\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u901a\u8fc7\u7ef4\u62a4\u83dc\u5355\u9009\u9879\uff08\u76f8\u5bf9\u4f4d\u7f6e\uff09\u76f8\u5bf9\u4e8e\u9f20\u6807\u4f4d\u7f6e\u7684\u8ddd\u79bb\uff0c\u5373\u53ef\u8f7b\u677e\u8ba1\u7b97\u51fa\u83dc\u5355\u9009\u9879\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\u3002 \u4ece\u7406\u8bba\u4e0a\u6b64\u65b9\u6848\u662f\u53ef\u884c\u7684\uff0c\u4f46\u662f\u8fd9\u91cc\u4ecd\u7136\u5b58\u5728\u4e24\u4e2a\u4e25\u91cd\u7684\u95ee\u9898\uff1a \u83dc\u5355\u987a\u5e8f\u6539\u53d8\uff0c\u5bfc\u81f4\u76f8\u5bf9\u8ddd\u79bb\u6539\u53d8\uff0c\u800c\u4e14\u8ddd\u79bb\u662f\u901a\u8fc7\u50cf\u7d20\uff08px\uff09\u6765\u8868\u793a\u7684\uff0c\u4e0d\u60f3\u6b65\u957f\u90a3\u4e48\u53ea\u7ba1\uff0c\u6bcf\u6b21\u9700\u8981\u53bb\u91cf\u4e00\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u70b9\u9ebb\u70e6\uff1b \u9f20\u6807\u5728\u684c\u9762\u4e0d\u540c\u4f4d\u7f6e\u70b9\u51fb\u53f3\u952e\uff0c\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u4f4d\u7f6e\u662f\u4e0d\u540c\u7684\uff0c\u4e0a\u56fe\u7684\u83dc\u5355\u662f\u5728\u9f20\u6807\u7684\u5de6\u4e0b\u65b9\uff0c\u5982\u679c\u4f60\u79fb\u52a8\u9f20\u6807\u5230\u5c4f\u5e55\u56db\u8fb9\uff0c\u4f60\u4f1a\u53d1\u73b0\uff0c\u53f3\u952e\u83dc\u5355\u53ef\u80fd\u51fa\u73b0\u5728\u9f20\u6807\u7684\u56db\u4e2a\u65b9\u5411\uff0c\u4e5f\u5c31\u662f\u8bf4\u4f60\u9700\u8981\u6839\u636e\u9f20\u6807\u7684\u4e0d\u540c\u4f4d\u7f6e\u6765\u5224\u65ad\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u65b9\u5411\uff0c\u800c\u4e0d\u540c\u7684\u65b9\u5411\u4e0a\u8ba1\u7b97\u65b9\u6cd5\u662f\u4e0d\u540c\u7684\uff0c\u6bd4\u5982\uff1a\u53f3\u952e\u83dc\u5355\u5728\u9f20\u6807\u7684\u5de6\u4e0a\uff0c\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\u8ba1\u7b97\u65b9\u6cd5\u4e3a\uff08x - w / 2\uff0c y - h\uff09\uff0c\u8fd9\u6837\u7ef4\u62a4\u8d77\u6765\u53ef\u4ee5\u8bf4\u975e\u5e38\u590d\u6742\uff1b \u57fa\u4e8e\u4ee5\u4e0a\u4e24\u4e2a\u539f\u56e0\uff0c\u6211\u4eec\u5e76\u4e0d\u63a8\u8350\u8fd9\u79cd\u64cd\u4f5c\u65b9\u6848\u3002 \u7b2c\u56db\u79cd\uff1a\u5c5e\u6027\u5b9a\u4f4d \u6709\u540c\u5b66\u8bf4\u5e72\u561b\u4e0d\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u5462\uff0c\u5176\u5b9e\uff0c\u6211\u4eec\u6700\u5f00\u59cb\u60f3\u5230\u7684\u65b9\u6848\u5c31\u662f\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\uff0c\u4f46\u662f\u5728\u5c5e\u6027\u7684 DOM \u6811\u91cc\u600e\u4e48\u4e5f\u627e\u4e0d\u5230\uff0c\u65e0\u6cd5\u5b9a\u4f4d\u5230\uff0c\u6211\u4eec\u4e5f\u8054\u5408\u7814\u53d1\u540c\u5b66\u4e00\u8d77\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u4f46\u6700\u7ec8\u8fd8\u662f\u6ca1\u80fd\u89e3\u51b3\uff0c\u975e\u5e38\u9057\u61be\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42","title":"4.2\u3001\u6700\u65b0\u7684\u53f3\u952e\u83dc\u5355\u7ec8\u6781\u89e3\u51b3\u65b9\u6848","text":"\u7531\u4e8e\u53f3\u952e\u83dc\u5355\u9009\u9879\u51e0\u4e4e\u90fd\u662f\u6587\u672c\uff0c\u90a3\u4e48\u901a\u8fc7 OCR \u8bc6\u522b\uff0c\u51e0\u4e4e\u662f\u6700\u4f18\u7684\u65b9\u6848\uff1a \u4e0d\u7528\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff1b \u4e0d\u4f1a\u53d7\u5230\u83dc\u5355\u9009\u9879\u987a\u5e8f\u6539\u53d8\u7684\u5f71\u54cd\uff1b \u4e0d\u4f1a\u53d7\u5230\u5b57\u4f53 UI \u53d8\u5316\u7684\u5f71\u54cd\uff1b \u5173\u4e8e OCR \u8bc6\u522b\u6211\u4eec\u5728\u540e\u9762\u4f1a\u8be6\u7ec6\u8bb2\u5230\uff0c\u672c\u7ae0\u8282\u4e3b\u8981\u8bb2\u57fa\u4e8e OCR \u8bc6\u522b\uff0c\u6211\u4eec\u5728\u53f3\u952e\u83dc\u5355\u8bc6\u522b\u4e0a\u7684\u7a81\u7834\u548c\u521b\u65b0\uff1b \u4f7f\u7528 OCR \u8bc6\u522b\u53f3\u952e\u83dc\u5355\u867d\u7136\u5df2\u7ecf\u5f88\u5b8c\u7f8e\u4e86\uff0c\u4f46\u662f\u5728\u4e00\u4e9b\u60c5\u51b5\u4e0b\u4ecd\u7136\u5b58\u5728\u4e00\u70b9\u95ee\u9898\uff0c\u5c31\u662f\u5c4f\u5e55\u4e2d\u51fa\u73b0\u591a\u4e2a\u548c\u83dc\u5355\u9009\u9879\u6587\u5b57\u76f8\u540c\u7684\u6587\u5b57\u65f6\uff0c\u6bd4\u5982\u4e0b\u9762\u8fd9\u79cd\u60c5\u51b5\uff1a \u5c4f\u5e55\u6070\u597d\u51fa\u73b0\u4e86\u4e24\u4e2a\u201c\u590d\u5236\u201d\uff0c\u6b64\u65f6\u8981\u5b9a\u4f4d\u5230\u83dc\u5355\u4e2d\u7684 \u201c\u590d\u5236\u201d\uff0c\u5c31\u9700\u8981\u8fdb\u4e00\u6b65\u505a\u6570\u636e\u5904\u7406\uff0c\u6bd4\u5982\uff1aOCR \u8fd4\u56de 2 \u4e2a\u201c\u590d\u5236\u201d\u7684\u5750\u6807\uff0c\u7528\u4f8b\u91cc\u9762\u6765\u5224\u65ad\u7528\u54ea\u4e2a\uff0c\u4ece\u4e1a\u52a1\u4e0a\u5c06\u5904\u7406\u8d77\u6765\u6bd4\u8f83\u9ebb\u70e6\uff0c\u56e0\u4e3a\u4f60\u5f97\u660e\u786e\u77e5\u9053\u83dc\u5355\u5728\u5de6\u8fb9\u8fd8\u662f\u53f3\u8fb9\uff0c\u7136\u540e\u8fd9\u672c\u8eab\u5c31\u662f\u4e0d\u786e\u5b9a\u7684\uff1b \u600e\u4e48\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u5462\uff0c\u8fd9\u5c31\u8981\u8bf4\u9053\u672c\u7ae0\u7684\u4e3b\u9898\uff1a\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b\u3002 \u3010\u539f\u7406\u3011 \u5728\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u524d\u622a\u4e00\u5f20\u56fe\uff0c\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\u518d\u622a\u53d6\u4e00\u5f20\u56fe\uff0c\u4e24\u5f20\u56fe\u552f\u4e00\u53d8\u5316\u7684\u5c31\u662f\u53f3\u952e\u83dc\u5355\uff0c\u5c06\u5176\u4ed6\u76f8\u540c\u7684\u5730\u65b9\u90fd\u5c4f\u853d\u6389\uff0c\u53ea\u7559\u4e0b\u83dc\u5355\u754c\u9762\uff0c\u5982\u6b64\u5373\u53ef\u6d88\u9664\u5e72\u6270\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u5c06\u4e24\u79cd\u56fe\u505a\u524d\u540e\u5bf9\u6bd4\u63d0\u53d6\u53ef\u4ee5\u5f97\u5230\u8fd9\u6837\u7684\u56fe\uff1a \u4f60\u770b\uff0c\u901a\u8fc7\u524d\u540e\u56fe\u7247\u7684\u5bf9\u6bd4\uff0c\u5c06\u76f8\u540c\u7684\u90e8\u5206\u7ed9\u6d88\u9664\u6389\uff0c\u518d\u8fdb\u884c OCR \u8bc6\u522b\uff0c\u8fd9\u6837\u5c31\u4e0d\u4f1a\u6709\u5e72\u6270\u4e86\uff1b \u4ee3\u7801\u5b9e\u73b0\u8bf7\u67e5\u770b src/filter_image.py \uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def filter_image(action):\n\"\"\"\n \u5bf9\u6bd4\u52a8\u4f5c\u524d\u540e\u4e24\u5f20\u56fe\u7247\uff0c\u63d0\u53d6\u4e0d\u540c\u7684\u90e8\u5206\u751f\u6210\u4e00\u5f20\u65b0\u7684\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u65b0\u56fe\u7247\u7684\u8def\u5f84\n :param action: \u52a8\u4f5c\u51fd\u6570\u7684\u51fd\u6570\u5bf9\u8c61\n :return: \u65b0\u56fe\u7247\u7684\u8def\u5f84\n \"\"\"\n action \u662f\u9f20\u6807\u4e8b\u4ef6\uff0c\u56e0\u4e3a\u6b64\u7c7b\u573a\u666f\u4e0d\u4ec5\u4ec5\u5728\u53f3\u952e\u5b58\u5728\uff0c\u5355\u51fb\u3001\u53cc\u51fb\u7b49\u7b49\uff0c\u53ea\u8981\u64cd\u4f5c\u524d\u540e\u540e\u53d8\u5316\u7684\u90fd\u53ef\u4ee5\uff1a from src.mouse_key import MouseKey\naction = (\nMouseKey.click,\nMouseKey.right_click,\nMouseKey.double_click,\nMouseKey.move_to,\n)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5","title":"5\u3001\u52a8\u6001\u56fe\u50cf\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5728\u684c\u9762\u58c1\u7eb8\u5207\u6362\uff0c\u6216\u770b\u56fe\u3001\u76f8\u518c\u5207\u6362\u56fe\u7247\u7c7b\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u7531\u4e8e\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u662f\u4e0d\u56fa\u5b9a\u7684\uff08\u4e0d\u540c\u7248\u672c\u7684\u7cfb\u7edf\u58c1\u7eb8\u4e0d\u540c\u3001\u58c1\u7eb8\u987a\u5e8f\u4e0d\u540c\uff0c\u770b\u56fe\u76f8\u518c\u5728\u56fe\u7247\u8d44\u6e90\u4e0d\u4e00\u5b9a\u56fa\u5b9a\uff09\uff0c\u90a3\u4e48\u5728\u6d4b\u8bd5\u5207\u6362\u58c1\u7eb8\u6216\u8005\u5207\u6362\u56fe\u7247\u7684\u573a\u666f\u65f6\u5c31\u4f1a\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u4f60\u4e0d\u77e5\u9053\u9884\u671f\u662f\u5565\uff0c\u7528\u4f8b\u64cd\u4f5c\u52a8\u6001\u7684\uff0c\u4e5f\u662f\u6781\u4e0d\u7a33\u5b9a\u3002 \u3010\u539f\u7406\u3011 \u5728\u5207\u6362\u56fe\u7247\u4e4b\u524d\u622a\u56fe\u4fdd\u5b58\u5e76\u8fd4\u56de\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u6b21\u8bc6\u522b\u8fd9\u5f20\u56fe\u7247\uff0c\u5982\u679c\u4e0d\u5b58\u5728\uff0c\u8bf4\u660e\u56fe\u7247\u5df2\u7ecf\u5207\u6362\u4e86\uff1b \u793a\u610f\u56fe\uff1a \u8fd9\u6837\uff0c\u6211\u4eec\u622a\u53d6\u4e86\u5f53\u524d\u56fe\u7247\u4e2d\u6bd4\u8f83\u6709\u4ee3\u8868\u6027\u7684\u4f4d\u7f6e\uff08\u4e00\u53ea\u9e1f\uff09\uff0c\u5728\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u7528\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1a \u6211\u4eec\u518d\u62ff\u7740\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd9\u6837\u5728\u5f53\u524d\u56fe\u7247\u4e2d\uff0c\u5c31\u4e0d\u80fd\u627e\u5230\u8fd9\u53ea\u9e1f\u4e86\uff0c\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u662f False\uff0c\u90a3\u4e48\u4e5f\u5c31\u53ef\u4ee5\u5224\u65ad\u56fe\u7247\u5207\u6362\u662f\u6210\u529f\u7684\u3002 \u4ee3\u7801\u793a\u610f\uff1a def save_temporary_picture(_x: int, _y: int, width: int, height: int):\n\"\"\"\n \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u56fe\u7247\u8def\u5f84\n :param x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n :param y: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n :param width: \u5bbd\u5ea6\n :param height: \u9ad8\u5ea6\n :return: \u56fe\u7247\u8def\u5f84\n \"\"\"\n \u6b64\u51fd\u6570\u7528\u4e8e\u5728\u64cd\u4f5c\u4e4b\u524d\u622a\u56fe\u4e00\u5f20\u4e34\u65f6\u56fe\u7247\uff0c\u8fd4\u56de\u56fe\u7247\u8def\u5f84\uff0c\u6700\u540e\u5728\u65ad\u8a00\u7684\u65f6\u5019\u518d\u5c06\u56fe\u7247\u8def\u5f84\u4f5c\u4e3a\u53c2\u6570\u4f20\u5165\u65ad\u8a00\u8bed\u53e5\u5373\u53ef\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ui","title":"\u4e09\u3001\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_1","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u662f\u6211\u4eec\u81ea\u7814\u7684\u4e00\u79cd\u4f7f\u7528\u7b80\u5355\uff0c\u4e14\u6548\u7387\u6781\u9ad8\u3001\u7a33\u5b9a\u6027\u597d\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u57fa\u4e8e\u5143\u7d20\u6309\u94ae\u5728\u5e94\u7528\u4e2d\u7684\u76f8\u5bf9\u4f4d\u7f6e\uff0c\u52a8\u6001\u83b7\u53d6\u5143\u7d20\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff0c\u9002\u7528\u4e8e\u5404\u79cd\u5c4f\u5e55\u5206\u8fa8\u7387\uff08\u5305\u62ec\u9ad8\u5206\u5c4f\u3001\u5bbd\u5c4f\u3001\u5e26\u9c7c\u5c4f\uff09\uff0c\u5f53\u5143\u7d20\u6309\u94ae\u4f4d\u7f6e\u76f8\u5bf9\u4e8e\u5e94\u7528\u754c\u9762\u4f4d\u7f6e\u53d1\u751f\u4fee\u6539\u4e4b\u540e\uff0c\u53ea\u9700\u8981\u6839\u636e UI \u8bbe\u8ba1\u56fe\u4e0a\u7684\u6e90\u6570\u636e\u4fee\u6539\u5bf9\u5e94\u5750\u6807\u6570\u636e\u5c31\u597d\uff0c\u7ef4\u62a4\u975e\u5e38\u7684\u65b9\u4fbf\u3002 \u6b64\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u9002\u7528\u4e8e\u4e00\u4e9b\u5143\u7d20\u4f4d\u7f6e\u76f8\u5bf9\u4e0e\u5e94\u7528\u754c\u9762\u6bd4\u8f83\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u97f3\u4e50\uff0899% \u7684\u5143\u7d20\u5b9a\u4f4d\u91c7\u7528\u8fd9\u79cd\uff0c\u6548\u679c\u975e\u5e38\u597d\uff09\uff0c\u4e0d\u9002\u7528\u4e8e\u754c\u9762\u4e0d\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u622a\u56fe\u5f55\u5c4f\uff0c\u5f88\u660e\u663e\u4e0d\u9002\u7528\u4e8e\u8fd9\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u3002\u8fd9\u79cd\u5168\u65b0\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u6709\u5b83\u7684\u9002\u7528\u6761\u4ef6\uff0c\u5982\u679c\u4f60\u53d1\u73b0\u4f7f\u7528\u5e38\u89c4\u7684\uff08\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u5b9a\u4f4d\uff09\u4e0d\u597d\u505a\u65f6\uff0c\u4e0d\u59a8\u8003\u8651\u4f7f\u7528\u8fd9\u79cd\uff0c\u5176\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff0c\u5e76\u4e14\u8fc5\u901f\u7231\u4e0a\u4ed6\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_1","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5728 UI \u8bbe\u8ba1\u56fe\u4e2d\u6211\u4eec\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u8fb9\u6846\u7684\u8ddd\u79bb\u7684\uff0c\u7136\u540e\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u6280\u672f\u624b\u6bb5\u83b7\u53d6\u5230\u5e94\u7528\u754c\u9762\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u53ca\u5e94\u7528\u7a97\u53e3\u7684\u5927\u5c0f\uff0c\u793a\u610f\u56fe\u5982\u4e0b\uff1a \uff08x1, y1\uff09\u4e3a\u5e94\u7528\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\uff1b\uff08x2, y2\uff09\u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u5de6\u4e0a\u89d2\uff08x1, y1\uff09\u7684\u5750\u6807\uff0c\u90a3\u4e48\u5b9e\u9645\u4e0a\u3010\u64ad\u653e\u6240\u6709\u3011\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\u4e3a\uff1a\uff08 x1 + x2, y1 + y2 \uff09\uff1b \u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5927\u5c0f\uff08w2, h2\uff09\uff0c\u53ef\u4ee5\u4ece UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\uff1b \u5728 UI \u8bbe\u8ba1\u7a3f\u4e0a\u70b9\u51fb\u3010\u64ad\u653e\u6240\u6709\u3011\u56fe\u6807\uff0c\u7136\u540e\u79fb\u52a8\u9f20\u6807\u5c31\u5c31\u53ef\u4ee5\u770b\u5230\u4e0a\u56fe\u7684\u53c2\u8003\u7ebf\u53ca\u6570\u636e\uff1b \u6240\u4ee5\uff0c\u6211\u4eec\u53ef\u4ee5\u8f7b\u677e\u7684\u83b7\u53d6\u5230\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u4e2d\u5fc3\u5750\u6807\u4e3a\uff1a\uff08 x1 + x2 + (w2 / 2), y1 + y2 + ( h2 / 2) \uff09 \u8be6\u7ec6\u6e90\u4ee3\u7801\u8bf7\u67e5\u770b AT \u57fa\u7840\u6846\u67b6: src/button_center.py \u83b7\u53d6\u5e94\u7528\u7a97\u53e3\u7684\u4fe1\u606f \u4f7f\u7528 xdotool \u548c xwininfo \u83b7\u53d6\u5230\u5e94\u7528\u7a97\u53e3\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u5de6\u4e0a\u89d2\uff09\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a app_id = CmdCtl.run_cmd(f\"xdotool search --classname --onlyvisible {self.app_name}\"\n).split(\"\\n\")\napp_id_list = [int(_id) for _id in app_id if _id]\nreturn CmdCtl.run_cmd(f\"xwininfo -id {app_id_list[self.number]}\")\n \u4f7f\u7528\u6b63\u5219\u83b7\u53d6\u7a97\u53e3\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u83b7\u53d6\u914d\u7f6e \u8bfb ini \u914d\u7f6e\u6587\u4ef6\uff0c\u83b7\u53d6\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e0e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a conf = ConfigParser()\nconf.read(self.config_path)\ndirection = conf.get(btn_name, \"direction\")\nposition = [int(i.strip()) for i in conf.get(btn_name, \"location\").split(\",\")]\n \u8ba1\u7b97\u5143\u7d20\u6309\u94ae\u5750\u6807 \u6839\u636e\u5e94\u7528\u7a97\u53e3\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u5927\u5c0f\u3001\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u5927\u5c0f\uff0c\u4f7f\u7528\u4e00\u5b9a\u7684\u7b97\u6cd5\u5373\u53ef\u8ba1\u7b97\u51fa\u5143\u7d20\u6309\u94ae\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u4e2d\u5fc3\u5750\u6807\uff09\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3","title":"3\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u3010\u914d\u7f6e\u65b9\u6cd5\u3011 \u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u7684\u6570\u636e\u6e90\u662f\u5e94\u7528\u5e93\u4e2d\u7684 ui.ini \u914d\u7f6e\u6587\u4ef6\uff1a ;section\n[\u65b0\u5efa\u6b4c\u5355+] ;key = value\ndirection = left_top\nlocation = 180, 268, 21, 21\n section \u662f\u4f60\u6839\u636e\u5bf9\u5e94\u7684\u5143\u7d20\u6309\u94ae\u547d\u540d\uff0c\u4f60\u53ef\u4ee5\u4efb\u610f\u547d\u540d\uff0c\u4f46\u6700\u597d\u6709\u5177\u4f53\u542b\u4e49\uff0c\u4e14\u80fd\u660e\u786e\u8868\u793a\u8fd9\u4e2a\u5143\u7d20\u6309\u94ae\u7684\u540d\u79f0\uff1b\u7528\u4e2d\u62ec\u53f7\u62ec\u8d77\u6765\u5c31\u884c\uff0c\u6bd4\u5982\uff1a[\u65b0\u5efa\u6b4c\u5355+] \uff1b direction \u662f\u914d\u7f6e\u8be5\u5143\u7d20\u7684\u53c2\u8003\u7cfb\uff0c\u5206\u522b\u4e3a\uff1a left_top \u5de6\u4e0a\uff1b left_bottom \u5de6\u4e0b\uff1b right_top \u53f3\u4e0a\uff1b right_bottom \u53f3\u4e0b\uff1b \u53c2\u8003\u7cfb\u7684\u9009\u53d6\u6807\u51c6\uff1a\u62c9\u52a8\u6539\u53d8\u7a97\u53e3\u5927\u5c0f\u65f6\uff0c\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u53c2\u8003\u7cfb\u4f4d\u7f6e\u662f\u4e0d\u53d8\u7684\uff1b location \u662f\u8be5\u5143\u7d20\u6309\u94ae\u7684\u76f8\u5bf9\u4e0e\u53c2\u8003\u7cfb\u7684 x, y \u7684\u8ddd\u79bb\uff0c\u53ca\u5927\u5c0f(w, h)\uff0c\u8fd9\u56db\u4e2a\u6570\u636e\u53ef\u4ee5\u901a\u8fc7 UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\u6570\u636e\uff0c\u5728\u7f16\u8f91\u6a21\u5f0f\u4e0b\uff0c\u70b9\u51fb UI \u56fe\u4e0a\u7684\u6309\u94ae\uff0c\u53f3\u4fa7\u5c31\u4f1a\u51fa\u73b0\u8be5\u5143\u7d20\u6309\u94ae\u7684 x, y, w, h \u6570\u636e\u3002 \u5982\u679c UI \u56fe\u4e0a\u6ca1\u6709\u63d0\u4f9b\u4f60\u60f3\u8981\u7684\u5143\u7d20\u6570\u636e\uff0c\u4f60\u53ef\u4ee5\u76f4\u63a5\u5728\u7cfb\u7edf\u4e2d\u4f7f\u7528\u622a\u56fe\u5f55\u5c4f\u8fdb\u884c\u5c3a\u91cf\uff0c\u8fd9\u662f\u4e00\u79cd\u4e0d\u63a8\u8350\u4f46\u80fd\u7528\u7684\u65b9\u6cd5\u3002 \u3010\u8c03\u7528\u65b9\u6cd5\u3011 \u5728\u5e94\u7528\u5e93\u65b9\u6cd5\u5c42\u8fd9\u6837\u5199\uff1a def click_add_music_list_btn_in_music_by_ui(self):\n\"\"\"\u70b9\u51fb\u65b0\u5efa\u6b4c\u5355\u6309\u94ae\"\"\"\nself.click(*self.ui.btn_center(\"\u65b0\u5efa\u6b4c\u5355+\"))\n self.ui.btn_center() \u662f\u56fa\u5b9a\u5199\u6cd5\uff0c\u53c2\u6570\u5c31\u662f\u914d\u7f6e\u91cc\u9762\u7684 section \u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ocr","title":"\u56db\u3001OCR \u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_2","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 OCR \u65b9\u6848\u5927\u591a\u91c7\u7528\u8c37\u6b4c OCR\uff08Tesseract\uff09\u65b9\u6848\uff0c\u4f46\u662f\u5b83\u5bf9\u4e8e\u4e2d\u6587\u7684\u8bc6\u522b\u975e\u5e38\u5dee\uff0c\u7ecf\u8fc7\u5927\u91cf\u7684\u8c03\u7814\uff0c\u6211\u4eec\u4f7f\u7528 PaddleOCR\uff0c\u5b83\u662f\u4e00\u4e2a\u5f00\u6e90\u7684\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u8bc6\u522b\u5de5\u5177\uff0c\u4e5f\u662f PaddlePaddle \u6700\u6709\u540d\u7684\u4e00\u4e2a\u5f00\u6e90\u9879\u76ee\uff0c\u611f\u5174\u8da3\u7684\u53ef\u4ee5\u70b9\u8fd9\u91cc\u4e86\u89e3\uff0c\u591a\u7684\u4e0d\u8bf4\u4e86\uff0c\u4f60\u53ea\u9700\u8981\u77e5\u9053\u5b83\u5c31\u662f\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_2","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5b89\u88c5\u4ed6\u662f\u4e2a\u5f88\u9ebb\u70e6\u7684\u4e8b\u60c5\uff0c\u867d\u7136\u64cd\u4f5c\u5f88\u7b80\u5355\uff0c\u4f46\u5176\u5b9e\u5b89\u88c5\u5305\u6709\u70b9\u5927\uff0c\u56e0\u6b64\u6211\u4eec\u4e0d\u5e0c\u671b\u76f4\u63a5\u5728 env.sh \u4e2d\u52a0\u5165\u5b83\uff0c\u8fd9\u4f1a\u8ba9\u6574\u4e2a\u81ea\u52a8\u5316\u73af\u5883\u53d8\u5f97\u975e\u5e38\u81c3\u80bf\uff1b \u56e0\u6b64\uff0c\u6211\u4eec\u60f3\u5230\u5c06\u5b83\u505a\u6210\u4e00\u4e2a RPC \u670d\u52a1\u5728\u5176\u4ed6\u673a\u5668\u4e0a\u90e8\u7f72\uff0c\u6d4b\u8bd5\u673a\u901a\u8fc7\u8fdc\u7a0b\u8c03\u7528 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u4f7f\u7528\u5b83\uff1b RPC \u7684\u8c03\u7528\u903b\u8f91\uff1a \u8fd9\u6837\u6211\u4eec\u53ea\u9700\u8981\u5728\u670d\u52a1\u7aef\u90e8\u7f72\u597d OCR \u8bc6\u522b\u7684\u670d\u52a1\uff0c\u7136\u540e\u901a\u8fc7 RPC \u670d\u52a1\u5c06\u529f\u80fd\u63d0\u4f9b\u51fa\u6765\uff0c\u6846\u67b6\u91cc\u9762\u53ea\u9700\u8981\u8c03\u7528\u5bf9\u5e94\u7684 RPC \u63a5\u53e3\u5c31\u884c\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_1","title":"3\u3001\u4f7f\u7528\u8bf4\u660e","text":"\u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nfrom paddleocr import PaddleOCR\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef paddle_ocr(pic_path, lang):\n\"\"\"\n Paddleocr\u76ee\u524d\u652f\u6301\u7684\u591a\u8bed\u8a00\u8bed\u79cd\u53ef\u4ee5\u901a\u8fc7\u4fee\u6539lang\u53c2\u6570\u8fdb\u884c\u5207\u6362\n \u4f8b\u5982`ch`, `en`, `fr`, `german`, `korean`, `japan`\n :param file_name:\n :param lang:\n :return:\n \"\"\"\nif __name__ == \"__main__\":\nIP = popen(\"hostname -I\").read().split(\" \")[0]\nPORT = 8890\nSCREEN_CACHE = \"/tmp/screen.png\"\nserver = ThreadXMLRPCServer((IP, PORT), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(paddle_ocr, \"paddle_ocr\")\nprint(\"\u76d1\u542c\u5ba2\u6237\u7aef\u8bf7\u6c42\u3002\u3002\")\nserver.serve_forever()\n \u6846\u67b6\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from src import OCR\nOCR.ocr(*target_strings, picture_abspath=None, similarity=0.6, return_default=False, return_first=False, lang=\"ch\"):\n# \u901a\u8fc7 OCR \u8fdb\u884c\u8bc6\u522b\u3002\n# target_strings:\n# \u76ee\u6807\u5b57\u7b26,\u8bc6\u522b\u4e00\u4e2a\u5b57\u7b26\u4e32\u6216\u591a\u4e2a\u5b57\u7b26\u4e32,\u5e76\u8fd4\u56de\u5176\u5728\u56fe\u7247\u4e2d\u7684\u5750\u6807;\n# \u5982\u679c\u4e0d\u4f20\u53c2\uff0c\u8fd4\u56de\u56fe\u7247\u4e2d\u8bc6\u522b\u5230\u7684\u6240\u6709\u5b57\u7b26\u4e32\u3002\n# picture_abspath: \u8981\u8bc6\u522b\u7684\u56fe\u7247\u8def\u5f84\uff0c\u5982\u679c\u4e0d\u4f20\u9ed8\u8ba4\u622a\u53d6\u5168\u5c4f\u8bc6\u522b\u3002\n# similarity: \u5339\u914d\u5ea6\u3002\n# return_default: \u8fd4\u56de\u8bc6\u522b\u7684\u539f\u751f\u6570\u636e\u3002\n# return_first: \u53ea\u8fd4\u56de\u7b2c\u4e00\u4e2a,\u9ed8\u8ba4\u4e3a False,\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u6240\u6709\u6570\u636e\u3002\n# lang: `ch`, `en`, `fr`, `german`, `korean`, `japan`\n \u6b64\u65b9\u6848\u5728\u6846\u67b6\u5185\u6ca1\u6709\u5f15\u5165\u4efb\u4f55\u4e09\u65b9\u4f9d\u8d56\u5b8c\u5168\u91c7\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\uff0c\u800c\u4e14\u4f7f\u7528\u65b9\u6cd5\u975e\u5e38\u7b80\u5355\uff0c\u53ea\u9700\u8981\u901a\u8fc7 OCR.ocr() \u5373\u53ef\uff1b \u5bf9\u4e8e\u4e00\u4e9b\u6587\u6848\u7684\u573a\u666f\u975e\u5e38\u9002\u7528\uff0c\u6b64\u65b9\u6cd5\u76f4\u63a5\u8fd4\u56de\u5750\u6807\uff0c\u53ef\u4ee5\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u3002 \u4e5f\u53ef\u4ee5\u7528\u4e8e\u6587\u5b57\u65ad\u8a00\uff0c\u4ee3\u7801\u793a\u610f\uff1a def assert_ocr_exist(\n*args, picture_abspath=None, similarity=0.6, return_first=False, lang=\"ch\"\n):\n\"\"\"\u65ad\u8a00\u6587\u6848\u5b58\u5728\"\"\"\npic = None\nif picture_abspath is not None:\npic = picture_abspath + \".png\"\nres = OCR.ocr(\n*args,\npicture_abspath=pic,\nsimilarity=similarity,\nreturn_first=return_first,\nlang=lang,\n)\nif res is False:\nraise AssertionError(\n(f\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{args}\", f\"{pic if pic else GlobalConfig.SCREEN_CACHE}\")\n)\nif isinstance(res, tuple):\npass\nelif isinstance(res, dict) and False in res.values():\nres = filter(lambda x: x[1] is False, res.items())\nraise AssertionError(\n(\nf\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{dict(res)}\",\nf\"{pic if pic else GlobalConfig.SCREEN_CACHE}\",\n)\n)\n \u5728\u7528\u4f8b\u4e2d\u4f7f\u7528\u65ad\u8a00\uff0c\u793a\u4f8b\uff1a def test_font_manager_021(self):\n\"\"\"\u53f3\u4fa7\u2665-\u6536\u85cf/\u53d6\u6d88\u6536\u85cf\u5b57\u4f53\"\"\"\n# \u5b57\u4f53\u7ba1\u7406\u5668\u754c\u9762\u53f3\u4fa7\u8be6\u60c5\u5217\u8868\uff0c\u9009\u62e9\u672a\u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e / \u6536\u85cf\u5b57\u4f53\n# \u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e\u83dc\u5355\u663e\u793a\u201c\u53d6\u6d88\u6536\u85cf\u201d\uff1b\n...\nself.assert_ocr_exist(\"\u53d6\u6d88\u6536\u85cf\")\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_1","title":"4\u3001\u670d\u52a1\u7aef\u90e8\u7f72","text":"\u6211\u4eec\u76ee\u524d\u662f\u5c06 OCR \u670d\u52a1\u90e8\u7f72\u5728\u666e\u901a\u7684\u529e\u516c\u673a\u4e0a\u7684\uff0c\u5982\u679c\u4f60\u89c9\u5f97\u73b0\u6709\u7684 OCR \u8bc6\u522b\u6027\u80fd\u4e0d\u591f\u597d\uff0c\u6070\u597d\u4f60\u6709\u66f4\u597d\u7684\u673a\u5668\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u5176\u79c1\u6709\u5316\u90e8\u7f72\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41_1","title":"4.1\u3001\u73af\u5883\u5b89\u88c5","text":"\u63a8\u8350\u4f7f\u7528 pipenv \u8fdb\u884c\u73af\u5883\u642d\u5efa\uff1b \u5b89\u88c5 pipenv \uff1a sudo pip3 install pipenv\n \u65b0\u5efa\u4e00\u4e2a\u76ee\u5f55\u4f5c\u4e3a\u73af\u5883\u5305 ocr_env\uff1a cd ~\nmkdir ocr_env\n \u521b\u5efa python 3.7 \u73af\u5883\uff1a cd ocr_env\npipenv --python 3.7\n \u5b89\u88c5 OCR \u4f9d\u8d56\u5305\uff1a pipenv install paddlepaddle -i https://mirror.baidu.com/pypi/simple\npipenv install \"paddleocr>=2.0.1\" -i https://mirror.baidu.com/pypi/simple\n \u4e0d\u51fa\u610f\u5916\uff0c\u8fd9\u6837\u5c31\u628a\u4f9d\u8d56\u5b89\u88c5\u597d\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42_1","title":"4.2\u3001\u542f\u52a8\u670d\u52a1","text":"\u5c06\u57fa\u7840\u6846\u67b6\u4e2d\u7684 scr/ocr/pdocr_rpc_server.py \u6587\u4ef6\u62f7\u8d1d\u5230 ocr_env \u76ee\u5f55\uff0c\u540e\u53f0\u6267\u884c\u5b83\u5c31\u597d\u4e86\uff1a cd ocr_env\nnohup pipenv run python pdocr_rpc_server.py &\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#43","title":"4.3\u3001\u914d\u7f6e\u5f00\u673a\u81ea\u542f\uff08\u901a\u7528\uff09","text":"\u4f60\u80af\u5b9a\u4e0d\u60f3\u6bcf\u6b21\u673a\u5668\u91cd\u542f\u4e4b\u540e\u90fd\u9700\u8981\u624b\u52a8\u542f\u52a8\u670d\u52a1\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u914d\u7f6e\u5f00\u673a\u81ea\u542f\u3002 \u5199\u5f00\u673a\u81ea\u542f\u670d\u52a1\u6587\u4ef6\uff1a sudo vim /lib/systemd/system/ocr.service\n autoocr \u540d\u79f0\u4f60\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff0c\u5199\u5165\u4ee5\u4e0b\u5185\u5bb9\uff1a [Unit]\nDescription=OCR Service\nAfter=multi-user.target\n\n[Service]\nUser=uos\nGroup=uos\nType=idle\nWorkingDirectory=/home/uos/ocr_env\nExecStart=pipenv run python pdocr_rpc_server.py\n\n[Install]\nWantedBy=multi-user.target\n \u6ce8\u610f\u66ff\u6362\u4f60\u7684${USER} \u4fee\u6539\u914d\u7f6e\u6587\u4ef6\u7684\u6743\u9650\uff1a sudo chmod 644 /lib/systemd/system/ocr.service\n \u81ea\u542f\u670d\u52a1\u751f\u6548\uff1a sudo systemctl daemon-reload\nsudo systemctl enable ocr.service\n \u67e5\u770b\u670d\u52a1\u72b6\u6001\uff1a sudo systemctl status ocr.service\n \u4f60\u53ef\u4ee5\u518d\u91cd\u542f\u4e0b\u7535\u8111\uff0c\u770b\u770b\u670d\u52a1\u662f\u4e0d\u662f\u6b63\u5e38\u542f\u52a8\u4e86\uff0c\u6ca1\u62a5\u9519\u5c31 OK \u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_4","title":"\u4e94\u3001\u5c5e\u6027\u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_3","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 UI \u81ea\u52a8\u5316\u5927\u591a\u90fd\u662f\u57fa\u4e8e\u6d4f\u89c8\u5668\u7684\uff0c\u6838\u5fc3\u662f\u5728\u7f51\u9875\u7684 DOM \u6811\u4e0a\u67e5\u627e\u5143\u7d20\uff0c\u5e76\u5bf9\u5176\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\uff1b Linux \u684c\u9762\u5e94\u7528\u5927\u591a\u662f\u91c7\u7528 Qt \u7f16\u5199\u7684\uff0c\u5728 Qt \u4e2d\u4e5f\u662f\u4ece\u6700\u9876\u5c42\u7684 MainWindow \u5f00\u59cb\u6784\u5efa\u5e94\u7528\uff0c\u6240\u4ee5\u903b\u8f91\u4e5f\u662f\u4e00\u6837\u7684\uff0cQt \u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u540c\u6837\u53ef\u4ee5\u901a\u8fc7 DOM \u6811\uff08\u5c5e\u6027\u6811\uff09\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff0c\u6211\u4eec\u79f0\u4e4b\u4e3a\u5c5e\u6027\u5b9a\u4f4d\u3002 \u501f\u52a9\u5f00\u6e90\u5de5\u5177 dogtail \u6211\u4eec\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u83b7\u53d6\uff0c\u4ece\u800c\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\u3002dogtail \u7684\u9879\u76ee\u4ecb\u7ecd\u53ef\u4ee5\u731b\u6233\u8fd9\u91cc\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_3","title":"2\u3001\u4f7f\u7528\u65b9\u6cd5","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#21sniff","title":"2.1\u3001sniff\uff08\u55c5\u63a2\u5668\uff09\u4f7f\u7528","text":"\u5728\u7ec8\u7aef\u8f93\u5165 sniff \u542f\u52a8 AT-SPI Browser mikigo@mikigo-PC:~$ sniff\n \u67e5\u770b\u5e94\u7528\u7684\u6807\u7b7e \u5728 sniff \u91cc\u9762\u53ef\u4ee5\u770b\u5230\u7cfb\u7edf\u4e2d\u5df2\u542f\u52a8\u7684\u5e94\u7528\uff0c\u70b9\u51fb\u5e94\u7528\u540d\u79f0\u524d\u9762\u7684\u4e09\u89d2\u5f62\u56fe\u6807\uff0c\u53ef\u4ee5\u5c55\u5f00\u5e94\u7528\u7684\u6807\u7b7e\uff0c\u6240\u6709\u6807\u7b7e\u4ee5 tree \u7684\u5f62\u5f0f\u5c55\u793a\uff0c\u5bf9\u5e94\u5e94\u7528\u91cc\u9762\u7684\u7236\u7a97\u53e3\u548c\u5b50\u7a97\u53e3\u3002 \u83b7\u53d6\u5143\u7d20\u63a7\u4ef6\u7684\u6807\u7b7e\u540d\u79f0 \u9996\u5148\uff0c\u4e3a\u4e86\u65b9\u4fbf\u67e5\u770b\u5143\u7d20\u63a7\u4ef6\u5bf9\u5e94\u7684\u4f4d\u7f6e\uff0c\u5efa\u8bae\u73b0\u5728\u4e0a\u65b9\u5de5\u5177\u680f\u70b9\u51fb Actions\uff0c\u7136\u540e\u52fe\u9009 Hightlight Items\uff0c\u8fd9\u6837\u5728 sniff \u4e2d\u9f20\u6807\u9009\u4e2d\u5143\u7d20\u6807\u7b7e\u7684\u65f6\u5019\uff0c\u5e94\u7528\u4e2d\u4f1a\u6709\u76f8\u5e94\u7684\u5149\u6807\u9501\u5b9a\u3002 \u5728 sniff \u91cc\u9762\u70b9\u51fb\u8fdb\u5165\u5e94\u7528\u7684\u6807\u7b7e tree \u4e2d\u540e\uff0c\u70b9\u51fb\u76f8\u5e94\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5728\u5de5\u5177\u4e0b\u65b9\uff0c\u4f1a\u5c55\u793a\u5143\u7d20\u63a7\u4ef6\u7684 Name\uff0c\u8fd9\u4e2a\u5c31\u662f\u6807\u7b7e\u540d\u79f0\u3002 \u5728 tree \u4e2d\u6709\u4e9b\u5730\u65b9\u662f\u7a7a\u767d\u7684\u6216\u8005\u662f Form\uff0c\u662f\u56e0\u4e3a\u5f00\u53d1\u4eba\u5458\u5728\u6dfb\u52a0\u6807\u7b7e\u7684\u65f6\u5019\u6ca1\u6709\u6dfb\u52a0\uff0c\u6216\u8005\u6709\u4e9b\u7236\u7a97\u53e3\u4e0d\u9700\u8981\u6dfb\u52a0\uff0c\u8fd9\u79cd\u5728\u5b9e\u9645\u4e1a\u52a1\u4e2d\u662f\u4e0d\u5f71\u54cd\u7684\uff0c\u6211\u4eec\u53ea\u8981\u4fdd\u8bc1\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\u4e2d\uff0c\u8981\u7528\u5230\u7684\u5143\u7d20\u90fd\u6dfb\u52a0\u4e86\u6807\u7b7e\u5373\u53ef\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#22","title":"2.2\u3001\u5143\u7d20\u64cd\u4f5c","text":"\u83b7\u53d6\u5e94\u7528\u5bf9\u8c61 dogtail \u83b7\u53d6\u5e94\u7528\u5bf9\u8c61\u7684\u65f6\u5019\uff0c\u4f7f\u7528\u7684\u662f tree \u5e93\u91cc\u9762\u7684 application() \u65b9\u6cd5\uff1a from dogtail.tree import root\napp_obj = root.application('deepin-music')\n app_obj\u5c31\u662f\u5e94\u7528\u7684\u5bf9\u8c61\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\uff0c\u662f\u5e94\u7528\u5bf9\u8c61\u4f7f\u7528child()\u65b9\u6cd5\uff1a element = app_obj.child('element_name')\n \u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u4f20\u5165\u5143\u7d20\u7684 Name\uff0c\u83b7\u53d6\u5230\u76f8\u5e94\u5143\u7d20\u7684\u5bf9\u8c61\u3002Name \u53ef\u4ee5\u901a\u8fc7 sniff \u67e5\u770b\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\u5217\u8868: element_list = element.children\n \u83b7\u53d6\u5230\u8fd9\u4e2a\u5143\u7d20\u4e0b\u9762\u6240\u6709\u7684\u5143\u7d20\u5217\u8868\u3002 \u8fd9\u4e2a\u65b9\u6cd5\u9002\u7528\u4e8e\u6709\u4e9b\u6807\u7b7e\u6ca1\u6709\u6dfb\u52a0\uff0c\u4f46\u662f\u4f4d\u7f6e\u662f\u56fa\u5b9a\u7684\uff0c\u6211\u4eec\u901a\u8fc7\u7d22\u5f15\u53ef\u4ee5\u53d6\u5f97\u5143\u7d20\u3002 element_list[0]\n \u5bf9\u5143\u7d20\u7684\u64cd\u4f5c \u5728\u83b7\u53d6\u5230\u5143\u7d20\u4e4b\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u76f8\u5e94\u7684\u64cd\u4f5c\u3002 \u5355\u51fb element.click(button=1)\n button 1 \u2014>\u5de6\u952e\uff0c2 \u2014>\u6eda\u8f6e\uff0c3 \u2014>\u53f3\u952e\uff0c\u9ed8\u8ba4\u4e3a 1 \u53cc\u51fb element.doubleClick(button=1)\n \u9f20\u6807\u60ac\u505c element.point()\n \u9f20\u6807\u79fb\u52a8\u5230\u5143\u7d20\u4e2d\u5fc3\u4f4d\u7f6e \u6587\u672c\u8f93\u5165 element.typeText(string)\n \u5411\u5143\u7d20\u5bf9\u8c61\u8f93\u5165\u5b57\u7b26\u4e32 \uff0c\u6bd4\u5982\u8f93\u5165\u6846 \u7ec4\u5408\u952e element.keyCombo(comboString)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#23","title":"2.3\u3001\u6846\u67b6\u5c01\u88c5","text":"\u4ee3\u7801\u793a\u4f8b\uff1a # \u8be6\u7ec6\u4ee3\u7801\u8bf7\u67e5\u770b src/dogtail_utils.py\nclass DogtailUtils:\ndef __init__(self, name=None, description=None):\nself.name = name\nself.description = description\nself.obj = root.application(self.name, self.description)\ndef app_element(self, *args, **kwargs):\n\"\"\"\n \u83b7\u53d6app\u5143\u7d20\u7684\u5bf9\u8c61\n :return: \u5143\u7d20\u7684\u5bf9\u8c61\n \"\"\"\nreturn self.obj.child(*args, **kwargs, retry=False)\ndef element_center(self, element) -> tuple:\n\"\"\"\n \u83b7\u53d6\u5143\u7d20\u7684\u4e2d\u5fc3\u4f4d\u7f6e\n :param element:\n :return: \u5143\u7d20\u4e2d\u5fc3\u5750\u6807\n \"\"\"\n_x, _y, _w, _h = self.app_element(element).extents\n_x = _x + _w / 2\n_y = _y + _h / 2\nreturn _x, _y\n \u6846\u67b6\u63d0\u4f9b\u7684\u63a5\u53e3\u975e\u5e38\u7b80\u6d01\uff0c\u5728\u8c03\u7528\u65f6\uff1a self.dog.element_center(\"\u64ad\u653e\")\n \u8fd9\u6837\u5c31\u80fd\u83b7\u53d6\u5230\u6b64\u5143\u7d20\u7684\u4e2d\u5fc3\u5750\u6807\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_5","title":"\u516d\u3001\u6807\u7b7e\u5316\u7ba1\u7406","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_4","title":"1\u3001\u6807\u7b7e\u8bf4\u660e","text":"\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u811a\u672c ID\uff1a\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c/\u51fd\u6570 ID\uff1b PMS\u7528\u4f8bID\uff1aPMS \u4e0a\u5bf9\u5e94\u7684\u7528\u4f8b ID\uff08\u7528\u4f8b\u5e93 ID\uff09\uff1b \u9ed8\u8ba4\u4f7f\u7528\u7528\u4f8b\u5e93 ID\uff0c\u5bf9\u4e8e\u6682\u65f6\u6ca1\u6709\u4f7f\u7528\u7528\u4f8b\u5e93\u7ba1\u7406\u7528\u4f8b\u7684\u9879\u76ee\uff0c\u53ef\u4ee5\u4f7f\u7528\u4ea7\u54c1\u5e93\u7528\u4f8b ID\uff1b \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1aFUNC\uff08\u529f\u80fd\uff09\u3001PERF\uff08\u6027\u80fd\uff09\u3001STR\uff08\u538b\u529b\uff09\u3001SEC\uff08\u5b89\u5168\uff09\u3001CTS\uff08\u517c\u5bb9\u6027\uff09\u3001API\uff08\u63a5\u53e3\uff09\u3001BASELINE\uff08\u57fa\u7ebf-\u9884\u7559\uff09 \u8bbe\u5907\u7c7b\u578b\uff1aPPL\uff08\u4f9d\u8d56\u5916\u8bbe\u7684\u7528\u4f8b\uff09\u3001COL\uff08\u4f9d\u8d56\u4e3b\u63a7\u673a\u7684\u7528\u4f8b\uff09 \u7528\u4f8b\u6765\u6e90\uff1aBUG\uff08\u7531 Bug \u8f6c\u7684\u7528\u4f8b\uff09 \u4e0a\u7ebf\u5bf9\u8c61\uff1aCICD\uff0c\u8868\u793a\u4e0a\u7ebf\u5230 CICD \u6d41\u6c34\u7ebf\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u53ef\u4e00\u952e\u751f\u6210 case_list.csv \u6587\u4ef6\uff0c\u7528\u4e8e\u5bfc\u5165\u5230\u660e\u9053\u4e91 AT \u7528\u4f8b\u5217\u8868\u4e2d\u63a7\u5236 CICD \u8dd1\u6d4b\u8303\u56f4\uff1b \u6d4b\u8bd5\u7ea7\u522b\uff1aC1 / C2 / C3 / C4\uff0c\u5177\u4f53\u5b9a\u4e49\u53c2\u8003\u6d41\u6c34\u7ebf\u4f7f\u7528\u6307\u5bfc\uff1b \u8df3\u8fc7\u539f\u56e0\uff1askip-XXX\uff0c\u7528\u4e8e\u63a7\u5236\u7528\u4f8b\u662f\u5426\u6267\u884c\uff1b \u786e\u8ba4\u4fee\u590d\uff1afixed-XXX\uff0c\u7528\u4e8e\u6807\u8bb0\u7528\u4f8b\u7684\u4fee\u590d\u72b6\u6001\uff08\u540e\u9762\u8be6\u7ec6\u8bb2\u89e3\u7528\u6cd5\uff09\uff1b \u5e9f\u5f03\u7528\u4f8b\uff1aremoved-\u5df2\u5e9f\u5f03\uff0c\u7528\u4e8e\u6807\u8bb0\u5df2\u7ecf\u5e9f\u5f03\u7684\u7528\u4f8b\uff0c\u6b64\u7528\u4f8b\u6807\u7b7e\u4e0d\u4f1a\u88ab\u6dfb\u52a0\uff0c\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff1b \u793a\u4f8b\uff1a \u811a\u672cID PMS\u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u8bbe\u5907\u7c7b\u578b \u7528\u4f8b\u6765\u6e90 \u4e0a\u7ebf\u5bf9\u8c61 \u6d4b\u8bd5\u7ea7\u522b \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b ... 679537 679537 L1 FUNC PPL CICD C1 skip-XXX fixed-XXX removed-\u5df2\u5e9f\u5f03 ..."},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_4","title":"2\u3001\u64cd\u4f5c\u6b65\u9aa4","text":"2.1\u3001\u5728\u5b50\u9879\u76ee\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u4ee5\u7528\u4f8b\u7684 py \u6587\u4ef6\u9664\u53bb\u9996\u5b57\u7b26\u4e32 \"test_\" \u548c\u7528\u4f8b\u5e8f\u53f7\u540e\u7684\u5b57\u7b26\u4e32\u4f5c\u4e3a csv \u7684\u6587\u4ef6\u540d\u3002 \u4f8b\u5982: \u76f8\u518c\u7684\u7528\u4f8b\u6587\u4ef6\u4e3a test_album_xxx.py\uff0cxxx \u8868\u793a\u7528\u4f8b\u7684ID\uff08\u4e5f\u53ef\u4ee5\u662f\u81ea\u5b9a\u4e49\u7684\u6570\u5b57\u4ee3\u8868\u7528\u4f8b\u5e8f\u53f7\uff09\uff0c\u6b64\u65f6 csv \u6587\u4ef6\u540d\u5c31\u5e94\u4e3a album.csv\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u6240\u6709 csv \u6587\u4ef6\u5efa\u8bae\u653e\u5728\u4e00\u4e2a tags \u76ee\u5f55\u4e0b\u3002 \u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 2.2\u3001\u7b2c\u4e00\u5217\u4e3a\u811a\u672c ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b\u7528\u4f8b\u6807\u7b7e\u53ef\u4ee5\u65e0\u5e8f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_2","title":"3\u3001\u589e\u52a0\u8bf4\u660e","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_1","title":"3.1\u3001\u8df3\u8fc7\u7528\u4f8b","text":"\u4f20\u7edf\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668(@pytest.mark.skip)\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a; \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#311","title":"3.1.1\u3001\u56fa\u5b9a\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 679537 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u7b7e\u5f00\u5934\u4e3a \u201cskip-XXX\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\uff0c\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\u5219\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u7b7e\u4e3a SKIPED\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#312","title":"3.1.2\u3001\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skipif_platform-aarch64&mips64 \u67d0\u4e9b\u7528\u4f8b\u4f1a\u56e0\u4e3a\u4e0d\u540c\u7684\u73af\u5883\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\uff0c\u5e38\u89c1\u7684\u573a\u666f\u4e3a\u5728\u4e0d\u540c\u67b6\u6784\u4e0a\u5224\u65ad\u662f\u5426\u6267\u884c\uff0c\u8df3\u8fc7\u7684\u539f\u56e0\u6807\u7b7e\u4e3a \u201cskipif_platform-\u201d \u52a0\u67b6\u6784\u540d\uff0c\u591a\u4e2a\u67b6\u6784\u4e4b\u95f4\u4f7f\u7528 \u201c&\u201d \u62fc\u63a5\uff1b \u4ee5\u4e0a\u4f8b\u5b50\u4e3a\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u5224\u65ad\u5f53\u524d\u67b6\u6784\u662f\u5426\u4e3a arrch64 \u6216\u8005 mips64\uff0c\u82e5\u662f\uff0c\u5219\u8df3\u8fc7\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u82e5\u5426\u5219\u6267\u884c\u7528\u4f8b\uff1b \u76ee\u524d\u6846\u67b6\u9ed8\u8ba4\u4ec5\u652f\u6301\u67b6\u6784\u7684\u6761\u4ef6\u5224\u65ad\uff0c\u4f46\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u903b\u8f91\u652f\u6301\u81ea\u5b9a\u4e49\u6dfb\u52a0\u3002 \u5728\u9879\u76ee\u76ee\u5f55\u8def\u5f84\u4e0b\u5b58\u5728\u6587\u4ef6 setting/skipif.py\uff0c\u6240\u6709\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u7684\u51fd\u6570\u5199\u5728\u6b64\u6587\u4ef6\u4e2d\u3002 \u9ed8\u8ba4\u67b6\u6784\u5224\u65ad\u4f8b\u5b50\uff1a def skipif_platform(args: str):\n\"\"\"\u5e73\u53f0\u8df3\u8fc7\"\"\"\n_skip_key = args.split(\"&\")\nfor key in _skip_key:\nif GlobalConfig.SYS_ARCH == key:\nreturn True\nreturn False\n \u65b9\u6cd5\u7f16\u5199\u89c4\u8303\uff1a \u65b9\u6cd5\u540d\u5fc5\u987b\u4ee5 skipif \u5f00\u5934\uff1b \u65b9\u6cd5\u5fc5\u987b\u6709\u8fd4\u56de\u7ed3\u679c\u5e76\u4e14\u4e3a\u5e03\u5c14\u503c\uff08True \u4ee3\u8868\u8df3\u8fc7\uff0cFalse \u4ee3\u8868\u4e0d\u8df3\u8fc7\uff09\uff1b \u65b9\u6cd5\u53ea\u80fd\u6709\u4e00\u4e2a\u5165\u53c2\uff1b \u5728 csv \u6587\u4ef6\u8df3\u8fc7\u539f\u56e0\u4e00\u680f\u4e2d\u586b\u5199\u4e3a \u201c{\u51fd\u6570\u540d}-{\u53c2\u6570}\u201d\uff0c\u4f8b\u5982\uff1askipif_platform-aarch64\uff1b\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u4f1a\u4ee5\u7b2c\u4e00\u4e2a \u201c-\u201d \u8fdb\u884c\u5206\u5272\uff0c\u622a\u53d6\u7684\u5de6\u4fa7\u5b57\u7b26\u4e32\u4f5c\u4e3a\u51fd\u6570\u540d\uff0c\u5728 skipif.py \u6587\u4ef6\u4e2d\u67e5\u627e\u662f\u5426\u6709\u540c\u540d\u51fd\u6570\uff0c\u5e76\u5c06\u622a\u53d6\u7684\u53f3\u4fa7\u4f5c\u4e3a\u53c2\u6570\u4f20\u9012\u7ed9\u8be5\u51fd\u6570\uff0c\u901a\u8fc7\u83b7\u53d6\u8be5\u51fd\u6570\u8fd4\u56de\u7684\u5e03\u5c14\u503c\uff0c\u8fd4\u56de True\uff0c\u5219\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u8fd4\u56de False\uff0c\u5219\u6267\u884c\u8be5\u7528\u4f8b\u3002 \u82e5\u51fd\u6570\u9700\u8981\u591a\u4e2a\u53c2\u6570\uff0c\u53ef\u81ea\u5b9a\u4e49\u591a\u4e2a\u53c2\u6570\u4e4b\u95f4\u7684\u8fde\u63a5\u7b26\uff0c\u8fde\u63a5\u7b26\u53f7\u4e0d\u53ef\u4f7f\u7528\u4e0b\u5212\u7ebf\u548c\u9017\u53f7\uff0c\u63a8\u8350\u7edf\u4e00\u4f7f\u7528 & \u7b26\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32","title":"3.2\u3001\u786e\u8ba4\u4fee\u590d","text":"\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7528\u4f8b\u4fee\u590d\u540e\uff0c\u4f46\u4e0d\u80fd\u7acb\u5373\u5220\u9664\u8df3\u8fc7\u539f\u56e0\uff08skip-XXX\uff09\u7684\u7528\u4f8b\uff0c\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u786e\u8ba4\u4fee\u590d\u201d\uff0c\u4f5c\u4e3a\u6807\u8bb0\u8be5\u7528\u4f8b\u662f\u5426\u5df2\u7ecf\u4fee\u590d\uff0c\u56fa\u5b9a\u586b\u5165\u5b57\u6bb5\u4e3a \u201cfixed-\u5df2\u4fee\u590d\u201d\u3002\u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u5373\u4f7f\u540c\u65f6\u6807\u8bb0\u4e86 skip-XXX \u4e5f\u4f1a\u6b63\u5e38\u6267\u884c\u3002 \u793a\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d 679537 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d \u3010\u540c\u65f6\u6807\u8bb0\u4e86skip \u548c fixed\uff0c\u4f46\u4ecd\u7136\u60f3\u8981\u8df3\u8fc7\u7528\u4f8b\u3011 \u5f53 \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u540c\u65f6\u586b\u5165\u540e\uff0c\u547d\u4ee4\u884c\u4f20\u9012\u53c2\u6570 --ifixed yes\uff0c\u5219\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\u8be5\u6761\u7528\u4f8b\u3002 python3 manage.py run --ifixed yes\n \u770b\u5230\u8fd9\u91cc\u6709\u4e9b\u540c\u5b66\u53ef\u80fd\u8981\u95ee\u4e86\uff0c\u6211\u60f3\u6062\u590d\u8df3\u8fc7\u6267\u884c\uff0c\u76f4\u63a5\u628a skip-XXX \u8fd9\u4e00\u5217\u6807\u7b7e\u5220\u6389\u4e0d\u5c31\u597d\u4e86\uff0c\u8fd8\u641e\u4ec0\u4e48\u786e\u8ba4\u4fee\u590d\u5e72\u5565\uff1f \u8fd9\u91cc\u7ed9\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u89e3\u91ca\u4e00\u4e0b\uff1a \uff08\u4ee5\u4e0b\u6d41\u6c34\u7ebf\u6307\u7684\u662f\u6bcf\u65e5\u6784\u5efa\u7684\u6d41\u6c34\u7ebf\uff0c\u8dd1 AT \u7684\u5168\u91cf\u7528\u4f8b\uff09 \u9996\u5148\uff0c\u6d41\u6c34\u7ebf\u4e0a\u8dd1\u7684\u662f AT \u5386\u53f2 Tag\uff0c\u8df3\u8fc7\u7528\u4f8b\u7684\u6807\u7b7e(skip-XXX) \u662f\u5728\u6700\u65b0\u7684\u4ee3\u7801\u4e0a\u63d0\u4ea4\u7684\uff0c\u6211\u4eec\u91c7\u7528\u6700\u65b0\u7684 csv \u6587\u4ef6\u8986\u76d6\u5386\u53f2 csv \u6587\u4ef6\u7684\u8bbe\u8ba1\u6765\u5b9e\u73b0\u4e86\u5bf9\u5386\u53f2 Tag \u4e0a\u7528\u4f8b\u7684\u8df3\u8fc7\uff1b \u7136\u540e\uff0c\u5728\u65e5\u5e38\u8df3\u8fc7\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u540c\u65f6\u4e5f\u5728\u4fee\u590d\u4e00\u4e9b\u7528\u4f8b\uff0c\u4fee\u590d\u540e\u7684\u8fd9\u4e9b\u7528\u4f8b\u5728\u672c\u5730\u8c03\u8bd5\u7684\u65f6\u5019\u6211\u4eec\u4e0d\u5e0c\u671b\u7ee7\u7eed\u8df3\u8fc7\uff0c\u4f46\u662f\u6b64\u65f6\uff0c\u4fee\u590d\u7684\u8fd9\u4e9b\u7528\u4f8b\u53ef\u80fd\u8fd8\u4e0d\u7a33\u5b9a\uff0c\u4e0d\u9002\u5408\u9a6c\u4e0a\u653e\u5230\u6d41\u6c34\u7ebf\u53bb\u8dd1\uff0c\u4e5f\u5c31\u662f\u8bf4\u6d41\u6c34\u7ebf\u4e0a\u6211\u4eec\u662f\u5e0c\u671b\u4ed6\u7ee7\u7eed\u8df3\u8fc7\u7684\uff0c\u56e0\u6b64\uff0c\u54b1\u4e0d\u80fd\u76f4\u63a5\u628a skip-XXX \u5e72\u6389\uff1b \u8fd9\u91cc\u5c31\u77db\u76fe\u4e86\uff0c\u4e00\u4e2a\u9700\u6c42\u662f\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u53e6\u4e00\u4e2a\u9700\u6c42\u53c8\u4e0d\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u600e\u4e48\u529e\u5462\uff1f \u6211\u4eec\u4f7f\u7528\u201c\u786e\u8ba4\u4fee\u590d\u201d\u6765\u6807\u8bb0\u8fd9\u6761\u7528\u4f8b\u5df2\u7ecf\u4fee\u590d\u4e86\uff0c\u8fd9\u6837\u4f60\u672c\u5730\u8c03\u8bd5\u7528\u4f8b\u7684\u65f6\u5019\u8fd9\u6761\u5df2\u4fee\u590d\u7684\u7528\u4f8b\u662f\u4f1a\u6267\u884c\u7684\uff0c\u540c\u65f6\u5728\u6d41\u6c34\u7ebf\u4e0a\u5c06 --ifixed yes \u53c2\u6570\u52a0\u4e0a\uff0c\u90a3\u4e48\u6d41\u6c34\u7ebf\u4e0a\u6267\u884c\u65f6\u8fd9\u6761\u7528\u4f8b\u4ecd\u7136\u662f\u8df3\u8fc7\u7684\u72b6\u6001\uff0c\u540e\u7eed\u4f60\u6253 Tag \u7684\u65f6\u5019\uff0c\u628a \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u7684\u6807\u7b7e\u5168\u90e8\u5220\u6389\u5c31\u53ef\u4ee5\u4e86\u3002 \u8fd9\u5c31\u662f\u201c\u786e\u8ba4\u4fee\u590d\u201d\u8fd9\u4e2a\u6807\u7b7e\u7684\u80cc\u666f\uff0c\u9700\u8981\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u54c1\u4e00\u54c1\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#33","title":"3.3\u3001\u5e9f\u5f03\u7528\u4f8b","text":"\u9488\u5bf9\u67d0\u4e9b\u7528\u4f8b\uff0c\u7531\u4e8e\u9700\u6c42\u53d8\u66f4\uff0c\u73af\u5883\u5f71\u54cd\u6216\u8bc4\u4f30\u4e0d\u518d\u9002\u7528\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u65f6\uff0c\u7528\u4f8b\u9700\u8981\u5e9f\u5f03\uff0c\u5219\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u5e9f\u5f03\u7528\u4f8b\u201d\uff0c\u8be5\u5217\u5b58\u5728 \u201cremoved-{\u5e9f\u5f03\u539f\u56e0}\u201d\uff0c\u5219\u7528\u4f8b\u4e0d\u4f1a\u6267\u884c\u3002 \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d removed-\u5df2\u5e9f\u5f03 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_2","title":"4\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u4e0a\u9762\u4ecb\u7ecd Pytest \u6846\u67b6\u63d0\u4f9b\u7684\u6807\u7b7e\u529f\u80fd mark\uff0c\u4f7f\u7528\u65f6\u9700\u8981\u4e3a\u6bcf\u4e00\u4e2a\u7528\u4f8b\u6dfb\u52a0\u6807\u7b7e\u88c5\u9970\u5668\uff0c\u5219\u64cd\u4f5c\u590d\u6742\uff0c\u53ef\u7ef4\u62a4\u6027\u5dee\uff0c\u5176\u6839\u672c\u95ee\u9898\u5c31\u662f\u6807\u7b7e\u5206\u6563\u5728\u6bcf\u4e00\u6761\u7528\u4f8b\u7684\u88c5\u9970\u5668\u4e0a\uff0c\u96be\u4ee5\u96c6\u4e2d\u7ef4\u62a4\uff1b\u4e8e\u662f\u4e4e\u5c06\u6240\u6709\u6807\u7b7e\u4f7f\u7528 csv \u6587\u4ef6\u8fdb\u884c\u96c6\u4e2d\u7ba1\u7406\uff0c\u5e76\u901a\u8fc7 Pytest \u7684\u94a9\u5b50\u51fd\u6570\uff0c\u8bfb\u53d6 csv \u6587\u4ef6\uff0c\u52a8\u6001\u6dfb\u52a0\u6807\u7b7e\u5230\u7528\u4e2d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5csv","title":"5\u3001CSV\u6587\u4ef6\u683c\u5f0f","text":"\u6b64\u914d\u7f6e\u6587\u4ef6\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u6807\u7b7e\u6570\u636e\uff0c\u4e14\u8981\u65b9\u4fbf\u80fd\u4f7f\u7528 Excel \u6253\u5f00\u8fdb\u884c\u7f16\u8f91\u67e5\u770b\uff0c\u66f4\u91cd\u8981\u7684\u662f\u6211\u4eec\u4e0d\u60f3\u5f15\u5165\u4e09\u65b9\u4f9d\u8d56\uff0cCSV \u6587\u4ef6\u51e0\u4e4e\u662f\u552f\u4e00\u80fd\u6ee1\u8db3\u6240\u6709\u7684\u8981\u6c42\u7684\u6587\u4ef6\u683c\u5f0f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_6","title":"\u4e03\u3001\u65e5\u5fd7\u7cfb\u7edf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_5","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e YouQu \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u64cd\u4f5c\u65b9\u6cd5\u5c01\u88c5\u5199\u6cd5\uff0c\u901a\u5e38\u662f\u8fd9\u6837\u7684\uff1a\u7c7b\u91cc\u9762\u4e00\u4e2a\u51fd\u6570\u53ea\u5305\u542b\u4e00\u4e2a\u64cd\u4f5c\u6216\u591a\u6b21\u8c03\u7528\u7684\u4e00\u7cfb\u5217\u53ef\u5408\u5e76\u7684\u64cd\u4f5c\uff1b \u4f20\u7edf\u7684\u65e5\u5fd7\u8f93\u51fa\u65b9\u5f0f\uff0c\u9700\u8981\u5728\u6bcf\u4e2a\u51fd\u6570\u91cc\u9762\u4e3b\u52a8\u7f16\u5199\u65e5\u5fd7\u8f93\u51fa\u4ee3\u7801 \uff0c\u4f8b\u5982\uff1a class XXXWidget:\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\nlogger.info(\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\")\n...\n# \u7701\u7565\u4ee3\u7801\u90e8\u5206\n \u4e00\u4e2a\u51fd\u6570\u91cc\u9762\u81f3\u5c11\u5305\u542b\u4e00\u6761\u65e5\u5fd7\u4fe1\u606f\uff0c\u5982\u679c\u6bd4\u8f83\u590d\u6742\u64cd\u4f5c\u6b65\u9aa4\uff0c\u53ef\u80fd\u5305\u542b\u591a\u6761\u65e5\u5fd7\u4fe1\u606f\uff1b \u4e00\u4e2a\u5e94\u7528\u542b\u6709\u5927\u91cf\u7684\u64cd\u4f5c\u51fd\u6570\uff0c\u4e5f\u5c31\u662f\u8bf4\u6211\u4eec\u9700\u8981\u5199\u5927\u91cf\u7684\u65e5\u5fd7\u4ee3\u7801\uff1b \u901a\u8fc7\u7ecf\u9a8c\u89c2\u5bdf\uff0c\u6211\u4eec\u53d1\u73b0\uff0c\u51fd\u6570\u8bf4\u660e\u4ee5\u53ca\u51fd\u6570\u64cd\u4f5c\u65e5\u5fd7\uff0c\u5177\u6709\u8f83\u9ad8\u7684\u91cd\u590d\u5ea6\uff08\u4ece\u4e0a\u9762\u7684\u4f8b\u5b50\u4e5f\u53ef\u4ee5\u770b\u51fa\u6765\uff09\uff0c\u56e0\u6b64\u6211\u4eec\u5927\u80c6\u7684\u8bbe\u60f3\uff0c\u80fd\u4e0d\u80fd\u57fa\u4e8e\u6846\u67b6\u6267\u884c\u65f6\uff0c\u81ea\u52a8\u7684\u5c06\u51fd\u6570\u8bf4\u660e\u4f5c\u4e3a\u65e5\u5fd7\u6253\u5370\u51fa\u6765\uff0c\u4ece\u800c\u51cf\u5c11\u5927\u91cf\u65e5\u5fd7\u4ee3\u7801\u91cf\u548c\u91cd\u590d\u7f16\u5199\uff0c\u90a3\u771f\u662f\u5999\u554a~\u3002 \u57fa\u4e8e\u6b64\u201c\u5929\u771f\u201d\u7684\u60f3\u6cd5\uff0c\u6211\u4eec\u8bbe\u8ba1\u51fa\u4e86 youqu \u7684\u65e5\u5fd7\u7cfb\u7edf\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_5","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u6838\u5fc3\u539f\u7406\uff1a \u901a\u8fc7\u7ed9\u7c7b\u52a0\u4e0a\u4e00\u4e2a\u88c5\u9970\u5668 @log\uff0c\u52a8\u6001\u7ed9\u8be5\u7c7b\u4e0b\u6240\u6709\u7684\u51fd\u6570\u53ca\u7236\u7c7b\u51fd\u6570\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668 @_trace\uff0c\u5728\u6b64\u88c5\u9970\u5668\u4e2d\u6211\u4eec\u80fd\u52a8\u6001\u7684\u6355\u83b7\u6240\u8c03\u7528\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff08func.__doc__\uff09\uff0c\u901a\u8fc7\u65e5\u5fd7\u8f93\u51fa\u5668\u5c06\u5176\u8f93\u51fa\u5373\u53ef\u3002 \u5b9e\u73b0\u6b65\u9aa4\uff1a \u901a\u8fc7 inspect.getmembers \u83b7\u53d6\u88ab\u88c5\u9970\u7684\u7c7b\u4e0b\u6240\u6709\u51fd\u6570\uff0c\u5305\u542b\u9759\u6001\u65b9\u6cd5\uff0c\u7c7b\u65b9\u6cd5\uff0c\u5b9e\u4f8b\u65b9\u6cd5\uff1b \u901a\u8fc7 setattr(\u7c7b, \u65b9\u6cd5, _trace\uff09 \u7684\u65b9\u5f0f\uff0c\u7ed9\u7b26\u5408\u6761\u4ef6\u7684\u51fd\u6570\uff0c\u52a8\u6001\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_3","title":"3\u3001\u65e5\u5fd7\u914d\u7f6e","text":"[log_cli]\n;\u65e5\u5fd7\u76f8\u5173\u914d\u7f6e\uff08\u4e0d\u6253\u5370\u6784\u9020\u51fd\u6570\u548c\u9b54\u6cd5\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff09\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = INFO\n# ============= \u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u914d\u7f6e ================\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u5f00\u5934\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7, \u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_STARTSWITH = Assert\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u7ed3\u5c3e\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_ENDSWITH = Widget\n;\u652f\u6301\u7c7b\u540d\u5305\u542b xxx \u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_CONTAIN = ShortCut\n# ==============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_3","title":"4\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u5728\u5e94\u7528\u5e93 widget \u65b9\u6cd5\u5e93\u91cc\u9762\uff0c\u53ea\u9700\u8981\u5728\u51fa\u53e3\u6587\u4ef6\u52a0\u4e0a\u7c7b\u88c5\u9970\u5668\uff0c\u5c31\u53ef\u4ee5\u5b9e\u73b0\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u4e86\uff1b # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6ce8\u610f\uff0c\u662f\u7c7b\u88c5\u9970\u5668\u3002 \u5b9e\u4f8b\uff1a # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\n@classmethod\ndef find_dfm_image(cls, *elements, multiple=False, rate=0.9):\n\"\"\"\n \u67e5\u627e\u56fe\u7247 {{elements}}.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e {{rate}} \u7684\u5750\u6807\n :param elements:\n :param multiple:\n :return:\n \"\"\"\nelement = tuple(map(lambda x: f\"{Config.PIC_RES_PATH}/{x}\", elements))\nreturn cls.find_image(*element, multiple=multiple)\n \u8c03\u7528\u65b9\u6cd5\u65f6\uff1a DfmWidget.find_dfm_image(\"dfm_001\")\n \u81ea\u52a8\u8f93\u51fa\u7684\u65e5\u5fd7\uff1a >> x86_64-uos-6: 02/28 17:48:47 | INFO | logger_utils: [find_dfm_image]: \u67e5\u627e\u56fe\u7247 dfm_001.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e 0.9 \u7684\u5750\u6807\n \u52a0\u4e0a\u88c5\u9970\u5668 @log \u4e4b\u540e\uff0c\u65b9\u6cd5\u5c42\u6240\u6709\u7684\u51fd\u6570\uff08\u5305\u62ec\u5b9e\u4f8b\u65b9\u6cd5\u3001\u7c7b\u65b9\u6cd5\u3001\u9759\u6001\u65b9\u6cd5\uff09\u90fd\u4e0d\u9700\u8981\u518d\u5199\u65e5\u5fd7\u4ee3\u7801\uff0c\u6267\u884c\u7684\u65f6\u5019\u4f1a\u81ea\u52a8\u8f93\u51fa\uff0c\u5e76\u4e14\u6240\u6709\u8c03\u7528\u7684\u65b9\u6cd5\u4f1a\u4ee5 allure.step \u7684\u65b9\u5f0f\uff0c\u5c55\u793a\u5728 allure \u62a5\u544a\u4e2d\uff0c\u5728\u62a5\u544a\u4e2d\u66f4\u80fd\u4e00\u76ee\u4e86\u7136\u7684\u770b\u5230\u7528\u4f8b\u6267\u884c\u6b65\u9aa4\u3002 \u3010\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\u3011 \u901a\u8fc7\u89c2\u5bdf\u524d\u9762\u7684\u4f8b\u5b50\uff0c\u7ec6\u5fc3\u7684\u540c\u5b66\u53ef\u80fd\u8fd8\u53d1\u73b0\u4e86\u4e00\u4e2a\u5c0f\u7ec6\u8282\uff1a\u51fd\u6570\u529f\u80fd\u8bf4\u660e\u4e2d\uff0c\u4e24\u5bf9\u5927\u62ec\u53f7\u4e2d\u7684\u5185\u5bb9 {{elements}} \u4f5c\u4e3a\u53d8\u91cf\u8f93\u51fa\u51fa\u6765\u4e86\uff1b \u6ca1\u9519\uff0c\u8fd9\u5c31\u662f\u6211\u4eec\u53c2\u8003Django \u548c jinja2 \u7684\u6a21\u677f\u8bed\u6cd5\u8bbe\u8ba1\u51fa\u7684\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\uff0c\u4f7f\u7528\u65b9\u6cd5\u5f88\u7b80\u5355\uff0c\u7528\u4e24\u5bf9\u5927\u62ec\u53f7\u628a\u51fd\u6570\u7684\u53c2\u6570\u62ec\u8d77\u6765\uff0c\u8fd9\u6837\u5728\u65e5\u5fd7\u8f93\u51fa\u7684\u65f6\u5019\u5c31\u80fd\u628a\u8c03\u7528\u51fd\u6570\u65f6\u53c2\u6570\u7684\u503c\u8f93\u51fa\u51fa\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_7","title":"\u516b\u3001\u73af\u5883\u90e8\u7f72","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_6","title":"1\u3001\u539f\u5219","text":"YouQu \u7684\u73af\u5883\u4f9d\u8d56\u4e00\u76f4\u575a\u6301 2 \u4e2a\u539f\u5219\uff1a \u6700\u5c0f\u73af\u5883\u4f9d\u8d56\u539f\u5219 \u6709\u4e9b\u540c\u5b66\u5199\u4e00\u4e9b\u529f\u80fd\uff0c\u9996\u5148\u60f3\u5230\u7684\u5c31\u662f\u53bb\u641c\u7d22\u5f15\u64ce\u641c\u4e00\u4e0b\uff0c\u770b\u6709\u6ca1\u6709\u73b0\u6210\u7684\u5de5\u5177\u6216\u8005\u4ee3\u7801\u76f4\u63a5\u80fd\u7528\uff0c\u7f8e\u5176\u540d\u66f0\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\uff0c\u522b\u4eba\u5df2\u7ecf\u9020\u597d\u4e86\u8f6e\u5b50\u54b1\u4eec\u5c31\u4e0d\u8981\u91cd\u590d\u53bb\u9020\u4e86\uff0c\u7136\u540e\u4e00\u5207\u4f3c\u4e4e\u90fd\u53d8\u5f97\u90a3\u4e48\u7684\u7406\u6240\u5e94\u5f53\u3002 \u5f53\u7136\u8fd9\u6837\u505a\u65e0\u53ef\u539a\u975e\uff0c\u6211\u76f8\u4fe1\u6709\u8fd9\u6837\u60f3\u6cd5\u5e76\u4e14\u4e00\u76f4\u8df5\u884c\u8fd9\u6837\u505a\u6cd5\u7684\u540c\u5b66\u4e0d\u5728\u5c11\u6570\uff0c\u4f46\u8fd9\u6837\u505a\u6709\u4e00\u4e2a\u5f88\u4e25\u91cd\u7684\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f60\u5199\u4e00\u4e2a\u5927\u578b\u9879\u76ee\u65f6\uff0c\u4f60\u4f1a\u5f15\u5165\u975e\u5e38\u975e\u5e38\u975e\u5e38\u591a\u7684\u4f9d\u8d56\uff0c\u6bd4\u5982\u8981\u505a\u4e2a\u63a5\u53e3\u8bf7\u6c42\u8981\u7528 requests\u3001\u8bfb\u5199\u4e2a\u6570\u636e\u7528 pandas\u3001\u5199\u4e2a\u8868\u683c\u7528 pyopenxl\u3001\u89e3\u6790\u4e2a\u6587\u672c\u8981\u7528\u8fd9\u4e2a\u90a3\u4e2a\u4e09\u65b9\u5e93 ... \u3002 \u6211\u8ba4\u4e3a\u8fd9\u662f\u975e\u5e38\u4e0d\u597d\u7684\u4e60\u60ef\uff0c\u5728\u5b9e\u73b0\u4e00\u4e2a\u529f\u80fd\u7684\u65f6\u5019\uff0c\u9996\u5148\u6211\u4eec\u5e94\u8be5\u53bb\u60f3\u81ea\u5df1\u600e\u4e48\u6837\u53bb\u5b9e\u73b0\uff0c\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff1b \u5982\u679c\u4f60\u4e0d\u4f1a\uff0c\u4f60\u53ef\u4ee5\u53bb\u5b66\u4e60\u4e09\u65b9\u5e93\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u522b\u4eba\u4e09\u65b9\u5e93\u4e5f\u662f\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\u7684\uff0c\u4e3a\u4ec0\u4e48\u54b1\u4eec\u4e0d\u884c\u5462\uff1b\u5982\u679c\u522b\u4eba\u7684\u4f60\u5b9e\u5728\u662f\u770b\u4e0d\u61c2\uff0c\u60f3\u5c3d\u4e00\u5207\u529e\u6cd5\u786e\u5b9e\u505a\u4e0d\u51fa\u6765\uff0c\u90a3\u518d\u8003\u8651\u5f15\u5165\u8fd9\u4e2a\u4e09\u65b9\u5e93\uff0c\u6211\u8ba4\u4e3a\u8fd9\u6837\u662f\u6ca1\u95ee\u9898\u7684\uff0c\u6bd5\u7adf\u54b1\u4eec\u6bb5\u4f4d\u8fd8\u4e0d\u591f\uff0c\u4f46\u5e0c\u671b\u5c06\u6765\u6709\u4e00\u5929\u6211\u4eec\u53ef\u4ee5\u3002 \u8fd9\u6837\u7684\u505a\u6cd5\u624d\u5e94\u8be5\u662f\u201c\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\u201d\u6b63\u786e\u7684\u64cd\u4f5c\u3002\u4e0d\u4f1a\u6ca1\u5173\u7cfb\uff0c\u770b\u770b\u522b\u4eba\u662f\u600e\u4e48\u5b9e\u73b0\u7684\uff0c\u81ea\u5df1\u518d\u6478\u7d22\u7740\u5199\u51fa\u6765\uff0c\u8fd9\u6837\u81ea\u5df1\u624d\u80fd\u6709\u6240\u63d0\u9ad8\uff0c\u4e0d\u7136\u4f60\u5c31\u53ea\u4f1a\u7528\u522b\u4eba\u7684\u4e1c\u897f\uff1b\u90a3\u4e9b\u5632\u7b11\u3001\u6279\u8bc4\u6211\u4eec\u91cd\u590d\u9020\u8f6e\u5b50\u7684\u4eba\uff0c\u5148\u60f3\u60f3\u81ea\u5df1\u4f1a\u9020\u8f6e\u5b50\u5417\u3002 \u672c\u7740\u81ea\u5df1\u5b9e\u73b0\u80fd\u5b9e\u73b0\u7684\u4e00\u5207\u7684\u539f\u5219\uff0cYouQu \u6846\u67b6\u505a\u5230\u4e86\u975e\u5e38\u5c11\u7684\u73af\u5883\u4f9d\u8d56\uff0c\u800c\u4e14\u6211\u4eec\u4ecd\u5728\u4e0d\u65ad\u52aa\u529b\uff0c\u51cf\u5c11\u73af\u5883\u90e8\u7f72\u7684\u4f9d\u8d56\u3002 \u6700\u5c0f\u4ed3\u5e93\u4f53\u79ef\u539f\u5219 \u5927\u6587\u4ef6\u4e0d\u80fd\u4e0a\u4f20\u5230\u5de5\u7a0b\u91cc\u9762\uff0c\u4fdd\u6301\u6574\u4e2a\u5de5\u7a0b\u7684\u8f7b\u91cf\u5316\uff0c\u8fd9\u6837\u5728\u514b\u9686\u4ee3\u7801\u7684\u65f6\u5019\u624d\u80fd\u975e\u5e38\u5feb\u901f\u65b9\u4fbf\u4f7f\u7528\uff0c\u6211\u4eec\u89c1\u8fc7\u4e00\u4e2a AT \u5de5\u7a0b clone \u5927\u5c0f\u8fbe\u5230\u597d\u51e0\u4e2a G\uff0c\u7b80\u76f4\u4e0d\u53ef\u601d\u8bae\u3002 \u5176\u5b9e\u4ee3\u7801\u6587\u4ef6\u7684\u5927\u5c0f\u662f\u5f88\u5c0f\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u7eaf\u5199\u4ee3\u7801\u968f\u4fbf\u5199\u5de5\u7a0b\u4e5f\u4e0d\u4f1a\u592a\u5927\uff0c\u800c\u6587\u6863\uff08\u5305\u542b\u63d2\u56fe\uff09\u7b49\u8d44\u6e90\u5374\u662f\u5f88\u5360\u7a7a\u95f4\u3002 \u56e0\u6b64\u6211\u4eec\u9009\u62e9\u5c06 YouQu \u7684\u6587\u6863\u5de5\u7a0b\u6d89\u53ca\u5230\u7684\u56fe\u7247\u8d44\u6e90\u90fd\u91c7\u7528\u5916\u94fe\u52a0\u8f7d\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_6","title":"2\u3001\u5b89\u88c5","text":"\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u8fd0\u884c env.sh \u5373\u53ef\u3002 bash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_4","title":"3\u3001\u5b9a\u5236\u4f9d\u8d56","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_2","title":"3.1\u3001\u65b0\u589e\u4f9d\u8d56","text":"\u5982\u679c\u5e94\u7528\u5e93\u8fd8\u9700\u8981\u5176\u4ed6 Python \u4f9d\u8d56\u5e93\uff0c\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a requirement.txt \u6587\u4ef6\uff1b autotest_xxx\n\u251c\u2500\u2500 requirement.txt\n\u251c\u2500\u2500 case ...\n \u91cc\u9762\u5199\u5165\u9700\u8981\u5b89\u88c5\u7684\u4e09\u65b9\u4f9d\u8d56\uff0c\u6bd4\u5982\u50cf\u8fd9\u6837\uff1a # requirement.txt\nPyYAML==6.0 # \u6307\u5b9a\u5b89\u88c5\u67d0\u4e2a\u7248\u672c\nrequests # \u672a\u6307\u5b9a\u7248\u672c\u5219\u5b89\u88c5\u6700\u65b0\u7248\n \u5728\u6267\u884c bash env.sh \u65f6\u4f1a\u4e00\u5e76\u5c06\u5176\u5b89\u88c5\u3002 \u5982\u679c\u591a\u4e2a\u5e94\u7528\u5e93\u90fd\u5b58\u5728 requirement.txt \u6587\u4ef6\uff0c\u6267\u884c env.sh \u65f6\u4f1a\u5c06\u591a\u4e2a requirement.txt \u6587\u4ef6\u4e00\u5e76\u52a0\u8f7d\uff1b\u90a3\u4e48\u4e00\u5b9a\u8981\u6ce8\u610f\u591a\u4e2a requirement.txt \u6587\u4ef6\u53ef\u80fd\u5b58\u5728\u76f8\u540c\u7684\u4f9d\u8d56\u88ab\u6307\u5b9a\u5b89\u88c5\u4e0d\u540c\u7248\u672c\u7b49\u7b49\u517c\u5bb9\u6027\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32_1","title":"3.2\u3001\u88c1\u526a\u4f9d\u8d56","text":"\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0c\u53ef\u80fd\u4f60\u53ea\u9700\u8981\u5b89\u88c5\u4e00\u4e9b\u6700\u6700\u57fa\u7840\u7684\u4f9d\u8d56\uff0c\u5176\u4ed6\u7684\u90fd\u4e0d\u9700\u8981\uff0c\u6bd4\u5982\u7eaf\u63a5\u53e3\u81ea\u52a8\u5316\u7684\u9879\u76ee\uff0c\u5b83\u4e0d\u9700\u8981 UI \u81ea\u52a8\u5316\u76f8\u5173\u7684\u4f9d\u8d56\u3002 \u4f60\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\uff0c\u5b58\u653e\u4e00\u4e2a BASICENV \u7684\u666e\u901a\u6587\u4ef6\uff0c\u91cc\u9762\u4e0d\u9700\u8981\u5199\u4efb\u4f55\u5185\u5bb9\uff0c\u8fd9\u6837\u6267\u884c env.sh \u65f6\uff0c\u53ea\u4f1a\u5b89\u88c5\u6700\u57fa\u7840\u7684\u4f9d\u8d56\u3002 autotest_xxx\n\u251c\u2500\u2500 BASICENV # \u53ef\u4ee5\u4f7f\u7528\uff1atouch BASICENV \u521b\u5efa\u6587\u4ef6\n\u251c\u2500\u2500 case ...\n \u57fa\u7840\u4f9d\u8d56\u4ec5\u5b89\u88c5\u4ee5\u4e0b\u51e0\u4e2a\u5305\uff1a pytest # pytest\npytest-rerunfailures # \u5931\u8d25\u91cd\u8dd1\u63d2\u4ef6\npytest-timeout # \u7528\u4f8b\u8d85\u65f6\u63d2\u4ef6\nallure-pytest # \u751f\u6210 allure \u62a5\u544a\u63d2\u4ef6\nallure.deb # allure \u62a5\u544a\u67e5\u770b\u5de5\u5177\n \u88c1\u526a\u4f9d\u8d56 \u548c \u65b0\u589e\u4f9d\u8d56 \u662f\u4e0d\u51b2\u7a81\u7684\uff0c\u53ef\u4ee5\u540c\u65f6\u4f7f\u7528\u3002 \u6b64\u65b9\u6848\u9ed8\u8ba4\u4e3a\u865a\u62df\u73af\u5883\u90e8\u7f72\uff0c\u5982\u679c\u4f60\u60f3\u76f4\u63a5\u90e8\u7f72\u5728\u672c\u673a\u4e0a\uff1a bash env_dev.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_4","title":"4\u3001\u865a\u62df\u5316\u90e8\u7f72","text":"YouQu\u9ed8\u8ba4\u91c7\u7528\u865a\u62df\u5316\u90e8\u5206\uff0c\u865a\u62df\u5316\u73af\u5883\u5b9e\u9645\u5b89\u88c5\u7684\u4f4d\u7f6e\u662f\u5728 $HOME/.local/share/virtualenvs/youqu-oHTM7l7G \u76ee\u5f55\u4e0b youqu-oHTM7l7G \u6b64\u76ee\u5f55\u540d\u79f0\u524d\u9762\u90e8\u5206\u662f\u4f60\u7684\u4ee3\u7801\u6839\u76ee\u5f55\u7684\u540d\u79f0\uff0c\u540e\u9762\u90e8\u5206\u662f\u751f\u6210\u7684\u968f\u673a\u5b57\u7b26\u4e32\uff1b \u540c\u5b66\u4eec\u5728\u8fdc\u7a0b\u673a\u5668\u4e0a\u5b9a\u4f4d\u95ee\u9898\u7684\u65f6\u5019\uff0c\u5982\u679c\u4f7f\u7528 Pycharm \u8c03\u8bd5\uff0c\u5c31\u5c06\u89e3\u91ca\u5668\u6307\u5b9a\u5230\u8fd9\u4e2a\u76ee\u5f55\u7684\u5c31\u884c\u4e86\uff1b \u5f53\u7136\uff0c\u6211\u4eec\u4e5f\u63d0\u4f9b\u4e86\u672c\u673a\u5f00\u53d1\u73af\u5883\u90e8\u7f72\uff1a bash env_dev.sh\n \u5982\u679c\u4f60\u662f\u672c\u5730\u5f00\u53d1\u73af\u5883\u53ef\u4ee5\u7528\u5b83\uff0c\u533a\u522b\u5c31\u662f\u9a71\u52a8\u6267\u884c\u7684\u65f6\u5019\u4f7f\u7528\uff1apython3 manage.py xxx"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_8","title":"\u4e5d\u3001\u5931\u8d25\u5f55\u5c4f","text":"\u5f55\u5c4f\u5176\u5b9e\u662f\u4e00\u79cd\u89c6\u9891\u5f62\u5f0f\u7684\u65e5\u5fd7\uff0c\u56e0\u4e3a\u5f88\u591a\u65f6\u5019\u6211\u4eec\u5728\u67e5\u770b\u65e5\u5fd7\u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u51c6\u786e\u7684\u5b9a\u4f4d\u5230\u7528\u4f8b\u5931\u8d25\u7684\u5177\u4f53\u539f\u56e0\uff0c\u56e0\u6b64\u7528\u4f8b\u7684\u5f55\u5c4f\u80fd\u8ba9\u6211\u4eec\u770b\u5230\u7528\u4f8b\u5728\u6267\u884c\u8fc7\u7a0b\uff1b \u3010\u4f7f\u7528\u65b9\u6cd5\u3011 \u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u5173\u6ce8 2 \u4e2a\u53c2\u6570\uff1b ;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\u3002\n;\u6ce8\u610f\uff0c\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u4e0d\u80fd\u5c0f\u4e8e\u5931\u8d25\u5f55\u5c4f\u6b21\u6570\uff0c\u5373 RERUN >= RECORD_FAILED_CASE\nRECORD_FAILED_CASE = 1\n \u9ed8\u8ba4\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u662f 1 \u6b21\uff1b RECORD_FAILED_CASE = 1 \u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff1b RECORD_FAILED_CASE = 0 \u8868\u793a\u4e0d\u7ba1\u7528\u4f8b\u6210\u529f\u6216\u5931\u8d25\u90fd\u5f55\u5c4f\uff1b \u5f55\u5c4f\u662f\u8981\u5360\u7528\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u7279\u522b\u662f\u5728\u4e00\u4e9b\u914d\u7f6e\u8f83\u4f4e\u7684\u673a\u5668\u4e0a\u4f1a\u5f88\u660e\u663e\uff0c\u6240\u4ee5\u4f60\u9700\u8981\u8003\u8651\u662f\u5426\u6709\u5fc5\u8981\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1b \u4f7f\u7528 manage.py \u6267\u884c\u7528\u4f8b\u9ed8\u8ba4\u8bfb\u53d6\u5230 globalconfig.ini \u91cc\u9762\u7684\u53c2\u6570\uff0c\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report/record \u76ee\u5f55\u4e0b\u4fdd\u5b58\u5931\u8d25\u7528\u4f8b\u7684\u5f55\u5c4f\u548c\u65ad\u8a00\u7684\u90a3\u4e2a\u65f6\u95f4\u70b9\u7684\u622a\u5c4f\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7\u89c6\u9891\u6587\u4ef6\u770b\u5230\u5931\u8d25\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u90fd\u53d1\u751f\u4e86\u4ec0\u4e48\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#wayland","title":"\u5341\u3001Wayland \u9002\u914d","text":"Wayland \u4e0b\u81ea\u52a8\u5316\u4e3b\u8981\u95ee\u9898\u662f X11 \u4e0b\u7684\u952e\u9f20\u64cd\u4f5c\u65b9\u6cd5\u65e0\u6cd5\u4f7f\u7528\uff0c\u6bd4\u5982 Xdotool\u3001 PyAutoGUI\u3001Xwininfo \u7b49\u7b49\uff1b YouQu \u5728 Wayland \u4e0b\u517c\u5bb9\u9002\u914d\uff0cenv.sh \u5728 Wayland \u4e0b\u6267\u884c\u65f6\u4f1a\u5b89\u88c5\u81ea\u7814\u7684\u952e\u9f20\u64cd\u4f5c\u670d\u52a1\uff08\u53ef\u80fd\u5b58\u5728\u4e00\u4e9b\u4f9d\u8d56\u62a5\u9519\uff0c\u6309\u7167\u6ce8\u91ca\u89e3\u51b3\u5373\u53ef\uff09\uff0c\u6846\u67b6\u6838\u5fc3\u5e93\u4e5f\u9488\u5bf9\u6027\u7684\u505a\u4e86\u9002\u914d\uff0c\u4e0a\u5c42\u7528\u4f8b\u5b8c\u5168\u4e0d\u7528\u5173\u5fc3\u673a\u5668\u662fWayland \u8fd8\u662f X11\uff0c\u6846\u67b6\u4f1a\u6839\u636e\u6267\u884c\u65f6\u72b6\u6001\u81ea\u52a8\u5224\u65ad\u8d70\u4e0d\u540c\u7684\u903b\u8f91\uff1b \u7b80\u5355\u8bb2\u5c31\u662f\uff0c\u5e94\u7528\u5e93\u53ea\u9700\u8981\u7ef4\u62a4\u4e00\u5957\u7528\u4f8b\u811a\u672c\u5373\u53ef\u3002 \u3010\u7528\u4f8b\u517c\u5bb9\u3011 \u56e0\u4e3a Wayland \u4e0b\u6709\u4e9b\u5e94\u7528\u7684\u754c\u9762\u663e\u793a\u548c\u529f\u80fd\u672c\u8eab\u5b58\u5728\u4e00\u4e9b\u5dee\u5f02\uff0c\u7528\u4f8b\u5c42\u53ef\u80fd\u9700\u8981\u5bf9\u8fd9\u90e8\u5206\u7528\u4f8b\u505a\u903b\u8f91\u5224\u65ad\uff0c\u4f7f\u7528\u5168\u5c40\u914d\u7f6e\u91cc\u9762\u7684\u5e38\u91cf\u8fdb\u884c\u903b\u8f91\u7f16\u5199\u5373\u53ef\uff1a from setting.globalconfig import GlobalConfig\n# GlobalConfig.IS_WAYLAND \u83b7\u53d6\u5230\u5f53\u524d\u7684\u663e\u793a\u670d\u52a1\u5668\uff08bool\uff09\n# \u5e94\u7528\u5e93 Config \u7ee7\u627f GlobalConfig\nif Config.IS_WAYLAND:\npass\nif Config.IS_X11:\npass\n \u6bd4\u5982\u7528\u4f8b\u91cc\u9762\u5982\u679c\u65ad\u8a00\u7684\u56fe\u7247\u4e0d\u540c\uff1a if Config.IS_WAYLAND:\nself.assert_image_exist(\"wayland_XXX\")\nelse:\nself.assert_image_exist(\"x11_XXX\")\n \u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u811a\u672c\u5728 Wayland \u548c X11 \u4e0b\u90fd\u53ef\u4ee5\u8dd1\uff0cso easy \u662f\u4e0d\u662f\uff1f\u5b8c\u5168\u6ca1\u5fc5\u8981\u4e13\u95e8\u62c9\u65b0\u5206\u652f\u8fdb\u884c Wayland \u9002\u914d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_9","title":"\u5341\u4e00\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_7","title":"1. \u76ee\u5f55\u7ed3\u6784","text":"\u6267\u884c\u65f6\u4f1a\u5728\u6839\u76ee\u5f55\u4e0b\u52a8\u6001\u751f\u6210 report \u76ee\u5f55\uff0c\u6240\u6709\u7684\u62a5\u544a\u76f8\u5173\u7684\u6587\u4ef6\u4f1a\u7edf\u4e00\u5b58\u653e\u5728\u91cc\u9762\uff0c\u793a\u4f8b\uff1a /report\n \u251c\u2500\u2500 allure # allure\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json\n \u251c\u2500\u2500 allure_html # \u751f\u6210\u7684html\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 index.html \u251c\u2500\u2500 allure_back # allure\u62a5\u544a\u5907\u4efd\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 20221108114823\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json\n \u251c\u2500\u2500 json # json\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 result_deepin-music_20221109134736_1081333.json\n \u251c\u2500\u2500 logs # \u65e5\u5fd7\u6587\u4ef6\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 2022-11-10_debug.log \u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-10_error.log\n \u251c\u2500\u2500 record # \u5f55\u5c4f\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-09\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 15\u65f614\u520609\u79d2_test_music_303_2_autotest.mp4\n \u2514\u2500\u2500 xml # xml\u62a5\u544a\n\u2514\u2500\u2500 autotest_deepin_music-20221109134736.xml\n \u9ed8\u8ba4\u60c5\u51b5\u4e0b\u540c\u65f6\u751f\u6210 html\u3001xml\u3001json\u4e09\u79cd\u5f62\u5f0f\u7684\u62a5\u544a\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_7","title":"2. \u5b9a\u5236\u62a5\u544a","text":"\u6211\u4eec\u5bf9 allure \u62a5\u544a\u8fdb\u884c\u4e86\u4e00\u7cfb\u5217\u7684\u5b9a\u5236\uff1a \u5b9a\u5236 logo\u3001title\u3001\u62a5\u544a\u9ed8\u8ba4\u8bed\u8a00\u4e3a\u4e2d\u6587\uff1b \u52a0\u5165\u4e86\u7528\u4f8b\u65ad\u8a00\u5931\u8d25\u65f6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u4ee5\u53ca\u6b64\u65f6\u56fe\u50cf\u5bf9\u6bd4\u7684\u6a21\u677f\u56fe\u7247\uff1b \u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\uff0c\u4f60\u53ef\u4ee5\u5728 html \u62a5\u544a\u4e2d\u76f4\u63a5\u770b\u5f55\u5236\u7684\u89c6\u9891\uff1b \u52a0\u5165\u4e86 IP \u5730\u5740\u3001\u7cfb\u7edf\u4fe1\u606f\u3001\u955c\u50cf\u7248\u672c\u7b49\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_5","title":"3. \u67e5\u770b\u62a5\u544a","text":" \u672c\u5730\u6267\u884c \u5728 report/allure \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u4e00\u5806\u6587\u672c\u6587\u4ef6\uff0c\u8fd9\u4e9b\u662f allure \u63d2\u4ef6\u751f\u6210\u7684\u62a5\u544a\u6e90\u6570\u636e\uff0c\u6211\u4eec\u5728 report/allure_html \u76ee\u5f55\u4e0b\u7ed9\u4f60\u751f\u6210\u4e86 html \u6587\u4ef6\uff0c\u4f46\u662f\u4f60\u4e0d\u80fd\u76f4\u63a5\u901a\u8fc7\u6d4f\u89c8\u5668\u6253\u5f00 index.html \u6587\u4ef6\uff0c\u56e0\u4e3a allure \u7684\u62a5\u544a\u90fd\u662f\u57fa\u4e8e\u5728\u7ebf\u7684\u670d\u52a1\uff0c\u4f60\u5e94\u8be5\u8fd9\u6837\u6253\u5f00\uff1a allure open report/allure_html\n \u4f7f\u7528 manage.py \u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u5728\u7ec8\u7aef\u7684\u6700\u540e\u4e00\u884c\uff0c\u6211\u4eec\u4f1a\u7ed9\u4f60\u8f93\u51fa\u6253\u5f00\u62a5\u544a\u7684\u547d\u4ee4\uff0c\u76f4\u63a5\u590d\u5236\u5b83\u5728\u7ec8\u7aef\u6267\u884c\u5c31\u53ef\u4ee5\u67e5\u770b\u4e86\uff0c\u50cf\u8fd9\u6837\uff1a \u7ec8\u7aef\u6267\u884c\u547d\u4ee4: allure open /tmp/youqu/report/allure_html \u67e5\u770b\u62a5\u544a \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 Pycharm \u91cc\u9762\u627e\u5230 index.html \u6587\u4ef6\uff0c\u7136\u540e\u53f3\u952e\u9009\u62e9\u6d4f\u89c8\u5668\u6253\u5f00\uff0c\u6216\u8005\u4f60\u53ef\u4ee5\u7528\u4e00\u4e2a http \u670d\u52a1\u6253\u5f00\u3002 \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 report/allure \u76ee\u5f55\u4e0b\u67e5\u770b\u62a5\u544a\uff1a allure serve report/allure\n \u8fdc\u7a0b\u6267\u884c \u8fdc\u7a0b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\uff0c\u4f1a\u5c06\u6240\u6709\u8fdc\u7a0b\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u62a5\u544a\u90fd\u6536\u96c6\u5230 report/allure \u76ee\u5f55\u4e0b\uff0c\u5206\u522b\u6309\u7167\u673a\u5668\u7684 IP \u7b49\u5efa\u4e86\u4e0d\u540c\u7684\u76ee\u5f55\uff0c\u4f60\u53ef\u4ee5\u5728\u8fd9\u4e9b\u76ee\u5f55\u91cc\u9762\u53bb\u67e5\u770b\u5bf9\u5e94\u7684\u6d4b\u8bd5\u62a5\u544a\uff0c\u67e5\u770b\u65b9\u6cd5\u548c\u524d\u9762\u672c\u5730\u6267\u884c\u67e5\u770b\u7684\u65b9\u6cd5\u4e00\u6837\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_10","title":"\u5341\u4e8c\u3001\u9759\u6001\u4ee3\u7801\u626b\u63cf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_8","title":"1. \u63d0\u524d\u89e3\u51b3\u4ee3\u7801\u95ee\u9898","text":"\u4e3a\u4e86\u5e2e\u52a9\u5f00\u53d1\u8005\u7edf\u4e00\u4ee3\u7801\u98ce\u683c\uff0cPython \u793e\u533a\u63d0\u51fa\u4e86 PEP8 \u4ee3\u7801\u7f16\u7801\u98ce\u683c\uff0cPython \u5b98\u65b9\u540c\u65f6\u63a8\u51fa\u4e86\u4e00\u4e2a\u68c0\u67e5\u4ee3\u7801\u98ce\u683c\u662f\u5426\u7b26\u5408 PEP8 \u7684\u5de5\u5177\uff0c\u540d\u5b57\u4e5f\u53eb PEP8\u3002 \u4f46\u662f\uff0cPycharm \u91cc\u9762\u7684 PEP8 \u63d2\u4ef6\u5b9e\u9645\u4e0a\u5e76\u4e0d\u80fd\u53d1\u73b0\u5f88\u591a\u4ee3\u7801\u95ee\u9898\uff0c\u8fd9\u4e9b\u95ee\u9898\u5e76\u4e0d\u4f1a\u5728\u8fd0\u884c\u65f6\u62a5\u9519\uff0c\u56e0\u4e3a\u4ece Python \u8bed\u8a00\u89d2\u5ea6\u5e76\u4e0d\u5173\u5fc3\u8fd9\u4e9b\u95ee\u9898\uff0c\u5728 Pycharm \u7f16\u8f91\u5668\u91cc\u9762\u4f7f\u7528\u5feb\u6377\u952e ctrl + alt + L\uff0c\u6709\u4e00\u70b9\u70b9\u683c\u5f0f\u5316\u7684\u6548\u679c\uff0c\u80fd\u89e3\u51b3\u4e00\u4e9b\u7a7a\u683c\u3001\u6362\u884c\u7b49\u5c0f\u95ee\u9898\u3002 \u8fd9\u91cc\u63a8\u8350\u4e00\u4e2a Python \u793e\u533a\u6d41\u884c\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff1a Black\uff0c\u53f7\u79f0\u4e0d\u59a5\u534f\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff0c\u5b83\u68c0\u6d4b\u5230\u4e0d\u7b26\u5408\u89c4\u8303\u7684\u4ee3\u7801\u98ce\u683c\u76f4\u63a5\u5c31\u5e2e\u4f60\u5168\u90e8\u683c\u5f0f\u5316\u597d\uff0c\u5c31\u662f\u8fd9\u4e48\u521a\uff01 \u5b89\u88c5\uff1a sudo pip3 install black \n \u4f7f\u7528\u65b9\u6cd5\uff1a black ${CheckPath}\n \u4f7f\u7528\u8fd9\u4e2a\u5de5\u5177\u683c\u5f0f\u5316\u4e4b\u540e\uff0c\u4ee3\u7801\u4f1a\u88ab\u81ea\u52a8\u8c03\u6574\uff0c\u521a\u5f00\u59cb\u4f60\u53ef\u80fd\u4f1a\u89c9\u5f97\u8c03\u6574\u5f97\u5f88\u5938\u5f20\uff0c\u6ca1\u5173\u7cfb\u575a\u6301\u770b\uff0c\u4e60\u60ef\u4e4b\u540e\uff0c\u4f60\u4f1a\u89c9\u5f97\u5f88\u4f18\u96c5\uff0c\u6ca1\u9519\uff0c\u8fd9\u5c31\u662f Pythonic Code \u7684\u6838\u5fc3\uff0c\u8bf7\u4fdd\u6301\u4f18\u96c5\uff5e\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_8","title":"2. \u4ee3\u7801\u626b\u63cf\u5de5\u5177","text":"\u4f7f\u7528\u6839\u76ee\u5f55\u4e0b pylint.sh \u626b\u63cf\u4ee3\u7801\uff0c\u5728 report \u76ee\u5f55\u4e0b\u67e5\u770b\u4ee3\u7801\u626b\u63cf\u62a5\u544a\uff0c\u5982\u679c\u6709\u4ee3\u7801\u95ee\u9898\u8bf7\u63d0\u524d\u89e3\u51b3\u4e4b\u540e\u518d\u63d0\u4ea4\u3002 \u6b64\u811a\u672c\u5df2\u7ecf\u4f7f\u7528 Python \u793e\u533a\u6700\u6d41\u884c\u7684\u4ee3\u7801\u626b\u63cf\u5de5\u5177 Pylint \u8fdb\u884c\u4ee3\u7801\u626b\u63cf\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a bash pylint.sh\n \u8fd0\u884c\u4e4b\u540e\u4f1a\u63d0\u793a\u4f60\u8981\u626b\u63cf\u7684\u76ee\u5f55\uff0c\u6bd4\u5982\u8f93\u5165 apps \uff0c\u5219\u4f1a\u626b\u63cf apps \u4e0b\u7684\u6240\u6709 Python \u4ee3\u7801\u3002 \u5728 setting/pylintrc.cfg \u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u76f8\u5173\u914d\u7f6e\uff0c\u626b\u63cf\u5b8c\u6210\u4e4b\u540e\u5728 report/pylints \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u626b\u63cf\u62a5\u544a\u3002 \u4ee3\u7801\u63d0\u4ea4\u9700\u901a\u8fc7 git review \u63d0\u4ea4\u5230 gerrit \uff0c\u4eba\u5de5 Code Review \u901a\u8fc7\u4e4b\u540e\u5408\u5165\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_11","title":"\u5341\u4e09\u3001\u63d0\u4ea4\u4ee3\u7801","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_9","title":"1. \u5b89\u88c5\u4f9d\u8d56","text":"sudo apt install git-review\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_9","title":"2. \u63d0\u4ea4\u6a21\u677f","text":"\u5728 ~ \u76ee\u5f55\u4e0b\u65b0\u5efa\u6587\u4ef6\uff0c\u5e76\u547d\u540d\u4e3a gitcommit_template \u5c06\u4ee5\u4e0b\u5185\u5bb9\u5199\u5165\u6587\u4ef6\u5f53\u4e2d\uff1a # commit type :fix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style(\u98ce\u683c\u4fee\u6539)\u3001refactor(\u91cd\u6784)\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test(\u6d4b\u8bd5) + \u7b80\u5355\u63cf\u8ff0. \u9ed8\u8ba4fix,\u6839\u636e\u60c5\u51b5\u4fee\u6539\nfix: \n\n# \u8be6\u7ec6\u8bf4\u660e\u4ee3\u7801\u7684\u6539\u52a8\uff0c\u5305\u542b\u4ee3\u7801\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u4ee5\u53ca\u4e3a\u4ec0\u4e48\u8fd9\u4e48\u505a\uff0c\u53ef\u80fd\u4f1a\u5f71\u54cd\u54ea\u4e9b\u529f\u80fd\u3002\u5bf9\u4e8e\u4ee3\u7801\u7684\u5ba1\u6838\u8005\uff0c\u9700\u8981\u4ece\u8fd9\u6bb5\u63cf\u8ff0\u4e2d\u80fd\u5b8c\u5168\u7406\u89e3\u4ee3\u7801\u4e2d\u6240\u6709\u6539\u52a8\u7684\u5185\u5bb9\nDescription: \n\n# \u5199\u4e00\u6bb5\u9762\u5411\u4e8e\u4ea7\u54c1\u7684\u603b\u7ed3\u6027\u5185\u5bb9\uff0c\u7528\u4e8e\u81ea\u52a8\u751f\u6210crp\u4e0a\u7684changlog\uff0c\u9700\u8981\u6ce8\u610f\u7684\u4e8b\uff0c\u8fd9\u6bb5\u63cf\u8ff0\u5fc5\u987b\u4ece\u4ea7\u54c1\u7684\u89d2\u5ea6\u8003\u8651\u3002\nLog: \n\n# \u5173\u8054pms\u4e0a\u7684bug\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94bug\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4fee\u590dbug\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Bug: \n\n# \u4fee\u590d github issue \n#Issue: \n\n# \u5173\u8054pms\u4e0a\u7684\u4efb\u52a1\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94\u4efb\u52a1\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4efb\u52a1\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Task: \n \u547d\u4ee4\u884c\u6267\u884c: git config --global commit.template ~/gitcommit_template\n \u6b64\u547d\u4ee4\u5c06\u6a21\u677f\u52a0\u5165\u5230 git \u7684\u63d0\u4ea4\u6a21\u677f\u4e2d\u3002 \u540e\u7eed\u63d0\u4ea4\u7684\u65f6\u5019\u9700\u8981\u5173\u6ce8\u4e00\u4e0b\u51e0\u70b9\uff1a commit type \u5bf9\u5e94\u4e0d\u540c\u7684\u4fee\u6539\u7c7b\u578b\uff1afix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style \uff08\u98ce\u683c\u4fee\u6539\uff09\u3001refactor \uff08\u91cd\u6784\uff09\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test \uff08\u6d4b\u8bd5\uff09 commit type \u5192\u53f7\u540e\u9762\u52a0\u7a7a\u683c\u3002 Description \u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u9700\u8981\u8fdb\u884c\u8be6\u7ec6\u8bf4\u660e\uff0c\u6bd4\u5982\u5bf9\u529f\u80fd\u8fdb\u884c\u5927\u6539\u7b49\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_6","title":"3. \u63a8\u9001\u4ee3\u7801","text":"\u9996\u5148\u6dfb\u52a0 commit \u4fe1\u606f git add \u540e\u9762\u52a0\u6587\u4ef6\u540d\u79f0\n git add . # \u8868\u793a\u6dfb\u52a0\u6240\u6709\u6587\u4ef6\n \u4f7f\u7528\u8fd9\u6761\u547d\u4ee4\u6ce8\u610f\u6709\u4e9b\u4e34\u65f6\u6587\u4ef6\u4e0d\u8981\u63d0\u4ea4\u5230\u4ed3\u5e93\u4e86\u3002 git commit -a\n \u4e4b\u540e\u5728 fix: \u540e\u9762\uff08\u6ce8\u610f\u5192\u53f7\u540e\u9762\u5fc5\u987b\u52a0\u7a7a\u683c\uff0c\u4e0d\u7136\u76f4\u63a5-1\uff09\u5199\u672c\u5730\u63d0\u4ea4\u7684 commit \u4fe1\u606f\uff0c\u7136\u540e\u5c31\u53ef\u4ee5\u63d0\u4ea4\u4ee3\u7801\u4e86 git review branch(\u5f53\u524d\u5206\u652f) -r origin\n \u6700\u597d\u4e00\u6b21 commit\uff0c\u4e00\u6b21 git review \uff0c\u7ecf\u5e38\u6709\u540c\u5b66\u5728\u672c\u5730\u75af\u72c2 commit \u6700\u540e git review \u62a5\u9519\u4e0d\u77e5\u9053\u548b\u56de\u4e8b\u513f\u3002 \u82e5\u4e0d\u60f3\u6bcf\u6b21\u63d0\u4ea4\u90fd\u52a0\u4e0a -r \u9009\u9879\uff0c\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a git config --global gitreview.remote origin \u63d0\u4ea4\u4ee3\u7801\uff0c\u76f4\u63a5\u4f7f\u7528 git review branch<\u76ee\u6807\u5206\u652f>\uff0c\u4f8b\u5982 git review master"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git","title":"4. Git\u6807\u7b7e","text":"Git \u6807\u7b7e\u5b9e\u9645\u4e0a\u662f commit \u7684\u4e00\u4e2a\u522b\u540d\uff0c\u4e3b\u8981\u7528\u4e8e\u7ba1\u7406\u5386\u53f2\u7248\u672c\u3002 \u60f3\u8c61\u4e00\u4e0b\u9886\u5bfc\u8ba9\u4f60\u628a\u4e4b\u524d\u7684\u67d0\u4e2a\u7248\u672c\u7684\u4ee3\u7801\u62c9\u51fa\u6765\u8dd1\uff0c\u4f60\u662f\u4e0d\u662f\u4e56\u4e56\u7684\u53bb\u628a\u6240\u6709\u63d0\u4ea4\u8bb0\u5f55\u62c9\u51fa\u6765\u627e\uff0c\u7136\u540e\u627e\u5230\u90a3\u4e2a\u54c8\u5e0c\u503c\uff0c\u901a\u8fc7\u54c8\u5e0c\u503c\u6765\u68c0\u51fa\u4ee3\u7801\u3002 \u8fd9\u4e00\u5957\u64cd\u4f5c\u4e0b\u6765\u662f\u4e0d\u662f\u5f88\u9ebb\u70e6\uff0c\u8d39\u65f6\u95f4\u8fd8\u4e0d\u4e00\u5b9a\u80fd\u627e\u5f97\u5230\uff0c\u6ca1\u4eba\u80fd\u8bb0\u4f4f\u6bcf\u4e2a\u63d0\u4ea4\u54c8\u5e0c\u503c\u4ee5\u53ca\u8fd9\u6b21\u63d0\u4ea4\u90fd\u6539\u4e86\u54ea\u4e9b\u4ee3\u7801\u3002 \u56e0\u6b64\u7ed9\u63d0\u4ea4\u6253\u4e2a\u6807\u7b7e\uff0c\u5c31\u662f\u628a\u54c8\u5e0c\u503c\u8f6c\u6362\u6210\u4eba\u7c7b\u80fd\u7406\u89e3\u7684\u8bed\u8a00\uff0c\u6bd4\u5982 v1.0\uff0c\u5c31\u53ef\u4ee5\u76f4\u63a5\u901a\u8fc7\u6807\u7b7e\u627e\u5230\u5bf9\u5e94\u7684\u63d0\u4ea4\u3002 \u65b0\u5efa\u6807\u7b7e git tag -a <tagname>\n \u56de\u8f66\u4e4b\u540e\uff0cGit \u4f1a\u6253\u5f00\u4f60\u7684\u7f16\u8f91\u5668\uff0c\u8ba9\u4f60\u5199\u4e00\u53e5\u6807\u7b7e\u6ce8\u89e3\uff0c\u5c31\u50cf\u4f60\u7ed9\u63d0\u4ea4\u5199\u6ce8\u89e3\u4e00\u6837\u3002 \u67e5\u770b\u6240\u6709\u6807\u7b7e git tag -l\n# git tag \u4e5f\u884c\n \u5220\u9664\u6807\u7b7e git tag -d <tagname>\n \u63a8\u9001\u6807\u7b7e\u81f3\u8fdc\u7a0b git push \u547d\u4ee4\u5e76\u4e0d\u4f1a\u4f20\u9001\u6807\u7b7e\u5230\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\uff0c\u5fc5\u987b\u663e\u5f0f\u5730\u63a8\u9001\u6807\u7b7e\u3002 git push origin <tagname>\n \u63a8\u9001\u6240\u6709\u4e0d\u5728\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\u7684\u6807\u7b7e git push origin --tag\n \u5220\u9664\u8fdc\u7a0b\u6807\u7b7e git push origin :refs/tag/<tagname>\n \u540e\u671f\u6253\u6807\u7b7e \u5148\u7528 git log --pretty=oneline \u67e5\u8be2\u63d0\u4ea4\u8bb0\u5f55\uff0c\u83b7\u53d6\u6821\u9a8c\u7801\u3002 git tag -a <tagname> 9fceb02(\u6821\u9a8c\u7801)\n \u68c0\u51fa\u6807\u7b7e git checkout <tagname>\n \u6b64\u65f6\uff0c\u4ed3\u5e93\u4f1a\u5904\u4e8e\u201c\u5206\u79bb\u5934\u6307\u9488\uff08detached HEAD\uff09\u201d\u7684\u72b6\u6001\u3002 \u5728\u201c\u5206\u79bb\u5934\u6307\u9488\u201d\u72b6\u6001\u4e0b\uff0c\u5982\u679c\u4f60\u505a\u4e86\u67d0\u4e9b\u66f4\u6539\u7136\u540e\u63d0\u4ea4\u5b83\u4eec\uff0c\u6807\u7b7e\u4e0d\u4f1a\u53d1\u751f\u53d8\u5316\uff0c \u4f46\u4f60\u7684\u65b0\u63d0\u4ea4\u5c06\u4e0d\u5c5e\u4e8e\u4efb\u4f55\u5206\u652f\uff0c\u5e76\u4e14\u5c06\u65e0\u6cd5\u8bbf\u95ee\uff0c\u9664\u975e\u901a\u8fc7\u786e\u5207\u7684\u63d0\u4ea4\u54c8\u5e0c\u624d\u80fd\u8bbf\u95ee\u3002 \u56e0\u6b64\uff0c\u5982\u679c\u4f60\u9700\u8981\u8fdb\u884c\u66f4\u6539\uff0c\u6bd4\u5982\u4f60\u8981\u4fee\u590d\u65e7\u7248\u672c\u4e2d\u7684\u9519\u8bef\uff0c\u90a3\u4e48\u901a\u5e38\u9700\u8981\u521b\u5efa\u4e00\u4e2a\u65b0\u5206\u652f\uff1a git checkout -b <NewBranchName> <tagname>\n \u65b0\u5206\u652f\u4e0a\u53ef\u4ee5\u8fdb\u884c\u63d0\u4ea4\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_12","title":"\u5341\u56db\u3001\u5e38\u89c1\u95ee\u9898","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_10","title":"1. \u63d0\u4ea4\u4ee3\u7801\u65f6\u63d0\u793a\u90ae\u7bb1\u6216\u8005\u540d\u79f0\u4e0d\u5bf9","text":"\u91cd\u65b0\u914d\u7f6e\u90ae\u7bb1\u6216\u8005\u540d\u79f0\uff0c\u7136\u540e\u91cd\u7f6e\u751f\u6548\uff1a git commit --amend --reset-author\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_10","title":"2. \u600e\u4e48\u56de\u6eda\u5230\u4e4b\u524d\u7684\u7248\u672c","text":"(1)\u67e5\u8be2\u5386\u53f2\u63d0\u4ea4\u8bb0\u5f55 git log\n \u627e\u5230\u4f60\u8981\u56de\u6eda\u7684\u7248\u672c\uff0c\u590d\u5236 hash \u503c\u3002 \u6ce8\u610f\uff1a\u662f commit \u7a7a\u683c\u4e4b\u540e\u7684 hash \u503c\uff0c\u4e4b\u524d\u6709\u540c\u5b66\u590d\u5236\u7684 Change-Id: \u8fd9\u6837\u80af\u5b9a\u62a5\u9519\u3002 (2)\u56de\u6eda\u7248\u672c\uff0c\u4e0d\u6e05\u9664\u4ee3\u7801 git reset --soft ${hash}\n (3)\u56de\u6eda\u7248\u672c\uff0c\u6e05\u9664\u4ee3\u7801\uff0c\u614e\u7528\u54c8 git reset --hard ${hash}\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-f-s-e","title":"3. \u6d4b\u8bd5\u62a5\u544a\u91cc\u9762 F S . E \u662f\u4ec0\u4e48\u610f\u601d","text":"F \u8868\u793a\u5931\u8d25\uff0c. \uff08\u70b9\uff09\u8868\u793a\u901a\u8fc7\uff0cS \u8868\u793a\u8df3\u8fc7\uff0cE \u8868\u793a error \u6709\u62a5\u9519"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git-status","title":"4. \u89e3\u51b3 git status \u4e2d\u6587\u663e\u793a\u7684\u95ee\u9898","text":"git config --global core.quotePath false\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5-apps","title":"5. apps \u76ee\u5f55\u4e0b\u989c\u8272\u6709\u4e9b\u662f\u9ec4\u8272\u7684","text":"\u5728 Pycharm \u4e2d apps \u76ee\u5f55\u4e0b\u5e94\u7528\u5e93\u6587\u4ef6\u662f\u9ec4\u8272\u7684\uff0c\u7f16\u8f91\u5668\u8bc6\u522b\u4e0d\u5230\u4ee3\u7801\u65b0\u589e\u548c\u4fee\u6539\uff1b \u7531\u4e8e\u793e\u533a\u7248 Pycharm \u4e0d\u80fd\u52a8\u6001\u8bc6\u522b\u591a\u4ed3\u5e93\uff0c\u9700\u8981\u5728 setting \u91cc\u9762\u624b\u52a8\u6ce8\u518c\uff0c\u64cd\u4f5c\u6b65\u9aa4\uff1a File \u2014> Settings \u2014> Version Control \u2014> \u70b9 + \u53f7 \u2014> Directory \u9009\u4e2d\u5e94\u7528\u5e93\u5de5\u7a0b\u76ee\u5f55 \u2014> VCS \u9009\u4e2d Git \u2014> Apply \u5982\u6b64\u5c31\u53ef\u4ee5\u4e86\u3002 \u4e13\u4e1a\u7248 Pycharm \u4e0d\u5b58\u5728\u8fd9\u4e2a\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#6-envsh-r","title":"6. \u6267\u884c env.sh \u62a5\u9519 $'\\r':\u672a\u627e\u5230\u547d\u4ee4","text":"\u51fa\u73b0\u8fd9\u4e2a\u95ee\u9898\u4f60\u5e94\u8be5\u662f\u5728 windows \u4e0a\u6253\u5f00\u6216\u7f16\u8f91\u8fc7 env.sh \u811a\u672c\uff0cwindows\u4e0b\u7684\u6362\u884c\u662f\u56de\u8f66\u7b26+\u6362\u884c\u7b26\uff0c\u4e5f\u5c31\u662f\\r\\n\uff0c\u800c Linxu \u4e0b\u662f\u6362\u884c\u7b26 \\n\uff0cLinux \u4e0b\u4e0d\u8bc6\u522b \\r\uff0c\u56e0\u6b64\u62a5\u9519\u3002 \u89e3\u51b3\u65b9\u6848\uff1a # \u5c06 \\r \u66ff\u6362\u4e3a\u7a7a\nsudo sed -i 's/\\r//' env.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#7","title":"7.\u600e\u6837\u4e3a\u5355\u72ec\u67d0\u4e00\u6761\u7528\u4f8b\u914d\u7f6e\u6267\u884c\u8d85\u65f6\u65f6\u95f4","text":"\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u5982\u4e0b\uff1a @pytest.mark.timeout(300) # \u5355\u4f4d\u79d2\ndef test_xxx_001():\npass\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#8-youqu","title":"8. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u6240\u6709\u4ee3\u7801\uff0c\u5305\u542b\u5b50\u4ed3\u5e93","text":"\u524d\u7f6e\u6761\u4ef6\uff1a\u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 # \u7b2c\u4e00\u6b21\u5b58\u50a8\u5bc6\u7801\uff0c\u63d0\u4f9b\u540e\u9762\u62c9\u4ee3\u7801(gerrit: ldap\u8d26\u53f7\u548c\u5bc6\u7801\uff0cgit\u62c9\u53d6\u7b2c\u4e00\u6b21\u8f93\u5165\u4fdd\u5b58\uff0c\u540e\u9762\u76f4\u63a5\u4f7f\u7528)\ngit config --global credential.helper store\n\n# \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\uff0c\u5e76\u9012\u5f52\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\" --recursive\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#9-youqu","title":"9. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\u6307\u5b9a\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u524d\u7f6e\u6761\u4ef6\uff1a \u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 \u5df2\u5b58\u50a8\u8bbf\u95ee\u5bc6\u7801 # \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\"\n# \u6307\u5b9a\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ncd youqu\ngit submodule update --init apps/autotest_xxx_xxx\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#10-youqu","title":"10. \u5982\u4f55\u66f4\u65b0 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\uff0c\u6240\u6709\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u66f4\u65b0\u6240\u6709\u5b50\u4ed3\u5e93\u4ee3\u7801 cd youqu\ngit pull & git submodule foreach git pull\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#11-youqu-master-detached-head","title":"11. \u5982\u4f55\u4fee\u590d YouQu \u6240\u6709\u5b50\u4ed3\u5e93 master \u5206\u652f\u6e38\u79bb\u5934\uff08detached head\uff09","text":"\u4fee\u590d\u6240\u6709\u5b50\u4ed3\u5e93\u9ed8\u8ba4master \u5206\u652f\u6e38\u79bb\u5934 cd youqu\ngit submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/","title":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212 \u5206\u7c7b\uff1a/ \u67b6\u6784\u5e08\uff1a/ \u76ee\u6807\uff1a \u5e94\u7528 AT \u67b6\u6784\u5de5\u7a0b\u5316\uff0c\u53c2\u8003\u6027\u80fd\u81ea\u52a8\u5316\u5de5\u7a0b\u5b8c\u6210\u5de5\u7a0b\u5316\u6539\u9020\u3002 \u5e94\u7528\u95f4\u7528\u4f8b\u89e3\u8026\uff0c\u89e3\u9664\u6240\u6709\u4ea4\u53c9\u8c03\u7528\u7684\u65b9\u6cd5\uff0c\u5404\u5e94\u7528\u80fd\u8ddf\u968f\u81ea\u8eab\u8fed\u4ee3\u5468\u671f\u72ec\u7acb\u7ef4\u62a4 AT \u7528\u4f8b\u3002 \u5b8c\u6210\u516c\u5171\u65b9\u6cd5\u7684\u62bd\u53d6\u6574\u5408\uff0c\u5f62\u6210\u4e00\u5957\u72ec\u7acb\u4e8e\u5e94\u7528\u95f4\u7684\u516c\u5171\u65b9\u6cd5\u5e93\uff0c\u5404\u5e94\u7528\u65b9\u6cd5\u91cc\u9762\u4e0d\u5b58\u5728\u88ab\u591a\u4e2a\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\u3002 \u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u4e3a\u5c06\u6765\u9002\u914d\u66f4\u591a\u7684 AT \u8fd0\u7528\u573a\u666f\u63d0\u4f9b\u652f\u6491\uff0c\u539f\u5219\u4e0a\u53ef\u5b9e\u73b0\u65e0\u9650\u6269\u5c55\uff0c\u5728\u6bcf\u65e5\u6784\u5efa\u548c\u6301\u7eed\u96c6\u6210\u6d41\u7a0b\u843d\u5730\u4f7f\u7528\u3002 \u4ee3\u7801\u89c4\u8303\u95ee\u9898\u6e05\u96f6\uff0c\u7b26\u5408 Shell Check\u3001Pylint\u3001\u7cfb\u7edf\u90e8\u76f8\u5173\u7f16\u7801\u89c4\u8303\u8981\u6c42\u3002 \u610f\u4e49\uff1a \u7edf\u4e00\u6210\u7814 AT \u67b6\u6784\u8bbe\u8ba1\u601d\u8def\uff0c\u6d88\u9664 AT \u4ee3\u7801\u5b9e\u73b0\u548c\u7ef4\u62a4\u4e0a\u53ef\u80fd\u51fa\u73b0\u7684\u5206\u6b67\uff0c\u6539\u5584\u5386\u53f2 AT \u65e0\u5de5\u7a0b\u5316\u8bbe\u8ba1\u7684\u7f3a\u9677\uff0c\u63d0\u9ad8\u67b6\u6784\u4e13\u4e1a\u6027\u3002 \u5404\u5e94\u7528 AT \u4ee3\u7801\u76f8\u4e92\u72ec\u7acb\uff0c\u5951\u5408\u5e94\u7528\u72ec\u7acb\u53d1\u5e03\u7279\u6027\uff0c\u53ef\u652f\u6301\u8fed\u4ee3\u671f\u95f4\u72ec\u7acb\u65b0\u589e\u3001\u7ef4\u62a4\u548c\u6267\u884c\u3002 \u65b9\u6cd5\u8c03\u7528\u903b\u8f91\u5f97\u5230\u7b80\u5316\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u66f4\u9ad8\u6548\uff1b\u516c\u5171\u5e93\u62bd\u53d6\uff0c\u51cf\u5c11\u65b9\u6cd5\u91cd\u590d\u7f16\u5199\uff0c\u63d0\u9ad8\u4ee3\u7801\u5229\u7528\u7387\uff1b\u5e73\u5747\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u4ece40\u5206\u949f\u964d\u4f4e\u81f330\u5206\u949f\uff0c\u65e5\u4ea7\u51fa\u7528\u4f8b\u4ece12\u6761/\u5929\u63d0\u5347\u81f316\u6761/\u5929\u3002 \u53ef\u7075\u6d3b\u652f\u6491\u4e0d\u540c\u7684\u81ea\u52a8\u5316\u8fd0\u7528\u573a\u666f\uff0c\u5982 CI\u3001\u5192\u70df\u6d4b\u8bd5\u3001\u96c6\u6210\u6d4b\u8bd5\u3001\u56de\u5f52\u6d4b\u8bd5\u3001\u4e13\u9879\u6d4b\u8bd5\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_2","title":"\u4e00\u3001\u80cc\u666f\u4ecb\u7ecd","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1","title":"1\u3001\u73b0\u6709\u67b6\u6784\u4ecb\u7ecd","text":"\u73b0\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u6574\u4f53\u5206\u4e3a\u4e09\u5c42\uff1a\u7528\u4f8b\u5c42\uff08\u4e1a\u52a1\u903b\u8f91\u5c42\uff09\u3001\u4e2d\u95f4\u5c42\uff08\u5143\u7d20\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff09\u3001\u6838\u5fc3\u5c42\uff08\u5e95\u5c42\u529f\u80fd\u5e93\u5c42\uff09\u3002 \u7528\u4f8b\u5c42\uff1a\u5373\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4e13\u6ce8\u4e8e\u4e1a\u52a1\u529f\u80fd\u903b\u8f91\uff0c\u4e0d\u5173\u5fc3\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\uff1b \u4e2d\u95f4\u5c42\uff1a\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff0c\u6bcf\u4e2a\u65b9\u6cd5\u5747\u5bf9\u5e94\u4e00\u4e2a\u5143\u7d20\u7684\u4e00\u4e2a\u5177\u4f53\u64cd\u4f5c\uff0c\u4e5f\u53ef\u4ee5\u662f\u591a\u4e2a\u64cd\u4f5c\u7684\u7ec4\u5408\u64cd\u4f5c\uff0c\u4e2d\u95f4\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u7528\u4f8b\u5c42\uff0c\u5177\u6709\u53ef\u6269\u5c55\u6027\u548c\u590d\u7528\u6027\uff1b \u6838\u5fc3\u5c42\uff1a\u4e3b\u8981\u5c01\u88c5\u7684\u5e95\u5c42\u529f\u80fd\u5b9e\u73b0\uff0c\u6b64\u5c42\u5728\u6846\u67b6\u4e2d\u63d0\u4f9b\u4e00\u4e9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u529f\u80fd\u6a21\u5757\u76f8\u5bf9\u72ec\u7acb\uff0c\u6838\u5fc3\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u64cd\u4f5c\u5c42\uff0c\u6bd4\u5982\uff1a\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7 UI \u5750\u6807\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u952e\u9f20\u64cd\u4f5c\u7684\u57fa\u7840\u65b9\u64cd\u4f5c\u6a21\u5757\u3001Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757\u3001\u6587\u4ef6\u7684\u589e\u5220\u6539\u67e5\u64cd\u4f5c\u6a21\u5757\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2","title":"2\u3001\u81ea\u52a8\u5316\u7684\u5e94\u7528","text":"2.1\u3001CI \u6d41\u7a0b \u6bcf\u65e5\u6784\u5efa\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u7814\u53d1\u6bcf\u65e5\u63d0\u4ea4\u7684\u4ee3\u7801\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u73ed\u4e4b\u540e\u4f1a\u5c06\u5404\u5e94\u7528\u8fdb\u884c\u6253\u5305\uff0c\u7136\u540e\u5728\u6d4b\u8bd5\u673a\u4e0a\u5b89\u88c5\u66f4\u65b0 deb \u5305\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u5e94\u7528\u63d0\u4ea4\u96c6\u6210\u7684\u7248\u672c\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u8f7d\u6700\u65b0\u7684 ISO \u8fdb\u884c PXE \u90e8\u7f72\uff0c\u7136\u540e\u6d4b\u8bd5\u673a\u5b89\u88c5\u6700\u65b0\u7684\u955c\u50cf\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 2.2\u3001\u9a8c\u6536\u6d4b\u8bd5 \u5728\u5404\u9a8c\u6536\u8282\u70b9\u8fdb\u884c\u81ea\u52a8\u5316\u9a8c\u6536\uff0c\u76ee\u524d\u7684\u7b56\u7565\u662f\u5168\u7528\u4f8b\u8986\u76d6\u5168\u67b6\u6784\u3002 2.3\u3001\u56de\u5f52\u6d4b\u8bd5 \u56de\u5f52\u6d4b\u8bd5\u4eca\u5e74\u89c4\u5212\u5efa\u8bbe\u4e2d\uff0c\u65e8\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u6267\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\uff0c\u51cf\u5c11\u529f\u80fd\u6d4b\u8bd5\u7684\u91cd\u590d\u52b3\u52a8\u529b\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3","title":"3\u3001\u5b58\u5728\u7684\u95ee\u9898","text":" \u5404\u5e94\u7528\u4e4b\u95f4\u5b58\u5728\u8026\u5408 \u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u521d\u671f\uff0c\u6240\u6709\u5e94\u7528\u662f\u6574\u4f53\u53d1\u5e03\uff0c\u6211\u4eec\u662f\u5c06\u6240\u6709\u5e94\u7528\u770b\u6210\u662f\u4e00\u4e2a\u6574\u4f53\uff0c\u5404\u5e94\u7528\u4f5c\u4e3a\u5176\u4e2d\u7684\u4e00\u4e2a\u6a21\u5757\uff0c\u6240\u4ee5\u5b58\u5728\u5e94\u7528\u95f4\u65b9\u6cd5\u4ea4\u53c9\u8c03\u7528\u7684\u95ee\u9898\uff0c\u8fd9\u6837\u4ece\u6700\u521d\u7684\u8bbe\u8ba1\u6765\u8bb2\u786e\u5b9e\u80fd\u591f\u51cf\u5c11\u91cd\u590d\u4ee3\u7801\u7684\u7f16\u5199\u3002\u4f46\u662f\u73b0\u5728\u5e94\u7528\u8d70\u72ec\u7acb\u53d1\u5e03\uff0c\u5404\u5e94\u7528\u90fd\u6709\u81ea\u5df1\u7684\u8fed\u4ee3\u8282\u594f\uff0c\u5728\u65b0\u9700\u6c42\u5feb\u901f\u53d8\u5316\u7684\u8fc7\u7a0b\u4e2d\uff0c\u81ea\u52a8\u5316\u7ef4\u62a4\u53d8\u5f97\u5f02\u5e38\u56f0\u96be\uff0c\u539f\u56e0\u5c31\u662f\u81ea\u52a8\u5316\u9879\u76ee\u91cc\u9762\u5404\u4e2a\u5e94\u7528\u7684\u6709\u6bd4\u8f83\u591a\u7684\u8026\u5408\u5173\u7cfb\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u8fdb\u884c\u89e3\u8026\uff0c\u4ee5\u9002\u5e94\u5e94\u7528\u4e0d\u540c\u7684\u8fed\u4ee3\u5468\u671f\u3002 \u65e0\u6cd5\u7cbe\u51c6\u7684\u5212\u5206\u7528\u4f8b\u8303\u56f4 \u7528\u4f8b\u6267\u884c\u7684\u8303\u56f4\u4e0d\u591f\u7cbe\u51c6\uff0c\u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u4e3b\u8981\u901a\u8fc7\u7528\u4f8b\u7684\u5173\u952e\u8bcd core\uff08\u6838\u5fc3\uff09\u6765\u533a\u5206\u7528\u4f8b\u662f\u5426\u4e3a\u6838\u5fc3\u7528\u4f8b\uff0c\u4f46\u662f\u8fd9\u6837\u7684\u533a\u5206\u592a\u5bbd\u6cdb\u4e86\uff0c\u4e0d\u80fd\u9002\u5e94\u81ea\u52a8\u5316\u6d4b\u8bd5\u5728\u591a\u573a\u666f\u4e0b\u7684\u5e94\u7528\u3002\u5f88\u591a\u573a\u666f\u4e0b\u6211\u4eec\u8fd8\u9700\u8981\u6839\u636e\u7528\u4f8b\u7684\u7b49\u7ea7\u3001\u7528\u4f8b\u7684\u7c7b\u578b\u3001\u7528\u4f8b\u6765\u6e90\u7b49\u7b49\uff0c\u4e0d\u540c\u7684\u7ef4\u5ea6\u6765\u6311\u9009\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u5173\u952e\u5b57\u9700\u8981\u4eba\u5de5\u4e00\u6761\u6761\u7684\u6539\uff0c\u8d39\u65f6\u8d39\u529b\uff0c\u800c\u4e14\u4e0d\u597d\u7ef4\u62a4\u3002 \u53d7\u65b0\u9700\u6c42\u5f71\u54cd\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u597d\u7ef4\u62a4 \u76ee\u524d\u9700\u8981\u8df3\u8fc7\u7684\u7528\u4f8b\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684\u7528\u4f8b\u811a\u672c\u91cc\u9762\uff0c\u6dfb\u52a0\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\uff0c\u540e\u7eed\u89e3\u9664\u8df3\u8fc7\u7684\u65f6\u5019\u53c8\u9700\u8981\u627e\u5230\u8fd9\u6761\u811a\u672c\uff0c\u5220\u6389\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\u3002\u5728\u8df3\u8fc7\u7528\u4f8b\u8f83\u591a\u7684\u60c5\u51b5\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u96be\u5ea6\u3002 \u7f16\u5199\u7528\u4f8b\u65f6\u903b\u8f91\u6bd4\u8f83\u590d\u6742\uff0c\u9700\u8981\u8c03\u7528\u591a\u4e2a\u5e94\u7528\u7684\u65b9\u6cd5\u6a21\u5757\u3002 \u6846\u67b6\u6269\u5c55\u6027\u4e0d\u8db3\uff0c\u65e0\u6cd5\u6574\u5408\u6027\u80fd\u81ea\u52a8\u5316\u3001\u538b\u6d4b\u81ea\u52a8\u5316\u3001\u5b89\u5168\u81ea\u52a8\u5316\u7b49\u4e13\u9879\u6d4b\u8bd5\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_3","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u4e3a\u89e3\u51b3\u73b0\u6709\u95ee\u9898\uff0c\u9002\u5e94\u4e0d\u65ad\u4e30\u5bcc\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u66f4\u597d\u7684\u53d1\u6325\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4f5c\u7528\uff0c\u9700\u8981\u5bf9\u81ea\u52a8\u5316\u67b6\u6784\u53ca\u5404\u529f\u80fd\u6a21\u5757\u8fdb\u884c\u91cd\u65b0\u8bbe\u8ba1\u89c4\u5212\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_1","title":"1\u3001\u67b6\u6784\u8bbe\u8ba1","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_1","title":"2\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u6846\u67b6\u7684\u8fd0\u884c\u903b\u8f91\uff1a\u901a\u8fc7\u6838\u5fc3\u5c42\u63d0\u4f9b\u4e00\u4e2a\u57fa\u7840\u80fd\u529b\uff0c\u4e1a\u52a1\u5c42\u6839\u636e\u5b9e\u9645\u4e1a\u52a1\u9700\u6c42\uff08\u6d4b\u8bd5\u7528\u4f8b\uff09\u52a8\u6001\u52a0\u8f7d\u6838\u5fc3\u5c42\uff0c\u6267\u884c\u5165\u53e3\u52a0\u8f7d\u76f8\u5e94\u7684\u7528\u4f8b\u96c6\u5e76\u63a7\u5236\u6267\u884c\uff0c\u5e94\u7528\u5c42\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u9700\u6c42\uff0c\u901a\u8fc7\u76f8\u5e94\u7684\u914d\u7f6e\u9879\u8fdb\u884c\u914d\u7f6e\uff0c\u4ece\u800c\u89e6\u53d1\u81ea\u52a8\u5316\u6d4b\u8bd5\u4efb\u52a1\u3002 \u6838\u5fc3\u5c42\uff1a\u57fa\u672c\u4fdd\u6301\u4e0d\u53d8\uff0c\u90e8\u5206\u6a21\u5757\u4f1a\u6d89\u53ca\u5230\u65b0\u529f\u80fd\u5f00\u53d1\uff0c\u6838\u5fc3\u5c42\u5404\u529f\u80fd\u6a21\u5757\u4fdd\u6301\u72ec\u7acb\u6027\uff0c\u63d0\u4f9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u4f9b\u4e0a\u5c42\u8c03\u7528\uff1b \u5e95\u5c42\u6838\u5fc3\u6a21\u5757\u5305\u62ec\uff1a \u56fe\u50cf\u8bc6\u522b\u6a21\u5757 UI \u5b9a\u4f4d\u6a21\u5757 Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757 \u5c5e\u6027\u5b9a\u4f4d\u6a21\u5757 \u65e5\u5fd7\u6a21\u5757 \u952e\u9f20\u64cd\u4f5c\u6a21\u5757 \u6587\u4ef6\u64cd\u4f5c\u6a21\u5757 \u5f55\u5c4f\u6a21\u5757 \u81ea\u5b9a\u4e49\u65ad\u8a00\u6a21\u5757 \u7528\u4f8b\u6267\u884c\u6a21\u5757 PXE \u88c5\u673a\u6a21\u5757 \u952e\u9f20\u4fe1\u53f7\u6a21\u62df\u6a21\u5757 OCR \u6a21\u5757 \u4e1a\u52a1\u5c42\uff1a\u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e94\u7528\u5185\u5305\u542b\u591a\u4e2a\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5982\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7b49\uff0c\u540e\u7eed\u53ef\u4ee5\u6839\u636e\u9700\u8981\u5ac1\u63a5\u8fdb\u6765\u3002\u5176\u4e2d\u529f\u80fd\u6d4b\u8bd5\u8bbe\u8ba1\u601d\u8def\uff1a \u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e76\u5c06\u6d4b\u8bd5\u6570\u636e\u548c\u6d4b\u8bd5\u8d44\u6e90\u6574\u5408\u8fdb\u6765\uff0c\u589e\u52a0\u7528\u4f8b\u6807\u7b7e csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ed9\u6bcf\u6761\u7528\u4f8b\u6253\u6807\u7b7e\u3002 \u5404\u6807\u7b7e\u6240\u4f7f\u7528\u5bf9\u5e94\u7684\u5b57\u6bb5\u540d\u79f0\uff0c\u4f7f\u7528 csv \u6587\u4ef6\u7ef4\u62a4\u7528\u4f8b\u4e0e\u6807\u7b7e\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u5bf9\u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u53ef\u4ee5\u7ec4\u5408\u5176\u4e2d\u7684\u6807\u7b7e\u800c\u4ece\u9a71\u52a8\u5bf9\u5e94\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\uff0c\u517c\u5bb9\u73b0\u6709\u7528\u4f8b\u6807\u7b7e\uff0c\u4e14\u652f\u6301\u7528\u4f8b\u6807\u7b7e\u53ef\u6269\u5c55\uff1b \u4f7f\u7528 csv \u683c\u5f0f\u6587\u4ef6\u53ef\u4ee5\u65b9\u4fbf\u7684\u4f7f\u7528 Excel \u8868\u683c\u6253\u5f00\u8fdb\u884c\u7f16\u8f91\uff0c\u540c\u65f6\u7531\u4e8e csv \u6587\u4ef6\u5b9e\u9645\u662f\u4ee5\u90fd\u597d\u5206\u9694\u7684\u6587\u672c\u6587\u4ef6\uff0c\u4ee3\u7801\u4e2d\u53ef\u4ee5\u5728\u4e0d\u4f9d\u8d56\u4e09\u65b9\u5e93\u7684\u60c5\u51b5\u4e0b\u65b9\u4fbf\u5feb\u901f\u7684\u89e3\u6790\u5b83\uff0c\u53ef\u64cd\u4f5c\u6027\u548c\u53ef\u7ef4\u62a4\u6027\u8f83\u9ad8\u3002 \u5404\u4e2a\u5e94\u7528\u4e4b\u95f4\uff0c\u7528\u4f8b\u3001\u65b9\u6cd5\u3001\u6807\u7b7e\u548c\u8d44\u6e90\u90fd\u662f\u76f8\u4e92\u72ec\u7acb\u7684\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u7528\u4f8b\u65f6\u53ea\u9700\u8981\u81ea\u5df1\u5e94\u7528\u4e0b\u7684\u65b9\u6cd5\u548c\u516c\u5171\u5e93\u5373\u53ef\u3002 \u7ed3\u6784\u4e3e\u4f8b\uff1a .\n\u251c\u2500\u2500 apps\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_album # \u5e94\u7528\u540d (\u7528\u4e0b\u5212\u7ebf\u8fde\u63a5\u662f Python \u7f16\u7801\u89c4\u8303)\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_assert # \u65ad\u8a00\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_function_tag.csv # \u7528\u4f8b\u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 asan_cases # \u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases # \u529f\u80fd\u6d4b\u8bd5\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 res # \u6d4b\u8bd5\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config # \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_widget # \u5e94\u7528\u81ea\u5df1\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_widget # \u65b9\u6cd5\u57fa\u7c7b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 other_widget # \u8c03\u7528\u5176\u4ed6\u5e94\u7528\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_camera\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases\n\u2502\u00a0\u00a0 \u2502\u00a0 ...\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 public_widget # \u516c\u5171\u65b9\u6cd5\u5e93\n\u251c\u2500\u2500 config # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n...\n config \u914d\u7f6e\u6a21\u5757\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u76f8\u5e94\u914d\u7f6e\uff0c\u6d4b\u8bd5\u540c\u5b66\u53ef\u4ee5\u6839\u636e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5728 config \u91cc\u9762\u8fdb\u884c\u914d\u7f6e\u3002 \u5168\u5c40\u914d\u7f6e\uff1a \u6267\u884c\u4e00\u4e2a\u6216\u591a\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff1a\u5728 pattern \u91cc\u9762\u5199\u5165\u5e94\u7528\u5305\u540d\uff0c\u591a\u4e2a\u5e94\u7528\u4e4b\u95f4\u7528 or \u8fde\u63a5\uff0c\u5982 deepin-music or deepin-movie\uff1b \u5192\u70df\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a smoke\uff1b \u96c6\u6210\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a core \uff1b \u5168\u91cf\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u4e3a\u7a7a\u5373\u53ef\uff1b \u901a\u8fc7 tags \u7684\u914d\u7f6e\u6bd4\u8f83\u7075\u6d3b\uff0c\u540e\u9762\u6807\u7b7e\u5316\u7ba1\u7406\u7ae0\u8282\u4f1a\u8bb2\u5230\uff0c\u652f\u6301\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u7075\u6d3b\u914d\u7f6e\u3002 \u6307\u5b9a\u67d0\u53f0\u673a\u5668\u5728\u6307\u5b9a\u955c\u50cf\u7248\u672c\u4e0a\u6267\u884c\u7528\u4f8b\uff1a\u5728 IP \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a IP\uff0c\u5e76\u5728 URL \u91cc\u9762\u586b\u5165\u955c\u50cf\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u6846\u67b6\u4f1a\u8c03\u7528 PXE \u8fdb\u884c\u81ea\u52a8\u88c5\u673a\uff0c\u88c5\u673a\u5b8c\u4e4b\u540e\u81ea\u52a8\u5f00\u59cb\u6267\u884c\u914d\u7f6e\u7684\u6d4b\u8bd5\u7528\u4f8b\u3002 \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\uff1a \u6bcf\u4e2a\u5e94\u7528\u5185\u90e8\u4f1a\u6709\u4e00\u4e2a\u5355\u72ec\u7684\u914d\u7f6e\u6a21\u5757\uff0c\u4f1a\u5305\u542b\u4e00\u4e9b\u672c\u5e94\u7528\u7684\u6d4b\u8bd5\u8d44\u6e90\u7684\u8def\u5f84\u3001\u6267\u884c\u7528\u4f8b\u7684\u6807\u7b7e\u914d\u7f6e\u7b49\u7b49\uff0c\u5982\u679c\u5728\u5c40\u90e8\u914d\u7f6e\u91cc\u9762\u914d\u7f6e\u4e86\u7528\u4f8b\u6267\u884c\u6807\u7b7e\uff0c\u800c\u5916\u5c42 runner \u51fa\u6ca1\u6709\u6307\u5b9a\u6267\u884c\u6807\u7b7e\uff0c\u5219\u5728\u6267\u884c\u65f6\u53ea\u4f1a\u6267\u884c\u5c40\u90e8\u914d\u7f6e\u5df2\u914d\u7f6e\u7684\uff0c\u82e5\u5916\u5c42 runner \u4e5f\u914d\u7f6e\u4e86\u6267\u884c\u6807\u7b7e\uff0c\u5219\u4f1a\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u7528\u4f8b\u3002 \u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u914d\u7f6e\u90fd\u5728\u540c\u4e00\u4e2a\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\uff0cpy \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684\u7c7b\uff0cini \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684 option\u3002 \u5168\u5c40\u914d\u7f6e\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u7b56\u7565\u5982\u4e0b\uff1a \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5c40\u90e8\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5e94\u7528\u5c42\uff1arunner \u662f\u6d4b\u8bd5\u6267\u884c\u7684\u5165\u53e3\uff0c\u5b83\u4f1a\u6839\u636e\u914d\u7f6e\u91cc\u9762\u7684\u914d\u7f6e\u9879\uff0c\u8fdb\u884c\u7528\u4f8b\u7684\u52a0\u8f7d\u548c\u6267\u884c\u3002\u5b83\u63d0\u4f9b\u63a5\u53e3\u7ed9\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\uff0c\u5e73\u53f0\u4e0a\u7684\u6307\u4ee4\u5b9e\u9645\u4e0a\u90fd\u662f\u901a\u8fc7\u4e0b\u53d1\u7ed9 runner\uff0c\u7136\u540e\u7531 runner \u6765\u6267\u884c\u76f8\u5e94\u7684\u6d4b\u8bd5\u3002 \u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u662f\u4e00\u4e2a\u524d\u7aef\u7cfb\u7edf\uff0c\u53ef\u4ee5\u8fdb\u884c\u6d4b\u8bd5\u673a\u7ba1\u7406\u3001\u81ea\u52a8\u5b89\u88c5\u955c\u50cf\u3001\u81ea\u52a8\u5b89\u88c5\u6307\u5b9a\u5e94\u7528\u7248\u672c\u3001\u8fdb\u884c\u6d4b\u8bd5\u7528\u4f8b\u8303\u56f4\u9009\u62e9\u3001\u7528\u4f8b\u89e6\u53d1\u6267\u884c\u63a7\u5236\u3001\u7ed3\u679c\u5c55\u793a\u8f93\u51fa\u7b49\u3002 \u4e00\u4e2a\u5e94\u7528\u7684\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\u90fd\u53ef\u4ee5\u5355\u72ec\u89e6\u53d1\u3002 \u517c\u5bb9\u6027\u6d4b\u8bd5\u4e3b\u8981\u901a\u8fc7 PXE \u670d\u52a1\u5668\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u88c5\u673a\uff0c\u7136\u540e\u914d\u5408 AT \u8fdb\u884c\u6d4b\u8bd5\uff0c\u53ef\u4ee5\u5b9e\u73b0\u4e0d\u540c\u7cfb\u7edf\u7248\u672c\u3001\u4e0d\u540c\u5e94\u7528\u7248\u672c\u73af\u5883\u4e0a\u90fd\u53ef\u4ee5\u8fdb\u884c\u81ea\u52a8\u5316\u7684 AT \u6267\u884c\uff0c\u63d0\u9ad8\u517c\u5bb9\u6027\u6d4b\u8bd5\u6548\u7387\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_4","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_2","title":"1\u3001\u7528\u4f8b\u89e3\u8026","text":"\u5b58\u5728\u8026\u5408\u5173\u7cfb\u7684\u65b9\u6cd5\uff1a\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u88ab\u5916\u90e8\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\uff0c\u5219\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u8026\u5408\u5173\u7cfb\u3002 1.1\u3001\u901a\u8fc7\u7f16\u8f91\u5668 Find Usages \u67e5\u770b\u6bcf\u4e2a\u65b9\u6cd5\u88ab\u8c03\u7528\u7684\u8def\u5f84\u548c\u88ab\u8c03\u7528\u6b21\u6570\uff1b 1.2\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 1 \u4e2a\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728\u5916\u90e8\u5e94\u7528\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1b 1.3\u3001\u64cd\u4f5c\u5c42\u6587\u4ef6\u540d\u5747\u4ee5 widget \u7ed3\u5c3e\uff0c\u7c7b\u540d\u4ee5 Widget \u7ed3\u5c3e\uff0c\u5982\uff1a\u6587\u4ef6\u540d music_widget.py \uff1a class MusicWidget:\n\"\"\"\u97f3\u4e50\u7684\u64cd\u4f5c\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_2","title":"2\u3001\u516c\u5171\u5e93\u5efa\u8bbe","text":"2.1\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 2 \u4e2a\u53ca\u4ee5\u4e0a\u7684\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728 public_widget \u76ee\u5f55\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1bpublic_widget \u5373\u4e3a\u516c\u5171\u65b9\u6cd5\u5e93\uff1b 2.2\u3001\u5728\u7528\u4f8b\u5c42\u4fee\u6539\u7528\u4f8b\u4e2d\u7c7b\u7684\u5bfc\u5165\u8def\u5f84\uff0c\u5c5e\u4e8e\u516c\u5171\u65b9\u6cd5\u7684\u5219\u8c03\u7528 public_widget \u4e2d\u7684\u7c7b\uff0c\u5916\u90e8\u5e94\u7528\u7684\u64cd\u4f5c\u65b9\u6cd5\uff0c\u5219\u8c03\u7528\u672c\u5e94\u7528\u76ee\u5f55\u4e0b\u91cd\u5199\u7684\u5916\u90e8\u5e94\u7528\u65b9\u6cd5\u3002 \u6bd4\u5982\uff1a\u51e0\u4e4e\u6240\u6709\u591a\u5a92\u4f53\u5e94\u7528\u90fd\u9700\u8981\u901a\u8fc7\u6587\u7ba1\u52a0\u8f7d\u8d44\u6e90\uff0c\u8c03\u8d77\u7684\u6587\u7ba1\u5bf9\u8bdd\u6846\u5b9e\u9645\u4e3a dde-desktop\uff0c\u56e0\u6b64\u5c06 desktop_widget.py \u653e\u5230 public_widget \u91cc\u9762\uff1a class DdeDesktopPublicWidget:\n\"\"\"\u516c\u5171-\u684c\u9762\u7684\u64cd\u4f5c\u65b9\u6cd5\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3_1","title":"3\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406","text":"3.1\u3001\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1a\u5bf9\u5e94 core\u3001smoke\uff0c\u6216\u4e3a\u7a7a\uff1b \u7528\u4f8b\u6765\u6e90\uff1a\u5bf9\u5e94 PMS \u7528\u4f8b\u6765\u6e90\uff0c\u5206\u522b\u7528 acp1\u3001acp2\u3001acp3\u3001acp4 \u8868\u793a\u3002 acp1 \uff1a\u4e1a\u52a1\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5199\u7684\u7528\u4f8b\uff0c\u88ab\u7528\u4e8e\u9a8c\u6536\u6d4b\u8bd5\u7684\uff1b acp2 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5f15\u5165\u7684\u4ea7\u54c1\u9a8c\u6536\u6d4b\u8bc4\u90e8\u7684\u7528\u4f8b\uff1b acp3 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u6839\u636e\u4ea7\u54c1\u9700\u6c42\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\uff1b acp4 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u901a\u8fc7\u793e\u533a\u3001\u8bba\u575b\u7528\u6237\u53cd\u9988\u95ee\u9898\u603b\u7ed3\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\u3002 \u4e3e\u4f8b\uff1a \u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u7528\u4f8b\u6765\u6e90 001 L1 core acp1 \u6807\u7b7e\u91c7\u7528\u679a\u4e3e\u7684\u65b9\u5f0f\u8fdb\u884c\u4ee3\u53f7\u7ba1\u7406\u65b9\u4fbf\u7ba1\u7406\u4ee5\u53ca\u540e\u7eed\u6269\u5c55\u3002 3.2\u3001\u5728\u6bcf\u4e2a\u5e94\u7528\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u7b2c\u4e00\u5217\u4e3a\u7528\u4f8b\u7684 ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ba1\u7406\u6a21\u5757\u5185\u7684\u7528\u4f8b\u6807\u7b7e\u3002\u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 3.3\u3001\u5bf9\u7167 PMS \u4e0a\u7528\u4f8b\u7b49\u7ea7\u3001\u7528\u4f8b\u7c7b\u578b\u548c\u7528\u4f8b\u6765\u6e90\uff0c\u6807\u8bb0\u6240\u6709\u5df2\u5b9e\u73b0\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u540e\u7eed\u7f16\u5199\u65b0\u589e\u81ea\u52a8\u5316\u7528\u4f8b\u65f6\uff0c\u6bcf\u5199\u4e00\u6761\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684 csv \u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u6b64\u6761\u7528\u4f8b\u7684\u6807\u7b7e\u3002 3.4\u3001\u8df3\u8fc7\u7528\u4f8b\u6807\u7b7e\u5316 \u73b0\u6709\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a\uff1a \u4e3e\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u8bb0\u4e3a \u201cskip-\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u8bb0\uff0c\u5982\u679c\u5df2\u7ecf\u6807\u8bb0\u4e86\u8df3\u8fc7\u539f\u56e0\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u8bb0\u4e3a SKIPED\uff0c\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\u3002 \u6240\u6709\u7684\u6807\u7b7e\u5728 docs \u76ee\u5f55\u4e0b\u4f1a\u6709\u4e00\u4e2a\u6587\u6863\uff0c\u6587\u6863\u6682\u5b9a\u540d\u79f0\u4e3a\uff1atags_info.md\uff0c\u7528\u4e8e\u8bf4\u660e\u73b0\u5728\u5df2\u7ecf\u4f7f\u7528\u5230\u7684\u6807\u7b7e\uff0c\u4ee5\u53ca\u8fd9\u4e9b\u6807\u7b7e\u7684\u89e3\u91ca\u548c\u7528\u6cd5\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#4","title":"4\u3001\u7528\u4f8b\u6267\u884c","text":"4.1\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u7684\u9a71\u52a8\u6267\u884c\u903b\u8f91\u529f\u80fd\u5b9e\u73b0 \u5f00\u53d1\u6839\u636e\u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\u91cc\u9762\u7684\u7528\u4f8b\u6807\u7b7e\u6267\u884c\u5bf9\u5e94\u7528\u4f8b\u7684\u529f\u80fd\uff0c\u80fd\u652f\u6301\u591a\u4e2a\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u6267\u884c\u5165\u53e3\u80fd\u968f\u610f\u901a\u8fc7\u7528\u4f8b\u6807\u7b7e\u6307\u5b9a\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002 \u7528\u4f8b\u6807\u7b7e\u7684\u9a71\u52a8\u65b9\u5f0f\u5fc5\u987b\u80fd\u652f\u6301\u6807\u7b7e\u7684\u6269\u5c55\uff0c\u672a\u6765\u968f\u7740\u4e1a\u52a1\u7684\u53d8\u5316\u53ef\u80fd\u9700\u8981\u589e\u52a0\u5404\u79cd\u5404\u6837\u7684\u6807\u7b7e\u3002 4.2\u3001\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u6267\u884c \u529f\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u3001\u6027\u80fd\u6d4b\u8bd5\u7b49\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u662f\u5206\u5f00\u6267\u884c\u7684\uff0c\u4e5f\u5c31\u662f\u5728\u4e00\u6b21\u6267\u884c\u4e2d\uff0c\u53ea\u80fd\u6267\u884c\u5176\u4e2d\u4e00\u79cd\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5177\u4f53\u8981\u6267\u884c\u54ea\u4e00\u79cd\u540c\u6837\u901a\u8fc7\u53c2\u6570\u6765\u63a7\u5236\u3002 4.3\u3001\u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c \u7531\u4e8e\u6d4b\u8bd5\u673a\u8d44\u6e90\u6709\u9650\uff0c\u968f\u7740\u81ea\u52a8\u5316\u7528\u4f8b\u6570\u91cf\u7684\u589e\u52a0\uff0cCI \u6267\u884c\u65f6\u95f4\u4f1a\u8d8a\u6765\u8d8a\u957f\u3002 \u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c\u7684\u529f\u80fd\uff1a \u540c\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\u5206\u6563\u5230\u4e0d\u540c\u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u4e0a\u6267\u884c\uff0c\u7f29\u77ed\u6267\u884c\u603b\u65f6\u95f4\uff1b \u7b2c\u4e8c\u5929\u8dd1\u7684\u65f6\u5019\u540c\u4e00\u4e2a\u673a\u5668\u4e0a\u4f1a\u6267\u884c\u6628\u5929\u6ca1\u6709\u6267\u884c\u5230\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u6267\u884c\u540c\u7406\uff1b \u53ef\u4ee5\u5b9e\u73b0\u5728\u5168\u67b6\u6784\u6d4b\u8bd5\u673a\u4e0a\u8f6e\u6d41\u6267\u884c\u7528\u4f8b\uff0c\u65e2\u80fd\u4fdd\u8bc1\u6267\u884c\u4e86\u6240\u6709\u7684\u7528\u4f8b\uff0c\u53c8\u80fd\u5728\u8d44\u6e90\u6709\u9650\u7684\u60c5\u51b5\u4e0b\u8986\u76d6\u4e86\u6240\u6709\u7684\u67b6\u6784\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#5","title":"5\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0","text":"5.1\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u4f5c\u4e3a\u524d\u7aef\u754c\u9762\u7cfb\u7edf\uff0c\u901a\u8fc7\u9875\u9762\u4e0a\u7684\u4e00\u4e9b\u529f\u80fd\u9009\u9879\u8fdb\u884c\u5bf9\u5e94\u6d4b\u8bd5\u4efb\u52a1\u7684\u7ba1\u7406\u6216\u89e6\u53d1\uff0c\u4e1a\u5185\u6bd4\u8f83\u6d41\u884c\u7684\u5b9e\u73b0\u65b9\u6848\u662f\u4f7f\u7528 Vue + DRF \u5b9e\u73b0\u4e00\u4e2a\u524d\u540e\u7aef\u5206\u79bb\u7684\u7cfb\u7edf\u3002 \u6d4b\u8bd5\u5e73\u53f0\u53ef\u80fd\u4f1a\u6d89\u53ca\u5230\u7684\u6a21\u5757\u6709\uff1a\u6d4b\u8bd5\u673a\u8d44\u6e90\u7ba1\u7406\u6a21\u5757\u3001\u7528\u4f8b\u6267\u884c\u63a7\u5236\u6a21\u5757\u3001\u7ed3\u679c\u5c55\u793a\u6a21\u5757\u3001PXE \u955c\u50cf\u5b89\u88c5\u6a21\u5757\u7b49\u3002 \u7528\u6237\uff08\u6d4b\u8bd5\u3001\u7814\u53d1\u540c\u5b66\u7b49\uff09\u53ef\u4ee5\u914d\u7f6e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5982\u6267\u884c\u54ea\u4e2a\u5e94\u7528\u3001\u6267\u884c\u7528\u4f8b\u7684\u8303\u56f4\u3001\u5728\u54ea\u53f0\u673a\u5668\u4e0a\u6267\u884c\u3001\u955c\u50cf\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u5e94\u7528\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u6267\u884c\u65f6\u95f4\u3002 5.2\u3001\u6267\u884c\u5165\u53e3 runner \u63d0\u4f9b\u7ed9\u6d4b\u8bd5\u5e73\u53f0\u7684\u63a5\u53e3\u5305\u62ec\uff1a\u7528\u4f8b\u6267\u884c\u63a5\u53e3\u3001\u7ed3\u679c\u8fd4\u56de\u63a5\u53e3\u3001\u955c\u50cf\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u955c\u50cf\u5b89\u88c5\u63a5\u53e3\u3001\u5e94\u7528\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u5e94\u7528\u5b89\u88c5\u66f4\u65b0\u63a5\u53e3\u7b49\u3002 \u524d\u7aef\u5e73\u53f0\u76ee\u524d\u8fd8\u6ca1\u6709\u592a\u591a\u8be6\u7ec6\u7684\u65b9\u6848\uff0c\u672c\u6b21\u8bbe\u8ba1\u4e3b\u8981\u96c6\u4e2d\u5728\u540e\u7aef\u8fd9\u90e8\u5206\u67b6\u6784\u7684\u8bbe\u8ba1\u4e0a\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_5","title":"\u56db\u3001\u5b9e\u65bd\u8ba1\u5212","text":"\u8fd1\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u6587\u7ba1\u4ee3\u7801\u89e3\u8026 2022/3/28 2022/4/8 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u56fe\u5f62\u56fe\u50cf\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u97f3\u89c6\u9891\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5168\u5c40\u641c\u7d22\u4ee3\u7801\u89e3\u8026 2022/4/25 2022/4/26 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u516c\u5171\u5e93\u5efa\u8bbe 2022/4/27 2022/5/5 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5c01\u88c5\u7684\u65b9\u6cd5\u6574\u7406\u6210\u4e00\u4e2a\u8868 2022/5/6 2022/5/10 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7528\u4f8b\u6807\u7b7e\u5206\u7c7b\u8bc4\u4f30 2022/5/11 2022/5/11 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u6807\u7b7e\u5316\u6267\u884c\u9a71\u52a8\u7a0b\u5e8f\u7f16\u5199 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u9700\u5b9e\u73b0\u81ea\u52a8\u89e3\u6790 csv \u8868\u683c\u4e2d\u7684\u7528\u4f8b\u7f16\u53f7 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u722c\u866b\u811a\u672c\uff0c\u722c\u53d6 pms \u4e0a\u7528\u4f8b\u7684\u6807\u7b7e 2022/5/11 2022/5/13 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u5b9a\u65f6\u81ea\u52a8\u7ef4\u62a4\u672c\u5730 csv \u6587\u4ef6\u811a\u672c 2022/5/11 2022/5/20 \u4e2d\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u76ee\u5f55\u7ed3\u6784\u8c03\u6574 2022/5/20 2022/6/2 \u5b8c\u6210\u5168\u5c40\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u5177\u4f53\u65b9\u6848\u548c\u903b\u8f91\u5b9e\u73b0 2022/6/6 2022/6/17 \u9759\u6001\u626b\u63cf\u95ee\u9898\u6e05\u96f6 2022/6/20 2022/7/1 \u5b8c\u6210\u65b0\u6846\u67b6\u4f7f\u7528\u57f9\u8bad 2022/7/4 2022/7/11 \u843d\u5730\u8fd0\u884c 2022/7/12 2022/7/20 \u5e95\u5c42\u5e93\u7528\u9014\u8bf4\u660e\u6587\u6863\u7f16\u5199 2022/7/21 2022/7/28"}]} \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz index 8ffaebc1..e0b7bbfc 100644 Binary files a/sitemap.xml.gz and b/sitemap.xml.gz differ diff --git "a/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" "b/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" index 25f669d5..97100667 100644 --- "a/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" +++ "b/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs @@ -1215,8 +1215,7 @@ 智能化功能测试# Attribution :chengdu Test Team # Date :2021/08/20 -此方案仍在演进中 -此方案仍在演进中 +此方案仍在演进中 仓库地址:https://gitlabcd.uniontech.com/autotest/cd-desktop-aitest 一、方案概述¶ 基于深度学习智能识别应用的元素控件,用于在自动化测试操作过程中的元素定位以及判断结果时的断言处理;自动化测试过程中,测试机上的画面通过采集盒传输到服务器上,服务器对视频画面进行智能识别后,服务器智能判断用例是否执行成功,然后对测试机下发下一步操作指令,测试机接受并执行下一步操作。 diff --git "a/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" "b/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" index cdf9ccde..06c9e9a5 100644 --- "a/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" +++ "b/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" @@ -95,7 +95,7 @@ - + @@ -226,7 +226,7 @@ - + YouQu Docs diff --git "a/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" "b/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" index 121b4507..72123668 100644 --- "a/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" +++ "b/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs @@ -752,6 +752,13 @@ + + + + + 4、虚拟化部署 + + @@ -1661,6 +1668,13 @@ + + + + + 4、虚拟化部署 + + @@ -2604,18 +2618,12 @@ 1、标签说明流水线使用指导; 跳过原因:skip-XXX,用于控制用例是否执行; 确认修复:fixed-XXX,用于标记用例的修复状态(后面详细讲解用法); @@ -2629,26 +2637,30 @@ 1、标签说明PMS用例ID 用例级别 用例类型 +设备类型 +用例来源 上线对象 测试级别 跳过原因 确认修复 -废弃用例 -... +废弃用例 +... -001 +679537 679537 L1 FUNC +PPL + CICD C1 skip-XXX fixed-XXX -removed-已废弃 -... +removed-已废弃 +... @@ -2656,7 +2668,7 @@ 2、操作步骤csv 的文件名。 例如: -相册的用例文件为 test_album_xxx.py,xxx 表示任意三位数字代表用例序号,此时 csv 文件名就应为 album.csv; +相册的用例文件为 test_album_xxx.py,xxx 表示用例的ID(也可以是自定义的数字代表用例序号),此时 csv 文件名就应为 album.csv; 对于用例规模比较大的应用,比如文件管理器,建议分模块,每个模块建立一个 csv 文件,所有 csv 文件建议放在一个 tags 目录下。 是否分模块维护 csv 取决于应用的用例复杂度,同时我们应该充分考虑后期的可维护性,csv 文件太多了也是一个很糟糕的事情。 @@ -2677,7 +2689,7 @@ 3.1.1、固定跳过001 +679537 ... skip-受到某新需求影响 @@ -2742,7 +2754,7 @@ 3.2、确认修复001 +679537 ... skip-受到某新需求影响 fixed-已修复 @@ -2787,7 +2799,7 @@ 3.3、废弃用例4、设计思路¶ 上面介绍 Pytest 框架提供的标签功能 mark,使用时需要为每一个用例添加标签装饰器,则操作复杂,可维护性差,其根本问题就是标签分散在每一条用例的装饰器上,难以集中维护;于是乎将所有标签使用 csv 文件进行集中管理,并通过 Pytest 的钩子函数,读取 csv 文件,动态添加标签到用中。 5、CSV文件格式¶ -此配置文件需要维护大量的标签数据,且要方便能使用Excel打开进行编辑查看,更重要的是我们不想引入三方依赖,CSV 文件几乎是唯一能满足所有的要求的文件格式。 +此配置文件需要维护大量的标签数据,且要方便能使用 Excel 打开进行编辑查看,更重要的是我们不想引入三方依赖,CSV 文件几乎是唯一能满足所有的要求的文件格式。 七、日志系统¶ 1、背景¶ 基于 YouQu 自动化测试框架操作方法封装写法,通常是这样的:类里面一个函数只包含一个操作或多次调用的一系列可合并的操作; @@ -2888,7 +2900,7 @@ 1、原则 大文件不能上传到工程里面,保持整个工程的轻量化,这样在克隆代码的时候才能非常快速方便使用,我们见过一个 AT 工程 clone 大小达到好几个 G,简直不可思议。 其实代码文件的大小是很小的,也就是说,纯写代码随便写工程也不会太大,而文档(包含插图)等资源却是很占空间。 -因此我们选择将 YouQu 的文档工程单独迁出到独立的仓库 youqu-docs 。 +因此我们选择将 YouQu 的文档工程涉及到的图片资源都采用外链加载; 2、安装¶ 项目根目录下运行 env.sh 即可。 bash env.sh @@ -2930,17 +2942,25 @@ 3.2、裁剪依赖bash env_dev.sh +4、虚拟化部署¶ +YouQu默认采用虚拟化部分,虚拟化环境实际安装的位置是在 $HOME/.local/share/virtualenvs/youqu-oHTM7l7G 目录下 +youqu-oHTM7l7G 此目录名称前面部分是你的代码根目录的名称,后面部分是生成的随机字符串; +同学们在远程机器上定位问题的时候,如果使用 Pycharm 调试,就将解释器指定到这个目录的就行了; +当然,我们也提供了本机开发环境部署: +bash env_dev.sh + +如果你是本地开发环境可以用它,区别就是驱动执行的时候使用:python3 manage.py xxx 九、失败录屏¶ 录屏其实是一种视频形式的日志,因为很多时候我们在查看日志之后仍然无法准确的定位到用例失败的具体原因,因此用例的录屏能让我们看到用例在执行过程; 【使用方法】 在 globalconfig.ini 里面配置关注 2 个参数; -;失败用例重跑次数 -RERUN = 1 - -;失败录屏从第几次开始录制视频。 -;比如 RECORD_FAILED_CASE = 1 ,表示用例第1次执行失败之后开始录屏。 -;注意,用例失败重跑的次数不能小于失败录屏次数,即 RERUN >= RECORD_FAILED_CASE -RECORD_FAILED_CASE = 1 +;失败用例重跑次数 +RERUN = 1 + +;失败录屏从第几次开始录制视频。 +;比如 RECORD_FAILED_CASE = 1 ,表示用例第1次执行失败之后开始录屏。 +;注意,用例失败重跑的次数不能小于失败录屏次数,即 RERUN >= RECORD_FAILED_CASE +RECORD_FAILED_CASE = 1 默认失败重跑的次数是 1 次; RECORD_FAILED_CASE = 1 表示用例第1次执行失败之后开始录屏; @@ -2953,48 +2973,48 @@ 十、Wayland 适配简单讲就是,应用库只需要维护一套用例脚本即可。 【用例兼容】 因为 Wayland 下有些应用的界面显示和功能本身存在一些差异,用例层可能需要对这部分用例做逻辑判断,使用全局配置里面的常量进行逻辑编写即可: -from setting.globalconfig import GlobalConfig - -# GlobalConfig.IS_WAYLAND 获取到当前的显示服务器(bool) -# 应用库 Config 继承 GlobalConfig -if Config.IS_WAYLAND: - pass -if Config.IS_X11: - pass +from setting.globalconfig import GlobalConfig + +# GlobalConfig.IS_WAYLAND 获取到当前的显示服务器(bool) +# 应用库 Config 继承 GlobalConfig +if Config.IS_WAYLAND: + pass +if Config.IS_X11: + pass 比如用例里面如果断言的图片不同: -if Config.IS_WAYLAND: - self.assert_image_exist("wayland_XXX") -else: - self.assert_image_exist("x11_XXX") +if Config.IS_WAYLAND: + self.assert_image_exist("wayland_XXX") +else: + self.assert_image_exist("x11_XXX") 这样这条用例脚本在 Wayland 和 X11 下都可以跑,so easy 是不是?完全没必要专门拉新分支进行 Wayland 适配。 十一、测试报告¶ 1. 目录结构¶ 执行时会在根目录下动态生成 report 目录,所有的报告相关的文件会统一存放在里面,示例: -/report - ├── allure # allure报告 - │ ├── ... - │ └── ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json - ├── allure_html # 生成的html报告 - │ ├── ... - │ └── index.html - ├── allure_back # allure报告备份 - │ └── 20221108114823 - │ ├── ... - │ └── f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json - ├── json # json报告 - │ ├── ... - │ └── result_deepin-music_20221109134736_1081333.json - ├── logs # 日志文件 - │ ├── 2022-11-10_debug.log - │ └── 2022-11-10_error.log - ├── record # 录屏 - │ └── 2022-11-09 - │ ├── ... - │ └── 15时14分09秒_test_music_303_2_autotest.mp4 - └── xml # xml报告 - └── autotest_deepin_music-20221109134736.xml +/report + ├── allure # allure报告 + │ ├── ... + │ └── ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json + ├── allure_html # 生成的html报告 + │ ├── ... + │ └── index.html + ├── allure_back # allure报告备份 + │ └── 20221108114823 + │ ├── ... + │ └── f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json + ├── json # json报告 + │ ├── ... + │ └── result_deepin-music_20221109134736_1081333.json + ├── logs # 日志文件 + │ ├── 2022-11-10_debug.log + │ └── 2022-11-10_error.log + ├── record # 录屏 + │ └── 2022-11-09 + │ ├── ... + │ └── 15时14分09秒_test_music_303_2_autotest.mp4 + └── xml # xml报告 + └── autotest_deepin_music-20221109134736.xml 默认情况下同时生成 html、xml、json三种形式的报告。 2. 定制报告¶ @@ -3011,14 +3031,14 @@ 3. 查看报告allure open report/allure_html +allure open report/allure_html 使用 manage.py 执行完之后,在终端的最后一行,我们会给你输出打开报告的命令,直接复制它在终端执行就可以查看了,像这样: - 终端执行命令: allure open /tmp/youqu/report/allure_html 查看报告 + 终端执行命令: allure open /tmp/youqu/report/allure_html 查看报告 你也可以直接在 Pycharm 里面找到 index.html 文件,然后右键选择浏览器打开,或者你可以用一个 http 服务打开。 你也可以直接在 report/allure 目录下查看报告: - allure serve report/allure + allure serve report/allure 远程执行 @@ -3031,48 +3051,48 @@ 1. 提前解决代码问题这里推荐一个 Python 社区流行的代码格式化工具: Black,号称不妥协的代码格式化工具,它检测到不符合规范的代码风格直接就帮你全部格式化好,就是这么刚! 安装: -sudo pip3 install black +sudo pip3 install black 使用方法: -black ${CheckPath} +black ${CheckPath} 使用这个工具格式化之后,代码会被自动调整,刚开始你可能会觉得调整得很夸张,没关系坚持看,习惯之后,你会觉得很优雅,没错,这就是 Pythonic Code 的核心,请保持优雅~。 2. 代码扫描工具¶ 使用根目录下 pylint.sh 扫描代码,在 report 目录下查看代码扫描报告,如果有代码问题请提前解决之后再提交。 此脚本已经使用 Python 社区最流行的代码扫描工具 Pylint 进行代码扫描。 使用方法: -bash pylint.sh +bash pylint.sh 运行之后会提示你要扫描的目录,比如输入 apps ,则会扫描 apps 下的所有 Python 代码。 在 setting/pylintrc.cfg 配置文件里面进行相关配置,扫描完成之后在 report/pylints 目录下会生成扫描报告。 代码提交需通过 git review 提交到 gerrit ,人工 Code Review 通过之后合入代码。 十三、提交代码¶ 1. 安装依赖¶ -sudo apt install git-review +sudo apt install git-review 2. 提交模板¶ 在 ~ 目录下新建文件,并命名为 gitcommit_template 将以下内容写入文件当中: -# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 -fix: - -# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 -Description: - -# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 -Log: - -# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 -#Bug: - -# 修复 github issue -#Issue: - -# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 -#Task: +# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 +fix: + +# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 +Description: + +# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 +Log: + +# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 +#Bug: + +# 修复 github issue +#Issue: + +# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 +#Task: 命令行执行: -git config --global commit.template ~/gitcommit_template +git config --global commit.template ~/gitcommit_template 此命令将模板加入到 git 的提交模板中。 后续提交的时候需要关注一下几点: @@ -3083,19 +3103,19 @@ 2. 提交模板3. 推送代码¶ 首先添加 commit 信息 -git add 后面加文件名称 +git add 后面加文件名称 -git add . # 表示添加所有文件 +git add . # 表示添加所有文件 使用这条命令注意有些临时文件不要提交到仓库了。 -git commit -a +git commit -a 之后在 fix: 后面(注意冒号后面必须加空格,不然直接-1)写本地提交的 commit 信息,然后就可以提交代码了 -git review branch(当前分支) -r origin +git review branch(当前分支) -r origin 最好一次 commit,一次 git review ,经常有同学在本地疯狂 commit 最后 git review 报错不知道咋回事儿。 若不想每次提交都加上 -r 选项,执行以下命令: -git config --global gitreview.remote origin +git config --global gitreview.remote origin 提交代码,直接使用 git review branch<目标分支>,例如 git review master 4. Git标签¶ @@ -3106,74 +3126,74 @@ 4. Git标签git tag -a <tagname> +git tag -a <tagname> 回车之后,Git 会打开你的编辑器,让你写一句标签注解,就像你给提交写注解一样。 查看所有标签 -git tag -l -# git tag 也行 +git tag -l +# git tag 也行 删除标签 -git tag -d <tagname> +git tag -d <tagname> 推送标签至远程 git push 命令并不会传送标签到远程仓库服务器上,必须显式地推送标签。 -git push origin <tagname> +git push origin <tagname> 推送所有不在远程仓库服务器上的标签 -git push origin --tag +git push origin --tag 删除远程标签 -git push origin :refs/tag/<tagname> +git push origin :refs/tag/<tagname> 后期打标签 先用 git log --pretty=oneline 查询提交记录,获取校验码。 -git tag -a <tagname> 9fceb02(校验码) +git tag -a <tagname> 9fceb02(校验码) 检出标签 -git checkout <tagname> +git checkout <tagname> 此时,仓库会处于“分离头指针(detached HEAD)”的状态。 在“分离头指针”状态下,如果你做了某些更改然后提交它们,标签不会发生变化, 但你的新提交将不属于任何分支,并且将无法访问,除非通过确切的提交哈希才能访问。 因此,如果你需要进行更改,比如你要修复旧版本中的错误,那么通常需要创建一个新分支: -git checkout -b <NewBranchName> <tagname> +git checkout -b <NewBranchName> <tagname> 新分支上可以进行提交代码。 十四、常见问题¶ 1. 提交代码时提示邮箱或者名称不对¶ 重新配置邮箱或者名称,然后重置生效: -git commit --amend --reset-author +git commit --amend --reset-author 2. 怎么回滚到之前的版本¶ (1)查询历史提交记录 -git log +git log 找到你要回滚的版本,复制 hash 值。 注意:是 commit 空格之后的 hash 值,之前有同学复制的 Change-Id: 这样肯定报错。 (2)回滚版本,不清除代码 -git reset --soft ${hash} +git reset --soft ${hash} (3)回滚版本,清除代码,慎用哈 -git reset --hard ${hash} +git reset --hard ${hash} 3. 测试报告里面 F S . E 是什么意思¶ F 表示失败,. (点)表示通过,S 表示跳过,E 表示 error 有报错 4. 解决 git status 中文显示的问题¶ -git config --global core.quotePath false +git config --global core.quotePath false 5. apps 目录下颜色有些是黄色的¶ 在 Pycharm 中 apps 目录下应用库文件是黄色的,编辑器识别不到代码新增和修改; @@ -3184,22 +3204,22 @@ 5. apps 目录下颜色有些是黄色的6. 执行 env.sh 报错 $'\r':未找到命令¶ 出现这个问题你应该是在 windows 上打开或编辑过 env.sh 脚本,windows下的换行是回车符+换行符,也就是\r\n,而 Linxu 下是换行符 \n,Linux 下不识别 \r,因此报错。 解决方案: -# 将 \r 替换为空 -sudo sed -i 's/\r//' env.sh +# 将 \r 替换为空 +sudo sed -i 's/\r//' env.sh 7.怎样为单独某一条用例配置执行超时时间¶ 在用例脚本中添加装饰器,如下: -@pytest.mark.timeout(300) # 单位秒 -def test_xxx_001(): - pass +@pytest.mark.timeout(300) # 单位秒 +def test_xxx_001(): + pass 8. 如何拉取 YouQu 自动化项目所有代码,包含子仓库¶ 前置条件:已申请访问 YouQu 权限群组 -# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) -git config --global credential.helper store - -# 拉取YouQu框架代码,并递归拉取子仓库代码 -git clone "http://gerrit.uniontech.com/youqu" --recursive +# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) +git config --global credential.helper store + +# 拉取YouQu框架代码,并递归拉取子仓库代码 +git clone "http://gerrit.uniontech.com/youqu" --recursive 9. 如何拉取 YouQu 自动化项目中指定子仓库的代码¶ 前置条件: @@ -3207,22 +3227,22 @@ 9. 如何拉取 YouQu 自动化项目中指定子仓库的代 已申请访问 YouQu 权限群组 已存储访问密码 -# 拉取YouQu框架代码 -git clone "http://gerrit.uniontech.com/youqu" - -# 指定拉取子仓库代码 -cd youqu -git submodule update --init apps/autotest_xxx_xxx +# 拉取YouQu框架代码 +git clone "http://gerrit.uniontech.com/youqu" + +# 指定拉取子仓库代码 +cd youqu +git submodule update --init apps/autotest_xxx_xxx 10. 如何更新 YouQu 自动化项目中,所有子仓库的代码¶ 更新所有子仓库代码 -cd youqu -git pull & git submodule foreach git pull +cd youqu +git pull & git submodule foreach git pull 11. 如何修复 YouQu 所有子仓库 master 分支游离头(detached head)¶ 修复所有子仓库默认master 分支游离头 -cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
远程执行就是用本地作为服务端控制远程机器执行,远程机器执行的用例相同;
使用 remote 命令:
remote
youqu manage.py remote
多机器分布式异步执行就是由本地 YouQu 作为服务端,控制远程 N 台机器执行相同的用例,执行完之后所有测试机的测试结果会返回给服务端 report 目录下;
远程执行同样通过配置文件 setting/globalconfig.ini 进行用例相关配置;
setting/globalconfig.ini
需要重点说一下远程执行时的测试机信息配置,在配置文件 setting/remote.ini 里面配置测试机的用户名、IP、密码。
setting/remote.ini
;=============================== CLIENT LIST ===================================== @@ -1206,49 +1299,47 @@ 2.2. 远程执行user = uos ip = 10.8.11.xx
有多少台机器就像这样挨着写就行了。
有多少台机器就像这样参考上面的格式写就行了。
然后在命令行:
这样运行是从配置文件去读取相关配置。
如果你不想通过配置文件,你仍然通过命令行参数进行传参,
以下为 python3 manage.py remote 提供的一些参数选项:
python3 manage.py remote
-a APP, --app APP 应用名称:deepin-music 或 autotest_deepin_music 或 - apps/autotest_deepin_music - -c CLIENTS, --clients CLIENTS - 远程机器的user@ip:password,多个机器用'/'连接,如果password不传入,默认取 - setting/remote.ini 中 CLIENT_PASSWORD - 的值,比如:uos@10.8.13.33:1 或 uos@10.8.13.33 - -k KEYWORDS, --keywords KEYWORDS - 用例的关键词,支持and/or/not逻辑组合 - -t TAGS, --tags TAGS 用例的标签,支持and/or/not逻辑组合 - -s {yes,no,}, --send_code {yes,no,} - 发送代码到测试机(不含report目录) - -e, --build_env 搭建测试环境,如果为yes,不管send_code是否为yes都会发送代码到测试机. - -p CLIENT_PASSWORD, --client_password CLIENT_PASSWORD - 测试机密码(全局) - -y PARALLEL, --parallel PARALLEL - yes:表示所有测试机并行跑,执行相同的测试用例,no - :表示测试机分布式执行,服务端会根据收集到的测试用例自动分配给各个测试机执行。 - --rerun RERUN 失败重跑次数 - --clean {yes,} 清理环境 - --report_formats REPORT_FORMATS - 测试报告格式 - --log_level LOG_LEVEL - 日志输出级别 - --timeout TIMEOUT 单条用例超时时间 - --debug DEBUG 调试模式 - --noskip {yes,} csv文件里面标记了skip跳过的用例不生效 - --ifixed {yes,} fixed不生效,仅通过skip跳过用例 - --send_pms SEND_PMS 数据回填 - --task_id TASK_ID 测试单ID - --deb_path DEB_PATH 需要安装deb包的本地路径 + -h, --help show this help message and exit + -c CLIENTS, --clients CLIENTS + 远程机器的user@ip:password,多个机器用'/'连接,如果password不传入,默认取sett + ing/remote.ini中CLIENT_PASSWORD的值,比如: uos@10.8.13.33:1 + 或 uos@10.8.13.33 + -s, --send_code 发送代码到测试机(不含report目录) + -e, --build_env 搭建测试环境,如果为yes,不管send_code是否为yes都会发送代码到测试机. + -p CLIENT_PASSWORD, --client_password CLIENT_PASSWORD + 测试机密码(全局) + -y PARALLEL, --parallel PARALLEL + yes:表示所有测试机并行跑,执行相同的测试用例;no:表示测试机分布式执行,服务端会根据收集到的测试用例自 + 动分配给各个测试机执行。 +除了这些特有参数以外,它同样支持本地执行的所有参数; 在命令行这样运行: youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k "xxx" -t "xxx" 所有用例执行完之后会在 report 目录下回收各个测试机执行的测试报告。 +注意,如果远程机器没有搭建自动化测试环境,记得加上参数 -e : +youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k "xxx" -t "xxx" -e + +执行前确保远程机器已经开启了 ssh 服务,否则会提示无法连接,如果没有开启,请手动开启: +sudo systemctl restart ssh +sudo systemctl enable ssh + 配置文件其他相关配置项详细说明,请查看配置文件中的注释内容。 +2.2.2. 远程多机器分布式异步负载均衡执行¶ +多机器分布式异步负载均衡执行也是用本地作为服务端控制远程机器执行,但远程机器执行的用例不同,而是所有远程机器执行的用例之和,为你想要执行的用例集; +似乎有点难以理解,我用大白话举例描述下就是,服务端想要执行 10 条用例,现在远程机器有 5 台; +然后服务端就先拿着第 1 条用例给远程 1 号机执行,拿第 2 条用例给远程 2 号机执行...,如此循环直到所有用例执行完,这就是负载均衡执行。 + +使用方法和前面一样,只是需要增加一个参数: +youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k "xxx" -t "xxx" --parallel no + 2.3. PMS 数据回填¶ 测试单关联的用例,自动化测试对应的去跑这些关联的用例,并且将执行的结果回填的测试用例的状态里面。 PMS 数据回填主要有三种方式: @@ -1256,35 +1347,35 @@ 2.3. PMS 数据回填在用例执行的过程中,采用异步的方式去进行数据回填,直白的讲就是,第二条用例开始跑的时候,通过子线程去做第一条用例的数据回填,如此循环,直到所有用例执行结束; 这种方案的时间效率最高的,因为理论上用例的执行时间是大于数据回填的接口请求时间的,也就是说,当用例执行完之后,数据回填也完成了。 使用方法,在 globalconfig.ini 里面配置以下参数:(以下涉及到的参数配置都是在配置文件里面进行配置) -PMS_USER = PMS账号 -PMS_PASSWORD = PMS密码 -SEND_PMS = async -TASK_ID = 测试单ID -TRIGGER = auto -APP_NAME = 这个参数可填可不填,但是填了可以提高用例的执行速度,因为在用例收集阶段可以指定到具体的应用库。(下同) +PMS_USER = PMS账号 +PMS_PASSWORD = PMS密码 +SEND_PMS = async +TASK_ID = 测试单ID +TRIGGER = auto +APP_NAME = 这个参数可填可不填,但是填了可以提高用例的执行速度,因为在用例收集阶段可以指定到具体的应用库。(下同) (2)用例执行完之后回填 等所有用例执行完之后,再逐个进行回填的接口请求,此方案时间效率比较低。 使用方法: -PMS_USER = PMS账号 -PMS_PASSWORD = PMS密码 -SEND_PMS = finish -TASK_ID = 测试单ID -TRIGGER = auto -APP_NAME = +PMS_USER = PMS账号 +PMS_PASSWORD = PMS密码 +SEND_PMS = finish +TASK_ID = 测试单ID +TRIGGER = auto +APP_NAME = (3)手动回填 所有用例执行完之后不做回填的接口请求,后续手动将结果进行回填请求。 用例执行时配置: -PMS_USER = PMS账号 -PMS_PASSWORD = PMS密码 -SEND_PMS = finish -TASK_ID = 测试单ID -TRIGGER = hand -APP_NAME = +PMS_USER = PMS账号 +PMS_PASSWORD = PMS密码 +SEND_PMS = finish +TASK_ID = 测试单ID +TRIGGER = hand +APP_NAME = 后续手动回填方法: -youqu manage.py pms --send2task yes +youqu manage.py pms --send2task yes 可能遇到的问题¶ 由同学可能会发现,怎么回填一次之后,后面想再次回填就不生效了; @@ -1292,62 +1383,62 @@ 可能遇到的问题2.4. 导出 CSV 文件¶ 框架提供导出指定标签用例的功能: -youqu manage.py exportcsv -a deepin-album -t CICD +youqu manage.py exportcsv -a deepin-album -t CICD 表示导出 deepin-album 的用例中标记了 CICD 标签的用例,导出 CSV 文件的字段格式已经适配了 CICD 的要求。 2.5. 脚手架新建 APP 工程¶ 新建一个 APP 工程: -youqu manage.py startapp autotest_deepin_some +youqu manage.py startapp autotest_deepin_some 这样在 apps 目录下会创建一个子项目工程 autotest_deepin_some,同时新建好工程模板目录和模板文件: -apps -└── autotest_deepin_some - ├── case - │ ├── assert_res - │ │ └── readme - │ ├── base_case.py - │ └── __init__.py - ├── config.ini - ├── config.py - ├── conftest.py - ├── control - ├── deepin_some_assert.py - ├── deepin_some.csv - ├── __init__.py - └── widget - ├── base_widget.py - ├── case_res - │ └── readme - ├── deepin_some_widget.py - ├── __init__.py - ├── other.ini - ├── other_widget.py - ├── pic_res - │ └── readme - └── ui.ini +apps +└── autotest_deepin_some + ├── case + │ ├── assert_res + │ │ └── readme + │ ├── base_case.py + │ └── __init__.py + ├── config.ini + ├── config.py + ├── conftest.py + ├── control + ├── deepin_some_assert.py + ├── deepin_some.csv + ├── __init__.py + └── widget + ├── base_widget.py + ├── case_res + │ └── readme + ├── deepin_some_widget.py + ├── __init__.py + ├── other.ini + ├── other_widget.py + ├── pic_res + │ └── readme + └── ui.ini autotest_deepin_some 是你的工程名称,比如:autotest_deepin_music ; 在此基础上,你可以快速的开始你的 AT 项目。 2.6. 用例标签自动同步¶ 用于自动同步 PMS 用例标签数据至本地 CSV 文件,主要通过以下几个配置来控制: -APP_NAME = # 指定要同步的应用名称 -PMS_USER = # PMS的用户名 -PMS_PASSWORD = # PMS的密码 +APP_NAME = # 指定要同步的应用名称 +PMS_USER = # PMS的用户名 +PMS_PASSWORD = # PMS的密码 在 [csv_link_pms_id] 节点下指定 csv 文件名与 PMS 用例模块的对应关系,比如: -[csv_link_pms_id] -;同步PMS数据到本地CSV文件,必须要配置的配置项 -;key是本地CSV文件的文件名称; -;value是对应PMS上的模块ID; -;比如要同步音乐的数据, 首先需要将配置 APP_NAME = deepin-music, -;CSV文件名称为music.csv,其在PMS上的用例为: https://pms.uniontech.com/testcase-browse-53.html -;因此应该配置为: music = 53 -;这样才能将PMS与本地CSV文件建立联系。 -;如果你的应用分了很多模块,只需要将对应的信息依次配置好就行了。 -music = 53 +[csv_link_pms_id] +;同步PMS数据到本地CSV文件,必须要配置的配置项 +;key是本地CSV文件的文件名称; +;value是对应PMS上的模块ID; +;比如要同步音乐的数据, 首先需要将配置 APP_NAME = deepin-music, +;CSV文件名称为music.csv,其在PMS上的用例为: https://pms.uniontech.com/testcase-browse-53.html +;因此应该配置为: music = 53 +;这样才能将PMS与本地CSV文件建立联系。 +;如果你的应用分了很多模块,只需要将对应的信息依次配置好就行了。 +music = 53 将以上信息配置好之后,在命令行执行: -youqu manage.py pms --pms2csv yes +youqu manage.py pms --pms2csv yes 每次执行时原 csv 文件会自动备份在 report/csv_back 目录下,因此你不用担心脚本执行导致你的数据丢失。 diff --git a/search/search_index.json b/search/search_index.json index 91ebe84c..c7cfc7a2 100644 --- a/search/search_index.json +++ b/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\u200b\\u3000\\-\u3001\u3002\uff0c\uff0e\uff1f\uff01\uff1b]+","pipeline":["stemmer"]},"docs":[{"location":"","title":"\u9996\u9875","text":""},{"location":"#youqu","title":"\u6709\u8da3\uff08YouQu\uff09","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/4/1\n# Author : Mikigo\n# =============================================\n \u672c\u7ad9\u603b\u8bbf\u95ee\u91cf \u6b21 \u6b22\u8fce\u5728\u6d4f\u89c8\u5668\u8bbf\u95ee\u3010\u516c\u7f51\u6587\u6863\u3011 \u7edf\u4fe1\u516c\u53f8\u5185\u7f51\u8fd8\u53ef\u4ee5\u8bbf\u95ee\u3010\u5185\u7f51\u6587\u6863\u3011\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u54e6~~"},{"location":"#_1","title":"\u4e00\u3001\u7b80\u4ecb","text":"\u6709\u8da3\uff08YouQu\uff09\u662f\u6df1\u5ea6\u79d1\u6280\u8bbe\u8ba1\u548c\u5f00\u53d1\u7684\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff0c\u91c7\u7528\u7ed3\u6784\u5206\u5c42\u7684\u8bbe\u8ba1\u7406\u5ff5\uff0c\u652f\u6301\u591a\u5143\u5316\u5143\u7d20\u5b9a\u4f4d\u548c\u65ad\u8a00\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\u3001\u5f3a\u5927\u7684\u65e5\u5fd7\u548c\u62a5\u544a\u8f93\u51fa\u7b49\u7279\u8272\u529f\u80fd\uff0c\u540c\u65f6\u5b8c\u7f8e\u517c\u5bb9X11\u3001Wayland\u663e\u793a\u534f\u8bae\uff0c\u73af\u5883\u90e8\u7f72\u7b80\u5355\uff0c\u64cd\u4f5c\u6613\u4e0a\u624b\u3002"},{"location":"#17","title":"\u7231\u4e0a \u201c\u6709\u8da3\u201d \u7684 17 \u4e2a\u7406\u7531","text":" \u6838\u5fc3\u5e93\u63d0\u4f9b\u4e86\u7edf\u4e00\u7684\u63a5\u53e3\uff0c\u7f16\u5199\u65b9\u6cd5\u65f6\u53ea\u9700\u8981\u5bfc\u5165\u4e00\u4e2a\u5305\u5c31\u53ef\u4ee5\u4f7f\u7528\u5230\u6838\u5fc3\u5e93\u63d0\u4f9b\u7684\u6240\u6709\u529f\u80fd\uff1b \u516c\u5171\u5e93\u5c01\u88c5\u4e86\u5f88\u591a\u5e38\u7528\u6a21\u5757\u7684\u76f8\u5173\u65b9\u6cd5\uff0c\u6bd4\u5982\uff1a\u4efb\u52a1\u680f\u7684\u64cd\u4f5c\u3001\u684c\u9762\u7684\u64cd\u4f5c\u3001\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\u7b49\u7b49\uff1b \u9664\u4e86\u5e38\u7528\u7684\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u8bc6\u522b\u4ee5\u5916\uff0c\u6211\u4eec\u8fd8\u63d0\u4f9b\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u5176\u4f7f\u7528\u7b80\u5355\u4e14\u9ad8\u6548\uff0c\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff1b \u5bf9\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u5c06\u7f16\u5199\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u53d8\u5f97\u7b80\u5355\u800c\u4f18\u96c5\uff1b \u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u6280\u672f\u8fdb\u884c\u529f\u80fd\u5347\u7ea7\uff0c\u9664\u4e86\u652f\u6301\u5355\u4e2a\u5750\u6807\u8fd4\u56de\uff0c\u8fd8\u652f\u6301\u540c\u4e00\u754c\u9762\u4e0b\u591a\u4e2a\u76f8\u540c\u5143\u7d20\u8fd4\u56de\u591a\u4e2a\u5750\u6807\u7684\u529f\u80fd\uff1b \u63d0\u4f9b\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u548c\u6279\u91cf\u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u4e0d\u5230\u4e00\u4e2a csv \u6587\u4ef6\u539f\u6765\u80fd\u5e72\u8fd9\u4e48\u591a\u4e8b\u60c5\uff1b \u63d0\u4f9b\u4e86\u529f\u80fd\u5f3a\u5927\u7684\u6267\u884c\u5668\u5165\u53e3\uff0c\u8ba9\u4f60\u53ef\u4ee5\u65b9\u4fbf\u7684\u5728\u672c\u5730\u6267\u884c\u4efb\u4f55\u7528\u4f8b\u96c6\u7684\u7528\u4f8b\uff0c\u5176\u4e30\u5bcc\u7684\u81ea\u5b9a\u4e49\u914d\u7f6e\u9879\uff0c\u6ee1\u8db3\u4f60\u5bf9\u6267\u884c\u5668\u6240\u6709\u7684\u5e7b\u60f3\uff1b \u63d0\u4f9b\u8fdc\u7a0b\u6267\u884c\u7684\u529f\u80fd\uff0c\u53ef\u4ee5\u63a7\u5236\u591a\u53f0\u673a\u5668\u5e76\u884c\u8dd1\uff0c\u6216\u8005\u5206\u5e03\u5f0f\u8dd1\uff0c\u8fd9\u79cd\u4ed8\u8d39\u529f\u80fd\u73b0\u5728\u514d\u8d39\u7ed9\u4f60\u7528\uff1b \u63d0\u4f9b\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u529f\u80fd\uff0c\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u6bcf\u4e2a\u65b9\u6cd5\u5355\u72ec\u5199\u8f93\u51fa\u65e5\u5fd7\u7684\u4ee3\u7801\uff0c\u4e00\u5207\u6211\u4eec\u7ed9\u4f60\u641e\u5b9a\u4e86\uff0c\u65e5\u5fd7\u8f93\u51fa\u4e0d\u4ec5\u5185\u5bb9\u4e30\u5bcc\uff0c\u989c\u503c\u4e5f\u7edd\u5bf9\u5728\u7ebf\uff0c\u6211\u4eec\u8fd8\u81ea\u5df1\u8bbe\u8ba1\u4e86\u4e00\u6b3e\u7ec8\u7aef\u8f93\u51fa\u4e3b\u9898\u53eb\u300a\u4e94\u5f69\u6591\u6593\u7684\u9ed1\u300b\uff1b \u63d0\u4f9b\u4e86\u4e00\u952e\u90e8\u7f72\u81ea\u52a8\u5316\u6d4b\u8bd5\u73af\u5883\u7684\u529f\u80fd\uff0c\u8fde\u4ee3\u7801\u7f16\u8f91\u5668\u90fd\u7ed9\u4f60\u88c5\u597d\u4e86\uff0c\u8ba9\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u73af\u5883\u90e8\u7f72\u800c\u70e6\u607c\uff1b \u63d0\u4f9b\u4e86\u81ea\u52a8\u751f\u6210\u591a\u79cd\u62a5\u544a\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u8f93\u51fa\u4ec0\u4e48\u62a5\u544a\u5f62\u5f0f\u90fd\u884c\uff0c\u800c\u4e14\u6211\u4eec\u5728\u62a5\u544a\u4e2d\u8fd8\u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\u548c\u5931\u8d25\u622a\u56fe\u7684\u529f\u80fd\uff1b \u5bf9\u65ad\u8a00\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u63d0\u4f9b\u66f4\u53cb\u597d\u5316\u7684\u9519\u8bef\u63d0\u793a\uff0c\u8ba9\u5b9a\u4f4d\u95ee\u9898\u7cbe\u51c6\u9ad8\u6548\uff1b \u4e0d\u4ec5\u652f\u6301\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u63a7\u5236\uff0c\u800c\u4e14\u8fd8\u652f\u6301\u52a8\u6001\u63a7\u5236\u7528\u4f8b\u6279\u91cf\u6267\u884c\u7684\u603b\u65f6\u95f4\uff0c\u786e\u4fdd CI \u73af\u5883\u4e0b\u80fd\u987a\u7545\u8fd0\u884c\uff1b \u652f\u6301\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\u6267\u884c\u3001PMS \u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6807\u7b7e\u5316\u6267\u884c\u65b9\u6848\uff0c\u6ee1\u8db3\u4f60\u5404\u79cd\u573a\u666f\u4e0b\u7684\u6267\u884c\u9700\u6c42\uff1b \u652f\u6301\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u529f\u80fd\uff0c\u53ef\u5b9a\u4f4d\u53ef\u65ad\u8a00\uff0c\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\uff1b \u5b8c\u7f8e\u517c\u5bb9 Wayland \u548c X11\uff0c\u771f\u6b63\u505a\u5230\u4e00\u5957\u4ee3\u7801\uff0c\u968f\u5904\u6267\u884c\uff1b \u652f\u6301\u591a\u79cd\u65b9\u5f0f\u7684\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u5176\u4e2d\u5f02\u6b65\u56de\u586b\u7684\u65b9\u6848\uff0c\u5b8c\u7f8e\u89e3\u51b3\u4e86\u6570\u636e\u56de\u586b\u7684\u8017\u65f6\u95ee\u9898\uff1b \u3010\u89c6\u9891\u4ecb\u7ecd\u3011"},{"location":"#_2","title":"\u4e8c\u3001\u5b89\u88c5\u4f7f\u7528","text":"\u57fa\u7840\u6846\u67b6\uff1ahttps://github.com/linuxdeepin/deepin-autotest-framework \u4ece PyPI \u5b89\u88c5: sudo pip3 install youqu\n \u521b\u5efa\u9879\u76ee: youqu-startproject youqu\n \u5b89\u88c5\u4f9d\u8d56: cd youqu\nbash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002 \u5e94\u7528\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684\u5e94\u7528\u540d\u79f0\u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music cd apps/\n \u5c06\u5e94\u7528\u5e93\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u50cf\u8fd9\u6837\uff1a youqu\n\u251c\u2500\u2500 apps\n\u2502 \u251c\u2500\u2500 autotest_deepin_music # \u5e94\u7528\u5e93\n...\n \u5e94\u7528\u5e93\u7684\u540d\u79f0\u4e0d\u53ef\u4ee5\u4fee\u6539\u3002"},{"location":"#_3","title":"\u4e09\u3001\u8fd0\u884c","text":""},{"location":"#1","title":"1. \u5de5\u4f5c\u7a7a\u95f4","text":"\u57fa\u7840\u6846\u67b6\u5de5\u7a0b\u76ee\u5f55\u5efa\u8bae\u653e\u5728 ~ \u76ee\u5f55\u4e0b\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u4e5f\u53ef\u4ee5\u8fd0\u884c\uff0c\u4f46\u662f\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u9700\u8981\u505a\u73af\u5883\u6e05\u7406\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u5b58\u5728\u4ee3\u7801\u88ab\u5220\u9664\u7684\u98ce\u9669\u3002 \u5982\u679c\u4f60\u7684\u673a\u5668\u4e0a\u4e0d\u540c\u76ee\u5f55\u4e0b\u5b58\u5728\u591a\u4e2a YouQu \u5de5\u7a0b\uff0c\u90a3\u4e48\u5728\u8fd0\u884c\u4e4b\u524d\uff0c\u8bf7\u5148\u6267\u884c env.sh \u6821\u6b63\u76f8\u5173\u73af\u5883\u3002"},{"location":"#2","title":"2. \u6267\u884c\u5668","text":"\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u6709\u4e00\u4e2a manage.py \uff0c\u5b83\u662f\u4e00\u4e2a\u6267\u884c\u5668\u5165\u53e3\uff0c\u63d0\u4f9b\u4e86\u672c\u5730\u6267\u884c\u3001\u8fdc\u7a0b\u6267\u884c\u7b49\u7684\u529f\u80fd\u3002 \u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6765\u6267\u884c\uff1a youqu manage.py run -a deepin-music\n"},{"location":"#21","title":"2.1. \u672c\u5730\u6267\u884c","text":"youqu manage.py run\n"},{"location":"#211","title":"2.1.1. \u914d\u7f6e\u6587\u4ef6","text":"\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u914d\u7f6e\u53c2\u6570 \u5728\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u91cc\u9762\u652f\u6301\u914d\u7f6e\u5bf9\u6267\u884c\u7684\u4e00\u4e9b\u53c2\u6570\u8fdb\u884c\u914d\u7f6e\uff0c\u5e38\u7528\u7684\u5982\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;1\u3001KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2\u3001KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f, e.g. TAGS = L1 or smoke\n;\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\uff0c\u5c06\u8981\u6267\u884c\u7684\u7528\u4f8b\u5199\u5165\u6307\u5b9a\u7684 csv \u6587\u4ef6\n;\u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u4ece\u57fa\u7840\u6846\u67b6\u6839\u76ee\u5f55\u5f00\u59cb\uff1ae.g. CASE_FILE = case_list.txt\n;\u5982\u679c\u8fd9\u91cc\u6709\u503c\uff0cAPP_NAME KEYWORDS TAGS \u7684\u914d\u7f6e\u5747\u4e0d\u751f\u6548\nCASE_FILE =\n;=============================== RUNNER CONFIG ===================================\n[runner]\n;\u6700\u5927\u5931\u8d25\u7528\u4f8b\u6570\u91cf\u7684\u5360\u6bd4\n;\u6bd4\u5982\uff1a\u603b\u6267\u884c\u7528\u4f8b\u6570\u4e3a100, \u82e5 MAX_FAIL = 0.5,\u5219\u5931\u8d25\u7528\u4f8b\u6570\u8fbe\u523050\u5c31\u4f1a\u7ec8\u6b62\u6d4b\u8bd5\u3002\nMAX_FAIL = 0.5\n;\u5355\u6761\u7528\u4f8b\u7684\u8d85\u65f6\u65f6\u95f4\uff0c\u5982\u679c\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u8d85\u65f6\uff0c\u8fd9\u6761\u7528\u4f8b\u4f1a\u88ab\u505c\u6b62\uff0c\u540e\u7eed\u7528\u4f8b\u7ee7\u7eed\u6267\u884c\u3002\n;\u5355\u4f4d\u4e3a\u79d2\n; \u8fd9\u662f\u4e00\u4e2a\u5168\u5c40\u7edf\u4e00\u914d\u7f6e\uff0c\u5982\u679c\u67d0\u6761\u7528\u4f8b\u9700\u8981\u5355\u72ec\u914d\u7f6e\u8d85\u65f6\u65f6\u95f4\uff0c\u53ef\u4ee5\u5728\u7528\u4f8b\u4e2d\u8fd9\u6837\u5199\uff1a\n;@pytest.mark.timeout(500)\n;def test_xxx_001():\n; ...\n;\u4f1a\u8bdd\uff08\u6240\u6709\u7528\u4f8b\u6267\u884c\u7684\uff09\u8d85\u65f6\u662f\u6839\u636e\u5168\u5c40\u8d85\u65f6\u914d\u7f6e\u548c\u7528\u4f8b\u5355\u72ec\u8d85\u65f6\u914d\u7f6e\u81ea\u52a8\u8ba1\u7b97\u7684\uff1b\nCASE_TIME_OUT = 200\n;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\u3002\n;\u6ce8\u610f\uff0c\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u4e0d\u80fd\u5c0f\u4e8e\u5931\u8d25\u5f55\u5c4f\u6b21\u6570\uff0c\u5373 RERUN >= RECORD_FAILED_CASE\nRECORD_FAILED_CASE = 1\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = INFO\n;yes \u6bcf\u6761\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u8fdb\u884c\u73af\u5883\u6e05\u7406\nCLEAN_ALL = yes\n;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\nRESOLUTION = 1920x1080\n;\u4e0d\u8df3\u8fc7\u7528\u4f8b\uff0ccsv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86 skip-xxx\u7684\u7528\u4f8b\u4e0d\u8df3\u8fc7\nNOSKIP = no\n;ignore fixed\n;no\uff0c\u53ea\u8981\u6807\u8bb0\u4e86fixed\u7684\u7528\u4f8b\uff0c\u5373\u4f7f\u6807\u8bb0\u4e86skip-\uff0c\u4e5f\u4f1a\u6267\u884c\uff1b\n;yes\uff0cfixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\uff1b\nIFIXED = no\n;\u8981\u5b89\u88c5deb\u5305\u7684\u8def\u5f84\n;e.g : ~/Downloads/ \u5b89\u88c5\u4e0b\u8f7d\u76ee\u5f55\u4e0b\u7684deb\u5305\uff0c\u5982\u679c\u662f\u8fdc\u7a0b\u6267\u884c\uff0c\u4f1a\u81ea\u52a8\u62f7\u8d1d\u5230\u8fdc\u7a0b\u5e76\u5b89\u88c5\u3002\nDEB_PATH =\n;DEBUG \u6a21\u5f0f\u6267\u884c\u7528\u4f8b\uff0c\u53ea\u6536\u96c6\u4e0d\u6267\u884c\u7528\u4f8b\uff0c\u4e5f\u4e0d\u505a\u8bbe\u5907\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002\nDEBUG = no\n;\u8bb0\u5f55top\u547d\u4ee4\u67e5\u8be2\u7684\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0cTOP = 3 \u8868\u793a\u8bb0\u5f55\u524d3\u4e2a\u8fdb\u7a0b\u3002\nTOP =\n;\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\nREPEAT =\n;\u9ed8\u8ba4\u5728\u6240\u6709\u6d4b\u8bd5\u5b8c\u6210\u4e4b\u540e\u8f93\u51fa\u62a5\u9519\u4fe1\u606f.\n;yes, \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\nDURING_FAIL = no\n;=============================== REPORT CONFIG ===================================\n[report]\n;\u7528\u4f8b\u6267\u884c\u5b8c\u540e\u751f\u6210\u7684\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n;\u76ee\u524d\u652f\u6301 allure, xml, json \uff08\u652f\u6301\u540c\u65f6\u751f\u6210\uff09\nREPORT_FORMAT = allure, xml, json\n;\u6307\u5b9a\u62a5\u544a\u751f\u6210\u7684\u8def\u5f84\uff08\u76f8\u5bf9\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\uff09\nALLURE_REPORT_PATH = report/\nXML_REPORT_PATH = report/\nJSON_REPORT_PATH = report/\n;=============================== GLOBAL CONFIG ===================================\n[globalconfig]\n;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\nPASSWORD = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\nIMAGE_MATCH_NUMBER = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6bcf\u6b21\u95f4\u9694\u7b49\u5f85\u65f6\u95f4\nIMAGE_MATCH_WAIT_TIME = 1\n;\u56fe\u50cf\u8bc6\u522b\u5339\u914d\u5ea6\nIMAGE_RATE = 0.9\n;\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u5b9e\u65f6\u56fe\u50cf\u4fdd\u5b58\u8def\u5f84\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u5750\u6807\nSCREEN_CACHE = /tmp/screen.png\n;\u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\u7684\u8def\u5f84\nTMPDIR = /tmp/tmpdir\n;\u7cfb\u7edf\u4e3b\u9898\nSYS_THEME = deepin\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = http://youqu-dev.uniontech.com:8890\n;OpenCV\u670d\u52a1\u7aef\u5730\u5740\nOPENCV_SERVER_HOST = http://youqu-dev.uniontech.com:8889\n;=============================== PMS CONFIG ===================================\n;PMS\u76f8\u5173\u914d\u7f6e\uff0c\u5305\u542b\u4ee5\u4e0b\u51e0\u4e2a\u65b9\u9762\uff1a\n;1.PMS\u6d4b\u8bd5\u5957\u6267\u884c\n;2.\u81ea\u52a8\u4ecePMS\u722c\u53d6\u6570\u636e\u5e76\u540c\u6b65\u672c\u5730CSV\u6587\u4ef6\n;3.PMS\u6570\u636e\u56de\u586b\n[pms]\n;PMS\u7684\u7528\u6237\u540d: ut001234\nPMS_USER =\n;PMS\u7684\u5bc6\u7801\nPMS_PASSWORD =\n;PMS\u6d4b\u8bd5\u5957\u7684ID\n;\u5728PMS\u4e0a\u67e5\u770b\u7528\u4f8b\u201c\u5957\u4ef6\u201d\u94fe\u63a5: https://pms.uniontech.com/testsuite-view-495.html\n;\u6d4b\u8bd5\u5957ID\u4e3a: 495\nSUITE_ID =\n;\u6570\u636e\u56de\u586b\u5fc5\u987b\u5173\u8054PMS\u6d4b\u8bd5\u5355\n;\u5728PMS\u4e0a\u67e5\u770b\u6d4b\u8bd5\u5355\u94fe\u63a5: https://pms.uniontech.com/testtask-cases-20747.html\n;\u6d4b\u8bd5\u5355ID\u4e3a: 20747\nTASK_ID =\n;\u5c06\u6d4b\u8bd5\u7ed3\u679c\u6570\u636e\u56de\u586b\u5230PMS\n;\u4e3a\u7a7a: \u8868\u793a\u4e0d\u56de\u586b,\u4e0d\u4f1a\u5728\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u751f\u6210json\u7ed3\u679c\u6587\u4ef6;\n;async: \u8868\u793a\u9010\u6761\u5f02\u6b65\u56de\u586b,\u540e\u9762\u4e00\u6761\u6267\u884c\u5f00\u59cb\u65f6\u901a\u8fc7\u5b50\u7ebf\u7a0b\u5bf9\u524d\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u8fdb\u884c\u56de\u586b\uff0c\u5982\u6b64\u5b9e\u73b0\u65f6\u95f4\u6548\u7387\u6700\u5927\u5316;\n;finish: \u8868\u793a\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u6210\u4e4b\u540e\u9010\u4e2a\u56de\u586b(PMS\u4e0d\u652f\u6301\u5e76\u53d1);\nSEND_PMS =\n;\u6570\u636e\u56de\u586b\u7684\u89e6\u53d1\u8005\n;auto: \u6846\u67b6\u81ea\u52a8\u56de\u586b,\u914d\u5408SEND_PMS\u914d\u7f6e\u4f7f\u7528,\u4f60\u53ef\u4ee5\u9009\u62e9\u5728\u4e0d\u540c\u7684\u9636\u6bb5\u8fdb\u884c\u6570\u636e\u56de\u586b;\n;hand: \u624b\u52a8\u56de\u586b,\u6bcf\u6761\u7528\u4f8b\u4ecd\u7136\u4f1a\u751f\u6210json\u6587\u4ef6,\u4f46\u6846\u67b6\u4e0d\u4f1a\u8fdb\u884c\u6570\u636e\u56de\u586b,\u9700\u8981\u4f60\u53ef\u4ee5\u5728\u4f60\u60f3\u8981\u53d1\u9001\u7684\u65f6\u95f4\u70b9\u624b\u52a8\u89e6\u53d1\u56de\u586b;\nTRIGGER = auto\n;PMS\u56de\u586b\u7684\u91cd\u8bd5\u6b21\u6570\n;\u5982\u679c\u63a5\u53e3\u8bf7\u6c42\u5931\u8d25,\u4f1a\u8fdb\u884c\u91cd\u8bd5\nSEND_PMS_RETRY_NUMBER = 2\n[csv_link_pms_lib]\n;caselib: \u7528\u4f8b\u5e93\n;testcase: \u4ea7\u54c1\u5e93\u7528\u4f8b\nCASE_FROM = caselib\n[csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/caselib-browse-81.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 81\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic =\n[export_csv]\n;\u5bfc\u51fa\u7684csv\u6587\u4ef6\u540d\u79f0\uff0c\u9ed8\u8ba4 case_list.csv\nCSV_FILE = case_list.csv\n;exportcsv \u547d\u4ee4\u5bfc\u51fa case_list.csv \u6587\u4ef6\u65f6\u914d\u7f6e\u7684\u5b57\u6bb5\u540d\uff0c\u7528\u4f8b\u540d\u79f0\u9ed8\u8ba4\u5b58\u5728\u7b2c\u4e00\u5217\uff0c\u65e0\u9700\u6dfb\u52a0\nCSV_HEARD = \u7528\u4f8b\u7ea7\u522b,\u7528\u4f8b\u7c7b\u578b,\u6d4b\u8bd5\u7ea7\u522b,\u662f\u5426\u8df3\u8fc7\n \u914d\u7f6e\u5b8c\u6210\u4e4b\u540e\uff0c\u76f4\u63a5\u5728\u547d\u4ee4\u884c\u6267\u884c manage.py \u5c31\u597d\u4e86\u3002 youqu manage.py run\n"},{"location":"#212","title":"2.1.2. \u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a youqu manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--max_fail MAX_FAIL \u6700\u5927\u5931\u8d25\u7387\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--resolution RESOLUTION\n\u68c0\u67e5\u5206\u8fa8\u7387\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms {,async,finish}\n\u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--trigger {,auto,hand}\n\u89e6\u53d1\u8005\n-f CASE_FILE, --case_file CASE_FILE\n\u6839\u636e\u6587\u4ef6\u6267\u884c\u7528\u4f8b\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n--pms_user PMS_USER pms \u7528\u6237\u540d\n--pms_password PMS_PASSWORD\npms \u5bc6\u7801\n--suite_id SUITE_ID pms \u6d4b\u8bd5\u5957ID\n--pms_info_file PMS_INFO_FILE\npms \u4fe1\u606f\u6587\u4ef6\n--top TOP \u8fc7\u7a0b\u4e2d\u8bb0\u5f55top\u547d\u4ee4\u4e2d\u7684\u503c\n--lastfailed \u4ec5\u6267\u884c\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\n--duringfail \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\n--repeat REPEAT \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n--project_name PROJECT_NAME\n\u5de5\u7a0b\u540d\u79f0\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--build_location BUILD_LOCATION\n\u6784\u5efa\u5730\u533a\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--line LINE \u6267\u884c\u7684\u4e1a\u52a1\u7ebf\uff08\u5199\u5165json\u6587\u4ef6\uff09\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a youqu manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\"\n \u547d\u4ee4\u884c\u53c2\u6570\u4f18\u5148\u7ea7\u662f\u9ad8\u4e8e\u914d\u7f6e\u6587\u4ef6\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u4e86\u5bf9\u5e94\u7684\u53c2\u6570\uff0c\u914d\u7f6e\u6587\u4ef6\u4e2d\u4e0d\u7ba1\u662f\u5426\u914d\u7f6e\u5747\u4e0d\u751f\u6548\u3002 --app \u5165\u53c2\u8fd8\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\uff0c\u4e0b\u9762\u7684\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u540c\u6837\u652f\u6301\u3002"},{"location":"#22","title":"2.2. \u8fdc\u7a0b\u6267\u884c","text":"youqu manage.py remote\n \u8fdc\u7a0b\u6267\u884c\u540c\u6837\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u8fdb\u884c\u7528\u4f8b\u76f8\u5173\u914d\u7f6e\uff1b \u9700\u8981\u91cd\u70b9\u8bf4\u4e00\u4e0b\u8fdc\u7a0b\u6267\u884c\u65f6\u7684\u6d4b\u8bd5\u673a\u4fe1\u606f\u914d\u7f6e\uff0c\u5728\u914d\u7f6e\u6587\u4ef6 setting/remote.ini \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\u3001IP\u3001\u5bc6\u7801\u3002 ;=============================== CLIENT LIST =====================================\n; \u6d4b\u8bd5\u673a\u914d\u7f6e\u5217\u8868\n;[client{number}] ;\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u6709\u591a\u5c11\u53f0\u6d4b\u8bd5\u673a\u5c31\u5199\u591a\u5c11\u4e2a client\uff0c\u522b\u540d\u5fc5\u987b\u5305\u542b client \u5b57\u7b26\uff0c\u4e14\u4e0d\u80fd\u91cd\u590d\u3002\n;user = ;\u6d4b\u8bd5\u673a user\n;ip = ;\u6d4b\u8bd5\u673a ip\n;password = 1 ;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801, \u53ef\u4ee5\u4e0d\u914d\u7f6e\u6b64\u9879\uff0c\u9ed8\u8ba4\u53d6 CLIENT_PASSWORD \u7684\u503c\uff1b\n;\u5982\u679c\u4f60\u6240\u6709\u6d4b\u8bd5\u673a\u5bc6\u7801\u90fd\u76f8\u540c\uff0c\u90a3\u4e48\u53ea\u9700\u8981\u914d\u7f6e CLIENT_PASSWORD \u5c31\u53ef\u4ee5\u4e86\n;=================================================================================\n[client1]\nuser = uos\nip = 10.8.15.xx\n[client2]\nuser = uos\nip = 10.8.15.xx\n[client3]\nuser = uos\nip = 10.8.11.xx\n \u6709\u591a\u5c11\u53f0\u673a\u5668\u5c31\u50cf\u8fd9\u6837\u6328\u7740\u5199\u5c31\u884c\u4e86\u3002 \u7136\u540e\u5728\u547d\u4ee4\u884c\uff1a youqu manage.py remote\n \u8fd9\u6837\u8fd0\u884c\u662f\u4ece\u914d\u7f6e\u6587\u4ef6\u53bb\u8bfb\u53d6\u76f8\u5173\u914d\u7f6e\u3002 \u5982\u679c\u4f60\u4e0d\u60f3\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\uff0c\u4f60\u4ecd\u7136\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u8fdb\u884c\u4f20\u53c2\uff0c \u4ee5\u4e0b\u4e3a python3 manage.py remote \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-c CLIENTS, --clients CLIENTS\n\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679cpassword\u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6\nsetting/remote.ini \u4e2d CLIENT_PASSWORD\n\u7684\u503c,\u6bd4\u5982\uff1auos@10.8.13.33:1 \u6216 uos@10.8.13.33\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-s {yes,no,}, --send_code {yes,no,}\n\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a\uff08\u4e0d\u542breport\u76ee\u5f55\uff09\n-e, --build_env \u642d\u5efa\u6d4b\u8bd5\u73af\u5883,\u5982\u679c\u4e3ayes\uff0c\u4e0d\u7ba1send_code\u662f\u5426\u4e3ayes\u90fd\u4f1a\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a.\n-p CLIENT_PASSWORD, --client_password CLIENT_PASSWORD\n\u6d4b\u8bd5\u673a\u5bc6\u7801\uff08\u5168\u5c40\uff09\n-y PARALLEL, --parallel PARALLEL\nyes:\u8868\u793a\u6240\u6709\u6d4b\u8bd5\u673a\u5e76\u884c\u8dd1\uff0c\u6267\u884c\u76f8\u540c\u7684\u6d4b\u8bd5\u7528\u4f8b\uff0cno\n:\u8868\u793a\u6d4b\u8bd5\u673a\u5206\u5e03\u5f0f\u6267\u884c\uff0c\u670d\u52a1\u7aef\u4f1a\u6839\u636e\u6536\u96c6\u5230\u7684\u6d4b\u8bd5\u7528\u4f8b\u81ea\u52a8\u5206\u914d\u7ed9\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u3002\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms SEND_PMS \u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n \u5728\u547d\u4ee4\u884c\u8fd9\u6837\u8fd0\u884c\uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\"\n \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report \u76ee\u5f55\u4e0b\u56de\u6536\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u7684\u6d4b\u8bd5\u62a5\u544a\u3002 \u914d\u7f6e\u6587\u4ef6\u5176\u4ed6\u76f8\u5173\u914d\u7f6e\u9879\u8be6\u7ec6\u8bf4\u660e\uff0c\u8bf7\u67e5\u770b\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u6ce8\u91ca\u5185\u5bb9\u3002"},{"location":"#23-pms","title":"2.3. PMS \u6570\u636e\u56de\u586b","text":"\u6d4b\u8bd5\u5355\u5173\u8054\u7684\u7528\u4f8b\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u5bf9\u5e94\u7684\u53bb\u8dd1\u8fd9\u4e9b\u5173\u8054\u7684\u7528\u4f8b\uff0c\u5e76\u4e14\u5c06\u6267\u884c\u7684\u7ed3\u679c\u56de\u586b\u7684\u6d4b\u8bd5\u7528\u4f8b\u7684\u72b6\u6001\u91cc\u9762\u3002 PMS \u6570\u636e\u56de\u586b\u4e3b\u8981\u6709\u4e09\u79cd\u65b9\u5f0f\uff1a \uff081\uff09\u5f02\u6b65\u56de\u586b \u5728\u7528\u4f8b\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\uff0c\u91c7\u7528\u5f02\u6b65\u7684\u65b9\u5f0f\u53bb\u8fdb\u884c\u6570\u636e\u56de\u586b\uff0c\u76f4\u767d\u7684\u8bb2\u5c31\u662f\uff0c\u7b2c\u4e8c\u6761\u7528\u4f8b\u5f00\u59cb\u8dd1\u7684\u65f6\u5019\uff0c\u901a\u8fc7\u5b50\u7ebf\u7a0b\u53bb\u505a\u7b2c\u4e00\u6761\u7528\u4f8b\u7684\u6570\u636e\u56de\u586b\uff0c\u5982\u6b64\u5faa\u73af\uff0c\u76f4\u5230\u6240\u6709\u7528\u4f8b\u6267\u884c\u7ed3\u675f\uff1b \u8fd9\u79cd\u65b9\u6848\u7684\u65f6\u95f4\u6548\u7387\u6700\u9ad8\u7684\uff0c\u56e0\u4e3a\u7406\u8bba\u4e0a\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u662f\u5927\u4e8e\u6570\u636e\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\u65f6\u95f4\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u5f53\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u6570\u636e\u56de\u586b\u4e5f\u5b8c\u6210\u4e86\u3002 \u4f7f\u7528\u65b9\u6cd5\uff0c\u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u4ee5\u4e0b\u53c2\u6570\uff1a\uff08\u4ee5\u4e0b\u6d89\u53ca\u5230\u7684\u53c2\u6570\u914d\u7f6e\u90fd\u662f\u5728\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u914d\u7f6e\uff09 PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = async\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \u8fd9\u4e2a\u53c2\u6570\u53ef\u586b\u53ef\u4e0d\u586b\uff0c\u4f46\u662f\u586b\u4e86\u53ef\u4ee5\u63d0\u9ad8\u7528\u4f8b\u7684\u6267\u884c\u901f\u5ea6\uff0c\u56e0\u4e3a\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u53ef\u4ee5\u6307\u5b9a\u5230\u5177\u4f53\u7684\u5e94\u7528\u5e93\u3002\uff08\u4e0b\u540c\uff09\n \uff082\uff09\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u56de\u586b \u7b49\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u518d\u9010\u4e2a\u8fdb\u884c\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u6b64\u65b9\u6848\u65f6\u95f4\u6548\u7387\u6bd4\u8f83\u4f4e\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \uff083\uff09\u624b\u52a8\u56de\u586b \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4e0d\u505a\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u540e\u7eed\u624b\u52a8\u5c06\u7ed3\u679c\u8fdb\u884c\u56de\u586b\u8bf7\u6c42\u3002 \u7528\u4f8b\u6267\u884c\u65f6\u914d\u7f6e\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = hand\nAPP_NAME = \u540e\u7eed\u624b\u52a8\u56de\u586b\u65b9\u6cd5\uff1a youqu manage.py pms --send2task yes\n"},{"location":"#_4","title":"\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898","text":"\u7531\u540c\u5b66\u53ef\u80fd\u4f1a\u53d1\u73b0\uff0c\u600e\u4e48\u56de\u586b\u4e00\u6b21\u4e4b\u540e\uff0c\u540e\u9762\u60f3\u518d\u6b21\u56de\u586b\u5c31\u4e0d\u751f\u6548\u4e86\uff1b \u8fd9\u662f\u56e0\u4e3a\u4e3a\u4e86\u5e94\u5bf9\u524d\u9762\u63d0\u5230\u7684\u591a\u79cd\u6570\u636e\u56de\u586b\u7684\u65b9\u5f0f\uff0c\u5728 report \u76ee\u5f55\u4e0b\u4f1a\u7531 pms_xxx \u5f00\u5934\u7684\u76ee\u5f55\uff0c\u8bb0\u5f55\u4e86\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u548c\u56de\u586b\u60c5\u51b5\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u4e4b\u524d\u5df2\u7ecf\u56de\u586b\u8fc7\u4e86\uff0c\u540e\u7eed\u5c31\u4e0d\u4f1a\u518d\u6b64\u89e6\u53d1\u56de\u586b\u4e86\uff1b \u5982\u679c\u4f60\u60f3\u91cd\u65b0\u505a\u56de\u586b\uff0c\u4f60\u53ef\u4ee5\u628a report/pms_xxx \u76ee\u5f55\u5220\u6389\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u91cd\u65b0\u505a\u6570\u636e\u56de\u586b\u4e86\uff1b"},{"location":"#24-csv","title":"2.4. \u5bfc\u51fa CSV \u6587\u4ef6","text":"\u6846\u67b6\u63d0\u4f9b\u5bfc\u51fa\u6307\u5b9a\u6807\u7b7e\u7528\u4f8b\u7684\u529f\u80fd\uff1a youqu manage.py exportcsv -a deepin-album -t CICD\n \u8868\u793a\u5bfc\u51fa deepin-album \u7684\u7528\u4f8b\u4e2d\u6807\u8bb0\u4e86 CICD \u6807\u7b7e\u7684\u7528\u4f8b\uff0c\u5bfc\u51fa CSV \u6587\u4ef6\u7684\u5b57\u6bb5\u683c\u5f0f\u5df2\u7ecf\u9002\u914d\u4e86 CICD \u7684\u8981\u6c42\u3002"},{"location":"#25-app","title":"2.5. \u811a\u624b\u67b6\u65b0\u5efa APP \u5de5\u7a0b","text":"\u65b0\u5efa\u4e00\u4e2a APP \u5de5\u7a0b\uff1a youqu manage.py startapp autotest_deepin_some \u8fd9\u6837\u5728 apps \u76ee\u5f55\u4e0b\u4f1a\u521b\u5efa\u4e00\u4e2a\u5b50\u9879\u76ee\u5de5\u7a0b autotest_deepin_some\uff0c\u540c\u65f6\u65b0\u5efa\u597d\u5de5\u7a0b\u6a21\u677f\u76ee\u5f55\u548c\u6a21\u677f\u6587\u4ef6\uff1a apps\n\u2514\u2500\u2500 autotest_deepin_some\n \u00a0\u00a0 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_case.py\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 config.ini\n \u00a0\u00a0 \u251c\u2500\u2500 config.py\n \u00a0\u00a0 \u251c\u2500\u2500 conftest.py\n \u00a0\u00a0 \u251c\u2500\u2500 control\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_assert.py\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some.csv\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u2514\u2500\u2500 widget\n \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 case_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 other.ini\n \u00a0\u00a0 \u251c\u2500\u2500 other_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 pic_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2514\u2500\u2500 ui.ini\n autotest_deepin_some \u662f\u4f60\u7684\u5de5\u7a0b\u540d\u79f0\uff0c\u6bd4\u5982\uff1aautotest_deepin_music \uff1b \u5728\u6b64\u57fa\u7840\u4e0a\uff0c\u4f60\u53ef\u4ee5\u5feb\u901f\u7684\u5f00\u59cb\u4f60\u7684 AT \u9879\u76ee\u3002"},{"location":"#26","title":"2.6. \u7528\u4f8b\u6807\u7b7e\u81ea\u52a8\u540c\u6b65","text":"\u7528\u4e8e\u81ea\u52a8\u540c\u6b65 PMS \u7528\u4f8b\u6807\u7b7e\u6570\u636e\u81f3\u672c\u5730 CSV \u6587\u4ef6\uff0c\u4e3b\u8981\u901a\u8fc7\u4ee5\u4e0b\u51e0\u4e2a\u914d\u7f6e\u6765\u63a7\u5236\uff1a APP_NAME = # \u6307\u5b9a\u8981\u540c\u6b65\u7684\u5e94\u7528\u540d\u79f0\nPMS_USER = # PMS\u7684\u7528\u6237\u540d\nPMS_PASSWORD = # PMS\u7684\u5bc6\u7801\n \u5728 [csv_link_pms_id] \u8282\u70b9\u4e0b\u6307\u5b9a csv \u6587\u4ef6\u540d\u4e0e PMS \u7528\u4f8b\u6a21\u5757\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u6bd4\u5982\uff1a [csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/testcase-browse-53.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 53\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic = 53\n \u5c06\u4ee5\u4e0a\u4fe1\u606f\u914d\u7f6e\u597d\u4e4b\u540e\uff0c\u5728\u547d\u4ee4\u884c\u6267\u884c\uff1a youqu manage.py pms --pms2csv yes\n \u6bcf\u6b21\u6267\u884c\u65f6\u539f csv \u6587\u4ef6\u4f1a\u81ea\u52a8\u5907\u4efd\u5728 report/csv_back \u76ee\u5f55\u4e0b\uff0c\u56e0\u6b64\u4f60\u4e0d\u7528\u62c5\u5fc3\u811a\u672c\u6267\u884c\u5bfc\u81f4\u4f60\u7684\u6570\u636e\u4e22\u5931\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u57fa\u7840\u6846\u67b6\u8bbe\u8ba1\u65b9\u6848","text":"# ====================================\n# Author : Mikigo\n# Time : 2022/3/18\n# version \uff1a1.0\n# ====================================\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"\u505a\u4e00\u4e2a\u7b80\u5355\u3001\u597d\u7528\u3001\u529f\u80fd\u5f3a\u5927\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u3002 \u4f5c\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4e00\u4e2a\u57fa\u7840\u6846\u67b6\uff0c\u4efb\u4f55\u5e94\u7528\u90fd\u80fd\u5f88\u65b9\u4fbf\u7684\u63a5\u5165\u8fdb\u6765\uff1b \u63d0\u4f9b\u6240\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u9700\u8981\u7684\u5e95\u5c42\u529f\u80fd\uff0c\u5e76\u5bf9\u5916\u63d0\u4f9b\u552f\u4e00\u7684\u63a5\u53e3\uff0c\u65b9\u4fbf\u5e94\u7528\u5e93\u4f7f\u7528\uff1b \u6574\u5408\u516c\u5171\u5e93\uff0c\u51cf\u5c11\u5e94\u7528\u5e93\u4ee3\u7801\u91cf\u548c\u65b9\u6cd5\u7ef4\u62a4\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u8bbe\u8ba1\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u7edf\u4e00\u6982\u5ff5","text":" \u57fa\u7840\u6846\u67b6 \u672c\u9879\u76ee\u662f\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\uff08AutoTest Basic Frame\uff09\uff0c\u5168\u79f0\u4e3a\u201c\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff08AT \u57fa\u7840\u6846\u67b6\uff09\u201d\u3002 AT \u57fa\u7840\u6846\u67b6\u662f\u505a\u4e3a\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\u6765\u8bbe\u8ba1\u7684\uff0c\u5b83\u63d0\u4f9b\u4e86\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u57fa\u7840\u529f\u80fd\uff0c\u4efb\u4f55\u5e94\u7528\u63a5\u5165\u8fdb\u6765\u90fd\u80fd\u5feb\u901f\u65b9\u4fbf\u7684\u8fdb\u884c\u65b9\u6cd5\u548c\u7528\u4f8b\u7f16\u5199\uff0c\u540c\u65f6\u5728\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u3001\u6807\u7b7e\u5316\u6267\u884c\u3001\u5206\u5e03\u5f0f\u6267\u884c\u3001\u591a\u79cd\u62a5\u544a\u8f93\u51fa\u3001\u4f18\u7f8e\u7684\u6267\u884c\u65e5\u5fd7\u3001\u5931\u8d25\u81ea\u52a8\u5f55\u5c4f\u548c\u622a\u56fe\u3001\u81ea\u52a8\u73af\u5883\u6e05\u7406\u7b49\u7b49\uff0c\u5b83\u90fd\u63d0\u4f9b\u4e86\u5b8c\u5584\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u66f4\u91cd\u8981\u7684\u662f\u8fd9\u4e00\u5207\u4f7f\u7528\u8d77\u6765\u90fd\u975e\u5e38\u7b80\u5355\u3002 \u57fa\u7840\u6846\u67b6\u4e2d\u5305\u542b\u5e94\u7528\u5e93\uff08apps\uff09\u3001\u6838\u5fc3\u5e93\uff08src\uff09\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09\u3002 \u5e94\u7528\u5e93\uff08apps\uff09 \u5404\u4e2a\u5e94\u7528\u81ea\u5df1\u7684\u4ed3\u5e93\uff0c\u91cc\u9762\u4e3b\u8981\u5305\u542b\u7684\u662f\u7528\u4f8b\u3001\u65b9\u6cd5\u53ca\u4e00\u4e9b\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u53eb autotest-dde-file-manager \u3002 \u6838\u5fc3\u5e93\uff08src\uff09 \u6838\u5fc3\u5e93\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u5230\u6240\u6709\u5e95\u5c42\u6838\u5fc3\u529f\u80fd\uff0c\u8fd9\u662f\u6700\u91cd\u8981\u7684\u4e00\u4e2a\u90e8\u5206\uff0c\u7075\u9b42\u3002\u5177\u4f53\u529f\u80fd\u6a21\u5757\u53ca\u8bf4\u660e\u4f1a\u5728\u4e0b\u9762\u7b2c\u56db\u4e2a\u7ae0\u8282\u8be6\u7ec6\u63cf\u8ff0\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09 \u591a\u4e2a\u5e94\u7528\u90fd\u8981\u7528\u5230\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\uff0c\u6309\u7167\u5e94\u7528\u5212\u5206\u5b58\u653e\uff0c\u4e3b\u8981\u662f\u4e3a\u4e86\u51cf\u5c11\u4ee3\u7801\u91cf\uff0c\u6d88\u9664\u5e94\u7528\u95f4\u7684\u8026\u5408\u5173\u7cfb\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u67b6\u6784\u56fe","text":"\u6574\u4f53\u7684\u6846\u67b6\u8bbe\u8ba1\u5728\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u300b\u6587\u6863\u91cc\u9762\u5df2\u7ecf\u6709\u8be6\u7ec6\u63cf\u8ff0\u4e86\uff0c\u8fd9\u91cc\u8d34\u4e00\u4e0b\u6574\u4f53\u7684\u67b6\u6784\u56fe\uff1a \u4e3a\u4e86\u7a81\u663e\u672c\u6587\u7684\u91cd\u70b9\uff0c\u62bd\u53d6\u5176\u4e2d\u91cd\u8981\u529f\u80fd\u6a21\u5757\uff0c\u5982\u4e0b\u56fe\uff1a "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-basic-frame # \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\n\u251c\u2500\u2500 apps # \u5e94\u7528\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-dde-file-manager # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\uff08\u5e94\u7528\u5e93\u8be6\u7ec6\u76ee\u5f55\u7ed3\u6784\u8bf7\u770b\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\uff09\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 tag # \u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u2514\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u2502 \u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 xxx.png\n\u2502 \u2502 ...\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-deepin-music # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 public # \u516c\u5171\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget # dde_dock \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget # dde_desktop \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 src # \u6838\u5fc3\u5e93\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 button_center.py\n\u2502 \u251c\u2500\u2500 cmdtrl.py\n\u2502 \u251c\u2500\u2500 dogtails.py\n\u2502 \u251c\u2500\u2500 find_image.py\n\u2502 \u251c\u2500\u2500 global_config.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 setting # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 config.py\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 global_config.ini\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\u6a21\u5757\uff08Hook\uff09\n\u251c\u2500\u2500 pytest.ini # Pytest \u9ed8\u8ba4\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 docs # \u6587\u6863\u76ee\u5f55\n\u2514\u2500\u2500 manage.py # \u6267\u884c\u5668\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1apps","title":"1\u3001\u5e94\u7528\u5e93\uff08apps\uff09","text":"\u6240\u6709\u5e94\u7528\u5e93\u5747\u653e\u7f6e\u5728\u57fa\u7840\u6846\u67b6\u4e0b\u7684 apps \u76ee\u5f55\u4e0b\uff08\u89c1\u7b2c\u4e8c\u7ae0\u8282\u7b2c3\u6bb5\u76ee\u5f55\u7ed3\u6784\u5185\u5bb9\uff09\u3002\u5e94\u7528\u5e93\u7684\u67b6\u6784\u8bbe\u8ba1\u53ef\u4ee5\u53c2\u8003\u300aAT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b\u6587\u6863\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2src","title":"2\u3001\u6838\u5fc3\u5e93\uff08src\uff09","text":"\u5728 src \u76ee\u5f55\u4e0b\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u5e95\u5c42\u6838\u5fc3\u7ec4\u4ef6\uff0c\u901a\u5e38\u6765\u8bb2\u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5230\u5176\u4e2d\u67d0\u4e00\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4e48\u4f60\u9700\u8981\u663e\u793a\u7684\u5bfc\u5165\u8fd9\u4e2a\u6a21\u5757\uff0c\u7136\u540e\u624d\u80fd\u4f7f\u7528\u8be5\u6a21\u5757\u4e0b\u7684\u529f\u80fd\uff0c\u5982\u679c\u4f60\u7528\u5230\u4e86\u5341\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4f60\u5c31\u9700\u8981\u5bfc\u5165\u5341\u4e2a\u3002\u4f46\u662f\u6211\u4eec\u60f3\u8ba9\u4e8b\u60c5\u53d8\u5f97\u7b80\u5355\uff0c\u4e00\u6b21\u5bfc\u5165\uff0c\u4f7f\u7528\u6240\u6709\u3002 \u5c06\u6240\u6709\u7684\u529f\u80fd\u6a21\u5757\u90fd\u8fdb\u5165\u5230 src \u7684\u540d\u79f0\u7a7a\u95f4\uff0c\u5728 src/__init__.py \u91cc\u9762\u6211\u4eec\u8bbe\u8ba1\u6210\u8fd9\u6837\uff1a # src/__init__.py\nfrom .cmdctl import CmdCtl\nfrom .dogtails import Dogtail\nfrom .find_image import FindImage\nfrom .button_center import ButtonCenter\nclass Src(CmdCtl, FindImage):\ndef __init__(self, **kwargs):\n\"\"\"dogtail or button center param\n :param kwargs: app_name, desc, number\n \"\"\"\nif kwargs:\napp_name = kwargs.get(\"APP_NAME\")\ndesc = kwargs.get(\"DESC\")\nif app_name is None or desc is None:\nraise ValueError\nnumber = kwargs.get(\"number\")\nnumber = number if isinstance(number, int) else -1\n# \u5bf9\u8c61\u7ec4\u5408\nself.dog = Dogtail(app_name, desc, number)\nself.ui = ButtonCenter(app_name, number)\n \u9700\u8981\u4f20\u9012\u53c2\u6570\u7684\u91c7\u7528\u5bf9\u8c61\u7ec4\u5408\uff0c\u6ca1\u6709\u53c2\u6570\u7684\u4f7f\u7528\u7ee7\u627f\uff0c\u7ee7\u627f\u7684\u7c7b\u7b26\u5408 Mixin \u8bbe\u8ba1\u6a21\u5f0f\u3002 \u5e94\u7528\u5e93\u91cc\u9762\u4f7f\u7528\u7684\u65f6\u5019\u5728 widget/base_widget.py \u91cc\u9762\u53ea\u9700\u8981\u552f\u4e00\u7ee7\u627f Src \uff1a # \u5e94\u7528\u5e93\u91cc\u9762\u65b9\u6cd5\u57fa\u7c7b\n# widget/base_widget.py\nfrom src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n \u8981\u4f7f\u7528\u6838\u5fc3\u5e93\u7684\u529f\u80fd\uff0c\u53ea\u9700\u8981\u5199\u4e00\u4e2a\u5bfc\u5165 from src import Src \u5373\u53ef\u3002 \u5199 __init__ \u6784\u9020\u51fd\u6570\u7684\u539f\u56e0\u662f\u901a\u8fc7\u53c2\u6570\u6784\u9020\u5e94\u7528\uff0c\u5e76\u4e14\u4f20\u9012 number \u8fdb\u6765\uff0c\u53ef\u4ee5\u5b9e\u73b0\u591a\u7a97\u53e3\u7684\u63a7\u5236\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3public","title":"3\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09","text":"\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6bcf\u4e2a\u5e94\u7528\u90fd\u662f\u4e00\u4e2a\u5355\u72ec\u7684 py \u6587\u4ef6\uff0c\u76f8\u4e92\u4e4b\u95f4\u662f\u72ec\u7acb\u7684\uff0c\u6bcf\u4e2a py \u6587\u4ef6\u91cc\u9762\u662f\u8be5\u5e94\u7528\u7684\u65b9\u6cd5\u7c7b\uff0c\u6bd4\u5982\uff1a\u6700\u5e38\u7528\u7684\u65b9\u6cd5\u7c7b dde_desktop_public_widget.py # dde_desktop_widget.py\nfrom src import Src\nclass _DdeDesktopPublicBaseWidget(Src):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-desktop\"\nDESC = \"/usr/bin/dde-desktop\"\ndef __init__(self):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC)\nclass DdeDesktopPublicWidget(_DdeDesktopPublicBaseWidget):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u7c7b\"\"\"\ndef click_music_dir_by_ui(self):\n\"\"\"\u5728\u6587\u4ef6\u9009\u62e9\u6846\u70b9\u51fb\u97f3\u4e50\u76ee\u5f55\"\"\"\nself.click(*self.ui.btn_center(\"\u4fa7\u8fb9\u680f-\u97f3\u4e50\")) \ndef click_xxx_by_attr(self):\npass\n \u516c\u5171\u65b9\u6cd5\u5e93\u610f\u4e49\uff1a \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6240\u5c01\u88c5\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\u90fd\u662f\u81f3\u5c11\u88ab2\u4e2a\u5e94\u7528\u90fd\u7528\u5230\u7684\uff0c\u8fd9\u6837\u505a\u53ef\u4ee5\u51cf\u5c11\u6574\u4f53\u4ee3\u7801\u91cf\uff0c\u4ece\u800c\u51cf\u8f7b\u5e94\u7528\u5e93\u4ee3\u7801\u7684\u7ef4\u62a4\u5de5\u4f5c\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u7f16\u5199\u5f62\u5f0f\uff08\u547d\u540d\u89c4\u5219\u3001\u5b9a\u4f4d\u7684\u65b9\u6848\u5199\u6cd5\u3001\u6ce8\u91ca\u7684\u5199\u6cd5\u7b49\u7b49\uff09\u5177\u6709\u4e00\u5b9a\u7684\u6a21\u677f\u4f5c\u7528\uff0c\u8fd9\u6837\u5373\u4f7f\u662f\u5404\u4e2a\u5e94\u7528\u5e93\u90fd\u72ec\u7acb\u7ef4\u62a4\uff0c\u6240\u6709\u7684\u7f16\u7801\u98ce\u683c\u90fd\u662f\u8d8b\u4e8e\u76f8\u540c\u7684\uff0c\u56e0\u4e3a\u5927\u5bb6\u90fd\u5e94\u8be5\u53c2\u7167\u516c\u5171\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u5199\u6cd5\u6765\u5199\u81ea\u5df1\u5e94\u7528\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\u7c7b\uff0c\u8fd9\u6837\u4f7f\u5f97\u4ece\u516c\u53f8\u7684\u89d2\u5ea6\u53bb\u770b\u6240\u6709\u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u90fd\u662f\u7edf\u4e00\u7684\u3002 \u53ef\u4ee5\u901a\u8fc7\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\uff0c\u4e86\u89e3\u5230\u5176\u4ed6\u5e94\u7528\u7684\u529f\u80fd\uff0c\u5bf9\u4e8e\u6211\u4eec\u9700\u6c42\u7406\u89e3\uff0c\u4e86\u89e3\u7cfb\u7edf\u7684\u65b9\u65b9\u9762\u9762\u4e5f\u6709\u597d\u5904\u3002 \u5f53\u7136\uff0c\u5982\u679c\u4f60\u7684\u5e94\u7528\u672c\u8eab\u662f\u5c5e\u4e8e\u6839\u672c\u5c31\u4e0d\u9700\u8981\u548c\u5176\u4ed6\u5e94\u7528\u4ea4\u4e92\u7684\uff0c\u90a3\u4e48\u4f60\u53ef\u80fd\u4e0d\u4f1a\u7528\u5230\u8fd9\u91cc\u9762\u7684\u529f\u80fd\uff0c\u6ca1\u5173\u7cfb\uff0c\u4f60\u6240\u6709\u7684\u65b9\u6cd5\u90fd\u53ef\u4ee5\u76f4\u63a5\u5199\u5728\u5e94\u7528\u5e93\u7684\u4e1a\u52a1\u5c42\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4conftestpy","title":"4\u3001conftest.py","text":"conftest.py \u4ece\u529f\u80fd\u4e0a\u5c06\u662f\u5c5e\u4e8e\u6838\u5fc3\u5e93\uff08src\uff09\u7684\u5185\u5bb9\uff0c\u4f46\u662f\u7531\u4e8e\u5b83\u7684\u7279\u6b8a\u6027\uff0c\u5373\u5b83\u662f\u5bf9\u5e94\u7528\u5e93\u4e2d\u7684\u7528\u4f8b\u751f\u6548\u7684\uff0c\u800c\u4e14\u5b83\u7684\u4f5c\u7528\u57df\u662f\u5f53\u524d\u76ee\u5f55\u53ca\u4ee5\u4e0b\uff0c\u56e0\u6b64\u6211\u4eec\u5c06\u5b83\u653e\u5230\u9879\u76ee\u6839\u76ee\u5f55\u3002\u6211\u4eec\u6846\u67b6\u4e2d\u6709\u4e0d\u5c11\u6838\u5fc3\u529f\u80fd\u90fd\u662f\u5728\u8fd9\u91cc\u9762\u8fdb\u884c\u5f00\u53d1\u7684\uff0c\u540e\u9762\u7b2c\u56db\u7ae0\u4f1a\u8bb2\u5230\u7ec6\u8282\u3002 pytest.ini \u4f5c\u7528\u548c conftest.py \u7c7b\u4f3c\uff0c\u662f Pytest \u6846\u67b6\u7684\u56fa\u5b9a\u914d\u7f6e\u6587\u4ef6\uff0c\u76ee\u524d\u914d\u7f6e\u4e86\u4e00\u4e9b\u901a\u7528\u7684\u547d\u4ee4\u884c\u6267\u884c\u53c2\u6570\uff0c\u4e5f\u653e\u5728\u9879\u76ee\u6839\u76ee\u5f55\u3002 \u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 Hook \u51fd\u6570\uff0capps \u76ee\u5f55\u4e0b\u7684 \u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 fixture \u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5setting","title":"5\u3001setting","text":"\u5168\u5c40\u914d\u7f6e\u6a21\u5757\uff0c\u5305\u542b\u4e86\u4ee5\u4e0b\u914d\u7f6e\u6587\u4ef6\uff1a \uff081\uff09ini \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u914d\u7f6e\u4e00\u4e9b\u5168\u5c40\u7684\u914d\u7f6e\u9879\uff0c\u8b6c\u5982\uff1a\u5931\u8d25\u91cd\u8dd1\u6b21\u6570\u3001\u662f\u5426\u5931\u8d25\u5f55\u5c4f\u3001\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\u3001\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4\u3001\u6267\u884c\u65f6\u65e5\u5fd7\u7ea7\u522b\u3001\u751f\u6210\u7684\u62a5\u544a\u7c7b\u578b\u3001\u4ee5\u53ca\u5206\u5e03\u5f0f\u6267\u884c\u7684\u4e00\u4e9b\u7b56\u7565\u914d\u7f6e\u9879\u7b49\u7b49\u3002 \uff082\uff09config.py \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u63d0\u4f9b\u914d\u7f6e\u6587\u4ef6\u8bfb\u53d6\u3001\u52a8\u6001\u83b7\u53d6\u4e00\u4e9b\u5e38\u91cf\uff08\u5982\u9879\u76ee\u6839\u76ee\u5f55\u7edd\u5bf9\u8def\u5f84 (BASE_DIR)\u3001\u7cfb\u7edf\u67b6\u6784\uff08SYS_FRAME\uff09\u3001\u65f6\u95f4\u5b57\u7b26\u4e32\uff08strftime\uff09\u3001\u672c\u673a USERNAME IP \u7b49\u7b49\uff09\u3001\u516c\u5171 URL \u7b49\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u89c4\u8303","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u7248\u672c\u53ca\u4f9d\u8d56","text":"\u57fa\u7840\u6846\u67b6\u4f1a\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u8fdb\u884c\u7248\u672c\u53d1\u5e03\uff0c\u4e0d\u4e0e\u67d0\u4e2a\u5e94\u7528\u7248\u672c\u7ed1\u5b9a\uff0c\u4f46\u662f\uff0c\u5e94\u7528\u5e93\u4f1a\u4f9d\u8d56\u4e8e\u57fa\u7840\u6846\u67b6\u7684\u7248\u672c\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u5efa\u8bae\u5728\u5e94\u7528\u5e93\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a\u6587\u672c\u6587\u4ef6\u7528\u4e8e\u8bb0\u5f55\u6240\u4f9d\u8d56\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\uff0c\u7c7b\u4f3c\u4e8e\u5f00\u53d1\u5e94\u7528\u7684 debian/control \u6587\u4ef6\u7684\u529f\u80fd\uff0c\u4e3a\u4e86\u4fdd\u6301\u7edf\u4e00\uff0c\u8fd9\u4e2a\u6587\u4ef6\u5c31\u547d\u540d\u4e3a control\uff0c\u653e\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u6838\u5fc3\u5e93\u72ec\u7acb\u6027","text":"\u6838\u5fc3\u5e93\u4e0d\u5efa\u8bae\u9488\u5bf9\u67d0\u4e00\u4e2a\u5e94\u7528\u5355\u72ec\u505a\u4ee3\u7801\u4e0a\u7279\u6b8a\u5904\u7406\uff0c\u901a\u5e38\u8003\u8651\u9488\u5bf9\u67d0\u4e00\u79cd\u573a\u666f\u8fdb\u884c\u5904\u7406\uff0c\u8fd9\u4e9b\u573a\u666f\u901a\u5e38\u662f\u5b58\u5728\u4e00\u4e9b\u5171\u6027\u7684\u3002\u6bd4\u5982\u8bf4\uff1a\u684c\u9762\u7684ID\u5206\u914d\u5b58\u5728\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u903b\u8f91\u5904\u7406\u89e3\u51b3ID\u5206\u914d\u9519\u8bef\u7684\u95ee\u9898\uff0c\u4f46\u662f\u8fd9\u90e8\u5206\u903b\u8f91\u6211\u4eec\u4f1a\u5728\u684c\u9762\u7684\u65b9\u6cd5\u5c42\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u517c\u5bb9\u6027","text":"\u4e3a\u4e86\u4fdd\u6301\u517c\u5bb9\u6027\uff0c\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u539f\u5219\u4e0a\u4e0d\u5bf9\u8001\u65b9\u6cd5\u8fdb\u884c\u4fee\u6539\u6216\u5220\u9664\uff0c\u53ea\u8fdb\u884c\u65b0\u589e\u3002\u6d89\u53ca\u5230\u8001\u65b9\u6cd5\u4fee\u6539\u6216\u5220\u9664\u7684\uff0c\u4f1a\u8fdb\u884c\u63d0\u524d\u9884\u544a\uff0c\u5e76\u5728\u7b2c\u4e8c\u4e2a\u7248\u672c\u4e4b\u540e\uff08\u4e2d\u95f4\u4f1a\u9694\u4e00\u4e2a\u7248\u672c\u8fc7\u5ea6\uff09\u6b63\u5f0f\u5b9e\u65bd\u4fee\u6539\u6216\u5220\u9664\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u547d\u540d\u89c4\u8303","text":" \u7528\u4f8b ID \u6bcf\u4e2a\u5e94\u7528\u81ea\u5df1\u7ef4\u62a4\u4e00\u5957 ID\uff0c\u5728PMS\u4e0a\u7528\u4f8b\u6807\u9898\u4e0a\u5c06\u81ea\u52a8\u5316ID\u4ee5\u6807\u7b7e\u7684\u5f62\u5f0f\u5199\u5165\uff0c\u6bd4\u5982\uff1a[101]\u6253\u5f00-\u542f\u52a8\u5e94\u7528\u540edock\u53f3\u952e\u83dc\u5355 \u4e00\u4e2a\u7528\u4f8b\u7c7b\u91cc\u9762\u6709\u591a\u4e2a\u7528\u4f8b\u65f6\uff0c\u5728\u7528\u4f8b\u540d\u79f0\u540e\u9762\u52a0\u5e8f\u53f7\u3002 class TestFileManager(BaseCase):\n\"\"\"\u6587\u7ba1\u7528\u4f8b\"\"\"\ndef test_xxx_015_1(self):\npass\ndef test_xxx_015_2(self):\npass\n \u6ce8\u610f 015_1\uff0c\u4e0d\u8981\u5199015_01\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 PMS \u4e0a\u7684\u7528\u4f8bID\uff1a PMS \u4e0a\u662f6\u4f4d\u6570\uff0c\u4e0d\u591f\u76f4\u89c2\uff0c\u4e5f\u4e0d\u597d\u7ef4\u62a4\uff0c\u5728\u81ea\u52a8\u5316\u4e0b\u9762\u53bb\u627e\u4e00\u4e2a\u5e26\u6709 6 \u4f4d\u6570\u7684\u6587\u4ef6\u662f\u4e00\u4e2a\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 PMS \u4e0a\u7684 ID \u53ef\u80fd\u4f1a\u53d1\u751f\u53d8\u5316\uff0c\u6bd4\u5982\u5bfc\u51fa\u6765\u5bfc\u8fdb\u53bb\u7684\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u5b58\u5728\u95ee\u9898\uff0c\u5982\u679c\u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u8981\u60f3\u627e\u51fa\u6765\u5bf9\u5e94\u4fee\u6539\u81ea\u52a8\u5316\u7528\u4f8b ID\uff0c\u5c06\u4f1a\u662f\u4ef6\u975e\u5e38\u75db\u82e6\u7684\u4e8b\u60c5\u3002 \u51fd\u6570\u547d\u540d\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5de6\u952e\u70b9\u51fb click \u53f3\u952e\u70b9\u51fb right_click \u53cc\u51fb double_click \u79fb\u52a8 move_to \u62d6\u52a8 drag \u65b0\u5efa new \u62d6\u52a8\u5230 drag_to \u4ece\u54ea\u91cc\u62d6\u52a8\u5230\u54ea\u91cc drag_something_from_xxx_to_xxx \u83b7\u53d6 get \u83b7\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5750\u6807 get_location \u975e\u7279\u6b8a\u6587\u4ef6 file word\u6587\u4ef6 doc text\u6587\u4ef6 text \u6587\u4ef6\u5939 dir \u5173\u952e\u8bcd\u6301\u7eed\u589e\u52a0 \u5e38\u91cf\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5e94\u7528\u540d\u79f0 APP_NAME \u5e94\u7528\u63cf\u8ff0 DESC \u672c\u5e94\u7528\u4ee5\u5916\u7684\u5176\u4ed6\u5e94\u7528\uff0c\u6bd4\u5982\u5e2e\u52a9 HELP \u5176\u4ed6\u540d\u79f0\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u65b9\u6cd5\u5305\u540d widget \u65b9\u6cd5\u6587\u4ef6\u540d\uff08\u6587\u7ba1\u4e3e\u4f8b\uff09 dfm_widget.pytitle_widget.pyright_view_widget.pyleft_view_widget.pypop_widget.pybase_widget.pydfm_assert.py \u65ad\u8a00\u8bed\u53e5\u547d\u540d\u89c4\u8303 \u65ad\u8a00\u8bed\u53e5\u90fd\u662f\u4ee5 assert \u5f00\u5934 \u65ad\u8a00 \u8bed\u53e5 \u5224\u65ad\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_existsassert_file_not_exists \u5224\u65ad\u684c\u9762\u76ee\u5f55\u4e0b\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_exists_in_desktopassert_file_not_exists_in_desktop \u5224\u65ad\u56fe\u7247\u5b58\u5728 assert_image_existsassert_image_not_exists \u5224\u65ad\u5f71\u9662\u4e2d\u662f\u5426\u5b58\u5728\u56fe\u7247 assert_image_exists_in_movieassert_image_not_exists_in_movie \u5224\u65ad\u5143\u7d20\u662f\u5426\u5b58\u5728 assert_element_existassert_element_not_exist \u5224\u65ad\u662f\u5426\u76f8\u7b49 assert_equalassert_not_equal \u5224\u65ad\u662f\u5426\u4e3a\u771f assert_trueassert_false"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5fixture","title":"5\u3001fixture \u89c4\u8303","text":"\u7531\u4e8e Pytest \u6846\u67b6\u4e2d\u652f\u6301 fixture \u7684\u5199\u6cd5\u548c Xunit \u5199\u6cd5\u7684\uff0c\u6240\u4ee5\u5e94\u7528\u5e93\u4e2d\u53ef\u80fd\u5b58\u5728\u6df7\u7528\u7684\u60c5\u51b5\uff0c\u4e3a\u7edf\u4e00\u7f16\u7801\u98ce\u683c\u65b9\u4fbf\u540e\u7eed\u7528\u4f8b\u4ee3\u7801\u7ef4\u62a4\uff0c\u73b0\u505a\u4ee5\u4e0b\u89c4\u8303\u8bf4\u660e\uff1a \u629b\u5f03 Xunit \u7684\u5199\u6cd5\uff0c\u7edf\u4e00\u91c7\u7528 Pytest fixture \u7684\u5199\u6cd5\u3002 \u5e94\u7528\u5185 fixture \u8c28\u614e\u4f7f\u7528 autouse=True \uff0c\u975e\u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u975e\u5e38\u4e0d\u5efa\u8bae\u4f7f\u7528\u8fd9\u4e2a\u53c2\u6570\u3002 \u8c03\u7528 fixture \u4e0d\u80fd\u4f7f\u7528 @pytest.mark.usefixture()\uff0c\u4f7f\u7528\u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u4f20\u5165\u51fd\u6570\u5bf9\u8c61\u3002 \u5efa\u8bae\u5728\u4e00\u4e2a conftest.py \u91cc\u9762\u53bb\u5199\uff0c\u4e00\u4e2a\u5e94\u7528\u4e5f\u5c3d\u91cf\u7ef4\u62a4\u4e00\u4e2a conftest.py\u6587\u4ef6\u3002 fixture \u4e5f\u9700\u8981\u5199\u529f\u80fd\u8bf4\u660e\uff0c\u51fd\u6570\u540d\u79f0\u8981\u6709\u5177\u4f53\u542b\u4e49\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#6","title":"6\u3001\u65b9\u6cd5\u7f16\u5199\u89c4\u8303","text":" \u65b9\u6cd5\u7c7b\u578b\uff1a if \u6ca1\u6709\u7528\u5230\u5b9e\u4f8b\u5bf9\u8c61\uff1a\nif \u6ca1\u6709\u7528\u5230\u7c7b\u5bf9\u8c61\uff1a\n\u5199\u9759\u6001\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @staticmethod\nelse\uff1a\n\u5199\u7c7b\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @classmethod\nelse:\n\u76f4\u63a5\u5199\u5b9e\u4f8b\u65b9\u6cd5\n \u4e3e\u4f8b: class TitleWidget:\ndef click_xxx_by_ui(self):\npass\n@staticmethod\ndef click_xxx_by_ui():\npass\n@classmethod\ndef click_xxx_by_ui(cls):\npass\n \u51fd\u6570\u540d\u79f0\u4e0d\u51fa\u73b0\u6570\u5b57\uff0c\u9700\u8981\u8868\u793a\u6570\u91cf\u7684\u7528\u5355\u8bcd\u8868\u793a\u3002 \u51fd\u6570\u529f\u80fd\u6ce8\u91ca\u3002 \u6ca1\u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg2:xxx\n\"\"\"\n \u6709\u53c2\u6570\uff0c\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg1:xxx\nreturn: xxx\n\"\"\"\n \u200b \u7528 Pycharm \u7684\u6ce8\u91ca\u6a21\u677f\u4e5f\u53ef\u4ee5\uff0c\u53ea\u8981\u4f53\u73b0\u4e86\u53c2\u6570\u7684\u7c7b\u578b\u548c\u8fd4\u56de\u5c31\u884c\u4e86\u3002 \u6682\u4e0d\u8981\u6c42\u5199\u7c7b\u578b\u6ce8\u89e3\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#7case","title":"7\u3001\u7528\u4f8b\uff08case\uff09\u89c4\u8303","text":" \u4ee5\u7c7b\u7684\u5f62\u5f0f\u5199\u7528\u4f8b\uff0c\u7528\u4f8b\u7c7b\u96c6\u6210\u7528\u4f8b\u57fa\u7c7b\u3002 \u7528\u4f8b\u7c7b\u9700\u8981\u5199\u6ce8\u91ca\u3002 \u6d4b\u8bd5\u7528\u4f8b\u51fd\u6570\u8bf4\u660e\uff08\u5efa\u8bae\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u540d\u79f0\uff09 \"\"\"\u53f3\u4fa7\u9884\u89c8-\u56fe\u7247\u7c7b\u578b\u4fe1\u606f\u680f\u57fa\u672c\u4fe1\u606f\"\"\"\n \u4e0d\u5199\u8c03\u8bd5\u4ee3\u7801 if __name__ == '__main__':\npytest.main()\n \u6240\u6709\u7528\u4f8b\u90fd\u7ee7\u627f BaseCase\u3002 BaseCase \u91cc\u9762\u653e\u4e00\u4e9b\u6d4b\u8bd5\u6570\u636e\u7684\u5e38\u91cf\uff0c\u6bd4\u5982\u6587\u4ef6\u540d\u79f0\uff0c\u5e94\u7528\u540d\u79f0\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u4e00\u4e9b\u901a\u7528\u7684\u5b57\u7b26\u4e32\u3002 \u8fd9\u7c7b\u662f\u5c5e\u4e8e\u6d4b\u8bd5\u6570\u636e\u3002 class BaseCase(DfmAssert):\n\"\"\"\u7528\u4f8b\u57fa\u7c7b\"\"\"\nNEW_FILE = \"\u65b0\u5efa\u6587\u672c.txt\"\nTEST_FILE = \"test.txt\"\nNEW_DIR = \"\u65b0\u5efa\u6587\u4ef6\u5939\"\nNEW_WORD = \"\u65b0\u5efaWord\u6587\u6863.doc\"\nAPP_HELP = \"damn\"\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\n\"\"\"\u7528\u4f8b\u6807\u9898\uff08\u590d\u5236PMS\u4e0a\u7528\u4f8b\u6807\u9898\uff09\"\"\"\ndfm = DfmWidget()\ndfm.click_xxx_by_attr(self.NEW_FILE)\ndfm.new_file_in_desktop_by_cmd(self.NEW_FILE)\nself.assert_true(dfm.get_process_status(self.APP_NAME))\n \u7528\u4f8b\u91cc\u9762\u5c3d\u91cf\u51cf\u5c11\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\uff0c\u66f4\u8981\u51cf\u5c11\u76f8\u540c\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\u3002 \u7edf\u4e00\u6587\u4ef6\u6ce8\u91ca\u5934\u3002 #!/usr/bin/env python3\n# _*_ coding:utf-8 _*_\n\"\"\"\n:Author:email@uniontech.com\n:Date :${DATE} ${TIME}\n\"\"\"\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#8","title":"8\u3001\u5176\u4ed6\u89c4\u8303","text":" \u65e5\u5fd7\u6253\u5370\u8981\u5728\u65b9\u6cd5\u6700\u524d\u9762\uff0c\u5426\u5219\u4ee3\u7801\u62a5\u9519\u6ca1\u6709\u65e5\u5fd7\u8f93\u51fa\uff0c\u4e0d\u597d\u5b9a\u4f4d\u95ee\u9898\u3002\uff08\u6211\u4eec\u4f1a\u8003\u8651\u7ee7\u7eed\u4f7f\u7528\u62e6\u622a\u5668\u6253\u5370\u65e5\u5fd7\uff09 \u6240\u6709\u7684\u64cd\u4f5c\u90fd\u9700\u8981\u6709\u65e5\u5fd7\uff0c\u5305\u62ec sleep()\uff0c\u6211\u4eec\u4f1a\u91cd\u5199\u4e00\u4e2a\u6709\u65e5\u5fd7\u8f93\u5165\u7684 sleep\u3002 \u4e1a\u52a1\u5c42\u65e5\u5fd7\u7ea7\u522b\u4e3a INFO\u3002 hook \u51fd\u6570\u53ea\u80fd\u5199\u5230\u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u91cc\u9762\u3002 apps \u76ee\u5f55\u4e0b\u7684 conftest.py \u539f\u5219\u4e0a\u4e0d\u4f1a\u65b0\u589e fixture\u3002 \u56fa\u5b9a\u76ee\u5f55\u6216\u5143\u7d20\u63a7\u4ef6\u7684\u64cd\u4f5c\uff0c\u5c06\u64cd\u4f5c\u65b9\u6cd5\u5199\u6b7b\uff0c\u6587\u4ef6\u7c7b\u64cd\u4f5c\u5c06\u6587\u4ef6\u540d\u7559\u53c2\u6570\u3002 \u8def\u5f84\u62fc\u63a5\u89c4\u8303\uff1a \u7cfb\u7edf\u4e2d\u56fa\u5b9a\u76ee\u5f55\uff0c\u8def\u5f84\u62fc\u63a5\u65f6\u4f7f\u7528\u6ce2\u6d6a\u7b26\u53f7\uff0c\u6bd4\u5982\uff1a~/Desktop/\uff0c\u4e0b\u5c42\u4f7f\u7528 os.path.expanduser()\uff0c\u5b83\u53ef\u4ee5\u81ea\u52a8\u8bc6\u522b\u6ce2\u6d6a\u7b26\u53f7\u3002 \u9879\u76ee\u4e0b\u8def\u5f84\u4f7f\u7528\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u8def\u5f84\uff0c\u6bd4\u5982\uff1aConfig.BASE_PATH\uff0c\u56e0\u4e3a\u9879\u76ee\u662f\u53ef\u4ee5\u5728\u4efb\u610f\u8def\u5f84\u8fd0\u884c\u7684\uff0c\u9700\u8981\u52a8\u6001\u62fc\u63a5\u8def\u5f84\u3002 "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848","text":"# =================================================\n# Author : Mikigo\n# Time : 2022/3/16\n# version \uff1a1.0\n# =================================================\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"AT \u5e94\u7528\u5e93\u6539\u9020\u662f\u57fa\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u8fdb\u884c\u7528\u4f8b\u65b9\u6cd5\u548c\u4e1a\u52a1\u903b\u8f91\u7684\u91cd\u65b0\u8bbe\u8ba1\uff0c\u4ee5\u5b9e\u73b0\u5e94\u7528\u5e93\u9ad8\u6548\u7684\u7f16\u5199\u3001\u7ef4\u62a4\u7528\u4f8b\u53ca\u5176\u65b9\u6cd5\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u6587\u4ef6\u7ba1\u7406\u5668\u4ece\u4e1a\u52a1\u590d\u6742\u5ea6\u548c\u7528\u4f8b\u91cf\u6765\u8bb2\uff0c\u5728\u7cfb\u7edf\u6240\u6709\u5e94\u7528\u4e2d\uff0c\u662f\u5f88\u6709\u4ee3\u8868\u6027\u7684\uff0c\u96be\u5ea6\u4e5f\u662f\u6700\u5927\u7684\uff0c\u56e0\u6b64\u6211\u4eec\u9009\u53d6\u6587\u4ef6\u7ba1\u7406\u5668\u4f5c\u4e3a\u5e94\u7528\u5e93\u6539\u9020\u7684\u5b9e\u9a8c\u5e94\u7528\uff0c\u7ed9\u540e\u7eed\u5176\u4ed6\u5e94\u7528\u6539\u9020\u63d0\u4f9b\u5207\u5b9e\u53ef\u884c\u7684\u601d\u8def\u548c\u65b9\u6848\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u5206\u5c42\u8bbe\u8ba1\u56fe","text":"\u6574\u4f53\u4ecd\u7136\u9075\u5faa PO \u8bbe\u8ba1\u7406\u5ff5\uff0c\u6839\u636e\u4e1a\u52a1\u9700\u8981\uff0c\u5c06\u6587\u7ba1\u4e1a\u52a1\u5c42\u8fdb\u884c 3 \u5c42\u5212\u5206\uff1a "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-dde-file-manager # \u5e94\u7528\u4ed3\u5e93\n\u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 test_xxx_001.py\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u00a0\u251c\u2500\u2500 __init__.py\n\u2502 \u00a0\u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u00a0\u251c\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u00a0\u251c\u2500\u2500 base_widget.py # \u65b9\u6cd5\u57fa\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 title_widget.py # title \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 right_view_widget.py # right view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 left_view_widget.py # left view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 pop_widget.py # pop \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 dfm_widget.py # \u65b9\u6cd5\u7684\u7edf\u4e00\u51fa\u53e3\n\u2502 \u00a0\u2514\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 tag # \u7528\u4f8b\u6807\u7b7e\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 xxx.csv # \u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2514\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u57fa\u7c7b","text":" \u7ee7\u627f\u6838\u5fc3\u5c42\u7684\u5404\u4e2a\u6a21\u5757\u7c7b\u3002 \u62bd\u53d6\u64cd\u4f5c\u5c42\u7684\u4e00\u4e9b\u57fa\u7840\u65b9\u6cd5\u3002 \u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u7684\u4e00\u4e9b\u516c\u5171\u65b9\u6cd5\u3002 \u8def\u5f84\u7ec4\u88c5\u65b9\u6cd5\u3002 \u4e00\u4e9b\u4e1a\u52a1\u5c42\u76f8\u5173\u7684\u53d8\u91cf\u3001\u5e38\u91cf\u3001shell\u547d\u4ee4\u3001\u5750\u6807\u3002 \u65b9\u6cd5\u57fa\u7c7b\u7684\u5199\u6cd5\uff1a from src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u64cd\u4f5c\u5c42","text":" \u6a21\u5757\u5212\u5206 \u6309\u7167\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u6587\u7ba1\u4e3b\u754c\u9762\u5206\u4e3a\u4e09\u4e2a\u533a\u57df\uff1a\u6807\u9898\u680f\u3001\u53f3\u8fb9\u89c6\u56fe\u533a\u57df\u3001\u5de6\u8fb9\u89c6\u56fe\u533a\u57df \u5f39\u7a97\uff1a\u8bbe\u7f6e\u754c\u9762\u5f39\u7a97\u3001\u4fdd\u9669\u7bb1\u5f39\u7a97\u3001\u5220\u9664\u786e\u8ba4\u5f39\u7a97\u3001\u53ca\u5404\u79cd\u7f51\u7edc\u5f39\u7a97 \u53f3\u952e\u83dc\u5355\uff1a\u6682\u65f6\u4e0d\u8003\u8651\u4e3a\u5355\u72ec\u7684\u6a21\u5757\uff0c\u8003\u8651\u4ee5\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6848\u505a\u6210\u516c\u5171\u5e93\u3002 \u5404\u4e2a\u6a21\u5757\u53ea\u7ee7\u627f\u57fa\u7c7b from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u6784\u9020\u51fd\u6570\u91cc\u9762\u4e0d\u6784\u9020\u5bf9\u8c61\uff0c\u53ef\u4ee5\u521d\u59cb\u5316\u4e00\u4e9b\u53d8\u91cf\u3002 \u4e0d\u540c\u7684\u5b9a\u4f4d\u65b9\u6848\u8c03\u7528\u4e0d\u540c\u7684\u5b9a\u4f4d\u5de5\u5177\u5bf9\u8c61\u3002 self.dog\nself.ui\nself.d_bus\n \u65b9\u6cd5\u7f16\u5199 \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u5e94\u7528\u5c42","text":" \u7ee7\u627f\u64cd\u4f5c\u5c42\u7684\u6240\u6709\u7c7b\u3002 \u4ec5\u4ec5\u7528\u4e8e\u7528\u4f8b\u4e2d\u5bfc\u5165\u65b9\u4fbf\uff0c\u4e0d\u505a\u5176\u4ed6\u4e8b\u60c5\u3002 class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n DfmAssert \u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u7ee7\u627f\uff0c\u65b9\u4fbf\u4f7f\u7528\u65ad\u8a00\u8bed\u53e5\u3002 from apps.dde_file_manager.widget.dfm_widget import DfmWidget\nfrom public.assert import Assert\nclass DfmAssert(Assert):\ndef assert_file_exists_in_desktop(self, file_name):\nself.assert_file_exists(f\"~/Desktop{file_name}\")\n...\nDfmWidget().get_file_in_desktop()\n \u7528\u4f8b\u91cc\u9762\u76f4\u63a5\u7ee7\u627f\uff0c\u65b9\u4fbf\u5728\u7528\u4f8b\u91cc\u9762\u4f7f\u7528 self \u8fdb\u884c\u65ad\u8a00\uff0c\u66f4\u7b26\u5408\u65ad\u8a00\u7684\u4f7f\u7528\u4e60\u60ef\uff0c\u7528\u4f8b\u903b\u8f91\u4e0a\u66f4\u6e05\u695a\u3002 class BaseCase(DfmAssert):\npass\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\nself.assert_file_exists_in_desktop(\"xxx\")\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u903b\u8f91\u4e3e\u4f8b","text":"\u7528\u4f8b\u4ee3\u7801\u8c03\u7528\u903b\u8f91\u4e3e\u4f8b\uff1a # BaseWidget\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n# =============================================\n# TitleWidget\nclass TitleWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_title_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# RightViewWidget\nclass RightViewWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_right_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# =============================================\n# \u51fa\u53e3 DfmWidget\nclass DfmWidget(TitleWidget, RightViewWidget):\npass\n# =============================================\n# in case\nfrom apps.dde_file_manager.widget.dfm_widget import DfmWidget\ndfm = DfmWidget()\ndfm.click_xxx_title_by_ui()\ndfm.click_xxx_right_by_ui()\ndfm.dog.print_desc()\ndfm.ui.print_number()\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u5de5\u7a0b\u6539\u9020\u5b9e\u65bd\u6b65\u9aa4","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_2","title":"1\u3001\u5de5\u7a0b\u4ee3\u7801\u62c9\u53d6","text":"1.1. \u5c06\u81ea\u52a8\u5316\u57fa\u7840\u6846\u67b6\u7684\u529f\u80fd\u62c9\u5230\u672c\u5730 Autotest Basic Frame \uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame 1.2. \u5c06\u5e94\u7528\u5e93\u4ee3\u7801\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u5e94\u7528\u5e93\u7684\u4ed3\u5e93\u547d\u540d\u5e94\u8be5\u662f\u957f\u8fd9\u6837\u7684 autotest_deepin_xxx\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_2","title":"2\u3001\u8c03\u6574\u5de5\u7a0b\u76ee\u5f55","text":"\u6309\u7167 \u65b9\u6848\u8bbe\u8ba1-\u76ee\u5f55\u7ed3\u6784 \u8fdb\u884c\u76ee\u5f55\u8c03\u6574\uff0c\u5c3d\u91cf\u4f7f\u7528\u7f16\u8f91\u5668\u8fdb\u884c\u76f8\u5e94\u7684\u8c03\u6574\uff0c\u7f16\u8f91\u5668\u63a8\u8350\u4f7f\u7528 Pycharm \uff0c\u4ee5\u4e0b\u64cd\u4f5c\u5747\u5728 Pycharm \u91cc\u9762\u53ef\u5b9e\u73b0\u3002 2.1. \u9700\u8981\u79fb\u52a8 py \u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u76f4\u63a5\u5728\u7f16\u8f91\u5668\u91cc\u9762\uff0c\u4f7f\u7528\u9f20\u6807\u9009\u4e2d\u5e76\u6309\u4f4f\uff0c\u4e4b\u540e\u62d6\u52a8\u5230\u76ee\u6807\u4f4d\u7f6e\u5373\u53ef\uff0cPycharm \u4f1a\u5c3d\u53ef\u80fd\u7684\u81ea\u52a8\u89e3\u51b3\u79fb\u52a8\u5bfc\u81f4\u7684\u8def\u5f84\u95ee\u9898\u3002\u6ce8\u610f\uff0c\u6211\u8bf4\u7684\u662f\u201c\u5c3d\u53ef\u80fd\u201d\uff0c\u6709\u4e9b\u9a9a\u64cd\u4f5c\u7f16\u8f91\u5668\u662f\u65e0\u6cd5\u81ea\u52a8\u5904\u7406\u7684\u3002\u5982\u679c\u6ca1\u6709\u88ab\u7f16\u8f91\u5668\u81ea\u52a8\u5904\u7406\u7684\u8def\u5f84\u95ee\u9898\uff0c\u540e\u7eed\u53ea\u80fd\u624b\u52a8\u89e3\u51b3\u3002 2.2. \u9700\u8981\u91cd\u547d\u540d\u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u5728\u7f16\u8f91\u5668\u91cc\u9762\u9009\u4e2d\u6587\u4ef6\uff0c\u7136\u540e\u4f7f\u7528\u5feb\u6377\u952e Shift + F6 \uff08\u5982\u679c\u5feb\u6377\u952e\u6ca1\u53cd\u5e94\uff0c\u6587\u4ef6\u53f3\u952e\u83dc\u5355 Refactor \u2014\u2014 Rename\uff09\uff0c\u7136\u540e\u5728\u8f93\u5165\u6846\u4e2d\u8f93\u5165\u8981\u91cd\u547d\u540d\u7684\u540d\u79f0\uff0c\u540c\u65f6\uff0c\u786e\u8ba4\u52fe\u9009 Search for references \u548c Search in comments and strings \u8fd9\u4e24\u4e2a\u9009\u9879\uff0c\u6700\u540e\u6309\u56de\u8f66\u6216\u8005\u9f20\u6807\u70b9 Refactor \u3002 \u6ce8\u610f\uff0c\u6b64\u65f6\u7f16\u8f91\u5668\u53ef\u80fd\u4f1a\u63d0\u793a\u4f60\uff0c\u4f60\u8fd9\u4e2a\u91cd\u547d\u540d\u7684\u64cd\u4f5c\u5173\u8054\u4e86\u591a\u4e2a\u6a21\u5757\uff0c\u5b83\u88ab\u591a\u4e2a\u5730\u65b9\u90fd\u4f7f\u7528\u5230\u4e86\uff0c\u76f8\u5173\u7684\u6a21\u5757\u662f\u5426\u4e5f\u4e00\u8d77\u6539\u540d\u4e86\uff0c\u8fd9\u4e0d\u5e9f\u8bdd\u5417\uff0c\u7528\u8fd9\u4e2a\u529f\u80fd\u5c31\u662f\u60f3\u628a\u5173\u8054\u5230\u7684\u90fd\u4fee\u6539\uff0c\u4e0d\u7136\u6211\u4e3a\u4ec0\u4e48\u4e0d\u7528\u6587\u7ba1\u7684\u91cd\u547d\u540d\u529f\u80fd\u5462\uff0c\u522b\u60f3\u4e86\uff0c\u76f4\u63a5\u70b9\u5de6\u4e0b\u89d2\u7684 Refactor \u6309\u94ae\uff0c\u5c31\u662f\u5e72\u3002 \u7c7b\u540d\u3001\u51fd\u6570\u540d\u7684\u91cd\u547d\u540d\u90fd\u5c3d\u91cf\u91c7\u7528\u8fd9\u79cd\u65b9\u6848\uff0c\u56e0\u4e3a\u7f16\u8f91\u5668\u4f1a\u81ea\u52a8\u7ed9\u6211\u4eec\u627e\u5230\u5173\u8054\u7684\u5730\u65b9\uff0c\u7136\u540e\u540c\u6b65\u4fee\u6539\u6389\u3002\u4f60\u53ef\u5343\u4e07\u522b\u76f4\u63a5\u5220\u4e86\u4fee\u6539\u540d\u79f0\uff0c\u4e0d\u7136\u4f60\u53ef\u80fd\u4f1a\u82b1\u4e0a\u4e00\u5929\u7684\u65f6\u95f4\u6765\u89e3\u51b3\u91cd\u547d\u540d\u7684\u95ee\u9898\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u5b9e\u73b0\u6838\u5fc3\u5e93\u63a5\u53e3","text":"3.1. BaseWidget \u5728 BaseWidget \u91cc\u9762\u628a\u8be5\u5199\u7684\u90fd\u5199\u597d\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u4e0a\u9762\u7684\u8bbe\u8ba1\u7406\u5ff5\u6765\u5199\u3002 \u5982\u679c\u4f60\u5acc\u9ebb\u70e6\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u6587\u7ba1\u7684\u5b9e\u9645\u5de5\u7a0b\u4ee3\u7801 autotest_dde_file_manager : https://gerrit.uniontech.com/admin/repos/autotest_dde_file_manager \u3002 3.2. \u64cd\u4f5c\u5c42 \u5982\u679c\u4f60\u662f\u65b0\u5199\u9879\u76ee\uff0c\u4f60\u4f1a\u53d1\u73b0\u4e00\u5207\u90fd\u662f\u90a3\u4e48\u7684\u7b80\u5355\u3001\u76f4\u63a5\uff0c\u6309\u7167\u6211\u4eec\u63d0\u4f9b\u7ed9\u4f60\u7684\u63a5\u53e3\u5199\u7528\u4f8b\u7684\u64cd\u4f5c\u65b9\u6cd5\u5c31\u597d\u4e86\u3002 \u5982\u679c\u4f60\u662f\u60f3\u5bf9\u539f\u6765\u7684\u5de5\u7a0b\u8fdb\u884c\u6539\u9020\uff0c\u4f60\u9700\u8981\u6309\u7167\u6838\u5fc3\u5e93\u65b9\u6cd5\u7684\u8c03\u7528\uff0c\u5c06\u4f60\u4e4b\u524d\u5199\u7684\u6bcf\u4e2a\u65b9\u6848\u8fdb\u884c\u5bf9\u5e94\u7684\u4fee\u6539\uff0c\u5305\u62ec\u7c7b\u548c\u65b9\u6cd5\u7684\u547d\u540d\u3001\u65b9\u6cd5\u5185\u6240\u8981\u7528\u5230\u4e0d\u540c\u5b9a\u4f4d\u65b9\u6cd5\u7684\u5199\u6cd5\u4fee\u6539\u3002 \u8fd9\u65f6\u5019\u4f60\u53ef\u80fd\u4f60\u7684\u4ee3\u7801\u4e2d\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u62a5\u9519\uff0c\u4e0d\u7528\u62c5\u5fc3\uff0c\u4f60\u53ef\u4ee5\u4ece\u4e1a\u52a1\u903b\u8f91\u51fa\u53d1\uff0c\u60f3\u6e05\u695a\u8fd9\u4e2a\u65b9\u6cd5\u662f\u5e72\u4ec0\u4e48\u7684\u3001\u64cd\u4f5c\u7684\u5bf9\u8c61\u662f\u4ec0\u4e48\u3001\u53c2\u6570\u662f\u4ec0\u4e48\uff0c\u6ce8\u610f\u8fd9\u4e9b\u4fee\u6539\u662f\u4f1a\u5f71\u54cd\u5230\u7528\u4f8b\u4ee3\u7801\u91cc\u9762\u7684\uff0c\u6ca1\u5173\u7cfb\uff0c\u7528\u4f8b\u91cc\u9762\u672c\u6765\u4e5f\u5e94\u8be5\u88ab\u5173\u8054\u4fee\u6539\u3002 3.3. \u628a\u914d\u7f6e\u6a21\u5757\u5199\u597d\uff0c\u8fd9\u90e8\u5206\u57fa\u672c\u53ef\u4ee5\u590d\u5236\u6587\u7ba1\u7684\u4ee3\u7801\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4_1","title":"4\u3001\u8def\u5f84\u5904\u7406","text":"4.1. \u5bfc\u5165\u8def\u5f84 \u65b9\u6cd5\u548c\u7528\u4f8b\u4e2d\u90fd\u4f1a\u6d89\u53ca\u5230\u5bfc\u5165\u8def\u5f84\u7684\u4fee\u6539\uff0c\u5728\u4fee\u6539\u8def\u5f84\u65f6\uff0c\u5efa\u8bae\u4f60\u4f7f\u7528 Ctrl + Shift + R \u5168\u5c40\u66ff\u6362\uff0c\u4f1a\u5c06\u6574\u4e2a\u9879\u76ee\u4e0b\u7684\u76f8\u540c\u5730\u65b9\u90fd\u4fee\u6539\u5230\uff0c\u5f53\u7136\uff0c\u4f60\u4e5f\u53ef\u4ee5\u5728\u5c0f\u5f39\u7a97\u4e2d\u4fee\u6539\u5168\u5c40\u66ff\u6362\u4e3a\u5c40\u90e8\u76ee\u5f55\u4e0b\u66ff\u6362\u3002\u5904\u7406\u90a3\u79cd\u6ca1\u6709\u5173\u8054\u5173\u7cfb\uff0c\u4f46\u662f\u53c8\u662f\u76f8\u540c\u540d\u79f0\u7684\u91cd\u547d\u540d\uff0c\u6211\u4e5f\u63a8\u8350\u4f7f\u7528\u8fd9\u79cd\u65b9\u5f0f\u8fdb\u884c\u91cd\u547d\u540d\u3002 \u6ce8\u610f\uff0c\u5168\u5c40\u66ff\u6362\u7684\u65b9\u5f0f\u4efb\u7136\u65e0\u6cd5\u4fdd\u8bc1\u771f\u7684\u5168\u5c40\u88ab\u66ff\u6362\u4e86\uff08\u53ef\u80fd\u662f\u7f16\u8f91\u5668\u7684 Bug \u5427\uff09\uff0c\u6240\u4ee5\u4f60\u4ecd\u7136\u9700\u8981\u624b\u52a8\u770b\u4e0b\u5404\u5904\u662f\u5426\u4fee\u6539\u5230\u4f4d\u3002 4.2. \u8d44\u6e90\u8def\u5f84 \u4e00\u4e9b\u7528\u4f8b\u8d44\u6e90\u9700\u8981\u6839\u636e config.py \u91cc\u9762\u7684\u8def\u5f84\u914d\u7f6e\u8fdb\u884c\u8d44\u6e90\u8def\u5f84\u7684\u62fc\u63a5\uff0c\u5982\u679c\u4f60\u539f\u6765\u672c\u6765\u5c31\u6709\u4e00\u4e2a\u51fd\u6570\u4e13\u95e8\u7528\u4e8e\u7ec4\u88c5\u8def\u5f84\u7684\uff0c\u90a3\u4f60\u53ea\u9700\u8981\u4fee\u6539\u8fd9\u4e00\u4e2a\u5730\u65b9\u5c31\u597d\u4e86\uff0c\u5982\u679c\u4f60\u4e4b\u524d\u5e76\u6ca1\u6709\u8fd9\u6837\u7684\u8bbe\u8ba1\uff0c\u90a3\u53ef\u80fd\u9700\u8981\u4fee\u6539\u5927\u91cf\u6d89\u53ca\u5230\u8d44\u6e90\u8def\u5f84\u7684\u5730\u65b9\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5","title":"5\u3001\u8c03\u8bd5\u548c\u7f16\u5199\u7528\u4f8b","text":"\u4ee5\u4e0a\u51e0\u4e2a\u6b65\u9aa4\u505a\u5b8c\uff0c\u57fa\u672c\u5c31\u53ef\u4ee5\u8fdb\u884c\u7528\u4f8b\u4ee3\u7801\u7684\u8c03\u8bd5\u4e86\uff0c\u8fd9\u90e8\u5206\u5de5\u4f5c\u4e3b\u8981\u89e3\u51b3\u4f60\u4e4b\u524d\u51e0\u4e2a\u6b65\u9aa4\u9057\u6f0f\u7684\u95ee\u9898\uff0c\u5982\u679c\u6240\u6709\u7528\u4f8b\u90fd\u8c03\u8bd5\u901a\u8fc7\u4e86\uff0c\u90a3\u4e48\u5de5\u7a0b\u6539\u9020\u5c31\u5168\u90e8\u5b8c\u6210\u4e86\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/","title":"AT \u5f00\u53d1\u89c4\u8303","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u5f00\u53d1\u89c4\u8303\u662f\u6839\u636e\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fd0\u884c\u4e24\u5e74\u591a\u6765\uff0c\u9047\u5230\u95ee\u9898\u89e3\u51b3\u95ee\u9898\u800c\u5f62\u6210\u7684\u4e00\u4e9b\u89e3\u51b3\u65b9\u6848\uff0c\u6216\u8005\u8bf4\u7ecf\u9a8c\u603b\u7ed3\uff1b\u8fd9\u4e9b\u7ecf\u9a8c\u7b26\u5408\u6211\u4eec\u73b0\u9636\u6bb5 AT \u6240\u5e94\u7528\u7684\u573a\u666f\u9700\u8981\uff0c\u4e5f\u662f\u6211\u4eec\u7ecf\u8fc7\u957f\u671f\u601d\u8003\uff0c\u4e0d\u65ad\u8bd5\u9519\u4e0d\u65ad\u4fee\u6b63\uff0c\u5e76\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u5b9e\u8df5\u4e2d\u68c0\u9a8c\u8fc7\u53ef\u884c\u7684\u3002\u4ee5\u6b64\uff0c\u5e0c\u671b\u80fd\u5e2e\u52a9\u53c2\u4e0e\u5230\u81ea\u52a8\u5316\u7684\u76f8\u5173\u4eba\u5458\u51cf\u5c11\u8bd5\u9519\u6210\u672c\uff0c\u66f4\u597d\u3001\u66f4\u5feb\u7684\u7f16\u5199\u7528\u4f8b\u53ca\u7ef4\u62a4\u7528\u4f8b\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_1","title":"\u4e00\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u89c4\u8303","text":"\u6807\u7b7e\u5316\u7ba1\u7406\u6587\u6863\u8bf7\u53c2\u8003\uff1a \u300a\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u64cd\u4f5c\u6307\u5f15\u300b \u4ee5\u4e0b\u8bf4\u51e0\u4e2a\u5bb9\u6613\u51fa\u73b0\u7684\u95ee\u9898\uff1a"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1","title":"1. \u5bf9\u5e94\u5173\u7cfb","text":" \u5199\u5b8c\u81ea\u52a8\u5316\u7528\u4f8b\u4e4b\u540e\uff0c\u8bf7\u5728 CSV \u6587\u4ef6\u4e2d\u6807\u8bb0\u7528\u4f8b\u7684 ID\u3001\u7b49\u7ea7\u3002\u4e3a\u4e86\u63d0\u9192\u6807\u8bb0\uff0c\u6267\u884c\u7528\u4f8b\u65f6\u5728\u9996\u884c\u4f1a\u8f93\u51fa ERROR \u65e5\u5fd7\uff1a CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94\u7684 ID\uff1b \u5728\u6700\u7ec8\u63d0\u4ea4\u4ee3\u7801\u4e4b\u524d\uff0c\u4f60\u9700\u8981\u5728 CSV \u6587\u4ef6\u91cc\u9762\u5c06ID\u3001\u7528\u4f8b\u7b49\u7ea7\u7b49\u6807\u7b7e\u8865\u5168\uff0c\u5982\u679c CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94 ID\uff0c\u540e\u7eed\u5728\u6279\u91cf\u6267\u884c\u7684\u65f6\u5019\uff0c\u8fd9\u4e9b\u7528\u4f8b\u662f\u4e0d\u4f1a\u6267\u884c\u7684\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2","title":"2. \u540d\u79f0\u4e00\u81f4","text":" CSV \u6587\u4ef6\u7684\u6587\u4ef6\u540d\u3001\u7528\u4f8b\u51fd\u6570\u4e2d\u95f4\u7684\u540d\u79f0\u4e00\u81f4\u3001\u7528\u4f8b py \u6587\u4ef6\u4e2d\u95f4\u7684\u540d\u79f0\uff0c\u8fd9\u4e09\u4e2a\u540d\u79f0\u4e00\u81f4\u3002 \u4e3e\u4f8b\uff1a # test_music_001.py\ndef test_music_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u90a3\u4e48 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e3a music.csv\u3002 AT \u6846\u67b6\u5e95\u5c42\u4ee3\u7801\u5b9e\u73b0\u662f\u5c06 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e0e\u7528\u4f8b\u51fd\u6570\u540d\u79f0\u540d\u79f0\uff08item.name\uff09\u8fdb\u884c\u5bf9\u5e94\uff0c\u56e0\u6b64\uff0c\u6ce8\u610f CSV \u6587\u4ef6\u540d\u79f0\u5bf9\u5e94\u7684\u662f\u7528\u4f8b\u51fd\u6570\u540d\u79f0\uff0c\u5373 def test_music_001 \u91cc\u9762\u7684 music \uff0c\u800c\u4e0d\u662f test_music_001.py \u91cc\u9762\u7684 music \u3002 \u8fd9\u91cc\u7ec6\u7ec6\u54c1\u4e00\u4e0b\u54c8~ \u5982\u679c\u4f60\u5c06\u4e0a\u4f8b\u5199\u6210\u4e86\u8fd9\u6837: # test_music_001.py\ndef test_movie_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u7528\u4f8b\u6267\u884c\u6ca1\u95ee\u9898\uff0c\u4f46\u662f\u6807\u7b7e\u5316\u7ba1\u7406\u662f\u4e0d\u751f\u6548\u7684\uff0c\u6846\u67b6\u65e0\u6cd5\u5c06 music.csv\u6587\u4ef6\u91cc\u9762\u6807\u7b7e\uff0c\u6dfb\u52a0\u5230 test_movie_001\u8fd9\u4e2a\u7528\u4f8b\u4e2d\uff0c\u56e0\u4e3a\u4ed6\u4eec\u6ca1\u6709\u5bf9\u5e94\u5173\u7cfb\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#tag","title":"\u4e8c\u3001\u5206\u652f\u53ca tag \u7ba1\u7406\u89c4\u8303","text":"\u53c2\u8003\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u4ee3\u7801\u7ba1\u7406\u89c4\u8303\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2-tag","title":"2. \u5e94\u7528\u5e93 tag","text":" \u5e94\u7528\u5e93 tag \u6839\u636e\u5e94\u7528\u4ea4\u4ed8\u8282\u70b9\u751f\u6210\uff0c\u6bcf\u6b21\u6253 tag \u4e4b\u524d\uff0c\u76f8\u5173\u6d4b\u8bd5\u4eba\u5458\u9700\u8981\u8fdb\u884c\u7528\u4f8b\u8c03\u8bd5\uff1b \u8c03\u8bd5\u7528\u4f8b\u662f\u6307\u7684\u5728\u5168\u67b6\u6784\uff08x86\u3001arm\u3001mips\uff09\u4e0a\u8c03\u8bd5\u901a\u8fc7\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\u8fbe\u5230 90% \u4ee5\u4e0a\u624d\u80fd\u6253 tag\uff0c\u901a\u8fc7 Jenkins \u6267\u884c\u5668\u6267\u884c\u7528\u4f8b\uff0c\u4fdd\u7559\u901a\u8fc7\u7387\u7ed3\u679c\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\uff1a\u901a\u8fc7\u7528\u4f8b\u6570 / (\u603b\u7528\u4f8b\u6570 - \u5df2\u5e9f\u5f03\u7528\u4f8b) \u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u7b97\u901a\u8fc7 Jenkins \u6267\u884c\u5668 \u4f60\u53ef\u80fd\u4f1a\u5728\u4e00\u4e2a\u4ea4\u4ed8\u5468\u671f\u5185\u6301\u7eed\u7684\u8fdb\u884cAT\u7528\u4f8b\u8c03\u8bd5\uff0c\u4f46\u662f\u6700\u7ec8 AT \u7528\u4f8b\u6253 tag \u7684\u5e94\u7528\u7248\u672c\uff0c\u9700\u8981\u4f7f\u7528\u5e94\u7528\u96c6\u6210\u4ea4\u4ed8\u7684\u6700\u65b0\u5e94\u7528\u7248\u672c\uff0c\u53ef\u4ee5\u4f7f\u7528\u5e94\u7528\u7684\u63d0\u6d4b\u7248\u672c\uff1b\u4e00\u5b9a\u8981\u786e\u4fdd\u8c03\u8bd5\u7528\u4f8b\u7684\u5e94\u7528\u7248\u672c\u662f\u6700\u65b0\u7684\uff0c\u4e0d\u7136\u96c6\u6210\u8fdb\u53bb\u4e4b\u540e\uff0c\u6301\u7eed\u96c6\u6210\u5c31\u4f1a\u51fa\u95ee\u9898\uff1b tag \u53f7\u600e\u4e48\u6253\uff1f \u6839\u636e\u6301\u7eed\u96c6\u6210\u7684\u8981\u6c42\u751f\u6210\uff0c\u5176\u4e2d\u5e94\u7528\u7248\u672c\u53f7\u9700\u8981\u4e0e\u9879\u76ee\u7ecf\u7406\u786e\u8ba4\u672c\u6b21\u5373\u5c06\u96c6\u6210\u7684\u5e94\u7528\u7248\u672c\u53f7\u662f\u591a\u5c11\uff1b tag \u7684 commit \u4fe1\u606f\u683c\u5f0f\uff1a # commit msg\nversion:5.6.5\n \u5176\u4e2d 5.6.5 \u5199\u5e94\u7528\u7684\u96c6\u6210\u7248\u672c\u53f7\u3002 \u751f\u6210 tag \u7684\u547d\u4ee4\u53c2\u8003\uff1a\u300aGit \u6807\u7b7e\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3-tag","title":"3. \u57fa\u7840\u6846\u67b6 tag","text":"\u57fa\u7840\u6846\u67b6 tag \u4e0d\u4e0e\u4e1a\u52a1\u6302\u94a9\uff0c\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u6309\u9700\u53d1\u5e03\u7248\u672c\uff0c\u5728\u6839\u76ee\u5f55\u4e0b CURRENT \u6587\u4ef6\u4e2d\u8bb0\u5f55\u7684\u5f53\u524d\u7248\u672c\u53f7\u548c\u5386\u53f2\u7248\u672c\u53f7\uff0c\u53ca\u5176\u5bf9\u5e94\u65b0\u589e\u4e86\u54ea\u4e9b\u529f\u80fd\uff0c\u6709\u52a9\u4e8e\u5e94\u7528\u9009\u62e9\u5408\u9002\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\u3002 # CURRENT\n[current]\ntag = 0.9.5\n \u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u7684 control \u6587\u4ef6\u8bb0\u5f55\u5f53\u524d\u5e94\u7528\u5e93\u4f9d\u8d56\u7684\u57fa\u7840\u5e93\u7248\u672c\u3002 # control\n[Depends]\nautotest-basic-frame = 0.9.5\n \u7528\u4f8b\u5728\u6267\u884c\u65f6\u4f1a\u6821\u9a8c\u4e24\u4e2a\u6587\u4ef6\u7684\u7248\u672c\u53f7\u662f\u5426\u4e00\u81f4\uff0c\u5982\u679c\u4e0d\u4e00\u81f4\uff0c\u4f1a\u6253\u5370 error \u65e5\u5fd7\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_2","title":"\u4e09\u3001\u4ed3\u5e93\u6743\u9650\u7ba1\u7406","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_1","title":"1. \u57fa\u7840\u6846\u67b6","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u4ed3\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame \u57fa\u7840\u6846\u67b6\u4e0d\u5141\u8bb8\u533f\u540d\u8bbf\u95ee\uff0c\u5982\u679c\u4f60\u767b\u5f55 gerrit \u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u8bbf\u95ee\u4ee5\u4e0a\u94fe\u63a5\uff0c\u5219\u9700\u8981\u7533\u8bf7\u8bbf\u95ee\u6743\u9650\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_1","title":"2. \u5e94\u7528\u4ed3\u5e93","text":" \u81ea\u52a8\u5316\u5e94\u7528\u4ed3\u5e93\uff1a https://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684 app_name \u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_3","title":"\u56db\u3001\u65b9\u6cd5\u7f16\u5199&\u8c03\u7528\u89c4\u8303","text":"\u65b9\u6cd5\u7f16\u5199\u6574\u4f53\u8bbe\u8ba1\u601d\u8def\u53c2\u8003\uff1a[\u300aAT\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b]"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_2","title":"1. \u65b9\u6cd5\u7f16\u5199","text":"\u5199\u65b9\u6cd5\u7684\u65f6\u5019\u6ce8\u610f\u65b9\u6cd5\u5f52\u5c5e\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget\uff0c\u65b9\u6cd5\u662f\u5728\u54ea\u4e2a\u533a\u57df\u64cd\u4f5c\u7684\uff0c\u5c31\u5199\u5728\u54ea\u4e2a\u7c7b\u91cc\u9762\u3002 \u4e3e\u4f8b\uff1a from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n\"\"\"\u70b9\u51fb\u6807\u9898\u680fxxx\"\"\"\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_2","title":"2. \u65b9\u6cd5\u8c03\u7528","text":" \u5728\u7528\u4f8b\u4e2d\u8c03\u7528\u65b9\u6cd5\uff0c\u901a\u8fc7\u8be5\u5e94\u7528\u552f\u4e00\u7684\u51fa\u53e3\u8fdb\u884c\u8c03\u7528\uff0c\u6bd4\u5982\u6587\u7ba1\uff1a class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n \u4e0d\u8981\u5728\u7528\u4f8b\u4e2d\u5355\u72ec\u53bb\u8c03\u7528 TitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u8fd9\u4e9b\u7c7b\uff0c\u5426\u5219\u540e\u671f\u7528\u4f8b\u4f1a\u53d8\u5f97\u4e0d\u597d\u7ef4\u62a4\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_4","title":"\u4e94\u3001\u7528\u4f8b\u7f16\u5199\u89c4\u8303","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_3","title":"1. \u57fa\u4e8e\u7c7b\u5199\u7528\u4f8b","text":"\u6240\u6709\u7528\u4f8b\u90fd\u5e94\u8be5\u57fa\u4e8e\u7c7b\u53bb\u5199\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001(self):\n\"\"\"\u97f3\u4e50\u542f\u52a8\"\"\"\n \u6ce8\u610f\u4ee5\u4e0b\u51e0\u70b9\uff1a \u7c7b\u540d\u4e0d\u8981\u968f\u4fbf\u53d6\uff0c\u540c\u4e00\u4e2a\u5e94\u7528\u5e94\u8be5\u4f7f\u7528\u540c\u4e00\u4e2a\u7c7b\u540d\uff0c\u7528\u4f8b\u7c7b\u540d\u79f0\u5fc5\u987b\u4ee5 Test \u5f00\u5934\uff0c\u9075\u5faa\u5927\u9a7c\u5cf0\u547d\u540d\u89c4\u8303\uff1b \u7528\u4f8b\u7c7b\u7ee7\u627f BaseCase\uff0c\u4e00\u4e2a\u5e94\u7528\u53ea\u6709\u4e00\u4e2a BaseCase \u4e00\u4e2a py \u6587\u4ef6\u91cc\u9762\u53ea\u6709\u4e00\u4e2a\u7c7b\uff0c\u6211\u4eec\u79f0\u4e3a\u4e00\u4e2a\u6d4b\u8bd5\u7c7b\uff1b \u4e00\u4e2a\u7c7b\u91cc\u9762\u53ef\u4ee5\u6709\u591a\u4e2a\u7528\u4f8b\u51fd\u6570\uff0c\u8fd9\u53d6\u51b3\u8fd9\u6761\u7528\u4f8b\u6709\u591a\u5c11\u4e2a\u6d4b\u8bd5\u70b9\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001_1(self):\n\"\"\"\u4efb\u52a1\u680f\u542f\u52a8\u97f3\u4e50\"\"\"\ndef test_music_001_2(self):\n\"\"\"\u542f\u52a8\u5668\u542f\u52a8\u97f3\u4e50\"\"\" \ndef test_music_001_3(self):\n\"\"\"\u684c\u9762\u542f\u52a8\u97f3\u4e50\"\"\"\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_3","title":"2. \u7528\u4f8b\u51fd\u6570\u89c4\u8303","text":" \u7528\u4f8b\u51fd\u6570\u4ee5 test \u5f00\u5934\uff0c\u9075\u5faa\u86c7\u5f62\u547d\u540d\u89c4\u8303\uff0c\u4e2d\u95f4\u4e3a\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0\uff0c\u540e\u9762\u52a0\u7528\u4f8b ID\uff0c\u6700\u540e\u52a0\u6d4b\u8bd5\u70b9\u5e8f\u53f7\uff0c\u5373 test_${module}_${case_id}[_${index}] \uff1b \u6bd4\u5982\uff1atest_music_001_1\uff0cindex \u4ece 1 \u5f00\u59cb\u3002 \u51fd\u6570\u529f\u80fd\u8bf4\u660e\u91cc\u9762\u5199\u7528\u4f8b\u6807\u9898\uff0c\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u6807\u9898\u5373\u53ef\uff0c\u6ce8\u610f\u7528\u4e09\u5bf9\u53cc\u5f15\u53f7\uff0c\u4e0d\u8981\u7528\u5176\u4ed6\u6ce8\u91ca\uff0c\u66f4\u4e0d\u8981\u7528\u4e95\u53f7\u6ce8\u91ca\u5199\u7528\u4f8b\u6807\u9898\uff1b \u76f4\u63a5\u590d\u5236 PMS \u7528\u4f8b \u7528\u4f8b\u6b65\u9aa4\u76f4\u63a5\u5c06 PMS \u4e0a\u7528\u4f8b\u6b65\u9aa4\u548c\u9884\u671f\u590d\u5236\u8fdb\u6765\uff0c\u7136\u540e\u8fdb\u884c\u6279\u91cf\u6ce8\u91ca\uff08ctrl + /\uff09\uff0c\u5728\u6ce8\u91ca\u7684\u57fa\u7840\u4e0a\u53bb\u5199\u7528\u4f8b\u811a\u672c\u4f1a\u66f4\u52a0\u65b9\u4fbf\u5168\u9762\uff0c\u4e5f\u6bd4\u4f60\u81ea\u5df1\u5199\u6ce8\u91ca\u66f4\u8282\u7ea6\u65f6\u95f4\uff1a \u4e3e\u4f8b\uff0cPMS \u7528\u4f8b\uff1a \u76f4\u63a5\u9009\u4e2d\u7528\u4f8b\u5185\u5bb9\uff0c\u590d\u5236\u4e0b\u6765\uff0c\u7136\u540e\u7c98\u8d34\u5230\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c\u4e2d\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\n \u4e0a\u4f8b\u4e2d\u4e95\u53f7\u6ce8\u91ca\u90e8\u5206\u5c31\u662f\u76f4\u63a5\u4ece PMS \u4e0a\u590d\u5236\u8fc7\u6765\u7684\uff0c\u5728\u6b64\u57fa\u7840\u4e0a\u5199\u7528\u4f8b\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\nmusic = DeepinMusicWidget()\nmusic.click_singer_btn_in_music_by_ui()\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\nmusic.click_icon_mode_in_music_by_ui()\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\nmusic.double_click_first_singer_in_singer_icon_view_by_ui()\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\nself.assert_xxx\n \u4f60\u770b\uff0c\u975e\u5e38\u6e05\u695a\u6bcf\u4e00\u6b65\u5728\u505a\u4ec0\u4e48\uff0c\u91cd\u70b9\u662f\u7701\u53bb\u4e86\u5199\u6ce8\u91ca\u7684\u65f6\u95f4\uff0c\u771f\u7684\u7092\u9e21\u65b9\u4fbf\u3002 \u4e0d\u5199 if __name__ == '__main__':\uff0c\u4e0d\u5199\u591a\u4f59\u7684\u4ee3\u7801\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3","title":"3. \u6570\u636e\u9a71\u52a8","text":" \u5982\u679c\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u662f\u76f8\u540c\u7684\uff0c\u53ea\u662f\u4e00\u4e9b\u53c2\u6570\u53d8\u5316\uff0c\u5c3d\u91cf\u4f7f\u7528\u6570\u636e\u9a71\u52a8\u6765\u5b9e\u73b0\u7528\u4f8b\uff1b \u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u6570\u636e\u9a71\u52a8\u7684\u6570\u636e\uff0c\u4e0d\u80fd\u56e0\u6b64\u5f15\u5165\u4f9d\u8d56\uff0c\u5c3d\u91cf\u4f7f\u7528\u4e00\u4e9b\u6807\u51c6\u5e93\u80fd\u8bfb\u53d6\u7684\u6587\u4ef6\u683c\u5f0f\uff0c\u6bd4\u5982 json\u3001ini\u3001CSV\u3001xml\u3001txt \u7b49\u6587\u4ef6\u683c\u5f0f\uff1b\u4e0d\u5efa\u8bae\u4f7f\u7528 Yaml\u3001Excel\u3001MySQL \u7b49\u6570\u636e\u683c\u5f0f\uff1b \u8bfb\u53d6\u6570\u636e\u65f6\u4e5f\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff0c\u5982\u4f7f\u7528 pandas \u5904\u7406 CSV \u5c31\u5c5e\u4e8e\u5927\u6750\u5c0f\u7528\u4e86\uff0c\u6b63\u5e38\u7684\u6570\u636e\u9a71\u52a8\u8fd8\u6ca1\u5230\u9700\u8981\u5927\u6570\u636e\u5206\u6790\u6765\u5904\u7406\u7684\u5730\u6b65\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u5728 widget/ddt/ \u76ee\u5f55\u4e0b\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5199\u6cd5\uff1a @pytest.mark.parametrize(\"value\", data)\ndef test_smb_049(self, value):\n \u4ee5\u4e0a\u8fd9\u79cd\u53c2\u6570\u5316\u7684\u5199\u6cd5\u672c\u8eab\u6ca1\u4ec0\u4e48\u95ee\u9898\uff0c\u4f46\u662f\uff0c\u8fd9\u91cc\u5fc5\u987b\u8981\u8865\u5145\u4e00\u4e2a\u6ca1\u6709\u7528\u7684\u5c0f\u77e5\u8bc6\uff1a \u5982\u679c\u53c2\u6570\u5316\u6570\u636e\u91cc\u9762\u7684\u5b57\u7b26\u4f1a\u539f\u5c01\u4e0d\u52a8\u7684\u8f93\u51fa\u5230 item.name \u91cc\u9762\uff0c\u663e\u793a\u975e\u5e38\u4e0d\u4f18\u96c5\uff0c\u800c\u4e14\u53ef\u4ee5\u4f1a\u5f15\u5165\u4e00\u4e9b\u610f\u60f3\u4e0d\u5230\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u611f\u53d7\u4e00\u4e0b\uff1a \u53c2\u6570\uff1a data = [\n\"\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\", \"qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678\",\n]\n \u73b0\u8c61\u662f\u8fd9\u6837\u8272\u513f\u7684\uff1a test_smb_049.py::TestFileManager::test_smb_049[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09]\ntest_smb_049.py::TestFileManager::test_smb_049[qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui]\ntest_smb_049.py::TestFileManager::test_smb_049[12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678]\n \u8bf4\u5b9e\u8bdd\uff0c\u770b\u7740\u5fc3\u91cc\u5835\u5f97\u614c\uff0c\u5982\u679c\u8fd9\u91cc\u9762\u5305\u542b\u4e00\u4e9b\u7279\u6b8a\u5b57\u7b26\u6216\u8005\u662f\u8d85\u957f\uff0c\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u5f88\u5947\u5999\u7684\u4e8b\u60c5\u53d1\u751f\u3002 parametrize \u91cc\u9762\u6709\u4e2a\u53c2\u6570\uff1aids\uff0c\u53ef\u4ee5\u89e3\u51b3\u6b64\u7c7b\u95ee\u9898\uff0c\u5c31\u50cf\u8fd9\u6837\uff1a @pytest.mark.parametrize(\"value\", data, ids=[1, 2, 3])\ndef test_smb_049(self, value):\n \u518d\u6765\u611f\u53d7\u4e00\u4e0b\uff1a test_smb_049.py::TestFileManager::test_smb_049[1]\ntest_smb_049.py::TestFileManager::test_smb_049[2]\ntest_smb_049.py::TestFileManager::test_smb_049[3]\n \u660e\u663e\u597d\u591a\u4e86\uff0c\u6240\u4ee5\u5c3d\u91cf\u4f7f\u7528 ids \u8fd9\u4e2a\u53c2\u6570\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 fixture \u7684\u6570\u636e\u9a71\u52a8\u65b9\u5f0f\uff0c\u6846\u67b6\u867d\u7136\u652f\u6301\uff0c\u4f46\u53ef\u8bfb\u6027\u6bd4\u8f83\u5dee\uff1b\u5982\u679c\u4f60\u4e0d\u77e5\u9053\u8fd9\u53e5\u8bdd\u5728\u8bf4\u5565\uff0c\u90a3\u4f60\u53ef\u4ee5\u5ffd\u7565\uff0c\u6211\u4e5f\u4e0d\u6253\u7b97\u8be6\u7ec6\u8bf4\u8fd9\u79cd\u5b9e\u73b0\u65b9\u5f0f\uff0c\u64cd\u4f5c\u6bd4\u8f83\u9a9a\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4","title":"4. \u65ad\u8a00\u8d44\u6e90","text":" \u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u76f4\u63a5\u653e\u5728\u7528\u4f8b\u6a21\u5757\u7684\u540c\u7ea7\u76ee\u5f55\u4e0b\u7684 assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0 + \u7528\u4f8b ID \u547d\u540d\uff1b \u56fe\u50cf\u8bc6\u522b\u65ad\u8a00\uff0c\u4e0d\u8981\u622a\u53d6\u4e00\u5f20\u5f88\u5927\u7684\u56fe\uff0c\u56fe\u7247\u8d44\u6e90\u5305\u542b\u7684\u5143\u7d20\u592a\u591a\u4e86\uff0c\u975e\u5e38\u5bb9\u6613\u53d7\u5230\u9700\u6c42\u5f71\u54cd\uff0c\u5efa\u8bae\u662f\u8fdb\u884c\u5c40\u90e8\u7684\u65ad\u8a00\uff1b \u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u5339\u914d\u5ea6\u662f 0.9\uff0c\u5982\u679c\u65ad\u8a00\u7684\u573a\u666f\u5bf9\u4e8e\u7cbe\u786e\u5ea6\u8981\u6c42\u6ca1\u90a3\u4e48\u9ad8\uff0c\u53ef\u4ee5\u5728\u65ad\u8a00\u8bed\u53e5\u91cc\u9762\u4f20\u5165\u5c0f\u4e8e 0.9 \u7684\u53c2\u6570\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5","title":"5. \u5143\u7d20\u5b9a\u4f4d","text":" \u7528\u4e8e\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u4e2d\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u547d\u540d\u4e3a\u8be5\u5143\u7d20\u7684\u540d\u79f0\uff1b \u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u622a\u53d6\u65f6\u5c3d\u91cf\u7cbe\u786e\u5230\u8fd9\u4e2a\u5177\u4f53\u7684\u6309\u94ae\uff0c\u56fe\u7247\u4e5f\u4e0d\u8981\u592a\u5927\uff1b \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u64cd\u4f5c\u8f83\u5feb\uff0c\u5408\u7406\u52a0\u5165\u7b49\u5f85\u65f6\u95f4\u80fd\u63d0\u9ad8\u7528\u4f8b\u7684\u7a33\u5b9a\u6027\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6","title":"6. \u7528\u4f8b\u8d44\u6e90","text":" \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u4f7f\u7528\u5230\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u6bd4\u5982\u97f3\u4e50\u53ef\u80fd\u9700\u8981\u4e00\u4e9b mp3 \u7684\u8d44\u6e90\u7528\u4e8e\u6d4b\u8bd5\uff0c\u5b58\u653e\u5728 widget/case_res \u76ee\u5f55\u4e0b\uff0c\u524d\u63d0\u662f\u8fd9\u4e9b\u8d44\u6e90\u4e0d\u8d85\u8fc7 10M\uff1b \u5982\u679c\u662f\u4e00\u4e9b\u6bd4\u8f83\u5927\u7684\u8d44\u6e90\uff0c\u5efa\u8bae\u653e\u5230\u7edf\u4e00\u7684 ftp \u670d\u52a1\u5668 \uff08ftp://10.8.10.245\uff09\uff0c\u9700\u8981\u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\u518d\u4e0b\u8f7d\u4e0b\u6765\uff1b f\"wget ftp://{Config.FTP_IP}/uploads/\u591a\u5a92\u4f53/\u5f71\u9662/auto/{file_name};unzip {file_name};rm -rf {file_name};\"\n \u6d4b\u8bd5\u8d44\u6e90\u4e0b\u8f7d\u5230\u5e94\u7528 widget/case_res \u76ee\u5f55\u4e0b\uff1b \u7981\u6b62\u5c06\u6d4b\u8bd5\u8d44\u6e90\u5b58\u653e\u5728\u4e2a\u4eba\u7684\u673a\u5668\u4e0a\uff1b \u5e94\u8be5\u5c3d\u91cf\u4fdd\u8bc1\uff0c\u4e00\u4e2a\u8d44\u6e90\u5728\u4e00\u6b21\u7528\u4f8b\u6267\u884c\u4e2d\u53ea\u9700\u8981\u4e0b\u8f7d\u4e00\u6b21\uff0c\u6240\u4ee5\u4f60\u4e0d\u80fd\u6bcf\u6b21\u4f7f\u7528\u7684\u65f6\u5019\u90fd\u53bb\u4e0b\u8f7d\uff0c\u8fd9\u6837\u53ef\u80fd\u4f1a\u8017\u8d39\u5927\u91cf\u7684\u7f51\u7edc\u8d44\u6e90\uff0c\u800c\u56e0\u4e3a\u5148\u5224\u65ad\u672c\u5730\u662f\u5426\u5b58\u5728\u6b64\u8d44\u6e90\uff0c\u5982\u679c\u4e0d\u5b58\u5728\u518d\u53bb\u4e0b\u8f7d\uff1b \u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u5c06\u8d44\u6e90\u62f7\u8d1d\u5230\u5bf9\u5e94\u7684\u6d4b\u8bd5\u76ee\u5f55\u4e0b\uff0c\u6bd4\u5982\u5c06 mp3 \u6587\u4ef6\u62f7\u8d1d\u5230 ~/Music \u76ee\u5f55\u4e0b\uff0c\u4f46\u662f\u6211\u4eec\u66f4\u5efa\u8bae\u4f60\u4f7f\u7528\u53d1\u9001\u5feb\u6377\u94fe\u63a5\u7684\u65b9\u5f0f\u66ff\u4ee3\u62f7\u8d1d\u7684\u64cd\u4f5c\uff0c\u56e0\u4e3a\u5728\u62f7\u8d1d\u5927\u6587\u4ef6\u65f6\u662f\u5f88\u6d88\u8017\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u800c\u521b\u5efa\u94fe\u63a5\u5219\u4e0d\u4f1a\uff1b @classmethod\ndef recovery_many_movies_in_movie_by_cmd(cls):\n\"\"\"\u6062\u590d\u591a\u4e2a\u89c6\u9891\u6587\u4ef6\u81f3\u89c6\u9891\u76ee\u5f55\u4e2d\"\"\"\nwork_path = f\"/home/{Config.USERNAME}/Videos/auto\"\ncode_path = f\"{Config.CASE_RES_PATH}/auto\"\ncls.run_cmd(f\"rm -rf {work_path};mkdir {work_path}\")\nsleep(1)\nflag = False\nif not exists(code_path):\ncls.run_cmd(f\"mkdir -p {code_path}\")\nflag = True\nlogger.info(f\"ln -s {code_path}/* {work_path}/\")\ncls.run_cmd(\nf\"cd {code_path}/;\"\nf\"{cls.wget_file('auto.zip') if flag else ''}\"\nf\"ln -s {code_path}/* {work_path}/ > /dev/null 2>&1\"\n)\n \u8d44\u6e90\u4e0b\u8f7d\u8fc7\u7a0b\u4e2d\u6ce8\u610f\u8d85\u65f6\u7684\u95ee\u9898\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u5f88\u5927\uff0c\u8981\u7279\u522b\u6ce8\u610f\u8fd9\u95ee\u9898\uff0c\u5982\u679c\u4f60\u4f7f\u7528\u5f3a\u5236\u7b49\u5f85\u4e0b\u8f7d\u7ed3\u675f( os.system )\uff0c\u53ef\u80fd\u4f1a\u9020\u6210\u7528\u4f8b\u6267\u884c\u65f6\u957f\u53d8\u5f97\u4e0d\u53ef\u63a5\u53d7\uff0c\u76ee\u524d\u6211\u4eec\u53d1\u73b0\u5728\u6301\u7eed\u96c6\u6210\u73af\u5883\u6267\u884c\u65f6\u7f51\u7edc\u4e0b\u8f7d\u901f\u5ea6\u5f88\u6162\uff0c\u6240\u4ee5\u8d85\u65f6\u673a\u5236\u662f\u5f88\u6709\u5fc5\u8981\u7684\uff1brun_cmd \u65b9\u6cd5\u6709\u4e00\u4e2a\u9ed8\u8ba4\u8d85\u65f6\u7684\u65f6\u95f4\uff0c\u4f60\u53ef\u4ee5\u6839\u636e\u8d44\u6e90\u5927\u5c0f\u5bf9\u8d85\u65f6\u65f6\u95f4\u8fdb\u884c\u8c03\u6574\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_5","title":"\u516d\u3001\u7528\u4f8b\u8c03\u8bd5\u6280\u5de7","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_4","title":"1. \u65e5\u5fd7","text":" \u4e00\u5b9a\u8981\u5148\u770b\u62a5\u9519\uff0c\u770b error \u65e5\u5fd7\uff0c\u901a\u5e38\u80fd\u660e\u786e\u7684\u544a\u8bc9\u4f60\u5177\u4f53\u54ea\u91cc\u4ee3\u7801\u62a5\u9519\uff1b \u7ed3\u5408\u62a5\u9519\u70b9\u524d\u9762\u7684error\u3001 info \u548c debug \u65e5\u5fd7\u770b\u5426\u662f\u6b63\u5e38\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_4","title":"2. \u65ad\u70b9\u8c03\u8bd5","text":" \u65b9\u6cd5\u62a5\u9519\uff1a \u5728\u65b9\u6cd5\u5e93\u4e2d\u627e\u5230\u5bf9\u5e94\u7684\u65b9\u6cd5\uff0c\u5355\u72ec\u8c03\u7528\uff0c\u770b\u662f\u5426\u80fd\u6b63\u5e38\u6267\u884c\uff1b \u901a\u5e38\u5355\u4e2a\u65b9\u6cd5\u7684\u6267\u884c\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u62a5\u9519\uff0c\u5f88\u5feb\u5c31\u80fd\u6392\u67e5\u51fa\u95ee\u9898\uff1b\u5728\u65b9\u6cd5\u5185\u90e8\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u65b9\u6cd5\u5185\u90e8\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u8c03\u7528\u6ca1\u95ee\u9898\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u62a5\u9519\u7684\u65b9\u6cd5\u524d\u9762\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u7528\u4f8b\u7684\u4e1a\u52a1\u903b\u8f91\u548c\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u65ad\u8a00\u62a5\u9519\uff1a \u65ad\u8a00\u4e3a\u6570\u636e\u65ad\u8a00\uff0c\u6839\u636e\u8868\u8fbe\u5f0f\u8fdb\u884c\u65ad\u8a00\u8bed\u53e5\u8fdb\u884c\u4fee\u6539\uff1b \u6587\u4ef6\u751f\u6210\u7c7b\u65ad\u8a00\uff0c\u67e5\u770b\u662f\u5426\u9700\u8981\u52a0\u7b49\u5f85\u65f6\u95f4\uff1b \u56fe\u50cf\u65ad\u8a00\uff0c\u5728\u65ad\u8a00\u8bed\u53e5\u5904\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u7528\u4f8b\u8fd0\u884c\u5230\u65ad\u8a00\u5904\u4f1a\u505c\u6b62\uff0c\u67e5\u770b\u6b64\u65f6\u65ad\u8a00\u7684\u56fe\u7247\u4e0e\u7528\u4f8b\u6267\u884c\u7684\u73b0\u573a\u5b58\u5728\u4ec0\u4e48\u5dee\u5f02\uff0c\u6b64\u65f6\u4e5f\u53ef\u4ee5\u8fdb\u884c\u91cd\u65b0\u622a\u56fe\uff0c\u4ece\u800c\u66ff\u6362\u65b0\u7684\u56fe\u7247\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3_1","title":"3. \u8fdc\u7a0b\u6267\u884c","text":" \u8fdc\u7a0b\u6267\u884c\u6307\u7684\u662f\u7f16\u8f91\u5668\u901a\u8fc7\u6307\u5b9a\u8fdc\u7a0b\u89e3\u91ca\u5668\u6267\u884c\u81ea\u52a8\u5316\u4ee3\u7801\uff1b \u8fdc\u7a0b\u6267\u884c\u7684\u597d\u5904\u662f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u7684 Debug \u8fd0\u884c\uff0c\u4e0d\u7528\u5728\u6d4b\u8bd5\u673a\u4e0a\u6253\u5f00\u7f16\u8f91\u5668\uff0c\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u66f4\u5feb\uff1b \u652f\u6301\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u7684\u7f16\u8f91\u5668\uff1a \u4e13\u4e1a\u7248 Pycharm VScode \uff0c\u9700\u8981\u4f7f\u7528\u63d2\u4ef6 Remote-SSH \u8fdc\u7a0b\u6267\u884c\u914d\u7f6e \u4ee5 Pycharm \u4e3a\u4f8b\uff1a File \u2014> Settings \u2014> Project \u2014> Python Interpreter \u2014> \u53f3\u8fb9\u8bbe\u7f6e\u6309\u94ae \u2014> Add... \u2014> SSH Interpreter \u2014> New server configuration(\u586b\u5165host\u548cusername) \u2014> Next \u2014> password\uff08\u6d4b\u8bd5\u673a\u5bc6\u7801\uff09 \u2014> Interpreter(\u9009\u62e9\u8fdc\u7a0b\u89e3\u91ca\u5668) \u2014> Finish "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4_1","title":"4. \u73af\u5883\u6e05\u7406","text":" \u5982\u679c\u7528\u4f8b\u91cc\u9762\u7684 teardown \u6ca1\u6709\u6267\u884c\uff0c\u5927\u6982\u7387\u662f\u56e0\u4e3a setup \u91cc\u9762\u4ee3\u7801\u62a5\u9519\uff0c\u8fd9\u4e24\u4e2a\u662f\u4e00\u5bf9\u7684\uff0csetup \u91cc\u9762\u62a5\u9519\uff0cteardown \u91cc\u9762\u7684\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\uff1b \u76ee\u524d\u6211\u4eec\u5df2\u7ecf\u5c06\u5404\u5e94\u7528\u7684 clean_all \u8fd9\u4e2a fixture \u6539\u6210\u4e86\u7ec8\u7ed3\u5668\uff0c\u786e\u4fdd\u59cb\u7ec8\u80fd\u6267\u884c\u5230\u8fd9\u6b65\uff0c\u4f46\u662f\u7528\u4f8b\u91cc\u9762\u7684 fixture\uff0c\u8fd8\u662f\u9700\u8981\u6211\u4eec\u5c0f\u5fc3\u5904\u7406\uff1b \u8981\u6267\u884c clean_all \u9700\u8981\u5728\u7f16\u8f91\u5668\u8fd0\u884c\u53c2\u6570\u52a0 --clean yes\uff0c\u5199\u7528\u4f8b\u7684\u65f6\u5019\u8bf7\u52a0\u4e0a\uff0c\u4e0d\u7136\u4f60\u4e0d\u786e\u5b9a\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u7684\u73af\u5883\u662f\u5426\u6062\u590d\uff1b setup \u53ef\u4ee5\u4e0d\u8981\uff0c\u5c06 setup \u653e\u5230\u7528\u4f8b\u91cc\u9762\u662f\u4e00\u79cd\u7a33\u59a5\u7684\u505a\u6cd5\uff0cteardown \u4e00\u5b9a\u8981\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5_1","title":"5. \u5143\u7d20\u5b9a\u4f4d\u4e0d\u51c6\uff08\u5750\u6807\u8fd4\u56de\u4e0d\u5bf9\uff09","text":" \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u53ef\u80fd\u53d7\u5230\u7a97\u53e3 ID \u7684\u53d8\u5316\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u9ed8\u8ba4\u53d6\u6700\u65b0\u7684\u4e00\u4e2a\u7a97\u53e3\u7528\u4e8e\u5b9a\u4f4d\uff0c\u4f46\u5982\u679c\u5b9e\u9645\u9700\u8981\u5b9a\u4f4d\u7684\u4e0d\u662f\u6700\u65b0\u7684\u7a97\u53e3\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u91cd\u65b0\u5b9e\u4f8b\u5316\u65b9\u6cd5\u7c7b\u5bf9\u8c61\uff0c\u5e76\u5728\u7c7b\u4e2d\u4f20\u5165\u5bf9\u5e94\u7684\u7a97\u53e3\u5e8f\u53f7\uff1b \u57fa\u4e8e\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u76ee\u524d\u9047\u5230\u7684\u7b14\u8bb0\u672c\u4e0a\uff0c\u7531\u4e8e\u5c4f\u5e55\u7f29\u653e\u6bd4\u4f8b\u4e3a 1.25\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u6211\u4eec\u9ed8\u8ba4\u4f7f\u7528\u7f29\u653e\u6bd4\u4f8b\u4e3a 1\uff1b \u57fa\u4e8e\u56fe\u50cf\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u76ee\u6807\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b \u57fa\u4e8e OCR \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u6587\u5b57\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u540c\u6837\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6_1","title":"6. \u952e\u9f20\u64cd\u4f5c\u4e0d\u51c6","text":" \u9f20\u6807\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6bd4\u5982\u53f3\u952e\u3001\u53cc\u51fb\u65e0\u54cd\u5e94\uff1b \u952e\u76d8\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6216\u8005\u5ef6\u8fdf\u8f93\u5165\uff0c\u6bd4\u5982\u7528\u4f8b\u9700\u8981\u8f93\u5165\u201c\u6211\u662f\u4e2d\u56fd\u4eba\u201d\uff0c\u5b9e\u9645\u53ea\u8f93\u5165\u4e86\u201c\u6211\u56fd\u4eba\u201d\uff1b \u4ee5\u4e0a\u95ee\u9898\u6392\u9664\u5e94\u7528\u5361\u987f\u7b49\u95ee\u9898\uff0c\u5927\u6982\u7387\u662f\u7531\u4e8e\u5de5\u5177\u7684\u95ee\u9898\uff0c\u76ee\u524d\u952e\u9f20\u64cd\u4f5c\u6211\u4eec\u4f7f\u7528\u4e09\u4e2a\u5de5\u5177\uff1aDogtail \u63d0\u4f9b\u7684\u952e\u9f20\u5de5\u5177\u3001PyAutoGUI\u3001Xdotool \uff1b \u6709\u540c\u5b66\u53ef\u80fd\u8981\u8bf4\u4e3a\u5565\u8981\u7528\u4e09\u4e2a\u554a\uff0c\u7528\u4e00\u4e2a\u4e0d\u5c31\u597d\u4e86\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u5404\u6709\u4f18\u70b9\u5404\u6709\u7f3a\u70b9\u3002 \u5982\u679c\u4f60\u9047\u5230\u952e\u9f20\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u8bd5\u8bd5\u901a\u8fc7\u4e0d\u540c\u7684\u5de5\u5177\u64cd\u4f5c\uff1b\u952e\u76d8\u8f93\u5165\u5ef6\u8fdf\u7684\u95ee\u9898\uff0c\u4e00\u822c\u662f\u56e0\u4e3a\u8f93\u5165\u901f\u5ea6\u592a\u5feb\u4e86\uff0c\u7cfb\u7edf\u6ca1\u53cd\u5e94\u8fc7\u6765\uff0c\u5e38\u89c1\u4e8e ARM \u548c MIPS \u4e0a\uff0c\u4fee\u6539\u53c2\u6570 delay_time \u7684\u503c\uff0c\u5355\u4f4d\u4e3a\u6beb\u79d2\uff1b # mouse_key.py\n@classmethod\ndef input_message(cls, message, delay_time=300, interval=0.2):\n\"\"\"\n \u8f93\u5165\u5b57\u7b26\u4e32\n :param message: \u8f93\u5165\u7684\u5185\u5bb9\n :param delay_time: \u5ef6\u8fdf\u65f6\u95f4\n :param interval:\n :return:\n \"\"\"\n \u5982\u679c\u4e0d\u662f\u65b9\u6cd5\u7684\u95ee\u9898\uff0c\u5219\u9700\u8981\u7ee7\u7eed\u548c\u5f00\u53d1\u4e00\u8d77\u6392\u9664\uff0c\u662f\u5426\u4e3a\u5e94\u7528\u63a5\u53d7\u952e\u9f20\u4fe1\u53f7\u5904\u7406\u7684\u95ee\u9898\uff0c\u8fd9\u7c7b\u60c5\u51b5\u6211\u4eec\u4e5f\u662f\u9047\u5230\u8fc7\u7684\uff0c\u5177\u4f53\u95ee\u9898\u5177\u4f53\u5206\u6790\u3002 \u6bd4\u5982\u5f71\u9662\u5c31\u91cd\u5199\u4e86\u4e00\u4e2a\u53f3\u952e\u7684\u65b9\u6cd5\uff1a # base_widget.py\n@classmethod\ndef right_click(cls, _x=None, _y=None):\n\"\"\"\n \u91cd\u5199\u5e95\u5c42\u5355\u51fb\u9f20\u6807\u53f3\u952e\n \u89e3\u51b3\u5f71\u9662\u53f3\u952e\u89e6\u53d1release\u4e8b\u4ef6\u7684\u95ee\u9898\uff08\u53f3\u952e\u4e3b\u7a97\u53e3\u4f1a\u64ad\u653e\u89c6\u9891\uff09\n \"\"\"\ncls.mouse_down(_x, _y, button=3)\nsleep(0.1)\ncls.mouse_up(button=3)\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_6","title":"\u4e03\u3001\u5176\u4ed6\u4e0d\u4e3a\u4eba\u77e5\u7684\u7ec6\u8282","text":" \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u5c3d\u91cf\u7f16\u5199\u540c\u4e00\u4e2a\u5e94\u7528\u6216\u6a21\u5757\u7684\u7528\u4f8b\uff0c\u80fd\u5bf9\u8be5\u7528\u4f8b\u5df2\u6709\u65b9\u6cd5\u719f\u6089\uff0c\u907f\u514d\u8fc7\u591a\u91cd\u590d\u4e1a\u52a1\u4ee3\u7801\u7684\u5c01\u88c5\uff1b \u76f8\u540c\u7684\u573a\u666f\u4e0b\uff0c\u5404\u67b6\u6784\u7b49\u5f85\u65f6\u95f4\u4e0d\u540c\uff0c\u5efa\u8bae\u4f7f\u7528\u6846\u67b6\u63d0\u4f9b\u7684 sleep\uff0c\u6211\u4eec\u505a\u4e86\u4e0d\u540c\u67b6\u6784\u7684\u500d\u6570\u653e\u5927\uff1b \u7f16\u5199\u7528\u4f8b\u65f6\uff0c\u5c3d\u91cf\u8003\u8651\u5230\u6bcf\u4e00\u6b65\u5f02\u5e38\u540e\u7684\u73af\u5883\u6062\u590d\uff0c\u9700\u8981\u5efa\u8bae\u8fd9\u79cd\u610f\u8bc6\uff0c\u968f\u65f6\u8981\u8003\u8651\u5230\uff0c\u8fd9\u6b65\u64cd\u4f5c\u6709\u6ca1\u6709\u53ef\u80fd\u51fa\u9519\uff0c\u51fa\u9519\u4e86\u6539\u600e\u4e48\u529e\uff1b \u63d0\u4ea4\u4ee3\u7801\u7684\u65f6\u5019\u6ce8\u610f\u4e0d\u8981\u628a\u4e00\u4e9b\u4e34\u65f6\u7684\u6d4b\u8bd5\u8d44\u6e90\u63d0\u4ea4\u8fdb\u53bb\u4e86\uff0c\u6bd4\u5982\u6d4b\u8bd5\u4e86\u4e00\u4e2a\u5f71\u7247\uff0c\u6709\u4e9b\u540c\u5b66\u4e60\u60ef\u4f7f\u7528 git add . \uff0c\u7136\u540e\u5c31\u5168\u90e8\u63d0\u4ea4\u5230\u4ee3\u7801\u4ed3\u5e93\u4e86\uff0c\u8fd9\u6837\u5373\u4f7f\u540e\u671f\u628a\u5927\u6587\u4ef6\u5220\u4e86\uff0c.git \u6587\u4ef6\u91cc\u9762\u4e5f\u4f1a\u5f88\u5927\uff0c\u9020\u6210\u4ee3\u7801\u4ed3\u5e93\u53d8\u5f97\u5341\u5206\u81c3\u80bf\u3002 \u66f4\u591a\u7ec6\u8282\u67e5\u770b\uff1a\u300aAT\u7ecf\u9a8c\u603b\u7ed3\u300b"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/","title":"AT \u6267\u884c\u5668\u4f7f\u7528\u6307\u5317","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/5/25\n# Author : litao\n# =============================================\n Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1","title":"1\u3001\u529f\u80fd\u4ecb\u7ecd","text":" \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7cfb\u7edf\u8bed\u8a00\u8bbe\u7f6e\uff0c\u5206\u8fa8\u7387\u8bbe\u7f6e\u53ca\u7528\u4f8b\u6267\u884c\u73af\u5883\u642d\u5efa\uff1b \u652f\u6301 IP \u4e3a 15 \u7f51\u6bb5\u7684 AMD \u67b6\u6784\u6d4b\u8bd5\u673a\u955c\u50cf\u88c5\u673a\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u6307\u5b9a\u5e94\u7528\uff0c\u6307\u5b9a\u8303\u56f4\u6807\u7b7e\u7684\u7528\u4f8b\u6267\u884c\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u72b6\u6001\u68c0\u67e5\uff0c\u662f\u5426\u6709\u6b63\u5728\u8fd0\u884c\u7684\u6d4b\u8bd5\uff1b \u652f\u6301\u914d\u7f6e\u7528\u4f8b\u6267\u884c\u65f6\u957f\uff0c\u9632\u6b62\u4efb\u52a1\u963b\u585e\uff1b \u652f\u6301\u6839\u636e\u5e94\u7528\u7248\u672c\u81ea\u52a8\u67e5\u627e\u5bf9\u5e94\u7684\u7528\u4f8b tag\uff1b \u652f\u6301\u5f02\u5e38\u5904\u7406\u548c\u6d4b\u8bd5\u5b8c\u6210\u7684\u5b9e\u65f6\u6d88\u606f\u901a\u77e5\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2job","title":"2\u3001Job \u4ecb\u7ecd","text":"\u4ee5\u4e0b\u6309\u6267\u884c\u6d41\u7a0b\u7684\u987a\u5e8f\u4ecb\u7ecd\uff0c\u6bcf\u4e00\u6b65\u90fd\u53ef\u4ee5\u5355\u72ec\u6267\u884c\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1_1","title":"1\u3001\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/AT_test/ \u6574\u4e2a\u6d41\u7a0b\u7684\u4e3b\u5165\u53e3\uff0c\u901a\u8fc7\u8fd9\u4e2a\u5165\u53e3\uff0c\u8fde\u540c\u6574\u4e2a\u6d4b\u8bd5\u6d41\u7a0b\uff0c\u955c\u50cf\u88c5\u673a\uff0c\u73af\u5883\u90e8\u7f72\uff0c\u6d4b\u8bd5\u5e94\u7528\u53ca\u751f\u6210\u62a5\u544a\u3002 \u53c2\u6570\u4ecb\u7ecd\uff1a \u6d4b\u8bd5\u673a\uff1a\u6240\u6709\u89c4\u6574\u5230\u56fa\u5b9a\u533a\u57df\u7684\u6d4b\u8bd5\u673a\uff0c\u901a\u8fc7\u6d4b\u8bd5\u540c\u5b66\u5bf9\u6d4b\u8bd5\u673a\u7684\u4e60\u60ef\u547d\u540d\uff0c\u5728\u540e\u53f0\u6620\u5c04\u6d4b\u8bd5\u673a\u7684\u8be6\u7ec6\u4fe1\u606f\uff0c\u62ec\u53f7\u4e2d\u4e3a\u6d4b\u8bd5\u673a IP \u7684\u6700\u540e\u4e00\u4f4d\uff1b \u6d4b\u8bd5\u5e94\u7528\uff1a\u6307\u5b9a\u7684\u6d4b\u8bd5\u5e94\u7528\u7684\u5305\u540d\uff0c\u7cfb\u7edf\u6839\u636e\u540d\u79f0\u81ea\u52a8\u62c9\u53d6\u5bf9\u5e94\u7684\u4ed3\u5e93\u4ee3\u7801\uff1b deb\u5305\u4e0b\u8f7d\u5730\u5740\uff1a\u6d4b\u8bd5\u4e0a\u8ff0\u5e94\u7528\u65f6\uff0c\u9700\u8981\u5b89\u88c5\u7684deb\u5305\u4e0b\u8f7d\u5730\u5740\uff0c\u591a\u4e2a\u5730\u5740\u7528\u201c,\u201d\u9694\u5f00\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff1b \u8303\u56f4\u6807\u7b7e\uff1a\u6267\u884c\u6d4b\u8bd5\u7528\u4f8b\u7684\u6807\u7b7e\u8303\u56f4\uff0c\u5bf9\u5e94\u7528\u4f8b\u4ee3\u7801 csv \u6587\u4ef6\u4e2d\u7684\u6807\u7b7e\u4fe1\u606f\uff0c\u4ee5 pytest \u7684mark\u8bed\u6cd5\u7f16\u5199\uff1b \u7cfb\u7edf\u8bed\u8a00\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u8bed\u8a00\u73af\u5883\uff1b \u5206\u8fa8\u7387\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u5206\u8fa8\u7387\u73af\u5883\uff1b \u955c\u50cf\u5730\u5740\uff1a\u955c\u50cf\u4ed3\u5e93\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u901a\u8fc7 PXE \u88c5\u673a\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u88c5\u673a\u73af\u8282\uff08\u76ee\u524d\u4ec5\u652f\u6301\u90e8\u5206 AMD \u67b6\u6784\u7684\u88c5\u673a\uff09\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2pxe","title":"2\u3001PXE \u88c5\u673a","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/IOS_install/ \u8f93\u5165\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\uff0cIP\uff0c\u5bc6\u7801\uff0c\u955c\u50cf\u5730\u5740\u540e\uff0c\u81ea\u52a8\u88c5\u673a\uff0c\u76ee\u524d\u4ec5\u652f\u6301\u56fa\u5b9a 15 \u7f51\u6bb5\u7684\u90e8\u5206 AMD \u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#3","title":"3\u3001\u6b21\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/all_client_test/ \u8be5\u5165\u53e3\u4e0e\u4e3b\u5165\u53e3\u529f\u80fd\u57fa\u672c\u4e00\u81f4\uff0c\u53ea\u662f\u5265\u79bb\u4e86PXE\u88c5\u673a\u6d41\u7a0b\uff0c\u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7684\u6267\u884c\u6d41\u7a0b\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#4","title":"4\u3001\u73af\u5883\u90e8\u7f72","text":"Jenkins url\uff1ahttps://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/env/build?delay=0sec \u8bbe\u7f6e\u6d4b\u8bd5\u673a\u7684\u7cfb\u7edf\u8bed\u8a00\uff0c\u5206\u8fa8\u7387\u53ca\u5b89\u88c5\u6d4b\u8bd5\u6240\u9700\u7684\u4f9d\u8d56\u5305\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#5","title":"5\u3001\u53d1\u9001\u4ee3\u7801","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/send_code/ \u6839\u636e\u6d4b\u8bd5\u5e94\u7528\u540d\u79f0\uff0c\u62c9\u53d6\u5bf9\u5e94\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u5e76\u6839\u636e\u6d4b\u8bd5\u673a\u4e0a\u5e94\u7528\u7248\u672c\u5207\u6362\u5230\u5bf9\u5e94\u7684tag\u7248\u672c\uff0c\u82e5\u672a\u627e\u5230tag\u7248\u672c\uff0c\u5219\u4f7f\u7528\u6700\u65b0\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u518d\u6839\u636e\u5e94\u7528\u5e93\u4ee3\u7801\u4e2d\u914d\u7f6e\u7684\u57fa\u7840\u5e93\u7248\u672c\uff0c\u62c9\u53d6\u57fa\u7840\u5e93\u4ee3\u7801\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#6","title":"6\u3001\u7528\u4f8b\u6267\u884c","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/run_test/ \u8fd0\u884c\u6d4b\u8bd5\u673a\u4e0a\u7684\u7528\u4f8b"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/","title":"AT \u7528\u4f8b\u7b5b\u9009\u6307\u5317","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u7528\u4f8b\u7b5b\u9009\u6807\u51c6\uff0c\u662f\u6311\u9009\u5408\u9002\u7684\u6587\u672c\u7528\u4f8b\u8fdb\u884c\u81ea\u52a8\u5316\u7528\u4f8b\u8f6c\u5316\u7684\u4e00\u4e9b\u901a\u7528\u6807\u51c6\u3002 \u8fc7\u53bb\u6211\u4eec\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u5b9e\u8df5\u8fc7\u7a0b\u4e2d\uff0c\u5199\u4e86\u4e0d\u5c11\u81ea\u52a8\u5316\u7528\u4f8b\uff0c\u968f\u7740\u9700\u6c42\u7684\u8fed\u4ee3\uff0c\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u81ea\u7136\u8150\u5316\uff0c\u56e0\u800c\u9700\u8981\u5728\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\u5bf9\u81ea\u52a8\u5316\u7528\u4f8b\u8fdb\u884c\u7ef4\u62a4\uff0c\u5728\u7ef4\u62a4\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u6211\u4eec\u53d1\u73b0\uff0c\u6709\u4e9b\u7528\u4f8b\u7ef4\u62a4\u8d77\u6765\u592a\u96be\u4e86\uff0c\u8c03\u8bd5\u7528\u4f8b\u8017\u8d39\u5927\u91cf\u65f6\u95f4\uff0c\u6210\u672c\u5f88\u9ad8\u3002 \u56e0\u6b64\uff0c\u6211\u4eec\u603b\u7ed3\u4e00\u4e9b\u81ea\u52a8\u5316\u7528\u4f8b\u9009\u578b\u7684\u6807\u51c6\uff0c\u4ee5\u4f18\u5316\u540e\u7eed\u81ea\u52a8\u5316\u7528\u4f8b\u7ed3\u6784\uff0c\u671f\u5f85\u6211\u4eec\u80fd\u7f16\u5199\u51fa\u9ad8\u6548\u3001\u7a33\u5b9a\u3001\u6613\u4e8e\u7ef4\u62a4\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_1","title":"\u4e00\u3001\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u53ef\u4ee5\u5206\u4e3a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u548c\u4e13\u9879\u81ea\u52a8\u5316\u6d4b\u8bd5\uff0c\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e00\u822c\u53ea\u9488\u5bf9\u4e00\u4e9b\u5e38\u89c4\u7684\u529f\u80fd\u6d4b\u8bd5\uff0c\u5176\u4ed6\u975e\u5e38\u89c4\u529f\u80fd\u7684\u7528\u4f8b\uff0c\u5e94\u8be5\u91c7\u7528\u4e13\u9879\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u6848\uff1b \u4ee5\u4e0b\u662f\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1","title":"1. \u7a33\u5b9a\u6027\u3001\u538b\u6d4b\u7528\u4f8b","text":"\u7a33\u5b9a\u6027\u6d4b\u8bd5\u3001\u538b\u6d4b\u7528\u4f8b\u5e94\u8be5\u662f\u5c5e\u4e8e\u6027\u80fd\u76f8\u5173\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u5982\uff1a\u53cd\u590d\u591a\u6b21\u70b9\u51fb\u6309\u94ae\uff0c\u68c0\u9a8c\u5176\u529f\u80fd\u7a33\u5b9a\u6027\u3002\u56e0\u4e3a\u8fd9\u4e9b\u7528\u4f8b\u65ad\u8a00\u7684\u9884\u671f\u53ef\u80fd\u4e0d\u662f\u5f88\u660e\u786e\uff0c\u66f4\u6709\u751a\u8005\u4e0d\u9700\u8981\u65ad\u8a00\uff0c\u7528\u4f8b\u65f6\u957f\u6bd4\u8f83\u957f\uff0c\u800c\u4e14\u4e0d\u53ef\u63a7\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u76ee\u524d\u6211\u4eec\u6709\u6027\u80fd\u81ea\u52a8\u5316\u7684\u4e13\u9879\u65b9\u6848\uff0c\u4ee5\u53ca\u4e00\u4e9b\u7a33\u5b9a\u6027\u6d4b\u8bd5\u7684\u4e13\u9879\u65b9\u6848\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u6b64\u7c7b\u7528\u4f8b\u653e\u5230\u4e13\u9879\u81ea\u52a8\u5316\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2","title":"2. \u6d89\u53ca\u591a\u4e2a\u7528\u6237\u64cd\u4f5c","text":"\u5e38\u89c1\u4e0e\u6587\u7ba1\u7684\u7528\u4f8b\u4e2d\uff0c\u591a\u7528\u6237\u64cd\u4f5c\u7684\u7528\u4f8b\u4e00\u822c\u90fd\u4f1a\u6d89\u53ca\u5230\u5728\u7cfb\u7edf\u4e2d\u8fdb\u884c\u591a\u4e2a\u7528\u6237\u95f4\u7684\u5207\u6362\uff0c\u81ea\u52a8\u5316\u811a\u672c\u4e00\u822c\u662f\u8fd0\u884c\u5728\u4e00\u4e2a\u7528\u6237\u7a7a\u95f4\u4e0b\u7684\uff0c\u6240\u4ee5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u591a\u7528\u6237\u95f4\u7684\u5207\u6362\u3002 \u6b64\u7c7b\u4e0d\u5efa\u8bae\u91c7\u7528\u81ea\u52a8\u5316\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3","title":"3. \u4e0e\u5f00\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4ea4\u4e92","text":"\u6b64\u7c7b\u573a\u666f\u591a\u4e3a\u5e94\u7528\u7684\u5f02\u5e38\u573a\u666f\u6d4b\u8bd5\uff0c\u6bd4\u5982\uff1a\u590d\u5236\u5927\u6587\u4ef6\u8fc7\u7a0b\u4e2d\u6ce8\u9500\u673a\u5668\u3002 \u81ea\u52a8\u5316\u811a\u672c\u5728\u7cfb\u7edf\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4e4b\u540e\u662f\u4f1a\u505c\u6b62\u8fd0\u884c\u7684\uff1b\u6b64\u7c7b\u7528\u4f8b\u53ef\u4ee5\u505a\u81ea\u52a8\u5316\uff0c\u4f46\u662f\u540c\u6837\u9700\u8981\u505a\u4e13\u9879\u65b9\u6848\uff0c\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u7684\u5904\u7406\u903b\u8f91\u5b8c\u5168\u4e0d\u540c\u3002 \u540e\u7eed\u81ea\u52a8\u5316\u9700\u8981\u516c\u5173\u7684\u70b9\uff1a \u81ea\u52a8\u5316\u811a\u672c\u5728\u672c\u673a\u8fd0\u884c\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u81f3\u5c11\u9700\u8981\u63d0\u4f9b\u4ee5\u4e0b\u529f\u80fd\uff1a \u91cd\u542f\u4e4b\u540e\u7528\u4f8b\u80fd\u81ea\u52a8\u8fd0\u884c\uff1b\u53ef\u4ee5\u8003\u8651\u5c06\u6267\u884c\u7528\u4f8b\u5199\u6210\u4e00\u4e2a\u5f00\u673a\u81ea\u542f\u7684\u670d\u52a1\uff1b \u80fd\u8bb0\u5f55\u5173\u673a\u4e4b\u524d\u7528\u4f8b\u6267\u884c\u7684\u4f4d\u7f6e\uff0c\u91cd\u542f\u4e4b\u540e\u80fd\u4ece\u6b64\u4f4d\u7f6e\u5f00\u59cb\u6267\u884c\uff1b \u50cf\u6027\u80fd\u81ea\u52a8\u5316\u4e00\u6837\uff0c\u7531\u670d\u52a1\u7aef\u63a7\u5236\uff1b \u5b8c\u5168\u57fa\u4e8e\u56fe\u5f62\u8bc6\u522b\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u4e32\u53e3\u7ebf\u63a7\u5236\u952e\u9f20\u7a33\u5b9a\u6027\uff1b "},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4","title":"4. \u6d4b\u8bd5\u6267\u884c\u65f6\u95f4\u957f","text":"\u7528\u4f8b\u6267\u884c\u65f6\u95f4\u63a7\u5236\u57282\u5206\u949f\u4ee5\u5185\uff0c\u6781\u7aef\u60c5\u51b5\u4e0d\u8981\u8d85\u8fc75\u5206\u949f\uff0c\u6240\u6709\u7528\u4f8b\u7684\u5e73\u5747\u65f6\u957f\u5e94\u8be5\u57281\u5206\u949f\u5de6\u53f3\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u95f4\u592a\u957f\uff0c\u7f16\u5199\u7528\u4f8b\u3001\u8c03\u8bd5\u7528\u4f8b\u3001\u6267\u884c\u7528\u4f8b\u3001\u7ef4\u62a4\u7528\u4f8b\u90fd\u975e\u5e38\u7684\u8017\u65f6\uff0c\u4eba\u529b\u6210\u672c\u65f6\u95f4\u6210\u672c\u6295\u5165\u592a\u9ad8\u3002 \u4f60\u60f3\uff0c\u8fd9\u6761\u7528\u4f8b\u6267\u884c\u9700\u89815\u5206\u949f\uff0c\u90a3\u4f60\u5199\u8fd9\u6761\u7528\u4f8b\u7684\u65f6\u95f4\u4e0d\u53ef\u80fd\u4e00\u904d\u8fc7\uff0c\u5199\u7684\u8fc7\u7a0b\u4e2d\u8dd1\u4e0d\u901a\u8fd8\u5f97\u91cd\u8dd1\u81f3\u5c1115\u5206\u949f\u4e0d\u8fc7\u5206\uff0c\u5199\u5b8c\u4e86\u8fd8\u5f97\u5728\u5176\u4ed6\u67b6\u6784\u4e0a\u8c03\u8bd5\uff0c\u534a\u4e2a\u5c0f\u65f6\u8fc7\u53bb\u4e86\uff0c\u8fd9\u8fd8\u53ea\u662f\u7b2c\u4e00\u6b21\u5199\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u540e\u7eed\u5982\u679c\u7528\u4f8b\u7ef4\u62a4\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u7ecf\u5e38\u6295\u5165\u76f8\u5f53\u957f\u65f6\u95f4\uff0c\u8fd9\u6837\u5176\u5b9e\u662f\u5931\u53bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u7684\u3002\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u5c31\u5e94\u8be5\u662f\u5feb\u51c6\u72e0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5","title":"5. \u8fb9\u7f18\u6027\u6d4b\u8bd5","text":"\u6709\u4e9b\u529f\u80fd\u6a21\u5757\u672c\u8eab\u662f\u5c5e\u4e8e\u6bd4\u8f83\u8fb9\u7f18\u6027\u7684\uff0c\u5373\u6781\u5c11\u7528\u6237\u4f1a\u4f7f\u7528\u5230\u7684\u529f\u80fd\uff0c\u8fd9\u7c7b\u529f\u80fd\u6a21\u5757\u4e0d\u9700\u8981\u5927\u89c4\u6a21\u5b9e\u73b0\u81ea\u52a8\u5316\uff0c\u4e00\u4e24\u4e2a\u573a\u666f\u8986\u76d6\u57fa\u672c\u529f\u80fd\u5c31\u884c\u4e86\uff0c\u56e0\u6b64\u6211\u4eec\u5728\u6311\u9009\u6b64\u7c7b\u7528\u4f8b\u7684\u65f6\u5019\u53ef\u4ee5\u7ed3\u5408\u6574\u4e2a\u529f\u80fd\u6a21\u5757\u7684\u8986\u76d6\u60c5\u51b5\u6765\u51b3\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6","title":"6. \u9700\u8981\u4f9d\u8d56\u4eba\u5de5\u4ecb\u5165\u7684","text":"\u81ea\u52a8\u5316\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\u662f\u6ca1\u6709\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bd4\u5982\u8981\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u90a3\u4e48\u5c31\u80cc\u79bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u3002 \u6bd4\u5982\u5149\u9a71\u6a21\u5757\uff0c\u5149\u9a71\u523b\u5f55\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u4f46\u662f\u5149\u9a71\u523b\u5f55\u4e4b\u540e\u5149\u76d8\u4f1a\u5f39\u51fa\u6765\uff0c\u9700\u8981\u4eba\u5de5\u66f4\u6362\u5149\u76d8\uff0c\u518d\u624b\u52a8\u63a8\u8fdb\u5149\u9a71\u4e2d\u3002 \u8fd9\u79cd\u529f\u80fd\u6a21\u5757\u5373\u4f7f\u505a\u81ea\u52a8\u5316\uff0c\u80fd\u6d89\u53ca\u5230\u7684\u529f\u80fd\u975e\u5e38\u6709\u9650\uff0c\u800c\u4e14\u4e0d\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u6240\u4ee5\u660e\u663e\u5c31\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7","title":"7. \u96be\u4ee5\u5b9e\u73b0\u7684","text":"\u7528\u4f8b\u6240\u6d89\u53ca\u5230\u7684\u65b9\u6cd5\u5b9e\u73b0\u8d77\u6765\u53ef\u80fd\u6709\u96be\u5ea6\uff0c\u751a\u81f3\u73b0\u9636\u6bb5\u65e0\u6cd5\u5b9e\u73b0\u7684\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002 \u6bd4\u5982\u5f71\u9662\u6d4b\u8bd5\u753b\u9762\u6e05\u6670\u5ea6\u3001\u6d41\u7545\u5ea6\u3001\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u4e4b\u540e\u7684\u89c6\u9891\u662f\u5426\u5b58\u5728\u5361\u987f\u7b49\u7528\u4f8b\uff0c\u73b0\u9636\u6bb5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#8","title":"8. \u529f\u80fd\u4e0d\u7a33\u5b9a","text":"\u8fd9\u4e2a\u4e0d\u662f\u8bf4\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\uff0c\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\u4e0d\u7a33\u5b9a\u662f\u6b63\u5e38\u7684\uff0c\u8fd9\u79cd\u6211\u4eec\u53ef\u4ee5\u7b49\u5f00\u53d1\u63d0\u6d4b\u4e4b\u540e\u518d\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u3002 \u529f\u80fd\u4e0d\u7a33\u5b9a\u6307\u7684\u662f\u7528\u4f8b\u6240\u6d89\u53ca\u7684\u529f\u80fd\uff0c\u53ef\u80fd\u5b58\u5728\u591a\u79cd\u53d8\u5316\uff0c\u6bcf\u6b21\u6267\u884c\u7528\u4f8b\u53ef\u80fd\u65ad\u8a00\u7684\u9884\u671f\u90fd\u4e0d\u540c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#9","title":"9. \u52a8\u6001\u65ad\u8a00","text":"\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u76f4\u5230\u7528\u4f8b\u7ed3\u675f\uff0c\u4e00\u76f4\u662f\u4e00\u4e2a\u52a8\u6001\u53d8\u5316\u7684\u8fc7\u7a0b\uff0c\u800c\u4e14\u65e0\u6cd5\u901a\u8fc7\u5176\u4ed6\u624b\u6bb5\u505c\u4e0b\u6765\uff1b \u6bd4\u5982\uff1a\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u65f6\uff0c\u53f3\u4e0b\u89d2\u7684\u5f55\u5236\u65f6\u95f4\u662f\u4e00\u76f4\u5728\u53d8\u5316\u7684\uff0c\u7528\u4f8b\u9700\u8981\u6d4b\u8bd5\u5f55\u52361\u5206\u949f\u4e4b\u540e\uff0c\u5f55\u5236\u65f6\u95f4\u662f\u521a\u597d\u505c\u572860\u79d2\uff1b \u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fd8\u505a\u4e0d\u5230\u65f6\u95f4\u7cbe\u51c6\u63a7\u5236\uff0c\u7a0b\u5e8f\u6267\u884c\u65f6\u95f4\u662f\u6709\u6ce2\u52a8\u7684\uff0c\u800c\u4e14\u8981\u9002\u914d\u591a\u4e2a\u5e73\u53f0\uff0c\u6240\u4ee5\u6b64\u7c7b\u7528\u4f8b\u5927\u6982\u7387\u4f1a\u6267\u884c\u5931\u8d25\u3002\u7279\u522b\u662f\u5728\u6027\u80fd\u8f83\u5dee\u7684\u56fd\u4ea7\u5316\u67b6\u6784\u4e0a\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u592a\u53ef\u80fd\u7a33\u5b9a\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#10","title":"10. \u63a2\u7d22\u6027\u6d4b\u8bd5","text":"\u63a2\u7d22\u6027\u6d4b\u8bd5\u901a\u5e38\u662f\u4e00\u4e9b\u4e0d\u786e\u5b9a\u7684\u64cd\u4f5c\uff0c\u591a\u53d8\u5207\u590d\u6742\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u9884\u671f\u4e5f\u53ef\u80fd\u662f\u4e0d\u786e\u5b9a\u7684\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u9a9a\u64cd\u4f5c\u592a\u591a\u4e86\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6b64\u7c7b\u7528\u4f8b\u9002\u5408\u91c7\u7528\u624b\u5de5\u6d4b\u8bd5\uff0c\u662f\u624b\u5de5\u6d4b\u8bd5\u771f\u6b63\u7684\u4ef7\u503c\u4f53\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#11","title":"11. \u6613\u7528\u6027\u6d4b\u8bd5","text":"\u5bf9\u4e8e\u6613\u7528\u6027\u7684\u5224\u65ad\u901a\u5e38\u662f\u4e3b\u89c2\u7684\uff0c\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\u5f88\u96be\u53bb\u5b9a\u4e49\u4ec0\u4e48\u6837\u7684\u60c5\u51b5\u5bf9\u7528\u6237\u662f\u6613\u7528\u7684\uff0c\u81ea\u52a8\u5316\u9700\u8981\u6709\u660e\u786e\u7684\u53ef\u5b9e\u73b0\u7684\u9884\u671f\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_2","title":"\u4e8c\u3001\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u524d\u9762\u8bb2\u4e86\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u4e00\u4e9b\u7528\u4f8b\u60c5\u51b5\uff0c\u6709\u540c\u5b66\u5c31\u8bf4\u4e86\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\u4e0d\u7528\u8bb2\u4e86\uff0c\u5c31\u662f\u4e0d\u9002\u5408\u7684\u53cd\u9762\u3002\u6ca1\u6bdb\u75c5\u54c8\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\uff0c\u6211\u4eec\u5927\u4f53\u8fd8\u53ef\u4ee5\u5206\u4e3a\u4e24\u7c7b\uff1a \u7b2c\u4e00\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u597d\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u7b2c\u4e8c\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u4e00\u822c\uff0c\u9700\u8981\u6295\u5165\u66f4\u591a\u7cbe\u529b\u624d\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u4ee5\u4e0b\u4ecb\u7ecd\u4e00\u4e9b\u6211\u4eec\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1_1","title":"1. \u64cd\u4f5c\u76f8\u5bf9\u7b80\u5355","text":"\u7528\u4f8b\u6b65\u9aa4\u76f8\u5bf9\u8f83\u5c11\uff0c\u8fd9\u79cd\u7528\u4f8b\u901a\u5e38\u662f\u4e00\u4e9b\u8def\u5f84\u5f88\u6d45\u7684\u7528\u4f8b\uff0c\u4e00\u822c\u4e5f\u662f\u4e00\u4e9b\u57fa\u7840\u7528\u4f8b\u3002\u7528\u4f8b\u7f16\u5199\u3001\u7ef4\u62a4\u90fd\u53ef\u4ee5\u8f7b\u677e\u641e\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2_1","title":"2. \u5bb9\u6613\u5b9e\u73b0","text":"\u73b0\u6709\u6280\u672f\u662f\u53ef\u5b9e\u73b0\u7684\uff0c\u6ca1\u6709\u96be\u5ea6\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3_1","title":"3. \u7ecf\u5e38\u7528\u4e8e\u56de\u5f52\u6d4b\u8bd5","text":"\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bcf\u6b21\u56de\u5f52\u6d4b\u8bd5\u5fc5\u987b\u8981\u6267\u884c\u7684\u7528\u4f8b\uff0c\u90a3\u4e48\u8fd9\u6761\u7528\u4f8b\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u3002 \u56de\u5f52\u6d4b\u8bd5\u65f6\u6211\u4eec\u9996\u5148\u5e94\u8be5\u4fdd\u8bc1\u5e94\u7528\u5386\u53f2\u57fa\u672c\u529f\u80fd\u6b63\u5e38\uff0c\u6240\u4ee5\u90a3\u4e9b\u6bcf\u6b21\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u90fd\u8981\u6267\u884c\u7684\u7528\u4f8b\u9002\u5408\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4_1","title":"4. \u529f\u80fd\u7a33\u5b9a\u7684\u6838\u5fc3\u529f\u80fd","text":"\u6d89\u53ca\u6838\u5fc3\u529f\u80fd\u7684\u7528\u4f8b\u662f\u6700\u6700\u91cd\u8981\u7684\u7528\u4f8b\uff0c\u4e5f\u662f\u6211\u4eec\u4ea4\u4ed8\u65f6\u5fc5\u987b\u8981\u4fdd\u8bc1\u8d28\u91cf\u7684\u76f8\u5173\u529f\u80fd\uff0c\u56e0\u6b64\u5e94\u8be5\u5c3d\u53ef\u80fd\u7684\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5_1","title":"5. \u8f93\u5165\u6570\u636e\u6d4b\u8bd5","text":"\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u901a\u5e38\u662f\u68c0\u9a8c\u88ab\u6d4b\u5e94\u7528\u63a5\u53d7\u6709\u6548\u6570\u636e\u3001\u62d2\u7edd\u65e0\u6548\u6570\u636e\u7684\u80fd\u529b\u3002\u5982\uff1a\u63d0\u4ea4\u8d85\u957f\u5b57\u7b26\u4e32\u3001\u7279\u6b8a\u5b57\u7b26\u4e32\u7b49\u7b49\u3002 \u6b64\u7c7b\u7528\u4f8b\u624b\u5de5\u6d4b\u8bd5\u5f88\u96be\u6bd4\u8f83\u5168\u9762\u7684\u8986\u76d6\u5230\u6240\u6709\u7684\u8f93\u5165\u60c5\u51b5\uff0c\u4f46\u662f\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\uff0c\u6b64\u7c7b\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u90fd\u662f\u4e00\u6837\u7684\uff0c\u53d8\u5316\u7684\u4ec5\u662f\u8f93\u5165\u53c2\u6570\u548c\u65ad\u8a00\u7ed3\u679c\uff0c\u91c7\u7528\u6570\u636e\u9a71\u52a8\uff0c\u53ef\u4ee5\u8f7b\u677e\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6_1","title":"6. \u683c\u5f0f\u8986\u76d6","text":"\u539f\u56e0\u540c\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u7c7b\u7528\u4f8b\u4e00\u6837\uff0c\u591a\u79cd\u683c\u5f0f\u7684\u8986\u76d6\u4e5f\u662f\u4e00\u4e2a\u5f88\u7e41\u7410\u7684\u4e8b\u60c5\uff0c\u4ea4\u7ed9\u81ea\u52a8\u5316\u6765\u505a\u518d\u5408\u9002\u4e0d\u8fc7\u4e86\u3002 \u6bd4\u5982\u5f71\u9662\u5bf9\u5f71\u7247\u683c\u5f0f\u7684\u68c0\u67e5\u3001\u622a\u56fe\u5f55\u5c4f\u5bf9\u4fdd\u5b58\u683c\u5f0f\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7_1","title":"7. \u68c0\u67e5\u5143\u7d20\u72b6\u6001","text":"\u67e5\u770b\u88ab\u6d4b\u5e94\u7528\u7684\u5143\u7d20\u5c5e\u6027\u3002\u5982\uff1a\u56fe\u7247\u7684\u5927\u5c0f\u548c\u6392\u5217\uff1b\u6309\u94ae\u7684\u53ef\u7528\u548c\u4e0d\u53ef\u7528\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/","title":"AT \u7ecf\u9a8c\u603b\u7ed3","text":"\u6b22\u8fce\u6240\u6709\u4eba\u63d0\u4ea4\u4f60\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u9762\u7684\u4f18\u79c0\u5b9e\u8df5\u7ecf\u9a8c\uff0c\u4ee5\u5e2e\u52a9\u5927\u5bb6\u89e3\u51b3\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#1","title":"1\u3001\u7ec8\u7ed3\u5668","text":"# litaoa@uniontech.com\n \u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4 pytest \u5b9e\u73b0\u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4\u7684\u65b9\u5f0f\u6709\u4e24\u79cd\uff0cyield \u548c\u7ec8\u7ed3\u51fd\u6570\uff1b yield \u5b9e\u73b0\uff0cyield\u524d\u9762\u4e3a\u7528\u4f8b\u7684\u524d\u7f6e\u6b65\u9aa4\uff0cyield \u540e\u9762\u4e3a\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4\u3002 @pytest.fixture\ndef clean_env():\nprint(\"setup\")\nyield\nprint(\"teardown\")\n \u7ec8\u7ed3\u51fd\u6570\u5b9e\u73b0\uff0c\u4f7f\u7528 request.addfinalizer \u6ce8\u518c\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4 @pytest.fixture\ndef clean_env(request):\ndef clean():\nprint(\"teardown\")\nrequest.addfinalizer(clean)\nprint(\"setup\")\n yield\u7684\u4f18\u7f3a\u70b9\uff1a \u4f18\u70b9\uff1a\u4ee3\u7801\u7b80\u6d01\uff0c\u76f4\u89c2\uff0c\u53ef\u4f7f\u7528yield\u5728\u7528\u4f8b\u4e2d\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c \u7f3a\u70b9\uff1a\u82e5\u524d\u7f6e\u6b65\u9aa4\u4e2d\u51fa\u73b0\u9519\u8bef\uff0c\u5219\u540e\u7f6e\u6b65\u9aa4\u4e0d\u4f1a\u6267\u884c \u7ec8\u7ed3\u51fd\u6570\uff1a \u4f18\u70b9\uff1a\u524d\u7f6e\u6b65\u9aa4\u5931\u8d25\u7684\u8bdd\uff0c\u540e\u7f6e\u6b65\u9aa4\u4ecd\u4f1a\u6267\u884c\u4e14\u53ef\u4ee5\u6ce8\u518c\u591a\u4e2a\u540e\u7f6e\u6b65\u9aa4\uff08\u524d\u63d0\uff1a\u9700\u8981\u5728\u4ee3\u7801\u62a5\u9519\u4e4b\u524d\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff09\uff0c\u652f\u6301\u7075\u6d3b\u4f7f\u7528\u540e\u7f6e\u6761\u4ef6 \u7f3a\u70b9\uff1a\u4ee3\u7801\u8f83\u4e3a\u590d\u6742\uff0c\u65e0\u6cd5\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c\uff08\u672c\u4eba\u76ee\u524d\u672a\u5b9e\u73b0\uff09 \u603b\u7ed3\uff1a\u5728\u524d\u7f6e\u6b65\u9aa4\u4fdd\u8bc1\u7edd\u5bf9\u4e0d\u4f1a\u51fa\u9519\u65f6\uff0c\u4f7f\u7528yield\u66f4\u4f73\u7b80\u4fbf\uff0c\u5f53\u524d\u7f6e\u6b65\u9aa4\u6613\u51fa\u73b0\u95ee\u9898\u65f6\uff0c\u63a8\u8350\u4f7f\u7528\u7ec8\u7ed3\u51fd\u6570\u3002 \u573a\u666f\uff1a\u4fdd\u9669\u7bb1\u7528\u4f8b\uff0c\u524d\u7f6e\u6b65\u9aa4\u4e2d\u5f00\u542f\u4fdd\u9669\u7bb1\uff0c\u540e\u7f6e\u6b65\u9aa4\u5220\u9664\u4fdd\u9669\u7bb1\u3002 @pytest.fixture(scope=\"session\", autouse=True)\ndef vault_fixture(request):\nDfmWidget.reset_vault_by_cmd() # 1\u3001\u91cd\u7f6e\u4fdd\u9669\u7bb1\nDdeDockPublicWidget().close_file_manager_by_cmd() # 2\u3001\u5173\u95ed\u6587\u7ba1\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 3\u3001\u5f00\u542f\u6587\u7ba1\nvault = DfmWidget()\nvault.create_file_vault() # 4\u3001\u521b\u5efa\u4fdd\u9669\u7bb1\ndef delete_vault(): # 8\u3001\u5220\u9664\u4fdd\u9669\u7bb1\u7684\u540e\u7f6e\u6b65\u9aa4\nsleep(2)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr()\nvault = DfmWidget()\nvault.delete_file_vault()\nDfmWidget.reset_vault_by_cmd()\nDdeDockPublicWidget().close_file_manager_by_cmd()\nrequest.addfinalizer(delete_vault) # 5\u3001\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\nDdeDockPublicWidget().close_file_manager_by_cmd() # 6\u3001\u5173\u95ed\u6587\u7ba1\nsleep(1)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 7\u3001\u5f00\u542f\u6587\u7ba1\n \u4ee3\u7801\u6309\u6ce8\u91ca\u4e2d\u7684\u5e8f\u53f7\u6267\u884c\u6b65\u9aa4 \u4ee3\u7801\u5728\u6b65\u9aa41-4\u4efb\u610f\u4f4d\u7f6e\u62a5\u9519\uff0c\u5219\u4e0d\u4f1a\u6267\u884c\u6b65\u9aa48\uff0c\u56e0\u4e3a\u672a\u6267\u884c\u5230\u6b65\u9aa45\uff0c\u6b65\u9aa48\u8fd8\u672a\u6ce8\u518c \u4ee3\u7801\u5728\u6b65\u9aa46-7\u62a5\u9519\uff0c\u4ecd\u4f1a\u6267\u884c\u6b65\u9aa47\uff0c\u56e0\u4e3a\u5728\u6b65\u9aa45\u4e2d\u5df2\u7ecf\u5c06\u6b65\u9aa47\u6ce8\u518c \u53ef\u4ee5\u7075\u6d3b\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff0c\u80fd\u5b9e\u73b0\u67d0\u4e2a\u524d\u7f6e\u6b65\u9aa4\u6267\u884c\u4e4b\u540e\uff0c\u624d\u4f1a\u6267\u884c\u540e\u7f6e\u6b65\u9aa4\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#2","title":"2\u3001\u542f\u52a8\u5e94\u7528\u7684\u65b9\u5f0f","text":"# huangmingqiang@uniontech.com\n \uff081\uff09\u547d\u4ee4\u884c\u542f\u52a8 \u5728 AT \u4ee3\u7801\u4e2d\u4f7f\u7528\u547d\u4ee4\u884c\u542f\u52a8\u5e94\u7528\uff0c\u4e3e\u4f8b\uff1a os.popen(\"deepin-music\")\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f7f\u7528 ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6\uff0cdogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u3002 \uff082\uff09\u901a\u8fc7 UI \u64cd\u4f5c\u542f\u52a8 \u901a\u8fc7\u4efb\u52a1\u680f\u3001\u542f\u52a8\u5668\u3001\u684c\u9762\u7b49UI\u65b9\u5f0f\u542f\u52a8\uff0c\u6bd4\u5982\u53cc\u51fb\u6253\u5f00\u3001\u53f3\u952e\u6253\u5f00\u7b49\uff0c\u8fd9\u79cd\u64cd\u4f5c\u65b9\u5f0f\u4e0d\u5b58\u5728ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6dogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u7684\u95ee\u9898\uff0c\u4e5f\u66f4\u52a0\u7b26\u5408\u7528\u6237\u7684\u64cd\u4f5c\u884c\u4e3a\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#3","title":"3\u3001\u6587\u4ef6\u9009\u62e9\u6846\u5c5e\u6027\u5b9a\u4f4d\u5076\u73b0\u65e0\u6cd5\u627e\u5230","text":"\u6587\u4ef6\u9009\u62e9\u6846\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5728\u8c03\u7528\u6587\u4ef6\u9009\u62e9\u6846\u65f6\uff0c\u6709\u4e00\u5b9a\u7684\u6982\u7387\u51fa\u73b0\uff0c\u754c\u9762\u5df2\u7ecf\u6e32\u67d3\u51fa\u6765\u4e86\uff0c\u4f46\u662f\u5c5e\u6027\u6811\u5e76\u6ca1\u6709\u5199\u5165\uff0c\u5bfc\u81f4\u901a\u8fc7\u5c5e\u6027\u65e0\u6cd5\u627e\u5230\u5143\u7d20\uff0c\u76ee\u524d\u4e5f\u6ca1\u6709\u5f88\u597d\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u4e3a\u4e86\u7528\u4f8b\u7a33\u5b9a\u6027\uff0c\u6587\u4ef6\u9009\u62e9\u6846\u7684\u64cd\u4f5c\u5efa\u8bae\u4f7f\u7528UI\u6216\u8005\u56fe\u7247\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u53ef\u4ee5\u901a\u8fc7\u641c\u7d22\u5185\u5bb9\u56fa\u5b9a\u6587\u4ef6\u4f4d\u7f6e\u3002 # litaoa@uniontech.com\n desk = DdeDesktopPublicWidget()\n# \u9009\u62e9\u89c6\u9891\u76ee\u5f55\ndesk.click_videos_dir_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.ctrl_f()\nsleep(1)\ndesk.input_message(\"\u5143\u7d20\u540d\u79f0\")\nsleep(0.5)\ndesk.enter()\nsleep(1)\n# \u9009\u62e9\u7b2c\u4e00\u4e2a\u6587\u4ef6\ndesk.click_list_view_btn_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.click_first_file_in_desktop_plugs_by_ui()\nsleep(1)\n# \u6587\u7ba1\u63d2\u4ef6\u4e2d\u70b9\u51fb\u6253\u5f00\ndesk.click_open_btn_in_desktop_plugs_by_ui()\n"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#4","title":"4\u3001\u5e94\u7528\u542f\u52a8","text":"# mikigo\n \u5728UI\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u4e00\u5207\u64cd\u4f5c\u7684\u90fd\u662f\u4ece\u5e94\u7528\u542f\u52a8\u5f00\u59cb\u7684\uff0c\u800c\u5728Linux\u684c\u9762\u5e94\u7528\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u6211\u4eec\u542f\u52a8\u5e94\u7528\u7684\u65b9\u6cd5\u6709\u591a\u79cd\uff0c\u4e0b\u9762\u505a\u4e00\u4e2a\u7b80\u5355\u7684\u4ecb\u7ecd\uff1a \u3010\u4f7f\u7528dogtail\u542f\u52a8\u3011 dogtail\u63d0\u4f9b\u4e86\u5e94\u7528\u542f\u52a8\u7684\u65b9\u6cd5\uff0c\u5728utils\u5e93\u4e2d\uff0c\u4f7f\u7528run\u65b9\u6cd5\u542f\u52a8\uff1a \u9996\u5148\u5bfc\u5165\u65b9\u6cd5\uff1a from dogtail.utils import *\n \u8c03\u7528run\u65b9\u6cd5 run('deepin-music')\n \u5373\u53ef\u542f\u52a8\u97f3\u4e50 \u8fd9\u79cd\u65b9\u6cd5\u7684\u4f18\u70b9\u662f\u91c7\u7528\u8fdb\u7a0b\u7684\u65b9\u5f0f\u76f4\u63a5\u542f\u52a8\uff0c\u4e0d\u4f9d\u8d56\u4e0eUI\uff0c\u65e0\u8bba\u684c\u9762\u6216\u4efb\u52a1\u680f\u4e0a\u662f\u5426\u5b58\u5728\u5e94\u7528\u56fe\u6807\uff0c\u90fd\u53ef\u4ee5\u6b63\u5e38\u542f\u52a8\u3002 \u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c \u5982\u679c\u4f7f\u7528ssh\u8fdc\u7a0b\u8c03\u7528\uff0c\u6216\u8005Jenkins\u4e2d\u6267\u884c\u6d4b\u8bd5\u811a\u672c\u7684\u65f6\u5019\uff0c\u5728sniff\u4e2d\u4f1a\u51fa\u73b0\u627e\u4e0d\u5230\u5e94\u7528\uff0c\u7ecf\u8fc7\u5206\u6790\uff0c\u53ef\u80fd\u662f\u56e0\u4e3a\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\u542f\u52a8\u7684\u65f6\u5019\uff0c\u5b9e\u9645\u662f\u91c7\u7528\u4e00\u4e2a\u5b50\u8fdb\u7a0b\u542f\u52a8\u4e86\u5e94\u7528\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u5230\u3002 \u3010\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u3011 \u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807 \u901a\u5e38\u6709\u4e24\u79cd\u65b9\u6cd5\uff1a \uff081\uff09\u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807\u3002 \uff082\uff09\u5df2\u77e5\u5e94\u7528\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u7684\u4f4d\u7f6e\uff0c\u7136\u540e\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u5bf9\u5e94\u5750\u6807\u3002 \u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u7f3a\u70b9\u662f\u4f4d\u7f6e\u5fc5\u987b\u56fa\u5b9a\uff0c\u5982\u679c\u79fb\u52a8\u4f4d\u7f6e\u5c31\u4e0d\u884c\u4e86\uff0c\u800c\u4f7f\u7528\u7b2c\u4e00\u79cd\u65b9\u6cd5\uff0c\u65e0\u8bba\u4f4d\u7f6e\u5728\u54ea\u91cc\uff0c\u53ea\u8981\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u5b58\u5728\u5373\u53ef\u3002 \u3010\u70b9\u51fb\u684c\u9762\u56fe\u6807\u542f\u52a8\u3011 \u684c\u9762\u56fe\u6807\u76ee\u524d\u662f\u91c7\u7528\u56fe\u50cf\u8bc6\u522b\u6280\u672f\uff0c\u5b9a\u4f4d\u5230\u5e94\u7528\u56fe\u6807\u7684\u5750\u6807\uff0c\u7136\u540e\u901a\u8fc7pyauogui\u8fdb\u884c\u70b9\u51fb\u64cd\u4f5c\u3002 \u8be6\u7ec6\u6280\u672f\u65b9\u6848\u53ef\u4ee5\u53c2\u8003\u6211\u7684\u53e6\u5916\u4e24\u7bc7\u535a\u5ba2: \u57fa\u4e8eopencv\u7684\u6a21\u677f\u5339\u914d\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd4\u56de\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 Python\u4e09\u65b9\u5e93PyAutoGui\u7684\u4f7f\u7528\u65b9\u6cd5 \u3010\u4ece\u542f\u52a8\u5668\u542f\u52a8\uff08\u4fd7\u79f0\u5f00\u59cb\u83dc\u5355\uff09\u3011 \u542f\u52a8\u4e2d\u542f\u52a8\u7684\u5b9e\u73b0\u903b\u8f91\u5b9e\u9645\u548c\u4efb\u52a1\u680f\u4e0a\u542f\u52a8\u5dee\u4e0d\u591a\u3002 \u9996\u5148\uff0c\u9700\u8981\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u542f\u52a8\u5668\u56fe\u6807\uff0c\u6216\u8005\u952e\u76d8super\u952e\uff0c\u5c06\u542f\u52a8\u5668\u547c\u51fa\u6765\uff0c \u7136\u540e\uff0c\u5728\u542f\u52a8\u5668\u4e2d\u70b9\u51fb\u5bf9\u5e94\u7684\u56fe\u6807\uff0c \u4f46\u662f\u8fd9\u91cc\u6709\u4e2a\u95ee\u9898\uff0c\u542f\u52a8\u5668\u4e2d\u7684\u5e94\u7528\u5217\u8868\uff0c\u4e00\u9875\u5c55\u793a\u4e0d\u5b8c\uff0c\u6240\u4ee5\u5982\u679c\u6211\u4eec\u8981\u70b9\u51fb\u7684\u5e94\u7528\u56fe\u6807\u4e0d\u5728\u7b2c\u4e00\u9875\u600e\u4e48\u529e\uff0c\u901a\u5e38\u89e3\u51b3\u65b9\u6848\u6709\u4e24\u79cd\uff1a \uff081\uff09\u9700\u8981\u8fdb\u884c\u5411\u4e0b\u6ed1\u52a8\uff0c\u8fd9\u91cc\u5c31\u6d89\u53ca\u5230\u76f8\u5e94\u7684\u8bc6\u522b\u65b9\u6848\uff0c\u5224\u65ad\u5982\u679c\u4e0d\u5728\u7b2c\u4e00\u9875\u5c31\u5f80\u4e0b\u6ed1\u52a8\u7ffb\u9875\u3002 \uff082\uff09\u542f\u52a8\u5668\u63d0\u4f9b\u641c\u7d22\u7684\u529f\u80fd\uff0c\u8f93\u5165\u5e94\u7528\u540d\u79f0\u641c\u7d22\uff0c\u7136\u540e\u8fdb\u884c\u70b9\u51fb\u3002 \u4ece\u5b9e\u9645\u64cd\u4f5c\u4e2d\u6765\u770b\uff0c\u91c7\u7528\u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u6548\u7387\u4f1a\u9ad8\u4e00\u70b9\u3002 \u3010\u7ec8\u7aef\u547d\u4ee4\u542f\u52a8\u3011 \u5728python\u4e2d\uff0c\u4f7f\u7528os.popen()\u6216os.system()\u6216\u8005subprocess.Popen()\uff0c\u5b9e\u73b0\u547d\u4ee4\u884c\u542f\u52a8\uff0c\u6bd4\u5982\uff1a import os\nos.popen('deepin-music')\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u8fdc\u7a0b\u6267\u884c\u811a\u672c\u7684\u65f6\u5019\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u7684\u95ee\u9898\u3002 \u3010\u603b\u7ed3\u3011 \u4ee5\u4e0a\u51e0\u79cd\u65b9\u6cd5\uff0c\u5404\u6709\u4f18\u7f3a\u70b9\uff0c\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff1a \uff081\uff09\u5982\u679c\u9700\u8981\u5728Jenkins\u4e2d\u505a\u6301\u7eed\u96c6\u6210\uff0c\u5efa\u8bae\u4f7f\u7528\u7b2c\u4e8c\u79cd\u4efb\u52a1\u680f\u542f\u52a8\u7684\u65b9\u6cd5\u3002 \uff082\uff09\u5982\u679c\u4e0d\u4f1a\u91c7\u7528\u8fdc\u7a0b\u6267\u884c\u7684\uff0c\u5efa\u8bae\u91c7\u7528\u7b2c\u4e00\u79cd\u6216\u8005\u6700\u540e\u4e00\u79cd\u65b9\u6848\u3002 \uff083\uff09\u7b2c\u4e09\u79cd\u548c\u7b2c\u56db\u79cd\u542f\u52a8\u65b9\u6cd5\uff0c\u901a\u5e38\u5728\u6d4b\u8bd5\u7528\u4f8b\u4e2d\u4f1a\u6d89\u53ca\u5230\uff0c\u6240\u4ee5\u5076\u5c14\u4f1a\u7528\u3002"},{"location":"RELEASE/","title":"\u7248\u672c\u66f4\u65b0\u8bb0\u5f55","text":""},{"location":"RELEASE/#2122023822","title":"2.1.2\uff082023/8/22\uff09","text":"new \u589e\u52a0 OCR \u8bc6\u522b\u81ea\u52a8\u91cd\u8bd5\u673a\u5236\uff0c\u9ed8\u8ba4\u91cd\u8bd5 2 \u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u91cd\u8bd5\u6b21\u6570\uff1b \u4f7f\u7528\u7a97\u7ba1\u6700\u65b0\u63d0\u4f9b\u7684\u4e8c\u8fdb\u5236\u63a5\u53e3\uff0c\u4f18\u5316\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u5728 Wayland \u4e0b\u83b7\u53d6\u7a97\u53e3\u4fe1\u606f\u7684\u65b9\u6cd5\uff1b\u611f\u8c22\u684c\u9762\u6d4b\u8bd5\u90e8 @\u4f55\u6743 @\u5b59\u7fe0 \u3001\u7a97\u7ba1\u7814\u53d1 @\u9ec4\u6cfd\u94ed \u7684\u5927\u529b\u652f\u6301\u3002 \u6269\u5145 skipif \u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\u51fd\u6570\uff1a skipif_xdg_type \u652f\u6301 x11 \u6216 wayland \u4e0a\u8df3\u8fc7\uff1b skipif_cpu_name \u652f\u6301\u4e0d\u540c cpu \u4e0a\u8df3\u8fc7\uff0c\u6bd4\u5982\uff1askipif_cpu_name-KLVVW5821\uff1b "},{"location":"RELEASE/#2102023818","title":"2.1.0\uff082023/8/18\uff09","text":"fix \u4fee\u590d SW \u67b6\u6784\u73af\u5883\u4f9d\u8d56\u7684\u95ee\u9898\uff0c\u539f\u56e0\u662f\u4e4b\u524d\u6211\u8fd9\u91cc\u672c\u5730\u6ca1\u6709 SW \u7684\u673a\u5668\uff0c\u6ca1\u6709\u505a\u76f8\u5173\u9002\u914d\uff1b \u4fee\u590d\u5b50\u9879\u76ee\u5355\u72ec\u9700\u8981\u4e09\u65b9\u5305 pexpect\uff0c\u7531\u4e8e\u4e4b\u524d\u662f\u9884\u88c5\u5230\u955c\u50cf\u91cc\u9762\u7684\uff0c\u4f46\u57fa\u7840\u6846\u67b6\u4e0d\u9700\u8981\uff0c\u56e0\u6b64\u6ca1\u6709\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u91cc\u9762\uff0c\u5bfc\u81f4\u5b50\u9879\u76ee\u4f9d\u8d56\u62a5\u9519\u3002 \u4fee\u590d\u5b50\u9879\u76ee cv \u5bfc\u5165\u62a5\u9519\u7684\u95ee\u9898\uff1b \u539f\u56e0\u4e3a\uff1ayouqu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u517c\u5bb9\u4e24\u79cd\u60c5\u51b5\uff0c\u4e00\u79cd\u662f\u9762\u5411\u670d\u52a1\uff0c\u5c31\u662f\u672c\u5730\u6d4b\u8bd5\u673a\u4e0d\u9700\u8981\u5b89\u88c5 OpenCV\uff0c\u7528\u4f8b\u4e2d\u7684\u56fe\u50cf\u8bc6\u522b\u4f1a\u901a\u8fc7\u8fdc\u7a0b\u670d\u52a1\u63a5\u53e3\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u548c\u7ed3\u679c\u83b7\u53d6\uff1b\u7b2c\u4e8c\u79cd\u662f\u539f\u751f\uff0c\u5c31\u662f\u672c\u5730\u76f4\u63a5\u5b89\u88c5 OpenCV \u76f4\u63a5\u7528\u3002\u4e24\u4e2a\u60c5\u51b5\u7684\u4f18\u5148\u7ea7\u662f\u4f18\u5148\u5224\u65ad\u672c\u5730\u5b58\u5728\uff0c\u5426\u5219\u8d70\u670d\u52a1\u3002 \u524d\u9762\u6211\u4eec\u5df2\u7ecf\u628a OCR \u529f\u80fd\u505a\u4e86\u670d\u52a1\u5316\uff0c\u57fa\u4e8e 1 \u5e74\u591a\u4ee5\u6765\u7684\u89c2\u5bdf\uff0c\u7528\u8d77\u6765\u5f88\u7a33\u5b9a\uff0c\u518d\u4e00\u4e2a\u5c31\u662f OpenCV \u5b89\u88c5\u5305\u662f\u6bd4\u8f83\u81c3\u80bf\u7684\uff0c\u7c97\u7565\u6570\u4e86\u4e0b\u4f9d\u8d56\u6709 30+ \u4e2a\uff0c\u800c\u4e14\u5728\u5404\u67b6\u6784\u4e0a\u4f9d\u8d56\u5305\u8fd8\u4e0d\u5c3d\u76f8\u540c\uff0c\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u65b9\u6848\u4e2d\u4e0d\u592a\u597d\u5904\u7406\uff0c\u6240\u4ee5\u672c\u6b21 2.0 \u7248\u672c\u6211\u4eec\u5927\u80c6\u7684\u5c06\u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u529f\u80fd\u4fee\u6539\u4e3a\u9762\u5411\u670d\u52a1\u7684\u65b9\u5f0f\uff0c\u524d\u671f\u6d4b\u8bd5\u4e00\u5207\u770b\u8d77\u6765\u90fd\u5f88\u548c\u8c10\u3002 \u4f46\u662f\u6ca1\u6ce8\u610f\u5230\u4e4b\u524d\u7ed9\u6d77\u71d5\u59d0\u90a3\u8fb9\u9879\u76ee\u5355\u72ec\u5b9a\u5236\u505a\u4e86\u4e2a\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\uff08\u4e3a\u4e86\u80fd\u7b80\u5355\u5e73\u6ed1\u7684\u8fc1\u79fb\u5230 youqu\uff09\uff0c\u6b64\u63a5\u53e3\u5e95\u5c42\u6ca1\u6709\u517c\u5bb9\u670d\u52a1\u5316\uff0c\u6240\u4ee5\u5979\u90a3\u8fb9\u7684\u9879\u76ee\u8c03\u7528\u6b64\u5b9a\u5236\u63a5\u53e3\u4f1a\u62a5 cv \u5bfc\u5165\u7684\u95ee\u9898\u3002 \u7531\u4e8e\u5c06\u8fd9\u4e2a\u5b9a\u5236\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\u8fdb\u884c\u670d\u52a1\u5316\u517c\u5bb9\u6539\u9020\u9700\u8981\u4e00\u5b9a\u65f6\u95f4\uff0c\u6539\u5b8c\u8fd8\u9700\u8981\u6d4b\u8bd5\uff0c\u4f46\u672c\u6b21\u65f6\u95f4\u6bd4\u8f83\u7d27\uff0c\u56e0\u6b64\u5148\u628a OpenCV \u88c5\u8fdb\u865a\u62df\u73af\u5883\uff0c\u540e\u7eed\u7248\u672c\u518d\u8003\u8651\u9488\u5bf9\u6b64\u63a5\u53e3\u505a\u4fee\u6539\u3002"},{"location":"RELEASE/#2002023816","title":"2.0.0\uff082023/8/16\uff09","text":"YouQu\uff08\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff09\u5f00\u6e90\u4e86\uff0c\u540c\u65f6\u63a8\u51fa\u4e86 2.0 \u7248\u672c\u3002 \u611f\u8c22\u738b\u6ce2\u603b\u3001\u67b6\u6784\u5e08\u5f90\u5c0f\u4e1c\u3001\u7814\u53d1\u7ecf\u7406\u90d1\u5e7c\u6208\u3001\u5218\u90d1\u7b49\u7814\u53d1\u540c\u4e8b\u7684\u5927\u529b\u652f\u6301\u3002 new 1\u3001\u65b0\u7684\u57fa\u7840\u6846\u67b6\u4ee3\u7801\u83b7\u53d6\u65b9\u5f0f\u53ca\u65b0\u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4 YouQu \u540e\u7eed\u5747\u901a\u8fc7 PyPI \u8fdb\u884c\u5305\u7684\u53d1\u5e03\uff0c\u4e5f\u5c31\u662f\u8bf4\u540e\u7eed\u53ef\u4ee5\u4f7f\u7528 pip \u8fdb\u884c\u5b89\u88c5\uff1a sudo pip3 install youqu==2.0.0\n \u8fd9\u91cc\u6709 2 \u4e2a\u5c0f\u70b9\u8981\u6ce8\u610f\uff1a \u63a8\u8350\u4f7f\u7528 sudo pip3 \uff08\u52a0 sudo\uff09\u8fdb\u884c\u5b89\u88c5\uff1b \u5982\u679c\u4e0d\u52a0 sudo \u6709\u4e9b\u673a\u5668\u53ef\u80fd $HOME/.local/bin \u4e0d\u5728\u7cfb\u7edf PATH \u73af\u5883\u76ee\u5f55\u4e0b\uff0c\u5728\u4e0d\u6dfb\u52a0\u73af\u5883\u53d8\u91cf\u7684\u60c5\u51b5\u4e0b\uff0c\u4f1a\u51fa\u73b0 YouQu \u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4\uff08youqu-startproject\uff09\u65e0\u6cd5\u4f7f\u7528\u7684\u95ee\u9898\uff1b \u5f53\u7136\uff0c\u5c06\u4e0a\u8ff0\u8def\u5f84\u6dfb\u52a0\u5230\u73af\u5883\u53d8\u91cf\u4e4b\u540e\u4e5f\u662f\u53ef\u4ee5\u7528\u7684\uff0c\u6240\u4ee5\u6211\u8fd9\u91cc\u662f\u63a8\u8350\u52a0 sudo\uff0c\u4e0d\u52a0 sudo \u4e5f\u662f\u53ef\u4ee5\u7684\uff0c\u53ea\u662f\u9700\u8981\u5173\u6ce8\u4e0b\u73af\u5883\u53d8\u91cf\u7684\u95ee\u9898\u3002 \u63a8\u8350\u6307\u5b9a\u7248\u672c\u53f7\uff08youqu==2.0.0\uff09\u5b89\u88c5\uff0c\u5982\u679c\u4e0d\u6307\u5b9a\u7248\u672c\u53f7\u9ed8\u8ba4\u662f\u5b89\u88c5\u6700\u65b0\u53d1\u5e03\u7684 YouQu \u7248\u672c\uff0c\u4f60\u53ef\u4ee5\u5728 PyPI \u4e0a\u7684 Release history \u91cc\u9762\u67e5\u770b\u6709\u54ea\u4e9b\u7248\u672c\u3002 \u5b89\u88c5\u4e4b\u540e\u4f1a\u81ea\u52a8\u751f\u6210\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu-startproject\uff0c\u4f7f\u7528\u5b83\u53ef\u4ee5\u521d\u59cb\u5316\u5de5\u7a0b\uff0c\u8fd9\u91cc\u4ee5\u97f3\u4e50\u4e3e\u4f8b\uff1b youqu-startproject autotest_deepin_music\n \u8fd9\u6837\u5c31\u4f1a\u5728\u5f53\u524d\u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a autotest_deepin_music \u76ee\u5f55\uff0c\u91cc\u9762\u5305\u542b\u4e86\u57fa\u7840\u6846\u67b6\u6240\u6709\u7684\u4ee3\u7801\uff1b \u4e4b\u540e\uff0c\u8fd8\u662f\u5728 apps \u76ee\u5f55\u4e0b\uff0c\u653e\u5165\u5b50\u9879\u76ee\u7684AT\u4ee3\u7801\u5373\u53ef\uff0c\u4f7f\u7528\u65b9\u6cd5\u548c\u8fc7\u53bb\u4e00\u6837\uff0c\u8fd9\u91cc\u5c31\u4e0d\u591a\u4ecb\u7ecd\u3002 \u53e6\u5916\uff0c\u9664\u4e86\u901a\u8fc7 pip \u83b7\u53d6\u4ee5\u5916\uff0c\u4ecd\u7136\u53ef\u4ee5\u901a\u8fc7\u6e90\u7801\u83b7\u53d6\uff08\u76f4\u63a5 git clone\uff09\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u4f7f\u7528 pip \u5b89\u88c5 YouQu \u65f6\uff0cYouQu \u5305\u7684\u5927\u5c0f\u624d 600+ k\uff0c\u5b89\u88c5\u901f\u5ea6\u8d77\u98de\u3002 2\u3001\u65b0\u7684AT\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848 \u4e3a\u4e86\u89e3\u51b3\u4ee5\u4e0b\u95ee\u9898\uff1a \u8fc7\u53bb\u4e00\u6bb5\u65f6\u95f4\u54b1\u4eec\u7ecf\u5e38\u51fa\u73b0\u7684\uff0c\u4e0d\u540c\u7684AT\u9879\u76ee\u5728\u540c\u4e00\u53f0\u673a\u5668\u4e0a\u90e8\u7f72\u73af\u5883\u65f6\u4f9d\u8d56\u7248\u672c\u51b2\u7a81\u7684\u95ee\u9898\uff0c\u65b0\u65b9\u6848\u4e0d\u540c\u7684\u9879\u76ee\u4f1a\u52a8\u6001\u751f\u6210\u81ea\u5df1\u7684\u865a\u62df\u73af\u5883\uff0c\u76f8\u4e92\u4e4b\u95f4\u4e0d\u5f71\u54cd\uff1b \u4e1a\u5185\u4e3a\u4e86\u89e3\u51b3\u7248\u672c\u51b2\u7a81\u95ee\u9898\u4e00\u822c\u90fd\u4f1a\u4f7f\u7528Python\u865a\u62df\u73af\u5883\u7684\u5de5\u5177\uff0c\u4f46\u662f\u90fd\u6709\u4e2a\u95ee\u9898\uff0c\u65e0\u6cd5\u7ba1\u7406 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u5305\uff0c\u672c\u6b21\u6211\u4eec\u89e3\u51b3\u4e86\u8fd9\u4e2a\u95ee\u9898\uff0c\u80fd\u591f\u5b8c\u5168\u7ba1\u7406\u5e38\u89c4\u7684Python\u5305\uff0c\u4e5f\u80fd\u7ba1\u7406\u5230 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u4e09\u65b9\u5305\uff1b \u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u4f7f\u7528\u65b9\u6cd5\uff1a bash env.sh\n \u53ef\u4ee5\u770b\u51fa\u6765\u548c\u539f\u6765\u4f7f\u7528\u65b9\u6cd5\u6ca1\u6709\u53d8\u5316\uff0c\u4e5f\u5c31\u662f\u8bf4\u4ece\u4f7f\u7528\u7684\u89d2\u5ea6\u662f\u5b8c\u5168\u6ca1\u6709\u533a\u522b\u7684\uff0c\u53ea\u662f\u5185\u90e8\u505a\u4e86\u4e0d\u540c\u7684\u4e8b\u60c5\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u672c\u673a\u90e8\u7f72\u7684\u529f\u80fd\u4ecd\u7136\u4fdd\u7559 env_dev.sh\uff0c\u53ef\u4ee5\u4f5c\u4e3a\u5f00\u53d1\u65f6\u7684\u73af\u5883\u90e8\u7f72\u3002 3\u3001\u65b0\u7684\u9a71\u52a8\u547d\u4ee4 \u8fc7\u53bb\u54b1\u4eec\u90fd\u662f\u4f7f\u7528\u8fd9\u6837\u7684\u547d\u4ee4\u6765\u9a71\u52a8\u6267\u884c\uff1a python3 manage.py run\n \u7531\u4e8e\u9ed8\u8ba4\u57fa\u4e8e\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848\uff0c\u56e0\u6b64\u6211\u4eec\u589e\u52a0\u4e86\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu\uff1b \u65b0\u7684\u9a71\u52a8\u65b9\u5f0f\uff1a youqu manage.py run\n \u53ea\u9700\u8981\u628a python3 \u66ff\u6362\u6210 youqu \u5c31\u53ef\u4ee5\u4e86\uff0c\u770b\u8d77\u6765\u5f88\u548c\u8c10~ 4\u3001\u65b0\u7684\u6587\u6863\u5730\u5740 \u8fc7\u53bb\u54b1\u4eec YouQu \u7684\u5728\u7ebf\u6587\u6863\u662f\u90e8\u7f72\u5728\u516c\u53f8\u5185\u7f51\u7684\uff0c\u73b0\u5728\u5f00\u6e90\u5230 github \u4e86\uff0c\u5916\u90e8\u5f00\u53d1\u8005\u80af\u5b9a\u8bbf\u95ee\u4e0d\u5230\u5185\u7f51\u7684\u6587\u6863\uff0c\u56e0\u6b64\u9700\u8981\u5c06\u6587\u6863\u90e8\u7f72\u5230\u516c\u7f51\u3010\u516c\u7f51\u6587\u6863\u3011\uff1b \u516c\u7f51\u6587\u6863\u4f7f\u7528\u7684\u662f github pages\uff08\u767d\u5ad6\u602a\u4e00\u987f\u72c2\u559c~~\uff09\uff0c\u4f46\u53ef\u80fd\u4f1a\u51fa\u73b0\u6587\u6863\u901f\u5ea6\u6162\u7684\u95ee\u9898\uff08\u4ee3\u7406\u4e0b\u5c31\u597d\u4e86\uff09\uff0c\u4e0d\u8fc7\u6ca1\u5173\u7cfb\uff0c\u54b1\u4eec\u3010\u5185\u7f51\u6587\u6863\u3011\u4ecd\u7136\u4fdd\u7559\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u3002 5\u3001\u5176\u4ed6\u4e00\u4e9b\u5c0f\u5c0f\u529f\u80fd\u66f4\u65b0\uff1a \uff081\uff09\u65b0\u589e\u5173\u95ed\u5206\u8fa8\u7387\u68c0\u6d4b\u7684\u53c2\u6570\u503c\uff1b youqu manage.py run --resolution no\n \u6216\u8005\u4fee\u6539 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387, \u6bd4\u5982\uff1a1920x1080\n;no: \u8868\u793a\u4e0d\u505a\u5206\u8fa8\u7387\u6821\u9a8c\nRESOLUTION = 1920x1080\n resolution \u8fd9\u4e2a\u53c2\u6570\u4e00\u76f4\u90fd\u6709\u7684\uff0c\u53ea\u4e0d\u8fc7\u4e4b\u524d\u662f\u7528\u4e8e\u6307\u5b9a\u5206\u8fa8\u7387\u5927\u5c0f\uff0c\u6bd4\u5982 --resolution 1920x1080\uff0c\u4f46\u6709\u4e9b\u63a5\u53e3\u7684\u9879\u76ee\u4e0d\u9700\u8981\u8fd9\u4e2a\u68c0\u67e5\uff0c\u53ef\u4ee5\u7ed9\u5b83\u4e2a no \u5c31\u597d\u4e86\uff0c\u5f53\u7136 CICD \u4e0a\u5173\u95ed\uff0c\u9700\u8981\u6d41\u6c34\u7ebf\u4e0a\u628a\u8fd9\u4e2a\u53c2\u6570\u52a0\u4e0a\uff1b \uff082\uff09\u65b0\u589e\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u7684\u547d\u4ee4\u884c\u53c2\u6570 \u4e4b\u524d\u8fd9\u4e2a\u914d\u7f6e\u9879\u53ea\u80fd\u5728 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c 1 \u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff0cRERUN >= RECORD_FAILED_CASE\u3002\n;1.\u5173\u95ed\u5f55\u5c4f\uff1aRECORD_FAILED_CASE > RERUN\n;2.\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1aRECORD_FAILED_CASE = 0\nRECORD_FAILED_CASE = 1\n \u73b0\u5728\u5c06\u5f00\u53d1\u5230\u547d\u4ee4\u884c\u53c2\u6570\u3002 youqu manage.py run --record_failed_case 2\n fix \u4fee\u590d remote \u6267\u884c\u65f6\uff0c\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u65e0\u6cd5\u751f\u6210\u6d4b\u8bd5\u62a5\u544a\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1302023710","title":"1.3.0\uff082023/7/10\uff09","text":"fix \u8fdb\u4e00\u6b65\u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b\u53c2\u8003\uff1a\u914d\u7f6ePython\u6e90\u7684\u51e0\u79cd\u65b9\u6cd5 \u4fee\u590d wayland_autotool \u53d7\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86wayland\u4e0b\u5076\u73b0\u627e\u4e0d\u5230 .Xauthority \u6587\u4ef6\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1292023626","title":"1.2.9\uff082023/6/26\uff09","text":"fix \u4f18\u5316\u8fdc\u7a0b\u6267\u884c remote \u7684\u53c2\u6570\u76f4\u63a5\u4f20\u7ed9\u8fdc\u7a0b\u673a\u5668\u7684 run \u547d\u4ee4\uff0c\u4e0d\u7528\u518d\u5355\u72ec\u5904\u7406\u8fdc\u7a0b\u6267\u884c\u7684\u53c2\u6570\u903b\u8f91\uff0c\u540e\u7eed\u4e13\u6ce8\u4e8e\u672c\u5730\u6267\u884c\u529f\u80fd\u5f00\u53d1\uff0c\u8fdc\u7a0b\u6267\u884c\u81ea\u52a8\u9002\u7528\uff1b env.sh \u79fb\u9664 pyyaml \u5b89\u88c5\uff0c\u7531\u5b50\u9879\u76ee\u5728 requirement.txt \u91cc\u9762\u5b9a\u4e49\uff0c\u6846\u67b6\u81ea\u52a8\u52a0\u8f7d\uff1b \u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b "},{"location":"RELEASE/#128202369","title":"1.2.8\uff082023/6/9\uff09","text":"fix \u4fee\u590d\u4e86 pypi \u5b89\u88c5 numpy \u5b58\u5728\u7cfb\u7edf\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#127202368","title":"1.2.7\uff082023/6/8\uff09","text":"fix env.sh \u4e2d\u5b89\u88c5 Python \u5305\u672a\u6307\u5b9a\u7248\u672c\u65f6\uff0c\u65e5\u5fd7\u8f93\u51fa\u5b89\u88c5\u7684\u7248\u672c\uff1b pdocr-rpc 2.0.1\nallure-custom 1.2.1\nfunnylog 1.1.3\n \u4fee\u590d -f \u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u62a5\u9519\u7684\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#126202367","title":"1.2.6\uff082023/6/7\uff09","text":"fix \u4fee\u590d wayland \u4e0a\u8c03\u7528\u9f20\u6807\u4e2d\u952e\u3001\u53f3\u952e\u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b \u4fee\u590d pubilic/dde_desktop_public_widget \u91cc\u9762\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u5b9a\u4f4d\u684c\u9762\u6587\u4ef6\u7684\u65b9\u6cd5\uff0c\u5750\u6807\u6ca1\u6709\u62c6\u5305\u7684\u95ee\u9898\uff1b \u4f18\u5316\u4e86\u7b49\u5f85\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b pycreeze \u7248\u672c\u5347\u7ea7\u5230 0.1.29\uff0c\u5bfc\u81f4\u4e0e pyautogui 0.9.53 \u4e0d\u517c\u5bb9\uff0cenv.sh \u91cc\u9762\u589e\u52a0\u6307\u5b9a pycreeze \u7248\u672c\u4e3a 0.1.28\uff1b "},{"location":"RELEASE/#1252023516","title":"1.2.5\uff082023/5/16\uff09","text":"new --app \u53c2\u6570\u540e\u9762\u65b0\u589e\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u76ee\u524d\u652f\u6301\u4e09\u79cd\u53c2\u6570\u4f20\u5165\u65b9\u5f0f\uff1a ~$: youqu run -a deepin-music\n~$: youqu run -a autotest_deepin_music\n~$: youqu run -a apps/autotest_deepin_music\n \u200b \u540e\u4e24\u79cd\u5165\u53c2\u65b9\u5f0f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\u3002 remote \u8fdc\u7a0b\u6267\u884c\u65b0\u589e\u4ece\u547d\u4ee4\u884c\u4f20\u5165\u6d4b\u8bd5\u673a\u4fe1\u606f\uff0c\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679c password \u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6 setting/remote.ini \u4e2d CLIENT_PASSWORD \u7684\u503c,\u6bd4\u5982\uff1auos@10.8.13.33:1 \u6216 uos@10.8.13.33 \uff1b python3 manage.py remote -c uos@10.8.13.33/uos@10.8.13.34\npython3 manage.py remote -c uos@10.8.13.33:1/uos@10.8.13.34:2\n fix \u65e5\u5fd7\u6a21\u5757\u4fee\u6539\u4e3a\u51fd\u6570\u6267\u884c\u4e4b\u524d\u6253\u5370\u65e5\u5fd7\uff1b \u65e5\u5fd7\u6a21\u5757\u589e\u52a0\u767d\u540d\u5355\uff0c\u901a\u8fc7\u7c7b\u540d\u5f00\u5934\uff0c\u7ed3\u675f\uff0c\u5305\u542b\u7b49\u5173\u952e\u5b57\u63a7\u5236\u9700\u8981\u6253\u5370\u7684\u51fd\u6570\u65e5\u5fd7\uff1b \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5982\u679c\u4f20\u5165\u4e86 app_name \u53ea\u4f1a\u5c06 apps \u76ee\u5f55\u4e0b app_name \u7684\u76ee\u5f55\u53d1\u9001\u5230\u6d4b\u8bd5\u673a\uff1b env.sh \u79fb\u9664 python3-dev\uff1b \u4fee\u590d Wayland \u4e0b env.sh \u73af\u5883\u5b89\u88c5\u5931\u8d25\u7684\u95ee\u9898\uff0c\u4f18\u5316\u4e86 deb \u4f9d\u8d56\u5b89\u88c5\u7684\u903b\u8f91\uff1b \u5c06 env.sh \u5237\u65b0\u6e90\u7684\u65e5\u5fd7\u5728\u7ec8\u7aef\u663e\u793a\uff0c\u89e3\u51b3\u5728 CI \u73af\u5883\u4e0b\uff0c\u957f\u65f6\u95f4\u4e0d\u8f93\u51fa\u65e5\u5fd7\u8fde\u63a5\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d1060 \u534e\u4e3a\u673a\u578b\u5b89\u88c5\u952e\u9f20\u5de5\u5177\u65f6\u4f9d\u8d56\u4e0d\u517c\u5bb9\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1242023227","title":"1.2.4\uff082023/2/27\uff09","text":"fix \u4fee\u6539 CURRENT \u6587\u4ef6\uff1b "},{"location":"RELEASE/#1232023227","title":"1.2.3\uff082023/2/27\uff09","text":"new pylint.sh \u652f\u6301\u901a\u8fc7\u4f4d\u7f6e\u53c2\u6570\u4f20\u5165\u6587\u4ef6\u8def\u5f84\uff1abash pylint.sh apps/autotest_deepin_music,\u597d\u5904\u662f\u53c2\u6570\u8def\u5f84\u53ef\u4ee5\u5728\u7ec8\u7aef\u8865\u5168\uff1b \u65b0\u589e\u7cfb\u7edf\u547d\u4ee4 youqu-pylint \uff0c\u7528\u4e8e\u9759\u6001\u4ee3\u7801\u626b\u63cf\uff0c\u4f7f\u7528\u65b9\u6cd5: youqu-pylint apps/autotest_deepin_music\uff1b \u7531\u4e8e\u7cfb\u7edf\u4e00\u4e9b dbus \u63a5\u53e3\u6539\u53d8\uff0c\u516c\u5171\u5e93\u4e2d\u7684 dbus \u65b9\u6cd5\u5c06\u4e0d\u518d\u7ef4\u62a4\uff0c\u7531\u5b50\u9879\u76ee\u5728 other_widget.py \u91cc\u9762\u8fdb\u884c\u7ef4\u62a4\uff1b fix \u4fee\u590d ssh \u73af\u5883\u4e0b\u8fd0\u884c\u63d0\u793a \u201c\u65e0\u6cd5\u8fde\u63a5\u201d \u7684\u95ee\u9898\uff1b \u4fee\u590d\u8fd0\u884c\u65f6\u7a0b\u5e8f\u9000\u51fa\uff0c\u4e0d\u8f93\u51fa\u5f02\u5e38\u65e5\u5fd7\u7684\u95ee\u9898\uff1b \u4fee\u590dyouqu remote xxx \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5728\u670d\u52a1\u7aef Ctrl + C \u65e0\u6cd5\u505c\u6b62\u7a0b\u5e8f\u8fd0\u884c\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#122202328","title":"1.2.2\uff082023/2/8\uff09","text":"new \u65b0\u589e\u6c14\u6ce1\u7c7b\u56fe\u50cf\u8bc6\u522b\u65b9\u6848\uff1bimage_utils.py::ImageUtil::get_during\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u533a\u57df\u8bc6\u522b\uff0c\u4f20\u5165 [x, y, w, h]\uff0cx: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u76ee\u6807\u56fe\u7247\uff0c\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\uff1b env.sh \u79fb\u9664 pypinyin; \u4f18\u5316\u6267\u884c env.sh \u65f6\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b manage.py \u79fb\u9664\u4e86\u53c2\u6570 session_timeout \uff0c\u6846\u67b6\u6839\u636e\u5168\u5c40\u7684 timeout \u4ee5\u53ca\u7528\u4f8b\u81ea\u5b9a\u4e49\u7684 timeout \u81ea\u52a8\u8ba1\u7b97\u51fa sessiontimeout \u7684\u503c\uff1b \u65b0\u589e ocr \u670d\u52a1\u5668\u94fe\u63a5\u91cd\u8bd5\uff0c\u9ed8\u8ba4\u91cd\u8bd51\u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u53c2\u6570\uff1b fix \u4fee\u590d\u4e86\u4e00\u4e9b pylint \u626b\u63cf\u7684\u4ee3\u7801\u98ce\u683c\u95ee\u9898\uff1b \u91cd\u65b0\u8bbe\u8ba1\u4e86\u6d4b\u8bd5\u62a5\u544a\u4e3b\u9898\uff1b "},{"location":"RELEASE/#121202316","title":"1.2.1\uff082023/1/6\uff09","text":"new \u652f\u6301\u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6267\u884c\u7528\u4f8b\uff1b\u53ef\u5c06python3 manage.py \u66ff\u6362\u4e3a youqu \uff1a youqu run -a deepin-music -k 001\n RPC \u670d\u52a1 IP \u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u6307\u5b9a\u4e0d\u540c\u7684\u7aef\u53e3\uff1b \u5728\u7ebf\u6587\u6863\u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u539f\u6765\u7684\u5730\u5740 10.8.10.215 \u5c06\u4e0d\u5728\u4f7f\u7528\uff1b fix \u4fee\u590d --count \u53c2\u6570\u53ef\u80fd\u51fa\u73b0\u4e0e\u5176\u4ed6\u6846\u67b6\u7684\u5de5\u7a0b\u4f9d\u8d56\u5b58\u5728\u51b2\u7a81\uff0c\u62a5\u9519\u91cd\u590d\u6ce8\u518c\u7684\u95ee\u9898\uff1b \u4fee\u590d CI \u73af\u5883\u4e0b\u591a\u4e2a\u5de5\u7a0b\u5b58\u5728 Python \u73af\u5883\u53d8\u91cf\u6307\u5411\u9519\u8bef\uff0c\u5bfc\u5305\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u5355\u72ec\u8fd0\u884c\u65b9\u6cd5\u65f6\u65e0\u65e5\u5fd7\u8f93\u51fa\u7684 Bug\uff1b "},{"location":"RELEASE/#12020221230","title":"1.2.0\uff082022/12/30\uff09","text":"1.1.4 \u7248\u672c\u9002\u914d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e14\u65b0\u589e\u4e86\u8f83\u591a\u65b0\u7279\u6027\uff0c\u6211\u4eec\u8ba1\u5212\u4f7f\u7528 1.1.4 \u7248\u672c\u8fd0\u884c\u4e00\u6bb5\u65f6\u95f4\uff0c1.2.0 \u7248\u672c\u5c06\u4fee\u590d\u671f\u95f4\u51fa\u73b0\u7684 Bug\uff0c\u7136\u540e\u4f5c\u4e3a\u7a33\u5b9a\u7248\u672c\u53d1\u5e03\u3002 new \u4fee\u6539\u5de5\u7a0b\u540d\u79f0\u4e3a youqu\uff1b \u5c06 sphinx \u6587\u6863\u5de5\u7a0b\u8fc1\u79fb\u5230\u5355\u72ec\u7684\u4ed3\u5e93\uff1b fix \u4fee\u590d startapp \u521b\u5efa\u5de5\u7a0b\u65f6\u5b58\u5728\u5de5\u7a0b\u540d\u79f0\u65f6\u65e0\u6cd5\u7ee7\u7eed\u521b\u5efa\uff1b \u4fee\u590d\u4e86 OCR \u670d\u52a1\u5728\u5e76\u53d1\u65f6\u53ef\u80fd\u51fa\u73b0\u65e0\u6cd5\u8fd4\u56de\u7ed3\u679c\u7684\u95ee\u9898\uff0c\u63d0\u5347 OCR \u670d\u52a1\u9ad8\u5e76\u53d1\u7a33\u5b9a\u6027\uff1b \u4fee\u590d PMS \u540c\u6b65\u6807\u7b7e\u5230 CSV \u6587\u4ef6\u4e0d\u652f\u6301\u7528\u4f8b\u5e93\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11420221214","title":"1.1.4\uff082022/12/14\uff09","text":"new \u65b0\u589e startapp \u5b50\u547d\u4ee4\u521b\u5efa\u5b50\u9879\u76ee\u5de5\u7a0b\u6a21\u677f: python3 manage.py startapp autotest_deepin_xxx \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u91cd\u590d\u6267\u884c\u6b21\u6570\uff1b \u53bb\u6389\u6279\u91cf\u6267\u884c\u524d\u6536\u96c6\u7528\u4f8b\u7684\u6b65\u9aa4\uff1b \u589e\u52a0\u5f00\u59cb\u6267\u884c\u65f6\u6253\u5370\u4e00\u4e9b\u6267\u884c\u53c2\u6570\uff0c\u5982\uff1a \u7528\u4f8b\u6536\u96c6\u6570\u91cf: 99\n\u5931\u8d25\u91cd\u8dd1\u6b21\u6570: 1\n\u6700\u5927\u5931\u8d25\u6b21\u6570: 49\n\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4: 200.0s (03\u520620\u79d2)\n\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4: 11880s (3\u5c0f\u65f618\u52060\u79d2)\n \u5b9a\u5236\u4fee\u6539allure\u62a5\u544alogo\u3001title\u3001\u9ed8\u8ba4\u8bed\u8a00\uff1b manage.py \u6267\u884c\u5f00\u59cb\u65f6\u6253\u5370 logo \u548c\u5f53\u524d\u7248\u672c\uff1a \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u255a\u2588\u2588\u2557 \u2588\u2588\u2554\u255d \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2584\u2584 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2580\u2580\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u2584\u2588 \u2584\u2588 \u2588 \u2588 \u2588 \u2584 \u2588 \u2584 \u2580\u2580\u2588 \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\uff1b \u88c5\u9970\u5668\u65b9\u6cd5\u6307\u5b9a\u6b21\u6570\uff1b @pytest.mark.count(2)\ndef test_music_001():\npass\n \u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u6b21\u6570\uff1b python3 manage.py run -a deepin-music -k 001 --count 2\n \u200b image_utils \u589e\u52a0\u51fd\u6570 save_temporary_picture\uff0c\u652f\u6301\u6307\u5b9a\u5c4f\u5e55\u533a\u57df\u622a\u56fe\u5e76\u8fd4\u56de\u56fe\u7247\u5b58\u653e\u7684\u672c\u5730\u8def\u5f84\uff0c\u540e\u7eed\u4f7f\u7528 assert_image_exist \u8fdb\u884c\u65ad\u8a00 Python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(x, y, width, height) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) button_center \u65b0\u589e btn_size \u83b7\u53d6\u63a7\u4ef6\u5de6\u4e0a\u89d2\u5750\u6807\u53ca\u957f\u5bbd\uff0c\u7528\u4e8e\u52a8\u6001\u7684\u622a\u53d6\u5143\u7d20\u7684\u56fe\u7247\uff0c\u53ef\u7528\u4e8e\u5b9a\u4f4d\u65ad\u8a00 python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u6240\u6709\u97f3\u4e50\u6309\u94ae\")) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) allure \u62a5\u544a\u4e2d\u5b9a\u4f4d\u95ee\u9898\u9664\u4e86\u65e5\u5fd7\u3001\u622a\u56fe\u3001\u5f55\u5c4f\u5916\uff0c\u8c03\u7528\u7684\u51fd\u6570\u589e\u52a0\u4e86 step \u6b65\u9aa4\u5c55\u793a\uff1b env.sh \u65b0\u589e\u5b89\u88c5\u5b50\u9879\u76ee Python \u4e09\u65b9\u4f9d\u8d56\uff0c\u5728\u5b50\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u5199 requirement.txt \u6587\u4ef6\uff0cenv.sh \u4f1a\u81ea\u52a8\u52a0\u8f7d\uff1b ocr \u8bc6\u522b\u65b0\u589e\u652f\u6301\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\u8fdb\u884c\u6587\u5b57\u8bc6\u522b\uff0c\u51cf\u5c11\u56e0\u5168\u5c4f\u8bc6\u522b\u65f6\uff0c\u5176\u4ed6\u6587\u5b57\u7684\u5e72\u6270 Python # \u65ad\u8a00\u97f3\u4e50\u7684\u5220\u9664\u5f39\u7a97\u4e2d\uff0c\u5305\u542b\u4e86\u201c\u786e\u8ba4\u201d\u7684\u6587\u5b57 self.assert_ocr_exist(\"\u786e\u8ba4\", picture_abspath=DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u5220\u9664\u5f39\u7a97\"))) \u65ad\u8a00\u51fd\u6570\u7684\u8c03\u7528\u4e5f\u4f1a\u81ea\u52a8\u6253\u5370\u65e5\u5fd7; env.sh \u65b0\u589e\u88c1\u526a\u4f9d\u8d56\u7684\u65b9\u6848\uff1b fix \u4fee\u590d Jenkins \u73af\u5883\u4e0b\uff0c apps \u76ee\u5f55\u4e0b\u5b50\u9879\u76ee\u5b58\u5728 auotest_deepin_xxx@tmp \u76ee\u5f55\uff0c\u5728\u4f20\u5165 app_name \u540e\u65e0\u6cd5\u6267\u884c\u7528\u4f8b\u7684\u95ee\u9898\uff1b \u4fee\u590d\u81ea\u52a8\u751f\u6210 case_list.csv \u6587\u4ef6\u65f6\uff0c\u7528\u4f8b\u987a\u5e8f\u88ab\u8c03\u6574\u7684\u95ee\u9898\uff1b env.sh \u73af\u5883\u5b89\u88c5\u79fb\u9664 git \u548c curl\uff1b \u4fee\u590d\u7528\u4f8b\u5728 setup \u9636\u6bb5\u62a5\u9519\u540e\uff0c\u672a\u5199\u5165 ci_result.json \u7684\u95ee\u9898\uff1b \u79fb\u9664 uos_ci.py\uff1b "},{"location":"RELEASE/#11320221028","title":"1.1.3\uff082022/10/28\uff09","text":"new \u65b0\u589e\u56fe\u50cf\u65ad\u8a00\u6210\u529f\u8f93\u51fa\u5339\u914d\u5ea6\uff1b \u65b0\u589e\u73af\u5883\u5b89\u88c5 yaml \u4f9d\u8d56\uff1b \u65b0\u589e\u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6570\u636e\u56de\u586b\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b \u65b0\u589e\u6d4b\u8bd5\u7ed3\u679c\u8868\u60c5\u663e\u793a\uff0c\u5e76\u4f18\u5316\u4e86\u65e5\u5fd7\u7684\u6392\u7248\uff1b \u65b0\u589e --top {number} \u7528\u4e8e\u8bb0\u5f55\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0c\u65e5\u5fd7\u751f\u6210\u5230 report/logs/top.log\uff1b fix \u4fee\u590d\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4f46\u7ec8\u7aef\u6ca1\u6709\u9519\u8bef\u65e5\u5fd7\u8f93\u51fa\u7684\u95ee\u9898\uff1b \u4fee\u6539\u5931\u8d25\u7528\u4f8b\u56de\u6eaf\u65e5\u5fd7\u4e3a\u8be6\u7ec6\u7ea7\u522b\uff1b \u4fee\u590d\u4e86\u6267\u884c\u8fdb\u5ea6\u672a\u8ba1\u7b97\u8df3\u8fc7\u7528\u4f8b\u7684\u95ee\u9898\uff0c\u5e76\u4f18\u5316\u4e86\u8fdb\u5ea6\u83b7\u53d6\u7684\u7b97\u6cd5\uff1b \u4fee\u590d env.sh \u5728 V23 \u73af\u5883\u4e0b\u5b89\u88c5\u65e0\u6cd5\u8bfb\u53d6\u5bc6\u7801\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 pms \u6d4b\u8bd5\u5957\u6267\u884c\u6216\u6d4b\u8bd5\u5355\u6267\u884c\u65f6\uff0c\u7528\u4f8bID\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b env.sh \u91cc\u9762 hub.deepin.com \u66f4\u6362\u6210 it.uniontech.com\uff1b uos_ci.py \u6d4b\u8bd5\u7ed3\u679c\u7edf\u8ba1\u65f6\uff0c\u603b\u6570\u5254\u9664 skip \u7684\u6570\u91cf "},{"location":"RELEASE/#11220220921","title":"1.1.2\uff082022/09/21\uff09","text":"new \u5728\u6ca1\u6709\u5b89\u88c5 dogtail \u7684\u60c5\u51b5\u4e0b\uff0c\u4e5f\u80fd\u4f7f\u7528 sniff \u5de5\u5177\uff1b fix \u4fee\u590d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e2d\u6ca1\u6709\u5b89\u88c5 AT \u73af\u5883\u6267\u884c uos_ci.py \u62a5\u9519\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11120220919","title":"1.1.1\uff082022/09/19\uff09","text":"new \u65b0\u589e\u6267\u884c\u8fdb\u5ea6\u663e\u793a\uff0c\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u65f6\u65e5\u5fd7\u8f93\u51fa\u5f53\u524d\u8fdb\u5ea6\uff1a[\u5f53\u524d\u6307\u5b9a\u7b2c\u51e0\u6761/\u7528\u4f8b\u603b\u6570]\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u7528\u4f8b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\u6240\u6709\u5931\u8d25\u7528\u4f8b\u7684\u5217\u8868\uff1b \u5173\u95ed\u7ec8\u7aef\u8f93\u51fa\u6355\u83b7\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u65e5\u5fd7\u5feb\u7167\uff1b \u4f18\u5316\u7ec8\u7aef\u8f93\u51fa\u5931\u8d25\u4fe1\u606f\u5197\u957f\u4e3a\u7b80\u8981\u4fe1\u606f\u8f93\u51fa\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u663e\u793a 10 \u4e2a\u6267\u884c\u6700\u6162\u7684\u7528\u4f8b\u5217\u8868\uff0c\u5e76\u8be6\u7ec6\u5217\u51fa\u5404\u4e2a\u9636\u6bb5\u7684\u8017\u65f6\uff1b \u5931\u8d25\u91cd\u8dd1\u7528\u4f8b\u91cd\u8dd1\u4e4b\u524d\u5ef6\u8fdf 1 \u79d2\uff1b \u65b0\u589e\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4ecd\u7136\u5f3a\u5236\u6267\u884c\uff1b \u7528\u4f8b\u6536\u96c6\u65f6\u4ec5\u5728 apps \u76ee\u5f55\u4e0b\u8fdb\u884c\uff0c\u5ffd\u7565 src,setting,public \u76ee\u5f55\uff1b \u65b0\u589e allure \u62a5\u544a\u5907\u4efd\u529f\u80fd\uff0c\u9ed8\u8ba4\u5907\u4efd\u81f3 allure_back \u76ee\u5f55\u4e0b\uff1b manage.py\u65b0\u589e\u53c2\u6570 --lastfailed \u7528\u4e8e\u53ea\u8dd1\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\u7684\u529f\u80fd\uff1b fix \u4fee\u590d\u4e86\u5728\u6ca1\u6709\u6307\u5b9a\u5e94\u7528\u540d\u79f0\u6267\u884c\u65f6\uff0cxml \u62a5\u544a\u751f\u6210\u8def\u5f84\u5f02\u5e38\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 uos_ci.py \u4f20\u5165 timeout \u548c session_timeout \u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11020220916","title":"1.1.0\uff082022/09/16\uff09","text":"new \u65b0\u589ePMS\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u652f\u6301\u591a\u79cd\u6570\u636e\u56de\u586b\u6a21\u5f0f\uff1b \u4f18\u5316\u4e86\u901a\u8fc7\u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u65f6PMS \u722c\u866b\u7684\u6027\u80fd\uff1b \u65b0\u589e .gitmodules \u6587\u4ef6\uff0c\u7528\u4e8e\u6807\u8bb0\u6240\u6709\u5b50\u9879\u76ee\uff0c\u65b9\u4fbf\u7edf\u4e00\u62c9\u53d6\u4ee3\u7801\uff1b env.sh \u9002\u914d\u793e\u533a\u7248\u4e0a\u5b89\u88c5\u81ea\u52a8\u5316\u73af\u5883\uff1b \u589e\u52a0\u6267\u884c\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u9519\u8bef\u7684\u529f\u80fd\uff1b README.md \u589e\u52a0 Wayland \u4e0b\u4f7f\u7528\u3001\u6d4b\u8bd5\u62a5\u544a\u67e5\u770b\u3001\u5e38\u89c1\u95ee\u9898\u7b49\u7684\u6587\u6863\u8bf4\u660e\uff1b \u589e\u52a0\u4e86\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u5bf9 setup\u3001call\u3001teardown \u8fdb\u884c\u65e5\u5fd7\u5206\u6bb5\uff1b fix \u4fee\u590d\u4e86 \u786e\u8ba4\u4fee\u590d \u5217\u6ca1\u5199\u8868\u5934\uff0c\u4f46\u5199\u4e86 fixed-xxx \u6807\u7b7e\uff0c\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u540c\u4e00\u5e94\u7528\u5185\u591a\u4e2a csv \u6587\u4ef6\u4e2d \u786e\u8ba4\u4fee\u590d \u5217\u6709\u7684\u5199\u4e86\uff0c\u6709\u7684\u6ca1\u5199\uff0c\u53ef\u80fd\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 INFO \u65e5\u5fd7\uff0c\u663e\u793a\u4e3a DEBUG \u7684\u95ee\u9898\uff1b\u4fee\u590d\u4e86\u90e8\u5206\u673a\u5668\u4e0a INFO \u65e5\u5fd7\u5185\u5bb9\u663e\u793a\u4e3a\u7ea2\u8272\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\u770b\u4e0d\u5230\u8be6\u7ec6\u4fe1\u606f\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10220220822","title":"1.0.2\uff082022/08/22\uff09","text":"new \u79fb\u9664 loguru\uff0c\u66ff\u6362\u4e3a logging\uff0c\u63a5\u53e3\u4fdd\u6301\u4e0d\u53d8\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u53d7\u5f71\u54cd\uff1b \u9ed8\u8ba4\u5f00\u542f coredump\uff1b fix \u4fee\u590d\u4e86\u4e09\u65b9\u5e93 loguru \u5076\u73b0\u5f02\u5e38\uff0c\u5bfc\u81f4\u7a0b\u5e8f\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7b2c\u4e00\u6b21\u5931\u8d25\u4e0d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10120220812","title":"1.0.1\uff082022/08/12\uff09","text":"new \u65b0\u589e RELEASE.md \u6587\u4ef6\uff0c\u7528\u4e8e\u8bb0\u5f55\u5386\u53f2\u53d1\u5e03\u7248\u672c\u7684\u66f4\u65b0\u5185\u5bb9\uff1b \u517c\u5bb9 Wayland \u6a21\u5f0f\u4e0b\u6267\u884c\u7528\u4f8b\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u7528\u7ba1\u5f53\u524d\u6d4b\u8bd5\u673a\u6267\u884c\u73af\u5883\uff0c\u6846\u67b6\u4f1a\u81ea\u52a8\u6839\u636e\u5f53\u524d\u73af\u5883\u8d70\u4e0d\u540c\u7684\u4ee3\u7801\u903b\u8f91\uff1b \u7531\u4e8e\u9700\u8981\u4fee\u6539 dogtail \u6e90\u4ee3\u7801\uff0c\u56e0\u6b64\u5c06\u4fee\u6539\u540e\u7684\u6e90\u7801\u653e\u5165\u5230\u6838\u5fc3\u5e93\u91cc\u9762 src/depends/dogtail \u540e\u7eed\u7248\u672c\u5c06\u4e0d\u9700\u8981\u5728\u7cfb\u7edf\u4e2d\u5b89\u88c5dogtail\uff1b \u5982\u679c\u5e94\u7528\u5e93\u540c\u6837\u4f7f\u7528\u4e86\u7cfb\u7edf\u5b89\u88c5\u7684 dogtail \u53ef\u80fd\u4f1a\u62a5\u9519\uff0c\u89e3\u51b3\u65b9\u6848\u662f\u5c06\u4ee3\u7801\u4e2d\u7684 import dogtail \u4fee\u6539\u4e3a from src.depends import dogtail ; fix \u91cd\u8dd1\u5931\u8d25\u4e4b\u540e\u624d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff0c\u4fee\u6539\u4e3a\u5931\u8d25\u4e4b\u540e\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":"# Attribution \uff1achengdu Test Team\n# Date \uff1a2021/08/20\n \u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d \u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d \u4ed3\u5e93\u5730\u5740\uff1ahttps://gitlabcd.uniontech.com/autotest/cd-desktop-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u65b9\u6848\u6982\u8ff0","text":"\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u667a\u80fd\u8bc6\u522b\u5e94\u7528\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u7528\u4e8e\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u64cd\u4f5c\u8fc7\u7a0b\u4e2d\u7684\u5143\u7d20\u5b9a\u4f4d\u4ee5\u53ca\u5224\u65ad\u7ed3\u679c\u65f6\u7684\u65ad\u8a00\u5904\u7406\uff1b\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\uff0c\u6d4b\u8bd5\u673a\u4e0a\u7684\u753b\u9762\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u5230\u670d\u52a1\u5668\u4e0a\uff0c\u670d\u52a1\u5668\u5bf9\u89c6\u9891\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\u540e\uff0c\u670d\u52a1\u5668\u667a\u80fd\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\u6210\u529f\uff0c\u7136\u540e\u5bf9\u6d4b\u8bd5\u673a\u4e0b\u53d1\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\uff0c\u6d4b\u8bd5\u673a\u63a5\u53d7\u5e76\u6267\u884c\u4e0b\u4e00\u6b65\u64cd\u4f5c\u3002 \u670d\u52a1\u5668\u4e0e\u6d4b\u8bd5\u673a\u4e4b\u95f4\u7684\u94fe\u63a5\uff1a \u670d\u52a1\u5668\u901a\u8fc7 USB \u4e32\u53e3\u8bbe\u5907\uff08USB-HID \u534f\u8bae\uff09\u6a21\u62df\u9f20\u6807\u952e\u76d8\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u64cd\u4f5c\u3002 \u901a\u8fc7\u89c6\u9891\u91c7\u96c6\u8bbe\u5907\u6355\u83b7\u6d4b\u8bd5\u673a\u7684\u5b9e\u65f6\u753b\u9762\u4f20\u8f93\u7ed9\u670d\u52a1\u5668\u3002 \u670d\u52a1\u5668\u5bf9\u91c7\u96c6\u7684\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\uff0c\u8bc6\u522b\u5176\u4e2d\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5e76\u8fd4\u56de\u5143\u7d20\u63a7\u4ef6\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\uff0c\u670d\u52a1\u5668\u901a\u8fc7\u667a\u80fd\u5316\u5206\u6790\uff0c\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e00\u81f4\u5c06\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\u901a\u8fc7\u4e32\u53e3\u6a21\u62df\u952e\u9f20\u4fe1\u53f7\u53d1\u9001\u7ed9\u6d4b\u8bd5\u673a\uff1b\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e0d\u4e00\u81f4\u5c06\u4f1a\u8fdb\u5165\u4e2d\u65ad\u5904\u7406\u53ca\u5f02\u5e38\u7ed3\u679c\u8f93\u51fa\uff0c\u7ee7\u7eed\u6267\u884c\u540e\u7eed\u573a\u666f\uff0c\u76f4\u81f3\u6240\u6709\u7528\u4f8b\u6d4b\u8bd5\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u6df1\u5ea6\u5b66\u4e60\u73af\u5883\u642d\u5efa","text":"\u6a21\u578b\u8bad\u7ec3\u4e3b\u8981\u5bf9 GPU \u6709\u8981\u6c42\uff0c\u8bad\u7ec3\u6a21\u578b\u7684\u673a\u5668\u663e\u5b58\u4e0d\u4f4e\u4e8e 6G\uff0c\u5176\u4ed6\u914d\u7f6e\u65e0\u7279\u6b8a\u8981\u6c42\u3002 \u63a8\u8350\u6027\u4ef7\u6bd4\u8f83\u9ad8\u914d\u7f6e \u64cd\u4f5c\u7cfb\u7edf: UnionTech OS Desktop 20 Professional Linux version 4.19.0-desktop-amd64 (deepin@deepin-PC) (Uos 8.3.0.3-3+rebuild) \u5904\u7406\u5668: Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz (\u516b\u6838 / \u5341\u516d\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460M-HDV(RD)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))/8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: TU116 [GeForce GTX 1660]\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u865a\u62df\u73af\u5883\u5b89\u88c5","text":"cd ~\nwget -c https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh\nbash Miniconda3-latest-Linux-x86_64.sh\n \u4e00\u8def\u56de\u8f66 \u7b2c\u4e00\u6b21\u63d0\u793a\u8f93\u5165 yes/no \uff1a\u8f93\u5165 yes \u7ee7\u7eed\u4e00\u8def\u56de\u8f66 \u7b2c\u4e8c\u6b21\u63d0\u793a\uff1a\u8f93\u5165 no cd ~/miniconda3/bin\nsudo chmod 777 activate\n \u6fc0\u6d3bconda\u73af\u5883 . ./activate\n \u6dfb\u52a0\u516c\u53f8\u5185\u7f51\u6e90 conda config --add channels bioconda\nconda config --add channels conda-forge\n \u5982\u679c\u662f\u5916\u7f51\u6dfb\u52a0\u5916\u7f51\u6e90 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/\n \u5982\u679c\u8981\u5220\u9664\u6e90 conda config --remove-key channels\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"2\u3001\u5b89\u88c5\u4f9d\u8d56","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u521b\u5efa\u865a\u62df\u73af\u5883","text":"conda remove --name mmlab --all # \u79fb\u9664\u6240\u6709\u865a\u62df\u73af\u5883\n conda create -n mmlab python=3.7\n conda activate mmlab\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-pytorch","title":"\uff082\uff09\u5b89\u88c5 Pytorch","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install torch==1.7.0+cu101 torchvision==0.8.1+cu101 torchaudio==0.7.0 -f https://download.pytorch.org/whl/torch_stable.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-mmcv","title":"\uff083\uff09\u5b89\u88c5 MMCV","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install mmcv-full==1.3.3 -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.7.0/index.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"\uff084\uff09\u5b89\u88c5\u663e\u5361\u9a71\u52a8","text":"\u6839\u636e\u4f60\u7684\u663e\u5361\u4e0b\u8f7d\u5bf9\u5e94\u9a71\u52a8\uff0c\u6bd4\u5982\u6211\u7684\u663e\u5361\u4e3a GTX1660\uff0c\u9a71\u52a8\u7248\u672c\u4e3a 430\uff0c\u9a71\u52a8\u4e0b\u8f7d\u5730\u5740\uff1ahttps://www.nvidia.cn/Download/Find.aspx?lang=cn CTRL+ALT+F2 \u8fdb\u5165tty\n \u7981\u7528 nouveau \u9a71\u52a8 sudo vim /etc/modprobe.d/blacklist-nouveau.conf\n \u586b\u5165\uff1a blacklist nouveau options nouveau modeset=0\n \u5237\u65b0\u914d\u7f6e\u6587\u4ef6 sudo update-initramfs -u reboot \u91cd\u542f\u540e\u518d\u8fdb\u5165 tty \u5173\u95ed\u56fe\u50cf\u754c\u9762\uff0c\u8f93\u5165\u547d\u4ee4\u5173\u95ed\u56fe\u50cf\u754c\u9762 sudo service lightdm stop\n \u5b89\u88c5\u9a71\u52a8 sudo chmod a+x NVIDIA-Linux-x86_64-430.run\nsudo ./NVIDIA-Linux-x86_64-430.run\n reboot\u91cd\u542f\uff0cnvidia-smi\u67e5\u770b\u5b89\u88c5\u72b6\u6001\u3002\u6ce8\u610f\u770b\u4e0bcuda\u7248\u672c\uff0c10.1\uff0cdriver\u7248\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u6570\u636e\u6807\u6ce8","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u6570\u636e\u6807\u6ce8","text":"\u6807\u6ce8\u4e4b\u524d\u9700\u8981\u5148\u8f6c\u6362\u56fe\u7247\u5927\u5c0f\uff0c\u5e76\u4e14\u4ee5\u6570\u5b57\u547d\u540d\uff0c\u6bcf\u7ec4\u547d\u540d\u9012\u589e"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"\uff081\uff09\u8f6c\u6362\u5927\u5c0f\u5e76\u91cd\u547d\u540d","text":"rename_pic.py import os\nimport sys\nimport cv2\nimport time\nimport getpass\nusername = getpass.getuser()\nsource_path = f\"/home/{username}/Desktop/right_menu\" # \u56fe\u7247\u8def\u5f84\nsource_dest = os.path.join('/'.join(source_path.split(\"/\")[:-1]), 'tmp')\nif not os.path.exists(source_dest):\nos.mkdir(source_dest)\nstart_name = sys.argv[1]\nfile_name_list = list()\nfor file in os.listdir(source_path):\nif file.endswith('.png'):\nfile_name_list.append(file)\nstart_name = int(start_name)\nfor file in file_name_list:\nos.rename(os.path.join(source_path,file), os.path.join(source_path, f\"{str(start_name)}.png\"))\nstart_name += 1\ntime.sleep(1)\nfor file in os.listdir(source_path):\nimage = os.path.join(source_path, str(file))\nsrc = cv2.imread(image)\nresult = cv2.resize(src, (960, 540))\nresizeImage = os.path.join(source_dest, str(file))\nprint(resizeImage)\ncv2.imwrite(str(resizeImage), result)\ncv2.waitKey(0)\ncv2.destroyAllWindows()\ntime.sleep(1)\nos.system(f'rm -rf {source_path}/*')\nos.system(f'mv {source_dest}/* {source_path}')\nos.system(f'rm -rf {source_dest}')\nprint(\"\u4e0b\u4e00\u4e2a\u5e8f\u53f7\uff1a\", start_name)\n \u6839\u636e\u7ec8\u7aef\u8f93\u51fa\u7684\u4e0b\u4e00\u4e2a\u5e8f\u53f7\u7684\u63d0\u793a\uff0c\u6267\u884c Python \u6587\u4ef6\u7684\u65f6\u5019\u4f20\u53c2\u3002 python rename_pic.py 249\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"\uff082\uff09\u5de5\u5177\u6807\u6ce8","text":"\u4f7f\u7528\u5de5\u5177 labelImg \u6807\u6ce8 sudo pip3 install PyQt5==5.13\nsudo pip3 install labelImg\n \u7ec8\u7aef\u76f4\u63a5\u8f93\u5165 labelImg\uff0c\u56de\u8f66 \u6807\u6ce8\u6a21\u5f0f\u9009\u62e9\uff1aPascalVOC"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u667a\u80fd\u6807\u6ce8","text":"\u6253\u5f00\u5c4f\u5e55\u5f55\u5236\u8f6f\u4ef6\uff0c\u5f55\u5236\u624b\u52a8\u64cd\u4f5c\u4e00\u6b21\u6d4b\u8bd5\u7528\u4f8b\uff0c\u7136\u540e\u5c06\u5f55\u5236\u7684\u89c6\u9891\u8fdb\u884c\u5206\u5e27\uff0c\u7136\u540e\u5bf9\u6bd4\u524d\u4e24\u5e27\u56fe\u6807\u76f8\u4f3c\u5ea6\uff0c\u5254\u9664\u76f8\u4f3c\u5ea6\u8fc7\u9ad8\u7684\u56fe\u7247\uff0c\u5728\u4fdd\u8bc1\u7d20\u6750\u591a\u6837\u6027\u7684\u524d\u63d0\u4e0b\uff0c\u5254\u9664\u91cd\u590d\u591a\u4f59\u7684\u56fe\u7247\u751f\u6210\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u96c6\uff0c\u7136\u540e\u53d6\u51fa\u63a7\u4ef6\u6a21\u677f\u6570\u636e\u96c6\uff0c\u901a\u8fc7 OpenCV \u6a21\u677f\u5339\u914d\u83b7\u53d6\u63a7\u4ef6\u5728\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u56fe\u7247\u4e2d\u6240\u5728\u7684\u5de6\u4e0a\u3001\u5de6\u4e0b\u3001\u53f3\u4e0a\u3001\u53f3\u4e0b\u56db\u5904\u5750\u6807\uff0c\u4ece\u800c\u6839\u636e\u6a21\u677f\u6570\u636e\u96c6\u751f\u6210\u6807\u6ce8\u6570\u636e\u3002\u53c2\u8003\u76ee\u5f55 AnnotationMaterial"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"\uff081\uff09\u6a21\u677f\u6570\u636e\u96c6\u51c6\u5907","text":"1\u3001\u5728\u754c\u9762\u622a\u53d6\u9700\u8981\u6807\u6ce8\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u653e\u5728\u76ee\u5f55\u4e0b AnnotationMaterial/template/img 2\u3001\u7ef4\u62a4\u63a7\u4ef6\u540d\u4e0e\u5143\u7d20\u63a7\u4ef6\u7684\u952e\u5bf9\uff0c\u4e00\u4e2a\u63a7\u4ef6\u540d\u53ef\u5bf9\u5e94\u591a\u4e2a\u5143\u7d20\u63a7\u4ef6 menu:\n- menu.jpg\n- menu1.jpg\n- menu2.jpg\n- menu3.jpg\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"\uff082\uff09\u7d20\u6750\u96c6\u51c6\u5907","text":"\u5f55\u5236\u89c6\u9891\u6216\u6216\u5c4f\u5e55\u622a\u56fe\u653e\u7f6e\u76ee\u5f55 AnnotationMaterial/source"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u5f00\u59cb\u6807\u6ce8","text":"python3 AnnotationMaterial/main.py\n \u751f\u6210\u7684\u6807\u6ce8\u6570\u636e\u5b58\u653e\u5728 AnnotationMaterial/result"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#mmdetection","title":"\u56db\u3001MMDetection","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1-mmdetection","title":"1\u3001 MMDetection \u4ee3\u7801","text":"MMDetection \u662f\u4e00\u4e2a\u6709\u540d\u7684\u6df1\u5ea6\u5b66\u4e60\u76ee\u6807\u68c0\u6d4b\u5f00\u6e90\u9879\u76ee\uff0c\u4e5f\u662f openMMlab \u7684\u62db\u724c\u9879\u76ee\uff0c\u4e3a\u4ec0\u4e48\u9009\u62e9\u5b83\uff0c\u5c0f\u5b69\u513f\u6ca1\u5a18\u8bf4\u6765\u8bdd\u957f\uff0c\u611f\u5174\u8da3\u53ef\u4ee5\u81ea\u884c\u6df1\u5165\u4e86\u89e3\uff1b \u4f60\u53ef\u4ee5\u76f4\u63a5\u5728 GitHub \u4e0a\u514b\u9686\u4ee3\u7801\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u54b1\u4eec\u4ed3\u5e93\u4e0b Train \u76ee\u5f55\u4e2d\u4ee3\u7801\uff0cTrain \u4e2d\u7684\u4ee3\u7801\u4e5f\u662f\u4ece GitHub \u4e0a\u62c9\u53d6\u7684\uff0c\u4e0d\u8fc7\u6211\u4eec\u6839\u636e\u9879\u76ee\u9700\u8981\u505a\u4e86\u4e00\u4e9b\u4e8c\u6b21\u5f00\u53d1\uff0c\u63a8\u8350\u76f4\u63a5\u4f7f\u7528\u5b83\u3002 \u5982\u679c\u4f60\u60f3\u4ece GitHub \u4e0a\u62c9\uff1a git clone https://github.com/open-mmlab/mmdetection.git\n# \u4e0d\u80fd\u76f4\u63a5\u62c9\u53d6\u4e3b\u5206\u652f\uff0c\u5efa\u8bae\u4f7f\u75282.12\u7248\u672c\uff0c\u4e0d\u540c\u7684\u7248\u672c\u5bf9\u5e94\u7684mmcv\u7248\u672c\u662f\u4e0d\u540c\u7684\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-voc2coco","title":"2\u3001\u62c9\u53d6 voc2coco \u4ee3\u7801","text":"git clone https://github.com/Tony607/voc2coco.git\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-coco","title":"3\u3001\u8f6c\u6362 coco \u6570\u636e\u96c6","text":"\u5c06\u6240\u6709\u7684\u56fe\u7247\u548cxml\u6587\u4ef6\u653e\u5165train2017\uff0c\u4ece\u4e2d\u6311\u9009\u51e0\u7ec4\u653e\u5165val2017\uff08\u6d4b\u8bd5\u96c6\uff09 cd mmdetection/data/coco\npython voc2coco.py train2017 annotations/instances_train2017.json\npython voc2coco.py val2017 annotations/instances_val2017.json\n \u751f\u6210json\u6587\u4ef6"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4_1","title":"4\u3001\u4fee\u6539\u914d\u7f6e","text":"\uff081\uff09\u8bfb\u53d6\u6a21\u578b\u540d\u79f0 import json\nmodule_name = []\nwith open('./instances_train2017.json', \"r+\") as f:\njson_file = f.read()\njson_dict = json.loads(json_file)\nmodule_list = json_dict.get('categories')\nfor module_info in module_list:\nname = module_info.get('name')\nmodule_name.append(name)\nprint(module_name)\nprint(\"module_num:\", len(module_name))\n # \u6ce8\u610f\u5bf9\u6bd4instances_train2017.json\u91cc\u9762\u6a21\u578b\u540d\u79f0\u7684\u987a\u5e8f\uff0c\u4e0eCLASSES\u548ccoco_classes\u91cc\u9762\u7684\u987a\u5e8f\u4fdd\u6301\u4e00\u81f4\u3002\n \uff082\uff09\u4fee\u6539 faster_rcnn_r101_2x_coco.py mmdetection/xianjin/faster_rcnn_r101_2x_coco.py \u4fee\u653946\u884c\uff0cnum_clasess\u7684\u503c\uff0c\u65b0\u589e1\u4e2a\uff0c\u5c31 +1\uff1b \uff083\uff09\u4fee\u6539 coco.py mmdetection/mmdet/datasets/coco.py CLASSES = ()\uff0c\u5728\u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b \uff084\uff09\u4fee\u6539 class_names.py mmdetection/mmdet/core/evaluation/class_names.py coco_classes \u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#5","title":"5\u3001\u7f13\u5b58\u6e05\u7406","text":"\u5220\u9664 mmdetection/build \u76ee\u5f55 python setup.py install\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#6","title":"6\u3001\u8bad\u7ec3\u6a21\u578b","text":"\uff081\uff09\u6307\u5b9a\u81ea\u5df1\u914d\u7f6e\u7684\u8bad\u7ec3\u6a21\u578b\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py --gpus 1\n \uff082\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u6d4b\u8bd5\u96c6\u7ed3\u679c\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py xianjin/epoch_24.pth --show\n \uff083\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u51c6\u786e\u5ea6\uff1b python tools/analysis_tools/analyze_logs.py plot_curve xianjin/20210530_011907.log.json --keys acc\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#7","title":"7\u3001\u5feb\u6377\u64cd\u4f5c","text":"python3 run.py\n \u5c06\u4ee5\u4e0a 4 - 7 \u6b65\u64cd\u4f5c\u6574\u5408\u6210 run.py\uff0c\u4e00\u952e\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u4e94\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\uff1b \u670d\u52a1\u7aef\u4e00\u53f0\uff08\u76ee\u524d\u4ec5\u652f\u6301AMD\u67b6\u6784\uff09\uff1b \u91c7\u96c6\u76d2\u4e00\u4e2a \uff08ACASIS hdmi\u89c6\u9891\u91c7\u96c6\u5361\uff0chttps://item.jd.com/10024310742602.html \uff09\uff1b USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\uff1b USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff1b \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5USB\u5ef6\u957f\u7ebf\uff1b \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u63a8\u8350\u914d\u7f6e","text":"\u6267\u884c\u7528\u4f8b\u7684\u670d\u52a1\u7aef\u5bf9\u914d\u7f6e\u6ca1\u6709\u7279\u6b8a\u8981\u6c42\uff0c\u5982\u679c\u6761\u4ef6\u5141\u8bb8\u914d\u7f6e\u8d8a\u9ad8\uff0c\u8bc6\u522b\u901f\u5ea6\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n \u6d4b\u8bd5\u673a\u4e0a\u4e0d\u6267\u884c\u4efb\u4f55\u811a\u672c\uff0c\u5177\u4f53\u914d\u7f6e\u6839\u636e\u6d4b\u8bd5\u9700\u8981\u51b3\u5b9a\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#usb_mk","title":"\u516d\u3001USB_MK\u4e32\u53e3\u9a71\u52a8\u65b9\u6cd5","text":"\u4f4d\u4e8econtrol_method\u76ee\u5f55\u4e0b\u7684usb_mk.py\u6587\u4ef6 \uff081\uff09\u5217\u51fa\u53ef\u901a\u4fe1\u7684\u7aef\u53e3 python3 -m serial.tools.list_ports -v\n \uff082\uff09\u4fee\u6539\u4e32\u53e3\u7684\u6743\u9650 sudo chmod 777 /dev/ttyACM0\n \uff083\uff09\u5b9e\u4f8b\u5316USB_MK import UsbMk\nusb_mk = UsbMk(\"/dev/ttyACM0\", 9600) # \u8bbe\u5907\u9ed8\u8ba49600\u4e3a\u6ce2\u7279\u7387\uff0c\u63a7\u5236\u4f20\u8f93\u901f\u7387\n \uff084\uff09USB\u4e32\u53e3\u8bbe\u5907\u9ed8\u8ba4\u6ce2\u7279\u7387\u4e3a9600\uff08\u7ecf\u6d4b\u8bd5\u6ce2\u7279\u73879600\u51c6\u786e\u6027\u6700\u597d\uff09\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up() # \u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u6c49\u5b57\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e\n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff083\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff084\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff085\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() # \u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2\n \uff086\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff087\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff088\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e03\u3001\u65b9\u6cd5\u8c03\u7528\u5165\u53c2\u89c4\u5219","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_7","title":"1\u3001\u57fa\u7c7b","text":"class Base:\ndef __init__(self):\nself._obj = image\nself._usb = usb_mk\ndef find_element_by_ai(self, element):\nreturn self._obj.find_element(element)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_6","title":"2\u3001\u5165\u53c2\u8bf4\u660e","text":"\u56fe\u50cf\u8bc6\u522b\u65b9\u6cd5\u5165\u53e3\u4e3a Base \u7c7b\u4e0b\u7684 find_element_by_ai \u3002\u4ec5\u63a5\u53d7\u4e00\u4e2a\u53c2\u6570 element\uff0c\u7c7b\u578b\u4e3a string\u3002 \u53ef\u8bc6\u522b\u7684 string \u683c\u5f0f\uff1a \uff081\uff09\u5927\u56fe\u6807\uff08 \u56fe\u6807\u5927\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\uff0c\u4f8b\uff1a Base().find_element_by_ai(\"window\")\n \uff082\uff09\u5927\u56fe\u6807 / \u5c0f\u56fe\u6807\uff08\u56fe\u6807\u5c0f\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5c0f\u56fe\u6807\uff0c\u4f8b\uff1awindow/search_btn Base().find_element_by_ai(\"window/search_btn\")\n \uff083\uff09\u5927\u56fe\u6807 / OCR\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\u5185\u7684\u6587\u5b57\uff0c\u4f8b\uff1amenu/\u5c5e\u6027 Base().find_element_by_ai(\"menu/\u5c5e\u6027\")\n \uff084\uff09OCR\uff1a\u5168\u5c4f\u8bc6\u522b\u6587\u5b57 Base().find_element_by_ai(\"\u641c\u7d22\")\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516b\u3001\u9690\u85cf\u9f20\u6807","text":"\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u8fc7\u6765\u7684\u89c6\u9891\u6d41\uff0c\u5728\u8bc6\u522b\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u53d7\u5230\u9f20\u6807\u5f71\u54cd\uff0c\u56e0\u6b64\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u9690\u85cf\u9f20\u6807\u3002 \u5c4f\u853d\u9f20\u6807\u5149\u6807\u663e\u793a ```shell script /etc/lightdm/lightdm.conf \u5728`[Seat:*]`\u4e0b\u9762\u6dfb\u52a0\u53c2\u6570\n```shell script\nxserver-command=X -bs -core -nocursor\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e5d\u3001\u667a\u80fd\u81ea\u52a8\u5316\u7684\u610f\u4e49","text":"1\u3001\u6539\u5584 Acessibility \u5b9a\u4f4d\u7684\u7a33\u5b9a\u6027\u95ee\u9898 Acessibility \u5c5e\u6027\u5b9a\u4f4d\u5b58\u5728\u5076\u5c14\u5931\u6548\u7684\u60c5\u51b5 \uff081\uff09\u5f00\u53d1\u5728\u505a\u65b0\u9700\u6c42\u5f00\u53d1\u65f6\u53ef\u80fd\u6d89\u53ca\u5230\u5bf9\u5c5e\u6027\u6807\u7b7e\u7684\u4fee\u6539\u6216\u8005\u5c42\u7ea7\u7684\u8c03\u6574\uff0c\u53ef\u80fd\u9020\u6210\u81ea\u52a8\u5316\u7528\u4f8b\u65e0\u6cd5\u5b9a\u4f4d\u5230\u5143\u7d20\u3002 \u6bd4\u59821040\u9636\u6bb5\uff0c\u97f3\u4e50\u91cd\u6784\u7684\u65f6\u5019\uff0c\u5f00\u53d1\u5bf9\u90e8\u5206\u5c5e\u6027\u548c\u5c42\u7ea7\u505a\u4e86\u4fee\u6539\uff0c\u5bfc\u81f4\u81ea\u52a8\u5316\u7528\u4f8b\u5b9a\u4f4d\u65b9\u6cd580%\u9700\u8981\u4fee\u6539\u3002 \u5f00\u53d1\u65b0\u529f\u80fd\u7684\u65f6\u5019\u5076\u5c14\u4e5f\u4f1a\u5bf9\u5c5e\u6027\u505a\u8c03\u6574\uff0c\u9047\u52305\u6b21\u3002 \uff082\uff09\u76ee\u524d\u4e3b\u8981\u4f7f\u7528Dogtail\u8bc6\u522b\u5e94\u7528Acessibility\u5c5e\u6027\u8fdb\u884c\u5b9a\u4f4d\uff0c\u662f\u83b7\u53d6\u5e94\u7528\u5f53\u524d\u754c\u9762\u7684\u5c5e\u6027tree\uff0c\u5728\u5e94\u7528\u8df3\u8f6c\u540e\uff0cDogtail\u5b58\u5728\u65e0\u6cd5\u53ca\u65f6\u83b7\u53d6\u5f53\u524d\u5c5e\u6027\u5217\u8868\u7684\u60c5\u51b5\u3002 \u591a\u5a92\u4f53\u8c03\u7528\u6587\u7ba1\u7a97\u53e3\u7684\u65f6\u5019\uff0c\u51fa\u73b0\u627e\u4e0d\u5230\u6587\u7ba1\u91cc\u9762\u5143\u7d20\u7684\u60c5\u51b5\uff0c\u76ee\u524d\u51fa\u73b010+\u6b21\u3002 \u5e94\u7528\u8bbe\u7f6e\u9875\u9762\u7684\u5c5e\u6027\u5076\u5c14\u5b58\u5728\u627e\u4e0d\u5230\u7684\u60c5\u51b5\uff0c\u9047\u52305\u6b21\u3002 \uff083\uff09Dogtail\u5de5\u5177\u672c\u8eab\u5b58\u5728\u95ee\u9898\uff0c\u6709\u65f6\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u5019\u5f88\u6162\uff0c\u8ba9\u4eba\u65e0\u6cd5\u63a5\u53d7\uff0c\u76ee\u524d\u51fa\u73b0\u8fc7\u5f88\u591a\u6b21\u3002 \u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u95f4\u6bd4\u5e73\u5e38\u61623\u500d\uff0c\u51fa\u73b04\u6b21\u3002 2\u3001\u89e3\u51b3\u4e86\u4f7f\u7528\u7edd\u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898 \u90e8\u5206\u63a7\u4ef6\u65e0\u6cd5\u6dfb\u52a0 Acessibility \u5c5e\u6027\u4ece\u800c\u4f7f\u7528\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u51fa\u73b0\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898\u3002 \uff081\uff09\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u65b9\u6cd5\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u76ee\u6807\u56fe\u7247\u8d44\u6e90\uff0c\u5728 UI \u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u4f1a\u6d89\u53ca\u5230\u76ee\u6807\u8d44\u6e90\u7684\u66ff\u6362\uff0c\u6bd4\u8f83\u8017\u8d39\u4eba\u529b\u3002 \uff082\uff09\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6cd5\u5bf9\u6bd4\u7cbe\u5ea6\u6bd4\u8f83\u641e\uff0c\u5982\u679cUI \u7684\u53d8\u66f4\u4f1a\u9020\u6210\u65e0\u6cd5\u51c6\u786e\u5b9a\u4f4d\u5230\uff0c\u81ea\u52a8\u5316\u811a\u672c\u5065\u58ee\u6027\u4e0d\u8db3\u3002 3\u3001\u4f7f\u7528\u673a\u5668\u5206\u79bb\uff0c\u89e3\u51b3\u4e86\u81ea\u52a8\u5316\u811a\u672c\u5bf9\u5e94\u7528\u7684\u5f71\u54cd\uff0c\u771f\u5b9e\u8fd8\u539f\u7528\u6237\u7684\u4f7f\u7528\u573a\u666f \u673a\u5668\u5206\u79bb\u7684\u67b6\u6784\u8bbe\u8ba1\uff0c\u4fdd\u8bc1\u4e86\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u73af\u5883\u5b8c\u5168\u7b49\u540c\u4e8e\u7528\u6237\uff0c\u6392\u9664\u6d4b\u8bd5\u811a\u672c\u7684\u5f71\u54cd\u3002 \uff081\uff09\u76ee\u524d\u7684\u529f\u80fd\u81ea\u52a8\u5316\u662f\u5728\u6d4b\u8bd5\u673a\u4e0a\u76f4\u63a5\u8fd0\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\uff0c\u52a0\u4e0a\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u6211\u4eec\u6dfb\u52a0\u4e86\u4e00\u4e9b\u8fdb\u7a0b\u76d1\u63a7\u3001\u89c6\u9891\u5f55\u5236\u7b49\u529f\u80fd\uff0c\u81ea\u52a8\u5316\u811a\u672c\u672c\u8eab\u4f1a\u6d88\u8017\u4e00\u4e9b\u7cfb\u7edf\u8d44\u6e90\uff0c\u65e0\u6cd5\u8fd8\u539f\u771f\u662f\u7684\u7528\u6237\u4f7f\u7528\u573a\u666f\u3002 \uff082\uff09\u6027\u80fd\u6d4b\u8bd5\u9700\u8981\u6392\u9664\u5176\u4ed6\u7a0b\u5e8f\u7684\u8d44\u6e90\u6d88\u8017\u5f71\u54cd\uff0c\u6027\u80fd\u81ea\u52a8\u5316\u91c7\u7528\u673a\u5668\u5206\u79bb\uff0c\u4fdd\u8bc1\u4e86\u6027\u80fd\u6570\u636e\u7684\u51c6\u786e\u6027\u3002 \u4ee5\u524d\u7684\u7528\u4f8b\u6267\u884c\u8017\u65f6\u6ca1\u6761\u572830\u79d2\u5de6\u53f3\uff0c\u73b0\u5728\u7528\u4f8b\u8017\u65f6\u572810\u79d2\u3002 4\u3001\u89e3\u51b3\u4e86UI \u8c03\u6574\u5bfc\u81f4\u5b9a\u4f4d\u5931\u8d25\u7684\u4e0d\u7a33\u5b9a\u6027\u95ee\u9898 \uff081\uff09\u89e3\u51b3\u4e86\u56e0 UI \u8c03\u6574\u5bfc\u81f4\u63a7\u4ef6\u4f4d\u7f6e\u53d8\u5316\u6216\u8272\u5dee\u53d8\u5316\u540e\u5b9a\u4f4d\u4e0d\u51c6\u786e\u7684\u95ee\u9898\uff0c\u53ea\u8981\u63a7\u4ef6\u6587\u6848\u548c\u63a7\u4ef6\u5916\u8fb9\u6846\u65e0\u53d8\u5316\u5747\u53ef\u51c6\u786e\u5b9a\u4f4d\uff1b \uff082\uff09\u76ee\u524d\u4e5f\u4f1a\u91c7\u7528\u57fa\u4e8eUI\u7684\u5b9a\u4f4d\u65b9\u6848\uff0c\u5982\u679cUI\u4f4d\u7f6e\u6709\u8c03\u6574\uff0c\u4f1a\u5bfc\u81f4\u5143\u7d20\u65e0\u6cd5\u5b9a\u4f4d\u3002 5\u3001\u7b80\u5316\u4e86\u7528\u4f8b\u7ed3\u6784\uff0c\u63d0\u5347\u7f16\u5199\u53cb\u597d\u5ea6 \uff081\uff09\u667a\u80fd\u81ea\u52a8\u5316\u8bc6\u522b\u5143\u7d20\u7684\u65b9\u6cd5\u53ea\u6709\u4e00\u4e2a\uff0c\u5c31\u662f\u57fa\u4e8e\u6211\u4eec\u8bad\u7ec3\u7684\u6a21\u578b\u8bc6\u522b\u89c6\u9891\u6d41\u4e2d\u7684\u5143\u7d20\uff0c\u7ecf\u8fc7\u811a\u672c\u5c01\u88c5\u4e4b\u540e\uff0c\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u4e2d\u6240\u6709\u5b9a\u4f4d\u7684\u64cd\u4f5c\u90fd\u53ea\u9700\u8981\u8c03\u7528\u8fd9\u4e00\u4e2a\u65b9\u6cd5\u5c31\u884c\u4e86\uff0c\u7f16\u5199\u81ea\u52a8\u5316\u811a\u672c\u7684\u96be\u5ea6\u5927\u5927\u964d\u4f4e\u3002 \uff082\uff09\u4e5f\u662f\u7531\u4e8e\u8c03\u7528\u65b9\u6cd5\u7b80\u5355\uff0c\u5728 UI \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u4e2d\u7684\u5206\u5c42\u7ed3\u6784\u5c06\u4f1a\u51cf\u5c11\uff0c\u591a\u7ee7\u627f\u7684\u60c5\u51b5\u4f1a\u51cf\u5c11\uff0c\u81ea\u52a8\u5316\u4ee3\u7801\u7684\u8c03\u7528\u7ed3\u6784\u4e5f\u4f1a\u53d8\u5f97\u7b80\u5355\uff0c\u800c\u4e14\u529f\u80fd\u6d4b\u8bd5\u540c\u5b66\u7f16\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u66f4\u52a0\u5bb9\u6613\u4e0a\u624b\u3002 \u4ee5\u524d\u5199\u7528\u4f8b\u7531\u4e8e\u9700\u8981\u7ed3\u5408\u4e0d\u540c\u7684\u6a21\u5757\uff0c\u8c03\u7528\u4e0d\u540c\u7684\u65b9\u6cd5\uff0c\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u5e76\u5b8c\u6210\u8c03\u8bd5\u7684\u65f6\u95f4\u5e73\u5747\u572820-30\u5206\u949f\uff0c\u73b0\u5728\u5199\u7528\u4f8b\u811a\u672c\u80fd\u57285\u5206\u949f\u5de6\u53f3\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":"# =============================================\n# Attribution : Application Test Department III\n# Time : 2023/1/3\n# Author : ut003281\n# =============================================\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u7b80\u8ff0","text":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5 \u901a\u8fc7\u81ea\u52a8\u5316\u624b\u6bb5\u5bf9\u5e94\u7528\u8fdb\u884c\u6027\u80fd\u6d4b\u8bd5\uff0c\u63d0\u4f9b\u65b9\u4fbf\u7684\u73af\u5883\u90e8\u7f72\u3001\u8fd0\u884c\u914d\u7f6e\u3001\u7528\u4f8b\u7f16\u5199\u7b49\uff0c\u7528\u4e8e\u684c\u9762\u5e94\u7528\u7684\u51b7\u70ed\u542f\u52a8\u3001\u8d44\u6e90\u62f7\u8d1d\u3001\u9875\u9762\u8df3\u8f6c\u7b49\u6027\u80fd\u573a\u666f\u6d4b\u8bd5\u3002 \u4ed3\u5e93\u5730\u5740\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-perf-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u4ee3\u7801\u7ed3\u6784","text":"autotest-perf-aitest\n\u251c\u2500\u2500 apps # \u5b58\u653e\u6240\u6709\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u811a\u672c\n\u251c\u2500\u2500 conftest.py # pytest hook\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 CURRENT # \u7248\u672c\u5185\u5bb9\n\u251c\u2500\u2500 docs # \u6587\u6863\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u952e\u503c\u5bf9\u7167\u8868.pdf # \u4e32\u53e3\u7ebfcode\u4e0e\u6309\u952e\u7684\u5bf9\u7167\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u6027\u80fd\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\u6267\u884c\u5668\u4f7f\u7528\u6307\u5357.md # \u6267\u884c\u5668\u811a\u672c\u4f7f\u7528\u6307\u5357\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 USB\u4e32\u53e3\u8f6cUSB\u952e\u76d8\u9f20\u6807\u7ebf\u534f\u8bae\u6587\u4ef6V1.0.pdf # \u4e32\u53e3\u534f\u8bae\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput-0.28.2.zip # Linux\u4e0b\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\u7684\u6e90\u7801\uff0c\u53ef\u6839\u636e\u67b6\u6784\u6253\u5305\n\u251c\u2500\u2500 manage.py # \u529f\u80fd\u4e3b\u5165\u53e3\n\u251c\u2500\u2500 pytest.ini # pytst \u914d\u7f6e\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 setting # \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 client.ini # \u6d4b\u8bd5\u673a IP \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5168\u5c40\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dev_env.sh # \u5bbf\u4e3b\u673a\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose_no_relay.yml # \u65e0\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose.yml # \u6709\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker_login.sh # docker \u767b\u9646\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 res\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 black.png # \u5168\u9ed1\u56fe\u7247\uff0c\u7528\u4e8e\u4fee\u6539\u58c1\u7eb8\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_5000.deb # 3A5000 \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_amd64.deb # amd \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_arm64.deb # arm \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_mips64.deb # mips \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_sw_64.deb # sw \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 server.ini # \u670d\u52a1\u5668\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 setup.sh # \u5bb9\u5668\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 template # \u521b\u5efa app \u57fa\u7840\u811a\u672c\u6a21\u677f\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 app_template\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ${app_name}_widget.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 control-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 images\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 test_${app_name}_01_scene.json-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 test_${app_name}_01_scene.py-tpl\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 uos_docker # \u5bb9\u5668\u73af\u5883\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dockerfile\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 requirements.txt\n\u2514\u2500\u2500 src\n \u251c\u2500\u2500 analysis_save.py # \u89e3\u6790\u56fe\u7247\u6d41\u7ed3\u679c\uff0c\u6c47\u603b\u751f\u6210 excel \u62a5\u544a\n\u251c\u2500\u2500 base_widget.py # \u5c01\u88c5\u7684\u57fa\u7840\u64cd\u4f5c\uff0c\u5e94\u7528\u8c03\u7528\u7684\u4e3b\u5165\u53e3\u65b9\u6cd5\n\u251c\u2500\u2500 cmdctl.py # \u8c03\u7528\u547d\u4ee4\u884c\u4f7f\u7528\n\u251c\u2500\u2500 global_value.py # \u5168\u5c40\u53d8\u91cf\n\u251c\u2500\u2500 image_utils.py # \u56fe\u7247\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 __init__.py\n \u251c\u2500\u2500 logger_utils.py # \u65e5\u5fd7\u914d\u7f6e\n\u251c\u2500\u2500 pdocr.py # ocr \u914d\u7f6e\n\u251c\u2500\u2500 public_method.py # \u4e00\u4e9b\u65b9\u4fbf\u7684\u5c01\u4f4f\n\u251c\u2500\u2500 record.py # \u5f55\u5c4f\u76f8\u5173\n\u251c\u2500\u2500 rtk # \u8fd0\u884c\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 _base.py # \u4e00\u4e9b\u679a\u4e3e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 install_env.py # \u5b89\u88c5\u73af\u5883\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 local_runner.py # \u8fd0\u884c\u7528\u4f8b\n\u251c\u2500\u2500 serial_communication # \u4e32\u53e3\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 power_control.py # \u7ee7\u7535\u5668\u64cd\u4f5c\uff0c\u4f7f\u7528\u7ee7\u7535\u5668\u8fde\u63a5\u4e3b\u673a\u7535\u6e90\uff0c\u63a7\u5236\u5f00\u5173\u673a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 serial_common.py # \u4e32\u53e3\u516c\u5171\u65b9\u6cd5\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 usb_mk.py # \u952e\u9f20\u64cd\u4f5c\u57fa\u7840\u5c01\u88c5\n\u251c\u2500\u2500 shortcut_key.py # \u5feb\u6377\u952e\u7684\u5c01\u88c5\n\u251c\u2500\u2500 singleton.py # \u5355\u4f8b\u6a21\u5f0f\n\u251c\u2500\u2500 start_app.py # \u521b\u5efa app\n\u2514\u2500\u2500 write_xlsx.py # \u751f\u6210 excel\n# __init__.py \u6587\u4ef6\u4e3a\u6807\u8bc6\u8be5\u76ee\u5f55\u662f\u4e00\u4e2aPython\u7684\u6a21\u5757\u5305\uff0c\u9879\u76ee\u4e2d\u7684__init__.py\u5747\u4e3a\u7a7a\u6587\u4ef6\u3002\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u73af\u5883\u642d\u5efa","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\u3002 \u670d\u52a1\u7aef\u4e00\u53f0\u3002\uff08\u4ec5\u652f\u6301 AMD \u67b6\u6784\uff0c\u82e5\u9700\u5176\u4ed6\u67b6\u6784\uff0c\u54a8\u8be2\u76f8\u5173\u5f00\u53d1\u4eba\u5458\uff09 \u91c7\u96c6\u76d2\u4e00\u4e2a\u3002 \uff08ACASIS HDMI \u89c6\u9891\u91c7\u96c6\u76d2\uff0chttps://item.jd.com/100013302599.html#crumb-wrap \uff09 USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\u3002\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"\uff082\uff09\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\u3002 USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff08USB3.0 \u63a5\u53e3\u4e0a\uff09\u3002 \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5 USB \u5ef6\u957f\u7ebf\u3002 \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u670d\u52a1\u7aef\u63a8\u8350\u914d\u7f6e","text":"\u914d\u7f6e\u8d8a\u9ad8\uff0c\u89e3\u6790\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"2\u3001\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa","text":" \u6253\u5f00\u63a7\u5236\u4e2d\u5fc3\uff0c\u8d26\u6237\u8bbe\u7f6e\u4e3a\u3010\u81ea\u52a8\u767b\u5f55\u3011\u548c\u3010\u65e0\u5bc6\u7801\u767b\u5f55\u3011\uff0c\u7535\u6e90\u7ba1\u7406\u4e2d\u4f7f\u7528\u7535\u6e90\u5168\u90e8\u8bbe\u7f6e\u4e3a\u3010\u4ece\u4e0d\u3011\uff0c\u5f00\u542f\u5f00\u53d1\u8005\u6a21\u5f0f\u3002 \u6839\u636e\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u8981\u6c42\uff0c\u5bfc\u5165\u76f8\u5173\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\uff1a\u5bfc\u5165\u76f8\u518c\u3001\u5f71\u9662\u3001\u97f3\u4e50\u7684\u6d4b\u8bd5\u8d44\u6e90\u3002 \u5728\u670d\u52a1\u7aef\u6253\u5f00\u76f8\u673a\u5e94\u7528\u540e\uff0c\u5c06\u6d4b\u8bd5\u673a\u684c\u9762\u58c1\u7eb8\u66f4\u6362\u4e3a\u7eaf\u8272\u58c1\u7eb8\uff08\u6ce8\u610f\uff0c\u670d\u52a1\u7aef\u9700\u63d0\u524d\u5f00\u542f\u76f8\u673a\u540e\u518d\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u58c1\u7eb8\uff0c\u5efa\u8bae\u7eaf\u9ed1\u58c1\u7eb8 setting/res/black.png\uff09 \u5728\u6587\u4ef6\u7ba1\u7406\u5668\u4e2d\uff0c\u5c06\u9009\u9879 \u4e3b\u83dc\u5355-\u8bbe\u7f6e-\u9884\u89c8-\u56fe\u7247\u9884\u89c8 \u53d6\u6d88\u52fe\u9009\uff08\u5982\u4e0d\u53d6\u6d88\uff0c\u4f1a\u5f71\u54cd\u622a\u56fe\u5f55\u5c4f\u5e94\u7528\u7684\u6027\u80fd\u6570\u636e\uff09 \u79fb\u52a8\u6216\u5220\u9664\u7cfb\u7edf Logo \uff0c\u6392\u9664\u684c\u9762\u53f3\u4e0b\u89d2 Logo \u7684\u5f71\u54cd\uff08\u91cd\u542f\u751f\u6548\uff09\u3002 sudo mv /usr/share/deepin/uos_logo.svg ~/Pictures/\n \u5b89\u88c5\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\uff08\u5fc5\u987b\u5b89\u88c5\uff01\uff01\uff09 AMD \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_amd64.deb ARM \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_arm64.deb MIPS \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_mips64.deb 3A5000 \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_5000.deb \u5b89\u88c5\u547d\u4ee4 sudo dkpg -i xserver-xorg-input-libinput_0.28.2-2_amd64.deb\n \u5b89\u88c5\u65f6\u4f1a\u63d0\u793a\u5df2\u5b58\u5728\u76f8\u540c\u7248\u672c\uff0c\u8bf7\u5ffd\u7565\uff0c\u76f4\u63a5\u8986\u76d6\u5b89\u88c5\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u4e3b\u673a\u624d\u751f\u6548"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u670d\u52a1\u7aef\u4e00\u952e\u73af\u5883\u90e8\u7f72","text":"\u73af\u5883\u642d\u5efa\u524d\u5fc5\u987b\u5148\u8fde\u63a5\u4e0a USB \u4e32\u53e3\u7ebf\u548c\u91c7\u96c6\u76d2\u3002 \u5bbf\u4e3b\u673a\u73af\u5883\u5b89\u88c5 python3 manage.py install --env host\n \u5bb9\u5668\u73af\u5883\u5b89\u88c5 python3 manage.py install --env docker\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u56db\u3001\u914d\u7f6e\u9879","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u670d\u52a1\u7aef\u914d\u7f6e","text":"setting/config/server.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u914d\u7f6e\u9879\uff0c\u5305\u542b\u4e86\u6240\u6709\u670d\u52a1\u7aef\u6240\u6709\u7684\u53ef\u914d\u7f6e\u9879\u3002 \u672c\u5730\u65e0\u7f51\u7edc\u8fd0\u884c \u5c06\u914d\u7f6e\u9879 network=0 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u672c\u5730\u6709\u7f51\u7edc\u8fd0\u884c \u914d\u7f6e\u9879 network=1 (1)\u914d\u7f6e\u9879 client_alias= \u914d\u7f6e\u4e3a\u4f60\u8981\u6d4b\u8bd5\u7684\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5982 Alias1 \u6d4b\u8bd5\u673a\u522b\u540d\u5728 setting/config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 (2)\u914d\u7f6e\u9879 client_alias= \u4e3a\u7a7a\uff0c\u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager --client_alias Alias1\uff0c\u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002(Alias1 \u4e3a\u4f60\u914d\u7f6e\u7684\u6d4b\u8bd5\u673a\u522b\u540d) (1)\u548c(2)\u53ea\u8981\u4f7f\u7528\u5176\u4e00\u5373\u53ef\u3002 \u6709\u7f51\u7edc\u8fd0\u884c\uff0c\u4e14\u9700\u8981\u901a\u8fc7 Jenkins \u4e0a\u8fd0\u884c\u4e00\u4e2a job \uff0c\u540c\u65f6\u63a7\u5236\u591a\u53f0\u673a\u5668\u3002 \u914d\u7f6e\u9879 network=1 \u914d\u7f6e\u9879 client_alias= \u4e0d\u7528\u914d\u7f6e\uff0c\u5728\u8fd0\u884c run.sh \u7684\u65f6\u5019\u76f4\u63a5\u7a7a\u683c\u52a0\u522b\u540d\u5373\u53ef\uff0c\u6bd4\u5982\uff1a\u6d4b\u8bd5\u673a\u522b\u540d\u4e3a Alias1 \uff0c\u4e14\u5df2\u7ecf\u5728 config/client.ini \u4e2d\u914d\u7f6e\u4e86 Alias1 \u7684user ip password \uff0c\u5219\u8fd0\u884c bash run.sh Alias1 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u5728 Jenkins pipeline \u91cc\u9762\u901a\u8fc7\u5e76\u884c stage \u6216\u5e76\u884c\u8c03\u7528\u4e0b\u5c42\u4efb\u52a1\u7684\u65b9\u5f0f\u53ef\u4ee5\u5b9e\u73b0\u5927\u89c4\u6a21\u7684\u6027\u80fd\u6d4b\u8bd5\u9700\u6c42\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;1\u3001KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2\u3001KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f, e.g. TAGS = L1 or smoke\n[case_conf]\n# \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\uff0cocr\u6587\u6848\u8bc6\u522b\u8f83\u6162\uff0c\u4e0d\u63a8\u8350\u4f7f\u7528\nfind_by = stage\n# \u6700\u540e\u4e00\u4e2a\u7a33\u5b9a\u9636\u6bb5\u7684\u5e27\u6570\u8bc6\u522b\n# \u9996\u5e27\u5b58\u5728\u540e\u7684\u7b2c\u4e00\u4e2a\u5927\u4e8e\u8be5\u914d\u7f6e\u5e27\u6570\u7684\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u5c3e\u5e27\nfinal_stable_num=100\n# \u4ece\u8be5\u5e27\u6570\u5f00\u59cb\u8bc6\u522b\u6587\u6848\u6216\u56fe\u7247\uff0c\u51cf\u5c11\u5206\u6790\u65f6\u95f4\nstart_num = 150\n# \u8bc6\u522b\u7684\u6587\u6848\ntext=\n# \u8bc6\u522b\u56fe\u7247\nmatch=apps/xxx/images/match.png\n# \u8bc6\u522b\u76f8\u4f3c\u5ea6\nmatch_rate=0.9\n# \u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6bd4\u5982\u70ed\u542f\u52a8\u7528\u4f8b\uff0c\u4ece\u70b9\u51fb\u6253\u5f00\u5230\u505c\u6b62\u5f55\u5c4f\uff0c\u4e2d\u95f4\u7b49\u5f855\u79d2\uff1b\nduration = 15\n# \u5355\u6761\u7528\u4f8b\u6267\u884c\u7684\u6b21\u6570\ncount = 5\n# \u7a33\u5b9a\u9636\u6bb5\u5212\u5206\u7684\u76f8\u4f3c\u5ea6\nstable_similarity = 0.9997\n[server]\n# \u8c03\u8bd5\u6a21\u5f0f=1\uff0c\u4e3a\u5f00\u542f\u8c03\u8bd5\u6a21\u5f0f\uff0c0\u4e3a\u5173\u95ed\u3002\n# \u8c03\u8bd5\u6a21\u5f0f\u4e0b\u9ed8\u8ba4\u53ea\u6267\u884c\u4e00\u6b21\u7528\u4f8b\uff0c\u4e0d\u5173\u673a\n# \u7f16\u5199\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u5efa\u8bae\u5f00\u542fmaintain\u3002\nMAINTAIN = 0\n# \u8fd0\u884c\u7684\u73af\u5883docker\u5bb9\u5668\u73af\u5883\uff0chost\u5bbf\u4e3b\u673a\u73af\u5883\nENV = docker\n# \u670d\u52a1\u7aef\u5bc6\u7801\nPASSWORD=1\n# \u6307\u5b9a\u6d4b\u8bd5\u673a\u522b\u540d\n# \u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6bd4\u5982\uff1a\n# [AMD]\n# ip=10.8.15.86\n# user=uos\n# \u5176\u4e2d AMD \u4e3a\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5219client_alias=AMD\nCLIENT_ALIAS = x86\uff08Intel-i7\uff09\n# 1 \u5f00\u542f\u7f51\u7edc, 0 \u5173\u95ed\u7f51\u7edc\n# \uff081\uff09\u670d\u52a1\u7aef\u4e0e\u6d4b\u8bd5\u673a\u987b\u5728\u540c\u4e00\u7f51\u6bb5\u4e0b\uff0c\u4f60\u53ef\u4ee5\u5c1d\u8bd5\u5728\u670d\u52a1\u7aef\u901a\u8fc7ssh\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c\u5982\u679c\u53ef\u4ee5\u8fde\u63a5\uff0c\u8bf4\u660e\u7f51\u7edc\u6b63\u5e38\u3002\n# \uff082\uff09\u5f53input_type=FILE_NAME \u65f6\uff0c\u5fc5\u987b\u5f00\u542f\u7f51\u7edc\u3002\nNETWORK = 1\n# \u6027\u80fd\u7ed3\u679c\u7edf\u8ba1\u5355\u4f4d \u6beb\u79d2\u2014ms, \u79d2\u2014s\nUNIT=ms\n# \u6d4b\u8bd5\u673a\u5f00\u673a\u8fdb\u5165\u684c\u9762\u540e\u7b49\u5f85\u65f6\u95f4,\u5355\u4f4d/\u79d2\nSTARTUP_DELAY = 60\n# 1\u4e3a\u5220\u9664\u7f13\u5b58\uff0c0\u4e3a\u4e0d\u5220\u9664\u7f13\u5b58\n# \u7528\u4f8b\u6267\u884c\u5b8c\u540e\u4f1a\u5728report\u76ee\u5f55\u4e0b\u751f\u6210\u667a\u80fd\u89e3\u6790\u7684\u4e00\u4e9b\u7f13\u5b58\u56fe\u7247\u3002\nCACHE = 0\n# \u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u62a5\u544a\u4f1a\u4fdd\u5b58\u5728\u9879\u76ee\u4e0breport\u76ee\u5f55\u4e2d\uff1b\n# \u6307\u5b9a\u62a5\u544a\u76ee\u5f55\u5219\u5b58\u653e\u5230\u6307\u5b9a\u76ee\u5f55\u3002\nREPORT_PATH = report\n# \u670d\u52a1\u7aef\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684icon\u8d44\u6e90\u4f1a\u7f13\u5b58\u5728\u9879\u76ee\u4e0binput\u76ee\u5f55\u4e2d\nINPUT = input/\n# 1\u4e3a\u6d4b\u8bd5\u5b8c\u5173\u673a\uff0c0\u4e3a\u6d4b\u8bd5\u5b8c\u4e0d\u5173\u673a\nSHUTDOWN = 0\n# \u89e3\u6790\u8fdb\u7a0b\u6570\uff08\u4e0d\u63a8\u8350\u4fee\u6539\uff09\n# 3\u4e2a\u8fdb\u7a0b\u89e3\u6790\u89c6\u9891\u5df2\u7ecf\u80fd\u591f\u6ee1\u8db3\uff0c\u5373\u4f7f\u589e\u52a0\u8fdb\u7a0b\u6570\u4e5f\u4e0d\u80fd\u51cf\u5c11\u6574\u4f53\u8017\u65f6\n# \u53e6\u5916\u8fd8\u8981\u770bCPU\u6838\u6570\u662f\u5426\u652f\u6301\u3002\nPARSING_PROCESS = 3\n# 1\u4e3a\u4f7f\u7528\u7ee7\u7535\u5668\u5f00\u5173\u673a\uff0c0\u4e3a\u4f7f\u7528reboot\u547d\u4ee4\u91cd\u542f\u3002\u4f9d\u8d56\u7ee7\u7535\u5668\u786c\u4ef6\u8bbe\u5907\uff0c\u9700\u8981\u4f7f\u7528\u8054\u7cfb\u5f00\u53d1\u8005\nRELAY = 0\n# \u83b7\u53d6\u6d4b\u8bd5\u5e94\u7528\u7684\u7248\u672c, %s \u5360\u4f4d\u5e94\u7528\u540d\n# \u5982\u679c\u8be5\u914d\u7f6e\u4e3a\u7a7a\uff0c\u5219\u4e0d\u83b7\u53d6\u5e94\u7528\u7684\u7248\u672c\u4fe1\u606f\u3002\nCOMMAND = apt policy %s 2>/dev/null|grep \"\u5df2\u5b89\u88c5\"|awk -F \"\uff1a\" \"{print \\$2}\"\n# \u5173\u673a\u7b49\u5f85\u5f00\u542f\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6839\u636e\u6d4b\u8bd5\u673a\u6027\u80fd\u4e0d\u540c\uff0c\u5f00\u5173\u673a\u8017\u65f6\u53ef\u80fd\u4e0d\u540c\uff0c\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u673a\u60c5\u51b5\u914d\u7f6e\u3002\nSHUTDOWN_DELAY = 30\n# \u53ef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u56fe\u7247\u683c\u5f0f\uff0c\u4ee5\u82f1\u6587\u9017\u53f7\u9694\u5f00\u3002\n# \u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u76ee\u524d\u6211\u4eec\u4ec5\u9a8c\u8bc1\u4e86jpg,jpeg,png\u8fd9\u4e09\u79cd\u5e38\u7528\u7684\u56fe\u7247\u683c\u5f0f\u3002\nINPUT_TYPES = jpg,jpeg,png\n# \u6027\u80fd\u5206\u6790\u8865\u5e27\uff0c\u7b49\u4e8e\u6216\u4f4e\u4e8e\u8be5\u503c\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u9700\u8981\u51cf\u6389\u3002\nUN_STAB_START = 3\n# \u670d\u52a1\u7aef\u83b7\u53d6\u6d4b\u8bd5\u673a\u56fe\u50cf\u7684\u5e27\u7387\uff0c\u5373\u6bcf\u79d2\u83b7\u53d6\u591a\u5c11\u5f20\u6d4b\u8bd5\u673a\u4e0a\u7684\u56fe\u50cf\u3002\n# \u9ed8\u8ba4\u5e27\u7387\u4e3a30\u5e27/\u79d2\uff0c\u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u53ef\u80fd\u4f1a\u5bf9\u89e3\u6790\u7ed3\u679c\u9020\u6210\u504f\u5dee\u3002\nFPS = 30\n# \u4ee5\u4e0b\u573a\u666f\u7c7b\u578b\u4f1a\u91cd\u542f\u6d4b\u8bd5\u673a,\u591a\u79cd\u573a\u666f\u4f7f\u7528\u9017\u53f7\u9694\u5f00\nSCENE = cold\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = http://10.8.13.78:8890\n#\u5c4f\u5e55\u56fe\u7247\u4e34\u65f6\u5b58\u653e\u4f4d\u7f6e\nSCREEN_CACHE = /tmp/screen\n# =======================================\n[log]\n# \u65e5\u5fd7\u7ea7\u522b\uff0cOFF\u3001FATAL\u3001ERROR\u3001WARN\u3001INFO\u3001DEBUG\u3001ALL\n# \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u65e5\u5fd7\u8f93\u51fa\uff0clog_cli=INFO\u8868\u793a \u4ec5\u8f93\u51faINFO\u53ca\u4ee5\u4e0a\u7ea7\u522b\u7684\u65e5\u5fd7\u3002\nLOG_LEVEL = DEBUG\n# \u65e5\u5fd7\u6587\u4ef6\u4fdd\u5b58\u8def\u5f84\nLOG_PATH= logs\n# =======================================\n[dockerhub]\n# \u5bb9\u5668\u767b\u9646\u8d26\u53f7\nDOCKER_USER = user\n# \u5bb9\u5668\u767b\u9646\u5bc6\u7801\nDOCKER_PASSWORD = User1234\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u6d4b\u8bd5\u673a\u914d\u7f6e","text":"setting/config/client.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u4fe1\u606f\u3002 \u6709\u7f51\u7edc\u7684\u60c5\u51b5\u4e0b\uff0c\u670d\u52a1\u7aef\u9700\u8981\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u56e0\u6b64\u4f60\u9700\u8981\u5199\u5165 \u6d4b\u8bd5\u673a\u522b\u540d \u3001 user \u3001ip\u3001 password \u3002 # \u6d4b\u8bd5\u673a\u522b\u540d\n[Alias1] # \u6d4b\u8bd5\u673aip\nip=10.8.15.86 # \u6d4b\u8bd5\u673a\u7528\u6237\u540d\nuser=uos\n \u547d\u540d\u5efa\u8bae\uff1aAliasA1\u3001AliasA2\u3001AliasB1\u3001AliasB2\uff0c\u4e0d\u8981\u91cd\u540d\u3002 \u65e0\u7f51\u7edc\u60c5\u51b5\u4e0b\uff0c\u4ec5\u9700\u8981\u5173\u6ce8\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\u9879 width=\u3001 height= \u5373\u53ef\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a [client]\n# \u9ed8\u8ba4\u6d4b\u8bd5\u673a\u7528\u6237\u540d\uff0c\u5bc6\u7801\uff0cip\nip=\nuser=\n# \u6d4b\u8bd5\u673a\u5bc6\u7801\npassword=1\n# \u6d4b\u8bd5\u673a\u4e3b\u9898\ntheme=bloom\n# \u6d4b\u8bd5\u673aicon\u76ee\u5f55\npath=/usr/share/icons\n# \u7cfb\u7edfdesktop\u6587\u4ef6\u7684\u5b58\u653e\u76ee\u5f55\uff0cUOS\u7cfb\u7edf\u9ed8\u8ba4\u4e3a/usr/share/applications\ndesktop_path=/usr/share/applications\n# \u7528\u4e8e\u5224\u65ad\u6d4b\u8bd5\u673a\u662f\u5426\u5f00\u673a\u8fdb\u5165\u684c\u9762\u7684\u8bc6\u522b\u6807\u8bc6\u3002\n# 1\u3001\u901a\u8fc7\u684c\u9762\u56fe\u6807\u8bc6\u522b\u3002\n# - type=FILE_NAME\u65f6\uff0c\u670d\u52a1\u5668\u548c\u6d4b\u8bd5\u673a\u5fc5\u987b\u5728\u540c\u4e00\u5c40\u57df\u7f51\u5185\u3002\n# - power_on=dde-computer\u8868\u793a\u901a\u8fc7\u684c\u9762\u8ba1\u7b97\u673a\u56fe\u6807\u5224\u65ad\u5f00\u673a\u8fdb\u5165\u684c\u9762\u3002\n# 2\u3001\u901a\u8fc7\u672c\u5730\u56fe\u7247\u4f5c\u4e3a\u5f00\u673a\u8bc6\u522b\u3002\n# - type= \u4f20\u5165\u4e3a\u56fe\u7247\u683c\u5f0f\uff0ctype\u652f\u6301\u7684\u7c7b\u578b\u5305\u542b\u5728server.ini\u5185\u914d\u7f6e\u9879input_type=jpg,jpeg,png\u3002\n# - power_on= \u4f20\u5165\u7684\u662f\u672c\u5730\u56fe\u7247\u7684\u8def\u5f84\u3002\ntype=FILE_NAME\npower_on=dde-computer\n# \u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\uff08\u6d4b\u8bd5\u673a\u8fde\u63a5\u91c7\u96c6\u76d2\uff0c\u91c7\u96c6\u76d2\u7684\u5206\u8fa8\u7387\uff09\nheight=1080\nwidth=1920\n[AliasA1] ip=10.8.15.86\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n[AliasA2]\nip=10.8.15.20\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_2","title":"3\u3001\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e","text":"\u968f\u7740\u6d4b\u8bd5\u573a\u666f\u7684\u4e0d\u65ad\u5f15\u5165\uff0c\u53d1\u73b0\u73b0\u6709\u670d\u52a1\u7aef\u91cc\u7684\u914d\u7f6e\u9879\u5e76\u4e0d\u9002\u7528\u4e8e\u6240\u6709\u7684\u6027\u80fd\u573a\u666f\uff0c\u4e8e\u662f\u5c06\u670d\u52a1\u7aef\u914d\u7f6e\u8fdb\u884c\u4e00\u4e2a\u63d0\u53d6\uff0c\u53ef\u505a\u5355\u4e2a\u573a\u666f\u7684\u4e2a\u6027\u5316\u914d\u7f6e\uff0c\u5f53\u7136\u539f\u6765\u7684\u670d\u52a1\u7aef\u914d\u7f6e\u529f\u80fd\u4fdd\u7559\uff0c\u53ea\u662f\u5f53\u4f60\u914d\u7f6e\u4e86\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e\u540e\uff0c\u4f18\u5148\u4f7f\u7528\u4e2a\u6027\u5316\u914d\u7f6e\u91cc\u9762\u7684\u5185\u5bb9\uff0c\u4ee5\u4e0b\u662f\u5bf9\u4e2a\u6027\u5316\u914d\u7f6e\u7684\u4ecb\u7ecd\u3002 \u76ee\u524d\u6bcf\u4e00\u4e2a py \u6587\u4ef6\u5bf9\u5e94\u4e00\u4e2a\u6027\u80fd\u6d4b\u8bd5\u573a\u666f\uff0c\u4e8e\u662f\u5728\u540c\u7ea7\u76ee\u5f55\u4e0b\u521b\u5efa\u4e00\u4e2a\u4e0e\u4e4b\u540c\u540d\u7684 json \u6587\u4ef6\uff0c\u4f5c\u4e3a\u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6 apps\n\u251c\u2500\u2500 album\n \u251c\u2500\u2500 test_album_01_start.json # \u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6\n\u2514\u2500\u2500 test_album_01_start.py # \u6027\u80fd\u573a\u666f\u6587\u4ef6\n \u4ee5\u4e0b\u662f\u5bf9 json \u6587\u4ef6\u4e2d\u914d\u7f6e\u7684\u89e3\u91ca\uff0c\u82e5\u67d0\u9879\u914d\u7f6e\u4e0d\u9700\u8981\uff0c\u53ef\u4ee5\u7f3a\u5931\uff0c\u4f46\u4e0d\u80fd\u4e3a\u7a7a\uff1b {\n\"title\": \"test_album_start\", # \u6807\u9898\uff1b\u5fc5\u987b\n\"app_name\": \"deepin-album\", # \u573a\u666f\u6240\u5c5e\u7684\u5e94\u7528\uff1b\u5fc5\u987b\n\"scene\": \"hot\", # \u573a\u666f\u522b\u540d\uff1b\u5fc5\u987b\n\"icon\": [\"deepin-album\"], # \u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684icon\u5230\u670d\u52a1\u7aef\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\uff1b\u53ef\u7f3a\u5931\n# \u6ce8\u610f\uff1a\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684desktop\u6587\u4ef6\u540d\u4e3adeepin-album.desktop\uff0c\n# \u53ea\u9700\u8981\u5199deepin-album\u5373\u53ef\uff0c\u201c.desktop\u201d\u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002\n\"size\": { # \u56fe\u7247\u5bf9\u6bd4\u7684\u533a\u57df\u8bbe\u7f6e\u9879\uff0c\u67d0\u4e9b\u5e94\u7528\u5f53\u524d\u5c4f\u5e55\u7684\u90e8\u5206\u533a\u57df\u9700\u8981\u5c06\u5176\u53bb\u6389\uff0c\u53ef\u4ee5\u8bbe\u7f6e\u6b64\u9879\uff0c\u5982\u679c\u6ca1\u6709\u5219\u53ef\u4e0d\u5199\uff1b\u53ef\u786e\u5b9e\n\"x-coordinate\": 0, # \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n\"y-coordinate\": 0, # \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n\"width\": 850, # \u6a2a\u5411\u957f\u5ea6\n\"height\": 1920 # \u7eb5\u5411\u9ad8\u5ea6\n},\n\"count\": 5, # \u573a\u666f\u6267\u884c\u7684\u6b21\u6570\uff1b\u5fc5\u987b\n\"duration\": 5, # \u8be5\u6761\u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff0c\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7279\u5b9a\u573a\u666f\uff0c\u8be5\u914d\u7f6e\u4e3a\u53ef\u9009\u9879\uff0c\u8986\u76d6 server.ini \u4e2d\u7684\u914d\u7f6e\uff1b\u53ef\u7f3a\u5931\n\"stable_similarity\": 0.9997, # \u6027\u80fd\u573a\u666f\u5206\u9636\u6bb5\u65f6\u7684\u56fe\u7247\u76f8\u4f3c\u5ea6\u5bf9\u6bd4\uff0c\u524d\u540e\u56fe\u7247\u4f4e\u4e8e\u8be5\u503c\uff0c\u5219\u5206\u4e3a\u4e0d\u7a33\u5b9a\u9636\u6bb5\uff1b\u53ef\u7f3a\u5931\n\"find_by\": \"stage\", # \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\n\"final_stable_num\": 100, # \u67e5\u627e\u6700\u540e\u4e00\u4e2a\u5927\u4e8e\u8be5\u503c\u7684\u7a33\u5b9a\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u7684\u5c3e\u796f\uff1b\u53ef\u7f3a\u5931\n\"start_num\": 150,\n\"text\": \"\", # ocr\u8bc6\u522b\u7684\u6587\u6848\n\"match\": \"apps/xxx/images/match.png\", # \u56fe\u50cf\u5339\u914d\u7684\u56fe\u7247\u6587\u4ef6\u8def\u5f84\n\"match_rate\": 0.9 # \u5339\u914d\u76f8\u4f3c\u5ea6\n}\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e94\u3001\u6d4b\u8bd5\u6d41\u7a0b","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516d\u3001\u7528\u4f8b\u7f16\u5199\u53ca\u65b9\u6cd5\u53c2\u6570\u6307\u5f15","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"1\u3001\u7528\u4f8b\u5b9e\u4f8b\u8bf4\u660e","text":"# \u6807\u51c6\u5e93\u5bfc\u5165\nfrom time import sleep\n# \u5bfc\u5165\u4e09\u65b9\u5e93pytest\nimport pytest\n# \u5bfc\u5165\u7528\u4f8b\u6267\u884c\u8981\u7528\u5230\u7684Widget\u7c7b\nfrom src.base_widget import BaseWidget\nclass TestStart:\n# class\u7ea7\u522b\u7684fixture\uff0c\u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u6267\u884c\u3002autouse=True \u81ea\u52a8\u5728\u5f53\u524d\u4f5c\u7528\u57df\u4e0b\u4f7f\u7528\u3002\n@pytest.fixture(scope=\"class\", autouse=True)\n# \u6d4b\u8bd5\u70ed\u542f\u52a8\u4e4b\u524d\u9700\u8981\u9884\u542f\u52a8\u3002\ndef application_pre_start(self):\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().right_click_element(\"deepin-album\")\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().click_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\")\nsleep(2)\n# \u5feb\u6377\u952e\u5173\u95ed\u7a97\u53e3\nBaseWidget().hot_key(\"alt\", \"f4\")\nsleep(2)\n# \u9ed8\u8ba4\u4e3afunction\u7ea7\u522b\u7684fixture\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\uff0cclass\u7ea7\u522bfixture\u6267\u884c\u4e4b\u540e\u6267\u884c\u3002\n@pytest.fixture(autouse=True)\ndef setup_start(self):\n# \u53f3\u952e\u70b9\u51fb deepin-album \u56fe\u6807\nBaseWidget().right_click_element(\"deepin-album\")\n# \u79fb\u52a8\u5230\u53f3\u952e\u83dc\u5355\u4e2d\u6253\u5f00\uff08open.png\uff09\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().move_to(*BaseWidget().find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))\n# \u7b49\u5f85\u79fb\u52a8\u5b8c\u6210\nsleep(0.5)\ndef test_album_start(self):\n# \u70b9\u51fb\u201c\u6253\u5f00\u201d\nBaseWidget().click() \n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"2\u3001\u65b9\u6cd5\u53c2\u6570\u8bf4\u660e","text":"2.1\u3001find_element \u65b9\u6cd5 def find_element(element: str, input_type: str = \"FILE_NAME\", fill_color_position: tuple = (-1, -1), size: tuple = (25, 70)):\npass\n \u53c2\u6570 element \u548c input_type \uff081\uff09\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u5143\u7d20 - `input_type` \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a `FIEL_NAME` \uff0c\u8868\u793a\u901a\u8fc7\u5e94\u7528 `icon` \u5bfb\u627e\u5143\u7d20\uff0c\u6b64\u65b9\u6cd5\u4f1a\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u5e94\u7528 `icon` \u56fe\u6807\u3002\n \u4e3e\u4f8b\uff1a\u9ed8\u8ba4\u60c5\u51b5\u4e0b input_type \u53c2\u6570\u4e0d\u9700\u8981\u4f20\u5165\uff0c find_element(\"deepin-album\")\uff0c\u8868\u793a\u901a\u8fc7 deepin-album \u7684\u5e94\u7528 icon \u6765\u83b7\u53d6\u5750\u6807\uff0c\u6ce8\u610f\uff0c\u6b64\u65f6\u4f20\u5165\u7684 deepin-album \u53c2\u6570\u5b9e\u9645\u662f desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u548c2.3\u4e2d\u7684 icon \u53d8\u91cf\u4e00\u81f4\u3002 \u6211\u4eec\u5efa\u8bae\u4f18\u5148\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\uff0c\u4f46\u6b64\u65b9\u6cd5\u4f9d\u8d56\u7f51\u7edc\uff0c\u8bf7\u6839\u636e\u6d4b\u8bd5\u73af\u5883\u5b9e\u9645\u60c5\u51b5\u9009\u62e9\u3002 \uff082\uff09\u901a\u8fc7\u672c\u5730\u56fe\u7247\u8bc6\u522b\u5143\u7d20 - \u53c2\u6570 `input_type` \u4f20\u5165\u56fe\u7247\u683c\u5f0f\uff0c\u6bd4\u5982\u622a\u53d6\u7684\u672c\u5730\u56fe\u7247\u683c\u5f0f\u4e3a `png`\uff0c\u90a3\u4e48 `input_type=\"png\"`\uff0c\u6b64\u65f6\u53c2\u6570 `element ` \u4f20\u5165\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5efa\u8bae\u5b58\u653e\u5728\u5bf9\u5e94\u7684\u4ea7\u54c1 `apps/app/picture/` \u76ee\u5f55\u4e0b\uff0c\u8def\u5f84\u4e3a\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u7684\u76f8\u5bf9\u8def\u5f84\u3002\n- \u4e3e\u4f8b\uff1a`find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))`\uff0c\u8868\u793a\u901a\u8fc7\u672c\u5730\u56fe\u7247 `open.png` \u8bc6\u522b\u5143\u7d20\u3002\n \u53c2\u6570 fill_color_position fill_color_position \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (-1, -1)\uff0c(-1, -1) \u8868\u793a\u53d6\u5c4f\u5e55\u4e2d\u53f3\u4e0b\u89d2\u6700\u540e\u4e00\u4e2a\u50cf\u7d20\u70b9\u4f5c\u4e3a\u586b\u5145\u5750\u6807\uff0c\u5728 1920x1080 \u5c4f\u5e55\u5206\u8fa8\u7387\u4e0b\u5373\u5b9e\u9645\u5750\u6807\u4e3a (1919, 1079) \uff0c\u8fd9\u6837\u7684\u5199\u6cd5\u53ef\u4ee5\u9002\u914d\u4e0d\u540c\u5927\u5c0f\u7684\u5c4f\u5e55\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0d\u540c\u65b9\u4f4d\uff1a \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0b\u65b9\uff0c\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u4e0d\u9700\u8981\u4f20\u5165\u8be5\u53c2\u6570\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u5de6\u8fb9\uff0cfill_color_position=(1, 1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u53f3\u8fb9\uff0cfill_color_position=(-1, -1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0a\u8fb9\uff0cfill_color_position=(1, 1) \u4ece\u684c\u9762\u542f\u52a8\u5e94\u7528\uff0c\u5219\u9700\u8981\u4f20\u5165\u9664\u4efb\u52a1\u680f\u4ee5\u5916\u5176\u4ed6\u4f4d\u7f6e\u7684\u5750\u6807\uff0c\u6bd4\u5982(100, 100)\uff0c\u53ea\u8981\u8fd9\u4e2a\u5750\u6807\u4e3a\u9664\u5e94\u7528\u548c\u4efb\u52a1\u680f\u533a\u57df\u90fd\u53ef\u4ee5\u3002 \u4ece\u542f\u52a8\u5668\u91cc\u9762\u542f\u52a8\u5e94\u7528\uff0c\u9700\u8981\u586b\u5145\u7684\u5750\u6807\u4e3a\u542f\u52a8\u5668\u533a\u57df\u3002 \u6ce8\uff1a\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u65f6\uff0c\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684 icon \u539f\u6587\u4ef6\u4e3a svg \u77e2\u91cf\u56fe\uff0c\u8f6c\u6362\u4e3a png \u4e4b\u540e\u9700\u8981\u586b\u5145\u8fb9\u7f18\u900f\u660e\u90e8\u5206\u3002 \u53c2\u6570 size size \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (25, 70)\uff0c\u8868\u793a\u6d4b\u8bd5\u673a\u4e0a dock \u680f\u4e0a\u5e94\u7528\u56fe\u6807\u7684\u5927\u5c0f\u8303\u56f4\u3002 UOS \u7cfb\u7edf dock \u680f\u662f\u53ef\u4ee5\u4e0a\u4e0b\u62d6\u52a8\u5927\u5c0f\u7684\uff0c\u968f\u7740 dock \u680f\u5927\u5c0f\u6539\u53d8\uff0c\u5e94\u7528\u56fe\u6807\u7684\u8303\u56f4\u4e3a25\u523070\u4e4b\u95f4\u3002 \u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u64cd\u4f5c\u7cfb\u7edf\u4e0a dock \u680f\u5927\u5c0f\u4e0d\u4e00\u6837\uff0c\u53ef\u4ee5\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u4f20\u5165\u5927\u5c0f\u8303\u56f4\u3002 2.2\u3001click_element\u3001 right_click_element\uff0c double_click_element \u8fd9\u51e0\u4e2a\u65b9\u6cd5\u53c2\u6570\u89c4\u5219\u4e0e find_element \u65b9\u6cd5\u4e00\u6837\u3002\u4ed6\u4eec\u5b9e\u9645\u4e0a\u662f\u5728 find_element \u65b9\u6cd5\u57fa\u7840\u4e4b\u4e0a\u505a\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u589e\u52a0\u4e86\u9f20\u6807\u7684\u52a8\u4f5c\uff0c\u5982\u679c\u4f60\u4e0d\u60f3\u4f7f\u7528\u8fd9\u51e0\u4e2a\u65b9\u6cd5\uff0c\u5728\u7528\u4f8b\u4e2d\u4e5f\u53ef\u4ee5\u901a\u8fc7 find_element \u83b7\u53d6\u5230\u5750\u6807\uff0c\u7136\u540e\u5c06\u5750\u6807\u4f20\u5165\u5230\u952e\u9f20\u7684\u65b9\u6cd5\u4e2d\uff0c\u53ef\u4ee5\u5b9e\u73b0\u540c\u6837\u7684\u6548\u679c\u3002 2.3\u3001\u7528\u4f8b\u7c7b\u4e2d\u6709\u4e2a\u7c7b\u53d8\u91cf icon = [\"deepin-album\"] \u9700\u8981\u7279\u6b8a\u8bf4\u660e\uff0c\u5217\u8868\u4e2d\u7684\u5143\u7d20\u4e3a\u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709 icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684 icon \u5230\u670d\u52a1\u7aef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528 desktop \u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684 desktop \u6587\u4ef6\u540d\u4e3a deepin-album.desktop\uff0c\u53ea\u9700\u8981\u5199 deepin-album \u5373\u53ef\uff0c.desktop \u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e03\u3001\u6267\u884c\u5165\u53e3","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"1\u3001\u7528\u4f8b\u7ec4\u7ec7","text":"\u5728 setting/config/server.ini \u6587\u4ef6\u4e2d APP_NAME= \u5b57\u6bb5\u4e3a\u7528\u4f8b\u7684\u6267\u884c\u7684\u76ee\u5f55\uff0c\u9ed8\u8ba4\u4e3a apps \u76ee\u5f55\u4e0b\u6240\u6709\u7528\u4f8b\u3002\u5982\u679c\u4f60\u60f3\u6307\u5b9a\u6267\u884c\u67d0\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4f60\u53ef\u4ee5\u5c06\u8be5\u914d\u7f6e\u9879\u6307\u5b9a\u5230\u5e94\u7528\u7684\u7528\u4f8b\u76ee\u5f55\uff0c\u6bd4\u5982\uff1aAPP_NAME=deepin_album\uff0c \u8868\u793a\u6267\u884c\u76f8\u518c\u76ee\u5f55\u4e0b\u7684\u7528\u4f8b\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a python3 manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music\n -k KEYWORDS, --keywords KEYWORDS\n \u7528\u4f8b\u7684\u5173\u952e\u8bcd\n -t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e\n --log_level LOG_LEVEL \u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n --env {host,docker} \u5728\u5bbf\u4e3b\u673a\u6216\u5bb9\u5668\u73af\u5883\u6267\u884c\n --client_alias \u9009\u62e9\u6d4b\u8bd5\u673a\u522b\u540d, \u53ef\u9009\u9879\u4e3aclient.ini\u4e2d\u5df2\u914d\u7f6e, \u9ed8\u8ba4\u503c\u4e3a zx-x86.\n --count \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a python3 manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\" --env docker\n \u6ce8\uff1a\u5728\u5bb9\u5668\u4e2d\u6267\u884c\u65f6\uff0c\u82e5\u5f3a\u5236\u9000\u51fa\uff0c\u5bb9\u5668\u5e76\u4e0d\u4f1a\u505c\u6b62\u8fd0\u884c\uff01"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_9","title":"\u516b\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1json","title":"1\u3001Json \u62a5\u544a","text":"\u81ea\u7814\u89c6\u9891\u89e3\u6790\u5de5\u5177\u4f1a\u5bf9\u5355\u6761\u7528\u4f8b\u6267\u884c\u4e00\u8f6e\u751f\u6210\u4e00\u4e2a json \u6587\u4ef6\uff0c\u5b58\u653e\u4e8e report/{app_name}/{scene}/{run_num} \u76ee\u5f55\u4e0b\uff0c\u547d\u540d\u683c\u5f0f\u4e3a\uff1a report.json json \u5185\u5bb9\u4e3e\u4f8b\uff1a [\n{\n\"Stab1\": {\n\"images\": [1,2...150,151],\n\"startStub\": 0,\n\"type\": \"Stab\"\n}\n},\n{\n\"Stab2\": {\n\"images\": [152,153...169,170],\n\"startStub\": 1,\n\"type\": \"UnStab\"\n}\n},\n{\n\"Stab3\": {\n\"images\": [171,172...300,301],\n\"startStub\": 0,\n\"type\": \"UnStab\"\n}\n}\n]\n \u8bf4\u660e\uff1a Stab \uff1a\u8868\u793a\u89e3\u6790\u8fc7\u7a0b\u4e2d\u4e0d\u540c\u7684\u9636\u6bb5\u3002 images \uff1a\u8868\u793a\u6bcf\u4e00\u5e27\u7684\u56fe\u7247\u5e8f\u53f7\u3002 startStub\uff1a \u4e3a\u8bc6\u522b\u5c3e\u5e27\u7684\u9636\u6bb5\u8868\u793a\uff0c\u5982\u679c \"startStub\": 1 \uff0c\u8bf4\u660e\u5c3e\u5e27\u51fa\u73b0\u5728\u8be5\u9636\u6bb5\u3002 type\uff1a \u4e3a Stab \u6216 UnStab \uff0c\u8868\u793a\u7a33\u5b9a\u9636\u6bb5\u6216\u4e0d\u7a33\u5b9a\u9636\u6bb5\u3002 \u5404\u9636\u6bb5\u6709\u5e27\u6570\u8865\u507f\uff0c\u9ed8\u8ba4\u8865\u507f\u7684\u5e27\u6570\u4e3a 3 \u5e27\uff08\u53ef\u4ee5\u901a\u8fc7 server.ini \u91cc\u9762 un_stab_start=3 \u8fdb\u884c\u914d\u7f6e\uff09\uff0c\u8868\u793a\u5c0f\u4e8e\u7b49\u4e8e 3 \u5e27\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u524d\u540e\u5747\u9700\u8981\u51cf\u6389\u3002 \u5e94\u7528\u542f\u52a8\u9636\u6bb5\u5c31\u662f\u5728 Stab2 \u9636\u6bb5\uff0c\u542f\u52a8\u65f6\u95f4\u4e3a\uff1a171 \u51cf 151 \u518d\u51cf\u6389\u524d\u540e\u8865\u507f\u5e27\u6570 6 \u5e27\uff0c\u5373 14 \u5e27\uff0c\u89c6\u9891\u5e27\u7387 30 \u5e27/\u79d2\uff0c\u56e0\u6b64\u542f\u52a8\u8017\u65f6\u4e3a\uff1a14 * 33 = 462 ms"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2excel","title":"2\u3001Excel \u62a5\u544a","text":"\u6240\u6709\u7528\u4f8b\u6267\u884c\u5e76\u89e3\u6790\u5b8c\u4e4b\u540e\u4f1a report \u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a\u6c47\u603b\u6570\u636e\u7684 Excel \u6587\u4ef6\uff0c\u6587\u4ef6\u540d\u4e3a\uff1a{time}_perf_time.xlsx\u3002 \u6ce8\u610f\uff0creport \u76ee\u5f55\u4e3a\u53ef\u914d\u7f6e\u9879\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u4f1a\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u751f\u6210\uff0c\u5982\u679c\u4f60\u5c06 report\uff0c\u6307\u5b9a\u5230\u9879\u76ee\u4e0b\u5176\u4ed6\u8def\u5f84\uff0c\u5219\u4f1a\u5728\u5bf9\u5e94\u7684\u8def\u5f84\u4e0b\u751f\u6210 json \u548c Excel \u6587\u4ef6\u3002 \u4f60\u4e5f\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8bfb\u53d6\u6240\u6709 json / excel \u62a5\u544a\u7684\u6570\u636e\uff0c\u751f\u6210\u4f60\u81ea\u5df1\u60f3\u8981\u7684\u4e00\u4e9b\u6d4b\u8bd5\u62a5\u544a\u5f62\u5f0f\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#usb","title":"\u4e5d\u3001USB \u4e32\u53e3\u9a71\u52a8\u952e\u9f20\u65b9\u6cd5","text":"\u4f4d\u4e8e src/utils/control/serial_communication \u76ee\u5f55\u4e0b\u7684 usb_mk.py \u6587\u4ef6 usb_mk = UsbMk()\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up()\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u652f\u6301\u4f20\u5165\u6c49\u5b57\uff0c\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click()\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() \n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() \n \uff084\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() \n \uff085\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() \n \uff086\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() \n \uff087\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff088\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff0810\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_10","title":"\u5341\u3001\u7ee7\u7535\u5668\u63a7\u5236\u4e3b\u673a\u5f00\u673a/\u91cd\u542f","text":"\uff08\u82e5\u4e0d\u4f7f\u7528\u7ee7\u7535\u5668\uff0c\u53ef\u5ffd\u7565\u8be5\u6b65\u9aa4\uff0c\u6267\u884c\u65f6\u4f1a\u901a\u8fc7\u547d\u4ee4 reboot\uff09"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u7ee7\u7535\u5668\u8bbe\u5907","text":"LCUS-2 \u578b \u53cc\u8def USB \u667a\u80fd\u4e32\u53e3\u63a7\u5236\u7ee7\u7535\u5668\u3002 https://item.taobao.com/item.htm?spm=a1z09.2.0.0.41d72e8dUYx2pi&id=582653718178&_u=i25r20ia6a2e "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2usb","title":"2\u3001USB \u5ef6\u957f\u7ebf","text":"\u666e\u901a\u7684 USB \u7ebf\u5373\u53ef\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_3","title":"3\u3001\u675c\u90a6\u7ebf","text":"3.1\u300140P \u6bcd\u5bf9\u516c\u675c\u90a6\u7ebf\u3002 3.2\u3001\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"4\u3001\u5b89\u88c5\u56fe\u6587\u6559\u7a0b","text":"4.1\u3001\u4f7f\u7528 USB \u5ef6\u957f\u7ebf\u8fde\u63a5\u63a7\u5236\u7aef\u548c\u7ee7\u7535\u5668\u3002 4.2\u3001\u5728\u7ee7\u7535\u5668\u5e38\u7aef\u548c\u516c\u5171\u7aef\u5747\u8fde\u63a5\u4e00\u6839\u675c\u90a6\u7ebf\u3002 4.3\u3001\u5728\u4e3b\u677f\u4e0a\u5f00\u673a\u9488\u548c\u91cd\u542f\u9488\u4e0a\u63d2\u4e0a\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 4.4\u3001\u5c06\u5f00\u673a\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76841\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1\u5de6\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 4.5\u3001\u5c06\u91cd\u542f\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76842\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1 \u53f3\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 \u82e5\u60f3\u4fdd\u7559\u539f\u7535\u6e90\u5f00\u5173\u7684\u7535\u6e90\u706f\uff0c\u53ef\u6839\u636e\u5982\u4e0a\u56fe\u6240\u793a\uff0c\u4f7f\u7528\u675c\u90a6\u7ebf\u8fde\u63a5\u4e3b\u677f\u4e0a\u7684\u7535\u6e90\u706f\u548c\u539f\u7535\u6e90\u5f00\u5173"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_11","title":"\u5341\u4e00\u3001\u5e38\u89c1\u95ee\u9898\u8bf4\u660e","text":"1\u3001ERROR: for uos Cannot restart container 2301b1a1395d7959ee6523d61b61c87084649af530786cdb8fb5b3ecbcbd1068: linux runtime spec devices: error gathering device information while adding custom device \"/dev/ttyACM0\": no such file or directory \u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u8fde\u63a5\u72b6\u6001\uff0c\u67e5\u770b /dev/ttyACM0 \u662f\u5426\u5b58\u5728\uff0c\u82e5\u5b58\u5728 /dev/ttyACMn\uff08n\u4e3a\u4efb\u610f\u6570\u5b57\uff09\uff0c\u91cd\u542f\u7535\u8111\u89e3\u51b3\u3002 2\u3001Error response from daemon: Container 5e700fdc769e8c74666d68a7f2bc3de58268b4594cf88706609d59f8dbc7362d is not running \u5bb9\u5668\u542f\u52a8\u5931\u8d25 1\uff09\u68c0\u67e5\u54ea\u4e00\u4e2a\u5bb9\u5668\u672a\u542f\u52a8 sudo docker container ls # \u5217\u51fa\u8fd0\u884c\u4e2d\u7684 Docker \u5bb9\u5668\n 2\uff09\u7f3a\u5c11 uos \u5bb9\u5668\uff0c\u68c0\u67e5 USB \u4e32\u53e3\u8fde\u63a5\u7ebf\u548c\u91c7\u96c6\u76d2\u8fde\u63a5\u7ebf\u662f\u5426\u6b63\u5e38\uff0c\u91cd\u542f\u540e\u6267\u884c bash install/setup.up # \u91cd\u65b0\u5b8c\u6574\u90e8\u7f72\u73af\u5883\n \u6216\u6267\u884c sudo docker-compose up -d --build # \u4ec5\u91cd\u65b0\u6784\u5efa Docker \u955c\u50cf\n 3\u3001\u82e5\u90e8\u7f72\u65f6\u63d0\u793a\u6302\u8f7d ttyACM0\u3001video0 \u5931\u8d25\uff0c\u8bf7\u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u53ca\u91c7\u96c6\u76d2\u662f\u5426\u63a5\u89e6\u826f\u597d\uff0c\u82e5\u63a5\u89e6\u826f\u597d\uff0c\u91cd\u542f\u5373\u53ef\u89e3\u51b3\u3002 4\u3001\u82e5\u51fa\u73b0\u56fe\u7247\u80fd\u8bc6\u522b\uff0c\u4f46\u662f\u9f20\u6807\u672a\u79fb\u52a8\u64cd\u4f5c\u65f6\uff0c\u5b89\u88c5\u7edd\u5bf9\u9f20\u6807\u64cd\u4f5c\u7684\u4f9d\u8d56\u5305\uff0c\u89c1\u7b2c\u4e09\u8282\u7b2c\u4e8c\u5c0f\u8282\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u6d4b\u8bd5\u673a\u3002 5\u3001\u7531\u4e8e\u901a\u8fc7\u91c7\u96c6\u5361\u83b7\u53d6\u7684\u6d4b\u8bd5\u673a\u5b9e\u65f6\u753b\u9762\uff0c\u5305\u542b\u4e86\u9f20\u6807\u7684\u6837\u5f0f\uff0c\u6240\u4ee5\u5bf9\u56fe\u7247\u8bc6\u522b\u65f6\uff0c\u9f20\u6807\u82e5\u505c\u7559\u5728\u56fe\u6807\u4e0a\u5c42\uff0c\u5219\u4f1a\u5bf9\u8bc6\u522b\u7ed3\u679c\u9020\u6210\u5f71\u54cd\uff0c\u9700\u8981\u5c06\u9f20\u6807\u79fb\u52a8\u81f3\u5176\u4ed6\u4f4d\u7f6e\uff0c\u6216\u8005\u9690\u85cf\u9f20\u6807\u89e3\u51b3\u3002 6\u3001Excel \u62a5\u544a\u4e2d\uff0c\u6d4b\u8bd5\u573a\u666f\u5217\u4e0e\u7528\u4f8b\u4e2d\u7684\u4e0d\u4e00\u81f4\uff0c\u5173\u952e\u5b57scene\u3001app_name\u3001\u67b6\u6784\u522b\u540d\uff0c\u4e0d\u80fd\u5305\u542b\u4e0b\u5212\u7ebf\u548c\u82f1\u6587\u7b26\u53f7\u7684\u5706\u62ec\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/","title":"\u6846\u67b6\u529f\u80fd\u4ecb\u7ecd","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2023/1/12\n# Author : Mikigo\n# =============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_2","title":"\u4e00\u3001\u4e00\u53e5\u8bdd\u7b80\u4ecb","text":"\u6b64\u6587\u6863\u4e3b\u8981\u60f3\u5bf9 YouQu \u6846\u67b6\u4e00\u4e9b\u91cd\u70b9\u7684\u529f\u80fd\u505a\u8be6\u7ec6\u7684\u4ecb\u7ecd\uff0c\u5305\u62ec\u5bf9\u4e00\u4e9b\u529f\u80fd\u5f00\u53d1\u7684\u80cc\u666f\u3001\u8981\u89e3\u51b3\u7684\u95ee\u9898\u3001\u5b9e\u73b0\u903b\u8f91\u3001\u4ee3\u7801\u7b49\u65b9\u9762\u7684\u4ecb\u7ecd\uff0c\u4ee5\u6b64\u8ba9\u5927\u5bb6\u80fd\u66f4\u52a0\u6e05\u6670\u7684\u7406\u89e3\u5404\u9879\u529f\u80fd\uff0c\u4ece\u800c\u5728\u4f7f\u7528\u7684\u65f6\u5019\u80fd\u66f4\u52a0\u7684\u5f97\u5fc3\u5e94\u624b\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_3","title":"\u4e8c\u3001\u56fe\u50cf\u8bc6\u522b","text":"\u56fe\u50cf\u8bc6\u522b\u5728 UI \u81ea\u52a8\u5316\u4e2d\u662f\u4e0d\u53ef\u7f3a\u5c11\u7684\uff0c\u5e02\u9762\u4e0a\u751a\u81f3\u6709\u5b8c\u5168\u57fa\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\uff0c\u6bd4\u5982 Airtest\u3001Sikuli \u7b49\uff0c\u5728\u6e38\u620f\u7b49\u7279\u5b9a\u9886\u57df\u4e5f\u6709\u4e0d\u9519\u7684\u6548\u679c\uff0c\u8fd9\u4e9b\u5de5\u5177\u5b9e\u9645\u4e0a\u4e5f\u662f\u7528\u7684 OpenCV \u8fdb\u884c\u4e86\u5c01\u88c5\uff0cYouQu \u6846\u67b6\u57fa\u4e8e OpenCV \u5f00\u53d1\u4e86\u81ea\u5df1\u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\uff0c\u5b83\u53ef\u4ee5\u65b9\u4fbf\u7684\u7528\u4e8e\u754c\u9762\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u65ad\u8a00\uff1b YouQu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u51e0\u4e4e\u6ee1\u8db3\u4e86\u4f60\u7684\u6240\u6709\u8981\u6c42\uff0c\u6211\u4eec\u5728\u957f\u65f6\u95f4\u7684\u601d\u8003\u548c\u6478\u7d22\u4e2d\uff0c\u9488\u5bf9\u5e38\u89c4\u573a\u666f\u53ca\u4e00\u4e9b\u7279\u6b8a\u573a\u666f\u63a2\u7d22\u9664\u4e86\u4e00\u4e9b\u5b9e\u7528\u4e14\u6709\u6548\u7684\u65b9\u6848\uff0c\u4e14\u542c\u6211\u6162\u6162\u9053\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1","title":"1\u3001\u5e38\u89c4\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5e38\u89c4\u8bc6\u522b\u5f88\u597d\u7406\u89e3\uff0c\u4e00\u53e5\u8bdd\u8bb2\u5c31\u662f\uff0c\u8981\u83b7\u53d6\u5230\u76ee\u6807\u5143\u7d20\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u3002 \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u5728\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u9700\u8981\u83b7\u53d6\u7684\u5750\u6807\u662f\u76f8\u5bf9\u4e8e\u6574\u4e2a\u5c4f\u5e55\u7684\u5750\u6807\uff0c\u6211\u4eec\u53ef\u4ee5\u622a\u53d6\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u56fe\u7247\uff08screen\uff09\uff1b \u5728\u5143\u7d20\u8bc6\u522b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u622a\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5c0f\u56fe\u8fdb\u884c\u8bc6\u522b\uff0c\u6bd4\u5982\u622a\u53d6\u64ad\u653e\u6309\u94ae\uff1a \u90a3\u4e48\u5b9e\u9645\u4e0a\uff0c\u5143\u7d20\u5b9a\u4f4d\u7684\u95ee\u9898\u5c31\u8f6c\u6362\u4e3a\uff0c\u5c06\u622a\u56fe\u7684\u5c0f\u56fe\uff08play_btn\uff09\u62ff\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u5927\u56fe\uff08screen\uff09\u4e2d\u53bb\u505a\u5339\u914d\uff0c\u5982\u679c\u5339\u914d\u6210\u529f\uff0c\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff08 x, y \uff09\u5373\u53ef\u3002 \u4e3a\u4e86\u65b9\u4fbf\u63cf\u8ff0\uff0c\u4ee5\u4e0b\u6211\u5c06\u6574\u4e2a\u5c4f\u5e55\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5927\u56fe\uff0c\u67d0\u4e2a\u5143\u7d20\u56fe\u7247\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5c0f\u56fe\u3002 \u57fa\u4e8e OpenCV \u7684\u6a21\u677f\u5339\u914d cv.matchTemplate() \u529f\u80fd\uff0c\u6211\u4eec\u5b9e\u73b0\u4e86\u56fe\u50cf\u5b9a\u4f4d\u7684\u529f\u80fd\uff0c\u6846\u67b6\u63d0\u4f9b\u4e86\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u5e95\u5c42\u63a5\u53e3\uff08\u4e00\u822c\u4e0d\u5bf9\u4e0a\u5c42\u63d0\u4f9b\u8c03\u7528\uff09\uff1a def _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\n# \u8be6\u7ec6\u4ee3\u7801\u592a\u957f\u4e0d\u8d34\u4e86\uff0c\u611f\u5174\u8da3\u8bf7\u67e5\u770b\u6e90\u7801\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001image_path image_path \u662f\u5c0f\u56fe\u7684\u7edd\u5bf9\u8def\u5f84; \u901a\u5e38\u5728 AT \u5de5\u7a0b\u91cc\u9762\uff0c\u6211\u4eec\u7ea6\u5b9a\u5c06\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u5b9e\u9645\u7684\u5143\u7d20\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1aplay_btn.png \uff1b \u7528\u4e8e\u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 case/assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1amusic_001.png \uff1b \u8fd9\u6837\u662f\u4e3a\u4e86\u65b9\u4fbf\u7ba1\u7406\u548c\u7ef4\u62a4\u3002 2\u3001rate \u56fe\u50cf\u8bc6\u522b\u7684\u7684\u5339\u914d\u5ea6\u6216\u8005\u8bf4\u76f8\u4f3c\u5ea6\uff0c\u6846\u67b6\u9ed8\u8ba4\u7684\u914d\u7f6e\u4e3a 0.9\uff0c\u4e5f\u5c31\u662f\u8bf4\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u5b58\u5728\u4e00\u4e2a\u76f8\u4f3c\u5ea6 90% \u7684\u56fe\u6807\u5373\u8fd4\u56de\u5176\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff1b \u5982\u679c\u4f60\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u8c03\u6574\u8bc6\u522b\u5ea6\uff0c\u4f60\u53ef\u4ee5\u5728\u8c03\u7528\u51fd\u6570\u7684\u65f6\u5019\uff0c\u4f20\u5165\u4e0d\u540c\u7684\u8bc6\u522b\u5ea6\u7684\u503c\u3002 3\u3001multiple \u9ed8\u8ba4\u60c5\u51b5\u4e0b multiple=False\uff0c\u8868\u793a\u53ea\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u7b2c\u4e00\u4e2a\uff0c\u5982\u679c multiple=True \u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\uff0c\u56e0\u4e3a\u5927\u56fe\u4e2d\u53ef\u80fd\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u5c0f\u56fe\uff0c\u5728\u67d0\u4e9b\u573a\u666f\u4e0b\u4f60\u53ef\u80fd\u9700\u8981\u5168\u90e8\u83b7\u53d6\u5230\u6240\u6709\u5339\u914d\u5230\u7684\u5750\u6807\u3002 4\u3001picture_abspath \u9ed8\u8ba4\u60c5\u51b5\u4e0b picture_abspath=None \u8868\u793a\u5927\u56fe\u4e3a\u622a\u53d6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u5982\u679c\u4f60\u4e0d\u5e0c\u671b\u5927\u56fe\u662f\u5c4f\u5e55\u7684\u622a\u56fe\uff0c\u800c\u662f\u4f60\u81ea\u5b9a\u4e49\u4f20\u5165\u7684\u67d0\u4e2a\u56fe\u7247\uff0c\u4f60\u53ea\u9700\u8981\u5c06\u4f60\u7684\u56fe\u7247\u8def\u5f84\u4f20\u9012\u7ed9\u8fd9\u4e2a\u53c2\u6570\u5c31\u884c\uff0c\u6bd4\u5982\uff1a picture_abspath=\"~/Desktop/big.png\" \uff1b 5\u3001screen_bbox \u5927\u56fe\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u622a\u53d6\u6574\u4e2a\u5c4f\u5e55\uff0cscreen_bbox = [x, y, w, h] \u53ef\u4ee5\u6307\u5b9a\u622a\u53d6\u5c4f\u5e55\u4e2d\u7684\u56fa\u5b9a\u533a\u57df\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\uff0c\u53ef\u4ee5\u6392\u9664\u90e8\u5206\u533a\u57df\u5bf9\u8bc6\u522b\u7ed3\u679c\u7684\u5f71\u54cd\u3002 \u3010\u9690\u5f0f\u7b49\u5f85\u3011 \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\uff0c\u6709\u65f6\u5019\u9875\u9762\u8df3\u8f6c\u6709\u5ef6\u65f6\uff0c\u6709\u53ef\u80fd\u5b58\u5728\u8bc6\u522b\u7684\u90a3\u4e00\u523b\u9875\u9762\u4e5f\u6ca1\u6709\u8df3\u8f6c\u51fa\u6765\uff0c\u6216\u8005\u6216\u8005\u8bc6\u522b\u7684\u90a3\u4e00\u523b\uff1b \u56e0\u6b64\u6211\u4eec\u9700\u8981\u4e00\u79cd\u7b49\u5f85\u673a\u5236\uff0c\u5373\u5728\u4e00\u5b9a\u7684\u65f6\u95f4\u5185\uff0c\u5982\u679c\u8bc6\u522b\u4e0d\u5230\uff0c\u91cd\u590d\u53bb\u8bc6\u522b\uff1a def find_image(\ncls,\n*widget, rate: [float, int] = None,\nmultiple: bool = False,\nmatch_number: int = None,\npicture_abspath: str = None,\nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u5728\u5c4f\u5e55\u4e2d\u533a\u5bfb\u627e\u5c0f\u56fe\uff0c\u8fd4\u56de\u5750\u6807\uff0c\n \u5982\u679c\u627e\u4e0d\u5230\uff0c\u6839\u636e\u914d\u7f6e\u91cd\u8bd5\u6b21\u6570\uff0c\u6bcf\u6b21\u95f4\u96941\u79d2\n :param widget: \u6a21\u677f\u56fe\u7247\u8def\u5f84\n :param rate: \u76f8\u4f3c\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param match_number: \u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\n :return: \u5750\u6807\u5143\u7ec4\n \"\"\"\nif rate is None:\nrate = float(GlobalConfig.IMAGE_RATE)\ntry:\nfor element in widget:\nfor _ in range((match_number or int(GlobalConfig.IMAGE_MATCH_NUMBER)) + 1):\nlocate = cls._match_image_by_opencv(\nelement,\nrate,\nmultiple=multiple,\npicture_abspath=picture_abspath,\nscreen_bbox=screen_bbox\n)\nif not locate:\nsleep(int(GlobalConfig.IMAGE_MATCH_WAIT_TIME))\nelse:\nreturn locate\nraise TemplateElementNotFound(*widget)\nexcept Exception as e:\nraise e\n \u53c2\u6570 match_number \u7528\u4e8e\u63a7\u5236\u91cd\u590d\u8bc6\u522b\u7684\u6b21\u6570\uff0c\u9ed8\u8ba4\u4e0d\u4f20\u53c2\uff0c\u53d6\u5168\u5c40\u914d\u7f6e setting/globalconfig.ini \u91cc\u9762\u7684 IMAGE_MATCH_NUMBER \u914d\u7f6e\u9879\u7684\u503c\uff0c\u9ed8\u8ba4IMAGE_MATCH_NUMBER = 1\uff0c\u5373\u91cd\u8bd5 1 \u6b21\uff1b find_image \u662f\u6846\u67b6\u63d0\u4f9b\u7684\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u51fd\u6570\u63a5\u53e3\uff0c\u8fd9\u4e2a\u51fd\u6570\u63d0\u4f9b\u4e86\u9690\u5f0f\u7b49\u5f85\u7684\u529f\u80fd\uff0c\u4e14\u5305\u542b\u4e0a\u9762\u4ecb\u7ecd\u7684 _match_image_by_opencv \u51fd\u6570\u7684\u6240\u6709\u529f\u80fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2","title":"2\u3001\u6c14\u6ce1\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u6c14\u6ce1\u8bc6\u522b\u6307\u7684\u662f\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\u8981\u5b9a\u4f4d\u7684\u5143\u7d20\u662f\u4e00\u4e9b\u4f1a\u6d88\u5931\u7684\u5c0f\u5f39\u7a97\uff0c\u8fd9\u7c7b\u573a\u666f\u5728\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\u5c31\u53ef\u80fd\u5b58\u5728\u4e0d\u7a33\u5b9a\u6027\uff0c\u6709\u53ef\u80fd\u56fe\u50cf\u8bc6\u522b\u7684\u65f6\u5019\u6c14\u6ce1\u5df2\u7ecf\u6d88\u5931\u4e86\uff0c\u4e5f\u6709\u53ef\u80fd\u6c14\u6ce1\u51fa\u73b0\u7684\u65f6\u95f4\u592a\u77ed\u4e86\uff0c\u4e0d\u5bb9\u6613\u6355\u6349\u5230\uff0c\u5c31\u50cf\u6c14\u6ce1\u4e00\u6837\uff0c\u51fa\u73b0\u4e00\u4e0b\u5c31\u6d88\u5931\uff0c\u56e0\u6b64\u6211\u4eec\u5f62\u8c61\u7684\u79f0\u4e4b\u4e3a \u201c\u6c14\u6ce1\u8bc6\u522b\u201d\uff1b \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u4e3a\u4e86\u80fd\u7a33\u5b9a\u7684\u8bc6\u522b\u6c14\u6ce1\u7c7b\u573a\u666f\uff0c\u6211\u4eec\u91c7\u7528\u7684\u65b9\u6848\u662f\uff1a \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\uff08\u5305\u542b\u6c14\u6ce1\u4ece\u51fa\u73b0\u5230\u6d88\u5931\uff09\uff0c\u4e0d\u505c\u7684\u622a\u53d6\u8fd9\u6bb5\u65f6\u95f4\u5185\u7684\u5927\u56fe\uff0c\u4ee5\u6b64\u786e\u4fdd\u5728\u622a\u53d6\u7684\u4e00\u5806\u56fe\u7247\u4e2d\uff0c\u80af\u5b9a\u6709\u81f3\u5c11\u4e00\u5f20\u56fe\u7247\u80fd\u6355\u6349\u5230\u6c14\u6ce1\uff0c\u6700\u540e\u518d\u5bf9\u8fd9\u4e00\u5806\u56fe\u7247\u9010\u4e2a\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def get_during(\ncls,\nimage_path: str,\nscreen_time: [float, int],\nrate: float = None,\npause: [int, float] = None,\nmax_range: int = 10000\n):\n\"\"\"\n \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u622a\u56fe\u591a\u5f20\u56fe\u7247\u8fdb\u884c\u8bc6\u522b\uff0c\u5176\u4e2d\u6709\u4e00\u5f20\u56fe\u7247\u8bc6\u522b\u6210\u529f\u5373\u8fd4\u56de\u7ed3\u679c;\n \u9002\u7528\u4e8e\u6c14\u6ce1\u7c7b\u7684\u65ad\u8a00\uff0c\u6bd4\u5982\u6c14\u6ce1\u57281\u79d2\u5185\u6d88\u5931\uff0c\u5982\u679c\u7528\u5e38\u89c4\u7684\u56fe\u50cf\u8bc6\u522b\u5219\u6709\u53ef\u80fd\u65e0\u6cd5\u8bc6\u522b\u5230\uff1b\n :param image_path: \u8981\u8bc6\u522b\u7684\u6a21\u677f\u56fe\u7247\uff1b\n :param screen_time: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff1b\n :param rate: \u8bc6\u522b\u7387\uff1b\n :param pause: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u4e0d\u95f4\u9694\uff1b\n :param max_range: \u622a\u56fe\u7684\u6700\u5927\u6b21\u6570\uff0c\u8fd9\u662f\u4e00\u4e2a\u9884\u8bbe\u503c\uff0c\u4e00\u822c\u60c5\u51b5\u4e0b\u4e0d\u6d89\u53ca\u4fee\u6539\uff1b\n \"\"\"\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001screen_time \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5728\u6b64\u65f6\u95f4\u5185\u4f1a\u4e0d\u65ad\u7684\u8fdb\u884c\u622a\u56fe\u64cd\u4f5c\uff0c\u5c31\u50cf\u5f55\u5236\u89c6\u9891\u4e00\u6837\uff1b 2\u3001pause \u6bcf\u6b21\u622a\u53d6\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u4e00\u523b\u4e0d\u505c\u7684\u622a\u56fe\uff0c\u5982\u679c\u4f60\u60f3\u6bcf\u6b21\u622a\u56fe\u5b58\u5728\u4e00\u4e9b\u95f4\u9694\u65f6\u95f4\u4f20\u5165\u5bf9\u5e94\u7684\u65f6\u95f4\u95f4\u9694\u5373\u53ef\uff0c\u5355\u4f4d\u662f\u79d2\uff0c\u6bd4\u5982\uff1apause = 0.03\uff0c\u8868\u793a 30 ms\uff0c\u76f8\u5f53\u4e8e\u5e27\u7387\u4e3a 30 \u5e27\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-opencv","title":"3\u3001\u4e0d\u4f9d\u8d56 OpenCV \u7684\u56fe\u50cf\u8bc6\u522b\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31","title":"3.1\u3001\u81ea\u7814\u56fe\u50cf\u8bc6\u522b\u6280\u672f","text":"\u3010\u539f\u7406\u3011 \u4e3a\u4e86\u5b9e\u73b0\u8bc6\u522b\u56fe\u50cf\u7684\u76ee\u7684\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u5c06\u56fe\u7247\u7684\u6bcf\u4e2a\u50cf\u7d20\u7684RGB\u503c\uff0c\u4e0e\u6574\u4e2a\u5c4f\u5e55\u4e2d\u7684RGB\u8fdb\u884c\u5bf9\u6bd4\uff0c\u5982\u679c\u5c0f\u56fe\u4e0a\u7684RGB\u503c\u4e0e\u5bf9\u5e94\u5927\u56fe\u4f4d\u7f6e\u7684RGB\u90fd\u76f8\u7b49\uff0c\u5219\u5339\u914d\u6210\u529f\uff0c\u5373\u53ef\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u70b9\u3002 1\u3001\u8bfb\u53d6\u5c0f\u56fe\u548c\u5927\u56fe\u7684RGB\u503c \uff081\uff09\u5c0f\u56fe\u7684RGB\u503c small_data = small_pic.load() # load()\u4f1a\u5c06\u56fe\u7247\u7684RGB\u503c\u83b7\u53d6\u5230\uff0c\u6570\u636e\u683c\u5f0f\u4e3a\u4e00\u4e2a\u4e8c\u7ef4\u5217\u8868\uff0c\u8d4b\u503c\u7ed9\u4e00\u4e2a\u53d8\u91cfsmall_data\u3002\n \uff082\uff09\u5927\u56fe\u7684RGB\u503c big_data = big_pic.load()\n 2\u3001\u5c06\u5c0f\u56fe\u4e0e\u5927\u56fe\u7684RGB\u503c\u8fdb\u884c\u5339\u914d \uff081\uff09\u5339\u914d\u4ece\u5927\u56fe\u7684\u5750\u6807\uff080\uff0c0\uff09\u5f00\u59cb\u5339\u914d\uff0c\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff082\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\uff080\uff0c0\uff09\u5bf9\u5e94\u7684\u6240\u6709\u5c0f\u56fe\u7684RGB\u503c\u4e0d\u76f8\u7b49\uff0c\u5219\u79fb\u52a8\u5230\u4e0b\u4e00\u4e2a\u5750\u6807\u70b9\uff081\uff0c0\uff09\uff0c\u540c\u6837\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff083\uff09\u6309\u7167\u8fd9\u6837\u7684\u89c4\u5f8b\u5c06\u8fd9\u4e00\u884c\u6bcf\u79fb\u52a8\u4e00\u4e2a\u5750\u6807\u70b9\uff0c\u90fd\u5c06\u5c0f\u56fe\u6240\u6709\u7684RGB\u4e0e\u5bf9\u5e94\u5927\u56fe\u7684\u503c\u8fdb\u884c\u5339\u914d\uff1b \uff084\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\u5176\u4e2d\u4e00\u4e2a\u5750\u6807\u70b9\u4e0a\u5339\u914d\u5230\u4e86\u5c0f\u56fe\u7684\u6240\u6709RGB\u503c\uff0c\u5219\u6b64\u65f6\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\u70b9\uff1b \uff085\uff09\u5982\u679c\u5339\u914d\u4e86\u5927\u56fe\u6240\u6709\u7684\u5750\u6807\u70b9\uff0c\u90fd\u6ca1\u6709\u5339\u914d\u5230\uff0c\u5219\u8bf4\u660e\u5927\u56fe\u4e2d\u4e0d\u5b58\u5728\u5c0f\u56fe\uff0c\u5339\u914d\u5931\u8d25\uff1b \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 class ImageRgb:\n@staticmethod\ndef _check_match(_x, _y, small, bdata, sdata, rate):\n\"\"\"\n Matching degree of small graph and large graph matching\n \"\"\"\n@staticmethod\ndef _pre_random_point(small):\n\"\"\"\n Pre matching, take 10-20 points at random each time,\n and take coordinates randomly in the small graph\n \"\"\"\n@staticmethod\ndef _pre_random_match(_x, _y, point_list, bdata, sdata, rate):\n\"\"\"\n In the small graph, several points are randomly\n selected for matching, and the matching degree is\n also set for the random points\n \"\"\"\n@classmethod\ndef match_image_by_rgb(cls, image_name=None, image_path=None, rate=0.9):\n\"\"\"\n By comparing the RGB values of the small image with the large\n image on the screen, the coordinates of the small image on\n the screen are returned.\n \"\"\"\n \u901a\u8fc7 match_image_by_rgb() \u8fd9\u4e2a\u51fd\u6570\uff0c\u4f20\u5165\u76ee\u6807\u5c0f\u56fe\u7684\u6587\u4ef6\u540d\u79f0\uff0c\u5373\u53ef\u8fd4\u56de\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u3002 \u6709\u540c\u5b66\u8981\u95ee\u4e86\uff0c\u6709 OpenCV \u5e72\u561b\u4e0d\u7528\uff0c\u6709\u5fc5\u8981\u81ea\u5df1\u5b9e\u73b0\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u529f\u80fd\u5417\uff0c\u4f60\u4eec\u662f\u4e0d\u662f\u95f2\u7684\u554a\uff1f \u8fd9\u4e48\u95ee\u7684\u8bdd\uff0c\u5c0f\u4e86\uff0c\u683c\u5c40\u5c0f\u4e86\uff1b\u6211\u4eec\u81ea\u5df1\u5b9e\u73b0\u4e3b\u8981\u6709\u51e0\u65b9\u9762\u539f\u56e0\uff1a \u51cf\u5c11\u73af\u5883\u4f9d\u8d56\uff0c\u5373\u4e0d\u7528\u5b89\u88c5 OpenCV\uff0c\u6211\u4eec\u4e5f\u80fd\u5b9e\u73b0\u5176\u529f\u80fd\uff0c\u73af\u5883\u4f9d\u8d56\u8fd9\u5757\u540e\u9762\u4f1a\u5355\u72ec\u8be6\u7ec6\u8bb2\uff0c\u51cf\u5c11\u73af\u5883\u4f9d\u8d56\u5bf9\u4e8e\u4efb\u4f55\u8f6f\u4ef6\u5de5\u7a0b\u90fd\u975e\u5e38\u91cd\u8981\uff1b OpenCV \u5728\u5176\u4ed6\u56fd\u4ea7 CPU \u67b6\u6784\u4e0a\u5b89\u88c5\u5e76\u4e0d\u80fd\u4fdd\u8bc1100%\u6210\u529f\uff0c\u751a\u81f3\u6709\u6ca1\u6709\u53ef\u80fd\u5728\u4e00\u4e9b\u67b6\u6784\u4e0a\u538b\u6839\u513f\u5c31\u4e0d\u80fd\u5b89\u88c5\u4f7f\u7528 OpenCV \uff1f \u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 OpenCV \uff1f\u5c31\u50cf\u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 Windows \u5462\uff1f\u8fd9\u4e9b\u95ee\u9898\u503c\u5f97\u601d\u8003\u3002 \u5f53\u7136\uff0c\u6211\u4eec\u627f\u8ba4\u8fd9\u5957\u65b9\u6848\uff0c\u867d\u7136\u8bc6\u522b\u51c6\u786e\u7387\u6ca1\u95ee\u9898\uff0c\u4f46\u5728\u8bc6\u522b\u6548\u7387\u4e0a\u8fd8\u6ca1\u6709\u8fbe\u5230 OpenCV \u6a21\u677f\u5339\u914d\u7684\u6548\u679c\uff0c\u6211\u4eec\u7684\u65b9\u6848\u6bcf\u6b21\u8bc6\u522b\u5728 1.5s \u5de6\u53f3\uff0c\u800c OpenCV \u5728 1s \u5de6\u53f3\uff1b \u6574\u4f53\u8bc6\u522b\u6548\u679c\u6765\u8bb2\uff0c\u6211\u8ba4\u4e3a\u8fd8\u662f\u53ef\u4ee5\u63a5\u53d7\u7684\uff0c\u4e5f\u5e0c\u671b\u6709\u5fd7\u4e4b\u58eb\u80fd\u4e00\u8d77\u4f18\u5316\u6b64\u65b9\u6848\uff0c\u4e00\u8d77\u6280\u672f\u62a5\u56fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32-rpc","title":"3.2\u3001\u57fa\u4e8e RPC \u670d\u52a1\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b","text":"\u5728\u8fdc\u7a0b\u670d\u52a1\u5668\u4e0a\u90e8\u7f72 OpenCV \u7684\u73af\u5883\uff0c\u5e76\u5c06\u5176\u90e8\u7f72\u4e3a RPC \u670d\u52a1\uff0c\u6d4b\u8bd5\u673a\u4e0a\u4e0d\u7528\u5b89\u88c5 OpenCV \u4f9d\u8d56\uff0c\u800c\u662f\u901a\u8fc7\u8bf7\u6c42 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u3010\u539f\u7406\u3011 \u6d4b\u8bd5\u673a\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u56fe\u7247\u4ee5\u53ca\u6a21\u677f\u56fe\u7247\uff0c\u53d1\u9001\u7ed9 RPC \u670d\u52a1\u7aef\uff0c\u670d\u52a1\u7aef\u62ff\u5230\u4e24\u5f20\u56fe\u7247\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u6700\u540e\u5c06\u8bc6\u522b\u7ed3\u679c\u8fd4\u56de\u7ed9\u6d4b\u8bd5\u673a\uff1b \u8981\u7279\u6b8a\u8bf4\u660e\u7684\u662f\uff1a RPC \u662f\u4e00\u79cd\u534f\u8bae\uff0c\u8bb8\u591a\u8bed\u8a00\u90fd\u662f\u652f\u6301\u7684\uff0c\u6bd4\u5982\u8bf4\u670d\u52a1\u7aef\u4e5f\u53ef\u4ee5\u7528 C++ \u6765\u5b9e\u73b0\uff0c\u5ba2\u6237\u7aef\u4f7f\u7528 Python \u4e5f\u662f\u53ef\u4ee5\u8c03\u7528\u7684\u3002 \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 \u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nimport cv2 as cv\nimport numpy as np\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\nif __name__ == \"__main__\":\nserver = ThreadXMLRPCServer((\"x.x.x.x\", 8889), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(match_image_by_opencv, \"match_image_by_opencv\")\nserver.serve_forever()\n \u8fd9\u6837\uff0c\u6211\u4eec\u57fa\u4e8e Python \u6807\u51c6\u5e93 xmlrpc \u642d\u5efa\u4e86\u4e00\u4e2a RPC \u670d\u52a1\u5668\uff0c\u6ce8\u518c\u4e86 image_put \u548c match_image_by_opencv \u4e24\u4e2a\u529f\u80fd\u63a5\u53e3\uff0c\u5728\u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u901a\u8fc7 IP \u548c\u7aef\u53e3\u8fdb\u884c RPC \u8bf7\u6c42\uff1b \u5ba2\u6237\u7aef\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from xmlrpc.client import Binary\nfrom xmlrpc.client import ServerProxy\nserver = ServerProxy(GlobalConfig.OPENCV_SERVER_HOST, allow_none=True)\nscreen_rb = open(screen, \"rb\")\ntemplate_rb = open(template_path, \"rb\")\ntry:\nscreen_path = server.image_put(Binary(screen_rb.read()))\nscreen_rb.close()\ntpl_path = server.image_put(Binary(template_rb.read()))\ntemplate_rb.close()\nreturn server.match_image_by_opencv(\ntpl_path, screen_path, rate, multiple\n)\nexcept OSError as exc:\nraise EnvironmentError(\nf\"RPC\u670d\u52a1\u5668\u94fe\u63a5\u5931\u8d25. {GlobalConfig.OPENCV_SERVER_HOST}\"\n) from exc\n \u901a\u8fc7\u8fd4\u56de server.match_image_by_opencv \u5c31\u83b7\u53d6\u4e86\u5728\u670d\u52a1\u7aef\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4","title":"4\u3001\u53f3\u952e\u83dc\u5355\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41","title":"4.1\u3001\u53f3\u952e\u83dc\u5355\u5b9a\u4f4d\u7684\u65b9\u6848\u53ca\u95ee\u9898","text":"\u53f3\u952e\u83dc\u5355\u7684\u5143\u7d20\u5b9a\u4f4d\u662f\u4e00\u4e2a\u96be\u70b9\uff0c\u8fc7\u53bb\u6211\u4eec\u8c03\u7814\u548c\u4f7f\u7528\u8fc7\u7684\u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u65b9\u6cd5\u6709 4 \u79cd\uff1a \u7b2c\u4e00\u79cd\uff1a\u6b65\u957f\u64cd\u4f5c\u6cd5 \u5728\u53f3\u952e\u83dc\u5355\u547c\u51fa\u6765\u4e4b\u540e\uff0c\u901a\u8fc7\u952e\u76d8\u7684 up\u3001down \u6309\u952e\uff0c\u8fdb\u884c\u9009\u62e9\u83dc\u5355\u9009\u62e9\uff0c\u9009\u4e2d\u76ee\u6807\u4e4b\u540e enter \u5373\u53ef\uff1b\u6bd4\u5982\uff1a\u5728\u684c\u9762\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\uff0c\u6309 1 \u6b21 down \uff0c\u4f1a\u51fa\u73b0\u4e0b\u56fe\uff1a \u7ee7\u7eed\u518d\u6309 2 \u6b21 down\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u518d\u6309 enter\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u5982\u6b64\uff0c\u201c\u6392\u5e8f\u65b9\u5f0f\u201d\u7684\u6b65\u957f\u4e3a 3\uff1b\u901a\u8fc7\u4f7f\u7528\u952e\u76d8\u4e0a\u4e0b\u952e\uff0c\u5c31\u5b9e\u73b0\u4e86\u5bf9\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\uff1b \u4f46\u662f\uff0c\u8fd9\u79cd\u65b9\u5f0f\u6709\u4e2a\u5f88\u70e6\u4eba\u7684\u95ee\u9898\uff0c\u5c31\u662f\u53f3\u952e\u83dc\u5355\u7684\u9009\u9879\u4f4d\u7f6e\u4e0d\u53ef\u80fd\u4e00\u76f4\u4e0d\u53d8\uff0c\u5728\u9700\u6c42\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\uff0c\u83dc\u5355\u9009\u9879\u7684\u53d8\u5316\u662f\u5f88\u5927\u7684\uff0c\u751a\u81f3\u6709\u4e9b\u5e94\u7528\u652f\u6301\u81ea\u5b9a\u4e49\u83dc\u5355\uff0c\u6bd4\u5982\u6587\u7ba1\u53f3\u952e\u83dc\u5355\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff1b \u4e5f\u5c31\u662f\u8bf4\u4f60\u5f97\u7ecf\u5e38\u53bb\u7ef4\u62a4\u83dc\u5355\u9009\u9879\u7684\u6b65\u957f\uff0c\u4e00\u4e2a\u9009\u9879\u73b0\u5728\u7684\u6b65\u957f\u662f 3\uff0c\u4e0b\u4e2a\u8fed\u4ee3\u53ef\u80fd\u5c31\u662f 4 \u6216\u8005 5\u3002 \u7b2c\u4e8c\u79cd\uff1a\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u6cd5 \u628a\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5355\u72ec\u622a\u56fe\u4fdd\u5b58\uff0c\u56fe\u7247\u4e2d\u4ec5\u5305\u542b\u4e00\u4e2a\u83dc\u5355\u9009\u9879\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u8fd9\u6837\uff0c\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5c31\u53ef\u4ee5\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u65b9\u5f0f\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u8fd9\u79cd\u65b9\u5f0f\u4e0d\u7528\u62c5\u5fc3\u83dc\u5355\u9009\u9879\u7684\u987a\u5e8f\u6216\u4f4d\u7f6e\uff0c\u4f46\u662f\u9700\u8981\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff0c\u4e14\u5bb9\u6613\u53d7\u5230\u5b57\u4f53 UI \u53d8\u66f4\u7c7b\u9700\u6c42\u7684\u5f71\u54cd\uff0c\u6bd4\u5982\uff1a\u5b57\u4f53\u5927\u5c0f\u3001\u5b57\u4f53\u95f4\u8ddd\u7b49\u7b49\u9700\u6c42\u53d8\u66f4\u90fd\u4f1a\u5f71\u54cd\uff0c\u6bcf\u6b21\u53d8\u66f4\u4e4b\u540e\u5c31\u9700\u8981\u8fdb\u884c\u5927\u91cf\u56fe\u7247\u8d44\u6e90\u7684\u91cd\u65b0\u622a\u56fe\u66ff\u6362\uff0c\u662f\u4e2a\u6bd4\u8f83\u9ebb\u70e6\u7684\u4e8b\u60c5\uff1b \u7b2c\u4e09\u79cd\uff1a\u76f8\u5bf9\u4f4d\u79fb\u6cd5 \u9f20\u6807\u70b9\u51fb\u53f3\u952e\u7684\u65f6\u5019\uff0c\u9f20\u6807\u7684\u5f53\u524d\u5750\u6807\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u7684\uff0c\u83dc\u5355\u9009\u9879\u7684\u5bbd\uff08 w \uff09\u4e00\u822c\u662f\u56fa\u5b9a\u7684\uff0c\u53d8\u5316\u7684\u662f\u83dc\u5355\u7684\u957f\u5ea6\uff08 h \uff09\uff0c\u53ef\u4ee5\u901a\u8fc7\u67d0\u4e2a\u9009\u9879\u76f8\u5bf9\u4e8e\u9f20\u6807\u7684\u8ddd\u79bb\u5728\u786e\u5b9a\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u901a\u8fc7\u7ef4\u62a4\u83dc\u5355\u9009\u9879\uff08\u76f8\u5bf9\u4f4d\u7f6e\uff09\u76f8\u5bf9\u4e8e\u9f20\u6807\u4f4d\u7f6e\u7684\u8ddd\u79bb\uff0c\u5373\u53ef\u8f7b\u677e\u8ba1\u7b97\u51fa\u83dc\u5355\u9009\u9879\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\u3002 \u4ece\u7406\u8bba\u4e0a\u6b64\u65b9\u6848\u662f\u53ef\u884c\u7684\uff0c\u4f46\u662f\u8fd9\u91cc\u4ecd\u7136\u5b58\u5728\u4e24\u4e2a\u4e25\u91cd\u7684\u95ee\u9898\uff1a \u83dc\u5355\u987a\u5e8f\u6539\u53d8\uff0c\u5bfc\u81f4\u76f8\u5bf9\u8ddd\u79bb\u6539\u53d8\uff0c\u800c\u4e14\u8ddd\u79bb\u662f\u901a\u8fc7\u50cf\u7d20\uff08px\uff09\u6765\u8868\u793a\u7684\uff0c\u4e0d\u60f3\u6b65\u957f\u90a3\u4e48\u53ea\u7ba1\uff0c\u6bcf\u6b21\u9700\u8981\u53bb\u91cf\u4e00\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u70b9\u9ebb\u70e6\uff1b \u9f20\u6807\u5728\u684c\u9762\u4e0d\u540c\u4f4d\u7f6e\u70b9\u51fb\u53f3\u952e\uff0c\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u4f4d\u7f6e\u662f\u4e0d\u540c\u7684\uff0c\u4e0a\u56fe\u7684\u83dc\u5355\u662f\u5728\u9f20\u6807\u7684\u5de6\u4e0b\u65b9\uff0c\u5982\u679c\u4f60\u79fb\u52a8\u9f20\u6807\u5230\u5c4f\u5e55\u56db\u8fb9\uff0c\u4f60\u4f1a\u53d1\u73b0\uff0c\u53f3\u952e\u83dc\u5355\u53ef\u80fd\u51fa\u73b0\u5728\u9f20\u6807\u7684\u56db\u4e2a\u65b9\u5411\uff0c\u4e5f\u5c31\u662f\u8bf4\u4f60\u9700\u8981\u6839\u636e\u9f20\u6807\u7684\u4e0d\u540c\u4f4d\u7f6e\u6765\u5224\u65ad\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u65b9\u5411\uff0c\u800c\u4e0d\u540c\u7684\u65b9\u5411\u4e0a\u8ba1\u7b97\u65b9\u6cd5\u662f\u4e0d\u540c\u7684\uff0c\u6bd4\u5982\uff1a\u53f3\u952e\u83dc\u5355\u5728\u9f20\u6807\u7684\u5de6\u4e0a\uff0c\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\u8ba1\u7b97\u65b9\u6cd5\u4e3a\uff08x - w / 2\uff0c y - h\uff09\uff0c\u8fd9\u6837\u7ef4\u62a4\u8d77\u6765\u53ef\u4ee5\u8bf4\u975e\u5e38\u590d\u6742\uff1b \u57fa\u4e8e\u4ee5\u4e0a\u4e24\u4e2a\u539f\u56e0\uff0c\u6211\u4eec\u5e76\u4e0d\u63a8\u8350\u8fd9\u79cd\u64cd\u4f5c\u65b9\u6848\u3002 \u7b2c\u56db\u79cd\uff1a\u5c5e\u6027\u5b9a\u4f4d \u6709\u540c\u5b66\u8bf4\u5e72\u561b\u4e0d\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u5462\uff0c\u5176\u5b9e\uff0c\u6211\u4eec\u6700\u5f00\u59cb\u60f3\u5230\u7684\u65b9\u6848\u5c31\u662f\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\uff0c\u4f46\u662f\u5728\u5c5e\u6027\u7684 DOM \u6811\u91cc\u600e\u4e48\u4e5f\u627e\u4e0d\u5230\uff0c\u65e0\u6cd5\u5b9a\u4f4d\u5230\uff0c\u6211\u4eec\u4e5f\u8054\u5408\u7814\u53d1\u540c\u5b66\u4e00\u8d77\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u4f46\u6700\u7ec8\u8fd8\u662f\u6ca1\u80fd\u89e3\u51b3\uff0c\u975e\u5e38\u9057\u61be\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42","title":"4.2\u3001\u6700\u65b0\u7684\u53f3\u952e\u83dc\u5355\u7ec8\u6781\u89e3\u51b3\u65b9\u6848","text":"\u7531\u4e8e\u53f3\u952e\u83dc\u5355\u9009\u9879\u51e0\u4e4e\u90fd\u662f\u6587\u672c\uff0c\u90a3\u4e48\u901a\u8fc7 OCR \u8bc6\u522b\uff0c\u51e0\u4e4e\u662f\u6700\u4f18\u7684\u65b9\u6848\uff1a \u4e0d\u7528\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff1b \u4e0d\u4f1a\u53d7\u5230\u83dc\u5355\u9009\u9879\u987a\u5e8f\u6539\u53d8\u7684\u5f71\u54cd\uff1b \u4e0d\u4f1a\u53d7\u5230\u5b57\u4f53 UI \u53d8\u5316\u7684\u5f71\u54cd\uff1b \u5173\u4e8e OCR \u8bc6\u522b\u6211\u4eec\u5728\u540e\u9762\u4f1a\u8be6\u7ec6\u8bb2\u5230\uff0c\u672c\u7ae0\u8282\u4e3b\u8981\u8bb2\u57fa\u4e8e OCR \u8bc6\u522b\uff0c\u6211\u4eec\u5728\u53f3\u952e\u83dc\u5355\u8bc6\u522b\u4e0a\u7684\u7a81\u7834\u548c\u521b\u65b0\uff1b \u4f7f\u7528 OCR \u8bc6\u522b\u53f3\u952e\u83dc\u5355\u867d\u7136\u5df2\u7ecf\u5f88\u5b8c\u7f8e\u4e86\uff0c\u4f46\u662f\u5728\u4e00\u4e9b\u60c5\u51b5\u4e0b\u4ecd\u7136\u5b58\u5728\u4e00\u70b9\u95ee\u9898\uff0c\u5c31\u662f\u5c4f\u5e55\u4e2d\u51fa\u73b0\u591a\u4e2a\u548c\u83dc\u5355\u9009\u9879\u6587\u5b57\u76f8\u540c\u7684\u6587\u5b57\u65f6\uff0c\u6bd4\u5982\u4e0b\u9762\u8fd9\u79cd\u60c5\u51b5\uff1a \u5c4f\u5e55\u6070\u597d\u51fa\u73b0\u4e86\u4e24\u4e2a\u201c\u590d\u5236\u201d\uff0c\u6b64\u65f6\u8981\u5b9a\u4f4d\u5230\u83dc\u5355\u4e2d\u7684 \u201c\u590d\u5236\u201d\uff0c\u5c31\u9700\u8981\u8fdb\u4e00\u6b65\u505a\u6570\u636e\u5904\u7406\uff0c\u6bd4\u5982\uff1aOCR \u8fd4\u56de 2 \u4e2a\u201c\u590d\u5236\u201d\u7684\u5750\u6807\uff0c\u7528\u4f8b\u91cc\u9762\u6765\u5224\u65ad\u7528\u54ea\u4e2a\uff0c\u4ece\u4e1a\u52a1\u4e0a\u5c06\u5904\u7406\u8d77\u6765\u6bd4\u8f83\u9ebb\u70e6\uff0c\u56e0\u4e3a\u4f60\u5f97\u660e\u786e\u77e5\u9053\u83dc\u5355\u5728\u5de6\u8fb9\u8fd8\u662f\u53f3\u8fb9\uff0c\u7136\u540e\u8fd9\u672c\u8eab\u5c31\u662f\u4e0d\u786e\u5b9a\u7684\uff1b \u600e\u4e48\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u5462\uff0c\u8fd9\u5c31\u8981\u8bf4\u9053\u672c\u7ae0\u7684\u4e3b\u9898\uff1a\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b\u3002 \u3010\u539f\u7406\u3011 \u5728\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u524d\u622a\u4e00\u5f20\u56fe\uff0c\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\u518d\u622a\u53d6\u4e00\u5f20\u56fe\uff0c\u4e24\u5f20\u56fe\u552f\u4e00\u53d8\u5316\u7684\u5c31\u662f\u53f3\u952e\u83dc\u5355\uff0c\u5c06\u5176\u4ed6\u76f8\u540c\u7684\u5730\u65b9\u90fd\u5c4f\u853d\u6389\uff0c\u53ea\u7559\u4e0b\u83dc\u5355\u754c\u9762\uff0c\u5982\u6b64\u5373\u53ef\u6d88\u9664\u5e72\u6270\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u5c06\u4e24\u79cd\u56fe\u505a\u524d\u540e\u5bf9\u6bd4\u63d0\u53d6\u53ef\u4ee5\u5f97\u5230\u8fd9\u6837\u7684\u56fe\uff1a \u4f60\u770b\uff0c\u901a\u8fc7\u524d\u540e\u56fe\u7247\u7684\u5bf9\u6bd4\uff0c\u5c06\u76f8\u540c\u7684\u90e8\u5206\u7ed9\u6d88\u9664\u6389\uff0c\u518d\u8fdb\u884c OCR \u8bc6\u522b\uff0c\u8fd9\u6837\u5c31\u4e0d\u4f1a\u6709\u5e72\u6270\u4e86\uff1b \u4ee3\u7801\u5b9e\u73b0\u8bf7\u67e5\u770b src/filter_image.py \uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def filter_image(action):\n\"\"\"\n \u5bf9\u6bd4\u52a8\u4f5c\u524d\u540e\u4e24\u5f20\u56fe\u7247\uff0c\u63d0\u53d6\u4e0d\u540c\u7684\u90e8\u5206\u751f\u6210\u4e00\u5f20\u65b0\u7684\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u65b0\u56fe\u7247\u7684\u8def\u5f84\n :param action: \u52a8\u4f5c\u51fd\u6570\u7684\u51fd\u6570\u5bf9\u8c61\n :return: \u65b0\u56fe\u7247\u7684\u8def\u5f84\n \"\"\"\n action \u662f\u9f20\u6807\u4e8b\u4ef6\uff0c\u56e0\u4e3a\u6b64\u7c7b\u573a\u666f\u4e0d\u4ec5\u4ec5\u5728\u53f3\u952e\u5b58\u5728\uff0c\u5355\u51fb\u3001\u53cc\u51fb\u7b49\u7b49\uff0c\u53ea\u8981\u64cd\u4f5c\u524d\u540e\u540e\u53d8\u5316\u7684\u90fd\u53ef\u4ee5\uff1a from src.mouse_key import MouseKey\naction = (\nMouseKey.click,\nMouseKey.right_click,\nMouseKey.double_click,\nMouseKey.move_to,\n)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5","title":"5\u3001\u52a8\u6001\u56fe\u50cf\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5728\u684c\u9762\u58c1\u7eb8\u5207\u6362\uff0c\u6216\u770b\u56fe\u3001\u76f8\u518c\u5207\u6362\u56fe\u7247\u7c7b\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u7531\u4e8e\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u662f\u4e0d\u56fa\u5b9a\u7684\uff08\u4e0d\u540c\u7248\u672c\u7684\u7cfb\u7edf\u58c1\u7eb8\u4e0d\u540c\u3001\u58c1\u7eb8\u987a\u5e8f\u4e0d\u540c\uff0c\u770b\u56fe\u76f8\u518c\u5728\u56fe\u7247\u8d44\u6e90\u4e0d\u4e00\u5b9a\u56fa\u5b9a\uff09\uff0c\u90a3\u4e48\u5728\u6d4b\u8bd5\u5207\u6362\u58c1\u7eb8\u6216\u8005\u5207\u6362\u56fe\u7247\u7684\u573a\u666f\u65f6\u5c31\u4f1a\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u4f60\u4e0d\u77e5\u9053\u9884\u671f\u662f\u5565\uff0c\u7528\u4f8b\u64cd\u4f5c\u52a8\u6001\u7684\uff0c\u4e5f\u662f\u6781\u4e0d\u7a33\u5b9a\u3002 \u3010\u539f\u7406\u3011 \u5728\u5207\u6362\u56fe\u7247\u4e4b\u524d\u622a\u56fe\u4fdd\u5b58\u5e76\u8fd4\u56de\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u6b21\u8bc6\u522b\u8fd9\u5f20\u56fe\u7247\uff0c\u5982\u679c\u4e0d\u5b58\u5728\uff0c\u8bf4\u660e\u56fe\u7247\u5df2\u7ecf\u5207\u6362\u4e86\uff1b \u793a\u610f\u56fe\uff1a \u8fd9\u6837\uff0c\u6211\u4eec\u622a\u53d6\u4e86\u5f53\u524d\u56fe\u7247\u4e2d\u6bd4\u8f83\u6709\u4ee3\u8868\u6027\u7684\u4f4d\u7f6e\uff08\u4e00\u53ea\u9e1f\uff09\uff0c\u5728\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u7528\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1a \u6211\u4eec\u518d\u62ff\u7740\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd9\u6837\u5728\u5f53\u524d\u56fe\u7247\u4e2d\uff0c\u5c31\u4e0d\u80fd\u627e\u5230\u8fd9\u53ea\u9e1f\u4e86\uff0c\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u662f False\uff0c\u90a3\u4e48\u4e5f\u5c31\u53ef\u4ee5\u5224\u65ad\u56fe\u7247\u5207\u6362\u662f\u6210\u529f\u7684\u3002 \u4ee3\u7801\u793a\u610f\uff1a def save_temporary_picture(_x: int, _y: int, width: int, height: int):\n\"\"\"\n \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u56fe\u7247\u8def\u5f84\n :param x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n :param y: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n :param width: \u5bbd\u5ea6\n :param height: \u9ad8\u5ea6\n :return: \u56fe\u7247\u8def\u5f84\n \"\"\"\n \u6b64\u51fd\u6570\u7528\u4e8e\u5728\u64cd\u4f5c\u4e4b\u524d\u622a\u56fe\u4e00\u5f20\u4e34\u65f6\u56fe\u7247\uff0c\u8fd4\u56de\u56fe\u7247\u8def\u5f84\uff0c\u6700\u540e\u5728\u65ad\u8a00\u7684\u65f6\u5019\u518d\u5c06\u56fe\u7247\u8def\u5f84\u4f5c\u4e3a\u53c2\u6570\u4f20\u5165\u65ad\u8a00\u8bed\u53e5\u5373\u53ef\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ui","title":"\u4e09\u3001\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_1","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u662f\u6211\u4eec\u81ea\u7814\u7684\u4e00\u79cd\u4f7f\u7528\u7b80\u5355\uff0c\u4e14\u6548\u7387\u6781\u9ad8\u3001\u7a33\u5b9a\u6027\u597d\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u57fa\u4e8e\u5143\u7d20\u6309\u94ae\u5728\u5e94\u7528\u4e2d\u7684\u76f8\u5bf9\u4f4d\u7f6e\uff0c\u52a8\u6001\u83b7\u53d6\u5143\u7d20\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff0c\u9002\u7528\u4e8e\u5404\u79cd\u5c4f\u5e55\u5206\u8fa8\u7387\uff08\u5305\u62ec\u9ad8\u5206\u5c4f\u3001\u5bbd\u5c4f\u3001\u5e26\u9c7c\u5c4f\uff09\uff0c\u5f53\u5143\u7d20\u6309\u94ae\u4f4d\u7f6e\u76f8\u5bf9\u4e8e\u5e94\u7528\u754c\u9762\u4f4d\u7f6e\u53d1\u751f\u4fee\u6539\u4e4b\u540e\uff0c\u53ea\u9700\u8981\u6839\u636e UI \u8bbe\u8ba1\u56fe\u4e0a\u7684\u6e90\u6570\u636e\u4fee\u6539\u5bf9\u5e94\u5750\u6807\u6570\u636e\u5c31\u597d\uff0c\u7ef4\u62a4\u975e\u5e38\u7684\u65b9\u4fbf\u3002 \u6b64\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u9002\u7528\u4e8e\u4e00\u4e9b\u5143\u7d20\u4f4d\u7f6e\u76f8\u5bf9\u4e0e\u5e94\u7528\u754c\u9762\u6bd4\u8f83\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u97f3\u4e50\uff0899% \u7684\u5143\u7d20\u5b9a\u4f4d\u91c7\u7528\u8fd9\u79cd\uff0c\u6548\u679c\u975e\u5e38\u597d\uff09\uff0c\u4e0d\u9002\u7528\u4e8e\u754c\u9762\u4e0d\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u622a\u56fe\u5f55\u5c4f\uff0c\u5f88\u660e\u663e\u4e0d\u9002\u7528\u4e8e\u8fd9\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u3002\u8fd9\u79cd\u5168\u65b0\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u6709\u5b83\u7684\u9002\u7528\u6761\u4ef6\uff0c\u5982\u679c\u4f60\u53d1\u73b0\u4f7f\u7528\u5e38\u89c4\u7684\uff08\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u5b9a\u4f4d\uff09\u4e0d\u597d\u505a\u65f6\uff0c\u4e0d\u59a8\u8003\u8651\u4f7f\u7528\u8fd9\u79cd\uff0c\u5176\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff0c\u5e76\u4e14\u8fc5\u901f\u7231\u4e0a\u4ed6\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_1","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5728 UI \u8bbe\u8ba1\u56fe\u4e2d\u6211\u4eec\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u8fb9\u6846\u7684\u8ddd\u79bb\u7684\uff0c\u7136\u540e\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u6280\u672f\u624b\u6bb5\u83b7\u53d6\u5230\u5e94\u7528\u754c\u9762\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u53ca\u5e94\u7528\u7a97\u53e3\u7684\u5927\u5c0f\uff0c\u793a\u610f\u56fe\u5982\u4e0b\uff1a \uff08x1, y1\uff09\u4e3a\u5e94\u7528\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\uff1b\uff08x2, y2\uff09\u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u5de6\u4e0a\u89d2\uff08x1, y1\uff09\u7684\u5750\u6807\uff0c\u90a3\u4e48\u5b9e\u9645\u4e0a\u3010\u64ad\u653e\u6240\u6709\u3011\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\u4e3a\uff1a\uff08 x1 + x2, y1 + y2 \uff09\uff1b \u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5927\u5c0f\uff08w2, h2\uff09\uff0c\u53ef\u4ee5\u4ece UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\uff1b \u5728 UI \u8bbe\u8ba1\u7a3f\u4e0a\u70b9\u51fb\u3010\u64ad\u653e\u6240\u6709\u3011\u56fe\u6807\uff0c\u7136\u540e\u79fb\u52a8\u9f20\u6807\u5c31\u5c31\u53ef\u4ee5\u770b\u5230\u4e0a\u56fe\u7684\u53c2\u8003\u7ebf\u53ca\u6570\u636e\uff1b \u6240\u4ee5\uff0c\u6211\u4eec\u53ef\u4ee5\u8f7b\u677e\u7684\u83b7\u53d6\u5230\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u4e2d\u5fc3\u5750\u6807\u4e3a\uff1a\uff08 x1 + x2 + (w2 / 2), y1 + y2 + ( h2 / 2) \uff09 \u8be6\u7ec6\u6e90\u4ee3\u7801\u8bf7\u67e5\u770b AT \u57fa\u7840\u6846\u67b6: src/button_center.py \u83b7\u53d6\u5e94\u7528\u7a97\u53e3\u7684\u4fe1\u606f \u4f7f\u7528 xdotool \u548c xwininfo \u83b7\u53d6\u5230\u5e94\u7528\u7a97\u53e3\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u5de6\u4e0a\u89d2\uff09\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a app_id = CmdCtl.run_cmd(f\"xdotool search --classname --onlyvisible {self.app_name}\"\n).split(\"\\n\")\napp_id_list = [int(_id) for _id in app_id if _id]\nreturn CmdCtl.run_cmd(f\"xwininfo -id {app_id_list[self.number]}\")\n \u4f7f\u7528\u6b63\u5219\u83b7\u53d6\u7a97\u53e3\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u83b7\u53d6\u914d\u7f6e \u8bfb ini \u914d\u7f6e\u6587\u4ef6\uff0c\u83b7\u53d6\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e0e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a conf = ConfigParser()\nconf.read(self.config_path)\ndirection = conf.get(btn_name, \"direction\")\nposition = [int(i.strip()) for i in conf.get(btn_name, \"location\").split(\",\")]\n \u8ba1\u7b97\u5143\u7d20\u6309\u94ae\u5750\u6807 \u6839\u636e\u5e94\u7528\u7a97\u53e3\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u5927\u5c0f\u3001\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u5927\u5c0f\uff0c\u4f7f\u7528\u4e00\u5b9a\u7684\u7b97\u6cd5\u5373\u53ef\u8ba1\u7b97\u51fa\u5143\u7d20\u6309\u94ae\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u4e2d\u5fc3\u5750\u6807\uff09\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3","title":"3\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u3010\u914d\u7f6e\u65b9\u6cd5\u3011 \u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u7684\u6570\u636e\u6e90\u662f\u5e94\u7528\u5e93\u4e2d\u7684 ui.ini \u914d\u7f6e\u6587\u4ef6\uff1a ;section\n[\u65b0\u5efa\u6b4c\u5355+] ;key = value\ndirection = left_top\nlocation = 180, 268, 21, 21\n section \u662f\u4f60\u6839\u636e\u5bf9\u5e94\u7684\u5143\u7d20\u6309\u94ae\u547d\u540d\uff0c\u4f60\u53ef\u4ee5\u4efb\u610f\u547d\u540d\uff0c\u4f46\u6700\u597d\u6709\u5177\u4f53\u542b\u4e49\uff0c\u4e14\u80fd\u660e\u786e\u8868\u793a\u8fd9\u4e2a\u5143\u7d20\u6309\u94ae\u7684\u540d\u79f0\uff1b\u7528\u4e2d\u62ec\u53f7\u62ec\u8d77\u6765\u5c31\u884c\uff0c\u6bd4\u5982\uff1a[\u65b0\u5efa\u6b4c\u5355+] \uff1b direction \u662f\u914d\u7f6e\u8be5\u5143\u7d20\u7684\u53c2\u8003\u7cfb\uff0c\u5206\u522b\u4e3a\uff1a left_top \u5de6\u4e0a\uff1b left_bottom \u5de6\u4e0b\uff1b right_top \u53f3\u4e0a\uff1b right_bottom \u53f3\u4e0b\uff1b \u53c2\u8003\u7cfb\u7684\u9009\u53d6\u6807\u51c6\uff1a\u62c9\u52a8\u6539\u53d8\u7a97\u53e3\u5927\u5c0f\u65f6\uff0c\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u53c2\u8003\u7cfb\u4f4d\u7f6e\u662f\u4e0d\u53d8\u7684\uff1b location \u662f\u8be5\u5143\u7d20\u6309\u94ae\u7684\u76f8\u5bf9\u4e0e\u53c2\u8003\u7cfb\u7684 x, y \u7684\u8ddd\u79bb\uff0c\u53ca\u5927\u5c0f(w, h)\uff0c\u8fd9\u56db\u4e2a\u6570\u636e\u53ef\u4ee5\u901a\u8fc7 UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\u6570\u636e\uff0c\u5728\u7f16\u8f91\u6a21\u5f0f\u4e0b\uff0c\u70b9\u51fb UI \u56fe\u4e0a\u7684\u6309\u94ae\uff0c\u53f3\u4fa7\u5c31\u4f1a\u51fa\u73b0\u8be5\u5143\u7d20\u6309\u94ae\u7684 x, y, w, h \u6570\u636e\u3002 \u5982\u679c UI \u56fe\u4e0a\u6ca1\u6709\u63d0\u4f9b\u4f60\u60f3\u8981\u7684\u5143\u7d20\u6570\u636e\uff0c\u4f60\u53ef\u4ee5\u76f4\u63a5\u5728\u7cfb\u7edf\u4e2d\u4f7f\u7528\u622a\u56fe\u5f55\u5c4f\u8fdb\u884c\u5c3a\u91cf\uff0c\u8fd9\u662f\u4e00\u79cd\u4e0d\u63a8\u8350\u4f46\u80fd\u7528\u7684\u65b9\u6cd5\u3002 \u3010\u8c03\u7528\u65b9\u6cd5\u3011 \u5728\u5e94\u7528\u5e93\u65b9\u6cd5\u5c42\u8fd9\u6837\u5199\uff1a def click_add_music_list_btn_in_music_by_ui(self):\n\"\"\"\u70b9\u51fb\u65b0\u5efa\u6b4c\u5355\u6309\u94ae\"\"\"\nself.click(*self.ui.btn_center(\"\u65b0\u5efa\u6b4c\u5355+\"))\n self.ui.btn_center() \u662f\u56fa\u5b9a\u5199\u6cd5\uff0c\u53c2\u6570\u5c31\u662f\u914d\u7f6e\u91cc\u9762\u7684 section \u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ocr","title":"\u56db\u3001OCR \u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_2","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 OCR \u65b9\u6848\u5927\u591a\u91c7\u7528\u8c37\u6b4c OCR\uff08Tesseract\uff09\u65b9\u6848\uff0c\u4f46\u662f\u5b83\u5bf9\u4e8e\u4e2d\u6587\u7684\u8bc6\u522b\u975e\u5e38\u5dee\uff0c\u7ecf\u8fc7\u5927\u91cf\u7684\u8c03\u7814\uff0c\u6211\u4eec\u4f7f\u7528 PaddleOCR\uff0c\u5b83\u662f\u4e00\u4e2a\u5f00\u6e90\u7684\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u8bc6\u522b\u5de5\u5177\uff0c\u4e5f\u662f PaddlePaddle \u6700\u6709\u540d\u7684\u4e00\u4e2a\u5f00\u6e90\u9879\u76ee\uff0c\u611f\u5174\u8da3\u7684\u53ef\u4ee5\u70b9\u8fd9\u91cc\u4e86\u89e3\uff0c\u591a\u7684\u4e0d\u8bf4\u4e86\uff0c\u4f60\u53ea\u9700\u8981\u77e5\u9053\u5b83\u5c31\u662f\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_2","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5b89\u88c5\u4ed6\u662f\u4e2a\u5f88\u9ebb\u70e6\u7684\u4e8b\u60c5\uff0c\u867d\u7136\u64cd\u4f5c\u5f88\u7b80\u5355\uff0c\u4f46\u5176\u5b9e\u5b89\u88c5\u5305\u6709\u70b9\u5927\uff0c\u56e0\u6b64\u6211\u4eec\u4e0d\u5e0c\u671b\u76f4\u63a5\u5728 env.sh \u4e2d\u52a0\u5165\u5b83\uff0c\u8fd9\u4f1a\u8ba9\u6574\u4e2a\u81ea\u52a8\u5316\u73af\u5883\u53d8\u5f97\u975e\u5e38\u81c3\u80bf\uff1b \u56e0\u6b64\uff0c\u6211\u4eec\u60f3\u5230\u5c06\u5b83\u505a\u6210\u4e00\u4e2a RPC \u670d\u52a1\u5728\u5176\u4ed6\u673a\u5668\u4e0a\u90e8\u7f72\uff0c\u6d4b\u8bd5\u673a\u901a\u8fc7\u8fdc\u7a0b\u8c03\u7528 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u4f7f\u7528\u5b83\uff1b RPC \u7684\u8c03\u7528\u903b\u8f91\uff1a \u8fd9\u6837\u6211\u4eec\u53ea\u9700\u8981\u5728\u670d\u52a1\u7aef\u90e8\u7f72\u597d OCR \u8bc6\u522b\u7684\u670d\u52a1\uff0c\u7136\u540e\u901a\u8fc7 RPC \u670d\u52a1\u5c06\u529f\u80fd\u63d0\u4f9b\u51fa\u6765\uff0c\u6846\u67b6\u91cc\u9762\u53ea\u9700\u8981\u8c03\u7528\u5bf9\u5e94\u7684 RPC \u63a5\u53e3\u5c31\u884c\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_1","title":"3\u3001\u4f7f\u7528\u8bf4\u660e","text":"\u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nfrom paddleocr import PaddleOCR\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef paddle_ocr(pic_path, lang):\n\"\"\"\n Paddleocr\u76ee\u524d\u652f\u6301\u7684\u591a\u8bed\u8a00\u8bed\u79cd\u53ef\u4ee5\u901a\u8fc7\u4fee\u6539lang\u53c2\u6570\u8fdb\u884c\u5207\u6362\n \u4f8b\u5982`ch`, `en`, `fr`, `german`, `korean`, `japan`\n :param file_name:\n :param lang:\n :return:\n \"\"\"\nif __name__ == \"__main__\":\nIP = popen(\"hostname -I\").read().split(\" \")[0]\nPORT = 8890\nSCREEN_CACHE = \"/tmp/screen.png\"\nserver = ThreadXMLRPCServer((IP, PORT), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(paddle_ocr, \"paddle_ocr\")\nprint(\"\u76d1\u542c\u5ba2\u6237\u7aef\u8bf7\u6c42\u3002\u3002\")\nserver.serve_forever()\n \u6846\u67b6\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from src import OCR\nOCR.ocr(*target_strings, picture_abspath=None, similarity=0.6, return_default=False, return_first=False, lang=\"ch\"):\n# \u901a\u8fc7 OCR \u8fdb\u884c\u8bc6\u522b\u3002\n# target_strings:\n# \u76ee\u6807\u5b57\u7b26,\u8bc6\u522b\u4e00\u4e2a\u5b57\u7b26\u4e32\u6216\u591a\u4e2a\u5b57\u7b26\u4e32,\u5e76\u8fd4\u56de\u5176\u5728\u56fe\u7247\u4e2d\u7684\u5750\u6807;\n# \u5982\u679c\u4e0d\u4f20\u53c2\uff0c\u8fd4\u56de\u56fe\u7247\u4e2d\u8bc6\u522b\u5230\u7684\u6240\u6709\u5b57\u7b26\u4e32\u3002\n# picture_abspath: \u8981\u8bc6\u522b\u7684\u56fe\u7247\u8def\u5f84\uff0c\u5982\u679c\u4e0d\u4f20\u9ed8\u8ba4\u622a\u53d6\u5168\u5c4f\u8bc6\u522b\u3002\n# similarity: \u5339\u914d\u5ea6\u3002\n# return_default: \u8fd4\u56de\u8bc6\u522b\u7684\u539f\u751f\u6570\u636e\u3002\n# return_first: \u53ea\u8fd4\u56de\u7b2c\u4e00\u4e2a,\u9ed8\u8ba4\u4e3a False,\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u6240\u6709\u6570\u636e\u3002\n# lang: `ch`, `en`, `fr`, `german`, `korean`, `japan`\n \u6b64\u65b9\u6848\u5728\u6846\u67b6\u5185\u6ca1\u6709\u5f15\u5165\u4efb\u4f55\u4e09\u65b9\u4f9d\u8d56\u5b8c\u5168\u91c7\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\uff0c\u800c\u4e14\u4f7f\u7528\u65b9\u6cd5\u975e\u5e38\u7b80\u5355\uff0c\u53ea\u9700\u8981\u901a\u8fc7 OCR.ocr() \u5373\u53ef\uff1b \u5bf9\u4e8e\u4e00\u4e9b\u6587\u6848\u7684\u573a\u666f\u975e\u5e38\u9002\u7528\uff0c\u6b64\u65b9\u6cd5\u76f4\u63a5\u8fd4\u56de\u5750\u6807\uff0c\u53ef\u4ee5\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u3002 \u4e5f\u53ef\u4ee5\u7528\u4e8e\u6587\u5b57\u65ad\u8a00\uff0c\u4ee3\u7801\u793a\u610f\uff1a def assert_ocr_exist(\n*args, picture_abspath=None, similarity=0.6, return_first=False, lang=\"ch\"\n):\n\"\"\"\u65ad\u8a00\u6587\u6848\u5b58\u5728\"\"\"\npic = None\nif picture_abspath is not None:\npic = picture_abspath + \".png\"\nres = OCR.ocr(\n*args,\npicture_abspath=pic,\nsimilarity=similarity,\nreturn_first=return_first,\nlang=lang,\n)\nif res is False:\nraise AssertionError(\n(f\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{args}\", f\"{pic if pic else GlobalConfig.SCREEN_CACHE}\")\n)\nif isinstance(res, tuple):\npass\nelif isinstance(res, dict) and False in res.values():\nres = filter(lambda x: x[1] is False, res.items())\nraise AssertionError(\n(\nf\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{dict(res)}\",\nf\"{pic if pic else GlobalConfig.SCREEN_CACHE}\",\n)\n)\n \u5728\u7528\u4f8b\u4e2d\u4f7f\u7528\u65ad\u8a00\uff0c\u793a\u4f8b\uff1a def test_font_manager_021(self):\n\"\"\"\u53f3\u4fa7\u2665-\u6536\u85cf/\u53d6\u6d88\u6536\u85cf\u5b57\u4f53\"\"\"\n# \u5b57\u4f53\u7ba1\u7406\u5668\u754c\u9762\u53f3\u4fa7\u8be6\u60c5\u5217\u8868\uff0c\u9009\u62e9\u672a\u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e / \u6536\u85cf\u5b57\u4f53\n# \u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e\u83dc\u5355\u663e\u793a\u201c\u53d6\u6d88\u6536\u85cf\u201d\uff1b\n...\nself.assert_ocr_exist(\"\u53d6\u6d88\u6536\u85cf\")\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_1","title":"4\u3001\u670d\u52a1\u7aef\u90e8\u7f72","text":"\u6211\u4eec\u76ee\u524d\u662f\u5c06 OCR \u670d\u52a1\u90e8\u7f72\u5728\u666e\u901a\u7684\u529e\u516c\u673a\u4e0a\u7684\uff0c\u5982\u679c\u4f60\u89c9\u5f97\u73b0\u6709\u7684 OCR \u8bc6\u522b\u6027\u80fd\u4e0d\u591f\u597d\uff0c\u6070\u597d\u4f60\u6709\u66f4\u597d\u7684\u673a\u5668\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u5176\u79c1\u6709\u5316\u90e8\u7f72\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41_1","title":"4.1\u3001\u73af\u5883\u5b89\u88c5","text":"\u63a8\u8350\u4f7f\u7528 pipenv \u8fdb\u884c\u73af\u5883\u642d\u5efa\uff1b \u5b89\u88c5 pipenv \uff1a sudo pip3 install pipenv\n \u65b0\u5efa\u4e00\u4e2a\u76ee\u5f55\u4f5c\u4e3a\u73af\u5883\u5305 ocr_env\uff1a cd ~\nmkdir ocr_env\n \u521b\u5efa python 3.7 \u73af\u5883\uff1a cd ocr_env\npipenv --python 3.7\n \u5b89\u88c5 OCR \u4f9d\u8d56\u5305\uff1a pipenv install paddlepaddle -i https://mirror.baidu.com/pypi/simple\npipenv install \"paddleocr>=2.0.1\" -i https://mirror.baidu.com/pypi/simple\n \u4e0d\u51fa\u610f\u5916\uff0c\u8fd9\u6837\u5c31\u628a\u4f9d\u8d56\u5b89\u88c5\u597d\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42_1","title":"4.2\u3001\u542f\u52a8\u670d\u52a1","text":"\u5c06\u57fa\u7840\u6846\u67b6\u4e2d\u7684 scr/ocr/pdocr_rpc_server.py \u6587\u4ef6\u62f7\u8d1d\u5230 ocr_env \u76ee\u5f55\uff0c\u540e\u53f0\u6267\u884c\u5b83\u5c31\u597d\u4e86\uff1a cd ocr_env\nnohup pipenv run python pdocr_rpc_server.py &\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#43","title":"4.3\u3001\u914d\u7f6e\u5f00\u673a\u81ea\u542f\uff08\u901a\u7528\uff09","text":"\u4f60\u80af\u5b9a\u4e0d\u60f3\u6bcf\u6b21\u673a\u5668\u91cd\u542f\u4e4b\u540e\u90fd\u9700\u8981\u624b\u52a8\u542f\u52a8\u670d\u52a1\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u914d\u7f6e\u5f00\u673a\u81ea\u542f\u3002 \u5199\u5f00\u673a\u81ea\u542f\u670d\u52a1\u6587\u4ef6\uff1a sudo vim /lib/systemd/system/ocr.service\n autoocr \u540d\u79f0\u4f60\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff0c\u5199\u5165\u4ee5\u4e0b\u5185\u5bb9\uff1a [Unit]\nDescription=OCR Service\nAfter=multi-user.target\n\n[Service]\nUser=uos\nGroup=uos\nType=idle\nWorkingDirectory=/home/uos/ocr_env\nExecStart=pipenv run python pdocr_rpc_server.py\n\n[Install]\nWantedBy=multi-user.target\n \u6ce8\u610f\u66ff\u6362\u4f60\u7684${USER} \u4fee\u6539\u914d\u7f6e\u6587\u4ef6\u7684\u6743\u9650\uff1a sudo chmod 644 /lib/systemd/system/ocr.service\n \u81ea\u542f\u670d\u52a1\u751f\u6548\uff1a sudo systemctl daemon-reload\nsudo systemctl enable ocr.service\n \u67e5\u770b\u670d\u52a1\u72b6\u6001\uff1a sudo systemctl status ocr.service\n \u4f60\u53ef\u4ee5\u518d\u91cd\u542f\u4e0b\u7535\u8111\uff0c\u770b\u770b\u670d\u52a1\u662f\u4e0d\u662f\u6b63\u5e38\u542f\u52a8\u4e86\uff0c\u6ca1\u62a5\u9519\u5c31 OK \u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_4","title":"\u4e94\u3001\u5c5e\u6027\u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_3","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 UI \u81ea\u52a8\u5316\u5927\u591a\u90fd\u662f\u57fa\u4e8e\u6d4f\u89c8\u5668\u7684\uff0c\u6838\u5fc3\u662f\u5728\u7f51\u9875\u7684 DOM \u6811\u4e0a\u67e5\u627e\u5143\u7d20\uff0c\u5e76\u5bf9\u5176\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\uff1b Linux \u684c\u9762\u5e94\u7528\u5927\u591a\u662f\u91c7\u7528 Qt \u7f16\u5199\u7684\uff0c\u5728 Qt \u4e2d\u4e5f\u662f\u4ece\u6700\u9876\u5c42\u7684 MainWindow \u5f00\u59cb\u6784\u5efa\u5e94\u7528\uff0c\u6240\u4ee5\u903b\u8f91\u4e5f\u662f\u4e00\u6837\u7684\uff0cQt \u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u540c\u6837\u53ef\u4ee5\u901a\u8fc7 DOM \u6811\uff08\u5c5e\u6027\u6811\uff09\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff0c\u6211\u4eec\u79f0\u4e4b\u4e3a\u5c5e\u6027\u5b9a\u4f4d\u3002 \u501f\u52a9\u5f00\u6e90\u5de5\u5177 dogtail \u6211\u4eec\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u83b7\u53d6\uff0c\u4ece\u800c\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\u3002dogtail \u7684\u9879\u76ee\u4ecb\u7ecd\u53ef\u4ee5\u731b\u6233\u8fd9\u91cc\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_3","title":"2\u3001\u4f7f\u7528\u65b9\u6cd5","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#21sniff","title":"2.1\u3001sniff\uff08\u55c5\u63a2\u5668\uff09\u4f7f\u7528","text":"\u5728\u7ec8\u7aef\u8f93\u5165 sniff \u542f\u52a8 AT-SPI Browser mikigo@mikigo-PC:~$ sniff\n \u67e5\u770b\u5e94\u7528\u7684\u6807\u7b7e \u5728 sniff \u91cc\u9762\u53ef\u4ee5\u770b\u5230\u7cfb\u7edf\u4e2d\u5df2\u542f\u52a8\u7684\u5e94\u7528\uff0c\u70b9\u51fb\u5e94\u7528\u540d\u79f0\u524d\u9762\u7684\u4e09\u89d2\u5f62\u56fe\u6807\uff0c\u53ef\u4ee5\u5c55\u5f00\u5e94\u7528\u7684\u6807\u7b7e\uff0c\u6240\u6709\u6807\u7b7e\u4ee5 tree \u7684\u5f62\u5f0f\u5c55\u793a\uff0c\u5bf9\u5e94\u5e94\u7528\u91cc\u9762\u7684\u7236\u7a97\u53e3\u548c\u5b50\u7a97\u53e3\u3002 \u83b7\u53d6\u5143\u7d20\u63a7\u4ef6\u7684\u6807\u7b7e\u540d\u79f0 \u9996\u5148\uff0c\u4e3a\u4e86\u65b9\u4fbf\u67e5\u770b\u5143\u7d20\u63a7\u4ef6\u5bf9\u5e94\u7684\u4f4d\u7f6e\uff0c\u5efa\u8bae\u73b0\u5728\u4e0a\u65b9\u5de5\u5177\u680f\u70b9\u51fb Actions\uff0c\u7136\u540e\u52fe\u9009 Hightlight Items\uff0c\u8fd9\u6837\u5728 sniff \u4e2d\u9f20\u6807\u9009\u4e2d\u5143\u7d20\u6807\u7b7e\u7684\u65f6\u5019\uff0c\u5e94\u7528\u4e2d\u4f1a\u6709\u76f8\u5e94\u7684\u5149\u6807\u9501\u5b9a\u3002 \u5728 sniff \u91cc\u9762\u70b9\u51fb\u8fdb\u5165\u5e94\u7528\u7684\u6807\u7b7e tree \u4e2d\u540e\uff0c\u70b9\u51fb\u76f8\u5e94\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5728\u5de5\u5177\u4e0b\u65b9\uff0c\u4f1a\u5c55\u793a\u5143\u7d20\u63a7\u4ef6\u7684 Name\uff0c\u8fd9\u4e2a\u5c31\u662f\u6807\u7b7e\u540d\u79f0\u3002 \u5728 tree \u4e2d\u6709\u4e9b\u5730\u65b9\u662f\u7a7a\u767d\u7684\u6216\u8005\u662f Form\uff0c\u662f\u56e0\u4e3a\u5f00\u53d1\u4eba\u5458\u5728\u6dfb\u52a0\u6807\u7b7e\u7684\u65f6\u5019\u6ca1\u6709\u6dfb\u52a0\uff0c\u6216\u8005\u6709\u4e9b\u7236\u7a97\u53e3\u4e0d\u9700\u8981\u6dfb\u52a0\uff0c\u8fd9\u79cd\u5728\u5b9e\u9645\u4e1a\u52a1\u4e2d\u662f\u4e0d\u5f71\u54cd\u7684\uff0c\u6211\u4eec\u53ea\u8981\u4fdd\u8bc1\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\u4e2d\uff0c\u8981\u7528\u5230\u7684\u5143\u7d20\u90fd\u6dfb\u52a0\u4e86\u6807\u7b7e\u5373\u53ef\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#22","title":"2.2\u3001\u5143\u7d20\u64cd\u4f5c","text":"\u83b7\u53d6\u5e94\u7528\u5bf9\u8c61 dogtail \u83b7\u53d6\u5e94\u7528\u5bf9\u8c61\u7684\u65f6\u5019\uff0c\u4f7f\u7528\u7684\u662f tree \u5e93\u91cc\u9762\u7684 application() \u65b9\u6cd5\uff1a from dogtail.tree import root\napp_obj = root.application('deepin-music')\n app_obj\u5c31\u662f\u5e94\u7528\u7684\u5bf9\u8c61\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\uff0c\u662f\u5e94\u7528\u5bf9\u8c61\u4f7f\u7528child()\u65b9\u6cd5\uff1a element = app_obj.child('element_name')\n \u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u4f20\u5165\u5143\u7d20\u7684 Name\uff0c\u83b7\u53d6\u5230\u76f8\u5e94\u5143\u7d20\u7684\u5bf9\u8c61\u3002Name \u53ef\u4ee5\u901a\u8fc7 sniff \u67e5\u770b\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\u5217\u8868: element_list = element.children\n \u83b7\u53d6\u5230\u8fd9\u4e2a\u5143\u7d20\u4e0b\u9762\u6240\u6709\u7684\u5143\u7d20\u5217\u8868\u3002 \u8fd9\u4e2a\u65b9\u6cd5\u9002\u7528\u4e8e\u6709\u4e9b\u6807\u7b7e\u6ca1\u6709\u6dfb\u52a0\uff0c\u4f46\u662f\u4f4d\u7f6e\u662f\u56fa\u5b9a\u7684\uff0c\u6211\u4eec\u901a\u8fc7\u7d22\u5f15\u53ef\u4ee5\u53d6\u5f97\u5143\u7d20\u3002 element_list[0]\n \u5bf9\u5143\u7d20\u7684\u64cd\u4f5c \u5728\u83b7\u53d6\u5230\u5143\u7d20\u4e4b\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u76f8\u5e94\u7684\u64cd\u4f5c\u3002 \u5355\u51fb element.click(button=1)\n button 1 \u2014>\u5de6\u952e\uff0c2 \u2014>\u6eda\u8f6e\uff0c3 \u2014>\u53f3\u952e\uff0c\u9ed8\u8ba4\u4e3a 1 \u53cc\u51fb element.doubleClick(button=1)\n \u9f20\u6807\u60ac\u505c element.point()\n \u9f20\u6807\u79fb\u52a8\u5230\u5143\u7d20\u4e2d\u5fc3\u4f4d\u7f6e \u6587\u672c\u8f93\u5165 element.typeText(string)\n \u5411\u5143\u7d20\u5bf9\u8c61\u8f93\u5165\u5b57\u7b26\u4e32 \uff0c\u6bd4\u5982\u8f93\u5165\u6846 \u7ec4\u5408\u952e element.keyCombo(comboString)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#23","title":"2.3\u3001\u6846\u67b6\u5c01\u88c5","text":"\u4ee3\u7801\u793a\u4f8b\uff1a # \u8be6\u7ec6\u4ee3\u7801\u8bf7\u67e5\u770b src/dogtail_utils.py\nclass DogtailUtils:\ndef __init__(self, name=None, description=None):\nself.name = name\nself.description = description\nself.obj = root.application(self.name, self.description)\ndef app_element(self, *args, **kwargs):\n\"\"\"\n \u83b7\u53d6app\u5143\u7d20\u7684\u5bf9\u8c61\n :return: \u5143\u7d20\u7684\u5bf9\u8c61\n \"\"\"\nreturn self.obj.child(*args, **kwargs, retry=False)\ndef element_center(self, element) -> tuple:\n\"\"\"\n \u83b7\u53d6\u5143\u7d20\u7684\u4e2d\u5fc3\u4f4d\u7f6e\n :param element:\n :return: \u5143\u7d20\u4e2d\u5fc3\u5750\u6807\n \"\"\"\n_x, _y, _w, _h = self.app_element(element).extents\n_x = _x + _w / 2\n_y = _y + _h / 2\nreturn _x, _y\n \u6846\u67b6\u63d0\u4f9b\u7684\u63a5\u53e3\u975e\u5e38\u7b80\u6d01\uff0c\u5728\u8c03\u7528\u65f6\uff1a self.dog.element_center(\"\u64ad\u653e\")\n \u8fd9\u6837\u5c31\u80fd\u83b7\u53d6\u5230\u6b64\u5143\u7d20\u7684\u4e2d\u5fc3\u5750\u6807\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_5","title":"\u516d\u3001\u6807\u7b7e\u5316\u7ba1\u7406","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_4","title":"1\u3001\u6807\u7b7e\u8bf4\u660e","text":"\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u811a\u672c ID\uff1a\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c/\u51fd\u6570 ID\uff1b PMS\u7528\u4f8bID\uff1aPMS \u4e0a\u5bf9\u5e94\u7684\u7528\u4f8b ID\uff08\u7528\u4f8b\u5e93 ID\uff09\uff1b \u9ed8\u8ba4\u4f7f\u7528\u7528\u4f8b\u5e93 ID\uff0c\u5bf9\u4e8e\u6682\u65f6\u6ca1\u6709\u4f7f\u7528\u7528\u4f8b\u5e93\u7ba1\u7406\u7528\u4f8b\u7684\u9879\u76ee\uff0c\u53ef\u4ee5\u4f7f\u7528\u4ea7\u54c1\u5e93\u7528\u4f8b ID\uff1b \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1aFUNC\uff08\u529f\u80fd\uff09\u3001API\uff08\u63a5\u53e3\uff09\u3001BASELINE\uff08\u57fa\u7ebf\uff09\u3001PERF\uff08\u6027\u80fd\uff09\u3001STR\uff08\u538b\u529b\uff09\u3001SEC\uff08\u5b89\u5168\uff09\u3001CTS\uff08\u517c\u5bb9\u6027\uff09 \u4e0a\u7ebf\u5bf9\u8c61\uff1aCICD\uff0c\u8868\u793a\u4e0a\u7ebf\u5230 CICD \u6d41\u6c34\u7ebf\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u53ef\u4e00\u952e\u751f\u6210 case_list.csv \u6587\u4ef6\uff0c\u7528\u4e8e\u5bfc\u5165\u5230\u660e\u9053\u4e91 AT \u7528\u4f8b\u5217\u8868\u4e2d\u63a7\u5236 CICD \u8dd1\u6d4b\u8303\u56f4\uff1b \u6d4b\u8bd5\u7ea7\u522b\uff1aC1 / C2 / C3 / C4\uff0c\u5177\u4f53\u5b9a\u4e49\u53c2\u8003\u6d41\u6c34\u7ebf\u4f7f\u7528\u6307\u5bfc\uff1b \u8df3\u8fc7\u539f\u56e0\uff1askip-XXX\uff0c\u7528\u4e8e\u63a7\u5236\u7528\u4f8b\u662f\u5426\u6267\u884c\uff1b \u786e\u8ba4\u4fee\u590d\uff1afixed-XXX\uff0c\u7528\u4e8e\u6807\u8bb0\u7528\u4f8b\u7684\u4fee\u590d\u72b6\u6001\uff08\u540e\u9762\u8be6\u7ec6\u8bb2\u89e3\u7528\u6cd5\uff09\uff1b \u5e9f\u5f03\u7528\u4f8b\uff1aremoved-\u5df2\u5e9f\u5f03\uff0c\u7528\u4e8e\u6807\u8bb0\u5df2\u7ecf\u5e9f\u5f03\u7684\u7528\u4f8b\uff0c\u6b64\u7528\u4f8b\u6807\u7b7e\u4e0d\u4f1a\u88ab\u6dfb\u52a0\uff0c\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff1b \u793a\u4f8b\uff1a \u811a\u672cID PMS\u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u4e0a\u7ebf\u5bf9\u8c61 \u6d4b\u8bd5\u7ea7\u522b \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b ... 001 679537 L1 FUNC CICD C1 skip-XXX fixed-XXX removed-\u5df2\u5e9f\u5f03 ..."},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_4","title":"2\u3001\u64cd\u4f5c\u6b65\u9aa4","text":"2.1\u3001\u5728\u5b50\u9879\u76ee\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u4ee5\u7528\u4f8b\u7684 py \u6587\u4ef6\u9664\u53bb\u9996\u5b57\u7b26\u4e32 \"test_\" \u548c\u7528\u4f8b\u5e8f\u53f7\u540e\u7684\u5b57\u7b26\u4e32\u4f5c\u4e3a csv \u7684\u6587\u4ef6\u540d\u3002 \u4f8b\u5982: \u76f8\u518c\u7684\u7528\u4f8b\u6587\u4ef6\u4e3a test_album_xxx.py\uff0cxxx \u8868\u793a\u4efb\u610f\u4e09\u4f4d\u6570\u5b57\u4ee3\u8868\u7528\u4f8b\u5e8f\u53f7\uff0c\u6b64\u65f6 csv \u6587\u4ef6\u540d\u5c31\u5e94\u4e3a album.csv\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u6240\u6709 csv \u6587\u4ef6\u5efa\u8bae\u653e\u5728\u4e00\u4e2a tags \u76ee\u5f55\u4e0b\u3002 \u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 2.2\u3001\u7b2c\u4e00\u5217\u4e3a\u811a\u672c ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b\u7528\u4f8b\u6807\u7b7e\u53ef\u4ee5\u65e0\u5e8f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_2","title":"3\u3001\u589e\u52a0\u8bf4\u660e","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_1","title":"3.1\u3001\u8df3\u8fc7\u7528\u4f8b","text":"\u4f20\u7edf\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668(@pytest.mark.skip)\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a; \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#311","title":"3.1.1\u3001\u56fa\u5b9a\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u7b7e\u5f00\u5934\u4e3a \u201cskip-XXX\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\uff0c\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\u5219\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u7b7e\u4e3a SKIPED\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#312","title":"3.1.2\u3001\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skipif_platform-aarch64&mips64 \u67d0\u4e9b\u7528\u4f8b\u4f1a\u56e0\u4e3a\u4e0d\u540c\u7684\u73af\u5883\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\uff0c\u5e38\u89c1\u7684\u573a\u666f\u4e3a\u5728\u4e0d\u540c\u67b6\u6784\u4e0a\u5224\u65ad\u662f\u5426\u6267\u884c\uff0c\u8df3\u8fc7\u7684\u539f\u56e0\u6807\u7b7e\u4e3a \u201cskipif_platform-\u201d \u52a0\u67b6\u6784\u540d\uff0c\u591a\u4e2a\u67b6\u6784\u4e4b\u95f4\u4f7f\u7528 \u201c&\u201d \u62fc\u63a5\uff1b \u4ee5\u4e0a\u4f8b\u5b50\u4e3a\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u5224\u65ad\u5f53\u524d\u67b6\u6784\u662f\u5426\u4e3a arrch64 \u6216\u8005 mips64\uff0c\u82e5\u662f\uff0c\u5219\u8df3\u8fc7\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u82e5\u5426\u5219\u6267\u884c\u7528\u4f8b\uff1b \u76ee\u524d\u6846\u67b6\u9ed8\u8ba4\u4ec5\u652f\u6301\u67b6\u6784\u7684\u6761\u4ef6\u5224\u65ad\uff0c\u4f46\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u903b\u8f91\u652f\u6301\u81ea\u5b9a\u4e49\u6dfb\u52a0\u3002 \u5728\u9879\u76ee\u76ee\u5f55\u8def\u5f84\u4e0b\u5b58\u5728\u6587\u4ef6 setting/skipif.py\uff0c\u6240\u6709\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u7684\u51fd\u6570\u5199\u5728\u6b64\u6587\u4ef6\u4e2d\u3002 \u9ed8\u8ba4\u67b6\u6784\u5224\u65ad\u4f8b\u5b50\uff1a def skipif_platform(args: str):\n\"\"\"\u5e73\u53f0\u8df3\u8fc7\"\"\"\n_skip_key = args.split(\"&\")\nfor key in _skip_key:\nif GlobalConfig.SYS_ARCH == key:\nreturn True\nreturn False\n \u65b9\u6cd5\u7f16\u5199\u89c4\u8303\uff1a \u65b9\u6cd5\u540d\u5fc5\u987b\u4ee5 skipif \u5f00\u5934\uff1b \u65b9\u6cd5\u5fc5\u987b\u6709\u8fd4\u56de\u7ed3\u679c\u5e76\u4e14\u4e3a\u5e03\u5c14\u503c\uff08True \u4ee3\u8868\u8df3\u8fc7\uff0cFalse \u4ee3\u8868\u4e0d\u8df3\u8fc7\uff09\uff1b \u65b9\u6cd5\u53ea\u80fd\u6709\u4e00\u4e2a\u5165\u53c2\uff1b \u5728 csv \u6587\u4ef6\u8df3\u8fc7\u539f\u56e0\u4e00\u680f\u4e2d\u586b\u5199\u4e3a \u201c{\u51fd\u6570\u540d}-{\u53c2\u6570}\u201d\uff0c\u4f8b\u5982\uff1askipif_platform-aarch64\uff1b\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u4f1a\u4ee5\u7b2c\u4e00\u4e2a \u201c-\u201d \u8fdb\u884c\u5206\u5272\uff0c\u622a\u53d6\u7684\u5de6\u4fa7\u5b57\u7b26\u4e32\u4f5c\u4e3a\u51fd\u6570\u540d\uff0c\u5728 skipif.py \u6587\u4ef6\u4e2d\u67e5\u627e\u662f\u5426\u6709\u540c\u540d\u51fd\u6570\uff0c\u5e76\u5c06\u622a\u53d6\u7684\u53f3\u4fa7\u4f5c\u4e3a\u53c2\u6570\u4f20\u9012\u7ed9\u8be5\u51fd\u6570\uff0c\u901a\u8fc7\u83b7\u53d6\u8be5\u51fd\u6570\u8fd4\u56de\u7684\u5e03\u5c14\u503c\uff0c\u8fd4\u56de True\uff0c\u5219\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u8fd4\u56de False\uff0c\u5219\u6267\u884c\u8be5\u7528\u4f8b\u3002 \u82e5\u51fd\u6570\u9700\u8981\u591a\u4e2a\u53c2\u6570\uff0c\u53ef\u81ea\u5b9a\u4e49\u591a\u4e2a\u53c2\u6570\u4e4b\u95f4\u7684\u8fde\u63a5\u7b26\uff0c\u8fde\u63a5\u7b26\u53f7\u4e0d\u53ef\u4f7f\u7528\u4e0b\u5212\u7ebf\u548c\u9017\u53f7\uff0c\u63a8\u8350\u7edf\u4e00\u4f7f\u7528 & \u7b26\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32","title":"3.2\u3001\u786e\u8ba4\u4fee\u590d","text":"\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7528\u4f8b\u4fee\u590d\u540e\uff0c\u4f46\u4e0d\u80fd\u7acb\u5373\u5220\u9664\u8df3\u8fc7\u539f\u56e0\uff08skip-XXX\uff09\u7684\u7528\u4f8b\uff0c\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u786e\u8ba4\u4fee\u590d\u201d\uff0c\u4f5c\u4e3a\u6807\u8bb0\u8be5\u7528\u4f8b\u662f\u5426\u5df2\u7ecf\u4fee\u590d\uff0c\u56fa\u5b9a\u586b\u5165\u5b57\u6bb5\u4e3a \u201cfixed-\u5df2\u4fee\u590d\u201d\u3002\u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u5373\u4f7f\u540c\u65f6\u6807\u8bb0\u4e86 skip-XXX \u4e5f\u4f1a\u6b63\u5e38\u6267\u884c\u3002 \u793a\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d \u3010\u540c\u65f6\u6807\u8bb0\u4e86skip \u548c fixed\uff0c\u4f46\u4ecd\u7136\u60f3\u8981\u8df3\u8fc7\u7528\u4f8b\u3011 \u5f53 \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u540c\u65f6\u586b\u5165\u540e\uff0c\u547d\u4ee4\u884c\u4f20\u9012\u53c2\u6570 --ifixed yes\uff0c\u5219\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\u8be5\u6761\u7528\u4f8b\u3002 python3 manage.py run --ifixed yes\n \u770b\u5230\u8fd9\u91cc\u6709\u4e9b\u540c\u5b66\u53ef\u80fd\u8981\u95ee\u4e86\uff0c\u6211\u60f3\u6062\u590d\u8df3\u8fc7\u6267\u884c\uff0c\u76f4\u63a5\u628a skip-XXX \u8fd9\u4e00\u5217\u6807\u7b7e\u5220\u6389\u4e0d\u5c31\u597d\u4e86\uff0c\u8fd8\u641e\u4ec0\u4e48\u786e\u8ba4\u4fee\u590d\u5e72\u5565\uff1f \u8fd9\u91cc\u7ed9\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u89e3\u91ca\u4e00\u4e0b\uff1a \uff08\u4ee5\u4e0b\u6d41\u6c34\u7ebf\u6307\u7684\u662f\u6bcf\u65e5\u6784\u5efa\u7684\u6d41\u6c34\u7ebf\uff0c\u8dd1 AT \u7684\u5168\u91cf\u7528\u4f8b\uff09 \u9996\u5148\uff0c\u6d41\u6c34\u7ebf\u4e0a\u8dd1\u7684\u662f AT \u5386\u53f2 Tag\uff0c\u8df3\u8fc7\u7528\u4f8b\u7684\u6807\u7b7e(skip-XXX) \u662f\u5728\u6700\u65b0\u7684\u4ee3\u7801\u4e0a\u63d0\u4ea4\u7684\uff0c\u6211\u4eec\u91c7\u7528\u6700\u65b0\u7684 csv \u6587\u4ef6\u8986\u76d6\u5386\u53f2 csv \u6587\u4ef6\u7684\u8bbe\u8ba1\u6765\u5b9e\u73b0\u4e86\u5bf9\u5386\u53f2 Tag \u4e0a\u7528\u4f8b\u7684\u8df3\u8fc7\uff1b \u7136\u540e\uff0c\u5728\u65e5\u5e38\u8df3\u8fc7\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u540c\u65f6\u4e5f\u5728\u4fee\u590d\u4e00\u4e9b\u7528\u4f8b\uff0c\u4fee\u590d\u540e\u7684\u8fd9\u4e9b\u7528\u4f8b\u5728\u672c\u5730\u8c03\u8bd5\u7684\u65f6\u5019\u6211\u4eec\u4e0d\u5e0c\u671b\u7ee7\u7eed\u8df3\u8fc7\uff0c\u4f46\u662f\u6b64\u65f6\uff0c\u4fee\u590d\u7684\u8fd9\u4e9b\u7528\u4f8b\u53ef\u80fd\u8fd8\u4e0d\u7a33\u5b9a\uff0c\u4e0d\u9002\u5408\u9a6c\u4e0a\u653e\u5230\u6d41\u6c34\u7ebf\u53bb\u8dd1\uff0c\u4e5f\u5c31\u662f\u8bf4\u6d41\u6c34\u7ebf\u4e0a\u6211\u4eec\u662f\u5e0c\u671b\u4ed6\u7ee7\u7eed\u8df3\u8fc7\u7684\uff0c\u56e0\u6b64\uff0c\u54b1\u4e0d\u80fd\u76f4\u63a5\u628a skip-XXX \u5e72\u6389\uff1b \u8fd9\u91cc\u5c31\u77db\u76fe\u4e86\uff0c\u4e00\u4e2a\u9700\u6c42\u662f\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u53e6\u4e00\u4e2a\u9700\u6c42\u53c8\u4e0d\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u600e\u4e48\u529e\u5462\uff1f \u6211\u4eec\u4f7f\u7528\u201c\u786e\u8ba4\u4fee\u590d\u201d\u6765\u6807\u8bb0\u8fd9\u6761\u7528\u4f8b\u5df2\u7ecf\u4fee\u590d\u4e86\uff0c\u8fd9\u6837\u4f60\u672c\u5730\u8c03\u8bd5\u7528\u4f8b\u7684\u65f6\u5019\u8fd9\u6761\u5df2\u4fee\u590d\u7684\u7528\u4f8b\u662f\u4f1a\u6267\u884c\u7684\uff0c\u540c\u65f6\u5728\u6d41\u6c34\u7ebf\u4e0a\u5c06 --ifixed yes \u53c2\u6570\u52a0\u4e0a\uff0c\u90a3\u4e48\u6d41\u6c34\u7ebf\u4e0a\u6267\u884c\u65f6\u8fd9\u6761\u7528\u4f8b\u4ecd\u7136\u662f\u8df3\u8fc7\u7684\u72b6\u6001\uff0c\u540e\u7eed\u4f60\u6253 Tag \u7684\u65f6\u5019\uff0c\u628a \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u7684\u6807\u7b7e\u5168\u90e8\u5220\u6389\u5c31\u53ef\u4ee5\u4e86\u3002 \u8fd9\u5c31\u662f\u201c\u786e\u8ba4\u4fee\u590d\u201d\u8fd9\u4e2a\u6807\u7b7e\u7684\u80cc\u666f\uff0c\u9700\u8981\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u54c1\u4e00\u54c1\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#33","title":"3.3\u3001\u5e9f\u5f03\u7528\u4f8b","text":"\u9488\u5bf9\u67d0\u4e9b\u7528\u4f8b\uff0c\u7531\u4e8e\u9700\u6c42\u53d8\u66f4\uff0c\u73af\u5883\u5f71\u54cd\u6216\u8bc4\u4f30\u4e0d\u518d\u9002\u7528\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u65f6\uff0c\u7528\u4f8b\u9700\u8981\u5e9f\u5f03\uff0c\u5219\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u5e9f\u5f03\u7528\u4f8b\u201d\uff0c\u8be5\u5217\u5b58\u5728 \u201cremoved-{\u5e9f\u5f03\u539f\u56e0}\u201d\uff0c\u5219\u7528\u4f8b\u4e0d\u4f1a\u6267\u884c\u3002 \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d removed-\u5df2\u5e9f\u5f03 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_2","title":"4\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u4e0a\u9762\u4ecb\u7ecd Pytest \u6846\u67b6\u63d0\u4f9b\u7684\u6807\u7b7e\u529f\u80fd mark\uff0c\u4f7f\u7528\u65f6\u9700\u8981\u4e3a\u6bcf\u4e00\u4e2a\u7528\u4f8b\u6dfb\u52a0\u6807\u7b7e\u88c5\u9970\u5668\uff0c\u5219\u64cd\u4f5c\u590d\u6742\uff0c\u53ef\u7ef4\u62a4\u6027\u5dee\uff0c\u5176\u6839\u672c\u95ee\u9898\u5c31\u662f\u6807\u7b7e\u5206\u6563\u5728\u6bcf\u4e00\u6761\u7528\u4f8b\u7684\u88c5\u9970\u5668\u4e0a\uff0c\u96be\u4ee5\u96c6\u4e2d\u7ef4\u62a4\uff1b\u4e8e\u662f\u4e4e\u5c06\u6240\u6709\u6807\u7b7e\u4f7f\u7528 csv \u6587\u4ef6\u8fdb\u884c\u96c6\u4e2d\u7ba1\u7406\uff0c\u5e76\u901a\u8fc7 Pytest \u7684\u94a9\u5b50\u51fd\u6570\uff0c\u8bfb\u53d6 csv \u6587\u4ef6\uff0c\u52a8\u6001\u6dfb\u52a0\u6807\u7b7e\u5230\u7528\u4e2d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5csv","title":"5\u3001CSV\u6587\u4ef6\u683c\u5f0f","text":"\u6b64\u914d\u7f6e\u6587\u4ef6\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u6807\u7b7e\u6570\u636e\uff0c\u4e14\u8981\u65b9\u4fbf\u80fd\u4f7f\u7528Excel\u6253\u5f00\u8fdb\u884c\u7f16\u8f91\u67e5\u770b\uff0c\u66f4\u91cd\u8981\u7684\u662f\u6211\u4eec\u4e0d\u60f3\u5f15\u5165\u4e09\u65b9\u4f9d\u8d56\uff0cCSV \u6587\u4ef6\u51e0\u4e4e\u662f\u552f\u4e00\u80fd\u6ee1\u8db3\u6240\u6709\u7684\u8981\u6c42\u7684\u6587\u4ef6\u683c\u5f0f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_6","title":"\u4e03\u3001\u65e5\u5fd7\u7cfb\u7edf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_5","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e YouQu \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u64cd\u4f5c\u65b9\u6cd5\u5c01\u88c5\u5199\u6cd5\uff0c\u901a\u5e38\u662f\u8fd9\u6837\u7684\uff1a\u7c7b\u91cc\u9762\u4e00\u4e2a\u51fd\u6570\u53ea\u5305\u542b\u4e00\u4e2a\u64cd\u4f5c\u6216\u591a\u6b21\u8c03\u7528\u7684\u4e00\u7cfb\u5217\u53ef\u5408\u5e76\u7684\u64cd\u4f5c\uff1b \u4f20\u7edf\u7684\u65e5\u5fd7\u8f93\u51fa\u65b9\u5f0f\uff0c\u9700\u8981\u5728\u6bcf\u4e2a\u51fd\u6570\u91cc\u9762\u4e3b\u52a8\u7f16\u5199\u65e5\u5fd7\u8f93\u51fa\u4ee3\u7801 \uff0c\u4f8b\u5982\uff1a class XXXWidget:\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\nlogger.info(\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\")\n...\n# \u7701\u7565\u4ee3\u7801\u90e8\u5206\n \u4e00\u4e2a\u51fd\u6570\u91cc\u9762\u81f3\u5c11\u5305\u542b\u4e00\u6761\u65e5\u5fd7\u4fe1\u606f\uff0c\u5982\u679c\u6bd4\u8f83\u590d\u6742\u64cd\u4f5c\u6b65\u9aa4\uff0c\u53ef\u80fd\u5305\u542b\u591a\u6761\u65e5\u5fd7\u4fe1\u606f\uff1b \u4e00\u4e2a\u5e94\u7528\u542b\u6709\u5927\u91cf\u7684\u64cd\u4f5c\u51fd\u6570\uff0c\u4e5f\u5c31\u662f\u8bf4\u6211\u4eec\u9700\u8981\u5199\u5927\u91cf\u7684\u65e5\u5fd7\u4ee3\u7801\uff1b \u901a\u8fc7\u7ecf\u9a8c\u89c2\u5bdf\uff0c\u6211\u4eec\u53d1\u73b0\uff0c\u51fd\u6570\u8bf4\u660e\u4ee5\u53ca\u51fd\u6570\u64cd\u4f5c\u65e5\u5fd7\uff0c\u5177\u6709\u8f83\u9ad8\u7684\u91cd\u590d\u5ea6\uff08\u4ece\u4e0a\u9762\u7684\u4f8b\u5b50\u4e5f\u53ef\u4ee5\u770b\u51fa\u6765\uff09\uff0c\u56e0\u6b64\u6211\u4eec\u5927\u80c6\u7684\u8bbe\u60f3\uff0c\u80fd\u4e0d\u80fd\u57fa\u4e8e\u6846\u67b6\u6267\u884c\u65f6\uff0c\u81ea\u52a8\u7684\u5c06\u51fd\u6570\u8bf4\u660e\u4f5c\u4e3a\u65e5\u5fd7\u6253\u5370\u51fa\u6765\uff0c\u4ece\u800c\u51cf\u5c11\u5927\u91cf\u65e5\u5fd7\u4ee3\u7801\u91cf\u548c\u91cd\u590d\u7f16\u5199\uff0c\u90a3\u771f\u662f\u5999\u554a~\u3002 \u57fa\u4e8e\u6b64\u201c\u5929\u771f\u201d\u7684\u60f3\u6cd5\uff0c\u6211\u4eec\u8bbe\u8ba1\u51fa\u4e86 youqu \u7684\u65e5\u5fd7\u7cfb\u7edf\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_5","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u6838\u5fc3\u539f\u7406\uff1a \u901a\u8fc7\u7ed9\u7c7b\u52a0\u4e0a\u4e00\u4e2a\u88c5\u9970\u5668 @log\uff0c\u52a8\u6001\u7ed9\u8be5\u7c7b\u4e0b\u6240\u6709\u7684\u51fd\u6570\u53ca\u7236\u7c7b\u51fd\u6570\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668 @_trace\uff0c\u5728\u6b64\u88c5\u9970\u5668\u4e2d\u6211\u4eec\u80fd\u52a8\u6001\u7684\u6355\u83b7\u6240\u8c03\u7528\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff08func.__doc__\uff09\uff0c\u901a\u8fc7\u65e5\u5fd7\u8f93\u51fa\u5668\u5c06\u5176\u8f93\u51fa\u5373\u53ef\u3002 \u5b9e\u73b0\u6b65\u9aa4\uff1a \u901a\u8fc7 inspect.getmembers \u83b7\u53d6\u88ab\u88c5\u9970\u7684\u7c7b\u4e0b\u6240\u6709\u51fd\u6570\uff0c\u5305\u542b\u9759\u6001\u65b9\u6cd5\uff0c\u7c7b\u65b9\u6cd5\uff0c\u5b9e\u4f8b\u65b9\u6cd5\uff1b \u901a\u8fc7 setattr(\u7c7b, \u65b9\u6cd5, _trace\uff09 \u7684\u65b9\u5f0f\uff0c\u7ed9\u7b26\u5408\u6761\u4ef6\u7684\u51fd\u6570\uff0c\u52a8\u6001\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_3","title":"3\u3001\u65e5\u5fd7\u914d\u7f6e","text":"[log_cli]\n;\u65e5\u5fd7\u76f8\u5173\u914d\u7f6e\uff08\u4e0d\u6253\u5370\u6784\u9020\u51fd\u6570\u548c\u9b54\u6cd5\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff09\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = INFO\n# ============= \u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u914d\u7f6e ================\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u5f00\u5934\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7, \u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_STARTSWITH = Assert\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u7ed3\u5c3e\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_ENDSWITH = Widget\n;\u652f\u6301\u7c7b\u540d\u5305\u542b xxx \u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_CONTAIN = ShortCut\n# ==============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_3","title":"4\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u5728\u5e94\u7528\u5e93 widget \u65b9\u6cd5\u5e93\u91cc\u9762\uff0c\u53ea\u9700\u8981\u5728\u51fa\u53e3\u6587\u4ef6\u52a0\u4e0a\u7c7b\u88c5\u9970\u5668\uff0c\u5c31\u53ef\u4ee5\u5b9e\u73b0\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u4e86\uff1b # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6ce8\u610f\uff0c\u662f\u7c7b\u88c5\u9970\u5668\u3002 \u5b9e\u4f8b\uff1a # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\n@classmethod\ndef find_dfm_image(cls, *elements, multiple=False, rate=0.9):\n\"\"\"\n \u67e5\u627e\u56fe\u7247 {{elements}}.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e {{rate}} \u7684\u5750\u6807\n :param elements:\n :param multiple:\n :return:\n \"\"\"\nelement = tuple(map(lambda x: f\"{Config.PIC_RES_PATH}/{x}\", elements))\nreturn cls.find_image(*element, multiple=multiple)\n \u8c03\u7528\u65b9\u6cd5\u65f6\uff1a DfmWidget.find_dfm_image(\"dfm_001\")\n \u81ea\u52a8\u8f93\u51fa\u7684\u65e5\u5fd7\uff1a >> x86_64-uos-6: 02/28 17:48:47 | INFO | logger_utils: [find_dfm_image]: \u67e5\u627e\u56fe\u7247 dfm_001.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e 0.9 \u7684\u5750\u6807\n \u52a0\u4e0a\u88c5\u9970\u5668 @log \u4e4b\u540e\uff0c\u65b9\u6cd5\u5c42\u6240\u6709\u7684\u51fd\u6570\uff08\u5305\u62ec\u5b9e\u4f8b\u65b9\u6cd5\u3001\u7c7b\u65b9\u6cd5\u3001\u9759\u6001\u65b9\u6cd5\uff09\u90fd\u4e0d\u9700\u8981\u518d\u5199\u65e5\u5fd7\u4ee3\u7801\uff0c\u6267\u884c\u7684\u65f6\u5019\u4f1a\u81ea\u52a8\u8f93\u51fa\uff0c\u5e76\u4e14\u6240\u6709\u8c03\u7528\u7684\u65b9\u6cd5\u4f1a\u4ee5 allure.step \u7684\u65b9\u5f0f\uff0c\u5c55\u793a\u5728 allure \u62a5\u544a\u4e2d\uff0c\u5728\u62a5\u544a\u4e2d\u66f4\u80fd\u4e00\u76ee\u4e86\u7136\u7684\u770b\u5230\u7528\u4f8b\u6267\u884c\u6b65\u9aa4\u3002 \u3010\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\u3011 \u901a\u8fc7\u89c2\u5bdf\u524d\u9762\u7684\u4f8b\u5b50\uff0c\u7ec6\u5fc3\u7684\u540c\u5b66\u53ef\u80fd\u8fd8\u53d1\u73b0\u4e86\u4e00\u4e2a\u5c0f\u7ec6\u8282\uff1a\u51fd\u6570\u529f\u80fd\u8bf4\u660e\u4e2d\uff0c\u4e24\u5bf9\u5927\u62ec\u53f7\u4e2d\u7684\u5185\u5bb9 {{elements}} \u4f5c\u4e3a\u53d8\u91cf\u8f93\u51fa\u51fa\u6765\u4e86\uff1b \u6ca1\u9519\uff0c\u8fd9\u5c31\u662f\u6211\u4eec\u53c2\u8003Django \u548c jinja2 \u7684\u6a21\u677f\u8bed\u6cd5\u8bbe\u8ba1\u51fa\u7684\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\uff0c\u4f7f\u7528\u65b9\u6cd5\u5f88\u7b80\u5355\uff0c\u7528\u4e24\u5bf9\u5927\u62ec\u53f7\u628a\u51fd\u6570\u7684\u53c2\u6570\u62ec\u8d77\u6765\uff0c\u8fd9\u6837\u5728\u65e5\u5fd7\u8f93\u51fa\u7684\u65f6\u5019\u5c31\u80fd\u628a\u8c03\u7528\u51fd\u6570\u65f6\u53c2\u6570\u7684\u503c\u8f93\u51fa\u51fa\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_7","title":"\u516b\u3001\u73af\u5883\u90e8\u7f72","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_6","title":"1\u3001\u539f\u5219","text":"YouQu \u7684\u73af\u5883\u4f9d\u8d56\u4e00\u76f4\u575a\u6301 2 \u4e2a\u539f\u5219\uff1a \u6700\u5c0f\u73af\u5883\u4f9d\u8d56\u539f\u5219 \u6709\u4e9b\u540c\u5b66\u5199\u4e00\u4e9b\u529f\u80fd\uff0c\u9996\u5148\u60f3\u5230\u7684\u5c31\u662f\u53bb\u641c\u7d22\u5f15\u64ce\u641c\u4e00\u4e0b\uff0c\u770b\u6709\u6ca1\u6709\u73b0\u6210\u7684\u5de5\u5177\u6216\u8005\u4ee3\u7801\u76f4\u63a5\u80fd\u7528\uff0c\u7f8e\u5176\u540d\u66f0\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\uff0c\u522b\u4eba\u5df2\u7ecf\u9020\u597d\u4e86\u8f6e\u5b50\u54b1\u4eec\u5c31\u4e0d\u8981\u91cd\u590d\u53bb\u9020\u4e86\uff0c\u7136\u540e\u4e00\u5207\u4f3c\u4e4e\u90fd\u53d8\u5f97\u90a3\u4e48\u7684\u7406\u6240\u5e94\u5f53\u3002 \u5f53\u7136\u8fd9\u6837\u505a\u65e0\u53ef\u539a\u975e\uff0c\u6211\u76f8\u4fe1\u6709\u8fd9\u6837\u60f3\u6cd5\u5e76\u4e14\u4e00\u76f4\u8df5\u884c\u8fd9\u6837\u505a\u6cd5\u7684\u540c\u5b66\u4e0d\u5728\u5c11\u6570\uff0c\u4f46\u8fd9\u6837\u505a\u6709\u4e00\u4e2a\u5f88\u4e25\u91cd\u7684\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f60\u5199\u4e00\u4e2a\u5927\u578b\u9879\u76ee\u65f6\uff0c\u4f60\u4f1a\u5f15\u5165\u975e\u5e38\u975e\u5e38\u975e\u5e38\u591a\u7684\u4f9d\u8d56\uff0c\u6bd4\u5982\u8981\u505a\u4e2a\u63a5\u53e3\u8bf7\u6c42\u8981\u7528 requests\u3001\u8bfb\u5199\u4e2a\u6570\u636e\u7528 pandas\u3001\u5199\u4e2a\u8868\u683c\u7528 pyopenxl\u3001\u89e3\u6790\u4e2a\u6587\u672c\u8981\u7528\u8fd9\u4e2a\u90a3\u4e2a\u4e09\u65b9\u5e93 ... \u3002 \u6211\u8ba4\u4e3a\u8fd9\u662f\u975e\u5e38\u4e0d\u597d\u7684\u4e60\u60ef\uff0c\u5728\u5b9e\u73b0\u4e00\u4e2a\u529f\u80fd\u7684\u65f6\u5019\uff0c\u9996\u5148\u6211\u4eec\u5e94\u8be5\u53bb\u60f3\u81ea\u5df1\u600e\u4e48\u6837\u53bb\u5b9e\u73b0\uff0c\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff1b \u5982\u679c\u4f60\u4e0d\u4f1a\uff0c\u4f60\u53ef\u4ee5\u53bb\u5b66\u4e60\u4e09\u65b9\u5e93\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u522b\u4eba\u4e09\u65b9\u5e93\u4e5f\u662f\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\u7684\uff0c\u4e3a\u4ec0\u4e48\u54b1\u4eec\u4e0d\u884c\u5462\uff1b\u5982\u679c\u522b\u4eba\u7684\u4f60\u5b9e\u5728\u662f\u770b\u4e0d\u61c2\uff0c\u60f3\u5c3d\u4e00\u5207\u529e\u6cd5\u786e\u5b9e\u505a\u4e0d\u51fa\u6765\uff0c\u90a3\u518d\u8003\u8651\u5f15\u5165\u8fd9\u4e2a\u4e09\u65b9\u5e93\uff0c\u6211\u8ba4\u4e3a\u8fd9\u6837\u662f\u6ca1\u95ee\u9898\u7684\uff0c\u6bd5\u7adf\u54b1\u4eec\u6bb5\u4f4d\u8fd8\u4e0d\u591f\uff0c\u4f46\u5e0c\u671b\u5c06\u6765\u6709\u4e00\u5929\u6211\u4eec\u53ef\u4ee5\u3002 \u8fd9\u6837\u7684\u505a\u6cd5\u624d\u5e94\u8be5\u662f\u201c\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\u201d\u6b63\u786e\u7684\u64cd\u4f5c\u3002\u4e0d\u4f1a\u6ca1\u5173\u7cfb\uff0c\u770b\u770b\u522b\u4eba\u662f\u600e\u4e48\u5b9e\u73b0\u7684\uff0c\u81ea\u5df1\u518d\u6478\u7d22\u7740\u5199\u51fa\u6765\uff0c\u8fd9\u6837\u81ea\u5df1\u624d\u80fd\u6709\u6240\u63d0\u9ad8\uff0c\u4e0d\u7136\u4f60\u5c31\u53ea\u4f1a\u7528\u522b\u4eba\u7684\u4e1c\u897f\uff1b\u90a3\u4e9b\u5632\u7b11\u3001\u6279\u8bc4\u6211\u4eec\u91cd\u590d\u9020\u8f6e\u5b50\u7684\u4eba\uff0c\u5148\u60f3\u60f3\u81ea\u5df1\u4f1a\u9020\u8f6e\u5b50\u5417\u3002 \u672c\u7740\u81ea\u5df1\u5b9e\u73b0\u80fd\u5b9e\u73b0\u7684\u4e00\u5207\u7684\u539f\u5219\uff0cYouQu \u6846\u67b6\u505a\u5230\u4e86\u975e\u5e38\u5c11\u7684\u73af\u5883\u4f9d\u8d56\uff0c\u800c\u4e14\u6211\u4eec\u4ecd\u5728\u4e0d\u65ad\u52aa\u529b\uff0c\u51cf\u5c11\u73af\u5883\u90e8\u7f72\u7684\u4f9d\u8d56\u3002 \u6700\u5c0f\u4ed3\u5e93\u4f53\u79ef\u539f\u5219 \u5927\u6587\u4ef6\u4e0d\u80fd\u4e0a\u4f20\u5230\u5de5\u7a0b\u91cc\u9762\uff0c\u4fdd\u6301\u6574\u4e2a\u5de5\u7a0b\u7684\u8f7b\u91cf\u5316\uff0c\u8fd9\u6837\u5728\u514b\u9686\u4ee3\u7801\u7684\u65f6\u5019\u624d\u80fd\u975e\u5e38\u5feb\u901f\u65b9\u4fbf\u4f7f\u7528\uff0c\u6211\u4eec\u89c1\u8fc7\u4e00\u4e2a AT \u5de5\u7a0b clone \u5927\u5c0f\u8fbe\u5230\u597d\u51e0\u4e2a G\uff0c\u7b80\u76f4\u4e0d\u53ef\u601d\u8bae\u3002 \u5176\u5b9e\u4ee3\u7801\u6587\u4ef6\u7684\u5927\u5c0f\u662f\u5f88\u5c0f\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u7eaf\u5199\u4ee3\u7801\u968f\u4fbf\u5199\u5de5\u7a0b\u4e5f\u4e0d\u4f1a\u592a\u5927\uff0c\u800c\u6587\u6863\uff08\u5305\u542b\u63d2\u56fe\uff09\u7b49\u8d44\u6e90\u5374\u662f\u5f88\u5360\u7a7a\u95f4\u3002 \u56e0\u6b64\u6211\u4eec\u9009\u62e9\u5c06 YouQu \u7684\u6587\u6863\u5de5\u7a0b\u5355\u72ec\u8fc1\u51fa\u5230\u72ec\u7acb\u7684\u4ed3\u5e93 youqu-docs \u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_6","title":"2\u3001\u5b89\u88c5","text":"\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u8fd0\u884c env.sh \u5373\u53ef\u3002 bash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_4","title":"3\u3001\u5b9a\u5236\u4f9d\u8d56","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_2","title":"3.1\u3001\u65b0\u589e\u4f9d\u8d56","text":"\u5982\u679c\u5e94\u7528\u5e93\u8fd8\u9700\u8981\u5176\u4ed6 Python \u4f9d\u8d56\u5e93\uff0c\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a requirement.txt \u6587\u4ef6\uff1b autotest_xxx\n\u251c\u2500\u2500 requirement.txt\n\u251c\u2500\u2500 case ...\n \u91cc\u9762\u5199\u5165\u9700\u8981\u5b89\u88c5\u7684\u4e09\u65b9\u4f9d\u8d56\uff0c\u6bd4\u5982\u50cf\u8fd9\u6837\uff1a # requirement.txt\nPyYAML==6.0 # \u6307\u5b9a\u5b89\u88c5\u67d0\u4e2a\u7248\u672c\nrequests # \u672a\u6307\u5b9a\u7248\u672c\u5219\u5b89\u88c5\u6700\u65b0\u7248\n \u5728\u6267\u884c bash env.sh \u65f6\u4f1a\u4e00\u5e76\u5c06\u5176\u5b89\u88c5\u3002 \u5982\u679c\u591a\u4e2a\u5e94\u7528\u5e93\u90fd\u5b58\u5728 requirement.txt \u6587\u4ef6\uff0c\u6267\u884c env.sh \u65f6\u4f1a\u5c06\u591a\u4e2a requirement.txt \u6587\u4ef6\u4e00\u5e76\u52a0\u8f7d\uff1b\u90a3\u4e48\u4e00\u5b9a\u8981\u6ce8\u610f\u591a\u4e2a requirement.txt \u6587\u4ef6\u53ef\u80fd\u5b58\u5728\u76f8\u540c\u7684\u4f9d\u8d56\u88ab\u6307\u5b9a\u5b89\u88c5\u4e0d\u540c\u7248\u672c\u7b49\u7b49\u517c\u5bb9\u6027\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32_1","title":"3.2\u3001\u88c1\u526a\u4f9d\u8d56","text":"\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0c\u53ef\u80fd\u4f60\u53ea\u9700\u8981\u5b89\u88c5\u4e00\u4e9b\u6700\u6700\u57fa\u7840\u7684\u4f9d\u8d56\uff0c\u5176\u4ed6\u7684\u90fd\u4e0d\u9700\u8981\uff0c\u6bd4\u5982\u7eaf\u63a5\u53e3\u81ea\u52a8\u5316\u7684\u9879\u76ee\uff0c\u5b83\u4e0d\u9700\u8981 UI \u81ea\u52a8\u5316\u76f8\u5173\u7684\u4f9d\u8d56\u3002 \u4f60\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\uff0c\u5b58\u653e\u4e00\u4e2a BASICENV \u7684\u666e\u901a\u6587\u4ef6\uff0c\u91cc\u9762\u4e0d\u9700\u8981\u5199\u4efb\u4f55\u5185\u5bb9\uff0c\u8fd9\u6837\u6267\u884c env.sh \u65f6\uff0c\u53ea\u4f1a\u5b89\u88c5\u6700\u57fa\u7840\u7684\u4f9d\u8d56\u3002 autotest_xxx\n\u251c\u2500\u2500 BASICENV # \u53ef\u4ee5\u4f7f\u7528\uff1atouch BASICENV \u521b\u5efa\u6587\u4ef6\n\u251c\u2500\u2500 case ...\n \u57fa\u7840\u4f9d\u8d56\u4ec5\u5b89\u88c5\u4ee5\u4e0b\u51e0\u4e2a\u5305\uff1a pytest # pytest\npytest-rerunfailures # \u5931\u8d25\u91cd\u8dd1\u63d2\u4ef6\npytest-timeout # \u7528\u4f8b\u8d85\u65f6\u63d2\u4ef6\nallure-pytest # \u751f\u6210 allure \u62a5\u544a\u63d2\u4ef6\nallure.deb # allure \u62a5\u544a\u67e5\u770b\u5de5\u5177\n \u88c1\u526a\u4f9d\u8d56 \u548c \u65b0\u589e\u4f9d\u8d56 \u662f\u4e0d\u51b2\u7a81\u7684\uff0c\u53ef\u4ee5\u540c\u65f6\u4f7f\u7528\u3002 \u6b64\u65b9\u6848\u9ed8\u8ba4\u4e3a\u865a\u62df\u73af\u5883\u90e8\u7f72\uff0c\u5982\u679c\u4f60\u60f3\u76f4\u63a5\u90e8\u7f72\u5728\u672c\u673a\u4e0a\uff1a bash env_dev.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_8","title":"\u4e5d\u3001\u5931\u8d25\u5f55\u5c4f","text":"\u5f55\u5c4f\u5176\u5b9e\u662f\u4e00\u79cd\u89c6\u9891\u5f62\u5f0f\u7684\u65e5\u5fd7\uff0c\u56e0\u4e3a\u5f88\u591a\u65f6\u5019\u6211\u4eec\u5728\u67e5\u770b\u65e5\u5fd7\u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u51c6\u786e\u7684\u5b9a\u4f4d\u5230\u7528\u4f8b\u5931\u8d25\u7684\u5177\u4f53\u539f\u56e0\uff0c\u56e0\u6b64\u7528\u4f8b\u7684\u5f55\u5c4f\u80fd\u8ba9\u6211\u4eec\u770b\u5230\u7528\u4f8b\u5728\u6267\u884c\u8fc7\u7a0b\uff1b \u3010\u4f7f\u7528\u65b9\u6cd5\u3011 \u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u5173\u6ce8 2 \u4e2a\u53c2\u6570\uff1b ;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\u3002\n;\u6ce8\u610f\uff0c\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u4e0d\u80fd\u5c0f\u4e8e\u5931\u8d25\u5f55\u5c4f\u6b21\u6570\uff0c\u5373 RERUN >= RECORD_FAILED_CASE\nRECORD_FAILED_CASE = 1\n \u9ed8\u8ba4\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u662f 1 \u6b21\uff1b RECORD_FAILED_CASE = 1 \u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff1b RECORD_FAILED_CASE = 0 \u8868\u793a\u4e0d\u7ba1\u7528\u4f8b\u6210\u529f\u6216\u5931\u8d25\u90fd\u5f55\u5c4f\uff1b \u5f55\u5c4f\u662f\u8981\u5360\u7528\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u7279\u522b\u662f\u5728\u4e00\u4e9b\u914d\u7f6e\u8f83\u4f4e\u7684\u673a\u5668\u4e0a\u4f1a\u5f88\u660e\u663e\uff0c\u6240\u4ee5\u4f60\u9700\u8981\u8003\u8651\u662f\u5426\u6709\u5fc5\u8981\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1b \u4f7f\u7528 manage.py \u6267\u884c\u7528\u4f8b\u9ed8\u8ba4\u8bfb\u53d6\u5230 globalconfig.ini \u91cc\u9762\u7684\u53c2\u6570\uff0c\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report/record \u76ee\u5f55\u4e0b\u4fdd\u5b58\u5931\u8d25\u7528\u4f8b\u7684\u5f55\u5c4f\u548c\u65ad\u8a00\u7684\u90a3\u4e2a\u65f6\u95f4\u70b9\u7684\u622a\u5c4f\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7\u89c6\u9891\u6587\u4ef6\u770b\u5230\u5931\u8d25\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u90fd\u53d1\u751f\u4e86\u4ec0\u4e48\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#wayland","title":"\u5341\u3001Wayland \u9002\u914d","text":"Wayland \u4e0b\u81ea\u52a8\u5316\u4e3b\u8981\u95ee\u9898\u662f X11 \u4e0b\u7684\u952e\u9f20\u64cd\u4f5c\u65b9\u6cd5\u65e0\u6cd5\u4f7f\u7528\uff0c\u6bd4\u5982 Xdotool\u3001 PyAutoGUI\u3001Xwininfo \u7b49\u7b49\uff1b YouQu \u5728 Wayland \u4e0b\u517c\u5bb9\u9002\u914d\uff0cenv.sh \u5728 Wayland \u4e0b\u6267\u884c\u65f6\u4f1a\u5b89\u88c5\u81ea\u7814\u7684\u952e\u9f20\u64cd\u4f5c\u670d\u52a1\uff08\u53ef\u80fd\u5b58\u5728\u4e00\u4e9b\u4f9d\u8d56\u62a5\u9519\uff0c\u6309\u7167\u6ce8\u91ca\u89e3\u51b3\u5373\u53ef\uff09\uff0c\u6846\u67b6\u6838\u5fc3\u5e93\u4e5f\u9488\u5bf9\u6027\u7684\u505a\u4e86\u9002\u914d\uff0c\u4e0a\u5c42\u7528\u4f8b\u5b8c\u5168\u4e0d\u7528\u5173\u5fc3\u673a\u5668\u662fWayland \u8fd8\u662f X11\uff0c\u6846\u67b6\u4f1a\u6839\u636e\u6267\u884c\u65f6\u72b6\u6001\u81ea\u52a8\u5224\u65ad\u8d70\u4e0d\u540c\u7684\u903b\u8f91\uff1b \u7b80\u5355\u8bb2\u5c31\u662f\uff0c\u5e94\u7528\u5e93\u53ea\u9700\u8981\u7ef4\u62a4\u4e00\u5957\u7528\u4f8b\u811a\u672c\u5373\u53ef\u3002 \u3010\u7528\u4f8b\u517c\u5bb9\u3011 \u56e0\u4e3a Wayland \u4e0b\u6709\u4e9b\u5e94\u7528\u7684\u754c\u9762\u663e\u793a\u548c\u529f\u80fd\u672c\u8eab\u5b58\u5728\u4e00\u4e9b\u5dee\u5f02\uff0c\u7528\u4f8b\u5c42\u53ef\u80fd\u9700\u8981\u5bf9\u8fd9\u90e8\u5206\u7528\u4f8b\u505a\u903b\u8f91\u5224\u65ad\uff0c\u4f7f\u7528\u5168\u5c40\u914d\u7f6e\u91cc\u9762\u7684\u5e38\u91cf\u8fdb\u884c\u903b\u8f91\u7f16\u5199\u5373\u53ef\uff1a from setting.globalconfig import GlobalConfig\n# GlobalConfig.IS_WAYLAND \u83b7\u53d6\u5230\u5f53\u524d\u7684\u663e\u793a\u670d\u52a1\u5668\uff08bool\uff09\n# \u5e94\u7528\u5e93 Config \u7ee7\u627f GlobalConfig\nif Config.IS_WAYLAND:\npass\nif Config.IS_X11:\npass\n \u6bd4\u5982\u7528\u4f8b\u91cc\u9762\u5982\u679c\u65ad\u8a00\u7684\u56fe\u7247\u4e0d\u540c\uff1a if Config.IS_WAYLAND:\nself.assert_image_exist(\"wayland_XXX\")\nelse:\nself.assert_image_exist(\"x11_XXX\")\n \u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u811a\u672c\u5728 Wayland \u548c X11 \u4e0b\u90fd\u53ef\u4ee5\u8dd1\uff0cso easy \u662f\u4e0d\u662f\uff1f\u5b8c\u5168\u6ca1\u5fc5\u8981\u4e13\u95e8\u62c9\u65b0\u5206\u652f\u8fdb\u884c Wayland \u9002\u914d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_9","title":"\u5341\u4e00\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_7","title":"1. \u76ee\u5f55\u7ed3\u6784","text":"\u6267\u884c\u65f6\u4f1a\u5728\u6839\u76ee\u5f55\u4e0b\u52a8\u6001\u751f\u6210 report \u76ee\u5f55\uff0c\u6240\u6709\u7684\u62a5\u544a\u76f8\u5173\u7684\u6587\u4ef6\u4f1a\u7edf\u4e00\u5b58\u653e\u5728\u91cc\u9762\uff0c\u793a\u4f8b\uff1a /report\n \u251c\u2500\u2500 allure # allure\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json\n \u251c\u2500\u2500 allure_html # \u751f\u6210\u7684html\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 index.html \u251c\u2500\u2500 allure_back # allure\u62a5\u544a\u5907\u4efd\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 20221108114823\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json\n \u251c\u2500\u2500 json # json\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 result_deepin-music_20221109134736_1081333.json\n \u251c\u2500\u2500 logs # \u65e5\u5fd7\u6587\u4ef6\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 2022-11-10_debug.log \u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-10_error.log\n \u251c\u2500\u2500 record # \u5f55\u5c4f\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-09\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 15\u65f614\u520609\u79d2_test_music_303_2_autotest.mp4\n \u2514\u2500\u2500 xml # xml\u62a5\u544a\n\u2514\u2500\u2500 autotest_deepin_music-20221109134736.xml\n \u9ed8\u8ba4\u60c5\u51b5\u4e0b\u540c\u65f6\u751f\u6210 html\u3001xml\u3001json\u4e09\u79cd\u5f62\u5f0f\u7684\u62a5\u544a\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_7","title":"2. \u5b9a\u5236\u62a5\u544a","text":"\u6211\u4eec\u5bf9 allure \u62a5\u544a\u8fdb\u884c\u4e86\u4e00\u7cfb\u5217\u7684\u5b9a\u5236\uff1a \u5b9a\u5236 logo\u3001title\u3001\u62a5\u544a\u9ed8\u8ba4\u8bed\u8a00\u4e3a\u4e2d\u6587\uff1b \u52a0\u5165\u4e86\u7528\u4f8b\u65ad\u8a00\u5931\u8d25\u65f6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u4ee5\u53ca\u6b64\u65f6\u56fe\u50cf\u5bf9\u6bd4\u7684\u6a21\u677f\u56fe\u7247\uff1b \u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\uff0c\u4f60\u53ef\u4ee5\u5728 html \u62a5\u544a\u4e2d\u76f4\u63a5\u770b\u5f55\u5236\u7684\u89c6\u9891\uff1b \u52a0\u5165\u4e86 IP \u5730\u5740\u3001\u7cfb\u7edf\u4fe1\u606f\u3001\u955c\u50cf\u7248\u672c\u7b49\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_5","title":"3. \u67e5\u770b\u62a5\u544a","text":" \u672c\u5730\u6267\u884c \u5728 report/allure \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u4e00\u5806\u6587\u672c\u6587\u4ef6\uff0c\u8fd9\u4e9b\u662f allure \u63d2\u4ef6\u751f\u6210\u7684\u62a5\u544a\u6e90\u6570\u636e\uff0c\u6211\u4eec\u5728 report/allure_html \u76ee\u5f55\u4e0b\u7ed9\u4f60\u751f\u6210\u4e86 html \u6587\u4ef6\uff0c\u4f46\u662f\u4f60\u4e0d\u80fd\u76f4\u63a5\u901a\u8fc7\u6d4f\u89c8\u5668\u6253\u5f00 index.html \u6587\u4ef6\uff0c\u56e0\u4e3a allure \u7684\u62a5\u544a\u90fd\u662f\u57fa\u4e8e\u5728\u7ebf\u7684\u670d\u52a1\uff0c\u4f60\u5e94\u8be5\u8fd9\u6837\u6253\u5f00\uff1a allure open report/allure_html\n \u4f7f\u7528 manage.py \u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u5728\u7ec8\u7aef\u7684\u6700\u540e\u4e00\u884c\uff0c\u6211\u4eec\u4f1a\u7ed9\u4f60\u8f93\u51fa\u6253\u5f00\u62a5\u544a\u7684\u547d\u4ee4\uff0c\u76f4\u63a5\u590d\u5236\u5b83\u5728\u7ec8\u7aef\u6267\u884c\u5c31\u53ef\u4ee5\u67e5\u770b\u4e86\uff0c\u50cf\u8fd9\u6837\uff1a \u7ec8\u7aef\u6267\u884c\u547d\u4ee4: allure open /tmp/youqu/report/allure_html \u67e5\u770b\u62a5\u544a \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 Pycharm \u91cc\u9762\u627e\u5230 index.html \u6587\u4ef6\uff0c\u7136\u540e\u53f3\u952e\u9009\u62e9\u6d4f\u89c8\u5668\u6253\u5f00\uff0c\u6216\u8005\u4f60\u53ef\u4ee5\u7528\u4e00\u4e2a http \u670d\u52a1\u6253\u5f00\u3002 \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 report/allure \u76ee\u5f55\u4e0b\u67e5\u770b\u62a5\u544a\uff1a allure serve report/allure\n \u8fdc\u7a0b\u6267\u884c \u8fdc\u7a0b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\uff0c\u4f1a\u5c06\u6240\u6709\u8fdc\u7a0b\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u62a5\u544a\u90fd\u6536\u96c6\u5230 report/allure \u76ee\u5f55\u4e0b\uff0c\u5206\u522b\u6309\u7167\u673a\u5668\u7684 IP \u7b49\u5efa\u4e86\u4e0d\u540c\u7684\u76ee\u5f55\uff0c\u4f60\u53ef\u4ee5\u5728\u8fd9\u4e9b\u76ee\u5f55\u91cc\u9762\u53bb\u67e5\u770b\u5bf9\u5e94\u7684\u6d4b\u8bd5\u62a5\u544a\uff0c\u67e5\u770b\u65b9\u6cd5\u548c\u524d\u9762\u672c\u5730\u6267\u884c\u67e5\u770b\u7684\u65b9\u6cd5\u4e00\u6837\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_10","title":"\u5341\u4e8c\u3001\u9759\u6001\u4ee3\u7801\u626b\u63cf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_8","title":"1. \u63d0\u524d\u89e3\u51b3\u4ee3\u7801\u95ee\u9898","text":"\u4e3a\u4e86\u5e2e\u52a9\u5f00\u53d1\u8005\u7edf\u4e00\u4ee3\u7801\u98ce\u683c\uff0cPython \u793e\u533a\u63d0\u51fa\u4e86 PEP8 \u4ee3\u7801\u7f16\u7801\u98ce\u683c\uff0cPython \u5b98\u65b9\u540c\u65f6\u63a8\u51fa\u4e86\u4e00\u4e2a\u68c0\u67e5\u4ee3\u7801\u98ce\u683c\u662f\u5426\u7b26\u5408 PEP8 \u7684\u5de5\u5177\uff0c\u540d\u5b57\u4e5f\u53eb PEP8\u3002 \u4f46\u662f\uff0cPycharm \u91cc\u9762\u7684 PEP8 \u63d2\u4ef6\u5b9e\u9645\u4e0a\u5e76\u4e0d\u80fd\u53d1\u73b0\u5f88\u591a\u4ee3\u7801\u95ee\u9898\uff0c\u8fd9\u4e9b\u95ee\u9898\u5e76\u4e0d\u4f1a\u5728\u8fd0\u884c\u65f6\u62a5\u9519\uff0c\u56e0\u4e3a\u4ece Python \u8bed\u8a00\u89d2\u5ea6\u5e76\u4e0d\u5173\u5fc3\u8fd9\u4e9b\u95ee\u9898\uff0c\u5728 Pycharm \u7f16\u8f91\u5668\u91cc\u9762\u4f7f\u7528\u5feb\u6377\u952e ctrl + alt + L\uff0c\u6709\u4e00\u70b9\u70b9\u683c\u5f0f\u5316\u7684\u6548\u679c\uff0c\u80fd\u89e3\u51b3\u4e00\u4e9b\u7a7a\u683c\u3001\u6362\u884c\u7b49\u5c0f\u95ee\u9898\u3002 \u8fd9\u91cc\u63a8\u8350\u4e00\u4e2a Python \u793e\u533a\u6d41\u884c\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff1a Black\uff0c\u53f7\u79f0\u4e0d\u59a5\u534f\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff0c\u5b83\u68c0\u6d4b\u5230\u4e0d\u7b26\u5408\u89c4\u8303\u7684\u4ee3\u7801\u98ce\u683c\u76f4\u63a5\u5c31\u5e2e\u4f60\u5168\u90e8\u683c\u5f0f\u5316\u597d\uff0c\u5c31\u662f\u8fd9\u4e48\u521a\uff01 \u5b89\u88c5\uff1a sudo pip3 install black \n \u4f7f\u7528\u65b9\u6cd5\uff1a black ${CheckPath}\n \u4f7f\u7528\u8fd9\u4e2a\u5de5\u5177\u683c\u5f0f\u5316\u4e4b\u540e\uff0c\u4ee3\u7801\u4f1a\u88ab\u81ea\u52a8\u8c03\u6574\uff0c\u521a\u5f00\u59cb\u4f60\u53ef\u80fd\u4f1a\u89c9\u5f97\u8c03\u6574\u5f97\u5f88\u5938\u5f20\uff0c\u6ca1\u5173\u7cfb\u575a\u6301\u770b\uff0c\u4e60\u60ef\u4e4b\u540e\uff0c\u4f60\u4f1a\u89c9\u5f97\u5f88\u4f18\u96c5\uff0c\u6ca1\u9519\uff0c\u8fd9\u5c31\u662f Pythonic Code \u7684\u6838\u5fc3\uff0c\u8bf7\u4fdd\u6301\u4f18\u96c5\uff5e\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_8","title":"2. \u4ee3\u7801\u626b\u63cf\u5de5\u5177","text":"\u4f7f\u7528\u6839\u76ee\u5f55\u4e0b pylint.sh \u626b\u63cf\u4ee3\u7801\uff0c\u5728 report \u76ee\u5f55\u4e0b\u67e5\u770b\u4ee3\u7801\u626b\u63cf\u62a5\u544a\uff0c\u5982\u679c\u6709\u4ee3\u7801\u95ee\u9898\u8bf7\u63d0\u524d\u89e3\u51b3\u4e4b\u540e\u518d\u63d0\u4ea4\u3002 \u6b64\u811a\u672c\u5df2\u7ecf\u4f7f\u7528 Python \u793e\u533a\u6700\u6d41\u884c\u7684\u4ee3\u7801\u626b\u63cf\u5de5\u5177 Pylint \u8fdb\u884c\u4ee3\u7801\u626b\u63cf\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a bash pylint.sh\n \u8fd0\u884c\u4e4b\u540e\u4f1a\u63d0\u793a\u4f60\u8981\u626b\u63cf\u7684\u76ee\u5f55\uff0c\u6bd4\u5982\u8f93\u5165 apps \uff0c\u5219\u4f1a\u626b\u63cf apps \u4e0b\u7684\u6240\u6709 Python \u4ee3\u7801\u3002 \u5728 setting/pylintrc.cfg \u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u76f8\u5173\u914d\u7f6e\uff0c\u626b\u63cf\u5b8c\u6210\u4e4b\u540e\u5728 report/pylints \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u626b\u63cf\u62a5\u544a\u3002 \u4ee3\u7801\u63d0\u4ea4\u9700\u901a\u8fc7 git review \u63d0\u4ea4\u5230 gerrit \uff0c\u4eba\u5de5 Code Review \u901a\u8fc7\u4e4b\u540e\u5408\u5165\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_11","title":"\u5341\u4e09\u3001\u63d0\u4ea4\u4ee3\u7801","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_9","title":"1. \u5b89\u88c5\u4f9d\u8d56","text":"sudo apt install git-review\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_9","title":"2. \u63d0\u4ea4\u6a21\u677f","text":"\u5728 ~ \u76ee\u5f55\u4e0b\u65b0\u5efa\u6587\u4ef6\uff0c\u5e76\u547d\u540d\u4e3a gitcommit_template \u5c06\u4ee5\u4e0b\u5185\u5bb9\u5199\u5165\u6587\u4ef6\u5f53\u4e2d\uff1a # commit type :fix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style(\u98ce\u683c\u4fee\u6539)\u3001refactor(\u91cd\u6784)\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test(\u6d4b\u8bd5) + \u7b80\u5355\u63cf\u8ff0. \u9ed8\u8ba4fix,\u6839\u636e\u60c5\u51b5\u4fee\u6539\nfix: \n\n# \u8be6\u7ec6\u8bf4\u660e\u4ee3\u7801\u7684\u6539\u52a8\uff0c\u5305\u542b\u4ee3\u7801\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u4ee5\u53ca\u4e3a\u4ec0\u4e48\u8fd9\u4e48\u505a\uff0c\u53ef\u80fd\u4f1a\u5f71\u54cd\u54ea\u4e9b\u529f\u80fd\u3002\u5bf9\u4e8e\u4ee3\u7801\u7684\u5ba1\u6838\u8005\uff0c\u9700\u8981\u4ece\u8fd9\u6bb5\u63cf\u8ff0\u4e2d\u80fd\u5b8c\u5168\u7406\u89e3\u4ee3\u7801\u4e2d\u6240\u6709\u6539\u52a8\u7684\u5185\u5bb9\nDescription: \n\n# \u5199\u4e00\u6bb5\u9762\u5411\u4e8e\u4ea7\u54c1\u7684\u603b\u7ed3\u6027\u5185\u5bb9\uff0c\u7528\u4e8e\u81ea\u52a8\u751f\u6210crp\u4e0a\u7684changlog\uff0c\u9700\u8981\u6ce8\u610f\u7684\u4e8b\uff0c\u8fd9\u6bb5\u63cf\u8ff0\u5fc5\u987b\u4ece\u4ea7\u54c1\u7684\u89d2\u5ea6\u8003\u8651\u3002\nLog: \n\n# \u5173\u8054pms\u4e0a\u7684bug\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94bug\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4fee\u590dbug\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Bug: \n\n# \u4fee\u590d github issue \n#Issue: \n\n# \u5173\u8054pms\u4e0a\u7684\u4efb\u52a1\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94\u4efb\u52a1\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4efb\u52a1\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Task: \n \u547d\u4ee4\u884c\u6267\u884c: git config --global commit.template ~/gitcommit_template\n \u6b64\u547d\u4ee4\u5c06\u6a21\u677f\u52a0\u5165\u5230 git \u7684\u63d0\u4ea4\u6a21\u677f\u4e2d\u3002 \u540e\u7eed\u63d0\u4ea4\u7684\u65f6\u5019\u9700\u8981\u5173\u6ce8\u4e00\u4e0b\u51e0\u70b9\uff1a commit type \u5bf9\u5e94\u4e0d\u540c\u7684\u4fee\u6539\u7c7b\u578b\uff1afix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style \uff08\u98ce\u683c\u4fee\u6539\uff09\u3001refactor \uff08\u91cd\u6784\uff09\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test \uff08\u6d4b\u8bd5\uff09 commit type \u5192\u53f7\u540e\u9762\u52a0\u7a7a\u683c\u3002 Description \u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u9700\u8981\u8fdb\u884c\u8be6\u7ec6\u8bf4\u660e\uff0c\u6bd4\u5982\u5bf9\u529f\u80fd\u8fdb\u884c\u5927\u6539\u7b49\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_6","title":"3. \u63a8\u9001\u4ee3\u7801","text":"\u9996\u5148\u6dfb\u52a0 commit \u4fe1\u606f git add \u540e\u9762\u52a0\u6587\u4ef6\u540d\u79f0\n git add . # \u8868\u793a\u6dfb\u52a0\u6240\u6709\u6587\u4ef6\n \u4f7f\u7528\u8fd9\u6761\u547d\u4ee4\u6ce8\u610f\u6709\u4e9b\u4e34\u65f6\u6587\u4ef6\u4e0d\u8981\u63d0\u4ea4\u5230\u4ed3\u5e93\u4e86\u3002 git commit -a\n \u4e4b\u540e\u5728 fix: \u540e\u9762\uff08\u6ce8\u610f\u5192\u53f7\u540e\u9762\u5fc5\u987b\u52a0\u7a7a\u683c\uff0c\u4e0d\u7136\u76f4\u63a5-1\uff09\u5199\u672c\u5730\u63d0\u4ea4\u7684 commit \u4fe1\u606f\uff0c\u7136\u540e\u5c31\u53ef\u4ee5\u63d0\u4ea4\u4ee3\u7801\u4e86 git review branch(\u5f53\u524d\u5206\u652f) -r origin\n \u6700\u597d\u4e00\u6b21 commit\uff0c\u4e00\u6b21 git review \uff0c\u7ecf\u5e38\u6709\u540c\u5b66\u5728\u672c\u5730\u75af\u72c2 commit \u6700\u540e git review \u62a5\u9519\u4e0d\u77e5\u9053\u548b\u56de\u4e8b\u513f\u3002 \u82e5\u4e0d\u60f3\u6bcf\u6b21\u63d0\u4ea4\u90fd\u52a0\u4e0a -r \u9009\u9879\uff0c\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a git config --global gitreview.remote origin \u63d0\u4ea4\u4ee3\u7801\uff0c\u76f4\u63a5\u4f7f\u7528 git review branch<\u76ee\u6807\u5206\u652f>\uff0c\u4f8b\u5982 git review master"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git","title":"4. Git\u6807\u7b7e","text":"Git \u6807\u7b7e\u5b9e\u9645\u4e0a\u662f commit \u7684\u4e00\u4e2a\u522b\u540d\uff0c\u4e3b\u8981\u7528\u4e8e\u7ba1\u7406\u5386\u53f2\u7248\u672c\u3002 \u60f3\u8c61\u4e00\u4e0b\u9886\u5bfc\u8ba9\u4f60\u628a\u4e4b\u524d\u7684\u67d0\u4e2a\u7248\u672c\u7684\u4ee3\u7801\u62c9\u51fa\u6765\u8dd1\uff0c\u4f60\u662f\u4e0d\u662f\u4e56\u4e56\u7684\u53bb\u628a\u6240\u6709\u63d0\u4ea4\u8bb0\u5f55\u62c9\u51fa\u6765\u627e\uff0c\u7136\u540e\u627e\u5230\u90a3\u4e2a\u54c8\u5e0c\u503c\uff0c\u901a\u8fc7\u54c8\u5e0c\u503c\u6765\u68c0\u51fa\u4ee3\u7801\u3002 \u8fd9\u4e00\u5957\u64cd\u4f5c\u4e0b\u6765\u662f\u4e0d\u662f\u5f88\u9ebb\u70e6\uff0c\u8d39\u65f6\u95f4\u8fd8\u4e0d\u4e00\u5b9a\u80fd\u627e\u5f97\u5230\uff0c\u6ca1\u4eba\u80fd\u8bb0\u4f4f\u6bcf\u4e2a\u63d0\u4ea4\u54c8\u5e0c\u503c\u4ee5\u53ca\u8fd9\u6b21\u63d0\u4ea4\u90fd\u6539\u4e86\u54ea\u4e9b\u4ee3\u7801\u3002 \u56e0\u6b64\u7ed9\u63d0\u4ea4\u6253\u4e2a\u6807\u7b7e\uff0c\u5c31\u662f\u628a\u54c8\u5e0c\u503c\u8f6c\u6362\u6210\u4eba\u7c7b\u80fd\u7406\u89e3\u7684\u8bed\u8a00\uff0c\u6bd4\u5982 v1.0\uff0c\u5c31\u53ef\u4ee5\u76f4\u63a5\u901a\u8fc7\u6807\u7b7e\u627e\u5230\u5bf9\u5e94\u7684\u63d0\u4ea4\u3002 \u65b0\u5efa\u6807\u7b7e git tag -a <tagname>\n \u56de\u8f66\u4e4b\u540e\uff0cGit \u4f1a\u6253\u5f00\u4f60\u7684\u7f16\u8f91\u5668\uff0c\u8ba9\u4f60\u5199\u4e00\u53e5\u6807\u7b7e\u6ce8\u89e3\uff0c\u5c31\u50cf\u4f60\u7ed9\u63d0\u4ea4\u5199\u6ce8\u89e3\u4e00\u6837\u3002 \u67e5\u770b\u6240\u6709\u6807\u7b7e git tag -l\n# git tag \u4e5f\u884c\n \u5220\u9664\u6807\u7b7e git tag -d <tagname>\n \u63a8\u9001\u6807\u7b7e\u81f3\u8fdc\u7a0b git push \u547d\u4ee4\u5e76\u4e0d\u4f1a\u4f20\u9001\u6807\u7b7e\u5230\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\uff0c\u5fc5\u987b\u663e\u5f0f\u5730\u63a8\u9001\u6807\u7b7e\u3002 git push origin <tagname>\n \u63a8\u9001\u6240\u6709\u4e0d\u5728\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\u7684\u6807\u7b7e git push origin --tag\n \u5220\u9664\u8fdc\u7a0b\u6807\u7b7e git push origin :refs/tag/<tagname>\n \u540e\u671f\u6253\u6807\u7b7e \u5148\u7528 git log --pretty=oneline \u67e5\u8be2\u63d0\u4ea4\u8bb0\u5f55\uff0c\u83b7\u53d6\u6821\u9a8c\u7801\u3002 git tag -a <tagname> 9fceb02(\u6821\u9a8c\u7801)\n \u68c0\u51fa\u6807\u7b7e git checkout <tagname>\n \u6b64\u65f6\uff0c\u4ed3\u5e93\u4f1a\u5904\u4e8e\u201c\u5206\u79bb\u5934\u6307\u9488\uff08detached HEAD\uff09\u201d\u7684\u72b6\u6001\u3002 \u5728\u201c\u5206\u79bb\u5934\u6307\u9488\u201d\u72b6\u6001\u4e0b\uff0c\u5982\u679c\u4f60\u505a\u4e86\u67d0\u4e9b\u66f4\u6539\u7136\u540e\u63d0\u4ea4\u5b83\u4eec\uff0c\u6807\u7b7e\u4e0d\u4f1a\u53d1\u751f\u53d8\u5316\uff0c \u4f46\u4f60\u7684\u65b0\u63d0\u4ea4\u5c06\u4e0d\u5c5e\u4e8e\u4efb\u4f55\u5206\u652f\uff0c\u5e76\u4e14\u5c06\u65e0\u6cd5\u8bbf\u95ee\uff0c\u9664\u975e\u901a\u8fc7\u786e\u5207\u7684\u63d0\u4ea4\u54c8\u5e0c\u624d\u80fd\u8bbf\u95ee\u3002 \u56e0\u6b64\uff0c\u5982\u679c\u4f60\u9700\u8981\u8fdb\u884c\u66f4\u6539\uff0c\u6bd4\u5982\u4f60\u8981\u4fee\u590d\u65e7\u7248\u672c\u4e2d\u7684\u9519\u8bef\uff0c\u90a3\u4e48\u901a\u5e38\u9700\u8981\u521b\u5efa\u4e00\u4e2a\u65b0\u5206\u652f\uff1a git checkout -b <NewBranchName> <tagname>\n \u65b0\u5206\u652f\u4e0a\u53ef\u4ee5\u8fdb\u884c\u63d0\u4ea4\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_12","title":"\u5341\u56db\u3001\u5e38\u89c1\u95ee\u9898","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_10","title":"1. \u63d0\u4ea4\u4ee3\u7801\u65f6\u63d0\u793a\u90ae\u7bb1\u6216\u8005\u540d\u79f0\u4e0d\u5bf9","text":"\u91cd\u65b0\u914d\u7f6e\u90ae\u7bb1\u6216\u8005\u540d\u79f0\uff0c\u7136\u540e\u91cd\u7f6e\u751f\u6548\uff1a git commit --amend --reset-author\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_10","title":"2. \u600e\u4e48\u56de\u6eda\u5230\u4e4b\u524d\u7684\u7248\u672c","text":"(1)\u67e5\u8be2\u5386\u53f2\u63d0\u4ea4\u8bb0\u5f55 git log\n \u627e\u5230\u4f60\u8981\u56de\u6eda\u7684\u7248\u672c\uff0c\u590d\u5236 hash \u503c\u3002 \u6ce8\u610f\uff1a\u662f commit \u7a7a\u683c\u4e4b\u540e\u7684 hash \u503c\uff0c\u4e4b\u524d\u6709\u540c\u5b66\u590d\u5236\u7684 Change-Id: \u8fd9\u6837\u80af\u5b9a\u62a5\u9519\u3002 (2)\u56de\u6eda\u7248\u672c\uff0c\u4e0d\u6e05\u9664\u4ee3\u7801 git reset --soft ${hash}\n (3)\u56de\u6eda\u7248\u672c\uff0c\u6e05\u9664\u4ee3\u7801\uff0c\u614e\u7528\u54c8 git reset --hard ${hash}\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-f-s-e","title":"3. \u6d4b\u8bd5\u62a5\u544a\u91cc\u9762 F S . E \u662f\u4ec0\u4e48\u610f\u601d","text":"F \u8868\u793a\u5931\u8d25\uff0c. \uff08\u70b9\uff09\u8868\u793a\u901a\u8fc7\uff0cS \u8868\u793a\u8df3\u8fc7\uff0cE \u8868\u793a error \u6709\u62a5\u9519"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git-status","title":"4. \u89e3\u51b3 git status \u4e2d\u6587\u663e\u793a\u7684\u95ee\u9898","text":"git config --global core.quotePath false\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5-apps","title":"5. apps \u76ee\u5f55\u4e0b\u989c\u8272\u6709\u4e9b\u662f\u9ec4\u8272\u7684","text":"\u5728 Pycharm \u4e2d apps \u76ee\u5f55\u4e0b\u5e94\u7528\u5e93\u6587\u4ef6\u662f\u9ec4\u8272\u7684\uff0c\u7f16\u8f91\u5668\u8bc6\u522b\u4e0d\u5230\u4ee3\u7801\u65b0\u589e\u548c\u4fee\u6539\uff1b \u7531\u4e8e\u793e\u533a\u7248 Pycharm \u4e0d\u80fd\u52a8\u6001\u8bc6\u522b\u591a\u4ed3\u5e93\uff0c\u9700\u8981\u5728 setting \u91cc\u9762\u624b\u52a8\u6ce8\u518c\uff0c\u64cd\u4f5c\u6b65\u9aa4\uff1a File \u2014> Settings \u2014> Version Control \u2014> \u70b9 + \u53f7 \u2014> Directory \u9009\u4e2d\u5e94\u7528\u5e93\u5de5\u7a0b\u76ee\u5f55 \u2014> VCS \u9009\u4e2d Git \u2014> Apply \u5982\u6b64\u5c31\u53ef\u4ee5\u4e86\u3002 \u4e13\u4e1a\u7248 Pycharm \u4e0d\u5b58\u5728\u8fd9\u4e2a\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#6-envsh-r","title":"6. \u6267\u884c env.sh \u62a5\u9519 $'\\r':\u672a\u627e\u5230\u547d\u4ee4","text":"\u51fa\u73b0\u8fd9\u4e2a\u95ee\u9898\u4f60\u5e94\u8be5\u662f\u5728 windows \u4e0a\u6253\u5f00\u6216\u7f16\u8f91\u8fc7 env.sh \u811a\u672c\uff0cwindows\u4e0b\u7684\u6362\u884c\u662f\u56de\u8f66\u7b26+\u6362\u884c\u7b26\uff0c\u4e5f\u5c31\u662f\\r\\n\uff0c\u800c Linxu \u4e0b\u662f\u6362\u884c\u7b26 \\n\uff0cLinux \u4e0b\u4e0d\u8bc6\u522b \\r\uff0c\u56e0\u6b64\u62a5\u9519\u3002 \u89e3\u51b3\u65b9\u6848\uff1a # \u5c06 \\r \u66ff\u6362\u4e3a\u7a7a\nsudo sed -i 's/\\r//' env.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#7","title":"7.\u600e\u6837\u4e3a\u5355\u72ec\u67d0\u4e00\u6761\u7528\u4f8b\u914d\u7f6e\u6267\u884c\u8d85\u65f6\u65f6\u95f4","text":"\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u5982\u4e0b\uff1a @pytest.mark.timeout(300) # \u5355\u4f4d\u79d2\ndef test_xxx_001():\npass\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#8-youqu","title":"8. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u6240\u6709\u4ee3\u7801\uff0c\u5305\u542b\u5b50\u4ed3\u5e93","text":"\u524d\u7f6e\u6761\u4ef6\uff1a\u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 # \u7b2c\u4e00\u6b21\u5b58\u50a8\u5bc6\u7801\uff0c\u63d0\u4f9b\u540e\u9762\u62c9\u4ee3\u7801(gerrit: ldap\u8d26\u53f7\u548c\u5bc6\u7801\uff0cgit\u62c9\u53d6\u7b2c\u4e00\u6b21\u8f93\u5165\u4fdd\u5b58\uff0c\u540e\u9762\u76f4\u63a5\u4f7f\u7528)\ngit config --global credential.helper store\n\n# \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\uff0c\u5e76\u9012\u5f52\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\" --recursive\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#9-youqu","title":"9. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\u6307\u5b9a\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u524d\u7f6e\u6761\u4ef6\uff1a \u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 \u5df2\u5b58\u50a8\u8bbf\u95ee\u5bc6\u7801 # \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\"\n# \u6307\u5b9a\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ncd youqu\ngit submodule update --init apps/autotest_xxx_xxx\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#10-youqu","title":"10. \u5982\u4f55\u66f4\u65b0 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\uff0c\u6240\u6709\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u66f4\u65b0\u6240\u6709\u5b50\u4ed3\u5e93\u4ee3\u7801 cd youqu\ngit pull & git submodule foreach git pull\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#11-youqu-master-detached-head","title":"11. \u5982\u4f55\u4fee\u590d YouQu \u6240\u6709\u5b50\u4ed3\u5e93 master \u5206\u652f\u6e38\u79bb\u5934\uff08detached head\uff09","text":"\u4fee\u590d\u6240\u6709\u5b50\u4ed3\u5e93\u9ed8\u8ba4master \u5206\u652f\u6e38\u79bb\u5934 cd youqu\ngit submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/","title":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212 \u5206\u7c7b\uff1a/ \u67b6\u6784\u5e08\uff1a/ \u76ee\u6807\uff1a \u5e94\u7528 AT \u67b6\u6784\u5de5\u7a0b\u5316\uff0c\u53c2\u8003\u6027\u80fd\u81ea\u52a8\u5316\u5de5\u7a0b\u5b8c\u6210\u5de5\u7a0b\u5316\u6539\u9020\u3002 \u5e94\u7528\u95f4\u7528\u4f8b\u89e3\u8026\uff0c\u89e3\u9664\u6240\u6709\u4ea4\u53c9\u8c03\u7528\u7684\u65b9\u6cd5\uff0c\u5404\u5e94\u7528\u80fd\u8ddf\u968f\u81ea\u8eab\u8fed\u4ee3\u5468\u671f\u72ec\u7acb\u7ef4\u62a4 AT \u7528\u4f8b\u3002 \u5b8c\u6210\u516c\u5171\u65b9\u6cd5\u7684\u62bd\u53d6\u6574\u5408\uff0c\u5f62\u6210\u4e00\u5957\u72ec\u7acb\u4e8e\u5e94\u7528\u95f4\u7684\u516c\u5171\u65b9\u6cd5\u5e93\uff0c\u5404\u5e94\u7528\u65b9\u6cd5\u91cc\u9762\u4e0d\u5b58\u5728\u88ab\u591a\u4e2a\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\u3002 \u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u4e3a\u5c06\u6765\u9002\u914d\u66f4\u591a\u7684 AT \u8fd0\u7528\u573a\u666f\u63d0\u4f9b\u652f\u6491\uff0c\u539f\u5219\u4e0a\u53ef\u5b9e\u73b0\u65e0\u9650\u6269\u5c55\uff0c\u5728\u6bcf\u65e5\u6784\u5efa\u548c\u6301\u7eed\u96c6\u6210\u6d41\u7a0b\u843d\u5730\u4f7f\u7528\u3002 \u4ee3\u7801\u89c4\u8303\u95ee\u9898\u6e05\u96f6\uff0c\u7b26\u5408 Shell Check\u3001Pylint\u3001\u7cfb\u7edf\u90e8\u76f8\u5173\u7f16\u7801\u89c4\u8303\u8981\u6c42\u3002 \u610f\u4e49\uff1a \u7edf\u4e00\u6210\u7814 AT \u67b6\u6784\u8bbe\u8ba1\u601d\u8def\uff0c\u6d88\u9664 AT \u4ee3\u7801\u5b9e\u73b0\u548c\u7ef4\u62a4\u4e0a\u53ef\u80fd\u51fa\u73b0\u7684\u5206\u6b67\uff0c\u6539\u5584\u5386\u53f2 AT \u65e0\u5de5\u7a0b\u5316\u8bbe\u8ba1\u7684\u7f3a\u9677\uff0c\u63d0\u9ad8\u67b6\u6784\u4e13\u4e1a\u6027\u3002 \u5404\u5e94\u7528 AT \u4ee3\u7801\u76f8\u4e92\u72ec\u7acb\uff0c\u5951\u5408\u5e94\u7528\u72ec\u7acb\u53d1\u5e03\u7279\u6027\uff0c\u53ef\u652f\u6301\u8fed\u4ee3\u671f\u95f4\u72ec\u7acb\u65b0\u589e\u3001\u7ef4\u62a4\u548c\u6267\u884c\u3002 \u65b9\u6cd5\u8c03\u7528\u903b\u8f91\u5f97\u5230\u7b80\u5316\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u66f4\u9ad8\u6548\uff1b\u516c\u5171\u5e93\u62bd\u53d6\uff0c\u51cf\u5c11\u65b9\u6cd5\u91cd\u590d\u7f16\u5199\uff0c\u63d0\u9ad8\u4ee3\u7801\u5229\u7528\u7387\uff1b\u5e73\u5747\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u4ece40\u5206\u949f\u964d\u4f4e\u81f330\u5206\u949f\uff0c\u65e5\u4ea7\u51fa\u7528\u4f8b\u4ece12\u6761/\u5929\u63d0\u5347\u81f316\u6761/\u5929\u3002 \u53ef\u7075\u6d3b\u652f\u6491\u4e0d\u540c\u7684\u81ea\u52a8\u5316\u8fd0\u7528\u573a\u666f\uff0c\u5982 CI\u3001\u5192\u70df\u6d4b\u8bd5\u3001\u96c6\u6210\u6d4b\u8bd5\u3001\u56de\u5f52\u6d4b\u8bd5\u3001\u4e13\u9879\u6d4b\u8bd5\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_2","title":"\u4e00\u3001\u80cc\u666f\u4ecb\u7ecd","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1","title":"1\u3001\u73b0\u6709\u67b6\u6784\u4ecb\u7ecd","text":"\u73b0\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u6574\u4f53\u5206\u4e3a\u4e09\u5c42\uff1a\u7528\u4f8b\u5c42\uff08\u4e1a\u52a1\u903b\u8f91\u5c42\uff09\u3001\u4e2d\u95f4\u5c42\uff08\u5143\u7d20\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff09\u3001\u6838\u5fc3\u5c42\uff08\u5e95\u5c42\u529f\u80fd\u5e93\u5c42\uff09\u3002 \u7528\u4f8b\u5c42\uff1a\u5373\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4e13\u6ce8\u4e8e\u4e1a\u52a1\u529f\u80fd\u903b\u8f91\uff0c\u4e0d\u5173\u5fc3\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\uff1b \u4e2d\u95f4\u5c42\uff1a\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff0c\u6bcf\u4e2a\u65b9\u6cd5\u5747\u5bf9\u5e94\u4e00\u4e2a\u5143\u7d20\u7684\u4e00\u4e2a\u5177\u4f53\u64cd\u4f5c\uff0c\u4e5f\u53ef\u4ee5\u662f\u591a\u4e2a\u64cd\u4f5c\u7684\u7ec4\u5408\u64cd\u4f5c\uff0c\u4e2d\u95f4\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u7528\u4f8b\u5c42\uff0c\u5177\u6709\u53ef\u6269\u5c55\u6027\u548c\u590d\u7528\u6027\uff1b \u6838\u5fc3\u5c42\uff1a\u4e3b\u8981\u5c01\u88c5\u7684\u5e95\u5c42\u529f\u80fd\u5b9e\u73b0\uff0c\u6b64\u5c42\u5728\u6846\u67b6\u4e2d\u63d0\u4f9b\u4e00\u4e9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u529f\u80fd\u6a21\u5757\u76f8\u5bf9\u72ec\u7acb\uff0c\u6838\u5fc3\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u64cd\u4f5c\u5c42\uff0c\u6bd4\u5982\uff1a\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7 UI \u5750\u6807\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u952e\u9f20\u64cd\u4f5c\u7684\u57fa\u7840\u65b9\u64cd\u4f5c\u6a21\u5757\u3001Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757\u3001\u6587\u4ef6\u7684\u589e\u5220\u6539\u67e5\u64cd\u4f5c\u6a21\u5757\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2","title":"2\u3001\u81ea\u52a8\u5316\u7684\u5e94\u7528","text":"2.1\u3001CI \u6d41\u7a0b \u6bcf\u65e5\u6784\u5efa\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u7814\u53d1\u6bcf\u65e5\u63d0\u4ea4\u7684\u4ee3\u7801\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u73ed\u4e4b\u540e\u4f1a\u5c06\u5404\u5e94\u7528\u8fdb\u884c\u6253\u5305\uff0c\u7136\u540e\u5728\u6d4b\u8bd5\u673a\u4e0a\u5b89\u88c5\u66f4\u65b0 deb \u5305\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u5e94\u7528\u63d0\u4ea4\u96c6\u6210\u7684\u7248\u672c\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u8f7d\u6700\u65b0\u7684 ISO \u8fdb\u884c PXE \u90e8\u7f72\uff0c\u7136\u540e\u6d4b\u8bd5\u673a\u5b89\u88c5\u6700\u65b0\u7684\u955c\u50cf\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 2.2\u3001\u9a8c\u6536\u6d4b\u8bd5 \u5728\u5404\u9a8c\u6536\u8282\u70b9\u8fdb\u884c\u81ea\u52a8\u5316\u9a8c\u6536\uff0c\u76ee\u524d\u7684\u7b56\u7565\u662f\u5168\u7528\u4f8b\u8986\u76d6\u5168\u67b6\u6784\u3002 2.3\u3001\u56de\u5f52\u6d4b\u8bd5 \u56de\u5f52\u6d4b\u8bd5\u4eca\u5e74\u89c4\u5212\u5efa\u8bbe\u4e2d\uff0c\u65e8\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u6267\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\uff0c\u51cf\u5c11\u529f\u80fd\u6d4b\u8bd5\u7684\u91cd\u590d\u52b3\u52a8\u529b\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3","title":"3\u3001\u5b58\u5728\u7684\u95ee\u9898","text":" \u5404\u5e94\u7528\u4e4b\u95f4\u5b58\u5728\u8026\u5408 \u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u521d\u671f\uff0c\u6240\u6709\u5e94\u7528\u662f\u6574\u4f53\u53d1\u5e03\uff0c\u6211\u4eec\u662f\u5c06\u6240\u6709\u5e94\u7528\u770b\u6210\u662f\u4e00\u4e2a\u6574\u4f53\uff0c\u5404\u5e94\u7528\u4f5c\u4e3a\u5176\u4e2d\u7684\u4e00\u4e2a\u6a21\u5757\uff0c\u6240\u4ee5\u5b58\u5728\u5e94\u7528\u95f4\u65b9\u6cd5\u4ea4\u53c9\u8c03\u7528\u7684\u95ee\u9898\uff0c\u8fd9\u6837\u4ece\u6700\u521d\u7684\u8bbe\u8ba1\u6765\u8bb2\u786e\u5b9e\u80fd\u591f\u51cf\u5c11\u91cd\u590d\u4ee3\u7801\u7684\u7f16\u5199\u3002\u4f46\u662f\u73b0\u5728\u5e94\u7528\u8d70\u72ec\u7acb\u53d1\u5e03\uff0c\u5404\u5e94\u7528\u90fd\u6709\u81ea\u5df1\u7684\u8fed\u4ee3\u8282\u594f\uff0c\u5728\u65b0\u9700\u6c42\u5feb\u901f\u53d8\u5316\u7684\u8fc7\u7a0b\u4e2d\uff0c\u81ea\u52a8\u5316\u7ef4\u62a4\u53d8\u5f97\u5f02\u5e38\u56f0\u96be\uff0c\u539f\u56e0\u5c31\u662f\u81ea\u52a8\u5316\u9879\u76ee\u91cc\u9762\u5404\u4e2a\u5e94\u7528\u7684\u6709\u6bd4\u8f83\u591a\u7684\u8026\u5408\u5173\u7cfb\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u8fdb\u884c\u89e3\u8026\uff0c\u4ee5\u9002\u5e94\u5e94\u7528\u4e0d\u540c\u7684\u8fed\u4ee3\u5468\u671f\u3002 \u65e0\u6cd5\u7cbe\u51c6\u7684\u5212\u5206\u7528\u4f8b\u8303\u56f4 \u7528\u4f8b\u6267\u884c\u7684\u8303\u56f4\u4e0d\u591f\u7cbe\u51c6\uff0c\u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u4e3b\u8981\u901a\u8fc7\u7528\u4f8b\u7684\u5173\u952e\u8bcd core\uff08\u6838\u5fc3\uff09\u6765\u533a\u5206\u7528\u4f8b\u662f\u5426\u4e3a\u6838\u5fc3\u7528\u4f8b\uff0c\u4f46\u662f\u8fd9\u6837\u7684\u533a\u5206\u592a\u5bbd\u6cdb\u4e86\uff0c\u4e0d\u80fd\u9002\u5e94\u81ea\u52a8\u5316\u6d4b\u8bd5\u5728\u591a\u573a\u666f\u4e0b\u7684\u5e94\u7528\u3002\u5f88\u591a\u573a\u666f\u4e0b\u6211\u4eec\u8fd8\u9700\u8981\u6839\u636e\u7528\u4f8b\u7684\u7b49\u7ea7\u3001\u7528\u4f8b\u7684\u7c7b\u578b\u3001\u7528\u4f8b\u6765\u6e90\u7b49\u7b49\uff0c\u4e0d\u540c\u7684\u7ef4\u5ea6\u6765\u6311\u9009\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u5173\u952e\u5b57\u9700\u8981\u4eba\u5de5\u4e00\u6761\u6761\u7684\u6539\uff0c\u8d39\u65f6\u8d39\u529b\uff0c\u800c\u4e14\u4e0d\u597d\u7ef4\u62a4\u3002 \u53d7\u65b0\u9700\u6c42\u5f71\u54cd\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u597d\u7ef4\u62a4 \u76ee\u524d\u9700\u8981\u8df3\u8fc7\u7684\u7528\u4f8b\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684\u7528\u4f8b\u811a\u672c\u91cc\u9762\uff0c\u6dfb\u52a0\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\uff0c\u540e\u7eed\u89e3\u9664\u8df3\u8fc7\u7684\u65f6\u5019\u53c8\u9700\u8981\u627e\u5230\u8fd9\u6761\u811a\u672c\uff0c\u5220\u6389\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\u3002\u5728\u8df3\u8fc7\u7528\u4f8b\u8f83\u591a\u7684\u60c5\u51b5\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u96be\u5ea6\u3002 \u7f16\u5199\u7528\u4f8b\u65f6\u903b\u8f91\u6bd4\u8f83\u590d\u6742\uff0c\u9700\u8981\u8c03\u7528\u591a\u4e2a\u5e94\u7528\u7684\u65b9\u6cd5\u6a21\u5757\u3002 \u6846\u67b6\u6269\u5c55\u6027\u4e0d\u8db3\uff0c\u65e0\u6cd5\u6574\u5408\u6027\u80fd\u81ea\u52a8\u5316\u3001\u538b\u6d4b\u81ea\u52a8\u5316\u3001\u5b89\u5168\u81ea\u52a8\u5316\u7b49\u4e13\u9879\u6d4b\u8bd5\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_3","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u4e3a\u89e3\u51b3\u73b0\u6709\u95ee\u9898\uff0c\u9002\u5e94\u4e0d\u65ad\u4e30\u5bcc\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u66f4\u597d\u7684\u53d1\u6325\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4f5c\u7528\uff0c\u9700\u8981\u5bf9\u81ea\u52a8\u5316\u67b6\u6784\u53ca\u5404\u529f\u80fd\u6a21\u5757\u8fdb\u884c\u91cd\u65b0\u8bbe\u8ba1\u89c4\u5212\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_1","title":"1\u3001\u67b6\u6784\u8bbe\u8ba1","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_1","title":"2\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u6846\u67b6\u7684\u8fd0\u884c\u903b\u8f91\uff1a\u901a\u8fc7\u6838\u5fc3\u5c42\u63d0\u4f9b\u4e00\u4e2a\u57fa\u7840\u80fd\u529b\uff0c\u4e1a\u52a1\u5c42\u6839\u636e\u5b9e\u9645\u4e1a\u52a1\u9700\u6c42\uff08\u6d4b\u8bd5\u7528\u4f8b\uff09\u52a8\u6001\u52a0\u8f7d\u6838\u5fc3\u5c42\uff0c\u6267\u884c\u5165\u53e3\u52a0\u8f7d\u76f8\u5e94\u7684\u7528\u4f8b\u96c6\u5e76\u63a7\u5236\u6267\u884c\uff0c\u5e94\u7528\u5c42\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u9700\u6c42\uff0c\u901a\u8fc7\u76f8\u5e94\u7684\u914d\u7f6e\u9879\u8fdb\u884c\u914d\u7f6e\uff0c\u4ece\u800c\u89e6\u53d1\u81ea\u52a8\u5316\u6d4b\u8bd5\u4efb\u52a1\u3002 \u6838\u5fc3\u5c42\uff1a\u57fa\u672c\u4fdd\u6301\u4e0d\u53d8\uff0c\u90e8\u5206\u6a21\u5757\u4f1a\u6d89\u53ca\u5230\u65b0\u529f\u80fd\u5f00\u53d1\uff0c\u6838\u5fc3\u5c42\u5404\u529f\u80fd\u6a21\u5757\u4fdd\u6301\u72ec\u7acb\u6027\uff0c\u63d0\u4f9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u4f9b\u4e0a\u5c42\u8c03\u7528\uff1b \u5e95\u5c42\u6838\u5fc3\u6a21\u5757\u5305\u62ec\uff1a \u56fe\u50cf\u8bc6\u522b\u6a21\u5757 UI \u5b9a\u4f4d\u6a21\u5757 Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757 \u5c5e\u6027\u5b9a\u4f4d\u6a21\u5757 \u65e5\u5fd7\u6a21\u5757 \u952e\u9f20\u64cd\u4f5c\u6a21\u5757 \u6587\u4ef6\u64cd\u4f5c\u6a21\u5757 \u5f55\u5c4f\u6a21\u5757 \u81ea\u5b9a\u4e49\u65ad\u8a00\u6a21\u5757 \u7528\u4f8b\u6267\u884c\u6a21\u5757 PXE \u88c5\u673a\u6a21\u5757 \u952e\u9f20\u4fe1\u53f7\u6a21\u62df\u6a21\u5757 OCR \u6a21\u5757 \u4e1a\u52a1\u5c42\uff1a\u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e94\u7528\u5185\u5305\u542b\u591a\u4e2a\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5982\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7b49\uff0c\u540e\u7eed\u53ef\u4ee5\u6839\u636e\u9700\u8981\u5ac1\u63a5\u8fdb\u6765\u3002\u5176\u4e2d\u529f\u80fd\u6d4b\u8bd5\u8bbe\u8ba1\u601d\u8def\uff1a \u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e76\u5c06\u6d4b\u8bd5\u6570\u636e\u548c\u6d4b\u8bd5\u8d44\u6e90\u6574\u5408\u8fdb\u6765\uff0c\u589e\u52a0\u7528\u4f8b\u6807\u7b7e csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ed9\u6bcf\u6761\u7528\u4f8b\u6253\u6807\u7b7e\u3002 \u5404\u6807\u7b7e\u6240\u4f7f\u7528\u5bf9\u5e94\u7684\u5b57\u6bb5\u540d\u79f0\uff0c\u4f7f\u7528 csv \u6587\u4ef6\u7ef4\u62a4\u7528\u4f8b\u4e0e\u6807\u7b7e\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u5bf9\u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u53ef\u4ee5\u7ec4\u5408\u5176\u4e2d\u7684\u6807\u7b7e\u800c\u4ece\u9a71\u52a8\u5bf9\u5e94\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\uff0c\u517c\u5bb9\u73b0\u6709\u7528\u4f8b\u6807\u7b7e\uff0c\u4e14\u652f\u6301\u7528\u4f8b\u6807\u7b7e\u53ef\u6269\u5c55\uff1b \u4f7f\u7528 csv \u683c\u5f0f\u6587\u4ef6\u53ef\u4ee5\u65b9\u4fbf\u7684\u4f7f\u7528 Excel \u8868\u683c\u6253\u5f00\u8fdb\u884c\u7f16\u8f91\uff0c\u540c\u65f6\u7531\u4e8e csv \u6587\u4ef6\u5b9e\u9645\u662f\u4ee5\u90fd\u597d\u5206\u9694\u7684\u6587\u672c\u6587\u4ef6\uff0c\u4ee3\u7801\u4e2d\u53ef\u4ee5\u5728\u4e0d\u4f9d\u8d56\u4e09\u65b9\u5e93\u7684\u60c5\u51b5\u4e0b\u65b9\u4fbf\u5feb\u901f\u7684\u89e3\u6790\u5b83\uff0c\u53ef\u64cd\u4f5c\u6027\u548c\u53ef\u7ef4\u62a4\u6027\u8f83\u9ad8\u3002 \u5404\u4e2a\u5e94\u7528\u4e4b\u95f4\uff0c\u7528\u4f8b\u3001\u65b9\u6cd5\u3001\u6807\u7b7e\u548c\u8d44\u6e90\u90fd\u662f\u76f8\u4e92\u72ec\u7acb\u7684\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u7528\u4f8b\u65f6\u53ea\u9700\u8981\u81ea\u5df1\u5e94\u7528\u4e0b\u7684\u65b9\u6cd5\u548c\u516c\u5171\u5e93\u5373\u53ef\u3002 \u7ed3\u6784\u4e3e\u4f8b\uff1a .\n\u251c\u2500\u2500 apps\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_album # \u5e94\u7528\u540d (\u7528\u4e0b\u5212\u7ebf\u8fde\u63a5\u662f Python \u7f16\u7801\u89c4\u8303)\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_assert # \u65ad\u8a00\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_function_tag.csv # \u7528\u4f8b\u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 asan_cases # \u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases # \u529f\u80fd\u6d4b\u8bd5\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 res # \u6d4b\u8bd5\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config # \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_widget # \u5e94\u7528\u81ea\u5df1\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_widget # \u65b9\u6cd5\u57fa\u7c7b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 other_widget # \u8c03\u7528\u5176\u4ed6\u5e94\u7528\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_camera\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases\n\u2502\u00a0\u00a0 \u2502\u00a0 ...\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 public_widget # \u516c\u5171\u65b9\u6cd5\u5e93\n\u251c\u2500\u2500 config # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n...\n config \u914d\u7f6e\u6a21\u5757\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u76f8\u5e94\u914d\u7f6e\uff0c\u6d4b\u8bd5\u540c\u5b66\u53ef\u4ee5\u6839\u636e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5728 config \u91cc\u9762\u8fdb\u884c\u914d\u7f6e\u3002 \u5168\u5c40\u914d\u7f6e\uff1a \u6267\u884c\u4e00\u4e2a\u6216\u591a\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff1a\u5728 pattern \u91cc\u9762\u5199\u5165\u5e94\u7528\u5305\u540d\uff0c\u591a\u4e2a\u5e94\u7528\u4e4b\u95f4\u7528 or \u8fde\u63a5\uff0c\u5982 deepin-music or deepin-movie\uff1b \u5192\u70df\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a smoke\uff1b \u96c6\u6210\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a core \uff1b \u5168\u91cf\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u4e3a\u7a7a\u5373\u53ef\uff1b \u901a\u8fc7 tags \u7684\u914d\u7f6e\u6bd4\u8f83\u7075\u6d3b\uff0c\u540e\u9762\u6807\u7b7e\u5316\u7ba1\u7406\u7ae0\u8282\u4f1a\u8bb2\u5230\uff0c\u652f\u6301\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u7075\u6d3b\u914d\u7f6e\u3002 \u6307\u5b9a\u67d0\u53f0\u673a\u5668\u5728\u6307\u5b9a\u955c\u50cf\u7248\u672c\u4e0a\u6267\u884c\u7528\u4f8b\uff1a\u5728 IP \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a IP\uff0c\u5e76\u5728 URL \u91cc\u9762\u586b\u5165\u955c\u50cf\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u6846\u67b6\u4f1a\u8c03\u7528 PXE \u8fdb\u884c\u81ea\u52a8\u88c5\u673a\uff0c\u88c5\u673a\u5b8c\u4e4b\u540e\u81ea\u52a8\u5f00\u59cb\u6267\u884c\u914d\u7f6e\u7684\u6d4b\u8bd5\u7528\u4f8b\u3002 \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\uff1a \u6bcf\u4e2a\u5e94\u7528\u5185\u90e8\u4f1a\u6709\u4e00\u4e2a\u5355\u72ec\u7684\u914d\u7f6e\u6a21\u5757\uff0c\u4f1a\u5305\u542b\u4e00\u4e9b\u672c\u5e94\u7528\u7684\u6d4b\u8bd5\u8d44\u6e90\u7684\u8def\u5f84\u3001\u6267\u884c\u7528\u4f8b\u7684\u6807\u7b7e\u914d\u7f6e\u7b49\u7b49\uff0c\u5982\u679c\u5728\u5c40\u90e8\u914d\u7f6e\u91cc\u9762\u914d\u7f6e\u4e86\u7528\u4f8b\u6267\u884c\u6807\u7b7e\uff0c\u800c\u5916\u5c42 runner \u51fa\u6ca1\u6709\u6307\u5b9a\u6267\u884c\u6807\u7b7e\uff0c\u5219\u5728\u6267\u884c\u65f6\u53ea\u4f1a\u6267\u884c\u5c40\u90e8\u914d\u7f6e\u5df2\u914d\u7f6e\u7684\uff0c\u82e5\u5916\u5c42 runner \u4e5f\u914d\u7f6e\u4e86\u6267\u884c\u6807\u7b7e\uff0c\u5219\u4f1a\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u7528\u4f8b\u3002 \u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u914d\u7f6e\u90fd\u5728\u540c\u4e00\u4e2a\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\uff0cpy \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684\u7c7b\uff0cini \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684 option\u3002 \u5168\u5c40\u914d\u7f6e\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u7b56\u7565\u5982\u4e0b\uff1a \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5c40\u90e8\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5e94\u7528\u5c42\uff1arunner \u662f\u6d4b\u8bd5\u6267\u884c\u7684\u5165\u53e3\uff0c\u5b83\u4f1a\u6839\u636e\u914d\u7f6e\u91cc\u9762\u7684\u914d\u7f6e\u9879\uff0c\u8fdb\u884c\u7528\u4f8b\u7684\u52a0\u8f7d\u548c\u6267\u884c\u3002\u5b83\u63d0\u4f9b\u63a5\u53e3\u7ed9\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\uff0c\u5e73\u53f0\u4e0a\u7684\u6307\u4ee4\u5b9e\u9645\u4e0a\u90fd\u662f\u901a\u8fc7\u4e0b\u53d1\u7ed9 runner\uff0c\u7136\u540e\u7531 runner \u6765\u6267\u884c\u76f8\u5e94\u7684\u6d4b\u8bd5\u3002 \u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u662f\u4e00\u4e2a\u524d\u7aef\u7cfb\u7edf\uff0c\u53ef\u4ee5\u8fdb\u884c\u6d4b\u8bd5\u673a\u7ba1\u7406\u3001\u81ea\u52a8\u5b89\u88c5\u955c\u50cf\u3001\u81ea\u52a8\u5b89\u88c5\u6307\u5b9a\u5e94\u7528\u7248\u672c\u3001\u8fdb\u884c\u6d4b\u8bd5\u7528\u4f8b\u8303\u56f4\u9009\u62e9\u3001\u7528\u4f8b\u89e6\u53d1\u6267\u884c\u63a7\u5236\u3001\u7ed3\u679c\u5c55\u793a\u8f93\u51fa\u7b49\u3002 \u4e00\u4e2a\u5e94\u7528\u7684\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\u90fd\u53ef\u4ee5\u5355\u72ec\u89e6\u53d1\u3002 \u517c\u5bb9\u6027\u6d4b\u8bd5\u4e3b\u8981\u901a\u8fc7 PXE \u670d\u52a1\u5668\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u88c5\u673a\uff0c\u7136\u540e\u914d\u5408 AT \u8fdb\u884c\u6d4b\u8bd5\uff0c\u53ef\u4ee5\u5b9e\u73b0\u4e0d\u540c\u7cfb\u7edf\u7248\u672c\u3001\u4e0d\u540c\u5e94\u7528\u7248\u672c\u73af\u5883\u4e0a\u90fd\u53ef\u4ee5\u8fdb\u884c\u81ea\u52a8\u5316\u7684 AT \u6267\u884c\uff0c\u63d0\u9ad8\u517c\u5bb9\u6027\u6d4b\u8bd5\u6548\u7387\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_4","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_2","title":"1\u3001\u7528\u4f8b\u89e3\u8026","text":"\u5b58\u5728\u8026\u5408\u5173\u7cfb\u7684\u65b9\u6cd5\uff1a\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u88ab\u5916\u90e8\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\uff0c\u5219\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u8026\u5408\u5173\u7cfb\u3002 1.1\u3001\u901a\u8fc7\u7f16\u8f91\u5668 Find Usages \u67e5\u770b\u6bcf\u4e2a\u65b9\u6cd5\u88ab\u8c03\u7528\u7684\u8def\u5f84\u548c\u88ab\u8c03\u7528\u6b21\u6570\uff1b 1.2\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 1 \u4e2a\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728\u5916\u90e8\u5e94\u7528\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1b 1.3\u3001\u64cd\u4f5c\u5c42\u6587\u4ef6\u540d\u5747\u4ee5 widget \u7ed3\u5c3e\uff0c\u7c7b\u540d\u4ee5 Widget \u7ed3\u5c3e\uff0c\u5982\uff1a\u6587\u4ef6\u540d music_widget.py \uff1a class MusicWidget:\n\"\"\"\u97f3\u4e50\u7684\u64cd\u4f5c\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_2","title":"2\u3001\u516c\u5171\u5e93\u5efa\u8bbe","text":"2.1\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 2 \u4e2a\u53ca\u4ee5\u4e0a\u7684\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728 public_widget \u76ee\u5f55\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1bpublic_widget \u5373\u4e3a\u516c\u5171\u65b9\u6cd5\u5e93\uff1b 2.2\u3001\u5728\u7528\u4f8b\u5c42\u4fee\u6539\u7528\u4f8b\u4e2d\u7c7b\u7684\u5bfc\u5165\u8def\u5f84\uff0c\u5c5e\u4e8e\u516c\u5171\u65b9\u6cd5\u7684\u5219\u8c03\u7528 public_widget \u4e2d\u7684\u7c7b\uff0c\u5916\u90e8\u5e94\u7528\u7684\u64cd\u4f5c\u65b9\u6cd5\uff0c\u5219\u8c03\u7528\u672c\u5e94\u7528\u76ee\u5f55\u4e0b\u91cd\u5199\u7684\u5916\u90e8\u5e94\u7528\u65b9\u6cd5\u3002 \u6bd4\u5982\uff1a\u51e0\u4e4e\u6240\u6709\u591a\u5a92\u4f53\u5e94\u7528\u90fd\u9700\u8981\u901a\u8fc7\u6587\u7ba1\u52a0\u8f7d\u8d44\u6e90\uff0c\u8c03\u8d77\u7684\u6587\u7ba1\u5bf9\u8bdd\u6846\u5b9e\u9645\u4e3a dde-desktop\uff0c\u56e0\u6b64\u5c06 desktop_widget.py \u653e\u5230 public_widget \u91cc\u9762\uff1a class DdeDesktopPublicWidget:\n\"\"\"\u516c\u5171-\u684c\u9762\u7684\u64cd\u4f5c\u65b9\u6cd5\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3_1","title":"3\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406","text":"3.1\u3001\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1a\u5bf9\u5e94 core\u3001smoke\uff0c\u6216\u4e3a\u7a7a\uff1b \u7528\u4f8b\u6765\u6e90\uff1a\u5bf9\u5e94 PMS \u7528\u4f8b\u6765\u6e90\uff0c\u5206\u522b\u7528 acp1\u3001acp2\u3001acp3\u3001acp4 \u8868\u793a\u3002 acp1 \uff1a\u4e1a\u52a1\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5199\u7684\u7528\u4f8b\uff0c\u88ab\u7528\u4e8e\u9a8c\u6536\u6d4b\u8bd5\u7684\uff1b acp2 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5f15\u5165\u7684\u4ea7\u54c1\u9a8c\u6536\u6d4b\u8bc4\u90e8\u7684\u7528\u4f8b\uff1b acp3 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u6839\u636e\u4ea7\u54c1\u9700\u6c42\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\uff1b acp4 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u901a\u8fc7\u793e\u533a\u3001\u8bba\u575b\u7528\u6237\u53cd\u9988\u95ee\u9898\u603b\u7ed3\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\u3002 \u4e3e\u4f8b\uff1a \u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u7528\u4f8b\u6765\u6e90 001 L1 core acp1 \u6807\u7b7e\u91c7\u7528\u679a\u4e3e\u7684\u65b9\u5f0f\u8fdb\u884c\u4ee3\u53f7\u7ba1\u7406\u65b9\u4fbf\u7ba1\u7406\u4ee5\u53ca\u540e\u7eed\u6269\u5c55\u3002 3.2\u3001\u5728\u6bcf\u4e2a\u5e94\u7528\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u7b2c\u4e00\u5217\u4e3a\u7528\u4f8b\u7684 ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ba1\u7406\u6a21\u5757\u5185\u7684\u7528\u4f8b\u6807\u7b7e\u3002\u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 3.3\u3001\u5bf9\u7167 PMS \u4e0a\u7528\u4f8b\u7b49\u7ea7\u3001\u7528\u4f8b\u7c7b\u578b\u548c\u7528\u4f8b\u6765\u6e90\uff0c\u6807\u8bb0\u6240\u6709\u5df2\u5b9e\u73b0\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u540e\u7eed\u7f16\u5199\u65b0\u589e\u81ea\u52a8\u5316\u7528\u4f8b\u65f6\uff0c\u6bcf\u5199\u4e00\u6761\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684 csv \u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u6b64\u6761\u7528\u4f8b\u7684\u6807\u7b7e\u3002 3.4\u3001\u8df3\u8fc7\u7528\u4f8b\u6807\u7b7e\u5316 \u73b0\u6709\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a\uff1a \u4e3e\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u8bb0\u4e3a \u201cskip-\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u8bb0\uff0c\u5982\u679c\u5df2\u7ecf\u6807\u8bb0\u4e86\u8df3\u8fc7\u539f\u56e0\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u8bb0\u4e3a SKIPED\uff0c\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\u3002 \u6240\u6709\u7684\u6807\u7b7e\u5728 docs \u76ee\u5f55\u4e0b\u4f1a\u6709\u4e00\u4e2a\u6587\u6863\uff0c\u6587\u6863\u6682\u5b9a\u540d\u79f0\u4e3a\uff1atags_info.md\uff0c\u7528\u4e8e\u8bf4\u660e\u73b0\u5728\u5df2\u7ecf\u4f7f\u7528\u5230\u7684\u6807\u7b7e\uff0c\u4ee5\u53ca\u8fd9\u4e9b\u6807\u7b7e\u7684\u89e3\u91ca\u548c\u7528\u6cd5\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#4","title":"4\u3001\u7528\u4f8b\u6267\u884c","text":"4.1\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u7684\u9a71\u52a8\u6267\u884c\u903b\u8f91\u529f\u80fd\u5b9e\u73b0 \u5f00\u53d1\u6839\u636e\u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\u91cc\u9762\u7684\u7528\u4f8b\u6807\u7b7e\u6267\u884c\u5bf9\u5e94\u7528\u4f8b\u7684\u529f\u80fd\uff0c\u80fd\u652f\u6301\u591a\u4e2a\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u6267\u884c\u5165\u53e3\u80fd\u968f\u610f\u901a\u8fc7\u7528\u4f8b\u6807\u7b7e\u6307\u5b9a\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002 \u7528\u4f8b\u6807\u7b7e\u7684\u9a71\u52a8\u65b9\u5f0f\u5fc5\u987b\u80fd\u652f\u6301\u6807\u7b7e\u7684\u6269\u5c55\uff0c\u672a\u6765\u968f\u7740\u4e1a\u52a1\u7684\u53d8\u5316\u53ef\u80fd\u9700\u8981\u589e\u52a0\u5404\u79cd\u5404\u6837\u7684\u6807\u7b7e\u3002 4.2\u3001\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u6267\u884c \u529f\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u3001\u6027\u80fd\u6d4b\u8bd5\u7b49\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u662f\u5206\u5f00\u6267\u884c\u7684\uff0c\u4e5f\u5c31\u662f\u5728\u4e00\u6b21\u6267\u884c\u4e2d\uff0c\u53ea\u80fd\u6267\u884c\u5176\u4e2d\u4e00\u79cd\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5177\u4f53\u8981\u6267\u884c\u54ea\u4e00\u79cd\u540c\u6837\u901a\u8fc7\u53c2\u6570\u6765\u63a7\u5236\u3002 4.3\u3001\u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c \u7531\u4e8e\u6d4b\u8bd5\u673a\u8d44\u6e90\u6709\u9650\uff0c\u968f\u7740\u81ea\u52a8\u5316\u7528\u4f8b\u6570\u91cf\u7684\u589e\u52a0\uff0cCI \u6267\u884c\u65f6\u95f4\u4f1a\u8d8a\u6765\u8d8a\u957f\u3002 \u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c\u7684\u529f\u80fd\uff1a \u540c\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\u5206\u6563\u5230\u4e0d\u540c\u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u4e0a\u6267\u884c\uff0c\u7f29\u77ed\u6267\u884c\u603b\u65f6\u95f4\uff1b \u7b2c\u4e8c\u5929\u8dd1\u7684\u65f6\u5019\u540c\u4e00\u4e2a\u673a\u5668\u4e0a\u4f1a\u6267\u884c\u6628\u5929\u6ca1\u6709\u6267\u884c\u5230\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u6267\u884c\u540c\u7406\uff1b \u53ef\u4ee5\u5b9e\u73b0\u5728\u5168\u67b6\u6784\u6d4b\u8bd5\u673a\u4e0a\u8f6e\u6d41\u6267\u884c\u7528\u4f8b\uff0c\u65e2\u80fd\u4fdd\u8bc1\u6267\u884c\u4e86\u6240\u6709\u7684\u7528\u4f8b\uff0c\u53c8\u80fd\u5728\u8d44\u6e90\u6709\u9650\u7684\u60c5\u51b5\u4e0b\u8986\u76d6\u4e86\u6240\u6709\u7684\u67b6\u6784\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#5","title":"5\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0","text":"5.1\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u4f5c\u4e3a\u524d\u7aef\u754c\u9762\u7cfb\u7edf\uff0c\u901a\u8fc7\u9875\u9762\u4e0a\u7684\u4e00\u4e9b\u529f\u80fd\u9009\u9879\u8fdb\u884c\u5bf9\u5e94\u6d4b\u8bd5\u4efb\u52a1\u7684\u7ba1\u7406\u6216\u89e6\u53d1\uff0c\u4e1a\u5185\u6bd4\u8f83\u6d41\u884c\u7684\u5b9e\u73b0\u65b9\u6848\u662f\u4f7f\u7528 Vue + DRF \u5b9e\u73b0\u4e00\u4e2a\u524d\u540e\u7aef\u5206\u79bb\u7684\u7cfb\u7edf\u3002 \u6d4b\u8bd5\u5e73\u53f0\u53ef\u80fd\u4f1a\u6d89\u53ca\u5230\u7684\u6a21\u5757\u6709\uff1a\u6d4b\u8bd5\u673a\u8d44\u6e90\u7ba1\u7406\u6a21\u5757\u3001\u7528\u4f8b\u6267\u884c\u63a7\u5236\u6a21\u5757\u3001\u7ed3\u679c\u5c55\u793a\u6a21\u5757\u3001PXE \u955c\u50cf\u5b89\u88c5\u6a21\u5757\u7b49\u3002 \u7528\u6237\uff08\u6d4b\u8bd5\u3001\u7814\u53d1\u540c\u5b66\u7b49\uff09\u53ef\u4ee5\u914d\u7f6e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5982\u6267\u884c\u54ea\u4e2a\u5e94\u7528\u3001\u6267\u884c\u7528\u4f8b\u7684\u8303\u56f4\u3001\u5728\u54ea\u53f0\u673a\u5668\u4e0a\u6267\u884c\u3001\u955c\u50cf\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u5e94\u7528\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u6267\u884c\u65f6\u95f4\u3002 5.2\u3001\u6267\u884c\u5165\u53e3 runner \u63d0\u4f9b\u7ed9\u6d4b\u8bd5\u5e73\u53f0\u7684\u63a5\u53e3\u5305\u62ec\uff1a\u7528\u4f8b\u6267\u884c\u63a5\u53e3\u3001\u7ed3\u679c\u8fd4\u56de\u63a5\u53e3\u3001\u955c\u50cf\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u955c\u50cf\u5b89\u88c5\u63a5\u53e3\u3001\u5e94\u7528\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u5e94\u7528\u5b89\u88c5\u66f4\u65b0\u63a5\u53e3\u7b49\u3002 \u524d\u7aef\u5e73\u53f0\u76ee\u524d\u8fd8\u6ca1\u6709\u592a\u591a\u8be6\u7ec6\u7684\u65b9\u6848\uff0c\u672c\u6b21\u8bbe\u8ba1\u4e3b\u8981\u96c6\u4e2d\u5728\u540e\u7aef\u8fd9\u90e8\u5206\u67b6\u6784\u7684\u8bbe\u8ba1\u4e0a\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_5","title":"\u56db\u3001\u5b9e\u65bd\u8ba1\u5212","text":"\u8fd1\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u6587\u7ba1\u4ee3\u7801\u89e3\u8026 2022/3/28 2022/4/8 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u56fe\u5f62\u56fe\u50cf\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u97f3\u89c6\u9891\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5168\u5c40\u641c\u7d22\u4ee3\u7801\u89e3\u8026 2022/4/25 2022/4/26 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u516c\u5171\u5e93\u5efa\u8bbe 2022/4/27 2022/5/5 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5c01\u88c5\u7684\u65b9\u6cd5\u6574\u7406\u6210\u4e00\u4e2a\u8868 2022/5/6 2022/5/10 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7528\u4f8b\u6807\u7b7e\u5206\u7c7b\u8bc4\u4f30 2022/5/11 2022/5/11 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u6807\u7b7e\u5316\u6267\u884c\u9a71\u52a8\u7a0b\u5e8f\u7f16\u5199 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u9700\u5b9e\u73b0\u81ea\u52a8\u89e3\u6790 csv \u8868\u683c\u4e2d\u7684\u7528\u4f8b\u7f16\u53f7 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u722c\u866b\u811a\u672c\uff0c\u722c\u53d6 pms \u4e0a\u7528\u4f8b\u7684\u6807\u7b7e 2022/5/11 2022/5/13 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u5b9a\u65f6\u81ea\u52a8\u7ef4\u62a4\u672c\u5730 csv \u6587\u4ef6\u811a\u672c 2022/5/11 2022/5/20 \u4e2d\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u76ee\u5f55\u7ed3\u6784\u8c03\u6574 2022/5/20 2022/6/2 \u5b8c\u6210\u5168\u5c40\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u5177\u4f53\u65b9\u6848\u548c\u903b\u8f91\u5b9e\u73b0 2022/6/6 2022/6/17 \u9759\u6001\u626b\u63cf\u95ee\u9898\u6e05\u96f6 2022/6/20 2022/7/1 \u5b8c\u6210\u65b0\u6846\u67b6\u4f7f\u7528\u57f9\u8bad 2022/7/4 2022/7/11 \u843d\u5730\u8fd0\u884c 2022/7/12 2022/7/20 \u5e95\u5c42\u5e93\u7528\u9014\u8bf4\u660e\u6587\u6863\u7f16\u5199 2022/7/21 2022/7/28"}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\u200b\\u3000\\-\u3001\u3002\uff0c\uff0e\uff1f\uff01\uff1b]+","pipeline":["stemmer"]},"docs":[{"location":"","title":"\u9996\u9875","text":""},{"location":"#youqu","title":"\u6709\u8da3\uff08YouQu\uff09","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/4/1\n# Author : Mikigo\n# =============================================\n \u672c\u7ad9\u603b\u8bbf\u95ee\u91cf \u6b21 \u6b22\u8fce\u5728\u6d4f\u89c8\u5668\u8bbf\u95ee\u3010\u516c\u7f51\u6587\u6863\u3011 \u7edf\u4fe1\u516c\u53f8\u5185\u7f51\u8fd8\u53ef\u4ee5\u8bbf\u95ee\u3010\u5185\u7f51\u6587\u6863\u3011\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u54e6~~"},{"location":"#_1","title":"\u4e00\u3001\u7b80\u4ecb","text":"\u6709\u8da3\uff08YouQu\uff09\u662f\u6df1\u5ea6\u79d1\u6280\u8bbe\u8ba1\u548c\u5f00\u53d1\u7684\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff0c\u91c7\u7528\u7ed3\u6784\u5206\u5c42\u7684\u8bbe\u8ba1\u7406\u5ff5\uff0c\u652f\u6301\u591a\u5143\u5316\u5143\u7d20\u5b9a\u4f4d\u548c\u65ad\u8a00\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\u3001\u5f3a\u5927\u7684\u65e5\u5fd7\u548c\u62a5\u544a\u8f93\u51fa\u7b49\u7279\u8272\u529f\u80fd\uff0c\u540c\u65f6\u5b8c\u7f8e\u517c\u5bb9X11\u3001Wayland\u663e\u793a\u534f\u8bae\uff0c\u73af\u5883\u90e8\u7f72\u7b80\u5355\uff0c\u64cd\u4f5c\u6613\u4e0a\u624b\u3002"},{"location":"#17","title":"\u7231\u4e0a \u201c\u6709\u8da3\u201d \u7684 17 \u4e2a\u7406\u7531","text":" \u6838\u5fc3\u5e93\u63d0\u4f9b\u4e86\u7edf\u4e00\u7684\u63a5\u53e3\uff0c\u7f16\u5199\u65b9\u6cd5\u65f6\u53ea\u9700\u8981\u5bfc\u5165\u4e00\u4e2a\u5305\u5c31\u53ef\u4ee5\u4f7f\u7528\u5230\u6838\u5fc3\u5e93\u63d0\u4f9b\u7684\u6240\u6709\u529f\u80fd\uff1b \u516c\u5171\u5e93\u5c01\u88c5\u4e86\u5f88\u591a\u5e38\u7528\u6a21\u5757\u7684\u76f8\u5173\u65b9\u6cd5\uff0c\u6bd4\u5982\uff1a\u4efb\u52a1\u680f\u7684\u64cd\u4f5c\u3001\u684c\u9762\u7684\u64cd\u4f5c\u3001\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\u7b49\u7b49\uff1b \u9664\u4e86\u5e38\u7528\u7684\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u8bc6\u522b\u4ee5\u5916\uff0c\u6211\u4eec\u8fd8\u63d0\u4f9b\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u5176\u4f7f\u7528\u7b80\u5355\u4e14\u9ad8\u6548\uff0c\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff1b \u5bf9\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u5c06\u7f16\u5199\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u53d8\u5f97\u7b80\u5355\u800c\u4f18\u96c5\uff1b \u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u6280\u672f\u8fdb\u884c\u529f\u80fd\u5347\u7ea7\uff0c\u9664\u4e86\u652f\u6301\u5355\u4e2a\u5750\u6807\u8fd4\u56de\uff0c\u8fd8\u652f\u6301\u540c\u4e00\u754c\u9762\u4e0b\u591a\u4e2a\u76f8\u540c\u5143\u7d20\u8fd4\u56de\u591a\u4e2a\u5750\u6807\u7684\u529f\u80fd\uff1b \u63d0\u4f9b\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u548c\u6279\u91cf\u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u4e0d\u5230\u4e00\u4e2a csv \u6587\u4ef6\u539f\u6765\u80fd\u5e72\u8fd9\u4e48\u591a\u4e8b\u60c5\uff1b \u63d0\u4f9b\u4e86\u529f\u80fd\u5f3a\u5927\u7684\u6267\u884c\u5668\u5165\u53e3\uff0c\u8ba9\u4f60\u53ef\u4ee5\u65b9\u4fbf\u7684\u5728\u672c\u5730\u6267\u884c\u4efb\u4f55\u7528\u4f8b\u96c6\u7684\u7528\u4f8b\uff0c\u5176\u4e30\u5bcc\u7684\u81ea\u5b9a\u4e49\u914d\u7f6e\u9879\uff0c\u6ee1\u8db3\u4f60\u5bf9\u6267\u884c\u5668\u6240\u6709\u7684\u5e7b\u60f3\uff1b \u63d0\u4f9b\u8fdc\u7a0b\u6267\u884c\u7684\u529f\u80fd\uff0c\u53ef\u4ee5\u63a7\u5236\u591a\u53f0\u673a\u5668\u5e76\u884c\u8dd1\uff0c\u6216\u8005\u5206\u5e03\u5f0f\u8dd1\uff0c\u8fd9\u79cd\u4ed8\u8d39\u529f\u80fd\u73b0\u5728\u514d\u8d39\u7ed9\u4f60\u7528\uff1b \u63d0\u4f9b\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u529f\u80fd\uff0c\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u6bcf\u4e2a\u65b9\u6cd5\u5355\u72ec\u5199\u8f93\u51fa\u65e5\u5fd7\u7684\u4ee3\u7801\uff0c\u4e00\u5207\u6211\u4eec\u7ed9\u4f60\u641e\u5b9a\u4e86\uff0c\u65e5\u5fd7\u8f93\u51fa\u4e0d\u4ec5\u5185\u5bb9\u4e30\u5bcc\uff0c\u989c\u503c\u4e5f\u7edd\u5bf9\u5728\u7ebf\uff0c\u6211\u4eec\u8fd8\u81ea\u5df1\u8bbe\u8ba1\u4e86\u4e00\u6b3e\u7ec8\u7aef\u8f93\u51fa\u4e3b\u9898\u53eb\u300a\u4e94\u5f69\u6591\u6593\u7684\u9ed1\u300b\uff1b \u63d0\u4f9b\u4e86\u4e00\u952e\u90e8\u7f72\u81ea\u52a8\u5316\u6d4b\u8bd5\u73af\u5883\u7684\u529f\u80fd\uff0c\u8fde\u4ee3\u7801\u7f16\u8f91\u5668\u90fd\u7ed9\u4f60\u88c5\u597d\u4e86\uff0c\u8ba9\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u73af\u5883\u90e8\u7f72\u800c\u70e6\u607c\uff1b \u63d0\u4f9b\u4e86\u81ea\u52a8\u751f\u6210\u591a\u79cd\u62a5\u544a\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u8f93\u51fa\u4ec0\u4e48\u62a5\u544a\u5f62\u5f0f\u90fd\u884c\uff0c\u800c\u4e14\u6211\u4eec\u5728\u62a5\u544a\u4e2d\u8fd8\u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\u548c\u5931\u8d25\u622a\u56fe\u7684\u529f\u80fd\uff1b \u5bf9\u65ad\u8a00\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u63d0\u4f9b\u66f4\u53cb\u597d\u5316\u7684\u9519\u8bef\u63d0\u793a\uff0c\u8ba9\u5b9a\u4f4d\u95ee\u9898\u7cbe\u51c6\u9ad8\u6548\uff1b \u4e0d\u4ec5\u652f\u6301\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u63a7\u5236\uff0c\u800c\u4e14\u8fd8\u652f\u6301\u52a8\u6001\u63a7\u5236\u7528\u4f8b\u6279\u91cf\u6267\u884c\u7684\u603b\u65f6\u95f4\uff0c\u786e\u4fdd CI \u73af\u5883\u4e0b\u80fd\u987a\u7545\u8fd0\u884c\uff1b \u652f\u6301\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\u6267\u884c\u3001PMS \u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6807\u7b7e\u5316\u6267\u884c\u65b9\u6848\uff0c\u6ee1\u8db3\u4f60\u5404\u79cd\u573a\u666f\u4e0b\u7684\u6267\u884c\u9700\u6c42\uff1b \u652f\u6301\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u529f\u80fd\uff0c\u53ef\u5b9a\u4f4d\u53ef\u65ad\u8a00\uff0c\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\uff1b \u5b8c\u7f8e\u517c\u5bb9 Wayland \u548c X11\uff0c\u771f\u6b63\u505a\u5230\u4e00\u5957\u4ee3\u7801\uff0c\u968f\u5904\u6267\u884c\uff1b \u652f\u6301\u591a\u79cd\u65b9\u5f0f\u7684\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u5176\u4e2d\u5f02\u6b65\u56de\u586b\u7684\u65b9\u6848\uff0c\u5b8c\u7f8e\u89e3\u51b3\u4e86\u6570\u636e\u56de\u586b\u7684\u8017\u65f6\u95ee\u9898\uff1b \u3010\u89c6\u9891\u4ecb\u7ecd\u3011"},{"location":"#_2","title":"\u4e8c\u3001\u5b89\u88c5\u4f7f\u7528","text":"\u57fa\u7840\u6846\u67b6\uff1ahttps://github.com/linuxdeepin/deepin-autotest-framework \u4ece PyPI \u5b89\u88c5: sudo pip3 install youqu\n \u521b\u5efa\u9879\u76ee: youqu-startproject youqu\n \u5b89\u88c5\u4f9d\u8d56: cd youqu\nbash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002 \u5e94\u7528\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684\u5e94\u7528\u540d\u79f0\u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music cd apps/\n \u5c06\u5e94\u7528\u5e93\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u50cf\u8fd9\u6837\uff1a youqu\n\u251c\u2500\u2500 apps\n\u2502 \u251c\u2500\u2500 autotest_deepin_music # \u5e94\u7528\u5e93\n...\n \u5e94\u7528\u5e93\u7684\u540d\u79f0\u4e0d\u53ef\u4ee5\u4fee\u6539\u3002"},{"location":"#_3","title":"\u4e09\u3001\u8fd0\u884c","text":""},{"location":"#1","title":"1. \u5de5\u4f5c\u7a7a\u95f4","text":"\u57fa\u7840\u6846\u67b6\u5de5\u7a0b\u76ee\u5f55\u5efa\u8bae\u653e\u5728 ~ \u76ee\u5f55\u4e0b\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u4e5f\u53ef\u4ee5\u8fd0\u884c\uff0c\u4f46\u662f\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u9700\u8981\u505a\u73af\u5883\u6e05\u7406\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u5b58\u5728\u4ee3\u7801\u88ab\u5220\u9664\u7684\u98ce\u9669\u3002 \u5982\u679c\u4f60\u7684\u673a\u5668\u4e0a\u4e0d\u540c\u76ee\u5f55\u4e0b\u5b58\u5728\u591a\u4e2a YouQu \u5de5\u7a0b\uff0c\u90a3\u4e48\u5728\u8fd0\u884c\u4e4b\u524d\uff0c\u8bf7\u5148\u6267\u884c env.sh \u6821\u6b63\u76f8\u5173\u73af\u5883\u3002"},{"location":"#2","title":"2. \u6267\u884c\u5668","text":"\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u6709\u4e00\u4e2a manage.py \uff0c\u5b83\u662f\u4e00\u4e2a\u6267\u884c\u5668\u5165\u53e3\uff0c\u63d0\u4f9b\u4e86\u672c\u5730\u6267\u884c\u3001\u8fdc\u7a0b\u6267\u884c\u7b49\u7684\u529f\u80fd\u3002 \u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6765\u6267\u884c\uff1a youqu manage.py run -a deepin-music\n"},{"location":"#21","title":"2.1. \u672c\u5730\u6267\u884c","text":"youqu manage.py run\n"},{"location":"#211","title":"2.1.1. \u914d\u7f6e\u6587\u4ef6","text":"\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u914d\u7f6e\u53c2\u6570 \u5728\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u91cc\u9762\u652f\u6301\u914d\u7f6e\u5bf9\u6267\u884c\u7684\u4e00\u4e9b\u53c2\u6570\u8fdb\u884c\u914d\u7f6e\uff0c\u5e38\u7528\u7684\u5982\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;-----------------------------------------------\n;1.KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2.KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f\n;e.g. TAGS = L1 or smoke\n;-----------------------------------------------\n;\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\uff0c\u5c06\u8981\u6267\u884c\u7684\u7528\u4f8b\u5199\u5165\u6307\u5b9a\u7684 csv \u6587\u4ef6\n;\u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u4ece\u57fa\u7840\u6846\u67b6\u6839\u76ee\u5f55\u5f00\u59cb\uff1ae.g. CASE_FILE = case_list.txt\n;\u5982\u679c\u8fd9\u91cc\u6709\u503c\uff0cAPP_NAME KEYWORDS TAGS \u7684\u914d\u7f6e\u5747\u4e0d\u751f\u6548\nCASE_FILE =\n;=============================== RUNNER CONFIG ===================================\n[runner]\n;\u6700\u5927\u5931\u8d25\u7528\u4f8b\u6570\u91cf\u7684\u5360\u6bd4\n;\u6bd4\u5982\uff1a\u603b\u6267\u884c\u7528\u4f8b\u6570\u4e3a 100, \u82e5 MAX_FAIL = 0.5,\u5219\u5931\u8d25\u7528\u4f8b\u6570\u8fbe\u5230 50 \u5c31\u4f1a\u7ec8\u6b62\u6d4b\u8bd5\u3002\nMAX_FAIL = 1\n;\u5355\u6761\u7528\u4f8b\u7684\u8d85\u65f6\u65f6\u95f4\uff0c\u5982\u679c\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u8d85\u65f6\uff0c\u8fd9\u6761\u7528\u4f8b\u4f1a\u88ab\u505c\u6b62\uff0c\u540e\u7eed\u7528\u4f8b\u7ee7\u7eed\u6267\u884c\u3002\n;\u5355\u4f4d\u4e3a\u79d2\n;\u8fd9\u662f\u4e00\u4e2a\u5168\u5c40\u7edf\u4e00\u914d\u7f6e\uff0c\u5982\u679c\u67d0\u6761\u7528\u4f8b\u9700\u8981\u5355\u72ec\u914d\u7f6e\u8d85\u65f6\u65f6\u95f4\uff0c\u53ef\u4ee5\u5728\u7528\u4f8b\u4e2d\u8fd9\u6837\u5199\uff1a\n;@pytest.mark.timeout(500)\n;def test_xxx_001():\n; ...\n;\u4f1a\u8bdd\u8d85\u65f6\uff08\u6240\u6709\u7528\u4f8b\u6267\u884c\u7684\u8d85\u65f6\u65f6\u95f4\uff09\u662f\u6839\u636e\u5168\u5c40\u8d85\u65f6\u914d\u7f6e\u548c\u7528\u4f8b\u5355\u72ec\u8d85\u65f6\u914d\u7f6e\u81ea\u52a8\u8ba1\u7b97\u7684\u3002\nCASE_TIME_OUT = 200\n;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\n;\u6ce8\u610f\uff0cRERUN = 1 \u8868\u793a\u91cd\u8dd1 1 \u6b21\uff0c\u5373\u7b2c\u4e00\u6b21\u7528\u4f8b\u6267\u884c\u5931\u8d25\u4f1a\u81ea\u52a8\u91cd\u8dd1 1 \u6b21\uff0c\u603b\u5171\u6267\u884c 2 \u6b21\uff1b\n;\u5982\u679c\u7b2c 2 \u6b21\u6267\u884c\u6210\u529f\uff0c\u7ed3\u679c\u6210\u529f\uff0c\u5931\u8d25\u4ea6\u4e3a\u5931\u8d25\u3002\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c 1 \u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff0cRERUN >= RECORD_FAILED_CASE\u3002\n;1.\u5173\u95ed\u5f55\u5c4f\uff1aRECORD_FAILED_CASE > RERUN\n;2.\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1aRECORD_FAILED_CASE = 0\nRECORD_FAILED_CASE = 1\n;yes \u6bcf\u6761\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u8fdb\u884c\u73af\u5883\u6e05\u7406\nCLEAN_ALL = yes\n;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387, \u6bd4\u5982\uff1a1920x1080\n;no: \u8868\u793a\u4e0d\u505a\u5206\u8fa8\u7387\u6821\u9a8c\nRESOLUTION = 1920x1080\n;\u4e0d\u8df3\u8fc7\u7528\u4f8b\uff0ccsv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86 skip-xxx\u7684\u7528\u4f8b\u4e0d\u8df3\u8fc7\nNOSKIP = no\n;ignore fixed\n;no\uff0c\u53ea\u8981\u6807\u8bb0\u4e86fixed\u7684\u7528\u4f8b\uff0c\u5373\u4f7f\u6807\u8bb0\u4e86skip-\uff0c\u4e5f\u4f1a\u6267\u884c\uff1b\n;yes\uff0cfixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\uff1b\nIFIXED = no\n;\u8981\u5b89\u88c5deb\u5305\u7684\u8def\u5f84\n;e.g : ~/Downloads/ \u5b89\u88c5\u4e0b\u8f7d\u76ee\u5f55\u4e0b\u7684deb\u5305\uff0c\u5982\u679c\u662f\u8fdc\u7a0b\u6267\u884c\uff0c\u4f1a\u81ea\u52a8\u62f7\u8d1d\u5230\u8fdc\u7a0b\u5e76\u5b89\u88c5\u3002\nDEB_PATH =\n;DEBUG \u6a21\u5f0f\u6267\u884c\u7528\u4f8b\uff0c\u53ea\u6536\u96c6\u4e0d\u6267\u884c\u7528\u4f8b\uff0c\u4e5f\u4e0d\u505a\u8bbe\u5907\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002\nDEBUG = no\n;\u8bb0\u5f55top\u547d\u4ee4\u67e5\u8be2\u7684\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0cTOP = 3 \u8868\u793a\u8bb0\u5f55\u524d3\u4e2a\u8fdb\u7a0b\u3002\nTOP =\n;\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\nREPEAT =\n;\u9ed8\u8ba4\u5728\u6240\u6709\u6d4b\u8bd5\u5b8c\u6210\u4e4b\u540e\u8f93\u51fa\u62a5\u9519\u4fe1\u606f.\n;yes, \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\nDURING_FAIL = no\n;\u6ce8\u518c\u81ea\u542f\u670d\u52a1\nAUTOSTART = no\n;=============================== REPORT CONFIG ===================================\n[report]\n;\u6d4b\u8bd5\u62a5\u544a\u7684title\nREPORT_TITLE = YouQu Report\n;\u6d4b\u8bd5\u62a5\u544a\u7684name\nREPORT_NAME = YouQu Report\n;\u6d4b\u8bd5\u62a5\u544a\u7684\u9ed8\u8ba4\u8bed\u8a00\n;en:English\n;ru:\u0420\u0443\u0441\u0441\u043a\u0438\u0439\n;zh:\u4e2d\u6587\n;de:Deutsch\n;nl:Nederlands\n;he:Hebrew\n;br:Brazil\n;pl:Polski\n;ja:\u65e5\u672c\u8a9e\n;es:Espa\u00f1ol\n;kr:\ud55c\uad6d\uc5b4\n;fr:Fran\u00e7ais\n;az:Az\u0259rbaycanca\nREPORT_LANGUAGE = zh\n;\u7528\u4f8b\u6267\u884c\u5b8c\u540e\u751f\u6210\u7684\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n;\u76ee\u524d\u652f\u6301 allure, xml, json \uff08\u652f\u6301\u540c\u65f6\u751f\u6210\uff09\nREPORT_FORMAT = allure, xml, json\n;\u6307\u5b9a\u62a5\u544a\u751f\u6210\u7684\u8def\u5f84\uff08\u76f8\u5bf9\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\uff09\nALLURE_REPORT_PATH = report/\nXML_REPORT_PATH = report/\nJSON_REPORT_PATH = report/\n;=============================== GLOBAL CONFIG ===================================\n[globalconfig]\n;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\nPASSWORD = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\nIMAGE_MATCH_NUMBER = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6bcf\u6b21\u95f4\u9694\u7b49\u5f85\u65f6\u95f4\nIMAGE_MATCH_WAIT_TIME = 1\n;\u56fe\u50cf\u8bc6\u522b\u5339\u914d\u5ea6\nIMAGE_RATE = 0.9\n;\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u5b9e\u65f6\u56fe\u50cf\u4fdd\u5b58\u8def\u5f84\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u5750\u6807\nSCREEN_CACHE = /tmp/screen.png\n;\u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\u7684\u8def\u5f84\nTMPDIR = /tmp/tmpdir\n;\u7cfb\u7edf\u4e3b\u9898\nSYS_THEME = deepin\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = youqu-dev.uniontech.com\n;OpenCV\u670d\u52a1\u7aef\u5730\u5740\nOPENCV_SERVER_HOST = youqu-dev.uniontech.com\n;=============================== PMS CONFIG ===================================\n;PMS\u76f8\u5173\u914d\u7f6e\uff0c\u5305\u542b\u4ee5\u4e0b\u51e0\u4e2a\u65b9\u9762\uff1a\n;1.PMS\u6d4b\u8bd5\u5957\u6267\u884c\n;2.\u81ea\u52a8\u4ecePMS\u722c\u53d6\u6570\u636e\u5e76\u540c\u6b65\u672c\u5730CSV\u6587\u4ef6\n;3.PMS\u6570\u636e\u56de\u586b\n[pms]\n;PMS\u7684\u7528\u6237\u540d,\u5982: ut001234\nPMS_USER =\n;PMS\u7684\u5bc6\u7801\nPMS_PASSWORD =\n;PMS\u6d4b\u8bd5\u5957\u7684ID\n;\u5728PMS\u4e0a\u67e5\u770b\u7528\u4f8b\u201c\u5957\u4ef6\u201d\u94fe\u63a5: https://pms.uniontech.com/testsuite-view-495.html\n;\u6d4b\u8bd5\u5957ID\u4e3a: 495\nSUITE_ID =\n;\u6570\u636e\u56de\u586b\u5fc5\u987b\u5173\u8054PMS\u6d4b\u8bd5\u5355\n;\u5728PMS\u4e0a\u67e5\u770b\u6d4b\u8bd5\u5355\u94fe\u63a5: https://pms.uniontech.com/testtask-cases-20747.html\n;\u6d4b\u8bd5\u5355ID\u4e3a: 20747\nTASK_ID =\n;\u5c06\u6d4b\u8bd5\u7ed3\u679c\u6570\u636e\u56de\u586b\u5230PMS\n;\u4e3a\u7a7a: \u8868\u793a\u4e0d\u56de\u586b,\u4e0d\u4f1a\u5728\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u751f\u6210json\u7ed3\u679c\u6587\u4ef6;\n;async: \u8868\u793a\u9010\u6761\u5f02\u6b65\u56de\u586b,\u540e\u9762\u4e00\u6761\u6267\u884c\u5f00\u59cb\u65f6\u901a\u8fc7\u5b50\u7ebf\u7a0b\u5bf9\u524d\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u8fdb\u884c\u56de\u586b\uff0c\u5982\u6b64\u5b9e\u73b0\u65f6\u95f4\u6548\u7387\u6700\u5927\u5316;\n;finish: \u8868\u793a\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u6210\u4e4b\u540e\u9010\u4e2a\u56de\u586b(PMS\u4e0d\u652f\u6301\u5e76\u53d1);\nSEND_PMS =\n;\u6570\u636e\u56de\u586b\u7684\u89e6\u53d1\u8005\n;auto: \u6846\u67b6\u81ea\u52a8\u56de\u586b,\u914d\u5408SEND_PMS\u914d\u7f6e\u4f7f\u7528,\u4f60\u53ef\u4ee5\u9009\u62e9\u5728\u4e0d\u540c\u7684\u9636\u6bb5\u8fdb\u884c\u6570\u636e\u56de\u586b;\n;hand: \u624b\u52a8\u56de\u586b,\u6bcf\u6761\u7528\u4f8b\u4ecd\u7136\u4f1a\u751f\u6210json\u6587\u4ef6,\u4f46\u6846\u67b6\u4e0d\u4f1a\u8fdb\u884c\u6570\u636e\u56de\u586b,\u9700\u8981\u4f60\u53ef\u4ee5\u5728\u4f60\u60f3\u8981\u53d1\u9001\u7684\u65f6\u95f4\u70b9\u624b\u52a8\u89e6\u53d1\u56de\u586b;\nTRIGGER = auto\n;PMS\u56de\u586b\u7684\u91cd\u8bd5\u6b21\u6570\n;\u5982\u679c\u63a5\u53e3\u8bf7\u6c42\u5931\u8d25,\u4f1a\u8fdb\u884c\u91cd\u8bd5\nSEND_PMS_RETRY_NUMBER = 2\n[csv_link_pms_lib]\n;caselib: \u7528\u4f8b\u5e93\n;testcase: \u4ea7\u54c1\u5e93\u7528\u4f8b\nCASE_FROM = caselib\n[csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/caselib-browse-81.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 81\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic =\n[export_csv]\n;\u5bfc\u51fa\u7684csv\u6587\u4ef6\u540d\u79f0\uff0c\u9ed8\u8ba4 case_list.csv\nCSV_FILE = case_list.csv\n;exportcsv \u547d\u4ee4\u5bfc\u51fa case_list.csv \u6587\u4ef6\u65f6\u914d\u7f6e\u7684\u5b57\u6bb5\u540d\uff0c\u7528\u4f8b\u540d\u79f0\u9ed8\u8ba4\u5b58\u5728\u7b2c\u4e00\u5217\uff0c\u65e0\u9700\u6dfb\u52a0\nCSV_HEARD = \u7528\u4f8b\u7ea7\u522b,\u7528\u4f8b\u7c7b\u578b,\u6d4b\u8bd5\u7ea7\u522b,\u662f\u5426\u8df3\u8fc7\n[log_cli]\n;\u65e5\u5fd7\u76f8\u5173\u914d\u7f6e\uff08\u4e0d\u6253\u5370\u6784\u9020\u51fd\u6570\u548c\u9b54\u6cd5\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff09\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = DEBUG\n# ============= \u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u914d\u7f6e ================\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u5f00\u5934\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7, \u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_STARTSWITH = Assert\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u7ed3\u5c3e\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_ENDSWITH = Widget\n;\u652f\u6301\u7c7b\u540d\u5305\u542b xxx \u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_CONTAIN = ShortCut\n# ==============================================\n \u914d\u7f6e\u5b8c\u6210\u4e4b\u540e\uff0c\u76f4\u63a5\u5728\u547d\u4ee4\u884c\u6267\u884c manage.py \u5c31\u597d\u4e86\u3002 youqu manage.py run\n"},{"location":"#212","title":"2.1.2. \u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a youqu manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -h, --help show this help message and exit\n-a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--record_failed_case RECORD_FAILED_CASE\n\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--max_fail MAX_FAIL \u6700\u5927\u5931\u8d25\u7387\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--resolution RESOLUTION\n\u68c0\u67e5\u5206\u8fa8\u7387\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms {,async,finish}\n\u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--trigger {,auto,hand}\n\u89e6\u53d1\u8005\n-f CASE_FILE, --case_file CASE_FILE\n\u6839\u636e\u6587\u4ef6\u6267\u884c\u7528\u4f8b\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n--pms_user PMS_USER pms \u7528\u6237\u540d\n--pms_password PMS_PASSWORD\npms \u5bc6\u7801\n--suite_id SUITE_ID pms \u6d4b\u8bd5\u5957ID\n--pms_info_file PMS_INFO_FILE\npms \u4fe1\u606f\u6587\u4ef6\n--top TOP \u8fc7\u7a0b\u4e2d\u8bb0\u5f55top\u547d\u4ee4\u4e2d\u7684\u503c\n--lastfailed \u4ec5\u6267\u884c\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\n--duringfail \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\n--repeat REPEAT \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n--project_name PROJECT_NAME\n\u5de5\u7a0b\u540d\u79f0\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--build_location BUILD_LOCATION\n\u6784\u5efa\u5730\u533a\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--line LINE \u6267\u884c\u7684\u4e1a\u52a1\u7ebf\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--autostart AUTOSTART \u7528\u4f8b\u6267\u884c\u7a0b\u5e8f\u6ce8\u518c\u5230\u5f00\u673a\u81ea\u542f\u670d\u52a1\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a youqu manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\"\n \u547d\u4ee4\u884c\u53c2\u6570\u4f18\u5148\u7ea7\u662f\u9ad8\u4e8e\u914d\u7f6e\u6587\u4ef6\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u4e86\u5bf9\u5e94\u7684\u53c2\u6570\uff0c\u914d\u7f6e\u6587\u4ef6\u4e2d\u4e0d\u7ba1\u662f\u5426\u914d\u7f6e\u5747\u4e0d\u751f\u6548\u3002 --app \u5165\u53c2\u8fd8\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\uff0c\u4e0b\u9762\u7684\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u540c\u6837\u652f\u6301\u3002"},{"location":"#22","title":"2.2. \u8fdc\u7a0b\u6267\u884c","text":"\u8fdc\u7a0b\u6267\u884c\u5c31\u662f\u7528\u672c\u5730\u4f5c\u4e3a\u670d\u52a1\u7aef\u63a7\u5236\u8fdc\u7a0b\u673a\u5668\u6267\u884c\uff0c\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u76f8\u540c\uff1b \u4f7f\u7528 remote \u547d\u4ee4\uff1a youqu manage.py remote\n"},{"location":"#221","title":"2.2.1. \u8fdc\u7a0b\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u6267\u884c","text":"\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u6267\u884c\u5c31\u662f\u7531\u672c\u5730 YouQu \u4f5c\u4e3a\u670d\u52a1\u7aef\uff0c\u63a7\u5236\u8fdc\u7a0b N \u53f0\u673a\u5668\u6267\u884c\u76f8\u540c\u7684\u7528\u4f8b\uff0c\u6267\u884c\u5b8c\u4e4b\u540e\u6240\u6709\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u7ed3\u679c\u4f1a\u8fd4\u56de\u7ed9\u670d\u52a1\u7aef report \u76ee\u5f55\u4e0b\uff1b \u8fdc\u7a0b\u6267\u884c\u540c\u6837\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u8fdb\u884c\u7528\u4f8b\u76f8\u5173\u914d\u7f6e\uff1b \u9700\u8981\u91cd\u70b9\u8bf4\u4e00\u4e0b\u8fdc\u7a0b\u6267\u884c\u65f6\u7684\u6d4b\u8bd5\u673a\u4fe1\u606f\u914d\u7f6e\uff0c\u5728\u914d\u7f6e\u6587\u4ef6 setting/remote.ini \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\u3001IP\u3001\u5bc6\u7801\u3002 ;=============================== CLIENT LIST =====================================\n; \u6d4b\u8bd5\u673a\u914d\u7f6e\u5217\u8868\n;[client{number}] ;\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u6709\u591a\u5c11\u53f0\u6d4b\u8bd5\u673a\u5c31\u5199\u591a\u5c11\u4e2a client\uff0c\u522b\u540d\u5fc5\u987b\u5305\u542b client \u5b57\u7b26\uff0c\u4e14\u4e0d\u80fd\u91cd\u590d\u3002\n;user = ;\u6d4b\u8bd5\u673a user\n;ip = ;\u6d4b\u8bd5\u673a ip\n;password = 1 ;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801, \u53ef\u4ee5\u4e0d\u914d\u7f6e\u6b64\u9879\uff0c\u9ed8\u8ba4\u53d6 CLIENT_PASSWORD \u7684\u503c\uff1b\n;\u5982\u679c\u4f60\u6240\u6709\u6d4b\u8bd5\u673a\u5bc6\u7801\u90fd\u76f8\u540c\uff0c\u90a3\u4e48\u53ea\u9700\u8981\u914d\u7f6e CLIENT_PASSWORD \u5c31\u53ef\u4ee5\u4e86\n;=================================================================================\n[client1]\nuser = uos\nip = 10.8.15.xx\n[client2]\nuser = uos\nip = 10.8.15.xx\n[client3]\nuser = uos\nip = 10.8.11.xx\n \u6709\u591a\u5c11\u53f0\u673a\u5668\u5c31\u50cf\u8fd9\u6837\u53c2\u8003\u4e0a\u9762\u7684\u683c\u5f0f\u5199\u5c31\u884c\u4e86\u3002 \u7136\u540e\u5728\u547d\u4ee4\u884c\uff1a youqu manage.py remote\n \u8fd9\u6837\u8fd0\u884c\u662f\u4ece\u914d\u7f6e\u6587\u4ef6\u53bb\u8bfb\u53d6\u76f8\u5173\u914d\u7f6e\u3002 \u5982\u679c\u4f60\u4e0d\u60f3\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\uff0c\u4f60\u4ecd\u7136\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u8fdb\u884c\u4f20\u53c2\uff0c \u4ee5\u4e0b\u4e3a python3 manage.py remote \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -h, --help show this help message and exit\n-c CLIENTS, --clients CLIENTS\n\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679cpassword\u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6sett\ning/remote.ini\u4e2dCLIENT_PASSWORD\u7684\u503c,\u6bd4\u5982: uos@10.8.13.33:1\n\u6216 uos@10.8.13.33\n-s, --send_code \u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a\uff08\u4e0d\u542breport\u76ee\u5f55\uff09\n-e, --build_env \u642d\u5efa\u6d4b\u8bd5\u73af\u5883,\u5982\u679c\u4e3ayes\uff0c\u4e0d\u7ba1send_code\u662f\u5426\u4e3ayes\u90fd\u4f1a\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a.\n-p CLIENT_PASSWORD, --client_password CLIENT_PASSWORD\n\u6d4b\u8bd5\u673a\u5bc6\u7801\uff08\u5168\u5c40\uff09\n-y PARALLEL, --parallel PARALLEL\nyes:\u8868\u793a\u6240\u6709\u6d4b\u8bd5\u673a\u5e76\u884c\u8dd1\uff0c\u6267\u884c\u76f8\u540c\u7684\u6d4b\u8bd5\u7528\u4f8b;no:\u8868\u793a\u6d4b\u8bd5\u673a\u5206\u5e03\u5f0f\u6267\u884c\uff0c\u670d\u52a1\u7aef\u4f1a\u6839\u636e\u6536\u96c6\u5230\u7684\u6d4b\u8bd5\u7528\u4f8b\u81ea\n\u52a8\u5206\u914d\u7ed9\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u3002\n \u9664\u4e86\u8fd9\u4e9b\u7279\u6709\u53c2\u6570\u4ee5\u5916\uff0c\u5b83\u540c\u6837\u652f\u6301\u672c\u5730\u6267\u884c\u7684\u6240\u6709\u53c2\u6570\uff1b \u5728\u547d\u4ee4\u884c\u8fd9\u6837\u8fd0\u884c\uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\"\n \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report \u76ee\u5f55\u4e0b\u56de\u6536\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u7684\u6d4b\u8bd5\u62a5\u544a\u3002 \u6ce8\u610f\uff0c\u5982\u679c\u8fdc\u7a0b\u673a\u5668\u6ca1\u6709\u642d\u5efa\u81ea\u52a8\u5316\u6d4b\u8bd5\u73af\u5883\uff0c\u8bb0\u5f97\u52a0\u4e0a\u53c2\u6570 -e \uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\" -e\n \u6267\u884c\u524d\u786e\u4fdd\u8fdc\u7a0b\u673a\u5668\u5df2\u7ecf\u5f00\u542f\u4e86 ssh \u670d\u52a1\uff0c\u5426\u5219\u4f1a\u63d0\u793a\u65e0\u6cd5\u8fde\u63a5\uff0c\u5982\u679c\u6ca1\u6709\u5f00\u542f\uff0c\u8bf7\u624b\u52a8\u5f00\u542f\uff1a sudo systemctl restart ssh\nsudo systemctl enable ssh\n \u914d\u7f6e\u6587\u4ef6\u5176\u4ed6\u76f8\u5173\u914d\u7f6e\u9879\u8be6\u7ec6\u8bf4\u660e\uff0c\u8bf7\u67e5\u770b\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u6ce8\u91ca\u5185\u5bb9\u3002"},{"location":"#222","title":"2.2.2. \u8fdc\u7a0b\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u8d1f\u8f7d\u5747\u8861\u6267\u884c","text":"\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u8d1f\u8f7d\u5747\u8861\u6267\u884c\u4e5f\u662f\u7528\u672c\u5730\u4f5c\u4e3a\u670d\u52a1\u7aef\u63a7\u5236\u8fdc\u7a0b\u673a\u5668\u6267\u884c\uff0c\u4f46\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u4e0d\u540c\uff0c\u800c\u662f\u6240\u6709\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u4e4b\u548c\uff0c\u4e3a\u4f60\u60f3\u8981\u6267\u884c\u7684\u7528\u4f8b\u96c6\uff1b \u4f3c\u4e4e\u6709\u70b9\u96be\u4ee5\u7406\u89e3\uff0c\u6211\u7528\u5927\u767d\u8bdd\u4e3e\u4f8b\u63cf\u8ff0\u4e0b\u5c31\u662f\uff0c\u670d\u52a1\u7aef\u60f3\u8981\u6267\u884c 10 \u6761\u7528\u4f8b\uff0c\u73b0\u5728\u8fdc\u7a0b\u673a\u5668\u6709 5 \u53f0\uff1b \u7136\u540e\u670d\u52a1\u7aef\u5c31\u5148\u62ff\u7740\u7b2c 1 \u6761\u7528\u4f8b\u7ed9\u8fdc\u7a0b 1 \u53f7\u673a\u6267\u884c\uff0c\u62ff\u7b2c 2 \u6761\u7528\u4f8b\u7ed9\u8fdc\u7a0b 2 \u53f7\u673a\u6267\u884c...\uff0c\u5982\u6b64\u5faa\u73af\u76f4\u5230\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\uff0c\u8fd9\u5c31\u662f\u8d1f\u8f7d\u5747\u8861\u6267\u884c\u3002 \u4f7f\u7528\u65b9\u6cd5\u548c\u524d\u9762\u4e00\u6837\uff0c\u53ea\u662f\u9700\u8981\u589e\u52a0\u4e00\u4e2a\u53c2\u6570\uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\" --parallel no\n"},{"location":"#23-pms","title":"2.3. PMS \u6570\u636e\u56de\u586b","text":"\u6d4b\u8bd5\u5355\u5173\u8054\u7684\u7528\u4f8b\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u5bf9\u5e94\u7684\u53bb\u8dd1\u8fd9\u4e9b\u5173\u8054\u7684\u7528\u4f8b\uff0c\u5e76\u4e14\u5c06\u6267\u884c\u7684\u7ed3\u679c\u56de\u586b\u7684\u6d4b\u8bd5\u7528\u4f8b\u7684\u72b6\u6001\u91cc\u9762\u3002 PMS \u6570\u636e\u56de\u586b\u4e3b\u8981\u6709\u4e09\u79cd\u65b9\u5f0f\uff1a \uff081\uff09\u5f02\u6b65\u56de\u586b \u5728\u7528\u4f8b\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\uff0c\u91c7\u7528\u5f02\u6b65\u7684\u65b9\u5f0f\u53bb\u8fdb\u884c\u6570\u636e\u56de\u586b\uff0c\u76f4\u767d\u7684\u8bb2\u5c31\u662f\uff0c\u7b2c\u4e8c\u6761\u7528\u4f8b\u5f00\u59cb\u8dd1\u7684\u65f6\u5019\uff0c\u901a\u8fc7\u5b50\u7ebf\u7a0b\u53bb\u505a\u7b2c\u4e00\u6761\u7528\u4f8b\u7684\u6570\u636e\u56de\u586b\uff0c\u5982\u6b64\u5faa\u73af\uff0c\u76f4\u5230\u6240\u6709\u7528\u4f8b\u6267\u884c\u7ed3\u675f\uff1b \u8fd9\u79cd\u65b9\u6848\u7684\u65f6\u95f4\u6548\u7387\u6700\u9ad8\u7684\uff0c\u56e0\u4e3a\u7406\u8bba\u4e0a\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u662f\u5927\u4e8e\u6570\u636e\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\u65f6\u95f4\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u5f53\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u6570\u636e\u56de\u586b\u4e5f\u5b8c\u6210\u4e86\u3002 \u4f7f\u7528\u65b9\u6cd5\uff0c\u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u4ee5\u4e0b\u53c2\u6570\uff1a\uff08\u4ee5\u4e0b\u6d89\u53ca\u5230\u7684\u53c2\u6570\u914d\u7f6e\u90fd\u662f\u5728\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u914d\u7f6e\uff09 PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = async\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \u8fd9\u4e2a\u53c2\u6570\u53ef\u586b\u53ef\u4e0d\u586b\uff0c\u4f46\u662f\u586b\u4e86\u53ef\u4ee5\u63d0\u9ad8\u7528\u4f8b\u7684\u6267\u884c\u901f\u5ea6\uff0c\u56e0\u4e3a\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u53ef\u4ee5\u6307\u5b9a\u5230\u5177\u4f53\u7684\u5e94\u7528\u5e93\u3002\uff08\u4e0b\u540c\uff09\n \uff082\uff09\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u56de\u586b \u7b49\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u518d\u9010\u4e2a\u8fdb\u884c\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u6b64\u65b9\u6848\u65f6\u95f4\u6548\u7387\u6bd4\u8f83\u4f4e\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \uff083\uff09\u624b\u52a8\u56de\u586b \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4e0d\u505a\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u540e\u7eed\u624b\u52a8\u5c06\u7ed3\u679c\u8fdb\u884c\u56de\u586b\u8bf7\u6c42\u3002 \u7528\u4f8b\u6267\u884c\u65f6\u914d\u7f6e\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = hand\nAPP_NAME = \u540e\u7eed\u624b\u52a8\u56de\u586b\u65b9\u6cd5\uff1a youqu manage.py pms --send2task yes\n"},{"location":"#_4","title":"\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898","text":"\u7531\u540c\u5b66\u53ef\u80fd\u4f1a\u53d1\u73b0\uff0c\u600e\u4e48\u56de\u586b\u4e00\u6b21\u4e4b\u540e\uff0c\u540e\u9762\u60f3\u518d\u6b21\u56de\u586b\u5c31\u4e0d\u751f\u6548\u4e86\uff1b \u8fd9\u662f\u56e0\u4e3a\u4e3a\u4e86\u5e94\u5bf9\u524d\u9762\u63d0\u5230\u7684\u591a\u79cd\u6570\u636e\u56de\u586b\u7684\u65b9\u5f0f\uff0c\u5728 report \u76ee\u5f55\u4e0b\u4f1a\u7531 pms_xxx \u5f00\u5934\u7684\u76ee\u5f55\uff0c\u8bb0\u5f55\u4e86\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u548c\u56de\u586b\u60c5\u51b5\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u4e4b\u524d\u5df2\u7ecf\u56de\u586b\u8fc7\u4e86\uff0c\u540e\u7eed\u5c31\u4e0d\u4f1a\u518d\u6b64\u89e6\u53d1\u56de\u586b\u4e86\uff1b \u5982\u679c\u4f60\u60f3\u91cd\u65b0\u505a\u56de\u586b\uff0c\u4f60\u53ef\u4ee5\u628a report/pms_xxx \u76ee\u5f55\u5220\u6389\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u91cd\u65b0\u505a\u6570\u636e\u56de\u586b\u4e86\uff1b"},{"location":"#24-csv","title":"2.4. \u5bfc\u51fa CSV \u6587\u4ef6","text":"\u6846\u67b6\u63d0\u4f9b\u5bfc\u51fa\u6307\u5b9a\u6807\u7b7e\u7528\u4f8b\u7684\u529f\u80fd\uff1a youqu manage.py exportcsv -a deepin-album -t CICD\n \u8868\u793a\u5bfc\u51fa deepin-album \u7684\u7528\u4f8b\u4e2d\u6807\u8bb0\u4e86 CICD \u6807\u7b7e\u7684\u7528\u4f8b\uff0c\u5bfc\u51fa CSV \u6587\u4ef6\u7684\u5b57\u6bb5\u683c\u5f0f\u5df2\u7ecf\u9002\u914d\u4e86 CICD \u7684\u8981\u6c42\u3002"},{"location":"#25-app","title":"2.5. \u811a\u624b\u67b6\u65b0\u5efa APP \u5de5\u7a0b","text":"\u65b0\u5efa\u4e00\u4e2a APP \u5de5\u7a0b\uff1a youqu manage.py startapp autotest_deepin_some \u8fd9\u6837\u5728 apps \u76ee\u5f55\u4e0b\u4f1a\u521b\u5efa\u4e00\u4e2a\u5b50\u9879\u76ee\u5de5\u7a0b autotest_deepin_some\uff0c\u540c\u65f6\u65b0\u5efa\u597d\u5de5\u7a0b\u6a21\u677f\u76ee\u5f55\u548c\u6a21\u677f\u6587\u4ef6\uff1a apps\n\u2514\u2500\u2500 autotest_deepin_some\n \u00a0\u00a0 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_case.py\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 config.ini\n \u00a0\u00a0 \u251c\u2500\u2500 config.py\n \u00a0\u00a0 \u251c\u2500\u2500 conftest.py\n \u00a0\u00a0 \u251c\u2500\u2500 control\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_assert.py\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some.csv\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u2514\u2500\u2500 widget\n \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 case_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 other.ini\n \u00a0\u00a0 \u251c\u2500\u2500 other_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 pic_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2514\u2500\u2500 ui.ini\n autotest_deepin_some \u662f\u4f60\u7684\u5de5\u7a0b\u540d\u79f0\uff0c\u6bd4\u5982\uff1aautotest_deepin_music \uff1b \u5728\u6b64\u57fa\u7840\u4e0a\uff0c\u4f60\u53ef\u4ee5\u5feb\u901f\u7684\u5f00\u59cb\u4f60\u7684 AT \u9879\u76ee\u3002"},{"location":"#26","title":"2.6. \u7528\u4f8b\u6807\u7b7e\u81ea\u52a8\u540c\u6b65","text":"\u7528\u4e8e\u81ea\u52a8\u540c\u6b65 PMS \u7528\u4f8b\u6807\u7b7e\u6570\u636e\u81f3\u672c\u5730 CSV \u6587\u4ef6\uff0c\u4e3b\u8981\u901a\u8fc7\u4ee5\u4e0b\u51e0\u4e2a\u914d\u7f6e\u6765\u63a7\u5236\uff1a APP_NAME = # \u6307\u5b9a\u8981\u540c\u6b65\u7684\u5e94\u7528\u540d\u79f0\nPMS_USER = # PMS\u7684\u7528\u6237\u540d\nPMS_PASSWORD = # PMS\u7684\u5bc6\u7801\n \u5728 [csv_link_pms_id] \u8282\u70b9\u4e0b\u6307\u5b9a csv \u6587\u4ef6\u540d\u4e0e PMS \u7528\u4f8b\u6a21\u5757\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u6bd4\u5982\uff1a [csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/testcase-browse-53.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 53\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic = 53\n \u5c06\u4ee5\u4e0a\u4fe1\u606f\u914d\u7f6e\u597d\u4e4b\u540e\uff0c\u5728\u547d\u4ee4\u884c\u6267\u884c\uff1a youqu manage.py pms --pms2csv yes\n \u6bcf\u6b21\u6267\u884c\u65f6\u539f csv \u6587\u4ef6\u4f1a\u81ea\u52a8\u5907\u4efd\u5728 report/csv_back \u76ee\u5f55\u4e0b\uff0c\u56e0\u6b64\u4f60\u4e0d\u7528\u62c5\u5fc3\u811a\u672c\u6267\u884c\u5bfc\u81f4\u4f60\u7684\u6570\u636e\u4e22\u5931\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u57fa\u7840\u6846\u67b6\u8bbe\u8ba1\u65b9\u6848","text":"# ====================================\n# Author : Mikigo\n# Time : 2022/3/18\n# version \uff1a1.0\n# ====================================\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"\u505a\u4e00\u4e2a\u7b80\u5355\u3001\u597d\u7528\u3001\u529f\u80fd\u5f3a\u5927\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u3002 \u4f5c\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4e00\u4e2a\u57fa\u7840\u6846\u67b6\uff0c\u4efb\u4f55\u5e94\u7528\u90fd\u80fd\u5f88\u65b9\u4fbf\u7684\u63a5\u5165\u8fdb\u6765\uff1b \u63d0\u4f9b\u6240\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u9700\u8981\u7684\u5e95\u5c42\u529f\u80fd\uff0c\u5e76\u5bf9\u5916\u63d0\u4f9b\u552f\u4e00\u7684\u63a5\u53e3\uff0c\u65b9\u4fbf\u5e94\u7528\u5e93\u4f7f\u7528\uff1b \u6574\u5408\u516c\u5171\u5e93\uff0c\u51cf\u5c11\u5e94\u7528\u5e93\u4ee3\u7801\u91cf\u548c\u65b9\u6cd5\u7ef4\u62a4\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u8bbe\u8ba1\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u7edf\u4e00\u6982\u5ff5","text":" \u57fa\u7840\u6846\u67b6 \u672c\u9879\u76ee\u662f\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\uff08AutoTest Basic Frame\uff09\uff0c\u5168\u79f0\u4e3a\u201c\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff08AT \u57fa\u7840\u6846\u67b6\uff09\u201d\u3002 AT \u57fa\u7840\u6846\u67b6\u662f\u505a\u4e3a\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\u6765\u8bbe\u8ba1\u7684\uff0c\u5b83\u63d0\u4f9b\u4e86\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u57fa\u7840\u529f\u80fd\uff0c\u4efb\u4f55\u5e94\u7528\u63a5\u5165\u8fdb\u6765\u90fd\u80fd\u5feb\u901f\u65b9\u4fbf\u7684\u8fdb\u884c\u65b9\u6cd5\u548c\u7528\u4f8b\u7f16\u5199\uff0c\u540c\u65f6\u5728\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u3001\u6807\u7b7e\u5316\u6267\u884c\u3001\u5206\u5e03\u5f0f\u6267\u884c\u3001\u591a\u79cd\u62a5\u544a\u8f93\u51fa\u3001\u4f18\u7f8e\u7684\u6267\u884c\u65e5\u5fd7\u3001\u5931\u8d25\u81ea\u52a8\u5f55\u5c4f\u548c\u622a\u56fe\u3001\u81ea\u52a8\u73af\u5883\u6e05\u7406\u7b49\u7b49\uff0c\u5b83\u90fd\u63d0\u4f9b\u4e86\u5b8c\u5584\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u66f4\u91cd\u8981\u7684\u662f\u8fd9\u4e00\u5207\u4f7f\u7528\u8d77\u6765\u90fd\u975e\u5e38\u7b80\u5355\u3002 \u57fa\u7840\u6846\u67b6\u4e2d\u5305\u542b\u5e94\u7528\u5e93\uff08apps\uff09\u3001\u6838\u5fc3\u5e93\uff08src\uff09\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09\u3002 \u5e94\u7528\u5e93\uff08apps\uff09 \u5404\u4e2a\u5e94\u7528\u81ea\u5df1\u7684\u4ed3\u5e93\uff0c\u91cc\u9762\u4e3b\u8981\u5305\u542b\u7684\u662f\u7528\u4f8b\u3001\u65b9\u6cd5\u53ca\u4e00\u4e9b\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u53eb autotest-dde-file-manager \u3002 \u6838\u5fc3\u5e93\uff08src\uff09 \u6838\u5fc3\u5e93\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u5230\u6240\u6709\u5e95\u5c42\u6838\u5fc3\u529f\u80fd\uff0c\u8fd9\u662f\u6700\u91cd\u8981\u7684\u4e00\u4e2a\u90e8\u5206\uff0c\u7075\u9b42\u3002\u5177\u4f53\u529f\u80fd\u6a21\u5757\u53ca\u8bf4\u660e\u4f1a\u5728\u4e0b\u9762\u7b2c\u56db\u4e2a\u7ae0\u8282\u8be6\u7ec6\u63cf\u8ff0\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09 \u591a\u4e2a\u5e94\u7528\u90fd\u8981\u7528\u5230\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\uff0c\u6309\u7167\u5e94\u7528\u5212\u5206\u5b58\u653e\uff0c\u4e3b\u8981\u662f\u4e3a\u4e86\u51cf\u5c11\u4ee3\u7801\u91cf\uff0c\u6d88\u9664\u5e94\u7528\u95f4\u7684\u8026\u5408\u5173\u7cfb\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u67b6\u6784\u56fe","text":"\u6574\u4f53\u7684\u6846\u67b6\u8bbe\u8ba1\u5728\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u300b\u6587\u6863\u91cc\u9762\u5df2\u7ecf\u6709\u8be6\u7ec6\u63cf\u8ff0\u4e86\uff0c\u8fd9\u91cc\u8d34\u4e00\u4e0b\u6574\u4f53\u7684\u67b6\u6784\u56fe\uff1a \u4e3a\u4e86\u7a81\u663e\u672c\u6587\u7684\u91cd\u70b9\uff0c\u62bd\u53d6\u5176\u4e2d\u91cd\u8981\u529f\u80fd\u6a21\u5757\uff0c\u5982\u4e0b\u56fe\uff1a "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-basic-frame # \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\n\u251c\u2500\u2500 apps # \u5e94\u7528\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-dde-file-manager # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\uff08\u5e94\u7528\u5e93\u8be6\u7ec6\u76ee\u5f55\u7ed3\u6784\u8bf7\u770b\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\uff09\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 tag # \u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u2514\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u2502 \u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 xxx.png\n\u2502 \u2502 ...\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-deepin-music # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 public # \u516c\u5171\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget # dde_dock \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget # dde_desktop \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 src # \u6838\u5fc3\u5e93\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 button_center.py\n\u2502 \u251c\u2500\u2500 cmdtrl.py\n\u2502 \u251c\u2500\u2500 dogtails.py\n\u2502 \u251c\u2500\u2500 find_image.py\n\u2502 \u251c\u2500\u2500 global_config.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 setting # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 config.py\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 global_config.ini\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\u6a21\u5757\uff08Hook\uff09\n\u251c\u2500\u2500 pytest.ini # Pytest \u9ed8\u8ba4\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 docs # \u6587\u6863\u76ee\u5f55\n\u2514\u2500\u2500 manage.py # \u6267\u884c\u5668\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1apps","title":"1\u3001\u5e94\u7528\u5e93\uff08apps\uff09","text":"\u6240\u6709\u5e94\u7528\u5e93\u5747\u653e\u7f6e\u5728\u57fa\u7840\u6846\u67b6\u4e0b\u7684 apps \u76ee\u5f55\u4e0b\uff08\u89c1\u7b2c\u4e8c\u7ae0\u8282\u7b2c3\u6bb5\u76ee\u5f55\u7ed3\u6784\u5185\u5bb9\uff09\u3002\u5e94\u7528\u5e93\u7684\u67b6\u6784\u8bbe\u8ba1\u53ef\u4ee5\u53c2\u8003\u300aAT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b\u6587\u6863\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2src","title":"2\u3001\u6838\u5fc3\u5e93\uff08src\uff09","text":"\u5728 src \u76ee\u5f55\u4e0b\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u5e95\u5c42\u6838\u5fc3\u7ec4\u4ef6\uff0c\u901a\u5e38\u6765\u8bb2\u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5230\u5176\u4e2d\u67d0\u4e00\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4e48\u4f60\u9700\u8981\u663e\u793a\u7684\u5bfc\u5165\u8fd9\u4e2a\u6a21\u5757\uff0c\u7136\u540e\u624d\u80fd\u4f7f\u7528\u8be5\u6a21\u5757\u4e0b\u7684\u529f\u80fd\uff0c\u5982\u679c\u4f60\u7528\u5230\u4e86\u5341\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4f60\u5c31\u9700\u8981\u5bfc\u5165\u5341\u4e2a\u3002\u4f46\u662f\u6211\u4eec\u60f3\u8ba9\u4e8b\u60c5\u53d8\u5f97\u7b80\u5355\uff0c\u4e00\u6b21\u5bfc\u5165\uff0c\u4f7f\u7528\u6240\u6709\u3002 \u5c06\u6240\u6709\u7684\u529f\u80fd\u6a21\u5757\u90fd\u8fdb\u5165\u5230 src \u7684\u540d\u79f0\u7a7a\u95f4\uff0c\u5728 src/__init__.py \u91cc\u9762\u6211\u4eec\u8bbe\u8ba1\u6210\u8fd9\u6837\uff1a # src/__init__.py\nfrom .cmdctl import CmdCtl\nfrom .dogtails import Dogtail\nfrom .find_image import FindImage\nfrom .button_center import ButtonCenter\nclass Src(CmdCtl, FindImage):\ndef __init__(self, **kwargs):\n\"\"\"dogtail or button center param\n :param kwargs: app_name, desc, number\n \"\"\"\nif kwargs:\napp_name = kwargs.get(\"APP_NAME\")\ndesc = kwargs.get(\"DESC\")\nif app_name is None or desc is None:\nraise ValueError\nnumber = kwargs.get(\"number\")\nnumber = number if isinstance(number, int) else -1\n# \u5bf9\u8c61\u7ec4\u5408\nself.dog = Dogtail(app_name, desc, number)\nself.ui = ButtonCenter(app_name, number)\n \u9700\u8981\u4f20\u9012\u53c2\u6570\u7684\u91c7\u7528\u5bf9\u8c61\u7ec4\u5408\uff0c\u6ca1\u6709\u53c2\u6570\u7684\u4f7f\u7528\u7ee7\u627f\uff0c\u7ee7\u627f\u7684\u7c7b\u7b26\u5408 Mixin \u8bbe\u8ba1\u6a21\u5f0f\u3002 \u5e94\u7528\u5e93\u91cc\u9762\u4f7f\u7528\u7684\u65f6\u5019\u5728 widget/base_widget.py \u91cc\u9762\u53ea\u9700\u8981\u552f\u4e00\u7ee7\u627f Src \uff1a # \u5e94\u7528\u5e93\u91cc\u9762\u65b9\u6cd5\u57fa\u7c7b\n# widget/base_widget.py\nfrom src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n \u8981\u4f7f\u7528\u6838\u5fc3\u5e93\u7684\u529f\u80fd\uff0c\u53ea\u9700\u8981\u5199\u4e00\u4e2a\u5bfc\u5165 from src import Src \u5373\u53ef\u3002 \u5199 __init__ \u6784\u9020\u51fd\u6570\u7684\u539f\u56e0\u662f\u901a\u8fc7\u53c2\u6570\u6784\u9020\u5e94\u7528\uff0c\u5e76\u4e14\u4f20\u9012 number \u8fdb\u6765\uff0c\u53ef\u4ee5\u5b9e\u73b0\u591a\u7a97\u53e3\u7684\u63a7\u5236\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3public","title":"3\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09","text":"\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6bcf\u4e2a\u5e94\u7528\u90fd\u662f\u4e00\u4e2a\u5355\u72ec\u7684 py \u6587\u4ef6\uff0c\u76f8\u4e92\u4e4b\u95f4\u662f\u72ec\u7acb\u7684\uff0c\u6bcf\u4e2a py \u6587\u4ef6\u91cc\u9762\u662f\u8be5\u5e94\u7528\u7684\u65b9\u6cd5\u7c7b\uff0c\u6bd4\u5982\uff1a\u6700\u5e38\u7528\u7684\u65b9\u6cd5\u7c7b dde_desktop_public_widget.py # dde_desktop_widget.py\nfrom src import Src\nclass _DdeDesktopPublicBaseWidget(Src):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-desktop\"\nDESC = \"/usr/bin/dde-desktop\"\ndef __init__(self):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC)\nclass DdeDesktopPublicWidget(_DdeDesktopPublicBaseWidget):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u7c7b\"\"\"\ndef click_music_dir_by_ui(self):\n\"\"\"\u5728\u6587\u4ef6\u9009\u62e9\u6846\u70b9\u51fb\u97f3\u4e50\u76ee\u5f55\"\"\"\nself.click(*self.ui.btn_center(\"\u4fa7\u8fb9\u680f-\u97f3\u4e50\")) \ndef click_xxx_by_attr(self):\npass\n \u516c\u5171\u65b9\u6cd5\u5e93\u610f\u4e49\uff1a \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6240\u5c01\u88c5\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\u90fd\u662f\u81f3\u5c11\u88ab2\u4e2a\u5e94\u7528\u90fd\u7528\u5230\u7684\uff0c\u8fd9\u6837\u505a\u53ef\u4ee5\u51cf\u5c11\u6574\u4f53\u4ee3\u7801\u91cf\uff0c\u4ece\u800c\u51cf\u8f7b\u5e94\u7528\u5e93\u4ee3\u7801\u7684\u7ef4\u62a4\u5de5\u4f5c\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u7f16\u5199\u5f62\u5f0f\uff08\u547d\u540d\u89c4\u5219\u3001\u5b9a\u4f4d\u7684\u65b9\u6848\u5199\u6cd5\u3001\u6ce8\u91ca\u7684\u5199\u6cd5\u7b49\u7b49\uff09\u5177\u6709\u4e00\u5b9a\u7684\u6a21\u677f\u4f5c\u7528\uff0c\u8fd9\u6837\u5373\u4f7f\u662f\u5404\u4e2a\u5e94\u7528\u5e93\u90fd\u72ec\u7acb\u7ef4\u62a4\uff0c\u6240\u6709\u7684\u7f16\u7801\u98ce\u683c\u90fd\u662f\u8d8b\u4e8e\u76f8\u540c\u7684\uff0c\u56e0\u4e3a\u5927\u5bb6\u90fd\u5e94\u8be5\u53c2\u7167\u516c\u5171\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u5199\u6cd5\u6765\u5199\u81ea\u5df1\u5e94\u7528\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\u7c7b\uff0c\u8fd9\u6837\u4f7f\u5f97\u4ece\u516c\u53f8\u7684\u89d2\u5ea6\u53bb\u770b\u6240\u6709\u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u90fd\u662f\u7edf\u4e00\u7684\u3002 \u53ef\u4ee5\u901a\u8fc7\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\uff0c\u4e86\u89e3\u5230\u5176\u4ed6\u5e94\u7528\u7684\u529f\u80fd\uff0c\u5bf9\u4e8e\u6211\u4eec\u9700\u6c42\u7406\u89e3\uff0c\u4e86\u89e3\u7cfb\u7edf\u7684\u65b9\u65b9\u9762\u9762\u4e5f\u6709\u597d\u5904\u3002 \u5f53\u7136\uff0c\u5982\u679c\u4f60\u7684\u5e94\u7528\u672c\u8eab\u662f\u5c5e\u4e8e\u6839\u672c\u5c31\u4e0d\u9700\u8981\u548c\u5176\u4ed6\u5e94\u7528\u4ea4\u4e92\u7684\uff0c\u90a3\u4e48\u4f60\u53ef\u80fd\u4e0d\u4f1a\u7528\u5230\u8fd9\u91cc\u9762\u7684\u529f\u80fd\uff0c\u6ca1\u5173\u7cfb\uff0c\u4f60\u6240\u6709\u7684\u65b9\u6cd5\u90fd\u53ef\u4ee5\u76f4\u63a5\u5199\u5728\u5e94\u7528\u5e93\u7684\u4e1a\u52a1\u5c42\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4conftestpy","title":"4\u3001conftest.py","text":"conftest.py \u4ece\u529f\u80fd\u4e0a\u5c06\u662f\u5c5e\u4e8e\u6838\u5fc3\u5e93\uff08src\uff09\u7684\u5185\u5bb9\uff0c\u4f46\u662f\u7531\u4e8e\u5b83\u7684\u7279\u6b8a\u6027\uff0c\u5373\u5b83\u662f\u5bf9\u5e94\u7528\u5e93\u4e2d\u7684\u7528\u4f8b\u751f\u6548\u7684\uff0c\u800c\u4e14\u5b83\u7684\u4f5c\u7528\u57df\u662f\u5f53\u524d\u76ee\u5f55\u53ca\u4ee5\u4e0b\uff0c\u56e0\u6b64\u6211\u4eec\u5c06\u5b83\u653e\u5230\u9879\u76ee\u6839\u76ee\u5f55\u3002\u6211\u4eec\u6846\u67b6\u4e2d\u6709\u4e0d\u5c11\u6838\u5fc3\u529f\u80fd\u90fd\u662f\u5728\u8fd9\u91cc\u9762\u8fdb\u884c\u5f00\u53d1\u7684\uff0c\u540e\u9762\u7b2c\u56db\u7ae0\u4f1a\u8bb2\u5230\u7ec6\u8282\u3002 pytest.ini \u4f5c\u7528\u548c conftest.py \u7c7b\u4f3c\uff0c\u662f Pytest \u6846\u67b6\u7684\u56fa\u5b9a\u914d\u7f6e\u6587\u4ef6\uff0c\u76ee\u524d\u914d\u7f6e\u4e86\u4e00\u4e9b\u901a\u7528\u7684\u547d\u4ee4\u884c\u6267\u884c\u53c2\u6570\uff0c\u4e5f\u653e\u5728\u9879\u76ee\u6839\u76ee\u5f55\u3002 \u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 Hook \u51fd\u6570\uff0capps \u76ee\u5f55\u4e0b\u7684 \u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 fixture \u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5setting","title":"5\u3001setting","text":"\u5168\u5c40\u914d\u7f6e\u6a21\u5757\uff0c\u5305\u542b\u4e86\u4ee5\u4e0b\u914d\u7f6e\u6587\u4ef6\uff1a \uff081\uff09ini \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u914d\u7f6e\u4e00\u4e9b\u5168\u5c40\u7684\u914d\u7f6e\u9879\uff0c\u8b6c\u5982\uff1a\u5931\u8d25\u91cd\u8dd1\u6b21\u6570\u3001\u662f\u5426\u5931\u8d25\u5f55\u5c4f\u3001\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\u3001\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4\u3001\u6267\u884c\u65f6\u65e5\u5fd7\u7ea7\u522b\u3001\u751f\u6210\u7684\u62a5\u544a\u7c7b\u578b\u3001\u4ee5\u53ca\u5206\u5e03\u5f0f\u6267\u884c\u7684\u4e00\u4e9b\u7b56\u7565\u914d\u7f6e\u9879\u7b49\u7b49\u3002 \uff082\uff09config.py \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u63d0\u4f9b\u914d\u7f6e\u6587\u4ef6\u8bfb\u53d6\u3001\u52a8\u6001\u83b7\u53d6\u4e00\u4e9b\u5e38\u91cf\uff08\u5982\u9879\u76ee\u6839\u76ee\u5f55\u7edd\u5bf9\u8def\u5f84 (BASE_DIR)\u3001\u7cfb\u7edf\u67b6\u6784\uff08SYS_FRAME\uff09\u3001\u65f6\u95f4\u5b57\u7b26\u4e32\uff08strftime\uff09\u3001\u672c\u673a USERNAME IP \u7b49\u7b49\uff09\u3001\u516c\u5171 URL \u7b49\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u89c4\u8303","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u7248\u672c\u53ca\u4f9d\u8d56","text":"\u57fa\u7840\u6846\u67b6\u4f1a\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u8fdb\u884c\u7248\u672c\u53d1\u5e03\uff0c\u4e0d\u4e0e\u67d0\u4e2a\u5e94\u7528\u7248\u672c\u7ed1\u5b9a\uff0c\u4f46\u662f\uff0c\u5e94\u7528\u5e93\u4f1a\u4f9d\u8d56\u4e8e\u57fa\u7840\u6846\u67b6\u7684\u7248\u672c\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u5efa\u8bae\u5728\u5e94\u7528\u5e93\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a\u6587\u672c\u6587\u4ef6\u7528\u4e8e\u8bb0\u5f55\u6240\u4f9d\u8d56\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\uff0c\u7c7b\u4f3c\u4e8e\u5f00\u53d1\u5e94\u7528\u7684 debian/control \u6587\u4ef6\u7684\u529f\u80fd\uff0c\u4e3a\u4e86\u4fdd\u6301\u7edf\u4e00\uff0c\u8fd9\u4e2a\u6587\u4ef6\u5c31\u547d\u540d\u4e3a control\uff0c\u653e\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u6838\u5fc3\u5e93\u72ec\u7acb\u6027","text":"\u6838\u5fc3\u5e93\u4e0d\u5efa\u8bae\u9488\u5bf9\u67d0\u4e00\u4e2a\u5e94\u7528\u5355\u72ec\u505a\u4ee3\u7801\u4e0a\u7279\u6b8a\u5904\u7406\uff0c\u901a\u5e38\u8003\u8651\u9488\u5bf9\u67d0\u4e00\u79cd\u573a\u666f\u8fdb\u884c\u5904\u7406\uff0c\u8fd9\u4e9b\u573a\u666f\u901a\u5e38\u662f\u5b58\u5728\u4e00\u4e9b\u5171\u6027\u7684\u3002\u6bd4\u5982\u8bf4\uff1a\u684c\u9762\u7684ID\u5206\u914d\u5b58\u5728\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u903b\u8f91\u5904\u7406\u89e3\u51b3ID\u5206\u914d\u9519\u8bef\u7684\u95ee\u9898\uff0c\u4f46\u662f\u8fd9\u90e8\u5206\u903b\u8f91\u6211\u4eec\u4f1a\u5728\u684c\u9762\u7684\u65b9\u6cd5\u5c42\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u517c\u5bb9\u6027","text":"\u4e3a\u4e86\u4fdd\u6301\u517c\u5bb9\u6027\uff0c\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u539f\u5219\u4e0a\u4e0d\u5bf9\u8001\u65b9\u6cd5\u8fdb\u884c\u4fee\u6539\u6216\u5220\u9664\uff0c\u53ea\u8fdb\u884c\u65b0\u589e\u3002\u6d89\u53ca\u5230\u8001\u65b9\u6cd5\u4fee\u6539\u6216\u5220\u9664\u7684\uff0c\u4f1a\u8fdb\u884c\u63d0\u524d\u9884\u544a\uff0c\u5e76\u5728\u7b2c\u4e8c\u4e2a\u7248\u672c\u4e4b\u540e\uff08\u4e2d\u95f4\u4f1a\u9694\u4e00\u4e2a\u7248\u672c\u8fc7\u5ea6\uff09\u6b63\u5f0f\u5b9e\u65bd\u4fee\u6539\u6216\u5220\u9664\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u547d\u540d\u89c4\u8303","text":" \u7528\u4f8b ID \u6bcf\u4e2a\u5e94\u7528\u81ea\u5df1\u7ef4\u62a4\u4e00\u5957 ID\uff0c\u5728PMS\u4e0a\u7528\u4f8b\u6807\u9898\u4e0a\u5c06\u81ea\u52a8\u5316ID\u4ee5\u6807\u7b7e\u7684\u5f62\u5f0f\u5199\u5165\uff0c\u6bd4\u5982\uff1a[101]\u6253\u5f00-\u542f\u52a8\u5e94\u7528\u540edock\u53f3\u952e\u83dc\u5355 \u4e00\u4e2a\u7528\u4f8b\u7c7b\u91cc\u9762\u6709\u591a\u4e2a\u7528\u4f8b\u65f6\uff0c\u5728\u7528\u4f8b\u540d\u79f0\u540e\u9762\u52a0\u5e8f\u53f7\u3002 class TestFileManager(BaseCase):\n\"\"\"\u6587\u7ba1\u7528\u4f8b\"\"\"\ndef test_xxx_015_1(self):\npass\ndef test_xxx_015_2(self):\npass\n \u6ce8\u610f 015_1\uff0c\u4e0d\u8981\u5199015_01\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 PMS \u4e0a\u7684\u7528\u4f8bID\uff1a PMS \u4e0a\u662f6\u4f4d\u6570\uff0c\u4e0d\u591f\u76f4\u89c2\uff0c\u4e5f\u4e0d\u597d\u7ef4\u62a4\uff0c\u5728\u81ea\u52a8\u5316\u4e0b\u9762\u53bb\u627e\u4e00\u4e2a\u5e26\u6709 6 \u4f4d\u6570\u7684\u6587\u4ef6\u662f\u4e00\u4e2a\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 PMS \u4e0a\u7684 ID \u53ef\u80fd\u4f1a\u53d1\u751f\u53d8\u5316\uff0c\u6bd4\u5982\u5bfc\u51fa\u6765\u5bfc\u8fdb\u53bb\u7684\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u5b58\u5728\u95ee\u9898\uff0c\u5982\u679c\u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u8981\u60f3\u627e\u51fa\u6765\u5bf9\u5e94\u4fee\u6539\u81ea\u52a8\u5316\u7528\u4f8b ID\uff0c\u5c06\u4f1a\u662f\u4ef6\u975e\u5e38\u75db\u82e6\u7684\u4e8b\u60c5\u3002 \u51fd\u6570\u547d\u540d\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5de6\u952e\u70b9\u51fb click \u53f3\u952e\u70b9\u51fb right_click \u53cc\u51fb double_click \u79fb\u52a8 move_to \u62d6\u52a8 drag \u65b0\u5efa new \u62d6\u52a8\u5230 drag_to \u4ece\u54ea\u91cc\u62d6\u52a8\u5230\u54ea\u91cc drag_something_from_xxx_to_xxx \u83b7\u53d6 get \u83b7\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5750\u6807 get_location \u975e\u7279\u6b8a\u6587\u4ef6 file word\u6587\u4ef6 doc text\u6587\u4ef6 text \u6587\u4ef6\u5939 dir \u5173\u952e\u8bcd\u6301\u7eed\u589e\u52a0 \u5e38\u91cf\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5e94\u7528\u540d\u79f0 APP_NAME \u5e94\u7528\u63cf\u8ff0 DESC \u672c\u5e94\u7528\u4ee5\u5916\u7684\u5176\u4ed6\u5e94\u7528\uff0c\u6bd4\u5982\u5e2e\u52a9 HELP \u5176\u4ed6\u540d\u79f0\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u65b9\u6cd5\u5305\u540d widget \u65b9\u6cd5\u6587\u4ef6\u540d\uff08\u6587\u7ba1\u4e3e\u4f8b\uff09 dfm_widget.pytitle_widget.pyright_view_widget.pyleft_view_widget.pypop_widget.pybase_widget.pydfm_assert.py \u65ad\u8a00\u8bed\u53e5\u547d\u540d\u89c4\u8303 \u65ad\u8a00\u8bed\u53e5\u90fd\u662f\u4ee5 assert \u5f00\u5934 \u65ad\u8a00 \u8bed\u53e5 \u5224\u65ad\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_existsassert_file_not_exists \u5224\u65ad\u684c\u9762\u76ee\u5f55\u4e0b\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_exists_in_desktopassert_file_not_exists_in_desktop \u5224\u65ad\u56fe\u7247\u5b58\u5728 assert_image_existsassert_image_not_exists \u5224\u65ad\u5f71\u9662\u4e2d\u662f\u5426\u5b58\u5728\u56fe\u7247 assert_image_exists_in_movieassert_image_not_exists_in_movie \u5224\u65ad\u5143\u7d20\u662f\u5426\u5b58\u5728 assert_element_existassert_element_not_exist \u5224\u65ad\u662f\u5426\u76f8\u7b49 assert_equalassert_not_equal \u5224\u65ad\u662f\u5426\u4e3a\u771f assert_trueassert_false"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5fixture","title":"5\u3001fixture \u89c4\u8303","text":"\u7531\u4e8e Pytest \u6846\u67b6\u4e2d\u652f\u6301 fixture \u7684\u5199\u6cd5\u548c Xunit \u5199\u6cd5\u7684\uff0c\u6240\u4ee5\u5e94\u7528\u5e93\u4e2d\u53ef\u80fd\u5b58\u5728\u6df7\u7528\u7684\u60c5\u51b5\uff0c\u4e3a\u7edf\u4e00\u7f16\u7801\u98ce\u683c\u65b9\u4fbf\u540e\u7eed\u7528\u4f8b\u4ee3\u7801\u7ef4\u62a4\uff0c\u73b0\u505a\u4ee5\u4e0b\u89c4\u8303\u8bf4\u660e\uff1a \u629b\u5f03 Xunit \u7684\u5199\u6cd5\uff0c\u7edf\u4e00\u91c7\u7528 Pytest fixture \u7684\u5199\u6cd5\u3002 \u5e94\u7528\u5185 fixture \u8c28\u614e\u4f7f\u7528 autouse=True \uff0c\u975e\u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u975e\u5e38\u4e0d\u5efa\u8bae\u4f7f\u7528\u8fd9\u4e2a\u53c2\u6570\u3002 \u8c03\u7528 fixture \u4e0d\u80fd\u4f7f\u7528 @pytest.mark.usefixture()\uff0c\u4f7f\u7528\u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u4f20\u5165\u51fd\u6570\u5bf9\u8c61\u3002 \u5efa\u8bae\u5728\u4e00\u4e2a conftest.py \u91cc\u9762\u53bb\u5199\uff0c\u4e00\u4e2a\u5e94\u7528\u4e5f\u5c3d\u91cf\u7ef4\u62a4\u4e00\u4e2a conftest.py\u6587\u4ef6\u3002 fixture \u4e5f\u9700\u8981\u5199\u529f\u80fd\u8bf4\u660e\uff0c\u51fd\u6570\u540d\u79f0\u8981\u6709\u5177\u4f53\u542b\u4e49\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#6","title":"6\u3001\u65b9\u6cd5\u7f16\u5199\u89c4\u8303","text":" \u65b9\u6cd5\u7c7b\u578b\uff1a if \u6ca1\u6709\u7528\u5230\u5b9e\u4f8b\u5bf9\u8c61\uff1a\nif \u6ca1\u6709\u7528\u5230\u7c7b\u5bf9\u8c61\uff1a\n\u5199\u9759\u6001\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @staticmethod\nelse\uff1a\n\u5199\u7c7b\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @classmethod\nelse:\n\u76f4\u63a5\u5199\u5b9e\u4f8b\u65b9\u6cd5\n \u4e3e\u4f8b: class TitleWidget:\ndef click_xxx_by_ui(self):\npass\n@staticmethod\ndef click_xxx_by_ui():\npass\n@classmethod\ndef click_xxx_by_ui(cls):\npass\n \u51fd\u6570\u540d\u79f0\u4e0d\u51fa\u73b0\u6570\u5b57\uff0c\u9700\u8981\u8868\u793a\u6570\u91cf\u7684\u7528\u5355\u8bcd\u8868\u793a\u3002 \u51fd\u6570\u529f\u80fd\u6ce8\u91ca\u3002 \u6ca1\u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg2:xxx\n\"\"\"\n \u6709\u53c2\u6570\uff0c\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg1:xxx\nreturn: xxx\n\"\"\"\n \u200b \u7528 Pycharm \u7684\u6ce8\u91ca\u6a21\u677f\u4e5f\u53ef\u4ee5\uff0c\u53ea\u8981\u4f53\u73b0\u4e86\u53c2\u6570\u7684\u7c7b\u578b\u548c\u8fd4\u56de\u5c31\u884c\u4e86\u3002 \u6682\u4e0d\u8981\u6c42\u5199\u7c7b\u578b\u6ce8\u89e3\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#7case","title":"7\u3001\u7528\u4f8b\uff08case\uff09\u89c4\u8303","text":" \u4ee5\u7c7b\u7684\u5f62\u5f0f\u5199\u7528\u4f8b\uff0c\u7528\u4f8b\u7c7b\u96c6\u6210\u7528\u4f8b\u57fa\u7c7b\u3002 \u7528\u4f8b\u7c7b\u9700\u8981\u5199\u6ce8\u91ca\u3002 \u6d4b\u8bd5\u7528\u4f8b\u51fd\u6570\u8bf4\u660e\uff08\u5efa\u8bae\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u540d\u79f0\uff09 \"\"\"\u53f3\u4fa7\u9884\u89c8-\u56fe\u7247\u7c7b\u578b\u4fe1\u606f\u680f\u57fa\u672c\u4fe1\u606f\"\"\"\n \u4e0d\u5199\u8c03\u8bd5\u4ee3\u7801 if __name__ == '__main__':\npytest.main()\n \u6240\u6709\u7528\u4f8b\u90fd\u7ee7\u627f BaseCase\u3002 BaseCase \u91cc\u9762\u653e\u4e00\u4e9b\u6d4b\u8bd5\u6570\u636e\u7684\u5e38\u91cf\uff0c\u6bd4\u5982\u6587\u4ef6\u540d\u79f0\uff0c\u5e94\u7528\u540d\u79f0\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u4e00\u4e9b\u901a\u7528\u7684\u5b57\u7b26\u4e32\u3002 \u8fd9\u7c7b\u662f\u5c5e\u4e8e\u6d4b\u8bd5\u6570\u636e\u3002 class BaseCase(DfmAssert):\n\"\"\"\u7528\u4f8b\u57fa\u7c7b\"\"\"\nNEW_FILE = \"\u65b0\u5efa\u6587\u672c.txt\"\nTEST_FILE = \"test.txt\"\nNEW_DIR = \"\u65b0\u5efa\u6587\u4ef6\u5939\"\nNEW_WORD = \"\u65b0\u5efaWord\u6587\u6863.doc\"\nAPP_HELP = \"damn\"\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\n\"\"\"\u7528\u4f8b\u6807\u9898\uff08\u590d\u5236PMS\u4e0a\u7528\u4f8b\u6807\u9898\uff09\"\"\"\ndfm = DfmWidget()\ndfm.click_xxx_by_attr(self.NEW_FILE)\ndfm.new_file_in_desktop_by_cmd(self.NEW_FILE)\nself.assert_true(dfm.get_process_status(self.APP_NAME))\n \u7528\u4f8b\u91cc\u9762\u5c3d\u91cf\u51cf\u5c11\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\uff0c\u66f4\u8981\u51cf\u5c11\u76f8\u540c\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\u3002 \u7edf\u4e00\u6587\u4ef6\u6ce8\u91ca\u5934\u3002 #!/usr/bin/env python3\n# _*_ coding:utf-8 _*_\n\"\"\"\n:Author:email@uniontech.com\n:Date :${DATE} ${TIME}\n\"\"\"\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#8","title":"8\u3001\u5176\u4ed6\u89c4\u8303","text":" \u65e5\u5fd7\u6253\u5370\u8981\u5728\u65b9\u6cd5\u6700\u524d\u9762\uff0c\u5426\u5219\u4ee3\u7801\u62a5\u9519\u6ca1\u6709\u65e5\u5fd7\u8f93\u51fa\uff0c\u4e0d\u597d\u5b9a\u4f4d\u95ee\u9898\u3002\uff08\u6211\u4eec\u4f1a\u8003\u8651\u7ee7\u7eed\u4f7f\u7528\u62e6\u622a\u5668\u6253\u5370\u65e5\u5fd7\uff09 \u6240\u6709\u7684\u64cd\u4f5c\u90fd\u9700\u8981\u6709\u65e5\u5fd7\uff0c\u5305\u62ec sleep()\uff0c\u6211\u4eec\u4f1a\u91cd\u5199\u4e00\u4e2a\u6709\u65e5\u5fd7\u8f93\u5165\u7684 sleep\u3002 \u4e1a\u52a1\u5c42\u65e5\u5fd7\u7ea7\u522b\u4e3a INFO\u3002 hook \u51fd\u6570\u53ea\u80fd\u5199\u5230\u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u91cc\u9762\u3002 apps \u76ee\u5f55\u4e0b\u7684 conftest.py \u539f\u5219\u4e0a\u4e0d\u4f1a\u65b0\u589e fixture\u3002 \u56fa\u5b9a\u76ee\u5f55\u6216\u5143\u7d20\u63a7\u4ef6\u7684\u64cd\u4f5c\uff0c\u5c06\u64cd\u4f5c\u65b9\u6cd5\u5199\u6b7b\uff0c\u6587\u4ef6\u7c7b\u64cd\u4f5c\u5c06\u6587\u4ef6\u540d\u7559\u53c2\u6570\u3002 \u8def\u5f84\u62fc\u63a5\u89c4\u8303\uff1a \u7cfb\u7edf\u4e2d\u56fa\u5b9a\u76ee\u5f55\uff0c\u8def\u5f84\u62fc\u63a5\u65f6\u4f7f\u7528\u6ce2\u6d6a\u7b26\u53f7\uff0c\u6bd4\u5982\uff1a~/Desktop/\uff0c\u4e0b\u5c42\u4f7f\u7528 os.path.expanduser()\uff0c\u5b83\u53ef\u4ee5\u81ea\u52a8\u8bc6\u522b\u6ce2\u6d6a\u7b26\u53f7\u3002 \u9879\u76ee\u4e0b\u8def\u5f84\u4f7f\u7528\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u8def\u5f84\uff0c\u6bd4\u5982\uff1aConfig.BASE_PATH\uff0c\u56e0\u4e3a\u9879\u76ee\u662f\u53ef\u4ee5\u5728\u4efb\u610f\u8def\u5f84\u8fd0\u884c\u7684\uff0c\u9700\u8981\u52a8\u6001\u62fc\u63a5\u8def\u5f84\u3002 "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848","text":"# =================================================\n# Author : Mikigo\n# Time : 2022/3/16\n# version \uff1a1.0\n# =================================================\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"AT \u5e94\u7528\u5e93\u6539\u9020\u662f\u57fa\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u8fdb\u884c\u7528\u4f8b\u65b9\u6cd5\u548c\u4e1a\u52a1\u903b\u8f91\u7684\u91cd\u65b0\u8bbe\u8ba1\uff0c\u4ee5\u5b9e\u73b0\u5e94\u7528\u5e93\u9ad8\u6548\u7684\u7f16\u5199\u3001\u7ef4\u62a4\u7528\u4f8b\u53ca\u5176\u65b9\u6cd5\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u6587\u4ef6\u7ba1\u7406\u5668\u4ece\u4e1a\u52a1\u590d\u6742\u5ea6\u548c\u7528\u4f8b\u91cf\u6765\u8bb2\uff0c\u5728\u7cfb\u7edf\u6240\u6709\u5e94\u7528\u4e2d\uff0c\u662f\u5f88\u6709\u4ee3\u8868\u6027\u7684\uff0c\u96be\u5ea6\u4e5f\u662f\u6700\u5927\u7684\uff0c\u56e0\u6b64\u6211\u4eec\u9009\u53d6\u6587\u4ef6\u7ba1\u7406\u5668\u4f5c\u4e3a\u5e94\u7528\u5e93\u6539\u9020\u7684\u5b9e\u9a8c\u5e94\u7528\uff0c\u7ed9\u540e\u7eed\u5176\u4ed6\u5e94\u7528\u6539\u9020\u63d0\u4f9b\u5207\u5b9e\u53ef\u884c\u7684\u601d\u8def\u548c\u65b9\u6848\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u5206\u5c42\u8bbe\u8ba1\u56fe","text":"\u6574\u4f53\u4ecd\u7136\u9075\u5faa PO \u8bbe\u8ba1\u7406\u5ff5\uff0c\u6839\u636e\u4e1a\u52a1\u9700\u8981\uff0c\u5c06\u6587\u7ba1\u4e1a\u52a1\u5c42\u8fdb\u884c 3 \u5c42\u5212\u5206\uff1a "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-dde-file-manager # \u5e94\u7528\u4ed3\u5e93\n\u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 test_xxx_001.py\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u00a0\u251c\u2500\u2500 __init__.py\n\u2502 \u00a0\u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u00a0\u251c\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u00a0\u251c\u2500\u2500 base_widget.py # \u65b9\u6cd5\u57fa\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 title_widget.py # title \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 right_view_widget.py # right view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 left_view_widget.py # left view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 pop_widget.py # pop \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 dfm_widget.py # \u65b9\u6cd5\u7684\u7edf\u4e00\u51fa\u53e3\n\u2502 \u00a0\u2514\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 tag # \u7528\u4f8b\u6807\u7b7e\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 xxx.csv # \u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2514\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u57fa\u7c7b","text":" \u7ee7\u627f\u6838\u5fc3\u5c42\u7684\u5404\u4e2a\u6a21\u5757\u7c7b\u3002 \u62bd\u53d6\u64cd\u4f5c\u5c42\u7684\u4e00\u4e9b\u57fa\u7840\u65b9\u6cd5\u3002 \u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u7684\u4e00\u4e9b\u516c\u5171\u65b9\u6cd5\u3002 \u8def\u5f84\u7ec4\u88c5\u65b9\u6cd5\u3002 \u4e00\u4e9b\u4e1a\u52a1\u5c42\u76f8\u5173\u7684\u53d8\u91cf\u3001\u5e38\u91cf\u3001shell\u547d\u4ee4\u3001\u5750\u6807\u3002 \u65b9\u6cd5\u57fa\u7c7b\u7684\u5199\u6cd5\uff1a from src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u64cd\u4f5c\u5c42","text":" \u6a21\u5757\u5212\u5206 \u6309\u7167\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u6587\u7ba1\u4e3b\u754c\u9762\u5206\u4e3a\u4e09\u4e2a\u533a\u57df\uff1a\u6807\u9898\u680f\u3001\u53f3\u8fb9\u89c6\u56fe\u533a\u57df\u3001\u5de6\u8fb9\u89c6\u56fe\u533a\u57df \u5f39\u7a97\uff1a\u8bbe\u7f6e\u754c\u9762\u5f39\u7a97\u3001\u4fdd\u9669\u7bb1\u5f39\u7a97\u3001\u5220\u9664\u786e\u8ba4\u5f39\u7a97\u3001\u53ca\u5404\u79cd\u7f51\u7edc\u5f39\u7a97 \u53f3\u952e\u83dc\u5355\uff1a\u6682\u65f6\u4e0d\u8003\u8651\u4e3a\u5355\u72ec\u7684\u6a21\u5757\uff0c\u8003\u8651\u4ee5\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6848\u505a\u6210\u516c\u5171\u5e93\u3002 \u5404\u4e2a\u6a21\u5757\u53ea\u7ee7\u627f\u57fa\u7c7b from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u6784\u9020\u51fd\u6570\u91cc\u9762\u4e0d\u6784\u9020\u5bf9\u8c61\uff0c\u53ef\u4ee5\u521d\u59cb\u5316\u4e00\u4e9b\u53d8\u91cf\u3002 \u4e0d\u540c\u7684\u5b9a\u4f4d\u65b9\u6848\u8c03\u7528\u4e0d\u540c\u7684\u5b9a\u4f4d\u5de5\u5177\u5bf9\u8c61\u3002 self.dog\nself.ui\nself.d_bus\n \u65b9\u6cd5\u7f16\u5199 \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u5e94\u7528\u5c42","text":" \u7ee7\u627f\u64cd\u4f5c\u5c42\u7684\u6240\u6709\u7c7b\u3002 \u4ec5\u4ec5\u7528\u4e8e\u7528\u4f8b\u4e2d\u5bfc\u5165\u65b9\u4fbf\uff0c\u4e0d\u505a\u5176\u4ed6\u4e8b\u60c5\u3002 class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n DfmAssert \u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u7ee7\u627f\uff0c\u65b9\u4fbf\u4f7f\u7528\u65ad\u8a00\u8bed\u53e5\u3002 from apps.dde_file_manager.widget.dfm_widget import DfmWidget\nfrom public.assert import Assert\nclass DfmAssert(Assert):\ndef assert_file_exists_in_desktop(self, file_name):\nself.assert_file_exists(f\"~/Desktop{file_name}\")\n...\nDfmWidget().get_file_in_desktop()\n \u7528\u4f8b\u91cc\u9762\u76f4\u63a5\u7ee7\u627f\uff0c\u65b9\u4fbf\u5728\u7528\u4f8b\u91cc\u9762\u4f7f\u7528 self \u8fdb\u884c\u65ad\u8a00\uff0c\u66f4\u7b26\u5408\u65ad\u8a00\u7684\u4f7f\u7528\u4e60\u60ef\uff0c\u7528\u4f8b\u903b\u8f91\u4e0a\u66f4\u6e05\u695a\u3002 class BaseCase(DfmAssert):\npass\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\nself.assert_file_exists_in_desktop(\"xxx\")\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u903b\u8f91\u4e3e\u4f8b","text":"\u7528\u4f8b\u4ee3\u7801\u8c03\u7528\u903b\u8f91\u4e3e\u4f8b\uff1a # BaseWidget\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n# =============================================\n# TitleWidget\nclass TitleWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_title_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# RightViewWidget\nclass RightViewWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_right_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# =============================================\n# \u51fa\u53e3 DfmWidget\nclass DfmWidget(TitleWidget, RightViewWidget):\npass\n# =============================================\n# in case\nfrom apps.dde_file_manager.widget.dfm_widget import DfmWidget\ndfm = DfmWidget()\ndfm.click_xxx_title_by_ui()\ndfm.click_xxx_right_by_ui()\ndfm.dog.print_desc()\ndfm.ui.print_number()\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u5de5\u7a0b\u6539\u9020\u5b9e\u65bd\u6b65\u9aa4","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_2","title":"1\u3001\u5de5\u7a0b\u4ee3\u7801\u62c9\u53d6","text":"1.1. \u5c06\u81ea\u52a8\u5316\u57fa\u7840\u6846\u67b6\u7684\u529f\u80fd\u62c9\u5230\u672c\u5730 Autotest Basic Frame \uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame 1.2. \u5c06\u5e94\u7528\u5e93\u4ee3\u7801\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u5e94\u7528\u5e93\u7684\u4ed3\u5e93\u547d\u540d\u5e94\u8be5\u662f\u957f\u8fd9\u6837\u7684 autotest_deepin_xxx\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_2","title":"2\u3001\u8c03\u6574\u5de5\u7a0b\u76ee\u5f55","text":"\u6309\u7167 \u65b9\u6848\u8bbe\u8ba1-\u76ee\u5f55\u7ed3\u6784 \u8fdb\u884c\u76ee\u5f55\u8c03\u6574\uff0c\u5c3d\u91cf\u4f7f\u7528\u7f16\u8f91\u5668\u8fdb\u884c\u76f8\u5e94\u7684\u8c03\u6574\uff0c\u7f16\u8f91\u5668\u63a8\u8350\u4f7f\u7528 Pycharm \uff0c\u4ee5\u4e0b\u64cd\u4f5c\u5747\u5728 Pycharm \u91cc\u9762\u53ef\u5b9e\u73b0\u3002 2.1. \u9700\u8981\u79fb\u52a8 py \u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u76f4\u63a5\u5728\u7f16\u8f91\u5668\u91cc\u9762\uff0c\u4f7f\u7528\u9f20\u6807\u9009\u4e2d\u5e76\u6309\u4f4f\uff0c\u4e4b\u540e\u62d6\u52a8\u5230\u76ee\u6807\u4f4d\u7f6e\u5373\u53ef\uff0cPycharm \u4f1a\u5c3d\u53ef\u80fd\u7684\u81ea\u52a8\u89e3\u51b3\u79fb\u52a8\u5bfc\u81f4\u7684\u8def\u5f84\u95ee\u9898\u3002\u6ce8\u610f\uff0c\u6211\u8bf4\u7684\u662f\u201c\u5c3d\u53ef\u80fd\u201d\uff0c\u6709\u4e9b\u9a9a\u64cd\u4f5c\u7f16\u8f91\u5668\u662f\u65e0\u6cd5\u81ea\u52a8\u5904\u7406\u7684\u3002\u5982\u679c\u6ca1\u6709\u88ab\u7f16\u8f91\u5668\u81ea\u52a8\u5904\u7406\u7684\u8def\u5f84\u95ee\u9898\uff0c\u540e\u7eed\u53ea\u80fd\u624b\u52a8\u89e3\u51b3\u3002 2.2. \u9700\u8981\u91cd\u547d\u540d\u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u5728\u7f16\u8f91\u5668\u91cc\u9762\u9009\u4e2d\u6587\u4ef6\uff0c\u7136\u540e\u4f7f\u7528\u5feb\u6377\u952e Shift + F6 \uff08\u5982\u679c\u5feb\u6377\u952e\u6ca1\u53cd\u5e94\uff0c\u6587\u4ef6\u53f3\u952e\u83dc\u5355 Refactor \u2014\u2014 Rename\uff09\uff0c\u7136\u540e\u5728\u8f93\u5165\u6846\u4e2d\u8f93\u5165\u8981\u91cd\u547d\u540d\u7684\u540d\u79f0\uff0c\u540c\u65f6\uff0c\u786e\u8ba4\u52fe\u9009 Search for references \u548c Search in comments and strings \u8fd9\u4e24\u4e2a\u9009\u9879\uff0c\u6700\u540e\u6309\u56de\u8f66\u6216\u8005\u9f20\u6807\u70b9 Refactor \u3002 \u6ce8\u610f\uff0c\u6b64\u65f6\u7f16\u8f91\u5668\u53ef\u80fd\u4f1a\u63d0\u793a\u4f60\uff0c\u4f60\u8fd9\u4e2a\u91cd\u547d\u540d\u7684\u64cd\u4f5c\u5173\u8054\u4e86\u591a\u4e2a\u6a21\u5757\uff0c\u5b83\u88ab\u591a\u4e2a\u5730\u65b9\u90fd\u4f7f\u7528\u5230\u4e86\uff0c\u76f8\u5173\u7684\u6a21\u5757\u662f\u5426\u4e5f\u4e00\u8d77\u6539\u540d\u4e86\uff0c\u8fd9\u4e0d\u5e9f\u8bdd\u5417\uff0c\u7528\u8fd9\u4e2a\u529f\u80fd\u5c31\u662f\u60f3\u628a\u5173\u8054\u5230\u7684\u90fd\u4fee\u6539\uff0c\u4e0d\u7136\u6211\u4e3a\u4ec0\u4e48\u4e0d\u7528\u6587\u7ba1\u7684\u91cd\u547d\u540d\u529f\u80fd\u5462\uff0c\u522b\u60f3\u4e86\uff0c\u76f4\u63a5\u70b9\u5de6\u4e0b\u89d2\u7684 Refactor \u6309\u94ae\uff0c\u5c31\u662f\u5e72\u3002 \u7c7b\u540d\u3001\u51fd\u6570\u540d\u7684\u91cd\u547d\u540d\u90fd\u5c3d\u91cf\u91c7\u7528\u8fd9\u79cd\u65b9\u6848\uff0c\u56e0\u4e3a\u7f16\u8f91\u5668\u4f1a\u81ea\u52a8\u7ed9\u6211\u4eec\u627e\u5230\u5173\u8054\u7684\u5730\u65b9\uff0c\u7136\u540e\u540c\u6b65\u4fee\u6539\u6389\u3002\u4f60\u53ef\u5343\u4e07\u522b\u76f4\u63a5\u5220\u4e86\u4fee\u6539\u540d\u79f0\uff0c\u4e0d\u7136\u4f60\u53ef\u80fd\u4f1a\u82b1\u4e0a\u4e00\u5929\u7684\u65f6\u95f4\u6765\u89e3\u51b3\u91cd\u547d\u540d\u7684\u95ee\u9898\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u5b9e\u73b0\u6838\u5fc3\u5e93\u63a5\u53e3","text":"3.1. BaseWidget \u5728 BaseWidget \u91cc\u9762\u628a\u8be5\u5199\u7684\u90fd\u5199\u597d\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u4e0a\u9762\u7684\u8bbe\u8ba1\u7406\u5ff5\u6765\u5199\u3002 \u5982\u679c\u4f60\u5acc\u9ebb\u70e6\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u6587\u7ba1\u7684\u5b9e\u9645\u5de5\u7a0b\u4ee3\u7801 autotest_dde_file_manager : https://gerrit.uniontech.com/admin/repos/autotest_dde_file_manager \u3002 3.2. \u64cd\u4f5c\u5c42 \u5982\u679c\u4f60\u662f\u65b0\u5199\u9879\u76ee\uff0c\u4f60\u4f1a\u53d1\u73b0\u4e00\u5207\u90fd\u662f\u90a3\u4e48\u7684\u7b80\u5355\u3001\u76f4\u63a5\uff0c\u6309\u7167\u6211\u4eec\u63d0\u4f9b\u7ed9\u4f60\u7684\u63a5\u53e3\u5199\u7528\u4f8b\u7684\u64cd\u4f5c\u65b9\u6cd5\u5c31\u597d\u4e86\u3002 \u5982\u679c\u4f60\u662f\u60f3\u5bf9\u539f\u6765\u7684\u5de5\u7a0b\u8fdb\u884c\u6539\u9020\uff0c\u4f60\u9700\u8981\u6309\u7167\u6838\u5fc3\u5e93\u65b9\u6cd5\u7684\u8c03\u7528\uff0c\u5c06\u4f60\u4e4b\u524d\u5199\u7684\u6bcf\u4e2a\u65b9\u6848\u8fdb\u884c\u5bf9\u5e94\u7684\u4fee\u6539\uff0c\u5305\u62ec\u7c7b\u548c\u65b9\u6cd5\u7684\u547d\u540d\u3001\u65b9\u6cd5\u5185\u6240\u8981\u7528\u5230\u4e0d\u540c\u5b9a\u4f4d\u65b9\u6cd5\u7684\u5199\u6cd5\u4fee\u6539\u3002 \u8fd9\u65f6\u5019\u4f60\u53ef\u80fd\u4f60\u7684\u4ee3\u7801\u4e2d\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u62a5\u9519\uff0c\u4e0d\u7528\u62c5\u5fc3\uff0c\u4f60\u53ef\u4ee5\u4ece\u4e1a\u52a1\u903b\u8f91\u51fa\u53d1\uff0c\u60f3\u6e05\u695a\u8fd9\u4e2a\u65b9\u6cd5\u662f\u5e72\u4ec0\u4e48\u7684\u3001\u64cd\u4f5c\u7684\u5bf9\u8c61\u662f\u4ec0\u4e48\u3001\u53c2\u6570\u662f\u4ec0\u4e48\uff0c\u6ce8\u610f\u8fd9\u4e9b\u4fee\u6539\u662f\u4f1a\u5f71\u54cd\u5230\u7528\u4f8b\u4ee3\u7801\u91cc\u9762\u7684\uff0c\u6ca1\u5173\u7cfb\uff0c\u7528\u4f8b\u91cc\u9762\u672c\u6765\u4e5f\u5e94\u8be5\u88ab\u5173\u8054\u4fee\u6539\u3002 3.3. \u628a\u914d\u7f6e\u6a21\u5757\u5199\u597d\uff0c\u8fd9\u90e8\u5206\u57fa\u672c\u53ef\u4ee5\u590d\u5236\u6587\u7ba1\u7684\u4ee3\u7801\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4_1","title":"4\u3001\u8def\u5f84\u5904\u7406","text":"4.1. \u5bfc\u5165\u8def\u5f84 \u65b9\u6cd5\u548c\u7528\u4f8b\u4e2d\u90fd\u4f1a\u6d89\u53ca\u5230\u5bfc\u5165\u8def\u5f84\u7684\u4fee\u6539\uff0c\u5728\u4fee\u6539\u8def\u5f84\u65f6\uff0c\u5efa\u8bae\u4f60\u4f7f\u7528 Ctrl + Shift + R \u5168\u5c40\u66ff\u6362\uff0c\u4f1a\u5c06\u6574\u4e2a\u9879\u76ee\u4e0b\u7684\u76f8\u540c\u5730\u65b9\u90fd\u4fee\u6539\u5230\uff0c\u5f53\u7136\uff0c\u4f60\u4e5f\u53ef\u4ee5\u5728\u5c0f\u5f39\u7a97\u4e2d\u4fee\u6539\u5168\u5c40\u66ff\u6362\u4e3a\u5c40\u90e8\u76ee\u5f55\u4e0b\u66ff\u6362\u3002\u5904\u7406\u90a3\u79cd\u6ca1\u6709\u5173\u8054\u5173\u7cfb\uff0c\u4f46\u662f\u53c8\u662f\u76f8\u540c\u540d\u79f0\u7684\u91cd\u547d\u540d\uff0c\u6211\u4e5f\u63a8\u8350\u4f7f\u7528\u8fd9\u79cd\u65b9\u5f0f\u8fdb\u884c\u91cd\u547d\u540d\u3002 \u6ce8\u610f\uff0c\u5168\u5c40\u66ff\u6362\u7684\u65b9\u5f0f\u4efb\u7136\u65e0\u6cd5\u4fdd\u8bc1\u771f\u7684\u5168\u5c40\u88ab\u66ff\u6362\u4e86\uff08\u53ef\u80fd\u662f\u7f16\u8f91\u5668\u7684 Bug \u5427\uff09\uff0c\u6240\u4ee5\u4f60\u4ecd\u7136\u9700\u8981\u624b\u52a8\u770b\u4e0b\u5404\u5904\u662f\u5426\u4fee\u6539\u5230\u4f4d\u3002 4.2. \u8d44\u6e90\u8def\u5f84 \u4e00\u4e9b\u7528\u4f8b\u8d44\u6e90\u9700\u8981\u6839\u636e config.py \u91cc\u9762\u7684\u8def\u5f84\u914d\u7f6e\u8fdb\u884c\u8d44\u6e90\u8def\u5f84\u7684\u62fc\u63a5\uff0c\u5982\u679c\u4f60\u539f\u6765\u672c\u6765\u5c31\u6709\u4e00\u4e2a\u51fd\u6570\u4e13\u95e8\u7528\u4e8e\u7ec4\u88c5\u8def\u5f84\u7684\uff0c\u90a3\u4f60\u53ea\u9700\u8981\u4fee\u6539\u8fd9\u4e00\u4e2a\u5730\u65b9\u5c31\u597d\u4e86\uff0c\u5982\u679c\u4f60\u4e4b\u524d\u5e76\u6ca1\u6709\u8fd9\u6837\u7684\u8bbe\u8ba1\uff0c\u90a3\u53ef\u80fd\u9700\u8981\u4fee\u6539\u5927\u91cf\u6d89\u53ca\u5230\u8d44\u6e90\u8def\u5f84\u7684\u5730\u65b9\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5","title":"5\u3001\u8c03\u8bd5\u548c\u7f16\u5199\u7528\u4f8b","text":"\u4ee5\u4e0a\u51e0\u4e2a\u6b65\u9aa4\u505a\u5b8c\uff0c\u57fa\u672c\u5c31\u53ef\u4ee5\u8fdb\u884c\u7528\u4f8b\u4ee3\u7801\u7684\u8c03\u8bd5\u4e86\uff0c\u8fd9\u90e8\u5206\u5de5\u4f5c\u4e3b\u8981\u89e3\u51b3\u4f60\u4e4b\u524d\u51e0\u4e2a\u6b65\u9aa4\u9057\u6f0f\u7684\u95ee\u9898\uff0c\u5982\u679c\u6240\u6709\u7528\u4f8b\u90fd\u8c03\u8bd5\u901a\u8fc7\u4e86\uff0c\u90a3\u4e48\u5de5\u7a0b\u6539\u9020\u5c31\u5168\u90e8\u5b8c\u6210\u4e86\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/","title":"AT \u5f00\u53d1\u89c4\u8303","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u5f00\u53d1\u89c4\u8303\u662f\u6839\u636e\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fd0\u884c\u4e24\u5e74\u591a\u6765\uff0c\u9047\u5230\u95ee\u9898\u89e3\u51b3\u95ee\u9898\u800c\u5f62\u6210\u7684\u4e00\u4e9b\u89e3\u51b3\u65b9\u6848\uff0c\u6216\u8005\u8bf4\u7ecf\u9a8c\u603b\u7ed3\uff1b\u8fd9\u4e9b\u7ecf\u9a8c\u7b26\u5408\u6211\u4eec\u73b0\u9636\u6bb5 AT \u6240\u5e94\u7528\u7684\u573a\u666f\u9700\u8981\uff0c\u4e5f\u662f\u6211\u4eec\u7ecf\u8fc7\u957f\u671f\u601d\u8003\uff0c\u4e0d\u65ad\u8bd5\u9519\u4e0d\u65ad\u4fee\u6b63\uff0c\u5e76\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u5b9e\u8df5\u4e2d\u68c0\u9a8c\u8fc7\u53ef\u884c\u7684\u3002\u4ee5\u6b64\uff0c\u5e0c\u671b\u80fd\u5e2e\u52a9\u53c2\u4e0e\u5230\u81ea\u52a8\u5316\u7684\u76f8\u5173\u4eba\u5458\u51cf\u5c11\u8bd5\u9519\u6210\u672c\uff0c\u66f4\u597d\u3001\u66f4\u5feb\u7684\u7f16\u5199\u7528\u4f8b\u53ca\u7ef4\u62a4\u7528\u4f8b\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_1","title":"\u4e00\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u89c4\u8303","text":"\u6807\u7b7e\u5316\u7ba1\u7406\u6587\u6863\u8bf7\u53c2\u8003\uff1a \u300a\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u64cd\u4f5c\u6307\u5f15\u300b \u4ee5\u4e0b\u8bf4\u51e0\u4e2a\u5bb9\u6613\u51fa\u73b0\u7684\u95ee\u9898\uff1a"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1","title":"1. \u5bf9\u5e94\u5173\u7cfb","text":" \u5199\u5b8c\u81ea\u52a8\u5316\u7528\u4f8b\u4e4b\u540e\uff0c\u8bf7\u5728 CSV \u6587\u4ef6\u4e2d\u6807\u8bb0\u7528\u4f8b\u7684 ID\u3001\u7b49\u7ea7\u3002\u4e3a\u4e86\u63d0\u9192\u6807\u8bb0\uff0c\u6267\u884c\u7528\u4f8b\u65f6\u5728\u9996\u884c\u4f1a\u8f93\u51fa ERROR \u65e5\u5fd7\uff1a CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94\u7684 ID\uff1b \u5728\u6700\u7ec8\u63d0\u4ea4\u4ee3\u7801\u4e4b\u524d\uff0c\u4f60\u9700\u8981\u5728 CSV \u6587\u4ef6\u91cc\u9762\u5c06ID\u3001\u7528\u4f8b\u7b49\u7ea7\u7b49\u6807\u7b7e\u8865\u5168\uff0c\u5982\u679c CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94 ID\uff0c\u540e\u7eed\u5728\u6279\u91cf\u6267\u884c\u7684\u65f6\u5019\uff0c\u8fd9\u4e9b\u7528\u4f8b\u662f\u4e0d\u4f1a\u6267\u884c\u7684\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2","title":"2. \u540d\u79f0\u4e00\u81f4","text":" CSV \u6587\u4ef6\u7684\u6587\u4ef6\u540d\u3001\u7528\u4f8b\u51fd\u6570\u4e2d\u95f4\u7684\u540d\u79f0\u4e00\u81f4\u3001\u7528\u4f8b py \u6587\u4ef6\u4e2d\u95f4\u7684\u540d\u79f0\uff0c\u8fd9\u4e09\u4e2a\u540d\u79f0\u4e00\u81f4\u3002 \u4e3e\u4f8b\uff1a # test_music_001.py\ndef test_music_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u90a3\u4e48 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e3a music.csv\u3002 AT \u6846\u67b6\u5e95\u5c42\u4ee3\u7801\u5b9e\u73b0\u662f\u5c06 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e0e\u7528\u4f8b\u51fd\u6570\u540d\u79f0\u540d\u79f0\uff08item.name\uff09\u8fdb\u884c\u5bf9\u5e94\uff0c\u56e0\u6b64\uff0c\u6ce8\u610f CSV \u6587\u4ef6\u540d\u79f0\u5bf9\u5e94\u7684\u662f\u7528\u4f8b\u51fd\u6570\u540d\u79f0\uff0c\u5373 def test_music_001 \u91cc\u9762\u7684 music \uff0c\u800c\u4e0d\u662f test_music_001.py \u91cc\u9762\u7684 music \u3002 \u8fd9\u91cc\u7ec6\u7ec6\u54c1\u4e00\u4e0b\u54c8~ \u5982\u679c\u4f60\u5c06\u4e0a\u4f8b\u5199\u6210\u4e86\u8fd9\u6837: # test_music_001.py\ndef test_movie_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u7528\u4f8b\u6267\u884c\u6ca1\u95ee\u9898\uff0c\u4f46\u662f\u6807\u7b7e\u5316\u7ba1\u7406\u662f\u4e0d\u751f\u6548\u7684\uff0c\u6846\u67b6\u65e0\u6cd5\u5c06 music.csv\u6587\u4ef6\u91cc\u9762\u6807\u7b7e\uff0c\u6dfb\u52a0\u5230 test_movie_001\u8fd9\u4e2a\u7528\u4f8b\u4e2d\uff0c\u56e0\u4e3a\u4ed6\u4eec\u6ca1\u6709\u5bf9\u5e94\u5173\u7cfb\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#tag","title":"\u4e8c\u3001\u5206\u652f\u53ca tag \u7ba1\u7406\u89c4\u8303","text":"\u53c2\u8003\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u4ee3\u7801\u7ba1\u7406\u89c4\u8303\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2-tag","title":"2. \u5e94\u7528\u5e93 tag","text":" \u5e94\u7528\u5e93 tag \u6839\u636e\u5e94\u7528\u4ea4\u4ed8\u8282\u70b9\u751f\u6210\uff0c\u6bcf\u6b21\u6253 tag \u4e4b\u524d\uff0c\u76f8\u5173\u6d4b\u8bd5\u4eba\u5458\u9700\u8981\u8fdb\u884c\u7528\u4f8b\u8c03\u8bd5\uff1b \u8c03\u8bd5\u7528\u4f8b\u662f\u6307\u7684\u5728\u5168\u67b6\u6784\uff08x86\u3001arm\u3001mips\uff09\u4e0a\u8c03\u8bd5\u901a\u8fc7\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\u8fbe\u5230 90% \u4ee5\u4e0a\u624d\u80fd\u6253 tag\uff0c\u901a\u8fc7 Jenkins \u6267\u884c\u5668\u6267\u884c\u7528\u4f8b\uff0c\u4fdd\u7559\u901a\u8fc7\u7387\u7ed3\u679c\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\uff1a\u901a\u8fc7\u7528\u4f8b\u6570 / (\u603b\u7528\u4f8b\u6570 - \u5df2\u5e9f\u5f03\u7528\u4f8b) \u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u7b97\u901a\u8fc7 Jenkins \u6267\u884c\u5668 \u4f60\u53ef\u80fd\u4f1a\u5728\u4e00\u4e2a\u4ea4\u4ed8\u5468\u671f\u5185\u6301\u7eed\u7684\u8fdb\u884cAT\u7528\u4f8b\u8c03\u8bd5\uff0c\u4f46\u662f\u6700\u7ec8 AT \u7528\u4f8b\u6253 tag \u7684\u5e94\u7528\u7248\u672c\uff0c\u9700\u8981\u4f7f\u7528\u5e94\u7528\u96c6\u6210\u4ea4\u4ed8\u7684\u6700\u65b0\u5e94\u7528\u7248\u672c\uff0c\u53ef\u4ee5\u4f7f\u7528\u5e94\u7528\u7684\u63d0\u6d4b\u7248\u672c\uff1b\u4e00\u5b9a\u8981\u786e\u4fdd\u8c03\u8bd5\u7528\u4f8b\u7684\u5e94\u7528\u7248\u672c\u662f\u6700\u65b0\u7684\uff0c\u4e0d\u7136\u96c6\u6210\u8fdb\u53bb\u4e4b\u540e\uff0c\u6301\u7eed\u96c6\u6210\u5c31\u4f1a\u51fa\u95ee\u9898\uff1b tag \u53f7\u600e\u4e48\u6253\uff1f \u6839\u636e\u6301\u7eed\u96c6\u6210\u7684\u8981\u6c42\u751f\u6210\uff0c\u5176\u4e2d\u5e94\u7528\u7248\u672c\u53f7\u9700\u8981\u4e0e\u9879\u76ee\u7ecf\u7406\u786e\u8ba4\u672c\u6b21\u5373\u5c06\u96c6\u6210\u7684\u5e94\u7528\u7248\u672c\u53f7\u662f\u591a\u5c11\uff1b tag \u7684 commit \u4fe1\u606f\u683c\u5f0f\uff1a # commit msg\nversion:5.6.5\n \u5176\u4e2d 5.6.5 \u5199\u5e94\u7528\u7684\u96c6\u6210\u7248\u672c\u53f7\u3002 \u751f\u6210 tag \u7684\u547d\u4ee4\u53c2\u8003\uff1a\u300aGit \u6807\u7b7e\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3-tag","title":"3. \u57fa\u7840\u6846\u67b6 tag","text":"\u57fa\u7840\u6846\u67b6 tag \u4e0d\u4e0e\u4e1a\u52a1\u6302\u94a9\uff0c\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u6309\u9700\u53d1\u5e03\u7248\u672c\uff0c\u5728\u6839\u76ee\u5f55\u4e0b CURRENT \u6587\u4ef6\u4e2d\u8bb0\u5f55\u7684\u5f53\u524d\u7248\u672c\u53f7\u548c\u5386\u53f2\u7248\u672c\u53f7\uff0c\u53ca\u5176\u5bf9\u5e94\u65b0\u589e\u4e86\u54ea\u4e9b\u529f\u80fd\uff0c\u6709\u52a9\u4e8e\u5e94\u7528\u9009\u62e9\u5408\u9002\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\u3002 # CURRENT\n[current]\ntag = 0.9.5\n \u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u7684 control \u6587\u4ef6\u8bb0\u5f55\u5f53\u524d\u5e94\u7528\u5e93\u4f9d\u8d56\u7684\u57fa\u7840\u5e93\u7248\u672c\u3002 # control\n[Depends]\nautotest-basic-frame = 0.9.5\n \u7528\u4f8b\u5728\u6267\u884c\u65f6\u4f1a\u6821\u9a8c\u4e24\u4e2a\u6587\u4ef6\u7684\u7248\u672c\u53f7\u662f\u5426\u4e00\u81f4\uff0c\u5982\u679c\u4e0d\u4e00\u81f4\uff0c\u4f1a\u6253\u5370 error \u65e5\u5fd7\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_2","title":"\u4e09\u3001\u4ed3\u5e93\u6743\u9650\u7ba1\u7406","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_1","title":"1. \u57fa\u7840\u6846\u67b6","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u4ed3\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame \u57fa\u7840\u6846\u67b6\u4e0d\u5141\u8bb8\u533f\u540d\u8bbf\u95ee\uff0c\u5982\u679c\u4f60\u767b\u5f55 gerrit \u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u8bbf\u95ee\u4ee5\u4e0a\u94fe\u63a5\uff0c\u5219\u9700\u8981\u7533\u8bf7\u8bbf\u95ee\u6743\u9650\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_1","title":"2. \u5e94\u7528\u4ed3\u5e93","text":" \u81ea\u52a8\u5316\u5e94\u7528\u4ed3\u5e93\uff1a https://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684 app_name \u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_3","title":"\u56db\u3001\u65b9\u6cd5\u7f16\u5199&\u8c03\u7528\u89c4\u8303","text":"\u65b9\u6cd5\u7f16\u5199\u6574\u4f53\u8bbe\u8ba1\u601d\u8def\u53c2\u8003\uff1a[\u300aAT\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b]"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_2","title":"1. \u65b9\u6cd5\u7f16\u5199","text":"\u5199\u65b9\u6cd5\u7684\u65f6\u5019\u6ce8\u610f\u65b9\u6cd5\u5f52\u5c5e\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget\uff0c\u65b9\u6cd5\u662f\u5728\u54ea\u4e2a\u533a\u57df\u64cd\u4f5c\u7684\uff0c\u5c31\u5199\u5728\u54ea\u4e2a\u7c7b\u91cc\u9762\u3002 \u4e3e\u4f8b\uff1a from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n\"\"\"\u70b9\u51fb\u6807\u9898\u680fxxx\"\"\"\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_2","title":"2. \u65b9\u6cd5\u8c03\u7528","text":" \u5728\u7528\u4f8b\u4e2d\u8c03\u7528\u65b9\u6cd5\uff0c\u901a\u8fc7\u8be5\u5e94\u7528\u552f\u4e00\u7684\u51fa\u53e3\u8fdb\u884c\u8c03\u7528\uff0c\u6bd4\u5982\u6587\u7ba1\uff1a class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n \u4e0d\u8981\u5728\u7528\u4f8b\u4e2d\u5355\u72ec\u53bb\u8c03\u7528 TitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u8fd9\u4e9b\u7c7b\uff0c\u5426\u5219\u540e\u671f\u7528\u4f8b\u4f1a\u53d8\u5f97\u4e0d\u597d\u7ef4\u62a4\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_4","title":"\u4e94\u3001\u7528\u4f8b\u7f16\u5199\u89c4\u8303","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_3","title":"1. \u57fa\u4e8e\u7c7b\u5199\u7528\u4f8b","text":"\u6240\u6709\u7528\u4f8b\u90fd\u5e94\u8be5\u57fa\u4e8e\u7c7b\u53bb\u5199\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001(self):\n\"\"\"\u97f3\u4e50\u542f\u52a8\"\"\"\n \u6ce8\u610f\u4ee5\u4e0b\u51e0\u70b9\uff1a \u7c7b\u540d\u4e0d\u8981\u968f\u4fbf\u53d6\uff0c\u540c\u4e00\u4e2a\u5e94\u7528\u5e94\u8be5\u4f7f\u7528\u540c\u4e00\u4e2a\u7c7b\u540d\uff0c\u7528\u4f8b\u7c7b\u540d\u79f0\u5fc5\u987b\u4ee5 Test \u5f00\u5934\uff0c\u9075\u5faa\u5927\u9a7c\u5cf0\u547d\u540d\u89c4\u8303\uff1b \u7528\u4f8b\u7c7b\u7ee7\u627f BaseCase\uff0c\u4e00\u4e2a\u5e94\u7528\u53ea\u6709\u4e00\u4e2a BaseCase \u4e00\u4e2a py \u6587\u4ef6\u91cc\u9762\u53ea\u6709\u4e00\u4e2a\u7c7b\uff0c\u6211\u4eec\u79f0\u4e3a\u4e00\u4e2a\u6d4b\u8bd5\u7c7b\uff1b \u4e00\u4e2a\u7c7b\u91cc\u9762\u53ef\u4ee5\u6709\u591a\u4e2a\u7528\u4f8b\u51fd\u6570\uff0c\u8fd9\u53d6\u51b3\u8fd9\u6761\u7528\u4f8b\u6709\u591a\u5c11\u4e2a\u6d4b\u8bd5\u70b9\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001_1(self):\n\"\"\"\u4efb\u52a1\u680f\u542f\u52a8\u97f3\u4e50\"\"\"\ndef test_music_001_2(self):\n\"\"\"\u542f\u52a8\u5668\u542f\u52a8\u97f3\u4e50\"\"\" \ndef test_music_001_3(self):\n\"\"\"\u684c\u9762\u542f\u52a8\u97f3\u4e50\"\"\"\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_3","title":"2. \u7528\u4f8b\u51fd\u6570\u89c4\u8303","text":" \u7528\u4f8b\u51fd\u6570\u4ee5 test \u5f00\u5934\uff0c\u9075\u5faa\u86c7\u5f62\u547d\u540d\u89c4\u8303\uff0c\u4e2d\u95f4\u4e3a\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0\uff0c\u540e\u9762\u52a0\u7528\u4f8b ID\uff0c\u6700\u540e\u52a0\u6d4b\u8bd5\u70b9\u5e8f\u53f7\uff0c\u5373 test_${module}_${case_id}[_${index}] \uff1b \u6bd4\u5982\uff1atest_music_001_1\uff0cindex \u4ece 1 \u5f00\u59cb\u3002 \u51fd\u6570\u529f\u80fd\u8bf4\u660e\u91cc\u9762\u5199\u7528\u4f8b\u6807\u9898\uff0c\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u6807\u9898\u5373\u53ef\uff0c\u6ce8\u610f\u7528\u4e09\u5bf9\u53cc\u5f15\u53f7\uff0c\u4e0d\u8981\u7528\u5176\u4ed6\u6ce8\u91ca\uff0c\u66f4\u4e0d\u8981\u7528\u4e95\u53f7\u6ce8\u91ca\u5199\u7528\u4f8b\u6807\u9898\uff1b \u76f4\u63a5\u590d\u5236 PMS \u7528\u4f8b \u7528\u4f8b\u6b65\u9aa4\u76f4\u63a5\u5c06 PMS \u4e0a\u7528\u4f8b\u6b65\u9aa4\u548c\u9884\u671f\u590d\u5236\u8fdb\u6765\uff0c\u7136\u540e\u8fdb\u884c\u6279\u91cf\u6ce8\u91ca\uff08ctrl + /\uff09\uff0c\u5728\u6ce8\u91ca\u7684\u57fa\u7840\u4e0a\u53bb\u5199\u7528\u4f8b\u811a\u672c\u4f1a\u66f4\u52a0\u65b9\u4fbf\u5168\u9762\uff0c\u4e5f\u6bd4\u4f60\u81ea\u5df1\u5199\u6ce8\u91ca\u66f4\u8282\u7ea6\u65f6\u95f4\uff1a \u4e3e\u4f8b\uff0cPMS \u7528\u4f8b\uff1a \u76f4\u63a5\u9009\u4e2d\u7528\u4f8b\u5185\u5bb9\uff0c\u590d\u5236\u4e0b\u6765\uff0c\u7136\u540e\u7c98\u8d34\u5230\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c\u4e2d\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\n \u4e0a\u4f8b\u4e2d\u4e95\u53f7\u6ce8\u91ca\u90e8\u5206\u5c31\u662f\u76f4\u63a5\u4ece PMS \u4e0a\u590d\u5236\u8fc7\u6765\u7684\uff0c\u5728\u6b64\u57fa\u7840\u4e0a\u5199\u7528\u4f8b\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\nmusic = DeepinMusicWidget()\nmusic.click_singer_btn_in_music_by_ui()\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\nmusic.click_icon_mode_in_music_by_ui()\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\nmusic.double_click_first_singer_in_singer_icon_view_by_ui()\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\nself.assert_xxx\n \u4f60\u770b\uff0c\u975e\u5e38\u6e05\u695a\u6bcf\u4e00\u6b65\u5728\u505a\u4ec0\u4e48\uff0c\u91cd\u70b9\u662f\u7701\u53bb\u4e86\u5199\u6ce8\u91ca\u7684\u65f6\u95f4\uff0c\u771f\u7684\u7092\u9e21\u65b9\u4fbf\u3002 \u4e0d\u5199 if __name__ == '__main__':\uff0c\u4e0d\u5199\u591a\u4f59\u7684\u4ee3\u7801\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3","title":"3. \u6570\u636e\u9a71\u52a8","text":" \u5982\u679c\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u662f\u76f8\u540c\u7684\uff0c\u53ea\u662f\u4e00\u4e9b\u53c2\u6570\u53d8\u5316\uff0c\u5c3d\u91cf\u4f7f\u7528\u6570\u636e\u9a71\u52a8\u6765\u5b9e\u73b0\u7528\u4f8b\uff1b \u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u6570\u636e\u9a71\u52a8\u7684\u6570\u636e\uff0c\u4e0d\u80fd\u56e0\u6b64\u5f15\u5165\u4f9d\u8d56\uff0c\u5c3d\u91cf\u4f7f\u7528\u4e00\u4e9b\u6807\u51c6\u5e93\u80fd\u8bfb\u53d6\u7684\u6587\u4ef6\u683c\u5f0f\uff0c\u6bd4\u5982 json\u3001ini\u3001CSV\u3001xml\u3001txt \u7b49\u6587\u4ef6\u683c\u5f0f\uff1b\u4e0d\u5efa\u8bae\u4f7f\u7528 Yaml\u3001Excel\u3001MySQL \u7b49\u6570\u636e\u683c\u5f0f\uff1b \u8bfb\u53d6\u6570\u636e\u65f6\u4e5f\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff0c\u5982\u4f7f\u7528 pandas \u5904\u7406 CSV \u5c31\u5c5e\u4e8e\u5927\u6750\u5c0f\u7528\u4e86\uff0c\u6b63\u5e38\u7684\u6570\u636e\u9a71\u52a8\u8fd8\u6ca1\u5230\u9700\u8981\u5927\u6570\u636e\u5206\u6790\u6765\u5904\u7406\u7684\u5730\u6b65\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u5728 widget/ddt/ \u76ee\u5f55\u4e0b\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5199\u6cd5\uff1a @pytest.mark.parametrize(\"value\", data)\ndef test_smb_049(self, value):\n \u4ee5\u4e0a\u8fd9\u79cd\u53c2\u6570\u5316\u7684\u5199\u6cd5\u672c\u8eab\u6ca1\u4ec0\u4e48\u95ee\u9898\uff0c\u4f46\u662f\uff0c\u8fd9\u91cc\u5fc5\u987b\u8981\u8865\u5145\u4e00\u4e2a\u6ca1\u6709\u7528\u7684\u5c0f\u77e5\u8bc6\uff1a \u5982\u679c\u53c2\u6570\u5316\u6570\u636e\u91cc\u9762\u7684\u5b57\u7b26\u4f1a\u539f\u5c01\u4e0d\u52a8\u7684\u8f93\u51fa\u5230 item.name \u91cc\u9762\uff0c\u663e\u793a\u975e\u5e38\u4e0d\u4f18\u96c5\uff0c\u800c\u4e14\u53ef\u4ee5\u4f1a\u5f15\u5165\u4e00\u4e9b\u610f\u60f3\u4e0d\u5230\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u611f\u53d7\u4e00\u4e0b\uff1a \u53c2\u6570\uff1a data = [\n\"\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\", \"qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678\",\n]\n \u73b0\u8c61\u662f\u8fd9\u6837\u8272\u513f\u7684\uff1a test_smb_049.py::TestFileManager::test_smb_049[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09]\ntest_smb_049.py::TestFileManager::test_smb_049[qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui]\ntest_smb_049.py::TestFileManager::test_smb_049[12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678]\n \u8bf4\u5b9e\u8bdd\uff0c\u770b\u7740\u5fc3\u91cc\u5835\u5f97\u614c\uff0c\u5982\u679c\u8fd9\u91cc\u9762\u5305\u542b\u4e00\u4e9b\u7279\u6b8a\u5b57\u7b26\u6216\u8005\u662f\u8d85\u957f\uff0c\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u5f88\u5947\u5999\u7684\u4e8b\u60c5\u53d1\u751f\u3002 parametrize \u91cc\u9762\u6709\u4e2a\u53c2\u6570\uff1aids\uff0c\u53ef\u4ee5\u89e3\u51b3\u6b64\u7c7b\u95ee\u9898\uff0c\u5c31\u50cf\u8fd9\u6837\uff1a @pytest.mark.parametrize(\"value\", data, ids=[1, 2, 3])\ndef test_smb_049(self, value):\n \u518d\u6765\u611f\u53d7\u4e00\u4e0b\uff1a test_smb_049.py::TestFileManager::test_smb_049[1]\ntest_smb_049.py::TestFileManager::test_smb_049[2]\ntest_smb_049.py::TestFileManager::test_smb_049[3]\n \u660e\u663e\u597d\u591a\u4e86\uff0c\u6240\u4ee5\u5c3d\u91cf\u4f7f\u7528 ids \u8fd9\u4e2a\u53c2\u6570\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 fixture \u7684\u6570\u636e\u9a71\u52a8\u65b9\u5f0f\uff0c\u6846\u67b6\u867d\u7136\u652f\u6301\uff0c\u4f46\u53ef\u8bfb\u6027\u6bd4\u8f83\u5dee\uff1b\u5982\u679c\u4f60\u4e0d\u77e5\u9053\u8fd9\u53e5\u8bdd\u5728\u8bf4\u5565\uff0c\u90a3\u4f60\u53ef\u4ee5\u5ffd\u7565\uff0c\u6211\u4e5f\u4e0d\u6253\u7b97\u8be6\u7ec6\u8bf4\u8fd9\u79cd\u5b9e\u73b0\u65b9\u5f0f\uff0c\u64cd\u4f5c\u6bd4\u8f83\u9a9a\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4","title":"4. \u65ad\u8a00\u8d44\u6e90","text":" \u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u76f4\u63a5\u653e\u5728\u7528\u4f8b\u6a21\u5757\u7684\u540c\u7ea7\u76ee\u5f55\u4e0b\u7684 assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0 + \u7528\u4f8b ID \u547d\u540d\uff1b \u56fe\u50cf\u8bc6\u522b\u65ad\u8a00\uff0c\u4e0d\u8981\u622a\u53d6\u4e00\u5f20\u5f88\u5927\u7684\u56fe\uff0c\u56fe\u7247\u8d44\u6e90\u5305\u542b\u7684\u5143\u7d20\u592a\u591a\u4e86\uff0c\u975e\u5e38\u5bb9\u6613\u53d7\u5230\u9700\u6c42\u5f71\u54cd\uff0c\u5efa\u8bae\u662f\u8fdb\u884c\u5c40\u90e8\u7684\u65ad\u8a00\uff1b \u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u5339\u914d\u5ea6\u662f 0.9\uff0c\u5982\u679c\u65ad\u8a00\u7684\u573a\u666f\u5bf9\u4e8e\u7cbe\u786e\u5ea6\u8981\u6c42\u6ca1\u90a3\u4e48\u9ad8\uff0c\u53ef\u4ee5\u5728\u65ad\u8a00\u8bed\u53e5\u91cc\u9762\u4f20\u5165\u5c0f\u4e8e 0.9 \u7684\u53c2\u6570\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5","title":"5. \u5143\u7d20\u5b9a\u4f4d","text":" \u7528\u4e8e\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u4e2d\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u547d\u540d\u4e3a\u8be5\u5143\u7d20\u7684\u540d\u79f0\uff1b \u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u622a\u53d6\u65f6\u5c3d\u91cf\u7cbe\u786e\u5230\u8fd9\u4e2a\u5177\u4f53\u7684\u6309\u94ae\uff0c\u56fe\u7247\u4e5f\u4e0d\u8981\u592a\u5927\uff1b \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u64cd\u4f5c\u8f83\u5feb\uff0c\u5408\u7406\u52a0\u5165\u7b49\u5f85\u65f6\u95f4\u80fd\u63d0\u9ad8\u7528\u4f8b\u7684\u7a33\u5b9a\u6027\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6","title":"6. \u7528\u4f8b\u8d44\u6e90","text":" \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u4f7f\u7528\u5230\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u6bd4\u5982\u97f3\u4e50\u53ef\u80fd\u9700\u8981\u4e00\u4e9b mp3 \u7684\u8d44\u6e90\u7528\u4e8e\u6d4b\u8bd5\uff0c\u5b58\u653e\u5728 widget/case_res \u76ee\u5f55\u4e0b\uff0c\u524d\u63d0\u662f\u8fd9\u4e9b\u8d44\u6e90\u4e0d\u8d85\u8fc7 10M\uff1b \u5982\u679c\u662f\u4e00\u4e9b\u6bd4\u8f83\u5927\u7684\u8d44\u6e90\uff0c\u5efa\u8bae\u653e\u5230\u7edf\u4e00\u7684 ftp \u670d\u52a1\u5668 \uff08ftp://10.8.10.245\uff09\uff0c\u9700\u8981\u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\u518d\u4e0b\u8f7d\u4e0b\u6765\uff1b f\"wget ftp://{Config.FTP_IP}/uploads/\u591a\u5a92\u4f53/\u5f71\u9662/auto/{file_name};unzip {file_name};rm -rf {file_name};\"\n \u6d4b\u8bd5\u8d44\u6e90\u4e0b\u8f7d\u5230\u5e94\u7528 widget/case_res \u76ee\u5f55\u4e0b\uff1b \u7981\u6b62\u5c06\u6d4b\u8bd5\u8d44\u6e90\u5b58\u653e\u5728\u4e2a\u4eba\u7684\u673a\u5668\u4e0a\uff1b \u5e94\u8be5\u5c3d\u91cf\u4fdd\u8bc1\uff0c\u4e00\u4e2a\u8d44\u6e90\u5728\u4e00\u6b21\u7528\u4f8b\u6267\u884c\u4e2d\u53ea\u9700\u8981\u4e0b\u8f7d\u4e00\u6b21\uff0c\u6240\u4ee5\u4f60\u4e0d\u80fd\u6bcf\u6b21\u4f7f\u7528\u7684\u65f6\u5019\u90fd\u53bb\u4e0b\u8f7d\uff0c\u8fd9\u6837\u53ef\u80fd\u4f1a\u8017\u8d39\u5927\u91cf\u7684\u7f51\u7edc\u8d44\u6e90\uff0c\u800c\u56e0\u4e3a\u5148\u5224\u65ad\u672c\u5730\u662f\u5426\u5b58\u5728\u6b64\u8d44\u6e90\uff0c\u5982\u679c\u4e0d\u5b58\u5728\u518d\u53bb\u4e0b\u8f7d\uff1b \u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u5c06\u8d44\u6e90\u62f7\u8d1d\u5230\u5bf9\u5e94\u7684\u6d4b\u8bd5\u76ee\u5f55\u4e0b\uff0c\u6bd4\u5982\u5c06 mp3 \u6587\u4ef6\u62f7\u8d1d\u5230 ~/Music \u76ee\u5f55\u4e0b\uff0c\u4f46\u662f\u6211\u4eec\u66f4\u5efa\u8bae\u4f60\u4f7f\u7528\u53d1\u9001\u5feb\u6377\u94fe\u63a5\u7684\u65b9\u5f0f\u66ff\u4ee3\u62f7\u8d1d\u7684\u64cd\u4f5c\uff0c\u56e0\u4e3a\u5728\u62f7\u8d1d\u5927\u6587\u4ef6\u65f6\u662f\u5f88\u6d88\u8017\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u800c\u521b\u5efa\u94fe\u63a5\u5219\u4e0d\u4f1a\uff1b @classmethod\ndef recovery_many_movies_in_movie_by_cmd(cls):\n\"\"\"\u6062\u590d\u591a\u4e2a\u89c6\u9891\u6587\u4ef6\u81f3\u89c6\u9891\u76ee\u5f55\u4e2d\"\"\"\nwork_path = f\"/home/{Config.USERNAME}/Videos/auto\"\ncode_path = f\"{Config.CASE_RES_PATH}/auto\"\ncls.run_cmd(f\"rm -rf {work_path};mkdir {work_path}\")\nsleep(1)\nflag = False\nif not exists(code_path):\ncls.run_cmd(f\"mkdir -p {code_path}\")\nflag = True\nlogger.info(f\"ln -s {code_path}/* {work_path}/\")\ncls.run_cmd(\nf\"cd {code_path}/;\"\nf\"{cls.wget_file('auto.zip') if flag else ''}\"\nf\"ln -s {code_path}/* {work_path}/ > /dev/null 2>&1\"\n)\n \u8d44\u6e90\u4e0b\u8f7d\u8fc7\u7a0b\u4e2d\u6ce8\u610f\u8d85\u65f6\u7684\u95ee\u9898\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u5f88\u5927\uff0c\u8981\u7279\u522b\u6ce8\u610f\u8fd9\u95ee\u9898\uff0c\u5982\u679c\u4f60\u4f7f\u7528\u5f3a\u5236\u7b49\u5f85\u4e0b\u8f7d\u7ed3\u675f( os.system )\uff0c\u53ef\u80fd\u4f1a\u9020\u6210\u7528\u4f8b\u6267\u884c\u65f6\u957f\u53d8\u5f97\u4e0d\u53ef\u63a5\u53d7\uff0c\u76ee\u524d\u6211\u4eec\u53d1\u73b0\u5728\u6301\u7eed\u96c6\u6210\u73af\u5883\u6267\u884c\u65f6\u7f51\u7edc\u4e0b\u8f7d\u901f\u5ea6\u5f88\u6162\uff0c\u6240\u4ee5\u8d85\u65f6\u673a\u5236\u662f\u5f88\u6709\u5fc5\u8981\u7684\uff1brun_cmd \u65b9\u6cd5\u6709\u4e00\u4e2a\u9ed8\u8ba4\u8d85\u65f6\u7684\u65f6\u95f4\uff0c\u4f60\u53ef\u4ee5\u6839\u636e\u8d44\u6e90\u5927\u5c0f\u5bf9\u8d85\u65f6\u65f6\u95f4\u8fdb\u884c\u8c03\u6574\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_5","title":"\u516d\u3001\u7528\u4f8b\u8c03\u8bd5\u6280\u5de7","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_4","title":"1. \u65e5\u5fd7","text":" \u4e00\u5b9a\u8981\u5148\u770b\u62a5\u9519\uff0c\u770b error \u65e5\u5fd7\uff0c\u901a\u5e38\u80fd\u660e\u786e\u7684\u544a\u8bc9\u4f60\u5177\u4f53\u54ea\u91cc\u4ee3\u7801\u62a5\u9519\uff1b \u7ed3\u5408\u62a5\u9519\u70b9\u524d\u9762\u7684error\u3001 info \u548c debug \u65e5\u5fd7\u770b\u5426\u662f\u6b63\u5e38\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_4","title":"2. \u65ad\u70b9\u8c03\u8bd5","text":" \u65b9\u6cd5\u62a5\u9519\uff1a \u5728\u65b9\u6cd5\u5e93\u4e2d\u627e\u5230\u5bf9\u5e94\u7684\u65b9\u6cd5\uff0c\u5355\u72ec\u8c03\u7528\uff0c\u770b\u662f\u5426\u80fd\u6b63\u5e38\u6267\u884c\uff1b \u901a\u5e38\u5355\u4e2a\u65b9\u6cd5\u7684\u6267\u884c\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u62a5\u9519\uff0c\u5f88\u5feb\u5c31\u80fd\u6392\u67e5\u51fa\u95ee\u9898\uff1b\u5728\u65b9\u6cd5\u5185\u90e8\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u65b9\u6cd5\u5185\u90e8\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u8c03\u7528\u6ca1\u95ee\u9898\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u62a5\u9519\u7684\u65b9\u6cd5\u524d\u9762\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u7528\u4f8b\u7684\u4e1a\u52a1\u903b\u8f91\u548c\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u65ad\u8a00\u62a5\u9519\uff1a \u65ad\u8a00\u4e3a\u6570\u636e\u65ad\u8a00\uff0c\u6839\u636e\u8868\u8fbe\u5f0f\u8fdb\u884c\u65ad\u8a00\u8bed\u53e5\u8fdb\u884c\u4fee\u6539\uff1b \u6587\u4ef6\u751f\u6210\u7c7b\u65ad\u8a00\uff0c\u67e5\u770b\u662f\u5426\u9700\u8981\u52a0\u7b49\u5f85\u65f6\u95f4\uff1b \u56fe\u50cf\u65ad\u8a00\uff0c\u5728\u65ad\u8a00\u8bed\u53e5\u5904\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u7528\u4f8b\u8fd0\u884c\u5230\u65ad\u8a00\u5904\u4f1a\u505c\u6b62\uff0c\u67e5\u770b\u6b64\u65f6\u65ad\u8a00\u7684\u56fe\u7247\u4e0e\u7528\u4f8b\u6267\u884c\u7684\u73b0\u573a\u5b58\u5728\u4ec0\u4e48\u5dee\u5f02\uff0c\u6b64\u65f6\u4e5f\u53ef\u4ee5\u8fdb\u884c\u91cd\u65b0\u622a\u56fe\uff0c\u4ece\u800c\u66ff\u6362\u65b0\u7684\u56fe\u7247\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3_1","title":"3. \u8fdc\u7a0b\u6267\u884c","text":" \u8fdc\u7a0b\u6267\u884c\u6307\u7684\u662f\u7f16\u8f91\u5668\u901a\u8fc7\u6307\u5b9a\u8fdc\u7a0b\u89e3\u91ca\u5668\u6267\u884c\u81ea\u52a8\u5316\u4ee3\u7801\uff1b \u8fdc\u7a0b\u6267\u884c\u7684\u597d\u5904\u662f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u7684 Debug \u8fd0\u884c\uff0c\u4e0d\u7528\u5728\u6d4b\u8bd5\u673a\u4e0a\u6253\u5f00\u7f16\u8f91\u5668\uff0c\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u66f4\u5feb\uff1b \u652f\u6301\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u7684\u7f16\u8f91\u5668\uff1a \u4e13\u4e1a\u7248 Pycharm VScode \uff0c\u9700\u8981\u4f7f\u7528\u63d2\u4ef6 Remote-SSH \u8fdc\u7a0b\u6267\u884c\u914d\u7f6e \u4ee5 Pycharm \u4e3a\u4f8b\uff1a File \u2014> Settings \u2014> Project \u2014> Python Interpreter \u2014> \u53f3\u8fb9\u8bbe\u7f6e\u6309\u94ae \u2014> Add... \u2014> SSH Interpreter \u2014> New server configuration(\u586b\u5165host\u548cusername) \u2014> Next \u2014> password\uff08\u6d4b\u8bd5\u673a\u5bc6\u7801\uff09 \u2014> Interpreter(\u9009\u62e9\u8fdc\u7a0b\u89e3\u91ca\u5668) \u2014> Finish "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4_1","title":"4. \u73af\u5883\u6e05\u7406","text":" \u5982\u679c\u7528\u4f8b\u91cc\u9762\u7684 teardown \u6ca1\u6709\u6267\u884c\uff0c\u5927\u6982\u7387\u662f\u56e0\u4e3a setup \u91cc\u9762\u4ee3\u7801\u62a5\u9519\uff0c\u8fd9\u4e24\u4e2a\u662f\u4e00\u5bf9\u7684\uff0csetup \u91cc\u9762\u62a5\u9519\uff0cteardown \u91cc\u9762\u7684\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\uff1b \u76ee\u524d\u6211\u4eec\u5df2\u7ecf\u5c06\u5404\u5e94\u7528\u7684 clean_all \u8fd9\u4e2a fixture \u6539\u6210\u4e86\u7ec8\u7ed3\u5668\uff0c\u786e\u4fdd\u59cb\u7ec8\u80fd\u6267\u884c\u5230\u8fd9\u6b65\uff0c\u4f46\u662f\u7528\u4f8b\u91cc\u9762\u7684 fixture\uff0c\u8fd8\u662f\u9700\u8981\u6211\u4eec\u5c0f\u5fc3\u5904\u7406\uff1b \u8981\u6267\u884c clean_all \u9700\u8981\u5728\u7f16\u8f91\u5668\u8fd0\u884c\u53c2\u6570\u52a0 --clean yes\uff0c\u5199\u7528\u4f8b\u7684\u65f6\u5019\u8bf7\u52a0\u4e0a\uff0c\u4e0d\u7136\u4f60\u4e0d\u786e\u5b9a\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u7684\u73af\u5883\u662f\u5426\u6062\u590d\uff1b setup \u53ef\u4ee5\u4e0d\u8981\uff0c\u5c06 setup \u653e\u5230\u7528\u4f8b\u91cc\u9762\u662f\u4e00\u79cd\u7a33\u59a5\u7684\u505a\u6cd5\uff0cteardown \u4e00\u5b9a\u8981\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5_1","title":"5. \u5143\u7d20\u5b9a\u4f4d\u4e0d\u51c6\uff08\u5750\u6807\u8fd4\u56de\u4e0d\u5bf9\uff09","text":" \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u53ef\u80fd\u53d7\u5230\u7a97\u53e3 ID \u7684\u53d8\u5316\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u9ed8\u8ba4\u53d6\u6700\u65b0\u7684\u4e00\u4e2a\u7a97\u53e3\u7528\u4e8e\u5b9a\u4f4d\uff0c\u4f46\u5982\u679c\u5b9e\u9645\u9700\u8981\u5b9a\u4f4d\u7684\u4e0d\u662f\u6700\u65b0\u7684\u7a97\u53e3\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u91cd\u65b0\u5b9e\u4f8b\u5316\u65b9\u6cd5\u7c7b\u5bf9\u8c61\uff0c\u5e76\u5728\u7c7b\u4e2d\u4f20\u5165\u5bf9\u5e94\u7684\u7a97\u53e3\u5e8f\u53f7\uff1b \u57fa\u4e8e\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u76ee\u524d\u9047\u5230\u7684\u7b14\u8bb0\u672c\u4e0a\uff0c\u7531\u4e8e\u5c4f\u5e55\u7f29\u653e\u6bd4\u4f8b\u4e3a 1.25\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u6211\u4eec\u9ed8\u8ba4\u4f7f\u7528\u7f29\u653e\u6bd4\u4f8b\u4e3a 1\uff1b \u57fa\u4e8e\u56fe\u50cf\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u76ee\u6807\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b \u57fa\u4e8e OCR \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u6587\u5b57\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u540c\u6837\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6_1","title":"6. \u952e\u9f20\u64cd\u4f5c\u4e0d\u51c6","text":" \u9f20\u6807\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6bd4\u5982\u53f3\u952e\u3001\u53cc\u51fb\u65e0\u54cd\u5e94\uff1b \u952e\u76d8\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6216\u8005\u5ef6\u8fdf\u8f93\u5165\uff0c\u6bd4\u5982\u7528\u4f8b\u9700\u8981\u8f93\u5165\u201c\u6211\u662f\u4e2d\u56fd\u4eba\u201d\uff0c\u5b9e\u9645\u53ea\u8f93\u5165\u4e86\u201c\u6211\u56fd\u4eba\u201d\uff1b \u4ee5\u4e0a\u95ee\u9898\u6392\u9664\u5e94\u7528\u5361\u987f\u7b49\u95ee\u9898\uff0c\u5927\u6982\u7387\u662f\u7531\u4e8e\u5de5\u5177\u7684\u95ee\u9898\uff0c\u76ee\u524d\u952e\u9f20\u64cd\u4f5c\u6211\u4eec\u4f7f\u7528\u4e09\u4e2a\u5de5\u5177\uff1aDogtail \u63d0\u4f9b\u7684\u952e\u9f20\u5de5\u5177\u3001PyAutoGUI\u3001Xdotool \uff1b \u6709\u540c\u5b66\u53ef\u80fd\u8981\u8bf4\u4e3a\u5565\u8981\u7528\u4e09\u4e2a\u554a\uff0c\u7528\u4e00\u4e2a\u4e0d\u5c31\u597d\u4e86\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u5404\u6709\u4f18\u70b9\u5404\u6709\u7f3a\u70b9\u3002 \u5982\u679c\u4f60\u9047\u5230\u952e\u9f20\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u8bd5\u8bd5\u901a\u8fc7\u4e0d\u540c\u7684\u5de5\u5177\u64cd\u4f5c\uff1b\u952e\u76d8\u8f93\u5165\u5ef6\u8fdf\u7684\u95ee\u9898\uff0c\u4e00\u822c\u662f\u56e0\u4e3a\u8f93\u5165\u901f\u5ea6\u592a\u5feb\u4e86\uff0c\u7cfb\u7edf\u6ca1\u53cd\u5e94\u8fc7\u6765\uff0c\u5e38\u89c1\u4e8e ARM \u548c MIPS \u4e0a\uff0c\u4fee\u6539\u53c2\u6570 delay_time \u7684\u503c\uff0c\u5355\u4f4d\u4e3a\u6beb\u79d2\uff1b # mouse_key.py\n@classmethod\ndef input_message(cls, message, delay_time=300, interval=0.2):\n\"\"\"\n \u8f93\u5165\u5b57\u7b26\u4e32\n :param message: \u8f93\u5165\u7684\u5185\u5bb9\n :param delay_time: \u5ef6\u8fdf\u65f6\u95f4\n :param interval:\n :return:\n \"\"\"\n \u5982\u679c\u4e0d\u662f\u65b9\u6cd5\u7684\u95ee\u9898\uff0c\u5219\u9700\u8981\u7ee7\u7eed\u548c\u5f00\u53d1\u4e00\u8d77\u6392\u9664\uff0c\u662f\u5426\u4e3a\u5e94\u7528\u63a5\u53d7\u952e\u9f20\u4fe1\u53f7\u5904\u7406\u7684\u95ee\u9898\uff0c\u8fd9\u7c7b\u60c5\u51b5\u6211\u4eec\u4e5f\u662f\u9047\u5230\u8fc7\u7684\uff0c\u5177\u4f53\u95ee\u9898\u5177\u4f53\u5206\u6790\u3002 \u6bd4\u5982\u5f71\u9662\u5c31\u91cd\u5199\u4e86\u4e00\u4e2a\u53f3\u952e\u7684\u65b9\u6cd5\uff1a # base_widget.py\n@classmethod\ndef right_click(cls, _x=None, _y=None):\n\"\"\"\n \u91cd\u5199\u5e95\u5c42\u5355\u51fb\u9f20\u6807\u53f3\u952e\n \u89e3\u51b3\u5f71\u9662\u53f3\u952e\u89e6\u53d1release\u4e8b\u4ef6\u7684\u95ee\u9898\uff08\u53f3\u952e\u4e3b\u7a97\u53e3\u4f1a\u64ad\u653e\u89c6\u9891\uff09\n \"\"\"\ncls.mouse_down(_x, _y, button=3)\nsleep(0.1)\ncls.mouse_up(button=3)\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_6","title":"\u4e03\u3001\u5176\u4ed6\u4e0d\u4e3a\u4eba\u77e5\u7684\u7ec6\u8282","text":" \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u5c3d\u91cf\u7f16\u5199\u540c\u4e00\u4e2a\u5e94\u7528\u6216\u6a21\u5757\u7684\u7528\u4f8b\uff0c\u80fd\u5bf9\u8be5\u7528\u4f8b\u5df2\u6709\u65b9\u6cd5\u719f\u6089\uff0c\u907f\u514d\u8fc7\u591a\u91cd\u590d\u4e1a\u52a1\u4ee3\u7801\u7684\u5c01\u88c5\uff1b \u76f8\u540c\u7684\u573a\u666f\u4e0b\uff0c\u5404\u67b6\u6784\u7b49\u5f85\u65f6\u95f4\u4e0d\u540c\uff0c\u5efa\u8bae\u4f7f\u7528\u6846\u67b6\u63d0\u4f9b\u7684 sleep\uff0c\u6211\u4eec\u505a\u4e86\u4e0d\u540c\u67b6\u6784\u7684\u500d\u6570\u653e\u5927\uff1b \u7f16\u5199\u7528\u4f8b\u65f6\uff0c\u5c3d\u91cf\u8003\u8651\u5230\u6bcf\u4e00\u6b65\u5f02\u5e38\u540e\u7684\u73af\u5883\u6062\u590d\uff0c\u9700\u8981\u5efa\u8bae\u8fd9\u79cd\u610f\u8bc6\uff0c\u968f\u65f6\u8981\u8003\u8651\u5230\uff0c\u8fd9\u6b65\u64cd\u4f5c\u6709\u6ca1\u6709\u53ef\u80fd\u51fa\u9519\uff0c\u51fa\u9519\u4e86\u6539\u600e\u4e48\u529e\uff1b \u63d0\u4ea4\u4ee3\u7801\u7684\u65f6\u5019\u6ce8\u610f\u4e0d\u8981\u628a\u4e00\u4e9b\u4e34\u65f6\u7684\u6d4b\u8bd5\u8d44\u6e90\u63d0\u4ea4\u8fdb\u53bb\u4e86\uff0c\u6bd4\u5982\u6d4b\u8bd5\u4e86\u4e00\u4e2a\u5f71\u7247\uff0c\u6709\u4e9b\u540c\u5b66\u4e60\u60ef\u4f7f\u7528 git add . \uff0c\u7136\u540e\u5c31\u5168\u90e8\u63d0\u4ea4\u5230\u4ee3\u7801\u4ed3\u5e93\u4e86\uff0c\u8fd9\u6837\u5373\u4f7f\u540e\u671f\u628a\u5927\u6587\u4ef6\u5220\u4e86\uff0c.git \u6587\u4ef6\u91cc\u9762\u4e5f\u4f1a\u5f88\u5927\uff0c\u9020\u6210\u4ee3\u7801\u4ed3\u5e93\u53d8\u5f97\u5341\u5206\u81c3\u80bf\u3002 \u66f4\u591a\u7ec6\u8282\u67e5\u770b\uff1a\u300aAT\u7ecf\u9a8c\u603b\u7ed3\u300b"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/","title":"AT \u6267\u884c\u5668\u4f7f\u7528\u6307\u5317","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/5/25\n# Author : litao\n# =============================================\n Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1","title":"1\u3001\u529f\u80fd\u4ecb\u7ecd","text":" \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7cfb\u7edf\u8bed\u8a00\u8bbe\u7f6e\uff0c\u5206\u8fa8\u7387\u8bbe\u7f6e\u53ca\u7528\u4f8b\u6267\u884c\u73af\u5883\u642d\u5efa\uff1b \u652f\u6301 IP \u4e3a 15 \u7f51\u6bb5\u7684 AMD \u67b6\u6784\u6d4b\u8bd5\u673a\u955c\u50cf\u88c5\u673a\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u6307\u5b9a\u5e94\u7528\uff0c\u6307\u5b9a\u8303\u56f4\u6807\u7b7e\u7684\u7528\u4f8b\u6267\u884c\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u72b6\u6001\u68c0\u67e5\uff0c\u662f\u5426\u6709\u6b63\u5728\u8fd0\u884c\u7684\u6d4b\u8bd5\uff1b \u652f\u6301\u914d\u7f6e\u7528\u4f8b\u6267\u884c\u65f6\u957f\uff0c\u9632\u6b62\u4efb\u52a1\u963b\u585e\uff1b \u652f\u6301\u6839\u636e\u5e94\u7528\u7248\u672c\u81ea\u52a8\u67e5\u627e\u5bf9\u5e94\u7684\u7528\u4f8b tag\uff1b \u652f\u6301\u5f02\u5e38\u5904\u7406\u548c\u6d4b\u8bd5\u5b8c\u6210\u7684\u5b9e\u65f6\u6d88\u606f\u901a\u77e5\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2job","title":"2\u3001Job \u4ecb\u7ecd","text":"\u4ee5\u4e0b\u6309\u6267\u884c\u6d41\u7a0b\u7684\u987a\u5e8f\u4ecb\u7ecd\uff0c\u6bcf\u4e00\u6b65\u90fd\u53ef\u4ee5\u5355\u72ec\u6267\u884c\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1_1","title":"1\u3001\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/AT_test/ \u6574\u4e2a\u6d41\u7a0b\u7684\u4e3b\u5165\u53e3\uff0c\u901a\u8fc7\u8fd9\u4e2a\u5165\u53e3\uff0c\u8fde\u540c\u6574\u4e2a\u6d4b\u8bd5\u6d41\u7a0b\uff0c\u955c\u50cf\u88c5\u673a\uff0c\u73af\u5883\u90e8\u7f72\uff0c\u6d4b\u8bd5\u5e94\u7528\u53ca\u751f\u6210\u62a5\u544a\u3002 \u53c2\u6570\u4ecb\u7ecd\uff1a \u6d4b\u8bd5\u673a\uff1a\u6240\u6709\u89c4\u6574\u5230\u56fa\u5b9a\u533a\u57df\u7684\u6d4b\u8bd5\u673a\uff0c\u901a\u8fc7\u6d4b\u8bd5\u540c\u5b66\u5bf9\u6d4b\u8bd5\u673a\u7684\u4e60\u60ef\u547d\u540d\uff0c\u5728\u540e\u53f0\u6620\u5c04\u6d4b\u8bd5\u673a\u7684\u8be6\u7ec6\u4fe1\u606f\uff0c\u62ec\u53f7\u4e2d\u4e3a\u6d4b\u8bd5\u673a IP \u7684\u6700\u540e\u4e00\u4f4d\uff1b \u6d4b\u8bd5\u5e94\u7528\uff1a\u6307\u5b9a\u7684\u6d4b\u8bd5\u5e94\u7528\u7684\u5305\u540d\uff0c\u7cfb\u7edf\u6839\u636e\u540d\u79f0\u81ea\u52a8\u62c9\u53d6\u5bf9\u5e94\u7684\u4ed3\u5e93\u4ee3\u7801\uff1b deb\u5305\u4e0b\u8f7d\u5730\u5740\uff1a\u6d4b\u8bd5\u4e0a\u8ff0\u5e94\u7528\u65f6\uff0c\u9700\u8981\u5b89\u88c5\u7684deb\u5305\u4e0b\u8f7d\u5730\u5740\uff0c\u591a\u4e2a\u5730\u5740\u7528\u201c,\u201d\u9694\u5f00\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff1b \u8303\u56f4\u6807\u7b7e\uff1a\u6267\u884c\u6d4b\u8bd5\u7528\u4f8b\u7684\u6807\u7b7e\u8303\u56f4\uff0c\u5bf9\u5e94\u7528\u4f8b\u4ee3\u7801 csv \u6587\u4ef6\u4e2d\u7684\u6807\u7b7e\u4fe1\u606f\uff0c\u4ee5 pytest \u7684mark\u8bed\u6cd5\u7f16\u5199\uff1b \u7cfb\u7edf\u8bed\u8a00\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u8bed\u8a00\u73af\u5883\uff1b \u5206\u8fa8\u7387\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u5206\u8fa8\u7387\u73af\u5883\uff1b \u955c\u50cf\u5730\u5740\uff1a\u955c\u50cf\u4ed3\u5e93\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u901a\u8fc7 PXE \u88c5\u673a\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u88c5\u673a\u73af\u8282\uff08\u76ee\u524d\u4ec5\u652f\u6301\u90e8\u5206 AMD \u67b6\u6784\u7684\u88c5\u673a\uff09\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2pxe","title":"2\u3001PXE \u88c5\u673a","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/IOS_install/ \u8f93\u5165\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\uff0cIP\uff0c\u5bc6\u7801\uff0c\u955c\u50cf\u5730\u5740\u540e\uff0c\u81ea\u52a8\u88c5\u673a\uff0c\u76ee\u524d\u4ec5\u652f\u6301\u56fa\u5b9a 15 \u7f51\u6bb5\u7684\u90e8\u5206 AMD \u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#3","title":"3\u3001\u6b21\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/all_client_test/ \u8be5\u5165\u53e3\u4e0e\u4e3b\u5165\u53e3\u529f\u80fd\u57fa\u672c\u4e00\u81f4\uff0c\u53ea\u662f\u5265\u79bb\u4e86PXE\u88c5\u673a\u6d41\u7a0b\uff0c\u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7684\u6267\u884c\u6d41\u7a0b\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#4","title":"4\u3001\u73af\u5883\u90e8\u7f72","text":"Jenkins url\uff1ahttps://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/env/build?delay=0sec \u8bbe\u7f6e\u6d4b\u8bd5\u673a\u7684\u7cfb\u7edf\u8bed\u8a00\uff0c\u5206\u8fa8\u7387\u53ca\u5b89\u88c5\u6d4b\u8bd5\u6240\u9700\u7684\u4f9d\u8d56\u5305\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#5","title":"5\u3001\u53d1\u9001\u4ee3\u7801","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/send_code/ \u6839\u636e\u6d4b\u8bd5\u5e94\u7528\u540d\u79f0\uff0c\u62c9\u53d6\u5bf9\u5e94\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u5e76\u6839\u636e\u6d4b\u8bd5\u673a\u4e0a\u5e94\u7528\u7248\u672c\u5207\u6362\u5230\u5bf9\u5e94\u7684tag\u7248\u672c\uff0c\u82e5\u672a\u627e\u5230tag\u7248\u672c\uff0c\u5219\u4f7f\u7528\u6700\u65b0\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u518d\u6839\u636e\u5e94\u7528\u5e93\u4ee3\u7801\u4e2d\u914d\u7f6e\u7684\u57fa\u7840\u5e93\u7248\u672c\uff0c\u62c9\u53d6\u57fa\u7840\u5e93\u4ee3\u7801\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#6","title":"6\u3001\u7528\u4f8b\u6267\u884c","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/run_test/ \u8fd0\u884c\u6d4b\u8bd5\u673a\u4e0a\u7684\u7528\u4f8b"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/","title":"AT \u7528\u4f8b\u7b5b\u9009\u6307\u5317","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u7528\u4f8b\u7b5b\u9009\u6807\u51c6\uff0c\u662f\u6311\u9009\u5408\u9002\u7684\u6587\u672c\u7528\u4f8b\u8fdb\u884c\u81ea\u52a8\u5316\u7528\u4f8b\u8f6c\u5316\u7684\u4e00\u4e9b\u901a\u7528\u6807\u51c6\u3002 \u8fc7\u53bb\u6211\u4eec\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u5b9e\u8df5\u8fc7\u7a0b\u4e2d\uff0c\u5199\u4e86\u4e0d\u5c11\u81ea\u52a8\u5316\u7528\u4f8b\uff0c\u968f\u7740\u9700\u6c42\u7684\u8fed\u4ee3\uff0c\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u81ea\u7136\u8150\u5316\uff0c\u56e0\u800c\u9700\u8981\u5728\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\u5bf9\u81ea\u52a8\u5316\u7528\u4f8b\u8fdb\u884c\u7ef4\u62a4\uff0c\u5728\u7ef4\u62a4\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u6211\u4eec\u53d1\u73b0\uff0c\u6709\u4e9b\u7528\u4f8b\u7ef4\u62a4\u8d77\u6765\u592a\u96be\u4e86\uff0c\u8c03\u8bd5\u7528\u4f8b\u8017\u8d39\u5927\u91cf\u65f6\u95f4\uff0c\u6210\u672c\u5f88\u9ad8\u3002 \u56e0\u6b64\uff0c\u6211\u4eec\u603b\u7ed3\u4e00\u4e9b\u81ea\u52a8\u5316\u7528\u4f8b\u9009\u578b\u7684\u6807\u51c6\uff0c\u4ee5\u4f18\u5316\u540e\u7eed\u81ea\u52a8\u5316\u7528\u4f8b\u7ed3\u6784\uff0c\u671f\u5f85\u6211\u4eec\u80fd\u7f16\u5199\u51fa\u9ad8\u6548\u3001\u7a33\u5b9a\u3001\u6613\u4e8e\u7ef4\u62a4\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_1","title":"\u4e00\u3001\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u53ef\u4ee5\u5206\u4e3a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u548c\u4e13\u9879\u81ea\u52a8\u5316\u6d4b\u8bd5\uff0c\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e00\u822c\u53ea\u9488\u5bf9\u4e00\u4e9b\u5e38\u89c4\u7684\u529f\u80fd\u6d4b\u8bd5\uff0c\u5176\u4ed6\u975e\u5e38\u89c4\u529f\u80fd\u7684\u7528\u4f8b\uff0c\u5e94\u8be5\u91c7\u7528\u4e13\u9879\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u6848\uff1b \u4ee5\u4e0b\u662f\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1","title":"1. \u7a33\u5b9a\u6027\u3001\u538b\u6d4b\u7528\u4f8b","text":"\u7a33\u5b9a\u6027\u6d4b\u8bd5\u3001\u538b\u6d4b\u7528\u4f8b\u5e94\u8be5\u662f\u5c5e\u4e8e\u6027\u80fd\u76f8\u5173\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u5982\uff1a\u53cd\u590d\u591a\u6b21\u70b9\u51fb\u6309\u94ae\uff0c\u68c0\u9a8c\u5176\u529f\u80fd\u7a33\u5b9a\u6027\u3002\u56e0\u4e3a\u8fd9\u4e9b\u7528\u4f8b\u65ad\u8a00\u7684\u9884\u671f\u53ef\u80fd\u4e0d\u662f\u5f88\u660e\u786e\uff0c\u66f4\u6709\u751a\u8005\u4e0d\u9700\u8981\u65ad\u8a00\uff0c\u7528\u4f8b\u65f6\u957f\u6bd4\u8f83\u957f\uff0c\u800c\u4e14\u4e0d\u53ef\u63a7\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u76ee\u524d\u6211\u4eec\u6709\u6027\u80fd\u81ea\u52a8\u5316\u7684\u4e13\u9879\u65b9\u6848\uff0c\u4ee5\u53ca\u4e00\u4e9b\u7a33\u5b9a\u6027\u6d4b\u8bd5\u7684\u4e13\u9879\u65b9\u6848\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u6b64\u7c7b\u7528\u4f8b\u653e\u5230\u4e13\u9879\u81ea\u52a8\u5316\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2","title":"2. \u6d89\u53ca\u591a\u4e2a\u7528\u6237\u64cd\u4f5c","text":"\u5e38\u89c1\u4e0e\u6587\u7ba1\u7684\u7528\u4f8b\u4e2d\uff0c\u591a\u7528\u6237\u64cd\u4f5c\u7684\u7528\u4f8b\u4e00\u822c\u90fd\u4f1a\u6d89\u53ca\u5230\u5728\u7cfb\u7edf\u4e2d\u8fdb\u884c\u591a\u4e2a\u7528\u6237\u95f4\u7684\u5207\u6362\uff0c\u81ea\u52a8\u5316\u811a\u672c\u4e00\u822c\u662f\u8fd0\u884c\u5728\u4e00\u4e2a\u7528\u6237\u7a7a\u95f4\u4e0b\u7684\uff0c\u6240\u4ee5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u591a\u7528\u6237\u95f4\u7684\u5207\u6362\u3002 \u6b64\u7c7b\u4e0d\u5efa\u8bae\u91c7\u7528\u81ea\u52a8\u5316\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3","title":"3. \u4e0e\u5f00\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4ea4\u4e92","text":"\u6b64\u7c7b\u573a\u666f\u591a\u4e3a\u5e94\u7528\u7684\u5f02\u5e38\u573a\u666f\u6d4b\u8bd5\uff0c\u6bd4\u5982\uff1a\u590d\u5236\u5927\u6587\u4ef6\u8fc7\u7a0b\u4e2d\u6ce8\u9500\u673a\u5668\u3002 \u81ea\u52a8\u5316\u811a\u672c\u5728\u7cfb\u7edf\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4e4b\u540e\u662f\u4f1a\u505c\u6b62\u8fd0\u884c\u7684\uff1b\u6b64\u7c7b\u7528\u4f8b\u53ef\u4ee5\u505a\u81ea\u52a8\u5316\uff0c\u4f46\u662f\u540c\u6837\u9700\u8981\u505a\u4e13\u9879\u65b9\u6848\uff0c\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u7684\u5904\u7406\u903b\u8f91\u5b8c\u5168\u4e0d\u540c\u3002 \u540e\u7eed\u81ea\u52a8\u5316\u9700\u8981\u516c\u5173\u7684\u70b9\uff1a \u81ea\u52a8\u5316\u811a\u672c\u5728\u672c\u673a\u8fd0\u884c\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u81f3\u5c11\u9700\u8981\u63d0\u4f9b\u4ee5\u4e0b\u529f\u80fd\uff1a \u91cd\u542f\u4e4b\u540e\u7528\u4f8b\u80fd\u81ea\u52a8\u8fd0\u884c\uff1b\u53ef\u4ee5\u8003\u8651\u5c06\u6267\u884c\u7528\u4f8b\u5199\u6210\u4e00\u4e2a\u5f00\u673a\u81ea\u542f\u7684\u670d\u52a1\uff1b \u80fd\u8bb0\u5f55\u5173\u673a\u4e4b\u524d\u7528\u4f8b\u6267\u884c\u7684\u4f4d\u7f6e\uff0c\u91cd\u542f\u4e4b\u540e\u80fd\u4ece\u6b64\u4f4d\u7f6e\u5f00\u59cb\u6267\u884c\uff1b \u50cf\u6027\u80fd\u81ea\u52a8\u5316\u4e00\u6837\uff0c\u7531\u670d\u52a1\u7aef\u63a7\u5236\uff1b \u5b8c\u5168\u57fa\u4e8e\u56fe\u5f62\u8bc6\u522b\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u4e32\u53e3\u7ebf\u63a7\u5236\u952e\u9f20\u7a33\u5b9a\u6027\uff1b "},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4","title":"4. \u6d4b\u8bd5\u6267\u884c\u65f6\u95f4\u957f","text":"\u7528\u4f8b\u6267\u884c\u65f6\u95f4\u63a7\u5236\u57282\u5206\u949f\u4ee5\u5185\uff0c\u6781\u7aef\u60c5\u51b5\u4e0d\u8981\u8d85\u8fc75\u5206\u949f\uff0c\u6240\u6709\u7528\u4f8b\u7684\u5e73\u5747\u65f6\u957f\u5e94\u8be5\u57281\u5206\u949f\u5de6\u53f3\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u95f4\u592a\u957f\uff0c\u7f16\u5199\u7528\u4f8b\u3001\u8c03\u8bd5\u7528\u4f8b\u3001\u6267\u884c\u7528\u4f8b\u3001\u7ef4\u62a4\u7528\u4f8b\u90fd\u975e\u5e38\u7684\u8017\u65f6\uff0c\u4eba\u529b\u6210\u672c\u65f6\u95f4\u6210\u672c\u6295\u5165\u592a\u9ad8\u3002 \u4f60\u60f3\uff0c\u8fd9\u6761\u7528\u4f8b\u6267\u884c\u9700\u89815\u5206\u949f\uff0c\u90a3\u4f60\u5199\u8fd9\u6761\u7528\u4f8b\u7684\u65f6\u95f4\u4e0d\u53ef\u80fd\u4e00\u904d\u8fc7\uff0c\u5199\u7684\u8fc7\u7a0b\u4e2d\u8dd1\u4e0d\u901a\u8fd8\u5f97\u91cd\u8dd1\u81f3\u5c1115\u5206\u949f\u4e0d\u8fc7\u5206\uff0c\u5199\u5b8c\u4e86\u8fd8\u5f97\u5728\u5176\u4ed6\u67b6\u6784\u4e0a\u8c03\u8bd5\uff0c\u534a\u4e2a\u5c0f\u65f6\u8fc7\u53bb\u4e86\uff0c\u8fd9\u8fd8\u53ea\u662f\u7b2c\u4e00\u6b21\u5199\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u540e\u7eed\u5982\u679c\u7528\u4f8b\u7ef4\u62a4\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u7ecf\u5e38\u6295\u5165\u76f8\u5f53\u957f\u65f6\u95f4\uff0c\u8fd9\u6837\u5176\u5b9e\u662f\u5931\u53bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u7684\u3002\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u5c31\u5e94\u8be5\u662f\u5feb\u51c6\u72e0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5","title":"5. \u8fb9\u7f18\u6027\u6d4b\u8bd5","text":"\u6709\u4e9b\u529f\u80fd\u6a21\u5757\u672c\u8eab\u662f\u5c5e\u4e8e\u6bd4\u8f83\u8fb9\u7f18\u6027\u7684\uff0c\u5373\u6781\u5c11\u7528\u6237\u4f1a\u4f7f\u7528\u5230\u7684\u529f\u80fd\uff0c\u8fd9\u7c7b\u529f\u80fd\u6a21\u5757\u4e0d\u9700\u8981\u5927\u89c4\u6a21\u5b9e\u73b0\u81ea\u52a8\u5316\uff0c\u4e00\u4e24\u4e2a\u573a\u666f\u8986\u76d6\u57fa\u672c\u529f\u80fd\u5c31\u884c\u4e86\uff0c\u56e0\u6b64\u6211\u4eec\u5728\u6311\u9009\u6b64\u7c7b\u7528\u4f8b\u7684\u65f6\u5019\u53ef\u4ee5\u7ed3\u5408\u6574\u4e2a\u529f\u80fd\u6a21\u5757\u7684\u8986\u76d6\u60c5\u51b5\u6765\u51b3\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6","title":"6. \u9700\u8981\u4f9d\u8d56\u4eba\u5de5\u4ecb\u5165\u7684","text":"\u81ea\u52a8\u5316\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\u662f\u6ca1\u6709\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bd4\u5982\u8981\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u90a3\u4e48\u5c31\u80cc\u79bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u3002 \u6bd4\u5982\u5149\u9a71\u6a21\u5757\uff0c\u5149\u9a71\u523b\u5f55\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u4f46\u662f\u5149\u9a71\u523b\u5f55\u4e4b\u540e\u5149\u76d8\u4f1a\u5f39\u51fa\u6765\uff0c\u9700\u8981\u4eba\u5de5\u66f4\u6362\u5149\u76d8\uff0c\u518d\u624b\u52a8\u63a8\u8fdb\u5149\u9a71\u4e2d\u3002 \u8fd9\u79cd\u529f\u80fd\u6a21\u5757\u5373\u4f7f\u505a\u81ea\u52a8\u5316\uff0c\u80fd\u6d89\u53ca\u5230\u7684\u529f\u80fd\u975e\u5e38\u6709\u9650\uff0c\u800c\u4e14\u4e0d\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u6240\u4ee5\u660e\u663e\u5c31\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7","title":"7. \u96be\u4ee5\u5b9e\u73b0\u7684","text":"\u7528\u4f8b\u6240\u6d89\u53ca\u5230\u7684\u65b9\u6cd5\u5b9e\u73b0\u8d77\u6765\u53ef\u80fd\u6709\u96be\u5ea6\uff0c\u751a\u81f3\u73b0\u9636\u6bb5\u65e0\u6cd5\u5b9e\u73b0\u7684\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002 \u6bd4\u5982\u5f71\u9662\u6d4b\u8bd5\u753b\u9762\u6e05\u6670\u5ea6\u3001\u6d41\u7545\u5ea6\u3001\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u4e4b\u540e\u7684\u89c6\u9891\u662f\u5426\u5b58\u5728\u5361\u987f\u7b49\u7528\u4f8b\uff0c\u73b0\u9636\u6bb5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#8","title":"8. \u529f\u80fd\u4e0d\u7a33\u5b9a","text":"\u8fd9\u4e2a\u4e0d\u662f\u8bf4\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\uff0c\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\u4e0d\u7a33\u5b9a\u662f\u6b63\u5e38\u7684\uff0c\u8fd9\u79cd\u6211\u4eec\u53ef\u4ee5\u7b49\u5f00\u53d1\u63d0\u6d4b\u4e4b\u540e\u518d\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u3002 \u529f\u80fd\u4e0d\u7a33\u5b9a\u6307\u7684\u662f\u7528\u4f8b\u6240\u6d89\u53ca\u7684\u529f\u80fd\uff0c\u53ef\u80fd\u5b58\u5728\u591a\u79cd\u53d8\u5316\uff0c\u6bcf\u6b21\u6267\u884c\u7528\u4f8b\u53ef\u80fd\u65ad\u8a00\u7684\u9884\u671f\u90fd\u4e0d\u540c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#9","title":"9. \u52a8\u6001\u65ad\u8a00","text":"\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u76f4\u5230\u7528\u4f8b\u7ed3\u675f\uff0c\u4e00\u76f4\u662f\u4e00\u4e2a\u52a8\u6001\u53d8\u5316\u7684\u8fc7\u7a0b\uff0c\u800c\u4e14\u65e0\u6cd5\u901a\u8fc7\u5176\u4ed6\u624b\u6bb5\u505c\u4e0b\u6765\uff1b \u6bd4\u5982\uff1a\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u65f6\uff0c\u53f3\u4e0b\u89d2\u7684\u5f55\u5236\u65f6\u95f4\u662f\u4e00\u76f4\u5728\u53d8\u5316\u7684\uff0c\u7528\u4f8b\u9700\u8981\u6d4b\u8bd5\u5f55\u52361\u5206\u949f\u4e4b\u540e\uff0c\u5f55\u5236\u65f6\u95f4\u662f\u521a\u597d\u505c\u572860\u79d2\uff1b \u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fd8\u505a\u4e0d\u5230\u65f6\u95f4\u7cbe\u51c6\u63a7\u5236\uff0c\u7a0b\u5e8f\u6267\u884c\u65f6\u95f4\u662f\u6709\u6ce2\u52a8\u7684\uff0c\u800c\u4e14\u8981\u9002\u914d\u591a\u4e2a\u5e73\u53f0\uff0c\u6240\u4ee5\u6b64\u7c7b\u7528\u4f8b\u5927\u6982\u7387\u4f1a\u6267\u884c\u5931\u8d25\u3002\u7279\u522b\u662f\u5728\u6027\u80fd\u8f83\u5dee\u7684\u56fd\u4ea7\u5316\u67b6\u6784\u4e0a\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u592a\u53ef\u80fd\u7a33\u5b9a\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#10","title":"10. \u63a2\u7d22\u6027\u6d4b\u8bd5","text":"\u63a2\u7d22\u6027\u6d4b\u8bd5\u901a\u5e38\u662f\u4e00\u4e9b\u4e0d\u786e\u5b9a\u7684\u64cd\u4f5c\uff0c\u591a\u53d8\u5207\u590d\u6742\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u9884\u671f\u4e5f\u53ef\u80fd\u662f\u4e0d\u786e\u5b9a\u7684\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u9a9a\u64cd\u4f5c\u592a\u591a\u4e86\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6b64\u7c7b\u7528\u4f8b\u9002\u5408\u91c7\u7528\u624b\u5de5\u6d4b\u8bd5\uff0c\u662f\u624b\u5de5\u6d4b\u8bd5\u771f\u6b63\u7684\u4ef7\u503c\u4f53\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#11","title":"11. \u6613\u7528\u6027\u6d4b\u8bd5","text":"\u5bf9\u4e8e\u6613\u7528\u6027\u7684\u5224\u65ad\u901a\u5e38\u662f\u4e3b\u89c2\u7684\uff0c\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\u5f88\u96be\u53bb\u5b9a\u4e49\u4ec0\u4e48\u6837\u7684\u60c5\u51b5\u5bf9\u7528\u6237\u662f\u6613\u7528\u7684\uff0c\u81ea\u52a8\u5316\u9700\u8981\u6709\u660e\u786e\u7684\u53ef\u5b9e\u73b0\u7684\u9884\u671f\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_2","title":"\u4e8c\u3001\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u524d\u9762\u8bb2\u4e86\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u4e00\u4e9b\u7528\u4f8b\u60c5\u51b5\uff0c\u6709\u540c\u5b66\u5c31\u8bf4\u4e86\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\u4e0d\u7528\u8bb2\u4e86\uff0c\u5c31\u662f\u4e0d\u9002\u5408\u7684\u53cd\u9762\u3002\u6ca1\u6bdb\u75c5\u54c8\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\uff0c\u6211\u4eec\u5927\u4f53\u8fd8\u53ef\u4ee5\u5206\u4e3a\u4e24\u7c7b\uff1a \u7b2c\u4e00\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u597d\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u7b2c\u4e8c\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u4e00\u822c\uff0c\u9700\u8981\u6295\u5165\u66f4\u591a\u7cbe\u529b\u624d\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u4ee5\u4e0b\u4ecb\u7ecd\u4e00\u4e9b\u6211\u4eec\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1_1","title":"1. \u64cd\u4f5c\u76f8\u5bf9\u7b80\u5355","text":"\u7528\u4f8b\u6b65\u9aa4\u76f8\u5bf9\u8f83\u5c11\uff0c\u8fd9\u79cd\u7528\u4f8b\u901a\u5e38\u662f\u4e00\u4e9b\u8def\u5f84\u5f88\u6d45\u7684\u7528\u4f8b\uff0c\u4e00\u822c\u4e5f\u662f\u4e00\u4e9b\u57fa\u7840\u7528\u4f8b\u3002\u7528\u4f8b\u7f16\u5199\u3001\u7ef4\u62a4\u90fd\u53ef\u4ee5\u8f7b\u677e\u641e\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2_1","title":"2. \u5bb9\u6613\u5b9e\u73b0","text":"\u73b0\u6709\u6280\u672f\u662f\u53ef\u5b9e\u73b0\u7684\uff0c\u6ca1\u6709\u96be\u5ea6\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3_1","title":"3. \u7ecf\u5e38\u7528\u4e8e\u56de\u5f52\u6d4b\u8bd5","text":"\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bcf\u6b21\u56de\u5f52\u6d4b\u8bd5\u5fc5\u987b\u8981\u6267\u884c\u7684\u7528\u4f8b\uff0c\u90a3\u4e48\u8fd9\u6761\u7528\u4f8b\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u3002 \u56de\u5f52\u6d4b\u8bd5\u65f6\u6211\u4eec\u9996\u5148\u5e94\u8be5\u4fdd\u8bc1\u5e94\u7528\u5386\u53f2\u57fa\u672c\u529f\u80fd\u6b63\u5e38\uff0c\u6240\u4ee5\u90a3\u4e9b\u6bcf\u6b21\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u90fd\u8981\u6267\u884c\u7684\u7528\u4f8b\u9002\u5408\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4_1","title":"4. \u529f\u80fd\u7a33\u5b9a\u7684\u6838\u5fc3\u529f\u80fd","text":"\u6d89\u53ca\u6838\u5fc3\u529f\u80fd\u7684\u7528\u4f8b\u662f\u6700\u6700\u91cd\u8981\u7684\u7528\u4f8b\uff0c\u4e5f\u662f\u6211\u4eec\u4ea4\u4ed8\u65f6\u5fc5\u987b\u8981\u4fdd\u8bc1\u8d28\u91cf\u7684\u76f8\u5173\u529f\u80fd\uff0c\u56e0\u6b64\u5e94\u8be5\u5c3d\u53ef\u80fd\u7684\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5_1","title":"5. \u8f93\u5165\u6570\u636e\u6d4b\u8bd5","text":"\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u901a\u5e38\u662f\u68c0\u9a8c\u88ab\u6d4b\u5e94\u7528\u63a5\u53d7\u6709\u6548\u6570\u636e\u3001\u62d2\u7edd\u65e0\u6548\u6570\u636e\u7684\u80fd\u529b\u3002\u5982\uff1a\u63d0\u4ea4\u8d85\u957f\u5b57\u7b26\u4e32\u3001\u7279\u6b8a\u5b57\u7b26\u4e32\u7b49\u7b49\u3002 \u6b64\u7c7b\u7528\u4f8b\u624b\u5de5\u6d4b\u8bd5\u5f88\u96be\u6bd4\u8f83\u5168\u9762\u7684\u8986\u76d6\u5230\u6240\u6709\u7684\u8f93\u5165\u60c5\u51b5\uff0c\u4f46\u662f\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\uff0c\u6b64\u7c7b\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u90fd\u662f\u4e00\u6837\u7684\uff0c\u53d8\u5316\u7684\u4ec5\u662f\u8f93\u5165\u53c2\u6570\u548c\u65ad\u8a00\u7ed3\u679c\uff0c\u91c7\u7528\u6570\u636e\u9a71\u52a8\uff0c\u53ef\u4ee5\u8f7b\u677e\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6_1","title":"6. \u683c\u5f0f\u8986\u76d6","text":"\u539f\u56e0\u540c\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u7c7b\u7528\u4f8b\u4e00\u6837\uff0c\u591a\u79cd\u683c\u5f0f\u7684\u8986\u76d6\u4e5f\u662f\u4e00\u4e2a\u5f88\u7e41\u7410\u7684\u4e8b\u60c5\uff0c\u4ea4\u7ed9\u81ea\u52a8\u5316\u6765\u505a\u518d\u5408\u9002\u4e0d\u8fc7\u4e86\u3002 \u6bd4\u5982\u5f71\u9662\u5bf9\u5f71\u7247\u683c\u5f0f\u7684\u68c0\u67e5\u3001\u622a\u56fe\u5f55\u5c4f\u5bf9\u4fdd\u5b58\u683c\u5f0f\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7_1","title":"7. \u68c0\u67e5\u5143\u7d20\u72b6\u6001","text":"\u67e5\u770b\u88ab\u6d4b\u5e94\u7528\u7684\u5143\u7d20\u5c5e\u6027\u3002\u5982\uff1a\u56fe\u7247\u7684\u5927\u5c0f\u548c\u6392\u5217\uff1b\u6309\u94ae\u7684\u53ef\u7528\u548c\u4e0d\u53ef\u7528\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/","title":"AT \u7ecf\u9a8c\u603b\u7ed3","text":"\u6b22\u8fce\u6240\u6709\u4eba\u63d0\u4ea4\u4f60\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u9762\u7684\u4f18\u79c0\u5b9e\u8df5\u7ecf\u9a8c\uff0c\u4ee5\u5e2e\u52a9\u5927\u5bb6\u89e3\u51b3\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#1","title":"1\u3001\u7ec8\u7ed3\u5668","text":"# litaoa@uniontech.com\n \u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4 pytest \u5b9e\u73b0\u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4\u7684\u65b9\u5f0f\u6709\u4e24\u79cd\uff0cyield \u548c\u7ec8\u7ed3\u51fd\u6570\uff1b yield \u5b9e\u73b0\uff0cyield\u524d\u9762\u4e3a\u7528\u4f8b\u7684\u524d\u7f6e\u6b65\u9aa4\uff0cyield \u540e\u9762\u4e3a\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4\u3002 @pytest.fixture\ndef clean_env():\nprint(\"setup\")\nyield\nprint(\"teardown\")\n \u7ec8\u7ed3\u51fd\u6570\u5b9e\u73b0\uff0c\u4f7f\u7528 request.addfinalizer \u6ce8\u518c\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4 @pytest.fixture\ndef clean_env(request):\ndef clean():\nprint(\"teardown\")\nrequest.addfinalizer(clean)\nprint(\"setup\")\n yield\u7684\u4f18\u7f3a\u70b9\uff1a \u4f18\u70b9\uff1a\u4ee3\u7801\u7b80\u6d01\uff0c\u76f4\u89c2\uff0c\u53ef\u4f7f\u7528yield\u5728\u7528\u4f8b\u4e2d\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c \u7f3a\u70b9\uff1a\u82e5\u524d\u7f6e\u6b65\u9aa4\u4e2d\u51fa\u73b0\u9519\u8bef\uff0c\u5219\u540e\u7f6e\u6b65\u9aa4\u4e0d\u4f1a\u6267\u884c \u7ec8\u7ed3\u51fd\u6570\uff1a \u4f18\u70b9\uff1a\u524d\u7f6e\u6b65\u9aa4\u5931\u8d25\u7684\u8bdd\uff0c\u540e\u7f6e\u6b65\u9aa4\u4ecd\u4f1a\u6267\u884c\u4e14\u53ef\u4ee5\u6ce8\u518c\u591a\u4e2a\u540e\u7f6e\u6b65\u9aa4\uff08\u524d\u63d0\uff1a\u9700\u8981\u5728\u4ee3\u7801\u62a5\u9519\u4e4b\u524d\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff09\uff0c\u652f\u6301\u7075\u6d3b\u4f7f\u7528\u540e\u7f6e\u6761\u4ef6 \u7f3a\u70b9\uff1a\u4ee3\u7801\u8f83\u4e3a\u590d\u6742\uff0c\u65e0\u6cd5\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c\uff08\u672c\u4eba\u76ee\u524d\u672a\u5b9e\u73b0\uff09 \u603b\u7ed3\uff1a\u5728\u524d\u7f6e\u6b65\u9aa4\u4fdd\u8bc1\u7edd\u5bf9\u4e0d\u4f1a\u51fa\u9519\u65f6\uff0c\u4f7f\u7528yield\u66f4\u4f73\u7b80\u4fbf\uff0c\u5f53\u524d\u7f6e\u6b65\u9aa4\u6613\u51fa\u73b0\u95ee\u9898\u65f6\uff0c\u63a8\u8350\u4f7f\u7528\u7ec8\u7ed3\u51fd\u6570\u3002 \u573a\u666f\uff1a\u4fdd\u9669\u7bb1\u7528\u4f8b\uff0c\u524d\u7f6e\u6b65\u9aa4\u4e2d\u5f00\u542f\u4fdd\u9669\u7bb1\uff0c\u540e\u7f6e\u6b65\u9aa4\u5220\u9664\u4fdd\u9669\u7bb1\u3002 @pytest.fixture(scope=\"session\", autouse=True)\ndef vault_fixture(request):\nDfmWidget.reset_vault_by_cmd() # 1\u3001\u91cd\u7f6e\u4fdd\u9669\u7bb1\nDdeDockPublicWidget().close_file_manager_by_cmd() # 2\u3001\u5173\u95ed\u6587\u7ba1\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 3\u3001\u5f00\u542f\u6587\u7ba1\nvault = DfmWidget()\nvault.create_file_vault() # 4\u3001\u521b\u5efa\u4fdd\u9669\u7bb1\ndef delete_vault(): # 8\u3001\u5220\u9664\u4fdd\u9669\u7bb1\u7684\u540e\u7f6e\u6b65\u9aa4\nsleep(2)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr()\nvault = DfmWidget()\nvault.delete_file_vault()\nDfmWidget.reset_vault_by_cmd()\nDdeDockPublicWidget().close_file_manager_by_cmd()\nrequest.addfinalizer(delete_vault) # 5\u3001\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\nDdeDockPublicWidget().close_file_manager_by_cmd() # 6\u3001\u5173\u95ed\u6587\u7ba1\nsleep(1)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 7\u3001\u5f00\u542f\u6587\u7ba1\n \u4ee3\u7801\u6309\u6ce8\u91ca\u4e2d\u7684\u5e8f\u53f7\u6267\u884c\u6b65\u9aa4 \u4ee3\u7801\u5728\u6b65\u9aa41-4\u4efb\u610f\u4f4d\u7f6e\u62a5\u9519\uff0c\u5219\u4e0d\u4f1a\u6267\u884c\u6b65\u9aa48\uff0c\u56e0\u4e3a\u672a\u6267\u884c\u5230\u6b65\u9aa45\uff0c\u6b65\u9aa48\u8fd8\u672a\u6ce8\u518c \u4ee3\u7801\u5728\u6b65\u9aa46-7\u62a5\u9519\uff0c\u4ecd\u4f1a\u6267\u884c\u6b65\u9aa47\uff0c\u56e0\u4e3a\u5728\u6b65\u9aa45\u4e2d\u5df2\u7ecf\u5c06\u6b65\u9aa47\u6ce8\u518c \u53ef\u4ee5\u7075\u6d3b\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff0c\u80fd\u5b9e\u73b0\u67d0\u4e2a\u524d\u7f6e\u6b65\u9aa4\u6267\u884c\u4e4b\u540e\uff0c\u624d\u4f1a\u6267\u884c\u540e\u7f6e\u6b65\u9aa4\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#2","title":"2\u3001\u542f\u52a8\u5e94\u7528\u7684\u65b9\u5f0f","text":"# huangmingqiang@uniontech.com\n \uff081\uff09\u547d\u4ee4\u884c\u542f\u52a8 \u5728 AT \u4ee3\u7801\u4e2d\u4f7f\u7528\u547d\u4ee4\u884c\u542f\u52a8\u5e94\u7528\uff0c\u4e3e\u4f8b\uff1a os.popen(\"deepin-music\")\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f7f\u7528 ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6\uff0cdogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u3002 \uff082\uff09\u901a\u8fc7 UI \u64cd\u4f5c\u542f\u52a8 \u901a\u8fc7\u4efb\u52a1\u680f\u3001\u542f\u52a8\u5668\u3001\u684c\u9762\u7b49UI\u65b9\u5f0f\u542f\u52a8\uff0c\u6bd4\u5982\u53cc\u51fb\u6253\u5f00\u3001\u53f3\u952e\u6253\u5f00\u7b49\uff0c\u8fd9\u79cd\u64cd\u4f5c\u65b9\u5f0f\u4e0d\u5b58\u5728ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6dogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u7684\u95ee\u9898\uff0c\u4e5f\u66f4\u52a0\u7b26\u5408\u7528\u6237\u7684\u64cd\u4f5c\u884c\u4e3a\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#3","title":"3\u3001\u6587\u4ef6\u9009\u62e9\u6846\u5c5e\u6027\u5b9a\u4f4d\u5076\u73b0\u65e0\u6cd5\u627e\u5230","text":"\u6587\u4ef6\u9009\u62e9\u6846\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5728\u8c03\u7528\u6587\u4ef6\u9009\u62e9\u6846\u65f6\uff0c\u6709\u4e00\u5b9a\u7684\u6982\u7387\u51fa\u73b0\uff0c\u754c\u9762\u5df2\u7ecf\u6e32\u67d3\u51fa\u6765\u4e86\uff0c\u4f46\u662f\u5c5e\u6027\u6811\u5e76\u6ca1\u6709\u5199\u5165\uff0c\u5bfc\u81f4\u901a\u8fc7\u5c5e\u6027\u65e0\u6cd5\u627e\u5230\u5143\u7d20\uff0c\u76ee\u524d\u4e5f\u6ca1\u6709\u5f88\u597d\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u4e3a\u4e86\u7528\u4f8b\u7a33\u5b9a\u6027\uff0c\u6587\u4ef6\u9009\u62e9\u6846\u7684\u64cd\u4f5c\u5efa\u8bae\u4f7f\u7528UI\u6216\u8005\u56fe\u7247\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u53ef\u4ee5\u901a\u8fc7\u641c\u7d22\u5185\u5bb9\u56fa\u5b9a\u6587\u4ef6\u4f4d\u7f6e\u3002 # litaoa@uniontech.com\n desk = DdeDesktopPublicWidget()\n# \u9009\u62e9\u89c6\u9891\u76ee\u5f55\ndesk.click_videos_dir_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.ctrl_f()\nsleep(1)\ndesk.input_message(\"\u5143\u7d20\u540d\u79f0\")\nsleep(0.5)\ndesk.enter()\nsleep(1)\n# \u9009\u62e9\u7b2c\u4e00\u4e2a\u6587\u4ef6\ndesk.click_list_view_btn_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.click_first_file_in_desktop_plugs_by_ui()\nsleep(1)\n# \u6587\u7ba1\u63d2\u4ef6\u4e2d\u70b9\u51fb\u6253\u5f00\ndesk.click_open_btn_in_desktop_plugs_by_ui()\n"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#4","title":"4\u3001\u5e94\u7528\u542f\u52a8","text":"# mikigo\n \u5728UI\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u4e00\u5207\u64cd\u4f5c\u7684\u90fd\u662f\u4ece\u5e94\u7528\u542f\u52a8\u5f00\u59cb\u7684\uff0c\u800c\u5728Linux\u684c\u9762\u5e94\u7528\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u6211\u4eec\u542f\u52a8\u5e94\u7528\u7684\u65b9\u6cd5\u6709\u591a\u79cd\uff0c\u4e0b\u9762\u505a\u4e00\u4e2a\u7b80\u5355\u7684\u4ecb\u7ecd\uff1a \u3010\u4f7f\u7528dogtail\u542f\u52a8\u3011 dogtail\u63d0\u4f9b\u4e86\u5e94\u7528\u542f\u52a8\u7684\u65b9\u6cd5\uff0c\u5728utils\u5e93\u4e2d\uff0c\u4f7f\u7528run\u65b9\u6cd5\u542f\u52a8\uff1a \u9996\u5148\u5bfc\u5165\u65b9\u6cd5\uff1a from dogtail.utils import *\n \u8c03\u7528run\u65b9\u6cd5 run('deepin-music')\n \u5373\u53ef\u542f\u52a8\u97f3\u4e50 \u8fd9\u79cd\u65b9\u6cd5\u7684\u4f18\u70b9\u662f\u91c7\u7528\u8fdb\u7a0b\u7684\u65b9\u5f0f\u76f4\u63a5\u542f\u52a8\uff0c\u4e0d\u4f9d\u8d56\u4e0eUI\uff0c\u65e0\u8bba\u684c\u9762\u6216\u4efb\u52a1\u680f\u4e0a\u662f\u5426\u5b58\u5728\u5e94\u7528\u56fe\u6807\uff0c\u90fd\u53ef\u4ee5\u6b63\u5e38\u542f\u52a8\u3002 \u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c \u5982\u679c\u4f7f\u7528ssh\u8fdc\u7a0b\u8c03\u7528\uff0c\u6216\u8005Jenkins\u4e2d\u6267\u884c\u6d4b\u8bd5\u811a\u672c\u7684\u65f6\u5019\uff0c\u5728sniff\u4e2d\u4f1a\u51fa\u73b0\u627e\u4e0d\u5230\u5e94\u7528\uff0c\u7ecf\u8fc7\u5206\u6790\uff0c\u53ef\u80fd\u662f\u56e0\u4e3a\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\u542f\u52a8\u7684\u65f6\u5019\uff0c\u5b9e\u9645\u662f\u91c7\u7528\u4e00\u4e2a\u5b50\u8fdb\u7a0b\u542f\u52a8\u4e86\u5e94\u7528\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u5230\u3002 \u3010\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u3011 \u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807 \u901a\u5e38\u6709\u4e24\u79cd\u65b9\u6cd5\uff1a \uff081\uff09\u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807\u3002 \uff082\uff09\u5df2\u77e5\u5e94\u7528\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u7684\u4f4d\u7f6e\uff0c\u7136\u540e\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u5bf9\u5e94\u5750\u6807\u3002 \u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u7f3a\u70b9\u662f\u4f4d\u7f6e\u5fc5\u987b\u56fa\u5b9a\uff0c\u5982\u679c\u79fb\u52a8\u4f4d\u7f6e\u5c31\u4e0d\u884c\u4e86\uff0c\u800c\u4f7f\u7528\u7b2c\u4e00\u79cd\u65b9\u6cd5\uff0c\u65e0\u8bba\u4f4d\u7f6e\u5728\u54ea\u91cc\uff0c\u53ea\u8981\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u5b58\u5728\u5373\u53ef\u3002 \u3010\u70b9\u51fb\u684c\u9762\u56fe\u6807\u542f\u52a8\u3011 \u684c\u9762\u56fe\u6807\u76ee\u524d\u662f\u91c7\u7528\u56fe\u50cf\u8bc6\u522b\u6280\u672f\uff0c\u5b9a\u4f4d\u5230\u5e94\u7528\u56fe\u6807\u7684\u5750\u6807\uff0c\u7136\u540e\u901a\u8fc7pyauogui\u8fdb\u884c\u70b9\u51fb\u64cd\u4f5c\u3002 \u8be6\u7ec6\u6280\u672f\u65b9\u6848\u53ef\u4ee5\u53c2\u8003\u6211\u7684\u53e6\u5916\u4e24\u7bc7\u535a\u5ba2: \u57fa\u4e8eopencv\u7684\u6a21\u677f\u5339\u914d\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd4\u56de\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 Python\u4e09\u65b9\u5e93PyAutoGui\u7684\u4f7f\u7528\u65b9\u6cd5 \u3010\u4ece\u542f\u52a8\u5668\u542f\u52a8\uff08\u4fd7\u79f0\u5f00\u59cb\u83dc\u5355\uff09\u3011 \u542f\u52a8\u4e2d\u542f\u52a8\u7684\u5b9e\u73b0\u903b\u8f91\u5b9e\u9645\u548c\u4efb\u52a1\u680f\u4e0a\u542f\u52a8\u5dee\u4e0d\u591a\u3002 \u9996\u5148\uff0c\u9700\u8981\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u542f\u52a8\u5668\u56fe\u6807\uff0c\u6216\u8005\u952e\u76d8super\u952e\uff0c\u5c06\u542f\u52a8\u5668\u547c\u51fa\u6765\uff0c \u7136\u540e\uff0c\u5728\u542f\u52a8\u5668\u4e2d\u70b9\u51fb\u5bf9\u5e94\u7684\u56fe\u6807\uff0c \u4f46\u662f\u8fd9\u91cc\u6709\u4e2a\u95ee\u9898\uff0c\u542f\u52a8\u5668\u4e2d\u7684\u5e94\u7528\u5217\u8868\uff0c\u4e00\u9875\u5c55\u793a\u4e0d\u5b8c\uff0c\u6240\u4ee5\u5982\u679c\u6211\u4eec\u8981\u70b9\u51fb\u7684\u5e94\u7528\u56fe\u6807\u4e0d\u5728\u7b2c\u4e00\u9875\u600e\u4e48\u529e\uff0c\u901a\u5e38\u89e3\u51b3\u65b9\u6848\u6709\u4e24\u79cd\uff1a \uff081\uff09\u9700\u8981\u8fdb\u884c\u5411\u4e0b\u6ed1\u52a8\uff0c\u8fd9\u91cc\u5c31\u6d89\u53ca\u5230\u76f8\u5e94\u7684\u8bc6\u522b\u65b9\u6848\uff0c\u5224\u65ad\u5982\u679c\u4e0d\u5728\u7b2c\u4e00\u9875\u5c31\u5f80\u4e0b\u6ed1\u52a8\u7ffb\u9875\u3002 \uff082\uff09\u542f\u52a8\u5668\u63d0\u4f9b\u641c\u7d22\u7684\u529f\u80fd\uff0c\u8f93\u5165\u5e94\u7528\u540d\u79f0\u641c\u7d22\uff0c\u7136\u540e\u8fdb\u884c\u70b9\u51fb\u3002 \u4ece\u5b9e\u9645\u64cd\u4f5c\u4e2d\u6765\u770b\uff0c\u91c7\u7528\u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u6548\u7387\u4f1a\u9ad8\u4e00\u70b9\u3002 \u3010\u7ec8\u7aef\u547d\u4ee4\u542f\u52a8\u3011 \u5728python\u4e2d\uff0c\u4f7f\u7528os.popen()\u6216os.system()\u6216\u8005subprocess.Popen()\uff0c\u5b9e\u73b0\u547d\u4ee4\u884c\u542f\u52a8\uff0c\u6bd4\u5982\uff1a import os\nos.popen('deepin-music')\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u8fdc\u7a0b\u6267\u884c\u811a\u672c\u7684\u65f6\u5019\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u7684\u95ee\u9898\u3002 \u3010\u603b\u7ed3\u3011 \u4ee5\u4e0a\u51e0\u79cd\u65b9\u6cd5\uff0c\u5404\u6709\u4f18\u7f3a\u70b9\uff0c\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff1a \uff081\uff09\u5982\u679c\u9700\u8981\u5728Jenkins\u4e2d\u505a\u6301\u7eed\u96c6\u6210\uff0c\u5efa\u8bae\u4f7f\u7528\u7b2c\u4e8c\u79cd\u4efb\u52a1\u680f\u542f\u52a8\u7684\u65b9\u6cd5\u3002 \uff082\uff09\u5982\u679c\u4e0d\u4f1a\u91c7\u7528\u8fdc\u7a0b\u6267\u884c\u7684\uff0c\u5efa\u8bae\u91c7\u7528\u7b2c\u4e00\u79cd\u6216\u8005\u6700\u540e\u4e00\u79cd\u65b9\u6848\u3002 \uff083\uff09\u7b2c\u4e09\u79cd\u548c\u7b2c\u56db\u79cd\u542f\u52a8\u65b9\u6cd5\uff0c\u901a\u5e38\u5728\u6d4b\u8bd5\u7528\u4f8b\u4e2d\u4f1a\u6d89\u53ca\u5230\uff0c\u6240\u4ee5\u5076\u5c14\u4f1a\u7528\u3002"},{"location":"RELEASE/","title":"\u7248\u672c\u66f4\u65b0\u8bb0\u5f55","text":""},{"location":"RELEASE/#220202395","title":"2.2.0\uff082023/9/5\uff09","text":"new \u6b63\u5f0f\u542f\u7528 letmego \u6280\u672f\u65b9\u6848\uff1b fix \u5bf9 docs \u91cc\u9762\u7ec6\u5316\u4e86\u8fdc\u7a0b\u6267\u884c\u7ae0\u8282\u7684\u63cf\u8ff0\uff1b "},{"location":"RELEASE/#2152023831","title":"2.1.5\uff082023/8/31\uff09","text":"new \u5c06\u6709\u8da3\u7684\u6587\u6863\u7cfb\u7edf\u8fc1\u79fb\u5230 linuxdeepin \uff0c\u5265\u79bb\u6587\u6863\u4e2d\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u91c7\u7528 CDN \u52a0\u901f\u65b9\u5f0f\u52a0\u8f7d\uff1b \u5c1d\u8bd5\u5408\u5165\u4e00\u4e2a\u6709\u8da3\u7684\u529f\u80fd\uff1b fix \u4fee\u590d\u4e86 Wayland \u952e\u9f20\u5de5\u5177\u6ca1\u6709\u9f20\u6807\u76f8\u5bf9\u79fb\u52a8\u65b9\u6cd5 moveRel \u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 Wayland \u4e0b\u83b7\u53d6\u7a97\u53e3\u4fe1\u606f\u529f\u80fd\u6a21\u5757\u4e2d\u73af\u5883\u53d8\u91cf\u7684\u95ee\u9898\uff1b \u4f18\u5316\u4e86 startproject \u529f\u80fd\u7684\u4e00\u4e9b\u4fe1\u606f\u8f93\u51fa\uff1b \u4fee\u590d\u4e86\u7279\u6b8a\u573a\u666f\u4e0b env_dev.sh \u5f00\u53d1\u73af\u5883\u90e8\u7f72\u662f\u53ef\u80fd\u5f71\u54cd\u5230\u6b63\u5f0f\u73af\u5883 env.sh \u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#2122023822","title":"2.1.2\uff082023/8/22\uff09","text":"new \u589e\u52a0 OCR \u8bc6\u522b\u81ea\u52a8\u91cd\u8bd5\u673a\u5236\uff0c\u9ed8\u8ba4\u91cd\u8bd5 2 \u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u91cd\u8bd5\u6b21\u6570\uff1b \u4f7f\u7528\u7a97\u7ba1\u6700\u65b0\u63d0\u4f9b\u7684\u4e8c\u8fdb\u5236\u63a5\u53e3\uff0c\u4f18\u5316\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u5728 Wayland \u4e0b\u83b7\u53d6\u7a97\u53e3\u4fe1\u606f\u7684\u65b9\u6cd5\uff1b\u611f\u8c22\u684c\u9762\u6d4b\u8bd5\u90e8 @\u4f55\u6743 @\u5b59\u7fe0 \u3001\u7a97\u7ba1\u7814\u53d1 @\u9ec4\u6cfd\u94ed \u7684\u5927\u529b\u652f\u6301\u3002 \u6269\u5145 skipif \u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\u51fd\u6570\uff1a skipif_xdg_type \u652f\u6301 x11 \u6216 wayland \u4e0a\u8df3\u8fc7\uff1b skipif_cpu_name \u652f\u6301\u4e0d\u540c cpu \u4e0a\u8df3\u8fc7\uff0c\u6bd4\u5982\uff1askipif_cpu_name-KLVVW5821\uff1b "},{"location":"RELEASE/#2102023818","title":"2.1.0\uff082023/8/18\uff09","text":"fix \u4fee\u590d SW \u67b6\u6784\u73af\u5883\u4f9d\u8d56\u7684\u95ee\u9898\uff0c\u539f\u56e0\u662f\u4e4b\u524d\u6211\u8fd9\u91cc\u672c\u5730\u6ca1\u6709 SW \u7684\u673a\u5668\uff0c\u6ca1\u6709\u505a\u76f8\u5173\u9002\u914d\uff1b \u4fee\u590d\u5b50\u9879\u76ee\u5355\u72ec\u9700\u8981\u4e09\u65b9\u5305 pexpect\uff0c\u7531\u4e8e\u4e4b\u524d\u662f\u9884\u88c5\u5230\u955c\u50cf\u91cc\u9762\u7684\uff0c\u4f46\u57fa\u7840\u6846\u67b6\u4e0d\u9700\u8981\uff0c\u56e0\u6b64\u6ca1\u6709\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u91cc\u9762\uff0c\u5bfc\u81f4\u5b50\u9879\u76ee\u4f9d\u8d56\u62a5\u9519\u3002 \u4fee\u590d\u5b50\u9879\u76ee cv \u5bfc\u5165\u62a5\u9519\u7684\u95ee\u9898\uff1b \u539f\u56e0\u4e3a\uff1ayouqu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u517c\u5bb9\u4e24\u79cd\u60c5\u51b5\uff0c\u4e00\u79cd\u662f\u9762\u5411\u670d\u52a1\uff0c\u5c31\u662f\u672c\u5730\u6d4b\u8bd5\u673a\u4e0d\u9700\u8981\u5b89\u88c5 OpenCV\uff0c\u7528\u4f8b\u4e2d\u7684\u56fe\u50cf\u8bc6\u522b\u4f1a\u901a\u8fc7\u8fdc\u7a0b\u670d\u52a1\u63a5\u53e3\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u548c\u7ed3\u679c\u83b7\u53d6\uff1b\u7b2c\u4e8c\u79cd\u662f\u539f\u751f\uff0c\u5c31\u662f\u672c\u5730\u76f4\u63a5\u5b89\u88c5 OpenCV \u76f4\u63a5\u7528\u3002\u4e24\u4e2a\u60c5\u51b5\u7684\u4f18\u5148\u7ea7\u662f\u4f18\u5148\u5224\u65ad\u672c\u5730\u5b58\u5728\uff0c\u5426\u5219\u8d70\u670d\u52a1\u3002 \u524d\u9762\u6211\u4eec\u5df2\u7ecf\u628a OCR \u529f\u80fd\u505a\u4e86\u670d\u52a1\u5316\uff0c\u57fa\u4e8e 1 \u5e74\u591a\u4ee5\u6765\u7684\u89c2\u5bdf\uff0c\u7528\u8d77\u6765\u5f88\u7a33\u5b9a\uff0c\u518d\u4e00\u4e2a\u5c31\u662f OpenCV \u5b89\u88c5\u5305\u662f\u6bd4\u8f83\u81c3\u80bf\u7684\uff0c\u7c97\u7565\u6570\u4e86\u4e0b\u4f9d\u8d56\u6709 30+ \u4e2a\uff0c\u800c\u4e14\u5728\u5404\u67b6\u6784\u4e0a\u4f9d\u8d56\u5305\u8fd8\u4e0d\u5c3d\u76f8\u540c\uff0c\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u65b9\u6848\u4e2d\u4e0d\u592a\u597d\u5904\u7406\uff0c\u6240\u4ee5\u672c\u6b21 2.0 \u7248\u672c\u6211\u4eec\u5927\u80c6\u7684\u5c06\u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u529f\u80fd\u4fee\u6539\u4e3a\u9762\u5411\u670d\u52a1\u7684\u65b9\u5f0f\uff0c\u524d\u671f\u6d4b\u8bd5\u4e00\u5207\u770b\u8d77\u6765\u90fd\u5f88\u548c\u8c10\u3002 \u4f46\u662f\u6ca1\u6ce8\u610f\u5230\u4e4b\u524d\u7ed9\u6d77\u71d5\u59d0\u90a3\u8fb9\u9879\u76ee\u5355\u72ec\u5b9a\u5236\u505a\u4e86\u4e2a\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\uff08\u4e3a\u4e86\u80fd\u7b80\u5355\u5e73\u6ed1\u7684\u8fc1\u79fb\u5230 youqu\uff09\uff0c\u6b64\u63a5\u53e3\u5e95\u5c42\u6ca1\u6709\u517c\u5bb9\u670d\u52a1\u5316\uff0c\u6240\u4ee5\u5979\u90a3\u8fb9\u7684\u9879\u76ee\u8c03\u7528\u6b64\u5b9a\u5236\u63a5\u53e3\u4f1a\u62a5 cv \u5bfc\u5165\u7684\u95ee\u9898\u3002 \u7531\u4e8e\u5c06\u8fd9\u4e2a\u5b9a\u5236\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\u8fdb\u884c\u670d\u52a1\u5316\u517c\u5bb9\u6539\u9020\u9700\u8981\u4e00\u5b9a\u65f6\u95f4\uff0c\u6539\u5b8c\u8fd8\u9700\u8981\u6d4b\u8bd5\uff0c\u4f46\u672c\u6b21\u65f6\u95f4\u6bd4\u8f83\u7d27\uff0c\u56e0\u6b64\u5148\u628a OpenCV \u88c5\u8fdb\u865a\u62df\u73af\u5883\uff0c\u540e\u7eed\u7248\u672c\u518d\u8003\u8651\u9488\u5bf9\u6b64\u63a5\u53e3\u505a\u4fee\u6539\u3002"},{"location":"RELEASE/#2002023816","title":"2.0.0\uff082023/8/16\uff09","text":"YouQu\uff08\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff09\u5f00\u6e90\u4e86\uff0c\u540c\u65f6\u63a8\u51fa\u4e86 2.0 \u7248\u672c\u3002 \u611f\u8c22\u738b\u6ce2\u603b\u3001\u67b6\u6784\u5e08\u5f90\u5c0f\u4e1c\u3001\u7814\u53d1\u7ecf\u7406\u90d1\u5e7c\u6208\u3001\u5218\u90d1\u7b49\u7814\u53d1\u540c\u4e8b\u7684\u5927\u529b\u652f\u6301\u3002 new 1\u3001\u65b0\u7684\u57fa\u7840\u6846\u67b6\u4ee3\u7801\u83b7\u53d6\u65b9\u5f0f\u53ca\u65b0\u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4 YouQu \u540e\u7eed\u5747\u901a\u8fc7 PyPI \u8fdb\u884c\u5305\u7684\u53d1\u5e03\uff0c\u4e5f\u5c31\u662f\u8bf4\u540e\u7eed\u53ef\u4ee5\u4f7f\u7528 pip \u8fdb\u884c\u5b89\u88c5\uff1a sudo pip3 install youqu==2.0.0\n \u8fd9\u91cc\u6709 2 \u4e2a\u5c0f\u70b9\u8981\u6ce8\u610f\uff1a \u63a8\u8350\u4f7f\u7528 sudo pip3 \uff08\u52a0 sudo\uff09\u8fdb\u884c\u5b89\u88c5\uff1b \u5982\u679c\u4e0d\u52a0 sudo \u6709\u4e9b\u673a\u5668\u53ef\u80fd $HOME/.local/bin \u4e0d\u5728\u7cfb\u7edf PATH \u73af\u5883\u76ee\u5f55\u4e0b\uff0c\u5728\u4e0d\u6dfb\u52a0\u73af\u5883\u53d8\u91cf\u7684\u60c5\u51b5\u4e0b\uff0c\u4f1a\u51fa\u73b0 YouQu \u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4\uff08youqu-startproject\uff09\u65e0\u6cd5\u4f7f\u7528\u7684\u95ee\u9898\uff1b \u5f53\u7136\uff0c\u5c06\u4e0a\u8ff0\u8def\u5f84\u6dfb\u52a0\u5230\u73af\u5883\u53d8\u91cf\u4e4b\u540e\u4e5f\u662f\u53ef\u4ee5\u7528\u7684\uff0c\u6240\u4ee5\u6211\u8fd9\u91cc\u662f\u63a8\u8350\u52a0 sudo\uff0c\u4e0d\u52a0 sudo \u4e5f\u662f\u53ef\u4ee5\u7684\uff0c\u53ea\u662f\u9700\u8981\u5173\u6ce8\u4e0b\u73af\u5883\u53d8\u91cf\u7684\u95ee\u9898\u3002 \u63a8\u8350\u6307\u5b9a\u7248\u672c\u53f7\uff08youqu==2.0.0\uff09\u5b89\u88c5\uff0c\u5982\u679c\u4e0d\u6307\u5b9a\u7248\u672c\u53f7\u9ed8\u8ba4\u662f\u5b89\u88c5\u6700\u65b0\u53d1\u5e03\u7684 YouQu \u7248\u672c\uff0c\u4f60\u53ef\u4ee5\u5728 PyPI \u4e0a\u7684 Release history \u91cc\u9762\u67e5\u770b\u6709\u54ea\u4e9b\u7248\u672c\u3002 \u5b89\u88c5\u4e4b\u540e\u4f1a\u81ea\u52a8\u751f\u6210\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu-startproject\uff0c\u4f7f\u7528\u5b83\u53ef\u4ee5\u521d\u59cb\u5316\u5de5\u7a0b\uff0c\u8fd9\u91cc\u4ee5\u97f3\u4e50\u4e3e\u4f8b\uff1b youqu-startproject autotest_deepin_music\n \u8fd9\u6837\u5c31\u4f1a\u5728\u5f53\u524d\u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a autotest_deepin_music \u76ee\u5f55\uff0c\u91cc\u9762\u5305\u542b\u4e86\u57fa\u7840\u6846\u67b6\u6240\u6709\u7684\u4ee3\u7801\uff1b \u4e4b\u540e\uff0c\u8fd8\u662f\u5728 apps \u76ee\u5f55\u4e0b\uff0c\u653e\u5165\u5b50\u9879\u76ee\u7684AT\u4ee3\u7801\u5373\u53ef\uff0c\u4f7f\u7528\u65b9\u6cd5\u548c\u8fc7\u53bb\u4e00\u6837\uff0c\u8fd9\u91cc\u5c31\u4e0d\u591a\u4ecb\u7ecd\u3002 \u53e6\u5916\uff0c\u9664\u4e86\u901a\u8fc7 pip \u83b7\u53d6\u4ee5\u5916\uff0c\u4ecd\u7136\u53ef\u4ee5\u901a\u8fc7\u6e90\u7801\u83b7\u53d6\uff08\u76f4\u63a5 git clone\uff09\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u4f7f\u7528 pip \u5b89\u88c5 YouQu \u65f6\uff0cYouQu \u5305\u7684\u5927\u5c0f\u624d 600+ k\uff0c\u5b89\u88c5\u901f\u5ea6\u8d77\u98de\u3002 2\u3001\u65b0\u7684AT\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848 \u4e3a\u4e86\u89e3\u51b3\u4ee5\u4e0b\u95ee\u9898\uff1a \u8fc7\u53bb\u4e00\u6bb5\u65f6\u95f4\u54b1\u4eec\u7ecf\u5e38\u51fa\u73b0\u7684\uff0c\u4e0d\u540c\u7684AT\u9879\u76ee\u5728\u540c\u4e00\u53f0\u673a\u5668\u4e0a\u90e8\u7f72\u73af\u5883\u65f6\u4f9d\u8d56\u7248\u672c\u51b2\u7a81\u7684\u95ee\u9898\uff0c\u65b0\u65b9\u6848\u4e0d\u540c\u7684\u9879\u76ee\u4f1a\u52a8\u6001\u751f\u6210\u81ea\u5df1\u7684\u865a\u62df\u73af\u5883\uff0c\u76f8\u4e92\u4e4b\u95f4\u4e0d\u5f71\u54cd\uff1b \u4e1a\u5185\u4e3a\u4e86\u89e3\u51b3\u7248\u672c\u51b2\u7a81\u95ee\u9898\u4e00\u822c\u90fd\u4f1a\u4f7f\u7528Python\u865a\u62df\u73af\u5883\u7684\u5de5\u5177\uff0c\u4f46\u662f\u90fd\u6709\u4e2a\u95ee\u9898\uff0c\u65e0\u6cd5\u7ba1\u7406 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u5305\uff0c\u672c\u6b21\u6211\u4eec\u89e3\u51b3\u4e86\u8fd9\u4e2a\u95ee\u9898\uff0c\u80fd\u591f\u5b8c\u5168\u7ba1\u7406\u5e38\u89c4\u7684Python\u5305\uff0c\u4e5f\u80fd\u7ba1\u7406\u5230 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u4e09\u65b9\u5305\uff1b \u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u4f7f\u7528\u65b9\u6cd5\uff1a bash env.sh\n \u53ef\u4ee5\u770b\u51fa\u6765\u548c\u539f\u6765\u4f7f\u7528\u65b9\u6cd5\u6ca1\u6709\u53d8\u5316\uff0c\u4e5f\u5c31\u662f\u8bf4\u4ece\u4f7f\u7528\u7684\u89d2\u5ea6\u662f\u5b8c\u5168\u6ca1\u6709\u533a\u522b\u7684\uff0c\u53ea\u662f\u5185\u90e8\u505a\u4e86\u4e0d\u540c\u7684\u4e8b\u60c5\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u672c\u673a\u90e8\u7f72\u7684\u529f\u80fd\u4ecd\u7136\u4fdd\u7559 env_dev.sh\uff0c\u53ef\u4ee5\u4f5c\u4e3a\u5f00\u53d1\u65f6\u7684\u73af\u5883\u90e8\u7f72\u3002 3\u3001\u65b0\u7684\u9a71\u52a8\u547d\u4ee4 \u8fc7\u53bb\u54b1\u4eec\u90fd\u662f\u4f7f\u7528\u8fd9\u6837\u7684\u547d\u4ee4\u6765\u9a71\u52a8\u6267\u884c\uff1a python3 manage.py run\n \u7531\u4e8e\u9ed8\u8ba4\u57fa\u4e8e\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848\uff0c\u56e0\u6b64\u6211\u4eec\u589e\u52a0\u4e86\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu\uff1b \u65b0\u7684\u9a71\u52a8\u65b9\u5f0f\uff1a youqu manage.py run\n \u53ea\u9700\u8981\u628a python3 \u66ff\u6362\u6210 youqu \u5c31\u53ef\u4ee5\u4e86\uff0c\u770b\u8d77\u6765\u5f88\u548c\u8c10~ 4\u3001\u65b0\u7684\u6587\u6863\u5730\u5740 \u8fc7\u53bb\u54b1\u4eec YouQu \u7684\u5728\u7ebf\u6587\u6863\u662f\u90e8\u7f72\u5728\u516c\u53f8\u5185\u7f51\u7684\uff0c\u73b0\u5728\u5f00\u6e90\u5230 github \u4e86\uff0c\u5916\u90e8\u5f00\u53d1\u8005\u80af\u5b9a\u8bbf\u95ee\u4e0d\u5230\u5185\u7f51\u7684\u6587\u6863\uff0c\u56e0\u6b64\u9700\u8981\u5c06\u6587\u6863\u90e8\u7f72\u5230\u516c\u7f51\u3010\u516c\u7f51\u6587\u6863\u3011\uff1b \u516c\u7f51\u6587\u6863\u4f7f\u7528\u7684\u662f github pages\uff08\u767d\u5ad6\u602a\u4e00\u987f\u72c2\u559c~~\uff09\uff0c\u4f46\u53ef\u80fd\u4f1a\u51fa\u73b0\u6587\u6863\u901f\u5ea6\u6162\u7684\u95ee\u9898\uff08\u4ee3\u7406\u4e0b\u5c31\u597d\u4e86\uff09\uff0c\u4e0d\u8fc7\u6ca1\u5173\u7cfb\uff0c\u54b1\u4eec\u3010\u5185\u7f51\u6587\u6863\u3011\u4ecd\u7136\u4fdd\u7559\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u3002 5\u3001\u5176\u4ed6\u4e00\u4e9b\u5c0f\u5c0f\u529f\u80fd\u66f4\u65b0\uff1a \uff081\uff09\u65b0\u589e\u5173\u95ed\u5206\u8fa8\u7387\u68c0\u6d4b\u7684\u53c2\u6570\u503c\uff1b youqu manage.py run --resolution no\n \u6216\u8005\u4fee\u6539 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387, \u6bd4\u5982\uff1a1920x1080\n;no: \u8868\u793a\u4e0d\u505a\u5206\u8fa8\u7387\u6821\u9a8c\nRESOLUTION = 1920x1080\n resolution \u8fd9\u4e2a\u53c2\u6570\u4e00\u76f4\u90fd\u6709\u7684\uff0c\u53ea\u4e0d\u8fc7\u4e4b\u524d\u662f\u7528\u4e8e\u6307\u5b9a\u5206\u8fa8\u7387\u5927\u5c0f\uff0c\u6bd4\u5982 --resolution 1920x1080\uff0c\u4f46\u6709\u4e9b\u63a5\u53e3\u7684\u9879\u76ee\u4e0d\u9700\u8981\u8fd9\u4e2a\u68c0\u67e5\uff0c\u53ef\u4ee5\u7ed9\u5b83\u4e2a no \u5c31\u597d\u4e86\uff0c\u5f53\u7136 CICD \u4e0a\u5173\u95ed\uff0c\u9700\u8981\u6d41\u6c34\u7ebf\u4e0a\u628a\u8fd9\u4e2a\u53c2\u6570\u52a0\u4e0a\uff1b \uff082\uff09\u65b0\u589e\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u7684\u547d\u4ee4\u884c\u53c2\u6570 \u4e4b\u524d\u8fd9\u4e2a\u914d\u7f6e\u9879\u53ea\u80fd\u5728 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c 1 \u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff0cRERUN >= RECORD_FAILED_CASE\u3002\n;1.\u5173\u95ed\u5f55\u5c4f\uff1aRECORD_FAILED_CASE > RERUN\n;2.\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1aRECORD_FAILED_CASE = 0\nRECORD_FAILED_CASE = 1\n \u73b0\u5728\u5c06\u5f00\u53d1\u5230\u547d\u4ee4\u884c\u53c2\u6570\u3002 youqu manage.py run --record_failed_case 2\n fix \u4fee\u590d remote \u6267\u884c\u65f6\uff0c\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u65e0\u6cd5\u751f\u6210\u6d4b\u8bd5\u62a5\u544a\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1302023710","title":"1.3.0\uff082023/7/10\uff09","text":"fix \u8fdb\u4e00\u6b65\u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b\u53c2\u8003\uff1a\u914d\u7f6ePython\u6e90\u7684\u51e0\u79cd\u65b9\u6cd5 \u4fee\u590d wayland_autotool \u53d7\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86wayland\u4e0b\u5076\u73b0\u627e\u4e0d\u5230 .Xauthority \u6587\u4ef6\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1292023626","title":"1.2.9\uff082023/6/26\uff09","text":"fix \u4f18\u5316\u8fdc\u7a0b\u6267\u884c remote \u7684\u53c2\u6570\u76f4\u63a5\u4f20\u7ed9\u8fdc\u7a0b\u673a\u5668\u7684 run \u547d\u4ee4\uff0c\u4e0d\u7528\u518d\u5355\u72ec\u5904\u7406\u8fdc\u7a0b\u6267\u884c\u7684\u53c2\u6570\u903b\u8f91\uff0c\u540e\u7eed\u4e13\u6ce8\u4e8e\u672c\u5730\u6267\u884c\u529f\u80fd\u5f00\u53d1\uff0c\u8fdc\u7a0b\u6267\u884c\u81ea\u52a8\u9002\u7528\uff1b env.sh \u79fb\u9664 pyyaml \u5b89\u88c5\uff0c\u7531\u5b50\u9879\u76ee\u5728 requirement.txt \u91cc\u9762\u5b9a\u4e49\uff0c\u6846\u67b6\u81ea\u52a8\u52a0\u8f7d\uff1b \u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b "},{"location":"RELEASE/#128202369","title":"1.2.8\uff082023/6/9\uff09","text":"fix \u4fee\u590d\u4e86 pypi \u5b89\u88c5 numpy \u5b58\u5728\u7cfb\u7edf\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#127202368","title":"1.2.7\uff082023/6/8\uff09","text":"fix env.sh \u4e2d\u5b89\u88c5 Python \u5305\u672a\u6307\u5b9a\u7248\u672c\u65f6\uff0c\u65e5\u5fd7\u8f93\u51fa\u5b89\u88c5\u7684\u7248\u672c\uff1b pdocr-rpc 2.0.1\nallure-custom 1.2.1\nfunnylog 1.1.3\n \u4fee\u590d -f \u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u62a5\u9519\u7684\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#126202367","title":"1.2.6\uff082023/6/7\uff09","text":"fix \u4fee\u590d wayland \u4e0a\u8c03\u7528\u9f20\u6807\u4e2d\u952e\u3001\u53f3\u952e\u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b \u4fee\u590d pubilic/dde_desktop_public_widget \u91cc\u9762\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u5b9a\u4f4d\u684c\u9762\u6587\u4ef6\u7684\u65b9\u6cd5\uff0c\u5750\u6807\u6ca1\u6709\u62c6\u5305\u7684\u95ee\u9898\uff1b \u4f18\u5316\u4e86\u7b49\u5f85\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b pycreeze \u7248\u672c\u5347\u7ea7\u5230 0.1.29\uff0c\u5bfc\u81f4\u4e0e pyautogui 0.9.53 \u4e0d\u517c\u5bb9\uff0cenv.sh \u91cc\u9762\u589e\u52a0\u6307\u5b9a pycreeze \u7248\u672c\u4e3a 0.1.28\uff1b "},{"location":"RELEASE/#1252023516","title":"1.2.5\uff082023/5/16\uff09","text":"new --app \u53c2\u6570\u540e\u9762\u65b0\u589e\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u76ee\u524d\u652f\u6301\u4e09\u79cd\u53c2\u6570\u4f20\u5165\u65b9\u5f0f\uff1a ~$: youqu run -a deepin-music\n~$: youqu run -a autotest_deepin_music\n~$: youqu run -a apps/autotest_deepin_music\n \u200b \u540e\u4e24\u79cd\u5165\u53c2\u65b9\u5f0f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\u3002 remote \u8fdc\u7a0b\u6267\u884c\u65b0\u589e\u4ece\u547d\u4ee4\u884c\u4f20\u5165\u6d4b\u8bd5\u673a\u4fe1\u606f\uff0c\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679c password \u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6 setting/remote.ini \u4e2d CLIENT_PASSWORD \u7684\u503c,\u6bd4\u5982\uff1auos@10.8.13.33:1 \u6216 uos@10.8.13.33 \uff1b python3 manage.py remote -c uos@10.8.13.33/uos@10.8.13.34\npython3 manage.py remote -c uos@10.8.13.33:1/uos@10.8.13.34:2\n fix \u65e5\u5fd7\u6a21\u5757\u4fee\u6539\u4e3a\u51fd\u6570\u6267\u884c\u4e4b\u524d\u6253\u5370\u65e5\u5fd7\uff1b \u65e5\u5fd7\u6a21\u5757\u589e\u52a0\u767d\u540d\u5355\uff0c\u901a\u8fc7\u7c7b\u540d\u5f00\u5934\uff0c\u7ed3\u675f\uff0c\u5305\u542b\u7b49\u5173\u952e\u5b57\u63a7\u5236\u9700\u8981\u6253\u5370\u7684\u51fd\u6570\u65e5\u5fd7\uff1b \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5982\u679c\u4f20\u5165\u4e86 app_name \u53ea\u4f1a\u5c06 apps \u76ee\u5f55\u4e0b app_name \u7684\u76ee\u5f55\u53d1\u9001\u5230\u6d4b\u8bd5\u673a\uff1b env.sh \u79fb\u9664 python3-dev\uff1b \u4fee\u590d Wayland \u4e0b env.sh \u73af\u5883\u5b89\u88c5\u5931\u8d25\u7684\u95ee\u9898\uff0c\u4f18\u5316\u4e86 deb \u4f9d\u8d56\u5b89\u88c5\u7684\u903b\u8f91\uff1b \u5c06 env.sh \u5237\u65b0\u6e90\u7684\u65e5\u5fd7\u5728\u7ec8\u7aef\u663e\u793a\uff0c\u89e3\u51b3\u5728 CI \u73af\u5883\u4e0b\uff0c\u957f\u65f6\u95f4\u4e0d\u8f93\u51fa\u65e5\u5fd7\u8fde\u63a5\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d1060 \u534e\u4e3a\u673a\u578b\u5b89\u88c5\u952e\u9f20\u5de5\u5177\u65f6\u4f9d\u8d56\u4e0d\u517c\u5bb9\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1242023227","title":"1.2.4\uff082023/2/27\uff09","text":"fix \u4fee\u6539 CURRENT \u6587\u4ef6\uff1b "},{"location":"RELEASE/#1232023227","title":"1.2.3\uff082023/2/27\uff09","text":"new pylint.sh \u652f\u6301\u901a\u8fc7\u4f4d\u7f6e\u53c2\u6570\u4f20\u5165\u6587\u4ef6\u8def\u5f84\uff1abash pylint.sh apps/autotest_deepin_music,\u597d\u5904\u662f\u53c2\u6570\u8def\u5f84\u53ef\u4ee5\u5728\u7ec8\u7aef\u8865\u5168\uff1b \u65b0\u589e\u7cfb\u7edf\u547d\u4ee4 youqu-pylint \uff0c\u7528\u4e8e\u9759\u6001\u4ee3\u7801\u626b\u63cf\uff0c\u4f7f\u7528\u65b9\u6cd5: youqu-pylint apps/autotest_deepin_music\uff1b \u7531\u4e8e\u7cfb\u7edf\u4e00\u4e9b dbus \u63a5\u53e3\u6539\u53d8\uff0c\u516c\u5171\u5e93\u4e2d\u7684 dbus \u65b9\u6cd5\u5c06\u4e0d\u518d\u7ef4\u62a4\uff0c\u7531\u5b50\u9879\u76ee\u5728 other_widget.py \u91cc\u9762\u8fdb\u884c\u7ef4\u62a4\uff1b fix \u4fee\u590d ssh \u73af\u5883\u4e0b\u8fd0\u884c\u63d0\u793a \u201c\u65e0\u6cd5\u8fde\u63a5\u201d \u7684\u95ee\u9898\uff1b \u4fee\u590d\u8fd0\u884c\u65f6\u7a0b\u5e8f\u9000\u51fa\uff0c\u4e0d\u8f93\u51fa\u5f02\u5e38\u65e5\u5fd7\u7684\u95ee\u9898\uff1b \u4fee\u590dyouqu remote xxx \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5728\u670d\u52a1\u7aef Ctrl + C \u65e0\u6cd5\u505c\u6b62\u7a0b\u5e8f\u8fd0\u884c\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#122202328","title":"1.2.2\uff082023/2/8\uff09","text":"new \u65b0\u589e\u6c14\u6ce1\u7c7b\u56fe\u50cf\u8bc6\u522b\u65b9\u6848\uff1bimage_utils.py::ImageUtil::get_during\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u533a\u57df\u8bc6\u522b\uff0c\u4f20\u5165 [x, y, w, h]\uff0cx: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u76ee\u6807\u56fe\u7247\uff0c\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\uff1b env.sh \u79fb\u9664 pypinyin; \u4f18\u5316\u6267\u884c env.sh \u65f6\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b manage.py \u79fb\u9664\u4e86\u53c2\u6570 session_timeout \uff0c\u6846\u67b6\u6839\u636e\u5168\u5c40\u7684 timeout \u4ee5\u53ca\u7528\u4f8b\u81ea\u5b9a\u4e49\u7684 timeout \u81ea\u52a8\u8ba1\u7b97\u51fa sessiontimeout \u7684\u503c\uff1b \u65b0\u589e ocr \u670d\u52a1\u5668\u94fe\u63a5\u91cd\u8bd5\uff0c\u9ed8\u8ba4\u91cd\u8bd51\u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u53c2\u6570\uff1b fix \u4fee\u590d\u4e86\u4e00\u4e9b pylint \u626b\u63cf\u7684\u4ee3\u7801\u98ce\u683c\u95ee\u9898\uff1b \u91cd\u65b0\u8bbe\u8ba1\u4e86\u6d4b\u8bd5\u62a5\u544a\u4e3b\u9898\uff1b "},{"location":"RELEASE/#121202316","title":"1.2.1\uff082023/1/6\uff09","text":"new \u652f\u6301\u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6267\u884c\u7528\u4f8b\uff1b\u53ef\u5c06python3 manage.py \u66ff\u6362\u4e3a youqu \uff1a youqu run -a deepin-music -k 001\n RPC \u670d\u52a1 IP \u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u6307\u5b9a\u4e0d\u540c\u7684\u7aef\u53e3\uff1b \u5728\u7ebf\u6587\u6863\u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u539f\u6765\u7684\u5730\u5740 10.8.10.215 \u5c06\u4e0d\u5728\u4f7f\u7528\uff1b fix \u4fee\u590d --count \u53c2\u6570\u53ef\u80fd\u51fa\u73b0\u4e0e\u5176\u4ed6\u6846\u67b6\u7684\u5de5\u7a0b\u4f9d\u8d56\u5b58\u5728\u51b2\u7a81\uff0c\u62a5\u9519\u91cd\u590d\u6ce8\u518c\u7684\u95ee\u9898\uff1b \u4fee\u590d CI \u73af\u5883\u4e0b\u591a\u4e2a\u5de5\u7a0b\u5b58\u5728 Python \u73af\u5883\u53d8\u91cf\u6307\u5411\u9519\u8bef\uff0c\u5bfc\u5305\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u5355\u72ec\u8fd0\u884c\u65b9\u6cd5\u65f6\u65e0\u65e5\u5fd7\u8f93\u51fa\u7684 Bug\uff1b "},{"location":"RELEASE/#12020221230","title":"1.2.0\uff082022/12/30\uff09","text":"1.1.4 \u7248\u672c\u9002\u914d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e14\u65b0\u589e\u4e86\u8f83\u591a\u65b0\u7279\u6027\uff0c\u6211\u4eec\u8ba1\u5212\u4f7f\u7528 1.1.4 \u7248\u672c\u8fd0\u884c\u4e00\u6bb5\u65f6\u95f4\uff0c1.2.0 \u7248\u672c\u5c06\u4fee\u590d\u671f\u95f4\u51fa\u73b0\u7684 Bug\uff0c\u7136\u540e\u4f5c\u4e3a\u7a33\u5b9a\u7248\u672c\u53d1\u5e03\u3002 new \u4fee\u6539\u5de5\u7a0b\u540d\u79f0\u4e3a youqu\uff1b \u5c06 sphinx \u6587\u6863\u5de5\u7a0b\u8fc1\u79fb\u5230\u5355\u72ec\u7684\u4ed3\u5e93\uff1b fix \u4fee\u590d startapp \u521b\u5efa\u5de5\u7a0b\u65f6\u5b58\u5728\u5de5\u7a0b\u540d\u79f0\u65f6\u65e0\u6cd5\u7ee7\u7eed\u521b\u5efa\uff1b \u4fee\u590d\u4e86 OCR \u670d\u52a1\u5728\u5e76\u53d1\u65f6\u53ef\u80fd\u51fa\u73b0\u65e0\u6cd5\u8fd4\u56de\u7ed3\u679c\u7684\u95ee\u9898\uff0c\u63d0\u5347 OCR \u670d\u52a1\u9ad8\u5e76\u53d1\u7a33\u5b9a\u6027\uff1b \u4fee\u590d PMS \u540c\u6b65\u6807\u7b7e\u5230 CSV \u6587\u4ef6\u4e0d\u652f\u6301\u7528\u4f8b\u5e93\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11420221214","title":"1.1.4\uff082022/12/14\uff09","text":"new \u65b0\u589e startapp \u5b50\u547d\u4ee4\u521b\u5efa\u5b50\u9879\u76ee\u5de5\u7a0b\u6a21\u677f: python3 manage.py startapp autotest_deepin_xxx \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u91cd\u590d\u6267\u884c\u6b21\u6570\uff1b \u53bb\u6389\u6279\u91cf\u6267\u884c\u524d\u6536\u96c6\u7528\u4f8b\u7684\u6b65\u9aa4\uff1b \u589e\u52a0\u5f00\u59cb\u6267\u884c\u65f6\u6253\u5370\u4e00\u4e9b\u6267\u884c\u53c2\u6570\uff0c\u5982\uff1a \u7528\u4f8b\u6536\u96c6\u6570\u91cf: 99\n\u5931\u8d25\u91cd\u8dd1\u6b21\u6570: 1\n\u6700\u5927\u5931\u8d25\u6b21\u6570: 49\n\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4: 200.0s (03\u520620\u79d2)\n\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4: 11880s (3\u5c0f\u65f618\u52060\u79d2)\n \u5b9a\u5236\u4fee\u6539allure\u62a5\u544alogo\u3001title\u3001\u9ed8\u8ba4\u8bed\u8a00\uff1b manage.py \u6267\u884c\u5f00\u59cb\u65f6\u6253\u5370 logo \u548c\u5f53\u524d\u7248\u672c\uff1a \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u255a\u2588\u2588\u2557 \u2588\u2588\u2554\u255d \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2584\u2584 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2580\u2580\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u2584\u2588 \u2584\u2588 \u2588 \u2588 \u2588 \u2584 \u2588 \u2584 \u2580\u2580\u2588 \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\uff1b \u88c5\u9970\u5668\u65b9\u6cd5\u6307\u5b9a\u6b21\u6570\uff1b @pytest.mark.count(2)\ndef test_music_001():\npass\n \u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u6b21\u6570\uff1b python3 manage.py run -a deepin-music -k 001 --count 2\n \u200b image_utils \u589e\u52a0\u51fd\u6570 save_temporary_picture\uff0c\u652f\u6301\u6307\u5b9a\u5c4f\u5e55\u533a\u57df\u622a\u56fe\u5e76\u8fd4\u56de\u56fe\u7247\u5b58\u653e\u7684\u672c\u5730\u8def\u5f84\uff0c\u540e\u7eed\u4f7f\u7528 assert_image_exist \u8fdb\u884c\u65ad\u8a00 Python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(x, y, width, height) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) button_center \u65b0\u589e btn_size \u83b7\u53d6\u63a7\u4ef6\u5de6\u4e0a\u89d2\u5750\u6807\u53ca\u957f\u5bbd\uff0c\u7528\u4e8e\u52a8\u6001\u7684\u622a\u53d6\u5143\u7d20\u7684\u56fe\u7247\uff0c\u53ef\u7528\u4e8e\u5b9a\u4f4d\u65ad\u8a00 python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u6240\u6709\u97f3\u4e50\u6309\u94ae\")) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) allure \u62a5\u544a\u4e2d\u5b9a\u4f4d\u95ee\u9898\u9664\u4e86\u65e5\u5fd7\u3001\u622a\u56fe\u3001\u5f55\u5c4f\u5916\uff0c\u8c03\u7528\u7684\u51fd\u6570\u589e\u52a0\u4e86 step \u6b65\u9aa4\u5c55\u793a\uff1b env.sh \u65b0\u589e\u5b89\u88c5\u5b50\u9879\u76ee Python \u4e09\u65b9\u4f9d\u8d56\uff0c\u5728\u5b50\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u5199 requirement.txt \u6587\u4ef6\uff0cenv.sh \u4f1a\u81ea\u52a8\u52a0\u8f7d\uff1b ocr \u8bc6\u522b\u65b0\u589e\u652f\u6301\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\u8fdb\u884c\u6587\u5b57\u8bc6\u522b\uff0c\u51cf\u5c11\u56e0\u5168\u5c4f\u8bc6\u522b\u65f6\uff0c\u5176\u4ed6\u6587\u5b57\u7684\u5e72\u6270 Python # \u65ad\u8a00\u97f3\u4e50\u7684\u5220\u9664\u5f39\u7a97\u4e2d\uff0c\u5305\u542b\u4e86\u201c\u786e\u8ba4\u201d\u7684\u6587\u5b57 self.assert_ocr_exist(\"\u786e\u8ba4\", picture_abspath=DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u5220\u9664\u5f39\u7a97\"))) \u65ad\u8a00\u51fd\u6570\u7684\u8c03\u7528\u4e5f\u4f1a\u81ea\u52a8\u6253\u5370\u65e5\u5fd7; env.sh \u65b0\u589e\u88c1\u526a\u4f9d\u8d56\u7684\u65b9\u6848\uff1b fix \u4fee\u590d Jenkins \u73af\u5883\u4e0b\uff0c apps \u76ee\u5f55\u4e0b\u5b50\u9879\u76ee\u5b58\u5728 auotest_deepin_xxx@tmp \u76ee\u5f55\uff0c\u5728\u4f20\u5165 app_name \u540e\u65e0\u6cd5\u6267\u884c\u7528\u4f8b\u7684\u95ee\u9898\uff1b \u4fee\u590d\u81ea\u52a8\u751f\u6210 case_list.csv \u6587\u4ef6\u65f6\uff0c\u7528\u4f8b\u987a\u5e8f\u88ab\u8c03\u6574\u7684\u95ee\u9898\uff1b env.sh \u73af\u5883\u5b89\u88c5\u79fb\u9664 git \u548c curl\uff1b \u4fee\u590d\u7528\u4f8b\u5728 setup \u9636\u6bb5\u62a5\u9519\u540e\uff0c\u672a\u5199\u5165 ci_result.json \u7684\u95ee\u9898\uff1b \u79fb\u9664 uos_ci.py\uff1b "},{"location":"RELEASE/#11320221028","title":"1.1.3\uff082022/10/28\uff09","text":"new \u65b0\u589e\u56fe\u50cf\u65ad\u8a00\u6210\u529f\u8f93\u51fa\u5339\u914d\u5ea6\uff1b \u65b0\u589e\u73af\u5883\u5b89\u88c5 yaml \u4f9d\u8d56\uff1b \u65b0\u589e\u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6570\u636e\u56de\u586b\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b \u65b0\u589e\u6d4b\u8bd5\u7ed3\u679c\u8868\u60c5\u663e\u793a\uff0c\u5e76\u4f18\u5316\u4e86\u65e5\u5fd7\u7684\u6392\u7248\uff1b \u65b0\u589e --top {number} \u7528\u4e8e\u8bb0\u5f55\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0c\u65e5\u5fd7\u751f\u6210\u5230 report/logs/top.log\uff1b fix \u4fee\u590d\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4f46\u7ec8\u7aef\u6ca1\u6709\u9519\u8bef\u65e5\u5fd7\u8f93\u51fa\u7684\u95ee\u9898\uff1b \u4fee\u6539\u5931\u8d25\u7528\u4f8b\u56de\u6eaf\u65e5\u5fd7\u4e3a\u8be6\u7ec6\u7ea7\u522b\uff1b \u4fee\u590d\u4e86\u6267\u884c\u8fdb\u5ea6\u672a\u8ba1\u7b97\u8df3\u8fc7\u7528\u4f8b\u7684\u95ee\u9898\uff0c\u5e76\u4f18\u5316\u4e86\u8fdb\u5ea6\u83b7\u53d6\u7684\u7b97\u6cd5\uff1b \u4fee\u590d env.sh \u5728 V23 \u73af\u5883\u4e0b\u5b89\u88c5\u65e0\u6cd5\u8bfb\u53d6\u5bc6\u7801\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 pms \u6d4b\u8bd5\u5957\u6267\u884c\u6216\u6d4b\u8bd5\u5355\u6267\u884c\u65f6\uff0c\u7528\u4f8bID\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b env.sh \u91cc\u9762 hub.deepin.com \u66f4\u6362\u6210 it.uniontech.com\uff1b uos_ci.py \u6d4b\u8bd5\u7ed3\u679c\u7edf\u8ba1\u65f6\uff0c\u603b\u6570\u5254\u9664 skip \u7684\u6570\u91cf "},{"location":"RELEASE/#11220220921","title":"1.1.2\uff082022/09/21\uff09","text":"new \u5728\u6ca1\u6709\u5b89\u88c5 dogtail \u7684\u60c5\u51b5\u4e0b\uff0c\u4e5f\u80fd\u4f7f\u7528 sniff \u5de5\u5177\uff1b fix \u4fee\u590d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e2d\u6ca1\u6709\u5b89\u88c5 AT \u73af\u5883\u6267\u884c uos_ci.py \u62a5\u9519\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11120220919","title":"1.1.1\uff082022/09/19\uff09","text":"new \u65b0\u589e\u6267\u884c\u8fdb\u5ea6\u663e\u793a\uff0c\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u65f6\u65e5\u5fd7\u8f93\u51fa\u5f53\u524d\u8fdb\u5ea6\uff1a[\u5f53\u524d\u6307\u5b9a\u7b2c\u51e0\u6761/\u7528\u4f8b\u603b\u6570]\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u7528\u4f8b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\u6240\u6709\u5931\u8d25\u7528\u4f8b\u7684\u5217\u8868\uff1b \u5173\u95ed\u7ec8\u7aef\u8f93\u51fa\u6355\u83b7\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u65e5\u5fd7\u5feb\u7167\uff1b \u4f18\u5316\u7ec8\u7aef\u8f93\u51fa\u5931\u8d25\u4fe1\u606f\u5197\u957f\u4e3a\u7b80\u8981\u4fe1\u606f\u8f93\u51fa\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u663e\u793a 10 \u4e2a\u6267\u884c\u6700\u6162\u7684\u7528\u4f8b\u5217\u8868\uff0c\u5e76\u8be6\u7ec6\u5217\u51fa\u5404\u4e2a\u9636\u6bb5\u7684\u8017\u65f6\uff1b \u5931\u8d25\u91cd\u8dd1\u7528\u4f8b\u91cd\u8dd1\u4e4b\u524d\u5ef6\u8fdf 1 \u79d2\uff1b \u65b0\u589e\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4ecd\u7136\u5f3a\u5236\u6267\u884c\uff1b \u7528\u4f8b\u6536\u96c6\u65f6\u4ec5\u5728 apps \u76ee\u5f55\u4e0b\u8fdb\u884c\uff0c\u5ffd\u7565 src,setting,public \u76ee\u5f55\uff1b \u65b0\u589e allure \u62a5\u544a\u5907\u4efd\u529f\u80fd\uff0c\u9ed8\u8ba4\u5907\u4efd\u81f3 allure_back \u76ee\u5f55\u4e0b\uff1b manage.py\u65b0\u589e\u53c2\u6570 --lastfailed \u7528\u4e8e\u53ea\u8dd1\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\u7684\u529f\u80fd\uff1b fix \u4fee\u590d\u4e86\u5728\u6ca1\u6709\u6307\u5b9a\u5e94\u7528\u540d\u79f0\u6267\u884c\u65f6\uff0cxml \u62a5\u544a\u751f\u6210\u8def\u5f84\u5f02\u5e38\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 uos_ci.py \u4f20\u5165 timeout \u548c session_timeout \u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11020220916","title":"1.1.0\uff082022/09/16\uff09","text":"new \u65b0\u589ePMS\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u652f\u6301\u591a\u79cd\u6570\u636e\u56de\u586b\u6a21\u5f0f\uff1b \u4f18\u5316\u4e86\u901a\u8fc7\u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u65f6PMS \u722c\u866b\u7684\u6027\u80fd\uff1b \u65b0\u589e .gitmodules \u6587\u4ef6\uff0c\u7528\u4e8e\u6807\u8bb0\u6240\u6709\u5b50\u9879\u76ee\uff0c\u65b9\u4fbf\u7edf\u4e00\u62c9\u53d6\u4ee3\u7801\uff1b env.sh \u9002\u914d\u793e\u533a\u7248\u4e0a\u5b89\u88c5\u81ea\u52a8\u5316\u73af\u5883\uff1b \u589e\u52a0\u6267\u884c\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u9519\u8bef\u7684\u529f\u80fd\uff1b README.md \u589e\u52a0 Wayland \u4e0b\u4f7f\u7528\u3001\u6d4b\u8bd5\u62a5\u544a\u67e5\u770b\u3001\u5e38\u89c1\u95ee\u9898\u7b49\u7684\u6587\u6863\u8bf4\u660e\uff1b \u589e\u52a0\u4e86\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u5bf9 setup\u3001call\u3001teardown \u8fdb\u884c\u65e5\u5fd7\u5206\u6bb5\uff1b fix \u4fee\u590d\u4e86 \u786e\u8ba4\u4fee\u590d \u5217\u6ca1\u5199\u8868\u5934\uff0c\u4f46\u5199\u4e86 fixed-xxx \u6807\u7b7e\uff0c\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u540c\u4e00\u5e94\u7528\u5185\u591a\u4e2a csv \u6587\u4ef6\u4e2d \u786e\u8ba4\u4fee\u590d \u5217\u6709\u7684\u5199\u4e86\uff0c\u6709\u7684\u6ca1\u5199\uff0c\u53ef\u80fd\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 INFO \u65e5\u5fd7\uff0c\u663e\u793a\u4e3a DEBUG \u7684\u95ee\u9898\uff1b\u4fee\u590d\u4e86\u90e8\u5206\u673a\u5668\u4e0a INFO \u65e5\u5fd7\u5185\u5bb9\u663e\u793a\u4e3a\u7ea2\u8272\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\u770b\u4e0d\u5230\u8be6\u7ec6\u4fe1\u606f\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10220220822","title":"1.0.2\uff082022/08/22\uff09","text":"new \u79fb\u9664 loguru\uff0c\u66ff\u6362\u4e3a logging\uff0c\u63a5\u53e3\u4fdd\u6301\u4e0d\u53d8\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u53d7\u5f71\u54cd\uff1b \u9ed8\u8ba4\u5f00\u542f coredump\uff1b fix \u4fee\u590d\u4e86\u4e09\u65b9\u5e93 loguru \u5076\u73b0\u5f02\u5e38\uff0c\u5bfc\u81f4\u7a0b\u5e8f\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7b2c\u4e00\u6b21\u5931\u8d25\u4e0d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10120220812","title":"1.0.1\uff082022/08/12\uff09","text":"new \u65b0\u589e RELEASE.md \u6587\u4ef6\uff0c\u7528\u4e8e\u8bb0\u5f55\u5386\u53f2\u53d1\u5e03\u7248\u672c\u7684\u66f4\u65b0\u5185\u5bb9\uff1b \u517c\u5bb9 Wayland \u6a21\u5f0f\u4e0b\u6267\u884c\u7528\u4f8b\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u7528\u7ba1\u5f53\u524d\u6d4b\u8bd5\u673a\u6267\u884c\u73af\u5883\uff0c\u6846\u67b6\u4f1a\u81ea\u52a8\u6839\u636e\u5f53\u524d\u73af\u5883\u8d70\u4e0d\u540c\u7684\u4ee3\u7801\u903b\u8f91\uff1b \u7531\u4e8e\u9700\u8981\u4fee\u6539 dogtail \u6e90\u4ee3\u7801\uff0c\u56e0\u6b64\u5c06\u4fee\u6539\u540e\u7684\u6e90\u7801\u653e\u5165\u5230\u6838\u5fc3\u5e93\u91cc\u9762 src/depends/dogtail \u540e\u7eed\u7248\u672c\u5c06\u4e0d\u9700\u8981\u5728\u7cfb\u7edf\u4e2d\u5b89\u88c5dogtail\uff1b \u5982\u679c\u5e94\u7528\u5e93\u540c\u6837\u4f7f\u7528\u4e86\u7cfb\u7edf\u5b89\u88c5\u7684 dogtail \u53ef\u80fd\u4f1a\u62a5\u9519\uff0c\u89e3\u51b3\u65b9\u6848\u662f\u5c06\u4ee3\u7801\u4e2d\u7684 import dogtail \u4fee\u6539\u4e3a from src.depends import dogtail ; fix \u91cd\u8dd1\u5931\u8d25\u4e4b\u540e\u624d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff0c\u4fee\u6539\u4e3a\u5931\u8d25\u4e4b\u540e\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":"# Attribution \uff1achengdu Test Team\n# Date \uff1a2021/08/20\n \u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d \u4ed3\u5e93\u5730\u5740\uff1ahttps://gitlabcd.uniontech.com/autotest/cd-desktop-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u65b9\u6848\u6982\u8ff0","text":"\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u667a\u80fd\u8bc6\u522b\u5e94\u7528\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u7528\u4e8e\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u64cd\u4f5c\u8fc7\u7a0b\u4e2d\u7684\u5143\u7d20\u5b9a\u4f4d\u4ee5\u53ca\u5224\u65ad\u7ed3\u679c\u65f6\u7684\u65ad\u8a00\u5904\u7406\uff1b\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\uff0c\u6d4b\u8bd5\u673a\u4e0a\u7684\u753b\u9762\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u5230\u670d\u52a1\u5668\u4e0a\uff0c\u670d\u52a1\u5668\u5bf9\u89c6\u9891\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\u540e\uff0c\u670d\u52a1\u5668\u667a\u80fd\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\u6210\u529f\uff0c\u7136\u540e\u5bf9\u6d4b\u8bd5\u673a\u4e0b\u53d1\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\uff0c\u6d4b\u8bd5\u673a\u63a5\u53d7\u5e76\u6267\u884c\u4e0b\u4e00\u6b65\u64cd\u4f5c\u3002 \u670d\u52a1\u5668\u4e0e\u6d4b\u8bd5\u673a\u4e4b\u95f4\u7684\u94fe\u63a5\uff1a \u670d\u52a1\u5668\u901a\u8fc7 USB \u4e32\u53e3\u8bbe\u5907\uff08USB-HID \u534f\u8bae\uff09\u6a21\u62df\u9f20\u6807\u952e\u76d8\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u64cd\u4f5c\u3002 \u901a\u8fc7\u89c6\u9891\u91c7\u96c6\u8bbe\u5907\u6355\u83b7\u6d4b\u8bd5\u673a\u7684\u5b9e\u65f6\u753b\u9762\u4f20\u8f93\u7ed9\u670d\u52a1\u5668\u3002 \u670d\u52a1\u5668\u5bf9\u91c7\u96c6\u7684\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\uff0c\u8bc6\u522b\u5176\u4e2d\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5e76\u8fd4\u56de\u5143\u7d20\u63a7\u4ef6\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\uff0c\u670d\u52a1\u5668\u901a\u8fc7\u667a\u80fd\u5316\u5206\u6790\uff0c\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e00\u81f4\u5c06\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\u901a\u8fc7\u4e32\u53e3\u6a21\u62df\u952e\u9f20\u4fe1\u53f7\u53d1\u9001\u7ed9\u6d4b\u8bd5\u673a\uff1b\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e0d\u4e00\u81f4\u5c06\u4f1a\u8fdb\u5165\u4e2d\u65ad\u5904\u7406\u53ca\u5f02\u5e38\u7ed3\u679c\u8f93\u51fa\uff0c\u7ee7\u7eed\u6267\u884c\u540e\u7eed\u573a\u666f\uff0c\u76f4\u81f3\u6240\u6709\u7528\u4f8b\u6d4b\u8bd5\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u6df1\u5ea6\u5b66\u4e60\u73af\u5883\u642d\u5efa","text":"\u6a21\u578b\u8bad\u7ec3\u4e3b\u8981\u5bf9 GPU \u6709\u8981\u6c42\uff0c\u8bad\u7ec3\u6a21\u578b\u7684\u673a\u5668\u663e\u5b58\u4e0d\u4f4e\u4e8e 6G\uff0c\u5176\u4ed6\u914d\u7f6e\u65e0\u7279\u6b8a\u8981\u6c42\u3002 \u63a8\u8350\u6027\u4ef7\u6bd4\u8f83\u9ad8\u914d\u7f6e \u64cd\u4f5c\u7cfb\u7edf: UnionTech OS Desktop 20 Professional Linux version 4.19.0-desktop-amd64 (deepin@deepin-PC) (Uos 8.3.0.3-3+rebuild) \u5904\u7406\u5668: Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz (\u516b\u6838 / \u5341\u516d\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460M-HDV(RD)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))/8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: TU116 [GeForce GTX 1660]\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u865a\u62df\u73af\u5883\u5b89\u88c5","text":"cd ~\nwget -c https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh\nbash Miniconda3-latest-Linux-x86_64.sh\n \u4e00\u8def\u56de\u8f66 \u7b2c\u4e00\u6b21\u63d0\u793a\u8f93\u5165 yes/no \uff1a\u8f93\u5165 yes \u7ee7\u7eed\u4e00\u8def\u56de\u8f66 \u7b2c\u4e8c\u6b21\u63d0\u793a\uff1a\u8f93\u5165 no cd ~/miniconda3/bin\nsudo chmod 777 activate\n \u6fc0\u6d3bconda\u73af\u5883 . ./activate\n \u6dfb\u52a0\u516c\u53f8\u5185\u7f51\u6e90 conda config --add channels bioconda\nconda config --add channels conda-forge\n \u5982\u679c\u662f\u5916\u7f51\u6dfb\u52a0\u5916\u7f51\u6e90 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/\n \u5982\u679c\u8981\u5220\u9664\u6e90 conda config --remove-key channels\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"2\u3001\u5b89\u88c5\u4f9d\u8d56","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u521b\u5efa\u865a\u62df\u73af\u5883","text":"conda remove --name mmlab --all # \u79fb\u9664\u6240\u6709\u865a\u62df\u73af\u5883\n conda create -n mmlab python=3.7\n conda activate mmlab\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-pytorch","title":"\uff082\uff09\u5b89\u88c5 Pytorch","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install torch==1.7.0+cu101 torchvision==0.8.1+cu101 torchaudio==0.7.0 -f https://download.pytorch.org/whl/torch_stable.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-mmcv","title":"\uff083\uff09\u5b89\u88c5 MMCV","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install mmcv-full==1.3.3 -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.7.0/index.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"\uff084\uff09\u5b89\u88c5\u663e\u5361\u9a71\u52a8","text":"\u6839\u636e\u4f60\u7684\u663e\u5361\u4e0b\u8f7d\u5bf9\u5e94\u9a71\u52a8\uff0c\u6bd4\u5982\u6211\u7684\u663e\u5361\u4e3a GTX1660\uff0c\u9a71\u52a8\u7248\u672c\u4e3a 430\uff0c\u9a71\u52a8\u4e0b\u8f7d\u5730\u5740\uff1ahttps://www.nvidia.cn/Download/Find.aspx?lang=cn CTRL+ALT+F2 \u8fdb\u5165tty\n \u7981\u7528 nouveau \u9a71\u52a8 sudo vim /etc/modprobe.d/blacklist-nouveau.conf\n \u586b\u5165\uff1a blacklist nouveau options nouveau modeset=0\n \u5237\u65b0\u914d\u7f6e\u6587\u4ef6 sudo update-initramfs -u reboot \u91cd\u542f\u540e\u518d\u8fdb\u5165 tty \u5173\u95ed\u56fe\u50cf\u754c\u9762\uff0c\u8f93\u5165\u547d\u4ee4\u5173\u95ed\u56fe\u50cf\u754c\u9762 sudo service lightdm stop\n \u5b89\u88c5\u9a71\u52a8 sudo chmod a+x NVIDIA-Linux-x86_64-430.run\nsudo ./NVIDIA-Linux-x86_64-430.run\n reboot\u91cd\u542f\uff0cnvidia-smi\u67e5\u770b\u5b89\u88c5\u72b6\u6001\u3002\u6ce8\u610f\u770b\u4e0bcuda\u7248\u672c\uff0c10.1\uff0cdriver\u7248\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u6570\u636e\u6807\u6ce8","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u6570\u636e\u6807\u6ce8","text":"\u6807\u6ce8\u4e4b\u524d\u9700\u8981\u5148\u8f6c\u6362\u56fe\u7247\u5927\u5c0f\uff0c\u5e76\u4e14\u4ee5\u6570\u5b57\u547d\u540d\uff0c\u6bcf\u7ec4\u547d\u540d\u9012\u589e"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"\uff081\uff09\u8f6c\u6362\u5927\u5c0f\u5e76\u91cd\u547d\u540d","text":"rename_pic.py import os\nimport sys\nimport cv2\nimport time\nimport getpass\nusername = getpass.getuser()\nsource_path = f\"/home/{username}/Desktop/right_menu\" # \u56fe\u7247\u8def\u5f84\nsource_dest = os.path.join('/'.join(source_path.split(\"/\")[:-1]), 'tmp')\nif not os.path.exists(source_dest):\nos.mkdir(source_dest)\nstart_name = sys.argv[1]\nfile_name_list = list()\nfor file in os.listdir(source_path):\nif file.endswith('.png'):\nfile_name_list.append(file)\nstart_name = int(start_name)\nfor file in file_name_list:\nos.rename(os.path.join(source_path,file), os.path.join(source_path, f\"{str(start_name)}.png\"))\nstart_name += 1\ntime.sleep(1)\nfor file in os.listdir(source_path):\nimage = os.path.join(source_path, str(file))\nsrc = cv2.imread(image)\nresult = cv2.resize(src, (960, 540))\nresizeImage = os.path.join(source_dest, str(file))\nprint(resizeImage)\ncv2.imwrite(str(resizeImage), result)\ncv2.waitKey(0)\ncv2.destroyAllWindows()\ntime.sleep(1)\nos.system(f'rm -rf {source_path}/*')\nos.system(f'mv {source_dest}/* {source_path}')\nos.system(f'rm -rf {source_dest}')\nprint(\"\u4e0b\u4e00\u4e2a\u5e8f\u53f7\uff1a\", start_name)\n \u6839\u636e\u7ec8\u7aef\u8f93\u51fa\u7684\u4e0b\u4e00\u4e2a\u5e8f\u53f7\u7684\u63d0\u793a\uff0c\u6267\u884c Python \u6587\u4ef6\u7684\u65f6\u5019\u4f20\u53c2\u3002 python rename_pic.py 249\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"\uff082\uff09\u5de5\u5177\u6807\u6ce8","text":"\u4f7f\u7528\u5de5\u5177 labelImg \u6807\u6ce8 sudo pip3 install PyQt5==5.13\nsudo pip3 install labelImg\n \u7ec8\u7aef\u76f4\u63a5\u8f93\u5165 labelImg\uff0c\u56de\u8f66 \u6807\u6ce8\u6a21\u5f0f\u9009\u62e9\uff1aPascalVOC"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u667a\u80fd\u6807\u6ce8","text":"\u6253\u5f00\u5c4f\u5e55\u5f55\u5236\u8f6f\u4ef6\uff0c\u5f55\u5236\u624b\u52a8\u64cd\u4f5c\u4e00\u6b21\u6d4b\u8bd5\u7528\u4f8b\uff0c\u7136\u540e\u5c06\u5f55\u5236\u7684\u89c6\u9891\u8fdb\u884c\u5206\u5e27\uff0c\u7136\u540e\u5bf9\u6bd4\u524d\u4e24\u5e27\u56fe\u6807\u76f8\u4f3c\u5ea6\uff0c\u5254\u9664\u76f8\u4f3c\u5ea6\u8fc7\u9ad8\u7684\u56fe\u7247\uff0c\u5728\u4fdd\u8bc1\u7d20\u6750\u591a\u6837\u6027\u7684\u524d\u63d0\u4e0b\uff0c\u5254\u9664\u91cd\u590d\u591a\u4f59\u7684\u56fe\u7247\u751f\u6210\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u96c6\uff0c\u7136\u540e\u53d6\u51fa\u63a7\u4ef6\u6a21\u677f\u6570\u636e\u96c6\uff0c\u901a\u8fc7 OpenCV \u6a21\u677f\u5339\u914d\u83b7\u53d6\u63a7\u4ef6\u5728\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u56fe\u7247\u4e2d\u6240\u5728\u7684\u5de6\u4e0a\u3001\u5de6\u4e0b\u3001\u53f3\u4e0a\u3001\u53f3\u4e0b\u56db\u5904\u5750\u6807\uff0c\u4ece\u800c\u6839\u636e\u6a21\u677f\u6570\u636e\u96c6\u751f\u6210\u6807\u6ce8\u6570\u636e\u3002\u53c2\u8003\u76ee\u5f55 AnnotationMaterial"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"\uff081\uff09\u6a21\u677f\u6570\u636e\u96c6\u51c6\u5907","text":"1\u3001\u5728\u754c\u9762\u622a\u53d6\u9700\u8981\u6807\u6ce8\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u653e\u5728\u76ee\u5f55\u4e0b AnnotationMaterial/template/img 2\u3001\u7ef4\u62a4\u63a7\u4ef6\u540d\u4e0e\u5143\u7d20\u63a7\u4ef6\u7684\u952e\u5bf9\uff0c\u4e00\u4e2a\u63a7\u4ef6\u540d\u53ef\u5bf9\u5e94\u591a\u4e2a\u5143\u7d20\u63a7\u4ef6 menu:\n- menu.jpg\n- menu1.jpg\n- menu2.jpg\n- menu3.jpg\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"\uff082\uff09\u7d20\u6750\u96c6\u51c6\u5907","text":"\u5f55\u5236\u89c6\u9891\u6216\u6216\u5c4f\u5e55\u622a\u56fe\u653e\u7f6e\u76ee\u5f55 AnnotationMaterial/source"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u5f00\u59cb\u6807\u6ce8","text":"python3 AnnotationMaterial/main.py\n \u751f\u6210\u7684\u6807\u6ce8\u6570\u636e\u5b58\u653e\u5728 AnnotationMaterial/result"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#mmdetection","title":"\u56db\u3001MMDetection","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1-mmdetection","title":"1\u3001 MMDetection \u4ee3\u7801","text":"MMDetection \u662f\u4e00\u4e2a\u6709\u540d\u7684\u6df1\u5ea6\u5b66\u4e60\u76ee\u6807\u68c0\u6d4b\u5f00\u6e90\u9879\u76ee\uff0c\u4e5f\u662f openMMlab \u7684\u62db\u724c\u9879\u76ee\uff0c\u4e3a\u4ec0\u4e48\u9009\u62e9\u5b83\uff0c\u5c0f\u5b69\u513f\u6ca1\u5a18\u8bf4\u6765\u8bdd\u957f\uff0c\u611f\u5174\u8da3\u53ef\u4ee5\u81ea\u884c\u6df1\u5165\u4e86\u89e3\uff1b \u4f60\u53ef\u4ee5\u76f4\u63a5\u5728 GitHub \u4e0a\u514b\u9686\u4ee3\u7801\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u54b1\u4eec\u4ed3\u5e93\u4e0b Train \u76ee\u5f55\u4e2d\u4ee3\u7801\uff0cTrain \u4e2d\u7684\u4ee3\u7801\u4e5f\u662f\u4ece GitHub \u4e0a\u62c9\u53d6\u7684\uff0c\u4e0d\u8fc7\u6211\u4eec\u6839\u636e\u9879\u76ee\u9700\u8981\u505a\u4e86\u4e00\u4e9b\u4e8c\u6b21\u5f00\u53d1\uff0c\u63a8\u8350\u76f4\u63a5\u4f7f\u7528\u5b83\u3002 \u5982\u679c\u4f60\u60f3\u4ece GitHub \u4e0a\u62c9\uff1a git clone https://github.com/open-mmlab/mmdetection.git\n# \u4e0d\u80fd\u76f4\u63a5\u62c9\u53d6\u4e3b\u5206\u652f\uff0c\u5efa\u8bae\u4f7f\u75282.12\u7248\u672c\uff0c\u4e0d\u540c\u7684\u7248\u672c\u5bf9\u5e94\u7684mmcv\u7248\u672c\u662f\u4e0d\u540c\u7684\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-voc2coco","title":"2\u3001\u62c9\u53d6 voc2coco \u4ee3\u7801","text":"git clone https://github.com/Tony607/voc2coco.git\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-coco","title":"3\u3001\u8f6c\u6362 coco \u6570\u636e\u96c6","text":"\u5c06\u6240\u6709\u7684\u56fe\u7247\u548cxml\u6587\u4ef6\u653e\u5165train2017\uff0c\u4ece\u4e2d\u6311\u9009\u51e0\u7ec4\u653e\u5165val2017\uff08\u6d4b\u8bd5\u96c6\uff09 cd mmdetection/data/coco\npython voc2coco.py train2017 annotations/instances_train2017.json\npython voc2coco.py val2017 annotations/instances_val2017.json\n \u751f\u6210json\u6587\u4ef6"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4_1","title":"4\u3001\u4fee\u6539\u914d\u7f6e","text":"\uff081\uff09\u8bfb\u53d6\u6a21\u578b\u540d\u79f0 import json\nmodule_name = []\nwith open('./instances_train2017.json', \"r+\") as f:\njson_file = f.read()\njson_dict = json.loads(json_file)\nmodule_list = json_dict.get('categories')\nfor module_info in module_list:\nname = module_info.get('name')\nmodule_name.append(name)\nprint(module_name)\nprint(\"module_num:\", len(module_name))\n # \u6ce8\u610f\u5bf9\u6bd4instances_train2017.json\u91cc\u9762\u6a21\u578b\u540d\u79f0\u7684\u987a\u5e8f\uff0c\u4e0eCLASSES\u548ccoco_classes\u91cc\u9762\u7684\u987a\u5e8f\u4fdd\u6301\u4e00\u81f4\u3002\n \uff082\uff09\u4fee\u6539 faster_rcnn_r101_2x_coco.py mmdetection/xianjin/faster_rcnn_r101_2x_coco.py \u4fee\u653946\u884c\uff0cnum_clasess\u7684\u503c\uff0c\u65b0\u589e1\u4e2a\uff0c\u5c31 +1\uff1b \uff083\uff09\u4fee\u6539 coco.py mmdetection/mmdet/datasets/coco.py CLASSES = ()\uff0c\u5728\u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b \uff084\uff09\u4fee\u6539 class_names.py mmdetection/mmdet/core/evaluation/class_names.py coco_classes \u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#5","title":"5\u3001\u7f13\u5b58\u6e05\u7406","text":"\u5220\u9664 mmdetection/build \u76ee\u5f55 python setup.py install\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#6","title":"6\u3001\u8bad\u7ec3\u6a21\u578b","text":"\uff081\uff09\u6307\u5b9a\u81ea\u5df1\u914d\u7f6e\u7684\u8bad\u7ec3\u6a21\u578b\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py --gpus 1\n \uff082\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u6d4b\u8bd5\u96c6\u7ed3\u679c\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py xianjin/epoch_24.pth --show\n \uff083\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u51c6\u786e\u5ea6\uff1b python tools/analysis_tools/analyze_logs.py plot_curve xianjin/20210530_011907.log.json --keys acc\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#7","title":"7\u3001\u5feb\u6377\u64cd\u4f5c","text":"python3 run.py\n \u5c06\u4ee5\u4e0a 4 - 7 \u6b65\u64cd\u4f5c\u6574\u5408\u6210 run.py\uff0c\u4e00\u952e\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u4e94\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\uff1b \u670d\u52a1\u7aef\u4e00\u53f0\uff08\u76ee\u524d\u4ec5\u652f\u6301AMD\u67b6\u6784\uff09\uff1b \u91c7\u96c6\u76d2\u4e00\u4e2a \uff08ACASIS hdmi\u89c6\u9891\u91c7\u96c6\u5361\uff0chttps://item.jd.com/10024310742602.html \uff09\uff1b USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\uff1b USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff1b \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5USB\u5ef6\u957f\u7ebf\uff1b \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u63a8\u8350\u914d\u7f6e","text":"\u6267\u884c\u7528\u4f8b\u7684\u670d\u52a1\u7aef\u5bf9\u914d\u7f6e\u6ca1\u6709\u7279\u6b8a\u8981\u6c42\uff0c\u5982\u679c\u6761\u4ef6\u5141\u8bb8\u914d\u7f6e\u8d8a\u9ad8\uff0c\u8bc6\u522b\u901f\u5ea6\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n \u6d4b\u8bd5\u673a\u4e0a\u4e0d\u6267\u884c\u4efb\u4f55\u811a\u672c\uff0c\u5177\u4f53\u914d\u7f6e\u6839\u636e\u6d4b\u8bd5\u9700\u8981\u51b3\u5b9a\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#usb_mk","title":"\u516d\u3001USB_MK\u4e32\u53e3\u9a71\u52a8\u65b9\u6cd5","text":"\u4f4d\u4e8econtrol_method\u76ee\u5f55\u4e0b\u7684usb_mk.py\u6587\u4ef6 \uff081\uff09\u5217\u51fa\u53ef\u901a\u4fe1\u7684\u7aef\u53e3 python3 -m serial.tools.list_ports -v\n \uff082\uff09\u4fee\u6539\u4e32\u53e3\u7684\u6743\u9650 sudo chmod 777 /dev/ttyACM0\n \uff083\uff09\u5b9e\u4f8b\u5316USB_MK import UsbMk\nusb_mk = UsbMk(\"/dev/ttyACM0\", 9600) # \u8bbe\u5907\u9ed8\u8ba49600\u4e3a\u6ce2\u7279\u7387\uff0c\u63a7\u5236\u4f20\u8f93\u901f\u7387\n \uff084\uff09USB\u4e32\u53e3\u8bbe\u5907\u9ed8\u8ba4\u6ce2\u7279\u7387\u4e3a9600\uff08\u7ecf\u6d4b\u8bd5\u6ce2\u7279\u73879600\u51c6\u786e\u6027\u6700\u597d\uff09\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up() # \u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u6c49\u5b57\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e\n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff083\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff084\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff085\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() # \u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2\n \uff086\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff087\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff088\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e03\u3001\u65b9\u6cd5\u8c03\u7528\u5165\u53c2\u89c4\u5219","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_7","title":"1\u3001\u57fa\u7c7b","text":"class Base:\ndef __init__(self):\nself._obj = image\nself._usb = usb_mk\ndef find_element_by_ai(self, element):\nreturn self._obj.find_element(element)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_6","title":"2\u3001\u5165\u53c2\u8bf4\u660e","text":"\u56fe\u50cf\u8bc6\u522b\u65b9\u6cd5\u5165\u53e3\u4e3a Base \u7c7b\u4e0b\u7684 find_element_by_ai \u3002\u4ec5\u63a5\u53d7\u4e00\u4e2a\u53c2\u6570 element\uff0c\u7c7b\u578b\u4e3a string\u3002 \u53ef\u8bc6\u522b\u7684 string \u683c\u5f0f\uff1a \uff081\uff09\u5927\u56fe\u6807\uff08 \u56fe\u6807\u5927\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\uff0c\u4f8b\uff1a Base().find_element_by_ai(\"window\")\n \uff082\uff09\u5927\u56fe\u6807 / \u5c0f\u56fe\u6807\uff08\u56fe\u6807\u5c0f\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5c0f\u56fe\u6807\uff0c\u4f8b\uff1awindow/search_btn Base().find_element_by_ai(\"window/search_btn\")\n \uff083\uff09\u5927\u56fe\u6807 / OCR\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\u5185\u7684\u6587\u5b57\uff0c\u4f8b\uff1amenu/\u5c5e\u6027 Base().find_element_by_ai(\"menu/\u5c5e\u6027\")\n \uff084\uff09OCR\uff1a\u5168\u5c4f\u8bc6\u522b\u6587\u5b57 Base().find_element_by_ai(\"\u641c\u7d22\")\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516b\u3001\u9690\u85cf\u9f20\u6807","text":"\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u8fc7\u6765\u7684\u89c6\u9891\u6d41\uff0c\u5728\u8bc6\u522b\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u53d7\u5230\u9f20\u6807\u5f71\u54cd\uff0c\u56e0\u6b64\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u9690\u85cf\u9f20\u6807\u3002 \u5c4f\u853d\u9f20\u6807\u5149\u6807\u663e\u793a ```shell script /etc/lightdm/lightdm.conf \u5728`[Seat:*]`\u4e0b\u9762\u6dfb\u52a0\u53c2\u6570\n```shell script\nxserver-command=X -bs -core -nocursor\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e5d\u3001\u667a\u80fd\u81ea\u52a8\u5316\u7684\u610f\u4e49","text":"1\u3001\u6539\u5584 Acessibility \u5b9a\u4f4d\u7684\u7a33\u5b9a\u6027\u95ee\u9898 Acessibility \u5c5e\u6027\u5b9a\u4f4d\u5b58\u5728\u5076\u5c14\u5931\u6548\u7684\u60c5\u51b5 \uff081\uff09\u5f00\u53d1\u5728\u505a\u65b0\u9700\u6c42\u5f00\u53d1\u65f6\u53ef\u80fd\u6d89\u53ca\u5230\u5bf9\u5c5e\u6027\u6807\u7b7e\u7684\u4fee\u6539\u6216\u8005\u5c42\u7ea7\u7684\u8c03\u6574\uff0c\u53ef\u80fd\u9020\u6210\u81ea\u52a8\u5316\u7528\u4f8b\u65e0\u6cd5\u5b9a\u4f4d\u5230\u5143\u7d20\u3002 \u6bd4\u59821040\u9636\u6bb5\uff0c\u97f3\u4e50\u91cd\u6784\u7684\u65f6\u5019\uff0c\u5f00\u53d1\u5bf9\u90e8\u5206\u5c5e\u6027\u548c\u5c42\u7ea7\u505a\u4e86\u4fee\u6539\uff0c\u5bfc\u81f4\u81ea\u52a8\u5316\u7528\u4f8b\u5b9a\u4f4d\u65b9\u6cd580%\u9700\u8981\u4fee\u6539\u3002 \u5f00\u53d1\u65b0\u529f\u80fd\u7684\u65f6\u5019\u5076\u5c14\u4e5f\u4f1a\u5bf9\u5c5e\u6027\u505a\u8c03\u6574\uff0c\u9047\u52305\u6b21\u3002 \uff082\uff09\u76ee\u524d\u4e3b\u8981\u4f7f\u7528Dogtail\u8bc6\u522b\u5e94\u7528Acessibility\u5c5e\u6027\u8fdb\u884c\u5b9a\u4f4d\uff0c\u662f\u83b7\u53d6\u5e94\u7528\u5f53\u524d\u754c\u9762\u7684\u5c5e\u6027tree\uff0c\u5728\u5e94\u7528\u8df3\u8f6c\u540e\uff0cDogtail\u5b58\u5728\u65e0\u6cd5\u53ca\u65f6\u83b7\u53d6\u5f53\u524d\u5c5e\u6027\u5217\u8868\u7684\u60c5\u51b5\u3002 \u591a\u5a92\u4f53\u8c03\u7528\u6587\u7ba1\u7a97\u53e3\u7684\u65f6\u5019\uff0c\u51fa\u73b0\u627e\u4e0d\u5230\u6587\u7ba1\u91cc\u9762\u5143\u7d20\u7684\u60c5\u51b5\uff0c\u76ee\u524d\u51fa\u73b010+\u6b21\u3002 \u5e94\u7528\u8bbe\u7f6e\u9875\u9762\u7684\u5c5e\u6027\u5076\u5c14\u5b58\u5728\u627e\u4e0d\u5230\u7684\u60c5\u51b5\uff0c\u9047\u52305\u6b21\u3002 \uff083\uff09Dogtail\u5de5\u5177\u672c\u8eab\u5b58\u5728\u95ee\u9898\uff0c\u6709\u65f6\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u5019\u5f88\u6162\uff0c\u8ba9\u4eba\u65e0\u6cd5\u63a5\u53d7\uff0c\u76ee\u524d\u51fa\u73b0\u8fc7\u5f88\u591a\u6b21\u3002 \u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u95f4\u6bd4\u5e73\u5e38\u61623\u500d\uff0c\u51fa\u73b04\u6b21\u3002 2\u3001\u89e3\u51b3\u4e86\u4f7f\u7528\u7edd\u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898 \u90e8\u5206\u63a7\u4ef6\u65e0\u6cd5\u6dfb\u52a0 Acessibility \u5c5e\u6027\u4ece\u800c\u4f7f\u7528\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u51fa\u73b0\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898\u3002 \uff081\uff09\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u65b9\u6cd5\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u76ee\u6807\u56fe\u7247\u8d44\u6e90\uff0c\u5728 UI \u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u4f1a\u6d89\u53ca\u5230\u76ee\u6807\u8d44\u6e90\u7684\u66ff\u6362\uff0c\u6bd4\u8f83\u8017\u8d39\u4eba\u529b\u3002 \uff082\uff09\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6cd5\u5bf9\u6bd4\u7cbe\u5ea6\u6bd4\u8f83\u641e\uff0c\u5982\u679cUI \u7684\u53d8\u66f4\u4f1a\u9020\u6210\u65e0\u6cd5\u51c6\u786e\u5b9a\u4f4d\u5230\uff0c\u81ea\u52a8\u5316\u811a\u672c\u5065\u58ee\u6027\u4e0d\u8db3\u3002 3\u3001\u4f7f\u7528\u673a\u5668\u5206\u79bb\uff0c\u89e3\u51b3\u4e86\u81ea\u52a8\u5316\u811a\u672c\u5bf9\u5e94\u7528\u7684\u5f71\u54cd\uff0c\u771f\u5b9e\u8fd8\u539f\u7528\u6237\u7684\u4f7f\u7528\u573a\u666f \u673a\u5668\u5206\u79bb\u7684\u67b6\u6784\u8bbe\u8ba1\uff0c\u4fdd\u8bc1\u4e86\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u73af\u5883\u5b8c\u5168\u7b49\u540c\u4e8e\u7528\u6237\uff0c\u6392\u9664\u6d4b\u8bd5\u811a\u672c\u7684\u5f71\u54cd\u3002 \uff081\uff09\u76ee\u524d\u7684\u529f\u80fd\u81ea\u52a8\u5316\u662f\u5728\u6d4b\u8bd5\u673a\u4e0a\u76f4\u63a5\u8fd0\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\uff0c\u52a0\u4e0a\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u6211\u4eec\u6dfb\u52a0\u4e86\u4e00\u4e9b\u8fdb\u7a0b\u76d1\u63a7\u3001\u89c6\u9891\u5f55\u5236\u7b49\u529f\u80fd\uff0c\u81ea\u52a8\u5316\u811a\u672c\u672c\u8eab\u4f1a\u6d88\u8017\u4e00\u4e9b\u7cfb\u7edf\u8d44\u6e90\uff0c\u65e0\u6cd5\u8fd8\u539f\u771f\u662f\u7684\u7528\u6237\u4f7f\u7528\u573a\u666f\u3002 \uff082\uff09\u6027\u80fd\u6d4b\u8bd5\u9700\u8981\u6392\u9664\u5176\u4ed6\u7a0b\u5e8f\u7684\u8d44\u6e90\u6d88\u8017\u5f71\u54cd\uff0c\u6027\u80fd\u81ea\u52a8\u5316\u91c7\u7528\u673a\u5668\u5206\u79bb\uff0c\u4fdd\u8bc1\u4e86\u6027\u80fd\u6570\u636e\u7684\u51c6\u786e\u6027\u3002 \u4ee5\u524d\u7684\u7528\u4f8b\u6267\u884c\u8017\u65f6\u6ca1\u6761\u572830\u79d2\u5de6\u53f3\uff0c\u73b0\u5728\u7528\u4f8b\u8017\u65f6\u572810\u79d2\u3002 4\u3001\u89e3\u51b3\u4e86UI \u8c03\u6574\u5bfc\u81f4\u5b9a\u4f4d\u5931\u8d25\u7684\u4e0d\u7a33\u5b9a\u6027\u95ee\u9898 \uff081\uff09\u89e3\u51b3\u4e86\u56e0 UI \u8c03\u6574\u5bfc\u81f4\u63a7\u4ef6\u4f4d\u7f6e\u53d8\u5316\u6216\u8272\u5dee\u53d8\u5316\u540e\u5b9a\u4f4d\u4e0d\u51c6\u786e\u7684\u95ee\u9898\uff0c\u53ea\u8981\u63a7\u4ef6\u6587\u6848\u548c\u63a7\u4ef6\u5916\u8fb9\u6846\u65e0\u53d8\u5316\u5747\u53ef\u51c6\u786e\u5b9a\u4f4d\uff1b \uff082\uff09\u76ee\u524d\u4e5f\u4f1a\u91c7\u7528\u57fa\u4e8eUI\u7684\u5b9a\u4f4d\u65b9\u6848\uff0c\u5982\u679cUI\u4f4d\u7f6e\u6709\u8c03\u6574\uff0c\u4f1a\u5bfc\u81f4\u5143\u7d20\u65e0\u6cd5\u5b9a\u4f4d\u3002 5\u3001\u7b80\u5316\u4e86\u7528\u4f8b\u7ed3\u6784\uff0c\u63d0\u5347\u7f16\u5199\u53cb\u597d\u5ea6 \uff081\uff09\u667a\u80fd\u81ea\u52a8\u5316\u8bc6\u522b\u5143\u7d20\u7684\u65b9\u6cd5\u53ea\u6709\u4e00\u4e2a\uff0c\u5c31\u662f\u57fa\u4e8e\u6211\u4eec\u8bad\u7ec3\u7684\u6a21\u578b\u8bc6\u522b\u89c6\u9891\u6d41\u4e2d\u7684\u5143\u7d20\uff0c\u7ecf\u8fc7\u811a\u672c\u5c01\u88c5\u4e4b\u540e\uff0c\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u4e2d\u6240\u6709\u5b9a\u4f4d\u7684\u64cd\u4f5c\u90fd\u53ea\u9700\u8981\u8c03\u7528\u8fd9\u4e00\u4e2a\u65b9\u6cd5\u5c31\u884c\u4e86\uff0c\u7f16\u5199\u81ea\u52a8\u5316\u811a\u672c\u7684\u96be\u5ea6\u5927\u5927\u964d\u4f4e\u3002 \uff082\uff09\u4e5f\u662f\u7531\u4e8e\u8c03\u7528\u65b9\u6cd5\u7b80\u5355\uff0c\u5728 UI \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u4e2d\u7684\u5206\u5c42\u7ed3\u6784\u5c06\u4f1a\u51cf\u5c11\uff0c\u591a\u7ee7\u627f\u7684\u60c5\u51b5\u4f1a\u51cf\u5c11\uff0c\u81ea\u52a8\u5316\u4ee3\u7801\u7684\u8c03\u7528\u7ed3\u6784\u4e5f\u4f1a\u53d8\u5f97\u7b80\u5355\uff0c\u800c\u4e14\u529f\u80fd\u6d4b\u8bd5\u540c\u5b66\u7f16\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u66f4\u52a0\u5bb9\u6613\u4e0a\u624b\u3002 \u4ee5\u524d\u5199\u7528\u4f8b\u7531\u4e8e\u9700\u8981\u7ed3\u5408\u4e0d\u540c\u7684\u6a21\u5757\uff0c\u8c03\u7528\u4e0d\u540c\u7684\u65b9\u6cd5\uff0c\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u5e76\u5b8c\u6210\u8c03\u8bd5\u7684\u65f6\u95f4\u5e73\u5747\u572820-30\u5206\u949f\uff0c\u73b0\u5728\u5199\u7528\u4f8b\u811a\u672c\u80fd\u57285\u5206\u949f\u5de6\u53f3\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":"# =============================================\n# Attribution : Application Test Department III\n# Time : 2023/1/3\n# Author : ut003281\n# =============================================\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u7b80\u8ff0","text":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5 \u901a\u8fc7\u81ea\u52a8\u5316\u624b\u6bb5\u5bf9\u5e94\u7528\u8fdb\u884c\u6027\u80fd\u6d4b\u8bd5\uff0c\u63d0\u4f9b\u65b9\u4fbf\u7684\u73af\u5883\u90e8\u7f72\u3001\u8fd0\u884c\u914d\u7f6e\u3001\u7528\u4f8b\u7f16\u5199\u7b49\uff0c\u7528\u4e8e\u684c\u9762\u5e94\u7528\u7684\u51b7\u70ed\u542f\u52a8\u3001\u8d44\u6e90\u62f7\u8d1d\u3001\u9875\u9762\u8df3\u8f6c\u7b49\u6027\u80fd\u573a\u666f\u6d4b\u8bd5\u3002 \u4ed3\u5e93\u5730\u5740\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-perf-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u4ee3\u7801\u7ed3\u6784","text":"autotest-perf-aitest\n\u251c\u2500\u2500 apps # \u5b58\u653e\u6240\u6709\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u811a\u672c\n\u251c\u2500\u2500 conftest.py # pytest hook\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 CURRENT # \u7248\u672c\u5185\u5bb9\n\u251c\u2500\u2500 docs # \u6587\u6863\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u952e\u503c\u5bf9\u7167\u8868.pdf # \u4e32\u53e3\u7ebfcode\u4e0e\u6309\u952e\u7684\u5bf9\u7167\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u6027\u80fd\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\u6267\u884c\u5668\u4f7f\u7528\u6307\u5357.md # \u6267\u884c\u5668\u811a\u672c\u4f7f\u7528\u6307\u5357\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 USB\u4e32\u53e3\u8f6cUSB\u952e\u76d8\u9f20\u6807\u7ebf\u534f\u8bae\u6587\u4ef6V1.0.pdf # \u4e32\u53e3\u534f\u8bae\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput-0.28.2.zip # Linux\u4e0b\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\u7684\u6e90\u7801\uff0c\u53ef\u6839\u636e\u67b6\u6784\u6253\u5305\n\u251c\u2500\u2500 manage.py # \u529f\u80fd\u4e3b\u5165\u53e3\n\u251c\u2500\u2500 pytest.ini # pytst \u914d\u7f6e\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 setting # \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 client.ini # \u6d4b\u8bd5\u673a IP \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5168\u5c40\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dev_env.sh # \u5bbf\u4e3b\u673a\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose_no_relay.yml # \u65e0\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose.yml # \u6709\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker_login.sh # docker \u767b\u9646\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 res\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 black.png # \u5168\u9ed1\u56fe\u7247\uff0c\u7528\u4e8e\u4fee\u6539\u58c1\u7eb8\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_5000.deb # 3A5000 \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_amd64.deb # amd \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_arm64.deb # arm \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_mips64.deb # mips \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_sw_64.deb # sw \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 server.ini # \u670d\u52a1\u5668\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 setup.sh # \u5bb9\u5668\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 template # \u521b\u5efa app \u57fa\u7840\u811a\u672c\u6a21\u677f\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 app_template\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ${app_name}_widget.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 control-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 images\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 test_${app_name}_01_scene.json-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 test_${app_name}_01_scene.py-tpl\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 uos_docker # \u5bb9\u5668\u73af\u5883\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dockerfile\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 requirements.txt\n\u2514\u2500\u2500 src\n \u251c\u2500\u2500 analysis_save.py # \u89e3\u6790\u56fe\u7247\u6d41\u7ed3\u679c\uff0c\u6c47\u603b\u751f\u6210 excel \u62a5\u544a\n\u251c\u2500\u2500 base_widget.py # \u5c01\u88c5\u7684\u57fa\u7840\u64cd\u4f5c\uff0c\u5e94\u7528\u8c03\u7528\u7684\u4e3b\u5165\u53e3\u65b9\u6cd5\n\u251c\u2500\u2500 cmdctl.py # \u8c03\u7528\u547d\u4ee4\u884c\u4f7f\u7528\n\u251c\u2500\u2500 global_value.py # \u5168\u5c40\u53d8\u91cf\n\u251c\u2500\u2500 image_utils.py # \u56fe\u7247\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 __init__.py\n \u251c\u2500\u2500 logger_utils.py # \u65e5\u5fd7\u914d\u7f6e\n\u251c\u2500\u2500 pdocr.py # ocr \u914d\u7f6e\n\u251c\u2500\u2500 public_method.py # \u4e00\u4e9b\u65b9\u4fbf\u7684\u5c01\u4f4f\n\u251c\u2500\u2500 record.py # \u5f55\u5c4f\u76f8\u5173\n\u251c\u2500\u2500 rtk # \u8fd0\u884c\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 _base.py # \u4e00\u4e9b\u679a\u4e3e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 install_env.py # \u5b89\u88c5\u73af\u5883\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 local_runner.py # \u8fd0\u884c\u7528\u4f8b\n\u251c\u2500\u2500 serial_communication # \u4e32\u53e3\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 power_control.py # \u7ee7\u7535\u5668\u64cd\u4f5c\uff0c\u4f7f\u7528\u7ee7\u7535\u5668\u8fde\u63a5\u4e3b\u673a\u7535\u6e90\uff0c\u63a7\u5236\u5f00\u5173\u673a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 serial_common.py # \u4e32\u53e3\u516c\u5171\u65b9\u6cd5\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 usb_mk.py # \u952e\u9f20\u64cd\u4f5c\u57fa\u7840\u5c01\u88c5\n\u251c\u2500\u2500 shortcut_key.py # \u5feb\u6377\u952e\u7684\u5c01\u88c5\n\u251c\u2500\u2500 singleton.py # \u5355\u4f8b\u6a21\u5f0f\n\u251c\u2500\u2500 start_app.py # \u521b\u5efa app\n\u2514\u2500\u2500 write_xlsx.py # \u751f\u6210 excel\n# __init__.py \u6587\u4ef6\u4e3a\u6807\u8bc6\u8be5\u76ee\u5f55\u662f\u4e00\u4e2aPython\u7684\u6a21\u5757\u5305\uff0c\u9879\u76ee\u4e2d\u7684__init__.py\u5747\u4e3a\u7a7a\u6587\u4ef6\u3002\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u73af\u5883\u642d\u5efa","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\u3002 \u670d\u52a1\u7aef\u4e00\u53f0\u3002\uff08\u4ec5\u652f\u6301 AMD \u67b6\u6784\uff0c\u82e5\u9700\u5176\u4ed6\u67b6\u6784\uff0c\u54a8\u8be2\u76f8\u5173\u5f00\u53d1\u4eba\u5458\uff09 \u91c7\u96c6\u76d2\u4e00\u4e2a\u3002 \uff08ACASIS HDMI \u89c6\u9891\u91c7\u96c6\u76d2\uff0chttps://item.jd.com/100013302599.html#crumb-wrap \uff09 USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\u3002\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"\uff082\uff09\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\u3002 USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff08USB3.0 \u63a5\u53e3\u4e0a\uff09\u3002 \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5 USB \u5ef6\u957f\u7ebf\u3002 \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u670d\u52a1\u7aef\u63a8\u8350\u914d\u7f6e","text":"\u914d\u7f6e\u8d8a\u9ad8\uff0c\u89e3\u6790\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"2\u3001\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa","text":" \u6253\u5f00\u63a7\u5236\u4e2d\u5fc3\uff0c\u8d26\u6237\u8bbe\u7f6e\u4e3a\u3010\u81ea\u52a8\u767b\u5f55\u3011\u548c\u3010\u65e0\u5bc6\u7801\u767b\u5f55\u3011\uff0c\u7535\u6e90\u7ba1\u7406\u4e2d\u4f7f\u7528\u7535\u6e90\u5168\u90e8\u8bbe\u7f6e\u4e3a\u3010\u4ece\u4e0d\u3011\uff0c\u5f00\u542f\u5f00\u53d1\u8005\u6a21\u5f0f\u3002 \u6839\u636e\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u8981\u6c42\uff0c\u5bfc\u5165\u76f8\u5173\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\uff1a\u5bfc\u5165\u76f8\u518c\u3001\u5f71\u9662\u3001\u97f3\u4e50\u7684\u6d4b\u8bd5\u8d44\u6e90\u3002 \u5728\u670d\u52a1\u7aef\u6253\u5f00\u76f8\u673a\u5e94\u7528\u540e\uff0c\u5c06\u6d4b\u8bd5\u673a\u684c\u9762\u58c1\u7eb8\u66f4\u6362\u4e3a\u7eaf\u8272\u58c1\u7eb8\uff08\u6ce8\u610f\uff0c\u670d\u52a1\u7aef\u9700\u63d0\u524d\u5f00\u542f\u76f8\u673a\u540e\u518d\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u58c1\u7eb8\uff0c\u5efa\u8bae\u7eaf\u9ed1\u58c1\u7eb8 setting/res/black.png\uff09 \u5728\u6587\u4ef6\u7ba1\u7406\u5668\u4e2d\uff0c\u5c06\u9009\u9879 \u4e3b\u83dc\u5355-\u8bbe\u7f6e-\u9884\u89c8-\u56fe\u7247\u9884\u89c8 \u53d6\u6d88\u52fe\u9009\uff08\u5982\u4e0d\u53d6\u6d88\uff0c\u4f1a\u5f71\u54cd\u622a\u56fe\u5f55\u5c4f\u5e94\u7528\u7684\u6027\u80fd\u6570\u636e\uff09 \u79fb\u52a8\u6216\u5220\u9664\u7cfb\u7edf Logo \uff0c\u6392\u9664\u684c\u9762\u53f3\u4e0b\u89d2 Logo \u7684\u5f71\u54cd\uff08\u91cd\u542f\u751f\u6548\uff09\u3002 sudo mv /usr/share/deepin/uos_logo.svg ~/Pictures/\n \u5b89\u88c5\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\uff08\u5fc5\u987b\u5b89\u88c5\uff01\uff01\uff09 AMD \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_amd64.deb ARM \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_arm64.deb MIPS \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_mips64.deb 3A5000 \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_5000.deb \u5b89\u88c5\u547d\u4ee4 sudo dkpg -i xserver-xorg-input-libinput_0.28.2-2_amd64.deb\n \u5b89\u88c5\u65f6\u4f1a\u63d0\u793a\u5df2\u5b58\u5728\u76f8\u540c\u7248\u672c\uff0c\u8bf7\u5ffd\u7565\uff0c\u76f4\u63a5\u8986\u76d6\u5b89\u88c5\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u4e3b\u673a\u624d\u751f\u6548"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u670d\u52a1\u7aef\u4e00\u952e\u73af\u5883\u90e8\u7f72","text":"\u73af\u5883\u642d\u5efa\u524d\u5fc5\u987b\u5148\u8fde\u63a5\u4e0a USB \u4e32\u53e3\u7ebf\u548c\u91c7\u96c6\u76d2\u3002 \u5bbf\u4e3b\u673a\u73af\u5883\u5b89\u88c5 python3 manage.py install --env host\n \u5bb9\u5668\u73af\u5883\u5b89\u88c5 python3 manage.py install --env docker\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u56db\u3001\u914d\u7f6e\u9879","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u670d\u52a1\u7aef\u914d\u7f6e","text":"setting/config/server.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u914d\u7f6e\u9879\uff0c\u5305\u542b\u4e86\u6240\u6709\u670d\u52a1\u7aef\u6240\u6709\u7684\u53ef\u914d\u7f6e\u9879\u3002 \u672c\u5730\u65e0\u7f51\u7edc\u8fd0\u884c \u5c06\u914d\u7f6e\u9879 network=0 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u672c\u5730\u6709\u7f51\u7edc\u8fd0\u884c \u914d\u7f6e\u9879 network=1 (1)\u914d\u7f6e\u9879 client_alias= \u914d\u7f6e\u4e3a\u4f60\u8981\u6d4b\u8bd5\u7684\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5982 Alias1 \u6d4b\u8bd5\u673a\u522b\u540d\u5728 setting/config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 (2)\u914d\u7f6e\u9879 client_alias= \u4e3a\u7a7a\uff0c\u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager --client_alias Alias1\uff0c\u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002(Alias1 \u4e3a\u4f60\u914d\u7f6e\u7684\u6d4b\u8bd5\u673a\u522b\u540d) (1)\u548c(2)\u53ea\u8981\u4f7f\u7528\u5176\u4e00\u5373\u53ef\u3002 \u6709\u7f51\u7edc\u8fd0\u884c\uff0c\u4e14\u9700\u8981\u901a\u8fc7 Jenkins \u4e0a\u8fd0\u884c\u4e00\u4e2a job \uff0c\u540c\u65f6\u63a7\u5236\u591a\u53f0\u673a\u5668\u3002 \u914d\u7f6e\u9879 network=1 \u914d\u7f6e\u9879 client_alias= \u4e0d\u7528\u914d\u7f6e\uff0c\u5728\u8fd0\u884c run.sh \u7684\u65f6\u5019\u76f4\u63a5\u7a7a\u683c\u52a0\u522b\u540d\u5373\u53ef\uff0c\u6bd4\u5982\uff1a\u6d4b\u8bd5\u673a\u522b\u540d\u4e3a Alias1 \uff0c\u4e14\u5df2\u7ecf\u5728 config/client.ini \u4e2d\u914d\u7f6e\u4e86 Alias1 \u7684user ip password \uff0c\u5219\u8fd0\u884c bash run.sh Alias1 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u5728 Jenkins pipeline \u91cc\u9762\u901a\u8fc7\u5e76\u884c stage \u6216\u5e76\u884c\u8c03\u7528\u4e0b\u5c42\u4efb\u52a1\u7684\u65b9\u5f0f\u53ef\u4ee5\u5b9e\u73b0\u5927\u89c4\u6a21\u7684\u6027\u80fd\u6d4b\u8bd5\u9700\u6c42\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;1\u3001KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2\u3001KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f, e.g. TAGS = L1 or smoke\n[case_conf]\n# \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\uff0cocr\u6587\u6848\u8bc6\u522b\u8f83\u6162\uff0c\u4e0d\u63a8\u8350\u4f7f\u7528\nfind_by = stage\n# \u6700\u540e\u4e00\u4e2a\u7a33\u5b9a\u9636\u6bb5\u7684\u5e27\u6570\u8bc6\u522b\n# \u9996\u5e27\u5b58\u5728\u540e\u7684\u7b2c\u4e00\u4e2a\u5927\u4e8e\u8be5\u914d\u7f6e\u5e27\u6570\u7684\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u5c3e\u5e27\nfinal_stable_num=100\n# \u4ece\u8be5\u5e27\u6570\u5f00\u59cb\u8bc6\u522b\u6587\u6848\u6216\u56fe\u7247\uff0c\u51cf\u5c11\u5206\u6790\u65f6\u95f4\nstart_num = 150\n# \u8bc6\u522b\u7684\u6587\u6848\ntext=\n# \u8bc6\u522b\u56fe\u7247\nmatch=apps/xxx/images/match.png\n# \u8bc6\u522b\u76f8\u4f3c\u5ea6\nmatch_rate=0.9\n# \u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6bd4\u5982\u70ed\u542f\u52a8\u7528\u4f8b\uff0c\u4ece\u70b9\u51fb\u6253\u5f00\u5230\u505c\u6b62\u5f55\u5c4f\uff0c\u4e2d\u95f4\u7b49\u5f855\u79d2\uff1b\nduration = 15\n# \u5355\u6761\u7528\u4f8b\u6267\u884c\u7684\u6b21\u6570\ncount = 5\n# \u7a33\u5b9a\u9636\u6bb5\u5212\u5206\u7684\u76f8\u4f3c\u5ea6\nstable_similarity = 0.9997\n[server]\n# \u8c03\u8bd5\u6a21\u5f0f=1\uff0c\u4e3a\u5f00\u542f\u8c03\u8bd5\u6a21\u5f0f\uff0c0\u4e3a\u5173\u95ed\u3002\n# \u8c03\u8bd5\u6a21\u5f0f\u4e0b\u9ed8\u8ba4\u53ea\u6267\u884c\u4e00\u6b21\u7528\u4f8b\uff0c\u4e0d\u5173\u673a\n# \u7f16\u5199\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u5efa\u8bae\u5f00\u542fmaintain\u3002\nMAINTAIN = 0\n# \u8fd0\u884c\u7684\u73af\u5883docker\u5bb9\u5668\u73af\u5883\uff0chost\u5bbf\u4e3b\u673a\u73af\u5883\nENV = docker\n# \u670d\u52a1\u7aef\u5bc6\u7801\nPASSWORD=1\n# \u6307\u5b9a\u6d4b\u8bd5\u673a\u522b\u540d\n# \u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6bd4\u5982\uff1a\n# [AMD]\n# ip=10.8.15.86\n# user=uos\n# \u5176\u4e2d AMD \u4e3a\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5219client_alias=AMD\nCLIENT_ALIAS = x86\uff08Intel-i7\uff09\n# 1 \u5f00\u542f\u7f51\u7edc, 0 \u5173\u95ed\u7f51\u7edc\n# \uff081\uff09\u670d\u52a1\u7aef\u4e0e\u6d4b\u8bd5\u673a\u987b\u5728\u540c\u4e00\u7f51\u6bb5\u4e0b\uff0c\u4f60\u53ef\u4ee5\u5c1d\u8bd5\u5728\u670d\u52a1\u7aef\u901a\u8fc7ssh\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c\u5982\u679c\u53ef\u4ee5\u8fde\u63a5\uff0c\u8bf4\u660e\u7f51\u7edc\u6b63\u5e38\u3002\n# \uff082\uff09\u5f53input_type=FILE_NAME \u65f6\uff0c\u5fc5\u987b\u5f00\u542f\u7f51\u7edc\u3002\nNETWORK = 1\n# \u6027\u80fd\u7ed3\u679c\u7edf\u8ba1\u5355\u4f4d \u6beb\u79d2\u2014ms, \u79d2\u2014s\nUNIT=ms\n# \u6d4b\u8bd5\u673a\u5f00\u673a\u8fdb\u5165\u684c\u9762\u540e\u7b49\u5f85\u65f6\u95f4,\u5355\u4f4d/\u79d2\nSTARTUP_DELAY = 60\n# 1\u4e3a\u5220\u9664\u7f13\u5b58\uff0c0\u4e3a\u4e0d\u5220\u9664\u7f13\u5b58\n# \u7528\u4f8b\u6267\u884c\u5b8c\u540e\u4f1a\u5728report\u76ee\u5f55\u4e0b\u751f\u6210\u667a\u80fd\u89e3\u6790\u7684\u4e00\u4e9b\u7f13\u5b58\u56fe\u7247\u3002\nCACHE = 0\n# \u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u62a5\u544a\u4f1a\u4fdd\u5b58\u5728\u9879\u76ee\u4e0breport\u76ee\u5f55\u4e2d\uff1b\n# \u6307\u5b9a\u62a5\u544a\u76ee\u5f55\u5219\u5b58\u653e\u5230\u6307\u5b9a\u76ee\u5f55\u3002\nREPORT_PATH = report\n# \u670d\u52a1\u7aef\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684icon\u8d44\u6e90\u4f1a\u7f13\u5b58\u5728\u9879\u76ee\u4e0binput\u76ee\u5f55\u4e2d\nINPUT = input/\n# 1\u4e3a\u6d4b\u8bd5\u5b8c\u5173\u673a\uff0c0\u4e3a\u6d4b\u8bd5\u5b8c\u4e0d\u5173\u673a\nSHUTDOWN = 0\n# \u89e3\u6790\u8fdb\u7a0b\u6570\uff08\u4e0d\u63a8\u8350\u4fee\u6539\uff09\n# 3\u4e2a\u8fdb\u7a0b\u89e3\u6790\u89c6\u9891\u5df2\u7ecf\u80fd\u591f\u6ee1\u8db3\uff0c\u5373\u4f7f\u589e\u52a0\u8fdb\u7a0b\u6570\u4e5f\u4e0d\u80fd\u51cf\u5c11\u6574\u4f53\u8017\u65f6\n# \u53e6\u5916\u8fd8\u8981\u770bCPU\u6838\u6570\u662f\u5426\u652f\u6301\u3002\nPARSING_PROCESS = 3\n# 1\u4e3a\u4f7f\u7528\u7ee7\u7535\u5668\u5f00\u5173\u673a\uff0c0\u4e3a\u4f7f\u7528reboot\u547d\u4ee4\u91cd\u542f\u3002\u4f9d\u8d56\u7ee7\u7535\u5668\u786c\u4ef6\u8bbe\u5907\uff0c\u9700\u8981\u4f7f\u7528\u8054\u7cfb\u5f00\u53d1\u8005\nRELAY = 0\n# \u83b7\u53d6\u6d4b\u8bd5\u5e94\u7528\u7684\u7248\u672c, %s \u5360\u4f4d\u5e94\u7528\u540d\n# \u5982\u679c\u8be5\u914d\u7f6e\u4e3a\u7a7a\uff0c\u5219\u4e0d\u83b7\u53d6\u5e94\u7528\u7684\u7248\u672c\u4fe1\u606f\u3002\nCOMMAND = apt policy %s 2>/dev/null|grep \"\u5df2\u5b89\u88c5\"|awk -F \"\uff1a\" \"{print \\$2}\"\n# \u5173\u673a\u7b49\u5f85\u5f00\u542f\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6839\u636e\u6d4b\u8bd5\u673a\u6027\u80fd\u4e0d\u540c\uff0c\u5f00\u5173\u673a\u8017\u65f6\u53ef\u80fd\u4e0d\u540c\uff0c\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u673a\u60c5\u51b5\u914d\u7f6e\u3002\nSHUTDOWN_DELAY = 30\n# \u53ef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u56fe\u7247\u683c\u5f0f\uff0c\u4ee5\u82f1\u6587\u9017\u53f7\u9694\u5f00\u3002\n# \u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u76ee\u524d\u6211\u4eec\u4ec5\u9a8c\u8bc1\u4e86jpg,jpeg,png\u8fd9\u4e09\u79cd\u5e38\u7528\u7684\u56fe\u7247\u683c\u5f0f\u3002\nINPUT_TYPES = jpg,jpeg,png\n# \u6027\u80fd\u5206\u6790\u8865\u5e27\uff0c\u7b49\u4e8e\u6216\u4f4e\u4e8e\u8be5\u503c\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u9700\u8981\u51cf\u6389\u3002\nUN_STAB_START = 3\n# \u670d\u52a1\u7aef\u83b7\u53d6\u6d4b\u8bd5\u673a\u56fe\u50cf\u7684\u5e27\u7387\uff0c\u5373\u6bcf\u79d2\u83b7\u53d6\u591a\u5c11\u5f20\u6d4b\u8bd5\u673a\u4e0a\u7684\u56fe\u50cf\u3002\n# \u9ed8\u8ba4\u5e27\u7387\u4e3a30\u5e27/\u79d2\uff0c\u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u53ef\u80fd\u4f1a\u5bf9\u89e3\u6790\u7ed3\u679c\u9020\u6210\u504f\u5dee\u3002\nFPS = 30\n# \u4ee5\u4e0b\u573a\u666f\u7c7b\u578b\u4f1a\u91cd\u542f\u6d4b\u8bd5\u673a,\u591a\u79cd\u573a\u666f\u4f7f\u7528\u9017\u53f7\u9694\u5f00\nSCENE = cold\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = http://10.8.13.78:8890\n#\u5c4f\u5e55\u56fe\u7247\u4e34\u65f6\u5b58\u653e\u4f4d\u7f6e\nSCREEN_CACHE = /tmp/screen\n# =======================================\n[log]\n# \u65e5\u5fd7\u7ea7\u522b\uff0cOFF\u3001FATAL\u3001ERROR\u3001WARN\u3001INFO\u3001DEBUG\u3001ALL\n# \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u65e5\u5fd7\u8f93\u51fa\uff0clog_cli=INFO\u8868\u793a \u4ec5\u8f93\u51faINFO\u53ca\u4ee5\u4e0a\u7ea7\u522b\u7684\u65e5\u5fd7\u3002\nLOG_LEVEL = DEBUG\n# \u65e5\u5fd7\u6587\u4ef6\u4fdd\u5b58\u8def\u5f84\nLOG_PATH= logs\n# =======================================\n[dockerhub]\n# \u5bb9\u5668\u767b\u9646\u8d26\u53f7\nDOCKER_USER = user\n# \u5bb9\u5668\u767b\u9646\u5bc6\u7801\nDOCKER_PASSWORD = User1234\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u6d4b\u8bd5\u673a\u914d\u7f6e","text":"setting/config/client.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u4fe1\u606f\u3002 \u6709\u7f51\u7edc\u7684\u60c5\u51b5\u4e0b\uff0c\u670d\u52a1\u7aef\u9700\u8981\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u56e0\u6b64\u4f60\u9700\u8981\u5199\u5165 \u6d4b\u8bd5\u673a\u522b\u540d \u3001 user \u3001ip\u3001 password \u3002 # \u6d4b\u8bd5\u673a\u522b\u540d\n[Alias1] # \u6d4b\u8bd5\u673aip\nip=10.8.15.86 # \u6d4b\u8bd5\u673a\u7528\u6237\u540d\nuser=uos\n \u547d\u540d\u5efa\u8bae\uff1aAliasA1\u3001AliasA2\u3001AliasB1\u3001AliasB2\uff0c\u4e0d\u8981\u91cd\u540d\u3002 \u65e0\u7f51\u7edc\u60c5\u51b5\u4e0b\uff0c\u4ec5\u9700\u8981\u5173\u6ce8\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\u9879 width=\u3001 height= \u5373\u53ef\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a [client]\n# \u9ed8\u8ba4\u6d4b\u8bd5\u673a\u7528\u6237\u540d\uff0c\u5bc6\u7801\uff0cip\nip=\nuser=\n# \u6d4b\u8bd5\u673a\u5bc6\u7801\npassword=1\n# \u6d4b\u8bd5\u673a\u4e3b\u9898\ntheme=bloom\n# \u6d4b\u8bd5\u673aicon\u76ee\u5f55\npath=/usr/share/icons\n# \u7cfb\u7edfdesktop\u6587\u4ef6\u7684\u5b58\u653e\u76ee\u5f55\uff0cUOS\u7cfb\u7edf\u9ed8\u8ba4\u4e3a/usr/share/applications\ndesktop_path=/usr/share/applications\n# \u7528\u4e8e\u5224\u65ad\u6d4b\u8bd5\u673a\u662f\u5426\u5f00\u673a\u8fdb\u5165\u684c\u9762\u7684\u8bc6\u522b\u6807\u8bc6\u3002\n# 1\u3001\u901a\u8fc7\u684c\u9762\u56fe\u6807\u8bc6\u522b\u3002\n# - type=FILE_NAME\u65f6\uff0c\u670d\u52a1\u5668\u548c\u6d4b\u8bd5\u673a\u5fc5\u987b\u5728\u540c\u4e00\u5c40\u57df\u7f51\u5185\u3002\n# - power_on=dde-computer\u8868\u793a\u901a\u8fc7\u684c\u9762\u8ba1\u7b97\u673a\u56fe\u6807\u5224\u65ad\u5f00\u673a\u8fdb\u5165\u684c\u9762\u3002\n# 2\u3001\u901a\u8fc7\u672c\u5730\u56fe\u7247\u4f5c\u4e3a\u5f00\u673a\u8bc6\u522b\u3002\n# - type= \u4f20\u5165\u4e3a\u56fe\u7247\u683c\u5f0f\uff0ctype\u652f\u6301\u7684\u7c7b\u578b\u5305\u542b\u5728server.ini\u5185\u914d\u7f6e\u9879input_type=jpg,jpeg,png\u3002\n# - power_on= \u4f20\u5165\u7684\u662f\u672c\u5730\u56fe\u7247\u7684\u8def\u5f84\u3002\ntype=FILE_NAME\npower_on=dde-computer\n# \u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\uff08\u6d4b\u8bd5\u673a\u8fde\u63a5\u91c7\u96c6\u76d2\uff0c\u91c7\u96c6\u76d2\u7684\u5206\u8fa8\u7387\uff09\nheight=1080\nwidth=1920\n[AliasA1] ip=10.8.15.86\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n[AliasA2]\nip=10.8.15.20\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_2","title":"3\u3001\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e","text":"\u968f\u7740\u6d4b\u8bd5\u573a\u666f\u7684\u4e0d\u65ad\u5f15\u5165\uff0c\u53d1\u73b0\u73b0\u6709\u670d\u52a1\u7aef\u91cc\u7684\u914d\u7f6e\u9879\u5e76\u4e0d\u9002\u7528\u4e8e\u6240\u6709\u7684\u6027\u80fd\u573a\u666f\uff0c\u4e8e\u662f\u5c06\u670d\u52a1\u7aef\u914d\u7f6e\u8fdb\u884c\u4e00\u4e2a\u63d0\u53d6\uff0c\u53ef\u505a\u5355\u4e2a\u573a\u666f\u7684\u4e2a\u6027\u5316\u914d\u7f6e\uff0c\u5f53\u7136\u539f\u6765\u7684\u670d\u52a1\u7aef\u914d\u7f6e\u529f\u80fd\u4fdd\u7559\uff0c\u53ea\u662f\u5f53\u4f60\u914d\u7f6e\u4e86\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e\u540e\uff0c\u4f18\u5148\u4f7f\u7528\u4e2a\u6027\u5316\u914d\u7f6e\u91cc\u9762\u7684\u5185\u5bb9\uff0c\u4ee5\u4e0b\u662f\u5bf9\u4e2a\u6027\u5316\u914d\u7f6e\u7684\u4ecb\u7ecd\u3002 \u76ee\u524d\u6bcf\u4e00\u4e2a py \u6587\u4ef6\u5bf9\u5e94\u4e00\u4e2a\u6027\u80fd\u6d4b\u8bd5\u573a\u666f\uff0c\u4e8e\u662f\u5728\u540c\u7ea7\u76ee\u5f55\u4e0b\u521b\u5efa\u4e00\u4e2a\u4e0e\u4e4b\u540c\u540d\u7684 json \u6587\u4ef6\uff0c\u4f5c\u4e3a\u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6 apps\n\u251c\u2500\u2500 album\n \u251c\u2500\u2500 test_album_01_start.json # \u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6\n\u2514\u2500\u2500 test_album_01_start.py # \u6027\u80fd\u573a\u666f\u6587\u4ef6\n \u4ee5\u4e0b\u662f\u5bf9 json \u6587\u4ef6\u4e2d\u914d\u7f6e\u7684\u89e3\u91ca\uff0c\u82e5\u67d0\u9879\u914d\u7f6e\u4e0d\u9700\u8981\uff0c\u53ef\u4ee5\u7f3a\u5931\uff0c\u4f46\u4e0d\u80fd\u4e3a\u7a7a\uff1b {\n\"title\": \"test_album_start\", # \u6807\u9898\uff1b\u5fc5\u987b\n\"app_name\": \"deepin-album\", # \u573a\u666f\u6240\u5c5e\u7684\u5e94\u7528\uff1b\u5fc5\u987b\n\"scene\": \"hot\", # \u573a\u666f\u522b\u540d\uff1b\u5fc5\u987b\n\"icon\": [\"deepin-album\"], # \u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684icon\u5230\u670d\u52a1\u7aef\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\uff1b\u53ef\u7f3a\u5931\n# \u6ce8\u610f\uff1a\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684desktop\u6587\u4ef6\u540d\u4e3adeepin-album.desktop\uff0c\n# \u53ea\u9700\u8981\u5199deepin-album\u5373\u53ef\uff0c\u201c.desktop\u201d\u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002\n\"size\": { # \u56fe\u7247\u5bf9\u6bd4\u7684\u533a\u57df\u8bbe\u7f6e\u9879\uff0c\u67d0\u4e9b\u5e94\u7528\u5f53\u524d\u5c4f\u5e55\u7684\u90e8\u5206\u533a\u57df\u9700\u8981\u5c06\u5176\u53bb\u6389\uff0c\u53ef\u4ee5\u8bbe\u7f6e\u6b64\u9879\uff0c\u5982\u679c\u6ca1\u6709\u5219\u53ef\u4e0d\u5199\uff1b\u53ef\u786e\u5b9e\n\"x-coordinate\": 0, # \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n\"y-coordinate\": 0, # \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n\"width\": 850, # \u6a2a\u5411\u957f\u5ea6\n\"height\": 1920 # \u7eb5\u5411\u9ad8\u5ea6\n},\n\"count\": 5, # \u573a\u666f\u6267\u884c\u7684\u6b21\u6570\uff1b\u5fc5\u987b\n\"duration\": 5, # \u8be5\u6761\u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff0c\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7279\u5b9a\u573a\u666f\uff0c\u8be5\u914d\u7f6e\u4e3a\u53ef\u9009\u9879\uff0c\u8986\u76d6 server.ini \u4e2d\u7684\u914d\u7f6e\uff1b\u53ef\u7f3a\u5931\n\"stable_similarity\": 0.9997, # \u6027\u80fd\u573a\u666f\u5206\u9636\u6bb5\u65f6\u7684\u56fe\u7247\u76f8\u4f3c\u5ea6\u5bf9\u6bd4\uff0c\u524d\u540e\u56fe\u7247\u4f4e\u4e8e\u8be5\u503c\uff0c\u5219\u5206\u4e3a\u4e0d\u7a33\u5b9a\u9636\u6bb5\uff1b\u53ef\u7f3a\u5931\n\"find_by\": \"stage\", # \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\n\"final_stable_num\": 100, # \u67e5\u627e\u6700\u540e\u4e00\u4e2a\u5927\u4e8e\u8be5\u503c\u7684\u7a33\u5b9a\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u7684\u5c3e\u796f\uff1b\u53ef\u7f3a\u5931\n\"start_num\": 150,\n\"text\": \"\", # ocr\u8bc6\u522b\u7684\u6587\u6848\n\"match\": \"apps/xxx/images/match.png\", # \u56fe\u50cf\u5339\u914d\u7684\u56fe\u7247\u6587\u4ef6\u8def\u5f84\n\"match_rate\": 0.9 # \u5339\u914d\u76f8\u4f3c\u5ea6\n}\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e94\u3001\u6d4b\u8bd5\u6d41\u7a0b","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516d\u3001\u7528\u4f8b\u7f16\u5199\u53ca\u65b9\u6cd5\u53c2\u6570\u6307\u5f15","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"1\u3001\u7528\u4f8b\u5b9e\u4f8b\u8bf4\u660e","text":"# \u6807\u51c6\u5e93\u5bfc\u5165\nfrom time import sleep\n# \u5bfc\u5165\u4e09\u65b9\u5e93pytest\nimport pytest\n# \u5bfc\u5165\u7528\u4f8b\u6267\u884c\u8981\u7528\u5230\u7684Widget\u7c7b\nfrom src.base_widget import BaseWidget\nclass TestStart:\n# class\u7ea7\u522b\u7684fixture\uff0c\u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u6267\u884c\u3002autouse=True \u81ea\u52a8\u5728\u5f53\u524d\u4f5c\u7528\u57df\u4e0b\u4f7f\u7528\u3002\n@pytest.fixture(scope=\"class\", autouse=True)\n# \u6d4b\u8bd5\u70ed\u542f\u52a8\u4e4b\u524d\u9700\u8981\u9884\u542f\u52a8\u3002\ndef application_pre_start(self):\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().right_click_element(\"deepin-album\")\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().click_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\")\nsleep(2)\n# \u5feb\u6377\u952e\u5173\u95ed\u7a97\u53e3\nBaseWidget().hot_key(\"alt\", \"f4\")\nsleep(2)\n# \u9ed8\u8ba4\u4e3afunction\u7ea7\u522b\u7684fixture\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\uff0cclass\u7ea7\u522bfixture\u6267\u884c\u4e4b\u540e\u6267\u884c\u3002\n@pytest.fixture(autouse=True)\ndef setup_start(self):\n# \u53f3\u952e\u70b9\u51fb deepin-album \u56fe\u6807\nBaseWidget().right_click_element(\"deepin-album\")\n# \u79fb\u52a8\u5230\u53f3\u952e\u83dc\u5355\u4e2d\u6253\u5f00\uff08open.png\uff09\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().move_to(*BaseWidget().find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))\n# \u7b49\u5f85\u79fb\u52a8\u5b8c\u6210\nsleep(0.5)\ndef test_album_start(self):\n# \u70b9\u51fb\u201c\u6253\u5f00\u201d\nBaseWidget().click() \n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"2\u3001\u65b9\u6cd5\u53c2\u6570\u8bf4\u660e","text":"2.1\u3001find_element \u65b9\u6cd5 def find_element(element: str, input_type: str = \"FILE_NAME\", fill_color_position: tuple = (-1, -1), size: tuple = (25, 70)):\npass\n \u53c2\u6570 element \u548c input_type \uff081\uff09\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u5143\u7d20 - `input_type` \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a `FIEL_NAME` \uff0c\u8868\u793a\u901a\u8fc7\u5e94\u7528 `icon` \u5bfb\u627e\u5143\u7d20\uff0c\u6b64\u65b9\u6cd5\u4f1a\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u5e94\u7528 `icon` \u56fe\u6807\u3002\n \u4e3e\u4f8b\uff1a\u9ed8\u8ba4\u60c5\u51b5\u4e0b input_type \u53c2\u6570\u4e0d\u9700\u8981\u4f20\u5165\uff0c find_element(\"deepin-album\")\uff0c\u8868\u793a\u901a\u8fc7 deepin-album \u7684\u5e94\u7528 icon \u6765\u83b7\u53d6\u5750\u6807\uff0c\u6ce8\u610f\uff0c\u6b64\u65f6\u4f20\u5165\u7684 deepin-album \u53c2\u6570\u5b9e\u9645\u662f desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u548c2.3\u4e2d\u7684 icon \u53d8\u91cf\u4e00\u81f4\u3002 \u6211\u4eec\u5efa\u8bae\u4f18\u5148\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\uff0c\u4f46\u6b64\u65b9\u6cd5\u4f9d\u8d56\u7f51\u7edc\uff0c\u8bf7\u6839\u636e\u6d4b\u8bd5\u73af\u5883\u5b9e\u9645\u60c5\u51b5\u9009\u62e9\u3002 \uff082\uff09\u901a\u8fc7\u672c\u5730\u56fe\u7247\u8bc6\u522b\u5143\u7d20 - \u53c2\u6570 `input_type` \u4f20\u5165\u56fe\u7247\u683c\u5f0f\uff0c\u6bd4\u5982\u622a\u53d6\u7684\u672c\u5730\u56fe\u7247\u683c\u5f0f\u4e3a `png`\uff0c\u90a3\u4e48 `input_type=\"png\"`\uff0c\u6b64\u65f6\u53c2\u6570 `element ` \u4f20\u5165\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5efa\u8bae\u5b58\u653e\u5728\u5bf9\u5e94\u7684\u4ea7\u54c1 `apps/app/picture/` \u76ee\u5f55\u4e0b\uff0c\u8def\u5f84\u4e3a\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u7684\u76f8\u5bf9\u8def\u5f84\u3002\n- \u4e3e\u4f8b\uff1a`find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))`\uff0c\u8868\u793a\u901a\u8fc7\u672c\u5730\u56fe\u7247 `open.png` \u8bc6\u522b\u5143\u7d20\u3002\n \u53c2\u6570 fill_color_position fill_color_position \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (-1, -1)\uff0c(-1, -1) \u8868\u793a\u53d6\u5c4f\u5e55\u4e2d\u53f3\u4e0b\u89d2\u6700\u540e\u4e00\u4e2a\u50cf\u7d20\u70b9\u4f5c\u4e3a\u586b\u5145\u5750\u6807\uff0c\u5728 1920x1080 \u5c4f\u5e55\u5206\u8fa8\u7387\u4e0b\u5373\u5b9e\u9645\u5750\u6807\u4e3a (1919, 1079) \uff0c\u8fd9\u6837\u7684\u5199\u6cd5\u53ef\u4ee5\u9002\u914d\u4e0d\u540c\u5927\u5c0f\u7684\u5c4f\u5e55\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0d\u540c\u65b9\u4f4d\uff1a \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0b\u65b9\uff0c\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u4e0d\u9700\u8981\u4f20\u5165\u8be5\u53c2\u6570\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u5de6\u8fb9\uff0cfill_color_position=(1, 1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u53f3\u8fb9\uff0cfill_color_position=(-1, -1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0a\u8fb9\uff0cfill_color_position=(1, 1) \u4ece\u684c\u9762\u542f\u52a8\u5e94\u7528\uff0c\u5219\u9700\u8981\u4f20\u5165\u9664\u4efb\u52a1\u680f\u4ee5\u5916\u5176\u4ed6\u4f4d\u7f6e\u7684\u5750\u6807\uff0c\u6bd4\u5982(100, 100)\uff0c\u53ea\u8981\u8fd9\u4e2a\u5750\u6807\u4e3a\u9664\u5e94\u7528\u548c\u4efb\u52a1\u680f\u533a\u57df\u90fd\u53ef\u4ee5\u3002 \u4ece\u542f\u52a8\u5668\u91cc\u9762\u542f\u52a8\u5e94\u7528\uff0c\u9700\u8981\u586b\u5145\u7684\u5750\u6807\u4e3a\u542f\u52a8\u5668\u533a\u57df\u3002 \u6ce8\uff1a\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u65f6\uff0c\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684 icon \u539f\u6587\u4ef6\u4e3a svg \u77e2\u91cf\u56fe\uff0c\u8f6c\u6362\u4e3a png \u4e4b\u540e\u9700\u8981\u586b\u5145\u8fb9\u7f18\u900f\u660e\u90e8\u5206\u3002 \u53c2\u6570 size size \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (25, 70)\uff0c\u8868\u793a\u6d4b\u8bd5\u673a\u4e0a dock \u680f\u4e0a\u5e94\u7528\u56fe\u6807\u7684\u5927\u5c0f\u8303\u56f4\u3002 UOS \u7cfb\u7edf dock \u680f\u662f\u53ef\u4ee5\u4e0a\u4e0b\u62d6\u52a8\u5927\u5c0f\u7684\uff0c\u968f\u7740 dock \u680f\u5927\u5c0f\u6539\u53d8\uff0c\u5e94\u7528\u56fe\u6807\u7684\u8303\u56f4\u4e3a25\u523070\u4e4b\u95f4\u3002 \u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u64cd\u4f5c\u7cfb\u7edf\u4e0a dock \u680f\u5927\u5c0f\u4e0d\u4e00\u6837\uff0c\u53ef\u4ee5\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u4f20\u5165\u5927\u5c0f\u8303\u56f4\u3002 2.2\u3001click_element\u3001 right_click_element\uff0c double_click_element \u8fd9\u51e0\u4e2a\u65b9\u6cd5\u53c2\u6570\u89c4\u5219\u4e0e find_element \u65b9\u6cd5\u4e00\u6837\u3002\u4ed6\u4eec\u5b9e\u9645\u4e0a\u662f\u5728 find_element \u65b9\u6cd5\u57fa\u7840\u4e4b\u4e0a\u505a\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u589e\u52a0\u4e86\u9f20\u6807\u7684\u52a8\u4f5c\uff0c\u5982\u679c\u4f60\u4e0d\u60f3\u4f7f\u7528\u8fd9\u51e0\u4e2a\u65b9\u6cd5\uff0c\u5728\u7528\u4f8b\u4e2d\u4e5f\u53ef\u4ee5\u901a\u8fc7 find_element \u83b7\u53d6\u5230\u5750\u6807\uff0c\u7136\u540e\u5c06\u5750\u6807\u4f20\u5165\u5230\u952e\u9f20\u7684\u65b9\u6cd5\u4e2d\uff0c\u53ef\u4ee5\u5b9e\u73b0\u540c\u6837\u7684\u6548\u679c\u3002 2.3\u3001\u7528\u4f8b\u7c7b\u4e2d\u6709\u4e2a\u7c7b\u53d8\u91cf icon = [\"deepin-album\"] \u9700\u8981\u7279\u6b8a\u8bf4\u660e\uff0c\u5217\u8868\u4e2d\u7684\u5143\u7d20\u4e3a\u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709 icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684 icon \u5230\u670d\u52a1\u7aef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528 desktop \u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684 desktop \u6587\u4ef6\u540d\u4e3a deepin-album.desktop\uff0c\u53ea\u9700\u8981\u5199 deepin-album \u5373\u53ef\uff0c.desktop \u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e03\u3001\u6267\u884c\u5165\u53e3","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"1\u3001\u7528\u4f8b\u7ec4\u7ec7","text":"\u5728 setting/config/server.ini \u6587\u4ef6\u4e2d APP_NAME= \u5b57\u6bb5\u4e3a\u7528\u4f8b\u7684\u6267\u884c\u7684\u76ee\u5f55\uff0c\u9ed8\u8ba4\u4e3a apps \u76ee\u5f55\u4e0b\u6240\u6709\u7528\u4f8b\u3002\u5982\u679c\u4f60\u60f3\u6307\u5b9a\u6267\u884c\u67d0\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4f60\u53ef\u4ee5\u5c06\u8be5\u914d\u7f6e\u9879\u6307\u5b9a\u5230\u5e94\u7528\u7684\u7528\u4f8b\u76ee\u5f55\uff0c\u6bd4\u5982\uff1aAPP_NAME=deepin_album\uff0c \u8868\u793a\u6267\u884c\u76f8\u518c\u76ee\u5f55\u4e0b\u7684\u7528\u4f8b\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a python3 manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music\n -k KEYWORDS, --keywords KEYWORDS\n \u7528\u4f8b\u7684\u5173\u952e\u8bcd\n -t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e\n --log_level LOG_LEVEL \u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n --env {host,docker} \u5728\u5bbf\u4e3b\u673a\u6216\u5bb9\u5668\u73af\u5883\u6267\u884c\n --client_alias \u9009\u62e9\u6d4b\u8bd5\u673a\u522b\u540d, \u53ef\u9009\u9879\u4e3aclient.ini\u4e2d\u5df2\u914d\u7f6e, \u9ed8\u8ba4\u503c\u4e3a zx-x86.\n --count \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a python3 manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\" --env docker\n \u6ce8\uff1a\u5728\u5bb9\u5668\u4e2d\u6267\u884c\u65f6\uff0c\u82e5\u5f3a\u5236\u9000\u51fa\uff0c\u5bb9\u5668\u5e76\u4e0d\u4f1a\u505c\u6b62\u8fd0\u884c\uff01"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_9","title":"\u516b\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1json","title":"1\u3001Json \u62a5\u544a","text":"\u81ea\u7814\u89c6\u9891\u89e3\u6790\u5de5\u5177\u4f1a\u5bf9\u5355\u6761\u7528\u4f8b\u6267\u884c\u4e00\u8f6e\u751f\u6210\u4e00\u4e2a json \u6587\u4ef6\uff0c\u5b58\u653e\u4e8e report/{app_name}/{scene}/{run_num} \u76ee\u5f55\u4e0b\uff0c\u547d\u540d\u683c\u5f0f\u4e3a\uff1a report.json json \u5185\u5bb9\u4e3e\u4f8b\uff1a [\n{\n\"Stab1\": {\n\"images\": [1,2...150,151],\n\"startStub\": 0,\n\"type\": \"Stab\"\n}\n},\n{\n\"Stab2\": {\n\"images\": [152,153...169,170],\n\"startStub\": 1,\n\"type\": \"UnStab\"\n}\n},\n{\n\"Stab3\": {\n\"images\": [171,172...300,301],\n\"startStub\": 0,\n\"type\": \"UnStab\"\n}\n}\n]\n \u8bf4\u660e\uff1a Stab \uff1a\u8868\u793a\u89e3\u6790\u8fc7\u7a0b\u4e2d\u4e0d\u540c\u7684\u9636\u6bb5\u3002 images \uff1a\u8868\u793a\u6bcf\u4e00\u5e27\u7684\u56fe\u7247\u5e8f\u53f7\u3002 startStub\uff1a \u4e3a\u8bc6\u522b\u5c3e\u5e27\u7684\u9636\u6bb5\u8868\u793a\uff0c\u5982\u679c \"startStub\": 1 \uff0c\u8bf4\u660e\u5c3e\u5e27\u51fa\u73b0\u5728\u8be5\u9636\u6bb5\u3002 type\uff1a \u4e3a Stab \u6216 UnStab \uff0c\u8868\u793a\u7a33\u5b9a\u9636\u6bb5\u6216\u4e0d\u7a33\u5b9a\u9636\u6bb5\u3002 \u5404\u9636\u6bb5\u6709\u5e27\u6570\u8865\u507f\uff0c\u9ed8\u8ba4\u8865\u507f\u7684\u5e27\u6570\u4e3a 3 \u5e27\uff08\u53ef\u4ee5\u901a\u8fc7 server.ini \u91cc\u9762 un_stab_start=3 \u8fdb\u884c\u914d\u7f6e\uff09\uff0c\u8868\u793a\u5c0f\u4e8e\u7b49\u4e8e 3 \u5e27\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u524d\u540e\u5747\u9700\u8981\u51cf\u6389\u3002 \u5e94\u7528\u542f\u52a8\u9636\u6bb5\u5c31\u662f\u5728 Stab2 \u9636\u6bb5\uff0c\u542f\u52a8\u65f6\u95f4\u4e3a\uff1a171 \u51cf 151 \u518d\u51cf\u6389\u524d\u540e\u8865\u507f\u5e27\u6570 6 \u5e27\uff0c\u5373 14 \u5e27\uff0c\u89c6\u9891\u5e27\u7387 30 \u5e27/\u79d2\uff0c\u56e0\u6b64\u542f\u52a8\u8017\u65f6\u4e3a\uff1a14 * 33 = 462 ms"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2excel","title":"2\u3001Excel \u62a5\u544a","text":"\u6240\u6709\u7528\u4f8b\u6267\u884c\u5e76\u89e3\u6790\u5b8c\u4e4b\u540e\u4f1a report \u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a\u6c47\u603b\u6570\u636e\u7684 Excel \u6587\u4ef6\uff0c\u6587\u4ef6\u540d\u4e3a\uff1a{time}_perf_time.xlsx\u3002 \u6ce8\u610f\uff0creport \u76ee\u5f55\u4e3a\u53ef\u914d\u7f6e\u9879\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u4f1a\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u751f\u6210\uff0c\u5982\u679c\u4f60\u5c06 report\uff0c\u6307\u5b9a\u5230\u9879\u76ee\u4e0b\u5176\u4ed6\u8def\u5f84\uff0c\u5219\u4f1a\u5728\u5bf9\u5e94\u7684\u8def\u5f84\u4e0b\u751f\u6210 json \u548c Excel \u6587\u4ef6\u3002 \u4f60\u4e5f\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8bfb\u53d6\u6240\u6709 json / excel \u62a5\u544a\u7684\u6570\u636e\uff0c\u751f\u6210\u4f60\u81ea\u5df1\u60f3\u8981\u7684\u4e00\u4e9b\u6d4b\u8bd5\u62a5\u544a\u5f62\u5f0f\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#usb","title":"\u4e5d\u3001USB \u4e32\u53e3\u9a71\u52a8\u952e\u9f20\u65b9\u6cd5","text":"\u4f4d\u4e8e src/utils/control/serial_communication \u76ee\u5f55\u4e0b\u7684 usb_mk.py \u6587\u4ef6 usb_mk = UsbMk()\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up()\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u652f\u6301\u4f20\u5165\u6c49\u5b57\uff0c\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click()\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() \n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() \n \uff084\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() \n \uff085\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() \n \uff086\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() \n \uff087\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff088\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff0810\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_10","title":"\u5341\u3001\u7ee7\u7535\u5668\u63a7\u5236\u4e3b\u673a\u5f00\u673a/\u91cd\u542f","text":"\uff08\u82e5\u4e0d\u4f7f\u7528\u7ee7\u7535\u5668\uff0c\u53ef\u5ffd\u7565\u8be5\u6b65\u9aa4\uff0c\u6267\u884c\u65f6\u4f1a\u901a\u8fc7\u547d\u4ee4 reboot\uff09"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u7ee7\u7535\u5668\u8bbe\u5907","text":"LCUS-2 \u578b \u53cc\u8def USB \u667a\u80fd\u4e32\u53e3\u63a7\u5236\u7ee7\u7535\u5668\u3002 https://item.taobao.com/item.htm?spm=a1z09.2.0.0.41d72e8dUYx2pi&id=582653718178&_u=i25r20ia6a2e "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2usb","title":"2\u3001USB \u5ef6\u957f\u7ebf","text":"\u666e\u901a\u7684 USB \u7ebf\u5373\u53ef\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_3","title":"3\u3001\u675c\u90a6\u7ebf","text":"3.1\u300140P \u6bcd\u5bf9\u516c\u675c\u90a6\u7ebf\u3002 3.2\u3001\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"4\u3001\u5b89\u88c5\u56fe\u6587\u6559\u7a0b","text":"4.1\u3001\u4f7f\u7528 USB \u5ef6\u957f\u7ebf\u8fde\u63a5\u63a7\u5236\u7aef\u548c\u7ee7\u7535\u5668\u3002 4.2\u3001\u5728\u7ee7\u7535\u5668\u5e38\u7aef\u548c\u516c\u5171\u7aef\u5747\u8fde\u63a5\u4e00\u6839\u675c\u90a6\u7ebf\u3002 4.3\u3001\u5728\u4e3b\u677f\u4e0a\u5f00\u673a\u9488\u548c\u91cd\u542f\u9488\u4e0a\u63d2\u4e0a\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 4.4\u3001\u5c06\u5f00\u673a\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76841\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1\u5de6\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 4.5\u3001\u5c06\u91cd\u542f\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76842\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1 \u53f3\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 \u82e5\u60f3\u4fdd\u7559\u539f\u7535\u6e90\u5f00\u5173\u7684\u7535\u6e90\u706f\uff0c\u53ef\u6839\u636e\u5982\u4e0a\u56fe\u6240\u793a\uff0c\u4f7f\u7528\u675c\u90a6\u7ebf\u8fde\u63a5\u4e3b\u677f\u4e0a\u7684\u7535\u6e90\u706f\u548c\u539f\u7535\u6e90\u5f00\u5173"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_11","title":"\u5341\u4e00\u3001\u5e38\u89c1\u95ee\u9898\u8bf4\u660e","text":"1\u3001ERROR: for uos Cannot restart container 2301b1a1395d7959ee6523d61b61c87084649af530786cdb8fb5b3ecbcbd1068: linux runtime spec devices: error gathering device information while adding custom device \"/dev/ttyACM0\": no such file or directory \u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u8fde\u63a5\u72b6\u6001\uff0c\u67e5\u770b /dev/ttyACM0 \u662f\u5426\u5b58\u5728\uff0c\u82e5\u5b58\u5728 /dev/ttyACMn\uff08n\u4e3a\u4efb\u610f\u6570\u5b57\uff09\uff0c\u91cd\u542f\u7535\u8111\u89e3\u51b3\u3002 2\u3001Error response from daemon: Container 5e700fdc769e8c74666d68a7f2bc3de58268b4594cf88706609d59f8dbc7362d is not running \u5bb9\u5668\u542f\u52a8\u5931\u8d25 1\uff09\u68c0\u67e5\u54ea\u4e00\u4e2a\u5bb9\u5668\u672a\u542f\u52a8 sudo docker container ls # \u5217\u51fa\u8fd0\u884c\u4e2d\u7684 Docker \u5bb9\u5668\n 2\uff09\u7f3a\u5c11 uos \u5bb9\u5668\uff0c\u68c0\u67e5 USB \u4e32\u53e3\u8fde\u63a5\u7ebf\u548c\u91c7\u96c6\u76d2\u8fde\u63a5\u7ebf\u662f\u5426\u6b63\u5e38\uff0c\u91cd\u542f\u540e\u6267\u884c bash install/setup.up # \u91cd\u65b0\u5b8c\u6574\u90e8\u7f72\u73af\u5883\n \u6216\u6267\u884c sudo docker-compose up -d --build # \u4ec5\u91cd\u65b0\u6784\u5efa Docker \u955c\u50cf\n 3\u3001\u82e5\u90e8\u7f72\u65f6\u63d0\u793a\u6302\u8f7d ttyACM0\u3001video0 \u5931\u8d25\uff0c\u8bf7\u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u53ca\u91c7\u96c6\u76d2\u662f\u5426\u63a5\u89e6\u826f\u597d\uff0c\u82e5\u63a5\u89e6\u826f\u597d\uff0c\u91cd\u542f\u5373\u53ef\u89e3\u51b3\u3002 4\u3001\u82e5\u51fa\u73b0\u56fe\u7247\u80fd\u8bc6\u522b\uff0c\u4f46\u662f\u9f20\u6807\u672a\u79fb\u52a8\u64cd\u4f5c\u65f6\uff0c\u5b89\u88c5\u7edd\u5bf9\u9f20\u6807\u64cd\u4f5c\u7684\u4f9d\u8d56\u5305\uff0c\u89c1\u7b2c\u4e09\u8282\u7b2c\u4e8c\u5c0f\u8282\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u6d4b\u8bd5\u673a\u3002 5\u3001\u7531\u4e8e\u901a\u8fc7\u91c7\u96c6\u5361\u83b7\u53d6\u7684\u6d4b\u8bd5\u673a\u5b9e\u65f6\u753b\u9762\uff0c\u5305\u542b\u4e86\u9f20\u6807\u7684\u6837\u5f0f\uff0c\u6240\u4ee5\u5bf9\u56fe\u7247\u8bc6\u522b\u65f6\uff0c\u9f20\u6807\u82e5\u505c\u7559\u5728\u56fe\u6807\u4e0a\u5c42\uff0c\u5219\u4f1a\u5bf9\u8bc6\u522b\u7ed3\u679c\u9020\u6210\u5f71\u54cd\uff0c\u9700\u8981\u5c06\u9f20\u6807\u79fb\u52a8\u81f3\u5176\u4ed6\u4f4d\u7f6e\uff0c\u6216\u8005\u9690\u85cf\u9f20\u6807\u89e3\u51b3\u3002 6\u3001Excel \u62a5\u544a\u4e2d\uff0c\u6d4b\u8bd5\u573a\u666f\u5217\u4e0e\u7528\u4f8b\u4e2d\u7684\u4e0d\u4e00\u81f4\uff0c\u5173\u952e\u5b57scene\u3001app_name\u3001\u67b6\u6784\u522b\u540d\uff0c\u4e0d\u80fd\u5305\u542b\u4e0b\u5212\u7ebf\u548c\u82f1\u6587\u7b26\u53f7\u7684\u5706\u62ec\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/","title":"\u6846\u67b6\u529f\u80fd\u4ecb\u7ecd","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2023/1/12\n# Author : Mikigo\n# =============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_2","title":"\u4e00\u3001\u4e00\u53e5\u8bdd\u7b80\u4ecb","text":"\u6b64\u6587\u6863\u4e3b\u8981\u60f3\u5bf9 YouQu \u6846\u67b6\u4e00\u4e9b\u91cd\u70b9\u7684\u529f\u80fd\u505a\u8be6\u7ec6\u7684\u4ecb\u7ecd\uff0c\u5305\u62ec\u5bf9\u4e00\u4e9b\u529f\u80fd\u5f00\u53d1\u7684\u80cc\u666f\u3001\u8981\u89e3\u51b3\u7684\u95ee\u9898\u3001\u5b9e\u73b0\u903b\u8f91\u3001\u4ee3\u7801\u7b49\u65b9\u9762\u7684\u4ecb\u7ecd\uff0c\u4ee5\u6b64\u8ba9\u5927\u5bb6\u80fd\u66f4\u52a0\u6e05\u6670\u7684\u7406\u89e3\u5404\u9879\u529f\u80fd\uff0c\u4ece\u800c\u5728\u4f7f\u7528\u7684\u65f6\u5019\u80fd\u66f4\u52a0\u7684\u5f97\u5fc3\u5e94\u624b\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_3","title":"\u4e8c\u3001\u56fe\u50cf\u8bc6\u522b","text":"\u56fe\u50cf\u8bc6\u522b\u5728 UI \u81ea\u52a8\u5316\u4e2d\u662f\u4e0d\u53ef\u7f3a\u5c11\u7684\uff0c\u5e02\u9762\u4e0a\u751a\u81f3\u6709\u5b8c\u5168\u57fa\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\uff0c\u6bd4\u5982 Airtest\u3001Sikuli \u7b49\uff0c\u5728\u6e38\u620f\u7b49\u7279\u5b9a\u9886\u57df\u4e5f\u6709\u4e0d\u9519\u7684\u6548\u679c\uff0c\u8fd9\u4e9b\u5de5\u5177\u5b9e\u9645\u4e0a\u4e5f\u662f\u7528\u7684 OpenCV \u8fdb\u884c\u4e86\u5c01\u88c5\uff0cYouQu \u6846\u67b6\u57fa\u4e8e OpenCV \u5f00\u53d1\u4e86\u81ea\u5df1\u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\uff0c\u5b83\u53ef\u4ee5\u65b9\u4fbf\u7684\u7528\u4e8e\u754c\u9762\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u65ad\u8a00\uff1b YouQu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u51e0\u4e4e\u6ee1\u8db3\u4e86\u4f60\u7684\u6240\u6709\u8981\u6c42\uff0c\u6211\u4eec\u5728\u957f\u65f6\u95f4\u7684\u601d\u8003\u548c\u6478\u7d22\u4e2d\uff0c\u9488\u5bf9\u5e38\u89c4\u573a\u666f\u53ca\u4e00\u4e9b\u7279\u6b8a\u573a\u666f\u63a2\u7d22\u9664\u4e86\u4e00\u4e9b\u5b9e\u7528\u4e14\u6709\u6548\u7684\u65b9\u6848\uff0c\u4e14\u542c\u6211\u6162\u6162\u9053\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1","title":"1\u3001\u5e38\u89c4\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5e38\u89c4\u8bc6\u522b\u5f88\u597d\u7406\u89e3\uff0c\u4e00\u53e5\u8bdd\u8bb2\u5c31\u662f\uff0c\u8981\u83b7\u53d6\u5230\u76ee\u6807\u5143\u7d20\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u3002 \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u5728\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u9700\u8981\u83b7\u53d6\u7684\u5750\u6807\u662f\u76f8\u5bf9\u4e8e\u6574\u4e2a\u5c4f\u5e55\u7684\u5750\u6807\uff0c\u6211\u4eec\u53ef\u4ee5\u622a\u53d6\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u56fe\u7247\uff08screen\uff09\uff1b \u5728\u5143\u7d20\u8bc6\u522b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u622a\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5c0f\u56fe\u8fdb\u884c\u8bc6\u522b\uff0c\u6bd4\u5982\u622a\u53d6\u64ad\u653e\u6309\u94ae\uff1a \u90a3\u4e48\u5b9e\u9645\u4e0a\uff0c\u5143\u7d20\u5b9a\u4f4d\u7684\u95ee\u9898\u5c31\u8f6c\u6362\u4e3a\uff0c\u5c06\u622a\u56fe\u7684\u5c0f\u56fe\uff08play_btn\uff09\u62ff\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u5927\u56fe\uff08screen\uff09\u4e2d\u53bb\u505a\u5339\u914d\uff0c\u5982\u679c\u5339\u914d\u6210\u529f\uff0c\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff08 x, y \uff09\u5373\u53ef\u3002 \u4e3a\u4e86\u65b9\u4fbf\u63cf\u8ff0\uff0c\u4ee5\u4e0b\u6211\u5c06\u6574\u4e2a\u5c4f\u5e55\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5927\u56fe\uff0c\u67d0\u4e2a\u5143\u7d20\u56fe\u7247\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5c0f\u56fe\u3002 \u57fa\u4e8e OpenCV \u7684\u6a21\u677f\u5339\u914d cv.matchTemplate() \u529f\u80fd\uff0c\u6211\u4eec\u5b9e\u73b0\u4e86\u56fe\u50cf\u5b9a\u4f4d\u7684\u529f\u80fd\uff0c\u6846\u67b6\u63d0\u4f9b\u4e86\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u5e95\u5c42\u63a5\u53e3\uff08\u4e00\u822c\u4e0d\u5bf9\u4e0a\u5c42\u63d0\u4f9b\u8c03\u7528\uff09\uff1a def _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\n# \u8be6\u7ec6\u4ee3\u7801\u592a\u957f\u4e0d\u8d34\u4e86\uff0c\u611f\u5174\u8da3\u8bf7\u67e5\u770b\u6e90\u7801\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001image_path image_path \u662f\u5c0f\u56fe\u7684\u7edd\u5bf9\u8def\u5f84; \u901a\u5e38\u5728 AT \u5de5\u7a0b\u91cc\u9762\uff0c\u6211\u4eec\u7ea6\u5b9a\u5c06\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u5b9e\u9645\u7684\u5143\u7d20\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1aplay_btn.png \uff1b \u7528\u4e8e\u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 case/assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1amusic_001.png \uff1b \u8fd9\u6837\u662f\u4e3a\u4e86\u65b9\u4fbf\u7ba1\u7406\u548c\u7ef4\u62a4\u3002 2\u3001rate \u56fe\u50cf\u8bc6\u522b\u7684\u7684\u5339\u914d\u5ea6\u6216\u8005\u8bf4\u76f8\u4f3c\u5ea6\uff0c\u6846\u67b6\u9ed8\u8ba4\u7684\u914d\u7f6e\u4e3a 0.9\uff0c\u4e5f\u5c31\u662f\u8bf4\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u5b58\u5728\u4e00\u4e2a\u76f8\u4f3c\u5ea6 90% \u7684\u56fe\u6807\u5373\u8fd4\u56de\u5176\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff1b \u5982\u679c\u4f60\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u8c03\u6574\u8bc6\u522b\u5ea6\uff0c\u4f60\u53ef\u4ee5\u5728\u8c03\u7528\u51fd\u6570\u7684\u65f6\u5019\uff0c\u4f20\u5165\u4e0d\u540c\u7684\u8bc6\u522b\u5ea6\u7684\u503c\u3002 3\u3001multiple \u9ed8\u8ba4\u60c5\u51b5\u4e0b multiple=False\uff0c\u8868\u793a\u53ea\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u7b2c\u4e00\u4e2a\uff0c\u5982\u679c multiple=True \u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\uff0c\u56e0\u4e3a\u5927\u56fe\u4e2d\u53ef\u80fd\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u5c0f\u56fe\uff0c\u5728\u67d0\u4e9b\u573a\u666f\u4e0b\u4f60\u53ef\u80fd\u9700\u8981\u5168\u90e8\u83b7\u53d6\u5230\u6240\u6709\u5339\u914d\u5230\u7684\u5750\u6807\u3002 4\u3001picture_abspath \u9ed8\u8ba4\u60c5\u51b5\u4e0b picture_abspath=None \u8868\u793a\u5927\u56fe\u4e3a\u622a\u53d6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u5982\u679c\u4f60\u4e0d\u5e0c\u671b\u5927\u56fe\u662f\u5c4f\u5e55\u7684\u622a\u56fe\uff0c\u800c\u662f\u4f60\u81ea\u5b9a\u4e49\u4f20\u5165\u7684\u67d0\u4e2a\u56fe\u7247\uff0c\u4f60\u53ea\u9700\u8981\u5c06\u4f60\u7684\u56fe\u7247\u8def\u5f84\u4f20\u9012\u7ed9\u8fd9\u4e2a\u53c2\u6570\u5c31\u884c\uff0c\u6bd4\u5982\uff1a picture_abspath=\"~/Desktop/big.png\" \uff1b 5\u3001screen_bbox \u5927\u56fe\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u622a\u53d6\u6574\u4e2a\u5c4f\u5e55\uff0cscreen_bbox = [x, y, w, h] \u53ef\u4ee5\u6307\u5b9a\u622a\u53d6\u5c4f\u5e55\u4e2d\u7684\u56fa\u5b9a\u533a\u57df\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\uff0c\u53ef\u4ee5\u6392\u9664\u90e8\u5206\u533a\u57df\u5bf9\u8bc6\u522b\u7ed3\u679c\u7684\u5f71\u54cd\u3002 \u3010\u9690\u5f0f\u7b49\u5f85\u3011 \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\uff0c\u6709\u65f6\u5019\u9875\u9762\u8df3\u8f6c\u6709\u5ef6\u65f6\uff0c\u6709\u53ef\u80fd\u5b58\u5728\u8bc6\u522b\u7684\u90a3\u4e00\u523b\u9875\u9762\u4e5f\u6ca1\u6709\u8df3\u8f6c\u51fa\u6765\uff0c\u6216\u8005\u6216\u8005\u8bc6\u522b\u7684\u90a3\u4e00\u523b\uff1b \u56e0\u6b64\u6211\u4eec\u9700\u8981\u4e00\u79cd\u7b49\u5f85\u673a\u5236\uff0c\u5373\u5728\u4e00\u5b9a\u7684\u65f6\u95f4\u5185\uff0c\u5982\u679c\u8bc6\u522b\u4e0d\u5230\uff0c\u91cd\u590d\u53bb\u8bc6\u522b\uff1a def find_image(\ncls,\n*widget, rate: [float, int] = None,\nmultiple: bool = False,\nmatch_number: int = None,\npicture_abspath: str = None,\nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u5728\u5c4f\u5e55\u4e2d\u533a\u5bfb\u627e\u5c0f\u56fe\uff0c\u8fd4\u56de\u5750\u6807\uff0c\n \u5982\u679c\u627e\u4e0d\u5230\uff0c\u6839\u636e\u914d\u7f6e\u91cd\u8bd5\u6b21\u6570\uff0c\u6bcf\u6b21\u95f4\u96941\u79d2\n :param widget: \u6a21\u677f\u56fe\u7247\u8def\u5f84\n :param rate: \u76f8\u4f3c\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param match_number: \u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\n :return: \u5750\u6807\u5143\u7ec4\n \"\"\"\nif rate is None:\nrate = float(GlobalConfig.IMAGE_RATE)\ntry:\nfor element in widget:\nfor _ in range((match_number or int(GlobalConfig.IMAGE_MATCH_NUMBER)) + 1):\nlocate = cls._match_image_by_opencv(\nelement,\nrate,\nmultiple=multiple,\npicture_abspath=picture_abspath,\nscreen_bbox=screen_bbox\n)\nif not locate:\nsleep(int(GlobalConfig.IMAGE_MATCH_WAIT_TIME))\nelse:\nreturn locate\nraise TemplateElementNotFound(*widget)\nexcept Exception as e:\nraise e\n \u53c2\u6570 match_number \u7528\u4e8e\u63a7\u5236\u91cd\u590d\u8bc6\u522b\u7684\u6b21\u6570\uff0c\u9ed8\u8ba4\u4e0d\u4f20\u53c2\uff0c\u53d6\u5168\u5c40\u914d\u7f6e setting/globalconfig.ini \u91cc\u9762\u7684 IMAGE_MATCH_NUMBER \u914d\u7f6e\u9879\u7684\u503c\uff0c\u9ed8\u8ba4IMAGE_MATCH_NUMBER = 1\uff0c\u5373\u91cd\u8bd5 1 \u6b21\uff1b find_image \u662f\u6846\u67b6\u63d0\u4f9b\u7684\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u51fd\u6570\u63a5\u53e3\uff0c\u8fd9\u4e2a\u51fd\u6570\u63d0\u4f9b\u4e86\u9690\u5f0f\u7b49\u5f85\u7684\u529f\u80fd\uff0c\u4e14\u5305\u542b\u4e0a\u9762\u4ecb\u7ecd\u7684 _match_image_by_opencv \u51fd\u6570\u7684\u6240\u6709\u529f\u80fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2","title":"2\u3001\u6c14\u6ce1\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u6c14\u6ce1\u8bc6\u522b\u6307\u7684\u662f\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\u8981\u5b9a\u4f4d\u7684\u5143\u7d20\u662f\u4e00\u4e9b\u4f1a\u6d88\u5931\u7684\u5c0f\u5f39\u7a97\uff0c\u8fd9\u7c7b\u573a\u666f\u5728\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\u5c31\u53ef\u80fd\u5b58\u5728\u4e0d\u7a33\u5b9a\u6027\uff0c\u6709\u53ef\u80fd\u56fe\u50cf\u8bc6\u522b\u7684\u65f6\u5019\u6c14\u6ce1\u5df2\u7ecf\u6d88\u5931\u4e86\uff0c\u4e5f\u6709\u53ef\u80fd\u6c14\u6ce1\u51fa\u73b0\u7684\u65f6\u95f4\u592a\u77ed\u4e86\uff0c\u4e0d\u5bb9\u6613\u6355\u6349\u5230\uff0c\u5c31\u50cf\u6c14\u6ce1\u4e00\u6837\uff0c\u51fa\u73b0\u4e00\u4e0b\u5c31\u6d88\u5931\uff0c\u56e0\u6b64\u6211\u4eec\u5f62\u8c61\u7684\u79f0\u4e4b\u4e3a \u201c\u6c14\u6ce1\u8bc6\u522b\u201d\uff1b \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u4e3a\u4e86\u80fd\u7a33\u5b9a\u7684\u8bc6\u522b\u6c14\u6ce1\u7c7b\u573a\u666f\uff0c\u6211\u4eec\u91c7\u7528\u7684\u65b9\u6848\u662f\uff1a \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\uff08\u5305\u542b\u6c14\u6ce1\u4ece\u51fa\u73b0\u5230\u6d88\u5931\uff09\uff0c\u4e0d\u505c\u7684\u622a\u53d6\u8fd9\u6bb5\u65f6\u95f4\u5185\u7684\u5927\u56fe\uff0c\u4ee5\u6b64\u786e\u4fdd\u5728\u622a\u53d6\u7684\u4e00\u5806\u56fe\u7247\u4e2d\uff0c\u80af\u5b9a\u6709\u81f3\u5c11\u4e00\u5f20\u56fe\u7247\u80fd\u6355\u6349\u5230\u6c14\u6ce1\uff0c\u6700\u540e\u518d\u5bf9\u8fd9\u4e00\u5806\u56fe\u7247\u9010\u4e2a\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def get_during(\ncls,\nimage_path: str,\nscreen_time: [float, int],\nrate: float = None,\npause: [int, float] = None,\nmax_range: int = 10000\n):\n\"\"\"\n \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u622a\u56fe\u591a\u5f20\u56fe\u7247\u8fdb\u884c\u8bc6\u522b\uff0c\u5176\u4e2d\u6709\u4e00\u5f20\u56fe\u7247\u8bc6\u522b\u6210\u529f\u5373\u8fd4\u56de\u7ed3\u679c;\n \u9002\u7528\u4e8e\u6c14\u6ce1\u7c7b\u7684\u65ad\u8a00\uff0c\u6bd4\u5982\u6c14\u6ce1\u57281\u79d2\u5185\u6d88\u5931\uff0c\u5982\u679c\u7528\u5e38\u89c4\u7684\u56fe\u50cf\u8bc6\u522b\u5219\u6709\u53ef\u80fd\u65e0\u6cd5\u8bc6\u522b\u5230\uff1b\n :param image_path: \u8981\u8bc6\u522b\u7684\u6a21\u677f\u56fe\u7247\uff1b\n :param screen_time: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff1b\n :param rate: \u8bc6\u522b\u7387\uff1b\n :param pause: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u4e0d\u95f4\u9694\uff1b\n :param max_range: \u622a\u56fe\u7684\u6700\u5927\u6b21\u6570\uff0c\u8fd9\u662f\u4e00\u4e2a\u9884\u8bbe\u503c\uff0c\u4e00\u822c\u60c5\u51b5\u4e0b\u4e0d\u6d89\u53ca\u4fee\u6539\uff1b\n \"\"\"\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001screen_time \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5728\u6b64\u65f6\u95f4\u5185\u4f1a\u4e0d\u65ad\u7684\u8fdb\u884c\u622a\u56fe\u64cd\u4f5c\uff0c\u5c31\u50cf\u5f55\u5236\u89c6\u9891\u4e00\u6837\uff1b 2\u3001pause \u6bcf\u6b21\u622a\u53d6\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u4e00\u523b\u4e0d\u505c\u7684\u622a\u56fe\uff0c\u5982\u679c\u4f60\u60f3\u6bcf\u6b21\u622a\u56fe\u5b58\u5728\u4e00\u4e9b\u95f4\u9694\u65f6\u95f4\u4f20\u5165\u5bf9\u5e94\u7684\u65f6\u95f4\u95f4\u9694\u5373\u53ef\uff0c\u5355\u4f4d\u662f\u79d2\uff0c\u6bd4\u5982\uff1apause = 0.03\uff0c\u8868\u793a 30 ms\uff0c\u76f8\u5f53\u4e8e\u5e27\u7387\u4e3a 30 \u5e27\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-opencv","title":"3\u3001\u4e0d\u4f9d\u8d56 OpenCV \u7684\u56fe\u50cf\u8bc6\u522b\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31","title":"3.1\u3001\u81ea\u7814\u56fe\u50cf\u8bc6\u522b\u6280\u672f","text":"\u3010\u539f\u7406\u3011 \u4e3a\u4e86\u5b9e\u73b0\u8bc6\u522b\u56fe\u50cf\u7684\u76ee\u7684\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u5c06\u56fe\u7247\u7684\u6bcf\u4e2a\u50cf\u7d20\u7684RGB\u503c\uff0c\u4e0e\u6574\u4e2a\u5c4f\u5e55\u4e2d\u7684RGB\u8fdb\u884c\u5bf9\u6bd4\uff0c\u5982\u679c\u5c0f\u56fe\u4e0a\u7684RGB\u503c\u4e0e\u5bf9\u5e94\u5927\u56fe\u4f4d\u7f6e\u7684RGB\u90fd\u76f8\u7b49\uff0c\u5219\u5339\u914d\u6210\u529f\uff0c\u5373\u53ef\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u70b9\u3002 1\u3001\u8bfb\u53d6\u5c0f\u56fe\u548c\u5927\u56fe\u7684RGB\u503c \uff081\uff09\u5c0f\u56fe\u7684RGB\u503c small_data = small_pic.load() # load()\u4f1a\u5c06\u56fe\u7247\u7684RGB\u503c\u83b7\u53d6\u5230\uff0c\u6570\u636e\u683c\u5f0f\u4e3a\u4e00\u4e2a\u4e8c\u7ef4\u5217\u8868\uff0c\u8d4b\u503c\u7ed9\u4e00\u4e2a\u53d8\u91cfsmall_data\u3002\n \uff082\uff09\u5927\u56fe\u7684RGB\u503c big_data = big_pic.load()\n 2\u3001\u5c06\u5c0f\u56fe\u4e0e\u5927\u56fe\u7684RGB\u503c\u8fdb\u884c\u5339\u914d \uff081\uff09\u5339\u914d\u4ece\u5927\u56fe\u7684\u5750\u6807\uff080\uff0c0\uff09\u5f00\u59cb\u5339\u914d\uff0c\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff082\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\uff080\uff0c0\uff09\u5bf9\u5e94\u7684\u6240\u6709\u5c0f\u56fe\u7684RGB\u503c\u4e0d\u76f8\u7b49\uff0c\u5219\u79fb\u52a8\u5230\u4e0b\u4e00\u4e2a\u5750\u6807\u70b9\uff081\uff0c0\uff09\uff0c\u540c\u6837\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff083\uff09\u6309\u7167\u8fd9\u6837\u7684\u89c4\u5f8b\u5c06\u8fd9\u4e00\u884c\u6bcf\u79fb\u52a8\u4e00\u4e2a\u5750\u6807\u70b9\uff0c\u90fd\u5c06\u5c0f\u56fe\u6240\u6709\u7684RGB\u4e0e\u5bf9\u5e94\u5927\u56fe\u7684\u503c\u8fdb\u884c\u5339\u914d\uff1b \uff084\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\u5176\u4e2d\u4e00\u4e2a\u5750\u6807\u70b9\u4e0a\u5339\u914d\u5230\u4e86\u5c0f\u56fe\u7684\u6240\u6709RGB\u503c\uff0c\u5219\u6b64\u65f6\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\u70b9\uff1b \uff085\uff09\u5982\u679c\u5339\u914d\u4e86\u5927\u56fe\u6240\u6709\u7684\u5750\u6807\u70b9\uff0c\u90fd\u6ca1\u6709\u5339\u914d\u5230\uff0c\u5219\u8bf4\u660e\u5927\u56fe\u4e2d\u4e0d\u5b58\u5728\u5c0f\u56fe\uff0c\u5339\u914d\u5931\u8d25\uff1b \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 class ImageRgb:\n@staticmethod\ndef _check_match(_x, _y, small, bdata, sdata, rate):\n\"\"\"\n Matching degree of small graph and large graph matching\n \"\"\"\n@staticmethod\ndef _pre_random_point(small):\n\"\"\"\n Pre matching, take 10-20 points at random each time,\n and take coordinates randomly in the small graph\n \"\"\"\n@staticmethod\ndef _pre_random_match(_x, _y, point_list, bdata, sdata, rate):\n\"\"\"\n In the small graph, several points are randomly\n selected for matching, and the matching degree is\n also set for the random points\n \"\"\"\n@classmethod\ndef match_image_by_rgb(cls, image_name=None, image_path=None, rate=0.9):\n\"\"\"\n By comparing the RGB values of the small image with the large\n image on the screen, the coordinates of the small image on\n the screen are returned.\n \"\"\"\n \u901a\u8fc7 match_image_by_rgb() \u8fd9\u4e2a\u51fd\u6570\uff0c\u4f20\u5165\u76ee\u6807\u5c0f\u56fe\u7684\u6587\u4ef6\u540d\u79f0\uff0c\u5373\u53ef\u8fd4\u56de\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u3002 \u6709\u540c\u5b66\u8981\u95ee\u4e86\uff0c\u6709 OpenCV \u5e72\u561b\u4e0d\u7528\uff0c\u6709\u5fc5\u8981\u81ea\u5df1\u5b9e\u73b0\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u529f\u80fd\u5417\uff0c\u4f60\u4eec\u662f\u4e0d\u662f\u95f2\u7684\u554a\uff1f \u8fd9\u4e48\u95ee\u7684\u8bdd\uff0c\u5c0f\u4e86\uff0c\u683c\u5c40\u5c0f\u4e86\uff1b\u6211\u4eec\u81ea\u5df1\u5b9e\u73b0\u4e3b\u8981\u6709\u51e0\u65b9\u9762\u539f\u56e0\uff1a \u51cf\u5c11\u73af\u5883\u4f9d\u8d56\uff0c\u5373\u4e0d\u7528\u5b89\u88c5 OpenCV\uff0c\u6211\u4eec\u4e5f\u80fd\u5b9e\u73b0\u5176\u529f\u80fd\uff0c\u73af\u5883\u4f9d\u8d56\u8fd9\u5757\u540e\u9762\u4f1a\u5355\u72ec\u8be6\u7ec6\u8bb2\uff0c\u51cf\u5c11\u73af\u5883\u4f9d\u8d56\u5bf9\u4e8e\u4efb\u4f55\u8f6f\u4ef6\u5de5\u7a0b\u90fd\u975e\u5e38\u91cd\u8981\uff1b OpenCV \u5728\u5176\u4ed6\u56fd\u4ea7 CPU \u67b6\u6784\u4e0a\u5b89\u88c5\u5e76\u4e0d\u80fd\u4fdd\u8bc1100%\u6210\u529f\uff0c\u751a\u81f3\u6709\u6ca1\u6709\u53ef\u80fd\u5728\u4e00\u4e9b\u67b6\u6784\u4e0a\u538b\u6839\u513f\u5c31\u4e0d\u80fd\u5b89\u88c5\u4f7f\u7528 OpenCV \uff1f \u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 OpenCV \uff1f\u5c31\u50cf\u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 Windows \u5462\uff1f\u8fd9\u4e9b\u95ee\u9898\u503c\u5f97\u601d\u8003\u3002 \u5f53\u7136\uff0c\u6211\u4eec\u627f\u8ba4\u8fd9\u5957\u65b9\u6848\uff0c\u867d\u7136\u8bc6\u522b\u51c6\u786e\u7387\u6ca1\u95ee\u9898\uff0c\u4f46\u5728\u8bc6\u522b\u6548\u7387\u4e0a\u8fd8\u6ca1\u6709\u8fbe\u5230 OpenCV \u6a21\u677f\u5339\u914d\u7684\u6548\u679c\uff0c\u6211\u4eec\u7684\u65b9\u6848\u6bcf\u6b21\u8bc6\u522b\u5728 1.5s \u5de6\u53f3\uff0c\u800c OpenCV \u5728 1s \u5de6\u53f3\uff1b \u6574\u4f53\u8bc6\u522b\u6548\u679c\u6765\u8bb2\uff0c\u6211\u8ba4\u4e3a\u8fd8\u662f\u53ef\u4ee5\u63a5\u53d7\u7684\uff0c\u4e5f\u5e0c\u671b\u6709\u5fd7\u4e4b\u58eb\u80fd\u4e00\u8d77\u4f18\u5316\u6b64\u65b9\u6848\uff0c\u4e00\u8d77\u6280\u672f\u62a5\u56fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32-rpc","title":"3.2\u3001\u57fa\u4e8e RPC \u670d\u52a1\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b","text":"\u5728\u8fdc\u7a0b\u670d\u52a1\u5668\u4e0a\u90e8\u7f72 OpenCV \u7684\u73af\u5883\uff0c\u5e76\u5c06\u5176\u90e8\u7f72\u4e3a RPC \u670d\u52a1\uff0c\u6d4b\u8bd5\u673a\u4e0a\u4e0d\u7528\u5b89\u88c5 OpenCV \u4f9d\u8d56\uff0c\u800c\u662f\u901a\u8fc7\u8bf7\u6c42 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u3010\u539f\u7406\u3011 \u6d4b\u8bd5\u673a\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u56fe\u7247\u4ee5\u53ca\u6a21\u677f\u56fe\u7247\uff0c\u53d1\u9001\u7ed9 RPC \u670d\u52a1\u7aef\uff0c\u670d\u52a1\u7aef\u62ff\u5230\u4e24\u5f20\u56fe\u7247\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u6700\u540e\u5c06\u8bc6\u522b\u7ed3\u679c\u8fd4\u56de\u7ed9\u6d4b\u8bd5\u673a\uff1b \u8981\u7279\u6b8a\u8bf4\u660e\u7684\u662f\uff1a RPC \u662f\u4e00\u79cd\u534f\u8bae\uff0c\u8bb8\u591a\u8bed\u8a00\u90fd\u662f\u652f\u6301\u7684\uff0c\u6bd4\u5982\u8bf4\u670d\u52a1\u7aef\u4e5f\u53ef\u4ee5\u7528 C++ \u6765\u5b9e\u73b0\uff0c\u5ba2\u6237\u7aef\u4f7f\u7528 Python \u4e5f\u662f\u53ef\u4ee5\u8c03\u7528\u7684\u3002 \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 \u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nimport cv2 as cv\nimport numpy as np\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\nif __name__ == \"__main__\":\nserver = ThreadXMLRPCServer((\"x.x.x.x\", 8889), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(match_image_by_opencv, \"match_image_by_opencv\")\nserver.serve_forever()\n \u8fd9\u6837\uff0c\u6211\u4eec\u57fa\u4e8e Python \u6807\u51c6\u5e93 xmlrpc \u642d\u5efa\u4e86\u4e00\u4e2a RPC \u670d\u52a1\u5668\uff0c\u6ce8\u518c\u4e86 image_put \u548c match_image_by_opencv \u4e24\u4e2a\u529f\u80fd\u63a5\u53e3\uff0c\u5728\u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u901a\u8fc7 IP \u548c\u7aef\u53e3\u8fdb\u884c RPC \u8bf7\u6c42\uff1b \u5ba2\u6237\u7aef\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from xmlrpc.client import Binary\nfrom xmlrpc.client import ServerProxy\nserver = ServerProxy(GlobalConfig.OPENCV_SERVER_HOST, allow_none=True)\nscreen_rb = open(screen, \"rb\")\ntemplate_rb = open(template_path, \"rb\")\ntry:\nscreen_path = server.image_put(Binary(screen_rb.read()))\nscreen_rb.close()\ntpl_path = server.image_put(Binary(template_rb.read()))\ntemplate_rb.close()\nreturn server.match_image_by_opencv(\ntpl_path, screen_path, rate, multiple\n)\nexcept OSError as exc:\nraise EnvironmentError(\nf\"RPC\u670d\u52a1\u5668\u94fe\u63a5\u5931\u8d25. {GlobalConfig.OPENCV_SERVER_HOST}\"\n) from exc\n \u901a\u8fc7\u8fd4\u56de server.match_image_by_opencv \u5c31\u83b7\u53d6\u4e86\u5728\u670d\u52a1\u7aef\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4","title":"4\u3001\u53f3\u952e\u83dc\u5355\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41","title":"4.1\u3001\u53f3\u952e\u83dc\u5355\u5b9a\u4f4d\u7684\u65b9\u6848\u53ca\u95ee\u9898","text":"\u53f3\u952e\u83dc\u5355\u7684\u5143\u7d20\u5b9a\u4f4d\u662f\u4e00\u4e2a\u96be\u70b9\uff0c\u8fc7\u53bb\u6211\u4eec\u8c03\u7814\u548c\u4f7f\u7528\u8fc7\u7684\u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u65b9\u6cd5\u6709 4 \u79cd\uff1a \u7b2c\u4e00\u79cd\uff1a\u6b65\u957f\u64cd\u4f5c\u6cd5 \u5728\u53f3\u952e\u83dc\u5355\u547c\u51fa\u6765\u4e4b\u540e\uff0c\u901a\u8fc7\u952e\u76d8\u7684 up\u3001down \u6309\u952e\uff0c\u8fdb\u884c\u9009\u62e9\u83dc\u5355\u9009\u62e9\uff0c\u9009\u4e2d\u76ee\u6807\u4e4b\u540e enter \u5373\u53ef\uff1b\u6bd4\u5982\uff1a\u5728\u684c\u9762\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\uff0c\u6309 1 \u6b21 down \uff0c\u4f1a\u51fa\u73b0\u4e0b\u56fe\uff1a \u7ee7\u7eed\u518d\u6309 2 \u6b21 down\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u518d\u6309 enter\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u5982\u6b64\uff0c\u201c\u6392\u5e8f\u65b9\u5f0f\u201d\u7684\u6b65\u957f\u4e3a 3\uff1b\u901a\u8fc7\u4f7f\u7528\u952e\u76d8\u4e0a\u4e0b\u952e\uff0c\u5c31\u5b9e\u73b0\u4e86\u5bf9\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\uff1b \u4f46\u662f\uff0c\u8fd9\u79cd\u65b9\u5f0f\u6709\u4e2a\u5f88\u70e6\u4eba\u7684\u95ee\u9898\uff0c\u5c31\u662f\u53f3\u952e\u83dc\u5355\u7684\u9009\u9879\u4f4d\u7f6e\u4e0d\u53ef\u80fd\u4e00\u76f4\u4e0d\u53d8\uff0c\u5728\u9700\u6c42\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\uff0c\u83dc\u5355\u9009\u9879\u7684\u53d8\u5316\u662f\u5f88\u5927\u7684\uff0c\u751a\u81f3\u6709\u4e9b\u5e94\u7528\u652f\u6301\u81ea\u5b9a\u4e49\u83dc\u5355\uff0c\u6bd4\u5982\u6587\u7ba1\u53f3\u952e\u83dc\u5355\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff1b \u4e5f\u5c31\u662f\u8bf4\u4f60\u5f97\u7ecf\u5e38\u53bb\u7ef4\u62a4\u83dc\u5355\u9009\u9879\u7684\u6b65\u957f\uff0c\u4e00\u4e2a\u9009\u9879\u73b0\u5728\u7684\u6b65\u957f\u662f 3\uff0c\u4e0b\u4e2a\u8fed\u4ee3\u53ef\u80fd\u5c31\u662f 4 \u6216\u8005 5\u3002 \u7b2c\u4e8c\u79cd\uff1a\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u6cd5 \u628a\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5355\u72ec\u622a\u56fe\u4fdd\u5b58\uff0c\u56fe\u7247\u4e2d\u4ec5\u5305\u542b\u4e00\u4e2a\u83dc\u5355\u9009\u9879\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u8fd9\u6837\uff0c\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5c31\u53ef\u4ee5\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u65b9\u5f0f\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u8fd9\u79cd\u65b9\u5f0f\u4e0d\u7528\u62c5\u5fc3\u83dc\u5355\u9009\u9879\u7684\u987a\u5e8f\u6216\u4f4d\u7f6e\uff0c\u4f46\u662f\u9700\u8981\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff0c\u4e14\u5bb9\u6613\u53d7\u5230\u5b57\u4f53 UI \u53d8\u66f4\u7c7b\u9700\u6c42\u7684\u5f71\u54cd\uff0c\u6bd4\u5982\uff1a\u5b57\u4f53\u5927\u5c0f\u3001\u5b57\u4f53\u95f4\u8ddd\u7b49\u7b49\u9700\u6c42\u53d8\u66f4\u90fd\u4f1a\u5f71\u54cd\uff0c\u6bcf\u6b21\u53d8\u66f4\u4e4b\u540e\u5c31\u9700\u8981\u8fdb\u884c\u5927\u91cf\u56fe\u7247\u8d44\u6e90\u7684\u91cd\u65b0\u622a\u56fe\u66ff\u6362\uff0c\u662f\u4e2a\u6bd4\u8f83\u9ebb\u70e6\u7684\u4e8b\u60c5\uff1b \u7b2c\u4e09\u79cd\uff1a\u76f8\u5bf9\u4f4d\u79fb\u6cd5 \u9f20\u6807\u70b9\u51fb\u53f3\u952e\u7684\u65f6\u5019\uff0c\u9f20\u6807\u7684\u5f53\u524d\u5750\u6807\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u7684\uff0c\u83dc\u5355\u9009\u9879\u7684\u5bbd\uff08 w \uff09\u4e00\u822c\u662f\u56fa\u5b9a\u7684\uff0c\u53d8\u5316\u7684\u662f\u83dc\u5355\u7684\u957f\u5ea6\uff08 h \uff09\uff0c\u53ef\u4ee5\u901a\u8fc7\u67d0\u4e2a\u9009\u9879\u76f8\u5bf9\u4e8e\u9f20\u6807\u7684\u8ddd\u79bb\u5728\u786e\u5b9a\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u901a\u8fc7\u7ef4\u62a4\u83dc\u5355\u9009\u9879\uff08\u76f8\u5bf9\u4f4d\u7f6e\uff09\u76f8\u5bf9\u4e8e\u9f20\u6807\u4f4d\u7f6e\u7684\u8ddd\u79bb\uff0c\u5373\u53ef\u8f7b\u677e\u8ba1\u7b97\u51fa\u83dc\u5355\u9009\u9879\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\u3002 \u4ece\u7406\u8bba\u4e0a\u6b64\u65b9\u6848\u662f\u53ef\u884c\u7684\uff0c\u4f46\u662f\u8fd9\u91cc\u4ecd\u7136\u5b58\u5728\u4e24\u4e2a\u4e25\u91cd\u7684\u95ee\u9898\uff1a \u83dc\u5355\u987a\u5e8f\u6539\u53d8\uff0c\u5bfc\u81f4\u76f8\u5bf9\u8ddd\u79bb\u6539\u53d8\uff0c\u800c\u4e14\u8ddd\u79bb\u662f\u901a\u8fc7\u50cf\u7d20\uff08px\uff09\u6765\u8868\u793a\u7684\uff0c\u4e0d\u60f3\u6b65\u957f\u90a3\u4e48\u53ea\u7ba1\uff0c\u6bcf\u6b21\u9700\u8981\u53bb\u91cf\u4e00\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u70b9\u9ebb\u70e6\uff1b \u9f20\u6807\u5728\u684c\u9762\u4e0d\u540c\u4f4d\u7f6e\u70b9\u51fb\u53f3\u952e\uff0c\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u4f4d\u7f6e\u662f\u4e0d\u540c\u7684\uff0c\u4e0a\u56fe\u7684\u83dc\u5355\u662f\u5728\u9f20\u6807\u7684\u5de6\u4e0b\u65b9\uff0c\u5982\u679c\u4f60\u79fb\u52a8\u9f20\u6807\u5230\u5c4f\u5e55\u56db\u8fb9\uff0c\u4f60\u4f1a\u53d1\u73b0\uff0c\u53f3\u952e\u83dc\u5355\u53ef\u80fd\u51fa\u73b0\u5728\u9f20\u6807\u7684\u56db\u4e2a\u65b9\u5411\uff0c\u4e5f\u5c31\u662f\u8bf4\u4f60\u9700\u8981\u6839\u636e\u9f20\u6807\u7684\u4e0d\u540c\u4f4d\u7f6e\u6765\u5224\u65ad\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u65b9\u5411\uff0c\u800c\u4e0d\u540c\u7684\u65b9\u5411\u4e0a\u8ba1\u7b97\u65b9\u6cd5\u662f\u4e0d\u540c\u7684\uff0c\u6bd4\u5982\uff1a\u53f3\u952e\u83dc\u5355\u5728\u9f20\u6807\u7684\u5de6\u4e0a\uff0c\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\u8ba1\u7b97\u65b9\u6cd5\u4e3a\uff08x - w / 2\uff0c y - h\uff09\uff0c\u8fd9\u6837\u7ef4\u62a4\u8d77\u6765\u53ef\u4ee5\u8bf4\u975e\u5e38\u590d\u6742\uff1b \u57fa\u4e8e\u4ee5\u4e0a\u4e24\u4e2a\u539f\u56e0\uff0c\u6211\u4eec\u5e76\u4e0d\u63a8\u8350\u8fd9\u79cd\u64cd\u4f5c\u65b9\u6848\u3002 \u7b2c\u56db\u79cd\uff1a\u5c5e\u6027\u5b9a\u4f4d \u6709\u540c\u5b66\u8bf4\u5e72\u561b\u4e0d\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u5462\uff0c\u5176\u5b9e\uff0c\u6211\u4eec\u6700\u5f00\u59cb\u60f3\u5230\u7684\u65b9\u6848\u5c31\u662f\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\uff0c\u4f46\u662f\u5728\u5c5e\u6027\u7684 DOM \u6811\u91cc\u600e\u4e48\u4e5f\u627e\u4e0d\u5230\uff0c\u65e0\u6cd5\u5b9a\u4f4d\u5230\uff0c\u6211\u4eec\u4e5f\u8054\u5408\u7814\u53d1\u540c\u5b66\u4e00\u8d77\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u4f46\u6700\u7ec8\u8fd8\u662f\u6ca1\u80fd\u89e3\u51b3\uff0c\u975e\u5e38\u9057\u61be\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42","title":"4.2\u3001\u6700\u65b0\u7684\u53f3\u952e\u83dc\u5355\u7ec8\u6781\u89e3\u51b3\u65b9\u6848","text":"\u7531\u4e8e\u53f3\u952e\u83dc\u5355\u9009\u9879\u51e0\u4e4e\u90fd\u662f\u6587\u672c\uff0c\u90a3\u4e48\u901a\u8fc7 OCR \u8bc6\u522b\uff0c\u51e0\u4e4e\u662f\u6700\u4f18\u7684\u65b9\u6848\uff1a \u4e0d\u7528\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff1b \u4e0d\u4f1a\u53d7\u5230\u83dc\u5355\u9009\u9879\u987a\u5e8f\u6539\u53d8\u7684\u5f71\u54cd\uff1b \u4e0d\u4f1a\u53d7\u5230\u5b57\u4f53 UI \u53d8\u5316\u7684\u5f71\u54cd\uff1b \u5173\u4e8e OCR \u8bc6\u522b\u6211\u4eec\u5728\u540e\u9762\u4f1a\u8be6\u7ec6\u8bb2\u5230\uff0c\u672c\u7ae0\u8282\u4e3b\u8981\u8bb2\u57fa\u4e8e OCR \u8bc6\u522b\uff0c\u6211\u4eec\u5728\u53f3\u952e\u83dc\u5355\u8bc6\u522b\u4e0a\u7684\u7a81\u7834\u548c\u521b\u65b0\uff1b \u4f7f\u7528 OCR \u8bc6\u522b\u53f3\u952e\u83dc\u5355\u867d\u7136\u5df2\u7ecf\u5f88\u5b8c\u7f8e\u4e86\uff0c\u4f46\u662f\u5728\u4e00\u4e9b\u60c5\u51b5\u4e0b\u4ecd\u7136\u5b58\u5728\u4e00\u70b9\u95ee\u9898\uff0c\u5c31\u662f\u5c4f\u5e55\u4e2d\u51fa\u73b0\u591a\u4e2a\u548c\u83dc\u5355\u9009\u9879\u6587\u5b57\u76f8\u540c\u7684\u6587\u5b57\u65f6\uff0c\u6bd4\u5982\u4e0b\u9762\u8fd9\u79cd\u60c5\u51b5\uff1a \u5c4f\u5e55\u6070\u597d\u51fa\u73b0\u4e86\u4e24\u4e2a\u201c\u590d\u5236\u201d\uff0c\u6b64\u65f6\u8981\u5b9a\u4f4d\u5230\u83dc\u5355\u4e2d\u7684 \u201c\u590d\u5236\u201d\uff0c\u5c31\u9700\u8981\u8fdb\u4e00\u6b65\u505a\u6570\u636e\u5904\u7406\uff0c\u6bd4\u5982\uff1aOCR \u8fd4\u56de 2 \u4e2a\u201c\u590d\u5236\u201d\u7684\u5750\u6807\uff0c\u7528\u4f8b\u91cc\u9762\u6765\u5224\u65ad\u7528\u54ea\u4e2a\uff0c\u4ece\u4e1a\u52a1\u4e0a\u5c06\u5904\u7406\u8d77\u6765\u6bd4\u8f83\u9ebb\u70e6\uff0c\u56e0\u4e3a\u4f60\u5f97\u660e\u786e\u77e5\u9053\u83dc\u5355\u5728\u5de6\u8fb9\u8fd8\u662f\u53f3\u8fb9\uff0c\u7136\u540e\u8fd9\u672c\u8eab\u5c31\u662f\u4e0d\u786e\u5b9a\u7684\uff1b \u600e\u4e48\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u5462\uff0c\u8fd9\u5c31\u8981\u8bf4\u9053\u672c\u7ae0\u7684\u4e3b\u9898\uff1a\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b\u3002 \u3010\u539f\u7406\u3011 \u5728\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u524d\u622a\u4e00\u5f20\u56fe\uff0c\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\u518d\u622a\u53d6\u4e00\u5f20\u56fe\uff0c\u4e24\u5f20\u56fe\u552f\u4e00\u53d8\u5316\u7684\u5c31\u662f\u53f3\u952e\u83dc\u5355\uff0c\u5c06\u5176\u4ed6\u76f8\u540c\u7684\u5730\u65b9\u90fd\u5c4f\u853d\u6389\uff0c\u53ea\u7559\u4e0b\u83dc\u5355\u754c\u9762\uff0c\u5982\u6b64\u5373\u53ef\u6d88\u9664\u5e72\u6270\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u5c06\u4e24\u79cd\u56fe\u505a\u524d\u540e\u5bf9\u6bd4\u63d0\u53d6\u53ef\u4ee5\u5f97\u5230\u8fd9\u6837\u7684\u56fe\uff1a \u4f60\u770b\uff0c\u901a\u8fc7\u524d\u540e\u56fe\u7247\u7684\u5bf9\u6bd4\uff0c\u5c06\u76f8\u540c\u7684\u90e8\u5206\u7ed9\u6d88\u9664\u6389\uff0c\u518d\u8fdb\u884c OCR \u8bc6\u522b\uff0c\u8fd9\u6837\u5c31\u4e0d\u4f1a\u6709\u5e72\u6270\u4e86\uff1b \u4ee3\u7801\u5b9e\u73b0\u8bf7\u67e5\u770b src/filter_image.py \uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def filter_image(action):\n\"\"\"\n \u5bf9\u6bd4\u52a8\u4f5c\u524d\u540e\u4e24\u5f20\u56fe\u7247\uff0c\u63d0\u53d6\u4e0d\u540c\u7684\u90e8\u5206\u751f\u6210\u4e00\u5f20\u65b0\u7684\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u65b0\u56fe\u7247\u7684\u8def\u5f84\n :param action: \u52a8\u4f5c\u51fd\u6570\u7684\u51fd\u6570\u5bf9\u8c61\n :return: \u65b0\u56fe\u7247\u7684\u8def\u5f84\n \"\"\"\n action \u662f\u9f20\u6807\u4e8b\u4ef6\uff0c\u56e0\u4e3a\u6b64\u7c7b\u573a\u666f\u4e0d\u4ec5\u4ec5\u5728\u53f3\u952e\u5b58\u5728\uff0c\u5355\u51fb\u3001\u53cc\u51fb\u7b49\u7b49\uff0c\u53ea\u8981\u64cd\u4f5c\u524d\u540e\u540e\u53d8\u5316\u7684\u90fd\u53ef\u4ee5\uff1a from src.mouse_key import MouseKey\naction = (\nMouseKey.click,\nMouseKey.right_click,\nMouseKey.double_click,\nMouseKey.move_to,\n)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5","title":"5\u3001\u52a8\u6001\u56fe\u50cf\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5728\u684c\u9762\u58c1\u7eb8\u5207\u6362\uff0c\u6216\u770b\u56fe\u3001\u76f8\u518c\u5207\u6362\u56fe\u7247\u7c7b\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u7531\u4e8e\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u662f\u4e0d\u56fa\u5b9a\u7684\uff08\u4e0d\u540c\u7248\u672c\u7684\u7cfb\u7edf\u58c1\u7eb8\u4e0d\u540c\u3001\u58c1\u7eb8\u987a\u5e8f\u4e0d\u540c\uff0c\u770b\u56fe\u76f8\u518c\u5728\u56fe\u7247\u8d44\u6e90\u4e0d\u4e00\u5b9a\u56fa\u5b9a\uff09\uff0c\u90a3\u4e48\u5728\u6d4b\u8bd5\u5207\u6362\u58c1\u7eb8\u6216\u8005\u5207\u6362\u56fe\u7247\u7684\u573a\u666f\u65f6\u5c31\u4f1a\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u4f60\u4e0d\u77e5\u9053\u9884\u671f\u662f\u5565\uff0c\u7528\u4f8b\u64cd\u4f5c\u52a8\u6001\u7684\uff0c\u4e5f\u662f\u6781\u4e0d\u7a33\u5b9a\u3002 \u3010\u539f\u7406\u3011 \u5728\u5207\u6362\u56fe\u7247\u4e4b\u524d\u622a\u56fe\u4fdd\u5b58\u5e76\u8fd4\u56de\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u6b21\u8bc6\u522b\u8fd9\u5f20\u56fe\u7247\uff0c\u5982\u679c\u4e0d\u5b58\u5728\uff0c\u8bf4\u660e\u56fe\u7247\u5df2\u7ecf\u5207\u6362\u4e86\uff1b \u793a\u610f\u56fe\uff1a \u8fd9\u6837\uff0c\u6211\u4eec\u622a\u53d6\u4e86\u5f53\u524d\u56fe\u7247\u4e2d\u6bd4\u8f83\u6709\u4ee3\u8868\u6027\u7684\u4f4d\u7f6e\uff08\u4e00\u53ea\u9e1f\uff09\uff0c\u5728\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u7528\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1a \u6211\u4eec\u518d\u62ff\u7740\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd9\u6837\u5728\u5f53\u524d\u56fe\u7247\u4e2d\uff0c\u5c31\u4e0d\u80fd\u627e\u5230\u8fd9\u53ea\u9e1f\u4e86\uff0c\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u662f False\uff0c\u90a3\u4e48\u4e5f\u5c31\u53ef\u4ee5\u5224\u65ad\u56fe\u7247\u5207\u6362\u662f\u6210\u529f\u7684\u3002 \u4ee3\u7801\u793a\u610f\uff1a def save_temporary_picture(_x: int, _y: int, width: int, height: int):\n\"\"\"\n \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u56fe\u7247\u8def\u5f84\n :param x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n :param y: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n :param width: \u5bbd\u5ea6\n :param height: \u9ad8\u5ea6\n :return: \u56fe\u7247\u8def\u5f84\n \"\"\"\n \u6b64\u51fd\u6570\u7528\u4e8e\u5728\u64cd\u4f5c\u4e4b\u524d\u622a\u56fe\u4e00\u5f20\u4e34\u65f6\u56fe\u7247\uff0c\u8fd4\u56de\u56fe\u7247\u8def\u5f84\uff0c\u6700\u540e\u5728\u65ad\u8a00\u7684\u65f6\u5019\u518d\u5c06\u56fe\u7247\u8def\u5f84\u4f5c\u4e3a\u53c2\u6570\u4f20\u5165\u65ad\u8a00\u8bed\u53e5\u5373\u53ef\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ui","title":"\u4e09\u3001\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_1","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u662f\u6211\u4eec\u81ea\u7814\u7684\u4e00\u79cd\u4f7f\u7528\u7b80\u5355\uff0c\u4e14\u6548\u7387\u6781\u9ad8\u3001\u7a33\u5b9a\u6027\u597d\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u57fa\u4e8e\u5143\u7d20\u6309\u94ae\u5728\u5e94\u7528\u4e2d\u7684\u76f8\u5bf9\u4f4d\u7f6e\uff0c\u52a8\u6001\u83b7\u53d6\u5143\u7d20\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff0c\u9002\u7528\u4e8e\u5404\u79cd\u5c4f\u5e55\u5206\u8fa8\u7387\uff08\u5305\u62ec\u9ad8\u5206\u5c4f\u3001\u5bbd\u5c4f\u3001\u5e26\u9c7c\u5c4f\uff09\uff0c\u5f53\u5143\u7d20\u6309\u94ae\u4f4d\u7f6e\u76f8\u5bf9\u4e8e\u5e94\u7528\u754c\u9762\u4f4d\u7f6e\u53d1\u751f\u4fee\u6539\u4e4b\u540e\uff0c\u53ea\u9700\u8981\u6839\u636e UI \u8bbe\u8ba1\u56fe\u4e0a\u7684\u6e90\u6570\u636e\u4fee\u6539\u5bf9\u5e94\u5750\u6807\u6570\u636e\u5c31\u597d\uff0c\u7ef4\u62a4\u975e\u5e38\u7684\u65b9\u4fbf\u3002 \u6b64\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u9002\u7528\u4e8e\u4e00\u4e9b\u5143\u7d20\u4f4d\u7f6e\u76f8\u5bf9\u4e0e\u5e94\u7528\u754c\u9762\u6bd4\u8f83\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u97f3\u4e50\uff0899% \u7684\u5143\u7d20\u5b9a\u4f4d\u91c7\u7528\u8fd9\u79cd\uff0c\u6548\u679c\u975e\u5e38\u597d\uff09\uff0c\u4e0d\u9002\u7528\u4e8e\u754c\u9762\u4e0d\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u622a\u56fe\u5f55\u5c4f\uff0c\u5f88\u660e\u663e\u4e0d\u9002\u7528\u4e8e\u8fd9\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u3002\u8fd9\u79cd\u5168\u65b0\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u6709\u5b83\u7684\u9002\u7528\u6761\u4ef6\uff0c\u5982\u679c\u4f60\u53d1\u73b0\u4f7f\u7528\u5e38\u89c4\u7684\uff08\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u5b9a\u4f4d\uff09\u4e0d\u597d\u505a\u65f6\uff0c\u4e0d\u59a8\u8003\u8651\u4f7f\u7528\u8fd9\u79cd\uff0c\u5176\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff0c\u5e76\u4e14\u8fc5\u901f\u7231\u4e0a\u4ed6\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_1","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5728 UI \u8bbe\u8ba1\u56fe\u4e2d\u6211\u4eec\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u8fb9\u6846\u7684\u8ddd\u79bb\u7684\uff0c\u7136\u540e\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u6280\u672f\u624b\u6bb5\u83b7\u53d6\u5230\u5e94\u7528\u754c\u9762\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u53ca\u5e94\u7528\u7a97\u53e3\u7684\u5927\u5c0f\uff0c\u793a\u610f\u56fe\u5982\u4e0b\uff1a \uff08x1, y1\uff09\u4e3a\u5e94\u7528\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\uff1b\uff08x2, y2\uff09\u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u5de6\u4e0a\u89d2\uff08x1, y1\uff09\u7684\u5750\u6807\uff0c\u90a3\u4e48\u5b9e\u9645\u4e0a\u3010\u64ad\u653e\u6240\u6709\u3011\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\u4e3a\uff1a\uff08 x1 + x2, y1 + y2 \uff09\uff1b \u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5927\u5c0f\uff08w2, h2\uff09\uff0c\u53ef\u4ee5\u4ece UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\uff1b \u5728 UI \u8bbe\u8ba1\u7a3f\u4e0a\u70b9\u51fb\u3010\u64ad\u653e\u6240\u6709\u3011\u56fe\u6807\uff0c\u7136\u540e\u79fb\u52a8\u9f20\u6807\u5c31\u5c31\u53ef\u4ee5\u770b\u5230\u4e0a\u56fe\u7684\u53c2\u8003\u7ebf\u53ca\u6570\u636e\uff1b \u6240\u4ee5\uff0c\u6211\u4eec\u53ef\u4ee5\u8f7b\u677e\u7684\u83b7\u53d6\u5230\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u4e2d\u5fc3\u5750\u6807\u4e3a\uff1a\uff08 x1 + x2 + (w2 / 2), y1 + y2 + ( h2 / 2) \uff09 \u8be6\u7ec6\u6e90\u4ee3\u7801\u8bf7\u67e5\u770b AT \u57fa\u7840\u6846\u67b6: src/button_center.py \u83b7\u53d6\u5e94\u7528\u7a97\u53e3\u7684\u4fe1\u606f \u4f7f\u7528 xdotool \u548c xwininfo \u83b7\u53d6\u5230\u5e94\u7528\u7a97\u53e3\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u5de6\u4e0a\u89d2\uff09\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a app_id = CmdCtl.run_cmd(f\"xdotool search --classname --onlyvisible {self.app_name}\"\n).split(\"\\n\")\napp_id_list = [int(_id) for _id in app_id if _id]\nreturn CmdCtl.run_cmd(f\"xwininfo -id {app_id_list[self.number]}\")\n \u4f7f\u7528\u6b63\u5219\u83b7\u53d6\u7a97\u53e3\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u83b7\u53d6\u914d\u7f6e \u8bfb ini \u914d\u7f6e\u6587\u4ef6\uff0c\u83b7\u53d6\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e0e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a conf = ConfigParser()\nconf.read(self.config_path)\ndirection = conf.get(btn_name, \"direction\")\nposition = [int(i.strip()) for i in conf.get(btn_name, \"location\").split(\",\")]\n \u8ba1\u7b97\u5143\u7d20\u6309\u94ae\u5750\u6807 \u6839\u636e\u5e94\u7528\u7a97\u53e3\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u5927\u5c0f\u3001\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u5927\u5c0f\uff0c\u4f7f\u7528\u4e00\u5b9a\u7684\u7b97\u6cd5\u5373\u53ef\u8ba1\u7b97\u51fa\u5143\u7d20\u6309\u94ae\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u4e2d\u5fc3\u5750\u6807\uff09\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3","title":"3\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u3010\u914d\u7f6e\u65b9\u6cd5\u3011 \u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u7684\u6570\u636e\u6e90\u662f\u5e94\u7528\u5e93\u4e2d\u7684 ui.ini \u914d\u7f6e\u6587\u4ef6\uff1a ;section\n[\u65b0\u5efa\u6b4c\u5355+] ;key = value\ndirection = left_top\nlocation = 180, 268, 21, 21\n section \u662f\u4f60\u6839\u636e\u5bf9\u5e94\u7684\u5143\u7d20\u6309\u94ae\u547d\u540d\uff0c\u4f60\u53ef\u4ee5\u4efb\u610f\u547d\u540d\uff0c\u4f46\u6700\u597d\u6709\u5177\u4f53\u542b\u4e49\uff0c\u4e14\u80fd\u660e\u786e\u8868\u793a\u8fd9\u4e2a\u5143\u7d20\u6309\u94ae\u7684\u540d\u79f0\uff1b\u7528\u4e2d\u62ec\u53f7\u62ec\u8d77\u6765\u5c31\u884c\uff0c\u6bd4\u5982\uff1a[\u65b0\u5efa\u6b4c\u5355+] \uff1b direction \u662f\u914d\u7f6e\u8be5\u5143\u7d20\u7684\u53c2\u8003\u7cfb\uff0c\u5206\u522b\u4e3a\uff1a left_top \u5de6\u4e0a\uff1b left_bottom \u5de6\u4e0b\uff1b right_top \u53f3\u4e0a\uff1b right_bottom \u53f3\u4e0b\uff1b \u53c2\u8003\u7cfb\u7684\u9009\u53d6\u6807\u51c6\uff1a\u62c9\u52a8\u6539\u53d8\u7a97\u53e3\u5927\u5c0f\u65f6\uff0c\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u53c2\u8003\u7cfb\u4f4d\u7f6e\u662f\u4e0d\u53d8\u7684\uff1b location \u662f\u8be5\u5143\u7d20\u6309\u94ae\u7684\u76f8\u5bf9\u4e0e\u53c2\u8003\u7cfb\u7684 x, y \u7684\u8ddd\u79bb\uff0c\u53ca\u5927\u5c0f(w, h)\uff0c\u8fd9\u56db\u4e2a\u6570\u636e\u53ef\u4ee5\u901a\u8fc7 UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\u6570\u636e\uff0c\u5728\u7f16\u8f91\u6a21\u5f0f\u4e0b\uff0c\u70b9\u51fb UI \u56fe\u4e0a\u7684\u6309\u94ae\uff0c\u53f3\u4fa7\u5c31\u4f1a\u51fa\u73b0\u8be5\u5143\u7d20\u6309\u94ae\u7684 x, y, w, h \u6570\u636e\u3002 \u5982\u679c UI \u56fe\u4e0a\u6ca1\u6709\u63d0\u4f9b\u4f60\u60f3\u8981\u7684\u5143\u7d20\u6570\u636e\uff0c\u4f60\u53ef\u4ee5\u76f4\u63a5\u5728\u7cfb\u7edf\u4e2d\u4f7f\u7528\u622a\u56fe\u5f55\u5c4f\u8fdb\u884c\u5c3a\u91cf\uff0c\u8fd9\u662f\u4e00\u79cd\u4e0d\u63a8\u8350\u4f46\u80fd\u7528\u7684\u65b9\u6cd5\u3002 \u3010\u8c03\u7528\u65b9\u6cd5\u3011 \u5728\u5e94\u7528\u5e93\u65b9\u6cd5\u5c42\u8fd9\u6837\u5199\uff1a def click_add_music_list_btn_in_music_by_ui(self):\n\"\"\"\u70b9\u51fb\u65b0\u5efa\u6b4c\u5355\u6309\u94ae\"\"\"\nself.click(*self.ui.btn_center(\"\u65b0\u5efa\u6b4c\u5355+\"))\n self.ui.btn_center() \u662f\u56fa\u5b9a\u5199\u6cd5\uff0c\u53c2\u6570\u5c31\u662f\u914d\u7f6e\u91cc\u9762\u7684 section \u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ocr","title":"\u56db\u3001OCR \u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_2","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 OCR \u65b9\u6848\u5927\u591a\u91c7\u7528\u8c37\u6b4c OCR\uff08Tesseract\uff09\u65b9\u6848\uff0c\u4f46\u662f\u5b83\u5bf9\u4e8e\u4e2d\u6587\u7684\u8bc6\u522b\u975e\u5e38\u5dee\uff0c\u7ecf\u8fc7\u5927\u91cf\u7684\u8c03\u7814\uff0c\u6211\u4eec\u4f7f\u7528 PaddleOCR\uff0c\u5b83\u662f\u4e00\u4e2a\u5f00\u6e90\u7684\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u8bc6\u522b\u5de5\u5177\uff0c\u4e5f\u662f PaddlePaddle \u6700\u6709\u540d\u7684\u4e00\u4e2a\u5f00\u6e90\u9879\u76ee\uff0c\u611f\u5174\u8da3\u7684\u53ef\u4ee5\u70b9\u8fd9\u91cc\u4e86\u89e3\uff0c\u591a\u7684\u4e0d\u8bf4\u4e86\uff0c\u4f60\u53ea\u9700\u8981\u77e5\u9053\u5b83\u5c31\u662f\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_2","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5b89\u88c5\u4ed6\u662f\u4e2a\u5f88\u9ebb\u70e6\u7684\u4e8b\u60c5\uff0c\u867d\u7136\u64cd\u4f5c\u5f88\u7b80\u5355\uff0c\u4f46\u5176\u5b9e\u5b89\u88c5\u5305\u6709\u70b9\u5927\uff0c\u56e0\u6b64\u6211\u4eec\u4e0d\u5e0c\u671b\u76f4\u63a5\u5728 env.sh \u4e2d\u52a0\u5165\u5b83\uff0c\u8fd9\u4f1a\u8ba9\u6574\u4e2a\u81ea\u52a8\u5316\u73af\u5883\u53d8\u5f97\u975e\u5e38\u81c3\u80bf\uff1b \u56e0\u6b64\uff0c\u6211\u4eec\u60f3\u5230\u5c06\u5b83\u505a\u6210\u4e00\u4e2a RPC \u670d\u52a1\u5728\u5176\u4ed6\u673a\u5668\u4e0a\u90e8\u7f72\uff0c\u6d4b\u8bd5\u673a\u901a\u8fc7\u8fdc\u7a0b\u8c03\u7528 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u4f7f\u7528\u5b83\uff1b RPC \u7684\u8c03\u7528\u903b\u8f91\uff1a \u8fd9\u6837\u6211\u4eec\u53ea\u9700\u8981\u5728\u670d\u52a1\u7aef\u90e8\u7f72\u597d OCR \u8bc6\u522b\u7684\u670d\u52a1\uff0c\u7136\u540e\u901a\u8fc7 RPC \u670d\u52a1\u5c06\u529f\u80fd\u63d0\u4f9b\u51fa\u6765\uff0c\u6846\u67b6\u91cc\u9762\u53ea\u9700\u8981\u8c03\u7528\u5bf9\u5e94\u7684 RPC \u63a5\u53e3\u5c31\u884c\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_1","title":"3\u3001\u4f7f\u7528\u8bf4\u660e","text":"\u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nfrom paddleocr import PaddleOCR\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef paddle_ocr(pic_path, lang):\n\"\"\"\n Paddleocr\u76ee\u524d\u652f\u6301\u7684\u591a\u8bed\u8a00\u8bed\u79cd\u53ef\u4ee5\u901a\u8fc7\u4fee\u6539lang\u53c2\u6570\u8fdb\u884c\u5207\u6362\n \u4f8b\u5982`ch`, `en`, `fr`, `german`, `korean`, `japan`\n :param file_name:\n :param lang:\n :return:\n \"\"\"\nif __name__ == \"__main__\":\nIP = popen(\"hostname -I\").read().split(\" \")[0]\nPORT = 8890\nSCREEN_CACHE = \"/tmp/screen.png\"\nserver = ThreadXMLRPCServer((IP, PORT), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(paddle_ocr, \"paddle_ocr\")\nprint(\"\u76d1\u542c\u5ba2\u6237\u7aef\u8bf7\u6c42\u3002\u3002\")\nserver.serve_forever()\n \u6846\u67b6\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from src import OCR\nOCR.ocr(*target_strings, picture_abspath=None, similarity=0.6, return_default=False, return_first=False, lang=\"ch\"):\n# \u901a\u8fc7 OCR \u8fdb\u884c\u8bc6\u522b\u3002\n# target_strings:\n# \u76ee\u6807\u5b57\u7b26,\u8bc6\u522b\u4e00\u4e2a\u5b57\u7b26\u4e32\u6216\u591a\u4e2a\u5b57\u7b26\u4e32,\u5e76\u8fd4\u56de\u5176\u5728\u56fe\u7247\u4e2d\u7684\u5750\u6807;\n# \u5982\u679c\u4e0d\u4f20\u53c2\uff0c\u8fd4\u56de\u56fe\u7247\u4e2d\u8bc6\u522b\u5230\u7684\u6240\u6709\u5b57\u7b26\u4e32\u3002\n# picture_abspath: \u8981\u8bc6\u522b\u7684\u56fe\u7247\u8def\u5f84\uff0c\u5982\u679c\u4e0d\u4f20\u9ed8\u8ba4\u622a\u53d6\u5168\u5c4f\u8bc6\u522b\u3002\n# similarity: \u5339\u914d\u5ea6\u3002\n# return_default: \u8fd4\u56de\u8bc6\u522b\u7684\u539f\u751f\u6570\u636e\u3002\n# return_first: \u53ea\u8fd4\u56de\u7b2c\u4e00\u4e2a,\u9ed8\u8ba4\u4e3a False,\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u6240\u6709\u6570\u636e\u3002\n# lang: `ch`, `en`, `fr`, `german`, `korean`, `japan`\n \u6b64\u65b9\u6848\u5728\u6846\u67b6\u5185\u6ca1\u6709\u5f15\u5165\u4efb\u4f55\u4e09\u65b9\u4f9d\u8d56\u5b8c\u5168\u91c7\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\uff0c\u800c\u4e14\u4f7f\u7528\u65b9\u6cd5\u975e\u5e38\u7b80\u5355\uff0c\u53ea\u9700\u8981\u901a\u8fc7 OCR.ocr() \u5373\u53ef\uff1b \u5bf9\u4e8e\u4e00\u4e9b\u6587\u6848\u7684\u573a\u666f\u975e\u5e38\u9002\u7528\uff0c\u6b64\u65b9\u6cd5\u76f4\u63a5\u8fd4\u56de\u5750\u6807\uff0c\u53ef\u4ee5\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u3002 \u4e5f\u53ef\u4ee5\u7528\u4e8e\u6587\u5b57\u65ad\u8a00\uff0c\u4ee3\u7801\u793a\u610f\uff1a def assert_ocr_exist(\n*args, picture_abspath=None, similarity=0.6, return_first=False, lang=\"ch\"\n):\n\"\"\"\u65ad\u8a00\u6587\u6848\u5b58\u5728\"\"\"\npic = None\nif picture_abspath is not None:\npic = picture_abspath + \".png\"\nres = OCR.ocr(\n*args,\npicture_abspath=pic,\nsimilarity=similarity,\nreturn_first=return_first,\nlang=lang,\n)\nif res is False:\nraise AssertionError(\n(f\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{args}\", f\"{pic if pic else GlobalConfig.SCREEN_CACHE}\")\n)\nif isinstance(res, tuple):\npass\nelif isinstance(res, dict) and False in res.values():\nres = filter(lambda x: x[1] is False, res.items())\nraise AssertionError(\n(\nf\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{dict(res)}\",\nf\"{pic if pic else GlobalConfig.SCREEN_CACHE}\",\n)\n)\n \u5728\u7528\u4f8b\u4e2d\u4f7f\u7528\u65ad\u8a00\uff0c\u793a\u4f8b\uff1a def test_font_manager_021(self):\n\"\"\"\u53f3\u4fa7\u2665-\u6536\u85cf/\u53d6\u6d88\u6536\u85cf\u5b57\u4f53\"\"\"\n# \u5b57\u4f53\u7ba1\u7406\u5668\u754c\u9762\u53f3\u4fa7\u8be6\u60c5\u5217\u8868\uff0c\u9009\u62e9\u672a\u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e / \u6536\u85cf\u5b57\u4f53\n# \u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e\u83dc\u5355\u663e\u793a\u201c\u53d6\u6d88\u6536\u85cf\u201d\uff1b\n...\nself.assert_ocr_exist(\"\u53d6\u6d88\u6536\u85cf\")\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_1","title":"4\u3001\u670d\u52a1\u7aef\u90e8\u7f72","text":"\u6211\u4eec\u76ee\u524d\u662f\u5c06 OCR \u670d\u52a1\u90e8\u7f72\u5728\u666e\u901a\u7684\u529e\u516c\u673a\u4e0a\u7684\uff0c\u5982\u679c\u4f60\u89c9\u5f97\u73b0\u6709\u7684 OCR \u8bc6\u522b\u6027\u80fd\u4e0d\u591f\u597d\uff0c\u6070\u597d\u4f60\u6709\u66f4\u597d\u7684\u673a\u5668\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u5176\u79c1\u6709\u5316\u90e8\u7f72\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41_1","title":"4.1\u3001\u73af\u5883\u5b89\u88c5","text":"\u63a8\u8350\u4f7f\u7528 pipenv \u8fdb\u884c\u73af\u5883\u642d\u5efa\uff1b \u5b89\u88c5 pipenv \uff1a sudo pip3 install pipenv\n \u65b0\u5efa\u4e00\u4e2a\u76ee\u5f55\u4f5c\u4e3a\u73af\u5883\u5305 ocr_env\uff1a cd ~\nmkdir ocr_env\n \u521b\u5efa python 3.7 \u73af\u5883\uff1a cd ocr_env\npipenv --python 3.7\n \u5b89\u88c5 OCR \u4f9d\u8d56\u5305\uff1a pipenv install paddlepaddle -i https://mirror.baidu.com/pypi/simple\npipenv install \"paddleocr>=2.0.1\" -i https://mirror.baidu.com/pypi/simple\n \u4e0d\u51fa\u610f\u5916\uff0c\u8fd9\u6837\u5c31\u628a\u4f9d\u8d56\u5b89\u88c5\u597d\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42_1","title":"4.2\u3001\u542f\u52a8\u670d\u52a1","text":"\u5c06\u57fa\u7840\u6846\u67b6\u4e2d\u7684 scr/ocr/pdocr_rpc_server.py \u6587\u4ef6\u62f7\u8d1d\u5230 ocr_env \u76ee\u5f55\uff0c\u540e\u53f0\u6267\u884c\u5b83\u5c31\u597d\u4e86\uff1a cd ocr_env\nnohup pipenv run python pdocr_rpc_server.py &\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#43","title":"4.3\u3001\u914d\u7f6e\u5f00\u673a\u81ea\u542f\uff08\u901a\u7528\uff09","text":"\u4f60\u80af\u5b9a\u4e0d\u60f3\u6bcf\u6b21\u673a\u5668\u91cd\u542f\u4e4b\u540e\u90fd\u9700\u8981\u624b\u52a8\u542f\u52a8\u670d\u52a1\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u914d\u7f6e\u5f00\u673a\u81ea\u542f\u3002 \u5199\u5f00\u673a\u81ea\u542f\u670d\u52a1\u6587\u4ef6\uff1a sudo vim /lib/systemd/system/ocr.service\n autoocr \u540d\u79f0\u4f60\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff0c\u5199\u5165\u4ee5\u4e0b\u5185\u5bb9\uff1a [Unit]\nDescription=OCR Service\nAfter=multi-user.target\n\n[Service]\nUser=uos\nGroup=uos\nType=idle\nWorkingDirectory=/home/uos/ocr_env\nExecStart=pipenv run python pdocr_rpc_server.py\n\n[Install]\nWantedBy=multi-user.target\n \u6ce8\u610f\u66ff\u6362\u4f60\u7684${USER} \u4fee\u6539\u914d\u7f6e\u6587\u4ef6\u7684\u6743\u9650\uff1a sudo chmod 644 /lib/systemd/system/ocr.service\n \u81ea\u542f\u670d\u52a1\u751f\u6548\uff1a sudo systemctl daemon-reload\nsudo systemctl enable ocr.service\n \u67e5\u770b\u670d\u52a1\u72b6\u6001\uff1a sudo systemctl status ocr.service\n \u4f60\u53ef\u4ee5\u518d\u91cd\u542f\u4e0b\u7535\u8111\uff0c\u770b\u770b\u670d\u52a1\u662f\u4e0d\u662f\u6b63\u5e38\u542f\u52a8\u4e86\uff0c\u6ca1\u62a5\u9519\u5c31 OK \u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_4","title":"\u4e94\u3001\u5c5e\u6027\u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_3","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 UI \u81ea\u52a8\u5316\u5927\u591a\u90fd\u662f\u57fa\u4e8e\u6d4f\u89c8\u5668\u7684\uff0c\u6838\u5fc3\u662f\u5728\u7f51\u9875\u7684 DOM \u6811\u4e0a\u67e5\u627e\u5143\u7d20\uff0c\u5e76\u5bf9\u5176\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\uff1b Linux \u684c\u9762\u5e94\u7528\u5927\u591a\u662f\u91c7\u7528 Qt \u7f16\u5199\u7684\uff0c\u5728 Qt \u4e2d\u4e5f\u662f\u4ece\u6700\u9876\u5c42\u7684 MainWindow \u5f00\u59cb\u6784\u5efa\u5e94\u7528\uff0c\u6240\u4ee5\u903b\u8f91\u4e5f\u662f\u4e00\u6837\u7684\uff0cQt \u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u540c\u6837\u53ef\u4ee5\u901a\u8fc7 DOM \u6811\uff08\u5c5e\u6027\u6811\uff09\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff0c\u6211\u4eec\u79f0\u4e4b\u4e3a\u5c5e\u6027\u5b9a\u4f4d\u3002 \u501f\u52a9\u5f00\u6e90\u5de5\u5177 dogtail \u6211\u4eec\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u83b7\u53d6\uff0c\u4ece\u800c\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\u3002dogtail \u7684\u9879\u76ee\u4ecb\u7ecd\u53ef\u4ee5\u731b\u6233\u8fd9\u91cc\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_3","title":"2\u3001\u4f7f\u7528\u65b9\u6cd5","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#21sniff","title":"2.1\u3001sniff\uff08\u55c5\u63a2\u5668\uff09\u4f7f\u7528","text":"\u5728\u7ec8\u7aef\u8f93\u5165 sniff \u542f\u52a8 AT-SPI Browser mikigo@mikigo-PC:~$ sniff\n \u67e5\u770b\u5e94\u7528\u7684\u6807\u7b7e \u5728 sniff \u91cc\u9762\u53ef\u4ee5\u770b\u5230\u7cfb\u7edf\u4e2d\u5df2\u542f\u52a8\u7684\u5e94\u7528\uff0c\u70b9\u51fb\u5e94\u7528\u540d\u79f0\u524d\u9762\u7684\u4e09\u89d2\u5f62\u56fe\u6807\uff0c\u53ef\u4ee5\u5c55\u5f00\u5e94\u7528\u7684\u6807\u7b7e\uff0c\u6240\u6709\u6807\u7b7e\u4ee5 tree \u7684\u5f62\u5f0f\u5c55\u793a\uff0c\u5bf9\u5e94\u5e94\u7528\u91cc\u9762\u7684\u7236\u7a97\u53e3\u548c\u5b50\u7a97\u53e3\u3002 \u83b7\u53d6\u5143\u7d20\u63a7\u4ef6\u7684\u6807\u7b7e\u540d\u79f0 \u9996\u5148\uff0c\u4e3a\u4e86\u65b9\u4fbf\u67e5\u770b\u5143\u7d20\u63a7\u4ef6\u5bf9\u5e94\u7684\u4f4d\u7f6e\uff0c\u5efa\u8bae\u73b0\u5728\u4e0a\u65b9\u5de5\u5177\u680f\u70b9\u51fb Actions\uff0c\u7136\u540e\u52fe\u9009 Hightlight Items\uff0c\u8fd9\u6837\u5728 sniff \u4e2d\u9f20\u6807\u9009\u4e2d\u5143\u7d20\u6807\u7b7e\u7684\u65f6\u5019\uff0c\u5e94\u7528\u4e2d\u4f1a\u6709\u76f8\u5e94\u7684\u5149\u6807\u9501\u5b9a\u3002 \u5728 sniff \u91cc\u9762\u70b9\u51fb\u8fdb\u5165\u5e94\u7528\u7684\u6807\u7b7e tree \u4e2d\u540e\uff0c\u70b9\u51fb\u76f8\u5e94\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5728\u5de5\u5177\u4e0b\u65b9\uff0c\u4f1a\u5c55\u793a\u5143\u7d20\u63a7\u4ef6\u7684 Name\uff0c\u8fd9\u4e2a\u5c31\u662f\u6807\u7b7e\u540d\u79f0\u3002 \u5728 tree \u4e2d\u6709\u4e9b\u5730\u65b9\u662f\u7a7a\u767d\u7684\u6216\u8005\u662f Form\uff0c\u662f\u56e0\u4e3a\u5f00\u53d1\u4eba\u5458\u5728\u6dfb\u52a0\u6807\u7b7e\u7684\u65f6\u5019\u6ca1\u6709\u6dfb\u52a0\uff0c\u6216\u8005\u6709\u4e9b\u7236\u7a97\u53e3\u4e0d\u9700\u8981\u6dfb\u52a0\uff0c\u8fd9\u79cd\u5728\u5b9e\u9645\u4e1a\u52a1\u4e2d\u662f\u4e0d\u5f71\u54cd\u7684\uff0c\u6211\u4eec\u53ea\u8981\u4fdd\u8bc1\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\u4e2d\uff0c\u8981\u7528\u5230\u7684\u5143\u7d20\u90fd\u6dfb\u52a0\u4e86\u6807\u7b7e\u5373\u53ef\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#22","title":"2.2\u3001\u5143\u7d20\u64cd\u4f5c","text":"\u83b7\u53d6\u5e94\u7528\u5bf9\u8c61 dogtail \u83b7\u53d6\u5e94\u7528\u5bf9\u8c61\u7684\u65f6\u5019\uff0c\u4f7f\u7528\u7684\u662f tree \u5e93\u91cc\u9762\u7684 application() \u65b9\u6cd5\uff1a from dogtail.tree import root\napp_obj = root.application('deepin-music')\n app_obj\u5c31\u662f\u5e94\u7528\u7684\u5bf9\u8c61\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\uff0c\u662f\u5e94\u7528\u5bf9\u8c61\u4f7f\u7528child()\u65b9\u6cd5\uff1a element = app_obj.child('element_name')\n \u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u4f20\u5165\u5143\u7d20\u7684 Name\uff0c\u83b7\u53d6\u5230\u76f8\u5e94\u5143\u7d20\u7684\u5bf9\u8c61\u3002Name \u53ef\u4ee5\u901a\u8fc7 sniff \u67e5\u770b\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\u5217\u8868: element_list = element.children\n \u83b7\u53d6\u5230\u8fd9\u4e2a\u5143\u7d20\u4e0b\u9762\u6240\u6709\u7684\u5143\u7d20\u5217\u8868\u3002 \u8fd9\u4e2a\u65b9\u6cd5\u9002\u7528\u4e8e\u6709\u4e9b\u6807\u7b7e\u6ca1\u6709\u6dfb\u52a0\uff0c\u4f46\u662f\u4f4d\u7f6e\u662f\u56fa\u5b9a\u7684\uff0c\u6211\u4eec\u901a\u8fc7\u7d22\u5f15\u53ef\u4ee5\u53d6\u5f97\u5143\u7d20\u3002 element_list[0]\n \u5bf9\u5143\u7d20\u7684\u64cd\u4f5c \u5728\u83b7\u53d6\u5230\u5143\u7d20\u4e4b\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u76f8\u5e94\u7684\u64cd\u4f5c\u3002 \u5355\u51fb element.click(button=1)\n button 1 \u2014>\u5de6\u952e\uff0c2 \u2014>\u6eda\u8f6e\uff0c3 \u2014>\u53f3\u952e\uff0c\u9ed8\u8ba4\u4e3a 1 \u53cc\u51fb element.doubleClick(button=1)\n \u9f20\u6807\u60ac\u505c element.point()\n \u9f20\u6807\u79fb\u52a8\u5230\u5143\u7d20\u4e2d\u5fc3\u4f4d\u7f6e \u6587\u672c\u8f93\u5165 element.typeText(string)\n \u5411\u5143\u7d20\u5bf9\u8c61\u8f93\u5165\u5b57\u7b26\u4e32 \uff0c\u6bd4\u5982\u8f93\u5165\u6846 \u7ec4\u5408\u952e element.keyCombo(comboString)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#23","title":"2.3\u3001\u6846\u67b6\u5c01\u88c5","text":"\u4ee3\u7801\u793a\u4f8b\uff1a # \u8be6\u7ec6\u4ee3\u7801\u8bf7\u67e5\u770b src/dogtail_utils.py\nclass DogtailUtils:\ndef __init__(self, name=None, description=None):\nself.name = name\nself.description = description\nself.obj = root.application(self.name, self.description)\ndef app_element(self, *args, **kwargs):\n\"\"\"\n \u83b7\u53d6app\u5143\u7d20\u7684\u5bf9\u8c61\n :return: \u5143\u7d20\u7684\u5bf9\u8c61\n \"\"\"\nreturn self.obj.child(*args, **kwargs, retry=False)\ndef element_center(self, element) -> tuple:\n\"\"\"\n \u83b7\u53d6\u5143\u7d20\u7684\u4e2d\u5fc3\u4f4d\u7f6e\n :param element:\n :return: \u5143\u7d20\u4e2d\u5fc3\u5750\u6807\n \"\"\"\n_x, _y, _w, _h = self.app_element(element).extents\n_x = _x + _w / 2\n_y = _y + _h / 2\nreturn _x, _y\n \u6846\u67b6\u63d0\u4f9b\u7684\u63a5\u53e3\u975e\u5e38\u7b80\u6d01\uff0c\u5728\u8c03\u7528\u65f6\uff1a self.dog.element_center(\"\u64ad\u653e\")\n \u8fd9\u6837\u5c31\u80fd\u83b7\u53d6\u5230\u6b64\u5143\u7d20\u7684\u4e2d\u5fc3\u5750\u6807\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_5","title":"\u516d\u3001\u6807\u7b7e\u5316\u7ba1\u7406","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_4","title":"1\u3001\u6807\u7b7e\u8bf4\u660e","text":"\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u811a\u672c ID\uff1a\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c/\u51fd\u6570 ID\uff1b PMS\u7528\u4f8bID\uff1aPMS \u4e0a\u5bf9\u5e94\u7684\u7528\u4f8b ID\uff08\u7528\u4f8b\u5e93 ID\uff09\uff1b \u9ed8\u8ba4\u4f7f\u7528\u7528\u4f8b\u5e93 ID\uff0c\u5bf9\u4e8e\u6682\u65f6\u6ca1\u6709\u4f7f\u7528\u7528\u4f8b\u5e93\u7ba1\u7406\u7528\u4f8b\u7684\u9879\u76ee\uff0c\u53ef\u4ee5\u4f7f\u7528\u4ea7\u54c1\u5e93\u7528\u4f8b ID\uff1b \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1aFUNC\uff08\u529f\u80fd\uff09\u3001PERF\uff08\u6027\u80fd\uff09\u3001STR\uff08\u538b\u529b\uff09\u3001SEC\uff08\u5b89\u5168\uff09\u3001CTS\uff08\u517c\u5bb9\u6027\uff09\u3001API\uff08\u63a5\u53e3\uff09\u3001BASELINE\uff08\u57fa\u7ebf-\u9884\u7559\uff09 \u8bbe\u5907\u7c7b\u578b\uff1aPPL\uff08\u4f9d\u8d56\u5916\u8bbe\u7684\u7528\u4f8b\uff09\u3001COL\uff08\u4f9d\u8d56\u4e3b\u63a7\u673a\u7684\u7528\u4f8b\uff09 \u7528\u4f8b\u6765\u6e90\uff1aBUG\uff08\u7531 Bug \u8f6c\u7684\u7528\u4f8b\uff09 \u4e0a\u7ebf\u5bf9\u8c61\uff1aCICD\uff0c\u8868\u793a\u4e0a\u7ebf\u5230 CICD \u6d41\u6c34\u7ebf\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u53ef\u4e00\u952e\u751f\u6210 case_list.csv \u6587\u4ef6\uff0c\u7528\u4e8e\u5bfc\u5165\u5230\u660e\u9053\u4e91 AT \u7528\u4f8b\u5217\u8868\u4e2d\u63a7\u5236 CICD \u8dd1\u6d4b\u8303\u56f4\uff1b \u6d4b\u8bd5\u7ea7\u522b\uff1aC1 / C2 / C3 / C4\uff0c\u5177\u4f53\u5b9a\u4e49\u53c2\u8003\u6d41\u6c34\u7ebf\u4f7f\u7528\u6307\u5bfc\uff1b \u8df3\u8fc7\u539f\u56e0\uff1askip-XXX\uff0c\u7528\u4e8e\u63a7\u5236\u7528\u4f8b\u662f\u5426\u6267\u884c\uff1b \u786e\u8ba4\u4fee\u590d\uff1afixed-XXX\uff0c\u7528\u4e8e\u6807\u8bb0\u7528\u4f8b\u7684\u4fee\u590d\u72b6\u6001\uff08\u540e\u9762\u8be6\u7ec6\u8bb2\u89e3\u7528\u6cd5\uff09\uff1b \u5e9f\u5f03\u7528\u4f8b\uff1aremoved-\u5df2\u5e9f\u5f03\uff0c\u7528\u4e8e\u6807\u8bb0\u5df2\u7ecf\u5e9f\u5f03\u7684\u7528\u4f8b\uff0c\u6b64\u7528\u4f8b\u6807\u7b7e\u4e0d\u4f1a\u88ab\u6dfb\u52a0\uff0c\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff1b \u793a\u4f8b\uff1a \u811a\u672cID PMS\u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u8bbe\u5907\u7c7b\u578b \u7528\u4f8b\u6765\u6e90 \u4e0a\u7ebf\u5bf9\u8c61 \u6d4b\u8bd5\u7ea7\u522b \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b ... 679537 679537 L1 FUNC PPL CICD C1 skip-XXX fixed-XXX removed-\u5df2\u5e9f\u5f03 ..."},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_4","title":"2\u3001\u64cd\u4f5c\u6b65\u9aa4","text":"2.1\u3001\u5728\u5b50\u9879\u76ee\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u4ee5\u7528\u4f8b\u7684 py \u6587\u4ef6\u9664\u53bb\u9996\u5b57\u7b26\u4e32 \"test_\" \u548c\u7528\u4f8b\u5e8f\u53f7\u540e\u7684\u5b57\u7b26\u4e32\u4f5c\u4e3a csv \u7684\u6587\u4ef6\u540d\u3002 \u4f8b\u5982: \u76f8\u518c\u7684\u7528\u4f8b\u6587\u4ef6\u4e3a test_album_xxx.py\uff0cxxx \u8868\u793a\u7528\u4f8b\u7684ID\uff08\u4e5f\u53ef\u4ee5\u662f\u81ea\u5b9a\u4e49\u7684\u6570\u5b57\u4ee3\u8868\u7528\u4f8b\u5e8f\u53f7\uff09\uff0c\u6b64\u65f6 csv \u6587\u4ef6\u540d\u5c31\u5e94\u4e3a album.csv\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u6240\u6709 csv \u6587\u4ef6\u5efa\u8bae\u653e\u5728\u4e00\u4e2a tags \u76ee\u5f55\u4e0b\u3002 \u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 2.2\u3001\u7b2c\u4e00\u5217\u4e3a\u811a\u672c ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b\u7528\u4f8b\u6807\u7b7e\u53ef\u4ee5\u65e0\u5e8f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_2","title":"3\u3001\u589e\u52a0\u8bf4\u660e","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_1","title":"3.1\u3001\u8df3\u8fc7\u7528\u4f8b","text":"\u4f20\u7edf\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668(@pytest.mark.skip)\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a; \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#311","title":"3.1.1\u3001\u56fa\u5b9a\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 679537 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u7b7e\u5f00\u5934\u4e3a \u201cskip-XXX\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\uff0c\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\u5219\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u7b7e\u4e3a SKIPED\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#312","title":"3.1.2\u3001\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skipif_platform-aarch64&mips64 \u67d0\u4e9b\u7528\u4f8b\u4f1a\u56e0\u4e3a\u4e0d\u540c\u7684\u73af\u5883\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\uff0c\u5e38\u89c1\u7684\u573a\u666f\u4e3a\u5728\u4e0d\u540c\u67b6\u6784\u4e0a\u5224\u65ad\u662f\u5426\u6267\u884c\uff0c\u8df3\u8fc7\u7684\u539f\u56e0\u6807\u7b7e\u4e3a \u201cskipif_platform-\u201d \u52a0\u67b6\u6784\u540d\uff0c\u591a\u4e2a\u67b6\u6784\u4e4b\u95f4\u4f7f\u7528 \u201c&\u201d \u62fc\u63a5\uff1b \u4ee5\u4e0a\u4f8b\u5b50\u4e3a\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u5224\u65ad\u5f53\u524d\u67b6\u6784\u662f\u5426\u4e3a arrch64 \u6216\u8005 mips64\uff0c\u82e5\u662f\uff0c\u5219\u8df3\u8fc7\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u82e5\u5426\u5219\u6267\u884c\u7528\u4f8b\uff1b \u76ee\u524d\u6846\u67b6\u9ed8\u8ba4\u4ec5\u652f\u6301\u67b6\u6784\u7684\u6761\u4ef6\u5224\u65ad\uff0c\u4f46\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u903b\u8f91\u652f\u6301\u81ea\u5b9a\u4e49\u6dfb\u52a0\u3002 \u5728\u9879\u76ee\u76ee\u5f55\u8def\u5f84\u4e0b\u5b58\u5728\u6587\u4ef6 setting/skipif.py\uff0c\u6240\u6709\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u7684\u51fd\u6570\u5199\u5728\u6b64\u6587\u4ef6\u4e2d\u3002 \u9ed8\u8ba4\u67b6\u6784\u5224\u65ad\u4f8b\u5b50\uff1a def skipif_platform(args: str):\n\"\"\"\u5e73\u53f0\u8df3\u8fc7\"\"\"\n_skip_key = args.split(\"&\")\nfor key in _skip_key:\nif GlobalConfig.SYS_ARCH == key:\nreturn True\nreturn False\n \u65b9\u6cd5\u7f16\u5199\u89c4\u8303\uff1a \u65b9\u6cd5\u540d\u5fc5\u987b\u4ee5 skipif \u5f00\u5934\uff1b \u65b9\u6cd5\u5fc5\u987b\u6709\u8fd4\u56de\u7ed3\u679c\u5e76\u4e14\u4e3a\u5e03\u5c14\u503c\uff08True \u4ee3\u8868\u8df3\u8fc7\uff0cFalse \u4ee3\u8868\u4e0d\u8df3\u8fc7\uff09\uff1b \u65b9\u6cd5\u53ea\u80fd\u6709\u4e00\u4e2a\u5165\u53c2\uff1b \u5728 csv \u6587\u4ef6\u8df3\u8fc7\u539f\u56e0\u4e00\u680f\u4e2d\u586b\u5199\u4e3a \u201c{\u51fd\u6570\u540d}-{\u53c2\u6570}\u201d\uff0c\u4f8b\u5982\uff1askipif_platform-aarch64\uff1b\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u4f1a\u4ee5\u7b2c\u4e00\u4e2a \u201c-\u201d \u8fdb\u884c\u5206\u5272\uff0c\u622a\u53d6\u7684\u5de6\u4fa7\u5b57\u7b26\u4e32\u4f5c\u4e3a\u51fd\u6570\u540d\uff0c\u5728 skipif.py \u6587\u4ef6\u4e2d\u67e5\u627e\u662f\u5426\u6709\u540c\u540d\u51fd\u6570\uff0c\u5e76\u5c06\u622a\u53d6\u7684\u53f3\u4fa7\u4f5c\u4e3a\u53c2\u6570\u4f20\u9012\u7ed9\u8be5\u51fd\u6570\uff0c\u901a\u8fc7\u83b7\u53d6\u8be5\u51fd\u6570\u8fd4\u56de\u7684\u5e03\u5c14\u503c\uff0c\u8fd4\u56de True\uff0c\u5219\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u8fd4\u56de False\uff0c\u5219\u6267\u884c\u8be5\u7528\u4f8b\u3002 \u82e5\u51fd\u6570\u9700\u8981\u591a\u4e2a\u53c2\u6570\uff0c\u53ef\u81ea\u5b9a\u4e49\u591a\u4e2a\u53c2\u6570\u4e4b\u95f4\u7684\u8fde\u63a5\u7b26\uff0c\u8fde\u63a5\u7b26\u53f7\u4e0d\u53ef\u4f7f\u7528\u4e0b\u5212\u7ebf\u548c\u9017\u53f7\uff0c\u63a8\u8350\u7edf\u4e00\u4f7f\u7528 & \u7b26\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32","title":"3.2\u3001\u786e\u8ba4\u4fee\u590d","text":"\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7528\u4f8b\u4fee\u590d\u540e\uff0c\u4f46\u4e0d\u80fd\u7acb\u5373\u5220\u9664\u8df3\u8fc7\u539f\u56e0\uff08skip-XXX\uff09\u7684\u7528\u4f8b\uff0c\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u786e\u8ba4\u4fee\u590d\u201d\uff0c\u4f5c\u4e3a\u6807\u8bb0\u8be5\u7528\u4f8b\u662f\u5426\u5df2\u7ecf\u4fee\u590d\uff0c\u56fa\u5b9a\u586b\u5165\u5b57\u6bb5\u4e3a \u201cfixed-\u5df2\u4fee\u590d\u201d\u3002\u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u5373\u4f7f\u540c\u65f6\u6807\u8bb0\u4e86 skip-XXX \u4e5f\u4f1a\u6b63\u5e38\u6267\u884c\u3002 \u793a\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d 679537 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d \u3010\u540c\u65f6\u6807\u8bb0\u4e86skip \u548c fixed\uff0c\u4f46\u4ecd\u7136\u60f3\u8981\u8df3\u8fc7\u7528\u4f8b\u3011 \u5f53 \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u540c\u65f6\u586b\u5165\u540e\uff0c\u547d\u4ee4\u884c\u4f20\u9012\u53c2\u6570 --ifixed yes\uff0c\u5219\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\u8be5\u6761\u7528\u4f8b\u3002 python3 manage.py run --ifixed yes\n \u770b\u5230\u8fd9\u91cc\u6709\u4e9b\u540c\u5b66\u53ef\u80fd\u8981\u95ee\u4e86\uff0c\u6211\u60f3\u6062\u590d\u8df3\u8fc7\u6267\u884c\uff0c\u76f4\u63a5\u628a skip-XXX \u8fd9\u4e00\u5217\u6807\u7b7e\u5220\u6389\u4e0d\u5c31\u597d\u4e86\uff0c\u8fd8\u641e\u4ec0\u4e48\u786e\u8ba4\u4fee\u590d\u5e72\u5565\uff1f \u8fd9\u91cc\u7ed9\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u89e3\u91ca\u4e00\u4e0b\uff1a \uff08\u4ee5\u4e0b\u6d41\u6c34\u7ebf\u6307\u7684\u662f\u6bcf\u65e5\u6784\u5efa\u7684\u6d41\u6c34\u7ebf\uff0c\u8dd1 AT \u7684\u5168\u91cf\u7528\u4f8b\uff09 \u9996\u5148\uff0c\u6d41\u6c34\u7ebf\u4e0a\u8dd1\u7684\u662f AT \u5386\u53f2 Tag\uff0c\u8df3\u8fc7\u7528\u4f8b\u7684\u6807\u7b7e(skip-XXX) \u662f\u5728\u6700\u65b0\u7684\u4ee3\u7801\u4e0a\u63d0\u4ea4\u7684\uff0c\u6211\u4eec\u91c7\u7528\u6700\u65b0\u7684 csv \u6587\u4ef6\u8986\u76d6\u5386\u53f2 csv \u6587\u4ef6\u7684\u8bbe\u8ba1\u6765\u5b9e\u73b0\u4e86\u5bf9\u5386\u53f2 Tag \u4e0a\u7528\u4f8b\u7684\u8df3\u8fc7\uff1b \u7136\u540e\uff0c\u5728\u65e5\u5e38\u8df3\u8fc7\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u540c\u65f6\u4e5f\u5728\u4fee\u590d\u4e00\u4e9b\u7528\u4f8b\uff0c\u4fee\u590d\u540e\u7684\u8fd9\u4e9b\u7528\u4f8b\u5728\u672c\u5730\u8c03\u8bd5\u7684\u65f6\u5019\u6211\u4eec\u4e0d\u5e0c\u671b\u7ee7\u7eed\u8df3\u8fc7\uff0c\u4f46\u662f\u6b64\u65f6\uff0c\u4fee\u590d\u7684\u8fd9\u4e9b\u7528\u4f8b\u53ef\u80fd\u8fd8\u4e0d\u7a33\u5b9a\uff0c\u4e0d\u9002\u5408\u9a6c\u4e0a\u653e\u5230\u6d41\u6c34\u7ebf\u53bb\u8dd1\uff0c\u4e5f\u5c31\u662f\u8bf4\u6d41\u6c34\u7ebf\u4e0a\u6211\u4eec\u662f\u5e0c\u671b\u4ed6\u7ee7\u7eed\u8df3\u8fc7\u7684\uff0c\u56e0\u6b64\uff0c\u54b1\u4e0d\u80fd\u76f4\u63a5\u628a skip-XXX \u5e72\u6389\uff1b \u8fd9\u91cc\u5c31\u77db\u76fe\u4e86\uff0c\u4e00\u4e2a\u9700\u6c42\u662f\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u53e6\u4e00\u4e2a\u9700\u6c42\u53c8\u4e0d\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u600e\u4e48\u529e\u5462\uff1f \u6211\u4eec\u4f7f\u7528\u201c\u786e\u8ba4\u4fee\u590d\u201d\u6765\u6807\u8bb0\u8fd9\u6761\u7528\u4f8b\u5df2\u7ecf\u4fee\u590d\u4e86\uff0c\u8fd9\u6837\u4f60\u672c\u5730\u8c03\u8bd5\u7528\u4f8b\u7684\u65f6\u5019\u8fd9\u6761\u5df2\u4fee\u590d\u7684\u7528\u4f8b\u662f\u4f1a\u6267\u884c\u7684\uff0c\u540c\u65f6\u5728\u6d41\u6c34\u7ebf\u4e0a\u5c06 --ifixed yes \u53c2\u6570\u52a0\u4e0a\uff0c\u90a3\u4e48\u6d41\u6c34\u7ebf\u4e0a\u6267\u884c\u65f6\u8fd9\u6761\u7528\u4f8b\u4ecd\u7136\u662f\u8df3\u8fc7\u7684\u72b6\u6001\uff0c\u540e\u7eed\u4f60\u6253 Tag \u7684\u65f6\u5019\uff0c\u628a \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u7684\u6807\u7b7e\u5168\u90e8\u5220\u6389\u5c31\u53ef\u4ee5\u4e86\u3002 \u8fd9\u5c31\u662f\u201c\u786e\u8ba4\u4fee\u590d\u201d\u8fd9\u4e2a\u6807\u7b7e\u7684\u80cc\u666f\uff0c\u9700\u8981\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u54c1\u4e00\u54c1\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#33","title":"3.3\u3001\u5e9f\u5f03\u7528\u4f8b","text":"\u9488\u5bf9\u67d0\u4e9b\u7528\u4f8b\uff0c\u7531\u4e8e\u9700\u6c42\u53d8\u66f4\uff0c\u73af\u5883\u5f71\u54cd\u6216\u8bc4\u4f30\u4e0d\u518d\u9002\u7528\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u65f6\uff0c\u7528\u4f8b\u9700\u8981\u5e9f\u5f03\uff0c\u5219\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u5e9f\u5f03\u7528\u4f8b\u201d\uff0c\u8be5\u5217\u5b58\u5728 \u201cremoved-{\u5e9f\u5f03\u539f\u56e0}\u201d\uff0c\u5219\u7528\u4f8b\u4e0d\u4f1a\u6267\u884c\u3002 \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d removed-\u5df2\u5e9f\u5f03 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_2","title":"4\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u4e0a\u9762\u4ecb\u7ecd Pytest \u6846\u67b6\u63d0\u4f9b\u7684\u6807\u7b7e\u529f\u80fd mark\uff0c\u4f7f\u7528\u65f6\u9700\u8981\u4e3a\u6bcf\u4e00\u4e2a\u7528\u4f8b\u6dfb\u52a0\u6807\u7b7e\u88c5\u9970\u5668\uff0c\u5219\u64cd\u4f5c\u590d\u6742\uff0c\u53ef\u7ef4\u62a4\u6027\u5dee\uff0c\u5176\u6839\u672c\u95ee\u9898\u5c31\u662f\u6807\u7b7e\u5206\u6563\u5728\u6bcf\u4e00\u6761\u7528\u4f8b\u7684\u88c5\u9970\u5668\u4e0a\uff0c\u96be\u4ee5\u96c6\u4e2d\u7ef4\u62a4\uff1b\u4e8e\u662f\u4e4e\u5c06\u6240\u6709\u6807\u7b7e\u4f7f\u7528 csv \u6587\u4ef6\u8fdb\u884c\u96c6\u4e2d\u7ba1\u7406\uff0c\u5e76\u901a\u8fc7 Pytest \u7684\u94a9\u5b50\u51fd\u6570\uff0c\u8bfb\u53d6 csv \u6587\u4ef6\uff0c\u52a8\u6001\u6dfb\u52a0\u6807\u7b7e\u5230\u7528\u4e2d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5csv","title":"5\u3001CSV\u6587\u4ef6\u683c\u5f0f","text":"\u6b64\u914d\u7f6e\u6587\u4ef6\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u6807\u7b7e\u6570\u636e\uff0c\u4e14\u8981\u65b9\u4fbf\u80fd\u4f7f\u7528 Excel \u6253\u5f00\u8fdb\u884c\u7f16\u8f91\u67e5\u770b\uff0c\u66f4\u91cd\u8981\u7684\u662f\u6211\u4eec\u4e0d\u60f3\u5f15\u5165\u4e09\u65b9\u4f9d\u8d56\uff0cCSV \u6587\u4ef6\u51e0\u4e4e\u662f\u552f\u4e00\u80fd\u6ee1\u8db3\u6240\u6709\u7684\u8981\u6c42\u7684\u6587\u4ef6\u683c\u5f0f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_6","title":"\u4e03\u3001\u65e5\u5fd7\u7cfb\u7edf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_5","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e YouQu \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u64cd\u4f5c\u65b9\u6cd5\u5c01\u88c5\u5199\u6cd5\uff0c\u901a\u5e38\u662f\u8fd9\u6837\u7684\uff1a\u7c7b\u91cc\u9762\u4e00\u4e2a\u51fd\u6570\u53ea\u5305\u542b\u4e00\u4e2a\u64cd\u4f5c\u6216\u591a\u6b21\u8c03\u7528\u7684\u4e00\u7cfb\u5217\u53ef\u5408\u5e76\u7684\u64cd\u4f5c\uff1b \u4f20\u7edf\u7684\u65e5\u5fd7\u8f93\u51fa\u65b9\u5f0f\uff0c\u9700\u8981\u5728\u6bcf\u4e2a\u51fd\u6570\u91cc\u9762\u4e3b\u52a8\u7f16\u5199\u65e5\u5fd7\u8f93\u51fa\u4ee3\u7801 \uff0c\u4f8b\u5982\uff1a class XXXWidget:\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\nlogger.info(\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\")\n...\n# \u7701\u7565\u4ee3\u7801\u90e8\u5206\n \u4e00\u4e2a\u51fd\u6570\u91cc\u9762\u81f3\u5c11\u5305\u542b\u4e00\u6761\u65e5\u5fd7\u4fe1\u606f\uff0c\u5982\u679c\u6bd4\u8f83\u590d\u6742\u64cd\u4f5c\u6b65\u9aa4\uff0c\u53ef\u80fd\u5305\u542b\u591a\u6761\u65e5\u5fd7\u4fe1\u606f\uff1b \u4e00\u4e2a\u5e94\u7528\u542b\u6709\u5927\u91cf\u7684\u64cd\u4f5c\u51fd\u6570\uff0c\u4e5f\u5c31\u662f\u8bf4\u6211\u4eec\u9700\u8981\u5199\u5927\u91cf\u7684\u65e5\u5fd7\u4ee3\u7801\uff1b \u901a\u8fc7\u7ecf\u9a8c\u89c2\u5bdf\uff0c\u6211\u4eec\u53d1\u73b0\uff0c\u51fd\u6570\u8bf4\u660e\u4ee5\u53ca\u51fd\u6570\u64cd\u4f5c\u65e5\u5fd7\uff0c\u5177\u6709\u8f83\u9ad8\u7684\u91cd\u590d\u5ea6\uff08\u4ece\u4e0a\u9762\u7684\u4f8b\u5b50\u4e5f\u53ef\u4ee5\u770b\u51fa\u6765\uff09\uff0c\u56e0\u6b64\u6211\u4eec\u5927\u80c6\u7684\u8bbe\u60f3\uff0c\u80fd\u4e0d\u80fd\u57fa\u4e8e\u6846\u67b6\u6267\u884c\u65f6\uff0c\u81ea\u52a8\u7684\u5c06\u51fd\u6570\u8bf4\u660e\u4f5c\u4e3a\u65e5\u5fd7\u6253\u5370\u51fa\u6765\uff0c\u4ece\u800c\u51cf\u5c11\u5927\u91cf\u65e5\u5fd7\u4ee3\u7801\u91cf\u548c\u91cd\u590d\u7f16\u5199\uff0c\u90a3\u771f\u662f\u5999\u554a~\u3002 \u57fa\u4e8e\u6b64\u201c\u5929\u771f\u201d\u7684\u60f3\u6cd5\uff0c\u6211\u4eec\u8bbe\u8ba1\u51fa\u4e86 youqu \u7684\u65e5\u5fd7\u7cfb\u7edf\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_5","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u6838\u5fc3\u539f\u7406\uff1a \u901a\u8fc7\u7ed9\u7c7b\u52a0\u4e0a\u4e00\u4e2a\u88c5\u9970\u5668 @log\uff0c\u52a8\u6001\u7ed9\u8be5\u7c7b\u4e0b\u6240\u6709\u7684\u51fd\u6570\u53ca\u7236\u7c7b\u51fd\u6570\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668 @_trace\uff0c\u5728\u6b64\u88c5\u9970\u5668\u4e2d\u6211\u4eec\u80fd\u52a8\u6001\u7684\u6355\u83b7\u6240\u8c03\u7528\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff08func.__doc__\uff09\uff0c\u901a\u8fc7\u65e5\u5fd7\u8f93\u51fa\u5668\u5c06\u5176\u8f93\u51fa\u5373\u53ef\u3002 \u5b9e\u73b0\u6b65\u9aa4\uff1a \u901a\u8fc7 inspect.getmembers \u83b7\u53d6\u88ab\u88c5\u9970\u7684\u7c7b\u4e0b\u6240\u6709\u51fd\u6570\uff0c\u5305\u542b\u9759\u6001\u65b9\u6cd5\uff0c\u7c7b\u65b9\u6cd5\uff0c\u5b9e\u4f8b\u65b9\u6cd5\uff1b \u901a\u8fc7 setattr(\u7c7b, \u65b9\u6cd5, _trace\uff09 \u7684\u65b9\u5f0f\uff0c\u7ed9\u7b26\u5408\u6761\u4ef6\u7684\u51fd\u6570\uff0c\u52a8\u6001\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_3","title":"3\u3001\u65e5\u5fd7\u914d\u7f6e","text":"[log_cli]\n;\u65e5\u5fd7\u76f8\u5173\u914d\u7f6e\uff08\u4e0d\u6253\u5370\u6784\u9020\u51fd\u6570\u548c\u9b54\u6cd5\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff09\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = INFO\n# ============= \u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u914d\u7f6e ================\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u5f00\u5934\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7, \u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_STARTSWITH = Assert\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u7ed3\u5c3e\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_ENDSWITH = Widget\n;\u652f\u6301\u7c7b\u540d\u5305\u542b xxx \u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_CONTAIN = ShortCut\n# ==============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_3","title":"4\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u5728\u5e94\u7528\u5e93 widget \u65b9\u6cd5\u5e93\u91cc\u9762\uff0c\u53ea\u9700\u8981\u5728\u51fa\u53e3\u6587\u4ef6\u52a0\u4e0a\u7c7b\u88c5\u9970\u5668\uff0c\u5c31\u53ef\u4ee5\u5b9e\u73b0\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u4e86\uff1b # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6ce8\u610f\uff0c\u662f\u7c7b\u88c5\u9970\u5668\u3002 \u5b9e\u4f8b\uff1a # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\n@classmethod\ndef find_dfm_image(cls, *elements, multiple=False, rate=0.9):\n\"\"\"\n \u67e5\u627e\u56fe\u7247 {{elements}}.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e {{rate}} \u7684\u5750\u6807\n :param elements:\n :param multiple:\n :return:\n \"\"\"\nelement = tuple(map(lambda x: f\"{Config.PIC_RES_PATH}/{x}\", elements))\nreturn cls.find_image(*element, multiple=multiple)\n \u8c03\u7528\u65b9\u6cd5\u65f6\uff1a DfmWidget.find_dfm_image(\"dfm_001\")\n \u81ea\u52a8\u8f93\u51fa\u7684\u65e5\u5fd7\uff1a >> x86_64-uos-6: 02/28 17:48:47 | INFO | logger_utils: [find_dfm_image]: \u67e5\u627e\u56fe\u7247 dfm_001.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e 0.9 \u7684\u5750\u6807\n \u52a0\u4e0a\u88c5\u9970\u5668 @log \u4e4b\u540e\uff0c\u65b9\u6cd5\u5c42\u6240\u6709\u7684\u51fd\u6570\uff08\u5305\u62ec\u5b9e\u4f8b\u65b9\u6cd5\u3001\u7c7b\u65b9\u6cd5\u3001\u9759\u6001\u65b9\u6cd5\uff09\u90fd\u4e0d\u9700\u8981\u518d\u5199\u65e5\u5fd7\u4ee3\u7801\uff0c\u6267\u884c\u7684\u65f6\u5019\u4f1a\u81ea\u52a8\u8f93\u51fa\uff0c\u5e76\u4e14\u6240\u6709\u8c03\u7528\u7684\u65b9\u6cd5\u4f1a\u4ee5 allure.step \u7684\u65b9\u5f0f\uff0c\u5c55\u793a\u5728 allure \u62a5\u544a\u4e2d\uff0c\u5728\u62a5\u544a\u4e2d\u66f4\u80fd\u4e00\u76ee\u4e86\u7136\u7684\u770b\u5230\u7528\u4f8b\u6267\u884c\u6b65\u9aa4\u3002 \u3010\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\u3011 \u901a\u8fc7\u89c2\u5bdf\u524d\u9762\u7684\u4f8b\u5b50\uff0c\u7ec6\u5fc3\u7684\u540c\u5b66\u53ef\u80fd\u8fd8\u53d1\u73b0\u4e86\u4e00\u4e2a\u5c0f\u7ec6\u8282\uff1a\u51fd\u6570\u529f\u80fd\u8bf4\u660e\u4e2d\uff0c\u4e24\u5bf9\u5927\u62ec\u53f7\u4e2d\u7684\u5185\u5bb9 {{elements}} \u4f5c\u4e3a\u53d8\u91cf\u8f93\u51fa\u51fa\u6765\u4e86\uff1b \u6ca1\u9519\uff0c\u8fd9\u5c31\u662f\u6211\u4eec\u53c2\u8003Django \u548c jinja2 \u7684\u6a21\u677f\u8bed\u6cd5\u8bbe\u8ba1\u51fa\u7684\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\uff0c\u4f7f\u7528\u65b9\u6cd5\u5f88\u7b80\u5355\uff0c\u7528\u4e24\u5bf9\u5927\u62ec\u53f7\u628a\u51fd\u6570\u7684\u53c2\u6570\u62ec\u8d77\u6765\uff0c\u8fd9\u6837\u5728\u65e5\u5fd7\u8f93\u51fa\u7684\u65f6\u5019\u5c31\u80fd\u628a\u8c03\u7528\u51fd\u6570\u65f6\u53c2\u6570\u7684\u503c\u8f93\u51fa\u51fa\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_7","title":"\u516b\u3001\u73af\u5883\u90e8\u7f72","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_6","title":"1\u3001\u539f\u5219","text":"YouQu \u7684\u73af\u5883\u4f9d\u8d56\u4e00\u76f4\u575a\u6301 2 \u4e2a\u539f\u5219\uff1a \u6700\u5c0f\u73af\u5883\u4f9d\u8d56\u539f\u5219 \u6709\u4e9b\u540c\u5b66\u5199\u4e00\u4e9b\u529f\u80fd\uff0c\u9996\u5148\u60f3\u5230\u7684\u5c31\u662f\u53bb\u641c\u7d22\u5f15\u64ce\u641c\u4e00\u4e0b\uff0c\u770b\u6709\u6ca1\u6709\u73b0\u6210\u7684\u5de5\u5177\u6216\u8005\u4ee3\u7801\u76f4\u63a5\u80fd\u7528\uff0c\u7f8e\u5176\u540d\u66f0\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\uff0c\u522b\u4eba\u5df2\u7ecf\u9020\u597d\u4e86\u8f6e\u5b50\u54b1\u4eec\u5c31\u4e0d\u8981\u91cd\u590d\u53bb\u9020\u4e86\uff0c\u7136\u540e\u4e00\u5207\u4f3c\u4e4e\u90fd\u53d8\u5f97\u90a3\u4e48\u7684\u7406\u6240\u5e94\u5f53\u3002 \u5f53\u7136\u8fd9\u6837\u505a\u65e0\u53ef\u539a\u975e\uff0c\u6211\u76f8\u4fe1\u6709\u8fd9\u6837\u60f3\u6cd5\u5e76\u4e14\u4e00\u76f4\u8df5\u884c\u8fd9\u6837\u505a\u6cd5\u7684\u540c\u5b66\u4e0d\u5728\u5c11\u6570\uff0c\u4f46\u8fd9\u6837\u505a\u6709\u4e00\u4e2a\u5f88\u4e25\u91cd\u7684\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f60\u5199\u4e00\u4e2a\u5927\u578b\u9879\u76ee\u65f6\uff0c\u4f60\u4f1a\u5f15\u5165\u975e\u5e38\u975e\u5e38\u975e\u5e38\u591a\u7684\u4f9d\u8d56\uff0c\u6bd4\u5982\u8981\u505a\u4e2a\u63a5\u53e3\u8bf7\u6c42\u8981\u7528 requests\u3001\u8bfb\u5199\u4e2a\u6570\u636e\u7528 pandas\u3001\u5199\u4e2a\u8868\u683c\u7528 pyopenxl\u3001\u89e3\u6790\u4e2a\u6587\u672c\u8981\u7528\u8fd9\u4e2a\u90a3\u4e2a\u4e09\u65b9\u5e93 ... \u3002 \u6211\u8ba4\u4e3a\u8fd9\u662f\u975e\u5e38\u4e0d\u597d\u7684\u4e60\u60ef\uff0c\u5728\u5b9e\u73b0\u4e00\u4e2a\u529f\u80fd\u7684\u65f6\u5019\uff0c\u9996\u5148\u6211\u4eec\u5e94\u8be5\u53bb\u60f3\u81ea\u5df1\u600e\u4e48\u6837\u53bb\u5b9e\u73b0\uff0c\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff1b \u5982\u679c\u4f60\u4e0d\u4f1a\uff0c\u4f60\u53ef\u4ee5\u53bb\u5b66\u4e60\u4e09\u65b9\u5e93\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u522b\u4eba\u4e09\u65b9\u5e93\u4e5f\u662f\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\u7684\uff0c\u4e3a\u4ec0\u4e48\u54b1\u4eec\u4e0d\u884c\u5462\uff1b\u5982\u679c\u522b\u4eba\u7684\u4f60\u5b9e\u5728\u662f\u770b\u4e0d\u61c2\uff0c\u60f3\u5c3d\u4e00\u5207\u529e\u6cd5\u786e\u5b9e\u505a\u4e0d\u51fa\u6765\uff0c\u90a3\u518d\u8003\u8651\u5f15\u5165\u8fd9\u4e2a\u4e09\u65b9\u5e93\uff0c\u6211\u8ba4\u4e3a\u8fd9\u6837\u662f\u6ca1\u95ee\u9898\u7684\uff0c\u6bd5\u7adf\u54b1\u4eec\u6bb5\u4f4d\u8fd8\u4e0d\u591f\uff0c\u4f46\u5e0c\u671b\u5c06\u6765\u6709\u4e00\u5929\u6211\u4eec\u53ef\u4ee5\u3002 \u8fd9\u6837\u7684\u505a\u6cd5\u624d\u5e94\u8be5\u662f\u201c\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\u201d\u6b63\u786e\u7684\u64cd\u4f5c\u3002\u4e0d\u4f1a\u6ca1\u5173\u7cfb\uff0c\u770b\u770b\u522b\u4eba\u662f\u600e\u4e48\u5b9e\u73b0\u7684\uff0c\u81ea\u5df1\u518d\u6478\u7d22\u7740\u5199\u51fa\u6765\uff0c\u8fd9\u6837\u81ea\u5df1\u624d\u80fd\u6709\u6240\u63d0\u9ad8\uff0c\u4e0d\u7136\u4f60\u5c31\u53ea\u4f1a\u7528\u522b\u4eba\u7684\u4e1c\u897f\uff1b\u90a3\u4e9b\u5632\u7b11\u3001\u6279\u8bc4\u6211\u4eec\u91cd\u590d\u9020\u8f6e\u5b50\u7684\u4eba\uff0c\u5148\u60f3\u60f3\u81ea\u5df1\u4f1a\u9020\u8f6e\u5b50\u5417\u3002 \u672c\u7740\u81ea\u5df1\u5b9e\u73b0\u80fd\u5b9e\u73b0\u7684\u4e00\u5207\u7684\u539f\u5219\uff0cYouQu \u6846\u67b6\u505a\u5230\u4e86\u975e\u5e38\u5c11\u7684\u73af\u5883\u4f9d\u8d56\uff0c\u800c\u4e14\u6211\u4eec\u4ecd\u5728\u4e0d\u65ad\u52aa\u529b\uff0c\u51cf\u5c11\u73af\u5883\u90e8\u7f72\u7684\u4f9d\u8d56\u3002 \u6700\u5c0f\u4ed3\u5e93\u4f53\u79ef\u539f\u5219 \u5927\u6587\u4ef6\u4e0d\u80fd\u4e0a\u4f20\u5230\u5de5\u7a0b\u91cc\u9762\uff0c\u4fdd\u6301\u6574\u4e2a\u5de5\u7a0b\u7684\u8f7b\u91cf\u5316\uff0c\u8fd9\u6837\u5728\u514b\u9686\u4ee3\u7801\u7684\u65f6\u5019\u624d\u80fd\u975e\u5e38\u5feb\u901f\u65b9\u4fbf\u4f7f\u7528\uff0c\u6211\u4eec\u89c1\u8fc7\u4e00\u4e2a AT \u5de5\u7a0b clone \u5927\u5c0f\u8fbe\u5230\u597d\u51e0\u4e2a G\uff0c\u7b80\u76f4\u4e0d\u53ef\u601d\u8bae\u3002 \u5176\u5b9e\u4ee3\u7801\u6587\u4ef6\u7684\u5927\u5c0f\u662f\u5f88\u5c0f\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u7eaf\u5199\u4ee3\u7801\u968f\u4fbf\u5199\u5de5\u7a0b\u4e5f\u4e0d\u4f1a\u592a\u5927\uff0c\u800c\u6587\u6863\uff08\u5305\u542b\u63d2\u56fe\uff09\u7b49\u8d44\u6e90\u5374\u662f\u5f88\u5360\u7a7a\u95f4\u3002 \u56e0\u6b64\u6211\u4eec\u9009\u62e9\u5c06 YouQu \u7684\u6587\u6863\u5de5\u7a0b\u6d89\u53ca\u5230\u7684\u56fe\u7247\u8d44\u6e90\u90fd\u91c7\u7528\u5916\u94fe\u52a0\u8f7d\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_6","title":"2\u3001\u5b89\u88c5","text":"\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u8fd0\u884c env.sh \u5373\u53ef\u3002 bash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_4","title":"3\u3001\u5b9a\u5236\u4f9d\u8d56","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_2","title":"3.1\u3001\u65b0\u589e\u4f9d\u8d56","text":"\u5982\u679c\u5e94\u7528\u5e93\u8fd8\u9700\u8981\u5176\u4ed6 Python \u4f9d\u8d56\u5e93\uff0c\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a requirement.txt \u6587\u4ef6\uff1b autotest_xxx\n\u251c\u2500\u2500 requirement.txt\n\u251c\u2500\u2500 case ...\n \u91cc\u9762\u5199\u5165\u9700\u8981\u5b89\u88c5\u7684\u4e09\u65b9\u4f9d\u8d56\uff0c\u6bd4\u5982\u50cf\u8fd9\u6837\uff1a # requirement.txt\nPyYAML==6.0 # \u6307\u5b9a\u5b89\u88c5\u67d0\u4e2a\u7248\u672c\nrequests # \u672a\u6307\u5b9a\u7248\u672c\u5219\u5b89\u88c5\u6700\u65b0\u7248\n \u5728\u6267\u884c bash env.sh \u65f6\u4f1a\u4e00\u5e76\u5c06\u5176\u5b89\u88c5\u3002 \u5982\u679c\u591a\u4e2a\u5e94\u7528\u5e93\u90fd\u5b58\u5728 requirement.txt \u6587\u4ef6\uff0c\u6267\u884c env.sh \u65f6\u4f1a\u5c06\u591a\u4e2a requirement.txt \u6587\u4ef6\u4e00\u5e76\u52a0\u8f7d\uff1b\u90a3\u4e48\u4e00\u5b9a\u8981\u6ce8\u610f\u591a\u4e2a requirement.txt \u6587\u4ef6\u53ef\u80fd\u5b58\u5728\u76f8\u540c\u7684\u4f9d\u8d56\u88ab\u6307\u5b9a\u5b89\u88c5\u4e0d\u540c\u7248\u672c\u7b49\u7b49\u517c\u5bb9\u6027\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32_1","title":"3.2\u3001\u88c1\u526a\u4f9d\u8d56","text":"\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0c\u53ef\u80fd\u4f60\u53ea\u9700\u8981\u5b89\u88c5\u4e00\u4e9b\u6700\u6700\u57fa\u7840\u7684\u4f9d\u8d56\uff0c\u5176\u4ed6\u7684\u90fd\u4e0d\u9700\u8981\uff0c\u6bd4\u5982\u7eaf\u63a5\u53e3\u81ea\u52a8\u5316\u7684\u9879\u76ee\uff0c\u5b83\u4e0d\u9700\u8981 UI \u81ea\u52a8\u5316\u76f8\u5173\u7684\u4f9d\u8d56\u3002 \u4f60\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\uff0c\u5b58\u653e\u4e00\u4e2a BASICENV \u7684\u666e\u901a\u6587\u4ef6\uff0c\u91cc\u9762\u4e0d\u9700\u8981\u5199\u4efb\u4f55\u5185\u5bb9\uff0c\u8fd9\u6837\u6267\u884c env.sh \u65f6\uff0c\u53ea\u4f1a\u5b89\u88c5\u6700\u57fa\u7840\u7684\u4f9d\u8d56\u3002 autotest_xxx\n\u251c\u2500\u2500 BASICENV # \u53ef\u4ee5\u4f7f\u7528\uff1atouch BASICENV \u521b\u5efa\u6587\u4ef6\n\u251c\u2500\u2500 case ...\n \u57fa\u7840\u4f9d\u8d56\u4ec5\u5b89\u88c5\u4ee5\u4e0b\u51e0\u4e2a\u5305\uff1a pytest # pytest\npytest-rerunfailures # \u5931\u8d25\u91cd\u8dd1\u63d2\u4ef6\npytest-timeout # \u7528\u4f8b\u8d85\u65f6\u63d2\u4ef6\nallure-pytest # \u751f\u6210 allure \u62a5\u544a\u63d2\u4ef6\nallure.deb # allure \u62a5\u544a\u67e5\u770b\u5de5\u5177\n \u88c1\u526a\u4f9d\u8d56 \u548c \u65b0\u589e\u4f9d\u8d56 \u662f\u4e0d\u51b2\u7a81\u7684\uff0c\u53ef\u4ee5\u540c\u65f6\u4f7f\u7528\u3002 \u6b64\u65b9\u6848\u9ed8\u8ba4\u4e3a\u865a\u62df\u73af\u5883\u90e8\u7f72\uff0c\u5982\u679c\u4f60\u60f3\u76f4\u63a5\u90e8\u7f72\u5728\u672c\u673a\u4e0a\uff1a bash env_dev.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_4","title":"4\u3001\u865a\u62df\u5316\u90e8\u7f72","text":"YouQu\u9ed8\u8ba4\u91c7\u7528\u865a\u62df\u5316\u90e8\u5206\uff0c\u865a\u62df\u5316\u73af\u5883\u5b9e\u9645\u5b89\u88c5\u7684\u4f4d\u7f6e\u662f\u5728 $HOME/.local/share/virtualenvs/youqu-oHTM7l7G \u76ee\u5f55\u4e0b youqu-oHTM7l7G \u6b64\u76ee\u5f55\u540d\u79f0\u524d\u9762\u90e8\u5206\u662f\u4f60\u7684\u4ee3\u7801\u6839\u76ee\u5f55\u7684\u540d\u79f0\uff0c\u540e\u9762\u90e8\u5206\u662f\u751f\u6210\u7684\u968f\u673a\u5b57\u7b26\u4e32\uff1b \u540c\u5b66\u4eec\u5728\u8fdc\u7a0b\u673a\u5668\u4e0a\u5b9a\u4f4d\u95ee\u9898\u7684\u65f6\u5019\uff0c\u5982\u679c\u4f7f\u7528 Pycharm \u8c03\u8bd5\uff0c\u5c31\u5c06\u89e3\u91ca\u5668\u6307\u5b9a\u5230\u8fd9\u4e2a\u76ee\u5f55\u7684\u5c31\u884c\u4e86\uff1b \u5f53\u7136\uff0c\u6211\u4eec\u4e5f\u63d0\u4f9b\u4e86\u672c\u673a\u5f00\u53d1\u73af\u5883\u90e8\u7f72\uff1a bash env_dev.sh\n \u5982\u679c\u4f60\u662f\u672c\u5730\u5f00\u53d1\u73af\u5883\u53ef\u4ee5\u7528\u5b83\uff0c\u533a\u522b\u5c31\u662f\u9a71\u52a8\u6267\u884c\u7684\u65f6\u5019\u4f7f\u7528\uff1apython3 manage.py xxx"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_8","title":"\u4e5d\u3001\u5931\u8d25\u5f55\u5c4f","text":"\u5f55\u5c4f\u5176\u5b9e\u662f\u4e00\u79cd\u89c6\u9891\u5f62\u5f0f\u7684\u65e5\u5fd7\uff0c\u56e0\u4e3a\u5f88\u591a\u65f6\u5019\u6211\u4eec\u5728\u67e5\u770b\u65e5\u5fd7\u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u51c6\u786e\u7684\u5b9a\u4f4d\u5230\u7528\u4f8b\u5931\u8d25\u7684\u5177\u4f53\u539f\u56e0\uff0c\u56e0\u6b64\u7528\u4f8b\u7684\u5f55\u5c4f\u80fd\u8ba9\u6211\u4eec\u770b\u5230\u7528\u4f8b\u5728\u6267\u884c\u8fc7\u7a0b\uff1b \u3010\u4f7f\u7528\u65b9\u6cd5\u3011 \u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u5173\u6ce8 2 \u4e2a\u53c2\u6570\uff1b ;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\u3002\n;\u6ce8\u610f\uff0c\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u4e0d\u80fd\u5c0f\u4e8e\u5931\u8d25\u5f55\u5c4f\u6b21\u6570\uff0c\u5373 RERUN >= RECORD_FAILED_CASE\nRECORD_FAILED_CASE = 1\n \u9ed8\u8ba4\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u662f 1 \u6b21\uff1b RECORD_FAILED_CASE = 1 \u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff1b RECORD_FAILED_CASE = 0 \u8868\u793a\u4e0d\u7ba1\u7528\u4f8b\u6210\u529f\u6216\u5931\u8d25\u90fd\u5f55\u5c4f\uff1b \u5f55\u5c4f\u662f\u8981\u5360\u7528\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u7279\u522b\u662f\u5728\u4e00\u4e9b\u914d\u7f6e\u8f83\u4f4e\u7684\u673a\u5668\u4e0a\u4f1a\u5f88\u660e\u663e\uff0c\u6240\u4ee5\u4f60\u9700\u8981\u8003\u8651\u662f\u5426\u6709\u5fc5\u8981\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1b \u4f7f\u7528 manage.py \u6267\u884c\u7528\u4f8b\u9ed8\u8ba4\u8bfb\u53d6\u5230 globalconfig.ini \u91cc\u9762\u7684\u53c2\u6570\uff0c\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report/record \u76ee\u5f55\u4e0b\u4fdd\u5b58\u5931\u8d25\u7528\u4f8b\u7684\u5f55\u5c4f\u548c\u65ad\u8a00\u7684\u90a3\u4e2a\u65f6\u95f4\u70b9\u7684\u622a\u5c4f\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7\u89c6\u9891\u6587\u4ef6\u770b\u5230\u5931\u8d25\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u90fd\u53d1\u751f\u4e86\u4ec0\u4e48\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#wayland","title":"\u5341\u3001Wayland \u9002\u914d","text":"Wayland \u4e0b\u81ea\u52a8\u5316\u4e3b\u8981\u95ee\u9898\u662f X11 \u4e0b\u7684\u952e\u9f20\u64cd\u4f5c\u65b9\u6cd5\u65e0\u6cd5\u4f7f\u7528\uff0c\u6bd4\u5982 Xdotool\u3001 PyAutoGUI\u3001Xwininfo \u7b49\u7b49\uff1b YouQu \u5728 Wayland \u4e0b\u517c\u5bb9\u9002\u914d\uff0cenv.sh \u5728 Wayland \u4e0b\u6267\u884c\u65f6\u4f1a\u5b89\u88c5\u81ea\u7814\u7684\u952e\u9f20\u64cd\u4f5c\u670d\u52a1\uff08\u53ef\u80fd\u5b58\u5728\u4e00\u4e9b\u4f9d\u8d56\u62a5\u9519\uff0c\u6309\u7167\u6ce8\u91ca\u89e3\u51b3\u5373\u53ef\uff09\uff0c\u6846\u67b6\u6838\u5fc3\u5e93\u4e5f\u9488\u5bf9\u6027\u7684\u505a\u4e86\u9002\u914d\uff0c\u4e0a\u5c42\u7528\u4f8b\u5b8c\u5168\u4e0d\u7528\u5173\u5fc3\u673a\u5668\u662fWayland \u8fd8\u662f X11\uff0c\u6846\u67b6\u4f1a\u6839\u636e\u6267\u884c\u65f6\u72b6\u6001\u81ea\u52a8\u5224\u65ad\u8d70\u4e0d\u540c\u7684\u903b\u8f91\uff1b \u7b80\u5355\u8bb2\u5c31\u662f\uff0c\u5e94\u7528\u5e93\u53ea\u9700\u8981\u7ef4\u62a4\u4e00\u5957\u7528\u4f8b\u811a\u672c\u5373\u53ef\u3002 \u3010\u7528\u4f8b\u517c\u5bb9\u3011 \u56e0\u4e3a Wayland \u4e0b\u6709\u4e9b\u5e94\u7528\u7684\u754c\u9762\u663e\u793a\u548c\u529f\u80fd\u672c\u8eab\u5b58\u5728\u4e00\u4e9b\u5dee\u5f02\uff0c\u7528\u4f8b\u5c42\u53ef\u80fd\u9700\u8981\u5bf9\u8fd9\u90e8\u5206\u7528\u4f8b\u505a\u903b\u8f91\u5224\u65ad\uff0c\u4f7f\u7528\u5168\u5c40\u914d\u7f6e\u91cc\u9762\u7684\u5e38\u91cf\u8fdb\u884c\u903b\u8f91\u7f16\u5199\u5373\u53ef\uff1a from setting.globalconfig import GlobalConfig\n# GlobalConfig.IS_WAYLAND \u83b7\u53d6\u5230\u5f53\u524d\u7684\u663e\u793a\u670d\u52a1\u5668\uff08bool\uff09\n# \u5e94\u7528\u5e93 Config \u7ee7\u627f GlobalConfig\nif Config.IS_WAYLAND:\npass\nif Config.IS_X11:\npass\n \u6bd4\u5982\u7528\u4f8b\u91cc\u9762\u5982\u679c\u65ad\u8a00\u7684\u56fe\u7247\u4e0d\u540c\uff1a if Config.IS_WAYLAND:\nself.assert_image_exist(\"wayland_XXX\")\nelse:\nself.assert_image_exist(\"x11_XXX\")\n \u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u811a\u672c\u5728 Wayland \u548c X11 \u4e0b\u90fd\u53ef\u4ee5\u8dd1\uff0cso easy \u662f\u4e0d\u662f\uff1f\u5b8c\u5168\u6ca1\u5fc5\u8981\u4e13\u95e8\u62c9\u65b0\u5206\u652f\u8fdb\u884c Wayland \u9002\u914d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_9","title":"\u5341\u4e00\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_7","title":"1. \u76ee\u5f55\u7ed3\u6784","text":"\u6267\u884c\u65f6\u4f1a\u5728\u6839\u76ee\u5f55\u4e0b\u52a8\u6001\u751f\u6210 report \u76ee\u5f55\uff0c\u6240\u6709\u7684\u62a5\u544a\u76f8\u5173\u7684\u6587\u4ef6\u4f1a\u7edf\u4e00\u5b58\u653e\u5728\u91cc\u9762\uff0c\u793a\u4f8b\uff1a /report\n \u251c\u2500\u2500 allure # allure\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json\n \u251c\u2500\u2500 allure_html # \u751f\u6210\u7684html\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 index.html \u251c\u2500\u2500 allure_back # allure\u62a5\u544a\u5907\u4efd\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 20221108114823\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json\n \u251c\u2500\u2500 json # json\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 result_deepin-music_20221109134736_1081333.json\n \u251c\u2500\u2500 logs # \u65e5\u5fd7\u6587\u4ef6\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 2022-11-10_debug.log \u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-10_error.log\n \u251c\u2500\u2500 record # \u5f55\u5c4f\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-09\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 15\u65f614\u520609\u79d2_test_music_303_2_autotest.mp4\n \u2514\u2500\u2500 xml # xml\u62a5\u544a\n\u2514\u2500\u2500 autotest_deepin_music-20221109134736.xml\n \u9ed8\u8ba4\u60c5\u51b5\u4e0b\u540c\u65f6\u751f\u6210 html\u3001xml\u3001json\u4e09\u79cd\u5f62\u5f0f\u7684\u62a5\u544a\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_7","title":"2. \u5b9a\u5236\u62a5\u544a","text":"\u6211\u4eec\u5bf9 allure \u62a5\u544a\u8fdb\u884c\u4e86\u4e00\u7cfb\u5217\u7684\u5b9a\u5236\uff1a \u5b9a\u5236 logo\u3001title\u3001\u62a5\u544a\u9ed8\u8ba4\u8bed\u8a00\u4e3a\u4e2d\u6587\uff1b \u52a0\u5165\u4e86\u7528\u4f8b\u65ad\u8a00\u5931\u8d25\u65f6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u4ee5\u53ca\u6b64\u65f6\u56fe\u50cf\u5bf9\u6bd4\u7684\u6a21\u677f\u56fe\u7247\uff1b \u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\uff0c\u4f60\u53ef\u4ee5\u5728 html \u62a5\u544a\u4e2d\u76f4\u63a5\u770b\u5f55\u5236\u7684\u89c6\u9891\uff1b \u52a0\u5165\u4e86 IP \u5730\u5740\u3001\u7cfb\u7edf\u4fe1\u606f\u3001\u955c\u50cf\u7248\u672c\u7b49\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_5","title":"3. \u67e5\u770b\u62a5\u544a","text":" \u672c\u5730\u6267\u884c \u5728 report/allure \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u4e00\u5806\u6587\u672c\u6587\u4ef6\uff0c\u8fd9\u4e9b\u662f allure \u63d2\u4ef6\u751f\u6210\u7684\u62a5\u544a\u6e90\u6570\u636e\uff0c\u6211\u4eec\u5728 report/allure_html \u76ee\u5f55\u4e0b\u7ed9\u4f60\u751f\u6210\u4e86 html \u6587\u4ef6\uff0c\u4f46\u662f\u4f60\u4e0d\u80fd\u76f4\u63a5\u901a\u8fc7\u6d4f\u89c8\u5668\u6253\u5f00 index.html \u6587\u4ef6\uff0c\u56e0\u4e3a allure \u7684\u62a5\u544a\u90fd\u662f\u57fa\u4e8e\u5728\u7ebf\u7684\u670d\u52a1\uff0c\u4f60\u5e94\u8be5\u8fd9\u6837\u6253\u5f00\uff1a allure open report/allure_html\n \u4f7f\u7528 manage.py \u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u5728\u7ec8\u7aef\u7684\u6700\u540e\u4e00\u884c\uff0c\u6211\u4eec\u4f1a\u7ed9\u4f60\u8f93\u51fa\u6253\u5f00\u62a5\u544a\u7684\u547d\u4ee4\uff0c\u76f4\u63a5\u590d\u5236\u5b83\u5728\u7ec8\u7aef\u6267\u884c\u5c31\u53ef\u4ee5\u67e5\u770b\u4e86\uff0c\u50cf\u8fd9\u6837\uff1a \u7ec8\u7aef\u6267\u884c\u547d\u4ee4: allure open /tmp/youqu/report/allure_html \u67e5\u770b\u62a5\u544a \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 Pycharm \u91cc\u9762\u627e\u5230 index.html \u6587\u4ef6\uff0c\u7136\u540e\u53f3\u952e\u9009\u62e9\u6d4f\u89c8\u5668\u6253\u5f00\uff0c\u6216\u8005\u4f60\u53ef\u4ee5\u7528\u4e00\u4e2a http \u670d\u52a1\u6253\u5f00\u3002 \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 report/allure \u76ee\u5f55\u4e0b\u67e5\u770b\u62a5\u544a\uff1a allure serve report/allure\n \u8fdc\u7a0b\u6267\u884c \u8fdc\u7a0b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\uff0c\u4f1a\u5c06\u6240\u6709\u8fdc\u7a0b\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u62a5\u544a\u90fd\u6536\u96c6\u5230 report/allure \u76ee\u5f55\u4e0b\uff0c\u5206\u522b\u6309\u7167\u673a\u5668\u7684 IP \u7b49\u5efa\u4e86\u4e0d\u540c\u7684\u76ee\u5f55\uff0c\u4f60\u53ef\u4ee5\u5728\u8fd9\u4e9b\u76ee\u5f55\u91cc\u9762\u53bb\u67e5\u770b\u5bf9\u5e94\u7684\u6d4b\u8bd5\u62a5\u544a\uff0c\u67e5\u770b\u65b9\u6cd5\u548c\u524d\u9762\u672c\u5730\u6267\u884c\u67e5\u770b\u7684\u65b9\u6cd5\u4e00\u6837\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_10","title":"\u5341\u4e8c\u3001\u9759\u6001\u4ee3\u7801\u626b\u63cf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_8","title":"1. \u63d0\u524d\u89e3\u51b3\u4ee3\u7801\u95ee\u9898","text":"\u4e3a\u4e86\u5e2e\u52a9\u5f00\u53d1\u8005\u7edf\u4e00\u4ee3\u7801\u98ce\u683c\uff0cPython \u793e\u533a\u63d0\u51fa\u4e86 PEP8 \u4ee3\u7801\u7f16\u7801\u98ce\u683c\uff0cPython \u5b98\u65b9\u540c\u65f6\u63a8\u51fa\u4e86\u4e00\u4e2a\u68c0\u67e5\u4ee3\u7801\u98ce\u683c\u662f\u5426\u7b26\u5408 PEP8 \u7684\u5de5\u5177\uff0c\u540d\u5b57\u4e5f\u53eb PEP8\u3002 \u4f46\u662f\uff0cPycharm \u91cc\u9762\u7684 PEP8 \u63d2\u4ef6\u5b9e\u9645\u4e0a\u5e76\u4e0d\u80fd\u53d1\u73b0\u5f88\u591a\u4ee3\u7801\u95ee\u9898\uff0c\u8fd9\u4e9b\u95ee\u9898\u5e76\u4e0d\u4f1a\u5728\u8fd0\u884c\u65f6\u62a5\u9519\uff0c\u56e0\u4e3a\u4ece Python \u8bed\u8a00\u89d2\u5ea6\u5e76\u4e0d\u5173\u5fc3\u8fd9\u4e9b\u95ee\u9898\uff0c\u5728 Pycharm \u7f16\u8f91\u5668\u91cc\u9762\u4f7f\u7528\u5feb\u6377\u952e ctrl + alt + L\uff0c\u6709\u4e00\u70b9\u70b9\u683c\u5f0f\u5316\u7684\u6548\u679c\uff0c\u80fd\u89e3\u51b3\u4e00\u4e9b\u7a7a\u683c\u3001\u6362\u884c\u7b49\u5c0f\u95ee\u9898\u3002 \u8fd9\u91cc\u63a8\u8350\u4e00\u4e2a Python \u793e\u533a\u6d41\u884c\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff1a Black\uff0c\u53f7\u79f0\u4e0d\u59a5\u534f\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff0c\u5b83\u68c0\u6d4b\u5230\u4e0d\u7b26\u5408\u89c4\u8303\u7684\u4ee3\u7801\u98ce\u683c\u76f4\u63a5\u5c31\u5e2e\u4f60\u5168\u90e8\u683c\u5f0f\u5316\u597d\uff0c\u5c31\u662f\u8fd9\u4e48\u521a\uff01 \u5b89\u88c5\uff1a sudo pip3 install black \n \u4f7f\u7528\u65b9\u6cd5\uff1a black ${CheckPath}\n \u4f7f\u7528\u8fd9\u4e2a\u5de5\u5177\u683c\u5f0f\u5316\u4e4b\u540e\uff0c\u4ee3\u7801\u4f1a\u88ab\u81ea\u52a8\u8c03\u6574\uff0c\u521a\u5f00\u59cb\u4f60\u53ef\u80fd\u4f1a\u89c9\u5f97\u8c03\u6574\u5f97\u5f88\u5938\u5f20\uff0c\u6ca1\u5173\u7cfb\u575a\u6301\u770b\uff0c\u4e60\u60ef\u4e4b\u540e\uff0c\u4f60\u4f1a\u89c9\u5f97\u5f88\u4f18\u96c5\uff0c\u6ca1\u9519\uff0c\u8fd9\u5c31\u662f Pythonic Code \u7684\u6838\u5fc3\uff0c\u8bf7\u4fdd\u6301\u4f18\u96c5\uff5e\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_8","title":"2. \u4ee3\u7801\u626b\u63cf\u5de5\u5177","text":"\u4f7f\u7528\u6839\u76ee\u5f55\u4e0b pylint.sh \u626b\u63cf\u4ee3\u7801\uff0c\u5728 report \u76ee\u5f55\u4e0b\u67e5\u770b\u4ee3\u7801\u626b\u63cf\u62a5\u544a\uff0c\u5982\u679c\u6709\u4ee3\u7801\u95ee\u9898\u8bf7\u63d0\u524d\u89e3\u51b3\u4e4b\u540e\u518d\u63d0\u4ea4\u3002 \u6b64\u811a\u672c\u5df2\u7ecf\u4f7f\u7528 Python \u793e\u533a\u6700\u6d41\u884c\u7684\u4ee3\u7801\u626b\u63cf\u5de5\u5177 Pylint \u8fdb\u884c\u4ee3\u7801\u626b\u63cf\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a bash pylint.sh\n \u8fd0\u884c\u4e4b\u540e\u4f1a\u63d0\u793a\u4f60\u8981\u626b\u63cf\u7684\u76ee\u5f55\uff0c\u6bd4\u5982\u8f93\u5165 apps \uff0c\u5219\u4f1a\u626b\u63cf apps \u4e0b\u7684\u6240\u6709 Python \u4ee3\u7801\u3002 \u5728 setting/pylintrc.cfg \u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u76f8\u5173\u914d\u7f6e\uff0c\u626b\u63cf\u5b8c\u6210\u4e4b\u540e\u5728 report/pylints \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u626b\u63cf\u62a5\u544a\u3002 \u4ee3\u7801\u63d0\u4ea4\u9700\u901a\u8fc7 git review \u63d0\u4ea4\u5230 gerrit \uff0c\u4eba\u5de5 Code Review \u901a\u8fc7\u4e4b\u540e\u5408\u5165\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_11","title":"\u5341\u4e09\u3001\u63d0\u4ea4\u4ee3\u7801","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_9","title":"1. \u5b89\u88c5\u4f9d\u8d56","text":"sudo apt install git-review\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_9","title":"2. \u63d0\u4ea4\u6a21\u677f","text":"\u5728 ~ \u76ee\u5f55\u4e0b\u65b0\u5efa\u6587\u4ef6\uff0c\u5e76\u547d\u540d\u4e3a gitcommit_template \u5c06\u4ee5\u4e0b\u5185\u5bb9\u5199\u5165\u6587\u4ef6\u5f53\u4e2d\uff1a # commit type :fix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style(\u98ce\u683c\u4fee\u6539)\u3001refactor(\u91cd\u6784)\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test(\u6d4b\u8bd5) + \u7b80\u5355\u63cf\u8ff0. \u9ed8\u8ba4fix,\u6839\u636e\u60c5\u51b5\u4fee\u6539\nfix: \n\n# \u8be6\u7ec6\u8bf4\u660e\u4ee3\u7801\u7684\u6539\u52a8\uff0c\u5305\u542b\u4ee3\u7801\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u4ee5\u53ca\u4e3a\u4ec0\u4e48\u8fd9\u4e48\u505a\uff0c\u53ef\u80fd\u4f1a\u5f71\u54cd\u54ea\u4e9b\u529f\u80fd\u3002\u5bf9\u4e8e\u4ee3\u7801\u7684\u5ba1\u6838\u8005\uff0c\u9700\u8981\u4ece\u8fd9\u6bb5\u63cf\u8ff0\u4e2d\u80fd\u5b8c\u5168\u7406\u89e3\u4ee3\u7801\u4e2d\u6240\u6709\u6539\u52a8\u7684\u5185\u5bb9\nDescription: \n\n# \u5199\u4e00\u6bb5\u9762\u5411\u4e8e\u4ea7\u54c1\u7684\u603b\u7ed3\u6027\u5185\u5bb9\uff0c\u7528\u4e8e\u81ea\u52a8\u751f\u6210crp\u4e0a\u7684changlog\uff0c\u9700\u8981\u6ce8\u610f\u7684\u4e8b\uff0c\u8fd9\u6bb5\u63cf\u8ff0\u5fc5\u987b\u4ece\u4ea7\u54c1\u7684\u89d2\u5ea6\u8003\u8651\u3002\nLog: \n\n# \u5173\u8054pms\u4e0a\u7684bug\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94bug\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4fee\u590dbug\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Bug: \n\n# \u4fee\u590d github issue \n#Issue: \n\n# \u5173\u8054pms\u4e0a\u7684\u4efb\u52a1\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94\u4efb\u52a1\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4efb\u52a1\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Task: \n \u547d\u4ee4\u884c\u6267\u884c: git config --global commit.template ~/gitcommit_template\n \u6b64\u547d\u4ee4\u5c06\u6a21\u677f\u52a0\u5165\u5230 git \u7684\u63d0\u4ea4\u6a21\u677f\u4e2d\u3002 \u540e\u7eed\u63d0\u4ea4\u7684\u65f6\u5019\u9700\u8981\u5173\u6ce8\u4e00\u4e0b\u51e0\u70b9\uff1a commit type \u5bf9\u5e94\u4e0d\u540c\u7684\u4fee\u6539\u7c7b\u578b\uff1afix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style \uff08\u98ce\u683c\u4fee\u6539\uff09\u3001refactor \uff08\u91cd\u6784\uff09\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test \uff08\u6d4b\u8bd5\uff09 commit type \u5192\u53f7\u540e\u9762\u52a0\u7a7a\u683c\u3002 Description \u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u9700\u8981\u8fdb\u884c\u8be6\u7ec6\u8bf4\u660e\uff0c\u6bd4\u5982\u5bf9\u529f\u80fd\u8fdb\u884c\u5927\u6539\u7b49\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_6","title":"3. \u63a8\u9001\u4ee3\u7801","text":"\u9996\u5148\u6dfb\u52a0 commit \u4fe1\u606f git add \u540e\u9762\u52a0\u6587\u4ef6\u540d\u79f0\n git add . # \u8868\u793a\u6dfb\u52a0\u6240\u6709\u6587\u4ef6\n \u4f7f\u7528\u8fd9\u6761\u547d\u4ee4\u6ce8\u610f\u6709\u4e9b\u4e34\u65f6\u6587\u4ef6\u4e0d\u8981\u63d0\u4ea4\u5230\u4ed3\u5e93\u4e86\u3002 git commit -a\n \u4e4b\u540e\u5728 fix: \u540e\u9762\uff08\u6ce8\u610f\u5192\u53f7\u540e\u9762\u5fc5\u987b\u52a0\u7a7a\u683c\uff0c\u4e0d\u7136\u76f4\u63a5-1\uff09\u5199\u672c\u5730\u63d0\u4ea4\u7684 commit \u4fe1\u606f\uff0c\u7136\u540e\u5c31\u53ef\u4ee5\u63d0\u4ea4\u4ee3\u7801\u4e86 git review branch(\u5f53\u524d\u5206\u652f) -r origin\n \u6700\u597d\u4e00\u6b21 commit\uff0c\u4e00\u6b21 git review \uff0c\u7ecf\u5e38\u6709\u540c\u5b66\u5728\u672c\u5730\u75af\u72c2 commit \u6700\u540e git review \u62a5\u9519\u4e0d\u77e5\u9053\u548b\u56de\u4e8b\u513f\u3002 \u82e5\u4e0d\u60f3\u6bcf\u6b21\u63d0\u4ea4\u90fd\u52a0\u4e0a -r \u9009\u9879\uff0c\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a git config --global gitreview.remote origin \u63d0\u4ea4\u4ee3\u7801\uff0c\u76f4\u63a5\u4f7f\u7528 git review branch<\u76ee\u6807\u5206\u652f>\uff0c\u4f8b\u5982 git review master"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git","title":"4. Git\u6807\u7b7e","text":"Git \u6807\u7b7e\u5b9e\u9645\u4e0a\u662f commit \u7684\u4e00\u4e2a\u522b\u540d\uff0c\u4e3b\u8981\u7528\u4e8e\u7ba1\u7406\u5386\u53f2\u7248\u672c\u3002 \u60f3\u8c61\u4e00\u4e0b\u9886\u5bfc\u8ba9\u4f60\u628a\u4e4b\u524d\u7684\u67d0\u4e2a\u7248\u672c\u7684\u4ee3\u7801\u62c9\u51fa\u6765\u8dd1\uff0c\u4f60\u662f\u4e0d\u662f\u4e56\u4e56\u7684\u53bb\u628a\u6240\u6709\u63d0\u4ea4\u8bb0\u5f55\u62c9\u51fa\u6765\u627e\uff0c\u7136\u540e\u627e\u5230\u90a3\u4e2a\u54c8\u5e0c\u503c\uff0c\u901a\u8fc7\u54c8\u5e0c\u503c\u6765\u68c0\u51fa\u4ee3\u7801\u3002 \u8fd9\u4e00\u5957\u64cd\u4f5c\u4e0b\u6765\u662f\u4e0d\u662f\u5f88\u9ebb\u70e6\uff0c\u8d39\u65f6\u95f4\u8fd8\u4e0d\u4e00\u5b9a\u80fd\u627e\u5f97\u5230\uff0c\u6ca1\u4eba\u80fd\u8bb0\u4f4f\u6bcf\u4e2a\u63d0\u4ea4\u54c8\u5e0c\u503c\u4ee5\u53ca\u8fd9\u6b21\u63d0\u4ea4\u90fd\u6539\u4e86\u54ea\u4e9b\u4ee3\u7801\u3002 \u56e0\u6b64\u7ed9\u63d0\u4ea4\u6253\u4e2a\u6807\u7b7e\uff0c\u5c31\u662f\u628a\u54c8\u5e0c\u503c\u8f6c\u6362\u6210\u4eba\u7c7b\u80fd\u7406\u89e3\u7684\u8bed\u8a00\uff0c\u6bd4\u5982 v1.0\uff0c\u5c31\u53ef\u4ee5\u76f4\u63a5\u901a\u8fc7\u6807\u7b7e\u627e\u5230\u5bf9\u5e94\u7684\u63d0\u4ea4\u3002 \u65b0\u5efa\u6807\u7b7e git tag -a <tagname>\n \u56de\u8f66\u4e4b\u540e\uff0cGit \u4f1a\u6253\u5f00\u4f60\u7684\u7f16\u8f91\u5668\uff0c\u8ba9\u4f60\u5199\u4e00\u53e5\u6807\u7b7e\u6ce8\u89e3\uff0c\u5c31\u50cf\u4f60\u7ed9\u63d0\u4ea4\u5199\u6ce8\u89e3\u4e00\u6837\u3002 \u67e5\u770b\u6240\u6709\u6807\u7b7e git tag -l\n# git tag \u4e5f\u884c\n \u5220\u9664\u6807\u7b7e git tag -d <tagname>\n \u63a8\u9001\u6807\u7b7e\u81f3\u8fdc\u7a0b git push \u547d\u4ee4\u5e76\u4e0d\u4f1a\u4f20\u9001\u6807\u7b7e\u5230\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\uff0c\u5fc5\u987b\u663e\u5f0f\u5730\u63a8\u9001\u6807\u7b7e\u3002 git push origin <tagname>\n \u63a8\u9001\u6240\u6709\u4e0d\u5728\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\u7684\u6807\u7b7e git push origin --tag\n \u5220\u9664\u8fdc\u7a0b\u6807\u7b7e git push origin :refs/tag/<tagname>\n \u540e\u671f\u6253\u6807\u7b7e \u5148\u7528 git log --pretty=oneline \u67e5\u8be2\u63d0\u4ea4\u8bb0\u5f55\uff0c\u83b7\u53d6\u6821\u9a8c\u7801\u3002 git tag -a <tagname> 9fceb02(\u6821\u9a8c\u7801)\n \u68c0\u51fa\u6807\u7b7e git checkout <tagname>\n \u6b64\u65f6\uff0c\u4ed3\u5e93\u4f1a\u5904\u4e8e\u201c\u5206\u79bb\u5934\u6307\u9488\uff08detached HEAD\uff09\u201d\u7684\u72b6\u6001\u3002 \u5728\u201c\u5206\u79bb\u5934\u6307\u9488\u201d\u72b6\u6001\u4e0b\uff0c\u5982\u679c\u4f60\u505a\u4e86\u67d0\u4e9b\u66f4\u6539\u7136\u540e\u63d0\u4ea4\u5b83\u4eec\uff0c\u6807\u7b7e\u4e0d\u4f1a\u53d1\u751f\u53d8\u5316\uff0c \u4f46\u4f60\u7684\u65b0\u63d0\u4ea4\u5c06\u4e0d\u5c5e\u4e8e\u4efb\u4f55\u5206\u652f\uff0c\u5e76\u4e14\u5c06\u65e0\u6cd5\u8bbf\u95ee\uff0c\u9664\u975e\u901a\u8fc7\u786e\u5207\u7684\u63d0\u4ea4\u54c8\u5e0c\u624d\u80fd\u8bbf\u95ee\u3002 \u56e0\u6b64\uff0c\u5982\u679c\u4f60\u9700\u8981\u8fdb\u884c\u66f4\u6539\uff0c\u6bd4\u5982\u4f60\u8981\u4fee\u590d\u65e7\u7248\u672c\u4e2d\u7684\u9519\u8bef\uff0c\u90a3\u4e48\u901a\u5e38\u9700\u8981\u521b\u5efa\u4e00\u4e2a\u65b0\u5206\u652f\uff1a git checkout -b <NewBranchName> <tagname>\n \u65b0\u5206\u652f\u4e0a\u53ef\u4ee5\u8fdb\u884c\u63d0\u4ea4\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_12","title":"\u5341\u56db\u3001\u5e38\u89c1\u95ee\u9898","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_10","title":"1. \u63d0\u4ea4\u4ee3\u7801\u65f6\u63d0\u793a\u90ae\u7bb1\u6216\u8005\u540d\u79f0\u4e0d\u5bf9","text":"\u91cd\u65b0\u914d\u7f6e\u90ae\u7bb1\u6216\u8005\u540d\u79f0\uff0c\u7136\u540e\u91cd\u7f6e\u751f\u6548\uff1a git commit --amend --reset-author\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_10","title":"2. \u600e\u4e48\u56de\u6eda\u5230\u4e4b\u524d\u7684\u7248\u672c","text":"(1)\u67e5\u8be2\u5386\u53f2\u63d0\u4ea4\u8bb0\u5f55 git log\n \u627e\u5230\u4f60\u8981\u56de\u6eda\u7684\u7248\u672c\uff0c\u590d\u5236 hash \u503c\u3002 \u6ce8\u610f\uff1a\u662f commit \u7a7a\u683c\u4e4b\u540e\u7684 hash \u503c\uff0c\u4e4b\u524d\u6709\u540c\u5b66\u590d\u5236\u7684 Change-Id: \u8fd9\u6837\u80af\u5b9a\u62a5\u9519\u3002 (2)\u56de\u6eda\u7248\u672c\uff0c\u4e0d\u6e05\u9664\u4ee3\u7801 git reset --soft ${hash}\n (3)\u56de\u6eda\u7248\u672c\uff0c\u6e05\u9664\u4ee3\u7801\uff0c\u614e\u7528\u54c8 git reset --hard ${hash}\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-f-s-e","title":"3. \u6d4b\u8bd5\u62a5\u544a\u91cc\u9762 F S . E \u662f\u4ec0\u4e48\u610f\u601d","text":"F \u8868\u793a\u5931\u8d25\uff0c. \uff08\u70b9\uff09\u8868\u793a\u901a\u8fc7\uff0cS \u8868\u793a\u8df3\u8fc7\uff0cE \u8868\u793a error \u6709\u62a5\u9519"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git-status","title":"4. \u89e3\u51b3 git status \u4e2d\u6587\u663e\u793a\u7684\u95ee\u9898","text":"git config --global core.quotePath false\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5-apps","title":"5. apps \u76ee\u5f55\u4e0b\u989c\u8272\u6709\u4e9b\u662f\u9ec4\u8272\u7684","text":"\u5728 Pycharm \u4e2d apps \u76ee\u5f55\u4e0b\u5e94\u7528\u5e93\u6587\u4ef6\u662f\u9ec4\u8272\u7684\uff0c\u7f16\u8f91\u5668\u8bc6\u522b\u4e0d\u5230\u4ee3\u7801\u65b0\u589e\u548c\u4fee\u6539\uff1b \u7531\u4e8e\u793e\u533a\u7248 Pycharm \u4e0d\u80fd\u52a8\u6001\u8bc6\u522b\u591a\u4ed3\u5e93\uff0c\u9700\u8981\u5728 setting \u91cc\u9762\u624b\u52a8\u6ce8\u518c\uff0c\u64cd\u4f5c\u6b65\u9aa4\uff1a File \u2014> Settings \u2014> Version Control \u2014> \u70b9 + \u53f7 \u2014> Directory \u9009\u4e2d\u5e94\u7528\u5e93\u5de5\u7a0b\u76ee\u5f55 \u2014> VCS \u9009\u4e2d Git \u2014> Apply \u5982\u6b64\u5c31\u53ef\u4ee5\u4e86\u3002 \u4e13\u4e1a\u7248 Pycharm \u4e0d\u5b58\u5728\u8fd9\u4e2a\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#6-envsh-r","title":"6. \u6267\u884c env.sh \u62a5\u9519 $'\\r':\u672a\u627e\u5230\u547d\u4ee4","text":"\u51fa\u73b0\u8fd9\u4e2a\u95ee\u9898\u4f60\u5e94\u8be5\u662f\u5728 windows \u4e0a\u6253\u5f00\u6216\u7f16\u8f91\u8fc7 env.sh \u811a\u672c\uff0cwindows\u4e0b\u7684\u6362\u884c\u662f\u56de\u8f66\u7b26+\u6362\u884c\u7b26\uff0c\u4e5f\u5c31\u662f\\r\\n\uff0c\u800c Linxu \u4e0b\u662f\u6362\u884c\u7b26 \\n\uff0cLinux \u4e0b\u4e0d\u8bc6\u522b \\r\uff0c\u56e0\u6b64\u62a5\u9519\u3002 \u89e3\u51b3\u65b9\u6848\uff1a # \u5c06 \\r \u66ff\u6362\u4e3a\u7a7a\nsudo sed -i 's/\\r//' env.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#7","title":"7.\u600e\u6837\u4e3a\u5355\u72ec\u67d0\u4e00\u6761\u7528\u4f8b\u914d\u7f6e\u6267\u884c\u8d85\u65f6\u65f6\u95f4","text":"\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u5982\u4e0b\uff1a @pytest.mark.timeout(300) # \u5355\u4f4d\u79d2\ndef test_xxx_001():\npass\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#8-youqu","title":"8. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u6240\u6709\u4ee3\u7801\uff0c\u5305\u542b\u5b50\u4ed3\u5e93","text":"\u524d\u7f6e\u6761\u4ef6\uff1a\u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 # \u7b2c\u4e00\u6b21\u5b58\u50a8\u5bc6\u7801\uff0c\u63d0\u4f9b\u540e\u9762\u62c9\u4ee3\u7801(gerrit: ldap\u8d26\u53f7\u548c\u5bc6\u7801\uff0cgit\u62c9\u53d6\u7b2c\u4e00\u6b21\u8f93\u5165\u4fdd\u5b58\uff0c\u540e\u9762\u76f4\u63a5\u4f7f\u7528)\ngit config --global credential.helper store\n\n# \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\uff0c\u5e76\u9012\u5f52\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\" --recursive\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#9-youqu","title":"9. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\u6307\u5b9a\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u524d\u7f6e\u6761\u4ef6\uff1a \u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 \u5df2\u5b58\u50a8\u8bbf\u95ee\u5bc6\u7801 # \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\"\n# \u6307\u5b9a\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ncd youqu\ngit submodule update --init apps/autotest_xxx_xxx\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#10-youqu","title":"10. \u5982\u4f55\u66f4\u65b0 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\uff0c\u6240\u6709\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u66f4\u65b0\u6240\u6709\u5b50\u4ed3\u5e93\u4ee3\u7801 cd youqu\ngit pull & git submodule foreach git pull\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#11-youqu-master-detached-head","title":"11. \u5982\u4f55\u4fee\u590d YouQu \u6240\u6709\u5b50\u4ed3\u5e93 master \u5206\u652f\u6e38\u79bb\u5934\uff08detached head\uff09","text":"\u4fee\u590d\u6240\u6709\u5b50\u4ed3\u5e93\u9ed8\u8ba4master \u5206\u652f\u6e38\u79bb\u5934 cd youqu\ngit submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/","title":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212 \u5206\u7c7b\uff1a/ \u67b6\u6784\u5e08\uff1a/ \u76ee\u6807\uff1a \u5e94\u7528 AT \u67b6\u6784\u5de5\u7a0b\u5316\uff0c\u53c2\u8003\u6027\u80fd\u81ea\u52a8\u5316\u5de5\u7a0b\u5b8c\u6210\u5de5\u7a0b\u5316\u6539\u9020\u3002 \u5e94\u7528\u95f4\u7528\u4f8b\u89e3\u8026\uff0c\u89e3\u9664\u6240\u6709\u4ea4\u53c9\u8c03\u7528\u7684\u65b9\u6cd5\uff0c\u5404\u5e94\u7528\u80fd\u8ddf\u968f\u81ea\u8eab\u8fed\u4ee3\u5468\u671f\u72ec\u7acb\u7ef4\u62a4 AT \u7528\u4f8b\u3002 \u5b8c\u6210\u516c\u5171\u65b9\u6cd5\u7684\u62bd\u53d6\u6574\u5408\uff0c\u5f62\u6210\u4e00\u5957\u72ec\u7acb\u4e8e\u5e94\u7528\u95f4\u7684\u516c\u5171\u65b9\u6cd5\u5e93\uff0c\u5404\u5e94\u7528\u65b9\u6cd5\u91cc\u9762\u4e0d\u5b58\u5728\u88ab\u591a\u4e2a\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\u3002 \u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u4e3a\u5c06\u6765\u9002\u914d\u66f4\u591a\u7684 AT \u8fd0\u7528\u573a\u666f\u63d0\u4f9b\u652f\u6491\uff0c\u539f\u5219\u4e0a\u53ef\u5b9e\u73b0\u65e0\u9650\u6269\u5c55\uff0c\u5728\u6bcf\u65e5\u6784\u5efa\u548c\u6301\u7eed\u96c6\u6210\u6d41\u7a0b\u843d\u5730\u4f7f\u7528\u3002 \u4ee3\u7801\u89c4\u8303\u95ee\u9898\u6e05\u96f6\uff0c\u7b26\u5408 Shell Check\u3001Pylint\u3001\u7cfb\u7edf\u90e8\u76f8\u5173\u7f16\u7801\u89c4\u8303\u8981\u6c42\u3002 \u610f\u4e49\uff1a \u7edf\u4e00\u6210\u7814 AT \u67b6\u6784\u8bbe\u8ba1\u601d\u8def\uff0c\u6d88\u9664 AT \u4ee3\u7801\u5b9e\u73b0\u548c\u7ef4\u62a4\u4e0a\u53ef\u80fd\u51fa\u73b0\u7684\u5206\u6b67\uff0c\u6539\u5584\u5386\u53f2 AT \u65e0\u5de5\u7a0b\u5316\u8bbe\u8ba1\u7684\u7f3a\u9677\uff0c\u63d0\u9ad8\u67b6\u6784\u4e13\u4e1a\u6027\u3002 \u5404\u5e94\u7528 AT \u4ee3\u7801\u76f8\u4e92\u72ec\u7acb\uff0c\u5951\u5408\u5e94\u7528\u72ec\u7acb\u53d1\u5e03\u7279\u6027\uff0c\u53ef\u652f\u6301\u8fed\u4ee3\u671f\u95f4\u72ec\u7acb\u65b0\u589e\u3001\u7ef4\u62a4\u548c\u6267\u884c\u3002 \u65b9\u6cd5\u8c03\u7528\u903b\u8f91\u5f97\u5230\u7b80\u5316\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u66f4\u9ad8\u6548\uff1b\u516c\u5171\u5e93\u62bd\u53d6\uff0c\u51cf\u5c11\u65b9\u6cd5\u91cd\u590d\u7f16\u5199\uff0c\u63d0\u9ad8\u4ee3\u7801\u5229\u7528\u7387\uff1b\u5e73\u5747\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u4ece40\u5206\u949f\u964d\u4f4e\u81f330\u5206\u949f\uff0c\u65e5\u4ea7\u51fa\u7528\u4f8b\u4ece12\u6761/\u5929\u63d0\u5347\u81f316\u6761/\u5929\u3002 \u53ef\u7075\u6d3b\u652f\u6491\u4e0d\u540c\u7684\u81ea\u52a8\u5316\u8fd0\u7528\u573a\u666f\uff0c\u5982 CI\u3001\u5192\u70df\u6d4b\u8bd5\u3001\u96c6\u6210\u6d4b\u8bd5\u3001\u56de\u5f52\u6d4b\u8bd5\u3001\u4e13\u9879\u6d4b\u8bd5\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_2","title":"\u4e00\u3001\u80cc\u666f\u4ecb\u7ecd","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1","title":"1\u3001\u73b0\u6709\u67b6\u6784\u4ecb\u7ecd","text":"\u73b0\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u6574\u4f53\u5206\u4e3a\u4e09\u5c42\uff1a\u7528\u4f8b\u5c42\uff08\u4e1a\u52a1\u903b\u8f91\u5c42\uff09\u3001\u4e2d\u95f4\u5c42\uff08\u5143\u7d20\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff09\u3001\u6838\u5fc3\u5c42\uff08\u5e95\u5c42\u529f\u80fd\u5e93\u5c42\uff09\u3002 \u7528\u4f8b\u5c42\uff1a\u5373\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4e13\u6ce8\u4e8e\u4e1a\u52a1\u529f\u80fd\u903b\u8f91\uff0c\u4e0d\u5173\u5fc3\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\uff1b \u4e2d\u95f4\u5c42\uff1a\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff0c\u6bcf\u4e2a\u65b9\u6cd5\u5747\u5bf9\u5e94\u4e00\u4e2a\u5143\u7d20\u7684\u4e00\u4e2a\u5177\u4f53\u64cd\u4f5c\uff0c\u4e5f\u53ef\u4ee5\u662f\u591a\u4e2a\u64cd\u4f5c\u7684\u7ec4\u5408\u64cd\u4f5c\uff0c\u4e2d\u95f4\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u7528\u4f8b\u5c42\uff0c\u5177\u6709\u53ef\u6269\u5c55\u6027\u548c\u590d\u7528\u6027\uff1b \u6838\u5fc3\u5c42\uff1a\u4e3b\u8981\u5c01\u88c5\u7684\u5e95\u5c42\u529f\u80fd\u5b9e\u73b0\uff0c\u6b64\u5c42\u5728\u6846\u67b6\u4e2d\u63d0\u4f9b\u4e00\u4e9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u529f\u80fd\u6a21\u5757\u76f8\u5bf9\u72ec\u7acb\uff0c\u6838\u5fc3\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u64cd\u4f5c\u5c42\uff0c\u6bd4\u5982\uff1a\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7 UI \u5750\u6807\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u952e\u9f20\u64cd\u4f5c\u7684\u57fa\u7840\u65b9\u64cd\u4f5c\u6a21\u5757\u3001Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757\u3001\u6587\u4ef6\u7684\u589e\u5220\u6539\u67e5\u64cd\u4f5c\u6a21\u5757\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2","title":"2\u3001\u81ea\u52a8\u5316\u7684\u5e94\u7528","text":"2.1\u3001CI \u6d41\u7a0b \u6bcf\u65e5\u6784\u5efa\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u7814\u53d1\u6bcf\u65e5\u63d0\u4ea4\u7684\u4ee3\u7801\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u73ed\u4e4b\u540e\u4f1a\u5c06\u5404\u5e94\u7528\u8fdb\u884c\u6253\u5305\uff0c\u7136\u540e\u5728\u6d4b\u8bd5\u673a\u4e0a\u5b89\u88c5\u66f4\u65b0 deb \u5305\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u5e94\u7528\u63d0\u4ea4\u96c6\u6210\u7684\u7248\u672c\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u8f7d\u6700\u65b0\u7684 ISO \u8fdb\u884c PXE \u90e8\u7f72\uff0c\u7136\u540e\u6d4b\u8bd5\u673a\u5b89\u88c5\u6700\u65b0\u7684\u955c\u50cf\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 2.2\u3001\u9a8c\u6536\u6d4b\u8bd5 \u5728\u5404\u9a8c\u6536\u8282\u70b9\u8fdb\u884c\u81ea\u52a8\u5316\u9a8c\u6536\uff0c\u76ee\u524d\u7684\u7b56\u7565\u662f\u5168\u7528\u4f8b\u8986\u76d6\u5168\u67b6\u6784\u3002 2.3\u3001\u56de\u5f52\u6d4b\u8bd5 \u56de\u5f52\u6d4b\u8bd5\u4eca\u5e74\u89c4\u5212\u5efa\u8bbe\u4e2d\uff0c\u65e8\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u6267\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\uff0c\u51cf\u5c11\u529f\u80fd\u6d4b\u8bd5\u7684\u91cd\u590d\u52b3\u52a8\u529b\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3","title":"3\u3001\u5b58\u5728\u7684\u95ee\u9898","text":" \u5404\u5e94\u7528\u4e4b\u95f4\u5b58\u5728\u8026\u5408 \u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u521d\u671f\uff0c\u6240\u6709\u5e94\u7528\u662f\u6574\u4f53\u53d1\u5e03\uff0c\u6211\u4eec\u662f\u5c06\u6240\u6709\u5e94\u7528\u770b\u6210\u662f\u4e00\u4e2a\u6574\u4f53\uff0c\u5404\u5e94\u7528\u4f5c\u4e3a\u5176\u4e2d\u7684\u4e00\u4e2a\u6a21\u5757\uff0c\u6240\u4ee5\u5b58\u5728\u5e94\u7528\u95f4\u65b9\u6cd5\u4ea4\u53c9\u8c03\u7528\u7684\u95ee\u9898\uff0c\u8fd9\u6837\u4ece\u6700\u521d\u7684\u8bbe\u8ba1\u6765\u8bb2\u786e\u5b9e\u80fd\u591f\u51cf\u5c11\u91cd\u590d\u4ee3\u7801\u7684\u7f16\u5199\u3002\u4f46\u662f\u73b0\u5728\u5e94\u7528\u8d70\u72ec\u7acb\u53d1\u5e03\uff0c\u5404\u5e94\u7528\u90fd\u6709\u81ea\u5df1\u7684\u8fed\u4ee3\u8282\u594f\uff0c\u5728\u65b0\u9700\u6c42\u5feb\u901f\u53d8\u5316\u7684\u8fc7\u7a0b\u4e2d\uff0c\u81ea\u52a8\u5316\u7ef4\u62a4\u53d8\u5f97\u5f02\u5e38\u56f0\u96be\uff0c\u539f\u56e0\u5c31\u662f\u81ea\u52a8\u5316\u9879\u76ee\u91cc\u9762\u5404\u4e2a\u5e94\u7528\u7684\u6709\u6bd4\u8f83\u591a\u7684\u8026\u5408\u5173\u7cfb\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u8fdb\u884c\u89e3\u8026\uff0c\u4ee5\u9002\u5e94\u5e94\u7528\u4e0d\u540c\u7684\u8fed\u4ee3\u5468\u671f\u3002 \u65e0\u6cd5\u7cbe\u51c6\u7684\u5212\u5206\u7528\u4f8b\u8303\u56f4 \u7528\u4f8b\u6267\u884c\u7684\u8303\u56f4\u4e0d\u591f\u7cbe\u51c6\uff0c\u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u4e3b\u8981\u901a\u8fc7\u7528\u4f8b\u7684\u5173\u952e\u8bcd core\uff08\u6838\u5fc3\uff09\u6765\u533a\u5206\u7528\u4f8b\u662f\u5426\u4e3a\u6838\u5fc3\u7528\u4f8b\uff0c\u4f46\u662f\u8fd9\u6837\u7684\u533a\u5206\u592a\u5bbd\u6cdb\u4e86\uff0c\u4e0d\u80fd\u9002\u5e94\u81ea\u52a8\u5316\u6d4b\u8bd5\u5728\u591a\u573a\u666f\u4e0b\u7684\u5e94\u7528\u3002\u5f88\u591a\u573a\u666f\u4e0b\u6211\u4eec\u8fd8\u9700\u8981\u6839\u636e\u7528\u4f8b\u7684\u7b49\u7ea7\u3001\u7528\u4f8b\u7684\u7c7b\u578b\u3001\u7528\u4f8b\u6765\u6e90\u7b49\u7b49\uff0c\u4e0d\u540c\u7684\u7ef4\u5ea6\u6765\u6311\u9009\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u5173\u952e\u5b57\u9700\u8981\u4eba\u5de5\u4e00\u6761\u6761\u7684\u6539\uff0c\u8d39\u65f6\u8d39\u529b\uff0c\u800c\u4e14\u4e0d\u597d\u7ef4\u62a4\u3002 \u53d7\u65b0\u9700\u6c42\u5f71\u54cd\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u597d\u7ef4\u62a4 \u76ee\u524d\u9700\u8981\u8df3\u8fc7\u7684\u7528\u4f8b\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684\u7528\u4f8b\u811a\u672c\u91cc\u9762\uff0c\u6dfb\u52a0\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\uff0c\u540e\u7eed\u89e3\u9664\u8df3\u8fc7\u7684\u65f6\u5019\u53c8\u9700\u8981\u627e\u5230\u8fd9\u6761\u811a\u672c\uff0c\u5220\u6389\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\u3002\u5728\u8df3\u8fc7\u7528\u4f8b\u8f83\u591a\u7684\u60c5\u51b5\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u96be\u5ea6\u3002 \u7f16\u5199\u7528\u4f8b\u65f6\u903b\u8f91\u6bd4\u8f83\u590d\u6742\uff0c\u9700\u8981\u8c03\u7528\u591a\u4e2a\u5e94\u7528\u7684\u65b9\u6cd5\u6a21\u5757\u3002 \u6846\u67b6\u6269\u5c55\u6027\u4e0d\u8db3\uff0c\u65e0\u6cd5\u6574\u5408\u6027\u80fd\u81ea\u52a8\u5316\u3001\u538b\u6d4b\u81ea\u52a8\u5316\u3001\u5b89\u5168\u81ea\u52a8\u5316\u7b49\u4e13\u9879\u6d4b\u8bd5\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_3","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u4e3a\u89e3\u51b3\u73b0\u6709\u95ee\u9898\uff0c\u9002\u5e94\u4e0d\u65ad\u4e30\u5bcc\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u66f4\u597d\u7684\u53d1\u6325\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4f5c\u7528\uff0c\u9700\u8981\u5bf9\u81ea\u52a8\u5316\u67b6\u6784\u53ca\u5404\u529f\u80fd\u6a21\u5757\u8fdb\u884c\u91cd\u65b0\u8bbe\u8ba1\u89c4\u5212\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_1","title":"1\u3001\u67b6\u6784\u8bbe\u8ba1","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_1","title":"2\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u6846\u67b6\u7684\u8fd0\u884c\u903b\u8f91\uff1a\u901a\u8fc7\u6838\u5fc3\u5c42\u63d0\u4f9b\u4e00\u4e2a\u57fa\u7840\u80fd\u529b\uff0c\u4e1a\u52a1\u5c42\u6839\u636e\u5b9e\u9645\u4e1a\u52a1\u9700\u6c42\uff08\u6d4b\u8bd5\u7528\u4f8b\uff09\u52a8\u6001\u52a0\u8f7d\u6838\u5fc3\u5c42\uff0c\u6267\u884c\u5165\u53e3\u52a0\u8f7d\u76f8\u5e94\u7684\u7528\u4f8b\u96c6\u5e76\u63a7\u5236\u6267\u884c\uff0c\u5e94\u7528\u5c42\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u9700\u6c42\uff0c\u901a\u8fc7\u76f8\u5e94\u7684\u914d\u7f6e\u9879\u8fdb\u884c\u914d\u7f6e\uff0c\u4ece\u800c\u89e6\u53d1\u81ea\u52a8\u5316\u6d4b\u8bd5\u4efb\u52a1\u3002 \u6838\u5fc3\u5c42\uff1a\u57fa\u672c\u4fdd\u6301\u4e0d\u53d8\uff0c\u90e8\u5206\u6a21\u5757\u4f1a\u6d89\u53ca\u5230\u65b0\u529f\u80fd\u5f00\u53d1\uff0c\u6838\u5fc3\u5c42\u5404\u529f\u80fd\u6a21\u5757\u4fdd\u6301\u72ec\u7acb\u6027\uff0c\u63d0\u4f9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u4f9b\u4e0a\u5c42\u8c03\u7528\uff1b \u5e95\u5c42\u6838\u5fc3\u6a21\u5757\u5305\u62ec\uff1a \u56fe\u50cf\u8bc6\u522b\u6a21\u5757 UI \u5b9a\u4f4d\u6a21\u5757 Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757 \u5c5e\u6027\u5b9a\u4f4d\u6a21\u5757 \u65e5\u5fd7\u6a21\u5757 \u952e\u9f20\u64cd\u4f5c\u6a21\u5757 \u6587\u4ef6\u64cd\u4f5c\u6a21\u5757 \u5f55\u5c4f\u6a21\u5757 \u81ea\u5b9a\u4e49\u65ad\u8a00\u6a21\u5757 \u7528\u4f8b\u6267\u884c\u6a21\u5757 PXE \u88c5\u673a\u6a21\u5757 \u952e\u9f20\u4fe1\u53f7\u6a21\u62df\u6a21\u5757 OCR \u6a21\u5757 \u4e1a\u52a1\u5c42\uff1a\u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e94\u7528\u5185\u5305\u542b\u591a\u4e2a\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5982\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7b49\uff0c\u540e\u7eed\u53ef\u4ee5\u6839\u636e\u9700\u8981\u5ac1\u63a5\u8fdb\u6765\u3002\u5176\u4e2d\u529f\u80fd\u6d4b\u8bd5\u8bbe\u8ba1\u601d\u8def\uff1a \u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e76\u5c06\u6d4b\u8bd5\u6570\u636e\u548c\u6d4b\u8bd5\u8d44\u6e90\u6574\u5408\u8fdb\u6765\uff0c\u589e\u52a0\u7528\u4f8b\u6807\u7b7e csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ed9\u6bcf\u6761\u7528\u4f8b\u6253\u6807\u7b7e\u3002 \u5404\u6807\u7b7e\u6240\u4f7f\u7528\u5bf9\u5e94\u7684\u5b57\u6bb5\u540d\u79f0\uff0c\u4f7f\u7528 csv \u6587\u4ef6\u7ef4\u62a4\u7528\u4f8b\u4e0e\u6807\u7b7e\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u5bf9\u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u53ef\u4ee5\u7ec4\u5408\u5176\u4e2d\u7684\u6807\u7b7e\u800c\u4ece\u9a71\u52a8\u5bf9\u5e94\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\uff0c\u517c\u5bb9\u73b0\u6709\u7528\u4f8b\u6807\u7b7e\uff0c\u4e14\u652f\u6301\u7528\u4f8b\u6807\u7b7e\u53ef\u6269\u5c55\uff1b \u4f7f\u7528 csv \u683c\u5f0f\u6587\u4ef6\u53ef\u4ee5\u65b9\u4fbf\u7684\u4f7f\u7528 Excel \u8868\u683c\u6253\u5f00\u8fdb\u884c\u7f16\u8f91\uff0c\u540c\u65f6\u7531\u4e8e csv \u6587\u4ef6\u5b9e\u9645\u662f\u4ee5\u90fd\u597d\u5206\u9694\u7684\u6587\u672c\u6587\u4ef6\uff0c\u4ee3\u7801\u4e2d\u53ef\u4ee5\u5728\u4e0d\u4f9d\u8d56\u4e09\u65b9\u5e93\u7684\u60c5\u51b5\u4e0b\u65b9\u4fbf\u5feb\u901f\u7684\u89e3\u6790\u5b83\uff0c\u53ef\u64cd\u4f5c\u6027\u548c\u53ef\u7ef4\u62a4\u6027\u8f83\u9ad8\u3002 \u5404\u4e2a\u5e94\u7528\u4e4b\u95f4\uff0c\u7528\u4f8b\u3001\u65b9\u6cd5\u3001\u6807\u7b7e\u548c\u8d44\u6e90\u90fd\u662f\u76f8\u4e92\u72ec\u7acb\u7684\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u7528\u4f8b\u65f6\u53ea\u9700\u8981\u81ea\u5df1\u5e94\u7528\u4e0b\u7684\u65b9\u6cd5\u548c\u516c\u5171\u5e93\u5373\u53ef\u3002 \u7ed3\u6784\u4e3e\u4f8b\uff1a .\n\u251c\u2500\u2500 apps\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_album # \u5e94\u7528\u540d (\u7528\u4e0b\u5212\u7ebf\u8fde\u63a5\u662f Python \u7f16\u7801\u89c4\u8303)\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_assert # \u65ad\u8a00\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_function_tag.csv # \u7528\u4f8b\u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 asan_cases # \u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases # \u529f\u80fd\u6d4b\u8bd5\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 res # \u6d4b\u8bd5\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config # \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_widget # \u5e94\u7528\u81ea\u5df1\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_widget # \u65b9\u6cd5\u57fa\u7c7b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 other_widget # \u8c03\u7528\u5176\u4ed6\u5e94\u7528\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_camera\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases\n\u2502\u00a0\u00a0 \u2502\u00a0 ...\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 public_widget # \u516c\u5171\u65b9\u6cd5\u5e93\n\u251c\u2500\u2500 config # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n...\n config \u914d\u7f6e\u6a21\u5757\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u76f8\u5e94\u914d\u7f6e\uff0c\u6d4b\u8bd5\u540c\u5b66\u53ef\u4ee5\u6839\u636e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5728 config \u91cc\u9762\u8fdb\u884c\u914d\u7f6e\u3002 \u5168\u5c40\u914d\u7f6e\uff1a \u6267\u884c\u4e00\u4e2a\u6216\u591a\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff1a\u5728 pattern \u91cc\u9762\u5199\u5165\u5e94\u7528\u5305\u540d\uff0c\u591a\u4e2a\u5e94\u7528\u4e4b\u95f4\u7528 or \u8fde\u63a5\uff0c\u5982 deepin-music or deepin-movie\uff1b \u5192\u70df\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a smoke\uff1b \u96c6\u6210\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a core \uff1b \u5168\u91cf\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u4e3a\u7a7a\u5373\u53ef\uff1b \u901a\u8fc7 tags \u7684\u914d\u7f6e\u6bd4\u8f83\u7075\u6d3b\uff0c\u540e\u9762\u6807\u7b7e\u5316\u7ba1\u7406\u7ae0\u8282\u4f1a\u8bb2\u5230\uff0c\u652f\u6301\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u7075\u6d3b\u914d\u7f6e\u3002 \u6307\u5b9a\u67d0\u53f0\u673a\u5668\u5728\u6307\u5b9a\u955c\u50cf\u7248\u672c\u4e0a\u6267\u884c\u7528\u4f8b\uff1a\u5728 IP \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a IP\uff0c\u5e76\u5728 URL \u91cc\u9762\u586b\u5165\u955c\u50cf\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u6846\u67b6\u4f1a\u8c03\u7528 PXE \u8fdb\u884c\u81ea\u52a8\u88c5\u673a\uff0c\u88c5\u673a\u5b8c\u4e4b\u540e\u81ea\u52a8\u5f00\u59cb\u6267\u884c\u914d\u7f6e\u7684\u6d4b\u8bd5\u7528\u4f8b\u3002 \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\uff1a \u6bcf\u4e2a\u5e94\u7528\u5185\u90e8\u4f1a\u6709\u4e00\u4e2a\u5355\u72ec\u7684\u914d\u7f6e\u6a21\u5757\uff0c\u4f1a\u5305\u542b\u4e00\u4e9b\u672c\u5e94\u7528\u7684\u6d4b\u8bd5\u8d44\u6e90\u7684\u8def\u5f84\u3001\u6267\u884c\u7528\u4f8b\u7684\u6807\u7b7e\u914d\u7f6e\u7b49\u7b49\uff0c\u5982\u679c\u5728\u5c40\u90e8\u914d\u7f6e\u91cc\u9762\u914d\u7f6e\u4e86\u7528\u4f8b\u6267\u884c\u6807\u7b7e\uff0c\u800c\u5916\u5c42 runner \u51fa\u6ca1\u6709\u6307\u5b9a\u6267\u884c\u6807\u7b7e\uff0c\u5219\u5728\u6267\u884c\u65f6\u53ea\u4f1a\u6267\u884c\u5c40\u90e8\u914d\u7f6e\u5df2\u914d\u7f6e\u7684\uff0c\u82e5\u5916\u5c42 runner \u4e5f\u914d\u7f6e\u4e86\u6267\u884c\u6807\u7b7e\uff0c\u5219\u4f1a\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u7528\u4f8b\u3002 \u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u914d\u7f6e\u90fd\u5728\u540c\u4e00\u4e2a\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\uff0cpy \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684\u7c7b\uff0cini \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684 option\u3002 \u5168\u5c40\u914d\u7f6e\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u7b56\u7565\u5982\u4e0b\uff1a \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5c40\u90e8\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5e94\u7528\u5c42\uff1arunner \u662f\u6d4b\u8bd5\u6267\u884c\u7684\u5165\u53e3\uff0c\u5b83\u4f1a\u6839\u636e\u914d\u7f6e\u91cc\u9762\u7684\u914d\u7f6e\u9879\uff0c\u8fdb\u884c\u7528\u4f8b\u7684\u52a0\u8f7d\u548c\u6267\u884c\u3002\u5b83\u63d0\u4f9b\u63a5\u53e3\u7ed9\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\uff0c\u5e73\u53f0\u4e0a\u7684\u6307\u4ee4\u5b9e\u9645\u4e0a\u90fd\u662f\u901a\u8fc7\u4e0b\u53d1\u7ed9 runner\uff0c\u7136\u540e\u7531 runner \u6765\u6267\u884c\u76f8\u5e94\u7684\u6d4b\u8bd5\u3002 \u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u662f\u4e00\u4e2a\u524d\u7aef\u7cfb\u7edf\uff0c\u53ef\u4ee5\u8fdb\u884c\u6d4b\u8bd5\u673a\u7ba1\u7406\u3001\u81ea\u52a8\u5b89\u88c5\u955c\u50cf\u3001\u81ea\u52a8\u5b89\u88c5\u6307\u5b9a\u5e94\u7528\u7248\u672c\u3001\u8fdb\u884c\u6d4b\u8bd5\u7528\u4f8b\u8303\u56f4\u9009\u62e9\u3001\u7528\u4f8b\u89e6\u53d1\u6267\u884c\u63a7\u5236\u3001\u7ed3\u679c\u5c55\u793a\u8f93\u51fa\u7b49\u3002 \u4e00\u4e2a\u5e94\u7528\u7684\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\u90fd\u53ef\u4ee5\u5355\u72ec\u89e6\u53d1\u3002 \u517c\u5bb9\u6027\u6d4b\u8bd5\u4e3b\u8981\u901a\u8fc7 PXE \u670d\u52a1\u5668\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u88c5\u673a\uff0c\u7136\u540e\u914d\u5408 AT \u8fdb\u884c\u6d4b\u8bd5\uff0c\u53ef\u4ee5\u5b9e\u73b0\u4e0d\u540c\u7cfb\u7edf\u7248\u672c\u3001\u4e0d\u540c\u5e94\u7528\u7248\u672c\u73af\u5883\u4e0a\u90fd\u53ef\u4ee5\u8fdb\u884c\u81ea\u52a8\u5316\u7684 AT \u6267\u884c\uff0c\u63d0\u9ad8\u517c\u5bb9\u6027\u6d4b\u8bd5\u6548\u7387\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_4","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_2","title":"1\u3001\u7528\u4f8b\u89e3\u8026","text":"\u5b58\u5728\u8026\u5408\u5173\u7cfb\u7684\u65b9\u6cd5\uff1a\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u88ab\u5916\u90e8\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\uff0c\u5219\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u8026\u5408\u5173\u7cfb\u3002 1.1\u3001\u901a\u8fc7\u7f16\u8f91\u5668 Find Usages \u67e5\u770b\u6bcf\u4e2a\u65b9\u6cd5\u88ab\u8c03\u7528\u7684\u8def\u5f84\u548c\u88ab\u8c03\u7528\u6b21\u6570\uff1b 1.2\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 1 \u4e2a\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728\u5916\u90e8\u5e94\u7528\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1b 1.3\u3001\u64cd\u4f5c\u5c42\u6587\u4ef6\u540d\u5747\u4ee5 widget \u7ed3\u5c3e\uff0c\u7c7b\u540d\u4ee5 Widget \u7ed3\u5c3e\uff0c\u5982\uff1a\u6587\u4ef6\u540d music_widget.py \uff1a class MusicWidget:\n\"\"\"\u97f3\u4e50\u7684\u64cd\u4f5c\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_2","title":"2\u3001\u516c\u5171\u5e93\u5efa\u8bbe","text":"2.1\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 2 \u4e2a\u53ca\u4ee5\u4e0a\u7684\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728 public_widget \u76ee\u5f55\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1bpublic_widget \u5373\u4e3a\u516c\u5171\u65b9\u6cd5\u5e93\uff1b 2.2\u3001\u5728\u7528\u4f8b\u5c42\u4fee\u6539\u7528\u4f8b\u4e2d\u7c7b\u7684\u5bfc\u5165\u8def\u5f84\uff0c\u5c5e\u4e8e\u516c\u5171\u65b9\u6cd5\u7684\u5219\u8c03\u7528 public_widget \u4e2d\u7684\u7c7b\uff0c\u5916\u90e8\u5e94\u7528\u7684\u64cd\u4f5c\u65b9\u6cd5\uff0c\u5219\u8c03\u7528\u672c\u5e94\u7528\u76ee\u5f55\u4e0b\u91cd\u5199\u7684\u5916\u90e8\u5e94\u7528\u65b9\u6cd5\u3002 \u6bd4\u5982\uff1a\u51e0\u4e4e\u6240\u6709\u591a\u5a92\u4f53\u5e94\u7528\u90fd\u9700\u8981\u901a\u8fc7\u6587\u7ba1\u52a0\u8f7d\u8d44\u6e90\uff0c\u8c03\u8d77\u7684\u6587\u7ba1\u5bf9\u8bdd\u6846\u5b9e\u9645\u4e3a dde-desktop\uff0c\u56e0\u6b64\u5c06 desktop_widget.py \u653e\u5230 public_widget \u91cc\u9762\uff1a class DdeDesktopPublicWidget:\n\"\"\"\u516c\u5171-\u684c\u9762\u7684\u64cd\u4f5c\u65b9\u6cd5\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3_1","title":"3\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406","text":"3.1\u3001\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1a\u5bf9\u5e94 core\u3001smoke\uff0c\u6216\u4e3a\u7a7a\uff1b \u7528\u4f8b\u6765\u6e90\uff1a\u5bf9\u5e94 PMS \u7528\u4f8b\u6765\u6e90\uff0c\u5206\u522b\u7528 acp1\u3001acp2\u3001acp3\u3001acp4 \u8868\u793a\u3002 acp1 \uff1a\u4e1a\u52a1\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5199\u7684\u7528\u4f8b\uff0c\u88ab\u7528\u4e8e\u9a8c\u6536\u6d4b\u8bd5\u7684\uff1b acp2 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5f15\u5165\u7684\u4ea7\u54c1\u9a8c\u6536\u6d4b\u8bc4\u90e8\u7684\u7528\u4f8b\uff1b acp3 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u6839\u636e\u4ea7\u54c1\u9700\u6c42\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\uff1b acp4 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u901a\u8fc7\u793e\u533a\u3001\u8bba\u575b\u7528\u6237\u53cd\u9988\u95ee\u9898\u603b\u7ed3\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\u3002 \u4e3e\u4f8b\uff1a \u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u7528\u4f8b\u6765\u6e90 001 L1 core acp1 \u6807\u7b7e\u91c7\u7528\u679a\u4e3e\u7684\u65b9\u5f0f\u8fdb\u884c\u4ee3\u53f7\u7ba1\u7406\u65b9\u4fbf\u7ba1\u7406\u4ee5\u53ca\u540e\u7eed\u6269\u5c55\u3002 3.2\u3001\u5728\u6bcf\u4e2a\u5e94\u7528\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u7b2c\u4e00\u5217\u4e3a\u7528\u4f8b\u7684 ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ba1\u7406\u6a21\u5757\u5185\u7684\u7528\u4f8b\u6807\u7b7e\u3002\u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 3.3\u3001\u5bf9\u7167 PMS \u4e0a\u7528\u4f8b\u7b49\u7ea7\u3001\u7528\u4f8b\u7c7b\u578b\u548c\u7528\u4f8b\u6765\u6e90\uff0c\u6807\u8bb0\u6240\u6709\u5df2\u5b9e\u73b0\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u540e\u7eed\u7f16\u5199\u65b0\u589e\u81ea\u52a8\u5316\u7528\u4f8b\u65f6\uff0c\u6bcf\u5199\u4e00\u6761\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684 csv \u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u6b64\u6761\u7528\u4f8b\u7684\u6807\u7b7e\u3002 3.4\u3001\u8df3\u8fc7\u7528\u4f8b\u6807\u7b7e\u5316 \u73b0\u6709\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a\uff1a \u4e3e\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u8bb0\u4e3a \u201cskip-\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u8bb0\uff0c\u5982\u679c\u5df2\u7ecf\u6807\u8bb0\u4e86\u8df3\u8fc7\u539f\u56e0\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u8bb0\u4e3a SKIPED\uff0c\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\u3002 \u6240\u6709\u7684\u6807\u7b7e\u5728 docs \u76ee\u5f55\u4e0b\u4f1a\u6709\u4e00\u4e2a\u6587\u6863\uff0c\u6587\u6863\u6682\u5b9a\u540d\u79f0\u4e3a\uff1atags_info.md\uff0c\u7528\u4e8e\u8bf4\u660e\u73b0\u5728\u5df2\u7ecf\u4f7f\u7528\u5230\u7684\u6807\u7b7e\uff0c\u4ee5\u53ca\u8fd9\u4e9b\u6807\u7b7e\u7684\u89e3\u91ca\u548c\u7528\u6cd5\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#4","title":"4\u3001\u7528\u4f8b\u6267\u884c","text":"4.1\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u7684\u9a71\u52a8\u6267\u884c\u903b\u8f91\u529f\u80fd\u5b9e\u73b0 \u5f00\u53d1\u6839\u636e\u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\u91cc\u9762\u7684\u7528\u4f8b\u6807\u7b7e\u6267\u884c\u5bf9\u5e94\u7528\u4f8b\u7684\u529f\u80fd\uff0c\u80fd\u652f\u6301\u591a\u4e2a\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u6267\u884c\u5165\u53e3\u80fd\u968f\u610f\u901a\u8fc7\u7528\u4f8b\u6807\u7b7e\u6307\u5b9a\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002 \u7528\u4f8b\u6807\u7b7e\u7684\u9a71\u52a8\u65b9\u5f0f\u5fc5\u987b\u80fd\u652f\u6301\u6807\u7b7e\u7684\u6269\u5c55\uff0c\u672a\u6765\u968f\u7740\u4e1a\u52a1\u7684\u53d8\u5316\u53ef\u80fd\u9700\u8981\u589e\u52a0\u5404\u79cd\u5404\u6837\u7684\u6807\u7b7e\u3002 4.2\u3001\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u6267\u884c \u529f\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u3001\u6027\u80fd\u6d4b\u8bd5\u7b49\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u662f\u5206\u5f00\u6267\u884c\u7684\uff0c\u4e5f\u5c31\u662f\u5728\u4e00\u6b21\u6267\u884c\u4e2d\uff0c\u53ea\u80fd\u6267\u884c\u5176\u4e2d\u4e00\u79cd\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5177\u4f53\u8981\u6267\u884c\u54ea\u4e00\u79cd\u540c\u6837\u901a\u8fc7\u53c2\u6570\u6765\u63a7\u5236\u3002 4.3\u3001\u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c \u7531\u4e8e\u6d4b\u8bd5\u673a\u8d44\u6e90\u6709\u9650\uff0c\u968f\u7740\u81ea\u52a8\u5316\u7528\u4f8b\u6570\u91cf\u7684\u589e\u52a0\uff0cCI \u6267\u884c\u65f6\u95f4\u4f1a\u8d8a\u6765\u8d8a\u957f\u3002 \u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c\u7684\u529f\u80fd\uff1a \u540c\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\u5206\u6563\u5230\u4e0d\u540c\u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u4e0a\u6267\u884c\uff0c\u7f29\u77ed\u6267\u884c\u603b\u65f6\u95f4\uff1b \u7b2c\u4e8c\u5929\u8dd1\u7684\u65f6\u5019\u540c\u4e00\u4e2a\u673a\u5668\u4e0a\u4f1a\u6267\u884c\u6628\u5929\u6ca1\u6709\u6267\u884c\u5230\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u6267\u884c\u540c\u7406\uff1b \u53ef\u4ee5\u5b9e\u73b0\u5728\u5168\u67b6\u6784\u6d4b\u8bd5\u673a\u4e0a\u8f6e\u6d41\u6267\u884c\u7528\u4f8b\uff0c\u65e2\u80fd\u4fdd\u8bc1\u6267\u884c\u4e86\u6240\u6709\u7684\u7528\u4f8b\uff0c\u53c8\u80fd\u5728\u8d44\u6e90\u6709\u9650\u7684\u60c5\u51b5\u4e0b\u8986\u76d6\u4e86\u6240\u6709\u7684\u67b6\u6784\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#5","title":"5\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0","text":"5.1\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u4f5c\u4e3a\u524d\u7aef\u754c\u9762\u7cfb\u7edf\uff0c\u901a\u8fc7\u9875\u9762\u4e0a\u7684\u4e00\u4e9b\u529f\u80fd\u9009\u9879\u8fdb\u884c\u5bf9\u5e94\u6d4b\u8bd5\u4efb\u52a1\u7684\u7ba1\u7406\u6216\u89e6\u53d1\uff0c\u4e1a\u5185\u6bd4\u8f83\u6d41\u884c\u7684\u5b9e\u73b0\u65b9\u6848\u662f\u4f7f\u7528 Vue + DRF \u5b9e\u73b0\u4e00\u4e2a\u524d\u540e\u7aef\u5206\u79bb\u7684\u7cfb\u7edf\u3002 \u6d4b\u8bd5\u5e73\u53f0\u53ef\u80fd\u4f1a\u6d89\u53ca\u5230\u7684\u6a21\u5757\u6709\uff1a\u6d4b\u8bd5\u673a\u8d44\u6e90\u7ba1\u7406\u6a21\u5757\u3001\u7528\u4f8b\u6267\u884c\u63a7\u5236\u6a21\u5757\u3001\u7ed3\u679c\u5c55\u793a\u6a21\u5757\u3001PXE \u955c\u50cf\u5b89\u88c5\u6a21\u5757\u7b49\u3002 \u7528\u6237\uff08\u6d4b\u8bd5\u3001\u7814\u53d1\u540c\u5b66\u7b49\uff09\u53ef\u4ee5\u914d\u7f6e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5982\u6267\u884c\u54ea\u4e2a\u5e94\u7528\u3001\u6267\u884c\u7528\u4f8b\u7684\u8303\u56f4\u3001\u5728\u54ea\u53f0\u673a\u5668\u4e0a\u6267\u884c\u3001\u955c\u50cf\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u5e94\u7528\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u6267\u884c\u65f6\u95f4\u3002 5.2\u3001\u6267\u884c\u5165\u53e3 runner \u63d0\u4f9b\u7ed9\u6d4b\u8bd5\u5e73\u53f0\u7684\u63a5\u53e3\u5305\u62ec\uff1a\u7528\u4f8b\u6267\u884c\u63a5\u53e3\u3001\u7ed3\u679c\u8fd4\u56de\u63a5\u53e3\u3001\u955c\u50cf\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u955c\u50cf\u5b89\u88c5\u63a5\u53e3\u3001\u5e94\u7528\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u5e94\u7528\u5b89\u88c5\u66f4\u65b0\u63a5\u53e3\u7b49\u3002 \u524d\u7aef\u5e73\u53f0\u76ee\u524d\u8fd8\u6ca1\u6709\u592a\u591a\u8be6\u7ec6\u7684\u65b9\u6848\uff0c\u672c\u6b21\u8bbe\u8ba1\u4e3b\u8981\u96c6\u4e2d\u5728\u540e\u7aef\u8fd9\u90e8\u5206\u67b6\u6784\u7684\u8bbe\u8ba1\u4e0a\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_5","title":"\u56db\u3001\u5b9e\u65bd\u8ba1\u5212","text":"\u8fd1\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u6587\u7ba1\u4ee3\u7801\u89e3\u8026 2022/3/28 2022/4/8 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u56fe\u5f62\u56fe\u50cf\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u97f3\u89c6\u9891\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5168\u5c40\u641c\u7d22\u4ee3\u7801\u89e3\u8026 2022/4/25 2022/4/26 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u516c\u5171\u5e93\u5efa\u8bbe 2022/4/27 2022/5/5 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5c01\u88c5\u7684\u65b9\u6cd5\u6574\u7406\u6210\u4e00\u4e2a\u8868 2022/5/6 2022/5/10 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7528\u4f8b\u6807\u7b7e\u5206\u7c7b\u8bc4\u4f30 2022/5/11 2022/5/11 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u6807\u7b7e\u5316\u6267\u884c\u9a71\u52a8\u7a0b\u5e8f\u7f16\u5199 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u9700\u5b9e\u73b0\u81ea\u52a8\u89e3\u6790 csv \u8868\u683c\u4e2d\u7684\u7528\u4f8b\u7f16\u53f7 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u722c\u866b\u811a\u672c\uff0c\u722c\u53d6 pms \u4e0a\u7528\u4f8b\u7684\u6807\u7b7e 2022/5/11 2022/5/13 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u5b9a\u65f6\u81ea\u52a8\u7ef4\u62a4\u672c\u5730 csv \u6587\u4ef6\u811a\u672c 2022/5/11 2022/5/20 \u4e2d\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u76ee\u5f55\u7ed3\u6784\u8c03\u6574 2022/5/20 2022/6/2 \u5b8c\u6210\u5168\u5c40\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u5177\u4f53\u65b9\u6848\u548c\u903b\u8f91\u5b9e\u73b0 2022/6/6 2022/6/17 \u9759\u6001\u626b\u63cf\u95ee\u9898\u6e05\u96f6 2022/6/20 2022/7/1 \u5b8c\u6210\u65b0\u6846\u67b6\u4f7f\u7528\u57f9\u8bad 2022/7/4 2022/7/11 \u843d\u5730\u8fd0\u884c 2022/7/12 2022/7/20 \u5e95\u5c42\u5e93\u7528\u9014\u8bf4\u660e\u6587\u6863\u7f16\u5199 2022/7/21 2022/7/28"}]} \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz index 8ffaebc1..e0b7bbfc 100644 Binary files a/sitemap.xml.gz and b/sitemap.xml.gz differ diff --git "a/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" "b/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" index 25f669d5..97100667 100644 --- "a/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" +++ "b/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs @@ -1215,8 +1215,7 @@ 智能化功能测试# Attribution :chengdu Test Team # Date :2021/08/20 -此方案仍在演进中 -此方案仍在演进中 +此方案仍在演进中 仓库地址:https://gitlabcd.uniontech.com/autotest/cd-desktop-aitest 一、方案概述¶ 基于深度学习智能识别应用的元素控件,用于在自动化测试操作过程中的元素定位以及判断结果时的断言处理;自动化测试过程中,测试机上的画面通过采集盒传输到服务器上,服务器对视频画面进行智能识别后,服务器智能判断用例是否执行成功,然后对测试机下发下一步操作指令,测试机接受并执行下一步操作。 diff --git "a/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" "b/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" index cdf9ccde..06c9e9a5 100644 --- "a/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" +++ "b/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" @@ -95,7 +95,7 @@ - + @@ -226,7 +226,7 @@ - + YouQu Docs diff --git "a/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" "b/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" index 121b4507..72123668 100644 --- "a/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" +++ "b/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs @@ -752,6 +752,13 @@ + + + + + 4、虚拟化部署 + + @@ -1661,6 +1668,13 @@ + + + + + 4、虚拟化部署 + + @@ -2604,18 +2618,12 @@ 1、标签说明流水线使用指导; 跳过原因:skip-XXX,用于控制用例是否执行; 确认修复:fixed-XXX,用于标记用例的修复状态(后面详细讲解用法); @@ -2629,26 +2637,30 @@ 1、标签说明PMS用例ID 用例级别 用例类型 +设备类型 +用例来源 上线对象 测试级别 跳过原因 确认修复 -废弃用例 -... +废弃用例 +... -001 +679537 679537 L1 FUNC +PPL + CICD C1 skip-XXX fixed-XXX -removed-已废弃 -... +removed-已废弃 +... @@ -2656,7 +2668,7 @@ 2、操作步骤csv 的文件名。 例如: -相册的用例文件为 test_album_xxx.py,xxx 表示任意三位数字代表用例序号,此时 csv 文件名就应为 album.csv; +相册的用例文件为 test_album_xxx.py,xxx 表示用例的ID(也可以是自定义的数字代表用例序号),此时 csv 文件名就应为 album.csv; 对于用例规模比较大的应用,比如文件管理器,建议分模块,每个模块建立一个 csv 文件,所有 csv 文件建议放在一个 tags 目录下。 是否分模块维护 csv 取决于应用的用例复杂度,同时我们应该充分考虑后期的可维护性,csv 文件太多了也是一个很糟糕的事情。 @@ -2677,7 +2689,7 @@ 3.1.1、固定跳过001 +679537 ... skip-受到某新需求影响 @@ -2742,7 +2754,7 @@ 3.2、确认修复001 +679537 ... skip-受到某新需求影响 fixed-已修复 @@ -2787,7 +2799,7 @@ 3.3、废弃用例4、设计思路¶ 上面介绍 Pytest 框架提供的标签功能 mark,使用时需要为每一个用例添加标签装饰器,则操作复杂,可维护性差,其根本问题就是标签分散在每一条用例的装饰器上,难以集中维护;于是乎将所有标签使用 csv 文件进行集中管理,并通过 Pytest 的钩子函数,读取 csv 文件,动态添加标签到用中。 5、CSV文件格式¶ -此配置文件需要维护大量的标签数据,且要方便能使用Excel打开进行编辑查看,更重要的是我们不想引入三方依赖,CSV 文件几乎是唯一能满足所有的要求的文件格式。 +此配置文件需要维护大量的标签数据,且要方便能使用 Excel 打开进行编辑查看,更重要的是我们不想引入三方依赖,CSV 文件几乎是唯一能满足所有的要求的文件格式。 七、日志系统¶ 1、背景¶ 基于 YouQu 自动化测试框架操作方法封装写法,通常是这样的:类里面一个函数只包含一个操作或多次调用的一系列可合并的操作; @@ -2888,7 +2900,7 @@ 1、原则 大文件不能上传到工程里面,保持整个工程的轻量化,这样在克隆代码的时候才能非常快速方便使用,我们见过一个 AT 工程 clone 大小达到好几个 G,简直不可思议。 其实代码文件的大小是很小的,也就是说,纯写代码随便写工程也不会太大,而文档(包含插图)等资源却是很占空间。 -因此我们选择将 YouQu 的文档工程单独迁出到独立的仓库 youqu-docs 。 +因此我们选择将 YouQu 的文档工程涉及到的图片资源都采用外链加载; 2、安装¶ 项目根目录下运行 env.sh 即可。 bash env.sh @@ -2930,17 +2942,25 @@ 3.2、裁剪依赖bash env_dev.sh +4、虚拟化部署¶ +YouQu默认采用虚拟化部分,虚拟化环境实际安装的位置是在 $HOME/.local/share/virtualenvs/youqu-oHTM7l7G 目录下 +youqu-oHTM7l7G 此目录名称前面部分是你的代码根目录的名称,后面部分是生成的随机字符串; +同学们在远程机器上定位问题的时候,如果使用 Pycharm 调试,就将解释器指定到这个目录的就行了; +当然,我们也提供了本机开发环境部署: +bash env_dev.sh + +如果你是本地开发环境可以用它,区别就是驱动执行的时候使用:python3 manage.py xxx 九、失败录屏¶ 录屏其实是一种视频形式的日志,因为很多时候我们在查看日志之后仍然无法准确的定位到用例失败的具体原因,因此用例的录屏能让我们看到用例在执行过程; 【使用方法】 在 globalconfig.ini 里面配置关注 2 个参数; -;失败用例重跑次数 -RERUN = 1 - -;失败录屏从第几次开始录制视频。 -;比如 RECORD_FAILED_CASE = 1 ,表示用例第1次执行失败之后开始录屏。 -;注意,用例失败重跑的次数不能小于失败录屏次数,即 RERUN >= RECORD_FAILED_CASE -RECORD_FAILED_CASE = 1 +;失败用例重跑次数 +RERUN = 1 + +;失败录屏从第几次开始录制视频。 +;比如 RECORD_FAILED_CASE = 1 ,表示用例第1次执行失败之后开始录屏。 +;注意,用例失败重跑的次数不能小于失败录屏次数,即 RERUN >= RECORD_FAILED_CASE +RECORD_FAILED_CASE = 1 默认失败重跑的次数是 1 次; RECORD_FAILED_CASE = 1 表示用例第1次执行失败之后开始录屏; @@ -2953,48 +2973,48 @@ 十、Wayland 适配简单讲就是,应用库只需要维护一套用例脚本即可。 【用例兼容】 因为 Wayland 下有些应用的界面显示和功能本身存在一些差异,用例层可能需要对这部分用例做逻辑判断,使用全局配置里面的常量进行逻辑编写即可: -from setting.globalconfig import GlobalConfig - -# GlobalConfig.IS_WAYLAND 获取到当前的显示服务器(bool) -# 应用库 Config 继承 GlobalConfig -if Config.IS_WAYLAND: - pass -if Config.IS_X11: - pass +from setting.globalconfig import GlobalConfig + +# GlobalConfig.IS_WAYLAND 获取到当前的显示服务器(bool) +# 应用库 Config 继承 GlobalConfig +if Config.IS_WAYLAND: + pass +if Config.IS_X11: + pass 比如用例里面如果断言的图片不同: -if Config.IS_WAYLAND: - self.assert_image_exist("wayland_XXX") -else: - self.assert_image_exist("x11_XXX") +if Config.IS_WAYLAND: + self.assert_image_exist("wayland_XXX") +else: + self.assert_image_exist("x11_XXX") 这样这条用例脚本在 Wayland 和 X11 下都可以跑,so easy 是不是?完全没必要专门拉新分支进行 Wayland 适配。 十一、测试报告¶ 1. 目录结构¶ 执行时会在根目录下动态生成 report 目录,所有的报告相关的文件会统一存放在里面,示例: -/report - ├── allure # allure报告 - │ ├── ... - │ └── ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json - ├── allure_html # 生成的html报告 - │ ├── ... - │ └── index.html - ├── allure_back # allure报告备份 - │ └── 20221108114823 - │ ├── ... - │ └── f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json - ├── json # json报告 - │ ├── ... - │ └── result_deepin-music_20221109134736_1081333.json - ├── logs # 日志文件 - │ ├── 2022-11-10_debug.log - │ └── 2022-11-10_error.log - ├── record # 录屏 - │ └── 2022-11-09 - │ ├── ... - │ └── 15时14分09秒_test_music_303_2_autotest.mp4 - └── xml # xml报告 - └── autotest_deepin_music-20221109134736.xml +/report + ├── allure # allure报告 + │ ├── ... + │ └── ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json + ├── allure_html # 生成的html报告 + │ ├── ... + │ └── index.html + ├── allure_back # allure报告备份 + │ └── 20221108114823 + │ ├── ... + │ └── f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json + ├── json # json报告 + │ ├── ... + │ └── result_deepin-music_20221109134736_1081333.json + ├── logs # 日志文件 + │ ├── 2022-11-10_debug.log + │ └── 2022-11-10_error.log + ├── record # 录屏 + │ └── 2022-11-09 + │ ├── ... + │ └── 15时14分09秒_test_music_303_2_autotest.mp4 + └── xml # xml报告 + └── autotest_deepin_music-20221109134736.xml 默认情况下同时生成 html、xml、json三种形式的报告。 2. 定制报告¶ @@ -3011,14 +3031,14 @@ 3. 查看报告allure open report/allure_html +allure open report/allure_html 使用 manage.py 执行完之后,在终端的最后一行,我们会给你输出打开报告的命令,直接复制它在终端执行就可以查看了,像这样: - 终端执行命令: allure open /tmp/youqu/report/allure_html 查看报告 + 终端执行命令: allure open /tmp/youqu/report/allure_html 查看报告 你也可以直接在 Pycharm 里面找到 index.html 文件,然后右键选择浏览器打开,或者你可以用一个 http 服务打开。 你也可以直接在 report/allure 目录下查看报告: - allure serve report/allure + allure serve report/allure 远程执行 @@ -3031,48 +3051,48 @@ 1. 提前解决代码问题这里推荐一个 Python 社区流行的代码格式化工具: Black,号称不妥协的代码格式化工具,它检测到不符合规范的代码风格直接就帮你全部格式化好,就是这么刚! 安装: -sudo pip3 install black +sudo pip3 install black 使用方法: -black ${CheckPath} +black ${CheckPath} 使用这个工具格式化之后,代码会被自动调整,刚开始你可能会觉得调整得很夸张,没关系坚持看,习惯之后,你会觉得很优雅,没错,这就是 Pythonic Code 的核心,请保持优雅~。 2. 代码扫描工具¶ 使用根目录下 pylint.sh 扫描代码,在 report 目录下查看代码扫描报告,如果有代码问题请提前解决之后再提交。 此脚本已经使用 Python 社区最流行的代码扫描工具 Pylint 进行代码扫描。 使用方法: -bash pylint.sh +bash pylint.sh 运行之后会提示你要扫描的目录,比如输入 apps ,则会扫描 apps 下的所有 Python 代码。 在 setting/pylintrc.cfg 配置文件里面进行相关配置,扫描完成之后在 report/pylints 目录下会生成扫描报告。 代码提交需通过 git review 提交到 gerrit ,人工 Code Review 通过之后合入代码。 十三、提交代码¶ 1. 安装依赖¶ -sudo apt install git-review +sudo apt install git-review 2. 提交模板¶ 在 ~ 目录下新建文件,并命名为 gitcommit_template 将以下内容写入文件当中: -# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 -fix: - -# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 -Description: - -# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 -Log: - -# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 -#Bug: - -# 修复 github issue -#Issue: - -# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 -#Task: +# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 +fix: + +# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 +Description: + +# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 +Log: + +# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 +#Bug: + +# 修复 github issue +#Issue: + +# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 +#Task: 命令行执行: -git config --global commit.template ~/gitcommit_template +git config --global commit.template ~/gitcommit_template 此命令将模板加入到 git 的提交模板中。 后续提交的时候需要关注一下几点: @@ -3083,19 +3103,19 @@ 2. 提交模板3. 推送代码¶ 首先添加 commit 信息 -git add 后面加文件名称 +git add 后面加文件名称 -git add . # 表示添加所有文件 +git add . # 表示添加所有文件 使用这条命令注意有些临时文件不要提交到仓库了。 -git commit -a +git commit -a 之后在 fix: 后面(注意冒号后面必须加空格,不然直接-1)写本地提交的 commit 信息,然后就可以提交代码了 -git review branch(当前分支) -r origin +git review branch(当前分支) -r origin 最好一次 commit,一次 git review ,经常有同学在本地疯狂 commit 最后 git review 报错不知道咋回事儿。 若不想每次提交都加上 -r 选项,执行以下命令: -git config --global gitreview.remote origin +git config --global gitreview.remote origin 提交代码,直接使用 git review branch<目标分支>,例如 git review master 4. Git标签¶ @@ -3106,74 +3126,74 @@ 4. Git标签git tag -a <tagname> +git tag -a <tagname> 回车之后,Git 会打开你的编辑器,让你写一句标签注解,就像你给提交写注解一样。 查看所有标签 -git tag -l -# git tag 也行 +git tag -l +# git tag 也行 删除标签 -git tag -d <tagname> +git tag -d <tagname> 推送标签至远程 git push 命令并不会传送标签到远程仓库服务器上,必须显式地推送标签。 -git push origin <tagname> +git push origin <tagname> 推送所有不在远程仓库服务器上的标签 -git push origin --tag +git push origin --tag 删除远程标签 -git push origin :refs/tag/<tagname> +git push origin :refs/tag/<tagname> 后期打标签 先用 git log --pretty=oneline 查询提交记录,获取校验码。 -git tag -a <tagname> 9fceb02(校验码) +git tag -a <tagname> 9fceb02(校验码) 检出标签 -git checkout <tagname> +git checkout <tagname> 此时,仓库会处于“分离头指针(detached HEAD)”的状态。 在“分离头指针”状态下,如果你做了某些更改然后提交它们,标签不会发生变化, 但你的新提交将不属于任何分支,并且将无法访问,除非通过确切的提交哈希才能访问。 因此,如果你需要进行更改,比如你要修复旧版本中的错误,那么通常需要创建一个新分支: -git checkout -b <NewBranchName> <tagname> +git checkout -b <NewBranchName> <tagname> 新分支上可以进行提交代码。 十四、常见问题¶ 1. 提交代码时提示邮箱或者名称不对¶ 重新配置邮箱或者名称,然后重置生效: -git commit --amend --reset-author +git commit --amend --reset-author 2. 怎么回滚到之前的版本¶ (1)查询历史提交记录 -git log +git log 找到你要回滚的版本,复制 hash 值。 注意:是 commit 空格之后的 hash 值,之前有同学复制的 Change-Id: 这样肯定报错。 (2)回滚版本,不清除代码 -git reset --soft ${hash} +git reset --soft ${hash} (3)回滚版本,清除代码,慎用哈 -git reset --hard ${hash} +git reset --hard ${hash} 3. 测试报告里面 F S . E 是什么意思¶ F 表示失败,. (点)表示通过,S 表示跳过,E 表示 error 有报错 4. 解决 git status 中文显示的问题¶ -git config --global core.quotePath false +git config --global core.quotePath false 5. apps 目录下颜色有些是黄色的¶ 在 Pycharm 中 apps 目录下应用库文件是黄色的,编辑器识别不到代码新增和修改; @@ -3184,22 +3204,22 @@ 5. apps 目录下颜色有些是黄色的6. 执行 env.sh 报错 $'\r':未找到命令¶ 出现这个问题你应该是在 windows 上打开或编辑过 env.sh 脚本,windows下的换行是回车符+换行符,也就是\r\n,而 Linxu 下是换行符 \n,Linux 下不识别 \r,因此报错。 解决方案: -# 将 \r 替换为空 -sudo sed -i 's/\r//' env.sh +# 将 \r 替换为空 +sudo sed -i 's/\r//' env.sh 7.怎样为单独某一条用例配置执行超时时间¶ 在用例脚本中添加装饰器,如下: -@pytest.mark.timeout(300) # 单位秒 -def test_xxx_001(): - pass +@pytest.mark.timeout(300) # 单位秒 +def test_xxx_001(): + pass 8. 如何拉取 YouQu 自动化项目所有代码,包含子仓库¶ 前置条件:已申请访问 YouQu 权限群组 -# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) -git config --global credential.helper store - -# 拉取YouQu框架代码,并递归拉取子仓库代码 -git clone "http://gerrit.uniontech.com/youqu" --recursive +# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) +git config --global credential.helper store + +# 拉取YouQu框架代码,并递归拉取子仓库代码 +git clone "http://gerrit.uniontech.com/youqu" --recursive 9. 如何拉取 YouQu 自动化项目中指定子仓库的代码¶ 前置条件: @@ -3207,22 +3227,22 @@ 9. 如何拉取 YouQu 自动化项目中指定子仓库的代 已申请访问 YouQu 权限群组 已存储访问密码 -# 拉取YouQu框架代码 -git clone "http://gerrit.uniontech.com/youqu" - -# 指定拉取子仓库代码 -cd youqu -git submodule update --init apps/autotest_xxx_xxx +# 拉取YouQu框架代码 +git clone "http://gerrit.uniontech.com/youqu" + +# 指定拉取子仓库代码 +cd youqu +git submodule update --init apps/autotest_xxx_xxx 10. 如何更新 YouQu 自动化项目中,所有子仓库的代码¶ 更新所有子仓库代码 -cd youqu -git pull & git submodule foreach git pull +cd youqu +git pull & git submodule foreach git pull 11. 如何修复 YouQu 所有子仓库 master 分支游离头(detached head)¶ 修复所有子仓库默认master 分支游离头 -cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
-h, --help show this help message and exit + -c CLIENTS, --clients CLIENTS + 远程机器的user@ip:password,多个机器用'/'连接,如果password不传入,默认取sett + ing/remote.ini中CLIENT_PASSWORD的值,比如: uos@10.8.13.33:1 + 或 uos@10.8.13.33 + -s, --send_code 发送代码到测试机(不含report目录) + -e, --build_env 搭建测试环境,如果为yes,不管send_code是否为yes都会发送代码到测试机. + -p CLIENT_PASSWORD, --client_password CLIENT_PASSWORD + 测试机密码(全局) + -y PARALLEL, --parallel PARALLEL + yes:表示所有测试机并行跑,执行相同的测试用例;no:表示测试机分布式执行,服务端会根据收集到的测试用例自 + 动分配给各个测试机执行。
除了这些特有参数以外,它同样支持本地执行的所有参数;
在命令行这样运行:
youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k "xxx" -t "xxx"
所有用例执行完之后会在 report 目录下回收各个测试机执行的测试报告。
report
注意,如果远程机器没有搭建自动化测试环境,记得加上参数 -e :
-e
youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k "xxx" -t "xxx" -e +
执行前确保远程机器已经开启了 ssh 服务,否则会提示无法连接,如果没有开启,请手动开启:
sudo systemctl restart ssh +sudo systemctl enable ssh +
配置文件其他相关配置项详细说明,请查看配置文件中的注释内容。
多机器分布式异步负载均衡执行也是用本地作为服务端控制远程机器执行,但远程机器执行的用例不同,而是所有远程机器执行的用例之和,为你想要执行的用例集;
似乎有点难以理解,我用大白话举例描述下就是,服务端想要执行 10 条用例,现在远程机器有 5 台;
然后服务端就先拿着第 1 条用例给远程 1 号机执行,拿第 2 条用例给远程 2 号机执行...,如此循环直到所有用例执行完,这就是负载均衡执行。
使用方法和前面一样,只是需要增加一个参数:
youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k "xxx" -t "xxx" --parallel no +
测试单关联的用例,自动化测试对应的去跑这些关联的用例,并且将执行的结果回填的测试用例的状态里面。
PMS 数据回填主要有三种方式:
这种方案的时间效率最高的,因为理论上用例的执行时间是大于数据回填的接口请求时间的,也就是说,当用例执行完之后,数据回填也完成了。
使用方法,在 globalconfig.ini 里面配置以下参数:(以下涉及到的参数配置都是在配置文件里面进行配置)
globalconfig.ini
PMS_USER = PMS账号 -PMS_PASSWORD = PMS密码 -SEND_PMS = async -TASK_ID = 测试单ID -TRIGGER = auto -APP_NAME = 这个参数可填可不填,但是填了可以提高用例的执行速度,因为在用例收集阶段可以指定到具体的应用库。(下同) +PMS_USER = PMS账号 +PMS_PASSWORD = PMS密码 +SEND_PMS = async +TASK_ID = 测试单ID +TRIGGER = auto +APP_NAME = 这个参数可填可不填,但是填了可以提高用例的执行速度,因为在用例收集阶段可以指定到具体的应用库。(下同) (2)用例执行完之后回填 等所有用例执行完之后,再逐个进行回填的接口请求,此方案时间效率比较低。 使用方法: -PMS_USER = PMS账号 -PMS_PASSWORD = PMS密码 -SEND_PMS = finish -TASK_ID = 测试单ID -TRIGGER = auto -APP_NAME = +PMS_USER = PMS账号 +PMS_PASSWORD = PMS密码 +SEND_PMS = finish +TASK_ID = 测试单ID +TRIGGER = auto +APP_NAME = (3)手动回填 所有用例执行完之后不做回填的接口请求,后续手动将结果进行回填请求。 用例执行时配置: -PMS_USER = PMS账号 -PMS_PASSWORD = PMS密码 -SEND_PMS = finish -TASK_ID = 测试单ID -TRIGGER = hand -APP_NAME = +PMS_USER = PMS账号 +PMS_PASSWORD = PMS密码 +SEND_PMS = finish +TASK_ID = 测试单ID +TRIGGER = hand +APP_NAME = 后续手动回填方法: -youqu manage.py pms --send2task yes +youqu manage.py pms --send2task yes 可能遇到的问题¶ 由同学可能会发现,怎么回填一次之后,后面想再次回填就不生效了; @@ -1292,62 +1383,62 @@ 可能遇到的问题2.4. 导出 CSV 文件¶ 框架提供导出指定标签用例的功能: -youqu manage.py exportcsv -a deepin-album -t CICD +youqu manage.py exportcsv -a deepin-album -t CICD 表示导出 deepin-album 的用例中标记了 CICD 标签的用例,导出 CSV 文件的字段格式已经适配了 CICD 的要求。 2.5. 脚手架新建 APP 工程¶ 新建一个 APP 工程: -youqu manage.py startapp autotest_deepin_some +youqu manage.py startapp autotest_deepin_some 这样在 apps 目录下会创建一个子项目工程 autotest_deepin_some,同时新建好工程模板目录和模板文件: -apps -└── autotest_deepin_some - ├── case - │ ├── assert_res - │ │ └── readme - │ ├── base_case.py - │ └── __init__.py - ├── config.ini - ├── config.py - ├── conftest.py - ├── control - ├── deepin_some_assert.py - ├── deepin_some.csv - ├── __init__.py - └── widget - ├── base_widget.py - ├── case_res - │ └── readme - ├── deepin_some_widget.py - ├── __init__.py - ├── other.ini - ├── other_widget.py - ├── pic_res - │ └── readme - └── ui.ini +apps +└── autotest_deepin_some + ├── case + │ ├── assert_res + │ │ └── readme + │ ├── base_case.py + │ └── __init__.py + ├── config.ini + ├── config.py + ├── conftest.py + ├── control + ├── deepin_some_assert.py + ├── deepin_some.csv + ├── __init__.py + └── widget + ├── base_widget.py + ├── case_res + │ └── readme + ├── deepin_some_widget.py + ├── __init__.py + ├── other.ini + ├── other_widget.py + ├── pic_res + │ └── readme + └── ui.ini autotest_deepin_some 是你的工程名称,比如:autotest_deepin_music ; 在此基础上,你可以快速的开始你的 AT 项目。 2.6. 用例标签自动同步¶ 用于自动同步 PMS 用例标签数据至本地 CSV 文件,主要通过以下几个配置来控制: -APP_NAME = # 指定要同步的应用名称 -PMS_USER = # PMS的用户名 -PMS_PASSWORD = # PMS的密码 +APP_NAME = # 指定要同步的应用名称 +PMS_USER = # PMS的用户名 +PMS_PASSWORD = # PMS的密码 在 [csv_link_pms_id] 节点下指定 csv 文件名与 PMS 用例模块的对应关系,比如: -[csv_link_pms_id] -;同步PMS数据到本地CSV文件,必须要配置的配置项 -;key是本地CSV文件的文件名称; -;value是对应PMS上的模块ID; -;比如要同步音乐的数据, 首先需要将配置 APP_NAME = deepin-music, -;CSV文件名称为music.csv,其在PMS上的用例为: https://pms.uniontech.com/testcase-browse-53.html -;因此应该配置为: music = 53 -;这样才能将PMS与本地CSV文件建立联系。 -;如果你的应用分了很多模块,只需要将对应的信息依次配置好就行了。 -music = 53 +[csv_link_pms_id] +;同步PMS数据到本地CSV文件,必须要配置的配置项 +;key是本地CSV文件的文件名称; +;value是对应PMS上的模块ID; +;比如要同步音乐的数据, 首先需要将配置 APP_NAME = deepin-music, +;CSV文件名称为music.csv,其在PMS上的用例为: https://pms.uniontech.com/testcase-browse-53.html +;因此应该配置为: music = 53 +;这样才能将PMS与本地CSV文件建立联系。 +;如果你的应用分了很多模块,只需要将对应的信息依次配置好就行了。 +music = 53 将以上信息配置好之后,在命令行执行: -youqu manage.py pms --pms2csv yes +youqu manage.py pms --pms2csv yes 每次执行时原 csv 文件会自动备份在 report/csv_back 目录下,因此你不用担心脚本执行导致你的数据丢失。 diff --git a/search/search_index.json b/search/search_index.json index 91ebe84c..c7cfc7a2 100644 --- a/search/search_index.json +++ b/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\u200b\\u3000\\-\u3001\u3002\uff0c\uff0e\uff1f\uff01\uff1b]+","pipeline":["stemmer"]},"docs":[{"location":"","title":"\u9996\u9875","text":""},{"location":"#youqu","title":"\u6709\u8da3\uff08YouQu\uff09","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/4/1\n# Author : Mikigo\n# =============================================\n \u672c\u7ad9\u603b\u8bbf\u95ee\u91cf \u6b21 \u6b22\u8fce\u5728\u6d4f\u89c8\u5668\u8bbf\u95ee\u3010\u516c\u7f51\u6587\u6863\u3011 \u7edf\u4fe1\u516c\u53f8\u5185\u7f51\u8fd8\u53ef\u4ee5\u8bbf\u95ee\u3010\u5185\u7f51\u6587\u6863\u3011\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u54e6~~"},{"location":"#_1","title":"\u4e00\u3001\u7b80\u4ecb","text":"\u6709\u8da3\uff08YouQu\uff09\u662f\u6df1\u5ea6\u79d1\u6280\u8bbe\u8ba1\u548c\u5f00\u53d1\u7684\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff0c\u91c7\u7528\u7ed3\u6784\u5206\u5c42\u7684\u8bbe\u8ba1\u7406\u5ff5\uff0c\u652f\u6301\u591a\u5143\u5316\u5143\u7d20\u5b9a\u4f4d\u548c\u65ad\u8a00\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\u3001\u5f3a\u5927\u7684\u65e5\u5fd7\u548c\u62a5\u544a\u8f93\u51fa\u7b49\u7279\u8272\u529f\u80fd\uff0c\u540c\u65f6\u5b8c\u7f8e\u517c\u5bb9X11\u3001Wayland\u663e\u793a\u534f\u8bae\uff0c\u73af\u5883\u90e8\u7f72\u7b80\u5355\uff0c\u64cd\u4f5c\u6613\u4e0a\u624b\u3002"},{"location":"#17","title":"\u7231\u4e0a \u201c\u6709\u8da3\u201d \u7684 17 \u4e2a\u7406\u7531","text":" \u6838\u5fc3\u5e93\u63d0\u4f9b\u4e86\u7edf\u4e00\u7684\u63a5\u53e3\uff0c\u7f16\u5199\u65b9\u6cd5\u65f6\u53ea\u9700\u8981\u5bfc\u5165\u4e00\u4e2a\u5305\u5c31\u53ef\u4ee5\u4f7f\u7528\u5230\u6838\u5fc3\u5e93\u63d0\u4f9b\u7684\u6240\u6709\u529f\u80fd\uff1b \u516c\u5171\u5e93\u5c01\u88c5\u4e86\u5f88\u591a\u5e38\u7528\u6a21\u5757\u7684\u76f8\u5173\u65b9\u6cd5\uff0c\u6bd4\u5982\uff1a\u4efb\u52a1\u680f\u7684\u64cd\u4f5c\u3001\u684c\u9762\u7684\u64cd\u4f5c\u3001\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\u7b49\u7b49\uff1b \u9664\u4e86\u5e38\u7528\u7684\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u8bc6\u522b\u4ee5\u5916\uff0c\u6211\u4eec\u8fd8\u63d0\u4f9b\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u5176\u4f7f\u7528\u7b80\u5355\u4e14\u9ad8\u6548\uff0c\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff1b \u5bf9\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u5c06\u7f16\u5199\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u53d8\u5f97\u7b80\u5355\u800c\u4f18\u96c5\uff1b \u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u6280\u672f\u8fdb\u884c\u529f\u80fd\u5347\u7ea7\uff0c\u9664\u4e86\u652f\u6301\u5355\u4e2a\u5750\u6807\u8fd4\u56de\uff0c\u8fd8\u652f\u6301\u540c\u4e00\u754c\u9762\u4e0b\u591a\u4e2a\u76f8\u540c\u5143\u7d20\u8fd4\u56de\u591a\u4e2a\u5750\u6807\u7684\u529f\u80fd\uff1b \u63d0\u4f9b\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u548c\u6279\u91cf\u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u4e0d\u5230\u4e00\u4e2a csv \u6587\u4ef6\u539f\u6765\u80fd\u5e72\u8fd9\u4e48\u591a\u4e8b\u60c5\uff1b \u63d0\u4f9b\u4e86\u529f\u80fd\u5f3a\u5927\u7684\u6267\u884c\u5668\u5165\u53e3\uff0c\u8ba9\u4f60\u53ef\u4ee5\u65b9\u4fbf\u7684\u5728\u672c\u5730\u6267\u884c\u4efb\u4f55\u7528\u4f8b\u96c6\u7684\u7528\u4f8b\uff0c\u5176\u4e30\u5bcc\u7684\u81ea\u5b9a\u4e49\u914d\u7f6e\u9879\uff0c\u6ee1\u8db3\u4f60\u5bf9\u6267\u884c\u5668\u6240\u6709\u7684\u5e7b\u60f3\uff1b \u63d0\u4f9b\u8fdc\u7a0b\u6267\u884c\u7684\u529f\u80fd\uff0c\u53ef\u4ee5\u63a7\u5236\u591a\u53f0\u673a\u5668\u5e76\u884c\u8dd1\uff0c\u6216\u8005\u5206\u5e03\u5f0f\u8dd1\uff0c\u8fd9\u79cd\u4ed8\u8d39\u529f\u80fd\u73b0\u5728\u514d\u8d39\u7ed9\u4f60\u7528\uff1b \u63d0\u4f9b\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u529f\u80fd\uff0c\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u6bcf\u4e2a\u65b9\u6cd5\u5355\u72ec\u5199\u8f93\u51fa\u65e5\u5fd7\u7684\u4ee3\u7801\uff0c\u4e00\u5207\u6211\u4eec\u7ed9\u4f60\u641e\u5b9a\u4e86\uff0c\u65e5\u5fd7\u8f93\u51fa\u4e0d\u4ec5\u5185\u5bb9\u4e30\u5bcc\uff0c\u989c\u503c\u4e5f\u7edd\u5bf9\u5728\u7ebf\uff0c\u6211\u4eec\u8fd8\u81ea\u5df1\u8bbe\u8ba1\u4e86\u4e00\u6b3e\u7ec8\u7aef\u8f93\u51fa\u4e3b\u9898\u53eb\u300a\u4e94\u5f69\u6591\u6593\u7684\u9ed1\u300b\uff1b \u63d0\u4f9b\u4e86\u4e00\u952e\u90e8\u7f72\u81ea\u52a8\u5316\u6d4b\u8bd5\u73af\u5883\u7684\u529f\u80fd\uff0c\u8fde\u4ee3\u7801\u7f16\u8f91\u5668\u90fd\u7ed9\u4f60\u88c5\u597d\u4e86\uff0c\u8ba9\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u73af\u5883\u90e8\u7f72\u800c\u70e6\u607c\uff1b \u63d0\u4f9b\u4e86\u81ea\u52a8\u751f\u6210\u591a\u79cd\u62a5\u544a\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u8f93\u51fa\u4ec0\u4e48\u62a5\u544a\u5f62\u5f0f\u90fd\u884c\uff0c\u800c\u4e14\u6211\u4eec\u5728\u62a5\u544a\u4e2d\u8fd8\u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\u548c\u5931\u8d25\u622a\u56fe\u7684\u529f\u80fd\uff1b \u5bf9\u65ad\u8a00\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u63d0\u4f9b\u66f4\u53cb\u597d\u5316\u7684\u9519\u8bef\u63d0\u793a\uff0c\u8ba9\u5b9a\u4f4d\u95ee\u9898\u7cbe\u51c6\u9ad8\u6548\uff1b \u4e0d\u4ec5\u652f\u6301\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u63a7\u5236\uff0c\u800c\u4e14\u8fd8\u652f\u6301\u52a8\u6001\u63a7\u5236\u7528\u4f8b\u6279\u91cf\u6267\u884c\u7684\u603b\u65f6\u95f4\uff0c\u786e\u4fdd CI \u73af\u5883\u4e0b\u80fd\u987a\u7545\u8fd0\u884c\uff1b \u652f\u6301\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\u6267\u884c\u3001PMS \u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6807\u7b7e\u5316\u6267\u884c\u65b9\u6848\uff0c\u6ee1\u8db3\u4f60\u5404\u79cd\u573a\u666f\u4e0b\u7684\u6267\u884c\u9700\u6c42\uff1b \u652f\u6301\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u529f\u80fd\uff0c\u53ef\u5b9a\u4f4d\u53ef\u65ad\u8a00\uff0c\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\uff1b \u5b8c\u7f8e\u517c\u5bb9 Wayland \u548c X11\uff0c\u771f\u6b63\u505a\u5230\u4e00\u5957\u4ee3\u7801\uff0c\u968f\u5904\u6267\u884c\uff1b \u652f\u6301\u591a\u79cd\u65b9\u5f0f\u7684\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u5176\u4e2d\u5f02\u6b65\u56de\u586b\u7684\u65b9\u6848\uff0c\u5b8c\u7f8e\u89e3\u51b3\u4e86\u6570\u636e\u56de\u586b\u7684\u8017\u65f6\u95ee\u9898\uff1b \u3010\u89c6\u9891\u4ecb\u7ecd\u3011"},{"location":"#_2","title":"\u4e8c\u3001\u5b89\u88c5\u4f7f\u7528","text":"\u57fa\u7840\u6846\u67b6\uff1ahttps://github.com/linuxdeepin/deepin-autotest-framework \u4ece PyPI \u5b89\u88c5: sudo pip3 install youqu\n \u521b\u5efa\u9879\u76ee: youqu-startproject youqu\n \u5b89\u88c5\u4f9d\u8d56: cd youqu\nbash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002 \u5e94\u7528\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684\u5e94\u7528\u540d\u79f0\u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music cd apps/\n \u5c06\u5e94\u7528\u5e93\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u50cf\u8fd9\u6837\uff1a youqu\n\u251c\u2500\u2500 apps\n\u2502 \u251c\u2500\u2500 autotest_deepin_music # \u5e94\u7528\u5e93\n...\n \u5e94\u7528\u5e93\u7684\u540d\u79f0\u4e0d\u53ef\u4ee5\u4fee\u6539\u3002"},{"location":"#_3","title":"\u4e09\u3001\u8fd0\u884c","text":""},{"location":"#1","title":"1. \u5de5\u4f5c\u7a7a\u95f4","text":"\u57fa\u7840\u6846\u67b6\u5de5\u7a0b\u76ee\u5f55\u5efa\u8bae\u653e\u5728 ~ \u76ee\u5f55\u4e0b\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u4e5f\u53ef\u4ee5\u8fd0\u884c\uff0c\u4f46\u662f\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u9700\u8981\u505a\u73af\u5883\u6e05\u7406\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u5b58\u5728\u4ee3\u7801\u88ab\u5220\u9664\u7684\u98ce\u9669\u3002 \u5982\u679c\u4f60\u7684\u673a\u5668\u4e0a\u4e0d\u540c\u76ee\u5f55\u4e0b\u5b58\u5728\u591a\u4e2a YouQu \u5de5\u7a0b\uff0c\u90a3\u4e48\u5728\u8fd0\u884c\u4e4b\u524d\uff0c\u8bf7\u5148\u6267\u884c env.sh \u6821\u6b63\u76f8\u5173\u73af\u5883\u3002"},{"location":"#2","title":"2. \u6267\u884c\u5668","text":"\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u6709\u4e00\u4e2a manage.py \uff0c\u5b83\u662f\u4e00\u4e2a\u6267\u884c\u5668\u5165\u53e3\uff0c\u63d0\u4f9b\u4e86\u672c\u5730\u6267\u884c\u3001\u8fdc\u7a0b\u6267\u884c\u7b49\u7684\u529f\u80fd\u3002 \u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6765\u6267\u884c\uff1a youqu manage.py run -a deepin-music\n"},{"location":"#21","title":"2.1. \u672c\u5730\u6267\u884c","text":"youqu manage.py run\n"},{"location":"#211","title":"2.1.1. \u914d\u7f6e\u6587\u4ef6","text":"\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u914d\u7f6e\u53c2\u6570 \u5728\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u91cc\u9762\u652f\u6301\u914d\u7f6e\u5bf9\u6267\u884c\u7684\u4e00\u4e9b\u53c2\u6570\u8fdb\u884c\u914d\u7f6e\uff0c\u5e38\u7528\u7684\u5982\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;1\u3001KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2\u3001KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f, e.g. TAGS = L1 or smoke\n;\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\uff0c\u5c06\u8981\u6267\u884c\u7684\u7528\u4f8b\u5199\u5165\u6307\u5b9a\u7684 csv \u6587\u4ef6\n;\u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u4ece\u57fa\u7840\u6846\u67b6\u6839\u76ee\u5f55\u5f00\u59cb\uff1ae.g. CASE_FILE = case_list.txt\n;\u5982\u679c\u8fd9\u91cc\u6709\u503c\uff0cAPP_NAME KEYWORDS TAGS \u7684\u914d\u7f6e\u5747\u4e0d\u751f\u6548\nCASE_FILE =\n;=============================== RUNNER CONFIG ===================================\n[runner]\n;\u6700\u5927\u5931\u8d25\u7528\u4f8b\u6570\u91cf\u7684\u5360\u6bd4\n;\u6bd4\u5982\uff1a\u603b\u6267\u884c\u7528\u4f8b\u6570\u4e3a100, \u82e5 MAX_FAIL = 0.5,\u5219\u5931\u8d25\u7528\u4f8b\u6570\u8fbe\u523050\u5c31\u4f1a\u7ec8\u6b62\u6d4b\u8bd5\u3002\nMAX_FAIL = 0.5\n;\u5355\u6761\u7528\u4f8b\u7684\u8d85\u65f6\u65f6\u95f4\uff0c\u5982\u679c\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u8d85\u65f6\uff0c\u8fd9\u6761\u7528\u4f8b\u4f1a\u88ab\u505c\u6b62\uff0c\u540e\u7eed\u7528\u4f8b\u7ee7\u7eed\u6267\u884c\u3002\n;\u5355\u4f4d\u4e3a\u79d2\n; \u8fd9\u662f\u4e00\u4e2a\u5168\u5c40\u7edf\u4e00\u914d\u7f6e\uff0c\u5982\u679c\u67d0\u6761\u7528\u4f8b\u9700\u8981\u5355\u72ec\u914d\u7f6e\u8d85\u65f6\u65f6\u95f4\uff0c\u53ef\u4ee5\u5728\u7528\u4f8b\u4e2d\u8fd9\u6837\u5199\uff1a\n;@pytest.mark.timeout(500)\n;def test_xxx_001():\n; ...\n;\u4f1a\u8bdd\uff08\u6240\u6709\u7528\u4f8b\u6267\u884c\u7684\uff09\u8d85\u65f6\u662f\u6839\u636e\u5168\u5c40\u8d85\u65f6\u914d\u7f6e\u548c\u7528\u4f8b\u5355\u72ec\u8d85\u65f6\u914d\u7f6e\u81ea\u52a8\u8ba1\u7b97\u7684\uff1b\nCASE_TIME_OUT = 200\n;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\u3002\n;\u6ce8\u610f\uff0c\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u4e0d\u80fd\u5c0f\u4e8e\u5931\u8d25\u5f55\u5c4f\u6b21\u6570\uff0c\u5373 RERUN >= RECORD_FAILED_CASE\nRECORD_FAILED_CASE = 1\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = INFO\n;yes \u6bcf\u6761\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u8fdb\u884c\u73af\u5883\u6e05\u7406\nCLEAN_ALL = yes\n;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\nRESOLUTION = 1920x1080\n;\u4e0d\u8df3\u8fc7\u7528\u4f8b\uff0ccsv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86 skip-xxx\u7684\u7528\u4f8b\u4e0d\u8df3\u8fc7\nNOSKIP = no\n;ignore fixed\n;no\uff0c\u53ea\u8981\u6807\u8bb0\u4e86fixed\u7684\u7528\u4f8b\uff0c\u5373\u4f7f\u6807\u8bb0\u4e86skip-\uff0c\u4e5f\u4f1a\u6267\u884c\uff1b\n;yes\uff0cfixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\uff1b\nIFIXED = no\n;\u8981\u5b89\u88c5deb\u5305\u7684\u8def\u5f84\n;e.g : ~/Downloads/ \u5b89\u88c5\u4e0b\u8f7d\u76ee\u5f55\u4e0b\u7684deb\u5305\uff0c\u5982\u679c\u662f\u8fdc\u7a0b\u6267\u884c\uff0c\u4f1a\u81ea\u52a8\u62f7\u8d1d\u5230\u8fdc\u7a0b\u5e76\u5b89\u88c5\u3002\nDEB_PATH =\n;DEBUG \u6a21\u5f0f\u6267\u884c\u7528\u4f8b\uff0c\u53ea\u6536\u96c6\u4e0d\u6267\u884c\u7528\u4f8b\uff0c\u4e5f\u4e0d\u505a\u8bbe\u5907\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002\nDEBUG = no\n;\u8bb0\u5f55top\u547d\u4ee4\u67e5\u8be2\u7684\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0cTOP = 3 \u8868\u793a\u8bb0\u5f55\u524d3\u4e2a\u8fdb\u7a0b\u3002\nTOP =\n;\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\nREPEAT =\n;\u9ed8\u8ba4\u5728\u6240\u6709\u6d4b\u8bd5\u5b8c\u6210\u4e4b\u540e\u8f93\u51fa\u62a5\u9519\u4fe1\u606f.\n;yes, \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\nDURING_FAIL = no\n;=============================== REPORT CONFIG ===================================\n[report]\n;\u7528\u4f8b\u6267\u884c\u5b8c\u540e\u751f\u6210\u7684\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n;\u76ee\u524d\u652f\u6301 allure, xml, json \uff08\u652f\u6301\u540c\u65f6\u751f\u6210\uff09\nREPORT_FORMAT = allure, xml, json\n;\u6307\u5b9a\u62a5\u544a\u751f\u6210\u7684\u8def\u5f84\uff08\u76f8\u5bf9\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\uff09\nALLURE_REPORT_PATH = report/\nXML_REPORT_PATH = report/\nJSON_REPORT_PATH = report/\n;=============================== GLOBAL CONFIG ===================================\n[globalconfig]\n;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\nPASSWORD = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\nIMAGE_MATCH_NUMBER = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6bcf\u6b21\u95f4\u9694\u7b49\u5f85\u65f6\u95f4\nIMAGE_MATCH_WAIT_TIME = 1\n;\u56fe\u50cf\u8bc6\u522b\u5339\u914d\u5ea6\nIMAGE_RATE = 0.9\n;\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u5b9e\u65f6\u56fe\u50cf\u4fdd\u5b58\u8def\u5f84\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u5750\u6807\nSCREEN_CACHE = /tmp/screen.png\n;\u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\u7684\u8def\u5f84\nTMPDIR = /tmp/tmpdir\n;\u7cfb\u7edf\u4e3b\u9898\nSYS_THEME = deepin\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = http://youqu-dev.uniontech.com:8890\n;OpenCV\u670d\u52a1\u7aef\u5730\u5740\nOPENCV_SERVER_HOST = http://youqu-dev.uniontech.com:8889\n;=============================== PMS CONFIG ===================================\n;PMS\u76f8\u5173\u914d\u7f6e\uff0c\u5305\u542b\u4ee5\u4e0b\u51e0\u4e2a\u65b9\u9762\uff1a\n;1.PMS\u6d4b\u8bd5\u5957\u6267\u884c\n;2.\u81ea\u52a8\u4ecePMS\u722c\u53d6\u6570\u636e\u5e76\u540c\u6b65\u672c\u5730CSV\u6587\u4ef6\n;3.PMS\u6570\u636e\u56de\u586b\n[pms]\n;PMS\u7684\u7528\u6237\u540d: ut001234\nPMS_USER =\n;PMS\u7684\u5bc6\u7801\nPMS_PASSWORD =\n;PMS\u6d4b\u8bd5\u5957\u7684ID\n;\u5728PMS\u4e0a\u67e5\u770b\u7528\u4f8b\u201c\u5957\u4ef6\u201d\u94fe\u63a5: https://pms.uniontech.com/testsuite-view-495.html\n;\u6d4b\u8bd5\u5957ID\u4e3a: 495\nSUITE_ID =\n;\u6570\u636e\u56de\u586b\u5fc5\u987b\u5173\u8054PMS\u6d4b\u8bd5\u5355\n;\u5728PMS\u4e0a\u67e5\u770b\u6d4b\u8bd5\u5355\u94fe\u63a5: https://pms.uniontech.com/testtask-cases-20747.html\n;\u6d4b\u8bd5\u5355ID\u4e3a: 20747\nTASK_ID =\n;\u5c06\u6d4b\u8bd5\u7ed3\u679c\u6570\u636e\u56de\u586b\u5230PMS\n;\u4e3a\u7a7a: \u8868\u793a\u4e0d\u56de\u586b,\u4e0d\u4f1a\u5728\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u751f\u6210json\u7ed3\u679c\u6587\u4ef6;\n;async: \u8868\u793a\u9010\u6761\u5f02\u6b65\u56de\u586b,\u540e\u9762\u4e00\u6761\u6267\u884c\u5f00\u59cb\u65f6\u901a\u8fc7\u5b50\u7ebf\u7a0b\u5bf9\u524d\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u8fdb\u884c\u56de\u586b\uff0c\u5982\u6b64\u5b9e\u73b0\u65f6\u95f4\u6548\u7387\u6700\u5927\u5316;\n;finish: \u8868\u793a\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u6210\u4e4b\u540e\u9010\u4e2a\u56de\u586b(PMS\u4e0d\u652f\u6301\u5e76\u53d1);\nSEND_PMS =\n;\u6570\u636e\u56de\u586b\u7684\u89e6\u53d1\u8005\n;auto: \u6846\u67b6\u81ea\u52a8\u56de\u586b,\u914d\u5408SEND_PMS\u914d\u7f6e\u4f7f\u7528,\u4f60\u53ef\u4ee5\u9009\u62e9\u5728\u4e0d\u540c\u7684\u9636\u6bb5\u8fdb\u884c\u6570\u636e\u56de\u586b;\n;hand: \u624b\u52a8\u56de\u586b,\u6bcf\u6761\u7528\u4f8b\u4ecd\u7136\u4f1a\u751f\u6210json\u6587\u4ef6,\u4f46\u6846\u67b6\u4e0d\u4f1a\u8fdb\u884c\u6570\u636e\u56de\u586b,\u9700\u8981\u4f60\u53ef\u4ee5\u5728\u4f60\u60f3\u8981\u53d1\u9001\u7684\u65f6\u95f4\u70b9\u624b\u52a8\u89e6\u53d1\u56de\u586b;\nTRIGGER = auto\n;PMS\u56de\u586b\u7684\u91cd\u8bd5\u6b21\u6570\n;\u5982\u679c\u63a5\u53e3\u8bf7\u6c42\u5931\u8d25,\u4f1a\u8fdb\u884c\u91cd\u8bd5\nSEND_PMS_RETRY_NUMBER = 2\n[csv_link_pms_lib]\n;caselib: \u7528\u4f8b\u5e93\n;testcase: \u4ea7\u54c1\u5e93\u7528\u4f8b\nCASE_FROM = caselib\n[csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/caselib-browse-81.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 81\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic =\n[export_csv]\n;\u5bfc\u51fa\u7684csv\u6587\u4ef6\u540d\u79f0\uff0c\u9ed8\u8ba4 case_list.csv\nCSV_FILE = case_list.csv\n;exportcsv \u547d\u4ee4\u5bfc\u51fa case_list.csv \u6587\u4ef6\u65f6\u914d\u7f6e\u7684\u5b57\u6bb5\u540d\uff0c\u7528\u4f8b\u540d\u79f0\u9ed8\u8ba4\u5b58\u5728\u7b2c\u4e00\u5217\uff0c\u65e0\u9700\u6dfb\u52a0\nCSV_HEARD = \u7528\u4f8b\u7ea7\u522b,\u7528\u4f8b\u7c7b\u578b,\u6d4b\u8bd5\u7ea7\u522b,\u662f\u5426\u8df3\u8fc7\n \u914d\u7f6e\u5b8c\u6210\u4e4b\u540e\uff0c\u76f4\u63a5\u5728\u547d\u4ee4\u884c\u6267\u884c manage.py \u5c31\u597d\u4e86\u3002 youqu manage.py run\n"},{"location":"#212","title":"2.1.2. \u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a youqu manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--max_fail MAX_FAIL \u6700\u5927\u5931\u8d25\u7387\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--resolution RESOLUTION\n\u68c0\u67e5\u5206\u8fa8\u7387\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms {,async,finish}\n\u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--trigger {,auto,hand}\n\u89e6\u53d1\u8005\n-f CASE_FILE, --case_file CASE_FILE\n\u6839\u636e\u6587\u4ef6\u6267\u884c\u7528\u4f8b\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n--pms_user PMS_USER pms \u7528\u6237\u540d\n--pms_password PMS_PASSWORD\npms \u5bc6\u7801\n--suite_id SUITE_ID pms \u6d4b\u8bd5\u5957ID\n--pms_info_file PMS_INFO_FILE\npms \u4fe1\u606f\u6587\u4ef6\n--top TOP \u8fc7\u7a0b\u4e2d\u8bb0\u5f55top\u547d\u4ee4\u4e2d\u7684\u503c\n--lastfailed \u4ec5\u6267\u884c\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\n--duringfail \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\n--repeat REPEAT \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n--project_name PROJECT_NAME\n\u5de5\u7a0b\u540d\u79f0\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--build_location BUILD_LOCATION\n\u6784\u5efa\u5730\u533a\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--line LINE \u6267\u884c\u7684\u4e1a\u52a1\u7ebf\uff08\u5199\u5165json\u6587\u4ef6\uff09\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a youqu manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\"\n \u547d\u4ee4\u884c\u53c2\u6570\u4f18\u5148\u7ea7\u662f\u9ad8\u4e8e\u914d\u7f6e\u6587\u4ef6\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u4e86\u5bf9\u5e94\u7684\u53c2\u6570\uff0c\u914d\u7f6e\u6587\u4ef6\u4e2d\u4e0d\u7ba1\u662f\u5426\u914d\u7f6e\u5747\u4e0d\u751f\u6548\u3002 --app \u5165\u53c2\u8fd8\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\uff0c\u4e0b\u9762\u7684\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u540c\u6837\u652f\u6301\u3002"},{"location":"#22","title":"2.2. \u8fdc\u7a0b\u6267\u884c","text":"youqu manage.py remote\n \u8fdc\u7a0b\u6267\u884c\u540c\u6837\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u8fdb\u884c\u7528\u4f8b\u76f8\u5173\u914d\u7f6e\uff1b \u9700\u8981\u91cd\u70b9\u8bf4\u4e00\u4e0b\u8fdc\u7a0b\u6267\u884c\u65f6\u7684\u6d4b\u8bd5\u673a\u4fe1\u606f\u914d\u7f6e\uff0c\u5728\u914d\u7f6e\u6587\u4ef6 setting/remote.ini \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\u3001IP\u3001\u5bc6\u7801\u3002 ;=============================== CLIENT LIST =====================================\n; \u6d4b\u8bd5\u673a\u914d\u7f6e\u5217\u8868\n;[client{number}] ;\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u6709\u591a\u5c11\u53f0\u6d4b\u8bd5\u673a\u5c31\u5199\u591a\u5c11\u4e2a client\uff0c\u522b\u540d\u5fc5\u987b\u5305\u542b client \u5b57\u7b26\uff0c\u4e14\u4e0d\u80fd\u91cd\u590d\u3002\n;user = ;\u6d4b\u8bd5\u673a user\n;ip = ;\u6d4b\u8bd5\u673a ip\n;password = 1 ;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801, \u53ef\u4ee5\u4e0d\u914d\u7f6e\u6b64\u9879\uff0c\u9ed8\u8ba4\u53d6 CLIENT_PASSWORD \u7684\u503c\uff1b\n;\u5982\u679c\u4f60\u6240\u6709\u6d4b\u8bd5\u673a\u5bc6\u7801\u90fd\u76f8\u540c\uff0c\u90a3\u4e48\u53ea\u9700\u8981\u914d\u7f6e CLIENT_PASSWORD \u5c31\u53ef\u4ee5\u4e86\n;=================================================================================\n[client1]\nuser = uos\nip = 10.8.15.xx\n[client2]\nuser = uos\nip = 10.8.15.xx\n[client3]\nuser = uos\nip = 10.8.11.xx\n \u6709\u591a\u5c11\u53f0\u673a\u5668\u5c31\u50cf\u8fd9\u6837\u6328\u7740\u5199\u5c31\u884c\u4e86\u3002 \u7136\u540e\u5728\u547d\u4ee4\u884c\uff1a youqu manage.py remote\n \u8fd9\u6837\u8fd0\u884c\u662f\u4ece\u914d\u7f6e\u6587\u4ef6\u53bb\u8bfb\u53d6\u76f8\u5173\u914d\u7f6e\u3002 \u5982\u679c\u4f60\u4e0d\u60f3\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\uff0c\u4f60\u4ecd\u7136\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u8fdb\u884c\u4f20\u53c2\uff0c \u4ee5\u4e0b\u4e3a python3 manage.py remote \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-c CLIENTS, --clients CLIENTS\n\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679cpassword\u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6\nsetting/remote.ini \u4e2d CLIENT_PASSWORD\n\u7684\u503c,\u6bd4\u5982\uff1auos@10.8.13.33:1 \u6216 uos@10.8.13.33\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-s {yes,no,}, --send_code {yes,no,}\n\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a\uff08\u4e0d\u542breport\u76ee\u5f55\uff09\n-e, --build_env \u642d\u5efa\u6d4b\u8bd5\u73af\u5883,\u5982\u679c\u4e3ayes\uff0c\u4e0d\u7ba1send_code\u662f\u5426\u4e3ayes\u90fd\u4f1a\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a.\n-p CLIENT_PASSWORD, --client_password CLIENT_PASSWORD\n\u6d4b\u8bd5\u673a\u5bc6\u7801\uff08\u5168\u5c40\uff09\n-y PARALLEL, --parallel PARALLEL\nyes:\u8868\u793a\u6240\u6709\u6d4b\u8bd5\u673a\u5e76\u884c\u8dd1\uff0c\u6267\u884c\u76f8\u540c\u7684\u6d4b\u8bd5\u7528\u4f8b\uff0cno\n:\u8868\u793a\u6d4b\u8bd5\u673a\u5206\u5e03\u5f0f\u6267\u884c\uff0c\u670d\u52a1\u7aef\u4f1a\u6839\u636e\u6536\u96c6\u5230\u7684\u6d4b\u8bd5\u7528\u4f8b\u81ea\u52a8\u5206\u914d\u7ed9\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u3002\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms SEND_PMS \u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n \u5728\u547d\u4ee4\u884c\u8fd9\u6837\u8fd0\u884c\uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\"\n \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report \u76ee\u5f55\u4e0b\u56de\u6536\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u7684\u6d4b\u8bd5\u62a5\u544a\u3002 \u914d\u7f6e\u6587\u4ef6\u5176\u4ed6\u76f8\u5173\u914d\u7f6e\u9879\u8be6\u7ec6\u8bf4\u660e\uff0c\u8bf7\u67e5\u770b\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u6ce8\u91ca\u5185\u5bb9\u3002"},{"location":"#23-pms","title":"2.3. PMS \u6570\u636e\u56de\u586b","text":"\u6d4b\u8bd5\u5355\u5173\u8054\u7684\u7528\u4f8b\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u5bf9\u5e94\u7684\u53bb\u8dd1\u8fd9\u4e9b\u5173\u8054\u7684\u7528\u4f8b\uff0c\u5e76\u4e14\u5c06\u6267\u884c\u7684\u7ed3\u679c\u56de\u586b\u7684\u6d4b\u8bd5\u7528\u4f8b\u7684\u72b6\u6001\u91cc\u9762\u3002 PMS \u6570\u636e\u56de\u586b\u4e3b\u8981\u6709\u4e09\u79cd\u65b9\u5f0f\uff1a \uff081\uff09\u5f02\u6b65\u56de\u586b \u5728\u7528\u4f8b\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\uff0c\u91c7\u7528\u5f02\u6b65\u7684\u65b9\u5f0f\u53bb\u8fdb\u884c\u6570\u636e\u56de\u586b\uff0c\u76f4\u767d\u7684\u8bb2\u5c31\u662f\uff0c\u7b2c\u4e8c\u6761\u7528\u4f8b\u5f00\u59cb\u8dd1\u7684\u65f6\u5019\uff0c\u901a\u8fc7\u5b50\u7ebf\u7a0b\u53bb\u505a\u7b2c\u4e00\u6761\u7528\u4f8b\u7684\u6570\u636e\u56de\u586b\uff0c\u5982\u6b64\u5faa\u73af\uff0c\u76f4\u5230\u6240\u6709\u7528\u4f8b\u6267\u884c\u7ed3\u675f\uff1b \u8fd9\u79cd\u65b9\u6848\u7684\u65f6\u95f4\u6548\u7387\u6700\u9ad8\u7684\uff0c\u56e0\u4e3a\u7406\u8bba\u4e0a\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u662f\u5927\u4e8e\u6570\u636e\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\u65f6\u95f4\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u5f53\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u6570\u636e\u56de\u586b\u4e5f\u5b8c\u6210\u4e86\u3002 \u4f7f\u7528\u65b9\u6cd5\uff0c\u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u4ee5\u4e0b\u53c2\u6570\uff1a\uff08\u4ee5\u4e0b\u6d89\u53ca\u5230\u7684\u53c2\u6570\u914d\u7f6e\u90fd\u662f\u5728\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u914d\u7f6e\uff09 PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = async\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \u8fd9\u4e2a\u53c2\u6570\u53ef\u586b\u53ef\u4e0d\u586b\uff0c\u4f46\u662f\u586b\u4e86\u53ef\u4ee5\u63d0\u9ad8\u7528\u4f8b\u7684\u6267\u884c\u901f\u5ea6\uff0c\u56e0\u4e3a\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u53ef\u4ee5\u6307\u5b9a\u5230\u5177\u4f53\u7684\u5e94\u7528\u5e93\u3002\uff08\u4e0b\u540c\uff09\n \uff082\uff09\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u56de\u586b \u7b49\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u518d\u9010\u4e2a\u8fdb\u884c\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u6b64\u65b9\u6848\u65f6\u95f4\u6548\u7387\u6bd4\u8f83\u4f4e\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \uff083\uff09\u624b\u52a8\u56de\u586b \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4e0d\u505a\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u540e\u7eed\u624b\u52a8\u5c06\u7ed3\u679c\u8fdb\u884c\u56de\u586b\u8bf7\u6c42\u3002 \u7528\u4f8b\u6267\u884c\u65f6\u914d\u7f6e\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = hand\nAPP_NAME = \u540e\u7eed\u624b\u52a8\u56de\u586b\u65b9\u6cd5\uff1a youqu manage.py pms --send2task yes\n"},{"location":"#_4","title":"\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898","text":"\u7531\u540c\u5b66\u53ef\u80fd\u4f1a\u53d1\u73b0\uff0c\u600e\u4e48\u56de\u586b\u4e00\u6b21\u4e4b\u540e\uff0c\u540e\u9762\u60f3\u518d\u6b21\u56de\u586b\u5c31\u4e0d\u751f\u6548\u4e86\uff1b \u8fd9\u662f\u56e0\u4e3a\u4e3a\u4e86\u5e94\u5bf9\u524d\u9762\u63d0\u5230\u7684\u591a\u79cd\u6570\u636e\u56de\u586b\u7684\u65b9\u5f0f\uff0c\u5728 report \u76ee\u5f55\u4e0b\u4f1a\u7531 pms_xxx \u5f00\u5934\u7684\u76ee\u5f55\uff0c\u8bb0\u5f55\u4e86\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u548c\u56de\u586b\u60c5\u51b5\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u4e4b\u524d\u5df2\u7ecf\u56de\u586b\u8fc7\u4e86\uff0c\u540e\u7eed\u5c31\u4e0d\u4f1a\u518d\u6b64\u89e6\u53d1\u56de\u586b\u4e86\uff1b \u5982\u679c\u4f60\u60f3\u91cd\u65b0\u505a\u56de\u586b\uff0c\u4f60\u53ef\u4ee5\u628a report/pms_xxx \u76ee\u5f55\u5220\u6389\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u91cd\u65b0\u505a\u6570\u636e\u56de\u586b\u4e86\uff1b"},{"location":"#24-csv","title":"2.4. \u5bfc\u51fa CSV \u6587\u4ef6","text":"\u6846\u67b6\u63d0\u4f9b\u5bfc\u51fa\u6307\u5b9a\u6807\u7b7e\u7528\u4f8b\u7684\u529f\u80fd\uff1a youqu manage.py exportcsv -a deepin-album -t CICD\n \u8868\u793a\u5bfc\u51fa deepin-album \u7684\u7528\u4f8b\u4e2d\u6807\u8bb0\u4e86 CICD \u6807\u7b7e\u7684\u7528\u4f8b\uff0c\u5bfc\u51fa CSV \u6587\u4ef6\u7684\u5b57\u6bb5\u683c\u5f0f\u5df2\u7ecf\u9002\u914d\u4e86 CICD \u7684\u8981\u6c42\u3002"},{"location":"#25-app","title":"2.5. \u811a\u624b\u67b6\u65b0\u5efa APP \u5de5\u7a0b","text":"\u65b0\u5efa\u4e00\u4e2a APP \u5de5\u7a0b\uff1a youqu manage.py startapp autotest_deepin_some \u8fd9\u6837\u5728 apps \u76ee\u5f55\u4e0b\u4f1a\u521b\u5efa\u4e00\u4e2a\u5b50\u9879\u76ee\u5de5\u7a0b autotest_deepin_some\uff0c\u540c\u65f6\u65b0\u5efa\u597d\u5de5\u7a0b\u6a21\u677f\u76ee\u5f55\u548c\u6a21\u677f\u6587\u4ef6\uff1a apps\n\u2514\u2500\u2500 autotest_deepin_some\n \u00a0\u00a0 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_case.py\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 config.ini\n \u00a0\u00a0 \u251c\u2500\u2500 config.py\n \u00a0\u00a0 \u251c\u2500\u2500 conftest.py\n \u00a0\u00a0 \u251c\u2500\u2500 control\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_assert.py\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some.csv\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u2514\u2500\u2500 widget\n \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 case_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 other.ini\n \u00a0\u00a0 \u251c\u2500\u2500 other_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 pic_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2514\u2500\u2500 ui.ini\n autotest_deepin_some \u662f\u4f60\u7684\u5de5\u7a0b\u540d\u79f0\uff0c\u6bd4\u5982\uff1aautotest_deepin_music \uff1b \u5728\u6b64\u57fa\u7840\u4e0a\uff0c\u4f60\u53ef\u4ee5\u5feb\u901f\u7684\u5f00\u59cb\u4f60\u7684 AT \u9879\u76ee\u3002"},{"location":"#26","title":"2.6. \u7528\u4f8b\u6807\u7b7e\u81ea\u52a8\u540c\u6b65","text":"\u7528\u4e8e\u81ea\u52a8\u540c\u6b65 PMS \u7528\u4f8b\u6807\u7b7e\u6570\u636e\u81f3\u672c\u5730 CSV \u6587\u4ef6\uff0c\u4e3b\u8981\u901a\u8fc7\u4ee5\u4e0b\u51e0\u4e2a\u914d\u7f6e\u6765\u63a7\u5236\uff1a APP_NAME = # \u6307\u5b9a\u8981\u540c\u6b65\u7684\u5e94\u7528\u540d\u79f0\nPMS_USER = # PMS\u7684\u7528\u6237\u540d\nPMS_PASSWORD = # PMS\u7684\u5bc6\u7801\n \u5728 [csv_link_pms_id] \u8282\u70b9\u4e0b\u6307\u5b9a csv \u6587\u4ef6\u540d\u4e0e PMS \u7528\u4f8b\u6a21\u5757\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u6bd4\u5982\uff1a [csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/testcase-browse-53.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 53\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic = 53\n \u5c06\u4ee5\u4e0a\u4fe1\u606f\u914d\u7f6e\u597d\u4e4b\u540e\uff0c\u5728\u547d\u4ee4\u884c\u6267\u884c\uff1a youqu manage.py pms --pms2csv yes\n \u6bcf\u6b21\u6267\u884c\u65f6\u539f csv \u6587\u4ef6\u4f1a\u81ea\u52a8\u5907\u4efd\u5728 report/csv_back \u76ee\u5f55\u4e0b\uff0c\u56e0\u6b64\u4f60\u4e0d\u7528\u62c5\u5fc3\u811a\u672c\u6267\u884c\u5bfc\u81f4\u4f60\u7684\u6570\u636e\u4e22\u5931\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u57fa\u7840\u6846\u67b6\u8bbe\u8ba1\u65b9\u6848","text":"# ====================================\n# Author : Mikigo\n# Time : 2022/3/18\n# version \uff1a1.0\n# ====================================\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"\u505a\u4e00\u4e2a\u7b80\u5355\u3001\u597d\u7528\u3001\u529f\u80fd\u5f3a\u5927\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u3002 \u4f5c\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4e00\u4e2a\u57fa\u7840\u6846\u67b6\uff0c\u4efb\u4f55\u5e94\u7528\u90fd\u80fd\u5f88\u65b9\u4fbf\u7684\u63a5\u5165\u8fdb\u6765\uff1b \u63d0\u4f9b\u6240\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u9700\u8981\u7684\u5e95\u5c42\u529f\u80fd\uff0c\u5e76\u5bf9\u5916\u63d0\u4f9b\u552f\u4e00\u7684\u63a5\u53e3\uff0c\u65b9\u4fbf\u5e94\u7528\u5e93\u4f7f\u7528\uff1b \u6574\u5408\u516c\u5171\u5e93\uff0c\u51cf\u5c11\u5e94\u7528\u5e93\u4ee3\u7801\u91cf\u548c\u65b9\u6cd5\u7ef4\u62a4\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u8bbe\u8ba1\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u7edf\u4e00\u6982\u5ff5","text":" \u57fa\u7840\u6846\u67b6 \u672c\u9879\u76ee\u662f\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\uff08AutoTest Basic Frame\uff09\uff0c\u5168\u79f0\u4e3a\u201c\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff08AT \u57fa\u7840\u6846\u67b6\uff09\u201d\u3002 AT \u57fa\u7840\u6846\u67b6\u662f\u505a\u4e3a\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\u6765\u8bbe\u8ba1\u7684\uff0c\u5b83\u63d0\u4f9b\u4e86\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u57fa\u7840\u529f\u80fd\uff0c\u4efb\u4f55\u5e94\u7528\u63a5\u5165\u8fdb\u6765\u90fd\u80fd\u5feb\u901f\u65b9\u4fbf\u7684\u8fdb\u884c\u65b9\u6cd5\u548c\u7528\u4f8b\u7f16\u5199\uff0c\u540c\u65f6\u5728\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u3001\u6807\u7b7e\u5316\u6267\u884c\u3001\u5206\u5e03\u5f0f\u6267\u884c\u3001\u591a\u79cd\u62a5\u544a\u8f93\u51fa\u3001\u4f18\u7f8e\u7684\u6267\u884c\u65e5\u5fd7\u3001\u5931\u8d25\u81ea\u52a8\u5f55\u5c4f\u548c\u622a\u56fe\u3001\u81ea\u52a8\u73af\u5883\u6e05\u7406\u7b49\u7b49\uff0c\u5b83\u90fd\u63d0\u4f9b\u4e86\u5b8c\u5584\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u66f4\u91cd\u8981\u7684\u662f\u8fd9\u4e00\u5207\u4f7f\u7528\u8d77\u6765\u90fd\u975e\u5e38\u7b80\u5355\u3002 \u57fa\u7840\u6846\u67b6\u4e2d\u5305\u542b\u5e94\u7528\u5e93\uff08apps\uff09\u3001\u6838\u5fc3\u5e93\uff08src\uff09\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09\u3002 \u5e94\u7528\u5e93\uff08apps\uff09 \u5404\u4e2a\u5e94\u7528\u81ea\u5df1\u7684\u4ed3\u5e93\uff0c\u91cc\u9762\u4e3b\u8981\u5305\u542b\u7684\u662f\u7528\u4f8b\u3001\u65b9\u6cd5\u53ca\u4e00\u4e9b\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u53eb autotest-dde-file-manager \u3002 \u6838\u5fc3\u5e93\uff08src\uff09 \u6838\u5fc3\u5e93\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u5230\u6240\u6709\u5e95\u5c42\u6838\u5fc3\u529f\u80fd\uff0c\u8fd9\u662f\u6700\u91cd\u8981\u7684\u4e00\u4e2a\u90e8\u5206\uff0c\u7075\u9b42\u3002\u5177\u4f53\u529f\u80fd\u6a21\u5757\u53ca\u8bf4\u660e\u4f1a\u5728\u4e0b\u9762\u7b2c\u56db\u4e2a\u7ae0\u8282\u8be6\u7ec6\u63cf\u8ff0\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09 \u591a\u4e2a\u5e94\u7528\u90fd\u8981\u7528\u5230\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\uff0c\u6309\u7167\u5e94\u7528\u5212\u5206\u5b58\u653e\uff0c\u4e3b\u8981\u662f\u4e3a\u4e86\u51cf\u5c11\u4ee3\u7801\u91cf\uff0c\u6d88\u9664\u5e94\u7528\u95f4\u7684\u8026\u5408\u5173\u7cfb\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u67b6\u6784\u56fe","text":"\u6574\u4f53\u7684\u6846\u67b6\u8bbe\u8ba1\u5728\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u300b\u6587\u6863\u91cc\u9762\u5df2\u7ecf\u6709\u8be6\u7ec6\u63cf\u8ff0\u4e86\uff0c\u8fd9\u91cc\u8d34\u4e00\u4e0b\u6574\u4f53\u7684\u67b6\u6784\u56fe\uff1a \u4e3a\u4e86\u7a81\u663e\u672c\u6587\u7684\u91cd\u70b9\uff0c\u62bd\u53d6\u5176\u4e2d\u91cd\u8981\u529f\u80fd\u6a21\u5757\uff0c\u5982\u4e0b\u56fe\uff1a "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-basic-frame # \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\n\u251c\u2500\u2500 apps # \u5e94\u7528\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-dde-file-manager # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\uff08\u5e94\u7528\u5e93\u8be6\u7ec6\u76ee\u5f55\u7ed3\u6784\u8bf7\u770b\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\uff09\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 tag # \u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u2514\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u2502 \u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 xxx.png\n\u2502 \u2502 ...\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-deepin-music # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 public # \u516c\u5171\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget # dde_dock \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget # dde_desktop \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 src # \u6838\u5fc3\u5e93\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 button_center.py\n\u2502 \u251c\u2500\u2500 cmdtrl.py\n\u2502 \u251c\u2500\u2500 dogtails.py\n\u2502 \u251c\u2500\u2500 find_image.py\n\u2502 \u251c\u2500\u2500 global_config.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 setting # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 config.py\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 global_config.ini\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\u6a21\u5757\uff08Hook\uff09\n\u251c\u2500\u2500 pytest.ini # Pytest \u9ed8\u8ba4\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 docs # \u6587\u6863\u76ee\u5f55\n\u2514\u2500\u2500 manage.py # \u6267\u884c\u5668\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1apps","title":"1\u3001\u5e94\u7528\u5e93\uff08apps\uff09","text":"\u6240\u6709\u5e94\u7528\u5e93\u5747\u653e\u7f6e\u5728\u57fa\u7840\u6846\u67b6\u4e0b\u7684 apps \u76ee\u5f55\u4e0b\uff08\u89c1\u7b2c\u4e8c\u7ae0\u8282\u7b2c3\u6bb5\u76ee\u5f55\u7ed3\u6784\u5185\u5bb9\uff09\u3002\u5e94\u7528\u5e93\u7684\u67b6\u6784\u8bbe\u8ba1\u53ef\u4ee5\u53c2\u8003\u300aAT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b\u6587\u6863\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2src","title":"2\u3001\u6838\u5fc3\u5e93\uff08src\uff09","text":"\u5728 src \u76ee\u5f55\u4e0b\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u5e95\u5c42\u6838\u5fc3\u7ec4\u4ef6\uff0c\u901a\u5e38\u6765\u8bb2\u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5230\u5176\u4e2d\u67d0\u4e00\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4e48\u4f60\u9700\u8981\u663e\u793a\u7684\u5bfc\u5165\u8fd9\u4e2a\u6a21\u5757\uff0c\u7136\u540e\u624d\u80fd\u4f7f\u7528\u8be5\u6a21\u5757\u4e0b\u7684\u529f\u80fd\uff0c\u5982\u679c\u4f60\u7528\u5230\u4e86\u5341\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4f60\u5c31\u9700\u8981\u5bfc\u5165\u5341\u4e2a\u3002\u4f46\u662f\u6211\u4eec\u60f3\u8ba9\u4e8b\u60c5\u53d8\u5f97\u7b80\u5355\uff0c\u4e00\u6b21\u5bfc\u5165\uff0c\u4f7f\u7528\u6240\u6709\u3002 \u5c06\u6240\u6709\u7684\u529f\u80fd\u6a21\u5757\u90fd\u8fdb\u5165\u5230 src \u7684\u540d\u79f0\u7a7a\u95f4\uff0c\u5728 src/__init__.py \u91cc\u9762\u6211\u4eec\u8bbe\u8ba1\u6210\u8fd9\u6837\uff1a # src/__init__.py\nfrom .cmdctl import CmdCtl\nfrom .dogtails import Dogtail\nfrom .find_image import FindImage\nfrom .button_center import ButtonCenter\nclass Src(CmdCtl, FindImage):\ndef __init__(self, **kwargs):\n\"\"\"dogtail or button center param\n :param kwargs: app_name, desc, number\n \"\"\"\nif kwargs:\napp_name = kwargs.get(\"APP_NAME\")\ndesc = kwargs.get(\"DESC\")\nif app_name is None or desc is None:\nraise ValueError\nnumber = kwargs.get(\"number\")\nnumber = number if isinstance(number, int) else -1\n# \u5bf9\u8c61\u7ec4\u5408\nself.dog = Dogtail(app_name, desc, number)\nself.ui = ButtonCenter(app_name, number)\n \u9700\u8981\u4f20\u9012\u53c2\u6570\u7684\u91c7\u7528\u5bf9\u8c61\u7ec4\u5408\uff0c\u6ca1\u6709\u53c2\u6570\u7684\u4f7f\u7528\u7ee7\u627f\uff0c\u7ee7\u627f\u7684\u7c7b\u7b26\u5408 Mixin \u8bbe\u8ba1\u6a21\u5f0f\u3002 \u5e94\u7528\u5e93\u91cc\u9762\u4f7f\u7528\u7684\u65f6\u5019\u5728 widget/base_widget.py \u91cc\u9762\u53ea\u9700\u8981\u552f\u4e00\u7ee7\u627f Src \uff1a # \u5e94\u7528\u5e93\u91cc\u9762\u65b9\u6cd5\u57fa\u7c7b\n# widget/base_widget.py\nfrom src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n \u8981\u4f7f\u7528\u6838\u5fc3\u5e93\u7684\u529f\u80fd\uff0c\u53ea\u9700\u8981\u5199\u4e00\u4e2a\u5bfc\u5165 from src import Src \u5373\u53ef\u3002 \u5199 __init__ \u6784\u9020\u51fd\u6570\u7684\u539f\u56e0\u662f\u901a\u8fc7\u53c2\u6570\u6784\u9020\u5e94\u7528\uff0c\u5e76\u4e14\u4f20\u9012 number \u8fdb\u6765\uff0c\u53ef\u4ee5\u5b9e\u73b0\u591a\u7a97\u53e3\u7684\u63a7\u5236\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3public","title":"3\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09","text":"\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6bcf\u4e2a\u5e94\u7528\u90fd\u662f\u4e00\u4e2a\u5355\u72ec\u7684 py \u6587\u4ef6\uff0c\u76f8\u4e92\u4e4b\u95f4\u662f\u72ec\u7acb\u7684\uff0c\u6bcf\u4e2a py \u6587\u4ef6\u91cc\u9762\u662f\u8be5\u5e94\u7528\u7684\u65b9\u6cd5\u7c7b\uff0c\u6bd4\u5982\uff1a\u6700\u5e38\u7528\u7684\u65b9\u6cd5\u7c7b dde_desktop_public_widget.py # dde_desktop_widget.py\nfrom src import Src\nclass _DdeDesktopPublicBaseWidget(Src):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-desktop\"\nDESC = \"/usr/bin/dde-desktop\"\ndef __init__(self):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC)\nclass DdeDesktopPublicWidget(_DdeDesktopPublicBaseWidget):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u7c7b\"\"\"\ndef click_music_dir_by_ui(self):\n\"\"\"\u5728\u6587\u4ef6\u9009\u62e9\u6846\u70b9\u51fb\u97f3\u4e50\u76ee\u5f55\"\"\"\nself.click(*self.ui.btn_center(\"\u4fa7\u8fb9\u680f-\u97f3\u4e50\")) \ndef click_xxx_by_attr(self):\npass\n \u516c\u5171\u65b9\u6cd5\u5e93\u610f\u4e49\uff1a \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6240\u5c01\u88c5\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\u90fd\u662f\u81f3\u5c11\u88ab2\u4e2a\u5e94\u7528\u90fd\u7528\u5230\u7684\uff0c\u8fd9\u6837\u505a\u53ef\u4ee5\u51cf\u5c11\u6574\u4f53\u4ee3\u7801\u91cf\uff0c\u4ece\u800c\u51cf\u8f7b\u5e94\u7528\u5e93\u4ee3\u7801\u7684\u7ef4\u62a4\u5de5\u4f5c\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u7f16\u5199\u5f62\u5f0f\uff08\u547d\u540d\u89c4\u5219\u3001\u5b9a\u4f4d\u7684\u65b9\u6848\u5199\u6cd5\u3001\u6ce8\u91ca\u7684\u5199\u6cd5\u7b49\u7b49\uff09\u5177\u6709\u4e00\u5b9a\u7684\u6a21\u677f\u4f5c\u7528\uff0c\u8fd9\u6837\u5373\u4f7f\u662f\u5404\u4e2a\u5e94\u7528\u5e93\u90fd\u72ec\u7acb\u7ef4\u62a4\uff0c\u6240\u6709\u7684\u7f16\u7801\u98ce\u683c\u90fd\u662f\u8d8b\u4e8e\u76f8\u540c\u7684\uff0c\u56e0\u4e3a\u5927\u5bb6\u90fd\u5e94\u8be5\u53c2\u7167\u516c\u5171\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u5199\u6cd5\u6765\u5199\u81ea\u5df1\u5e94\u7528\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\u7c7b\uff0c\u8fd9\u6837\u4f7f\u5f97\u4ece\u516c\u53f8\u7684\u89d2\u5ea6\u53bb\u770b\u6240\u6709\u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u90fd\u662f\u7edf\u4e00\u7684\u3002 \u53ef\u4ee5\u901a\u8fc7\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\uff0c\u4e86\u89e3\u5230\u5176\u4ed6\u5e94\u7528\u7684\u529f\u80fd\uff0c\u5bf9\u4e8e\u6211\u4eec\u9700\u6c42\u7406\u89e3\uff0c\u4e86\u89e3\u7cfb\u7edf\u7684\u65b9\u65b9\u9762\u9762\u4e5f\u6709\u597d\u5904\u3002 \u5f53\u7136\uff0c\u5982\u679c\u4f60\u7684\u5e94\u7528\u672c\u8eab\u662f\u5c5e\u4e8e\u6839\u672c\u5c31\u4e0d\u9700\u8981\u548c\u5176\u4ed6\u5e94\u7528\u4ea4\u4e92\u7684\uff0c\u90a3\u4e48\u4f60\u53ef\u80fd\u4e0d\u4f1a\u7528\u5230\u8fd9\u91cc\u9762\u7684\u529f\u80fd\uff0c\u6ca1\u5173\u7cfb\uff0c\u4f60\u6240\u6709\u7684\u65b9\u6cd5\u90fd\u53ef\u4ee5\u76f4\u63a5\u5199\u5728\u5e94\u7528\u5e93\u7684\u4e1a\u52a1\u5c42\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4conftestpy","title":"4\u3001conftest.py","text":"conftest.py \u4ece\u529f\u80fd\u4e0a\u5c06\u662f\u5c5e\u4e8e\u6838\u5fc3\u5e93\uff08src\uff09\u7684\u5185\u5bb9\uff0c\u4f46\u662f\u7531\u4e8e\u5b83\u7684\u7279\u6b8a\u6027\uff0c\u5373\u5b83\u662f\u5bf9\u5e94\u7528\u5e93\u4e2d\u7684\u7528\u4f8b\u751f\u6548\u7684\uff0c\u800c\u4e14\u5b83\u7684\u4f5c\u7528\u57df\u662f\u5f53\u524d\u76ee\u5f55\u53ca\u4ee5\u4e0b\uff0c\u56e0\u6b64\u6211\u4eec\u5c06\u5b83\u653e\u5230\u9879\u76ee\u6839\u76ee\u5f55\u3002\u6211\u4eec\u6846\u67b6\u4e2d\u6709\u4e0d\u5c11\u6838\u5fc3\u529f\u80fd\u90fd\u662f\u5728\u8fd9\u91cc\u9762\u8fdb\u884c\u5f00\u53d1\u7684\uff0c\u540e\u9762\u7b2c\u56db\u7ae0\u4f1a\u8bb2\u5230\u7ec6\u8282\u3002 pytest.ini \u4f5c\u7528\u548c conftest.py \u7c7b\u4f3c\uff0c\u662f Pytest \u6846\u67b6\u7684\u56fa\u5b9a\u914d\u7f6e\u6587\u4ef6\uff0c\u76ee\u524d\u914d\u7f6e\u4e86\u4e00\u4e9b\u901a\u7528\u7684\u547d\u4ee4\u884c\u6267\u884c\u53c2\u6570\uff0c\u4e5f\u653e\u5728\u9879\u76ee\u6839\u76ee\u5f55\u3002 \u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 Hook \u51fd\u6570\uff0capps \u76ee\u5f55\u4e0b\u7684 \u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 fixture \u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5setting","title":"5\u3001setting","text":"\u5168\u5c40\u914d\u7f6e\u6a21\u5757\uff0c\u5305\u542b\u4e86\u4ee5\u4e0b\u914d\u7f6e\u6587\u4ef6\uff1a \uff081\uff09ini \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u914d\u7f6e\u4e00\u4e9b\u5168\u5c40\u7684\u914d\u7f6e\u9879\uff0c\u8b6c\u5982\uff1a\u5931\u8d25\u91cd\u8dd1\u6b21\u6570\u3001\u662f\u5426\u5931\u8d25\u5f55\u5c4f\u3001\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\u3001\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4\u3001\u6267\u884c\u65f6\u65e5\u5fd7\u7ea7\u522b\u3001\u751f\u6210\u7684\u62a5\u544a\u7c7b\u578b\u3001\u4ee5\u53ca\u5206\u5e03\u5f0f\u6267\u884c\u7684\u4e00\u4e9b\u7b56\u7565\u914d\u7f6e\u9879\u7b49\u7b49\u3002 \uff082\uff09config.py \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u63d0\u4f9b\u914d\u7f6e\u6587\u4ef6\u8bfb\u53d6\u3001\u52a8\u6001\u83b7\u53d6\u4e00\u4e9b\u5e38\u91cf\uff08\u5982\u9879\u76ee\u6839\u76ee\u5f55\u7edd\u5bf9\u8def\u5f84 (BASE_DIR)\u3001\u7cfb\u7edf\u67b6\u6784\uff08SYS_FRAME\uff09\u3001\u65f6\u95f4\u5b57\u7b26\u4e32\uff08strftime\uff09\u3001\u672c\u673a USERNAME IP \u7b49\u7b49\uff09\u3001\u516c\u5171 URL \u7b49\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u89c4\u8303","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u7248\u672c\u53ca\u4f9d\u8d56","text":"\u57fa\u7840\u6846\u67b6\u4f1a\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u8fdb\u884c\u7248\u672c\u53d1\u5e03\uff0c\u4e0d\u4e0e\u67d0\u4e2a\u5e94\u7528\u7248\u672c\u7ed1\u5b9a\uff0c\u4f46\u662f\uff0c\u5e94\u7528\u5e93\u4f1a\u4f9d\u8d56\u4e8e\u57fa\u7840\u6846\u67b6\u7684\u7248\u672c\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u5efa\u8bae\u5728\u5e94\u7528\u5e93\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a\u6587\u672c\u6587\u4ef6\u7528\u4e8e\u8bb0\u5f55\u6240\u4f9d\u8d56\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\uff0c\u7c7b\u4f3c\u4e8e\u5f00\u53d1\u5e94\u7528\u7684 debian/control \u6587\u4ef6\u7684\u529f\u80fd\uff0c\u4e3a\u4e86\u4fdd\u6301\u7edf\u4e00\uff0c\u8fd9\u4e2a\u6587\u4ef6\u5c31\u547d\u540d\u4e3a control\uff0c\u653e\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u6838\u5fc3\u5e93\u72ec\u7acb\u6027","text":"\u6838\u5fc3\u5e93\u4e0d\u5efa\u8bae\u9488\u5bf9\u67d0\u4e00\u4e2a\u5e94\u7528\u5355\u72ec\u505a\u4ee3\u7801\u4e0a\u7279\u6b8a\u5904\u7406\uff0c\u901a\u5e38\u8003\u8651\u9488\u5bf9\u67d0\u4e00\u79cd\u573a\u666f\u8fdb\u884c\u5904\u7406\uff0c\u8fd9\u4e9b\u573a\u666f\u901a\u5e38\u662f\u5b58\u5728\u4e00\u4e9b\u5171\u6027\u7684\u3002\u6bd4\u5982\u8bf4\uff1a\u684c\u9762\u7684ID\u5206\u914d\u5b58\u5728\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u903b\u8f91\u5904\u7406\u89e3\u51b3ID\u5206\u914d\u9519\u8bef\u7684\u95ee\u9898\uff0c\u4f46\u662f\u8fd9\u90e8\u5206\u903b\u8f91\u6211\u4eec\u4f1a\u5728\u684c\u9762\u7684\u65b9\u6cd5\u5c42\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u517c\u5bb9\u6027","text":"\u4e3a\u4e86\u4fdd\u6301\u517c\u5bb9\u6027\uff0c\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u539f\u5219\u4e0a\u4e0d\u5bf9\u8001\u65b9\u6cd5\u8fdb\u884c\u4fee\u6539\u6216\u5220\u9664\uff0c\u53ea\u8fdb\u884c\u65b0\u589e\u3002\u6d89\u53ca\u5230\u8001\u65b9\u6cd5\u4fee\u6539\u6216\u5220\u9664\u7684\uff0c\u4f1a\u8fdb\u884c\u63d0\u524d\u9884\u544a\uff0c\u5e76\u5728\u7b2c\u4e8c\u4e2a\u7248\u672c\u4e4b\u540e\uff08\u4e2d\u95f4\u4f1a\u9694\u4e00\u4e2a\u7248\u672c\u8fc7\u5ea6\uff09\u6b63\u5f0f\u5b9e\u65bd\u4fee\u6539\u6216\u5220\u9664\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u547d\u540d\u89c4\u8303","text":" \u7528\u4f8b ID \u6bcf\u4e2a\u5e94\u7528\u81ea\u5df1\u7ef4\u62a4\u4e00\u5957 ID\uff0c\u5728PMS\u4e0a\u7528\u4f8b\u6807\u9898\u4e0a\u5c06\u81ea\u52a8\u5316ID\u4ee5\u6807\u7b7e\u7684\u5f62\u5f0f\u5199\u5165\uff0c\u6bd4\u5982\uff1a[101]\u6253\u5f00-\u542f\u52a8\u5e94\u7528\u540edock\u53f3\u952e\u83dc\u5355 \u4e00\u4e2a\u7528\u4f8b\u7c7b\u91cc\u9762\u6709\u591a\u4e2a\u7528\u4f8b\u65f6\uff0c\u5728\u7528\u4f8b\u540d\u79f0\u540e\u9762\u52a0\u5e8f\u53f7\u3002 class TestFileManager(BaseCase):\n\"\"\"\u6587\u7ba1\u7528\u4f8b\"\"\"\ndef test_xxx_015_1(self):\npass\ndef test_xxx_015_2(self):\npass\n \u6ce8\u610f 015_1\uff0c\u4e0d\u8981\u5199015_01\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 PMS \u4e0a\u7684\u7528\u4f8bID\uff1a PMS \u4e0a\u662f6\u4f4d\u6570\uff0c\u4e0d\u591f\u76f4\u89c2\uff0c\u4e5f\u4e0d\u597d\u7ef4\u62a4\uff0c\u5728\u81ea\u52a8\u5316\u4e0b\u9762\u53bb\u627e\u4e00\u4e2a\u5e26\u6709 6 \u4f4d\u6570\u7684\u6587\u4ef6\u662f\u4e00\u4e2a\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 PMS \u4e0a\u7684 ID \u53ef\u80fd\u4f1a\u53d1\u751f\u53d8\u5316\uff0c\u6bd4\u5982\u5bfc\u51fa\u6765\u5bfc\u8fdb\u53bb\u7684\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u5b58\u5728\u95ee\u9898\uff0c\u5982\u679c\u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u8981\u60f3\u627e\u51fa\u6765\u5bf9\u5e94\u4fee\u6539\u81ea\u52a8\u5316\u7528\u4f8b ID\uff0c\u5c06\u4f1a\u662f\u4ef6\u975e\u5e38\u75db\u82e6\u7684\u4e8b\u60c5\u3002 \u51fd\u6570\u547d\u540d\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5de6\u952e\u70b9\u51fb click \u53f3\u952e\u70b9\u51fb right_click \u53cc\u51fb double_click \u79fb\u52a8 move_to \u62d6\u52a8 drag \u65b0\u5efa new \u62d6\u52a8\u5230 drag_to \u4ece\u54ea\u91cc\u62d6\u52a8\u5230\u54ea\u91cc drag_something_from_xxx_to_xxx \u83b7\u53d6 get \u83b7\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5750\u6807 get_location \u975e\u7279\u6b8a\u6587\u4ef6 file word\u6587\u4ef6 doc text\u6587\u4ef6 text \u6587\u4ef6\u5939 dir \u5173\u952e\u8bcd\u6301\u7eed\u589e\u52a0 \u5e38\u91cf\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5e94\u7528\u540d\u79f0 APP_NAME \u5e94\u7528\u63cf\u8ff0 DESC \u672c\u5e94\u7528\u4ee5\u5916\u7684\u5176\u4ed6\u5e94\u7528\uff0c\u6bd4\u5982\u5e2e\u52a9 HELP \u5176\u4ed6\u540d\u79f0\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u65b9\u6cd5\u5305\u540d widget \u65b9\u6cd5\u6587\u4ef6\u540d\uff08\u6587\u7ba1\u4e3e\u4f8b\uff09 dfm_widget.pytitle_widget.pyright_view_widget.pyleft_view_widget.pypop_widget.pybase_widget.pydfm_assert.py \u65ad\u8a00\u8bed\u53e5\u547d\u540d\u89c4\u8303 \u65ad\u8a00\u8bed\u53e5\u90fd\u662f\u4ee5 assert \u5f00\u5934 \u65ad\u8a00 \u8bed\u53e5 \u5224\u65ad\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_existsassert_file_not_exists \u5224\u65ad\u684c\u9762\u76ee\u5f55\u4e0b\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_exists_in_desktopassert_file_not_exists_in_desktop \u5224\u65ad\u56fe\u7247\u5b58\u5728 assert_image_existsassert_image_not_exists \u5224\u65ad\u5f71\u9662\u4e2d\u662f\u5426\u5b58\u5728\u56fe\u7247 assert_image_exists_in_movieassert_image_not_exists_in_movie \u5224\u65ad\u5143\u7d20\u662f\u5426\u5b58\u5728 assert_element_existassert_element_not_exist \u5224\u65ad\u662f\u5426\u76f8\u7b49 assert_equalassert_not_equal \u5224\u65ad\u662f\u5426\u4e3a\u771f assert_trueassert_false"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5fixture","title":"5\u3001fixture \u89c4\u8303","text":"\u7531\u4e8e Pytest \u6846\u67b6\u4e2d\u652f\u6301 fixture \u7684\u5199\u6cd5\u548c Xunit \u5199\u6cd5\u7684\uff0c\u6240\u4ee5\u5e94\u7528\u5e93\u4e2d\u53ef\u80fd\u5b58\u5728\u6df7\u7528\u7684\u60c5\u51b5\uff0c\u4e3a\u7edf\u4e00\u7f16\u7801\u98ce\u683c\u65b9\u4fbf\u540e\u7eed\u7528\u4f8b\u4ee3\u7801\u7ef4\u62a4\uff0c\u73b0\u505a\u4ee5\u4e0b\u89c4\u8303\u8bf4\u660e\uff1a \u629b\u5f03 Xunit \u7684\u5199\u6cd5\uff0c\u7edf\u4e00\u91c7\u7528 Pytest fixture \u7684\u5199\u6cd5\u3002 \u5e94\u7528\u5185 fixture \u8c28\u614e\u4f7f\u7528 autouse=True \uff0c\u975e\u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u975e\u5e38\u4e0d\u5efa\u8bae\u4f7f\u7528\u8fd9\u4e2a\u53c2\u6570\u3002 \u8c03\u7528 fixture \u4e0d\u80fd\u4f7f\u7528 @pytest.mark.usefixture()\uff0c\u4f7f\u7528\u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u4f20\u5165\u51fd\u6570\u5bf9\u8c61\u3002 \u5efa\u8bae\u5728\u4e00\u4e2a conftest.py \u91cc\u9762\u53bb\u5199\uff0c\u4e00\u4e2a\u5e94\u7528\u4e5f\u5c3d\u91cf\u7ef4\u62a4\u4e00\u4e2a conftest.py\u6587\u4ef6\u3002 fixture \u4e5f\u9700\u8981\u5199\u529f\u80fd\u8bf4\u660e\uff0c\u51fd\u6570\u540d\u79f0\u8981\u6709\u5177\u4f53\u542b\u4e49\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#6","title":"6\u3001\u65b9\u6cd5\u7f16\u5199\u89c4\u8303","text":" \u65b9\u6cd5\u7c7b\u578b\uff1a if \u6ca1\u6709\u7528\u5230\u5b9e\u4f8b\u5bf9\u8c61\uff1a\nif \u6ca1\u6709\u7528\u5230\u7c7b\u5bf9\u8c61\uff1a\n\u5199\u9759\u6001\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @staticmethod\nelse\uff1a\n\u5199\u7c7b\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @classmethod\nelse:\n\u76f4\u63a5\u5199\u5b9e\u4f8b\u65b9\u6cd5\n \u4e3e\u4f8b: class TitleWidget:\ndef click_xxx_by_ui(self):\npass\n@staticmethod\ndef click_xxx_by_ui():\npass\n@classmethod\ndef click_xxx_by_ui(cls):\npass\n \u51fd\u6570\u540d\u79f0\u4e0d\u51fa\u73b0\u6570\u5b57\uff0c\u9700\u8981\u8868\u793a\u6570\u91cf\u7684\u7528\u5355\u8bcd\u8868\u793a\u3002 \u51fd\u6570\u529f\u80fd\u6ce8\u91ca\u3002 \u6ca1\u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg2:xxx\n\"\"\"\n \u6709\u53c2\u6570\uff0c\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg1:xxx\nreturn: xxx\n\"\"\"\n \u200b \u7528 Pycharm \u7684\u6ce8\u91ca\u6a21\u677f\u4e5f\u53ef\u4ee5\uff0c\u53ea\u8981\u4f53\u73b0\u4e86\u53c2\u6570\u7684\u7c7b\u578b\u548c\u8fd4\u56de\u5c31\u884c\u4e86\u3002 \u6682\u4e0d\u8981\u6c42\u5199\u7c7b\u578b\u6ce8\u89e3\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#7case","title":"7\u3001\u7528\u4f8b\uff08case\uff09\u89c4\u8303","text":" \u4ee5\u7c7b\u7684\u5f62\u5f0f\u5199\u7528\u4f8b\uff0c\u7528\u4f8b\u7c7b\u96c6\u6210\u7528\u4f8b\u57fa\u7c7b\u3002 \u7528\u4f8b\u7c7b\u9700\u8981\u5199\u6ce8\u91ca\u3002 \u6d4b\u8bd5\u7528\u4f8b\u51fd\u6570\u8bf4\u660e\uff08\u5efa\u8bae\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u540d\u79f0\uff09 \"\"\"\u53f3\u4fa7\u9884\u89c8-\u56fe\u7247\u7c7b\u578b\u4fe1\u606f\u680f\u57fa\u672c\u4fe1\u606f\"\"\"\n \u4e0d\u5199\u8c03\u8bd5\u4ee3\u7801 if __name__ == '__main__':\npytest.main()\n \u6240\u6709\u7528\u4f8b\u90fd\u7ee7\u627f BaseCase\u3002 BaseCase \u91cc\u9762\u653e\u4e00\u4e9b\u6d4b\u8bd5\u6570\u636e\u7684\u5e38\u91cf\uff0c\u6bd4\u5982\u6587\u4ef6\u540d\u79f0\uff0c\u5e94\u7528\u540d\u79f0\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u4e00\u4e9b\u901a\u7528\u7684\u5b57\u7b26\u4e32\u3002 \u8fd9\u7c7b\u662f\u5c5e\u4e8e\u6d4b\u8bd5\u6570\u636e\u3002 class BaseCase(DfmAssert):\n\"\"\"\u7528\u4f8b\u57fa\u7c7b\"\"\"\nNEW_FILE = \"\u65b0\u5efa\u6587\u672c.txt\"\nTEST_FILE = \"test.txt\"\nNEW_DIR = \"\u65b0\u5efa\u6587\u4ef6\u5939\"\nNEW_WORD = \"\u65b0\u5efaWord\u6587\u6863.doc\"\nAPP_HELP = \"damn\"\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\n\"\"\"\u7528\u4f8b\u6807\u9898\uff08\u590d\u5236PMS\u4e0a\u7528\u4f8b\u6807\u9898\uff09\"\"\"\ndfm = DfmWidget()\ndfm.click_xxx_by_attr(self.NEW_FILE)\ndfm.new_file_in_desktop_by_cmd(self.NEW_FILE)\nself.assert_true(dfm.get_process_status(self.APP_NAME))\n \u7528\u4f8b\u91cc\u9762\u5c3d\u91cf\u51cf\u5c11\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\uff0c\u66f4\u8981\u51cf\u5c11\u76f8\u540c\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\u3002 \u7edf\u4e00\u6587\u4ef6\u6ce8\u91ca\u5934\u3002 #!/usr/bin/env python3\n# _*_ coding:utf-8 _*_\n\"\"\"\n:Author:email@uniontech.com\n:Date :${DATE} ${TIME}\n\"\"\"\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#8","title":"8\u3001\u5176\u4ed6\u89c4\u8303","text":" \u65e5\u5fd7\u6253\u5370\u8981\u5728\u65b9\u6cd5\u6700\u524d\u9762\uff0c\u5426\u5219\u4ee3\u7801\u62a5\u9519\u6ca1\u6709\u65e5\u5fd7\u8f93\u51fa\uff0c\u4e0d\u597d\u5b9a\u4f4d\u95ee\u9898\u3002\uff08\u6211\u4eec\u4f1a\u8003\u8651\u7ee7\u7eed\u4f7f\u7528\u62e6\u622a\u5668\u6253\u5370\u65e5\u5fd7\uff09 \u6240\u6709\u7684\u64cd\u4f5c\u90fd\u9700\u8981\u6709\u65e5\u5fd7\uff0c\u5305\u62ec sleep()\uff0c\u6211\u4eec\u4f1a\u91cd\u5199\u4e00\u4e2a\u6709\u65e5\u5fd7\u8f93\u5165\u7684 sleep\u3002 \u4e1a\u52a1\u5c42\u65e5\u5fd7\u7ea7\u522b\u4e3a INFO\u3002 hook \u51fd\u6570\u53ea\u80fd\u5199\u5230\u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u91cc\u9762\u3002 apps \u76ee\u5f55\u4e0b\u7684 conftest.py \u539f\u5219\u4e0a\u4e0d\u4f1a\u65b0\u589e fixture\u3002 \u56fa\u5b9a\u76ee\u5f55\u6216\u5143\u7d20\u63a7\u4ef6\u7684\u64cd\u4f5c\uff0c\u5c06\u64cd\u4f5c\u65b9\u6cd5\u5199\u6b7b\uff0c\u6587\u4ef6\u7c7b\u64cd\u4f5c\u5c06\u6587\u4ef6\u540d\u7559\u53c2\u6570\u3002 \u8def\u5f84\u62fc\u63a5\u89c4\u8303\uff1a \u7cfb\u7edf\u4e2d\u56fa\u5b9a\u76ee\u5f55\uff0c\u8def\u5f84\u62fc\u63a5\u65f6\u4f7f\u7528\u6ce2\u6d6a\u7b26\u53f7\uff0c\u6bd4\u5982\uff1a~/Desktop/\uff0c\u4e0b\u5c42\u4f7f\u7528 os.path.expanduser()\uff0c\u5b83\u53ef\u4ee5\u81ea\u52a8\u8bc6\u522b\u6ce2\u6d6a\u7b26\u53f7\u3002 \u9879\u76ee\u4e0b\u8def\u5f84\u4f7f\u7528\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u8def\u5f84\uff0c\u6bd4\u5982\uff1aConfig.BASE_PATH\uff0c\u56e0\u4e3a\u9879\u76ee\u662f\u53ef\u4ee5\u5728\u4efb\u610f\u8def\u5f84\u8fd0\u884c\u7684\uff0c\u9700\u8981\u52a8\u6001\u62fc\u63a5\u8def\u5f84\u3002 "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848","text":"# =================================================\n# Author : Mikigo\n# Time : 2022/3/16\n# version \uff1a1.0\n# =================================================\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"AT \u5e94\u7528\u5e93\u6539\u9020\u662f\u57fa\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u8fdb\u884c\u7528\u4f8b\u65b9\u6cd5\u548c\u4e1a\u52a1\u903b\u8f91\u7684\u91cd\u65b0\u8bbe\u8ba1\uff0c\u4ee5\u5b9e\u73b0\u5e94\u7528\u5e93\u9ad8\u6548\u7684\u7f16\u5199\u3001\u7ef4\u62a4\u7528\u4f8b\u53ca\u5176\u65b9\u6cd5\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u6587\u4ef6\u7ba1\u7406\u5668\u4ece\u4e1a\u52a1\u590d\u6742\u5ea6\u548c\u7528\u4f8b\u91cf\u6765\u8bb2\uff0c\u5728\u7cfb\u7edf\u6240\u6709\u5e94\u7528\u4e2d\uff0c\u662f\u5f88\u6709\u4ee3\u8868\u6027\u7684\uff0c\u96be\u5ea6\u4e5f\u662f\u6700\u5927\u7684\uff0c\u56e0\u6b64\u6211\u4eec\u9009\u53d6\u6587\u4ef6\u7ba1\u7406\u5668\u4f5c\u4e3a\u5e94\u7528\u5e93\u6539\u9020\u7684\u5b9e\u9a8c\u5e94\u7528\uff0c\u7ed9\u540e\u7eed\u5176\u4ed6\u5e94\u7528\u6539\u9020\u63d0\u4f9b\u5207\u5b9e\u53ef\u884c\u7684\u601d\u8def\u548c\u65b9\u6848\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u5206\u5c42\u8bbe\u8ba1\u56fe","text":"\u6574\u4f53\u4ecd\u7136\u9075\u5faa PO \u8bbe\u8ba1\u7406\u5ff5\uff0c\u6839\u636e\u4e1a\u52a1\u9700\u8981\uff0c\u5c06\u6587\u7ba1\u4e1a\u52a1\u5c42\u8fdb\u884c 3 \u5c42\u5212\u5206\uff1a "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-dde-file-manager # \u5e94\u7528\u4ed3\u5e93\n\u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 test_xxx_001.py\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u00a0\u251c\u2500\u2500 __init__.py\n\u2502 \u00a0\u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u00a0\u251c\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u00a0\u251c\u2500\u2500 base_widget.py # \u65b9\u6cd5\u57fa\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 title_widget.py # title \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 right_view_widget.py # right view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 left_view_widget.py # left view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 pop_widget.py # pop \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 dfm_widget.py # \u65b9\u6cd5\u7684\u7edf\u4e00\u51fa\u53e3\n\u2502 \u00a0\u2514\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 tag # \u7528\u4f8b\u6807\u7b7e\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 xxx.csv # \u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2514\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u57fa\u7c7b","text":" \u7ee7\u627f\u6838\u5fc3\u5c42\u7684\u5404\u4e2a\u6a21\u5757\u7c7b\u3002 \u62bd\u53d6\u64cd\u4f5c\u5c42\u7684\u4e00\u4e9b\u57fa\u7840\u65b9\u6cd5\u3002 \u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u7684\u4e00\u4e9b\u516c\u5171\u65b9\u6cd5\u3002 \u8def\u5f84\u7ec4\u88c5\u65b9\u6cd5\u3002 \u4e00\u4e9b\u4e1a\u52a1\u5c42\u76f8\u5173\u7684\u53d8\u91cf\u3001\u5e38\u91cf\u3001shell\u547d\u4ee4\u3001\u5750\u6807\u3002 \u65b9\u6cd5\u57fa\u7c7b\u7684\u5199\u6cd5\uff1a from src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u64cd\u4f5c\u5c42","text":" \u6a21\u5757\u5212\u5206 \u6309\u7167\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u6587\u7ba1\u4e3b\u754c\u9762\u5206\u4e3a\u4e09\u4e2a\u533a\u57df\uff1a\u6807\u9898\u680f\u3001\u53f3\u8fb9\u89c6\u56fe\u533a\u57df\u3001\u5de6\u8fb9\u89c6\u56fe\u533a\u57df \u5f39\u7a97\uff1a\u8bbe\u7f6e\u754c\u9762\u5f39\u7a97\u3001\u4fdd\u9669\u7bb1\u5f39\u7a97\u3001\u5220\u9664\u786e\u8ba4\u5f39\u7a97\u3001\u53ca\u5404\u79cd\u7f51\u7edc\u5f39\u7a97 \u53f3\u952e\u83dc\u5355\uff1a\u6682\u65f6\u4e0d\u8003\u8651\u4e3a\u5355\u72ec\u7684\u6a21\u5757\uff0c\u8003\u8651\u4ee5\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6848\u505a\u6210\u516c\u5171\u5e93\u3002 \u5404\u4e2a\u6a21\u5757\u53ea\u7ee7\u627f\u57fa\u7c7b from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u6784\u9020\u51fd\u6570\u91cc\u9762\u4e0d\u6784\u9020\u5bf9\u8c61\uff0c\u53ef\u4ee5\u521d\u59cb\u5316\u4e00\u4e9b\u53d8\u91cf\u3002 \u4e0d\u540c\u7684\u5b9a\u4f4d\u65b9\u6848\u8c03\u7528\u4e0d\u540c\u7684\u5b9a\u4f4d\u5de5\u5177\u5bf9\u8c61\u3002 self.dog\nself.ui\nself.d_bus\n \u65b9\u6cd5\u7f16\u5199 \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u5e94\u7528\u5c42","text":" \u7ee7\u627f\u64cd\u4f5c\u5c42\u7684\u6240\u6709\u7c7b\u3002 \u4ec5\u4ec5\u7528\u4e8e\u7528\u4f8b\u4e2d\u5bfc\u5165\u65b9\u4fbf\uff0c\u4e0d\u505a\u5176\u4ed6\u4e8b\u60c5\u3002 class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n DfmAssert \u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u7ee7\u627f\uff0c\u65b9\u4fbf\u4f7f\u7528\u65ad\u8a00\u8bed\u53e5\u3002 from apps.dde_file_manager.widget.dfm_widget import DfmWidget\nfrom public.assert import Assert\nclass DfmAssert(Assert):\ndef assert_file_exists_in_desktop(self, file_name):\nself.assert_file_exists(f\"~/Desktop{file_name}\")\n...\nDfmWidget().get_file_in_desktop()\n \u7528\u4f8b\u91cc\u9762\u76f4\u63a5\u7ee7\u627f\uff0c\u65b9\u4fbf\u5728\u7528\u4f8b\u91cc\u9762\u4f7f\u7528 self \u8fdb\u884c\u65ad\u8a00\uff0c\u66f4\u7b26\u5408\u65ad\u8a00\u7684\u4f7f\u7528\u4e60\u60ef\uff0c\u7528\u4f8b\u903b\u8f91\u4e0a\u66f4\u6e05\u695a\u3002 class BaseCase(DfmAssert):\npass\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\nself.assert_file_exists_in_desktop(\"xxx\")\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u903b\u8f91\u4e3e\u4f8b","text":"\u7528\u4f8b\u4ee3\u7801\u8c03\u7528\u903b\u8f91\u4e3e\u4f8b\uff1a # BaseWidget\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n# =============================================\n# TitleWidget\nclass TitleWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_title_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# RightViewWidget\nclass RightViewWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_right_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# =============================================\n# \u51fa\u53e3 DfmWidget\nclass DfmWidget(TitleWidget, RightViewWidget):\npass\n# =============================================\n# in case\nfrom apps.dde_file_manager.widget.dfm_widget import DfmWidget\ndfm = DfmWidget()\ndfm.click_xxx_title_by_ui()\ndfm.click_xxx_right_by_ui()\ndfm.dog.print_desc()\ndfm.ui.print_number()\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u5de5\u7a0b\u6539\u9020\u5b9e\u65bd\u6b65\u9aa4","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_2","title":"1\u3001\u5de5\u7a0b\u4ee3\u7801\u62c9\u53d6","text":"1.1. \u5c06\u81ea\u52a8\u5316\u57fa\u7840\u6846\u67b6\u7684\u529f\u80fd\u62c9\u5230\u672c\u5730 Autotest Basic Frame \uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame 1.2. \u5c06\u5e94\u7528\u5e93\u4ee3\u7801\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u5e94\u7528\u5e93\u7684\u4ed3\u5e93\u547d\u540d\u5e94\u8be5\u662f\u957f\u8fd9\u6837\u7684 autotest_deepin_xxx\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_2","title":"2\u3001\u8c03\u6574\u5de5\u7a0b\u76ee\u5f55","text":"\u6309\u7167 \u65b9\u6848\u8bbe\u8ba1-\u76ee\u5f55\u7ed3\u6784 \u8fdb\u884c\u76ee\u5f55\u8c03\u6574\uff0c\u5c3d\u91cf\u4f7f\u7528\u7f16\u8f91\u5668\u8fdb\u884c\u76f8\u5e94\u7684\u8c03\u6574\uff0c\u7f16\u8f91\u5668\u63a8\u8350\u4f7f\u7528 Pycharm \uff0c\u4ee5\u4e0b\u64cd\u4f5c\u5747\u5728 Pycharm \u91cc\u9762\u53ef\u5b9e\u73b0\u3002 2.1. \u9700\u8981\u79fb\u52a8 py \u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u76f4\u63a5\u5728\u7f16\u8f91\u5668\u91cc\u9762\uff0c\u4f7f\u7528\u9f20\u6807\u9009\u4e2d\u5e76\u6309\u4f4f\uff0c\u4e4b\u540e\u62d6\u52a8\u5230\u76ee\u6807\u4f4d\u7f6e\u5373\u53ef\uff0cPycharm \u4f1a\u5c3d\u53ef\u80fd\u7684\u81ea\u52a8\u89e3\u51b3\u79fb\u52a8\u5bfc\u81f4\u7684\u8def\u5f84\u95ee\u9898\u3002\u6ce8\u610f\uff0c\u6211\u8bf4\u7684\u662f\u201c\u5c3d\u53ef\u80fd\u201d\uff0c\u6709\u4e9b\u9a9a\u64cd\u4f5c\u7f16\u8f91\u5668\u662f\u65e0\u6cd5\u81ea\u52a8\u5904\u7406\u7684\u3002\u5982\u679c\u6ca1\u6709\u88ab\u7f16\u8f91\u5668\u81ea\u52a8\u5904\u7406\u7684\u8def\u5f84\u95ee\u9898\uff0c\u540e\u7eed\u53ea\u80fd\u624b\u52a8\u89e3\u51b3\u3002 2.2. \u9700\u8981\u91cd\u547d\u540d\u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u5728\u7f16\u8f91\u5668\u91cc\u9762\u9009\u4e2d\u6587\u4ef6\uff0c\u7136\u540e\u4f7f\u7528\u5feb\u6377\u952e Shift + F6 \uff08\u5982\u679c\u5feb\u6377\u952e\u6ca1\u53cd\u5e94\uff0c\u6587\u4ef6\u53f3\u952e\u83dc\u5355 Refactor \u2014\u2014 Rename\uff09\uff0c\u7136\u540e\u5728\u8f93\u5165\u6846\u4e2d\u8f93\u5165\u8981\u91cd\u547d\u540d\u7684\u540d\u79f0\uff0c\u540c\u65f6\uff0c\u786e\u8ba4\u52fe\u9009 Search for references \u548c Search in comments and strings \u8fd9\u4e24\u4e2a\u9009\u9879\uff0c\u6700\u540e\u6309\u56de\u8f66\u6216\u8005\u9f20\u6807\u70b9 Refactor \u3002 \u6ce8\u610f\uff0c\u6b64\u65f6\u7f16\u8f91\u5668\u53ef\u80fd\u4f1a\u63d0\u793a\u4f60\uff0c\u4f60\u8fd9\u4e2a\u91cd\u547d\u540d\u7684\u64cd\u4f5c\u5173\u8054\u4e86\u591a\u4e2a\u6a21\u5757\uff0c\u5b83\u88ab\u591a\u4e2a\u5730\u65b9\u90fd\u4f7f\u7528\u5230\u4e86\uff0c\u76f8\u5173\u7684\u6a21\u5757\u662f\u5426\u4e5f\u4e00\u8d77\u6539\u540d\u4e86\uff0c\u8fd9\u4e0d\u5e9f\u8bdd\u5417\uff0c\u7528\u8fd9\u4e2a\u529f\u80fd\u5c31\u662f\u60f3\u628a\u5173\u8054\u5230\u7684\u90fd\u4fee\u6539\uff0c\u4e0d\u7136\u6211\u4e3a\u4ec0\u4e48\u4e0d\u7528\u6587\u7ba1\u7684\u91cd\u547d\u540d\u529f\u80fd\u5462\uff0c\u522b\u60f3\u4e86\uff0c\u76f4\u63a5\u70b9\u5de6\u4e0b\u89d2\u7684 Refactor \u6309\u94ae\uff0c\u5c31\u662f\u5e72\u3002 \u7c7b\u540d\u3001\u51fd\u6570\u540d\u7684\u91cd\u547d\u540d\u90fd\u5c3d\u91cf\u91c7\u7528\u8fd9\u79cd\u65b9\u6848\uff0c\u56e0\u4e3a\u7f16\u8f91\u5668\u4f1a\u81ea\u52a8\u7ed9\u6211\u4eec\u627e\u5230\u5173\u8054\u7684\u5730\u65b9\uff0c\u7136\u540e\u540c\u6b65\u4fee\u6539\u6389\u3002\u4f60\u53ef\u5343\u4e07\u522b\u76f4\u63a5\u5220\u4e86\u4fee\u6539\u540d\u79f0\uff0c\u4e0d\u7136\u4f60\u53ef\u80fd\u4f1a\u82b1\u4e0a\u4e00\u5929\u7684\u65f6\u95f4\u6765\u89e3\u51b3\u91cd\u547d\u540d\u7684\u95ee\u9898\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u5b9e\u73b0\u6838\u5fc3\u5e93\u63a5\u53e3","text":"3.1. BaseWidget \u5728 BaseWidget \u91cc\u9762\u628a\u8be5\u5199\u7684\u90fd\u5199\u597d\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u4e0a\u9762\u7684\u8bbe\u8ba1\u7406\u5ff5\u6765\u5199\u3002 \u5982\u679c\u4f60\u5acc\u9ebb\u70e6\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u6587\u7ba1\u7684\u5b9e\u9645\u5de5\u7a0b\u4ee3\u7801 autotest_dde_file_manager : https://gerrit.uniontech.com/admin/repos/autotest_dde_file_manager \u3002 3.2. \u64cd\u4f5c\u5c42 \u5982\u679c\u4f60\u662f\u65b0\u5199\u9879\u76ee\uff0c\u4f60\u4f1a\u53d1\u73b0\u4e00\u5207\u90fd\u662f\u90a3\u4e48\u7684\u7b80\u5355\u3001\u76f4\u63a5\uff0c\u6309\u7167\u6211\u4eec\u63d0\u4f9b\u7ed9\u4f60\u7684\u63a5\u53e3\u5199\u7528\u4f8b\u7684\u64cd\u4f5c\u65b9\u6cd5\u5c31\u597d\u4e86\u3002 \u5982\u679c\u4f60\u662f\u60f3\u5bf9\u539f\u6765\u7684\u5de5\u7a0b\u8fdb\u884c\u6539\u9020\uff0c\u4f60\u9700\u8981\u6309\u7167\u6838\u5fc3\u5e93\u65b9\u6cd5\u7684\u8c03\u7528\uff0c\u5c06\u4f60\u4e4b\u524d\u5199\u7684\u6bcf\u4e2a\u65b9\u6848\u8fdb\u884c\u5bf9\u5e94\u7684\u4fee\u6539\uff0c\u5305\u62ec\u7c7b\u548c\u65b9\u6cd5\u7684\u547d\u540d\u3001\u65b9\u6cd5\u5185\u6240\u8981\u7528\u5230\u4e0d\u540c\u5b9a\u4f4d\u65b9\u6cd5\u7684\u5199\u6cd5\u4fee\u6539\u3002 \u8fd9\u65f6\u5019\u4f60\u53ef\u80fd\u4f60\u7684\u4ee3\u7801\u4e2d\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u62a5\u9519\uff0c\u4e0d\u7528\u62c5\u5fc3\uff0c\u4f60\u53ef\u4ee5\u4ece\u4e1a\u52a1\u903b\u8f91\u51fa\u53d1\uff0c\u60f3\u6e05\u695a\u8fd9\u4e2a\u65b9\u6cd5\u662f\u5e72\u4ec0\u4e48\u7684\u3001\u64cd\u4f5c\u7684\u5bf9\u8c61\u662f\u4ec0\u4e48\u3001\u53c2\u6570\u662f\u4ec0\u4e48\uff0c\u6ce8\u610f\u8fd9\u4e9b\u4fee\u6539\u662f\u4f1a\u5f71\u54cd\u5230\u7528\u4f8b\u4ee3\u7801\u91cc\u9762\u7684\uff0c\u6ca1\u5173\u7cfb\uff0c\u7528\u4f8b\u91cc\u9762\u672c\u6765\u4e5f\u5e94\u8be5\u88ab\u5173\u8054\u4fee\u6539\u3002 3.3. \u628a\u914d\u7f6e\u6a21\u5757\u5199\u597d\uff0c\u8fd9\u90e8\u5206\u57fa\u672c\u53ef\u4ee5\u590d\u5236\u6587\u7ba1\u7684\u4ee3\u7801\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4_1","title":"4\u3001\u8def\u5f84\u5904\u7406","text":"4.1. \u5bfc\u5165\u8def\u5f84 \u65b9\u6cd5\u548c\u7528\u4f8b\u4e2d\u90fd\u4f1a\u6d89\u53ca\u5230\u5bfc\u5165\u8def\u5f84\u7684\u4fee\u6539\uff0c\u5728\u4fee\u6539\u8def\u5f84\u65f6\uff0c\u5efa\u8bae\u4f60\u4f7f\u7528 Ctrl + Shift + R \u5168\u5c40\u66ff\u6362\uff0c\u4f1a\u5c06\u6574\u4e2a\u9879\u76ee\u4e0b\u7684\u76f8\u540c\u5730\u65b9\u90fd\u4fee\u6539\u5230\uff0c\u5f53\u7136\uff0c\u4f60\u4e5f\u53ef\u4ee5\u5728\u5c0f\u5f39\u7a97\u4e2d\u4fee\u6539\u5168\u5c40\u66ff\u6362\u4e3a\u5c40\u90e8\u76ee\u5f55\u4e0b\u66ff\u6362\u3002\u5904\u7406\u90a3\u79cd\u6ca1\u6709\u5173\u8054\u5173\u7cfb\uff0c\u4f46\u662f\u53c8\u662f\u76f8\u540c\u540d\u79f0\u7684\u91cd\u547d\u540d\uff0c\u6211\u4e5f\u63a8\u8350\u4f7f\u7528\u8fd9\u79cd\u65b9\u5f0f\u8fdb\u884c\u91cd\u547d\u540d\u3002 \u6ce8\u610f\uff0c\u5168\u5c40\u66ff\u6362\u7684\u65b9\u5f0f\u4efb\u7136\u65e0\u6cd5\u4fdd\u8bc1\u771f\u7684\u5168\u5c40\u88ab\u66ff\u6362\u4e86\uff08\u53ef\u80fd\u662f\u7f16\u8f91\u5668\u7684 Bug \u5427\uff09\uff0c\u6240\u4ee5\u4f60\u4ecd\u7136\u9700\u8981\u624b\u52a8\u770b\u4e0b\u5404\u5904\u662f\u5426\u4fee\u6539\u5230\u4f4d\u3002 4.2. \u8d44\u6e90\u8def\u5f84 \u4e00\u4e9b\u7528\u4f8b\u8d44\u6e90\u9700\u8981\u6839\u636e config.py \u91cc\u9762\u7684\u8def\u5f84\u914d\u7f6e\u8fdb\u884c\u8d44\u6e90\u8def\u5f84\u7684\u62fc\u63a5\uff0c\u5982\u679c\u4f60\u539f\u6765\u672c\u6765\u5c31\u6709\u4e00\u4e2a\u51fd\u6570\u4e13\u95e8\u7528\u4e8e\u7ec4\u88c5\u8def\u5f84\u7684\uff0c\u90a3\u4f60\u53ea\u9700\u8981\u4fee\u6539\u8fd9\u4e00\u4e2a\u5730\u65b9\u5c31\u597d\u4e86\uff0c\u5982\u679c\u4f60\u4e4b\u524d\u5e76\u6ca1\u6709\u8fd9\u6837\u7684\u8bbe\u8ba1\uff0c\u90a3\u53ef\u80fd\u9700\u8981\u4fee\u6539\u5927\u91cf\u6d89\u53ca\u5230\u8d44\u6e90\u8def\u5f84\u7684\u5730\u65b9\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5","title":"5\u3001\u8c03\u8bd5\u548c\u7f16\u5199\u7528\u4f8b","text":"\u4ee5\u4e0a\u51e0\u4e2a\u6b65\u9aa4\u505a\u5b8c\uff0c\u57fa\u672c\u5c31\u53ef\u4ee5\u8fdb\u884c\u7528\u4f8b\u4ee3\u7801\u7684\u8c03\u8bd5\u4e86\uff0c\u8fd9\u90e8\u5206\u5de5\u4f5c\u4e3b\u8981\u89e3\u51b3\u4f60\u4e4b\u524d\u51e0\u4e2a\u6b65\u9aa4\u9057\u6f0f\u7684\u95ee\u9898\uff0c\u5982\u679c\u6240\u6709\u7528\u4f8b\u90fd\u8c03\u8bd5\u901a\u8fc7\u4e86\uff0c\u90a3\u4e48\u5de5\u7a0b\u6539\u9020\u5c31\u5168\u90e8\u5b8c\u6210\u4e86\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/","title":"AT \u5f00\u53d1\u89c4\u8303","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u5f00\u53d1\u89c4\u8303\u662f\u6839\u636e\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fd0\u884c\u4e24\u5e74\u591a\u6765\uff0c\u9047\u5230\u95ee\u9898\u89e3\u51b3\u95ee\u9898\u800c\u5f62\u6210\u7684\u4e00\u4e9b\u89e3\u51b3\u65b9\u6848\uff0c\u6216\u8005\u8bf4\u7ecf\u9a8c\u603b\u7ed3\uff1b\u8fd9\u4e9b\u7ecf\u9a8c\u7b26\u5408\u6211\u4eec\u73b0\u9636\u6bb5 AT \u6240\u5e94\u7528\u7684\u573a\u666f\u9700\u8981\uff0c\u4e5f\u662f\u6211\u4eec\u7ecf\u8fc7\u957f\u671f\u601d\u8003\uff0c\u4e0d\u65ad\u8bd5\u9519\u4e0d\u65ad\u4fee\u6b63\uff0c\u5e76\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u5b9e\u8df5\u4e2d\u68c0\u9a8c\u8fc7\u53ef\u884c\u7684\u3002\u4ee5\u6b64\uff0c\u5e0c\u671b\u80fd\u5e2e\u52a9\u53c2\u4e0e\u5230\u81ea\u52a8\u5316\u7684\u76f8\u5173\u4eba\u5458\u51cf\u5c11\u8bd5\u9519\u6210\u672c\uff0c\u66f4\u597d\u3001\u66f4\u5feb\u7684\u7f16\u5199\u7528\u4f8b\u53ca\u7ef4\u62a4\u7528\u4f8b\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_1","title":"\u4e00\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u89c4\u8303","text":"\u6807\u7b7e\u5316\u7ba1\u7406\u6587\u6863\u8bf7\u53c2\u8003\uff1a \u300a\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u64cd\u4f5c\u6307\u5f15\u300b \u4ee5\u4e0b\u8bf4\u51e0\u4e2a\u5bb9\u6613\u51fa\u73b0\u7684\u95ee\u9898\uff1a"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1","title":"1. \u5bf9\u5e94\u5173\u7cfb","text":" \u5199\u5b8c\u81ea\u52a8\u5316\u7528\u4f8b\u4e4b\u540e\uff0c\u8bf7\u5728 CSV \u6587\u4ef6\u4e2d\u6807\u8bb0\u7528\u4f8b\u7684 ID\u3001\u7b49\u7ea7\u3002\u4e3a\u4e86\u63d0\u9192\u6807\u8bb0\uff0c\u6267\u884c\u7528\u4f8b\u65f6\u5728\u9996\u884c\u4f1a\u8f93\u51fa ERROR \u65e5\u5fd7\uff1a CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94\u7684 ID\uff1b \u5728\u6700\u7ec8\u63d0\u4ea4\u4ee3\u7801\u4e4b\u524d\uff0c\u4f60\u9700\u8981\u5728 CSV \u6587\u4ef6\u91cc\u9762\u5c06ID\u3001\u7528\u4f8b\u7b49\u7ea7\u7b49\u6807\u7b7e\u8865\u5168\uff0c\u5982\u679c CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94 ID\uff0c\u540e\u7eed\u5728\u6279\u91cf\u6267\u884c\u7684\u65f6\u5019\uff0c\u8fd9\u4e9b\u7528\u4f8b\u662f\u4e0d\u4f1a\u6267\u884c\u7684\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2","title":"2. \u540d\u79f0\u4e00\u81f4","text":" CSV \u6587\u4ef6\u7684\u6587\u4ef6\u540d\u3001\u7528\u4f8b\u51fd\u6570\u4e2d\u95f4\u7684\u540d\u79f0\u4e00\u81f4\u3001\u7528\u4f8b py \u6587\u4ef6\u4e2d\u95f4\u7684\u540d\u79f0\uff0c\u8fd9\u4e09\u4e2a\u540d\u79f0\u4e00\u81f4\u3002 \u4e3e\u4f8b\uff1a # test_music_001.py\ndef test_music_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u90a3\u4e48 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e3a music.csv\u3002 AT \u6846\u67b6\u5e95\u5c42\u4ee3\u7801\u5b9e\u73b0\u662f\u5c06 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e0e\u7528\u4f8b\u51fd\u6570\u540d\u79f0\u540d\u79f0\uff08item.name\uff09\u8fdb\u884c\u5bf9\u5e94\uff0c\u56e0\u6b64\uff0c\u6ce8\u610f CSV \u6587\u4ef6\u540d\u79f0\u5bf9\u5e94\u7684\u662f\u7528\u4f8b\u51fd\u6570\u540d\u79f0\uff0c\u5373 def test_music_001 \u91cc\u9762\u7684 music \uff0c\u800c\u4e0d\u662f test_music_001.py \u91cc\u9762\u7684 music \u3002 \u8fd9\u91cc\u7ec6\u7ec6\u54c1\u4e00\u4e0b\u54c8~ \u5982\u679c\u4f60\u5c06\u4e0a\u4f8b\u5199\u6210\u4e86\u8fd9\u6837: # test_music_001.py\ndef test_movie_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u7528\u4f8b\u6267\u884c\u6ca1\u95ee\u9898\uff0c\u4f46\u662f\u6807\u7b7e\u5316\u7ba1\u7406\u662f\u4e0d\u751f\u6548\u7684\uff0c\u6846\u67b6\u65e0\u6cd5\u5c06 music.csv\u6587\u4ef6\u91cc\u9762\u6807\u7b7e\uff0c\u6dfb\u52a0\u5230 test_movie_001\u8fd9\u4e2a\u7528\u4f8b\u4e2d\uff0c\u56e0\u4e3a\u4ed6\u4eec\u6ca1\u6709\u5bf9\u5e94\u5173\u7cfb\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#tag","title":"\u4e8c\u3001\u5206\u652f\u53ca tag \u7ba1\u7406\u89c4\u8303","text":"\u53c2\u8003\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u4ee3\u7801\u7ba1\u7406\u89c4\u8303\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2-tag","title":"2. \u5e94\u7528\u5e93 tag","text":" \u5e94\u7528\u5e93 tag \u6839\u636e\u5e94\u7528\u4ea4\u4ed8\u8282\u70b9\u751f\u6210\uff0c\u6bcf\u6b21\u6253 tag \u4e4b\u524d\uff0c\u76f8\u5173\u6d4b\u8bd5\u4eba\u5458\u9700\u8981\u8fdb\u884c\u7528\u4f8b\u8c03\u8bd5\uff1b \u8c03\u8bd5\u7528\u4f8b\u662f\u6307\u7684\u5728\u5168\u67b6\u6784\uff08x86\u3001arm\u3001mips\uff09\u4e0a\u8c03\u8bd5\u901a\u8fc7\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\u8fbe\u5230 90% \u4ee5\u4e0a\u624d\u80fd\u6253 tag\uff0c\u901a\u8fc7 Jenkins \u6267\u884c\u5668\u6267\u884c\u7528\u4f8b\uff0c\u4fdd\u7559\u901a\u8fc7\u7387\u7ed3\u679c\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\uff1a\u901a\u8fc7\u7528\u4f8b\u6570 / (\u603b\u7528\u4f8b\u6570 - \u5df2\u5e9f\u5f03\u7528\u4f8b) \u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u7b97\u901a\u8fc7 Jenkins \u6267\u884c\u5668 \u4f60\u53ef\u80fd\u4f1a\u5728\u4e00\u4e2a\u4ea4\u4ed8\u5468\u671f\u5185\u6301\u7eed\u7684\u8fdb\u884cAT\u7528\u4f8b\u8c03\u8bd5\uff0c\u4f46\u662f\u6700\u7ec8 AT \u7528\u4f8b\u6253 tag \u7684\u5e94\u7528\u7248\u672c\uff0c\u9700\u8981\u4f7f\u7528\u5e94\u7528\u96c6\u6210\u4ea4\u4ed8\u7684\u6700\u65b0\u5e94\u7528\u7248\u672c\uff0c\u53ef\u4ee5\u4f7f\u7528\u5e94\u7528\u7684\u63d0\u6d4b\u7248\u672c\uff1b\u4e00\u5b9a\u8981\u786e\u4fdd\u8c03\u8bd5\u7528\u4f8b\u7684\u5e94\u7528\u7248\u672c\u662f\u6700\u65b0\u7684\uff0c\u4e0d\u7136\u96c6\u6210\u8fdb\u53bb\u4e4b\u540e\uff0c\u6301\u7eed\u96c6\u6210\u5c31\u4f1a\u51fa\u95ee\u9898\uff1b tag \u53f7\u600e\u4e48\u6253\uff1f \u6839\u636e\u6301\u7eed\u96c6\u6210\u7684\u8981\u6c42\u751f\u6210\uff0c\u5176\u4e2d\u5e94\u7528\u7248\u672c\u53f7\u9700\u8981\u4e0e\u9879\u76ee\u7ecf\u7406\u786e\u8ba4\u672c\u6b21\u5373\u5c06\u96c6\u6210\u7684\u5e94\u7528\u7248\u672c\u53f7\u662f\u591a\u5c11\uff1b tag \u7684 commit \u4fe1\u606f\u683c\u5f0f\uff1a # commit msg\nversion:5.6.5\n \u5176\u4e2d 5.6.5 \u5199\u5e94\u7528\u7684\u96c6\u6210\u7248\u672c\u53f7\u3002 \u751f\u6210 tag \u7684\u547d\u4ee4\u53c2\u8003\uff1a\u300aGit \u6807\u7b7e\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3-tag","title":"3. \u57fa\u7840\u6846\u67b6 tag","text":"\u57fa\u7840\u6846\u67b6 tag \u4e0d\u4e0e\u4e1a\u52a1\u6302\u94a9\uff0c\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u6309\u9700\u53d1\u5e03\u7248\u672c\uff0c\u5728\u6839\u76ee\u5f55\u4e0b CURRENT \u6587\u4ef6\u4e2d\u8bb0\u5f55\u7684\u5f53\u524d\u7248\u672c\u53f7\u548c\u5386\u53f2\u7248\u672c\u53f7\uff0c\u53ca\u5176\u5bf9\u5e94\u65b0\u589e\u4e86\u54ea\u4e9b\u529f\u80fd\uff0c\u6709\u52a9\u4e8e\u5e94\u7528\u9009\u62e9\u5408\u9002\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\u3002 # CURRENT\n[current]\ntag = 0.9.5\n \u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u7684 control \u6587\u4ef6\u8bb0\u5f55\u5f53\u524d\u5e94\u7528\u5e93\u4f9d\u8d56\u7684\u57fa\u7840\u5e93\u7248\u672c\u3002 # control\n[Depends]\nautotest-basic-frame = 0.9.5\n \u7528\u4f8b\u5728\u6267\u884c\u65f6\u4f1a\u6821\u9a8c\u4e24\u4e2a\u6587\u4ef6\u7684\u7248\u672c\u53f7\u662f\u5426\u4e00\u81f4\uff0c\u5982\u679c\u4e0d\u4e00\u81f4\uff0c\u4f1a\u6253\u5370 error \u65e5\u5fd7\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_2","title":"\u4e09\u3001\u4ed3\u5e93\u6743\u9650\u7ba1\u7406","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_1","title":"1. \u57fa\u7840\u6846\u67b6","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u4ed3\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame \u57fa\u7840\u6846\u67b6\u4e0d\u5141\u8bb8\u533f\u540d\u8bbf\u95ee\uff0c\u5982\u679c\u4f60\u767b\u5f55 gerrit \u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u8bbf\u95ee\u4ee5\u4e0a\u94fe\u63a5\uff0c\u5219\u9700\u8981\u7533\u8bf7\u8bbf\u95ee\u6743\u9650\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_1","title":"2. \u5e94\u7528\u4ed3\u5e93","text":" \u81ea\u52a8\u5316\u5e94\u7528\u4ed3\u5e93\uff1a https://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684 app_name \u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_3","title":"\u56db\u3001\u65b9\u6cd5\u7f16\u5199&\u8c03\u7528\u89c4\u8303","text":"\u65b9\u6cd5\u7f16\u5199\u6574\u4f53\u8bbe\u8ba1\u601d\u8def\u53c2\u8003\uff1a[\u300aAT\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b]"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_2","title":"1. \u65b9\u6cd5\u7f16\u5199","text":"\u5199\u65b9\u6cd5\u7684\u65f6\u5019\u6ce8\u610f\u65b9\u6cd5\u5f52\u5c5e\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget\uff0c\u65b9\u6cd5\u662f\u5728\u54ea\u4e2a\u533a\u57df\u64cd\u4f5c\u7684\uff0c\u5c31\u5199\u5728\u54ea\u4e2a\u7c7b\u91cc\u9762\u3002 \u4e3e\u4f8b\uff1a from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n\"\"\"\u70b9\u51fb\u6807\u9898\u680fxxx\"\"\"\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_2","title":"2. \u65b9\u6cd5\u8c03\u7528","text":" \u5728\u7528\u4f8b\u4e2d\u8c03\u7528\u65b9\u6cd5\uff0c\u901a\u8fc7\u8be5\u5e94\u7528\u552f\u4e00\u7684\u51fa\u53e3\u8fdb\u884c\u8c03\u7528\uff0c\u6bd4\u5982\u6587\u7ba1\uff1a class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n \u4e0d\u8981\u5728\u7528\u4f8b\u4e2d\u5355\u72ec\u53bb\u8c03\u7528 TitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u8fd9\u4e9b\u7c7b\uff0c\u5426\u5219\u540e\u671f\u7528\u4f8b\u4f1a\u53d8\u5f97\u4e0d\u597d\u7ef4\u62a4\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_4","title":"\u4e94\u3001\u7528\u4f8b\u7f16\u5199\u89c4\u8303","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_3","title":"1. \u57fa\u4e8e\u7c7b\u5199\u7528\u4f8b","text":"\u6240\u6709\u7528\u4f8b\u90fd\u5e94\u8be5\u57fa\u4e8e\u7c7b\u53bb\u5199\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001(self):\n\"\"\"\u97f3\u4e50\u542f\u52a8\"\"\"\n \u6ce8\u610f\u4ee5\u4e0b\u51e0\u70b9\uff1a \u7c7b\u540d\u4e0d\u8981\u968f\u4fbf\u53d6\uff0c\u540c\u4e00\u4e2a\u5e94\u7528\u5e94\u8be5\u4f7f\u7528\u540c\u4e00\u4e2a\u7c7b\u540d\uff0c\u7528\u4f8b\u7c7b\u540d\u79f0\u5fc5\u987b\u4ee5 Test \u5f00\u5934\uff0c\u9075\u5faa\u5927\u9a7c\u5cf0\u547d\u540d\u89c4\u8303\uff1b \u7528\u4f8b\u7c7b\u7ee7\u627f BaseCase\uff0c\u4e00\u4e2a\u5e94\u7528\u53ea\u6709\u4e00\u4e2a BaseCase \u4e00\u4e2a py \u6587\u4ef6\u91cc\u9762\u53ea\u6709\u4e00\u4e2a\u7c7b\uff0c\u6211\u4eec\u79f0\u4e3a\u4e00\u4e2a\u6d4b\u8bd5\u7c7b\uff1b \u4e00\u4e2a\u7c7b\u91cc\u9762\u53ef\u4ee5\u6709\u591a\u4e2a\u7528\u4f8b\u51fd\u6570\uff0c\u8fd9\u53d6\u51b3\u8fd9\u6761\u7528\u4f8b\u6709\u591a\u5c11\u4e2a\u6d4b\u8bd5\u70b9\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001_1(self):\n\"\"\"\u4efb\u52a1\u680f\u542f\u52a8\u97f3\u4e50\"\"\"\ndef test_music_001_2(self):\n\"\"\"\u542f\u52a8\u5668\u542f\u52a8\u97f3\u4e50\"\"\" \ndef test_music_001_3(self):\n\"\"\"\u684c\u9762\u542f\u52a8\u97f3\u4e50\"\"\"\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_3","title":"2. \u7528\u4f8b\u51fd\u6570\u89c4\u8303","text":" \u7528\u4f8b\u51fd\u6570\u4ee5 test \u5f00\u5934\uff0c\u9075\u5faa\u86c7\u5f62\u547d\u540d\u89c4\u8303\uff0c\u4e2d\u95f4\u4e3a\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0\uff0c\u540e\u9762\u52a0\u7528\u4f8b ID\uff0c\u6700\u540e\u52a0\u6d4b\u8bd5\u70b9\u5e8f\u53f7\uff0c\u5373 test_${module}_${case_id}[_${index}] \uff1b \u6bd4\u5982\uff1atest_music_001_1\uff0cindex \u4ece 1 \u5f00\u59cb\u3002 \u51fd\u6570\u529f\u80fd\u8bf4\u660e\u91cc\u9762\u5199\u7528\u4f8b\u6807\u9898\uff0c\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u6807\u9898\u5373\u53ef\uff0c\u6ce8\u610f\u7528\u4e09\u5bf9\u53cc\u5f15\u53f7\uff0c\u4e0d\u8981\u7528\u5176\u4ed6\u6ce8\u91ca\uff0c\u66f4\u4e0d\u8981\u7528\u4e95\u53f7\u6ce8\u91ca\u5199\u7528\u4f8b\u6807\u9898\uff1b \u76f4\u63a5\u590d\u5236 PMS \u7528\u4f8b \u7528\u4f8b\u6b65\u9aa4\u76f4\u63a5\u5c06 PMS \u4e0a\u7528\u4f8b\u6b65\u9aa4\u548c\u9884\u671f\u590d\u5236\u8fdb\u6765\uff0c\u7136\u540e\u8fdb\u884c\u6279\u91cf\u6ce8\u91ca\uff08ctrl + /\uff09\uff0c\u5728\u6ce8\u91ca\u7684\u57fa\u7840\u4e0a\u53bb\u5199\u7528\u4f8b\u811a\u672c\u4f1a\u66f4\u52a0\u65b9\u4fbf\u5168\u9762\uff0c\u4e5f\u6bd4\u4f60\u81ea\u5df1\u5199\u6ce8\u91ca\u66f4\u8282\u7ea6\u65f6\u95f4\uff1a \u4e3e\u4f8b\uff0cPMS \u7528\u4f8b\uff1a \u76f4\u63a5\u9009\u4e2d\u7528\u4f8b\u5185\u5bb9\uff0c\u590d\u5236\u4e0b\u6765\uff0c\u7136\u540e\u7c98\u8d34\u5230\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c\u4e2d\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\n \u4e0a\u4f8b\u4e2d\u4e95\u53f7\u6ce8\u91ca\u90e8\u5206\u5c31\u662f\u76f4\u63a5\u4ece PMS \u4e0a\u590d\u5236\u8fc7\u6765\u7684\uff0c\u5728\u6b64\u57fa\u7840\u4e0a\u5199\u7528\u4f8b\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\nmusic = DeepinMusicWidget()\nmusic.click_singer_btn_in_music_by_ui()\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\nmusic.click_icon_mode_in_music_by_ui()\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\nmusic.double_click_first_singer_in_singer_icon_view_by_ui()\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\nself.assert_xxx\n \u4f60\u770b\uff0c\u975e\u5e38\u6e05\u695a\u6bcf\u4e00\u6b65\u5728\u505a\u4ec0\u4e48\uff0c\u91cd\u70b9\u662f\u7701\u53bb\u4e86\u5199\u6ce8\u91ca\u7684\u65f6\u95f4\uff0c\u771f\u7684\u7092\u9e21\u65b9\u4fbf\u3002 \u4e0d\u5199 if __name__ == '__main__':\uff0c\u4e0d\u5199\u591a\u4f59\u7684\u4ee3\u7801\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3","title":"3. \u6570\u636e\u9a71\u52a8","text":" \u5982\u679c\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u662f\u76f8\u540c\u7684\uff0c\u53ea\u662f\u4e00\u4e9b\u53c2\u6570\u53d8\u5316\uff0c\u5c3d\u91cf\u4f7f\u7528\u6570\u636e\u9a71\u52a8\u6765\u5b9e\u73b0\u7528\u4f8b\uff1b \u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u6570\u636e\u9a71\u52a8\u7684\u6570\u636e\uff0c\u4e0d\u80fd\u56e0\u6b64\u5f15\u5165\u4f9d\u8d56\uff0c\u5c3d\u91cf\u4f7f\u7528\u4e00\u4e9b\u6807\u51c6\u5e93\u80fd\u8bfb\u53d6\u7684\u6587\u4ef6\u683c\u5f0f\uff0c\u6bd4\u5982 json\u3001ini\u3001CSV\u3001xml\u3001txt \u7b49\u6587\u4ef6\u683c\u5f0f\uff1b\u4e0d\u5efa\u8bae\u4f7f\u7528 Yaml\u3001Excel\u3001MySQL \u7b49\u6570\u636e\u683c\u5f0f\uff1b \u8bfb\u53d6\u6570\u636e\u65f6\u4e5f\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff0c\u5982\u4f7f\u7528 pandas \u5904\u7406 CSV \u5c31\u5c5e\u4e8e\u5927\u6750\u5c0f\u7528\u4e86\uff0c\u6b63\u5e38\u7684\u6570\u636e\u9a71\u52a8\u8fd8\u6ca1\u5230\u9700\u8981\u5927\u6570\u636e\u5206\u6790\u6765\u5904\u7406\u7684\u5730\u6b65\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u5728 widget/ddt/ \u76ee\u5f55\u4e0b\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5199\u6cd5\uff1a @pytest.mark.parametrize(\"value\", data)\ndef test_smb_049(self, value):\n \u4ee5\u4e0a\u8fd9\u79cd\u53c2\u6570\u5316\u7684\u5199\u6cd5\u672c\u8eab\u6ca1\u4ec0\u4e48\u95ee\u9898\uff0c\u4f46\u662f\uff0c\u8fd9\u91cc\u5fc5\u987b\u8981\u8865\u5145\u4e00\u4e2a\u6ca1\u6709\u7528\u7684\u5c0f\u77e5\u8bc6\uff1a \u5982\u679c\u53c2\u6570\u5316\u6570\u636e\u91cc\u9762\u7684\u5b57\u7b26\u4f1a\u539f\u5c01\u4e0d\u52a8\u7684\u8f93\u51fa\u5230 item.name \u91cc\u9762\uff0c\u663e\u793a\u975e\u5e38\u4e0d\u4f18\u96c5\uff0c\u800c\u4e14\u53ef\u4ee5\u4f1a\u5f15\u5165\u4e00\u4e9b\u610f\u60f3\u4e0d\u5230\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u611f\u53d7\u4e00\u4e0b\uff1a \u53c2\u6570\uff1a data = [\n\"\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\", \"qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678\",\n]\n \u73b0\u8c61\u662f\u8fd9\u6837\u8272\u513f\u7684\uff1a test_smb_049.py::TestFileManager::test_smb_049[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09]\ntest_smb_049.py::TestFileManager::test_smb_049[qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui]\ntest_smb_049.py::TestFileManager::test_smb_049[12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678]\n \u8bf4\u5b9e\u8bdd\uff0c\u770b\u7740\u5fc3\u91cc\u5835\u5f97\u614c\uff0c\u5982\u679c\u8fd9\u91cc\u9762\u5305\u542b\u4e00\u4e9b\u7279\u6b8a\u5b57\u7b26\u6216\u8005\u662f\u8d85\u957f\uff0c\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u5f88\u5947\u5999\u7684\u4e8b\u60c5\u53d1\u751f\u3002 parametrize \u91cc\u9762\u6709\u4e2a\u53c2\u6570\uff1aids\uff0c\u53ef\u4ee5\u89e3\u51b3\u6b64\u7c7b\u95ee\u9898\uff0c\u5c31\u50cf\u8fd9\u6837\uff1a @pytest.mark.parametrize(\"value\", data, ids=[1, 2, 3])\ndef test_smb_049(self, value):\n \u518d\u6765\u611f\u53d7\u4e00\u4e0b\uff1a test_smb_049.py::TestFileManager::test_smb_049[1]\ntest_smb_049.py::TestFileManager::test_smb_049[2]\ntest_smb_049.py::TestFileManager::test_smb_049[3]\n \u660e\u663e\u597d\u591a\u4e86\uff0c\u6240\u4ee5\u5c3d\u91cf\u4f7f\u7528 ids \u8fd9\u4e2a\u53c2\u6570\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 fixture \u7684\u6570\u636e\u9a71\u52a8\u65b9\u5f0f\uff0c\u6846\u67b6\u867d\u7136\u652f\u6301\uff0c\u4f46\u53ef\u8bfb\u6027\u6bd4\u8f83\u5dee\uff1b\u5982\u679c\u4f60\u4e0d\u77e5\u9053\u8fd9\u53e5\u8bdd\u5728\u8bf4\u5565\uff0c\u90a3\u4f60\u53ef\u4ee5\u5ffd\u7565\uff0c\u6211\u4e5f\u4e0d\u6253\u7b97\u8be6\u7ec6\u8bf4\u8fd9\u79cd\u5b9e\u73b0\u65b9\u5f0f\uff0c\u64cd\u4f5c\u6bd4\u8f83\u9a9a\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4","title":"4. \u65ad\u8a00\u8d44\u6e90","text":" \u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u76f4\u63a5\u653e\u5728\u7528\u4f8b\u6a21\u5757\u7684\u540c\u7ea7\u76ee\u5f55\u4e0b\u7684 assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0 + \u7528\u4f8b ID \u547d\u540d\uff1b \u56fe\u50cf\u8bc6\u522b\u65ad\u8a00\uff0c\u4e0d\u8981\u622a\u53d6\u4e00\u5f20\u5f88\u5927\u7684\u56fe\uff0c\u56fe\u7247\u8d44\u6e90\u5305\u542b\u7684\u5143\u7d20\u592a\u591a\u4e86\uff0c\u975e\u5e38\u5bb9\u6613\u53d7\u5230\u9700\u6c42\u5f71\u54cd\uff0c\u5efa\u8bae\u662f\u8fdb\u884c\u5c40\u90e8\u7684\u65ad\u8a00\uff1b \u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u5339\u914d\u5ea6\u662f 0.9\uff0c\u5982\u679c\u65ad\u8a00\u7684\u573a\u666f\u5bf9\u4e8e\u7cbe\u786e\u5ea6\u8981\u6c42\u6ca1\u90a3\u4e48\u9ad8\uff0c\u53ef\u4ee5\u5728\u65ad\u8a00\u8bed\u53e5\u91cc\u9762\u4f20\u5165\u5c0f\u4e8e 0.9 \u7684\u53c2\u6570\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5","title":"5. \u5143\u7d20\u5b9a\u4f4d","text":" \u7528\u4e8e\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u4e2d\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u547d\u540d\u4e3a\u8be5\u5143\u7d20\u7684\u540d\u79f0\uff1b \u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u622a\u53d6\u65f6\u5c3d\u91cf\u7cbe\u786e\u5230\u8fd9\u4e2a\u5177\u4f53\u7684\u6309\u94ae\uff0c\u56fe\u7247\u4e5f\u4e0d\u8981\u592a\u5927\uff1b \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u64cd\u4f5c\u8f83\u5feb\uff0c\u5408\u7406\u52a0\u5165\u7b49\u5f85\u65f6\u95f4\u80fd\u63d0\u9ad8\u7528\u4f8b\u7684\u7a33\u5b9a\u6027\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6","title":"6. \u7528\u4f8b\u8d44\u6e90","text":" \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u4f7f\u7528\u5230\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u6bd4\u5982\u97f3\u4e50\u53ef\u80fd\u9700\u8981\u4e00\u4e9b mp3 \u7684\u8d44\u6e90\u7528\u4e8e\u6d4b\u8bd5\uff0c\u5b58\u653e\u5728 widget/case_res \u76ee\u5f55\u4e0b\uff0c\u524d\u63d0\u662f\u8fd9\u4e9b\u8d44\u6e90\u4e0d\u8d85\u8fc7 10M\uff1b \u5982\u679c\u662f\u4e00\u4e9b\u6bd4\u8f83\u5927\u7684\u8d44\u6e90\uff0c\u5efa\u8bae\u653e\u5230\u7edf\u4e00\u7684 ftp \u670d\u52a1\u5668 \uff08ftp://10.8.10.245\uff09\uff0c\u9700\u8981\u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\u518d\u4e0b\u8f7d\u4e0b\u6765\uff1b f\"wget ftp://{Config.FTP_IP}/uploads/\u591a\u5a92\u4f53/\u5f71\u9662/auto/{file_name};unzip {file_name};rm -rf {file_name};\"\n \u6d4b\u8bd5\u8d44\u6e90\u4e0b\u8f7d\u5230\u5e94\u7528 widget/case_res \u76ee\u5f55\u4e0b\uff1b \u7981\u6b62\u5c06\u6d4b\u8bd5\u8d44\u6e90\u5b58\u653e\u5728\u4e2a\u4eba\u7684\u673a\u5668\u4e0a\uff1b \u5e94\u8be5\u5c3d\u91cf\u4fdd\u8bc1\uff0c\u4e00\u4e2a\u8d44\u6e90\u5728\u4e00\u6b21\u7528\u4f8b\u6267\u884c\u4e2d\u53ea\u9700\u8981\u4e0b\u8f7d\u4e00\u6b21\uff0c\u6240\u4ee5\u4f60\u4e0d\u80fd\u6bcf\u6b21\u4f7f\u7528\u7684\u65f6\u5019\u90fd\u53bb\u4e0b\u8f7d\uff0c\u8fd9\u6837\u53ef\u80fd\u4f1a\u8017\u8d39\u5927\u91cf\u7684\u7f51\u7edc\u8d44\u6e90\uff0c\u800c\u56e0\u4e3a\u5148\u5224\u65ad\u672c\u5730\u662f\u5426\u5b58\u5728\u6b64\u8d44\u6e90\uff0c\u5982\u679c\u4e0d\u5b58\u5728\u518d\u53bb\u4e0b\u8f7d\uff1b \u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u5c06\u8d44\u6e90\u62f7\u8d1d\u5230\u5bf9\u5e94\u7684\u6d4b\u8bd5\u76ee\u5f55\u4e0b\uff0c\u6bd4\u5982\u5c06 mp3 \u6587\u4ef6\u62f7\u8d1d\u5230 ~/Music \u76ee\u5f55\u4e0b\uff0c\u4f46\u662f\u6211\u4eec\u66f4\u5efa\u8bae\u4f60\u4f7f\u7528\u53d1\u9001\u5feb\u6377\u94fe\u63a5\u7684\u65b9\u5f0f\u66ff\u4ee3\u62f7\u8d1d\u7684\u64cd\u4f5c\uff0c\u56e0\u4e3a\u5728\u62f7\u8d1d\u5927\u6587\u4ef6\u65f6\u662f\u5f88\u6d88\u8017\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u800c\u521b\u5efa\u94fe\u63a5\u5219\u4e0d\u4f1a\uff1b @classmethod\ndef recovery_many_movies_in_movie_by_cmd(cls):\n\"\"\"\u6062\u590d\u591a\u4e2a\u89c6\u9891\u6587\u4ef6\u81f3\u89c6\u9891\u76ee\u5f55\u4e2d\"\"\"\nwork_path = f\"/home/{Config.USERNAME}/Videos/auto\"\ncode_path = f\"{Config.CASE_RES_PATH}/auto\"\ncls.run_cmd(f\"rm -rf {work_path};mkdir {work_path}\")\nsleep(1)\nflag = False\nif not exists(code_path):\ncls.run_cmd(f\"mkdir -p {code_path}\")\nflag = True\nlogger.info(f\"ln -s {code_path}/* {work_path}/\")\ncls.run_cmd(\nf\"cd {code_path}/;\"\nf\"{cls.wget_file('auto.zip') if flag else ''}\"\nf\"ln -s {code_path}/* {work_path}/ > /dev/null 2>&1\"\n)\n \u8d44\u6e90\u4e0b\u8f7d\u8fc7\u7a0b\u4e2d\u6ce8\u610f\u8d85\u65f6\u7684\u95ee\u9898\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u5f88\u5927\uff0c\u8981\u7279\u522b\u6ce8\u610f\u8fd9\u95ee\u9898\uff0c\u5982\u679c\u4f60\u4f7f\u7528\u5f3a\u5236\u7b49\u5f85\u4e0b\u8f7d\u7ed3\u675f( os.system )\uff0c\u53ef\u80fd\u4f1a\u9020\u6210\u7528\u4f8b\u6267\u884c\u65f6\u957f\u53d8\u5f97\u4e0d\u53ef\u63a5\u53d7\uff0c\u76ee\u524d\u6211\u4eec\u53d1\u73b0\u5728\u6301\u7eed\u96c6\u6210\u73af\u5883\u6267\u884c\u65f6\u7f51\u7edc\u4e0b\u8f7d\u901f\u5ea6\u5f88\u6162\uff0c\u6240\u4ee5\u8d85\u65f6\u673a\u5236\u662f\u5f88\u6709\u5fc5\u8981\u7684\uff1brun_cmd \u65b9\u6cd5\u6709\u4e00\u4e2a\u9ed8\u8ba4\u8d85\u65f6\u7684\u65f6\u95f4\uff0c\u4f60\u53ef\u4ee5\u6839\u636e\u8d44\u6e90\u5927\u5c0f\u5bf9\u8d85\u65f6\u65f6\u95f4\u8fdb\u884c\u8c03\u6574\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_5","title":"\u516d\u3001\u7528\u4f8b\u8c03\u8bd5\u6280\u5de7","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_4","title":"1. \u65e5\u5fd7","text":" \u4e00\u5b9a\u8981\u5148\u770b\u62a5\u9519\uff0c\u770b error \u65e5\u5fd7\uff0c\u901a\u5e38\u80fd\u660e\u786e\u7684\u544a\u8bc9\u4f60\u5177\u4f53\u54ea\u91cc\u4ee3\u7801\u62a5\u9519\uff1b \u7ed3\u5408\u62a5\u9519\u70b9\u524d\u9762\u7684error\u3001 info \u548c debug \u65e5\u5fd7\u770b\u5426\u662f\u6b63\u5e38\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_4","title":"2. \u65ad\u70b9\u8c03\u8bd5","text":" \u65b9\u6cd5\u62a5\u9519\uff1a \u5728\u65b9\u6cd5\u5e93\u4e2d\u627e\u5230\u5bf9\u5e94\u7684\u65b9\u6cd5\uff0c\u5355\u72ec\u8c03\u7528\uff0c\u770b\u662f\u5426\u80fd\u6b63\u5e38\u6267\u884c\uff1b \u901a\u5e38\u5355\u4e2a\u65b9\u6cd5\u7684\u6267\u884c\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u62a5\u9519\uff0c\u5f88\u5feb\u5c31\u80fd\u6392\u67e5\u51fa\u95ee\u9898\uff1b\u5728\u65b9\u6cd5\u5185\u90e8\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u65b9\u6cd5\u5185\u90e8\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u8c03\u7528\u6ca1\u95ee\u9898\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u62a5\u9519\u7684\u65b9\u6cd5\u524d\u9762\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u7528\u4f8b\u7684\u4e1a\u52a1\u903b\u8f91\u548c\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u65ad\u8a00\u62a5\u9519\uff1a \u65ad\u8a00\u4e3a\u6570\u636e\u65ad\u8a00\uff0c\u6839\u636e\u8868\u8fbe\u5f0f\u8fdb\u884c\u65ad\u8a00\u8bed\u53e5\u8fdb\u884c\u4fee\u6539\uff1b \u6587\u4ef6\u751f\u6210\u7c7b\u65ad\u8a00\uff0c\u67e5\u770b\u662f\u5426\u9700\u8981\u52a0\u7b49\u5f85\u65f6\u95f4\uff1b \u56fe\u50cf\u65ad\u8a00\uff0c\u5728\u65ad\u8a00\u8bed\u53e5\u5904\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u7528\u4f8b\u8fd0\u884c\u5230\u65ad\u8a00\u5904\u4f1a\u505c\u6b62\uff0c\u67e5\u770b\u6b64\u65f6\u65ad\u8a00\u7684\u56fe\u7247\u4e0e\u7528\u4f8b\u6267\u884c\u7684\u73b0\u573a\u5b58\u5728\u4ec0\u4e48\u5dee\u5f02\uff0c\u6b64\u65f6\u4e5f\u53ef\u4ee5\u8fdb\u884c\u91cd\u65b0\u622a\u56fe\uff0c\u4ece\u800c\u66ff\u6362\u65b0\u7684\u56fe\u7247\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3_1","title":"3. \u8fdc\u7a0b\u6267\u884c","text":" \u8fdc\u7a0b\u6267\u884c\u6307\u7684\u662f\u7f16\u8f91\u5668\u901a\u8fc7\u6307\u5b9a\u8fdc\u7a0b\u89e3\u91ca\u5668\u6267\u884c\u81ea\u52a8\u5316\u4ee3\u7801\uff1b \u8fdc\u7a0b\u6267\u884c\u7684\u597d\u5904\u662f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u7684 Debug \u8fd0\u884c\uff0c\u4e0d\u7528\u5728\u6d4b\u8bd5\u673a\u4e0a\u6253\u5f00\u7f16\u8f91\u5668\uff0c\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u66f4\u5feb\uff1b \u652f\u6301\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u7684\u7f16\u8f91\u5668\uff1a \u4e13\u4e1a\u7248 Pycharm VScode \uff0c\u9700\u8981\u4f7f\u7528\u63d2\u4ef6 Remote-SSH \u8fdc\u7a0b\u6267\u884c\u914d\u7f6e \u4ee5 Pycharm \u4e3a\u4f8b\uff1a File \u2014> Settings \u2014> Project \u2014> Python Interpreter \u2014> \u53f3\u8fb9\u8bbe\u7f6e\u6309\u94ae \u2014> Add... \u2014> SSH Interpreter \u2014> New server configuration(\u586b\u5165host\u548cusername) \u2014> Next \u2014> password\uff08\u6d4b\u8bd5\u673a\u5bc6\u7801\uff09 \u2014> Interpreter(\u9009\u62e9\u8fdc\u7a0b\u89e3\u91ca\u5668) \u2014> Finish "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4_1","title":"4. \u73af\u5883\u6e05\u7406","text":" \u5982\u679c\u7528\u4f8b\u91cc\u9762\u7684 teardown \u6ca1\u6709\u6267\u884c\uff0c\u5927\u6982\u7387\u662f\u56e0\u4e3a setup \u91cc\u9762\u4ee3\u7801\u62a5\u9519\uff0c\u8fd9\u4e24\u4e2a\u662f\u4e00\u5bf9\u7684\uff0csetup \u91cc\u9762\u62a5\u9519\uff0cteardown \u91cc\u9762\u7684\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\uff1b \u76ee\u524d\u6211\u4eec\u5df2\u7ecf\u5c06\u5404\u5e94\u7528\u7684 clean_all \u8fd9\u4e2a fixture \u6539\u6210\u4e86\u7ec8\u7ed3\u5668\uff0c\u786e\u4fdd\u59cb\u7ec8\u80fd\u6267\u884c\u5230\u8fd9\u6b65\uff0c\u4f46\u662f\u7528\u4f8b\u91cc\u9762\u7684 fixture\uff0c\u8fd8\u662f\u9700\u8981\u6211\u4eec\u5c0f\u5fc3\u5904\u7406\uff1b \u8981\u6267\u884c clean_all \u9700\u8981\u5728\u7f16\u8f91\u5668\u8fd0\u884c\u53c2\u6570\u52a0 --clean yes\uff0c\u5199\u7528\u4f8b\u7684\u65f6\u5019\u8bf7\u52a0\u4e0a\uff0c\u4e0d\u7136\u4f60\u4e0d\u786e\u5b9a\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u7684\u73af\u5883\u662f\u5426\u6062\u590d\uff1b setup \u53ef\u4ee5\u4e0d\u8981\uff0c\u5c06 setup \u653e\u5230\u7528\u4f8b\u91cc\u9762\u662f\u4e00\u79cd\u7a33\u59a5\u7684\u505a\u6cd5\uff0cteardown \u4e00\u5b9a\u8981\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5_1","title":"5. \u5143\u7d20\u5b9a\u4f4d\u4e0d\u51c6\uff08\u5750\u6807\u8fd4\u56de\u4e0d\u5bf9\uff09","text":" \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u53ef\u80fd\u53d7\u5230\u7a97\u53e3 ID \u7684\u53d8\u5316\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u9ed8\u8ba4\u53d6\u6700\u65b0\u7684\u4e00\u4e2a\u7a97\u53e3\u7528\u4e8e\u5b9a\u4f4d\uff0c\u4f46\u5982\u679c\u5b9e\u9645\u9700\u8981\u5b9a\u4f4d\u7684\u4e0d\u662f\u6700\u65b0\u7684\u7a97\u53e3\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u91cd\u65b0\u5b9e\u4f8b\u5316\u65b9\u6cd5\u7c7b\u5bf9\u8c61\uff0c\u5e76\u5728\u7c7b\u4e2d\u4f20\u5165\u5bf9\u5e94\u7684\u7a97\u53e3\u5e8f\u53f7\uff1b \u57fa\u4e8e\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u76ee\u524d\u9047\u5230\u7684\u7b14\u8bb0\u672c\u4e0a\uff0c\u7531\u4e8e\u5c4f\u5e55\u7f29\u653e\u6bd4\u4f8b\u4e3a 1.25\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u6211\u4eec\u9ed8\u8ba4\u4f7f\u7528\u7f29\u653e\u6bd4\u4f8b\u4e3a 1\uff1b \u57fa\u4e8e\u56fe\u50cf\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u76ee\u6807\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b \u57fa\u4e8e OCR \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u6587\u5b57\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u540c\u6837\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6_1","title":"6. \u952e\u9f20\u64cd\u4f5c\u4e0d\u51c6","text":" \u9f20\u6807\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6bd4\u5982\u53f3\u952e\u3001\u53cc\u51fb\u65e0\u54cd\u5e94\uff1b \u952e\u76d8\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6216\u8005\u5ef6\u8fdf\u8f93\u5165\uff0c\u6bd4\u5982\u7528\u4f8b\u9700\u8981\u8f93\u5165\u201c\u6211\u662f\u4e2d\u56fd\u4eba\u201d\uff0c\u5b9e\u9645\u53ea\u8f93\u5165\u4e86\u201c\u6211\u56fd\u4eba\u201d\uff1b \u4ee5\u4e0a\u95ee\u9898\u6392\u9664\u5e94\u7528\u5361\u987f\u7b49\u95ee\u9898\uff0c\u5927\u6982\u7387\u662f\u7531\u4e8e\u5de5\u5177\u7684\u95ee\u9898\uff0c\u76ee\u524d\u952e\u9f20\u64cd\u4f5c\u6211\u4eec\u4f7f\u7528\u4e09\u4e2a\u5de5\u5177\uff1aDogtail \u63d0\u4f9b\u7684\u952e\u9f20\u5de5\u5177\u3001PyAutoGUI\u3001Xdotool \uff1b \u6709\u540c\u5b66\u53ef\u80fd\u8981\u8bf4\u4e3a\u5565\u8981\u7528\u4e09\u4e2a\u554a\uff0c\u7528\u4e00\u4e2a\u4e0d\u5c31\u597d\u4e86\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u5404\u6709\u4f18\u70b9\u5404\u6709\u7f3a\u70b9\u3002 \u5982\u679c\u4f60\u9047\u5230\u952e\u9f20\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u8bd5\u8bd5\u901a\u8fc7\u4e0d\u540c\u7684\u5de5\u5177\u64cd\u4f5c\uff1b\u952e\u76d8\u8f93\u5165\u5ef6\u8fdf\u7684\u95ee\u9898\uff0c\u4e00\u822c\u662f\u56e0\u4e3a\u8f93\u5165\u901f\u5ea6\u592a\u5feb\u4e86\uff0c\u7cfb\u7edf\u6ca1\u53cd\u5e94\u8fc7\u6765\uff0c\u5e38\u89c1\u4e8e ARM \u548c MIPS \u4e0a\uff0c\u4fee\u6539\u53c2\u6570 delay_time \u7684\u503c\uff0c\u5355\u4f4d\u4e3a\u6beb\u79d2\uff1b # mouse_key.py\n@classmethod\ndef input_message(cls, message, delay_time=300, interval=0.2):\n\"\"\"\n \u8f93\u5165\u5b57\u7b26\u4e32\n :param message: \u8f93\u5165\u7684\u5185\u5bb9\n :param delay_time: \u5ef6\u8fdf\u65f6\u95f4\n :param interval:\n :return:\n \"\"\"\n \u5982\u679c\u4e0d\u662f\u65b9\u6cd5\u7684\u95ee\u9898\uff0c\u5219\u9700\u8981\u7ee7\u7eed\u548c\u5f00\u53d1\u4e00\u8d77\u6392\u9664\uff0c\u662f\u5426\u4e3a\u5e94\u7528\u63a5\u53d7\u952e\u9f20\u4fe1\u53f7\u5904\u7406\u7684\u95ee\u9898\uff0c\u8fd9\u7c7b\u60c5\u51b5\u6211\u4eec\u4e5f\u662f\u9047\u5230\u8fc7\u7684\uff0c\u5177\u4f53\u95ee\u9898\u5177\u4f53\u5206\u6790\u3002 \u6bd4\u5982\u5f71\u9662\u5c31\u91cd\u5199\u4e86\u4e00\u4e2a\u53f3\u952e\u7684\u65b9\u6cd5\uff1a # base_widget.py\n@classmethod\ndef right_click(cls, _x=None, _y=None):\n\"\"\"\n \u91cd\u5199\u5e95\u5c42\u5355\u51fb\u9f20\u6807\u53f3\u952e\n \u89e3\u51b3\u5f71\u9662\u53f3\u952e\u89e6\u53d1release\u4e8b\u4ef6\u7684\u95ee\u9898\uff08\u53f3\u952e\u4e3b\u7a97\u53e3\u4f1a\u64ad\u653e\u89c6\u9891\uff09\n \"\"\"\ncls.mouse_down(_x, _y, button=3)\nsleep(0.1)\ncls.mouse_up(button=3)\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_6","title":"\u4e03\u3001\u5176\u4ed6\u4e0d\u4e3a\u4eba\u77e5\u7684\u7ec6\u8282","text":" \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u5c3d\u91cf\u7f16\u5199\u540c\u4e00\u4e2a\u5e94\u7528\u6216\u6a21\u5757\u7684\u7528\u4f8b\uff0c\u80fd\u5bf9\u8be5\u7528\u4f8b\u5df2\u6709\u65b9\u6cd5\u719f\u6089\uff0c\u907f\u514d\u8fc7\u591a\u91cd\u590d\u4e1a\u52a1\u4ee3\u7801\u7684\u5c01\u88c5\uff1b \u76f8\u540c\u7684\u573a\u666f\u4e0b\uff0c\u5404\u67b6\u6784\u7b49\u5f85\u65f6\u95f4\u4e0d\u540c\uff0c\u5efa\u8bae\u4f7f\u7528\u6846\u67b6\u63d0\u4f9b\u7684 sleep\uff0c\u6211\u4eec\u505a\u4e86\u4e0d\u540c\u67b6\u6784\u7684\u500d\u6570\u653e\u5927\uff1b \u7f16\u5199\u7528\u4f8b\u65f6\uff0c\u5c3d\u91cf\u8003\u8651\u5230\u6bcf\u4e00\u6b65\u5f02\u5e38\u540e\u7684\u73af\u5883\u6062\u590d\uff0c\u9700\u8981\u5efa\u8bae\u8fd9\u79cd\u610f\u8bc6\uff0c\u968f\u65f6\u8981\u8003\u8651\u5230\uff0c\u8fd9\u6b65\u64cd\u4f5c\u6709\u6ca1\u6709\u53ef\u80fd\u51fa\u9519\uff0c\u51fa\u9519\u4e86\u6539\u600e\u4e48\u529e\uff1b \u63d0\u4ea4\u4ee3\u7801\u7684\u65f6\u5019\u6ce8\u610f\u4e0d\u8981\u628a\u4e00\u4e9b\u4e34\u65f6\u7684\u6d4b\u8bd5\u8d44\u6e90\u63d0\u4ea4\u8fdb\u53bb\u4e86\uff0c\u6bd4\u5982\u6d4b\u8bd5\u4e86\u4e00\u4e2a\u5f71\u7247\uff0c\u6709\u4e9b\u540c\u5b66\u4e60\u60ef\u4f7f\u7528 git add . \uff0c\u7136\u540e\u5c31\u5168\u90e8\u63d0\u4ea4\u5230\u4ee3\u7801\u4ed3\u5e93\u4e86\uff0c\u8fd9\u6837\u5373\u4f7f\u540e\u671f\u628a\u5927\u6587\u4ef6\u5220\u4e86\uff0c.git \u6587\u4ef6\u91cc\u9762\u4e5f\u4f1a\u5f88\u5927\uff0c\u9020\u6210\u4ee3\u7801\u4ed3\u5e93\u53d8\u5f97\u5341\u5206\u81c3\u80bf\u3002 \u66f4\u591a\u7ec6\u8282\u67e5\u770b\uff1a\u300aAT\u7ecf\u9a8c\u603b\u7ed3\u300b"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/","title":"AT \u6267\u884c\u5668\u4f7f\u7528\u6307\u5317","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/5/25\n# Author : litao\n# =============================================\n Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1","title":"1\u3001\u529f\u80fd\u4ecb\u7ecd","text":" \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7cfb\u7edf\u8bed\u8a00\u8bbe\u7f6e\uff0c\u5206\u8fa8\u7387\u8bbe\u7f6e\u53ca\u7528\u4f8b\u6267\u884c\u73af\u5883\u642d\u5efa\uff1b \u652f\u6301 IP \u4e3a 15 \u7f51\u6bb5\u7684 AMD \u67b6\u6784\u6d4b\u8bd5\u673a\u955c\u50cf\u88c5\u673a\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u6307\u5b9a\u5e94\u7528\uff0c\u6307\u5b9a\u8303\u56f4\u6807\u7b7e\u7684\u7528\u4f8b\u6267\u884c\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u72b6\u6001\u68c0\u67e5\uff0c\u662f\u5426\u6709\u6b63\u5728\u8fd0\u884c\u7684\u6d4b\u8bd5\uff1b \u652f\u6301\u914d\u7f6e\u7528\u4f8b\u6267\u884c\u65f6\u957f\uff0c\u9632\u6b62\u4efb\u52a1\u963b\u585e\uff1b \u652f\u6301\u6839\u636e\u5e94\u7528\u7248\u672c\u81ea\u52a8\u67e5\u627e\u5bf9\u5e94\u7684\u7528\u4f8b tag\uff1b \u652f\u6301\u5f02\u5e38\u5904\u7406\u548c\u6d4b\u8bd5\u5b8c\u6210\u7684\u5b9e\u65f6\u6d88\u606f\u901a\u77e5\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2job","title":"2\u3001Job \u4ecb\u7ecd","text":"\u4ee5\u4e0b\u6309\u6267\u884c\u6d41\u7a0b\u7684\u987a\u5e8f\u4ecb\u7ecd\uff0c\u6bcf\u4e00\u6b65\u90fd\u53ef\u4ee5\u5355\u72ec\u6267\u884c\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1_1","title":"1\u3001\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/AT_test/ \u6574\u4e2a\u6d41\u7a0b\u7684\u4e3b\u5165\u53e3\uff0c\u901a\u8fc7\u8fd9\u4e2a\u5165\u53e3\uff0c\u8fde\u540c\u6574\u4e2a\u6d4b\u8bd5\u6d41\u7a0b\uff0c\u955c\u50cf\u88c5\u673a\uff0c\u73af\u5883\u90e8\u7f72\uff0c\u6d4b\u8bd5\u5e94\u7528\u53ca\u751f\u6210\u62a5\u544a\u3002 \u53c2\u6570\u4ecb\u7ecd\uff1a \u6d4b\u8bd5\u673a\uff1a\u6240\u6709\u89c4\u6574\u5230\u56fa\u5b9a\u533a\u57df\u7684\u6d4b\u8bd5\u673a\uff0c\u901a\u8fc7\u6d4b\u8bd5\u540c\u5b66\u5bf9\u6d4b\u8bd5\u673a\u7684\u4e60\u60ef\u547d\u540d\uff0c\u5728\u540e\u53f0\u6620\u5c04\u6d4b\u8bd5\u673a\u7684\u8be6\u7ec6\u4fe1\u606f\uff0c\u62ec\u53f7\u4e2d\u4e3a\u6d4b\u8bd5\u673a IP \u7684\u6700\u540e\u4e00\u4f4d\uff1b \u6d4b\u8bd5\u5e94\u7528\uff1a\u6307\u5b9a\u7684\u6d4b\u8bd5\u5e94\u7528\u7684\u5305\u540d\uff0c\u7cfb\u7edf\u6839\u636e\u540d\u79f0\u81ea\u52a8\u62c9\u53d6\u5bf9\u5e94\u7684\u4ed3\u5e93\u4ee3\u7801\uff1b deb\u5305\u4e0b\u8f7d\u5730\u5740\uff1a\u6d4b\u8bd5\u4e0a\u8ff0\u5e94\u7528\u65f6\uff0c\u9700\u8981\u5b89\u88c5\u7684deb\u5305\u4e0b\u8f7d\u5730\u5740\uff0c\u591a\u4e2a\u5730\u5740\u7528\u201c,\u201d\u9694\u5f00\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff1b \u8303\u56f4\u6807\u7b7e\uff1a\u6267\u884c\u6d4b\u8bd5\u7528\u4f8b\u7684\u6807\u7b7e\u8303\u56f4\uff0c\u5bf9\u5e94\u7528\u4f8b\u4ee3\u7801 csv \u6587\u4ef6\u4e2d\u7684\u6807\u7b7e\u4fe1\u606f\uff0c\u4ee5 pytest \u7684mark\u8bed\u6cd5\u7f16\u5199\uff1b \u7cfb\u7edf\u8bed\u8a00\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u8bed\u8a00\u73af\u5883\uff1b \u5206\u8fa8\u7387\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u5206\u8fa8\u7387\u73af\u5883\uff1b \u955c\u50cf\u5730\u5740\uff1a\u955c\u50cf\u4ed3\u5e93\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u901a\u8fc7 PXE \u88c5\u673a\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u88c5\u673a\u73af\u8282\uff08\u76ee\u524d\u4ec5\u652f\u6301\u90e8\u5206 AMD \u67b6\u6784\u7684\u88c5\u673a\uff09\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2pxe","title":"2\u3001PXE \u88c5\u673a","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/IOS_install/ \u8f93\u5165\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\uff0cIP\uff0c\u5bc6\u7801\uff0c\u955c\u50cf\u5730\u5740\u540e\uff0c\u81ea\u52a8\u88c5\u673a\uff0c\u76ee\u524d\u4ec5\u652f\u6301\u56fa\u5b9a 15 \u7f51\u6bb5\u7684\u90e8\u5206 AMD \u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#3","title":"3\u3001\u6b21\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/all_client_test/ \u8be5\u5165\u53e3\u4e0e\u4e3b\u5165\u53e3\u529f\u80fd\u57fa\u672c\u4e00\u81f4\uff0c\u53ea\u662f\u5265\u79bb\u4e86PXE\u88c5\u673a\u6d41\u7a0b\uff0c\u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7684\u6267\u884c\u6d41\u7a0b\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#4","title":"4\u3001\u73af\u5883\u90e8\u7f72","text":"Jenkins url\uff1ahttps://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/env/build?delay=0sec \u8bbe\u7f6e\u6d4b\u8bd5\u673a\u7684\u7cfb\u7edf\u8bed\u8a00\uff0c\u5206\u8fa8\u7387\u53ca\u5b89\u88c5\u6d4b\u8bd5\u6240\u9700\u7684\u4f9d\u8d56\u5305\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#5","title":"5\u3001\u53d1\u9001\u4ee3\u7801","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/send_code/ \u6839\u636e\u6d4b\u8bd5\u5e94\u7528\u540d\u79f0\uff0c\u62c9\u53d6\u5bf9\u5e94\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u5e76\u6839\u636e\u6d4b\u8bd5\u673a\u4e0a\u5e94\u7528\u7248\u672c\u5207\u6362\u5230\u5bf9\u5e94\u7684tag\u7248\u672c\uff0c\u82e5\u672a\u627e\u5230tag\u7248\u672c\uff0c\u5219\u4f7f\u7528\u6700\u65b0\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u518d\u6839\u636e\u5e94\u7528\u5e93\u4ee3\u7801\u4e2d\u914d\u7f6e\u7684\u57fa\u7840\u5e93\u7248\u672c\uff0c\u62c9\u53d6\u57fa\u7840\u5e93\u4ee3\u7801\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#6","title":"6\u3001\u7528\u4f8b\u6267\u884c","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/run_test/ \u8fd0\u884c\u6d4b\u8bd5\u673a\u4e0a\u7684\u7528\u4f8b"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/","title":"AT \u7528\u4f8b\u7b5b\u9009\u6307\u5317","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u7528\u4f8b\u7b5b\u9009\u6807\u51c6\uff0c\u662f\u6311\u9009\u5408\u9002\u7684\u6587\u672c\u7528\u4f8b\u8fdb\u884c\u81ea\u52a8\u5316\u7528\u4f8b\u8f6c\u5316\u7684\u4e00\u4e9b\u901a\u7528\u6807\u51c6\u3002 \u8fc7\u53bb\u6211\u4eec\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u5b9e\u8df5\u8fc7\u7a0b\u4e2d\uff0c\u5199\u4e86\u4e0d\u5c11\u81ea\u52a8\u5316\u7528\u4f8b\uff0c\u968f\u7740\u9700\u6c42\u7684\u8fed\u4ee3\uff0c\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u81ea\u7136\u8150\u5316\uff0c\u56e0\u800c\u9700\u8981\u5728\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\u5bf9\u81ea\u52a8\u5316\u7528\u4f8b\u8fdb\u884c\u7ef4\u62a4\uff0c\u5728\u7ef4\u62a4\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u6211\u4eec\u53d1\u73b0\uff0c\u6709\u4e9b\u7528\u4f8b\u7ef4\u62a4\u8d77\u6765\u592a\u96be\u4e86\uff0c\u8c03\u8bd5\u7528\u4f8b\u8017\u8d39\u5927\u91cf\u65f6\u95f4\uff0c\u6210\u672c\u5f88\u9ad8\u3002 \u56e0\u6b64\uff0c\u6211\u4eec\u603b\u7ed3\u4e00\u4e9b\u81ea\u52a8\u5316\u7528\u4f8b\u9009\u578b\u7684\u6807\u51c6\uff0c\u4ee5\u4f18\u5316\u540e\u7eed\u81ea\u52a8\u5316\u7528\u4f8b\u7ed3\u6784\uff0c\u671f\u5f85\u6211\u4eec\u80fd\u7f16\u5199\u51fa\u9ad8\u6548\u3001\u7a33\u5b9a\u3001\u6613\u4e8e\u7ef4\u62a4\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_1","title":"\u4e00\u3001\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u53ef\u4ee5\u5206\u4e3a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u548c\u4e13\u9879\u81ea\u52a8\u5316\u6d4b\u8bd5\uff0c\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e00\u822c\u53ea\u9488\u5bf9\u4e00\u4e9b\u5e38\u89c4\u7684\u529f\u80fd\u6d4b\u8bd5\uff0c\u5176\u4ed6\u975e\u5e38\u89c4\u529f\u80fd\u7684\u7528\u4f8b\uff0c\u5e94\u8be5\u91c7\u7528\u4e13\u9879\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u6848\uff1b \u4ee5\u4e0b\u662f\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1","title":"1. \u7a33\u5b9a\u6027\u3001\u538b\u6d4b\u7528\u4f8b","text":"\u7a33\u5b9a\u6027\u6d4b\u8bd5\u3001\u538b\u6d4b\u7528\u4f8b\u5e94\u8be5\u662f\u5c5e\u4e8e\u6027\u80fd\u76f8\u5173\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u5982\uff1a\u53cd\u590d\u591a\u6b21\u70b9\u51fb\u6309\u94ae\uff0c\u68c0\u9a8c\u5176\u529f\u80fd\u7a33\u5b9a\u6027\u3002\u56e0\u4e3a\u8fd9\u4e9b\u7528\u4f8b\u65ad\u8a00\u7684\u9884\u671f\u53ef\u80fd\u4e0d\u662f\u5f88\u660e\u786e\uff0c\u66f4\u6709\u751a\u8005\u4e0d\u9700\u8981\u65ad\u8a00\uff0c\u7528\u4f8b\u65f6\u957f\u6bd4\u8f83\u957f\uff0c\u800c\u4e14\u4e0d\u53ef\u63a7\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u76ee\u524d\u6211\u4eec\u6709\u6027\u80fd\u81ea\u52a8\u5316\u7684\u4e13\u9879\u65b9\u6848\uff0c\u4ee5\u53ca\u4e00\u4e9b\u7a33\u5b9a\u6027\u6d4b\u8bd5\u7684\u4e13\u9879\u65b9\u6848\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u6b64\u7c7b\u7528\u4f8b\u653e\u5230\u4e13\u9879\u81ea\u52a8\u5316\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2","title":"2. \u6d89\u53ca\u591a\u4e2a\u7528\u6237\u64cd\u4f5c","text":"\u5e38\u89c1\u4e0e\u6587\u7ba1\u7684\u7528\u4f8b\u4e2d\uff0c\u591a\u7528\u6237\u64cd\u4f5c\u7684\u7528\u4f8b\u4e00\u822c\u90fd\u4f1a\u6d89\u53ca\u5230\u5728\u7cfb\u7edf\u4e2d\u8fdb\u884c\u591a\u4e2a\u7528\u6237\u95f4\u7684\u5207\u6362\uff0c\u81ea\u52a8\u5316\u811a\u672c\u4e00\u822c\u662f\u8fd0\u884c\u5728\u4e00\u4e2a\u7528\u6237\u7a7a\u95f4\u4e0b\u7684\uff0c\u6240\u4ee5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u591a\u7528\u6237\u95f4\u7684\u5207\u6362\u3002 \u6b64\u7c7b\u4e0d\u5efa\u8bae\u91c7\u7528\u81ea\u52a8\u5316\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3","title":"3. \u4e0e\u5f00\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4ea4\u4e92","text":"\u6b64\u7c7b\u573a\u666f\u591a\u4e3a\u5e94\u7528\u7684\u5f02\u5e38\u573a\u666f\u6d4b\u8bd5\uff0c\u6bd4\u5982\uff1a\u590d\u5236\u5927\u6587\u4ef6\u8fc7\u7a0b\u4e2d\u6ce8\u9500\u673a\u5668\u3002 \u81ea\u52a8\u5316\u811a\u672c\u5728\u7cfb\u7edf\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4e4b\u540e\u662f\u4f1a\u505c\u6b62\u8fd0\u884c\u7684\uff1b\u6b64\u7c7b\u7528\u4f8b\u53ef\u4ee5\u505a\u81ea\u52a8\u5316\uff0c\u4f46\u662f\u540c\u6837\u9700\u8981\u505a\u4e13\u9879\u65b9\u6848\uff0c\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u7684\u5904\u7406\u903b\u8f91\u5b8c\u5168\u4e0d\u540c\u3002 \u540e\u7eed\u81ea\u52a8\u5316\u9700\u8981\u516c\u5173\u7684\u70b9\uff1a \u81ea\u52a8\u5316\u811a\u672c\u5728\u672c\u673a\u8fd0\u884c\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u81f3\u5c11\u9700\u8981\u63d0\u4f9b\u4ee5\u4e0b\u529f\u80fd\uff1a \u91cd\u542f\u4e4b\u540e\u7528\u4f8b\u80fd\u81ea\u52a8\u8fd0\u884c\uff1b\u53ef\u4ee5\u8003\u8651\u5c06\u6267\u884c\u7528\u4f8b\u5199\u6210\u4e00\u4e2a\u5f00\u673a\u81ea\u542f\u7684\u670d\u52a1\uff1b \u80fd\u8bb0\u5f55\u5173\u673a\u4e4b\u524d\u7528\u4f8b\u6267\u884c\u7684\u4f4d\u7f6e\uff0c\u91cd\u542f\u4e4b\u540e\u80fd\u4ece\u6b64\u4f4d\u7f6e\u5f00\u59cb\u6267\u884c\uff1b \u50cf\u6027\u80fd\u81ea\u52a8\u5316\u4e00\u6837\uff0c\u7531\u670d\u52a1\u7aef\u63a7\u5236\uff1b \u5b8c\u5168\u57fa\u4e8e\u56fe\u5f62\u8bc6\u522b\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u4e32\u53e3\u7ebf\u63a7\u5236\u952e\u9f20\u7a33\u5b9a\u6027\uff1b "},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4","title":"4. \u6d4b\u8bd5\u6267\u884c\u65f6\u95f4\u957f","text":"\u7528\u4f8b\u6267\u884c\u65f6\u95f4\u63a7\u5236\u57282\u5206\u949f\u4ee5\u5185\uff0c\u6781\u7aef\u60c5\u51b5\u4e0d\u8981\u8d85\u8fc75\u5206\u949f\uff0c\u6240\u6709\u7528\u4f8b\u7684\u5e73\u5747\u65f6\u957f\u5e94\u8be5\u57281\u5206\u949f\u5de6\u53f3\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u95f4\u592a\u957f\uff0c\u7f16\u5199\u7528\u4f8b\u3001\u8c03\u8bd5\u7528\u4f8b\u3001\u6267\u884c\u7528\u4f8b\u3001\u7ef4\u62a4\u7528\u4f8b\u90fd\u975e\u5e38\u7684\u8017\u65f6\uff0c\u4eba\u529b\u6210\u672c\u65f6\u95f4\u6210\u672c\u6295\u5165\u592a\u9ad8\u3002 \u4f60\u60f3\uff0c\u8fd9\u6761\u7528\u4f8b\u6267\u884c\u9700\u89815\u5206\u949f\uff0c\u90a3\u4f60\u5199\u8fd9\u6761\u7528\u4f8b\u7684\u65f6\u95f4\u4e0d\u53ef\u80fd\u4e00\u904d\u8fc7\uff0c\u5199\u7684\u8fc7\u7a0b\u4e2d\u8dd1\u4e0d\u901a\u8fd8\u5f97\u91cd\u8dd1\u81f3\u5c1115\u5206\u949f\u4e0d\u8fc7\u5206\uff0c\u5199\u5b8c\u4e86\u8fd8\u5f97\u5728\u5176\u4ed6\u67b6\u6784\u4e0a\u8c03\u8bd5\uff0c\u534a\u4e2a\u5c0f\u65f6\u8fc7\u53bb\u4e86\uff0c\u8fd9\u8fd8\u53ea\u662f\u7b2c\u4e00\u6b21\u5199\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u540e\u7eed\u5982\u679c\u7528\u4f8b\u7ef4\u62a4\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u7ecf\u5e38\u6295\u5165\u76f8\u5f53\u957f\u65f6\u95f4\uff0c\u8fd9\u6837\u5176\u5b9e\u662f\u5931\u53bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u7684\u3002\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u5c31\u5e94\u8be5\u662f\u5feb\u51c6\u72e0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5","title":"5. \u8fb9\u7f18\u6027\u6d4b\u8bd5","text":"\u6709\u4e9b\u529f\u80fd\u6a21\u5757\u672c\u8eab\u662f\u5c5e\u4e8e\u6bd4\u8f83\u8fb9\u7f18\u6027\u7684\uff0c\u5373\u6781\u5c11\u7528\u6237\u4f1a\u4f7f\u7528\u5230\u7684\u529f\u80fd\uff0c\u8fd9\u7c7b\u529f\u80fd\u6a21\u5757\u4e0d\u9700\u8981\u5927\u89c4\u6a21\u5b9e\u73b0\u81ea\u52a8\u5316\uff0c\u4e00\u4e24\u4e2a\u573a\u666f\u8986\u76d6\u57fa\u672c\u529f\u80fd\u5c31\u884c\u4e86\uff0c\u56e0\u6b64\u6211\u4eec\u5728\u6311\u9009\u6b64\u7c7b\u7528\u4f8b\u7684\u65f6\u5019\u53ef\u4ee5\u7ed3\u5408\u6574\u4e2a\u529f\u80fd\u6a21\u5757\u7684\u8986\u76d6\u60c5\u51b5\u6765\u51b3\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6","title":"6. \u9700\u8981\u4f9d\u8d56\u4eba\u5de5\u4ecb\u5165\u7684","text":"\u81ea\u52a8\u5316\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\u662f\u6ca1\u6709\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bd4\u5982\u8981\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u90a3\u4e48\u5c31\u80cc\u79bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u3002 \u6bd4\u5982\u5149\u9a71\u6a21\u5757\uff0c\u5149\u9a71\u523b\u5f55\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u4f46\u662f\u5149\u9a71\u523b\u5f55\u4e4b\u540e\u5149\u76d8\u4f1a\u5f39\u51fa\u6765\uff0c\u9700\u8981\u4eba\u5de5\u66f4\u6362\u5149\u76d8\uff0c\u518d\u624b\u52a8\u63a8\u8fdb\u5149\u9a71\u4e2d\u3002 \u8fd9\u79cd\u529f\u80fd\u6a21\u5757\u5373\u4f7f\u505a\u81ea\u52a8\u5316\uff0c\u80fd\u6d89\u53ca\u5230\u7684\u529f\u80fd\u975e\u5e38\u6709\u9650\uff0c\u800c\u4e14\u4e0d\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u6240\u4ee5\u660e\u663e\u5c31\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7","title":"7. \u96be\u4ee5\u5b9e\u73b0\u7684","text":"\u7528\u4f8b\u6240\u6d89\u53ca\u5230\u7684\u65b9\u6cd5\u5b9e\u73b0\u8d77\u6765\u53ef\u80fd\u6709\u96be\u5ea6\uff0c\u751a\u81f3\u73b0\u9636\u6bb5\u65e0\u6cd5\u5b9e\u73b0\u7684\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002 \u6bd4\u5982\u5f71\u9662\u6d4b\u8bd5\u753b\u9762\u6e05\u6670\u5ea6\u3001\u6d41\u7545\u5ea6\u3001\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u4e4b\u540e\u7684\u89c6\u9891\u662f\u5426\u5b58\u5728\u5361\u987f\u7b49\u7528\u4f8b\uff0c\u73b0\u9636\u6bb5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#8","title":"8. \u529f\u80fd\u4e0d\u7a33\u5b9a","text":"\u8fd9\u4e2a\u4e0d\u662f\u8bf4\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\uff0c\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\u4e0d\u7a33\u5b9a\u662f\u6b63\u5e38\u7684\uff0c\u8fd9\u79cd\u6211\u4eec\u53ef\u4ee5\u7b49\u5f00\u53d1\u63d0\u6d4b\u4e4b\u540e\u518d\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u3002 \u529f\u80fd\u4e0d\u7a33\u5b9a\u6307\u7684\u662f\u7528\u4f8b\u6240\u6d89\u53ca\u7684\u529f\u80fd\uff0c\u53ef\u80fd\u5b58\u5728\u591a\u79cd\u53d8\u5316\uff0c\u6bcf\u6b21\u6267\u884c\u7528\u4f8b\u53ef\u80fd\u65ad\u8a00\u7684\u9884\u671f\u90fd\u4e0d\u540c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#9","title":"9. \u52a8\u6001\u65ad\u8a00","text":"\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u76f4\u5230\u7528\u4f8b\u7ed3\u675f\uff0c\u4e00\u76f4\u662f\u4e00\u4e2a\u52a8\u6001\u53d8\u5316\u7684\u8fc7\u7a0b\uff0c\u800c\u4e14\u65e0\u6cd5\u901a\u8fc7\u5176\u4ed6\u624b\u6bb5\u505c\u4e0b\u6765\uff1b \u6bd4\u5982\uff1a\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u65f6\uff0c\u53f3\u4e0b\u89d2\u7684\u5f55\u5236\u65f6\u95f4\u662f\u4e00\u76f4\u5728\u53d8\u5316\u7684\uff0c\u7528\u4f8b\u9700\u8981\u6d4b\u8bd5\u5f55\u52361\u5206\u949f\u4e4b\u540e\uff0c\u5f55\u5236\u65f6\u95f4\u662f\u521a\u597d\u505c\u572860\u79d2\uff1b \u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fd8\u505a\u4e0d\u5230\u65f6\u95f4\u7cbe\u51c6\u63a7\u5236\uff0c\u7a0b\u5e8f\u6267\u884c\u65f6\u95f4\u662f\u6709\u6ce2\u52a8\u7684\uff0c\u800c\u4e14\u8981\u9002\u914d\u591a\u4e2a\u5e73\u53f0\uff0c\u6240\u4ee5\u6b64\u7c7b\u7528\u4f8b\u5927\u6982\u7387\u4f1a\u6267\u884c\u5931\u8d25\u3002\u7279\u522b\u662f\u5728\u6027\u80fd\u8f83\u5dee\u7684\u56fd\u4ea7\u5316\u67b6\u6784\u4e0a\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u592a\u53ef\u80fd\u7a33\u5b9a\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#10","title":"10. \u63a2\u7d22\u6027\u6d4b\u8bd5","text":"\u63a2\u7d22\u6027\u6d4b\u8bd5\u901a\u5e38\u662f\u4e00\u4e9b\u4e0d\u786e\u5b9a\u7684\u64cd\u4f5c\uff0c\u591a\u53d8\u5207\u590d\u6742\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u9884\u671f\u4e5f\u53ef\u80fd\u662f\u4e0d\u786e\u5b9a\u7684\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u9a9a\u64cd\u4f5c\u592a\u591a\u4e86\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6b64\u7c7b\u7528\u4f8b\u9002\u5408\u91c7\u7528\u624b\u5de5\u6d4b\u8bd5\uff0c\u662f\u624b\u5de5\u6d4b\u8bd5\u771f\u6b63\u7684\u4ef7\u503c\u4f53\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#11","title":"11. \u6613\u7528\u6027\u6d4b\u8bd5","text":"\u5bf9\u4e8e\u6613\u7528\u6027\u7684\u5224\u65ad\u901a\u5e38\u662f\u4e3b\u89c2\u7684\uff0c\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\u5f88\u96be\u53bb\u5b9a\u4e49\u4ec0\u4e48\u6837\u7684\u60c5\u51b5\u5bf9\u7528\u6237\u662f\u6613\u7528\u7684\uff0c\u81ea\u52a8\u5316\u9700\u8981\u6709\u660e\u786e\u7684\u53ef\u5b9e\u73b0\u7684\u9884\u671f\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_2","title":"\u4e8c\u3001\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u524d\u9762\u8bb2\u4e86\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u4e00\u4e9b\u7528\u4f8b\u60c5\u51b5\uff0c\u6709\u540c\u5b66\u5c31\u8bf4\u4e86\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\u4e0d\u7528\u8bb2\u4e86\uff0c\u5c31\u662f\u4e0d\u9002\u5408\u7684\u53cd\u9762\u3002\u6ca1\u6bdb\u75c5\u54c8\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\uff0c\u6211\u4eec\u5927\u4f53\u8fd8\u53ef\u4ee5\u5206\u4e3a\u4e24\u7c7b\uff1a \u7b2c\u4e00\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u597d\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u7b2c\u4e8c\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u4e00\u822c\uff0c\u9700\u8981\u6295\u5165\u66f4\u591a\u7cbe\u529b\u624d\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u4ee5\u4e0b\u4ecb\u7ecd\u4e00\u4e9b\u6211\u4eec\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1_1","title":"1. \u64cd\u4f5c\u76f8\u5bf9\u7b80\u5355","text":"\u7528\u4f8b\u6b65\u9aa4\u76f8\u5bf9\u8f83\u5c11\uff0c\u8fd9\u79cd\u7528\u4f8b\u901a\u5e38\u662f\u4e00\u4e9b\u8def\u5f84\u5f88\u6d45\u7684\u7528\u4f8b\uff0c\u4e00\u822c\u4e5f\u662f\u4e00\u4e9b\u57fa\u7840\u7528\u4f8b\u3002\u7528\u4f8b\u7f16\u5199\u3001\u7ef4\u62a4\u90fd\u53ef\u4ee5\u8f7b\u677e\u641e\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2_1","title":"2. \u5bb9\u6613\u5b9e\u73b0","text":"\u73b0\u6709\u6280\u672f\u662f\u53ef\u5b9e\u73b0\u7684\uff0c\u6ca1\u6709\u96be\u5ea6\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3_1","title":"3. \u7ecf\u5e38\u7528\u4e8e\u56de\u5f52\u6d4b\u8bd5","text":"\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bcf\u6b21\u56de\u5f52\u6d4b\u8bd5\u5fc5\u987b\u8981\u6267\u884c\u7684\u7528\u4f8b\uff0c\u90a3\u4e48\u8fd9\u6761\u7528\u4f8b\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u3002 \u56de\u5f52\u6d4b\u8bd5\u65f6\u6211\u4eec\u9996\u5148\u5e94\u8be5\u4fdd\u8bc1\u5e94\u7528\u5386\u53f2\u57fa\u672c\u529f\u80fd\u6b63\u5e38\uff0c\u6240\u4ee5\u90a3\u4e9b\u6bcf\u6b21\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u90fd\u8981\u6267\u884c\u7684\u7528\u4f8b\u9002\u5408\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4_1","title":"4. \u529f\u80fd\u7a33\u5b9a\u7684\u6838\u5fc3\u529f\u80fd","text":"\u6d89\u53ca\u6838\u5fc3\u529f\u80fd\u7684\u7528\u4f8b\u662f\u6700\u6700\u91cd\u8981\u7684\u7528\u4f8b\uff0c\u4e5f\u662f\u6211\u4eec\u4ea4\u4ed8\u65f6\u5fc5\u987b\u8981\u4fdd\u8bc1\u8d28\u91cf\u7684\u76f8\u5173\u529f\u80fd\uff0c\u56e0\u6b64\u5e94\u8be5\u5c3d\u53ef\u80fd\u7684\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5_1","title":"5. \u8f93\u5165\u6570\u636e\u6d4b\u8bd5","text":"\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u901a\u5e38\u662f\u68c0\u9a8c\u88ab\u6d4b\u5e94\u7528\u63a5\u53d7\u6709\u6548\u6570\u636e\u3001\u62d2\u7edd\u65e0\u6548\u6570\u636e\u7684\u80fd\u529b\u3002\u5982\uff1a\u63d0\u4ea4\u8d85\u957f\u5b57\u7b26\u4e32\u3001\u7279\u6b8a\u5b57\u7b26\u4e32\u7b49\u7b49\u3002 \u6b64\u7c7b\u7528\u4f8b\u624b\u5de5\u6d4b\u8bd5\u5f88\u96be\u6bd4\u8f83\u5168\u9762\u7684\u8986\u76d6\u5230\u6240\u6709\u7684\u8f93\u5165\u60c5\u51b5\uff0c\u4f46\u662f\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\uff0c\u6b64\u7c7b\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u90fd\u662f\u4e00\u6837\u7684\uff0c\u53d8\u5316\u7684\u4ec5\u662f\u8f93\u5165\u53c2\u6570\u548c\u65ad\u8a00\u7ed3\u679c\uff0c\u91c7\u7528\u6570\u636e\u9a71\u52a8\uff0c\u53ef\u4ee5\u8f7b\u677e\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6_1","title":"6. \u683c\u5f0f\u8986\u76d6","text":"\u539f\u56e0\u540c\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u7c7b\u7528\u4f8b\u4e00\u6837\uff0c\u591a\u79cd\u683c\u5f0f\u7684\u8986\u76d6\u4e5f\u662f\u4e00\u4e2a\u5f88\u7e41\u7410\u7684\u4e8b\u60c5\uff0c\u4ea4\u7ed9\u81ea\u52a8\u5316\u6765\u505a\u518d\u5408\u9002\u4e0d\u8fc7\u4e86\u3002 \u6bd4\u5982\u5f71\u9662\u5bf9\u5f71\u7247\u683c\u5f0f\u7684\u68c0\u67e5\u3001\u622a\u56fe\u5f55\u5c4f\u5bf9\u4fdd\u5b58\u683c\u5f0f\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7_1","title":"7. \u68c0\u67e5\u5143\u7d20\u72b6\u6001","text":"\u67e5\u770b\u88ab\u6d4b\u5e94\u7528\u7684\u5143\u7d20\u5c5e\u6027\u3002\u5982\uff1a\u56fe\u7247\u7684\u5927\u5c0f\u548c\u6392\u5217\uff1b\u6309\u94ae\u7684\u53ef\u7528\u548c\u4e0d\u53ef\u7528\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/","title":"AT \u7ecf\u9a8c\u603b\u7ed3","text":"\u6b22\u8fce\u6240\u6709\u4eba\u63d0\u4ea4\u4f60\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u9762\u7684\u4f18\u79c0\u5b9e\u8df5\u7ecf\u9a8c\uff0c\u4ee5\u5e2e\u52a9\u5927\u5bb6\u89e3\u51b3\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#1","title":"1\u3001\u7ec8\u7ed3\u5668","text":"# litaoa@uniontech.com\n \u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4 pytest \u5b9e\u73b0\u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4\u7684\u65b9\u5f0f\u6709\u4e24\u79cd\uff0cyield \u548c\u7ec8\u7ed3\u51fd\u6570\uff1b yield \u5b9e\u73b0\uff0cyield\u524d\u9762\u4e3a\u7528\u4f8b\u7684\u524d\u7f6e\u6b65\u9aa4\uff0cyield \u540e\u9762\u4e3a\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4\u3002 @pytest.fixture\ndef clean_env():\nprint(\"setup\")\nyield\nprint(\"teardown\")\n \u7ec8\u7ed3\u51fd\u6570\u5b9e\u73b0\uff0c\u4f7f\u7528 request.addfinalizer \u6ce8\u518c\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4 @pytest.fixture\ndef clean_env(request):\ndef clean():\nprint(\"teardown\")\nrequest.addfinalizer(clean)\nprint(\"setup\")\n yield\u7684\u4f18\u7f3a\u70b9\uff1a \u4f18\u70b9\uff1a\u4ee3\u7801\u7b80\u6d01\uff0c\u76f4\u89c2\uff0c\u53ef\u4f7f\u7528yield\u5728\u7528\u4f8b\u4e2d\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c \u7f3a\u70b9\uff1a\u82e5\u524d\u7f6e\u6b65\u9aa4\u4e2d\u51fa\u73b0\u9519\u8bef\uff0c\u5219\u540e\u7f6e\u6b65\u9aa4\u4e0d\u4f1a\u6267\u884c \u7ec8\u7ed3\u51fd\u6570\uff1a \u4f18\u70b9\uff1a\u524d\u7f6e\u6b65\u9aa4\u5931\u8d25\u7684\u8bdd\uff0c\u540e\u7f6e\u6b65\u9aa4\u4ecd\u4f1a\u6267\u884c\u4e14\u53ef\u4ee5\u6ce8\u518c\u591a\u4e2a\u540e\u7f6e\u6b65\u9aa4\uff08\u524d\u63d0\uff1a\u9700\u8981\u5728\u4ee3\u7801\u62a5\u9519\u4e4b\u524d\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff09\uff0c\u652f\u6301\u7075\u6d3b\u4f7f\u7528\u540e\u7f6e\u6761\u4ef6 \u7f3a\u70b9\uff1a\u4ee3\u7801\u8f83\u4e3a\u590d\u6742\uff0c\u65e0\u6cd5\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c\uff08\u672c\u4eba\u76ee\u524d\u672a\u5b9e\u73b0\uff09 \u603b\u7ed3\uff1a\u5728\u524d\u7f6e\u6b65\u9aa4\u4fdd\u8bc1\u7edd\u5bf9\u4e0d\u4f1a\u51fa\u9519\u65f6\uff0c\u4f7f\u7528yield\u66f4\u4f73\u7b80\u4fbf\uff0c\u5f53\u524d\u7f6e\u6b65\u9aa4\u6613\u51fa\u73b0\u95ee\u9898\u65f6\uff0c\u63a8\u8350\u4f7f\u7528\u7ec8\u7ed3\u51fd\u6570\u3002 \u573a\u666f\uff1a\u4fdd\u9669\u7bb1\u7528\u4f8b\uff0c\u524d\u7f6e\u6b65\u9aa4\u4e2d\u5f00\u542f\u4fdd\u9669\u7bb1\uff0c\u540e\u7f6e\u6b65\u9aa4\u5220\u9664\u4fdd\u9669\u7bb1\u3002 @pytest.fixture(scope=\"session\", autouse=True)\ndef vault_fixture(request):\nDfmWidget.reset_vault_by_cmd() # 1\u3001\u91cd\u7f6e\u4fdd\u9669\u7bb1\nDdeDockPublicWidget().close_file_manager_by_cmd() # 2\u3001\u5173\u95ed\u6587\u7ba1\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 3\u3001\u5f00\u542f\u6587\u7ba1\nvault = DfmWidget()\nvault.create_file_vault() # 4\u3001\u521b\u5efa\u4fdd\u9669\u7bb1\ndef delete_vault(): # 8\u3001\u5220\u9664\u4fdd\u9669\u7bb1\u7684\u540e\u7f6e\u6b65\u9aa4\nsleep(2)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr()\nvault = DfmWidget()\nvault.delete_file_vault()\nDfmWidget.reset_vault_by_cmd()\nDdeDockPublicWidget().close_file_manager_by_cmd()\nrequest.addfinalizer(delete_vault) # 5\u3001\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\nDdeDockPublicWidget().close_file_manager_by_cmd() # 6\u3001\u5173\u95ed\u6587\u7ba1\nsleep(1)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 7\u3001\u5f00\u542f\u6587\u7ba1\n \u4ee3\u7801\u6309\u6ce8\u91ca\u4e2d\u7684\u5e8f\u53f7\u6267\u884c\u6b65\u9aa4 \u4ee3\u7801\u5728\u6b65\u9aa41-4\u4efb\u610f\u4f4d\u7f6e\u62a5\u9519\uff0c\u5219\u4e0d\u4f1a\u6267\u884c\u6b65\u9aa48\uff0c\u56e0\u4e3a\u672a\u6267\u884c\u5230\u6b65\u9aa45\uff0c\u6b65\u9aa48\u8fd8\u672a\u6ce8\u518c \u4ee3\u7801\u5728\u6b65\u9aa46-7\u62a5\u9519\uff0c\u4ecd\u4f1a\u6267\u884c\u6b65\u9aa47\uff0c\u56e0\u4e3a\u5728\u6b65\u9aa45\u4e2d\u5df2\u7ecf\u5c06\u6b65\u9aa47\u6ce8\u518c \u53ef\u4ee5\u7075\u6d3b\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff0c\u80fd\u5b9e\u73b0\u67d0\u4e2a\u524d\u7f6e\u6b65\u9aa4\u6267\u884c\u4e4b\u540e\uff0c\u624d\u4f1a\u6267\u884c\u540e\u7f6e\u6b65\u9aa4\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#2","title":"2\u3001\u542f\u52a8\u5e94\u7528\u7684\u65b9\u5f0f","text":"# huangmingqiang@uniontech.com\n \uff081\uff09\u547d\u4ee4\u884c\u542f\u52a8 \u5728 AT \u4ee3\u7801\u4e2d\u4f7f\u7528\u547d\u4ee4\u884c\u542f\u52a8\u5e94\u7528\uff0c\u4e3e\u4f8b\uff1a os.popen(\"deepin-music\")\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f7f\u7528 ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6\uff0cdogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u3002 \uff082\uff09\u901a\u8fc7 UI \u64cd\u4f5c\u542f\u52a8 \u901a\u8fc7\u4efb\u52a1\u680f\u3001\u542f\u52a8\u5668\u3001\u684c\u9762\u7b49UI\u65b9\u5f0f\u542f\u52a8\uff0c\u6bd4\u5982\u53cc\u51fb\u6253\u5f00\u3001\u53f3\u952e\u6253\u5f00\u7b49\uff0c\u8fd9\u79cd\u64cd\u4f5c\u65b9\u5f0f\u4e0d\u5b58\u5728ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6dogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u7684\u95ee\u9898\uff0c\u4e5f\u66f4\u52a0\u7b26\u5408\u7528\u6237\u7684\u64cd\u4f5c\u884c\u4e3a\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#3","title":"3\u3001\u6587\u4ef6\u9009\u62e9\u6846\u5c5e\u6027\u5b9a\u4f4d\u5076\u73b0\u65e0\u6cd5\u627e\u5230","text":"\u6587\u4ef6\u9009\u62e9\u6846\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5728\u8c03\u7528\u6587\u4ef6\u9009\u62e9\u6846\u65f6\uff0c\u6709\u4e00\u5b9a\u7684\u6982\u7387\u51fa\u73b0\uff0c\u754c\u9762\u5df2\u7ecf\u6e32\u67d3\u51fa\u6765\u4e86\uff0c\u4f46\u662f\u5c5e\u6027\u6811\u5e76\u6ca1\u6709\u5199\u5165\uff0c\u5bfc\u81f4\u901a\u8fc7\u5c5e\u6027\u65e0\u6cd5\u627e\u5230\u5143\u7d20\uff0c\u76ee\u524d\u4e5f\u6ca1\u6709\u5f88\u597d\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u4e3a\u4e86\u7528\u4f8b\u7a33\u5b9a\u6027\uff0c\u6587\u4ef6\u9009\u62e9\u6846\u7684\u64cd\u4f5c\u5efa\u8bae\u4f7f\u7528UI\u6216\u8005\u56fe\u7247\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u53ef\u4ee5\u901a\u8fc7\u641c\u7d22\u5185\u5bb9\u56fa\u5b9a\u6587\u4ef6\u4f4d\u7f6e\u3002 # litaoa@uniontech.com\n desk = DdeDesktopPublicWidget()\n# \u9009\u62e9\u89c6\u9891\u76ee\u5f55\ndesk.click_videos_dir_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.ctrl_f()\nsleep(1)\ndesk.input_message(\"\u5143\u7d20\u540d\u79f0\")\nsleep(0.5)\ndesk.enter()\nsleep(1)\n# \u9009\u62e9\u7b2c\u4e00\u4e2a\u6587\u4ef6\ndesk.click_list_view_btn_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.click_first_file_in_desktop_plugs_by_ui()\nsleep(1)\n# \u6587\u7ba1\u63d2\u4ef6\u4e2d\u70b9\u51fb\u6253\u5f00\ndesk.click_open_btn_in_desktop_plugs_by_ui()\n"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#4","title":"4\u3001\u5e94\u7528\u542f\u52a8","text":"# mikigo\n \u5728UI\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u4e00\u5207\u64cd\u4f5c\u7684\u90fd\u662f\u4ece\u5e94\u7528\u542f\u52a8\u5f00\u59cb\u7684\uff0c\u800c\u5728Linux\u684c\u9762\u5e94\u7528\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u6211\u4eec\u542f\u52a8\u5e94\u7528\u7684\u65b9\u6cd5\u6709\u591a\u79cd\uff0c\u4e0b\u9762\u505a\u4e00\u4e2a\u7b80\u5355\u7684\u4ecb\u7ecd\uff1a \u3010\u4f7f\u7528dogtail\u542f\u52a8\u3011 dogtail\u63d0\u4f9b\u4e86\u5e94\u7528\u542f\u52a8\u7684\u65b9\u6cd5\uff0c\u5728utils\u5e93\u4e2d\uff0c\u4f7f\u7528run\u65b9\u6cd5\u542f\u52a8\uff1a \u9996\u5148\u5bfc\u5165\u65b9\u6cd5\uff1a from dogtail.utils import *\n \u8c03\u7528run\u65b9\u6cd5 run('deepin-music')\n \u5373\u53ef\u542f\u52a8\u97f3\u4e50 \u8fd9\u79cd\u65b9\u6cd5\u7684\u4f18\u70b9\u662f\u91c7\u7528\u8fdb\u7a0b\u7684\u65b9\u5f0f\u76f4\u63a5\u542f\u52a8\uff0c\u4e0d\u4f9d\u8d56\u4e0eUI\uff0c\u65e0\u8bba\u684c\u9762\u6216\u4efb\u52a1\u680f\u4e0a\u662f\u5426\u5b58\u5728\u5e94\u7528\u56fe\u6807\uff0c\u90fd\u53ef\u4ee5\u6b63\u5e38\u542f\u52a8\u3002 \u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c \u5982\u679c\u4f7f\u7528ssh\u8fdc\u7a0b\u8c03\u7528\uff0c\u6216\u8005Jenkins\u4e2d\u6267\u884c\u6d4b\u8bd5\u811a\u672c\u7684\u65f6\u5019\uff0c\u5728sniff\u4e2d\u4f1a\u51fa\u73b0\u627e\u4e0d\u5230\u5e94\u7528\uff0c\u7ecf\u8fc7\u5206\u6790\uff0c\u53ef\u80fd\u662f\u56e0\u4e3a\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\u542f\u52a8\u7684\u65f6\u5019\uff0c\u5b9e\u9645\u662f\u91c7\u7528\u4e00\u4e2a\u5b50\u8fdb\u7a0b\u542f\u52a8\u4e86\u5e94\u7528\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u5230\u3002 \u3010\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u3011 \u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807 \u901a\u5e38\u6709\u4e24\u79cd\u65b9\u6cd5\uff1a \uff081\uff09\u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807\u3002 \uff082\uff09\u5df2\u77e5\u5e94\u7528\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u7684\u4f4d\u7f6e\uff0c\u7136\u540e\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u5bf9\u5e94\u5750\u6807\u3002 \u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u7f3a\u70b9\u662f\u4f4d\u7f6e\u5fc5\u987b\u56fa\u5b9a\uff0c\u5982\u679c\u79fb\u52a8\u4f4d\u7f6e\u5c31\u4e0d\u884c\u4e86\uff0c\u800c\u4f7f\u7528\u7b2c\u4e00\u79cd\u65b9\u6cd5\uff0c\u65e0\u8bba\u4f4d\u7f6e\u5728\u54ea\u91cc\uff0c\u53ea\u8981\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u5b58\u5728\u5373\u53ef\u3002 \u3010\u70b9\u51fb\u684c\u9762\u56fe\u6807\u542f\u52a8\u3011 \u684c\u9762\u56fe\u6807\u76ee\u524d\u662f\u91c7\u7528\u56fe\u50cf\u8bc6\u522b\u6280\u672f\uff0c\u5b9a\u4f4d\u5230\u5e94\u7528\u56fe\u6807\u7684\u5750\u6807\uff0c\u7136\u540e\u901a\u8fc7pyauogui\u8fdb\u884c\u70b9\u51fb\u64cd\u4f5c\u3002 \u8be6\u7ec6\u6280\u672f\u65b9\u6848\u53ef\u4ee5\u53c2\u8003\u6211\u7684\u53e6\u5916\u4e24\u7bc7\u535a\u5ba2: \u57fa\u4e8eopencv\u7684\u6a21\u677f\u5339\u914d\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd4\u56de\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 Python\u4e09\u65b9\u5e93PyAutoGui\u7684\u4f7f\u7528\u65b9\u6cd5 \u3010\u4ece\u542f\u52a8\u5668\u542f\u52a8\uff08\u4fd7\u79f0\u5f00\u59cb\u83dc\u5355\uff09\u3011 \u542f\u52a8\u4e2d\u542f\u52a8\u7684\u5b9e\u73b0\u903b\u8f91\u5b9e\u9645\u548c\u4efb\u52a1\u680f\u4e0a\u542f\u52a8\u5dee\u4e0d\u591a\u3002 \u9996\u5148\uff0c\u9700\u8981\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u542f\u52a8\u5668\u56fe\u6807\uff0c\u6216\u8005\u952e\u76d8super\u952e\uff0c\u5c06\u542f\u52a8\u5668\u547c\u51fa\u6765\uff0c \u7136\u540e\uff0c\u5728\u542f\u52a8\u5668\u4e2d\u70b9\u51fb\u5bf9\u5e94\u7684\u56fe\u6807\uff0c \u4f46\u662f\u8fd9\u91cc\u6709\u4e2a\u95ee\u9898\uff0c\u542f\u52a8\u5668\u4e2d\u7684\u5e94\u7528\u5217\u8868\uff0c\u4e00\u9875\u5c55\u793a\u4e0d\u5b8c\uff0c\u6240\u4ee5\u5982\u679c\u6211\u4eec\u8981\u70b9\u51fb\u7684\u5e94\u7528\u56fe\u6807\u4e0d\u5728\u7b2c\u4e00\u9875\u600e\u4e48\u529e\uff0c\u901a\u5e38\u89e3\u51b3\u65b9\u6848\u6709\u4e24\u79cd\uff1a \uff081\uff09\u9700\u8981\u8fdb\u884c\u5411\u4e0b\u6ed1\u52a8\uff0c\u8fd9\u91cc\u5c31\u6d89\u53ca\u5230\u76f8\u5e94\u7684\u8bc6\u522b\u65b9\u6848\uff0c\u5224\u65ad\u5982\u679c\u4e0d\u5728\u7b2c\u4e00\u9875\u5c31\u5f80\u4e0b\u6ed1\u52a8\u7ffb\u9875\u3002 \uff082\uff09\u542f\u52a8\u5668\u63d0\u4f9b\u641c\u7d22\u7684\u529f\u80fd\uff0c\u8f93\u5165\u5e94\u7528\u540d\u79f0\u641c\u7d22\uff0c\u7136\u540e\u8fdb\u884c\u70b9\u51fb\u3002 \u4ece\u5b9e\u9645\u64cd\u4f5c\u4e2d\u6765\u770b\uff0c\u91c7\u7528\u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u6548\u7387\u4f1a\u9ad8\u4e00\u70b9\u3002 \u3010\u7ec8\u7aef\u547d\u4ee4\u542f\u52a8\u3011 \u5728python\u4e2d\uff0c\u4f7f\u7528os.popen()\u6216os.system()\u6216\u8005subprocess.Popen()\uff0c\u5b9e\u73b0\u547d\u4ee4\u884c\u542f\u52a8\uff0c\u6bd4\u5982\uff1a import os\nos.popen('deepin-music')\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u8fdc\u7a0b\u6267\u884c\u811a\u672c\u7684\u65f6\u5019\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u7684\u95ee\u9898\u3002 \u3010\u603b\u7ed3\u3011 \u4ee5\u4e0a\u51e0\u79cd\u65b9\u6cd5\uff0c\u5404\u6709\u4f18\u7f3a\u70b9\uff0c\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff1a \uff081\uff09\u5982\u679c\u9700\u8981\u5728Jenkins\u4e2d\u505a\u6301\u7eed\u96c6\u6210\uff0c\u5efa\u8bae\u4f7f\u7528\u7b2c\u4e8c\u79cd\u4efb\u52a1\u680f\u542f\u52a8\u7684\u65b9\u6cd5\u3002 \uff082\uff09\u5982\u679c\u4e0d\u4f1a\u91c7\u7528\u8fdc\u7a0b\u6267\u884c\u7684\uff0c\u5efa\u8bae\u91c7\u7528\u7b2c\u4e00\u79cd\u6216\u8005\u6700\u540e\u4e00\u79cd\u65b9\u6848\u3002 \uff083\uff09\u7b2c\u4e09\u79cd\u548c\u7b2c\u56db\u79cd\u542f\u52a8\u65b9\u6cd5\uff0c\u901a\u5e38\u5728\u6d4b\u8bd5\u7528\u4f8b\u4e2d\u4f1a\u6d89\u53ca\u5230\uff0c\u6240\u4ee5\u5076\u5c14\u4f1a\u7528\u3002"},{"location":"RELEASE/","title":"\u7248\u672c\u66f4\u65b0\u8bb0\u5f55","text":""},{"location":"RELEASE/#2122023822","title":"2.1.2\uff082023/8/22\uff09","text":"new \u589e\u52a0 OCR \u8bc6\u522b\u81ea\u52a8\u91cd\u8bd5\u673a\u5236\uff0c\u9ed8\u8ba4\u91cd\u8bd5 2 \u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u91cd\u8bd5\u6b21\u6570\uff1b \u4f7f\u7528\u7a97\u7ba1\u6700\u65b0\u63d0\u4f9b\u7684\u4e8c\u8fdb\u5236\u63a5\u53e3\uff0c\u4f18\u5316\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u5728 Wayland \u4e0b\u83b7\u53d6\u7a97\u53e3\u4fe1\u606f\u7684\u65b9\u6cd5\uff1b\u611f\u8c22\u684c\u9762\u6d4b\u8bd5\u90e8 @\u4f55\u6743 @\u5b59\u7fe0 \u3001\u7a97\u7ba1\u7814\u53d1 @\u9ec4\u6cfd\u94ed \u7684\u5927\u529b\u652f\u6301\u3002 \u6269\u5145 skipif \u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\u51fd\u6570\uff1a skipif_xdg_type \u652f\u6301 x11 \u6216 wayland \u4e0a\u8df3\u8fc7\uff1b skipif_cpu_name \u652f\u6301\u4e0d\u540c cpu \u4e0a\u8df3\u8fc7\uff0c\u6bd4\u5982\uff1askipif_cpu_name-KLVVW5821\uff1b "},{"location":"RELEASE/#2102023818","title":"2.1.0\uff082023/8/18\uff09","text":"fix \u4fee\u590d SW \u67b6\u6784\u73af\u5883\u4f9d\u8d56\u7684\u95ee\u9898\uff0c\u539f\u56e0\u662f\u4e4b\u524d\u6211\u8fd9\u91cc\u672c\u5730\u6ca1\u6709 SW \u7684\u673a\u5668\uff0c\u6ca1\u6709\u505a\u76f8\u5173\u9002\u914d\uff1b \u4fee\u590d\u5b50\u9879\u76ee\u5355\u72ec\u9700\u8981\u4e09\u65b9\u5305 pexpect\uff0c\u7531\u4e8e\u4e4b\u524d\u662f\u9884\u88c5\u5230\u955c\u50cf\u91cc\u9762\u7684\uff0c\u4f46\u57fa\u7840\u6846\u67b6\u4e0d\u9700\u8981\uff0c\u56e0\u6b64\u6ca1\u6709\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u91cc\u9762\uff0c\u5bfc\u81f4\u5b50\u9879\u76ee\u4f9d\u8d56\u62a5\u9519\u3002 \u4fee\u590d\u5b50\u9879\u76ee cv \u5bfc\u5165\u62a5\u9519\u7684\u95ee\u9898\uff1b \u539f\u56e0\u4e3a\uff1ayouqu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u517c\u5bb9\u4e24\u79cd\u60c5\u51b5\uff0c\u4e00\u79cd\u662f\u9762\u5411\u670d\u52a1\uff0c\u5c31\u662f\u672c\u5730\u6d4b\u8bd5\u673a\u4e0d\u9700\u8981\u5b89\u88c5 OpenCV\uff0c\u7528\u4f8b\u4e2d\u7684\u56fe\u50cf\u8bc6\u522b\u4f1a\u901a\u8fc7\u8fdc\u7a0b\u670d\u52a1\u63a5\u53e3\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u548c\u7ed3\u679c\u83b7\u53d6\uff1b\u7b2c\u4e8c\u79cd\u662f\u539f\u751f\uff0c\u5c31\u662f\u672c\u5730\u76f4\u63a5\u5b89\u88c5 OpenCV \u76f4\u63a5\u7528\u3002\u4e24\u4e2a\u60c5\u51b5\u7684\u4f18\u5148\u7ea7\u662f\u4f18\u5148\u5224\u65ad\u672c\u5730\u5b58\u5728\uff0c\u5426\u5219\u8d70\u670d\u52a1\u3002 \u524d\u9762\u6211\u4eec\u5df2\u7ecf\u628a OCR \u529f\u80fd\u505a\u4e86\u670d\u52a1\u5316\uff0c\u57fa\u4e8e 1 \u5e74\u591a\u4ee5\u6765\u7684\u89c2\u5bdf\uff0c\u7528\u8d77\u6765\u5f88\u7a33\u5b9a\uff0c\u518d\u4e00\u4e2a\u5c31\u662f OpenCV \u5b89\u88c5\u5305\u662f\u6bd4\u8f83\u81c3\u80bf\u7684\uff0c\u7c97\u7565\u6570\u4e86\u4e0b\u4f9d\u8d56\u6709 30+ \u4e2a\uff0c\u800c\u4e14\u5728\u5404\u67b6\u6784\u4e0a\u4f9d\u8d56\u5305\u8fd8\u4e0d\u5c3d\u76f8\u540c\uff0c\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u65b9\u6848\u4e2d\u4e0d\u592a\u597d\u5904\u7406\uff0c\u6240\u4ee5\u672c\u6b21 2.0 \u7248\u672c\u6211\u4eec\u5927\u80c6\u7684\u5c06\u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u529f\u80fd\u4fee\u6539\u4e3a\u9762\u5411\u670d\u52a1\u7684\u65b9\u5f0f\uff0c\u524d\u671f\u6d4b\u8bd5\u4e00\u5207\u770b\u8d77\u6765\u90fd\u5f88\u548c\u8c10\u3002 \u4f46\u662f\u6ca1\u6ce8\u610f\u5230\u4e4b\u524d\u7ed9\u6d77\u71d5\u59d0\u90a3\u8fb9\u9879\u76ee\u5355\u72ec\u5b9a\u5236\u505a\u4e86\u4e2a\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\uff08\u4e3a\u4e86\u80fd\u7b80\u5355\u5e73\u6ed1\u7684\u8fc1\u79fb\u5230 youqu\uff09\uff0c\u6b64\u63a5\u53e3\u5e95\u5c42\u6ca1\u6709\u517c\u5bb9\u670d\u52a1\u5316\uff0c\u6240\u4ee5\u5979\u90a3\u8fb9\u7684\u9879\u76ee\u8c03\u7528\u6b64\u5b9a\u5236\u63a5\u53e3\u4f1a\u62a5 cv \u5bfc\u5165\u7684\u95ee\u9898\u3002 \u7531\u4e8e\u5c06\u8fd9\u4e2a\u5b9a\u5236\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\u8fdb\u884c\u670d\u52a1\u5316\u517c\u5bb9\u6539\u9020\u9700\u8981\u4e00\u5b9a\u65f6\u95f4\uff0c\u6539\u5b8c\u8fd8\u9700\u8981\u6d4b\u8bd5\uff0c\u4f46\u672c\u6b21\u65f6\u95f4\u6bd4\u8f83\u7d27\uff0c\u56e0\u6b64\u5148\u628a OpenCV \u88c5\u8fdb\u865a\u62df\u73af\u5883\uff0c\u540e\u7eed\u7248\u672c\u518d\u8003\u8651\u9488\u5bf9\u6b64\u63a5\u53e3\u505a\u4fee\u6539\u3002"},{"location":"RELEASE/#2002023816","title":"2.0.0\uff082023/8/16\uff09","text":"YouQu\uff08\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff09\u5f00\u6e90\u4e86\uff0c\u540c\u65f6\u63a8\u51fa\u4e86 2.0 \u7248\u672c\u3002 \u611f\u8c22\u738b\u6ce2\u603b\u3001\u67b6\u6784\u5e08\u5f90\u5c0f\u4e1c\u3001\u7814\u53d1\u7ecf\u7406\u90d1\u5e7c\u6208\u3001\u5218\u90d1\u7b49\u7814\u53d1\u540c\u4e8b\u7684\u5927\u529b\u652f\u6301\u3002 new 1\u3001\u65b0\u7684\u57fa\u7840\u6846\u67b6\u4ee3\u7801\u83b7\u53d6\u65b9\u5f0f\u53ca\u65b0\u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4 YouQu \u540e\u7eed\u5747\u901a\u8fc7 PyPI \u8fdb\u884c\u5305\u7684\u53d1\u5e03\uff0c\u4e5f\u5c31\u662f\u8bf4\u540e\u7eed\u53ef\u4ee5\u4f7f\u7528 pip \u8fdb\u884c\u5b89\u88c5\uff1a sudo pip3 install youqu==2.0.0\n \u8fd9\u91cc\u6709 2 \u4e2a\u5c0f\u70b9\u8981\u6ce8\u610f\uff1a \u63a8\u8350\u4f7f\u7528 sudo pip3 \uff08\u52a0 sudo\uff09\u8fdb\u884c\u5b89\u88c5\uff1b \u5982\u679c\u4e0d\u52a0 sudo \u6709\u4e9b\u673a\u5668\u53ef\u80fd $HOME/.local/bin \u4e0d\u5728\u7cfb\u7edf PATH \u73af\u5883\u76ee\u5f55\u4e0b\uff0c\u5728\u4e0d\u6dfb\u52a0\u73af\u5883\u53d8\u91cf\u7684\u60c5\u51b5\u4e0b\uff0c\u4f1a\u51fa\u73b0 YouQu \u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4\uff08youqu-startproject\uff09\u65e0\u6cd5\u4f7f\u7528\u7684\u95ee\u9898\uff1b \u5f53\u7136\uff0c\u5c06\u4e0a\u8ff0\u8def\u5f84\u6dfb\u52a0\u5230\u73af\u5883\u53d8\u91cf\u4e4b\u540e\u4e5f\u662f\u53ef\u4ee5\u7528\u7684\uff0c\u6240\u4ee5\u6211\u8fd9\u91cc\u662f\u63a8\u8350\u52a0 sudo\uff0c\u4e0d\u52a0 sudo \u4e5f\u662f\u53ef\u4ee5\u7684\uff0c\u53ea\u662f\u9700\u8981\u5173\u6ce8\u4e0b\u73af\u5883\u53d8\u91cf\u7684\u95ee\u9898\u3002 \u63a8\u8350\u6307\u5b9a\u7248\u672c\u53f7\uff08youqu==2.0.0\uff09\u5b89\u88c5\uff0c\u5982\u679c\u4e0d\u6307\u5b9a\u7248\u672c\u53f7\u9ed8\u8ba4\u662f\u5b89\u88c5\u6700\u65b0\u53d1\u5e03\u7684 YouQu \u7248\u672c\uff0c\u4f60\u53ef\u4ee5\u5728 PyPI \u4e0a\u7684 Release history \u91cc\u9762\u67e5\u770b\u6709\u54ea\u4e9b\u7248\u672c\u3002 \u5b89\u88c5\u4e4b\u540e\u4f1a\u81ea\u52a8\u751f\u6210\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu-startproject\uff0c\u4f7f\u7528\u5b83\u53ef\u4ee5\u521d\u59cb\u5316\u5de5\u7a0b\uff0c\u8fd9\u91cc\u4ee5\u97f3\u4e50\u4e3e\u4f8b\uff1b youqu-startproject autotest_deepin_music\n \u8fd9\u6837\u5c31\u4f1a\u5728\u5f53\u524d\u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a autotest_deepin_music \u76ee\u5f55\uff0c\u91cc\u9762\u5305\u542b\u4e86\u57fa\u7840\u6846\u67b6\u6240\u6709\u7684\u4ee3\u7801\uff1b \u4e4b\u540e\uff0c\u8fd8\u662f\u5728 apps \u76ee\u5f55\u4e0b\uff0c\u653e\u5165\u5b50\u9879\u76ee\u7684AT\u4ee3\u7801\u5373\u53ef\uff0c\u4f7f\u7528\u65b9\u6cd5\u548c\u8fc7\u53bb\u4e00\u6837\uff0c\u8fd9\u91cc\u5c31\u4e0d\u591a\u4ecb\u7ecd\u3002 \u53e6\u5916\uff0c\u9664\u4e86\u901a\u8fc7 pip \u83b7\u53d6\u4ee5\u5916\uff0c\u4ecd\u7136\u53ef\u4ee5\u901a\u8fc7\u6e90\u7801\u83b7\u53d6\uff08\u76f4\u63a5 git clone\uff09\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u4f7f\u7528 pip \u5b89\u88c5 YouQu \u65f6\uff0cYouQu \u5305\u7684\u5927\u5c0f\u624d 600+ k\uff0c\u5b89\u88c5\u901f\u5ea6\u8d77\u98de\u3002 2\u3001\u65b0\u7684AT\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848 \u4e3a\u4e86\u89e3\u51b3\u4ee5\u4e0b\u95ee\u9898\uff1a \u8fc7\u53bb\u4e00\u6bb5\u65f6\u95f4\u54b1\u4eec\u7ecf\u5e38\u51fa\u73b0\u7684\uff0c\u4e0d\u540c\u7684AT\u9879\u76ee\u5728\u540c\u4e00\u53f0\u673a\u5668\u4e0a\u90e8\u7f72\u73af\u5883\u65f6\u4f9d\u8d56\u7248\u672c\u51b2\u7a81\u7684\u95ee\u9898\uff0c\u65b0\u65b9\u6848\u4e0d\u540c\u7684\u9879\u76ee\u4f1a\u52a8\u6001\u751f\u6210\u81ea\u5df1\u7684\u865a\u62df\u73af\u5883\uff0c\u76f8\u4e92\u4e4b\u95f4\u4e0d\u5f71\u54cd\uff1b \u4e1a\u5185\u4e3a\u4e86\u89e3\u51b3\u7248\u672c\u51b2\u7a81\u95ee\u9898\u4e00\u822c\u90fd\u4f1a\u4f7f\u7528Python\u865a\u62df\u73af\u5883\u7684\u5de5\u5177\uff0c\u4f46\u662f\u90fd\u6709\u4e2a\u95ee\u9898\uff0c\u65e0\u6cd5\u7ba1\u7406 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u5305\uff0c\u672c\u6b21\u6211\u4eec\u89e3\u51b3\u4e86\u8fd9\u4e2a\u95ee\u9898\uff0c\u80fd\u591f\u5b8c\u5168\u7ba1\u7406\u5e38\u89c4\u7684Python\u5305\uff0c\u4e5f\u80fd\u7ba1\u7406\u5230 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u4e09\u65b9\u5305\uff1b \u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u4f7f\u7528\u65b9\u6cd5\uff1a bash env.sh\n \u53ef\u4ee5\u770b\u51fa\u6765\u548c\u539f\u6765\u4f7f\u7528\u65b9\u6cd5\u6ca1\u6709\u53d8\u5316\uff0c\u4e5f\u5c31\u662f\u8bf4\u4ece\u4f7f\u7528\u7684\u89d2\u5ea6\u662f\u5b8c\u5168\u6ca1\u6709\u533a\u522b\u7684\uff0c\u53ea\u662f\u5185\u90e8\u505a\u4e86\u4e0d\u540c\u7684\u4e8b\u60c5\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u672c\u673a\u90e8\u7f72\u7684\u529f\u80fd\u4ecd\u7136\u4fdd\u7559 env_dev.sh\uff0c\u53ef\u4ee5\u4f5c\u4e3a\u5f00\u53d1\u65f6\u7684\u73af\u5883\u90e8\u7f72\u3002 3\u3001\u65b0\u7684\u9a71\u52a8\u547d\u4ee4 \u8fc7\u53bb\u54b1\u4eec\u90fd\u662f\u4f7f\u7528\u8fd9\u6837\u7684\u547d\u4ee4\u6765\u9a71\u52a8\u6267\u884c\uff1a python3 manage.py run\n \u7531\u4e8e\u9ed8\u8ba4\u57fa\u4e8e\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848\uff0c\u56e0\u6b64\u6211\u4eec\u589e\u52a0\u4e86\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu\uff1b \u65b0\u7684\u9a71\u52a8\u65b9\u5f0f\uff1a youqu manage.py run\n \u53ea\u9700\u8981\u628a python3 \u66ff\u6362\u6210 youqu \u5c31\u53ef\u4ee5\u4e86\uff0c\u770b\u8d77\u6765\u5f88\u548c\u8c10~ 4\u3001\u65b0\u7684\u6587\u6863\u5730\u5740 \u8fc7\u53bb\u54b1\u4eec YouQu \u7684\u5728\u7ebf\u6587\u6863\u662f\u90e8\u7f72\u5728\u516c\u53f8\u5185\u7f51\u7684\uff0c\u73b0\u5728\u5f00\u6e90\u5230 github \u4e86\uff0c\u5916\u90e8\u5f00\u53d1\u8005\u80af\u5b9a\u8bbf\u95ee\u4e0d\u5230\u5185\u7f51\u7684\u6587\u6863\uff0c\u56e0\u6b64\u9700\u8981\u5c06\u6587\u6863\u90e8\u7f72\u5230\u516c\u7f51\u3010\u516c\u7f51\u6587\u6863\u3011\uff1b \u516c\u7f51\u6587\u6863\u4f7f\u7528\u7684\u662f github pages\uff08\u767d\u5ad6\u602a\u4e00\u987f\u72c2\u559c~~\uff09\uff0c\u4f46\u53ef\u80fd\u4f1a\u51fa\u73b0\u6587\u6863\u901f\u5ea6\u6162\u7684\u95ee\u9898\uff08\u4ee3\u7406\u4e0b\u5c31\u597d\u4e86\uff09\uff0c\u4e0d\u8fc7\u6ca1\u5173\u7cfb\uff0c\u54b1\u4eec\u3010\u5185\u7f51\u6587\u6863\u3011\u4ecd\u7136\u4fdd\u7559\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u3002 5\u3001\u5176\u4ed6\u4e00\u4e9b\u5c0f\u5c0f\u529f\u80fd\u66f4\u65b0\uff1a \uff081\uff09\u65b0\u589e\u5173\u95ed\u5206\u8fa8\u7387\u68c0\u6d4b\u7684\u53c2\u6570\u503c\uff1b youqu manage.py run --resolution no\n \u6216\u8005\u4fee\u6539 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387, \u6bd4\u5982\uff1a1920x1080\n;no: \u8868\u793a\u4e0d\u505a\u5206\u8fa8\u7387\u6821\u9a8c\nRESOLUTION = 1920x1080\n resolution \u8fd9\u4e2a\u53c2\u6570\u4e00\u76f4\u90fd\u6709\u7684\uff0c\u53ea\u4e0d\u8fc7\u4e4b\u524d\u662f\u7528\u4e8e\u6307\u5b9a\u5206\u8fa8\u7387\u5927\u5c0f\uff0c\u6bd4\u5982 --resolution 1920x1080\uff0c\u4f46\u6709\u4e9b\u63a5\u53e3\u7684\u9879\u76ee\u4e0d\u9700\u8981\u8fd9\u4e2a\u68c0\u67e5\uff0c\u53ef\u4ee5\u7ed9\u5b83\u4e2a no \u5c31\u597d\u4e86\uff0c\u5f53\u7136 CICD \u4e0a\u5173\u95ed\uff0c\u9700\u8981\u6d41\u6c34\u7ebf\u4e0a\u628a\u8fd9\u4e2a\u53c2\u6570\u52a0\u4e0a\uff1b \uff082\uff09\u65b0\u589e\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u7684\u547d\u4ee4\u884c\u53c2\u6570 \u4e4b\u524d\u8fd9\u4e2a\u914d\u7f6e\u9879\u53ea\u80fd\u5728 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c 1 \u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff0cRERUN >= RECORD_FAILED_CASE\u3002\n;1.\u5173\u95ed\u5f55\u5c4f\uff1aRECORD_FAILED_CASE > RERUN\n;2.\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1aRECORD_FAILED_CASE = 0\nRECORD_FAILED_CASE = 1\n \u73b0\u5728\u5c06\u5f00\u53d1\u5230\u547d\u4ee4\u884c\u53c2\u6570\u3002 youqu manage.py run --record_failed_case 2\n fix \u4fee\u590d remote \u6267\u884c\u65f6\uff0c\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u65e0\u6cd5\u751f\u6210\u6d4b\u8bd5\u62a5\u544a\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1302023710","title":"1.3.0\uff082023/7/10\uff09","text":"fix \u8fdb\u4e00\u6b65\u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b\u53c2\u8003\uff1a\u914d\u7f6ePython\u6e90\u7684\u51e0\u79cd\u65b9\u6cd5 \u4fee\u590d wayland_autotool \u53d7\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86wayland\u4e0b\u5076\u73b0\u627e\u4e0d\u5230 .Xauthority \u6587\u4ef6\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1292023626","title":"1.2.9\uff082023/6/26\uff09","text":"fix \u4f18\u5316\u8fdc\u7a0b\u6267\u884c remote \u7684\u53c2\u6570\u76f4\u63a5\u4f20\u7ed9\u8fdc\u7a0b\u673a\u5668\u7684 run \u547d\u4ee4\uff0c\u4e0d\u7528\u518d\u5355\u72ec\u5904\u7406\u8fdc\u7a0b\u6267\u884c\u7684\u53c2\u6570\u903b\u8f91\uff0c\u540e\u7eed\u4e13\u6ce8\u4e8e\u672c\u5730\u6267\u884c\u529f\u80fd\u5f00\u53d1\uff0c\u8fdc\u7a0b\u6267\u884c\u81ea\u52a8\u9002\u7528\uff1b env.sh \u79fb\u9664 pyyaml \u5b89\u88c5\uff0c\u7531\u5b50\u9879\u76ee\u5728 requirement.txt \u91cc\u9762\u5b9a\u4e49\uff0c\u6846\u67b6\u81ea\u52a8\u52a0\u8f7d\uff1b \u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b "},{"location":"RELEASE/#128202369","title":"1.2.8\uff082023/6/9\uff09","text":"fix \u4fee\u590d\u4e86 pypi \u5b89\u88c5 numpy \u5b58\u5728\u7cfb\u7edf\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#127202368","title":"1.2.7\uff082023/6/8\uff09","text":"fix env.sh \u4e2d\u5b89\u88c5 Python \u5305\u672a\u6307\u5b9a\u7248\u672c\u65f6\uff0c\u65e5\u5fd7\u8f93\u51fa\u5b89\u88c5\u7684\u7248\u672c\uff1b pdocr-rpc 2.0.1\nallure-custom 1.2.1\nfunnylog 1.1.3\n \u4fee\u590d -f \u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u62a5\u9519\u7684\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#126202367","title":"1.2.6\uff082023/6/7\uff09","text":"fix \u4fee\u590d wayland \u4e0a\u8c03\u7528\u9f20\u6807\u4e2d\u952e\u3001\u53f3\u952e\u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b \u4fee\u590d pubilic/dde_desktop_public_widget \u91cc\u9762\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u5b9a\u4f4d\u684c\u9762\u6587\u4ef6\u7684\u65b9\u6cd5\uff0c\u5750\u6807\u6ca1\u6709\u62c6\u5305\u7684\u95ee\u9898\uff1b \u4f18\u5316\u4e86\u7b49\u5f85\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b pycreeze \u7248\u672c\u5347\u7ea7\u5230 0.1.29\uff0c\u5bfc\u81f4\u4e0e pyautogui 0.9.53 \u4e0d\u517c\u5bb9\uff0cenv.sh \u91cc\u9762\u589e\u52a0\u6307\u5b9a pycreeze \u7248\u672c\u4e3a 0.1.28\uff1b "},{"location":"RELEASE/#1252023516","title":"1.2.5\uff082023/5/16\uff09","text":"new --app \u53c2\u6570\u540e\u9762\u65b0\u589e\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u76ee\u524d\u652f\u6301\u4e09\u79cd\u53c2\u6570\u4f20\u5165\u65b9\u5f0f\uff1a ~$: youqu run -a deepin-music\n~$: youqu run -a autotest_deepin_music\n~$: youqu run -a apps/autotest_deepin_music\n \u200b \u540e\u4e24\u79cd\u5165\u53c2\u65b9\u5f0f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\u3002 remote \u8fdc\u7a0b\u6267\u884c\u65b0\u589e\u4ece\u547d\u4ee4\u884c\u4f20\u5165\u6d4b\u8bd5\u673a\u4fe1\u606f\uff0c\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679c password \u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6 setting/remote.ini \u4e2d CLIENT_PASSWORD \u7684\u503c,\u6bd4\u5982\uff1auos@10.8.13.33:1 \u6216 uos@10.8.13.33 \uff1b python3 manage.py remote -c uos@10.8.13.33/uos@10.8.13.34\npython3 manage.py remote -c uos@10.8.13.33:1/uos@10.8.13.34:2\n fix \u65e5\u5fd7\u6a21\u5757\u4fee\u6539\u4e3a\u51fd\u6570\u6267\u884c\u4e4b\u524d\u6253\u5370\u65e5\u5fd7\uff1b \u65e5\u5fd7\u6a21\u5757\u589e\u52a0\u767d\u540d\u5355\uff0c\u901a\u8fc7\u7c7b\u540d\u5f00\u5934\uff0c\u7ed3\u675f\uff0c\u5305\u542b\u7b49\u5173\u952e\u5b57\u63a7\u5236\u9700\u8981\u6253\u5370\u7684\u51fd\u6570\u65e5\u5fd7\uff1b \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5982\u679c\u4f20\u5165\u4e86 app_name \u53ea\u4f1a\u5c06 apps \u76ee\u5f55\u4e0b app_name \u7684\u76ee\u5f55\u53d1\u9001\u5230\u6d4b\u8bd5\u673a\uff1b env.sh \u79fb\u9664 python3-dev\uff1b \u4fee\u590d Wayland \u4e0b env.sh \u73af\u5883\u5b89\u88c5\u5931\u8d25\u7684\u95ee\u9898\uff0c\u4f18\u5316\u4e86 deb \u4f9d\u8d56\u5b89\u88c5\u7684\u903b\u8f91\uff1b \u5c06 env.sh \u5237\u65b0\u6e90\u7684\u65e5\u5fd7\u5728\u7ec8\u7aef\u663e\u793a\uff0c\u89e3\u51b3\u5728 CI \u73af\u5883\u4e0b\uff0c\u957f\u65f6\u95f4\u4e0d\u8f93\u51fa\u65e5\u5fd7\u8fde\u63a5\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d1060 \u534e\u4e3a\u673a\u578b\u5b89\u88c5\u952e\u9f20\u5de5\u5177\u65f6\u4f9d\u8d56\u4e0d\u517c\u5bb9\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1242023227","title":"1.2.4\uff082023/2/27\uff09","text":"fix \u4fee\u6539 CURRENT \u6587\u4ef6\uff1b "},{"location":"RELEASE/#1232023227","title":"1.2.3\uff082023/2/27\uff09","text":"new pylint.sh \u652f\u6301\u901a\u8fc7\u4f4d\u7f6e\u53c2\u6570\u4f20\u5165\u6587\u4ef6\u8def\u5f84\uff1abash pylint.sh apps/autotest_deepin_music,\u597d\u5904\u662f\u53c2\u6570\u8def\u5f84\u53ef\u4ee5\u5728\u7ec8\u7aef\u8865\u5168\uff1b \u65b0\u589e\u7cfb\u7edf\u547d\u4ee4 youqu-pylint \uff0c\u7528\u4e8e\u9759\u6001\u4ee3\u7801\u626b\u63cf\uff0c\u4f7f\u7528\u65b9\u6cd5: youqu-pylint apps/autotest_deepin_music\uff1b \u7531\u4e8e\u7cfb\u7edf\u4e00\u4e9b dbus \u63a5\u53e3\u6539\u53d8\uff0c\u516c\u5171\u5e93\u4e2d\u7684 dbus \u65b9\u6cd5\u5c06\u4e0d\u518d\u7ef4\u62a4\uff0c\u7531\u5b50\u9879\u76ee\u5728 other_widget.py \u91cc\u9762\u8fdb\u884c\u7ef4\u62a4\uff1b fix \u4fee\u590d ssh \u73af\u5883\u4e0b\u8fd0\u884c\u63d0\u793a \u201c\u65e0\u6cd5\u8fde\u63a5\u201d \u7684\u95ee\u9898\uff1b \u4fee\u590d\u8fd0\u884c\u65f6\u7a0b\u5e8f\u9000\u51fa\uff0c\u4e0d\u8f93\u51fa\u5f02\u5e38\u65e5\u5fd7\u7684\u95ee\u9898\uff1b \u4fee\u590dyouqu remote xxx \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5728\u670d\u52a1\u7aef Ctrl + C \u65e0\u6cd5\u505c\u6b62\u7a0b\u5e8f\u8fd0\u884c\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#122202328","title":"1.2.2\uff082023/2/8\uff09","text":"new \u65b0\u589e\u6c14\u6ce1\u7c7b\u56fe\u50cf\u8bc6\u522b\u65b9\u6848\uff1bimage_utils.py::ImageUtil::get_during\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u533a\u57df\u8bc6\u522b\uff0c\u4f20\u5165 [x, y, w, h]\uff0cx: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u76ee\u6807\u56fe\u7247\uff0c\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\uff1b env.sh \u79fb\u9664 pypinyin; \u4f18\u5316\u6267\u884c env.sh \u65f6\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b manage.py \u79fb\u9664\u4e86\u53c2\u6570 session_timeout \uff0c\u6846\u67b6\u6839\u636e\u5168\u5c40\u7684 timeout \u4ee5\u53ca\u7528\u4f8b\u81ea\u5b9a\u4e49\u7684 timeout \u81ea\u52a8\u8ba1\u7b97\u51fa sessiontimeout \u7684\u503c\uff1b \u65b0\u589e ocr \u670d\u52a1\u5668\u94fe\u63a5\u91cd\u8bd5\uff0c\u9ed8\u8ba4\u91cd\u8bd51\u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u53c2\u6570\uff1b fix \u4fee\u590d\u4e86\u4e00\u4e9b pylint \u626b\u63cf\u7684\u4ee3\u7801\u98ce\u683c\u95ee\u9898\uff1b \u91cd\u65b0\u8bbe\u8ba1\u4e86\u6d4b\u8bd5\u62a5\u544a\u4e3b\u9898\uff1b "},{"location":"RELEASE/#121202316","title":"1.2.1\uff082023/1/6\uff09","text":"new \u652f\u6301\u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6267\u884c\u7528\u4f8b\uff1b\u53ef\u5c06python3 manage.py \u66ff\u6362\u4e3a youqu \uff1a youqu run -a deepin-music -k 001\n RPC \u670d\u52a1 IP \u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u6307\u5b9a\u4e0d\u540c\u7684\u7aef\u53e3\uff1b \u5728\u7ebf\u6587\u6863\u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u539f\u6765\u7684\u5730\u5740 10.8.10.215 \u5c06\u4e0d\u5728\u4f7f\u7528\uff1b fix \u4fee\u590d --count \u53c2\u6570\u53ef\u80fd\u51fa\u73b0\u4e0e\u5176\u4ed6\u6846\u67b6\u7684\u5de5\u7a0b\u4f9d\u8d56\u5b58\u5728\u51b2\u7a81\uff0c\u62a5\u9519\u91cd\u590d\u6ce8\u518c\u7684\u95ee\u9898\uff1b \u4fee\u590d CI \u73af\u5883\u4e0b\u591a\u4e2a\u5de5\u7a0b\u5b58\u5728 Python \u73af\u5883\u53d8\u91cf\u6307\u5411\u9519\u8bef\uff0c\u5bfc\u5305\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u5355\u72ec\u8fd0\u884c\u65b9\u6cd5\u65f6\u65e0\u65e5\u5fd7\u8f93\u51fa\u7684 Bug\uff1b "},{"location":"RELEASE/#12020221230","title":"1.2.0\uff082022/12/30\uff09","text":"1.1.4 \u7248\u672c\u9002\u914d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e14\u65b0\u589e\u4e86\u8f83\u591a\u65b0\u7279\u6027\uff0c\u6211\u4eec\u8ba1\u5212\u4f7f\u7528 1.1.4 \u7248\u672c\u8fd0\u884c\u4e00\u6bb5\u65f6\u95f4\uff0c1.2.0 \u7248\u672c\u5c06\u4fee\u590d\u671f\u95f4\u51fa\u73b0\u7684 Bug\uff0c\u7136\u540e\u4f5c\u4e3a\u7a33\u5b9a\u7248\u672c\u53d1\u5e03\u3002 new \u4fee\u6539\u5de5\u7a0b\u540d\u79f0\u4e3a youqu\uff1b \u5c06 sphinx \u6587\u6863\u5de5\u7a0b\u8fc1\u79fb\u5230\u5355\u72ec\u7684\u4ed3\u5e93\uff1b fix \u4fee\u590d startapp \u521b\u5efa\u5de5\u7a0b\u65f6\u5b58\u5728\u5de5\u7a0b\u540d\u79f0\u65f6\u65e0\u6cd5\u7ee7\u7eed\u521b\u5efa\uff1b \u4fee\u590d\u4e86 OCR \u670d\u52a1\u5728\u5e76\u53d1\u65f6\u53ef\u80fd\u51fa\u73b0\u65e0\u6cd5\u8fd4\u56de\u7ed3\u679c\u7684\u95ee\u9898\uff0c\u63d0\u5347 OCR \u670d\u52a1\u9ad8\u5e76\u53d1\u7a33\u5b9a\u6027\uff1b \u4fee\u590d PMS \u540c\u6b65\u6807\u7b7e\u5230 CSV \u6587\u4ef6\u4e0d\u652f\u6301\u7528\u4f8b\u5e93\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11420221214","title":"1.1.4\uff082022/12/14\uff09","text":"new \u65b0\u589e startapp \u5b50\u547d\u4ee4\u521b\u5efa\u5b50\u9879\u76ee\u5de5\u7a0b\u6a21\u677f: python3 manage.py startapp autotest_deepin_xxx \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u91cd\u590d\u6267\u884c\u6b21\u6570\uff1b \u53bb\u6389\u6279\u91cf\u6267\u884c\u524d\u6536\u96c6\u7528\u4f8b\u7684\u6b65\u9aa4\uff1b \u589e\u52a0\u5f00\u59cb\u6267\u884c\u65f6\u6253\u5370\u4e00\u4e9b\u6267\u884c\u53c2\u6570\uff0c\u5982\uff1a \u7528\u4f8b\u6536\u96c6\u6570\u91cf: 99\n\u5931\u8d25\u91cd\u8dd1\u6b21\u6570: 1\n\u6700\u5927\u5931\u8d25\u6b21\u6570: 49\n\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4: 200.0s (03\u520620\u79d2)\n\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4: 11880s (3\u5c0f\u65f618\u52060\u79d2)\n \u5b9a\u5236\u4fee\u6539allure\u62a5\u544alogo\u3001title\u3001\u9ed8\u8ba4\u8bed\u8a00\uff1b manage.py \u6267\u884c\u5f00\u59cb\u65f6\u6253\u5370 logo \u548c\u5f53\u524d\u7248\u672c\uff1a \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u255a\u2588\u2588\u2557 \u2588\u2588\u2554\u255d \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2584\u2584 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2580\u2580\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u2584\u2588 \u2584\u2588 \u2588 \u2588 \u2588 \u2584 \u2588 \u2584 \u2580\u2580\u2588 \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\uff1b \u88c5\u9970\u5668\u65b9\u6cd5\u6307\u5b9a\u6b21\u6570\uff1b @pytest.mark.count(2)\ndef test_music_001():\npass\n \u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u6b21\u6570\uff1b python3 manage.py run -a deepin-music -k 001 --count 2\n \u200b image_utils \u589e\u52a0\u51fd\u6570 save_temporary_picture\uff0c\u652f\u6301\u6307\u5b9a\u5c4f\u5e55\u533a\u57df\u622a\u56fe\u5e76\u8fd4\u56de\u56fe\u7247\u5b58\u653e\u7684\u672c\u5730\u8def\u5f84\uff0c\u540e\u7eed\u4f7f\u7528 assert_image_exist \u8fdb\u884c\u65ad\u8a00 Python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(x, y, width, height) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) button_center \u65b0\u589e btn_size \u83b7\u53d6\u63a7\u4ef6\u5de6\u4e0a\u89d2\u5750\u6807\u53ca\u957f\u5bbd\uff0c\u7528\u4e8e\u52a8\u6001\u7684\u622a\u53d6\u5143\u7d20\u7684\u56fe\u7247\uff0c\u53ef\u7528\u4e8e\u5b9a\u4f4d\u65ad\u8a00 python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u6240\u6709\u97f3\u4e50\u6309\u94ae\")) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) allure \u62a5\u544a\u4e2d\u5b9a\u4f4d\u95ee\u9898\u9664\u4e86\u65e5\u5fd7\u3001\u622a\u56fe\u3001\u5f55\u5c4f\u5916\uff0c\u8c03\u7528\u7684\u51fd\u6570\u589e\u52a0\u4e86 step \u6b65\u9aa4\u5c55\u793a\uff1b env.sh \u65b0\u589e\u5b89\u88c5\u5b50\u9879\u76ee Python \u4e09\u65b9\u4f9d\u8d56\uff0c\u5728\u5b50\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u5199 requirement.txt \u6587\u4ef6\uff0cenv.sh \u4f1a\u81ea\u52a8\u52a0\u8f7d\uff1b ocr \u8bc6\u522b\u65b0\u589e\u652f\u6301\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\u8fdb\u884c\u6587\u5b57\u8bc6\u522b\uff0c\u51cf\u5c11\u56e0\u5168\u5c4f\u8bc6\u522b\u65f6\uff0c\u5176\u4ed6\u6587\u5b57\u7684\u5e72\u6270 Python # \u65ad\u8a00\u97f3\u4e50\u7684\u5220\u9664\u5f39\u7a97\u4e2d\uff0c\u5305\u542b\u4e86\u201c\u786e\u8ba4\u201d\u7684\u6587\u5b57 self.assert_ocr_exist(\"\u786e\u8ba4\", picture_abspath=DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u5220\u9664\u5f39\u7a97\"))) \u65ad\u8a00\u51fd\u6570\u7684\u8c03\u7528\u4e5f\u4f1a\u81ea\u52a8\u6253\u5370\u65e5\u5fd7; env.sh \u65b0\u589e\u88c1\u526a\u4f9d\u8d56\u7684\u65b9\u6848\uff1b fix \u4fee\u590d Jenkins \u73af\u5883\u4e0b\uff0c apps \u76ee\u5f55\u4e0b\u5b50\u9879\u76ee\u5b58\u5728 auotest_deepin_xxx@tmp \u76ee\u5f55\uff0c\u5728\u4f20\u5165 app_name \u540e\u65e0\u6cd5\u6267\u884c\u7528\u4f8b\u7684\u95ee\u9898\uff1b \u4fee\u590d\u81ea\u52a8\u751f\u6210 case_list.csv \u6587\u4ef6\u65f6\uff0c\u7528\u4f8b\u987a\u5e8f\u88ab\u8c03\u6574\u7684\u95ee\u9898\uff1b env.sh \u73af\u5883\u5b89\u88c5\u79fb\u9664 git \u548c curl\uff1b \u4fee\u590d\u7528\u4f8b\u5728 setup \u9636\u6bb5\u62a5\u9519\u540e\uff0c\u672a\u5199\u5165 ci_result.json \u7684\u95ee\u9898\uff1b \u79fb\u9664 uos_ci.py\uff1b "},{"location":"RELEASE/#11320221028","title":"1.1.3\uff082022/10/28\uff09","text":"new \u65b0\u589e\u56fe\u50cf\u65ad\u8a00\u6210\u529f\u8f93\u51fa\u5339\u914d\u5ea6\uff1b \u65b0\u589e\u73af\u5883\u5b89\u88c5 yaml \u4f9d\u8d56\uff1b \u65b0\u589e\u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6570\u636e\u56de\u586b\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b \u65b0\u589e\u6d4b\u8bd5\u7ed3\u679c\u8868\u60c5\u663e\u793a\uff0c\u5e76\u4f18\u5316\u4e86\u65e5\u5fd7\u7684\u6392\u7248\uff1b \u65b0\u589e --top {number} \u7528\u4e8e\u8bb0\u5f55\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0c\u65e5\u5fd7\u751f\u6210\u5230 report/logs/top.log\uff1b fix \u4fee\u590d\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4f46\u7ec8\u7aef\u6ca1\u6709\u9519\u8bef\u65e5\u5fd7\u8f93\u51fa\u7684\u95ee\u9898\uff1b \u4fee\u6539\u5931\u8d25\u7528\u4f8b\u56de\u6eaf\u65e5\u5fd7\u4e3a\u8be6\u7ec6\u7ea7\u522b\uff1b \u4fee\u590d\u4e86\u6267\u884c\u8fdb\u5ea6\u672a\u8ba1\u7b97\u8df3\u8fc7\u7528\u4f8b\u7684\u95ee\u9898\uff0c\u5e76\u4f18\u5316\u4e86\u8fdb\u5ea6\u83b7\u53d6\u7684\u7b97\u6cd5\uff1b \u4fee\u590d env.sh \u5728 V23 \u73af\u5883\u4e0b\u5b89\u88c5\u65e0\u6cd5\u8bfb\u53d6\u5bc6\u7801\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 pms \u6d4b\u8bd5\u5957\u6267\u884c\u6216\u6d4b\u8bd5\u5355\u6267\u884c\u65f6\uff0c\u7528\u4f8bID\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b env.sh \u91cc\u9762 hub.deepin.com \u66f4\u6362\u6210 it.uniontech.com\uff1b uos_ci.py \u6d4b\u8bd5\u7ed3\u679c\u7edf\u8ba1\u65f6\uff0c\u603b\u6570\u5254\u9664 skip \u7684\u6570\u91cf "},{"location":"RELEASE/#11220220921","title":"1.1.2\uff082022/09/21\uff09","text":"new \u5728\u6ca1\u6709\u5b89\u88c5 dogtail \u7684\u60c5\u51b5\u4e0b\uff0c\u4e5f\u80fd\u4f7f\u7528 sniff \u5de5\u5177\uff1b fix \u4fee\u590d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e2d\u6ca1\u6709\u5b89\u88c5 AT \u73af\u5883\u6267\u884c uos_ci.py \u62a5\u9519\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11120220919","title":"1.1.1\uff082022/09/19\uff09","text":"new \u65b0\u589e\u6267\u884c\u8fdb\u5ea6\u663e\u793a\uff0c\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u65f6\u65e5\u5fd7\u8f93\u51fa\u5f53\u524d\u8fdb\u5ea6\uff1a[\u5f53\u524d\u6307\u5b9a\u7b2c\u51e0\u6761/\u7528\u4f8b\u603b\u6570]\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u7528\u4f8b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\u6240\u6709\u5931\u8d25\u7528\u4f8b\u7684\u5217\u8868\uff1b \u5173\u95ed\u7ec8\u7aef\u8f93\u51fa\u6355\u83b7\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u65e5\u5fd7\u5feb\u7167\uff1b \u4f18\u5316\u7ec8\u7aef\u8f93\u51fa\u5931\u8d25\u4fe1\u606f\u5197\u957f\u4e3a\u7b80\u8981\u4fe1\u606f\u8f93\u51fa\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u663e\u793a 10 \u4e2a\u6267\u884c\u6700\u6162\u7684\u7528\u4f8b\u5217\u8868\uff0c\u5e76\u8be6\u7ec6\u5217\u51fa\u5404\u4e2a\u9636\u6bb5\u7684\u8017\u65f6\uff1b \u5931\u8d25\u91cd\u8dd1\u7528\u4f8b\u91cd\u8dd1\u4e4b\u524d\u5ef6\u8fdf 1 \u79d2\uff1b \u65b0\u589e\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4ecd\u7136\u5f3a\u5236\u6267\u884c\uff1b \u7528\u4f8b\u6536\u96c6\u65f6\u4ec5\u5728 apps \u76ee\u5f55\u4e0b\u8fdb\u884c\uff0c\u5ffd\u7565 src,setting,public \u76ee\u5f55\uff1b \u65b0\u589e allure \u62a5\u544a\u5907\u4efd\u529f\u80fd\uff0c\u9ed8\u8ba4\u5907\u4efd\u81f3 allure_back \u76ee\u5f55\u4e0b\uff1b manage.py\u65b0\u589e\u53c2\u6570 --lastfailed \u7528\u4e8e\u53ea\u8dd1\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\u7684\u529f\u80fd\uff1b fix \u4fee\u590d\u4e86\u5728\u6ca1\u6709\u6307\u5b9a\u5e94\u7528\u540d\u79f0\u6267\u884c\u65f6\uff0cxml \u62a5\u544a\u751f\u6210\u8def\u5f84\u5f02\u5e38\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 uos_ci.py \u4f20\u5165 timeout \u548c session_timeout \u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11020220916","title":"1.1.0\uff082022/09/16\uff09","text":"new \u65b0\u589ePMS\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u652f\u6301\u591a\u79cd\u6570\u636e\u56de\u586b\u6a21\u5f0f\uff1b \u4f18\u5316\u4e86\u901a\u8fc7\u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u65f6PMS \u722c\u866b\u7684\u6027\u80fd\uff1b \u65b0\u589e .gitmodules \u6587\u4ef6\uff0c\u7528\u4e8e\u6807\u8bb0\u6240\u6709\u5b50\u9879\u76ee\uff0c\u65b9\u4fbf\u7edf\u4e00\u62c9\u53d6\u4ee3\u7801\uff1b env.sh \u9002\u914d\u793e\u533a\u7248\u4e0a\u5b89\u88c5\u81ea\u52a8\u5316\u73af\u5883\uff1b \u589e\u52a0\u6267\u884c\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u9519\u8bef\u7684\u529f\u80fd\uff1b README.md \u589e\u52a0 Wayland \u4e0b\u4f7f\u7528\u3001\u6d4b\u8bd5\u62a5\u544a\u67e5\u770b\u3001\u5e38\u89c1\u95ee\u9898\u7b49\u7684\u6587\u6863\u8bf4\u660e\uff1b \u589e\u52a0\u4e86\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u5bf9 setup\u3001call\u3001teardown \u8fdb\u884c\u65e5\u5fd7\u5206\u6bb5\uff1b fix \u4fee\u590d\u4e86 \u786e\u8ba4\u4fee\u590d \u5217\u6ca1\u5199\u8868\u5934\uff0c\u4f46\u5199\u4e86 fixed-xxx \u6807\u7b7e\uff0c\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u540c\u4e00\u5e94\u7528\u5185\u591a\u4e2a csv \u6587\u4ef6\u4e2d \u786e\u8ba4\u4fee\u590d \u5217\u6709\u7684\u5199\u4e86\uff0c\u6709\u7684\u6ca1\u5199\uff0c\u53ef\u80fd\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 INFO \u65e5\u5fd7\uff0c\u663e\u793a\u4e3a DEBUG \u7684\u95ee\u9898\uff1b\u4fee\u590d\u4e86\u90e8\u5206\u673a\u5668\u4e0a INFO \u65e5\u5fd7\u5185\u5bb9\u663e\u793a\u4e3a\u7ea2\u8272\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\u770b\u4e0d\u5230\u8be6\u7ec6\u4fe1\u606f\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10220220822","title":"1.0.2\uff082022/08/22\uff09","text":"new \u79fb\u9664 loguru\uff0c\u66ff\u6362\u4e3a logging\uff0c\u63a5\u53e3\u4fdd\u6301\u4e0d\u53d8\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u53d7\u5f71\u54cd\uff1b \u9ed8\u8ba4\u5f00\u542f coredump\uff1b fix \u4fee\u590d\u4e86\u4e09\u65b9\u5e93 loguru \u5076\u73b0\u5f02\u5e38\uff0c\u5bfc\u81f4\u7a0b\u5e8f\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7b2c\u4e00\u6b21\u5931\u8d25\u4e0d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10120220812","title":"1.0.1\uff082022/08/12\uff09","text":"new \u65b0\u589e RELEASE.md \u6587\u4ef6\uff0c\u7528\u4e8e\u8bb0\u5f55\u5386\u53f2\u53d1\u5e03\u7248\u672c\u7684\u66f4\u65b0\u5185\u5bb9\uff1b \u517c\u5bb9 Wayland \u6a21\u5f0f\u4e0b\u6267\u884c\u7528\u4f8b\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u7528\u7ba1\u5f53\u524d\u6d4b\u8bd5\u673a\u6267\u884c\u73af\u5883\uff0c\u6846\u67b6\u4f1a\u81ea\u52a8\u6839\u636e\u5f53\u524d\u73af\u5883\u8d70\u4e0d\u540c\u7684\u4ee3\u7801\u903b\u8f91\uff1b \u7531\u4e8e\u9700\u8981\u4fee\u6539 dogtail \u6e90\u4ee3\u7801\uff0c\u56e0\u6b64\u5c06\u4fee\u6539\u540e\u7684\u6e90\u7801\u653e\u5165\u5230\u6838\u5fc3\u5e93\u91cc\u9762 src/depends/dogtail \u540e\u7eed\u7248\u672c\u5c06\u4e0d\u9700\u8981\u5728\u7cfb\u7edf\u4e2d\u5b89\u88c5dogtail\uff1b \u5982\u679c\u5e94\u7528\u5e93\u540c\u6837\u4f7f\u7528\u4e86\u7cfb\u7edf\u5b89\u88c5\u7684 dogtail \u53ef\u80fd\u4f1a\u62a5\u9519\uff0c\u89e3\u51b3\u65b9\u6848\u662f\u5c06\u4ee3\u7801\u4e2d\u7684 import dogtail \u4fee\u6539\u4e3a from src.depends import dogtail ; fix \u91cd\u8dd1\u5931\u8d25\u4e4b\u540e\u624d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff0c\u4fee\u6539\u4e3a\u5931\u8d25\u4e4b\u540e\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":"# Attribution \uff1achengdu Test Team\n# Date \uff1a2021/08/20\n \u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d \u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d \u4ed3\u5e93\u5730\u5740\uff1ahttps://gitlabcd.uniontech.com/autotest/cd-desktop-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u65b9\u6848\u6982\u8ff0","text":"\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u667a\u80fd\u8bc6\u522b\u5e94\u7528\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u7528\u4e8e\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u64cd\u4f5c\u8fc7\u7a0b\u4e2d\u7684\u5143\u7d20\u5b9a\u4f4d\u4ee5\u53ca\u5224\u65ad\u7ed3\u679c\u65f6\u7684\u65ad\u8a00\u5904\u7406\uff1b\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\uff0c\u6d4b\u8bd5\u673a\u4e0a\u7684\u753b\u9762\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u5230\u670d\u52a1\u5668\u4e0a\uff0c\u670d\u52a1\u5668\u5bf9\u89c6\u9891\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\u540e\uff0c\u670d\u52a1\u5668\u667a\u80fd\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\u6210\u529f\uff0c\u7136\u540e\u5bf9\u6d4b\u8bd5\u673a\u4e0b\u53d1\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\uff0c\u6d4b\u8bd5\u673a\u63a5\u53d7\u5e76\u6267\u884c\u4e0b\u4e00\u6b65\u64cd\u4f5c\u3002 \u670d\u52a1\u5668\u4e0e\u6d4b\u8bd5\u673a\u4e4b\u95f4\u7684\u94fe\u63a5\uff1a \u670d\u52a1\u5668\u901a\u8fc7 USB \u4e32\u53e3\u8bbe\u5907\uff08USB-HID \u534f\u8bae\uff09\u6a21\u62df\u9f20\u6807\u952e\u76d8\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u64cd\u4f5c\u3002 \u901a\u8fc7\u89c6\u9891\u91c7\u96c6\u8bbe\u5907\u6355\u83b7\u6d4b\u8bd5\u673a\u7684\u5b9e\u65f6\u753b\u9762\u4f20\u8f93\u7ed9\u670d\u52a1\u5668\u3002 \u670d\u52a1\u5668\u5bf9\u91c7\u96c6\u7684\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\uff0c\u8bc6\u522b\u5176\u4e2d\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5e76\u8fd4\u56de\u5143\u7d20\u63a7\u4ef6\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\uff0c\u670d\u52a1\u5668\u901a\u8fc7\u667a\u80fd\u5316\u5206\u6790\uff0c\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e00\u81f4\u5c06\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\u901a\u8fc7\u4e32\u53e3\u6a21\u62df\u952e\u9f20\u4fe1\u53f7\u53d1\u9001\u7ed9\u6d4b\u8bd5\u673a\uff1b\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e0d\u4e00\u81f4\u5c06\u4f1a\u8fdb\u5165\u4e2d\u65ad\u5904\u7406\u53ca\u5f02\u5e38\u7ed3\u679c\u8f93\u51fa\uff0c\u7ee7\u7eed\u6267\u884c\u540e\u7eed\u573a\u666f\uff0c\u76f4\u81f3\u6240\u6709\u7528\u4f8b\u6d4b\u8bd5\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u6df1\u5ea6\u5b66\u4e60\u73af\u5883\u642d\u5efa","text":"\u6a21\u578b\u8bad\u7ec3\u4e3b\u8981\u5bf9 GPU \u6709\u8981\u6c42\uff0c\u8bad\u7ec3\u6a21\u578b\u7684\u673a\u5668\u663e\u5b58\u4e0d\u4f4e\u4e8e 6G\uff0c\u5176\u4ed6\u914d\u7f6e\u65e0\u7279\u6b8a\u8981\u6c42\u3002 \u63a8\u8350\u6027\u4ef7\u6bd4\u8f83\u9ad8\u914d\u7f6e \u64cd\u4f5c\u7cfb\u7edf: UnionTech OS Desktop 20 Professional Linux version 4.19.0-desktop-amd64 (deepin@deepin-PC) (Uos 8.3.0.3-3+rebuild) \u5904\u7406\u5668: Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz (\u516b\u6838 / \u5341\u516d\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460M-HDV(RD)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))/8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: TU116 [GeForce GTX 1660]\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u865a\u62df\u73af\u5883\u5b89\u88c5","text":"cd ~\nwget -c https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh\nbash Miniconda3-latest-Linux-x86_64.sh\n \u4e00\u8def\u56de\u8f66 \u7b2c\u4e00\u6b21\u63d0\u793a\u8f93\u5165 yes/no \uff1a\u8f93\u5165 yes \u7ee7\u7eed\u4e00\u8def\u56de\u8f66 \u7b2c\u4e8c\u6b21\u63d0\u793a\uff1a\u8f93\u5165 no cd ~/miniconda3/bin\nsudo chmod 777 activate\n \u6fc0\u6d3bconda\u73af\u5883 . ./activate\n \u6dfb\u52a0\u516c\u53f8\u5185\u7f51\u6e90 conda config --add channels bioconda\nconda config --add channels conda-forge\n \u5982\u679c\u662f\u5916\u7f51\u6dfb\u52a0\u5916\u7f51\u6e90 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/\n \u5982\u679c\u8981\u5220\u9664\u6e90 conda config --remove-key channels\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"2\u3001\u5b89\u88c5\u4f9d\u8d56","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u521b\u5efa\u865a\u62df\u73af\u5883","text":"conda remove --name mmlab --all # \u79fb\u9664\u6240\u6709\u865a\u62df\u73af\u5883\n conda create -n mmlab python=3.7\n conda activate mmlab\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-pytorch","title":"\uff082\uff09\u5b89\u88c5 Pytorch","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install torch==1.7.0+cu101 torchvision==0.8.1+cu101 torchaudio==0.7.0 -f https://download.pytorch.org/whl/torch_stable.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-mmcv","title":"\uff083\uff09\u5b89\u88c5 MMCV","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install mmcv-full==1.3.3 -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.7.0/index.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"\uff084\uff09\u5b89\u88c5\u663e\u5361\u9a71\u52a8","text":"\u6839\u636e\u4f60\u7684\u663e\u5361\u4e0b\u8f7d\u5bf9\u5e94\u9a71\u52a8\uff0c\u6bd4\u5982\u6211\u7684\u663e\u5361\u4e3a GTX1660\uff0c\u9a71\u52a8\u7248\u672c\u4e3a 430\uff0c\u9a71\u52a8\u4e0b\u8f7d\u5730\u5740\uff1ahttps://www.nvidia.cn/Download/Find.aspx?lang=cn CTRL+ALT+F2 \u8fdb\u5165tty\n \u7981\u7528 nouveau \u9a71\u52a8 sudo vim /etc/modprobe.d/blacklist-nouveau.conf\n \u586b\u5165\uff1a blacklist nouveau options nouveau modeset=0\n \u5237\u65b0\u914d\u7f6e\u6587\u4ef6 sudo update-initramfs -u reboot \u91cd\u542f\u540e\u518d\u8fdb\u5165 tty \u5173\u95ed\u56fe\u50cf\u754c\u9762\uff0c\u8f93\u5165\u547d\u4ee4\u5173\u95ed\u56fe\u50cf\u754c\u9762 sudo service lightdm stop\n \u5b89\u88c5\u9a71\u52a8 sudo chmod a+x NVIDIA-Linux-x86_64-430.run\nsudo ./NVIDIA-Linux-x86_64-430.run\n reboot\u91cd\u542f\uff0cnvidia-smi\u67e5\u770b\u5b89\u88c5\u72b6\u6001\u3002\u6ce8\u610f\u770b\u4e0bcuda\u7248\u672c\uff0c10.1\uff0cdriver\u7248\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u6570\u636e\u6807\u6ce8","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u6570\u636e\u6807\u6ce8","text":"\u6807\u6ce8\u4e4b\u524d\u9700\u8981\u5148\u8f6c\u6362\u56fe\u7247\u5927\u5c0f\uff0c\u5e76\u4e14\u4ee5\u6570\u5b57\u547d\u540d\uff0c\u6bcf\u7ec4\u547d\u540d\u9012\u589e"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"\uff081\uff09\u8f6c\u6362\u5927\u5c0f\u5e76\u91cd\u547d\u540d","text":"rename_pic.py import os\nimport sys\nimport cv2\nimport time\nimport getpass\nusername = getpass.getuser()\nsource_path = f\"/home/{username}/Desktop/right_menu\" # \u56fe\u7247\u8def\u5f84\nsource_dest = os.path.join('/'.join(source_path.split(\"/\")[:-1]), 'tmp')\nif not os.path.exists(source_dest):\nos.mkdir(source_dest)\nstart_name = sys.argv[1]\nfile_name_list = list()\nfor file in os.listdir(source_path):\nif file.endswith('.png'):\nfile_name_list.append(file)\nstart_name = int(start_name)\nfor file in file_name_list:\nos.rename(os.path.join(source_path,file), os.path.join(source_path, f\"{str(start_name)}.png\"))\nstart_name += 1\ntime.sleep(1)\nfor file in os.listdir(source_path):\nimage = os.path.join(source_path, str(file))\nsrc = cv2.imread(image)\nresult = cv2.resize(src, (960, 540))\nresizeImage = os.path.join(source_dest, str(file))\nprint(resizeImage)\ncv2.imwrite(str(resizeImage), result)\ncv2.waitKey(0)\ncv2.destroyAllWindows()\ntime.sleep(1)\nos.system(f'rm -rf {source_path}/*')\nos.system(f'mv {source_dest}/* {source_path}')\nos.system(f'rm -rf {source_dest}')\nprint(\"\u4e0b\u4e00\u4e2a\u5e8f\u53f7\uff1a\", start_name)\n \u6839\u636e\u7ec8\u7aef\u8f93\u51fa\u7684\u4e0b\u4e00\u4e2a\u5e8f\u53f7\u7684\u63d0\u793a\uff0c\u6267\u884c Python \u6587\u4ef6\u7684\u65f6\u5019\u4f20\u53c2\u3002 python rename_pic.py 249\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"\uff082\uff09\u5de5\u5177\u6807\u6ce8","text":"\u4f7f\u7528\u5de5\u5177 labelImg \u6807\u6ce8 sudo pip3 install PyQt5==5.13\nsudo pip3 install labelImg\n \u7ec8\u7aef\u76f4\u63a5\u8f93\u5165 labelImg\uff0c\u56de\u8f66 \u6807\u6ce8\u6a21\u5f0f\u9009\u62e9\uff1aPascalVOC"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u667a\u80fd\u6807\u6ce8","text":"\u6253\u5f00\u5c4f\u5e55\u5f55\u5236\u8f6f\u4ef6\uff0c\u5f55\u5236\u624b\u52a8\u64cd\u4f5c\u4e00\u6b21\u6d4b\u8bd5\u7528\u4f8b\uff0c\u7136\u540e\u5c06\u5f55\u5236\u7684\u89c6\u9891\u8fdb\u884c\u5206\u5e27\uff0c\u7136\u540e\u5bf9\u6bd4\u524d\u4e24\u5e27\u56fe\u6807\u76f8\u4f3c\u5ea6\uff0c\u5254\u9664\u76f8\u4f3c\u5ea6\u8fc7\u9ad8\u7684\u56fe\u7247\uff0c\u5728\u4fdd\u8bc1\u7d20\u6750\u591a\u6837\u6027\u7684\u524d\u63d0\u4e0b\uff0c\u5254\u9664\u91cd\u590d\u591a\u4f59\u7684\u56fe\u7247\u751f\u6210\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u96c6\uff0c\u7136\u540e\u53d6\u51fa\u63a7\u4ef6\u6a21\u677f\u6570\u636e\u96c6\uff0c\u901a\u8fc7 OpenCV \u6a21\u677f\u5339\u914d\u83b7\u53d6\u63a7\u4ef6\u5728\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u56fe\u7247\u4e2d\u6240\u5728\u7684\u5de6\u4e0a\u3001\u5de6\u4e0b\u3001\u53f3\u4e0a\u3001\u53f3\u4e0b\u56db\u5904\u5750\u6807\uff0c\u4ece\u800c\u6839\u636e\u6a21\u677f\u6570\u636e\u96c6\u751f\u6210\u6807\u6ce8\u6570\u636e\u3002\u53c2\u8003\u76ee\u5f55 AnnotationMaterial"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"\uff081\uff09\u6a21\u677f\u6570\u636e\u96c6\u51c6\u5907","text":"1\u3001\u5728\u754c\u9762\u622a\u53d6\u9700\u8981\u6807\u6ce8\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u653e\u5728\u76ee\u5f55\u4e0b AnnotationMaterial/template/img 2\u3001\u7ef4\u62a4\u63a7\u4ef6\u540d\u4e0e\u5143\u7d20\u63a7\u4ef6\u7684\u952e\u5bf9\uff0c\u4e00\u4e2a\u63a7\u4ef6\u540d\u53ef\u5bf9\u5e94\u591a\u4e2a\u5143\u7d20\u63a7\u4ef6 menu:\n- menu.jpg\n- menu1.jpg\n- menu2.jpg\n- menu3.jpg\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"\uff082\uff09\u7d20\u6750\u96c6\u51c6\u5907","text":"\u5f55\u5236\u89c6\u9891\u6216\u6216\u5c4f\u5e55\u622a\u56fe\u653e\u7f6e\u76ee\u5f55 AnnotationMaterial/source"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u5f00\u59cb\u6807\u6ce8","text":"python3 AnnotationMaterial/main.py\n \u751f\u6210\u7684\u6807\u6ce8\u6570\u636e\u5b58\u653e\u5728 AnnotationMaterial/result"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#mmdetection","title":"\u56db\u3001MMDetection","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1-mmdetection","title":"1\u3001 MMDetection \u4ee3\u7801","text":"MMDetection \u662f\u4e00\u4e2a\u6709\u540d\u7684\u6df1\u5ea6\u5b66\u4e60\u76ee\u6807\u68c0\u6d4b\u5f00\u6e90\u9879\u76ee\uff0c\u4e5f\u662f openMMlab \u7684\u62db\u724c\u9879\u76ee\uff0c\u4e3a\u4ec0\u4e48\u9009\u62e9\u5b83\uff0c\u5c0f\u5b69\u513f\u6ca1\u5a18\u8bf4\u6765\u8bdd\u957f\uff0c\u611f\u5174\u8da3\u53ef\u4ee5\u81ea\u884c\u6df1\u5165\u4e86\u89e3\uff1b \u4f60\u53ef\u4ee5\u76f4\u63a5\u5728 GitHub \u4e0a\u514b\u9686\u4ee3\u7801\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u54b1\u4eec\u4ed3\u5e93\u4e0b Train \u76ee\u5f55\u4e2d\u4ee3\u7801\uff0cTrain \u4e2d\u7684\u4ee3\u7801\u4e5f\u662f\u4ece GitHub \u4e0a\u62c9\u53d6\u7684\uff0c\u4e0d\u8fc7\u6211\u4eec\u6839\u636e\u9879\u76ee\u9700\u8981\u505a\u4e86\u4e00\u4e9b\u4e8c\u6b21\u5f00\u53d1\uff0c\u63a8\u8350\u76f4\u63a5\u4f7f\u7528\u5b83\u3002 \u5982\u679c\u4f60\u60f3\u4ece GitHub \u4e0a\u62c9\uff1a git clone https://github.com/open-mmlab/mmdetection.git\n# \u4e0d\u80fd\u76f4\u63a5\u62c9\u53d6\u4e3b\u5206\u652f\uff0c\u5efa\u8bae\u4f7f\u75282.12\u7248\u672c\uff0c\u4e0d\u540c\u7684\u7248\u672c\u5bf9\u5e94\u7684mmcv\u7248\u672c\u662f\u4e0d\u540c\u7684\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-voc2coco","title":"2\u3001\u62c9\u53d6 voc2coco \u4ee3\u7801","text":"git clone https://github.com/Tony607/voc2coco.git\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-coco","title":"3\u3001\u8f6c\u6362 coco \u6570\u636e\u96c6","text":"\u5c06\u6240\u6709\u7684\u56fe\u7247\u548cxml\u6587\u4ef6\u653e\u5165train2017\uff0c\u4ece\u4e2d\u6311\u9009\u51e0\u7ec4\u653e\u5165val2017\uff08\u6d4b\u8bd5\u96c6\uff09 cd mmdetection/data/coco\npython voc2coco.py train2017 annotations/instances_train2017.json\npython voc2coco.py val2017 annotations/instances_val2017.json\n \u751f\u6210json\u6587\u4ef6"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4_1","title":"4\u3001\u4fee\u6539\u914d\u7f6e","text":"\uff081\uff09\u8bfb\u53d6\u6a21\u578b\u540d\u79f0 import json\nmodule_name = []\nwith open('./instances_train2017.json', \"r+\") as f:\njson_file = f.read()\njson_dict = json.loads(json_file)\nmodule_list = json_dict.get('categories')\nfor module_info in module_list:\nname = module_info.get('name')\nmodule_name.append(name)\nprint(module_name)\nprint(\"module_num:\", len(module_name))\n # \u6ce8\u610f\u5bf9\u6bd4instances_train2017.json\u91cc\u9762\u6a21\u578b\u540d\u79f0\u7684\u987a\u5e8f\uff0c\u4e0eCLASSES\u548ccoco_classes\u91cc\u9762\u7684\u987a\u5e8f\u4fdd\u6301\u4e00\u81f4\u3002\n \uff082\uff09\u4fee\u6539 faster_rcnn_r101_2x_coco.py mmdetection/xianjin/faster_rcnn_r101_2x_coco.py \u4fee\u653946\u884c\uff0cnum_clasess\u7684\u503c\uff0c\u65b0\u589e1\u4e2a\uff0c\u5c31 +1\uff1b \uff083\uff09\u4fee\u6539 coco.py mmdetection/mmdet/datasets/coco.py CLASSES = ()\uff0c\u5728\u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b \uff084\uff09\u4fee\u6539 class_names.py mmdetection/mmdet/core/evaluation/class_names.py coco_classes \u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#5","title":"5\u3001\u7f13\u5b58\u6e05\u7406","text":"\u5220\u9664 mmdetection/build \u76ee\u5f55 python setup.py install\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#6","title":"6\u3001\u8bad\u7ec3\u6a21\u578b","text":"\uff081\uff09\u6307\u5b9a\u81ea\u5df1\u914d\u7f6e\u7684\u8bad\u7ec3\u6a21\u578b\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py --gpus 1\n \uff082\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u6d4b\u8bd5\u96c6\u7ed3\u679c\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py xianjin/epoch_24.pth --show\n \uff083\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u51c6\u786e\u5ea6\uff1b python tools/analysis_tools/analyze_logs.py plot_curve xianjin/20210530_011907.log.json --keys acc\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#7","title":"7\u3001\u5feb\u6377\u64cd\u4f5c","text":"python3 run.py\n \u5c06\u4ee5\u4e0a 4 - 7 \u6b65\u64cd\u4f5c\u6574\u5408\u6210 run.py\uff0c\u4e00\u952e\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u4e94\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\uff1b \u670d\u52a1\u7aef\u4e00\u53f0\uff08\u76ee\u524d\u4ec5\u652f\u6301AMD\u67b6\u6784\uff09\uff1b \u91c7\u96c6\u76d2\u4e00\u4e2a \uff08ACASIS hdmi\u89c6\u9891\u91c7\u96c6\u5361\uff0chttps://item.jd.com/10024310742602.html \uff09\uff1b USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\uff1b USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff1b \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5USB\u5ef6\u957f\u7ebf\uff1b \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u63a8\u8350\u914d\u7f6e","text":"\u6267\u884c\u7528\u4f8b\u7684\u670d\u52a1\u7aef\u5bf9\u914d\u7f6e\u6ca1\u6709\u7279\u6b8a\u8981\u6c42\uff0c\u5982\u679c\u6761\u4ef6\u5141\u8bb8\u914d\u7f6e\u8d8a\u9ad8\uff0c\u8bc6\u522b\u901f\u5ea6\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n \u6d4b\u8bd5\u673a\u4e0a\u4e0d\u6267\u884c\u4efb\u4f55\u811a\u672c\uff0c\u5177\u4f53\u914d\u7f6e\u6839\u636e\u6d4b\u8bd5\u9700\u8981\u51b3\u5b9a\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#usb_mk","title":"\u516d\u3001USB_MK\u4e32\u53e3\u9a71\u52a8\u65b9\u6cd5","text":"\u4f4d\u4e8econtrol_method\u76ee\u5f55\u4e0b\u7684usb_mk.py\u6587\u4ef6 \uff081\uff09\u5217\u51fa\u53ef\u901a\u4fe1\u7684\u7aef\u53e3 python3 -m serial.tools.list_ports -v\n \uff082\uff09\u4fee\u6539\u4e32\u53e3\u7684\u6743\u9650 sudo chmod 777 /dev/ttyACM0\n \uff083\uff09\u5b9e\u4f8b\u5316USB_MK import UsbMk\nusb_mk = UsbMk(\"/dev/ttyACM0\", 9600) # \u8bbe\u5907\u9ed8\u8ba49600\u4e3a\u6ce2\u7279\u7387\uff0c\u63a7\u5236\u4f20\u8f93\u901f\u7387\n \uff084\uff09USB\u4e32\u53e3\u8bbe\u5907\u9ed8\u8ba4\u6ce2\u7279\u7387\u4e3a9600\uff08\u7ecf\u6d4b\u8bd5\u6ce2\u7279\u73879600\u51c6\u786e\u6027\u6700\u597d\uff09\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up() # \u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u6c49\u5b57\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e\n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff083\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff084\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff085\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() # \u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2\n \uff086\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff087\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff088\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e03\u3001\u65b9\u6cd5\u8c03\u7528\u5165\u53c2\u89c4\u5219","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_7","title":"1\u3001\u57fa\u7c7b","text":"class Base:\ndef __init__(self):\nself._obj = image\nself._usb = usb_mk\ndef find_element_by_ai(self, element):\nreturn self._obj.find_element(element)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_6","title":"2\u3001\u5165\u53c2\u8bf4\u660e","text":"\u56fe\u50cf\u8bc6\u522b\u65b9\u6cd5\u5165\u53e3\u4e3a Base \u7c7b\u4e0b\u7684 find_element_by_ai \u3002\u4ec5\u63a5\u53d7\u4e00\u4e2a\u53c2\u6570 element\uff0c\u7c7b\u578b\u4e3a string\u3002 \u53ef\u8bc6\u522b\u7684 string \u683c\u5f0f\uff1a \uff081\uff09\u5927\u56fe\u6807\uff08 \u56fe\u6807\u5927\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\uff0c\u4f8b\uff1a Base().find_element_by_ai(\"window\")\n \uff082\uff09\u5927\u56fe\u6807 / \u5c0f\u56fe\u6807\uff08\u56fe\u6807\u5c0f\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5c0f\u56fe\u6807\uff0c\u4f8b\uff1awindow/search_btn Base().find_element_by_ai(\"window/search_btn\")\n \uff083\uff09\u5927\u56fe\u6807 / OCR\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\u5185\u7684\u6587\u5b57\uff0c\u4f8b\uff1amenu/\u5c5e\u6027 Base().find_element_by_ai(\"menu/\u5c5e\u6027\")\n \uff084\uff09OCR\uff1a\u5168\u5c4f\u8bc6\u522b\u6587\u5b57 Base().find_element_by_ai(\"\u641c\u7d22\")\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516b\u3001\u9690\u85cf\u9f20\u6807","text":"\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u8fc7\u6765\u7684\u89c6\u9891\u6d41\uff0c\u5728\u8bc6\u522b\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u53d7\u5230\u9f20\u6807\u5f71\u54cd\uff0c\u56e0\u6b64\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u9690\u85cf\u9f20\u6807\u3002 \u5c4f\u853d\u9f20\u6807\u5149\u6807\u663e\u793a ```shell script /etc/lightdm/lightdm.conf \u5728`[Seat:*]`\u4e0b\u9762\u6dfb\u52a0\u53c2\u6570\n```shell script\nxserver-command=X -bs -core -nocursor\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e5d\u3001\u667a\u80fd\u81ea\u52a8\u5316\u7684\u610f\u4e49","text":"1\u3001\u6539\u5584 Acessibility \u5b9a\u4f4d\u7684\u7a33\u5b9a\u6027\u95ee\u9898 Acessibility \u5c5e\u6027\u5b9a\u4f4d\u5b58\u5728\u5076\u5c14\u5931\u6548\u7684\u60c5\u51b5 \uff081\uff09\u5f00\u53d1\u5728\u505a\u65b0\u9700\u6c42\u5f00\u53d1\u65f6\u53ef\u80fd\u6d89\u53ca\u5230\u5bf9\u5c5e\u6027\u6807\u7b7e\u7684\u4fee\u6539\u6216\u8005\u5c42\u7ea7\u7684\u8c03\u6574\uff0c\u53ef\u80fd\u9020\u6210\u81ea\u52a8\u5316\u7528\u4f8b\u65e0\u6cd5\u5b9a\u4f4d\u5230\u5143\u7d20\u3002 \u6bd4\u59821040\u9636\u6bb5\uff0c\u97f3\u4e50\u91cd\u6784\u7684\u65f6\u5019\uff0c\u5f00\u53d1\u5bf9\u90e8\u5206\u5c5e\u6027\u548c\u5c42\u7ea7\u505a\u4e86\u4fee\u6539\uff0c\u5bfc\u81f4\u81ea\u52a8\u5316\u7528\u4f8b\u5b9a\u4f4d\u65b9\u6cd580%\u9700\u8981\u4fee\u6539\u3002 \u5f00\u53d1\u65b0\u529f\u80fd\u7684\u65f6\u5019\u5076\u5c14\u4e5f\u4f1a\u5bf9\u5c5e\u6027\u505a\u8c03\u6574\uff0c\u9047\u52305\u6b21\u3002 \uff082\uff09\u76ee\u524d\u4e3b\u8981\u4f7f\u7528Dogtail\u8bc6\u522b\u5e94\u7528Acessibility\u5c5e\u6027\u8fdb\u884c\u5b9a\u4f4d\uff0c\u662f\u83b7\u53d6\u5e94\u7528\u5f53\u524d\u754c\u9762\u7684\u5c5e\u6027tree\uff0c\u5728\u5e94\u7528\u8df3\u8f6c\u540e\uff0cDogtail\u5b58\u5728\u65e0\u6cd5\u53ca\u65f6\u83b7\u53d6\u5f53\u524d\u5c5e\u6027\u5217\u8868\u7684\u60c5\u51b5\u3002 \u591a\u5a92\u4f53\u8c03\u7528\u6587\u7ba1\u7a97\u53e3\u7684\u65f6\u5019\uff0c\u51fa\u73b0\u627e\u4e0d\u5230\u6587\u7ba1\u91cc\u9762\u5143\u7d20\u7684\u60c5\u51b5\uff0c\u76ee\u524d\u51fa\u73b010+\u6b21\u3002 \u5e94\u7528\u8bbe\u7f6e\u9875\u9762\u7684\u5c5e\u6027\u5076\u5c14\u5b58\u5728\u627e\u4e0d\u5230\u7684\u60c5\u51b5\uff0c\u9047\u52305\u6b21\u3002 \uff083\uff09Dogtail\u5de5\u5177\u672c\u8eab\u5b58\u5728\u95ee\u9898\uff0c\u6709\u65f6\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u5019\u5f88\u6162\uff0c\u8ba9\u4eba\u65e0\u6cd5\u63a5\u53d7\uff0c\u76ee\u524d\u51fa\u73b0\u8fc7\u5f88\u591a\u6b21\u3002 \u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u95f4\u6bd4\u5e73\u5e38\u61623\u500d\uff0c\u51fa\u73b04\u6b21\u3002 2\u3001\u89e3\u51b3\u4e86\u4f7f\u7528\u7edd\u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898 \u90e8\u5206\u63a7\u4ef6\u65e0\u6cd5\u6dfb\u52a0 Acessibility \u5c5e\u6027\u4ece\u800c\u4f7f\u7528\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u51fa\u73b0\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898\u3002 \uff081\uff09\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u65b9\u6cd5\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u76ee\u6807\u56fe\u7247\u8d44\u6e90\uff0c\u5728 UI \u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u4f1a\u6d89\u53ca\u5230\u76ee\u6807\u8d44\u6e90\u7684\u66ff\u6362\uff0c\u6bd4\u8f83\u8017\u8d39\u4eba\u529b\u3002 \uff082\uff09\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6cd5\u5bf9\u6bd4\u7cbe\u5ea6\u6bd4\u8f83\u641e\uff0c\u5982\u679cUI \u7684\u53d8\u66f4\u4f1a\u9020\u6210\u65e0\u6cd5\u51c6\u786e\u5b9a\u4f4d\u5230\uff0c\u81ea\u52a8\u5316\u811a\u672c\u5065\u58ee\u6027\u4e0d\u8db3\u3002 3\u3001\u4f7f\u7528\u673a\u5668\u5206\u79bb\uff0c\u89e3\u51b3\u4e86\u81ea\u52a8\u5316\u811a\u672c\u5bf9\u5e94\u7528\u7684\u5f71\u54cd\uff0c\u771f\u5b9e\u8fd8\u539f\u7528\u6237\u7684\u4f7f\u7528\u573a\u666f \u673a\u5668\u5206\u79bb\u7684\u67b6\u6784\u8bbe\u8ba1\uff0c\u4fdd\u8bc1\u4e86\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u73af\u5883\u5b8c\u5168\u7b49\u540c\u4e8e\u7528\u6237\uff0c\u6392\u9664\u6d4b\u8bd5\u811a\u672c\u7684\u5f71\u54cd\u3002 \uff081\uff09\u76ee\u524d\u7684\u529f\u80fd\u81ea\u52a8\u5316\u662f\u5728\u6d4b\u8bd5\u673a\u4e0a\u76f4\u63a5\u8fd0\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\uff0c\u52a0\u4e0a\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u6211\u4eec\u6dfb\u52a0\u4e86\u4e00\u4e9b\u8fdb\u7a0b\u76d1\u63a7\u3001\u89c6\u9891\u5f55\u5236\u7b49\u529f\u80fd\uff0c\u81ea\u52a8\u5316\u811a\u672c\u672c\u8eab\u4f1a\u6d88\u8017\u4e00\u4e9b\u7cfb\u7edf\u8d44\u6e90\uff0c\u65e0\u6cd5\u8fd8\u539f\u771f\u662f\u7684\u7528\u6237\u4f7f\u7528\u573a\u666f\u3002 \uff082\uff09\u6027\u80fd\u6d4b\u8bd5\u9700\u8981\u6392\u9664\u5176\u4ed6\u7a0b\u5e8f\u7684\u8d44\u6e90\u6d88\u8017\u5f71\u54cd\uff0c\u6027\u80fd\u81ea\u52a8\u5316\u91c7\u7528\u673a\u5668\u5206\u79bb\uff0c\u4fdd\u8bc1\u4e86\u6027\u80fd\u6570\u636e\u7684\u51c6\u786e\u6027\u3002 \u4ee5\u524d\u7684\u7528\u4f8b\u6267\u884c\u8017\u65f6\u6ca1\u6761\u572830\u79d2\u5de6\u53f3\uff0c\u73b0\u5728\u7528\u4f8b\u8017\u65f6\u572810\u79d2\u3002 4\u3001\u89e3\u51b3\u4e86UI \u8c03\u6574\u5bfc\u81f4\u5b9a\u4f4d\u5931\u8d25\u7684\u4e0d\u7a33\u5b9a\u6027\u95ee\u9898 \uff081\uff09\u89e3\u51b3\u4e86\u56e0 UI \u8c03\u6574\u5bfc\u81f4\u63a7\u4ef6\u4f4d\u7f6e\u53d8\u5316\u6216\u8272\u5dee\u53d8\u5316\u540e\u5b9a\u4f4d\u4e0d\u51c6\u786e\u7684\u95ee\u9898\uff0c\u53ea\u8981\u63a7\u4ef6\u6587\u6848\u548c\u63a7\u4ef6\u5916\u8fb9\u6846\u65e0\u53d8\u5316\u5747\u53ef\u51c6\u786e\u5b9a\u4f4d\uff1b \uff082\uff09\u76ee\u524d\u4e5f\u4f1a\u91c7\u7528\u57fa\u4e8eUI\u7684\u5b9a\u4f4d\u65b9\u6848\uff0c\u5982\u679cUI\u4f4d\u7f6e\u6709\u8c03\u6574\uff0c\u4f1a\u5bfc\u81f4\u5143\u7d20\u65e0\u6cd5\u5b9a\u4f4d\u3002 5\u3001\u7b80\u5316\u4e86\u7528\u4f8b\u7ed3\u6784\uff0c\u63d0\u5347\u7f16\u5199\u53cb\u597d\u5ea6 \uff081\uff09\u667a\u80fd\u81ea\u52a8\u5316\u8bc6\u522b\u5143\u7d20\u7684\u65b9\u6cd5\u53ea\u6709\u4e00\u4e2a\uff0c\u5c31\u662f\u57fa\u4e8e\u6211\u4eec\u8bad\u7ec3\u7684\u6a21\u578b\u8bc6\u522b\u89c6\u9891\u6d41\u4e2d\u7684\u5143\u7d20\uff0c\u7ecf\u8fc7\u811a\u672c\u5c01\u88c5\u4e4b\u540e\uff0c\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u4e2d\u6240\u6709\u5b9a\u4f4d\u7684\u64cd\u4f5c\u90fd\u53ea\u9700\u8981\u8c03\u7528\u8fd9\u4e00\u4e2a\u65b9\u6cd5\u5c31\u884c\u4e86\uff0c\u7f16\u5199\u81ea\u52a8\u5316\u811a\u672c\u7684\u96be\u5ea6\u5927\u5927\u964d\u4f4e\u3002 \uff082\uff09\u4e5f\u662f\u7531\u4e8e\u8c03\u7528\u65b9\u6cd5\u7b80\u5355\uff0c\u5728 UI \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u4e2d\u7684\u5206\u5c42\u7ed3\u6784\u5c06\u4f1a\u51cf\u5c11\uff0c\u591a\u7ee7\u627f\u7684\u60c5\u51b5\u4f1a\u51cf\u5c11\uff0c\u81ea\u52a8\u5316\u4ee3\u7801\u7684\u8c03\u7528\u7ed3\u6784\u4e5f\u4f1a\u53d8\u5f97\u7b80\u5355\uff0c\u800c\u4e14\u529f\u80fd\u6d4b\u8bd5\u540c\u5b66\u7f16\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u66f4\u52a0\u5bb9\u6613\u4e0a\u624b\u3002 \u4ee5\u524d\u5199\u7528\u4f8b\u7531\u4e8e\u9700\u8981\u7ed3\u5408\u4e0d\u540c\u7684\u6a21\u5757\uff0c\u8c03\u7528\u4e0d\u540c\u7684\u65b9\u6cd5\uff0c\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u5e76\u5b8c\u6210\u8c03\u8bd5\u7684\u65f6\u95f4\u5e73\u5747\u572820-30\u5206\u949f\uff0c\u73b0\u5728\u5199\u7528\u4f8b\u811a\u672c\u80fd\u57285\u5206\u949f\u5de6\u53f3\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":"# =============================================\n# Attribution : Application Test Department III\n# Time : 2023/1/3\n# Author : ut003281\n# =============================================\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u7b80\u8ff0","text":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5 \u901a\u8fc7\u81ea\u52a8\u5316\u624b\u6bb5\u5bf9\u5e94\u7528\u8fdb\u884c\u6027\u80fd\u6d4b\u8bd5\uff0c\u63d0\u4f9b\u65b9\u4fbf\u7684\u73af\u5883\u90e8\u7f72\u3001\u8fd0\u884c\u914d\u7f6e\u3001\u7528\u4f8b\u7f16\u5199\u7b49\uff0c\u7528\u4e8e\u684c\u9762\u5e94\u7528\u7684\u51b7\u70ed\u542f\u52a8\u3001\u8d44\u6e90\u62f7\u8d1d\u3001\u9875\u9762\u8df3\u8f6c\u7b49\u6027\u80fd\u573a\u666f\u6d4b\u8bd5\u3002 \u4ed3\u5e93\u5730\u5740\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-perf-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u4ee3\u7801\u7ed3\u6784","text":"autotest-perf-aitest\n\u251c\u2500\u2500 apps # \u5b58\u653e\u6240\u6709\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u811a\u672c\n\u251c\u2500\u2500 conftest.py # pytest hook\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 CURRENT # \u7248\u672c\u5185\u5bb9\n\u251c\u2500\u2500 docs # \u6587\u6863\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u952e\u503c\u5bf9\u7167\u8868.pdf # \u4e32\u53e3\u7ebfcode\u4e0e\u6309\u952e\u7684\u5bf9\u7167\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u6027\u80fd\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\u6267\u884c\u5668\u4f7f\u7528\u6307\u5357.md # \u6267\u884c\u5668\u811a\u672c\u4f7f\u7528\u6307\u5357\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 USB\u4e32\u53e3\u8f6cUSB\u952e\u76d8\u9f20\u6807\u7ebf\u534f\u8bae\u6587\u4ef6V1.0.pdf # \u4e32\u53e3\u534f\u8bae\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput-0.28.2.zip # Linux\u4e0b\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\u7684\u6e90\u7801\uff0c\u53ef\u6839\u636e\u67b6\u6784\u6253\u5305\n\u251c\u2500\u2500 manage.py # \u529f\u80fd\u4e3b\u5165\u53e3\n\u251c\u2500\u2500 pytest.ini # pytst \u914d\u7f6e\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 setting # \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 client.ini # \u6d4b\u8bd5\u673a IP \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5168\u5c40\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dev_env.sh # \u5bbf\u4e3b\u673a\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose_no_relay.yml # \u65e0\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose.yml # \u6709\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker_login.sh # docker \u767b\u9646\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 res\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 black.png # \u5168\u9ed1\u56fe\u7247\uff0c\u7528\u4e8e\u4fee\u6539\u58c1\u7eb8\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_5000.deb # 3A5000 \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_amd64.deb # amd \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_arm64.deb # arm \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_mips64.deb # mips \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_sw_64.deb # sw \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 server.ini # \u670d\u52a1\u5668\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 setup.sh # \u5bb9\u5668\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 template # \u521b\u5efa app \u57fa\u7840\u811a\u672c\u6a21\u677f\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 app_template\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ${app_name}_widget.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 control-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 images\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 test_${app_name}_01_scene.json-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 test_${app_name}_01_scene.py-tpl\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 uos_docker # \u5bb9\u5668\u73af\u5883\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dockerfile\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 requirements.txt\n\u2514\u2500\u2500 src\n \u251c\u2500\u2500 analysis_save.py # \u89e3\u6790\u56fe\u7247\u6d41\u7ed3\u679c\uff0c\u6c47\u603b\u751f\u6210 excel \u62a5\u544a\n\u251c\u2500\u2500 base_widget.py # \u5c01\u88c5\u7684\u57fa\u7840\u64cd\u4f5c\uff0c\u5e94\u7528\u8c03\u7528\u7684\u4e3b\u5165\u53e3\u65b9\u6cd5\n\u251c\u2500\u2500 cmdctl.py # \u8c03\u7528\u547d\u4ee4\u884c\u4f7f\u7528\n\u251c\u2500\u2500 global_value.py # \u5168\u5c40\u53d8\u91cf\n\u251c\u2500\u2500 image_utils.py # \u56fe\u7247\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 __init__.py\n \u251c\u2500\u2500 logger_utils.py # \u65e5\u5fd7\u914d\u7f6e\n\u251c\u2500\u2500 pdocr.py # ocr \u914d\u7f6e\n\u251c\u2500\u2500 public_method.py # \u4e00\u4e9b\u65b9\u4fbf\u7684\u5c01\u4f4f\n\u251c\u2500\u2500 record.py # \u5f55\u5c4f\u76f8\u5173\n\u251c\u2500\u2500 rtk # \u8fd0\u884c\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 _base.py # \u4e00\u4e9b\u679a\u4e3e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 install_env.py # \u5b89\u88c5\u73af\u5883\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 local_runner.py # \u8fd0\u884c\u7528\u4f8b\n\u251c\u2500\u2500 serial_communication # \u4e32\u53e3\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 power_control.py # \u7ee7\u7535\u5668\u64cd\u4f5c\uff0c\u4f7f\u7528\u7ee7\u7535\u5668\u8fde\u63a5\u4e3b\u673a\u7535\u6e90\uff0c\u63a7\u5236\u5f00\u5173\u673a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 serial_common.py # \u4e32\u53e3\u516c\u5171\u65b9\u6cd5\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 usb_mk.py # \u952e\u9f20\u64cd\u4f5c\u57fa\u7840\u5c01\u88c5\n\u251c\u2500\u2500 shortcut_key.py # \u5feb\u6377\u952e\u7684\u5c01\u88c5\n\u251c\u2500\u2500 singleton.py # \u5355\u4f8b\u6a21\u5f0f\n\u251c\u2500\u2500 start_app.py # \u521b\u5efa app\n\u2514\u2500\u2500 write_xlsx.py # \u751f\u6210 excel\n# __init__.py \u6587\u4ef6\u4e3a\u6807\u8bc6\u8be5\u76ee\u5f55\u662f\u4e00\u4e2aPython\u7684\u6a21\u5757\u5305\uff0c\u9879\u76ee\u4e2d\u7684__init__.py\u5747\u4e3a\u7a7a\u6587\u4ef6\u3002\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u73af\u5883\u642d\u5efa","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\u3002 \u670d\u52a1\u7aef\u4e00\u53f0\u3002\uff08\u4ec5\u652f\u6301 AMD \u67b6\u6784\uff0c\u82e5\u9700\u5176\u4ed6\u67b6\u6784\uff0c\u54a8\u8be2\u76f8\u5173\u5f00\u53d1\u4eba\u5458\uff09 \u91c7\u96c6\u76d2\u4e00\u4e2a\u3002 \uff08ACASIS HDMI \u89c6\u9891\u91c7\u96c6\u76d2\uff0chttps://item.jd.com/100013302599.html#crumb-wrap \uff09 USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\u3002\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"\uff082\uff09\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\u3002 USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff08USB3.0 \u63a5\u53e3\u4e0a\uff09\u3002 \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5 USB \u5ef6\u957f\u7ebf\u3002 \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u670d\u52a1\u7aef\u63a8\u8350\u914d\u7f6e","text":"\u914d\u7f6e\u8d8a\u9ad8\uff0c\u89e3\u6790\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"2\u3001\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa","text":" \u6253\u5f00\u63a7\u5236\u4e2d\u5fc3\uff0c\u8d26\u6237\u8bbe\u7f6e\u4e3a\u3010\u81ea\u52a8\u767b\u5f55\u3011\u548c\u3010\u65e0\u5bc6\u7801\u767b\u5f55\u3011\uff0c\u7535\u6e90\u7ba1\u7406\u4e2d\u4f7f\u7528\u7535\u6e90\u5168\u90e8\u8bbe\u7f6e\u4e3a\u3010\u4ece\u4e0d\u3011\uff0c\u5f00\u542f\u5f00\u53d1\u8005\u6a21\u5f0f\u3002 \u6839\u636e\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u8981\u6c42\uff0c\u5bfc\u5165\u76f8\u5173\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\uff1a\u5bfc\u5165\u76f8\u518c\u3001\u5f71\u9662\u3001\u97f3\u4e50\u7684\u6d4b\u8bd5\u8d44\u6e90\u3002 \u5728\u670d\u52a1\u7aef\u6253\u5f00\u76f8\u673a\u5e94\u7528\u540e\uff0c\u5c06\u6d4b\u8bd5\u673a\u684c\u9762\u58c1\u7eb8\u66f4\u6362\u4e3a\u7eaf\u8272\u58c1\u7eb8\uff08\u6ce8\u610f\uff0c\u670d\u52a1\u7aef\u9700\u63d0\u524d\u5f00\u542f\u76f8\u673a\u540e\u518d\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u58c1\u7eb8\uff0c\u5efa\u8bae\u7eaf\u9ed1\u58c1\u7eb8 setting/res/black.png\uff09 \u5728\u6587\u4ef6\u7ba1\u7406\u5668\u4e2d\uff0c\u5c06\u9009\u9879 \u4e3b\u83dc\u5355-\u8bbe\u7f6e-\u9884\u89c8-\u56fe\u7247\u9884\u89c8 \u53d6\u6d88\u52fe\u9009\uff08\u5982\u4e0d\u53d6\u6d88\uff0c\u4f1a\u5f71\u54cd\u622a\u56fe\u5f55\u5c4f\u5e94\u7528\u7684\u6027\u80fd\u6570\u636e\uff09 \u79fb\u52a8\u6216\u5220\u9664\u7cfb\u7edf Logo \uff0c\u6392\u9664\u684c\u9762\u53f3\u4e0b\u89d2 Logo \u7684\u5f71\u54cd\uff08\u91cd\u542f\u751f\u6548\uff09\u3002 sudo mv /usr/share/deepin/uos_logo.svg ~/Pictures/\n \u5b89\u88c5\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\uff08\u5fc5\u987b\u5b89\u88c5\uff01\uff01\uff09 AMD \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_amd64.deb ARM \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_arm64.deb MIPS \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_mips64.deb 3A5000 \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_5000.deb \u5b89\u88c5\u547d\u4ee4 sudo dkpg -i xserver-xorg-input-libinput_0.28.2-2_amd64.deb\n \u5b89\u88c5\u65f6\u4f1a\u63d0\u793a\u5df2\u5b58\u5728\u76f8\u540c\u7248\u672c\uff0c\u8bf7\u5ffd\u7565\uff0c\u76f4\u63a5\u8986\u76d6\u5b89\u88c5\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u4e3b\u673a\u624d\u751f\u6548"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u670d\u52a1\u7aef\u4e00\u952e\u73af\u5883\u90e8\u7f72","text":"\u73af\u5883\u642d\u5efa\u524d\u5fc5\u987b\u5148\u8fde\u63a5\u4e0a USB \u4e32\u53e3\u7ebf\u548c\u91c7\u96c6\u76d2\u3002 \u5bbf\u4e3b\u673a\u73af\u5883\u5b89\u88c5 python3 manage.py install --env host\n \u5bb9\u5668\u73af\u5883\u5b89\u88c5 python3 manage.py install --env docker\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u56db\u3001\u914d\u7f6e\u9879","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u670d\u52a1\u7aef\u914d\u7f6e","text":"setting/config/server.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u914d\u7f6e\u9879\uff0c\u5305\u542b\u4e86\u6240\u6709\u670d\u52a1\u7aef\u6240\u6709\u7684\u53ef\u914d\u7f6e\u9879\u3002 \u672c\u5730\u65e0\u7f51\u7edc\u8fd0\u884c \u5c06\u914d\u7f6e\u9879 network=0 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u672c\u5730\u6709\u7f51\u7edc\u8fd0\u884c \u914d\u7f6e\u9879 network=1 (1)\u914d\u7f6e\u9879 client_alias= \u914d\u7f6e\u4e3a\u4f60\u8981\u6d4b\u8bd5\u7684\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5982 Alias1 \u6d4b\u8bd5\u673a\u522b\u540d\u5728 setting/config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 (2)\u914d\u7f6e\u9879 client_alias= \u4e3a\u7a7a\uff0c\u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager --client_alias Alias1\uff0c\u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002(Alias1 \u4e3a\u4f60\u914d\u7f6e\u7684\u6d4b\u8bd5\u673a\u522b\u540d) (1)\u548c(2)\u53ea\u8981\u4f7f\u7528\u5176\u4e00\u5373\u53ef\u3002 \u6709\u7f51\u7edc\u8fd0\u884c\uff0c\u4e14\u9700\u8981\u901a\u8fc7 Jenkins \u4e0a\u8fd0\u884c\u4e00\u4e2a job \uff0c\u540c\u65f6\u63a7\u5236\u591a\u53f0\u673a\u5668\u3002 \u914d\u7f6e\u9879 network=1 \u914d\u7f6e\u9879 client_alias= \u4e0d\u7528\u914d\u7f6e\uff0c\u5728\u8fd0\u884c run.sh \u7684\u65f6\u5019\u76f4\u63a5\u7a7a\u683c\u52a0\u522b\u540d\u5373\u53ef\uff0c\u6bd4\u5982\uff1a\u6d4b\u8bd5\u673a\u522b\u540d\u4e3a Alias1 \uff0c\u4e14\u5df2\u7ecf\u5728 config/client.ini \u4e2d\u914d\u7f6e\u4e86 Alias1 \u7684user ip password \uff0c\u5219\u8fd0\u884c bash run.sh Alias1 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u5728 Jenkins pipeline \u91cc\u9762\u901a\u8fc7\u5e76\u884c stage \u6216\u5e76\u884c\u8c03\u7528\u4e0b\u5c42\u4efb\u52a1\u7684\u65b9\u5f0f\u53ef\u4ee5\u5b9e\u73b0\u5927\u89c4\u6a21\u7684\u6027\u80fd\u6d4b\u8bd5\u9700\u6c42\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;1\u3001KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2\u3001KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f, e.g. TAGS = L1 or smoke\n[case_conf]\n# \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\uff0cocr\u6587\u6848\u8bc6\u522b\u8f83\u6162\uff0c\u4e0d\u63a8\u8350\u4f7f\u7528\nfind_by = stage\n# \u6700\u540e\u4e00\u4e2a\u7a33\u5b9a\u9636\u6bb5\u7684\u5e27\u6570\u8bc6\u522b\n# \u9996\u5e27\u5b58\u5728\u540e\u7684\u7b2c\u4e00\u4e2a\u5927\u4e8e\u8be5\u914d\u7f6e\u5e27\u6570\u7684\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u5c3e\u5e27\nfinal_stable_num=100\n# \u4ece\u8be5\u5e27\u6570\u5f00\u59cb\u8bc6\u522b\u6587\u6848\u6216\u56fe\u7247\uff0c\u51cf\u5c11\u5206\u6790\u65f6\u95f4\nstart_num = 150\n# \u8bc6\u522b\u7684\u6587\u6848\ntext=\n# \u8bc6\u522b\u56fe\u7247\nmatch=apps/xxx/images/match.png\n# \u8bc6\u522b\u76f8\u4f3c\u5ea6\nmatch_rate=0.9\n# \u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6bd4\u5982\u70ed\u542f\u52a8\u7528\u4f8b\uff0c\u4ece\u70b9\u51fb\u6253\u5f00\u5230\u505c\u6b62\u5f55\u5c4f\uff0c\u4e2d\u95f4\u7b49\u5f855\u79d2\uff1b\nduration = 15\n# \u5355\u6761\u7528\u4f8b\u6267\u884c\u7684\u6b21\u6570\ncount = 5\n# \u7a33\u5b9a\u9636\u6bb5\u5212\u5206\u7684\u76f8\u4f3c\u5ea6\nstable_similarity = 0.9997\n[server]\n# \u8c03\u8bd5\u6a21\u5f0f=1\uff0c\u4e3a\u5f00\u542f\u8c03\u8bd5\u6a21\u5f0f\uff0c0\u4e3a\u5173\u95ed\u3002\n# \u8c03\u8bd5\u6a21\u5f0f\u4e0b\u9ed8\u8ba4\u53ea\u6267\u884c\u4e00\u6b21\u7528\u4f8b\uff0c\u4e0d\u5173\u673a\n# \u7f16\u5199\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u5efa\u8bae\u5f00\u542fmaintain\u3002\nMAINTAIN = 0\n# \u8fd0\u884c\u7684\u73af\u5883docker\u5bb9\u5668\u73af\u5883\uff0chost\u5bbf\u4e3b\u673a\u73af\u5883\nENV = docker\n# \u670d\u52a1\u7aef\u5bc6\u7801\nPASSWORD=1\n# \u6307\u5b9a\u6d4b\u8bd5\u673a\u522b\u540d\n# \u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6bd4\u5982\uff1a\n# [AMD]\n# ip=10.8.15.86\n# user=uos\n# \u5176\u4e2d AMD \u4e3a\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5219client_alias=AMD\nCLIENT_ALIAS = x86\uff08Intel-i7\uff09\n# 1 \u5f00\u542f\u7f51\u7edc, 0 \u5173\u95ed\u7f51\u7edc\n# \uff081\uff09\u670d\u52a1\u7aef\u4e0e\u6d4b\u8bd5\u673a\u987b\u5728\u540c\u4e00\u7f51\u6bb5\u4e0b\uff0c\u4f60\u53ef\u4ee5\u5c1d\u8bd5\u5728\u670d\u52a1\u7aef\u901a\u8fc7ssh\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c\u5982\u679c\u53ef\u4ee5\u8fde\u63a5\uff0c\u8bf4\u660e\u7f51\u7edc\u6b63\u5e38\u3002\n# \uff082\uff09\u5f53input_type=FILE_NAME \u65f6\uff0c\u5fc5\u987b\u5f00\u542f\u7f51\u7edc\u3002\nNETWORK = 1\n# \u6027\u80fd\u7ed3\u679c\u7edf\u8ba1\u5355\u4f4d \u6beb\u79d2\u2014ms, \u79d2\u2014s\nUNIT=ms\n# \u6d4b\u8bd5\u673a\u5f00\u673a\u8fdb\u5165\u684c\u9762\u540e\u7b49\u5f85\u65f6\u95f4,\u5355\u4f4d/\u79d2\nSTARTUP_DELAY = 60\n# 1\u4e3a\u5220\u9664\u7f13\u5b58\uff0c0\u4e3a\u4e0d\u5220\u9664\u7f13\u5b58\n# \u7528\u4f8b\u6267\u884c\u5b8c\u540e\u4f1a\u5728report\u76ee\u5f55\u4e0b\u751f\u6210\u667a\u80fd\u89e3\u6790\u7684\u4e00\u4e9b\u7f13\u5b58\u56fe\u7247\u3002\nCACHE = 0\n# \u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u62a5\u544a\u4f1a\u4fdd\u5b58\u5728\u9879\u76ee\u4e0breport\u76ee\u5f55\u4e2d\uff1b\n# \u6307\u5b9a\u62a5\u544a\u76ee\u5f55\u5219\u5b58\u653e\u5230\u6307\u5b9a\u76ee\u5f55\u3002\nREPORT_PATH = report\n# \u670d\u52a1\u7aef\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684icon\u8d44\u6e90\u4f1a\u7f13\u5b58\u5728\u9879\u76ee\u4e0binput\u76ee\u5f55\u4e2d\nINPUT = input/\n# 1\u4e3a\u6d4b\u8bd5\u5b8c\u5173\u673a\uff0c0\u4e3a\u6d4b\u8bd5\u5b8c\u4e0d\u5173\u673a\nSHUTDOWN = 0\n# \u89e3\u6790\u8fdb\u7a0b\u6570\uff08\u4e0d\u63a8\u8350\u4fee\u6539\uff09\n# 3\u4e2a\u8fdb\u7a0b\u89e3\u6790\u89c6\u9891\u5df2\u7ecf\u80fd\u591f\u6ee1\u8db3\uff0c\u5373\u4f7f\u589e\u52a0\u8fdb\u7a0b\u6570\u4e5f\u4e0d\u80fd\u51cf\u5c11\u6574\u4f53\u8017\u65f6\n# \u53e6\u5916\u8fd8\u8981\u770bCPU\u6838\u6570\u662f\u5426\u652f\u6301\u3002\nPARSING_PROCESS = 3\n# 1\u4e3a\u4f7f\u7528\u7ee7\u7535\u5668\u5f00\u5173\u673a\uff0c0\u4e3a\u4f7f\u7528reboot\u547d\u4ee4\u91cd\u542f\u3002\u4f9d\u8d56\u7ee7\u7535\u5668\u786c\u4ef6\u8bbe\u5907\uff0c\u9700\u8981\u4f7f\u7528\u8054\u7cfb\u5f00\u53d1\u8005\nRELAY = 0\n# \u83b7\u53d6\u6d4b\u8bd5\u5e94\u7528\u7684\u7248\u672c, %s \u5360\u4f4d\u5e94\u7528\u540d\n# \u5982\u679c\u8be5\u914d\u7f6e\u4e3a\u7a7a\uff0c\u5219\u4e0d\u83b7\u53d6\u5e94\u7528\u7684\u7248\u672c\u4fe1\u606f\u3002\nCOMMAND = apt policy %s 2>/dev/null|grep \"\u5df2\u5b89\u88c5\"|awk -F \"\uff1a\" \"{print \\$2}\"\n# \u5173\u673a\u7b49\u5f85\u5f00\u542f\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6839\u636e\u6d4b\u8bd5\u673a\u6027\u80fd\u4e0d\u540c\uff0c\u5f00\u5173\u673a\u8017\u65f6\u53ef\u80fd\u4e0d\u540c\uff0c\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u673a\u60c5\u51b5\u914d\u7f6e\u3002\nSHUTDOWN_DELAY = 30\n# \u53ef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u56fe\u7247\u683c\u5f0f\uff0c\u4ee5\u82f1\u6587\u9017\u53f7\u9694\u5f00\u3002\n# \u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u76ee\u524d\u6211\u4eec\u4ec5\u9a8c\u8bc1\u4e86jpg,jpeg,png\u8fd9\u4e09\u79cd\u5e38\u7528\u7684\u56fe\u7247\u683c\u5f0f\u3002\nINPUT_TYPES = jpg,jpeg,png\n# \u6027\u80fd\u5206\u6790\u8865\u5e27\uff0c\u7b49\u4e8e\u6216\u4f4e\u4e8e\u8be5\u503c\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u9700\u8981\u51cf\u6389\u3002\nUN_STAB_START = 3\n# \u670d\u52a1\u7aef\u83b7\u53d6\u6d4b\u8bd5\u673a\u56fe\u50cf\u7684\u5e27\u7387\uff0c\u5373\u6bcf\u79d2\u83b7\u53d6\u591a\u5c11\u5f20\u6d4b\u8bd5\u673a\u4e0a\u7684\u56fe\u50cf\u3002\n# \u9ed8\u8ba4\u5e27\u7387\u4e3a30\u5e27/\u79d2\uff0c\u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u53ef\u80fd\u4f1a\u5bf9\u89e3\u6790\u7ed3\u679c\u9020\u6210\u504f\u5dee\u3002\nFPS = 30\n# \u4ee5\u4e0b\u573a\u666f\u7c7b\u578b\u4f1a\u91cd\u542f\u6d4b\u8bd5\u673a,\u591a\u79cd\u573a\u666f\u4f7f\u7528\u9017\u53f7\u9694\u5f00\nSCENE = cold\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = http://10.8.13.78:8890\n#\u5c4f\u5e55\u56fe\u7247\u4e34\u65f6\u5b58\u653e\u4f4d\u7f6e\nSCREEN_CACHE = /tmp/screen\n# =======================================\n[log]\n# \u65e5\u5fd7\u7ea7\u522b\uff0cOFF\u3001FATAL\u3001ERROR\u3001WARN\u3001INFO\u3001DEBUG\u3001ALL\n# \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u65e5\u5fd7\u8f93\u51fa\uff0clog_cli=INFO\u8868\u793a \u4ec5\u8f93\u51faINFO\u53ca\u4ee5\u4e0a\u7ea7\u522b\u7684\u65e5\u5fd7\u3002\nLOG_LEVEL = DEBUG\n# \u65e5\u5fd7\u6587\u4ef6\u4fdd\u5b58\u8def\u5f84\nLOG_PATH= logs\n# =======================================\n[dockerhub]\n# \u5bb9\u5668\u767b\u9646\u8d26\u53f7\nDOCKER_USER = user\n# \u5bb9\u5668\u767b\u9646\u5bc6\u7801\nDOCKER_PASSWORD = User1234\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u6d4b\u8bd5\u673a\u914d\u7f6e","text":"setting/config/client.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u4fe1\u606f\u3002 \u6709\u7f51\u7edc\u7684\u60c5\u51b5\u4e0b\uff0c\u670d\u52a1\u7aef\u9700\u8981\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u56e0\u6b64\u4f60\u9700\u8981\u5199\u5165 \u6d4b\u8bd5\u673a\u522b\u540d \u3001 user \u3001ip\u3001 password \u3002 # \u6d4b\u8bd5\u673a\u522b\u540d\n[Alias1] # \u6d4b\u8bd5\u673aip\nip=10.8.15.86 # \u6d4b\u8bd5\u673a\u7528\u6237\u540d\nuser=uos\n \u547d\u540d\u5efa\u8bae\uff1aAliasA1\u3001AliasA2\u3001AliasB1\u3001AliasB2\uff0c\u4e0d\u8981\u91cd\u540d\u3002 \u65e0\u7f51\u7edc\u60c5\u51b5\u4e0b\uff0c\u4ec5\u9700\u8981\u5173\u6ce8\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\u9879 width=\u3001 height= \u5373\u53ef\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a [client]\n# \u9ed8\u8ba4\u6d4b\u8bd5\u673a\u7528\u6237\u540d\uff0c\u5bc6\u7801\uff0cip\nip=\nuser=\n# \u6d4b\u8bd5\u673a\u5bc6\u7801\npassword=1\n# \u6d4b\u8bd5\u673a\u4e3b\u9898\ntheme=bloom\n# \u6d4b\u8bd5\u673aicon\u76ee\u5f55\npath=/usr/share/icons\n# \u7cfb\u7edfdesktop\u6587\u4ef6\u7684\u5b58\u653e\u76ee\u5f55\uff0cUOS\u7cfb\u7edf\u9ed8\u8ba4\u4e3a/usr/share/applications\ndesktop_path=/usr/share/applications\n# \u7528\u4e8e\u5224\u65ad\u6d4b\u8bd5\u673a\u662f\u5426\u5f00\u673a\u8fdb\u5165\u684c\u9762\u7684\u8bc6\u522b\u6807\u8bc6\u3002\n# 1\u3001\u901a\u8fc7\u684c\u9762\u56fe\u6807\u8bc6\u522b\u3002\n# - type=FILE_NAME\u65f6\uff0c\u670d\u52a1\u5668\u548c\u6d4b\u8bd5\u673a\u5fc5\u987b\u5728\u540c\u4e00\u5c40\u57df\u7f51\u5185\u3002\n# - power_on=dde-computer\u8868\u793a\u901a\u8fc7\u684c\u9762\u8ba1\u7b97\u673a\u56fe\u6807\u5224\u65ad\u5f00\u673a\u8fdb\u5165\u684c\u9762\u3002\n# 2\u3001\u901a\u8fc7\u672c\u5730\u56fe\u7247\u4f5c\u4e3a\u5f00\u673a\u8bc6\u522b\u3002\n# - type= \u4f20\u5165\u4e3a\u56fe\u7247\u683c\u5f0f\uff0ctype\u652f\u6301\u7684\u7c7b\u578b\u5305\u542b\u5728server.ini\u5185\u914d\u7f6e\u9879input_type=jpg,jpeg,png\u3002\n# - power_on= \u4f20\u5165\u7684\u662f\u672c\u5730\u56fe\u7247\u7684\u8def\u5f84\u3002\ntype=FILE_NAME\npower_on=dde-computer\n# \u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\uff08\u6d4b\u8bd5\u673a\u8fde\u63a5\u91c7\u96c6\u76d2\uff0c\u91c7\u96c6\u76d2\u7684\u5206\u8fa8\u7387\uff09\nheight=1080\nwidth=1920\n[AliasA1] ip=10.8.15.86\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n[AliasA2]\nip=10.8.15.20\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_2","title":"3\u3001\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e","text":"\u968f\u7740\u6d4b\u8bd5\u573a\u666f\u7684\u4e0d\u65ad\u5f15\u5165\uff0c\u53d1\u73b0\u73b0\u6709\u670d\u52a1\u7aef\u91cc\u7684\u914d\u7f6e\u9879\u5e76\u4e0d\u9002\u7528\u4e8e\u6240\u6709\u7684\u6027\u80fd\u573a\u666f\uff0c\u4e8e\u662f\u5c06\u670d\u52a1\u7aef\u914d\u7f6e\u8fdb\u884c\u4e00\u4e2a\u63d0\u53d6\uff0c\u53ef\u505a\u5355\u4e2a\u573a\u666f\u7684\u4e2a\u6027\u5316\u914d\u7f6e\uff0c\u5f53\u7136\u539f\u6765\u7684\u670d\u52a1\u7aef\u914d\u7f6e\u529f\u80fd\u4fdd\u7559\uff0c\u53ea\u662f\u5f53\u4f60\u914d\u7f6e\u4e86\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e\u540e\uff0c\u4f18\u5148\u4f7f\u7528\u4e2a\u6027\u5316\u914d\u7f6e\u91cc\u9762\u7684\u5185\u5bb9\uff0c\u4ee5\u4e0b\u662f\u5bf9\u4e2a\u6027\u5316\u914d\u7f6e\u7684\u4ecb\u7ecd\u3002 \u76ee\u524d\u6bcf\u4e00\u4e2a py \u6587\u4ef6\u5bf9\u5e94\u4e00\u4e2a\u6027\u80fd\u6d4b\u8bd5\u573a\u666f\uff0c\u4e8e\u662f\u5728\u540c\u7ea7\u76ee\u5f55\u4e0b\u521b\u5efa\u4e00\u4e2a\u4e0e\u4e4b\u540c\u540d\u7684 json \u6587\u4ef6\uff0c\u4f5c\u4e3a\u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6 apps\n\u251c\u2500\u2500 album\n \u251c\u2500\u2500 test_album_01_start.json # \u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6\n\u2514\u2500\u2500 test_album_01_start.py # \u6027\u80fd\u573a\u666f\u6587\u4ef6\n \u4ee5\u4e0b\u662f\u5bf9 json \u6587\u4ef6\u4e2d\u914d\u7f6e\u7684\u89e3\u91ca\uff0c\u82e5\u67d0\u9879\u914d\u7f6e\u4e0d\u9700\u8981\uff0c\u53ef\u4ee5\u7f3a\u5931\uff0c\u4f46\u4e0d\u80fd\u4e3a\u7a7a\uff1b {\n\"title\": \"test_album_start\", # \u6807\u9898\uff1b\u5fc5\u987b\n\"app_name\": \"deepin-album\", # \u573a\u666f\u6240\u5c5e\u7684\u5e94\u7528\uff1b\u5fc5\u987b\n\"scene\": \"hot\", # \u573a\u666f\u522b\u540d\uff1b\u5fc5\u987b\n\"icon\": [\"deepin-album\"], # \u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684icon\u5230\u670d\u52a1\u7aef\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\uff1b\u53ef\u7f3a\u5931\n# \u6ce8\u610f\uff1a\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684desktop\u6587\u4ef6\u540d\u4e3adeepin-album.desktop\uff0c\n# \u53ea\u9700\u8981\u5199deepin-album\u5373\u53ef\uff0c\u201c.desktop\u201d\u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002\n\"size\": { # \u56fe\u7247\u5bf9\u6bd4\u7684\u533a\u57df\u8bbe\u7f6e\u9879\uff0c\u67d0\u4e9b\u5e94\u7528\u5f53\u524d\u5c4f\u5e55\u7684\u90e8\u5206\u533a\u57df\u9700\u8981\u5c06\u5176\u53bb\u6389\uff0c\u53ef\u4ee5\u8bbe\u7f6e\u6b64\u9879\uff0c\u5982\u679c\u6ca1\u6709\u5219\u53ef\u4e0d\u5199\uff1b\u53ef\u786e\u5b9e\n\"x-coordinate\": 0, # \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n\"y-coordinate\": 0, # \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n\"width\": 850, # \u6a2a\u5411\u957f\u5ea6\n\"height\": 1920 # \u7eb5\u5411\u9ad8\u5ea6\n},\n\"count\": 5, # \u573a\u666f\u6267\u884c\u7684\u6b21\u6570\uff1b\u5fc5\u987b\n\"duration\": 5, # \u8be5\u6761\u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff0c\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7279\u5b9a\u573a\u666f\uff0c\u8be5\u914d\u7f6e\u4e3a\u53ef\u9009\u9879\uff0c\u8986\u76d6 server.ini \u4e2d\u7684\u914d\u7f6e\uff1b\u53ef\u7f3a\u5931\n\"stable_similarity\": 0.9997, # \u6027\u80fd\u573a\u666f\u5206\u9636\u6bb5\u65f6\u7684\u56fe\u7247\u76f8\u4f3c\u5ea6\u5bf9\u6bd4\uff0c\u524d\u540e\u56fe\u7247\u4f4e\u4e8e\u8be5\u503c\uff0c\u5219\u5206\u4e3a\u4e0d\u7a33\u5b9a\u9636\u6bb5\uff1b\u53ef\u7f3a\u5931\n\"find_by\": \"stage\", # \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\n\"final_stable_num\": 100, # \u67e5\u627e\u6700\u540e\u4e00\u4e2a\u5927\u4e8e\u8be5\u503c\u7684\u7a33\u5b9a\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u7684\u5c3e\u796f\uff1b\u53ef\u7f3a\u5931\n\"start_num\": 150,\n\"text\": \"\", # ocr\u8bc6\u522b\u7684\u6587\u6848\n\"match\": \"apps/xxx/images/match.png\", # \u56fe\u50cf\u5339\u914d\u7684\u56fe\u7247\u6587\u4ef6\u8def\u5f84\n\"match_rate\": 0.9 # \u5339\u914d\u76f8\u4f3c\u5ea6\n}\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e94\u3001\u6d4b\u8bd5\u6d41\u7a0b","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516d\u3001\u7528\u4f8b\u7f16\u5199\u53ca\u65b9\u6cd5\u53c2\u6570\u6307\u5f15","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"1\u3001\u7528\u4f8b\u5b9e\u4f8b\u8bf4\u660e","text":"# \u6807\u51c6\u5e93\u5bfc\u5165\nfrom time import sleep\n# \u5bfc\u5165\u4e09\u65b9\u5e93pytest\nimport pytest\n# \u5bfc\u5165\u7528\u4f8b\u6267\u884c\u8981\u7528\u5230\u7684Widget\u7c7b\nfrom src.base_widget import BaseWidget\nclass TestStart:\n# class\u7ea7\u522b\u7684fixture\uff0c\u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u6267\u884c\u3002autouse=True \u81ea\u52a8\u5728\u5f53\u524d\u4f5c\u7528\u57df\u4e0b\u4f7f\u7528\u3002\n@pytest.fixture(scope=\"class\", autouse=True)\n# \u6d4b\u8bd5\u70ed\u542f\u52a8\u4e4b\u524d\u9700\u8981\u9884\u542f\u52a8\u3002\ndef application_pre_start(self):\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().right_click_element(\"deepin-album\")\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().click_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\")\nsleep(2)\n# \u5feb\u6377\u952e\u5173\u95ed\u7a97\u53e3\nBaseWidget().hot_key(\"alt\", \"f4\")\nsleep(2)\n# \u9ed8\u8ba4\u4e3afunction\u7ea7\u522b\u7684fixture\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\uff0cclass\u7ea7\u522bfixture\u6267\u884c\u4e4b\u540e\u6267\u884c\u3002\n@pytest.fixture(autouse=True)\ndef setup_start(self):\n# \u53f3\u952e\u70b9\u51fb deepin-album \u56fe\u6807\nBaseWidget().right_click_element(\"deepin-album\")\n# \u79fb\u52a8\u5230\u53f3\u952e\u83dc\u5355\u4e2d\u6253\u5f00\uff08open.png\uff09\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().move_to(*BaseWidget().find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))\n# \u7b49\u5f85\u79fb\u52a8\u5b8c\u6210\nsleep(0.5)\ndef test_album_start(self):\n# \u70b9\u51fb\u201c\u6253\u5f00\u201d\nBaseWidget().click() \n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"2\u3001\u65b9\u6cd5\u53c2\u6570\u8bf4\u660e","text":"2.1\u3001find_element \u65b9\u6cd5 def find_element(element: str, input_type: str = \"FILE_NAME\", fill_color_position: tuple = (-1, -1), size: tuple = (25, 70)):\npass\n \u53c2\u6570 element \u548c input_type \uff081\uff09\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u5143\u7d20 - `input_type` \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a `FIEL_NAME` \uff0c\u8868\u793a\u901a\u8fc7\u5e94\u7528 `icon` \u5bfb\u627e\u5143\u7d20\uff0c\u6b64\u65b9\u6cd5\u4f1a\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u5e94\u7528 `icon` \u56fe\u6807\u3002\n \u4e3e\u4f8b\uff1a\u9ed8\u8ba4\u60c5\u51b5\u4e0b input_type \u53c2\u6570\u4e0d\u9700\u8981\u4f20\u5165\uff0c find_element(\"deepin-album\")\uff0c\u8868\u793a\u901a\u8fc7 deepin-album \u7684\u5e94\u7528 icon \u6765\u83b7\u53d6\u5750\u6807\uff0c\u6ce8\u610f\uff0c\u6b64\u65f6\u4f20\u5165\u7684 deepin-album \u53c2\u6570\u5b9e\u9645\u662f desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u548c2.3\u4e2d\u7684 icon \u53d8\u91cf\u4e00\u81f4\u3002 \u6211\u4eec\u5efa\u8bae\u4f18\u5148\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\uff0c\u4f46\u6b64\u65b9\u6cd5\u4f9d\u8d56\u7f51\u7edc\uff0c\u8bf7\u6839\u636e\u6d4b\u8bd5\u73af\u5883\u5b9e\u9645\u60c5\u51b5\u9009\u62e9\u3002 \uff082\uff09\u901a\u8fc7\u672c\u5730\u56fe\u7247\u8bc6\u522b\u5143\u7d20 - \u53c2\u6570 `input_type` \u4f20\u5165\u56fe\u7247\u683c\u5f0f\uff0c\u6bd4\u5982\u622a\u53d6\u7684\u672c\u5730\u56fe\u7247\u683c\u5f0f\u4e3a `png`\uff0c\u90a3\u4e48 `input_type=\"png\"`\uff0c\u6b64\u65f6\u53c2\u6570 `element ` \u4f20\u5165\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5efa\u8bae\u5b58\u653e\u5728\u5bf9\u5e94\u7684\u4ea7\u54c1 `apps/app/picture/` \u76ee\u5f55\u4e0b\uff0c\u8def\u5f84\u4e3a\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u7684\u76f8\u5bf9\u8def\u5f84\u3002\n- \u4e3e\u4f8b\uff1a`find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))`\uff0c\u8868\u793a\u901a\u8fc7\u672c\u5730\u56fe\u7247 `open.png` \u8bc6\u522b\u5143\u7d20\u3002\n \u53c2\u6570 fill_color_position fill_color_position \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (-1, -1)\uff0c(-1, -1) \u8868\u793a\u53d6\u5c4f\u5e55\u4e2d\u53f3\u4e0b\u89d2\u6700\u540e\u4e00\u4e2a\u50cf\u7d20\u70b9\u4f5c\u4e3a\u586b\u5145\u5750\u6807\uff0c\u5728 1920x1080 \u5c4f\u5e55\u5206\u8fa8\u7387\u4e0b\u5373\u5b9e\u9645\u5750\u6807\u4e3a (1919, 1079) \uff0c\u8fd9\u6837\u7684\u5199\u6cd5\u53ef\u4ee5\u9002\u914d\u4e0d\u540c\u5927\u5c0f\u7684\u5c4f\u5e55\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0d\u540c\u65b9\u4f4d\uff1a \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0b\u65b9\uff0c\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u4e0d\u9700\u8981\u4f20\u5165\u8be5\u53c2\u6570\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u5de6\u8fb9\uff0cfill_color_position=(1, 1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u53f3\u8fb9\uff0cfill_color_position=(-1, -1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0a\u8fb9\uff0cfill_color_position=(1, 1) \u4ece\u684c\u9762\u542f\u52a8\u5e94\u7528\uff0c\u5219\u9700\u8981\u4f20\u5165\u9664\u4efb\u52a1\u680f\u4ee5\u5916\u5176\u4ed6\u4f4d\u7f6e\u7684\u5750\u6807\uff0c\u6bd4\u5982(100, 100)\uff0c\u53ea\u8981\u8fd9\u4e2a\u5750\u6807\u4e3a\u9664\u5e94\u7528\u548c\u4efb\u52a1\u680f\u533a\u57df\u90fd\u53ef\u4ee5\u3002 \u4ece\u542f\u52a8\u5668\u91cc\u9762\u542f\u52a8\u5e94\u7528\uff0c\u9700\u8981\u586b\u5145\u7684\u5750\u6807\u4e3a\u542f\u52a8\u5668\u533a\u57df\u3002 \u6ce8\uff1a\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u65f6\uff0c\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684 icon \u539f\u6587\u4ef6\u4e3a svg \u77e2\u91cf\u56fe\uff0c\u8f6c\u6362\u4e3a png \u4e4b\u540e\u9700\u8981\u586b\u5145\u8fb9\u7f18\u900f\u660e\u90e8\u5206\u3002 \u53c2\u6570 size size \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (25, 70)\uff0c\u8868\u793a\u6d4b\u8bd5\u673a\u4e0a dock \u680f\u4e0a\u5e94\u7528\u56fe\u6807\u7684\u5927\u5c0f\u8303\u56f4\u3002 UOS \u7cfb\u7edf dock \u680f\u662f\u53ef\u4ee5\u4e0a\u4e0b\u62d6\u52a8\u5927\u5c0f\u7684\uff0c\u968f\u7740 dock \u680f\u5927\u5c0f\u6539\u53d8\uff0c\u5e94\u7528\u56fe\u6807\u7684\u8303\u56f4\u4e3a25\u523070\u4e4b\u95f4\u3002 \u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u64cd\u4f5c\u7cfb\u7edf\u4e0a dock \u680f\u5927\u5c0f\u4e0d\u4e00\u6837\uff0c\u53ef\u4ee5\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u4f20\u5165\u5927\u5c0f\u8303\u56f4\u3002 2.2\u3001click_element\u3001 right_click_element\uff0c double_click_element \u8fd9\u51e0\u4e2a\u65b9\u6cd5\u53c2\u6570\u89c4\u5219\u4e0e find_element \u65b9\u6cd5\u4e00\u6837\u3002\u4ed6\u4eec\u5b9e\u9645\u4e0a\u662f\u5728 find_element \u65b9\u6cd5\u57fa\u7840\u4e4b\u4e0a\u505a\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u589e\u52a0\u4e86\u9f20\u6807\u7684\u52a8\u4f5c\uff0c\u5982\u679c\u4f60\u4e0d\u60f3\u4f7f\u7528\u8fd9\u51e0\u4e2a\u65b9\u6cd5\uff0c\u5728\u7528\u4f8b\u4e2d\u4e5f\u53ef\u4ee5\u901a\u8fc7 find_element \u83b7\u53d6\u5230\u5750\u6807\uff0c\u7136\u540e\u5c06\u5750\u6807\u4f20\u5165\u5230\u952e\u9f20\u7684\u65b9\u6cd5\u4e2d\uff0c\u53ef\u4ee5\u5b9e\u73b0\u540c\u6837\u7684\u6548\u679c\u3002 2.3\u3001\u7528\u4f8b\u7c7b\u4e2d\u6709\u4e2a\u7c7b\u53d8\u91cf icon = [\"deepin-album\"] \u9700\u8981\u7279\u6b8a\u8bf4\u660e\uff0c\u5217\u8868\u4e2d\u7684\u5143\u7d20\u4e3a\u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709 icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684 icon \u5230\u670d\u52a1\u7aef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528 desktop \u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684 desktop \u6587\u4ef6\u540d\u4e3a deepin-album.desktop\uff0c\u53ea\u9700\u8981\u5199 deepin-album \u5373\u53ef\uff0c.desktop \u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e03\u3001\u6267\u884c\u5165\u53e3","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"1\u3001\u7528\u4f8b\u7ec4\u7ec7","text":"\u5728 setting/config/server.ini \u6587\u4ef6\u4e2d APP_NAME= \u5b57\u6bb5\u4e3a\u7528\u4f8b\u7684\u6267\u884c\u7684\u76ee\u5f55\uff0c\u9ed8\u8ba4\u4e3a apps \u76ee\u5f55\u4e0b\u6240\u6709\u7528\u4f8b\u3002\u5982\u679c\u4f60\u60f3\u6307\u5b9a\u6267\u884c\u67d0\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4f60\u53ef\u4ee5\u5c06\u8be5\u914d\u7f6e\u9879\u6307\u5b9a\u5230\u5e94\u7528\u7684\u7528\u4f8b\u76ee\u5f55\uff0c\u6bd4\u5982\uff1aAPP_NAME=deepin_album\uff0c \u8868\u793a\u6267\u884c\u76f8\u518c\u76ee\u5f55\u4e0b\u7684\u7528\u4f8b\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a python3 manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music\n -k KEYWORDS, --keywords KEYWORDS\n \u7528\u4f8b\u7684\u5173\u952e\u8bcd\n -t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e\n --log_level LOG_LEVEL \u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n --env {host,docker} \u5728\u5bbf\u4e3b\u673a\u6216\u5bb9\u5668\u73af\u5883\u6267\u884c\n --client_alias \u9009\u62e9\u6d4b\u8bd5\u673a\u522b\u540d, \u53ef\u9009\u9879\u4e3aclient.ini\u4e2d\u5df2\u914d\u7f6e, \u9ed8\u8ba4\u503c\u4e3a zx-x86.\n --count \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a python3 manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\" --env docker\n \u6ce8\uff1a\u5728\u5bb9\u5668\u4e2d\u6267\u884c\u65f6\uff0c\u82e5\u5f3a\u5236\u9000\u51fa\uff0c\u5bb9\u5668\u5e76\u4e0d\u4f1a\u505c\u6b62\u8fd0\u884c\uff01"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_9","title":"\u516b\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1json","title":"1\u3001Json \u62a5\u544a","text":"\u81ea\u7814\u89c6\u9891\u89e3\u6790\u5de5\u5177\u4f1a\u5bf9\u5355\u6761\u7528\u4f8b\u6267\u884c\u4e00\u8f6e\u751f\u6210\u4e00\u4e2a json \u6587\u4ef6\uff0c\u5b58\u653e\u4e8e report/{app_name}/{scene}/{run_num} \u76ee\u5f55\u4e0b\uff0c\u547d\u540d\u683c\u5f0f\u4e3a\uff1a report.json json \u5185\u5bb9\u4e3e\u4f8b\uff1a [\n{\n\"Stab1\": {\n\"images\": [1,2...150,151],\n\"startStub\": 0,\n\"type\": \"Stab\"\n}\n},\n{\n\"Stab2\": {\n\"images\": [152,153...169,170],\n\"startStub\": 1,\n\"type\": \"UnStab\"\n}\n},\n{\n\"Stab3\": {\n\"images\": [171,172...300,301],\n\"startStub\": 0,\n\"type\": \"UnStab\"\n}\n}\n]\n \u8bf4\u660e\uff1a Stab \uff1a\u8868\u793a\u89e3\u6790\u8fc7\u7a0b\u4e2d\u4e0d\u540c\u7684\u9636\u6bb5\u3002 images \uff1a\u8868\u793a\u6bcf\u4e00\u5e27\u7684\u56fe\u7247\u5e8f\u53f7\u3002 startStub\uff1a \u4e3a\u8bc6\u522b\u5c3e\u5e27\u7684\u9636\u6bb5\u8868\u793a\uff0c\u5982\u679c \"startStub\": 1 \uff0c\u8bf4\u660e\u5c3e\u5e27\u51fa\u73b0\u5728\u8be5\u9636\u6bb5\u3002 type\uff1a \u4e3a Stab \u6216 UnStab \uff0c\u8868\u793a\u7a33\u5b9a\u9636\u6bb5\u6216\u4e0d\u7a33\u5b9a\u9636\u6bb5\u3002 \u5404\u9636\u6bb5\u6709\u5e27\u6570\u8865\u507f\uff0c\u9ed8\u8ba4\u8865\u507f\u7684\u5e27\u6570\u4e3a 3 \u5e27\uff08\u53ef\u4ee5\u901a\u8fc7 server.ini \u91cc\u9762 un_stab_start=3 \u8fdb\u884c\u914d\u7f6e\uff09\uff0c\u8868\u793a\u5c0f\u4e8e\u7b49\u4e8e 3 \u5e27\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u524d\u540e\u5747\u9700\u8981\u51cf\u6389\u3002 \u5e94\u7528\u542f\u52a8\u9636\u6bb5\u5c31\u662f\u5728 Stab2 \u9636\u6bb5\uff0c\u542f\u52a8\u65f6\u95f4\u4e3a\uff1a171 \u51cf 151 \u518d\u51cf\u6389\u524d\u540e\u8865\u507f\u5e27\u6570 6 \u5e27\uff0c\u5373 14 \u5e27\uff0c\u89c6\u9891\u5e27\u7387 30 \u5e27/\u79d2\uff0c\u56e0\u6b64\u542f\u52a8\u8017\u65f6\u4e3a\uff1a14 * 33 = 462 ms"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2excel","title":"2\u3001Excel \u62a5\u544a","text":"\u6240\u6709\u7528\u4f8b\u6267\u884c\u5e76\u89e3\u6790\u5b8c\u4e4b\u540e\u4f1a report \u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a\u6c47\u603b\u6570\u636e\u7684 Excel \u6587\u4ef6\uff0c\u6587\u4ef6\u540d\u4e3a\uff1a{time}_perf_time.xlsx\u3002 \u6ce8\u610f\uff0creport \u76ee\u5f55\u4e3a\u53ef\u914d\u7f6e\u9879\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u4f1a\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u751f\u6210\uff0c\u5982\u679c\u4f60\u5c06 report\uff0c\u6307\u5b9a\u5230\u9879\u76ee\u4e0b\u5176\u4ed6\u8def\u5f84\uff0c\u5219\u4f1a\u5728\u5bf9\u5e94\u7684\u8def\u5f84\u4e0b\u751f\u6210 json \u548c Excel \u6587\u4ef6\u3002 \u4f60\u4e5f\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8bfb\u53d6\u6240\u6709 json / excel \u62a5\u544a\u7684\u6570\u636e\uff0c\u751f\u6210\u4f60\u81ea\u5df1\u60f3\u8981\u7684\u4e00\u4e9b\u6d4b\u8bd5\u62a5\u544a\u5f62\u5f0f\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#usb","title":"\u4e5d\u3001USB \u4e32\u53e3\u9a71\u52a8\u952e\u9f20\u65b9\u6cd5","text":"\u4f4d\u4e8e src/utils/control/serial_communication \u76ee\u5f55\u4e0b\u7684 usb_mk.py \u6587\u4ef6 usb_mk = UsbMk()\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up()\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u652f\u6301\u4f20\u5165\u6c49\u5b57\uff0c\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click()\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() \n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() \n \uff084\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() \n \uff085\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() \n \uff086\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() \n \uff087\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff088\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff0810\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_10","title":"\u5341\u3001\u7ee7\u7535\u5668\u63a7\u5236\u4e3b\u673a\u5f00\u673a/\u91cd\u542f","text":"\uff08\u82e5\u4e0d\u4f7f\u7528\u7ee7\u7535\u5668\uff0c\u53ef\u5ffd\u7565\u8be5\u6b65\u9aa4\uff0c\u6267\u884c\u65f6\u4f1a\u901a\u8fc7\u547d\u4ee4 reboot\uff09"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u7ee7\u7535\u5668\u8bbe\u5907","text":"LCUS-2 \u578b \u53cc\u8def USB \u667a\u80fd\u4e32\u53e3\u63a7\u5236\u7ee7\u7535\u5668\u3002 https://item.taobao.com/item.htm?spm=a1z09.2.0.0.41d72e8dUYx2pi&id=582653718178&_u=i25r20ia6a2e "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2usb","title":"2\u3001USB \u5ef6\u957f\u7ebf","text":"\u666e\u901a\u7684 USB \u7ebf\u5373\u53ef\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_3","title":"3\u3001\u675c\u90a6\u7ebf","text":"3.1\u300140P \u6bcd\u5bf9\u516c\u675c\u90a6\u7ebf\u3002 3.2\u3001\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"4\u3001\u5b89\u88c5\u56fe\u6587\u6559\u7a0b","text":"4.1\u3001\u4f7f\u7528 USB \u5ef6\u957f\u7ebf\u8fde\u63a5\u63a7\u5236\u7aef\u548c\u7ee7\u7535\u5668\u3002 4.2\u3001\u5728\u7ee7\u7535\u5668\u5e38\u7aef\u548c\u516c\u5171\u7aef\u5747\u8fde\u63a5\u4e00\u6839\u675c\u90a6\u7ebf\u3002 4.3\u3001\u5728\u4e3b\u677f\u4e0a\u5f00\u673a\u9488\u548c\u91cd\u542f\u9488\u4e0a\u63d2\u4e0a\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 4.4\u3001\u5c06\u5f00\u673a\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76841\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1\u5de6\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 4.5\u3001\u5c06\u91cd\u542f\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76842\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1 \u53f3\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 \u82e5\u60f3\u4fdd\u7559\u539f\u7535\u6e90\u5f00\u5173\u7684\u7535\u6e90\u706f\uff0c\u53ef\u6839\u636e\u5982\u4e0a\u56fe\u6240\u793a\uff0c\u4f7f\u7528\u675c\u90a6\u7ebf\u8fde\u63a5\u4e3b\u677f\u4e0a\u7684\u7535\u6e90\u706f\u548c\u539f\u7535\u6e90\u5f00\u5173"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_11","title":"\u5341\u4e00\u3001\u5e38\u89c1\u95ee\u9898\u8bf4\u660e","text":"1\u3001ERROR: for uos Cannot restart container 2301b1a1395d7959ee6523d61b61c87084649af530786cdb8fb5b3ecbcbd1068: linux runtime spec devices: error gathering device information while adding custom device \"/dev/ttyACM0\": no such file or directory \u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u8fde\u63a5\u72b6\u6001\uff0c\u67e5\u770b /dev/ttyACM0 \u662f\u5426\u5b58\u5728\uff0c\u82e5\u5b58\u5728 /dev/ttyACMn\uff08n\u4e3a\u4efb\u610f\u6570\u5b57\uff09\uff0c\u91cd\u542f\u7535\u8111\u89e3\u51b3\u3002 2\u3001Error response from daemon: Container 5e700fdc769e8c74666d68a7f2bc3de58268b4594cf88706609d59f8dbc7362d is not running \u5bb9\u5668\u542f\u52a8\u5931\u8d25 1\uff09\u68c0\u67e5\u54ea\u4e00\u4e2a\u5bb9\u5668\u672a\u542f\u52a8 sudo docker container ls # \u5217\u51fa\u8fd0\u884c\u4e2d\u7684 Docker \u5bb9\u5668\n 2\uff09\u7f3a\u5c11 uos \u5bb9\u5668\uff0c\u68c0\u67e5 USB \u4e32\u53e3\u8fde\u63a5\u7ebf\u548c\u91c7\u96c6\u76d2\u8fde\u63a5\u7ebf\u662f\u5426\u6b63\u5e38\uff0c\u91cd\u542f\u540e\u6267\u884c bash install/setup.up # \u91cd\u65b0\u5b8c\u6574\u90e8\u7f72\u73af\u5883\n \u6216\u6267\u884c sudo docker-compose up -d --build # \u4ec5\u91cd\u65b0\u6784\u5efa Docker \u955c\u50cf\n 3\u3001\u82e5\u90e8\u7f72\u65f6\u63d0\u793a\u6302\u8f7d ttyACM0\u3001video0 \u5931\u8d25\uff0c\u8bf7\u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u53ca\u91c7\u96c6\u76d2\u662f\u5426\u63a5\u89e6\u826f\u597d\uff0c\u82e5\u63a5\u89e6\u826f\u597d\uff0c\u91cd\u542f\u5373\u53ef\u89e3\u51b3\u3002 4\u3001\u82e5\u51fa\u73b0\u56fe\u7247\u80fd\u8bc6\u522b\uff0c\u4f46\u662f\u9f20\u6807\u672a\u79fb\u52a8\u64cd\u4f5c\u65f6\uff0c\u5b89\u88c5\u7edd\u5bf9\u9f20\u6807\u64cd\u4f5c\u7684\u4f9d\u8d56\u5305\uff0c\u89c1\u7b2c\u4e09\u8282\u7b2c\u4e8c\u5c0f\u8282\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u6d4b\u8bd5\u673a\u3002 5\u3001\u7531\u4e8e\u901a\u8fc7\u91c7\u96c6\u5361\u83b7\u53d6\u7684\u6d4b\u8bd5\u673a\u5b9e\u65f6\u753b\u9762\uff0c\u5305\u542b\u4e86\u9f20\u6807\u7684\u6837\u5f0f\uff0c\u6240\u4ee5\u5bf9\u56fe\u7247\u8bc6\u522b\u65f6\uff0c\u9f20\u6807\u82e5\u505c\u7559\u5728\u56fe\u6807\u4e0a\u5c42\uff0c\u5219\u4f1a\u5bf9\u8bc6\u522b\u7ed3\u679c\u9020\u6210\u5f71\u54cd\uff0c\u9700\u8981\u5c06\u9f20\u6807\u79fb\u52a8\u81f3\u5176\u4ed6\u4f4d\u7f6e\uff0c\u6216\u8005\u9690\u85cf\u9f20\u6807\u89e3\u51b3\u3002 6\u3001Excel \u62a5\u544a\u4e2d\uff0c\u6d4b\u8bd5\u573a\u666f\u5217\u4e0e\u7528\u4f8b\u4e2d\u7684\u4e0d\u4e00\u81f4\uff0c\u5173\u952e\u5b57scene\u3001app_name\u3001\u67b6\u6784\u522b\u540d\uff0c\u4e0d\u80fd\u5305\u542b\u4e0b\u5212\u7ebf\u548c\u82f1\u6587\u7b26\u53f7\u7684\u5706\u62ec\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/","title":"\u6846\u67b6\u529f\u80fd\u4ecb\u7ecd","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2023/1/12\n# Author : Mikigo\n# =============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_2","title":"\u4e00\u3001\u4e00\u53e5\u8bdd\u7b80\u4ecb","text":"\u6b64\u6587\u6863\u4e3b\u8981\u60f3\u5bf9 YouQu \u6846\u67b6\u4e00\u4e9b\u91cd\u70b9\u7684\u529f\u80fd\u505a\u8be6\u7ec6\u7684\u4ecb\u7ecd\uff0c\u5305\u62ec\u5bf9\u4e00\u4e9b\u529f\u80fd\u5f00\u53d1\u7684\u80cc\u666f\u3001\u8981\u89e3\u51b3\u7684\u95ee\u9898\u3001\u5b9e\u73b0\u903b\u8f91\u3001\u4ee3\u7801\u7b49\u65b9\u9762\u7684\u4ecb\u7ecd\uff0c\u4ee5\u6b64\u8ba9\u5927\u5bb6\u80fd\u66f4\u52a0\u6e05\u6670\u7684\u7406\u89e3\u5404\u9879\u529f\u80fd\uff0c\u4ece\u800c\u5728\u4f7f\u7528\u7684\u65f6\u5019\u80fd\u66f4\u52a0\u7684\u5f97\u5fc3\u5e94\u624b\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_3","title":"\u4e8c\u3001\u56fe\u50cf\u8bc6\u522b","text":"\u56fe\u50cf\u8bc6\u522b\u5728 UI \u81ea\u52a8\u5316\u4e2d\u662f\u4e0d\u53ef\u7f3a\u5c11\u7684\uff0c\u5e02\u9762\u4e0a\u751a\u81f3\u6709\u5b8c\u5168\u57fa\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\uff0c\u6bd4\u5982 Airtest\u3001Sikuli \u7b49\uff0c\u5728\u6e38\u620f\u7b49\u7279\u5b9a\u9886\u57df\u4e5f\u6709\u4e0d\u9519\u7684\u6548\u679c\uff0c\u8fd9\u4e9b\u5de5\u5177\u5b9e\u9645\u4e0a\u4e5f\u662f\u7528\u7684 OpenCV \u8fdb\u884c\u4e86\u5c01\u88c5\uff0cYouQu \u6846\u67b6\u57fa\u4e8e OpenCV \u5f00\u53d1\u4e86\u81ea\u5df1\u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\uff0c\u5b83\u53ef\u4ee5\u65b9\u4fbf\u7684\u7528\u4e8e\u754c\u9762\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u65ad\u8a00\uff1b YouQu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u51e0\u4e4e\u6ee1\u8db3\u4e86\u4f60\u7684\u6240\u6709\u8981\u6c42\uff0c\u6211\u4eec\u5728\u957f\u65f6\u95f4\u7684\u601d\u8003\u548c\u6478\u7d22\u4e2d\uff0c\u9488\u5bf9\u5e38\u89c4\u573a\u666f\u53ca\u4e00\u4e9b\u7279\u6b8a\u573a\u666f\u63a2\u7d22\u9664\u4e86\u4e00\u4e9b\u5b9e\u7528\u4e14\u6709\u6548\u7684\u65b9\u6848\uff0c\u4e14\u542c\u6211\u6162\u6162\u9053\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1","title":"1\u3001\u5e38\u89c4\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5e38\u89c4\u8bc6\u522b\u5f88\u597d\u7406\u89e3\uff0c\u4e00\u53e5\u8bdd\u8bb2\u5c31\u662f\uff0c\u8981\u83b7\u53d6\u5230\u76ee\u6807\u5143\u7d20\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u3002 \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u5728\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u9700\u8981\u83b7\u53d6\u7684\u5750\u6807\u662f\u76f8\u5bf9\u4e8e\u6574\u4e2a\u5c4f\u5e55\u7684\u5750\u6807\uff0c\u6211\u4eec\u53ef\u4ee5\u622a\u53d6\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u56fe\u7247\uff08screen\uff09\uff1b \u5728\u5143\u7d20\u8bc6\u522b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u622a\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5c0f\u56fe\u8fdb\u884c\u8bc6\u522b\uff0c\u6bd4\u5982\u622a\u53d6\u64ad\u653e\u6309\u94ae\uff1a \u90a3\u4e48\u5b9e\u9645\u4e0a\uff0c\u5143\u7d20\u5b9a\u4f4d\u7684\u95ee\u9898\u5c31\u8f6c\u6362\u4e3a\uff0c\u5c06\u622a\u56fe\u7684\u5c0f\u56fe\uff08play_btn\uff09\u62ff\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u5927\u56fe\uff08screen\uff09\u4e2d\u53bb\u505a\u5339\u914d\uff0c\u5982\u679c\u5339\u914d\u6210\u529f\uff0c\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff08 x, y \uff09\u5373\u53ef\u3002 \u4e3a\u4e86\u65b9\u4fbf\u63cf\u8ff0\uff0c\u4ee5\u4e0b\u6211\u5c06\u6574\u4e2a\u5c4f\u5e55\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5927\u56fe\uff0c\u67d0\u4e2a\u5143\u7d20\u56fe\u7247\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5c0f\u56fe\u3002 \u57fa\u4e8e OpenCV \u7684\u6a21\u677f\u5339\u914d cv.matchTemplate() \u529f\u80fd\uff0c\u6211\u4eec\u5b9e\u73b0\u4e86\u56fe\u50cf\u5b9a\u4f4d\u7684\u529f\u80fd\uff0c\u6846\u67b6\u63d0\u4f9b\u4e86\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u5e95\u5c42\u63a5\u53e3\uff08\u4e00\u822c\u4e0d\u5bf9\u4e0a\u5c42\u63d0\u4f9b\u8c03\u7528\uff09\uff1a def _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\n# \u8be6\u7ec6\u4ee3\u7801\u592a\u957f\u4e0d\u8d34\u4e86\uff0c\u611f\u5174\u8da3\u8bf7\u67e5\u770b\u6e90\u7801\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001image_path image_path \u662f\u5c0f\u56fe\u7684\u7edd\u5bf9\u8def\u5f84; \u901a\u5e38\u5728 AT \u5de5\u7a0b\u91cc\u9762\uff0c\u6211\u4eec\u7ea6\u5b9a\u5c06\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u5b9e\u9645\u7684\u5143\u7d20\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1aplay_btn.png \uff1b \u7528\u4e8e\u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 case/assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1amusic_001.png \uff1b \u8fd9\u6837\u662f\u4e3a\u4e86\u65b9\u4fbf\u7ba1\u7406\u548c\u7ef4\u62a4\u3002 2\u3001rate \u56fe\u50cf\u8bc6\u522b\u7684\u7684\u5339\u914d\u5ea6\u6216\u8005\u8bf4\u76f8\u4f3c\u5ea6\uff0c\u6846\u67b6\u9ed8\u8ba4\u7684\u914d\u7f6e\u4e3a 0.9\uff0c\u4e5f\u5c31\u662f\u8bf4\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u5b58\u5728\u4e00\u4e2a\u76f8\u4f3c\u5ea6 90% \u7684\u56fe\u6807\u5373\u8fd4\u56de\u5176\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff1b \u5982\u679c\u4f60\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u8c03\u6574\u8bc6\u522b\u5ea6\uff0c\u4f60\u53ef\u4ee5\u5728\u8c03\u7528\u51fd\u6570\u7684\u65f6\u5019\uff0c\u4f20\u5165\u4e0d\u540c\u7684\u8bc6\u522b\u5ea6\u7684\u503c\u3002 3\u3001multiple \u9ed8\u8ba4\u60c5\u51b5\u4e0b multiple=False\uff0c\u8868\u793a\u53ea\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u7b2c\u4e00\u4e2a\uff0c\u5982\u679c multiple=True \u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\uff0c\u56e0\u4e3a\u5927\u56fe\u4e2d\u53ef\u80fd\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u5c0f\u56fe\uff0c\u5728\u67d0\u4e9b\u573a\u666f\u4e0b\u4f60\u53ef\u80fd\u9700\u8981\u5168\u90e8\u83b7\u53d6\u5230\u6240\u6709\u5339\u914d\u5230\u7684\u5750\u6807\u3002 4\u3001picture_abspath \u9ed8\u8ba4\u60c5\u51b5\u4e0b picture_abspath=None \u8868\u793a\u5927\u56fe\u4e3a\u622a\u53d6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u5982\u679c\u4f60\u4e0d\u5e0c\u671b\u5927\u56fe\u662f\u5c4f\u5e55\u7684\u622a\u56fe\uff0c\u800c\u662f\u4f60\u81ea\u5b9a\u4e49\u4f20\u5165\u7684\u67d0\u4e2a\u56fe\u7247\uff0c\u4f60\u53ea\u9700\u8981\u5c06\u4f60\u7684\u56fe\u7247\u8def\u5f84\u4f20\u9012\u7ed9\u8fd9\u4e2a\u53c2\u6570\u5c31\u884c\uff0c\u6bd4\u5982\uff1a picture_abspath=\"~/Desktop/big.png\" \uff1b 5\u3001screen_bbox \u5927\u56fe\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u622a\u53d6\u6574\u4e2a\u5c4f\u5e55\uff0cscreen_bbox = [x, y, w, h] \u53ef\u4ee5\u6307\u5b9a\u622a\u53d6\u5c4f\u5e55\u4e2d\u7684\u56fa\u5b9a\u533a\u57df\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\uff0c\u53ef\u4ee5\u6392\u9664\u90e8\u5206\u533a\u57df\u5bf9\u8bc6\u522b\u7ed3\u679c\u7684\u5f71\u54cd\u3002 \u3010\u9690\u5f0f\u7b49\u5f85\u3011 \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\uff0c\u6709\u65f6\u5019\u9875\u9762\u8df3\u8f6c\u6709\u5ef6\u65f6\uff0c\u6709\u53ef\u80fd\u5b58\u5728\u8bc6\u522b\u7684\u90a3\u4e00\u523b\u9875\u9762\u4e5f\u6ca1\u6709\u8df3\u8f6c\u51fa\u6765\uff0c\u6216\u8005\u6216\u8005\u8bc6\u522b\u7684\u90a3\u4e00\u523b\uff1b \u56e0\u6b64\u6211\u4eec\u9700\u8981\u4e00\u79cd\u7b49\u5f85\u673a\u5236\uff0c\u5373\u5728\u4e00\u5b9a\u7684\u65f6\u95f4\u5185\uff0c\u5982\u679c\u8bc6\u522b\u4e0d\u5230\uff0c\u91cd\u590d\u53bb\u8bc6\u522b\uff1a def find_image(\ncls,\n*widget, rate: [float, int] = None,\nmultiple: bool = False,\nmatch_number: int = None,\npicture_abspath: str = None,\nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u5728\u5c4f\u5e55\u4e2d\u533a\u5bfb\u627e\u5c0f\u56fe\uff0c\u8fd4\u56de\u5750\u6807\uff0c\n \u5982\u679c\u627e\u4e0d\u5230\uff0c\u6839\u636e\u914d\u7f6e\u91cd\u8bd5\u6b21\u6570\uff0c\u6bcf\u6b21\u95f4\u96941\u79d2\n :param widget: \u6a21\u677f\u56fe\u7247\u8def\u5f84\n :param rate: \u76f8\u4f3c\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param match_number: \u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\n :return: \u5750\u6807\u5143\u7ec4\n \"\"\"\nif rate is None:\nrate = float(GlobalConfig.IMAGE_RATE)\ntry:\nfor element in widget:\nfor _ in range((match_number or int(GlobalConfig.IMAGE_MATCH_NUMBER)) + 1):\nlocate = cls._match_image_by_opencv(\nelement,\nrate,\nmultiple=multiple,\npicture_abspath=picture_abspath,\nscreen_bbox=screen_bbox\n)\nif not locate:\nsleep(int(GlobalConfig.IMAGE_MATCH_WAIT_TIME))\nelse:\nreturn locate\nraise TemplateElementNotFound(*widget)\nexcept Exception as e:\nraise e\n \u53c2\u6570 match_number \u7528\u4e8e\u63a7\u5236\u91cd\u590d\u8bc6\u522b\u7684\u6b21\u6570\uff0c\u9ed8\u8ba4\u4e0d\u4f20\u53c2\uff0c\u53d6\u5168\u5c40\u914d\u7f6e setting/globalconfig.ini \u91cc\u9762\u7684 IMAGE_MATCH_NUMBER \u914d\u7f6e\u9879\u7684\u503c\uff0c\u9ed8\u8ba4IMAGE_MATCH_NUMBER = 1\uff0c\u5373\u91cd\u8bd5 1 \u6b21\uff1b find_image \u662f\u6846\u67b6\u63d0\u4f9b\u7684\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u51fd\u6570\u63a5\u53e3\uff0c\u8fd9\u4e2a\u51fd\u6570\u63d0\u4f9b\u4e86\u9690\u5f0f\u7b49\u5f85\u7684\u529f\u80fd\uff0c\u4e14\u5305\u542b\u4e0a\u9762\u4ecb\u7ecd\u7684 _match_image_by_opencv \u51fd\u6570\u7684\u6240\u6709\u529f\u80fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2","title":"2\u3001\u6c14\u6ce1\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u6c14\u6ce1\u8bc6\u522b\u6307\u7684\u662f\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\u8981\u5b9a\u4f4d\u7684\u5143\u7d20\u662f\u4e00\u4e9b\u4f1a\u6d88\u5931\u7684\u5c0f\u5f39\u7a97\uff0c\u8fd9\u7c7b\u573a\u666f\u5728\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\u5c31\u53ef\u80fd\u5b58\u5728\u4e0d\u7a33\u5b9a\u6027\uff0c\u6709\u53ef\u80fd\u56fe\u50cf\u8bc6\u522b\u7684\u65f6\u5019\u6c14\u6ce1\u5df2\u7ecf\u6d88\u5931\u4e86\uff0c\u4e5f\u6709\u53ef\u80fd\u6c14\u6ce1\u51fa\u73b0\u7684\u65f6\u95f4\u592a\u77ed\u4e86\uff0c\u4e0d\u5bb9\u6613\u6355\u6349\u5230\uff0c\u5c31\u50cf\u6c14\u6ce1\u4e00\u6837\uff0c\u51fa\u73b0\u4e00\u4e0b\u5c31\u6d88\u5931\uff0c\u56e0\u6b64\u6211\u4eec\u5f62\u8c61\u7684\u79f0\u4e4b\u4e3a \u201c\u6c14\u6ce1\u8bc6\u522b\u201d\uff1b \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u4e3a\u4e86\u80fd\u7a33\u5b9a\u7684\u8bc6\u522b\u6c14\u6ce1\u7c7b\u573a\u666f\uff0c\u6211\u4eec\u91c7\u7528\u7684\u65b9\u6848\u662f\uff1a \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\uff08\u5305\u542b\u6c14\u6ce1\u4ece\u51fa\u73b0\u5230\u6d88\u5931\uff09\uff0c\u4e0d\u505c\u7684\u622a\u53d6\u8fd9\u6bb5\u65f6\u95f4\u5185\u7684\u5927\u56fe\uff0c\u4ee5\u6b64\u786e\u4fdd\u5728\u622a\u53d6\u7684\u4e00\u5806\u56fe\u7247\u4e2d\uff0c\u80af\u5b9a\u6709\u81f3\u5c11\u4e00\u5f20\u56fe\u7247\u80fd\u6355\u6349\u5230\u6c14\u6ce1\uff0c\u6700\u540e\u518d\u5bf9\u8fd9\u4e00\u5806\u56fe\u7247\u9010\u4e2a\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def get_during(\ncls,\nimage_path: str,\nscreen_time: [float, int],\nrate: float = None,\npause: [int, float] = None,\nmax_range: int = 10000\n):\n\"\"\"\n \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u622a\u56fe\u591a\u5f20\u56fe\u7247\u8fdb\u884c\u8bc6\u522b\uff0c\u5176\u4e2d\u6709\u4e00\u5f20\u56fe\u7247\u8bc6\u522b\u6210\u529f\u5373\u8fd4\u56de\u7ed3\u679c;\n \u9002\u7528\u4e8e\u6c14\u6ce1\u7c7b\u7684\u65ad\u8a00\uff0c\u6bd4\u5982\u6c14\u6ce1\u57281\u79d2\u5185\u6d88\u5931\uff0c\u5982\u679c\u7528\u5e38\u89c4\u7684\u56fe\u50cf\u8bc6\u522b\u5219\u6709\u53ef\u80fd\u65e0\u6cd5\u8bc6\u522b\u5230\uff1b\n :param image_path: \u8981\u8bc6\u522b\u7684\u6a21\u677f\u56fe\u7247\uff1b\n :param screen_time: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff1b\n :param rate: \u8bc6\u522b\u7387\uff1b\n :param pause: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u4e0d\u95f4\u9694\uff1b\n :param max_range: \u622a\u56fe\u7684\u6700\u5927\u6b21\u6570\uff0c\u8fd9\u662f\u4e00\u4e2a\u9884\u8bbe\u503c\uff0c\u4e00\u822c\u60c5\u51b5\u4e0b\u4e0d\u6d89\u53ca\u4fee\u6539\uff1b\n \"\"\"\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001screen_time \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5728\u6b64\u65f6\u95f4\u5185\u4f1a\u4e0d\u65ad\u7684\u8fdb\u884c\u622a\u56fe\u64cd\u4f5c\uff0c\u5c31\u50cf\u5f55\u5236\u89c6\u9891\u4e00\u6837\uff1b 2\u3001pause \u6bcf\u6b21\u622a\u53d6\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u4e00\u523b\u4e0d\u505c\u7684\u622a\u56fe\uff0c\u5982\u679c\u4f60\u60f3\u6bcf\u6b21\u622a\u56fe\u5b58\u5728\u4e00\u4e9b\u95f4\u9694\u65f6\u95f4\u4f20\u5165\u5bf9\u5e94\u7684\u65f6\u95f4\u95f4\u9694\u5373\u53ef\uff0c\u5355\u4f4d\u662f\u79d2\uff0c\u6bd4\u5982\uff1apause = 0.03\uff0c\u8868\u793a 30 ms\uff0c\u76f8\u5f53\u4e8e\u5e27\u7387\u4e3a 30 \u5e27\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-opencv","title":"3\u3001\u4e0d\u4f9d\u8d56 OpenCV \u7684\u56fe\u50cf\u8bc6\u522b\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31","title":"3.1\u3001\u81ea\u7814\u56fe\u50cf\u8bc6\u522b\u6280\u672f","text":"\u3010\u539f\u7406\u3011 \u4e3a\u4e86\u5b9e\u73b0\u8bc6\u522b\u56fe\u50cf\u7684\u76ee\u7684\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u5c06\u56fe\u7247\u7684\u6bcf\u4e2a\u50cf\u7d20\u7684RGB\u503c\uff0c\u4e0e\u6574\u4e2a\u5c4f\u5e55\u4e2d\u7684RGB\u8fdb\u884c\u5bf9\u6bd4\uff0c\u5982\u679c\u5c0f\u56fe\u4e0a\u7684RGB\u503c\u4e0e\u5bf9\u5e94\u5927\u56fe\u4f4d\u7f6e\u7684RGB\u90fd\u76f8\u7b49\uff0c\u5219\u5339\u914d\u6210\u529f\uff0c\u5373\u53ef\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u70b9\u3002 1\u3001\u8bfb\u53d6\u5c0f\u56fe\u548c\u5927\u56fe\u7684RGB\u503c \uff081\uff09\u5c0f\u56fe\u7684RGB\u503c small_data = small_pic.load() # load()\u4f1a\u5c06\u56fe\u7247\u7684RGB\u503c\u83b7\u53d6\u5230\uff0c\u6570\u636e\u683c\u5f0f\u4e3a\u4e00\u4e2a\u4e8c\u7ef4\u5217\u8868\uff0c\u8d4b\u503c\u7ed9\u4e00\u4e2a\u53d8\u91cfsmall_data\u3002\n \uff082\uff09\u5927\u56fe\u7684RGB\u503c big_data = big_pic.load()\n 2\u3001\u5c06\u5c0f\u56fe\u4e0e\u5927\u56fe\u7684RGB\u503c\u8fdb\u884c\u5339\u914d \uff081\uff09\u5339\u914d\u4ece\u5927\u56fe\u7684\u5750\u6807\uff080\uff0c0\uff09\u5f00\u59cb\u5339\u914d\uff0c\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff082\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\uff080\uff0c0\uff09\u5bf9\u5e94\u7684\u6240\u6709\u5c0f\u56fe\u7684RGB\u503c\u4e0d\u76f8\u7b49\uff0c\u5219\u79fb\u52a8\u5230\u4e0b\u4e00\u4e2a\u5750\u6807\u70b9\uff081\uff0c0\uff09\uff0c\u540c\u6837\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff083\uff09\u6309\u7167\u8fd9\u6837\u7684\u89c4\u5f8b\u5c06\u8fd9\u4e00\u884c\u6bcf\u79fb\u52a8\u4e00\u4e2a\u5750\u6807\u70b9\uff0c\u90fd\u5c06\u5c0f\u56fe\u6240\u6709\u7684RGB\u4e0e\u5bf9\u5e94\u5927\u56fe\u7684\u503c\u8fdb\u884c\u5339\u914d\uff1b \uff084\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\u5176\u4e2d\u4e00\u4e2a\u5750\u6807\u70b9\u4e0a\u5339\u914d\u5230\u4e86\u5c0f\u56fe\u7684\u6240\u6709RGB\u503c\uff0c\u5219\u6b64\u65f6\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\u70b9\uff1b \uff085\uff09\u5982\u679c\u5339\u914d\u4e86\u5927\u56fe\u6240\u6709\u7684\u5750\u6807\u70b9\uff0c\u90fd\u6ca1\u6709\u5339\u914d\u5230\uff0c\u5219\u8bf4\u660e\u5927\u56fe\u4e2d\u4e0d\u5b58\u5728\u5c0f\u56fe\uff0c\u5339\u914d\u5931\u8d25\uff1b \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 class ImageRgb:\n@staticmethod\ndef _check_match(_x, _y, small, bdata, sdata, rate):\n\"\"\"\n Matching degree of small graph and large graph matching\n \"\"\"\n@staticmethod\ndef _pre_random_point(small):\n\"\"\"\n Pre matching, take 10-20 points at random each time,\n and take coordinates randomly in the small graph\n \"\"\"\n@staticmethod\ndef _pre_random_match(_x, _y, point_list, bdata, sdata, rate):\n\"\"\"\n In the small graph, several points are randomly\n selected for matching, and the matching degree is\n also set for the random points\n \"\"\"\n@classmethod\ndef match_image_by_rgb(cls, image_name=None, image_path=None, rate=0.9):\n\"\"\"\n By comparing the RGB values of the small image with the large\n image on the screen, the coordinates of the small image on\n the screen are returned.\n \"\"\"\n \u901a\u8fc7 match_image_by_rgb() \u8fd9\u4e2a\u51fd\u6570\uff0c\u4f20\u5165\u76ee\u6807\u5c0f\u56fe\u7684\u6587\u4ef6\u540d\u79f0\uff0c\u5373\u53ef\u8fd4\u56de\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u3002 \u6709\u540c\u5b66\u8981\u95ee\u4e86\uff0c\u6709 OpenCV \u5e72\u561b\u4e0d\u7528\uff0c\u6709\u5fc5\u8981\u81ea\u5df1\u5b9e\u73b0\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u529f\u80fd\u5417\uff0c\u4f60\u4eec\u662f\u4e0d\u662f\u95f2\u7684\u554a\uff1f \u8fd9\u4e48\u95ee\u7684\u8bdd\uff0c\u5c0f\u4e86\uff0c\u683c\u5c40\u5c0f\u4e86\uff1b\u6211\u4eec\u81ea\u5df1\u5b9e\u73b0\u4e3b\u8981\u6709\u51e0\u65b9\u9762\u539f\u56e0\uff1a \u51cf\u5c11\u73af\u5883\u4f9d\u8d56\uff0c\u5373\u4e0d\u7528\u5b89\u88c5 OpenCV\uff0c\u6211\u4eec\u4e5f\u80fd\u5b9e\u73b0\u5176\u529f\u80fd\uff0c\u73af\u5883\u4f9d\u8d56\u8fd9\u5757\u540e\u9762\u4f1a\u5355\u72ec\u8be6\u7ec6\u8bb2\uff0c\u51cf\u5c11\u73af\u5883\u4f9d\u8d56\u5bf9\u4e8e\u4efb\u4f55\u8f6f\u4ef6\u5de5\u7a0b\u90fd\u975e\u5e38\u91cd\u8981\uff1b OpenCV \u5728\u5176\u4ed6\u56fd\u4ea7 CPU \u67b6\u6784\u4e0a\u5b89\u88c5\u5e76\u4e0d\u80fd\u4fdd\u8bc1100%\u6210\u529f\uff0c\u751a\u81f3\u6709\u6ca1\u6709\u53ef\u80fd\u5728\u4e00\u4e9b\u67b6\u6784\u4e0a\u538b\u6839\u513f\u5c31\u4e0d\u80fd\u5b89\u88c5\u4f7f\u7528 OpenCV \uff1f \u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 OpenCV \uff1f\u5c31\u50cf\u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 Windows \u5462\uff1f\u8fd9\u4e9b\u95ee\u9898\u503c\u5f97\u601d\u8003\u3002 \u5f53\u7136\uff0c\u6211\u4eec\u627f\u8ba4\u8fd9\u5957\u65b9\u6848\uff0c\u867d\u7136\u8bc6\u522b\u51c6\u786e\u7387\u6ca1\u95ee\u9898\uff0c\u4f46\u5728\u8bc6\u522b\u6548\u7387\u4e0a\u8fd8\u6ca1\u6709\u8fbe\u5230 OpenCV \u6a21\u677f\u5339\u914d\u7684\u6548\u679c\uff0c\u6211\u4eec\u7684\u65b9\u6848\u6bcf\u6b21\u8bc6\u522b\u5728 1.5s \u5de6\u53f3\uff0c\u800c OpenCV \u5728 1s \u5de6\u53f3\uff1b \u6574\u4f53\u8bc6\u522b\u6548\u679c\u6765\u8bb2\uff0c\u6211\u8ba4\u4e3a\u8fd8\u662f\u53ef\u4ee5\u63a5\u53d7\u7684\uff0c\u4e5f\u5e0c\u671b\u6709\u5fd7\u4e4b\u58eb\u80fd\u4e00\u8d77\u4f18\u5316\u6b64\u65b9\u6848\uff0c\u4e00\u8d77\u6280\u672f\u62a5\u56fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32-rpc","title":"3.2\u3001\u57fa\u4e8e RPC \u670d\u52a1\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b","text":"\u5728\u8fdc\u7a0b\u670d\u52a1\u5668\u4e0a\u90e8\u7f72 OpenCV \u7684\u73af\u5883\uff0c\u5e76\u5c06\u5176\u90e8\u7f72\u4e3a RPC \u670d\u52a1\uff0c\u6d4b\u8bd5\u673a\u4e0a\u4e0d\u7528\u5b89\u88c5 OpenCV \u4f9d\u8d56\uff0c\u800c\u662f\u901a\u8fc7\u8bf7\u6c42 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u3010\u539f\u7406\u3011 \u6d4b\u8bd5\u673a\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u56fe\u7247\u4ee5\u53ca\u6a21\u677f\u56fe\u7247\uff0c\u53d1\u9001\u7ed9 RPC \u670d\u52a1\u7aef\uff0c\u670d\u52a1\u7aef\u62ff\u5230\u4e24\u5f20\u56fe\u7247\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u6700\u540e\u5c06\u8bc6\u522b\u7ed3\u679c\u8fd4\u56de\u7ed9\u6d4b\u8bd5\u673a\uff1b \u8981\u7279\u6b8a\u8bf4\u660e\u7684\u662f\uff1a RPC \u662f\u4e00\u79cd\u534f\u8bae\uff0c\u8bb8\u591a\u8bed\u8a00\u90fd\u662f\u652f\u6301\u7684\uff0c\u6bd4\u5982\u8bf4\u670d\u52a1\u7aef\u4e5f\u53ef\u4ee5\u7528 C++ \u6765\u5b9e\u73b0\uff0c\u5ba2\u6237\u7aef\u4f7f\u7528 Python \u4e5f\u662f\u53ef\u4ee5\u8c03\u7528\u7684\u3002 \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 \u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nimport cv2 as cv\nimport numpy as np\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\nif __name__ == \"__main__\":\nserver = ThreadXMLRPCServer((\"x.x.x.x\", 8889), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(match_image_by_opencv, \"match_image_by_opencv\")\nserver.serve_forever()\n \u8fd9\u6837\uff0c\u6211\u4eec\u57fa\u4e8e Python \u6807\u51c6\u5e93 xmlrpc \u642d\u5efa\u4e86\u4e00\u4e2a RPC \u670d\u52a1\u5668\uff0c\u6ce8\u518c\u4e86 image_put \u548c match_image_by_opencv \u4e24\u4e2a\u529f\u80fd\u63a5\u53e3\uff0c\u5728\u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u901a\u8fc7 IP \u548c\u7aef\u53e3\u8fdb\u884c RPC \u8bf7\u6c42\uff1b \u5ba2\u6237\u7aef\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from xmlrpc.client import Binary\nfrom xmlrpc.client import ServerProxy\nserver = ServerProxy(GlobalConfig.OPENCV_SERVER_HOST, allow_none=True)\nscreen_rb = open(screen, \"rb\")\ntemplate_rb = open(template_path, \"rb\")\ntry:\nscreen_path = server.image_put(Binary(screen_rb.read()))\nscreen_rb.close()\ntpl_path = server.image_put(Binary(template_rb.read()))\ntemplate_rb.close()\nreturn server.match_image_by_opencv(\ntpl_path, screen_path, rate, multiple\n)\nexcept OSError as exc:\nraise EnvironmentError(\nf\"RPC\u670d\u52a1\u5668\u94fe\u63a5\u5931\u8d25. {GlobalConfig.OPENCV_SERVER_HOST}\"\n) from exc\n \u901a\u8fc7\u8fd4\u56de server.match_image_by_opencv \u5c31\u83b7\u53d6\u4e86\u5728\u670d\u52a1\u7aef\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4","title":"4\u3001\u53f3\u952e\u83dc\u5355\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41","title":"4.1\u3001\u53f3\u952e\u83dc\u5355\u5b9a\u4f4d\u7684\u65b9\u6848\u53ca\u95ee\u9898","text":"\u53f3\u952e\u83dc\u5355\u7684\u5143\u7d20\u5b9a\u4f4d\u662f\u4e00\u4e2a\u96be\u70b9\uff0c\u8fc7\u53bb\u6211\u4eec\u8c03\u7814\u548c\u4f7f\u7528\u8fc7\u7684\u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u65b9\u6cd5\u6709 4 \u79cd\uff1a \u7b2c\u4e00\u79cd\uff1a\u6b65\u957f\u64cd\u4f5c\u6cd5 \u5728\u53f3\u952e\u83dc\u5355\u547c\u51fa\u6765\u4e4b\u540e\uff0c\u901a\u8fc7\u952e\u76d8\u7684 up\u3001down \u6309\u952e\uff0c\u8fdb\u884c\u9009\u62e9\u83dc\u5355\u9009\u62e9\uff0c\u9009\u4e2d\u76ee\u6807\u4e4b\u540e enter \u5373\u53ef\uff1b\u6bd4\u5982\uff1a\u5728\u684c\u9762\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\uff0c\u6309 1 \u6b21 down \uff0c\u4f1a\u51fa\u73b0\u4e0b\u56fe\uff1a \u7ee7\u7eed\u518d\u6309 2 \u6b21 down\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u518d\u6309 enter\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u5982\u6b64\uff0c\u201c\u6392\u5e8f\u65b9\u5f0f\u201d\u7684\u6b65\u957f\u4e3a 3\uff1b\u901a\u8fc7\u4f7f\u7528\u952e\u76d8\u4e0a\u4e0b\u952e\uff0c\u5c31\u5b9e\u73b0\u4e86\u5bf9\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\uff1b \u4f46\u662f\uff0c\u8fd9\u79cd\u65b9\u5f0f\u6709\u4e2a\u5f88\u70e6\u4eba\u7684\u95ee\u9898\uff0c\u5c31\u662f\u53f3\u952e\u83dc\u5355\u7684\u9009\u9879\u4f4d\u7f6e\u4e0d\u53ef\u80fd\u4e00\u76f4\u4e0d\u53d8\uff0c\u5728\u9700\u6c42\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\uff0c\u83dc\u5355\u9009\u9879\u7684\u53d8\u5316\u662f\u5f88\u5927\u7684\uff0c\u751a\u81f3\u6709\u4e9b\u5e94\u7528\u652f\u6301\u81ea\u5b9a\u4e49\u83dc\u5355\uff0c\u6bd4\u5982\u6587\u7ba1\u53f3\u952e\u83dc\u5355\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff1b \u4e5f\u5c31\u662f\u8bf4\u4f60\u5f97\u7ecf\u5e38\u53bb\u7ef4\u62a4\u83dc\u5355\u9009\u9879\u7684\u6b65\u957f\uff0c\u4e00\u4e2a\u9009\u9879\u73b0\u5728\u7684\u6b65\u957f\u662f 3\uff0c\u4e0b\u4e2a\u8fed\u4ee3\u53ef\u80fd\u5c31\u662f 4 \u6216\u8005 5\u3002 \u7b2c\u4e8c\u79cd\uff1a\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u6cd5 \u628a\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5355\u72ec\u622a\u56fe\u4fdd\u5b58\uff0c\u56fe\u7247\u4e2d\u4ec5\u5305\u542b\u4e00\u4e2a\u83dc\u5355\u9009\u9879\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u8fd9\u6837\uff0c\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5c31\u53ef\u4ee5\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u65b9\u5f0f\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u8fd9\u79cd\u65b9\u5f0f\u4e0d\u7528\u62c5\u5fc3\u83dc\u5355\u9009\u9879\u7684\u987a\u5e8f\u6216\u4f4d\u7f6e\uff0c\u4f46\u662f\u9700\u8981\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff0c\u4e14\u5bb9\u6613\u53d7\u5230\u5b57\u4f53 UI \u53d8\u66f4\u7c7b\u9700\u6c42\u7684\u5f71\u54cd\uff0c\u6bd4\u5982\uff1a\u5b57\u4f53\u5927\u5c0f\u3001\u5b57\u4f53\u95f4\u8ddd\u7b49\u7b49\u9700\u6c42\u53d8\u66f4\u90fd\u4f1a\u5f71\u54cd\uff0c\u6bcf\u6b21\u53d8\u66f4\u4e4b\u540e\u5c31\u9700\u8981\u8fdb\u884c\u5927\u91cf\u56fe\u7247\u8d44\u6e90\u7684\u91cd\u65b0\u622a\u56fe\u66ff\u6362\uff0c\u662f\u4e2a\u6bd4\u8f83\u9ebb\u70e6\u7684\u4e8b\u60c5\uff1b \u7b2c\u4e09\u79cd\uff1a\u76f8\u5bf9\u4f4d\u79fb\u6cd5 \u9f20\u6807\u70b9\u51fb\u53f3\u952e\u7684\u65f6\u5019\uff0c\u9f20\u6807\u7684\u5f53\u524d\u5750\u6807\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u7684\uff0c\u83dc\u5355\u9009\u9879\u7684\u5bbd\uff08 w \uff09\u4e00\u822c\u662f\u56fa\u5b9a\u7684\uff0c\u53d8\u5316\u7684\u662f\u83dc\u5355\u7684\u957f\u5ea6\uff08 h \uff09\uff0c\u53ef\u4ee5\u901a\u8fc7\u67d0\u4e2a\u9009\u9879\u76f8\u5bf9\u4e8e\u9f20\u6807\u7684\u8ddd\u79bb\u5728\u786e\u5b9a\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u901a\u8fc7\u7ef4\u62a4\u83dc\u5355\u9009\u9879\uff08\u76f8\u5bf9\u4f4d\u7f6e\uff09\u76f8\u5bf9\u4e8e\u9f20\u6807\u4f4d\u7f6e\u7684\u8ddd\u79bb\uff0c\u5373\u53ef\u8f7b\u677e\u8ba1\u7b97\u51fa\u83dc\u5355\u9009\u9879\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\u3002 \u4ece\u7406\u8bba\u4e0a\u6b64\u65b9\u6848\u662f\u53ef\u884c\u7684\uff0c\u4f46\u662f\u8fd9\u91cc\u4ecd\u7136\u5b58\u5728\u4e24\u4e2a\u4e25\u91cd\u7684\u95ee\u9898\uff1a \u83dc\u5355\u987a\u5e8f\u6539\u53d8\uff0c\u5bfc\u81f4\u76f8\u5bf9\u8ddd\u79bb\u6539\u53d8\uff0c\u800c\u4e14\u8ddd\u79bb\u662f\u901a\u8fc7\u50cf\u7d20\uff08px\uff09\u6765\u8868\u793a\u7684\uff0c\u4e0d\u60f3\u6b65\u957f\u90a3\u4e48\u53ea\u7ba1\uff0c\u6bcf\u6b21\u9700\u8981\u53bb\u91cf\u4e00\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u70b9\u9ebb\u70e6\uff1b \u9f20\u6807\u5728\u684c\u9762\u4e0d\u540c\u4f4d\u7f6e\u70b9\u51fb\u53f3\u952e\uff0c\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u4f4d\u7f6e\u662f\u4e0d\u540c\u7684\uff0c\u4e0a\u56fe\u7684\u83dc\u5355\u662f\u5728\u9f20\u6807\u7684\u5de6\u4e0b\u65b9\uff0c\u5982\u679c\u4f60\u79fb\u52a8\u9f20\u6807\u5230\u5c4f\u5e55\u56db\u8fb9\uff0c\u4f60\u4f1a\u53d1\u73b0\uff0c\u53f3\u952e\u83dc\u5355\u53ef\u80fd\u51fa\u73b0\u5728\u9f20\u6807\u7684\u56db\u4e2a\u65b9\u5411\uff0c\u4e5f\u5c31\u662f\u8bf4\u4f60\u9700\u8981\u6839\u636e\u9f20\u6807\u7684\u4e0d\u540c\u4f4d\u7f6e\u6765\u5224\u65ad\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u65b9\u5411\uff0c\u800c\u4e0d\u540c\u7684\u65b9\u5411\u4e0a\u8ba1\u7b97\u65b9\u6cd5\u662f\u4e0d\u540c\u7684\uff0c\u6bd4\u5982\uff1a\u53f3\u952e\u83dc\u5355\u5728\u9f20\u6807\u7684\u5de6\u4e0a\uff0c\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\u8ba1\u7b97\u65b9\u6cd5\u4e3a\uff08x - w / 2\uff0c y - h\uff09\uff0c\u8fd9\u6837\u7ef4\u62a4\u8d77\u6765\u53ef\u4ee5\u8bf4\u975e\u5e38\u590d\u6742\uff1b \u57fa\u4e8e\u4ee5\u4e0a\u4e24\u4e2a\u539f\u56e0\uff0c\u6211\u4eec\u5e76\u4e0d\u63a8\u8350\u8fd9\u79cd\u64cd\u4f5c\u65b9\u6848\u3002 \u7b2c\u56db\u79cd\uff1a\u5c5e\u6027\u5b9a\u4f4d \u6709\u540c\u5b66\u8bf4\u5e72\u561b\u4e0d\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u5462\uff0c\u5176\u5b9e\uff0c\u6211\u4eec\u6700\u5f00\u59cb\u60f3\u5230\u7684\u65b9\u6848\u5c31\u662f\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\uff0c\u4f46\u662f\u5728\u5c5e\u6027\u7684 DOM \u6811\u91cc\u600e\u4e48\u4e5f\u627e\u4e0d\u5230\uff0c\u65e0\u6cd5\u5b9a\u4f4d\u5230\uff0c\u6211\u4eec\u4e5f\u8054\u5408\u7814\u53d1\u540c\u5b66\u4e00\u8d77\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u4f46\u6700\u7ec8\u8fd8\u662f\u6ca1\u80fd\u89e3\u51b3\uff0c\u975e\u5e38\u9057\u61be\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42","title":"4.2\u3001\u6700\u65b0\u7684\u53f3\u952e\u83dc\u5355\u7ec8\u6781\u89e3\u51b3\u65b9\u6848","text":"\u7531\u4e8e\u53f3\u952e\u83dc\u5355\u9009\u9879\u51e0\u4e4e\u90fd\u662f\u6587\u672c\uff0c\u90a3\u4e48\u901a\u8fc7 OCR \u8bc6\u522b\uff0c\u51e0\u4e4e\u662f\u6700\u4f18\u7684\u65b9\u6848\uff1a \u4e0d\u7528\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff1b \u4e0d\u4f1a\u53d7\u5230\u83dc\u5355\u9009\u9879\u987a\u5e8f\u6539\u53d8\u7684\u5f71\u54cd\uff1b \u4e0d\u4f1a\u53d7\u5230\u5b57\u4f53 UI \u53d8\u5316\u7684\u5f71\u54cd\uff1b \u5173\u4e8e OCR \u8bc6\u522b\u6211\u4eec\u5728\u540e\u9762\u4f1a\u8be6\u7ec6\u8bb2\u5230\uff0c\u672c\u7ae0\u8282\u4e3b\u8981\u8bb2\u57fa\u4e8e OCR \u8bc6\u522b\uff0c\u6211\u4eec\u5728\u53f3\u952e\u83dc\u5355\u8bc6\u522b\u4e0a\u7684\u7a81\u7834\u548c\u521b\u65b0\uff1b \u4f7f\u7528 OCR \u8bc6\u522b\u53f3\u952e\u83dc\u5355\u867d\u7136\u5df2\u7ecf\u5f88\u5b8c\u7f8e\u4e86\uff0c\u4f46\u662f\u5728\u4e00\u4e9b\u60c5\u51b5\u4e0b\u4ecd\u7136\u5b58\u5728\u4e00\u70b9\u95ee\u9898\uff0c\u5c31\u662f\u5c4f\u5e55\u4e2d\u51fa\u73b0\u591a\u4e2a\u548c\u83dc\u5355\u9009\u9879\u6587\u5b57\u76f8\u540c\u7684\u6587\u5b57\u65f6\uff0c\u6bd4\u5982\u4e0b\u9762\u8fd9\u79cd\u60c5\u51b5\uff1a \u5c4f\u5e55\u6070\u597d\u51fa\u73b0\u4e86\u4e24\u4e2a\u201c\u590d\u5236\u201d\uff0c\u6b64\u65f6\u8981\u5b9a\u4f4d\u5230\u83dc\u5355\u4e2d\u7684 \u201c\u590d\u5236\u201d\uff0c\u5c31\u9700\u8981\u8fdb\u4e00\u6b65\u505a\u6570\u636e\u5904\u7406\uff0c\u6bd4\u5982\uff1aOCR \u8fd4\u56de 2 \u4e2a\u201c\u590d\u5236\u201d\u7684\u5750\u6807\uff0c\u7528\u4f8b\u91cc\u9762\u6765\u5224\u65ad\u7528\u54ea\u4e2a\uff0c\u4ece\u4e1a\u52a1\u4e0a\u5c06\u5904\u7406\u8d77\u6765\u6bd4\u8f83\u9ebb\u70e6\uff0c\u56e0\u4e3a\u4f60\u5f97\u660e\u786e\u77e5\u9053\u83dc\u5355\u5728\u5de6\u8fb9\u8fd8\u662f\u53f3\u8fb9\uff0c\u7136\u540e\u8fd9\u672c\u8eab\u5c31\u662f\u4e0d\u786e\u5b9a\u7684\uff1b \u600e\u4e48\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u5462\uff0c\u8fd9\u5c31\u8981\u8bf4\u9053\u672c\u7ae0\u7684\u4e3b\u9898\uff1a\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b\u3002 \u3010\u539f\u7406\u3011 \u5728\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u524d\u622a\u4e00\u5f20\u56fe\uff0c\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\u518d\u622a\u53d6\u4e00\u5f20\u56fe\uff0c\u4e24\u5f20\u56fe\u552f\u4e00\u53d8\u5316\u7684\u5c31\u662f\u53f3\u952e\u83dc\u5355\uff0c\u5c06\u5176\u4ed6\u76f8\u540c\u7684\u5730\u65b9\u90fd\u5c4f\u853d\u6389\uff0c\u53ea\u7559\u4e0b\u83dc\u5355\u754c\u9762\uff0c\u5982\u6b64\u5373\u53ef\u6d88\u9664\u5e72\u6270\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u5c06\u4e24\u79cd\u56fe\u505a\u524d\u540e\u5bf9\u6bd4\u63d0\u53d6\u53ef\u4ee5\u5f97\u5230\u8fd9\u6837\u7684\u56fe\uff1a \u4f60\u770b\uff0c\u901a\u8fc7\u524d\u540e\u56fe\u7247\u7684\u5bf9\u6bd4\uff0c\u5c06\u76f8\u540c\u7684\u90e8\u5206\u7ed9\u6d88\u9664\u6389\uff0c\u518d\u8fdb\u884c OCR \u8bc6\u522b\uff0c\u8fd9\u6837\u5c31\u4e0d\u4f1a\u6709\u5e72\u6270\u4e86\uff1b \u4ee3\u7801\u5b9e\u73b0\u8bf7\u67e5\u770b src/filter_image.py \uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def filter_image(action):\n\"\"\"\n \u5bf9\u6bd4\u52a8\u4f5c\u524d\u540e\u4e24\u5f20\u56fe\u7247\uff0c\u63d0\u53d6\u4e0d\u540c\u7684\u90e8\u5206\u751f\u6210\u4e00\u5f20\u65b0\u7684\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u65b0\u56fe\u7247\u7684\u8def\u5f84\n :param action: \u52a8\u4f5c\u51fd\u6570\u7684\u51fd\u6570\u5bf9\u8c61\n :return: \u65b0\u56fe\u7247\u7684\u8def\u5f84\n \"\"\"\n action \u662f\u9f20\u6807\u4e8b\u4ef6\uff0c\u56e0\u4e3a\u6b64\u7c7b\u573a\u666f\u4e0d\u4ec5\u4ec5\u5728\u53f3\u952e\u5b58\u5728\uff0c\u5355\u51fb\u3001\u53cc\u51fb\u7b49\u7b49\uff0c\u53ea\u8981\u64cd\u4f5c\u524d\u540e\u540e\u53d8\u5316\u7684\u90fd\u53ef\u4ee5\uff1a from src.mouse_key import MouseKey\naction = (\nMouseKey.click,\nMouseKey.right_click,\nMouseKey.double_click,\nMouseKey.move_to,\n)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5","title":"5\u3001\u52a8\u6001\u56fe\u50cf\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5728\u684c\u9762\u58c1\u7eb8\u5207\u6362\uff0c\u6216\u770b\u56fe\u3001\u76f8\u518c\u5207\u6362\u56fe\u7247\u7c7b\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u7531\u4e8e\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u662f\u4e0d\u56fa\u5b9a\u7684\uff08\u4e0d\u540c\u7248\u672c\u7684\u7cfb\u7edf\u58c1\u7eb8\u4e0d\u540c\u3001\u58c1\u7eb8\u987a\u5e8f\u4e0d\u540c\uff0c\u770b\u56fe\u76f8\u518c\u5728\u56fe\u7247\u8d44\u6e90\u4e0d\u4e00\u5b9a\u56fa\u5b9a\uff09\uff0c\u90a3\u4e48\u5728\u6d4b\u8bd5\u5207\u6362\u58c1\u7eb8\u6216\u8005\u5207\u6362\u56fe\u7247\u7684\u573a\u666f\u65f6\u5c31\u4f1a\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u4f60\u4e0d\u77e5\u9053\u9884\u671f\u662f\u5565\uff0c\u7528\u4f8b\u64cd\u4f5c\u52a8\u6001\u7684\uff0c\u4e5f\u662f\u6781\u4e0d\u7a33\u5b9a\u3002 \u3010\u539f\u7406\u3011 \u5728\u5207\u6362\u56fe\u7247\u4e4b\u524d\u622a\u56fe\u4fdd\u5b58\u5e76\u8fd4\u56de\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u6b21\u8bc6\u522b\u8fd9\u5f20\u56fe\u7247\uff0c\u5982\u679c\u4e0d\u5b58\u5728\uff0c\u8bf4\u660e\u56fe\u7247\u5df2\u7ecf\u5207\u6362\u4e86\uff1b \u793a\u610f\u56fe\uff1a \u8fd9\u6837\uff0c\u6211\u4eec\u622a\u53d6\u4e86\u5f53\u524d\u56fe\u7247\u4e2d\u6bd4\u8f83\u6709\u4ee3\u8868\u6027\u7684\u4f4d\u7f6e\uff08\u4e00\u53ea\u9e1f\uff09\uff0c\u5728\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u7528\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1a \u6211\u4eec\u518d\u62ff\u7740\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd9\u6837\u5728\u5f53\u524d\u56fe\u7247\u4e2d\uff0c\u5c31\u4e0d\u80fd\u627e\u5230\u8fd9\u53ea\u9e1f\u4e86\uff0c\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u662f False\uff0c\u90a3\u4e48\u4e5f\u5c31\u53ef\u4ee5\u5224\u65ad\u56fe\u7247\u5207\u6362\u662f\u6210\u529f\u7684\u3002 \u4ee3\u7801\u793a\u610f\uff1a def save_temporary_picture(_x: int, _y: int, width: int, height: int):\n\"\"\"\n \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u56fe\u7247\u8def\u5f84\n :param x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n :param y: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n :param width: \u5bbd\u5ea6\n :param height: \u9ad8\u5ea6\n :return: \u56fe\u7247\u8def\u5f84\n \"\"\"\n \u6b64\u51fd\u6570\u7528\u4e8e\u5728\u64cd\u4f5c\u4e4b\u524d\u622a\u56fe\u4e00\u5f20\u4e34\u65f6\u56fe\u7247\uff0c\u8fd4\u56de\u56fe\u7247\u8def\u5f84\uff0c\u6700\u540e\u5728\u65ad\u8a00\u7684\u65f6\u5019\u518d\u5c06\u56fe\u7247\u8def\u5f84\u4f5c\u4e3a\u53c2\u6570\u4f20\u5165\u65ad\u8a00\u8bed\u53e5\u5373\u53ef\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ui","title":"\u4e09\u3001\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_1","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u662f\u6211\u4eec\u81ea\u7814\u7684\u4e00\u79cd\u4f7f\u7528\u7b80\u5355\uff0c\u4e14\u6548\u7387\u6781\u9ad8\u3001\u7a33\u5b9a\u6027\u597d\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u57fa\u4e8e\u5143\u7d20\u6309\u94ae\u5728\u5e94\u7528\u4e2d\u7684\u76f8\u5bf9\u4f4d\u7f6e\uff0c\u52a8\u6001\u83b7\u53d6\u5143\u7d20\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff0c\u9002\u7528\u4e8e\u5404\u79cd\u5c4f\u5e55\u5206\u8fa8\u7387\uff08\u5305\u62ec\u9ad8\u5206\u5c4f\u3001\u5bbd\u5c4f\u3001\u5e26\u9c7c\u5c4f\uff09\uff0c\u5f53\u5143\u7d20\u6309\u94ae\u4f4d\u7f6e\u76f8\u5bf9\u4e8e\u5e94\u7528\u754c\u9762\u4f4d\u7f6e\u53d1\u751f\u4fee\u6539\u4e4b\u540e\uff0c\u53ea\u9700\u8981\u6839\u636e UI \u8bbe\u8ba1\u56fe\u4e0a\u7684\u6e90\u6570\u636e\u4fee\u6539\u5bf9\u5e94\u5750\u6807\u6570\u636e\u5c31\u597d\uff0c\u7ef4\u62a4\u975e\u5e38\u7684\u65b9\u4fbf\u3002 \u6b64\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u9002\u7528\u4e8e\u4e00\u4e9b\u5143\u7d20\u4f4d\u7f6e\u76f8\u5bf9\u4e0e\u5e94\u7528\u754c\u9762\u6bd4\u8f83\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u97f3\u4e50\uff0899% \u7684\u5143\u7d20\u5b9a\u4f4d\u91c7\u7528\u8fd9\u79cd\uff0c\u6548\u679c\u975e\u5e38\u597d\uff09\uff0c\u4e0d\u9002\u7528\u4e8e\u754c\u9762\u4e0d\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u622a\u56fe\u5f55\u5c4f\uff0c\u5f88\u660e\u663e\u4e0d\u9002\u7528\u4e8e\u8fd9\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u3002\u8fd9\u79cd\u5168\u65b0\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u6709\u5b83\u7684\u9002\u7528\u6761\u4ef6\uff0c\u5982\u679c\u4f60\u53d1\u73b0\u4f7f\u7528\u5e38\u89c4\u7684\uff08\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u5b9a\u4f4d\uff09\u4e0d\u597d\u505a\u65f6\uff0c\u4e0d\u59a8\u8003\u8651\u4f7f\u7528\u8fd9\u79cd\uff0c\u5176\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff0c\u5e76\u4e14\u8fc5\u901f\u7231\u4e0a\u4ed6\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_1","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5728 UI \u8bbe\u8ba1\u56fe\u4e2d\u6211\u4eec\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u8fb9\u6846\u7684\u8ddd\u79bb\u7684\uff0c\u7136\u540e\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u6280\u672f\u624b\u6bb5\u83b7\u53d6\u5230\u5e94\u7528\u754c\u9762\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u53ca\u5e94\u7528\u7a97\u53e3\u7684\u5927\u5c0f\uff0c\u793a\u610f\u56fe\u5982\u4e0b\uff1a \uff08x1, y1\uff09\u4e3a\u5e94\u7528\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\uff1b\uff08x2, y2\uff09\u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u5de6\u4e0a\u89d2\uff08x1, y1\uff09\u7684\u5750\u6807\uff0c\u90a3\u4e48\u5b9e\u9645\u4e0a\u3010\u64ad\u653e\u6240\u6709\u3011\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\u4e3a\uff1a\uff08 x1 + x2, y1 + y2 \uff09\uff1b \u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5927\u5c0f\uff08w2, h2\uff09\uff0c\u53ef\u4ee5\u4ece UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\uff1b \u5728 UI \u8bbe\u8ba1\u7a3f\u4e0a\u70b9\u51fb\u3010\u64ad\u653e\u6240\u6709\u3011\u56fe\u6807\uff0c\u7136\u540e\u79fb\u52a8\u9f20\u6807\u5c31\u5c31\u53ef\u4ee5\u770b\u5230\u4e0a\u56fe\u7684\u53c2\u8003\u7ebf\u53ca\u6570\u636e\uff1b \u6240\u4ee5\uff0c\u6211\u4eec\u53ef\u4ee5\u8f7b\u677e\u7684\u83b7\u53d6\u5230\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u4e2d\u5fc3\u5750\u6807\u4e3a\uff1a\uff08 x1 + x2 + (w2 / 2), y1 + y2 + ( h2 / 2) \uff09 \u8be6\u7ec6\u6e90\u4ee3\u7801\u8bf7\u67e5\u770b AT \u57fa\u7840\u6846\u67b6: src/button_center.py \u83b7\u53d6\u5e94\u7528\u7a97\u53e3\u7684\u4fe1\u606f \u4f7f\u7528 xdotool \u548c xwininfo \u83b7\u53d6\u5230\u5e94\u7528\u7a97\u53e3\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u5de6\u4e0a\u89d2\uff09\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a app_id = CmdCtl.run_cmd(f\"xdotool search --classname --onlyvisible {self.app_name}\"\n).split(\"\\n\")\napp_id_list = [int(_id) for _id in app_id if _id]\nreturn CmdCtl.run_cmd(f\"xwininfo -id {app_id_list[self.number]}\")\n \u4f7f\u7528\u6b63\u5219\u83b7\u53d6\u7a97\u53e3\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u83b7\u53d6\u914d\u7f6e \u8bfb ini \u914d\u7f6e\u6587\u4ef6\uff0c\u83b7\u53d6\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e0e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a conf = ConfigParser()\nconf.read(self.config_path)\ndirection = conf.get(btn_name, \"direction\")\nposition = [int(i.strip()) for i in conf.get(btn_name, \"location\").split(\",\")]\n \u8ba1\u7b97\u5143\u7d20\u6309\u94ae\u5750\u6807 \u6839\u636e\u5e94\u7528\u7a97\u53e3\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u5927\u5c0f\u3001\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u5927\u5c0f\uff0c\u4f7f\u7528\u4e00\u5b9a\u7684\u7b97\u6cd5\u5373\u53ef\u8ba1\u7b97\u51fa\u5143\u7d20\u6309\u94ae\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u4e2d\u5fc3\u5750\u6807\uff09\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3","title":"3\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u3010\u914d\u7f6e\u65b9\u6cd5\u3011 \u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u7684\u6570\u636e\u6e90\u662f\u5e94\u7528\u5e93\u4e2d\u7684 ui.ini \u914d\u7f6e\u6587\u4ef6\uff1a ;section\n[\u65b0\u5efa\u6b4c\u5355+] ;key = value\ndirection = left_top\nlocation = 180, 268, 21, 21\n section \u662f\u4f60\u6839\u636e\u5bf9\u5e94\u7684\u5143\u7d20\u6309\u94ae\u547d\u540d\uff0c\u4f60\u53ef\u4ee5\u4efb\u610f\u547d\u540d\uff0c\u4f46\u6700\u597d\u6709\u5177\u4f53\u542b\u4e49\uff0c\u4e14\u80fd\u660e\u786e\u8868\u793a\u8fd9\u4e2a\u5143\u7d20\u6309\u94ae\u7684\u540d\u79f0\uff1b\u7528\u4e2d\u62ec\u53f7\u62ec\u8d77\u6765\u5c31\u884c\uff0c\u6bd4\u5982\uff1a[\u65b0\u5efa\u6b4c\u5355+] \uff1b direction \u662f\u914d\u7f6e\u8be5\u5143\u7d20\u7684\u53c2\u8003\u7cfb\uff0c\u5206\u522b\u4e3a\uff1a left_top \u5de6\u4e0a\uff1b left_bottom \u5de6\u4e0b\uff1b right_top \u53f3\u4e0a\uff1b right_bottom \u53f3\u4e0b\uff1b \u53c2\u8003\u7cfb\u7684\u9009\u53d6\u6807\u51c6\uff1a\u62c9\u52a8\u6539\u53d8\u7a97\u53e3\u5927\u5c0f\u65f6\uff0c\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u53c2\u8003\u7cfb\u4f4d\u7f6e\u662f\u4e0d\u53d8\u7684\uff1b location \u662f\u8be5\u5143\u7d20\u6309\u94ae\u7684\u76f8\u5bf9\u4e0e\u53c2\u8003\u7cfb\u7684 x, y \u7684\u8ddd\u79bb\uff0c\u53ca\u5927\u5c0f(w, h)\uff0c\u8fd9\u56db\u4e2a\u6570\u636e\u53ef\u4ee5\u901a\u8fc7 UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\u6570\u636e\uff0c\u5728\u7f16\u8f91\u6a21\u5f0f\u4e0b\uff0c\u70b9\u51fb UI \u56fe\u4e0a\u7684\u6309\u94ae\uff0c\u53f3\u4fa7\u5c31\u4f1a\u51fa\u73b0\u8be5\u5143\u7d20\u6309\u94ae\u7684 x, y, w, h \u6570\u636e\u3002 \u5982\u679c UI \u56fe\u4e0a\u6ca1\u6709\u63d0\u4f9b\u4f60\u60f3\u8981\u7684\u5143\u7d20\u6570\u636e\uff0c\u4f60\u53ef\u4ee5\u76f4\u63a5\u5728\u7cfb\u7edf\u4e2d\u4f7f\u7528\u622a\u56fe\u5f55\u5c4f\u8fdb\u884c\u5c3a\u91cf\uff0c\u8fd9\u662f\u4e00\u79cd\u4e0d\u63a8\u8350\u4f46\u80fd\u7528\u7684\u65b9\u6cd5\u3002 \u3010\u8c03\u7528\u65b9\u6cd5\u3011 \u5728\u5e94\u7528\u5e93\u65b9\u6cd5\u5c42\u8fd9\u6837\u5199\uff1a def click_add_music_list_btn_in_music_by_ui(self):\n\"\"\"\u70b9\u51fb\u65b0\u5efa\u6b4c\u5355\u6309\u94ae\"\"\"\nself.click(*self.ui.btn_center(\"\u65b0\u5efa\u6b4c\u5355+\"))\n self.ui.btn_center() \u662f\u56fa\u5b9a\u5199\u6cd5\uff0c\u53c2\u6570\u5c31\u662f\u914d\u7f6e\u91cc\u9762\u7684 section \u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ocr","title":"\u56db\u3001OCR \u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_2","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 OCR \u65b9\u6848\u5927\u591a\u91c7\u7528\u8c37\u6b4c OCR\uff08Tesseract\uff09\u65b9\u6848\uff0c\u4f46\u662f\u5b83\u5bf9\u4e8e\u4e2d\u6587\u7684\u8bc6\u522b\u975e\u5e38\u5dee\uff0c\u7ecf\u8fc7\u5927\u91cf\u7684\u8c03\u7814\uff0c\u6211\u4eec\u4f7f\u7528 PaddleOCR\uff0c\u5b83\u662f\u4e00\u4e2a\u5f00\u6e90\u7684\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u8bc6\u522b\u5de5\u5177\uff0c\u4e5f\u662f PaddlePaddle \u6700\u6709\u540d\u7684\u4e00\u4e2a\u5f00\u6e90\u9879\u76ee\uff0c\u611f\u5174\u8da3\u7684\u53ef\u4ee5\u70b9\u8fd9\u91cc\u4e86\u89e3\uff0c\u591a\u7684\u4e0d\u8bf4\u4e86\uff0c\u4f60\u53ea\u9700\u8981\u77e5\u9053\u5b83\u5c31\u662f\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_2","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5b89\u88c5\u4ed6\u662f\u4e2a\u5f88\u9ebb\u70e6\u7684\u4e8b\u60c5\uff0c\u867d\u7136\u64cd\u4f5c\u5f88\u7b80\u5355\uff0c\u4f46\u5176\u5b9e\u5b89\u88c5\u5305\u6709\u70b9\u5927\uff0c\u56e0\u6b64\u6211\u4eec\u4e0d\u5e0c\u671b\u76f4\u63a5\u5728 env.sh \u4e2d\u52a0\u5165\u5b83\uff0c\u8fd9\u4f1a\u8ba9\u6574\u4e2a\u81ea\u52a8\u5316\u73af\u5883\u53d8\u5f97\u975e\u5e38\u81c3\u80bf\uff1b \u56e0\u6b64\uff0c\u6211\u4eec\u60f3\u5230\u5c06\u5b83\u505a\u6210\u4e00\u4e2a RPC \u670d\u52a1\u5728\u5176\u4ed6\u673a\u5668\u4e0a\u90e8\u7f72\uff0c\u6d4b\u8bd5\u673a\u901a\u8fc7\u8fdc\u7a0b\u8c03\u7528 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u4f7f\u7528\u5b83\uff1b RPC \u7684\u8c03\u7528\u903b\u8f91\uff1a \u8fd9\u6837\u6211\u4eec\u53ea\u9700\u8981\u5728\u670d\u52a1\u7aef\u90e8\u7f72\u597d OCR \u8bc6\u522b\u7684\u670d\u52a1\uff0c\u7136\u540e\u901a\u8fc7 RPC \u670d\u52a1\u5c06\u529f\u80fd\u63d0\u4f9b\u51fa\u6765\uff0c\u6846\u67b6\u91cc\u9762\u53ea\u9700\u8981\u8c03\u7528\u5bf9\u5e94\u7684 RPC \u63a5\u53e3\u5c31\u884c\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_1","title":"3\u3001\u4f7f\u7528\u8bf4\u660e","text":"\u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nfrom paddleocr import PaddleOCR\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef paddle_ocr(pic_path, lang):\n\"\"\"\n Paddleocr\u76ee\u524d\u652f\u6301\u7684\u591a\u8bed\u8a00\u8bed\u79cd\u53ef\u4ee5\u901a\u8fc7\u4fee\u6539lang\u53c2\u6570\u8fdb\u884c\u5207\u6362\n \u4f8b\u5982`ch`, `en`, `fr`, `german`, `korean`, `japan`\n :param file_name:\n :param lang:\n :return:\n \"\"\"\nif __name__ == \"__main__\":\nIP = popen(\"hostname -I\").read().split(\" \")[0]\nPORT = 8890\nSCREEN_CACHE = \"/tmp/screen.png\"\nserver = ThreadXMLRPCServer((IP, PORT), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(paddle_ocr, \"paddle_ocr\")\nprint(\"\u76d1\u542c\u5ba2\u6237\u7aef\u8bf7\u6c42\u3002\u3002\")\nserver.serve_forever()\n \u6846\u67b6\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from src import OCR\nOCR.ocr(*target_strings, picture_abspath=None, similarity=0.6, return_default=False, return_first=False, lang=\"ch\"):\n# \u901a\u8fc7 OCR \u8fdb\u884c\u8bc6\u522b\u3002\n# target_strings:\n# \u76ee\u6807\u5b57\u7b26,\u8bc6\u522b\u4e00\u4e2a\u5b57\u7b26\u4e32\u6216\u591a\u4e2a\u5b57\u7b26\u4e32,\u5e76\u8fd4\u56de\u5176\u5728\u56fe\u7247\u4e2d\u7684\u5750\u6807;\n# \u5982\u679c\u4e0d\u4f20\u53c2\uff0c\u8fd4\u56de\u56fe\u7247\u4e2d\u8bc6\u522b\u5230\u7684\u6240\u6709\u5b57\u7b26\u4e32\u3002\n# picture_abspath: \u8981\u8bc6\u522b\u7684\u56fe\u7247\u8def\u5f84\uff0c\u5982\u679c\u4e0d\u4f20\u9ed8\u8ba4\u622a\u53d6\u5168\u5c4f\u8bc6\u522b\u3002\n# similarity: \u5339\u914d\u5ea6\u3002\n# return_default: \u8fd4\u56de\u8bc6\u522b\u7684\u539f\u751f\u6570\u636e\u3002\n# return_first: \u53ea\u8fd4\u56de\u7b2c\u4e00\u4e2a,\u9ed8\u8ba4\u4e3a False,\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u6240\u6709\u6570\u636e\u3002\n# lang: `ch`, `en`, `fr`, `german`, `korean`, `japan`\n \u6b64\u65b9\u6848\u5728\u6846\u67b6\u5185\u6ca1\u6709\u5f15\u5165\u4efb\u4f55\u4e09\u65b9\u4f9d\u8d56\u5b8c\u5168\u91c7\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\uff0c\u800c\u4e14\u4f7f\u7528\u65b9\u6cd5\u975e\u5e38\u7b80\u5355\uff0c\u53ea\u9700\u8981\u901a\u8fc7 OCR.ocr() \u5373\u53ef\uff1b \u5bf9\u4e8e\u4e00\u4e9b\u6587\u6848\u7684\u573a\u666f\u975e\u5e38\u9002\u7528\uff0c\u6b64\u65b9\u6cd5\u76f4\u63a5\u8fd4\u56de\u5750\u6807\uff0c\u53ef\u4ee5\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u3002 \u4e5f\u53ef\u4ee5\u7528\u4e8e\u6587\u5b57\u65ad\u8a00\uff0c\u4ee3\u7801\u793a\u610f\uff1a def assert_ocr_exist(\n*args, picture_abspath=None, similarity=0.6, return_first=False, lang=\"ch\"\n):\n\"\"\"\u65ad\u8a00\u6587\u6848\u5b58\u5728\"\"\"\npic = None\nif picture_abspath is not None:\npic = picture_abspath + \".png\"\nres = OCR.ocr(\n*args,\npicture_abspath=pic,\nsimilarity=similarity,\nreturn_first=return_first,\nlang=lang,\n)\nif res is False:\nraise AssertionError(\n(f\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{args}\", f\"{pic if pic else GlobalConfig.SCREEN_CACHE}\")\n)\nif isinstance(res, tuple):\npass\nelif isinstance(res, dict) and False in res.values():\nres = filter(lambda x: x[1] is False, res.items())\nraise AssertionError(\n(\nf\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{dict(res)}\",\nf\"{pic if pic else GlobalConfig.SCREEN_CACHE}\",\n)\n)\n \u5728\u7528\u4f8b\u4e2d\u4f7f\u7528\u65ad\u8a00\uff0c\u793a\u4f8b\uff1a def test_font_manager_021(self):\n\"\"\"\u53f3\u4fa7\u2665-\u6536\u85cf/\u53d6\u6d88\u6536\u85cf\u5b57\u4f53\"\"\"\n# \u5b57\u4f53\u7ba1\u7406\u5668\u754c\u9762\u53f3\u4fa7\u8be6\u60c5\u5217\u8868\uff0c\u9009\u62e9\u672a\u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e / \u6536\u85cf\u5b57\u4f53\n# \u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e\u83dc\u5355\u663e\u793a\u201c\u53d6\u6d88\u6536\u85cf\u201d\uff1b\n...\nself.assert_ocr_exist(\"\u53d6\u6d88\u6536\u85cf\")\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_1","title":"4\u3001\u670d\u52a1\u7aef\u90e8\u7f72","text":"\u6211\u4eec\u76ee\u524d\u662f\u5c06 OCR \u670d\u52a1\u90e8\u7f72\u5728\u666e\u901a\u7684\u529e\u516c\u673a\u4e0a\u7684\uff0c\u5982\u679c\u4f60\u89c9\u5f97\u73b0\u6709\u7684 OCR \u8bc6\u522b\u6027\u80fd\u4e0d\u591f\u597d\uff0c\u6070\u597d\u4f60\u6709\u66f4\u597d\u7684\u673a\u5668\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u5176\u79c1\u6709\u5316\u90e8\u7f72\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41_1","title":"4.1\u3001\u73af\u5883\u5b89\u88c5","text":"\u63a8\u8350\u4f7f\u7528 pipenv \u8fdb\u884c\u73af\u5883\u642d\u5efa\uff1b \u5b89\u88c5 pipenv \uff1a sudo pip3 install pipenv\n \u65b0\u5efa\u4e00\u4e2a\u76ee\u5f55\u4f5c\u4e3a\u73af\u5883\u5305 ocr_env\uff1a cd ~\nmkdir ocr_env\n \u521b\u5efa python 3.7 \u73af\u5883\uff1a cd ocr_env\npipenv --python 3.7\n \u5b89\u88c5 OCR \u4f9d\u8d56\u5305\uff1a pipenv install paddlepaddle -i https://mirror.baidu.com/pypi/simple\npipenv install \"paddleocr>=2.0.1\" -i https://mirror.baidu.com/pypi/simple\n \u4e0d\u51fa\u610f\u5916\uff0c\u8fd9\u6837\u5c31\u628a\u4f9d\u8d56\u5b89\u88c5\u597d\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42_1","title":"4.2\u3001\u542f\u52a8\u670d\u52a1","text":"\u5c06\u57fa\u7840\u6846\u67b6\u4e2d\u7684 scr/ocr/pdocr_rpc_server.py \u6587\u4ef6\u62f7\u8d1d\u5230 ocr_env \u76ee\u5f55\uff0c\u540e\u53f0\u6267\u884c\u5b83\u5c31\u597d\u4e86\uff1a cd ocr_env\nnohup pipenv run python pdocr_rpc_server.py &\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#43","title":"4.3\u3001\u914d\u7f6e\u5f00\u673a\u81ea\u542f\uff08\u901a\u7528\uff09","text":"\u4f60\u80af\u5b9a\u4e0d\u60f3\u6bcf\u6b21\u673a\u5668\u91cd\u542f\u4e4b\u540e\u90fd\u9700\u8981\u624b\u52a8\u542f\u52a8\u670d\u52a1\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u914d\u7f6e\u5f00\u673a\u81ea\u542f\u3002 \u5199\u5f00\u673a\u81ea\u542f\u670d\u52a1\u6587\u4ef6\uff1a sudo vim /lib/systemd/system/ocr.service\n autoocr \u540d\u79f0\u4f60\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff0c\u5199\u5165\u4ee5\u4e0b\u5185\u5bb9\uff1a [Unit]\nDescription=OCR Service\nAfter=multi-user.target\n\n[Service]\nUser=uos\nGroup=uos\nType=idle\nWorkingDirectory=/home/uos/ocr_env\nExecStart=pipenv run python pdocr_rpc_server.py\n\n[Install]\nWantedBy=multi-user.target\n \u6ce8\u610f\u66ff\u6362\u4f60\u7684${USER} \u4fee\u6539\u914d\u7f6e\u6587\u4ef6\u7684\u6743\u9650\uff1a sudo chmod 644 /lib/systemd/system/ocr.service\n \u81ea\u542f\u670d\u52a1\u751f\u6548\uff1a sudo systemctl daemon-reload\nsudo systemctl enable ocr.service\n \u67e5\u770b\u670d\u52a1\u72b6\u6001\uff1a sudo systemctl status ocr.service\n \u4f60\u53ef\u4ee5\u518d\u91cd\u542f\u4e0b\u7535\u8111\uff0c\u770b\u770b\u670d\u52a1\u662f\u4e0d\u662f\u6b63\u5e38\u542f\u52a8\u4e86\uff0c\u6ca1\u62a5\u9519\u5c31 OK \u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_4","title":"\u4e94\u3001\u5c5e\u6027\u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_3","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 UI \u81ea\u52a8\u5316\u5927\u591a\u90fd\u662f\u57fa\u4e8e\u6d4f\u89c8\u5668\u7684\uff0c\u6838\u5fc3\u662f\u5728\u7f51\u9875\u7684 DOM \u6811\u4e0a\u67e5\u627e\u5143\u7d20\uff0c\u5e76\u5bf9\u5176\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\uff1b Linux \u684c\u9762\u5e94\u7528\u5927\u591a\u662f\u91c7\u7528 Qt \u7f16\u5199\u7684\uff0c\u5728 Qt \u4e2d\u4e5f\u662f\u4ece\u6700\u9876\u5c42\u7684 MainWindow \u5f00\u59cb\u6784\u5efa\u5e94\u7528\uff0c\u6240\u4ee5\u903b\u8f91\u4e5f\u662f\u4e00\u6837\u7684\uff0cQt \u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u540c\u6837\u53ef\u4ee5\u901a\u8fc7 DOM \u6811\uff08\u5c5e\u6027\u6811\uff09\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff0c\u6211\u4eec\u79f0\u4e4b\u4e3a\u5c5e\u6027\u5b9a\u4f4d\u3002 \u501f\u52a9\u5f00\u6e90\u5de5\u5177 dogtail \u6211\u4eec\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u83b7\u53d6\uff0c\u4ece\u800c\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\u3002dogtail \u7684\u9879\u76ee\u4ecb\u7ecd\u53ef\u4ee5\u731b\u6233\u8fd9\u91cc\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_3","title":"2\u3001\u4f7f\u7528\u65b9\u6cd5","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#21sniff","title":"2.1\u3001sniff\uff08\u55c5\u63a2\u5668\uff09\u4f7f\u7528","text":"\u5728\u7ec8\u7aef\u8f93\u5165 sniff \u542f\u52a8 AT-SPI Browser mikigo@mikigo-PC:~$ sniff\n \u67e5\u770b\u5e94\u7528\u7684\u6807\u7b7e \u5728 sniff \u91cc\u9762\u53ef\u4ee5\u770b\u5230\u7cfb\u7edf\u4e2d\u5df2\u542f\u52a8\u7684\u5e94\u7528\uff0c\u70b9\u51fb\u5e94\u7528\u540d\u79f0\u524d\u9762\u7684\u4e09\u89d2\u5f62\u56fe\u6807\uff0c\u53ef\u4ee5\u5c55\u5f00\u5e94\u7528\u7684\u6807\u7b7e\uff0c\u6240\u6709\u6807\u7b7e\u4ee5 tree \u7684\u5f62\u5f0f\u5c55\u793a\uff0c\u5bf9\u5e94\u5e94\u7528\u91cc\u9762\u7684\u7236\u7a97\u53e3\u548c\u5b50\u7a97\u53e3\u3002 \u83b7\u53d6\u5143\u7d20\u63a7\u4ef6\u7684\u6807\u7b7e\u540d\u79f0 \u9996\u5148\uff0c\u4e3a\u4e86\u65b9\u4fbf\u67e5\u770b\u5143\u7d20\u63a7\u4ef6\u5bf9\u5e94\u7684\u4f4d\u7f6e\uff0c\u5efa\u8bae\u73b0\u5728\u4e0a\u65b9\u5de5\u5177\u680f\u70b9\u51fb Actions\uff0c\u7136\u540e\u52fe\u9009 Hightlight Items\uff0c\u8fd9\u6837\u5728 sniff \u4e2d\u9f20\u6807\u9009\u4e2d\u5143\u7d20\u6807\u7b7e\u7684\u65f6\u5019\uff0c\u5e94\u7528\u4e2d\u4f1a\u6709\u76f8\u5e94\u7684\u5149\u6807\u9501\u5b9a\u3002 \u5728 sniff \u91cc\u9762\u70b9\u51fb\u8fdb\u5165\u5e94\u7528\u7684\u6807\u7b7e tree \u4e2d\u540e\uff0c\u70b9\u51fb\u76f8\u5e94\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5728\u5de5\u5177\u4e0b\u65b9\uff0c\u4f1a\u5c55\u793a\u5143\u7d20\u63a7\u4ef6\u7684 Name\uff0c\u8fd9\u4e2a\u5c31\u662f\u6807\u7b7e\u540d\u79f0\u3002 \u5728 tree \u4e2d\u6709\u4e9b\u5730\u65b9\u662f\u7a7a\u767d\u7684\u6216\u8005\u662f Form\uff0c\u662f\u56e0\u4e3a\u5f00\u53d1\u4eba\u5458\u5728\u6dfb\u52a0\u6807\u7b7e\u7684\u65f6\u5019\u6ca1\u6709\u6dfb\u52a0\uff0c\u6216\u8005\u6709\u4e9b\u7236\u7a97\u53e3\u4e0d\u9700\u8981\u6dfb\u52a0\uff0c\u8fd9\u79cd\u5728\u5b9e\u9645\u4e1a\u52a1\u4e2d\u662f\u4e0d\u5f71\u54cd\u7684\uff0c\u6211\u4eec\u53ea\u8981\u4fdd\u8bc1\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\u4e2d\uff0c\u8981\u7528\u5230\u7684\u5143\u7d20\u90fd\u6dfb\u52a0\u4e86\u6807\u7b7e\u5373\u53ef\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#22","title":"2.2\u3001\u5143\u7d20\u64cd\u4f5c","text":"\u83b7\u53d6\u5e94\u7528\u5bf9\u8c61 dogtail \u83b7\u53d6\u5e94\u7528\u5bf9\u8c61\u7684\u65f6\u5019\uff0c\u4f7f\u7528\u7684\u662f tree \u5e93\u91cc\u9762\u7684 application() \u65b9\u6cd5\uff1a from dogtail.tree import root\napp_obj = root.application('deepin-music')\n app_obj\u5c31\u662f\u5e94\u7528\u7684\u5bf9\u8c61\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\uff0c\u662f\u5e94\u7528\u5bf9\u8c61\u4f7f\u7528child()\u65b9\u6cd5\uff1a element = app_obj.child('element_name')\n \u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u4f20\u5165\u5143\u7d20\u7684 Name\uff0c\u83b7\u53d6\u5230\u76f8\u5e94\u5143\u7d20\u7684\u5bf9\u8c61\u3002Name \u53ef\u4ee5\u901a\u8fc7 sniff \u67e5\u770b\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\u5217\u8868: element_list = element.children\n \u83b7\u53d6\u5230\u8fd9\u4e2a\u5143\u7d20\u4e0b\u9762\u6240\u6709\u7684\u5143\u7d20\u5217\u8868\u3002 \u8fd9\u4e2a\u65b9\u6cd5\u9002\u7528\u4e8e\u6709\u4e9b\u6807\u7b7e\u6ca1\u6709\u6dfb\u52a0\uff0c\u4f46\u662f\u4f4d\u7f6e\u662f\u56fa\u5b9a\u7684\uff0c\u6211\u4eec\u901a\u8fc7\u7d22\u5f15\u53ef\u4ee5\u53d6\u5f97\u5143\u7d20\u3002 element_list[0]\n \u5bf9\u5143\u7d20\u7684\u64cd\u4f5c \u5728\u83b7\u53d6\u5230\u5143\u7d20\u4e4b\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u76f8\u5e94\u7684\u64cd\u4f5c\u3002 \u5355\u51fb element.click(button=1)\n button 1 \u2014>\u5de6\u952e\uff0c2 \u2014>\u6eda\u8f6e\uff0c3 \u2014>\u53f3\u952e\uff0c\u9ed8\u8ba4\u4e3a 1 \u53cc\u51fb element.doubleClick(button=1)\n \u9f20\u6807\u60ac\u505c element.point()\n \u9f20\u6807\u79fb\u52a8\u5230\u5143\u7d20\u4e2d\u5fc3\u4f4d\u7f6e \u6587\u672c\u8f93\u5165 element.typeText(string)\n \u5411\u5143\u7d20\u5bf9\u8c61\u8f93\u5165\u5b57\u7b26\u4e32 \uff0c\u6bd4\u5982\u8f93\u5165\u6846 \u7ec4\u5408\u952e element.keyCombo(comboString)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#23","title":"2.3\u3001\u6846\u67b6\u5c01\u88c5","text":"\u4ee3\u7801\u793a\u4f8b\uff1a # \u8be6\u7ec6\u4ee3\u7801\u8bf7\u67e5\u770b src/dogtail_utils.py\nclass DogtailUtils:\ndef __init__(self, name=None, description=None):\nself.name = name\nself.description = description\nself.obj = root.application(self.name, self.description)\ndef app_element(self, *args, **kwargs):\n\"\"\"\n \u83b7\u53d6app\u5143\u7d20\u7684\u5bf9\u8c61\n :return: \u5143\u7d20\u7684\u5bf9\u8c61\n \"\"\"\nreturn self.obj.child(*args, **kwargs, retry=False)\ndef element_center(self, element) -> tuple:\n\"\"\"\n \u83b7\u53d6\u5143\u7d20\u7684\u4e2d\u5fc3\u4f4d\u7f6e\n :param element:\n :return: \u5143\u7d20\u4e2d\u5fc3\u5750\u6807\n \"\"\"\n_x, _y, _w, _h = self.app_element(element).extents\n_x = _x + _w / 2\n_y = _y + _h / 2\nreturn _x, _y\n \u6846\u67b6\u63d0\u4f9b\u7684\u63a5\u53e3\u975e\u5e38\u7b80\u6d01\uff0c\u5728\u8c03\u7528\u65f6\uff1a self.dog.element_center(\"\u64ad\u653e\")\n \u8fd9\u6837\u5c31\u80fd\u83b7\u53d6\u5230\u6b64\u5143\u7d20\u7684\u4e2d\u5fc3\u5750\u6807\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_5","title":"\u516d\u3001\u6807\u7b7e\u5316\u7ba1\u7406","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_4","title":"1\u3001\u6807\u7b7e\u8bf4\u660e","text":"\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u811a\u672c ID\uff1a\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c/\u51fd\u6570 ID\uff1b PMS\u7528\u4f8bID\uff1aPMS \u4e0a\u5bf9\u5e94\u7684\u7528\u4f8b ID\uff08\u7528\u4f8b\u5e93 ID\uff09\uff1b \u9ed8\u8ba4\u4f7f\u7528\u7528\u4f8b\u5e93 ID\uff0c\u5bf9\u4e8e\u6682\u65f6\u6ca1\u6709\u4f7f\u7528\u7528\u4f8b\u5e93\u7ba1\u7406\u7528\u4f8b\u7684\u9879\u76ee\uff0c\u53ef\u4ee5\u4f7f\u7528\u4ea7\u54c1\u5e93\u7528\u4f8b ID\uff1b \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1aFUNC\uff08\u529f\u80fd\uff09\u3001API\uff08\u63a5\u53e3\uff09\u3001BASELINE\uff08\u57fa\u7ebf\uff09\u3001PERF\uff08\u6027\u80fd\uff09\u3001STR\uff08\u538b\u529b\uff09\u3001SEC\uff08\u5b89\u5168\uff09\u3001CTS\uff08\u517c\u5bb9\u6027\uff09 \u4e0a\u7ebf\u5bf9\u8c61\uff1aCICD\uff0c\u8868\u793a\u4e0a\u7ebf\u5230 CICD \u6d41\u6c34\u7ebf\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u53ef\u4e00\u952e\u751f\u6210 case_list.csv \u6587\u4ef6\uff0c\u7528\u4e8e\u5bfc\u5165\u5230\u660e\u9053\u4e91 AT \u7528\u4f8b\u5217\u8868\u4e2d\u63a7\u5236 CICD \u8dd1\u6d4b\u8303\u56f4\uff1b \u6d4b\u8bd5\u7ea7\u522b\uff1aC1 / C2 / C3 / C4\uff0c\u5177\u4f53\u5b9a\u4e49\u53c2\u8003\u6d41\u6c34\u7ebf\u4f7f\u7528\u6307\u5bfc\uff1b \u8df3\u8fc7\u539f\u56e0\uff1askip-XXX\uff0c\u7528\u4e8e\u63a7\u5236\u7528\u4f8b\u662f\u5426\u6267\u884c\uff1b \u786e\u8ba4\u4fee\u590d\uff1afixed-XXX\uff0c\u7528\u4e8e\u6807\u8bb0\u7528\u4f8b\u7684\u4fee\u590d\u72b6\u6001\uff08\u540e\u9762\u8be6\u7ec6\u8bb2\u89e3\u7528\u6cd5\uff09\uff1b \u5e9f\u5f03\u7528\u4f8b\uff1aremoved-\u5df2\u5e9f\u5f03\uff0c\u7528\u4e8e\u6807\u8bb0\u5df2\u7ecf\u5e9f\u5f03\u7684\u7528\u4f8b\uff0c\u6b64\u7528\u4f8b\u6807\u7b7e\u4e0d\u4f1a\u88ab\u6dfb\u52a0\uff0c\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff1b \u793a\u4f8b\uff1a \u811a\u672cID PMS\u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u4e0a\u7ebf\u5bf9\u8c61 \u6d4b\u8bd5\u7ea7\u522b \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b ... 001 679537 L1 FUNC CICD C1 skip-XXX fixed-XXX removed-\u5df2\u5e9f\u5f03 ..."},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_4","title":"2\u3001\u64cd\u4f5c\u6b65\u9aa4","text":"2.1\u3001\u5728\u5b50\u9879\u76ee\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u4ee5\u7528\u4f8b\u7684 py \u6587\u4ef6\u9664\u53bb\u9996\u5b57\u7b26\u4e32 \"test_\" \u548c\u7528\u4f8b\u5e8f\u53f7\u540e\u7684\u5b57\u7b26\u4e32\u4f5c\u4e3a csv \u7684\u6587\u4ef6\u540d\u3002 \u4f8b\u5982: \u76f8\u518c\u7684\u7528\u4f8b\u6587\u4ef6\u4e3a test_album_xxx.py\uff0cxxx \u8868\u793a\u4efb\u610f\u4e09\u4f4d\u6570\u5b57\u4ee3\u8868\u7528\u4f8b\u5e8f\u53f7\uff0c\u6b64\u65f6 csv \u6587\u4ef6\u540d\u5c31\u5e94\u4e3a album.csv\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u6240\u6709 csv \u6587\u4ef6\u5efa\u8bae\u653e\u5728\u4e00\u4e2a tags \u76ee\u5f55\u4e0b\u3002 \u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 2.2\u3001\u7b2c\u4e00\u5217\u4e3a\u811a\u672c ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b\u7528\u4f8b\u6807\u7b7e\u53ef\u4ee5\u65e0\u5e8f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_2","title":"3\u3001\u589e\u52a0\u8bf4\u660e","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_1","title":"3.1\u3001\u8df3\u8fc7\u7528\u4f8b","text":"\u4f20\u7edf\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668(@pytest.mark.skip)\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a; \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#311","title":"3.1.1\u3001\u56fa\u5b9a\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u7b7e\u5f00\u5934\u4e3a \u201cskip-XXX\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\uff0c\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\u5219\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u7b7e\u4e3a SKIPED\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#312","title":"3.1.2\u3001\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skipif_platform-aarch64&mips64 \u67d0\u4e9b\u7528\u4f8b\u4f1a\u56e0\u4e3a\u4e0d\u540c\u7684\u73af\u5883\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\uff0c\u5e38\u89c1\u7684\u573a\u666f\u4e3a\u5728\u4e0d\u540c\u67b6\u6784\u4e0a\u5224\u65ad\u662f\u5426\u6267\u884c\uff0c\u8df3\u8fc7\u7684\u539f\u56e0\u6807\u7b7e\u4e3a \u201cskipif_platform-\u201d \u52a0\u67b6\u6784\u540d\uff0c\u591a\u4e2a\u67b6\u6784\u4e4b\u95f4\u4f7f\u7528 \u201c&\u201d \u62fc\u63a5\uff1b \u4ee5\u4e0a\u4f8b\u5b50\u4e3a\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u5224\u65ad\u5f53\u524d\u67b6\u6784\u662f\u5426\u4e3a arrch64 \u6216\u8005 mips64\uff0c\u82e5\u662f\uff0c\u5219\u8df3\u8fc7\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u82e5\u5426\u5219\u6267\u884c\u7528\u4f8b\uff1b \u76ee\u524d\u6846\u67b6\u9ed8\u8ba4\u4ec5\u652f\u6301\u67b6\u6784\u7684\u6761\u4ef6\u5224\u65ad\uff0c\u4f46\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u903b\u8f91\u652f\u6301\u81ea\u5b9a\u4e49\u6dfb\u52a0\u3002 \u5728\u9879\u76ee\u76ee\u5f55\u8def\u5f84\u4e0b\u5b58\u5728\u6587\u4ef6 setting/skipif.py\uff0c\u6240\u6709\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u7684\u51fd\u6570\u5199\u5728\u6b64\u6587\u4ef6\u4e2d\u3002 \u9ed8\u8ba4\u67b6\u6784\u5224\u65ad\u4f8b\u5b50\uff1a def skipif_platform(args: str):\n\"\"\"\u5e73\u53f0\u8df3\u8fc7\"\"\"\n_skip_key = args.split(\"&\")\nfor key in _skip_key:\nif GlobalConfig.SYS_ARCH == key:\nreturn True\nreturn False\n \u65b9\u6cd5\u7f16\u5199\u89c4\u8303\uff1a \u65b9\u6cd5\u540d\u5fc5\u987b\u4ee5 skipif \u5f00\u5934\uff1b \u65b9\u6cd5\u5fc5\u987b\u6709\u8fd4\u56de\u7ed3\u679c\u5e76\u4e14\u4e3a\u5e03\u5c14\u503c\uff08True \u4ee3\u8868\u8df3\u8fc7\uff0cFalse \u4ee3\u8868\u4e0d\u8df3\u8fc7\uff09\uff1b \u65b9\u6cd5\u53ea\u80fd\u6709\u4e00\u4e2a\u5165\u53c2\uff1b \u5728 csv \u6587\u4ef6\u8df3\u8fc7\u539f\u56e0\u4e00\u680f\u4e2d\u586b\u5199\u4e3a \u201c{\u51fd\u6570\u540d}-{\u53c2\u6570}\u201d\uff0c\u4f8b\u5982\uff1askipif_platform-aarch64\uff1b\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u4f1a\u4ee5\u7b2c\u4e00\u4e2a \u201c-\u201d \u8fdb\u884c\u5206\u5272\uff0c\u622a\u53d6\u7684\u5de6\u4fa7\u5b57\u7b26\u4e32\u4f5c\u4e3a\u51fd\u6570\u540d\uff0c\u5728 skipif.py \u6587\u4ef6\u4e2d\u67e5\u627e\u662f\u5426\u6709\u540c\u540d\u51fd\u6570\uff0c\u5e76\u5c06\u622a\u53d6\u7684\u53f3\u4fa7\u4f5c\u4e3a\u53c2\u6570\u4f20\u9012\u7ed9\u8be5\u51fd\u6570\uff0c\u901a\u8fc7\u83b7\u53d6\u8be5\u51fd\u6570\u8fd4\u56de\u7684\u5e03\u5c14\u503c\uff0c\u8fd4\u56de True\uff0c\u5219\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u8fd4\u56de False\uff0c\u5219\u6267\u884c\u8be5\u7528\u4f8b\u3002 \u82e5\u51fd\u6570\u9700\u8981\u591a\u4e2a\u53c2\u6570\uff0c\u53ef\u81ea\u5b9a\u4e49\u591a\u4e2a\u53c2\u6570\u4e4b\u95f4\u7684\u8fde\u63a5\u7b26\uff0c\u8fde\u63a5\u7b26\u53f7\u4e0d\u53ef\u4f7f\u7528\u4e0b\u5212\u7ebf\u548c\u9017\u53f7\uff0c\u63a8\u8350\u7edf\u4e00\u4f7f\u7528 & \u7b26\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32","title":"3.2\u3001\u786e\u8ba4\u4fee\u590d","text":"\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7528\u4f8b\u4fee\u590d\u540e\uff0c\u4f46\u4e0d\u80fd\u7acb\u5373\u5220\u9664\u8df3\u8fc7\u539f\u56e0\uff08skip-XXX\uff09\u7684\u7528\u4f8b\uff0c\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u786e\u8ba4\u4fee\u590d\u201d\uff0c\u4f5c\u4e3a\u6807\u8bb0\u8be5\u7528\u4f8b\u662f\u5426\u5df2\u7ecf\u4fee\u590d\uff0c\u56fa\u5b9a\u586b\u5165\u5b57\u6bb5\u4e3a \u201cfixed-\u5df2\u4fee\u590d\u201d\u3002\u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u5373\u4f7f\u540c\u65f6\u6807\u8bb0\u4e86 skip-XXX \u4e5f\u4f1a\u6b63\u5e38\u6267\u884c\u3002 \u793a\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d \u3010\u540c\u65f6\u6807\u8bb0\u4e86skip \u548c fixed\uff0c\u4f46\u4ecd\u7136\u60f3\u8981\u8df3\u8fc7\u7528\u4f8b\u3011 \u5f53 \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u540c\u65f6\u586b\u5165\u540e\uff0c\u547d\u4ee4\u884c\u4f20\u9012\u53c2\u6570 --ifixed yes\uff0c\u5219\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\u8be5\u6761\u7528\u4f8b\u3002 python3 manage.py run --ifixed yes\n \u770b\u5230\u8fd9\u91cc\u6709\u4e9b\u540c\u5b66\u53ef\u80fd\u8981\u95ee\u4e86\uff0c\u6211\u60f3\u6062\u590d\u8df3\u8fc7\u6267\u884c\uff0c\u76f4\u63a5\u628a skip-XXX \u8fd9\u4e00\u5217\u6807\u7b7e\u5220\u6389\u4e0d\u5c31\u597d\u4e86\uff0c\u8fd8\u641e\u4ec0\u4e48\u786e\u8ba4\u4fee\u590d\u5e72\u5565\uff1f \u8fd9\u91cc\u7ed9\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u89e3\u91ca\u4e00\u4e0b\uff1a \uff08\u4ee5\u4e0b\u6d41\u6c34\u7ebf\u6307\u7684\u662f\u6bcf\u65e5\u6784\u5efa\u7684\u6d41\u6c34\u7ebf\uff0c\u8dd1 AT \u7684\u5168\u91cf\u7528\u4f8b\uff09 \u9996\u5148\uff0c\u6d41\u6c34\u7ebf\u4e0a\u8dd1\u7684\u662f AT \u5386\u53f2 Tag\uff0c\u8df3\u8fc7\u7528\u4f8b\u7684\u6807\u7b7e(skip-XXX) \u662f\u5728\u6700\u65b0\u7684\u4ee3\u7801\u4e0a\u63d0\u4ea4\u7684\uff0c\u6211\u4eec\u91c7\u7528\u6700\u65b0\u7684 csv \u6587\u4ef6\u8986\u76d6\u5386\u53f2 csv \u6587\u4ef6\u7684\u8bbe\u8ba1\u6765\u5b9e\u73b0\u4e86\u5bf9\u5386\u53f2 Tag \u4e0a\u7528\u4f8b\u7684\u8df3\u8fc7\uff1b \u7136\u540e\uff0c\u5728\u65e5\u5e38\u8df3\u8fc7\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u540c\u65f6\u4e5f\u5728\u4fee\u590d\u4e00\u4e9b\u7528\u4f8b\uff0c\u4fee\u590d\u540e\u7684\u8fd9\u4e9b\u7528\u4f8b\u5728\u672c\u5730\u8c03\u8bd5\u7684\u65f6\u5019\u6211\u4eec\u4e0d\u5e0c\u671b\u7ee7\u7eed\u8df3\u8fc7\uff0c\u4f46\u662f\u6b64\u65f6\uff0c\u4fee\u590d\u7684\u8fd9\u4e9b\u7528\u4f8b\u53ef\u80fd\u8fd8\u4e0d\u7a33\u5b9a\uff0c\u4e0d\u9002\u5408\u9a6c\u4e0a\u653e\u5230\u6d41\u6c34\u7ebf\u53bb\u8dd1\uff0c\u4e5f\u5c31\u662f\u8bf4\u6d41\u6c34\u7ebf\u4e0a\u6211\u4eec\u662f\u5e0c\u671b\u4ed6\u7ee7\u7eed\u8df3\u8fc7\u7684\uff0c\u56e0\u6b64\uff0c\u54b1\u4e0d\u80fd\u76f4\u63a5\u628a skip-XXX \u5e72\u6389\uff1b \u8fd9\u91cc\u5c31\u77db\u76fe\u4e86\uff0c\u4e00\u4e2a\u9700\u6c42\u662f\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u53e6\u4e00\u4e2a\u9700\u6c42\u53c8\u4e0d\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u600e\u4e48\u529e\u5462\uff1f \u6211\u4eec\u4f7f\u7528\u201c\u786e\u8ba4\u4fee\u590d\u201d\u6765\u6807\u8bb0\u8fd9\u6761\u7528\u4f8b\u5df2\u7ecf\u4fee\u590d\u4e86\uff0c\u8fd9\u6837\u4f60\u672c\u5730\u8c03\u8bd5\u7528\u4f8b\u7684\u65f6\u5019\u8fd9\u6761\u5df2\u4fee\u590d\u7684\u7528\u4f8b\u662f\u4f1a\u6267\u884c\u7684\uff0c\u540c\u65f6\u5728\u6d41\u6c34\u7ebf\u4e0a\u5c06 --ifixed yes \u53c2\u6570\u52a0\u4e0a\uff0c\u90a3\u4e48\u6d41\u6c34\u7ebf\u4e0a\u6267\u884c\u65f6\u8fd9\u6761\u7528\u4f8b\u4ecd\u7136\u662f\u8df3\u8fc7\u7684\u72b6\u6001\uff0c\u540e\u7eed\u4f60\u6253 Tag \u7684\u65f6\u5019\uff0c\u628a \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u7684\u6807\u7b7e\u5168\u90e8\u5220\u6389\u5c31\u53ef\u4ee5\u4e86\u3002 \u8fd9\u5c31\u662f\u201c\u786e\u8ba4\u4fee\u590d\u201d\u8fd9\u4e2a\u6807\u7b7e\u7684\u80cc\u666f\uff0c\u9700\u8981\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u54c1\u4e00\u54c1\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#33","title":"3.3\u3001\u5e9f\u5f03\u7528\u4f8b","text":"\u9488\u5bf9\u67d0\u4e9b\u7528\u4f8b\uff0c\u7531\u4e8e\u9700\u6c42\u53d8\u66f4\uff0c\u73af\u5883\u5f71\u54cd\u6216\u8bc4\u4f30\u4e0d\u518d\u9002\u7528\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u65f6\uff0c\u7528\u4f8b\u9700\u8981\u5e9f\u5f03\uff0c\u5219\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u5e9f\u5f03\u7528\u4f8b\u201d\uff0c\u8be5\u5217\u5b58\u5728 \u201cremoved-{\u5e9f\u5f03\u539f\u56e0}\u201d\uff0c\u5219\u7528\u4f8b\u4e0d\u4f1a\u6267\u884c\u3002 \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d removed-\u5df2\u5e9f\u5f03 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_2","title":"4\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u4e0a\u9762\u4ecb\u7ecd Pytest \u6846\u67b6\u63d0\u4f9b\u7684\u6807\u7b7e\u529f\u80fd mark\uff0c\u4f7f\u7528\u65f6\u9700\u8981\u4e3a\u6bcf\u4e00\u4e2a\u7528\u4f8b\u6dfb\u52a0\u6807\u7b7e\u88c5\u9970\u5668\uff0c\u5219\u64cd\u4f5c\u590d\u6742\uff0c\u53ef\u7ef4\u62a4\u6027\u5dee\uff0c\u5176\u6839\u672c\u95ee\u9898\u5c31\u662f\u6807\u7b7e\u5206\u6563\u5728\u6bcf\u4e00\u6761\u7528\u4f8b\u7684\u88c5\u9970\u5668\u4e0a\uff0c\u96be\u4ee5\u96c6\u4e2d\u7ef4\u62a4\uff1b\u4e8e\u662f\u4e4e\u5c06\u6240\u6709\u6807\u7b7e\u4f7f\u7528 csv \u6587\u4ef6\u8fdb\u884c\u96c6\u4e2d\u7ba1\u7406\uff0c\u5e76\u901a\u8fc7 Pytest \u7684\u94a9\u5b50\u51fd\u6570\uff0c\u8bfb\u53d6 csv \u6587\u4ef6\uff0c\u52a8\u6001\u6dfb\u52a0\u6807\u7b7e\u5230\u7528\u4e2d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5csv","title":"5\u3001CSV\u6587\u4ef6\u683c\u5f0f","text":"\u6b64\u914d\u7f6e\u6587\u4ef6\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u6807\u7b7e\u6570\u636e\uff0c\u4e14\u8981\u65b9\u4fbf\u80fd\u4f7f\u7528Excel\u6253\u5f00\u8fdb\u884c\u7f16\u8f91\u67e5\u770b\uff0c\u66f4\u91cd\u8981\u7684\u662f\u6211\u4eec\u4e0d\u60f3\u5f15\u5165\u4e09\u65b9\u4f9d\u8d56\uff0cCSV \u6587\u4ef6\u51e0\u4e4e\u662f\u552f\u4e00\u80fd\u6ee1\u8db3\u6240\u6709\u7684\u8981\u6c42\u7684\u6587\u4ef6\u683c\u5f0f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_6","title":"\u4e03\u3001\u65e5\u5fd7\u7cfb\u7edf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_5","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e YouQu \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u64cd\u4f5c\u65b9\u6cd5\u5c01\u88c5\u5199\u6cd5\uff0c\u901a\u5e38\u662f\u8fd9\u6837\u7684\uff1a\u7c7b\u91cc\u9762\u4e00\u4e2a\u51fd\u6570\u53ea\u5305\u542b\u4e00\u4e2a\u64cd\u4f5c\u6216\u591a\u6b21\u8c03\u7528\u7684\u4e00\u7cfb\u5217\u53ef\u5408\u5e76\u7684\u64cd\u4f5c\uff1b \u4f20\u7edf\u7684\u65e5\u5fd7\u8f93\u51fa\u65b9\u5f0f\uff0c\u9700\u8981\u5728\u6bcf\u4e2a\u51fd\u6570\u91cc\u9762\u4e3b\u52a8\u7f16\u5199\u65e5\u5fd7\u8f93\u51fa\u4ee3\u7801 \uff0c\u4f8b\u5982\uff1a class XXXWidget:\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\nlogger.info(\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\")\n...\n# \u7701\u7565\u4ee3\u7801\u90e8\u5206\n \u4e00\u4e2a\u51fd\u6570\u91cc\u9762\u81f3\u5c11\u5305\u542b\u4e00\u6761\u65e5\u5fd7\u4fe1\u606f\uff0c\u5982\u679c\u6bd4\u8f83\u590d\u6742\u64cd\u4f5c\u6b65\u9aa4\uff0c\u53ef\u80fd\u5305\u542b\u591a\u6761\u65e5\u5fd7\u4fe1\u606f\uff1b \u4e00\u4e2a\u5e94\u7528\u542b\u6709\u5927\u91cf\u7684\u64cd\u4f5c\u51fd\u6570\uff0c\u4e5f\u5c31\u662f\u8bf4\u6211\u4eec\u9700\u8981\u5199\u5927\u91cf\u7684\u65e5\u5fd7\u4ee3\u7801\uff1b \u901a\u8fc7\u7ecf\u9a8c\u89c2\u5bdf\uff0c\u6211\u4eec\u53d1\u73b0\uff0c\u51fd\u6570\u8bf4\u660e\u4ee5\u53ca\u51fd\u6570\u64cd\u4f5c\u65e5\u5fd7\uff0c\u5177\u6709\u8f83\u9ad8\u7684\u91cd\u590d\u5ea6\uff08\u4ece\u4e0a\u9762\u7684\u4f8b\u5b50\u4e5f\u53ef\u4ee5\u770b\u51fa\u6765\uff09\uff0c\u56e0\u6b64\u6211\u4eec\u5927\u80c6\u7684\u8bbe\u60f3\uff0c\u80fd\u4e0d\u80fd\u57fa\u4e8e\u6846\u67b6\u6267\u884c\u65f6\uff0c\u81ea\u52a8\u7684\u5c06\u51fd\u6570\u8bf4\u660e\u4f5c\u4e3a\u65e5\u5fd7\u6253\u5370\u51fa\u6765\uff0c\u4ece\u800c\u51cf\u5c11\u5927\u91cf\u65e5\u5fd7\u4ee3\u7801\u91cf\u548c\u91cd\u590d\u7f16\u5199\uff0c\u90a3\u771f\u662f\u5999\u554a~\u3002 \u57fa\u4e8e\u6b64\u201c\u5929\u771f\u201d\u7684\u60f3\u6cd5\uff0c\u6211\u4eec\u8bbe\u8ba1\u51fa\u4e86 youqu \u7684\u65e5\u5fd7\u7cfb\u7edf\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_5","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u6838\u5fc3\u539f\u7406\uff1a \u901a\u8fc7\u7ed9\u7c7b\u52a0\u4e0a\u4e00\u4e2a\u88c5\u9970\u5668 @log\uff0c\u52a8\u6001\u7ed9\u8be5\u7c7b\u4e0b\u6240\u6709\u7684\u51fd\u6570\u53ca\u7236\u7c7b\u51fd\u6570\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668 @_trace\uff0c\u5728\u6b64\u88c5\u9970\u5668\u4e2d\u6211\u4eec\u80fd\u52a8\u6001\u7684\u6355\u83b7\u6240\u8c03\u7528\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff08func.__doc__\uff09\uff0c\u901a\u8fc7\u65e5\u5fd7\u8f93\u51fa\u5668\u5c06\u5176\u8f93\u51fa\u5373\u53ef\u3002 \u5b9e\u73b0\u6b65\u9aa4\uff1a \u901a\u8fc7 inspect.getmembers \u83b7\u53d6\u88ab\u88c5\u9970\u7684\u7c7b\u4e0b\u6240\u6709\u51fd\u6570\uff0c\u5305\u542b\u9759\u6001\u65b9\u6cd5\uff0c\u7c7b\u65b9\u6cd5\uff0c\u5b9e\u4f8b\u65b9\u6cd5\uff1b \u901a\u8fc7 setattr(\u7c7b, \u65b9\u6cd5, _trace\uff09 \u7684\u65b9\u5f0f\uff0c\u7ed9\u7b26\u5408\u6761\u4ef6\u7684\u51fd\u6570\uff0c\u52a8\u6001\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_3","title":"3\u3001\u65e5\u5fd7\u914d\u7f6e","text":"[log_cli]\n;\u65e5\u5fd7\u76f8\u5173\u914d\u7f6e\uff08\u4e0d\u6253\u5370\u6784\u9020\u51fd\u6570\u548c\u9b54\u6cd5\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff09\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = INFO\n# ============= \u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u914d\u7f6e ================\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u5f00\u5934\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7, \u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_STARTSWITH = Assert\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u7ed3\u5c3e\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_ENDSWITH = Widget\n;\u652f\u6301\u7c7b\u540d\u5305\u542b xxx \u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_CONTAIN = ShortCut\n# ==============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_3","title":"4\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u5728\u5e94\u7528\u5e93 widget \u65b9\u6cd5\u5e93\u91cc\u9762\uff0c\u53ea\u9700\u8981\u5728\u51fa\u53e3\u6587\u4ef6\u52a0\u4e0a\u7c7b\u88c5\u9970\u5668\uff0c\u5c31\u53ef\u4ee5\u5b9e\u73b0\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u4e86\uff1b # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6ce8\u610f\uff0c\u662f\u7c7b\u88c5\u9970\u5668\u3002 \u5b9e\u4f8b\uff1a # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\n@classmethod\ndef find_dfm_image(cls, *elements, multiple=False, rate=0.9):\n\"\"\"\n \u67e5\u627e\u56fe\u7247 {{elements}}.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e {{rate}} \u7684\u5750\u6807\n :param elements:\n :param multiple:\n :return:\n \"\"\"\nelement = tuple(map(lambda x: f\"{Config.PIC_RES_PATH}/{x}\", elements))\nreturn cls.find_image(*element, multiple=multiple)\n \u8c03\u7528\u65b9\u6cd5\u65f6\uff1a DfmWidget.find_dfm_image(\"dfm_001\")\n \u81ea\u52a8\u8f93\u51fa\u7684\u65e5\u5fd7\uff1a >> x86_64-uos-6: 02/28 17:48:47 | INFO | logger_utils: [find_dfm_image]: \u67e5\u627e\u56fe\u7247 dfm_001.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e 0.9 \u7684\u5750\u6807\n \u52a0\u4e0a\u88c5\u9970\u5668 @log \u4e4b\u540e\uff0c\u65b9\u6cd5\u5c42\u6240\u6709\u7684\u51fd\u6570\uff08\u5305\u62ec\u5b9e\u4f8b\u65b9\u6cd5\u3001\u7c7b\u65b9\u6cd5\u3001\u9759\u6001\u65b9\u6cd5\uff09\u90fd\u4e0d\u9700\u8981\u518d\u5199\u65e5\u5fd7\u4ee3\u7801\uff0c\u6267\u884c\u7684\u65f6\u5019\u4f1a\u81ea\u52a8\u8f93\u51fa\uff0c\u5e76\u4e14\u6240\u6709\u8c03\u7528\u7684\u65b9\u6cd5\u4f1a\u4ee5 allure.step \u7684\u65b9\u5f0f\uff0c\u5c55\u793a\u5728 allure \u62a5\u544a\u4e2d\uff0c\u5728\u62a5\u544a\u4e2d\u66f4\u80fd\u4e00\u76ee\u4e86\u7136\u7684\u770b\u5230\u7528\u4f8b\u6267\u884c\u6b65\u9aa4\u3002 \u3010\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\u3011 \u901a\u8fc7\u89c2\u5bdf\u524d\u9762\u7684\u4f8b\u5b50\uff0c\u7ec6\u5fc3\u7684\u540c\u5b66\u53ef\u80fd\u8fd8\u53d1\u73b0\u4e86\u4e00\u4e2a\u5c0f\u7ec6\u8282\uff1a\u51fd\u6570\u529f\u80fd\u8bf4\u660e\u4e2d\uff0c\u4e24\u5bf9\u5927\u62ec\u53f7\u4e2d\u7684\u5185\u5bb9 {{elements}} \u4f5c\u4e3a\u53d8\u91cf\u8f93\u51fa\u51fa\u6765\u4e86\uff1b \u6ca1\u9519\uff0c\u8fd9\u5c31\u662f\u6211\u4eec\u53c2\u8003Django \u548c jinja2 \u7684\u6a21\u677f\u8bed\u6cd5\u8bbe\u8ba1\u51fa\u7684\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\uff0c\u4f7f\u7528\u65b9\u6cd5\u5f88\u7b80\u5355\uff0c\u7528\u4e24\u5bf9\u5927\u62ec\u53f7\u628a\u51fd\u6570\u7684\u53c2\u6570\u62ec\u8d77\u6765\uff0c\u8fd9\u6837\u5728\u65e5\u5fd7\u8f93\u51fa\u7684\u65f6\u5019\u5c31\u80fd\u628a\u8c03\u7528\u51fd\u6570\u65f6\u53c2\u6570\u7684\u503c\u8f93\u51fa\u51fa\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_7","title":"\u516b\u3001\u73af\u5883\u90e8\u7f72","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_6","title":"1\u3001\u539f\u5219","text":"YouQu \u7684\u73af\u5883\u4f9d\u8d56\u4e00\u76f4\u575a\u6301 2 \u4e2a\u539f\u5219\uff1a \u6700\u5c0f\u73af\u5883\u4f9d\u8d56\u539f\u5219 \u6709\u4e9b\u540c\u5b66\u5199\u4e00\u4e9b\u529f\u80fd\uff0c\u9996\u5148\u60f3\u5230\u7684\u5c31\u662f\u53bb\u641c\u7d22\u5f15\u64ce\u641c\u4e00\u4e0b\uff0c\u770b\u6709\u6ca1\u6709\u73b0\u6210\u7684\u5de5\u5177\u6216\u8005\u4ee3\u7801\u76f4\u63a5\u80fd\u7528\uff0c\u7f8e\u5176\u540d\u66f0\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\uff0c\u522b\u4eba\u5df2\u7ecf\u9020\u597d\u4e86\u8f6e\u5b50\u54b1\u4eec\u5c31\u4e0d\u8981\u91cd\u590d\u53bb\u9020\u4e86\uff0c\u7136\u540e\u4e00\u5207\u4f3c\u4e4e\u90fd\u53d8\u5f97\u90a3\u4e48\u7684\u7406\u6240\u5e94\u5f53\u3002 \u5f53\u7136\u8fd9\u6837\u505a\u65e0\u53ef\u539a\u975e\uff0c\u6211\u76f8\u4fe1\u6709\u8fd9\u6837\u60f3\u6cd5\u5e76\u4e14\u4e00\u76f4\u8df5\u884c\u8fd9\u6837\u505a\u6cd5\u7684\u540c\u5b66\u4e0d\u5728\u5c11\u6570\uff0c\u4f46\u8fd9\u6837\u505a\u6709\u4e00\u4e2a\u5f88\u4e25\u91cd\u7684\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f60\u5199\u4e00\u4e2a\u5927\u578b\u9879\u76ee\u65f6\uff0c\u4f60\u4f1a\u5f15\u5165\u975e\u5e38\u975e\u5e38\u975e\u5e38\u591a\u7684\u4f9d\u8d56\uff0c\u6bd4\u5982\u8981\u505a\u4e2a\u63a5\u53e3\u8bf7\u6c42\u8981\u7528 requests\u3001\u8bfb\u5199\u4e2a\u6570\u636e\u7528 pandas\u3001\u5199\u4e2a\u8868\u683c\u7528 pyopenxl\u3001\u89e3\u6790\u4e2a\u6587\u672c\u8981\u7528\u8fd9\u4e2a\u90a3\u4e2a\u4e09\u65b9\u5e93 ... \u3002 \u6211\u8ba4\u4e3a\u8fd9\u662f\u975e\u5e38\u4e0d\u597d\u7684\u4e60\u60ef\uff0c\u5728\u5b9e\u73b0\u4e00\u4e2a\u529f\u80fd\u7684\u65f6\u5019\uff0c\u9996\u5148\u6211\u4eec\u5e94\u8be5\u53bb\u60f3\u81ea\u5df1\u600e\u4e48\u6837\u53bb\u5b9e\u73b0\uff0c\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff1b \u5982\u679c\u4f60\u4e0d\u4f1a\uff0c\u4f60\u53ef\u4ee5\u53bb\u5b66\u4e60\u4e09\u65b9\u5e93\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u522b\u4eba\u4e09\u65b9\u5e93\u4e5f\u662f\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\u7684\uff0c\u4e3a\u4ec0\u4e48\u54b1\u4eec\u4e0d\u884c\u5462\uff1b\u5982\u679c\u522b\u4eba\u7684\u4f60\u5b9e\u5728\u662f\u770b\u4e0d\u61c2\uff0c\u60f3\u5c3d\u4e00\u5207\u529e\u6cd5\u786e\u5b9e\u505a\u4e0d\u51fa\u6765\uff0c\u90a3\u518d\u8003\u8651\u5f15\u5165\u8fd9\u4e2a\u4e09\u65b9\u5e93\uff0c\u6211\u8ba4\u4e3a\u8fd9\u6837\u662f\u6ca1\u95ee\u9898\u7684\uff0c\u6bd5\u7adf\u54b1\u4eec\u6bb5\u4f4d\u8fd8\u4e0d\u591f\uff0c\u4f46\u5e0c\u671b\u5c06\u6765\u6709\u4e00\u5929\u6211\u4eec\u53ef\u4ee5\u3002 \u8fd9\u6837\u7684\u505a\u6cd5\u624d\u5e94\u8be5\u662f\u201c\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\u201d\u6b63\u786e\u7684\u64cd\u4f5c\u3002\u4e0d\u4f1a\u6ca1\u5173\u7cfb\uff0c\u770b\u770b\u522b\u4eba\u662f\u600e\u4e48\u5b9e\u73b0\u7684\uff0c\u81ea\u5df1\u518d\u6478\u7d22\u7740\u5199\u51fa\u6765\uff0c\u8fd9\u6837\u81ea\u5df1\u624d\u80fd\u6709\u6240\u63d0\u9ad8\uff0c\u4e0d\u7136\u4f60\u5c31\u53ea\u4f1a\u7528\u522b\u4eba\u7684\u4e1c\u897f\uff1b\u90a3\u4e9b\u5632\u7b11\u3001\u6279\u8bc4\u6211\u4eec\u91cd\u590d\u9020\u8f6e\u5b50\u7684\u4eba\uff0c\u5148\u60f3\u60f3\u81ea\u5df1\u4f1a\u9020\u8f6e\u5b50\u5417\u3002 \u672c\u7740\u81ea\u5df1\u5b9e\u73b0\u80fd\u5b9e\u73b0\u7684\u4e00\u5207\u7684\u539f\u5219\uff0cYouQu \u6846\u67b6\u505a\u5230\u4e86\u975e\u5e38\u5c11\u7684\u73af\u5883\u4f9d\u8d56\uff0c\u800c\u4e14\u6211\u4eec\u4ecd\u5728\u4e0d\u65ad\u52aa\u529b\uff0c\u51cf\u5c11\u73af\u5883\u90e8\u7f72\u7684\u4f9d\u8d56\u3002 \u6700\u5c0f\u4ed3\u5e93\u4f53\u79ef\u539f\u5219 \u5927\u6587\u4ef6\u4e0d\u80fd\u4e0a\u4f20\u5230\u5de5\u7a0b\u91cc\u9762\uff0c\u4fdd\u6301\u6574\u4e2a\u5de5\u7a0b\u7684\u8f7b\u91cf\u5316\uff0c\u8fd9\u6837\u5728\u514b\u9686\u4ee3\u7801\u7684\u65f6\u5019\u624d\u80fd\u975e\u5e38\u5feb\u901f\u65b9\u4fbf\u4f7f\u7528\uff0c\u6211\u4eec\u89c1\u8fc7\u4e00\u4e2a AT \u5de5\u7a0b clone \u5927\u5c0f\u8fbe\u5230\u597d\u51e0\u4e2a G\uff0c\u7b80\u76f4\u4e0d\u53ef\u601d\u8bae\u3002 \u5176\u5b9e\u4ee3\u7801\u6587\u4ef6\u7684\u5927\u5c0f\u662f\u5f88\u5c0f\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u7eaf\u5199\u4ee3\u7801\u968f\u4fbf\u5199\u5de5\u7a0b\u4e5f\u4e0d\u4f1a\u592a\u5927\uff0c\u800c\u6587\u6863\uff08\u5305\u542b\u63d2\u56fe\uff09\u7b49\u8d44\u6e90\u5374\u662f\u5f88\u5360\u7a7a\u95f4\u3002 \u56e0\u6b64\u6211\u4eec\u9009\u62e9\u5c06 YouQu \u7684\u6587\u6863\u5de5\u7a0b\u5355\u72ec\u8fc1\u51fa\u5230\u72ec\u7acb\u7684\u4ed3\u5e93 youqu-docs \u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_6","title":"2\u3001\u5b89\u88c5","text":"\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u8fd0\u884c env.sh \u5373\u53ef\u3002 bash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_4","title":"3\u3001\u5b9a\u5236\u4f9d\u8d56","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_2","title":"3.1\u3001\u65b0\u589e\u4f9d\u8d56","text":"\u5982\u679c\u5e94\u7528\u5e93\u8fd8\u9700\u8981\u5176\u4ed6 Python \u4f9d\u8d56\u5e93\uff0c\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a requirement.txt \u6587\u4ef6\uff1b autotest_xxx\n\u251c\u2500\u2500 requirement.txt\n\u251c\u2500\u2500 case ...\n \u91cc\u9762\u5199\u5165\u9700\u8981\u5b89\u88c5\u7684\u4e09\u65b9\u4f9d\u8d56\uff0c\u6bd4\u5982\u50cf\u8fd9\u6837\uff1a # requirement.txt\nPyYAML==6.0 # \u6307\u5b9a\u5b89\u88c5\u67d0\u4e2a\u7248\u672c\nrequests # \u672a\u6307\u5b9a\u7248\u672c\u5219\u5b89\u88c5\u6700\u65b0\u7248\n \u5728\u6267\u884c bash env.sh \u65f6\u4f1a\u4e00\u5e76\u5c06\u5176\u5b89\u88c5\u3002 \u5982\u679c\u591a\u4e2a\u5e94\u7528\u5e93\u90fd\u5b58\u5728 requirement.txt \u6587\u4ef6\uff0c\u6267\u884c env.sh \u65f6\u4f1a\u5c06\u591a\u4e2a requirement.txt \u6587\u4ef6\u4e00\u5e76\u52a0\u8f7d\uff1b\u90a3\u4e48\u4e00\u5b9a\u8981\u6ce8\u610f\u591a\u4e2a requirement.txt \u6587\u4ef6\u53ef\u80fd\u5b58\u5728\u76f8\u540c\u7684\u4f9d\u8d56\u88ab\u6307\u5b9a\u5b89\u88c5\u4e0d\u540c\u7248\u672c\u7b49\u7b49\u517c\u5bb9\u6027\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32_1","title":"3.2\u3001\u88c1\u526a\u4f9d\u8d56","text":"\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0c\u53ef\u80fd\u4f60\u53ea\u9700\u8981\u5b89\u88c5\u4e00\u4e9b\u6700\u6700\u57fa\u7840\u7684\u4f9d\u8d56\uff0c\u5176\u4ed6\u7684\u90fd\u4e0d\u9700\u8981\uff0c\u6bd4\u5982\u7eaf\u63a5\u53e3\u81ea\u52a8\u5316\u7684\u9879\u76ee\uff0c\u5b83\u4e0d\u9700\u8981 UI \u81ea\u52a8\u5316\u76f8\u5173\u7684\u4f9d\u8d56\u3002 \u4f60\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\uff0c\u5b58\u653e\u4e00\u4e2a BASICENV \u7684\u666e\u901a\u6587\u4ef6\uff0c\u91cc\u9762\u4e0d\u9700\u8981\u5199\u4efb\u4f55\u5185\u5bb9\uff0c\u8fd9\u6837\u6267\u884c env.sh \u65f6\uff0c\u53ea\u4f1a\u5b89\u88c5\u6700\u57fa\u7840\u7684\u4f9d\u8d56\u3002 autotest_xxx\n\u251c\u2500\u2500 BASICENV # \u53ef\u4ee5\u4f7f\u7528\uff1atouch BASICENV \u521b\u5efa\u6587\u4ef6\n\u251c\u2500\u2500 case ...\n \u57fa\u7840\u4f9d\u8d56\u4ec5\u5b89\u88c5\u4ee5\u4e0b\u51e0\u4e2a\u5305\uff1a pytest # pytest\npytest-rerunfailures # \u5931\u8d25\u91cd\u8dd1\u63d2\u4ef6\npytest-timeout # \u7528\u4f8b\u8d85\u65f6\u63d2\u4ef6\nallure-pytest # \u751f\u6210 allure \u62a5\u544a\u63d2\u4ef6\nallure.deb # allure \u62a5\u544a\u67e5\u770b\u5de5\u5177\n \u88c1\u526a\u4f9d\u8d56 \u548c \u65b0\u589e\u4f9d\u8d56 \u662f\u4e0d\u51b2\u7a81\u7684\uff0c\u53ef\u4ee5\u540c\u65f6\u4f7f\u7528\u3002 \u6b64\u65b9\u6848\u9ed8\u8ba4\u4e3a\u865a\u62df\u73af\u5883\u90e8\u7f72\uff0c\u5982\u679c\u4f60\u60f3\u76f4\u63a5\u90e8\u7f72\u5728\u672c\u673a\u4e0a\uff1a bash env_dev.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_8","title":"\u4e5d\u3001\u5931\u8d25\u5f55\u5c4f","text":"\u5f55\u5c4f\u5176\u5b9e\u662f\u4e00\u79cd\u89c6\u9891\u5f62\u5f0f\u7684\u65e5\u5fd7\uff0c\u56e0\u4e3a\u5f88\u591a\u65f6\u5019\u6211\u4eec\u5728\u67e5\u770b\u65e5\u5fd7\u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u51c6\u786e\u7684\u5b9a\u4f4d\u5230\u7528\u4f8b\u5931\u8d25\u7684\u5177\u4f53\u539f\u56e0\uff0c\u56e0\u6b64\u7528\u4f8b\u7684\u5f55\u5c4f\u80fd\u8ba9\u6211\u4eec\u770b\u5230\u7528\u4f8b\u5728\u6267\u884c\u8fc7\u7a0b\uff1b \u3010\u4f7f\u7528\u65b9\u6cd5\u3011 \u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u5173\u6ce8 2 \u4e2a\u53c2\u6570\uff1b ;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\u3002\n;\u6ce8\u610f\uff0c\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u4e0d\u80fd\u5c0f\u4e8e\u5931\u8d25\u5f55\u5c4f\u6b21\u6570\uff0c\u5373 RERUN >= RECORD_FAILED_CASE\nRECORD_FAILED_CASE = 1\n \u9ed8\u8ba4\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u662f 1 \u6b21\uff1b RECORD_FAILED_CASE = 1 \u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff1b RECORD_FAILED_CASE = 0 \u8868\u793a\u4e0d\u7ba1\u7528\u4f8b\u6210\u529f\u6216\u5931\u8d25\u90fd\u5f55\u5c4f\uff1b \u5f55\u5c4f\u662f\u8981\u5360\u7528\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u7279\u522b\u662f\u5728\u4e00\u4e9b\u914d\u7f6e\u8f83\u4f4e\u7684\u673a\u5668\u4e0a\u4f1a\u5f88\u660e\u663e\uff0c\u6240\u4ee5\u4f60\u9700\u8981\u8003\u8651\u662f\u5426\u6709\u5fc5\u8981\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1b \u4f7f\u7528 manage.py \u6267\u884c\u7528\u4f8b\u9ed8\u8ba4\u8bfb\u53d6\u5230 globalconfig.ini \u91cc\u9762\u7684\u53c2\u6570\uff0c\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report/record \u76ee\u5f55\u4e0b\u4fdd\u5b58\u5931\u8d25\u7528\u4f8b\u7684\u5f55\u5c4f\u548c\u65ad\u8a00\u7684\u90a3\u4e2a\u65f6\u95f4\u70b9\u7684\u622a\u5c4f\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7\u89c6\u9891\u6587\u4ef6\u770b\u5230\u5931\u8d25\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u90fd\u53d1\u751f\u4e86\u4ec0\u4e48\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#wayland","title":"\u5341\u3001Wayland \u9002\u914d","text":"Wayland \u4e0b\u81ea\u52a8\u5316\u4e3b\u8981\u95ee\u9898\u662f X11 \u4e0b\u7684\u952e\u9f20\u64cd\u4f5c\u65b9\u6cd5\u65e0\u6cd5\u4f7f\u7528\uff0c\u6bd4\u5982 Xdotool\u3001 PyAutoGUI\u3001Xwininfo \u7b49\u7b49\uff1b YouQu \u5728 Wayland \u4e0b\u517c\u5bb9\u9002\u914d\uff0cenv.sh \u5728 Wayland \u4e0b\u6267\u884c\u65f6\u4f1a\u5b89\u88c5\u81ea\u7814\u7684\u952e\u9f20\u64cd\u4f5c\u670d\u52a1\uff08\u53ef\u80fd\u5b58\u5728\u4e00\u4e9b\u4f9d\u8d56\u62a5\u9519\uff0c\u6309\u7167\u6ce8\u91ca\u89e3\u51b3\u5373\u53ef\uff09\uff0c\u6846\u67b6\u6838\u5fc3\u5e93\u4e5f\u9488\u5bf9\u6027\u7684\u505a\u4e86\u9002\u914d\uff0c\u4e0a\u5c42\u7528\u4f8b\u5b8c\u5168\u4e0d\u7528\u5173\u5fc3\u673a\u5668\u662fWayland \u8fd8\u662f X11\uff0c\u6846\u67b6\u4f1a\u6839\u636e\u6267\u884c\u65f6\u72b6\u6001\u81ea\u52a8\u5224\u65ad\u8d70\u4e0d\u540c\u7684\u903b\u8f91\uff1b \u7b80\u5355\u8bb2\u5c31\u662f\uff0c\u5e94\u7528\u5e93\u53ea\u9700\u8981\u7ef4\u62a4\u4e00\u5957\u7528\u4f8b\u811a\u672c\u5373\u53ef\u3002 \u3010\u7528\u4f8b\u517c\u5bb9\u3011 \u56e0\u4e3a Wayland \u4e0b\u6709\u4e9b\u5e94\u7528\u7684\u754c\u9762\u663e\u793a\u548c\u529f\u80fd\u672c\u8eab\u5b58\u5728\u4e00\u4e9b\u5dee\u5f02\uff0c\u7528\u4f8b\u5c42\u53ef\u80fd\u9700\u8981\u5bf9\u8fd9\u90e8\u5206\u7528\u4f8b\u505a\u903b\u8f91\u5224\u65ad\uff0c\u4f7f\u7528\u5168\u5c40\u914d\u7f6e\u91cc\u9762\u7684\u5e38\u91cf\u8fdb\u884c\u903b\u8f91\u7f16\u5199\u5373\u53ef\uff1a from setting.globalconfig import GlobalConfig\n# GlobalConfig.IS_WAYLAND \u83b7\u53d6\u5230\u5f53\u524d\u7684\u663e\u793a\u670d\u52a1\u5668\uff08bool\uff09\n# \u5e94\u7528\u5e93 Config \u7ee7\u627f GlobalConfig\nif Config.IS_WAYLAND:\npass\nif Config.IS_X11:\npass\n \u6bd4\u5982\u7528\u4f8b\u91cc\u9762\u5982\u679c\u65ad\u8a00\u7684\u56fe\u7247\u4e0d\u540c\uff1a if Config.IS_WAYLAND:\nself.assert_image_exist(\"wayland_XXX\")\nelse:\nself.assert_image_exist(\"x11_XXX\")\n \u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u811a\u672c\u5728 Wayland \u548c X11 \u4e0b\u90fd\u53ef\u4ee5\u8dd1\uff0cso easy \u662f\u4e0d\u662f\uff1f\u5b8c\u5168\u6ca1\u5fc5\u8981\u4e13\u95e8\u62c9\u65b0\u5206\u652f\u8fdb\u884c Wayland \u9002\u914d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_9","title":"\u5341\u4e00\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_7","title":"1. \u76ee\u5f55\u7ed3\u6784","text":"\u6267\u884c\u65f6\u4f1a\u5728\u6839\u76ee\u5f55\u4e0b\u52a8\u6001\u751f\u6210 report \u76ee\u5f55\uff0c\u6240\u6709\u7684\u62a5\u544a\u76f8\u5173\u7684\u6587\u4ef6\u4f1a\u7edf\u4e00\u5b58\u653e\u5728\u91cc\u9762\uff0c\u793a\u4f8b\uff1a /report\n \u251c\u2500\u2500 allure # allure\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json\n \u251c\u2500\u2500 allure_html # \u751f\u6210\u7684html\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 index.html \u251c\u2500\u2500 allure_back # allure\u62a5\u544a\u5907\u4efd\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 20221108114823\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json\n \u251c\u2500\u2500 json # json\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 result_deepin-music_20221109134736_1081333.json\n \u251c\u2500\u2500 logs # \u65e5\u5fd7\u6587\u4ef6\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 2022-11-10_debug.log \u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-10_error.log\n \u251c\u2500\u2500 record # \u5f55\u5c4f\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-09\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 15\u65f614\u520609\u79d2_test_music_303_2_autotest.mp4\n \u2514\u2500\u2500 xml # xml\u62a5\u544a\n\u2514\u2500\u2500 autotest_deepin_music-20221109134736.xml\n \u9ed8\u8ba4\u60c5\u51b5\u4e0b\u540c\u65f6\u751f\u6210 html\u3001xml\u3001json\u4e09\u79cd\u5f62\u5f0f\u7684\u62a5\u544a\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_7","title":"2. \u5b9a\u5236\u62a5\u544a","text":"\u6211\u4eec\u5bf9 allure \u62a5\u544a\u8fdb\u884c\u4e86\u4e00\u7cfb\u5217\u7684\u5b9a\u5236\uff1a \u5b9a\u5236 logo\u3001title\u3001\u62a5\u544a\u9ed8\u8ba4\u8bed\u8a00\u4e3a\u4e2d\u6587\uff1b \u52a0\u5165\u4e86\u7528\u4f8b\u65ad\u8a00\u5931\u8d25\u65f6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u4ee5\u53ca\u6b64\u65f6\u56fe\u50cf\u5bf9\u6bd4\u7684\u6a21\u677f\u56fe\u7247\uff1b \u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\uff0c\u4f60\u53ef\u4ee5\u5728 html \u62a5\u544a\u4e2d\u76f4\u63a5\u770b\u5f55\u5236\u7684\u89c6\u9891\uff1b \u52a0\u5165\u4e86 IP \u5730\u5740\u3001\u7cfb\u7edf\u4fe1\u606f\u3001\u955c\u50cf\u7248\u672c\u7b49\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_5","title":"3. \u67e5\u770b\u62a5\u544a","text":" \u672c\u5730\u6267\u884c \u5728 report/allure \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u4e00\u5806\u6587\u672c\u6587\u4ef6\uff0c\u8fd9\u4e9b\u662f allure \u63d2\u4ef6\u751f\u6210\u7684\u62a5\u544a\u6e90\u6570\u636e\uff0c\u6211\u4eec\u5728 report/allure_html \u76ee\u5f55\u4e0b\u7ed9\u4f60\u751f\u6210\u4e86 html \u6587\u4ef6\uff0c\u4f46\u662f\u4f60\u4e0d\u80fd\u76f4\u63a5\u901a\u8fc7\u6d4f\u89c8\u5668\u6253\u5f00 index.html \u6587\u4ef6\uff0c\u56e0\u4e3a allure \u7684\u62a5\u544a\u90fd\u662f\u57fa\u4e8e\u5728\u7ebf\u7684\u670d\u52a1\uff0c\u4f60\u5e94\u8be5\u8fd9\u6837\u6253\u5f00\uff1a allure open report/allure_html\n \u4f7f\u7528 manage.py \u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u5728\u7ec8\u7aef\u7684\u6700\u540e\u4e00\u884c\uff0c\u6211\u4eec\u4f1a\u7ed9\u4f60\u8f93\u51fa\u6253\u5f00\u62a5\u544a\u7684\u547d\u4ee4\uff0c\u76f4\u63a5\u590d\u5236\u5b83\u5728\u7ec8\u7aef\u6267\u884c\u5c31\u53ef\u4ee5\u67e5\u770b\u4e86\uff0c\u50cf\u8fd9\u6837\uff1a \u7ec8\u7aef\u6267\u884c\u547d\u4ee4: allure open /tmp/youqu/report/allure_html \u67e5\u770b\u62a5\u544a \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 Pycharm \u91cc\u9762\u627e\u5230 index.html \u6587\u4ef6\uff0c\u7136\u540e\u53f3\u952e\u9009\u62e9\u6d4f\u89c8\u5668\u6253\u5f00\uff0c\u6216\u8005\u4f60\u53ef\u4ee5\u7528\u4e00\u4e2a http \u670d\u52a1\u6253\u5f00\u3002 \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 report/allure \u76ee\u5f55\u4e0b\u67e5\u770b\u62a5\u544a\uff1a allure serve report/allure\n \u8fdc\u7a0b\u6267\u884c \u8fdc\u7a0b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\uff0c\u4f1a\u5c06\u6240\u6709\u8fdc\u7a0b\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u62a5\u544a\u90fd\u6536\u96c6\u5230 report/allure \u76ee\u5f55\u4e0b\uff0c\u5206\u522b\u6309\u7167\u673a\u5668\u7684 IP \u7b49\u5efa\u4e86\u4e0d\u540c\u7684\u76ee\u5f55\uff0c\u4f60\u53ef\u4ee5\u5728\u8fd9\u4e9b\u76ee\u5f55\u91cc\u9762\u53bb\u67e5\u770b\u5bf9\u5e94\u7684\u6d4b\u8bd5\u62a5\u544a\uff0c\u67e5\u770b\u65b9\u6cd5\u548c\u524d\u9762\u672c\u5730\u6267\u884c\u67e5\u770b\u7684\u65b9\u6cd5\u4e00\u6837\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_10","title":"\u5341\u4e8c\u3001\u9759\u6001\u4ee3\u7801\u626b\u63cf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_8","title":"1. \u63d0\u524d\u89e3\u51b3\u4ee3\u7801\u95ee\u9898","text":"\u4e3a\u4e86\u5e2e\u52a9\u5f00\u53d1\u8005\u7edf\u4e00\u4ee3\u7801\u98ce\u683c\uff0cPython \u793e\u533a\u63d0\u51fa\u4e86 PEP8 \u4ee3\u7801\u7f16\u7801\u98ce\u683c\uff0cPython \u5b98\u65b9\u540c\u65f6\u63a8\u51fa\u4e86\u4e00\u4e2a\u68c0\u67e5\u4ee3\u7801\u98ce\u683c\u662f\u5426\u7b26\u5408 PEP8 \u7684\u5de5\u5177\uff0c\u540d\u5b57\u4e5f\u53eb PEP8\u3002 \u4f46\u662f\uff0cPycharm \u91cc\u9762\u7684 PEP8 \u63d2\u4ef6\u5b9e\u9645\u4e0a\u5e76\u4e0d\u80fd\u53d1\u73b0\u5f88\u591a\u4ee3\u7801\u95ee\u9898\uff0c\u8fd9\u4e9b\u95ee\u9898\u5e76\u4e0d\u4f1a\u5728\u8fd0\u884c\u65f6\u62a5\u9519\uff0c\u56e0\u4e3a\u4ece Python \u8bed\u8a00\u89d2\u5ea6\u5e76\u4e0d\u5173\u5fc3\u8fd9\u4e9b\u95ee\u9898\uff0c\u5728 Pycharm \u7f16\u8f91\u5668\u91cc\u9762\u4f7f\u7528\u5feb\u6377\u952e ctrl + alt + L\uff0c\u6709\u4e00\u70b9\u70b9\u683c\u5f0f\u5316\u7684\u6548\u679c\uff0c\u80fd\u89e3\u51b3\u4e00\u4e9b\u7a7a\u683c\u3001\u6362\u884c\u7b49\u5c0f\u95ee\u9898\u3002 \u8fd9\u91cc\u63a8\u8350\u4e00\u4e2a Python \u793e\u533a\u6d41\u884c\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff1a Black\uff0c\u53f7\u79f0\u4e0d\u59a5\u534f\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff0c\u5b83\u68c0\u6d4b\u5230\u4e0d\u7b26\u5408\u89c4\u8303\u7684\u4ee3\u7801\u98ce\u683c\u76f4\u63a5\u5c31\u5e2e\u4f60\u5168\u90e8\u683c\u5f0f\u5316\u597d\uff0c\u5c31\u662f\u8fd9\u4e48\u521a\uff01 \u5b89\u88c5\uff1a sudo pip3 install black \n \u4f7f\u7528\u65b9\u6cd5\uff1a black ${CheckPath}\n \u4f7f\u7528\u8fd9\u4e2a\u5de5\u5177\u683c\u5f0f\u5316\u4e4b\u540e\uff0c\u4ee3\u7801\u4f1a\u88ab\u81ea\u52a8\u8c03\u6574\uff0c\u521a\u5f00\u59cb\u4f60\u53ef\u80fd\u4f1a\u89c9\u5f97\u8c03\u6574\u5f97\u5f88\u5938\u5f20\uff0c\u6ca1\u5173\u7cfb\u575a\u6301\u770b\uff0c\u4e60\u60ef\u4e4b\u540e\uff0c\u4f60\u4f1a\u89c9\u5f97\u5f88\u4f18\u96c5\uff0c\u6ca1\u9519\uff0c\u8fd9\u5c31\u662f Pythonic Code \u7684\u6838\u5fc3\uff0c\u8bf7\u4fdd\u6301\u4f18\u96c5\uff5e\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_8","title":"2. \u4ee3\u7801\u626b\u63cf\u5de5\u5177","text":"\u4f7f\u7528\u6839\u76ee\u5f55\u4e0b pylint.sh \u626b\u63cf\u4ee3\u7801\uff0c\u5728 report \u76ee\u5f55\u4e0b\u67e5\u770b\u4ee3\u7801\u626b\u63cf\u62a5\u544a\uff0c\u5982\u679c\u6709\u4ee3\u7801\u95ee\u9898\u8bf7\u63d0\u524d\u89e3\u51b3\u4e4b\u540e\u518d\u63d0\u4ea4\u3002 \u6b64\u811a\u672c\u5df2\u7ecf\u4f7f\u7528 Python \u793e\u533a\u6700\u6d41\u884c\u7684\u4ee3\u7801\u626b\u63cf\u5de5\u5177 Pylint \u8fdb\u884c\u4ee3\u7801\u626b\u63cf\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a bash pylint.sh\n \u8fd0\u884c\u4e4b\u540e\u4f1a\u63d0\u793a\u4f60\u8981\u626b\u63cf\u7684\u76ee\u5f55\uff0c\u6bd4\u5982\u8f93\u5165 apps \uff0c\u5219\u4f1a\u626b\u63cf apps \u4e0b\u7684\u6240\u6709 Python \u4ee3\u7801\u3002 \u5728 setting/pylintrc.cfg \u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u76f8\u5173\u914d\u7f6e\uff0c\u626b\u63cf\u5b8c\u6210\u4e4b\u540e\u5728 report/pylints \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u626b\u63cf\u62a5\u544a\u3002 \u4ee3\u7801\u63d0\u4ea4\u9700\u901a\u8fc7 git review \u63d0\u4ea4\u5230 gerrit \uff0c\u4eba\u5de5 Code Review \u901a\u8fc7\u4e4b\u540e\u5408\u5165\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_11","title":"\u5341\u4e09\u3001\u63d0\u4ea4\u4ee3\u7801","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_9","title":"1. \u5b89\u88c5\u4f9d\u8d56","text":"sudo apt install git-review\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_9","title":"2. \u63d0\u4ea4\u6a21\u677f","text":"\u5728 ~ \u76ee\u5f55\u4e0b\u65b0\u5efa\u6587\u4ef6\uff0c\u5e76\u547d\u540d\u4e3a gitcommit_template \u5c06\u4ee5\u4e0b\u5185\u5bb9\u5199\u5165\u6587\u4ef6\u5f53\u4e2d\uff1a # commit type :fix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style(\u98ce\u683c\u4fee\u6539)\u3001refactor(\u91cd\u6784)\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test(\u6d4b\u8bd5) + \u7b80\u5355\u63cf\u8ff0. \u9ed8\u8ba4fix,\u6839\u636e\u60c5\u51b5\u4fee\u6539\nfix: \n\n# \u8be6\u7ec6\u8bf4\u660e\u4ee3\u7801\u7684\u6539\u52a8\uff0c\u5305\u542b\u4ee3\u7801\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u4ee5\u53ca\u4e3a\u4ec0\u4e48\u8fd9\u4e48\u505a\uff0c\u53ef\u80fd\u4f1a\u5f71\u54cd\u54ea\u4e9b\u529f\u80fd\u3002\u5bf9\u4e8e\u4ee3\u7801\u7684\u5ba1\u6838\u8005\uff0c\u9700\u8981\u4ece\u8fd9\u6bb5\u63cf\u8ff0\u4e2d\u80fd\u5b8c\u5168\u7406\u89e3\u4ee3\u7801\u4e2d\u6240\u6709\u6539\u52a8\u7684\u5185\u5bb9\nDescription: \n\n# \u5199\u4e00\u6bb5\u9762\u5411\u4e8e\u4ea7\u54c1\u7684\u603b\u7ed3\u6027\u5185\u5bb9\uff0c\u7528\u4e8e\u81ea\u52a8\u751f\u6210crp\u4e0a\u7684changlog\uff0c\u9700\u8981\u6ce8\u610f\u7684\u4e8b\uff0c\u8fd9\u6bb5\u63cf\u8ff0\u5fc5\u987b\u4ece\u4ea7\u54c1\u7684\u89d2\u5ea6\u8003\u8651\u3002\nLog: \n\n# \u5173\u8054pms\u4e0a\u7684bug\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94bug\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4fee\u590dbug\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Bug: \n\n# \u4fee\u590d github issue \n#Issue: \n\n# \u5173\u8054pms\u4e0a\u7684\u4efb\u52a1\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94\u4efb\u52a1\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4efb\u52a1\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Task: \n \u547d\u4ee4\u884c\u6267\u884c: git config --global commit.template ~/gitcommit_template\n \u6b64\u547d\u4ee4\u5c06\u6a21\u677f\u52a0\u5165\u5230 git \u7684\u63d0\u4ea4\u6a21\u677f\u4e2d\u3002 \u540e\u7eed\u63d0\u4ea4\u7684\u65f6\u5019\u9700\u8981\u5173\u6ce8\u4e00\u4e0b\u51e0\u70b9\uff1a commit type \u5bf9\u5e94\u4e0d\u540c\u7684\u4fee\u6539\u7c7b\u578b\uff1afix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style \uff08\u98ce\u683c\u4fee\u6539\uff09\u3001refactor \uff08\u91cd\u6784\uff09\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test \uff08\u6d4b\u8bd5\uff09 commit type \u5192\u53f7\u540e\u9762\u52a0\u7a7a\u683c\u3002 Description \u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u9700\u8981\u8fdb\u884c\u8be6\u7ec6\u8bf4\u660e\uff0c\u6bd4\u5982\u5bf9\u529f\u80fd\u8fdb\u884c\u5927\u6539\u7b49\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_6","title":"3. \u63a8\u9001\u4ee3\u7801","text":"\u9996\u5148\u6dfb\u52a0 commit \u4fe1\u606f git add \u540e\u9762\u52a0\u6587\u4ef6\u540d\u79f0\n git add . # \u8868\u793a\u6dfb\u52a0\u6240\u6709\u6587\u4ef6\n \u4f7f\u7528\u8fd9\u6761\u547d\u4ee4\u6ce8\u610f\u6709\u4e9b\u4e34\u65f6\u6587\u4ef6\u4e0d\u8981\u63d0\u4ea4\u5230\u4ed3\u5e93\u4e86\u3002 git commit -a\n \u4e4b\u540e\u5728 fix: \u540e\u9762\uff08\u6ce8\u610f\u5192\u53f7\u540e\u9762\u5fc5\u987b\u52a0\u7a7a\u683c\uff0c\u4e0d\u7136\u76f4\u63a5-1\uff09\u5199\u672c\u5730\u63d0\u4ea4\u7684 commit \u4fe1\u606f\uff0c\u7136\u540e\u5c31\u53ef\u4ee5\u63d0\u4ea4\u4ee3\u7801\u4e86 git review branch(\u5f53\u524d\u5206\u652f) -r origin\n \u6700\u597d\u4e00\u6b21 commit\uff0c\u4e00\u6b21 git review \uff0c\u7ecf\u5e38\u6709\u540c\u5b66\u5728\u672c\u5730\u75af\u72c2 commit \u6700\u540e git review \u62a5\u9519\u4e0d\u77e5\u9053\u548b\u56de\u4e8b\u513f\u3002 \u82e5\u4e0d\u60f3\u6bcf\u6b21\u63d0\u4ea4\u90fd\u52a0\u4e0a -r \u9009\u9879\uff0c\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a git config --global gitreview.remote origin \u63d0\u4ea4\u4ee3\u7801\uff0c\u76f4\u63a5\u4f7f\u7528 git review branch<\u76ee\u6807\u5206\u652f>\uff0c\u4f8b\u5982 git review master"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git","title":"4. Git\u6807\u7b7e","text":"Git \u6807\u7b7e\u5b9e\u9645\u4e0a\u662f commit \u7684\u4e00\u4e2a\u522b\u540d\uff0c\u4e3b\u8981\u7528\u4e8e\u7ba1\u7406\u5386\u53f2\u7248\u672c\u3002 \u60f3\u8c61\u4e00\u4e0b\u9886\u5bfc\u8ba9\u4f60\u628a\u4e4b\u524d\u7684\u67d0\u4e2a\u7248\u672c\u7684\u4ee3\u7801\u62c9\u51fa\u6765\u8dd1\uff0c\u4f60\u662f\u4e0d\u662f\u4e56\u4e56\u7684\u53bb\u628a\u6240\u6709\u63d0\u4ea4\u8bb0\u5f55\u62c9\u51fa\u6765\u627e\uff0c\u7136\u540e\u627e\u5230\u90a3\u4e2a\u54c8\u5e0c\u503c\uff0c\u901a\u8fc7\u54c8\u5e0c\u503c\u6765\u68c0\u51fa\u4ee3\u7801\u3002 \u8fd9\u4e00\u5957\u64cd\u4f5c\u4e0b\u6765\u662f\u4e0d\u662f\u5f88\u9ebb\u70e6\uff0c\u8d39\u65f6\u95f4\u8fd8\u4e0d\u4e00\u5b9a\u80fd\u627e\u5f97\u5230\uff0c\u6ca1\u4eba\u80fd\u8bb0\u4f4f\u6bcf\u4e2a\u63d0\u4ea4\u54c8\u5e0c\u503c\u4ee5\u53ca\u8fd9\u6b21\u63d0\u4ea4\u90fd\u6539\u4e86\u54ea\u4e9b\u4ee3\u7801\u3002 \u56e0\u6b64\u7ed9\u63d0\u4ea4\u6253\u4e2a\u6807\u7b7e\uff0c\u5c31\u662f\u628a\u54c8\u5e0c\u503c\u8f6c\u6362\u6210\u4eba\u7c7b\u80fd\u7406\u89e3\u7684\u8bed\u8a00\uff0c\u6bd4\u5982 v1.0\uff0c\u5c31\u53ef\u4ee5\u76f4\u63a5\u901a\u8fc7\u6807\u7b7e\u627e\u5230\u5bf9\u5e94\u7684\u63d0\u4ea4\u3002 \u65b0\u5efa\u6807\u7b7e git tag -a <tagname>\n \u56de\u8f66\u4e4b\u540e\uff0cGit \u4f1a\u6253\u5f00\u4f60\u7684\u7f16\u8f91\u5668\uff0c\u8ba9\u4f60\u5199\u4e00\u53e5\u6807\u7b7e\u6ce8\u89e3\uff0c\u5c31\u50cf\u4f60\u7ed9\u63d0\u4ea4\u5199\u6ce8\u89e3\u4e00\u6837\u3002 \u67e5\u770b\u6240\u6709\u6807\u7b7e git tag -l\n# git tag \u4e5f\u884c\n \u5220\u9664\u6807\u7b7e git tag -d <tagname>\n \u63a8\u9001\u6807\u7b7e\u81f3\u8fdc\u7a0b git push \u547d\u4ee4\u5e76\u4e0d\u4f1a\u4f20\u9001\u6807\u7b7e\u5230\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\uff0c\u5fc5\u987b\u663e\u5f0f\u5730\u63a8\u9001\u6807\u7b7e\u3002 git push origin <tagname>\n \u63a8\u9001\u6240\u6709\u4e0d\u5728\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\u7684\u6807\u7b7e git push origin --tag\n \u5220\u9664\u8fdc\u7a0b\u6807\u7b7e git push origin :refs/tag/<tagname>\n \u540e\u671f\u6253\u6807\u7b7e \u5148\u7528 git log --pretty=oneline \u67e5\u8be2\u63d0\u4ea4\u8bb0\u5f55\uff0c\u83b7\u53d6\u6821\u9a8c\u7801\u3002 git tag -a <tagname> 9fceb02(\u6821\u9a8c\u7801)\n \u68c0\u51fa\u6807\u7b7e git checkout <tagname>\n \u6b64\u65f6\uff0c\u4ed3\u5e93\u4f1a\u5904\u4e8e\u201c\u5206\u79bb\u5934\u6307\u9488\uff08detached HEAD\uff09\u201d\u7684\u72b6\u6001\u3002 \u5728\u201c\u5206\u79bb\u5934\u6307\u9488\u201d\u72b6\u6001\u4e0b\uff0c\u5982\u679c\u4f60\u505a\u4e86\u67d0\u4e9b\u66f4\u6539\u7136\u540e\u63d0\u4ea4\u5b83\u4eec\uff0c\u6807\u7b7e\u4e0d\u4f1a\u53d1\u751f\u53d8\u5316\uff0c \u4f46\u4f60\u7684\u65b0\u63d0\u4ea4\u5c06\u4e0d\u5c5e\u4e8e\u4efb\u4f55\u5206\u652f\uff0c\u5e76\u4e14\u5c06\u65e0\u6cd5\u8bbf\u95ee\uff0c\u9664\u975e\u901a\u8fc7\u786e\u5207\u7684\u63d0\u4ea4\u54c8\u5e0c\u624d\u80fd\u8bbf\u95ee\u3002 \u56e0\u6b64\uff0c\u5982\u679c\u4f60\u9700\u8981\u8fdb\u884c\u66f4\u6539\uff0c\u6bd4\u5982\u4f60\u8981\u4fee\u590d\u65e7\u7248\u672c\u4e2d\u7684\u9519\u8bef\uff0c\u90a3\u4e48\u901a\u5e38\u9700\u8981\u521b\u5efa\u4e00\u4e2a\u65b0\u5206\u652f\uff1a git checkout -b <NewBranchName> <tagname>\n \u65b0\u5206\u652f\u4e0a\u53ef\u4ee5\u8fdb\u884c\u63d0\u4ea4\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_12","title":"\u5341\u56db\u3001\u5e38\u89c1\u95ee\u9898","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_10","title":"1. \u63d0\u4ea4\u4ee3\u7801\u65f6\u63d0\u793a\u90ae\u7bb1\u6216\u8005\u540d\u79f0\u4e0d\u5bf9","text":"\u91cd\u65b0\u914d\u7f6e\u90ae\u7bb1\u6216\u8005\u540d\u79f0\uff0c\u7136\u540e\u91cd\u7f6e\u751f\u6548\uff1a git commit --amend --reset-author\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_10","title":"2. \u600e\u4e48\u56de\u6eda\u5230\u4e4b\u524d\u7684\u7248\u672c","text":"(1)\u67e5\u8be2\u5386\u53f2\u63d0\u4ea4\u8bb0\u5f55 git log\n \u627e\u5230\u4f60\u8981\u56de\u6eda\u7684\u7248\u672c\uff0c\u590d\u5236 hash \u503c\u3002 \u6ce8\u610f\uff1a\u662f commit \u7a7a\u683c\u4e4b\u540e\u7684 hash \u503c\uff0c\u4e4b\u524d\u6709\u540c\u5b66\u590d\u5236\u7684 Change-Id: \u8fd9\u6837\u80af\u5b9a\u62a5\u9519\u3002 (2)\u56de\u6eda\u7248\u672c\uff0c\u4e0d\u6e05\u9664\u4ee3\u7801 git reset --soft ${hash}\n (3)\u56de\u6eda\u7248\u672c\uff0c\u6e05\u9664\u4ee3\u7801\uff0c\u614e\u7528\u54c8 git reset --hard ${hash}\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-f-s-e","title":"3. \u6d4b\u8bd5\u62a5\u544a\u91cc\u9762 F S . E \u662f\u4ec0\u4e48\u610f\u601d","text":"F \u8868\u793a\u5931\u8d25\uff0c. \uff08\u70b9\uff09\u8868\u793a\u901a\u8fc7\uff0cS \u8868\u793a\u8df3\u8fc7\uff0cE \u8868\u793a error \u6709\u62a5\u9519"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git-status","title":"4. \u89e3\u51b3 git status \u4e2d\u6587\u663e\u793a\u7684\u95ee\u9898","text":"git config --global core.quotePath false\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5-apps","title":"5. apps \u76ee\u5f55\u4e0b\u989c\u8272\u6709\u4e9b\u662f\u9ec4\u8272\u7684","text":"\u5728 Pycharm \u4e2d apps \u76ee\u5f55\u4e0b\u5e94\u7528\u5e93\u6587\u4ef6\u662f\u9ec4\u8272\u7684\uff0c\u7f16\u8f91\u5668\u8bc6\u522b\u4e0d\u5230\u4ee3\u7801\u65b0\u589e\u548c\u4fee\u6539\uff1b \u7531\u4e8e\u793e\u533a\u7248 Pycharm \u4e0d\u80fd\u52a8\u6001\u8bc6\u522b\u591a\u4ed3\u5e93\uff0c\u9700\u8981\u5728 setting \u91cc\u9762\u624b\u52a8\u6ce8\u518c\uff0c\u64cd\u4f5c\u6b65\u9aa4\uff1a File \u2014> Settings \u2014> Version Control \u2014> \u70b9 + \u53f7 \u2014> Directory \u9009\u4e2d\u5e94\u7528\u5e93\u5de5\u7a0b\u76ee\u5f55 \u2014> VCS \u9009\u4e2d Git \u2014> Apply \u5982\u6b64\u5c31\u53ef\u4ee5\u4e86\u3002 \u4e13\u4e1a\u7248 Pycharm \u4e0d\u5b58\u5728\u8fd9\u4e2a\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#6-envsh-r","title":"6. \u6267\u884c env.sh \u62a5\u9519 $'\\r':\u672a\u627e\u5230\u547d\u4ee4","text":"\u51fa\u73b0\u8fd9\u4e2a\u95ee\u9898\u4f60\u5e94\u8be5\u662f\u5728 windows \u4e0a\u6253\u5f00\u6216\u7f16\u8f91\u8fc7 env.sh \u811a\u672c\uff0cwindows\u4e0b\u7684\u6362\u884c\u662f\u56de\u8f66\u7b26+\u6362\u884c\u7b26\uff0c\u4e5f\u5c31\u662f\\r\\n\uff0c\u800c Linxu \u4e0b\u662f\u6362\u884c\u7b26 \\n\uff0cLinux \u4e0b\u4e0d\u8bc6\u522b \\r\uff0c\u56e0\u6b64\u62a5\u9519\u3002 \u89e3\u51b3\u65b9\u6848\uff1a # \u5c06 \\r \u66ff\u6362\u4e3a\u7a7a\nsudo sed -i 's/\\r//' env.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#7","title":"7.\u600e\u6837\u4e3a\u5355\u72ec\u67d0\u4e00\u6761\u7528\u4f8b\u914d\u7f6e\u6267\u884c\u8d85\u65f6\u65f6\u95f4","text":"\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u5982\u4e0b\uff1a @pytest.mark.timeout(300) # \u5355\u4f4d\u79d2\ndef test_xxx_001():\npass\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#8-youqu","title":"8. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u6240\u6709\u4ee3\u7801\uff0c\u5305\u542b\u5b50\u4ed3\u5e93","text":"\u524d\u7f6e\u6761\u4ef6\uff1a\u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 # \u7b2c\u4e00\u6b21\u5b58\u50a8\u5bc6\u7801\uff0c\u63d0\u4f9b\u540e\u9762\u62c9\u4ee3\u7801(gerrit: ldap\u8d26\u53f7\u548c\u5bc6\u7801\uff0cgit\u62c9\u53d6\u7b2c\u4e00\u6b21\u8f93\u5165\u4fdd\u5b58\uff0c\u540e\u9762\u76f4\u63a5\u4f7f\u7528)\ngit config --global credential.helper store\n\n# \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\uff0c\u5e76\u9012\u5f52\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\" --recursive\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#9-youqu","title":"9. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\u6307\u5b9a\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u524d\u7f6e\u6761\u4ef6\uff1a \u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 \u5df2\u5b58\u50a8\u8bbf\u95ee\u5bc6\u7801 # \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\"\n# \u6307\u5b9a\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ncd youqu\ngit submodule update --init apps/autotest_xxx_xxx\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#10-youqu","title":"10. \u5982\u4f55\u66f4\u65b0 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\uff0c\u6240\u6709\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u66f4\u65b0\u6240\u6709\u5b50\u4ed3\u5e93\u4ee3\u7801 cd youqu\ngit pull & git submodule foreach git pull\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#11-youqu-master-detached-head","title":"11. \u5982\u4f55\u4fee\u590d YouQu \u6240\u6709\u5b50\u4ed3\u5e93 master \u5206\u652f\u6e38\u79bb\u5934\uff08detached head\uff09","text":"\u4fee\u590d\u6240\u6709\u5b50\u4ed3\u5e93\u9ed8\u8ba4master \u5206\u652f\u6e38\u79bb\u5934 cd youqu\ngit submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/","title":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212 \u5206\u7c7b\uff1a/ \u67b6\u6784\u5e08\uff1a/ \u76ee\u6807\uff1a \u5e94\u7528 AT \u67b6\u6784\u5de5\u7a0b\u5316\uff0c\u53c2\u8003\u6027\u80fd\u81ea\u52a8\u5316\u5de5\u7a0b\u5b8c\u6210\u5de5\u7a0b\u5316\u6539\u9020\u3002 \u5e94\u7528\u95f4\u7528\u4f8b\u89e3\u8026\uff0c\u89e3\u9664\u6240\u6709\u4ea4\u53c9\u8c03\u7528\u7684\u65b9\u6cd5\uff0c\u5404\u5e94\u7528\u80fd\u8ddf\u968f\u81ea\u8eab\u8fed\u4ee3\u5468\u671f\u72ec\u7acb\u7ef4\u62a4 AT \u7528\u4f8b\u3002 \u5b8c\u6210\u516c\u5171\u65b9\u6cd5\u7684\u62bd\u53d6\u6574\u5408\uff0c\u5f62\u6210\u4e00\u5957\u72ec\u7acb\u4e8e\u5e94\u7528\u95f4\u7684\u516c\u5171\u65b9\u6cd5\u5e93\uff0c\u5404\u5e94\u7528\u65b9\u6cd5\u91cc\u9762\u4e0d\u5b58\u5728\u88ab\u591a\u4e2a\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\u3002 \u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u4e3a\u5c06\u6765\u9002\u914d\u66f4\u591a\u7684 AT \u8fd0\u7528\u573a\u666f\u63d0\u4f9b\u652f\u6491\uff0c\u539f\u5219\u4e0a\u53ef\u5b9e\u73b0\u65e0\u9650\u6269\u5c55\uff0c\u5728\u6bcf\u65e5\u6784\u5efa\u548c\u6301\u7eed\u96c6\u6210\u6d41\u7a0b\u843d\u5730\u4f7f\u7528\u3002 \u4ee3\u7801\u89c4\u8303\u95ee\u9898\u6e05\u96f6\uff0c\u7b26\u5408 Shell Check\u3001Pylint\u3001\u7cfb\u7edf\u90e8\u76f8\u5173\u7f16\u7801\u89c4\u8303\u8981\u6c42\u3002 \u610f\u4e49\uff1a \u7edf\u4e00\u6210\u7814 AT \u67b6\u6784\u8bbe\u8ba1\u601d\u8def\uff0c\u6d88\u9664 AT \u4ee3\u7801\u5b9e\u73b0\u548c\u7ef4\u62a4\u4e0a\u53ef\u80fd\u51fa\u73b0\u7684\u5206\u6b67\uff0c\u6539\u5584\u5386\u53f2 AT \u65e0\u5de5\u7a0b\u5316\u8bbe\u8ba1\u7684\u7f3a\u9677\uff0c\u63d0\u9ad8\u67b6\u6784\u4e13\u4e1a\u6027\u3002 \u5404\u5e94\u7528 AT \u4ee3\u7801\u76f8\u4e92\u72ec\u7acb\uff0c\u5951\u5408\u5e94\u7528\u72ec\u7acb\u53d1\u5e03\u7279\u6027\uff0c\u53ef\u652f\u6301\u8fed\u4ee3\u671f\u95f4\u72ec\u7acb\u65b0\u589e\u3001\u7ef4\u62a4\u548c\u6267\u884c\u3002 \u65b9\u6cd5\u8c03\u7528\u903b\u8f91\u5f97\u5230\u7b80\u5316\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u66f4\u9ad8\u6548\uff1b\u516c\u5171\u5e93\u62bd\u53d6\uff0c\u51cf\u5c11\u65b9\u6cd5\u91cd\u590d\u7f16\u5199\uff0c\u63d0\u9ad8\u4ee3\u7801\u5229\u7528\u7387\uff1b\u5e73\u5747\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u4ece40\u5206\u949f\u964d\u4f4e\u81f330\u5206\u949f\uff0c\u65e5\u4ea7\u51fa\u7528\u4f8b\u4ece12\u6761/\u5929\u63d0\u5347\u81f316\u6761/\u5929\u3002 \u53ef\u7075\u6d3b\u652f\u6491\u4e0d\u540c\u7684\u81ea\u52a8\u5316\u8fd0\u7528\u573a\u666f\uff0c\u5982 CI\u3001\u5192\u70df\u6d4b\u8bd5\u3001\u96c6\u6210\u6d4b\u8bd5\u3001\u56de\u5f52\u6d4b\u8bd5\u3001\u4e13\u9879\u6d4b\u8bd5\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_2","title":"\u4e00\u3001\u80cc\u666f\u4ecb\u7ecd","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1","title":"1\u3001\u73b0\u6709\u67b6\u6784\u4ecb\u7ecd","text":"\u73b0\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u6574\u4f53\u5206\u4e3a\u4e09\u5c42\uff1a\u7528\u4f8b\u5c42\uff08\u4e1a\u52a1\u903b\u8f91\u5c42\uff09\u3001\u4e2d\u95f4\u5c42\uff08\u5143\u7d20\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff09\u3001\u6838\u5fc3\u5c42\uff08\u5e95\u5c42\u529f\u80fd\u5e93\u5c42\uff09\u3002 \u7528\u4f8b\u5c42\uff1a\u5373\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4e13\u6ce8\u4e8e\u4e1a\u52a1\u529f\u80fd\u903b\u8f91\uff0c\u4e0d\u5173\u5fc3\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\uff1b \u4e2d\u95f4\u5c42\uff1a\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff0c\u6bcf\u4e2a\u65b9\u6cd5\u5747\u5bf9\u5e94\u4e00\u4e2a\u5143\u7d20\u7684\u4e00\u4e2a\u5177\u4f53\u64cd\u4f5c\uff0c\u4e5f\u53ef\u4ee5\u662f\u591a\u4e2a\u64cd\u4f5c\u7684\u7ec4\u5408\u64cd\u4f5c\uff0c\u4e2d\u95f4\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u7528\u4f8b\u5c42\uff0c\u5177\u6709\u53ef\u6269\u5c55\u6027\u548c\u590d\u7528\u6027\uff1b \u6838\u5fc3\u5c42\uff1a\u4e3b\u8981\u5c01\u88c5\u7684\u5e95\u5c42\u529f\u80fd\u5b9e\u73b0\uff0c\u6b64\u5c42\u5728\u6846\u67b6\u4e2d\u63d0\u4f9b\u4e00\u4e9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u529f\u80fd\u6a21\u5757\u76f8\u5bf9\u72ec\u7acb\uff0c\u6838\u5fc3\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u64cd\u4f5c\u5c42\uff0c\u6bd4\u5982\uff1a\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7 UI \u5750\u6807\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u952e\u9f20\u64cd\u4f5c\u7684\u57fa\u7840\u65b9\u64cd\u4f5c\u6a21\u5757\u3001Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757\u3001\u6587\u4ef6\u7684\u589e\u5220\u6539\u67e5\u64cd\u4f5c\u6a21\u5757\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2","title":"2\u3001\u81ea\u52a8\u5316\u7684\u5e94\u7528","text":"2.1\u3001CI \u6d41\u7a0b \u6bcf\u65e5\u6784\u5efa\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u7814\u53d1\u6bcf\u65e5\u63d0\u4ea4\u7684\u4ee3\u7801\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u73ed\u4e4b\u540e\u4f1a\u5c06\u5404\u5e94\u7528\u8fdb\u884c\u6253\u5305\uff0c\u7136\u540e\u5728\u6d4b\u8bd5\u673a\u4e0a\u5b89\u88c5\u66f4\u65b0 deb \u5305\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u5e94\u7528\u63d0\u4ea4\u96c6\u6210\u7684\u7248\u672c\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u8f7d\u6700\u65b0\u7684 ISO \u8fdb\u884c PXE \u90e8\u7f72\uff0c\u7136\u540e\u6d4b\u8bd5\u673a\u5b89\u88c5\u6700\u65b0\u7684\u955c\u50cf\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 2.2\u3001\u9a8c\u6536\u6d4b\u8bd5 \u5728\u5404\u9a8c\u6536\u8282\u70b9\u8fdb\u884c\u81ea\u52a8\u5316\u9a8c\u6536\uff0c\u76ee\u524d\u7684\u7b56\u7565\u662f\u5168\u7528\u4f8b\u8986\u76d6\u5168\u67b6\u6784\u3002 2.3\u3001\u56de\u5f52\u6d4b\u8bd5 \u56de\u5f52\u6d4b\u8bd5\u4eca\u5e74\u89c4\u5212\u5efa\u8bbe\u4e2d\uff0c\u65e8\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u6267\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\uff0c\u51cf\u5c11\u529f\u80fd\u6d4b\u8bd5\u7684\u91cd\u590d\u52b3\u52a8\u529b\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3","title":"3\u3001\u5b58\u5728\u7684\u95ee\u9898","text":" \u5404\u5e94\u7528\u4e4b\u95f4\u5b58\u5728\u8026\u5408 \u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u521d\u671f\uff0c\u6240\u6709\u5e94\u7528\u662f\u6574\u4f53\u53d1\u5e03\uff0c\u6211\u4eec\u662f\u5c06\u6240\u6709\u5e94\u7528\u770b\u6210\u662f\u4e00\u4e2a\u6574\u4f53\uff0c\u5404\u5e94\u7528\u4f5c\u4e3a\u5176\u4e2d\u7684\u4e00\u4e2a\u6a21\u5757\uff0c\u6240\u4ee5\u5b58\u5728\u5e94\u7528\u95f4\u65b9\u6cd5\u4ea4\u53c9\u8c03\u7528\u7684\u95ee\u9898\uff0c\u8fd9\u6837\u4ece\u6700\u521d\u7684\u8bbe\u8ba1\u6765\u8bb2\u786e\u5b9e\u80fd\u591f\u51cf\u5c11\u91cd\u590d\u4ee3\u7801\u7684\u7f16\u5199\u3002\u4f46\u662f\u73b0\u5728\u5e94\u7528\u8d70\u72ec\u7acb\u53d1\u5e03\uff0c\u5404\u5e94\u7528\u90fd\u6709\u81ea\u5df1\u7684\u8fed\u4ee3\u8282\u594f\uff0c\u5728\u65b0\u9700\u6c42\u5feb\u901f\u53d8\u5316\u7684\u8fc7\u7a0b\u4e2d\uff0c\u81ea\u52a8\u5316\u7ef4\u62a4\u53d8\u5f97\u5f02\u5e38\u56f0\u96be\uff0c\u539f\u56e0\u5c31\u662f\u81ea\u52a8\u5316\u9879\u76ee\u91cc\u9762\u5404\u4e2a\u5e94\u7528\u7684\u6709\u6bd4\u8f83\u591a\u7684\u8026\u5408\u5173\u7cfb\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u8fdb\u884c\u89e3\u8026\uff0c\u4ee5\u9002\u5e94\u5e94\u7528\u4e0d\u540c\u7684\u8fed\u4ee3\u5468\u671f\u3002 \u65e0\u6cd5\u7cbe\u51c6\u7684\u5212\u5206\u7528\u4f8b\u8303\u56f4 \u7528\u4f8b\u6267\u884c\u7684\u8303\u56f4\u4e0d\u591f\u7cbe\u51c6\uff0c\u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u4e3b\u8981\u901a\u8fc7\u7528\u4f8b\u7684\u5173\u952e\u8bcd core\uff08\u6838\u5fc3\uff09\u6765\u533a\u5206\u7528\u4f8b\u662f\u5426\u4e3a\u6838\u5fc3\u7528\u4f8b\uff0c\u4f46\u662f\u8fd9\u6837\u7684\u533a\u5206\u592a\u5bbd\u6cdb\u4e86\uff0c\u4e0d\u80fd\u9002\u5e94\u81ea\u52a8\u5316\u6d4b\u8bd5\u5728\u591a\u573a\u666f\u4e0b\u7684\u5e94\u7528\u3002\u5f88\u591a\u573a\u666f\u4e0b\u6211\u4eec\u8fd8\u9700\u8981\u6839\u636e\u7528\u4f8b\u7684\u7b49\u7ea7\u3001\u7528\u4f8b\u7684\u7c7b\u578b\u3001\u7528\u4f8b\u6765\u6e90\u7b49\u7b49\uff0c\u4e0d\u540c\u7684\u7ef4\u5ea6\u6765\u6311\u9009\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u5173\u952e\u5b57\u9700\u8981\u4eba\u5de5\u4e00\u6761\u6761\u7684\u6539\uff0c\u8d39\u65f6\u8d39\u529b\uff0c\u800c\u4e14\u4e0d\u597d\u7ef4\u62a4\u3002 \u53d7\u65b0\u9700\u6c42\u5f71\u54cd\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u597d\u7ef4\u62a4 \u76ee\u524d\u9700\u8981\u8df3\u8fc7\u7684\u7528\u4f8b\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684\u7528\u4f8b\u811a\u672c\u91cc\u9762\uff0c\u6dfb\u52a0\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\uff0c\u540e\u7eed\u89e3\u9664\u8df3\u8fc7\u7684\u65f6\u5019\u53c8\u9700\u8981\u627e\u5230\u8fd9\u6761\u811a\u672c\uff0c\u5220\u6389\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\u3002\u5728\u8df3\u8fc7\u7528\u4f8b\u8f83\u591a\u7684\u60c5\u51b5\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u96be\u5ea6\u3002 \u7f16\u5199\u7528\u4f8b\u65f6\u903b\u8f91\u6bd4\u8f83\u590d\u6742\uff0c\u9700\u8981\u8c03\u7528\u591a\u4e2a\u5e94\u7528\u7684\u65b9\u6cd5\u6a21\u5757\u3002 \u6846\u67b6\u6269\u5c55\u6027\u4e0d\u8db3\uff0c\u65e0\u6cd5\u6574\u5408\u6027\u80fd\u81ea\u52a8\u5316\u3001\u538b\u6d4b\u81ea\u52a8\u5316\u3001\u5b89\u5168\u81ea\u52a8\u5316\u7b49\u4e13\u9879\u6d4b\u8bd5\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_3","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u4e3a\u89e3\u51b3\u73b0\u6709\u95ee\u9898\uff0c\u9002\u5e94\u4e0d\u65ad\u4e30\u5bcc\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u66f4\u597d\u7684\u53d1\u6325\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4f5c\u7528\uff0c\u9700\u8981\u5bf9\u81ea\u52a8\u5316\u67b6\u6784\u53ca\u5404\u529f\u80fd\u6a21\u5757\u8fdb\u884c\u91cd\u65b0\u8bbe\u8ba1\u89c4\u5212\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_1","title":"1\u3001\u67b6\u6784\u8bbe\u8ba1","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_1","title":"2\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u6846\u67b6\u7684\u8fd0\u884c\u903b\u8f91\uff1a\u901a\u8fc7\u6838\u5fc3\u5c42\u63d0\u4f9b\u4e00\u4e2a\u57fa\u7840\u80fd\u529b\uff0c\u4e1a\u52a1\u5c42\u6839\u636e\u5b9e\u9645\u4e1a\u52a1\u9700\u6c42\uff08\u6d4b\u8bd5\u7528\u4f8b\uff09\u52a8\u6001\u52a0\u8f7d\u6838\u5fc3\u5c42\uff0c\u6267\u884c\u5165\u53e3\u52a0\u8f7d\u76f8\u5e94\u7684\u7528\u4f8b\u96c6\u5e76\u63a7\u5236\u6267\u884c\uff0c\u5e94\u7528\u5c42\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u9700\u6c42\uff0c\u901a\u8fc7\u76f8\u5e94\u7684\u914d\u7f6e\u9879\u8fdb\u884c\u914d\u7f6e\uff0c\u4ece\u800c\u89e6\u53d1\u81ea\u52a8\u5316\u6d4b\u8bd5\u4efb\u52a1\u3002 \u6838\u5fc3\u5c42\uff1a\u57fa\u672c\u4fdd\u6301\u4e0d\u53d8\uff0c\u90e8\u5206\u6a21\u5757\u4f1a\u6d89\u53ca\u5230\u65b0\u529f\u80fd\u5f00\u53d1\uff0c\u6838\u5fc3\u5c42\u5404\u529f\u80fd\u6a21\u5757\u4fdd\u6301\u72ec\u7acb\u6027\uff0c\u63d0\u4f9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u4f9b\u4e0a\u5c42\u8c03\u7528\uff1b \u5e95\u5c42\u6838\u5fc3\u6a21\u5757\u5305\u62ec\uff1a \u56fe\u50cf\u8bc6\u522b\u6a21\u5757 UI \u5b9a\u4f4d\u6a21\u5757 Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757 \u5c5e\u6027\u5b9a\u4f4d\u6a21\u5757 \u65e5\u5fd7\u6a21\u5757 \u952e\u9f20\u64cd\u4f5c\u6a21\u5757 \u6587\u4ef6\u64cd\u4f5c\u6a21\u5757 \u5f55\u5c4f\u6a21\u5757 \u81ea\u5b9a\u4e49\u65ad\u8a00\u6a21\u5757 \u7528\u4f8b\u6267\u884c\u6a21\u5757 PXE \u88c5\u673a\u6a21\u5757 \u952e\u9f20\u4fe1\u53f7\u6a21\u62df\u6a21\u5757 OCR \u6a21\u5757 \u4e1a\u52a1\u5c42\uff1a\u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e94\u7528\u5185\u5305\u542b\u591a\u4e2a\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5982\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7b49\uff0c\u540e\u7eed\u53ef\u4ee5\u6839\u636e\u9700\u8981\u5ac1\u63a5\u8fdb\u6765\u3002\u5176\u4e2d\u529f\u80fd\u6d4b\u8bd5\u8bbe\u8ba1\u601d\u8def\uff1a \u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e76\u5c06\u6d4b\u8bd5\u6570\u636e\u548c\u6d4b\u8bd5\u8d44\u6e90\u6574\u5408\u8fdb\u6765\uff0c\u589e\u52a0\u7528\u4f8b\u6807\u7b7e csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ed9\u6bcf\u6761\u7528\u4f8b\u6253\u6807\u7b7e\u3002 \u5404\u6807\u7b7e\u6240\u4f7f\u7528\u5bf9\u5e94\u7684\u5b57\u6bb5\u540d\u79f0\uff0c\u4f7f\u7528 csv \u6587\u4ef6\u7ef4\u62a4\u7528\u4f8b\u4e0e\u6807\u7b7e\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u5bf9\u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u53ef\u4ee5\u7ec4\u5408\u5176\u4e2d\u7684\u6807\u7b7e\u800c\u4ece\u9a71\u52a8\u5bf9\u5e94\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\uff0c\u517c\u5bb9\u73b0\u6709\u7528\u4f8b\u6807\u7b7e\uff0c\u4e14\u652f\u6301\u7528\u4f8b\u6807\u7b7e\u53ef\u6269\u5c55\uff1b \u4f7f\u7528 csv \u683c\u5f0f\u6587\u4ef6\u53ef\u4ee5\u65b9\u4fbf\u7684\u4f7f\u7528 Excel \u8868\u683c\u6253\u5f00\u8fdb\u884c\u7f16\u8f91\uff0c\u540c\u65f6\u7531\u4e8e csv \u6587\u4ef6\u5b9e\u9645\u662f\u4ee5\u90fd\u597d\u5206\u9694\u7684\u6587\u672c\u6587\u4ef6\uff0c\u4ee3\u7801\u4e2d\u53ef\u4ee5\u5728\u4e0d\u4f9d\u8d56\u4e09\u65b9\u5e93\u7684\u60c5\u51b5\u4e0b\u65b9\u4fbf\u5feb\u901f\u7684\u89e3\u6790\u5b83\uff0c\u53ef\u64cd\u4f5c\u6027\u548c\u53ef\u7ef4\u62a4\u6027\u8f83\u9ad8\u3002 \u5404\u4e2a\u5e94\u7528\u4e4b\u95f4\uff0c\u7528\u4f8b\u3001\u65b9\u6cd5\u3001\u6807\u7b7e\u548c\u8d44\u6e90\u90fd\u662f\u76f8\u4e92\u72ec\u7acb\u7684\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u7528\u4f8b\u65f6\u53ea\u9700\u8981\u81ea\u5df1\u5e94\u7528\u4e0b\u7684\u65b9\u6cd5\u548c\u516c\u5171\u5e93\u5373\u53ef\u3002 \u7ed3\u6784\u4e3e\u4f8b\uff1a .\n\u251c\u2500\u2500 apps\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_album # \u5e94\u7528\u540d (\u7528\u4e0b\u5212\u7ebf\u8fde\u63a5\u662f Python \u7f16\u7801\u89c4\u8303)\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_assert # \u65ad\u8a00\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_function_tag.csv # \u7528\u4f8b\u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 asan_cases # \u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases # \u529f\u80fd\u6d4b\u8bd5\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 res # \u6d4b\u8bd5\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config # \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_widget # \u5e94\u7528\u81ea\u5df1\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_widget # \u65b9\u6cd5\u57fa\u7c7b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 other_widget # \u8c03\u7528\u5176\u4ed6\u5e94\u7528\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_camera\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases\n\u2502\u00a0\u00a0 \u2502\u00a0 ...\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 public_widget # \u516c\u5171\u65b9\u6cd5\u5e93\n\u251c\u2500\u2500 config # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n...\n config \u914d\u7f6e\u6a21\u5757\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u76f8\u5e94\u914d\u7f6e\uff0c\u6d4b\u8bd5\u540c\u5b66\u53ef\u4ee5\u6839\u636e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5728 config \u91cc\u9762\u8fdb\u884c\u914d\u7f6e\u3002 \u5168\u5c40\u914d\u7f6e\uff1a \u6267\u884c\u4e00\u4e2a\u6216\u591a\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff1a\u5728 pattern \u91cc\u9762\u5199\u5165\u5e94\u7528\u5305\u540d\uff0c\u591a\u4e2a\u5e94\u7528\u4e4b\u95f4\u7528 or \u8fde\u63a5\uff0c\u5982 deepin-music or deepin-movie\uff1b \u5192\u70df\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a smoke\uff1b \u96c6\u6210\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a core \uff1b \u5168\u91cf\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u4e3a\u7a7a\u5373\u53ef\uff1b \u901a\u8fc7 tags \u7684\u914d\u7f6e\u6bd4\u8f83\u7075\u6d3b\uff0c\u540e\u9762\u6807\u7b7e\u5316\u7ba1\u7406\u7ae0\u8282\u4f1a\u8bb2\u5230\uff0c\u652f\u6301\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u7075\u6d3b\u914d\u7f6e\u3002 \u6307\u5b9a\u67d0\u53f0\u673a\u5668\u5728\u6307\u5b9a\u955c\u50cf\u7248\u672c\u4e0a\u6267\u884c\u7528\u4f8b\uff1a\u5728 IP \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a IP\uff0c\u5e76\u5728 URL \u91cc\u9762\u586b\u5165\u955c\u50cf\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u6846\u67b6\u4f1a\u8c03\u7528 PXE \u8fdb\u884c\u81ea\u52a8\u88c5\u673a\uff0c\u88c5\u673a\u5b8c\u4e4b\u540e\u81ea\u52a8\u5f00\u59cb\u6267\u884c\u914d\u7f6e\u7684\u6d4b\u8bd5\u7528\u4f8b\u3002 \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\uff1a \u6bcf\u4e2a\u5e94\u7528\u5185\u90e8\u4f1a\u6709\u4e00\u4e2a\u5355\u72ec\u7684\u914d\u7f6e\u6a21\u5757\uff0c\u4f1a\u5305\u542b\u4e00\u4e9b\u672c\u5e94\u7528\u7684\u6d4b\u8bd5\u8d44\u6e90\u7684\u8def\u5f84\u3001\u6267\u884c\u7528\u4f8b\u7684\u6807\u7b7e\u914d\u7f6e\u7b49\u7b49\uff0c\u5982\u679c\u5728\u5c40\u90e8\u914d\u7f6e\u91cc\u9762\u914d\u7f6e\u4e86\u7528\u4f8b\u6267\u884c\u6807\u7b7e\uff0c\u800c\u5916\u5c42 runner \u51fa\u6ca1\u6709\u6307\u5b9a\u6267\u884c\u6807\u7b7e\uff0c\u5219\u5728\u6267\u884c\u65f6\u53ea\u4f1a\u6267\u884c\u5c40\u90e8\u914d\u7f6e\u5df2\u914d\u7f6e\u7684\uff0c\u82e5\u5916\u5c42 runner \u4e5f\u914d\u7f6e\u4e86\u6267\u884c\u6807\u7b7e\uff0c\u5219\u4f1a\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u7528\u4f8b\u3002 \u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u914d\u7f6e\u90fd\u5728\u540c\u4e00\u4e2a\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\uff0cpy \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684\u7c7b\uff0cini \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684 option\u3002 \u5168\u5c40\u914d\u7f6e\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u7b56\u7565\u5982\u4e0b\uff1a \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5c40\u90e8\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5e94\u7528\u5c42\uff1arunner \u662f\u6d4b\u8bd5\u6267\u884c\u7684\u5165\u53e3\uff0c\u5b83\u4f1a\u6839\u636e\u914d\u7f6e\u91cc\u9762\u7684\u914d\u7f6e\u9879\uff0c\u8fdb\u884c\u7528\u4f8b\u7684\u52a0\u8f7d\u548c\u6267\u884c\u3002\u5b83\u63d0\u4f9b\u63a5\u53e3\u7ed9\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\uff0c\u5e73\u53f0\u4e0a\u7684\u6307\u4ee4\u5b9e\u9645\u4e0a\u90fd\u662f\u901a\u8fc7\u4e0b\u53d1\u7ed9 runner\uff0c\u7136\u540e\u7531 runner \u6765\u6267\u884c\u76f8\u5e94\u7684\u6d4b\u8bd5\u3002 \u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u662f\u4e00\u4e2a\u524d\u7aef\u7cfb\u7edf\uff0c\u53ef\u4ee5\u8fdb\u884c\u6d4b\u8bd5\u673a\u7ba1\u7406\u3001\u81ea\u52a8\u5b89\u88c5\u955c\u50cf\u3001\u81ea\u52a8\u5b89\u88c5\u6307\u5b9a\u5e94\u7528\u7248\u672c\u3001\u8fdb\u884c\u6d4b\u8bd5\u7528\u4f8b\u8303\u56f4\u9009\u62e9\u3001\u7528\u4f8b\u89e6\u53d1\u6267\u884c\u63a7\u5236\u3001\u7ed3\u679c\u5c55\u793a\u8f93\u51fa\u7b49\u3002 \u4e00\u4e2a\u5e94\u7528\u7684\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\u90fd\u53ef\u4ee5\u5355\u72ec\u89e6\u53d1\u3002 \u517c\u5bb9\u6027\u6d4b\u8bd5\u4e3b\u8981\u901a\u8fc7 PXE \u670d\u52a1\u5668\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u88c5\u673a\uff0c\u7136\u540e\u914d\u5408 AT \u8fdb\u884c\u6d4b\u8bd5\uff0c\u53ef\u4ee5\u5b9e\u73b0\u4e0d\u540c\u7cfb\u7edf\u7248\u672c\u3001\u4e0d\u540c\u5e94\u7528\u7248\u672c\u73af\u5883\u4e0a\u90fd\u53ef\u4ee5\u8fdb\u884c\u81ea\u52a8\u5316\u7684 AT \u6267\u884c\uff0c\u63d0\u9ad8\u517c\u5bb9\u6027\u6d4b\u8bd5\u6548\u7387\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_4","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_2","title":"1\u3001\u7528\u4f8b\u89e3\u8026","text":"\u5b58\u5728\u8026\u5408\u5173\u7cfb\u7684\u65b9\u6cd5\uff1a\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u88ab\u5916\u90e8\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\uff0c\u5219\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u8026\u5408\u5173\u7cfb\u3002 1.1\u3001\u901a\u8fc7\u7f16\u8f91\u5668 Find Usages \u67e5\u770b\u6bcf\u4e2a\u65b9\u6cd5\u88ab\u8c03\u7528\u7684\u8def\u5f84\u548c\u88ab\u8c03\u7528\u6b21\u6570\uff1b 1.2\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 1 \u4e2a\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728\u5916\u90e8\u5e94\u7528\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1b 1.3\u3001\u64cd\u4f5c\u5c42\u6587\u4ef6\u540d\u5747\u4ee5 widget \u7ed3\u5c3e\uff0c\u7c7b\u540d\u4ee5 Widget \u7ed3\u5c3e\uff0c\u5982\uff1a\u6587\u4ef6\u540d music_widget.py \uff1a class MusicWidget:\n\"\"\"\u97f3\u4e50\u7684\u64cd\u4f5c\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_2","title":"2\u3001\u516c\u5171\u5e93\u5efa\u8bbe","text":"2.1\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 2 \u4e2a\u53ca\u4ee5\u4e0a\u7684\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728 public_widget \u76ee\u5f55\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1bpublic_widget \u5373\u4e3a\u516c\u5171\u65b9\u6cd5\u5e93\uff1b 2.2\u3001\u5728\u7528\u4f8b\u5c42\u4fee\u6539\u7528\u4f8b\u4e2d\u7c7b\u7684\u5bfc\u5165\u8def\u5f84\uff0c\u5c5e\u4e8e\u516c\u5171\u65b9\u6cd5\u7684\u5219\u8c03\u7528 public_widget \u4e2d\u7684\u7c7b\uff0c\u5916\u90e8\u5e94\u7528\u7684\u64cd\u4f5c\u65b9\u6cd5\uff0c\u5219\u8c03\u7528\u672c\u5e94\u7528\u76ee\u5f55\u4e0b\u91cd\u5199\u7684\u5916\u90e8\u5e94\u7528\u65b9\u6cd5\u3002 \u6bd4\u5982\uff1a\u51e0\u4e4e\u6240\u6709\u591a\u5a92\u4f53\u5e94\u7528\u90fd\u9700\u8981\u901a\u8fc7\u6587\u7ba1\u52a0\u8f7d\u8d44\u6e90\uff0c\u8c03\u8d77\u7684\u6587\u7ba1\u5bf9\u8bdd\u6846\u5b9e\u9645\u4e3a dde-desktop\uff0c\u56e0\u6b64\u5c06 desktop_widget.py \u653e\u5230 public_widget \u91cc\u9762\uff1a class DdeDesktopPublicWidget:\n\"\"\"\u516c\u5171-\u684c\u9762\u7684\u64cd\u4f5c\u65b9\u6cd5\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3_1","title":"3\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406","text":"3.1\u3001\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1a\u5bf9\u5e94 core\u3001smoke\uff0c\u6216\u4e3a\u7a7a\uff1b \u7528\u4f8b\u6765\u6e90\uff1a\u5bf9\u5e94 PMS \u7528\u4f8b\u6765\u6e90\uff0c\u5206\u522b\u7528 acp1\u3001acp2\u3001acp3\u3001acp4 \u8868\u793a\u3002 acp1 \uff1a\u4e1a\u52a1\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5199\u7684\u7528\u4f8b\uff0c\u88ab\u7528\u4e8e\u9a8c\u6536\u6d4b\u8bd5\u7684\uff1b acp2 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5f15\u5165\u7684\u4ea7\u54c1\u9a8c\u6536\u6d4b\u8bc4\u90e8\u7684\u7528\u4f8b\uff1b acp3 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u6839\u636e\u4ea7\u54c1\u9700\u6c42\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\uff1b acp4 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u901a\u8fc7\u793e\u533a\u3001\u8bba\u575b\u7528\u6237\u53cd\u9988\u95ee\u9898\u603b\u7ed3\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\u3002 \u4e3e\u4f8b\uff1a \u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u7528\u4f8b\u6765\u6e90 001 L1 core acp1 \u6807\u7b7e\u91c7\u7528\u679a\u4e3e\u7684\u65b9\u5f0f\u8fdb\u884c\u4ee3\u53f7\u7ba1\u7406\u65b9\u4fbf\u7ba1\u7406\u4ee5\u53ca\u540e\u7eed\u6269\u5c55\u3002 3.2\u3001\u5728\u6bcf\u4e2a\u5e94\u7528\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u7b2c\u4e00\u5217\u4e3a\u7528\u4f8b\u7684 ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ba1\u7406\u6a21\u5757\u5185\u7684\u7528\u4f8b\u6807\u7b7e\u3002\u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 3.3\u3001\u5bf9\u7167 PMS \u4e0a\u7528\u4f8b\u7b49\u7ea7\u3001\u7528\u4f8b\u7c7b\u578b\u548c\u7528\u4f8b\u6765\u6e90\uff0c\u6807\u8bb0\u6240\u6709\u5df2\u5b9e\u73b0\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u540e\u7eed\u7f16\u5199\u65b0\u589e\u81ea\u52a8\u5316\u7528\u4f8b\u65f6\uff0c\u6bcf\u5199\u4e00\u6761\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684 csv \u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u6b64\u6761\u7528\u4f8b\u7684\u6807\u7b7e\u3002 3.4\u3001\u8df3\u8fc7\u7528\u4f8b\u6807\u7b7e\u5316 \u73b0\u6709\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a\uff1a \u4e3e\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u8bb0\u4e3a \u201cskip-\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u8bb0\uff0c\u5982\u679c\u5df2\u7ecf\u6807\u8bb0\u4e86\u8df3\u8fc7\u539f\u56e0\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u8bb0\u4e3a SKIPED\uff0c\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\u3002 \u6240\u6709\u7684\u6807\u7b7e\u5728 docs \u76ee\u5f55\u4e0b\u4f1a\u6709\u4e00\u4e2a\u6587\u6863\uff0c\u6587\u6863\u6682\u5b9a\u540d\u79f0\u4e3a\uff1atags_info.md\uff0c\u7528\u4e8e\u8bf4\u660e\u73b0\u5728\u5df2\u7ecf\u4f7f\u7528\u5230\u7684\u6807\u7b7e\uff0c\u4ee5\u53ca\u8fd9\u4e9b\u6807\u7b7e\u7684\u89e3\u91ca\u548c\u7528\u6cd5\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#4","title":"4\u3001\u7528\u4f8b\u6267\u884c","text":"4.1\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u7684\u9a71\u52a8\u6267\u884c\u903b\u8f91\u529f\u80fd\u5b9e\u73b0 \u5f00\u53d1\u6839\u636e\u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\u91cc\u9762\u7684\u7528\u4f8b\u6807\u7b7e\u6267\u884c\u5bf9\u5e94\u7528\u4f8b\u7684\u529f\u80fd\uff0c\u80fd\u652f\u6301\u591a\u4e2a\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u6267\u884c\u5165\u53e3\u80fd\u968f\u610f\u901a\u8fc7\u7528\u4f8b\u6807\u7b7e\u6307\u5b9a\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002 \u7528\u4f8b\u6807\u7b7e\u7684\u9a71\u52a8\u65b9\u5f0f\u5fc5\u987b\u80fd\u652f\u6301\u6807\u7b7e\u7684\u6269\u5c55\uff0c\u672a\u6765\u968f\u7740\u4e1a\u52a1\u7684\u53d8\u5316\u53ef\u80fd\u9700\u8981\u589e\u52a0\u5404\u79cd\u5404\u6837\u7684\u6807\u7b7e\u3002 4.2\u3001\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u6267\u884c \u529f\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u3001\u6027\u80fd\u6d4b\u8bd5\u7b49\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u662f\u5206\u5f00\u6267\u884c\u7684\uff0c\u4e5f\u5c31\u662f\u5728\u4e00\u6b21\u6267\u884c\u4e2d\uff0c\u53ea\u80fd\u6267\u884c\u5176\u4e2d\u4e00\u79cd\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5177\u4f53\u8981\u6267\u884c\u54ea\u4e00\u79cd\u540c\u6837\u901a\u8fc7\u53c2\u6570\u6765\u63a7\u5236\u3002 4.3\u3001\u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c \u7531\u4e8e\u6d4b\u8bd5\u673a\u8d44\u6e90\u6709\u9650\uff0c\u968f\u7740\u81ea\u52a8\u5316\u7528\u4f8b\u6570\u91cf\u7684\u589e\u52a0\uff0cCI \u6267\u884c\u65f6\u95f4\u4f1a\u8d8a\u6765\u8d8a\u957f\u3002 \u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c\u7684\u529f\u80fd\uff1a \u540c\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\u5206\u6563\u5230\u4e0d\u540c\u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u4e0a\u6267\u884c\uff0c\u7f29\u77ed\u6267\u884c\u603b\u65f6\u95f4\uff1b \u7b2c\u4e8c\u5929\u8dd1\u7684\u65f6\u5019\u540c\u4e00\u4e2a\u673a\u5668\u4e0a\u4f1a\u6267\u884c\u6628\u5929\u6ca1\u6709\u6267\u884c\u5230\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u6267\u884c\u540c\u7406\uff1b \u53ef\u4ee5\u5b9e\u73b0\u5728\u5168\u67b6\u6784\u6d4b\u8bd5\u673a\u4e0a\u8f6e\u6d41\u6267\u884c\u7528\u4f8b\uff0c\u65e2\u80fd\u4fdd\u8bc1\u6267\u884c\u4e86\u6240\u6709\u7684\u7528\u4f8b\uff0c\u53c8\u80fd\u5728\u8d44\u6e90\u6709\u9650\u7684\u60c5\u51b5\u4e0b\u8986\u76d6\u4e86\u6240\u6709\u7684\u67b6\u6784\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#5","title":"5\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0","text":"5.1\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u4f5c\u4e3a\u524d\u7aef\u754c\u9762\u7cfb\u7edf\uff0c\u901a\u8fc7\u9875\u9762\u4e0a\u7684\u4e00\u4e9b\u529f\u80fd\u9009\u9879\u8fdb\u884c\u5bf9\u5e94\u6d4b\u8bd5\u4efb\u52a1\u7684\u7ba1\u7406\u6216\u89e6\u53d1\uff0c\u4e1a\u5185\u6bd4\u8f83\u6d41\u884c\u7684\u5b9e\u73b0\u65b9\u6848\u662f\u4f7f\u7528 Vue + DRF \u5b9e\u73b0\u4e00\u4e2a\u524d\u540e\u7aef\u5206\u79bb\u7684\u7cfb\u7edf\u3002 \u6d4b\u8bd5\u5e73\u53f0\u53ef\u80fd\u4f1a\u6d89\u53ca\u5230\u7684\u6a21\u5757\u6709\uff1a\u6d4b\u8bd5\u673a\u8d44\u6e90\u7ba1\u7406\u6a21\u5757\u3001\u7528\u4f8b\u6267\u884c\u63a7\u5236\u6a21\u5757\u3001\u7ed3\u679c\u5c55\u793a\u6a21\u5757\u3001PXE \u955c\u50cf\u5b89\u88c5\u6a21\u5757\u7b49\u3002 \u7528\u6237\uff08\u6d4b\u8bd5\u3001\u7814\u53d1\u540c\u5b66\u7b49\uff09\u53ef\u4ee5\u914d\u7f6e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5982\u6267\u884c\u54ea\u4e2a\u5e94\u7528\u3001\u6267\u884c\u7528\u4f8b\u7684\u8303\u56f4\u3001\u5728\u54ea\u53f0\u673a\u5668\u4e0a\u6267\u884c\u3001\u955c\u50cf\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u5e94\u7528\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u6267\u884c\u65f6\u95f4\u3002 5.2\u3001\u6267\u884c\u5165\u53e3 runner \u63d0\u4f9b\u7ed9\u6d4b\u8bd5\u5e73\u53f0\u7684\u63a5\u53e3\u5305\u62ec\uff1a\u7528\u4f8b\u6267\u884c\u63a5\u53e3\u3001\u7ed3\u679c\u8fd4\u56de\u63a5\u53e3\u3001\u955c\u50cf\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u955c\u50cf\u5b89\u88c5\u63a5\u53e3\u3001\u5e94\u7528\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u5e94\u7528\u5b89\u88c5\u66f4\u65b0\u63a5\u53e3\u7b49\u3002 \u524d\u7aef\u5e73\u53f0\u76ee\u524d\u8fd8\u6ca1\u6709\u592a\u591a\u8be6\u7ec6\u7684\u65b9\u6848\uff0c\u672c\u6b21\u8bbe\u8ba1\u4e3b\u8981\u96c6\u4e2d\u5728\u540e\u7aef\u8fd9\u90e8\u5206\u67b6\u6784\u7684\u8bbe\u8ba1\u4e0a\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_5","title":"\u56db\u3001\u5b9e\u65bd\u8ba1\u5212","text":"\u8fd1\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u6587\u7ba1\u4ee3\u7801\u89e3\u8026 2022/3/28 2022/4/8 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u56fe\u5f62\u56fe\u50cf\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u97f3\u89c6\u9891\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5168\u5c40\u641c\u7d22\u4ee3\u7801\u89e3\u8026 2022/4/25 2022/4/26 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u516c\u5171\u5e93\u5efa\u8bbe 2022/4/27 2022/5/5 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5c01\u88c5\u7684\u65b9\u6cd5\u6574\u7406\u6210\u4e00\u4e2a\u8868 2022/5/6 2022/5/10 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7528\u4f8b\u6807\u7b7e\u5206\u7c7b\u8bc4\u4f30 2022/5/11 2022/5/11 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u6807\u7b7e\u5316\u6267\u884c\u9a71\u52a8\u7a0b\u5e8f\u7f16\u5199 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u9700\u5b9e\u73b0\u81ea\u52a8\u89e3\u6790 csv \u8868\u683c\u4e2d\u7684\u7528\u4f8b\u7f16\u53f7 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u722c\u866b\u811a\u672c\uff0c\u722c\u53d6 pms \u4e0a\u7528\u4f8b\u7684\u6807\u7b7e 2022/5/11 2022/5/13 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u5b9a\u65f6\u81ea\u52a8\u7ef4\u62a4\u672c\u5730 csv \u6587\u4ef6\u811a\u672c 2022/5/11 2022/5/20 \u4e2d\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u76ee\u5f55\u7ed3\u6784\u8c03\u6574 2022/5/20 2022/6/2 \u5b8c\u6210\u5168\u5c40\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u5177\u4f53\u65b9\u6848\u548c\u903b\u8f91\u5b9e\u73b0 2022/6/6 2022/6/17 \u9759\u6001\u626b\u63cf\u95ee\u9898\u6e05\u96f6 2022/6/20 2022/7/1 \u5b8c\u6210\u65b0\u6846\u67b6\u4f7f\u7528\u57f9\u8bad 2022/7/4 2022/7/11 \u843d\u5730\u8fd0\u884c 2022/7/12 2022/7/20 \u5e95\u5c42\u5e93\u7528\u9014\u8bf4\u660e\u6587\u6863\u7f16\u5199 2022/7/21 2022/7/28"}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\u200b\\u3000\\-\u3001\u3002\uff0c\uff0e\uff1f\uff01\uff1b]+","pipeline":["stemmer"]},"docs":[{"location":"","title":"\u9996\u9875","text":""},{"location":"#youqu","title":"\u6709\u8da3\uff08YouQu\uff09","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/4/1\n# Author : Mikigo\n# =============================================\n \u672c\u7ad9\u603b\u8bbf\u95ee\u91cf \u6b21 \u6b22\u8fce\u5728\u6d4f\u89c8\u5668\u8bbf\u95ee\u3010\u516c\u7f51\u6587\u6863\u3011 \u7edf\u4fe1\u516c\u53f8\u5185\u7f51\u8fd8\u53ef\u4ee5\u8bbf\u95ee\u3010\u5185\u7f51\u6587\u6863\u3011\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u54e6~~"},{"location":"#_1","title":"\u4e00\u3001\u7b80\u4ecb","text":"\u6709\u8da3\uff08YouQu\uff09\u662f\u6df1\u5ea6\u79d1\u6280\u8bbe\u8ba1\u548c\u5f00\u53d1\u7684\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff0c\u91c7\u7528\u7ed3\u6784\u5206\u5c42\u7684\u8bbe\u8ba1\u7406\u5ff5\uff0c\u652f\u6301\u591a\u5143\u5316\u5143\u7d20\u5b9a\u4f4d\u548c\u65ad\u8a00\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\u3001\u5f3a\u5927\u7684\u65e5\u5fd7\u548c\u62a5\u544a\u8f93\u51fa\u7b49\u7279\u8272\u529f\u80fd\uff0c\u540c\u65f6\u5b8c\u7f8e\u517c\u5bb9X11\u3001Wayland\u663e\u793a\u534f\u8bae\uff0c\u73af\u5883\u90e8\u7f72\u7b80\u5355\uff0c\u64cd\u4f5c\u6613\u4e0a\u624b\u3002"},{"location":"#17","title":"\u7231\u4e0a \u201c\u6709\u8da3\u201d \u7684 17 \u4e2a\u7406\u7531","text":" \u6838\u5fc3\u5e93\u63d0\u4f9b\u4e86\u7edf\u4e00\u7684\u63a5\u53e3\uff0c\u7f16\u5199\u65b9\u6cd5\u65f6\u53ea\u9700\u8981\u5bfc\u5165\u4e00\u4e2a\u5305\u5c31\u53ef\u4ee5\u4f7f\u7528\u5230\u6838\u5fc3\u5e93\u63d0\u4f9b\u7684\u6240\u6709\u529f\u80fd\uff1b \u516c\u5171\u5e93\u5c01\u88c5\u4e86\u5f88\u591a\u5e38\u7528\u6a21\u5757\u7684\u76f8\u5173\u65b9\u6cd5\uff0c\u6bd4\u5982\uff1a\u4efb\u52a1\u680f\u7684\u64cd\u4f5c\u3001\u684c\u9762\u7684\u64cd\u4f5c\u3001\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\u7b49\u7b49\uff1b \u9664\u4e86\u5e38\u7528\u7684\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u8bc6\u522b\u4ee5\u5916\uff0c\u6211\u4eec\u8fd8\u63d0\u4f9b\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u5176\u4f7f\u7528\u7b80\u5355\u4e14\u9ad8\u6548\uff0c\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff1b \u5bf9\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u5c06\u7f16\u5199\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u53d8\u5f97\u7b80\u5355\u800c\u4f18\u96c5\uff1b \u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u6280\u672f\u8fdb\u884c\u529f\u80fd\u5347\u7ea7\uff0c\u9664\u4e86\u652f\u6301\u5355\u4e2a\u5750\u6807\u8fd4\u56de\uff0c\u8fd8\u652f\u6301\u540c\u4e00\u754c\u9762\u4e0b\u591a\u4e2a\u76f8\u540c\u5143\u7d20\u8fd4\u56de\u591a\u4e2a\u5750\u6807\u7684\u529f\u80fd\uff1b \u63d0\u4f9b\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u548c\u6279\u91cf\u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u4e0d\u5230\u4e00\u4e2a csv \u6587\u4ef6\u539f\u6765\u80fd\u5e72\u8fd9\u4e48\u591a\u4e8b\u60c5\uff1b \u63d0\u4f9b\u4e86\u529f\u80fd\u5f3a\u5927\u7684\u6267\u884c\u5668\u5165\u53e3\uff0c\u8ba9\u4f60\u53ef\u4ee5\u65b9\u4fbf\u7684\u5728\u672c\u5730\u6267\u884c\u4efb\u4f55\u7528\u4f8b\u96c6\u7684\u7528\u4f8b\uff0c\u5176\u4e30\u5bcc\u7684\u81ea\u5b9a\u4e49\u914d\u7f6e\u9879\uff0c\u6ee1\u8db3\u4f60\u5bf9\u6267\u884c\u5668\u6240\u6709\u7684\u5e7b\u60f3\uff1b \u63d0\u4f9b\u8fdc\u7a0b\u6267\u884c\u7684\u529f\u80fd\uff0c\u53ef\u4ee5\u63a7\u5236\u591a\u53f0\u673a\u5668\u5e76\u884c\u8dd1\uff0c\u6216\u8005\u5206\u5e03\u5f0f\u8dd1\uff0c\u8fd9\u79cd\u4ed8\u8d39\u529f\u80fd\u73b0\u5728\u514d\u8d39\u7ed9\u4f60\u7528\uff1b \u63d0\u4f9b\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u529f\u80fd\uff0c\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u6bcf\u4e2a\u65b9\u6cd5\u5355\u72ec\u5199\u8f93\u51fa\u65e5\u5fd7\u7684\u4ee3\u7801\uff0c\u4e00\u5207\u6211\u4eec\u7ed9\u4f60\u641e\u5b9a\u4e86\uff0c\u65e5\u5fd7\u8f93\u51fa\u4e0d\u4ec5\u5185\u5bb9\u4e30\u5bcc\uff0c\u989c\u503c\u4e5f\u7edd\u5bf9\u5728\u7ebf\uff0c\u6211\u4eec\u8fd8\u81ea\u5df1\u8bbe\u8ba1\u4e86\u4e00\u6b3e\u7ec8\u7aef\u8f93\u51fa\u4e3b\u9898\u53eb\u300a\u4e94\u5f69\u6591\u6593\u7684\u9ed1\u300b\uff1b \u63d0\u4f9b\u4e86\u4e00\u952e\u90e8\u7f72\u81ea\u52a8\u5316\u6d4b\u8bd5\u73af\u5883\u7684\u529f\u80fd\uff0c\u8fde\u4ee3\u7801\u7f16\u8f91\u5668\u90fd\u7ed9\u4f60\u88c5\u597d\u4e86\uff0c\u8ba9\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u73af\u5883\u90e8\u7f72\u800c\u70e6\u607c\uff1b \u63d0\u4f9b\u4e86\u81ea\u52a8\u751f\u6210\u591a\u79cd\u62a5\u544a\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u8f93\u51fa\u4ec0\u4e48\u62a5\u544a\u5f62\u5f0f\u90fd\u884c\uff0c\u800c\u4e14\u6211\u4eec\u5728\u62a5\u544a\u4e2d\u8fd8\u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\u548c\u5931\u8d25\u622a\u56fe\u7684\u529f\u80fd\uff1b \u5bf9\u65ad\u8a00\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u63d0\u4f9b\u66f4\u53cb\u597d\u5316\u7684\u9519\u8bef\u63d0\u793a\uff0c\u8ba9\u5b9a\u4f4d\u95ee\u9898\u7cbe\u51c6\u9ad8\u6548\uff1b \u4e0d\u4ec5\u652f\u6301\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u63a7\u5236\uff0c\u800c\u4e14\u8fd8\u652f\u6301\u52a8\u6001\u63a7\u5236\u7528\u4f8b\u6279\u91cf\u6267\u884c\u7684\u603b\u65f6\u95f4\uff0c\u786e\u4fdd CI \u73af\u5883\u4e0b\u80fd\u987a\u7545\u8fd0\u884c\uff1b \u652f\u6301\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\u6267\u884c\u3001PMS \u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6807\u7b7e\u5316\u6267\u884c\u65b9\u6848\uff0c\u6ee1\u8db3\u4f60\u5404\u79cd\u573a\u666f\u4e0b\u7684\u6267\u884c\u9700\u6c42\uff1b \u652f\u6301\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u529f\u80fd\uff0c\u53ef\u5b9a\u4f4d\u53ef\u65ad\u8a00\uff0c\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\uff1b \u5b8c\u7f8e\u517c\u5bb9 Wayland \u548c X11\uff0c\u771f\u6b63\u505a\u5230\u4e00\u5957\u4ee3\u7801\uff0c\u968f\u5904\u6267\u884c\uff1b \u652f\u6301\u591a\u79cd\u65b9\u5f0f\u7684\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u5176\u4e2d\u5f02\u6b65\u56de\u586b\u7684\u65b9\u6848\uff0c\u5b8c\u7f8e\u89e3\u51b3\u4e86\u6570\u636e\u56de\u586b\u7684\u8017\u65f6\u95ee\u9898\uff1b \u3010\u89c6\u9891\u4ecb\u7ecd\u3011"},{"location":"#_2","title":"\u4e8c\u3001\u5b89\u88c5\u4f7f\u7528","text":"\u57fa\u7840\u6846\u67b6\uff1ahttps://github.com/linuxdeepin/deepin-autotest-framework \u4ece PyPI \u5b89\u88c5: sudo pip3 install youqu\n \u521b\u5efa\u9879\u76ee: youqu-startproject youqu\n \u5b89\u88c5\u4f9d\u8d56: cd youqu\nbash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002 \u5e94\u7528\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684\u5e94\u7528\u540d\u79f0\u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music cd apps/\n \u5c06\u5e94\u7528\u5e93\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u50cf\u8fd9\u6837\uff1a youqu\n\u251c\u2500\u2500 apps\n\u2502 \u251c\u2500\u2500 autotest_deepin_music # \u5e94\u7528\u5e93\n...\n \u5e94\u7528\u5e93\u7684\u540d\u79f0\u4e0d\u53ef\u4ee5\u4fee\u6539\u3002"},{"location":"#_3","title":"\u4e09\u3001\u8fd0\u884c","text":""},{"location":"#1","title":"1. \u5de5\u4f5c\u7a7a\u95f4","text":"\u57fa\u7840\u6846\u67b6\u5de5\u7a0b\u76ee\u5f55\u5efa\u8bae\u653e\u5728 ~ \u76ee\u5f55\u4e0b\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u4e5f\u53ef\u4ee5\u8fd0\u884c\uff0c\u4f46\u662f\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u9700\u8981\u505a\u73af\u5883\u6e05\u7406\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u5b58\u5728\u4ee3\u7801\u88ab\u5220\u9664\u7684\u98ce\u9669\u3002 \u5982\u679c\u4f60\u7684\u673a\u5668\u4e0a\u4e0d\u540c\u76ee\u5f55\u4e0b\u5b58\u5728\u591a\u4e2a YouQu \u5de5\u7a0b\uff0c\u90a3\u4e48\u5728\u8fd0\u884c\u4e4b\u524d\uff0c\u8bf7\u5148\u6267\u884c env.sh \u6821\u6b63\u76f8\u5173\u73af\u5883\u3002"},{"location":"#2","title":"2. \u6267\u884c\u5668","text":"\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u6709\u4e00\u4e2a manage.py \uff0c\u5b83\u662f\u4e00\u4e2a\u6267\u884c\u5668\u5165\u53e3\uff0c\u63d0\u4f9b\u4e86\u672c\u5730\u6267\u884c\u3001\u8fdc\u7a0b\u6267\u884c\u7b49\u7684\u529f\u80fd\u3002 \u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6765\u6267\u884c\uff1a youqu manage.py run -a deepin-music\n"},{"location":"#21","title":"2.1. \u672c\u5730\u6267\u884c","text":"youqu manage.py run\n"},{"location":"#211","title":"2.1.1. \u914d\u7f6e\u6587\u4ef6","text":"\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u914d\u7f6e\u53c2\u6570 \u5728\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u91cc\u9762\u652f\u6301\u914d\u7f6e\u5bf9\u6267\u884c\u7684\u4e00\u4e9b\u53c2\u6570\u8fdb\u884c\u914d\u7f6e\uff0c\u5e38\u7528\u7684\u5982\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;-----------------------------------------------\n;1.KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2.KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f\n;e.g. TAGS = L1 or smoke\n;-----------------------------------------------\n;\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\uff0c\u5c06\u8981\u6267\u884c\u7684\u7528\u4f8b\u5199\u5165\u6307\u5b9a\u7684 csv \u6587\u4ef6\n;\u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u4ece\u57fa\u7840\u6846\u67b6\u6839\u76ee\u5f55\u5f00\u59cb\uff1ae.g. CASE_FILE = case_list.txt\n;\u5982\u679c\u8fd9\u91cc\u6709\u503c\uff0cAPP_NAME KEYWORDS TAGS \u7684\u914d\u7f6e\u5747\u4e0d\u751f\u6548\nCASE_FILE =\n;=============================== RUNNER CONFIG ===================================\n[runner]\n;\u6700\u5927\u5931\u8d25\u7528\u4f8b\u6570\u91cf\u7684\u5360\u6bd4\n;\u6bd4\u5982\uff1a\u603b\u6267\u884c\u7528\u4f8b\u6570\u4e3a 100, \u82e5 MAX_FAIL = 0.5,\u5219\u5931\u8d25\u7528\u4f8b\u6570\u8fbe\u5230 50 \u5c31\u4f1a\u7ec8\u6b62\u6d4b\u8bd5\u3002\nMAX_FAIL = 1\n;\u5355\u6761\u7528\u4f8b\u7684\u8d85\u65f6\u65f6\u95f4\uff0c\u5982\u679c\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u8d85\u65f6\uff0c\u8fd9\u6761\u7528\u4f8b\u4f1a\u88ab\u505c\u6b62\uff0c\u540e\u7eed\u7528\u4f8b\u7ee7\u7eed\u6267\u884c\u3002\n;\u5355\u4f4d\u4e3a\u79d2\n;\u8fd9\u662f\u4e00\u4e2a\u5168\u5c40\u7edf\u4e00\u914d\u7f6e\uff0c\u5982\u679c\u67d0\u6761\u7528\u4f8b\u9700\u8981\u5355\u72ec\u914d\u7f6e\u8d85\u65f6\u65f6\u95f4\uff0c\u53ef\u4ee5\u5728\u7528\u4f8b\u4e2d\u8fd9\u6837\u5199\uff1a\n;@pytest.mark.timeout(500)\n;def test_xxx_001():\n; ...\n;\u4f1a\u8bdd\u8d85\u65f6\uff08\u6240\u6709\u7528\u4f8b\u6267\u884c\u7684\u8d85\u65f6\u65f6\u95f4\uff09\u662f\u6839\u636e\u5168\u5c40\u8d85\u65f6\u914d\u7f6e\u548c\u7528\u4f8b\u5355\u72ec\u8d85\u65f6\u914d\u7f6e\u81ea\u52a8\u8ba1\u7b97\u7684\u3002\nCASE_TIME_OUT = 200\n;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\n;\u6ce8\u610f\uff0cRERUN = 1 \u8868\u793a\u91cd\u8dd1 1 \u6b21\uff0c\u5373\u7b2c\u4e00\u6b21\u7528\u4f8b\u6267\u884c\u5931\u8d25\u4f1a\u81ea\u52a8\u91cd\u8dd1 1 \u6b21\uff0c\u603b\u5171\u6267\u884c 2 \u6b21\uff1b\n;\u5982\u679c\u7b2c 2 \u6b21\u6267\u884c\u6210\u529f\uff0c\u7ed3\u679c\u6210\u529f\uff0c\u5931\u8d25\u4ea6\u4e3a\u5931\u8d25\u3002\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c 1 \u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff0cRERUN >= RECORD_FAILED_CASE\u3002\n;1.\u5173\u95ed\u5f55\u5c4f\uff1aRECORD_FAILED_CASE > RERUN\n;2.\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1aRECORD_FAILED_CASE = 0\nRECORD_FAILED_CASE = 1\n;yes \u6bcf\u6761\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u8fdb\u884c\u73af\u5883\u6e05\u7406\nCLEAN_ALL = yes\n;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387, \u6bd4\u5982\uff1a1920x1080\n;no: \u8868\u793a\u4e0d\u505a\u5206\u8fa8\u7387\u6821\u9a8c\nRESOLUTION = 1920x1080\n;\u4e0d\u8df3\u8fc7\u7528\u4f8b\uff0ccsv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86 skip-xxx\u7684\u7528\u4f8b\u4e0d\u8df3\u8fc7\nNOSKIP = no\n;ignore fixed\n;no\uff0c\u53ea\u8981\u6807\u8bb0\u4e86fixed\u7684\u7528\u4f8b\uff0c\u5373\u4f7f\u6807\u8bb0\u4e86skip-\uff0c\u4e5f\u4f1a\u6267\u884c\uff1b\n;yes\uff0cfixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\uff1b\nIFIXED = no\n;\u8981\u5b89\u88c5deb\u5305\u7684\u8def\u5f84\n;e.g : ~/Downloads/ \u5b89\u88c5\u4e0b\u8f7d\u76ee\u5f55\u4e0b\u7684deb\u5305\uff0c\u5982\u679c\u662f\u8fdc\u7a0b\u6267\u884c\uff0c\u4f1a\u81ea\u52a8\u62f7\u8d1d\u5230\u8fdc\u7a0b\u5e76\u5b89\u88c5\u3002\nDEB_PATH =\n;DEBUG \u6a21\u5f0f\u6267\u884c\u7528\u4f8b\uff0c\u53ea\u6536\u96c6\u4e0d\u6267\u884c\u7528\u4f8b\uff0c\u4e5f\u4e0d\u505a\u8bbe\u5907\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002\nDEBUG = no\n;\u8bb0\u5f55top\u547d\u4ee4\u67e5\u8be2\u7684\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0cTOP = 3 \u8868\u793a\u8bb0\u5f55\u524d3\u4e2a\u8fdb\u7a0b\u3002\nTOP =\n;\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\nREPEAT =\n;\u9ed8\u8ba4\u5728\u6240\u6709\u6d4b\u8bd5\u5b8c\u6210\u4e4b\u540e\u8f93\u51fa\u62a5\u9519\u4fe1\u606f.\n;yes, \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\nDURING_FAIL = no\n;\u6ce8\u518c\u81ea\u542f\u670d\u52a1\nAUTOSTART = no\n;=============================== REPORT CONFIG ===================================\n[report]\n;\u6d4b\u8bd5\u62a5\u544a\u7684title\nREPORT_TITLE = YouQu Report\n;\u6d4b\u8bd5\u62a5\u544a\u7684name\nREPORT_NAME = YouQu Report\n;\u6d4b\u8bd5\u62a5\u544a\u7684\u9ed8\u8ba4\u8bed\u8a00\n;en:English\n;ru:\u0420\u0443\u0441\u0441\u043a\u0438\u0439\n;zh:\u4e2d\u6587\n;de:Deutsch\n;nl:Nederlands\n;he:Hebrew\n;br:Brazil\n;pl:Polski\n;ja:\u65e5\u672c\u8a9e\n;es:Espa\u00f1ol\n;kr:\ud55c\uad6d\uc5b4\n;fr:Fran\u00e7ais\n;az:Az\u0259rbaycanca\nREPORT_LANGUAGE = zh\n;\u7528\u4f8b\u6267\u884c\u5b8c\u540e\u751f\u6210\u7684\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n;\u76ee\u524d\u652f\u6301 allure, xml, json \uff08\u652f\u6301\u540c\u65f6\u751f\u6210\uff09\nREPORT_FORMAT = allure, xml, json\n;\u6307\u5b9a\u62a5\u544a\u751f\u6210\u7684\u8def\u5f84\uff08\u76f8\u5bf9\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\uff09\nALLURE_REPORT_PATH = report/\nXML_REPORT_PATH = report/\nJSON_REPORT_PATH = report/\n;=============================== GLOBAL CONFIG ===================================\n[globalconfig]\n;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\nPASSWORD = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\nIMAGE_MATCH_NUMBER = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6bcf\u6b21\u95f4\u9694\u7b49\u5f85\u65f6\u95f4\nIMAGE_MATCH_WAIT_TIME = 1\n;\u56fe\u50cf\u8bc6\u522b\u5339\u914d\u5ea6\nIMAGE_RATE = 0.9\n;\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u5b9e\u65f6\u56fe\u50cf\u4fdd\u5b58\u8def\u5f84\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u5750\u6807\nSCREEN_CACHE = /tmp/screen.png\n;\u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\u7684\u8def\u5f84\nTMPDIR = /tmp/tmpdir\n;\u7cfb\u7edf\u4e3b\u9898\nSYS_THEME = deepin\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = youqu-dev.uniontech.com\n;OpenCV\u670d\u52a1\u7aef\u5730\u5740\nOPENCV_SERVER_HOST = youqu-dev.uniontech.com\n;=============================== PMS CONFIG ===================================\n;PMS\u76f8\u5173\u914d\u7f6e\uff0c\u5305\u542b\u4ee5\u4e0b\u51e0\u4e2a\u65b9\u9762\uff1a\n;1.PMS\u6d4b\u8bd5\u5957\u6267\u884c\n;2.\u81ea\u52a8\u4ecePMS\u722c\u53d6\u6570\u636e\u5e76\u540c\u6b65\u672c\u5730CSV\u6587\u4ef6\n;3.PMS\u6570\u636e\u56de\u586b\n[pms]\n;PMS\u7684\u7528\u6237\u540d,\u5982: ut001234\nPMS_USER =\n;PMS\u7684\u5bc6\u7801\nPMS_PASSWORD =\n;PMS\u6d4b\u8bd5\u5957\u7684ID\n;\u5728PMS\u4e0a\u67e5\u770b\u7528\u4f8b\u201c\u5957\u4ef6\u201d\u94fe\u63a5: https://pms.uniontech.com/testsuite-view-495.html\n;\u6d4b\u8bd5\u5957ID\u4e3a: 495\nSUITE_ID =\n;\u6570\u636e\u56de\u586b\u5fc5\u987b\u5173\u8054PMS\u6d4b\u8bd5\u5355\n;\u5728PMS\u4e0a\u67e5\u770b\u6d4b\u8bd5\u5355\u94fe\u63a5: https://pms.uniontech.com/testtask-cases-20747.html\n;\u6d4b\u8bd5\u5355ID\u4e3a: 20747\nTASK_ID =\n;\u5c06\u6d4b\u8bd5\u7ed3\u679c\u6570\u636e\u56de\u586b\u5230PMS\n;\u4e3a\u7a7a: \u8868\u793a\u4e0d\u56de\u586b,\u4e0d\u4f1a\u5728\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u751f\u6210json\u7ed3\u679c\u6587\u4ef6;\n;async: \u8868\u793a\u9010\u6761\u5f02\u6b65\u56de\u586b,\u540e\u9762\u4e00\u6761\u6267\u884c\u5f00\u59cb\u65f6\u901a\u8fc7\u5b50\u7ebf\u7a0b\u5bf9\u524d\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u8fdb\u884c\u56de\u586b\uff0c\u5982\u6b64\u5b9e\u73b0\u65f6\u95f4\u6548\u7387\u6700\u5927\u5316;\n;finish: \u8868\u793a\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u6210\u4e4b\u540e\u9010\u4e2a\u56de\u586b(PMS\u4e0d\u652f\u6301\u5e76\u53d1);\nSEND_PMS =\n;\u6570\u636e\u56de\u586b\u7684\u89e6\u53d1\u8005\n;auto: \u6846\u67b6\u81ea\u52a8\u56de\u586b,\u914d\u5408SEND_PMS\u914d\u7f6e\u4f7f\u7528,\u4f60\u53ef\u4ee5\u9009\u62e9\u5728\u4e0d\u540c\u7684\u9636\u6bb5\u8fdb\u884c\u6570\u636e\u56de\u586b;\n;hand: \u624b\u52a8\u56de\u586b,\u6bcf\u6761\u7528\u4f8b\u4ecd\u7136\u4f1a\u751f\u6210json\u6587\u4ef6,\u4f46\u6846\u67b6\u4e0d\u4f1a\u8fdb\u884c\u6570\u636e\u56de\u586b,\u9700\u8981\u4f60\u53ef\u4ee5\u5728\u4f60\u60f3\u8981\u53d1\u9001\u7684\u65f6\u95f4\u70b9\u624b\u52a8\u89e6\u53d1\u56de\u586b;\nTRIGGER = auto\n;PMS\u56de\u586b\u7684\u91cd\u8bd5\u6b21\u6570\n;\u5982\u679c\u63a5\u53e3\u8bf7\u6c42\u5931\u8d25,\u4f1a\u8fdb\u884c\u91cd\u8bd5\nSEND_PMS_RETRY_NUMBER = 2\n[csv_link_pms_lib]\n;caselib: \u7528\u4f8b\u5e93\n;testcase: \u4ea7\u54c1\u5e93\u7528\u4f8b\nCASE_FROM = caselib\n[csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/caselib-browse-81.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 81\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic =\n[export_csv]\n;\u5bfc\u51fa\u7684csv\u6587\u4ef6\u540d\u79f0\uff0c\u9ed8\u8ba4 case_list.csv\nCSV_FILE = case_list.csv\n;exportcsv \u547d\u4ee4\u5bfc\u51fa case_list.csv \u6587\u4ef6\u65f6\u914d\u7f6e\u7684\u5b57\u6bb5\u540d\uff0c\u7528\u4f8b\u540d\u79f0\u9ed8\u8ba4\u5b58\u5728\u7b2c\u4e00\u5217\uff0c\u65e0\u9700\u6dfb\u52a0\nCSV_HEARD = \u7528\u4f8b\u7ea7\u522b,\u7528\u4f8b\u7c7b\u578b,\u6d4b\u8bd5\u7ea7\u522b,\u662f\u5426\u8df3\u8fc7\n[log_cli]\n;\u65e5\u5fd7\u76f8\u5173\u914d\u7f6e\uff08\u4e0d\u6253\u5370\u6784\u9020\u51fd\u6570\u548c\u9b54\u6cd5\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff09\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = DEBUG\n# ============= \u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u914d\u7f6e ================\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u5f00\u5934\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7, \u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_STARTSWITH = Assert\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u7ed3\u5c3e\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_ENDSWITH = Widget\n;\u652f\u6301\u7c7b\u540d\u5305\u542b xxx \u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_CONTAIN = ShortCut\n# ==============================================\n \u914d\u7f6e\u5b8c\u6210\u4e4b\u540e\uff0c\u76f4\u63a5\u5728\u547d\u4ee4\u884c\u6267\u884c manage.py \u5c31\u597d\u4e86\u3002 youqu manage.py run\n"},{"location":"#212","title":"2.1.2. \u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a youqu manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -h, --help show this help message and exit\n-a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--record_failed_case RECORD_FAILED_CASE\n\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--max_fail MAX_FAIL \u6700\u5927\u5931\u8d25\u7387\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--resolution RESOLUTION\n\u68c0\u67e5\u5206\u8fa8\u7387\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms {,async,finish}\n\u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--trigger {,auto,hand}\n\u89e6\u53d1\u8005\n-f CASE_FILE, --case_file CASE_FILE\n\u6839\u636e\u6587\u4ef6\u6267\u884c\u7528\u4f8b\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n--pms_user PMS_USER pms \u7528\u6237\u540d\n--pms_password PMS_PASSWORD\npms \u5bc6\u7801\n--suite_id SUITE_ID pms \u6d4b\u8bd5\u5957ID\n--pms_info_file PMS_INFO_FILE\npms \u4fe1\u606f\u6587\u4ef6\n--top TOP \u8fc7\u7a0b\u4e2d\u8bb0\u5f55top\u547d\u4ee4\u4e2d\u7684\u503c\n--lastfailed \u4ec5\u6267\u884c\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\n--duringfail \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\n--repeat REPEAT \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n--project_name PROJECT_NAME\n\u5de5\u7a0b\u540d\u79f0\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--build_location BUILD_LOCATION\n\u6784\u5efa\u5730\u533a\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--line LINE \u6267\u884c\u7684\u4e1a\u52a1\u7ebf\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--autostart AUTOSTART \u7528\u4f8b\u6267\u884c\u7a0b\u5e8f\u6ce8\u518c\u5230\u5f00\u673a\u81ea\u542f\u670d\u52a1\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a youqu manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\"\n \u547d\u4ee4\u884c\u53c2\u6570\u4f18\u5148\u7ea7\u662f\u9ad8\u4e8e\u914d\u7f6e\u6587\u4ef6\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u4e86\u5bf9\u5e94\u7684\u53c2\u6570\uff0c\u914d\u7f6e\u6587\u4ef6\u4e2d\u4e0d\u7ba1\u662f\u5426\u914d\u7f6e\u5747\u4e0d\u751f\u6548\u3002 --app \u5165\u53c2\u8fd8\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\uff0c\u4e0b\u9762\u7684\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u540c\u6837\u652f\u6301\u3002"},{"location":"#22","title":"2.2. \u8fdc\u7a0b\u6267\u884c","text":"\u8fdc\u7a0b\u6267\u884c\u5c31\u662f\u7528\u672c\u5730\u4f5c\u4e3a\u670d\u52a1\u7aef\u63a7\u5236\u8fdc\u7a0b\u673a\u5668\u6267\u884c\uff0c\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u76f8\u540c\uff1b \u4f7f\u7528 remote \u547d\u4ee4\uff1a youqu manage.py remote\n"},{"location":"#221","title":"2.2.1. \u8fdc\u7a0b\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u6267\u884c","text":"\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u6267\u884c\u5c31\u662f\u7531\u672c\u5730 YouQu \u4f5c\u4e3a\u670d\u52a1\u7aef\uff0c\u63a7\u5236\u8fdc\u7a0b N \u53f0\u673a\u5668\u6267\u884c\u76f8\u540c\u7684\u7528\u4f8b\uff0c\u6267\u884c\u5b8c\u4e4b\u540e\u6240\u6709\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u7ed3\u679c\u4f1a\u8fd4\u56de\u7ed9\u670d\u52a1\u7aef report \u76ee\u5f55\u4e0b\uff1b \u8fdc\u7a0b\u6267\u884c\u540c\u6837\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u8fdb\u884c\u7528\u4f8b\u76f8\u5173\u914d\u7f6e\uff1b \u9700\u8981\u91cd\u70b9\u8bf4\u4e00\u4e0b\u8fdc\u7a0b\u6267\u884c\u65f6\u7684\u6d4b\u8bd5\u673a\u4fe1\u606f\u914d\u7f6e\uff0c\u5728\u914d\u7f6e\u6587\u4ef6 setting/remote.ini \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\u3001IP\u3001\u5bc6\u7801\u3002 ;=============================== CLIENT LIST =====================================\n; \u6d4b\u8bd5\u673a\u914d\u7f6e\u5217\u8868\n;[client{number}] ;\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u6709\u591a\u5c11\u53f0\u6d4b\u8bd5\u673a\u5c31\u5199\u591a\u5c11\u4e2a client\uff0c\u522b\u540d\u5fc5\u987b\u5305\u542b client \u5b57\u7b26\uff0c\u4e14\u4e0d\u80fd\u91cd\u590d\u3002\n;user = ;\u6d4b\u8bd5\u673a user\n;ip = ;\u6d4b\u8bd5\u673a ip\n;password = 1 ;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801, \u53ef\u4ee5\u4e0d\u914d\u7f6e\u6b64\u9879\uff0c\u9ed8\u8ba4\u53d6 CLIENT_PASSWORD \u7684\u503c\uff1b\n;\u5982\u679c\u4f60\u6240\u6709\u6d4b\u8bd5\u673a\u5bc6\u7801\u90fd\u76f8\u540c\uff0c\u90a3\u4e48\u53ea\u9700\u8981\u914d\u7f6e CLIENT_PASSWORD \u5c31\u53ef\u4ee5\u4e86\n;=================================================================================\n[client1]\nuser = uos\nip = 10.8.15.xx\n[client2]\nuser = uos\nip = 10.8.15.xx\n[client3]\nuser = uos\nip = 10.8.11.xx\n \u6709\u591a\u5c11\u53f0\u673a\u5668\u5c31\u50cf\u8fd9\u6837\u53c2\u8003\u4e0a\u9762\u7684\u683c\u5f0f\u5199\u5c31\u884c\u4e86\u3002 \u7136\u540e\u5728\u547d\u4ee4\u884c\uff1a youqu manage.py remote\n \u8fd9\u6837\u8fd0\u884c\u662f\u4ece\u914d\u7f6e\u6587\u4ef6\u53bb\u8bfb\u53d6\u76f8\u5173\u914d\u7f6e\u3002 \u5982\u679c\u4f60\u4e0d\u60f3\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\uff0c\u4f60\u4ecd\u7136\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u8fdb\u884c\u4f20\u53c2\uff0c \u4ee5\u4e0b\u4e3a python3 manage.py remote \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -h, --help show this help message and exit\n-c CLIENTS, --clients CLIENTS\n\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679cpassword\u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6sett\ning/remote.ini\u4e2dCLIENT_PASSWORD\u7684\u503c,\u6bd4\u5982: uos@10.8.13.33:1\n\u6216 uos@10.8.13.33\n-s, --send_code \u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a\uff08\u4e0d\u542breport\u76ee\u5f55\uff09\n-e, --build_env \u642d\u5efa\u6d4b\u8bd5\u73af\u5883,\u5982\u679c\u4e3ayes\uff0c\u4e0d\u7ba1send_code\u662f\u5426\u4e3ayes\u90fd\u4f1a\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a.\n-p CLIENT_PASSWORD, --client_password CLIENT_PASSWORD\n\u6d4b\u8bd5\u673a\u5bc6\u7801\uff08\u5168\u5c40\uff09\n-y PARALLEL, --parallel PARALLEL\nyes:\u8868\u793a\u6240\u6709\u6d4b\u8bd5\u673a\u5e76\u884c\u8dd1\uff0c\u6267\u884c\u76f8\u540c\u7684\u6d4b\u8bd5\u7528\u4f8b;no:\u8868\u793a\u6d4b\u8bd5\u673a\u5206\u5e03\u5f0f\u6267\u884c\uff0c\u670d\u52a1\u7aef\u4f1a\u6839\u636e\u6536\u96c6\u5230\u7684\u6d4b\u8bd5\u7528\u4f8b\u81ea\n\u52a8\u5206\u914d\u7ed9\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u3002\n \u9664\u4e86\u8fd9\u4e9b\u7279\u6709\u53c2\u6570\u4ee5\u5916\uff0c\u5b83\u540c\u6837\u652f\u6301\u672c\u5730\u6267\u884c\u7684\u6240\u6709\u53c2\u6570\uff1b \u5728\u547d\u4ee4\u884c\u8fd9\u6837\u8fd0\u884c\uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\"\n \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report \u76ee\u5f55\u4e0b\u56de\u6536\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u7684\u6d4b\u8bd5\u62a5\u544a\u3002 \u6ce8\u610f\uff0c\u5982\u679c\u8fdc\u7a0b\u673a\u5668\u6ca1\u6709\u642d\u5efa\u81ea\u52a8\u5316\u6d4b\u8bd5\u73af\u5883\uff0c\u8bb0\u5f97\u52a0\u4e0a\u53c2\u6570 -e \uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\" -e\n \u6267\u884c\u524d\u786e\u4fdd\u8fdc\u7a0b\u673a\u5668\u5df2\u7ecf\u5f00\u542f\u4e86 ssh \u670d\u52a1\uff0c\u5426\u5219\u4f1a\u63d0\u793a\u65e0\u6cd5\u8fde\u63a5\uff0c\u5982\u679c\u6ca1\u6709\u5f00\u542f\uff0c\u8bf7\u624b\u52a8\u5f00\u542f\uff1a sudo systemctl restart ssh\nsudo systemctl enable ssh\n \u914d\u7f6e\u6587\u4ef6\u5176\u4ed6\u76f8\u5173\u914d\u7f6e\u9879\u8be6\u7ec6\u8bf4\u660e\uff0c\u8bf7\u67e5\u770b\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u6ce8\u91ca\u5185\u5bb9\u3002"},{"location":"#222","title":"2.2.2. \u8fdc\u7a0b\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u8d1f\u8f7d\u5747\u8861\u6267\u884c","text":"\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u8d1f\u8f7d\u5747\u8861\u6267\u884c\u4e5f\u662f\u7528\u672c\u5730\u4f5c\u4e3a\u670d\u52a1\u7aef\u63a7\u5236\u8fdc\u7a0b\u673a\u5668\u6267\u884c\uff0c\u4f46\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u4e0d\u540c\uff0c\u800c\u662f\u6240\u6709\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u4e4b\u548c\uff0c\u4e3a\u4f60\u60f3\u8981\u6267\u884c\u7684\u7528\u4f8b\u96c6\uff1b \u4f3c\u4e4e\u6709\u70b9\u96be\u4ee5\u7406\u89e3\uff0c\u6211\u7528\u5927\u767d\u8bdd\u4e3e\u4f8b\u63cf\u8ff0\u4e0b\u5c31\u662f\uff0c\u670d\u52a1\u7aef\u60f3\u8981\u6267\u884c 10 \u6761\u7528\u4f8b\uff0c\u73b0\u5728\u8fdc\u7a0b\u673a\u5668\u6709 5 \u53f0\uff1b \u7136\u540e\u670d\u52a1\u7aef\u5c31\u5148\u62ff\u7740\u7b2c 1 \u6761\u7528\u4f8b\u7ed9\u8fdc\u7a0b 1 \u53f7\u673a\u6267\u884c\uff0c\u62ff\u7b2c 2 \u6761\u7528\u4f8b\u7ed9\u8fdc\u7a0b 2 \u53f7\u673a\u6267\u884c...\uff0c\u5982\u6b64\u5faa\u73af\u76f4\u5230\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\uff0c\u8fd9\u5c31\u662f\u8d1f\u8f7d\u5747\u8861\u6267\u884c\u3002 \u4f7f\u7528\u65b9\u6cd5\u548c\u524d\u9762\u4e00\u6837\uff0c\u53ea\u662f\u9700\u8981\u589e\u52a0\u4e00\u4e2a\u53c2\u6570\uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\" --parallel no\n"},{"location":"#23-pms","title":"2.3. PMS \u6570\u636e\u56de\u586b","text":"\u6d4b\u8bd5\u5355\u5173\u8054\u7684\u7528\u4f8b\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u5bf9\u5e94\u7684\u53bb\u8dd1\u8fd9\u4e9b\u5173\u8054\u7684\u7528\u4f8b\uff0c\u5e76\u4e14\u5c06\u6267\u884c\u7684\u7ed3\u679c\u56de\u586b\u7684\u6d4b\u8bd5\u7528\u4f8b\u7684\u72b6\u6001\u91cc\u9762\u3002 PMS \u6570\u636e\u56de\u586b\u4e3b\u8981\u6709\u4e09\u79cd\u65b9\u5f0f\uff1a \uff081\uff09\u5f02\u6b65\u56de\u586b \u5728\u7528\u4f8b\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\uff0c\u91c7\u7528\u5f02\u6b65\u7684\u65b9\u5f0f\u53bb\u8fdb\u884c\u6570\u636e\u56de\u586b\uff0c\u76f4\u767d\u7684\u8bb2\u5c31\u662f\uff0c\u7b2c\u4e8c\u6761\u7528\u4f8b\u5f00\u59cb\u8dd1\u7684\u65f6\u5019\uff0c\u901a\u8fc7\u5b50\u7ebf\u7a0b\u53bb\u505a\u7b2c\u4e00\u6761\u7528\u4f8b\u7684\u6570\u636e\u56de\u586b\uff0c\u5982\u6b64\u5faa\u73af\uff0c\u76f4\u5230\u6240\u6709\u7528\u4f8b\u6267\u884c\u7ed3\u675f\uff1b \u8fd9\u79cd\u65b9\u6848\u7684\u65f6\u95f4\u6548\u7387\u6700\u9ad8\u7684\uff0c\u56e0\u4e3a\u7406\u8bba\u4e0a\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u662f\u5927\u4e8e\u6570\u636e\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\u65f6\u95f4\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u5f53\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u6570\u636e\u56de\u586b\u4e5f\u5b8c\u6210\u4e86\u3002 \u4f7f\u7528\u65b9\u6cd5\uff0c\u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u4ee5\u4e0b\u53c2\u6570\uff1a\uff08\u4ee5\u4e0b\u6d89\u53ca\u5230\u7684\u53c2\u6570\u914d\u7f6e\u90fd\u662f\u5728\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u914d\u7f6e\uff09 PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = async\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \u8fd9\u4e2a\u53c2\u6570\u53ef\u586b\u53ef\u4e0d\u586b\uff0c\u4f46\u662f\u586b\u4e86\u53ef\u4ee5\u63d0\u9ad8\u7528\u4f8b\u7684\u6267\u884c\u901f\u5ea6\uff0c\u56e0\u4e3a\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u53ef\u4ee5\u6307\u5b9a\u5230\u5177\u4f53\u7684\u5e94\u7528\u5e93\u3002\uff08\u4e0b\u540c\uff09\n \uff082\uff09\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u56de\u586b \u7b49\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u518d\u9010\u4e2a\u8fdb\u884c\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u6b64\u65b9\u6848\u65f6\u95f4\u6548\u7387\u6bd4\u8f83\u4f4e\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \uff083\uff09\u624b\u52a8\u56de\u586b \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4e0d\u505a\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u540e\u7eed\u624b\u52a8\u5c06\u7ed3\u679c\u8fdb\u884c\u56de\u586b\u8bf7\u6c42\u3002 \u7528\u4f8b\u6267\u884c\u65f6\u914d\u7f6e\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = hand\nAPP_NAME = \u540e\u7eed\u624b\u52a8\u56de\u586b\u65b9\u6cd5\uff1a youqu manage.py pms --send2task yes\n"},{"location":"#_4","title":"\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898","text":"\u7531\u540c\u5b66\u53ef\u80fd\u4f1a\u53d1\u73b0\uff0c\u600e\u4e48\u56de\u586b\u4e00\u6b21\u4e4b\u540e\uff0c\u540e\u9762\u60f3\u518d\u6b21\u56de\u586b\u5c31\u4e0d\u751f\u6548\u4e86\uff1b \u8fd9\u662f\u56e0\u4e3a\u4e3a\u4e86\u5e94\u5bf9\u524d\u9762\u63d0\u5230\u7684\u591a\u79cd\u6570\u636e\u56de\u586b\u7684\u65b9\u5f0f\uff0c\u5728 report \u76ee\u5f55\u4e0b\u4f1a\u7531 pms_xxx \u5f00\u5934\u7684\u76ee\u5f55\uff0c\u8bb0\u5f55\u4e86\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u548c\u56de\u586b\u60c5\u51b5\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u4e4b\u524d\u5df2\u7ecf\u56de\u586b\u8fc7\u4e86\uff0c\u540e\u7eed\u5c31\u4e0d\u4f1a\u518d\u6b64\u89e6\u53d1\u56de\u586b\u4e86\uff1b \u5982\u679c\u4f60\u60f3\u91cd\u65b0\u505a\u56de\u586b\uff0c\u4f60\u53ef\u4ee5\u628a report/pms_xxx \u76ee\u5f55\u5220\u6389\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u91cd\u65b0\u505a\u6570\u636e\u56de\u586b\u4e86\uff1b"},{"location":"#24-csv","title":"2.4. \u5bfc\u51fa CSV \u6587\u4ef6","text":"\u6846\u67b6\u63d0\u4f9b\u5bfc\u51fa\u6307\u5b9a\u6807\u7b7e\u7528\u4f8b\u7684\u529f\u80fd\uff1a youqu manage.py exportcsv -a deepin-album -t CICD\n \u8868\u793a\u5bfc\u51fa deepin-album \u7684\u7528\u4f8b\u4e2d\u6807\u8bb0\u4e86 CICD \u6807\u7b7e\u7684\u7528\u4f8b\uff0c\u5bfc\u51fa CSV \u6587\u4ef6\u7684\u5b57\u6bb5\u683c\u5f0f\u5df2\u7ecf\u9002\u914d\u4e86 CICD \u7684\u8981\u6c42\u3002"},{"location":"#25-app","title":"2.5. \u811a\u624b\u67b6\u65b0\u5efa APP \u5de5\u7a0b","text":"\u65b0\u5efa\u4e00\u4e2a APP \u5de5\u7a0b\uff1a youqu manage.py startapp autotest_deepin_some \u8fd9\u6837\u5728 apps \u76ee\u5f55\u4e0b\u4f1a\u521b\u5efa\u4e00\u4e2a\u5b50\u9879\u76ee\u5de5\u7a0b autotest_deepin_some\uff0c\u540c\u65f6\u65b0\u5efa\u597d\u5de5\u7a0b\u6a21\u677f\u76ee\u5f55\u548c\u6a21\u677f\u6587\u4ef6\uff1a apps\n\u2514\u2500\u2500 autotest_deepin_some\n \u00a0\u00a0 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_case.py\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 config.ini\n \u00a0\u00a0 \u251c\u2500\u2500 config.py\n \u00a0\u00a0 \u251c\u2500\u2500 conftest.py\n \u00a0\u00a0 \u251c\u2500\u2500 control\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_assert.py\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some.csv\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u2514\u2500\u2500 widget\n \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 case_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 other.ini\n \u00a0\u00a0 \u251c\u2500\u2500 other_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 pic_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2514\u2500\u2500 ui.ini\n autotest_deepin_some \u662f\u4f60\u7684\u5de5\u7a0b\u540d\u79f0\uff0c\u6bd4\u5982\uff1aautotest_deepin_music \uff1b \u5728\u6b64\u57fa\u7840\u4e0a\uff0c\u4f60\u53ef\u4ee5\u5feb\u901f\u7684\u5f00\u59cb\u4f60\u7684 AT \u9879\u76ee\u3002"},{"location":"#26","title":"2.6. \u7528\u4f8b\u6807\u7b7e\u81ea\u52a8\u540c\u6b65","text":"\u7528\u4e8e\u81ea\u52a8\u540c\u6b65 PMS \u7528\u4f8b\u6807\u7b7e\u6570\u636e\u81f3\u672c\u5730 CSV \u6587\u4ef6\uff0c\u4e3b\u8981\u901a\u8fc7\u4ee5\u4e0b\u51e0\u4e2a\u914d\u7f6e\u6765\u63a7\u5236\uff1a APP_NAME = # \u6307\u5b9a\u8981\u540c\u6b65\u7684\u5e94\u7528\u540d\u79f0\nPMS_USER = # PMS\u7684\u7528\u6237\u540d\nPMS_PASSWORD = # PMS\u7684\u5bc6\u7801\n \u5728 [csv_link_pms_id] \u8282\u70b9\u4e0b\u6307\u5b9a csv \u6587\u4ef6\u540d\u4e0e PMS \u7528\u4f8b\u6a21\u5757\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u6bd4\u5982\uff1a [csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/testcase-browse-53.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 53\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic = 53\n \u5c06\u4ee5\u4e0a\u4fe1\u606f\u914d\u7f6e\u597d\u4e4b\u540e\uff0c\u5728\u547d\u4ee4\u884c\u6267\u884c\uff1a youqu manage.py pms --pms2csv yes\n \u6bcf\u6b21\u6267\u884c\u65f6\u539f csv \u6587\u4ef6\u4f1a\u81ea\u52a8\u5907\u4efd\u5728 report/csv_back \u76ee\u5f55\u4e0b\uff0c\u56e0\u6b64\u4f60\u4e0d\u7528\u62c5\u5fc3\u811a\u672c\u6267\u884c\u5bfc\u81f4\u4f60\u7684\u6570\u636e\u4e22\u5931\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u57fa\u7840\u6846\u67b6\u8bbe\u8ba1\u65b9\u6848","text":"# ====================================\n# Author : Mikigo\n# Time : 2022/3/18\n# version \uff1a1.0\n# ====================================\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"\u505a\u4e00\u4e2a\u7b80\u5355\u3001\u597d\u7528\u3001\u529f\u80fd\u5f3a\u5927\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u3002 \u4f5c\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4e00\u4e2a\u57fa\u7840\u6846\u67b6\uff0c\u4efb\u4f55\u5e94\u7528\u90fd\u80fd\u5f88\u65b9\u4fbf\u7684\u63a5\u5165\u8fdb\u6765\uff1b \u63d0\u4f9b\u6240\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u9700\u8981\u7684\u5e95\u5c42\u529f\u80fd\uff0c\u5e76\u5bf9\u5916\u63d0\u4f9b\u552f\u4e00\u7684\u63a5\u53e3\uff0c\u65b9\u4fbf\u5e94\u7528\u5e93\u4f7f\u7528\uff1b \u6574\u5408\u516c\u5171\u5e93\uff0c\u51cf\u5c11\u5e94\u7528\u5e93\u4ee3\u7801\u91cf\u548c\u65b9\u6cd5\u7ef4\u62a4\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u8bbe\u8ba1\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u7edf\u4e00\u6982\u5ff5","text":" \u57fa\u7840\u6846\u67b6 \u672c\u9879\u76ee\u662f\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\uff08AutoTest Basic Frame\uff09\uff0c\u5168\u79f0\u4e3a\u201c\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff08AT \u57fa\u7840\u6846\u67b6\uff09\u201d\u3002 AT \u57fa\u7840\u6846\u67b6\u662f\u505a\u4e3a\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\u6765\u8bbe\u8ba1\u7684\uff0c\u5b83\u63d0\u4f9b\u4e86\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u57fa\u7840\u529f\u80fd\uff0c\u4efb\u4f55\u5e94\u7528\u63a5\u5165\u8fdb\u6765\u90fd\u80fd\u5feb\u901f\u65b9\u4fbf\u7684\u8fdb\u884c\u65b9\u6cd5\u548c\u7528\u4f8b\u7f16\u5199\uff0c\u540c\u65f6\u5728\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u3001\u6807\u7b7e\u5316\u6267\u884c\u3001\u5206\u5e03\u5f0f\u6267\u884c\u3001\u591a\u79cd\u62a5\u544a\u8f93\u51fa\u3001\u4f18\u7f8e\u7684\u6267\u884c\u65e5\u5fd7\u3001\u5931\u8d25\u81ea\u52a8\u5f55\u5c4f\u548c\u622a\u56fe\u3001\u81ea\u52a8\u73af\u5883\u6e05\u7406\u7b49\u7b49\uff0c\u5b83\u90fd\u63d0\u4f9b\u4e86\u5b8c\u5584\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u66f4\u91cd\u8981\u7684\u662f\u8fd9\u4e00\u5207\u4f7f\u7528\u8d77\u6765\u90fd\u975e\u5e38\u7b80\u5355\u3002 \u57fa\u7840\u6846\u67b6\u4e2d\u5305\u542b\u5e94\u7528\u5e93\uff08apps\uff09\u3001\u6838\u5fc3\u5e93\uff08src\uff09\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09\u3002 \u5e94\u7528\u5e93\uff08apps\uff09 \u5404\u4e2a\u5e94\u7528\u81ea\u5df1\u7684\u4ed3\u5e93\uff0c\u91cc\u9762\u4e3b\u8981\u5305\u542b\u7684\u662f\u7528\u4f8b\u3001\u65b9\u6cd5\u53ca\u4e00\u4e9b\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u53eb autotest-dde-file-manager \u3002 \u6838\u5fc3\u5e93\uff08src\uff09 \u6838\u5fc3\u5e93\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u5230\u6240\u6709\u5e95\u5c42\u6838\u5fc3\u529f\u80fd\uff0c\u8fd9\u662f\u6700\u91cd\u8981\u7684\u4e00\u4e2a\u90e8\u5206\uff0c\u7075\u9b42\u3002\u5177\u4f53\u529f\u80fd\u6a21\u5757\u53ca\u8bf4\u660e\u4f1a\u5728\u4e0b\u9762\u7b2c\u56db\u4e2a\u7ae0\u8282\u8be6\u7ec6\u63cf\u8ff0\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09 \u591a\u4e2a\u5e94\u7528\u90fd\u8981\u7528\u5230\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\uff0c\u6309\u7167\u5e94\u7528\u5212\u5206\u5b58\u653e\uff0c\u4e3b\u8981\u662f\u4e3a\u4e86\u51cf\u5c11\u4ee3\u7801\u91cf\uff0c\u6d88\u9664\u5e94\u7528\u95f4\u7684\u8026\u5408\u5173\u7cfb\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u67b6\u6784\u56fe","text":"\u6574\u4f53\u7684\u6846\u67b6\u8bbe\u8ba1\u5728\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u300b\u6587\u6863\u91cc\u9762\u5df2\u7ecf\u6709\u8be6\u7ec6\u63cf\u8ff0\u4e86\uff0c\u8fd9\u91cc\u8d34\u4e00\u4e0b\u6574\u4f53\u7684\u67b6\u6784\u56fe\uff1a \u4e3a\u4e86\u7a81\u663e\u672c\u6587\u7684\u91cd\u70b9\uff0c\u62bd\u53d6\u5176\u4e2d\u91cd\u8981\u529f\u80fd\u6a21\u5757\uff0c\u5982\u4e0b\u56fe\uff1a "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-basic-frame # \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\n\u251c\u2500\u2500 apps # \u5e94\u7528\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-dde-file-manager # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\uff08\u5e94\u7528\u5e93\u8be6\u7ec6\u76ee\u5f55\u7ed3\u6784\u8bf7\u770b\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\uff09\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 tag # \u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u2514\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u2502 \u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 xxx.png\n\u2502 \u2502 ...\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-deepin-music # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 public # \u516c\u5171\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget # dde_dock \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget # dde_desktop \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 src # \u6838\u5fc3\u5e93\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 button_center.py\n\u2502 \u251c\u2500\u2500 cmdtrl.py\n\u2502 \u251c\u2500\u2500 dogtails.py\n\u2502 \u251c\u2500\u2500 find_image.py\n\u2502 \u251c\u2500\u2500 global_config.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 setting # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 config.py\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 global_config.ini\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\u6a21\u5757\uff08Hook\uff09\n\u251c\u2500\u2500 pytest.ini # Pytest \u9ed8\u8ba4\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 docs # \u6587\u6863\u76ee\u5f55\n\u2514\u2500\u2500 manage.py # \u6267\u884c\u5668\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1apps","title":"1\u3001\u5e94\u7528\u5e93\uff08apps\uff09","text":"\u6240\u6709\u5e94\u7528\u5e93\u5747\u653e\u7f6e\u5728\u57fa\u7840\u6846\u67b6\u4e0b\u7684 apps \u76ee\u5f55\u4e0b\uff08\u89c1\u7b2c\u4e8c\u7ae0\u8282\u7b2c3\u6bb5\u76ee\u5f55\u7ed3\u6784\u5185\u5bb9\uff09\u3002\u5e94\u7528\u5e93\u7684\u67b6\u6784\u8bbe\u8ba1\u53ef\u4ee5\u53c2\u8003\u300aAT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b\u6587\u6863\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2src","title":"2\u3001\u6838\u5fc3\u5e93\uff08src\uff09","text":"\u5728 src \u76ee\u5f55\u4e0b\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u5e95\u5c42\u6838\u5fc3\u7ec4\u4ef6\uff0c\u901a\u5e38\u6765\u8bb2\u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5230\u5176\u4e2d\u67d0\u4e00\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4e48\u4f60\u9700\u8981\u663e\u793a\u7684\u5bfc\u5165\u8fd9\u4e2a\u6a21\u5757\uff0c\u7136\u540e\u624d\u80fd\u4f7f\u7528\u8be5\u6a21\u5757\u4e0b\u7684\u529f\u80fd\uff0c\u5982\u679c\u4f60\u7528\u5230\u4e86\u5341\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4f60\u5c31\u9700\u8981\u5bfc\u5165\u5341\u4e2a\u3002\u4f46\u662f\u6211\u4eec\u60f3\u8ba9\u4e8b\u60c5\u53d8\u5f97\u7b80\u5355\uff0c\u4e00\u6b21\u5bfc\u5165\uff0c\u4f7f\u7528\u6240\u6709\u3002 \u5c06\u6240\u6709\u7684\u529f\u80fd\u6a21\u5757\u90fd\u8fdb\u5165\u5230 src \u7684\u540d\u79f0\u7a7a\u95f4\uff0c\u5728 src/__init__.py \u91cc\u9762\u6211\u4eec\u8bbe\u8ba1\u6210\u8fd9\u6837\uff1a # src/__init__.py\nfrom .cmdctl import CmdCtl\nfrom .dogtails import Dogtail\nfrom .find_image import FindImage\nfrom .button_center import ButtonCenter\nclass Src(CmdCtl, FindImage):\ndef __init__(self, **kwargs):\n\"\"\"dogtail or button center param\n :param kwargs: app_name, desc, number\n \"\"\"\nif kwargs:\napp_name = kwargs.get(\"APP_NAME\")\ndesc = kwargs.get(\"DESC\")\nif app_name is None or desc is None:\nraise ValueError\nnumber = kwargs.get(\"number\")\nnumber = number if isinstance(number, int) else -1\n# \u5bf9\u8c61\u7ec4\u5408\nself.dog = Dogtail(app_name, desc, number)\nself.ui = ButtonCenter(app_name, number)\n \u9700\u8981\u4f20\u9012\u53c2\u6570\u7684\u91c7\u7528\u5bf9\u8c61\u7ec4\u5408\uff0c\u6ca1\u6709\u53c2\u6570\u7684\u4f7f\u7528\u7ee7\u627f\uff0c\u7ee7\u627f\u7684\u7c7b\u7b26\u5408 Mixin \u8bbe\u8ba1\u6a21\u5f0f\u3002 \u5e94\u7528\u5e93\u91cc\u9762\u4f7f\u7528\u7684\u65f6\u5019\u5728 widget/base_widget.py \u91cc\u9762\u53ea\u9700\u8981\u552f\u4e00\u7ee7\u627f Src \uff1a # \u5e94\u7528\u5e93\u91cc\u9762\u65b9\u6cd5\u57fa\u7c7b\n# widget/base_widget.py\nfrom src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n \u8981\u4f7f\u7528\u6838\u5fc3\u5e93\u7684\u529f\u80fd\uff0c\u53ea\u9700\u8981\u5199\u4e00\u4e2a\u5bfc\u5165 from src import Src \u5373\u53ef\u3002 \u5199 __init__ \u6784\u9020\u51fd\u6570\u7684\u539f\u56e0\u662f\u901a\u8fc7\u53c2\u6570\u6784\u9020\u5e94\u7528\uff0c\u5e76\u4e14\u4f20\u9012 number \u8fdb\u6765\uff0c\u53ef\u4ee5\u5b9e\u73b0\u591a\u7a97\u53e3\u7684\u63a7\u5236\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3public","title":"3\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09","text":"\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6bcf\u4e2a\u5e94\u7528\u90fd\u662f\u4e00\u4e2a\u5355\u72ec\u7684 py \u6587\u4ef6\uff0c\u76f8\u4e92\u4e4b\u95f4\u662f\u72ec\u7acb\u7684\uff0c\u6bcf\u4e2a py \u6587\u4ef6\u91cc\u9762\u662f\u8be5\u5e94\u7528\u7684\u65b9\u6cd5\u7c7b\uff0c\u6bd4\u5982\uff1a\u6700\u5e38\u7528\u7684\u65b9\u6cd5\u7c7b dde_desktop_public_widget.py # dde_desktop_widget.py\nfrom src import Src\nclass _DdeDesktopPublicBaseWidget(Src):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-desktop\"\nDESC = \"/usr/bin/dde-desktop\"\ndef __init__(self):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC)\nclass DdeDesktopPublicWidget(_DdeDesktopPublicBaseWidget):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u7c7b\"\"\"\ndef click_music_dir_by_ui(self):\n\"\"\"\u5728\u6587\u4ef6\u9009\u62e9\u6846\u70b9\u51fb\u97f3\u4e50\u76ee\u5f55\"\"\"\nself.click(*self.ui.btn_center(\"\u4fa7\u8fb9\u680f-\u97f3\u4e50\")) \ndef click_xxx_by_attr(self):\npass\n \u516c\u5171\u65b9\u6cd5\u5e93\u610f\u4e49\uff1a \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6240\u5c01\u88c5\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\u90fd\u662f\u81f3\u5c11\u88ab2\u4e2a\u5e94\u7528\u90fd\u7528\u5230\u7684\uff0c\u8fd9\u6837\u505a\u53ef\u4ee5\u51cf\u5c11\u6574\u4f53\u4ee3\u7801\u91cf\uff0c\u4ece\u800c\u51cf\u8f7b\u5e94\u7528\u5e93\u4ee3\u7801\u7684\u7ef4\u62a4\u5de5\u4f5c\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u7f16\u5199\u5f62\u5f0f\uff08\u547d\u540d\u89c4\u5219\u3001\u5b9a\u4f4d\u7684\u65b9\u6848\u5199\u6cd5\u3001\u6ce8\u91ca\u7684\u5199\u6cd5\u7b49\u7b49\uff09\u5177\u6709\u4e00\u5b9a\u7684\u6a21\u677f\u4f5c\u7528\uff0c\u8fd9\u6837\u5373\u4f7f\u662f\u5404\u4e2a\u5e94\u7528\u5e93\u90fd\u72ec\u7acb\u7ef4\u62a4\uff0c\u6240\u6709\u7684\u7f16\u7801\u98ce\u683c\u90fd\u662f\u8d8b\u4e8e\u76f8\u540c\u7684\uff0c\u56e0\u4e3a\u5927\u5bb6\u90fd\u5e94\u8be5\u53c2\u7167\u516c\u5171\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u5199\u6cd5\u6765\u5199\u81ea\u5df1\u5e94\u7528\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\u7c7b\uff0c\u8fd9\u6837\u4f7f\u5f97\u4ece\u516c\u53f8\u7684\u89d2\u5ea6\u53bb\u770b\u6240\u6709\u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u90fd\u662f\u7edf\u4e00\u7684\u3002 \u53ef\u4ee5\u901a\u8fc7\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\uff0c\u4e86\u89e3\u5230\u5176\u4ed6\u5e94\u7528\u7684\u529f\u80fd\uff0c\u5bf9\u4e8e\u6211\u4eec\u9700\u6c42\u7406\u89e3\uff0c\u4e86\u89e3\u7cfb\u7edf\u7684\u65b9\u65b9\u9762\u9762\u4e5f\u6709\u597d\u5904\u3002 \u5f53\u7136\uff0c\u5982\u679c\u4f60\u7684\u5e94\u7528\u672c\u8eab\u662f\u5c5e\u4e8e\u6839\u672c\u5c31\u4e0d\u9700\u8981\u548c\u5176\u4ed6\u5e94\u7528\u4ea4\u4e92\u7684\uff0c\u90a3\u4e48\u4f60\u53ef\u80fd\u4e0d\u4f1a\u7528\u5230\u8fd9\u91cc\u9762\u7684\u529f\u80fd\uff0c\u6ca1\u5173\u7cfb\uff0c\u4f60\u6240\u6709\u7684\u65b9\u6cd5\u90fd\u53ef\u4ee5\u76f4\u63a5\u5199\u5728\u5e94\u7528\u5e93\u7684\u4e1a\u52a1\u5c42\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4conftestpy","title":"4\u3001conftest.py","text":"conftest.py \u4ece\u529f\u80fd\u4e0a\u5c06\u662f\u5c5e\u4e8e\u6838\u5fc3\u5e93\uff08src\uff09\u7684\u5185\u5bb9\uff0c\u4f46\u662f\u7531\u4e8e\u5b83\u7684\u7279\u6b8a\u6027\uff0c\u5373\u5b83\u662f\u5bf9\u5e94\u7528\u5e93\u4e2d\u7684\u7528\u4f8b\u751f\u6548\u7684\uff0c\u800c\u4e14\u5b83\u7684\u4f5c\u7528\u57df\u662f\u5f53\u524d\u76ee\u5f55\u53ca\u4ee5\u4e0b\uff0c\u56e0\u6b64\u6211\u4eec\u5c06\u5b83\u653e\u5230\u9879\u76ee\u6839\u76ee\u5f55\u3002\u6211\u4eec\u6846\u67b6\u4e2d\u6709\u4e0d\u5c11\u6838\u5fc3\u529f\u80fd\u90fd\u662f\u5728\u8fd9\u91cc\u9762\u8fdb\u884c\u5f00\u53d1\u7684\uff0c\u540e\u9762\u7b2c\u56db\u7ae0\u4f1a\u8bb2\u5230\u7ec6\u8282\u3002 pytest.ini \u4f5c\u7528\u548c conftest.py \u7c7b\u4f3c\uff0c\u662f Pytest \u6846\u67b6\u7684\u56fa\u5b9a\u914d\u7f6e\u6587\u4ef6\uff0c\u76ee\u524d\u914d\u7f6e\u4e86\u4e00\u4e9b\u901a\u7528\u7684\u547d\u4ee4\u884c\u6267\u884c\u53c2\u6570\uff0c\u4e5f\u653e\u5728\u9879\u76ee\u6839\u76ee\u5f55\u3002 \u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 Hook \u51fd\u6570\uff0capps \u76ee\u5f55\u4e0b\u7684 \u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 fixture \u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5setting","title":"5\u3001setting","text":"\u5168\u5c40\u914d\u7f6e\u6a21\u5757\uff0c\u5305\u542b\u4e86\u4ee5\u4e0b\u914d\u7f6e\u6587\u4ef6\uff1a \uff081\uff09ini \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u914d\u7f6e\u4e00\u4e9b\u5168\u5c40\u7684\u914d\u7f6e\u9879\uff0c\u8b6c\u5982\uff1a\u5931\u8d25\u91cd\u8dd1\u6b21\u6570\u3001\u662f\u5426\u5931\u8d25\u5f55\u5c4f\u3001\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\u3001\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4\u3001\u6267\u884c\u65f6\u65e5\u5fd7\u7ea7\u522b\u3001\u751f\u6210\u7684\u62a5\u544a\u7c7b\u578b\u3001\u4ee5\u53ca\u5206\u5e03\u5f0f\u6267\u884c\u7684\u4e00\u4e9b\u7b56\u7565\u914d\u7f6e\u9879\u7b49\u7b49\u3002 \uff082\uff09config.py \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u63d0\u4f9b\u914d\u7f6e\u6587\u4ef6\u8bfb\u53d6\u3001\u52a8\u6001\u83b7\u53d6\u4e00\u4e9b\u5e38\u91cf\uff08\u5982\u9879\u76ee\u6839\u76ee\u5f55\u7edd\u5bf9\u8def\u5f84 (BASE_DIR)\u3001\u7cfb\u7edf\u67b6\u6784\uff08SYS_FRAME\uff09\u3001\u65f6\u95f4\u5b57\u7b26\u4e32\uff08strftime\uff09\u3001\u672c\u673a USERNAME IP \u7b49\u7b49\uff09\u3001\u516c\u5171 URL \u7b49\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u89c4\u8303","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u7248\u672c\u53ca\u4f9d\u8d56","text":"\u57fa\u7840\u6846\u67b6\u4f1a\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u8fdb\u884c\u7248\u672c\u53d1\u5e03\uff0c\u4e0d\u4e0e\u67d0\u4e2a\u5e94\u7528\u7248\u672c\u7ed1\u5b9a\uff0c\u4f46\u662f\uff0c\u5e94\u7528\u5e93\u4f1a\u4f9d\u8d56\u4e8e\u57fa\u7840\u6846\u67b6\u7684\u7248\u672c\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u5efa\u8bae\u5728\u5e94\u7528\u5e93\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a\u6587\u672c\u6587\u4ef6\u7528\u4e8e\u8bb0\u5f55\u6240\u4f9d\u8d56\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\uff0c\u7c7b\u4f3c\u4e8e\u5f00\u53d1\u5e94\u7528\u7684 debian/control \u6587\u4ef6\u7684\u529f\u80fd\uff0c\u4e3a\u4e86\u4fdd\u6301\u7edf\u4e00\uff0c\u8fd9\u4e2a\u6587\u4ef6\u5c31\u547d\u540d\u4e3a control\uff0c\u653e\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u6838\u5fc3\u5e93\u72ec\u7acb\u6027","text":"\u6838\u5fc3\u5e93\u4e0d\u5efa\u8bae\u9488\u5bf9\u67d0\u4e00\u4e2a\u5e94\u7528\u5355\u72ec\u505a\u4ee3\u7801\u4e0a\u7279\u6b8a\u5904\u7406\uff0c\u901a\u5e38\u8003\u8651\u9488\u5bf9\u67d0\u4e00\u79cd\u573a\u666f\u8fdb\u884c\u5904\u7406\uff0c\u8fd9\u4e9b\u573a\u666f\u901a\u5e38\u662f\u5b58\u5728\u4e00\u4e9b\u5171\u6027\u7684\u3002\u6bd4\u5982\u8bf4\uff1a\u684c\u9762\u7684ID\u5206\u914d\u5b58\u5728\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u903b\u8f91\u5904\u7406\u89e3\u51b3ID\u5206\u914d\u9519\u8bef\u7684\u95ee\u9898\uff0c\u4f46\u662f\u8fd9\u90e8\u5206\u903b\u8f91\u6211\u4eec\u4f1a\u5728\u684c\u9762\u7684\u65b9\u6cd5\u5c42\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u517c\u5bb9\u6027","text":"\u4e3a\u4e86\u4fdd\u6301\u517c\u5bb9\u6027\uff0c\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u539f\u5219\u4e0a\u4e0d\u5bf9\u8001\u65b9\u6cd5\u8fdb\u884c\u4fee\u6539\u6216\u5220\u9664\uff0c\u53ea\u8fdb\u884c\u65b0\u589e\u3002\u6d89\u53ca\u5230\u8001\u65b9\u6cd5\u4fee\u6539\u6216\u5220\u9664\u7684\uff0c\u4f1a\u8fdb\u884c\u63d0\u524d\u9884\u544a\uff0c\u5e76\u5728\u7b2c\u4e8c\u4e2a\u7248\u672c\u4e4b\u540e\uff08\u4e2d\u95f4\u4f1a\u9694\u4e00\u4e2a\u7248\u672c\u8fc7\u5ea6\uff09\u6b63\u5f0f\u5b9e\u65bd\u4fee\u6539\u6216\u5220\u9664\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u547d\u540d\u89c4\u8303","text":" \u7528\u4f8b ID \u6bcf\u4e2a\u5e94\u7528\u81ea\u5df1\u7ef4\u62a4\u4e00\u5957 ID\uff0c\u5728PMS\u4e0a\u7528\u4f8b\u6807\u9898\u4e0a\u5c06\u81ea\u52a8\u5316ID\u4ee5\u6807\u7b7e\u7684\u5f62\u5f0f\u5199\u5165\uff0c\u6bd4\u5982\uff1a[101]\u6253\u5f00-\u542f\u52a8\u5e94\u7528\u540edock\u53f3\u952e\u83dc\u5355 \u4e00\u4e2a\u7528\u4f8b\u7c7b\u91cc\u9762\u6709\u591a\u4e2a\u7528\u4f8b\u65f6\uff0c\u5728\u7528\u4f8b\u540d\u79f0\u540e\u9762\u52a0\u5e8f\u53f7\u3002 class TestFileManager(BaseCase):\n\"\"\"\u6587\u7ba1\u7528\u4f8b\"\"\"\ndef test_xxx_015_1(self):\npass\ndef test_xxx_015_2(self):\npass\n \u6ce8\u610f 015_1\uff0c\u4e0d\u8981\u5199015_01\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 PMS \u4e0a\u7684\u7528\u4f8bID\uff1a PMS \u4e0a\u662f6\u4f4d\u6570\uff0c\u4e0d\u591f\u76f4\u89c2\uff0c\u4e5f\u4e0d\u597d\u7ef4\u62a4\uff0c\u5728\u81ea\u52a8\u5316\u4e0b\u9762\u53bb\u627e\u4e00\u4e2a\u5e26\u6709 6 \u4f4d\u6570\u7684\u6587\u4ef6\u662f\u4e00\u4e2a\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 PMS \u4e0a\u7684 ID \u53ef\u80fd\u4f1a\u53d1\u751f\u53d8\u5316\uff0c\u6bd4\u5982\u5bfc\u51fa\u6765\u5bfc\u8fdb\u53bb\u7684\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u5b58\u5728\u95ee\u9898\uff0c\u5982\u679c\u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u8981\u60f3\u627e\u51fa\u6765\u5bf9\u5e94\u4fee\u6539\u81ea\u52a8\u5316\u7528\u4f8b ID\uff0c\u5c06\u4f1a\u662f\u4ef6\u975e\u5e38\u75db\u82e6\u7684\u4e8b\u60c5\u3002 \u51fd\u6570\u547d\u540d\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5de6\u952e\u70b9\u51fb click \u53f3\u952e\u70b9\u51fb right_click \u53cc\u51fb double_click \u79fb\u52a8 move_to \u62d6\u52a8 drag \u65b0\u5efa new \u62d6\u52a8\u5230 drag_to \u4ece\u54ea\u91cc\u62d6\u52a8\u5230\u54ea\u91cc drag_something_from_xxx_to_xxx \u83b7\u53d6 get \u83b7\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5750\u6807 get_location \u975e\u7279\u6b8a\u6587\u4ef6 file word\u6587\u4ef6 doc text\u6587\u4ef6 text \u6587\u4ef6\u5939 dir \u5173\u952e\u8bcd\u6301\u7eed\u589e\u52a0 \u5e38\u91cf\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5e94\u7528\u540d\u79f0 APP_NAME \u5e94\u7528\u63cf\u8ff0 DESC \u672c\u5e94\u7528\u4ee5\u5916\u7684\u5176\u4ed6\u5e94\u7528\uff0c\u6bd4\u5982\u5e2e\u52a9 HELP \u5176\u4ed6\u540d\u79f0\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u65b9\u6cd5\u5305\u540d widget \u65b9\u6cd5\u6587\u4ef6\u540d\uff08\u6587\u7ba1\u4e3e\u4f8b\uff09 dfm_widget.pytitle_widget.pyright_view_widget.pyleft_view_widget.pypop_widget.pybase_widget.pydfm_assert.py \u65ad\u8a00\u8bed\u53e5\u547d\u540d\u89c4\u8303 \u65ad\u8a00\u8bed\u53e5\u90fd\u662f\u4ee5 assert \u5f00\u5934 \u65ad\u8a00 \u8bed\u53e5 \u5224\u65ad\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_existsassert_file_not_exists \u5224\u65ad\u684c\u9762\u76ee\u5f55\u4e0b\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_exists_in_desktopassert_file_not_exists_in_desktop \u5224\u65ad\u56fe\u7247\u5b58\u5728 assert_image_existsassert_image_not_exists \u5224\u65ad\u5f71\u9662\u4e2d\u662f\u5426\u5b58\u5728\u56fe\u7247 assert_image_exists_in_movieassert_image_not_exists_in_movie \u5224\u65ad\u5143\u7d20\u662f\u5426\u5b58\u5728 assert_element_existassert_element_not_exist \u5224\u65ad\u662f\u5426\u76f8\u7b49 assert_equalassert_not_equal \u5224\u65ad\u662f\u5426\u4e3a\u771f assert_trueassert_false"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5fixture","title":"5\u3001fixture \u89c4\u8303","text":"\u7531\u4e8e Pytest \u6846\u67b6\u4e2d\u652f\u6301 fixture \u7684\u5199\u6cd5\u548c Xunit \u5199\u6cd5\u7684\uff0c\u6240\u4ee5\u5e94\u7528\u5e93\u4e2d\u53ef\u80fd\u5b58\u5728\u6df7\u7528\u7684\u60c5\u51b5\uff0c\u4e3a\u7edf\u4e00\u7f16\u7801\u98ce\u683c\u65b9\u4fbf\u540e\u7eed\u7528\u4f8b\u4ee3\u7801\u7ef4\u62a4\uff0c\u73b0\u505a\u4ee5\u4e0b\u89c4\u8303\u8bf4\u660e\uff1a \u629b\u5f03 Xunit \u7684\u5199\u6cd5\uff0c\u7edf\u4e00\u91c7\u7528 Pytest fixture \u7684\u5199\u6cd5\u3002 \u5e94\u7528\u5185 fixture \u8c28\u614e\u4f7f\u7528 autouse=True \uff0c\u975e\u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u975e\u5e38\u4e0d\u5efa\u8bae\u4f7f\u7528\u8fd9\u4e2a\u53c2\u6570\u3002 \u8c03\u7528 fixture \u4e0d\u80fd\u4f7f\u7528 @pytest.mark.usefixture()\uff0c\u4f7f\u7528\u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u4f20\u5165\u51fd\u6570\u5bf9\u8c61\u3002 \u5efa\u8bae\u5728\u4e00\u4e2a conftest.py \u91cc\u9762\u53bb\u5199\uff0c\u4e00\u4e2a\u5e94\u7528\u4e5f\u5c3d\u91cf\u7ef4\u62a4\u4e00\u4e2a conftest.py\u6587\u4ef6\u3002 fixture \u4e5f\u9700\u8981\u5199\u529f\u80fd\u8bf4\u660e\uff0c\u51fd\u6570\u540d\u79f0\u8981\u6709\u5177\u4f53\u542b\u4e49\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#6","title":"6\u3001\u65b9\u6cd5\u7f16\u5199\u89c4\u8303","text":" \u65b9\u6cd5\u7c7b\u578b\uff1a if \u6ca1\u6709\u7528\u5230\u5b9e\u4f8b\u5bf9\u8c61\uff1a\nif \u6ca1\u6709\u7528\u5230\u7c7b\u5bf9\u8c61\uff1a\n\u5199\u9759\u6001\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @staticmethod\nelse\uff1a\n\u5199\u7c7b\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @classmethod\nelse:\n\u76f4\u63a5\u5199\u5b9e\u4f8b\u65b9\u6cd5\n \u4e3e\u4f8b: class TitleWidget:\ndef click_xxx_by_ui(self):\npass\n@staticmethod\ndef click_xxx_by_ui():\npass\n@classmethod\ndef click_xxx_by_ui(cls):\npass\n \u51fd\u6570\u540d\u79f0\u4e0d\u51fa\u73b0\u6570\u5b57\uff0c\u9700\u8981\u8868\u793a\u6570\u91cf\u7684\u7528\u5355\u8bcd\u8868\u793a\u3002 \u51fd\u6570\u529f\u80fd\u6ce8\u91ca\u3002 \u6ca1\u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg2:xxx\n\"\"\"\n \u6709\u53c2\u6570\uff0c\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg1:xxx\nreturn: xxx\n\"\"\"\n \u200b \u7528 Pycharm \u7684\u6ce8\u91ca\u6a21\u677f\u4e5f\u53ef\u4ee5\uff0c\u53ea\u8981\u4f53\u73b0\u4e86\u53c2\u6570\u7684\u7c7b\u578b\u548c\u8fd4\u56de\u5c31\u884c\u4e86\u3002 \u6682\u4e0d\u8981\u6c42\u5199\u7c7b\u578b\u6ce8\u89e3\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#7case","title":"7\u3001\u7528\u4f8b\uff08case\uff09\u89c4\u8303","text":" \u4ee5\u7c7b\u7684\u5f62\u5f0f\u5199\u7528\u4f8b\uff0c\u7528\u4f8b\u7c7b\u96c6\u6210\u7528\u4f8b\u57fa\u7c7b\u3002 \u7528\u4f8b\u7c7b\u9700\u8981\u5199\u6ce8\u91ca\u3002 \u6d4b\u8bd5\u7528\u4f8b\u51fd\u6570\u8bf4\u660e\uff08\u5efa\u8bae\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u540d\u79f0\uff09 \"\"\"\u53f3\u4fa7\u9884\u89c8-\u56fe\u7247\u7c7b\u578b\u4fe1\u606f\u680f\u57fa\u672c\u4fe1\u606f\"\"\"\n \u4e0d\u5199\u8c03\u8bd5\u4ee3\u7801 if __name__ == '__main__':\npytest.main()\n \u6240\u6709\u7528\u4f8b\u90fd\u7ee7\u627f BaseCase\u3002 BaseCase \u91cc\u9762\u653e\u4e00\u4e9b\u6d4b\u8bd5\u6570\u636e\u7684\u5e38\u91cf\uff0c\u6bd4\u5982\u6587\u4ef6\u540d\u79f0\uff0c\u5e94\u7528\u540d\u79f0\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u4e00\u4e9b\u901a\u7528\u7684\u5b57\u7b26\u4e32\u3002 \u8fd9\u7c7b\u662f\u5c5e\u4e8e\u6d4b\u8bd5\u6570\u636e\u3002 class BaseCase(DfmAssert):\n\"\"\"\u7528\u4f8b\u57fa\u7c7b\"\"\"\nNEW_FILE = \"\u65b0\u5efa\u6587\u672c.txt\"\nTEST_FILE = \"test.txt\"\nNEW_DIR = \"\u65b0\u5efa\u6587\u4ef6\u5939\"\nNEW_WORD = \"\u65b0\u5efaWord\u6587\u6863.doc\"\nAPP_HELP = \"damn\"\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\n\"\"\"\u7528\u4f8b\u6807\u9898\uff08\u590d\u5236PMS\u4e0a\u7528\u4f8b\u6807\u9898\uff09\"\"\"\ndfm = DfmWidget()\ndfm.click_xxx_by_attr(self.NEW_FILE)\ndfm.new_file_in_desktop_by_cmd(self.NEW_FILE)\nself.assert_true(dfm.get_process_status(self.APP_NAME))\n \u7528\u4f8b\u91cc\u9762\u5c3d\u91cf\u51cf\u5c11\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\uff0c\u66f4\u8981\u51cf\u5c11\u76f8\u540c\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\u3002 \u7edf\u4e00\u6587\u4ef6\u6ce8\u91ca\u5934\u3002 #!/usr/bin/env python3\n# _*_ coding:utf-8 _*_\n\"\"\"\n:Author:email@uniontech.com\n:Date :${DATE} ${TIME}\n\"\"\"\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#8","title":"8\u3001\u5176\u4ed6\u89c4\u8303","text":" \u65e5\u5fd7\u6253\u5370\u8981\u5728\u65b9\u6cd5\u6700\u524d\u9762\uff0c\u5426\u5219\u4ee3\u7801\u62a5\u9519\u6ca1\u6709\u65e5\u5fd7\u8f93\u51fa\uff0c\u4e0d\u597d\u5b9a\u4f4d\u95ee\u9898\u3002\uff08\u6211\u4eec\u4f1a\u8003\u8651\u7ee7\u7eed\u4f7f\u7528\u62e6\u622a\u5668\u6253\u5370\u65e5\u5fd7\uff09 \u6240\u6709\u7684\u64cd\u4f5c\u90fd\u9700\u8981\u6709\u65e5\u5fd7\uff0c\u5305\u62ec sleep()\uff0c\u6211\u4eec\u4f1a\u91cd\u5199\u4e00\u4e2a\u6709\u65e5\u5fd7\u8f93\u5165\u7684 sleep\u3002 \u4e1a\u52a1\u5c42\u65e5\u5fd7\u7ea7\u522b\u4e3a INFO\u3002 hook \u51fd\u6570\u53ea\u80fd\u5199\u5230\u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u91cc\u9762\u3002 apps \u76ee\u5f55\u4e0b\u7684 conftest.py \u539f\u5219\u4e0a\u4e0d\u4f1a\u65b0\u589e fixture\u3002 \u56fa\u5b9a\u76ee\u5f55\u6216\u5143\u7d20\u63a7\u4ef6\u7684\u64cd\u4f5c\uff0c\u5c06\u64cd\u4f5c\u65b9\u6cd5\u5199\u6b7b\uff0c\u6587\u4ef6\u7c7b\u64cd\u4f5c\u5c06\u6587\u4ef6\u540d\u7559\u53c2\u6570\u3002 \u8def\u5f84\u62fc\u63a5\u89c4\u8303\uff1a \u7cfb\u7edf\u4e2d\u56fa\u5b9a\u76ee\u5f55\uff0c\u8def\u5f84\u62fc\u63a5\u65f6\u4f7f\u7528\u6ce2\u6d6a\u7b26\u53f7\uff0c\u6bd4\u5982\uff1a~/Desktop/\uff0c\u4e0b\u5c42\u4f7f\u7528 os.path.expanduser()\uff0c\u5b83\u53ef\u4ee5\u81ea\u52a8\u8bc6\u522b\u6ce2\u6d6a\u7b26\u53f7\u3002 \u9879\u76ee\u4e0b\u8def\u5f84\u4f7f\u7528\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u8def\u5f84\uff0c\u6bd4\u5982\uff1aConfig.BASE_PATH\uff0c\u56e0\u4e3a\u9879\u76ee\u662f\u53ef\u4ee5\u5728\u4efb\u610f\u8def\u5f84\u8fd0\u884c\u7684\uff0c\u9700\u8981\u52a8\u6001\u62fc\u63a5\u8def\u5f84\u3002 "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848","text":"# =================================================\n# Author : Mikigo\n# Time : 2022/3/16\n# version \uff1a1.0\n# =================================================\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"AT \u5e94\u7528\u5e93\u6539\u9020\u662f\u57fa\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u8fdb\u884c\u7528\u4f8b\u65b9\u6cd5\u548c\u4e1a\u52a1\u903b\u8f91\u7684\u91cd\u65b0\u8bbe\u8ba1\uff0c\u4ee5\u5b9e\u73b0\u5e94\u7528\u5e93\u9ad8\u6548\u7684\u7f16\u5199\u3001\u7ef4\u62a4\u7528\u4f8b\u53ca\u5176\u65b9\u6cd5\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u6587\u4ef6\u7ba1\u7406\u5668\u4ece\u4e1a\u52a1\u590d\u6742\u5ea6\u548c\u7528\u4f8b\u91cf\u6765\u8bb2\uff0c\u5728\u7cfb\u7edf\u6240\u6709\u5e94\u7528\u4e2d\uff0c\u662f\u5f88\u6709\u4ee3\u8868\u6027\u7684\uff0c\u96be\u5ea6\u4e5f\u662f\u6700\u5927\u7684\uff0c\u56e0\u6b64\u6211\u4eec\u9009\u53d6\u6587\u4ef6\u7ba1\u7406\u5668\u4f5c\u4e3a\u5e94\u7528\u5e93\u6539\u9020\u7684\u5b9e\u9a8c\u5e94\u7528\uff0c\u7ed9\u540e\u7eed\u5176\u4ed6\u5e94\u7528\u6539\u9020\u63d0\u4f9b\u5207\u5b9e\u53ef\u884c\u7684\u601d\u8def\u548c\u65b9\u6848\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u5206\u5c42\u8bbe\u8ba1\u56fe","text":"\u6574\u4f53\u4ecd\u7136\u9075\u5faa PO \u8bbe\u8ba1\u7406\u5ff5\uff0c\u6839\u636e\u4e1a\u52a1\u9700\u8981\uff0c\u5c06\u6587\u7ba1\u4e1a\u52a1\u5c42\u8fdb\u884c 3 \u5c42\u5212\u5206\uff1a "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-dde-file-manager # \u5e94\u7528\u4ed3\u5e93\n\u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 test_xxx_001.py\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u00a0\u251c\u2500\u2500 __init__.py\n\u2502 \u00a0\u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u00a0\u251c\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u00a0\u251c\u2500\u2500 base_widget.py # \u65b9\u6cd5\u57fa\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 title_widget.py # title \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 right_view_widget.py # right view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 left_view_widget.py # left view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 pop_widget.py # pop \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 dfm_widget.py # \u65b9\u6cd5\u7684\u7edf\u4e00\u51fa\u53e3\n\u2502 \u00a0\u2514\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 tag # \u7528\u4f8b\u6807\u7b7e\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 xxx.csv # \u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2514\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u57fa\u7c7b","text":" \u7ee7\u627f\u6838\u5fc3\u5c42\u7684\u5404\u4e2a\u6a21\u5757\u7c7b\u3002 \u62bd\u53d6\u64cd\u4f5c\u5c42\u7684\u4e00\u4e9b\u57fa\u7840\u65b9\u6cd5\u3002 \u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u7684\u4e00\u4e9b\u516c\u5171\u65b9\u6cd5\u3002 \u8def\u5f84\u7ec4\u88c5\u65b9\u6cd5\u3002 \u4e00\u4e9b\u4e1a\u52a1\u5c42\u76f8\u5173\u7684\u53d8\u91cf\u3001\u5e38\u91cf\u3001shell\u547d\u4ee4\u3001\u5750\u6807\u3002 \u65b9\u6cd5\u57fa\u7c7b\u7684\u5199\u6cd5\uff1a from src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u64cd\u4f5c\u5c42","text":" \u6a21\u5757\u5212\u5206 \u6309\u7167\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u6587\u7ba1\u4e3b\u754c\u9762\u5206\u4e3a\u4e09\u4e2a\u533a\u57df\uff1a\u6807\u9898\u680f\u3001\u53f3\u8fb9\u89c6\u56fe\u533a\u57df\u3001\u5de6\u8fb9\u89c6\u56fe\u533a\u57df \u5f39\u7a97\uff1a\u8bbe\u7f6e\u754c\u9762\u5f39\u7a97\u3001\u4fdd\u9669\u7bb1\u5f39\u7a97\u3001\u5220\u9664\u786e\u8ba4\u5f39\u7a97\u3001\u53ca\u5404\u79cd\u7f51\u7edc\u5f39\u7a97 \u53f3\u952e\u83dc\u5355\uff1a\u6682\u65f6\u4e0d\u8003\u8651\u4e3a\u5355\u72ec\u7684\u6a21\u5757\uff0c\u8003\u8651\u4ee5\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6848\u505a\u6210\u516c\u5171\u5e93\u3002 \u5404\u4e2a\u6a21\u5757\u53ea\u7ee7\u627f\u57fa\u7c7b from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u6784\u9020\u51fd\u6570\u91cc\u9762\u4e0d\u6784\u9020\u5bf9\u8c61\uff0c\u53ef\u4ee5\u521d\u59cb\u5316\u4e00\u4e9b\u53d8\u91cf\u3002 \u4e0d\u540c\u7684\u5b9a\u4f4d\u65b9\u6848\u8c03\u7528\u4e0d\u540c\u7684\u5b9a\u4f4d\u5de5\u5177\u5bf9\u8c61\u3002 self.dog\nself.ui\nself.d_bus\n \u65b9\u6cd5\u7f16\u5199 \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u5e94\u7528\u5c42","text":" \u7ee7\u627f\u64cd\u4f5c\u5c42\u7684\u6240\u6709\u7c7b\u3002 \u4ec5\u4ec5\u7528\u4e8e\u7528\u4f8b\u4e2d\u5bfc\u5165\u65b9\u4fbf\uff0c\u4e0d\u505a\u5176\u4ed6\u4e8b\u60c5\u3002 class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n DfmAssert \u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u7ee7\u627f\uff0c\u65b9\u4fbf\u4f7f\u7528\u65ad\u8a00\u8bed\u53e5\u3002 from apps.dde_file_manager.widget.dfm_widget import DfmWidget\nfrom public.assert import Assert\nclass DfmAssert(Assert):\ndef assert_file_exists_in_desktop(self, file_name):\nself.assert_file_exists(f\"~/Desktop{file_name}\")\n...\nDfmWidget().get_file_in_desktop()\n \u7528\u4f8b\u91cc\u9762\u76f4\u63a5\u7ee7\u627f\uff0c\u65b9\u4fbf\u5728\u7528\u4f8b\u91cc\u9762\u4f7f\u7528 self \u8fdb\u884c\u65ad\u8a00\uff0c\u66f4\u7b26\u5408\u65ad\u8a00\u7684\u4f7f\u7528\u4e60\u60ef\uff0c\u7528\u4f8b\u903b\u8f91\u4e0a\u66f4\u6e05\u695a\u3002 class BaseCase(DfmAssert):\npass\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\nself.assert_file_exists_in_desktop(\"xxx\")\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u903b\u8f91\u4e3e\u4f8b","text":"\u7528\u4f8b\u4ee3\u7801\u8c03\u7528\u903b\u8f91\u4e3e\u4f8b\uff1a # BaseWidget\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n# =============================================\n# TitleWidget\nclass TitleWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_title_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# RightViewWidget\nclass RightViewWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_right_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# =============================================\n# \u51fa\u53e3 DfmWidget\nclass DfmWidget(TitleWidget, RightViewWidget):\npass\n# =============================================\n# in case\nfrom apps.dde_file_manager.widget.dfm_widget import DfmWidget\ndfm = DfmWidget()\ndfm.click_xxx_title_by_ui()\ndfm.click_xxx_right_by_ui()\ndfm.dog.print_desc()\ndfm.ui.print_number()\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u5de5\u7a0b\u6539\u9020\u5b9e\u65bd\u6b65\u9aa4","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_2","title":"1\u3001\u5de5\u7a0b\u4ee3\u7801\u62c9\u53d6","text":"1.1. \u5c06\u81ea\u52a8\u5316\u57fa\u7840\u6846\u67b6\u7684\u529f\u80fd\u62c9\u5230\u672c\u5730 Autotest Basic Frame \uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame 1.2. \u5c06\u5e94\u7528\u5e93\u4ee3\u7801\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u5e94\u7528\u5e93\u7684\u4ed3\u5e93\u547d\u540d\u5e94\u8be5\u662f\u957f\u8fd9\u6837\u7684 autotest_deepin_xxx\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_2","title":"2\u3001\u8c03\u6574\u5de5\u7a0b\u76ee\u5f55","text":"\u6309\u7167 \u65b9\u6848\u8bbe\u8ba1-\u76ee\u5f55\u7ed3\u6784 \u8fdb\u884c\u76ee\u5f55\u8c03\u6574\uff0c\u5c3d\u91cf\u4f7f\u7528\u7f16\u8f91\u5668\u8fdb\u884c\u76f8\u5e94\u7684\u8c03\u6574\uff0c\u7f16\u8f91\u5668\u63a8\u8350\u4f7f\u7528 Pycharm \uff0c\u4ee5\u4e0b\u64cd\u4f5c\u5747\u5728 Pycharm \u91cc\u9762\u53ef\u5b9e\u73b0\u3002 2.1. \u9700\u8981\u79fb\u52a8 py \u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u76f4\u63a5\u5728\u7f16\u8f91\u5668\u91cc\u9762\uff0c\u4f7f\u7528\u9f20\u6807\u9009\u4e2d\u5e76\u6309\u4f4f\uff0c\u4e4b\u540e\u62d6\u52a8\u5230\u76ee\u6807\u4f4d\u7f6e\u5373\u53ef\uff0cPycharm \u4f1a\u5c3d\u53ef\u80fd\u7684\u81ea\u52a8\u89e3\u51b3\u79fb\u52a8\u5bfc\u81f4\u7684\u8def\u5f84\u95ee\u9898\u3002\u6ce8\u610f\uff0c\u6211\u8bf4\u7684\u662f\u201c\u5c3d\u53ef\u80fd\u201d\uff0c\u6709\u4e9b\u9a9a\u64cd\u4f5c\u7f16\u8f91\u5668\u662f\u65e0\u6cd5\u81ea\u52a8\u5904\u7406\u7684\u3002\u5982\u679c\u6ca1\u6709\u88ab\u7f16\u8f91\u5668\u81ea\u52a8\u5904\u7406\u7684\u8def\u5f84\u95ee\u9898\uff0c\u540e\u7eed\u53ea\u80fd\u624b\u52a8\u89e3\u51b3\u3002 2.2. \u9700\u8981\u91cd\u547d\u540d\u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u5728\u7f16\u8f91\u5668\u91cc\u9762\u9009\u4e2d\u6587\u4ef6\uff0c\u7136\u540e\u4f7f\u7528\u5feb\u6377\u952e Shift + F6 \uff08\u5982\u679c\u5feb\u6377\u952e\u6ca1\u53cd\u5e94\uff0c\u6587\u4ef6\u53f3\u952e\u83dc\u5355 Refactor \u2014\u2014 Rename\uff09\uff0c\u7136\u540e\u5728\u8f93\u5165\u6846\u4e2d\u8f93\u5165\u8981\u91cd\u547d\u540d\u7684\u540d\u79f0\uff0c\u540c\u65f6\uff0c\u786e\u8ba4\u52fe\u9009 Search for references \u548c Search in comments and strings \u8fd9\u4e24\u4e2a\u9009\u9879\uff0c\u6700\u540e\u6309\u56de\u8f66\u6216\u8005\u9f20\u6807\u70b9 Refactor \u3002 \u6ce8\u610f\uff0c\u6b64\u65f6\u7f16\u8f91\u5668\u53ef\u80fd\u4f1a\u63d0\u793a\u4f60\uff0c\u4f60\u8fd9\u4e2a\u91cd\u547d\u540d\u7684\u64cd\u4f5c\u5173\u8054\u4e86\u591a\u4e2a\u6a21\u5757\uff0c\u5b83\u88ab\u591a\u4e2a\u5730\u65b9\u90fd\u4f7f\u7528\u5230\u4e86\uff0c\u76f8\u5173\u7684\u6a21\u5757\u662f\u5426\u4e5f\u4e00\u8d77\u6539\u540d\u4e86\uff0c\u8fd9\u4e0d\u5e9f\u8bdd\u5417\uff0c\u7528\u8fd9\u4e2a\u529f\u80fd\u5c31\u662f\u60f3\u628a\u5173\u8054\u5230\u7684\u90fd\u4fee\u6539\uff0c\u4e0d\u7136\u6211\u4e3a\u4ec0\u4e48\u4e0d\u7528\u6587\u7ba1\u7684\u91cd\u547d\u540d\u529f\u80fd\u5462\uff0c\u522b\u60f3\u4e86\uff0c\u76f4\u63a5\u70b9\u5de6\u4e0b\u89d2\u7684 Refactor \u6309\u94ae\uff0c\u5c31\u662f\u5e72\u3002 \u7c7b\u540d\u3001\u51fd\u6570\u540d\u7684\u91cd\u547d\u540d\u90fd\u5c3d\u91cf\u91c7\u7528\u8fd9\u79cd\u65b9\u6848\uff0c\u56e0\u4e3a\u7f16\u8f91\u5668\u4f1a\u81ea\u52a8\u7ed9\u6211\u4eec\u627e\u5230\u5173\u8054\u7684\u5730\u65b9\uff0c\u7136\u540e\u540c\u6b65\u4fee\u6539\u6389\u3002\u4f60\u53ef\u5343\u4e07\u522b\u76f4\u63a5\u5220\u4e86\u4fee\u6539\u540d\u79f0\uff0c\u4e0d\u7136\u4f60\u53ef\u80fd\u4f1a\u82b1\u4e0a\u4e00\u5929\u7684\u65f6\u95f4\u6765\u89e3\u51b3\u91cd\u547d\u540d\u7684\u95ee\u9898\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u5b9e\u73b0\u6838\u5fc3\u5e93\u63a5\u53e3","text":"3.1. BaseWidget \u5728 BaseWidget \u91cc\u9762\u628a\u8be5\u5199\u7684\u90fd\u5199\u597d\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u4e0a\u9762\u7684\u8bbe\u8ba1\u7406\u5ff5\u6765\u5199\u3002 \u5982\u679c\u4f60\u5acc\u9ebb\u70e6\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u6587\u7ba1\u7684\u5b9e\u9645\u5de5\u7a0b\u4ee3\u7801 autotest_dde_file_manager : https://gerrit.uniontech.com/admin/repos/autotest_dde_file_manager \u3002 3.2. \u64cd\u4f5c\u5c42 \u5982\u679c\u4f60\u662f\u65b0\u5199\u9879\u76ee\uff0c\u4f60\u4f1a\u53d1\u73b0\u4e00\u5207\u90fd\u662f\u90a3\u4e48\u7684\u7b80\u5355\u3001\u76f4\u63a5\uff0c\u6309\u7167\u6211\u4eec\u63d0\u4f9b\u7ed9\u4f60\u7684\u63a5\u53e3\u5199\u7528\u4f8b\u7684\u64cd\u4f5c\u65b9\u6cd5\u5c31\u597d\u4e86\u3002 \u5982\u679c\u4f60\u662f\u60f3\u5bf9\u539f\u6765\u7684\u5de5\u7a0b\u8fdb\u884c\u6539\u9020\uff0c\u4f60\u9700\u8981\u6309\u7167\u6838\u5fc3\u5e93\u65b9\u6cd5\u7684\u8c03\u7528\uff0c\u5c06\u4f60\u4e4b\u524d\u5199\u7684\u6bcf\u4e2a\u65b9\u6848\u8fdb\u884c\u5bf9\u5e94\u7684\u4fee\u6539\uff0c\u5305\u62ec\u7c7b\u548c\u65b9\u6cd5\u7684\u547d\u540d\u3001\u65b9\u6cd5\u5185\u6240\u8981\u7528\u5230\u4e0d\u540c\u5b9a\u4f4d\u65b9\u6cd5\u7684\u5199\u6cd5\u4fee\u6539\u3002 \u8fd9\u65f6\u5019\u4f60\u53ef\u80fd\u4f60\u7684\u4ee3\u7801\u4e2d\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u62a5\u9519\uff0c\u4e0d\u7528\u62c5\u5fc3\uff0c\u4f60\u53ef\u4ee5\u4ece\u4e1a\u52a1\u903b\u8f91\u51fa\u53d1\uff0c\u60f3\u6e05\u695a\u8fd9\u4e2a\u65b9\u6cd5\u662f\u5e72\u4ec0\u4e48\u7684\u3001\u64cd\u4f5c\u7684\u5bf9\u8c61\u662f\u4ec0\u4e48\u3001\u53c2\u6570\u662f\u4ec0\u4e48\uff0c\u6ce8\u610f\u8fd9\u4e9b\u4fee\u6539\u662f\u4f1a\u5f71\u54cd\u5230\u7528\u4f8b\u4ee3\u7801\u91cc\u9762\u7684\uff0c\u6ca1\u5173\u7cfb\uff0c\u7528\u4f8b\u91cc\u9762\u672c\u6765\u4e5f\u5e94\u8be5\u88ab\u5173\u8054\u4fee\u6539\u3002 3.3. \u628a\u914d\u7f6e\u6a21\u5757\u5199\u597d\uff0c\u8fd9\u90e8\u5206\u57fa\u672c\u53ef\u4ee5\u590d\u5236\u6587\u7ba1\u7684\u4ee3\u7801\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4_1","title":"4\u3001\u8def\u5f84\u5904\u7406","text":"4.1. \u5bfc\u5165\u8def\u5f84 \u65b9\u6cd5\u548c\u7528\u4f8b\u4e2d\u90fd\u4f1a\u6d89\u53ca\u5230\u5bfc\u5165\u8def\u5f84\u7684\u4fee\u6539\uff0c\u5728\u4fee\u6539\u8def\u5f84\u65f6\uff0c\u5efa\u8bae\u4f60\u4f7f\u7528 Ctrl + Shift + R \u5168\u5c40\u66ff\u6362\uff0c\u4f1a\u5c06\u6574\u4e2a\u9879\u76ee\u4e0b\u7684\u76f8\u540c\u5730\u65b9\u90fd\u4fee\u6539\u5230\uff0c\u5f53\u7136\uff0c\u4f60\u4e5f\u53ef\u4ee5\u5728\u5c0f\u5f39\u7a97\u4e2d\u4fee\u6539\u5168\u5c40\u66ff\u6362\u4e3a\u5c40\u90e8\u76ee\u5f55\u4e0b\u66ff\u6362\u3002\u5904\u7406\u90a3\u79cd\u6ca1\u6709\u5173\u8054\u5173\u7cfb\uff0c\u4f46\u662f\u53c8\u662f\u76f8\u540c\u540d\u79f0\u7684\u91cd\u547d\u540d\uff0c\u6211\u4e5f\u63a8\u8350\u4f7f\u7528\u8fd9\u79cd\u65b9\u5f0f\u8fdb\u884c\u91cd\u547d\u540d\u3002 \u6ce8\u610f\uff0c\u5168\u5c40\u66ff\u6362\u7684\u65b9\u5f0f\u4efb\u7136\u65e0\u6cd5\u4fdd\u8bc1\u771f\u7684\u5168\u5c40\u88ab\u66ff\u6362\u4e86\uff08\u53ef\u80fd\u662f\u7f16\u8f91\u5668\u7684 Bug \u5427\uff09\uff0c\u6240\u4ee5\u4f60\u4ecd\u7136\u9700\u8981\u624b\u52a8\u770b\u4e0b\u5404\u5904\u662f\u5426\u4fee\u6539\u5230\u4f4d\u3002 4.2. \u8d44\u6e90\u8def\u5f84 \u4e00\u4e9b\u7528\u4f8b\u8d44\u6e90\u9700\u8981\u6839\u636e config.py \u91cc\u9762\u7684\u8def\u5f84\u914d\u7f6e\u8fdb\u884c\u8d44\u6e90\u8def\u5f84\u7684\u62fc\u63a5\uff0c\u5982\u679c\u4f60\u539f\u6765\u672c\u6765\u5c31\u6709\u4e00\u4e2a\u51fd\u6570\u4e13\u95e8\u7528\u4e8e\u7ec4\u88c5\u8def\u5f84\u7684\uff0c\u90a3\u4f60\u53ea\u9700\u8981\u4fee\u6539\u8fd9\u4e00\u4e2a\u5730\u65b9\u5c31\u597d\u4e86\uff0c\u5982\u679c\u4f60\u4e4b\u524d\u5e76\u6ca1\u6709\u8fd9\u6837\u7684\u8bbe\u8ba1\uff0c\u90a3\u53ef\u80fd\u9700\u8981\u4fee\u6539\u5927\u91cf\u6d89\u53ca\u5230\u8d44\u6e90\u8def\u5f84\u7684\u5730\u65b9\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5","title":"5\u3001\u8c03\u8bd5\u548c\u7f16\u5199\u7528\u4f8b","text":"\u4ee5\u4e0a\u51e0\u4e2a\u6b65\u9aa4\u505a\u5b8c\uff0c\u57fa\u672c\u5c31\u53ef\u4ee5\u8fdb\u884c\u7528\u4f8b\u4ee3\u7801\u7684\u8c03\u8bd5\u4e86\uff0c\u8fd9\u90e8\u5206\u5de5\u4f5c\u4e3b\u8981\u89e3\u51b3\u4f60\u4e4b\u524d\u51e0\u4e2a\u6b65\u9aa4\u9057\u6f0f\u7684\u95ee\u9898\uff0c\u5982\u679c\u6240\u6709\u7528\u4f8b\u90fd\u8c03\u8bd5\u901a\u8fc7\u4e86\uff0c\u90a3\u4e48\u5de5\u7a0b\u6539\u9020\u5c31\u5168\u90e8\u5b8c\u6210\u4e86\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/","title":"AT \u5f00\u53d1\u89c4\u8303","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u5f00\u53d1\u89c4\u8303\u662f\u6839\u636e\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fd0\u884c\u4e24\u5e74\u591a\u6765\uff0c\u9047\u5230\u95ee\u9898\u89e3\u51b3\u95ee\u9898\u800c\u5f62\u6210\u7684\u4e00\u4e9b\u89e3\u51b3\u65b9\u6848\uff0c\u6216\u8005\u8bf4\u7ecf\u9a8c\u603b\u7ed3\uff1b\u8fd9\u4e9b\u7ecf\u9a8c\u7b26\u5408\u6211\u4eec\u73b0\u9636\u6bb5 AT \u6240\u5e94\u7528\u7684\u573a\u666f\u9700\u8981\uff0c\u4e5f\u662f\u6211\u4eec\u7ecf\u8fc7\u957f\u671f\u601d\u8003\uff0c\u4e0d\u65ad\u8bd5\u9519\u4e0d\u65ad\u4fee\u6b63\uff0c\u5e76\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u5b9e\u8df5\u4e2d\u68c0\u9a8c\u8fc7\u53ef\u884c\u7684\u3002\u4ee5\u6b64\uff0c\u5e0c\u671b\u80fd\u5e2e\u52a9\u53c2\u4e0e\u5230\u81ea\u52a8\u5316\u7684\u76f8\u5173\u4eba\u5458\u51cf\u5c11\u8bd5\u9519\u6210\u672c\uff0c\u66f4\u597d\u3001\u66f4\u5feb\u7684\u7f16\u5199\u7528\u4f8b\u53ca\u7ef4\u62a4\u7528\u4f8b\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_1","title":"\u4e00\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u89c4\u8303","text":"\u6807\u7b7e\u5316\u7ba1\u7406\u6587\u6863\u8bf7\u53c2\u8003\uff1a \u300a\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u64cd\u4f5c\u6307\u5f15\u300b \u4ee5\u4e0b\u8bf4\u51e0\u4e2a\u5bb9\u6613\u51fa\u73b0\u7684\u95ee\u9898\uff1a"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1","title":"1. \u5bf9\u5e94\u5173\u7cfb","text":" \u5199\u5b8c\u81ea\u52a8\u5316\u7528\u4f8b\u4e4b\u540e\uff0c\u8bf7\u5728 CSV \u6587\u4ef6\u4e2d\u6807\u8bb0\u7528\u4f8b\u7684 ID\u3001\u7b49\u7ea7\u3002\u4e3a\u4e86\u63d0\u9192\u6807\u8bb0\uff0c\u6267\u884c\u7528\u4f8b\u65f6\u5728\u9996\u884c\u4f1a\u8f93\u51fa ERROR \u65e5\u5fd7\uff1a CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94\u7684 ID\uff1b \u5728\u6700\u7ec8\u63d0\u4ea4\u4ee3\u7801\u4e4b\u524d\uff0c\u4f60\u9700\u8981\u5728 CSV \u6587\u4ef6\u91cc\u9762\u5c06ID\u3001\u7528\u4f8b\u7b49\u7ea7\u7b49\u6807\u7b7e\u8865\u5168\uff0c\u5982\u679c CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94 ID\uff0c\u540e\u7eed\u5728\u6279\u91cf\u6267\u884c\u7684\u65f6\u5019\uff0c\u8fd9\u4e9b\u7528\u4f8b\u662f\u4e0d\u4f1a\u6267\u884c\u7684\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2","title":"2. \u540d\u79f0\u4e00\u81f4","text":" CSV \u6587\u4ef6\u7684\u6587\u4ef6\u540d\u3001\u7528\u4f8b\u51fd\u6570\u4e2d\u95f4\u7684\u540d\u79f0\u4e00\u81f4\u3001\u7528\u4f8b py \u6587\u4ef6\u4e2d\u95f4\u7684\u540d\u79f0\uff0c\u8fd9\u4e09\u4e2a\u540d\u79f0\u4e00\u81f4\u3002 \u4e3e\u4f8b\uff1a # test_music_001.py\ndef test_music_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u90a3\u4e48 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e3a music.csv\u3002 AT \u6846\u67b6\u5e95\u5c42\u4ee3\u7801\u5b9e\u73b0\u662f\u5c06 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e0e\u7528\u4f8b\u51fd\u6570\u540d\u79f0\u540d\u79f0\uff08item.name\uff09\u8fdb\u884c\u5bf9\u5e94\uff0c\u56e0\u6b64\uff0c\u6ce8\u610f CSV \u6587\u4ef6\u540d\u79f0\u5bf9\u5e94\u7684\u662f\u7528\u4f8b\u51fd\u6570\u540d\u79f0\uff0c\u5373 def test_music_001 \u91cc\u9762\u7684 music \uff0c\u800c\u4e0d\u662f test_music_001.py \u91cc\u9762\u7684 music \u3002 \u8fd9\u91cc\u7ec6\u7ec6\u54c1\u4e00\u4e0b\u54c8~ \u5982\u679c\u4f60\u5c06\u4e0a\u4f8b\u5199\u6210\u4e86\u8fd9\u6837: # test_music_001.py\ndef test_movie_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u7528\u4f8b\u6267\u884c\u6ca1\u95ee\u9898\uff0c\u4f46\u662f\u6807\u7b7e\u5316\u7ba1\u7406\u662f\u4e0d\u751f\u6548\u7684\uff0c\u6846\u67b6\u65e0\u6cd5\u5c06 music.csv\u6587\u4ef6\u91cc\u9762\u6807\u7b7e\uff0c\u6dfb\u52a0\u5230 test_movie_001\u8fd9\u4e2a\u7528\u4f8b\u4e2d\uff0c\u56e0\u4e3a\u4ed6\u4eec\u6ca1\u6709\u5bf9\u5e94\u5173\u7cfb\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#tag","title":"\u4e8c\u3001\u5206\u652f\u53ca tag \u7ba1\u7406\u89c4\u8303","text":"\u53c2\u8003\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u4ee3\u7801\u7ba1\u7406\u89c4\u8303\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2-tag","title":"2. \u5e94\u7528\u5e93 tag","text":" \u5e94\u7528\u5e93 tag \u6839\u636e\u5e94\u7528\u4ea4\u4ed8\u8282\u70b9\u751f\u6210\uff0c\u6bcf\u6b21\u6253 tag \u4e4b\u524d\uff0c\u76f8\u5173\u6d4b\u8bd5\u4eba\u5458\u9700\u8981\u8fdb\u884c\u7528\u4f8b\u8c03\u8bd5\uff1b \u8c03\u8bd5\u7528\u4f8b\u662f\u6307\u7684\u5728\u5168\u67b6\u6784\uff08x86\u3001arm\u3001mips\uff09\u4e0a\u8c03\u8bd5\u901a\u8fc7\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\u8fbe\u5230 90% \u4ee5\u4e0a\u624d\u80fd\u6253 tag\uff0c\u901a\u8fc7 Jenkins \u6267\u884c\u5668\u6267\u884c\u7528\u4f8b\uff0c\u4fdd\u7559\u901a\u8fc7\u7387\u7ed3\u679c\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\uff1a\u901a\u8fc7\u7528\u4f8b\u6570 / (\u603b\u7528\u4f8b\u6570 - \u5df2\u5e9f\u5f03\u7528\u4f8b) \u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u7b97\u901a\u8fc7 Jenkins \u6267\u884c\u5668 \u4f60\u53ef\u80fd\u4f1a\u5728\u4e00\u4e2a\u4ea4\u4ed8\u5468\u671f\u5185\u6301\u7eed\u7684\u8fdb\u884cAT\u7528\u4f8b\u8c03\u8bd5\uff0c\u4f46\u662f\u6700\u7ec8 AT \u7528\u4f8b\u6253 tag \u7684\u5e94\u7528\u7248\u672c\uff0c\u9700\u8981\u4f7f\u7528\u5e94\u7528\u96c6\u6210\u4ea4\u4ed8\u7684\u6700\u65b0\u5e94\u7528\u7248\u672c\uff0c\u53ef\u4ee5\u4f7f\u7528\u5e94\u7528\u7684\u63d0\u6d4b\u7248\u672c\uff1b\u4e00\u5b9a\u8981\u786e\u4fdd\u8c03\u8bd5\u7528\u4f8b\u7684\u5e94\u7528\u7248\u672c\u662f\u6700\u65b0\u7684\uff0c\u4e0d\u7136\u96c6\u6210\u8fdb\u53bb\u4e4b\u540e\uff0c\u6301\u7eed\u96c6\u6210\u5c31\u4f1a\u51fa\u95ee\u9898\uff1b tag \u53f7\u600e\u4e48\u6253\uff1f \u6839\u636e\u6301\u7eed\u96c6\u6210\u7684\u8981\u6c42\u751f\u6210\uff0c\u5176\u4e2d\u5e94\u7528\u7248\u672c\u53f7\u9700\u8981\u4e0e\u9879\u76ee\u7ecf\u7406\u786e\u8ba4\u672c\u6b21\u5373\u5c06\u96c6\u6210\u7684\u5e94\u7528\u7248\u672c\u53f7\u662f\u591a\u5c11\uff1b tag \u7684 commit \u4fe1\u606f\u683c\u5f0f\uff1a # commit msg\nversion:5.6.5\n \u5176\u4e2d 5.6.5 \u5199\u5e94\u7528\u7684\u96c6\u6210\u7248\u672c\u53f7\u3002 \u751f\u6210 tag \u7684\u547d\u4ee4\u53c2\u8003\uff1a\u300aGit \u6807\u7b7e\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3-tag","title":"3. \u57fa\u7840\u6846\u67b6 tag","text":"\u57fa\u7840\u6846\u67b6 tag \u4e0d\u4e0e\u4e1a\u52a1\u6302\u94a9\uff0c\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u6309\u9700\u53d1\u5e03\u7248\u672c\uff0c\u5728\u6839\u76ee\u5f55\u4e0b CURRENT \u6587\u4ef6\u4e2d\u8bb0\u5f55\u7684\u5f53\u524d\u7248\u672c\u53f7\u548c\u5386\u53f2\u7248\u672c\u53f7\uff0c\u53ca\u5176\u5bf9\u5e94\u65b0\u589e\u4e86\u54ea\u4e9b\u529f\u80fd\uff0c\u6709\u52a9\u4e8e\u5e94\u7528\u9009\u62e9\u5408\u9002\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\u3002 # CURRENT\n[current]\ntag = 0.9.5\n \u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u7684 control \u6587\u4ef6\u8bb0\u5f55\u5f53\u524d\u5e94\u7528\u5e93\u4f9d\u8d56\u7684\u57fa\u7840\u5e93\u7248\u672c\u3002 # control\n[Depends]\nautotest-basic-frame = 0.9.5\n \u7528\u4f8b\u5728\u6267\u884c\u65f6\u4f1a\u6821\u9a8c\u4e24\u4e2a\u6587\u4ef6\u7684\u7248\u672c\u53f7\u662f\u5426\u4e00\u81f4\uff0c\u5982\u679c\u4e0d\u4e00\u81f4\uff0c\u4f1a\u6253\u5370 error \u65e5\u5fd7\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_2","title":"\u4e09\u3001\u4ed3\u5e93\u6743\u9650\u7ba1\u7406","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_1","title":"1. \u57fa\u7840\u6846\u67b6","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u4ed3\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame \u57fa\u7840\u6846\u67b6\u4e0d\u5141\u8bb8\u533f\u540d\u8bbf\u95ee\uff0c\u5982\u679c\u4f60\u767b\u5f55 gerrit \u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u8bbf\u95ee\u4ee5\u4e0a\u94fe\u63a5\uff0c\u5219\u9700\u8981\u7533\u8bf7\u8bbf\u95ee\u6743\u9650\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_1","title":"2. \u5e94\u7528\u4ed3\u5e93","text":" \u81ea\u52a8\u5316\u5e94\u7528\u4ed3\u5e93\uff1a https://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684 app_name \u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_3","title":"\u56db\u3001\u65b9\u6cd5\u7f16\u5199&\u8c03\u7528\u89c4\u8303","text":"\u65b9\u6cd5\u7f16\u5199\u6574\u4f53\u8bbe\u8ba1\u601d\u8def\u53c2\u8003\uff1a[\u300aAT\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b]"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_2","title":"1. \u65b9\u6cd5\u7f16\u5199","text":"\u5199\u65b9\u6cd5\u7684\u65f6\u5019\u6ce8\u610f\u65b9\u6cd5\u5f52\u5c5e\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget\uff0c\u65b9\u6cd5\u662f\u5728\u54ea\u4e2a\u533a\u57df\u64cd\u4f5c\u7684\uff0c\u5c31\u5199\u5728\u54ea\u4e2a\u7c7b\u91cc\u9762\u3002 \u4e3e\u4f8b\uff1a from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n\"\"\"\u70b9\u51fb\u6807\u9898\u680fxxx\"\"\"\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_2","title":"2. \u65b9\u6cd5\u8c03\u7528","text":" \u5728\u7528\u4f8b\u4e2d\u8c03\u7528\u65b9\u6cd5\uff0c\u901a\u8fc7\u8be5\u5e94\u7528\u552f\u4e00\u7684\u51fa\u53e3\u8fdb\u884c\u8c03\u7528\uff0c\u6bd4\u5982\u6587\u7ba1\uff1a class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n \u4e0d\u8981\u5728\u7528\u4f8b\u4e2d\u5355\u72ec\u53bb\u8c03\u7528 TitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u8fd9\u4e9b\u7c7b\uff0c\u5426\u5219\u540e\u671f\u7528\u4f8b\u4f1a\u53d8\u5f97\u4e0d\u597d\u7ef4\u62a4\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_4","title":"\u4e94\u3001\u7528\u4f8b\u7f16\u5199\u89c4\u8303","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_3","title":"1. \u57fa\u4e8e\u7c7b\u5199\u7528\u4f8b","text":"\u6240\u6709\u7528\u4f8b\u90fd\u5e94\u8be5\u57fa\u4e8e\u7c7b\u53bb\u5199\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001(self):\n\"\"\"\u97f3\u4e50\u542f\u52a8\"\"\"\n \u6ce8\u610f\u4ee5\u4e0b\u51e0\u70b9\uff1a \u7c7b\u540d\u4e0d\u8981\u968f\u4fbf\u53d6\uff0c\u540c\u4e00\u4e2a\u5e94\u7528\u5e94\u8be5\u4f7f\u7528\u540c\u4e00\u4e2a\u7c7b\u540d\uff0c\u7528\u4f8b\u7c7b\u540d\u79f0\u5fc5\u987b\u4ee5 Test \u5f00\u5934\uff0c\u9075\u5faa\u5927\u9a7c\u5cf0\u547d\u540d\u89c4\u8303\uff1b \u7528\u4f8b\u7c7b\u7ee7\u627f BaseCase\uff0c\u4e00\u4e2a\u5e94\u7528\u53ea\u6709\u4e00\u4e2a BaseCase \u4e00\u4e2a py \u6587\u4ef6\u91cc\u9762\u53ea\u6709\u4e00\u4e2a\u7c7b\uff0c\u6211\u4eec\u79f0\u4e3a\u4e00\u4e2a\u6d4b\u8bd5\u7c7b\uff1b \u4e00\u4e2a\u7c7b\u91cc\u9762\u53ef\u4ee5\u6709\u591a\u4e2a\u7528\u4f8b\u51fd\u6570\uff0c\u8fd9\u53d6\u51b3\u8fd9\u6761\u7528\u4f8b\u6709\u591a\u5c11\u4e2a\u6d4b\u8bd5\u70b9\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001_1(self):\n\"\"\"\u4efb\u52a1\u680f\u542f\u52a8\u97f3\u4e50\"\"\"\ndef test_music_001_2(self):\n\"\"\"\u542f\u52a8\u5668\u542f\u52a8\u97f3\u4e50\"\"\" \ndef test_music_001_3(self):\n\"\"\"\u684c\u9762\u542f\u52a8\u97f3\u4e50\"\"\"\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_3","title":"2. \u7528\u4f8b\u51fd\u6570\u89c4\u8303","text":" \u7528\u4f8b\u51fd\u6570\u4ee5 test \u5f00\u5934\uff0c\u9075\u5faa\u86c7\u5f62\u547d\u540d\u89c4\u8303\uff0c\u4e2d\u95f4\u4e3a\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0\uff0c\u540e\u9762\u52a0\u7528\u4f8b ID\uff0c\u6700\u540e\u52a0\u6d4b\u8bd5\u70b9\u5e8f\u53f7\uff0c\u5373 test_${module}_${case_id}[_${index}] \uff1b \u6bd4\u5982\uff1atest_music_001_1\uff0cindex \u4ece 1 \u5f00\u59cb\u3002 \u51fd\u6570\u529f\u80fd\u8bf4\u660e\u91cc\u9762\u5199\u7528\u4f8b\u6807\u9898\uff0c\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u6807\u9898\u5373\u53ef\uff0c\u6ce8\u610f\u7528\u4e09\u5bf9\u53cc\u5f15\u53f7\uff0c\u4e0d\u8981\u7528\u5176\u4ed6\u6ce8\u91ca\uff0c\u66f4\u4e0d\u8981\u7528\u4e95\u53f7\u6ce8\u91ca\u5199\u7528\u4f8b\u6807\u9898\uff1b \u76f4\u63a5\u590d\u5236 PMS \u7528\u4f8b \u7528\u4f8b\u6b65\u9aa4\u76f4\u63a5\u5c06 PMS \u4e0a\u7528\u4f8b\u6b65\u9aa4\u548c\u9884\u671f\u590d\u5236\u8fdb\u6765\uff0c\u7136\u540e\u8fdb\u884c\u6279\u91cf\u6ce8\u91ca\uff08ctrl + /\uff09\uff0c\u5728\u6ce8\u91ca\u7684\u57fa\u7840\u4e0a\u53bb\u5199\u7528\u4f8b\u811a\u672c\u4f1a\u66f4\u52a0\u65b9\u4fbf\u5168\u9762\uff0c\u4e5f\u6bd4\u4f60\u81ea\u5df1\u5199\u6ce8\u91ca\u66f4\u8282\u7ea6\u65f6\u95f4\uff1a \u4e3e\u4f8b\uff0cPMS \u7528\u4f8b\uff1a \u76f4\u63a5\u9009\u4e2d\u7528\u4f8b\u5185\u5bb9\uff0c\u590d\u5236\u4e0b\u6765\uff0c\u7136\u540e\u7c98\u8d34\u5230\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c\u4e2d\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\n \u4e0a\u4f8b\u4e2d\u4e95\u53f7\u6ce8\u91ca\u90e8\u5206\u5c31\u662f\u76f4\u63a5\u4ece PMS \u4e0a\u590d\u5236\u8fc7\u6765\u7684\uff0c\u5728\u6b64\u57fa\u7840\u4e0a\u5199\u7528\u4f8b\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\nmusic = DeepinMusicWidget()\nmusic.click_singer_btn_in_music_by_ui()\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\nmusic.click_icon_mode_in_music_by_ui()\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\nmusic.double_click_first_singer_in_singer_icon_view_by_ui()\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\nself.assert_xxx\n \u4f60\u770b\uff0c\u975e\u5e38\u6e05\u695a\u6bcf\u4e00\u6b65\u5728\u505a\u4ec0\u4e48\uff0c\u91cd\u70b9\u662f\u7701\u53bb\u4e86\u5199\u6ce8\u91ca\u7684\u65f6\u95f4\uff0c\u771f\u7684\u7092\u9e21\u65b9\u4fbf\u3002 \u4e0d\u5199 if __name__ == '__main__':\uff0c\u4e0d\u5199\u591a\u4f59\u7684\u4ee3\u7801\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3","title":"3. \u6570\u636e\u9a71\u52a8","text":" \u5982\u679c\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u662f\u76f8\u540c\u7684\uff0c\u53ea\u662f\u4e00\u4e9b\u53c2\u6570\u53d8\u5316\uff0c\u5c3d\u91cf\u4f7f\u7528\u6570\u636e\u9a71\u52a8\u6765\u5b9e\u73b0\u7528\u4f8b\uff1b \u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u6570\u636e\u9a71\u52a8\u7684\u6570\u636e\uff0c\u4e0d\u80fd\u56e0\u6b64\u5f15\u5165\u4f9d\u8d56\uff0c\u5c3d\u91cf\u4f7f\u7528\u4e00\u4e9b\u6807\u51c6\u5e93\u80fd\u8bfb\u53d6\u7684\u6587\u4ef6\u683c\u5f0f\uff0c\u6bd4\u5982 json\u3001ini\u3001CSV\u3001xml\u3001txt \u7b49\u6587\u4ef6\u683c\u5f0f\uff1b\u4e0d\u5efa\u8bae\u4f7f\u7528 Yaml\u3001Excel\u3001MySQL \u7b49\u6570\u636e\u683c\u5f0f\uff1b \u8bfb\u53d6\u6570\u636e\u65f6\u4e5f\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff0c\u5982\u4f7f\u7528 pandas \u5904\u7406 CSV \u5c31\u5c5e\u4e8e\u5927\u6750\u5c0f\u7528\u4e86\uff0c\u6b63\u5e38\u7684\u6570\u636e\u9a71\u52a8\u8fd8\u6ca1\u5230\u9700\u8981\u5927\u6570\u636e\u5206\u6790\u6765\u5904\u7406\u7684\u5730\u6b65\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u5728 widget/ddt/ \u76ee\u5f55\u4e0b\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5199\u6cd5\uff1a @pytest.mark.parametrize(\"value\", data)\ndef test_smb_049(self, value):\n \u4ee5\u4e0a\u8fd9\u79cd\u53c2\u6570\u5316\u7684\u5199\u6cd5\u672c\u8eab\u6ca1\u4ec0\u4e48\u95ee\u9898\uff0c\u4f46\u662f\uff0c\u8fd9\u91cc\u5fc5\u987b\u8981\u8865\u5145\u4e00\u4e2a\u6ca1\u6709\u7528\u7684\u5c0f\u77e5\u8bc6\uff1a \u5982\u679c\u53c2\u6570\u5316\u6570\u636e\u91cc\u9762\u7684\u5b57\u7b26\u4f1a\u539f\u5c01\u4e0d\u52a8\u7684\u8f93\u51fa\u5230 item.name \u91cc\u9762\uff0c\u663e\u793a\u975e\u5e38\u4e0d\u4f18\u96c5\uff0c\u800c\u4e14\u53ef\u4ee5\u4f1a\u5f15\u5165\u4e00\u4e9b\u610f\u60f3\u4e0d\u5230\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u611f\u53d7\u4e00\u4e0b\uff1a \u53c2\u6570\uff1a data = [\n\"\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\", \"qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678\",\n]\n \u73b0\u8c61\u662f\u8fd9\u6837\u8272\u513f\u7684\uff1a test_smb_049.py::TestFileManager::test_smb_049[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09]\ntest_smb_049.py::TestFileManager::test_smb_049[qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui]\ntest_smb_049.py::TestFileManager::test_smb_049[12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678]\n \u8bf4\u5b9e\u8bdd\uff0c\u770b\u7740\u5fc3\u91cc\u5835\u5f97\u614c\uff0c\u5982\u679c\u8fd9\u91cc\u9762\u5305\u542b\u4e00\u4e9b\u7279\u6b8a\u5b57\u7b26\u6216\u8005\u662f\u8d85\u957f\uff0c\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u5f88\u5947\u5999\u7684\u4e8b\u60c5\u53d1\u751f\u3002 parametrize \u91cc\u9762\u6709\u4e2a\u53c2\u6570\uff1aids\uff0c\u53ef\u4ee5\u89e3\u51b3\u6b64\u7c7b\u95ee\u9898\uff0c\u5c31\u50cf\u8fd9\u6837\uff1a @pytest.mark.parametrize(\"value\", data, ids=[1, 2, 3])\ndef test_smb_049(self, value):\n \u518d\u6765\u611f\u53d7\u4e00\u4e0b\uff1a test_smb_049.py::TestFileManager::test_smb_049[1]\ntest_smb_049.py::TestFileManager::test_smb_049[2]\ntest_smb_049.py::TestFileManager::test_smb_049[3]\n \u660e\u663e\u597d\u591a\u4e86\uff0c\u6240\u4ee5\u5c3d\u91cf\u4f7f\u7528 ids \u8fd9\u4e2a\u53c2\u6570\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 fixture \u7684\u6570\u636e\u9a71\u52a8\u65b9\u5f0f\uff0c\u6846\u67b6\u867d\u7136\u652f\u6301\uff0c\u4f46\u53ef\u8bfb\u6027\u6bd4\u8f83\u5dee\uff1b\u5982\u679c\u4f60\u4e0d\u77e5\u9053\u8fd9\u53e5\u8bdd\u5728\u8bf4\u5565\uff0c\u90a3\u4f60\u53ef\u4ee5\u5ffd\u7565\uff0c\u6211\u4e5f\u4e0d\u6253\u7b97\u8be6\u7ec6\u8bf4\u8fd9\u79cd\u5b9e\u73b0\u65b9\u5f0f\uff0c\u64cd\u4f5c\u6bd4\u8f83\u9a9a\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4","title":"4. \u65ad\u8a00\u8d44\u6e90","text":" \u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u76f4\u63a5\u653e\u5728\u7528\u4f8b\u6a21\u5757\u7684\u540c\u7ea7\u76ee\u5f55\u4e0b\u7684 assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0 + \u7528\u4f8b ID \u547d\u540d\uff1b \u56fe\u50cf\u8bc6\u522b\u65ad\u8a00\uff0c\u4e0d\u8981\u622a\u53d6\u4e00\u5f20\u5f88\u5927\u7684\u56fe\uff0c\u56fe\u7247\u8d44\u6e90\u5305\u542b\u7684\u5143\u7d20\u592a\u591a\u4e86\uff0c\u975e\u5e38\u5bb9\u6613\u53d7\u5230\u9700\u6c42\u5f71\u54cd\uff0c\u5efa\u8bae\u662f\u8fdb\u884c\u5c40\u90e8\u7684\u65ad\u8a00\uff1b \u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u5339\u914d\u5ea6\u662f 0.9\uff0c\u5982\u679c\u65ad\u8a00\u7684\u573a\u666f\u5bf9\u4e8e\u7cbe\u786e\u5ea6\u8981\u6c42\u6ca1\u90a3\u4e48\u9ad8\uff0c\u53ef\u4ee5\u5728\u65ad\u8a00\u8bed\u53e5\u91cc\u9762\u4f20\u5165\u5c0f\u4e8e 0.9 \u7684\u53c2\u6570\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5","title":"5. \u5143\u7d20\u5b9a\u4f4d","text":" \u7528\u4e8e\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u4e2d\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u547d\u540d\u4e3a\u8be5\u5143\u7d20\u7684\u540d\u79f0\uff1b \u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u622a\u53d6\u65f6\u5c3d\u91cf\u7cbe\u786e\u5230\u8fd9\u4e2a\u5177\u4f53\u7684\u6309\u94ae\uff0c\u56fe\u7247\u4e5f\u4e0d\u8981\u592a\u5927\uff1b \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u64cd\u4f5c\u8f83\u5feb\uff0c\u5408\u7406\u52a0\u5165\u7b49\u5f85\u65f6\u95f4\u80fd\u63d0\u9ad8\u7528\u4f8b\u7684\u7a33\u5b9a\u6027\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6","title":"6. \u7528\u4f8b\u8d44\u6e90","text":" \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u4f7f\u7528\u5230\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u6bd4\u5982\u97f3\u4e50\u53ef\u80fd\u9700\u8981\u4e00\u4e9b mp3 \u7684\u8d44\u6e90\u7528\u4e8e\u6d4b\u8bd5\uff0c\u5b58\u653e\u5728 widget/case_res \u76ee\u5f55\u4e0b\uff0c\u524d\u63d0\u662f\u8fd9\u4e9b\u8d44\u6e90\u4e0d\u8d85\u8fc7 10M\uff1b \u5982\u679c\u662f\u4e00\u4e9b\u6bd4\u8f83\u5927\u7684\u8d44\u6e90\uff0c\u5efa\u8bae\u653e\u5230\u7edf\u4e00\u7684 ftp \u670d\u52a1\u5668 \uff08ftp://10.8.10.245\uff09\uff0c\u9700\u8981\u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\u518d\u4e0b\u8f7d\u4e0b\u6765\uff1b f\"wget ftp://{Config.FTP_IP}/uploads/\u591a\u5a92\u4f53/\u5f71\u9662/auto/{file_name};unzip {file_name};rm -rf {file_name};\"\n \u6d4b\u8bd5\u8d44\u6e90\u4e0b\u8f7d\u5230\u5e94\u7528 widget/case_res \u76ee\u5f55\u4e0b\uff1b \u7981\u6b62\u5c06\u6d4b\u8bd5\u8d44\u6e90\u5b58\u653e\u5728\u4e2a\u4eba\u7684\u673a\u5668\u4e0a\uff1b \u5e94\u8be5\u5c3d\u91cf\u4fdd\u8bc1\uff0c\u4e00\u4e2a\u8d44\u6e90\u5728\u4e00\u6b21\u7528\u4f8b\u6267\u884c\u4e2d\u53ea\u9700\u8981\u4e0b\u8f7d\u4e00\u6b21\uff0c\u6240\u4ee5\u4f60\u4e0d\u80fd\u6bcf\u6b21\u4f7f\u7528\u7684\u65f6\u5019\u90fd\u53bb\u4e0b\u8f7d\uff0c\u8fd9\u6837\u53ef\u80fd\u4f1a\u8017\u8d39\u5927\u91cf\u7684\u7f51\u7edc\u8d44\u6e90\uff0c\u800c\u56e0\u4e3a\u5148\u5224\u65ad\u672c\u5730\u662f\u5426\u5b58\u5728\u6b64\u8d44\u6e90\uff0c\u5982\u679c\u4e0d\u5b58\u5728\u518d\u53bb\u4e0b\u8f7d\uff1b \u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u5c06\u8d44\u6e90\u62f7\u8d1d\u5230\u5bf9\u5e94\u7684\u6d4b\u8bd5\u76ee\u5f55\u4e0b\uff0c\u6bd4\u5982\u5c06 mp3 \u6587\u4ef6\u62f7\u8d1d\u5230 ~/Music \u76ee\u5f55\u4e0b\uff0c\u4f46\u662f\u6211\u4eec\u66f4\u5efa\u8bae\u4f60\u4f7f\u7528\u53d1\u9001\u5feb\u6377\u94fe\u63a5\u7684\u65b9\u5f0f\u66ff\u4ee3\u62f7\u8d1d\u7684\u64cd\u4f5c\uff0c\u56e0\u4e3a\u5728\u62f7\u8d1d\u5927\u6587\u4ef6\u65f6\u662f\u5f88\u6d88\u8017\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u800c\u521b\u5efa\u94fe\u63a5\u5219\u4e0d\u4f1a\uff1b @classmethod\ndef recovery_many_movies_in_movie_by_cmd(cls):\n\"\"\"\u6062\u590d\u591a\u4e2a\u89c6\u9891\u6587\u4ef6\u81f3\u89c6\u9891\u76ee\u5f55\u4e2d\"\"\"\nwork_path = f\"/home/{Config.USERNAME}/Videos/auto\"\ncode_path = f\"{Config.CASE_RES_PATH}/auto\"\ncls.run_cmd(f\"rm -rf {work_path};mkdir {work_path}\")\nsleep(1)\nflag = False\nif not exists(code_path):\ncls.run_cmd(f\"mkdir -p {code_path}\")\nflag = True\nlogger.info(f\"ln -s {code_path}/* {work_path}/\")\ncls.run_cmd(\nf\"cd {code_path}/;\"\nf\"{cls.wget_file('auto.zip') if flag else ''}\"\nf\"ln -s {code_path}/* {work_path}/ > /dev/null 2>&1\"\n)\n \u8d44\u6e90\u4e0b\u8f7d\u8fc7\u7a0b\u4e2d\u6ce8\u610f\u8d85\u65f6\u7684\u95ee\u9898\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u5f88\u5927\uff0c\u8981\u7279\u522b\u6ce8\u610f\u8fd9\u95ee\u9898\uff0c\u5982\u679c\u4f60\u4f7f\u7528\u5f3a\u5236\u7b49\u5f85\u4e0b\u8f7d\u7ed3\u675f( os.system )\uff0c\u53ef\u80fd\u4f1a\u9020\u6210\u7528\u4f8b\u6267\u884c\u65f6\u957f\u53d8\u5f97\u4e0d\u53ef\u63a5\u53d7\uff0c\u76ee\u524d\u6211\u4eec\u53d1\u73b0\u5728\u6301\u7eed\u96c6\u6210\u73af\u5883\u6267\u884c\u65f6\u7f51\u7edc\u4e0b\u8f7d\u901f\u5ea6\u5f88\u6162\uff0c\u6240\u4ee5\u8d85\u65f6\u673a\u5236\u662f\u5f88\u6709\u5fc5\u8981\u7684\uff1brun_cmd \u65b9\u6cd5\u6709\u4e00\u4e2a\u9ed8\u8ba4\u8d85\u65f6\u7684\u65f6\u95f4\uff0c\u4f60\u53ef\u4ee5\u6839\u636e\u8d44\u6e90\u5927\u5c0f\u5bf9\u8d85\u65f6\u65f6\u95f4\u8fdb\u884c\u8c03\u6574\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_5","title":"\u516d\u3001\u7528\u4f8b\u8c03\u8bd5\u6280\u5de7","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_4","title":"1. \u65e5\u5fd7","text":" \u4e00\u5b9a\u8981\u5148\u770b\u62a5\u9519\uff0c\u770b error \u65e5\u5fd7\uff0c\u901a\u5e38\u80fd\u660e\u786e\u7684\u544a\u8bc9\u4f60\u5177\u4f53\u54ea\u91cc\u4ee3\u7801\u62a5\u9519\uff1b \u7ed3\u5408\u62a5\u9519\u70b9\u524d\u9762\u7684error\u3001 info \u548c debug \u65e5\u5fd7\u770b\u5426\u662f\u6b63\u5e38\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_4","title":"2. \u65ad\u70b9\u8c03\u8bd5","text":" \u65b9\u6cd5\u62a5\u9519\uff1a \u5728\u65b9\u6cd5\u5e93\u4e2d\u627e\u5230\u5bf9\u5e94\u7684\u65b9\u6cd5\uff0c\u5355\u72ec\u8c03\u7528\uff0c\u770b\u662f\u5426\u80fd\u6b63\u5e38\u6267\u884c\uff1b \u901a\u5e38\u5355\u4e2a\u65b9\u6cd5\u7684\u6267\u884c\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u62a5\u9519\uff0c\u5f88\u5feb\u5c31\u80fd\u6392\u67e5\u51fa\u95ee\u9898\uff1b\u5728\u65b9\u6cd5\u5185\u90e8\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u65b9\u6cd5\u5185\u90e8\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u8c03\u7528\u6ca1\u95ee\u9898\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u62a5\u9519\u7684\u65b9\u6cd5\u524d\u9762\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u7528\u4f8b\u7684\u4e1a\u52a1\u903b\u8f91\u548c\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u65ad\u8a00\u62a5\u9519\uff1a \u65ad\u8a00\u4e3a\u6570\u636e\u65ad\u8a00\uff0c\u6839\u636e\u8868\u8fbe\u5f0f\u8fdb\u884c\u65ad\u8a00\u8bed\u53e5\u8fdb\u884c\u4fee\u6539\uff1b \u6587\u4ef6\u751f\u6210\u7c7b\u65ad\u8a00\uff0c\u67e5\u770b\u662f\u5426\u9700\u8981\u52a0\u7b49\u5f85\u65f6\u95f4\uff1b \u56fe\u50cf\u65ad\u8a00\uff0c\u5728\u65ad\u8a00\u8bed\u53e5\u5904\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u7528\u4f8b\u8fd0\u884c\u5230\u65ad\u8a00\u5904\u4f1a\u505c\u6b62\uff0c\u67e5\u770b\u6b64\u65f6\u65ad\u8a00\u7684\u56fe\u7247\u4e0e\u7528\u4f8b\u6267\u884c\u7684\u73b0\u573a\u5b58\u5728\u4ec0\u4e48\u5dee\u5f02\uff0c\u6b64\u65f6\u4e5f\u53ef\u4ee5\u8fdb\u884c\u91cd\u65b0\u622a\u56fe\uff0c\u4ece\u800c\u66ff\u6362\u65b0\u7684\u56fe\u7247\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3_1","title":"3. \u8fdc\u7a0b\u6267\u884c","text":" \u8fdc\u7a0b\u6267\u884c\u6307\u7684\u662f\u7f16\u8f91\u5668\u901a\u8fc7\u6307\u5b9a\u8fdc\u7a0b\u89e3\u91ca\u5668\u6267\u884c\u81ea\u52a8\u5316\u4ee3\u7801\uff1b \u8fdc\u7a0b\u6267\u884c\u7684\u597d\u5904\u662f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u7684 Debug \u8fd0\u884c\uff0c\u4e0d\u7528\u5728\u6d4b\u8bd5\u673a\u4e0a\u6253\u5f00\u7f16\u8f91\u5668\uff0c\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u66f4\u5feb\uff1b \u652f\u6301\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u7684\u7f16\u8f91\u5668\uff1a \u4e13\u4e1a\u7248 Pycharm VScode \uff0c\u9700\u8981\u4f7f\u7528\u63d2\u4ef6 Remote-SSH \u8fdc\u7a0b\u6267\u884c\u914d\u7f6e \u4ee5 Pycharm \u4e3a\u4f8b\uff1a File \u2014> Settings \u2014> Project \u2014> Python Interpreter \u2014> \u53f3\u8fb9\u8bbe\u7f6e\u6309\u94ae \u2014> Add... \u2014> SSH Interpreter \u2014> New server configuration(\u586b\u5165host\u548cusername) \u2014> Next \u2014> password\uff08\u6d4b\u8bd5\u673a\u5bc6\u7801\uff09 \u2014> Interpreter(\u9009\u62e9\u8fdc\u7a0b\u89e3\u91ca\u5668) \u2014> Finish "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4_1","title":"4. \u73af\u5883\u6e05\u7406","text":" \u5982\u679c\u7528\u4f8b\u91cc\u9762\u7684 teardown \u6ca1\u6709\u6267\u884c\uff0c\u5927\u6982\u7387\u662f\u56e0\u4e3a setup \u91cc\u9762\u4ee3\u7801\u62a5\u9519\uff0c\u8fd9\u4e24\u4e2a\u662f\u4e00\u5bf9\u7684\uff0csetup \u91cc\u9762\u62a5\u9519\uff0cteardown \u91cc\u9762\u7684\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\uff1b \u76ee\u524d\u6211\u4eec\u5df2\u7ecf\u5c06\u5404\u5e94\u7528\u7684 clean_all \u8fd9\u4e2a fixture \u6539\u6210\u4e86\u7ec8\u7ed3\u5668\uff0c\u786e\u4fdd\u59cb\u7ec8\u80fd\u6267\u884c\u5230\u8fd9\u6b65\uff0c\u4f46\u662f\u7528\u4f8b\u91cc\u9762\u7684 fixture\uff0c\u8fd8\u662f\u9700\u8981\u6211\u4eec\u5c0f\u5fc3\u5904\u7406\uff1b \u8981\u6267\u884c clean_all \u9700\u8981\u5728\u7f16\u8f91\u5668\u8fd0\u884c\u53c2\u6570\u52a0 --clean yes\uff0c\u5199\u7528\u4f8b\u7684\u65f6\u5019\u8bf7\u52a0\u4e0a\uff0c\u4e0d\u7136\u4f60\u4e0d\u786e\u5b9a\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u7684\u73af\u5883\u662f\u5426\u6062\u590d\uff1b setup \u53ef\u4ee5\u4e0d\u8981\uff0c\u5c06 setup \u653e\u5230\u7528\u4f8b\u91cc\u9762\u662f\u4e00\u79cd\u7a33\u59a5\u7684\u505a\u6cd5\uff0cteardown \u4e00\u5b9a\u8981\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5_1","title":"5. \u5143\u7d20\u5b9a\u4f4d\u4e0d\u51c6\uff08\u5750\u6807\u8fd4\u56de\u4e0d\u5bf9\uff09","text":" \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u53ef\u80fd\u53d7\u5230\u7a97\u53e3 ID \u7684\u53d8\u5316\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u9ed8\u8ba4\u53d6\u6700\u65b0\u7684\u4e00\u4e2a\u7a97\u53e3\u7528\u4e8e\u5b9a\u4f4d\uff0c\u4f46\u5982\u679c\u5b9e\u9645\u9700\u8981\u5b9a\u4f4d\u7684\u4e0d\u662f\u6700\u65b0\u7684\u7a97\u53e3\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u91cd\u65b0\u5b9e\u4f8b\u5316\u65b9\u6cd5\u7c7b\u5bf9\u8c61\uff0c\u5e76\u5728\u7c7b\u4e2d\u4f20\u5165\u5bf9\u5e94\u7684\u7a97\u53e3\u5e8f\u53f7\uff1b \u57fa\u4e8e\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u76ee\u524d\u9047\u5230\u7684\u7b14\u8bb0\u672c\u4e0a\uff0c\u7531\u4e8e\u5c4f\u5e55\u7f29\u653e\u6bd4\u4f8b\u4e3a 1.25\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u6211\u4eec\u9ed8\u8ba4\u4f7f\u7528\u7f29\u653e\u6bd4\u4f8b\u4e3a 1\uff1b \u57fa\u4e8e\u56fe\u50cf\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u76ee\u6807\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b \u57fa\u4e8e OCR \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u6587\u5b57\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u540c\u6837\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6_1","title":"6. \u952e\u9f20\u64cd\u4f5c\u4e0d\u51c6","text":" \u9f20\u6807\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6bd4\u5982\u53f3\u952e\u3001\u53cc\u51fb\u65e0\u54cd\u5e94\uff1b \u952e\u76d8\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6216\u8005\u5ef6\u8fdf\u8f93\u5165\uff0c\u6bd4\u5982\u7528\u4f8b\u9700\u8981\u8f93\u5165\u201c\u6211\u662f\u4e2d\u56fd\u4eba\u201d\uff0c\u5b9e\u9645\u53ea\u8f93\u5165\u4e86\u201c\u6211\u56fd\u4eba\u201d\uff1b \u4ee5\u4e0a\u95ee\u9898\u6392\u9664\u5e94\u7528\u5361\u987f\u7b49\u95ee\u9898\uff0c\u5927\u6982\u7387\u662f\u7531\u4e8e\u5de5\u5177\u7684\u95ee\u9898\uff0c\u76ee\u524d\u952e\u9f20\u64cd\u4f5c\u6211\u4eec\u4f7f\u7528\u4e09\u4e2a\u5de5\u5177\uff1aDogtail \u63d0\u4f9b\u7684\u952e\u9f20\u5de5\u5177\u3001PyAutoGUI\u3001Xdotool \uff1b \u6709\u540c\u5b66\u53ef\u80fd\u8981\u8bf4\u4e3a\u5565\u8981\u7528\u4e09\u4e2a\u554a\uff0c\u7528\u4e00\u4e2a\u4e0d\u5c31\u597d\u4e86\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u5404\u6709\u4f18\u70b9\u5404\u6709\u7f3a\u70b9\u3002 \u5982\u679c\u4f60\u9047\u5230\u952e\u9f20\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u8bd5\u8bd5\u901a\u8fc7\u4e0d\u540c\u7684\u5de5\u5177\u64cd\u4f5c\uff1b\u952e\u76d8\u8f93\u5165\u5ef6\u8fdf\u7684\u95ee\u9898\uff0c\u4e00\u822c\u662f\u56e0\u4e3a\u8f93\u5165\u901f\u5ea6\u592a\u5feb\u4e86\uff0c\u7cfb\u7edf\u6ca1\u53cd\u5e94\u8fc7\u6765\uff0c\u5e38\u89c1\u4e8e ARM \u548c MIPS \u4e0a\uff0c\u4fee\u6539\u53c2\u6570 delay_time \u7684\u503c\uff0c\u5355\u4f4d\u4e3a\u6beb\u79d2\uff1b # mouse_key.py\n@classmethod\ndef input_message(cls, message, delay_time=300, interval=0.2):\n\"\"\"\n \u8f93\u5165\u5b57\u7b26\u4e32\n :param message: \u8f93\u5165\u7684\u5185\u5bb9\n :param delay_time: \u5ef6\u8fdf\u65f6\u95f4\n :param interval:\n :return:\n \"\"\"\n \u5982\u679c\u4e0d\u662f\u65b9\u6cd5\u7684\u95ee\u9898\uff0c\u5219\u9700\u8981\u7ee7\u7eed\u548c\u5f00\u53d1\u4e00\u8d77\u6392\u9664\uff0c\u662f\u5426\u4e3a\u5e94\u7528\u63a5\u53d7\u952e\u9f20\u4fe1\u53f7\u5904\u7406\u7684\u95ee\u9898\uff0c\u8fd9\u7c7b\u60c5\u51b5\u6211\u4eec\u4e5f\u662f\u9047\u5230\u8fc7\u7684\uff0c\u5177\u4f53\u95ee\u9898\u5177\u4f53\u5206\u6790\u3002 \u6bd4\u5982\u5f71\u9662\u5c31\u91cd\u5199\u4e86\u4e00\u4e2a\u53f3\u952e\u7684\u65b9\u6cd5\uff1a # base_widget.py\n@classmethod\ndef right_click(cls, _x=None, _y=None):\n\"\"\"\n \u91cd\u5199\u5e95\u5c42\u5355\u51fb\u9f20\u6807\u53f3\u952e\n \u89e3\u51b3\u5f71\u9662\u53f3\u952e\u89e6\u53d1release\u4e8b\u4ef6\u7684\u95ee\u9898\uff08\u53f3\u952e\u4e3b\u7a97\u53e3\u4f1a\u64ad\u653e\u89c6\u9891\uff09\n \"\"\"\ncls.mouse_down(_x, _y, button=3)\nsleep(0.1)\ncls.mouse_up(button=3)\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_6","title":"\u4e03\u3001\u5176\u4ed6\u4e0d\u4e3a\u4eba\u77e5\u7684\u7ec6\u8282","text":" \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u5c3d\u91cf\u7f16\u5199\u540c\u4e00\u4e2a\u5e94\u7528\u6216\u6a21\u5757\u7684\u7528\u4f8b\uff0c\u80fd\u5bf9\u8be5\u7528\u4f8b\u5df2\u6709\u65b9\u6cd5\u719f\u6089\uff0c\u907f\u514d\u8fc7\u591a\u91cd\u590d\u4e1a\u52a1\u4ee3\u7801\u7684\u5c01\u88c5\uff1b \u76f8\u540c\u7684\u573a\u666f\u4e0b\uff0c\u5404\u67b6\u6784\u7b49\u5f85\u65f6\u95f4\u4e0d\u540c\uff0c\u5efa\u8bae\u4f7f\u7528\u6846\u67b6\u63d0\u4f9b\u7684 sleep\uff0c\u6211\u4eec\u505a\u4e86\u4e0d\u540c\u67b6\u6784\u7684\u500d\u6570\u653e\u5927\uff1b \u7f16\u5199\u7528\u4f8b\u65f6\uff0c\u5c3d\u91cf\u8003\u8651\u5230\u6bcf\u4e00\u6b65\u5f02\u5e38\u540e\u7684\u73af\u5883\u6062\u590d\uff0c\u9700\u8981\u5efa\u8bae\u8fd9\u79cd\u610f\u8bc6\uff0c\u968f\u65f6\u8981\u8003\u8651\u5230\uff0c\u8fd9\u6b65\u64cd\u4f5c\u6709\u6ca1\u6709\u53ef\u80fd\u51fa\u9519\uff0c\u51fa\u9519\u4e86\u6539\u600e\u4e48\u529e\uff1b \u63d0\u4ea4\u4ee3\u7801\u7684\u65f6\u5019\u6ce8\u610f\u4e0d\u8981\u628a\u4e00\u4e9b\u4e34\u65f6\u7684\u6d4b\u8bd5\u8d44\u6e90\u63d0\u4ea4\u8fdb\u53bb\u4e86\uff0c\u6bd4\u5982\u6d4b\u8bd5\u4e86\u4e00\u4e2a\u5f71\u7247\uff0c\u6709\u4e9b\u540c\u5b66\u4e60\u60ef\u4f7f\u7528 git add . \uff0c\u7136\u540e\u5c31\u5168\u90e8\u63d0\u4ea4\u5230\u4ee3\u7801\u4ed3\u5e93\u4e86\uff0c\u8fd9\u6837\u5373\u4f7f\u540e\u671f\u628a\u5927\u6587\u4ef6\u5220\u4e86\uff0c.git \u6587\u4ef6\u91cc\u9762\u4e5f\u4f1a\u5f88\u5927\uff0c\u9020\u6210\u4ee3\u7801\u4ed3\u5e93\u53d8\u5f97\u5341\u5206\u81c3\u80bf\u3002 \u66f4\u591a\u7ec6\u8282\u67e5\u770b\uff1a\u300aAT\u7ecf\u9a8c\u603b\u7ed3\u300b"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/","title":"AT \u6267\u884c\u5668\u4f7f\u7528\u6307\u5317","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/5/25\n# Author : litao\n# =============================================\n Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1","title":"1\u3001\u529f\u80fd\u4ecb\u7ecd","text":" \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7cfb\u7edf\u8bed\u8a00\u8bbe\u7f6e\uff0c\u5206\u8fa8\u7387\u8bbe\u7f6e\u53ca\u7528\u4f8b\u6267\u884c\u73af\u5883\u642d\u5efa\uff1b \u652f\u6301 IP \u4e3a 15 \u7f51\u6bb5\u7684 AMD \u67b6\u6784\u6d4b\u8bd5\u673a\u955c\u50cf\u88c5\u673a\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u6307\u5b9a\u5e94\u7528\uff0c\u6307\u5b9a\u8303\u56f4\u6807\u7b7e\u7684\u7528\u4f8b\u6267\u884c\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u72b6\u6001\u68c0\u67e5\uff0c\u662f\u5426\u6709\u6b63\u5728\u8fd0\u884c\u7684\u6d4b\u8bd5\uff1b \u652f\u6301\u914d\u7f6e\u7528\u4f8b\u6267\u884c\u65f6\u957f\uff0c\u9632\u6b62\u4efb\u52a1\u963b\u585e\uff1b \u652f\u6301\u6839\u636e\u5e94\u7528\u7248\u672c\u81ea\u52a8\u67e5\u627e\u5bf9\u5e94\u7684\u7528\u4f8b tag\uff1b \u652f\u6301\u5f02\u5e38\u5904\u7406\u548c\u6d4b\u8bd5\u5b8c\u6210\u7684\u5b9e\u65f6\u6d88\u606f\u901a\u77e5\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2job","title":"2\u3001Job \u4ecb\u7ecd","text":"\u4ee5\u4e0b\u6309\u6267\u884c\u6d41\u7a0b\u7684\u987a\u5e8f\u4ecb\u7ecd\uff0c\u6bcf\u4e00\u6b65\u90fd\u53ef\u4ee5\u5355\u72ec\u6267\u884c\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1_1","title":"1\u3001\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/AT_test/ \u6574\u4e2a\u6d41\u7a0b\u7684\u4e3b\u5165\u53e3\uff0c\u901a\u8fc7\u8fd9\u4e2a\u5165\u53e3\uff0c\u8fde\u540c\u6574\u4e2a\u6d4b\u8bd5\u6d41\u7a0b\uff0c\u955c\u50cf\u88c5\u673a\uff0c\u73af\u5883\u90e8\u7f72\uff0c\u6d4b\u8bd5\u5e94\u7528\u53ca\u751f\u6210\u62a5\u544a\u3002 \u53c2\u6570\u4ecb\u7ecd\uff1a \u6d4b\u8bd5\u673a\uff1a\u6240\u6709\u89c4\u6574\u5230\u56fa\u5b9a\u533a\u57df\u7684\u6d4b\u8bd5\u673a\uff0c\u901a\u8fc7\u6d4b\u8bd5\u540c\u5b66\u5bf9\u6d4b\u8bd5\u673a\u7684\u4e60\u60ef\u547d\u540d\uff0c\u5728\u540e\u53f0\u6620\u5c04\u6d4b\u8bd5\u673a\u7684\u8be6\u7ec6\u4fe1\u606f\uff0c\u62ec\u53f7\u4e2d\u4e3a\u6d4b\u8bd5\u673a IP \u7684\u6700\u540e\u4e00\u4f4d\uff1b \u6d4b\u8bd5\u5e94\u7528\uff1a\u6307\u5b9a\u7684\u6d4b\u8bd5\u5e94\u7528\u7684\u5305\u540d\uff0c\u7cfb\u7edf\u6839\u636e\u540d\u79f0\u81ea\u52a8\u62c9\u53d6\u5bf9\u5e94\u7684\u4ed3\u5e93\u4ee3\u7801\uff1b deb\u5305\u4e0b\u8f7d\u5730\u5740\uff1a\u6d4b\u8bd5\u4e0a\u8ff0\u5e94\u7528\u65f6\uff0c\u9700\u8981\u5b89\u88c5\u7684deb\u5305\u4e0b\u8f7d\u5730\u5740\uff0c\u591a\u4e2a\u5730\u5740\u7528\u201c,\u201d\u9694\u5f00\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff1b \u8303\u56f4\u6807\u7b7e\uff1a\u6267\u884c\u6d4b\u8bd5\u7528\u4f8b\u7684\u6807\u7b7e\u8303\u56f4\uff0c\u5bf9\u5e94\u7528\u4f8b\u4ee3\u7801 csv \u6587\u4ef6\u4e2d\u7684\u6807\u7b7e\u4fe1\u606f\uff0c\u4ee5 pytest \u7684mark\u8bed\u6cd5\u7f16\u5199\uff1b \u7cfb\u7edf\u8bed\u8a00\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u8bed\u8a00\u73af\u5883\uff1b \u5206\u8fa8\u7387\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u5206\u8fa8\u7387\u73af\u5883\uff1b \u955c\u50cf\u5730\u5740\uff1a\u955c\u50cf\u4ed3\u5e93\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u901a\u8fc7 PXE \u88c5\u673a\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u88c5\u673a\u73af\u8282\uff08\u76ee\u524d\u4ec5\u652f\u6301\u90e8\u5206 AMD \u67b6\u6784\u7684\u88c5\u673a\uff09\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2pxe","title":"2\u3001PXE \u88c5\u673a","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/IOS_install/ \u8f93\u5165\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\uff0cIP\uff0c\u5bc6\u7801\uff0c\u955c\u50cf\u5730\u5740\u540e\uff0c\u81ea\u52a8\u88c5\u673a\uff0c\u76ee\u524d\u4ec5\u652f\u6301\u56fa\u5b9a 15 \u7f51\u6bb5\u7684\u90e8\u5206 AMD \u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#3","title":"3\u3001\u6b21\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/all_client_test/ \u8be5\u5165\u53e3\u4e0e\u4e3b\u5165\u53e3\u529f\u80fd\u57fa\u672c\u4e00\u81f4\uff0c\u53ea\u662f\u5265\u79bb\u4e86PXE\u88c5\u673a\u6d41\u7a0b\uff0c\u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7684\u6267\u884c\u6d41\u7a0b\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#4","title":"4\u3001\u73af\u5883\u90e8\u7f72","text":"Jenkins url\uff1ahttps://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/env/build?delay=0sec \u8bbe\u7f6e\u6d4b\u8bd5\u673a\u7684\u7cfb\u7edf\u8bed\u8a00\uff0c\u5206\u8fa8\u7387\u53ca\u5b89\u88c5\u6d4b\u8bd5\u6240\u9700\u7684\u4f9d\u8d56\u5305\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#5","title":"5\u3001\u53d1\u9001\u4ee3\u7801","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/send_code/ \u6839\u636e\u6d4b\u8bd5\u5e94\u7528\u540d\u79f0\uff0c\u62c9\u53d6\u5bf9\u5e94\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u5e76\u6839\u636e\u6d4b\u8bd5\u673a\u4e0a\u5e94\u7528\u7248\u672c\u5207\u6362\u5230\u5bf9\u5e94\u7684tag\u7248\u672c\uff0c\u82e5\u672a\u627e\u5230tag\u7248\u672c\uff0c\u5219\u4f7f\u7528\u6700\u65b0\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u518d\u6839\u636e\u5e94\u7528\u5e93\u4ee3\u7801\u4e2d\u914d\u7f6e\u7684\u57fa\u7840\u5e93\u7248\u672c\uff0c\u62c9\u53d6\u57fa\u7840\u5e93\u4ee3\u7801\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#6","title":"6\u3001\u7528\u4f8b\u6267\u884c","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/run_test/ \u8fd0\u884c\u6d4b\u8bd5\u673a\u4e0a\u7684\u7528\u4f8b"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/","title":"AT \u7528\u4f8b\u7b5b\u9009\u6307\u5317","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u7528\u4f8b\u7b5b\u9009\u6807\u51c6\uff0c\u662f\u6311\u9009\u5408\u9002\u7684\u6587\u672c\u7528\u4f8b\u8fdb\u884c\u81ea\u52a8\u5316\u7528\u4f8b\u8f6c\u5316\u7684\u4e00\u4e9b\u901a\u7528\u6807\u51c6\u3002 \u8fc7\u53bb\u6211\u4eec\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u5b9e\u8df5\u8fc7\u7a0b\u4e2d\uff0c\u5199\u4e86\u4e0d\u5c11\u81ea\u52a8\u5316\u7528\u4f8b\uff0c\u968f\u7740\u9700\u6c42\u7684\u8fed\u4ee3\uff0c\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u81ea\u7136\u8150\u5316\uff0c\u56e0\u800c\u9700\u8981\u5728\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\u5bf9\u81ea\u52a8\u5316\u7528\u4f8b\u8fdb\u884c\u7ef4\u62a4\uff0c\u5728\u7ef4\u62a4\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u6211\u4eec\u53d1\u73b0\uff0c\u6709\u4e9b\u7528\u4f8b\u7ef4\u62a4\u8d77\u6765\u592a\u96be\u4e86\uff0c\u8c03\u8bd5\u7528\u4f8b\u8017\u8d39\u5927\u91cf\u65f6\u95f4\uff0c\u6210\u672c\u5f88\u9ad8\u3002 \u56e0\u6b64\uff0c\u6211\u4eec\u603b\u7ed3\u4e00\u4e9b\u81ea\u52a8\u5316\u7528\u4f8b\u9009\u578b\u7684\u6807\u51c6\uff0c\u4ee5\u4f18\u5316\u540e\u7eed\u81ea\u52a8\u5316\u7528\u4f8b\u7ed3\u6784\uff0c\u671f\u5f85\u6211\u4eec\u80fd\u7f16\u5199\u51fa\u9ad8\u6548\u3001\u7a33\u5b9a\u3001\u6613\u4e8e\u7ef4\u62a4\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_1","title":"\u4e00\u3001\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u53ef\u4ee5\u5206\u4e3a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u548c\u4e13\u9879\u81ea\u52a8\u5316\u6d4b\u8bd5\uff0c\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e00\u822c\u53ea\u9488\u5bf9\u4e00\u4e9b\u5e38\u89c4\u7684\u529f\u80fd\u6d4b\u8bd5\uff0c\u5176\u4ed6\u975e\u5e38\u89c4\u529f\u80fd\u7684\u7528\u4f8b\uff0c\u5e94\u8be5\u91c7\u7528\u4e13\u9879\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u6848\uff1b \u4ee5\u4e0b\u662f\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1","title":"1. \u7a33\u5b9a\u6027\u3001\u538b\u6d4b\u7528\u4f8b","text":"\u7a33\u5b9a\u6027\u6d4b\u8bd5\u3001\u538b\u6d4b\u7528\u4f8b\u5e94\u8be5\u662f\u5c5e\u4e8e\u6027\u80fd\u76f8\u5173\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u5982\uff1a\u53cd\u590d\u591a\u6b21\u70b9\u51fb\u6309\u94ae\uff0c\u68c0\u9a8c\u5176\u529f\u80fd\u7a33\u5b9a\u6027\u3002\u56e0\u4e3a\u8fd9\u4e9b\u7528\u4f8b\u65ad\u8a00\u7684\u9884\u671f\u53ef\u80fd\u4e0d\u662f\u5f88\u660e\u786e\uff0c\u66f4\u6709\u751a\u8005\u4e0d\u9700\u8981\u65ad\u8a00\uff0c\u7528\u4f8b\u65f6\u957f\u6bd4\u8f83\u957f\uff0c\u800c\u4e14\u4e0d\u53ef\u63a7\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u76ee\u524d\u6211\u4eec\u6709\u6027\u80fd\u81ea\u52a8\u5316\u7684\u4e13\u9879\u65b9\u6848\uff0c\u4ee5\u53ca\u4e00\u4e9b\u7a33\u5b9a\u6027\u6d4b\u8bd5\u7684\u4e13\u9879\u65b9\u6848\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u6b64\u7c7b\u7528\u4f8b\u653e\u5230\u4e13\u9879\u81ea\u52a8\u5316\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2","title":"2. \u6d89\u53ca\u591a\u4e2a\u7528\u6237\u64cd\u4f5c","text":"\u5e38\u89c1\u4e0e\u6587\u7ba1\u7684\u7528\u4f8b\u4e2d\uff0c\u591a\u7528\u6237\u64cd\u4f5c\u7684\u7528\u4f8b\u4e00\u822c\u90fd\u4f1a\u6d89\u53ca\u5230\u5728\u7cfb\u7edf\u4e2d\u8fdb\u884c\u591a\u4e2a\u7528\u6237\u95f4\u7684\u5207\u6362\uff0c\u81ea\u52a8\u5316\u811a\u672c\u4e00\u822c\u662f\u8fd0\u884c\u5728\u4e00\u4e2a\u7528\u6237\u7a7a\u95f4\u4e0b\u7684\uff0c\u6240\u4ee5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u591a\u7528\u6237\u95f4\u7684\u5207\u6362\u3002 \u6b64\u7c7b\u4e0d\u5efa\u8bae\u91c7\u7528\u81ea\u52a8\u5316\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3","title":"3. \u4e0e\u5f00\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4ea4\u4e92","text":"\u6b64\u7c7b\u573a\u666f\u591a\u4e3a\u5e94\u7528\u7684\u5f02\u5e38\u573a\u666f\u6d4b\u8bd5\uff0c\u6bd4\u5982\uff1a\u590d\u5236\u5927\u6587\u4ef6\u8fc7\u7a0b\u4e2d\u6ce8\u9500\u673a\u5668\u3002 \u81ea\u52a8\u5316\u811a\u672c\u5728\u7cfb\u7edf\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4e4b\u540e\u662f\u4f1a\u505c\u6b62\u8fd0\u884c\u7684\uff1b\u6b64\u7c7b\u7528\u4f8b\u53ef\u4ee5\u505a\u81ea\u52a8\u5316\uff0c\u4f46\u662f\u540c\u6837\u9700\u8981\u505a\u4e13\u9879\u65b9\u6848\uff0c\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u7684\u5904\u7406\u903b\u8f91\u5b8c\u5168\u4e0d\u540c\u3002 \u540e\u7eed\u81ea\u52a8\u5316\u9700\u8981\u516c\u5173\u7684\u70b9\uff1a \u81ea\u52a8\u5316\u811a\u672c\u5728\u672c\u673a\u8fd0\u884c\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u81f3\u5c11\u9700\u8981\u63d0\u4f9b\u4ee5\u4e0b\u529f\u80fd\uff1a \u91cd\u542f\u4e4b\u540e\u7528\u4f8b\u80fd\u81ea\u52a8\u8fd0\u884c\uff1b\u53ef\u4ee5\u8003\u8651\u5c06\u6267\u884c\u7528\u4f8b\u5199\u6210\u4e00\u4e2a\u5f00\u673a\u81ea\u542f\u7684\u670d\u52a1\uff1b \u80fd\u8bb0\u5f55\u5173\u673a\u4e4b\u524d\u7528\u4f8b\u6267\u884c\u7684\u4f4d\u7f6e\uff0c\u91cd\u542f\u4e4b\u540e\u80fd\u4ece\u6b64\u4f4d\u7f6e\u5f00\u59cb\u6267\u884c\uff1b \u50cf\u6027\u80fd\u81ea\u52a8\u5316\u4e00\u6837\uff0c\u7531\u670d\u52a1\u7aef\u63a7\u5236\uff1b \u5b8c\u5168\u57fa\u4e8e\u56fe\u5f62\u8bc6\u522b\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u4e32\u53e3\u7ebf\u63a7\u5236\u952e\u9f20\u7a33\u5b9a\u6027\uff1b "},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4","title":"4. \u6d4b\u8bd5\u6267\u884c\u65f6\u95f4\u957f","text":"\u7528\u4f8b\u6267\u884c\u65f6\u95f4\u63a7\u5236\u57282\u5206\u949f\u4ee5\u5185\uff0c\u6781\u7aef\u60c5\u51b5\u4e0d\u8981\u8d85\u8fc75\u5206\u949f\uff0c\u6240\u6709\u7528\u4f8b\u7684\u5e73\u5747\u65f6\u957f\u5e94\u8be5\u57281\u5206\u949f\u5de6\u53f3\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u95f4\u592a\u957f\uff0c\u7f16\u5199\u7528\u4f8b\u3001\u8c03\u8bd5\u7528\u4f8b\u3001\u6267\u884c\u7528\u4f8b\u3001\u7ef4\u62a4\u7528\u4f8b\u90fd\u975e\u5e38\u7684\u8017\u65f6\uff0c\u4eba\u529b\u6210\u672c\u65f6\u95f4\u6210\u672c\u6295\u5165\u592a\u9ad8\u3002 \u4f60\u60f3\uff0c\u8fd9\u6761\u7528\u4f8b\u6267\u884c\u9700\u89815\u5206\u949f\uff0c\u90a3\u4f60\u5199\u8fd9\u6761\u7528\u4f8b\u7684\u65f6\u95f4\u4e0d\u53ef\u80fd\u4e00\u904d\u8fc7\uff0c\u5199\u7684\u8fc7\u7a0b\u4e2d\u8dd1\u4e0d\u901a\u8fd8\u5f97\u91cd\u8dd1\u81f3\u5c1115\u5206\u949f\u4e0d\u8fc7\u5206\uff0c\u5199\u5b8c\u4e86\u8fd8\u5f97\u5728\u5176\u4ed6\u67b6\u6784\u4e0a\u8c03\u8bd5\uff0c\u534a\u4e2a\u5c0f\u65f6\u8fc7\u53bb\u4e86\uff0c\u8fd9\u8fd8\u53ea\u662f\u7b2c\u4e00\u6b21\u5199\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u540e\u7eed\u5982\u679c\u7528\u4f8b\u7ef4\u62a4\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u7ecf\u5e38\u6295\u5165\u76f8\u5f53\u957f\u65f6\u95f4\uff0c\u8fd9\u6837\u5176\u5b9e\u662f\u5931\u53bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u7684\u3002\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u5c31\u5e94\u8be5\u662f\u5feb\u51c6\u72e0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5","title":"5. \u8fb9\u7f18\u6027\u6d4b\u8bd5","text":"\u6709\u4e9b\u529f\u80fd\u6a21\u5757\u672c\u8eab\u662f\u5c5e\u4e8e\u6bd4\u8f83\u8fb9\u7f18\u6027\u7684\uff0c\u5373\u6781\u5c11\u7528\u6237\u4f1a\u4f7f\u7528\u5230\u7684\u529f\u80fd\uff0c\u8fd9\u7c7b\u529f\u80fd\u6a21\u5757\u4e0d\u9700\u8981\u5927\u89c4\u6a21\u5b9e\u73b0\u81ea\u52a8\u5316\uff0c\u4e00\u4e24\u4e2a\u573a\u666f\u8986\u76d6\u57fa\u672c\u529f\u80fd\u5c31\u884c\u4e86\uff0c\u56e0\u6b64\u6211\u4eec\u5728\u6311\u9009\u6b64\u7c7b\u7528\u4f8b\u7684\u65f6\u5019\u53ef\u4ee5\u7ed3\u5408\u6574\u4e2a\u529f\u80fd\u6a21\u5757\u7684\u8986\u76d6\u60c5\u51b5\u6765\u51b3\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6","title":"6. \u9700\u8981\u4f9d\u8d56\u4eba\u5de5\u4ecb\u5165\u7684","text":"\u81ea\u52a8\u5316\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\u662f\u6ca1\u6709\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bd4\u5982\u8981\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u90a3\u4e48\u5c31\u80cc\u79bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u3002 \u6bd4\u5982\u5149\u9a71\u6a21\u5757\uff0c\u5149\u9a71\u523b\u5f55\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u4f46\u662f\u5149\u9a71\u523b\u5f55\u4e4b\u540e\u5149\u76d8\u4f1a\u5f39\u51fa\u6765\uff0c\u9700\u8981\u4eba\u5de5\u66f4\u6362\u5149\u76d8\uff0c\u518d\u624b\u52a8\u63a8\u8fdb\u5149\u9a71\u4e2d\u3002 \u8fd9\u79cd\u529f\u80fd\u6a21\u5757\u5373\u4f7f\u505a\u81ea\u52a8\u5316\uff0c\u80fd\u6d89\u53ca\u5230\u7684\u529f\u80fd\u975e\u5e38\u6709\u9650\uff0c\u800c\u4e14\u4e0d\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u6240\u4ee5\u660e\u663e\u5c31\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7","title":"7. \u96be\u4ee5\u5b9e\u73b0\u7684","text":"\u7528\u4f8b\u6240\u6d89\u53ca\u5230\u7684\u65b9\u6cd5\u5b9e\u73b0\u8d77\u6765\u53ef\u80fd\u6709\u96be\u5ea6\uff0c\u751a\u81f3\u73b0\u9636\u6bb5\u65e0\u6cd5\u5b9e\u73b0\u7684\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002 \u6bd4\u5982\u5f71\u9662\u6d4b\u8bd5\u753b\u9762\u6e05\u6670\u5ea6\u3001\u6d41\u7545\u5ea6\u3001\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u4e4b\u540e\u7684\u89c6\u9891\u662f\u5426\u5b58\u5728\u5361\u987f\u7b49\u7528\u4f8b\uff0c\u73b0\u9636\u6bb5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#8","title":"8. \u529f\u80fd\u4e0d\u7a33\u5b9a","text":"\u8fd9\u4e2a\u4e0d\u662f\u8bf4\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\uff0c\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\u4e0d\u7a33\u5b9a\u662f\u6b63\u5e38\u7684\uff0c\u8fd9\u79cd\u6211\u4eec\u53ef\u4ee5\u7b49\u5f00\u53d1\u63d0\u6d4b\u4e4b\u540e\u518d\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u3002 \u529f\u80fd\u4e0d\u7a33\u5b9a\u6307\u7684\u662f\u7528\u4f8b\u6240\u6d89\u53ca\u7684\u529f\u80fd\uff0c\u53ef\u80fd\u5b58\u5728\u591a\u79cd\u53d8\u5316\uff0c\u6bcf\u6b21\u6267\u884c\u7528\u4f8b\u53ef\u80fd\u65ad\u8a00\u7684\u9884\u671f\u90fd\u4e0d\u540c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#9","title":"9. \u52a8\u6001\u65ad\u8a00","text":"\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u76f4\u5230\u7528\u4f8b\u7ed3\u675f\uff0c\u4e00\u76f4\u662f\u4e00\u4e2a\u52a8\u6001\u53d8\u5316\u7684\u8fc7\u7a0b\uff0c\u800c\u4e14\u65e0\u6cd5\u901a\u8fc7\u5176\u4ed6\u624b\u6bb5\u505c\u4e0b\u6765\uff1b \u6bd4\u5982\uff1a\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u65f6\uff0c\u53f3\u4e0b\u89d2\u7684\u5f55\u5236\u65f6\u95f4\u662f\u4e00\u76f4\u5728\u53d8\u5316\u7684\uff0c\u7528\u4f8b\u9700\u8981\u6d4b\u8bd5\u5f55\u52361\u5206\u949f\u4e4b\u540e\uff0c\u5f55\u5236\u65f6\u95f4\u662f\u521a\u597d\u505c\u572860\u79d2\uff1b \u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fd8\u505a\u4e0d\u5230\u65f6\u95f4\u7cbe\u51c6\u63a7\u5236\uff0c\u7a0b\u5e8f\u6267\u884c\u65f6\u95f4\u662f\u6709\u6ce2\u52a8\u7684\uff0c\u800c\u4e14\u8981\u9002\u914d\u591a\u4e2a\u5e73\u53f0\uff0c\u6240\u4ee5\u6b64\u7c7b\u7528\u4f8b\u5927\u6982\u7387\u4f1a\u6267\u884c\u5931\u8d25\u3002\u7279\u522b\u662f\u5728\u6027\u80fd\u8f83\u5dee\u7684\u56fd\u4ea7\u5316\u67b6\u6784\u4e0a\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u592a\u53ef\u80fd\u7a33\u5b9a\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#10","title":"10. \u63a2\u7d22\u6027\u6d4b\u8bd5","text":"\u63a2\u7d22\u6027\u6d4b\u8bd5\u901a\u5e38\u662f\u4e00\u4e9b\u4e0d\u786e\u5b9a\u7684\u64cd\u4f5c\uff0c\u591a\u53d8\u5207\u590d\u6742\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u9884\u671f\u4e5f\u53ef\u80fd\u662f\u4e0d\u786e\u5b9a\u7684\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u9a9a\u64cd\u4f5c\u592a\u591a\u4e86\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6b64\u7c7b\u7528\u4f8b\u9002\u5408\u91c7\u7528\u624b\u5de5\u6d4b\u8bd5\uff0c\u662f\u624b\u5de5\u6d4b\u8bd5\u771f\u6b63\u7684\u4ef7\u503c\u4f53\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#11","title":"11. \u6613\u7528\u6027\u6d4b\u8bd5","text":"\u5bf9\u4e8e\u6613\u7528\u6027\u7684\u5224\u65ad\u901a\u5e38\u662f\u4e3b\u89c2\u7684\uff0c\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\u5f88\u96be\u53bb\u5b9a\u4e49\u4ec0\u4e48\u6837\u7684\u60c5\u51b5\u5bf9\u7528\u6237\u662f\u6613\u7528\u7684\uff0c\u81ea\u52a8\u5316\u9700\u8981\u6709\u660e\u786e\u7684\u53ef\u5b9e\u73b0\u7684\u9884\u671f\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_2","title":"\u4e8c\u3001\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u524d\u9762\u8bb2\u4e86\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u4e00\u4e9b\u7528\u4f8b\u60c5\u51b5\uff0c\u6709\u540c\u5b66\u5c31\u8bf4\u4e86\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\u4e0d\u7528\u8bb2\u4e86\uff0c\u5c31\u662f\u4e0d\u9002\u5408\u7684\u53cd\u9762\u3002\u6ca1\u6bdb\u75c5\u54c8\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\uff0c\u6211\u4eec\u5927\u4f53\u8fd8\u53ef\u4ee5\u5206\u4e3a\u4e24\u7c7b\uff1a \u7b2c\u4e00\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u597d\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u7b2c\u4e8c\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u4e00\u822c\uff0c\u9700\u8981\u6295\u5165\u66f4\u591a\u7cbe\u529b\u624d\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u4ee5\u4e0b\u4ecb\u7ecd\u4e00\u4e9b\u6211\u4eec\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1_1","title":"1. \u64cd\u4f5c\u76f8\u5bf9\u7b80\u5355","text":"\u7528\u4f8b\u6b65\u9aa4\u76f8\u5bf9\u8f83\u5c11\uff0c\u8fd9\u79cd\u7528\u4f8b\u901a\u5e38\u662f\u4e00\u4e9b\u8def\u5f84\u5f88\u6d45\u7684\u7528\u4f8b\uff0c\u4e00\u822c\u4e5f\u662f\u4e00\u4e9b\u57fa\u7840\u7528\u4f8b\u3002\u7528\u4f8b\u7f16\u5199\u3001\u7ef4\u62a4\u90fd\u53ef\u4ee5\u8f7b\u677e\u641e\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2_1","title":"2. \u5bb9\u6613\u5b9e\u73b0","text":"\u73b0\u6709\u6280\u672f\u662f\u53ef\u5b9e\u73b0\u7684\uff0c\u6ca1\u6709\u96be\u5ea6\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3_1","title":"3. \u7ecf\u5e38\u7528\u4e8e\u56de\u5f52\u6d4b\u8bd5","text":"\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bcf\u6b21\u56de\u5f52\u6d4b\u8bd5\u5fc5\u987b\u8981\u6267\u884c\u7684\u7528\u4f8b\uff0c\u90a3\u4e48\u8fd9\u6761\u7528\u4f8b\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u3002 \u56de\u5f52\u6d4b\u8bd5\u65f6\u6211\u4eec\u9996\u5148\u5e94\u8be5\u4fdd\u8bc1\u5e94\u7528\u5386\u53f2\u57fa\u672c\u529f\u80fd\u6b63\u5e38\uff0c\u6240\u4ee5\u90a3\u4e9b\u6bcf\u6b21\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u90fd\u8981\u6267\u884c\u7684\u7528\u4f8b\u9002\u5408\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4_1","title":"4. \u529f\u80fd\u7a33\u5b9a\u7684\u6838\u5fc3\u529f\u80fd","text":"\u6d89\u53ca\u6838\u5fc3\u529f\u80fd\u7684\u7528\u4f8b\u662f\u6700\u6700\u91cd\u8981\u7684\u7528\u4f8b\uff0c\u4e5f\u662f\u6211\u4eec\u4ea4\u4ed8\u65f6\u5fc5\u987b\u8981\u4fdd\u8bc1\u8d28\u91cf\u7684\u76f8\u5173\u529f\u80fd\uff0c\u56e0\u6b64\u5e94\u8be5\u5c3d\u53ef\u80fd\u7684\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5_1","title":"5. \u8f93\u5165\u6570\u636e\u6d4b\u8bd5","text":"\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u901a\u5e38\u662f\u68c0\u9a8c\u88ab\u6d4b\u5e94\u7528\u63a5\u53d7\u6709\u6548\u6570\u636e\u3001\u62d2\u7edd\u65e0\u6548\u6570\u636e\u7684\u80fd\u529b\u3002\u5982\uff1a\u63d0\u4ea4\u8d85\u957f\u5b57\u7b26\u4e32\u3001\u7279\u6b8a\u5b57\u7b26\u4e32\u7b49\u7b49\u3002 \u6b64\u7c7b\u7528\u4f8b\u624b\u5de5\u6d4b\u8bd5\u5f88\u96be\u6bd4\u8f83\u5168\u9762\u7684\u8986\u76d6\u5230\u6240\u6709\u7684\u8f93\u5165\u60c5\u51b5\uff0c\u4f46\u662f\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\uff0c\u6b64\u7c7b\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u90fd\u662f\u4e00\u6837\u7684\uff0c\u53d8\u5316\u7684\u4ec5\u662f\u8f93\u5165\u53c2\u6570\u548c\u65ad\u8a00\u7ed3\u679c\uff0c\u91c7\u7528\u6570\u636e\u9a71\u52a8\uff0c\u53ef\u4ee5\u8f7b\u677e\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6_1","title":"6. \u683c\u5f0f\u8986\u76d6","text":"\u539f\u56e0\u540c\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u7c7b\u7528\u4f8b\u4e00\u6837\uff0c\u591a\u79cd\u683c\u5f0f\u7684\u8986\u76d6\u4e5f\u662f\u4e00\u4e2a\u5f88\u7e41\u7410\u7684\u4e8b\u60c5\uff0c\u4ea4\u7ed9\u81ea\u52a8\u5316\u6765\u505a\u518d\u5408\u9002\u4e0d\u8fc7\u4e86\u3002 \u6bd4\u5982\u5f71\u9662\u5bf9\u5f71\u7247\u683c\u5f0f\u7684\u68c0\u67e5\u3001\u622a\u56fe\u5f55\u5c4f\u5bf9\u4fdd\u5b58\u683c\u5f0f\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7_1","title":"7. \u68c0\u67e5\u5143\u7d20\u72b6\u6001","text":"\u67e5\u770b\u88ab\u6d4b\u5e94\u7528\u7684\u5143\u7d20\u5c5e\u6027\u3002\u5982\uff1a\u56fe\u7247\u7684\u5927\u5c0f\u548c\u6392\u5217\uff1b\u6309\u94ae\u7684\u53ef\u7528\u548c\u4e0d\u53ef\u7528\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/","title":"AT \u7ecf\u9a8c\u603b\u7ed3","text":"\u6b22\u8fce\u6240\u6709\u4eba\u63d0\u4ea4\u4f60\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u9762\u7684\u4f18\u79c0\u5b9e\u8df5\u7ecf\u9a8c\uff0c\u4ee5\u5e2e\u52a9\u5927\u5bb6\u89e3\u51b3\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#1","title":"1\u3001\u7ec8\u7ed3\u5668","text":"# litaoa@uniontech.com\n \u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4 pytest \u5b9e\u73b0\u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4\u7684\u65b9\u5f0f\u6709\u4e24\u79cd\uff0cyield \u548c\u7ec8\u7ed3\u51fd\u6570\uff1b yield \u5b9e\u73b0\uff0cyield\u524d\u9762\u4e3a\u7528\u4f8b\u7684\u524d\u7f6e\u6b65\u9aa4\uff0cyield \u540e\u9762\u4e3a\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4\u3002 @pytest.fixture\ndef clean_env():\nprint(\"setup\")\nyield\nprint(\"teardown\")\n \u7ec8\u7ed3\u51fd\u6570\u5b9e\u73b0\uff0c\u4f7f\u7528 request.addfinalizer \u6ce8\u518c\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4 @pytest.fixture\ndef clean_env(request):\ndef clean():\nprint(\"teardown\")\nrequest.addfinalizer(clean)\nprint(\"setup\")\n yield\u7684\u4f18\u7f3a\u70b9\uff1a \u4f18\u70b9\uff1a\u4ee3\u7801\u7b80\u6d01\uff0c\u76f4\u89c2\uff0c\u53ef\u4f7f\u7528yield\u5728\u7528\u4f8b\u4e2d\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c \u7f3a\u70b9\uff1a\u82e5\u524d\u7f6e\u6b65\u9aa4\u4e2d\u51fa\u73b0\u9519\u8bef\uff0c\u5219\u540e\u7f6e\u6b65\u9aa4\u4e0d\u4f1a\u6267\u884c \u7ec8\u7ed3\u51fd\u6570\uff1a \u4f18\u70b9\uff1a\u524d\u7f6e\u6b65\u9aa4\u5931\u8d25\u7684\u8bdd\uff0c\u540e\u7f6e\u6b65\u9aa4\u4ecd\u4f1a\u6267\u884c\u4e14\u53ef\u4ee5\u6ce8\u518c\u591a\u4e2a\u540e\u7f6e\u6b65\u9aa4\uff08\u524d\u63d0\uff1a\u9700\u8981\u5728\u4ee3\u7801\u62a5\u9519\u4e4b\u524d\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff09\uff0c\u652f\u6301\u7075\u6d3b\u4f7f\u7528\u540e\u7f6e\u6761\u4ef6 \u7f3a\u70b9\uff1a\u4ee3\u7801\u8f83\u4e3a\u590d\u6742\uff0c\u65e0\u6cd5\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c\uff08\u672c\u4eba\u76ee\u524d\u672a\u5b9e\u73b0\uff09 \u603b\u7ed3\uff1a\u5728\u524d\u7f6e\u6b65\u9aa4\u4fdd\u8bc1\u7edd\u5bf9\u4e0d\u4f1a\u51fa\u9519\u65f6\uff0c\u4f7f\u7528yield\u66f4\u4f73\u7b80\u4fbf\uff0c\u5f53\u524d\u7f6e\u6b65\u9aa4\u6613\u51fa\u73b0\u95ee\u9898\u65f6\uff0c\u63a8\u8350\u4f7f\u7528\u7ec8\u7ed3\u51fd\u6570\u3002 \u573a\u666f\uff1a\u4fdd\u9669\u7bb1\u7528\u4f8b\uff0c\u524d\u7f6e\u6b65\u9aa4\u4e2d\u5f00\u542f\u4fdd\u9669\u7bb1\uff0c\u540e\u7f6e\u6b65\u9aa4\u5220\u9664\u4fdd\u9669\u7bb1\u3002 @pytest.fixture(scope=\"session\", autouse=True)\ndef vault_fixture(request):\nDfmWidget.reset_vault_by_cmd() # 1\u3001\u91cd\u7f6e\u4fdd\u9669\u7bb1\nDdeDockPublicWidget().close_file_manager_by_cmd() # 2\u3001\u5173\u95ed\u6587\u7ba1\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 3\u3001\u5f00\u542f\u6587\u7ba1\nvault = DfmWidget()\nvault.create_file_vault() # 4\u3001\u521b\u5efa\u4fdd\u9669\u7bb1\ndef delete_vault(): # 8\u3001\u5220\u9664\u4fdd\u9669\u7bb1\u7684\u540e\u7f6e\u6b65\u9aa4\nsleep(2)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr()\nvault = DfmWidget()\nvault.delete_file_vault()\nDfmWidget.reset_vault_by_cmd()\nDdeDockPublicWidget().close_file_manager_by_cmd()\nrequest.addfinalizer(delete_vault) # 5\u3001\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\nDdeDockPublicWidget().close_file_manager_by_cmd() # 6\u3001\u5173\u95ed\u6587\u7ba1\nsleep(1)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 7\u3001\u5f00\u542f\u6587\u7ba1\n \u4ee3\u7801\u6309\u6ce8\u91ca\u4e2d\u7684\u5e8f\u53f7\u6267\u884c\u6b65\u9aa4 \u4ee3\u7801\u5728\u6b65\u9aa41-4\u4efb\u610f\u4f4d\u7f6e\u62a5\u9519\uff0c\u5219\u4e0d\u4f1a\u6267\u884c\u6b65\u9aa48\uff0c\u56e0\u4e3a\u672a\u6267\u884c\u5230\u6b65\u9aa45\uff0c\u6b65\u9aa48\u8fd8\u672a\u6ce8\u518c \u4ee3\u7801\u5728\u6b65\u9aa46-7\u62a5\u9519\uff0c\u4ecd\u4f1a\u6267\u884c\u6b65\u9aa47\uff0c\u56e0\u4e3a\u5728\u6b65\u9aa45\u4e2d\u5df2\u7ecf\u5c06\u6b65\u9aa47\u6ce8\u518c \u53ef\u4ee5\u7075\u6d3b\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff0c\u80fd\u5b9e\u73b0\u67d0\u4e2a\u524d\u7f6e\u6b65\u9aa4\u6267\u884c\u4e4b\u540e\uff0c\u624d\u4f1a\u6267\u884c\u540e\u7f6e\u6b65\u9aa4\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#2","title":"2\u3001\u542f\u52a8\u5e94\u7528\u7684\u65b9\u5f0f","text":"# huangmingqiang@uniontech.com\n \uff081\uff09\u547d\u4ee4\u884c\u542f\u52a8 \u5728 AT \u4ee3\u7801\u4e2d\u4f7f\u7528\u547d\u4ee4\u884c\u542f\u52a8\u5e94\u7528\uff0c\u4e3e\u4f8b\uff1a os.popen(\"deepin-music\")\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f7f\u7528 ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6\uff0cdogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u3002 \uff082\uff09\u901a\u8fc7 UI \u64cd\u4f5c\u542f\u52a8 \u901a\u8fc7\u4efb\u52a1\u680f\u3001\u542f\u52a8\u5668\u3001\u684c\u9762\u7b49UI\u65b9\u5f0f\u542f\u52a8\uff0c\u6bd4\u5982\u53cc\u51fb\u6253\u5f00\u3001\u53f3\u952e\u6253\u5f00\u7b49\uff0c\u8fd9\u79cd\u64cd\u4f5c\u65b9\u5f0f\u4e0d\u5b58\u5728ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6dogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u7684\u95ee\u9898\uff0c\u4e5f\u66f4\u52a0\u7b26\u5408\u7528\u6237\u7684\u64cd\u4f5c\u884c\u4e3a\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#3","title":"3\u3001\u6587\u4ef6\u9009\u62e9\u6846\u5c5e\u6027\u5b9a\u4f4d\u5076\u73b0\u65e0\u6cd5\u627e\u5230","text":"\u6587\u4ef6\u9009\u62e9\u6846\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5728\u8c03\u7528\u6587\u4ef6\u9009\u62e9\u6846\u65f6\uff0c\u6709\u4e00\u5b9a\u7684\u6982\u7387\u51fa\u73b0\uff0c\u754c\u9762\u5df2\u7ecf\u6e32\u67d3\u51fa\u6765\u4e86\uff0c\u4f46\u662f\u5c5e\u6027\u6811\u5e76\u6ca1\u6709\u5199\u5165\uff0c\u5bfc\u81f4\u901a\u8fc7\u5c5e\u6027\u65e0\u6cd5\u627e\u5230\u5143\u7d20\uff0c\u76ee\u524d\u4e5f\u6ca1\u6709\u5f88\u597d\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u4e3a\u4e86\u7528\u4f8b\u7a33\u5b9a\u6027\uff0c\u6587\u4ef6\u9009\u62e9\u6846\u7684\u64cd\u4f5c\u5efa\u8bae\u4f7f\u7528UI\u6216\u8005\u56fe\u7247\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u53ef\u4ee5\u901a\u8fc7\u641c\u7d22\u5185\u5bb9\u56fa\u5b9a\u6587\u4ef6\u4f4d\u7f6e\u3002 # litaoa@uniontech.com\n desk = DdeDesktopPublicWidget()\n# \u9009\u62e9\u89c6\u9891\u76ee\u5f55\ndesk.click_videos_dir_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.ctrl_f()\nsleep(1)\ndesk.input_message(\"\u5143\u7d20\u540d\u79f0\")\nsleep(0.5)\ndesk.enter()\nsleep(1)\n# \u9009\u62e9\u7b2c\u4e00\u4e2a\u6587\u4ef6\ndesk.click_list_view_btn_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.click_first_file_in_desktop_plugs_by_ui()\nsleep(1)\n# \u6587\u7ba1\u63d2\u4ef6\u4e2d\u70b9\u51fb\u6253\u5f00\ndesk.click_open_btn_in_desktop_plugs_by_ui()\n"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#4","title":"4\u3001\u5e94\u7528\u542f\u52a8","text":"# mikigo\n \u5728UI\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u4e00\u5207\u64cd\u4f5c\u7684\u90fd\u662f\u4ece\u5e94\u7528\u542f\u52a8\u5f00\u59cb\u7684\uff0c\u800c\u5728Linux\u684c\u9762\u5e94\u7528\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u6211\u4eec\u542f\u52a8\u5e94\u7528\u7684\u65b9\u6cd5\u6709\u591a\u79cd\uff0c\u4e0b\u9762\u505a\u4e00\u4e2a\u7b80\u5355\u7684\u4ecb\u7ecd\uff1a \u3010\u4f7f\u7528dogtail\u542f\u52a8\u3011 dogtail\u63d0\u4f9b\u4e86\u5e94\u7528\u542f\u52a8\u7684\u65b9\u6cd5\uff0c\u5728utils\u5e93\u4e2d\uff0c\u4f7f\u7528run\u65b9\u6cd5\u542f\u52a8\uff1a \u9996\u5148\u5bfc\u5165\u65b9\u6cd5\uff1a from dogtail.utils import *\n \u8c03\u7528run\u65b9\u6cd5 run('deepin-music')\n \u5373\u53ef\u542f\u52a8\u97f3\u4e50 \u8fd9\u79cd\u65b9\u6cd5\u7684\u4f18\u70b9\u662f\u91c7\u7528\u8fdb\u7a0b\u7684\u65b9\u5f0f\u76f4\u63a5\u542f\u52a8\uff0c\u4e0d\u4f9d\u8d56\u4e0eUI\uff0c\u65e0\u8bba\u684c\u9762\u6216\u4efb\u52a1\u680f\u4e0a\u662f\u5426\u5b58\u5728\u5e94\u7528\u56fe\u6807\uff0c\u90fd\u53ef\u4ee5\u6b63\u5e38\u542f\u52a8\u3002 \u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c \u5982\u679c\u4f7f\u7528ssh\u8fdc\u7a0b\u8c03\u7528\uff0c\u6216\u8005Jenkins\u4e2d\u6267\u884c\u6d4b\u8bd5\u811a\u672c\u7684\u65f6\u5019\uff0c\u5728sniff\u4e2d\u4f1a\u51fa\u73b0\u627e\u4e0d\u5230\u5e94\u7528\uff0c\u7ecf\u8fc7\u5206\u6790\uff0c\u53ef\u80fd\u662f\u56e0\u4e3a\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\u542f\u52a8\u7684\u65f6\u5019\uff0c\u5b9e\u9645\u662f\u91c7\u7528\u4e00\u4e2a\u5b50\u8fdb\u7a0b\u542f\u52a8\u4e86\u5e94\u7528\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u5230\u3002 \u3010\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u3011 \u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807 \u901a\u5e38\u6709\u4e24\u79cd\u65b9\u6cd5\uff1a \uff081\uff09\u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807\u3002 \uff082\uff09\u5df2\u77e5\u5e94\u7528\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u7684\u4f4d\u7f6e\uff0c\u7136\u540e\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u5bf9\u5e94\u5750\u6807\u3002 \u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u7f3a\u70b9\u662f\u4f4d\u7f6e\u5fc5\u987b\u56fa\u5b9a\uff0c\u5982\u679c\u79fb\u52a8\u4f4d\u7f6e\u5c31\u4e0d\u884c\u4e86\uff0c\u800c\u4f7f\u7528\u7b2c\u4e00\u79cd\u65b9\u6cd5\uff0c\u65e0\u8bba\u4f4d\u7f6e\u5728\u54ea\u91cc\uff0c\u53ea\u8981\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u5b58\u5728\u5373\u53ef\u3002 \u3010\u70b9\u51fb\u684c\u9762\u56fe\u6807\u542f\u52a8\u3011 \u684c\u9762\u56fe\u6807\u76ee\u524d\u662f\u91c7\u7528\u56fe\u50cf\u8bc6\u522b\u6280\u672f\uff0c\u5b9a\u4f4d\u5230\u5e94\u7528\u56fe\u6807\u7684\u5750\u6807\uff0c\u7136\u540e\u901a\u8fc7pyauogui\u8fdb\u884c\u70b9\u51fb\u64cd\u4f5c\u3002 \u8be6\u7ec6\u6280\u672f\u65b9\u6848\u53ef\u4ee5\u53c2\u8003\u6211\u7684\u53e6\u5916\u4e24\u7bc7\u535a\u5ba2: \u57fa\u4e8eopencv\u7684\u6a21\u677f\u5339\u914d\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd4\u56de\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 Python\u4e09\u65b9\u5e93PyAutoGui\u7684\u4f7f\u7528\u65b9\u6cd5 \u3010\u4ece\u542f\u52a8\u5668\u542f\u52a8\uff08\u4fd7\u79f0\u5f00\u59cb\u83dc\u5355\uff09\u3011 \u542f\u52a8\u4e2d\u542f\u52a8\u7684\u5b9e\u73b0\u903b\u8f91\u5b9e\u9645\u548c\u4efb\u52a1\u680f\u4e0a\u542f\u52a8\u5dee\u4e0d\u591a\u3002 \u9996\u5148\uff0c\u9700\u8981\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u542f\u52a8\u5668\u56fe\u6807\uff0c\u6216\u8005\u952e\u76d8super\u952e\uff0c\u5c06\u542f\u52a8\u5668\u547c\u51fa\u6765\uff0c \u7136\u540e\uff0c\u5728\u542f\u52a8\u5668\u4e2d\u70b9\u51fb\u5bf9\u5e94\u7684\u56fe\u6807\uff0c \u4f46\u662f\u8fd9\u91cc\u6709\u4e2a\u95ee\u9898\uff0c\u542f\u52a8\u5668\u4e2d\u7684\u5e94\u7528\u5217\u8868\uff0c\u4e00\u9875\u5c55\u793a\u4e0d\u5b8c\uff0c\u6240\u4ee5\u5982\u679c\u6211\u4eec\u8981\u70b9\u51fb\u7684\u5e94\u7528\u56fe\u6807\u4e0d\u5728\u7b2c\u4e00\u9875\u600e\u4e48\u529e\uff0c\u901a\u5e38\u89e3\u51b3\u65b9\u6848\u6709\u4e24\u79cd\uff1a \uff081\uff09\u9700\u8981\u8fdb\u884c\u5411\u4e0b\u6ed1\u52a8\uff0c\u8fd9\u91cc\u5c31\u6d89\u53ca\u5230\u76f8\u5e94\u7684\u8bc6\u522b\u65b9\u6848\uff0c\u5224\u65ad\u5982\u679c\u4e0d\u5728\u7b2c\u4e00\u9875\u5c31\u5f80\u4e0b\u6ed1\u52a8\u7ffb\u9875\u3002 \uff082\uff09\u542f\u52a8\u5668\u63d0\u4f9b\u641c\u7d22\u7684\u529f\u80fd\uff0c\u8f93\u5165\u5e94\u7528\u540d\u79f0\u641c\u7d22\uff0c\u7136\u540e\u8fdb\u884c\u70b9\u51fb\u3002 \u4ece\u5b9e\u9645\u64cd\u4f5c\u4e2d\u6765\u770b\uff0c\u91c7\u7528\u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u6548\u7387\u4f1a\u9ad8\u4e00\u70b9\u3002 \u3010\u7ec8\u7aef\u547d\u4ee4\u542f\u52a8\u3011 \u5728python\u4e2d\uff0c\u4f7f\u7528os.popen()\u6216os.system()\u6216\u8005subprocess.Popen()\uff0c\u5b9e\u73b0\u547d\u4ee4\u884c\u542f\u52a8\uff0c\u6bd4\u5982\uff1a import os\nos.popen('deepin-music')\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u8fdc\u7a0b\u6267\u884c\u811a\u672c\u7684\u65f6\u5019\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u7684\u95ee\u9898\u3002 \u3010\u603b\u7ed3\u3011 \u4ee5\u4e0a\u51e0\u79cd\u65b9\u6cd5\uff0c\u5404\u6709\u4f18\u7f3a\u70b9\uff0c\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff1a \uff081\uff09\u5982\u679c\u9700\u8981\u5728Jenkins\u4e2d\u505a\u6301\u7eed\u96c6\u6210\uff0c\u5efa\u8bae\u4f7f\u7528\u7b2c\u4e8c\u79cd\u4efb\u52a1\u680f\u542f\u52a8\u7684\u65b9\u6cd5\u3002 \uff082\uff09\u5982\u679c\u4e0d\u4f1a\u91c7\u7528\u8fdc\u7a0b\u6267\u884c\u7684\uff0c\u5efa\u8bae\u91c7\u7528\u7b2c\u4e00\u79cd\u6216\u8005\u6700\u540e\u4e00\u79cd\u65b9\u6848\u3002 \uff083\uff09\u7b2c\u4e09\u79cd\u548c\u7b2c\u56db\u79cd\u542f\u52a8\u65b9\u6cd5\uff0c\u901a\u5e38\u5728\u6d4b\u8bd5\u7528\u4f8b\u4e2d\u4f1a\u6d89\u53ca\u5230\uff0c\u6240\u4ee5\u5076\u5c14\u4f1a\u7528\u3002"},{"location":"RELEASE/","title":"\u7248\u672c\u66f4\u65b0\u8bb0\u5f55","text":""},{"location":"RELEASE/#220202395","title":"2.2.0\uff082023/9/5\uff09","text":"new \u6b63\u5f0f\u542f\u7528 letmego \u6280\u672f\u65b9\u6848\uff1b fix \u5bf9 docs \u91cc\u9762\u7ec6\u5316\u4e86\u8fdc\u7a0b\u6267\u884c\u7ae0\u8282\u7684\u63cf\u8ff0\uff1b "},{"location":"RELEASE/#2152023831","title":"2.1.5\uff082023/8/31\uff09","text":"new \u5c06\u6709\u8da3\u7684\u6587\u6863\u7cfb\u7edf\u8fc1\u79fb\u5230 linuxdeepin \uff0c\u5265\u79bb\u6587\u6863\u4e2d\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u91c7\u7528 CDN \u52a0\u901f\u65b9\u5f0f\u52a0\u8f7d\uff1b \u5c1d\u8bd5\u5408\u5165\u4e00\u4e2a\u6709\u8da3\u7684\u529f\u80fd\uff1b fix \u4fee\u590d\u4e86 Wayland \u952e\u9f20\u5de5\u5177\u6ca1\u6709\u9f20\u6807\u76f8\u5bf9\u79fb\u52a8\u65b9\u6cd5 moveRel \u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 Wayland \u4e0b\u83b7\u53d6\u7a97\u53e3\u4fe1\u606f\u529f\u80fd\u6a21\u5757\u4e2d\u73af\u5883\u53d8\u91cf\u7684\u95ee\u9898\uff1b \u4f18\u5316\u4e86 startproject \u529f\u80fd\u7684\u4e00\u4e9b\u4fe1\u606f\u8f93\u51fa\uff1b \u4fee\u590d\u4e86\u7279\u6b8a\u573a\u666f\u4e0b env_dev.sh \u5f00\u53d1\u73af\u5883\u90e8\u7f72\u662f\u53ef\u80fd\u5f71\u54cd\u5230\u6b63\u5f0f\u73af\u5883 env.sh \u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#2122023822","title":"2.1.2\uff082023/8/22\uff09","text":"new \u589e\u52a0 OCR \u8bc6\u522b\u81ea\u52a8\u91cd\u8bd5\u673a\u5236\uff0c\u9ed8\u8ba4\u91cd\u8bd5 2 \u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u91cd\u8bd5\u6b21\u6570\uff1b \u4f7f\u7528\u7a97\u7ba1\u6700\u65b0\u63d0\u4f9b\u7684\u4e8c\u8fdb\u5236\u63a5\u53e3\uff0c\u4f18\u5316\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u5728 Wayland \u4e0b\u83b7\u53d6\u7a97\u53e3\u4fe1\u606f\u7684\u65b9\u6cd5\uff1b\u611f\u8c22\u684c\u9762\u6d4b\u8bd5\u90e8 @\u4f55\u6743 @\u5b59\u7fe0 \u3001\u7a97\u7ba1\u7814\u53d1 @\u9ec4\u6cfd\u94ed \u7684\u5927\u529b\u652f\u6301\u3002 \u6269\u5145 skipif \u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\u51fd\u6570\uff1a skipif_xdg_type \u652f\u6301 x11 \u6216 wayland \u4e0a\u8df3\u8fc7\uff1b skipif_cpu_name \u652f\u6301\u4e0d\u540c cpu \u4e0a\u8df3\u8fc7\uff0c\u6bd4\u5982\uff1askipif_cpu_name-KLVVW5821\uff1b "},{"location":"RELEASE/#2102023818","title":"2.1.0\uff082023/8/18\uff09","text":"fix \u4fee\u590d SW \u67b6\u6784\u73af\u5883\u4f9d\u8d56\u7684\u95ee\u9898\uff0c\u539f\u56e0\u662f\u4e4b\u524d\u6211\u8fd9\u91cc\u672c\u5730\u6ca1\u6709 SW \u7684\u673a\u5668\uff0c\u6ca1\u6709\u505a\u76f8\u5173\u9002\u914d\uff1b \u4fee\u590d\u5b50\u9879\u76ee\u5355\u72ec\u9700\u8981\u4e09\u65b9\u5305 pexpect\uff0c\u7531\u4e8e\u4e4b\u524d\u662f\u9884\u88c5\u5230\u955c\u50cf\u91cc\u9762\u7684\uff0c\u4f46\u57fa\u7840\u6846\u67b6\u4e0d\u9700\u8981\uff0c\u56e0\u6b64\u6ca1\u6709\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u91cc\u9762\uff0c\u5bfc\u81f4\u5b50\u9879\u76ee\u4f9d\u8d56\u62a5\u9519\u3002 \u4fee\u590d\u5b50\u9879\u76ee cv \u5bfc\u5165\u62a5\u9519\u7684\u95ee\u9898\uff1b \u539f\u56e0\u4e3a\uff1ayouqu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u517c\u5bb9\u4e24\u79cd\u60c5\u51b5\uff0c\u4e00\u79cd\u662f\u9762\u5411\u670d\u52a1\uff0c\u5c31\u662f\u672c\u5730\u6d4b\u8bd5\u673a\u4e0d\u9700\u8981\u5b89\u88c5 OpenCV\uff0c\u7528\u4f8b\u4e2d\u7684\u56fe\u50cf\u8bc6\u522b\u4f1a\u901a\u8fc7\u8fdc\u7a0b\u670d\u52a1\u63a5\u53e3\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u548c\u7ed3\u679c\u83b7\u53d6\uff1b\u7b2c\u4e8c\u79cd\u662f\u539f\u751f\uff0c\u5c31\u662f\u672c\u5730\u76f4\u63a5\u5b89\u88c5 OpenCV \u76f4\u63a5\u7528\u3002\u4e24\u4e2a\u60c5\u51b5\u7684\u4f18\u5148\u7ea7\u662f\u4f18\u5148\u5224\u65ad\u672c\u5730\u5b58\u5728\uff0c\u5426\u5219\u8d70\u670d\u52a1\u3002 \u524d\u9762\u6211\u4eec\u5df2\u7ecf\u628a OCR \u529f\u80fd\u505a\u4e86\u670d\u52a1\u5316\uff0c\u57fa\u4e8e 1 \u5e74\u591a\u4ee5\u6765\u7684\u89c2\u5bdf\uff0c\u7528\u8d77\u6765\u5f88\u7a33\u5b9a\uff0c\u518d\u4e00\u4e2a\u5c31\u662f OpenCV \u5b89\u88c5\u5305\u662f\u6bd4\u8f83\u81c3\u80bf\u7684\uff0c\u7c97\u7565\u6570\u4e86\u4e0b\u4f9d\u8d56\u6709 30+ \u4e2a\uff0c\u800c\u4e14\u5728\u5404\u67b6\u6784\u4e0a\u4f9d\u8d56\u5305\u8fd8\u4e0d\u5c3d\u76f8\u540c\uff0c\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u65b9\u6848\u4e2d\u4e0d\u592a\u597d\u5904\u7406\uff0c\u6240\u4ee5\u672c\u6b21 2.0 \u7248\u672c\u6211\u4eec\u5927\u80c6\u7684\u5c06\u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u529f\u80fd\u4fee\u6539\u4e3a\u9762\u5411\u670d\u52a1\u7684\u65b9\u5f0f\uff0c\u524d\u671f\u6d4b\u8bd5\u4e00\u5207\u770b\u8d77\u6765\u90fd\u5f88\u548c\u8c10\u3002 \u4f46\u662f\u6ca1\u6ce8\u610f\u5230\u4e4b\u524d\u7ed9\u6d77\u71d5\u59d0\u90a3\u8fb9\u9879\u76ee\u5355\u72ec\u5b9a\u5236\u505a\u4e86\u4e2a\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\uff08\u4e3a\u4e86\u80fd\u7b80\u5355\u5e73\u6ed1\u7684\u8fc1\u79fb\u5230 youqu\uff09\uff0c\u6b64\u63a5\u53e3\u5e95\u5c42\u6ca1\u6709\u517c\u5bb9\u670d\u52a1\u5316\uff0c\u6240\u4ee5\u5979\u90a3\u8fb9\u7684\u9879\u76ee\u8c03\u7528\u6b64\u5b9a\u5236\u63a5\u53e3\u4f1a\u62a5 cv \u5bfc\u5165\u7684\u95ee\u9898\u3002 \u7531\u4e8e\u5c06\u8fd9\u4e2a\u5b9a\u5236\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\u8fdb\u884c\u670d\u52a1\u5316\u517c\u5bb9\u6539\u9020\u9700\u8981\u4e00\u5b9a\u65f6\u95f4\uff0c\u6539\u5b8c\u8fd8\u9700\u8981\u6d4b\u8bd5\uff0c\u4f46\u672c\u6b21\u65f6\u95f4\u6bd4\u8f83\u7d27\uff0c\u56e0\u6b64\u5148\u628a OpenCV \u88c5\u8fdb\u865a\u62df\u73af\u5883\uff0c\u540e\u7eed\u7248\u672c\u518d\u8003\u8651\u9488\u5bf9\u6b64\u63a5\u53e3\u505a\u4fee\u6539\u3002"},{"location":"RELEASE/#2002023816","title":"2.0.0\uff082023/8/16\uff09","text":"YouQu\uff08\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff09\u5f00\u6e90\u4e86\uff0c\u540c\u65f6\u63a8\u51fa\u4e86 2.0 \u7248\u672c\u3002 \u611f\u8c22\u738b\u6ce2\u603b\u3001\u67b6\u6784\u5e08\u5f90\u5c0f\u4e1c\u3001\u7814\u53d1\u7ecf\u7406\u90d1\u5e7c\u6208\u3001\u5218\u90d1\u7b49\u7814\u53d1\u540c\u4e8b\u7684\u5927\u529b\u652f\u6301\u3002 new 1\u3001\u65b0\u7684\u57fa\u7840\u6846\u67b6\u4ee3\u7801\u83b7\u53d6\u65b9\u5f0f\u53ca\u65b0\u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4 YouQu \u540e\u7eed\u5747\u901a\u8fc7 PyPI \u8fdb\u884c\u5305\u7684\u53d1\u5e03\uff0c\u4e5f\u5c31\u662f\u8bf4\u540e\u7eed\u53ef\u4ee5\u4f7f\u7528 pip \u8fdb\u884c\u5b89\u88c5\uff1a sudo pip3 install youqu==2.0.0\n \u8fd9\u91cc\u6709 2 \u4e2a\u5c0f\u70b9\u8981\u6ce8\u610f\uff1a \u63a8\u8350\u4f7f\u7528 sudo pip3 \uff08\u52a0 sudo\uff09\u8fdb\u884c\u5b89\u88c5\uff1b \u5982\u679c\u4e0d\u52a0 sudo \u6709\u4e9b\u673a\u5668\u53ef\u80fd $HOME/.local/bin \u4e0d\u5728\u7cfb\u7edf PATH \u73af\u5883\u76ee\u5f55\u4e0b\uff0c\u5728\u4e0d\u6dfb\u52a0\u73af\u5883\u53d8\u91cf\u7684\u60c5\u51b5\u4e0b\uff0c\u4f1a\u51fa\u73b0 YouQu \u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4\uff08youqu-startproject\uff09\u65e0\u6cd5\u4f7f\u7528\u7684\u95ee\u9898\uff1b \u5f53\u7136\uff0c\u5c06\u4e0a\u8ff0\u8def\u5f84\u6dfb\u52a0\u5230\u73af\u5883\u53d8\u91cf\u4e4b\u540e\u4e5f\u662f\u53ef\u4ee5\u7528\u7684\uff0c\u6240\u4ee5\u6211\u8fd9\u91cc\u662f\u63a8\u8350\u52a0 sudo\uff0c\u4e0d\u52a0 sudo \u4e5f\u662f\u53ef\u4ee5\u7684\uff0c\u53ea\u662f\u9700\u8981\u5173\u6ce8\u4e0b\u73af\u5883\u53d8\u91cf\u7684\u95ee\u9898\u3002 \u63a8\u8350\u6307\u5b9a\u7248\u672c\u53f7\uff08youqu==2.0.0\uff09\u5b89\u88c5\uff0c\u5982\u679c\u4e0d\u6307\u5b9a\u7248\u672c\u53f7\u9ed8\u8ba4\u662f\u5b89\u88c5\u6700\u65b0\u53d1\u5e03\u7684 YouQu \u7248\u672c\uff0c\u4f60\u53ef\u4ee5\u5728 PyPI \u4e0a\u7684 Release history \u91cc\u9762\u67e5\u770b\u6709\u54ea\u4e9b\u7248\u672c\u3002 \u5b89\u88c5\u4e4b\u540e\u4f1a\u81ea\u52a8\u751f\u6210\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu-startproject\uff0c\u4f7f\u7528\u5b83\u53ef\u4ee5\u521d\u59cb\u5316\u5de5\u7a0b\uff0c\u8fd9\u91cc\u4ee5\u97f3\u4e50\u4e3e\u4f8b\uff1b youqu-startproject autotest_deepin_music\n \u8fd9\u6837\u5c31\u4f1a\u5728\u5f53\u524d\u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a autotest_deepin_music \u76ee\u5f55\uff0c\u91cc\u9762\u5305\u542b\u4e86\u57fa\u7840\u6846\u67b6\u6240\u6709\u7684\u4ee3\u7801\uff1b \u4e4b\u540e\uff0c\u8fd8\u662f\u5728 apps \u76ee\u5f55\u4e0b\uff0c\u653e\u5165\u5b50\u9879\u76ee\u7684AT\u4ee3\u7801\u5373\u53ef\uff0c\u4f7f\u7528\u65b9\u6cd5\u548c\u8fc7\u53bb\u4e00\u6837\uff0c\u8fd9\u91cc\u5c31\u4e0d\u591a\u4ecb\u7ecd\u3002 \u53e6\u5916\uff0c\u9664\u4e86\u901a\u8fc7 pip \u83b7\u53d6\u4ee5\u5916\uff0c\u4ecd\u7136\u53ef\u4ee5\u901a\u8fc7\u6e90\u7801\u83b7\u53d6\uff08\u76f4\u63a5 git clone\uff09\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u4f7f\u7528 pip \u5b89\u88c5 YouQu \u65f6\uff0cYouQu \u5305\u7684\u5927\u5c0f\u624d 600+ k\uff0c\u5b89\u88c5\u901f\u5ea6\u8d77\u98de\u3002 2\u3001\u65b0\u7684AT\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848 \u4e3a\u4e86\u89e3\u51b3\u4ee5\u4e0b\u95ee\u9898\uff1a \u8fc7\u53bb\u4e00\u6bb5\u65f6\u95f4\u54b1\u4eec\u7ecf\u5e38\u51fa\u73b0\u7684\uff0c\u4e0d\u540c\u7684AT\u9879\u76ee\u5728\u540c\u4e00\u53f0\u673a\u5668\u4e0a\u90e8\u7f72\u73af\u5883\u65f6\u4f9d\u8d56\u7248\u672c\u51b2\u7a81\u7684\u95ee\u9898\uff0c\u65b0\u65b9\u6848\u4e0d\u540c\u7684\u9879\u76ee\u4f1a\u52a8\u6001\u751f\u6210\u81ea\u5df1\u7684\u865a\u62df\u73af\u5883\uff0c\u76f8\u4e92\u4e4b\u95f4\u4e0d\u5f71\u54cd\uff1b \u4e1a\u5185\u4e3a\u4e86\u89e3\u51b3\u7248\u672c\u51b2\u7a81\u95ee\u9898\u4e00\u822c\u90fd\u4f1a\u4f7f\u7528Python\u865a\u62df\u73af\u5883\u7684\u5de5\u5177\uff0c\u4f46\u662f\u90fd\u6709\u4e2a\u95ee\u9898\uff0c\u65e0\u6cd5\u7ba1\u7406 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u5305\uff0c\u672c\u6b21\u6211\u4eec\u89e3\u51b3\u4e86\u8fd9\u4e2a\u95ee\u9898\uff0c\u80fd\u591f\u5b8c\u5168\u7ba1\u7406\u5e38\u89c4\u7684Python\u5305\uff0c\u4e5f\u80fd\u7ba1\u7406\u5230 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u4e09\u65b9\u5305\uff1b \u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u4f7f\u7528\u65b9\u6cd5\uff1a bash env.sh\n \u53ef\u4ee5\u770b\u51fa\u6765\u548c\u539f\u6765\u4f7f\u7528\u65b9\u6cd5\u6ca1\u6709\u53d8\u5316\uff0c\u4e5f\u5c31\u662f\u8bf4\u4ece\u4f7f\u7528\u7684\u89d2\u5ea6\u662f\u5b8c\u5168\u6ca1\u6709\u533a\u522b\u7684\uff0c\u53ea\u662f\u5185\u90e8\u505a\u4e86\u4e0d\u540c\u7684\u4e8b\u60c5\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u672c\u673a\u90e8\u7f72\u7684\u529f\u80fd\u4ecd\u7136\u4fdd\u7559 env_dev.sh\uff0c\u53ef\u4ee5\u4f5c\u4e3a\u5f00\u53d1\u65f6\u7684\u73af\u5883\u90e8\u7f72\u3002 3\u3001\u65b0\u7684\u9a71\u52a8\u547d\u4ee4 \u8fc7\u53bb\u54b1\u4eec\u90fd\u662f\u4f7f\u7528\u8fd9\u6837\u7684\u547d\u4ee4\u6765\u9a71\u52a8\u6267\u884c\uff1a python3 manage.py run\n \u7531\u4e8e\u9ed8\u8ba4\u57fa\u4e8e\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848\uff0c\u56e0\u6b64\u6211\u4eec\u589e\u52a0\u4e86\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu\uff1b \u65b0\u7684\u9a71\u52a8\u65b9\u5f0f\uff1a youqu manage.py run\n \u53ea\u9700\u8981\u628a python3 \u66ff\u6362\u6210 youqu \u5c31\u53ef\u4ee5\u4e86\uff0c\u770b\u8d77\u6765\u5f88\u548c\u8c10~ 4\u3001\u65b0\u7684\u6587\u6863\u5730\u5740 \u8fc7\u53bb\u54b1\u4eec YouQu \u7684\u5728\u7ebf\u6587\u6863\u662f\u90e8\u7f72\u5728\u516c\u53f8\u5185\u7f51\u7684\uff0c\u73b0\u5728\u5f00\u6e90\u5230 github \u4e86\uff0c\u5916\u90e8\u5f00\u53d1\u8005\u80af\u5b9a\u8bbf\u95ee\u4e0d\u5230\u5185\u7f51\u7684\u6587\u6863\uff0c\u56e0\u6b64\u9700\u8981\u5c06\u6587\u6863\u90e8\u7f72\u5230\u516c\u7f51\u3010\u516c\u7f51\u6587\u6863\u3011\uff1b \u516c\u7f51\u6587\u6863\u4f7f\u7528\u7684\u662f github pages\uff08\u767d\u5ad6\u602a\u4e00\u987f\u72c2\u559c~~\uff09\uff0c\u4f46\u53ef\u80fd\u4f1a\u51fa\u73b0\u6587\u6863\u901f\u5ea6\u6162\u7684\u95ee\u9898\uff08\u4ee3\u7406\u4e0b\u5c31\u597d\u4e86\uff09\uff0c\u4e0d\u8fc7\u6ca1\u5173\u7cfb\uff0c\u54b1\u4eec\u3010\u5185\u7f51\u6587\u6863\u3011\u4ecd\u7136\u4fdd\u7559\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u3002 5\u3001\u5176\u4ed6\u4e00\u4e9b\u5c0f\u5c0f\u529f\u80fd\u66f4\u65b0\uff1a \uff081\uff09\u65b0\u589e\u5173\u95ed\u5206\u8fa8\u7387\u68c0\u6d4b\u7684\u53c2\u6570\u503c\uff1b youqu manage.py run --resolution no\n \u6216\u8005\u4fee\u6539 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387, \u6bd4\u5982\uff1a1920x1080\n;no: \u8868\u793a\u4e0d\u505a\u5206\u8fa8\u7387\u6821\u9a8c\nRESOLUTION = 1920x1080\n resolution \u8fd9\u4e2a\u53c2\u6570\u4e00\u76f4\u90fd\u6709\u7684\uff0c\u53ea\u4e0d\u8fc7\u4e4b\u524d\u662f\u7528\u4e8e\u6307\u5b9a\u5206\u8fa8\u7387\u5927\u5c0f\uff0c\u6bd4\u5982 --resolution 1920x1080\uff0c\u4f46\u6709\u4e9b\u63a5\u53e3\u7684\u9879\u76ee\u4e0d\u9700\u8981\u8fd9\u4e2a\u68c0\u67e5\uff0c\u53ef\u4ee5\u7ed9\u5b83\u4e2a no \u5c31\u597d\u4e86\uff0c\u5f53\u7136 CICD \u4e0a\u5173\u95ed\uff0c\u9700\u8981\u6d41\u6c34\u7ebf\u4e0a\u628a\u8fd9\u4e2a\u53c2\u6570\u52a0\u4e0a\uff1b \uff082\uff09\u65b0\u589e\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u7684\u547d\u4ee4\u884c\u53c2\u6570 \u4e4b\u524d\u8fd9\u4e2a\u914d\u7f6e\u9879\u53ea\u80fd\u5728 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c 1 \u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff0cRERUN >= RECORD_FAILED_CASE\u3002\n;1.\u5173\u95ed\u5f55\u5c4f\uff1aRECORD_FAILED_CASE > RERUN\n;2.\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1aRECORD_FAILED_CASE = 0\nRECORD_FAILED_CASE = 1\n \u73b0\u5728\u5c06\u5f00\u53d1\u5230\u547d\u4ee4\u884c\u53c2\u6570\u3002 youqu manage.py run --record_failed_case 2\n fix \u4fee\u590d remote \u6267\u884c\u65f6\uff0c\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u65e0\u6cd5\u751f\u6210\u6d4b\u8bd5\u62a5\u544a\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1302023710","title":"1.3.0\uff082023/7/10\uff09","text":"fix \u8fdb\u4e00\u6b65\u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b\u53c2\u8003\uff1a\u914d\u7f6ePython\u6e90\u7684\u51e0\u79cd\u65b9\u6cd5 \u4fee\u590d wayland_autotool \u53d7\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86wayland\u4e0b\u5076\u73b0\u627e\u4e0d\u5230 .Xauthority \u6587\u4ef6\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1292023626","title":"1.2.9\uff082023/6/26\uff09","text":"fix \u4f18\u5316\u8fdc\u7a0b\u6267\u884c remote \u7684\u53c2\u6570\u76f4\u63a5\u4f20\u7ed9\u8fdc\u7a0b\u673a\u5668\u7684 run \u547d\u4ee4\uff0c\u4e0d\u7528\u518d\u5355\u72ec\u5904\u7406\u8fdc\u7a0b\u6267\u884c\u7684\u53c2\u6570\u903b\u8f91\uff0c\u540e\u7eed\u4e13\u6ce8\u4e8e\u672c\u5730\u6267\u884c\u529f\u80fd\u5f00\u53d1\uff0c\u8fdc\u7a0b\u6267\u884c\u81ea\u52a8\u9002\u7528\uff1b env.sh \u79fb\u9664 pyyaml \u5b89\u88c5\uff0c\u7531\u5b50\u9879\u76ee\u5728 requirement.txt \u91cc\u9762\u5b9a\u4e49\uff0c\u6846\u67b6\u81ea\u52a8\u52a0\u8f7d\uff1b \u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b "},{"location":"RELEASE/#128202369","title":"1.2.8\uff082023/6/9\uff09","text":"fix \u4fee\u590d\u4e86 pypi \u5b89\u88c5 numpy \u5b58\u5728\u7cfb\u7edf\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#127202368","title":"1.2.7\uff082023/6/8\uff09","text":"fix env.sh \u4e2d\u5b89\u88c5 Python \u5305\u672a\u6307\u5b9a\u7248\u672c\u65f6\uff0c\u65e5\u5fd7\u8f93\u51fa\u5b89\u88c5\u7684\u7248\u672c\uff1b pdocr-rpc 2.0.1\nallure-custom 1.2.1\nfunnylog 1.1.3\n \u4fee\u590d -f \u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u62a5\u9519\u7684\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#126202367","title":"1.2.6\uff082023/6/7\uff09","text":"fix \u4fee\u590d wayland \u4e0a\u8c03\u7528\u9f20\u6807\u4e2d\u952e\u3001\u53f3\u952e\u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b \u4fee\u590d pubilic/dde_desktop_public_widget \u91cc\u9762\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u5b9a\u4f4d\u684c\u9762\u6587\u4ef6\u7684\u65b9\u6cd5\uff0c\u5750\u6807\u6ca1\u6709\u62c6\u5305\u7684\u95ee\u9898\uff1b \u4f18\u5316\u4e86\u7b49\u5f85\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b pycreeze \u7248\u672c\u5347\u7ea7\u5230 0.1.29\uff0c\u5bfc\u81f4\u4e0e pyautogui 0.9.53 \u4e0d\u517c\u5bb9\uff0cenv.sh \u91cc\u9762\u589e\u52a0\u6307\u5b9a pycreeze \u7248\u672c\u4e3a 0.1.28\uff1b "},{"location":"RELEASE/#1252023516","title":"1.2.5\uff082023/5/16\uff09","text":"new --app \u53c2\u6570\u540e\u9762\u65b0\u589e\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u76ee\u524d\u652f\u6301\u4e09\u79cd\u53c2\u6570\u4f20\u5165\u65b9\u5f0f\uff1a ~$: youqu run -a deepin-music\n~$: youqu run -a autotest_deepin_music\n~$: youqu run -a apps/autotest_deepin_music\n \u200b \u540e\u4e24\u79cd\u5165\u53c2\u65b9\u5f0f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\u3002 remote \u8fdc\u7a0b\u6267\u884c\u65b0\u589e\u4ece\u547d\u4ee4\u884c\u4f20\u5165\u6d4b\u8bd5\u673a\u4fe1\u606f\uff0c\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679c password \u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6 setting/remote.ini \u4e2d CLIENT_PASSWORD \u7684\u503c,\u6bd4\u5982\uff1auos@10.8.13.33:1 \u6216 uos@10.8.13.33 \uff1b python3 manage.py remote -c uos@10.8.13.33/uos@10.8.13.34\npython3 manage.py remote -c uos@10.8.13.33:1/uos@10.8.13.34:2\n fix \u65e5\u5fd7\u6a21\u5757\u4fee\u6539\u4e3a\u51fd\u6570\u6267\u884c\u4e4b\u524d\u6253\u5370\u65e5\u5fd7\uff1b \u65e5\u5fd7\u6a21\u5757\u589e\u52a0\u767d\u540d\u5355\uff0c\u901a\u8fc7\u7c7b\u540d\u5f00\u5934\uff0c\u7ed3\u675f\uff0c\u5305\u542b\u7b49\u5173\u952e\u5b57\u63a7\u5236\u9700\u8981\u6253\u5370\u7684\u51fd\u6570\u65e5\u5fd7\uff1b \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5982\u679c\u4f20\u5165\u4e86 app_name \u53ea\u4f1a\u5c06 apps \u76ee\u5f55\u4e0b app_name \u7684\u76ee\u5f55\u53d1\u9001\u5230\u6d4b\u8bd5\u673a\uff1b env.sh \u79fb\u9664 python3-dev\uff1b \u4fee\u590d Wayland \u4e0b env.sh \u73af\u5883\u5b89\u88c5\u5931\u8d25\u7684\u95ee\u9898\uff0c\u4f18\u5316\u4e86 deb \u4f9d\u8d56\u5b89\u88c5\u7684\u903b\u8f91\uff1b \u5c06 env.sh \u5237\u65b0\u6e90\u7684\u65e5\u5fd7\u5728\u7ec8\u7aef\u663e\u793a\uff0c\u89e3\u51b3\u5728 CI \u73af\u5883\u4e0b\uff0c\u957f\u65f6\u95f4\u4e0d\u8f93\u51fa\u65e5\u5fd7\u8fde\u63a5\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d1060 \u534e\u4e3a\u673a\u578b\u5b89\u88c5\u952e\u9f20\u5de5\u5177\u65f6\u4f9d\u8d56\u4e0d\u517c\u5bb9\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1242023227","title":"1.2.4\uff082023/2/27\uff09","text":"fix \u4fee\u6539 CURRENT \u6587\u4ef6\uff1b "},{"location":"RELEASE/#1232023227","title":"1.2.3\uff082023/2/27\uff09","text":"new pylint.sh \u652f\u6301\u901a\u8fc7\u4f4d\u7f6e\u53c2\u6570\u4f20\u5165\u6587\u4ef6\u8def\u5f84\uff1abash pylint.sh apps/autotest_deepin_music,\u597d\u5904\u662f\u53c2\u6570\u8def\u5f84\u53ef\u4ee5\u5728\u7ec8\u7aef\u8865\u5168\uff1b \u65b0\u589e\u7cfb\u7edf\u547d\u4ee4 youqu-pylint \uff0c\u7528\u4e8e\u9759\u6001\u4ee3\u7801\u626b\u63cf\uff0c\u4f7f\u7528\u65b9\u6cd5: youqu-pylint apps/autotest_deepin_music\uff1b \u7531\u4e8e\u7cfb\u7edf\u4e00\u4e9b dbus \u63a5\u53e3\u6539\u53d8\uff0c\u516c\u5171\u5e93\u4e2d\u7684 dbus \u65b9\u6cd5\u5c06\u4e0d\u518d\u7ef4\u62a4\uff0c\u7531\u5b50\u9879\u76ee\u5728 other_widget.py \u91cc\u9762\u8fdb\u884c\u7ef4\u62a4\uff1b fix \u4fee\u590d ssh \u73af\u5883\u4e0b\u8fd0\u884c\u63d0\u793a \u201c\u65e0\u6cd5\u8fde\u63a5\u201d \u7684\u95ee\u9898\uff1b \u4fee\u590d\u8fd0\u884c\u65f6\u7a0b\u5e8f\u9000\u51fa\uff0c\u4e0d\u8f93\u51fa\u5f02\u5e38\u65e5\u5fd7\u7684\u95ee\u9898\uff1b \u4fee\u590dyouqu remote xxx \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5728\u670d\u52a1\u7aef Ctrl + C \u65e0\u6cd5\u505c\u6b62\u7a0b\u5e8f\u8fd0\u884c\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#122202328","title":"1.2.2\uff082023/2/8\uff09","text":"new \u65b0\u589e\u6c14\u6ce1\u7c7b\u56fe\u50cf\u8bc6\u522b\u65b9\u6848\uff1bimage_utils.py::ImageUtil::get_during\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u533a\u57df\u8bc6\u522b\uff0c\u4f20\u5165 [x, y, w, h]\uff0cx: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u76ee\u6807\u56fe\u7247\uff0c\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\uff1b env.sh \u79fb\u9664 pypinyin; \u4f18\u5316\u6267\u884c env.sh \u65f6\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b manage.py \u79fb\u9664\u4e86\u53c2\u6570 session_timeout \uff0c\u6846\u67b6\u6839\u636e\u5168\u5c40\u7684 timeout \u4ee5\u53ca\u7528\u4f8b\u81ea\u5b9a\u4e49\u7684 timeout \u81ea\u52a8\u8ba1\u7b97\u51fa sessiontimeout \u7684\u503c\uff1b \u65b0\u589e ocr \u670d\u52a1\u5668\u94fe\u63a5\u91cd\u8bd5\uff0c\u9ed8\u8ba4\u91cd\u8bd51\u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u53c2\u6570\uff1b fix \u4fee\u590d\u4e86\u4e00\u4e9b pylint \u626b\u63cf\u7684\u4ee3\u7801\u98ce\u683c\u95ee\u9898\uff1b \u91cd\u65b0\u8bbe\u8ba1\u4e86\u6d4b\u8bd5\u62a5\u544a\u4e3b\u9898\uff1b "},{"location":"RELEASE/#121202316","title":"1.2.1\uff082023/1/6\uff09","text":"new \u652f\u6301\u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6267\u884c\u7528\u4f8b\uff1b\u53ef\u5c06python3 manage.py \u66ff\u6362\u4e3a youqu \uff1a youqu run -a deepin-music -k 001\n RPC \u670d\u52a1 IP \u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u6307\u5b9a\u4e0d\u540c\u7684\u7aef\u53e3\uff1b \u5728\u7ebf\u6587\u6863\u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u539f\u6765\u7684\u5730\u5740 10.8.10.215 \u5c06\u4e0d\u5728\u4f7f\u7528\uff1b fix \u4fee\u590d --count \u53c2\u6570\u53ef\u80fd\u51fa\u73b0\u4e0e\u5176\u4ed6\u6846\u67b6\u7684\u5de5\u7a0b\u4f9d\u8d56\u5b58\u5728\u51b2\u7a81\uff0c\u62a5\u9519\u91cd\u590d\u6ce8\u518c\u7684\u95ee\u9898\uff1b \u4fee\u590d CI \u73af\u5883\u4e0b\u591a\u4e2a\u5de5\u7a0b\u5b58\u5728 Python \u73af\u5883\u53d8\u91cf\u6307\u5411\u9519\u8bef\uff0c\u5bfc\u5305\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u5355\u72ec\u8fd0\u884c\u65b9\u6cd5\u65f6\u65e0\u65e5\u5fd7\u8f93\u51fa\u7684 Bug\uff1b "},{"location":"RELEASE/#12020221230","title":"1.2.0\uff082022/12/30\uff09","text":"1.1.4 \u7248\u672c\u9002\u914d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e14\u65b0\u589e\u4e86\u8f83\u591a\u65b0\u7279\u6027\uff0c\u6211\u4eec\u8ba1\u5212\u4f7f\u7528 1.1.4 \u7248\u672c\u8fd0\u884c\u4e00\u6bb5\u65f6\u95f4\uff0c1.2.0 \u7248\u672c\u5c06\u4fee\u590d\u671f\u95f4\u51fa\u73b0\u7684 Bug\uff0c\u7136\u540e\u4f5c\u4e3a\u7a33\u5b9a\u7248\u672c\u53d1\u5e03\u3002 new \u4fee\u6539\u5de5\u7a0b\u540d\u79f0\u4e3a youqu\uff1b \u5c06 sphinx \u6587\u6863\u5de5\u7a0b\u8fc1\u79fb\u5230\u5355\u72ec\u7684\u4ed3\u5e93\uff1b fix \u4fee\u590d startapp \u521b\u5efa\u5de5\u7a0b\u65f6\u5b58\u5728\u5de5\u7a0b\u540d\u79f0\u65f6\u65e0\u6cd5\u7ee7\u7eed\u521b\u5efa\uff1b \u4fee\u590d\u4e86 OCR \u670d\u52a1\u5728\u5e76\u53d1\u65f6\u53ef\u80fd\u51fa\u73b0\u65e0\u6cd5\u8fd4\u56de\u7ed3\u679c\u7684\u95ee\u9898\uff0c\u63d0\u5347 OCR \u670d\u52a1\u9ad8\u5e76\u53d1\u7a33\u5b9a\u6027\uff1b \u4fee\u590d PMS \u540c\u6b65\u6807\u7b7e\u5230 CSV \u6587\u4ef6\u4e0d\u652f\u6301\u7528\u4f8b\u5e93\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11420221214","title":"1.1.4\uff082022/12/14\uff09","text":"new \u65b0\u589e startapp \u5b50\u547d\u4ee4\u521b\u5efa\u5b50\u9879\u76ee\u5de5\u7a0b\u6a21\u677f: python3 manage.py startapp autotest_deepin_xxx \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u91cd\u590d\u6267\u884c\u6b21\u6570\uff1b \u53bb\u6389\u6279\u91cf\u6267\u884c\u524d\u6536\u96c6\u7528\u4f8b\u7684\u6b65\u9aa4\uff1b \u589e\u52a0\u5f00\u59cb\u6267\u884c\u65f6\u6253\u5370\u4e00\u4e9b\u6267\u884c\u53c2\u6570\uff0c\u5982\uff1a \u7528\u4f8b\u6536\u96c6\u6570\u91cf: 99\n\u5931\u8d25\u91cd\u8dd1\u6b21\u6570: 1\n\u6700\u5927\u5931\u8d25\u6b21\u6570: 49\n\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4: 200.0s (03\u520620\u79d2)\n\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4: 11880s (3\u5c0f\u65f618\u52060\u79d2)\n \u5b9a\u5236\u4fee\u6539allure\u62a5\u544alogo\u3001title\u3001\u9ed8\u8ba4\u8bed\u8a00\uff1b manage.py \u6267\u884c\u5f00\u59cb\u65f6\u6253\u5370 logo \u548c\u5f53\u524d\u7248\u672c\uff1a \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u255a\u2588\u2588\u2557 \u2588\u2588\u2554\u255d \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2584\u2584 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2580\u2580\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u2584\u2588 \u2584\u2588 \u2588 \u2588 \u2588 \u2584 \u2588 \u2584 \u2580\u2580\u2588 \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\uff1b \u88c5\u9970\u5668\u65b9\u6cd5\u6307\u5b9a\u6b21\u6570\uff1b @pytest.mark.count(2)\ndef test_music_001():\npass\n \u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u6b21\u6570\uff1b python3 manage.py run -a deepin-music -k 001 --count 2\n \u200b image_utils \u589e\u52a0\u51fd\u6570 save_temporary_picture\uff0c\u652f\u6301\u6307\u5b9a\u5c4f\u5e55\u533a\u57df\u622a\u56fe\u5e76\u8fd4\u56de\u56fe\u7247\u5b58\u653e\u7684\u672c\u5730\u8def\u5f84\uff0c\u540e\u7eed\u4f7f\u7528 assert_image_exist \u8fdb\u884c\u65ad\u8a00 Python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(x, y, width, height) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) button_center \u65b0\u589e btn_size \u83b7\u53d6\u63a7\u4ef6\u5de6\u4e0a\u89d2\u5750\u6807\u53ca\u957f\u5bbd\uff0c\u7528\u4e8e\u52a8\u6001\u7684\u622a\u53d6\u5143\u7d20\u7684\u56fe\u7247\uff0c\u53ef\u7528\u4e8e\u5b9a\u4f4d\u65ad\u8a00 python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u6240\u6709\u97f3\u4e50\u6309\u94ae\")) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) allure \u62a5\u544a\u4e2d\u5b9a\u4f4d\u95ee\u9898\u9664\u4e86\u65e5\u5fd7\u3001\u622a\u56fe\u3001\u5f55\u5c4f\u5916\uff0c\u8c03\u7528\u7684\u51fd\u6570\u589e\u52a0\u4e86 step \u6b65\u9aa4\u5c55\u793a\uff1b env.sh \u65b0\u589e\u5b89\u88c5\u5b50\u9879\u76ee Python \u4e09\u65b9\u4f9d\u8d56\uff0c\u5728\u5b50\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u5199 requirement.txt \u6587\u4ef6\uff0cenv.sh \u4f1a\u81ea\u52a8\u52a0\u8f7d\uff1b ocr \u8bc6\u522b\u65b0\u589e\u652f\u6301\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\u8fdb\u884c\u6587\u5b57\u8bc6\u522b\uff0c\u51cf\u5c11\u56e0\u5168\u5c4f\u8bc6\u522b\u65f6\uff0c\u5176\u4ed6\u6587\u5b57\u7684\u5e72\u6270 Python # \u65ad\u8a00\u97f3\u4e50\u7684\u5220\u9664\u5f39\u7a97\u4e2d\uff0c\u5305\u542b\u4e86\u201c\u786e\u8ba4\u201d\u7684\u6587\u5b57 self.assert_ocr_exist(\"\u786e\u8ba4\", picture_abspath=DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u5220\u9664\u5f39\u7a97\"))) \u65ad\u8a00\u51fd\u6570\u7684\u8c03\u7528\u4e5f\u4f1a\u81ea\u52a8\u6253\u5370\u65e5\u5fd7; env.sh \u65b0\u589e\u88c1\u526a\u4f9d\u8d56\u7684\u65b9\u6848\uff1b fix \u4fee\u590d Jenkins \u73af\u5883\u4e0b\uff0c apps \u76ee\u5f55\u4e0b\u5b50\u9879\u76ee\u5b58\u5728 auotest_deepin_xxx@tmp \u76ee\u5f55\uff0c\u5728\u4f20\u5165 app_name \u540e\u65e0\u6cd5\u6267\u884c\u7528\u4f8b\u7684\u95ee\u9898\uff1b \u4fee\u590d\u81ea\u52a8\u751f\u6210 case_list.csv \u6587\u4ef6\u65f6\uff0c\u7528\u4f8b\u987a\u5e8f\u88ab\u8c03\u6574\u7684\u95ee\u9898\uff1b env.sh \u73af\u5883\u5b89\u88c5\u79fb\u9664 git \u548c curl\uff1b \u4fee\u590d\u7528\u4f8b\u5728 setup \u9636\u6bb5\u62a5\u9519\u540e\uff0c\u672a\u5199\u5165 ci_result.json \u7684\u95ee\u9898\uff1b \u79fb\u9664 uos_ci.py\uff1b "},{"location":"RELEASE/#11320221028","title":"1.1.3\uff082022/10/28\uff09","text":"new \u65b0\u589e\u56fe\u50cf\u65ad\u8a00\u6210\u529f\u8f93\u51fa\u5339\u914d\u5ea6\uff1b \u65b0\u589e\u73af\u5883\u5b89\u88c5 yaml \u4f9d\u8d56\uff1b \u65b0\u589e\u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6570\u636e\u56de\u586b\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b \u65b0\u589e\u6d4b\u8bd5\u7ed3\u679c\u8868\u60c5\u663e\u793a\uff0c\u5e76\u4f18\u5316\u4e86\u65e5\u5fd7\u7684\u6392\u7248\uff1b \u65b0\u589e --top {number} \u7528\u4e8e\u8bb0\u5f55\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0c\u65e5\u5fd7\u751f\u6210\u5230 report/logs/top.log\uff1b fix \u4fee\u590d\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4f46\u7ec8\u7aef\u6ca1\u6709\u9519\u8bef\u65e5\u5fd7\u8f93\u51fa\u7684\u95ee\u9898\uff1b \u4fee\u6539\u5931\u8d25\u7528\u4f8b\u56de\u6eaf\u65e5\u5fd7\u4e3a\u8be6\u7ec6\u7ea7\u522b\uff1b \u4fee\u590d\u4e86\u6267\u884c\u8fdb\u5ea6\u672a\u8ba1\u7b97\u8df3\u8fc7\u7528\u4f8b\u7684\u95ee\u9898\uff0c\u5e76\u4f18\u5316\u4e86\u8fdb\u5ea6\u83b7\u53d6\u7684\u7b97\u6cd5\uff1b \u4fee\u590d env.sh \u5728 V23 \u73af\u5883\u4e0b\u5b89\u88c5\u65e0\u6cd5\u8bfb\u53d6\u5bc6\u7801\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 pms \u6d4b\u8bd5\u5957\u6267\u884c\u6216\u6d4b\u8bd5\u5355\u6267\u884c\u65f6\uff0c\u7528\u4f8bID\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b env.sh \u91cc\u9762 hub.deepin.com \u66f4\u6362\u6210 it.uniontech.com\uff1b uos_ci.py \u6d4b\u8bd5\u7ed3\u679c\u7edf\u8ba1\u65f6\uff0c\u603b\u6570\u5254\u9664 skip \u7684\u6570\u91cf "},{"location":"RELEASE/#11220220921","title":"1.1.2\uff082022/09/21\uff09","text":"new \u5728\u6ca1\u6709\u5b89\u88c5 dogtail \u7684\u60c5\u51b5\u4e0b\uff0c\u4e5f\u80fd\u4f7f\u7528 sniff \u5de5\u5177\uff1b fix \u4fee\u590d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e2d\u6ca1\u6709\u5b89\u88c5 AT \u73af\u5883\u6267\u884c uos_ci.py \u62a5\u9519\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11120220919","title":"1.1.1\uff082022/09/19\uff09","text":"new \u65b0\u589e\u6267\u884c\u8fdb\u5ea6\u663e\u793a\uff0c\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u65f6\u65e5\u5fd7\u8f93\u51fa\u5f53\u524d\u8fdb\u5ea6\uff1a[\u5f53\u524d\u6307\u5b9a\u7b2c\u51e0\u6761/\u7528\u4f8b\u603b\u6570]\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u7528\u4f8b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\u6240\u6709\u5931\u8d25\u7528\u4f8b\u7684\u5217\u8868\uff1b \u5173\u95ed\u7ec8\u7aef\u8f93\u51fa\u6355\u83b7\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u65e5\u5fd7\u5feb\u7167\uff1b \u4f18\u5316\u7ec8\u7aef\u8f93\u51fa\u5931\u8d25\u4fe1\u606f\u5197\u957f\u4e3a\u7b80\u8981\u4fe1\u606f\u8f93\u51fa\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u663e\u793a 10 \u4e2a\u6267\u884c\u6700\u6162\u7684\u7528\u4f8b\u5217\u8868\uff0c\u5e76\u8be6\u7ec6\u5217\u51fa\u5404\u4e2a\u9636\u6bb5\u7684\u8017\u65f6\uff1b \u5931\u8d25\u91cd\u8dd1\u7528\u4f8b\u91cd\u8dd1\u4e4b\u524d\u5ef6\u8fdf 1 \u79d2\uff1b \u65b0\u589e\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4ecd\u7136\u5f3a\u5236\u6267\u884c\uff1b \u7528\u4f8b\u6536\u96c6\u65f6\u4ec5\u5728 apps \u76ee\u5f55\u4e0b\u8fdb\u884c\uff0c\u5ffd\u7565 src,setting,public \u76ee\u5f55\uff1b \u65b0\u589e allure \u62a5\u544a\u5907\u4efd\u529f\u80fd\uff0c\u9ed8\u8ba4\u5907\u4efd\u81f3 allure_back \u76ee\u5f55\u4e0b\uff1b manage.py\u65b0\u589e\u53c2\u6570 --lastfailed \u7528\u4e8e\u53ea\u8dd1\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\u7684\u529f\u80fd\uff1b fix \u4fee\u590d\u4e86\u5728\u6ca1\u6709\u6307\u5b9a\u5e94\u7528\u540d\u79f0\u6267\u884c\u65f6\uff0cxml \u62a5\u544a\u751f\u6210\u8def\u5f84\u5f02\u5e38\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 uos_ci.py \u4f20\u5165 timeout \u548c session_timeout \u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11020220916","title":"1.1.0\uff082022/09/16\uff09","text":"new \u65b0\u589ePMS\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u652f\u6301\u591a\u79cd\u6570\u636e\u56de\u586b\u6a21\u5f0f\uff1b \u4f18\u5316\u4e86\u901a\u8fc7\u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u65f6PMS \u722c\u866b\u7684\u6027\u80fd\uff1b \u65b0\u589e .gitmodules \u6587\u4ef6\uff0c\u7528\u4e8e\u6807\u8bb0\u6240\u6709\u5b50\u9879\u76ee\uff0c\u65b9\u4fbf\u7edf\u4e00\u62c9\u53d6\u4ee3\u7801\uff1b env.sh \u9002\u914d\u793e\u533a\u7248\u4e0a\u5b89\u88c5\u81ea\u52a8\u5316\u73af\u5883\uff1b \u589e\u52a0\u6267\u884c\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u9519\u8bef\u7684\u529f\u80fd\uff1b README.md \u589e\u52a0 Wayland \u4e0b\u4f7f\u7528\u3001\u6d4b\u8bd5\u62a5\u544a\u67e5\u770b\u3001\u5e38\u89c1\u95ee\u9898\u7b49\u7684\u6587\u6863\u8bf4\u660e\uff1b \u589e\u52a0\u4e86\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u5bf9 setup\u3001call\u3001teardown \u8fdb\u884c\u65e5\u5fd7\u5206\u6bb5\uff1b fix \u4fee\u590d\u4e86 \u786e\u8ba4\u4fee\u590d \u5217\u6ca1\u5199\u8868\u5934\uff0c\u4f46\u5199\u4e86 fixed-xxx \u6807\u7b7e\uff0c\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u540c\u4e00\u5e94\u7528\u5185\u591a\u4e2a csv \u6587\u4ef6\u4e2d \u786e\u8ba4\u4fee\u590d \u5217\u6709\u7684\u5199\u4e86\uff0c\u6709\u7684\u6ca1\u5199\uff0c\u53ef\u80fd\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 INFO \u65e5\u5fd7\uff0c\u663e\u793a\u4e3a DEBUG \u7684\u95ee\u9898\uff1b\u4fee\u590d\u4e86\u90e8\u5206\u673a\u5668\u4e0a INFO \u65e5\u5fd7\u5185\u5bb9\u663e\u793a\u4e3a\u7ea2\u8272\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\u770b\u4e0d\u5230\u8be6\u7ec6\u4fe1\u606f\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10220220822","title":"1.0.2\uff082022/08/22\uff09","text":"new \u79fb\u9664 loguru\uff0c\u66ff\u6362\u4e3a logging\uff0c\u63a5\u53e3\u4fdd\u6301\u4e0d\u53d8\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u53d7\u5f71\u54cd\uff1b \u9ed8\u8ba4\u5f00\u542f coredump\uff1b fix \u4fee\u590d\u4e86\u4e09\u65b9\u5e93 loguru \u5076\u73b0\u5f02\u5e38\uff0c\u5bfc\u81f4\u7a0b\u5e8f\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7b2c\u4e00\u6b21\u5931\u8d25\u4e0d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10120220812","title":"1.0.1\uff082022/08/12\uff09","text":"new \u65b0\u589e RELEASE.md \u6587\u4ef6\uff0c\u7528\u4e8e\u8bb0\u5f55\u5386\u53f2\u53d1\u5e03\u7248\u672c\u7684\u66f4\u65b0\u5185\u5bb9\uff1b \u517c\u5bb9 Wayland \u6a21\u5f0f\u4e0b\u6267\u884c\u7528\u4f8b\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u7528\u7ba1\u5f53\u524d\u6d4b\u8bd5\u673a\u6267\u884c\u73af\u5883\uff0c\u6846\u67b6\u4f1a\u81ea\u52a8\u6839\u636e\u5f53\u524d\u73af\u5883\u8d70\u4e0d\u540c\u7684\u4ee3\u7801\u903b\u8f91\uff1b \u7531\u4e8e\u9700\u8981\u4fee\u6539 dogtail \u6e90\u4ee3\u7801\uff0c\u56e0\u6b64\u5c06\u4fee\u6539\u540e\u7684\u6e90\u7801\u653e\u5165\u5230\u6838\u5fc3\u5e93\u91cc\u9762 src/depends/dogtail \u540e\u7eed\u7248\u672c\u5c06\u4e0d\u9700\u8981\u5728\u7cfb\u7edf\u4e2d\u5b89\u88c5dogtail\uff1b \u5982\u679c\u5e94\u7528\u5e93\u540c\u6837\u4f7f\u7528\u4e86\u7cfb\u7edf\u5b89\u88c5\u7684 dogtail \u53ef\u80fd\u4f1a\u62a5\u9519\uff0c\u89e3\u51b3\u65b9\u6848\u662f\u5c06\u4ee3\u7801\u4e2d\u7684 import dogtail \u4fee\u6539\u4e3a from src.depends import dogtail ; fix \u91cd\u8dd1\u5931\u8d25\u4e4b\u540e\u624d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff0c\u4fee\u6539\u4e3a\u5931\u8d25\u4e4b\u540e\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":"# Attribution \uff1achengdu Test Team\n# Date \uff1a2021/08/20\n \u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d \u4ed3\u5e93\u5730\u5740\uff1ahttps://gitlabcd.uniontech.com/autotest/cd-desktop-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u65b9\u6848\u6982\u8ff0","text":"\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u667a\u80fd\u8bc6\u522b\u5e94\u7528\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u7528\u4e8e\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u64cd\u4f5c\u8fc7\u7a0b\u4e2d\u7684\u5143\u7d20\u5b9a\u4f4d\u4ee5\u53ca\u5224\u65ad\u7ed3\u679c\u65f6\u7684\u65ad\u8a00\u5904\u7406\uff1b\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\uff0c\u6d4b\u8bd5\u673a\u4e0a\u7684\u753b\u9762\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u5230\u670d\u52a1\u5668\u4e0a\uff0c\u670d\u52a1\u5668\u5bf9\u89c6\u9891\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\u540e\uff0c\u670d\u52a1\u5668\u667a\u80fd\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\u6210\u529f\uff0c\u7136\u540e\u5bf9\u6d4b\u8bd5\u673a\u4e0b\u53d1\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\uff0c\u6d4b\u8bd5\u673a\u63a5\u53d7\u5e76\u6267\u884c\u4e0b\u4e00\u6b65\u64cd\u4f5c\u3002 \u670d\u52a1\u5668\u4e0e\u6d4b\u8bd5\u673a\u4e4b\u95f4\u7684\u94fe\u63a5\uff1a \u670d\u52a1\u5668\u901a\u8fc7 USB \u4e32\u53e3\u8bbe\u5907\uff08USB-HID \u534f\u8bae\uff09\u6a21\u62df\u9f20\u6807\u952e\u76d8\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u64cd\u4f5c\u3002 \u901a\u8fc7\u89c6\u9891\u91c7\u96c6\u8bbe\u5907\u6355\u83b7\u6d4b\u8bd5\u673a\u7684\u5b9e\u65f6\u753b\u9762\u4f20\u8f93\u7ed9\u670d\u52a1\u5668\u3002 \u670d\u52a1\u5668\u5bf9\u91c7\u96c6\u7684\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\uff0c\u8bc6\u522b\u5176\u4e2d\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5e76\u8fd4\u56de\u5143\u7d20\u63a7\u4ef6\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\uff0c\u670d\u52a1\u5668\u901a\u8fc7\u667a\u80fd\u5316\u5206\u6790\uff0c\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e00\u81f4\u5c06\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\u901a\u8fc7\u4e32\u53e3\u6a21\u62df\u952e\u9f20\u4fe1\u53f7\u53d1\u9001\u7ed9\u6d4b\u8bd5\u673a\uff1b\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e0d\u4e00\u81f4\u5c06\u4f1a\u8fdb\u5165\u4e2d\u65ad\u5904\u7406\u53ca\u5f02\u5e38\u7ed3\u679c\u8f93\u51fa\uff0c\u7ee7\u7eed\u6267\u884c\u540e\u7eed\u573a\u666f\uff0c\u76f4\u81f3\u6240\u6709\u7528\u4f8b\u6d4b\u8bd5\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u6df1\u5ea6\u5b66\u4e60\u73af\u5883\u642d\u5efa","text":"\u6a21\u578b\u8bad\u7ec3\u4e3b\u8981\u5bf9 GPU \u6709\u8981\u6c42\uff0c\u8bad\u7ec3\u6a21\u578b\u7684\u673a\u5668\u663e\u5b58\u4e0d\u4f4e\u4e8e 6G\uff0c\u5176\u4ed6\u914d\u7f6e\u65e0\u7279\u6b8a\u8981\u6c42\u3002 \u63a8\u8350\u6027\u4ef7\u6bd4\u8f83\u9ad8\u914d\u7f6e \u64cd\u4f5c\u7cfb\u7edf: UnionTech OS Desktop 20 Professional Linux version 4.19.0-desktop-amd64 (deepin@deepin-PC) (Uos 8.3.0.3-3+rebuild) \u5904\u7406\u5668: Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz (\u516b\u6838 / \u5341\u516d\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460M-HDV(RD)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))/8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: TU116 [GeForce GTX 1660]\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u865a\u62df\u73af\u5883\u5b89\u88c5","text":"cd ~\nwget -c https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh\nbash Miniconda3-latest-Linux-x86_64.sh\n \u4e00\u8def\u56de\u8f66 \u7b2c\u4e00\u6b21\u63d0\u793a\u8f93\u5165 yes/no \uff1a\u8f93\u5165 yes \u7ee7\u7eed\u4e00\u8def\u56de\u8f66 \u7b2c\u4e8c\u6b21\u63d0\u793a\uff1a\u8f93\u5165 no cd ~/miniconda3/bin\nsudo chmod 777 activate\n \u6fc0\u6d3bconda\u73af\u5883 . ./activate\n \u6dfb\u52a0\u516c\u53f8\u5185\u7f51\u6e90 conda config --add channels bioconda\nconda config --add channels conda-forge\n \u5982\u679c\u662f\u5916\u7f51\u6dfb\u52a0\u5916\u7f51\u6e90 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/\n \u5982\u679c\u8981\u5220\u9664\u6e90 conda config --remove-key channels\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"2\u3001\u5b89\u88c5\u4f9d\u8d56","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u521b\u5efa\u865a\u62df\u73af\u5883","text":"conda remove --name mmlab --all # \u79fb\u9664\u6240\u6709\u865a\u62df\u73af\u5883\n conda create -n mmlab python=3.7\n conda activate mmlab\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-pytorch","title":"\uff082\uff09\u5b89\u88c5 Pytorch","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install torch==1.7.0+cu101 torchvision==0.8.1+cu101 torchaudio==0.7.0 -f https://download.pytorch.org/whl/torch_stable.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-mmcv","title":"\uff083\uff09\u5b89\u88c5 MMCV","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install mmcv-full==1.3.3 -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.7.0/index.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"\uff084\uff09\u5b89\u88c5\u663e\u5361\u9a71\u52a8","text":"\u6839\u636e\u4f60\u7684\u663e\u5361\u4e0b\u8f7d\u5bf9\u5e94\u9a71\u52a8\uff0c\u6bd4\u5982\u6211\u7684\u663e\u5361\u4e3a GTX1660\uff0c\u9a71\u52a8\u7248\u672c\u4e3a 430\uff0c\u9a71\u52a8\u4e0b\u8f7d\u5730\u5740\uff1ahttps://www.nvidia.cn/Download/Find.aspx?lang=cn CTRL+ALT+F2 \u8fdb\u5165tty\n \u7981\u7528 nouveau \u9a71\u52a8 sudo vim /etc/modprobe.d/blacklist-nouveau.conf\n \u586b\u5165\uff1a blacklist nouveau options nouveau modeset=0\n \u5237\u65b0\u914d\u7f6e\u6587\u4ef6 sudo update-initramfs -u reboot \u91cd\u542f\u540e\u518d\u8fdb\u5165 tty \u5173\u95ed\u56fe\u50cf\u754c\u9762\uff0c\u8f93\u5165\u547d\u4ee4\u5173\u95ed\u56fe\u50cf\u754c\u9762 sudo service lightdm stop\n \u5b89\u88c5\u9a71\u52a8 sudo chmod a+x NVIDIA-Linux-x86_64-430.run\nsudo ./NVIDIA-Linux-x86_64-430.run\n reboot\u91cd\u542f\uff0cnvidia-smi\u67e5\u770b\u5b89\u88c5\u72b6\u6001\u3002\u6ce8\u610f\u770b\u4e0bcuda\u7248\u672c\uff0c10.1\uff0cdriver\u7248\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u6570\u636e\u6807\u6ce8","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u6570\u636e\u6807\u6ce8","text":"\u6807\u6ce8\u4e4b\u524d\u9700\u8981\u5148\u8f6c\u6362\u56fe\u7247\u5927\u5c0f\uff0c\u5e76\u4e14\u4ee5\u6570\u5b57\u547d\u540d\uff0c\u6bcf\u7ec4\u547d\u540d\u9012\u589e"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"\uff081\uff09\u8f6c\u6362\u5927\u5c0f\u5e76\u91cd\u547d\u540d","text":"rename_pic.py import os\nimport sys\nimport cv2\nimport time\nimport getpass\nusername = getpass.getuser()\nsource_path = f\"/home/{username}/Desktop/right_menu\" # \u56fe\u7247\u8def\u5f84\nsource_dest = os.path.join('/'.join(source_path.split(\"/\")[:-1]), 'tmp')\nif not os.path.exists(source_dest):\nos.mkdir(source_dest)\nstart_name = sys.argv[1]\nfile_name_list = list()\nfor file in os.listdir(source_path):\nif file.endswith('.png'):\nfile_name_list.append(file)\nstart_name = int(start_name)\nfor file in file_name_list:\nos.rename(os.path.join(source_path,file), os.path.join(source_path, f\"{str(start_name)}.png\"))\nstart_name += 1\ntime.sleep(1)\nfor file in os.listdir(source_path):\nimage = os.path.join(source_path, str(file))\nsrc = cv2.imread(image)\nresult = cv2.resize(src, (960, 540))\nresizeImage = os.path.join(source_dest, str(file))\nprint(resizeImage)\ncv2.imwrite(str(resizeImage), result)\ncv2.waitKey(0)\ncv2.destroyAllWindows()\ntime.sleep(1)\nos.system(f'rm -rf {source_path}/*')\nos.system(f'mv {source_dest}/* {source_path}')\nos.system(f'rm -rf {source_dest}')\nprint(\"\u4e0b\u4e00\u4e2a\u5e8f\u53f7\uff1a\", start_name)\n \u6839\u636e\u7ec8\u7aef\u8f93\u51fa\u7684\u4e0b\u4e00\u4e2a\u5e8f\u53f7\u7684\u63d0\u793a\uff0c\u6267\u884c Python \u6587\u4ef6\u7684\u65f6\u5019\u4f20\u53c2\u3002 python rename_pic.py 249\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"\uff082\uff09\u5de5\u5177\u6807\u6ce8","text":"\u4f7f\u7528\u5de5\u5177 labelImg \u6807\u6ce8 sudo pip3 install PyQt5==5.13\nsudo pip3 install labelImg\n \u7ec8\u7aef\u76f4\u63a5\u8f93\u5165 labelImg\uff0c\u56de\u8f66 \u6807\u6ce8\u6a21\u5f0f\u9009\u62e9\uff1aPascalVOC"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u667a\u80fd\u6807\u6ce8","text":"\u6253\u5f00\u5c4f\u5e55\u5f55\u5236\u8f6f\u4ef6\uff0c\u5f55\u5236\u624b\u52a8\u64cd\u4f5c\u4e00\u6b21\u6d4b\u8bd5\u7528\u4f8b\uff0c\u7136\u540e\u5c06\u5f55\u5236\u7684\u89c6\u9891\u8fdb\u884c\u5206\u5e27\uff0c\u7136\u540e\u5bf9\u6bd4\u524d\u4e24\u5e27\u56fe\u6807\u76f8\u4f3c\u5ea6\uff0c\u5254\u9664\u76f8\u4f3c\u5ea6\u8fc7\u9ad8\u7684\u56fe\u7247\uff0c\u5728\u4fdd\u8bc1\u7d20\u6750\u591a\u6837\u6027\u7684\u524d\u63d0\u4e0b\uff0c\u5254\u9664\u91cd\u590d\u591a\u4f59\u7684\u56fe\u7247\u751f\u6210\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u96c6\uff0c\u7136\u540e\u53d6\u51fa\u63a7\u4ef6\u6a21\u677f\u6570\u636e\u96c6\uff0c\u901a\u8fc7 OpenCV \u6a21\u677f\u5339\u914d\u83b7\u53d6\u63a7\u4ef6\u5728\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u56fe\u7247\u4e2d\u6240\u5728\u7684\u5de6\u4e0a\u3001\u5de6\u4e0b\u3001\u53f3\u4e0a\u3001\u53f3\u4e0b\u56db\u5904\u5750\u6807\uff0c\u4ece\u800c\u6839\u636e\u6a21\u677f\u6570\u636e\u96c6\u751f\u6210\u6807\u6ce8\u6570\u636e\u3002\u53c2\u8003\u76ee\u5f55 AnnotationMaterial"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"\uff081\uff09\u6a21\u677f\u6570\u636e\u96c6\u51c6\u5907","text":"1\u3001\u5728\u754c\u9762\u622a\u53d6\u9700\u8981\u6807\u6ce8\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u653e\u5728\u76ee\u5f55\u4e0b AnnotationMaterial/template/img 2\u3001\u7ef4\u62a4\u63a7\u4ef6\u540d\u4e0e\u5143\u7d20\u63a7\u4ef6\u7684\u952e\u5bf9\uff0c\u4e00\u4e2a\u63a7\u4ef6\u540d\u53ef\u5bf9\u5e94\u591a\u4e2a\u5143\u7d20\u63a7\u4ef6 menu:\n- menu.jpg\n- menu1.jpg\n- menu2.jpg\n- menu3.jpg\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"\uff082\uff09\u7d20\u6750\u96c6\u51c6\u5907","text":"\u5f55\u5236\u89c6\u9891\u6216\u6216\u5c4f\u5e55\u622a\u56fe\u653e\u7f6e\u76ee\u5f55 AnnotationMaterial/source"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u5f00\u59cb\u6807\u6ce8","text":"python3 AnnotationMaterial/main.py\n \u751f\u6210\u7684\u6807\u6ce8\u6570\u636e\u5b58\u653e\u5728 AnnotationMaterial/result"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#mmdetection","title":"\u56db\u3001MMDetection","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1-mmdetection","title":"1\u3001 MMDetection \u4ee3\u7801","text":"MMDetection \u662f\u4e00\u4e2a\u6709\u540d\u7684\u6df1\u5ea6\u5b66\u4e60\u76ee\u6807\u68c0\u6d4b\u5f00\u6e90\u9879\u76ee\uff0c\u4e5f\u662f openMMlab \u7684\u62db\u724c\u9879\u76ee\uff0c\u4e3a\u4ec0\u4e48\u9009\u62e9\u5b83\uff0c\u5c0f\u5b69\u513f\u6ca1\u5a18\u8bf4\u6765\u8bdd\u957f\uff0c\u611f\u5174\u8da3\u53ef\u4ee5\u81ea\u884c\u6df1\u5165\u4e86\u89e3\uff1b \u4f60\u53ef\u4ee5\u76f4\u63a5\u5728 GitHub \u4e0a\u514b\u9686\u4ee3\u7801\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u54b1\u4eec\u4ed3\u5e93\u4e0b Train \u76ee\u5f55\u4e2d\u4ee3\u7801\uff0cTrain \u4e2d\u7684\u4ee3\u7801\u4e5f\u662f\u4ece GitHub \u4e0a\u62c9\u53d6\u7684\uff0c\u4e0d\u8fc7\u6211\u4eec\u6839\u636e\u9879\u76ee\u9700\u8981\u505a\u4e86\u4e00\u4e9b\u4e8c\u6b21\u5f00\u53d1\uff0c\u63a8\u8350\u76f4\u63a5\u4f7f\u7528\u5b83\u3002 \u5982\u679c\u4f60\u60f3\u4ece GitHub \u4e0a\u62c9\uff1a git clone https://github.com/open-mmlab/mmdetection.git\n# \u4e0d\u80fd\u76f4\u63a5\u62c9\u53d6\u4e3b\u5206\u652f\uff0c\u5efa\u8bae\u4f7f\u75282.12\u7248\u672c\uff0c\u4e0d\u540c\u7684\u7248\u672c\u5bf9\u5e94\u7684mmcv\u7248\u672c\u662f\u4e0d\u540c\u7684\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-voc2coco","title":"2\u3001\u62c9\u53d6 voc2coco \u4ee3\u7801","text":"git clone https://github.com/Tony607/voc2coco.git\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-coco","title":"3\u3001\u8f6c\u6362 coco \u6570\u636e\u96c6","text":"\u5c06\u6240\u6709\u7684\u56fe\u7247\u548cxml\u6587\u4ef6\u653e\u5165train2017\uff0c\u4ece\u4e2d\u6311\u9009\u51e0\u7ec4\u653e\u5165val2017\uff08\u6d4b\u8bd5\u96c6\uff09 cd mmdetection/data/coco\npython voc2coco.py train2017 annotations/instances_train2017.json\npython voc2coco.py val2017 annotations/instances_val2017.json\n \u751f\u6210json\u6587\u4ef6"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4_1","title":"4\u3001\u4fee\u6539\u914d\u7f6e","text":"\uff081\uff09\u8bfb\u53d6\u6a21\u578b\u540d\u79f0 import json\nmodule_name = []\nwith open('./instances_train2017.json', \"r+\") as f:\njson_file = f.read()\njson_dict = json.loads(json_file)\nmodule_list = json_dict.get('categories')\nfor module_info in module_list:\nname = module_info.get('name')\nmodule_name.append(name)\nprint(module_name)\nprint(\"module_num:\", len(module_name))\n # \u6ce8\u610f\u5bf9\u6bd4instances_train2017.json\u91cc\u9762\u6a21\u578b\u540d\u79f0\u7684\u987a\u5e8f\uff0c\u4e0eCLASSES\u548ccoco_classes\u91cc\u9762\u7684\u987a\u5e8f\u4fdd\u6301\u4e00\u81f4\u3002\n \uff082\uff09\u4fee\u6539 faster_rcnn_r101_2x_coco.py mmdetection/xianjin/faster_rcnn_r101_2x_coco.py \u4fee\u653946\u884c\uff0cnum_clasess\u7684\u503c\uff0c\u65b0\u589e1\u4e2a\uff0c\u5c31 +1\uff1b \uff083\uff09\u4fee\u6539 coco.py mmdetection/mmdet/datasets/coco.py CLASSES = ()\uff0c\u5728\u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b \uff084\uff09\u4fee\u6539 class_names.py mmdetection/mmdet/core/evaluation/class_names.py coco_classes \u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#5","title":"5\u3001\u7f13\u5b58\u6e05\u7406","text":"\u5220\u9664 mmdetection/build \u76ee\u5f55 python setup.py install\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#6","title":"6\u3001\u8bad\u7ec3\u6a21\u578b","text":"\uff081\uff09\u6307\u5b9a\u81ea\u5df1\u914d\u7f6e\u7684\u8bad\u7ec3\u6a21\u578b\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py --gpus 1\n \uff082\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u6d4b\u8bd5\u96c6\u7ed3\u679c\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py xianjin/epoch_24.pth --show\n \uff083\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u51c6\u786e\u5ea6\uff1b python tools/analysis_tools/analyze_logs.py plot_curve xianjin/20210530_011907.log.json --keys acc\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#7","title":"7\u3001\u5feb\u6377\u64cd\u4f5c","text":"python3 run.py\n \u5c06\u4ee5\u4e0a 4 - 7 \u6b65\u64cd\u4f5c\u6574\u5408\u6210 run.py\uff0c\u4e00\u952e\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u4e94\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\uff1b \u670d\u52a1\u7aef\u4e00\u53f0\uff08\u76ee\u524d\u4ec5\u652f\u6301AMD\u67b6\u6784\uff09\uff1b \u91c7\u96c6\u76d2\u4e00\u4e2a \uff08ACASIS hdmi\u89c6\u9891\u91c7\u96c6\u5361\uff0chttps://item.jd.com/10024310742602.html \uff09\uff1b USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\uff1b USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff1b \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5USB\u5ef6\u957f\u7ebf\uff1b \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u63a8\u8350\u914d\u7f6e","text":"\u6267\u884c\u7528\u4f8b\u7684\u670d\u52a1\u7aef\u5bf9\u914d\u7f6e\u6ca1\u6709\u7279\u6b8a\u8981\u6c42\uff0c\u5982\u679c\u6761\u4ef6\u5141\u8bb8\u914d\u7f6e\u8d8a\u9ad8\uff0c\u8bc6\u522b\u901f\u5ea6\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n \u6d4b\u8bd5\u673a\u4e0a\u4e0d\u6267\u884c\u4efb\u4f55\u811a\u672c\uff0c\u5177\u4f53\u914d\u7f6e\u6839\u636e\u6d4b\u8bd5\u9700\u8981\u51b3\u5b9a\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#usb_mk","title":"\u516d\u3001USB_MK\u4e32\u53e3\u9a71\u52a8\u65b9\u6cd5","text":"\u4f4d\u4e8econtrol_method\u76ee\u5f55\u4e0b\u7684usb_mk.py\u6587\u4ef6 \uff081\uff09\u5217\u51fa\u53ef\u901a\u4fe1\u7684\u7aef\u53e3 python3 -m serial.tools.list_ports -v\n \uff082\uff09\u4fee\u6539\u4e32\u53e3\u7684\u6743\u9650 sudo chmod 777 /dev/ttyACM0\n \uff083\uff09\u5b9e\u4f8b\u5316USB_MK import UsbMk\nusb_mk = UsbMk(\"/dev/ttyACM0\", 9600) # \u8bbe\u5907\u9ed8\u8ba49600\u4e3a\u6ce2\u7279\u7387\uff0c\u63a7\u5236\u4f20\u8f93\u901f\u7387\n \uff084\uff09USB\u4e32\u53e3\u8bbe\u5907\u9ed8\u8ba4\u6ce2\u7279\u7387\u4e3a9600\uff08\u7ecf\u6d4b\u8bd5\u6ce2\u7279\u73879600\u51c6\u786e\u6027\u6700\u597d\uff09\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up() # \u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u6c49\u5b57\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e\n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff083\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff084\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff085\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() # \u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2\n \uff086\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff087\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff088\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e03\u3001\u65b9\u6cd5\u8c03\u7528\u5165\u53c2\u89c4\u5219","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_7","title":"1\u3001\u57fa\u7c7b","text":"class Base:\ndef __init__(self):\nself._obj = image\nself._usb = usb_mk\ndef find_element_by_ai(self, element):\nreturn self._obj.find_element(element)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_6","title":"2\u3001\u5165\u53c2\u8bf4\u660e","text":"\u56fe\u50cf\u8bc6\u522b\u65b9\u6cd5\u5165\u53e3\u4e3a Base \u7c7b\u4e0b\u7684 find_element_by_ai \u3002\u4ec5\u63a5\u53d7\u4e00\u4e2a\u53c2\u6570 element\uff0c\u7c7b\u578b\u4e3a string\u3002 \u53ef\u8bc6\u522b\u7684 string \u683c\u5f0f\uff1a \uff081\uff09\u5927\u56fe\u6807\uff08 \u56fe\u6807\u5927\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\uff0c\u4f8b\uff1a Base().find_element_by_ai(\"window\")\n \uff082\uff09\u5927\u56fe\u6807 / \u5c0f\u56fe\u6807\uff08\u56fe\u6807\u5c0f\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5c0f\u56fe\u6807\uff0c\u4f8b\uff1awindow/search_btn Base().find_element_by_ai(\"window/search_btn\")\n \uff083\uff09\u5927\u56fe\u6807 / OCR\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\u5185\u7684\u6587\u5b57\uff0c\u4f8b\uff1amenu/\u5c5e\u6027 Base().find_element_by_ai(\"menu/\u5c5e\u6027\")\n \uff084\uff09OCR\uff1a\u5168\u5c4f\u8bc6\u522b\u6587\u5b57 Base().find_element_by_ai(\"\u641c\u7d22\")\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516b\u3001\u9690\u85cf\u9f20\u6807","text":"\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u8fc7\u6765\u7684\u89c6\u9891\u6d41\uff0c\u5728\u8bc6\u522b\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u53d7\u5230\u9f20\u6807\u5f71\u54cd\uff0c\u56e0\u6b64\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u9690\u85cf\u9f20\u6807\u3002 \u5c4f\u853d\u9f20\u6807\u5149\u6807\u663e\u793a ```shell script /etc/lightdm/lightdm.conf \u5728`[Seat:*]`\u4e0b\u9762\u6dfb\u52a0\u53c2\u6570\n```shell script\nxserver-command=X -bs -core -nocursor\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e5d\u3001\u667a\u80fd\u81ea\u52a8\u5316\u7684\u610f\u4e49","text":"1\u3001\u6539\u5584 Acessibility \u5b9a\u4f4d\u7684\u7a33\u5b9a\u6027\u95ee\u9898 Acessibility \u5c5e\u6027\u5b9a\u4f4d\u5b58\u5728\u5076\u5c14\u5931\u6548\u7684\u60c5\u51b5 \uff081\uff09\u5f00\u53d1\u5728\u505a\u65b0\u9700\u6c42\u5f00\u53d1\u65f6\u53ef\u80fd\u6d89\u53ca\u5230\u5bf9\u5c5e\u6027\u6807\u7b7e\u7684\u4fee\u6539\u6216\u8005\u5c42\u7ea7\u7684\u8c03\u6574\uff0c\u53ef\u80fd\u9020\u6210\u81ea\u52a8\u5316\u7528\u4f8b\u65e0\u6cd5\u5b9a\u4f4d\u5230\u5143\u7d20\u3002 \u6bd4\u59821040\u9636\u6bb5\uff0c\u97f3\u4e50\u91cd\u6784\u7684\u65f6\u5019\uff0c\u5f00\u53d1\u5bf9\u90e8\u5206\u5c5e\u6027\u548c\u5c42\u7ea7\u505a\u4e86\u4fee\u6539\uff0c\u5bfc\u81f4\u81ea\u52a8\u5316\u7528\u4f8b\u5b9a\u4f4d\u65b9\u6cd580%\u9700\u8981\u4fee\u6539\u3002 \u5f00\u53d1\u65b0\u529f\u80fd\u7684\u65f6\u5019\u5076\u5c14\u4e5f\u4f1a\u5bf9\u5c5e\u6027\u505a\u8c03\u6574\uff0c\u9047\u52305\u6b21\u3002 \uff082\uff09\u76ee\u524d\u4e3b\u8981\u4f7f\u7528Dogtail\u8bc6\u522b\u5e94\u7528Acessibility\u5c5e\u6027\u8fdb\u884c\u5b9a\u4f4d\uff0c\u662f\u83b7\u53d6\u5e94\u7528\u5f53\u524d\u754c\u9762\u7684\u5c5e\u6027tree\uff0c\u5728\u5e94\u7528\u8df3\u8f6c\u540e\uff0cDogtail\u5b58\u5728\u65e0\u6cd5\u53ca\u65f6\u83b7\u53d6\u5f53\u524d\u5c5e\u6027\u5217\u8868\u7684\u60c5\u51b5\u3002 \u591a\u5a92\u4f53\u8c03\u7528\u6587\u7ba1\u7a97\u53e3\u7684\u65f6\u5019\uff0c\u51fa\u73b0\u627e\u4e0d\u5230\u6587\u7ba1\u91cc\u9762\u5143\u7d20\u7684\u60c5\u51b5\uff0c\u76ee\u524d\u51fa\u73b010+\u6b21\u3002 \u5e94\u7528\u8bbe\u7f6e\u9875\u9762\u7684\u5c5e\u6027\u5076\u5c14\u5b58\u5728\u627e\u4e0d\u5230\u7684\u60c5\u51b5\uff0c\u9047\u52305\u6b21\u3002 \uff083\uff09Dogtail\u5de5\u5177\u672c\u8eab\u5b58\u5728\u95ee\u9898\uff0c\u6709\u65f6\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u5019\u5f88\u6162\uff0c\u8ba9\u4eba\u65e0\u6cd5\u63a5\u53d7\uff0c\u76ee\u524d\u51fa\u73b0\u8fc7\u5f88\u591a\u6b21\u3002 \u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u95f4\u6bd4\u5e73\u5e38\u61623\u500d\uff0c\u51fa\u73b04\u6b21\u3002 2\u3001\u89e3\u51b3\u4e86\u4f7f\u7528\u7edd\u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898 \u90e8\u5206\u63a7\u4ef6\u65e0\u6cd5\u6dfb\u52a0 Acessibility \u5c5e\u6027\u4ece\u800c\u4f7f\u7528\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u51fa\u73b0\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898\u3002 \uff081\uff09\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u65b9\u6cd5\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u76ee\u6807\u56fe\u7247\u8d44\u6e90\uff0c\u5728 UI \u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u4f1a\u6d89\u53ca\u5230\u76ee\u6807\u8d44\u6e90\u7684\u66ff\u6362\uff0c\u6bd4\u8f83\u8017\u8d39\u4eba\u529b\u3002 \uff082\uff09\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6cd5\u5bf9\u6bd4\u7cbe\u5ea6\u6bd4\u8f83\u641e\uff0c\u5982\u679cUI \u7684\u53d8\u66f4\u4f1a\u9020\u6210\u65e0\u6cd5\u51c6\u786e\u5b9a\u4f4d\u5230\uff0c\u81ea\u52a8\u5316\u811a\u672c\u5065\u58ee\u6027\u4e0d\u8db3\u3002 3\u3001\u4f7f\u7528\u673a\u5668\u5206\u79bb\uff0c\u89e3\u51b3\u4e86\u81ea\u52a8\u5316\u811a\u672c\u5bf9\u5e94\u7528\u7684\u5f71\u54cd\uff0c\u771f\u5b9e\u8fd8\u539f\u7528\u6237\u7684\u4f7f\u7528\u573a\u666f \u673a\u5668\u5206\u79bb\u7684\u67b6\u6784\u8bbe\u8ba1\uff0c\u4fdd\u8bc1\u4e86\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u73af\u5883\u5b8c\u5168\u7b49\u540c\u4e8e\u7528\u6237\uff0c\u6392\u9664\u6d4b\u8bd5\u811a\u672c\u7684\u5f71\u54cd\u3002 \uff081\uff09\u76ee\u524d\u7684\u529f\u80fd\u81ea\u52a8\u5316\u662f\u5728\u6d4b\u8bd5\u673a\u4e0a\u76f4\u63a5\u8fd0\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\uff0c\u52a0\u4e0a\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u6211\u4eec\u6dfb\u52a0\u4e86\u4e00\u4e9b\u8fdb\u7a0b\u76d1\u63a7\u3001\u89c6\u9891\u5f55\u5236\u7b49\u529f\u80fd\uff0c\u81ea\u52a8\u5316\u811a\u672c\u672c\u8eab\u4f1a\u6d88\u8017\u4e00\u4e9b\u7cfb\u7edf\u8d44\u6e90\uff0c\u65e0\u6cd5\u8fd8\u539f\u771f\u662f\u7684\u7528\u6237\u4f7f\u7528\u573a\u666f\u3002 \uff082\uff09\u6027\u80fd\u6d4b\u8bd5\u9700\u8981\u6392\u9664\u5176\u4ed6\u7a0b\u5e8f\u7684\u8d44\u6e90\u6d88\u8017\u5f71\u54cd\uff0c\u6027\u80fd\u81ea\u52a8\u5316\u91c7\u7528\u673a\u5668\u5206\u79bb\uff0c\u4fdd\u8bc1\u4e86\u6027\u80fd\u6570\u636e\u7684\u51c6\u786e\u6027\u3002 \u4ee5\u524d\u7684\u7528\u4f8b\u6267\u884c\u8017\u65f6\u6ca1\u6761\u572830\u79d2\u5de6\u53f3\uff0c\u73b0\u5728\u7528\u4f8b\u8017\u65f6\u572810\u79d2\u3002 4\u3001\u89e3\u51b3\u4e86UI \u8c03\u6574\u5bfc\u81f4\u5b9a\u4f4d\u5931\u8d25\u7684\u4e0d\u7a33\u5b9a\u6027\u95ee\u9898 \uff081\uff09\u89e3\u51b3\u4e86\u56e0 UI \u8c03\u6574\u5bfc\u81f4\u63a7\u4ef6\u4f4d\u7f6e\u53d8\u5316\u6216\u8272\u5dee\u53d8\u5316\u540e\u5b9a\u4f4d\u4e0d\u51c6\u786e\u7684\u95ee\u9898\uff0c\u53ea\u8981\u63a7\u4ef6\u6587\u6848\u548c\u63a7\u4ef6\u5916\u8fb9\u6846\u65e0\u53d8\u5316\u5747\u53ef\u51c6\u786e\u5b9a\u4f4d\uff1b \uff082\uff09\u76ee\u524d\u4e5f\u4f1a\u91c7\u7528\u57fa\u4e8eUI\u7684\u5b9a\u4f4d\u65b9\u6848\uff0c\u5982\u679cUI\u4f4d\u7f6e\u6709\u8c03\u6574\uff0c\u4f1a\u5bfc\u81f4\u5143\u7d20\u65e0\u6cd5\u5b9a\u4f4d\u3002 5\u3001\u7b80\u5316\u4e86\u7528\u4f8b\u7ed3\u6784\uff0c\u63d0\u5347\u7f16\u5199\u53cb\u597d\u5ea6 \uff081\uff09\u667a\u80fd\u81ea\u52a8\u5316\u8bc6\u522b\u5143\u7d20\u7684\u65b9\u6cd5\u53ea\u6709\u4e00\u4e2a\uff0c\u5c31\u662f\u57fa\u4e8e\u6211\u4eec\u8bad\u7ec3\u7684\u6a21\u578b\u8bc6\u522b\u89c6\u9891\u6d41\u4e2d\u7684\u5143\u7d20\uff0c\u7ecf\u8fc7\u811a\u672c\u5c01\u88c5\u4e4b\u540e\uff0c\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u4e2d\u6240\u6709\u5b9a\u4f4d\u7684\u64cd\u4f5c\u90fd\u53ea\u9700\u8981\u8c03\u7528\u8fd9\u4e00\u4e2a\u65b9\u6cd5\u5c31\u884c\u4e86\uff0c\u7f16\u5199\u81ea\u52a8\u5316\u811a\u672c\u7684\u96be\u5ea6\u5927\u5927\u964d\u4f4e\u3002 \uff082\uff09\u4e5f\u662f\u7531\u4e8e\u8c03\u7528\u65b9\u6cd5\u7b80\u5355\uff0c\u5728 UI \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u4e2d\u7684\u5206\u5c42\u7ed3\u6784\u5c06\u4f1a\u51cf\u5c11\uff0c\u591a\u7ee7\u627f\u7684\u60c5\u51b5\u4f1a\u51cf\u5c11\uff0c\u81ea\u52a8\u5316\u4ee3\u7801\u7684\u8c03\u7528\u7ed3\u6784\u4e5f\u4f1a\u53d8\u5f97\u7b80\u5355\uff0c\u800c\u4e14\u529f\u80fd\u6d4b\u8bd5\u540c\u5b66\u7f16\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u66f4\u52a0\u5bb9\u6613\u4e0a\u624b\u3002 \u4ee5\u524d\u5199\u7528\u4f8b\u7531\u4e8e\u9700\u8981\u7ed3\u5408\u4e0d\u540c\u7684\u6a21\u5757\uff0c\u8c03\u7528\u4e0d\u540c\u7684\u65b9\u6cd5\uff0c\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u5e76\u5b8c\u6210\u8c03\u8bd5\u7684\u65f6\u95f4\u5e73\u5747\u572820-30\u5206\u949f\uff0c\u73b0\u5728\u5199\u7528\u4f8b\u811a\u672c\u80fd\u57285\u5206\u949f\u5de6\u53f3\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":"# =============================================\n# Attribution : Application Test Department III\n# Time : 2023/1/3\n# Author : ut003281\n# =============================================\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u7b80\u8ff0","text":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5 \u901a\u8fc7\u81ea\u52a8\u5316\u624b\u6bb5\u5bf9\u5e94\u7528\u8fdb\u884c\u6027\u80fd\u6d4b\u8bd5\uff0c\u63d0\u4f9b\u65b9\u4fbf\u7684\u73af\u5883\u90e8\u7f72\u3001\u8fd0\u884c\u914d\u7f6e\u3001\u7528\u4f8b\u7f16\u5199\u7b49\uff0c\u7528\u4e8e\u684c\u9762\u5e94\u7528\u7684\u51b7\u70ed\u542f\u52a8\u3001\u8d44\u6e90\u62f7\u8d1d\u3001\u9875\u9762\u8df3\u8f6c\u7b49\u6027\u80fd\u573a\u666f\u6d4b\u8bd5\u3002 \u4ed3\u5e93\u5730\u5740\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-perf-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u4ee3\u7801\u7ed3\u6784","text":"autotest-perf-aitest\n\u251c\u2500\u2500 apps # \u5b58\u653e\u6240\u6709\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u811a\u672c\n\u251c\u2500\u2500 conftest.py # pytest hook\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 CURRENT # \u7248\u672c\u5185\u5bb9\n\u251c\u2500\u2500 docs # \u6587\u6863\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u952e\u503c\u5bf9\u7167\u8868.pdf # \u4e32\u53e3\u7ebfcode\u4e0e\u6309\u952e\u7684\u5bf9\u7167\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u6027\u80fd\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\u6267\u884c\u5668\u4f7f\u7528\u6307\u5357.md # \u6267\u884c\u5668\u811a\u672c\u4f7f\u7528\u6307\u5357\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 USB\u4e32\u53e3\u8f6cUSB\u952e\u76d8\u9f20\u6807\u7ebf\u534f\u8bae\u6587\u4ef6V1.0.pdf # \u4e32\u53e3\u534f\u8bae\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput-0.28.2.zip # Linux\u4e0b\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\u7684\u6e90\u7801\uff0c\u53ef\u6839\u636e\u67b6\u6784\u6253\u5305\n\u251c\u2500\u2500 manage.py # \u529f\u80fd\u4e3b\u5165\u53e3\n\u251c\u2500\u2500 pytest.ini # pytst \u914d\u7f6e\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 setting # \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 client.ini # \u6d4b\u8bd5\u673a IP \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5168\u5c40\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dev_env.sh # \u5bbf\u4e3b\u673a\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose_no_relay.yml # \u65e0\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose.yml # \u6709\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker_login.sh # docker \u767b\u9646\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 res\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 black.png # \u5168\u9ed1\u56fe\u7247\uff0c\u7528\u4e8e\u4fee\u6539\u58c1\u7eb8\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_5000.deb # 3A5000 \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_amd64.deb # amd \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_arm64.deb # arm \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_mips64.deb # mips \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_sw_64.deb # sw \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 server.ini # \u670d\u52a1\u5668\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 setup.sh # \u5bb9\u5668\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 template # \u521b\u5efa app \u57fa\u7840\u811a\u672c\u6a21\u677f\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 app_template\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ${app_name}_widget.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 control-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 images\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 test_${app_name}_01_scene.json-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 test_${app_name}_01_scene.py-tpl\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 uos_docker # \u5bb9\u5668\u73af\u5883\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dockerfile\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 requirements.txt\n\u2514\u2500\u2500 src\n \u251c\u2500\u2500 analysis_save.py # \u89e3\u6790\u56fe\u7247\u6d41\u7ed3\u679c\uff0c\u6c47\u603b\u751f\u6210 excel \u62a5\u544a\n\u251c\u2500\u2500 base_widget.py # \u5c01\u88c5\u7684\u57fa\u7840\u64cd\u4f5c\uff0c\u5e94\u7528\u8c03\u7528\u7684\u4e3b\u5165\u53e3\u65b9\u6cd5\n\u251c\u2500\u2500 cmdctl.py # \u8c03\u7528\u547d\u4ee4\u884c\u4f7f\u7528\n\u251c\u2500\u2500 global_value.py # \u5168\u5c40\u53d8\u91cf\n\u251c\u2500\u2500 image_utils.py # \u56fe\u7247\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 __init__.py\n \u251c\u2500\u2500 logger_utils.py # \u65e5\u5fd7\u914d\u7f6e\n\u251c\u2500\u2500 pdocr.py # ocr \u914d\u7f6e\n\u251c\u2500\u2500 public_method.py # \u4e00\u4e9b\u65b9\u4fbf\u7684\u5c01\u4f4f\n\u251c\u2500\u2500 record.py # \u5f55\u5c4f\u76f8\u5173\n\u251c\u2500\u2500 rtk # \u8fd0\u884c\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 _base.py # \u4e00\u4e9b\u679a\u4e3e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 install_env.py # \u5b89\u88c5\u73af\u5883\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 local_runner.py # \u8fd0\u884c\u7528\u4f8b\n\u251c\u2500\u2500 serial_communication # \u4e32\u53e3\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 power_control.py # \u7ee7\u7535\u5668\u64cd\u4f5c\uff0c\u4f7f\u7528\u7ee7\u7535\u5668\u8fde\u63a5\u4e3b\u673a\u7535\u6e90\uff0c\u63a7\u5236\u5f00\u5173\u673a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 serial_common.py # \u4e32\u53e3\u516c\u5171\u65b9\u6cd5\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 usb_mk.py # \u952e\u9f20\u64cd\u4f5c\u57fa\u7840\u5c01\u88c5\n\u251c\u2500\u2500 shortcut_key.py # \u5feb\u6377\u952e\u7684\u5c01\u88c5\n\u251c\u2500\u2500 singleton.py # \u5355\u4f8b\u6a21\u5f0f\n\u251c\u2500\u2500 start_app.py # \u521b\u5efa app\n\u2514\u2500\u2500 write_xlsx.py # \u751f\u6210 excel\n# __init__.py \u6587\u4ef6\u4e3a\u6807\u8bc6\u8be5\u76ee\u5f55\u662f\u4e00\u4e2aPython\u7684\u6a21\u5757\u5305\uff0c\u9879\u76ee\u4e2d\u7684__init__.py\u5747\u4e3a\u7a7a\u6587\u4ef6\u3002\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u73af\u5883\u642d\u5efa","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\u3002 \u670d\u52a1\u7aef\u4e00\u53f0\u3002\uff08\u4ec5\u652f\u6301 AMD \u67b6\u6784\uff0c\u82e5\u9700\u5176\u4ed6\u67b6\u6784\uff0c\u54a8\u8be2\u76f8\u5173\u5f00\u53d1\u4eba\u5458\uff09 \u91c7\u96c6\u76d2\u4e00\u4e2a\u3002 \uff08ACASIS HDMI \u89c6\u9891\u91c7\u96c6\u76d2\uff0chttps://item.jd.com/100013302599.html#crumb-wrap \uff09 USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\u3002\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"\uff082\uff09\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\u3002 USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff08USB3.0 \u63a5\u53e3\u4e0a\uff09\u3002 \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5 USB \u5ef6\u957f\u7ebf\u3002 \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u670d\u52a1\u7aef\u63a8\u8350\u914d\u7f6e","text":"\u914d\u7f6e\u8d8a\u9ad8\uff0c\u89e3\u6790\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"2\u3001\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa","text":" \u6253\u5f00\u63a7\u5236\u4e2d\u5fc3\uff0c\u8d26\u6237\u8bbe\u7f6e\u4e3a\u3010\u81ea\u52a8\u767b\u5f55\u3011\u548c\u3010\u65e0\u5bc6\u7801\u767b\u5f55\u3011\uff0c\u7535\u6e90\u7ba1\u7406\u4e2d\u4f7f\u7528\u7535\u6e90\u5168\u90e8\u8bbe\u7f6e\u4e3a\u3010\u4ece\u4e0d\u3011\uff0c\u5f00\u542f\u5f00\u53d1\u8005\u6a21\u5f0f\u3002 \u6839\u636e\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u8981\u6c42\uff0c\u5bfc\u5165\u76f8\u5173\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\uff1a\u5bfc\u5165\u76f8\u518c\u3001\u5f71\u9662\u3001\u97f3\u4e50\u7684\u6d4b\u8bd5\u8d44\u6e90\u3002 \u5728\u670d\u52a1\u7aef\u6253\u5f00\u76f8\u673a\u5e94\u7528\u540e\uff0c\u5c06\u6d4b\u8bd5\u673a\u684c\u9762\u58c1\u7eb8\u66f4\u6362\u4e3a\u7eaf\u8272\u58c1\u7eb8\uff08\u6ce8\u610f\uff0c\u670d\u52a1\u7aef\u9700\u63d0\u524d\u5f00\u542f\u76f8\u673a\u540e\u518d\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u58c1\u7eb8\uff0c\u5efa\u8bae\u7eaf\u9ed1\u58c1\u7eb8 setting/res/black.png\uff09 \u5728\u6587\u4ef6\u7ba1\u7406\u5668\u4e2d\uff0c\u5c06\u9009\u9879 \u4e3b\u83dc\u5355-\u8bbe\u7f6e-\u9884\u89c8-\u56fe\u7247\u9884\u89c8 \u53d6\u6d88\u52fe\u9009\uff08\u5982\u4e0d\u53d6\u6d88\uff0c\u4f1a\u5f71\u54cd\u622a\u56fe\u5f55\u5c4f\u5e94\u7528\u7684\u6027\u80fd\u6570\u636e\uff09 \u79fb\u52a8\u6216\u5220\u9664\u7cfb\u7edf Logo \uff0c\u6392\u9664\u684c\u9762\u53f3\u4e0b\u89d2 Logo \u7684\u5f71\u54cd\uff08\u91cd\u542f\u751f\u6548\uff09\u3002 sudo mv /usr/share/deepin/uos_logo.svg ~/Pictures/\n \u5b89\u88c5\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\uff08\u5fc5\u987b\u5b89\u88c5\uff01\uff01\uff09 AMD \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_amd64.deb ARM \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_arm64.deb MIPS \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_mips64.deb 3A5000 \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_5000.deb \u5b89\u88c5\u547d\u4ee4 sudo dkpg -i xserver-xorg-input-libinput_0.28.2-2_amd64.deb\n \u5b89\u88c5\u65f6\u4f1a\u63d0\u793a\u5df2\u5b58\u5728\u76f8\u540c\u7248\u672c\uff0c\u8bf7\u5ffd\u7565\uff0c\u76f4\u63a5\u8986\u76d6\u5b89\u88c5\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u4e3b\u673a\u624d\u751f\u6548"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u670d\u52a1\u7aef\u4e00\u952e\u73af\u5883\u90e8\u7f72","text":"\u73af\u5883\u642d\u5efa\u524d\u5fc5\u987b\u5148\u8fde\u63a5\u4e0a USB \u4e32\u53e3\u7ebf\u548c\u91c7\u96c6\u76d2\u3002 \u5bbf\u4e3b\u673a\u73af\u5883\u5b89\u88c5 python3 manage.py install --env host\n \u5bb9\u5668\u73af\u5883\u5b89\u88c5 python3 manage.py install --env docker\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u56db\u3001\u914d\u7f6e\u9879","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u670d\u52a1\u7aef\u914d\u7f6e","text":"setting/config/server.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u914d\u7f6e\u9879\uff0c\u5305\u542b\u4e86\u6240\u6709\u670d\u52a1\u7aef\u6240\u6709\u7684\u53ef\u914d\u7f6e\u9879\u3002 \u672c\u5730\u65e0\u7f51\u7edc\u8fd0\u884c \u5c06\u914d\u7f6e\u9879 network=0 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u672c\u5730\u6709\u7f51\u7edc\u8fd0\u884c \u914d\u7f6e\u9879 network=1 (1)\u914d\u7f6e\u9879 client_alias= \u914d\u7f6e\u4e3a\u4f60\u8981\u6d4b\u8bd5\u7684\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5982 Alias1 \u6d4b\u8bd5\u673a\u522b\u540d\u5728 setting/config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 (2)\u914d\u7f6e\u9879 client_alias= \u4e3a\u7a7a\uff0c\u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager --client_alias Alias1\uff0c\u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002(Alias1 \u4e3a\u4f60\u914d\u7f6e\u7684\u6d4b\u8bd5\u673a\u522b\u540d) (1)\u548c(2)\u53ea\u8981\u4f7f\u7528\u5176\u4e00\u5373\u53ef\u3002 \u6709\u7f51\u7edc\u8fd0\u884c\uff0c\u4e14\u9700\u8981\u901a\u8fc7 Jenkins \u4e0a\u8fd0\u884c\u4e00\u4e2a job \uff0c\u540c\u65f6\u63a7\u5236\u591a\u53f0\u673a\u5668\u3002 \u914d\u7f6e\u9879 network=1 \u914d\u7f6e\u9879 client_alias= \u4e0d\u7528\u914d\u7f6e\uff0c\u5728\u8fd0\u884c run.sh \u7684\u65f6\u5019\u76f4\u63a5\u7a7a\u683c\u52a0\u522b\u540d\u5373\u53ef\uff0c\u6bd4\u5982\uff1a\u6d4b\u8bd5\u673a\u522b\u540d\u4e3a Alias1 \uff0c\u4e14\u5df2\u7ecf\u5728 config/client.ini \u4e2d\u914d\u7f6e\u4e86 Alias1 \u7684user ip password \uff0c\u5219\u8fd0\u884c bash run.sh Alias1 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u5728 Jenkins pipeline \u91cc\u9762\u901a\u8fc7\u5e76\u884c stage \u6216\u5e76\u884c\u8c03\u7528\u4e0b\u5c42\u4efb\u52a1\u7684\u65b9\u5f0f\u53ef\u4ee5\u5b9e\u73b0\u5927\u89c4\u6a21\u7684\u6027\u80fd\u6d4b\u8bd5\u9700\u6c42\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;1\u3001KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2\u3001KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f, e.g. TAGS = L1 or smoke\n[case_conf]\n# \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\uff0cocr\u6587\u6848\u8bc6\u522b\u8f83\u6162\uff0c\u4e0d\u63a8\u8350\u4f7f\u7528\nfind_by = stage\n# \u6700\u540e\u4e00\u4e2a\u7a33\u5b9a\u9636\u6bb5\u7684\u5e27\u6570\u8bc6\u522b\n# \u9996\u5e27\u5b58\u5728\u540e\u7684\u7b2c\u4e00\u4e2a\u5927\u4e8e\u8be5\u914d\u7f6e\u5e27\u6570\u7684\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u5c3e\u5e27\nfinal_stable_num=100\n# \u4ece\u8be5\u5e27\u6570\u5f00\u59cb\u8bc6\u522b\u6587\u6848\u6216\u56fe\u7247\uff0c\u51cf\u5c11\u5206\u6790\u65f6\u95f4\nstart_num = 150\n# \u8bc6\u522b\u7684\u6587\u6848\ntext=\n# \u8bc6\u522b\u56fe\u7247\nmatch=apps/xxx/images/match.png\n# \u8bc6\u522b\u76f8\u4f3c\u5ea6\nmatch_rate=0.9\n# \u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6bd4\u5982\u70ed\u542f\u52a8\u7528\u4f8b\uff0c\u4ece\u70b9\u51fb\u6253\u5f00\u5230\u505c\u6b62\u5f55\u5c4f\uff0c\u4e2d\u95f4\u7b49\u5f855\u79d2\uff1b\nduration = 15\n# \u5355\u6761\u7528\u4f8b\u6267\u884c\u7684\u6b21\u6570\ncount = 5\n# \u7a33\u5b9a\u9636\u6bb5\u5212\u5206\u7684\u76f8\u4f3c\u5ea6\nstable_similarity = 0.9997\n[server]\n# \u8c03\u8bd5\u6a21\u5f0f=1\uff0c\u4e3a\u5f00\u542f\u8c03\u8bd5\u6a21\u5f0f\uff0c0\u4e3a\u5173\u95ed\u3002\n# \u8c03\u8bd5\u6a21\u5f0f\u4e0b\u9ed8\u8ba4\u53ea\u6267\u884c\u4e00\u6b21\u7528\u4f8b\uff0c\u4e0d\u5173\u673a\n# \u7f16\u5199\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u5efa\u8bae\u5f00\u542fmaintain\u3002\nMAINTAIN = 0\n# \u8fd0\u884c\u7684\u73af\u5883docker\u5bb9\u5668\u73af\u5883\uff0chost\u5bbf\u4e3b\u673a\u73af\u5883\nENV = docker\n# \u670d\u52a1\u7aef\u5bc6\u7801\nPASSWORD=1\n# \u6307\u5b9a\u6d4b\u8bd5\u673a\u522b\u540d\n# \u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6bd4\u5982\uff1a\n# [AMD]\n# ip=10.8.15.86\n# user=uos\n# \u5176\u4e2d AMD \u4e3a\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5219client_alias=AMD\nCLIENT_ALIAS = x86\uff08Intel-i7\uff09\n# 1 \u5f00\u542f\u7f51\u7edc, 0 \u5173\u95ed\u7f51\u7edc\n# \uff081\uff09\u670d\u52a1\u7aef\u4e0e\u6d4b\u8bd5\u673a\u987b\u5728\u540c\u4e00\u7f51\u6bb5\u4e0b\uff0c\u4f60\u53ef\u4ee5\u5c1d\u8bd5\u5728\u670d\u52a1\u7aef\u901a\u8fc7ssh\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c\u5982\u679c\u53ef\u4ee5\u8fde\u63a5\uff0c\u8bf4\u660e\u7f51\u7edc\u6b63\u5e38\u3002\n# \uff082\uff09\u5f53input_type=FILE_NAME \u65f6\uff0c\u5fc5\u987b\u5f00\u542f\u7f51\u7edc\u3002\nNETWORK = 1\n# \u6027\u80fd\u7ed3\u679c\u7edf\u8ba1\u5355\u4f4d \u6beb\u79d2\u2014ms, \u79d2\u2014s\nUNIT=ms\n# \u6d4b\u8bd5\u673a\u5f00\u673a\u8fdb\u5165\u684c\u9762\u540e\u7b49\u5f85\u65f6\u95f4,\u5355\u4f4d/\u79d2\nSTARTUP_DELAY = 60\n# 1\u4e3a\u5220\u9664\u7f13\u5b58\uff0c0\u4e3a\u4e0d\u5220\u9664\u7f13\u5b58\n# \u7528\u4f8b\u6267\u884c\u5b8c\u540e\u4f1a\u5728report\u76ee\u5f55\u4e0b\u751f\u6210\u667a\u80fd\u89e3\u6790\u7684\u4e00\u4e9b\u7f13\u5b58\u56fe\u7247\u3002\nCACHE = 0\n# \u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u62a5\u544a\u4f1a\u4fdd\u5b58\u5728\u9879\u76ee\u4e0breport\u76ee\u5f55\u4e2d\uff1b\n# \u6307\u5b9a\u62a5\u544a\u76ee\u5f55\u5219\u5b58\u653e\u5230\u6307\u5b9a\u76ee\u5f55\u3002\nREPORT_PATH = report\n# \u670d\u52a1\u7aef\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684icon\u8d44\u6e90\u4f1a\u7f13\u5b58\u5728\u9879\u76ee\u4e0binput\u76ee\u5f55\u4e2d\nINPUT = input/\n# 1\u4e3a\u6d4b\u8bd5\u5b8c\u5173\u673a\uff0c0\u4e3a\u6d4b\u8bd5\u5b8c\u4e0d\u5173\u673a\nSHUTDOWN = 0\n# \u89e3\u6790\u8fdb\u7a0b\u6570\uff08\u4e0d\u63a8\u8350\u4fee\u6539\uff09\n# 3\u4e2a\u8fdb\u7a0b\u89e3\u6790\u89c6\u9891\u5df2\u7ecf\u80fd\u591f\u6ee1\u8db3\uff0c\u5373\u4f7f\u589e\u52a0\u8fdb\u7a0b\u6570\u4e5f\u4e0d\u80fd\u51cf\u5c11\u6574\u4f53\u8017\u65f6\n# \u53e6\u5916\u8fd8\u8981\u770bCPU\u6838\u6570\u662f\u5426\u652f\u6301\u3002\nPARSING_PROCESS = 3\n# 1\u4e3a\u4f7f\u7528\u7ee7\u7535\u5668\u5f00\u5173\u673a\uff0c0\u4e3a\u4f7f\u7528reboot\u547d\u4ee4\u91cd\u542f\u3002\u4f9d\u8d56\u7ee7\u7535\u5668\u786c\u4ef6\u8bbe\u5907\uff0c\u9700\u8981\u4f7f\u7528\u8054\u7cfb\u5f00\u53d1\u8005\nRELAY = 0\n# \u83b7\u53d6\u6d4b\u8bd5\u5e94\u7528\u7684\u7248\u672c, %s \u5360\u4f4d\u5e94\u7528\u540d\n# \u5982\u679c\u8be5\u914d\u7f6e\u4e3a\u7a7a\uff0c\u5219\u4e0d\u83b7\u53d6\u5e94\u7528\u7684\u7248\u672c\u4fe1\u606f\u3002\nCOMMAND = apt policy %s 2>/dev/null|grep \"\u5df2\u5b89\u88c5\"|awk -F \"\uff1a\" \"{print \\$2}\"\n# \u5173\u673a\u7b49\u5f85\u5f00\u542f\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6839\u636e\u6d4b\u8bd5\u673a\u6027\u80fd\u4e0d\u540c\uff0c\u5f00\u5173\u673a\u8017\u65f6\u53ef\u80fd\u4e0d\u540c\uff0c\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u673a\u60c5\u51b5\u914d\u7f6e\u3002\nSHUTDOWN_DELAY = 30\n# \u53ef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u56fe\u7247\u683c\u5f0f\uff0c\u4ee5\u82f1\u6587\u9017\u53f7\u9694\u5f00\u3002\n# \u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u76ee\u524d\u6211\u4eec\u4ec5\u9a8c\u8bc1\u4e86jpg,jpeg,png\u8fd9\u4e09\u79cd\u5e38\u7528\u7684\u56fe\u7247\u683c\u5f0f\u3002\nINPUT_TYPES = jpg,jpeg,png\n# \u6027\u80fd\u5206\u6790\u8865\u5e27\uff0c\u7b49\u4e8e\u6216\u4f4e\u4e8e\u8be5\u503c\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u9700\u8981\u51cf\u6389\u3002\nUN_STAB_START = 3\n# \u670d\u52a1\u7aef\u83b7\u53d6\u6d4b\u8bd5\u673a\u56fe\u50cf\u7684\u5e27\u7387\uff0c\u5373\u6bcf\u79d2\u83b7\u53d6\u591a\u5c11\u5f20\u6d4b\u8bd5\u673a\u4e0a\u7684\u56fe\u50cf\u3002\n# \u9ed8\u8ba4\u5e27\u7387\u4e3a30\u5e27/\u79d2\uff0c\u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u53ef\u80fd\u4f1a\u5bf9\u89e3\u6790\u7ed3\u679c\u9020\u6210\u504f\u5dee\u3002\nFPS = 30\n# \u4ee5\u4e0b\u573a\u666f\u7c7b\u578b\u4f1a\u91cd\u542f\u6d4b\u8bd5\u673a,\u591a\u79cd\u573a\u666f\u4f7f\u7528\u9017\u53f7\u9694\u5f00\nSCENE = cold\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = http://10.8.13.78:8890\n#\u5c4f\u5e55\u56fe\u7247\u4e34\u65f6\u5b58\u653e\u4f4d\u7f6e\nSCREEN_CACHE = /tmp/screen\n# =======================================\n[log]\n# \u65e5\u5fd7\u7ea7\u522b\uff0cOFF\u3001FATAL\u3001ERROR\u3001WARN\u3001INFO\u3001DEBUG\u3001ALL\n# \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u65e5\u5fd7\u8f93\u51fa\uff0clog_cli=INFO\u8868\u793a \u4ec5\u8f93\u51faINFO\u53ca\u4ee5\u4e0a\u7ea7\u522b\u7684\u65e5\u5fd7\u3002\nLOG_LEVEL = DEBUG\n# \u65e5\u5fd7\u6587\u4ef6\u4fdd\u5b58\u8def\u5f84\nLOG_PATH= logs\n# =======================================\n[dockerhub]\n# \u5bb9\u5668\u767b\u9646\u8d26\u53f7\nDOCKER_USER = user\n# \u5bb9\u5668\u767b\u9646\u5bc6\u7801\nDOCKER_PASSWORD = User1234\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u6d4b\u8bd5\u673a\u914d\u7f6e","text":"setting/config/client.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u4fe1\u606f\u3002 \u6709\u7f51\u7edc\u7684\u60c5\u51b5\u4e0b\uff0c\u670d\u52a1\u7aef\u9700\u8981\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u56e0\u6b64\u4f60\u9700\u8981\u5199\u5165 \u6d4b\u8bd5\u673a\u522b\u540d \u3001 user \u3001ip\u3001 password \u3002 # \u6d4b\u8bd5\u673a\u522b\u540d\n[Alias1] # \u6d4b\u8bd5\u673aip\nip=10.8.15.86 # \u6d4b\u8bd5\u673a\u7528\u6237\u540d\nuser=uos\n \u547d\u540d\u5efa\u8bae\uff1aAliasA1\u3001AliasA2\u3001AliasB1\u3001AliasB2\uff0c\u4e0d\u8981\u91cd\u540d\u3002 \u65e0\u7f51\u7edc\u60c5\u51b5\u4e0b\uff0c\u4ec5\u9700\u8981\u5173\u6ce8\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\u9879 width=\u3001 height= \u5373\u53ef\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a [client]\n# \u9ed8\u8ba4\u6d4b\u8bd5\u673a\u7528\u6237\u540d\uff0c\u5bc6\u7801\uff0cip\nip=\nuser=\n# \u6d4b\u8bd5\u673a\u5bc6\u7801\npassword=1\n# \u6d4b\u8bd5\u673a\u4e3b\u9898\ntheme=bloom\n# \u6d4b\u8bd5\u673aicon\u76ee\u5f55\npath=/usr/share/icons\n# \u7cfb\u7edfdesktop\u6587\u4ef6\u7684\u5b58\u653e\u76ee\u5f55\uff0cUOS\u7cfb\u7edf\u9ed8\u8ba4\u4e3a/usr/share/applications\ndesktop_path=/usr/share/applications\n# \u7528\u4e8e\u5224\u65ad\u6d4b\u8bd5\u673a\u662f\u5426\u5f00\u673a\u8fdb\u5165\u684c\u9762\u7684\u8bc6\u522b\u6807\u8bc6\u3002\n# 1\u3001\u901a\u8fc7\u684c\u9762\u56fe\u6807\u8bc6\u522b\u3002\n# - type=FILE_NAME\u65f6\uff0c\u670d\u52a1\u5668\u548c\u6d4b\u8bd5\u673a\u5fc5\u987b\u5728\u540c\u4e00\u5c40\u57df\u7f51\u5185\u3002\n# - power_on=dde-computer\u8868\u793a\u901a\u8fc7\u684c\u9762\u8ba1\u7b97\u673a\u56fe\u6807\u5224\u65ad\u5f00\u673a\u8fdb\u5165\u684c\u9762\u3002\n# 2\u3001\u901a\u8fc7\u672c\u5730\u56fe\u7247\u4f5c\u4e3a\u5f00\u673a\u8bc6\u522b\u3002\n# - type= \u4f20\u5165\u4e3a\u56fe\u7247\u683c\u5f0f\uff0ctype\u652f\u6301\u7684\u7c7b\u578b\u5305\u542b\u5728server.ini\u5185\u914d\u7f6e\u9879input_type=jpg,jpeg,png\u3002\n# - power_on= \u4f20\u5165\u7684\u662f\u672c\u5730\u56fe\u7247\u7684\u8def\u5f84\u3002\ntype=FILE_NAME\npower_on=dde-computer\n# \u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\uff08\u6d4b\u8bd5\u673a\u8fde\u63a5\u91c7\u96c6\u76d2\uff0c\u91c7\u96c6\u76d2\u7684\u5206\u8fa8\u7387\uff09\nheight=1080\nwidth=1920\n[AliasA1] ip=10.8.15.86\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n[AliasA2]\nip=10.8.15.20\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_2","title":"3\u3001\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e","text":"\u968f\u7740\u6d4b\u8bd5\u573a\u666f\u7684\u4e0d\u65ad\u5f15\u5165\uff0c\u53d1\u73b0\u73b0\u6709\u670d\u52a1\u7aef\u91cc\u7684\u914d\u7f6e\u9879\u5e76\u4e0d\u9002\u7528\u4e8e\u6240\u6709\u7684\u6027\u80fd\u573a\u666f\uff0c\u4e8e\u662f\u5c06\u670d\u52a1\u7aef\u914d\u7f6e\u8fdb\u884c\u4e00\u4e2a\u63d0\u53d6\uff0c\u53ef\u505a\u5355\u4e2a\u573a\u666f\u7684\u4e2a\u6027\u5316\u914d\u7f6e\uff0c\u5f53\u7136\u539f\u6765\u7684\u670d\u52a1\u7aef\u914d\u7f6e\u529f\u80fd\u4fdd\u7559\uff0c\u53ea\u662f\u5f53\u4f60\u914d\u7f6e\u4e86\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e\u540e\uff0c\u4f18\u5148\u4f7f\u7528\u4e2a\u6027\u5316\u914d\u7f6e\u91cc\u9762\u7684\u5185\u5bb9\uff0c\u4ee5\u4e0b\u662f\u5bf9\u4e2a\u6027\u5316\u914d\u7f6e\u7684\u4ecb\u7ecd\u3002 \u76ee\u524d\u6bcf\u4e00\u4e2a py \u6587\u4ef6\u5bf9\u5e94\u4e00\u4e2a\u6027\u80fd\u6d4b\u8bd5\u573a\u666f\uff0c\u4e8e\u662f\u5728\u540c\u7ea7\u76ee\u5f55\u4e0b\u521b\u5efa\u4e00\u4e2a\u4e0e\u4e4b\u540c\u540d\u7684 json \u6587\u4ef6\uff0c\u4f5c\u4e3a\u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6 apps\n\u251c\u2500\u2500 album\n \u251c\u2500\u2500 test_album_01_start.json # \u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6\n\u2514\u2500\u2500 test_album_01_start.py # \u6027\u80fd\u573a\u666f\u6587\u4ef6\n \u4ee5\u4e0b\u662f\u5bf9 json \u6587\u4ef6\u4e2d\u914d\u7f6e\u7684\u89e3\u91ca\uff0c\u82e5\u67d0\u9879\u914d\u7f6e\u4e0d\u9700\u8981\uff0c\u53ef\u4ee5\u7f3a\u5931\uff0c\u4f46\u4e0d\u80fd\u4e3a\u7a7a\uff1b {\n\"title\": \"test_album_start\", # \u6807\u9898\uff1b\u5fc5\u987b\n\"app_name\": \"deepin-album\", # \u573a\u666f\u6240\u5c5e\u7684\u5e94\u7528\uff1b\u5fc5\u987b\n\"scene\": \"hot\", # \u573a\u666f\u522b\u540d\uff1b\u5fc5\u987b\n\"icon\": [\"deepin-album\"], # \u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684icon\u5230\u670d\u52a1\u7aef\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\uff1b\u53ef\u7f3a\u5931\n# \u6ce8\u610f\uff1a\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684desktop\u6587\u4ef6\u540d\u4e3adeepin-album.desktop\uff0c\n# \u53ea\u9700\u8981\u5199deepin-album\u5373\u53ef\uff0c\u201c.desktop\u201d\u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002\n\"size\": { # \u56fe\u7247\u5bf9\u6bd4\u7684\u533a\u57df\u8bbe\u7f6e\u9879\uff0c\u67d0\u4e9b\u5e94\u7528\u5f53\u524d\u5c4f\u5e55\u7684\u90e8\u5206\u533a\u57df\u9700\u8981\u5c06\u5176\u53bb\u6389\uff0c\u53ef\u4ee5\u8bbe\u7f6e\u6b64\u9879\uff0c\u5982\u679c\u6ca1\u6709\u5219\u53ef\u4e0d\u5199\uff1b\u53ef\u786e\u5b9e\n\"x-coordinate\": 0, # \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n\"y-coordinate\": 0, # \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n\"width\": 850, # \u6a2a\u5411\u957f\u5ea6\n\"height\": 1920 # \u7eb5\u5411\u9ad8\u5ea6\n},\n\"count\": 5, # \u573a\u666f\u6267\u884c\u7684\u6b21\u6570\uff1b\u5fc5\u987b\n\"duration\": 5, # \u8be5\u6761\u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff0c\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7279\u5b9a\u573a\u666f\uff0c\u8be5\u914d\u7f6e\u4e3a\u53ef\u9009\u9879\uff0c\u8986\u76d6 server.ini \u4e2d\u7684\u914d\u7f6e\uff1b\u53ef\u7f3a\u5931\n\"stable_similarity\": 0.9997, # \u6027\u80fd\u573a\u666f\u5206\u9636\u6bb5\u65f6\u7684\u56fe\u7247\u76f8\u4f3c\u5ea6\u5bf9\u6bd4\uff0c\u524d\u540e\u56fe\u7247\u4f4e\u4e8e\u8be5\u503c\uff0c\u5219\u5206\u4e3a\u4e0d\u7a33\u5b9a\u9636\u6bb5\uff1b\u53ef\u7f3a\u5931\n\"find_by\": \"stage\", # \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\n\"final_stable_num\": 100, # \u67e5\u627e\u6700\u540e\u4e00\u4e2a\u5927\u4e8e\u8be5\u503c\u7684\u7a33\u5b9a\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u7684\u5c3e\u796f\uff1b\u53ef\u7f3a\u5931\n\"start_num\": 150,\n\"text\": \"\", # ocr\u8bc6\u522b\u7684\u6587\u6848\n\"match\": \"apps/xxx/images/match.png\", # \u56fe\u50cf\u5339\u914d\u7684\u56fe\u7247\u6587\u4ef6\u8def\u5f84\n\"match_rate\": 0.9 # \u5339\u914d\u76f8\u4f3c\u5ea6\n}\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e94\u3001\u6d4b\u8bd5\u6d41\u7a0b","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516d\u3001\u7528\u4f8b\u7f16\u5199\u53ca\u65b9\u6cd5\u53c2\u6570\u6307\u5f15","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"1\u3001\u7528\u4f8b\u5b9e\u4f8b\u8bf4\u660e","text":"# \u6807\u51c6\u5e93\u5bfc\u5165\nfrom time import sleep\n# \u5bfc\u5165\u4e09\u65b9\u5e93pytest\nimport pytest\n# \u5bfc\u5165\u7528\u4f8b\u6267\u884c\u8981\u7528\u5230\u7684Widget\u7c7b\nfrom src.base_widget import BaseWidget\nclass TestStart:\n# class\u7ea7\u522b\u7684fixture\uff0c\u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u6267\u884c\u3002autouse=True \u81ea\u52a8\u5728\u5f53\u524d\u4f5c\u7528\u57df\u4e0b\u4f7f\u7528\u3002\n@pytest.fixture(scope=\"class\", autouse=True)\n# \u6d4b\u8bd5\u70ed\u542f\u52a8\u4e4b\u524d\u9700\u8981\u9884\u542f\u52a8\u3002\ndef application_pre_start(self):\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().right_click_element(\"deepin-album\")\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().click_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\")\nsleep(2)\n# \u5feb\u6377\u952e\u5173\u95ed\u7a97\u53e3\nBaseWidget().hot_key(\"alt\", \"f4\")\nsleep(2)\n# \u9ed8\u8ba4\u4e3afunction\u7ea7\u522b\u7684fixture\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\uff0cclass\u7ea7\u522bfixture\u6267\u884c\u4e4b\u540e\u6267\u884c\u3002\n@pytest.fixture(autouse=True)\ndef setup_start(self):\n# \u53f3\u952e\u70b9\u51fb deepin-album \u56fe\u6807\nBaseWidget().right_click_element(\"deepin-album\")\n# \u79fb\u52a8\u5230\u53f3\u952e\u83dc\u5355\u4e2d\u6253\u5f00\uff08open.png\uff09\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().move_to(*BaseWidget().find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))\n# \u7b49\u5f85\u79fb\u52a8\u5b8c\u6210\nsleep(0.5)\ndef test_album_start(self):\n# \u70b9\u51fb\u201c\u6253\u5f00\u201d\nBaseWidget().click() \n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"2\u3001\u65b9\u6cd5\u53c2\u6570\u8bf4\u660e","text":"2.1\u3001find_element \u65b9\u6cd5 def find_element(element: str, input_type: str = \"FILE_NAME\", fill_color_position: tuple = (-1, -1), size: tuple = (25, 70)):\npass\n \u53c2\u6570 element \u548c input_type \uff081\uff09\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u5143\u7d20 - `input_type` \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a `FIEL_NAME` \uff0c\u8868\u793a\u901a\u8fc7\u5e94\u7528 `icon` \u5bfb\u627e\u5143\u7d20\uff0c\u6b64\u65b9\u6cd5\u4f1a\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u5e94\u7528 `icon` \u56fe\u6807\u3002\n \u4e3e\u4f8b\uff1a\u9ed8\u8ba4\u60c5\u51b5\u4e0b input_type \u53c2\u6570\u4e0d\u9700\u8981\u4f20\u5165\uff0c find_element(\"deepin-album\")\uff0c\u8868\u793a\u901a\u8fc7 deepin-album \u7684\u5e94\u7528 icon \u6765\u83b7\u53d6\u5750\u6807\uff0c\u6ce8\u610f\uff0c\u6b64\u65f6\u4f20\u5165\u7684 deepin-album \u53c2\u6570\u5b9e\u9645\u662f desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u548c2.3\u4e2d\u7684 icon \u53d8\u91cf\u4e00\u81f4\u3002 \u6211\u4eec\u5efa\u8bae\u4f18\u5148\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\uff0c\u4f46\u6b64\u65b9\u6cd5\u4f9d\u8d56\u7f51\u7edc\uff0c\u8bf7\u6839\u636e\u6d4b\u8bd5\u73af\u5883\u5b9e\u9645\u60c5\u51b5\u9009\u62e9\u3002 \uff082\uff09\u901a\u8fc7\u672c\u5730\u56fe\u7247\u8bc6\u522b\u5143\u7d20 - \u53c2\u6570 `input_type` \u4f20\u5165\u56fe\u7247\u683c\u5f0f\uff0c\u6bd4\u5982\u622a\u53d6\u7684\u672c\u5730\u56fe\u7247\u683c\u5f0f\u4e3a `png`\uff0c\u90a3\u4e48 `input_type=\"png\"`\uff0c\u6b64\u65f6\u53c2\u6570 `element ` \u4f20\u5165\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5efa\u8bae\u5b58\u653e\u5728\u5bf9\u5e94\u7684\u4ea7\u54c1 `apps/app/picture/` \u76ee\u5f55\u4e0b\uff0c\u8def\u5f84\u4e3a\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u7684\u76f8\u5bf9\u8def\u5f84\u3002\n- \u4e3e\u4f8b\uff1a`find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))`\uff0c\u8868\u793a\u901a\u8fc7\u672c\u5730\u56fe\u7247 `open.png` \u8bc6\u522b\u5143\u7d20\u3002\n \u53c2\u6570 fill_color_position fill_color_position \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (-1, -1)\uff0c(-1, -1) \u8868\u793a\u53d6\u5c4f\u5e55\u4e2d\u53f3\u4e0b\u89d2\u6700\u540e\u4e00\u4e2a\u50cf\u7d20\u70b9\u4f5c\u4e3a\u586b\u5145\u5750\u6807\uff0c\u5728 1920x1080 \u5c4f\u5e55\u5206\u8fa8\u7387\u4e0b\u5373\u5b9e\u9645\u5750\u6807\u4e3a (1919, 1079) \uff0c\u8fd9\u6837\u7684\u5199\u6cd5\u53ef\u4ee5\u9002\u914d\u4e0d\u540c\u5927\u5c0f\u7684\u5c4f\u5e55\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0d\u540c\u65b9\u4f4d\uff1a \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0b\u65b9\uff0c\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u4e0d\u9700\u8981\u4f20\u5165\u8be5\u53c2\u6570\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u5de6\u8fb9\uff0cfill_color_position=(1, 1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u53f3\u8fb9\uff0cfill_color_position=(-1, -1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0a\u8fb9\uff0cfill_color_position=(1, 1) \u4ece\u684c\u9762\u542f\u52a8\u5e94\u7528\uff0c\u5219\u9700\u8981\u4f20\u5165\u9664\u4efb\u52a1\u680f\u4ee5\u5916\u5176\u4ed6\u4f4d\u7f6e\u7684\u5750\u6807\uff0c\u6bd4\u5982(100, 100)\uff0c\u53ea\u8981\u8fd9\u4e2a\u5750\u6807\u4e3a\u9664\u5e94\u7528\u548c\u4efb\u52a1\u680f\u533a\u57df\u90fd\u53ef\u4ee5\u3002 \u4ece\u542f\u52a8\u5668\u91cc\u9762\u542f\u52a8\u5e94\u7528\uff0c\u9700\u8981\u586b\u5145\u7684\u5750\u6807\u4e3a\u542f\u52a8\u5668\u533a\u57df\u3002 \u6ce8\uff1a\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u65f6\uff0c\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684 icon \u539f\u6587\u4ef6\u4e3a svg \u77e2\u91cf\u56fe\uff0c\u8f6c\u6362\u4e3a png \u4e4b\u540e\u9700\u8981\u586b\u5145\u8fb9\u7f18\u900f\u660e\u90e8\u5206\u3002 \u53c2\u6570 size size \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (25, 70)\uff0c\u8868\u793a\u6d4b\u8bd5\u673a\u4e0a dock \u680f\u4e0a\u5e94\u7528\u56fe\u6807\u7684\u5927\u5c0f\u8303\u56f4\u3002 UOS \u7cfb\u7edf dock \u680f\u662f\u53ef\u4ee5\u4e0a\u4e0b\u62d6\u52a8\u5927\u5c0f\u7684\uff0c\u968f\u7740 dock \u680f\u5927\u5c0f\u6539\u53d8\uff0c\u5e94\u7528\u56fe\u6807\u7684\u8303\u56f4\u4e3a25\u523070\u4e4b\u95f4\u3002 \u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u64cd\u4f5c\u7cfb\u7edf\u4e0a dock \u680f\u5927\u5c0f\u4e0d\u4e00\u6837\uff0c\u53ef\u4ee5\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u4f20\u5165\u5927\u5c0f\u8303\u56f4\u3002 2.2\u3001click_element\u3001 right_click_element\uff0c double_click_element \u8fd9\u51e0\u4e2a\u65b9\u6cd5\u53c2\u6570\u89c4\u5219\u4e0e find_element \u65b9\u6cd5\u4e00\u6837\u3002\u4ed6\u4eec\u5b9e\u9645\u4e0a\u662f\u5728 find_element \u65b9\u6cd5\u57fa\u7840\u4e4b\u4e0a\u505a\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u589e\u52a0\u4e86\u9f20\u6807\u7684\u52a8\u4f5c\uff0c\u5982\u679c\u4f60\u4e0d\u60f3\u4f7f\u7528\u8fd9\u51e0\u4e2a\u65b9\u6cd5\uff0c\u5728\u7528\u4f8b\u4e2d\u4e5f\u53ef\u4ee5\u901a\u8fc7 find_element \u83b7\u53d6\u5230\u5750\u6807\uff0c\u7136\u540e\u5c06\u5750\u6807\u4f20\u5165\u5230\u952e\u9f20\u7684\u65b9\u6cd5\u4e2d\uff0c\u53ef\u4ee5\u5b9e\u73b0\u540c\u6837\u7684\u6548\u679c\u3002 2.3\u3001\u7528\u4f8b\u7c7b\u4e2d\u6709\u4e2a\u7c7b\u53d8\u91cf icon = [\"deepin-album\"] \u9700\u8981\u7279\u6b8a\u8bf4\u660e\uff0c\u5217\u8868\u4e2d\u7684\u5143\u7d20\u4e3a\u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709 icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684 icon \u5230\u670d\u52a1\u7aef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528 desktop \u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684 desktop \u6587\u4ef6\u540d\u4e3a deepin-album.desktop\uff0c\u53ea\u9700\u8981\u5199 deepin-album \u5373\u53ef\uff0c.desktop \u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e03\u3001\u6267\u884c\u5165\u53e3","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"1\u3001\u7528\u4f8b\u7ec4\u7ec7","text":"\u5728 setting/config/server.ini \u6587\u4ef6\u4e2d APP_NAME= \u5b57\u6bb5\u4e3a\u7528\u4f8b\u7684\u6267\u884c\u7684\u76ee\u5f55\uff0c\u9ed8\u8ba4\u4e3a apps \u76ee\u5f55\u4e0b\u6240\u6709\u7528\u4f8b\u3002\u5982\u679c\u4f60\u60f3\u6307\u5b9a\u6267\u884c\u67d0\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4f60\u53ef\u4ee5\u5c06\u8be5\u914d\u7f6e\u9879\u6307\u5b9a\u5230\u5e94\u7528\u7684\u7528\u4f8b\u76ee\u5f55\uff0c\u6bd4\u5982\uff1aAPP_NAME=deepin_album\uff0c \u8868\u793a\u6267\u884c\u76f8\u518c\u76ee\u5f55\u4e0b\u7684\u7528\u4f8b\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a python3 manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music\n -k KEYWORDS, --keywords KEYWORDS\n \u7528\u4f8b\u7684\u5173\u952e\u8bcd\n -t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e\n --log_level LOG_LEVEL \u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n --env {host,docker} \u5728\u5bbf\u4e3b\u673a\u6216\u5bb9\u5668\u73af\u5883\u6267\u884c\n --client_alias \u9009\u62e9\u6d4b\u8bd5\u673a\u522b\u540d, \u53ef\u9009\u9879\u4e3aclient.ini\u4e2d\u5df2\u914d\u7f6e, \u9ed8\u8ba4\u503c\u4e3a zx-x86.\n --count \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a python3 manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\" --env docker\n \u6ce8\uff1a\u5728\u5bb9\u5668\u4e2d\u6267\u884c\u65f6\uff0c\u82e5\u5f3a\u5236\u9000\u51fa\uff0c\u5bb9\u5668\u5e76\u4e0d\u4f1a\u505c\u6b62\u8fd0\u884c\uff01"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_9","title":"\u516b\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1json","title":"1\u3001Json \u62a5\u544a","text":"\u81ea\u7814\u89c6\u9891\u89e3\u6790\u5de5\u5177\u4f1a\u5bf9\u5355\u6761\u7528\u4f8b\u6267\u884c\u4e00\u8f6e\u751f\u6210\u4e00\u4e2a json \u6587\u4ef6\uff0c\u5b58\u653e\u4e8e report/{app_name}/{scene}/{run_num} \u76ee\u5f55\u4e0b\uff0c\u547d\u540d\u683c\u5f0f\u4e3a\uff1a report.json json \u5185\u5bb9\u4e3e\u4f8b\uff1a [\n{\n\"Stab1\": {\n\"images\": [1,2...150,151],\n\"startStub\": 0,\n\"type\": \"Stab\"\n}\n},\n{\n\"Stab2\": {\n\"images\": [152,153...169,170],\n\"startStub\": 1,\n\"type\": \"UnStab\"\n}\n},\n{\n\"Stab3\": {\n\"images\": [171,172...300,301],\n\"startStub\": 0,\n\"type\": \"UnStab\"\n}\n}\n]\n \u8bf4\u660e\uff1a Stab \uff1a\u8868\u793a\u89e3\u6790\u8fc7\u7a0b\u4e2d\u4e0d\u540c\u7684\u9636\u6bb5\u3002 images \uff1a\u8868\u793a\u6bcf\u4e00\u5e27\u7684\u56fe\u7247\u5e8f\u53f7\u3002 startStub\uff1a \u4e3a\u8bc6\u522b\u5c3e\u5e27\u7684\u9636\u6bb5\u8868\u793a\uff0c\u5982\u679c \"startStub\": 1 \uff0c\u8bf4\u660e\u5c3e\u5e27\u51fa\u73b0\u5728\u8be5\u9636\u6bb5\u3002 type\uff1a \u4e3a Stab \u6216 UnStab \uff0c\u8868\u793a\u7a33\u5b9a\u9636\u6bb5\u6216\u4e0d\u7a33\u5b9a\u9636\u6bb5\u3002 \u5404\u9636\u6bb5\u6709\u5e27\u6570\u8865\u507f\uff0c\u9ed8\u8ba4\u8865\u507f\u7684\u5e27\u6570\u4e3a 3 \u5e27\uff08\u53ef\u4ee5\u901a\u8fc7 server.ini \u91cc\u9762 un_stab_start=3 \u8fdb\u884c\u914d\u7f6e\uff09\uff0c\u8868\u793a\u5c0f\u4e8e\u7b49\u4e8e 3 \u5e27\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u524d\u540e\u5747\u9700\u8981\u51cf\u6389\u3002 \u5e94\u7528\u542f\u52a8\u9636\u6bb5\u5c31\u662f\u5728 Stab2 \u9636\u6bb5\uff0c\u542f\u52a8\u65f6\u95f4\u4e3a\uff1a171 \u51cf 151 \u518d\u51cf\u6389\u524d\u540e\u8865\u507f\u5e27\u6570 6 \u5e27\uff0c\u5373 14 \u5e27\uff0c\u89c6\u9891\u5e27\u7387 30 \u5e27/\u79d2\uff0c\u56e0\u6b64\u542f\u52a8\u8017\u65f6\u4e3a\uff1a14 * 33 = 462 ms"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2excel","title":"2\u3001Excel \u62a5\u544a","text":"\u6240\u6709\u7528\u4f8b\u6267\u884c\u5e76\u89e3\u6790\u5b8c\u4e4b\u540e\u4f1a report \u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a\u6c47\u603b\u6570\u636e\u7684 Excel \u6587\u4ef6\uff0c\u6587\u4ef6\u540d\u4e3a\uff1a{time}_perf_time.xlsx\u3002 \u6ce8\u610f\uff0creport \u76ee\u5f55\u4e3a\u53ef\u914d\u7f6e\u9879\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u4f1a\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u751f\u6210\uff0c\u5982\u679c\u4f60\u5c06 report\uff0c\u6307\u5b9a\u5230\u9879\u76ee\u4e0b\u5176\u4ed6\u8def\u5f84\uff0c\u5219\u4f1a\u5728\u5bf9\u5e94\u7684\u8def\u5f84\u4e0b\u751f\u6210 json \u548c Excel \u6587\u4ef6\u3002 \u4f60\u4e5f\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8bfb\u53d6\u6240\u6709 json / excel \u62a5\u544a\u7684\u6570\u636e\uff0c\u751f\u6210\u4f60\u81ea\u5df1\u60f3\u8981\u7684\u4e00\u4e9b\u6d4b\u8bd5\u62a5\u544a\u5f62\u5f0f\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#usb","title":"\u4e5d\u3001USB \u4e32\u53e3\u9a71\u52a8\u952e\u9f20\u65b9\u6cd5","text":"\u4f4d\u4e8e src/utils/control/serial_communication \u76ee\u5f55\u4e0b\u7684 usb_mk.py \u6587\u4ef6 usb_mk = UsbMk()\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up()\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u652f\u6301\u4f20\u5165\u6c49\u5b57\uff0c\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click()\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() \n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() \n \uff084\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() \n \uff085\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() \n \uff086\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() \n \uff087\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff088\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff0810\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_10","title":"\u5341\u3001\u7ee7\u7535\u5668\u63a7\u5236\u4e3b\u673a\u5f00\u673a/\u91cd\u542f","text":"\uff08\u82e5\u4e0d\u4f7f\u7528\u7ee7\u7535\u5668\uff0c\u53ef\u5ffd\u7565\u8be5\u6b65\u9aa4\uff0c\u6267\u884c\u65f6\u4f1a\u901a\u8fc7\u547d\u4ee4 reboot\uff09"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u7ee7\u7535\u5668\u8bbe\u5907","text":"LCUS-2 \u578b \u53cc\u8def USB \u667a\u80fd\u4e32\u53e3\u63a7\u5236\u7ee7\u7535\u5668\u3002 https://item.taobao.com/item.htm?spm=a1z09.2.0.0.41d72e8dUYx2pi&id=582653718178&_u=i25r20ia6a2e "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2usb","title":"2\u3001USB \u5ef6\u957f\u7ebf","text":"\u666e\u901a\u7684 USB \u7ebf\u5373\u53ef\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_3","title":"3\u3001\u675c\u90a6\u7ebf","text":"3.1\u300140P \u6bcd\u5bf9\u516c\u675c\u90a6\u7ebf\u3002 3.2\u3001\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"4\u3001\u5b89\u88c5\u56fe\u6587\u6559\u7a0b","text":"4.1\u3001\u4f7f\u7528 USB \u5ef6\u957f\u7ebf\u8fde\u63a5\u63a7\u5236\u7aef\u548c\u7ee7\u7535\u5668\u3002 4.2\u3001\u5728\u7ee7\u7535\u5668\u5e38\u7aef\u548c\u516c\u5171\u7aef\u5747\u8fde\u63a5\u4e00\u6839\u675c\u90a6\u7ebf\u3002 4.3\u3001\u5728\u4e3b\u677f\u4e0a\u5f00\u673a\u9488\u548c\u91cd\u542f\u9488\u4e0a\u63d2\u4e0a\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 4.4\u3001\u5c06\u5f00\u673a\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76841\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1\u5de6\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 4.5\u3001\u5c06\u91cd\u542f\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76842\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1 \u53f3\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 \u82e5\u60f3\u4fdd\u7559\u539f\u7535\u6e90\u5f00\u5173\u7684\u7535\u6e90\u706f\uff0c\u53ef\u6839\u636e\u5982\u4e0a\u56fe\u6240\u793a\uff0c\u4f7f\u7528\u675c\u90a6\u7ebf\u8fde\u63a5\u4e3b\u677f\u4e0a\u7684\u7535\u6e90\u706f\u548c\u539f\u7535\u6e90\u5f00\u5173"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_11","title":"\u5341\u4e00\u3001\u5e38\u89c1\u95ee\u9898\u8bf4\u660e","text":"1\u3001ERROR: for uos Cannot restart container 2301b1a1395d7959ee6523d61b61c87084649af530786cdb8fb5b3ecbcbd1068: linux runtime spec devices: error gathering device information while adding custom device \"/dev/ttyACM0\": no such file or directory \u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u8fde\u63a5\u72b6\u6001\uff0c\u67e5\u770b /dev/ttyACM0 \u662f\u5426\u5b58\u5728\uff0c\u82e5\u5b58\u5728 /dev/ttyACMn\uff08n\u4e3a\u4efb\u610f\u6570\u5b57\uff09\uff0c\u91cd\u542f\u7535\u8111\u89e3\u51b3\u3002 2\u3001Error response from daemon: Container 5e700fdc769e8c74666d68a7f2bc3de58268b4594cf88706609d59f8dbc7362d is not running \u5bb9\u5668\u542f\u52a8\u5931\u8d25 1\uff09\u68c0\u67e5\u54ea\u4e00\u4e2a\u5bb9\u5668\u672a\u542f\u52a8 sudo docker container ls # \u5217\u51fa\u8fd0\u884c\u4e2d\u7684 Docker \u5bb9\u5668\n 2\uff09\u7f3a\u5c11 uos \u5bb9\u5668\uff0c\u68c0\u67e5 USB \u4e32\u53e3\u8fde\u63a5\u7ebf\u548c\u91c7\u96c6\u76d2\u8fde\u63a5\u7ebf\u662f\u5426\u6b63\u5e38\uff0c\u91cd\u542f\u540e\u6267\u884c bash install/setup.up # \u91cd\u65b0\u5b8c\u6574\u90e8\u7f72\u73af\u5883\n \u6216\u6267\u884c sudo docker-compose up -d --build # \u4ec5\u91cd\u65b0\u6784\u5efa Docker \u955c\u50cf\n 3\u3001\u82e5\u90e8\u7f72\u65f6\u63d0\u793a\u6302\u8f7d ttyACM0\u3001video0 \u5931\u8d25\uff0c\u8bf7\u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u53ca\u91c7\u96c6\u76d2\u662f\u5426\u63a5\u89e6\u826f\u597d\uff0c\u82e5\u63a5\u89e6\u826f\u597d\uff0c\u91cd\u542f\u5373\u53ef\u89e3\u51b3\u3002 4\u3001\u82e5\u51fa\u73b0\u56fe\u7247\u80fd\u8bc6\u522b\uff0c\u4f46\u662f\u9f20\u6807\u672a\u79fb\u52a8\u64cd\u4f5c\u65f6\uff0c\u5b89\u88c5\u7edd\u5bf9\u9f20\u6807\u64cd\u4f5c\u7684\u4f9d\u8d56\u5305\uff0c\u89c1\u7b2c\u4e09\u8282\u7b2c\u4e8c\u5c0f\u8282\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u6d4b\u8bd5\u673a\u3002 5\u3001\u7531\u4e8e\u901a\u8fc7\u91c7\u96c6\u5361\u83b7\u53d6\u7684\u6d4b\u8bd5\u673a\u5b9e\u65f6\u753b\u9762\uff0c\u5305\u542b\u4e86\u9f20\u6807\u7684\u6837\u5f0f\uff0c\u6240\u4ee5\u5bf9\u56fe\u7247\u8bc6\u522b\u65f6\uff0c\u9f20\u6807\u82e5\u505c\u7559\u5728\u56fe\u6807\u4e0a\u5c42\uff0c\u5219\u4f1a\u5bf9\u8bc6\u522b\u7ed3\u679c\u9020\u6210\u5f71\u54cd\uff0c\u9700\u8981\u5c06\u9f20\u6807\u79fb\u52a8\u81f3\u5176\u4ed6\u4f4d\u7f6e\uff0c\u6216\u8005\u9690\u85cf\u9f20\u6807\u89e3\u51b3\u3002 6\u3001Excel \u62a5\u544a\u4e2d\uff0c\u6d4b\u8bd5\u573a\u666f\u5217\u4e0e\u7528\u4f8b\u4e2d\u7684\u4e0d\u4e00\u81f4\uff0c\u5173\u952e\u5b57scene\u3001app_name\u3001\u67b6\u6784\u522b\u540d\uff0c\u4e0d\u80fd\u5305\u542b\u4e0b\u5212\u7ebf\u548c\u82f1\u6587\u7b26\u53f7\u7684\u5706\u62ec\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/","title":"\u6846\u67b6\u529f\u80fd\u4ecb\u7ecd","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2023/1/12\n# Author : Mikigo\n# =============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_2","title":"\u4e00\u3001\u4e00\u53e5\u8bdd\u7b80\u4ecb","text":"\u6b64\u6587\u6863\u4e3b\u8981\u60f3\u5bf9 YouQu \u6846\u67b6\u4e00\u4e9b\u91cd\u70b9\u7684\u529f\u80fd\u505a\u8be6\u7ec6\u7684\u4ecb\u7ecd\uff0c\u5305\u62ec\u5bf9\u4e00\u4e9b\u529f\u80fd\u5f00\u53d1\u7684\u80cc\u666f\u3001\u8981\u89e3\u51b3\u7684\u95ee\u9898\u3001\u5b9e\u73b0\u903b\u8f91\u3001\u4ee3\u7801\u7b49\u65b9\u9762\u7684\u4ecb\u7ecd\uff0c\u4ee5\u6b64\u8ba9\u5927\u5bb6\u80fd\u66f4\u52a0\u6e05\u6670\u7684\u7406\u89e3\u5404\u9879\u529f\u80fd\uff0c\u4ece\u800c\u5728\u4f7f\u7528\u7684\u65f6\u5019\u80fd\u66f4\u52a0\u7684\u5f97\u5fc3\u5e94\u624b\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_3","title":"\u4e8c\u3001\u56fe\u50cf\u8bc6\u522b","text":"\u56fe\u50cf\u8bc6\u522b\u5728 UI \u81ea\u52a8\u5316\u4e2d\u662f\u4e0d\u53ef\u7f3a\u5c11\u7684\uff0c\u5e02\u9762\u4e0a\u751a\u81f3\u6709\u5b8c\u5168\u57fa\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\uff0c\u6bd4\u5982 Airtest\u3001Sikuli \u7b49\uff0c\u5728\u6e38\u620f\u7b49\u7279\u5b9a\u9886\u57df\u4e5f\u6709\u4e0d\u9519\u7684\u6548\u679c\uff0c\u8fd9\u4e9b\u5de5\u5177\u5b9e\u9645\u4e0a\u4e5f\u662f\u7528\u7684 OpenCV \u8fdb\u884c\u4e86\u5c01\u88c5\uff0cYouQu \u6846\u67b6\u57fa\u4e8e OpenCV \u5f00\u53d1\u4e86\u81ea\u5df1\u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\uff0c\u5b83\u53ef\u4ee5\u65b9\u4fbf\u7684\u7528\u4e8e\u754c\u9762\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u65ad\u8a00\uff1b YouQu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u51e0\u4e4e\u6ee1\u8db3\u4e86\u4f60\u7684\u6240\u6709\u8981\u6c42\uff0c\u6211\u4eec\u5728\u957f\u65f6\u95f4\u7684\u601d\u8003\u548c\u6478\u7d22\u4e2d\uff0c\u9488\u5bf9\u5e38\u89c4\u573a\u666f\u53ca\u4e00\u4e9b\u7279\u6b8a\u573a\u666f\u63a2\u7d22\u9664\u4e86\u4e00\u4e9b\u5b9e\u7528\u4e14\u6709\u6548\u7684\u65b9\u6848\uff0c\u4e14\u542c\u6211\u6162\u6162\u9053\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1","title":"1\u3001\u5e38\u89c4\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5e38\u89c4\u8bc6\u522b\u5f88\u597d\u7406\u89e3\uff0c\u4e00\u53e5\u8bdd\u8bb2\u5c31\u662f\uff0c\u8981\u83b7\u53d6\u5230\u76ee\u6807\u5143\u7d20\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u3002 \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u5728\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u9700\u8981\u83b7\u53d6\u7684\u5750\u6807\u662f\u76f8\u5bf9\u4e8e\u6574\u4e2a\u5c4f\u5e55\u7684\u5750\u6807\uff0c\u6211\u4eec\u53ef\u4ee5\u622a\u53d6\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u56fe\u7247\uff08screen\uff09\uff1b \u5728\u5143\u7d20\u8bc6\u522b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u622a\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5c0f\u56fe\u8fdb\u884c\u8bc6\u522b\uff0c\u6bd4\u5982\u622a\u53d6\u64ad\u653e\u6309\u94ae\uff1a \u90a3\u4e48\u5b9e\u9645\u4e0a\uff0c\u5143\u7d20\u5b9a\u4f4d\u7684\u95ee\u9898\u5c31\u8f6c\u6362\u4e3a\uff0c\u5c06\u622a\u56fe\u7684\u5c0f\u56fe\uff08play_btn\uff09\u62ff\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u5927\u56fe\uff08screen\uff09\u4e2d\u53bb\u505a\u5339\u914d\uff0c\u5982\u679c\u5339\u914d\u6210\u529f\uff0c\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff08 x, y \uff09\u5373\u53ef\u3002 \u4e3a\u4e86\u65b9\u4fbf\u63cf\u8ff0\uff0c\u4ee5\u4e0b\u6211\u5c06\u6574\u4e2a\u5c4f\u5e55\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5927\u56fe\uff0c\u67d0\u4e2a\u5143\u7d20\u56fe\u7247\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5c0f\u56fe\u3002 \u57fa\u4e8e OpenCV \u7684\u6a21\u677f\u5339\u914d cv.matchTemplate() \u529f\u80fd\uff0c\u6211\u4eec\u5b9e\u73b0\u4e86\u56fe\u50cf\u5b9a\u4f4d\u7684\u529f\u80fd\uff0c\u6846\u67b6\u63d0\u4f9b\u4e86\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u5e95\u5c42\u63a5\u53e3\uff08\u4e00\u822c\u4e0d\u5bf9\u4e0a\u5c42\u63d0\u4f9b\u8c03\u7528\uff09\uff1a def _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\n# \u8be6\u7ec6\u4ee3\u7801\u592a\u957f\u4e0d\u8d34\u4e86\uff0c\u611f\u5174\u8da3\u8bf7\u67e5\u770b\u6e90\u7801\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001image_path image_path \u662f\u5c0f\u56fe\u7684\u7edd\u5bf9\u8def\u5f84; \u901a\u5e38\u5728 AT \u5de5\u7a0b\u91cc\u9762\uff0c\u6211\u4eec\u7ea6\u5b9a\u5c06\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u5b9e\u9645\u7684\u5143\u7d20\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1aplay_btn.png \uff1b \u7528\u4e8e\u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 case/assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1amusic_001.png \uff1b \u8fd9\u6837\u662f\u4e3a\u4e86\u65b9\u4fbf\u7ba1\u7406\u548c\u7ef4\u62a4\u3002 2\u3001rate \u56fe\u50cf\u8bc6\u522b\u7684\u7684\u5339\u914d\u5ea6\u6216\u8005\u8bf4\u76f8\u4f3c\u5ea6\uff0c\u6846\u67b6\u9ed8\u8ba4\u7684\u914d\u7f6e\u4e3a 0.9\uff0c\u4e5f\u5c31\u662f\u8bf4\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u5b58\u5728\u4e00\u4e2a\u76f8\u4f3c\u5ea6 90% \u7684\u56fe\u6807\u5373\u8fd4\u56de\u5176\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff1b \u5982\u679c\u4f60\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u8c03\u6574\u8bc6\u522b\u5ea6\uff0c\u4f60\u53ef\u4ee5\u5728\u8c03\u7528\u51fd\u6570\u7684\u65f6\u5019\uff0c\u4f20\u5165\u4e0d\u540c\u7684\u8bc6\u522b\u5ea6\u7684\u503c\u3002 3\u3001multiple \u9ed8\u8ba4\u60c5\u51b5\u4e0b multiple=False\uff0c\u8868\u793a\u53ea\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u7b2c\u4e00\u4e2a\uff0c\u5982\u679c multiple=True \u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\uff0c\u56e0\u4e3a\u5927\u56fe\u4e2d\u53ef\u80fd\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u5c0f\u56fe\uff0c\u5728\u67d0\u4e9b\u573a\u666f\u4e0b\u4f60\u53ef\u80fd\u9700\u8981\u5168\u90e8\u83b7\u53d6\u5230\u6240\u6709\u5339\u914d\u5230\u7684\u5750\u6807\u3002 4\u3001picture_abspath \u9ed8\u8ba4\u60c5\u51b5\u4e0b picture_abspath=None \u8868\u793a\u5927\u56fe\u4e3a\u622a\u53d6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u5982\u679c\u4f60\u4e0d\u5e0c\u671b\u5927\u56fe\u662f\u5c4f\u5e55\u7684\u622a\u56fe\uff0c\u800c\u662f\u4f60\u81ea\u5b9a\u4e49\u4f20\u5165\u7684\u67d0\u4e2a\u56fe\u7247\uff0c\u4f60\u53ea\u9700\u8981\u5c06\u4f60\u7684\u56fe\u7247\u8def\u5f84\u4f20\u9012\u7ed9\u8fd9\u4e2a\u53c2\u6570\u5c31\u884c\uff0c\u6bd4\u5982\uff1a picture_abspath=\"~/Desktop/big.png\" \uff1b 5\u3001screen_bbox \u5927\u56fe\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u622a\u53d6\u6574\u4e2a\u5c4f\u5e55\uff0cscreen_bbox = [x, y, w, h] \u53ef\u4ee5\u6307\u5b9a\u622a\u53d6\u5c4f\u5e55\u4e2d\u7684\u56fa\u5b9a\u533a\u57df\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\uff0c\u53ef\u4ee5\u6392\u9664\u90e8\u5206\u533a\u57df\u5bf9\u8bc6\u522b\u7ed3\u679c\u7684\u5f71\u54cd\u3002 \u3010\u9690\u5f0f\u7b49\u5f85\u3011 \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\uff0c\u6709\u65f6\u5019\u9875\u9762\u8df3\u8f6c\u6709\u5ef6\u65f6\uff0c\u6709\u53ef\u80fd\u5b58\u5728\u8bc6\u522b\u7684\u90a3\u4e00\u523b\u9875\u9762\u4e5f\u6ca1\u6709\u8df3\u8f6c\u51fa\u6765\uff0c\u6216\u8005\u6216\u8005\u8bc6\u522b\u7684\u90a3\u4e00\u523b\uff1b \u56e0\u6b64\u6211\u4eec\u9700\u8981\u4e00\u79cd\u7b49\u5f85\u673a\u5236\uff0c\u5373\u5728\u4e00\u5b9a\u7684\u65f6\u95f4\u5185\uff0c\u5982\u679c\u8bc6\u522b\u4e0d\u5230\uff0c\u91cd\u590d\u53bb\u8bc6\u522b\uff1a def find_image(\ncls,\n*widget, rate: [float, int] = None,\nmultiple: bool = False,\nmatch_number: int = None,\npicture_abspath: str = None,\nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u5728\u5c4f\u5e55\u4e2d\u533a\u5bfb\u627e\u5c0f\u56fe\uff0c\u8fd4\u56de\u5750\u6807\uff0c\n \u5982\u679c\u627e\u4e0d\u5230\uff0c\u6839\u636e\u914d\u7f6e\u91cd\u8bd5\u6b21\u6570\uff0c\u6bcf\u6b21\u95f4\u96941\u79d2\n :param widget: \u6a21\u677f\u56fe\u7247\u8def\u5f84\n :param rate: \u76f8\u4f3c\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param match_number: \u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\n :return: \u5750\u6807\u5143\u7ec4\n \"\"\"\nif rate is None:\nrate = float(GlobalConfig.IMAGE_RATE)\ntry:\nfor element in widget:\nfor _ in range((match_number or int(GlobalConfig.IMAGE_MATCH_NUMBER)) + 1):\nlocate = cls._match_image_by_opencv(\nelement,\nrate,\nmultiple=multiple,\npicture_abspath=picture_abspath,\nscreen_bbox=screen_bbox\n)\nif not locate:\nsleep(int(GlobalConfig.IMAGE_MATCH_WAIT_TIME))\nelse:\nreturn locate\nraise TemplateElementNotFound(*widget)\nexcept Exception as e:\nraise e\n \u53c2\u6570 match_number \u7528\u4e8e\u63a7\u5236\u91cd\u590d\u8bc6\u522b\u7684\u6b21\u6570\uff0c\u9ed8\u8ba4\u4e0d\u4f20\u53c2\uff0c\u53d6\u5168\u5c40\u914d\u7f6e setting/globalconfig.ini \u91cc\u9762\u7684 IMAGE_MATCH_NUMBER \u914d\u7f6e\u9879\u7684\u503c\uff0c\u9ed8\u8ba4IMAGE_MATCH_NUMBER = 1\uff0c\u5373\u91cd\u8bd5 1 \u6b21\uff1b find_image \u662f\u6846\u67b6\u63d0\u4f9b\u7684\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u51fd\u6570\u63a5\u53e3\uff0c\u8fd9\u4e2a\u51fd\u6570\u63d0\u4f9b\u4e86\u9690\u5f0f\u7b49\u5f85\u7684\u529f\u80fd\uff0c\u4e14\u5305\u542b\u4e0a\u9762\u4ecb\u7ecd\u7684 _match_image_by_opencv \u51fd\u6570\u7684\u6240\u6709\u529f\u80fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2","title":"2\u3001\u6c14\u6ce1\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u6c14\u6ce1\u8bc6\u522b\u6307\u7684\u662f\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\u8981\u5b9a\u4f4d\u7684\u5143\u7d20\u662f\u4e00\u4e9b\u4f1a\u6d88\u5931\u7684\u5c0f\u5f39\u7a97\uff0c\u8fd9\u7c7b\u573a\u666f\u5728\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\u5c31\u53ef\u80fd\u5b58\u5728\u4e0d\u7a33\u5b9a\u6027\uff0c\u6709\u53ef\u80fd\u56fe\u50cf\u8bc6\u522b\u7684\u65f6\u5019\u6c14\u6ce1\u5df2\u7ecf\u6d88\u5931\u4e86\uff0c\u4e5f\u6709\u53ef\u80fd\u6c14\u6ce1\u51fa\u73b0\u7684\u65f6\u95f4\u592a\u77ed\u4e86\uff0c\u4e0d\u5bb9\u6613\u6355\u6349\u5230\uff0c\u5c31\u50cf\u6c14\u6ce1\u4e00\u6837\uff0c\u51fa\u73b0\u4e00\u4e0b\u5c31\u6d88\u5931\uff0c\u56e0\u6b64\u6211\u4eec\u5f62\u8c61\u7684\u79f0\u4e4b\u4e3a \u201c\u6c14\u6ce1\u8bc6\u522b\u201d\uff1b \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u4e3a\u4e86\u80fd\u7a33\u5b9a\u7684\u8bc6\u522b\u6c14\u6ce1\u7c7b\u573a\u666f\uff0c\u6211\u4eec\u91c7\u7528\u7684\u65b9\u6848\u662f\uff1a \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\uff08\u5305\u542b\u6c14\u6ce1\u4ece\u51fa\u73b0\u5230\u6d88\u5931\uff09\uff0c\u4e0d\u505c\u7684\u622a\u53d6\u8fd9\u6bb5\u65f6\u95f4\u5185\u7684\u5927\u56fe\uff0c\u4ee5\u6b64\u786e\u4fdd\u5728\u622a\u53d6\u7684\u4e00\u5806\u56fe\u7247\u4e2d\uff0c\u80af\u5b9a\u6709\u81f3\u5c11\u4e00\u5f20\u56fe\u7247\u80fd\u6355\u6349\u5230\u6c14\u6ce1\uff0c\u6700\u540e\u518d\u5bf9\u8fd9\u4e00\u5806\u56fe\u7247\u9010\u4e2a\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def get_during(\ncls,\nimage_path: str,\nscreen_time: [float, int],\nrate: float = None,\npause: [int, float] = None,\nmax_range: int = 10000\n):\n\"\"\"\n \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u622a\u56fe\u591a\u5f20\u56fe\u7247\u8fdb\u884c\u8bc6\u522b\uff0c\u5176\u4e2d\u6709\u4e00\u5f20\u56fe\u7247\u8bc6\u522b\u6210\u529f\u5373\u8fd4\u56de\u7ed3\u679c;\n \u9002\u7528\u4e8e\u6c14\u6ce1\u7c7b\u7684\u65ad\u8a00\uff0c\u6bd4\u5982\u6c14\u6ce1\u57281\u79d2\u5185\u6d88\u5931\uff0c\u5982\u679c\u7528\u5e38\u89c4\u7684\u56fe\u50cf\u8bc6\u522b\u5219\u6709\u53ef\u80fd\u65e0\u6cd5\u8bc6\u522b\u5230\uff1b\n :param image_path: \u8981\u8bc6\u522b\u7684\u6a21\u677f\u56fe\u7247\uff1b\n :param screen_time: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff1b\n :param rate: \u8bc6\u522b\u7387\uff1b\n :param pause: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u4e0d\u95f4\u9694\uff1b\n :param max_range: \u622a\u56fe\u7684\u6700\u5927\u6b21\u6570\uff0c\u8fd9\u662f\u4e00\u4e2a\u9884\u8bbe\u503c\uff0c\u4e00\u822c\u60c5\u51b5\u4e0b\u4e0d\u6d89\u53ca\u4fee\u6539\uff1b\n \"\"\"\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001screen_time \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5728\u6b64\u65f6\u95f4\u5185\u4f1a\u4e0d\u65ad\u7684\u8fdb\u884c\u622a\u56fe\u64cd\u4f5c\uff0c\u5c31\u50cf\u5f55\u5236\u89c6\u9891\u4e00\u6837\uff1b 2\u3001pause \u6bcf\u6b21\u622a\u53d6\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u4e00\u523b\u4e0d\u505c\u7684\u622a\u56fe\uff0c\u5982\u679c\u4f60\u60f3\u6bcf\u6b21\u622a\u56fe\u5b58\u5728\u4e00\u4e9b\u95f4\u9694\u65f6\u95f4\u4f20\u5165\u5bf9\u5e94\u7684\u65f6\u95f4\u95f4\u9694\u5373\u53ef\uff0c\u5355\u4f4d\u662f\u79d2\uff0c\u6bd4\u5982\uff1apause = 0.03\uff0c\u8868\u793a 30 ms\uff0c\u76f8\u5f53\u4e8e\u5e27\u7387\u4e3a 30 \u5e27\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-opencv","title":"3\u3001\u4e0d\u4f9d\u8d56 OpenCV \u7684\u56fe\u50cf\u8bc6\u522b\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31","title":"3.1\u3001\u81ea\u7814\u56fe\u50cf\u8bc6\u522b\u6280\u672f","text":"\u3010\u539f\u7406\u3011 \u4e3a\u4e86\u5b9e\u73b0\u8bc6\u522b\u56fe\u50cf\u7684\u76ee\u7684\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u5c06\u56fe\u7247\u7684\u6bcf\u4e2a\u50cf\u7d20\u7684RGB\u503c\uff0c\u4e0e\u6574\u4e2a\u5c4f\u5e55\u4e2d\u7684RGB\u8fdb\u884c\u5bf9\u6bd4\uff0c\u5982\u679c\u5c0f\u56fe\u4e0a\u7684RGB\u503c\u4e0e\u5bf9\u5e94\u5927\u56fe\u4f4d\u7f6e\u7684RGB\u90fd\u76f8\u7b49\uff0c\u5219\u5339\u914d\u6210\u529f\uff0c\u5373\u53ef\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u70b9\u3002 1\u3001\u8bfb\u53d6\u5c0f\u56fe\u548c\u5927\u56fe\u7684RGB\u503c \uff081\uff09\u5c0f\u56fe\u7684RGB\u503c small_data = small_pic.load() # load()\u4f1a\u5c06\u56fe\u7247\u7684RGB\u503c\u83b7\u53d6\u5230\uff0c\u6570\u636e\u683c\u5f0f\u4e3a\u4e00\u4e2a\u4e8c\u7ef4\u5217\u8868\uff0c\u8d4b\u503c\u7ed9\u4e00\u4e2a\u53d8\u91cfsmall_data\u3002\n \uff082\uff09\u5927\u56fe\u7684RGB\u503c big_data = big_pic.load()\n 2\u3001\u5c06\u5c0f\u56fe\u4e0e\u5927\u56fe\u7684RGB\u503c\u8fdb\u884c\u5339\u914d \uff081\uff09\u5339\u914d\u4ece\u5927\u56fe\u7684\u5750\u6807\uff080\uff0c0\uff09\u5f00\u59cb\u5339\u914d\uff0c\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff082\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\uff080\uff0c0\uff09\u5bf9\u5e94\u7684\u6240\u6709\u5c0f\u56fe\u7684RGB\u503c\u4e0d\u76f8\u7b49\uff0c\u5219\u79fb\u52a8\u5230\u4e0b\u4e00\u4e2a\u5750\u6807\u70b9\uff081\uff0c0\uff09\uff0c\u540c\u6837\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff083\uff09\u6309\u7167\u8fd9\u6837\u7684\u89c4\u5f8b\u5c06\u8fd9\u4e00\u884c\u6bcf\u79fb\u52a8\u4e00\u4e2a\u5750\u6807\u70b9\uff0c\u90fd\u5c06\u5c0f\u56fe\u6240\u6709\u7684RGB\u4e0e\u5bf9\u5e94\u5927\u56fe\u7684\u503c\u8fdb\u884c\u5339\u914d\uff1b \uff084\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\u5176\u4e2d\u4e00\u4e2a\u5750\u6807\u70b9\u4e0a\u5339\u914d\u5230\u4e86\u5c0f\u56fe\u7684\u6240\u6709RGB\u503c\uff0c\u5219\u6b64\u65f6\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\u70b9\uff1b \uff085\uff09\u5982\u679c\u5339\u914d\u4e86\u5927\u56fe\u6240\u6709\u7684\u5750\u6807\u70b9\uff0c\u90fd\u6ca1\u6709\u5339\u914d\u5230\uff0c\u5219\u8bf4\u660e\u5927\u56fe\u4e2d\u4e0d\u5b58\u5728\u5c0f\u56fe\uff0c\u5339\u914d\u5931\u8d25\uff1b \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 class ImageRgb:\n@staticmethod\ndef _check_match(_x, _y, small, bdata, sdata, rate):\n\"\"\"\n Matching degree of small graph and large graph matching\n \"\"\"\n@staticmethod\ndef _pre_random_point(small):\n\"\"\"\n Pre matching, take 10-20 points at random each time,\n and take coordinates randomly in the small graph\n \"\"\"\n@staticmethod\ndef _pre_random_match(_x, _y, point_list, bdata, sdata, rate):\n\"\"\"\n In the small graph, several points are randomly\n selected for matching, and the matching degree is\n also set for the random points\n \"\"\"\n@classmethod\ndef match_image_by_rgb(cls, image_name=None, image_path=None, rate=0.9):\n\"\"\"\n By comparing the RGB values of the small image with the large\n image on the screen, the coordinates of the small image on\n the screen are returned.\n \"\"\"\n \u901a\u8fc7 match_image_by_rgb() \u8fd9\u4e2a\u51fd\u6570\uff0c\u4f20\u5165\u76ee\u6807\u5c0f\u56fe\u7684\u6587\u4ef6\u540d\u79f0\uff0c\u5373\u53ef\u8fd4\u56de\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u3002 \u6709\u540c\u5b66\u8981\u95ee\u4e86\uff0c\u6709 OpenCV \u5e72\u561b\u4e0d\u7528\uff0c\u6709\u5fc5\u8981\u81ea\u5df1\u5b9e\u73b0\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u529f\u80fd\u5417\uff0c\u4f60\u4eec\u662f\u4e0d\u662f\u95f2\u7684\u554a\uff1f \u8fd9\u4e48\u95ee\u7684\u8bdd\uff0c\u5c0f\u4e86\uff0c\u683c\u5c40\u5c0f\u4e86\uff1b\u6211\u4eec\u81ea\u5df1\u5b9e\u73b0\u4e3b\u8981\u6709\u51e0\u65b9\u9762\u539f\u56e0\uff1a \u51cf\u5c11\u73af\u5883\u4f9d\u8d56\uff0c\u5373\u4e0d\u7528\u5b89\u88c5 OpenCV\uff0c\u6211\u4eec\u4e5f\u80fd\u5b9e\u73b0\u5176\u529f\u80fd\uff0c\u73af\u5883\u4f9d\u8d56\u8fd9\u5757\u540e\u9762\u4f1a\u5355\u72ec\u8be6\u7ec6\u8bb2\uff0c\u51cf\u5c11\u73af\u5883\u4f9d\u8d56\u5bf9\u4e8e\u4efb\u4f55\u8f6f\u4ef6\u5de5\u7a0b\u90fd\u975e\u5e38\u91cd\u8981\uff1b OpenCV \u5728\u5176\u4ed6\u56fd\u4ea7 CPU \u67b6\u6784\u4e0a\u5b89\u88c5\u5e76\u4e0d\u80fd\u4fdd\u8bc1100%\u6210\u529f\uff0c\u751a\u81f3\u6709\u6ca1\u6709\u53ef\u80fd\u5728\u4e00\u4e9b\u67b6\u6784\u4e0a\u538b\u6839\u513f\u5c31\u4e0d\u80fd\u5b89\u88c5\u4f7f\u7528 OpenCV \uff1f \u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 OpenCV \uff1f\u5c31\u50cf\u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 Windows \u5462\uff1f\u8fd9\u4e9b\u95ee\u9898\u503c\u5f97\u601d\u8003\u3002 \u5f53\u7136\uff0c\u6211\u4eec\u627f\u8ba4\u8fd9\u5957\u65b9\u6848\uff0c\u867d\u7136\u8bc6\u522b\u51c6\u786e\u7387\u6ca1\u95ee\u9898\uff0c\u4f46\u5728\u8bc6\u522b\u6548\u7387\u4e0a\u8fd8\u6ca1\u6709\u8fbe\u5230 OpenCV \u6a21\u677f\u5339\u914d\u7684\u6548\u679c\uff0c\u6211\u4eec\u7684\u65b9\u6848\u6bcf\u6b21\u8bc6\u522b\u5728 1.5s \u5de6\u53f3\uff0c\u800c OpenCV \u5728 1s \u5de6\u53f3\uff1b \u6574\u4f53\u8bc6\u522b\u6548\u679c\u6765\u8bb2\uff0c\u6211\u8ba4\u4e3a\u8fd8\u662f\u53ef\u4ee5\u63a5\u53d7\u7684\uff0c\u4e5f\u5e0c\u671b\u6709\u5fd7\u4e4b\u58eb\u80fd\u4e00\u8d77\u4f18\u5316\u6b64\u65b9\u6848\uff0c\u4e00\u8d77\u6280\u672f\u62a5\u56fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32-rpc","title":"3.2\u3001\u57fa\u4e8e RPC \u670d\u52a1\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b","text":"\u5728\u8fdc\u7a0b\u670d\u52a1\u5668\u4e0a\u90e8\u7f72 OpenCV \u7684\u73af\u5883\uff0c\u5e76\u5c06\u5176\u90e8\u7f72\u4e3a RPC \u670d\u52a1\uff0c\u6d4b\u8bd5\u673a\u4e0a\u4e0d\u7528\u5b89\u88c5 OpenCV \u4f9d\u8d56\uff0c\u800c\u662f\u901a\u8fc7\u8bf7\u6c42 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u3010\u539f\u7406\u3011 \u6d4b\u8bd5\u673a\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u56fe\u7247\u4ee5\u53ca\u6a21\u677f\u56fe\u7247\uff0c\u53d1\u9001\u7ed9 RPC \u670d\u52a1\u7aef\uff0c\u670d\u52a1\u7aef\u62ff\u5230\u4e24\u5f20\u56fe\u7247\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u6700\u540e\u5c06\u8bc6\u522b\u7ed3\u679c\u8fd4\u56de\u7ed9\u6d4b\u8bd5\u673a\uff1b \u8981\u7279\u6b8a\u8bf4\u660e\u7684\u662f\uff1a RPC \u662f\u4e00\u79cd\u534f\u8bae\uff0c\u8bb8\u591a\u8bed\u8a00\u90fd\u662f\u652f\u6301\u7684\uff0c\u6bd4\u5982\u8bf4\u670d\u52a1\u7aef\u4e5f\u53ef\u4ee5\u7528 C++ \u6765\u5b9e\u73b0\uff0c\u5ba2\u6237\u7aef\u4f7f\u7528 Python \u4e5f\u662f\u53ef\u4ee5\u8c03\u7528\u7684\u3002 \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 \u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nimport cv2 as cv\nimport numpy as np\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\nif __name__ == \"__main__\":\nserver = ThreadXMLRPCServer((\"x.x.x.x\", 8889), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(match_image_by_opencv, \"match_image_by_opencv\")\nserver.serve_forever()\n \u8fd9\u6837\uff0c\u6211\u4eec\u57fa\u4e8e Python \u6807\u51c6\u5e93 xmlrpc \u642d\u5efa\u4e86\u4e00\u4e2a RPC \u670d\u52a1\u5668\uff0c\u6ce8\u518c\u4e86 image_put \u548c match_image_by_opencv \u4e24\u4e2a\u529f\u80fd\u63a5\u53e3\uff0c\u5728\u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u901a\u8fc7 IP \u548c\u7aef\u53e3\u8fdb\u884c RPC \u8bf7\u6c42\uff1b \u5ba2\u6237\u7aef\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from xmlrpc.client import Binary\nfrom xmlrpc.client import ServerProxy\nserver = ServerProxy(GlobalConfig.OPENCV_SERVER_HOST, allow_none=True)\nscreen_rb = open(screen, \"rb\")\ntemplate_rb = open(template_path, \"rb\")\ntry:\nscreen_path = server.image_put(Binary(screen_rb.read()))\nscreen_rb.close()\ntpl_path = server.image_put(Binary(template_rb.read()))\ntemplate_rb.close()\nreturn server.match_image_by_opencv(\ntpl_path, screen_path, rate, multiple\n)\nexcept OSError as exc:\nraise EnvironmentError(\nf\"RPC\u670d\u52a1\u5668\u94fe\u63a5\u5931\u8d25. {GlobalConfig.OPENCV_SERVER_HOST}\"\n) from exc\n \u901a\u8fc7\u8fd4\u56de server.match_image_by_opencv \u5c31\u83b7\u53d6\u4e86\u5728\u670d\u52a1\u7aef\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4","title":"4\u3001\u53f3\u952e\u83dc\u5355\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41","title":"4.1\u3001\u53f3\u952e\u83dc\u5355\u5b9a\u4f4d\u7684\u65b9\u6848\u53ca\u95ee\u9898","text":"\u53f3\u952e\u83dc\u5355\u7684\u5143\u7d20\u5b9a\u4f4d\u662f\u4e00\u4e2a\u96be\u70b9\uff0c\u8fc7\u53bb\u6211\u4eec\u8c03\u7814\u548c\u4f7f\u7528\u8fc7\u7684\u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u65b9\u6cd5\u6709 4 \u79cd\uff1a \u7b2c\u4e00\u79cd\uff1a\u6b65\u957f\u64cd\u4f5c\u6cd5 \u5728\u53f3\u952e\u83dc\u5355\u547c\u51fa\u6765\u4e4b\u540e\uff0c\u901a\u8fc7\u952e\u76d8\u7684 up\u3001down \u6309\u952e\uff0c\u8fdb\u884c\u9009\u62e9\u83dc\u5355\u9009\u62e9\uff0c\u9009\u4e2d\u76ee\u6807\u4e4b\u540e enter \u5373\u53ef\uff1b\u6bd4\u5982\uff1a\u5728\u684c\u9762\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\uff0c\u6309 1 \u6b21 down \uff0c\u4f1a\u51fa\u73b0\u4e0b\u56fe\uff1a \u7ee7\u7eed\u518d\u6309 2 \u6b21 down\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u518d\u6309 enter\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u5982\u6b64\uff0c\u201c\u6392\u5e8f\u65b9\u5f0f\u201d\u7684\u6b65\u957f\u4e3a 3\uff1b\u901a\u8fc7\u4f7f\u7528\u952e\u76d8\u4e0a\u4e0b\u952e\uff0c\u5c31\u5b9e\u73b0\u4e86\u5bf9\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\uff1b \u4f46\u662f\uff0c\u8fd9\u79cd\u65b9\u5f0f\u6709\u4e2a\u5f88\u70e6\u4eba\u7684\u95ee\u9898\uff0c\u5c31\u662f\u53f3\u952e\u83dc\u5355\u7684\u9009\u9879\u4f4d\u7f6e\u4e0d\u53ef\u80fd\u4e00\u76f4\u4e0d\u53d8\uff0c\u5728\u9700\u6c42\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\uff0c\u83dc\u5355\u9009\u9879\u7684\u53d8\u5316\u662f\u5f88\u5927\u7684\uff0c\u751a\u81f3\u6709\u4e9b\u5e94\u7528\u652f\u6301\u81ea\u5b9a\u4e49\u83dc\u5355\uff0c\u6bd4\u5982\u6587\u7ba1\u53f3\u952e\u83dc\u5355\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff1b \u4e5f\u5c31\u662f\u8bf4\u4f60\u5f97\u7ecf\u5e38\u53bb\u7ef4\u62a4\u83dc\u5355\u9009\u9879\u7684\u6b65\u957f\uff0c\u4e00\u4e2a\u9009\u9879\u73b0\u5728\u7684\u6b65\u957f\u662f 3\uff0c\u4e0b\u4e2a\u8fed\u4ee3\u53ef\u80fd\u5c31\u662f 4 \u6216\u8005 5\u3002 \u7b2c\u4e8c\u79cd\uff1a\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u6cd5 \u628a\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5355\u72ec\u622a\u56fe\u4fdd\u5b58\uff0c\u56fe\u7247\u4e2d\u4ec5\u5305\u542b\u4e00\u4e2a\u83dc\u5355\u9009\u9879\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u8fd9\u6837\uff0c\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5c31\u53ef\u4ee5\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u65b9\u5f0f\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u8fd9\u79cd\u65b9\u5f0f\u4e0d\u7528\u62c5\u5fc3\u83dc\u5355\u9009\u9879\u7684\u987a\u5e8f\u6216\u4f4d\u7f6e\uff0c\u4f46\u662f\u9700\u8981\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff0c\u4e14\u5bb9\u6613\u53d7\u5230\u5b57\u4f53 UI \u53d8\u66f4\u7c7b\u9700\u6c42\u7684\u5f71\u54cd\uff0c\u6bd4\u5982\uff1a\u5b57\u4f53\u5927\u5c0f\u3001\u5b57\u4f53\u95f4\u8ddd\u7b49\u7b49\u9700\u6c42\u53d8\u66f4\u90fd\u4f1a\u5f71\u54cd\uff0c\u6bcf\u6b21\u53d8\u66f4\u4e4b\u540e\u5c31\u9700\u8981\u8fdb\u884c\u5927\u91cf\u56fe\u7247\u8d44\u6e90\u7684\u91cd\u65b0\u622a\u56fe\u66ff\u6362\uff0c\u662f\u4e2a\u6bd4\u8f83\u9ebb\u70e6\u7684\u4e8b\u60c5\uff1b \u7b2c\u4e09\u79cd\uff1a\u76f8\u5bf9\u4f4d\u79fb\u6cd5 \u9f20\u6807\u70b9\u51fb\u53f3\u952e\u7684\u65f6\u5019\uff0c\u9f20\u6807\u7684\u5f53\u524d\u5750\u6807\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u7684\uff0c\u83dc\u5355\u9009\u9879\u7684\u5bbd\uff08 w \uff09\u4e00\u822c\u662f\u56fa\u5b9a\u7684\uff0c\u53d8\u5316\u7684\u662f\u83dc\u5355\u7684\u957f\u5ea6\uff08 h \uff09\uff0c\u53ef\u4ee5\u901a\u8fc7\u67d0\u4e2a\u9009\u9879\u76f8\u5bf9\u4e8e\u9f20\u6807\u7684\u8ddd\u79bb\u5728\u786e\u5b9a\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u901a\u8fc7\u7ef4\u62a4\u83dc\u5355\u9009\u9879\uff08\u76f8\u5bf9\u4f4d\u7f6e\uff09\u76f8\u5bf9\u4e8e\u9f20\u6807\u4f4d\u7f6e\u7684\u8ddd\u79bb\uff0c\u5373\u53ef\u8f7b\u677e\u8ba1\u7b97\u51fa\u83dc\u5355\u9009\u9879\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\u3002 \u4ece\u7406\u8bba\u4e0a\u6b64\u65b9\u6848\u662f\u53ef\u884c\u7684\uff0c\u4f46\u662f\u8fd9\u91cc\u4ecd\u7136\u5b58\u5728\u4e24\u4e2a\u4e25\u91cd\u7684\u95ee\u9898\uff1a \u83dc\u5355\u987a\u5e8f\u6539\u53d8\uff0c\u5bfc\u81f4\u76f8\u5bf9\u8ddd\u79bb\u6539\u53d8\uff0c\u800c\u4e14\u8ddd\u79bb\u662f\u901a\u8fc7\u50cf\u7d20\uff08px\uff09\u6765\u8868\u793a\u7684\uff0c\u4e0d\u60f3\u6b65\u957f\u90a3\u4e48\u53ea\u7ba1\uff0c\u6bcf\u6b21\u9700\u8981\u53bb\u91cf\u4e00\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u70b9\u9ebb\u70e6\uff1b \u9f20\u6807\u5728\u684c\u9762\u4e0d\u540c\u4f4d\u7f6e\u70b9\u51fb\u53f3\u952e\uff0c\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u4f4d\u7f6e\u662f\u4e0d\u540c\u7684\uff0c\u4e0a\u56fe\u7684\u83dc\u5355\u662f\u5728\u9f20\u6807\u7684\u5de6\u4e0b\u65b9\uff0c\u5982\u679c\u4f60\u79fb\u52a8\u9f20\u6807\u5230\u5c4f\u5e55\u56db\u8fb9\uff0c\u4f60\u4f1a\u53d1\u73b0\uff0c\u53f3\u952e\u83dc\u5355\u53ef\u80fd\u51fa\u73b0\u5728\u9f20\u6807\u7684\u56db\u4e2a\u65b9\u5411\uff0c\u4e5f\u5c31\u662f\u8bf4\u4f60\u9700\u8981\u6839\u636e\u9f20\u6807\u7684\u4e0d\u540c\u4f4d\u7f6e\u6765\u5224\u65ad\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u65b9\u5411\uff0c\u800c\u4e0d\u540c\u7684\u65b9\u5411\u4e0a\u8ba1\u7b97\u65b9\u6cd5\u662f\u4e0d\u540c\u7684\uff0c\u6bd4\u5982\uff1a\u53f3\u952e\u83dc\u5355\u5728\u9f20\u6807\u7684\u5de6\u4e0a\uff0c\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\u8ba1\u7b97\u65b9\u6cd5\u4e3a\uff08x - w / 2\uff0c y - h\uff09\uff0c\u8fd9\u6837\u7ef4\u62a4\u8d77\u6765\u53ef\u4ee5\u8bf4\u975e\u5e38\u590d\u6742\uff1b \u57fa\u4e8e\u4ee5\u4e0a\u4e24\u4e2a\u539f\u56e0\uff0c\u6211\u4eec\u5e76\u4e0d\u63a8\u8350\u8fd9\u79cd\u64cd\u4f5c\u65b9\u6848\u3002 \u7b2c\u56db\u79cd\uff1a\u5c5e\u6027\u5b9a\u4f4d \u6709\u540c\u5b66\u8bf4\u5e72\u561b\u4e0d\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u5462\uff0c\u5176\u5b9e\uff0c\u6211\u4eec\u6700\u5f00\u59cb\u60f3\u5230\u7684\u65b9\u6848\u5c31\u662f\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\uff0c\u4f46\u662f\u5728\u5c5e\u6027\u7684 DOM \u6811\u91cc\u600e\u4e48\u4e5f\u627e\u4e0d\u5230\uff0c\u65e0\u6cd5\u5b9a\u4f4d\u5230\uff0c\u6211\u4eec\u4e5f\u8054\u5408\u7814\u53d1\u540c\u5b66\u4e00\u8d77\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u4f46\u6700\u7ec8\u8fd8\u662f\u6ca1\u80fd\u89e3\u51b3\uff0c\u975e\u5e38\u9057\u61be\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42","title":"4.2\u3001\u6700\u65b0\u7684\u53f3\u952e\u83dc\u5355\u7ec8\u6781\u89e3\u51b3\u65b9\u6848","text":"\u7531\u4e8e\u53f3\u952e\u83dc\u5355\u9009\u9879\u51e0\u4e4e\u90fd\u662f\u6587\u672c\uff0c\u90a3\u4e48\u901a\u8fc7 OCR \u8bc6\u522b\uff0c\u51e0\u4e4e\u662f\u6700\u4f18\u7684\u65b9\u6848\uff1a \u4e0d\u7528\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff1b \u4e0d\u4f1a\u53d7\u5230\u83dc\u5355\u9009\u9879\u987a\u5e8f\u6539\u53d8\u7684\u5f71\u54cd\uff1b \u4e0d\u4f1a\u53d7\u5230\u5b57\u4f53 UI \u53d8\u5316\u7684\u5f71\u54cd\uff1b \u5173\u4e8e OCR \u8bc6\u522b\u6211\u4eec\u5728\u540e\u9762\u4f1a\u8be6\u7ec6\u8bb2\u5230\uff0c\u672c\u7ae0\u8282\u4e3b\u8981\u8bb2\u57fa\u4e8e OCR \u8bc6\u522b\uff0c\u6211\u4eec\u5728\u53f3\u952e\u83dc\u5355\u8bc6\u522b\u4e0a\u7684\u7a81\u7834\u548c\u521b\u65b0\uff1b \u4f7f\u7528 OCR \u8bc6\u522b\u53f3\u952e\u83dc\u5355\u867d\u7136\u5df2\u7ecf\u5f88\u5b8c\u7f8e\u4e86\uff0c\u4f46\u662f\u5728\u4e00\u4e9b\u60c5\u51b5\u4e0b\u4ecd\u7136\u5b58\u5728\u4e00\u70b9\u95ee\u9898\uff0c\u5c31\u662f\u5c4f\u5e55\u4e2d\u51fa\u73b0\u591a\u4e2a\u548c\u83dc\u5355\u9009\u9879\u6587\u5b57\u76f8\u540c\u7684\u6587\u5b57\u65f6\uff0c\u6bd4\u5982\u4e0b\u9762\u8fd9\u79cd\u60c5\u51b5\uff1a \u5c4f\u5e55\u6070\u597d\u51fa\u73b0\u4e86\u4e24\u4e2a\u201c\u590d\u5236\u201d\uff0c\u6b64\u65f6\u8981\u5b9a\u4f4d\u5230\u83dc\u5355\u4e2d\u7684 \u201c\u590d\u5236\u201d\uff0c\u5c31\u9700\u8981\u8fdb\u4e00\u6b65\u505a\u6570\u636e\u5904\u7406\uff0c\u6bd4\u5982\uff1aOCR \u8fd4\u56de 2 \u4e2a\u201c\u590d\u5236\u201d\u7684\u5750\u6807\uff0c\u7528\u4f8b\u91cc\u9762\u6765\u5224\u65ad\u7528\u54ea\u4e2a\uff0c\u4ece\u4e1a\u52a1\u4e0a\u5c06\u5904\u7406\u8d77\u6765\u6bd4\u8f83\u9ebb\u70e6\uff0c\u56e0\u4e3a\u4f60\u5f97\u660e\u786e\u77e5\u9053\u83dc\u5355\u5728\u5de6\u8fb9\u8fd8\u662f\u53f3\u8fb9\uff0c\u7136\u540e\u8fd9\u672c\u8eab\u5c31\u662f\u4e0d\u786e\u5b9a\u7684\uff1b \u600e\u4e48\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u5462\uff0c\u8fd9\u5c31\u8981\u8bf4\u9053\u672c\u7ae0\u7684\u4e3b\u9898\uff1a\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b\u3002 \u3010\u539f\u7406\u3011 \u5728\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u524d\u622a\u4e00\u5f20\u56fe\uff0c\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\u518d\u622a\u53d6\u4e00\u5f20\u56fe\uff0c\u4e24\u5f20\u56fe\u552f\u4e00\u53d8\u5316\u7684\u5c31\u662f\u53f3\u952e\u83dc\u5355\uff0c\u5c06\u5176\u4ed6\u76f8\u540c\u7684\u5730\u65b9\u90fd\u5c4f\u853d\u6389\uff0c\u53ea\u7559\u4e0b\u83dc\u5355\u754c\u9762\uff0c\u5982\u6b64\u5373\u53ef\u6d88\u9664\u5e72\u6270\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u5c06\u4e24\u79cd\u56fe\u505a\u524d\u540e\u5bf9\u6bd4\u63d0\u53d6\u53ef\u4ee5\u5f97\u5230\u8fd9\u6837\u7684\u56fe\uff1a \u4f60\u770b\uff0c\u901a\u8fc7\u524d\u540e\u56fe\u7247\u7684\u5bf9\u6bd4\uff0c\u5c06\u76f8\u540c\u7684\u90e8\u5206\u7ed9\u6d88\u9664\u6389\uff0c\u518d\u8fdb\u884c OCR \u8bc6\u522b\uff0c\u8fd9\u6837\u5c31\u4e0d\u4f1a\u6709\u5e72\u6270\u4e86\uff1b \u4ee3\u7801\u5b9e\u73b0\u8bf7\u67e5\u770b src/filter_image.py \uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def filter_image(action):\n\"\"\"\n \u5bf9\u6bd4\u52a8\u4f5c\u524d\u540e\u4e24\u5f20\u56fe\u7247\uff0c\u63d0\u53d6\u4e0d\u540c\u7684\u90e8\u5206\u751f\u6210\u4e00\u5f20\u65b0\u7684\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u65b0\u56fe\u7247\u7684\u8def\u5f84\n :param action: \u52a8\u4f5c\u51fd\u6570\u7684\u51fd\u6570\u5bf9\u8c61\n :return: \u65b0\u56fe\u7247\u7684\u8def\u5f84\n \"\"\"\n action \u662f\u9f20\u6807\u4e8b\u4ef6\uff0c\u56e0\u4e3a\u6b64\u7c7b\u573a\u666f\u4e0d\u4ec5\u4ec5\u5728\u53f3\u952e\u5b58\u5728\uff0c\u5355\u51fb\u3001\u53cc\u51fb\u7b49\u7b49\uff0c\u53ea\u8981\u64cd\u4f5c\u524d\u540e\u540e\u53d8\u5316\u7684\u90fd\u53ef\u4ee5\uff1a from src.mouse_key import MouseKey\naction = (\nMouseKey.click,\nMouseKey.right_click,\nMouseKey.double_click,\nMouseKey.move_to,\n)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5","title":"5\u3001\u52a8\u6001\u56fe\u50cf\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5728\u684c\u9762\u58c1\u7eb8\u5207\u6362\uff0c\u6216\u770b\u56fe\u3001\u76f8\u518c\u5207\u6362\u56fe\u7247\u7c7b\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u7531\u4e8e\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u662f\u4e0d\u56fa\u5b9a\u7684\uff08\u4e0d\u540c\u7248\u672c\u7684\u7cfb\u7edf\u58c1\u7eb8\u4e0d\u540c\u3001\u58c1\u7eb8\u987a\u5e8f\u4e0d\u540c\uff0c\u770b\u56fe\u76f8\u518c\u5728\u56fe\u7247\u8d44\u6e90\u4e0d\u4e00\u5b9a\u56fa\u5b9a\uff09\uff0c\u90a3\u4e48\u5728\u6d4b\u8bd5\u5207\u6362\u58c1\u7eb8\u6216\u8005\u5207\u6362\u56fe\u7247\u7684\u573a\u666f\u65f6\u5c31\u4f1a\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u4f60\u4e0d\u77e5\u9053\u9884\u671f\u662f\u5565\uff0c\u7528\u4f8b\u64cd\u4f5c\u52a8\u6001\u7684\uff0c\u4e5f\u662f\u6781\u4e0d\u7a33\u5b9a\u3002 \u3010\u539f\u7406\u3011 \u5728\u5207\u6362\u56fe\u7247\u4e4b\u524d\u622a\u56fe\u4fdd\u5b58\u5e76\u8fd4\u56de\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u6b21\u8bc6\u522b\u8fd9\u5f20\u56fe\u7247\uff0c\u5982\u679c\u4e0d\u5b58\u5728\uff0c\u8bf4\u660e\u56fe\u7247\u5df2\u7ecf\u5207\u6362\u4e86\uff1b \u793a\u610f\u56fe\uff1a \u8fd9\u6837\uff0c\u6211\u4eec\u622a\u53d6\u4e86\u5f53\u524d\u56fe\u7247\u4e2d\u6bd4\u8f83\u6709\u4ee3\u8868\u6027\u7684\u4f4d\u7f6e\uff08\u4e00\u53ea\u9e1f\uff09\uff0c\u5728\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u7528\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1a \u6211\u4eec\u518d\u62ff\u7740\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd9\u6837\u5728\u5f53\u524d\u56fe\u7247\u4e2d\uff0c\u5c31\u4e0d\u80fd\u627e\u5230\u8fd9\u53ea\u9e1f\u4e86\uff0c\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u662f False\uff0c\u90a3\u4e48\u4e5f\u5c31\u53ef\u4ee5\u5224\u65ad\u56fe\u7247\u5207\u6362\u662f\u6210\u529f\u7684\u3002 \u4ee3\u7801\u793a\u610f\uff1a def save_temporary_picture(_x: int, _y: int, width: int, height: int):\n\"\"\"\n \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u56fe\u7247\u8def\u5f84\n :param x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n :param y: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n :param width: \u5bbd\u5ea6\n :param height: \u9ad8\u5ea6\n :return: \u56fe\u7247\u8def\u5f84\n \"\"\"\n \u6b64\u51fd\u6570\u7528\u4e8e\u5728\u64cd\u4f5c\u4e4b\u524d\u622a\u56fe\u4e00\u5f20\u4e34\u65f6\u56fe\u7247\uff0c\u8fd4\u56de\u56fe\u7247\u8def\u5f84\uff0c\u6700\u540e\u5728\u65ad\u8a00\u7684\u65f6\u5019\u518d\u5c06\u56fe\u7247\u8def\u5f84\u4f5c\u4e3a\u53c2\u6570\u4f20\u5165\u65ad\u8a00\u8bed\u53e5\u5373\u53ef\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ui","title":"\u4e09\u3001\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_1","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u662f\u6211\u4eec\u81ea\u7814\u7684\u4e00\u79cd\u4f7f\u7528\u7b80\u5355\uff0c\u4e14\u6548\u7387\u6781\u9ad8\u3001\u7a33\u5b9a\u6027\u597d\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u57fa\u4e8e\u5143\u7d20\u6309\u94ae\u5728\u5e94\u7528\u4e2d\u7684\u76f8\u5bf9\u4f4d\u7f6e\uff0c\u52a8\u6001\u83b7\u53d6\u5143\u7d20\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff0c\u9002\u7528\u4e8e\u5404\u79cd\u5c4f\u5e55\u5206\u8fa8\u7387\uff08\u5305\u62ec\u9ad8\u5206\u5c4f\u3001\u5bbd\u5c4f\u3001\u5e26\u9c7c\u5c4f\uff09\uff0c\u5f53\u5143\u7d20\u6309\u94ae\u4f4d\u7f6e\u76f8\u5bf9\u4e8e\u5e94\u7528\u754c\u9762\u4f4d\u7f6e\u53d1\u751f\u4fee\u6539\u4e4b\u540e\uff0c\u53ea\u9700\u8981\u6839\u636e UI \u8bbe\u8ba1\u56fe\u4e0a\u7684\u6e90\u6570\u636e\u4fee\u6539\u5bf9\u5e94\u5750\u6807\u6570\u636e\u5c31\u597d\uff0c\u7ef4\u62a4\u975e\u5e38\u7684\u65b9\u4fbf\u3002 \u6b64\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u9002\u7528\u4e8e\u4e00\u4e9b\u5143\u7d20\u4f4d\u7f6e\u76f8\u5bf9\u4e0e\u5e94\u7528\u754c\u9762\u6bd4\u8f83\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u97f3\u4e50\uff0899% \u7684\u5143\u7d20\u5b9a\u4f4d\u91c7\u7528\u8fd9\u79cd\uff0c\u6548\u679c\u975e\u5e38\u597d\uff09\uff0c\u4e0d\u9002\u7528\u4e8e\u754c\u9762\u4e0d\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u622a\u56fe\u5f55\u5c4f\uff0c\u5f88\u660e\u663e\u4e0d\u9002\u7528\u4e8e\u8fd9\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u3002\u8fd9\u79cd\u5168\u65b0\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u6709\u5b83\u7684\u9002\u7528\u6761\u4ef6\uff0c\u5982\u679c\u4f60\u53d1\u73b0\u4f7f\u7528\u5e38\u89c4\u7684\uff08\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u5b9a\u4f4d\uff09\u4e0d\u597d\u505a\u65f6\uff0c\u4e0d\u59a8\u8003\u8651\u4f7f\u7528\u8fd9\u79cd\uff0c\u5176\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff0c\u5e76\u4e14\u8fc5\u901f\u7231\u4e0a\u4ed6\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_1","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5728 UI \u8bbe\u8ba1\u56fe\u4e2d\u6211\u4eec\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u8fb9\u6846\u7684\u8ddd\u79bb\u7684\uff0c\u7136\u540e\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u6280\u672f\u624b\u6bb5\u83b7\u53d6\u5230\u5e94\u7528\u754c\u9762\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u53ca\u5e94\u7528\u7a97\u53e3\u7684\u5927\u5c0f\uff0c\u793a\u610f\u56fe\u5982\u4e0b\uff1a \uff08x1, y1\uff09\u4e3a\u5e94\u7528\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\uff1b\uff08x2, y2\uff09\u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u5de6\u4e0a\u89d2\uff08x1, y1\uff09\u7684\u5750\u6807\uff0c\u90a3\u4e48\u5b9e\u9645\u4e0a\u3010\u64ad\u653e\u6240\u6709\u3011\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\u4e3a\uff1a\uff08 x1 + x2, y1 + y2 \uff09\uff1b \u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5927\u5c0f\uff08w2, h2\uff09\uff0c\u53ef\u4ee5\u4ece UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\uff1b \u5728 UI \u8bbe\u8ba1\u7a3f\u4e0a\u70b9\u51fb\u3010\u64ad\u653e\u6240\u6709\u3011\u56fe\u6807\uff0c\u7136\u540e\u79fb\u52a8\u9f20\u6807\u5c31\u5c31\u53ef\u4ee5\u770b\u5230\u4e0a\u56fe\u7684\u53c2\u8003\u7ebf\u53ca\u6570\u636e\uff1b \u6240\u4ee5\uff0c\u6211\u4eec\u53ef\u4ee5\u8f7b\u677e\u7684\u83b7\u53d6\u5230\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u4e2d\u5fc3\u5750\u6807\u4e3a\uff1a\uff08 x1 + x2 + (w2 / 2), y1 + y2 + ( h2 / 2) \uff09 \u8be6\u7ec6\u6e90\u4ee3\u7801\u8bf7\u67e5\u770b AT \u57fa\u7840\u6846\u67b6: src/button_center.py \u83b7\u53d6\u5e94\u7528\u7a97\u53e3\u7684\u4fe1\u606f \u4f7f\u7528 xdotool \u548c xwininfo \u83b7\u53d6\u5230\u5e94\u7528\u7a97\u53e3\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u5de6\u4e0a\u89d2\uff09\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a app_id = CmdCtl.run_cmd(f\"xdotool search --classname --onlyvisible {self.app_name}\"\n).split(\"\\n\")\napp_id_list = [int(_id) for _id in app_id if _id]\nreturn CmdCtl.run_cmd(f\"xwininfo -id {app_id_list[self.number]}\")\n \u4f7f\u7528\u6b63\u5219\u83b7\u53d6\u7a97\u53e3\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u83b7\u53d6\u914d\u7f6e \u8bfb ini \u914d\u7f6e\u6587\u4ef6\uff0c\u83b7\u53d6\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e0e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a conf = ConfigParser()\nconf.read(self.config_path)\ndirection = conf.get(btn_name, \"direction\")\nposition = [int(i.strip()) for i in conf.get(btn_name, \"location\").split(\",\")]\n \u8ba1\u7b97\u5143\u7d20\u6309\u94ae\u5750\u6807 \u6839\u636e\u5e94\u7528\u7a97\u53e3\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u5927\u5c0f\u3001\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u5927\u5c0f\uff0c\u4f7f\u7528\u4e00\u5b9a\u7684\u7b97\u6cd5\u5373\u53ef\u8ba1\u7b97\u51fa\u5143\u7d20\u6309\u94ae\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u4e2d\u5fc3\u5750\u6807\uff09\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3","title":"3\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u3010\u914d\u7f6e\u65b9\u6cd5\u3011 \u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u7684\u6570\u636e\u6e90\u662f\u5e94\u7528\u5e93\u4e2d\u7684 ui.ini \u914d\u7f6e\u6587\u4ef6\uff1a ;section\n[\u65b0\u5efa\u6b4c\u5355+] ;key = value\ndirection = left_top\nlocation = 180, 268, 21, 21\n section \u662f\u4f60\u6839\u636e\u5bf9\u5e94\u7684\u5143\u7d20\u6309\u94ae\u547d\u540d\uff0c\u4f60\u53ef\u4ee5\u4efb\u610f\u547d\u540d\uff0c\u4f46\u6700\u597d\u6709\u5177\u4f53\u542b\u4e49\uff0c\u4e14\u80fd\u660e\u786e\u8868\u793a\u8fd9\u4e2a\u5143\u7d20\u6309\u94ae\u7684\u540d\u79f0\uff1b\u7528\u4e2d\u62ec\u53f7\u62ec\u8d77\u6765\u5c31\u884c\uff0c\u6bd4\u5982\uff1a[\u65b0\u5efa\u6b4c\u5355+] \uff1b direction \u662f\u914d\u7f6e\u8be5\u5143\u7d20\u7684\u53c2\u8003\u7cfb\uff0c\u5206\u522b\u4e3a\uff1a left_top \u5de6\u4e0a\uff1b left_bottom \u5de6\u4e0b\uff1b right_top \u53f3\u4e0a\uff1b right_bottom \u53f3\u4e0b\uff1b \u53c2\u8003\u7cfb\u7684\u9009\u53d6\u6807\u51c6\uff1a\u62c9\u52a8\u6539\u53d8\u7a97\u53e3\u5927\u5c0f\u65f6\uff0c\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u53c2\u8003\u7cfb\u4f4d\u7f6e\u662f\u4e0d\u53d8\u7684\uff1b location \u662f\u8be5\u5143\u7d20\u6309\u94ae\u7684\u76f8\u5bf9\u4e0e\u53c2\u8003\u7cfb\u7684 x, y \u7684\u8ddd\u79bb\uff0c\u53ca\u5927\u5c0f(w, h)\uff0c\u8fd9\u56db\u4e2a\u6570\u636e\u53ef\u4ee5\u901a\u8fc7 UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\u6570\u636e\uff0c\u5728\u7f16\u8f91\u6a21\u5f0f\u4e0b\uff0c\u70b9\u51fb UI \u56fe\u4e0a\u7684\u6309\u94ae\uff0c\u53f3\u4fa7\u5c31\u4f1a\u51fa\u73b0\u8be5\u5143\u7d20\u6309\u94ae\u7684 x, y, w, h \u6570\u636e\u3002 \u5982\u679c UI \u56fe\u4e0a\u6ca1\u6709\u63d0\u4f9b\u4f60\u60f3\u8981\u7684\u5143\u7d20\u6570\u636e\uff0c\u4f60\u53ef\u4ee5\u76f4\u63a5\u5728\u7cfb\u7edf\u4e2d\u4f7f\u7528\u622a\u56fe\u5f55\u5c4f\u8fdb\u884c\u5c3a\u91cf\uff0c\u8fd9\u662f\u4e00\u79cd\u4e0d\u63a8\u8350\u4f46\u80fd\u7528\u7684\u65b9\u6cd5\u3002 \u3010\u8c03\u7528\u65b9\u6cd5\u3011 \u5728\u5e94\u7528\u5e93\u65b9\u6cd5\u5c42\u8fd9\u6837\u5199\uff1a def click_add_music_list_btn_in_music_by_ui(self):\n\"\"\"\u70b9\u51fb\u65b0\u5efa\u6b4c\u5355\u6309\u94ae\"\"\"\nself.click(*self.ui.btn_center(\"\u65b0\u5efa\u6b4c\u5355+\"))\n self.ui.btn_center() \u662f\u56fa\u5b9a\u5199\u6cd5\uff0c\u53c2\u6570\u5c31\u662f\u914d\u7f6e\u91cc\u9762\u7684 section \u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ocr","title":"\u56db\u3001OCR \u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_2","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 OCR \u65b9\u6848\u5927\u591a\u91c7\u7528\u8c37\u6b4c OCR\uff08Tesseract\uff09\u65b9\u6848\uff0c\u4f46\u662f\u5b83\u5bf9\u4e8e\u4e2d\u6587\u7684\u8bc6\u522b\u975e\u5e38\u5dee\uff0c\u7ecf\u8fc7\u5927\u91cf\u7684\u8c03\u7814\uff0c\u6211\u4eec\u4f7f\u7528 PaddleOCR\uff0c\u5b83\u662f\u4e00\u4e2a\u5f00\u6e90\u7684\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u8bc6\u522b\u5de5\u5177\uff0c\u4e5f\u662f PaddlePaddle \u6700\u6709\u540d\u7684\u4e00\u4e2a\u5f00\u6e90\u9879\u76ee\uff0c\u611f\u5174\u8da3\u7684\u53ef\u4ee5\u70b9\u8fd9\u91cc\u4e86\u89e3\uff0c\u591a\u7684\u4e0d\u8bf4\u4e86\uff0c\u4f60\u53ea\u9700\u8981\u77e5\u9053\u5b83\u5c31\u662f\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_2","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5b89\u88c5\u4ed6\u662f\u4e2a\u5f88\u9ebb\u70e6\u7684\u4e8b\u60c5\uff0c\u867d\u7136\u64cd\u4f5c\u5f88\u7b80\u5355\uff0c\u4f46\u5176\u5b9e\u5b89\u88c5\u5305\u6709\u70b9\u5927\uff0c\u56e0\u6b64\u6211\u4eec\u4e0d\u5e0c\u671b\u76f4\u63a5\u5728 env.sh \u4e2d\u52a0\u5165\u5b83\uff0c\u8fd9\u4f1a\u8ba9\u6574\u4e2a\u81ea\u52a8\u5316\u73af\u5883\u53d8\u5f97\u975e\u5e38\u81c3\u80bf\uff1b \u56e0\u6b64\uff0c\u6211\u4eec\u60f3\u5230\u5c06\u5b83\u505a\u6210\u4e00\u4e2a RPC \u670d\u52a1\u5728\u5176\u4ed6\u673a\u5668\u4e0a\u90e8\u7f72\uff0c\u6d4b\u8bd5\u673a\u901a\u8fc7\u8fdc\u7a0b\u8c03\u7528 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u4f7f\u7528\u5b83\uff1b RPC \u7684\u8c03\u7528\u903b\u8f91\uff1a \u8fd9\u6837\u6211\u4eec\u53ea\u9700\u8981\u5728\u670d\u52a1\u7aef\u90e8\u7f72\u597d OCR \u8bc6\u522b\u7684\u670d\u52a1\uff0c\u7136\u540e\u901a\u8fc7 RPC \u670d\u52a1\u5c06\u529f\u80fd\u63d0\u4f9b\u51fa\u6765\uff0c\u6846\u67b6\u91cc\u9762\u53ea\u9700\u8981\u8c03\u7528\u5bf9\u5e94\u7684 RPC \u63a5\u53e3\u5c31\u884c\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_1","title":"3\u3001\u4f7f\u7528\u8bf4\u660e","text":"\u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nfrom paddleocr import PaddleOCR\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef paddle_ocr(pic_path, lang):\n\"\"\"\n Paddleocr\u76ee\u524d\u652f\u6301\u7684\u591a\u8bed\u8a00\u8bed\u79cd\u53ef\u4ee5\u901a\u8fc7\u4fee\u6539lang\u53c2\u6570\u8fdb\u884c\u5207\u6362\n \u4f8b\u5982`ch`, `en`, `fr`, `german`, `korean`, `japan`\n :param file_name:\n :param lang:\n :return:\n \"\"\"\nif __name__ == \"__main__\":\nIP = popen(\"hostname -I\").read().split(\" \")[0]\nPORT = 8890\nSCREEN_CACHE = \"/tmp/screen.png\"\nserver = ThreadXMLRPCServer((IP, PORT), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(paddle_ocr, \"paddle_ocr\")\nprint(\"\u76d1\u542c\u5ba2\u6237\u7aef\u8bf7\u6c42\u3002\u3002\")\nserver.serve_forever()\n \u6846\u67b6\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from src import OCR\nOCR.ocr(*target_strings, picture_abspath=None, similarity=0.6, return_default=False, return_first=False, lang=\"ch\"):\n# \u901a\u8fc7 OCR \u8fdb\u884c\u8bc6\u522b\u3002\n# target_strings:\n# \u76ee\u6807\u5b57\u7b26,\u8bc6\u522b\u4e00\u4e2a\u5b57\u7b26\u4e32\u6216\u591a\u4e2a\u5b57\u7b26\u4e32,\u5e76\u8fd4\u56de\u5176\u5728\u56fe\u7247\u4e2d\u7684\u5750\u6807;\n# \u5982\u679c\u4e0d\u4f20\u53c2\uff0c\u8fd4\u56de\u56fe\u7247\u4e2d\u8bc6\u522b\u5230\u7684\u6240\u6709\u5b57\u7b26\u4e32\u3002\n# picture_abspath: \u8981\u8bc6\u522b\u7684\u56fe\u7247\u8def\u5f84\uff0c\u5982\u679c\u4e0d\u4f20\u9ed8\u8ba4\u622a\u53d6\u5168\u5c4f\u8bc6\u522b\u3002\n# similarity: \u5339\u914d\u5ea6\u3002\n# return_default: \u8fd4\u56de\u8bc6\u522b\u7684\u539f\u751f\u6570\u636e\u3002\n# return_first: \u53ea\u8fd4\u56de\u7b2c\u4e00\u4e2a,\u9ed8\u8ba4\u4e3a False,\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u6240\u6709\u6570\u636e\u3002\n# lang: `ch`, `en`, `fr`, `german`, `korean`, `japan`\n \u6b64\u65b9\u6848\u5728\u6846\u67b6\u5185\u6ca1\u6709\u5f15\u5165\u4efb\u4f55\u4e09\u65b9\u4f9d\u8d56\u5b8c\u5168\u91c7\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\uff0c\u800c\u4e14\u4f7f\u7528\u65b9\u6cd5\u975e\u5e38\u7b80\u5355\uff0c\u53ea\u9700\u8981\u901a\u8fc7 OCR.ocr() \u5373\u53ef\uff1b \u5bf9\u4e8e\u4e00\u4e9b\u6587\u6848\u7684\u573a\u666f\u975e\u5e38\u9002\u7528\uff0c\u6b64\u65b9\u6cd5\u76f4\u63a5\u8fd4\u56de\u5750\u6807\uff0c\u53ef\u4ee5\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u3002 \u4e5f\u53ef\u4ee5\u7528\u4e8e\u6587\u5b57\u65ad\u8a00\uff0c\u4ee3\u7801\u793a\u610f\uff1a def assert_ocr_exist(\n*args, picture_abspath=None, similarity=0.6, return_first=False, lang=\"ch\"\n):\n\"\"\"\u65ad\u8a00\u6587\u6848\u5b58\u5728\"\"\"\npic = None\nif picture_abspath is not None:\npic = picture_abspath + \".png\"\nres = OCR.ocr(\n*args,\npicture_abspath=pic,\nsimilarity=similarity,\nreturn_first=return_first,\nlang=lang,\n)\nif res is False:\nraise AssertionError(\n(f\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{args}\", f\"{pic if pic else GlobalConfig.SCREEN_CACHE}\")\n)\nif isinstance(res, tuple):\npass\nelif isinstance(res, dict) and False in res.values():\nres = filter(lambda x: x[1] is False, res.items())\nraise AssertionError(\n(\nf\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{dict(res)}\",\nf\"{pic if pic else GlobalConfig.SCREEN_CACHE}\",\n)\n)\n \u5728\u7528\u4f8b\u4e2d\u4f7f\u7528\u65ad\u8a00\uff0c\u793a\u4f8b\uff1a def test_font_manager_021(self):\n\"\"\"\u53f3\u4fa7\u2665-\u6536\u85cf/\u53d6\u6d88\u6536\u85cf\u5b57\u4f53\"\"\"\n# \u5b57\u4f53\u7ba1\u7406\u5668\u754c\u9762\u53f3\u4fa7\u8be6\u60c5\u5217\u8868\uff0c\u9009\u62e9\u672a\u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e / \u6536\u85cf\u5b57\u4f53\n# \u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e\u83dc\u5355\u663e\u793a\u201c\u53d6\u6d88\u6536\u85cf\u201d\uff1b\n...\nself.assert_ocr_exist(\"\u53d6\u6d88\u6536\u85cf\")\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_1","title":"4\u3001\u670d\u52a1\u7aef\u90e8\u7f72","text":"\u6211\u4eec\u76ee\u524d\u662f\u5c06 OCR \u670d\u52a1\u90e8\u7f72\u5728\u666e\u901a\u7684\u529e\u516c\u673a\u4e0a\u7684\uff0c\u5982\u679c\u4f60\u89c9\u5f97\u73b0\u6709\u7684 OCR \u8bc6\u522b\u6027\u80fd\u4e0d\u591f\u597d\uff0c\u6070\u597d\u4f60\u6709\u66f4\u597d\u7684\u673a\u5668\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u5176\u79c1\u6709\u5316\u90e8\u7f72\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41_1","title":"4.1\u3001\u73af\u5883\u5b89\u88c5","text":"\u63a8\u8350\u4f7f\u7528 pipenv \u8fdb\u884c\u73af\u5883\u642d\u5efa\uff1b \u5b89\u88c5 pipenv \uff1a sudo pip3 install pipenv\n \u65b0\u5efa\u4e00\u4e2a\u76ee\u5f55\u4f5c\u4e3a\u73af\u5883\u5305 ocr_env\uff1a cd ~\nmkdir ocr_env\n \u521b\u5efa python 3.7 \u73af\u5883\uff1a cd ocr_env\npipenv --python 3.7\n \u5b89\u88c5 OCR \u4f9d\u8d56\u5305\uff1a pipenv install paddlepaddle -i https://mirror.baidu.com/pypi/simple\npipenv install \"paddleocr>=2.0.1\" -i https://mirror.baidu.com/pypi/simple\n \u4e0d\u51fa\u610f\u5916\uff0c\u8fd9\u6837\u5c31\u628a\u4f9d\u8d56\u5b89\u88c5\u597d\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42_1","title":"4.2\u3001\u542f\u52a8\u670d\u52a1","text":"\u5c06\u57fa\u7840\u6846\u67b6\u4e2d\u7684 scr/ocr/pdocr_rpc_server.py \u6587\u4ef6\u62f7\u8d1d\u5230 ocr_env \u76ee\u5f55\uff0c\u540e\u53f0\u6267\u884c\u5b83\u5c31\u597d\u4e86\uff1a cd ocr_env\nnohup pipenv run python pdocr_rpc_server.py &\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#43","title":"4.3\u3001\u914d\u7f6e\u5f00\u673a\u81ea\u542f\uff08\u901a\u7528\uff09","text":"\u4f60\u80af\u5b9a\u4e0d\u60f3\u6bcf\u6b21\u673a\u5668\u91cd\u542f\u4e4b\u540e\u90fd\u9700\u8981\u624b\u52a8\u542f\u52a8\u670d\u52a1\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u914d\u7f6e\u5f00\u673a\u81ea\u542f\u3002 \u5199\u5f00\u673a\u81ea\u542f\u670d\u52a1\u6587\u4ef6\uff1a sudo vim /lib/systemd/system/ocr.service\n autoocr \u540d\u79f0\u4f60\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff0c\u5199\u5165\u4ee5\u4e0b\u5185\u5bb9\uff1a [Unit]\nDescription=OCR Service\nAfter=multi-user.target\n\n[Service]\nUser=uos\nGroup=uos\nType=idle\nWorkingDirectory=/home/uos/ocr_env\nExecStart=pipenv run python pdocr_rpc_server.py\n\n[Install]\nWantedBy=multi-user.target\n \u6ce8\u610f\u66ff\u6362\u4f60\u7684${USER} \u4fee\u6539\u914d\u7f6e\u6587\u4ef6\u7684\u6743\u9650\uff1a sudo chmod 644 /lib/systemd/system/ocr.service\n \u81ea\u542f\u670d\u52a1\u751f\u6548\uff1a sudo systemctl daemon-reload\nsudo systemctl enable ocr.service\n \u67e5\u770b\u670d\u52a1\u72b6\u6001\uff1a sudo systemctl status ocr.service\n \u4f60\u53ef\u4ee5\u518d\u91cd\u542f\u4e0b\u7535\u8111\uff0c\u770b\u770b\u670d\u52a1\u662f\u4e0d\u662f\u6b63\u5e38\u542f\u52a8\u4e86\uff0c\u6ca1\u62a5\u9519\u5c31 OK \u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_4","title":"\u4e94\u3001\u5c5e\u6027\u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_3","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 UI \u81ea\u52a8\u5316\u5927\u591a\u90fd\u662f\u57fa\u4e8e\u6d4f\u89c8\u5668\u7684\uff0c\u6838\u5fc3\u662f\u5728\u7f51\u9875\u7684 DOM \u6811\u4e0a\u67e5\u627e\u5143\u7d20\uff0c\u5e76\u5bf9\u5176\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\uff1b Linux \u684c\u9762\u5e94\u7528\u5927\u591a\u662f\u91c7\u7528 Qt \u7f16\u5199\u7684\uff0c\u5728 Qt \u4e2d\u4e5f\u662f\u4ece\u6700\u9876\u5c42\u7684 MainWindow \u5f00\u59cb\u6784\u5efa\u5e94\u7528\uff0c\u6240\u4ee5\u903b\u8f91\u4e5f\u662f\u4e00\u6837\u7684\uff0cQt \u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u540c\u6837\u53ef\u4ee5\u901a\u8fc7 DOM \u6811\uff08\u5c5e\u6027\u6811\uff09\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff0c\u6211\u4eec\u79f0\u4e4b\u4e3a\u5c5e\u6027\u5b9a\u4f4d\u3002 \u501f\u52a9\u5f00\u6e90\u5de5\u5177 dogtail \u6211\u4eec\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u83b7\u53d6\uff0c\u4ece\u800c\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\u3002dogtail \u7684\u9879\u76ee\u4ecb\u7ecd\u53ef\u4ee5\u731b\u6233\u8fd9\u91cc\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_3","title":"2\u3001\u4f7f\u7528\u65b9\u6cd5","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#21sniff","title":"2.1\u3001sniff\uff08\u55c5\u63a2\u5668\uff09\u4f7f\u7528","text":"\u5728\u7ec8\u7aef\u8f93\u5165 sniff \u542f\u52a8 AT-SPI Browser mikigo@mikigo-PC:~$ sniff\n \u67e5\u770b\u5e94\u7528\u7684\u6807\u7b7e \u5728 sniff \u91cc\u9762\u53ef\u4ee5\u770b\u5230\u7cfb\u7edf\u4e2d\u5df2\u542f\u52a8\u7684\u5e94\u7528\uff0c\u70b9\u51fb\u5e94\u7528\u540d\u79f0\u524d\u9762\u7684\u4e09\u89d2\u5f62\u56fe\u6807\uff0c\u53ef\u4ee5\u5c55\u5f00\u5e94\u7528\u7684\u6807\u7b7e\uff0c\u6240\u6709\u6807\u7b7e\u4ee5 tree \u7684\u5f62\u5f0f\u5c55\u793a\uff0c\u5bf9\u5e94\u5e94\u7528\u91cc\u9762\u7684\u7236\u7a97\u53e3\u548c\u5b50\u7a97\u53e3\u3002 \u83b7\u53d6\u5143\u7d20\u63a7\u4ef6\u7684\u6807\u7b7e\u540d\u79f0 \u9996\u5148\uff0c\u4e3a\u4e86\u65b9\u4fbf\u67e5\u770b\u5143\u7d20\u63a7\u4ef6\u5bf9\u5e94\u7684\u4f4d\u7f6e\uff0c\u5efa\u8bae\u73b0\u5728\u4e0a\u65b9\u5de5\u5177\u680f\u70b9\u51fb Actions\uff0c\u7136\u540e\u52fe\u9009 Hightlight Items\uff0c\u8fd9\u6837\u5728 sniff \u4e2d\u9f20\u6807\u9009\u4e2d\u5143\u7d20\u6807\u7b7e\u7684\u65f6\u5019\uff0c\u5e94\u7528\u4e2d\u4f1a\u6709\u76f8\u5e94\u7684\u5149\u6807\u9501\u5b9a\u3002 \u5728 sniff \u91cc\u9762\u70b9\u51fb\u8fdb\u5165\u5e94\u7528\u7684\u6807\u7b7e tree \u4e2d\u540e\uff0c\u70b9\u51fb\u76f8\u5e94\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5728\u5de5\u5177\u4e0b\u65b9\uff0c\u4f1a\u5c55\u793a\u5143\u7d20\u63a7\u4ef6\u7684 Name\uff0c\u8fd9\u4e2a\u5c31\u662f\u6807\u7b7e\u540d\u79f0\u3002 \u5728 tree \u4e2d\u6709\u4e9b\u5730\u65b9\u662f\u7a7a\u767d\u7684\u6216\u8005\u662f Form\uff0c\u662f\u56e0\u4e3a\u5f00\u53d1\u4eba\u5458\u5728\u6dfb\u52a0\u6807\u7b7e\u7684\u65f6\u5019\u6ca1\u6709\u6dfb\u52a0\uff0c\u6216\u8005\u6709\u4e9b\u7236\u7a97\u53e3\u4e0d\u9700\u8981\u6dfb\u52a0\uff0c\u8fd9\u79cd\u5728\u5b9e\u9645\u4e1a\u52a1\u4e2d\u662f\u4e0d\u5f71\u54cd\u7684\uff0c\u6211\u4eec\u53ea\u8981\u4fdd\u8bc1\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\u4e2d\uff0c\u8981\u7528\u5230\u7684\u5143\u7d20\u90fd\u6dfb\u52a0\u4e86\u6807\u7b7e\u5373\u53ef\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#22","title":"2.2\u3001\u5143\u7d20\u64cd\u4f5c","text":"\u83b7\u53d6\u5e94\u7528\u5bf9\u8c61 dogtail \u83b7\u53d6\u5e94\u7528\u5bf9\u8c61\u7684\u65f6\u5019\uff0c\u4f7f\u7528\u7684\u662f tree \u5e93\u91cc\u9762\u7684 application() \u65b9\u6cd5\uff1a from dogtail.tree import root\napp_obj = root.application('deepin-music')\n app_obj\u5c31\u662f\u5e94\u7528\u7684\u5bf9\u8c61\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\uff0c\u662f\u5e94\u7528\u5bf9\u8c61\u4f7f\u7528child()\u65b9\u6cd5\uff1a element = app_obj.child('element_name')\n \u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u4f20\u5165\u5143\u7d20\u7684 Name\uff0c\u83b7\u53d6\u5230\u76f8\u5e94\u5143\u7d20\u7684\u5bf9\u8c61\u3002Name \u53ef\u4ee5\u901a\u8fc7 sniff \u67e5\u770b\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\u5217\u8868: element_list = element.children\n \u83b7\u53d6\u5230\u8fd9\u4e2a\u5143\u7d20\u4e0b\u9762\u6240\u6709\u7684\u5143\u7d20\u5217\u8868\u3002 \u8fd9\u4e2a\u65b9\u6cd5\u9002\u7528\u4e8e\u6709\u4e9b\u6807\u7b7e\u6ca1\u6709\u6dfb\u52a0\uff0c\u4f46\u662f\u4f4d\u7f6e\u662f\u56fa\u5b9a\u7684\uff0c\u6211\u4eec\u901a\u8fc7\u7d22\u5f15\u53ef\u4ee5\u53d6\u5f97\u5143\u7d20\u3002 element_list[0]\n \u5bf9\u5143\u7d20\u7684\u64cd\u4f5c \u5728\u83b7\u53d6\u5230\u5143\u7d20\u4e4b\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u76f8\u5e94\u7684\u64cd\u4f5c\u3002 \u5355\u51fb element.click(button=1)\n button 1 \u2014>\u5de6\u952e\uff0c2 \u2014>\u6eda\u8f6e\uff0c3 \u2014>\u53f3\u952e\uff0c\u9ed8\u8ba4\u4e3a 1 \u53cc\u51fb element.doubleClick(button=1)\n \u9f20\u6807\u60ac\u505c element.point()\n \u9f20\u6807\u79fb\u52a8\u5230\u5143\u7d20\u4e2d\u5fc3\u4f4d\u7f6e \u6587\u672c\u8f93\u5165 element.typeText(string)\n \u5411\u5143\u7d20\u5bf9\u8c61\u8f93\u5165\u5b57\u7b26\u4e32 \uff0c\u6bd4\u5982\u8f93\u5165\u6846 \u7ec4\u5408\u952e element.keyCombo(comboString)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#23","title":"2.3\u3001\u6846\u67b6\u5c01\u88c5","text":"\u4ee3\u7801\u793a\u4f8b\uff1a # \u8be6\u7ec6\u4ee3\u7801\u8bf7\u67e5\u770b src/dogtail_utils.py\nclass DogtailUtils:\ndef __init__(self, name=None, description=None):\nself.name = name\nself.description = description\nself.obj = root.application(self.name, self.description)\ndef app_element(self, *args, **kwargs):\n\"\"\"\n \u83b7\u53d6app\u5143\u7d20\u7684\u5bf9\u8c61\n :return: \u5143\u7d20\u7684\u5bf9\u8c61\n \"\"\"\nreturn self.obj.child(*args, **kwargs, retry=False)\ndef element_center(self, element) -> tuple:\n\"\"\"\n \u83b7\u53d6\u5143\u7d20\u7684\u4e2d\u5fc3\u4f4d\u7f6e\n :param element:\n :return: \u5143\u7d20\u4e2d\u5fc3\u5750\u6807\n \"\"\"\n_x, _y, _w, _h = self.app_element(element).extents\n_x = _x + _w / 2\n_y = _y + _h / 2\nreturn _x, _y\n \u6846\u67b6\u63d0\u4f9b\u7684\u63a5\u53e3\u975e\u5e38\u7b80\u6d01\uff0c\u5728\u8c03\u7528\u65f6\uff1a self.dog.element_center(\"\u64ad\u653e\")\n \u8fd9\u6837\u5c31\u80fd\u83b7\u53d6\u5230\u6b64\u5143\u7d20\u7684\u4e2d\u5fc3\u5750\u6807\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_5","title":"\u516d\u3001\u6807\u7b7e\u5316\u7ba1\u7406","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_4","title":"1\u3001\u6807\u7b7e\u8bf4\u660e","text":"\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u811a\u672c ID\uff1a\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c/\u51fd\u6570 ID\uff1b PMS\u7528\u4f8bID\uff1aPMS \u4e0a\u5bf9\u5e94\u7684\u7528\u4f8b ID\uff08\u7528\u4f8b\u5e93 ID\uff09\uff1b \u9ed8\u8ba4\u4f7f\u7528\u7528\u4f8b\u5e93 ID\uff0c\u5bf9\u4e8e\u6682\u65f6\u6ca1\u6709\u4f7f\u7528\u7528\u4f8b\u5e93\u7ba1\u7406\u7528\u4f8b\u7684\u9879\u76ee\uff0c\u53ef\u4ee5\u4f7f\u7528\u4ea7\u54c1\u5e93\u7528\u4f8b ID\uff1b \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1aFUNC\uff08\u529f\u80fd\uff09\u3001PERF\uff08\u6027\u80fd\uff09\u3001STR\uff08\u538b\u529b\uff09\u3001SEC\uff08\u5b89\u5168\uff09\u3001CTS\uff08\u517c\u5bb9\u6027\uff09\u3001API\uff08\u63a5\u53e3\uff09\u3001BASELINE\uff08\u57fa\u7ebf-\u9884\u7559\uff09 \u8bbe\u5907\u7c7b\u578b\uff1aPPL\uff08\u4f9d\u8d56\u5916\u8bbe\u7684\u7528\u4f8b\uff09\u3001COL\uff08\u4f9d\u8d56\u4e3b\u63a7\u673a\u7684\u7528\u4f8b\uff09 \u7528\u4f8b\u6765\u6e90\uff1aBUG\uff08\u7531 Bug \u8f6c\u7684\u7528\u4f8b\uff09 \u4e0a\u7ebf\u5bf9\u8c61\uff1aCICD\uff0c\u8868\u793a\u4e0a\u7ebf\u5230 CICD \u6d41\u6c34\u7ebf\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u53ef\u4e00\u952e\u751f\u6210 case_list.csv \u6587\u4ef6\uff0c\u7528\u4e8e\u5bfc\u5165\u5230\u660e\u9053\u4e91 AT \u7528\u4f8b\u5217\u8868\u4e2d\u63a7\u5236 CICD \u8dd1\u6d4b\u8303\u56f4\uff1b \u6d4b\u8bd5\u7ea7\u522b\uff1aC1 / C2 / C3 / C4\uff0c\u5177\u4f53\u5b9a\u4e49\u53c2\u8003\u6d41\u6c34\u7ebf\u4f7f\u7528\u6307\u5bfc\uff1b \u8df3\u8fc7\u539f\u56e0\uff1askip-XXX\uff0c\u7528\u4e8e\u63a7\u5236\u7528\u4f8b\u662f\u5426\u6267\u884c\uff1b \u786e\u8ba4\u4fee\u590d\uff1afixed-XXX\uff0c\u7528\u4e8e\u6807\u8bb0\u7528\u4f8b\u7684\u4fee\u590d\u72b6\u6001\uff08\u540e\u9762\u8be6\u7ec6\u8bb2\u89e3\u7528\u6cd5\uff09\uff1b \u5e9f\u5f03\u7528\u4f8b\uff1aremoved-\u5df2\u5e9f\u5f03\uff0c\u7528\u4e8e\u6807\u8bb0\u5df2\u7ecf\u5e9f\u5f03\u7684\u7528\u4f8b\uff0c\u6b64\u7528\u4f8b\u6807\u7b7e\u4e0d\u4f1a\u88ab\u6dfb\u52a0\uff0c\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff1b \u793a\u4f8b\uff1a \u811a\u672cID PMS\u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u8bbe\u5907\u7c7b\u578b \u7528\u4f8b\u6765\u6e90 \u4e0a\u7ebf\u5bf9\u8c61 \u6d4b\u8bd5\u7ea7\u522b \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b ... 679537 679537 L1 FUNC PPL CICD C1 skip-XXX fixed-XXX removed-\u5df2\u5e9f\u5f03 ..."},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_4","title":"2\u3001\u64cd\u4f5c\u6b65\u9aa4","text":"2.1\u3001\u5728\u5b50\u9879\u76ee\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u4ee5\u7528\u4f8b\u7684 py \u6587\u4ef6\u9664\u53bb\u9996\u5b57\u7b26\u4e32 \"test_\" \u548c\u7528\u4f8b\u5e8f\u53f7\u540e\u7684\u5b57\u7b26\u4e32\u4f5c\u4e3a csv \u7684\u6587\u4ef6\u540d\u3002 \u4f8b\u5982: \u76f8\u518c\u7684\u7528\u4f8b\u6587\u4ef6\u4e3a test_album_xxx.py\uff0cxxx \u8868\u793a\u7528\u4f8b\u7684ID\uff08\u4e5f\u53ef\u4ee5\u662f\u81ea\u5b9a\u4e49\u7684\u6570\u5b57\u4ee3\u8868\u7528\u4f8b\u5e8f\u53f7\uff09\uff0c\u6b64\u65f6 csv \u6587\u4ef6\u540d\u5c31\u5e94\u4e3a album.csv\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u6240\u6709 csv \u6587\u4ef6\u5efa\u8bae\u653e\u5728\u4e00\u4e2a tags \u76ee\u5f55\u4e0b\u3002 \u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 2.2\u3001\u7b2c\u4e00\u5217\u4e3a\u811a\u672c ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b\u7528\u4f8b\u6807\u7b7e\u53ef\u4ee5\u65e0\u5e8f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_2","title":"3\u3001\u589e\u52a0\u8bf4\u660e","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_1","title":"3.1\u3001\u8df3\u8fc7\u7528\u4f8b","text":"\u4f20\u7edf\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668(@pytest.mark.skip)\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a; \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#311","title":"3.1.1\u3001\u56fa\u5b9a\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 679537 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u7b7e\u5f00\u5934\u4e3a \u201cskip-XXX\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\uff0c\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\u5219\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u7b7e\u4e3a SKIPED\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#312","title":"3.1.2\u3001\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skipif_platform-aarch64&mips64 \u67d0\u4e9b\u7528\u4f8b\u4f1a\u56e0\u4e3a\u4e0d\u540c\u7684\u73af\u5883\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\uff0c\u5e38\u89c1\u7684\u573a\u666f\u4e3a\u5728\u4e0d\u540c\u67b6\u6784\u4e0a\u5224\u65ad\u662f\u5426\u6267\u884c\uff0c\u8df3\u8fc7\u7684\u539f\u56e0\u6807\u7b7e\u4e3a \u201cskipif_platform-\u201d \u52a0\u67b6\u6784\u540d\uff0c\u591a\u4e2a\u67b6\u6784\u4e4b\u95f4\u4f7f\u7528 \u201c&\u201d \u62fc\u63a5\uff1b \u4ee5\u4e0a\u4f8b\u5b50\u4e3a\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u5224\u65ad\u5f53\u524d\u67b6\u6784\u662f\u5426\u4e3a arrch64 \u6216\u8005 mips64\uff0c\u82e5\u662f\uff0c\u5219\u8df3\u8fc7\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u82e5\u5426\u5219\u6267\u884c\u7528\u4f8b\uff1b \u76ee\u524d\u6846\u67b6\u9ed8\u8ba4\u4ec5\u652f\u6301\u67b6\u6784\u7684\u6761\u4ef6\u5224\u65ad\uff0c\u4f46\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u903b\u8f91\u652f\u6301\u81ea\u5b9a\u4e49\u6dfb\u52a0\u3002 \u5728\u9879\u76ee\u76ee\u5f55\u8def\u5f84\u4e0b\u5b58\u5728\u6587\u4ef6 setting/skipif.py\uff0c\u6240\u6709\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u7684\u51fd\u6570\u5199\u5728\u6b64\u6587\u4ef6\u4e2d\u3002 \u9ed8\u8ba4\u67b6\u6784\u5224\u65ad\u4f8b\u5b50\uff1a def skipif_platform(args: str):\n\"\"\"\u5e73\u53f0\u8df3\u8fc7\"\"\"\n_skip_key = args.split(\"&\")\nfor key in _skip_key:\nif GlobalConfig.SYS_ARCH == key:\nreturn True\nreturn False\n \u65b9\u6cd5\u7f16\u5199\u89c4\u8303\uff1a \u65b9\u6cd5\u540d\u5fc5\u987b\u4ee5 skipif \u5f00\u5934\uff1b \u65b9\u6cd5\u5fc5\u987b\u6709\u8fd4\u56de\u7ed3\u679c\u5e76\u4e14\u4e3a\u5e03\u5c14\u503c\uff08True \u4ee3\u8868\u8df3\u8fc7\uff0cFalse \u4ee3\u8868\u4e0d\u8df3\u8fc7\uff09\uff1b \u65b9\u6cd5\u53ea\u80fd\u6709\u4e00\u4e2a\u5165\u53c2\uff1b \u5728 csv \u6587\u4ef6\u8df3\u8fc7\u539f\u56e0\u4e00\u680f\u4e2d\u586b\u5199\u4e3a \u201c{\u51fd\u6570\u540d}-{\u53c2\u6570}\u201d\uff0c\u4f8b\u5982\uff1askipif_platform-aarch64\uff1b\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u4f1a\u4ee5\u7b2c\u4e00\u4e2a \u201c-\u201d \u8fdb\u884c\u5206\u5272\uff0c\u622a\u53d6\u7684\u5de6\u4fa7\u5b57\u7b26\u4e32\u4f5c\u4e3a\u51fd\u6570\u540d\uff0c\u5728 skipif.py \u6587\u4ef6\u4e2d\u67e5\u627e\u662f\u5426\u6709\u540c\u540d\u51fd\u6570\uff0c\u5e76\u5c06\u622a\u53d6\u7684\u53f3\u4fa7\u4f5c\u4e3a\u53c2\u6570\u4f20\u9012\u7ed9\u8be5\u51fd\u6570\uff0c\u901a\u8fc7\u83b7\u53d6\u8be5\u51fd\u6570\u8fd4\u56de\u7684\u5e03\u5c14\u503c\uff0c\u8fd4\u56de True\uff0c\u5219\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u8fd4\u56de False\uff0c\u5219\u6267\u884c\u8be5\u7528\u4f8b\u3002 \u82e5\u51fd\u6570\u9700\u8981\u591a\u4e2a\u53c2\u6570\uff0c\u53ef\u81ea\u5b9a\u4e49\u591a\u4e2a\u53c2\u6570\u4e4b\u95f4\u7684\u8fde\u63a5\u7b26\uff0c\u8fde\u63a5\u7b26\u53f7\u4e0d\u53ef\u4f7f\u7528\u4e0b\u5212\u7ebf\u548c\u9017\u53f7\uff0c\u63a8\u8350\u7edf\u4e00\u4f7f\u7528 & \u7b26\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32","title":"3.2\u3001\u786e\u8ba4\u4fee\u590d","text":"\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7528\u4f8b\u4fee\u590d\u540e\uff0c\u4f46\u4e0d\u80fd\u7acb\u5373\u5220\u9664\u8df3\u8fc7\u539f\u56e0\uff08skip-XXX\uff09\u7684\u7528\u4f8b\uff0c\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u786e\u8ba4\u4fee\u590d\u201d\uff0c\u4f5c\u4e3a\u6807\u8bb0\u8be5\u7528\u4f8b\u662f\u5426\u5df2\u7ecf\u4fee\u590d\uff0c\u56fa\u5b9a\u586b\u5165\u5b57\u6bb5\u4e3a \u201cfixed-\u5df2\u4fee\u590d\u201d\u3002\u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u5373\u4f7f\u540c\u65f6\u6807\u8bb0\u4e86 skip-XXX \u4e5f\u4f1a\u6b63\u5e38\u6267\u884c\u3002 \u793a\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d 679537 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d \u3010\u540c\u65f6\u6807\u8bb0\u4e86skip \u548c fixed\uff0c\u4f46\u4ecd\u7136\u60f3\u8981\u8df3\u8fc7\u7528\u4f8b\u3011 \u5f53 \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u540c\u65f6\u586b\u5165\u540e\uff0c\u547d\u4ee4\u884c\u4f20\u9012\u53c2\u6570 --ifixed yes\uff0c\u5219\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\u8be5\u6761\u7528\u4f8b\u3002 python3 manage.py run --ifixed yes\n \u770b\u5230\u8fd9\u91cc\u6709\u4e9b\u540c\u5b66\u53ef\u80fd\u8981\u95ee\u4e86\uff0c\u6211\u60f3\u6062\u590d\u8df3\u8fc7\u6267\u884c\uff0c\u76f4\u63a5\u628a skip-XXX \u8fd9\u4e00\u5217\u6807\u7b7e\u5220\u6389\u4e0d\u5c31\u597d\u4e86\uff0c\u8fd8\u641e\u4ec0\u4e48\u786e\u8ba4\u4fee\u590d\u5e72\u5565\uff1f \u8fd9\u91cc\u7ed9\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u89e3\u91ca\u4e00\u4e0b\uff1a \uff08\u4ee5\u4e0b\u6d41\u6c34\u7ebf\u6307\u7684\u662f\u6bcf\u65e5\u6784\u5efa\u7684\u6d41\u6c34\u7ebf\uff0c\u8dd1 AT \u7684\u5168\u91cf\u7528\u4f8b\uff09 \u9996\u5148\uff0c\u6d41\u6c34\u7ebf\u4e0a\u8dd1\u7684\u662f AT \u5386\u53f2 Tag\uff0c\u8df3\u8fc7\u7528\u4f8b\u7684\u6807\u7b7e(skip-XXX) \u662f\u5728\u6700\u65b0\u7684\u4ee3\u7801\u4e0a\u63d0\u4ea4\u7684\uff0c\u6211\u4eec\u91c7\u7528\u6700\u65b0\u7684 csv \u6587\u4ef6\u8986\u76d6\u5386\u53f2 csv \u6587\u4ef6\u7684\u8bbe\u8ba1\u6765\u5b9e\u73b0\u4e86\u5bf9\u5386\u53f2 Tag \u4e0a\u7528\u4f8b\u7684\u8df3\u8fc7\uff1b \u7136\u540e\uff0c\u5728\u65e5\u5e38\u8df3\u8fc7\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u540c\u65f6\u4e5f\u5728\u4fee\u590d\u4e00\u4e9b\u7528\u4f8b\uff0c\u4fee\u590d\u540e\u7684\u8fd9\u4e9b\u7528\u4f8b\u5728\u672c\u5730\u8c03\u8bd5\u7684\u65f6\u5019\u6211\u4eec\u4e0d\u5e0c\u671b\u7ee7\u7eed\u8df3\u8fc7\uff0c\u4f46\u662f\u6b64\u65f6\uff0c\u4fee\u590d\u7684\u8fd9\u4e9b\u7528\u4f8b\u53ef\u80fd\u8fd8\u4e0d\u7a33\u5b9a\uff0c\u4e0d\u9002\u5408\u9a6c\u4e0a\u653e\u5230\u6d41\u6c34\u7ebf\u53bb\u8dd1\uff0c\u4e5f\u5c31\u662f\u8bf4\u6d41\u6c34\u7ebf\u4e0a\u6211\u4eec\u662f\u5e0c\u671b\u4ed6\u7ee7\u7eed\u8df3\u8fc7\u7684\uff0c\u56e0\u6b64\uff0c\u54b1\u4e0d\u80fd\u76f4\u63a5\u628a skip-XXX \u5e72\u6389\uff1b \u8fd9\u91cc\u5c31\u77db\u76fe\u4e86\uff0c\u4e00\u4e2a\u9700\u6c42\u662f\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u53e6\u4e00\u4e2a\u9700\u6c42\u53c8\u4e0d\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u600e\u4e48\u529e\u5462\uff1f \u6211\u4eec\u4f7f\u7528\u201c\u786e\u8ba4\u4fee\u590d\u201d\u6765\u6807\u8bb0\u8fd9\u6761\u7528\u4f8b\u5df2\u7ecf\u4fee\u590d\u4e86\uff0c\u8fd9\u6837\u4f60\u672c\u5730\u8c03\u8bd5\u7528\u4f8b\u7684\u65f6\u5019\u8fd9\u6761\u5df2\u4fee\u590d\u7684\u7528\u4f8b\u662f\u4f1a\u6267\u884c\u7684\uff0c\u540c\u65f6\u5728\u6d41\u6c34\u7ebf\u4e0a\u5c06 --ifixed yes \u53c2\u6570\u52a0\u4e0a\uff0c\u90a3\u4e48\u6d41\u6c34\u7ebf\u4e0a\u6267\u884c\u65f6\u8fd9\u6761\u7528\u4f8b\u4ecd\u7136\u662f\u8df3\u8fc7\u7684\u72b6\u6001\uff0c\u540e\u7eed\u4f60\u6253 Tag \u7684\u65f6\u5019\uff0c\u628a \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u7684\u6807\u7b7e\u5168\u90e8\u5220\u6389\u5c31\u53ef\u4ee5\u4e86\u3002 \u8fd9\u5c31\u662f\u201c\u786e\u8ba4\u4fee\u590d\u201d\u8fd9\u4e2a\u6807\u7b7e\u7684\u80cc\u666f\uff0c\u9700\u8981\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u54c1\u4e00\u54c1\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#33","title":"3.3\u3001\u5e9f\u5f03\u7528\u4f8b","text":"\u9488\u5bf9\u67d0\u4e9b\u7528\u4f8b\uff0c\u7531\u4e8e\u9700\u6c42\u53d8\u66f4\uff0c\u73af\u5883\u5f71\u54cd\u6216\u8bc4\u4f30\u4e0d\u518d\u9002\u7528\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u65f6\uff0c\u7528\u4f8b\u9700\u8981\u5e9f\u5f03\uff0c\u5219\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u5e9f\u5f03\u7528\u4f8b\u201d\uff0c\u8be5\u5217\u5b58\u5728 \u201cremoved-{\u5e9f\u5f03\u539f\u56e0}\u201d\uff0c\u5219\u7528\u4f8b\u4e0d\u4f1a\u6267\u884c\u3002 \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d removed-\u5df2\u5e9f\u5f03 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_2","title":"4\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u4e0a\u9762\u4ecb\u7ecd Pytest \u6846\u67b6\u63d0\u4f9b\u7684\u6807\u7b7e\u529f\u80fd mark\uff0c\u4f7f\u7528\u65f6\u9700\u8981\u4e3a\u6bcf\u4e00\u4e2a\u7528\u4f8b\u6dfb\u52a0\u6807\u7b7e\u88c5\u9970\u5668\uff0c\u5219\u64cd\u4f5c\u590d\u6742\uff0c\u53ef\u7ef4\u62a4\u6027\u5dee\uff0c\u5176\u6839\u672c\u95ee\u9898\u5c31\u662f\u6807\u7b7e\u5206\u6563\u5728\u6bcf\u4e00\u6761\u7528\u4f8b\u7684\u88c5\u9970\u5668\u4e0a\uff0c\u96be\u4ee5\u96c6\u4e2d\u7ef4\u62a4\uff1b\u4e8e\u662f\u4e4e\u5c06\u6240\u6709\u6807\u7b7e\u4f7f\u7528 csv \u6587\u4ef6\u8fdb\u884c\u96c6\u4e2d\u7ba1\u7406\uff0c\u5e76\u901a\u8fc7 Pytest \u7684\u94a9\u5b50\u51fd\u6570\uff0c\u8bfb\u53d6 csv \u6587\u4ef6\uff0c\u52a8\u6001\u6dfb\u52a0\u6807\u7b7e\u5230\u7528\u4e2d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5csv","title":"5\u3001CSV\u6587\u4ef6\u683c\u5f0f","text":"\u6b64\u914d\u7f6e\u6587\u4ef6\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u6807\u7b7e\u6570\u636e\uff0c\u4e14\u8981\u65b9\u4fbf\u80fd\u4f7f\u7528 Excel \u6253\u5f00\u8fdb\u884c\u7f16\u8f91\u67e5\u770b\uff0c\u66f4\u91cd\u8981\u7684\u662f\u6211\u4eec\u4e0d\u60f3\u5f15\u5165\u4e09\u65b9\u4f9d\u8d56\uff0cCSV \u6587\u4ef6\u51e0\u4e4e\u662f\u552f\u4e00\u80fd\u6ee1\u8db3\u6240\u6709\u7684\u8981\u6c42\u7684\u6587\u4ef6\u683c\u5f0f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_6","title":"\u4e03\u3001\u65e5\u5fd7\u7cfb\u7edf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_5","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e YouQu \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u64cd\u4f5c\u65b9\u6cd5\u5c01\u88c5\u5199\u6cd5\uff0c\u901a\u5e38\u662f\u8fd9\u6837\u7684\uff1a\u7c7b\u91cc\u9762\u4e00\u4e2a\u51fd\u6570\u53ea\u5305\u542b\u4e00\u4e2a\u64cd\u4f5c\u6216\u591a\u6b21\u8c03\u7528\u7684\u4e00\u7cfb\u5217\u53ef\u5408\u5e76\u7684\u64cd\u4f5c\uff1b \u4f20\u7edf\u7684\u65e5\u5fd7\u8f93\u51fa\u65b9\u5f0f\uff0c\u9700\u8981\u5728\u6bcf\u4e2a\u51fd\u6570\u91cc\u9762\u4e3b\u52a8\u7f16\u5199\u65e5\u5fd7\u8f93\u51fa\u4ee3\u7801 \uff0c\u4f8b\u5982\uff1a class XXXWidget:\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\nlogger.info(\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\")\n...\n# \u7701\u7565\u4ee3\u7801\u90e8\u5206\n \u4e00\u4e2a\u51fd\u6570\u91cc\u9762\u81f3\u5c11\u5305\u542b\u4e00\u6761\u65e5\u5fd7\u4fe1\u606f\uff0c\u5982\u679c\u6bd4\u8f83\u590d\u6742\u64cd\u4f5c\u6b65\u9aa4\uff0c\u53ef\u80fd\u5305\u542b\u591a\u6761\u65e5\u5fd7\u4fe1\u606f\uff1b \u4e00\u4e2a\u5e94\u7528\u542b\u6709\u5927\u91cf\u7684\u64cd\u4f5c\u51fd\u6570\uff0c\u4e5f\u5c31\u662f\u8bf4\u6211\u4eec\u9700\u8981\u5199\u5927\u91cf\u7684\u65e5\u5fd7\u4ee3\u7801\uff1b \u901a\u8fc7\u7ecf\u9a8c\u89c2\u5bdf\uff0c\u6211\u4eec\u53d1\u73b0\uff0c\u51fd\u6570\u8bf4\u660e\u4ee5\u53ca\u51fd\u6570\u64cd\u4f5c\u65e5\u5fd7\uff0c\u5177\u6709\u8f83\u9ad8\u7684\u91cd\u590d\u5ea6\uff08\u4ece\u4e0a\u9762\u7684\u4f8b\u5b50\u4e5f\u53ef\u4ee5\u770b\u51fa\u6765\uff09\uff0c\u56e0\u6b64\u6211\u4eec\u5927\u80c6\u7684\u8bbe\u60f3\uff0c\u80fd\u4e0d\u80fd\u57fa\u4e8e\u6846\u67b6\u6267\u884c\u65f6\uff0c\u81ea\u52a8\u7684\u5c06\u51fd\u6570\u8bf4\u660e\u4f5c\u4e3a\u65e5\u5fd7\u6253\u5370\u51fa\u6765\uff0c\u4ece\u800c\u51cf\u5c11\u5927\u91cf\u65e5\u5fd7\u4ee3\u7801\u91cf\u548c\u91cd\u590d\u7f16\u5199\uff0c\u90a3\u771f\u662f\u5999\u554a~\u3002 \u57fa\u4e8e\u6b64\u201c\u5929\u771f\u201d\u7684\u60f3\u6cd5\uff0c\u6211\u4eec\u8bbe\u8ba1\u51fa\u4e86 youqu \u7684\u65e5\u5fd7\u7cfb\u7edf\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_5","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u6838\u5fc3\u539f\u7406\uff1a \u901a\u8fc7\u7ed9\u7c7b\u52a0\u4e0a\u4e00\u4e2a\u88c5\u9970\u5668 @log\uff0c\u52a8\u6001\u7ed9\u8be5\u7c7b\u4e0b\u6240\u6709\u7684\u51fd\u6570\u53ca\u7236\u7c7b\u51fd\u6570\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668 @_trace\uff0c\u5728\u6b64\u88c5\u9970\u5668\u4e2d\u6211\u4eec\u80fd\u52a8\u6001\u7684\u6355\u83b7\u6240\u8c03\u7528\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff08func.__doc__\uff09\uff0c\u901a\u8fc7\u65e5\u5fd7\u8f93\u51fa\u5668\u5c06\u5176\u8f93\u51fa\u5373\u53ef\u3002 \u5b9e\u73b0\u6b65\u9aa4\uff1a \u901a\u8fc7 inspect.getmembers \u83b7\u53d6\u88ab\u88c5\u9970\u7684\u7c7b\u4e0b\u6240\u6709\u51fd\u6570\uff0c\u5305\u542b\u9759\u6001\u65b9\u6cd5\uff0c\u7c7b\u65b9\u6cd5\uff0c\u5b9e\u4f8b\u65b9\u6cd5\uff1b \u901a\u8fc7 setattr(\u7c7b, \u65b9\u6cd5, _trace\uff09 \u7684\u65b9\u5f0f\uff0c\u7ed9\u7b26\u5408\u6761\u4ef6\u7684\u51fd\u6570\uff0c\u52a8\u6001\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_3","title":"3\u3001\u65e5\u5fd7\u914d\u7f6e","text":"[log_cli]\n;\u65e5\u5fd7\u76f8\u5173\u914d\u7f6e\uff08\u4e0d\u6253\u5370\u6784\u9020\u51fd\u6570\u548c\u9b54\u6cd5\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff09\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = INFO\n# ============= \u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u914d\u7f6e ================\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u5f00\u5934\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7, \u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_STARTSWITH = Assert\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u7ed3\u5c3e\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_ENDSWITH = Widget\n;\u652f\u6301\u7c7b\u540d\u5305\u542b xxx \u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_CONTAIN = ShortCut\n# ==============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_3","title":"4\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u5728\u5e94\u7528\u5e93 widget \u65b9\u6cd5\u5e93\u91cc\u9762\uff0c\u53ea\u9700\u8981\u5728\u51fa\u53e3\u6587\u4ef6\u52a0\u4e0a\u7c7b\u88c5\u9970\u5668\uff0c\u5c31\u53ef\u4ee5\u5b9e\u73b0\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u4e86\uff1b # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6ce8\u610f\uff0c\u662f\u7c7b\u88c5\u9970\u5668\u3002 \u5b9e\u4f8b\uff1a # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\n@classmethod\ndef find_dfm_image(cls, *elements, multiple=False, rate=0.9):\n\"\"\"\n \u67e5\u627e\u56fe\u7247 {{elements}}.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e {{rate}} \u7684\u5750\u6807\n :param elements:\n :param multiple:\n :return:\n \"\"\"\nelement = tuple(map(lambda x: f\"{Config.PIC_RES_PATH}/{x}\", elements))\nreturn cls.find_image(*element, multiple=multiple)\n \u8c03\u7528\u65b9\u6cd5\u65f6\uff1a DfmWidget.find_dfm_image(\"dfm_001\")\n \u81ea\u52a8\u8f93\u51fa\u7684\u65e5\u5fd7\uff1a >> x86_64-uos-6: 02/28 17:48:47 | INFO | logger_utils: [find_dfm_image]: \u67e5\u627e\u56fe\u7247 dfm_001.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e 0.9 \u7684\u5750\u6807\n \u52a0\u4e0a\u88c5\u9970\u5668 @log \u4e4b\u540e\uff0c\u65b9\u6cd5\u5c42\u6240\u6709\u7684\u51fd\u6570\uff08\u5305\u62ec\u5b9e\u4f8b\u65b9\u6cd5\u3001\u7c7b\u65b9\u6cd5\u3001\u9759\u6001\u65b9\u6cd5\uff09\u90fd\u4e0d\u9700\u8981\u518d\u5199\u65e5\u5fd7\u4ee3\u7801\uff0c\u6267\u884c\u7684\u65f6\u5019\u4f1a\u81ea\u52a8\u8f93\u51fa\uff0c\u5e76\u4e14\u6240\u6709\u8c03\u7528\u7684\u65b9\u6cd5\u4f1a\u4ee5 allure.step \u7684\u65b9\u5f0f\uff0c\u5c55\u793a\u5728 allure \u62a5\u544a\u4e2d\uff0c\u5728\u62a5\u544a\u4e2d\u66f4\u80fd\u4e00\u76ee\u4e86\u7136\u7684\u770b\u5230\u7528\u4f8b\u6267\u884c\u6b65\u9aa4\u3002 \u3010\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\u3011 \u901a\u8fc7\u89c2\u5bdf\u524d\u9762\u7684\u4f8b\u5b50\uff0c\u7ec6\u5fc3\u7684\u540c\u5b66\u53ef\u80fd\u8fd8\u53d1\u73b0\u4e86\u4e00\u4e2a\u5c0f\u7ec6\u8282\uff1a\u51fd\u6570\u529f\u80fd\u8bf4\u660e\u4e2d\uff0c\u4e24\u5bf9\u5927\u62ec\u53f7\u4e2d\u7684\u5185\u5bb9 {{elements}} \u4f5c\u4e3a\u53d8\u91cf\u8f93\u51fa\u51fa\u6765\u4e86\uff1b \u6ca1\u9519\uff0c\u8fd9\u5c31\u662f\u6211\u4eec\u53c2\u8003Django \u548c jinja2 \u7684\u6a21\u677f\u8bed\u6cd5\u8bbe\u8ba1\u51fa\u7684\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\uff0c\u4f7f\u7528\u65b9\u6cd5\u5f88\u7b80\u5355\uff0c\u7528\u4e24\u5bf9\u5927\u62ec\u53f7\u628a\u51fd\u6570\u7684\u53c2\u6570\u62ec\u8d77\u6765\uff0c\u8fd9\u6837\u5728\u65e5\u5fd7\u8f93\u51fa\u7684\u65f6\u5019\u5c31\u80fd\u628a\u8c03\u7528\u51fd\u6570\u65f6\u53c2\u6570\u7684\u503c\u8f93\u51fa\u51fa\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_7","title":"\u516b\u3001\u73af\u5883\u90e8\u7f72","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_6","title":"1\u3001\u539f\u5219","text":"YouQu \u7684\u73af\u5883\u4f9d\u8d56\u4e00\u76f4\u575a\u6301 2 \u4e2a\u539f\u5219\uff1a \u6700\u5c0f\u73af\u5883\u4f9d\u8d56\u539f\u5219 \u6709\u4e9b\u540c\u5b66\u5199\u4e00\u4e9b\u529f\u80fd\uff0c\u9996\u5148\u60f3\u5230\u7684\u5c31\u662f\u53bb\u641c\u7d22\u5f15\u64ce\u641c\u4e00\u4e0b\uff0c\u770b\u6709\u6ca1\u6709\u73b0\u6210\u7684\u5de5\u5177\u6216\u8005\u4ee3\u7801\u76f4\u63a5\u80fd\u7528\uff0c\u7f8e\u5176\u540d\u66f0\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\uff0c\u522b\u4eba\u5df2\u7ecf\u9020\u597d\u4e86\u8f6e\u5b50\u54b1\u4eec\u5c31\u4e0d\u8981\u91cd\u590d\u53bb\u9020\u4e86\uff0c\u7136\u540e\u4e00\u5207\u4f3c\u4e4e\u90fd\u53d8\u5f97\u90a3\u4e48\u7684\u7406\u6240\u5e94\u5f53\u3002 \u5f53\u7136\u8fd9\u6837\u505a\u65e0\u53ef\u539a\u975e\uff0c\u6211\u76f8\u4fe1\u6709\u8fd9\u6837\u60f3\u6cd5\u5e76\u4e14\u4e00\u76f4\u8df5\u884c\u8fd9\u6837\u505a\u6cd5\u7684\u540c\u5b66\u4e0d\u5728\u5c11\u6570\uff0c\u4f46\u8fd9\u6837\u505a\u6709\u4e00\u4e2a\u5f88\u4e25\u91cd\u7684\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f60\u5199\u4e00\u4e2a\u5927\u578b\u9879\u76ee\u65f6\uff0c\u4f60\u4f1a\u5f15\u5165\u975e\u5e38\u975e\u5e38\u975e\u5e38\u591a\u7684\u4f9d\u8d56\uff0c\u6bd4\u5982\u8981\u505a\u4e2a\u63a5\u53e3\u8bf7\u6c42\u8981\u7528 requests\u3001\u8bfb\u5199\u4e2a\u6570\u636e\u7528 pandas\u3001\u5199\u4e2a\u8868\u683c\u7528 pyopenxl\u3001\u89e3\u6790\u4e2a\u6587\u672c\u8981\u7528\u8fd9\u4e2a\u90a3\u4e2a\u4e09\u65b9\u5e93 ... \u3002 \u6211\u8ba4\u4e3a\u8fd9\u662f\u975e\u5e38\u4e0d\u597d\u7684\u4e60\u60ef\uff0c\u5728\u5b9e\u73b0\u4e00\u4e2a\u529f\u80fd\u7684\u65f6\u5019\uff0c\u9996\u5148\u6211\u4eec\u5e94\u8be5\u53bb\u60f3\u81ea\u5df1\u600e\u4e48\u6837\u53bb\u5b9e\u73b0\uff0c\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff1b \u5982\u679c\u4f60\u4e0d\u4f1a\uff0c\u4f60\u53ef\u4ee5\u53bb\u5b66\u4e60\u4e09\u65b9\u5e93\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u522b\u4eba\u4e09\u65b9\u5e93\u4e5f\u662f\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\u7684\uff0c\u4e3a\u4ec0\u4e48\u54b1\u4eec\u4e0d\u884c\u5462\uff1b\u5982\u679c\u522b\u4eba\u7684\u4f60\u5b9e\u5728\u662f\u770b\u4e0d\u61c2\uff0c\u60f3\u5c3d\u4e00\u5207\u529e\u6cd5\u786e\u5b9e\u505a\u4e0d\u51fa\u6765\uff0c\u90a3\u518d\u8003\u8651\u5f15\u5165\u8fd9\u4e2a\u4e09\u65b9\u5e93\uff0c\u6211\u8ba4\u4e3a\u8fd9\u6837\u662f\u6ca1\u95ee\u9898\u7684\uff0c\u6bd5\u7adf\u54b1\u4eec\u6bb5\u4f4d\u8fd8\u4e0d\u591f\uff0c\u4f46\u5e0c\u671b\u5c06\u6765\u6709\u4e00\u5929\u6211\u4eec\u53ef\u4ee5\u3002 \u8fd9\u6837\u7684\u505a\u6cd5\u624d\u5e94\u8be5\u662f\u201c\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\u201d\u6b63\u786e\u7684\u64cd\u4f5c\u3002\u4e0d\u4f1a\u6ca1\u5173\u7cfb\uff0c\u770b\u770b\u522b\u4eba\u662f\u600e\u4e48\u5b9e\u73b0\u7684\uff0c\u81ea\u5df1\u518d\u6478\u7d22\u7740\u5199\u51fa\u6765\uff0c\u8fd9\u6837\u81ea\u5df1\u624d\u80fd\u6709\u6240\u63d0\u9ad8\uff0c\u4e0d\u7136\u4f60\u5c31\u53ea\u4f1a\u7528\u522b\u4eba\u7684\u4e1c\u897f\uff1b\u90a3\u4e9b\u5632\u7b11\u3001\u6279\u8bc4\u6211\u4eec\u91cd\u590d\u9020\u8f6e\u5b50\u7684\u4eba\uff0c\u5148\u60f3\u60f3\u81ea\u5df1\u4f1a\u9020\u8f6e\u5b50\u5417\u3002 \u672c\u7740\u81ea\u5df1\u5b9e\u73b0\u80fd\u5b9e\u73b0\u7684\u4e00\u5207\u7684\u539f\u5219\uff0cYouQu \u6846\u67b6\u505a\u5230\u4e86\u975e\u5e38\u5c11\u7684\u73af\u5883\u4f9d\u8d56\uff0c\u800c\u4e14\u6211\u4eec\u4ecd\u5728\u4e0d\u65ad\u52aa\u529b\uff0c\u51cf\u5c11\u73af\u5883\u90e8\u7f72\u7684\u4f9d\u8d56\u3002 \u6700\u5c0f\u4ed3\u5e93\u4f53\u79ef\u539f\u5219 \u5927\u6587\u4ef6\u4e0d\u80fd\u4e0a\u4f20\u5230\u5de5\u7a0b\u91cc\u9762\uff0c\u4fdd\u6301\u6574\u4e2a\u5de5\u7a0b\u7684\u8f7b\u91cf\u5316\uff0c\u8fd9\u6837\u5728\u514b\u9686\u4ee3\u7801\u7684\u65f6\u5019\u624d\u80fd\u975e\u5e38\u5feb\u901f\u65b9\u4fbf\u4f7f\u7528\uff0c\u6211\u4eec\u89c1\u8fc7\u4e00\u4e2a AT \u5de5\u7a0b clone \u5927\u5c0f\u8fbe\u5230\u597d\u51e0\u4e2a G\uff0c\u7b80\u76f4\u4e0d\u53ef\u601d\u8bae\u3002 \u5176\u5b9e\u4ee3\u7801\u6587\u4ef6\u7684\u5927\u5c0f\u662f\u5f88\u5c0f\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u7eaf\u5199\u4ee3\u7801\u968f\u4fbf\u5199\u5de5\u7a0b\u4e5f\u4e0d\u4f1a\u592a\u5927\uff0c\u800c\u6587\u6863\uff08\u5305\u542b\u63d2\u56fe\uff09\u7b49\u8d44\u6e90\u5374\u662f\u5f88\u5360\u7a7a\u95f4\u3002 \u56e0\u6b64\u6211\u4eec\u9009\u62e9\u5c06 YouQu \u7684\u6587\u6863\u5de5\u7a0b\u6d89\u53ca\u5230\u7684\u56fe\u7247\u8d44\u6e90\u90fd\u91c7\u7528\u5916\u94fe\u52a0\u8f7d\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_6","title":"2\u3001\u5b89\u88c5","text":"\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u8fd0\u884c env.sh \u5373\u53ef\u3002 bash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_4","title":"3\u3001\u5b9a\u5236\u4f9d\u8d56","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_2","title":"3.1\u3001\u65b0\u589e\u4f9d\u8d56","text":"\u5982\u679c\u5e94\u7528\u5e93\u8fd8\u9700\u8981\u5176\u4ed6 Python \u4f9d\u8d56\u5e93\uff0c\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a requirement.txt \u6587\u4ef6\uff1b autotest_xxx\n\u251c\u2500\u2500 requirement.txt\n\u251c\u2500\u2500 case ...\n \u91cc\u9762\u5199\u5165\u9700\u8981\u5b89\u88c5\u7684\u4e09\u65b9\u4f9d\u8d56\uff0c\u6bd4\u5982\u50cf\u8fd9\u6837\uff1a # requirement.txt\nPyYAML==6.0 # \u6307\u5b9a\u5b89\u88c5\u67d0\u4e2a\u7248\u672c\nrequests # \u672a\u6307\u5b9a\u7248\u672c\u5219\u5b89\u88c5\u6700\u65b0\u7248\n \u5728\u6267\u884c bash env.sh \u65f6\u4f1a\u4e00\u5e76\u5c06\u5176\u5b89\u88c5\u3002 \u5982\u679c\u591a\u4e2a\u5e94\u7528\u5e93\u90fd\u5b58\u5728 requirement.txt \u6587\u4ef6\uff0c\u6267\u884c env.sh \u65f6\u4f1a\u5c06\u591a\u4e2a requirement.txt \u6587\u4ef6\u4e00\u5e76\u52a0\u8f7d\uff1b\u90a3\u4e48\u4e00\u5b9a\u8981\u6ce8\u610f\u591a\u4e2a requirement.txt \u6587\u4ef6\u53ef\u80fd\u5b58\u5728\u76f8\u540c\u7684\u4f9d\u8d56\u88ab\u6307\u5b9a\u5b89\u88c5\u4e0d\u540c\u7248\u672c\u7b49\u7b49\u517c\u5bb9\u6027\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32_1","title":"3.2\u3001\u88c1\u526a\u4f9d\u8d56","text":"\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0c\u53ef\u80fd\u4f60\u53ea\u9700\u8981\u5b89\u88c5\u4e00\u4e9b\u6700\u6700\u57fa\u7840\u7684\u4f9d\u8d56\uff0c\u5176\u4ed6\u7684\u90fd\u4e0d\u9700\u8981\uff0c\u6bd4\u5982\u7eaf\u63a5\u53e3\u81ea\u52a8\u5316\u7684\u9879\u76ee\uff0c\u5b83\u4e0d\u9700\u8981 UI \u81ea\u52a8\u5316\u76f8\u5173\u7684\u4f9d\u8d56\u3002 \u4f60\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\uff0c\u5b58\u653e\u4e00\u4e2a BASICENV \u7684\u666e\u901a\u6587\u4ef6\uff0c\u91cc\u9762\u4e0d\u9700\u8981\u5199\u4efb\u4f55\u5185\u5bb9\uff0c\u8fd9\u6837\u6267\u884c env.sh \u65f6\uff0c\u53ea\u4f1a\u5b89\u88c5\u6700\u57fa\u7840\u7684\u4f9d\u8d56\u3002 autotest_xxx\n\u251c\u2500\u2500 BASICENV # \u53ef\u4ee5\u4f7f\u7528\uff1atouch BASICENV \u521b\u5efa\u6587\u4ef6\n\u251c\u2500\u2500 case ...\n \u57fa\u7840\u4f9d\u8d56\u4ec5\u5b89\u88c5\u4ee5\u4e0b\u51e0\u4e2a\u5305\uff1a pytest # pytest\npytest-rerunfailures # \u5931\u8d25\u91cd\u8dd1\u63d2\u4ef6\npytest-timeout # \u7528\u4f8b\u8d85\u65f6\u63d2\u4ef6\nallure-pytest # \u751f\u6210 allure \u62a5\u544a\u63d2\u4ef6\nallure.deb # allure \u62a5\u544a\u67e5\u770b\u5de5\u5177\n \u88c1\u526a\u4f9d\u8d56 \u548c \u65b0\u589e\u4f9d\u8d56 \u662f\u4e0d\u51b2\u7a81\u7684\uff0c\u53ef\u4ee5\u540c\u65f6\u4f7f\u7528\u3002 \u6b64\u65b9\u6848\u9ed8\u8ba4\u4e3a\u865a\u62df\u73af\u5883\u90e8\u7f72\uff0c\u5982\u679c\u4f60\u60f3\u76f4\u63a5\u90e8\u7f72\u5728\u672c\u673a\u4e0a\uff1a bash env_dev.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_4","title":"4\u3001\u865a\u62df\u5316\u90e8\u7f72","text":"YouQu\u9ed8\u8ba4\u91c7\u7528\u865a\u62df\u5316\u90e8\u5206\uff0c\u865a\u62df\u5316\u73af\u5883\u5b9e\u9645\u5b89\u88c5\u7684\u4f4d\u7f6e\u662f\u5728 $HOME/.local/share/virtualenvs/youqu-oHTM7l7G \u76ee\u5f55\u4e0b youqu-oHTM7l7G \u6b64\u76ee\u5f55\u540d\u79f0\u524d\u9762\u90e8\u5206\u662f\u4f60\u7684\u4ee3\u7801\u6839\u76ee\u5f55\u7684\u540d\u79f0\uff0c\u540e\u9762\u90e8\u5206\u662f\u751f\u6210\u7684\u968f\u673a\u5b57\u7b26\u4e32\uff1b \u540c\u5b66\u4eec\u5728\u8fdc\u7a0b\u673a\u5668\u4e0a\u5b9a\u4f4d\u95ee\u9898\u7684\u65f6\u5019\uff0c\u5982\u679c\u4f7f\u7528 Pycharm \u8c03\u8bd5\uff0c\u5c31\u5c06\u89e3\u91ca\u5668\u6307\u5b9a\u5230\u8fd9\u4e2a\u76ee\u5f55\u7684\u5c31\u884c\u4e86\uff1b \u5f53\u7136\uff0c\u6211\u4eec\u4e5f\u63d0\u4f9b\u4e86\u672c\u673a\u5f00\u53d1\u73af\u5883\u90e8\u7f72\uff1a bash env_dev.sh\n \u5982\u679c\u4f60\u662f\u672c\u5730\u5f00\u53d1\u73af\u5883\u53ef\u4ee5\u7528\u5b83\uff0c\u533a\u522b\u5c31\u662f\u9a71\u52a8\u6267\u884c\u7684\u65f6\u5019\u4f7f\u7528\uff1apython3 manage.py xxx"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_8","title":"\u4e5d\u3001\u5931\u8d25\u5f55\u5c4f","text":"\u5f55\u5c4f\u5176\u5b9e\u662f\u4e00\u79cd\u89c6\u9891\u5f62\u5f0f\u7684\u65e5\u5fd7\uff0c\u56e0\u4e3a\u5f88\u591a\u65f6\u5019\u6211\u4eec\u5728\u67e5\u770b\u65e5\u5fd7\u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u51c6\u786e\u7684\u5b9a\u4f4d\u5230\u7528\u4f8b\u5931\u8d25\u7684\u5177\u4f53\u539f\u56e0\uff0c\u56e0\u6b64\u7528\u4f8b\u7684\u5f55\u5c4f\u80fd\u8ba9\u6211\u4eec\u770b\u5230\u7528\u4f8b\u5728\u6267\u884c\u8fc7\u7a0b\uff1b \u3010\u4f7f\u7528\u65b9\u6cd5\u3011 \u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u5173\u6ce8 2 \u4e2a\u53c2\u6570\uff1b ;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\u3002\n;\u6ce8\u610f\uff0c\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u4e0d\u80fd\u5c0f\u4e8e\u5931\u8d25\u5f55\u5c4f\u6b21\u6570\uff0c\u5373 RERUN >= RECORD_FAILED_CASE\nRECORD_FAILED_CASE = 1\n \u9ed8\u8ba4\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u662f 1 \u6b21\uff1b RECORD_FAILED_CASE = 1 \u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff1b RECORD_FAILED_CASE = 0 \u8868\u793a\u4e0d\u7ba1\u7528\u4f8b\u6210\u529f\u6216\u5931\u8d25\u90fd\u5f55\u5c4f\uff1b \u5f55\u5c4f\u662f\u8981\u5360\u7528\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u7279\u522b\u662f\u5728\u4e00\u4e9b\u914d\u7f6e\u8f83\u4f4e\u7684\u673a\u5668\u4e0a\u4f1a\u5f88\u660e\u663e\uff0c\u6240\u4ee5\u4f60\u9700\u8981\u8003\u8651\u662f\u5426\u6709\u5fc5\u8981\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1b \u4f7f\u7528 manage.py \u6267\u884c\u7528\u4f8b\u9ed8\u8ba4\u8bfb\u53d6\u5230 globalconfig.ini \u91cc\u9762\u7684\u53c2\u6570\uff0c\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report/record \u76ee\u5f55\u4e0b\u4fdd\u5b58\u5931\u8d25\u7528\u4f8b\u7684\u5f55\u5c4f\u548c\u65ad\u8a00\u7684\u90a3\u4e2a\u65f6\u95f4\u70b9\u7684\u622a\u5c4f\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7\u89c6\u9891\u6587\u4ef6\u770b\u5230\u5931\u8d25\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u90fd\u53d1\u751f\u4e86\u4ec0\u4e48\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#wayland","title":"\u5341\u3001Wayland \u9002\u914d","text":"Wayland \u4e0b\u81ea\u52a8\u5316\u4e3b\u8981\u95ee\u9898\u662f X11 \u4e0b\u7684\u952e\u9f20\u64cd\u4f5c\u65b9\u6cd5\u65e0\u6cd5\u4f7f\u7528\uff0c\u6bd4\u5982 Xdotool\u3001 PyAutoGUI\u3001Xwininfo \u7b49\u7b49\uff1b YouQu \u5728 Wayland \u4e0b\u517c\u5bb9\u9002\u914d\uff0cenv.sh \u5728 Wayland \u4e0b\u6267\u884c\u65f6\u4f1a\u5b89\u88c5\u81ea\u7814\u7684\u952e\u9f20\u64cd\u4f5c\u670d\u52a1\uff08\u53ef\u80fd\u5b58\u5728\u4e00\u4e9b\u4f9d\u8d56\u62a5\u9519\uff0c\u6309\u7167\u6ce8\u91ca\u89e3\u51b3\u5373\u53ef\uff09\uff0c\u6846\u67b6\u6838\u5fc3\u5e93\u4e5f\u9488\u5bf9\u6027\u7684\u505a\u4e86\u9002\u914d\uff0c\u4e0a\u5c42\u7528\u4f8b\u5b8c\u5168\u4e0d\u7528\u5173\u5fc3\u673a\u5668\u662fWayland \u8fd8\u662f X11\uff0c\u6846\u67b6\u4f1a\u6839\u636e\u6267\u884c\u65f6\u72b6\u6001\u81ea\u52a8\u5224\u65ad\u8d70\u4e0d\u540c\u7684\u903b\u8f91\uff1b \u7b80\u5355\u8bb2\u5c31\u662f\uff0c\u5e94\u7528\u5e93\u53ea\u9700\u8981\u7ef4\u62a4\u4e00\u5957\u7528\u4f8b\u811a\u672c\u5373\u53ef\u3002 \u3010\u7528\u4f8b\u517c\u5bb9\u3011 \u56e0\u4e3a Wayland \u4e0b\u6709\u4e9b\u5e94\u7528\u7684\u754c\u9762\u663e\u793a\u548c\u529f\u80fd\u672c\u8eab\u5b58\u5728\u4e00\u4e9b\u5dee\u5f02\uff0c\u7528\u4f8b\u5c42\u53ef\u80fd\u9700\u8981\u5bf9\u8fd9\u90e8\u5206\u7528\u4f8b\u505a\u903b\u8f91\u5224\u65ad\uff0c\u4f7f\u7528\u5168\u5c40\u914d\u7f6e\u91cc\u9762\u7684\u5e38\u91cf\u8fdb\u884c\u903b\u8f91\u7f16\u5199\u5373\u53ef\uff1a from setting.globalconfig import GlobalConfig\n# GlobalConfig.IS_WAYLAND \u83b7\u53d6\u5230\u5f53\u524d\u7684\u663e\u793a\u670d\u52a1\u5668\uff08bool\uff09\n# \u5e94\u7528\u5e93 Config \u7ee7\u627f GlobalConfig\nif Config.IS_WAYLAND:\npass\nif Config.IS_X11:\npass\n \u6bd4\u5982\u7528\u4f8b\u91cc\u9762\u5982\u679c\u65ad\u8a00\u7684\u56fe\u7247\u4e0d\u540c\uff1a if Config.IS_WAYLAND:\nself.assert_image_exist(\"wayland_XXX\")\nelse:\nself.assert_image_exist(\"x11_XXX\")\n \u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u811a\u672c\u5728 Wayland \u548c X11 \u4e0b\u90fd\u53ef\u4ee5\u8dd1\uff0cso easy \u662f\u4e0d\u662f\uff1f\u5b8c\u5168\u6ca1\u5fc5\u8981\u4e13\u95e8\u62c9\u65b0\u5206\u652f\u8fdb\u884c Wayland \u9002\u914d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_9","title":"\u5341\u4e00\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_7","title":"1. \u76ee\u5f55\u7ed3\u6784","text":"\u6267\u884c\u65f6\u4f1a\u5728\u6839\u76ee\u5f55\u4e0b\u52a8\u6001\u751f\u6210 report \u76ee\u5f55\uff0c\u6240\u6709\u7684\u62a5\u544a\u76f8\u5173\u7684\u6587\u4ef6\u4f1a\u7edf\u4e00\u5b58\u653e\u5728\u91cc\u9762\uff0c\u793a\u4f8b\uff1a /report\n \u251c\u2500\u2500 allure # allure\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json\n \u251c\u2500\u2500 allure_html # \u751f\u6210\u7684html\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 index.html \u251c\u2500\u2500 allure_back # allure\u62a5\u544a\u5907\u4efd\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 20221108114823\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json\n \u251c\u2500\u2500 json # json\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 result_deepin-music_20221109134736_1081333.json\n \u251c\u2500\u2500 logs # \u65e5\u5fd7\u6587\u4ef6\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 2022-11-10_debug.log \u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-10_error.log\n \u251c\u2500\u2500 record # \u5f55\u5c4f\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-09\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 15\u65f614\u520609\u79d2_test_music_303_2_autotest.mp4\n \u2514\u2500\u2500 xml # xml\u62a5\u544a\n\u2514\u2500\u2500 autotest_deepin_music-20221109134736.xml\n \u9ed8\u8ba4\u60c5\u51b5\u4e0b\u540c\u65f6\u751f\u6210 html\u3001xml\u3001json\u4e09\u79cd\u5f62\u5f0f\u7684\u62a5\u544a\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_7","title":"2. \u5b9a\u5236\u62a5\u544a","text":"\u6211\u4eec\u5bf9 allure \u62a5\u544a\u8fdb\u884c\u4e86\u4e00\u7cfb\u5217\u7684\u5b9a\u5236\uff1a \u5b9a\u5236 logo\u3001title\u3001\u62a5\u544a\u9ed8\u8ba4\u8bed\u8a00\u4e3a\u4e2d\u6587\uff1b \u52a0\u5165\u4e86\u7528\u4f8b\u65ad\u8a00\u5931\u8d25\u65f6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u4ee5\u53ca\u6b64\u65f6\u56fe\u50cf\u5bf9\u6bd4\u7684\u6a21\u677f\u56fe\u7247\uff1b \u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\uff0c\u4f60\u53ef\u4ee5\u5728 html \u62a5\u544a\u4e2d\u76f4\u63a5\u770b\u5f55\u5236\u7684\u89c6\u9891\uff1b \u52a0\u5165\u4e86 IP \u5730\u5740\u3001\u7cfb\u7edf\u4fe1\u606f\u3001\u955c\u50cf\u7248\u672c\u7b49\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_5","title":"3. \u67e5\u770b\u62a5\u544a","text":" \u672c\u5730\u6267\u884c \u5728 report/allure \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u4e00\u5806\u6587\u672c\u6587\u4ef6\uff0c\u8fd9\u4e9b\u662f allure \u63d2\u4ef6\u751f\u6210\u7684\u62a5\u544a\u6e90\u6570\u636e\uff0c\u6211\u4eec\u5728 report/allure_html \u76ee\u5f55\u4e0b\u7ed9\u4f60\u751f\u6210\u4e86 html \u6587\u4ef6\uff0c\u4f46\u662f\u4f60\u4e0d\u80fd\u76f4\u63a5\u901a\u8fc7\u6d4f\u89c8\u5668\u6253\u5f00 index.html \u6587\u4ef6\uff0c\u56e0\u4e3a allure \u7684\u62a5\u544a\u90fd\u662f\u57fa\u4e8e\u5728\u7ebf\u7684\u670d\u52a1\uff0c\u4f60\u5e94\u8be5\u8fd9\u6837\u6253\u5f00\uff1a allure open report/allure_html\n \u4f7f\u7528 manage.py \u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u5728\u7ec8\u7aef\u7684\u6700\u540e\u4e00\u884c\uff0c\u6211\u4eec\u4f1a\u7ed9\u4f60\u8f93\u51fa\u6253\u5f00\u62a5\u544a\u7684\u547d\u4ee4\uff0c\u76f4\u63a5\u590d\u5236\u5b83\u5728\u7ec8\u7aef\u6267\u884c\u5c31\u53ef\u4ee5\u67e5\u770b\u4e86\uff0c\u50cf\u8fd9\u6837\uff1a \u7ec8\u7aef\u6267\u884c\u547d\u4ee4: allure open /tmp/youqu/report/allure_html \u67e5\u770b\u62a5\u544a \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 Pycharm \u91cc\u9762\u627e\u5230 index.html \u6587\u4ef6\uff0c\u7136\u540e\u53f3\u952e\u9009\u62e9\u6d4f\u89c8\u5668\u6253\u5f00\uff0c\u6216\u8005\u4f60\u53ef\u4ee5\u7528\u4e00\u4e2a http \u670d\u52a1\u6253\u5f00\u3002 \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 report/allure \u76ee\u5f55\u4e0b\u67e5\u770b\u62a5\u544a\uff1a allure serve report/allure\n \u8fdc\u7a0b\u6267\u884c \u8fdc\u7a0b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\uff0c\u4f1a\u5c06\u6240\u6709\u8fdc\u7a0b\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u62a5\u544a\u90fd\u6536\u96c6\u5230 report/allure \u76ee\u5f55\u4e0b\uff0c\u5206\u522b\u6309\u7167\u673a\u5668\u7684 IP \u7b49\u5efa\u4e86\u4e0d\u540c\u7684\u76ee\u5f55\uff0c\u4f60\u53ef\u4ee5\u5728\u8fd9\u4e9b\u76ee\u5f55\u91cc\u9762\u53bb\u67e5\u770b\u5bf9\u5e94\u7684\u6d4b\u8bd5\u62a5\u544a\uff0c\u67e5\u770b\u65b9\u6cd5\u548c\u524d\u9762\u672c\u5730\u6267\u884c\u67e5\u770b\u7684\u65b9\u6cd5\u4e00\u6837\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_10","title":"\u5341\u4e8c\u3001\u9759\u6001\u4ee3\u7801\u626b\u63cf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_8","title":"1. \u63d0\u524d\u89e3\u51b3\u4ee3\u7801\u95ee\u9898","text":"\u4e3a\u4e86\u5e2e\u52a9\u5f00\u53d1\u8005\u7edf\u4e00\u4ee3\u7801\u98ce\u683c\uff0cPython \u793e\u533a\u63d0\u51fa\u4e86 PEP8 \u4ee3\u7801\u7f16\u7801\u98ce\u683c\uff0cPython \u5b98\u65b9\u540c\u65f6\u63a8\u51fa\u4e86\u4e00\u4e2a\u68c0\u67e5\u4ee3\u7801\u98ce\u683c\u662f\u5426\u7b26\u5408 PEP8 \u7684\u5de5\u5177\uff0c\u540d\u5b57\u4e5f\u53eb PEP8\u3002 \u4f46\u662f\uff0cPycharm \u91cc\u9762\u7684 PEP8 \u63d2\u4ef6\u5b9e\u9645\u4e0a\u5e76\u4e0d\u80fd\u53d1\u73b0\u5f88\u591a\u4ee3\u7801\u95ee\u9898\uff0c\u8fd9\u4e9b\u95ee\u9898\u5e76\u4e0d\u4f1a\u5728\u8fd0\u884c\u65f6\u62a5\u9519\uff0c\u56e0\u4e3a\u4ece Python \u8bed\u8a00\u89d2\u5ea6\u5e76\u4e0d\u5173\u5fc3\u8fd9\u4e9b\u95ee\u9898\uff0c\u5728 Pycharm \u7f16\u8f91\u5668\u91cc\u9762\u4f7f\u7528\u5feb\u6377\u952e ctrl + alt + L\uff0c\u6709\u4e00\u70b9\u70b9\u683c\u5f0f\u5316\u7684\u6548\u679c\uff0c\u80fd\u89e3\u51b3\u4e00\u4e9b\u7a7a\u683c\u3001\u6362\u884c\u7b49\u5c0f\u95ee\u9898\u3002 \u8fd9\u91cc\u63a8\u8350\u4e00\u4e2a Python \u793e\u533a\u6d41\u884c\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff1a Black\uff0c\u53f7\u79f0\u4e0d\u59a5\u534f\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff0c\u5b83\u68c0\u6d4b\u5230\u4e0d\u7b26\u5408\u89c4\u8303\u7684\u4ee3\u7801\u98ce\u683c\u76f4\u63a5\u5c31\u5e2e\u4f60\u5168\u90e8\u683c\u5f0f\u5316\u597d\uff0c\u5c31\u662f\u8fd9\u4e48\u521a\uff01 \u5b89\u88c5\uff1a sudo pip3 install black \n \u4f7f\u7528\u65b9\u6cd5\uff1a black ${CheckPath}\n \u4f7f\u7528\u8fd9\u4e2a\u5de5\u5177\u683c\u5f0f\u5316\u4e4b\u540e\uff0c\u4ee3\u7801\u4f1a\u88ab\u81ea\u52a8\u8c03\u6574\uff0c\u521a\u5f00\u59cb\u4f60\u53ef\u80fd\u4f1a\u89c9\u5f97\u8c03\u6574\u5f97\u5f88\u5938\u5f20\uff0c\u6ca1\u5173\u7cfb\u575a\u6301\u770b\uff0c\u4e60\u60ef\u4e4b\u540e\uff0c\u4f60\u4f1a\u89c9\u5f97\u5f88\u4f18\u96c5\uff0c\u6ca1\u9519\uff0c\u8fd9\u5c31\u662f Pythonic Code \u7684\u6838\u5fc3\uff0c\u8bf7\u4fdd\u6301\u4f18\u96c5\uff5e\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_8","title":"2. \u4ee3\u7801\u626b\u63cf\u5de5\u5177","text":"\u4f7f\u7528\u6839\u76ee\u5f55\u4e0b pylint.sh \u626b\u63cf\u4ee3\u7801\uff0c\u5728 report \u76ee\u5f55\u4e0b\u67e5\u770b\u4ee3\u7801\u626b\u63cf\u62a5\u544a\uff0c\u5982\u679c\u6709\u4ee3\u7801\u95ee\u9898\u8bf7\u63d0\u524d\u89e3\u51b3\u4e4b\u540e\u518d\u63d0\u4ea4\u3002 \u6b64\u811a\u672c\u5df2\u7ecf\u4f7f\u7528 Python \u793e\u533a\u6700\u6d41\u884c\u7684\u4ee3\u7801\u626b\u63cf\u5de5\u5177 Pylint \u8fdb\u884c\u4ee3\u7801\u626b\u63cf\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a bash pylint.sh\n \u8fd0\u884c\u4e4b\u540e\u4f1a\u63d0\u793a\u4f60\u8981\u626b\u63cf\u7684\u76ee\u5f55\uff0c\u6bd4\u5982\u8f93\u5165 apps \uff0c\u5219\u4f1a\u626b\u63cf apps \u4e0b\u7684\u6240\u6709 Python \u4ee3\u7801\u3002 \u5728 setting/pylintrc.cfg \u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u76f8\u5173\u914d\u7f6e\uff0c\u626b\u63cf\u5b8c\u6210\u4e4b\u540e\u5728 report/pylints \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u626b\u63cf\u62a5\u544a\u3002 \u4ee3\u7801\u63d0\u4ea4\u9700\u901a\u8fc7 git review \u63d0\u4ea4\u5230 gerrit \uff0c\u4eba\u5de5 Code Review \u901a\u8fc7\u4e4b\u540e\u5408\u5165\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_11","title":"\u5341\u4e09\u3001\u63d0\u4ea4\u4ee3\u7801","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_9","title":"1. \u5b89\u88c5\u4f9d\u8d56","text":"sudo apt install git-review\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_9","title":"2. \u63d0\u4ea4\u6a21\u677f","text":"\u5728 ~ \u76ee\u5f55\u4e0b\u65b0\u5efa\u6587\u4ef6\uff0c\u5e76\u547d\u540d\u4e3a gitcommit_template \u5c06\u4ee5\u4e0b\u5185\u5bb9\u5199\u5165\u6587\u4ef6\u5f53\u4e2d\uff1a # commit type :fix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style(\u98ce\u683c\u4fee\u6539)\u3001refactor(\u91cd\u6784)\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test(\u6d4b\u8bd5) + \u7b80\u5355\u63cf\u8ff0. \u9ed8\u8ba4fix,\u6839\u636e\u60c5\u51b5\u4fee\u6539\nfix: \n\n# \u8be6\u7ec6\u8bf4\u660e\u4ee3\u7801\u7684\u6539\u52a8\uff0c\u5305\u542b\u4ee3\u7801\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u4ee5\u53ca\u4e3a\u4ec0\u4e48\u8fd9\u4e48\u505a\uff0c\u53ef\u80fd\u4f1a\u5f71\u54cd\u54ea\u4e9b\u529f\u80fd\u3002\u5bf9\u4e8e\u4ee3\u7801\u7684\u5ba1\u6838\u8005\uff0c\u9700\u8981\u4ece\u8fd9\u6bb5\u63cf\u8ff0\u4e2d\u80fd\u5b8c\u5168\u7406\u89e3\u4ee3\u7801\u4e2d\u6240\u6709\u6539\u52a8\u7684\u5185\u5bb9\nDescription: \n\n# \u5199\u4e00\u6bb5\u9762\u5411\u4e8e\u4ea7\u54c1\u7684\u603b\u7ed3\u6027\u5185\u5bb9\uff0c\u7528\u4e8e\u81ea\u52a8\u751f\u6210crp\u4e0a\u7684changlog\uff0c\u9700\u8981\u6ce8\u610f\u7684\u4e8b\uff0c\u8fd9\u6bb5\u63cf\u8ff0\u5fc5\u987b\u4ece\u4ea7\u54c1\u7684\u89d2\u5ea6\u8003\u8651\u3002\nLog: \n\n# \u5173\u8054pms\u4e0a\u7684bug\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94bug\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4fee\u590dbug\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Bug: \n\n# \u4fee\u590d github issue \n#Issue: \n\n# \u5173\u8054pms\u4e0a\u7684\u4efb\u52a1\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94\u4efb\u52a1\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4efb\u52a1\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Task: \n \u547d\u4ee4\u884c\u6267\u884c: git config --global commit.template ~/gitcommit_template\n \u6b64\u547d\u4ee4\u5c06\u6a21\u677f\u52a0\u5165\u5230 git \u7684\u63d0\u4ea4\u6a21\u677f\u4e2d\u3002 \u540e\u7eed\u63d0\u4ea4\u7684\u65f6\u5019\u9700\u8981\u5173\u6ce8\u4e00\u4e0b\u51e0\u70b9\uff1a commit type \u5bf9\u5e94\u4e0d\u540c\u7684\u4fee\u6539\u7c7b\u578b\uff1afix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style \uff08\u98ce\u683c\u4fee\u6539\uff09\u3001refactor \uff08\u91cd\u6784\uff09\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test \uff08\u6d4b\u8bd5\uff09 commit type \u5192\u53f7\u540e\u9762\u52a0\u7a7a\u683c\u3002 Description \u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u9700\u8981\u8fdb\u884c\u8be6\u7ec6\u8bf4\u660e\uff0c\u6bd4\u5982\u5bf9\u529f\u80fd\u8fdb\u884c\u5927\u6539\u7b49\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_6","title":"3. \u63a8\u9001\u4ee3\u7801","text":"\u9996\u5148\u6dfb\u52a0 commit \u4fe1\u606f git add \u540e\u9762\u52a0\u6587\u4ef6\u540d\u79f0\n git add . # \u8868\u793a\u6dfb\u52a0\u6240\u6709\u6587\u4ef6\n \u4f7f\u7528\u8fd9\u6761\u547d\u4ee4\u6ce8\u610f\u6709\u4e9b\u4e34\u65f6\u6587\u4ef6\u4e0d\u8981\u63d0\u4ea4\u5230\u4ed3\u5e93\u4e86\u3002 git commit -a\n \u4e4b\u540e\u5728 fix: \u540e\u9762\uff08\u6ce8\u610f\u5192\u53f7\u540e\u9762\u5fc5\u987b\u52a0\u7a7a\u683c\uff0c\u4e0d\u7136\u76f4\u63a5-1\uff09\u5199\u672c\u5730\u63d0\u4ea4\u7684 commit \u4fe1\u606f\uff0c\u7136\u540e\u5c31\u53ef\u4ee5\u63d0\u4ea4\u4ee3\u7801\u4e86 git review branch(\u5f53\u524d\u5206\u652f) -r origin\n \u6700\u597d\u4e00\u6b21 commit\uff0c\u4e00\u6b21 git review \uff0c\u7ecf\u5e38\u6709\u540c\u5b66\u5728\u672c\u5730\u75af\u72c2 commit \u6700\u540e git review \u62a5\u9519\u4e0d\u77e5\u9053\u548b\u56de\u4e8b\u513f\u3002 \u82e5\u4e0d\u60f3\u6bcf\u6b21\u63d0\u4ea4\u90fd\u52a0\u4e0a -r \u9009\u9879\uff0c\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a git config --global gitreview.remote origin \u63d0\u4ea4\u4ee3\u7801\uff0c\u76f4\u63a5\u4f7f\u7528 git review branch<\u76ee\u6807\u5206\u652f>\uff0c\u4f8b\u5982 git review master"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git","title":"4. Git\u6807\u7b7e","text":"Git \u6807\u7b7e\u5b9e\u9645\u4e0a\u662f commit \u7684\u4e00\u4e2a\u522b\u540d\uff0c\u4e3b\u8981\u7528\u4e8e\u7ba1\u7406\u5386\u53f2\u7248\u672c\u3002 \u60f3\u8c61\u4e00\u4e0b\u9886\u5bfc\u8ba9\u4f60\u628a\u4e4b\u524d\u7684\u67d0\u4e2a\u7248\u672c\u7684\u4ee3\u7801\u62c9\u51fa\u6765\u8dd1\uff0c\u4f60\u662f\u4e0d\u662f\u4e56\u4e56\u7684\u53bb\u628a\u6240\u6709\u63d0\u4ea4\u8bb0\u5f55\u62c9\u51fa\u6765\u627e\uff0c\u7136\u540e\u627e\u5230\u90a3\u4e2a\u54c8\u5e0c\u503c\uff0c\u901a\u8fc7\u54c8\u5e0c\u503c\u6765\u68c0\u51fa\u4ee3\u7801\u3002 \u8fd9\u4e00\u5957\u64cd\u4f5c\u4e0b\u6765\u662f\u4e0d\u662f\u5f88\u9ebb\u70e6\uff0c\u8d39\u65f6\u95f4\u8fd8\u4e0d\u4e00\u5b9a\u80fd\u627e\u5f97\u5230\uff0c\u6ca1\u4eba\u80fd\u8bb0\u4f4f\u6bcf\u4e2a\u63d0\u4ea4\u54c8\u5e0c\u503c\u4ee5\u53ca\u8fd9\u6b21\u63d0\u4ea4\u90fd\u6539\u4e86\u54ea\u4e9b\u4ee3\u7801\u3002 \u56e0\u6b64\u7ed9\u63d0\u4ea4\u6253\u4e2a\u6807\u7b7e\uff0c\u5c31\u662f\u628a\u54c8\u5e0c\u503c\u8f6c\u6362\u6210\u4eba\u7c7b\u80fd\u7406\u89e3\u7684\u8bed\u8a00\uff0c\u6bd4\u5982 v1.0\uff0c\u5c31\u53ef\u4ee5\u76f4\u63a5\u901a\u8fc7\u6807\u7b7e\u627e\u5230\u5bf9\u5e94\u7684\u63d0\u4ea4\u3002 \u65b0\u5efa\u6807\u7b7e git tag -a <tagname>\n \u56de\u8f66\u4e4b\u540e\uff0cGit \u4f1a\u6253\u5f00\u4f60\u7684\u7f16\u8f91\u5668\uff0c\u8ba9\u4f60\u5199\u4e00\u53e5\u6807\u7b7e\u6ce8\u89e3\uff0c\u5c31\u50cf\u4f60\u7ed9\u63d0\u4ea4\u5199\u6ce8\u89e3\u4e00\u6837\u3002 \u67e5\u770b\u6240\u6709\u6807\u7b7e git tag -l\n# git tag \u4e5f\u884c\n \u5220\u9664\u6807\u7b7e git tag -d <tagname>\n \u63a8\u9001\u6807\u7b7e\u81f3\u8fdc\u7a0b git push \u547d\u4ee4\u5e76\u4e0d\u4f1a\u4f20\u9001\u6807\u7b7e\u5230\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\uff0c\u5fc5\u987b\u663e\u5f0f\u5730\u63a8\u9001\u6807\u7b7e\u3002 git push origin <tagname>\n \u63a8\u9001\u6240\u6709\u4e0d\u5728\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\u7684\u6807\u7b7e git push origin --tag\n \u5220\u9664\u8fdc\u7a0b\u6807\u7b7e git push origin :refs/tag/<tagname>\n \u540e\u671f\u6253\u6807\u7b7e \u5148\u7528 git log --pretty=oneline \u67e5\u8be2\u63d0\u4ea4\u8bb0\u5f55\uff0c\u83b7\u53d6\u6821\u9a8c\u7801\u3002 git tag -a <tagname> 9fceb02(\u6821\u9a8c\u7801)\n \u68c0\u51fa\u6807\u7b7e git checkout <tagname>\n \u6b64\u65f6\uff0c\u4ed3\u5e93\u4f1a\u5904\u4e8e\u201c\u5206\u79bb\u5934\u6307\u9488\uff08detached HEAD\uff09\u201d\u7684\u72b6\u6001\u3002 \u5728\u201c\u5206\u79bb\u5934\u6307\u9488\u201d\u72b6\u6001\u4e0b\uff0c\u5982\u679c\u4f60\u505a\u4e86\u67d0\u4e9b\u66f4\u6539\u7136\u540e\u63d0\u4ea4\u5b83\u4eec\uff0c\u6807\u7b7e\u4e0d\u4f1a\u53d1\u751f\u53d8\u5316\uff0c \u4f46\u4f60\u7684\u65b0\u63d0\u4ea4\u5c06\u4e0d\u5c5e\u4e8e\u4efb\u4f55\u5206\u652f\uff0c\u5e76\u4e14\u5c06\u65e0\u6cd5\u8bbf\u95ee\uff0c\u9664\u975e\u901a\u8fc7\u786e\u5207\u7684\u63d0\u4ea4\u54c8\u5e0c\u624d\u80fd\u8bbf\u95ee\u3002 \u56e0\u6b64\uff0c\u5982\u679c\u4f60\u9700\u8981\u8fdb\u884c\u66f4\u6539\uff0c\u6bd4\u5982\u4f60\u8981\u4fee\u590d\u65e7\u7248\u672c\u4e2d\u7684\u9519\u8bef\uff0c\u90a3\u4e48\u901a\u5e38\u9700\u8981\u521b\u5efa\u4e00\u4e2a\u65b0\u5206\u652f\uff1a git checkout -b <NewBranchName> <tagname>\n \u65b0\u5206\u652f\u4e0a\u53ef\u4ee5\u8fdb\u884c\u63d0\u4ea4\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_12","title":"\u5341\u56db\u3001\u5e38\u89c1\u95ee\u9898","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_10","title":"1. \u63d0\u4ea4\u4ee3\u7801\u65f6\u63d0\u793a\u90ae\u7bb1\u6216\u8005\u540d\u79f0\u4e0d\u5bf9","text":"\u91cd\u65b0\u914d\u7f6e\u90ae\u7bb1\u6216\u8005\u540d\u79f0\uff0c\u7136\u540e\u91cd\u7f6e\u751f\u6548\uff1a git commit --amend --reset-author\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_10","title":"2. \u600e\u4e48\u56de\u6eda\u5230\u4e4b\u524d\u7684\u7248\u672c","text":"(1)\u67e5\u8be2\u5386\u53f2\u63d0\u4ea4\u8bb0\u5f55 git log\n \u627e\u5230\u4f60\u8981\u56de\u6eda\u7684\u7248\u672c\uff0c\u590d\u5236 hash \u503c\u3002 \u6ce8\u610f\uff1a\u662f commit \u7a7a\u683c\u4e4b\u540e\u7684 hash \u503c\uff0c\u4e4b\u524d\u6709\u540c\u5b66\u590d\u5236\u7684 Change-Id: \u8fd9\u6837\u80af\u5b9a\u62a5\u9519\u3002 (2)\u56de\u6eda\u7248\u672c\uff0c\u4e0d\u6e05\u9664\u4ee3\u7801 git reset --soft ${hash}\n (3)\u56de\u6eda\u7248\u672c\uff0c\u6e05\u9664\u4ee3\u7801\uff0c\u614e\u7528\u54c8 git reset --hard ${hash}\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-f-s-e","title":"3. \u6d4b\u8bd5\u62a5\u544a\u91cc\u9762 F S . E \u662f\u4ec0\u4e48\u610f\u601d","text":"F \u8868\u793a\u5931\u8d25\uff0c. \uff08\u70b9\uff09\u8868\u793a\u901a\u8fc7\uff0cS \u8868\u793a\u8df3\u8fc7\uff0cE \u8868\u793a error \u6709\u62a5\u9519"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git-status","title":"4. \u89e3\u51b3 git status \u4e2d\u6587\u663e\u793a\u7684\u95ee\u9898","text":"git config --global core.quotePath false\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5-apps","title":"5. apps \u76ee\u5f55\u4e0b\u989c\u8272\u6709\u4e9b\u662f\u9ec4\u8272\u7684","text":"\u5728 Pycharm \u4e2d apps \u76ee\u5f55\u4e0b\u5e94\u7528\u5e93\u6587\u4ef6\u662f\u9ec4\u8272\u7684\uff0c\u7f16\u8f91\u5668\u8bc6\u522b\u4e0d\u5230\u4ee3\u7801\u65b0\u589e\u548c\u4fee\u6539\uff1b \u7531\u4e8e\u793e\u533a\u7248 Pycharm \u4e0d\u80fd\u52a8\u6001\u8bc6\u522b\u591a\u4ed3\u5e93\uff0c\u9700\u8981\u5728 setting \u91cc\u9762\u624b\u52a8\u6ce8\u518c\uff0c\u64cd\u4f5c\u6b65\u9aa4\uff1a File \u2014> Settings \u2014> Version Control \u2014> \u70b9 + \u53f7 \u2014> Directory \u9009\u4e2d\u5e94\u7528\u5e93\u5de5\u7a0b\u76ee\u5f55 \u2014> VCS \u9009\u4e2d Git \u2014> Apply \u5982\u6b64\u5c31\u53ef\u4ee5\u4e86\u3002 \u4e13\u4e1a\u7248 Pycharm \u4e0d\u5b58\u5728\u8fd9\u4e2a\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#6-envsh-r","title":"6. \u6267\u884c env.sh \u62a5\u9519 $'\\r':\u672a\u627e\u5230\u547d\u4ee4","text":"\u51fa\u73b0\u8fd9\u4e2a\u95ee\u9898\u4f60\u5e94\u8be5\u662f\u5728 windows \u4e0a\u6253\u5f00\u6216\u7f16\u8f91\u8fc7 env.sh \u811a\u672c\uff0cwindows\u4e0b\u7684\u6362\u884c\u662f\u56de\u8f66\u7b26+\u6362\u884c\u7b26\uff0c\u4e5f\u5c31\u662f\\r\\n\uff0c\u800c Linxu \u4e0b\u662f\u6362\u884c\u7b26 \\n\uff0cLinux \u4e0b\u4e0d\u8bc6\u522b \\r\uff0c\u56e0\u6b64\u62a5\u9519\u3002 \u89e3\u51b3\u65b9\u6848\uff1a # \u5c06 \\r \u66ff\u6362\u4e3a\u7a7a\nsudo sed -i 's/\\r//' env.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#7","title":"7.\u600e\u6837\u4e3a\u5355\u72ec\u67d0\u4e00\u6761\u7528\u4f8b\u914d\u7f6e\u6267\u884c\u8d85\u65f6\u65f6\u95f4","text":"\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u5982\u4e0b\uff1a @pytest.mark.timeout(300) # \u5355\u4f4d\u79d2\ndef test_xxx_001():\npass\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#8-youqu","title":"8. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u6240\u6709\u4ee3\u7801\uff0c\u5305\u542b\u5b50\u4ed3\u5e93","text":"\u524d\u7f6e\u6761\u4ef6\uff1a\u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 # \u7b2c\u4e00\u6b21\u5b58\u50a8\u5bc6\u7801\uff0c\u63d0\u4f9b\u540e\u9762\u62c9\u4ee3\u7801(gerrit: ldap\u8d26\u53f7\u548c\u5bc6\u7801\uff0cgit\u62c9\u53d6\u7b2c\u4e00\u6b21\u8f93\u5165\u4fdd\u5b58\uff0c\u540e\u9762\u76f4\u63a5\u4f7f\u7528)\ngit config --global credential.helper store\n\n# \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\uff0c\u5e76\u9012\u5f52\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\" --recursive\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#9-youqu","title":"9. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\u6307\u5b9a\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u524d\u7f6e\u6761\u4ef6\uff1a \u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 \u5df2\u5b58\u50a8\u8bbf\u95ee\u5bc6\u7801 # \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\"\n# \u6307\u5b9a\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ncd youqu\ngit submodule update --init apps/autotest_xxx_xxx\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#10-youqu","title":"10. \u5982\u4f55\u66f4\u65b0 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\uff0c\u6240\u6709\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u66f4\u65b0\u6240\u6709\u5b50\u4ed3\u5e93\u4ee3\u7801 cd youqu\ngit pull & git submodule foreach git pull\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#11-youqu-master-detached-head","title":"11. \u5982\u4f55\u4fee\u590d YouQu \u6240\u6709\u5b50\u4ed3\u5e93 master \u5206\u652f\u6e38\u79bb\u5934\uff08detached head\uff09","text":"\u4fee\u590d\u6240\u6709\u5b50\u4ed3\u5e93\u9ed8\u8ba4master \u5206\u652f\u6e38\u79bb\u5934 cd youqu\ngit submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/","title":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212 \u5206\u7c7b\uff1a/ \u67b6\u6784\u5e08\uff1a/ \u76ee\u6807\uff1a \u5e94\u7528 AT \u67b6\u6784\u5de5\u7a0b\u5316\uff0c\u53c2\u8003\u6027\u80fd\u81ea\u52a8\u5316\u5de5\u7a0b\u5b8c\u6210\u5de5\u7a0b\u5316\u6539\u9020\u3002 \u5e94\u7528\u95f4\u7528\u4f8b\u89e3\u8026\uff0c\u89e3\u9664\u6240\u6709\u4ea4\u53c9\u8c03\u7528\u7684\u65b9\u6cd5\uff0c\u5404\u5e94\u7528\u80fd\u8ddf\u968f\u81ea\u8eab\u8fed\u4ee3\u5468\u671f\u72ec\u7acb\u7ef4\u62a4 AT \u7528\u4f8b\u3002 \u5b8c\u6210\u516c\u5171\u65b9\u6cd5\u7684\u62bd\u53d6\u6574\u5408\uff0c\u5f62\u6210\u4e00\u5957\u72ec\u7acb\u4e8e\u5e94\u7528\u95f4\u7684\u516c\u5171\u65b9\u6cd5\u5e93\uff0c\u5404\u5e94\u7528\u65b9\u6cd5\u91cc\u9762\u4e0d\u5b58\u5728\u88ab\u591a\u4e2a\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\u3002 \u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u4e3a\u5c06\u6765\u9002\u914d\u66f4\u591a\u7684 AT \u8fd0\u7528\u573a\u666f\u63d0\u4f9b\u652f\u6491\uff0c\u539f\u5219\u4e0a\u53ef\u5b9e\u73b0\u65e0\u9650\u6269\u5c55\uff0c\u5728\u6bcf\u65e5\u6784\u5efa\u548c\u6301\u7eed\u96c6\u6210\u6d41\u7a0b\u843d\u5730\u4f7f\u7528\u3002 \u4ee3\u7801\u89c4\u8303\u95ee\u9898\u6e05\u96f6\uff0c\u7b26\u5408 Shell Check\u3001Pylint\u3001\u7cfb\u7edf\u90e8\u76f8\u5173\u7f16\u7801\u89c4\u8303\u8981\u6c42\u3002 \u610f\u4e49\uff1a \u7edf\u4e00\u6210\u7814 AT \u67b6\u6784\u8bbe\u8ba1\u601d\u8def\uff0c\u6d88\u9664 AT \u4ee3\u7801\u5b9e\u73b0\u548c\u7ef4\u62a4\u4e0a\u53ef\u80fd\u51fa\u73b0\u7684\u5206\u6b67\uff0c\u6539\u5584\u5386\u53f2 AT \u65e0\u5de5\u7a0b\u5316\u8bbe\u8ba1\u7684\u7f3a\u9677\uff0c\u63d0\u9ad8\u67b6\u6784\u4e13\u4e1a\u6027\u3002 \u5404\u5e94\u7528 AT \u4ee3\u7801\u76f8\u4e92\u72ec\u7acb\uff0c\u5951\u5408\u5e94\u7528\u72ec\u7acb\u53d1\u5e03\u7279\u6027\uff0c\u53ef\u652f\u6301\u8fed\u4ee3\u671f\u95f4\u72ec\u7acb\u65b0\u589e\u3001\u7ef4\u62a4\u548c\u6267\u884c\u3002 \u65b9\u6cd5\u8c03\u7528\u903b\u8f91\u5f97\u5230\u7b80\u5316\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u66f4\u9ad8\u6548\uff1b\u516c\u5171\u5e93\u62bd\u53d6\uff0c\u51cf\u5c11\u65b9\u6cd5\u91cd\u590d\u7f16\u5199\uff0c\u63d0\u9ad8\u4ee3\u7801\u5229\u7528\u7387\uff1b\u5e73\u5747\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u4ece40\u5206\u949f\u964d\u4f4e\u81f330\u5206\u949f\uff0c\u65e5\u4ea7\u51fa\u7528\u4f8b\u4ece12\u6761/\u5929\u63d0\u5347\u81f316\u6761/\u5929\u3002 \u53ef\u7075\u6d3b\u652f\u6491\u4e0d\u540c\u7684\u81ea\u52a8\u5316\u8fd0\u7528\u573a\u666f\uff0c\u5982 CI\u3001\u5192\u70df\u6d4b\u8bd5\u3001\u96c6\u6210\u6d4b\u8bd5\u3001\u56de\u5f52\u6d4b\u8bd5\u3001\u4e13\u9879\u6d4b\u8bd5\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_2","title":"\u4e00\u3001\u80cc\u666f\u4ecb\u7ecd","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1","title":"1\u3001\u73b0\u6709\u67b6\u6784\u4ecb\u7ecd","text":"\u73b0\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u6574\u4f53\u5206\u4e3a\u4e09\u5c42\uff1a\u7528\u4f8b\u5c42\uff08\u4e1a\u52a1\u903b\u8f91\u5c42\uff09\u3001\u4e2d\u95f4\u5c42\uff08\u5143\u7d20\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff09\u3001\u6838\u5fc3\u5c42\uff08\u5e95\u5c42\u529f\u80fd\u5e93\u5c42\uff09\u3002 \u7528\u4f8b\u5c42\uff1a\u5373\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4e13\u6ce8\u4e8e\u4e1a\u52a1\u529f\u80fd\u903b\u8f91\uff0c\u4e0d\u5173\u5fc3\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\uff1b \u4e2d\u95f4\u5c42\uff1a\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff0c\u6bcf\u4e2a\u65b9\u6cd5\u5747\u5bf9\u5e94\u4e00\u4e2a\u5143\u7d20\u7684\u4e00\u4e2a\u5177\u4f53\u64cd\u4f5c\uff0c\u4e5f\u53ef\u4ee5\u662f\u591a\u4e2a\u64cd\u4f5c\u7684\u7ec4\u5408\u64cd\u4f5c\uff0c\u4e2d\u95f4\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u7528\u4f8b\u5c42\uff0c\u5177\u6709\u53ef\u6269\u5c55\u6027\u548c\u590d\u7528\u6027\uff1b \u6838\u5fc3\u5c42\uff1a\u4e3b\u8981\u5c01\u88c5\u7684\u5e95\u5c42\u529f\u80fd\u5b9e\u73b0\uff0c\u6b64\u5c42\u5728\u6846\u67b6\u4e2d\u63d0\u4f9b\u4e00\u4e9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u529f\u80fd\u6a21\u5757\u76f8\u5bf9\u72ec\u7acb\uff0c\u6838\u5fc3\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u64cd\u4f5c\u5c42\uff0c\u6bd4\u5982\uff1a\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7 UI \u5750\u6807\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u952e\u9f20\u64cd\u4f5c\u7684\u57fa\u7840\u65b9\u64cd\u4f5c\u6a21\u5757\u3001Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757\u3001\u6587\u4ef6\u7684\u589e\u5220\u6539\u67e5\u64cd\u4f5c\u6a21\u5757\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2","title":"2\u3001\u81ea\u52a8\u5316\u7684\u5e94\u7528","text":"2.1\u3001CI \u6d41\u7a0b \u6bcf\u65e5\u6784\u5efa\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u7814\u53d1\u6bcf\u65e5\u63d0\u4ea4\u7684\u4ee3\u7801\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u73ed\u4e4b\u540e\u4f1a\u5c06\u5404\u5e94\u7528\u8fdb\u884c\u6253\u5305\uff0c\u7136\u540e\u5728\u6d4b\u8bd5\u673a\u4e0a\u5b89\u88c5\u66f4\u65b0 deb \u5305\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u5e94\u7528\u63d0\u4ea4\u96c6\u6210\u7684\u7248\u672c\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u8f7d\u6700\u65b0\u7684 ISO \u8fdb\u884c PXE \u90e8\u7f72\uff0c\u7136\u540e\u6d4b\u8bd5\u673a\u5b89\u88c5\u6700\u65b0\u7684\u955c\u50cf\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 2.2\u3001\u9a8c\u6536\u6d4b\u8bd5 \u5728\u5404\u9a8c\u6536\u8282\u70b9\u8fdb\u884c\u81ea\u52a8\u5316\u9a8c\u6536\uff0c\u76ee\u524d\u7684\u7b56\u7565\u662f\u5168\u7528\u4f8b\u8986\u76d6\u5168\u67b6\u6784\u3002 2.3\u3001\u56de\u5f52\u6d4b\u8bd5 \u56de\u5f52\u6d4b\u8bd5\u4eca\u5e74\u89c4\u5212\u5efa\u8bbe\u4e2d\uff0c\u65e8\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u6267\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\uff0c\u51cf\u5c11\u529f\u80fd\u6d4b\u8bd5\u7684\u91cd\u590d\u52b3\u52a8\u529b\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3","title":"3\u3001\u5b58\u5728\u7684\u95ee\u9898","text":" \u5404\u5e94\u7528\u4e4b\u95f4\u5b58\u5728\u8026\u5408 \u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u521d\u671f\uff0c\u6240\u6709\u5e94\u7528\u662f\u6574\u4f53\u53d1\u5e03\uff0c\u6211\u4eec\u662f\u5c06\u6240\u6709\u5e94\u7528\u770b\u6210\u662f\u4e00\u4e2a\u6574\u4f53\uff0c\u5404\u5e94\u7528\u4f5c\u4e3a\u5176\u4e2d\u7684\u4e00\u4e2a\u6a21\u5757\uff0c\u6240\u4ee5\u5b58\u5728\u5e94\u7528\u95f4\u65b9\u6cd5\u4ea4\u53c9\u8c03\u7528\u7684\u95ee\u9898\uff0c\u8fd9\u6837\u4ece\u6700\u521d\u7684\u8bbe\u8ba1\u6765\u8bb2\u786e\u5b9e\u80fd\u591f\u51cf\u5c11\u91cd\u590d\u4ee3\u7801\u7684\u7f16\u5199\u3002\u4f46\u662f\u73b0\u5728\u5e94\u7528\u8d70\u72ec\u7acb\u53d1\u5e03\uff0c\u5404\u5e94\u7528\u90fd\u6709\u81ea\u5df1\u7684\u8fed\u4ee3\u8282\u594f\uff0c\u5728\u65b0\u9700\u6c42\u5feb\u901f\u53d8\u5316\u7684\u8fc7\u7a0b\u4e2d\uff0c\u81ea\u52a8\u5316\u7ef4\u62a4\u53d8\u5f97\u5f02\u5e38\u56f0\u96be\uff0c\u539f\u56e0\u5c31\u662f\u81ea\u52a8\u5316\u9879\u76ee\u91cc\u9762\u5404\u4e2a\u5e94\u7528\u7684\u6709\u6bd4\u8f83\u591a\u7684\u8026\u5408\u5173\u7cfb\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u8fdb\u884c\u89e3\u8026\uff0c\u4ee5\u9002\u5e94\u5e94\u7528\u4e0d\u540c\u7684\u8fed\u4ee3\u5468\u671f\u3002 \u65e0\u6cd5\u7cbe\u51c6\u7684\u5212\u5206\u7528\u4f8b\u8303\u56f4 \u7528\u4f8b\u6267\u884c\u7684\u8303\u56f4\u4e0d\u591f\u7cbe\u51c6\uff0c\u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u4e3b\u8981\u901a\u8fc7\u7528\u4f8b\u7684\u5173\u952e\u8bcd core\uff08\u6838\u5fc3\uff09\u6765\u533a\u5206\u7528\u4f8b\u662f\u5426\u4e3a\u6838\u5fc3\u7528\u4f8b\uff0c\u4f46\u662f\u8fd9\u6837\u7684\u533a\u5206\u592a\u5bbd\u6cdb\u4e86\uff0c\u4e0d\u80fd\u9002\u5e94\u81ea\u52a8\u5316\u6d4b\u8bd5\u5728\u591a\u573a\u666f\u4e0b\u7684\u5e94\u7528\u3002\u5f88\u591a\u573a\u666f\u4e0b\u6211\u4eec\u8fd8\u9700\u8981\u6839\u636e\u7528\u4f8b\u7684\u7b49\u7ea7\u3001\u7528\u4f8b\u7684\u7c7b\u578b\u3001\u7528\u4f8b\u6765\u6e90\u7b49\u7b49\uff0c\u4e0d\u540c\u7684\u7ef4\u5ea6\u6765\u6311\u9009\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u5173\u952e\u5b57\u9700\u8981\u4eba\u5de5\u4e00\u6761\u6761\u7684\u6539\uff0c\u8d39\u65f6\u8d39\u529b\uff0c\u800c\u4e14\u4e0d\u597d\u7ef4\u62a4\u3002 \u53d7\u65b0\u9700\u6c42\u5f71\u54cd\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u597d\u7ef4\u62a4 \u76ee\u524d\u9700\u8981\u8df3\u8fc7\u7684\u7528\u4f8b\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684\u7528\u4f8b\u811a\u672c\u91cc\u9762\uff0c\u6dfb\u52a0\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\uff0c\u540e\u7eed\u89e3\u9664\u8df3\u8fc7\u7684\u65f6\u5019\u53c8\u9700\u8981\u627e\u5230\u8fd9\u6761\u811a\u672c\uff0c\u5220\u6389\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\u3002\u5728\u8df3\u8fc7\u7528\u4f8b\u8f83\u591a\u7684\u60c5\u51b5\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u96be\u5ea6\u3002 \u7f16\u5199\u7528\u4f8b\u65f6\u903b\u8f91\u6bd4\u8f83\u590d\u6742\uff0c\u9700\u8981\u8c03\u7528\u591a\u4e2a\u5e94\u7528\u7684\u65b9\u6cd5\u6a21\u5757\u3002 \u6846\u67b6\u6269\u5c55\u6027\u4e0d\u8db3\uff0c\u65e0\u6cd5\u6574\u5408\u6027\u80fd\u81ea\u52a8\u5316\u3001\u538b\u6d4b\u81ea\u52a8\u5316\u3001\u5b89\u5168\u81ea\u52a8\u5316\u7b49\u4e13\u9879\u6d4b\u8bd5\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_3","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u4e3a\u89e3\u51b3\u73b0\u6709\u95ee\u9898\uff0c\u9002\u5e94\u4e0d\u65ad\u4e30\u5bcc\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u66f4\u597d\u7684\u53d1\u6325\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4f5c\u7528\uff0c\u9700\u8981\u5bf9\u81ea\u52a8\u5316\u67b6\u6784\u53ca\u5404\u529f\u80fd\u6a21\u5757\u8fdb\u884c\u91cd\u65b0\u8bbe\u8ba1\u89c4\u5212\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_1","title":"1\u3001\u67b6\u6784\u8bbe\u8ba1","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_1","title":"2\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u6846\u67b6\u7684\u8fd0\u884c\u903b\u8f91\uff1a\u901a\u8fc7\u6838\u5fc3\u5c42\u63d0\u4f9b\u4e00\u4e2a\u57fa\u7840\u80fd\u529b\uff0c\u4e1a\u52a1\u5c42\u6839\u636e\u5b9e\u9645\u4e1a\u52a1\u9700\u6c42\uff08\u6d4b\u8bd5\u7528\u4f8b\uff09\u52a8\u6001\u52a0\u8f7d\u6838\u5fc3\u5c42\uff0c\u6267\u884c\u5165\u53e3\u52a0\u8f7d\u76f8\u5e94\u7684\u7528\u4f8b\u96c6\u5e76\u63a7\u5236\u6267\u884c\uff0c\u5e94\u7528\u5c42\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u9700\u6c42\uff0c\u901a\u8fc7\u76f8\u5e94\u7684\u914d\u7f6e\u9879\u8fdb\u884c\u914d\u7f6e\uff0c\u4ece\u800c\u89e6\u53d1\u81ea\u52a8\u5316\u6d4b\u8bd5\u4efb\u52a1\u3002 \u6838\u5fc3\u5c42\uff1a\u57fa\u672c\u4fdd\u6301\u4e0d\u53d8\uff0c\u90e8\u5206\u6a21\u5757\u4f1a\u6d89\u53ca\u5230\u65b0\u529f\u80fd\u5f00\u53d1\uff0c\u6838\u5fc3\u5c42\u5404\u529f\u80fd\u6a21\u5757\u4fdd\u6301\u72ec\u7acb\u6027\uff0c\u63d0\u4f9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u4f9b\u4e0a\u5c42\u8c03\u7528\uff1b \u5e95\u5c42\u6838\u5fc3\u6a21\u5757\u5305\u62ec\uff1a \u56fe\u50cf\u8bc6\u522b\u6a21\u5757 UI \u5b9a\u4f4d\u6a21\u5757 Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757 \u5c5e\u6027\u5b9a\u4f4d\u6a21\u5757 \u65e5\u5fd7\u6a21\u5757 \u952e\u9f20\u64cd\u4f5c\u6a21\u5757 \u6587\u4ef6\u64cd\u4f5c\u6a21\u5757 \u5f55\u5c4f\u6a21\u5757 \u81ea\u5b9a\u4e49\u65ad\u8a00\u6a21\u5757 \u7528\u4f8b\u6267\u884c\u6a21\u5757 PXE \u88c5\u673a\u6a21\u5757 \u952e\u9f20\u4fe1\u53f7\u6a21\u62df\u6a21\u5757 OCR \u6a21\u5757 \u4e1a\u52a1\u5c42\uff1a\u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e94\u7528\u5185\u5305\u542b\u591a\u4e2a\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5982\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7b49\uff0c\u540e\u7eed\u53ef\u4ee5\u6839\u636e\u9700\u8981\u5ac1\u63a5\u8fdb\u6765\u3002\u5176\u4e2d\u529f\u80fd\u6d4b\u8bd5\u8bbe\u8ba1\u601d\u8def\uff1a \u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e76\u5c06\u6d4b\u8bd5\u6570\u636e\u548c\u6d4b\u8bd5\u8d44\u6e90\u6574\u5408\u8fdb\u6765\uff0c\u589e\u52a0\u7528\u4f8b\u6807\u7b7e csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ed9\u6bcf\u6761\u7528\u4f8b\u6253\u6807\u7b7e\u3002 \u5404\u6807\u7b7e\u6240\u4f7f\u7528\u5bf9\u5e94\u7684\u5b57\u6bb5\u540d\u79f0\uff0c\u4f7f\u7528 csv \u6587\u4ef6\u7ef4\u62a4\u7528\u4f8b\u4e0e\u6807\u7b7e\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u5bf9\u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u53ef\u4ee5\u7ec4\u5408\u5176\u4e2d\u7684\u6807\u7b7e\u800c\u4ece\u9a71\u52a8\u5bf9\u5e94\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\uff0c\u517c\u5bb9\u73b0\u6709\u7528\u4f8b\u6807\u7b7e\uff0c\u4e14\u652f\u6301\u7528\u4f8b\u6807\u7b7e\u53ef\u6269\u5c55\uff1b \u4f7f\u7528 csv \u683c\u5f0f\u6587\u4ef6\u53ef\u4ee5\u65b9\u4fbf\u7684\u4f7f\u7528 Excel \u8868\u683c\u6253\u5f00\u8fdb\u884c\u7f16\u8f91\uff0c\u540c\u65f6\u7531\u4e8e csv \u6587\u4ef6\u5b9e\u9645\u662f\u4ee5\u90fd\u597d\u5206\u9694\u7684\u6587\u672c\u6587\u4ef6\uff0c\u4ee3\u7801\u4e2d\u53ef\u4ee5\u5728\u4e0d\u4f9d\u8d56\u4e09\u65b9\u5e93\u7684\u60c5\u51b5\u4e0b\u65b9\u4fbf\u5feb\u901f\u7684\u89e3\u6790\u5b83\uff0c\u53ef\u64cd\u4f5c\u6027\u548c\u53ef\u7ef4\u62a4\u6027\u8f83\u9ad8\u3002 \u5404\u4e2a\u5e94\u7528\u4e4b\u95f4\uff0c\u7528\u4f8b\u3001\u65b9\u6cd5\u3001\u6807\u7b7e\u548c\u8d44\u6e90\u90fd\u662f\u76f8\u4e92\u72ec\u7acb\u7684\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u7528\u4f8b\u65f6\u53ea\u9700\u8981\u81ea\u5df1\u5e94\u7528\u4e0b\u7684\u65b9\u6cd5\u548c\u516c\u5171\u5e93\u5373\u53ef\u3002 \u7ed3\u6784\u4e3e\u4f8b\uff1a .\n\u251c\u2500\u2500 apps\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_album # \u5e94\u7528\u540d (\u7528\u4e0b\u5212\u7ebf\u8fde\u63a5\u662f Python \u7f16\u7801\u89c4\u8303)\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_assert # \u65ad\u8a00\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_function_tag.csv # \u7528\u4f8b\u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 asan_cases # \u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases # \u529f\u80fd\u6d4b\u8bd5\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 res # \u6d4b\u8bd5\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config # \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_widget # \u5e94\u7528\u81ea\u5df1\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_widget # \u65b9\u6cd5\u57fa\u7c7b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 other_widget # \u8c03\u7528\u5176\u4ed6\u5e94\u7528\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_camera\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases\n\u2502\u00a0\u00a0 \u2502\u00a0 ...\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 public_widget # \u516c\u5171\u65b9\u6cd5\u5e93\n\u251c\u2500\u2500 config # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n...\n config \u914d\u7f6e\u6a21\u5757\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u76f8\u5e94\u914d\u7f6e\uff0c\u6d4b\u8bd5\u540c\u5b66\u53ef\u4ee5\u6839\u636e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5728 config \u91cc\u9762\u8fdb\u884c\u914d\u7f6e\u3002 \u5168\u5c40\u914d\u7f6e\uff1a \u6267\u884c\u4e00\u4e2a\u6216\u591a\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff1a\u5728 pattern \u91cc\u9762\u5199\u5165\u5e94\u7528\u5305\u540d\uff0c\u591a\u4e2a\u5e94\u7528\u4e4b\u95f4\u7528 or \u8fde\u63a5\uff0c\u5982 deepin-music or deepin-movie\uff1b \u5192\u70df\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a smoke\uff1b \u96c6\u6210\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a core \uff1b \u5168\u91cf\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u4e3a\u7a7a\u5373\u53ef\uff1b \u901a\u8fc7 tags \u7684\u914d\u7f6e\u6bd4\u8f83\u7075\u6d3b\uff0c\u540e\u9762\u6807\u7b7e\u5316\u7ba1\u7406\u7ae0\u8282\u4f1a\u8bb2\u5230\uff0c\u652f\u6301\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u7075\u6d3b\u914d\u7f6e\u3002 \u6307\u5b9a\u67d0\u53f0\u673a\u5668\u5728\u6307\u5b9a\u955c\u50cf\u7248\u672c\u4e0a\u6267\u884c\u7528\u4f8b\uff1a\u5728 IP \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a IP\uff0c\u5e76\u5728 URL \u91cc\u9762\u586b\u5165\u955c\u50cf\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u6846\u67b6\u4f1a\u8c03\u7528 PXE \u8fdb\u884c\u81ea\u52a8\u88c5\u673a\uff0c\u88c5\u673a\u5b8c\u4e4b\u540e\u81ea\u52a8\u5f00\u59cb\u6267\u884c\u914d\u7f6e\u7684\u6d4b\u8bd5\u7528\u4f8b\u3002 \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\uff1a \u6bcf\u4e2a\u5e94\u7528\u5185\u90e8\u4f1a\u6709\u4e00\u4e2a\u5355\u72ec\u7684\u914d\u7f6e\u6a21\u5757\uff0c\u4f1a\u5305\u542b\u4e00\u4e9b\u672c\u5e94\u7528\u7684\u6d4b\u8bd5\u8d44\u6e90\u7684\u8def\u5f84\u3001\u6267\u884c\u7528\u4f8b\u7684\u6807\u7b7e\u914d\u7f6e\u7b49\u7b49\uff0c\u5982\u679c\u5728\u5c40\u90e8\u914d\u7f6e\u91cc\u9762\u914d\u7f6e\u4e86\u7528\u4f8b\u6267\u884c\u6807\u7b7e\uff0c\u800c\u5916\u5c42 runner \u51fa\u6ca1\u6709\u6307\u5b9a\u6267\u884c\u6807\u7b7e\uff0c\u5219\u5728\u6267\u884c\u65f6\u53ea\u4f1a\u6267\u884c\u5c40\u90e8\u914d\u7f6e\u5df2\u914d\u7f6e\u7684\uff0c\u82e5\u5916\u5c42 runner \u4e5f\u914d\u7f6e\u4e86\u6267\u884c\u6807\u7b7e\uff0c\u5219\u4f1a\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u7528\u4f8b\u3002 \u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u914d\u7f6e\u90fd\u5728\u540c\u4e00\u4e2a\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\uff0cpy \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684\u7c7b\uff0cini \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684 option\u3002 \u5168\u5c40\u914d\u7f6e\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u7b56\u7565\u5982\u4e0b\uff1a \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5c40\u90e8\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5e94\u7528\u5c42\uff1arunner \u662f\u6d4b\u8bd5\u6267\u884c\u7684\u5165\u53e3\uff0c\u5b83\u4f1a\u6839\u636e\u914d\u7f6e\u91cc\u9762\u7684\u914d\u7f6e\u9879\uff0c\u8fdb\u884c\u7528\u4f8b\u7684\u52a0\u8f7d\u548c\u6267\u884c\u3002\u5b83\u63d0\u4f9b\u63a5\u53e3\u7ed9\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\uff0c\u5e73\u53f0\u4e0a\u7684\u6307\u4ee4\u5b9e\u9645\u4e0a\u90fd\u662f\u901a\u8fc7\u4e0b\u53d1\u7ed9 runner\uff0c\u7136\u540e\u7531 runner \u6765\u6267\u884c\u76f8\u5e94\u7684\u6d4b\u8bd5\u3002 \u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u662f\u4e00\u4e2a\u524d\u7aef\u7cfb\u7edf\uff0c\u53ef\u4ee5\u8fdb\u884c\u6d4b\u8bd5\u673a\u7ba1\u7406\u3001\u81ea\u52a8\u5b89\u88c5\u955c\u50cf\u3001\u81ea\u52a8\u5b89\u88c5\u6307\u5b9a\u5e94\u7528\u7248\u672c\u3001\u8fdb\u884c\u6d4b\u8bd5\u7528\u4f8b\u8303\u56f4\u9009\u62e9\u3001\u7528\u4f8b\u89e6\u53d1\u6267\u884c\u63a7\u5236\u3001\u7ed3\u679c\u5c55\u793a\u8f93\u51fa\u7b49\u3002 \u4e00\u4e2a\u5e94\u7528\u7684\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\u90fd\u53ef\u4ee5\u5355\u72ec\u89e6\u53d1\u3002 \u517c\u5bb9\u6027\u6d4b\u8bd5\u4e3b\u8981\u901a\u8fc7 PXE \u670d\u52a1\u5668\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u88c5\u673a\uff0c\u7136\u540e\u914d\u5408 AT \u8fdb\u884c\u6d4b\u8bd5\uff0c\u53ef\u4ee5\u5b9e\u73b0\u4e0d\u540c\u7cfb\u7edf\u7248\u672c\u3001\u4e0d\u540c\u5e94\u7528\u7248\u672c\u73af\u5883\u4e0a\u90fd\u53ef\u4ee5\u8fdb\u884c\u81ea\u52a8\u5316\u7684 AT \u6267\u884c\uff0c\u63d0\u9ad8\u517c\u5bb9\u6027\u6d4b\u8bd5\u6548\u7387\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_4","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_2","title":"1\u3001\u7528\u4f8b\u89e3\u8026","text":"\u5b58\u5728\u8026\u5408\u5173\u7cfb\u7684\u65b9\u6cd5\uff1a\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u88ab\u5916\u90e8\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\uff0c\u5219\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u8026\u5408\u5173\u7cfb\u3002 1.1\u3001\u901a\u8fc7\u7f16\u8f91\u5668 Find Usages \u67e5\u770b\u6bcf\u4e2a\u65b9\u6cd5\u88ab\u8c03\u7528\u7684\u8def\u5f84\u548c\u88ab\u8c03\u7528\u6b21\u6570\uff1b 1.2\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 1 \u4e2a\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728\u5916\u90e8\u5e94\u7528\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1b 1.3\u3001\u64cd\u4f5c\u5c42\u6587\u4ef6\u540d\u5747\u4ee5 widget \u7ed3\u5c3e\uff0c\u7c7b\u540d\u4ee5 Widget \u7ed3\u5c3e\uff0c\u5982\uff1a\u6587\u4ef6\u540d music_widget.py \uff1a class MusicWidget:\n\"\"\"\u97f3\u4e50\u7684\u64cd\u4f5c\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_2","title":"2\u3001\u516c\u5171\u5e93\u5efa\u8bbe","text":"2.1\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 2 \u4e2a\u53ca\u4ee5\u4e0a\u7684\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728 public_widget \u76ee\u5f55\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1bpublic_widget \u5373\u4e3a\u516c\u5171\u65b9\u6cd5\u5e93\uff1b 2.2\u3001\u5728\u7528\u4f8b\u5c42\u4fee\u6539\u7528\u4f8b\u4e2d\u7c7b\u7684\u5bfc\u5165\u8def\u5f84\uff0c\u5c5e\u4e8e\u516c\u5171\u65b9\u6cd5\u7684\u5219\u8c03\u7528 public_widget \u4e2d\u7684\u7c7b\uff0c\u5916\u90e8\u5e94\u7528\u7684\u64cd\u4f5c\u65b9\u6cd5\uff0c\u5219\u8c03\u7528\u672c\u5e94\u7528\u76ee\u5f55\u4e0b\u91cd\u5199\u7684\u5916\u90e8\u5e94\u7528\u65b9\u6cd5\u3002 \u6bd4\u5982\uff1a\u51e0\u4e4e\u6240\u6709\u591a\u5a92\u4f53\u5e94\u7528\u90fd\u9700\u8981\u901a\u8fc7\u6587\u7ba1\u52a0\u8f7d\u8d44\u6e90\uff0c\u8c03\u8d77\u7684\u6587\u7ba1\u5bf9\u8bdd\u6846\u5b9e\u9645\u4e3a dde-desktop\uff0c\u56e0\u6b64\u5c06 desktop_widget.py \u653e\u5230 public_widget \u91cc\u9762\uff1a class DdeDesktopPublicWidget:\n\"\"\"\u516c\u5171-\u684c\u9762\u7684\u64cd\u4f5c\u65b9\u6cd5\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3_1","title":"3\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406","text":"3.1\u3001\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1a\u5bf9\u5e94 core\u3001smoke\uff0c\u6216\u4e3a\u7a7a\uff1b \u7528\u4f8b\u6765\u6e90\uff1a\u5bf9\u5e94 PMS \u7528\u4f8b\u6765\u6e90\uff0c\u5206\u522b\u7528 acp1\u3001acp2\u3001acp3\u3001acp4 \u8868\u793a\u3002 acp1 \uff1a\u4e1a\u52a1\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5199\u7684\u7528\u4f8b\uff0c\u88ab\u7528\u4e8e\u9a8c\u6536\u6d4b\u8bd5\u7684\uff1b acp2 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5f15\u5165\u7684\u4ea7\u54c1\u9a8c\u6536\u6d4b\u8bc4\u90e8\u7684\u7528\u4f8b\uff1b acp3 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u6839\u636e\u4ea7\u54c1\u9700\u6c42\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\uff1b acp4 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u901a\u8fc7\u793e\u533a\u3001\u8bba\u575b\u7528\u6237\u53cd\u9988\u95ee\u9898\u603b\u7ed3\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\u3002 \u4e3e\u4f8b\uff1a \u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u7528\u4f8b\u6765\u6e90 001 L1 core acp1 \u6807\u7b7e\u91c7\u7528\u679a\u4e3e\u7684\u65b9\u5f0f\u8fdb\u884c\u4ee3\u53f7\u7ba1\u7406\u65b9\u4fbf\u7ba1\u7406\u4ee5\u53ca\u540e\u7eed\u6269\u5c55\u3002 3.2\u3001\u5728\u6bcf\u4e2a\u5e94\u7528\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u7b2c\u4e00\u5217\u4e3a\u7528\u4f8b\u7684 ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ba1\u7406\u6a21\u5757\u5185\u7684\u7528\u4f8b\u6807\u7b7e\u3002\u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 3.3\u3001\u5bf9\u7167 PMS \u4e0a\u7528\u4f8b\u7b49\u7ea7\u3001\u7528\u4f8b\u7c7b\u578b\u548c\u7528\u4f8b\u6765\u6e90\uff0c\u6807\u8bb0\u6240\u6709\u5df2\u5b9e\u73b0\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u540e\u7eed\u7f16\u5199\u65b0\u589e\u81ea\u52a8\u5316\u7528\u4f8b\u65f6\uff0c\u6bcf\u5199\u4e00\u6761\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684 csv \u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u6b64\u6761\u7528\u4f8b\u7684\u6807\u7b7e\u3002 3.4\u3001\u8df3\u8fc7\u7528\u4f8b\u6807\u7b7e\u5316 \u73b0\u6709\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a\uff1a \u4e3e\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u8bb0\u4e3a \u201cskip-\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u8bb0\uff0c\u5982\u679c\u5df2\u7ecf\u6807\u8bb0\u4e86\u8df3\u8fc7\u539f\u56e0\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u8bb0\u4e3a SKIPED\uff0c\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\u3002 \u6240\u6709\u7684\u6807\u7b7e\u5728 docs \u76ee\u5f55\u4e0b\u4f1a\u6709\u4e00\u4e2a\u6587\u6863\uff0c\u6587\u6863\u6682\u5b9a\u540d\u79f0\u4e3a\uff1atags_info.md\uff0c\u7528\u4e8e\u8bf4\u660e\u73b0\u5728\u5df2\u7ecf\u4f7f\u7528\u5230\u7684\u6807\u7b7e\uff0c\u4ee5\u53ca\u8fd9\u4e9b\u6807\u7b7e\u7684\u89e3\u91ca\u548c\u7528\u6cd5\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#4","title":"4\u3001\u7528\u4f8b\u6267\u884c","text":"4.1\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u7684\u9a71\u52a8\u6267\u884c\u903b\u8f91\u529f\u80fd\u5b9e\u73b0 \u5f00\u53d1\u6839\u636e\u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\u91cc\u9762\u7684\u7528\u4f8b\u6807\u7b7e\u6267\u884c\u5bf9\u5e94\u7528\u4f8b\u7684\u529f\u80fd\uff0c\u80fd\u652f\u6301\u591a\u4e2a\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u6267\u884c\u5165\u53e3\u80fd\u968f\u610f\u901a\u8fc7\u7528\u4f8b\u6807\u7b7e\u6307\u5b9a\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002 \u7528\u4f8b\u6807\u7b7e\u7684\u9a71\u52a8\u65b9\u5f0f\u5fc5\u987b\u80fd\u652f\u6301\u6807\u7b7e\u7684\u6269\u5c55\uff0c\u672a\u6765\u968f\u7740\u4e1a\u52a1\u7684\u53d8\u5316\u53ef\u80fd\u9700\u8981\u589e\u52a0\u5404\u79cd\u5404\u6837\u7684\u6807\u7b7e\u3002 4.2\u3001\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u6267\u884c \u529f\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u3001\u6027\u80fd\u6d4b\u8bd5\u7b49\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u662f\u5206\u5f00\u6267\u884c\u7684\uff0c\u4e5f\u5c31\u662f\u5728\u4e00\u6b21\u6267\u884c\u4e2d\uff0c\u53ea\u80fd\u6267\u884c\u5176\u4e2d\u4e00\u79cd\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5177\u4f53\u8981\u6267\u884c\u54ea\u4e00\u79cd\u540c\u6837\u901a\u8fc7\u53c2\u6570\u6765\u63a7\u5236\u3002 4.3\u3001\u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c \u7531\u4e8e\u6d4b\u8bd5\u673a\u8d44\u6e90\u6709\u9650\uff0c\u968f\u7740\u81ea\u52a8\u5316\u7528\u4f8b\u6570\u91cf\u7684\u589e\u52a0\uff0cCI \u6267\u884c\u65f6\u95f4\u4f1a\u8d8a\u6765\u8d8a\u957f\u3002 \u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c\u7684\u529f\u80fd\uff1a \u540c\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\u5206\u6563\u5230\u4e0d\u540c\u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u4e0a\u6267\u884c\uff0c\u7f29\u77ed\u6267\u884c\u603b\u65f6\u95f4\uff1b \u7b2c\u4e8c\u5929\u8dd1\u7684\u65f6\u5019\u540c\u4e00\u4e2a\u673a\u5668\u4e0a\u4f1a\u6267\u884c\u6628\u5929\u6ca1\u6709\u6267\u884c\u5230\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u6267\u884c\u540c\u7406\uff1b \u53ef\u4ee5\u5b9e\u73b0\u5728\u5168\u67b6\u6784\u6d4b\u8bd5\u673a\u4e0a\u8f6e\u6d41\u6267\u884c\u7528\u4f8b\uff0c\u65e2\u80fd\u4fdd\u8bc1\u6267\u884c\u4e86\u6240\u6709\u7684\u7528\u4f8b\uff0c\u53c8\u80fd\u5728\u8d44\u6e90\u6709\u9650\u7684\u60c5\u51b5\u4e0b\u8986\u76d6\u4e86\u6240\u6709\u7684\u67b6\u6784\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#5","title":"5\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0","text":"5.1\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u4f5c\u4e3a\u524d\u7aef\u754c\u9762\u7cfb\u7edf\uff0c\u901a\u8fc7\u9875\u9762\u4e0a\u7684\u4e00\u4e9b\u529f\u80fd\u9009\u9879\u8fdb\u884c\u5bf9\u5e94\u6d4b\u8bd5\u4efb\u52a1\u7684\u7ba1\u7406\u6216\u89e6\u53d1\uff0c\u4e1a\u5185\u6bd4\u8f83\u6d41\u884c\u7684\u5b9e\u73b0\u65b9\u6848\u662f\u4f7f\u7528 Vue + DRF \u5b9e\u73b0\u4e00\u4e2a\u524d\u540e\u7aef\u5206\u79bb\u7684\u7cfb\u7edf\u3002 \u6d4b\u8bd5\u5e73\u53f0\u53ef\u80fd\u4f1a\u6d89\u53ca\u5230\u7684\u6a21\u5757\u6709\uff1a\u6d4b\u8bd5\u673a\u8d44\u6e90\u7ba1\u7406\u6a21\u5757\u3001\u7528\u4f8b\u6267\u884c\u63a7\u5236\u6a21\u5757\u3001\u7ed3\u679c\u5c55\u793a\u6a21\u5757\u3001PXE \u955c\u50cf\u5b89\u88c5\u6a21\u5757\u7b49\u3002 \u7528\u6237\uff08\u6d4b\u8bd5\u3001\u7814\u53d1\u540c\u5b66\u7b49\uff09\u53ef\u4ee5\u914d\u7f6e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5982\u6267\u884c\u54ea\u4e2a\u5e94\u7528\u3001\u6267\u884c\u7528\u4f8b\u7684\u8303\u56f4\u3001\u5728\u54ea\u53f0\u673a\u5668\u4e0a\u6267\u884c\u3001\u955c\u50cf\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u5e94\u7528\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u6267\u884c\u65f6\u95f4\u3002 5.2\u3001\u6267\u884c\u5165\u53e3 runner \u63d0\u4f9b\u7ed9\u6d4b\u8bd5\u5e73\u53f0\u7684\u63a5\u53e3\u5305\u62ec\uff1a\u7528\u4f8b\u6267\u884c\u63a5\u53e3\u3001\u7ed3\u679c\u8fd4\u56de\u63a5\u53e3\u3001\u955c\u50cf\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u955c\u50cf\u5b89\u88c5\u63a5\u53e3\u3001\u5e94\u7528\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u5e94\u7528\u5b89\u88c5\u66f4\u65b0\u63a5\u53e3\u7b49\u3002 \u524d\u7aef\u5e73\u53f0\u76ee\u524d\u8fd8\u6ca1\u6709\u592a\u591a\u8be6\u7ec6\u7684\u65b9\u6848\uff0c\u672c\u6b21\u8bbe\u8ba1\u4e3b\u8981\u96c6\u4e2d\u5728\u540e\u7aef\u8fd9\u90e8\u5206\u67b6\u6784\u7684\u8bbe\u8ba1\u4e0a\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_5","title":"\u56db\u3001\u5b9e\u65bd\u8ba1\u5212","text":"\u8fd1\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u6587\u7ba1\u4ee3\u7801\u89e3\u8026 2022/3/28 2022/4/8 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u56fe\u5f62\u56fe\u50cf\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u97f3\u89c6\u9891\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5168\u5c40\u641c\u7d22\u4ee3\u7801\u89e3\u8026 2022/4/25 2022/4/26 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u516c\u5171\u5e93\u5efa\u8bbe 2022/4/27 2022/5/5 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5c01\u88c5\u7684\u65b9\u6cd5\u6574\u7406\u6210\u4e00\u4e2a\u8868 2022/5/6 2022/5/10 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7528\u4f8b\u6807\u7b7e\u5206\u7c7b\u8bc4\u4f30 2022/5/11 2022/5/11 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u6807\u7b7e\u5316\u6267\u884c\u9a71\u52a8\u7a0b\u5e8f\u7f16\u5199 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u9700\u5b9e\u73b0\u81ea\u52a8\u89e3\u6790 csv \u8868\u683c\u4e2d\u7684\u7528\u4f8b\u7f16\u53f7 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u722c\u866b\u811a\u672c\uff0c\u722c\u53d6 pms \u4e0a\u7528\u4f8b\u7684\u6807\u7b7e 2022/5/11 2022/5/13 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u5b9a\u65f6\u81ea\u52a8\u7ef4\u62a4\u672c\u5730 csv \u6587\u4ef6\u811a\u672c 2022/5/11 2022/5/20 \u4e2d\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u76ee\u5f55\u7ed3\u6784\u8c03\u6574 2022/5/20 2022/6/2 \u5b8c\u6210\u5168\u5c40\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u5177\u4f53\u65b9\u6848\u548c\u903b\u8f91\u5b9e\u73b0 2022/6/6 2022/6/17 \u9759\u6001\u626b\u63cf\u95ee\u9898\u6e05\u96f6 2022/6/20 2022/7/1 \u5b8c\u6210\u65b0\u6846\u67b6\u4f7f\u7528\u57f9\u8bad 2022/7/4 2022/7/11 \u843d\u5730\u8fd0\u884c 2022/7/12 2022/7/20 \u5e95\u5c42\u5e93\u7528\u9014\u8bf4\u660e\u6587\u6863\u7f16\u5199 2022/7/21 2022/7/28"}]} \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz index 8ffaebc1..e0b7bbfc 100644 Binary files a/sitemap.xml.gz and b/sitemap.xml.gz differ diff --git "a/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" "b/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" index 25f669d5..97100667 100644 --- "a/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" +++ "b/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs @@ -1215,8 +1215,7 @@ 智能化功能测试# Attribution :chengdu Test Team # Date :2021/08/20 -此方案仍在演进中 -此方案仍在演进中 +此方案仍在演进中 仓库地址:https://gitlabcd.uniontech.com/autotest/cd-desktop-aitest 一、方案概述¶ 基于深度学习智能识别应用的元素控件,用于在自动化测试操作过程中的元素定位以及判断结果时的断言处理;自动化测试过程中,测试机上的画面通过采集盒传输到服务器上,服务器对视频画面进行智能识别后,服务器智能判断用例是否执行成功,然后对测试机下发下一步操作指令,测试机接受并执行下一步操作。 diff --git "a/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" "b/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" index cdf9ccde..06c9e9a5 100644 --- "a/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" +++ "b/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" @@ -95,7 +95,7 @@ - + @@ -226,7 +226,7 @@ - + YouQu Docs diff --git "a/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" "b/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" index 121b4507..72123668 100644 --- "a/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" +++ "b/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs @@ -752,6 +752,13 @@ + + + + + 4、虚拟化部署 + + @@ -1661,6 +1668,13 @@ + + + + + 4、虚拟化部署 + + @@ -2604,18 +2618,12 @@ 1、标签说明流水线使用指导; 跳过原因:skip-XXX,用于控制用例是否执行; 确认修复:fixed-XXX,用于标记用例的修复状态(后面详细讲解用法); @@ -2629,26 +2637,30 @@ 1、标签说明PMS用例ID 用例级别 用例类型 +设备类型 +用例来源 上线对象 测试级别 跳过原因 确认修复 -废弃用例 -... +废弃用例 +... -001 +679537 679537 L1 FUNC +PPL + CICD C1 skip-XXX fixed-XXX -removed-已废弃 -... +removed-已废弃 +... @@ -2656,7 +2668,7 @@ 2、操作步骤csv 的文件名。 例如: -相册的用例文件为 test_album_xxx.py,xxx 表示任意三位数字代表用例序号,此时 csv 文件名就应为 album.csv; +相册的用例文件为 test_album_xxx.py,xxx 表示用例的ID(也可以是自定义的数字代表用例序号),此时 csv 文件名就应为 album.csv; 对于用例规模比较大的应用,比如文件管理器,建议分模块,每个模块建立一个 csv 文件,所有 csv 文件建议放在一个 tags 目录下。 是否分模块维护 csv 取决于应用的用例复杂度,同时我们应该充分考虑后期的可维护性,csv 文件太多了也是一个很糟糕的事情。 @@ -2677,7 +2689,7 @@ 3.1.1、固定跳过001 +679537 ... skip-受到某新需求影响 @@ -2742,7 +2754,7 @@ 3.2、确认修复001 +679537 ... skip-受到某新需求影响 fixed-已修复 @@ -2787,7 +2799,7 @@ 3.3、废弃用例4、设计思路¶ 上面介绍 Pytest 框架提供的标签功能 mark,使用时需要为每一个用例添加标签装饰器,则操作复杂,可维护性差,其根本问题就是标签分散在每一条用例的装饰器上,难以集中维护;于是乎将所有标签使用 csv 文件进行集中管理,并通过 Pytest 的钩子函数,读取 csv 文件,动态添加标签到用中。 5、CSV文件格式¶ -此配置文件需要维护大量的标签数据,且要方便能使用Excel打开进行编辑查看,更重要的是我们不想引入三方依赖,CSV 文件几乎是唯一能满足所有的要求的文件格式。 +此配置文件需要维护大量的标签数据,且要方便能使用 Excel 打开进行编辑查看,更重要的是我们不想引入三方依赖,CSV 文件几乎是唯一能满足所有的要求的文件格式。 七、日志系统¶ 1、背景¶ 基于 YouQu 自动化测试框架操作方法封装写法,通常是这样的:类里面一个函数只包含一个操作或多次调用的一系列可合并的操作; @@ -2888,7 +2900,7 @@ 1、原则 大文件不能上传到工程里面,保持整个工程的轻量化,这样在克隆代码的时候才能非常快速方便使用,我们见过一个 AT 工程 clone 大小达到好几个 G,简直不可思议。 其实代码文件的大小是很小的,也就是说,纯写代码随便写工程也不会太大,而文档(包含插图)等资源却是很占空间。 -因此我们选择将 YouQu 的文档工程单独迁出到独立的仓库 youqu-docs 。 +因此我们选择将 YouQu 的文档工程涉及到的图片资源都采用外链加载; 2、安装¶ 项目根目录下运行 env.sh 即可。 bash env.sh @@ -2930,17 +2942,25 @@ 3.2、裁剪依赖bash env_dev.sh +4、虚拟化部署¶ +YouQu默认采用虚拟化部分,虚拟化环境实际安装的位置是在 $HOME/.local/share/virtualenvs/youqu-oHTM7l7G 目录下 +youqu-oHTM7l7G 此目录名称前面部分是你的代码根目录的名称,后面部分是生成的随机字符串; +同学们在远程机器上定位问题的时候,如果使用 Pycharm 调试,就将解释器指定到这个目录的就行了; +当然,我们也提供了本机开发环境部署: +bash env_dev.sh + +如果你是本地开发环境可以用它,区别就是驱动执行的时候使用:python3 manage.py xxx 九、失败录屏¶ 录屏其实是一种视频形式的日志,因为很多时候我们在查看日志之后仍然无法准确的定位到用例失败的具体原因,因此用例的录屏能让我们看到用例在执行过程; 【使用方法】 在 globalconfig.ini 里面配置关注 2 个参数; -;失败用例重跑次数 -RERUN = 1 - -;失败录屏从第几次开始录制视频。 -;比如 RECORD_FAILED_CASE = 1 ,表示用例第1次执行失败之后开始录屏。 -;注意,用例失败重跑的次数不能小于失败录屏次数,即 RERUN >= RECORD_FAILED_CASE -RECORD_FAILED_CASE = 1 +;失败用例重跑次数 +RERUN = 1 + +;失败录屏从第几次开始录制视频。 +;比如 RECORD_FAILED_CASE = 1 ,表示用例第1次执行失败之后开始录屏。 +;注意,用例失败重跑的次数不能小于失败录屏次数,即 RERUN >= RECORD_FAILED_CASE +RECORD_FAILED_CASE = 1 默认失败重跑的次数是 1 次; RECORD_FAILED_CASE = 1 表示用例第1次执行失败之后开始录屏; @@ -2953,48 +2973,48 @@ 十、Wayland 适配简单讲就是,应用库只需要维护一套用例脚本即可。 【用例兼容】 因为 Wayland 下有些应用的界面显示和功能本身存在一些差异,用例层可能需要对这部分用例做逻辑判断,使用全局配置里面的常量进行逻辑编写即可: -from setting.globalconfig import GlobalConfig - -# GlobalConfig.IS_WAYLAND 获取到当前的显示服务器(bool) -# 应用库 Config 继承 GlobalConfig -if Config.IS_WAYLAND: - pass -if Config.IS_X11: - pass +from setting.globalconfig import GlobalConfig + +# GlobalConfig.IS_WAYLAND 获取到当前的显示服务器(bool) +# 应用库 Config 继承 GlobalConfig +if Config.IS_WAYLAND: + pass +if Config.IS_X11: + pass 比如用例里面如果断言的图片不同: -if Config.IS_WAYLAND: - self.assert_image_exist("wayland_XXX") -else: - self.assert_image_exist("x11_XXX") +if Config.IS_WAYLAND: + self.assert_image_exist("wayland_XXX") +else: + self.assert_image_exist("x11_XXX") 这样这条用例脚本在 Wayland 和 X11 下都可以跑,so easy 是不是?完全没必要专门拉新分支进行 Wayland 适配。 十一、测试报告¶ 1. 目录结构¶ 执行时会在根目录下动态生成 report 目录,所有的报告相关的文件会统一存放在里面,示例: -/report - ├── allure # allure报告 - │ ├── ... - │ └── ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json - ├── allure_html # 生成的html报告 - │ ├── ... - │ └── index.html - ├── allure_back # allure报告备份 - │ └── 20221108114823 - │ ├── ... - │ └── f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json - ├── json # json报告 - │ ├── ... - │ └── result_deepin-music_20221109134736_1081333.json - ├── logs # 日志文件 - │ ├── 2022-11-10_debug.log - │ └── 2022-11-10_error.log - ├── record # 录屏 - │ └── 2022-11-09 - │ ├── ... - │ └── 15时14分09秒_test_music_303_2_autotest.mp4 - └── xml # xml报告 - └── autotest_deepin_music-20221109134736.xml +/report + ├── allure # allure报告 + │ ├── ... + │ └── ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json + ├── allure_html # 生成的html报告 + │ ├── ... + │ └── index.html + ├── allure_back # allure报告备份 + │ └── 20221108114823 + │ ├── ... + │ └── f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json + ├── json # json报告 + │ ├── ... + │ └── result_deepin-music_20221109134736_1081333.json + ├── logs # 日志文件 + │ ├── 2022-11-10_debug.log + │ └── 2022-11-10_error.log + ├── record # 录屏 + │ └── 2022-11-09 + │ ├── ... + │ └── 15时14分09秒_test_music_303_2_autotest.mp4 + └── xml # xml报告 + └── autotest_deepin_music-20221109134736.xml 默认情况下同时生成 html、xml、json三种形式的报告。 2. 定制报告¶ @@ -3011,14 +3031,14 @@ 3. 查看报告allure open report/allure_html +allure open report/allure_html 使用 manage.py 执行完之后,在终端的最后一行,我们会给你输出打开报告的命令,直接复制它在终端执行就可以查看了,像这样: - 终端执行命令: allure open /tmp/youqu/report/allure_html 查看报告 + 终端执行命令: allure open /tmp/youqu/report/allure_html 查看报告 你也可以直接在 Pycharm 里面找到 index.html 文件,然后右键选择浏览器打开,或者你可以用一个 http 服务打开。 你也可以直接在 report/allure 目录下查看报告: - allure serve report/allure + allure serve report/allure 远程执行 @@ -3031,48 +3051,48 @@ 1. 提前解决代码问题这里推荐一个 Python 社区流行的代码格式化工具: Black,号称不妥协的代码格式化工具,它检测到不符合规范的代码风格直接就帮你全部格式化好,就是这么刚! 安装: -sudo pip3 install black +sudo pip3 install black 使用方法: -black ${CheckPath} +black ${CheckPath} 使用这个工具格式化之后,代码会被自动调整,刚开始你可能会觉得调整得很夸张,没关系坚持看,习惯之后,你会觉得很优雅,没错,这就是 Pythonic Code 的核心,请保持优雅~。 2. 代码扫描工具¶ 使用根目录下 pylint.sh 扫描代码,在 report 目录下查看代码扫描报告,如果有代码问题请提前解决之后再提交。 此脚本已经使用 Python 社区最流行的代码扫描工具 Pylint 进行代码扫描。 使用方法: -bash pylint.sh +bash pylint.sh 运行之后会提示你要扫描的目录,比如输入 apps ,则会扫描 apps 下的所有 Python 代码。 在 setting/pylintrc.cfg 配置文件里面进行相关配置,扫描完成之后在 report/pylints 目录下会生成扫描报告。 代码提交需通过 git review 提交到 gerrit ,人工 Code Review 通过之后合入代码。 十三、提交代码¶ 1. 安装依赖¶ -sudo apt install git-review +sudo apt install git-review 2. 提交模板¶ 在 ~ 目录下新建文件,并命名为 gitcommit_template 将以下内容写入文件当中: -# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 -fix: - -# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 -Description: - -# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 -Log: - -# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 -#Bug: - -# 修复 github issue -#Issue: - -# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 -#Task: +# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 +fix: + +# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 +Description: + +# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 +Log: + +# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 +#Bug: + +# 修复 github issue +#Issue: + +# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 +#Task: 命令行执行: -git config --global commit.template ~/gitcommit_template +git config --global commit.template ~/gitcommit_template 此命令将模板加入到 git 的提交模板中。 后续提交的时候需要关注一下几点: @@ -3083,19 +3103,19 @@ 2. 提交模板3. 推送代码¶ 首先添加 commit 信息 -git add 后面加文件名称 +git add 后面加文件名称 -git add . # 表示添加所有文件 +git add . # 表示添加所有文件 使用这条命令注意有些临时文件不要提交到仓库了。 -git commit -a +git commit -a 之后在 fix: 后面(注意冒号后面必须加空格,不然直接-1)写本地提交的 commit 信息,然后就可以提交代码了 -git review branch(当前分支) -r origin +git review branch(当前分支) -r origin 最好一次 commit,一次 git review ,经常有同学在本地疯狂 commit 最后 git review 报错不知道咋回事儿。 若不想每次提交都加上 -r 选项,执行以下命令: -git config --global gitreview.remote origin +git config --global gitreview.remote origin 提交代码,直接使用 git review branch<目标分支>,例如 git review master 4. Git标签¶ @@ -3106,74 +3126,74 @@ 4. Git标签git tag -a <tagname> +git tag -a <tagname> 回车之后,Git 会打开你的编辑器,让你写一句标签注解,就像你给提交写注解一样。 查看所有标签 -git tag -l -# git tag 也行 +git tag -l +# git tag 也行 删除标签 -git tag -d <tagname> +git tag -d <tagname> 推送标签至远程 git push 命令并不会传送标签到远程仓库服务器上,必须显式地推送标签。 -git push origin <tagname> +git push origin <tagname> 推送所有不在远程仓库服务器上的标签 -git push origin --tag +git push origin --tag 删除远程标签 -git push origin :refs/tag/<tagname> +git push origin :refs/tag/<tagname> 后期打标签 先用 git log --pretty=oneline 查询提交记录,获取校验码。 -git tag -a <tagname> 9fceb02(校验码) +git tag -a <tagname> 9fceb02(校验码) 检出标签 -git checkout <tagname> +git checkout <tagname> 此时,仓库会处于“分离头指针(detached HEAD)”的状态。 在“分离头指针”状态下,如果你做了某些更改然后提交它们,标签不会发生变化, 但你的新提交将不属于任何分支,并且将无法访问,除非通过确切的提交哈希才能访问。 因此,如果你需要进行更改,比如你要修复旧版本中的错误,那么通常需要创建一个新分支: -git checkout -b <NewBranchName> <tagname> +git checkout -b <NewBranchName> <tagname> 新分支上可以进行提交代码。 十四、常见问题¶ 1. 提交代码时提示邮箱或者名称不对¶ 重新配置邮箱或者名称,然后重置生效: -git commit --amend --reset-author +git commit --amend --reset-author 2. 怎么回滚到之前的版本¶ (1)查询历史提交记录 -git log +git log 找到你要回滚的版本,复制 hash 值。 注意:是 commit 空格之后的 hash 值,之前有同学复制的 Change-Id: 这样肯定报错。 (2)回滚版本,不清除代码 -git reset --soft ${hash} +git reset --soft ${hash} (3)回滚版本,清除代码,慎用哈 -git reset --hard ${hash} +git reset --hard ${hash} 3. 测试报告里面 F S . E 是什么意思¶ F 表示失败,. (点)表示通过,S 表示跳过,E 表示 error 有报错 4. 解决 git status 中文显示的问题¶ -git config --global core.quotePath false +git config --global core.quotePath false 5. apps 目录下颜色有些是黄色的¶ 在 Pycharm 中 apps 目录下应用库文件是黄色的,编辑器识别不到代码新增和修改; @@ -3184,22 +3204,22 @@ 5. apps 目录下颜色有些是黄色的6. 执行 env.sh 报错 $'\r':未找到命令¶ 出现这个问题你应该是在 windows 上打开或编辑过 env.sh 脚本,windows下的换行是回车符+换行符,也就是\r\n,而 Linxu 下是换行符 \n,Linux 下不识别 \r,因此报错。 解决方案: -# 将 \r 替换为空 -sudo sed -i 's/\r//' env.sh +# 将 \r 替换为空 +sudo sed -i 's/\r//' env.sh 7.怎样为单独某一条用例配置执行超时时间¶ 在用例脚本中添加装饰器,如下: -@pytest.mark.timeout(300) # 单位秒 -def test_xxx_001(): - pass +@pytest.mark.timeout(300) # 单位秒 +def test_xxx_001(): + pass 8. 如何拉取 YouQu 自动化项目所有代码,包含子仓库¶ 前置条件:已申请访问 YouQu 权限群组 -# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) -git config --global credential.helper store - -# 拉取YouQu框架代码,并递归拉取子仓库代码 -git clone "http://gerrit.uniontech.com/youqu" --recursive +# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) +git config --global credential.helper store + +# 拉取YouQu框架代码,并递归拉取子仓库代码 +git clone "http://gerrit.uniontech.com/youqu" --recursive 9. 如何拉取 YouQu 自动化项目中指定子仓库的代码¶ 前置条件: @@ -3207,22 +3227,22 @@ 9. 如何拉取 YouQu 自动化项目中指定子仓库的代 已申请访问 YouQu 权限群组 已存储访问密码 -# 拉取YouQu框架代码 -git clone "http://gerrit.uniontech.com/youqu" - -# 指定拉取子仓库代码 -cd youqu -git submodule update --init apps/autotest_xxx_xxx +# 拉取YouQu框架代码 +git clone "http://gerrit.uniontech.com/youqu" + +# 指定拉取子仓库代码 +cd youqu +git submodule update --init apps/autotest_xxx_xxx 10. 如何更新 YouQu 自动化项目中,所有子仓库的代码¶ 更新所有子仓库代码 -cd youqu -git pull & git submodule foreach git pull +cd youqu +git pull & git submodule foreach git pull 11. 如何修复 YouQu 所有子仓库 master 分支游离头(detached head)¶ 修复所有子仓库默认master 分支游离头 -cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
PMS_USER = PMS账号 +PMS_PASSWORD = PMS密码 +SEND_PMS = async +TASK_ID = 测试单ID +TRIGGER = auto +APP_NAME = 这个参数可填可不填,但是填了可以提高用例的执行速度,因为在用例收集阶段可以指定到具体的应用库。(下同)
(2)用例执行完之后回填
等所有用例执行完之后,再逐个进行回填的接口请求,此方案时间效率比较低。
使用方法:
PMS_USER = PMS账号 -PMS_PASSWORD = PMS密码 -SEND_PMS = finish -TASK_ID = 测试单ID -TRIGGER = auto -APP_NAME = +PMS_USER = PMS账号 +PMS_PASSWORD = PMS密码 +SEND_PMS = finish +TASK_ID = 测试单ID +TRIGGER = auto +APP_NAME = (3)手动回填 所有用例执行完之后不做回填的接口请求,后续手动将结果进行回填请求。 用例执行时配置: -PMS_USER = PMS账号 -PMS_PASSWORD = PMS密码 -SEND_PMS = finish -TASK_ID = 测试单ID -TRIGGER = hand -APP_NAME = +PMS_USER = PMS账号 +PMS_PASSWORD = PMS密码 +SEND_PMS = finish +TASK_ID = 测试单ID +TRIGGER = hand +APP_NAME = 后续手动回填方法: -youqu manage.py pms --send2task yes +youqu manage.py pms --send2task yes 可能遇到的问题¶ 由同学可能会发现,怎么回填一次之后,后面想再次回填就不生效了; @@ -1292,62 +1383,62 @@ 可能遇到的问题2.4. 导出 CSV 文件¶ 框架提供导出指定标签用例的功能: -youqu manage.py exportcsv -a deepin-album -t CICD +youqu manage.py exportcsv -a deepin-album -t CICD 表示导出 deepin-album 的用例中标记了 CICD 标签的用例,导出 CSV 文件的字段格式已经适配了 CICD 的要求。 2.5. 脚手架新建 APP 工程¶ 新建一个 APP 工程: -youqu manage.py startapp autotest_deepin_some +youqu manage.py startapp autotest_deepin_some 这样在 apps 目录下会创建一个子项目工程 autotest_deepin_some,同时新建好工程模板目录和模板文件: -apps -└── autotest_deepin_some - ├── case - │ ├── assert_res - │ │ └── readme - │ ├── base_case.py - │ └── __init__.py - ├── config.ini - ├── config.py - ├── conftest.py - ├── control - ├── deepin_some_assert.py - ├── deepin_some.csv - ├── __init__.py - └── widget - ├── base_widget.py - ├── case_res - │ └── readme - ├── deepin_some_widget.py - ├── __init__.py - ├── other.ini - ├── other_widget.py - ├── pic_res - │ └── readme - └── ui.ini +apps +└── autotest_deepin_some + ├── case + │ ├── assert_res + │ │ └── readme + │ ├── base_case.py + │ └── __init__.py + ├── config.ini + ├── config.py + ├── conftest.py + ├── control + ├── deepin_some_assert.py + ├── deepin_some.csv + ├── __init__.py + └── widget + ├── base_widget.py + ├── case_res + │ └── readme + ├── deepin_some_widget.py + ├── __init__.py + ├── other.ini + ├── other_widget.py + ├── pic_res + │ └── readme + └── ui.ini autotest_deepin_some 是你的工程名称,比如:autotest_deepin_music ; 在此基础上,你可以快速的开始你的 AT 项目。 2.6. 用例标签自动同步¶ 用于自动同步 PMS 用例标签数据至本地 CSV 文件,主要通过以下几个配置来控制: -APP_NAME = # 指定要同步的应用名称 -PMS_USER = # PMS的用户名 -PMS_PASSWORD = # PMS的密码 +APP_NAME = # 指定要同步的应用名称 +PMS_USER = # PMS的用户名 +PMS_PASSWORD = # PMS的密码 在 [csv_link_pms_id] 节点下指定 csv 文件名与 PMS 用例模块的对应关系,比如: -[csv_link_pms_id] -;同步PMS数据到本地CSV文件,必须要配置的配置项 -;key是本地CSV文件的文件名称; -;value是对应PMS上的模块ID; -;比如要同步音乐的数据, 首先需要将配置 APP_NAME = deepin-music, -;CSV文件名称为music.csv,其在PMS上的用例为: https://pms.uniontech.com/testcase-browse-53.html -;因此应该配置为: music = 53 -;这样才能将PMS与本地CSV文件建立联系。 -;如果你的应用分了很多模块,只需要将对应的信息依次配置好就行了。 -music = 53 +[csv_link_pms_id] +;同步PMS数据到本地CSV文件,必须要配置的配置项 +;key是本地CSV文件的文件名称; +;value是对应PMS上的模块ID; +;比如要同步音乐的数据, 首先需要将配置 APP_NAME = deepin-music, +;CSV文件名称为music.csv,其在PMS上的用例为: https://pms.uniontech.com/testcase-browse-53.html +;因此应该配置为: music = 53 +;这样才能将PMS与本地CSV文件建立联系。 +;如果你的应用分了很多模块,只需要将对应的信息依次配置好就行了。 +music = 53 将以上信息配置好之后,在命令行执行: -youqu manage.py pms --pms2csv yes +youqu manage.py pms --pms2csv yes 每次执行时原 csv 文件会自动备份在 report/csv_back 目录下,因此你不用担心脚本执行导致你的数据丢失。 diff --git a/search/search_index.json b/search/search_index.json index 91ebe84c..c7cfc7a2 100644 --- a/search/search_index.json +++ b/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\u200b\\u3000\\-\u3001\u3002\uff0c\uff0e\uff1f\uff01\uff1b]+","pipeline":["stemmer"]},"docs":[{"location":"","title":"\u9996\u9875","text":""},{"location":"#youqu","title":"\u6709\u8da3\uff08YouQu\uff09","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/4/1\n# Author : Mikigo\n# =============================================\n \u672c\u7ad9\u603b\u8bbf\u95ee\u91cf \u6b21 \u6b22\u8fce\u5728\u6d4f\u89c8\u5668\u8bbf\u95ee\u3010\u516c\u7f51\u6587\u6863\u3011 \u7edf\u4fe1\u516c\u53f8\u5185\u7f51\u8fd8\u53ef\u4ee5\u8bbf\u95ee\u3010\u5185\u7f51\u6587\u6863\u3011\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u54e6~~"},{"location":"#_1","title":"\u4e00\u3001\u7b80\u4ecb","text":"\u6709\u8da3\uff08YouQu\uff09\u662f\u6df1\u5ea6\u79d1\u6280\u8bbe\u8ba1\u548c\u5f00\u53d1\u7684\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff0c\u91c7\u7528\u7ed3\u6784\u5206\u5c42\u7684\u8bbe\u8ba1\u7406\u5ff5\uff0c\u652f\u6301\u591a\u5143\u5316\u5143\u7d20\u5b9a\u4f4d\u548c\u65ad\u8a00\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\u3001\u5f3a\u5927\u7684\u65e5\u5fd7\u548c\u62a5\u544a\u8f93\u51fa\u7b49\u7279\u8272\u529f\u80fd\uff0c\u540c\u65f6\u5b8c\u7f8e\u517c\u5bb9X11\u3001Wayland\u663e\u793a\u534f\u8bae\uff0c\u73af\u5883\u90e8\u7f72\u7b80\u5355\uff0c\u64cd\u4f5c\u6613\u4e0a\u624b\u3002"},{"location":"#17","title":"\u7231\u4e0a \u201c\u6709\u8da3\u201d \u7684 17 \u4e2a\u7406\u7531","text":" \u6838\u5fc3\u5e93\u63d0\u4f9b\u4e86\u7edf\u4e00\u7684\u63a5\u53e3\uff0c\u7f16\u5199\u65b9\u6cd5\u65f6\u53ea\u9700\u8981\u5bfc\u5165\u4e00\u4e2a\u5305\u5c31\u53ef\u4ee5\u4f7f\u7528\u5230\u6838\u5fc3\u5e93\u63d0\u4f9b\u7684\u6240\u6709\u529f\u80fd\uff1b \u516c\u5171\u5e93\u5c01\u88c5\u4e86\u5f88\u591a\u5e38\u7528\u6a21\u5757\u7684\u76f8\u5173\u65b9\u6cd5\uff0c\u6bd4\u5982\uff1a\u4efb\u52a1\u680f\u7684\u64cd\u4f5c\u3001\u684c\u9762\u7684\u64cd\u4f5c\u3001\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\u7b49\u7b49\uff1b \u9664\u4e86\u5e38\u7528\u7684\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u8bc6\u522b\u4ee5\u5916\uff0c\u6211\u4eec\u8fd8\u63d0\u4f9b\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u5176\u4f7f\u7528\u7b80\u5355\u4e14\u9ad8\u6548\uff0c\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff1b \u5bf9\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u5c06\u7f16\u5199\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u53d8\u5f97\u7b80\u5355\u800c\u4f18\u96c5\uff1b \u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u6280\u672f\u8fdb\u884c\u529f\u80fd\u5347\u7ea7\uff0c\u9664\u4e86\u652f\u6301\u5355\u4e2a\u5750\u6807\u8fd4\u56de\uff0c\u8fd8\u652f\u6301\u540c\u4e00\u754c\u9762\u4e0b\u591a\u4e2a\u76f8\u540c\u5143\u7d20\u8fd4\u56de\u591a\u4e2a\u5750\u6807\u7684\u529f\u80fd\uff1b \u63d0\u4f9b\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u548c\u6279\u91cf\u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u4e0d\u5230\u4e00\u4e2a csv \u6587\u4ef6\u539f\u6765\u80fd\u5e72\u8fd9\u4e48\u591a\u4e8b\u60c5\uff1b \u63d0\u4f9b\u4e86\u529f\u80fd\u5f3a\u5927\u7684\u6267\u884c\u5668\u5165\u53e3\uff0c\u8ba9\u4f60\u53ef\u4ee5\u65b9\u4fbf\u7684\u5728\u672c\u5730\u6267\u884c\u4efb\u4f55\u7528\u4f8b\u96c6\u7684\u7528\u4f8b\uff0c\u5176\u4e30\u5bcc\u7684\u81ea\u5b9a\u4e49\u914d\u7f6e\u9879\uff0c\u6ee1\u8db3\u4f60\u5bf9\u6267\u884c\u5668\u6240\u6709\u7684\u5e7b\u60f3\uff1b \u63d0\u4f9b\u8fdc\u7a0b\u6267\u884c\u7684\u529f\u80fd\uff0c\u53ef\u4ee5\u63a7\u5236\u591a\u53f0\u673a\u5668\u5e76\u884c\u8dd1\uff0c\u6216\u8005\u5206\u5e03\u5f0f\u8dd1\uff0c\u8fd9\u79cd\u4ed8\u8d39\u529f\u80fd\u73b0\u5728\u514d\u8d39\u7ed9\u4f60\u7528\uff1b \u63d0\u4f9b\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u529f\u80fd\uff0c\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u6bcf\u4e2a\u65b9\u6cd5\u5355\u72ec\u5199\u8f93\u51fa\u65e5\u5fd7\u7684\u4ee3\u7801\uff0c\u4e00\u5207\u6211\u4eec\u7ed9\u4f60\u641e\u5b9a\u4e86\uff0c\u65e5\u5fd7\u8f93\u51fa\u4e0d\u4ec5\u5185\u5bb9\u4e30\u5bcc\uff0c\u989c\u503c\u4e5f\u7edd\u5bf9\u5728\u7ebf\uff0c\u6211\u4eec\u8fd8\u81ea\u5df1\u8bbe\u8ba1\u4e86\u4e00\u6b3e\u7ec8\u7aef\u8f93\u51fa\u4e3b\u9898\u53eb\u300a\u4e94\u5f69\u6591\u6593\u7684\u9ed1\u300b\uff1b \u63d0\u4f9b\u4e86\u4e00\u952e\u90e8\u7f72\u81ea\u52a8\u5316\u6d4b\u8bd5\u73af\u5883\u7684\u529f\u80fd\uff0c\u8fde\u4ee3\u7801\u7f16\u8f91\u5668\u90fd\u7ed9\u4f60\u88c5\u597d\u4e86\uff0c\u8ba9\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u73af\u5883\u90e8\u7f72\u800c\u70e6\u607c\uff1b \u63d0\u4f9b\u4e86\u81ea\u52a8\u751f\u6210\u591a\u79cd\u62a5\u544a\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u8f93\u51fa\u4ec0\u4e48\u62a5\u544a\u5f62\u5f0f\u90fd\u884c\uff0c\u800c\u4e14\u6211\u4eec\u5728\u62a5\u544a\u4e2d\u8fd8\u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\u548c\u5931\u8d25\u622a\u56fe\u7684\u529f\u80fd\uff1b \u5bf9\u65ad\u8a00\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u63d0\u4f9b\u66f4\u53cb\u597d\u5316\u7684\u9519\u8bef\u63d0\u793a\uff0c\u8ba9\u5b9a\u4f4d\u95ee\u9898\u7cbe\u51c6\u9ad8\u6548\uff1b \u4e0d\u4ec5\u652f\u6301\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u63a7\u5236\uff0c\u800c\u4e14\u8fd8\u652f\u6301\u52a8\u6001\u63a7\u5236\u7528\u4f8b\u6279\u91cf\u6267\u884c\u7684\u603b\u65f6\u95f4\uff0c\u786e\u4fdd CI \u73af\u5883\u4e0b\u80fd\u987a\u7545\u8fd0\u884c\uff1b \u652f\u6301\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\u6267\u884c\u3001PMS \u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6807\u7b7e\u5316\u6267\u884c\u65b9\u6848\uff0c\u6ee1\u8db3\u4f60\u5404\u79cd\u573a\u666f\u4e0b\u7684\u6267\u884c\u9700\u6c42\uff1b \u652f\u6301\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u529f\u80fd\uff0c\u53ef\u5b9a\u4f4d\u53ef\u65ad\u8a00\uff0c\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\uff1b \u5b8c\u7f8e\u517c\u5bb9 Wayland \u548c X11\uff0c\u771f\u6b63\u505a\u5230\u4e00\u5957\u4ee3\u7801\uff0c\u968f\u5904\u6267\u884c\uff1b \u652f\u6301\u591a\u79cd\u65b9\u5f0f\u7684\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u5176\u4e2d\u5f02\u6b65\u56de\u586b\u7684\u65b9\u6848\uff0c\u5b8c\u7f8e\u89e3\u51b3\u4e86\u6570\u636e\u56de\u586b\u7684\u8017\u65f6\u95ee\u9898\uff1b \u3010\u89c6\u9891\u4ecb\u7ecd\u3011"},{"location":"#_2","title":"\u4e8c\u3001\u5b89\u88c5\u4f7f\u7528","text":"\u57fa\u7840\u6846\u67b6\uff1ahttps://github.com/linuxdeepin/deepin-autotest-framework \u4ece PyPI \u5b89\u88c5: sudo pip3 install youqu\n \u521b\u5efa\u9879\u76ee: youqu-startproject youqu\n \u5b89\u88c5\u4f9d\u8d56: cd youqu\nbash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002 \u5e94\u7528\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684\u5e94\u7528\u540d\u79f0\u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music cd apps/\n \u5c06\u5e94\u7528\u5e93\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u50cf\u8fd9\u6837\uff1a youqu\n\u251c\u2500\u2500 apps\n\u2502 \u251c\u2500\u2500 autotest_deepin_music # \u5e94\u7528\u5e93\n...\n \u5e94\u7528\u5e93\u7684\u540d\u79f0\u4e0d\u53ef\u4ee5\u4fee\u6539\u3002"},{"location":"#_3","title":"\u4e09\u3001\u8fd0\u884c","text":""},{"location":"#1","title":"1. \u5de5\u4f5c\u7a7a\u95f4","text":"\u57fa\u7840\u6846\u67b6\u5de5\u7a0b\u76ee\u5f55\u5efa\u8bae\u653e\u5728 ~ \u76ee\u5f55\u4e0b\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u4e5f\u53ef\u4ee5\u8fd0\u884c\uff0c\u4f46\u662f\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u9700\u8981\u505a\u73af\u5883\u6e05\u7406\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u5b58\u5728\u4ee3\u7801\u88ab\u5220\u9664\u7684\u98ce\u9669\u3002 \u5982\u679c\u4f60\u7684\u673a\u5668\u4e0a\u4e0d\u540c\u76ee\u5f55\u4e0b\u5b58\u5728\u591a\u4e2a YouQu \u5de5\u7a0b\uff0c\u90a3\u4e48\u5728\u8fd0\u884c\u4e4b\u524d\uff0c\u8bf7\u5148\u6267\u884c env.sh \u6821\u6b63\u76f8\u5173\u73af\u5883\u3002"},{"location":"#2","title":"2. \u6267\u884c\u5668","text":"\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u6709\u4e00\u4e2a manage.py \uff0c\u5b83\u662f\u4e00\u4e2a\u6267\u884c\u5668\u5165\u53e3\uff0c\u63d0\u4f9b\u4e86\u672c\u5730\u6267\u884c\u3001\u8fdc\u7a0b\u6267\u884c\u7b49\u7684\u529f\u80fd\u3002 \u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6765\u6267\u884c\uff1a youqu manage.py run -a deepin-music\n"},{"location":"#21","title":"2.1. \u672c\u5730\u6267\u884c","text":"youqu manage.py run\n"},{"location":"#211","title":"2.1.1. \u914d\u7f6e\u6587\u4ef6","text":"\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u914d\u7f6e\u53c2\u6570 \u5728\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u91cc\u9762\u652f\u6301\u914d\u7f6e\u5bf9\u6267\u884c\u7684\u4e00\u4e9b\u53c2\u6570\u8fdb\u884c\u914d\u7f6e\uff0c\u5e38\u7528\u7684\u5982\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;1\u3001KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2\u3001KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f, e.g. TAGS = L1 or smoke\n;\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\uff0c\u5c06\u8981\u6267\u884c\u7684\u7528\u4f8b\u5199\u5165\u6307\u5b9a\u7684 csv \u6587\u4ef6\n;\u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u4ece\u57fa\u7840\u6846\u67b6\u6839\u76ee\u5f55\u5f00\u59cb\uff1ae.g. CASE_FILE = case_list.txt\n;\u5982\u679c\u8fd9\u91cc\u6709\u503c\uff0cAPP_NAME KEYWORDS TAGS \u7684\u914d\u7f6e\u5747\u4e0d\u751f\u6548\nCASE_FILE =\n;=============================== RUNNER CONFIG ===================================\n[runner]\n;\u6700\u5927\u5931\u8d25\u7528\u4f8b\u6570\u91cf\u7684\u5360\u6bd4\n;\u6bd4\u5982\uff1a\u603b\u6267\u884c\u7528\u4f8b\u6570\u4e3a100, \u82e5 MAX_FAIL = 0.5,\u5219\u5931\u8d25\u7528\u4f8b\u6570\u8fbe\u523050\u5c31\u4f1a\u7ec8\u6b62\u6d4b\u8bd5\u3002\nMAX_FAIL = 0.5\n;\u5355\u6761\u7528\u4f8b\u7684\u8d85\u65f6\u65f6\u95f4\uff0c\u5982\u679c\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u8d85\u65f6\uff0c\u8fd9\u6761\u7528\u4f8b\u4f1a\u88ab\u505c\u6b62\uff0c\u540e\u7eed\u7528\u4f8b\u7ee7\u7eed\u6267\u884c\u3002\n;\u5355\u4f4d\u4e3a\u79d2\n; \u8fd9\u662f\u4e00\u4e2a\u5168\u5c40\u7edf\u4e00\u914d\u7f6e\uff0c\u5982\u679c\u67d0\u6761\u7528\u4f8b\u9700\u8981\u5355\u72ec\u914d\u7f6e\u8d85\u65f6\u65f6\u95f4\uff0c\u53ef\u4ee5\u5728\u7528\u4f8b\u4e2d\u8fd9\u6837\u5199\uff1a\n;@pytest.mark.timeout(500)\n;def test_xxx_001():\n; ...\n;\u4f1a\u8bdd\uff08\u6240\u6709\u7528\u4f8b\u6267\u884c\u7684\uff09\u8d85\u65f6\u662f\u6839\u636e\u5168\u5c40\u8d85\u65f6\u914d\u7f6e\u548c\u7528\u4f8b\u5355\u72ec\u8d85\u65f6\u914d\u7f6e\u81ea\u52a8\u8ba1\u7b97\u7684\uff1b\nCASE_TIME_OUT = 200\n;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\u3002\n;\u6ce8\u610f\uff0c\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u4e0d\u80fd\u5c0f\u4e8e\u5931\u8d25\u5f55\u5c4f\u6b21\u6570\uff0c\u5373 RERUN >= RECORD_FAILED_CASE\nRECORD_FAILED_CASE = 1\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = INFO\n;yes \u6bcf\u6761\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u8fdb\u884c\u73af\u5883\u6e05\u7406\nCLEAN_ALL = yes\n;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\nRESOLUTION = 1920x1080\n;\u4e0d\u8df3\u8fc7\u7528\u4f8b\uff0ccsv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86 skip-xxx\u7684\u7528\u4f8b\u4e0d\u8df3\u8fc7\nNOSKIP = no\n;ignore fixed\n;no\uff0c\u53ea\u8981\u6807\u8bb0\u4e86fixed\u7684\u7528\u4f8b\uff0c\u5373\u4f7f\u6807\u8bb0\u4e86skip-\uff0c\u4e5f\u4f1a\u6267\u884c\uff1b\n;yes\uff0cfixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\uff1b\nIFIXED = no\n;\u8981\u5b89\u88c5deb\u5305\u7684\u8def\u5f84\n;e.g : ~/Downloads/ \u5b89\u88c5\u4e0b\u8f7d\u76ee\u5f55\u4e0b\u7684deb\u5305\uff0c\u5982\u679c\u662f\u8fdc\u7a0b\u6267\u884c\uff0c\u4f1a\u81ea\u52a8\u62f7\u8d1d\u5230\u8fdc\u7a0b\u5e76\u5b89\u88c5\u3002\nDEB_PATH =\n;DEBUG \u6a21\u5f0f\u6267\u884c\u7528\u4f8b\uff0c\u53ea\u6536\u96c6\u4e0d\u6267\u884c\u7528\u4f8b\uff0c\u4e5f\u4e0d\u505a\u8bbe\u5907\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002\nDEBUG = no\n;\u8bb0\u5f55top\u547d\u4ee4\u67e5\u8be2\u7684\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0cTOP = 3 \u8868\u793a\u8bb0\u5f55\u524d3\u4e2a\u8fdb\u7a0b\u3002\nTOP =\n;\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\nREPEAT =\n;\u9ed8\u8ba4\u5728\u6240\u6709\u6d4b\u8bd5\u5b8c\u6210\u4e4b\u540e\u8f93\u51fa\u62a5\u9519\u4fe1\u606f.\n;yes, \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\nDURING_FAIL = no\n;=============================== REPORT CONFIG ===================================\n[report]\n;\u7528\u4f8b\u6267\u884c\u5b8c\u540e\u751f\u6210\u7684\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n;\u76ee\u524d\u652f\u6301 allure, xml, json \uff08\u652f\u6301\u540c\u65f6\u751f\u6210\uff09\nREPORT_FORMAT = allure, xml, json\n;\u6307\u5b9a\u62a5\u544a\u751f\u6210\u7684\u8def\u5f84\uff08\u76f8\u5bf9\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\uff09\nALLURE_REPORT_PATH = report/\nXML_REPORT_PATH = report/\nJSON_REPORT_PATH = report/\n;=============================== GLOBAL CONFIG ===================================\n[globalconfig]\n;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\nPASSWORD = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\nIMAGE_MATCH_NUMBER = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6bcf\u6b21\u95f4\u9694\u7b49\u5f85\u65f6\u95f4\nIMAGE_MATCH_WAIT_TIME = 1\n;\u56fe\u50cf\u8bc6\u522b\u5339\u914d\u5ea6\nIMAGE_RATE = 0.9\n;\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u5b9e\u65f6\u56fe\u50cf\u4fdd\u5b58\u8def\u5f84\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u5750\u6807\nSCREEN_CACHE = /tmp/screen.png\n;\u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\u7684\u8def\u5f84\nTMPDIR = /tmp/tmpdir\n;\u7cfb\u7edf\u4e3b\u9898\nSYS_THEME = deepin\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = http://youqu-dev.uniontech.com:8890\n;OpenCV\u670d\u52a1\u7aef\u5730\u5740\nOPENCV_SERVER_HOST = http://youqu-dev.uniontech.com:8889\n;=============================== PMS CONFIG ===================================\n;PMS\u76f8\u5173\u914d\u7f6e\uff0c\u5305\u542b\u4ee5\u4e0b\u51e0\u4e2a\u65b9\u9762\uff1a\n;1.PMS\u6d4b\u8bd5\u5957\u6267\u884c\n;2.\u81ea\u52a8\u4ecePMS\u722c\u53d6\u6570\u636e\u5e76\u540c\u6b65\u672c\u5730CSV\u6587\u4ef6\n;3.PMS\u6570\u636e\u56de\u586b\n[pms]\n;PMS\u7684\u7528\u6237\u540d: ut001234\nPMS_USER =\n;PMS\u7684\u5bc6\u7801\nPMS_PASSWORD =\n;PMS\u6d4b\u8bd5\u5957\u7684ID\n;\u5728PMS\u4e0a\u67e5\u770b\u7528\u4f8b\u201c\u5957\u4ef6\u201d\u94fe\u63a5: https://pms.uniontech.com/testsuite-view-495.html\n;\u6d4b\u8bd5\u5957ID\u4e3a: 495\nSUITE_ID =\n;\u6570\u636e\u56de\u586b\u5fc5\u987b\u5173\u8054PMS\u6d4b\u8bd5\u5355\n;\u5728PMS\u4e0a\u67e5\u770b\u6d4b\u8bd5\u5355\u94fe\u63a5: https://pms.uniontech.com/testtask-cases-20747.html\n;\u6d4b\u8bd5\u5355ID\u4e3a: 20747\nTASK_ID =\n;\u5c06\u6d4b\u8bd5\u7ed3\u679c\u6570\u636e\u56de\u586b\u5230PMS\n;\u4e3a\u7a7a: \u8868\u793a\u4e0d\u56de\u586b,\u4e0d\u4f1a\u5728\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u751f\u6210json\u7ed3\u679c\u6587\u4ef6;\n;async: \u8868\u793a\u9010\u6761\u5f02\u6b65\u56de\u586b,\u540e\u9762\u4e00\u6761\u6267\u884c\u5f00\u59cb\u65f6\u901a\u8fc7\u5b50\u7ebf\u7a0b\u5bf9\u524d\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u8fdb\u884c\u56de\u586b\uff0c\u5982\u6b64\u5b9e\u73b0\u65f6\u95f4\u6548\u7387\u6700\u5927\u5316;\n;finish: \u8868\u793a\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u6210\u4e4b\u540e\u9010\u4e2a\u56de\u586b(PMS\u4e0d\u652f\u6301\u5e76\u53d1);\nSEND_PMS =\n;\u6570\u636e\u56de\u586b\u7684\u89e6\u53d1\u8005\n;auto: \u6846\u67b6\u81ea\u52a8\u56de\u586b,\u914d\u5408SEND_PMS\u914d\u7f6e\u4f7f\u7528,\u4f60\u53ef\u4ee5\u9009\u62e9\u5728\u4e0d\u540c\u7684\u9636\u6bb5\u8fdb\u884c\u6570\u636e\u56de\u586b;\n;hand: \u624b\u52a8\u56de\u586b,\u6bcf\u6761\u7528\u4f8b\u4ecd\u7136\u4f1a\u751f\u6210json\u6587\u4ef6,\u4f46\u6846\u67b6\u4e0d\u4f1a\u8fdb\u884c\u6570\u636e\u56de\u586b,\u9700\u8981\u4f60\u53ef\u4ee5\u5728\u4f60\u60f3\u8981\u53d1\u9001\u7684\u65f6\u95f4\u70b9\u624b\u52a8\u89e6\u53d1\u56de\u586b;\nTRIGGER = auto\n;PMS\u56de\u586b\u7684\u91cd\u8bd5\u6b21\u6570\n;\u5982\u679c\u63a5\u53e3\u8bf7\u6c42\u5931\u8d25,\u4f1a\u8fdb\u884c\u91cd\u8bd5\nSEND_PMS_RETRY_NUMBER = 2\n[csv_link_pms_lib]\n;caselib: \u7528\u4f8b\u5e93\n;testcase: \u4ea7\u54c1\u5e93\u7528\u4f8b\nCASE_FROM = caselib\n[csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/caselib-browse-81.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 81\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic =\n[export_csv]\n;\u5bfc\u51fa\u7684csv\u6587\u4ef6\u540d\u79f0\uff0c\u9ed8\u8ba4 case_list.csv\nCSV_FILE = case_list.csv\n;exportcsv \u547d\u4ee4\u5bfc\u51fa case_list.csv \u6587\u4ef6\u65f6\u914d\u7f6e\u7684\u5b57\u6bb5\u540d\uff0c\u7528\u4f8b\u540d\u79f0\u9ed8\u8ba4\u5b58\u5728\u7b2c\u4e00\u5217\uff0c\u65e0\u9700\u6dfb\u52a0\nCSV_HEARD = \u7528\u4f8b\u7ea7\u522b,\u7528\u4f8b\u7c7b\u578b,\u6d4b\u8bd5\u7ea7\u522b,\u662f\u5426\u8df3\u8fc7\n \u914d\u7f6e\u5b8c\u6210\u4e4b\u540e\uff0c\u76f4\u63a5\u5728\u547d\u4ee4\u884c\u6267\u884c manage.py \u5c31\u597d\u4e86\u3002 youqu manage.py run\n"},{"location":"#212","title":"2.1.2. \u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a youqu manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--max_fail MAX_FAIL \u6700\u5927\u5931\u8d25\u7387\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--resolution RESOLUTION\n\u68c0\u67e5\u5206\u8fa8\u7387\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms {,async,finish}\n\u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--trigger {,auto,hand}\n\u89e6\u53d1\u8005\n-f CASE_FILE, --case_file CASE_FILE\n\u6839\u636e\u6587\u4ef6\u6267\u884c\u7528\u4f8b\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n--pms_user PMS_USER pms \u7528\u6237\u540d\n--pms_password PMS_PASSWORD\npms \u5bc6\u7801\n--suite_id SUITE_ID pms \u6d4b\u8bd5\u5957ID\n--pms_info_file PMS_INFO_FILE\npms \u4fe1\u606f\u6587\u4ef6\n--top TOP \u8fc7\u7a0b\u4e2d\u8bb0\u5f55top\u547d\u4ee4\u4e2d\u7684\u503c\n--lastfailed \u4ec5\u6267\u884c\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\n--duringfail \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\n--repeat REPEAT \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n--project_name PROJECT_NAME\n\u5de5\u7a0b\u540d\u79f0\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--build_location BUILD_LOCATION\n\u6784\u5efa\u5730\u533a\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--line LINE \u6267\u884c\u7684\u4e1a\u52a1\u7ebf\uff08\u5199\u5165json\u6587\u4ef6\uff09\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a youqu manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\"\n \u547d\u4ee4\u884c\u53c2\u6570\u4f18\u5148\u7ea7\u662f\u9ad8\u4e8e\u914d\u7f6e\u6587\u4ef6\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u4e86\u5bf9\u5e94\u7684\u53c2\u6570\uff0c\u914d\u7f6e\u6587\u4ef6\u4e2d\u4e0d\u7ba1\u662f\u5426\u914d\u7f6e\u5747\u4e0d\u751f\u6548\u3002 --app \u5165\u53c2\u8fd8\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\uff0c\u4e0b\u9762\u7684\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u540c\u6837\u652f\u6301\u3002"},{"location":"#22","title":"2.2. \u8fdc\u7a0b\u6267\u884c","text":"youqu manage.py remote\n \u8fdc\u7a0b\u6267\u884c\u540c\u6837\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u8fdb\u884c\u7528\u4f8b\u76f8\u5173\u914d\u7f6e\uff1b \u9700\u8981\u91cd\u70b9\u8bf4\u4e00\u4e0b\u8fdc\u7a0b\u6267\u884c\u65f6\u7684\u6d4b\u8bd5\u673a\u4fe1\u606f\u914d\u7f6e\uff0c\u5728\u914d\u7f6e\u6587\u4ef6 setting/remote.ini \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\u3001IP\u3001\u5bc6\u7801\u3002 ;=============================== CLIENT LIST =====================================\n; \u6d4b\u8bd5\u673a\u914d\u7f6e\u5217\u8868\n;[client{number}] ;\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u6709\u591a\u5c11\u53f0\u6d4b\u8bd5\u673a\u5c31\u5199\u591a\u5c11\u4e2a client\uff0c\u522b\u540d\u5fc5\u987b\u5305\u542b client \u5b57\u7b26\uff0c\u4e14\u4e0d\u80fd\u91cd\u590d\u3002\n;user = ;\u6d4b\u8bd5\u673a user\n;ip = ;\u6d4b\u8bd5\u673a ip\n;password = 1 ;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801, \u53ef\u4ee5\u4e0d\u914d\u7f6e\u6b64\u9879\uff0c\u9ed8\u8ba4\u53d6 CLIENT_PASSWORD \u7684\u503c\uff1b\n;\u5982\u679c\u4f60\u6240\u6709\u6d4b\u8bd5\u673a\u5bc6\u7801\u90fd\u76f8\u540c\uff0c\u90a3\u4e48\u53ea\u9700\u8981\u914d\u7f6e CLIENT_PASSWORD \u5c31\u53ef\u4ee5\u4e86\n;=================================================================================\n[client1]\nuser = uos\nip = 10.8.15.xx\n[client2]\nuser = uos\nip = 10.8.15.xx\n[client3]\nuser = uos\nip = 10.8.11.xx\n \u6709\u591a\u5c11\u53f0\u673a\u5668\u5c31\u50cf\u8fd9\u6837\u6328\u7740\u5199\u5c31\u884c\u4e86\u3002 \u7136\u540e\u5728\u547d\u4ee4\u884c\uff1a youqu manage.py remote\n \u8fd9\u6837\u8fd0\u884c\u662f\u4ece\u914d\u7f6e\u6587\u4ef6\u53bb\u8bfb\u53d6\u76f8\u5173\u914d\u7f6e\u3002 \u5982\u679c\u4f60\u4e0d\u60f3\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\uff0c\u4f60\u4ecd\u7136\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u8fdb\u884c\u4f20\u53c2\uff0c \u4ee5\u4e0b\u4e3a python3 manage.py remote \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-c CLIENTS, --clients CLIENTS\n\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679cpassword\u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6\nsetting/remote.ini \u4e2d CLIENT_PASSWORD\n\u7684\u503c,\u6bd4\u5982\uff1auos@10.8.13.33:1 \u6216 uos@10.8.13.33\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-s {yes,no,}, --send_code {yes,no,}\n\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a\uff08\u4e0d\u542breport\u76ee\u5f55\uff09\n-e, --build_env \u642d\u5efa\u6d4b\u8bd5\u73af\u5883,\u5982\u679c\u4e3ayes\uff0c\u4e0d\u7ba1send_code\u662f\u5426\u4e3ayes\u90fd\u4f1a\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a.\n-p CLIENT_PASSWORD, --client_password CLIENT_PASSWORD\n\u6d4b\u8bd5\u673a\u5bc6\u7801\uff08\u5168\u5c40\uff09\n-y PARALLEL, --parallel PARALLEL\nyes:\u8868\u793a\u6240\u6709\u6d4b\u8bd5\u673a\u5e76\u884c\u8dd1\uff0c\u6267\u884c\u76f8\u540c\u7684\u6d4b\u8bd5\u7528\u4f8b\uff0cno\n:\u8868\u793a\u6d4b\u8bd5\u673a\u5206\u5e03\u5f0f\u6267\u884c\uff0c\u670d\u52a1\u7aef\u4f1a\u6839\u636e\u6536\u96c6\u5230\u7684\u6d4b\u8bd5\u7528\u4f8b\u81ea\u52a8\u5206\u914d\u7ed9\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u3002\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms SEND_PMS \u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n \u5728\u547d\u4ee4\u884c\u8fd9\u6837\u8fd0\u884c\uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\"\n \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report \u76ee\u5f55\u4e0b\u56de\u6536\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u7684\u6d4b\u8bd5\u62a5\u544a\u3002 \u914d\u7f6e\u6587\u4ef6\u5176\u4ed6\u76f8\u5173\u914d\u7f6e\u9879\u8be6\u7ec6\u8bf4\u660e\uff0c\u8bf7\u67e5\u770b\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u6ce8\u91ca\u5185\u5bb9\u3002"},{"location":"#23-pms","title":"2.3. PMS \u6570\u636e\u56de\u586b","text":"\u6d4b\u8bd5\u5355\u5173\u8054\u7684\u7528\u4f8b\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u5bf9\u5e94\u7684\u53bb\u8dd1\u8fd9\u4e9b\u5173\u8054\u7684\u7528\u4f8b\uff0c\u5e76\u4e14\u5c06\u6267\u884c\u7684\u7ed3\u679c\u56de\u586b\u7684\u6d4b\u8bd5\u7528\u4f8b\u7684\u72b6\u6001\u91cc\u9762\u3002 PMS \u6570\u636e\u56de\u586b\u4e3b\u8981\u6709\u4e09\u79cd\u65b9\u5f0f\uff1a \uff081\uff09\u5f02\u6b65\u56de\u586b \u5728\u7528\u4f8b\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\uff0c\u91c7\u7528\u5f02\u6b65\u7684\u65b9\u5f0f\u53bb\u8fdb\u884c\u6570\u636e\u56de\u586b\uff0c\u76f4\u767d\u7684\u8bb2\u5c31\u662f\uff0c\u7b2c\u4e8c\u6761\u7528\u4f8b\u5f00\u59cb\u8dd1\u7684\u65f6\u5019\uff0c\u901a\u8fc7\u5b50\u7ebf\u7a0b\u53bb\u505a\u7b2c\u4e00\u6761\u7528\u4f8b\u7684\u6570\u636e\u56de\u586b\uff0c\u5982\u6b64\u5faa\u73af\uff0c\u76f4\u5230\u6240\u6709\u7528\u4f8b\u6267\u884c\u7ed3\u675f\uff1b \u8fd9\u79cd\u65b9\u6848\u7684\u65f6\u95f4\u6548\u7387\u6700\u9ad8\u7684\uff0c\u56e0\u4e3a\u7406\u8bba\u4e0a\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u662f\u5927\u4e8e\u6570\u636e\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\u65f6\u95f4\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u5f53\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u6570\u636e\u56de\u586b\u4e5f\u5b8c\u6210\u4e86\u3002 \u4f7f\u7528\u65b9\u6cd5\uff0c\u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u4ee5\u4e0b\u53c2\u6570\uff1a\uff08\u4ee5\u4e0b\u6d89\u53ca\u5230\u7684\u53c2\u6570\u914d\u7f6e\u90fd\u662f\u5728\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u914d\u7f6e\uff09 PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = async\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \u8fd9\u4e2a\u53c2\u6570\u53ef\u586b\u53ef\u4e0d\u586b\uff0c\u4f46\u662f\u586b\u4e86\u53ef\u4ee5\u63d0\u9ad8\u7528\u4f8b\u7684\u6267\u884c\u901f\u5ea6\uff0c\u56e0\u4e3a\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u53ef\u4ee5\u6307\u5b9a\u5230\u5177\u4f53\u7684\u5e94\u7528\u5e93\u3002\uff08\u4e0b\u540c\uff09\n \uff082\uff09\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u56de\u586b \u7b49\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u518d\u9010\u4e2a\u8fdb\u884c\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u6b64\u65b9\u6848\u65f6\u95f4\u6548\u7387\u6bd4\u8f83\u4f4e\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \uff083\uff09\u624b\u52a8\u56de\u586b \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4e0d\u505a\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u540e\u7eed\u624b\u52a8\u5c06\u7ed3\u679c\u8fdb\u884c\u56de\u586b\u8bf7\u6c42\u3002 \u7528\u4f8b\u6267\u884c\u65f6\u914d\u7f6e\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = hand\nAPP_NAME = \u540e\u7eed\u624b\u52a8\u56de\u586b\u65b9\u6cd5\uff1a youqu manage.py pms --send2task yes\n"},{"location":"#_4","title":"\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898","text":"\u7531\u540c\u5b66\u53ef\u80fd\u4f1a\u53d1\u73b0\uff0c\u600e\u4e48\u56de\u586b\u4e00\u6b21\u4e4b\u540e\uff0c\u540e\u9762\u60f3\u518d\u6b21\u56de\u586b\u5c31\u4e0d\u751f\u6548\u4e86\uff1b \u8fd9\u662f\u56e0\u4e3a\u4e3a\u4e86\u5e94\u5bf9\u524d\u9762\u63d0\u5230\u7684\u591a\u79cd\u6570\u636e\u56de\u586b\u7684\u65b9\u5f0f\uff0c\u5728 report \u76ee\u5f55\u4e0b\u4f1a\u7531 pms_xxx \u5f00\u5934\u7684\u76ee\u5f55\uff0c\u8bb0\u5f55\u4e86\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u548c\u56de\u586b\u60c5\u51b5\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u4e4b\u524d\u5df2\u7ecf\u56de\u586b\u8fc7\u4e86\uff0c\u540e\u7eed\u5c31\u4e0d\u4f1a\u518d\u6b64\u89e6\u53d1\u56de\u586b\u4e86\uff1b \u5982\u679c\u4f60\u60f3\u91cd\u65b0\u505a\u56de\u586b\uff0c\u4f60\u53ef\u4ee5\u628a report/pms_xxx \u76ee\u5f55\u5220\u6389\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u91cd\u65b0\u505a\u6570\u636e\u56de\u586b\u4e86\uff1b"},{"location":"#24-csv","title":"2.4. \u5bfc\u51fa CSV \u6587\u4ef6","text":"\u6846\u67b6\u63d0\u4f9b\u5bfc\u51fa\u6307\u5b9a\u6807\u7b7e\u7528\u4f8b\u7684\u529f\u80fd\uff1a youqu manage.py exportcsv -a deepin-album -t CICD\n \u8868\u793a\u5bfc\u51fa deepin-album \u7684\u7528\u4f8b\u4e2d\u6807\u8bb0\u4e86 CICD \u6807\u7b7e\u7684\u7528\u4f8b\uff0c\u5bfc\u51fa CSV \u6587\u4ef6\u7684\u5b57\u6bb5\u683c\u5f0f\u5df2\u7ecf\u9002\u914d\u4e86 CICD \u7684\u8981\u6c42\u3002"},{"location":"#25-app","title":"2.5. \u811a\u624b\u67b6\u65b0\u5efa APP \u5de5\u7a0b","text":"\u65b0\u5efa\u4e00\u4e2a APP \u5de5\u7a0b\uff1a youqu manage.py startapp autotest_deepin_some \u8fd9\u6837\u5728 apps \u76ee\u5f55\u4e0b\u4f1a\u521b\u5efa\u4e00\u4e2a\u5b50\u9879\u76ee\u5de5\u7a0b autotest_deepin_some\uff0c\u540c\u65f6\u65b0\u5efa\u597d\u5de5\u7a0b\u6a21\u677f\u76ee\u5f55\u548c\u6a21\u677f\u6587\u4ef6\uff1a apps\n\u2514\u2500\u2500 autotest_deepin_some\n \u00a0\u00a0 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_case.py\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 config.ini\n \u00a0\u00a0 \u251c\u2500\u2500 config.py\n \u00a0\u00a0 \u251c\u2500\u2500 conftest.py\n \u00a0\u00a0 \u251c\u2500\u2500 control\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_assert.py\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some.csv\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u2514\u2500\u2500 widget\n \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 case_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 other.ini\n \u00a0\u00a0 \u251c\u2500\u2500 other_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 pic_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2514\u2500\u2500 ui.ini\n autotest_deepin_some \u662f\u4f60\u7684\u5de5\u7a0b\u540d\u79f0\uff0c\u6bd4\u5982\uff1aautotest_deepin_music \uff1b \u5728\u6b64\u57fa\u7840\u4e0a\uff0c\u4f60\u53ef\u4ee5\u5feb\u901f\u7684\u5f00\u59cb\u4f60\u7684 AT \u9879\u76ee\u3002"},{"location":"#26","title":"2.6. \u7528\u4f8b\u6807\u7b7e\u81ea\u52a8\u540c\u6b65","text":"\u7528\u4e8e\u81ea\u52a8\u540c\u6b65 PMS \u7528\u4f8b\u6807\u7b7e\u6570\u636e\u81f3\u672c\u5730 CSV \u6587\u4ef6\uff0c\u4e3b\u8981\u901a\u8fc7\u4ee5\u4e0b\u51e0\u4e2a\u914d\u7f6e\u6765\u63a7\u5236\uff1a APP_NAME = # \u6307\u5b9a\u8981\u540c\u6b65\u7684\u5e94\u7528\u540d\u79f0\nPMS_USER = # PMS\u7684\u7528\u6237\u540d\nPMS_PASSWORD = # PMS\u7684\u5bc6\u7801\n \u5728 [csv_link_pms_id] \u8282\u70b9\u4e0b\u6307\u5b9a csv \u6587\u4ef6\u540d\u4e0e PMS \u7528\u4f8b\u6a21\u5757\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u6bd4\u5982\uff1a [csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/testcase-browse-53.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 53\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic = 53\n \u5c06\u4ee5\u4e0a\u4fe1\u606f\u914d\u7f6e\u597d\u4e4b\u540e\uff0c\u5728\u547d\u4ee4\u884c\u6267\u884c\uff1a youqu manage.py pms --pms2csv yes\n \u6bcf\u6b21\u6267\u884c\u65f6\u539f csv \u6587\u4ef6\u4f1a\u81ea\u52a8\u5907\u4efd\u5728 report/csv_back \u76ee\u5f55\u4e0b\uff0c\u56e0\u6b64\u4f60\u4e0d\u7528\u62c5\u5fc3\u811a\u672c\u6267\u884c\u5bfc\u81f4\u4f60\u7684\u6570\u636e\u4e22\u5931\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u57fa\u7840\u6846\u67b6\u8bbe\u8ba1\u65b9\u6848","text":"# ====================================\n# Author : Mikigo\n# Time : 2022/3/18\n# version \uff1a1.0\n# ====================================\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"\u505a\u4e00\u4e2a\u7b80\u5355\u3001\u597d\u7528\u3001\u529f\u80fd\u5f3a\u5927\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u3002 \u4f5c\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4e00\u4e2a\u57fa\u7840\u6846\u67b6\uff0c\u4efb\u4f55\u5e94\u7528\u90fd\u80fd\u5f88\u65b9\u4fbf\u7684\u63a5\u5165\u8fdb\u6765\uff1b \u63d0\u4f9b\u6240\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u9700\u8981\u7684\u5e95\u5c42\u529f\u80fd\uff0c\u5e76\u5bf9\u5916\u63d0\u4f9b\u552f\u4e00\u7684\u63a5\u53e3\uff0c\u65b9\u4fbf\u5e94\u7528\u5e93\u4f7f\u7528\uff1b \u6574\u5408\u516c\u5171\u5e93\uff0c\u51cf\u5c11\u5e94\u7528\u5e93\u4ee3\u7801\u91cf\u548c\u65b9\u6cd5\u7ef4\u62a4\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u8bbe\u8ba1\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u7edf\u4e00\u6982\u5ff5","text":" \u57fa\u7840\u6846\u67b6 \u672c\u9879\u76ee\u662f\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\uff08AutoTest Basic Frame\uff09\uff0c\u5168\u79f0\u4e3a\u201c\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff08AT \u57fa\u7840\u6846\u67b6\uff09\u201d\u3002 AT \u57fa\u7840\u6846\u67b6\u662f\u505a\u4e3a\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\u6765\u8bbe\u8ba1\u7684\uff0c\u5b83\u63d0\u4f9b\u4e86\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u57fa\u7840\u529f\u80fd\uff0c\u4efb\u4f55\u5e94\u7528\u63a5\u5165\u8fdb\u6765\u90fd\u80fd\u5feb\u901f\u65b9\u4fbf\u7684\u8fdb\u884c\u65b9\u6cd5\u548c\u7528\u4f8b\u7f16\u5199\uff0c\u540c\u65f6\u5728\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u3001\u6807\u7b7e\u5316\u6267\u884c\u3001\u5206\u5e03\u5f0f\u6267\u884c\u3001\u591a\u79cd\u62a5\u544a\u8f93\u51fa\u3001\u4f18\u7f8e\u7684\u6267\u884c\u65e5\u5fd7\u3001\u5931\u8d25\u81ea\u52a8\u5f55\u5c4f\u548c\u622a\u56fe\u3001\u81ea\u52a8\u73af\u5883\u6e05\u7406\u7b49\u7b49\uff0c\u5b83\u90fd\u63d0\u4f9b\u4e86\u5b8c\u5584\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u66f4\u91cd\u8981\u7684\u662f\u8fd9\u4e00\u5207\u4f7f\u7528\u8d77\u6765\u90fd\u975e\u5e38\u7b80\u5355\u3002 \u57fa\u7840\u6846\u67b6\u4e2d\u5305\u542b\u5e94\u7528\u5e93\uff08apps\uff09\u3001\u6838\u5fc3\u5e93\uff08src\uff09\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09\u3002 \u5e94\u7528\u5e93\uff08apps\uff09 \u5404\u4e2a\u5e94\u7528\u81ea\u5df1\u7684\u4ed3\u5e93\uff0c\u91cc\u9762\u4e3b\u8981\u5305\u542b\u7684\u662f\u7528\u4f8b\u3001\u65b9\u6cd5\u53ca\u4e00\u4e9b\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u53eb autotest-dde-file-manager \u3002 \u6838\u5fc3\u5e93\uff08src\uff09 \u6838\u5fc3\u5e93\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u5230\u6240\u6709\u5e95\u5c42\u6838\u5fc3\u529f\u80fd\uff0c\u8fd9\u662f\u6700\u91cd\u8981\u7684\u4e00\u4e2a\u90e8\u5206\uff0c\u7075\u9b42\u3002\u5177\u4f53\u529f\u80fd\u6a21\u5757\u53ca\u8bf4\u660e\u4f1a\u5728\u4e0b\u9762\u7b2c\u56db\u4e2a\u7ae0\u8282\u8be6\u7ec6\u63cf\u8ff0\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09 \u591a\u4e2a\u5e94\u7528\u90fd\u8981\u7528\u5230\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\uff0c\u6309\u7167\u5e94\u7528\u5212\u5206\u5b58\u653e\uff0c\u4e3b\u8981\u662f\u4e3a\u4e86\u51cf\u5c11\u4ee3\u7801\u91cf\uff0c\u6d88\u9664\u5e94\u7528\u95f4\u7684\u8026\u5408\u5173\u7cfb\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u67b6\u6784\u56fe","text":"\u6574\u4f53\u7684\u6846\u67b6\u8bbe\u8ba1\u5728\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u300b\u6587\u6863\u91cc\u9762\u5df2\u7ecf\u6709\u8be6\u7ec6\u63cf\u8ff0\u4e86\uff0c\u8fd9\u91cc\u8d34\u4e00\u4e0b\u6574\u4f53\u7684\u67b6\u6784\u56fe\uff1a \u4e3a\u4e86\u7a81\u663e\u672c\u6587\u7684\u91cd\u70b9\uff0c\u62bd\u53d6\u5176\u4e2d\u91cd\u8981\u529f\u80fd\u6a21\u5757\uff0c\u5982\u4e0b\u56fe\uff1a "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-basic-frame # \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\n\u251c\u2500\u2500 apps # \u5e94\u7528\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-dde-file-manager # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\uff08\u5e94\u7528\u5e93\u8be6\u7ec6\u76ee\u5f55\u7ed3\u6784\u8bf7\u770b\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\uff09\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 tag # \u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u2514\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u2502 \u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 xxx.png\n\u2502 \u2502 ...\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-deepin-music # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 public # \u516c\u5171\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget # dde_dock \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget # dde_desktop \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 src # \u6838\u5fc3\u5e93\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 button_center.py\n\u2502 \u251c\u2500\u2500 cmdtrl.py\n\u2502 \u251c\u2500\u2500 dogtails.py\n\u2502 \u251c\u2500\u2500 find_image.py\n\u2502 \u251c\u2500\u2500 global_config.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 setting # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 config.py\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 global_config.ini\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\u6a21\u5757\uff08Hook\uff09\n\u251c\u2500\u2500 pytest.ini # Pytest \u9ed8\u8ba4\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 docs # \u6587\u6863\u76ee\u5f55\n\u2514\u2500\u2500 manage.py # \u6267\u884c\u5668\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1apps","title":"1\u3001\u5e94\u7528\u5e93\uff08apps\uff09","text":"\u6240\u6709\u5e94\u7528\u5e93\u5747\u653e\u7f6e\u5728\u57fa\u7840\u6846\u67b6\u4e0b\u7684 apps \u76ee\u5f55\u4e0b\uff08\u89c1\u7b2c\u4e8c\u7ae0\u8282\u7b2c3\u6bb5\u76ee\u5f55\u7ed3\u6784\u5185\u5bb9\uff09\u3002\u5e94\u7528\u5e93\u7684\u67b6\u6784\u8bbe\u8ba1\u53ef\u4ee5\u53c2\u8003\u300aAT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b\u6587\u6863\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2src","title":"2\u3001\u6838\u5fc3\u5e93\uff08src\uff09","text":"\u5728 src \u76ee\u5f55\u4e0b\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u5e95\u5c42\u6838\u5fc3\u7ec4\u4ef6\uff0c\u901a\u5e38\u6765\u8bb2\u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5230\u5176\u4e2d\u67d0\u4e00\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4e48\u4f60\u9700\u8981\u663e\u793a\u7684\u5bfc\u5165\u8fd9\u4e2a\u6a21\u5757\uff0c\u7136\u540e\u624d\u80fd\u4f7f\u7528\u8be5\u6a21\u5757\u4e0b\u7684\u529f\u80fd\uff0c\u5982\u679c\u4f60\u7528\u5230\u4e86\u5341\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4f60\u5c31\u9700\u8981\u5bfc\u5165\u5341\u4e2a\u3002\u4f46\u662f\u6211\u4eec\u60f3\u8ba9\u4e8b\u60c5\u53d8\u5f97\u7b80\u5355\uff0c\u4e00\u6b21\u5bfc\u5165\uff0c\u4f7f\u7528\u6240\u6709\u3002 \u5c06\u6240\u6709\u7684\u529f\u80fd\u6a21\u5757\u90fd\u8fdb\u5165\u5230 src \u7684\u540d\u79f0\u7a7a\u95f4\uff0c\u5728 src/__init__.py \u91cc\u9762\u6211\u4eec\u8bbe\u8ba1\u6210\u8fd9\u6837\uff1a # src/__init__.py\nfrom .cmdctl import CmdCtl\nfrom .dogtails import Dogtail\nfrom .find_image import FindImage\nfrom .button_center import ButtonCenter\nclass Src(CmdCtl, FindImage):\ndef __init__(self, **kwargs):\n\"\"\"dogtail or button center param\n :param kwargs: app_name, desc, number\n \"\"\"\nif kwargs:\napp_name = kwargs.get(\"APP_NAME\")\ndesc = kwargs.get(\"DESC\")\nif app_name is None or desc is None:\nraise ValueError\nnumber = kwargs.get(\"number\")\nnumber = number if isinstance(number, int) else -1\n# \u5bf9\u8c61\u7ec4\u5408\nself.dog = Dogtail(app_name, desc, number)\nself.ui = ButtonCenter(app_name, number)\n \u9700\u8981\u4f20\u9012\u53c2\u6570\u7684\u91c7\u7528\u5bf9\u8c61\u7ec4\u5408\uff0c\u6ca1\u6709\u53c2\u6570\u7684\u4f7f\u7528\u7ee7\u627f\uff0c\u7ee7\u627f\u7684\u7c7b\u7b26\u5408 Mixin \u8bbe\u8ba1\u6a21\u5f0f\u3002 \u5e94\u7528\u5e93\u91cc\u9762\u4f7f\u7528\u7684\u65f6\u5019\u5728 widget/base_widget.py \u91cc\u9762\u53ea\u9700\u8981\u552f\u4e00\u7ee7\u627f Src \uff1a # \u5e94\u7528\u5e93\u91cc\u9762\u65b9\u6cd5\u57fa\u7c7b\n# widget/base_widget.py\nfrom src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n \u8981\u4f7f\u7528\u6838\u5fc3\u5e93\u7684\u529f\u80fd\uff0c\u53ea\u9700\u8981\u5199\u4e00\u4e2a\u5bfc\u5165 from src import Src \u5373\u53ef\u3002 \u5199 __init__ \u6784\u9020\u51fd\u6570\u7684\u539f\u56e0\u662f\u901a\u8fc7\u53c2\u6570\u6784\u9020\u5e94\u7528\uff0c\u5e76\u4e14\u4f20\u9012 number \u8fdb\u6765\uff0c\u53ef\u4ee5\u5b9e\u73b0\u591a\u7a97\u53e3\u7684\u63a7\u5236\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3public","title":"3\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09","text":"\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6bcf\u4e2a\u5e94\u7528\u90fd\u662f\u4e00\u4e2a\u5355\u72ec\u7684 py \u6587\u4ef6\uff0c\u76f8\u4e92\u4e4b\u95f4\u662f\u72ec\u7acb\u7684\uff0c\u6bcf\u4e2a py \u6587\u4ef6\u91cc\u9762\u662f\u8be5\u5e94\u7528\u7684\u65b9\u6cd5\u7c7b\uff0c\u6bd4\u5982\uff1a\u6700\u5e38\u7528\u7684\u65b9\u6cd5\u7c7b dde_desktop_public_widget.py # dde_desktop_widget.py\nfrom src import Src\nclass _DdeDesktopPublicBaseWidget(Src):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-desktop\"\nDESC = \"/usr/bin/dde-desktop\"\ndef __init__(self):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC)\nclass DdeDesktopPublicWidget(_DdeDesktopPublicBaseWidget):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u7c7b\"\"\"\ndef click_music_dir_by_ui(self):\n\"\"\"\u5728\u6587\u4ef6\u9009\u62e9\u6846\u70b9\u51fb\u97f3\u4e50\u76ee\u5f55\"\"\"\nself.click(*self.ui.btn_center(\"\u4fa7\u8fb9\u680f-\u97f3\u4e50\")) \ndef click_xxx_by_attr(self):\npass\n \u516c\u5171\u65b9\u6cd5\u5e93\u610f\u4e49\uff1a \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6240\u5c01\u88c5\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\u90fd\u662f\u81f3\u5c11\u88ab2\u4e2a\u5e94\u7528\u90fd\u7528\u5230\u7684\uff0c\u8fd9\u6837\u505a\u53ef\u4ee5\u51cf\u5c11\u6574\u4f53\u4ee3\u7801\u91cf\uff0c\u4ece\u800c\u51cf\u8f7b\u5e94\u7528\u5e93\u4ee3\u7801\u7684\u7ef4\u62a4\u5de5\u4f5c\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u7f16\u5199\u5f62\u5f0f\uff08\u547d\u540d\u89c4\u5219\u3001\u5b9a\u4f4d\u7684\u65b9\u6848\u5199\u6cd5\u3001\u6ce8\u91ca\u7684\u5199\u6cd5\u7b49\u7b49\uff09\u5177\u6709\u4e00\u5b9a\u7684\u6a21\u677f\u4f5c\u7528\uff0c\u8fd9\u6837\u5373\u4f7f\u662f\u5404\u4e2a\u5e94\u7528\u5e93\u90fd\u72ec\u7acb\u7ef4\u62a4\uff0c\u6240\u6709\u7684\u7f16\u7801\u98ce\u683c\u90fd\u662f\u8d8b\u4e8e\u76f8\u540c\u7684\uff0c\u56e0\u4e3a\u5927\u5bb6\u90fd\u5e94\u8be5\u53c2\u7167\u516c\u5171\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u5199\u6cd5\u6765\u5199\u81ea\u5df1\u5e94\u7528\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\u7c7b\uff0c\u8fd9\u6837\u4f7f\u5f97\u4ece\u516c\u53f8\u7684\u89d2\u5ea6\u53bb\u770b\u6240\u6709\u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u90fd\u662f\u7edf\u4e00\u7684\u3002 \u53ef\u4ee5\u901a\u8fc7\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\uff0c\u4e86\u89e3\u5230\u5176\u4ed6\u5e94\u7528\u7684\u529f\u80fd\uff0c\u5bf9\u4e8e\u6211\u4eec\u9700\u6c42\u7406\u89e3\uff0c\u4e86\u89e3\u7cfb\u7edf\u7684\u65b9\u65b9\u9762\u9762\u4e5f\u6709\u597d\u5904\u3002 \u5f53\u7136\uff0c\u5982\u679c\u4f60\u7684\u5e94\u7528\u672c\u8eab\u662f\u5c5e\u4e8e\u6839\u672c\u5c31\u4e0d\u9700\u8981\u548c\u5176\u4ed6\u5e94\u7528\u4ea4\u4e92\u7684\uff0c\u90a3\u4e48\u4f60\u53ef\u80fd\u4e0d\u4f1a\u7528\u5230\u8fd9\u91cc\u9762\u7684\u529f\u80fd\uff0c\u6ca1\u5173\u7cfb\uff0c\u4f60\u6240\u6709\u7684\u65b9\u6cd5\u90fd\u53ef\u4ee5\u76f4\u63a5\u5199\u5728\u5e94\u7528\u5e93\u7684\u4e1a\u52a1\u5c42\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4conftestpy","title":"4\u3001conftest.py","text":"conftest.py \u4ece\u529f\u80fd\u4e0a\u5c06\u662f\u5c5e\u4e8e\u6838\u5fc3\u5e93\uff08src\uff09\u7684\u5185\u5bb9\uff0c\u4f46\u662f\u7531\u4e8e\u5b83\u7684\u7279\u6b8a\u6027\uff0c\u5373\u5b83\u662f\u5bf9\u5e94\u7528\u5e93\u4e2d\u7684\u7528\u4f8b\u751f\u6548\u7684\uff0c\u800c\u4e14\u5b83\u7684\u4f5c\u7528\u57df\u662f\u5f53\u524d\u76ee\u5f55\u53ca\u4ee5\u4e0b\uff0c\u56e0\u6b64\u6211\u4eec\u5c06\u5b83\u653e\u5230\u9879\u76ee\u6839\u76ee\u5f55\u3002\u6211\u4eec\u6846\u67b6\u4e2d\u6709\u4e0d\u5c11\u6838\u5fc3\u529f\u80fd\u90fd\u662f\u5728\u8fd9\u91cc\u9762\u8fdb\u884c\u5f00\u53d1\u7684\uff0c\u540e\u9762\u7b2c\u56db\u7ae0\u4f1a\u8bb2\u5230\u7ec6\u8282\u3002 pytest.ini \u4f5c\u7528\u548c conftest.py \u7c7b\u4f3c\uff0c\u662f Pytest \u6846\u67b6\u7684\u56fa\u5b9a\u914d\u7f6e\u6587\u4ef6\uff0c\u76ee\u524d\u914d\u7f6e\u4e86\u4e00\u4e9b\u901a\u7528\u7684\u547d\u4ee4\u884c\u6267\u884c\u53c2\u6570\uff0c\u4e5f\u653e\u5728\u9879\u76ee\u6839\u76ee\u5f55\u3002 \u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 Hook \u51fd\u6570\uff0capps \u76ee\u5f55\u4e0b\u7684 \u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 fixture \u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5setting","title":"5\u3001setting","text":"\u5168\u5c40\u914d\u7f6e\u6a21\u5757\uff0c\u5305\u542b\u4e86\u4ee5\u4e0b\u914d\u7f6e\u6587\u4ef6\uff1a \uff081\uff09ini \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u914d\u7f6e\u4e00\u4e9b\u5168\u5c40\u7684\u914d\u7f6e\u9879\uff0c\u8b6c\u5982\uff1a\u5931\u8d25\u91cd\u8dd1\u6b21\u6570\u3001\u662f\u5426\u5931\u8d25\u5f55\u5c4f\u3001\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\u3001\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4\u3001\u6267\u884c\u65f6\u65e5\u5fd7\u7ea7\u522b\u3001\u751f\u6210\u7684\u62a5\u544a\u7c7b\u578b\u3001\u4ee5\u53ca\u5206\u5e03\u5f0f\u6267\u884c\u7684\u4e00\u4e9b\u7b56\u7565\u914d\u7f6e\u9879\u7b49\u7b49\u3002 \uff082\uff09config.py \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u63d0\u4f9b\u914d\u7f6e\u6587\u4ef6\u8bfb\u53d6\u3001\u52a8\u6001\u83b7\u53d6\u4e00\u4e9b\u5e38\u91cf\uff08\u5982\u9879\u76ee\u6839\u76ee\u5f55\u7edd\u5bf9\u8def\u5f84 (BASE_DIR)\u3001\u7cfb\u7edf\u67b6\u6784\uff08SYS_FRAME\uff09\u3001\u65f6\u95f4\u5b57\u7b26\u4e32\uff08strftime\uff09\u3001\u672c\u673a USERNAME IP \u7b49\u7b49\uff09\u3001\u516c\u5171 URL \u7b49\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u89c4\u8303","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u7248\u672c\u53ca\u4f9d\u8d56","text":"\u57fa\u7840\u6846\u67b6\u4f1a\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u8fdb\u884c\u7248\u672c\u53d1\u5e03\uff0c\u4e0d\u4e0e\u67d0\u4e2a\u5e94\u7528\u7248\u672c\u7ed1\u5b9a\uff0c\u4f46\u662f\uff0c\u5e94\u7528\u5e93\u4f1a\u4f9d\u8d56\u4e8e\u57fa\u7840\u6846\u67b6\u7684\u7248\u672c\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u5efa\u8bae\u5728\u5e94\u7528\u5e93\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a\u6587\u672c\u6587\u4ef6\u7528\u4e8e\u8bb0\u5f55\u6240\u4f9d\u8d56\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\uff0c\u7c7b\u4f3c\u4e8e\u5f00\u53d1\u5e94\u7528\u7684 debian/control \u6587\u4ef6\u7684\u529f\u80fd\uff0c\u4e3a\u4e86\u4fdd\u6301\u7edf\u4e00\uff0c\u8fd9\u4e2a\u6587\u4ef6\u5c31\u547d\u540d\u4e3a control\uff0c\u653e\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u6838\u5fc3\u5e93\u72ec\u7acb\u6027","text":"\u6838\u5fc3\u5e93\u4e0d\u5efa\u8bae\u9488\u5bf9\u67d0\u4e00\u4e2a\u5e94\u7528\u5355\u72ec\u505a\u4ee3\u7801\u4e0a\u7279\u6b8a\u5904\u7406\uff0c\u901a\u5e38\u8003\u8651\u9488\u5bf9\u67d0\u4e00\u79cd\u573a\u666f\u8fdb\u884c\u5904\u7406\uff0c\u8fd9\u4e9b\u573a\u666f\u901a\u5e38\u662f\u5b58\u5728\u4e00\u4e9b\u5171\u6027\u7684\u3002\u6bd4\u5982\u8bf4\uff1a\u684c\u9762\u7684ID\u5206\u914d\u5b58\u5728\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u903b\u8f91\u5904\u7406\u89e3\u51b3ID\u5206\u914d\u9519\u8bef\u7684\u95ee\u9898\uff0c\u4f46\u662f\u8fd9\u90e8\u5206\u903b\u8f91\u6211\u4eec\u4f1a\u5728\u684c\u9762\u7684\u65b9\u6cd5\u5c42\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u517c\u5bb9\u6027","text":"\u4e3a\u4e86\u4fdd\u6301\u517c\u5bb9\u6027\uff0c\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u539f\u5219\u4e0a\u4e0d\u5bf9\u8001\u65b9\u6cd5\u8fdb\u884c\u4fee\u6539\u6216\u5220\u9664\uff0c\u53ea\u8fdb\u884c\u65b0\u589e\u3002\u6d89\u53ca\u5230\u8001\u65b9\u6cd5\u4fee\u6539\u6216\u5220\u9664\u7684\uff0c\u4f1a\u8fdb\u884c\u63d0\u524d\u9884\u544a\uff0c\u5e76\u5728\u7b2c\u4e8c\u4e2a\u7248\u672c\u4e4b\u540e\uff08\u4e2d\u95f4\u4f1a\u9694\u4e00\u4e2a\u7248\u672c\u8fc7\u5ea6\uff09\u6b63\u5f0f\u5b9e\u65bd\u4fee\u6539\u6216\u5220\u9664\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u547d\u540d\u89c4\u8303","text":" \u7528\u4f8b ID \u6bcf\u4e2a\u5e94\u7528\u81ea\u5df1\u7ef4\u62a4\u4e00\u5957 ID\uff0c\u5728PMS\u4e0a\u7528\u4f8b\u6807\u9898\u4e0a\u5c06\u81ea\u52a8\u5316ID\u4ee5\u6807\u7b7e\u7684\u5f62\u5f0f\u5199\u5165\uff0c\u6bd4\u5982\uff1a[101]\u6253\u5f00-\u542f\u52a8\u5e94\u7528\u540edock\u53f3\u952e\u83dc\u5355 \u4e00\u4e2a\u7528\u4f8b\u7c7b\u91cc\u9762\u6709\u591a\u4e2a\u7528\u4f8b\u65f6\uff0c\u5728\u7528\u4f8b\u540d\u79f0\u540e\u9762\u52a0\u5e8f\u53f7\u3002 class TestFileManager(BaseCase):\n\"\"\"\u6587\u7ba1\u7528\u4f8b\"\"\"\ndef test_xxx_015_1(self):\npass\ndef test_xxx_015_2(self):\npass\n \u6ce8\u610f 015_1\uff0c\u4e0d\u8981\u5199015_01\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 PMS \u4e0a\u7684\u7528\u4f8bID\uff1a PMS \u4e0a\u662f6\u4f4d\u6570\uff0c\u4e0d\u591f\u76f4\u89c2\uff0c\u4e5f\u4e0d\u597d\u7ef4\u62a4\uff0c\u5728\u81ea\u52a8\u5316\u4e0b\u9762\u53bb\u627e\u4e00\u4e2a\u5e26\u6709 6 \u4f4d\u6570\u7684\u6587\u4ef6\u662f\u4e00\u4e2a\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 PMS \u4e0a\u7684 ID \u53ef\u80fd\u4f1a\u53d1\u751f\u53d8\u5316\uff0c\u6bd4\u5982\u5bfc\u51fa\u6765\u5bfc\u8fdb\u53bb\u7684\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u5b58\u5728\u95ee\u9898\uff0c\u5982\u679c\u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u8981\u60f3\u627e\u51fa\u6765\u5bf9\u5e94\u4fee\u6539\u81ea\u52a8\u5316\u7528\u4f8b ID\uff0c\u5c06\u4f1a\u662f\u4ef6\u975e\u5e38\u75db\u82e6\u7684\u4e8b\u60c5\u3002 \u51fd\u6570\u547d\u540d\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5de6\u952e\u70b9\u51fb click \u53f3\u952e\u70b9\u51fb right_click \u53cc\u51fb double_click \u79fb\u52a8 move_to \u62d6\u52a8 drag \u65b0\u5efa new \u62d6\u52a8\u5230 drag_to \u4ece\u54ea\u91cc\u62d6\u52a8\u5230\u54ea\u91cc drag_something_from_xxx_to_xxx \u83b7\u53d6 get \u83b7\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5750\u6807 get_location \u975e\u7279\u6b8a\u6587\u4ef6 file word\u6587\u4ef6 doc text\u6587\u4ef6 text \u6587\u4ef6\u5939 dir \u5173\u952e\u8bcd\u6301\u7eed\u589e\u52a0 \u5e38\u91cf\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5e94\u7528\u540d\u79f0 APP_NAME \u5e94\u7528\u63cf\u8ff0 DESC \u672c\u5e94\u7528\u4ee5\u5916\u7684\u5176\u4ed6\u5e94\u7528\uff0c\u6bd4\u5982\u5e2e\u52a9 HELP \u5176\u4ed6\u540d\u79f0\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u65b9\u6cd5\u5305\u540d widget \u65b9\u6cd5\u6587\u4ef6\u540d\uff08\u6587\u7ba1\u4e3e\u4f8b\uff09 dfm_widget.pytitle_widget.pyright_view_widget.pyleft_view_widget.pypop_widget.pybase_widget.pydfm_assert.py \u65ad\u8a00\u8bed\u53e5\u547d\u540d\u89c4\u8303 \u65ad\u8a00\u8bed\u53e5\u90fd\u662f\u4ee5 assert \u5f00\u5934 \u65ad\u8a00 \u8bed\u53e5 \u5224\u65ad\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_existsassert_file_not_exists \u5224\u65ad\u684c\u9762\u76ee\u5f55\u4e0b\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_exists_in_desktopassert_file_not_exists_in_desktop \u5224\u65ad\u56fe\u7247\u5b58\u5728 assert_image_existsassert_image_not_exists \u5224\u65ad\u5f71\u9662\u4e2d\u662f\u5426\u5b58\u5728\u56fe\u7247 assert_image_exists_in_movieassert_image_not_exists_in_movie \u5224\u65ad\u5143\u7d20\u662f\u5426\u5b58\u5728 assert_element_existassert_element_not_exist \u5224\u65ad\u662f\u5426\u76f8\u7b49 assert_equalassert_not_equal \u5224\u65ad\u662f\u5426\u4e3a\u771f assert_trueassert_false"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5fixture","title":"5\u3001fixture \u89c4\u8303","text":"\u7531\u4e8e Pytest \u6846\u67b6\u4e2d\u652f\u6301 fixture \u7684\u5199\u6cd5\u548c Xunit \u5199\u6cd5\u7684\uff0c\u6240\u4ee5\u5e94\u7528\u5e93\u4e2d\u53ef\u80fd\u5b58\u5728\u6df7\u7528\u7684\u60c5\u51b5\uff0c\u4e3a\u7edf\u4e00\u7f16\u7801\u98ce\u683c\u65b9\u4fbf\u540e\u7eed\u7528\u4f8b\u4ee3\u7801\u7ef4\u62a4\uff0c\u73b0\u505a\u4ee5\u4e0b\u89c4\u8303\u8bf4\u660e\uff1a \u629b\u5f03 Xunit \u7684\u5199\u6cd5\uff0c\u7edf\u4e00\u91c7\u7528 Pytest fixture \u7684\u5199\u6cd5\u3002 \u5e94\u7528\u5185 fixture \u8c28\u614e\u4f7f\u7528 autouse=True \uff0c\u975e\u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u975e\u5e38\u4e0d\u5efa\u8bae\u4f7f\u7528\u8fd9\u4e2a\u53c2\u6570\u3002 \u8c03\u7528 fixture \u4e0d\u80fd\u4f7f\u7528 @pytest.mark.usefixture()\uff0c\u4f7f\u7528\u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u4f20\u5165\u51fd\u6570\u5bf9\u8c61\u3002 \u5efa\u8bae\u5728\u4e00\u4e2a conftest.py \u91cc\u9762\u53bb\u5199\uff0c\u4e00\u4e2a\u5e94\u7528\u4e5f\u5c3d\u91cf\u7ef4\u62a4\u4e00\u4e2a conftest.py\u6587\u4ef6\u3002 fixture \u4e5f\u9700\u8981\u5199\u529f\u80fd\u8bf4\u660e\uff0c\u51fd\u6570\u540d\u79f0\u8981\u6709\u5177\u4f53\u542b\u4e49\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#6","title":"6\u3001\u65b9\u6cd5\u7f16\u5199\u89c4\u8303","text":" \u65b9\u6cd5\u7c7b\u578b\uff1a if \u6ca1\u6709\u7528\u5230\u5b9e\u4f8b\u5bf9\u8c61\uff1a\nif \u6ca1\u6709\u7528\u5230\u7c7b\u5bf9\u8c61\uff1a\n\u5199\u9759\u6001\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @staticmethod\nelse\uff1a\n\u5199\u7c7b\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @classmethod\nelse:\n\u76f4\u63a5\u5199\u5b9e\u4f8b\u65b9\u6cd5\n \u4e3e\u4f8b: class TitleWidget:\ndef click_xxx_by_ui(self):\npass\n@staticmethod\ndef click_xxx_by_ui():\npass\n@classmethod\ndef click_xxx_by_ui(cls):\npass\n \u51fd\u6570\u540d\u79f0\u4e0d\u51fa\u73b0\u6570\u5b57\uff0c\u9700\u8981\u8868\u793a\u6570\u91cf\u7684\u7528\u5355\u8bcd\u8868\u793a\u3002 \u51fd\u6570\u529f\u80fd\u6ce8\u91ca\u3002 \u6ca1\u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg2:xxx\n\"\"\"\n \u6709\u53c2\u6570\uff0c\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg1:xxx\nreturn: xxx\n\"\"\"\n \u200b \u7528 Pycharm \u7684\u6ce8\u91ca\u6a21\u677f\u4e5f\u53ef\u4ee5\uff0c\u53ea\u8981\u4f53\u73b0\u4e86\u53c2\u6570\u7684\u7c7b\u578b\u548c\u8fd4\u56de\u5c31\u884c\u4e86\u3002 \u6682\u4e0d\u8981\u6c42\u5199\u7c7b\u578b\u6ce8\u89e3\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#7case","title":"7\u3001\u7528\u4f8b\uff08case\uff09\u89c4\u8303","text":" \u4ee5\u7c7b\u7684\u5f62\u5f0f\u5199\u7528\u4f8b\uff0c\u7528\u4f8b\u7c7b\u96c6\u6210\u7528\u4f8b\u57fa\u7c7b\u3002 \u7528\u4f8b\u7c7b\u9700\u8981\u5199\u6ce8\u91ca\u3002 \u6d4b\u8bd5\u7528\u4f8b\u51fd\u6570\u8bf4\u660e\uff08\u5efa\u8bae\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u540d\u79f0\uff09 \"\"\"\u53f3\u4fa7\u9884\u89c8-\u56fe\u7247\u7c7b\u578b\u4fe1\u606f\u680f\u57fa\u672c\u4fe1\u606f\"\"\"\n \u4e0d\u5199\u8c03\u8bd5\u4ee3\u7801 if __name__ == '__main__':\npytest.main()\n \u6240\u6709\u7528\u4f8b\u90fd\u7ee7\u627f BaseCase\u3002 BaseCase \u91cc\u9762\u653e\u4e00\u4e9b\u6d4b\u8bd5\u6570\u636e\u7684\u5e38\u91cf\uff0c\u6bd4\u5982\u6587\u4ef6\u540d\u79f0\uff0c\u5e94\u7528\u540d\u79f0\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u4e00\u4e9b\u901a\u7528\u7684\u5b57\u7b26\u4e32\u3002 \u8fd9\u7c7b\u662f\u5c5e\u4e8e\u6d4b\u8bd5\u6570\u636e\u3002 class BaseCase(DfmAssert):\n\"\"\"\u7528\u4f8b\u57fa\u7c7b\"\"\"\nNEW_FILE = \"\u65b0\u5efa\u6587\u672c.txt\"\nTEST_FILE = \"test.txt\"\nNEW_DIR = \"\u65b0\u5efa\u6587\u4ef6\u5939\"\nNEW_WORD = \"\u65b0\u5efaWord\u6587\u6863.doc\"\nAPP_HELP = \"damn\"\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\n\"\"\"\u7528\u4f8b\u6807\u9898\uff08\u590d\u5236PMS\u4e0a\u7528\u4f8b\u6807\u9898\uff09\"\"\"\ndfm = DfmWidget()\ndfm.click_xxx_by_attr(self.NEW_FILE)\ndfm.new_file_in_desktop_by_cmd(self.NEW_FILE)\nself.assert_true(dfm.get_process_status(self.APP_NAME))\n \u7528\u4f8b\u91cc\u9762\u5c3d\u91cf\u51cf\u5c11\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\uff0c\u66f4\u8981\u51cf\u5c11\u76f8\u540c\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\u3002 \u7edf\u4e00\u6587\u4ef6\u6ce8\u91ca\u5934\u3002 #!/usr/bin/env python3\n# _*_ coding:utf-8 _*_\n\"\"\"\n:Author:email@uniontech.com\n:Date :${DATE} ${TIME}\n\"\"\"\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#8","title":"8\u3001\u5176\u4ed6\u89c4\u8303","text":" \u65e5\u5fd7\u6253\u5370\u8981\u5728\u65b9\u6cd5\u6700\u524d\u9762\uff0c\u5426\u5219\u4ee3\u7801\u62a5\u9519\u6ca1\u6709\u65e5\u5fd7\u8f93\u51fa\uff0c\u4e0d\u597d\u5b9a\u4f4d\u95ee\u9898\u3002\uff08\u6211\u4eec\u4f1a\u8003\u8651\u7ee7\u7eed\u4f7f\u7528\u62e6\u622a\u5668\u6253\u5370\u65e5\u5fd7\uff09 \u6240\u6709\u7684\u64cd\u4f5c\u90fd\u9700\u8981\u6709\u65e5\u5fd7\uff0c\u5305\u62ec sleep()\uff0c\u6211\u4eec\u4f1a\u91cd\u5199\u4e00\u4e2a\u6709\u65e5\u5fd7\u8f93\u5165\u7684 sleep\u3002 \u4e1a\u52a1\u5c42\u65e5\u5fd7\u7ea7\u522b\u4e3a INFO\u3002 hook \u51fd\u6570\u53ea\u80fd\u5199\u5230\u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u91cc\u9762\u3002 apps \u76ee\u5f55\u4e0b\u7684 conftest.py \u539f\u5219\u4e0a\u4e0d\u4f1a\u65b0\u589e fixture\u3002 \u56fa\u5b9a\u76ee\u5f55\u6216\u5143\u7d20\u63a7\u4ef6\u7684\u64cd\u4f5c\uff0c\u5c06\u64cd\u4f5c\u65b9\u6cd5\u5199\u6b7b\uff0c\u6587\u4ef6\u7c7b\u64cd\u4f5c\u5c06\u6587\u4ef6\u540d\u7559\u53c2\u6570\u3002 \u8def\u5f84\u62fc\u63a5\u89c4\u8303\uff1a \u7cfb\u7edf\u4e2d\u56fa\u5b9a\u76ee\u5f55\uff0c\u8def\u5f84\u62fc\u63a5\u65f6\u4f7f\u7528\u6ce2\u6d6a\u7b26\u53f7\uff0c\u6bd4\u5982\uff1a~/Desktop/\uff0c\u4e0b\u5c42\u4f7f\u7528 os.path.expanduser()\uff0c\u5b83\u53ef\u4ee5\u81ea\u52a8\u8bc6\u522b\u6ce2\u6d6a\u7b26\u53f7\u3002 \u9879\u76ee\u4e0b\u8def\u5f84\u4f7f\u7528\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u8def\u5f84\uff0c\u6bd4\u5982\uff1aConfig.BASE_PATH\uff0c\u56e0\u4e3a\u9879\u76ee\u662f\u53ef\u4ee5\u5728\u4efb\u610f\u8def\u5f84\u8fd0\u884c\u7684\uff0c\u9700\u8981\u52a8\u6001\u62fc\u63a5\u8def\u5f84\u3002 "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848","text":"# =================================================\n# Author : Mikigo\n# Time : 2022/3/16\n# version \uff1a1.0\n# =================================================\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"AT \u5e94\u7528\u5e93\u6539\u9020\u662f\u57fa\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u8fdb\u884c\u7528\u4f8b\u65b9\u6cd5\u548c\u4e1a\u52a1\u903b\u8f91\u7684\u91cd\u65b0\u8bbe\u8ba1\uff0c\u4ee5\u5b9e\u73b0\u5e94\u7528\u5e93\u9ad8\u6548\u7684\u7f16\u5199\u3001\u7ef4\u62a4\u7528\u4f8b\u53ca\u5176\u65b9\u6cd5\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u6587\u4ef6\u7ba1\u7406\u5668\u4ece\u4e1a\u52a1\u590d\u6742\u5ea6\u548c\u7528\u4f8b\u91cf\u6765\u8bb2\uff0c\u5728\u7cfb\u7edf\u6240\u6709\u5e94\u7528\u4e2d\uff0c\u662f\u5f88\u6709\u4ee3\u8868\u6027\u7684\uff0c\u96be\u5ea6\u4e5f\u662f\u6700\u5927\u7684\uff0c\u56e0\u6b64\u6211\u4eec\u9009\u53d6\u6587\u4ef6\u7ba1\u7406\u5668\u4f5c\u4e3a\u5e94\u7528\u5e93\u6539\u9020\u7684\u5b9e\u9a8c\u5e94\u7528\uff0c\u7ed9\u540e\u7eed\u5176\u4ed6\u5e94\u7528\u6539\u9020\u63d0\u4f9b\u5207\u5b9e\u53ef\u884c\u7684\u601d\u8def\u548c\u65b9\u6848\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u5206\u5c42\u8bbe\u8ba1\u56fe","text":"\u6574\u4f53\u4ecd\u7136\u9075\u5faa PO \u8bbe\u8ba1\u7406\u5ff5\uff0c\u6839\u636e\u4e1a\u52a1\u9700\u8981\uff0c\u5c06\u6587\u7ba1\u4e1a\u52a1\u5c42\u8fdb\u884c 3 \u5c42\u5212\u5206\uff1a "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-dde-file-manager # \u5e94\u7528\u4ed3\u5e93\n\u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 test_xxx_001.py\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u00a0\u251c\u2500\u2500 __init__.py\n\u2502 \u00a0\u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u00a0\u251c\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u00a0\u251c\u2500\u2500 base_widget.py # \u65b9\u6cd5\u57fa\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 title_widget.py # title \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 right_view_widget.py # right view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 left_view_widget.py # left view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 pop_widget.py # pop \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 dfm_widget.py # \u65b9\u6cd5\u7684\u7edf\u4e00\u51fa\u53e3\n\u2502 \u00a0\u2514\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 tag # \u7528\u4f8b\u6807\u7b7e\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 xxx.csv # \u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2514\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u57fa\u7c7b","text":" \u7ee7\u627f\u6838\u5fc3\u5c42\u7684\u5404\u4e2a\u6a21\u5757\u7c7b\u3002 \u62bd\u53d6\u64cd\u4f5c\u5c42\u7684\u4e00\u4e9b\u57fa\u7840\u65b9\u6cd5\u3002 \u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u7684\u4e00\u4e9b\u516c\u5171\u65b9\u6cd5\u3002 \u8def\u5f84\u7ec4\u88c5\u65b9\u6cd5\u3002 \u4e00\u4e9b\u4e1a\u52a1\u5c42\u76f8\u5173\u7684\u53d8\u91cf\u3001\u5e38\u91cf\u3001shell\u547d\u4ee4\u3001\u5750\u6807\u3002 \u65b9\u6cd5\u57fa\u7c7b\u7684\u5199\u6cd5\uff1a from src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u64cd\u4f5c\u5c42","text":" \u6a21\u5757\u5212\u5206 \u6309\u7167\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u6587\u7ba1\u4e3b\u754c\u9762\u5206\u4e3a\u4e09\u4e2a\u533a\u57df\uff1a\u6807\u9898\u680f\u3001\u53f3\u8fb9\u89c6\u56fe\u533a\u57df\u3001\u5de6\u8fb9\u89c6\u56fe\u533a\u57df \u5f39\u7a97\uff1a\u8bbe\u7f6e\u754c\u9762\u5f39\u7a97\u3001\u4fdd\u9669\u7bb1\u5f39\u7a97\u3001\u5220\u9664\u786e\u8ba4\u5f39\u7a97\u3001\u53ca\u5404\u79cd\u7f51\u7edc\u5f39\u7a97 \u53f3\u952e\u83dc\u5355\uff1a\u6682\u65f6\u4e0d\u8003\u8651\u4e3a\u5355\u72ec\u7684\u6a21\u5757\uff0c\u8003\u8651\u4ee5\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6848\u505a\u6210\u516c\u5171\u5e93\u3002 \u5404\u4e2a\u6a21\u5757\u53ea\u7ee7\u627f\u57fa\u7c7b from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u6784\u9020\u51fd\u6570\u91cc\u9762\u4e0d\u6784\u9020\u5bf9\u8c61\uff0c\u53ef\u4ee5\u521d\u59cb\u5316\u4e00\u4e9b\u53d8\u91cf\u3002 \u4e0d\u540c\u7684\u5b9a\u4f4d\u65b9\u6848\u8c03\u7528\u4e0d\u540c\u7684\u5b9a\u4f4d\u5de5\u5177\u5bf9\u8c61\u3002 self.dog\nself.ui\nself.d_bus\n \u65b9\u6cd5\u7f16\u5199 \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u5e94\u7528\u5c42","text":" \u7ee7\u627f\u64cd\u4f5c\u5c42\u7684\u6240\u6709\u7c7b\u3002 \u4ec5\u4ec5\u7528\u4e8e\u7528\u4f8b\u4e2d\u5bfc\u5165\u65b9\u4fbf\uff0c\u4e0d\u505a\u5176\u4ed6\u4e8b\u60c5\u3002 class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n DfmAssert \u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u7ee7\u627f\uff0c\u65b9\u4fbf\u4f7f\u7528\u65ad\u8a00\u8bed\u53e5\u3002 from apps.dde_file_manager.widget.dfm_widget import DfmWidget\nfrom public.assert import Assert\nclass DfmAssert(Assert):\ndef assert_file_exists_in_desktop(self, file_name):\nself.assert_file_exists(f\"~/Desktop{file_name}\")\n...\nDfmWidget().get_file_in_desktop()\n \u7528\u4f8b\u91cc\u9762\u76f4\u63a5\u7ee7\u627f\uff0c\u65b9\u4fbf\u5728\u7528\u4f8b\u91cc\u9762\u4f7f\u7528 self \u8fdb\u884c\u65ad\u8a00\uff0c\u66f4\u7b26\u5408\u65ad\u8a00\u7684\u4f7f\u7528\u4e60\u60ef\uff0c\u7528\u4f8b\u903b\u8f91\u4e0a\u66f4\u6e05\u695a\u3002 class BaseCase(DfmAssert):\npass\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\nself.assert_file_exists_in_desktop(\"xxx\")\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u903b\u8f91\u4e3e\u4f8b","text":"\u7528\u4f8b\u4ee3\u7801\u8c03\u7528\u903b\u8f91\u4e3e\u4f8b\uff1a # BaseWidget\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n# =============================================\n# TitleWidget\nclass TitleWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_title_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# RightViewWidget\nclass RightViewWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_right_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# =============================================\n# \u51fa\u53e3 DfmWidget\nclass DfmWidget(TitleWidget, RightViewWidget):\npass\n# =============================================\n# in case\nfrom apps.dde_file_manager.widget.dfm_widget import DfmWidget\ndfm = DfmWidget()\ndfm.click_xxx_title_by_ui()\ndfm.click_xxx_right_by_ui()\ndfm.dog.print_desc()\ndfm.ui.print_number()\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u5de5\u7a0b\u6539\u9020\u5b9e\u65bd\u6b65\u9aa4","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_2","title":"1\u3001\u5de5\u7a0b\u4ee3\u7801\u62c9\u53d6","text":"1.1. \u5c06\u81ea\u52a8\u5316\u57fa\u7840\u6846\u67b6\u7684\u529f\u80fd\u62c9\u5230\u672c\u5730 Autotest Basic Frame \uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame 1.2. \u5c06\u5e94\u7528\u5e93\u4ee3\u7801\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u5e94\u7528\u5e93\u7684\u4ed3\u5e93\u547d\u540d\u5e94\u8be5\u662f\u957f\u8fd9\u6837\u7684 autotest_deepin_xxx\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_2","title":"2\u3001\u8c03\u6574\u5de5\u7a0b\u76ee\u5f55","text":"\u6309\u7167 \u65b9\u6848\u8bbe\u8ba1-\u76ee\u5f55\u7ed3\u6784 \u8fdb\u884c\u76ee\u5f55\u8c03\u6574\uff0c\u5c3d\u91cf\u4f7f\u7528\u7f16\u8f91\u5668\u8fdb\u884c\u76f8\u5e94\u7684\u8c03\u6574\uff0c\u7f16\u8f91\u5668\u63a8\u8350\u4f7f\u7528 Pycharm \uff0c\u4ee5\u4e0b\u64cd\u4f5c\u5747\u5728 Pycharm \u91cc\u9762\u53ef\u5b9e\u73b0\u3002 2.1. \u9700\u8981\u79fb\u52a8 py \u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u76f4\u63a5\u5728\u7f16\u8f91\u5668\u91cc\u9762\uff0c\u4f7f\u7528\u9f20\u6807\u9009\u4e2d\u5e76\u6309\u4f4f\uff0c\u4e4b\u540e\u62d6\u52a8\u5230\u76ee\u6807\u4f4d\u7f6e\u5373\u53ef\uff0cPycharm \u4f1a\u5c3d\u53ef\u80fd\u7684\u81ea\u52a8\u89e3\u51b3\u79fb\u52a8\u5bfc\u81f4\u7684\u8def\u5f84\u95ee\u9898\u3002\u6ce8\u610f\uff0c\u6211\u8bf4\u7684\u662f\u201c\u5c3d\u53ef\u80fd\u201d\uff0c\u6709\u4e9b\u9a9a\u64cd\u4f5c\u7f16\u8f91\u5668\u662f\u65e0\u6cd5\u81ea\u52a8\u5904\u7406\u7684\u3002\u5982\u679c\u6ca1\u6709\u88ab\u7f16\u8f91\u5668\u81ea\u52a8\u5904\u7406\u7684\u8def\u5f84\u95ee\u9898\uff0c\u540e\u7eed\u53ea\u80fd\u624b\u52a8\u89e3\u51b3\u3002 2.2. \u9700\u8981\u91cd\u547d\u540d\u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u5728\u7f16\u8f91\u5668\u91cc\u9762\u9009\u4e2d\u6587\u4ef6\uff0c\u7136\u540e\u4f7f\u7528\u5feb\u6377\u952e Shift + F6 \uff08\u5982\u679c\u5feb\u6377\u952e\u6ca1\u53cd\u5e94\uff0c\u6587\u4ef6\u53f3\u952e\u83dc\u5355 Refactor \u2014\u2014 Rename\uff09\uff0c\u7136\u540e\u5728\u8f93\u5165\u6846\u4e2d\u8f93\u5165\u8981\u91cd\u547d\u540d\u7684\u540d\u79f0\uff0c\u540c\u65f6\uff0c\u786e\u8ba4\u52fe\u9009 Search for references \u548c Search in comments and strings \u8fd9\u4e24\u4e2a\u9009\u9879\uff0c\u6700\u540e\u6309\u56de\u8f66\u6216\u8005\u9f20\u6807\u70b9 Refactor \u3002 \u6ce8\u610f\uff0c\u6b64\u65f6\u7f16\u8f91\u5668\u53ef\u80fd\u4f1a\u63d0\u793a\u4f60\uff0c\u4f60\u8fd9\u4e2a\u91cd\u547d\u540d\u7684\u64cd\u4f5c\u5173\u8054\u4e86\u591a\u4e2a\u6a21\u5757\uff0c\u5b83\u88ab\u591a\u4e2a\u5730\u65b9\u90fd\u4f7f\u7528\u5230\u4e86\uff0c\u76f8\u5173\u7684\u6a21\u5757\u662f\u5426\u4e5f\u4e00\u8d77\u6539\u540d\u4e86\uff0c\u8fd9\u4e0d\u5e9f\u8bdd\u5417\uff0c\u7528\u8fd9\u4e2a\u529f\u80fd\u5c31\u662f\u60f3\u628a\u5173\u8054\u5230\u7684\u90fd\u4fee\u6539\uff0c\u4e0d\u7136\u6211\u4e3a\u4ec0\u4e48\u4e0d\u7528\u6587\u7ba1\u7684\u91cd\u547d\u540d\u529f\u80fd\u5462\uff0c\u522b\u60f3\u4e86\uff0c\u76f4\u63a5\u70b9\u5de6\u4e0b\u89d2\u7684 Refactor \u6309\u94ae\uff0c\u5c31\u662f\u5e72\u3002 \u7c7b\u540d\u3001\u51fd\u6570\u540d\u7684\u91cd\u547d\u540d\u90fd\u5c3d\u91cf\u91c7\u7528\u8fd9\u79cd\u65b9\u6848\uff0c\u56e0\u4e3a\u7f16\u8f91\u5668\u4f1a\u81ea\u52a8\u7ed9\u6211\u4eec\u627e\u5230\u5173\u8054\u7684\u5730\u65b9\uff0c\u7136\u540e\u540c\u6b65\u4fee\u6539\u6389\u3002\u4f60\u53ef\u5343\u4e07\u522b\u76f4\u63a5\u5220\u4e86\u4fee\u6539\u540d\u79f0\uff0c\u4e0d\u7136\u4f60\u53ef\u80fd\u4f1a\u82b1\u4e0a\u4e00\u5929\u7684\u65f6\u95f4\u6765\u89e3\u51b3\u91cd\u547d\u540d\u7684\u95ee\u9898\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u5b9e\u73b0\u6838\u5fc3\u5e93\u63a5\u53e3","text":"3.1. BaseWidget \u5728 BaseWidget \u91cc\u9762\u628a\u8be5\u5199\u7684\u90fd\u5199\u597d\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u4e0a\u9762\u7684\u8bbe\u8ba1\u7406\u5ff5\u6765\u5199\u3002 \u5982\u679c\u4f60\u5acc\u9ebb\u70e6\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u6587\u7ba1\u7684\u5b9e\u9645\u5de5\u7a0b\u4ee3\u7801 autotest_dde_file_manager : https://gerrit.uniontech.com/admin/repos/autotest_dde_file_manager \u3002 3.2. \u64cd\u4f5c\u5c42 \u5982\u679c\u4f60\u662f\u65b0\u5199\u9879\u76ee\uff0c\u4f60\u4f1a\u53d1\u73b0\u4e00\u5207\u90fd\u662f\u90a3\u4e48\u7684\u7b80\u5355\u3001\u76f4\u63a5\uff0c\u6309\u7167\u6211\u4eec\u63d0\u4f9b\u7ed9\u4f60\u7684\u63a5\u53e3\u5199\u7528\u4f8b\u7684\u64cd\u4f5c\u65b9\u6cd5\u5c31\u597d\u4e86\u3002 \u5982\u679c\u4f60\u662f\u60f3\u5bf9\u539f\u6765\u7684\u5de5\u7a0b\u8fdb\u884c\u6539\u9020\uff0c\u4f60\u9700\u8981\u6309\u7167\u6838\u5fc3\u5e93\u65b9\u6cd5\u7684\u8c03\u7528\uff0c\u5c06\u4f60\u4e4b\u524d\u5199\u7684\u6bcf\u4e2a\u65b9\u6848\u8fdb\u884c\u5bf9\u5e94\u7684\u4fee\u6539\uff0c\u5305\u62ec\u7c7b\u548c\u65b9\u6cd5\u7684\u547d\u540d\u3001\u65b9\u6cd5\u5185\u6240\u8981\u7528\u5230\u4e0d\u540c\u5b9a\u4f4d\u65b9\u6cd5\u7684\u5199\u6cd5\u4fee\u6539\u3002 \u8fd9\u65f6\u5019\u4f60\u53ef\u80fd\u4f60\u7684\u4ee3\u7801\u4e2d\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u62a5\u9519\uff0c\u4e0d\u7528\u62c5\u5fc3\uff0c\u4f60\u53ef\u4ee5\u4ece\u4e1a\u52a1\u903b\u8f91\u51fa\u53d1\uff0c\u60f3\u6e05\u695a\u8fd9\u4e2a\u65b9\u6cd5\u662f\u5e72\u4ec0\u4e48\u7684\u3001\u64cd\u4f5c\u7684\u5bf9\u8c61\u662f\u4ec0\u4e48\u3001\u53c2\u6570\u662f\u4ec0\u4e48\uff0c\u6ce8\u610f\u8fd9\u4e9b\u4fee\u6539\u662f\u4f1a\u5f71\u54cd\u5230\u7528\u4f8b\u4ee3\u7801\u91cc\u9762\u7684\uff0c\u6ca1\u5173\u7cfb\uff0c\u7528\u4f8b\u91cc\u9762\u672c\u6765\u4e5f\u5e94\u8be5\u88ab\u5173\u8054\u4fee\u6539\u3002 3.3. \u628a\u914d\u7f6e\u6a21\u5757\u5199\u597d\uff0c\u8fd9\u90e8\u5206\u57fa\u672c\u53ef\u4ee5\u590d\u5236\u6587\u7ba1\u7684\u4ee3\u7801\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4_1","title":"4\u3001\u8def\u5f84\u5904\u7406","text":"4.1. \u5bfc\u5165\u8def\u5f84 \u65b9\u6cd5\u548c\u7528\u4f8b\u4e2d\u90fd\u4f1a\u6d89\u53ca\u5230\u5bfc\u5165\u8def\u5f84\u7684\u4fee\u6539\uff0c\u5728\u4fee\u6539\u8def\u5f84\u65f6\uff0c\u5efa\u8bae\u4f60\u4f7f\u7528 Ctrl + Shift + R \u5168\u5c40\u66ff\u6362\uff0c\u4f1a\u5c06\u6574\u4e2a\u9879\u76ee\u4e0b\u7684\u76f8\u540c\u5730\u65b9\u90fd\u4fee\u6539\u5230\uff0c\u5f53\u7136\uff0c\u4f60\u4e5f\u53ef\u4ee5\u5728\u5c0f\u5f39\u7a97\u4e2d\u4fee\u6539\u5168\u5c40\u66ff\u6362\u4e3a\u5c40\u90e8\u76ee\u5f55\u4e0b\u66ff\u6362\u3002\u5904\u7406\u90a3\u79cd\u6ca1\u6709\u5173\u8054\u5173\u7cfb\uff0c\u4f46\u662f\u53c8\u662f\u76f8\u540c\u540d\u79f0\u7684\u91cd\u547d\u540d\uff0c\u6211\u4e5f\u63a8\u8350\u4f7f\u7528\u8fd9\u79cd\u65b9\u5f0f\u8fdb\u884c\u91cd\u547d\u540d\u3002 \u6ce8\u610f\uff0c\u5168\u5c40\u66ff\u6362\u7684\u65b9\u5f0f\u4efb\u7136\u65e0\u6cd5\u4fdd\u8bc1\u771f\u7684\u5168\u5c40\u88ab\u66ff\u6362\u4e86\uff08\u53ef\u80fd\u662f\u7f16\u8f91\u5668\u7684 Bug \u5427\uff09\uff0c\u6240\u4ee5\u4f60\u4ecd\u7136\u9700\u8981\u624b\u52a8\u770b\u4e0b\u5404\u5904\u662f\u5426\u4fee\u6539\u5230\u4f4d\u3002 4.2. \u8d44\u6e90\u8def\u5f84 \u4e00\u4e9b\u7528\u4f8b\u8d44\u6e90\u9700\u8981\u6839\u636e config.py \u91cc\u9762\u7684\u8def\u5f84\u914d\u7f6e\u8fdb\u884c\u8d44\u6e90\u8def\u5f84\u7684\u62fc\u63a5\uff0c\u5982\u679c\u4f60\u539f\u6765\u672c\u6765\u5c31\u6709\u4e00\u4e2a\u51fd\u6570\u4e13\u95e8\u7528\u4e8e\u7ec4\u88c5\u8def\u5f84\u7684\uff0c\u90a3\u4f60\u53ea\u9700\u8981\u4fee\u6539\u8fd9\u4e00\u4e2a\u5730\u65b9\u5c31\u597d\u4e86\uff0c\u5982\u679c\u4f60\u4e4b\u524d\u5e76\u6ca1\u6709\u8fd9\u6837\u7684\u8bbe\u8ba1\uff0c\u90a3\u53ef\u80fd\u9700\u8981\u4fee\u6539\u5927\u91cf\u6d89\u53ca\u5230\u8d44\u6e90\u8def\u5f84\u7684\u5730\u65b9\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5","title":"5\u3001\u8c03\u8bd5\u548c\u7f16\u5199\u7528\u4f8b","text":"\u4ee5\u4e0a\u51e0\u4e2a\u6b65\u9aa4\u505a\u5b8c\uff0c\u57fa\u672c\u5c31\u53ef\u4ee5\u8fdb\u884c\u7528\u4f8b\u4ee3\u7801\u7684\u8c03\u8bd5\u4e86\uff0c\u8fd9\u90e8\u5206\u5de5\u4f5c\u4e3b\u8981\u89e3\u51b3\u4f60\u4e4b\u524d\u51e0\u4e2a\u6b65\u9aa4\u9057\u6f0f\u7684\u95ee\u9898\uff0c\u5982\u679c\u6240\u6709\u7528\u4f8b\u90fd\u8c03\u8bd5\u901a\u8fc7\u4e86\uff0c\u90a3\u4e48\u5de5\u7a0b\u6539\u9020\u5c31\u5168\u90e8\u5b8c\u6210\u4e86\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/","title":"AT \u5f00\u53d1\u89c4\u8303","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u5f00\u53d1\u89c4\u8303\u662f\u6839\u636e\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fd0\u884c\u4e24\u5e74\u591a\u6765\uff0c\u9047\u5230\u95ee\u9898\u89e3\u51b3\u95ee\u9898\u800c\u5f62\u6210\u7684\u4e00\u4e9b\u89e3\u51b3\u65b9\u6848\uff0c\u6216\u8005\u8bf4\u7ecf\u9a8c\u603b\u7ed3\uff1b\u8fd9\u4e9b\u7ecf\u9a8c\u7b26\u5408\u6211\u4eec\u73b0\u9636\u6bb5 AT \u6240\u5e94\u7528\u7684\u573a\u666f\u9700\u8981\uff0c\u4e5f\u662f\u6211\u4eec\u7ecf\u8fc7\u957f\u671f\u601d\u8003\uff0c\u4e0d\u65ad\u8bd5\u9519\u4e0d\u65ad\u4fee\u6b63\uff0c\u5e76\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u5b9e\u8df5\u4e2d\u68c0\u9a8c\u8fc7\u53ef\u884c\u7684\u3002\u4ee5\u6b64\uff0c\u5e0c\u671b\u80fd\u5e2e\u52a9\u53c2\u4e0e\u5230\u81ea\u52a8\u5316\u7684\u76f8\u5173\u4eba\u5458\u51cf\u5c11\u8bd5\u9519\u6210\u672c\uff0c\u66f4\u597d\u3001\u66f4\u5feb\u7684\u7f16\u5199\u7528\u4f8b\u53ca\u7ef4\u62a4\u7528\u4f8b\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_1","title":"\u4e00\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u89c4\u8303","text":"\u6807\u7b7e\u5316\u7ba1\u7406\u6587\u6863\u8bf7\u53c2\u8003\uff1a \u300a\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u64cd\u4f5c\u6307\u5f15\u300b \u4ee5\u4e0b\u8bf4\u51e0\u4e2a\u5bb9\u6613\u51fa\u73b0\u7684\u95ee\u9898\uff1a"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1","title":"1. \u5bf9\u5e94\u5173\u7cfb","text":" \u5199\u5b8c\u81ea\u52a8\u5316\u7528\u4f8b\u4e4b\u540e\uff0c\u8bf7\u5728 CSV \u6587\u4ef6\u4e2d\u6807\u8bb0\u7528\u4f8b\u7684 ID\u3001\u7b49\u7ea7\u3002\u4e3a\u4e86\u63d0\u9192\u6807\u8bb0\uff0c\u6267\u884c\u7528\u4f8b\u65f6\u5728\u9996\u884c\u4f1a\u8f93\u51fa ERROR \u65e5\u5fd7\uff1a CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94\u7684 ID\uff1b \u5728\u6700\u7ec8\u63d0\u4ea4\u4ee3\u7801\u4e4b\u524d\uff0c\u4f60\u9700\u8981\u5728 CSV \u6587\u4ef6\u91cc\u9762\u5c06ID\u3001\u7528\u4f8b\u7b49\u7ea7\u7b49\u6807\u7b7e\u8865\u5168\uff0c\u5982\u679c CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94 ID\uff0c\u540e\u7eed\u5728\u6279\u91cf\u6267\u884c\u7684\u65f6\u5019\uff0c\u8fd9\u4e9b\u7528\u4f8b\u662f\u4e0d\u4f1a\u6267\u884c\u7684\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2","title":"2. \u540d\u79f0\u4e00\u81f4","text":" CSV \u6587\u4ef6\u7684\u6587\u4ef6\u540d\u3001\u7528\u4f8b\u51fd\u6570\u4e2d\u95f4\u7684\u540d\u79f0\u4e00\u81f4\u3001\u7528\u4f8b py \u6587\u4ef6\u4e2d\u95f4\u7684\u540d\u79f0\uff0c\u8fd9\u4e09\u4e2a\u540d\u79f0\u4e00\u81f4\u3002 \u4e3e\u4f8b\uff1a # test_music_001.py\ndef test_music_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u90a3\u4e48 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e3a music.csv\u3002 AT \u6846\u67b6\u5e95\u5c42\u4ee3\u7801\u5b9e\u73b0\u662f\u5c06 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e0e\u7528\u4f8b\u51fd\u6570\u540d\u79f0\u540d\u79f0\uff08item.name\uff09\u8fdb\u884c\u5bf9\u5e94\uff0c\u56e0\u6b64\uff0c\u6ce8\u610f CSV \u6587\u4ef6\u540d\u79f0\u5bf9\u5e94\u7684\u662f\u7528\u4f8b\u51fd\u6570\u540d\u79f0\uff0c\u5373 def test_music_001 \u91cc\u9762\u7684 music \uff0c\u800c\u4e0d\u662f test_music_001.py \u91cc\u9762\u7684 music \u3002 \u8fd9\u91cc\u7ec6\u7ec6\u54c1\u4e00\u4e0b\u54c8~ \u5982\u679c\u4f60\u5c06\u4e0a\u4f8b\u5199\u6210\u4e86\u8fd9\u6837: # test_music_001.py\ndef test_movie_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u7528\u4f8b\u6267\u884c\u6ca1\u95ee\u9898\uff0c\u4f46\u662f\u6807\u7b7e\u5316\u7ba1\u7406\u662f\u4e0d\u751f\u6548\u7684\uff0c\u6846\u67b6\u65e0\u6cd5\u5c06 music.csv\u6587\u4ef6\u91cc\u9762\u6807\u7b7e\uff0c\u6dfb\u52a0\u5230 test_movie_001\u8fd9\u4e2a\u7528\u4f8b\u4e2d\uff0c\u56e0\u4e3a\u4ed6\u4eec\u6ca1\u6709\u5bf9\u5e94\u5173\u7cfb\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#tag","title":"\u4e8c\u3001\u5206\u652f\u53ca tag \u7ba1\u7406\u89c4\u8303","text":"\u53c2\u8003\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u4ee3\u7801\u7ba1\u7406\u89c4\u8303\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2-tag","title":"2. \u5e94\u7528\u5e93 tag","text":" \u5e94\u7528\u5e93 tag \u6839\u636e\u5e94\u7528\u4ea4\u4ed8\u8282\u70b9\u751f\u6210\uff0c\u6bcf\u6b21\u6253 tag \u4e4b\u524d\uff0c\u76f8\u5173\u6d4b\u8bd5\u4eba\u5458\u9700\u8981\u8fdb\u884c\u7528\u4f8b\u8c03\u8bd5\uff1b \u8c03\u8bd5\u7528\u4f8b\u662f\u6307\u7684\u5728\u5168\u67b6\u6784\uff08x86\u3001arm\u3001mips\uff09\u4e0a\u8c03\u8bd5\u901a\u8fc7\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\u8fbe\u5230 90% \u4ee5\u4e0a\u624d\u80fd\u6253 tag\uff0c\u901a\u8fc7 Jenkins \u6267\u884c\u5668\u6267\u884c\u7528\u4f8b\uff0c\u4fdd\u7559\u901a\u8fc7\u7387\u7ed3\u679c\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\uff1a\u901a\u8fc7\u7528\u4f8b\u6570 / (\u603b\u7528\u4f8b\u6570 - \u5df2\u5e9f\u5f03\u7528\u4f8b) \u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u7b97\u901a\u8fc7 Jenkins \u6267\u884c\u5668 \u4f60\u53ef\u80fd\u4f1a\u5728\u4e00\u4e2a\u4ea4\u4ed8\u5468\u671f\u5185\u6301\u7eed\u7684\u8fdb\u884cAT\u7528\u4f8b\u8c03\u8bd5\uff0c\u4f46\u662f\u6700\u7ec8 AT \u7528\u4f8b\u6253 tag \u7684\u5e94\u7528\u7248\u672c\uff0c\u9700\u8981\u4f7f\u7528\u5e94\u7528\u96c6\u6210\u4ea4\u4ed8\u7684\u6700\u65b0\u5e94\u7528\u7248\u672c\uff0c\u53ef\u4ee5\u4f7f\u7528\u5e94\u7528\u7684\u63d0\u6d4b\u7248\u672c\uff1b\u4e00\u5b9a\u8981\u786e\u4fdd\u8c03\u8bd5\u7528\u4f8b\u7684\u5e94\u7528\u7248\u672c\u662f\u6700\u65b0\u7684\uff0c\u4e0d\u7136\u96c6\u6210\u8fdb\u53bb\u4e4b\u540e\uff0c\u6301\u7eed\u96c6\u6210\u5c31\u4f1a\u51fa\u95ee\u9898\uff1b tag \u53f7\u600e\u4e48\u6253\uff1f \u6839\u636e\u6301\u7eed\u96c6\u6210\u7684\u8981\u6c42\u751f\u6210\uff0c\u5176\u4e2d\u5e94\u7528\u7248\u672c\u53f7\u9700\u8981\u4e0e\u9879\u76ee\u7ecf\u7406\u786e\u8ba4\u672c\u6b21\u5373\u5c06\u96c6\u6210\u7684\u5e94\u7528\u7248\u672c\u53f7\u662f\u591a\u5c11\uff1b tag \u7684 commit \u4fe1\u606f\u683c\u5f0f\uff1a # commit msg\nversion:5.6.5\n \u5176\u4e2d 5.6.5 \u5199\u5e94\u7528\u7684\u96c6\u6210\u7248\u672c\u53f7\u3002 \u751f\u6210 tag \u7684\u547d\u4ee4\u53c2\u8003\uff1a\u300aGit \u6807\u7b7e\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3-tag","title":"3. \u57fa\u7840\u6846\u67b6 tag","text":"\u57fa\u7840\u6846\u67b6 tag \u4e0d\u4e0e\u4e1a\u52a1\u6302\u94a9\uff0c\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u6309\u9700\u53d1\u5e03\u7248\u672c\uff0c\u5728\u6839\u76ee\u5f55\u4e0b CURRENT \u6587\u4ef6\u4e2d\u8bb0\u5f55\u7684\u5f53\u524d\u7248\u672c\u53f7\u548c\u5386\u53f2\u7248\u672c\u53f7\uff0c\u53ca\u5176\u5bf9\u5e94\u65b0\u589e\u4e86\u54ea\u4e9b\u529f\u80fd\uff0c\u6709\u52a9\u4e8e\u5e94\u7528\u9009\u62e9\u5408\u9002\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\u3002 # CURRENT\n[current]\ntag = 0.9.5\n \u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u7684 control \u6587\u4ef6\u8bb0\u5f55\u5f53\u524d\u5e94\u7528\u5e93\u4f9d\u8d56\u7684\u57fa\u7840\u5e93\u7248\u672c\u3002 # control\n[Depends]\nautotest-basic-frame = 0.9.5\n \u7528\u4f8b\u5728\u6267\u884c\u65f6\u4f1a\u6821\u9a8c\u4e24\u4e2a\u6587\u4ef6\u7684\u7248\u672c\u53f7\u662f\u5426\u4e00\u81f4\uff0c\u5982\u679c\u4e0d\u4e00\u81f4\uff0c\u4f1a\u6253\u5370 error \u65e5\u5fd7\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_2","title":"\u4e09\u3001\u4ed3\u5e93\u6743\u9650\u7ba1\u7406","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_1","title":"1. \u57fa\u7840\u6846\u67b6","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u4ed3\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame \u57fa\u7840\u6846\u67b6\u4e0d\u5141\u8bb8\u533f\u540d\u8bbf\u95ee\uff0c\u5982\u679c\u4f60\u767b\u5f55 gerrit \u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u8bbf\u95ee\u4ee5\u4e0a\u94fe\u63a5\uff0c\u5219\u9700\u8981\u7533\u8bf7\u8bbf\u95ee\u6743\u9650\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_1","title":"2. \u5e94\u7528\u4ed3\u5e93","text":" \u81ea\u52a8\u5316\u5e94\u7528\u4ed3\u5e93\uff1a https://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684 app_name \u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_3","title":"\u56db\u3001\u65b9\u6cd5\u7f16\u5199&\u8c03\u7528\u89c4\u8303","text":"\u65b9\u6cd5\u7f16\u5199\u6574\u4f53\u8bbe\u8ba1\u601d\u8def\u53c2\u8003\uff1a[\u300aAT\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b]"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_2","title":"1. \u65b9\u6cd5\u7f16\u5199","text":"\u5199\u65b9\u6cd5\u7684\u65f6\u5019\u6ce8\u610f\u65b9\u6cd5\u5f52\u5c5e\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget\uff0c\u65b9\u6cd5\u662f\u5728\u54ea\u4e2a\u533a\u57df\u64cd\u4f5c\u7684\uff0c\u5c31\u5199\u5728\u54ea\u4e2a\u7c7b\u91cc\u9762\u3002 \u4e3e\u4f8b\uff1a from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n\"\"\"\u70b9\u51fb\u6807\u9898\u680fxxx\"\"\"\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_2","title":"2. \u65b9\u6cd5\u8c03\u7528","text":" \u5728\u7528\u4f8b\u4e2d\u8c03\u7528\u65b9\u6cd5\uff0c\u901a\u8fc7\u8be5\u5e94\u7528\u552f\u4e00\u7684\u51fa\u53e3\u8fdb\u884c\u8c03\u7528\uff0c\u6bd4\u5982\u6587\u7ba1\uff1a class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n \u4e0d\u8981\u5728\u7528\u4f8b\u4e2d\u5355\u72ec\u53bb\u8c03\u7528 TitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u8fd9\u4e9b\u7c7b\uff0c\u5426\u5219\u540e\u671f\u7528\u4f8b\u4f1a\u53d8\u5f97\u4e0d\u597d\u7ef4\u62a4\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_4","title":"\u4e94\u3001\u7528\u4f8b\u7f16\u5199\u89c4\u8303","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_3","title":"1. \u57fa\u4e8e\u7c7b\u5199\u7528\u4f8b","text":"\u6240\u6709\u7528\u4f8b\u90fd\u5e94\u8be5\u57fa\u4e8e\u7c7b\u53bb\u5199\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001(self):\n\"\"\"\u97f3\u4e50\u542f\u52a8\"\"\"\n \u6ce8\u610f\u4ee5\u4e0b\u51e0\u70b9\uff1a \u7c7b\u540d\u4e0d\u8981\u968f\u4fbf\u53d6\uff0c\u540c\u4e00\u4e2a\u5e94\u7528\u5e94\u8be5\u4f7f\u7528\u540c\u4e00\u4e2a\u7c7b\u540d\uff0c\u7528\u4f8b\u7c7b\u540d\u79f0\u5fc5\u987b\u4ee5 Test \u5f00\u5934\uff0c\u9075\u5faa\u5927\u9a7c\u5cf0\u547d\u540d\u89c4\u8303\uff1b \u7528\u4f8b\u7c7b\u7ee7\u627f BaseCase\uff0c\u4e00\u4e2a\u5e94\u7528\u53ea\u6709\u4e00\u4e2a BaseCase \u4e00\u4e2a py \u6587\u4ef6\u91cc\u9762\u53ea\u6709\u4e00\u4e2a\u7c7b\uff0c\u6211\u4eec\u79f0\u4e3a\u4e00\u4e2a\u6d4b\u8bd5\u7c7b\uff1b \u4e00\u4e2a\u7c7b\u91cc\u9762\u53ef\u4ee5\u6709\u591a\u4e2a\u7528\u4f8b\u51fd\u6570\uff0c\u8fd9\u53d6\u51b3\u8fd9\u6761\u7528\u4f8b\u6709\u591a\u5c11\u4e2a\u6d4b\u8bd5\u70b9\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001_1(self):\n\"\"\"\u4efb\u52a1\u680f\u542f\u52a8\u97f3\u4e50\"\"\"\ndef test_music_001_2(self):\n\"\"\"\u542f\u52a8\u5668\u542f\u52a8\u97f3\u4e50\"\"\" \ndef test_music_001_3(self):\n\"\"\"\u684c\u9762\u542f\u52a8\u97f3\u4e50\"\"\"\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_3","title":"2. \u7528\u4f8b\u51fd\u6570\u89c4\u8303","text":" \u7528\u4f8b\u51fd\u6570\u4ee5 test \u5f00\u5934\uff0c\u9075\u5faa\u86c7\u5f62\u547d\u540d\u89c4\u8303\uff0c\u4e2d\u95f4\u4e3a\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0\uff0c\u540e\u9762\u52a0\u7528\u4f8b ID\uff0c\u6700\u540e\u52a0\u6d4b\u8bd5\u70b9\u5e8f\u53f7\uff0c\u5373 test_${module}_${case_id}[_${index}] \uff1b \u6bd4\u5982\uff1atest_music_001_1\uff0cindex \u4ece 1 \u5f00\u59cb\u3002 \u51fd\u6570\u529f\u80fd\u8bf4\u660e\u91cc\u9762\u5199\u7528\u4f8b\u6807\u9898\uff0c\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u6807\u9898\u5373\u53ef\uff0c\u6ce8\u610f\u7528\u4e09\u5bf9\u53cc\u5f15\u53f7\uff0c\u4e0d\u8981\u7528\u5176\u4ed6\u6ce8\u91ca\uff0c\u66f4\u4e0d\u8981\u7528\u4e95\u53f7\u6ce8\u91ca\u5199\u7528\u4f8b\u6807\u9898\uff1b \u76f4\u63a5\u590d\u5236 PMS \u7528\u4f8b \u7528\u4f8b\u6b65\u9aa4\u76f4\u63a5\u5c06 PMS \u4e0a\u7528\u4f8b\u6b65\u9aa4\u548c\u9884\u671f\u590d\u5236\u8fdb\u6765\uff0c\u7136\u540e\u8fdb\u884c\u6279\u91cf\u6ce8\u91ca\uff08ctrl + /\uff09\uff0c\u5728\u6ce8\u91ca\u7684\u57fa\u7840\u4e0a\u53bb\u5199\u7528\u4f8b\u811a\u672c\u4f1a\u66f4\u52a0\u65b9\u4fbf\u5168\u9762\uff0c\u4e5f\u6bd4\u4f60\u81ea\u5df1\u5199\u6ce8\u91ca\u66f4\u8282\u7ea6\u65f6\u95f4\uff1a \u4e3e\u4f8b\uff0cPMS \u7528\u4f8b\uff1a \u76f4\u63a5\u9009\u4e2d\u7528\u4f8b\u5185\u5bb9\uff0c\u590d\u5236\u4e0b\u6765\uff0c\u7136\u540e\u7c98\u8d34\u5230\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c\u4e2d\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\n \u4e0a\u4f8b\u4e2d\u4e95\u53f7\u6ce8\u91ca\u90e8\u5206\u5c31\u662f\u76f4\u63a5\u4ece PMS \u4e0a\u590d\u5236\u8fc7\u6765\u7684\uff0c\u5728\u6b64\u57fa\u7840\u4e0a\u5199\u7528\u4f8b\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\nmusic = DeepinMusicWidget()\nmusic.click_singer_btn_in_music_by_ui()\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\nmusic.click_icon_mode_in_music_by_ui()\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\nmusic.double_click_first_singer_in_singer_icon_view_by_ui()\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\nself.assert_xxx\n \u4f60\u770b\uff0c\u975e\u5e38\u6e05\u695a\u6bcf\u4e00\u6b65\u5728\u505a\u4ec0\u4e48\uff0c\u91cd\u70b9\u662f\u7701\u53bb\u4e86\u5199\u6ce8\u91ca\u7684\u65f6\u95f4\uff0c\u771f\u7684\u7092\u9e21\u65b9\u4fbf\u3002 \u4e0d\u5199 if __name__ == '__main__':\uff0c\u4e0d\u5199\u591a\u4f59\u7684\u4ee3\u7801\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3","title":"3. \u6570\u636e\u9a71\u52a8","text":" \u5982\u679c\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u662f\u76f8\u540c\u7684\uff0c\u53ea\u662f\u4e00\u4e9b\u53c2\u6570\u53d8\u5316\uff0c\u5c3d\u91cf\u4f7f\u7528\u6570\u636e\u9a71\u52a8\u6765\u5b9e\u73b0\u7528\u4f8b\uff1b \u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u6570\u636e\u9a71\u52a8\u7684\u6570\u636e\uff0c\u4e0d\u80fd\u56e0\u6b64\u5f15\u5165\u4f9d\u8d56\uff0c\u5c3d\u91cf\u4f7f\u7528\u4e00\u4e9b\u6807\u51c6\u5e93\u80fd\u8bfb\u53d6\u7684\u6587\u4ef6\u683c\u5f0f\uff0c\u6bd4\u5982 json\u3001ini\u3001CSV\u3001xml\u3001txt \u7b49\u6587\u4ef6\u683c\u5f0f\uff1b\u4e0d\u5efa\u8bae\u4f7f\u7528 Yaml\u3001Excel\u3001MySQL \u7b49\u6570\u636e\u683c\u5f0f\uff1b \u8bfb\u53d6\u6570\u636e\u65f6\u4e5f\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff0c\u5982\u4f7f\u7528 pandas \u5904\u7406 CSV \u5c31\u5c5e\u4e8e\u5927\u6750\u5c0f\u7528\u4e86\uff0c\u6b63\u5e38\u7684\u6570\u636e\u9a71\u52a8\u8fd8\u6ca1\u5230\u9700\u8981\u5927\u6570\u636e\u5206\u6790\u6765\u5904\u7406\u7684\u5730\u6b65\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u5728 widget/ddt/ \u76ee\u5f55\u4e0b\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5199\u6cd5\uff1a @pytest.mark.parametrize(\"value\", data)\ndef test_smb_049(self, value):\n \u4ee5\u4e0a\u8fd9\u79cd\u53c2\u6570\u5316\u7684\u5199\u6cd5\u672c\u8eab\u6ca1\u4ec0\u4e48\u95ee\u9898\uff0c\u4f46\u662f\uff0c\u8fd9\u91cc\u5fc5\u987b\u8981\u8865\u5145\u4e00\u4e2a\u6ca1\u6709\u7528\u7684\u5c0f\u77e5\u8bc6\uff1a \u5982\u679c\u53c2\u6570\u5316\u6570\u636e\u91cc\u9762\u7684\u5b57\u7b26\u4f1a\u539f\u5c01\u4e0d\u52a8\u7684\u8f93\u51fa\u5230 item.name \u91cc\u9762\uff0c\u663e\u793a\u975e\u5e38\u4e0d\u4f18\u96c5\uff0c\u800c\u4e14\u53ef\u4ee5\u4f1a\u5f15\u5165\u4e00\u4e9b\u610f\u60f3\u4e0d\u5230\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u611f\u53d7\u4e00\u4e0b\uff1a \u53c2\u6570\uff1a data = [\n\"\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\", \"qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678\",\n]\n \u73b0\u8c61\u662f\u8fd9\u6837\u8272\u513f\u7684\uff1a test_smb_049.py::TestFileManager::test_smb_049[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09]\ntest_smb_049.py::TestFileManager::test_smb_049[qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui]\ntest_smb_049.py::TestFileManager::test_smb_049[12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678]\n \u8bf4\u5b9e\u8bdd\uff0c\u770b\u7740\u5fc3\u91cc\u5835\u5f97\u614c\uff0c\u5982\u679c\u8fd9\u91cc\u9762\u5305\u542b\u4e00\u4e9b\u7279\u6b8a\u5b57\u7b26\u6216\u8005\u662f\u8d85\u957f\uff0c\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u5f88\u5947\u5999\u7684\u4e8b\u60c5\u53d1\u751f\u3002 parametrize \u91cc\u9762\u6709\u4e2a\u53c2\u6570\uff1aids\uff0c\u53ef\u4ee5\u89e3\u51b3\u6b64\u7c7b\u95ee\u9898\uff0c\u5c31\u50cf\u8fd9\u6837\uff1a @pytest.mark.parametrize(\"value\", data, ids=[1, 2, 3])\ndef test_smb_049(self, value):\n \u518d\u6765\u611f\u53d7\u4e00\u4e0b\uff1a test_smb_049.py::TestFileManager::test_smb_049[1]\ntest_smb_049.py::TestFileManager::test_smb_049[2]\ntest_smb_049.py::TestFileManager::test_smb_049[3]\n \u660e\u663e\u597d\u591a\u4e86\uff0c\u6240\u4ee5\u5c3d\u91cf\u4f7f\u7528 ids \u8fd9\u4e2a\u53c2\u6570\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 fixture \u7684\u6570\u636e\u9a71\u52a8\u65b9\u5f0f\uff0c\u6846\u67b6\u867d\u7136\u652f\u6301\uff0c\u4f46\u53ef\u8bfb\u6027\u6bd4\u8f83\u5dee\uff1b\u5982\u679c\u4f60\u4e0d\u77e5\u9053\u8fd9\u53e5\u8bdd\u5728\u8bf4\u5565\uff0c\u90a3\u4f60\u53ef\u4ee5\u5ffd\u7565\uff0c\u6211\u4e5f\u4e0d\u6253\u7b97\u8be6\u7ec6\u8bf4\u8fd9\u79cd\u5b9e\u73b0\u65b9\u5f0f\uff0c\u64cd\u4f5c\u6bd4\u8f83\u9a9a\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4","title":"4. \u65ad\u8a00\u8d44\u6e90","text":" \u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u76f4\u63a5\u653e\u5728\u7528\u4f8b\u6a21\u5757\u7684\u540c\u7ea7\u76ee\u5f55\u4e0b\u7684 assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0 + \u7528\u4f8b ID \u547d\u540d\uff1b \u56fe\u50cf\u8bc6\u522b\u65ad\u8a00\uff0c\u4e0d\u8981\u622a\u53d6\u4e00\u5f20\u5f88\u5927\u7684\u56fe\uff0c\u56fe\u7247\u8d44\u6e90\u5305\u542b\u7684\u5143\u7d20\u592a\u591a\u4e86\uff0c\u975e\u5e38\u5bb9\u6613\u53d7\u5230\u9700\u6c42\u5f71\u54cd\uff0c\u5efa\u8bae\u662f\u8fdb\u884c\u5c40\u90e8\u7684\u65ad\u8a00\uff1b \u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u5339\u914d\u5ea6\u662f 0.9\uff0c\u5982\u679c\u65ad\u8a00\u7684\u573a\u666f\u5bf9\u4e8e\u7cbe\u786e\u5ea6\u8981\u6c42\u6ca1\u90a3\u4e48\u9ad8\uff0c\u53ef\u4ee5\u5728\u65ad\u8a00\u8bed\u53e5\u91cc\u9762\u4f20\u5165\u5c0f\u4e8e 0.9 \u7684\u53c2\u6570\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5","title":"5. \u5143\u7d20\u5b9a\u4f4d","text":" \u7528\u4e8e\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u4e2d\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u547d\u540d\u4e3a\u8be5\u5143\u7d20\u7684\u540d\u79f0\uff1b \u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u622a\u53d6\u65f6\u5c3d\u91cf\u7cbe\u786e\u5230\u8fd9\u4e2a\u5177\u4f53\u7684\u6309\u94ae\uff0c\u56fe\u7247\u4e5f\u4e0d\u8981\u592a\u5927\uff1b \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u64cd\u4f5c\u8f83\u5feb\uff0c\u5408\u7406\u52a0\u5165\u7b49\u5f85\u65f6\u95f4\u80fd\u63d0\u9ad8\u7528\u4f8b\u7684\u7a33\u5b9a\u6027\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6","title":"6. \u7528\u4f8b\u8d44\u6e90","text":" \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u4f7f\u7528\u5230\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u6bd4\u5982\u97f3\u4e50\u53ef\u80fd\u9700\u8981\u4e00\u4e9b mp3 \u7684\u8d44\u6e90\u7528\u4e8e\u6d4b\u8bd5\uff0c\u5b58\u653e\u5728 widget/case_res \u76ee\u5f55\u4e0b\uff0c\u524d\u63d0\u662f\u8fd9\u4e9b\u8d44\u6e90\u4e0d\u8d85\u8fc7 10M\uff1b \u5982\u679c\u662f\u4e00\u4e9b\u6bd4\u8f83\u5927\u7684\u8d44\u6e90\uff0c\u5efa\u8bae\u653e\u5230\u7edf\u4e00\u7684 ftp \u670d\u52a1\u5668 \uff08ftp://10.8.10.245\uff09\uff0c\u9700\u8981\u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\u518d\u4e0b\u8f7d\u4e0b\u6765\uff1b f\"wget ftp://{Config.FTP_IP}/uploads/\u591a\u5a92\u4f53/\u5f71\u9662/auto/{file_name};unzip {file_name};rm -rf {file_name};\"\n \u6d4b\u8bd5\u8d44\u6e90\u4e0b\u8f7d\u5230\u5e94\u7528 widget/case_res \u76ee\u5f55\u4e0b\uff1b \u7981\u6b62\u5c06\u6d4b\u8bd5\u8d44\u6e90\u5b58\u653e\u5728\u4e2a\u4eba\u7684\u673a\u5668\u4e0a\uff1b \u5e94\u8be5\u5c3d\u91cf\u4fdd\u8bc1\uff0c\u4e00\u4e2a\u8d44\u6e90\u5728\u4e00\u6b21\u7528\u4f8b\u6267\u884c\u4e2d\u53ea\u9700\u8981\u4e0b\u8f7d\u4e00\u6b21\uff0c\u6240\u4ee5\u4f60\u4e0d\u80fd\u6bcf\u6b21\u4f7f\u7528\u7684\u65f6\u5019\u90fd\u53bb\u4e0b\u8f7d\uff0c\u8fd9\u6837\u53ef\u80fd\u4f1a\u8017\u8d39\u5927\u91cf\u7684\u7f51\u7edc\u8d44\u6e90\uff0c\u800c\u56e0\u4e3a\u5148\u5224\u65ad\u672c\u5730\u662f\u5426\u5b58\u5728\u6b64\u8d44\u6e90\uff0c\u5982\u679c\u4e0d\u5b58\u5728\u518d\u53bb\u4e0b\u8f7d\uff1b \u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u5c06\u8d44\u6e90\u62f7\u8d1d\u5230\u5bf9\u5e94\u7684\u6d4b\u8bd5\u76ee\u5f55\u4e0b\uff0c\u6bd4\u5982\u5c06 mp3 \u6587\u4ef6\u62f7\u8d1d\u5230 ~/Music \u76ee\u5f55\u4e0b\uff0c\u4f46\u662f\u6211\u4eec\u66f4\u5efa\u8bae\u4f60\u4f7f\u7528\u53d1\u9001\u5feb\u6377\u94fe\u63a5\u7684\u65b9\u5f0f\u66ff\u4ee3\u62f7\u8d1d\u7684\u64cd\u4f5c\uff0c\u56e0\u4e3a\u5728\u62f7\u8d1d\u5927\u6587\u4ef6\u65f6\u662f\u5f88\u6d88\u8017\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u800c\u521b\u5efa\u94fe\u63a5\u5219\u4e0d\u4f1a\uff1b @classmethod\ndef recovery_many_movies_in_movie_by_cmd(cls):\n\"\"\"\u6062\u590d\u591a\u4e2a\u89c6\u9891\u6587\u4ef6\u81f3\u89c6\u9891\u76ee\u5f55\u4e2d\"\"\"\nwork_path = f\"/home/{Config.USERNAME}/Videos/auto\"\ncode_path = f\"{Config.CASE_RES_PATH}/auto\"\ncls.run_cmd(f\"rm -rf {work_path};mkdir {work_path}\")\nsleep(1)\nflag = False\nif not exists(code_path):\ncls.run_cmd(f\"mkdir -p {code_path}\")\nflag = True\nlogger.info(f\"ln -s {code_path}/* {work_path}/\")\ncls.run_cmd(\nf\"cd {code_path}/;\"\nf\"{cls.wget_file('auto.zip') if flag else ''}\"\nf\"ln -s {code_path}/* {work_path}/ > /dev/null 2>&1\"\n)\n \u8d44\u6e90\u4e0b\u8f7d\u8fc7\u7a0b\u4e2d\u6ce8\u610f\u8d85\u65f6\u7684\u95ee\u9898\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u5f88\u5927\uff0c\u8981\u7279\u522b\u6ce8\u610f\u8fd9\u95ee\u9898\uff0c\u5982\u679c\u4f60\u4f7f\u7528\u5f3a\u5236\u7b49\u5f85\u4e0b\u8f7d\u7ed3\u675f( os.system )\uff0c\u53ef\u80fd\u4f1a\u9020\u6210\u7528\u4f8b\u6267\u884c\u65f6\u957f\u53d8\u5f97\u4e0d\u53ef\u63a5\u53d7\uff0c\u76ee\u524d\u6211\u4eec\u53d1\u73b0\u5728\u6301\u7eed\u96c6\u6210\u73af\u5883\u6267\u884c\u65f6\u7f51\u7edc\u4e0b\u8f7d\u901f\u5ea6\u5f88\u6162\uff0c\u6240\u4ee5\u8d85\u65f6\u673a\u5236\u662f\u5f88\u6709\u5fc5\u8981\u7684\uff1brun_cmd \u65b9\u6cd5\u6709\u4e00\u4e2a\u9ed8\u8ba4\u8d85\u65f6\u7684\u65f6\u95f4\uff0c\u4f60\u53ef\u4ee5\u6839\u636e\u8d44\u6e90\u5927\u5c0f\u5bf9\u8d85\u65f6\u65f6\u95f4\u8fdb\u884c\u8c03\u6574\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_5","title":"\u516d\u3001\u7528\u4f8b\u8c03\u8bd5\u6280\u5de7","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_4","title":"1. \u65e5\u5fd7","text":" \u4e00\u5b9a\u8981\u5148\u770b\u62a5\u9519\uff0c\u770b error \u65e5\u5fd7\uff0c\u901a\u5e38\u80fd\u660e\u786e\u7684\u544a\u8bc9\u4f60\u5177\u4f53\u54ea\u91cc\u4ee3\u7801\u62a5\u9519\uff1b \u7ed3\u5408\u62a5\u9519\u70b9\u524d\u9762\u7684error\u3001 info \u548c debug \u65e5\u5fd7\u770b\u5426\u662f\u6b63\u5e38\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_4","title":"2. \u65ad\u70b9\u8c03\u8bd5","text":" \u65b9\u6cd5\u62a5\u9519\uff1a \u5728\u65b9\u6cd5\u5e93\u4e2d\u627e\u5230\u5bf9\u5e94\u7684\u65b9\u6cd5\uff0c\u5355\u72ec\u8c03\u7528\uff0c\u770b\u662f\u5426\u80fd\u6b63\u5e38\u6267\u884c\uff1b \u901a\u5e38\u5355\u4e2a\u65b9\u6cd5\u7684\u6267\u884c\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u62a5\u9519\uff0c\u5f88\u5feb\u5c31\u80fd\u6392\u67e5\u51fa\u95ee\u9898\uff1b\u5728\u65b9\u6cd5\u5185\u90e8\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u65b9\u6cd5\u5185\u90e8\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u8c03\u7528\u6ca1\u95ee\u9898\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u62a5\u9519\u7684\u65b9\u6cd5\u524d\u9762\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u7528\u4f8b\u7684\u4e1a\u52a1\u903b\u8f91\u548c\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u65ad\u8a00\u62a5\u9519\uff1a \u65ad\u8a00\u4e3a\u6570\u636e\u65ad\u8a00\uff0c\u6839\u636e\u8868\u8fbe\u5f0f\u8fdb\u884c\u65ad\u8a00\u8bed\u53e5\u8fdb\u884c\u4fee\u6539\uff1b \u6587\u4ef6\u751f\u6210\u7c7b\u65ad\u8a00\uff0c\u67e5\u770b\u662f\u5426\u9700\u8981\u52a0\u7b49\u5f85\u65f6\u95f4\uff1b \u56fe\u50cf\u65ad\u8a00\uff0c\u5728\u65ad\u8a00\u8bed\u53e5\u5904\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u7528\u4f8b\u8fd0\u884c\u5230\u65ad\u8a00\u5904\u4f1a\u505c\u6b62\uff0c\u67e5\u770b\u6b64\u65f6\u65ad\u8a00\u7684\u56fe\u7247\u4e0e\u7528\u4f8b\u6267\u884c\u7684\u73b0\u573a\u5b58\u5728\u4ec0\u4e48\u5dee\u5f02\uff0c\u6b64\u65f6\u4e5f\u53ef\u4ee5\u8fdb\u884c\u91cd\u65b0\u622a\u56fe\uff0c\u4ece\u800c\u66ff\u6362\u65b0\u7684\u56fe\u7247\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3_1","title":"3. \u8fdc\u7a0b\u6267\u884c","text":" \u8fdc\u7a0b\u6267\u884c\u6307\u7684\u662f\u7f16\u8f91\u5668\u901a\u8fc7\u6307\u5b9a\u8fdc\u7a0b\u89e3\u91ca\u5668\u6267\u884c\u81ea\u52a8\u5316\u4ee3\u7801\uff1b \u8fdc\u7a0b\u6267\u884c\u7684\u597d\u5904\u662f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u7684 Debug \u8fd0\u884c\uff0c\u4e0d\u7528\u5728\u6d4b\u8bd5\u673a\u4e0a\u6253\u5f00\u7f16\u8f91\u5668\uff0c\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u66f4\u5feb\uff1b \u652f\u6301\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u7684\u7f16\u8f91\u5668\uff1a \u4e13\u4e1a\u7248 Pycharm VScode \uff0c\u9700\u8981\u4f7f\u7528\u63d2\u4ef6 Remote-SSH \u8fdc\u7a0b\u6267\u884c\u914d\u7f6e \u4ee5 Pycharm \u4e3a\u4f8b\uff1a File \u2014> Settings \u2014> Project \u2014> Python Interpreter \u2014> \u53f3\u8fb9\u8bbe\u7f6e\u6309\u94ae \u2014> Add... \u2014> SSH Interpreter \u2014> New server configuration(\u586b\u5165host\u548cusername) \u2014> Next \u2014> password\uff08\u6d4b\u8bd5\u673a\u5bc6\u7801\uff09 \u2014> Interpreter(\u9009\u62e9\u8fdc\u7a0b\u89e3\u91ca\u5668) \u2014> Finish "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4_1","title":"4. \u73af\u5883\u6e05\u7406","text":" \u5982\u679c\u7528\u4f8b\u91cc\u9762\u7684 teardown \u6ca1\u6709\u6267\u884c\uff0c\u5927\u6982\u7387\u662f\u56e0\u4e3a setup \u91cc\u9762\u4ee3\u7801\u62a5\u9519\uff0c\u8fd9\u4e24\u4e2a\u662f\u4e00\u5bf9\u7684\uff0csetup \u91cc\u9762\u62a5\u9519\uff0cteardown \u91cc\u9762\u7684\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\uff1b \u76ee\u524d\u6211\u4eec\u5df2\u7ecf\u5c06\u5404\u5e94\u7528\u7684 clean_all \u8fd9\u4e2a fixture \u6539\u6210\u4e86\u7ec8\u7ed3\u5668\uff0c\u786e\u4fdd\u59cb\u7ec8\u80fd\u6267\u884c\u5230\u8fd9\u6b65\uff0c\u4f46\u662f\u7528\u4f8b\u91cc\u9762\u7684 fixture\uff0c\u8fd8\u662f\u9700\u8981\u6211\u4eec\u5c0f\u5fc3\u5904\u7406\uff1b \u8981\u6267\u884c clean_all \u9700\u8981\u5728\u7f16\u8f91\u5668\u8fd0\u884c\u53c2\u6570\u52a0 --clean yes\uff0c\u5199\u7528\u4f8b\u7684\u65f6\u5019\u8bf7\u52a0\u4e0a\uff0c\u4e0d\u7136\u4f60\u4e0d\u786e\u5b9a\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u7684\u73af\u5883\u662f\u5426\u6062\u590d\uff1b setup \u53ef\u4ee5\u4e0d\u8981\uff0c\u5c06 setup \u653e\u5230\u7528\u4f8b\u91cc\u9762\u662f\u4e00\u79cd\u7a33\u59a5\u7684\u505a\u6cd5\uff0cteardown \u4e00\u5b9a\u8981\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5_1","title":"5. \u5143\u7d20\u5b9a\u4f4d\u4e0d\u51c6\uff08\u5750\u6807\u8fd4\u56de\u4e0d\u5bf9\uff09","text":" \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u53ef\u80fd\u53d7\u5230\u7a97\u53e3 ID \u7684\u53d8\u5316\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u9ed8\u8ba4\u53d6\u6700\u65b0\u7684\u4e00\u4e2a\u7a97\u53e3\u7528\u4e8e\u5b9a\u4f4d\uff0c\u4f46\u5982\u679c\u5b9e\u9645\u9700\u8981\u5b9a\u4f4d\u7684\u4e0d\u662f\u6700\u65b0\u7684\u7a97\u53e3\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u91cd\u65b0\u5b9e\u4f8b\u5316\u65b9\u6cd5\u7c7b\u5bf9\u8c61\uff0c\u5e76\u5728\u7c7b\u4e2d\u4f20\u5165\u5bf9\u5e94\u7684\u7a97\u53e3\u5e8f\u53f7\uff1b \u57fa\u4e8e\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u76ee\u524d\u9047\u5230\u7684\u7b14\u8bb0\u672c\u4e0a\uff0c\u7531\u4e8e\u5c4f\u5e55\u7f29\u653e\u6bd4\u4f8b\u4e3a 1.25\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u6211\u4eec\u9ed8\u8ba4\u4f7f\u7528\u7f29\u653e\u6bd4\u4f8b\u4e3a 1\uff1b \u57fa\u4e8e\u56fe\u50cf\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u76ee\u6807\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b \u57fa\u4e8e OCR \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u6587\u5b57\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u540c\u6837\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6_1","title":"6. \u952e\u9f20\u64cd\u4f5c\u4e0d\u51c6","text":" \u9f20\u6807\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6bd4\u5982\u53f3\u952e\u3001\u53cc\u51fb\u65e0\u54cd\u5e94\uff1b \u952e\u76d8\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6216\u8005\u5ef6\u8fdf\u8f93\u5165\uff0c\u6bd4\u5982\u7528\u4f8b\u9700\u8981\u8f93\u5165\u201c\u6211\u662f\u4e2d\u56fd\u4eba\u201d\uff0c\u5b9e\u9645\u53ea\u8f93\u5165\u4e86\u201c\u6211\u56fd\u4eba\u201d\uff1b \u4ee5\u4e0a\u95ee\u9898\u6392\u9664\u5e94\u7528\u5361\u987f\u7b49\u95ee\u9898\uff0c\u5927\u6982\u7387\u662f\u7531\u4e8e\u5de5\u5177\u7684\u95ee\u9898\uff0c\u76ee\u524d\u952e\u9f20\u64cd\u4f5c\u6211\u4eec\u4f7f\u7528\u4e09\u4e2a\u5de5\u5177\uff1aDogtail \u63d0\u4f9b\u7684\u952e\u9f20\u5de5\u5177\u3001PyAutoGUI\u3001Xdotool \uff1b \u6709\u540c\u5b66\u53ef\u80fd\u8981\u8bf4\u4e3a\u5565\u8981\u7528\u4e09\u4e2a\u554a\uff0c\u7528\u4e00\u4e2a\u4e0d\u5c31\u597d\u4e86\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u5404\u6709\u4f18\u70b9\u5404\u6709\u7f3a\u70b9\u3002 \u5982\u679c\u4f60\u9047\u5230\u952e\u9f20\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u8bd5\u8bd5\u901a\u8fc7\u4e0d\u540c\u7684\u5de5\u5177\u64cd\u4f5c\uff1b\u952e\u76d8\u8f93\u5165\u5ef6\u8fdf\u7684\u95ee\u9898\uff0c\u4e00\u822c\u662f\u56e0\u4e3a\u8f93\u5165\u901f\u5ea6\u592a\u5feb\u4e86\uff0c\u7cfb\u7edf\u6ca1\u53cd\u5e94\u8fc7\u6765\uff0c\u5e38\u89c1\u4e8e ARM \u548c MIPS \u4e0a\uff0c\u4fee\u6539\u53c2\u6570 delay_time \u7684\u503c\uff0c\u5355\u4f4d\u4e3a\u6beb\u79d2\uff1b # mouse_key.py\n@classmethod\ndef input_message(cls, message, delay_time=300, interval=0.2):\n\"\"\"\n \u8f93\u5165\u5b57\u7b26\u4e32\n :param message: \u8f93\u5165\u7684\u5185\u5bb9\n :param delay_time: \u5ef6\u8fdf\u65f6\u95f4\n :param interval:\n :return:\n \"\"\"\n \u5982\u679c\u4e0d\u662f\u65b9\u6cd5\u7684\u95ee\u9898\uff0c\u5219\u9700\u8981\u7ee7\u7eed\u548c\u5f00\u53d1\u4e00\u8d77\u6392\u9664\uff0c\u662f\u5426\u4e3a\u5e94\u7528\u63a5\u53d7\u952e\u9f20\u4fe1\u53f7\u5904\u7406\u7684\u95ee\u9898\uff0c\u8fd9\u7c7b\u60c5\u51b5\u6211\u4eec\u4e5f\u662f\u9047\u5230\u8fc7\u7684\uff0c\u5177\u4f53\u95ee\u9898\u5177\u4f53\u5206\u6790\u3002 \u6bd4\u5982\u5f71\u9662\u5c31\u91cd\u5199\u4e86\u4e00\u4e2a\u53f3\u952e\u7684\u65b9\u6cd5\uff1a # base_widget.py\n@classmethod\ndef right_click(cls, _x=None, _y=None):\n\"\"\"\n \u91cd\u5199\u5e95\u5c42\u5355\u51fb\u9f20\u6807\u53f3\u952e\n \u89e3\u51b3\u5f71\u9662\u53f3\u952e\u89e6\u53d1release\u4e8b\u4ef6\u7684\u95ee\u9898\uff08\u53f3\u952e\u4e3b\u7a97\u53e3\u4f1a\u64ad\u653e\u89c6\u9891\uff09\n \"\"\"\ncls.mouse_down(_x, _y, button=3)\nsleep(0.1)\ncls.mouse_up(button=3)\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_6","title":"\u4e03\u3001\u5176\u4ed6\u4e0d\u4e3a\u4eba\u77e5\u7684\u7ec6\u8282","text":" \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u5c3d\u91cf\u7f16\u5199\u540c\u4e00\u4e2a\u5e94\u7528\u6216\u6a21\u5757\u7684\u7528\u4f8b\uff0c\u80fd\u5bf9\u8be5\u7528\u4f8b\u5df2\u6709\u65b9\u6cd5\u719f\u6089\uff0c\u907f\u514d\u8fc7\u591a\u91cd\u590d\u4e1a\u52a1\u4ee3\u7801\u7684\u5c01\u88c5\uff1b \u76f8\u540c\u7684\u573a\u666f\u4e0b\uff0c\u5404\u67b6\u6784\u7b49\u5f85\u65f6\u95f4\u4e0d\u540c\uff0c\u5efa\u8bae\u4f7f\u7528\u6846\u67b6\u63d0\u4f9b\u7684 sleep\uff0c\u6211\u4eec\u505a\u4e86\u4e0d\u540c\u67b6\u6784\u7684\u500d\u6570\u653e\u5927\uff1b \u7f16\u5199\u7528\u4f8b\u65f6\uff0c\u5c3d\u91cf\u8003\u8651\u5230\u6bcf\u4e00\u6b65\u5f02\u5e38\u540e\u7684\u73af\u5883\u6062\u590d\uff0c\u9700\u8981\u5efa\u8bae\u8fd9\u79cd\u610f\u8bc6\uff0c\u968f\u65f6\u8981\u8003\u8651\u5230\uff0c\u8fd9\u6b65\u64cd\u4f5c\u6709\u6ca1\u6709\u53ef\u80fd\u51fa\u9519\uff0c\u51fa\u9519\u4e86\u6539\u600e\u4e48\u529e\uff1b \u63d0\u4ea4\u4ee3\u7801\u7684\u65f6\u5019\u6ce8\u610f\u4e0d\u8981\u628a\u4e00\u4e9b\u4e34\u65f6\u7684\u6d4b\u8bd5\u8d44\u6e90\u63d0\u4ea4\u8fdb\u53bb\u4e86\uff0c\u6bd4\u5982\u6d4b\u8bd5\u4e86\u4e00\u4e2a\u5f71\u7247\uff0c\u6709\u4e9b\u540c\u5b66\u4e60\u60ef\u4f7f\u7528 git add . \uff0c\u7136\u540e\u5c31\u5168\u90e8\u63d0\u4ea4\u5230\u4ee3\u7801\u4ed3\u5e93\u4e86\uff0c\u8fd9\u6837\u5373\u4f7f\u540e\u671f\u628a\u5927\u6587\u4ef6\u5220\u4e86\uff0c.git \u6587\u4ef6\u91cc\u9762\u4e5f\u4f1a\u5f88\u5927\uff0c\u9020\u6210\u4ee3\u7801\u4ed3\u5e93\u53d8\u5f97\u5341\u5206\u81c3\u80bf\u3002 \u66f4\u591a\u7ec6\u8282\u67e5\u770b\uff1a\u300aAT\u7ecf\u9a8c\u603b\u7ed3\u300b"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/","title":"AT \u6267\u884c\u5668\u4f7f\u7528\u6307\u5317","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/5/25\n# Author : litao\n# =============================================\n Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1","title":"1\u3001\u529f\u80fd\u4ecb\u7ecd","text":" \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7cfb\u7edf\u8bed\u8a00\u8bbe\u7f6e\uff0c\u5206\u8fa8\u7387\u8bbe\u7f6e\u53ca\u7528\u4f8b\u6267\u884c\u73af\u5883\u642d\u5efa\uff1b \u652f\u6301 IP \u4e3a 15 \u7f51\u6bb5\u7684 AMD \u67b6\u6784\u6d4b\u8bd5\u673a\u955c\u50cf\u88c5\u673a\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u6307\u5b9a\u5e94\u7528\uff0c\u6307\u5b9a\u8303\u56f4\u6807\u7b7e\u7684\u7528\u4f8b\u6267\u884c\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u72b6\u6001\u68c0\u67e5\uff0c\u662f\u5426\u6709\u6b63\u5728\u8fd0\u884c\u7684\u6d4b\u8bd5\uff1b \u652f\u6301\u914d\u7f6e\u7528\u4f8b\u6267\u884c\u65f6\u957f\uff0c\u9632\u6b62\u4efb\u52a1\u963b\u585e\uff1b \u652f\u6301\u6839\u636e\u5e94\u7528\u7248\u672c\u81ea\u52a8\u67e5\u627e\u5bf9\u5e94\u7684\u7528\u4f8b tag\uff1b \u652f\u6301\u5f02\u5e38\u5904\u7406\u548c\u6d4b\u8bd5\u5b8c\u6210\u7684\u5b9e\u65f6\u6d88\u606f\u901a\u77e5\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2job","title":"2\u3001Job \u4ecb\u7ecd","text":"\u4ee5\u4e0b\u6309\u6267\u884c\u6d41\u7a0b\u7684\u987a\u5e8f\u4ecb\u7ecd\uff0c\u6bcf\u4e00\u6b65\u90fd\u53ef\u4ee5\u5355\u72ec\u6267\u884c\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1_1","title":"1\u3001\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/AT_test/ \u6574\u4e2a\u6d41\u7a0b\u7684\u4e3b\u5165\u53e3\uff0c\u901a\u8fc7\u8fd9\u4e2a\u5165\u53e3\uff0c\u8fde\u540c\u6574\u4e2a\u6d4b\u8bd5\u6d41\u7a0b\uff0c\u955c\u50cf\u88c5\u673a\uff0c\u73af\u5883\u90e8\u7f72\uff0c\u6d4b\u8bd5\u5e94\u7528\u53ca\u751f\u6210\u62a5\u544a\u3002 \u53c2\u6570\u4ecb\u7ecd\uff1a \u6d4b\u8bd5\u673a\uff1a\u6240\u6709\u89c4\u6574\u5230\u56fa\u5b9a\u533a\u57df\u7684\u6d4b\u8bd5\u673a\uff0c\u901a\u8fc7\u6d4b\u8bd5\u540c\u5b66\u5bf9\u6d4b\u8bd5\u673a\u7684\u4e60\u60ef\u547d\u540d\uff0c\u5728\u540e\u53f0\u6620\u5c04\u6d4b\u8bd5\u673a\u7684\u8be6\u7ec6\u4fe1\u606f\uff0c\u62ec\u53f7\u4e2d\u4e3a\u6d4b\u8bd5\u673a IP \u7684\u6700\u540e\u4e00\u4f4d\uff1b \u6d4b\u8bd5\u5e94\u7528\uff1a\u6307\u5b9a\u7684\u6d4b\u8bd5\u5e94\u7528\u7684\u5305\u540d\uff0c\u7cfb\u7edf\u6839\u636e\u540d\u79f0\u81ea\u52a8\u62c9\u53d6\u5bf9\u5e94\u7684\u4ed3\u5e93\u4ee3\u7801\uff1b deb\u5305\u4e0b\u8f7d\u5730\u5740\uff1a\u6d4b\u8bd5\u4e0a\u8ff0\u5e94\u7528\u65f6\uff0c\u9700\u8981\u5b89\u88c5\u7684deb\u5305\u4e0b\u8f7d\u5730\u5740\uff0c\u591a\u4e2a\u5730\u5740\u7528\u201c,\u201d\u9694\u5f00\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff1b \u8303\u56f4\u6807\u7b7e\uff1a\u6267\u884c\u6d4b\u8bd5\u7528\u4f8b\u7684\u6807\u7b7e\u8303\u56f4\uff0c\u5bf9\u5e94\u7528\u4f8b\u4ee3\u7801 csv \u6587\u4ef6\u4e2d\u7684\u6807\u7b7e\u4fe1\u606f\uff0c\u4ee5 pytest \u7684mark\u8bed\u6cd5\u7f16\u5199\uff1b \u7cfb\u7edf\u8bed\u8a00\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u8bed\u8a00\u73af\u5883\uff1b \u5206\u8fa8\u7387\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u5206\u8fa8\u7387\u73af\u5883\uff1b \u955c\u50cf\u5730\u5740\uff1a\u955c\u50cf\u4ed3\u5e93\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u901a\u8fc7 PXE \u88c5\u673a\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u88c5\u673a\u73af\u8282\uff08\u76ee\u524d\u4ec5\u652f\u6301\u90e8\u5206 AMD \u67b6\u6784\u7684\u88c5\u673a\uff09\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2pxe","title":"2\u3001PXE \u88c5\u673a","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/IOS_install/ \u8f93\u5165\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\uff0cIP\uff0c\u5bc6\u7801\uff0c\u955c\u50cf\u5730\u5740\u540e\uff0c\u81ea\u52a8\u88c5\u673a\uff0c\u76ee\u524d\u4ec5\u652f\u6301\u56fa\u5b9a 15 \u7f51\u6bb5\u7684\u90e8\u5206 AMD \u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#3","title":"3\u3001\u6b21\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/all_client_test/ \u8be5\u5165\u53e3\u4e0e\u4e3b\u5165\u53e3\u529f\u80fd\u57fa\u672c\u4e00\u81f4\uff0c\u53ea\u662f\u5265\u79bb\u4e86PXE\u88c5\u673a\u6d41\u7a0b\uff0c\u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7684\u6267\u884c\u6d41\u7a0b\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#4","title":"4\u3001\u73af\u5883\u90e8\u7f72","text":"Jenkins url\uff1ahttps://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/env/build?delay=0sec \u8bbe\u7f6e\u6d4b\u8bd5\u673a\u7684\u7cfb\u7edf\u8bed\u8a00\uff0c\u5206\u8fa8\u7387\u53ca\u5b89\u88c5\u6d4b\u8bd5\u6240\u9700\u7684\u4f9d\u8d56\u5305\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#5","title":"5\u3001\u53d1\u9001\u4ee3\u7801","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/send_code/ \u6839\u636e\u6d4b\u8bd5\u5e94\u7528\u540d\u79f0\uff0c\u62c9\u53d6\u5bf9\u5e94\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u5e76\u6839\u636e\u6d4b\u8bd5\u673a\u4e0a\u5e94\u7528\u7248\u672c\u5207\u6362\u5230\u5bf9\u5e94\u7684tag\u7248\u672c\uff0c\u82e5\u672a\u627e\u5230tag\u7248\u672c\uff0c\u5219\u4f7f\u7528\u6700\u65b0\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u518d\u6839\u636e\u5e94\u7528\u5e93\u4ee3\u7801\u4e2d\u914d\u7f6e\u7684\u57fa\u7840\u5e93\u7248\u672c\uff0c\u62c9\u53d6\u57fa\u7840\u5e93\u4ee3\u7801\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#6","title":"6\u3001\u7528\u4f8b\u6267\u884c","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/run_test/ \u8fd0\u884c\u6d4b\u8bd5\u673a\u4e0a\u7684\u7528\u4f8b"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/","title":"AT \u7528\u4f8b\u7b5b\u9009\u6307\u5317","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u7528\u4f8b\u7b5b\u9009\u6807\u51c6\uff0c\u662f\u6311\u9009\u5408\u9002\u7684\u6587\u672c\u7528\u4f8b\u8fdb\u884c\u81ea\u52a8\u5316\u7528\u4f8b\u8f6c\u5316\u7684\u4e00\u4e9b\u901a\u7528\u6807\u51c6\u3002 \u8fc7\u53bb\u6211\u4eec\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u5b9e\u8df5\u8fc7\u7a0b\u4e2d\uff0c\u5199\u4e86\u4e0d\u5c11\u81ea\u52a8\u5316\u7528\u4f8b\uff0c\u968f\u7740\u9700\u6c42\u7684\u8fed\u4ee3\uff0c\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u81ea\u7136\u8150\u5316\uff0c\u56e0\u800c\u9700\u8981\u5728\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\u5bf9\u81ea\u52a8\u5316\u7528\u4f8b\u8fdb\u884c\u7ef4\u62a4\uff0c\u5728\u7ef4\u62a4\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u6211\u4eec\u53d1\u73b0\uff0c\u6709\u4e9b\u7528\u4f8b\u7ef4\u62a4\u8d77\u6765\u592a\u96be\u4e86\uff0c\u8c03\u8bd5\u7528\u4f8b\u8017\u8d39\u5927\u91cf\u65f6\u95f4\uff0c\u6210\u672c\u5f88\u9ad8\u3002 \u56e0\u6b64\uff0c\u6211\u4eec\u603b\u7ed3\u4e00\u4e9b\u81ea\u52a8\u5316\u7528\u4f8b\u9009\u578b\u7684\u6807\u51c6\uff0c\u4ee5\u4f18\u5316\u540e\u7eed\u81ea\u52a8\u5316\u7528\u4f8b\u7ed3\u6784\uff0c\u671f\u5f85\u6211\u4eec\u80fd\u7f16\u5199\u51fa\u9ad8\u6548\u3001\u7a33\u5b9a\u3001\u6613\u4e8e\u7ef4\u62a4\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_1","title":"\u4e00\u3001\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u53ef\u4ee5\u5206\u4e3a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u548c\u4e13\u9879\u81ea\u52a8\u5316\u6d4b\u8bd5\uff0c\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e00\u822c\u53ea\u9488\u5bf9\u4e00\u4e9b\u5e38\u89c4\u7684\u529f\u80fd\u6d4b\u8bd5\uff0c\u5176\u4ed6\u975e\u5e38\u89c4\u529f\u80fd\u7684\u7528\u4f8b\uff0c\u5e94\u8be5\u91c7\u7528\u4e13\u9879\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u6848\uff1b \u4ee5\u4e0b\u662f\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1","title":"1. \u7a33\u5b9a\u6027\u3001\u538b\u6d4b\u7528\u4f8b","text":"\u7a33\u5b9a\u6027\u6d4b\u8bd5\u3001\u538b\u6d4b\u7528\u4f8b\u5e94\u8be5\u662f\u5c5e\u4e8e\u6027\u80fd\u76f8\u5173\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u5982\uff1a\u53cd\u590d\u591a\u6b21\u70b9\u51fb\u6309\u94ae\uff0c\u68c0\u9a8c\u5176\u529f\u80fd\u7a33\u5b9a\u6027\u3002\u56e0\u4e3a\u8fd9\u4e9b\u7528\u4f8b\u65ad\u8a00\u7684\u9884\u671f\u53ef\u80fd\u4e0d\u662f\u5f88\u660e\u786e\uff0c\u66f4\u6709\u751a\u8005\u4e0d\u9700\u8981\u65ad\u8a00\uff0c\u7528\u4f8b\u65f6\u957f\u6bd4\u8f83\u957f\uff0c\u800c\u4e14\u4e0d\u53ef\u63a7\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u76ee\u524d\u6211\u4eec\u6709\u6027\u80fd\u81ea\u52a8\u5316\u7684\u4e13\u9879\u65b9\u6848\uff0c\u4ee5\u53ca\u4e00\u4e9b\u7a33\u5b9a\u6027\u6d4b\u8bd5\u7684\u4e13\u9879\u65b9\u6848\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u6b64\u7c7b\u7528\u4f8b\u653e\u5230\u4e13\u9879\u81ea\u52a8\u5316\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2","title":"2. \u6d89\u53ca\u591a\u4e2a\u7528\u6237\u64cd\u4f5c","text":"\u5e38\u89c1\u4e0e\u6587\u7ba1\u7684\u7528\u4f8b\u4e2d\uff0c\u591a\u7528\u6237\u64cd\u4f5c\u7684\u7528\u4f8b\u4e00\u822c\u90fd\u4f1a\u6d89\u53ca\u5230\u5728\u7cfb\u7edf\u4e2d\u8fdb\u884c\u591a\u4e2a\u7528\u6237\u95f4\u7684\u5207\u6362\uff0c\u81ea\u52a8\u5316\u811a\u672c\u4e00\u822c\u662f\u8fd0\u884c\u5728\u4e00\u4e2a\u7528\u6237\u7a7a\u95f4\u4e0b\u7684\uff0c\u6240\u4ee5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u591a\u7528\u6237\u95f4\u7684\u5207\u6362\u3002 \u6b64\u7c7b\u4e0d\u5efa\u8bae\u91c7\u7528\u81ea\u52a8\u5316\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3","title":"3. \u4e0e\u5f00\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4ea4\u4e92","text":"\u6b64\u7c7b\u573a\u666f\u591a\u4e3a\u5e94\u7528\u7684\u5f02\u5e38\u573a\u666f\u6d4b\u8bd5\uff0c\u6bd4\u5982\uff1a\u590d\u5236\u5927\u6587\u4ef6\u8fc7\u7a0b\u4e2d\u6ce8\u9500\u673a\u5668\u3002 \u81ea\u52a8\u5316\u811a\u672c\u5728\u7cfb\u7edf\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4e4b\u540e\u662f\u4f1a\u505c\u6b62\u8fd0\u884c\u7684\uff1b\u6b64\u7c7b\u7528\u4f8b\u53ef\u4ee5\u505a\u81ea\u52a8\u5316\uff0c\u4f46\u662f\u540c\u6837\u9700\u8981\u505a\u4e13\u9879\u65b9\u6848\uff0c\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u7684\u5904\u7406\u903b\u8f91\u5b8c\u5168\u4e0d\u540c\u3002 \u540e\u7eed\u81ea\u52a8\u5316\u9700\u8981\u516c\u5173\u7684\u70b9\uff1a \u81ea\u52a8\u5316\u811a\u672c\u5728\u672c\u673a\u8fd0\u884c\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u81f3\u5c11\u9700\u8981\u63d0\u4f9b\u4ee5\u4e0b\u529f\u80fd\uff1a \u91cd\u542f\u4e4b\u540e\u7528\u4f8b\u80fd\u81ea\u52a8\u8fd0\u884c\uff1b\u53ef\u4ee5\u8003\u8651\u5c06\u6267\u884c\u7528\u4f8b\u5199\u6210\u4e00\u4e2a\u5f00\u673a\u81ea\u542f\u7684\u670d\u52a1\uff1b \u80fd\u8bb0\u5f55\u5173\u673a\u4e4b\u524d\u7528\u4f8b\u6267\u884c\u7684\u4f4d\u7f6e\uff0c\u91cd\u542f\u4e4b\u540e\u80fd\u4ece\u6b64\u4f4d\u7f6e\u5f00\u59cb\u6267\u884c\uff1b \u50cf\u6027\u80fd\u81ea\u52a8\u5316\u4e00\u6837\uff0c\u7531\u670d\u52a1\u7aef\u63a7\u5236\uff1b \u5b8c\u5168\u57fa\u4e8e\u56fe\u5f62\u8bc6\u522b\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u4e32\u53e3\u7ebf\u63a7\u5236\u952e\u9f20\u7a33\u5b9a\u6027\uff1b "},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4","title":"4. \u6d4b\u8bd5\u6267\u884c\u65f6\u95f4\u957f","text":"\u7528\u4f8b\u6267\u884c\u65f6\u95f4\u63a7\u5236\u57282\u5206\u949f\u4ee5\u5185\uff0c\u6781\u7aef\u60c5\u51b5\u4e0d\u8981\u8d85\u8fc75\u5206\u949f\uff0c\u6240\u6709\u7528\u4f8b\u7684\u5e73\u5747\u65f6\u957f\u5e94\u8be5\u57281\u5206\u949f\u5de6\u53f3\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u95f4\u592a\u957f\uff0c\u7f16\u5199\u7528\u4f8b\u3001\u8c03\u8bd5\u7528\u4f8b\u3001\u6267\u884c\u7528\u4f8b\u3001\u7ef4\u62a4\u7528\u4f8b\u90fd\u975e\u5e38\u7684\u8017\u65f6\uff0c\u4eba\u529b\u6210\u672c\u65f6\u95f4\u6210\u672c\u6295\u5165\u592a\u9ad8\u3002 \u4f60\u60f3\uff0c\u8fd9\u6761\u7528\u4f8b\u6267\u884c\u9700\u89815\u5206\u949f\uff0c\u90a3\u4f60\u5199\u8fd9\u6761\u7528\u4f8b\u7684\u65f6\u95f4\u4e0d\u53ef\u80fd\u4e00\u904d\u8fc7\uff0c\u5199\u7684\u8fc7\u7a0b\u4e2d\u8dd1\u4e0d\u901a\u8fd8\u5f97\u91cd\u8dd1\u81f3\u5c1115\u5206\u949f\u4e0d\u8fc7\u5206\uff0c\u5199\u5b8c\u4e86\u8fd8\u5f97\u5728\u5176\u4ed6\u67b6\u6784\u4e0a\u8c03\u8bd5\uff0c\u534a\u4e2a\u5c0f\u65f6\u8fc7\u53bb\u4e86\uff0c\u8fd9\u8fd8\u53ea\u662f\u7b2c\u4e00\u6b21\u5199\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u540e\u7eed\u5982\u679c\u7528\u4f8b\u7ef4\u62a4\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u7ecf\u5e38\u6295\u5165\u76f8\u5f53\u957f\u65f6\u95f4\uff0c\u8fd9\u6837\u5176\u5b9e\u662f\u5931\u53bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u7684\u3002\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u5c31\u5e94\u8be5\u662f\u5feb\u51c6\u72e0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5","title":"5. \u8fb9\u7f18\u6027\u6d4b\u8bd5","text":"\u6709\u4e9b\u529f\u80fd\u6a21\u5757\u672c\u8eab\u662f\u5c5e\u4e8e\u6bd4\u8f83\u8fb9\u7f18\u6027\u7684\uff0c\u5373\u6781\u5c11\u7528\u6237\u4f1a\u4f7f\u7528\u5230\u7684\u529f\u80fd\uff0c\u8fd9\u7c7b\u529f\u80fd\u6a21\u5757\u4e0d\u9700\u8981\u5927\u89c4\u6a21\u5b9e\u73b0\u81ea\u52a8\u5316\uff0c\u4e00\u4e24\u4e2a\u573a\u666f\u8986\u76d6\u57fa\u672c\u529f\u80fd\u5c31\u884c\u4e86\uff0c\u56e0\u6b64\u6211\u4eec\u5728\u6311\u9009\u6b64\u7c7b\u7528\u4f8b\u7684\u65f6\u5019\u53ef\u4ee5\u7ed3\u5408\u6574\u4e2a\u529f\u80fd\u6a21\u5757\u7684\u8986\u76d6\u60c5\u51b5\u6765\u51b3\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6","title":"6. \u9700\u8981\u4f9d\u8d56\u4eba\u5de5\u4ecb\u5165\u7684","text":"\u81ea\u52a8\u5316\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\u662f\u6ca1\u6709\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bd4\u5982\u8981\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u90a3\u4e48\u5c31\u80cc\u79bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u3002 \u6bd4\u5982\u5149\u9a71\u6a21\u5757\uff0c\u5149\u9a71\u523b\u5f55\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u4f46\u662f\u5149\u9a71\u523b\u5f55\u4e4b\u540e\u5149\u76d8\u4f1a\u5f39\u51fa\u6765\uff0c\u9700\u8981\u4eba\u5de5\u66f4\u6362\u5149\u76d8\uff0c\u518d\u624b\u52a8\u63a8\u8fdb\u5149\u9a71\u4e2d\u3002 \u8fd9\u79cd\u529f\u80fd\u6a21\u5757\u5373\u4f7f\u505a\u81ea\u52a8\u5316\uff0c\u80fd\u6d89\u53ca\u5230\u7684\u529f\u80fd\u975e\u5e38\u6709\u9650\uff0c\u800c\u4e14\u4e0d\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u6240\u4ee5\u660e\u663e\u5c31\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7","title":"7. \u96be\u4ee5\u5b9e\u73b0\u7684","text":"\u7528\u4f8b\u6240\u6d89\u53ca\u5230\u7684\u65b9\u6cd5\u5b9e\u73b0\u8d77\u6765\u53ef\u80fd\u6709\u96be\u5ea6\uff0c\u751a\u81f3\u73b0\u9636\u6bb5\u65e0\u6cd5\u5b9e\u73b0\u7684\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002 \u6bd4\u5982\u5f71\u9662\u6d4b\u8bd5\u753b\u9762\u6e05\u6670\u5ea6\u3001\u6d41\u7545\u5ea6\u3001\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u4e4b\u540e\u7684\u89c6\u9891\u662f\u5426\u5b58\u5728\u5361\u987f\u7b49\u7528\u4f8b\uff0c\u73b0\u9636\u6bb5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#8","title":"8. \u529f\u80fd\u4e0d\u7a33\u5b9a","text":"\u8fd9\u4e2a\u4e0d\u662f\u8bf4\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\uff0c\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\u4e0d\u7a33\u5b9a\u662f\u6b63\u5e38\u7684\uff0c\u8fd9\u79cd\u6211\u4eec\u53ef\u4ee5\u7b49\u5f00\u53d1\u63d0\u6d4b\u4e4b\u540e\u518d\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u3002 \u529f\u80fd\u4e0d\u7a33\u5b9a\u6307\u7684\u662f\u7528\u4f8b\u6240\u6d89\u53ca\u7684\u529f\u80fd\uff0c\u53ef\u80fd\u5b58\u5728\u591a\u79cd\u53d8\u5316\uff0c\u6bcf\u6b21\u6267\u884c\u7528\u4f8b\u53ef\u80fd\u65ad\u8a00\u7684\u9884\u671f\u90fd\u4e0d\u540c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#9","title":"9. \u52a8\u6001\u65ad\u8a00","text":"\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u76f4\u5230\u7528\u4f8b\u7ed3\u675f\uff0c\u4e00\u76f4\u662f\u4e00\u4e2a\u52a8\u6001\u53d8\u5316\u7684\u8fc7\u7a0b\uff0c\u800c\u4e14\u65e0\u6cd5\u901a\u8fc7\u5176\u4ed6\u624b\u6bb5\u505c\u4e0b\u6765\uff1b \u6bd4\u5982\uff1a\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u65f6\uff0c\u53f3\u4e0b\u89d2\u7684\u5f55\u5236\u65f6\u95f4\u662f\u4e00\u76f4\u5728\u53d8\u5316\u7684\uff0c\u7528\u4f8b\u9700\u8981\u6d4b\u8bd5\u5f55\u52361\u5206\u949f\u4e4b\u540e\uff0c\u5f55\u5236\u65f6\u95f4\u662f\u521a\u597d\u505c\u572860\u79d2\uff1b \u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fd8\u505a\u4e0d\u5230\u65f6\u95f4\u7cbe\u51c6\u63a7\u5236\uff0c\u7a0b\u5e8f\u6267\u884c\u65f6\u95f4\u662f\u6709\u6ce2\u52a8\u7684\uff0c\u800c\u4e14\u8981\u9002\u914d\u591a\u4e2a\u5e73\u53f0\uff0c\u6240\u4ee5\u6b64\u7c7b\u7528\u4f8b\u5927\u6982\u7387\u4f1a\u6267\u884c\u5931\u8d25\u3002\u7279\u522b\u662f\u5728\u6027\u80fd\u8f83\u5dee\u7684\u56fd\u4ea7\u5316\u67b6\u6784\u4e0a\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u592a\u53ef\u80fd\u7a33\u5b9a\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#10","title":"10. \u63a2\u7d22\u6027\u6d4b\u8bd5","text":"\u63a2\u7d22\u6027\u6d4b\u8bd5\u901a\u5e38\u662f\u4e00\u4e9b\u4e0d\u786e\u5b9a\u7684\u64cd\u4f5c\uff0c\u591a\u53d8\u5207\u590d\u6742\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u9884\u671f\u4e5f\u53ef\u80fd\u662f\u4e0d\u786e\u5b9a\u7684\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u9a9a\u64cd\u4f5c\u592a\u591a\u4e86\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6b64\u7c7b\u7528\u4f8b\u9002\u5408\u91c7\u7528\u624b\u5de5\u6d4b\u8bd5\uff0c\u662f\u624b\u5de5\u6d4b\u8bd5\u771f\u6b63\u7684\u4ef7\u503c\u4f53\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#11","title":"11. \u6613\u7528\u6027\u6d4b\u8bd5","text":"\u5bf9\u4e8e\u6613\u7528\u6027\u7684\u5224\u65ad\u901a\u5e38\u662f\u4e3b\u89c2\u7684\uff0c\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\u5f88\u96be\u53bb\u5b9a\u4e49\u4ec0\u4e48\u6837\u7684\u60c5\u51b5\u5bf9\u7528\u6237\u662f\u6613\u7528\u7684\uff0c\u81ea\u52a8\u5316\u9700\u8981\u6709\u660e\u786e\u7684\u53ef\u5b9e\u73b0\u7684\u9884\u671f\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_2","title":"\u4e8c\u3001\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u524d\u9762\u8bb2\u4e86\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u4e00\u4e9b\u7528\u4f8b\u60c5\u51b5\uff0c\u6709\u540c\u5b66\u5c31\u8bf4\u4e86\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\u4e0d\u7528\u8bb2\u4e86\uff0c\u5c31\u662f\u4e0d\u9002\u5408\u7684\u53cd\u9762\u3002\u6ca1\u6bdb\u75c5\u54c8\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\uff0c\u6211\u4eec\u5927\u4f53\u8fd8\u53ef\u4ee5\u5206\u4e3a\u4e24\u7c7b\uff1a \u7b2c\u4e00\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u597d\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u7b2c\u4e8c\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u4e00\u822c\uff0c\u9700\u8981\u6295\u5165\u66f4\u591a\u7cbe\u529b\u624d\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u4ee5\u4e0b\u4ecb\u7ecd\u4e00\u4e9b\u6211\u4eec\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1_1","title":"1. \u64cd\u4f5c\u76f8\u5bf9\u7b80\u5355","text":"\u7528\u4f8b\u6b65\u9aa4\u76f8\u5bf9\u8f83\u5c11\uff0c\u8fd9\u79cd\u7528\u4f8b\u901a\u5e38\u662f\u4e00\u4e9b\u8def\u5f84\u5f88\u6d45\u7684\u7528\u4f8b\uff0c\u4e00\u822c\u4e5f\u662f\u4e00\u4e9b\u57fa\u7840\u7528\u4f8b\u3002\u7528\u4f8b\u7f16\u5199\u3001\u7ef4\u62a4\u90fd\u53ef\u4ee5\u8f7b\u677e\u641e\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2_1","title":"2. \u5bb9\u6613\u5b9e\u73b0","text":"\u73b0\u6709\u6280\u672f\u662f\u53ef\u5b9e\u73b0\u7684\uff0c\u6ca1\u6709\u96be\u5ea6\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3_1","title":"3. \u7ecf\u5e38\u7528\u4e8e\u56de\u5f52\u6d4b\u8bd5","text":"\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bcf\u6b21\u56de\u5f52\u6d4b\u8bd5\u5fc5\u987b\u8981\u6267\u884c\u7684\u7528\u4f8b\uff0c\u90a3\u4e48\u8fd9\u6761\u7528\u4f8b\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u3002 \u56de\u5f52\u6d4b\u8bd5\u65f6\u6211\u4eec\u9996\u5148\u5e94\u8be5\u4fdd\u8bc1\u5e94\u7528\u5386\u53f2\u57fa\u672c\u529f\u80fd\u6b63\u5e38\uff0c\u6240\u4ee5\u90a3\u4e9b\u6bcf\u6b21\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u90fd\u8981\u6267\u884c\u7684\u7528\u4f8b\u9002\u5408\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4_1","title":"4. \u529f\u80fd\u7a33\u5b9a\u7684\u6838\u5fc3\u529f\u80fd","text":"\u6d89\u53ca\u6838\u5fc3\u529f\u80fd\u7684\u7528\u4f8b\u662f\u6700\u6700\u91cd\u8981\u7684\u7528\u4f8b\uff0c\u4e5f\u662f\u6211\u4eec\u4ea4\u4ed8\u65f6\u5fc5\u987b\u8981\u4fdd\u8bc1\u8d28\u91cf\u7684\u76f8\u5173\u529f\u80fd\uff0c\u56e0\u6b64\u5e94\u8be5\u5c3d\u53ef\u80fd\u7684\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5_1","title":"5. \u8f93\u5165\u6570\u636e\u6d4b\u8bd5","text":"\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u901a\u5e38\u662f\u68c0\u9a8c\u88ab\u6d4b\u5e94\u7528\u63a5\u53d7\u6709\u6548\u6570\u636e\u3001\u62d2\u7edd\u65e0\u6548\u6570\u636e\u7684\u80fd\u529b\u3002\u5982\uff1a\u63d0\u4ea4\u8d85\u957f\u5b57\u7b26\u4e32\u3001\u7279\u6b8a\u5b57\u7b26\u4e32\u7b49\u7b49\u3002 \u6b64\u7c7b\u7528\u4f8b\u624b\u5de5\u6d4b\u8bd5\u5f88\u96be\u6bd4\u8f83\u5168\u9762\u7684\u8986\u76d6\u5230\u6240\u6709\u7684\u8f93\u5165\u60c5\u51b5\uff0c\u4f46\u662f\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\uff0c\u6b64\u7c7b\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u90fd\u662f\u4e00\u6837\u7684\uff0c\u53d8\u5316\u7684\u4ec5\u662f\u8f93\u5165\u53c2\u6570\u548c\u65ad\u8a00\u7ed3\u679c\uff0c\u91c7\u7528\u6570\u636e\u9a71\u52a8\uff0c\u53ef\u4ee5\u8f7b\u677e\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6_1","title":"6. \u683c\u5f0f\u8986\u76d6","text":"\u539f\u56e0\u540c\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u7c7b\u7528\u4f8b\u4e00\u6837\uff0c\u591a\u79cd\u683c\u5f0f\u7684\u8986\u76d6\u4e5f\u662f\u4e00\u4e2a\u5f88\u7e41\u7410\u7684\u4e8b\u60c5\uff0c\u4ea4\u7ed9\u81ea\u52a8\u5316\u6765\u505a\u518d\u5408\u9002\u4e0d\u8fc7\u4e86\u3002 \u6bd4\u5982\u5f71\u9662\u5bf9\u5f71\u7247\u683c\u5f0f\u7684\u68c0\u67e5\u3001\u622a\u56fe\u5f55\u5c4f\u5bf9\u4fdd\u5b58\u683c\u5f0f\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7_1","title":"7. \u68c0\u67e5\u5143\u7d20\u72b6\u6001","text":"\u67e5\u770b\u88ab\u6d4b\u5e94\u7528\u7684\u5143\u7d20\u5c5e\u6027\u3002\u5982\uff1a\u56fe\u7247\u7684\u5927\u5c0f\u548c\u6392\u5217\uff1b\u6309\u94ae\u7684\u53ef\u7528\u548c\u4e0d\u53ef\u7528\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/","title":"AT \u7ecf\u9a8c\u603b\u7ed3","text":"\u6b22\u8fce\u6240\u6709\u4eba\u63d0\u4ea4\u4f60\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u9762\u7684\u4f18\u79c0\u5b9e\u8df5\u7ecf\u9a8c\uff0c\u4ee5\u5e2e\u52a9\u5927\u5bb6\u89e3\u51b3\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#1","title":"1\u3001\u7ec8\u7ed3\u5668","text":"# litaoa@uniontech.com\n \u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4 pytest \u5b9e\u73b0\u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4\u7684\u65b9\u5f0f\u6709\u4e24\u79cd\uff0cyield \u548c\u7ec8\u7ed3\u51fd\u6570\uff1b yield \u5b9e\u73b0\uff0cyield\u524d\u9762\u4e3a\u7528\u4f8b\u7684\u524d\u7f6e\u6b65\u9aa4\uff0cyield \u540e\u9762\u4e3a\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4\u3002 @pytest.fixture\ndef clean_env():\nprint(\"setup\")\nyield\nprint(\"teardown\")\n \u7ec8\u7ed3\u51fd\u6570\u5b9e\u73b0\uff0c\u4f7f\u7528 request.addfinalizer \u6ce8\u518c\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4 @pytest.fixture\ndef clean_env(request):\ndef clean():\nprint(\"teardown\")\nrequest.addfinalizer(clean)\nprint(\"setup\")\n yield\u7684\u4f18\u7f3a\u70b9\uff1a \u4f18\u70b9\uff1a\u4ee3\u7801\u7b80\u6d01\uff0c\u76f4\u89c2\uff0c\u53ef\u4f7f\u7528yield\u5728\u7528\u4f8b\u4e2d\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c \u7f3a\u70b9\uff1a\u82e5\u524d\u7f6e\u6b65\u9aa4\u4e2d\u51fa\u73b0\u9519\u8bef\uff0c\u5219\u540e\u7f6e\u6b65\u9aa4\u4e0d\u4f1a\u6267\u884c \u7ec8\u7ed3\u51fd\u6570\uff1a \u4f18\u70b9\uff1a\u524d\u7f6e\u6b65\u9aa4\u5931\u8d25\u7684\u8bdd\uff0c\u540e\u7f6e\u6b65\u9aa4\u4ecd\u4f1a\u6267\u884c\u4e14\u53ef\u4ee5\u6ce8\u518c\u591a\u4e2a\u540e\u7f6e\u6b65\u9aa4\uff08\u524d\u63d0\uff1a\u9700\u8981\u5728\u4ee3\u7801\u62a5\u9519\u4e4b\u524d\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff09\uff0c\u652f\u6301\u7075\u6d3b\u4f7f\u7528\u540e\u7f6e\u6761\u4ef6 \u7f3a\u70b9\uff1a\u4ee3\u7801\u8f83\u4e3a\u590d\u6742\uff0c\u65e0\u6cd5\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c\uff08\u672c\u4eba\u76ee\u524d\u672a\u5b9e\u73b0\uff09 \u603b\u7ed3\uff1a\u5728\u524d\u7f6e\u6b65\u9aa4\u4fdd\u8bc1\u7edd\u5bf9\u4e0d\u4f1a\u51fa\u9519\u65f6\uff0c\u4f7f\u7528yield\u66f4\u4f73\u7b80\u4fbf\uff0c\u5f53\u524d\u7f6e\u6b65\u9aa4\u6613\u51fa\u73b0\u95ee\u9898\u65f6\uff0c\u63a8\u8350\u4f7f\u7528\u7ec8\u7ed3\u51fd\u6570\u3002 \u573a\u666f\uff1a\u4fdd\u9669\u7bb1\u7528\u4f8b\uff0c\u524d\u7f6e\u6b65\u9aa4\u4e2d\u5f00\u542f\u4fdd\u9669\u7bb1\uff0c\u540e\u7f6e\u6b65\u9aa4\u5220\u9664\u4fdd\u9669\u7bb1\u3002 @pytest.fixture(scope=\"session\", autouse=True)\ndef vault_fixture(request):\nDfmWidget.reset_vault_by_cmd() # 1\u3001\u91cd\u7f6e\u4fdd\u9669\u7bb1\nDdeDockPublicWidget().close_file_manager_by_cmd() # 2\u3001\u5173\u95ed\u6587\u7ba1\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 3\u3001\u5f00\u542f\u6587\u7ba1\nvault = DfmWidget()\nvault.create_file_vault() # 4\u3001\u521b\u5efa\u4fdd\u9669\u7bb1\ndef delete_vault(): # 8\u3001\u5220\u9664\u4fdd\u9669\u7bb1\u7684\u540e\u7f6e\u6b65\u9aa4\nsleep(2)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr()\nvault = DfmWidget()\nvault.delete_file_vault()\nDfmWidget.reset_vault_by_cmd()\nDdeDockPublicWidget().close_file_manager_by_cmd()\nrequest.addfinalizer(delete_vault) # 5\u3001\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\nDdeDockPublicWidget().close_file_manager_by_cmd() # 6\u3001\u5173\u95ed\u6587\u7ba1\nsleep(1)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 7\u3001\u5f00\u542f\u6587\u7ba1\n \u4ee3\u7801\u6309\u6ce8\u91ca\u4e2d\u7684\u5e8f\u53f7\u6267\u884c\u6b65\u9aa4 \u4ee3\u7801\u5728\u6b65\u9aa41-4\u4efb\u610f\u4f4d\u7f6e\u62a5\u9519\uff0c\u5219\u4e0d\u4f1a\u6267\u884c\u6b65\u9aa48\uff0c\u56e0\u4e3a\u672a\u6267\u884c\u5230\u6b65\u9aa45\uff0c\u6b65\u9aa48\u8fd8\u672a\u6ce8\u518c \u4ee3\u7801\u5728\u6b65\u9aa46-7\u62a5\u9519\uff0c\u4ecd\u4f1a\u6267\u884c\u6b65\u9aa47\uff0c\u56e0\u4e3a\u5728\u6b65\u9aa45\u4e2d\u5df2\u7ecf\u5c06\u6b65\u9aa47\u6ce8\u518c \u53ef\u4ee5\u7075\u6d3b\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff0c\u80fd\u5b9e\u73b0\u67d0\u4e2a\u524d\u7f6e\u6b65\u9aa4\u6267\u884c\u4e4b\u540e\uff0c\u624d\u4f1a\u6267\u884c\u540e\u7f6e\u6b65\u9aa4\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#2","title":"2\u3001\u542f\u52a8\u5e94\u7528\u7684\u65b9\u5f0f","text":"# huangmingqiang@uniontech.com\n \uff081\uff09\u547d\u4ee4\u884c\u542f\u52a8 \u5728 AT \u4ee3\u7801\u4e2d\u4f7f\u7528\u547d\u4ee4\u884c\u542f\u52a8\u5e94\u7528\uff0c\u4e3e\u4f8b\uff1a os.popen(\"deepin-music\")\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f7f\u7528 ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6\uff0cdogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u3002 \uff082\uff09\u901a\u8fc7 UI \u64cd\u4f5c\u542f\u52a8 \u901a\u8fc7\u4efb\u52a1\u680f\u3001\u542f\u52a8\u5668\u3001\u684c\u9762\u7b49UI\u65b9\u5f0f\u542f\u52a8\uff0c\u6bd4\u5982\u53cc\u51fb\u6253\u5f00\u3001\u53f3\u952e\u6253\u5f00\u7b49\uff0c\u8fd9\u79cd\u64cd\u4f5c\u65b9\u5f0f\u4e0d\u5b58\u5728ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6dogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u7684\u95ee\u9898\uff0c\u4e5f\u66f4\u52a0\u7b26\u5408\u7528\u6237\u7684\u64cd\u4f5c\u884c\u4e3a\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#3","title":"3\u3001\u6587\u4ef6\u9009\u62e9\u6846\u5c5e\u6027\u5b9a\u4f4d\u5076\u73b0\u65e0\u6cd5\u627e\u5230","text":"\u6587\u4ef6\u9009\u62e9\u6846\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5728\u8c03\u7528\u6587\u4ef6\u9009\u62e9\u6846\u65f6\uff0c\u6709\u4e00\u5b9a\u7684\u6982\u7387\u51fa\u73b0\uff0c\u754c\u9762\u5df2\u7ecf\u6e32\u67d3\u51fa\u6765\u4e86\uff0c\u4f46\u662f\u5c5e\u6027\u6811\u5e76\u6ca1\u6709\u5199\u5165\uff0c\u5bfc\u81f4\u901a\u8fc7\u5c5e\u6027\u65e0\u6cd5\u627e\u5230\u5143\u7d20\uff0c\u76ee\u524d\u4e5f\u6ca1\u6709\u5f88\u597d\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u4e3a\u4e86\u7528\u4f8b\u7a33\u5b9a\u6027\uff0c\u6587\u4ef6\u9009\u62e9\u6846\u7684\u64cd\u4f5c\u5efa\u8bae\u4f7f\u7528UI\u6216\u8005\u56fe\u7247\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u53ef\u4ee5\u901a\u8fc7\u641c\u7d22\u5185\u5bb9\u56fa\u5b9a\u6587\u4ef6\u4f4d\u7f6e\u3002 # litaoa@uniontech.com\n desk = DdeDesktopPublicWidget()\n# \u9009\u62e9\u89c6\u9891\u76ee\u5f55\ndesk.click_videos_dir_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.ctrl_f()\nsleep(1)\ndesk.input_message(\"\u5143\u7d20\u540d\u79f0\")\nsleep(0.5)\ndesk.enter()\nsleep(1)\n# \u9009\u62e9\u7b2c\u4e00\u4e2a\u6587\u4ef6\ndesk.click_list_view_btn_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.click_first_file_in_desktop_plugs_by_ui()\nsleep(1)\n# \u6587\u7ba1\u63d2\u4ef6\u4e2d\u70b9\u51fb\u6253\u5f00\ndesk.click_open_btn_in_desktop_plugs_by_ui()\n"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#4","title":"4\u3001\u5e94\u7528\u542f\u52a8","text":"# mikigo\n \u5728UI\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u4e00\u5207\u64cd\u4f5c\u7684\u90fd\u662f\u4ece\u5e94\u7528\u542f\u52a8\u5f00\u59cb\u7684\uff0c\u800c\u5728Linux\u684c\u9762\u5e94\u7528\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u6211\u4eec\u542f\u52a8\u5e94\u7528\u7684\u65b9\u6cd5\u6709\u591a\u79cd\uff0c\u4e0b\u9762\u505a\u4e00\u4e2a\u7b80\u5355\u7684\u4ecb\u7ecd\uff1a \u3010\u4f7f\u7528dogtail\u542f\u52a8\u3011 dogtail\u63d0\u4f9b\u4e86\u5e94\u7528\u542f\u52a8\u7684\u65b9\u6cd5\uff0c\u5728utils\u5e93\u4e2d\uff0c\u4f7f\u7528run\u65b9\u6cd5\u542f\u52a8\uff1a \u9996\u5148\u5bfc\u5165\u65b9\u6cd5\uff1a from dogtail.utils import *\n \u8c03\u7528run\u65b9\u6cd5 run('deepin-music')\n \u5373\u53ef\u542f\u52a8\u97f3\u4e50 \u8fd9\u79cd\u65b9\u6cd5\u7684\u4f18\u70b9\u662f\u91c7\u7528\u8fdb\u7a0b\u7684\u65b9\u5f0f\u76f4\u63a5\u542f\u52a8\uff0c\u4e0d\u4f9d\u8d56\u4e0eUI\uff0c\u65e0\u8bba\u684c\u9762\u6216\u4efb\u52a1\u680f\u4e0a\u662f\u5426\u5b58\u5728\u5e94\u7528\u56fe\u6807\uff0c\u90fd\u53ef\u4ee5\u6b63\u5e38\u542f\u52a8\u3002 \u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c \u5982\u679c\u4f7f\u7528ssh\u8fdc\u7a0b\u8c03\u7528\uff0c\u6216\u8005Jenkins\u4e2d\u6267\u884c\u6d4b\u8bd5\u811a\u672c\u7684\u65f6\u5019\uff0c\u5728sniff\u4e2d\u4f1a\u51fa\u73b0\u627e\u4e0d\u5230\u5e94\u7528\uff0c\u7ecf\u8fc7\u5206\u6790\uff0c\u53ef\u80fd\u662f\u56e0\u4e3a\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\u542f\u52a8\u7684\u65f6\u5019\uff0c\u5b9e\u9645\u662f\u91c7\u7528\u4e00\u4e2a\u5b50\u8fdb\u7a0b\u542f\u52a8\u4e86\u5e94\u7528\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u5230\u3002 \u3010\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u3011 \u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807 \u901a\u5e38\u6709\u4e24\u79cd\u65b9\u6cd5\uff1a \uff081\uff09\u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807\u3002 \uff082\uff09\u5df2\u77e5\u5e94\u7528\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u7684\u4f4d\u7f6e\uff0c\u7136\u540e\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u5bf9\u5e94\u5750\u6807\u3002 \u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u7f3a\u70b9\u662f\u4f4d\u7f6e\u5fc5\u987b\u56fa\u5b9a\uff0c\u5982\u679c\u79fb\u52a8\u4f4d\u7f6e\u5c31\u4e0d\u884c\u4e86\uff0c\u800c\u4f7f\u7528\u7b2c\u4e00\u79cd\u65b9\u6cd5\uff0c\u65e0\u8bba\u4f4d\u7f6e\u5728\u54ea\u91cc\uff0c\u53ea\u8981\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u5b58\u5728\u5373\u53ef\u3002 \u3010\u70b9\u51fb\u684c\u9762\u56fe\u6807\u542f\u52a8\u3011 \u684c\u9762\u56fe\u6807\u76ee\u524d\u662f\u91c7\u7528\u56fe\u50cf\u8bc6\u522b\u6280\u672f\uff0c\u5b9a\u4f4d\u5230\u5e94\u7528\u56fe\u6807\u7684\u5750\u6807\uff0c\u7136\u540e\u901a\u8fc7pyauogui\u8fdb\u884c\u70b9\u51fb\u64cd\u4f5c\u3002 \u8be6\u7ec6\u6280\u672f\u65b9\u6848\u53ef\u4ee5\u53c2\u8003\u6211\u7684\u53e6\u5916\u4e24\u7bc7\u535a\u5ba2: \u57fa\u4e8eopencv\u7684\u6a21\u677f\u5339\u914d\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd4\u56de\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 Python\u4e09\u65b9\u5e93PyAutoGui\u7684\u4f7f\u7528\u65b9\u6cd5 \u3010\u4ece\u542f\u52a8\u5668\u542f\u52a8\uff08\u4fd7\u79f0\u5f00\u59cb\u83dc\u5355\uff09\u3011 \u542f\u52a8\u4e2d\u542f\u52a8\u7684\u5b9e\u73b0\u903b\u8f91\u5b9e\u9645\u548c\u4efb\u52a1\u680f\u4e0a\u542f\u52a8\u5dee\u4e0d\u591a\u3002 \u9996\u5148\uff0c\u9700\u8981\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u542f\u52a8\u5668\u56fe\u6807\uff0c\u6216\u8005\u952e\u76d8super\u952e\uff0c\u5c06\u542f\u52a8\u5668\u547c\u51fa\u6765\uff0c \u7136\u540e\uff0c\u5728\u542f\u52a8\u5668\u4e2d\u70b9\u51fb\u5bf9\u5e94\u7684\u56fe\u6807\uff0c \u4f46\u662f\u8fd9\u91cc\u6709\u4e2a\u95ee\u9898\uff0c\u542f\u52a8\u5668\u4e2d\u7684\u5e94\u7528\u5217\u8868\uff0c\u4e00\u9875\u5c55\u793a\u4e0d\u5b8c\uff0c\u6240\u4ee5\u5982\u679c\u6211\u4eec\u8981\u70b9\u51fb\u7684\u5e94\u7528\u56fe\u6807\u4e0d\u5728\u7b2c\u4e00\u9875\u600e\u4e48\u529e\uff0c\u901a\u5e38\u89e3\u51b3\u65b9\u6848\u6709\u4e24\u79cd\uff1a \uff081\uff09\u9700\u8981\u8fdb\u884c\u5411\u4e0b\u6ed1\u52a8\uff0c\u8fd9\u91cc\u5c31\u6d89\u53ca\u5230\u76f8\u5e94\u7684\u8bc6\u522b\u65b9\u6848\uff0c\u5224\u65ad\u5982\u679c\u4e0d\u5728\u7b2c\u4e00\u9875\u5c31\u5f80\u4e0b\u6ed1\u52a8\u7ffb\u9875\u3002 \uff082\uff09\u542f\u52a8\u5668\u63d0\u4f9b\u641c\u7d22\u7684\u529f\u80fd\uff0c\u8f93\u5165\u5e94\u7528\u540d\u79f0\u641c\u7d22\uff0c\u7136\u540e\u8fdb\u884c\u70b9\u51fb\u3002 \u4ece\u5b9e\u9645\u64cd\u4f5c\u4e2d\u6765\u770b\uff0c\u91c7\u7528\u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u6548\u7387\u4f1a\u9ad8\u4e00\u70b9\u3002 \u3010\u7ec8\u7aef\u547d\u4ee4\u542f\u52a8\u3011 \u5728python\u4e2d\uff0c\u4f7f\u7528os.popen()\u6216os.system()\u6216\u8005subprocess.Popen()\uff0c\u5b9e\u73b0\u547d\u4ee4\u884c\u542f\u52a8\uff0c\u6bd4\u5982\uff1a import os\nos.popen('deepin-music')\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u8fdc\u7a0b\u6267\u884c\u811a\u672c\u7684\u65f6\u5019\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u7684\u95ee\u9898\u3002 \u3010\u603b\u7ed3\u3011 \u4ee5\u4e0a\u51e0\u79cd\u65b9\u6cd5\uff0c\u5404\u6709\u4f18\u7f3a\u70b9\uff0c\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff1a \uff081\uff09\u5982\u679c\u9700\u8981\u5728Jenkins\u4e2d\u505a\u6301\u7eed\u96c6\u6210\uff0c\u5efa\u8bae\u4f7f\u7528\u7b2c\u4e8c\u79cd\u4efb\u52a1\u680f\u542f\u52a8\u7684\u65b9\u6cd5\u3002 \uff082\uff09\u5982\u679c\u4e0d\u4f1a\u91c7\u7528\u8fdc\u7a0b\u6267\u884c\u7684\uff0c\u5efa\u8bae\u91c7\u7528\u7b2c\u4e00\u79cd\u6216\u8005\u6700\u540e\u4e00\u79cd\u65b9\u6848\u3002 \uff083\uff09\u7b2c\u4e09\u79cd\u548c\u7b2c\u56db\u79cd\u542f\u52a8\u65b9\u6cd5\uff0c\u901a\u5e38\u5728\u6d4b\u8bd5\u7528\u4f8b\u4e2d\u4f1a\u6d89\u53ca\u5230\uff0c\u6240\u4ee5\u5076\u5c14\u4f1a\u7528\u3002"},{"location":"RELEASE/","title":"\u7248\u672c\u66f4\u65b0\u8bb0\u5f55","text":""},{"location":"RELEASE/#2122023822","title":"2.1.2\uff082023/8/22\uff09","text":"new \u589e\u52a0 OCR \u8bc6\u522b\u81ea\u52a8\u91cd\u8bd5\u673a\u5236\uff0c\u9ed8\u8ba4\u91cd\u8bd5 2 \u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u91cd\u8bd5\u6b21\u6570\uff1b \u4f7f\u7528\u7a97\u7ba1\u6700\u65b0\u63d0\u4f9b\u7684\u4e8c\u8fdb\u5236\u63a5\u53e3\uff0c\u4f18\u5316\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u5728 Wayland \u4e0b\u83b7\u53d6\u7a97\u53e3\u4fe1\u606f\u7684\u65b9\u6cd5\uff1b\u611f\u8c22\u684c\u9762\u6d4b\u8bd5\u90e8 @\u4f55\u6743 @\u5b59\u7fe0 \u3001\u7a97\u7ba1\u7814\u53d1 @\u9ec4\u6cfd\u94ed \u7684\u5927\u529b\u652f\u6301\u3002 \u6269\u5145 skipif \u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\u51fd\u6570\uff1a skipif_xdg_type \u652f\u6301 x11 \u6216 wayland \u4e0a\u8df3\u8fc7\uff1b skipif_cpu_name \u652f\u6301\u4e0d\u540c cpu \u4e0a\u8df3\u8fc7\uff0c\u6bd4\u5982\uff1askipif_cpu_name-KLVVW5821\uff1b "},{"location":"RELEASE/#2102023818","title":"2.1.0\uff082023/8/18\uff09","text":"fix \u4fee\u590d SW \u67b6\u6784\u73af\u5883\u4f9d\u8d56\u7684\u95ee\u9898\uff0c\u539f\u56e0\u662f\u4e4b\u524d\u6211\u8fd9\u91cc\u672c\u5730\u6ca1\u6709 SW \u7684\u673a\u5668\uff0c\u6ca1\u6709\u505a\u76f8\u5173\u9002\u914d\uff1b \u4fee\u590d\u5b50\u9879\u76ee\u5355\u72ec\u9700\u8981\u4e09\u65b9\u5305 pexpect\uff0c\u7531\u4e8e\u4e4b\u524d\u662f\u9884\u88c5\u5230\u955c\u50cf\u91cc\u9762\u7684\uff0c\u4f46\u57fa\u7840\u6846\u67b6\u4e0d\u9700\u8981\uff0c\u56e0\u6b64\u6ca1\u6709\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u91cc\u9762\uff0c\u5bfc\u81f4\u5b50\u9879\u76ee\u4f9d\u8d56\u62a5\u9519\u3002 \u4fee\u590d\u5b50\u9879\u76ee cv \u5bfc\u5165\u62a5\u9519\u7684\u95ee\u9898\uff1b \u539f\u56e0\u4e3a\uff1ayouqu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u517c\u5bb9\u4e24\u79cd\u60c5\u51b5\uff0c\u4e00\u79cd\u662f\u9762\u5411\u670d\u52a1\uff0c\u5c31\u662f\u672c\u5730\u6d4b\u8bd5\u673a\u4e0d\u9700\u8981\u5b89\u88c5 OpenCV\uff0c\u7528\u4f8b\u4e2d\u7684\u56fe\u50cf\u8bc6\u522b\u4f1a\u901a\u8fc7\u8fdc\u7a0b\u670d\u52a1\u63a5\u53e3\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u548c\u7ed3\u679c\u83b7\u53d6\uff1b\u7b2c\u4e8c\u79cd\u662f\u539f\u751f\uff0c\u5c31\u662f\u672c\u5730\u76f4\u63a5\u5b89\u88c5 OpenCV \u76f4\u63a5\u7528\u3002\u4e24\u4e2a\u60c5\u51b5\u7684\u4f18\u5148\u7ea7\u662f\u4f18\u5148\u5224\u65ad\u672c\u5730\u5b58\u5728\uff0c\u5426\u5219\u8d70\u670d\u52a1\u3002 \u524d\u9762\u6211\u4eec\u5df2\u7ecf\u628a OCR \u529f\u80fd\u505a\u4e86\u670d\u52a1\u5316\uff0c\u57fa\u4e8e 1 \u5e74\u591a\u4ee5\u6765\u7684\u89c2\u5bdf\uff0c\u7528\u8d77\u6765\u5f88\u7a33\u5b9a\uff0c\u518d\u4e00\u4e2a\u5c31\u662f OpenCV \u5b89\u88c5\u5305\u662f\u6bd4\u8f83\u81c3\u80bf\u7684\uff0c\u7c97\u7565\u6570\u4e86\u4e0b\u4f9d\u8d56\u6709 30+ \u4e2a\uff0c\u800c\u4e14\u5728\u5404\u67b6\u6784\u4e0a\u4f9d\u8d56\u5305\u8fd8\u4e0d\u5c3d\u76f8\u540c\uff0c\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u65b9\u6848\u4e2d\u4e0d\u592a\u597d\u5904\u7406\uff0c\u6240\u4ee5\u672c\u6b21 2.0 \u7248\u672c\u6211\u4eec\u5927\u80c6\u7684\u5c06\u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u529f\u80fd\u4fee\u6539\u4e3a\u9762\u5411\u670d\u52a1\u7684\u65b9\u5f0f\uff0c\u524d\u671f\u6d4b\u8bd5\u4e00\u5207\u770b\u8d77\u6765\u90fd\u5f88\u548c\u8c10\u3002 \u4f46\u662f\u6ca1\u6ce8\u610f\u5230\u4e4b\u524d\u7ed9\u6d77\u71d5\u59d0\u90a3\u8fb9\u9879\u76ee\u5355\u72ec\u5b9a\u5236\u505a\u4e86\u4e2a\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\uff08\u4e3a\u4e86\u80fd\u7b80\u5355\u5e73\u6ed1\u7684\u8fc1\u79fb\u5230 youqu\uff09\uff0c\u6b64\u63a5\u53e3\u5e95\u5c42\u6ca1\u6709\u517c\u5bb9\u670d\u52a1\u5316\uff0c\u6240\u4ee5\u5979\u90a3\u8fb9\u7684\u9879\u76ee\u8c03\u7528\u6b64\u5b9a\u5236\u63a5\u53e3\u4f1a\u62a5 cv \u5bfc\u5165\u7684\u95ee\u9898\u3002 \u7531\u4e8e\u5c06\u8fd9\u4e2a\u5b9a\u5236\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\u8fdb\u884c\u670d\u52a1\u5316\u517c\u5bb9\u6539\u9020\u9700\u8981\u4e00\u5b9a\u65f6\u95f4\uff0c\u6539\u5b8c\u8fd8\u9700\u8981\u6d4b\u8bd5\uff0c\u4f46\u672c\u6b21\u65f6\u95f4\u6bd4\u8f83\u7d27\uff0c\u56e0\u6b64\u5148\u628a OpenCV \u88c5\u8fdb\u865a\u62df\u73af\u5883\uff0c\u540e\u7eed\u7248\u672c\u518d\u8003\u8651\u9488\u5bf9\u6b64\u63a5\u53e3\u505a\u4fee\u6539\u3002"},{"location":"RELEASE/#2002023816","title":"2.0.0\uff082023/8/16\uff09","text":"YouQu\uff08\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff09\u5f00\u6e90\u4e86\uff0c\u540c\u65f6\u63a8\u51fa\u4e86 2.0 \u7248\u672c\u3002 \u611f\u8c22\u738b\u6ce2\u603b\u3001\u67b6\u6784\u5e08\u5f90\u5c0f\u4e1c\u3001\u7814\u53d1\u7ecf\u7406\u90d1\u5e7c\u6208\u3001\u5218\u90d1\u7b49\u7814\u53d1\u540c\u4e8b\u7684\u5927\u529b\u652f\u6301\u3002 new 1\u3001\u65b0\u7684\u57fa\u7840\u6846\u67b6\u4ee3\u7801\u83b7\u53d6\u65b9\u5f0f\u53ca\u65b0\u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4 YouQu \u540e\u7eed\u5747\u901a\u8fc7 PyPI \u8fdb\u884c\u5305\u7684\u53d1\u5e03\uff0c\u4e5f\u5c31\u662f\u8bf4\u540e\u7eed\u53ef\u4ee5\u4f7f\u7528 pip \u8fdb\u884c\u5b89\u88c5\uff1a sudo pip3 install youqu==2.0.0\n \u8fd9\u91cc\u6709 2 \u4e2a\u5c0f\u70b9\u8981\u6ce8\u610f\uff1a \u63a8\u8350\u4f7f\u7528 sudo pip3 \uff08\u52a0 sudo\uff09\u8fdb\u884c\u5b89\u88c5\uff1b \u5982\u679c\u4e0d\u52a0 sudo \u6709\u4e9b\u673a\u5668\u53ef\u80fd $HOME/.local/bin \u4e0d\u5728\u7cfb\u7edf PATH \u73af\u5883\u76ee\u5f55\u4e0b\uff0c\u5728\u4e0d\u6dfb\u52a0\u73af\u5883\u53d8\u91cf\u7684\u60c5\u51b5\u4e0b\uff0c\u4f1a\u51fa\u73b0 YouQu \u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4\uff08youqu-startproject\uff09\u65e0\u6cd5\u4f7f\u7528\u7684\u95ee\u9898\uff1b \u5f53\u7136\uff0c\u5c06\u4e0a\u8ff0\u8def\u5f84\u6dfb\u52a0\u5230\u73af\u5883\u53d8\u91cf\u4e4b\u540e\u4e5f\u662f\u53ef\u4ee5\u7528\u7684\uff0c\u6240\u4ee5\u6211\u8fd9\u91cc\u662f\u63a8\u8350\u52a0 sudo\uff0c\u4e0d\u52a0 sudo \u4e5f\u662f\u53ef\u4ee5\u7684\uff0c\u53ea\u662f\u9700\u8981\u5173\u6ce8\u4e0b\u73af\u5883\u53d8\u91cf\u7684\u95ee\u9898\u3002 \u63a8\u8350\u6307\u5b9a\u7248\u672c\u53f7\uff08youqu==2.0.0\uff09\u5b89\u88c5\uff0c\u5982\u679c\u4e0d\u6307\u5b9a\u7248\u672c\u53f7\u9ed8\u8ba4\u662f\u5b89\u88c5\u6700\u65b0\u53d1\u5e03\u7684 YouQu \u7248\u672c\uff0c\u4f60\u53ef\u4ee5\u5728 PyPI \u4e0a\u7684 Release history \u91cc\u9762\u67e5\u770b\u6709\u54ea\u4e9b\u7248\u672c\u3002 \u5b89\u88c5\u4e4b\u540e\u4f1a\u81ea\u52a8\u751f\u6210\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu-startproject\uff0c\u4f7f\u7528\u5b83\u53ef\u4ee5\u521d\u59cb\u5316\u5de5\u7a0b\uff0c\u8fd9\u91cc\u4ee5\u97f3\u4e50\u4e3e\u4f8b\uff1b youqu-startproject autotest_deepin_music\n \u8fd9\u6837\u5c31\u4f1a\u5728\u5f53\u524d\u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a autotest_deepin_music \u76ee\u5f55\uff0c\u91cc\u9762\u5305\u542b\u4e86\u57fa\u7840\u6846\u67b6\u6240\u6709\u7684\u4ee3\u7801\uff1b \u4e4b\u540e\uff0c\u8fd8\u662f\u5728 apps \u76ee\u5f55\u4e0b\uff0c\u653e\u5165\u5b50\u9879\u76ee\u7684AT\u4ee3\u7801\u5373\u53ef\uff0c\u4f7f\u7528\u65b9\u6cd5\u548c\u8fc7\u53bb\u4e00\u6837\uff0c\u8fd9\u91cc\u5c31\u4e0d\u591a\u4ecb\u7ecd\u3002 \u53e6\u5916\uff0c\u9664\u4e86\u901a\u8fc7 pip \u83b7\u53d6\u4ee5\u5916\uff0c\u4ecd\u7136\u53ef\u4ee5\u901a\u8fc7\u6e90\u7801\u83b7\u53d6\uff08\u76f4\u63a5 git clone\uff09\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u4f7f\u7528 pip \u5b89\u88c5 YouQu \u65f6\uff0cYouQu \u5305\u7684\u5927\u5c0f\u624d 600+ k\uff0c\u5b89\u88c5\u901f\u5ea6\u8d77\u98de\u3002 2\u3001\u65b0\u7684AT\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848 \u4e3a\u4e86\u89e3\u51b3\u4ee5\u4e0b\u95ee\u9898\uff1a \u8fc7\u53bb\u4e00\u6bb5\u65f6\u95f4\u54b1\u4eec\u7ecf\u5e38\u51fa\u73b0\u7684\uff0c\u4e0d\u540c\u7684AT\u9879\u76ee\u5728\u540c\u4e00\u53f0\u673a\u5668\u4e0a\u90e8\u7f72\u73af\u5883\u65f6\u4f9d\u8d56\u7248\u672c\u51b2\u7a81\u7684\u95ee\u9898\uff0c\u65b0\u65b9\u6848\u4e0d\u540c\u7684\u9879\u76ee\u4f1a\u52a8\u6001\u751f\u6210\u81ea\u5df1\u7684\u865a\u62df\u73af\u5883\uff0c\u76f8\u4e92\u4e4b\u95f4\u4e0d\u5f71\u54cd\uff1b \u4e1a\u5185\u4e3a\u4e86\u89e3\u51b3\u7248\u672c\u51b2\u7a81\u95ee\u9898\u4e00\u822c\u90fd\u4f1a\u4f7f\u7528Python\u865a\u62df\u73af\u5883\u7684\u5de5\u5177\uff0c\u4f46\u662f\u90fd\u6709\u4e2a\u95ee\u9898\uff0c\u65e0\u6cd5\u7ba1\u7406 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u5305\uff0c\u672c\u6b21\u6211\u4eec\u89e3\u51b3\u4e86\u8fd9\u4e2a\u95ee\u9898\uff0c\u80fd\u591f\u5b8c\u5168\u7ba1\u7406\u5e38\u89c4\u7684Python\u5305\uff0c\u4e5f\u80fd\u7ba1\u7406\u5230 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u4e09\u65b9\u5305\uff1b \u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u4f7f\u7528\u65b9\u6cd5\uff1a bash env.sh\n \u53ef\u4ee5\u770b\u51fa\u6765\u548c\u539f\u6765\u4f7f\u7528\u65b9\u6cd5\u6ca1\u6709\u53d8\u5316\uff0c\u4e5f\u5c31\u662f\u8bf4\u4ece\u4f7f\u7528\u7684\u89d2\u5ea6\u662f\u5b8c\u5168\u6ca1\u6709\u533a\u522b\u7684\uff0c\u53ea\u662f\u5185\u90e8\u505a\u4e86\u4e0d\u540c\u7684\u4e8b\u60c5\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u672c\u673a\u90e8\u7f72\u7684\u529f\u80fd\u4ecd\u7136\u4fdd\u7559 env_dev.sh\uff0c\u53ef\u4ee5\u4f5c\u4e3a\u5f00\u53d1\u65f6\u7684\u73af\u5883\u90e8\u7f72\u3002 3\u3001\u65b0\u7684\u9a71\u52a8\u547d\u4ee4 \u8fc7\u53bb\u54b1\u4eec\u90fd\u662f\u4f7f\u7528\u8fd9\u6837\u7684\u547d\u4ee4\u6765\u9a71\u52a8\u6267\u884c\uff1a python3 manage.py run\n \u7531\u4e8e\u9ed8\u8ba4\u57fa\u4e8e\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848\uff0c\u56e0\u6b64\u6211\u4eec\u589e\u52a0\u4e86\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu\uff1b \u65b0\u7684\u9a71\u52a8\u65b9\u5f0f\uff1a youqu manage.py run\n \u53ea\u9700\u8981\u628a python3 \u66ff\u6362\u6210 youqu \u5c31\u53ef\u4ee5\u4e86\uff0c\u770b\u8d77\u6765\u5f88\u548c\u8c10~ 4\u3001\u65b0\u7684\u6587\u6863\u5730\u5740 \u8fc7\u53bb\u54b1\u4eec YouQu \u7684\u5728\u7ebf\u6587\u6863\u662f\u90e8\u7f72\u5728\u516c\u53f8\u5185\u7f51\u7684\uff0c\u73b0\u5728\u5f00\u6e90\u5230 github \u4e86\uff0c\u5916\u90e8\u5f00\u53d1\u8005\u80af\u5b9a\u8bbf\u95ee\u4e0d\u5230\u5185\u7f51\u7684\u6587\u6863\uff0c\u56e0\u6b64\u9700\u8981\u5c06\u6587\u6863\u90e8\u7f72\u5230\u516c\u7f51\u3010\u516c\u7f51\u6587\u6863\u3011\uff1b \u516c\u7f51\u6587\u6863\u4f7f\u7528\u7684\u662f github pages\uff08\u767d\u5ad6\u602a\u4e00\u987f\u72c2\u559c~~\uff09\uff0c\u4f46\u53ef\u80fd\u4f1a\u51fa\u73b0\u6587\u6863\u901f\u5ea6\u6162\u7684\u95ee\u9898\uff08\u4ee3\u7406\u4e0b\u5c31\u597d\u4e86\uff09\uff0c\u4e0d\u8fc7\u6ca1\u5173\u7cfb\uff0c\u54b1\u4eec\u3010\u5185\u7f51\u6587\u6863\u3011\u4ecd\u7136\u4fdd\u7559\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u3002 5\u3001\u5176\u4ed6\u4e00\u4e9b\u5c0f\u5c0f\u529f\u80fd\u66f4\u65b0\uff1a \uff081\uff09\u65b0\u589e\u5173\u95ed\u5206\u8fa8\u7387\u68c0\u6d4b\u7684\u53c2\u6570\u503c\uff1b youqu manage.py run --resolution no\n \u6216\u8005\u4fee\u6539 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387, \u6bd4\u5982\uff1a1920x1080\n;no: \u8868\u793a\u4e0d\u505a\u5206\u8fa8\u7387\u6821\u9a8c\nRESOLUTION = 1920x1080\n resolution \u8fd9\u4e2a\u53c2\u6570\u4e00\u76f4\u90fd\u6709\u7684\uff0c\u53ea\u4e0d\u8fc7\u4e4b\u524d\u662f\u7528\u4e8e\u6307\u5b9a\u5206\u8fa8\u7387\u5927\u5c0f\uff0c\u6bd4\u5982 --resolution 1920x1080\uff0c\u4f46\u6709\u4e9b\u63a5\u53e3\u7684\u9879\u76ee\u4e0d\u9700\u8981\u8fd9\u4e2a\u68c0\u67e5\uff0c\u53ef\u4ee5\u7ed9\u5b83\u4e2a no \u5c31\u597d\u4e86\uff0c\u5f53\u7136 CICD \u4e0a\u5173\u95ed\uff0c\u9700\u8981\u6d41\u6c34\u7ebf\u4e0a\u628a\u8fd9\u4e2a\u53c2\u6570\u52a0\u4e0a\uff1b \uff082\uff09\u65b0\u589e\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u7684\u547d\u4ee4\u884c\u53c2\u6570 \u4e4b\u524d\u8fd9\u4e2a\u914d\u7f6e\u9879\u53ea\u80fd\u5728 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c 1 \u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff0cRERUN >= RECORD_FAILED_CASE\u3002\n;1.\u5173\u95ed\u5f55\u5c4f\uff1aRECORD_FAILED_CASE > RERUN\n;2.\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1aRECORD_FAILED_CASE = 0\nRECORD_FAILED_CASE = 1\n \u73b0\u5728\u5c06\u5f00\u53d1\u5230\u547d\u4ee4\u884c\u53c2\u6570\u3002 youqu manage.py run --record_failed_case 2\n fix \u4fee\u590d remote \u6267\u884c\u65f6\uff0c\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u65e0\u6cd5\u751f\u6210\u6d4b\u8bd5\u62a5\u544a\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1302023710","title":"1.3.0\uff082023/7/10\uff09","text":"fix \u8fdb\u4e00\u6b65\u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b\u53c2\u8003\uff1a\u914d\u7f6ePython\u6e90\u7684\u51e0\u79cd\u65b9\u6cd5 \u4fee\u590d wayland_autotool \u53d7\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86wayland\u4e0b\u5076\u73b0\u627e\u4e0d\u5230 .Xauthority \u6587\u4ef6\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1292023626","title":"1.2.9\uff082023/6/26\uff09","text":"fix \u4f18\u5316\u8fdc\u7a0b\u6267\u884c remote \u7684\u53c2\u6570\u76f4\u63a5\u4f20\u7ed9\u8fdc\u7a0b\u673a\u5668\u7684 run \u547d\u4ee4\uff0c\u4e0d\u7528\u518d\u5355\u72ec\u5904\u7406\u8fdc\u7a0b\u6267\u884c\u7684\u53c2\u6570\u903b\u8f91\uff0c\u540e\u7eed\u4e13\u6ce8\u4e8e\u672c\u5730\u6267\u884c\u529f\u80fd\u5f00\u53d1\uff0c\u8fdc\u7a0b\u6267\u884c\u81ea\u52a8\u9002\u7528\uff1b env.sh \u79fb\u9664 pyyaml \u5b89\u88c5\uff0c\u7531\u5b50\u9879\u76ee\u5728 requirement.txt \u91cc\u9762\u5b9a\u4e49\uff0c\u6846\u67b6\u81ea\u52a8\u52a0\u8f7d\uff1b \u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b "},{"location":"RELEASE/#128202369","title":"1.2.8\uff082023/6/9\uff09","text":"fix \u4fee\u590d\u4e86 pypi \u5b89\u88c5 numpy \u5b58\u5728\u7cfb\u7edf\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#127202368","title":"1.2.7\uff082023/6/8\uff09","text":"fix env.sh \u4e2d\u5b89\u88c5 Python \u5305\u672a\u6307\u5b9a\u7248\u672c\u65f6\uff0c\u65e5\u5fd7\u8f93\u51fa\u5b89\u88c5\u7684\u7248\u672c\uff1b pdocr-rpc 2.0.1\nallure-custom 1.2.1\nfunnylog 1.1.3\n \u4fee\u590d -f \u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u62a5\u9519\u7684\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#126202367","title":"1.2.6\uff082023/6/7\uff09","text":"fix \u4fee\u590d wayland \u4e0a\u8c03\u7528\u9f20\u6807\u4e2d\u952e\u3001\u53f3\u952e\u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b \u4fee\u590d pubilic/dde_desktop_public_widget \u91cc\u9762\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u5b9a\u4f4d\u684c\u9762\u6587\u4ef6\u7684\u65b9\u6cd5\uff0c\u5750\u6807\u6ca1\u6709\u62c6\u5305\u7684\u95ee\u9898\uff1b \u4f18\u5316\u4e86\u7b49\u5f85\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b pycreeze \u7248\u672c\u5347\u7ea7\u5230 0.1.29\uff0c\u5bfc\u81f4\u4e0e pyautogui 0.9.53 \u4e0d\u517c\u5bb9\uff0cenv.sh \u91cc\u9762\u589e\u52a0\u6307\u5b9a pycreeze \u7248\u672c\u4e3a 0.1.28\uff1b "},{"location":"RELEASE/#1252023516","title":"1.2.5\uff082023/5/16\uff09","text":"new --app \u53c2\u6570\u540e\u9762\u65b0\u589e\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u76ee\u524d\u652f\u6301\u4e09\u79cd\u53c2\u6570\u4f20\u5165\u65b9\u5f0f\uff1a ~$: youqu run -a deepin-music\n~$: youqu run -a autotest_deepin_music\n~$: youqu run -a apps/autotest_deepin_music\n \u200b \u540e\u4e24\u79cd\u5165\u53c2\u65b9\u5f0f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\u3002 remote \u8fdc\u7a0b\u6267\u884c\u65b0\u589e\u4ece\u547d\u4ee4\u884c\u4f20\u5165\u6d4b\u8bd5\u673a\u4fe1\u606f\uff0c\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679c password \u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6 setting/remote.ini \u4e2d CLIENT_PASSWORD \u7684\u503c,\u6bd4\u5982\uff1auos@10.8.13.33:1 \u6216 uos@10.8.13.33 \uff1b python3 manage.py remote -c uos@10.8.13.33/uos@10.8.13.34\npython3 manage.py remote -c uos@10.8.13.33:1/uos@10.8.13.34:2\n fix \u65e5\u5fd7\u6a21\u5757\u4fee\u6539\u4e3a\u51fd\u6570\u6267\u884c\u4e4b\u524d\u6253\u5370\u65e5\u5fd7\uff1b \u65e5\u5fd7\u6a21\u5757\u589e\u52a0\u767d\u540d\u5355\uff0c\u901a\u8fc7\u7c7b\u540d\u5f00\u5934\uff0c\u7ed3\u675f\uff0c\u5305\u542b\u7b49\u5173\u952e\u5b57\u63a7\u5236\u9700\u8981\u6253\u5370\u7684\u51fd\u6570\u65e5\u5fd7\uff1b \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5982\u679c\u4f20\u5165\u4e86 app_name \u53ea\u4f1a\u5c06 apps \u76ee\u5f55\u4e0b app_name \u7684\u76ee\u5f55\u53d1\u9001\u5230\u6d4b\u8bd5\u673a\uff1b env.sh \u79fb\u9664 python3-dev\uff1b \u4fee\u590d Wayland \u4e0b env.sh \u73af\u5883\u5b89\u88c5\u5931\u8d25\u7684\u95ee\u9898\uff0c\u4f18\u5316\u4e86 deb \u4f9d\u8d56\u5b89\u88c5\u7684\u903b\u8f91\uff1b \u5c06 env.sh \u5237\u65b0\u6e90\u7684\u65e5\u5fd7\u5728\u7ec8\u7aef\u663e\u793a\uff0c\u89e3\u51b3\u5728 CI \u73af\u5883\u4e0b\uff0c\u957f\u65f6\u95f4\u4e0d\u8f93\u51fa\u65e5\u5fd7\u8fde\u63a5\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d1060 \u534e\u4e3a\u673a\u578b\u5b89\u88c5\u952e\u9f20\u5de5\u5177\u65f6\u4f9d\u8d56\u4e0d\u517c\u5bb9\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1242023227","title":"1.2.4\uff082023/2/27\uff09","text":"fix \u4fee\u6539 CURRENT \u6587\u4ef6\uff1b "},{"location":"RELEASE/#1232023227","title":"1.2.3\uff082023/2/27\uff09","text":"new pylint.sh \u652f\u6301\u901a\u8fc7\u4f4d\u7f6e\u53c2\u6570\u4f20\u5165\u6587\u4ef6\u8def\u5f84\uff1abash pylint.sh apps/autotest_deepin_music,\u597d\u5904\u662f\u53c2\u6570\u8def\u5f84\u53ef\u4ee5\u5728\u7ec8\u7aef\u8865\u5168\uff1b \u65b0\u589e\u7cfb\u7edf\u547d\u4ee4 youqu-pylint \uff0c\u7528\u4e8e\u9759\u6001\u4ee3\u7801\u626b\u63cf\uff0c\u4f7f\u7528\u65b9\u6cd5: youqu-pylint apps/autotest_deepin_music\uff1b \u7531\u4e8e\u7cfb\u7edf\u4e00\u4e9b dbus \u63a5\u53e3\u6539\u53d8\uff0c\u516c\u5171\u5e93\u4e2d\u7684 dbus \u65b9\u6cd5\u5c06\u4e0d\u518d\u7ef4\u62a4\uff0c\u7531\u5b50\u9879\u76ee\u5728 other_widget.py \u91cc\u9762\u8fdb\u884c\u7ef4\u62a4\uff1b fix \u4fee\u590d ssh \u73af\u5883\u4e0b\u8fd0\u884c\u63d0\u793a \u201c\u65e0\u6cd5\u8fde\u63a5\u201d \u7684\u95ee\u9898\uff1b \u4fee\u590d\u8fd0\u884c\u65f6\u7a0b\u5e8f\u9000\u51fa\uff0c\u4e0d\u8f93\u51fa\u5f02\u5e38\u65e5\u5fd7\u7684\u95ee\u9898\uff1b \u4fee\u590dyouqu remote xxx \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5728\u670d\u52a1\u7aef Ctrl + C \u65e0\u6cd5\u505c\u6b62\u7a0b\u5e8f\u8fd0\u884c\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#122202328","title":"1.2.2\uff082023/2/8\uff09","text":"new \u65b0\u589e\u6c14\u6ce1\u7c7b\u56fe\u50cf\u8bc6\u522b\u65b9\u6848\uff1bimage_utils.py::ImageUtil::get_during\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u533a\u57df\u8bc6\u522b\uff0c\u4f20\u5165 [x, y, w, h]\uff0cx: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u76ee\u6807\u56fe\u7247\uff0c\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\uff1b env.sh \u79fb\u9664 pypinyin; \u4f18\u5316\u6267\u884c env.sh \u65f6\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b manage.py \u79fb\u9664\u4e86\u53c2\u6570 session_timeout \uff0c\u6846\u67b6\u6839\u636e\u5168\u5c40\u7684 timeout \u4ee5\u53ca\u7528\u4f8b\u81ea\u5b9a\u4e49\u7684 timeout \u81ea\u52a8\u8ba1\u7b97\u51fa sessiontimeout \u7684\u503c\uff1b \u65b0\u589e ocr \u670d\u52a1\u5668\u94fe\u63a5\u91cd\u8bd5\uff0c\u9ed8\u8ba4\u91cd\u8bd51\u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u53c2\u6570\uff1b fix \u4fee\u590d\u4e86\u4e00\u4e9b pylint \u626b\u63cf\u7684\u4ee3\u7801\u98ce\u683c\u95ee\u9898\uff1b \u91cd\u65b0\u8bbe\u8ba1\u4e86\u6d4b\u8bd5\u62a5\u544a\u4e3b\u9898\uff1b "},{"location":"RELEASE/#121202316","title":"1.2.1\uff082023/1/6\uff09","text":"new \u652f\u6301\u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6267\u884c\u7528\u4f8b\uff1b\u53ef\u5c06python3 manage.py \u66ff\u6362\u4e3a youqu \uff1a youqu run -a deepin-music -k 001\n RPC \u670d\u52a1 IP \u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u6307\u5b9a\u4e0d\u540c\u7684\u7aef\u53e3\uff1b \u5728\u7ebf\u6587\u6863\u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u539f\u6765\u7684\u5730\u5740 10.8.10.215 \u5c06\u4e0d\u5728\u4f7f\u7528\uff1b fix \u4fee\u590d --count \u53c2\u6570\u53ef\u80fd\u51fa\u73b0\u4e0e\u5176\u4ed6\u6846\u67b6\u7684\u5de5\u7a0b\u4f9d\u8d56\u5b58\u5728\u51b2\u7a81\uff0c\u62a5\u9519\u91cd\u590d\u6ce8\u518c\u7684\u95ee\u9898\uff1b \u4fee\u590d CI \u73af\u5883\u4e0b\u591a\u4e2a\u5de5\u7a0b\u5b58\u5728 Python \u73af\u5883\u53d8\u91cf\u6307\u5411\u9519\u8bef\uff0c\u5bfc\u5305\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u5355\u72ec\u8fd0\u884c\u65b9\u6cd5\u65f6\u65e0\u65e5\u5fd7\u8f93\u51fa\u7684 Bug\uff1b "},{"location":"RELEASE/#12020221230","title":"1.2.0\uff082022/12/30\uff09","text":"1.1.4 \u7248\u672c\u9002\u914d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e14\u65b0\u589e\u4e86\u8f83\u591a\u65b0\u7279\u6027\uff0c\u6211\u4eec\u8ba1\u5212\u4f7f\u7528 1.1.4 \u7248\u672c\u8fd0\u884c\u4e00\u6bb5\u65f6\u95f4\uff0c1.2.0 \u7248\u672c\u5c06\u4fee\u590d\u671f\u95f4\u51fa\u73b0\u7684 Bug\uff0c\u7136\u540e\u4f5c\u4e3a\u7a33\u5b9a\u7248\u672c\u53d1\u5e03\u3002 new \u4fee\u6539\u5de5\u7a0b\u540d\u79f0\u4e3a youqu\uff1b \u5c06 sphinx \u6587\u6863\u5de5\u7a0b\u8fc1\u79fb\u5230\u5355\u72ec\u7684\u4ed3\u5e93\uff1b fix \u4fee\u590d startapp \u521b\u5efa\u5de5\u7a0b\u65f6\u5b58\u5728\u5de5\u7a0b\u540d\u79f0\u65f6\u65e0\u6cd5\u7ee7\u7eed\u521b\u5efa\uff1b \u4fee\u590d\u4e86 OCR \u670d\u52a1\u5728\u5e76\u53d1\u65f6\u53ef\u80fd\u51fa\u73b0\u65e0\u6cd5\u8fd4\u56de\u7ed3\u679c\u7684\u95ee\u9898\uff0c\u63d0\u5347 OCR \u670d\u52a1\u9ad8\u5e76\u53d1\u7a33\u5b9a\u6027\uff1b \u4fee\u590d PMS \u540c\u6b65\u6807\u7b7e\u5230 CSV \u6587\u4ef6\u4e0d\u652f\u6301\u7528\u4f8b\u5e93\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11420221214","title":"1.1.4\uff082022/12/14\uff09","text":"new \u65b0\u589e startapp \u5b50\u547d\u4ee4\u521b\u5efa\u5b50\u9879\u76ee\u5de5\u7a0b\u6a21\u677f: python3 manage.py startapp autotest_deepin_xxx \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u91cd\u590d\u6267\u884c\u6b21\u6570\uff1b \u53bb\u6389\u6279\u91cf\u6267\u884c\u524d\u6536\u96c6\u7528\u4f8b\u7684\u6b65\u9aa4\uff1b \u589e\u52a0\u5f00\u59cb\u6267\u884c\u65f6\u6253\u5370\u4e00\u4e9b\u6267\u884c\u53c2\u6570\uff0c\u5982\uff1a \u7528\u4f8b\u6536\u96c6\u6570\u91cf: 99\n\u5931\u8d25\u91cd\u8dd1\u6b21\u6570: 1\n\u6700\u5927\u5931\u8d25\u6b21\u6570: 49\n\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4: 200.0s (03\u520620\u79d2)\n\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4: 11880s (3\u5c0f\u65f618\u52060\u79d2)\n \u5b9a\u5236\u4fee\u6539allure\u62a5\u544alogo\u3001title\u3001\u9ed8\u8ba4\u8bed\u8a00\uff1b manage.py \u6267\u884c\u5f00\u59cb\u65f6\u6253\u5370 logo \u548c\u5f53\u524d\u7248\u672c\uff1a \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u255a\u2588\u2588\u2557 \u2588\u2588\u2554\u255d \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2584\u2584 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2580\u2580\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u2584\u2588 \u2584\u2588 \u2588 \u2588 \u2588 \u2584 \u2588 \u2584 \u2580\u2580\u2588 \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\uff1b \u88c5\u9970\u5668\u65b9\u6cd5\u6307\u5b9a\u6b21\u6570\uff1b @pytest.mark.count(2)\ndef test_music_001():\npass\n \u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u6b21\u6570\uff1b python3 manage.py run -a deepin-music -k 001 --count 2\n \u200b image_utils \u589e\u52a0\u51fd\u6570 save_temporary_picture\uff0c\u652f\u6301\u6307\u5b9a\u5c4f\u5e55\u533a\u57df\u622a\u56fe\u5e76\u8fd4\u56de\u56fe\u7247\u5b58\u653e\u7684\u672c\u5730\u8def\u5f84\uff0c\u540e\u7eed\u4f7f\u7528 assert_image_exist \u8fdb\u884c\u65ad\u8a00 Python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(x, y, width, height) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) button_center \u65b0\u589e btn_size \u83b7\u53d6\u63a7\u4ef6\u5de6\u4e0a\u89d2\u5750\u6807\u53ca\u957f\u5bbd\uff0c\u7528\u4e8e\u52a8\u6001\u7684\u622a\u53d6\u5143\u7d20\u7684\u56fe\u7247\uff0c\u53ef\u7528\u4e8e\u5b9a\u4f4d\u65ad\u8a00 python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u6240\u6709\u97f3\u4e50\u6309\u94ae\")) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) allure \u62a5\u544a\u4e2d\u5b9a\u4f4d\u95ee\u9898\u9664\u4e86\u65e5\u5fd7\u3001\u622a\u56fe\u3001\u5f55\u5c4f\u5916\uff0c\u8c03\u7528\u7684\u51fd\u6570\u589e\u52a0\u4e86 step \u6b65\u9aa4\u5c55\u793a\uff1b env.sh \u65b0\u589e\u5b89\u88c5\u5b50\u9879\u76ee Python \u4e09\u65b9\u4f9d\u8d56\uff0c\u5728\u5b50\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u5199 requirement.txt \u6587\u4ef6\uff0cenv.sh \u4f1a\u81ea\u52a8\u52a0\u8f7d\uff1b ocr \u8bc6\u522b\u65b0\u589e\u652f\u6301\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\u8fdb\u884c\u6587\u5b57\u8bc6\u522b\uff0c\u51cf\u5c11\u56e0\u5168\u5c4f\u8bc6\u522b\u65f6\uff0c\u5176\u4ed6\u6587\u5b57\u7684\u5e72\u6270 Python # \u65ad\u8a00\u97f3\u4e50\u7684\u5220\u9664\u5f39\u7a97\u4e2d\uff0c\u5305\u542b\u4e86\u201c\u786e\u8ba4\u201d\u7684\u6587\u5b57 self.assert_ocr_exist(\"\u786e\u8ba4\", picture_abspath=DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u5220\u9664\u5f39\u7a97\"))) \u65ad\u8a00\u51fd\u6570\u7684\u8c03\u7528\u4e5f\u4f1a\u81ea\u52a8\u6253\u5370\u65e5\u5fd7; env.sh \u65b0\u589e\u88c1\u526a\u4f9d\u8d56\u7684\u65b9\u6848\uff1b fix \u4fee\u590d Jenkins \u73af\u5883\u4e0b\uff0c apps \u76ee\u5f55\u4e0b\u5b50\u9879\u76ee\u5b58\u5728 auotest_deepin_xxx@tmp \u76ee\u5f55\uff0c\u5728\u4f20\u5165 app_name \u540e\u65e0\u6cd5\u6267\u884c\u7528\u4f8b\u7684\u95ee\u9898\uff1b \u4fee\u590d\u81ea\u52a8\u751f\u6210 case_list.csv \u6587\u4ef6\u65f6\uff0c\u7528\u4f8b\u987a\u5e8f\u88ab\u8c03\u6574\u7684\u95ee\u9898\uff1b env.sh \u73af\u5883\u5b89\u88c5\u79fb\u9664 git \u548c curl\uff1b \u4fee\u590d\u7528\u4f8b\u5728 setup \u9636\u6bb5\u62a5\u9519\u540e\uff0c\u672a\u5199\u5165 ci_result.json \u7684\u95ee\u9898\uff1b \u79fb\u9664 uos_ci.py\uff1b "},{"location":"RELEASE/#11320221028","title":"1.1.3\uff082022/10/28\uff09","text":"new \u65b0\u589e\u56fe\u50cf\u65ad\u8a00\u6210\u529f\u8f93\u51fa\u5339\u914d\u5ea6\uff1b \u65b0\u589e\u73af\u5883\u5b89\u88c5 yaml \u4f9d\u8d56\uff1b \u65b0\u589e\u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6570\u636e\u56de\u586b\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b \u65b0\u589e\u6d4b\u8bd5\u7ed3\u679c\u8868\u60c5\u663e\u793a\uff0c\u5e76\u4f18\u5316\u4e86\u65e5\u5fd7\u7684\u6392\u7248\uff1b \u65b0\u589e --top {number} \u7528\u4e8e\u8bb0\u5f55\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0c\u65e5\u5fd7\u751f\u6210\u5230 report/logs/top.log\uff1b fix \u4fee\u590d\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4f46\u7ec8\u7aef\u6ca1\u6709\u9519\u8bef\u65e5\u5fd7\u8f93\u51fa\u7684\u95ee\u9898\uff1b \u4fee\u6539\u5931\u8d25\u7528\u4f8b\u56de\u6eaf\u65e5\u5fd7\u4e3a\u8be6\u7ec6\u7ea7\u522b\uff1b \u4fee\u590d\u4e86\u6267\u884c\u8fdb\u5ea6\u672a\u8ba1\u7b97\u8df3\u8fc7\u7528\u4f8b\u7684\u95ee\u9898\uff0c\u5e76\u4f18\u5316\u4e86\u8fdb\u5ea6\u83b7\u53d6\u7684\u7b97\u6cd5\uff1b \u4fee\u590d env.sh \u5728 V23 \u73af\u5883\u4e0b\u5b89\u88c5\u65e0\u6cd5\u8bfb\u53d6\u5bc6\u7801\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 pms \u6d4b\u8bd5\u5957\u6267\u884c\u6216\u6d4b\u8bd5\u5355\u6267\u884c\u65f6\uff0c\u7528\u4f8bID\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b env.sh \u91cc\u9762 hub.deepin.com \u66f4\u6362\u6210 it.uniontech.com\uff1b uos_ci.py \u6d4b\u8bd5\u7ed3\u679c\u7edf\u8ba1\u65f6\uff0c\u603b\u6570\u5254\u9664 skip \u7684\u6570\u91cf "},{"location":"RELEASE/#11220220921","title":"1.1.2\uff082022/09/21\uff09","text":"new \u5728\u6ca1\u6709\u5b89\u88c5 dogtail \u7684\u60c5\u51b5\u4e0b\uff0c\u4e5f\u80fd\u4f7f\u7528 sniff \u5de5\u5177\uff1b fix \u4fee\u590d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e2d\u6ca1\u6709\u5b89\u88c5 AT \u73af\u5883\u6267\u884c uos_ci.py \u62a5\u9519\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11120220919","title":"1.1.1\uff082022/09/19\uff09","text":"new \u65b0\u589e\u6267\u884c\u8fdb\u5ea6\u663e\u793a\uff0c\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u65f6\u65e5\u5fd7\u8f93\u51fa\u5f53\u524d\u8fdb\u5ea6\uff1a[\u5f53\u524d\u6307\u5b9a\u7b2c\u51e0\u6761/\u7528\u4f8b\u603b\u6570]\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u7528\u4f8b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\u6240\u6709\u5931\u8d25\u7528\u4f8b\u7684\u5217\u8868\uff1b \u5173\u95ed\u7ec8\u7aef\u8f93\u51fa\u6355\u83b7\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u65e5\u5fd7\u5feb\u7167\uff1b \u4f18\u5316\u7ec8\u7aef\u8f93\u51fa\u5931\u8d25\u4fe1\u606f\u5197\u957f\u4e3a\u7b80\u8981\u4fe1\u606f\u8f93\u51fa\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u663e\u793a 10 \u4e2a\u6267\u884c\u6700\u6162\u7684\u7528\u4f8b\u5217\u8868\uff0c\u5e76\u8be6\u7ec6\u5217\u51fa\u5404\u4e2a\u9636\u6bb5\u7684\u8017\u65f6\uff1b \u5931\u8d25\u91cd\u8dd1\u7528\u4f8b\u91cd\u8dd1\u4e4b\u524d\u5ef6\u8fdf 1 \u79d2\uff1b \u65b0\u589e\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4ecd\u7136\u5f3a\u5236\u6267\u884c\uff1b \u7528\u4f8b\u6536\u96c6\u65f6\u4ec5\u5728 apps \u76ee\u5f55\u4e0b\u8fdb\u884c\uff0c\u5ffd\u7565 src,setting,public \u76ee\u5f55\uff1b \u65b0\u589e allure \u62a5\u544a\u5907\u4efd\u529f\u80fd\uff0c\u9ed8\u8ba4\u5907\u4efd\u81f3 allure_back \u76ee\u5f55\u4e0b\uff1b manage.py\u65b0\u589e\u53c2\u6570 --lastfailed \u7528\u4e8e\u53ea\u8dd1\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\u7684\u529f\u80fd\uff1b fix \u4fee\u590d\u4e86\u5728\u6ca1\u6709\u6307\u5b9a\u5e94\u7528\u540d\u79f0\u6267\u884c\u65f6\uff0cxml \u62a5\u544a\u751f\u6210\u8def\u5f84\u5f02\u5e38\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 uos_ci.py \u4f20\u5165 timeout \u548c session_timeout \u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11020220916","title":"1.1.0\uff082022/09/16\uff09","text":"new \u65b0\u589ePMS\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u652f\u6301\u591a\u79cd\u6570\u636e\u56de\u586b\u6a21\u5f0f\uff1b \u4f18\u5316\u4e86\u901a\u8fc7\u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u65f6PMS \u722c\u866b\u7684\u6027\u80fd\uff1b \u65b0\u589e .gitmodules \u6587\u4ef6\uff0c\u7528\u4e8e\u6807\u8bb0\u6240\u6709\u5b50\u9879\u76ee\uff0c\u65b9\u4fbf\u7edf\u4e00\u62c9\u53d6\u4ee3\u7801\uff1b env.sh \u9002\u914d\u793e\u533a\u7248\u4e0a\u5b89\u88c5\u81ea\u52a8\u5316\u73af\u5883\uff1b \u589e\u52a0\u6267\u884c\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u9519\u8bef\u7684\u529f\u80fd\uff1b README.md \u589e\u52a0 Wayland \u4e0b\u4f7f\u7528\u3001\u6d4b\u8bd5\u62a5\u544a\u67e5\u770b\u3001\u5e38\u89c1\u95ee\u9898\u7b49\u7684\u6587\u6863\u8bf4\u660e\uff1b \u589e\u52a0\u4e86\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u5bf9 setup\u3001call\u3001teardown \u8fdb\u884c\u65e5\u5fd7\u5206\u6bb5\uff1b fix \u4fee\u590d\u4e86 \u786e\u8ba4\u4fee\u590d \u5217\u6ca1\u5199\u8868\u5934\uff0c\u4f46\u5199\u4e86 fixed-xxx \u6807\u7b7e\uff0c\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u540c\u4e00\u5e94\u7528\u5185\u591a\u4e2a csv \u6587\u4ef6\u4e2d \u786e\u8ba4\u4fee\u590d \u5217\u6709\u7684\u5199\u4e86\uff0c\u6709\u7684\u6ca1\u5199\uff0c\u53ef\u80fd\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 INFO \u65e5\u5fd7\uff0c\u663e\u793a\u4e3a DEBUG \u7684\u95ee\u9898\uff1b\u4fee\u590d\u4e86\u90e8\u5206\u673a\u5668\u4e0a INFO \u65e5\u5fd7\u5185\u5bb9\u663e\u793a\u4e3a\u7ea2\u8272\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\u770b\u4e0d\u5230\u8be6\u7ec6\u4fe1\u606f\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10220220822","title":"1.0.2\uff082022/08/22\uff09","text":"new \u79fb\u9664 loguru\uff0c\u66ff\u6362\u4e3a logging\uff0c\u63a5\u53e3\u4fdd\u6301\u4e0d\u53d8\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u53d7\u5f71\u54cd\uff1b \u9ed8\u8ba4\u5f00\u542f coredump\uff1b fix \u4fee\u590d\u4e86\u4e09\u65b9\u5e93 loguru \u5076\u73b0\u5f02\u5e38\uff0c\u5bfc\u81f4\u7a0b\u5e8f\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7b2c\u4e00\u6b21\u5931\u8d25\u4e0d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10120220812","title":"1.0.1\uff082022/08/12\uff09","text":"new \u65b0\u589e RELEASE.md \u6587\u4ef6\uff0c\u7528\u4e8e\u8bb0\u5f55\u5386\u53f2\u53d1\u5e03\u7248\u672c\u7684\u66f4\u65b0\u5185\u5bb9\uff1b \u517c\u5bb9 Wayland \u6a21\u5f0f\u4e0b\u6267\u884c\u7528\u4f8b\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u7528\u7ba1\u5f53\u524d\u6d4b\u8bd5\u673a\u6267\u884c\u73af\u5883\uff0c\u6846\u67b6\u4f1a\u81ea\u52a8\u6839\u636e\u5f53\u524d\u73af\u5883\u8d70\u4e0d\u540c\u7684\u4ee3\u7801\u903b\u8f91\uff1b \u7531\u4e8e\u9700\u8981\u4fee\u6539 dogtail \u6e90\u4ee3\u7801\uff0c\u56e0\u6b64\u5c06\u4fee\u6539\u540e\u7684\u6e90\u7801\u653e\u5165\u5230\u6838\u5fc3\u5e93\u91cc\u9762 src/depends/dogtail \u540e\u7eed\u7248\u672c\u5c06\u4e0d\u9700\u8981\u5728\u7cfb\u7edf\u4e2d\u5b89\u88c5dogtail\uff1b \u5982\u679c\u5e94\u7528\u5e93\u540c\u6837\u4f7f\u7528\u4e86\u7cfb\u7edf\u5b89\u88c5\u7684 dogtail \u53ef\u80fd\u4f1a\u62a5\u9519\uff0c\u89e3\u51b3\u65b9\u6848\u662f\u5c06\u4ee3\u7801\u4e2d\u7684 import dogtail \u4fee\u6539\u4e3a from src.depends import dogtail ; fix \u91cd\u8dd1\u5931\u8d25\u4e4b\u540e\u624d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff0c\u4fee\u6539\u4e3a\u5931\u8d25\u4e4b\u540e\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":"# Attribution \uff1achengdu Test Team\n# Date \uff1a2021/08/20\n \u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d \u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d \u4ed3\u5e93\u5730\u5740\uff1ahttps://gitlabcd.uniontech.com/autotest/cd-desktop-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u65b9\u6848\u6982\u8ff0","text":"\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u667a\u80fd\u8bc6\u522b\u5e94\u7528\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u7528\u4e8e\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u64cd\u4f5c\u8fc7\u7a0b\u4e2d\u7684\u5143\u7d20\u5b9a\u4f4d\u4ee5\u53ca\u5224\u65ad\u7ed3\u679c\u65f6\u7684\u65ad\u8a00\u5904\u7406\uff1b\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\uff0c\u6d4b\u8bd5\u673a\u4e0a\u7684\u753b\u9762\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u5230\u670d\u52a1\u5668\u4e0a\uff0c\u670d\u52a1\u5668\u5bf9\u89c6\u9891\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\u540e\uff0c\u670d\u52a1\u5668\u667a\u80fd\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\u6210\u529f\uff0c\u7136\u540e\u5bf9\u6d4b\u8bd5\u673a\u4e0b\u53d1\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\uff0c\u6d4b\u8bd5\u673a\u63a5\u53d7\u5e76\u6267\u884c\u4e0b\u4e00\u6b65\u64cd\u4f5c\u3002 \u670d\u52a1\u5668\u4e0e\u6d4b\u8bd5\u673a\u4e4b\u95f4\u7684\u94fe\u63a5\uff1a \u670d\u52a1\u5668\u901a\u8fc7 USB \u4e32\u53e3\u8bbe\u5907\uff08USB-HID \u534f\u8bae\uff09\u6a21\u62df\u9f20\u6807\u952e\u76d8\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u64cd\u4f5c\u3002 \u901a\u8fc7\u89c6\u9891\u91c7\u96c6\u8bbe\u5907\u6355\u83b7\u6d4b\u8bd5\u673a\u7684\u5b9e\u65f6\u753b\u9762\u4f20\u8f93\u7ed9\u670d\u52a1\u5668\u3002 \u670d\u52a1\u5668\u5bf9\u91c7\u96c6\u7684\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\uff0c\u8bc6\u522b\u5176\u4e2d\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5e76\u8fd4\u56de\u5143\u7d20\u63a7\u4ef6\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\uff0c\u670d\u52a1\u5668\u901a\u8fc7\u667a\u80fd\u5316\u5206\u6790\uff0c\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e00\u81f4\u5c06\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\u901a\u8fc7\u4e32\u53e3\u6a21\u62df\u952e\u9f20\u4fe1\u53f7\u53d1\u9001\u7ed9\u6d4b\u8bd5\u673a\uff1b\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e0d\u4e00\u81f4\u5c06\u4f1a\u8fdb\u5165\u4e2d\u65ad\u5904\u7406\u53ca\u5f02\u5e38\u7ed3\u679c\u8f93\u51fa\uff0c\u7ee7\u7eed\u6267\u884c\u540e\u7eed\u573a\u666f\uff0c\u76f4\u81f3\u6240\u6709\u7528\u4f8b\u6d4b\u8bd5\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u6df1\u5ea6\u5b66\u4e60\u73af\u5883\u642d\u5efa","text":"\u6a21\u578b\u8bad\u7ec3\u4e3b\u8981\u5bf9 GPU \u6709\u8981\u6c42\uff0c\u8bad\u7ec3\u6a21\u578b\u7684\u673a\u5668\u663e\u5b58\u4e0d\u4f4e\u4e8e 6G\uff0c\u5176\u4ed6\u914d\u7f6e\u65e0\u7279\u6b8a\u8981\u6c42\u3002 \u63a8\u8350\u6027\u4ef7\u6bd4\u8f83\u9ad8\u914d\u7f6e \u64cd\u4f5c\u7cfb\u7edf: UnionTech OS Desktop 20 Professional Linux version 4.19.0-desktop-amd64 (deepin@deepin-PC) (Uos 8.3.0.3-3+rebuild) \u5904\u7406\u5668: Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz (\u516b\u6838 / \u5341\u516d\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460M-HDV(RD)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))/8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: TU116 [GeForce GTX 1660]\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u865a\u62df\u73af\u5883\u5b89\u88c5","text":"cd ~\nwget -c https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh\nbash Miniconda3-latest-Linux-x86_64.sh\n \u4e00\u8def\u56de\u8f66 \u7b2c\u4e00\u6b21\u63d0\u793a\u8f93\u5165 yes/no \uff1a\u8f93\u5165 yes \u7ee7\u7eed\u4e00\u8def\u56de\u8f66 \u7b2c\u4e8c\u6b21\u63d0\u793a\uff1a\u8f93\u5165 no cd ~/miniconda3/bin\nsudo chmod 777 activate\n \u6fc0\u6d3bconda\u73af\u5883 . ./activate\n \u6dfb\u52a0\u516c\u53f8\u5185\u7f51\u6e90 conda config --add channels bioconda\nconda config --add channels conda-forge\n \u5982\u679c\u662f\u5916\u7f51\u6dfb\u52a0\u5916\u7f51\u6e90 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/\n \u5982\u679c\u8981\u5220\u9664\u6e90 conda config --remove-key channels\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"2\u3001\u5b89\u88c5\u4f9d\u8d56","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u521b\u5efa\u865a\u62df\u73af\u5883","text":"conda remove --name mmlab --all # \u79fb\u9664\u6240\u6709\u865a\u62df\u73af\u5883\n conda create -n mmlab python=3.7\n conda activate mmlab\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-pytorch","title":"\uff082\uff09\u5b89\u88c5 Pytorch","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install torch==1.7.0+cu101 torchvision==0.8.1+cu101 torchaudio==0.7.0 -f https://download.pytorch.org/whl/torch_stable.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-mmcv","title":"\uff083\uff09\u5b89\u88c5 MMCV","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install mmcv-full==1.3.3 -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.7.0/index.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"\uff084\uff09\u5b89\u88c5\u663e\u5361\u9a71\u52a8","text":"\u6839\u636e\u4f60\u7684\u663e\u5361\u4e0b\u8f7d\u5bf9\u5e94\u9a71\u52a8\uff0c\u6bd4\u5982\u6211\u7684\u663e\u5361\u4e3a GTX1660\uff0c\u9a71\u52a8\u7248\u672c\u4e3a 430\uff0c\u9a71\u52a8\u4e0b\u8f7d\u5730\u5740\uff1ahttps://www.nvidia.cn/Download/Find.aspx?lang=cn CTRL+ALT+F2 \u8fdb\u5165tty\n \u7981\u7528 nouveau \u9a71\u52a8 sudo vim /etc/modprobe.d/blacklist-nouveau.conf\n \u586b\u5165\uff1a blacklist nouveau options nouveau modeset=0\n \u5237\u65b0\u914d\u7f6e\u6587\u4ef6 sudo update-initramfs -u reboot \u91cd\u542f\u540e\u518d\u8fdb\u5165 tty \u5173\u95ed\u56fe\u50cf\u754c\u9762\uff0c\u8f93\u5165\u547d\u4ee4\u5173\u95ed\u56fe\u50cf\u754c\u9762 sudo service lightdm stop\n \u5b89\u88c5\u9a71\u52a8 sudo chmod a+x NVIDIA-Linux-x86_64-430.run\nsudo ./NVIDIA-Linux-x86_64-430.run\n reboot\u91cd\u542f\uff0cnvidia-smi\u67e5\u770b\u5b89\u88c5\u72b6\u6001\u3002\u6ce8\u610f\u770b\u4e0bcuda\u7248\u672c\uff0c10.1\uff0cdriver\u7248\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u6570\u636e\u6807\u6ce8","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u6570\u636e\u6807\u6ce8","text":"\u6807\u6ce8\u4e4b\u524d\u9700\u8981\u5148\u8f6c\u6362\u56fe\u7247\u5927\u5c0f\uff0c\u5e76\u4e14\u4ee5\u6570\u5b57\u547d\u540d\uff0c\u6bcf\u7ec4\u547d\u540d\u9012\u589e"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"\uff081\uff09\u8f6c\u6362\u5927\u5c0f\u5e76\u91cd\u547d\u540d","text":"rename_pic.py import os\nimport sys\nimport cv2\nimport time\nimport getpass\nusername = getpass.getuser()\nsource_path = f\"/home/{username}/Desktop/right_menu\" # \u56fe\u7247\u8def\u5f84\nsource_dest = os.path.join('/'.join(source_path.split(\"/\")[:-1]), 'tmp')\nif not os.path.exists(source_dest):\nos.mkdir(source_dest)\nstart_name = sys.argv[1]\nfile_name_list = list()\nfor file in os.listdir(source_path):\nif file.endswith('.png'):\nfile_name_list.append(file)\nstart_name = int(start_name)\nfor file in file_name_list:\nos.rename(os.path.join(source_path,file), os.path.join(source_path, f\"{str(start_name)}.png\"))\nstart_name += 1\ntime.sleep(1)\nfor file in os.listdir(source_path):\nimage = os.path.join(source_path, str(file))\nsrc = cv2.imread(image)\nresult = cv2.resize(src, (960, 540))\nresizeImage = os.path.join(source_dest, str(file))\nprint(resizeImage)\ncv2.imwrite(str(resizeImage), result)\ncv2.waitKey(0)\ncv2.destroyAllWindows()\ntime.sleep(1)\nos.system(f'rm -rf {source_path}/*')\nos.system(f'mv {source_dest}/* {source_path}')\nos.system(f'rm -rf {source_dest}')\nprint(\"\u4e0b\u4e00\u4e2a\u5e8f\u53f7\uff1a\", start_name)\n \u6839\u636e\u7ec8\u7aef\u8f93\u51fa\u7684\u4e0b\u4e00\u4e2a\u5e8f\u53f7\u7684\u63d0\u793a\uff0c\u6267\u884c Python \u6587\u4ef6\u7684\u65f6\u5019\u4f20\u53c2\u3002 python rename_pic.py 249\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"\uff082\uff09\u5de5\u5177\u6807\u6ce8","text":"\u4f7f\u7528\u5de5\u5177 labelImg \u6807\u6ce8 sudo pip3 install PyQt5==5.13\nsudo pip3 install labelImg\n \u7ec8\u7aef\u76f4\u63a5\u8f93\u5165 labelImg\uff0c\u56de\u8f66 \u6807\u6ce8\u6a21\u5f0f\u9009\u62e9\uff1aPascalVOC"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u667a\u80fd\u6807\u6ce8","text":"\u6253\u5f00\u5c4f\u5e55\u5f55\u5236\u8f6f\u4ef6\uff0c\u5f55\u5236\u624b\u52a8\u64cd\u4f5c\u4e00\u6b21\u6d4b\u8bd5\u7528\u4f8b\uff0c\u7136\u540e\u5c06\u5f55\u5236\u7684\u89c6\u9891\u8fdb\u884c\u5206\u5e27\uff0c\u7136\u540e\u5bf9\u6bd4\u524d\u4e24\u5e27\u56fe\u6807\u76f8\u4f3c\u5ea6\uff0c\u5254\u9664\u76f8\u4f3c\u5ea6\u8fc7\u9ad8\u7684\u56fe\u7247\uff0c\u5728\u4fdd\u8bc1\u7d20\u6750\u591a\u6837\u6027\u7684\u524d\u63d0\u4e0b\uff0c\u5254\u9664\u91cd\u590d\u591a\u4f59\u7684\u56fe\u7247\u751f\u6210\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u96c6\uff0c\u7136\u540e\u53d6\u51fa\u63a7\u4ef6\u6a21\u677f\u6570\u636e\u96c6\uff0c\u901a\u8fc7 OpenCV \u6a21\u677f\u5339\u914d\u83b7\u53d6\u63a7\u4ef6\u5728\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u56fe\u7247\u4e2d\u6240\u5728\u7684\u5de6\u4e0a\u3001\u5de6\u4e0b\u3001\u53f3\u4e0a\u3001\u53f3\u4e0b\u56db\u5904\u5750\u6807\uff0c\u4ece\u800c\u6839\u636e\u6a21\u677f\u6570\u636e\u96c6\u751f\u6210\u6807\u6ce8\u6570\u636e\u3002\u53c2\u8003\u76ee\u5f55 AnnotationMaterial"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"\uff081\uff09\u6a21\u677f\u6570\u636e\u96c6\u51c6\u5907","text":"1\u3001\u5728\u754c\u9762\u622a\u53d6\u9700\u8981\u6807\u6ce8\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u653e\u5728\u76ee\u5f55\u4e0b AnnotationMaterial/template/img 2\u3001\u7ef4\u62a4\u63a7\u4ef6\u540d\u4e0e\u5143\u7d20\u63a7\u4ef6\u7684\u952e\u5bf9\uff0c\u4e00\u4e2a\u63a7\u4ef6\u540d\u53ef\u5bf9\u5e94\u591a\u4e2a\u5143\u7d20\u63a7\u4ef6 menu:\n- menu.jpg\n- menu1.jpg\n- menu2.jpg\n- menu3.jpg\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"\uff082\uff09\u7d20\u6750\u96c6\u51c6\u5907","text":"\u5f55\u5236\u89c6\u9891\u6216\u6216\u5c4f\u5e55\u622a\u56fe\u653e\u7f6e\u76ee\u5f55 AnnotationMaterial/source"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u5f00\u59cb\u6807\u6ce8","text":"python3 AnnotationMaterial/main.py\n \u751f\u6210\u7684\u6807\u6ce8\u6570\u636e\u5b58\u653e\u5728 AnnotationMaterial/result"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#mmdetection","title":"\u56db\u3001MMDetection","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1-mmdetection","title":"1\u3001 MMDetection \u4ee3\u7801","text":"MMDetection \u662f\u4e00\u4e2a\u6709\u540d\u7684\u6df1\u5ea6\u5b66\u4e60\u76ee\u6807\u68c0\u6d4b\u5f00\u6e90\u9879\u76ee\uff0c\u4e5f\u662f openMMlab \u7684\u62db\u724c\u9879\u76ee\uff0c\u4e3a\u4ec0\u4e48\u9009\u62e9\u5b83\uff0c\u5c0f\u5b69\u513f\u6ca1\u5a18\u8bf4\u6765\u8bdd\u957f\uff0c\u611f\u5174\u8da3\u53ef\u4ee5\u81ea\u884c\u6df1\u5165\u4e86\u89e3\uff1b \u4f60\u53ef\u4ee5\u76f4\u63a5\u5728 GitHub \u4e0a\u514b\u9686\u4ee3\u7801\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u54b1\u4eec\u4ed3\u5e93\u4e0b Train \u76ee\u5f55\u4e2d\u4ee3\u7801\uff0cTrain \u4e2d\u7684\u4ee3\u7801\u4e5f\u662f\u4ece GitHub \u4e0a\u62c9\u53d6\u7684\uff0c\u4e0d\u8fc7\u6211\u4eec\u6839\u636e\u9879\u76ee\u9700\u8981\u505a\u4e86\u4e00\u4e9b\u4e8c\u6b21\u5f00\u53d1\uff0c\u63a8\u8350\u76f4\u63a5\u4f7f\u7528\u5b83\u3002 \u5982\u679c\u4f60\u60f3\u4ece GitHub \u4e0a\u62c9\uff1a git clone https://github.com/open-mmlab/mmdetection.git\n# \u4e0d\u80fd\u76f4\u63a5\u62c9\u53d6\u4e3b\u5206\u652f\uff0c\u5efa\u8bae\u4f7f\u75282.12\u7248\u672c\uff0c\u4e0d\u540c\u7684\u7248\u672c\u5bf9\u5e94\u7684mmcv\u7248\u672c\u662f\u4e0d\u540c\u7684\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-voc2coco","title":"2\u3001\u62c9\u53d6 voc2coco \u4ee3\u7801","text":"git clone https://github.com/Tony607/voc2coco.git\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-coco","title":"3\u3001\u8f6c\u6362 coco \u6570\u636e\u96c6","text":"\u5c06\u6240\u6709\u7684\u56fe\u7247\u548cxml\u6587\u4ef6\u653e\u5165train2017\uff0c\u4ece\u4e2d\u6311\u9009\u51e0\u7ec4\u653e\u5165val2017\uff08\u6d4b\u8bd5\u96c6\uff09 cd mmdetection/data/coco\npython voc2coco.py train2017 annotations/instances_train2017.json\npython voc2coco.py val2017 annotations/instances_val2017.json\n \u751f\u6210json\u6587\u4ef6"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4_1","title":"4\u3001\u4fee\u6539\u914d\u7f6e","text":"\uff081\uff09\u8bfb\u53d6\u6a21\u578b\u540d\u79f0 import json\nmodule_name = []\nwith open('./instances_train2017.json', \"r+\") as f:\njson_file = f.read()\njson_dict = json.loads(json_file)\nmodule_list = json_dict.get('categories')\nfor module_info in module_list:\nname = module_info.get('name')\nmodule_name.append(name)\nprint(module_name)\nprint(\"module_num:\", len(module_name))\n # \u6ce8\u610f\u5bf9\u6bd4instances_train2017.json\u91cc\u9762\u6a21\u578b\u540d\u79f0\u7684\u987a\u5e8f\uff0c\u4e0eCLASSES\u548ccoco_classes\u91cc\u9762\u7684\u987a\u5e8f\u4fdd\u6301\u4e00\u81f4\u3002\n \uff082\uff09\u4fee\u6539 faster_rcnn_r101_2x_coco.py mmdetection/xianjin/faster_rcnn_r101_2x_coco.py \u4fee\u653946\u884c\uff0cnum_clasess\u7684\u503c\uff0c\u65b0\u589e1\u4e2a\uff0c\u5c31 +1\uff1b \uff083\uff09\u4fee\u6539 coco.py mmdetection/mmdet/datasets/coco.py CLASSES = ()\uff0c\u5728\u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b \uff084\uff09\u4fee\u6539 class_names.py mmdetection/mmdet/core/evaluation/class_names.py coco_classes \u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#5","title":"5\u3001\u7f13\u5b58\u6e05\u7406","text":"\u5220\u9664 mmdetection/build \u76ee\u5f55 python setup.py install\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#6","title":"6\u3001\u8bad\u7ec3\u6a21\u578b","text":"\uff081\uff09\u6307\u5b9a\u81ea\u5df1\u914d\u7f6e\u7684\u8bad\u7ec3\u6a21\u578b\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py --gpus 1\n \uff082\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u6d4b\u8bd5\u96c6\u7ed3\u679c\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py xianjin/epoch_24.pth --show\n \uff083\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u51c6\u786e\u5ea6\uff1b python tools/analysis_tools/analyze_logs.py plot_curve xianjin/20210530_011907.log.json --keys acc\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#7","title":"7\u3001\u5feb\u6377\u64cd\u4f5c","text":"python3 run.py\n \u5c06\u4ee5\u4e0a 4 - 7 \u6b65\u64cd\u4f5c\u6574\u5408\u6210 run.py\uff0c\u4e00\u952e\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u4e94\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\uff1b \u670d\u52a1\u7aef\u4e00\u53f0\uff08\u76ee\u524d\u4ec5\u652f\u6301AMD\u67b6\u6784\uff09\uff1b \u91c7\u96c6\u76d2\u4e00\u4e2a \uff08ACASIS hdmi\u89c6\u9891\u91c7\u96c6\u5361\uff0chttps://item.jd.com/10024310742602.html \uff09\uff1b USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\uff1b USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff1b \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5USB\u5ef6\u957f\u7ebf\uff1b \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u63a8\u8350\u914d\u7f6e","text":"\u6267\u884c\u7528\u4f8b\u7684\u670d\u52a1\u7aef\u5bf9\u914d\u7f6e\u6ca1\u6709\u7279\u6b8a\u8981\u6c42\uff0c\u5982\u679c\u6761\u4ef6\u5141\u8bb8\u914d\u7f6e\u8d8a\u9ad8\uff0c\u8bc6\u522b\u901f\u5ea6\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n \u6d4b\u8bd5\u673a\u4e0a\u4e0d\u6267\u884c\u4efb\u4f55\u811a\u672c\uff0c\u5177\u4f53\u914d\u7f6e\u6839\u636e\u6d4b\u8bd5\u9700\u8981\u51b3\u5b9a\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#usb_mk","title":"\u516d\u3001USB_MK\u4e32\u53e3\u9a71\u52a8\u65b9\u6cd5","text":"\u4f4d\u4e8econtrol_method\u76ee\u5f55\u4e0b\u7684usb_mk.py\u6587\u4ef6 \uff081\uff09\u5217\u51fa\u53ef\u901a\u4fe1\u7684\u7aef\u53e3 python3 -m serial.tools.list_ports -v\n \uff082\uff09\u4fee\u6539\u4e32\u53e3\u7684\u6743\u9650 sudo chmod 777 /dev/ttyACM0\n \uff083\uff09\u5b9e\u4f8b\u5316USB_MK import UsbMk\nusb_mk = UsbMk(\"/dev/ttyACM0\", 9600) # \u8bbe\u5907\u9ed8\u8ba49600\u4e3a\u6ce2\u7279\u7387\uff0c\u63a7\u5236\u4f20\u8f93\u901f\u7387\n \uff084\uff09USB\u4e32\u53e3\u8bbe\u5907\u9ed8\u8ba4\u6ce2\u7279\u7387\u4e3a9600\uff08\u7ecf\u6d4b\u8bd5\u6ce2\u7279\u73879600\u51c6\u786e\u6027\u6700\u597d\uff09\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up() # \u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u6c49\u5b57\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e\n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff083\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff084\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff085\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() # \u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2\n \uff086\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff087\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff088\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e03\u3001\u65b9\u6cd5\u8c03\u7528\u5165\u53c2\u89c4\u5219","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_7","title":"1\u3001\u57fa\u7c7b","text":"class Base:\ndef __init__(self):\nself._obj = image\nself._usb = usb_mk\ndef find_element_by_ai(self, element):\nreturn self._obj.find_element(element)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_6","title":"2\u3001\u5165\u53c2\u8bf4\u660e","text":"\u56fe\u50cf\u8bc6\u522b\u65b9\u6cd5\u5165\u53e3\u4e3a Base \u7c7b\u4e0b\u7684 find_element_by_ai \u3002\u4ec5\u63a5\u53d7\u4e00\u4e2a\u53c2\u6570 element\uff0c\u7c7b\u578b\u4e3a string\u3002 \u53ef\u8bc6\u522b\u7684 string \u683c\u5f0f\uff1a \uff081\uff09\u5927\u56fe\u6807\uff08 \u56fe\u6807\u5927\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\uff0c\u4f8b\uff1a Base().find_element_by_ai(\"window\")\n \uff082\uff09\u5927\u56fe\u6807 / \u5c0f\u56fe\u6807\uff08\u56fe\u6807\u5c0f\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5c0f\u56fe\u6807\uff0c\u4f8b\uff1awindow/search_btn Base().find_element_by_ai(\"window/search_btn\")\n \uff083\uff09\u5927\u56fe\u6807 / OCR\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\u5185\u7684\u6587\u5b57\uff0c\u4f8b\uff1amenu/\u5c5e\u6027 Base().find_element_by_ai(\"menu/\u5c5e\u6027\")\n \uff084\uff09OCR\uff1a\u5168\u5c4f\u8bc6\u522b\u6587\u5b57 Base().find_element_by_ai(\"\u641c\u7d22\")\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516b\u3001\u9690\u85cf\u9f20\u6807","text":"\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u8fc7\u6765\u7684\u89c6\u9891\u6d41\uff0c\u5728\u8bc6\u522b\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u53d7\u5230\u9f20\u6807\u5f71\u54cd\uff0c\u56e0\u6b64\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u9690\u85cf\u9f20\u6807\u3002 \u5c4f\u853d\u9f20\u6807\u5149\u6807\u663e\u793a ```shell script /etc/lightdm/lightdm.conf \u5728`[Seat:*]`\u4e0b\u9762\u6dfb\u52a0\u53c2\u6570\n```shell script\nxserver-command=X -bs -core -nocursor\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e5d\u3001\u667a\u80fd\u81ea\u52a8\u5316\u7684\u610f\u4e49","text":"1\u3001\u6539\u5584 Acessibility \u5b9a\u4f4d\u7684\u7a33\u5b9a\u6027\u95ee\u9898 Acessibility \u5c5e\u6027\u5b9a\u4f4d\u5b58\u5728\u5076\u5c14\u5931\u6548\u7684\u60c5\u51b5 \uff081\uff09\u5f00\u53d1\u5728\u505a\u65b0\u9700\u6c42\u5f00\u53d1\u65f6\u53ef\u80fd\u6d89\u53ca\u5230\u5bf9\u5c5e\u6027\u6807\u7b7e\u7684\u4fee\u6539\u6216\u8005\u5c42\u7ea7\u7684\u8c03\u6574\uff0c\u53ef\u80fd\u9020\u6210\u81ea\u52a8\u5316\u7528\u4f8b\u65e0\u6cd5\u5b9a\u4f4d\u5230\u5143\u7d20\u3002 \u6bd4\u59821040\u9636\u6bb5\uff0c\u97f3\u4e50\u91cd\u6784\u7684\u65f6\u5019\uff0c\u5f00\u53d1\u5bf9\u90e8\u5206\u5c5e\u6027\u548c\u5c42\u7ea7\u505a\u4e86\u4fee\u6539\uff0c\u5bfc\u81f4\u81ea\u52a8\u5316\u7528\u4f8b\u5b9a\u4f4d\u65b9\u6cd580%\u9700\u8981\u4fee\u6539\u3002 \u5f00\u53d1\u65b0\u529f\u80fd\u7684\u65f6\u5019\u5076\u5c14\u4e5f\u4f1a\u5bf9\u5c5e\u6027\u505a\u8c03\u6574\uff0c\u9047\u52305\u6b21\u3002 \uff082\uff09\u76ee\u524d\u4e3b\u8981\u4f7f\u7528Dogtail\u8bc6\u522b\u5e94\u7528Acessibility\u5c5e\u6027\u8fdb\u884c\u5b9a\u4f4d\uff0c\u662f\u83b7\u53d6\u5e94\u7528\u5f53\u524d\u754c\u9762\u7684\u5c5e\u6027tree\uff0c\u5728\u5e94\u7528\u8df3\u8f6c\u540e\uff0cDogtail\u5b58\u5728\u65e0\u6cd5\u53ca\u65f6\u83b7\u53d6\u5f53\u524d\u5c5e\u6027\u5217\u8868\u7684\u60c5\u51b5\u3002 \u591a\u5a92\u4f53\u8c03\u7528\u6587\u7ba1\u7a97\u53e3\u7684\u65f6\u5019\uff0c\u51fa\u73b0\u627e\u4e0d\u5230\u6587\u7ba1\u91cc\u9762\u5143\u7d20\u7684\u60c5\u51b5\uff0c\u76ee\u524d\u51fa\u73b010+\u6b21\u3002 \u5e94\u7528\u8bbe\u7f6e\u9875\u9762\u7684\u5c5e\u6027\u5076\u5c14\u5b58\u5728\u627e\u4e0d\u5230\u7684\u60c5\u51b5\uff0c\u9047\u52305\u6b21\u3002 \uff083\uff09Dogtail\u5de5\u5177\u672c\u8eab\u5b58\u5728\u95ee\u9898\uff0c\u6709\u65f6\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u5019\u5f88\u6162\uff0c\u8ba9\u4eba\u65e0\u6cd5\u63a5\u53d7\uff0c\u76ee\u524d\u51fa\u73b0\u8fc7\u5f88\u591a\u6b21\u3002 \u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u95f4\u6bd4\u5e73\u5e38\u61623\u500d\uff0c\u51fa\u73b04\u6b21\u3002 2\u3001\u89e3\u51b3\u4e86\u4f7f\u7528\u7edd\u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898 \u90e8\u5206\u63a7\u4ef6\u65e0\u6cd5\u6dfb\u52a0 Acessibility \u5c5e\u6027\u4ece\u800c\u4f7f\u7528\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u51fa\u73b0\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898\u3002 \uff081\uff09\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u65b9\u6cd5\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u76ee\u6807\u56fe\u7247\u8d44\u6e90\uff0c\u5728 UI \u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u4f1a\u6d89\u53ca\u5230\u76ee\u6807\u8d44\u6e90\u7684\u66ff\u6362\uff0c\u6bd4\u8f83\u8017\u8d39\u4eba\u529b\u3002 \uff082\uff09\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6cd5\u5bf9\u6bd4\u7cbe\u5ea6\u6bd4\u8f83\u641e\uff0c\u5982\u679cUI \u7684\u53d8\u66f4\u4f1a\u9020\u6210\u65e0\u6cd5\u51c6\u786e\u5b9a\u4f4d\u5230\uff0c\u81ea\u52a8\u5316\u811a\u672c\u5065\u58ee\u6027\u4e0d\u8db3\u3002 3\u3001\u4f7f\u7528\u673a\u5668\u5206\u79bb\uff0c\u89e3\u51b3\u4e86\u81ea\u52a8\u5316\u811a\u672c\u5bf9\u5e94\u7528\u7684\u5f71\u54cd\uff0c\u771f\u5b9e\u8fd8\u539f\u7528\u6237\u7684\u4f7f\u7528\u573a\u666f \u673a\u5668\u5206\u79bb\u7684\u67b6\u6784\u8bbe\u8ba1\uff0c\u4fdd\u8bc1\u4e86\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u73af\u5883\u5b8c\u5168\u7b49\u540c\u4e8e\u7528\u6237\uff0c\u6392\u9664\u6d4b\u8bd5\u811a\u672c\u7684\u5f71\u54cd\u3002 \uff081\uff09\u76ee\u524d\u7684\u529f\u80fd\u81ea\u52a8\u5316\u662f\u5728\u6d4b\u8bd5\u673a\u4e0a\u76f4\u63a5\u8fd0\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\uff0c\u52a0\u4e0a\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u6211\u4eec\u6dfb\u52a0\u4e86\u4e00\u4e9b\u8fdb\u7a0b\u76d1\u63a7\u3001\u89c6\u9891\u5f55\u5236\u7b49\u529f\u80fd\uff0c\u81ea\u52a8\u5316\u811a\u672c\u672c\u8eab\u4f1a\u6d88\u8017\u4e00\u4e9b\u7cfb\u7edf\u8d44\u6e90\uff0c\u65e0\u6cd5\u8fd8\u539f\u771f\u662f\u7684\u7528\u6237\u4f7f\u7528\u573a\u666f\u3002 \uff082\uff09\u6027\u80fd\u6d4b\u8bd5\u9700\u8981\u6392\u9664\u5176\u4ed6\u7a0b\u5e8f\u7684\u8d44\u6e90\u6d88\u8017\u5f71\u54cd\uff0c\u6027\u80fd\u81ea\u52a8\u5316\u91c7\u7528\u673a\u5668\u5206\u79bb\uff0c\u4fdd\u8bc1\u4e86\u6027\u80fd\u6570\u636e\u7684\u51c6\u786e\u6027\u3002 \u4ee5\u524d\u7684\u7528\u4f8b\u6267\u884c\u8017\u65f6\u6ca1\u6761\u572830\u79d2\u5de6\u53f3\uff0c\u73b0\u5728\u7528\u4f8b\u8017\u65f6\u572810\u79d2\u3002 4\u3001\u89e3\u51b3\u4e86UI \u8c03\u6574\u5bfc\u81f4\u5b9a\u4f4d\u5931\u8d25\u7684\u4e0d\u7a33\u5b9a\u6027\u95ee\u9898 \uff081\uff09\u89e3\u51b3\u4e86\u56e0 UI \u8c03\u6574\u5bfc\u81f4\u63a7\u4ef6\u4f4d\u7f6e\u53d8\u5316\u6216\u8272\u5dee\u53d8\u5316\u540e\u5b9a\u4f4d\u4e0d\u51c6\u786e\u7684\u95ee\u9898\uff0c\u53ea\u8981\u63a7\u4ef6\u6587\u6848\u548c\u63a7\u4ef6\u5916\u8fb9\u6846\u65e0\u53d8\u5316\u5747\u53ef\u51c6\u786e\u5b9a\u4f4d\uff1b \uff082\uff09\u76ee\u524d\u4e5f\u4f1a\u91c7\u7528\u57fa\u4e8eUI\u7684\u5b9a\u4f4d\u65b9\u6848\uff0c\u5982\u679cUI\u4f4d\u7f6e\u6709\u8c03\u6574\uff0c\u4f1a\u5bfc\u81f4\u5143\u7d20\u65e0\u6cd5\u5b9a\u4f4d\u3002 5\u3001\u7b80\u5316\u4e86\u7528\u4f8b\u7ed3\u6784\uff0c\u63d0\u5347\u7f16\u5199\u53cb\u597d\u5ea6 \uff081\uff09\u667a\u80fd\u81ea\u52a8\u5316\u8bc6\u522b\u5143\u7d20\u7684\u65b9\u6cd5\u53ea\u6709\u4e00\u4e2a\uff0c\u5c31\u662f\u57fa\u4e8e\u6211\u4eec\u8bad\u7ec3\u7684\u6a21\u578b\u8bc6\u522b\u89c6\u9891\u6d41\u4e2d\u7684\u5143\u7d20\uff0c\u7ecf\u8fc7\u811a\u672c\u5c01\u88c5\u4e4b\u540e\uff0c\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u4e2d\u6240\u6709\u5b9a\u4f4d\u7684\u64cd\u4f5c\u90fd\u53ea\u9700\u8981\u8c03\u7528\u8fd9\u4e00\u4e2a\u65b9\u6cd5\u5c31\u884c\u4e86\uff0c\u7f16\u5199\u81ea\u52a8\u5316\u811a\u672c\u7684\u96be\u5ea6\u5927\u5927\u964d\u4f4e\u3002 \uff082\uff09\u4e5f\u662f\u7531\u4e8e\u8c03\u7528\u65b9\u6cd5\u7b80\u5355\uff0c\u5728 UI \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u4e2d\u7684\u5206\u5c42\u7ed3\u6784\u5c06\u4f1a\u51cf\u5c11\uff0c\u591a\u7ee7\u627f\u7684\u60c5\u51b5\u4f1a\u51cf\u5c11\uff0c\u81ea\u52a8\u5316\u4ee3\u7801\u7684\u8c03\u7528\u7ed3\u6784\u4e5f\u4f1a\u53d8\u5f97\u7b80\u5355\uff0c\u800c\u4e14\u529f\u80fd\u6d4b\u8bd5\u540c\u5b66\u7f16\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u66f4\u52a0\u5bb9\u6613\u4e0a\u624b\u3002 \u4ee5\u524d\u5199\u7528\u4f8b\u7531\u4e8e\u9700\u8981\u7ed3\u5408\u4e0d\u540c\u7684\u6a21\u5757\uff0c\u8c03\u7528\u4e0d\u540c\u7684\u65b9\u6cd5\uff0c\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u5e76\u5b8c\u6210\u8c03\u8bd5\u7684\u65f6\u95f4\u5e73\u5747\u572820-30\u5206\u949f\uff0c\u73b0\u5728\u5199\u7528\u4f8b\u811a\u672c\u80fd\u57285\u5206\u949f\u5de6\u53f3\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":"# =============================================\n# Attribution : Application Test Department III\n# Time : 2023/1/3\n# Author : ut003281\n# =============================================\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u7b80\u8ff0","text":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5 \u901a\u8fc7\u81ea\u52a8\u5316\u624b\u6bb5\u5bf9\u5e94\u7528\u8fdb\u884c\u6027\u80fd\u6d4b\u8bd5\uff0c\u63d0\u4f9b\u65b9\u4fbf\u7684\u73af\u5883\u90e8\u7f72\u3001\u8fd0\u884c\u914d\u7f6e\u3001\u7528\u4f8b\u7f16\u5199\u7b49\uff0c\u7528\u4e8e\u684c\u9762\u5e94\u7528\u7684\u51b7\u70ed\u542f\u52a8\u3001\u8d44\u6e90\u62f7\u8d1d\u3001\u9875\u9762\u8df3\u8f6c\u7b49\u6027\u80fd\u573a\u666f\u6d4b\u8bd5\u3002 \u4ed3\u5e93\u5730\u5740\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-perf-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u4ee3\u7801\u7ed3\u6784","text":"autotest-perf-aitest\n\u251c\u2500\u2500 apps # \u5b58\u653e\u6240\u6709\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u811a\u672c\n\u251c\u2500\u2500 conftest.py # pytest hook\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 CURRENT # \u7248\u672c\u5185\u5bb9\n\u251c\u2500\u2500 docs # \u6587\u6863\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u952e\u503c\u5bf9\u7167\u8868.pdf # \u4e32\u53e3\u7ebfcode\u4e0e\u6309\u952e\u7684\u5bf9\u7167\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u6027\u80fd\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\u6267\u884c\u5668\u4f7f\u7528\u6307\u5357.md # \u6267\u884c\u5668\u811a\u672c\u4f7f\u7528\u6307\u5357\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 USB\u4e32\u53e3\u8f6cUSB\u952e\u76d8\u9f20\u6807\u7ebf\u534f\u8bae\u6587\u4ef6V1.0.pdf # \u4e32\u53e3\u534f\u8bae\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput-0.28.2.zip # Linux\u4e0b\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\u7684\u6e90\u7801\uff0c\u53ef\u6839\u636e\u67b6\u6784\u6253\u5305\n\u251c\u2500\u2500 manage.py # \u529f\u80fd\u4e3b\u5165\u53e3\n\u251c\u2500\u2500 pytest.ini # pytst \u914d\u7f6e\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 setting # \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 client.ini # \u6d4b\u8bd5\u673a IP \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5168\u5c40\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dev_env.sh # \u5bbf\u4e3b\u673a\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose_no_relay.yml # \u65e0\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose.yml # \u6709\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker_login.sh # docker \u767b\u9646\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 res\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 black.png # \u5168\u9ed1\u56fe\u7247\uff0c\u7528\u4e8e\u4fee\u6539\u58c1\u7eb8\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_5000.deb # 3A5000 \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_amd64.deb # amd \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_arm64.deb # arm \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_mips64.deb # mips \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_sw_64.deb # sw \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 server.ini # \u670d\u52a1\u5668\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 setup.sh # \u5bb9\u5668\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 template # \u521b\u5efa app \u57fa\u7840\u811a\u672c\u6a21\u677f\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 app_template\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ${app_name}_widget.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 control-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 images\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 test_${app_name}_01_scene.json-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 test_${app_name}_01_scene.py-tpl\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 uos_docker # \u5bb9\u5668\u73af\u5883\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dockerfile\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 requirements.txt\n\u2514\u2500\u2500 src\n \u251c\u2500\u2500 analysis_save.py # \u89e3\u6790\u56fe\u7247\u6d41\u7ed3\u679c\uff0c\u6c47\u603b\u751f\u6210 excel \u62a5\u544a\n\u251c\u2500\u2500 base_widget.py # \u5c01\u88c5\u7684\u57fa\u7840\u64cd\u4f5c\uff0c\u5e94\u7528\u8c03\u7528\u7684\u4e3b\u5165\u53e3\u65b9\u6cd5\n\u251c\u2500\u2500 cmdctl.py # \u8c03\u7528\u547d\u4ee4\u884c\u4f7f\u7528\n\u251c\u2500\u2500 global_value.py # \u5168\u5c40\u53d8\u91cf\n\u251c\u2500\u2500 image_utils.py # \u56fe\u7247\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 __init__.py\n \u251c\u2500\u2500 logger_utils.py # \u65e5\u5fd7\u914d\u7f6e\n\u251c\u2500\u2500 pdocr.py # ocr \u914d\u7f6e\n\u251c\u2500\u2500 public_method.py # \u4e00\u4e9b\u65b9\u4fbf\u7684\u5c01\u4f4f\n\u251c\u2500\u2500 record.py # \u5f55\u5c4f\u76f8\u5173\n\u251c\u2500\u2500 rtk # \u8fd0\u884c\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 _base.py # \u4e00\u4e9b\u679a\u4e3e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 install_env.py # \u5b89\u88c5\u73af\u5883\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 local_runner.py # \u8fd0\u884c\u7528\u4f8b\n\u251c\u2500\u2500 serial_communication # \u4e32\u53e3\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 power_control.py # \u7ee7\u7535\u5668\u64cd\u4f5c\uff0c\u4f7f\u7528\u7ee7\u7535\u5668\u8fde\u63a5\u4e3b\u673a\u7535\u6e90\uff0c\u63a7\u5236\u5f00\u5173\u673a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 serial_common.py # \u4e32\u53e3\u516c\u5171\u65b9\u6cd5\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 usb_mk.py # \u952e\u9f20\u64cd\u4f5c\u57fa\u7840\u5c01\u88c5\n\u251c\u2500\u2500 shortcut_key.py # \u5feb\u6377\u952e\u7684\u5c01\u88c5\n\u251c\u2500\u2500 singleton.py # \u5355\u4f8b\u6a21\u5f0f\n\u251c\u2500\u2500 start_app.py # \u521b\u5efa app\n\u2514\u2500\u2500 write_xlsx.py # \u751f\u6210 excel\n# __init__.py \u6587\u4ef6\u4e3a\u6807\u8bc6\u8be5\u76ee\u5f55\u662f\u4e00\u4e2aPython\u7684\u6a21\u5757\u5305\uff0c\u9879\u76ee\u4e2d\u7684__init__.py\u5747\u4e3a\u7a7a\u6587\u4ef6\u3002\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u73af\u5883\u642d\u5efa","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\u3002 \u670d\u52a1\u7aef\u4e00\u53f0\u3002\uff08\u4ec5\u652f\u6301 AMD \u67b6\u6784\uff0c\u82e5\u9700\u5176\u4ed6\u67b6\u6784\uff0c\u54a8\u8be2\u76f8\u5173\u5f00\u53d1\u4eba\u5458\uff09 \u91c7\u96c6\u76d2\u4e00\u4e2a\u3002 \uff08ACASIS HDMI \u89c6\u9891\u91c7\u96c6\u76d2\uff0chttps://item.jd.com/100013302599.html#crumb-wrap \uff09 USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\u3002\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"\uff082\uff09\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\u3002 USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff08USB3.0 \u63a5\u53e3\u4e0a\uff09\u3002 \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5 USB \u5ef6\u957f\u7ebf\u3002 \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u670d\u52a1\u7aef\u63a8\u8350\u914d\u7f6e","text":"\u914d\u7f6e\u8d8a\u9ad8\uff0c\u89e3\u6790\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"2\u3001\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa","text":" \u6253\u5f00\u63a7\u5236\u4e2d\u5fc3\uff0c\u8d26\u6237\u8bbe\u7f6e\u4e3a\u3010\u81ea\u52a8\u767b\u5f55\u3011\u548c\u3010\u65e0\u5bc6\u7801\u767b\u5f55\u3011\uff0c\u7535\u6e90\u7ba1\u7406\u4e2d\u4f7f\u7528\u7535\u6e90\u5168\u90e8\u8bbe\u7f6e\u4e3a\u3010\u4ece\u4e0d\u3011\uff0c\u5f00\u542f\u5f00\u53d1\u8005\u6a21\u5f0f\u3002 \u6839\u636e\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u8981\u6c42\uff0c\u5bfc\u5165\u76f8\u5173\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\uff1a\u5bfc\u5165\u76f8\u518c\u3001\u5f71\u9662\u3001\u97f3\u4e50\u7684\u6d4b\u8bd5\u8d44\u6e90\u3002 \u5728\u670d\u52a1\u7aef\u6253\u5f00\u76f8\u673a\u5e94\u7528\u540e\uff0c\u5c06\u6d4b\u8bd5\u673a\u684c\u9762\u58c1\u7eb8\u66f4\u6362\u4e3a\u7eaf\u8272\u58c1\u7eb8\uff08\u6ce8\u610f\uff0c\u670d\u52a1\u7aef\u9700\u63d0\u524d\u5f00\u542f\u76f8\u673a\u540e\u518d\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u58c1\u7eb8\uff0c\u5efa\u8bae\u7eaf\u9ed1\u58c1\u7eb8 setting/res/black.png\uff09 \u5728\u6587\u4ef6\u7ba1\u7406\u5668\u4e2d\uff0c\u5c06\u9009\u9879 \u4e3b\u83dc\u5355-\u8bbe\u7f6e-\u9884\u89c8-\u56fe\u7247\u9884\u89c8 \u53d6\u6d88\u52fe\u9009\uff08\u5982\u4e0d\u53d6\u6d88\uff0c\u4f1a\u5f71\u54cd\u622a\u56fe\u5f55\u5c4f\u5e94\u7528\u7684\u6027\u80fd\u6570\u636e\uff09 \u79fb\u52a8\u6216\u5220\u9664\u7cfb\u7edf Logo \uff0c\u6392\u9664\u684c\u9762\u53f3\u4e0b\u89d2 Logo \u7684\u5f71\u54cd\uff08\u91cd\u542f\u751f\u6548\uff09\u3002 sudo mv /usr/share/deepin/uos_logo.svg ~/Pictures/\n \u5b89\u88c5\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\uff08\u5fc5\u987b\u5b89\u88c5\uff01\uff01\uff09 AMD \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_amd64.deb ARM \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_arm64.deb MIPS \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_mips64.deb 3A5000 \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_5000.deb \u5b89\u88c5\u547d\u4ee4 sudo dkpg -i xserver-xorg-input-libinput_0.28.2-2_amd64.deb\n \u5b89\u88c5\u65f6\u4f1a\u63d0\u793a\u5df2\u5b58\u5728\u76f8\u540c\u7248\u672c\uff0c\u8bf7\u5ffd\u7565\uff0c\u76f4\u63a5\u8986\u76d6\u5b89\u88c5\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u4e3b\u673a\u624d\u751f\u6548"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u670d\u52a1\u7aef\u4e00\u952e\u73af\u5883\u90e8\u7f72","text":"\u73af\u5883\u642d\u5efa\u524d\u5fc5\u987b\u5148\u8fde\u63a5\u4e0a USB \u4e32\u53e3\u7ebf\u548c\u91c7\u96c6\u76d2\u3002 \u5bbf\u4e3b\u673a\u73af\u5883\u5b89\u88c5 python3 manage.py install --env host\n \u5bb9\u5668\u73af\u5883\u5b89\u88c5 python3 manage.py install --env docker\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u56db\u3001\u914d\u7f6e\u9879","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u670d\u52a1\u7aef\u914d\u7f6e","text":"setting/config/server.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u914d\u7f6e\u9879\uff0c\u5305\u542b\u4e86\u6240\u6709\u670d\u52a1\u7aef\u6240\u6709\u7684\u53ef\u914d\u7f6e\u9879\u3002 \u672c\u5730\u65e0\u7f51\u7edc\u8fd0\u884c \u5c06\u914d\u7f6e\u9879 network=0 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u672c\u5730\u6709\u7f51\u7edc\u8fd0\u884c \u914d\u7f6e\u9879 network=1 (1)\u914d\u7f6e\u9879 client_alias= \u914d\u7f6e\u4e3a\u4f60\u8981\u6d4b\u8bd5\u7684\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5982 Alias1 \u6d4b\u8bd5\u673a\u522b\u540d\u5728 setting/config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 (2)\u914d\u7f6e\u9879 client_alias= \u4e3a\u7a7a\uff0c\u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager --client_alias Alias1\uff0c\u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002(Alias1 \u4e3a\u4f60\u914d\u7f6e\u7684\u6d4b\u8bd5\u673a\u522b\u540d) (1)\u548c(2)\u53ea\u8981\u4f7f\u7528\u5176\u4e00\u5373\u53ef\u3002 \u6709\u7f51\u7edc\u8fd0\u884c\uff0c\u4e14\u9700\u8981\u901a\u8fc7 Jenkins \u4e0a\u8fd0\u884c\u4e00\u4e2a job \uff0c\u540c\u65f6\u63a7\u5236\u591a\u53f0\u673a\u5668\u3002 \u914d\u7f6e\u9879 network=1 \u914d\u7f6e\u9879 client_alias= \u4e0d\u7528\u914d\u7f6e\uff0c\u5728\u8fd0\u884c run.sh \u7684\u65f6\u5019\u76f4\u63a5\u7a7a\u683c\u52a0\u522b\u540d\u5373\u53ef\uff0c\u6bd4\u5982\uff1a\u6d4b\u8bd5\u673a\u522b\u540d\u4e3a Alias1 \uff0c\u4e14\u5df2\u7ecf\u5728 config/client.ini \u4e2d\u914d\u7f6e\u4e86 Alias1 \u7684user ip password \uff0c\u5219\u8fd0\u884c bash run.sh Alias1 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u5728 Jenkins pipeline \u91cc\u9762\u901a\u8fc7\u5e76\u884c stage \u6216\u5e76\u884c\u8c03\u7528\u4e0b\u5c42\u4efb\u52a1\u7684\u65b9\u5f0f\u53ef\u4ee5\u5b9e\u73b0\u5927\u89c4\u6a21\u7684\u6027\u80fd\u6d4b\u8bd5\u9700\u6c42\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;1\u3001KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2\u3001KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f, e.g. TAGS = L1 or smoke\n[case_conf]\n# \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\uff0cocr\u6587\u6848\u8bc6\u522b\u8f83\u6162\uff0c\u4e0d\u63a8\u8350\u4f7f\u7528\nfind_by = stage\n# \u6700\u540e\u4e00\u4e2a\u7a33\u5b9a\u9636\u6bb5\u7684\u5e27\u6570\u8bc6\u522b\n# \u9996\u5e27\u5b58\u5728\u540e\u7684\u7b2c\u4e00\u4e2a\u5927\u4e8e\u8be5\u914d\u7f6e\u5e27\u6570\u7684\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u5c3e\u5e27\nfinal_stable_num=100\n# \u4ece\u8be5\u5e27\u6570\u5f00\u59cb\u8bc6\u522b\u6587\u6848\u6216\u56fe\u7247\uff0c\u51cf\u5c11\u5206\u6790\u65f6\u95f4\nstart_num = 150\n# \u8bc6\u522b\u7684\u6587\u6848\ntext=\n# \u8bc6\u522b\u56fe\u7247\nmatch=apps/xxx/images/match.png\n# \u8bc6\u522b\u76f8\u4f3c\u5ea6\nmatch_rate=0.9\n# \u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6bd4\u5982\u70ed\u542f\u52a8\u7528\u4f8b\uff0c\u4ece\u70b9\u51fb\u6253\u5f00\u5230\u505c\u6b62\u5f55\u5c4f\uff0c\u4e2d\u95f4\u7b49\u5f855\u79d2\uff1b\nduration = 15\n# \u5355\u6761\u7528\u4f8b\u6267\u884c\u7684\u6b21\u6570\ncount = 5\n# \u7a33\u5b9a\u9636\u6bb5\u5212\u5206\u7684\u76f8\u4f3c\u5ea6\nstable_similarity = 0.9997\n[server]\n# \u8c03\u8bd5\u6a21\u5f0f=1\uff0c\u4e3a\u5f00\u542f\u8c03\u8bd5\u6a21\u5f0f\uff0c0\u4e3a\u5173\u95ed\u3002\n# \u8c03\u8bd5\u6a21\u5f0f\u4e0b\u9ed8\u8ba4\u53ea\u6267\u884c\u4e00\u6b21\u7528\u4f8b\uff0c\u4e0d\u5173\u673a\n# \u7f16\u5199\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u5efa\u8bae\u5f00\u542fmaintain\u3002\nMAINTAIN = 0\n# \u8fd0\u884c\u7684\u73af\u5883docker\u5bb9\u5668\u73af\u5883\uff0chost\u5bbf\u4e3b\u673a\u73af\u5883\nENV = docker\n# \u670d\u52a1\u7aef\u5bc6\u7801\nPASSWORD=1\n# \u6307\u5b9a\u6d4b\u8bd5\u673a\u522b\u540d\n# \u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6bd4\u5982\uff1a\n# [AMD]\n# ip=10.8.15.86\n# user=uos\n# \u5176\u4e2d AMD \u4e3a\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5219client_alias=AMD\nCLIENT_ALIAS = x86\uff08Intel-i7\uff09\n# 1 \u5f00\u542f\u7f51\u7edc, 0 \u5173\u95ed\u7f51\u7edc\n# \uff081\uff09\u670d\u52a1\u7aef\u4e0e\u6d4b\u8bd5\u673a\u987b\u5728\u540c\u4e00\u7f51\u6bb5\u4e0b\uff0c\u4f60\u53ef\u4ee5\u5c1d\u8bd5\u5728\u670d\u52a1\u7aef\u901a\u8fc7ssh\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c\u5982\u679c\u53ef\u4ee5\u8fde\u63a5\uff0c\u8bf4\u660e\u7f51\u7edc\u6b63\u5e38\u3002\n# \uff082\uff09\u5f53input_type=FILE_NAME \u65f6\uff0c\u5fc5\u987b\u5f00\u542f\u7f51\u7edc\u3002\nNETWORK = 1\n# \u6027\u80fd\u7ed3\u679c\u7edf\u8ba1\u5355\u4f4d \u6beb\u79d2\u2014ms, \u79d2\u2014s\nUNIT=ms\n# \u6d4b\u8bd5\u673a\u5f00\u673a\u8fdb\u5165\u684c\u9762\u540e\u7b49\u5f85\u65f6\u95f4,\u5355\u4f4d/\u79d2\nSTARTUP_DELAY = 60\n# 1\u4e3a\u5220\u9664\u7f13\u5b58\uff0c0\u4e3a\u4e0d\u5220\u9664\u7f13\u5b58\n# \u7528\u4f8b\u6267\u884c\u5b8c\u540e\u4f1a\u5728report\u76ee\u5f55\u4e0b\u751f\u6210\u667a\u80fd\u89e3\u6790\u7684\u4e00\u4e9b\u7f13\u5b58\u56fe\u7247\u3002\nCACHE = 0\n# \u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u62a5\u544a\u4f1a\u4fdd\u5b58\u5728\u9879\u76ee\u4e0breport\u76ee\u5f55\u4e2d\uff1b\n# \u6307\u5b9a\u62a5\u544a\u76ee\u5f55\u5219\u5b58\u653e\u5230\u6307\u5b9a\u76ee\u5f55\u3002\nREPORT_PATH = report\n# \u670d\u52a1\u7aef\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684icon\u8d44\u6e90\u4f1a\u7f13\u5b58\u5728\u9879\u76ee\u4e0binput\u76ee\u5f55\u4e2d\nINPUT = input/\n# 1\u4e3a\u6d4b\u8bd5\u5b8c\u5173\u673a\uff0c0\u4e3a\u6d4b\u8bd5\u5b8c\u4e0d\u5173\u673a\nSHUTDOWN = 0\n# \u89e3\u6790\u8fdb\u7a0b\u6570\uff08\u4e0d\u63a8\u8350\u4fee\u6539\uff09\n# 3\u4e2a\u8fdb\u7a0b\u89e3\u6790\u89c6\u9891\u5df2\u7ecf\u80fd\u591f\u6ee1\u8db3\uff0c\u5373\u4f7f\u589e\u52a0\u8fdb\u7a0b\u6570\u4e5f\u4e0d\u80fd\u51cf\u5c11\u6574\u4f53\u8017\u65f6\n# \u53e6\u5916\u8fd8\u8981\u770bCPU\u6838\u6570\u662f\u5426\u652f\u6301\u3002\nPARSING_PROCESS = 3\n# 1\u4e3a\u4f7f\u7528\u7ee7\u7535\u5668\u5f00\u5173\u673a\uff0c0\u4e3a\u4f7f\u7528reboot\u547d\u4ee4\u91cd\u542f\u3002\u4f9d\u8d56\u7ee7\u7535\u5668\u786c\u4ef6\u8bbe\u5907\uff0c\u9700\u8981\u4f7f\u7528\u8054\u7cfb\u5f00\u53d1\u8005\nRELAY = 0\n# \u83b7\u53d6\u6d4b\u8bd5\u5e94\u7528\u7684\u7248\u672c, %s \u5360\u4f4d\u5e94\u7528\u540d\n# \u5982\u679c\u8be5\u914d\u7f6e\u4e3a\u7a7a\uff0c\u5219\u4e0d\u83b7\u53d6\u5e94\u7528\u7684\u7248\u672c\u4fe1\u606f\u3002\nCOMMAND = apt policy %s 2>/dev/null|grep \"\u5df2\u5b89\u88c5\"|awk -F \"\uff1a\" \"{print \\$2}\"\n# \u5173\u673a\u7b49\u5f85\u5f00\u542f\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6839\u636e\u6d4b\u8bd5\u673a\u6027\u80fd\u4e0d\u540c\uff0c\u5f00\u5173\u673a\u8017\u65f6\u53ef\u80fd\u4e0d\u540c\uff0c\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u673a\u60c5\u51b5\u914d\u7f6e\u3002\nSHUTDOWN_DELAY = 30\n# \u53ef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u56fe\u7247\u683c\u5f0f\uff0c\u4ee5\u82f1\u6587\u9017\u53f7\u9694\u5f00\u3002\n# \u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u76ee\u524d\u6211\u4eec\u4ec5\u9a8c\u8bc1\u4e86jpg,jpeg,png\u8fd9\u4e09\u79cd\u5e38\u7528\u7684\u56fe\u7247\u683c\u5f0f\u3002\nINPUT_TYPES = jpg,jpeg,png\n# \u6027\u80fd\u5206\u6790\u8865\u5e27\uff0c\u7b49\u4e8e\u6216\u4f4e\u4e8e\u8be5\u503c\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u9700\u8981\u51cf\u6389\u3002\nUN_STAB_START = 3\n# \u670d\u52a1\u7aef\u83b7\u53d6\u6d4b\u8bd5\u673a\u56fe\u50cf\u7684\u5e27\u7387\uff0c\u5373\u6bcf\u79d2\u83b7\u53d6\u591a\u5c11\u5f20\u6d4b\u8bd5\u673a\u4e0a\u7684\u56fe\u50cf\u3002\n# \u9ed8\u8ba4\u5e27\u7387\u4e3a30\u5e27/\u79d2\uff0c\u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u53ef\u80fd\u4f1a\u5bf9\u89e3\u6790\u7ed3\u679c\u9020\u6210\u504f\u5dee\u3002\nFPS = 30\n# \u4ee5\u4e0b\u573a\u666f\u7c7b\u578b\u4f1a\u91cd\u542f\u6d4b\u8bd5\u673a,\u591a\u79cd\u573a\u666f\u4f7f\u7528\u9017\u53f7\u9694\u5f00\nSCENE = cold\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = http://10.8.13.78:8890\n#\u5c4f\u5e55\u56fe\u7247\u4e34\u65f6\u5b58\u653e\u4f4d\u7f6e\nSCREEN_CACHE = /tmp/screen\n# =======================================\n[log]\n# \u65e5\u5fd7\u7ea7\u522b\uff0cOFF\u3001FATAL\u3001ERROR\u3001WARN\u3001INFO\u3001DEBUG\u3001ALL\n# \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u65e5\u5fd7\u8f93\u51fa\uff0clog_cli=INFO\u8868\u793a \u4ec5\u8f93\u51faINFO\u53ca\u4ee5\u4e0a\u7ea7\u522b\u7684\u65e5\u5fd7\u3002\nLOG_LEVEL = DEBUG\n# \u65e5\u5fd7\u6587\u4ef6\u4fdd\u5b58\u8def\u5f84\nLOG_PATH= logs\n# =======================================\n[dockerhub]\n# \u5bb9\u5668\u767b\u9646\u8d26\u53f7\nDOCKER_USER = user\n# \u5bb9\u5668\u767b\u9646\u5bc6\u7801\nDOCKER_PASSWORD = User1234\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u6d4b\u8bd5\u673a\u914d\u7f6e","text":"setting/config/client.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u4fe1\u606f\u3002 \u6709\u7f51\u7edc\u7684\u60c5\u51b5\u4e0b\uff0c\u670d\u52a1\u7aef\u9700\u8981\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u56e0\u6b64\u4f60\u9700\u8981\u5199\u5165 \u6d4b\u8bd5\u673a\u522b\u540d \u3001 user \u3001ip\u3001 password \u3002 # \u6d4b\u8bd5\u673a\u522b\u540d\n[Alias1] # \u6d4b\u8bd5\u673aip\nip=10.8.15.86 # \u6d4b\u8bd5\u673a\u7528\u6237\u540d\nuser=uos\n \u547d\u540d\u5efa\u8bae\uff1aAliasA1\u3001AliasA2\u3001AliasB1\u3001AliasB2\uff0c\u4e0d\u8981\u91cd\u540d\u3002 \u65e0\u7f51\u7edc\u60c5\u51b5\u4e0b\uff0c\u4ec5\u9700\u8981\u5173\u6ce8\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\u9879 width=\u3001 height= \u5373\u53ef\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a [client]\n# \u9ed8\u8ba4\u6d4b\u8bd5\u673a\u7528\u6237\u540d\uff0c\u5bc6\u7801\uff0cip\nip=\nuser=\n# \u6d4b\u8bd5\u673a\u5bc6\u7801\npassword=1\n# \u6d4b\u8bd5\u673a\u4e3b\u9898\ntheme=bloom\n# \u6d4b\u8bd5\u673aicon\u76ee\u5f55\npath=/usr/share/icons\n# \u7cfb\u7edfdesktop\u6587\u4ef6\u7684\u5b58\u653e\u76ee\u5f55\uff0cUOS\u7cfb\u7edf\u9ed8\u8ba4\u4e3a/usr/share/applications\ndesktop_path=/usr/share/applications\n# \u7528\u4e8e\u5224\u65ad\u6d4b\u8bd5\u673a\u662f\u5426\u5f00\u673a\u8fdb\u5165\u684c\u9762\u7684\u8bc6\u522b\u6807\u8bc6\u3002\n# 1\u3001\u901a\u8fc7\u684c\u9762\u56fe\u6807\u8bc6\u522b\u3002\n# - type=FILE_NAME\u65f6\uff0c\u670d\u52a1\u5668\u548c\u6d4b\u8bd5\u673a\u5fc5\u987b\u5728\u540c\u4e00\u5c40\u57df\u7f51\u5185\u3002\n# - power_on=dde-computer\u8868\u793a\u901a\u8fc7\u684c\u9762\u8ba1\u7b97\u673a\u56fe\u6807\u5224\u65ad\u5f00\u673a\u8fdb\u5165\u684c\u9762\u3002\n# 2\u3001\u901a\u8fc7\u672c\u5730\u56fe\u7247\u4f5c\u4e3a\u5f00\u673a\u8bc6\u522b\u3002\n# - type= \u4f20\u5165\u4e3a\u56fe\u7247\u683c\u5f0f\uff0ctype\u652f\u6301\u7684\u7c7b\u578b\u5305\u542b\u5728server.ini\u5185\u914d\u7f6e\u9879input_type=jpg,jpeg,png\u3002\n# - power_on= \u4f20\u5165\u7684\u662f\u672c\u5730\u56fe\u7247\u7684\u8def\u5f84\u3002\ntype=FILE_NAME\npower_on=dde-computer\n# \u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\uff08\u6d4b\u8bd5\u673a\u8fde\u63a5\u91c7\u96c6\u76d2\uff0c\u91c7\u96c6\u76d2\u7684\u5206\u8fa8\u7387\uff09\nheight=1080\nwidth=1920\n[AliasA1] ip=10.8.15.86\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n[AliasA2]\nip=10.8.15.20\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_2","title":"3\u3001\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e","text":"\u968f\u7740\u6d4b\u8bd5\u573a\u666f\u7684\u4e0d\u65ad\u5f15\u5165\uff0c\u53d1\u73b0\u73b0\u6709\u670d\u52a1\u7aef\u91cc\u7684\u914d\u7f6e\u9879\u5e76\u4e0d\u9002\u7528\u4e8e\u6240\u6709\u7684\u6027\u80fd\u573a\u666f\uff0c\u4e8e\u662f\u5c06\u670d\u52a1\u7aef\u914d\u7f6e\u8fdb\u884c\u4e00\u4e2a\u63d0\u53d6\uff0c\u53ef\u505a\u5355\u4e2a\u573a\u666f\u7684\u4e2a\u6027\u5316\u914d\u7f6e\uff0c\u5f53\u7136\u539f\u6765\u7684\u670d\u52a1\u7aef\u914d\u7f6e\u529f\u80fd\u4fdd\u7559\uff0c\u53ea\u662f\u5f53\u4f60\u914d\u7f6e\u4e86\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e\u540e\uff0c\u4f18\u5148\u4f7f\u7528\u4e2a\u6027\u5316\u914d\u7f6e\u91cc\u9762\u7684\u5185\u5bb9\uff0c\u4ee5\u4e0b\u662f\u5bf9\u4e2a\u6027\u5316\u914d\u7f6e\u7684\u4ecb\u7ecd\u3002 \u76ee\u524d\u6bcf\u4e00\u4e2a py \u6587\u4ef6\u5bf9\u5e94\u4e00\u4e2a\u6027\u80fd\u6d4b\u8bd5\u573a\u666f\uff0c\u4e8e\u662f\u5728\u540c\u7ea7\u76ee\u5f55\u4e0b\u521b\u5efa\u4e00\u4e2a\u4e0e\u4e4b\u540c\u540d\u7684 json \u6587\u4ef6\uff0c\u4f5c\u4e3a\u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6 apps\n\u251c\u2500\u2500 album\n \u251c\u2500\u2500 test_album_01_start.json # \u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6\n\u2514\u2500\u2500 test_album_01_start.py # \u6027\u80fd\u573a\u666f\u6587\u4ef6\n \u4ee5\u4e0b\u662f\u5bf9 json \u6587\u4ef6\u4e2d\u914d\u7f6e\u7684\u89e3\u91ca\uff0c\u82e5\u67d0\u9879\u914d\u7f6e\u4e0d\u9700\u8981\uff0c\u53ef\u4ee5\u7f3a\u5931\uff0c\u4f46\u4e0d\u80fd\u4e3a\u7a7a\uff1b {\n\"title\": \"test_album_start\", # \u6807\u9898\uff1b\u5fc5\u987b\n\"app_name\": \"deepin-album\", # \u573a\u666f\u6240\u5c5e\u7684\u5e94\u7528\uff1b\u5fc5\u987b\n\"scene\": \"hot\", # \u573a\u666f\u522b\u540d\uff1b\u5fc5\u987b\n\"icon\": [\"deepin-album\"], # \u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684icon\u5230\u670d\u52a1\u7aef\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\uff1b\u53ef\u7f3a\u5931\n# \u6ce8\u610f\uff1a\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684desktop\u6587\u4ef6\u540d\u4e3adeepin-album.desktop\uff0c\n# \u53ea\u9700\u8981\u5199deepin-album\u5373\u53ef\uff0c\u201c.desktop\u201d\u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002\n\"size\": { # \u56fe\u7247\u5bf9\u6bd4\u7684\u533a\u57df\u8bbe\u7f6e\u9879\uff0c\u67d0\u4e9b\u5e94\u7528\u5f53\u524d\u5c4f\u5e55\u7684\u90e8\u5206\u533a\u57df\u9700\u8981\u5c06\u5176\u53bb\u6389\uff0c\u53ef\u4ee5\u8bbe\u7f6e\u6b64\u9879\uff0c\u5982\u679c\u6ca1\u6709\u5219\u53ef\u4e0d\u5199\uff1b\u53ef\u786e\u5b9e\n\"x-coordinate\": 0, # \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n\"y-coordinate\": 0, # \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n\"width\": 850, # \u6a2a\u5411\u957f\u5ea6\n\"height\": 1920 # \u7eb5\u5411\u9ad8\u5ea6\n},\n\"count\": 5, # \u573a\u666f\u6267\u884c\u7684\u6b21\u6570\uff1b\u5fc5\u987b\n\"duration\": 5, # \u8be5\u6761\u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff0c\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7279\u5b9a\u573a\u666f\uff0c\u8be5\u914d\u7f6e\u4e3a\u53ef\u9009\u9879\uff0c\u8986\u76d6 server.ini \u4e2d\u7684\u914d\u7f6e\uff1b\u53ef\u7f3a\u5931\n\"stable_similarity\": 0.9997, # \u6027\u80fd\u573a\u666f\u5206\u9636\u6bb5\u65f6\u7684\u56fe\u7247\u76f8\u4f3c\u5ea6\u5bf9\u6bd4\uff0c\u524d\u540e\u56fe\u7247\u4f4e\u4e8e\u8be5\u503c\uff0c\u5219\u5206\u4e3a\u4e0d\u7a33\u5b9a\u9636\u6bb5\uff1b\u53ef\u7f3a\u5931\n\"find_by\": \"stage\", # \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\n\"final_stable_num\": 100, # \u67e5\u627e\u6700\u540e\u4e00\u4e2a\u5927\u4e8e\u8be5\u503c\u7684\u7a33\u5b9a\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u7684\u5c3e\u796f\uff1b\u53ef\u7f3a\u5931\n\"start_num\": 150,\n\"text\": \"\", # ocr\u8bc6\u522b\u7684\u6587\u6848\n\"match\": \"apps/xxx/images/match.png\", # \u56fe\u50cf\u5339\u914d\u7684\u56fe\u7247\u6587\u4ef6\u8def\u5f84\n\"match_rate\": 0.9 # \u5339\u914d\u76f8\u4f3c\u5ea6\n}\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e94\u3001\u6d4b\u8bd5\u6d41\u7a0b","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516d\u3001\u7528\u4f8b\u7f16\u5199\u53ca\u65b9\u6cd5\u53c2\u6570\u6307\u5f15","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"1\u3001\u7528\u4f8b\u5b9e\u4f8b\u8bf4\u660e","text":"# \u6807\u51c6\u5e93\u5bfc\u5165\nfrom time import sleep\n# \u5bfc\u5165\u4e09\u65b9\u5e93pytest\nimport pytest\n# \u5bfc\u5165\u7528\u4f8b\u6267\u884c\u8981\u7528\u5230\u7684Widget\u7c7b\nfrom src.base_widget import BaseWidget\nclass TestStart:\n# class\u7ea7\u522b\u7684fixture\uff0c\u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u6267\u884c\u3002autouse=True \u81ea\u52a8\u5728\u5f53\u524d\u4f5c\u7528\u57df\u4e0b\u4f7f\u7528\u3002\n@pytest.fixture(scope=\"class\", autouse=True)\n# \u6d4b\u8bd5\u70ed\u542f\u52a8\u4e4b\u524d\u9700\u8981\u9884\u542f\u52a8\u3002\ndef application_pre_start(self):\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().right_click_element(\"deepin-album\")\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().click_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\")\nsleep(2)\n# \u5feb\u6377\u952e\u5173\u95ed\u7a97\u53e3\nBaseWidget().hot_key(\"alt\", \"f4\")\nsleep(2)\n# \u9ed8\u8ba4\u4e3afunction\u7ea7\u522b\u7684fixture\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\uff0cclass\u7ea7\u522bfixture\u6267\u884c\u4e4b\u540e\u6267\u884c\u3002\n@pytest.fixture(autouse=True)\ndef setup_start(self):\n# \u53f3\u952e\u70b9\u51fb deepin-album \u56fe\u6807\nBaseWidget().right_click_element(\"deepin-album\")\n# \u79fb\u52a8\u5230\u53f3\u952e\u83dc\u5355\u4e2d\u6253\u5f00\uff08open.png\uff09\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().move_to(*BaseWidget().find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))\n# \u7b49\u5f85\u79fb\u52a8\u5b8c\u6210\nsleep(0.5)\ndef test_album_start(self):\n# \u70b9\u51fb\u201c\u6253\u5f00\u201d\nBaseWidget().click() \n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"2\u3001\u65b9\u6cd5\u53c2\u6570\u8bf4\u660e","text":"2.1\u3001find_element \u65b9\u6cd5 def find_element(element: str, input_type: str = \"FILE_NAME\", fill_color_position: tuple = (-1, -1), size: tuple = (25, 70)):\npass\n \u53c2\u6570 element \u548c input_type \uff081\uff09\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u5143\u7d20 - `input_type` \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a `FIEL_NAME` \uff0c\u8868\u793a\u901a\u8fc7\u5e94\u7528 `icon` \u5bfb\u627e\u5143\u7d20\uff0c\u6b64\u65b9\u6cd5\u4f1a\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u5e94\u7528 `icon` \u56fe\u6807\u3002\n \u4e3e\u4f8b\uff1a\u9ed8\u8ba4\u60c5\u51b5\u4e0b input_type \u53c2\u6570\u4e0d\u9700\u8981\u4f20\u5165\uff0c find_element(\"deepin-album\")\uff0c\u8868\u793a\u901a\u8fc7 deepin-album \u7684\u5e94\u7528 icon \u6765\u83b7\u53d6\u5750\u6807\uff0c\u6ce8\u610f\uff0c\u6b64\u65f6\u4f20\u5165\u7684 deepin-album \u53c2\u6570\u5b9e\u9645\u662f desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u548c2.3\u4e2d\u7684 icon \u53d8\u91cf\u4e00\u81f4\u3002 \u6211\u4eec\u5efa\u8bae\u4f18\u5148\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\uff0c\u4f46\u6b64\u65b9\u6cd5\u4f9d\u8d56\u7f51\u7edc\uff0c\u8bf7\u6839\u636e\u6d4b\u8bd5\u73af\u5883\u5b9e\u9645\u60c5\u51b5\u9009\u62e9\u3002 \uff082\uff09\u901a\u8fc7\u672c\u5730\u56fe\u7247\u8bc6\u522b\u5143\u7d20 - \u53c2\u6570 `input_type` \u4f20\u5165\u56fe\u7247\u683c\u5f0f\uff0c\u6bd4\u5982\u622a\u53d6\u7684\u672c\u5730\u56fe\u7247\u683c\u5f0f\u4e3a `png`\uff0c\u90a3\u4e48 `input_type=\"png\"`\uff0c\u6b64\u65f6\u53c2\u6570 `element ` \u4f20\u5165\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5efa\u8bae\u5b58\u653e\u5728\u5bf9\u5e94\u7684\u4ea7\u54c1 `apps/app/picture/` \u76ee\u5f55\u4e0b\uff0c\u8def\u5f84\u4e3a\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u7684\u76f8\u5bf9\u8def\u5f84\u3002\n- \u4e3e\u4f8b\uff1a`find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))`\uff0c\u8868\u793a\u901a\u8fc7\u672c\u5730\u56fe\u7247 `open.png` \u8bc6\u522b\u5143\u7d20\u3002\n \u53c2\u6570 fill_color_position fill_color_position \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (-1, -1)\uff0c(-1, -1) \u8868\u793a\u53d6\u5c4f\u5e55\u4e2d\u53f3\u4e0b\u89d2\u6700\u540e\u4e00\u4e2a\u50cf\u7d20\u70b9\u4f5c\u4e3a\u586b\u5145\u5750\u6807\uff0c\u5728 1920x1080 \u5c4f\u5e55\u5206\u8fa8\u7387\u4e0b\u5373\u5b9e\u9645\u5750\u6807\u4e3a (1919, 1079) \uff0c\u8fd9\u6837\u7684\u5199\u6cd5\u53ef\u4ee5\u9002\u914d\u4e0d\u540c\u5927\u5c0f\u7684\u5c4f\u5e55\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0d\u540c\u65b9\u4f4d\uff1a \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0b\u65b9\uff0c\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u4e0d\u9700\u8981\u4f20\u5165\u8be5\u53c2\u6570\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u5de6\u8fb9\uff0cfill_color_position=(1, 1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u53f3\u8fb9\uff0cfill_color_position=(-1, -1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0a\u8fb9\uff0cfill_color_position=(1, 1) \u4ece\u684c\u9762\u542f\u52a8\u5e94\u7528\uff0c\u5219\u9700\u8981\u4f20\u5165\u9664\u4efb\u52a1\u680f\u4ee5\u5916\u5176\u4ed6\u4f4d\u7f6e\u7684\u5750\u6807\uff0c\u6bd4\u5982(100, 100)\uff0c\u53ea\u8981\u8fd9\u4e2a\u5750\u6807\u4e3a\u9664\u5e94\u7528\u548c\u4efb\u52a1\u680f\u533a\u57df\u90fd\u53ef\u4ee5\u3002 \u4ece\u542f\u52a8\u5668\u91cc\u9762\u542f\u52a8\u5e94\u7528\uff0c\u9700\u8981\u586b\u5145\u7684\u5750\u6807\u4e3a\u542f\u52a8\u5668\u533a\u57df\u3002 \u6ce8\uff1a\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u65f6\uff0c\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684 icon \u539f\u6587\u4ef6\u4e3a svg \u77e2\u91cf\u56fe\uff0c\u8f6c\u6362\u4e3a png \u4e4b\u540e\u9700\u8981\u586b\u5145\u8fb9\u7f18\u900f\u660e\u90e8\u5206\u3002 \u53c2\u6570 size size \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (25, 70)\uff0c\u8868\u793a\u6d4b\u8bd5\u673a\u4e0a dock \u680f\u4e0a\u5e94\u7528\u56fe\u6807\u7684\u5927\u5c0f\u8303\u56f4\u3002 UOS \u7cfb\u7edf dock \u680f\u662f\u53ef\u4ee5\u4e0a\u4e0b\u62d6\u52a8\u5927\u5c0f\u7684\uff0c\u968f\u7740 dock \u680f\u5927\u5c0f\u6539\u53d8\uff0c\u5e94\u7528\u56fe\u6807\u7684\u8303\u56f4\u4e3a25\u523070\u4e4b\u95f4\u3002 \u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u64cd\u4f5c\u7cfb\u7edf\u4e0a dock \u680f\u5927\u5c0f\u4e0d\u4e00\u6837\uff0c\u53ef\u4ee5\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u4f20\u5165\u5927\u5c0f\u8303\u56f4\u3002 2.2\u3001click_element\u3001 right_click_element\uff0c double_click_element \u8fd9\u51e0\u4e2a\u65b9\u6cd5\u53c2\u6570\u89c4\u5219\u4e0e find_element \u65b9\u6cd5\u4e00\u6837\u3002\u4ed6\u4eec\u5b9e\u9645\u4e0a\u662f\u5728 find_element \u65b9\u6cd5\u57fa\u7840\u4e4b\u4e0a\u505a\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u589e\u52a0\u4e86\u9f20\u6807\u7684\u52a8\u4f5c\uff0c\u5982\u679c\u4f60\u4e0d\u60f3\u4f7f\u7528\u8fd9\u51e0\u4e2a\u65b9\u6cd5\uff0c\u5728\u7528\u4f8b\u4e2d\u4e5f\u53ef\u4ee5\u901a\u8fc7 find_element \u83b7\u53d6\u5230\u5750\u6807\uff0c\u7136\u540e\u5c06\u5750\u6807\u4f20\u5165\u5230\u952e\u9f20\u7684\u65b9\u6cd5\u4e2d\uff0c\u53ef\u4ee5\u5b9e\u73b0\u540c\u6837\u7684\u6548\u679c\u3002 2.3\u3001\u7528\u4f8b\u7c7b\u4e2d\u6709\u4e2a\u7c7b\u53d8\u91cf icon = [\"deepin-album\"] \u9700\u8981\u7279\u6b8a\u8bf4\u660e\uff0c\u5217\u8868\u4e2d\u7684\u5143\u7d20\u4e3a\u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709 icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684 icon \u5230\u670d\u52a1\u7aef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528 desktop \u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684 desktop \u6587\u4ef6\u540d\u4e3a deepin-album.desktop\uff0c\u53ea\u9700\u8981\u5199 deepin-album \u5373\u53ef\uff0c.desktop \u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e03\u3001\u6267\u884c\u5165\u53e3","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"1\u3001\u7528\u4f8b\u7ec4\u7ec7","text":"\u5728 setting/config/server.ini \u6587\u4ef6\u4e2d APP_NAME= \u5b57\u6bb5\u4e3a\u7528\u4f8b\u7684\u6267\u884c\u7684\u76ee\u5f55\uff0c\u9ed8\u8ba4\u4e3a apps \u76ee\u5f55\u4e0b\u6240\u6709\u7528\u4f8b\u3002\u5982\u679c\u4f60\u60f3\u6307\u5b9a\u6267\u884c\u67d0\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4f60\u53ef\u4ee5\u5c06\u8be5\u914d\u7f6e\u9879\u6307\u5b9a\u5230\u5e94\u7528\u7684\u7528\u4f8b\u76ee\u5f55\uff0c\u6bd4\u5982\uff1aAPP_NAME=deepin_album\uff0c \u8868\u793a\u6267\u884c\u76f8\u518c\u76ee\u5f55\u4e0b\u7684\u7528\u4f8b\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a python3 manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music\n -k KEYWORDS, --keywords KEYWORDS\n \u7528\u4f8b\u7684\u5173\u952e\u8bcd\n -t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e\n --log_level LOG_LEVEL \u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n --env {host,docker} \u5728\u5bbf\u4e3b\u673a\u6216\u5bb9\u5668\u73af\u5883\u6267\u884c\n --client_alias \u9009\u62e9\u6d4b\u8bd5\u673a\u522b\u540d, \u53ef\u9009\u9879\u4e3aclient.ini\u4e2d\u5df2\u914d\u7f6e, \u9ed8\u8ba4\u503c\u4e3a zx-x86.\n --count \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a python3 manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\" --env docker\n \u6ce8\uff1a\u5728\u5bb9\u5668\u4e2d\u6267\u884c\u65f6\uff0c\u82e5\u5f3a\u5236\u9000\u51fa\uff0c\u5bb9\u5668\u5e76\u4e0d\u4f1a\u505c\u6b62\u8fd0\u884c\uff01"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_9","title":"\u516b\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1json","title":"1\u3001Json \u62a5\u544a","text":"\u81ea\u7814\u89c6\u9891\u89e3\u6790\u5de5\u5177\u4f1a\u5bf9\u5355\u6761\u7528\u4f8b\u6267\u884c\u4e00\u8f6e\u751f\u6210\u4e00\u4e2a json \u6587\u4ef6\uff0c\u5b58\u653e\u4e8e report/{app_name}/{scene}/{run_num} \u76ee\u5f55\u4e0b\uff0c\u547d\u540d\u683c\u5f0f\u4e3a\uff1a report.json json \u5185\u5bb9\u4e3e\u4f8b\uff1a [\n{\n\"Stab1\": {\n\"images\": [1,2...150,151],\n\"startStub\": 0,\n\"type\": \"Stab\"\n}\n},\n{\n\"Stab2\": {\n\"images\": [152,153...169,170],\n\"startStub\": 1,\n\"type\": \"UnStab\"\n}\n},\n{\n\"Stab3\": {\n\"images\": [171,172...300,301],\n\"startStub\": 0,\n\"type\": \"UnStab\"\n}\n}\n]\n \u8bf4\u660e\uff1a Stab \uff1a\u8868\u793a\u89e3\u6790\u8fc7\u7a0b\u4e2d\u4e0d\u540c\u7684\u9636\u6bb5\u3002 images \uff1a\u8868\u793a\u6bcf\u4e00\u5e27\u7684\u56fe\u7247\u5e8f\u53f7\u3002 startStub\uff1a \u4e3a\u8bc6\u522b\u5c3e\u5e27\u7684\u9636\u6bb5\u8868\u793a\uff0c\u5982\u679c \"startStub\": 1 \uff0c\u8bf4\u660e\u5c3e\u5e27\u51fa\u73b0\u5728\u8be5\u9636\u6bb5\u3002 type\uff1a \u4e3a Stab \u6216 UnStab \uff0c\u8868\u793a\u7a33\u5b9a\u9636\u6bb5\u6216\u4e0d\u7a33\u5b9a\u9636\u6bb5\u3002 \u5404\u9636\u6bb5\u6709\u5e27\u6570\u8865\u507f\uff0c\u9ed8\u8ba4\u8865\u507f\u7684\u5e27\u6570\u4e3a 3 \u5e27\uff08\u53ef\u4ee5\u901a\u8fc7 server.ini \u91cc\u9762 un_stab_start=3 \u8fdb\u884c\u914d\u7f6e\uff09\uff0c\u8868\u793a\u5c0f\u4e8e\u7b49\u4e8e 3 \u5e27\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u524d\u540e\u5747\u9700\u8981\u51cf\u6389\u3002 \u5e94\u7528\u542f\u52a8\u9636\u6bb5\u5c31\u662f\u5728 Stab2 \u9636\u6bb5\uff0c\u542f\u52a8\u65f6\u95f4\u4e3a\uff1a171 \u51cf 151 \u518d\u51cf\u6389\u524d\u540e\u8865\u507f\u5e27\u6570 6 \u5e27\uff0c\u5373 14 \u5e27\uff0c\u89c6\u9891\u5e27\u7387 30 \u5e27/\u79d2\uff0c\u56e0\u6b64\u542f\u52a8\u8017\u65f6\u4e3a\uff1a14 * 33 = 462 ms"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2excel","title":"2\u3001Excel \u62a5\u544a","text":"\u6240\u6709\u7528\u4f8b\u6267\u884c\u5e76\u89e3\u6790\u5b8c\u4e4b\u540e\u4f1a report \u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a\u6c47\u603b\u6570\u636e\u7684 Excel \u6587\u4ef6\uff0c\u6587\u4ef6\u540d\u4e3a\uff1a{time}_perf_time.xlsx\u3002 \u6ce8\u610f\uff0creport \u76ee\u5f55\u4e3a\u53ef\u914d\u7f6e\u9879\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u4f1a\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u751f\u6210\uff0c\u5982\u679c\u4f60\u5c06 report\uff0c\u6307\u5b9a\u5230\u9879\u76ee\u4e0b\u5176\u4ed6\u8def\u5f84\uff0c\u5219\u4f1a\u5728\u5bf9\u5e94\u7684\u8def\u5f84\u4e0b\u751f\u6210 json \u548c Excel \u6587\u4ef6\u3002 \u4f60\u4e5f\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8bfb\u53d6\u6240\u6709 json / excel \u62a5\u544a\u7684\u6570\u636e\uff0c\u751f\u6210\u4f60\u81ea\u5df1\u60f3\u8981\u7684\u4e00\u4e9b\u6d4b\u8bd5\u62a5\u544a\u5f62\u5f0f\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#usb","title":"\u4e5d\u3001USB \u4e32\u53e3\u9a71\u52a8\u952e\u9f20\u65b9\u6cd5","text":"\u4f4d\u4e8e src/utils/control/serial_communication \u76ee\u5f55\u4e0b\u7684 usb_mk.py \u6587\u4ef6 usb_mk = UsbMk()\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up()\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u652f\u6301\u4f20\u5165\u6c49\u5b57\uff0c\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click()\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() \n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() \n \uff084\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() \n \uff085\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() \n \uff086\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() \n \uff087\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff088\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff0810\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_10","title":"\u5341\u3001\u7ee7\u7535\u5668\u63a7\u5236\u4e3b\u673a\u5f00\u673a/\u91cd\u542f","text":"\uff08\u82e5\u4e0d\u4f7f\u7528\u7ee7\u7535\u5668\uff0c\u53ef\u5ffd\u7565\u8be5\u6b65\u9aa4\uff0c\u6267\u884c\u65f6\u4f1a\u901a\u8fc7\u547d\u4ee4 reboot\uff09"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u7ee7\u7535\u5668\u8bbe\u5907","text":"LCUS-2 \u578b \u53cc\u8def USB \u667a\u80fd\u4e32\u53e3\u63a7\u5236\u7ee7\u7535\u5668\u3002 https://item.taobao.com/item.htm?spm=a1z09.2.0.0.41d72e8dUYx2pi&id=582653718178&_u=i25r20ia6a2e "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2usb","title":"2\u3001USB \u5ef6\u957f\u7ebf","text":"\u666e\u901a\u7684 USB \u7ebf\u5373\u53ef\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_3","title":"3\u3001\u675c\u90a6\u7ebf","text":"3.1\u300140P \u6bcd\u5bf9\u516c\u675c\u90a6\u7ebf\u3002 3.2\u3001\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"4\u3001\u5b89\u88c5\u56fe\u6587\u6559\u7a0b","text":"4.1\u3001\u4f7f\u7528 USB \u5ef6\u957f\u7ebf\u8fde\u63a5\u63a7\u5236\u7aef\u548c\u7ee7\u7535\u5668\u3002 4.2\u3001\u5728\u7ee7\u7535\u5668\u5e38\u7aef\u548c\u516c\u5171\u7aef\u5747\u8fde\u63a5\u4e00\u6839\u675c\u90a6\u7ebf\u3002 4.3\u3001\u5728\u4e3b\u677f\u4e0a\u5f00\u673a\u9488\u548c\u91cd\u542f\u9488\u4e0a\u63d2\u4e0a\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 4.4\u3001\u5c06\u5f00\u673a\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76841\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1\u5de6\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 4.5\u3001\u5c06\u91cd\u542f\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76842\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1 \u53f3\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 \u82e5\u60f3\u4fdd\u7559\u539f\u7535\u6e90\u5f00\u5173\u7684\u7535\u6e90\u706f\uff0c\u53ef\u6839\u636e\u5982\u4e0a\u56fe\u6240\u793a\uff0c\u4f7f\u7528\u675c\u90a6\u7ebf\u8fde\u63a5\u4e3b\u677f\u4e0a\u7684\u7535\u6e90\u706f\u548c\u539f\u7535\u6e90\u5f00\u5173"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_11","title":"\u5341\u4e00\u3001\u5e38\u89c1\u95ee\u9898\u8bf4\u660e","text":"1\u3001ERROR: for uos Cannot restart container 2301b1a1395d7959ee6523d61b61c87084649af530786cdb8fb5b3ecbcbd1068: linux runtime spec devices: error gathering device information while adding custom device \"/dev/ttyACM0\": no such file or directory \u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u8fde\u63a5\u72b6\u6001\uff0c\u67e5\u770b /dev/ttyACM0 \u662f\u5426\u5b58\u5728\uff0c\u82e5\u5b58\u5728 /dev/ttyACMn\uff08n\u4e3a\u4efb\u610f\u6570\u5b57\uff09\uff0c\u91cd\u542f\u7535\u8111\u89e3\u51b3\u3002 2\u3001Error response from daemon: Container 5e700fdc769e8c74666d68a7f2bc3de58268b4594cf88706609d59f8dbc7362d is not running \u5bb9\u5668\u542f\u52a8\u5931\u8d25 1\uff09\u68c0\u67e5\u54ea\u4e00\u4e2a\u5bb9\u5668\u672a\u542f\u52a8 sudo docker container ls # \u5217\u51fa\u8fd0\u884c\u4e2d\u7684 Docker \u5bb9\u5668\n 2\uff09\u7f3a\u5c11 uos \u5bb9\u5668\uff0c\u68c0\u67e5 USB \u4e32\u53e3\u8fde\u63a5\u7ebf\u548c\u91c7\u96c6\u76d2\u8fde\u63a5\u7ebf\u662f\u5426\u6b63\u5e38\uff0c\u91cd\u542f\u540e\u6267\u884c bash install/setup.up # \u91cd\u65b0\u5b8c\u6574\u90e8\u7f72\u73af\u5883\n \u6216\u6267\u884c sudo docker-compose up -d --build # \u4ec5\u91cd\u65b0\u6784\u5efa Docker \u955c\u50cf\n 3\u3001\u82e5\u90e8\u7f72\u65f6\u63d0\u793a\u6302\u8f7d ttyACM0\u3001video0 \u5931\u8d25\uff0c\u8bf7\u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u53ca\u91c7\u96c6\u76d2\u662f\u5426\u63a5\u89e6\u826f\u597d\uff0c\u82e5\u63a5\u89e6\u826f\u597d\uff0c\u91cd\u542f\u5373\u53ef\u89e3\u51b3\u3002 4\u3001\u82e5\u51fa\u73b0\u56fe\u7247\u80fd\u8bc6\u522b\uff0c\u4f46\u662f\u9f20\u6807\u672a\u79fb\u52a8\u64cd\u4f5c\u65f6\uff0c\u5b89\u88c5\u7edd\u5bf9\u9f20\u6807\u64cd\u4f5c\u7684\u4f9d\u8d56\u5305\uff0c\u89c1\u7b2c\u4e09\u8282\u7b2c\u4e8c\u5c0f\u8282\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u6d4b\u8bd5\u673a\u3002 5\u3001\u7531\u4e8e\u901a\u8fc7\u91c7\u96c6\u5361\u83b7\u53d6\u7684\u6d4b\u8bd5\u673a\u5b9e\u65f6\u753b\u9762\uff0c\u5305\u542b\u4e86\u9f20\u6807\u7684\u6837\u5f0f\uff0c\u6240\u4ee5\u5bf9\u56fe\u7247\u8bc6\u522b\u65f6\uff0c\u9f20\u6807\u82e5\u505c\u7559\u5728\u56fe\u6807\u4e0a\u5c42\uff0c\u5219\u4f1a\u5bf9\u8bc6\u522b\u7ed3\u679c\u9020\u6210\u5f71\u54cd\uff0c\u9700\u8981\u5c06\u9f20\u6807\u79fb\u52a8\u81f3\u5176\u4ed6\u4f4d\u7f6e\uff0c\u6216\u8005\u9690\u85cf\u9f20\u6807\u89e3\u51b3\u3002 6\u3001Excel \u62a5\u544a\u4e2d\uff0c\u6d4b\u8bd5\u573a\u666f\u5217\u4e0e\u7528\u4f8b\u4e2d\u7684\u4e0d\u4e00\u81f4\uff0c\u5173\u952e\u5b57scene\u3001app_name\u3001\u67b6\u6784\u522b\u540d\uff0c\u4e0d\u80fd\u5305\u542b\u4e0b\u5212\u7ebf\u548c\u82f1\u6587\u7b26\u53f7\u7684\u5706\u62ec\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/","title":"\u6846\u67b6\u529f\u80fd\u4ecb\u7ecd","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2023/1/12\n# Author : Mikigo\n# =============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_2","title":"\u4e00\u3001\u4e00\u53e5\u8bdd\u7b80\u4ecb","text":"\u6b64\u6587\u6863\u4e3b\u8981\u60f3\u5bf9 YouQu \u6846\u67b6\u4e00\u4e9b\u91cd\u70b9\u7684\u529f\u80fd\u505a\u8be6\u7ec6\u7684\u4ecb\u7ecd\uff0c\u5305\u62ec\u5bf9\u4e00\u4e9b\u529f\u80fd\u5f00\u53d1\u7684\u80cc\u666f\u3001\u8981\u89e3\u51b3\u7684\u95ee\u9898\u3001\u5b9e\u73b0\u903b\u8f91\u3001\u4ee3\u7801\u7b49\u65b9\u9762\u7684\u4ecb\u7ecd\uff0c\u4ee5\u6b64\u8ba9\u5927\u5bb6\u80fd\u66f4\u52a0\u6e05\u6670\u7684\u7406\u89e3\u5404\u9879\u529f\u80fd\uff0c\u4ece\u800c\u5728\u4f7f\u7528\u7684\u65f6\u5019\u80fd\u66f4\u52a0\u7684\u5f97\u5fc3\u5e94\u624b\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_3","title":"\u4e8c\u3001\u56fe\u50cf\u8bc6\u522b","text":"\u56fe\u50cf\u8bc6\u522b\u5728 UI \u81ea\u52a8\u5316\u4e2d\u662f\u4e0d\u53ef\u7f3a\u5c11\u7684\uff0c\u5e02\u9762\u4e0a\u751a\u81f3\u6709\u5b8c\u5168\u57fa\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\uff0c\u6bd4\u5982 Airtest\u3001Sikuli \u7b49\uff0c\u5728\u6e38\u620f\u7b49\u7279\u5b9a\u9886\u57df\u4e5f\u6709\u4e0d\u9519\u7684\u6548\u679c\uff0c\u8fd9\u4e9b\u5de5\u5177\u5b9e\u9645\u4e0a\u4e5f\u662f\u7528\u7684 OpenCV \u8fdb\u884c\u4e86\u5c01\u88c5\uff0cYouQu \u6846\u67b6\u57fa\u4e8e OpenCV \u5f00\u53d1\u4e86\u81ea\u5df1\u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\uff0c\u5b83\u53ef\u4ee5\u65b9\u4fbf\u7684\u7528\u4e8e\u754c\u9762\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u65ad\u8a00\uff1b YouQu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u51e0\u4e4e\u6ee1\u8db3\u4e86\u4f60\u7684\u6240\u6709\u8981\u6c42\uff0c\u6211\u4eec\u5728\u957f\u65f6\u95f4\u7684\u601d\u8003\u548c\u6478\u7d22\u4e2d\uff0c\u9488\u5bf9\u5e38\u89c4\u573a\u666f\u53ca\u4e00\u4e9b\u7279\u6b8a\u573a\u666f\u63a2\u7d22\u9664\u4e86\u4e00\u4e9b\u5b9e\u7528\u4e14\u6709\u6548\u7684\u65b9\u6848\uff0c\u4e14\u542c\u6211\u6162\u6162\u9053\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1","title":"1\u3001\u5e38\u89c4\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5e38\u89c4\u8bc6\u522b\u5f88\u597d\u7406\u89e3\uff0c\u4e00\u53e5\u8bdd\u8bb2\u5c31\u662f\uff0c\u8981\u83b7\u53d6\u5230\u76ee\u6807\u5143\u7d20\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u3002 \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u5728\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u9700\u8981\u83b7\u53d6\u7684\u5750\u6807\u662f\u76f8\u5bf9\u4e8e\u6574\u4e2a\u5c4f\u5e55\u7684\u5750\u6807\uff0c\u6211\u4eec\u53ef\u4ee5\u622a\u53d6\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u56fe\u7247\uff08screen\uff09\uff1b \u5728\u5143\u7d20\u8bc6\u522b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u622a\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5c0f\u56fe\u8fdb\u884c\u8bc6\u522b\uff0c\u6bd4\u5982\u622a\u53d6\u64ad\u653e\u6309\u94ae\uff1a \u90a3\u4e48\u5b9e\u9645\u4e0a\uff0c\u5143\u7d20\u5b9a\u4f4d\u7684\u95ee\u9898\u5c31\u8f6c\u6362\u4e3a\uff0c\u5c06\u622a\u56fe\u7684\u5c0f\u56fe\uff08play_btn\uff09\u62ff\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u5927\u56fe\uff08screen\uff09\u4e2d\u53bb\u505a\u5339\u914d\uff0c\u5982\u679c\u5339\u914d\u6210\u529f\uff0c\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff08 x, y \uff09\u5373\u53ef\u3002 \u4e3a\u4e86\u65b9\u4fbf\u63cf\u8ff0\uff0c\u4ee5\u4e0b\u6211\u5c06\u6574\u4e2a\u5c4f\u5e55\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5927\u56fe\uff0c\u67d0\u4e2a\u5143\u7d20\u56fe\u7247\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5c0f\u56fe\u3002 \u57fa\u4e8e OpenCV \u7684\u6a21\u677f\u5339\u914d cv.matchTemplate() \u529f\u80fd\uff0c\u6211\u4eec\u5b9e\u73b0\u4e86\u56fe\u50cf\u5b9a\u4f4d\u7684\u529f\u80fd\uff0c\u6846\u67b6\u63d0\u4f9b\u4e86\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u5e95\u5c42\u63a5\u53e3\uff08\u4e00\u822c\u4e0d\u5bf9\u4e0a\u5c42\u63d0\u4f9b\u8c03\u7528\uff09\uff1a def _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\n# \u8be6\u7ec6\u4ee3\u7801\u592a\u957f\u4e0d\u8d34\u4e86\uff0c\u611f\u5174\u8da3\u8bf7\u67e5\u770b\u6e90\u7801\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001image_path image_path \u662f\u5c0f\u56fe\u7684\u7edd\u5bf9\u8def\u5f84; \u901a\u5e38\u5728 AT \u5de5\u7a0b\u91cc\u9762\uff0c\u6211\u4eec\u7ea6\u5b9a\u5c06\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u5b9e\u9645\u7684\u5143\u7d20\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1aplay_btn.png \uff1b \u7528\u4e8e\u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 case/assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1amusic_001.png \uff1b \u8fd9\u6837\u662f\u4e3a\u4e86\u65b9\u4fbf\u7ba1\u7406\u548c\u7ef4\u62a4\u3002 2\u3001rate \u56fe\u50cf\u8bc6\u522b\u7684\u7684\u5339\u914d\u5ea6\u6216\u8005\u8bf4\u76f8\u4f3c\u5ea6\uff0c\u6846\u67b6\u9ed8\u8ba4\u7684\u914d\u7f6e\u4e3a 0.9\uff0c\u4e5f\u5c31\u662f\u8bf4\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u5b58\u5728\u4e00\u4e2a\u76f8\u4f3c\u5ea6 90% \u7684\u56fe\u6807\u5373\u8fd4\u56de\u5176\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff1b \u5982\u679c\u4f60\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u8c03\u6574\u8bc6\u522b\u5ea6\uff0c\u4f60\u53ef\u4ee5\u5728\u8c03\u7528\u51fd\u6570\u7684\u65f6\u5019\uff0c\u4f20\u5165\u4e0d\u540c\u7684\u8bc6\u522b\u5ea6\u7684\u503c\u3002 3\u3001multiple \u9ed8\u8ba4\u60c5\u51b5\u4e0b multiple=False\uff0c\u8868\u793a\u53ea\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u7b2c\u4e00\u4e2a\uff0c\u5982\u679c multiple=True \u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\uff0c\u56e0\u4e3a\u5927\u56fe\u4e2d\u53ef\u80fd\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u5c0f\u56fe\uff0c\u5728\u67d0\u4e9b\u573a\u666f\u4e0b\u4f60\u53ef\u80fd\u9700\u8981\u5168\u90e8\u83b7\u53d6\u5230\u6240\u6709\u5339\u914d\u5230\u7684\u5750\u6807\u3002 4\u3001picture_abspath \u9ed8\u8ba4\u60c5\u51b5\u4e0b picture_abspath=None \u8868\u793a\u5927\u56fe\u4e3a\u622a\u53d6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u5982\u679c\u4f60\u4e0d\u5e0c\u671b\u5927\u56fe\u662f\u5c4f\u5e55\u7684\u622a\u56fe\uff0c\u800c\u662f\u4f60\u81ea\u5b9a\u4e49\u4f20\u5165\u7684\u67d0\u4e2a\u56fe\u7247\uff0c\u4f60\u53ea\u9700\u8981\u5c06\u4f60\u7684\u56fe\u7247\u8def\u5f84\u4f20\u9012\u7ed9\u8fd9\u4e2a\u53c2\u6570\u5c31\u884c\uff0c\u6bd4\u5982\uff1a picture_abspath=\"~/Desktop/big.png\" \uff1b 5\u3001screen_bbox \u5927\u56fe\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u622a\u53d6\u6574\u4e2a\u5c4f\u5e55\uff0cscreen_bbox = [x, y, w, h] \u53ef\u4ee5\u6307\u5b9a\u622a\u53d6\u5c4f\u5e55\u4e2d\u7684\u56fa\u5b9a\u533a\u57df\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\uff0c\u53ef\u4ee5\u6392\u9664\u90e8\u5206\u533a\u57df\u5bf9\u8bc6\u522b\u7ed3\u679c\u7684\u5f71\u54cd\u3002 \u3010\u9690\u5f0f\u7b49\u5f85\u3011 \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\uff0c\u6709\u65f6\u5019\u9875\u9762\u8df3\u8f6c\u6709\u5ef6\u65f6\uff0c\u6709\u53ef\u80fd\u5b58\u5728\u8bc6\u522b\u7684\u90a3\u4e00\u523b\u9875\u9762\u4e5f\u6ca1\u6709\u8df3\u8f6c\u51fa\u6765\uff0c\u6216\u8005\u6216\u8005\u8bc6\u522b\u7684\u90a3\u4e00\u523b\uff1b \u56e0\u6b64\u6211\u4eec\u9700\u8981\u4e00\u79cd\u7b49\u5f85\u673a\u5236\uff0c\u5373\u5728\u4e00\u5b9a\u7684\u65f6\u95f4\u5185\uff0c\u5982\u679c\u8bc6\u522b\u4e0d\u5230\uff0c\u91cd\u590d\u53bb\u8bc6\u522b\uff1a def find_image(\ncls,\n*widget, rate: [float, int] = None,\nmultiple: bool = False,\nmatch_number: int = None,\npicture_abspath: str = None,\nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u5728\u5c4f\u5e55\u4e2d\u533a\u5bfb\u627e\u5c0f\u56fe\uff0c\u8fd4\u56de\u5750\u6807\uff0c\n \u5982\u679c\u627e\u4e0d\u5230\uff0c\u6839\u636e\u914d\u7f6e\u91cd\u8bd5\u6b21\u6570\uff0c\u6bcf\u6b21\u95f4\u96941\u79d2\n :param widget: \u6a21\u677f\u56fe\u7247\u8def\u5f84\n :param rate: \u76f8\u4f3c\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param match_number: \u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\n :return: \u5750\u6807\u5143\u7ec4\n \"\"\"\nif rate is None:\nrate = float(GlobalConfig.IMAGE_RATE)\ntry:\nfor element in widget:\nfor _ in range((match_number or int(GlobalConfig.IMAGE_MATCH_NUMBER)) + 1):\nlocate = cls._match_image_by_opencv(\nelement,\nrate,\nmultiple=multiple,\npicture_abspath=picture_abspath,\nscreen_bbox=screen_bbox\n)\nif not locate:\nsleep(int(GlobalConfig.IMAGE_MATCH_WAIT_TIME))\nelse:\nreturn locate\nraise TemplateElementNotFound(*widget)\nexcept Exception as e:\nraise e\n \u53c2\u6570 match_number \u7528\u4e8e\u63a7\u5236\u91cd\u590d\u8bc6\u522b\u7684\u6b21\u6570\uff0c\u9ed8\u8ba4\u4e0d\u4f20\u53c2\uff0c\u53d6\u5168\u5c40\u914d\u7f6e setting/globalconfig.ini \u91cc\u9762\u7684 IMAGE_MATCH_NUMBER \u914d\u7f6e\u9879\u7684\u503c\uff0c\u9ed8\u8ba4IMAGE_MATCH_NUMBER = 1\uff0c\u5373\u91cd\u8bd5 1 \u6b21\uff1b find_image \u662f\u6846\u67b6\u63d0\u4f9b\u7684\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u51fd\u6570\u63a5\u53e3\uff0c\u8fd9\u4e2a\u51fd\u6570\u63d0\u4f9b\u4e86\u9690\u5f0f\u7b49\u5f85\u7684\u529f\u80fd\uff0c\u4e14\u5305\u542b\u4e0a\u9762\u4ecb\u7ecd\u7684 _match_image_by_opencv \u51fd\u6570\u7684\u6240\u6709\u529f\u80fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2","title":"2\u3001\u6c14\u6ce1\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u6c14\u6ce1\u8bc6\u522b\u6307\u7684\u662f\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\u8981\u5b9a\u4f4d\u7684\u5143\u7d20\u662f\u4e00\u4e9b\u4f1a\u6d88\u5931\u7684\u5c0f\u5f39\u7a97\uff0c\u8fd9\u7c7b\u573a\u666f\u5728\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\u5c31\u53ef\u80fd\u5b58\u5728\u4e0d\u7a33\u5b9a\u6027\uff0c\u6709\u53ef\u80fd\u56fe\u50cf\u8bc6\u522b\u7684\u65f6\u5019\u6c14\u6ce1\u5df2\u7ecf\u6d88\u5931\u4e86\uff0c\u4e5f\u6709\u53ef\u80fd\u6c14\u6ce1\u51fa\u73b0\u7684\u65f6\u95f4\u592a\u77ed\u4e86\uff0c\u4e0d\u5bb9\u6613\u6355\u6349\u5230\uff0c\u5c31\u50cf\u6c14\u6ce1\u4e00\u6837\uff0c\u51fa\u73b0\u4e00\u4e0b\u5c31\u6d88\u5931\uff0c\u56e0\u6b64\u6211\u4eec\u5f62\u8c61\u7684\u79f0\u4e4b\u4e3a \u201c\u6c14\u6ce1\u8bc6\u522b\u201d\uff1b \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u4e3a\u4e86\u80fd\u7a33\u5b9a\u7684\u8bc6\u522b\u6c14\u6ce1\u7c7b\u573a\u666f\uff0c\u6211\u4eec\u91c7\u7528\u7684\u65b9\u6848\u662f\uff1a \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\uff08\u5305\u542b\u6c14\u6ce1\u4ece\u51fa\u73b0\u5230\u6d88\u5931\uff09\uff0c\u4e0d\u505c\u7684\u622a\u53d6\u8fd9\u6bb5\u65f6\u95f4\u5185\u7684\u5927\u56fe\uff0c\u4ee5\u6b64\u786e\u4fdd\u5728\u622a\u53d6\u7684\u4e00\u5806\u56fe\u7247\u4e2d\uff0c\u80af\u5b9a\u6709\u81f3\u5c11\u4e00\u5f20\u56fe\u7247\u80fd\u6355\u6349\u5230\u6c14\u6ce1\uff0c\u6700\u540e\u518d\u5bf9\u8fd9\u4e00\u5806\u56fe\u7247\u9010\u4e2a\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def get_during(\ncls,\nimage_path: str,\nscreen_time: [float, int],\nrate: float = None,\npause: [int, float] = None,\nmax_range: int = 10000\n):\n\"\"\"\n \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u622a\u56fe\u591a\u5f20\u56fe\u7247\u8fdb\u884c\u8bc6\u522b\uff0c\u5176\u4e2d\u6709\u4e00\u5f20\u56fe\u7247\u8bc6\u522b\u6210\u529f\u5373\u8fd4\u56de\u7ed3\u679c;\n \u9002\u7528\u4e8e\u6c14\u6ce1\u7c7b\u7684\u65ad\u8a00\uff0c\u6bd4\u5982\u6c14\u6ce1\u57281\u79d2\u5185\u6d88\u5931\uff0c\u5982\u679c\u7528\u5e38\u89c4\u7684\u56fe\u50cf\u8bc6\u522b\u5219\u6709\u53ef\u80fd\u65e0\u6cd5\u8bc6\u522b\u5230\uff1b\n :param image_path: \u8981\u8bc6\u522b\u7684\u6a21\u677f\u56fe\u7247\uff1b\n :param screen_time: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff1b\n :param rate: \u8bc6\u522b\u7387\uff1b\n :param pause: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u4e0d\u95f4\u9694\uff1b\n :param max_range: \u622a\u56fe\u7684\u6700\u5927\u6b21\u6570\uff0c\u8fd9\u662f\u4e00\u4e2a\u9884\u8bbe\u503c\uff0c\u4e00\u822c\u60c5\u51b5\u4e0b\u4e0d\u6d89\u53ca\u4fee\u6539\uff1b\n \"\"\"\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001screen_time \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5728\u6b64\u65f6\u95f4\u5185\u4f1a\u4e0d\u65ad\u7684\u8fdb\u884c\u622a\u56fe\u64cd\u4f5c\uff0c\u5c31\u50cf\u5f55\u5236\u89c6\u9891\u4e00\u6837\uff1b 2\u3001pause \u6bcf\u6b21\u622a\u53d6\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u4e00\u523b\u4e0d\u505c\u7684\u622a\u56fe\uff0c\u5982\u679c\u4f60\u60f3\u6bcf\u6b21\u622a\u56fe\u5b58\u5728\u4e00\u4e9b\u95f4\u9694\u65f6\u95f4\u4f20\u5165\u5bf9\u5e94\u7684\u65f6\u95f4\u95f4\u9694\u5373\u53ef\uff0c\u5355\u4f4d\u662f\u79d2\uff0c\u6bd4\u5982\uff1apause = 0.03\uff0c\u8868\u793a 30 ms\uff0c\u76f8\u5f53\u4e8e\u5e27\u7387\u4e3a 30 \u5e27\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-opencv","title":"3\u3001\u4e0d\u4f9d\u8d56 OpenCV \u7684\u56fe\u50cf\u8bc6\u522b\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31","title":"3.1\u3001\u81ea\u7814\u56fe\u50cf\u8bc6\u522b\u6280\u672f","text":"\u3010\u539f\u7406\u3011 \u4e3a\u4e86\u5b9e\u73b0\u8bc6\u522b\u56fe\u50cf\u7684\u76ee\u7684\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u5c06\u56fe\u7247\u7684\u6bcf\u4e2a\u50cf\u7d20\u7684RGB\u503c\uff0c\u4e0e\u6574\u4e2a\u5c4f\u5e55\u4e2d\u7684RGB\u8fdb\u884c\u5bf9\u6bd4\uff0c\u5982\u679c\u5c0f\u56fe\u4e0a\u7684RGB\u503c\u4e0e\u5bf9\u5e94\u5927\u56fe\u4f4d\u7f6e\u7684RGB\u90fd\u76f8\u7b49\uff0c\u5219\u5339\u914d\u6210\u529f\uff0c\u5373\u53ef\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u70b9\u3002 1\u3001\u8bfb\u53d6\u5c0f\u56fe\u548c\u5927\u56fe\u7684RGB\u503c \uff081\uff09\u5c0f\u56fe\u7684RGB\u503c small_data = small_pic.load() # load()\u4f1a\u5c06\u56fe\u7247\u7684RGB\u503c\u83b7\u53d6\u5230\uff0c\u6570\u636e\u683c\u5f0f\u4e3a\u4e00\u4e2a\u4e8c\u7ef4\u5217\u8868\uff0c\u8d4b\u503c\u7ed9\u4e00\u4e2a\u53d8\u91cfsmall_data\u3002\n \uff082\uff09\u5927\u56fe\u7684RGB\u503c big_data = big_pic.load()\n 2\u3001\u5c06\u5c0f\u56fe\u4e0e\u5927\u56fe\u7684RGB\u503c\u8fdb\u884c\u5339\u914d \uff081\uff09\u5339\u914d\u4ece\u5927\u56fe\u7684\u5750\u6807\uff080\uff0c0\uff09\u5f00\u59cb\u5339\u914d\uff0c\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff082\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\uff080\uff0c0\uff09\u5bf9\u5e94\u7684\u6240\u6709\u5c0f\u56fe\u7684RGB\u503c\u4e0d\u76f8\u7b49\uff0c\u5219\u79fb\u52a8\u5230\u4e0b\u4e00\u4e2a\u5750\u6807\u70b9\uff081\uff0c0\uff09\uff0c\u540c\u6837\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff083\uff09\u6309\u7167\u8fd9\u6837\u7684\u89c4\u5f8b\u5c06\u8fd9\u4e00\u884c\u6bcf\u79fb\u52a8\u4e00\u4e2a\u5750\u6807\u70b9\uff0c\u90fd\u5c06\u5c0f\u56fe\u6240\u6709\u7684RGB\u4e0e\u5bf9\u5e94\u5927\u56fe\u7684\u503c\u8fdb\u884c\u5339\u914d\uff1b \uff084\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\u5176\u4e2d\u4e00\u4e2a\u5750\u6807\u70b9\u4e0a\u5339\u914d\u5230\u4e86\u5c0f\u56fe\u7684\u6240\u6709RGB\u503c\uff0c\u5219\u6b64\u65f6\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\u70b9\uff1b \uff085\uff09\u5982\u679c\u5339\u914d\u4e86\u5927\u56fe\u6240\u6709\u7684\u5750\u6807\u70b9\uff0c\u90fd\u6ca1\u6709\u5339\u914d\u5230\uff0c\u5219\u8bf4\u660e\u5927\u56fe\u4e2d\u4e0d\u5b58\u5728\u5c0f\u56fe\uff0c\u5339\u914d\u5931\u8d25\uff1b \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 class ImageRgb:\n@staticmethod\ndef _check_match(_x, _y, small, bdata, sdata, rate):\n\"\"\"\n Matching degree of small graph and large graph matching\n \"\"\"\n@staticmethod\ndef _pre_random_point(small):\n\"\"\"\n Pre matching, take 10-20 points at random each time,\n and take coordinates randomly in the small graph\n \"\"\"\n@staticmethod\ndef _pre_random_match(_x, _y, point_list, bdata, sdata, rate):\n\"\"\"\n In the small graph, several points are randomly\n selected for matching, and the matching degree is\n also set for the random points\n \"\"\"\n@classmethod\ndef match_image_by_rgb(cls, image_name=None, image_path=None, rate=0.9):\n\"\"\"\n By comparing the RGB values of the small image with the large\n image on the screen, the coordinates of the small image on\n the screen are returned.\n \"\"\"\n \u901a\u8fc7 match_image_by_rgb() \u8fd9\u4e2a\u51fd\u6570\uff0c\u4f20\u5165\u76ee\u6807\u5c0f\u56fe\u7684\u6587\u4ef6\u540d\u79f0\uff0c\u5373\u53ef\u8fd4\u56de\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u3002 \u6709\u540c\u5b66\u8981\u95ee\u4e86\uff0c\u6709 OpenCV \u5e72\u561b\u4e0d\u7528\uff0c\u6709\u5fc5\u8981\u81ea\u5df1\u5b9e\u73b0\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u529f\u80fd\u5417\uff0c\u4f60\u4eec\u662f\u4e0d\u662f\u95f2\u7684\u554a\uff1f \u8fd9\u4e48\u95ee\u7684\u8bdd\uff0c\u5c0f\u4e86\uff0c\u683c\u5c40\u5c0f\u4e86\uff1b\u6211\u4eec\u81ea\u5df1\u5b9e\u73b0\u4e3b\u8981\u6709\u51e0\u65b9\u9762\u539f\u56e0\uff1a \u51cf\u5c11\u73af\u5883\u4f9d\u8d56\uff0c\u5373\u4e0d\u7528\u5b89\u88c5 OpenCV\uff0c\u6211\u4eec\u4e5f\u80fd\u5b9e\u73b0\u5176\u529f\u80fd\uff0c\u73af\u5883\u4f9d\u8d56\u8fd9\u5757\u540e\u9762\u4f1a\u5355\u72ec\u8be6\u7ec6\u8bb2\uff0c\u51cf\u5c11\u73af\u5883\u4f9d\u8d56\u5bf9\u4e8e\u4efb\u4f55\u8f6f\u4ef6\u5de5\u7a0b\u90fd\u975e\u5e38\u91cd\u8981\uff1b OpenCV \u5728\u5176\u4ed6\u56fd\u4ea7 CPU \u67b6\u6784\u4e0a\u5b89\u88c5\u5e76\u4e0d\u80fd\u4fdd\u8bc1100%\u6210\u529f\uff0c\u751a\u81f3\u6709\u6ca1\u6709\u53ef\u80fd\u5728\u4e00\u4e9b\u67b6\u6784\u4e0a\u538b\u6839\u513f\u5c31\u4e0d\u80fd\u5b89\u88c5\u4f7f\u7528 OpenCV \uff1f \u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 OpenCV \uff1f\u5c31\u50cf\u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 Windows \u5462\uff1f\u8fd9\u4e9b\u95ee\u9898\u503c\u5f97\u601d\u8003\u3002 \u5f53\u7136\uff0c\u6211\u4eec\u627f\u8ba4\u8fd9\u5957\u65b9\u6848\uff0c\u867d\u7136\u8bc6\u522b\u51c6\u786e\u7387\u6ca1\u95ee\u9898\uff0c\u4f46\u5728\u8bc6\u522b\u6548\u7387\u4e0a\u8fd8\u6ca1\u6709\u8fbe\u5230 OpenCV \u6a21\u677f\u5339\u914d\u7684\u6548\u679c\uff0c\u6211\u4eec\u7684\u65b9\u6848\u6bcf\u6b21\u8bc6\u522b\u5728 1.5s \u5de6\u53f3\uff0c\u800c OpenCV \u5728 1s \u5de6\u53f3\uff1b \u6574\u4f53\u8bc6\u522b\u6548\u679c\u6765\u8bb2\uff0c\u6211\u8ba4\u4e3a\u8fd8\u662f\u53ef\u4ee5\u63a5\u53d7\u7684\uff0c\u4e5f\u5e0c\u671b\u6709\u5fd7\u4e4b\u58eb\u80fd\u4e00\u8d77\u4f18\u5316\u6b64\u65b9\u6848\uff0c\u4e00\u8d77\u6280\u672f\u62a5\u56fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32-rpc","title":"3.2\u3001\u57fa\u4e8e RPC \u670d\u52a1\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b","text":"\u5728\u8fdc\u7a0b\u670d\u52a1\u5668\u4e0a\u90e8\u7f72 OpenCV \u7684\u73af\u5883\uff0c\u5e76\u5c06\u5176\u90e8\u7f72\u4e3a RPC \u670d\u52a1\uff0c\u6d4b\u8bd5\u673a\u4e0a\u4e0d\u7528\u5b89\u88c5 OpenCV \u4f9d\u8d56\uff0c\u800c\u662f\u901a\u8fc7\u8bf7\u6c42 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u3010\u539f\u7406\u3011 \u6d4b\u8bd5\u673a\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u56fe\u7247\u4ee5\u53ca\u6a21\u677f\u56fe\u7247\uff0c\u53d1\u9001\u7ed9 RPC \u670d\u52a1\u7aef\uff0c\u670d\u52a1\u7aef\u62ff\u5230\u4e24\u5f20\u56fe\u7247\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u6700\u540e\u5c06\u8bc6\u522b\u7ed3\u679c\u8fd4\u56de\u7ed9\u6d4b\u8bd5\u673a\uff1b \u8981\u7279\u6b8a\u8bf4\u660e\u7684\u662f\uff1a RPC \u662f\u4e00\u79cd\u534f\u8bae\uff0c\u8bb8\u591a\u8bed\u8a00\u90fd\u662f\u652f\u6301\u7684\uff0c\u6bd4\u5982\u8bf4\u670d\u52a1\u7aef\u4e5f\u53ef\u4ee5\u7528 C++ \u6765\u5b9e\u73b0\uff0c\u5ba2\u6237\u7aef\u4f7f\u7528 Python \u4e5f\u662f\u53ef\u4ee5\u8c03\u7528\u7684\u3002 \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 \u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nimport cv2 as cv\nimport numpy as np\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\nif __name__ == \"__main__\":\nserver = ThreadXMLRPCServer((\"x.x.x.x\", 8889), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(match_image_by_opencv, \"match_image_by_opencv\")\nserver.serve_forever()\n \u8fd9\u6837\uff0c\u6211\u4eec\u57fa\u4e8e Python \u6807\u51c6\u5e93 xmlrpc \u642d\u5efa\u4e86\u4e00\u4e2a RPC \u670d\u52a1\u5668\uff0c\u6ce8\u518c\u4e86 image_put \u548c match_image_by_opencv \u4e24\u4e2a\u529f\u80fd\u63a5\u53e3\uff0c\u5728\u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u901a\u8fc7 IP \u548c\u7aef\u53e3\u8fdb\u884c RPC \u8bf7\u6c42\uff1b \u5ba2\u6237\u7aef\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from xmlrpc.client import Binary\nfrom xmlrpc.client import ServerProxy\nserver = ServerProxy(GlobalConfig.OPENCV_SERVER_HOST, allow_none=True)\nscreen_rb = open(screen, \"rb\")\ntemplate_rb = open(template_path, \"rb\")\ntry:\nscreen_path = server.image_put(Binary(screen_rb.read()))\nscreen_rb.close()\ntpl_path = server.image_put(Binary(template_rb.read()))\ntemplate_rb.close()\nreturn server.match_image_by_opencv(\ntpl_path, screen_path, rate, multiple\n)\nexcept OSError as exc:\nraise EnvironmentError(\nf\"RPC\u670d\u52a1\u5668\u94fe\u63a5\u5931\u8d25. {GlobalConfig.OPENCV_SERVER_HOST}\"\n) from exc\n \u901a\u8fc7\u8fd4\u56de server.match_image_by_opencv \u5c31\u83b7\u53d6\u4e86\u5728\u670d\u52a1\u7aef\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4","title":"4\u3001\u53f3\u952e\u83dc\u5355\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41","title":"4.1\u3001\u53f3\u952e\u83dc\u5355\u5b9a\u4f4d\u7684\u65b9\u6848\u53ca\u95ee\u9898","text":"\u53f3\u952e\u83dc\u5355\u7684\u5143\u7d20\u5b9a\u4f4d\u662f\u4e00\u4e2a\u96be\u70b9\uff0c\u8fc7\u53bb\u6211\u4eec\u8c03\u7814\u548c\u4f7f\u7528\u8fc7\u7684\u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u65b9\u6cd5\u6709 4 \u79cd\uff1a \u7b2c\u4e00\u79cd\uff1a\u6b65\u957f\u64cd\u4f5c\u6cd5 \u5728\u53f3\u952e\u83dc\u5355\u547c\u51fa\u6765\u4e4b\u540e\uff0c\u901a\u8fc7\u952e\u76d8\u7684 up\u3001down \u6309\u952e\uff0c\u8fdb\u884c\u9009\u62e9\u83dc\u5355\u9009\u62e9\uff0c\u9009\u4e2d\u76ee\u6807\u4e4b\u540e enter \u5373\u53ef\uff1b\u6bd4\u5982\uff1a\u5728\u684c\u9762\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\uff0c\u6309 1 \u6b21 down \uff0c\u4f1a\u51fa\u73b0\u4e0b\u56fe\uff1a \u7ee7\u7eed\u518d\u6309 2 \u6b21 down\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u518d\u6309 enter\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u5982\u6b64\uff0c\u201c\u6392\u5e8f\u65b9\u5f0f\u201d\u7684\u6b65\u957f\u4e3a 3\uff1b\u901a\u8fc7\u4f7f\u7528\u952e\u76d8\u4e0a\u4e0b\u952e\uff0c\u5c31\u5b9e\u73b0\u4e86\u5bf9\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\uff1b \u4f46\u662f\uff0c\u8fd9\u79cd\u65b9\u5f0f\u6709\u4e2a\u5f88\u70e6\u4eba\u7684\u95ee\u9898\uff0c\u5c31\u662f\u53f3\u952e\u83dc\u5355\u7684\u9009\u9879\u4f4d\u7f6e\u4e0d\u53ef\u80fd\u4e00\u76f4\u4e0d\u53d8\uff0c\u5728\u9700\u6c42\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\uff0c\u83dc\u5355\u9009\u9879\u7684\u53d8\u5316\u662f\u5f88\u5927\u7684\uff0c\u751a\u81f3\u6709\u4e9b\u5e94\u7528\u652f\u6301\u81ea\u5b9a\u4e49\u83dc\u5355\uff0c\u6bd4\u5982\u6587\u7ba1\u53f3\u952e\u83dc\u5355\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff1b \u4e5f\u5c31\u662f\u8bf4\u4f60\u5f97\u7ecf\u5e38\u53bb\u7ef4\u62a4\u83dc\u5355\u9009\u9879\u7684\u6b65\u957f\uff0c\u4e00\u4e2a\u9009\u9879\u73b0\u5728\u7684\u6b65\u957f\u662f 3\uff0c\u4e0b\u4e2a\u8fed\u4ee3\u53ef\u80fd\u5c31\u662f 4 \u6216\u8005 5\u3002 \u7b2c\u4e8c\u79cd\uff1a\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u6cd5 \u628a\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5355\u72ec\u622a\u56fe\u4fdd\u5b58\uff0c\u56fe\u7247\u4e2d\u4ec5\u5305\u542b\u4e00\u4e2a\u83dc\u5355\u9009\u9879\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u8fd9\u6837\uff0c\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5c31\u53ef\u4ee5\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u65b9\u5f0f\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u8fd9\u79cd\u65b9\u5f0f\u4e0d\u7528\u62c5\u5fc3\u83dc\u5355\u9009\u9879\u7684\u987a\u5e8f\u6216\u4f4d\u7f6e\uff0c\u4f46\u662f\u9700\u8981\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff0c\u4e14\u5bb9\u6613\u53d7\u5230\u5b57\u4f53 UI \u53d8\u66f4\u7c7b\u9700\u6c42\u7684\u5f71\u54cd\uff0c\u6bd4\u5982\uff1a\u5b57\u4f53\u5927\u5c0f\u3001\u5b57\u4f53\u95f4\u8ddd\u7b49\u7b49\u9700\u6c42\u53d8\u66f4\u90fd\u4f1a\u5f71\u54cd\uff0c\u6bcf\u6b21\u53d8\u66f4\u4e4b\u540e\u5c31\u9700\u8981\u8fdb\u884c\u5927\u91cf\u56fe\u7247\u8d44\u6e90\u7684\u91cd\u65b0\u622a\u56fe\u66ff\u6362\uff0c\u662f\u4e2a\u6bd4\u8f83\u9ebb\u70e6\u7684\u4e8b\u60c5\uff1b \u7b2c\u4e09\u79cd\uff1a\u76f8\u5bf9\u4f4d\u79fb\u6cd5 \u9f20\u6807\u70b9\u51fb\u53f3\u952e\u7684\u65f6\u5019\uff0c\u9f20\u6807\u7684\u5f53\u524d\u5750\u6807\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u7684\uff0c\u83dc\u5355\u9009\u9879\u7684\u5bbd\uff08 w \uff09\u4e00\u822c\u662f\u56fa\u5b9a\u7684\uff0c\u53d8\u5316\u7684\u662f\u83dc\u5355\u7684\u957f\u5ea6\uff08 h \uff09\uff0c\u53ef\u4ee5\u901a\u8fc7\u67d0\u4e2a\u9009\u9879\u76f8\u5bf9\u4e8e\u9f20\u6807\u7684\u8ddd\u79bb\u5728\u786e\u5b9a\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u901a\u8fc7\u7ef4\u62a4\u83dc\u5355\u9009\u9879\uff08\u76f8\u5bf9\u4f4d\u7f6e\uff09\u76f8\u5bf9\u4e8e\u9f20\u6807\u4f4d\u7f6e\u7684\u8ddd\u79bb\uff0c\u5373\u53ef\u8f7b\u677e\u8ba1\u7b97\u51fa\u83dc\u5355\u9009\u9879\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\u3002 \u4ece\u7406\u8bba\u4e0a\u6b64\u65b9\u6848\u662f\u53ef\u884c\u7684\uff0c\u4f46\u662f\u8fd9\u91cc\u4ecd\u7136\u5b58\u5728\u4e24\u4e2a\u4e25\u91cd\u7684\u95ee\u9898\uff1a \u83dc\u5355\u987a\u5e8f\u6539\u53d8\uff0c\u5bfc\u81f4\u76f8\u5bf9\u8ddd\u79bb\u6539\u53d8\uff0c\u800c\u4e14\u8ddd\u79bb\u662f\u901a\u8fc7\u50cf\u7d20\uff08px\uff09\u6765\u8868\u793a\u7684\uff0c\u4e0d\u60f3\u6b65\u957f\u90a3\u4e48\u53ea\u7ba1\uff0c\u6bcf\u6b21\u9700\u8981\u53bb\u91cf\u4e00\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u70b9\u9ebb\u70e6\uff1b \u9f20\u6807\u5728\u684c\u9762\u4e0d\u540c\u4f4d\u7f6e\u70b9\u51fb\u53f3\u952e\uff0c\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u4f4d\u7f6e\u662f\u4e0d\u540c\u7684\uff0c\u4e0a\u56fe\u7684\u83dc\u5355\u662f\u5728\u9f20\u6807\u7684\u5de6\u4e0b\u65b9\uff0c\u5982\u679c\u4f60\u79fb\u52a8\u9f20\u6807\u5230\u5c4f\u5e55\u56db\u8fb9\uff0c\u4f60\u4f1a\u53d1\u73b0\uff0c\u53f3\u952e\u83dc\u5355\u53ef\u80fd\u51fa\u73b0\u5728\u9f20\u6807\u7684\u56db\u4e2a\u65b9\u5411\uff0c\u4e5f\u5c31\u662f\u8bf4\u4f60\u9700\u8981\u6839\u636e\u9f20\u6807\u7684\u4e0d\u540c\u4f4d\u7f6e\u6765\u5224\u65ad\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u65b9\u5411\uff0c\u800c\u4e0d\u540c\u7684\u65b9\u5411\u4e0a\u8ba1\u7b97\u65b9\u6cd5\u662f\u4e0d\u540c\u7684\uff0c\u6bd4\u5982\uff1a\u53f3\u952e\u83dc\u5355\u5728\u9f20\u6807\u7684\u5de6\u4e0a\uff0c\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\u8ba1\u7b97\u65b9\u6cd5\u4e3a\uff08x - w / 2\uff0c y - h\uff09\uff0c\u8fd9\u6837\u7ef4\u62a4\u8d77\u6765\u53ef\u4ee5\u8bf4\u975e\u5e38\u590d\u6742\uff1b \u57fa\u4e8e\u4ee5\u4e0a\u4e24\u4e2a\u539f\u56e0\uff0c\u6211\u4eec\u5e76\u4e0d\u63a8\u8350\u8fd9\u79cd\u64cd\u4f5c\u65b9\u6848\u3002 \u7b2c\u56db\u79cd\uff1a\u5c5e\u6027\u5b9a\u4f4d \u6709\u540c\u5b66\u8bf4\u5e72\u561b\u4e0d\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u5462\uff0c\u5176\u5b9e\uff0c\u6211\u4eec\u6700\u5f00\u59cb\u60f3\u5230\u7684\u65b9\u6848\u5c31\u662f\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\uff0c\u4f46\u662f\u5728\u5c5e\u6027\u7684 DOM \u6811\u91cc\u600e\u4e48\u4e5f\u627e\u4e0d\u5230\uff0c\u65e0\u6cd5\u5b9a\u4f4d\u5230\uff0c\u6211\u4eec\u4e5f\u8054\u5408\u7814\u53d1\u540c\u5b66\u4e00\u8d77\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u4f46\u6700\u7ec8\u8fd8\u662f\u6ca1\u80fd\u89e3\u51b3\uff0c\u975e\u5e38\u9057\u61be\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42","title":"4.2\u3001\u6700\u65b0\u7684\u53f3\u952e\u83dc\u5355\u7ec8\u6781\u89e3\u51b3\u65b9\u6848","text":"\u7531\u4e8e\u53f3\u952e\u83dc\u5355\u9009\u9879\u51e0\u4e4e\u90fd\u662f\u6587\u672c\uff0c\u90a3\u4e48\u901a\u8fc7 OCR \u8bc6\u522b\uff0c\u51e0\u4e4e\u662f\u6700\u4f18\u7684\u65b9\u6848\uff1a \u4e0d\u7528\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff1b \u4e0d\u4f1a\u53d7\u5230\u83dc\u5355\u9009\u9879\u987a\u5e8f\u6539\u53d8\u7684\u5f71\u54cd\uff1b \u4e0d\u4f1a\u53d7\u5230\u5b57\u4f53 UI \u53d8\u5316\u7684\u5f71\u54cd\uff1b \u5173\u4e8e OCR \u8bc6\u522b\u6211\u4eec\u5728\u540e\u9762\u4f1a\u8be6\u7ec6\u8bb2\u5230\uff0c\u672c\u7ae0\u8282\u4e3b\u8981\u8bb2\u57fa\u4e8e OCR \u8bc6\u522b\uff0c\u6211\u4eec\u5728\u53f3\u952e\u83dc\u5355\u8bc6\u522b\u4e0a\u7684\u7a81\u7834\u548c\u521b\u65b0\uff1b \u4f7f\u7528 OCR \u8bc6\u522b\u53f3\u952e\u83dc\u5355\u867d\u7136\u5df2\u7ecf\u5f88\u5b8c\u7f8e\u4e86\uff0c\u4f46\u662f\u5728\u4e00\u4e9b\u60c5\u51b5\u4e0b\u4ecd\u7136\u5b58\u5728\u4e00\u70b9\u95ee\u9898\uff0c\u5c31\u662f\u5c4f\u5e55\u4e2d\u51fa\u73b0\u591a\u4e2a\u548c\u83dc\u5355\u9009\u9879\u6587\u5b57\u76f8\u540c\u7684\u6587\u5b57\u65f6\uff0c\u6bd4\u5982\u4e0b\u9762\u8fd9\u79cd\u60c5\u51b5\uff1a \u5c4f\u5e55\u6070\u597d\u51fa\u73b0\u4e86\u4e24\u4e2a\u201c\u590d\u5236\u201d\uff0c\u6b64\u65f6\u8981\u5b9a\u4f4d\u5230\u83dc\u5355\u4e2d\u7684 \u201c\u590d\u5236\u201d\uff0c\u5c31\u9700\u8981\u8fdb\u4e00\u6b65\u505a\u6570\u636e\u5904\u7406\uff0c\u6bd4\u5982\uff1aOCR \u8fd4\u56de 2 \u4e2a\u201c\u590d\u5236\u201d\u7684\u5750\u6807\uff0c\u7528\u4f8b\u91cc\u9762\u6765\u5224\u65ad\u7528\u54ea\u4e2a\uff0c\u4ece\u4e1a\u52a1\u4e0a\u5c06\u5904\u7406\u8d77\u6765\u6bd4\u8f83\u9ebb\u70e6\uff0c\u56e0\u4e3a\u4f60\u5f97\u660e\u786e\u77e5\u9053\u83dc\u5355\u5728\u5de6\u8fb9\u8fd8\u662f\u53f3\u8fb9\uff0c\u7136\u540e\u8fd9\u672c\u8eab\u5c31\u662f\u4e0d\u786e\u5b9a\u7684\uff1b \u600e\u4e48\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u5462\uff0c\u8fd9\u5c31\u8981\u8bf4\u9053\u672c\u7ae0\u7684\u4e3b\u9898\uff1a\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b\u3002 \u3010\u539f\u7406\u3011 \u5728\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u524d\u622a\u4e00\u5f20\u56fe\uff0c\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\u518d\u622a\u53d6\u4e00\u5f20\u56fe\uff0c\u4e24\u5f20\u56fe\u552f\u4e00\u53d8\u5316\u7684\u5c31\u662f\u53f3\u952e\u83dc\u5355\uff0c\u5c06\u5176\u4ed6\u76f8\u540c\u7684\u5730\u65b9\u90fd\u5c4f\u853d\u6389\uff0c\u53ea\u7559\u4e0b\u83dc\u5355\u754c\u9762\uff0c\u5982\u6b64\u5373\u53ef\u6d88\u9664\u5e72\u6270\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u5c06\u4e24\u79cd\u56fe\u505a\u524d\u540e\u5bf9\u6bd4\u63d0\u53d6\u53ef\u4ee5\u5f97\u5230\u8fd9\u6837\u7684\u56fe\uff1a \u4f60\u770b\uff0c\u901a\u8fc7\u524d\u540e\u56fe\u7247\u7684\u5bf9\u6bd4\uff0c\u5c06\u76f8\u540c\u7684\u90e8\u5206\u7ed9\u6d88\u9664\u6389\uff0c\u518d\u8fdb\u884c OCR \u8bc6\u522b\uff0c\u8fd9\u6837\u5c31\u4e0d\u4f1a\u6709\u5e72\u6270\u4e86\uff1b \u4ee3\u7801\u5b9e\u73b0\u8bf7\u67e5\u770b src/filter_image.py \uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def filter_image(action):\n\"\"\"\n \u5bf9\u6bd4\u52a8\u4f5c\u524d\u540e\u4e24\u5f20\u56fe\u7247\uff0c\u63d0\u53d6\u4e0d\u540c\u7684\u90e8\u5206\u751f\u6210\u4e00\u5f20\u65b0\u7684\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u65b0\u56fe\u7247\u7684\u8def\u5f84\n :param action: \u52a8\u4f5c\u51fd\u6570\u7684\u51fd\u6570\u5bf9\u8c61\n :return: \u65b0\u56fe\u7247\u7684\u8def\u5f84\n \"\"\"\n action \u662f\u9f20\u6807\u4e8b\u4ef6\uff0c\u56e0\u4e3a\u6b64\u7c7b\u573a\u666f\u4e0d\u4ec5\u4ec5\u5728\u53f3\u952e\u5b58\u5728\uff0c\u5355\u51fb\u3001\u53cc\u51fb\u7b49\u7b49\uff0c\u53ea\u8981\u64cd\u4f5c\u524d\u540e\u540e\u53d8\u5316\u7684\u90fd\u53ef\u4ee5\uff1a from src.mouse_key import MouseKey\naction = (\nMouseKey.click,\nMouseKey.right_click,\nMouseKey.double_click,\nMouseKey.move_to,\n)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5","title":"5\u3001\u52a8\u6001\u56fe\u50cf\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5728\u684c\u9762\u58c1\u7eb8\u5207\u6362\uff0c\u6216\u770b\u56fe\u3001\u76f8\u518c\u5207\u6362\u56fe\u7247\u7c7b\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u7531\u4e8e\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u662f\u4e0d\u56fa\u5b9a\u7684\uff08\u4e0d\u540c\u7248\u672c\u7684\u7cfb\u7edf\u58c1\u7eb8\u4e0d\u540c\u3001\u58c1\u7eb8\u987a\u5e8f\u4e0d\u540c\uff0c\u770b\u56fe\u76f8\u518c\u5728\u56fe\u7247\u8d44\u6e90\u4e0d\u4e00\u5b9a\u56fa\u5b9a\uff09\uff0c\u90a3\u4e48\u5728\u6d4b\u8bd5\u5207\u6362\u58c1\u7eb8\u6216\u8005\u5207\u6362\u56fe\u7247\u7684\u573a\u666f\u65f6\u5c31\u4f1a\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u4f60\u4e0d\u77e5\u9053\u9884\u671f\u662f\u5565\uff0c\u7528\u4f8b\u64cd\u4f5c\u52a8\u6001\u7684\uff0c\u4e5f\u662f\u6781\u4e0d\u7a33\u5b9a\u3002 \u3010\u539f\u7406\u3011 \u5728\u5207\u6362\u56fe\u7247\u4e4b\u524d\u622a\u56fe\u4fdd\u5b58\u5e76\u8fd4\u56de\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u6b21\u8bc6\u522b\u8fd9\u5f20\u56fe\u7247\uff0c\u5982\u679c\u4e0d\u5b58\u5728\uff0c\u8bf4\u660e\u56fe\u7247\u5df2\u7ecf\u5207\u6362\u4e86\uff1b \u793a\u610f\u56fe\uff1a \u8fd9\u6837\uff0c\u6211\u4eec\u622a\u53d6\u4e86\u5f53\u524d\u56fe\u7247\u4e2d\u6bd4\u8f83\u6709\u4ee3\u8868\u6027\u7684\u4f4d\u7f6e\uff08\u4e00\u53ea\u9e1f\uff09\uff0c\u5728\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u7528\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1a \u6211\u4eec\u518d\u62ff\u7740\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd9\u6837\u5728\u5f53\u524d\u56fe\u7247\u4e2d\uff0c\u5c31\u4e0d\u80fd\u627e\u5230\u8fd9\u53ea\u9e1f\u4e86\uff0c\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u662f False\uff0c\u90a3\u4e48\u4e5f\u5c31\u53ef\u4ee5\u5224\u65ad\u56fe\u7247\u5207\u6362\u662f\u6210\u529f\u7684\u3002 \u4ee3\u7801\u793a\u610f\uff1a def save_temporary_picture(_x: int, _y: int, width: int, height: int):\n\"\"\"\n \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u56fe\u7247\u8def\u5f84\n :param x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n :param y: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n :param width: \u5bbd\u5ea6\n :param height: \u9ad8\u5ea6\n :return: \u56fe\u7247\u8def\u5f84\n \"\"\"\n \u6b64\u51fd\u6570\u7528\u4e8e\u5728\u64cd\u4f5c\u4e4b\u524d\u622a\u56fe\u4e00\u5f20\u4e34\u65f6\u56fe\u7247\uff0c\u8fd4\u56de\u56fe\u7247\u8def\u5f84\uff0c\u6700\u540e\u5728\u65ad\u8a00\u7684\u65f6\u5019\u518d\u5c06\u56fe\u7247\u8def\u5f84\u4f5c\u4e3a\u53c2\u6570\u4f20\u5165\u65ad\u8a00\u8bed\u53e5\u5373\u53ef\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ui","title":"\u4e09\u3001\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_1","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u662f\u6211\u4eec\u81ea\u7814\u7684\u4e00\u79cd\u4f7f\u7528\u7b80\u5355\uff0c\u4e14\u6548\u7387\u6781\u9ad8\u3001\u7a33\u5b9a\u6027\u597d\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u57fa\u4e8e\u5143\u7d20\u6309\u94ae\u5728\u5e94\u7528\u4e2d\u7684\u76f8\u5bf9\u4f4d\u7f6e\uff0c\u52a8\u6001\u83b7\u53d6\u5143\u7d20\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff0c\u9002\u7528\u4e8e\u5404\u79cd\u5c4f\u5e55\u5206\u8fa8\u7387\uff08\u5305\u62ec\u9ad8\u5206\u5c4f\u3001\u5bbd\u5c4f\u3001\u5e26\u9c7c\u5c4f\uff09\uff0c\u5f53\u5143\u7d20\u6309\u94ae\u4f4d\u7f6e\u76f8\u5bf9\u4e8e\u5e94\u7528\u754c\u9762\u4f4d\u7f6e\u53d1\u751f\u4fee\u6539\u4e4b\u540e\uff0c\u53ea\u9700\u8981\u6839\u636e UI \u8bbe\u8ba1\u56fe\u4e0a\u7684\u6e90\u6570\u636e\u4fee\u6539\u5bf9\u5e94\u5750\u6807\u6570\u636e\u5c31\u597d\uff0c\u7ef4\u62a4\u975e\u5e38\u7684\u65b9\u4fbf\u3002 \u6b64\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u9002\u7528\u4e8e\u4e00\u4e9b\u5143\u7d20\u4f4d\u7f6e\u76f8\u5bf9\u4e0e\u5e94\u7528\u754c\u9762\u6bd4\u8f83\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u97f3\u4e50\uff0899% \u7684\u5143\u7d20\u5b9a\u4f4d\u91c7\u7528\u8fd9\u79cd\uff0c\u6548\u679c\u975e\u5e38\u597d\uff09\uff0c\u4e0d\u9002\u7528\u4e8e\u754c\u9762\u4e0d\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u622a\u56fe\u5f55\u5c4f\uff0c\u5f88\u660e\u663e\u4e0d\u9002\u7528\u4e8e\u8fd9\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u3002\u8fd9\u79cd\u5168\u65b0\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u6709\u5b83\u7684\u9002\u7528\u6761\u4ef6\uff0c\u5982\u679c\u4f60\u53d1\u73b0\u4f7f\u7528\u5e38\u89c4\u7684\uff08\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u5b9a\u4f4d\uff09\u4e0d\u597d\u505a\u65f6\uff0c\u4e0d\u59a8\u8003\u8651\u4f7f\u7528\u8fd9\u79cd\uff0c\u5176\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff0c\u5e76\u4e14\u8fc5\u901f\u7231\u4e0a\u4ed6\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_1","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5728 UI \u8bbe\u8ba1\u56fe\u4e2d\u6211\u4eec\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u8fb9\u6846\u7684\u8ddd\u79bb\u7684\uff0c\u7136\u540e\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u6280\u672f\u624b\u6bb5\u83b7\u53d6\u5230\u5e94\u7528\u754c\u9762\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u53ca\u5e94\u7528\u7a97\u53e3\u7684\u5927\u5c0f\uff0c\u793a\u610f\u56fe\u5982\u4e0b\uff1a \uff08x1, y1\uff09\u4e3a\u5e94\u7528\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\uff1b\uff08x2, y2\uff09\u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u5de6\u4e0a\u89d2\uff08x1, y1\uff09\u7684\u5750\u6807\uff0c\u90a3\u4e48\u5b9e\u9645\u4e0a\u3010\u64ad\u653e\u6240\u6709\u3011\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\u4e3a\uff1a\uff08 x1 + x2, y1 + y2 \uff09\uff1b \u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5927\u5c0f\uff08w2, h2\uff09\uff0c\u53ef\u4ee5\u4ece UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\uff1b \u5728 UI \u8bbe\u8ba1\u7a3f\u4e0a\u70b9\u51fb\u3010\u64ad\u653e\u6240\u6709\u3011\u56fe\u6807\uff0c\u7136\u540e\u79fb\u52a8\u9f20\u6807\u5c31\u5c31\u53ef\u4ee5\u770b\u5230\u4e0a\u56fe\u7684\u53c2\u8003\u7ebf\u53ca\u6570\u636e\uff1b \u6240\u4ee5\uff0c\u6211\u4eec\u53ef\u4ee5\u8f7b\u677e\u7684\u83b7\u53d6\u5230\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u4e2d\u5fc3\u5750\u6807\u4e3a\uff1a\uff08 x1 + x2 + (w2 / 2), y1 + y2 + ( h2 / 2) \uff09 \u8be6\u7ec6\u6e90\u4ee3\u7801\u8bf7\u67e5\u770b AT \u57fa\u7840\u6846\u67b6: src/button_center.py \u83b7\u53d6\u5e94\u7528\u7a97\u53e3\u7684\u4fe1\u606f \u4f7f\u7528 xdotool \u548c xwininfo \u83b7\u53d6\u5230\u5e94\u7528\u7a97\u53e3\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u5de6\u4e0a\u89d2\uff09\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a app_id = CmdCtl.run_cmd(f\"xdotool search --classname --onlyvisible {self.app_name}\"\n).split(\"\\n\")\napp_id_list = [int(_id) for _id in app_id if _id]\nreturn CmdCtl.run_cmd(f\"xwininfo -id {app_id_list[self.number]}\")\n \u4f7f\u7528\u6b63\u5219\u83b7\u53d6\u7a97\u53e3\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u83b7\u53d6\u914d\u7f6e \u8bfb ini \u914d\u7f6e\u6587\u4ef6\uff0c\u83b7\u53d6\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e0e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a conf = ConfigParser()\nconf.read(self.config_path)\ndirection = conf.get(btn_name, \"direction\")\nposition = [int(i.strip()) for i in conf.get(btn_name, \"location\").split(\",\")]\n \u8ba1\u7b97\u5143\u7d20\u6309\u94ae\u5750\u6807 \u6839\u636e\u5e94\u7528\u7a97\u53e3\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u5927\u5c0f\u3001\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u5927\u5c0f\uff0c\u4f7f\u7528\u4e00\u5b9a\u7684\u7b97\u6cd5\u5373\u53ef\u8ba1\u7b97\u51fa\u5143\u7d20\u6309\u94ae\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u4e2d\u5fc3\u5750\u6807\uff09\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3","title":"3\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u3010\u914d\u7f6e\u65b9\u6cd5\u3011 \u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u7684\u6570\u636e\u6e90\u662f\u5e94\u7528\u5e93\u4e2d\u7684 ui.ini \u914d\u7f6e\u6587\u4ef6\uff1a ;section\n[\u65b0\u5efa\u6b4c\u5355+] ;key = value\ndirection = left_top\nlocation = 180, 268, 21, 21\n section \u662f\u4f60\u6839\u636e\u5bf9\u5e94\u7684\u5143\u7d20\u6309\u94ae\u547d\u540d\uff0c\u4f60\u53ef\u4ee5\u4efb\u610f\u547d\u540d\uff0c\u4f46\u6700\u597d\u6709\u5177\u4f53\u542b\u4e49\uff0c\u4e14\u80fd\u660e\u786e\u8868\u793a\u8fd9\u4e2a\u5143\u7d20\u6309\u94ae\u7684\u540d\u79f0\uff1b\u7528\u4e2d\u62ec\u53f7\u62ec\u8d77\u6765\u5c31\u884c\uff0c\u6bd4\u5982\uff1a[\u65b0\u5efa\u6b4c\u5355+] \uff1b direction \u662f\u914d\u7f6e\u8be5\u5143\u7d20\u7684\u53c2\u8003\u7cfb\uff0c\u5206\u522b\u4e3a\uff1a left_top \u5de6\u4e0a\uff1b left_bottom \u5de6\u4e0b\uff1b right_top \u53f3\u4e0a\uff1b right_bottom \u53f3\u4e0b\uff1b \u53c2\u8003\u7cfb\u7684\u9009\u53d6\u6807\u51c6\uff1a\u62c9\u52a8\u6539\u53d8\u7a97\u53e3\u5927\u5c0f\u65f6\uff0c\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u53c2\u8003\u7cfb\u4f4d\u7f6e\u662f\u4e0d\u53d8\u7684\uff1b location \u662f\u8be5\u5143\u7d20\u6309\u94ae\u7684\u76f8\u5bf9\u4e0e\u53c2\u8003\u7cfb\u7684 x, y \u7684\u8ddd\u79bb\uff0c\u53ca\u5927\u5c0f(w, h)\uff0c\u8fd9\u56db\u4e2a\u6570\u636e\u53ef\u4ee5\u901a\u8fc7 UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\u6570\u636e\uff0c\u5728\u7f16\u8f91\u6a21\u5f0f\u4e0b\uff0c\u70b9\u51fb UI \u56fe\u4e0a\u7684\u6309\u94ae\uff0c\u53f3\u4fa7\u5c31\u4f1a\u51fa\u73b0\u8be5\u5143\u7d20\u6309\u94ae\u7684 x, y, w, h \u6570\u636e\u3002 \u5982\u679c UI \u56fe\u4e0a\u6ca1\u6709\u63d0\u4f9b\u4f60\u60f3\u8981\u7684\u5143\u7d20\u6570\u636e\uff0c\u4f60\u53ef\u4ee5\u76f4\u63a5\u5728\u7cfb\u7edf\u4e2d\u4f7f\u7528\u622a\u56fe\u5f55\u5c4f\u8fdb\u884c\u5c3a\u91cf\uff0c\u8fd9\u662f\u4e00\u79cd\u4e0d\u63a8\u8350\u4f46\u80fd\u7528\u7684\u65b9\u6cd5\u3002 \u3010\u8c03\u7528\u65b9\u6cd5\u3011 \u5728\u5e94\u7528\u5e93\u65b9\u6cd5\u5c42\u8fd9\u6837\u5199\uff1a def click_add_music_list_btn_in_music_by_ui(self):\n\"\"\"\u70b9\u51fb\u65b0\u5efa\u6b4c\u5355\u6309\u94ae\"\"\"\nself.click(*self.ui.btn_center(\"\u65b0\u5efa\u6b4c\u5355+\"))\n self.ui.btn_center() \u662f\u56fa\u5b9a\u5199\u6cd5\uff0c\u53c2\u6570\u5c31\u662f\u914d\u7f6e\u91cc\u9762\u7684 section \u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ocr","title":"\u56db\u3001OCR \u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_2","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 OCR \u65b9\u6848\u5927\u591a\u91c7\u7528\u8c37\u6b4c OCR\uff08Tesseract\uff09\u65b9\u6848\uff0c\u4f46\u662f\u5b83\u5bf9\u4e8e\u4e2d\u6587\u7684\u8bc6\u522b\u975e\u5e38\u5dee\uff0c\u7ecf\u8fc7\u5927\u91cf\u7684\u8c03\u7814\uff0c\u6211\u4eec\u4f7f\u7528 PaddleOCR\uff0c\u5b83\u662f\u4e00\u4e2a\u5f00\u6e90\u7684\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u8bc6\u522b\u5de5\u5177\uff0c\u4e5f\u662f PaddlePaddle \u6700\u6709\u540d\u7684\u4e00\u4e2a\u5f00\u6e90\u9879\u76ee\uff0c\u611f\u5174\u8da3\u7684\u53ef\u4ee5\u70b9\u8fd9\u91cc\u4e86\u89e3\uff0c\u591a\u7684\u4e0d\u8bf4\u4e86\uff0c\u4f60\u53ea\u9700\u8981\u77e5\u9053\u5b83\u5c31\u662f\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_2","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5b89\u88c5\u4ed6\u662f\u4e2a\u5f88\u9ebb\u70e6\u7684\u4e8b\u60c5\uff0c\u867d\u7136\u64cd\u4f5c\u5f88\u7b80\u5355\uff0c\u4f46\u5176\u5b9e\u5b89\u88c5\u5305\u6709\u70b9\u5927\uff0c\u56e0\u6b64\u6211\u4eec\u4e0d\u5e0c\u671b\u76f4\u63a5\u5728 env.sh \u4e2d\u52a0\u5165\u5b83\uff0c\u8fd9\u4f1a\u8ba9\u6574\u4e2a\u81ea\u52a8\u5316\u73af\u5883\u53d8\u5f97\u975e\u5e38\u81c3\u80bf\uff1b \u56e0\u6b64\uff0c\u6211\u4eec\u60f3\u5230\u5c06\u5b83\u505a\u6210\u4e00\u4e2a RPC \u670d\u52a1\u5728\u5176\u4ed6\u673a\u5668\u4e0a\u90e8\u7f72\uff0c\u6d4b\u8bd5\u673a\u901a\u8fc7\u8fdc\u7a0b\u8c03\u7528 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u4f7f\u7528\u5b83\uff1b RPC \u7684\u8c03\u7528\u903b\u8f91\uff1a \u8fd9\u6837\u6211\u4eec\u53ea\u9700\u8981\u5728\u670d\u52a1\u7aef\u90e8\u7f72\u597d OCR \u8bc6\u522b\u7684\u670d\u52a1\uff0c\u7136\u540e\u901a\u8fc7 RPC \u670d\u52a1\u5c06\u529f\u80fd\u63d0\u4f9b\u51fa\u6765\uff0c\u6846\u67b6\u91cc\u9762\u53ea\u9700\u8981\u8c03\u7528\u5bf9\u5e94\u7684 RPC \u63a5\u53e3\u5c31\u884c\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_1","title":"3\u3001\u4f7f\u7528\u8bf4\u660e","text":"\u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nfrom paddleocr import PaddleOCR\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef paddle_ocr(pic_path, lang):\n\"\"\"\n Paddleocr\u76ee\u524d\u652f\u6301\u7684\u591a\u8bed\u8a00\u8bed\u79cd\u53ef\u4ee5\u901a\u8fc7\u4fee\u6539lang\u53c2\u6570\u8fdb\u884c\u5207\u6362\n \u4f8b\u5982`ch`, `en`, `fr`, `german`, `korean`, `japan`\n :param file_name:\n :param lang:\n :return:\n \"\"\"\nif __name__ == \"__main__\":\nIP = popen(\"hostname -I\").read().split(\" \")[0]\nPORT = 8890\nSCREEN_CACHE = \"/tmp/screen.png\"\nserver = ThreadXMLRPCServer((IP, PORT), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(paddle_ocr, \"paddle_ocr\")\nprint(\"\u76d1\u542c\u5ba2\u6237\u7aef\u8bf7\u6c42\u3002\u3002\")\nserver.serve_forever()\n \u6846\u67b6\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from src import OCR\nOCR.ocr(*target_strings, picture_abspath=None, similarity=0.6, return_default=False, return_first=False, lang=\"ch\"):\n# \u901a\u8fc7 OCR \u8fdb\u884c\u8bc6\u522b\u3002\n# target_strings:\n# \u76ee\u6807\u5b57\u7b26,\u8bc6\u522b\u4e00\u4e2a\u5b57\u7b26\u4e32\u6216\u591a\u4e2a\u5b57\u7b26\u4e32,\u5e76\u8fd4\u56de\u5176\u5728\u56fe\u7247\u4e2d\u7684\u5750\u6807;\n# \u5982\u679c\u4e0d\u4f20\u53c2\uff0c\u8fd4\u56de\u56fe\u7247\u4e2d\u8bc6\u522b\u5230\u7684\u6240\u6709\u5b57\u7b26\u4e32\u3002\n# picture_abspath: \u8981\u8bc6\u522b\u7684\u56fe\u7247\u8def\u5f84\uff0c\u5982\u679c\u4e0d\u4f20\u9ed8\u8ba4\u622a\u53d6\u5168\u5c4f\u8bc6\u522b\u3002\n# similarity: \u5339\u914d\u5ea6\u3002\n# return_default: \u8fd4\u56de\u8bc6\u522b\u7684\u539f\u751f\u6570\u636e\u3002\n# return_first: \u53ea\u8fd4\u56de\u7b2c\u4e00\u4e2a,\u9ed8\u8ba4\u4e3a False,\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u6240\u6709\u6570\u636e\u3002\n# lang: `ch`, `en`, `fr`, `german`, `korean`, `japan`\n \u6b64\u65b9\u6848\u5728\u6846\u67b6\u5185\u6ca1\u6709\u5f15\u5165\u4efb\u4f55\u4e09\u65b9\u4f9d\u8d56\u5b8c\u5168\u91c7\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\uff0c\u800c\u4e14\u4f7f\u7528\u65b9\u6cd5\u975e\u5e38\u7b80\u5355\uff0c\u53ea\u9700\u8981\u901a\u8fc7 OCR.ocr() \u5373\u53ef\uff1b \u5bf9\u4e8e\u4e00\u4e9b\u6587\u6848\u7684\u573a\u666f\u975e\u5e38\u9002\u7528\uff0c\u6b64\u65b9\u6cd5\u76f4\u63a5\u8fd4\u56de\u5750\u6807\uff0c\u53ef\u4ee5\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u3002 \u4e5f\u53ef\u4ee5\u7528\u4e8e\u6587\u5b57\u65ad\u8a00\uff0c\u4ee3\u7801\u793a\u610f\uff1a def assert_ocr_exist(\n*args, picture_abspath=None, similarity=0.6, return_first=False, lang=\"ch\"\n):\n\"\"\"\u65ad\u8a00\u6587\u6848\u5b58\u5728\"\"\"\npic = None\nif picture_abspath is not None:\npic = picture_abspath + \".png\"\nres = OCR.ocr(\n*args,\npicture_abspath=pic,\nsimilarity=similarity,\nreturn_first=return_first,\nlang=lang,\n)\nif res is False:\nraise AssertionError(\n(f\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{args}\", f\"{pic if pic else GlobalConfig.SCREEN_CACHE}\")\n)\nif isinstance(res, tuple):\npass\nelif isinstance(res, dict) and False in res.values():\nres = filter(lambda x: x[1] is False, res.items())\nraise AssertionError(\n(\nf\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{dict(res)}\",\nf\"{pic if pic else GlobalConfig.SCREEN_CACHE}\",\n)\n)\n \u5728\u7528\u4f8b\u4e2d\u4f7f\u7528\u65ad\u8a00\uff0c\u793a\u4f8b\uff1a def test_font_manager_021(self):\n\"\"\"\u53f3\u4fa7\u2665-\u6536\u85cf/\u53d6\u6d88\u6536\u85cf\u5b57\u4f53\"\"\"\n# \u5b57\u4f53\u7ba1\u7406\u5668\u754c\u9762\u53f3\u4fa7\u8be6\u60c5\u5217\u8868\uff0c\u9009\u62e9\u672a\u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e / \u6536\u85cf\u5b57\u4f53\n# \u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e\u83dc\u5355\u663e\u793a\u201c\u53d6\u6d88\u6536\u85cf\u201d\uff1b\n...\nself.assert_ocr_exist(\"\u53d6\u6d88\u6536\u85cf\")\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_1","title":"4\u3001\u670d\u52a1\u7aef\u90e8\u7f72","text":"\u6211\u4eec\u76ee\u524d\u662f\u5c06 OCR \u670d\u52a1\u90e8\u7f72\u5728\u666e\u901a\u7684\u529e\u516c\u673a\u4e0a\u7684\uff0c\u5982\u679c\u4f60\u89c9\u5f97\u73b0\u6709\u7684 OCR \u8bc6\u522b\u6027\u80fd\u4e0d\u591f\u597d\uff0c\u6070\u597d\u4f60\u6709\u66f4\u597d\u7684\u673a\u5668\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u5176\u79c1\u6709\u5316\u90e8\u7f72\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41_1","title":"4.1\u3001\u73af\u5883\u5b89\u88c5","text":"\u63a8\u8350\u4f7f\u7528 pipenv \u8fdb\u884c\u73af\u5883\u642d\u5efa\uff1b \u5b89\u88c5 pipenv \uff1a sudo pip3 install pipenv\n \u65b0\u5efa\u4e00\u4e2a\u76ee\u5f55\u4f5c\u4e3a\u73af\u5883\u5305 ocr_env\uff1a cd ~\nmkdir ocr_env\n \u521b\u5efa python 3.7 \u73af\u5883\uff1a cd ocr_env\npipenv --python 3.7\n \u5b89\u88c5 OCR \u4f9d\u8d56\u5305\uff1a pipenv install paddlepaddle -i https://mirror.baidu.com/pypi/simple\npipenv install \"paddleocr>=2.0.1\" -i https://mirror.baidu.com/pypi/simple\n \u4e0d\u51fa\u610f\u5916\uff0c\u8fd9\u6837\u5c31\u628a\u4f9d\u8d56\u5b89\u88c5\u597d\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42_1","title":"4.2\u3001\u542f\u52a8\u670d\u52a1","text":"\u5c06\u57fa\u7840\u6846\u67b6\u4e2d\u7684 scr/ocr/pdocr_rpc_server.py \u6587\u4ef6\u62f7\u8d1d\u5230 ocr_env \u76ee\u5f55\uff0c\u540e\u53f0\u6267\u884c\u5b83\u5c31\u597d\u4e86\uff1a cd ocr_env\nnohup pipenv run python pdocr_rpc_server.py &\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#43","title":"4.3\u3001\u914d\u7f6e\u5f00\u673a\u81ea\u542f\uff08\u901a\u7528\uff09","text":"\u4f60\u80af\u5b9a\u4e0d\u60f3\u6bcf\u6b21\u673a\u5668\u91cd\u542f\u4e4b\u540e\u90fd\u9700\u8981\u624b\u52a8\u542f\u52a8\u670d\u52a1\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u914d\u7f6e\u5f00\u673a\u81ea\u542f\u3002 \u5199\u5f00\u673a\u81ea\u542f\u670d\u52a1\u6587\u4ef6\uff1a sudo vim /lib/systemd/system/ocr.service\n autoocr \u540d\u79f0\u4f60\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff0c\u5199\u5165\u4ee5\u4e0b\u5185\u5bb9\uff1a [Unit]\nDescription=OCR Service\nAfter=multi-user.target\n\n[Service]\nUser=uos\nGroup=uos\nType=idle\nWorkingDirectory=/home/uos/ocr_env\nExecStart=pipenv run python pdocr_rpc_server.py\n\n[Install]\nWantedBy=multi-user.target\n \u6ce8\u610f\u66ff\u6362\u4f60\u7684${USER} \u4fee\u6539\u914d\u7f6e\u6587\u4ef6\u7684\u6743\u9650\uff1a sudo chmod 644 /lib/systemd/system/ocr.service\n \u81ea\u542f\u670d\u52a1\u751f\u6548\uff1a sudo systemctl daemon-reload\nsudo systemctl enable ocr.service\n \u67e5\u770b\u670d\u52a1\u72b6\u6001\uff1a sudo systemctl status ocr.service\n \u4f60\u53ef\u4ee5\u518d\u91cd\u542f\u4e0b\u7535\u8111\uff0c\u770b\u770b\u670d\u52a1\u662f\u4e0d\u662f\u6b63\u5e38\u542f\u52a8\u4e86\uff0c\u6ca1\u62a5\u9519\u5c31 OK \u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_4","title":"\u4e94\u3001\u5c5e\u6027\u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_3","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 UI \u81ea\u52a8\u5316\u5927\u591a\u90fd\u662f\u57fa\u4e8e\u6d4f\u89c8\u5668\u7684\uff0c\u6838\u5fc3\u662f\u5728\u7f51\u9875\u7684 DOM \u6811\u4e0a\u67e5\u627e\u5143\u7d20\uff0c\u5e76\u5bf9\u5176\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\uff1b Linux \u684c\u9762\u5e94\u7528\u5927\u591a\u662f\u91c7\u7528 Qt \u7f16\u5199\u7684\uff0c\u5728 Qt \u4e2d\u4e5f\u662f\u4ece\u6700\u9876\u5c42\u7684 MainWindow \u5f00\u59cb\u6784\u5efa\u5e94\u7528\uff0c\u6240\u4ee5\u903b\u8f91\u4e5f\u662f\u4e00\u6837\u7684\uff0cQt \u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u540c\u6837\u53ef\u4ee5\u901a\u8fc7 DOM \u6811\uff08\u5c5e\u6027\u6811\uff09\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff0c\u6211\u4eec\u79f0\u4e4b\u4e3a\u5c5e\u6027\u5b9a\u4f4d\u3002 \u501f\u52a9\u5f00\u6e90\u5de5\u5177 dogtail \u6211\u4eec\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u83b7\u53d6\uff0c\u4ece\u800c\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\u3002dogtail \u7684\u9879\u76ee\u4ecb\u7ecd\u53ef\u4ee5\u731b\u6233\u8fd9\u91cc\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_3","title":"2\u3001\u4f7f\u7528\u65b9\u6cd5","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#21sniff","title":"2.1\u3001sniff\uff08\u55c5\u63a2\u5668\uff09\u4f7f\u7528","text":"\u5728\u7ec8\u7aef\u8f93\u5165 sniff \u542f\u52a8 AT-SPI Browser mikigo@mikigo-PC:~$ sniff\n \u67e5\u770b\u5e94\u7528\u7684\u6807\u7b7e \u5728 sniff \u91cc\u9762\u53ef\u4ee5\u770b\u5230\u7cfb\u7edf\u4e2d\u5df2\u542f\u52a8\u7684\u5e94\u7528\uff0c\u70b9\u51fb\u5e94\u7528\u540d\u79f0\u524d\u9762\u7684\u4e09\u89d2\u5f62\u56fe\u6807\uff0c\u53ef\u4ee5\u5c55\u5f00\u5e94\u7528\u7684\u6807\u7b7e\uff0c\u6240\u6709\u6807\u7b7e\u4ee5 tree \u7684\u5f62\u5f0f\u5c55\u793a\uff0c\u5bf9\u5e94\u5e94\u7528\u91cc\u9762\u7684\u7236\u7a97\u53e3\u548c\u5b50\u7a97\u53e3\u3002 \u83b7\u53d6\u5143\u7d20\u63a7\u4ef6\u7684\u6807\u7b7e\u540d\u79f0 \u9996\u5148\uff0c\u4e3a\u4e86\u65b9\u4fbf\u67e5\u770b\u5143\u7d20\u63a7\u4ef6\u5bf9\u5e94\u7684\u4f4d\u7f6e\uff0c\u5efa\u8bae\u73b0\u5728\u4e0a\u65b9\u5de5\u5177\u680f\u70b9\u51fb Actions\uff0c\u7136\u540e\u52fe\u9009 Hightlight Items\uff0c\u8fd9\u6837\u5728 sniff \u4e2d\u9f20\u6807\u9009\u4e2d\u5143\u7d20\u6807\u7b7e\u7684\u65f6\u5019\uff0c\u5e94\u7528\u4e2d\u4f1a\u6709\u76f8\u5e94\u7684\u5149\u6807\u9501\u5b9a\u3002 \u5728 sniff \u91cc\u9762\u70b9\u51fb\u8fdb\u5165\u5e94\u7528\u7684\u6807\u7b7e tree \u4e2d\u540e\uff0c\u70b9\u51fb\u76f8\u5e94\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5728\u5de5\u5177\u4e0b\u65b9\uff0c\u4f1a\u5c55\u793a\u5143\u7d20\u63a7\u4ef6\u7684 Name\uff0c\u8fd9\u4e2a\u5c31\u662f\u6807\u7b7e\u540d\u79f0\u3002 \u5728 tree \u4e2d\u6709\u4e9b\u5730\u65b9\u662f\u7a7a\u767d\u7684\u6216\u8005\u662f Form\uff0c\u662f\u56e0\u4e3a\u5f00\u53d1\u4eba\u5458\u5728\u6dfb\u52a0\u6807\u7b7e\u7684\u65f6\u5019\u6ca1\u6709\u6dfb\u52a0\uff0c\u6216\u8005\u6709\u4e9b\u7236\u7a97\u53e3\u4e0d\u9700\u8981\u6dfb\u52a0\uff0c\u8fd9\u79cd\u5728\u5b9e\u9645\u4e1a\u52a1\u4e2d\u662f\u4e0d\u5f71\u54cd\u7684\uff0c\u6211\u4eec\u53ea\u8981\u4fdd\u8bc1\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\u4e2d\uff0c\u8981\u7528\u5230\u7684\u5143\u7d20\u90fd\u6dfb\u52a0\u4e86\u6807\u7b7e\u5373\u53ef\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#22","title":"2.2\u3001\u5143\u7d20\u64cd\u4f5c","text":"\u83b7\u53d6\u5e94\u7528\u5bf9\u8c61 dogtail \u83b7\u53d6\u5e94\u7528\u5bf9\u8c61\u7684\u65f6\u5019\uff0c\u4f7f\u7528\u7684\u662f tree \u5e93\u91cc\u9762\u7684 application() \u65b9\u6cd5\uff1a from dogtail.tree import root\napp_obj = root.application('deepin-music')\n app_obj\u5c31\u662f\u5e94\u7528\u7684\u5bf9\u8c61\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\uff0c\u662f\u5e94\u7528\u5bf9\u8c61\u4f7f\u7528child()\u65b9\u6cd5\uff1a element = app_obj.child('element_name')\n \u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u4f20\u5165\u5143\u7d20\u7684 Name\uff0c\u83b7\u53d6\u5230\u76f8\u5e94\u5143\u7d20\u7684\u5bf9\u8c61\u3002Name \u53ef\u4ee5\u901a\u8fc7 sniff \u67e5\u770b\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\u5217\u8868: element_list = element.children\n \u83b7\u53d6\u5230\u8fd9\u4e2a\u5143\u7d20\u4e0b\u9762\u6240\u6709\u7684\u5143\u7d20\u5217\u8868\u3002 \u8fd9\u4e2a\u65b9\u6cd5\u9002\u7528\u4e8e\u6709\u4e9b\u6807\u7b7e\u6ca1\u6709\u6dfb\u52a0\uff0c\u4f46\u662f\u4f4d\u7f6e\u662f\u56fa\u5b9a\u7684\uff0c\u6211\u4eec\u901a\u8fc7\u7d22\u5f15\u53ef\u4ee5\u53d6\u5f97\u5143\u7d20\u3002 element_list[0]\n \u5bf9\u5143\u7d20\u7684\u64cd\u4f5c \u5728\u83b7\u53d6\u5230\u5143\u7d20\u4e4b\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u76f8\u5e94\u7684\u64cd\u4f5c\u3002 \u5355\u51fb element.click(button=1)\n button 1 \u2014>\u5de6\u952e\uff0c2 \u2014>\u6eda\u8f6e\uff0c3 \u2014>\u53f3\u952e\uff0c\u9ed8\u8ba4\u4e3a 1 \u53cc\u51fb element.doubleClick(button=1)\n \u9f20\u6807\u60ac\u505c element.point()\n \u9f20\u6807\u79fb\u52a8\u5230\u5143\u7d20\u4e2d\u5fc3\u4f4d\u7f6e \u6587\u672c\u8f93\u5165 element.typeText(string)\n \u5411\u5143\u7d20\u5bf9\u8c61\u8f93\u5165\u5b57\u7b26\u4e32 \uff0c\u6bd4\u5982\u8f93\u5165\u6846 \u7ec4\u5408\u952e element.keyCombo(comboString)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#23","title":"2.3\u3001\u6846\u67b6\u5c01\u88c5","text":"\u4ee3\u7801\u793a\u4f8b\uff1a # \u8be6\u7ec6\u4ee3\u7801\u8bf7\u67e5\u770b src/dogtail_utils.py\nclass DogtailUtils:\ndef __init__(self, name=None, description=None):\nself.name = name\nself.description = description\nself.obj = root.application(self.name, self.description)\ndef app_element(self, *args, **kwargs):\n\"\"\"\n \u83b7\u53d6app\u5143\u7d20\u7684\u5bf9\u8c61\n :return: \u5143\u7d20\u7684\u5bf9\u8c61\n \"\"\"\nreturn self.obj.child(*args, **kwargs, retry=False)\ndef element_center(self, element) -> tuple:\n\"\"\"\n \u83b7\u53d6\u5143\u7d20\u7684\u4e2d\u5fc3\u4f4d\u7f6e\n :param element:\n :return: \u5143\u7d20\u4e2d\u5fc3\u5750\u6807\n \"\"\"\n_x, _y, _w, _h = self.app_element(element).extents\n_x = _x + _w / 2\n_y = _y + _h / 2\nreturn _x, _y\n \u6846\u67b6\u63d0\u4f9b\u7684\u63a5\u53e3\u975e\u5e38\u7b80\u6d01\uff0c\u5728\u8c03\u7528\u65f6\uff1a self.dog.element_center(\"\u64ad\u653e\")\n \u8fd9\u6837\u5c31\u80fd\u83b7\u53d6\u5230\u6b64\u5143\u7d20\u7684\u4e2d\u5fc3\u5750\u6807\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_5","title":"\u516d\u3001\u6807\u7b7e\u5316\u7ba1\u7406","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_4","title":"1\u3001\u6807\u7b7e\u8bf4\u660e","text":"\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u811a\u672c ID\uff1a\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c/\u51fd\u6570 ID\uff1b PMS\u7528\u4f8bID\uff1aPMS \u4e0a\u5bf9\u5e94\u7684\u7528\u4f8b ID\uff08\u7528\u4f8b\u5e93 ID\uff09\uff1b \u9ed8\u8ba4\u4f7f\u7528\u7528\u4f8b\u5e93 ID\uff0c\u5bf9\u4e8e\u6682\u65f6\u6ca1\u6709\u4f7f\u7528\u7528\u4f8b\u5e93\u7ba1\u7406\u7528\u4f8b\u7684\u9879\u76ee\uff0c\u53ef\u4ee5\u4f7f\u7528\u4ea7\u54c1\u5e93\u7528\u4f8b ID\uff1b \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1aFUNC\uff08\u529f\u80fd\uff09\u3001API\uff08\u63a5\u53e3\uff09\u3001BASELINE\uff08\u57fa\u7ebf\uff09\u3001PERF\uff08\u6027\u80fd\uff09\u3001STR\uff08\u538b\u529b\uff09\u3001SEC\uff08\u5b89\u5168\uff09\u3001CTS\uff08\u517c\u5bb9\u6027\uff09 \u4e0a\u7ebf\u5bf9\u8c61\uff1aCICD\uff0c\u8868\u793a\u4e0a\u7ebf\u5230 CICD \u6d41\u6c34\u7ebf\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u53ef\u4e00\u952e\u751f\u6210 case_list.csv \u6587\u4ef6\uff0c\u7528\u4e8e\u5bfc\u5165\u5230\u660e\u9053\u4e91 AT \u7528\u4f8b\u5217\u8868\u4e2d\u63a7\u5236 CICD \u8dd1\u6d4b\u8303\u56f4\uff1b \u6d4b\u8bd5\u7ea7\u522b\uff1aC1 / C2 / C3 / C4\uff0c\u5177\u4f53\u5b9a\u4e49\u53c2\u8003\u6d41\u6c34\u7ebf\u4f7f\u7528\u6307\u5bfc\uff1b \u8df3\u8fc7\u539f\u56e0\uff1askip-XXX\uff0c\u7528\u4e8e\u63a7\u5236\u7528\u4f8b\u662f\u5426\u6267\u884c\uff1b \u786e\u8ba4\u4fee\u590d\uff1afixed-XXX\uff0c\u7528\u4e8e\u6807\u8bb0\u7528\u4f8b\u7684\u4fee\u590d\u72b6\u6001\uff08\u540e\u9762\u8be6\u7ec6\u8bb2\u89e3\u7528\u6cd5\uff09\uff1b \u5e9f\u5f03\u7528\u4f8b\uff1aremoved-\u5df2\u5e9f\u5f03\uff0c\u7528\u4e8e\u6807\u8bb0\u5df2\u7ecf\u5e9f\u5f03\u7684\u7528\u4f8b\uff0c\u6b64\u7528\u4f8b\u6807\u7b7e\u4e0d\u4f1a\u88ab\u6dfb\u52a0\uff0c\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff1b \u793a\u4f8b\uff1a \u811a\u672cID PMS\u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u4e0a\u7ebf\u5bf9\u8c61 \u6d4b\u8bd5\u7ea7\u522b \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b ... 001 679537 L1 FUNC CICD C1 skip-XXX fixed-XXX removed-\u5df2\u5e9f\u5f03 ..."},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_4","title":"2\u3001\u64cd\u4f5c\u6b65\u9aa4","text":"2.1\u3001\u5728\u5b50\u9879\u76ee\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u4ee5\u7528\u4f8b\u7684 py \u6587\u4ef6\u9664\u53bb\u9996\u5b57\u7b26\u4e32 \"test_\" \u548c\u7528\u4f8b\u5e8f\u53f7\u540e\u7684\u5b57\u7b26\u4e32\u4f5c\u4e3a csv \u7684\u6587\u4ef6\u540d\u3002 \u4f8b\u5982: \u76f8\u518c\u7684\u7528\u4f8b\u6587\u4ef6\u4e3a test_album_xxx.py\uff0cxxx \u8868\u793a\u4efb\u610f\u4e09\u4f4d\u6570\u5b57\u4ee3\u8868\u7528\u4f8b\u5e8f\u53f7\uff0c\u6b64\u65f6 csv \u6587\u4ef6\u540d\u5c31\u5e94\u4e3a album.csv\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u6240\u6709 csv \u6587\u4ef6\u5efa\u8bae\u653e\u5728\u4e00\u4e2a tags \u76ee\u5f55\u4e0b\u3002 \u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 2.2\u3001\u7b2c\u4e00\u5217\u4e3a\u811a\u672c ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b\u7528\u4f8b\u6807\u7b7e\u53ef\u4ee5\u65e0\u5e8f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_2","title":"3\u3001\u589e\u52a0\u8bf4\u660e","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_1","title":"3.1\u3001\u8df3\u8fc7\u7528\u4f8b","text":"\u4f20\u7edf\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668(@pytest.mark.skip)\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a; \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#311","title":"3.1.1\u3001\u56fa\u5b9a\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u7b7e\u5f00\u5934\u4e3a \u201cskip-XXX\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\uff0c\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\u5219\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u7b7e\u4e3a SKIPED\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#312","title":"3.1.2\u3001\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skipif_platform-aarch64&mips64 \u67d0\u4e9b\u7528\u4f8b\u4f1a\u56e0\u4e3a\u4e0d\u540c\u7684\u73af\u5883\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\uff0c\u5e38\u89c1\u7684\u573a\u666f\u4e3a\u5728\u4e0d\u540c\u67b6\u6784\u4e0a\u5224\u65ad\u662f\u5426\u6267\u884c\uff0c\u8df3\u8fc7\u7684\u539f\u56e0\u6807\u7b7e\u4e3a \u201cskipif_platform-\u201d \u52a0\u67b6\u6784\u540d\uff0c\u591a\u4e2a\u67b6\u6784\u4e4b\u95f4\u4f7f\u7528 \u201c&\u201d \u62fc\u63a5\uff1b \u4ee5\u4e0a\u4f8b\u5b50\u4e3a\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u5224\u65ad\u5f53\u524d\u67b6\u6784\u662f\u5426\u4e3a arrch64 \u6216\u8005 mips64\uff0c\u82e5\u662f\uff0c\u5219\u8df3\u8fc7\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u82e5\u5426\u5219\u6267\u884c\u7528\u4f8b\uff1b \u76ee\u524d\u6846\u67b6\u9ed8\u8ba4\u4ec5\u652f\u6301\u67b6\u6784\u7684\u6761\u4ef6\u5224\u65ad\uff0c\u4f46\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u903b\u8f91\u652f\u6301\u81ea\u5b9a\u4e49\u6dfb\u52a0\u3002 \u5728\u9879\u76ee\u76ee\u5f55\u8def\u5f84\u4e0b\u5b58\u5728\u6587\u4ef6 setting/skipif.py\uff0c\u6240\u6709\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u7684\u51fd\u6570\u5199\u5728\u6b64\u6587\u4ef6\u4e2d\u3002 \u9ed8\u8ba4\u67b6\u6784\u5224\u65ad\u4f8b\u5b50\uff1a def skipif_platform(args: str):\n\"\"\"\u5e73\u53f0\u8df3\u8fc7\"\"\"\n_skip_key = args.split(\"&\")\nfor key in _skip_key:\nif GlobalConfig.SYS_ARCH == key:\nreturn True\nreturn False\n \u65b9\u6cd5\u7f16\u5199\u89c4\u8303\uff1a \u65b9\u6cd5\u540d\u5fc5\u987b\u4ee5 skipif \u5f00\u5934\uff1b \u65b9\u6cd5\u5fc5\u987b\u6709\u8fd4\u56de\u7ed3\u679c\u5e76\u4e14\u4e3a\u5e03\u5c14\u503c\uff08True \u4ee3\u8868\u8df3\u8fc7\uff0cFalse \u4ee3\u8868\u4e0d\u8df3\u8fc7\uff09\uff1b \u65b9\u6cd5\u53ea\u80fd\u6709\u4e00\u4e2a\u5165\u53c2\uff1b \u5728 csv \u6587\u4ef6\u8df3\u8fc7\u539f\u56e0\u4e00\u680f\u4e2d\u586b\u5199\u4e3a \u201c{\u51fd\u6570\u540d}-{\u53c2\u6570}\u201d\uff0c\u4f8b\u5982\uff1askipif_platform-aarch64\uff1b\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u4f1a\u4ee5\u7b2c\u4e00\u4e2a \u201c-\u201d \u8fdb\u884c\u5206\u5272\uff0c\u622a\u53d6\u7684\u5de6\u4fa7\u5b57\u7b26\u4e32\u4f5c\u4e3a\u51fd\u6570\u540d\uff0c\u5728 skipif.py \u6587\u4ef6\u4e2d\u67e5\u627e\u662f\u5426\u6709\u540c\u540d\u51fd\u6570\uff0c\u5e76\u5c06\u622a\u53d6\u7684\u53f3\u4fa7\u4f5c\u4e3a\u53c2\u6570\u4f20\u9012\u7ed9\u8be5\u51fd\u6570\uff0c\u901a\u8fc7\u83b7\u53d6\u8be5\u51fd\u6570\u8fd4\u56de\u7684\u5e03\u5c14\u503c\uff0c\u8fd4\u56de True\uff0c\u5219\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u8fd4\u56de False\uff0c\u5219\u6267\u884c\u8be5\u7528\u4f8b\u3002 \u82e5\u51fd\u6570\u9700\u8981\u591a\u4e2a\u53c2\u6570\uff0c\u53ef\u81ea\u5b9a\u4e49\u591a\u4e2a\u53c2\u6570\u4e4b\u95f4\u7684\u8fde\u63a5\u7b26\uff0c\u8fde\u63a5\u7b26\u53f7\u4e0d\u53ef\u4f7f\u7528\u4e0b\u5212\u7ebf\u548c\u9017\u53f7\uff0c\u63a8\u8350\u7edf\u4e00\u4f7f\u7528 & \u7b26\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32","title":"3.2\u3001\u786e\u8ba4\u4fee\u590d","text":"\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7528\u4f8b\u4fee\u590d\u540e\uff0c\u4f46\u4e0d\u80fd\u7acb\u5373\u5220\u9664\u8df3\u8fc7\u539f\u56e0\uff08skip-XXX\uff09\u7684\u7528\u4f8b\uff0c\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u786e\u8ba4\u4fee\u590d\u201d\uff0c\u4f5c\u4e3a\u6807\u8bb0\u8be5\u7528\u4f8b\u662f\u5426\u5df2\u7ecf\u4fee\u590d\uff0c\u56fa\u5b9a\u586b\u5165\u5b57\u6bb5\u4e3a \u201cfixed-\u5df2\u4fee\u590d\u201d\u3002\u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u5373\u4f7f\u540c\u65f6\u6807\u8bb0\u4e86 skip-XXX \u4e5f\u4f1a\u6b63\u5e38\u6267\u884c\u3002 \u793a\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d \u3010\u540c\u65f6\u6807\u8bb0\u4e86skip \u548c fixed\uff0c\u4f46\u4ecd\u7136\u60f3\u8981\u8df3\u8fc7\u7528\u4f8b\u3011 \u5f53 \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u540c\u65f6\u586b\u5165\u540e\uff0c\u547d\u4ee4\u884c\u4f20\u9012\u53c2\u6570 --ifixed yes\uff0c\u5219\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\u8be5\u6761\u7528\u4f8b\u3002 python3 manage.py run --ifixed yes\n \u770b\u5230\u8fd9\u91cc\u6709\u4e9b\u540c\u5b66\u53ef\u80fd\u8981\u95ee\u4e86\uff0c\u6211\u60f3\u6062\u590d\u8df3\u8fc7\u6267\u884c\uff0c\u76f4\u63a5\u628a skip-XXX \u8fd9\u4e00\u5217\u6807\u7b7e\u5220\u6389\u4e0d\u5c31\u597d\u4e86\uff0c\u8fd8\u641e\u4ec0\u4e48\u786e\u8ba4\u4fee\u590d\u5e72\u5565\uff1f \u8fd9\u91cc\u7ed9\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u89e3\u91ca\u4e00\u4e0b\uff1a \uff08\u4ee5\u4e0b\u6d41\u6c34\u7ebf\u6307\u7684\u662f\u6bcf\u65e5\u6784\u5efa\u7684\u6d41\u6c34\u7ebf\uff0c\u8dd1 AT \u7684\u5168\u91cf\u7528\u4f8b\uff09 \u9996\u5148\uff0c\u6d41\u6c34\u7ebf\u4e0a\u8dd1\u7684\u662f AT \u5386\u53f2 Tag\uff0c\u8df3\u8fc7\u7528\u4f8b\u7684\u6807\u7b7e(skip-XXX) \u662f\u5728\u6700\u65b0\u7684\u4ee3\u7801\u4e0a\u63d0\u4ea4\u7684\uff0c\u6211\u4eec\u91c7\u7528\u6700\u65b0\u7684 csv \u6587\u4ef6\u8986\u76d6\u5386\u53f2 csv \u6587\u4ef6\u7684\u8bbe\u8ba1\u6765\u5b9e\u73b0\u4e86\u5bf9\u5386\u53f2 Tag \u4e0a\u7528\u4f8b\u7684\u8df3\u8fc7\uff1b \u7136\u540e\uff0c\u5728\u65e5\u5e38\u8df3\u8fc7\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u540c\u65f6\u4e5f\u5728\u4fee\u590d\u4e00\u4e9b\u7528\u4f8b\uff0c\u4fee\u590d\u540e\u7684\u8fd9\u4e9b\u7528\u4f8b\u5728\u672c\u5730\u8c03\u8bd5\u7684\u65f6\u5019\u6211\u4eec\u4e0d\u5e0c\u671b\u7ee7\u7eed\u8df3\u8fc7\uff0c\u4f46\u662f\u6b64\u65f6\uff0c\u4fee\u590d\u7684\u8fd9\u4e9b\u7528\u4f8b\u53ef\u80fd\u8fd8\u4e0d\u7a33\u5b9a\uff0c\u4e0d\u9002\u5408\u9a6c\u4e0a\u653e\u5230\u6d41\u6c34\u7ebf\u53bb\u8dd1\uff0c\u4e5f\u5c31\u662f\u8bf4\u6d41\u6c34\u7ebf\u4e0a\u6211\u4eec\u662f\u5e0c\u671b\u4ed6\u7ee7\u7eed\u8df3\u8fc7\u7684\uff0c\u56e0\u6b64\uff0c\u54b1\u4e0d\u80fd\u76f4\u63a5\u628a skip-XXX \u5e72\u6389\uff1b \u8fd9\u91cc\u5c31\u77db\u76fe\u4e86\uff0c\u4e00\u4e2a\u9700\u6c42\u662f\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u53e6\u4e00\u4e2a\u9700\u6c42\u53c8\u4e0d\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u600e\u4e48\u529e\u5462\uff1f \u6211\u4eec\u4f7f\u7528\u201c\u786e\u8ba4\u4fee\u590d\u201d\u6765\u6807\u8bb0\u8fd9\u6761\u7528\u4f8b\u5df2\u7ecf\u4fee\u590d\u4e86\uff0c\u8fd9\u6837\u4f60\u672c\u5730\u8c03\u8bd5\u7528\u4f8b\u7684\u65f6\u5019\u8fd9\u6761\u5df2\u4fee\u590d\u7684\u7528\u4f8b\u662f\u4f1a\u6267\u884c\u7684\uff0c\u540c\u65f6\u5728\u6d41\u6c34\u7ebf\u4e0a\u5c06 --ifixed yes \u53c2\u6570\u52a0\u4e0a\uff0c\u90a3\u4e48\u6d41\u6c34\u7ebf\u4e0a\u6267\u884c\u65f6\u8fd9\u6761\u7528\u4f8b\u4ecd\u7136\u662f\u8df3\u8fc7\u7684\u72b6\u6001\uff0c\u540e\u7eed\u4f60\u6253 Tag \u7684\u65f6\u5019\uff0c\u628a \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u7684\u6807\u7b7e\u5168\u90e8\u5220\u6389\u5c31\u53ef\u4ee5\u4e86\u3002 \u8fd9\u5c31\u662f\u201c\u786e\u8ba4\u4fee\u590d\u201d\u8fd9\u4e2a\u6807\u7b7e\u7684\u80cc\u666f\uff0c\u9700\u8981\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u54c1\u4e00\u54c1\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#33","title":"3.3\u3001\u5e9f\u5f03\u7528\u4f8b","text":"\u9488\u5bf9\u67d0\u4e9b\u7528\u4f8b\uff0c\u7531\u4e8e\u9700\u6c42\u53d8\u66f4\uff0c\u73af\u5883\u5f71\u54cd\u6216\u8bc4\u4f30\u4e0d\u518d\u9002\u7528\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u65f6\uff0c\u7528\u4f8b\u9700\u8981\u5e9f\u5f03\uff0c\u5219\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u5e9f\u5f03\u7528\u4f8b\u201d\uff0c\u8be5\u5217\u5b58\u5728 \u201cremoved-{\u5e9f\u5f03\u539f\u56e0}\u201d\uff0c\u5219\u7528\u4f8b\u4e0d\u4f1a\u6267\u884c\u3002 \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d removed-\u5df2\u5e9f\u5f03 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_2","title":"4\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u4e0a\u9762\u4ecb\u7ecd Pytest \u6846\u67b6\u63d0\u4f9b\u7684\u6807\u7b7e\u529f\u80fd mark\uff0c\u4f7f\u7528\u65f6\u9700\u8981\u4e3a\u6bcf\u4e00\u4e2a\u7528\u4f8b\u6dfb\u52a0\u6807\u7b7e\u88c5\u9970\u5668\uff0c\u5219\u64cd\u4f5c\u590d\u6742\uff0c\u53ef\u7ef4\u62a4\u6027\u5dee\uff0c\u5176\u6839\u672c\u95ee\u9898\u5c31\u662f\u6807\u7b7e\u5206\u6563\u5728\u6bcf\u4e00\u6761\u7528\u4f8b\u7684\u88c5\u9970\u5668\u4e0a\uff0c\u96be\u4ee5\u96c6\u4e2d\u7ef4\u62a4\uff1b\u4e8e\u662f\u4e4e\u5c06\u6240\u6709\u6807\u7b7e\u4f7f\u7528 csv \u6587\u4ef6\u8fdb\u884c\u96c6\u4e2d\u7ba1\u7406\uff0c\u5e76\u901a\u8fc7 Pytest \u7684\u94a9\u5b50\u51fd\u6570\uff0c\u8bfb\u53d6 csv \u6587\u4ef6\uff0c\u52a8\u6001\u6dfb\u52a0\u6807\u7b7e\u5230\u7528\u4e2d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5csv","title":"5\u3001CSV\u6587\u4ef6\u683c\u5f0f","text":"\u6b64\u914d\u7f6e\u6587\u4ef6\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u6807\u7b7e\u6570\u636e\uff0c\u4e14\u8981\u65b9\u4fbf\u80fd\u4f7f\u7528Excel\u6253\u5f00\u8fdb\u884c\u7f16\u8f91\u67e5\u770b\uff0c\u66f4\u91cd\u8981\u7684\u662f\u6211\u4eec\u4e0d\u60f3\u5f15\u5165\u4e09\u65b9\u4f9d\u8d56\uff0cCSV \u6587\u4ef6\u51e0\u4e4e\u662f\u552f\u4e00\u80fd\u6ee1\u8db3\u6240\u6709\u7684\u8981\u6c42\u7684\u6587\u4ef6\u683c\u5f0f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_6","title":"\u4e03\u3001\u65e5\u5fd7\u7cfb\u7edf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_5","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e YouQu \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u64cd\u4f5c\u65b9\u6cd5\u5c01\u88c5\u5199\u6cd5\uff0c\u901a\u5e38\u662f\u8fd9\u6837\u7684\uff1a\u7c7b\u91cc\u9762\u4e00\u4e2a\u51fd\u6570\u53ea\u5305\u542b\u4e00\u4e2a\u64cd\u4f5c\u6216\u591a\u6b21\u8c03\u7528\u7684\u4e00\u7cfb\u5217\u53ef\u5408\u5e76\u7684\u64cd\u4f5c\uff1b \u4f20\u7edf\u7684\u65e5\u5fd7\u8f93\u51fa\u65b9\u5f0f\uff0c\u9700\u8981\u5728\u6bcf\u4e2a\u51fd\u6570\u91cc\u9762\u4e3b\u52a8\u7f16\u5199\u65e5\u5fd7\u8f93\u51fa\u4ee3\u7801 \uff0c\u4f8b\u5982\uff1a class XXXWidget:\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\nlogger.info(\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\")\n...\n# \u7701\u7565\u4ee3\u7801\u90e8\u5206\n \u4e00\u4e2a\u51fd\u6570\u91cc\u9762\u81f3\u5c11\u5305\u542b\u4e00\u6761\u65e5\u5fd7\u4fe1\u606f\uff0c\u5982\u679c\u6bd4\u8f83\u590d\u6742\u64cd\u4f5c\u6b65\u9aa4\uff0c\u53ef\u80fd\u5305\u542b\u591a\u6761\u65e5\u5fd7\u4fe1\u606f\uff1b \u4e00\u4e2a\u5e94\u7528\u542b\u6709\u5927\u91cf\u7684\u64cd\u4f5c\u51fd\u6570\uff0c\u4e5f\u5c31\u662f\u8bf4\u6211\u4eec\u9700\u8981\u5199\u5927\u91cf\u7684\u65e5\u5fd7\u4ee3\u7801\uff1b \u901a\u8fc7\u7ecf\u9a8c\u89c2\u5bdf\uff0c\u6211\u4eec\u53d1\u73b0\uff0c\u51fd\u6570\u8bf4\u660e\u4ee5\u53ca\u51fd\u6570\u64cd\u4f5c\u65e5\u5fd7\uff0c\u5177\u6709\u8f83\u9ad8\u7684\u91cd\u590d\u5ea6\uff08\u4ece\u4e0a\u9762\u7684\u4f8b\u5b50\u4e5f\u53ef\u4ee5\u770b\u51fa\u6765\uff09\uff0c\u56e0\u6b64\u6211\u4eec\u5927\u80c6\u7684\u8bbe\u60f3\uff0c\u80fd\u4e0d\u80fd\u57fa\u4e8e\u6846\u67b6\u6267\u884c\u65f6\uff0c\u81ea\u52a8\u7684\u5c06\u51fd\u6570\u8bf4\u660e\u4f5c\u4e3a\u65e5\u5fd7\u6253\u5370\u51fa\u6765\uff0c\u4ece\u800c\u51cf\u5c11\u5927\u91cf\u65e5\u5fd7\u4ee3\u7801\u91cf\u548c\u91cd\u590d\u7f16\u5199\uff0c\u90a3\u771f\u662f\u5999\u554a~\u3002 \u57fa\u4e8e\u6b64\u201c\u5929\u771f\u201d\u7684\u60f3\u6cd5\uff0c\u6211\u4eec\u8bbe\u8ba1\u51fa\u4e86 youqu \u7684\u65e5\u5fd7\u7cfb\u7edf\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_5","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u6838\u5fc3\u539f\u7406\uff1a \u901a\u8fc7\u7ed9\u7c7b\u52a0\u4e0a\u4e00\u4e2a\u88c5\u9970\u5668 @log\uff0c\u52a8\u6001\u7ed9\u8be5\u7c7b\u4e0b\u6240\u6709\u7684\u51fd\u6570\u53ca\u7236\u7c7b\u51fd\u6570\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668 @_trace\uff0c\u5728\u6b64\u88c5\u9970\u5668\u4e2d\u6211\u4eec\u80fd\u52a8\u6001\u7684\u6355\u83b7\u6240\u8c03\u7528\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff08func.__doc__\uff09\uff0c\u901a\u8fc7\u65e5\u5fd7\u8f93\u51fa\u5668\u5c06\u5176\u8f93\u51fa\u5373\u53ef\u3002 \u5b9e\u73b0\u6b65\u9aa4\uff1a \u901a\u8fc7 inspect.getmembers \u83b7\u53d6\u88ab\u88c5\u9970\u7684\u7c7b\u4e0b\u6240\u6709\u51fd\u6570\uff0c\u5305\u542b\u9759\u6001\u65b9\u6cd5\uff0c\u7c7b\u65b9\u6cd5\uff0c\u5b9e\u4f8b\u65b9\u6cd5\uff1b \u901a\u8fc7 setattr(\u7c7b, \u65b9\u6cd5, _trace\uff09 \u7684\u65b9\u5f0f\uff0c\u7ed9\u7b26\u5408\u6761\u4ef6\u7684\u51fd\u6570\uff0c\u52a8\u6001\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_3","title":"3\u3001\u65e5\u5fd7\u914d\u7f6e","text":"[log_cli]\n;\u65e5\u5fd7\u76f8\u5173\u914d\u7f6e\uff08\u4e0d\u6253\u5370\u6784\u9020\u51fd\u6570\u548c\u9b54\u6cd5\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff09\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = INFO\n# ============= \u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u914d\u7f6e ================\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u5f00\u5934\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7, \u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_STARTSWITH = Assert\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u7ed3\u5c3e\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_ENDSWITH = Widget\n;\u652f\u6301\u7c7b\u540d\u5305\u542b xxx \u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_CONTAIN = ShortCut\n# ==============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_3","title":"4\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u5728\u5e94\u7528\u5e93 widget \u65b9\u6cd5\u5e93\u91cc\u9762\uff0c\u53ea\u9700\u8981\u5728\u51fa\u53e3\u6587\u4ef6\u52a0\u4e0a\u7c7b\u88c5\u9970\u5668\uff0c\u5c31\u53ef\u4ee5\u5b9e\u73b0\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u4e86\uff1b # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6ce8\u610f\uff0c\u662f\u7c7b\u88c5\u9970\u5668\u3002 \u5b9e\u4f8b\uff1a # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\n@classmethod\ndef find_dfm_image(cls, *elements, multiple=False, rate=0.9):\n\"\"\"\n \u67e5\u627e\u56fe\u7247 {{elements}}.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e {{rate}} \u7684\u5750\u6807\n :param elements:\n :param multiple:\n :return:\n \"\"\"\nelement = tuple(map(lambda x: f\"{Config.PIC_RES_PATH}/{x}\", elements))\nreturn cls.find_image(*element, multiple=multiple)\n \u8c03\u7528\u65b9\u6cd5\u65f6\uff1a DfmWidget.find_dfm_image(\"dfm_001\")\n \u81ea\u52a8\u8f93\u51fa\u7684\u65e5\u5fd7\uff1a >> x86_64-uos-6: 02/28 17:48:47 | INFO | logger_utils: [find_dfm_image]: \u67e5\u627e\u56fe\u7247 dfm_001.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e 0.9 \u7684\u5750\u6807\n \u52a0\u4e0a\u88c5\u9970\u5668 @log \u4e4b\u540e\uff0c\u65b9\u6cd5\u5c42\u6240\u6709\u7684\u51fd\u6570\uff08\u5305\u62ec\u5b9e\u4f8b\u65b9\u6cd5\u3001\u7c7b\u65b9\u6cd5\u3001\u9759\u6001\u65b9\u6cd5\uff09\u90fd\u4e0d\u9700\u8981\u518d\u5199\u65e5\u5fd7\u4ee3\u7801\uff0c\u6267\u884c\u7684\u65f6\u5019\u4f1a\u81ea\u52a8\u8f93\u51fa\uff0c\u5e76\u4e14\u6240\u6709\u8c03\u7528\u7684\u65b9\u6cd5\u4f1a\u4ee5 allure.step \u7684\u65b9\u5f0f\uff0c\u5c55\u793a\u5728 allure \u62a5\u544a\u4e2d\uff0c\u5728\u62a5\u544a\u4e2d\u66f4\u80fd\u4e00\u76ee\u4e86\u7136\u7684\u770b\u5230\u7528\u4f8b\u6267\u884c\u6b65\u9aa4\u3002 \u3010\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\u3011 \u901a\u8fc7\u89c2\u5bdf\u524d\u9762\u7684\u4f8b\u5b50\uff0c\u7ec6\u5fc3\u7684\u540c\u5b66\u53ef\u80fd\u8fd8\u53d1\u73b0\u4e86\u4e00\u4e2a\u5c0f\u7ec6\u8282\uff1a\u51fd\u6570\u529f\u80fd\u8bf4\u660e\u4e2d\uff0c\u4e24\u5bf9\u5927\u62ec\u53f7\u4e2d\u7684\u5185\u5bb9 {{elements}} \u4f5c\u4e3a\u53d8\u91cf\u8f93\u51fa\u51fa\u6765\u4e86\uff1b \u6ca1\u9519\uff0c\u8fd9\u5c31\u662f\u6211\u4eec\u53c2\u8003Django \u548c jinja2 \u7684\u6a21\u677f\u8bed\u6cd5\u8bbe\u8ba1\u51fa\u7684\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\uff0c\u4f7f\u7528\u65b9\u6cd5\u5f88\u7b80\u5355\uff0c\u7528\u4e24\u5bf9\u5927\u62ec\u53f7\u628a\u51fd\u6570\u7684\u53c2\u6570\u62ec\u8d77\u6765\uff0c\u8fd9\u6837\u5728\u65e5\u5fd7\u8f93\u51fa\u7684\u65f6\u5019\u5c31\u80fd\u628a\u8c03\u7528\u51fd\u6570\u65f6\u53c2\u6570\u7684\u503c\u8f93\u51fa\u51fa\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_7","title":"\u516b\u3001\u73af\u5883\u90e8\u7f72","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_6","title":"1\u3001\u539f\u5219","text":"YouQu \u7684\u73af\u5883\u4f9d\u8d56\u4e00\u76f4\u575a\u6301 2 \u4e2a\u539f\u5219\uff1a \u6700\u5c0f\u73af\u5883\u4f9d\u8d56\u539f\u5219 \u6709\u4e9b\u540c\u5b66\u5199\u4e00\u4e9b\u529f\u80fd\uff0c\u9996\u5148\u60f3\u5230\u7684\u5c31\u662f\u53bb\u641c\u7d22\u5f15\u64ce\u641c\u4e00\u4e0b\uff0c\u770b\u6709\u6ca1\u6709\u73b0\u6210\u7684\u5de5\u5177\u6216\u8005\u4ee3\u7801\u76f4\u63a5\u80fd\u7528\uff0c\u7f8e\u5176\u540d\u66f0\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\uff0c\u522b\u4eba\u5df2\u7ecf\u9020\u597d\u4e86\u8f6e\u5b50\u54b1\u4eec\u5c31\u4e0d\u8981\u91cd\u590d\u53bb\u9020\u4e86\uff0c\u7136\u540e\u4e00\u5207\u4f3c\u4e4e\u90fd\u53d8\u5f97\u90a3\u4e48\u7684\u7406\u6240\u5e94\u5f53\u3002 \u5f53\u7136\u8fd9\u6837\u505a\u65e0\u53ef\u539a\u975e\uff0c\u6211\u76f8\u4fe1\u6709\u8fd9\u6837\u60f3\u6cd5\u5e76\u4e14\u4e00\u76f4\u8df5\u884c\u8fd9\u6837\u505a\u6cd5\u7684\u540c\u5b66\u4e0d\u5728\u5c11\u6570\uff0c\u4f46\u8fd9\u6837\u505a\u6709\u4e00\u4e2a\u5f88\u4e25\u91cd\u7684\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f60\u5199\u4e00\u4e2a\u5927\u578b\u9879\u76ee\u65f6\uff0c\u4f60\u4f1a\u5f15\u5165\u975e\u5e38\u975e\u5e38\u975e\u5e38\u591a\u7684\u4f9d\u8d56\uff0c\u6bd4\u5982\u8981\u505a\u4e2a\u63a5\u53e3\u8bf7\u6c42\u8981\u7528 requests\u3001\u8bfb\u5199\u4e2a\u6570\u636e\u7528 pandas\u3001\u5199\u4e2a\u8868\u683c\u7528 pyopenxl\u3001\u89e3\u6790\u4e2a\u6587\u672c\u8981\u7528\u8fd9\u4e2a\u90a3\u4e2a\u4e09\u65b9\u5e93 ... \u3002 \u6211\u8ba4\u4e3a\u8fd9\u662f\u975e\u5e38\u4e0d\u597d\u7684\u4e60\u60ef\uff0c\u5728\u5b9e\u73b0\u4e00\u4e2a\u529f\u80fd\u7684\u65f6\u5019\uff0c\u9996\u5148\u6211\u4eec\u5e94\u8be5\u53bb\u60f3\u81ea\u5df1\u600e\u4e48\u6837\u53bb\u5b9e\u73b0\uff0c\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff1b \u5982\u679c\u4f60\u4e0d\u4f1a\uff0c\u4f60\u53ef\u4ee5\u53bb\u5b66\u4e60\u4e09\u65b9\u5e93\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u522b\u4eba\u4e09\u65b9\u5e93\u4e5f\u662f\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\u7684\uff0c\u4e3a\u4ec0\u4e48\u54b1\u4eec\u4e0d\u884c\u5462\uff1b\u5982\u679c\u522b\u4eba\u7684\u4f60\u5b9e\u5728\u662f\u770b\u4e0d\u61c2\uff0c\u60f3\u5c3d\u4e00\u5207\u529e\u6cd5\u786e\u5b9e\u505a\u4e0d\u51fa\u6765\uff0c\u90a3\u518d\u8003\u8651\u5f15\u5165\u8fd9\u4e2a\u4e09\u65b9\u5e93\uff0c\u6211\u8ba4\u4e3a\u8fd9\u6837\u662f\u6ca1\u95ee\u9898\u7684\uff0c\u6bd5\u7adf\u54b1\u4eec\u6bb5\u4f4d\u8fd8\u4e0d\u591f\uff0c\u4f46\u5e0c\u671b\u5c06\u6765\u6709\u4e00\u5929\u6211\u4eec\u53ef\u4ee5\u3002 \u8fd9\u6837\u7684\u505a\u6cd5\u624d\u5e94\u8be5\u662f\u201c\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\u201d\u6b63\u786e\u7684\u64cd\u4f5c\u3002\u4e0d\u4f1a\u6ca1\u5173\u7cfb\uff0c\u770b\u770b\u522b\u4eba\u662f\u600e\u4e48\u5b9e\u73b0\u7684\uff0c\u81ea\u5df1\u518d\u6478\u7d22\u7740\u5199\u51fa\u6765\uff0c\u8fd9\u6837\u81ea\u5df1\u624d\u80fd\u6709\u6240\u63d0\u9ad8\uff0c\u4e0d\u7136\u4f60\u5c31\u53ea\u4f1a\u7528\u522b\u4eba\u7684\u4e1c\u897f\uff1b\u90a3\u4e9b\u5632\u7b11\u3001\u6279\u8bc4\u6211\u4eec\u91cd\u590d\u9020\u8f6e\u5b50\u7684\u4eba\uff0c\u5148\u60f3\u60f3\u81ea\u5df1\u4f1a\u9020\u8f6e\u5b50\u5417\u3002 \u672c\u7740\u81ea\u5df1\u5b9e\u73b0\u80fd\u5b9e\u73b0\u7684\u4e00\u5207\u7684\u539f\u5219\uff0cYouQu \u6846\u67b6\u505a\u5230\u4e86\u975e\u5e38\u5c11\u7684\u73af\u5883\u4f9d\u8d56\uff0c\u800c\u4e14\u6211\u4eec\u4ecd\u5728\u4e0d\u65ad\u52aa\u529b\uff0c\u51cf\u5c11\u73af\u5883\u90e8\u7f72\u7684\u4f9d\u8d56\u3002 \u6700\u5c0f\u4ed3\u5e93\u4f53\u79ef\u539f\u5219 \u5927\u6587\u4ef6\u4e0d\u80fd\u4e0a\u4f20\u5230\u5de5\u7a0b\u91cc\u9762\uff0c\u4fdd\u6301\u6574\u4e2a\u5de5\u7a0b\u7684\u8f7b\u91cf\u5316\uff0c\u8fd9\u6837\u5728\u514b\u9686\u4ee3\u7801\u7684\u65f6\u5019\u624d\u80fd\u975e\u5e38\u5feb\u901f\u65b9\u4fbf\u4f7f\u7528\uff0c\u6211\u4eec\u89c1\u8fc7\u4e00\u4e2a AT \u5de5\u7a0b clone \u5927\u5c0f\u8fbe\u5230\u597d\u51e0\u4e2a G\uff0c\u7b80\u76f4\u4e0d\u53ef\u601d\u8bae\u3002 \u5176\u5b9e\u4ee3\u7801\u6587\u4ef6\u7684\u5927\u5c0f\u662f\u5f88\u5c0f\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u7eaf\u5199\u4ee3\u7801\u968f\u4fbf\u5199\u5de5\u7a0b\u4e5f\u4e0d\u4f1a\u592a\u5927\uff0c\u800c\u6587\u6863\uff08\u5305\u542b\u63d2\u56fe\uff09\u7b49\u8d44\u6e90\u5374\u662f\u5f88\u5360\u7a7a\u95f4\u3002 \u56e0\u6b64\u6211\u4eec\u9009\u62e9\u5c06 YouQu \u7684\u6587\u6863\u5de5\u7a0b\u5355\u72ec\u8fc1\u51fa\u5230\u72ec\u7acb\u7684\u4ed3\u5e93 youqu-docs \u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_6","title":"2\u3001\u5b89\u88c5","text":"\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u8fd0\u884c env.sh \u5373\u53ef\u3002 bash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_4","title":"3\u3001\u5b9a\u5236\u4f9d\u8d56","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_2","title":"3.1\u3001\u65b0\u589e\u4f9d\u8d56","text":"\u5982\u679c\u5e94\u7528\u5e93\u8fd8\u9700\u8981\u5176\u4ed6 Python \u4f9d\u8d56\u5e93\uff0c\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a requirement.txt \u6587\u4ef6\uff1b autotest_xxx\n\u251c\u2500\u2500 requirement.txt\n\u251c\u2500\u2500 case ...\n \u91cc\u9762\u5199\u5165\u9700\u8981\u5b89\u88c5\u7684\u4e09\u65b9\u4f9d\u8d56\uff0c\u6bd4\u5982\u50cf\u8fd9\u6837\uff1a # requirement.txt\nPyYAML==6.0 # \u6307\u5b9a\u5b89\u88c5\u67d0\u4e2a\u7248\u672c\nrequests # \u672a\u6307\u5b9a\u7248\u672c\u5219\u5b89\u88c5\u6700\u65b0\u7248\n \u5728\u6267\u884c bash env.sh \u65f6\u4f1a\u4e00\u5e76\u5c06\u5176\u5b89\u88c5\u3002 \u5982\u679c\u591a\u4e2a\u5e94\u7528\u5e93\u90fd\u5b58\u5728 requirement.txt \u6587\u4ef6\uff0c\u6267\u884c env.sh \u65f6\u4f1a\u5c06\u591a\u4e2a requirement.txt \u6587\u4ef6\u4e00\u5e76\u52a0\u8f7d\uff1b\u90a3\u4e48\u4e00\u5b9a\u8981\u6ce8\u610f\u591a\u4e2a requirement.txt \u6587\u4ef6\u53ef\u80fd\u5b58\u5728\u76f8\u540c\u7684\u4f9d\u8d56\u88ab\u6307\u5b9a\u5b89\u88c5\u4e0d\u540c\u7248\u672c\u7b49\u7b49\u517c\u5bb9\u6027\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32_1","title":"3.2\u3001\u88c1\u526a\u4f9d\u8d56","text":"\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0c\u53ef\u80fd\u4f60\u53ea\u9700\u8981\u5b89\u88c5\u4e00\u4e9b\u6700\u6700\u57fa\u7840\u7684\u4f9d\u8d56\uff0c\u5176\u4ed6\u7684\u90fd\u4e0d\u9700\u8981\uff0c\u6bd4\u5982\u7eaf\u63a5\u53e3\u81ea\u52a8\u5316\u7684\u9879\u76ee\uff0c\u5b83\u4e0d\u9700\u8981 UI \u81ea\u52a8\u5316\u76f8\u5173\u7684\u4f9d\u8d56\u3002 \u4f60\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\uff0c\u5b58\u653e\u4e00\u4e2a BASICENV \u7684\u666e\u901a\u6587\u4ef6\uff0c\u91cc\u9762\u4e0d\u9700\u8981\u5199\u4efb\u4f55\u5185\u5bb9\uff0c\u8fd9\u6837\u6267\u884c env.sh \u65f6\uff0c\u53ea\u4f1a\u5b89\u88c5\u6700\u57fa\u7840\u7684\u4f9d\u8d56\u3002 autotest_xxx\n\u251c\u2500\u2500 BASICENV # \u53ef\u4ee5\u4f7f\u7528\uff1atouch BASICENV \u521b\u5efa\u6587\u4ef6\n\u251c\u2500\u2500 case ...\n \u57fa\u7840\u4f9d\u8d56\u4ec5\u5b89\u88c5\u4ee5\u4e0b\u51e0\u4e2a\u5305\uff1a pytest # pytest\npytest-rerunfailures # \u5931\u8d25\u91cd\u8dd1\u63d2\u4ef6\npytest-timeout # \u7528\u4f8b\u8d85\u65f6\u63d2\u4ef6\nallure-pytest # \u751f\u6210 allure \u62a5\u544a\u63d2\u4ef6\nallure.deb # allure \u62a5\u544a\u67e5\u770b\u5de5\u5177\n \u88c1\u526a\u4f9d\u8d56 \u548c \u65b0\u589e\u4f9d\u8d56 \u662f\u4e0d\u51b2\u7a81\u7684\uff0c\u53ef\u4ee5\u540c\u65f6\u4f7f\u7528\u3002 \u6b64\u65b9\u6848\u9ed8\u8ba4\u4e3a\u865a\u62df\u73af\u5883\u90e8\u7f72\uff0c\u5982\u679c\u4f60\u60f3\u76f4\u63a5\u90e8\u7f72\u5728\u672c\u673a\u4e0a\uff1a bash env_dev.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_8","title":"\u4e5d\u3001\u5931\u8d25\u5f55\u5c4f","text":"\u5f55\u5c4f\u5176\u5b9e\u662f\u4e00\u79cd\u89c6\u9891\u5f62\u5f0f\u7684\u65e5\u5fd7\uff0c\u56e0\u4e3a\u5f88\u591a\u65f6\u5019\u6211\u4eec\u5728\u67e5\u770b\u65e5\u5fd7\u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u51c6\u786e\u7684\u5b9a\u4f4d\u5230\u7528\u4f8b\u5931\u8d25\u7684\u5177\u4f53\u539f\u56e0\uff0c\u56e0\u6b64\u7528\u4f8b\u7684\u5f55\u5c4f\u80fd\u8ba9\u6211\u4eec\u770b\u5230\u7528\u4f8b\u5728\u6267\u884c\u8fc7\u7a0b\uff1b \u3010\u4f7f\u7528\u65b9\u6cd5\u3011 \u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u5173\u6ce8 2 \u4e2a\u53c2\u6570\uff1b ;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\u3002\n;\u6ce8\u610f\uff0c\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u4e0d\u80fd\u5c0f\u4e8e\u5931\u8d25\u5f55\u5c4f\u6b21\u6570\uff0c\u5373 RERUN >= RECORD_FAILED_CASE\nRECORD_FAILED_CASE = 1\n \u9ed8\u8ba4\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u662f 1 \u6b21\uff1b RECORD_FAILED_CASE = 1 \u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff1b RECORD_FAILED_CASE = 0 \u8868\u793a\u4e0d\u7ba1\u7528\u4f8b\u6210\u529f\u6216\u5931\u8d25\u90fd\u5f55\u5c4f\uff1b \u5f55\u5c4f\u662f\u8981\u5360\u7528\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u7279\u522b\u662f\u5728\u4e00\u4e9b\u914d\u7f6e\u8f83\u4f4e\u7684\u673a\u5668\u4e0a\u4f1a\u5f88\u660e\u663e\uff0c\u6240\u4ee5\u4f60\u9700\u8981\u8003\u8651\u662f\u5426\u6709\u5fc5\u8981\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1b \u4f7f\u7528 manage.py \u6267\u884c\u7528\u4f8b\u9ed8\u8ba4\u8bfb\u53d6\u5230 globalconfig.ini \u91cc\u9762\u7684\u53c2\u6570\uff0c\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report/record \u76ee\u5f55\u4e0b\u4fdd\u5b58\u5931\u8d25\u7528\u4f8b\u7684\u5f55\u5c4f\u548c\u65ad\u8a00\u7684\u90a3\u4e2a\u65f6\u95f4\u70b9\u7684\u622a\u5c4f\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7\u89c6\u9891\u6587\u4ef6\u770b\u5230\u5931\u8d25\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u90fd\u53d1\u751f\u4e86\u4ec0\u4e48\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#wayland","title":"\u5341\u3001Wayland \u9002\u914d","text":"Wayland \u4e0b\u81ea\u52a8\u5316\u4e3b\u8981\u95ee\u9898\u662f X11 \u4e0b\u7684\u952e\u9f20\u64cd\u4f5c\u65b9\u6cd5\u65e0\u6cd5\u4f7f\u7528\uff0c\u6bd4\u5982 Xdotool\u3001 PyAutoGUI\u3001Xwininfo \u7b49\u7b49\uff1b YouQu \u5728 Wayland \u4e0b\u517c\u5bb9\u9002\u914d\uff0cenv.sh \u5728 Wayland \u4e0b\u6267\u884c\u65f6\u4f1a\u5b89\u88c5\u81ea\u7814\u7684\u952e\u9f20\u64cd\u4f5c\u670d\u52a1\uff08\u53ef\u80fd\u5b58\u5728\u4e00\u4e9b\u4f9d\u8d56\u62a5\u9519\uff0c\u6309\u7167\u6ce8\u91ca\u89e3\u51b3\u5373\u53ef\uff09\uff0c\u6846\u67b6\u6838\u5fc3\u5e93\u4e5f\u9488\u5bf9\u6027\u7684\u505a\u4e86\u9002\u914d\uff0c\u4e0a\u5c42\u7528\u4f8b\u5b8c\u5168\u4e0d\u7528\u5173\u5fc3\u673a\u5668\u662fWayland \u8fd8\u662f X11\uff0c\u6846\u67b6\u4f1a\u6839\u636e\u6267\u884c\u65f6\u72b6\u6001\u81ea\u52a8\u5224\u65ad\u8d70\u4e0d\u540c\u7684\u903b\u8f91\uff1b \u7b80\u5355\u8bb2\u5c31\u662f\uff0c\u5e94\u7528\u5e93\u53ea\u9700\u8981\u7ef4\u62a4\u4e00\u5957\u7528\u4f8b\u811a\u672c\u5373\u53ef\u3002 \u3010\u7528\u4f8b\u517c\u5bb9\u3011 \u56e0\u4e3a Wayland \u4e0b\u6709\u4e9b\u5e94\u7528\u7684\u754c\u9762\u663e\u793a\u548c\u529f\u80fd\u672c\u8eab\u5b58\u5728\u4e00\u4e9b\u5dee\u5f02\uff0c\u7528\u4f8b\u5c42\u53ef\u80fd\u9700\u8981\u5bf9\u8fd9\u90e8\u5206\u7528\u4f8b\u505a\u903b\u8f91\u5224\u65ad\uff0c\u4f7f\u7528\u5168\u5c40\u914d\u7f6e\u91cc\u9762\u7684\u5e38\u91cf\u8fdb\u884c\u903b\u8f91\u7f16\u5199\u5373\u53ef\uff1a from setting.globalconfig import GlobalConfig\n# GlobalConfig.IS_WAYLAND \u83b7\u53d6\u5230\u5f53\u524d\u7684\u663e\u793a\u670d\u52a1\u5668\uff08bool\uff09\n# \u5e94\u7528\u5e93 Config \u7ee7\u627f GlobalConfig\nif Config.IS_WAYLAND:\npass\nif Config.IS_X11:\npass\n \u6bd4\u5982\u7528\u4f8b\u91cc\u9762\u5982\u679c\u65ad\u8a00\u7684\u56fe\u7247\u4e0d\u540c\uff1a if Config.IS_WAYLAND:\nself.assert_image_exist(\"wayland_XXX\")\nelse:\nself.assert_image_exist(\"x11_XXX\")\n \u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u811a\u672c\u5728 Wayland \u548c X11 \u4e0b\u90fd\u53ef\u4ee5\u8dd1\uff0cso easy \u662f\u4e0d\u662f\uff1f\u5b8c\u5168\u6ca1\u5fc5\u8981\u4e13\u95e8\u62c9\u65b0\u5206\u652f\u8fdb\u884c Wayland \u9002\u914d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_9","title":"\u5341\u4e00\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_7","title":"1. \u76ee\u5f55\u7ed3\u6784","text":"\u6267\u884c\u65f6\u4f1a\u5728\u6839\u76ee\u5f55\u4e0b\u52a8\u6001\u751f\u6210 report \u76ee\u5f55\uff0c\u6240\u6709\u7684\u62a5\u544a\u76f8\u5173\u7684\u6587\u4ef6\u4f1a\u7edf\u4e00\u5b58\u653e\u5728\u91cc\u9762\uff0c\u793a\u4f8b\uff1a /report\n \u251c\u2500\u2500 allure # allure\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json\n \u251c\u2500\u2500 allure_html # \u751f\u6210\u7684html\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 index.html \u251c\u2500\u2500 allure_back # allure\u62a5\u544a\u5907\u4efd\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 20221108114823\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json\n \u251c\u2500\u2500 json # json\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 result_deepin-music_20221109134736_1081333.json\n \u251c\u2500\u2500 logs # \u65e5\u5fd7\u6587\u4ef6\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 2022-11-10_debug.log \u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-10_error.log\n \u251c\u2500\u2500 record # \u5f55\u5c4f\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-09\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 15\u65f614\u520609\u79d2_test_music_303_2_autotest.mp4\n \u2514\u2500\u2500 xml # xml\u62a5\u544a\n\u2514\u2500\u2500 autotest_deepin_music-20221109134736.xml\n \u9ed8\u8ba4\u60c5\u51b5\u4e0b\u540c\u65f6\u751f\u6210 html\u3001xml\u3001json\u4e09\u79cd\u5f62\u5f0f\u7684\u62a5\u544a\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_7","title":"2. \u5b9a\u5236\u62a5\u544a","text":"\u6211\u4eec\u5bf9 allure \u62a5\u544a\u8fdb\u884c\u4e86\u4e00\u7cfb\u5217\u7684\u5b9a\u5236\uff1a \u5b9a\u5236 logo\u3001title\u3001\u62a5\u544a\u9ed8\u8ba4\u8bed\u8a00\u4e3a\u4e2d\u6587\uff1b \u52a0\u5165\u4e86\u7528\u4f8b\u65ad\u8a00\u5931\u8d25\u65f6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u4ee5\u53ca\u6b64\u65f6\u56fe\u50cf\u5bf9\u6bd4\u7684\u6a21\u677f\u56fe\u7247\uff1b \u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\uff0c\u4f60\u53ef\u4ee5\u5728 html \u62a5\u544a\u4e2d\u76f4\u63a5\u770b\u5f55\u5236\u7684\u89c6\u9891\uff1b \u52a0\u5165\u4e86 IP \u5730\u5740\u3001\u7cfb\u7edf\u4fe1\u606f\u3001\u955c\u50cf\u7248\u672c\u7b49\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_5","title":"3. \u67e5\u770b\u62a5\u544a","text":" \u672c\u5730\u6267\u884c \u5728 report/allure \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u4e00\u5806\u6587\u672c\u6587\u4ef6\uff0c\u8fd9\u4e9b\u662f allure \u63d2\u4ef6\u751f\u6210\u7684\u62a5\u544a\u6e90\u6570\u636e\uff0c\u6211\u4eec\u5728 report/allure_html \u76ee\u5f55\u4e0b\u7ed9\u4f60\u751f\u6210\u4e86 html \u6587\u4ef6\uff0c\u4f46\u662f\u4f60\u4e0d\u80fd\u76f4\u63a5\u901a\u8fc7\u6d4f\u89c8\u5668\u6253\u5f00 index.html \u6587\u4ef6\uff0c\u56e0\u4e3a allure \u7684\u62a5\u544a\u90fd\u662f\u57fa\u4e8e\u5728\u7ebf\u7684\u670d\u52a1\uff0c\u4f60\u5e94\u8be5\u8fd9\u6837\u6253\u5f00\uff1a allure open report/allure_html\n \u4f7f\u7528 manage.py \u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u5728\u7ec8\u7aef\u7684\u6700\u540e\u4e00\u884c\uff0c\u6211\u4eec\u4f1a\u7ed9\u4f60\u8f93\u51fa\u6253\u5f00\u62a5\u544a\u7684\u547d\u4ee4\uff0c\u76f4\u63a5\u590d\u5236\u5b83\u5728\u7ec8\u7aef\u6267\u884c\u5c31\u53ef\u4ee5\u67e5\u770b\u4e86\uff0c\u50cf\u8fd9\u6837\uff1a \u7ec8\u7aef\u6267\u884c\u547d\u4ee4: allure open /tmp/youqu/report/allure_html \u67e5\u770b\u62a5\u544a \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 Pycharm \u91cc\u9762\u627e\u5230 index.html \u6587\u4ef6\uff0c\u7136\u540e\u53f3\u952e\u9009\u62e9\u6d4f\u89c8\u5668\u6253\u5f00\uff0c\u6216\u8005\u4f60\u53ef\u4ee5\u7528\u4e00\u4e2a http \u670d\u52a1\u6253\u5f00\u3002 \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 report/allure \u76ee\u5f55\u4e0b\u67e5\u770b\u62a5\u544a\uff1a allure serve report/allure\n \u8fdc\u7a0b\u6267\u884c \u8fdc\u7a0b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\uff0c\u4f1a\u5c06\u6240\u6709\u8fdc\u7a0b\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u62a5\u544a\u90fd\u6536\u96c6\u5230 report/allure \u76ee\u5f55\u4e0b\uff0c\u5206\u522b\u6309\u7167\u673a\u5668\u7684 IP \u7b49\u5efa\u4e86\u4e0d\u540c\u7684\u76ee\u5f55\uff0c\u4f60\u53ef\u4ee5\u5728\u8fd9\u4e9b\u76ee\u5f55\u91cc\u9762\u53bb\u67e5\u770b\u5bf9\u5e94\u7684\u6d4b\u8bd5\u62a5\u544a\uff0c\u67e5\u770b\u65b9\u6cd5\u548c\u524d\u9762\u672c\u5730\u6267\u884c\u67e5\u770b\u7684\u65b9\u6cd5\u4e00\u6837\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_10","title":"\u5341\u4e8c\u3001\u9759\u6001\u4ee3\u7801\u626b\u63cf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_8","title":"1. \u63d0\u524d\u89e3\u51b3\u4ee3\u7801\u95ee\u9898","text":"\u4e3a\u4e86\u5e2e\u52a9\u5f00\u53d1\u8005\u7edf\u4e00\u4ee3\u7801\u98ce\u683c\uff0cPython \u793e\u533a\u63d0\u51fa\u4e86 PEP8 \u4ee3\u7801\u7f16\u7801\u98ce\u683c\uff0cPython \u5b98\u65b9\u540c\u65f6\u63a8\u51fa\u4e86\u4e00\u4e2a\u68c0\u67e5\u4ee3\u7801\u98ce\u683c\u662f\u5426\u7b26\u5408 PEP8 \u7684\u5de5\u5177\uff0c\u540d\u5b57\u4e5f\u53eb PEP8\u3002 \u4f46\u662f\uff0cPycharm \u91cc\u9762\u7684 PEP8 \u63d2\u4ef6\u5b9e\u9645\u4e0a\u5e76\u4e0d\u80fd\u53d1\u73b0\u5f88\u591a\u4ee3\u7801\u95ee\u9898\uff0c\u8fd9\u4e9b\u95ee\u9898\u5e76\u4e0d\u4f1a\u5728\u8fd0\u884c\u65f6\u62a5\u9519\uff0c\u56e0\u4e3a\u4ece Python \u8bed\u8a00\u89d2\u5ea6\u5e76\u4e0d\u5173\u5fc3\u8fd9\u4e9b\u95ee\u9898\uff0c\u5728 Pycharm \u7f16\u8f91\u5668\u91cc\u9762\u4f7f\u7528\u5feb\u6377\u952e ctrl + alt + L\uff0c\u6709\u4e00\u70b9\u70b9\u683c\u5f0f\u5316\u7684\u6548\u679c\uff0c\u80fd\u89e3\u51b3\u4e00\u4e9b\u7a7a\u683c\u3001\u6362\u884c\u7b49\u5c0f\u95ee\u9898\u3002 \u8fd9\u91cc\u63a8\u8350\u4e00\u4e2a Python \u793e\u533a\u6d41\u884c\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff1a Black\uff0c\u53f7\u79f0\u4e0d\u59a5\u534f\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff0c\u5b83\u68c0\u6d4b\u5230\u4e0d\u7b26\u5408\u89c4\u8303\u7684\u4ee3\u7801\u98ce\u683c\u76f4\u63a5\u5c31\u5e2e\u4f60\u5168\u90e8\u683c\u5f0f\u5316\u597d\uff0c\u5c31\u662f\u8fd9\u4e48\u521a\uff01 \u5b89\u88c5\uff1a sudo pip3 install black \n \u4f7f\u7528\u65b9\u6cd5\uff1a black ${CheckPath}\n \u4f7f\u7528\u8fd9\u4e2a\u5de5\u5177\u683c\u5f0f\u5316\u4e4b\u540e\uff0c\u4ee3\u7801\u4f1a\u88ab\u81ea\u52a8\u8c03\u6574\uff0c\u521a\u5f00\u59cb\u4f60\u53ef\u80fd\u4f1a\u89c9\u5f97\u8c03\u6574\u5f97\u5f88\u5938\u5f20\uff0c\u6ca1\u5173\u7cfb\u575a\u6301\u770b\uff0c\u4e60\u60ef\u4e4b\u540e\uff0c\u4f60\u4f1a\u89c9\u5f97\u5f88\u4f18\u96c5\uff0c\u6ca1\u9519\uff0c\u8fd9\u5c31\u662f Pythonic Code \u7684\u6838\u5fc3\uff0c\u8bf7\u4fdd\u6301\u4f18\u96c5\uff5e\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_8","title":"2. \u4ee3\u7801\u626b\u63cf\u5de5\u5177","text":"\u4f7f\u7528\u6839\u76ee\u5f55\u4e0b pylint.sh \u626b\u63cf\u4ee3\u7801\uff0c\u5728 report \u76ee\u5f55\u4e0b\u67e5\u770b\u4ee3\u7801\u626b\u63cf\u62a5\u544a\uff0c\u5982\u679c\u6709\u4ee3\u7801\u95ee\u9898\u8bf7\u63d0\u524d\u89e3\u51b3\u4e4b\u540e\u518d\u63d0\u4ea4\u3002 \u6b64\u811a\u672c\u5df2\u7ecf\u4f7f\u7528 Python \u793e\u533a\u6700\u6d41\u884c\u7684\u4ee3\u7801\u626b\u63cf\u5de5\u5177 Pylint \u8fdb\u884c\u4ee3\u7801\u626b\u63cf\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a bash pylint.sh\n \u8fd0\u884c\u4e4b\u540e\u4f1a\u63d0\u793a\u4f60\u8981\u626b\u63cf\u7684\u76ee\u5f55\uff0c\u6bd4\u5982\u8f93\u5165 apps \uff0c\u5219\u4f1a\u626b\u63cf apps \u4e0b\u7684\u6240\u6709 Python \u4ee3\u7801\u3002 \u5728 setting/pylintrc.cfg \u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u76f8\u5173\u914d\u7f6e\uff0c\u626b\u63cf\u5b8c\u6210\u4e4b\u540e\u5728 report/pylints \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u626b\u63cf\u62a5\u544a\u3002 \u4ee3\u7801\u63d0\u4ea4\u9700\u901a\u8fc7 git review \u63d0\u4ea4\u5230 gerrit \uff0c\u4eba\u5de5 Code Review \u901a\u8fc7\u4e4b\u540e\u5408\u5165\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_11","title":"\u5341\u4e09\u3001\u63d0\u4ea4\u4ee3\u7801","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_9","title":"1. \u5b89\u88c5\u4f9d\u8d56","text":"sudo apt install git-review\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_9","title":"2. \u63d0\u4ea4\u6a21\u677f","text":"\u5728 ~ \u76ee\u5f55\u4e0b\u65b0\u5efa\u6587\u4ef6\uff0c\u5e76\u547d\u540d\u4e3a gitcommit_template \u5c06\u4ee5\u4e0b\u5185\u5bb9\u5199\u5165\u6587\u4ef6\u5f53\u4e2d\uff1a # commit type :fix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style(\u98ce\u683c\u4fee\u6539)\u3001refactor(\u91cd\u6784)\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test(\u6d4b\u8bd5) + \u7b80\u5355\u63cf\u8ff0. \u9ed8\u8ba4fix,\u6839\u636e\u60c5\u51b5\u4fee\u6539\nfix: \n\n# \u8be6\u7ec6\u8bf4\u660e\u4ee3\u7801\u7684\u6539\u52a8\uff0c\u5305\u542b\u4ee3\u7801\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u4ee5\u53ca\u4e3a\u4ec0\u4e48\u8fd9\u4e48\u505a\uff0c\u53ef\u80fd\u4f1a\u5f71\u54cd\u54ea\u4e9b\u529f\u80fd\u3002\u5bf9\u4e8e\u4ee3\u7801\u7684\u5ba1\u6838\u8005\uff0c\u9700\u8981\u4ece\u8fd9\u6bb5\u63cf\u8ff0\u4e2d\u80fd\u5b8c\u5168\u7406\u89e3\u4ee3\u7801\u4e2d\u6240\u6709\u6539\u52a8\u7684\u5185\u5bb9\nDescription: \n\n# \u5199\u4e00\u6bb5\u9762\u5411\u4e8e\u4ea7\u54c1\u7684\u603b\u7ed3\u6027\u5185\u5bb9\uff0c\u7528\u4e8e\u81ea\u52a8\u751f\u6210crp\u4e0a\u7684changlog\uff0c\u9700\u8981\u6ce8\u610f\u7684\u4e8b\uff0c\u8fd9\u6bb5\u63cf\u8ff0\u5fc5\u987b\u4ece\u4ea7\u54c1\u7684\u89d2\u5ea6\u8003\u8651\u3002\nLog: \n\n# \u5173\u8054pms\u4e0a\u7684bug\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94bug\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4fee\u590dbug\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Bug: \n\n# \u4fee\u590d github issue \n#Issue: \n\n# \u5173\u8054pms\u4e0a\u7684\u4efb\u52a1\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94\u4efb\u52a1\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4efb\u52a1\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Task: \n \u547d\u4ee4\u884c\u6267\u884c: git config --global commit.template ~/gitcommit_template\n \u6b64\u547d\u4ee4\u5c06\u6a21\u677f\u52a0\u5165\u5230 git \u7684\u63d0\u4ea4\u6a21\u677f\u4e2d\u3002 \u540e\u7eed\u63d0\u4ea4\u7684\u65f6\u5019\u9700\u8981\u5173\u6ce8\u4e00\u4e0b\u51e0\u70b9\uff1a commit type \u5bf9\u5e94\u4e0d\u540c\u7684\u4fee\u6539\u7c7b\u578b\uff1afix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style \uff08\u98ce\u683c\u4fee\u6539\uff09\u3001refactor \uff08\u91cd\u6784\uff09\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test \uff08\u6d4b\u8bd5\uff09 commit type \u5192\u53f7\u540e\u9762\u52a0\u7a7a\u683c\u3002 Description \u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u9700\u8981\u8fdb\u884c\u8be6\u7ec6\u8bf4\u660e\uff0c\u6bd4\u5982\u5bf9\u529f\u80fd\u8fdb\u884c\u5927\u6539\u7b49\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_6","title":"3. \u63a8\u9001\u4ee3\u7801","text":"\u9996\u5148\u6dfb\u52a0 commit \u4fe1\u606f git add \u540e\u9762\u52a0\u6587\u4ef6\u540d\u79f0\n git add . # \u8868\u793a\u6dfb\u52a0\u6240\u6709\u6587\u4ef6\n \u4f7f\u7528\u8fd9\u6761\u547d\u4ee4\u6ce8\u610f\u6709\u4e9b\u4e34\u65f6\u6587\u4ef6\u4e0d\u8981\u63d0\u4ea4\u5230\u4ed3\u5e93\u4e86\u3002 git commit -a\n \u4e4b\u540e\u5728 fix: \u540e\u9762\uff08\u6ce8\u610f\u5192\u53f7\u540e\u9762\u5fc5\u987b\u52a0\u7a7a\u683c\uff0c\u4e0d\u7136\u76f4\u63a5-1\uff09\u5199\u672c\u5730\u63d0\u4ea4\u7684 commit \u4fe1\u606f\uff0c\u7136\u540e\u5c31\u53ef\u4ee5\u63d0\u4ea4\u4ee3\u7801\u4e86 git review branch(\u5f53\u524d\u5206\u652f) -r origin\n \u6700\u597d\u4e00\u6b21 commit\uff0c\u4e00\u6b21 git review \uff0c\u7ecf\u5e38\u6709\u540c\u5b66\u5728\u672c\u5730\u75af\u72c2 commit \u6700\u540e git review \u62a5\u9519\u4e0d\u77e5\u9053\u548b\u56de\u4e8b\u513f\u3002 \u82e5\u4e0d\u60f3\u6bcf\u6b21\u63d0\u4ea4\u90fd\u52a0\u4e0a -r \u9009\u9879\uff0c\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a git config --global gitreview.remote origin \u63d0\u4ea4\u4ee3\u7801\uff0c\u76f4\u63a5\u4f7f\u7528 git review branch<\u76ee\u6807\u5206\u652f>\uff0c\u4f8b\u5982 git review master"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git","title":"4. Git\u6807\u7b7e","text":"Git \u6807\u7b7e\u5b9e\u9645\u4e0a\u662f commit \u7684\u4e00\u4e2a\u522b\u540d\uff0c\u4e3b\u8981\u7528\u4e8e\u7ba1\u7406\u5386\u53f2\u7248\u672c\u3002 \u60f3\u8c61\u4e00\u4e0b\u9886\u5bfc\u8ba9\u4f60\u628a\u4e4b\u524d\u7684\u67d0\u4e2a\u7248\u672c\u7684\u4ee3\u7801\u62c9\u51fa\u6765\u8dd1\uff0c\u4f60\u662f\u4e0d\u662f\u4e56\u4e56\u7684\u53bb\u628a\u6240\u6709\u63d0\u4ea4\u8bb0\u5f55\u62c9\u51fa\u6765\u627e\uff0c\u7136\u540e\u627e\u5230\u90a3\u4e2a\u54c8\u5e0c\u503c\uff0c\u901a\u8fc7\u54c8\u5e0c\u503c\u6765\u68c0\u51fa\u4ee3\u7801\u3002 \u8fd9\u4e00\u5957\u64cd\u4f5c\u4e0b\u6765\u662f\u4e0d\u662f\u5f88\u9ebb\u70e6\uff0c\u8d39\u65f6\u95f4\u8fd8\u4e0d\u4e00\u5b9a\u80fd\u627e\u5f97\u5230\uff0c\u6ca1\u4eba\u80fd\u8bb0\u4f4f\u6bcf\u4e2a\u63d0\u4ea4\u54c8\u5e0c\u503c\u4ee5\u53ca\u8fd9\u6b21\u63d0\u4ea4\u90fd\u6539\u4e86\u54ea\u4e9b\u4ee3\u7801\u3002 \u56e0\u6b64\u7ed9\u63d0\u4ea4\u6253\u4e2a\u6807\u7b7e\uff0c\u5c31\u662f\u628a\u54c8\u5e0c\u503c\u8f6c\u6362\u6210\u4eba\u7c7b\u80fd\u7406\u89e3\u7684\u8bed\u8a00\uff0c\u6bd4\u5982 v1.0\uff0c\u5c31\u53ef\u4ee5\u76f4\u63a5\u901a\u8fc7\u6807\u7b7e\u627e\u5230\u5bf9\u5e94\u7684\u63d0\u4ea4\u3002 \u65b0\u5efa\u6807\u7b7e git tag -a <tagname>\n \u56de\u8f66\u4e4b\u540e\uff0cGit \u4f1a\u6253\u5f00\u4f60\u7684\u7f16\u8f91\u5668\uff0c\u8ba9\u4f60\u5199\u4e00\u53e5\u6807\u7b7e\u6ce8\u89e3\uff0c\u5c31\u50cf\u4f60\u7ed9\u63d0\u4ea4\u5199\u6ce8\u89e3\u4e00\u6837\u3002 \u67e5\u770b\u6240\u6709\u6807\u7b7e git tag -l\n# git tag \u4e5f\u884c\n \u5220\u9664\u6807\u7b7e git tag -d <tagname>\n \u63a8\u9001\u6807\u7b7e\u81f3\u8fdc\u7a0b git push \u547d\u4ee4\u5e76\u4e0d\u4f1a\u4f20\u9001\u6807\u7b7e\u5230\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\uff0c\u5fc5\u987b\u663e\u5f0f\u5730\u63a8\u9001\u6807\u7b7e\u3002 git push origin <tagname>\n \u63a8\u9001\u6240\u6709\u4e0d\u5728\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\u7684\u6807\u7b7e git push origin --tag\n \u5220\u9664\u8fdc\u7a0b\u6807\u7b7e git push origin :refs/tag/<tagname>\n \u540e\u671f\u6253\u6807\u7b7e \u5148\u7528 git log --pretty=oneline \u67e5\u8be2\u63d0\u4ea4\u8bb0\u5f55\uff0c\u83b7\u53d6\u6821\u9a8c\u7801\u3002 git tag -a <tagname> 9fceb02(\u6821\u9a8c\u7801)\n \u68c0\u51fa\u6807\u7b7e git checkout <tagname>\n \u6b64\u65f6\uff0c\u4ed3\u5e93\u4f1a\u5904\u4e8e\u201c\u5206\u79bb\u5934\u6307\u9488\uff08detached HEAD\uff09\u201d\u7684\u72b6\u6001\u3002 \u5728\u201c\u5206\u79bb\u5934\u6307\u9488\u201d\u72b6\u6001\u4e0b\uff0c\u5982\u679c\u4f60\u505a\u4e86\u67d0\u4e9b\u66f4\u6539\u7136\u540e\u63d0\u4ea4\u5b83\u4eec\uff0c\u6807\u7b7e\u4e0d\u4f1a\u53d1\u751f\u53d8\u5316\uff0c \u4f46\u4f60\u7684\u65b0\u63d0\u4ea4\u5c06\u4e0d\u5c5e\u4e8e\u4efb\u4f55\u5206\u652f\uff0c\u5e76\u4e14\u5c06\u65e0\u6cd5\u8bbf\u95ee\uff0c\u9664\u975e\u901a\u8fc7\u786e\u5207\u7684\u63d0\u4ea4\u54c8\u5e0c\u624d\u80fd\u8bbf\u95ee\u3002 \u56e0\u6b64\uff0c\u5982\u679c\u4f60\u9700\u8981\u8fdb\u884c\u66f4\u6539\uff0c\u6bd4\u5982\u4f60\u8981\u4fee\u590d\u65e7\u7248\u672c\u4e2d\u7684\u9519\u8bef\uff0c\u90a3\u4e48\u901a\u5e38\u9700\u8981\u521b\u5efa\u4e00\u4e2a\u65b0\u5206\u652f\uff1a git checkout -b <NewBranchName> <tagname>\n \u65b0\u5206\u652f\u4e0a\u53ef\u4ee5\u8fdb\u884c\u63d0\u4ea4\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_12","title":"\u5341\u56db\u3001\u5e38\u89c1\u95ee\u9898","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_10","title":"1. \u63d0\u4ea4\u4ee3\u7801\u65f6\u63d0\u793a\u90ae\u7bb1\u6216\u8005\u540d\u79f0\u4e0d\u5bf9","text":"\u91cd\u65b0\u914d\u7f6e\u90ae\u7bb1\u6216\u8005\u540d\u79f0\uff0c\u7136\u540e\u91cd\u7f6e\u751f\u6548\uff1a git commit --amend --reset-author\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_10","title":"2. \u600e\u4e48\u56de\u6eda\u5230\u4e4b\u524d\u7684\u7248\u672c","text":"(1)\u67e5\u8be2\u5386\u53f2\u63d0\u4ea4\u8bb0\u5f55 git log\n \u627e\u5230\u4f60\u8981\u56de\u6eda\u7684\u7248\u672c\uff0c\u590d\u5236 hash \u503c\u3002 \u6ce8\u610f\uff1a\u662f commit \u7a7a\u683c\u4e4b\u540e\u7684 hash \u503c\uff0c\u4e4b\u524d\u6709\u540c\u5b66\u590d\u5236\u7684 Change-Id: \u8fd9\u6837\u80af\u5b9a\u62a5\u9519\u3002 (2)\u56de\u6eda\u7248\u672c\uff0c\u4e0d\u6e05\u9664\u4ee3\u7801 git reset --soft ${hash}\n (3)\u56de\u6eda\u7248\u672c\uff0c\u6e05\u9664\u4ee3\u7801\uff0c\u614e\u7528\u54c8 git reset --hard ${hash}\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-f-s-e","title":"3. \u6d4b\u8bd5\u62a5\u544a\u91cc\u9762 F S . E \u662f\u4ec0\u4e48\u610f\u601d","text":"F \u8868\u793a\u5931\u8d25\uff0c. \uff08\u70b9\uff09\u8868\u793a\u901a\u8fc7\uff0cS \u8868\u793a\u8df3\u8fc7\uff0cE \u8868\u793a error \u6709\u62a5\u9519"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git-status","title":"4. \u89e3\u51b3 git status \u4e2d\u6587\u663e\u793a\u7684\u95ee\u9898","text":"git config --global core.quotePath false\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5-apps","title":"5. apps \u76ee\u5f55\u4e0b\u989c\u8272\u6709\u4e9b\u662f\u9ec4\u8272\u7684","text":"\u5728 Pycharm \u4e2d apps \u76ee\u5f55\u4e0b\u5e94\u7528\u5e93\u6587\u4ef6\u662f\u9ec4\u8272\u7684\uff0c\u7f16\u8f91\u5668\u8bc6\u522b\u4e0d\u5230\u4ee3\u7801\u65b0\u589e\u548c\u4fee\u6539\uff1b \u7531\u4e8e\u793e\u533a\u7248 Pycharm \u4e0d\u80fd\u52a8\u6001\u8bc6\u522b\u591a\u4ed3\u5e93\uff0c\u9700\u8981\u5728 setting \u91cc\u9762\u624b\u52a8\u6ce8\u518c\uff0c\u64cd\u4f5c\u6b65\u9aa4\uff1a File \u2014> Settings \u2014> Version Control \u2014> \u70b9 + \u53f7 \u2014> Directory \u9009\u4e2d\u5e94\u7528\u5e93\u5de5\u7a0b\u76ee\u5f55 \u2014> VCS \u9009\u4e2d Git \u2014> Apply \u5982\u6b64\u5c31\u53ef\u4ee5\u4e86\u3002 \u4e13\u4e1a\u7248 Pycharm \u4e0d\u5b58\u5728\u8fd9\u4e2a\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#6-envsh-r","title":"6. \u6267\u884c env.sh \u62a5\u9519 $'\\r':\u672a\u627e\u5230\u547d\u4ee4","text":"\u51fa\u73b0\u8fd9\u4e2a\u95ee\u9898\u4f60\u5e94\u8be5\u662f\u5728 windows \u4e0a\u6253\u5f00\u6216\u7f16\u8f91\u8fc7 env.sh \u811a\u672c\uff0cwindows\u4e0b\u7684\u6362\u884c\u662f\u56de\u8f66\u7b26+\u6362\u884c\u7b26\uff0c\u4e5f\u5c31\u662f\\r\\n\uff0c\u800c Linxu \u4e0b\u662f\u6362\u884c\u7b26 \\n\uff0cLinux \u4e0b\u4e0d\u8bc6\u522b \\r\uff0c\u56e0\u6b64\u62a5\u9519\u3002 \u89e3\u51b3\u65b9\u6848\uff1a # \u5c06 \\r \u66ff\u6362\u4e3a\u7a7a\nsudo sed -i 's/\\r//' env.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#7","title":"7.\u600e\u6837\u4e3a\u5355\u72ec\u67d0\u4e00\u6761\u7528\u4f8b\u914d\u7f6e\u6267\u884c\u8d85\u65f6\u65f6\u95f4","text":"\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u5982\u4e0b\uff1a @pytest.mark.timeout(300) # \u5355\u4f4d\u79d2\ndef test_xxx_001():\npass\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#8-youqu","title":"8. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u6240\u6709\u4ee3\u7801\uff0c\u5305\u542b\u5b50\u4ed3\u5e93","text":"\u524d\u7f6e\u6761\u4ef6\uff1a\u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 # \u7b2c\u4e00\u6b21\u5b58\u50a8\u5bc6\u7801\uff0c\u63d0\u4f9b\u540e\u9762\u62c9\u4ee3\u7801(gerrit: ldap\u8d26\u53f7\u548c\u5bc6\u7801\uff0cgit\u62c9\u53d6\u7b2c\u4e00\u6b21\u8f93\u5165\u4fdd\u5b58\uff0c\u540e\u9762\u76f4\u63a5\u4f7f\u7528)\ngit config --global credential.helper store\n\n# \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\uff0c\u5e76\u9012\u5f52\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\" --recursive\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#9-youqu","title":"9. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\u6307\u5b9a\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u524d\u7f6e\u6761\u4ef6\uff1a \u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 \u5df2\u5b58\u50a8\u8bbf\u95ee\u5bc6\u7801 # \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\"\n# \u6307\u5b9a\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ncd youqu\ngit submodule update --init apps/autotest_xxx_xxx\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#10-youqu","title":"10. \u5982\u4f55\u66f4\u65b0 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\uff0c\u6240\u6709\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u66f4\u65b0\u6240\u6709\u5b50\u4ed3\u5e93\u4ee3\u7801 cd youqu\ngit pull & git submodule foreach git pull\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#11-youqu-master-detached-head","title":"11. \u5982\u4f55\u4fee\u590d YouQu \u6240\u6709\u5b50\u4ed3\u5e93 master \u5206\u652f\u6e38\u79bb\u5934\uff08detached head\uff09","text":"\u4fee\u590d\u6240\u6709\u5b50\u4ed3\u5e93\u9ed8\u8ba4master \u5206\u652f\u6e38\u79bb\u5934 cd youqu\ngit submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/","title":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212 \u5206\u7c7b\uff1a/ \u67b6\u6784\u5e08\uff1a/ \u76ee\u6807\uff1a \u5e94\u7528 AT \u67b6\u6784\u5de5\u7a0b\u5316\uff0c\u53c2\u8003\u6027\u80fd\u81ea\u52a8\u5316\u5de5\u7a0b\u5b8c\u6210\u5de5\u7a0b\u5316\u6539\u9020\u3002 \u5e94\u7528\u95f4\u7528\u4f8b\u89e3\u8026\uff0c\u89e3\u9664\u6240\u6709\u4ea4\u53c9\u8c03\u7528\u7684\u65b9\u6cd5\uff0c\u5404\u5e94\u7528\u80fd\u8ddf\u968f\u81ea\u8eab\u8fed\u4ee3\u5468\u671f\u72ec\u7acb\u7ef4\u62a4 AT \u7528\u4f8b\u3002 \u5b8c\u6210\u516c\u5171\u65b9\u6cd5\u7684\u62bd\u53d6\u6574\u5408\uff0c\u5f62\u6210\u4e00\u5957\u72ec\u7acb\u4e8e\u5e94\u7528\u95f4\u7684\u516c\u5171\u65b9\u6cd5\u5e93\uff0c\u5404\u5e94\u7528\u65b9\u6cd5\u91cc\u9762\u4e0d\u5b58\u5728\u88ab\u591a\u4e2a\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\u3002 \u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u4e3a\u5c06\u6765\u9002\u914d\u66f4\u591a\u7684 AT \u8fd0\u7528\u573a\u666f\u63d0\u4f9b\u652f\u6491\uff0c\u539f\u5219\u4e0a\u53ef\u5b9e\u73b0\u65e0\u9650\u6269\u5c55\uff0c\u5728\u6bcf\u65e5\u6784\u5efa\u548c\u6301\u7eed\u96c6\u6210\u6d41\u7a0b\u843d\u5730\u4f7f\u7528\u3002 \u4ee3\u7801\u89c4\u8303\u95ee\u9898\u6e05\u96f6\uff0c\u7b26\u5408 Shell Check\u3001Pylint\u3001\u7cfb\u7edf\u90e8\u76f8\u5173\u7f16\u7801\u89c4\u8303\u8981\u6c42\u3002 \u610f\u4e49\uff1a \u7edf\u4e00\u6210\u7814 AT \u67b6\u6784\u8bbe\u8ba1\u601d\u8def\uff0c\u6d88\u9664 AT \u4ee3\u7801\u5b9e\u73b0\u548c\u7ef4\u62a4\u4e0a\u53ef\u80fd\u51fa\u73b0\u7684\u5206\u6b67\uff0c\u6539\u5584\u5386\u53f2 AT \u65e0\u5de5\u7a0b\u5316\u8bbe\u8ba1\u7684\u7f3a\u9677\uff0c\u63d0\u9ad8\u67b6\u6784\u4e13\u4e1a\u6027\u3002 \u5404\u5e94\u7528 AT \u4ee3\u7801\u76f8\u4e92\u72ec\u7acb\uff0c\u5951\u5408\u5e94\u7528\u72ec\u7acb\u53d1\u5e03\u7279\u6027\uff0c\u53ef\u652f\u6301\u8fed\u4ee3\u671f\u95f4\u72ec\u7acb\u65b0\u589e\u3001\u7ef4\u62a4\u548c\u6267\u884c\u3002 \u65b9\u6cd5\u8c03\u7528\u903b\u8f91\u5f97\u5230\u7b80\u5316\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u66f4\u9ad8\u6548\uff1b\u516c\u5171\u5e93\u62bd\u53d6\uff0c\u51cf\u5c11\u65b9\u6cd5\u91cd\u590d\u7f16\u5199\uff0c\u63d0\u9ad8\u4ee3\u7801\u5229\u7528\u7387\uff1b\u5e73\u5747\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u4ece40\u5206\u949f\u964d\u4f4e\u81f330\u5206\u949f\uff0c\u65e5\u4ea7\u51fa\u7528\u4f8b\u4ece12\u6761/\u5929\u63d0\u5347\u81f316\u6761/\u5929\u3002 \u53ef\u7075\u6d3b\u652f\u6491\u4e0d\u540c\u7684\u81ea\u52a8\u5316\u8fd0\u7528\u573a\u666f\uff0c\u5982 CI\u3001\u5192\u70df\u6d4b\u8bd5\u3001\u96c6\u6210\u6d4b\u8bd5\u3001\u56de\u5f52\u6d4b\u8bd5\u3001\u4e13\u9879\u6d4b\u8bd5\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_2","title":"\u4e00\u3001\u80cc\u666f\u4ecb\u7ecd","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1","title":"1\u3001\u73b0\u6709\u67b6\u6784\u4ecb\u7ecd","text":"\u73b0\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u6574\u4f53\u5206\u4e3a\u4e09\u5c42\uff1a\u7528\u4f8b\u5c42\uff08\u4e1a\u52a1\u903b\u8f91\u5c42\uff09\u3001\u4e2d\u95f4\u5c42\uff08\u5143\u7d20\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff09\u3001\u6838\u5fc3\u5c42\uff08\u5e95\u5c42\u529f\u80fd\u5e93\u5c42\uff09\u3002 \u7528\u4f8b\u5c42\uff1a\u5373\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4e13\u6ce8\u4e8e\u4e1a\u52a1\u529f\u80fd\u903b\u8f91\uff0c\u4e0d\u5173\u5fc3\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\uff1b \u4e2d\u95f4\u5c42\uff1a\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff0c\u6bcf\u4e2a\u65b9\u6cd5\u5747\u5bf9\u5e94\u4e00\u4e2a\u5143\u7d20\u7684\u4e00\u4e2a\u5177\u4f53\u64cd\u4f5c\uff0c\u4e5f\u53ef\u4ee5\u662f\u591a\u4e2a\u64cd\u4f5c\u7684\u7ec4\u5408\u64cd\u4f5c\uff0c\u4e2d\u95f4\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u7528\u4f8b\u5c42\uff0c\u5177\u6709\u53ef\u6269\u5c55\u6027\u548c\u590d\u7528\u6027\uff1b \u6838\u5fc3\u5c42\uff1a\u4e3b\u8981\u5c01\u88c5\u7684\u5e95\u5c42\u529f\u80fd\u5b9e\u73b0\uff0c\u6b64\u5c42\u5728\u6846\u67b6\u4e2d\u63d0\u4f9b\u4e00\u4e9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u529f\u80fd\u6a21\u5757\u76f8\u5bf9\u72ec\u7acb\uff0c\u6838\u5fc3\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u64cd\u4f5c\u5c42\uff0c\u6bd4\u5982\uff1a\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7 UI \u5750\u6807\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u952e\u9f20\u64cd\u4f5c\u7684\u57fa\u7840\u65b9\u64cd\u4f5c\u6a21\u5757\u3001Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757\u3001\u6587\u4ef6\u7684\u589e\u5220\u6539\u67e5\u64cd\u4f5c\u6a21\u5757\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2","title":"2\u3001\u81ea\u52a8\u5316\u7684\u5e94\u7528","text":"2.1\u3001CI \u6d41\u7a0b \u6bcf\u65e5\u6784\u5efa\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u7814\u53d1\u6bcf\u65e5\u63d0\u4ea4\u7684\u4ee3\u7801\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u73ed\u4e4b\u540e\u4f1a\u5c06\u5404\u5e94\u7528\u8fdb\u884c\u6253\u5305\uff0c\u7136\u540e\u5728\u6d4b\u8bd5\u673a\u4e0a\u5b89\u88c5\u66f4\u65b0 deb \u5305\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u5e94\u7528\u63d0\u4ea4\u96c6\u6210\u7684\u7248\u672c\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u8f7d\u6700\u65b0\u7684 ISO \u8fdb\u884c PXE \u90e8\u7f72\uff0c\u7136\u540e\u6d4b\u8bd5\u673a\u5b89\u88c5\u6700\u65b0\u7684\u955c\u50cf\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 2.2\u3001\u9a8c\u6536\u6d4b\u8bd5 \u5728\u5404\u9a8c\u6536\u8282\u70b9\u8fdb\u884c\u81ea\u52a8\u5316\u9a8c\u6536\uff0c\u76ee\u524d\u7684\u7b56\u7565\u662f\u5168\u7528\u4f8b\u8986\u76d6\u5168\u67b6\u6784\u3002 2.3\u3001\u56de\u5f52\u6d4b\u8bd5 \u56de\u5f52\u6d4b\u8bd5\u4eca\u5e74\u89c4\u5212\u5efa\u8bbe\u4e2d\uff0c\u65e8\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u6267\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\uff0c\u51cf\u5c11\u529f\u80fd\u6d4b\u8bd5\u7684\u91cd\u590d\u52b3\u52a8\u529b\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3","title":"3\u3001\u5b58\u5728\u7684\u95ee\u9898","text":" \u5404\u5e94\u7528\u4e4b\u95f4\u5b58\u5728\u8026\u5408 \u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u521d\u671f\uff0c\u6240\u6709\u5e94\u7528\u662f\u6574\u4f53\u53d1\u5e03\uff0c\u6211\u4eec\u662f\u5c06\u6240\u6709\u5e94\u7528\u770b\u6210\u662f\u4e00\u4e2a\u6574\u4f53\uff0c\u5404\u5e94\u7528\u4f5c\u4e3a\u5176\u4e2d\u7684\u4e00\u4e2a\u6a21\u5757\uff0c\u6240\u4ee5\u5b58\u5728\u5e94\u7528\u95f4\u65b9\u6cd5\u4ea4\u53c9\u8c03\u7528\u7684\u95ee\u9898\uff0c\u8fd9\u6837\u4ece\u6700\u521d\u7684\u8bbe\u8ba1\u6765\u8bb2\u786e\u5b9e\u80fd\u591f\u51cf\u5c11\u91cd\u590d\u4ee3\u7801\u7684\u7f16\u5199\u3002\u4f46\u662f\u73b0\u5728\u5e94\u7528\u8d70\u72ec\u7acb\u53d1\u5e03\uff0c\u5404\u5e94\u7528\u90fd\u6709\u81ea\u5df1\u7684\u8fed\u4ee3\u8282\u594f\uff0c\u5728\u65b0\u9700\u6c42\u5feb\u901f\u53d8\u5316\u7684\u8fc7\u7a0b\u4e2d\uff0c\u81ea\u52a8\u5316\u7ef4\u62a4\u53d8\u5f97\u5f02\u5e38\u56f0\u96be\uff0c\u539f\u56e0\u5c31\u662f\u81ea\u52a8\u5316\u9879\u76ee\u91cc\u9762\u5404\u4e2a\u5e94\u7528\u7684\u6709\u6bd4\u8f83\u591a\u7684\u8026\u5408\u5173\u7cfb\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u8fdb\u884c\u89e3\u8026\uff0c\u4ee5\u9002\u5e94\u5e94\u7528\u4e0d\u540c\u7684\u8fed\u4ee3\u5468\u671f\u3002 \u65e0\u6cd5\u7cbe\u51c6\u7684\u5212\u5206\u7528\u4f8b\u8303\u56f4 \u7528\u4f8b\u6267\u884c\u7684\u8303\u56f4\u4e0d\u591f\u7cbe\u51c6\uff0c\u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u4e3b\u8981\u901a\u8fc7\u7528\u4f8b\u7684\u5173\u952e\u8bcd core\uff08\u6838\u5fc3\uff09\u6765\u533a\u5206\u7528\u4f8b\u662f\u5426\u4e3a\u6838\u5fc3\u7528\u4f8b\uff0c\u4f46\u662f\u8fd9\u6837\u7684\u533a\u5206\u592a\u5bbd\u6cdb\u4e86\uff0c\u4e0d\u80fd\u9002\u5e94\u81ea\u52a8\u5316\u6d4b\u8bd5\u5728\u591a\u573a\u666f\u4e0b\u7684\u5e94\u7528\u3002\u5f88\u591a\u573a\u666f\u4e0b\u6211\u4eec\u8fd8\u9700\u8981\u6839\u636e\u7528\u4f8b\u7684\u7b49\u7ea7\u3001\u7528\u4f8b\u7684\u7c7b\u578b\u3001\u7528\u4f8b\u6765\u6e90\u7b49\u7b49\uff0c\u4e0d\u540c\u7684\u7ef4\u5ea6\u6765\u6311\u9009\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u5173\u952e\u5b57\u9700\u8981\u4eba\u5de5\u4e00\u6761\u6761\u7684\u6539\uff0c\u8d39\u65f6\u8d39\u529b\uff0c\u800c\u4e14\u4e0d\u597d\u7ef4\u62a4\u3002 \u53d7\u65b0\u9700\u6c42\u5f71\u54cd\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u597d\u7ef4\u62a4 \u76ee\u524d\u9700\u8981\u8df3\u8fc7\u7684\u7528\u4f8b\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684\u7528\u4f8b\u811a\u672c\u91cc\u9762\uff0c\u6dfb\u52a0\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\uff0c\u540e\u7eed\u89e3\u9664\u8df3\u8fc7\u7684\u65f6\u5019\u53c8\u9700\u8981\u627e\u5230\u8fd9\u6761\u811a\u672c\uff0c\u5220\u6389\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\u3002\u5728\u8df3\u8fc7\u7528\u4f8b\u8f83\u591a\u7684\u60c5\u51b5\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u96be\u5ea6\u3002 \u7f16\u5199\u7528\u4f8b\u65f6\u903b\u8f91\u6bd4\u8f83\u590d\u6742\uff0c\u9700\u8981\u8c03\u7528\u591a\u4e2a\u5e94\u7528\u7684\u65b9\u6cd5\u6a21\u5757\u3002 \u6846\u67b6\u6269\u5c55\u6027\u4e0d\u8db3\uff0c\u65e0\u6cd5\u6574\u5408\u6027\u80fd\u81ea\u52a8\u5316\u3001\u538b\u6d4b\u81ea\u52a8\u5316\u3001\u5b89\u5168\u81ea\u52a8\u5316\u7b49\u4e13\u9879\u6d4b\u8bd5\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_3","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u4e3a\u89e3\u51b3\u73b0\u6709\u95ee\u9898\uff0c\u9002\u5e94\u4e0d\u65ad\u4e30\u5bcc\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u66f4\u597d\u7684\u53d1\u6325\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4f5c\u7528\uff0c\u9700\u8981\u5bf9\u81ea\u52a8\u5316\u67b6\u6784\u53ca\u5404\u529f\u80fd\u6a21\u5757\u8fdb\u884c\u91cd\u65b0\u8bbe\u8ba1\u89c4\u5212\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_1","title":"1\u3001\u67b6\u6784\u8bbe\u8ba1","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_1","title":"2\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u6846\u67b6\u7684\u8fd0\u884c\u903b\u8f91\uff1a\u901a\u8fc7\u6838\u5fc3\u5c42\u63d0\u4f9b\u4e00\u4e2a\u57fa\u7840\u80fd\u529b\uff0c\u4e1a\u52a1\u5c42\u6839\u636e\u5b9e\u9645\u4e1a\u52a1\u9700\u6c42\uff08\u6d4b\u8bd5\u7528\u4f8b\uff09\u52a8\u6001\u52a0\u8f7d\u6838\u5fc3\u5c42\uff0c\u6267\u884c\u5165\u53e3\u52a0\u8f7d\u76f8\u5e94\u7684\u7528\u4f8b\u96c6\u5e76\u63a7\u5236\u6267\u884c\uff0c\u5e94\u7528\u5c42\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u9700\u6c42\uff0c\u901a\u8fc7\u76f8\u5e94\u7684\u914d\u7f6e\u9879\u8fdb\u884c\u914d\u7f6e\uff0c\u4ece\u800c\u89e6\u53d1\u81ea\u52a8\u5316\u6d4b\u8bd5\u4efb\u52a1\u3002 \u6838\u5fc3\u5c42\uff1a\u57fa\u672c\u4fdd\u6301\u4e0d\u53d8\uff0c\u90e8\u5206\u6a21\u5757\u4f1a\u6d89\u53ca\u5230\u65b0\u529f\u80fd\u5f00\u53d1\uff0c\u6838\u5fc3\u5c42\u5404\u529f\u80fd\u6a21\u5757\u4fdd\u6301\u72ec\u7acb\u6027\uff0c\u63d0\u4f9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u4f9b\u4e0a\u5c42\u8c03\u7528\uff1b \u5e95\u5c42\u6838\u5fc3\u6a21\u5757\u5305\u62ec\uff1a \u56fe\u50cf\u8bc6\u522b\u6a21\u5757 UI \u5b9a\u4f4d\u6a21\u5757 Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757 \u5c5e\u6027\u5b9a\u4f4d\u6a21\u5757 \u65e5\u5fd7\u6a21\u5757 \u952e\u9f20\u64cd\u4f5c\u6a21\u5757 \u6587\u4ef6\u64cd\u4f5c\u6a21\u5757 \u5f55\u5c4f\u6a21\u5757 \u81ea\u5b9a\u4e49\u65ad\u8a00\u6a21\u5757 \u7528\u4f8b\u6267\u884c\u6a21\u5757 PXE \u88c5\u673a\u6a21\u5757 \u952e\u9f20\u4fe1\u53f7\u6a21\u62df\u6a21\u5757 OCR \u6a21\u5757 \u4e1a\u52a1\u5c42\uff1a\u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e94\u7528\u5185\u5305\u542b\u591a\u4e2a\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5982\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7b49\uff0c\u540e\u7eed\u53ef\u4ee5\u6839\u636e\u9700\u8981\u5ac1\u63a5\u8fdb\u6765\u3002\u5176\u4e2d\u529f\u80fd\u6d4b\u8bd5\u8bbe\u8ba1\u601d\u8def\uff1a \u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e76\u5c06\u6d4b\u8bd5\u6570\u636e\u548c\u6d4b\u8bd5\u8d44\u6e90\u6574\u5408\u8fdb\u6765\uff0c\u589e\u52a0\u7528\u4f8b\u6807\u7b7e csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ed9\u6bcf\u6761\u7528\u4f8b\u6253\u6807\u7b7e\u3002 \u5404\u6807\u7b7e\u6240\u4f7f\u7528\u5bf9\u5e94\u7684\u5b57\u6bb5\u540d\u79f0\uff0c\u4f7f\u7528 csv \u6587\u4ef6\u7ef4\u62a4\u7528\u4f8b\u4e0e\u6807\u7b7e\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u5bf9\u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u53ef\u4ee5\u7ec4\u5408\u5176\u4e2d\u7684\u6807\u7b7e\u800c\u4ece\u9a71\u52a8\u5bf9\u5e94\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\uff0c\u517c\u5bb9\u73b0\u6709\u7528\u4f8b\u6807\u7b7e\uff0c\u4e14\u652f\u6301\u7528\u4f8b\u6807\u7b7e\u53ef\u6269\u5c55\uff1b \u4f7f\u7528 csv \u683c\u5f0f\u6587\u4ef6\u53ef\u4ee5\u65b9\u4fbf\u7684\u4f7f\u7528 Excel \u8868\u683c\u6253\u5f00\u8fdb\u884c\u7f16\u8f91\uff0c\u540c\u65f6\u7531\u4e8e csv \u6587\u4ef6\u5b9e\u9645\u662f\u4ee5\u90fd\u597d\u5206\u9694\u7684\u6587\u672c\u6587\u4ef6\uff0c\u4ee3\u7801\u4e2d\u53ef\u4ee5\u5728\u4e0d\u4f9d\u8d56\u4e09\u65b9\u5e93\u7684\u60c5\u51b5\u4e0b\u65b9\u4fbf\u5feb\u901f\u7684\u89e3\u6790\u5b83\uff0c\u53ef\u64cd\u4f5c\u6027\u548c\u53ef\u7ef4\u62a4\u6027\u8f83\u9ad8\u3002 \u5404\u4e2a\u5e94\u7528\u4e4b\u95f4\uff0c\u7528\u4f8b\u3001\u65b9\u6cd5\u3001\u6807\u7b7e\u548c\u8d44\u6e90\u90fd\u662f\u76f8\u4e92\u72ec\u7acb\u7684\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u7528\u4f8b\u65f6\u53ea\u9700\u8981\u81ea\u5df1\u5e94\u7528\u4e0b\u7684\u65b9\u6cd5\u548c\u516c\u5171\u5e93\u5373\u53ef\u3002 \u7ed3\u6784\u4e3e\u4f8b\uff1a .\n\u251c\u2500\u2500 apps\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_album # \u5e94\u7528\u540d (\u7528\u4e0b\u5212\u7ebf\u8fde\u63a5\u662f Python \u7f16\u7801\u89c4\u8303)\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_assert # \u65ad\u8a00\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_function_tag.csv # \u7528\u4f8b\u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 asan_cases # \u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases # \u529f\u80fd\u6d4b\u8bd5\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 res # \u6d4b\u8bd5\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config # \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_widget # \u5e94\u7528\u81ea\u5df1\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_widget # \u65b9\u6cd5\u57fa\u7c7b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 other_widget # \u8c03\u7528\u5176\u4ed6\u5e94\u7528\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_camera\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases\n\u2502\u00a0\u00a0 \u2502\u00a0 ...\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 public_widget # \u516c\u5171\u65b9\u6cd5\u5e93\n\u251c\u2500\u2500 config # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n...\n config \u914d\u7f6e\u6a21\u5757\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u76f8\u5e94\u914d\u7f6e\uff0c\u6d4b\u8bd5\u540c\u5b66\u53ef\u4ee5\u6839\u636e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5728 config \u91cc\u9762\u8fdb\u884c\u914d\u7f6e\u3002 \u5168\u5c40\u914d\u7f6e\uff1a \u6267\u884c\u4e00\u4e2a\u6216\u591a\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff1a\u5728 pattern \u91cc\u9762\u5199\u5165\u5e94\u7528\u5305\u540d\uff0c\u591a\u4e2a\u5e94\u7528\u4e4b\u95f4\u7528 or \u8fde\u63a5\uff0c\u5982 deepin-music or deepin-movie\uff1b \u5192\u70df\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a smoke\uff1b \u96c6\u6210\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a core \uff1b \u5168\u91cf\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u4e3a\u7a7a\u5373\u53ef\uff1b \u901a\u8fc7 tags \u7684\u914d\u7f6e\u6bd4\u8f83\u7075\u6d3b\uff0c\u540e\u9762\u6807\u7b7e\u5316\u7ba1\u7406\u7ae0\u8282\u4f1a\u8bb2\u5230\uff0c\u652f\u6301\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u7075\u6d3b\u914d\u7f6e\u3002 \u6307\u5b9a\u67d0\u53f0\u673a\u5668\u5728\u6307\u5b9a\u955c\u50cf\u7248\u672c\u4e0a\u6267\u884c\u7528\u4f8b\uff1a\u5728 IP \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a IP\uff0c\u5e76\u5728 URL \u91cc\u9762\u586b\u5165\u955c\u50cf\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u6846\u67b6\u4f1a\u8c03\u7528 PXE \u8fdb\u884c\u81ea\u52a8\u88c5\u673a\uff0c\u88c5\u673a\u5b8c\u4e4b\u540e\u81ea\u52a8\u5f00\u59cb\u6267\u884c\u914d\u7f6e\u7684\u6d4b\u8bd5\u7528\u4f8b\u3002 \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\uff1a \u6bcf\u4e2a\u5e94\u7528\u5185\u90e8\u4f1a\u6709\u4e00\u4e2a\u5355\u72ec\u7684\u914d\u7f6e\u6a21\u5757\uff0c\u4f1a\u5305\u542b\u4e00\u4e9b\u672c\u5e94\u7528\u7684\u6d4b\u8bd5\u8d44\u6e90\u7684\u8def\u5f84\u3001\u6267\u884c\u7528\u4f8b\u7684\u6807\u7b7e\u914d\u7f6e\u7b49\u7b49\uff0c\u5982\u679c\u5728\u5c40\u90e8\u914d\u7f6e\u91cc\u9762\u914d\u7f6e\u4e86\u7528\u4f8b\u6267\u884c\u6807\u7b7e\uff0c\u800c\u5916\u5c42 runner \u51fa\u6ca1\u6709\u6307\u5b9a\u6267\u884c\u6807\u7b7e\uff0c\u5219\u5728\u6267\u884c\u65f6\u53ea\u4f1a\u6267\u884c\u5c40\u90e8\u914d\u7f6e\u5df2\u914d\u7f6e\u7684\uff0c\u82e5\u5916\u5c42 runner \u4e5f\u914d\u7f6e\u4e86\u6267\u884c\u6807\u7b7e\uff0c\u5219\u4f1a\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u7528\u4f8b\u3002 \u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u914d\u7f6e\u90fd\u5728\u540c\u4e00\u4e2a\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\uff0cpy \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684\u7c7b\uff0cini \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684 option\u3002 \u5168\u5c40\u914d\u7f6e\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u7b56\u7565\u5982\u4e0b\uff1a \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5c40\u90e8\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5e94\u7528\u5c42\uff1arunner \u662f\u6d4b\u8bd5\u6267\u884c\u7684\u5165\u53e3\uff0c\u5b83\u4f1a\u6839\u636e\u914d\u7f6e\u91cc\u9762\u7684\u914d\u7f6e\u9879\uff0c\u8fdb\u884c\u7528\u4f8b\u7684\u52a0\u8f7d\u548c\u6267\u884c\u3002\u5b83\u63d0\u4f9b\u63a5\u53e3\u7ed9\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\uff0c\u5e73\u53f0\u4e0a\u7684\u6307\u4ee4\u5b9e\u9645\u4e0a\u90fd\u662f\u901a\u8fc7\u4e0b\u53d1\u7ed9 runner\uff0c\u7136\u540e\u7531 runner \u6765\u6267\u884c\u76f8\u5e94\u7684\u6d4b\u8bd5\u3002 \u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u662f\u4e00\u4e2a\u524d\u7aef\u7cfb\u7edf\uff0c\u53ef\u4ee5\u8fdb\u884c\u6d4b\u8bd5\u673a\u7ba1\u7406\u3001\u81ea\u52a8\u5b89\u88c5\u955c\u50cf\u3001\u81ea\u52a8\u5b89\u88c5\u6307\u5b9a\u5e94\u7528\u7248\u672c\u3001\u8fdb\u884c\u6d4b\u8bd5\u7528\u4f8b\u8303\u56f4\u9009\u62e9\u3001\u7528\u4f8b\u89e6\u53d1\u6267\u884c\u63a7\u5236\u3001\u7ed3\u679c\u5c55\u793a\u8f93\u51fa\u7b49\u3002 \u4e00\u4e2a\u5e94\u7528\u7684\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\u90fd\u53ef\u4ee5\u5355\u72ec\u89e6\u53d1\u3002 \u517c\u5bb9\u6027\u6d4b\u8bd5\u4e3b\u8981\u901a\u8fc7 PXE \u670d\u52a1\u5668\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u88c5\u673a\uff0c\u7136\u540e\u914d\u5408 AT \u8fdb\u884c\u6d4b\u8bd5\uff0c\u53ef\u4ee5\u5b9e\u73b0\u4e0d\u540c\u7cfb\u7edf\u7248\u672c\u3001\u4e0d\u540c\u5e94\u7528\u7248\u672c\u73af\u5883\u4e0a\u90fd\u53ef\u4ee5\u8fdb\u884c\u81ea\u52a8\u5316\u7684 AT \u6267\u884c\uff0c\u63d0\u9ad8\u517c\u5bb9\u6027\u6d4b\u8bd5\u6548\u7387\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_4","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_2","title":"1\u3001\u7528\u4f8b\u89e3\u8026","text":"\u5b58\u5728\u8026\u5408\u5173\u7cfb\u7684\u65b9\u6cd5\uff1a\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u88ab\u5916\u90e8\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\uff0c\u5219\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u8026\u5408\u5173\u7cfb\u3002 1.1\u3001\u901a\u8fc7\u7f16\u8f91\u5668 Find Usages \u67e5\u770b\u6bcf\u4e2a\u65b9\u6cd5\u88ab\u8c03\u7528\u7684\u8def\u5f84\u548c\u88ab\u8c03\u7528\u6b21\u6570\uff1b 1.2\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 1 \u4e2a\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728\u5916\u90e8\u5e94\u7528\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1b 1.3\u3001\u64cd\u4f5c\u5c42\u6587\u4ef6\u540d\u5747\u4ee5 widget \u7ed3\u5c3e\uff0c\u7c7b\u540d\u4ee5 Widget \u7ed3\u5c3e\uff0c\u5982\uff1a\u6587\u4ef6\u540d music_widget.py \uff1a class MusicWidget:\n\"\"\"\u97f3\u4e50\u7684\u64cd\u4f5c\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_2","title":"2\u3001\u516c\u5171\u5e93\u5efa\u8bbe","text":"2.1\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 2 \u4e2a\u53ca\u4ee5\u4e0a\u7684\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728 public_widget \u76ee\u5f55\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1bpublic_widget \u5373\u4e3a\u516c\u5171\u65b9\u6cd5\u5e93\uff1b 2.2\u3001\u5728\u7528\u4f8b\u5c42\u4fee\u6539\u7528\u4f8b\u4e2d\u7c7b\u7684\u5bfc\u5165\u8def\u5f84\uff0c\u5c5e\u4e8e\u516c\u5171\u65b9\u6cd5\u7684\u5219\u8c03\u7528 public_widget \u4e2d\u7684\u7c7b\uff0c\u5916\u90e8\u5e94\u7528\u7684\u64cd\u4f5c\u65b9\u6cd5\uff0c\u5219\u8c03\u7528\u672c\u5e94\u7528\u76ee\u5f55\u4e0b\u91cd\u5199\u7684\u5916\u90e8\u5e94\u7528\u65b9\u6cd5\u3002 \u6bd4\u5982\uff1a\u51e0\u4e4e\u6240\u6709\u591a\u5a92\u4f53\u5e94\u7528\u90fd\u9700\u8981\u901a\u8fc7\u6587\u7ba1\u52a0\u8f7d\u8d44\u6e90\uff0c\u8c03\u8d77\u7684\u6587\u7ba1\u5bf9\u8bdd\u6846\u5b9e\u9645\u4e3a dde-desktop\uff0c\u56e0\u6b64\u5c06 desktop_widget.py \u653e\u5230 public_widget \u91cc\u9762\uff1a class DdeDesktopPublicWidget:\n\"\"\"\u516c\u5171-\u684c\u9762\u7684\u64cd\u4f5c\u65b9\u6cd5\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3_1","title":"3\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406","text":"3.1\u3001\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1a\u5bf9\u5e94 core\u3001smoke\uff0c\u6216\u4e3a\u7a7a\uff1b \u7528\u4f8b\u6765\u6e90\uff1a\u5bf9\u5e94 PMS \u7528\u4f8b\u6765\u6e90\uff0c\u5206\u522b\u7528 acp1\u3001acp2\u3001acp3\u3001acp4 \u8868\u793a\u3002 acp1 \uff1a\u4e1a\u52a1\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5199\u7684\u7528\u4f8b\uff0c\u88ab\u7528\u4e8e\u9a8c\u6536\u6d4b\u8bd5\u7684\uff1b acp2 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5f15\u5165\u7684\u4ea7\u54c1\u9a8c\u6536\u6d4b\u8bc4\u90e8\u7684\u7528\u4f8b\uff1b acp3 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u6839\u636e\u4ea7\u54c1\u9700\u6c42\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\uff1b acp4 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u901a\u8fc7\u793e\u533a\u3001\u8bba\u575b\u7528\u6237\u53cd\u9988\u95ee\u9898\u603b\u7ed3\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\u3002 \u4e3e\u4f8b\uff1a \u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u7528\u4f8b\u6765\u6e90 001 L1 core acp1 \u6807\u7b7e\u91c7\u7528\u679a\u4e3e\u7684\u65b9\u5f0f\u8fdb\u884c\u4ee3\u53f7\u7ba1\u7406\u65b9\u4fbf\u7ba1\u7406\u4ee5\u53ca\u540e\u7eed\u6269\u5c55\u3002 3.2\u3001\u5728\u6bcf\u4e2a\u5e94\u7528\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u7b2c\u4e00\u5217\u4e3a\u7528\u4f8b\u7684 ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ba1\u7406\u6a21\u5757\u5185\u7684\u7528\u4f8b\u6807\u7b7e\u3002\u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 3.3\u3001\u5bf9\u7167 PMS \u4e0a\u7528\u4f8b\u7b49\u7ea7\u3001\u7528\u4f8b\u7c7b\u578b\u548c\u7528\u4f8b\u6765\u6e90\uff0c\u6807\u8bb0\u6240\u6709\u5df2\u5b9e\u73b0\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u540e\u7eed\u7f16\u5199\u65b0\u589e\u81ea\u52a8\u5316\u7528\u4f8b\u65f6\uff0c\u6bcf\u5199\u4e00\u6761\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684 csv \u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u6b64\u6761\u7528\u4f8b\u7684\u6807\u7b7e\u3002 3.4\u3001\u8df3\u8fc7\u7528\u4f8b\u6807\u7b7e\u5316 \u73b0\u6709\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a\uff1a \u4e3e\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u8bb0\u4e3a \u201cskip-\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u8bb0\uff0c\u5982\u679c\u5df2\u7ecf\u6807\u8bb0\u4e86\u8df3\u8fc7\u539f\u56e0\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u8bb0\u4e3a SKIPED\uff0c\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\u3002 \u6240\u6709\u7684\u6807\u7b7e\u5728 docs \u76ee\u5f55\u4e0b\u4f1a\u6709\u4e00\u4e2a\u6587\u6863\uff0c\u6587\u6863\u6682\u5b9a\u540d\u79f0\u4e3a\uff1atags_info.md\uff0c\u7528\u4e8e\u8bf4\u660e\u73b0\u5728\u5df2\u7ecf\u4f7f\u7528\u5230\u7684\u6807\u7b7e\uff0c\u4ee5\u53ca\u8fd9\u4e9b\u6807\u7b7e\u7684\u89e3\u91ca\u548c\u7528\u6cd5\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#4","title":"4\u3001\u7528\u4f8b\u6267\u884c","text":"4.1\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u7684\u9a71\u52a8\u6267\u884c\u903b\u8f91\u529f\u80fd\u5b9e\u73b0 \u5f00\u53d1\u6839\u636e\u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\u91cc\u9762\u7684\u7528\u4f8b\u6807\u7b7e\u6267\u884c\u5bf9\u5e94\u7528\u4f8b\u7684\u529f\u80fd\uff0c\u80fd\u652f\u6301\u591a\u4e2a\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u6267\u884c\u5165\u53e3\u80fd\u968f\u610f\u901a\u8fc7\u7528\u4f8b\u6807\u7b7e\u6307\u5b9a\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002 \u7528\u4f8b\u6807\u7b7e\u7684\u9a71\u52a8\u65b9\u5f0f\u5fc5\u987b\u80fd\u652f\u6301\u6807\u7b7e\u7684\u6269\u5c55\uff0c\u672a\u6765\u968f\u7740\u4e1a\u52a1\u7684\u53d8\u5316\u53ef\u80fd\u9700\u8981\u589e\u52a0\u5404\u79cd\u5404\u6837\u7684\u6807\u7b7e\u3002 4.2\u3001\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u6267\u884c \u529f\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u3001\u6027\u80fd\u6d4b\u8bd5\u7b49\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u662f\u5206\u5f00\u6267\u884c\u7684\uff0c\u4e5f\u5c31\u662f\u5728\u4e00\u6b21\u6267\u884c\u4e2d\uff0c\u53ea\u80fd\u6267\u884c\u5176\u4e2d\u4e00\u79cd\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5177\u4f53\u8981\u6267\u884c\u54ea\u4e00\u79cd\u540c\u6837\u901a\u8fc7\u53c2\u6570\u6765\u63a7\u5236\u3002 4.3\u3001\u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c \u7531\u4e8e\u6d4b\u8bd5\u673a\u8d44\u6e90\u6709\u9650\uff0c\u968f\u7740\u81ea\u52a8\u5316\u7528\u4f8b\u6570\u91cf\u7684\u589e\u52a0\uff0cCI \u6267\u884c\u65f6\u95f4\u4f1a\u8d8a\u6765\u8d8a\u957f\u3002 \u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c\u7684\u529f\u80fd\uff1a \u540c\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\u5206\u6563\u5230\u4e0d\u540c\u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u4e0a\u6267\u884c\uff0c\u7f29\u77ed\u6267\u884c\u603b\u65f6\u95f4\uff1b \u7b2c\u4e8c\u5929\u8dd1\u7684\u65f6\u5019\u540c\u4e00\u4e2a\u673a\u5668\u4e0a\u4f1a\u6267\u884c\u6628\u5929\u6ca1\u6709\u6267\u884c\u5230\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u6267\u884c\u540c\u7406\uff1b \u53ef\u4ee5\u5b9e\u73b0\u5728\u5168\u67b6\u6784\u6d4b\u8bd5\u673a\u4e0a\u8f6e\u6d41\u6267\u884c\u7528\u4f8b\uff0c\u65e2\u80fd\u4fdd\u8bc1\u6267\u884c\u4e86\u6240\u6709\u7684\u7528\u4f8b\uff0c\u53c8\u80fd\u5728\u8d44\u6e90\u6709\u9650\u7684\u60c5\u51b5\u4e0b\u8986\u76d6\u4e86\u6240\u6709\u7684\u67b6\u6784\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#5","title":"5\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0","text":"5.1\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u4f5c\u4e3a\u524d\u7aef\u754c\u9762\u7cfb\u7edf\uff0c\u901a\u8fc7\u9875\u9762\u4e0a\u7684\u4e00\u4e9b\u529f\u80fd\u9009\u9879\u8fdb\u884c\u5bf9\u5e94\u6d4b\u8bd5\u4efb\u52a1\u7684\u7ba1\u7406\u6216\u89e6\u53d1\uff0c\u4e1a\u5185\u6bd4\u8f83\u6d41\u884c\u7684\u5b9e\u73b0\u65b9\u6848\u662f\u4f7f\u7528 Vue + DRF \u5b9e\u73b0\u4e00\u4e2a\u524d\u540e\u7aef\u5206\u79bb\u7684\u7cfb\u7edf\u3002 \u6d4b\u8bd5\u5e73\u53f0\u53ef\u80fd\u4f1a\u6d89\u53ca\u5230\u7684\u6a21\u5757\u6709\uff1a\u6d4b\u8bd5\u673a\u8d44\u6e90\u7ba1\u7406\u6a21\u5757\u3001\u7528\u4f8b\u6267\u884c\u63a7\u5236\u6a21\u5757\u3001\u7ed3\u679c\u5c55\u793a\u6a21\u5757\u3001PXE \u955c\u50cf\u5b89\u88c5\u6a21\u5757\u7b49\u3002 \u7528\u6237\uff08\u6d4b\u8bd5\u3001\u7814\u53d1\u540c\u5b66\u7b49\uff09\u53ef\u4ee5\u914d\u7f6e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5982\u6267\u884c\u54ea\u4e2a\u5e94\u7528\u3001\u6267\u884c\u7528\u4f8b\u7684\u8303\u56f4\u3001\u5728\u54ea\u53f0\u673a\u5668\u4e0a\u6267\u884c\u3001\u955c\u50cf\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u5e94\u7528\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u6267\u884c\u65f6\u95f4\u3002 5.2\u3001\u6267\u884c\u5165\u53e3 runner \u63d0\u4f9b\u7ed9\u6d4b\u8bd5\u5e73\u53f0\u7684\u63a5\u53e3\u5305\u62ec\uff1a\u7528\u4f8b\u6267\u884c\u63a5\u53e3\u3001\u7ed3\u679c\u8fd4\u56de\u63a5\u53e3\u3001\u955c\u50cf\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u955c\u50cf\u5b89\u88c5\u63a5\u53e3\u3001\u5e94\u7528\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u5e94\u7528\u5b89\u88c5\u66f4\u65b0\u63a5\u53e3\u7b49\u3002 \u524d\u7aef\u5e73\u53f0\u76ee\u524d\u8fd8\u6ca1\u6709\u592a\u591a\u8be6\u7ec6\u7684\u65b9\u6848\uff0c\u672c\u6b21\u8bbe\u8ba1\u4e3b\u8981\u96c6\u4e2d\u5728\u540e\u7aef\u8fd9\u90e8\u5206\u67b6\u6784\u7684\u8bbe\u8ba1\u4e0a\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_5","title":"\u56db\u3001\u5b9e\u65bd\u8ba1\u5212","text":"\u8fd1\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u6587\u7ba1\u4ee3\u7801\u89e3\u8026 2022/3/28 2022/4/8 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u56fe\u5f62\u56fe\u50cf\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u97f3\u89c6\u9891\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5168\u5c40\u641c\u7d22\u4ee3\u7801\u89e3\u8026 2022/4/25 2022/4/26 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u516c\u5171\u5e93\u5efa\u8bbe 2022/4/27 2022/5/5 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5c01\u88c5\u7684\u65b9\u6cd5\u6574\u7406\u6210\u4e00\u4e2a\u8868 2022/5/6 2022/5/10 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7528\u4f8b\u6807\u7b7e\u5206\u7c7b\u8bc4\u4f30 2022/5/11 2022/5/11 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u6807\u7b7e\u5316\u6267\u884c\u9a71\u52a8\u7a0b\u5e8f\u7f16\u5199 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u9700\u5b9e\u73b0\u81ea\u52a8\u89e3\u6790 csv \u8868\u683c\u4e2d\u7684\u7528\u4f8b\u7f16\u53f7 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u722c\u866b\u811a\u672c\uff0c\u722c\u53d6 pms \u4e0a\u7528\u4f8b\u7684\u6807\u7b7e 2022/5/11 2022/5/13 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u5b9a\u65f6\u81ea\u52a8\u7ef4\u62a4\u672c\u5730 csv \u6587\u4ef6\u811a\u672c 2022/5/11 2022/5/20 \u4e2d\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u76ee\u5f55\u7ed3\u6784\u8c03\u6574 2022/5/20 2022/6/2 \u5b8c\u6210\u5168\u5c40\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u5177\u4f53\u65b9\u6848\u548c\u903b\u8f91\u5b9e\u73b0 2022/6/6 2022/6/17 \u9759\u6001\u626b\u63cf\u95ee\u9898\u6e05\u96f6 2022/6/20 2022/7/1 \u5b8c\u6210\u65b0\u6846\u67b6\u4f7f\u7528\u57f9\u8bad 2022/7/4 2022/7/11 \u843d\u5730\u8fd0\u884c 2022/7/12 2022/7/20 \u5e95\u5c42\u5e93\u7528\u9014\u8bf4\u660e\u6587\u6863\u7f16\u5199 2022/7/21 2022/7/28"}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\u200b\\u3000\\-\u3001\u3002\uff0c\uff0e\uff1f\uff01\uff1b]+","pipeline":["stemmer"]},"docs":[{"location":"","title":"\u9996\u9875","text":""},{"location":"#youqu","title":"\u6709\u8da3\uff08YouQu\uff09","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/4/1\n# Author : Mikigo\n# =============================================\n \u672c\u7ad9\u603b\u8bbf\u95ee\u91cf \u6b21 \u6b22\u8fce\u5728\u6d4f\u89c8\u5668\u8bbf\u95ee\u3010\u516c\u7f51\u6587\u6863\u3011 \u7edf\u4fe1\u516c\u53f8\u5185\u7f51\u8fd8\u53ef\u4ee5\u8bbf\u95ee\u3010\u5185\u7f51\u6587\u6863\u3011\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u54e6~~"},{"location":"#_1","title":"\u4e00\u3001\u7b80\u4ecb","text":"\u6709\u8da3\uff08YouQu\uff09\u662f\u6df1\u5ea6\u79d1\u6280\u8bbe\u8ba1\u548c\u5f00\u53d1\u7684\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff0c\u91c7\u7528\u7ed3\u6784\u5206\u5c42\u7684\u8bbe\u8ba1\u7406\u5ff5\uff0c\u652f\u6301\u591a\u5143\u5316\u5143\u7d20\u5b9a\u4f4d\u548c\u65ad\u8a00\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\u3001\u5f3a\u5927\u7684\u65e5\u5fd7\u548c\u62a5\u544a\u8f93\u51fa\u7b49\u7279\u8272\u529f\u80fd\uff0c\u540c\u65f6\u5b8c\u7f8e\u517c\u5bb9X11\u3001Wayland\u663e\u793a\u534f\u8bae\uff0c\u73af\u5883\u90e8\u7f72\u7b80\u5355\uff0c\u64cd\u4f5c\u6613\u4e0a\u624b\u3002"},{"location":"#17","title":"\u7231\u4e0a \u201c\u6709\u8da3\u201d \u7684 17 \u4e2a\u7406\u7531","text":" \u6838\u5fc3\u5e93\u63d0\u4f9b\u4e86\u7edf\u4e00\u7684\u63a5\u53e3\uff0c\u7f16\u5199\u65b9\u6cd5\u65f6\u53ea\u9700\u8981\u5bfc\u5165\u4e00\u4e2a\u5305\u5c31\u53ef\u4ee5\u4f7f\u7528\u5230\u6838\u5fc3\u5e93\u63d0\u4f9b\u7684\u6240\u6709\u529f\u80fd\uff1b \u516c\u5171\u5e93\u5c01\u88c5\u4e86\u5f88\u591a\u5e38\u7528\u6a21\u5757\u7684\u76f8\u5173\u65b9\u6cd5\uff0c\u6bd4\u5982\uff1a\u4efb\u52a1\u680f\u7684\u64cd\u4f5c\u3001\u684c\u9762\u7684\u64cd\u4f5c\u3001\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\u7b49\u7b49\uff1b \u9664\u4e86\u5e38\u7528\u7684\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u8bc6\u522b\u4ee5\u5916\uff0c\u6211\u4eec\u8fd8\u63d0\u4f9b\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u5176\u4f7f\u7528\u7b80\u5355\u4e14\u9ad8\u6548\uff0c\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff1b \u5bf9\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u5c06\u7f16\u5199\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u53d8\u5f97\u7b80\u5355\u800c\u4f18\u96c5\uff1b \u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u6280\u672f\u8fdb\u884c\u529f\u80fd\u5347\u7ea7\uff0c\u9664\u4e86\u652f\u6301\u5355\u4e2a\u5750\u6807\u8fd4\u56de\uff0c\u8fd8\u652f\u6301\u540c\u4e00\u754c\u9762\u4e0b\u591a\u4e2a\u76f8\u540c\u5143\u7d20\u8fd4\u56de\u591a\u4e2a\u5750\u6807\u7684\u529f\u80fd\uff1b \u63d0\u4f9b\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u548c\u6279\u91cf\u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u4e0d\u5230\u4e00\u4e2a csv \u6587\u4ef6\u539f\u6765\u80fd\u5e72\u8fd9\u4e48\u591a\u4e8b\u60c5\uff1b \u63d0\u4f9b\u4e86\u529f\u80fd\u5f3a\u5927\u7684\u6267\u884c\u5668\u5165\u53e3\uff0c\u8ba9\u4f60\u53ef\u4ee5\u65b9\u4fbf\u7684\u5728\u672c\u5730\u6267\u884c\u4efb\u4f55\u7528\u4f8b\u96c6\u7684\u7528\u4f8b\uff0c\u5176\u4e30\u5bcc\u7684\u81ea\u5b9a\u4e49\u914d\u7f6e\u9879\uff0c\u6ee1\u8db3\u4f60\u5bf9\u6267\u884c\u5668\u6240\u6709\u7684\u5e7b\u60f3\uff1b \u63d0\u4f9b\u8fdc\u7a0b\u6267\u884c\u7684\u529f\u80fd\uff0c\u53ef\u4ee5\u63a7\u5236\u591a\u53f0\u673a\u5668\u5e76\u884c\u8dd1\uff0c\u6216\u8005\u5206\u5e03\u5f0f\u8dd1\uff0c\u8fd9\u79cd\u4ed8\u8d39\u529f\u80fd\u73b0\u5728\u514d\u8d39\u7ed9\u4f60\u7528\uff1b \u63d0\u4f9b\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u529f\u80fd\uff0c\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u6bcf\u4e2a\u65b9\u6cd5\u5355\u72ec\u5199\u8f93\u51fa\u65e5\u5fd7\u7684\u4ee3\u7801\uff0c\u4e00\u5207\u6211\u4eec\u7ed9\u4f60\u641e\u5b9a\u4e86\uff0c\u65e5\u5fd7\u8f93\u51fa\u4e0d\u4ec5\u5185\u5bb9\u4e30\u5bcc\uff0c\u989c\u503c\u4e5f\u7edd\u5bf9\u5728\u7ebf\uff0c\u6211\u4eec\u8fd8\u81ea\u5df1\u8bbe\u8ba1\u4e86\u4e00\u6b3e\u7ec8\u7aef\u8f93\u51fa\u4e3b\u9898\u53eb\u300a\u4e94\u5f69\u6591\u6593\u7684\u9ed1\u300b\uff1b \u63d0\u4f9b\u4e86\u4e00\u952e\u90e8\u7f72\u81ea\u52a8\u5316\u6d4b\u8bd5\u73af\u5883\u7684\u529f\u80fd\uff0c\u8fde\u4ee3\u7801\u7f16\u8f91\u5668\u90fd\u7ed9\u4f60\u88c5\u597d\u4e86\uff0c\u8ba9\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u73af\u5883\u90e8\u7f72\u800c\u70e6\u607c\uff1b \u63d0\u4f9b\u4e86\u81ea\u52a8\u751f\u6210\u591a\u79cd\u62a5\u544a\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u8f93\u51fa\u4ec0\u4e48\u62a5\u544a\u5f62\u5f0f\u90fd\u884c\uff0c\u800c\u4e14\u6211\u4eec\u5728\u62a5\u544a\u4e2d\u8fd8\u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\u548c\u5931\u8d25\u622a\u56fe\u7684\u529f\u80fd\uff1b \u5bf9\u65ad\u8a00\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u63d0\u4f9b\u66f4\u53cb\u597d\u5316\u7684\u9519\u8bef\u63d0\u793a\uff0c\u8ba9\u5b9a\u4f4d\u95ee\u9898\u7cbe\u51c6\u9ad8\u6548\uff1b \u4e0d\u4ec5\u652f\u6301\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u63a7\u5236\uff0c\u800c\u4e14\u8fd8\u652f\u6301\u52a8\u6001\u63a7\u5236\u7528\u4f8b\u6279\u91cf\u6267\u884c\u7684\u603b\u65f6\u95f4\uff0c\u786e\u4fdd CI \u73af\u5883\u4e0b\u80fd\u987a\u7545\u8fd0\u884c\uff1b \u652f\u6301\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\u6267\u884c\u3001PMS \u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6807\u7b7e\u5316\u6267\u884c\u65b9\u6848\uff0c\u6ee1\u8db3\u4f60\u5404\u79cd\u573a\u666f\u4e0b\u7684\u6267\u884c\u9700\u6c42\uff1b \u652f\u6301\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u529f\u80fd\uff0c\u53ef\u5b9a\u4f4d\u53ef\u65ad\u8a00\uff0c\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\uff1b \u5b8c\u7f8e\u517c\u5bb9 Wayland \u548c X11\uff0c\u771f\u6b63\u505a\u5230\u4e00\u5957\u4ee3\u7801\uff0c\u968f\u5904\u6267\u884c\uff1b \u652f\u6301\u591a\u79cd\u65b9\u5f0f\u7684\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u5176\u4e2d\u5f02\u6b65\u56de\u586b\u7684\u65b9\u6848\uff0c\u5b8c\u7f8e\u89e3\u51b3\u4e86\u6570\u636e\u56de\u586b\u7684\u8017\u65f6\u95ee\u9898\uff1b \u3010\u89c6\u9891\u4ecb\u7ecd\u3011"},{"location":"#_2","title":"\u4e8c\u3001\u5b89\u88c5\u4f7f\u7528","text":"\u57fa\u7840\u6846\u67b6\uff1ahttps://github.com/linuxdeepin/deepin-autotest-framework \u4ece PyPI \u5b89\u88c5: sudo pip3 install youqu\n \u521b\u5efa\u9879\u76ee: youqu-startproject youqu\n \u5b89\u88c5\u4f9d\u8d56: cd youqu\nbash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002 \u5e94\u7528\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684\u5e94\u7528\u540d\u79f0\u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music cd apps/\n \u5c06\u5e94\u7528\u5e93\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u50cf\u8fd9\u6837\uff1a youqu\n\u251c\u2500\u2500 apps\n\u2502 \u251c\u2500\u2500 autotest_deepin_music # \u5e94\u7528\u5e93\n...\n \u5e94\u7528\u5e93\u7684\u540d\u79f0\u4e0d\u53ef\u4ee5\u4fee\u6539\u3002"},{"location":"#_3","title":"\u4e09\u3001\u8fd0\u884c","text":""},{"location":"#1","title":"1. \u5de5\u4f5c\u7a7a\u95f4","text":"\u57fa\u7840\u6846\u67b6\u5de5\u7a0b\u76ee\u5f55\u5efa\u8bae\u653e\u5728 ~ \u76ee\u5f55\u4e0b\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u4e5f\u53ef\u4ee5\u8fd0\u884c\uff0c\u4f46\u662f\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u9700\u8981\u505a\u73af\u5883\u6e05\u7406\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u5b58\u5728\u4ee3\u7801\u88ab\u5220\u9664\u7684\u98ce\u9669\u3002 \u5982\u679c\u4f60\u7684\u673a\u5668\u4e0a\u4e0d\u540c\u76ee\u5f55\u4e0b\u5b58\u5728\u591a\u4e2a YouQu \u5de5\u7a0b\uff0c\u90a3\u4e48\u5728\u8fd0\u884c\u4e4b\u524d\uff0c\u8bf7\u5148\u6267\u884c env.sh \u6821\u6b63\u76f8\u5173\u73af\u5883\u3002"},{"location":"#2","title":"2. \u6267\u884c\u5668","text":"\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u6709\u4e00\u4e2a manage.py \uff0c\u5b83\u662f\u4e00\u4e2a\u6267\u884c\u5668\u5165\u53e3\uff0c\u63d0\u4f9b\u4e86\u672c\u5730\u6267\u884c\u3001\u8fdc\u7a0b\u6267\u884c\u7b49\u7684\u529f\u80fd\u3002 \u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6765\u6267\u884c\uff1a youqu manage.py run -a deepin-music\n"},{"location":"#21","title":"2.1. \u672c\u5730\u6267\u884c","text":"youqu manage.py run\n"},{"location":"#211","title":"2.1.1. \u914d\u7f6e\u6587\u4ef6","text":"\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u914d\u7f6e\u53c2\u6570 \u5728\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u91cc\u9762\u652f\u6301\u914d\u7f6e\u5bf9\u6267\u884c\u7684\u4e00\u4e9b\u53c2\u6570\u8fdb\u884c\u914d\u7f6e\uff0c\u5e38\u7528\u7684\u5982\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;-----------------------------------------------\n;1.KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2.KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f\n;e.g. TAGS = L1 or smoke\n;-----------------------------------------------\n;\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\uff0c\u5c06\u8981\u6267\u884c\u7684\u7528\u4f8b\u5199\u5165\u6307\u5b9a\u7684 csv \u6587\u4ef6\n;\u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u4ece\u57fa\u7840\u6846\u67b6\u6839\u76ee\u5f55\u5f00\u59cb\uff1ae.g. CASE_FILE = case_list.txt\n;\u5982\u679c\u8fd9\u91cc\u6709\u503c\uff0cAPP_NAME KEYWORDS TAGS \u7684\u914d\u7f6e\u5747\u4e0d\u751f\u6548\nCASE_FILE =\n;=============================== RUNNER CONFIG ===================================\n[runner]\n;\u6700\u5927\u5931\u8d25\u7528\u4f8b\u6570\u91cf\u7684\u5360\u6bd4\n;\u6bd4\u5982\uff1a\u603b\u6267\u884c\u7528\u4f8b\u6570\u4e3a 100, \u82e5 MAX_FAIL = 0.5,\u5219\u5931\u8d25\u7528\u4f8b\u6570\u8fbe\u5230 50 \u5c31\u4f1a\u7ec8\u6b62\u6d4b\u8bd5\u3002\nMAX_FAIL = 1\n;\u5355\u6761\u7528\u4f8b\u7684\u8d85\u65f6\u65f6\u95f4\uff0c\u5982\u679c\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u8d85\u65f6\uff0c\u8fd9\u6761\u7528\u4f8b\u4f1a\u88ab\u505c\u6b62\uff0c\u540e\u7eed\u7528\u4f8b\u7ee7\u7eed\u6267\u884c\u3002\n;\u5355\u4f4d\u4e3a\u79d2\n;\u8fd9\u662f\u4e00\u4e2a\u5168\u5c40\u7edf\u4e00\u914d\u7f6e\uff0c\u5982\u679c\u67d0\u6761\u7528\u4f8b\u9700\u8981\u5355\u72ec\u914d\u7f6e\u8d85\u65f6\u65f6\u95f4\uff0c\u53ef\u4ee5\u5728\u7528\u4f8b\u4e2d\u8fd9\u6837\u5199\uff1a\n;@pytest.mark.timeout(500)\n;def test_xxx_001():\n; ...\n;\u4f1a\u8bdd\u8d85\u65f6\uff08\u6240\u6709\u7528\u4f8b\u6267\u884c\u7684\u8d85\u65f6\u65f6\u95f4\uff09\u662f\u6839\u636e\u5168\u5c40\u8d85\u65f6\u914d\u7f6e\u548c\u7528\u4f8b\u5355\u72ec\u8d85\u65f6\u914d\u7f6e\u81ea\u52a8\u8ba1\u7b97\u7684\u3002\nCASE_TIME_OUT = 200\n;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\n;\u6ce8\u610f\uff0cRERUN = 1 \u8868\u793a\u91cd\u8dd1 1 \u6b21\uff0c\u5373\u7b2c\u4e00\u6b21\u7528\u4f8b\u6267\u884c\u5931\u8d25\u4f1a\u81ea\u52a8\u91cd\u8dd1 1 \u6b21\uff0c\u603b\u5171\u6267\u884c 2 \u6b21\uff1b\n;\u5982\u679c\u7b2c 2 \u6b21\u6267\u884c\u6210\u529f\uff0c\u7ed3\u679c\u6210\u529f\uff0c\u5931\u8d25\u4ea6\u4e3a\u5931\u8d25\u3002\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c 1 \u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff0cRERUN >= RECORD_FAILED_CASE\u3002\n;1.\u5173\u95ed\u5f55\u5c4f\uff1aRECORD_FAILED_CASE > RERUN\n;2.\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1aRECORD_FAILED_CASE = 0\nRECORD_FAILED_CASE = 1\n;yes \u6bcf\u6761\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u8fdb\u884c\u73af\u5883\u6e05\u7406\nCLEAN_ALL = yes\n;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387, \u6bd4\u5982\uff1a1920x1080\n;no: \u8868\u793a\u4e0d\u505a\u5206\u8fa8\u7387\u6821\u9a8c\nRESOLUTION = 1920x1080\n;\u4e0d\u8df3\u8fc7\u7528\u4f8b\uff0ccsv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86 skip-xxx\u7684\u7528\u4f8b\u4e0d\u8df3\u8fc7\nNOSKIP = no\n;ignore fixed\n;no\uff0c\u53ea\u8981\u6807\u8bb0\u4e86fixed\u7684\u7528\u4f8b\uff0c\u5373\u4f7f\u6807\u8bb0\u4e86skip-\uff0c\u4e5f\u4f1a\u6267\u884c\uff1b\n;yes\uff0cfixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\uff1b\nIFIXED = no\n;\u8981\u5b89\u88c5deb\u5305\u7684\u8def\u5f84\n;e.g : ~/Downloads/ \u5b89\u88c5\u4e0b\u8f7d\u76ee\u5f55\u4e0b\u7684deb\u5305\uff0c\u5982\u679c\u662f\u8fdc\u7a0b\u6267\u884c\uff0c\u4f1a\u81ea\u52a8\u62f7\u8d1d\u5230\u8fdc\u7a0b\u5e76\u5b89\u88c5\u3002\nDEB_PATH =\n;DEBUG \u6a21\u5f0f\u6267\u884c\u7528\u4f8b\uff0c\u53ea\u6536\u96c6\u4e0d\u6267\u884c\u7528\u4f8b\uff0c\u4e5f\u4e0d\u505a\u8bbe\u5907\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002\nDEBUG = no\n;\u8bb0\u5f55top\u547d\u4ee4\u67e5\u8be2\u7684\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0cTOP = 3 \u8868\u793a\u8bb0\u5f55\u524d3\u4e2a\u8fdb\u7a0b\u3002\nTOP =\n;\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\nREPEAT =\n;\u9ed8\u8ba4\u5728\u6240\u6709\u6d4b\u8bd5\u5b8c\u6210\u4e4b\u540e\u8f93\u51fa\u62a5\u9519\u4fe1\u606f.\n;yes, \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\nDURING_FAIL = no\n;\u6ce8\u518c\u81ea\u542f\u670d\u52a1\nAUTOSTART = no\n;=============================== REPORT CONFIG ===================================\n[report]\n;\u6d4b\u8bd5\u62a5\u544a\u7684title\nREPORT_TITLE = YouQu Report\n;\u6d4b\u8bd5\u62a5\u544a\u7684name\nREPORT_NAME = YouQu Report\n;\u6d4b\u8bd5\u62a5\u544a\u7684\u9ed8\u8ba4\u8bed\u8a00\n;en:English\n;ru:\u0420\u0443\u0441\u0441\u043a\u0438\u0439\n;zh:\u4e2d\u6587\n;de:Deutsch\n;nl:Nederlands\n;he:Hebrew\n;br:Brazil\n;pl:Polski\n;ja:\u65e5\u672c\u8a9e\n;es:Espa\u00f1ol\n;kr:\ud55c\uad6d\uc5b4\n;fr:Fran\u00e7ais\n;az:Az\u0259rbaycanca\nREPORT_LANGUAGE = zh\n;\u7528\u4f8b\u6267\u884c\u5b8c\u540e\u751f\u6210\u7684\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n;\u76ee\u524d\u652f\u6301 allure, xml, json \uff08\u652f\u6301\u540c\u65f6\u751f\u6210\uff09\nREPORT_FORMAT = allure, xml, json\n;\u6307\u5b9a\u62a5\u544a\u751f\u6210\u7684\u8def\u5f84\uff08\u76f8\u5bf9\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\uff09\nALLURE_REPORT_PATH = report/\nXML_REPORT_PATH = report/\nJSON_REPORT_PATH = report/\n;=============================== GLOBAL CONFIG ===================================\n[globalconfig]\n;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\nPASSWORD = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\nIMAGE_MATCH_NUMBER = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6bcf\u6b21\u95f4\u9694\u7b49\u5f85\u65f6\u95f4\nIMAGE_MATCH_WAIT_TIME = 1\n;\u56fe\u50cf\u8bc6\u522b\u5339\u914d\u5ea6\nIMAGE_RATE = 0.9\n;\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u5b9e\u65f6\u56fe\u50cf\u4fdd\u5b58\u8def\u5f84\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u5750\u6807\nSCREEN_CACHE = /tmp/screen.png\n;\u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\u7684\u8def\u5f84\nTMPDIR = /tmp/tmpdir\n;\u7cfb\u7edf\u4e3b\u9898\nSYS_THEME = deepin\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = youqu-dev.uniontech.com\n;OpenCV\u670d\u52a1\u7aef\u5730\u5740\nOPENCV_SERVER_HOST = youqu-dev.uniontech.com\n;=============================== PMS CONFIG ===================================\n;PMS\u76f8\u5173\u914d\u7f6e\uff0c\u5305\u542b\u4ee5\u4e0b\u51e0\u4e2a\u65b9\u9762\uff1a\n;1.PMS\u6d4b\u8bd5\u5957\u6267\u884c\n;2.\u81ea\u52a8\u4ecePMS\u722c\u53d6\u6570\u636e\u5e76\u540c\u6b65\u672c\u5730CSV\u6587\u4ef6\n;3.PMS\u6570\u636e\u56de\u586b\n[pms]\n;PMS\u7684\u7528\u6237\u540d,\u5982: ut001234\nPMS_USER =\n;PMS\u7684\u5bc6\u7801\nPMS_PASSWORD =\n;PMS\u6d4b\u8bd5\u5957\u7684ID\n;\u5728PMS\u4e0a\u67e5\u770b\u7528\u4f8b\u201c\u5957\u4ef6\u201d\u94fe\u63a5: https://pms.uniontech.com/testsuite-view-495.html\n;\u6d4b\u8bd5\u5957ID\u4e3a: 495\nSUITE_ID =\n;\u6570\u636e\u56de\u586b\u5fc5\u987b\u5173\u8054PMS\u6d4b\u8bd5\u5355\n;\u5728PMS\u4e0a\u67e5\u770b\u6d4b\u8bd5\u5355\u94fe\u63a5: https://pms.uniontech.com/testtask-cases-20747.html\n;\u6d4b\u8bd5\u5355ID\u4e3a: 20747\nTASK_ID =\n;\u5c06\u6d4b\u8bd5\u7ed3\u679c\u6570\u636e\u56de\u586b\u5230PMS\n;\u4e3a\u7a7a: \u8868\u793a\u4e0d\u56de\u586b,\u4e0d\u4f1a\u5728\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u751f\u6210json\u7ed3\u679c\u6587\u4ef6;\n;async: \u8868\u793a\u9010\u6761\u5f02\u6b65\u56de\u586b,\u540e\u9762\u4e00\u6761\u6267\u884c\u5f00\u59cb\u65f6\u901a\u8fc7\u5b50\u7ebf\u7a0b\u5bf9\u524d\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u8fdb\u884c\u56de\u586b\uff0c\u5982\u6b64\u5b9e\u73b0\u65f6\u95f4\u6548\u7387\u6700\u5927\u5316;\n;finish: \u8868\u793a\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u6210\u4e4b\u540e\u9010\u4e2a\u56de\u586b(PMS\u4e0d\u652f\u6301\u5e76\u53d1);\nSEND_PMS =\n;\u6570\u636e\u56de\u586b\u7684\u89e6\u53d1\u8005\n;auto: \u6846\u67b6\u81ea\u52a8\u56de\u586b,\u914d\u5408SEND_PMS\u914d\u7f6e\u4f7f\u7528,\u4f60\u53ef\u4ee5\u9009\u62e9\u5728\u4e0d\u540c\u7684\u9636\u6bb5\u8fdb\u884c\u6570\u636e\u56de\u586b;\n;hand: \u624b\u52a8\u56de\u586b,\u6bcf\u6761\u7528\u4f8b\u4ecd\u7136\u4f1a\u751f\u6210json\u6587\u4ef6,\u4f46\u6846\u67b6\u4e0d\u4f1a\u8fdb\u884c\u6570\u636e\u56de\u586b,\u9700\u8981\u4f60\u53ef\u4ee5\u5728\u4f60\u60f3\u8981\u53d1\u9001\u7684\u65f6\u95f4\u70b9\u624b\u52a8\u89e6\u53d1\u56de\u586b;\nTRIGGER = auto\n;PMS\u56de\u586b\u7684\u91cd\u8bd5\u6b21\u6570\n;\u5982\u679c\u63a5\u53e3\u8bf7\u6c42\u5931\u8d25,\u4f1a\u8fdb\u884c\u91cd\u8bd5\nSEND_PMS_RETRY_NUMBER = 2\n[csv_link_pms_lib]\n;caselib: \u7528\u4f8b\u5e93\n;testcase: \u4ea7\u54c1\u5e93\u7528\u4f8b\nCASE_FROM = caselib\n[csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/caselib-browse-81.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 81\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic =\n[export_csv]\n;\u5bfc\u51fa\u7684csv\u6587\u4ef6\u540d\u79f0\uff0c\u9ed8\u8ba4 case_list.csv\nCSV_FILE = case_list.csv\n;exportcsv \u547d\u4ee4\u5bfc\u51fa case_list.csv \u6587\u4ef6\u65f6\u914d\u7f6e\u7684\u5b57\u6bb5\u540d\uff0c\u7528\u4f8b\u540d\u79f0\u9ed8\u8ba4\u5b58\u5728\u7b2c\u4e00\u5217\uff0c\u65e0\u9700\u6dfb\u52a0\nCSV_HEARD = \u7528\u4f8b\u7ea7\u522b,\u7528\u4f8b\u7c7b\u578b,\u6d4b\u8bd5\u7ea7\u522b,\u662f\u5426\u8df3\u8fc7\n[log_cli]\n;\u65e5\u5fd7\u76f8\u5173\u914d\u7f6e\uff08\u4e0d\u6253\u5370\u6784\u9020\u51fd\u6570\u548c\u9b54\u6cd5\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff09\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = DEBUG\n# ============= \u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u914d\u7f6e ================\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u5f00\u5934\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7, \u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_STARTSWITH = Assert\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u7ed3\u5c3e\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_ENDSWITH = Widget\n;\u652f\u6301\u7c7b\u540d\u5305\u542b xxx \u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_CONTAIN = ShortCut\n# ==============================================\n \u914d\u7f6e\u5b8c\u6210\u4e4b\u540e\uff0c\u76f4\u63a5\u5728\u547d\u4ee4\u884c\u6267\u884c manage.py \u5c31\u597d\u4e86\u3002 youqu manage.py run\n"},{"location":"#212","title":"2.1.2. \u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a youqu manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -h, --help show this help message and exit\n-a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--record_failed_case RECORD_FAILED_CASE\n\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--max_fail MAX_FAIL \u6700\u5927\u5931\u8d25\u7387\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--resolution RESOLUTION\n\u68c0\u67e5\u5206\u8fa8\u7387\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms {,async,finish}\n\u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--trigger {,auto,hand}\n\u89e6\u53d1\u8005\n-f CASE_FILE, --case_file CASE_FILE\n\u6839\u636e\u6587\u4ef6\u6267\u884c\u7528\u4f8b\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n--pms_user PMS_USER pms \u7528\u6237\u540d\n--pms_password PMS_PASSWORD\npms \u5bc6\u7801\n--suite_id SUITE_ID pms \u6d4b\u8bd5\u5957ID\n--pms_info_file PMS_INFO_FILE\npms \u4fe1\u606f\u6587\u4ef6\n--top TOP \u8fc7\u7a0b\u4e2d\u8bb0\u5f55top\u547d\u4ee4\u4e2d\u7684\u503c\n--lastfailed \u4ec5\u6267\u884c\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\n--duringfail \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\n--repeat REPEAT \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n--project_name PROJECT_NAME\n\u5de5\u7a0b\u540d\u79f0\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--build_location BUILD_LOCATION\n\u6784\u5efa\u5730\u533a\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--line LINE \u6267\u884c\u7684\u4e1a\u52a1\u7ebf\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--autostart AUTOSTART \u7528\u4f8b\u6267\u884c\u7a0b\u5e8f\u6ce8\u518c\u5230\u5f00\u673a\u81ea\u542f\u670d\u52a1\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a youqu manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\"\n \u547d\u4ee4\u884c\u53c2\u6570\u4f18\u5148\u7ea7\u662f\u9ad8\u4e8e\u914d\u7f6e\u6587\u4ef6\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u4e86\u5bf9\u5e94\u7684\u53c2\u6570\uff0c\u914d\u7f6e\u6587\u4ef6\u4e2d\u4e0d\u7ba1\u662f\u5426\u914d\u7f6e\u5747\u4e0d\u751f\u6548\u3002 --app \u5165\u53c2\u8fd8\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\uff0c\u4e0b\u9762\u7684\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u540c\u6837\u652f\u6301\u3002"},{"location":"#22","title":"2.2. \u8fdc\u7a0b\u6267\u884c","text":"\u8fdc\u7a0b\u6267\u884c\u5c31\u662f\u7528\u672c\u5730\u4f5c\u4e3a\u670d\u52a1\u7aef\u63a7\u5236\u8fdc\u7a0b\u673a\u5668\u6267\u884c\uff0c\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u76f8\u540c\uff1b \u4f7f\u7528 remote \u547d\u4ee4\uff1a youqu manage.py remote\n"},{"location":"#221","title":"2.2.1. \u8fdc\u7a0b\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u6267\u884c","text":"\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u6267\u884c\u5c31\u662f\u7531\u672c\u5730 YouQu \u4f5c\u4e3a\u670d\u52a1\u7aef\uff0c\u63a7\u5236\u8fdc\u7a0b N \u53f0\u673a\u5668\u6267\u884c\u76f8\u540c\u7684\u7528\u4f8b\uff0c\u6267\u884c\u5b8c\u4e4b\u540e\u6240\u6709\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u7ed3\u679c\u4f1a\u8fd4\u56de\u7ed9\u670d\u52a1\u7aef report \u76ee\u5f55\u4e0b\uff1b \u8fdc\u7a0b\u6267\u884c\u540c\u6837\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u8fdb\u884c\u7528\u4f8b\u76f8\u5173\u914d\u7f6e\uff1b \u9700\u8981\u91cd\u70b9\u8bf4\u4e00\u4e0b\u8fdc\u7a0b\u6267\u884c\u65f6\u7684\u6d4b\u8bd5\u673a\u4fe1\u606f\u914d\u7f6e\uff0c\u5728\u914d\u7f6e\u6587\u4ef6 setting/remote.ini \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\u3001IP\u3001\u5bc6\u7801\u3002 ;=============================== CLIENT LIST =====================================\n; \u6d4b\u8bd5\u673a\u914d\u7f6e\u5217\u8868\n;[client{number}] ;\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u6709\u591a\u5c11\u53f0\u6d4b\u8bd5\u673a\u5c31\u5199\u591a\u5c11\u4e2a client\uff0c\u522b\u540d\u5fc5\u987b\u5305\u542b client \u5b57\u7b26\uff0c\u4e14\u4e0d\u80fd\u91cd\u590d\u3002\n;user = ;\u6d4b\u8bd5\u673a user\n;ip = ;\u6d4b\u8bd5\u673a ip\n;password = 1 ;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801, \u53ef\u4ee5\u4e0d\u914d\u7f6e\u6b64\u9879\uff0c\u9ed8\u8ba4\u53d6 CLIENT_PASSWORD \u7684\u503c\uff1b\n;\u5982\u679c\u4f60\u6240\u6709\u6d4b\u8bd5\u673a\u5bc6\u7801\u90fd\u76f8\u540c\uff0c\u90a3\u4e48\u53ea\u9700\u8981\u914d\u7f6e CLIENT_PASSWORD \u5c31\u53ef\u4ee5\u4e86\n;=================================================================================\n[client1]\nuser = uos\nip = 10.8.15.xx\n[client2]\nuser = uos\nip = 10.8.15.xx\n[client3]\nuser = uos\nip = 10.8.11.xx\n \u6709\u591a\u5c11\u53f0\u673a\u5668\u5c31\u50cf\u8fd9\u6837\u53c2\u8003\u4e0a\u9762\u7684\u683c\u5f0f\u5199\u5c31\u884c\u4e86\u3002 \u7136\u540e\u5728\u547d\u4ee4\u884c\uff1a youqu manage.py remote\n \u8fd9\u6837\u8fd0\u884c\u662f\u4ece\u914d\u7f6e\u6587\u4ef6\u53bb\u8bfb\u53d6\u76f8\u5173\u914d\u7f6e\u3002 \u5982\u679c\u4f60\u4e0d\u60f3\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\uff0c\u4f60\u4ecd\u7136\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u8fdb\u884c\u4f20\u53c2\uff0c \u4ee5\u4e0b\u4e3a python3 manage.py remote \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -h, --help show this help message and exit\n-c CLIENTS, --clients CLIENTS\n\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679cpassword\u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6sett\ning/remote.ini\u4e2dCLIENT_PASSWORD\u7684\u503c,\u6bd4\u5982: uos@10.8.13.33:1\n\u6216 uos@10.8.13.33\n-s, --send_code \u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a\uff08\u4e0d\u542breport\u76ee\u5f55\uff09\n-e, --build_env \u642d\u5efa\u6d4b\u8bd5\u73af\u5883,\u5982\u679c\u4e3ayes\uff0c\u4e0d\u7ba1send_code\u662f\u5426\u4e3ayes\u90fd\u4f1a\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a.\n-p CLIENT_PASSWORD, --client_password CLIENT_PASSWORD\n\u6d4b\u8bd5\u673a\u5bc6\u7801\uff08\u5168\u5c40\uff09\n-y PARALLEL, --parallel PARALLEL\nyes:\u8868\u793a\u6240\u6709\u6d4b\u8bd5\u673a\u5e76\u884c\u8dd1\uff0c\u6267\u884c\u76f8\u540c\u7684\u6d4b\u8bd5\u7528\u4f8b;no:\u8868\u793a\u6d4b\u8bd5\u673a\u5206\u5e03\u5f0f\u6267\u884c\uff0c\u670d\u52a1\u7aef\u4f1a\u6839\u636e\u6536\u96c6\u5230\u7684\u6d4b\u8bd5\u7528\u4f8b\u81ea\n\u52a8\u5206\u914d\u7ed9\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u3002\n \u9664\u4e86\u8fd9\u4e9b\u7279\u6709\u53c2\u6570\u4ee5\u5916\uff0c\u5b83\u540c\u6837\u652f\u6301\u672c\u5730\u6267\u884c\u7684\u6240\u6709\u53c2\u6570\uff1b \u5728\u547d\u4ee4\u884c\u8fd9\u6837\u8fd0\u884c\uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\"\n \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report \u76ee\u5f55\u4e0b\u56de\u6536\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u7684\u6d4b\u8bd5\u62a5\u544a\u3002 \u6ce8\u610f\uff0c\u5982\u679c\u8fdc\u7a0b\u673a\u5668\u6ca1\u6709\u642d\u5efa\u81ea\u52a8\u5316\u6d4b\u8bd5\u73af\u5883\uff0c\u8bb0\u5f97\u52a0\u4e0a\u53c2\u6570 -e \uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\" -e\n \u6267\u884c\u524d\u786e\u4fdd\u8fdc\u7a0b\u673a\u5668\u5df2\u7ecf\u5f00\u542f\u4e86 ssh \u670d\u52a1\uff0c\u5426\u5219\u4f1a\u63d0\u793a\u65e0\u6cd5\u8fde\u63a5\uff0c\u5982\u679c\u6ca1\u6709\u5f00\u542f\uff0c\u8bf7\u624b\u52a8\u5f00\u542f\uff1a sudo systemctl restart ssh\nsudo systemctl enable ssh\n \u914d\u7f6e\u6587\u4ef6\u5176\u4ed6\u76f8\u5173\u914d\u7f6e\u9879\u8be6\u7ec6\u8bf4\u660e\uff0c\u8bf7\u67e5\u770b\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u6ce8\u91ca\u5185\u5bb9\u3002"},{"location":"#222","title":"2.2.2. \u8fdc\u7a0b\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u8d1f\u8f7d\u5747\u8861\u6267\u884c","text":"\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u8d1f\u8f7d\u5747\u8861\u6267\u884c\u4e5f\u662f\u7528\u672c\u5730\u4f5c\u4e3a\u670d\u52a1\u7aef\u63a7\u5236\u8fdc\u7a0b\u673a\u5668\u6267\u884c\uff0c\u4f46\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u4e0d\u540c\uff0c\u800c\u662f\u6240\u6709\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u4e4b\u548c\uff0c\u4e3a\u4f60\u60f3\u8981\u6267\u884c\u7684\u7528\u4f8b\u96c6\uff1b \u4f3c\u4e4e\u6709\u70b9\u96be\u4ee5\u7406\u89e3\uff0c\u6211\u7528\u5927\u767d\u8bdd\u4e3e\u4f8b\u63cf\u8ff0\u4e0b\u5c31\u662f\uff0c\u670d\u52a1\u7aef\u60f3\u8981\u6267\u884c 10 \u6761\u7528\u4f8b\uff0c\u73b0\u5728\u8fdc\u7a0b\u673a\u5668\u6709 5 \u53f0\uff1b \u7136\u540e\u670d\u52a1\u7aef\u5c31\u5148\u62ff\u7740\u7b2c 1 \u6761\u7528\u4f8b\u7ed9\u8fdc\u7a0b 1 \u53f7\u673a\u6267\u884c\uff0c\u62ff\u7b2c 2 \u6761\u7528\u4f8b\u7ed9\u8fdc\u7a0b 2 \u53f7\u673a\u6267\u884c...\uff0c\u5982\u6b64\u5faa\u73af\u76f4\u5230\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\uff0c\u8fd9\u5c31\u662f\u8d1f\u8f7d\u5747\u8861\u6267\u884c\u3002 \u4f7f\u7528\u65b9\u6cd5\u548c\u524d\u9762\u4e00\u6837\uff0c\u53ea\u662f\u9700\u8981\u589e\u52a0\u4e00\u4e2a\u53c2\u6570\uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\" --parallel no\n"},{"location":"#23-pms","title":"2.3. PMS \u6570\u636e\u56de\u586b","text":"\u6d4b\u8bd5\u5355\u5173\u8054\u7684\u7528\u4f8b\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u5bf9\u5e94\u7684\u53bb\u8dd1\u8fd9\u4e9b\u5173\u8054\u7684\u7528\u4f8b\uff0c\u5e76\u4e14\u5c06\u6267\u884c\u7684\u7ed3\u679c\u56de\u586b\u7684\u6d4b\u8bd5\u7528\u4f8b\u7684\u72b6\u6001\u91cc\u9762\u3002 PMS \u6570\u636e\u56de\u586b\u4e3b\u8981\u6709\u4e09\u79cd\u65b9\u5f0f\uff1a \uff081\uff09\u5f02\u6b65\u56de\u586b \u5728\u7528\u4f8b\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\uff0c\u91c7\u7528\u5f02\u6b65\u7684\u65b9\u5f0f\u53bb\u8fdb\u884c\u6570\u636e\u56de\u586b\uff0c\u76f4\u767d\u7684\u8bb2\u5c31\u662f\uff0c\u7b2c\u4e8c\u6761\u7528\u4f8b\u5f00\u59cb\u8dd1\u7684\u65f6\u5019\uff0c\u901a\u8fc7\u5b50\u7ebf\u7a0b\u53bb\u505a\u7b2c\u4e00\u6761\u7528\u4f8b\u7684\u6570\u636e\u56de\u586b\uff0c\u5982\u6b64\u5faa\u73af\uff0c\u76f4\u5230\u6240\u6709\u7528\u4f8b\u6267\u884c\u7ed3\u675f\uff1b \u8fd9\u79cd\u65b9\u6848\u7684\u65f6\u95f4\u6548\u7387\u6700\u9ad8\u7684\uff0c\u56e0\u4e3a\u7406\u8bba\u4e0a\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u662f\u5927\u4e8e\u6570\u636e\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\u65f6\u95f4\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u5f53\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u6570\u636e\u56de\u586b\u4e5f\u5b8c\u6210\u4e86\u3002 \u4f7f\u7528\u65b9\u6cd5\uff0c\u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u4ee5\u4e0b\u53c2\u6570\uff1a\uff08\u4ee5\u4e0b\u6d89\u53ca\u5230\u7684\u53c2\u6570\u914d\u7f6e\u90fd\u662f\u5728\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u914d\u7f6e\uff09 PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = async\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \u8fd9\u4e2a\u53c2\u6570\u53ef\u586b\u53ef\u4e0d\u586b\uff0c\u4f46\u662f\u586b\u4e86\u53ef\u4ee5\u63d0\u9ad8\u7528\u4f8b\u7684\u6267\u884c\u901f\u5ea6\uff0c\u56e0\u4e3a\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u53ef\u4ee5\u6307\u5b9a\u5230\u5177\u4f53\u7684\u5e94\u7528\u5e93\u3002\uff08\u4e0b\u540c\uff09\n \uff082\uff09\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u56de\u586b \u7b49\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u518d\u9010\u4e2a\u8fdb\u884c\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u6b64\u65b9\u6848\u65f6\u95f4\u6548\u7387\u6bd4\u8f83\u4f4e\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \uff083\uff09\u624b\u52a8\u56de\u586b \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4e0d\u505a\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u540e\u7eed\u624b\u52a8\u5c06\u7ed3\u679c\u8fdb\u884c\u56de\u586b\u8bf7\u6c42\u3002 \u7528\u4f8b\u6267\u884c\u65f6\u914d\u7f6e\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = hand\nAPP_NAME = \u540e\u7eed\u624b\u52a8\u56de\u586b\u65b9\u6cd5\uff1a youqu manage.py pms --send2task yes\n"},{"location":"#_4","title":"\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898","text":"\u7531\u540c\u5b66\u53ef\u80fd\u4f1a\u53d1\u73b0\uff0c\u600e\u4e48\u56de\u586b\u4e00\u6b21\u4e4b\u540e\uff0c\u540e\u9762\u60f3\u518d\u6b21\u56de\u586b\u5c31\u4e0d\u751f\u6548\u4e86\uff1b \u8fd9\u662f\u56e0\u4e3a\u4e3a\u4e86\u5e94\u5bf9\u524d\u9762\u63d0\u5230\u7684\u591a\u79cd\u6570\u636e\u56de\u586b\u7684\u65b9\u5f0f\uff0c\u5728 report \u76ee\u5f55\u4e0b\u4f1a\u7531 pms_xxx \u5f00\u5934\u7684\u76ee\u5f55\uff0c\u8bb0\u5f55\u4e86\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u548c\u56de\u586b\u60c5\u51b5\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u4e4b\u524d\u5df2\u7ecf\u56de\u586b\u8fc7\u4e86\uff0c\u540e\u7eed\u5c31\u4e0d\u4f1a\u518d\u6b64\u89e6\u53d1\u56de\u586b\u4e86\uff1b \u5982\u679c\u4f60\u60f3\u91cd\u65b0\u505a\u56de\u586b\uff0c\u4f60\u53ef\u4ee5\u628a report/pms_xxx \u76ee\u5f55\u5220\u6389\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u91cd\u65b0\u505a\u6570\u636e\u56de\u586b\u4e86\uff1b"},{"location":"#24-csv","title":"2.4. \u5bfc\u51fa CSV \u6587\u4ef6","text":"\u6846\u67b6\u63d0\u4f9b\u5bfc\u51fa\u6307\u5b9a\u6807\u7b7e\u7528\u4f8b\u7684\u529f\u80fd\uff1a youqu manage.py exportcsv -a deepin-album -t CICD\n \u8868\u793a\u5bfc\u51fa deepin-album \u7684\u7528\u4f8b\u4e2d\u6807\u8bb0\u4e86 CICD \u6807\u7b7e\u7684\u7528\u4f8b\uff0c\u5bfc\u51fa CSV \u6587\u4ef6\u7684\u5b57\u6bb5\u683c\u5f0f\u5df2\u7ecf\u9002\u914d\u4e86 CICD \u7684\u8981\u6c42\u3002"},{"location":"#25-app","title":"2.5. \u811a\u624b\u67b6\u65b0\u5efa APP \u5de5\u7a0b","text":"\u65b0\u5efa\u4e00\u4e2a APP \u5de5\u7a0b\uff1a youqu manage.py startapp autotest_deepin_some \u8fd9\u6837\u5728 apps \u76ee\u5f55\u4e0b\u4f1a\u521b\u5efa\u4e00\u4e2a\u5b50\u9879\u76ee\u5de5\u7a0b autotest_deepin_some\uff0c\u540c\u65f6\u65b0\u5efa\u597d\u5de5\u7a0b\u6a21\u677f\u76ee\u5f55\u548c\u6a21\u677f\u6587\u4ef6\uff1a apps\n\u2514\u2500\u2500 autotest_deepin_some\n \u00a0\u00a0 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_case.py\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 config.ini\n \u00a0\u00a0 \u251c\u2500\u2500 config.py\n \u00a0\u00a0 \u251c\u2500\u2500 conftest.py\n \u00a0\u00a0 \u251c\u2500\u2500 control\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_assert.py\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some.csv\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u2514\u2500\u2500 widget\n \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 case_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 other.ini\n \u00a0\u00a0 \u251c\u2500\u2500 other_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 pic_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2514\u2500\u2500 ui.ini\n autotest_deepin_some \u662f\u4f60\u7684\u5de5\u7a0b\u540d\u79f0\uff0c\u6bd4\u5982\uff1aautotest_deepin_music \uff1b \u5728\u6b64\u57fa\u7840\u4e0a\uff0c\u4f60\u53ef\u4ee5\u5feb\u901f\u7684\u5f00\u59cb\u4f60\u7684 AT \u9879\u76ee\u3002"},{"location":"#26","title":"2.6. \u7528\u4f8b\u6807\u7b7e\u81ea\u52a8\u540c\u6b65","text":"\u7528\u4e8e\u81ea\u52a8\u540c\u6b65 PMS \u7528\u4f8b\u6807\u7b7e\u6570\u636e\u81f3\u672c\u5730 CSV \u6587\u4ef6\uff0c\u4e3b\u8981\u901a\u8fc7\u4ee5\u4e0b\u51e0\u4e2a\u914d\u7f6e\u6765\u63a7\u5236\uff1a APP_NAME = # \u6307\u5b9a\u8981\u540c\u6b65\u7684\u5e94\u7528\u540d\u79f0\nPMS_USER = # PMS\u7684\u7528\u6237\u540d\nPMS_PASSWORD = # PMS\u7684\u5bc6\u7801\n \u5728 [csv_link_pms_id] \u8282\u70b9\u4e0b\u6307\u5b9a csv \u6587\u4ef6\u540d\u4e0e PMS \u7528\u4f8b\u6a21\u5757\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u6bd4\u5982\uff1a [csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/testcase-browse-53.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 53\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic = 53\n \u5c06\u4ee5\u4e0a\u4fe1\u606f\u914d\u7f6e\u597d\u4e4b\u540e\uff0c\u5728\u547d\u4ee4\u884c\u6267\u884c\uff1a youqu manage.py pms --pms2csv yes\n \u6bcf\u6b21\u6267\u884c\u65f6\u539f csv \u6587\u4ef6\u4f1a\u81ea\u52a8\u5907\u4efd\u5728 report/csv_back \u76ee\u5f55\u4e0b\uff0c\u56e0\u6b64\u4f60\u4e0d\u7528\u62c5\u5fc3\u811a\u672c\u6267\u884c\u5bfc\u81f4\u4f60\u7684\u6570\u636e\u4e22\u5931\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u57fa\u7840\u6846\u67b6\u8bbe\u8ba1\u65b9\u6848","text":"# ====================================\n# Author : Mikigo\n# Time : 2022/3/18\n# version \uff1a1.0\n# ====================================\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"\u505a\u4e00\u4e2a\u7b80\u5355\u3001\u597d\u7528\u3001\u529f\u80fd\u5f3a\u5927\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u3002 \u4f5c\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4e00\u4e2a\u57fa\u7840\u6846\u67b6\uff0c\u4efb\u4f55\u5e94\u7528\u90fd\u80fd\u5f88\u65b9\u4fbf\u7684\u63a5\u5165\u8fdb\u6765\uff1b \u63d0\u4f9b\u6240\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u9700\u8981\u7684\u5e95\u5c42\u529f\u80fd\uff0c\u5e76\u5bf9\u5916\u63d0\u4f9b\u552f\u4e00\u7684\u63a5\u53e3\uff0c\u65b9\u4fbf\u5e94\u7528\u5e93\u4f7f\u7528\uff1b \u6574\u5408\u516c\u5171\u5e93\uff0c\u51cf\u5c11\u5e94\u7528\u5e93\u4ee3\u7801\u91cf\u548c\u65b9\u6cd5\u7ef4\u62a4\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u8bbe\u8ba1\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u7edf\u4e00\u6982\u5ff5","text":" \u57fa\u7840\u6846\u67b6 \u672c\u9879\u76ee\u662f\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\uff08AutoTest Basic Frame\uff09\uff0c\u5168\u79f0\u4e3a\u201c\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff08AT \u57fa\u7840\u6846\u67b6\uff09\u201d\u3002 AT \u57fa\u7840\u6846\u67b6\u662f\u505a\u4e3a\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\u6765\u8bbe\u8ba1\u7684\uff0c\u5b83\u63d0\u4f9b\u4e86\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u57fa\u7840\u529f\u80fd\uff0c\u4efb\u4f55\u5e94\u7528\u63a5\u5165\u8fdb\u6765\u90fd\u80fd\u5feb\u901f\u65b9\u4fbf\u7684\u8fdb\u884c\u65b9\u6cd5\u548c\u7528\u4f8b\u7f16\u5199\uff0c\u540c\u65f6\u5728\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u3001\u6807\u7b7e\u5316\u6267\u884c\u3001\u5206\u5e03\u5f0f\u6267\u884c\u3001\u591a\u79cd\u62a5\u544a\u8f93\u51fa\u3001\u4f18\u7f8e\u7684\u6267\u884c\u65e5\u5fd7\u3001\u5931\u8d25\u81ea\u52a8\u5f55\u5c4f\u548c\u622a\u56fe\u3001\u81ea\u52a8\u73af\u5883\u6e05\u7406\u7b49\u7b49\uff0c\u5b83\u90fd\u63d0\u4f9b\u4e86\u5b8c\u5584\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u66f4\u91cd\u8981\u7684\u662f\u8fd9\u4e00\u5207\u4f7f\u7528\u8d77\u6765\u90fd\u975e\u5e38\u7b80\u5355\u3002 \u57fa\u7840\u6846\u67b6\u4e2d\u5305\u542b\u5e94\u7528\u5e93\uff08apps\uff09\u3001\u6838\u5fc3\u5e93\uff08src\uff09\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09\u3002 \u5e94\u7528\u5e93\uff08apps\uff09 \u5404\u4e2a\u5e94\u7528\u81ea\u5df1\u7684\u4ed3\u5e93\uff0c\u91cc\u9762\u4e3b\u8981\u5305\u542b\u7684\u662f\u7528\u4f8b\u3001\u65b9\u6cd5\u53ca\u4e00\u4e9b\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u53eb autotest-dde-file-manager \u3002 \u6838\u5fc3\u5e93\uff08src\uff09 \u6838\u5fc3\u5e93\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u5230\u6240\u6709\u5e95\u5c42\u6838\u5fc3\u529f\u80fd\uff0c\u8fd9\u662f\u6700\u91cd\u8981\u7684\u4e00\u4e2a\u90e8\u5206\uff0c\u7075\u9b42\u3002\u5177\u4f53\u529f\u80fd\u6a21\u5757\u53ca\u8bf4\u660e\u4f1a\u5728\u4e0b\u9762\u7b2c\u56db\u4e2a\u7ae0\u8282\u8be6\u7ec6\u63cf\u8ff0\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09 \u591a\u4e2a\u5e94\u7528\u90fd\u8981\u7528\u5230\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\uff0c\u6309\u7167\u5e94\u7528\u5212\u5206\u5b58\u653e\uff0c\u4e3b\u8981\u662f\u4e3a\u4e86\u51cf\u5c11\u4ee3\u7801\u91cf\uff0c\u6d88\u9664\u5e94\u7528\u95f4\u7684\u8026\u5408\u5173\u7cfb\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u67b6\u6784\u56fe","text":"\u6574\u4f53\u7684\u6846\u67b6\u8bbe\u8ba1\u5728\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u300b\u6587\u6863\u91cc\u9762\u5df2\u7ecf\u6709\u8be6\u7ec6\u63cf\u8ff0\u4e86\uff0c\u8fd9\u91cc\u8d34\u4e00\u4e0b\u6574\u4f53\u7684\u67b6\u6784\u56fe\uff1a \u4e3a\u4e86\u7a81\u663e\u672c\u6587\u7684\u91cd\u70b9\uff0c\u62bd\u53d6\u5176\u4e2d\u91cd\u8981\u529f\u80fd\u6a21\u5757\uff0c\u5982\u4e0b\u56fe\uff1a "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-basic-frame # \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\n\u251c\u2500\u2500 apps # \u5e94\u7528\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-dde-file-manager # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\uff08\u5e94\u7528\u5e93\u8be6\u7ec6\u76ee\u5f55\u7ed3\u6784\u8bf7\u770b\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\uff09\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 tag # \u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u2514\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u2502 \u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 xxx.png\n\u2502 \u2502 ...\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-deepin-music # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 public # \u516c\u5171\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget # dde_dock \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget # dde_desktop \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 src # \u6838\u5fc3\u5e93\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 button_center.py\n\u2502 \u251c\u2500\u2500 cmdtrl.py\n\u2502 \u251c\u2500\u2500 dogtails.py\n\u2502 \u251c\u2500\u2500 find_image.py\n\u2502 \u251c\u2500\u2500 global_config.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 setting # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 config.py\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 global_config.ini\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\u6a21\u5757\uff08Hook\uff09\n\u251c\u2500\u2500 pytest.ini # Pytest \u9ed8\u8ba4\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 docs # \u6587\u6863\u76ee\u5f55\n\u2514\u2500\u2500 manage.py # \u6267\u884c\u5668\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1apps","title":"1\u3001\u5e94\u7528\u5e93\uff08apps\uff09","text":"\u6240\u6709\u5e94\u7528\u5e93\u5747\u653e\u7f6e\u5728\u57fa\u7840\u6846\u67b6\u4e0b\u7684 apps \u76ee\u5f55\u4e0b\uff08\u89c1\u7b2c\u4e8c\u7ae0\u8282\u7b2c3\u6bb5\u76ee\u5f55\u7ed3\u6784\u5185\u5bb9\uff09\u3002\u5e94\u7528\u5e93\u7684\u67b6\u6784\u8bbe\u8ba1\u53ef\u4ee5\u53c2\u8003\u300aAT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b\u6587\u6863\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2src","title":"2\u3001\u6838\u5fc3\u5e93\uff08src\uff09","text":"\u5728 src \u76ee\u5f55\u4e0b\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u5e95\u5c42\u6838\u5fc3\u7ec4\u4ef6\uff0c\u901a\u5e38\u6765\u8bb2\u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5230\u5176\u4e2d\u67d0\u4e00\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4e48\u4f60\u9700\u8981\u663e\u793a\u7684\u5bfc\u5165\u8fd9\u4e2a\u6a21\u5757\uff0c\u7136\u540e\u624d\u80fd\u4f7f\u7528\u8be5\u6a21\u5757\u4e0b\u7684\u529f\u80fd\uff0c\u5982\u679c\u4f60\u7528\u5230\u4e86\u5341\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4f60\u5c31\u9700\u8981\u5bfc\u5165\u5341\u4e2a\u3002\u4f46\u662f\u6211\u4eec\u60f3\u8ba9\u4e8b\u60c5\u53d8\u5f97\u7b80\u5355\uff0c\u4e00\u6b21\u5bfc\u5165\uff0c\u4f7f\u7528\u6240\u6709\u3002 \u5c06\u6240\u6709\u7684\u529f\u80fd\u6a21\u5757\u90fd\u8fdb\u5165\u5230 src \u7684\u540d\u79f0\u7a7a\u95f4\uff0c\u5728 src/__init__.py \u91cc\u9762\u6211\u4eec\u8bbe\u8ba1\u6210\u8fd9\u6837\uff1a # src/__init__.py\nfrom .cmdctl import CmdCtl\nfrom .dogtails import Dogtail\nfrom .find_image import FindImage\nfrom .button_center import ButtonCenter\nclass Src(CmdCtl, FindImage):\ndef __init__(self, **kwargs):\n\"\"\"dogtail or button center param\n :param kwargs: app_name, desc, number\n \"\"\"\nif kwargs:\napp_name = kwargs.get(\"APP_NAME\")\ndesc = kwargs.get(\"DESC\")\nif app_name is None or desc is None:\nraise ValueError\nnumber = kwargs.get(\"number\")\nnumber = number if isinstance(number, int) else -1\n# \u5bf9\u8c61\u7ec4\u5408\nself.dog = Dogtail(app_name, desc, number)\nself.ui = ButtonCenter(app_name, number)\n \u9700\u8981\u4f20\u9012\u53c2\u6570\u7684\u91c7\u7528\u5bf9\u8c61\u7ec4\u5408\uff0c\u6ca1\u6709\u53c2\u6570\u7684\u4f7f\u7528\u7ee7\u627f\uff0c\u7ee7\u627f\u7684\u7c7b\u7b26\u5408 Mixin \u8bbe\u8ba1\u6a21\u5f0f\u3002 \u5e94\u7528\u5e93\u91cc\u9762\u4f7f\u7528\u7684\u65f6\u5019\u5728 widget/base_widget.py \u91cc\u9762\u53ea\u9700\u8981\u552f\u4e00\u7ee7\u627f Src \uff1a # \u5e94\u7528\u5e93\u91cc\u9762\u65b9\u6cd5\u57fa\u7c7b\n# widget/base_widget.py\nfrom src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n \u8981\u4f7f\u7528\u6838\u5fc3\u5e93\u7684\u529f\u80fd\uff0c\u53ea\u9700\u8981\u5199\u4e00\u4e2a\u5bfc\u5165 from src import Src \u5373\u53ef\u3002 \u5199 __init__ \u6784\u9020\u51fd\u6570\u7684\u539f\u56e0\u662f\u901a\u8fc7\u53c2\u6570\u6784\u9020\u5e94\u7528\uff0c\u5e76\u4e14\u4f20\u9012 number \u8fdb\u6765\uff0c\u53ef\u4ee5\u5b9e\u73b0\u591a\u7a97\u53e3\u7684\u63a7\u5236\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3public","title":"3\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09","text":"\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6bcf\u4e2a\u5e94\u7528\u90fd\u662f\u4e00\u4e2a\u5355\u72ec\u7684 py \u6587\u4ef6\uff0c\u76f8\u4e92\u4e4b\u95f4\u662f\u72ec\u7acb\u7684\uff0c\u6bcf\u4e2a py \u6587\u4ef6\u91cc\u9762\u662f\u8be5\u5e94\u7528\u7684\u65b9\u6cd5\u7c7b\uff0c\u6bd4\u5982\uff1a\u6700\u5e38\u7528\u7684\u65b9\u6cd5\u7c7b dde_desktop_public_widget.py # dde_desktop_widget.py\nfrom src import Src\nclass _DdeDesktopPublicBaseWidget(Src):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-desktop\"\nDESC = \"/usr/bin/dde-desktop\"\ndef __init__(self):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC)\nclass DdeDesktopPublicWidget(_DdeDesktopPublicBaseWidget):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u7c7b\"\"\"\ndef click_music_dir_by_ui(self):\n\"\"\"\u5728\u6587\u4ef6\u9009\u62e9\u6846\u70b9\u51fb\u97f3\u4e50\u76ee\u5f55\"\"\"\nself.click(*self.ui.btn_center(\"\u4fa7\u8fb9\u680f-\u97f3\u4e50\")) \ndef click_xxx_by_attr(self):\npass\n \u516c\u5171\u65b9\u6cd5\u5e93\u610f\u4e49\uff1a \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6240\u5c01\u88c5\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\u90fd\u662f\u81f3\u5c11\u88ab2\u4e2a\u5e94\u7528\u90fd\u7528\u5230\u7684\uff0c\u8fd9\u6837\u505a\u53ef\u4ee5\u51cf\u5c11\u6574\u4f53\u4ee3\u7801\u91cf\uff0c\u4ece\u800c\u51cf\u8f7b\u5e94\u7528\u5e93\u4ee3\u7801\u7684\u7ef4\u62a4\u5de5\u4f5c\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u7f16\u5199\u5f62\u5f0f\uff08\u547d\u540d\u89c4\u5219\u3001\u5b9a\u4f4d\u7684\u65b9\u6848\u5199\u6cd5\u3001\u6ce8\u91ca\u7684\u5199\u6cd5\u7b49\u7b49\uff09\u5177\u6709\u4e00\u5b9a\u7684\u6a21\u677f\u4f5c\u7528\uff0c\u8fd9\u6837\u5373\u4f7f\u662f\u5404\u4e2a\u5e94\u7528\u5e93\u90fd\u72ec\u7acb\u7ef4\u62a4\uff0c\u6240\u6709\u7684\u7f16\u7801\u98ce\u683c\u90fd\u662f\u8d8b\u4e8e\u76f8\u540c\u7684\uff0c\u56e0\u4e3a\u5927\u5bb6\u90fd\u5e94\u8be5\u53c2\u7167\u516c\u5171\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u5199\u6cd5\u6765\u5199\u81ea\u5df1\u5e94\u7528\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\u7c7b\uff0c\u8fd9\u6837\u4f7f\u5f97\u4ece\u516c\u53f8\u7684\u89d2\u5ea6\u53bb\u770b\u6240\u6709\u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u90fd\u662f\u7edf\u4e00\u7684\u3002 \u53ef\u4ee5\u901a\u8fc7\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\uff0c\u4e86\u89e3\u5230\u5176\u4ed6\u5e94\u7528\u7684\u529f\u80fd\uff0c\u5bf9\u4e8e\u6211\u4eec\u9700\u6c42\u7406\u89e3\uff0c\u4e86\u89e3\u7cfb\u7edf\u7684\u65b9\u65b9\u9762\u9762\u4e5f\u6709\u597d\u5904\u3002 \u5f53\u7136\uff0c\u5982\u679c\u4f60\u7684\u5e94\u7528\u672c\u8eab\u662f\u5c5e\u4e8e\u6839\u672c\u5c31\u4e0d\u9700\u8981\u548c\u5176\u4ed6\u5e94\u7528\u4ea4\u4e92\u7684\uff0c\u90a3\u4e48\u4f60\u53ef\u80fd\u4e0d\u4f1a\u7528\u5230\u8fd9\u91cc\u9762\u7684\u529f\u80fd\uff0c\u6ca1\u5173\u7cfb\uff0c\u4f60\u6240\u6709\u7684\u65b9\u6cd5\u90fd\u53ef\u4ee5\u76f4\u63a5\u5199\u5728\u5e94\u7528\u5e93\u7684\u4e1a\u52a1\u5c42\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4conftestpy","title":"4\u3001conftest.py","text":"conftest.py \u4ece\u529f\u80fd\u4e0a\u5c06\u662f\u5c5e\u4e8e\u6838\u5fc3\u5e93\uff08src\uff09\u7684\u5185\u5bb9\uff0c\u4f46\u662f\u7531\u4e8e\u5b83\u7684\u7279\u6b8a\u6027\uff0c\u5373\u5b83\u662f\u5bf9\u5e94\u7528\u5e93\u4e2d\u7684\u7528\u4f8b\u751f\u6548\u7684\uff0c\u800c\u4e14\u5b83\u7684\u4f5c\u7528\u57df\u662f\u5f53\u524d\u76ee\u5f55\u53ca\u4ee5\u4e0b\uff0c\u56e0\u6b64\u6211\u4eec\u5c06\u5b83\u653e\u5230\u9879\u76ee\u6839\u76ee\u5f55\u3002\u6211\u4eec\u6846\u67b6\u4e2d\u6709\u4e0d\u5c11\u6838\u5fc3\u529f\u80fd\u90fd\u662f\u5728\u8fd9\u91cc\u9762\u8fdb\u884c\u5f00\u53d1\u7684\uff0c\u540e\u9762\u7b2c\u56db\u7ae0\u4f1a\u8bb2\u5230\u7ec6\u8282\u3002 pytest.ini \u4f5c\u7528\u548c conftest.py \u7c7b\u4f3c\uff0c\u662f Pytest \u6846\u67b6\u7684\u56fa\u5b9a\u914d\u7f6e\u6587\u4ef6\uff0c\u76ee\u524d\u914d\u7f6e\u4e86\u4e00\u4e9b\u901a\u7528\u7684\u547d\u4ee4\u884c\u6267\u884c\u53c2\u6570\uff0c\u4e5f\u653e\u5728\u9879\u76ee\u6839\u76ee\u5f55\u3002 \u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 Hook \u51fd\u6570\uff0capps \u76ee\u5f55\u4e0b\u7684 \u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 fixture \u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5setting","title":"5\u3001setting","text":"\u5168\u5c40\u914d\u7f6e\u6a21\u5757\uff0c\u5305\u542b\u4e86\u4ee5\u4e0b\u914d\u7f6e\u6587\u4ef6\uff1a \uff081\uff09ini \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u914d\u7f6e\u4e00\u4e9b\u5168\u5c40\u7684\u914d\u7f6e\u9879\uff0c\u8b6c\u5982\uff1a\u5931\u8d25\u91cd\u8dd1\u6b21\u6570\u3001\u662f\u5426\u5931\u8d25\u5f55\u5c4f\u3001\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\u3001\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4\u3001\u6267\u884c\u65f6\u65e5\u5fd7\u7ea7\u522b\u3001\u751f\u6210\u7684\u62a5\u544a\u7c7b\u578b\u3001\u4ee5\u53ca\u5206\u5e03\u5f0f\u6267\u884c\u7684\u4e00\u4e9b\u7b56\u7565\u914d\u7f6e\u9879\u7b49\u7b49\u3002 \uff082\uff09config.py \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u63d0\u4f9b\u914d\u7f6e\u6587\u4ef6\u8bfb\u53d6\u3001\u52a8\u6001\u83b7\u53d6\u4e00\u4e9b\u5e38\u91cf\uff08\u5982\u9879\u76ee\u6839\u76ee\u5f55\u7edd\u5bf9\u8def\u5f84 (BASE_DIR)\u3001\u7cfb\u7edf\u67b6\u6784\uff08SYS_FRAME\uff09\u3001\u65f6\u95f4\u5b57\u7b26\u4e32\uff08strftime\uff09\u3001\u672c\u673a USERNAME IP \u7b49\u7b49\uff09\u3001\u516c\u5171 URL \u7b49\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u89c4\u8303","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u7248\u672c\u53ca\u4f9d\u8d56","text":"\u57fa\u7840\u6846\u67b6\u4f1a\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u8fdb\u884c\u7248\u672c\u53d1\u5e03\uff0c\u4e0d\u4e0e\u67d0\u4e2a\u5e94\u7528\u7248\u672c\u7ed1\u5b9a\uff0c\u4f46\u662f\uff0c\u5e94\u7528\u5e93\u4f1a\u4f9d\u8d56\u4e8e\u57fa\u7840\u6846\u67b6\u7684\u7248\u672c\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u5efa\u8bae\u5728\u5e94\u7528\u5e93\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a\u6587\u672c\u6587\u4ef6\u7528\u4e8e\u8bb0\u5f55\u6240\u4f9d\u8d56\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\uff0c\u7c7b\u4f3c\u4e8e\u5f00\u53d1\u5e94\u7528\u7684 debian/control \u6587\u4ef6\u7684\u529f\u80fd\uff0c\u4e3a\u4e86\u4fdd\u6301\u7edf\u4e00\uff0c\u8fd9\u4e2a\u6587\u4ef6\u5c31\u547d\u540d\u4e3a control\uff0c\u653e\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u6838\u5fc3\u5e93\u72ec\u7acb\u6027","text":"\u6838\u5fc3\u5e93\u4e0d\u5efa\u8bae\u9488\u5bf9\u67d0\u4e00\u4e2a\u5e94\u7528\u5355\u72ec\u505a\u4ee3\u7801\u4e0a\u7279\u6b8a\u5904\u7406\uff0c\u901a\u5e38\u8003\u8651\u9488\u5bf9\u67d0\u4e00\u79cd\u573a\u666f\u8fdb\u884c\u5904\u7406\uff0c\u8fd9\u4e9b\u573a\u666f\u901a\u5e38\u662f\u5b58\u5728\u4e00\u4e9b\u5171\u6027\u7684\u3002\u6bd4\u5982\u8bf4\uff1a\u684c\u9762\u7684ID\u5206\u914d\u5b58\u5728\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u903b\u8f91\u5904\u7406\u89e3\u51b3ID\u5206\u914d\u9519\u8bef\u7684\u95ee\u9898\uff0c\u4f46\u662f\u8fd9\u90e8\u5206\u903b\u8f91\u6211\u4eec\u4f1a\u5728\u684c\u9762\u7684\u65b9\u6cd5\u5c42\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u517c\u5bb9\u6027","text":"\u4e3a\u4e86\u4fdd\u6301\u517c\u5bb9\u6027\uff0c\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u539f\u5219\u4e0a\u4e0d\u5bf9\u8001\u65b9\u6cd5\u8fdb\u884c\u4fee\u6539\u6216\u5220\u9664\uff0c\u53ea\u8fdb\u884c\u65b0\u589e\u3002\u6d89\u53ca\u5230\u8001\u65b9\u6cd5\u4fee\u6539\u6216\u5220\u9664\u7684\uff0c\u4f1a\u8fdb\u884c\u63d0\u524d\u9884\u544a\uff0c\u5e76\u5728\u7b2c\u4e8c\u4e2a\u7248\u672c\u4e4b\u540e\uff08\u4e2d\u95f4\u4f1a\u9694\u4e00\u4e2a\u7248\u672c\u8fc7\u5ea6\uff09\u6b63\u5f0f\u5b9e\u65bd\u4fee\u6539\u6216\u5220\u9664\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u547d\u540d\u89c4\u8303","text":" \u7528\u4f8b ID \u6bcf\u4e2a\u5e94\u7528\u81ea\u5df1\u7ef4\u62a4\u4e00\u5957 ID\uff0c\u5728PMS\u4e0a\u7528\u4f8b\u6807\u9898\u4e0a\u5c06\u81ea\u52a8\u5316ID\u4ee5\u6807\u7b7e\u7684\u5f62\u5f0f\u5199\u5165\uff0c\u6bd4\u5982\uff1a[101]\u6253\u5f00-\u542f\u52a8\u5e94\u7528\u540edock\u53f3\u952e\u83dc\u5355 \u4e00\u4e2a\u7528\u4f8b\u7c7b\u91cc\u9762\u6709\u591a\u4e2a\u7528\u4f8b\u65f6\uff0c\u5728\u7528\u4f8b\u540d\u79f0\u540e\u9762\u52a0\u5e8f\u53f7\u3002 class TestFileManager(BaseCase):\n\"\"\"\u6587\u7ba1\u7528\u4f8b\"\"\"\ndef test_xxx_015_1(self):\npass\ndef test_xxx_015_2(self):\npass\n \u6ce8\u610f 015_1\uff0c\u4e0d\u8981\u5199015_01\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 PMS \u4e0a\u7684\u7528\u4f8bID\uff1a PMS \u4e0a\u662f6\u4f4d\u6570\uff0c\u4e0d\u591f\u76f4\u89c2\uff0c\u4e5f\u4e0d\u597d\u7ef4\u62a4\uff0c\u5728\u81ea\u52a8\u5316\u4e0b\u9762\u53bb\u627e\u4e00\u4e2a\u5e26\u6709 6 \u4f4d\u6570\u7684\u6587\u4ef6\u662f\u4e00\u4e2a\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 PMS \u4e0a\u7684 ID \u53ef\u80fd\u4f1a\u53d1\u751f\u53d8\u5316\uff0c\u6bd4\u5982\u5bfc\u51fa\u6765\u5bfc\u8fdb\u53bb\u7684\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u5b58\u5728\u95ee\u9898\uff0c\u5982\u679c\u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u8981\u60f3\u627e\u51fa\u6765\u5bf9\u5e94\u4fee\u6539\u81ea\u52a8\u5316\u7528\u4f8b ID\uff0c\u5c06\u4f1a\u662f\u4ef6\u975e\u5e38\u75db\u82e6\u7684\u4e8b\u60c5\u3002 \u51fd\u6570\u547d\u540d\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5de6\u952e\u70b9\u51fb click \u53f3\u952e\u70b9\u51fb right_click \u53cc\u51fb double_click \u79fb\u52a8 move_to \u62d6\u52a8 drag \u65b0\u5efa new \u62d6\u52a8\u5230 drag_to \u4ece\u54ea\u91cc\u62d6\u52a8\u5230\u54ea\u91cc drag_something_from_xxx_to_xxx \u83b7\u53d6 get \u83b7\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5750\u6807 get_location \u975e\u7279\u6b8a\u6587\u4ef6 file word\u6587\u4ef6 doc text\u6587\u4ef6 text \u6587\u4ef6\u5939 dir \u5173\u952e\u8bcd\u6301\u7eed\u589e\u52a0 \u5e38\u91cf\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5e94\u7528\u540d\u79f0 APP_NAME \u5e94\u7528\u63cf\u8ff0 DESC \u672c\u5e94\u7528\u4ee5\u5916\u7684\u5176\u4ed6\u5e94\u7528\uff0c\u6bd4\u5982\u5e2e\u52a9 HELP \u5176\u4ed6\u540d\u79f0\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u65b9\u6cd5\u5305\u540d widget \u65b9\u6cd5\u6587\u4ef6\u540d\uff08\u6587\u7ba1\u4e3e\u4f8b\uff09 dfm_widget.pytitle_widget.pyright_view_widget.pyleft_view_widget.pypop_widget.pybase_widget.pydfm_assert.py \u65ad\u8a00\u8bed\u53e5\u547d\u540d\u89c4\u8303 \u65ad\u8a00\u8bed\u53e5\u90fd\u662f\u4ee5 assert \u5f00\u5934 \u65ad\u8a00 \u8bed\u53e5 \u5224\u65ad\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_existsassert_file_not_exists \u5224\u65ad\u684c\u9762\u76ee\u5f55\u4e0b\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_exists_in_desktopassert_file_not_exists_in_desktop \u5224\u65ad\u56fe\u7247\u5b58\u5728 assert_image_existsassert_image_not_exists \u5224\u65ad\u5f71\u9662\u4e2d\u662f\u5426\u5b58\u5728\u56fe\u7247 assert_image_exists_in_movieassert_image_not_exists_in_movie \u5224\u65ad\u5143\u7d20\u662f\u5426\u5b58\u5728 assert_element_existassert_element_not_exist \u5224\u65ad\u662f\u5426\u76f8\u7b49 assert_equalassert_not_equal \u5224\u65ad\u662f\u5426\u4e3a\u771f assert_trueassert_false"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5fixture","title":"5\u3001fixture \u89c4\u8303","text":"\u7531\u4e8e Pytest \u6846\u67b6\u4e2d\u652f\u6301 fixture \u7684\u5199\u6cd5\u548c Xunit \u5199\u6cd5\u7684\uff0c\u6240\u4ee5\u5e94\u7528\u5e93\u4e2d\u53ef\u80fd\u5b58\u5728\u6df7\u7528\u7684\u60c5\u51b5\uff0c\u4e3a\u7edf\u4e00\u7f16\u7801\u98ce\u683c\u65b9\u4fbf\u540e\u7eed\u7528\u4f8b\u4ee3\u7801\u7ef4\u62a4\uff0c\u73b0\u505a\u4ee5\u4e0b\u89c4\u8303\u8bf4\u660e\uff1a \u629b\u5f03 Xunit \u7684\u5199\u6cd5\uff0c\u7edf\u4e00\u91c7\u7528 Pytest fixture \u7684\u5199\u6cd5\u3002 \u5e94\u7528\u5185 fixture \u8c28\u614e\u4f7f\u7528 autouse=True \uff0c\u975e\u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u975e\u5e38\u4e0d\u5efa\u8bae\u4f7f\u7528\u8fd9\u4e2a\u53c2\u6570\u3002 \u8c03\u7528 fixture \u4e0d\u80fd\u4f7f\u7528 @pytest.mark.usefixture()\uff0c\u4f7f\u7528\u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u4f20\u5165\u51fd\u6570\u5bf9\u8c61\u3002 \u5efa\u8bae\u5728\u4e00\u4e2a conftest.py \u91cc\u9762\u53bb\u5199\uff0c\u4e00\u4e2a\u5e94\u7528\u4e5f\u5c3d\u91cf\u7ef4\u62a4\u4e00\u4e2a conftest.py\u6587\u4ef6\u3002 fixture \u4e5f\u9700\u8981\u5199\u529f\u80fd\u8bf4\u660e\uff0c\u51fd\u6570\u540d\u79f0\u8981\u6709\u5177\u4f53\u542b\u4e49\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#6","title":"6\u3001\u65b9\u6cd5\u7f16\u5199\u89c4\u8303","text":" \u65b9\u6cd5\u7c7b\u578b\uff1a if \u6ca1\u6709\u7528\u5230\u5b9e\u4f8b\u5bf9\u8c61\uff1a\nif \u6ca1\u6709\u7528\u5230\u7c7b\u5bf9\u8c61\uff1a\n\u5199\u9759\u6001\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @staticmethod\nelse\uff1a\n\u5199\u7c7b\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @classmethod\nelse:\n\u76f4\u63a5\u5199\u5b9e\u4f8b\u65b9\u6cd5\n \u4e3e\u4f8b: class TitleWidget:\ndef click_xxx_by_ui(self):\npass\n@staticmethod\ndef click_xxx_by_ui():\npass\n@classmethod\ndef click_xxx_by_ui(cls):\npass\n \u51fd\u6570\u540d\u79f0\u4e0d\u51fa\u73b0\u6570\u5b57\uff0c\u9700\u8981\u8868\u793a\u6570\u91cf\u7684\u7528\u5355\u8bcd\u8868\u793a\u3002 \u51fd\u6570\u529f\u80fd\u6ce8\u91ca\u3002 \u6ca1\u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg2:xxx\n\"\"\"\n \u6709\u53c2\u6570\uff0c\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg1:xxx\nreturn: xxx\n\"\"\"\n \u200b \u7528 Pycharm \u7684\u6ce8\u91ca\u6a21\u677f\u4e5f\u53ef\u4ee5\uff0c\u53ea\u8981\u4f53\u73b0\u4e86\u53c2\u6570\u7684\u7c7b\u578b\u548c\u8fd4\u56de\u5c31\u884c\u4e86\u3002 \u6682\u4e0d\u8981\u6c42\u5199\u7c7b\u578b\u6ce8\u89e3\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#7case","title":"7\u3001\u7528\u4f8b\uff08case\uff09\u89c4\u8303","text":" \u4ee5\u7c7b\u7684\u5f62\u5f0f\u5199\u7528\u4f8b\uff0c\u7528\u4f8b\u7c7b\u96c6\u6210\u7528\u4f8b\u57fa\u7c7b\u3002 \u7528\u4f8b\u7c7b\u9700\u8981\u5199\u6ce8\u91ca\u3002 \u6d4b\u8bd5\u7528\u4f8b\u51fd\u6570\u8bf4\u660e\uff08\u5efa\u8bae\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u540d\u79f0\uff09 \"\"\"\u53f3\u4fa7\u9884\u89c8-\u56fe\u7247\u7c7b\u578b\u4fe1\u606f\u680f\u57fa\u672c\u4fe1\u606f\"\"\"\n \u4e0d\u5199\u8c03\u8bd5\u4ee3\u7801 if __name__ == '__main__':\npytest.main()\n \u6240\u6709\u7528\u4f8b\u90fd\u7ee7\u627f BaseCase\u3002 BaseCase \u91cc\u9762\u653e\u4e00\u4e9b\u6d4b\u8bd5\u6570\u636e\u7684\u5e38\u91cf\uff0c\u6bd4\u5982\u6587\u4ef6\u540d\u79f0\uff0c\u5e94\u7528\u540d\u79f0\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u4e00\u4e9b\u901a\u7528\u7684\u5b57\u7b26\u4e32\u3002 \u8fd9\u7c7b\u662f\u5c5e\u4e8e\u6d4b\u8bd5\u6570\u636e\u3002 class BaseCase(DfmAssert):\n\"\"\"\u7528\u4f8b\u57fa\u7c7b\"\"\"\nNEW_FILE = \"\u65b0\u5efa\u6587\u672c.txt\"\nTEST_FILE = \"test.txt\"\nNEW_DIR = \"\u65b0\u5efa\u6587\u4ef6\u5939\"\nNEW_WORD = \"\u65b0\u5efaWord\u6587\u6863.doc\"\nAPP_HELP = \"damn\"\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\n\"\"\"\u7528\u4f8b\u6807\u9898\uff08\u590d\u5236PMS\u4e0a\u7528\u4f8b\u6807\u9898\uff09\"\"\"\ndfm = DfmWidget()\ndfm.click_xxx_by_attr(self.NEW_FILE)\ndfm.new_file_in_desktop_by_cmd(self.NEW_FILE)\nself.assert_true(dfm.get_process_status(self.APP_NAME))\n \u7528\u4f8b\u91cc\u9762\u5c3d\u91cf\u51cf\u5c11\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\uff0c\u66f4\u8981\u51cf\u5c11\u76f8\u540c\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\u3002 \u7edf\u4e00\u6587\u4ef6\u6ce8\u91ca\u5934\u3002 #!/usr/bin/env python3\n# _*_ coding:utf-8 _*_\n\"\"\"\n:Author:email@uniontech.com\n:Date :${DATE} ${TIME}\n\"\"\"\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#8","title":"8\u3001\u5176\u4ed6\u89c4\u8303","text":" \u65e5\u5fd7\u6253\u5370\u8981\u5728\u65b9\u6cd5\u6700\u524d\u9762\uff0c\u5426\u5219\u4ee3\u7801\u62a5\u9519\u6ca1\u6709\u65e5\u5fd7\u8f93\u51fa\uff0c\u4e0d\u597d\u5b9a\u4f4d\u95ee\u9898\u3002\uff08\u6211\u4eec\u4f1a\u8003\u8651\u7ee7\u7eed\u4f7f\u7528\u62e6\u622a\u5668\u6253\u5370\u65e5\u5fd7\uff09 \u6240\u6709\u7684\u64cd\u4f5c\u90fd\u9700\u8981\u6709\u65e5\u5fd7\uff0c\u5305\u62ec sleep()\uff0c\u6211\u4eec\u4f1a\u91cd\u5199\u4e00\u4e2a\u6709\u65e5\u5fd7\u8f93\u5165\u7684 sleep\u3002 \u4e1a\u52a1\u5c42\u65e5\u5fd7\u7ea7\u522b\u4e3a INFO\u3002 hook \u51fd\u6570\u53ea\u80fd\u5199\u5230\u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u91cc\u9762\u3002 apps \u76ee\u5f55\u4e0b\u7684 conftest.py \u539f\u5219\u4e0a\u4e0d\u4f1a\u65b0\u589e fixture\u3002 \u56fa\u5b9a\u76ee\u5f55\u6216\u5143\u7d20\u63a7\u4ef6\u7684\u64cd\u4f5c\uff0c\u5c06\u64cd\u4f5c\u65b9\u6cd5\u5199\u6b7b\uff0c\u6587\u4ef6\u7c7b\u64cd\u4f5c\u5c06\u6587\u4ef6\u540d\u7559\u53c2\u6570\u3002 \u8def\u5f84\u62fc\u63a5\u89c4\u8303\uff1a \u7cfb\u7edf\u4e2d\u56fa\u5b9a\u76ee\u5f55\uff0c\u8def\u5f84\u62fc\u63a5\u65f6\u4f7f\u7528\u6ce2\u6d6a\u7b26\u53f7\uff0c\u6bd4\u5982\uff1a~/Desktop/\uff0c\u4e0b\u5c42\u4f7f\u7528 os.path.expanduser()\uff0c\u5b83\u53ef\u4ee5\u81ea\u52a8\u8bc6\u522b\u6ce2\u6d6a\u7b26\u53f7\u3002 \u9879\u76ee\u4e0b\u8def\u5f84\u4f7f\u7528\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u8def\u5f84\uff0c\u6bd4\u5982\uff1aConfig.BASE_PATH\uff0c\u56e0\u4e3a\u9879\u76ee\u662f\u53ef\u4ee5\u5728\u4efb\u610f\u8def\u5f84\u8fd0\u884c\u7684\uff0c\u9700\u8981\u52a8\u6001\u62fc\u63a5\u8def\u5f84\u3002 "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848","text":"# =================================================\n# Author : Mikigo\n# Time : 2022/3/16\n# version \uff1a1.0\n# =================================================\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"AT \u5e94\u7528\u5e93\u6539\u9020\u662f\u57fa\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u8fdb\u884c\u7528\u4f8b\u65b9\u6cd5\u548c\u4e1a\u52a1\u903b\u8f91\u7684\u91cd\u65b0\u8bbe\u8ba1\uff0c\u4ee5\u5b9e\u73b0\u5e94\u7528\u5e93\u9ad8\u6548\u7684\u7f16\u5199\u3001\u7ef4\u62a4\u7528\u4f8b\u53ca\u5176\u65b9\u6cd5\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u6587\u4ef6\u7ba1\u7406\u5668\u4ece\u4e1a\u52a1\u590d\u6742\u5ea6\u548c\u7528\u4f8b\u91cf\u6765\u8bb2\uff0c\u5728\u7cfb\u7edf\u6240\u6709\u5e94\u7528\u4e2d\uff0c\u662f\u5f88\u6709\u4ee3\u8868\u6027\u7684\uff0c\u96be\u5ea6\u4e5f\u662f\u6700\u5927\u7684\uff0c\u56e0\u6b64\u6211\u4eec\u9009\u53d6\u6587\u4ef6\u7ba1\u7406\u5668\u4f5c\u4e3a\u5e94\u7528\u5e93\u6539\u9020\u7684\u5b9e\u9a8c\u5e94\u7528\uff0c\u7ed9\u540e\u7eed\u5176\u4ed6\u5e94\u7528\u6539\u9020\u63d0\u4f9b\u5207\u5b9e\u53ef\u884c\u7684\u601d\u8def\u548c\u65b9\u6848\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u5206\u5c42\u8bbe\u8ba1\u56fe","text":"\u6574\u4f53\u4ecd\u7136\u9075\u5faa PO \u8bbe\u8ba1\u7406\u5ff5\uff0c\u6839\u636e\u4e1a\u52a1\u9700\u8981\uff0c\u5c06\u6587\u7ba1\u4e1a\u52a1\u5c42\u8fdb\u884c 3 \u5c42\u5212\u5206\uff1a "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-dde-file-manager # \u5e94\u7528\u4ed3\u5e93\n\u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 test_xxx_001.py\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u00a0\u251c\u2500\u2500 __init__.py\n\u2502 \u00a0\u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u00a0\u251c\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u00a0\u251c\u2500\u2500 base_widget.py # \u65b9\u6cd5\u57fa\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 title_widget.py # title \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 right_view_widget.py # right view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 left_view_widget.py # left view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 pop_widget.py # pop \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 dfm_widget.py # \u65b9\u6cd5\u7684\u7edf\u4e00\u51fa\u53e3\n\u2502 \u00a0\u2514\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 tag # \u7528\u4f8b\u6807\u7b7e\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 xxx.csv # \u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2514\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u57fa\u7c7b","text":" \u7ee7\u627f\u6838\u5fc3\u5c42\u7684\u5404\u4e2a\u6a21\u5757\u7c7b\u3002 \u62bd\u53d6\u64cd\u4f5c\u5c42\u7684\u4e00\u4e9b\u57fa\u7840\u65b9\u6cd5\u3002 \u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u7684\u4e00\u4e9b\u516c\u5171\u65b9\u6cd5\u3002 \u8def\u5f84\u7ec4\u88c5\u65b9\u6cd5\u3002 \u4e00\u4e9b\u4e1a\u52a1\u5c42\u76f8\u5173\u7684\u53d8\u91cf\u3001\u5e38\u91cf\u3001shell\u547d\u4ee4\u3001\u5750\u6807\u3002 \u65b9\u6cd5\u57fa\u7c7b\u7684\u5199\u6cd5\uff1a from src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u64cd\u4f5c\u5c42","text":" \u6a21\u5757\u5212\u5206 \u6309\u7167\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u6587\u7ba1\u4e3b\u754c\u9762\u5206\u4e3a\u4e09\u4e2a\u533a\u57df\uff1a\u6807\u9898\u680f\u3001\u53f3\u8fb9\u89c6\u56fe\u533a\u57df\u3001\u5de6\u8fb9\u89c6\u56fe\u533a\u57df \u5f39\u7a97\uff1a\u8bbe\u7f6e\u754c\u9762\u5f39\u7a97\u3001\u4fdd\u9669\u7bb1\u5f39\u7a97\u3001\u5220\u9664\u786e\u8ba4\u5f39\u7a97\u3001\u53ca\u5404\u79cd\u7f51\u7edc\u5f39\u7a97 \u53f3\u952e\u83dc\u5355\uff1a\u6682\u65f6\u4e0d\u8003\u8651\u4e3a\u5355\u72ec\u7684\u6a21\u5757\uff0c\u8003\u8651\u4ee5\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6848\u505a\u6210\u516c\u5171\u5e93\u3002 \u5404\u4e2a\u6a21\u5757\u53ea\u7ee7\u627f\u57fa\u7c7b from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u6784\u9020\u51fd\u6570\u91cc\u9762\u4e0d\u6784\u9020\u5bf9\u8c61\uff0c\u53ef\u4ee5\u521d\u59cb\u5316\u4e00\u4e9b\u53d8\u91cf\u3002 \u4e0d\u540c\u7684\u5b9a\u4f4d\u65b9\u6848\u8c03\u7528\u4e0d\u540c\u7684\u5b9a\u4f4d\u5de5\u5177\u5bf9\u8c61\u3002 self.dog\nself.ui\nself.d_bus\n \u65b9\u6cd5\u7f16\u5199 \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u5e94\u7528\u5c42","text":" \u7ee7\u627f\u64cd\u4f5c\u5c42\u7684\u6240\u6709\u7c7b\u3002 \u4ec5\u4ec5\u7528\u4e8e\u7528\u4f8b\u4e2d\u5bfc\u5165\u65b9\u4fbf\uff0c\u4e0d\u505a\u5176\u4ed6\u4e8b\u60c5\u3002 class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n DfmAssert \u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u7ee7\u627f\uff0c\u65b9\u4fbf\u4f7f\u7528\u65ad\u8a00\u8bed\u53e5\u3002 from apps.dde_file_manager.widget.dfm_widget import DfmWidget\nfrom public.assert import Assert\nclass DfmAssert(Assert):\ndef assert_file_exists_in_desktop(self, file_name):\nself.assert_file_exists(f\"~/Desktop{file_name}\")\n...\nDfmWidget().get_file_in_desktop()\n \u7528\u4f8b\u91cc\u9762\u76f4\u63a5\u7ee7\u627f\uff0c\u65b9\u4fbf\u5728\u7528\u4f8b\u91cc\u9762\u4f7f\u7528 self \u8fdb\u884c\u65ad\u8a00\uff0c\u66f4\u7b26\u5408\u65ad\u8a00\u7684\u4f7f\u7528\u4e60\u60ef\uff0c\u7528\u4f8b\u903b\u8f91\u4e0a\u66f4\u6e05\u695a\u3002 class BaseCase(DfmAssert):\npass\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\nself.assert_file_exists_in_desktop(\"xxx\")\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u903b\u8f91\u4e3e\u4f8b","text":"\u7528\u4f8b\u4ee3\u7801\u8c03\u7528\u903b\u8f91\u4e3e\u4f8b\uff1a # BaseWidget\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n# =============================================\n# TitleWidget\nclass TitleWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_title_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# RightViewWidget\nclass RightViewWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_right_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# =============================================\n# \u51fa\u53e3 DfmWidget\nclass DfmWidget(TitleWidget, RightViewWidget):\npass\n# =============================================\n# in case\nfrom apps.dde_file_manager.widget.dfm_widget import DfmWidget\ndfm = DfmWidget()\ndfm.click_xxx_title_by_ui()\ndfm.click_xxx_right_by_ui()\ndfm.dog.print_desc()\ndfm.ui.print_number()\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u5de5\u7a0b\u6539\u9020\u5b9e\u65bd\u6b65\u9aa4","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_2","title":"1\u3001\u5de5\u7a0b\u4ee3\u7801\u62c9\u53d6","text":"1.1. \u5c06\u81ea\u52a8\u5316\u57fa\u7840\u6846\u67b6\u7684\u529f\u80fd\u62c9\u5230\u672c\u5730 Autotest Basic Frame \uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame 1.2. \u5c06\u5e94\u7528\u5e93\u4ee3\u7801\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u5e94\u7528\u5e93\u7684\u4ed3\u5e93\u547d\u540d\u5e94\u8be5\u662f\u957f\u8fd9\u6837\u7684 autotest_deepin_xxx\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_2","title":"2\u3001\u8c03\u6574\u5de5\u7a0b\u76ee\u5f55","text":"\u6309\u7167 \u65b9\u6848\u8bbe\u8ba1-\u76ee\u5f55\u7ed3\u6784 \u8fdb\u884c\u76ee\u5f55\u8c03\u6574\uff0c\u5c3d\u91cf\u4f7f\u7528\u7f16\u8f91\u5668\u8fdb\u884c\u76f8\u5e94\u7684\u8c03\u6574\uff0c\u7f16\u8f91\u5668\u63a8\u8350\u4f7f\u7528 Pycharm \uff0c\u4ee5\u4e0b\u64cd\u4f5c\u5747\u5728 Pycharm \u91cc\u9762\u53ef\u5b9e\u73b0\u3002 2.1. \u9700\u8981\u79fb\u52a8 py \u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u76f4\u63a5\u5728\u7f16\u8f91\u5668\u91cc\u9762\uff0c\u4f7f\u7528\u9f20\u6807\u9009\u4e2d\u5e76\u6309\u4f4f\uff0c\u4e4b\u540e\u62d6\u52a8\u5230\u76ee\u6807\u4f4d\u7f6e\u5373\u53ef\uff0cPycharm \u4f1a\u5c3d\u53ef\u80fd\u7684\u81ea\u52a8\u89e3\u51b3\u79fb\u52a8\u5bfc\u81f4\u7684\u8def\u5f84\u95ee\u9898\u3002\u6ce8\u610f\uff0c\u6211\u8bf4\u7684\u662f\u201c\u5c3d\u53ef\u80fd\u201d\uff0c\u6709\u4e9b\u9a9a\u64cd\u4f5c\u7f16\u8f91\u5668\u662f\u65e0\u6cd5\u81ea\u52a8\u5904\u7406\u7684\u3002\u5982\u679c\u6ca1\u6709\u88ab\u7f16\u8f91\u5668\u81ea\u52a8\u5904\u7406\u7684\u8def\u5f84\u95ee\u9898\uff0c\u540e\u7eed\u53ea\u80fd\u624b\u52a8\u89e3\u51b3\u3002 2.2. \u9700\u8981\u91cd\u547d\u540d\u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u5728\u7f16\u8f91\u5668\u91cc\u9762\u9009\u4e2d\u6587\u4ef6\uff0c\u7136\u540e\u4f7f\u7528\u5feb\u6377\u952e Shift + F6 \uff08\u5982\u679c\u5feb\u6377\u952e\u6ca1\u53cd\u5e94\uff0c\u6587\u4ef6\u53f3\u952e\u83dc\u5355 Refactor \u2014\u2014 Rename\uff09\uff0c\u7136\u540e\u5728\u8f93\u5165\u6846\u4e2d\u8f93\u5165\u8981\u91cd\u547d\u540d\u7684\u540d\u79f0\uff0c\u540c\u65f6\uff0c\u786e\u8ba4\u52fe\u9009 Search for references \u548c Search in comments and strings \u8fd9\u4e24\u4e2a\u9009\u9879\uff0c\u6700\u540e\u6309\u56de\u8f66\u6216\u8005\u9f20\u6807\u70b9 Refactor \u3002 \u6ce8\u610f\uff0c\u6b64\u65f6\u7f16\u8f91\u5668\u53ef\u80fd\u4f1a\u63d0\u793a\u4f60\uff0c\u4f60\u8fd9\u4e2a\u91cd\u547d\u540d\u7684\u64cd\u4f5c\u5173\u8054\u4e86\u591a\u4e2a\u6a21\u5757\uff0c\u5b83\u88ab\u591a\u4e2a\u5730\u65b9\u90fd\u4f7f\u7528\u5230\u4e86\uff0c\u76f8\u5173\u7684\u6a21\u5757\u662f\u5426\u4e5f\u4e00\u8d77\u6539\u540d\u4e86\uff0c\u8fd9\u4e0d\u5e9f\u8bdd\u5417\uff0c\u7528\u8fd9\u4e2a\u529f\u80fd\u5c31\u662f\u60f3\u628a\u5173\u8054\u5230\u7684\u90fd\u4fee\u6539\uff0c\u4e0d\u7136\u6211\u4e3a\u4ec0\u4e48\u4e0d\u7528\u6587\u7ba1\u7684\u91cd\u547d\u540d\u529f\u80fd\u5462\uff0c\u522b\u60f3\u4e86\uff0c\u76f4\u63a5\u70b9\u5de6\u4e0b\u89d2\u7684 Refactor \u6309\u94ae\uff0c\u5c31\u662f\u5e72\u3002 \u7c7b\u540d\u3001\u51fd\u6570\u540d\u7684\u91cd\u547d\u540d\u90fd\u5c3d\u91cf\u91c7\u7528\u8fd9\u79cd\u65b9\u6848\uff0c\u56e0\u4e3a\u7f16\u8f91\u5668\u4f1a\u81ea\u52a8\u7ed9\u6211\u4eec\u627e\u5230\u5173\u8054\u7684\u5730\u65b9\uff0c\u7136\u540e\u540c\u6b65\u4fee\u6539\u6389\u3002\u4f60\u53ef\u5343\u4e07\u522b\u76f4\u63a5\u5220\u4e86\u4fee\u6539\u540d\u79f0\uff0c\u4e0d\u7136\u4f60\u53ef\u80fd\u4f1a\u82b1\u4e0a\u4e00\u5929\u7684\u65f6\u95f4\u6765\u89e3\u51b3\u91cd\u547d\u540d\u7684\u95ee\u9898\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u5b9e\u73b0\u6838\u5fc3\u5e93\u63a5\u53e3","text":"3.1. BaseWidget \u5728 BaseWidget \u91cc\u9762\u628a\u8be5\u5199\u7684\u90fd\u5199\u597d\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u4e0a\u9762\u7684\u8bbe\u8ba1\u7406\u5ff5\u6765\u5199\u3002 \u5982\u679c\u4f60\u5acc\u9ebb\u70e6\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u6587\u7ba1\u7684\u5b9e\u9645\u5de5\u7a0b\u4ee3\u7801 autotest_dde_file_manager : https://gerrit.uniontech.com/admin/repos/autotest_dde_file_manager \u3002 3.2. \u64cd\u4f5c\u5c42 \u5982\u679c\u4f60\u662f\u65b0\u5199\u9879\u76ee\uff0c\u4f60\u4f1a\u53d1\u73b0\u4e00\u5207\u90fd\u662f\u90a3\u4e48\u7684\u7b80\u5355\u3001\u76f4\u63a5\uff0c\u6309\u7167\u6211\u4eec\u63d0\u4f9b\u7ed9\u4f60\u7684\u63a5\u53e3\u5199\u7528\u4f8b\u7684\u64cd\u4f5c\u65b9\u6cd5\u5c31\u597d\u4e86\u3002 \u5982\u679c\u4f60\u662f\u60f3\u5bf9\u539f\u6765\u7684\u5de5\u7a0b\u8fdb\u884c\u6539\u9020\uff0c\u4f60\u9700\u8981\u6309\u7167\u6838\u5fc3\u5e93\u65b9\u6cd5\u7684\u8c03\u7528\uff0c\u5c06\u4f60\u4e4b\u524d\u5199\u7684\u6bcf\u4e2a\u65b9\u6848\u8fdb\u884c\u5bf9\u5e94\u7684\u4fee\u6539\uff0c\u5305\u62ec\u7c7b\u548c\u65b9\u6cd5\u7684\u547d\u540d\u3001\u65b9\u6cd5\u5185\u6240\u8981\u7528\u5230\u4e0d\u540c\u5b9a\u4f4d\u65b9\u6cd5\u7684\u5199\u6cd5\u4fee\u6539\u3002 \u8fd9\u65f6\u5019\u4f60\u53ef\u80fd\u4f60\u7684\u4ee3\u7801\u4e2d\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u62a5\u9519\uff0c\u4e0d\u7528\u62c5\u5fc3\uff0c\u4f60\u53ef\u4ee5\u4ece\u4e1a\u52a1\u903b\u8f91\u51fa\u53d1\uff0c\u60f3\u6e05\u695a\u8fd9\u4e2a\u65b9\u6cd5\u662f\u5e72\u4ec0\u4e48\u7684\u3001\u64cd\u4f5c\u7684\u5bf9\u8c61\u662f\u4ec0\u4e48\u3001\u53c2\u6570\u662f\u4ec0\u4e48\uff0c\u6ce8\u610f\u8fd9\u4e9b\u4fee\u6539\u662f\u4f1a\u5f71\u54cd\u5230\u7528\u4f8b\u4ee3\u7801\u91cc\u9762\u7684\uff0c\u6ca1\u5173\u7cfb\uff0c\u7528\u4f8b\u91cc\u9762\u672c\u6765\u4e5f\u5e94\u8be5\u88ab\u5173\u8054\u4fee\u6539\u3002 3.3. \u628a\u914d\u7f6e\u6a21\u5757\u5199\u597d\uff0c\u8fd9\u90e8\u5206\u57fa\u672c\u53ef\u4ee5\u590d\u5236\u6587\u7ba1\u7684\u4ee3\u7801\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4_1","title":"4\u3001\u8def\u5f84\u5904\u7406","text":"4.1. \u5bfc\u5165\u8def\u5f84 \u65b9\u6cd5\u548c\u7528\u4f8b\u4e2d\u90fd\u4f1a\u6d89\u53ca\u5230\u5bfc\u5165\u8def\u5f84\u7684\u4fee\u6539\uff0c\u5728\u4fee\u6539\u8def\u5f84\u65f6\uff0c\u5efa\u8bae\u4f60\u4f7f\u7528 Ctrl + Shift + R \u5168\u5c40\u66ff\u6362\uff0c\u4f1a\u5c06\u6574\u4e2a\u9879\u76ee\u4e0b\u7684\u76f8\u540c\u5730\u65b9\u90fd\u4fee\u6539\u5230\uff0c\u5f53\u7136\uff0c\u4f60\u4e5f\u53ef\u4ee5\u5728\u5c0f\u5f39\u7a97\u4e2d\u4fee\u6539\u5168\u5c40\u66ff\u6362\u4e3a\u5c40\u90e8\u76ee\u5f55\u4e0b\u66ff\u6362\u3002\u5904\u7406\u90a3\u79cd\u6ca1\u6709\u5173\u8054\u5173\u7cfb\uff0c\u4f46\u662f\u53c8\u662f\u76f8\u540c\u540d\u79f0\u7684\u91cd\u547d\u540d\uff0c\u6211\u4e5f\u63a8\u8350\u4f7f\u7528\u8fd9\u79cd\u65b9\u5f0f\u8fdb\u884c\u91cd\u547d\u540d\u3002 \u6ce8\u610f\uff0c\u5168\u5c40\u66ff\u6362\u7684\u65b9\u5f0f\u4efb\u7136\u65e0\u6cd5\u4fdd\u8bc1\u771f\u7684\u5168\u5c40\u88ab\u66ff\u6362\u4e86\uff08\u53ef\u80fd\u662f\u7f16\u8f91\u5668\u7684 Bug \u5427\uff09\uff0c\u6240\u4ee5\u4f60\u4ecd\u7136\u9700\u8981\u624b\u52a8\u770b\u4e0b\u5404\u5904\u662f\u5426\u4fee\u6539\u5230\u4f4d\u3002 4.2. \u8d44\u6e90\u8def\u5f84 \u4e00\u4e9b\u7528\u4f8b\u8d44\u6e90\u9700\u8981\u6839\u636e config.py \u91cc\u9762\u7684\u8def\u5f84\u914d\u7f6e\u8fdb\u884c\u8d44\u6e90\u8def\u5f84\u7684\u62fc\u63a5\uff0c\u5982\u679c\u4f60\u539f\u6765\u672c\u6765\u5c31\u6709\u4e00\u4e2a\u51fd\u6570\u4e13\u95e8\u7528\u4e8e\u7ec4\u88c5\u8def\u5f84\u7684\uff0c\u90a3\u4f60\u53ea\u9700\u8981\u4fee\u6539\u8fd9\u4e00\u4e2a\u5730\u65b9\u5c31\u597d\u4e86\uff0c\u5982\u679c\u4f60\u4e4b\u524d\u5e76\u6ca1\u6709\u8fd9\u6837\u7684\u8bbe\u8ba1\uff0c\u90a3\u53ef\u80fd\u9700\u8981\u4fee\u6539\u5927\u91cf\u6d89\u53ca\u5230\u8d44\u6e90\u8def\u5f84\u7684\u5730\u65b9\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5","title":"5\u3001\u8c03\u8bd5\u548c\u7f16\u5199\u7528\u4f8b","text":"\u4ee5\u4e0a\u51e0\u4e2a\u6b65\u9aa4\u505a\u5b8c\uff0c\u57fa\u672c\u5c31\u53ef\u4ee5\u8fdb\u884c\u7528\u4f8b\u4ee3\u7801\u7684\u8c03\u8bd5\u4e86\uff0c\u8fd9\u90e8\u5206\u5de5\u4f5c\u4e3b\u8981\u89e3\u51b3\u4f60\u4e4b\u524d\u51e0\u4e2a\u6b65\u9aa4\u9057\u6f0f\u7684\u95ee\u9898\uff0c\u5982\u679c\u6240\u6709\u7528\u4f8b\u90fd\u8c03\u8bd5\u901a\u8fc7\u4e86\uff0c\u90a3\u4e48\u5de5\u7a0b\u6539\u9020\u5c31\u5168\u90e8\u5b8c\u6210\u4e86\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/","title":"AT \u5f00\u53d1\u89c4\u8303","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u5f00\u53d1\u89c4\u8303\u662f\u6839\u636e\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fd0\u884c\u4e24\u5e74\u591a\u6765\uff0c\u9047\u5230\u95ee\u9898\u89e3\u51b3\u95ee\u9898\u800c\u5f62\u6210\u7684\u4e00\u4e9b\u89e3\u51b3\u65b9\u6848\uff0c\u6216\u8005\u8bf4\u7ecf\u9a8c\u603b\u7ed3\uff1b\u8fd9\u4e9b\u7ecf\u9a8c\u7b26\u5408\u6211\u4eec\u73b0\u9636\u6bb5 AT \u6240\u5e94\u7528\u7684\u573a\u666f\u9700\u8981\uff0c\u4e5f\u662f\u6211\u4eec\u7ecf\u8fc7\u957f\u671f\u601d\u8003\uff0c\u4e0d\u65ad\u8bd5\u9519\u4e0d\u65ad\u4fee\u6b63\uff0c\u5e76\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u5b9e\u8df5\u4e2d\u68c0\u9a8c\u8fc7\u53ef\u884c\u7684\u3002\u4ee5\u6b64\uff0c\u5e0c\u671b\u80fd\u5e2e\u52a9\u53c2\u4e0e\u5230\u81ea\u52a8\u5316\u7684\u76f8\u5173\u4eba\u5458\u51cf\u5c11\u8bd5\u9519\u6210\u672c\uff0c\u66f4\u597d\u3001\u66f4\u5feb\u7684\u7f16\u5199\u7528\u4f8b\u53ca\u7ef4\u62a4\u7528\u4f8b\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_1","title":"\u4e00\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u89c4\u8303","text":"\u6807\u7b7e\u5316\u7ba1\u7406\u6587\u6863\u8bf7\u53c2\u8003\uff1a \u300a\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u64cd\u4f5c\u6307\u5f15\u300b \u4ee5\u4e0b\u8bf4\u51e0\u4e2a\u5bb9\u6613\u51fa\u73b0\u7684\u95ee\u9898\uff1a"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1","title":"1. \u5bf9\u5e94\u5173\u7cfb","text":" \u5199\u5b8c\u81ea\u52a8\u5316\u7528\u4f8b\u4e4b\u540e\uff0c\u8bf7\u5728 CSV \u6587\u4ef6\u4e2d\u6807\u8bb0\u7528\u4f8b\u7684 ID\u3001\u7b49\u7ea7\u3002\u4e3a\u4e86\u63d0\u9192\u6807\u8bb0\uff0c\u6267\u884c\u7528\u4f8b\u65f6\u5728\u9996\u884c\u4f1a\u8f93\u51fa ERROR \u65e5\u5fd7\uff1a CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94\u7684 ID\uff1b \u5728\u6700\u7ec8\u63d0\u4ea4\u4ee3\u7801\u4e4b\u524d\uff0c\u4f60\u9700\u8981\u5728 CSV \u6587\u4ef6\u91cc\u9762\u5c06ID\u3001\u7528\u4f8b\u7b49\u7ea7\u7b49\u6807\u7b7e\u8865\u5168\uff0c\u5982\u679c CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94 ID\uff0c\u540e\u7eed\u5728\u6279\u91cf\u6267\u884c\u7684\u65f6\u5019\uff0c\u8fd9\u4e9b\u7528\u4f8b\u662f\u4e0d\u4f1a\u6267\u884c\u7684\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2","title":"2. \u540d\u79f0\u4e00\u81f4","text":" CSV \u6587\u4ef6\u7684\u6587\u4ef6\u540d\u3001\u7528\u4f8b\u51fd\u6570\u4e2d\u95f4\u7684\u540d\u79f0\u4e00\u81f4\u3001\u7528\u4f8b py \u6587\u4ef6\u4e2d\u95f4\u7684\u540d\u79f0\uff0c\u8fd9\u4e09\u4e2a\u540d\u79f0\u4e00\u81f4\u3002 \u4e3e\u4f8b\uff1a # test_music_001.py\ndef test_music_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u90a3\u4e48 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e3a music.csv\u3002 AT \u6846\u67b6\u5e95\u5c42\u4ee3\u7801\u5b9e\u73b0\u662f\u5c06 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e0e\u7528\u4f8b\u51fd\u6570\u540d\u79f0\u540d\u79f0\uff08item.name\uff09\u8fdb\u884c\u5bf9\u5e94\uff0c\u56e0\u6b64\uff0c\u6ce8\u610f CSV \u6587\u4ef6\u540d\u79f0\u5bf9\u5e94\u7684\u662f\u7528\u4f8b\u51fd\u6570\u540d\u79f0\uff0c\u5373 def test_music_001 \u91cc\u9762\u7684 music \uff0c\u800c\u4e0d\u662f test_music_001.py \u91cc\u9762\u7684 music \u3002 \u8fd9\u91cc\u7ec6\u7ec6\u54c1\u4e00\u4e0b\u54c8~ \u5982\u679c\u4f60\u5c06\u4e0a\u4f8b\u5199\u6210\u4e86\u8fd9\u6837: # test_music_001.py\ndef test_movie_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u7528\u4f8b\u6267\u884c\u6ca1\u95ee\u9898\uff0c\u4f46\u662f\u6807\u7b7e\u5316\u7ba1\u7406\u662f\u4e0d\u751f\u6548\u7684\uff0c\u6846\u67b6\u65e0\u6cd5\u5c06 music.csv\u6587\u4ef6\u91cc\u9762\u6807\u7b7e\uff0c\u6dfb\u52a0\u5230 test_movie_001\u8fd9\u4e2a\u7528\u4f8b\u4e2d\uff0c\u56e0\u4e3a\u4ed6\u4eec\u6ca1\u6709\u5bf9\u5e94\u5173\u7cfb\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#tag","title":"\u4e8c\u3001\u5206\u652f\u53ca tag \u7ba1\u7406\u89c4\u8303","text":"\u53c2\u8003\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u4ee3\u7801\u7ba1\u7406\u89c4\u8303\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2-tag","title":"2. \u5e94\u7528\u5e93 tag","text":" \u5e94\u7528\u5e93 tag \u6839\u636e\u5e94\u7528\u4ea4\u4ed8\u8282\u70b9\u751f\u6210\uff0c\u6bcf\u6b21\u6253 tag \u4e4b\u524d\uff0c\u76f8\u5173\u6d4b\u8bd5\u4eba\u5458\u9700\u8981\u8fdb\u884c\u7528\u4f8b\u8c03\u8bd5\uff1b \u8c03\u8bd5\u7528\u4f8b\u662f\u6307\u7684\u5728\u5168\u67b6\u6784\uff08x86\u3001arm\u3001mips\uff09\u4e0a\u8c03\u8bd5\u901a\u8fc7\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\u8fbe\u5230 90% \u4ee5\u4e0a\u624d\u80fd\u6253 tag\uff0c\u901a\u8fc7 Jenkins \u6267\u884c\u5668\u6267\u884c\u7528\u4f8b\uff0c\u4fdd\u7559\u901a\u8fc7\u7387\u7ed3\u679c\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\uff1a\u901a\u8fc7\u7528\u4f8b\u6570 / (\u603b\u7528\u4f8b\u6570 - \u5df2\u5e9f\u5f03\u7528\u4f8b) \u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u7b97\u901a\u8fc7 Jenkins \u6267\u884c\u5668 \u4f60\u53ef\u80fd\u4f1a\u5728\u4e00\u4e2a\u4ea4\u4ed8\u5468\u671f\u5185\u6301\u7eed\u7684\u8fdb\u884cAT\u7528\u4f8b\u8c03\u8bd5\uff0c\u4f46\u662f\u6700\u7ec8 AT \u7528\u4f8b\u6253 tag \u7684\u5e94\u7528\u7248\u672c\uff0c\u9700\u8981\u4f7f\u7528\u5e94\u7528\u96c6\u6210\u4ea4\u4ed8\u7684\u6700\u65b0\u5e94\u7528\u7248\u672c\uff0c\u53ef\u4ee5\u4f7f\u7528\u5e94\u7528\u7684\u63d0\u6d4b\u7248\u672c\uff1b\u4e00\u5b9a\u8981\u786e\u4fdd\u8c03\u8bd5\u7528\u4f8b\u7684\u5e94\u7528\u7248\u672c\u662f\u6700\u65b0\u7684\uff0c\u4e0d\u7136\u96c6\u6210\u8fdb\u53bb\u4e4b\u540e\uff0c\u6301\u7eed\u96c6\u6210\u5c31\u4f1a\u51fa\u95ee\u9898\uff1b tag \u53f7\u600e\u4e48\u6253\uff1f \u6839\u636e\u6301\u7eed\u96c6\u6210\u7684\u8981\u6c42\u751f\u6210\uff0c\u5176\u4e2d\u5e94\u7528\u7248\u672c\u53f7\u9700\u8981\u4e0e\u9879\u76ee\u7ecf\u7406\u786e\u8ba4\u672c\u6b21\u5373\u5c06\u96c6\u6210\u7684\u5e94\u7528\u7248\u672c\u53f7\u662f\u591a\u5c11\uff1b tag \u7684 commit \u4fe1\u606f\u683c\u5f0f\uff1a # commit msg\nversion:5.6.5\n \u5176\u4e2d 5.6.5 \u5199\u5e94\u7528\u7684\u96c6\u6210\u7248\u672c\u53f7\u3002 \u751f\u6210 tag \u7684\u547d\u4ee4\u53c2\u8003\uff1a\u300aGit \u6807\u7b7e\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3-tag","title":"3. \u57fa\u7840\u6846\u67b6 tag","text":"\u57fa\u7840\u6846\u67b6 tag \u4e0d\u4e0e\u4e1a\u52a1\u6302\u94a9\uff0c\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u6309\u9700\u53d1\u5e03\u7248\u672c\uff0c\u5728\u6839\u76ee\u5f55\u4e0b CURRENT \u6587\u4ef6\u4e2d\u8bb0\u5f55\u7684\u5f53\u524d\u7248\u672c\u53f7\u548c\u5386\u53f2\u7248\u672c\u53f7\uff0c\u53ca\u5176\u5bf9\u5e94\u65b0\u589e\u4e86\u54ea\u4e9b\u529f\u80fd\uff0c\u6709\u52a9\u4e8e\u5e94\u7528\u9009\u62e9\u5408\u9002\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\u3002 # CURRENT\n[current]\ntag = 0.9.5\n \u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u7684 control \u6587\u4ef6\u8bb0\u5f55\u5f53\u524d\u5e94\u7528\u5e93\u4f9d\u8d56\u7684\u57fa\u7840\u5e93\u7248\u672c\u3002 # control\n[Depends]\nautotest-basic-frame = 0.9.5\n \u7528\u4f8b\u5728\u6267\u884c\u65f6\u4f1a\u6821\u9a8c\u4e24\u4e2a\u6587\u4ef6\u7684\u7248\u672c\u53f7\u662f\u5426\u4e00\u81f4\uff0c\u5982\u679c\u4e0d\u4e00\u81f4\uff0c\u4f1a\u6253\u5370 error \u65e5\u5fd7\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_2","title":"\u4e09\u3001\u4ed3\u5e93\u6743\u9650\u7ba1\u7406","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_1","title":"1. \u57fa\u7840\u6846\u67b6","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u4ed3\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame \u57fa\u7840\u6846\u67b6\u4e0d\u5141\u8bb8\u533f\u540d\u8bbf\u95ee\uff0c\u5982\u679c\u4f60\u767b\u5f55 gerrit \u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u8bbf\u95ee\u4ee5\u4e0a\u94fe\u63a5\uff0c\u5219\u9700\u8981\u7533\u8bf7\u8bbf\u95ee\u6743\u9650\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_1","title":"2. \u5e94\u7528\u4ed3\u5e93","text":" \u81ea\u52a8\u5316\u5e94\u7528\u4ed3\u5e93\uff1a https://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684 app_name \u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_3","title":"\u56db\u3001\u65b9\u6cd5\u7f16\u5199&\u8c03\u7528\u89c4\u8303","text":"\u65b9\u6cd5\u7f16\u5199\u6574\u4f53\u8bbe\u8ba1\u601d\u8def\u53c2\u8003\uff1a[\u300aAT\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b]"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_2","title":"1. \u65b9\u6cd5\u7f16\u5199","text":"\u5199\u65b9\u6cd5\u7684\u65f6\u5019\u6ce8\u610f\u65b9\u6cd5\u5f52\u5c5e\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget\uff0c\u65b9\u6cd5\u662f\u5728\u54ea\u4e2a\u533a\u57df\u64cd\u4f5c\u7684\uff0c\u5c31\u5199\u5728\u54ea\u4e2a\u7c7b\u91cc\u9762\u3002 \u4e3e\u4f8b\uff1a from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n\"\"\"\u70b9\u51fb\u6807\u9898\u680fxxx\"\"\"\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_2","title":"2. \u65b9\u6cd5\u8c03\u7528","text":" \u5728\u7528\u4f8b\u4e2d\u8c03\u7528\u65b9\u6cd5\uff0c\u901a\u8fc7\u8be5\u5e94\u7528\u552f\u4e00\u7684\u51fa\u53e3\u8fdb\u884c\u8c03\u7528\uff0c\u6bd4\u5982\u6587\u7ba1\uff1a class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n \u4e0d\u8981\u5728\u7528\u4f8b\u4e2d\u5355\u72ec\u53bb\u8c03\u7528 TitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u8fd9\u4e9b\u7c7b\uff0c\u5426\u5219\u540e\u671f\u7528\u4f8b\u4f1a\u53d8\u5f97\u4e0d\u597d\u7ef4\u62a4\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_4","title":"\u4e94\u3001\u7528\u4f8b\u7f16\u5199\u89c4\u8303","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_3","title":"1. \u57fa\u4e8e\u7c7b\u5199\u7528\u4f8b","text":"\u6240\u6709\u7528\u4f8b\u90fd\u5e94\u8be5\u57fa\u4e8e\u7c7b\u53bb\u5199\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001(self):\n\"\"\"\u97f3\u4e50\u542f\u52a8\"\"\"\n \u6ce8\u610f\u4ee5\u4e0b\u51e0\u70b9\uff1a \u7c7b\u540d\u4e0d\u8981\u968f\u4fbf\u53d6\uff0c\u540c\u4e00\u4e2a\u5e94\u7528\u5e94\u8be5\u4f7f\u7528\u540c\u4e00\u4e2a\u7c7b\u540d\uff0c\u7528\u4f8b\u7c7b\u540d\u79f0\u5fc5\u987b\u4ee5 Test \u5f00\u5934\uff0c\u9075\u5faa\u5927\u9a7c\u5cf0\u547d\u540d\u89c4\u8303\uff1b \u7528\u4f8b\u7c7b\u7ee7\u627f BaseCase\uff0c\u4e00\u4e2a\u5e94\u7528\u53ea\u6709\u4e00\u4e2a BaseCase \u4e00\u4e2a py \u6587\u4ef6\u91cc\u9762\u53ea\u6709\u4e00\u4e2a\u7c7b\uff0c\u6211\u4eec\u79f0\u4e3a\u4e00\u4e2a\u6d4b\u8bd5\u7c7b\uff1b \u4e00\u4e2a\u7c7b\u91cc\u9762\u53ef\u4ee5\u6709\u591a\u4e2a\u7528\u4f8b\u51fd\u6570\uff0c\u8fd9\u53d6\u51b3\u8fd9\u6761\u7528\u4f8b\u6709\u591a\u5c11\u4e2a\u6d4b\u8bd5\u70b9\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001_1(self):\n\"\"\"\u4efb\u52a1\u680f\u542f\u52a8\u97f3\u4e50\"\"\"\ndef test_music_001_2(self):\n\"\"\"\u542f\u52a8\u5668\u542f\u52a8\u97f3\u4e50\"\"\" \ndef test_music_001_3(self):\n\"\"\"\u684c\u9762\u542f\u52a8\u97f3\u4e50\"\"\"\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_3","title":"2. \u7528\u4f8b\u51fd\u6570\u89c4\u8303","text":" \u7528\u4f8b\u51fd\u6570\u4ee5 test \u5f00\u5934\uff0c\u9075\u5faa\u86c7\u5f62\u547d\u540d\u89c4\u8303\uff0c\u4e2d\u95f4\u4e3a\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0\uff0c\u540e\u9762\u52a0\u7528\u4f8b ID\uff0c\u6700\u540e\u52a0\u6d4b\u8bd5\u70b9\u5e8f\u53f7\uff0c\u5373 test_${module}_${case_id}[_${index}] \uff1b \u6bd4\u5982\uff1atest_music_001_1\uff0cindex \u4ece 1 \u5f00\u59cb\u3002 \u51fd\u6570\u529f\u80fd\u8bf4\u660e\u91cc\u9762\u5199\u7528\u4f8b\u6807\u9898\uff0c\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u6807\u9898\u5373\u53ef\uff0c\u6ce8\u610f\u7528\u4e09\u5bf9\u53cc\u5f15\u53f7\uff0c\u4e0d\u8981\u7528\u5176\u4ed6\u6ce8\u91ca\uff0c\u66f4\u4e0d\u8981\u7528\u4e95\u53f7\u6ce8\u91ca\u5199\u7528\u4f8b\u6807\u9898\uff1b \u76f4\u63a5\u590d\u5236 PMS \u7528\u4f8b \u7528\u4f8b\u6b65\u9aa4\u76f4\u63a5\u5c06 PMS \u4e0a\u7528\u4f8b\u6b65\u9aa4\u548c\u9884\u671f\u590d\u5236\u8fdb\u6765\uff0c\u7136\u540e\u8fdb\u884c\u6279\u91cf\u6ce8\u91ca\uff08ctrl + /\uff09\uff0c\u5728\u6ce8\u91ca\u7684\u57fa\u7840\u4e0a\u53bb\u5199\u7528\u4f8b\u811a\u672c\u4f1a\u66f4\u52a0\u65b9\u4fbf\u5168\u9762\uff0c\u4e5f\u6bd4\u4f60\u81ea\u5df1\u5199\u6ce8\u91ca\u66f4\u8282\u7ea6\u65f6\u95f4\uff1a \u4e3e\u4f8b\uff0cPMS \u7528\u4f8b\uff1a \u76f4\u63a5\u9009\u4e2d\u7528\u4f8b\u5185\u5bb9\uff0c\u590d\u5236\u4e0b\u6765\uff0c\u7136\u540e\u7c98\u8d34\u5230\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c\u4e2d\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\n \u4e0a\u4f8b\u4e2d\u4e95\u53f7\u6ce8\u91ca\u90e8\u5206\u5c31\u662f\u76f4\u63a5\u4ece PMS \u4e0a\u590d\u5236\u8fc7\u6765\u7684\uff0c\u5728\u6b64\u57fa\u7840\u4e0a\u5199\u7528\u4f8b\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\nmusic = DeepinMusicWidget()\nmusic.click_singer_btn_in_music_by_ui()\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\nmusic.click_icon_mode_in_music_by_ui()\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\nmusic.double_click_first_singer_in_singer_icon_view_by_ui()\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\nself.assert_xxx\n \u4f60\u770b\uff0c\u975e\u5e38\u6e05\u695a\u6bcf\u4e00\u6b65\u5728\u505a\u4ec0\u4e48\uff0c\u91cd\u70b9\u662f\u7701\u53bb\u4e86\u5199\u6ce8\u91ca\u7684\u65f6\u95f4\uff0c\u771f\u7684\u7092\u9e21\u65b9\u4fbf\u3002 \u4e0d\u5199 if __name__ == '__main__':\uff0c\u4e0d\u5199\u591a\u4f59\u7684\u4ee3\u7801\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3","title":"3. \u6570\u636e\u9a71\u52a8","text":" \u5982\u679c\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u662f\u76f8\u540c\u7684\uff0c\u53ea\u662f\u4e00\u4e9b\u53c2\u6570\u53d8\u5316\uff0c\u5c3d\u91cf\u4f7f\u7528\u6570\u636e\u9a71\u52a8\u6765\u5b9e\u73b0\u7528\u4f8b\uff1b \u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u6570\u636e\u9a71\u52a8\u7684\u6570\u636e\uff0c\u4e0d\u80fd\u56e0\u6b64\u5f15\u5165\u4f9d\u8d56\uff0c\u5c3d\u91cf\u4f7f\u7528\u4e00\u4e9b\u6807\u51c6\u5e93\u80fd\u8bfb\u53d6\u7684\u6587\u4ef6\u683c\u5f0f\uff0c\u6bd4\u5982 json\u3001ini\u3001CSV\u3001xml\u3001txt \u7b49\u6587\u4ef6\u683c\u5f0f\uff1b\u4e0d\u5efa\u8bae\u4f7f\u7528 Yaml\u3001Excel\u3001MySQL \u7b49\u6570\u636e\u683c\u5f0f\uff1b \u8bfb\u53d6\u6570\u636e\u65f6\u4e5f\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff0c\u5982\u4f7f\u7528 pandas \u5904\u7406 CSV \u5c31\u5c5e\u4e8e\u5927\u6750\u5c0f\u7528\u4e86\uff0c\u6b63\u5e38\u7684\u6570\u636e\u9a71\u52a8\u8fd8\u6ca1\u5230\u9700\u8981\u5927\u6570\u636e\u5206\u6790\u6765\u5904\u7406\u7684\u5730\u6b65\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u5728 widget/ddt/ \u76ee\u5f55\u4e0b\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5199\u6cd5\uff1a @pytest.mark.parametrize(\"value\", data)\ndef test_smb_049(self, value):\n \u4ee5\u4e0a\u8fd9\u79cd\u53c2\u6570\u5316\u7684\u5199\u6cd5\u672c\u8eab\u6ca1\u4ec0\u4e48\u95ee\u9898\uff0c\u4f46\u662f\uff0c\u8fd9\u91cc\u5fc5\u987b\u8981\u8865\u5145\u4e00\u4e2a\u6ca1\u6709\u7528\u7684\u5c0f\u77e5\u8bc6\uff1a \u5982\u679c\u53c2\u6570\u5316\u6570\u636e\u91cc\u9762\u7684\u5b57\u7b26\u4f1a\u539f\u5c01\u4e0d\u52a8\u7684\u8f93\u51fa\u5230 item.name \u91cc\u9762\uff0c\u663e\u793a\u975e\u5e38\u4e0d\u4f18\u96c5\uff0c\u800c\u4e14\u53ef\u4ee5\u4f1a\u5f15\u5165\u4e00\u4e9b\u610f\u60f3\u4e0d\u5230\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u611f\u53d7\u4e00\u4e0b\uff1a \u53c2\u6570\uff1a data = [\n\"\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\", \"qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678\",\n]\n \u73b0\u8c61\u662f\u8fd9\u6837\u8272\u513f\u7684\uff1a test_smb_049.py::TestFileManager::test_smb_049[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09]\ntest_smb_049.py::TestFileManager::test_smb_049[qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui]\ntest_smb_049.py::TestFileManager::test_smb_049[12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678]\n \u8bf4\u5b9e\u8bdd\uff0c\u770b\u7740\u5fc3\u91cc\u5835\u5f97\u614c\uff0c\u5982\u679c\u8fd9\u91cc\u9762\u5305\u542b\u4e00\u4e9b\u7279\u6b8a\u5b57\u7b26\u6216\u8005\u662f\u8d85\u957f\uff0c\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u5f88\u5947\u5999\u7684\u4e8b\u60c5\u53d1\u751f\u3002 parametrize \u91cc\u9762\u6709\u4e2a\u53c2\u6570\uff1aids\uff0c\u53ef\u4ee5\u89e3\u51b3\u6b64\u7c7b\u95ee\u9898\uff0c\u5c31\u50cf\u8fd9\u6837\uff1a @pytest.mark.parametrize(\"value\", data, ids=[1, 2, 3])\ndef test_smb_049(self, value):\n \u518d\u6765\u611f\u53d7\u4e00\u4e0b\uff1a test_smb_049.py::TestFileManager::test_smb_049[1]\ntest_smb_049.py::TestFileManager::test_smb_049[2]\ntest_smb_049.py::TestFileManager::test_smb_049[3]\n \u660e\u663e\u597d\u591a\u4e86\uff0c\u6240\u4ee5\u5c3d\u91cf\u4f7f\u7528 ids \u8fd9\u4e2a\u53c2\u6570\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 fixture \u7684\u6570\u636e\u9a71\u52a8\u65b9\u5f0f\uff0c\u6846\u67b6\u867d\u7136\u652f\u6301\uff0c\u4f46\u53ef\u8bfb\u6027\u6bd4\u8f83\u5dee\uff1b\u5982\u679c\u4f60\u4e0d\u77e5\u9053\u8fd9\u53e5\u8bdd\u5728\u8bf4\u5565\uff0c\u90a3\u4f60\u53ef\u4ee5\u5ffd\u7565\uff0c\u6211\u4e5f\u4e0d\u6253\u7b97\u8be6\u7ec6\u8bf4\u8fd9\u79cd\u5b9e\u73b0\u65b9\u5f0f\uff0c\u64cd\u4f5c\u6bd4\u8f83\u9a9a\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4","title":"4. \u65ad\u8a00\u8d44\u6e90","text":" \u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u76f4\u63a5\u653e\u5728\u7528\u4f8b\u6a21\u5757\u7684\u540c\u7ea7\u76ee\u5f55\u4e0b\u7684 assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0 + \u7528\u4f8b ID \u547d\u540d\uff1b \u56fe\u50cf\u8bc6\u522b\u65ad\u8a00\uff0c\u4e0d\u8981\u622a\u53d6\u4e00\u5f20\u5f88\u5927\u7684\u56fe\uff0c\u56fe\u7247\u8d44\u6e90\u5305\u542b\u7684\u5143\u7d20\u592a\u591a\u4e86\uff0c\u975e\u5e38\u5bb9\u6613\u53d7\u5230\u9700\u6c42\u5f71\u54cd\uff0c\u5efa\u8bae\u662f\u8fdb\u884c\u5c40\u90e8\u7684\u65ad\u8a00\uff1b \u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u5339\u914d\u5ea6\u662f 0.9\uff0c\u5982\u679c\u65ad\u8a00\u7684\u573a\u666f\u5bf9\u4e8e\u7cbe\u786e\u5ea6\u8981\u6c42\u6ca1\u90a3\u4e48\u9ad8\uff0c\u53ef\u4ee5\u5728\u65ad\u8a00\u8bed\u53e5\u91cc\u9762\u4f20\u5165\u5c0f\u4e8e 0.9 \u7684\u53c2\u6570\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5","title":"5. \u5143\u7d20\u5b9a\u4f4d","text":" \u7528\u4e8e\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u4e2d\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u547d\u540d\u4e3a\u8be5\u5143\u7d20\u7684\u540d\u79f0\uff1b \u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u622a\u53d6\u65f6\u5c3d\u91cf\u7cbe\u786e\u5230\u8fd9\u4e2a\u5177\u4f53\u7684\u6309\u94ae\uff0c\u56fe\u7247\u4e5f\u4e0d\u8981\u592a\u5927\uff1b \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u64cd\u4f5c\u8f83\u5feb\uff0c\u5408\u7406\u52a0\u5165\u7b49\u5f85\u65f6\u95f4\u80fd\u63d0\u9ad8\u7528\u4f8b\u7684\u7a33\u5b9a\u6027\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6","title":"6. \u7528\u4f8b\u8d44\u6e90","text":" \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u4f7f\u7528\u5230\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u6bd4\u5982\u97f3\u4e50\u53ef\u80fd\u9700\u8981\u4e00\u4e9b mp3 \u7684\u8d44\u6e90\u7528\u4e8e\u6d4b\u8bd5\uff0c\u5b58\u653e\u5728 widget/case_res \u76ee\u5f55\u4e0b\uff0c\u524d\u63d0\u662f\u8fd9\u4e9b\u8d44\u6e90\u4e0d\u8d85\u8fc7 10M\uff1b \u5982\u679c\u662f\u4e00\u4e9b\u6bd4\u8f83\u5927\u7684\u8d44\u6e90\uff0c\u5efa\u8bae\u653e\u5230\u7edf\u4e00\u7684 ftp \u670d\u52a1\u5668 \uff08ftp://10.8.10.245\uff09\uff0c\u9700\u8981\u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\u518d\u4e0b\u8f7d\u4e0b\u6765\uff1b f\"wget ftp://{Config.FTP_IP}/uploads/\u591a\u5a92\u4f53/\u5f71\u9662/auto/{file_name};unzip {file_name};rm -rf {file_name};\"\n \u6d4b\u8bd5\u8d44\u6e90\u4e0b\u8f7d\u5230\u5e94\u7528 widget/case_res \u76ee\u5f55\u4e0b\uff1b \u7981\u6b62\u5c06\u6d4b\u8bd5\u8d44\u6e90\u5b58\u653e\u5728\u4e2a\u4eba\u7684\u673a\u5668\u4e0a\uff1b \u5e94\u8be5\u5c3d\u91cf\u4fdd\u8bc1\uff0c\u4e00\u4e2a\u8d44\u6e90\u5728\u4e00\u6b21\u7528\u4f8b\u6267\u884c\u4e2d\u53ea\u9700\u8981\u4e0b\u8f7d\u4e00\u6b21\uff0c\u6240\u4ee5\u4f60\u4e0d\u80fd\u6bcf\u6b21\u4f7f\u7528\u7684\u65f6\u5019\u90fd\u53bb\u4e0b\u8f7d\uff0c\u8fd9\u6837\u53ef\u80fd\u4f1a\u8017\u8d39\u5927\u91cf\u7684\u7f51\u7edc\u8d44\u6e90\uff0c\u800c\u56e0\u4e3a\u5148\u5224\u65ad\u672c\u5730\u662f\u5426\u5b58\u5728\u6b64\u8d44\u6e90\uff0c\u5982\u679c\u4e0d\u5b58\u5728\u518d\u53bb\u4e0b\u8f7d\uff1b \u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u5c06\u8d44\u6e90\u62f7\u8d1d\u5230\u5bf9\u5e94\u7684\u6d4b\u8bd5\u76ee\u5f55\u4e0b\uff0c\u6bd4\u5982\u5c06 mp3 \u6587\u4ef6\u62f7\u8d1d\u5230 ~/Music \u76ee\u5f55\u4e0b\uff0c\u4f46\u662f\u6211\u4eec\u66f4\u5efa\u8bae\u4f60\u4f7f\u7528\u53d1\u9001\u5feb\u6377\u94fe\u63a5\u7684\u65b9\u5f0f\u66ff\u4ee3\u62f7\u8d1d\u7684\u64cd\u4f5c\uff0c\u56e0\u4e3a\u5728\u62f7\u8d1d\u5927\u6587\u4ef6\u65f6\u662f\u5f88\u6d88\u8017\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u800c\u521b\u5efa\u94fe\u63a5\u5219\u4e0d\u4f1a\uff1b @classmethod\ndef recovery_many_movies_in_movie_by_cmd(cls):\n\"\"\"\u6062\u590d\u591a\u4e2a\u89c6\u9891\u6587\u4ef6\u81f3\u89c6\u9891\u76ee\u5f55\u4e2d\"\"\"\nwork_path = f\"/home/{Config.USERNAME}/Videos/auto\"\ncode_path = f\"{Config.CASE_RES_PATH}/auto\"\ncls.run_cmd(f\"rm -rf {work_path};mkdir {work_path}\")\nsleep(1)\nflag = False\nif not exists(code_path):\ncls.run_cmd(f\"mkdir -p {code_path}\")\nflag = True\nlogger.info(f\"ln -s {code_path}/* {work_path}/\")\ncls.run_cmd(\nf\"cd {code_path}/;\"\nf\"{cls.wget_file('auto.zip') if flag else ''}\"\nf\"ln -s {code_path}/* {work_path}/ > /dev/null 2>&1\"\n)\n \u8d44\u6e90\u4e0b\u8f7d\u8fc7\u7a0b\u4e2d\u6ce8\u610f\u8d85\u65f6\u7684\u95ee\u9898\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u5f88\u5927\uff0c\u8981\u7279\u522b\u6ce8\u610f\u8fd9\u95ee\u9898\uff0c\u5982\u679c\u4f60\u4f7f\u7528\u5f3a\u5236\u7b49\u5f85\u4e0b\u8f7d\u7ed3\u675f( os.system )\uff0c\u53ef\u80fd\u4f1a\u9020\u6210\u7528\u4f8b\u6267\u884c\u65f6\u957f\u53d8\u5f97\u4e0d\u53ef\u63a5\u53d7\uff0c\u76ee\u524d\u6211\u4eec\u53d1\u73b0\u5728\u6301\u7eed\u96c6\u6210\u73af\u5883\u6267\u884c\u65f6\u7f51\u7edc\u4e0b\u8f7d\u901f\u5ea6\u5f88\u6162\uff0c\u6240\u4ee5\u8d85\u65f6\u673a\u5236\u662f\u5f88\u6709\u5fc5\u8981\u7684\uff1brun_cmd \u65b9\u6cd5\u6709\u4e00\u4e2a\u9ed8\u8ba4\u8d85\u65f6\u7684\u65f6\u95f4\uff0c\u4f60\u53ef\u4ee5\u6839\u636e\u8d44\u6e90\u5927\u5c0f\u5bf9\u8d85\u65f6\u65f6\u95f4\u8fdb\u884c\u8c03\u6574\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_5","title":"\u516d\u3001\u7528\u4f8b\u8c03\u8bd5\u6280\u5de7","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_4","title":"1. \u65e5\u5fd7","text":" \u4e00\u5b9a\u8981\u5148\u770b\u62a5\u9519\uff0c\u770b error \u65e5\u5fd7\uff0c\u901a\u5e38\u80fd\u660e\u786e\u7684\u544a\u8bc9\u4f60\u5177\u4f53\u54ea\u91cc\u4ee3\u7801\u62a5\u9519\uff1b \u7ed3\u5408\u62a5\u9519\u70b9\u524d\u9762\u7684error\u3001 info \u548c debug \u65e5\u5fd7\u770b\u5426\u662f\u6b63\u5e38\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_4","title":"2. \u65ad\u70b9\u8c03\u8bd5","text":" \u65b9\u6cd5\u62a5\u9519\uff1a \u5728\u65b9\u6cd5\u5e93\u4e2d\u627e\u5230\u5bf9\u5e94\u7684\u65b9\u6cd5\uff0c\u5355\u72ec\u8c03\u7528\uff0c\u770b\u662f\u5426\u80fd\u6b63\u5e38\u6267\u884c\uff1b \u901a\u5e38\u5355\u4e2a\u65b9\u6cd5\u7684\u6267\u884c\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u62a5\u9519\uff0c\u5f88\u5feb\u5c31\u80fd\u6392\u67e5\u51fa\u95ee\u9898\uff1b\u5728\u65b9\u6cd5\u5185\u90e8\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u65b9\u6cd5\u5185\u90e8\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u8c03\u7528\u6ca1\u95ee\u9898\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u62a5\u9519\u7684\u65b9\u6cd5\u524d\u9762\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u7528\u4f8b\u7684\u4e1a\u52a1\u903b\u8f91\u548c\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u65ad\u8a00\u62a5\u9519\uff1a \u65ad\u8a00\u4e3a\u6570\u636e\u65ad\u8a00\uff0c\u6839\u636e\u8868\u8fbe\u5f0f\u8fdb\u884c\u65ad\u8a00\u8bed\u53e5\u8fdb\u884c\u4fee\u6539\uff1b \u6587\u4ef6\u751f\u6210\u7c7b\u65ad\u8a00\uff0c\u67e5\u770b\u662f\u5426\u9700\u8981\u52a0\u7b49\u5f85\u65f6\u95f4\uff1b \u56fe\u50cf\u65ad\u8a00\uff0c\u5728\u65ad\u8a00\u8bed\u53e5\u5904\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u7528\u4f8b\u8fd0\u884c\u5230\u65ad\u8a00\u5904\u4f1a\u505c\u6b62\uff0c\u67e5\u770b\u6b64\u65f6\u65ad\u8a00\u7684\u56fe\u7247\u4e0e\u7528\u4f8b\u6267\u884c\u7684\u73b0\u573a\u5b58\u5728\u4ec0\u4e48\u5dee\u5f02\uff0c\u6b64\u65f6\u4e5f\u53ef\u4ee5\u8fdb\u884c\u91cd\u65b0\u622a\u56fe\uff0c\u4ece\u800c\u66ff\u6362\u65b0\u7684\u56fe\u7247\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3_1","title":"3. \u8fdc\u7a0b\u6267\u884c","text":" \u8fdc\u7a0b\u6267\u884c\u6307\u7684\u662f\u7f16\u8f91\u5668\u901a\u8fc7\u6307\u5b9a\u8fdc\u7a0b\u89e3\u91ca\u5668\u6267\u884c\u81ea\u52a8\u5316\u4ee3\u7801\uff1b \u8fdc\u7a0b\u6267\u884c\u7684\u597d\u5904\u662f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u7684 Debug \u8fd0\u884c\uff0c\u4e0d\u7528\u5728\u6d4b\u8bd5\u673a\u4e0a\u6253\u5f00\u7f16\u8f91\u5668\uff0c\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u66f4\u5feb\uff1b \u652f\u6301\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u7684\u7f16\u8f91\u5668\uff1a \u4e13\u4e1a\u7248 Pycharm VScode \uff0c\u9700\u8981\u4f7f\u7528\u63d2\u4ef6 Remote-SSH \u8fdc\u7a0b\u6267\u884c\u914d\u7f6e \u4ee5 Pycharm \u4e3a\u4f8b\uff1a File \u2014> Settings \u2014> Project \u2014> Python Interpreter \u2014> \u53f3\u8fb9\u8bbe\u7f6e\u6309\u94ae \u2014> Add... \u2014> SSH Interpreter \u2014> New server configuration(\u586b\u5165host\u548cusername) \u2014> Next \u2014> password\uff08\u6d4b\u8bd5\u673a\u5bc6\u7801\uff09 \u2014> Interpreter(\u9009\u62e9\u8fdc\u7a0b\u89e3\u91ca\u5668) \u2014> Finish "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4_1","title":"4. \u73af\u5883\u6e05\u7406","text":" \u5982\u679c\u7528\u4f8b\u91cc\u9762\u7684 teardown \u6ca1\u6709\u6267\u884c\uff0c\u5927\u6982\u7387\u662f\u56e0\u4e3a setup \u91cc\u9762\u4ee3\u7801\u62a5\u9519\uff0c\u8fd9\u4e24\u4e2a\u662f\u4e00\u5bf9\u7684\uff0csetup \u91cc\u9762\u62a5\u9519\uff0cteardown \u91cc\u9762\u7684\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\uff1b \u76ee\u524d\u6211\u4eec\u5df2\u7ecf\u5c06\u5404\u5e94\u7528\u7684 clean_all \u8fd9\u4e2a fixture \u6539\u6210\u4e86\u7ec8\u7ed3\u5668\uff0c\u786e\u4fdd\u59cb\u7ec8\u80fd\u6267\u884c\u5230\u8fd9\u6b65\uff0c\u4f46\u662f\u7528\u4f8b\u91cc\u9762\u7684 fixture\uff0c\u8fd8\u662f\u9700\u8981\u6211\u4eec\u5c0f\u5fc3\u5904\u7406\uff1b \u8981\u6267\u884c clean_all \u9700\u8981\u5728\u7f16\u8f91\u5668\u8fd0\u884c\u53c2\u6570\u52a0 --clean yes\uff0c\u5199\u7528\u4f8b\u7684\u65f6\u5019\u8bf7\u52a0\u4e0a\uff0c\u4e0d\u7136\u4f60\u4e0d\u786e\u5b9a\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u7684\u73af\u5883\u662f\u5426\u6062\u590d\uff1b setup \u53ef\u4ee5\u4e0d\u8981\uff0c\u5c06 setup \u653e\u5230\u7528\u4f8b\u91cc\u9762\u662f\u4e00\u79cd\u7a33\u59a5\u7684\u505a\u6cd5\uff0cteardown \u4e00\u5b9a\u8981\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5_1","title":"5. \u5143\u7d20\u5b9a\u4f4d\u4e0d\u51c6\uff08\u5750\u6807\u8fd4\u56de\u4e0d\u5bf9\uff09","text":" \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u53ef\u80fd\u53d7\u5230\u7a97\u53e3 ID \u7684\u53d8\u5316\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u9ed8\u8ba4\u53d6\u6700\u65b0\u7684\u4e00\u4e2a\u7a97\u53e3\u7528\u4e8e\u5b9a\u4f4d\uff0c\u4f46\u5982\u679c\u5b9e\u9645\u9700\u8981\u5b9a\u4f4d\u7684\u4e0d\u662f\u6700\u65b0\u7684\u7a97\u53e3\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u91cd\u65b0\u5b9e\u4f8b\u5316\u65b9\u6cd5\u7c7b\u5bf9\u8c61\uff0c\u5e76\u5728\u7c7b\u4e2d\u4f20\u5165\u5bf9\u5e94\u7684\u7a97\u53e3\u5e8f\u53f7\uff1b \u57fa\u4e8e\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u76ee\u524d\u9047\u5230\u7684\u7b14\u8bb0\u672c\u4e0a\uff0c\u7531\u4e8e\u5c4f\u5e55\u7f29\u653e\u6bd4\u4f8b\u4e3a 1.25\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u6211\u4eec\u9ed8\u8ba4\u4f7f\u7528\u7f29\u653e\u6bd4\u4f8b\u4e3a 1\uff1b \u57fa\u4e8e\u56fe\u50cf\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u76ee\u6807\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b \u57fa\u4e8e OCR \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u6587\u5b57\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u540c\u6837\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6_1","title":"6. \u952e\u9f20\u64cd\u4f5c\u4e0d\u51c6","text":" \u9f20\u6807\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6bd4\u5982\u53f3\u952e\u3001\u53cc\u51fb\u65e0\u54cd\u5e94\uff1b \u952e\u76d8\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6216\u8005\u5ef6\u8fdf\u8f93\u5165\uff0c\u6bd4\u5982\u7528\u4f8b\u9700\u8981\u8f93\u5165\u201c\u6211\u662f\u4e2d\u56fd\u4eba\u201d\uff0c\u5b9e\u9645\u53ea\u8f93\u5165\u4e86\u201c\u6211\u56fd\u4eba\u201d\uff1b \u4ee5\u4e0a\u95ee\u9898\u6392\u9664\u5e94\u7528\u5361\u987f\u7b49\u95ee\u9898\uff0c\u5927\u6982\u7387\u662f\u7531\u4e8e\u5de5\u5177\u7684\u95ee\u9898\uff0c\u76ee\u524d\u952e\u9f20\u64cd\u4f5c\u6211\u4eec\u4f7f\u7528\u4e09\u4e2a\u5de5\u5177\uff1aDogtail \u63d0\u4f9b\u7684\u952e\u9f20\u5de5\u5177\u3001PyAutoGUI\u3001Xdotool \uff1b \u6709\u540c\u5b66\u53ef\u80fd\u8981\u8bf4\u4e3a\u5565\u8981\u7528\u4e09\u4e2a\u554a\uff0c\u7528\u4e00\u4e2a\u4e0d\u5c31\u597d\u4e86\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u5404\u6709\u4f18\u70b9\u5404\u6709\u7f3a\u70b9\u3002 \u5982\u679c\u4f60\u9047\u5230\u952e\u9f20\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u8bd5\u8bd5\u901a\u8fc7\u4e0d\u540c\u7684\u5de5\u5177\u64cd\u4f5c\uff1b\u952e\u76d8\u8f93\u5165\u5ef6\u8fdf\u7684\u95ee\u9898\uff0c\u4e00\u822c\u662f\u56e0\u4e3a\u8f93\u5165\u901f\u5ea6\u592a\u5feb\u4e86\uff0c\u7cfb\u7edf\u6ca1\u53cd\u5e94\u8fc7\u6765\uff0c\u5e38\u89c1\u4e8e ARM \u548c MIPS \u4e0a\uff0c\u4fee\u6539\u53c2\u6570 delay_time \u7684\u503c\uff0c\u5355\u4f4d\u4e3a\u6beb\u79d2\uff1b # mouse_key.py\n@classmethod\ndef input_message(cls, message, delay_time=300, interval=0.2):\n\"\"\"\n \u8f93\u5165\u5b57\u7b26\u4e32\n :param message: \u8f93\u5165\u7684\u5185\u5bb9\n :param delay_time: \u5ef6\u8fdf\u65f6\u95f4\n :param interval:\n :return:\n \"\"\"\n \u5982\u679c\u4e0d\u662f\u65b9\u6cd5\u7684\u95ee\u9898\uff0c\u5219\u9700\u8981\u7ee7\u7eed\u548c\u5f00\u53d1\u4e00\u8d77\u6392\u9664\uff0c\u662f\u5426\u4e3a\u5e94\u7528\u63a5\u53d7\u952e\u9f20\u4fe1\u53f7\u5904\u7406\u7684\u95ee\u9898\uff0c\u8fd9\u7c7b\u60c5\u51b5\u6211\u4eec\u4e5f\u662f\u9047\u5230\u8fc7\u7684\uff0c\u5177\u4f53\u95ee\u9898\u5177\u4f53\u5206\u6790\u3002 \u6bd4\u5982\u5f71\u9662\u5c31\u91cd\u5199\u4e86\u4e00\u4e2a\u53f3\u952e\u7684\u65b9\u6cd5\uff1a # base_widget.py\n@classmethod\ndef right_click(cls, _x=None, _y=None):\n\"\"\"\n \u91cd\u5199\u5e95\u5c42\u5355\u51fb\u9f20\u6807\u53f3\u952e\n \u89e3\u51b3\u5f71\u9662\u53f3\u952e\u89e6\u53d1release\u4e8b\u4ef6\u7684\u95ee\u9898\uff08\u53f3\u952e\u4e3b\u7a97\u53e3\u4f1a\u64ad\u653e\u89c6\u9891\uff09\n \"\"\"\ncls.mouse_down(_x, _y, button=3)\nsleep(0.1)\ncls.mouse_up(button=3)\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_6","title":"\u4e03\u3001\u5176\u4ed6\u4e0d\u4e3a\u4eba\u77e5\u7684\u7ec6\u8282","text":" \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u5c3d\u91cf\u7f16\u5199\u540c\u4e00\u4e2a\u5e94\u7528\u6216\u6a21\u5757\u7684\u7528\u4f8b\uff0c\u80fd\u5bf9\u8be5\u7528\u4f8b\u5df2\u6709\u65b9\u6cd5\u719f\u6089\uff0c\u907f\u514d\u8fc7\u591a\u91cd\u590d\u4e1a\u52a1\u4ee3\u7801\u7684\u5c01\u88c5\uff1b \u76f8\u540c\u7684\u573a\u666f\u4e0b\uff0c\u5404\u67b6\u6784\u7b49\u5f85\u65f6\u95f4\u4e0d\u540c\uff0c\u5efa\u8bae\u4f7f\u7528\u6846\u67b6\u63d0\u4f9b\u7684 sleep\uff0c\u6211\u4eec\u505a\u4e86\u4e0d\u540c\u67b6\u6784\u7684\u500d\u6570\u653e\u5927\uff1b \u7f16\u5199\u7528\u4f8b\u65f6\uff0c\u5c3d\u91cf\u8003\u8651\u5230\u6bcf\u4e00\u6b65\u5f02\u5e38\u540e\u7684\u73af\u5883\u6062\u590d\uff0c\u9700\u8981\u5efa\u8bae\u8fd9\u79cd\u610f\u8bc6\uff0c\u968f\u65f6\u8981\u8003\u8651\u5230\uff0c\u8fd9\u6b65\u64cd\u4f5c\u6709\u6ca1\u6709\u53ef\u80fd\u51fa\u9519\uff0c\u51fa\u9519\u4e86\u6539\u600e\u4e48\u529e\uff1b \u63d0\u4ea4\u4ee3\u7801\u7684\u65f6\u5019\u6ce8\u610f\u4e0d\u8981\u628a\u4e00\u4e9b\u4e34\u65f6\u7684\u6d4b\u8bd5\u8d44\u6e90\u63d0\u4ea4\u8fdb\u53bb\u4e86\uff0c\u6bd4\u5982\u6d4b\u8bd5\u4e86\u4e00\u4e2a\u5f71\u7247\uff0c\u6709\u4e9b\u540c\u5b66\u4e60\u60ef\u4f7f\u7528 git add . \uff0c\u7136\u540e\u5c31\u5168\u90e8\u63d0\u4ea4\u5230\u4ee3\u7801\u4ed3\u5e93\u4e86\uff0c\u8fd9\u6837\u5373\u4f7f\u540e\u671f\u628a\u5927\u6587\u4ef6\u5220\u4e86\uff0c.git \u6587\u4ef6\u91cc\u9762\u4e5f\u4f1a\u5f88\u5927\uff0c\u9020\u6210\u4ee3\u7801\u4ed3\u5e93\u53d8\u5f97\u5341\u5206\u81c3\u80bf\u3002 \u66f4\u591a\u7ec6\u8282\u67e5\u770b\uff1a\u300aAT\u7ecf\u9a8c\u603b\u7ed3\u300b"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/","title":"AT \u6267\u884c\u5668\u4f7f\u7528\u6307\u5317","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/5/25\n# Author : litao\n# =============================================\n Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1","title":"1\u3001\u529f\u80fd\u4ecb\u7ecd","text":" \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7cfb\u7edf\u8bed\u8a00\u8bbe\u7f6e\uff0c\u5206\u8fa8\u7387\u8bbe\u7f6e\u53ca\u7528\u4f8b\u6267\u884c\u73af\u5883\u642d\u5efa\uff1b \u652f\u6301 IP \u4e3a 15 \u7f51\u6bb5\u7684 AMD \u67b6\u6784\u6d4b\u8bd5\u673a\u955c\u50cf\u88c5\u673a\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u6307\u5b9a\u5e94\u7528\uff0c\u6307\u5b9a\u8303\u56f4\u6807\u7b7e\u7684\u7528\u4f8b\u6267\u884c\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u72b6\u6001\u68c0\u67e5\uff0c\u662f\u5426\u6709\u6b63\u5728\u8fd0\u884c\u7684\u6d4b\u8bd5\uff1b \u652f\u6301\u914d\u7f6e\u7528\u4f8b\u6267\u884c\u65f6\u957f\uff0c\u9632\u6b62\u4efb\u52a1\u963b\u585e\uff1b \u652f\u6301\u6839\u636e\u5e94\u7528\u7248\u672c\u81ea\u52a8\u67e5\u627e\u5bf9\u5e94\u7684\u7528\u4f8b tag\uff1b \u652f\u6301\u5f02\u5e38\u5904\u7406\u548c\u6d4b\u8bd5\u5b8c\u6210\u7684\u5b9e\u65f6\u6d88\u606f\u901a\u77e5\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2job","title":"2\u3001Job \u4ecb\u7ecd","text":"\u4ee5\u4e0b\u6309\u6267\u884c\u6d41\u7a0b\u7684\u987a\u5e8f\u4ecb\u7ecd\uff0c\u6bcf\u4e00\u6b65\u90fd\u53ef\u4ee5\u5355\u72ec\u6267\u884c\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1_1","title":"1\u3001\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/AT_test/ \u6574\u4e2a\u6d41\u7a0b\u7684\u4e3b\u5165\u53e3\uff0c\u901a\u8fc7\u8fd9\u4e2a\u5165\u53e3\uff0c\u8fde\u540c\u6574\u4e2a\u6d4b\u8bd5\u6d41\u7a0b\uff0c\u955c\u50cf\u88c5\u673a\uff0c\u73af\u5883\u90e8\u7f72\uff0c\u6d4b\u8bd5\u5e94\u7528\u53ca\u751f\u6210\u62a5\u544a\u3002 \u53c2\u6570\u4ecb\u7ecd\uff1a \u6d4b\u8bd5\u673a\uff1a\u6240\u6709\u89c4\u6574\u5230\u56fa\u5b9a\u533a\u57df\u7684\u6d4b\u8bd5\u673a\uff0c\u901a\u8fc7\u6d4b\u8bd5\u540c\u5b66\u5bf9\u6d4b\u8bd5\u673a\u7684\u4e60\u60ef\u547d\u540d\uff0c\u5728\u540e\u53f0\u6620\u5c04\u6d4b\u8bd5\u673a\u7684\u8be6\u7ec6\u4fe1\u606f\uff0c\u62ec\u53f7\u4e2d\u4e3a\u6d4b\u8bd5\u673a IP \u7684\u6700\u540e\u4e00\u4f4d\uff1b \u6d4b\u8bd5\u5e94\u7528\uff1a\u6307\u5b9a\u7684\u6d4b\u8bd5\u5e94\u7528\u7684\u5305\u540d\uff0c\u7cfb\u7edf\u6839\u636e\u540d\u79f0\u81ea\u52a8\u62c9\u53d6\u5bf9\u5e94\u7684\u4ed3\u5e93\u4ee3\u7801\uff1b deb\u5305\u4e0b\u8f7d\u5730\u5740\uff1a\u6d4b\u8bd5\u4e0a\u8ff0\u5e94\u7528\u65f6\uff0c\u9700\u8981\u5b89\u88c5\u7684deb\u5305\u4e0b\u8f7d\u5730\u5740\uff0c\u591a\u4e2a\u5730\u5740\u7528\u201c,\u201d\u9694\u5f00\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff1b \u8303\u56f4\u6807\u7b7e\uff1a\u6267\u884c\u6d4b\u8bd5\u7528\u4f8b\u7684\u6807\u7b7e\u8303\u56f4\uff0c\u5bf9\u5e94\u7528\u4f8b\u4ee3\u7801 csv \u6587\u4ef6\u4e2d\u7684\u6807\u7b7e\u4fe1\u606f\uff0c\u4ee5 pytest \u7684mark\u8bed\u6cd5\u7f16\u5199\uff1b \u7cfb\u7edf\u8bed\u8a00\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u8bed\u8a00\u73af\u5883\uff1b \u5206\u8fa8\u7387\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u5206\u8fa8\u7387\u73af\u5883\uff1b \u955c\u50cf\u5730\u5740\uff1a\u955c\u50cf\u4ed3\u5e93\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u901a\u8fc7 PXE \u88c5\u673a\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u88c5\u673a\u73af\u8282\uff08\u76ee\u524d\u4ec5\u652f\u6301\u90e8\u5206 AMD \u67b6\u6784\u7684\u88c5\u673a\uff09\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2pxe","title":"2\u3001PXE \u88c5\u673a","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/IOS_install/ \u8f93\u5165\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\uff0cIP\uff0c\u5bc6\u7801\uff0c\u955c\u50cf\u5730\u5740\u540e\uff0c\u81ea\u52a8\u88c5\u673a\uff0c\u76ee\u524d\u4ec5\u652f\u6301\u56fa\u5b9a 15 \u7f51\u6bb5\u7684\u90e8\u5206 AMD \u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#3","title":"3\u3001\u6b21\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/all_client_test/ \u8be5\u5165\u53e3\u4e0e\u4e3b\u5165\u53e3\u529f\u80fd\u57fa\u672c\u4e00\u81f4\uff0c\u53ea\u662f\u5265\u79bb\u4e86PXE\u88c5\u673a\u6d41\u7a0b\uff0c\u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7684\u6267\u884c\u6d41\u7a0b\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#4","title":"4\u3001\u73af\u5883\u90e8\u7f72","text":"Jenkins url\uff1ahttps://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/env/build?delay=0sec \u8bbe\u7f6e\u6d4b\u8bd5\u673a\u7684\u7cfb\u7edf\u8bed\u8a00\uff0c\u5206\u8fa8\u7387\u53ca\u5b89\u88c5\u6d4b\u8bd5\u6240\u9700\u7684\u4f9d\u8d56\u5305\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#5","title":"5\u3001\u53d1\u9001\u4ee3\u7801","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/send_code/ \u6839\u636e\u6d4b\u8bd5\u5e94\u7528\u540d\u79f0\uff0c\u62c9\u53d6\u5bf9\u5e94\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u5e76\u6839\u636e\u6d4b\u8bd5\u673a\u4e0a\u5e94\u7528\u7248\u672c\u5207\u6362\u5230\u5bf9\u5e94\u7684tag\u7248\u672c\uff0c\u82e5\u672a\u627e\u5230tag\u7248\u672c\uff0c\u5219\u4f7f\u7528\u6700\u65b0\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u518d\u6839\u636e\u5e94\u7528\u5e93\u4ee3\u7801\u4e2d\u914d\u7f6e\u7684\u57fa\u7840\u5e93\u7248\u672c\uff0c\u62c9\u53d6\u57fa\u7840\u5e93\u4ee3\u7801\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#6","title":"6\u3001\u7528\u4f8b\u6267\u884c","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/run_test/ \u8fd0\u884c\u6d4b\u8bd5\u673a\u4e0a\u7684\u7528\u4f8b"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/","title":"AT \u7528\u4f8b\u7b5b\u9009\u6307\u5317","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u7528\u4f8b\u7b5b\u9009\u6807\u51c6\uff0c\u662f\u6311\u9009\u5408\u9002\u7684\u6587\u672c\u7528\u4f8b\u8fdb\u884c\u81ea\u52a8\u5316\u7528\u4f8b\u8f6c\u5316\u7684\u4e00\u4e9b\u901a\u7528\u6807\u51c6\u3002 \u8fc7\u53bb\u6211\u4eec\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u5b9e\u8df5\u8fc7\u7a0b\u4e2d\uff0c\u5199\u4e86\u4e0d\u5c11\u81ea\u52a8\u5316\u7528\u4f8b\uff0c\u968f\u7740\u9700\u6c42\u7684\u8fed\u4ee3\uff0c\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u81ea\u7136\u8150\u5316\uff0c\u56e0\u800c\u9700\u8981\u5728\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\u5bf9\u81ea\u52a8\u5316\u7528\u4f8b\u8fdb\u884c\u7ef4\u62a4\uff0c\u5728\u7ef4\u62a4\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u6211\u4eec\u53d1\u73b0\uff0c\u6709\u4e9b\u7528\u4f8b\u7ef4\u62a4\u8d77\u6765\u592a\u96be\u4e86\uff0c\u8c03\u8bd5\u7528\u4f8b\u8017\u8d39\u5927\u91cf\u65f6\u95f4\uff0c\u6210\u672c\u5f88\u9ad8\u3002 \u56e0\u6b64\uff0c\u6211\u4eec\u603b\u7ed3\u4e00\u4e9b\u81ea\u52a8\u5316\u7528\u4f8b\u9009\u578b\u7684\u6807\u51c6\uff0c\u4ee5\u4f18\u5316\u540e\u7eed\u81ea\u52a8\u5316\u7528\u4f8b\u7ed3\u6784\uff0c\u671f\u5f85\u6211\u4eec\u80fd\u7f16\u5199\u51fa\u9ad8\u6548\u3001\u7a33\u5b9a\u3001\u6613\u4e8e\u7ef4\u62a4\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_1","title":"\u4e00\u3001\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u53ef\u4ee5\u5206\u4e3a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u548c\u4e13\u9879\u81ea\u52a8\u5316\u6d4b\u8bd5\uff0c\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e00\u822c\u53ea\u9488\u5bf9\u4e00\u4e9b\u5e38\u89c4\u7684\u529f\u80fd\u6d4b\u8bd5\uff0c\u5176\u4ed6\u975e\u5e38\u89c4\u529f\u80fd\u7684\u7528\u4f8b\uff0c\u5e94\u8be5\u91c7\u7528\u4e13\u9879\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u6848\uff1b \u4ee5\u4e0b\u662f\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1","title":"1. \u7a33\u5b9a\u6027\u3001\u538b\u6d4b\u7528\u4f8b","text":"\u7a33\u5b9a\u6027\u6d4b\u8bd5\u3001\u538b\u6d4b\u7528\u4f8b\u5e94\u8be5\u662f\u5c5e\u4e8e\u6027\u80fd\u76f8\u5173\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u5982\uff1a\u53cd\u590d\u591a\u6b21\u70b9\u51fb\u6309\u94ae\uff0c\u68c0\u9a8c\u5176\u529f\u80fd\u7a33\u5b9a\u6027\u3002\u56e0\u4e3a\u8fd9\u4e9b\u7528\u4f8b\u65ad\u8a00\u7684\u9884\u671f\u53ef\u80fd\u4e0d\u662f\u5f88\u660e\u786e\uff0c\u66f4\u6709\u751a\u8005\u4e0d\u9700\u8981\u65ad\u8a00\uff0c\u7528\u4f8b\u65f6\u957f\u6bd4\u8f83\u957f\uff0c\u800c\u4e14\u4e0d\u53ef\u63a7\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u76ee\u524d\u6211\u4eec\u6709\u6027\u80fd\u81ea\u52a8\u5316\u7684\u4e13\u9879\u65b9\u6848\uff0c\u4ee5\u53ca\u4e00\u4e9b\u7a33\u5b9a\u6027\u6d4b\u8bd5\u7684\u4e13\u9879\u65b9\u6848\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u6b64\u7c7b\u7528\u4f8b\u653e\u5230\u4e13\u9879\u81ea\u52a8\u5316\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2","title":"2. \u6d89\u53ca\u591a\u4e2a\u7528\u6237\u64cd\u4f5c","text":"\u5e38\u89c1\u4e0e\u6587\u7ba1\u7684\u7528\u4f8b\u4e2d\uff0c\u591a\u7528\u6237\u64cd\u4f5c\u7684\u7528\u4f8b\u4e00\u822c\u90fd\u4f1a\u6d89\u53ca\u5230\u5728\u7cfb\u7edf\u4e2d\u8fdb\u884c\u591a\u4e2a\u7528\u6237\u95f4\u7684\u5207\u6362\uff0c\u81ea\u52a8\u5316\u811a\u672c\u4e00\u822c\u662f\u8fd0\u884c\u5728\u4e00\u4e2a\u7528\u6237\u7a7a\u95f4\u4e0b\u7684\uff0c\u6240\u4ee5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u591a\u7528\u6237\u95f4\u7684\u5207\u6362\u3002 \u6b64\u7c7b\u4e0d\u5efa\u8bae\u91c7\u7528\u81ea\u52a8\u5316\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3","title":"3. \u4e0e\u5f00\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4ea4\u4e92","text":"\u6b64\u7c7b\u573a\u666f\u591a\u4e3a\u5e94\u7528\u7684\u5f02\u5e38\u573a\u666f\u6d4b\u8bd5\uff0c\u6bd4\u5982\uff1a\u590d\u5236\u5927\u6587\u4ef6\u8fc7\u7a0b\u4e2d\u6ce8\u9500\u673a\u5668\u3002 \u81ea\u52a8\u5316\u811a\u672c\u5728\u7cfb\u7edf\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4e4b\u540e\u662f\u4f1a\u505c\u6b62\u8fd0\u884c\u7684\uff1b\u6b64\u7c7b\u7528\u4f8b\u53ef\u4ee5\u505a\u81ea\u52a8\u5316\uff0c\u4f46\u662f\u540c\u6837\u9700\u8981\u505a\u4e13\u9879\u65b9\u6848\uff0c\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u7684\u5904\u7406\u903b\u8f91\u5b8c\u5168\u4e0d\u540c\u3002 \u540e\u7eed\u81ea\u52a8\u5316\u9700\u8981\u516c\u5173\u7684\u70b9\uff1a \u81ea\u52a8\u5316\u811a\u672c\u5728\u672c\u673a\u8fd0\u884c\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u81f3\u5c11\u9700\u8981\u63d0\u4f9b\u4ee5\u4e0b\u529f\u80fd\uff1a \u91cd\u542f\u4e4b\u540e\u7528\u4f8b\u80fd\u81ea\u52a8\u8fd0\u884c\uff1b\u53ef\u4ee5\u8003\u8651\u5c06\u6267\u884c\u7528\u4f8b\u5199\u6210\u4e00\u4e2a\u5f00\u673a\u81ea\u542f\u7684\u670d\u52a1\uff1b \u80fd\u8bb0\u5f55\u5173\u673a\u4e4b\u524d\u7528\u4f8b\u6267\u884c\u7684\u4f4d\u7f6e\uff0c\u91cd\u542f\u4e4b\u540e\u80fd\u4ece\u6b64\u4f4d\u7f6e\u5f00\u59cb\u6267\u884c\uff1b \u50cf\u6027\u80fd\u81ea\u52a8\u5316\u4e00\u6837\uff0c\u7531\u670d\u52a1\u7aef\u63a7\u5236\uff1b \u5b8c\u5168\u57fa\u4e8e\u56fe\u5f62\u8bc6\u522b\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u4e32\u53e3\u7ebf\u63a7\u5236\u952e\u9f20\u7a33\u5b9a\u6027\uff1b "},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4","title":"4. \u6d4b\u8bd5\u6267\u884c\u65f6\u95f4\u957f","text":"\u7528\u4f8b\u6267\u884c\u65f6\u95f4\u63a7\u5236\u57282\u5206\u949f\u4ee5\u5185\uff0c\u6781\u7aef\u60c5\u51b5\u4e0d\u8981\u8d85\u8fc75\u5206\u949f\uff0c\u6240\u6709\u7528\u4f8b\u7684\u5e73\u5747\u65f6\u957f\u5e94\u8be5\u57281\u5206\u949f\u5de6\u53f3\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u95f4\u592a\u957f\uff0c\u7f16\u5199\u7528\u4f8b\u3001\u8c03\u8bd5\u7528\u4f8b\u3001\u6267\u884c\u7528\u4f8b\u3001\u7ef4\u62a4\u7528\u4f8b\u90fd\u975e\u5e38\u7684\u8017\u65f6\uff0c\u4eba\u529b\u6210\u672c\u65f6\u95f4\u6210\u672c\u6295\u5165\u592a\u9ad8\u3002 \u4f60\u60f3\uff0c\u8fd9\u6761\u7528\u4f8b\u6267\u884c\u9700\u89815\u5206\u949f\uff0c\u90a3\u4f60\u5199\u8fd9\u6761\u7528\u4f8b\u7684\u65f6\u95f4\u4e0d\u53ef\u80fd\u4e00\u904d\u8fc7\uff0c\u5199\u7684\u8fc7\u7a0b\u4e2d\u8dd1\u4e0d\u901a\u8fd8\u5f97\u91cd\u8dd1\u81f3\u5c1115\u5206\u949f\u4e0d\u8fc7\u5206\uff0c\u5199\u5b8c\u4e86\u8fd8\u5f97\u5728\u5176\u4ed6\u67b6\u6784\u4e0a\u8c03\u8bd5\uff0c\u534a\u4e2a\u5c0f\u65f6\u8fc7\u53bb\u4e86\uff0c\u8fd9\u8fd8\u53ea\u662f\u7b2c\u4e00\u6b21\u5199\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u540e\u7eed\u5982\u679c\u7528\u4f8b\u7ef4\u62a4\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u7ecf\u5e38\u6295\u5165\u76f8\u5f53\u957f\u65f6\u95f4\uff0c\u8fd9\u6837\u5176\u5b9e\u662f\u5931\u53bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u7684\u3002\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u5c31\u5e94\u8be5\u662f\u5feb\u51c6\u72e0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5","title":"5. \u8fb9\u7f18\u6027\u6d4b\u8bd5","text":"\u6709\u4e9b\u529f\u80fd\u6a21\u5757\u672c\u8eab\u662f\u5c5e\u4e8e\u6bd4\u8f83\u8fb9\u7f18\u6027\u7684\uff0c\u5373\u6781\u5c11\u7528\u6237\u4f1a\u4f7f\u7528\u5230\u7684\u529f\u80fd\uff0c\u8fd9\u7c7b\u529f\u80fd\u6a21\u5757\u4e0d\u9700\u8981\u5927\u89c4\u6a21\u5b9e\u73b0\u81ea\u52a8\u5316\uff0c\u4e00\u4e24\u4e2a\u573a\u666f\u8986\u76d6\u57fa\u672c\u529f\u80fd\u5c31\u884c\u4e86\uff0c\u56e0\u6b64\u6211\u4eec\u5728\u6311\u9009\u6b64\u7c7b\u7528\u4f8b\u7684\u65f6\u5019\u53ef\u4ee5\u7ed3\u5408\u6574\u4e2a\u529f\u80fd\u6a21\u5757\u7684\u8986\u76d6\u60c5\u51b5\u6765\u51b3\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6","title":"6. \u9700\u8981\u4f9d\u8d56\u4eba\u5de5\u4ecb\u5165\u7684","text":"\u81ea\u52a8\u5316\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\u662f\u6ca1\u6709\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bd4\u5982\u8981\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u90a3\u4e48\u5c31\u80cc\u79bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u3002 \u6bd4\u5982\u5149\u9a71\u6a21\u5757\uff0c\u5149\u9a71\u523b\u5f55\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u4f46\u662f\u5149\u9a71\u523b\u5f55\u4e4b\u540e\u5149\u76d8\u4f1a\u5f39\u51fa\u6765\uff0c\u9700\u8981\u4eba\u5de5\u66f4\u6362\u5149\u76d8\uff0c\u518d\u624b\u52a8\u63a8\u8fdb\u5149\u9a71\u4e2d\u3002 \u8fd9\u79cd\u529f\u80fd\u6a21\u5757\u5373\u4f7f\u505a\u81ea\u52a8\u5316\uff0c\u80fd\u6d89\u53ca\u5230\u7684\u529f\u80fd\u975e\u5e38\u6709\u9650\uff0c\u800c\u4e14\u4e0d\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u6240\u4ee5\u660e\u663e\u5c31\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7","title":"7. \u96be\u4ee5\u5b9e\u73b0\u7684","text":"\u7528\u4f8b\u6240\u6d89\u53ca\u5230\u7684\u65b9\u6cd5\u5b9e\u73b0\u8d77\u6765\u53ef\u80fd\u6709\u96be\u5ea6\uff0c\u751a\u81f3\u73b0\u9636\u6bb5\u65e0\u6cd5\u5b9e\u73b0\u7684\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002 \u6bd4\u5982\u5f71\u9662\u6d4b\u8bd5\u753b\u9762\u6e05\u6670\u5ea6\u3001\u6d41\u7545\u5ea6\u3001\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u4e4b\u540e\u7684\u89c6\u9891\u662f\u5426\u5b58\u5728\u5361\u987f\u7b49\u7528\u4f8b\uff0c\u73b0\u9636\u6bb5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#8","title":"8. \u529f\u80fd\u4e0d\u7a33\u5b9a","text":"\u8fd9\u4e2a\u4e0d\u662f\u8bf4\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\uff0c\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\u4e0d\u7a33\u5b9a\u662f\u6b63\u5e38\u7684\uff0c\u8fd9\u79cd\u6211\u4eec\u53ef\u4ee5\u7b49\u5f00\u53d1\u63d0\u6d4b\u4e4b\u540e\u518d\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u3002 \u529f\u80fd\u4e0d\u7a33\u5b9a\u6307\u7684\u662f\u7528\u4f8b\u6240\u6d89\u53ca\u7684\u529f\u80fd\uff0c\u53ef\u80fd\u5b58\u5728\u591a\u79cd\u53d8\u5316\uff0c\u6bcf\u6b21\u6267\u884c\u7528\u4f8b\u53ef\u80fd\u65ad\u8a00\u7684\u9884\u671f\u90fd\u4e0d\u540c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#9","title":"9. \u52a8\u6001\u65ad\u8a00","text":"\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u76f4\u5230\u7528\u4f8b\u7ed3\u675f\uff0c\u4e00\u76f4\u662f\u4e00\u4e2a\u52a8\u6001\u53d8\u5316\u7684\u8fc7\u7a0b\uff0c\u800c\u4e14\u65e0\u6cd5\u901a\u8fc7\u5176\u4ed6\u624b\u6bb5\u505c\u4e0b\u6765\uff1b \u6bd4\u5982\uff1a\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u65f6\uff0c\u53f3\u4e0b\u89d2\u7684\u5f55\u5236\u65f6\u95f4\u662f\u4e00\u76f4\u5728\u53d8\u5316\u7684\uff0c\u7528\u4f8b\u9700\u8981\u6d4b\u8bd5\u5f55\u52361\u5206\u949f\u4e4b\u540e\uff0c\u5f55\u5236\u65f6\u95f4\u662f\u521a\u597d\u505c\u572860\u79d2\uff1b \u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fd8\u505a\u4e0d\u5230\u65f6\u95f4\u7cbe\u51c6\u63a7\u5236\uff0c\u7a0b\u5e8f\u6267\u884c\u65f6\u95f4\u662f\u6709\u6ce2\u52a8\u7684\uff0c\u800c\u4e14\u8981\u9002\u914d\u591a\u4e2a\u5e73\u53f0\uff0c\u6240\u4ee5\u6b64\u7c7b\u7528\u4f8b\u5927\u6982\u7387\u4f1a\u6267\u884c\u5931\u8d25\u3002\u7279\u522b\u662f\u5728\u6027\u80fd\u8f83\u5dee\u7684\u56fd\u4ea7\u5316\u67b6\u6784\u4e0a\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u592a\u53ef\u80fd\u7a33\u5b9a\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#10","title":"10. \u63a2\u7d22\u6027\u6d4b\u8bd5","text":"\u63a2\u7d22\u6027\u6d4b\u8bd5\u901a\u5e38\u662f\u4e00\u4e9b\u4e0d\u786e\u5b9a\u7684\u64cd\u4f5c\uff0c\u591a\u53d8\u5207\u590d\u6742\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u9884\u671f\u4e5f\u53ef\u80fd\u662f\u4e0d\u786e\u5b9a\u7684\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u9a9a\u64cd\u4f5c\u592a\u591a\u4e86\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6b64\u7c7b\u7528\u4f8b\u9002\u5408\u91c7\u7528\u624b\u5de5\u6d4b\u8bd5\uff0c\u662f\u624b\u5de5\u6d4b\u8bd5\u771f\u6b63\u7684\u4ef7\u503c\u4f53\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#11","title":"11. \u6613\u7528\u6027\u6d4b\u8bd5","text":"\u5bf9\u4e8e\u6613\u7528\u6027\u7684\u5224\u65ad\u901a\u5e38\u662f\u4e3b\u89c2\u7684\uff0c\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\u5f88\u96be\u53bb\u5b9a\u4e49\u4ec0\u4e48\u6837\u7684\u60c5\u51b5\u5bf9\u7528\u6237\u662f\u6613\u7528\u7684\uff0c\u81ea\u52a8\u5316\u9700\u8981\u6709\u660e\u786e\u7684\u53ef\u5b9e\u73b0\u7684\u9884\u671f\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_2","title":"\u4e8c\u3001\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u524d\u9762\u8bb2\u4e86\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u4e00\u4e9b\u7528\u4f8b\u60c5\u51b5\uff0c\u6709\u540c\u5b66\u5c31\u8bf4\u4e86\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\u4e0d\u7528\u8bb2\u4e86\uff0c\u5c31\u662f\u4e0d\u9002\u5408\u7684\u53cd\u9762\u3002\u6ca1\u6bdb\u75c5\u54c8\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\uff0c\u6211\u4eec\u5927\u4f53\u8fd8\u53ef\u4ee5\u5206\u4e3a\u4e24\u7c7b\uff1a \u7b2c\u4e00\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u597d\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u7b2c\u4e8c\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u4e00\u822c\uff0c\u9700\u8981\u6295\u5165\u66f4\u591a\u7cbe\u529b\u624d\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u4ee5\u4e0b\u4ecb\u7ecd\u4e00\u4e9b\u6211\u4eec\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1_1","title":"1. \u64cd\u4f5c\u76f8\u5bf9\u7b80\u5355","text":"\u7528\u4f8b\u6b65\u9aa4\u76f8\u5bf9\u8f83\u5c11\uff0c\u8fd9\u79cd\u7528\u4f8b\u901a\u5e38\u662f\u4e00\u4e9b\u8def\u5f84\u5f88\u6d45\u7684\u7528\u4f8b\uff0c\u4e00\u822c\u4e5f\u662f\u4e00\u4e9b\u57fa\u7840\u7528\u4f8b\u3002\u7528\u4f8b\u7f16\u5199\u3001\u7ef4\u62a4\u90fd\u53ef\u4ee5\u8f7b\u677e\u641e\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2_1","title":"2. \u5bb9\u6613\u5b9e\u73b0","text":"\u73b0\u6709\u6280\u672f\u662f\u53ef\u5b9e\u73b0\u7684\uff0c\u6ca1\u6709\u96be\u5ea6\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3_1","title":"3. \u7ecf\u5e38\u7528\u4e8e\u56de\u5f52\u6d4b\u8bd5","text":"\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bcf\u6b21\u56de\u5f52\u6d4b\u8bd5\u5fc5\u987b\u8981\u6267\u884c\u7684\u7528\u4f8b\uff0c\u90a3\u4e48\u8fd9\u6761\u7528\u4f8b\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u3002 \u56de\u5f52\u6d4b\u8bd5\u65f6\u6211\u4eec\u9996\u5148\u5e94\u8be5\u4fdd\u8bc1\u5e94\u7528\u5386\u53f2\u57fa\u672c\u529f\u80fd\u6b63\u5e38\uff0c\u6240\u4ee5\u90a3\u4e9b\u6bcf\u6b21\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u90fd\u8981\u6267\u884c\u7684\u7528\u4f8b\u9002\u5408\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4_1","title":"4. \u529f\u80fd\u7a33\u5b9a\u7684\u6838\u5fc3\u529f\u80fd","text":"\u6d89\u53ca\u6838\u5fc3\u529f\u80fd\u7684\u7528\u4f8b\u662f\u6700\u6700\u91cd\u8981\u7684\u7528\u4f8b\uff0c\u4e5f\u662f\u6211\u4eec\u4ea4\u4ed8\u65f6\u5fc5\u987b\u8981\u4fdd\u8bc1\u8d28\u91cf\u7684\u76f8\u5173\u529f\u80fd\uff0c\u56e0\u6b64\u5e94\u8be5\u5c3d\u53ef\u80fd\u7684\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5_1","title":"5. \u8f93\u5165\u6570\u636e\u6d4b\u8bd5","text":"\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u901a\u5e38\u662f\u68c0\u9a8c\u88ab\u6d4b\u5e94\u7528\u63a5\u53d7\u6709\u6548\u6570\u636e\u3001\u62d2\u7edd\u65e0\u6548\u6570\u636e\u7684\u80fd\u529b\u3002\u5982\uff1a\u63d0\u4ea4\u8d85\u957f\u5b57\u7b26\u4e32\u3001\u7279\u6b8a\u5b57\u7b26\u4e32\u7b49\u7b49\u3002 \u6b64\u7c7b\u7528\u4f8b\u624b\u5de5\u6d4b\u8bd5\u5f88\u96be\u6bd4\u8f83\u5168\u9762\u7684\u8986\u76d6\u5230\u6240\u6709\u7684\u8f93\u5165\u60c5\u51b5\uff0c\u4f46\u662f\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\uff0c\u6b64\u7c7b\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u90fd\u662f\u4e00\u6837\u7684\uff0c\u53d8\u5316\u7684\u4ec5\u662f\u8f93\u5165\u53c2\u6570\u548c\u65ad\u8a00\u7ed3\u679c\uff0c\u91c7\u7528\u6570\u636e\u9a71\u52a8\uff0c\u53ef\u4ee5\u8f7b\u677e\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6_1","title":"6. \u683c\u5f0f\u8986\u76d6","text":"\u539f\u56e0\u540c\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u7c7b\u7528\u4f8b\u4e00\u6837\uff0c\u591a\u79cd\u683c\u5f0f\u7684\u8986\u76d6\u4e5f\u662f\u4e00\u4e2a\u5f88\u7e41\u7410\u7684\u4e8b\u60c5\uff0c\u4ea4\u7ed9\u81ea\u52a8\u5316\u6765\u505a\u518d\u5408\u9002\u4e0d\u8fc7\u4e86\u3002 \u6bd4\u5982\u5f71\u9662\u5bf9\u5f71\u7247\u683c\u5f0f\u7684\u68c0\u67e5\u3001\u622a\u56fe\u5f55\u5c4f\u5bf9\u4fdd\u5b58\u683c\u5f0f\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7_1","title":"7. \u68c0\u67e5\u5143\u7d20\u72b6\u6001","text":"\u67e5\u770b\u88ab\u6d4b\u5e94\u7528\u7684\u5143\u7d20\u5c5e\u6027\u3002\u5982\uff1a\u56fe\u7247\u7684\u5927\u5c0f\u548c\u6392\u5217\uff1b\u6309\u94ae\u7684\u53ef\u7528\u548c\u4e0d\u53ef\u7528\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/","title":"AT \u7ecf\u9a8c\u603b\u7ed3","text":"\u6b22\u8fce\u6240\u6709\u4eba\u63d0\u4ea4\u4f60\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u9762\u7684\u4f18\u79c0\u5b9e\u8df5\u7ecf\u9a8c\uff0c\u4ee5\u5e2e\u52a9\u5927\u5bb6\u89e3\u51b3\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#1","title":"1\u3001\u7ec8\u7ed3\u5668","text":"# litaoa@uniontech.com\n \u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4 pytest \u5b9e\u73b0\u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4\u7684\u65b9\u5f0f\u6709\u4e24\u79cd\uff0cyield \u548c\u7ec8\u7ed3\u51fd\u6570\uff1b yield \u5b9e\u73b0\uff0cyield\u524d\u9762\u4e3a\u7528\u4f8b\u7684\u524d\u7f6e\u6b65\u9aa4\uff0cyield \u540e\u9762\u4e3a\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4\u3002 @pytest.fixture\ndef clean_env():\nprint(\"setup\")\nyield\nprint(\"teardown\")\n \u7ec8\u7ed3\u51fd\u6570\u5b9e\u73b0\uff0c\u4f7f\u7528 request.addfinalizer \u6ce8\u518c\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4 @pytest.fixture\ndef clean_env(request):\ndef clean():\nprint(\"teardown\")\nrequest.addfinalizer(clean)\nprint(\"setup\")\n yield\u7684\u4f18\u7f3a\u70b9\uff1a \u4f18\u70b9\uff1a\u4ee3\u7801\u7b80\u6d01\uff0c\u76f4\u89c2\uff0c\u53ef\u4f7f\u7528yield\u5728\u7528\u4f8b\u4e2d\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c \u7f3a\u70b9\uff1a\u82e5\u524d\u7f6e\u6b65\u9aa4\u4e2d\u51fa\u73b0\u9519\u8bef\uff0c\u5219\u540e\u7f6e\u6b65\u9aa4\u4e0d\u4f1a\u6267\u884c \u7ec8\u7ed3\u51fd\u6570\uff1a \u4f18\u70b9\uff1a\u524d\u7f6e\u6b65\u9aa4\u5931\u8d25\u7684\u8bdd\uff0c\u540e\u7f6e\u6b65\u9aa4\u4ecd\u4f1a\u6267\u884c\u4e14\u53ef\u4ee5\u6ce8\u518c\u591a\u4e2a\u540e\u7f6e\u6b65\u9aa4\uff08\u524d\u63d0\uff1a\u9700\u8981\u5728\u4ee3\u7801\u62a5\u9519\u4e4b\u524d\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff09\uff0c\u652f\u6301\u7075\u6d3b\u4f7f\u7528\u540e\u7f6e\u6761\u4ef6 \u7f3a\u70b9\uff1a\u4ee3\u7801\u8f83\u4e3a\u590d\u6742\uff0c\u65e0\u6cd5\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c\uff08\u672c\u4eba\u76ee\u524d\u672a\u5b9e\u73b0\uff09 \u603b\u7ed3\uff1a\u5728\u524d\u7f6e\u6b65\u9aa4\u4fdd\u8bc1\u7edd\u5bf9\u4e0d\u4f1a\u51fa\u9519\u65f6\uff0c\u4f7f\u7528yield\u66f4\u4f73\u7b80\u4fbf\uff0c\u5f53\u524d\u7f6e\u6b65\u9aa4\u6613\u51fa\u73b0\u95ee\u9898\u65f6\uff0c\u63a8\u8350\u4f7f\u7528\u7ec8\u7ed3\u51fd\u6570\u3002 \u573a\u666f\uff1a\u4fdd\u9669\u7bb1\u7528\u4f8b\uff0c\u524d\u7f6e\u6b65\u9aa4\u4e2d\u5f00\u542f\u4fdd\u9669\u7bb1\uff0c\u540e\u7f6e\u6b65\u9aa4\u5220\u9664\u4fdd\u9669\u7bb1\u3002 @pytest.fixture(scope=\"session\", autouse=True)\ndef vault_fixture(request):\nDfmWidget.reset_vault_by_cmd() # 1\u3001\u91cd\u7f6e\u4fdd\u9669\u7bb1\nDdeDockPublicWidget().close_file_manager_by_cmd() # 2\u3001\u5173\u95ed\u6587\u7ba1\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 3\u3001\u5f00\u542f\u6587\u7ba1\nvault = DfmWidget()\nvault.create_file_vault() # 4\u3001\u521b\u5efa\u4fdd\u9669\u7bb1\ndef delete_vault(): # 8\u3001\u5220\u9664\u4fdd\u9669\u7bb1\u7684\u540e\u7f6e\u6b65\u9aa4\nsleep(2)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr()\nvault = DfmWidget()\nvault.delete_file_vault()\nDfmWidget.reset_vault_by_cmd()\nDdeDockPublicWidget().close_file_manager_by_cmd()\nrequest.addfinalizer(delete_vault) # 5\u3001\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\nDdeDockPublicWidget().close_file_manager_by_cmd() # 6\u3001\u5173\u95ed\u6587\u7ba1\nsleep(1)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 7\u3001\u5f00\u542f\u6587\u7ba1\n \u4ee3\u7801\u6309\u6ce8\u91ca\u4e2d\u7684\u5e8f\u53f7\u6267\u884c\u6b65\u9aa4 \u4ee3\u7801\u5728\u6b65\u9aa41-4\u4efb\u610f\u4f4d\u7f6e\u62a5\u9519\uff0c\u5219\u4e0d\u4f1a\u6267\u884c\u6b65\u9aa48\uff0c\u56e0\u4e3a\u672a\u6267\u884c\u5230\u6b65\u9aa45\uff0c\u6b65\u9aa48\u8fd8\u672a\u6ce8\u518c \u4ee3\u7801\u5728\u6b65\u9aa46-7\u62a5\u9519\uff0c\u4ecd\u4f1a\u6267\u884c\u6b65\u9aa47\uff0c\u56e0\u4e3a\u5728\u6b65\u9aa45\u4e2d\u5df2\u7ecf\u5c06\u6b65\u9aa47\u6ce8\u518c \u53ef\u4ee5\u7075\u6d3b\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff0c\u80fd\u5b9e\u73b0\u67d0\u4e2a\u524d\u7f6e\u6b65\u9aa4\u6267\u884c\u4e4b\u540e\uff0c\u624d\u4f1a\u6267\u884c\u540e\u7f6e\u6b65\u9aa4\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#2","title":"2\u3001\u542f\u52a8\u5e94\u7528\u7684\u65b9\u5f0f","text":"# huangmingqiang@uniontech.com\n \uff081\uff09\u547d\u4ee4\u884c\u542f\u52a8 \u5728 AT \u4ee3\u7801\u4e2d\u4f7f\u7528\u547d\u4ee4\u884c\u542f\u52a8\u5e94\u7528\uff0c\u4e3e\u4f8b\uff1a os.popen(\"deepin-music\")\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f7f\u7528 ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6\uff0cdogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u3002 \uff082\uff09\u901a\u8fc7 UI \u64cd\u4f5c\u542f\u52a8 \u901a\u8fc7\u4efb\u52a1\u680f\u3001\u542f\u52a8\u5668\u3001\u684c\u9762\u7b49UI\u65b9\u5f0f\u542f\u52a8\uff0c\u6bd4\u5982\u53cc\u51fb\u6253\u5f00\u3001\u53f3\u952e\u6253\u5f00\u7b49\uff0c\u8fd9\u79cd\u64cd\u4f5c\u65b9\u5f0f\u4e0d\u5b58\u5728ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6dogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u7684\u95ee\u9898\uff0c\u4e5f\u66f4\u52a0\u7b26\u5408\u7528\u6237\u7684\u64cd\u4f5c\u884c\u4e3a\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#3","title":"3\u3001\u6587\u4ef6\u9009\u62e9\u6846\u5c5e\u6027\u5b9a\u4f4d\u5076\u73b0\u65e0\u6cd5\u627e\u5230","text":"\u6587\u4ef6\u9009\u62e9\u6846\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5728\u8c03\u7528\u6587\u4ef6\u9009\u62e9\u6846\u65f6\uff0c\u6709\u4e00\u5b9a\u7684\u6982\u7387\u51fa\u73b0\uff0c\u754c\u9762\u5df2\u7ecf\u6e32\u67d3\u51fa\u6765\u4e86\uff0c\u4f46\u662f\u5c5e\u6027\u6811\u5e76\u6ca1\u6709\u5199\u5165\uff0c\u5bfc\u81f4\u901a\u8fc7\u5c5e\u6027\u65e0\u6cd5\u627e\u5230\u5143\u7d20\uff0c\u76ee\u524d\u4e5f\u6ca1\u6709\u5f88\u597d\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u4e3a\u4e86\u7528\u4f8b\u7a33\u5b9a\u6027\uff0c\u6587\u4ef6\u9009\u62e9\u6846\u7684\u64cd\u4f5c\u5efa\u8bae\u4f7f\u7528UI\u6216\u8005\u56fe\u7247\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u53ef\u4ee5\u901a\u8fc7\u641c\u7d22\u5185\u5bb9\u56fa\u5b9a\u6587\u4ef6\u4f4d\u7f6e\u3002 # litaoa@uniontech.com\n desk = DdeDesktopPublicWidget()\n# \u9009\u62e9\u89c6\u9891\u76ee\u5f55\ndesk.click_videos_dir_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.ctrl_f()\nsleep(1)\ndesk.input_message(\"\u5143\u7d20\u540d\u79f0\")\nsleep(0.5)\ndesk.enter()\nsleep(1)\n# \u9009\u62e9\u7b2c\u4e00\u4e2a\u6587\u4ef6\ndesk.click_list_view_btn_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.click_first_file_in_desktop_plugs_by_ui()\nsleep(1)\n# \u6587\u7ba1\u63d2\u4ef6\u4e2d\u70b9\u51fb\u6253\u5f00\ndesk.click_open_btn_in_desktop_plugs_by_ui()\n"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#4","title":"4\u3001\u5e94\u7528\u542f\u52a8","text":"# mikigo\n \u5728UI\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u4e00\u5207\u64cd\u4f5c\u7684\u90fd\u662f\u4ece\u5e94\u7528\u542f\u52a8\u5f00\u59cb\u7684\uff0c\u800c\u5728Linux\u684c\u9762\u5e94\u7528\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u6211\u4eec\u542f\u52a8\u5e94\u7528\u7684\u65b9\u6cd5\u6709\u591a\u79cd\uff0c\u4e0b\u9762\u505a\u4e00\u4e2a\u7b80\u5355\u7684\u4ecb\u7ecd\uff1a \u3010\u4f7f\u7528dogtail\u542f\u52a8\u3011 dogtail\u63d0\u4f9b\u4e86\u5e94\u7528\u542f\u52a8\u7684\u65b9\u6cd5\uff0c\u5728utils\u5e93\u4e2d\uff0c\u4f7f\u7528run\u65b9\u6cd5\u542f\u52a8\uff1a \u9996\u5148\u5bfc\u5165\u65b9\u6cd5\uff1a from dogtail.utils import *\n \u8c03\u7528run\u65b9\u6cd5 run('deepin-music')\n \u5373\u53ef\u542f\u52a8\u97f3\u4e50 \u8fd9\u79cd\u65b9\u6cd5\u7684\u4f18\u70b9\u662f\u91c7\u7528\u8fdb\u7a0b\u7684\u65b9\u5f0f\u76f4\u63a5\u542f\u52a8\uff0c\u4e0d\u4f9d\u8d56\u4e0eUI\uff0c\u65e0\u8bba\u684c\u9762\u6216\u4efb\u52a1\u680f\u4e0a\u662f\u5426\u5b58\u5728\u5e94\u7528\u56fe\u6807\uff0c\u90fd\u53ef\u4ee5\u6b63\u5e38\u542f\u52a8\u3002 \u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c \u5982\u679c\u4f7f\u7528ssh\u8fdc\u7a0b\u8c03\u7528\uff0c\u6216\u8005Jenkins\u4e2d\u6267\u884c\u6d4b\u8bd5\u811a\u672c\u7684\u65f6\u5019\uff0c\u5728sniff\u4e2d\u4f1a\u51fa\u73b0\u627e\u4e0d\u5230\u5e94\u7528\uff0c\u7ecf\u8fc7\u5206\u6790\uff0c\u53ef\u80fd\u662f\u56e0\u4e3a\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\u542f\u52a8\u7684\u65f6\u5019\uff0c\u5b9e\u9645\u662f\u91c7\u7528\u4e00\u4e2a\u5b50\u8fdb\u7a0b\u542f\u52a8\u4e86\u5e94\u7528\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u5230\u3002 \u3010\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u3011 \u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807 \u901a\u5e38\u6709\u4e24\u79cd\u65b9\u6cd5\uff1a \uff081\uff09\u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807\u3002 \uff082\uff09\u5df2\u77e5\u5e94\u7528\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u7684\u4f4d\u7f6e\uff0c\u7136\u540e\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u5bf9\u5e94\u5750\u6807\u3002 \u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u7f3a\u70b9\u662f\u4f4d\u7f6e\u5fc5\u987b\u56fa\u5b9a\uff0c\u5982\u679c\u79fb\u52a8\u4f4d\u7f6e\u5c31\u4e0d\u884c\u4e86\uff0c\u800c\u4f7f\u7528\u7b2c\u4e00\u79cd\u65b9\u6cd5\uff0c\u65e0\u8bba\u4f4d\u7f6e\u5728\u54ea\u91cc\uff0c\u53ea\u8981\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u5b58\u5728\u5373\u53ef\u3002 \u3010\u70b9\u51fb\u684c\u9762\u56fe\u6807\u542f\u52a8\u3011 \u684c\u9762\u56fe\u6807\u76ee\u524d\u662f\u91c7\u7528\u56fe\u50cf\u8bc6\u522b\u6280\u672f\uff0c\u5b9a\u4f4d\u5230\u5e94\u7528\u56fe\u6807\u7684\u5750\u6807\uff0c\u7136\u540e\u901a\u8fc7pyauogui\u8fdb\u884c\u70b9\u51fb\u64cd\u4f5c\u3002 \u8be6\u7ec6\u6280\u672f\u65b9\u6848\u53ef\u4ee5\u53c2\u8003\u6211\u7684\u53e6\u5916\u4e24\u7bc7\u535a\u5ba2: \u57fa\u4e8eopencv\u7684\u6a21\u677f\u5339\u914d\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd4\u56de\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 Python\u4e09\u65b9\u5e93PyAutoGui\u7684\u4f7f\u7528\u65b9\u6cd5 \u3010\u4ece\u542f\u52a8\u5668\u542f\u52a8\uff08\u4fd7\u79f0\u5f00\u59cb\u83dc\u5355\uff09\u3011 \u542f\u52a8\u4e2d\u542f\u52a8\u7684\u5b9e\u73b0\u903b\u8f91\u5b9e\u9645\u548c\u4efb\u52a1\u680f\u4e0a\u542f\u52a8\u5dee\u4e0d\u591a\u3002 \u9996\u5148\uff0c\u9700\u8981\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u542f\u52a8\u5668\u56fe\u6807\uff0c\u6216\u8005\u952e\u76d8super\u952e\uff0c\u5c06\u542f\u52a8\u5668\u547c\u51fa\u6765\uff0c \u7136\u540e\uff0c\u5728\u542f\u52a8\u5668\u4e2d\u70b9\u51fb\u5bf9\u5e94\u7684\u56fe\u6807\uff0c \u4f46\u662f\u8fd9\u91cc\u6709\u4e2a\u95ee\u9898\uff0c\u542f\u52a8\u5668\u4e2d\u7684\u5e94\u7528\u5217\u8868\uff0c\u4e00\u9875\u5c55\u793a\u4e0d\u5b8c\uff0c\u6240\u4ee5\u5982\u679c\u6211\u4eec\u8981\u70b9\u51fb\u7684\u5e94\u7528\u56fe\u6807\u4e0d\u5728\u7b2c\u4e00\u9875\u600e\u4e48\u529e\uff0c\u901a\u5e38\u89e3\u51b3\u65b9\u6848\u6709\u4e24\u79cd\uff1a \uff081\uff09\u9700\u8981\u8fdb\u884c\u5411\u4e0b\u6ed1\u52a8\uff0c\u8fd9\u91cc\u5c31\u6d89\u53ca\u5230\u76f8\u5e94\u7684\u8bc6\u522b\u65b9\u6848\uff0c\u5224\u65ad\u5982\u679c\u4e0d\u5728\u7b2c\u4e00\u9875\u5c31\u5f80\u4e0b\u6ed1\u52a8\u7ffb\u9875\u3002 \uff082\uff09\u542f\u52a8\u5668\u63d0\u4f9b\u641c\u7d22\u7684\u529f\u80fd\uff0c\u8f93\u5165\u5e94\u7528\u540d\u79f0\u641c\u7d22\uff0c\u7136\u540e\u8fdb\u884c\u70b9\u51fb\u3002 \u4ece\u5b9e\u9645\u64cd\u4f5c\u4e2d\u6765\u770b\uff0c\u91c7\u7528\u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u6548\u7387\u4f1a\u9ad8\u4e00\u70b9\u3002 \u3010\u7ec8\u7aef\u547d\u4ee4\u542f\u52a8\u3011 \u5728python\u4e2d\uff0c\u4f7f\u7528os.popen()\u6216os.system()\u6216\u8005subprocess.Popen()\uff0c\u5b9e\u73b0\u547d\u4ee4\u884c\u542f\u52a8\uff0c\u6bd4\u5982\uff1a import os\nos.popen('deepin-music')\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u8fdc\u7a0b\u6267\u884c\u811a\u672c\u7684\u65f6\u5019\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u7684\u95ee\u9898\u3002 \u3010\u603b\u7ed3\u3011 \u4ee5\u4e0a\u51e0\u79cd\u65b9\u6cd5\uff0c\u5404\u6709\u4f18\u7f3a\u70b9\uff0c\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff1a \uff081\uff09\u5982\u679c\u9700\u8981\u5728Jenkins\u4e2d\u505a\u6301\u7eed\u96c6\u6210\uff0c\u5efa\u8bae\u4f7f\u7528\u7b2c\u4e8c\u79cd\u4efb\u52a1\u680f\u542f\u52a8\u7684\u65b9\u6cd5\u3002 \uff082\uff09\u5982\u679c\u4e0d\u4f1a\u91c7\u7528\u8fdc\u7a0b\u6267\u884c\u7684\uff0c\u5efa\u8bae\u91c7\u7528\u7b2c\u4e00\u79cd\u6216\u8005\u6700\u540e\u4e00\u79cd\u65b9\u6848\u3002 \uff083\uff09\u7b2c\u4e09\u79cd\u548c\u7b2c\u56db\u79cd\u542f\u52a8\u65b9\u6cd5\uff0c\u901a\u5e38\u5728\u6d4b\u8bd5\u7528\u4f8b\u4e2d\u4f1a\u6d89\u53ca\u5230\uff0c\u6240\u4ee5\u5076\u5c14\u4f1a\u7528\u3002"},{"location":"RELEASE/","title":"\u7248\u672c\u66f4\u65b0\u8bb0\u5f55","text":""},{"location":"RELEASE/#220202395","title":"2.2.0\uff082023/9/5\uff09","text":"new \u6b63\u5f0f\u542f\u7528 letmego \u6280\u672f\u65b9\u6848\uff1b fix \u5bf9 docs \u91cc\u9762\u7ec6\u5316\u4e86\u8fdc\u7a0b\u6267\u884c\u7ae0\u8282\u7684\u63cf\u8ff0\uff1b "},{"location":"RELEASE/#2152023831","title":"2.1.5\uff082023/8/31\uff09","text":"new \u5c06\u6709\u8da3\u7684\u6587\u6863\u7cfb\u7edf\u8fc1\u79fb\u5230 linuxdeepin \uff0c\u5265\u79bb\u6587\u6863\u4e2d\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u91c7\u7528 CDN \u52a0\u901f\u65b9\u5f0f\u52a0\u8f7d\uff1b \u5c1d\u8bd5\u5408\u5165\u4e00\u4e2a\u6709\u8da3\u7684\u529f\u80fd\uff1b fix \u4fee\u590d\u4e86 Wayland \u952e\u9f20\u5de5\u5177\u6ca1\u6709\u9f20\u6807\u76f8\u5bf9\u79fb\u52a8\u65b9\u6cd5 moveRel \u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 Wayland \u4e0b\u83b7\u53d6\u7a97\u53e3\u4fe1\u606f\u529f\u80fd\u6a21\u5757\u4e2d\u73af\u5883\u53d8\u91cf\u7684\u95ee\u9898\uff1b \u4f18\u5316\u4e86 startproject \u529f\u80fd\u7684\u4e00\u4e9b\u4fe1\u606f\u8f93\u51fa\uff1b \u4fee\u590d\u4e86\u7279\u6b8a\u573a\u666f\u4e0b env_dev.sh \u5f00\u53d1\u73af\u5883\u90e8\u7f72\u662f\u53ef\u80fd\u5f71\u54cd\u5230\u6b63\u5f0f\u73af\u5883 env.sh \u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#2122023822","title":"2.1.2\uff082023/8/22\uff09","text":"new \u589e\u52a0 OCR \u8bc6\u522b\u81ea\u52a8\u91cd\u8bd5\u673a\u5236\uff0c\u9ed8\u8ba4\u91cd\u8bd5 2 \u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u91cd\u8bd5\u6b21\u6570\uff1b \u4f7f\u7528\u7a97\u7ba1\u6700\u65b0\u63d0\u4f9b\u7684\u4e8c\u8fdb\u5236\u63a5\u53e3\uff0c\u4f18\u5316\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u5728 Wayland \u4e0b\u83b7\u53d6\u7a97\u53e3\u4fe1\u606f\u7684\u65b9\u6cd5\uff1b\u611f\u8c22\u684c\u9762\u6d4b\u8bd5\u90e8 @\u4f55\u6743 @\u5b59\u7fe0 \u3001\u7a97\u7ba1\u7814\u53d1 @\u9ec4\u6cfd\u94ed \u7684\u5927\u529b\u652f\u6301\u3002 \u6269\u5145 skipif \u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\u51fd\u6570\uff1a skipif_xdg_type \u652f\u6301 x11 \u6216 wayland \u4e0a\u8df3\u8fc7\uff1b skipif_cpu_name \u652f\u6301\u4e0d\u540c cpu \u4e0a\u8df3\u8fc7\uff0c\u6bd4\u5982\uff1askipif_cpu_name-KLVVW5821\uff1b "},{"location":"RELEASE/#2102023818","title":"2.1.0\uff082023/8/18\uff09","text":"fix \u4fee\u590d SW \u67b6\u6784\u73af\u5883\u4f9d\u8d56\u7684\u95ee\u9898\uff0c\u539f\u56e0\u662f\u4e4b\u524d\u6211\u8fd9\u91cc\u672c\u5730\u6ca1\u6709 SW \u7684\u673a\u5668\uff0c\u6ca1\u6709\u505a\u76f8\u5173\u9002\u914d\uff1b \u4fee\u590d\u5b50\u9879\u76ee\u5355\u72ec\u9700\u8981\u4e09\u65b9\u5305 pexpect\uff0c\u7531\u4e8e\u4e4b\u524d\u662f\u9884\u88c5\u5230\u955c\u50cf\u91cc\u9762\u7684\uff0c\u4f46\u57fa\u7840\u6846\u67b6\u4e0d\u9700\u8981\uff0c\u56e0\u6b64\u6ca1\u6709\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u91cc\u9762\uff0c\u5bfc\u81f4\u5b50\u9879\u76ee\u4f9d\u8d56\u62a5\u9519\u3002 \u4fee\u590d\u5b50\u9879\u76ee cv \u5bfc\u5165\u62a5\u9519\u7684\u95ee\u9898\uff1b \u539f\u56e0\u4e3a\uff1ayouqu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u517c\u5bb9\u4e24\u79cd\u60c5\u51b5\uff0c\u4e00\u79cd\u662f\u9762\u5411\u670d\u52a1\uff0c\u5c31\u662f\u672c\u5730\u6d4b\u8bd5\u673a\u4e0d\u9700\u8981\u5b89\u88c5 OpenCV\uff0c\u7528\u4f8b\u4e2d\u7684\u56fe\u50cf\u8bc6\u522b\u4f1a\u901a\u8fc7\u8fdc\u7a0b\u670d\u52a1\u63a5\u53e3\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u548c\u7ed3\u679c\u83b7\u53d6\uff1b\u7b2c\u4e8c\u79cd\u662f\u539f\u751f\uff0c\u5c31\u662f\u672c\u5730\u76f4\u63a5\u5b89\u88c5 OpenCV \u76f4\u63a5\u7528\u3002\u4e24\u4e2a\u60c5\u51b5\u7684\u4f18\u5148\u7ea7\u662f\u4f18\u5148\u5224\u65ad\u672c\u5730\u5b58\u5728\uff0c\u5426\u5219\u8d70\u670d\u52a1\u3002 \u524d\u9762\u6211\u4eec\u5df2\u7ecf\u628a OCR \u529f\u80fd\u505a\u4e86\u670d\u52a1\u5316\uff0c\u57fa\u4e8e 1 \u5e74\u591a\u4ee5\u6765\u7684\u89c2\u5bdf\uff0c\u7528\u8d77\u6765\u5f88\u7a33\u5b9a\uff0c\u518d\u4e00\u4e2a\u5c31\u662f OpenCV \u5b89\u88c5\u5305\u662f\u6bd4\u8f83\u81c3\u80bf\u7684\uff0c\u7c97\u7565\u6570\u4e86\u4e0b\u4f9d\u8d56\u6709 30+ \u4e2a\uff0c\u800c\u4e14\u5728\u5404\u67b6\u6784\u4e0a\u4f9d\u8d56\u5305\u8fd8\u4e0d\u5c3d\u76f8\u540c\uff0c\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u65b9\u6848\u4e2d\u4e0d\u592a\u597d\u5904\u7406\uff0c\u6240\u4ee5\u672c\u6b21 2.0 \u7248\u672c\u6211\u4eec\u5927\u80c6\u7684\u5c06\u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u529f\u80fd\u4fee\u6539\u4e3a\u9762\u5411\u670d\u52a1\u7684\u65b9\u5f0f\uff0c\u524d\u671f\u6d4b\u8bd5\u4e00\u5207\u770b\u8d77\u6765\u90fd\u5f88\u548c\u8c10\u3002 \u4f46\u662f\u6ca1\u6ce8\u610f\u5230\u4e4b\u524d\u7ed9\u6d77\u71d5\u59d0\u90a3\u8fb9\u9879\u76ee\u5355\u72ec\u5b9a\u5236\u505a\u4e86\u4e2a\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\uff08\u4e3a\u4e86\u80fd\u7b80\u5355\u5e73\u6ed1\u7684\u8fc1\u79fb\u5230 youqu\uff09\uff0c\u6b64\u63a5\u53e3\u5e95\u5c42\u6ca1\u6709\u517c\u5bb9\u670d\u52a1\u5316\uff0c\u6240\u4ee5\u5979\u90a3\u8fb9\u7684\u9879\u76ee\u8c03\u7528\u6b64\u5b9a\u5236\u63a5\u53e3\u4f1a\u62a5 cv \u5bfc\u5165\u7684\u95ee\u9898\u3002 \u7531\u4e8e\u5c06\u8fd9\u4e2a\u5b9a\u5236\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\u8fdb\u884c\u670d\u52a1\u5316\u517c\u5bb9\u6539\u9020\u9700\u8981\u4e00\u5b9a\u65f6\u95f4\uff0c\u6539\u5b8c\u8fd8\u9700\u8981\u6d4b\u8bd5\uff0c\u4f46\u672c\u6b21\u65f6\u95f4\u6bd4\u8f83\u7d27\uff0c\u56e0\u6b64\u5148\u628a OpenCV \u88c5\u8fdb\u865a\u62df\u73af\u5883\uff0c\u540e\u7eed\u7248\u672c\u518d\u8003\u8651\u9488\u5bf9\u6b64\u63a5\u53e3\u505a\u4fee\u6539\u3002"},{"location":"RELEASE/#2002023816","title":"2.0.0\uff082023/8/16\uff09","text":"YouQu\uff08\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff09\u5f00\u6e90\u4e86\uff0c\u540c\u65f6\u63a8\u51fa\u4e86 2.0 \u7248\u672c\u3002 \u611f\u8c22\u738b\u6ce2\u603b\u3001\u67b6\u6784\u5e08\u5f90\u5c0f\u4e1c\u3001\u7814\u53d1\u7ecf\u7406\u90d1\u5e7c\u6208\u3001\u5218\u90d1\u7b49\u7814\u53d1\u540c\u4e8b\u7684\u5927\u529b\u652f\u6301\u3002 new 1\u3001\u65b0\u7684\u57fa\u7840\u6846\u67b6\u4ee3\u7801\u83b7\u53d6\u65b9\u5f0f\u53ca\u65b0\u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4 YouQu \u540e\u7eed\u5747\u901a\u8fc7 PyPI \u8fdb\u884c\u5305\u7684\u53d1\u5e03\uff0c\u4e5f\u5c31\u662f\u8bf4\u540e\u7eed\u53ef\u4ee5\u4f7f\u7528 pip \u8fdb\u884c\u5b89\u88c5\uff1a sudo pip3 install youqu==2.0.0\n \u8fd9\u91cc\u6709 2 \u4e2a\u5c0f\u70b9\u8981\u6ce8\u610f\uff1a \u63a8\u8350\u4f7f\u7528 sudo pip3 \uff08\u52a0 sudo\uff09\u8fdb\u884c\u5b89\u88c5\uff1b \u5982\u679c\u4e0d\u52a0 sudo \u6709\u4e9b\u673a\u5668\u53ef\u80fd $HOME/.local/bin \u4e0d\u5728\u7cfb\u7edf PATH \u73af\u5883\u76ee\u5f55\u4e0b\uff0c\u5728\u4e0d\u6dfb\u52a0\u73af\u5883\u53d8\u91cf\u7684\u60c5\u51b5\u4e0b\uff0c\u4f1a\u51fa\u73b0 YouQu \u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4\uff08youqu-startproject\uff09\u65e0\u6cd5\u4f7f\u7528\u7684\u95ee\u9898\uff1b \u5f53\u7136\uff0c\u5c06\u4e0a\u8ff0\u8def\u5f84\u6dfb\u52a0\u5230\u73af\u5883\u53d8\u91cf\u4e4b\u540e\u4e5f\u662f\u53ef\u4ee5\u7528\u7684\uff0c\u6240\u4ee5\u6211\u8fd9\u91cc\u662f\u63a8\u8350\u52a0 sudo\uff0c\u4e0d\u52a0 sudo \u4e5f\u662f\u53ef\u4ee5\u7684\uff0c\u53ea\u662f\u9700\u8981\u5173\u6ce8\u4e0b\u73af\u5883\u53d8\u91cf\u7684\u95ee\u9898\u3002 \u63a8\u8350\u6307\u5b9a\u7248\u672c\u53f7\uff08youqu==2.0.0\uff09\u5b89\u88c5\uff0c\u5982\u679c\u4e0d\u6307\u5b9a\u7248\u672c\u53f7\u9ed8\u8ba4\u662f\u5b89\u88c5\u6700\u65b0\u53d1\u5e03\u7684 YouQu \u7248\u672c\uff0c\u4f60\u53ef\u4ee5\u5728 PyPI \u4e0a\u7684 Release history \u91cc\u9762\u67e5\u770b\u6709\u54ea\u4e9b\u7248\u672c\u3002 \u5b89\u88c5\u4e4b\u540e\u4f1a\u81ea\u52a8\u751f\u6210\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu-startproject\uff0c\u4f7f\u7528\u5b83\u53ef\u4ee5\u521d\u59cb\u5316\u5de5\u7a0b\uff0c\u8fd9\u91cc\u4ee5\u97f3\u4e50\u4e3e\u4f8b\uff1b youqu-startproject autotest_deepin_music\n \u8fd9\u6837\u5c31\u4f1a\u5728\u5f53\u524d\u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a autotest_deepin_music \u76ee\u5f55\uff0c\u91cc\u9762\u5305\u542b\u4e86\u57fa\u7840\u6846\u67b6\u6240\u6709\u7684\u4ee3\u7801\uff1b \u4e4b\u540e\uff0c\u8fd8\u662f\u5728 apps \u76ee\u5f55\u4e0b\uff0c\u653e\u5165\u5b50\u9879\u76ee\u7684AT\u4ee3\u7801\u5373\u53ef\uff0c\u4f7f\u7528\u65b9\u6cd5\u548c\u8fc7\u53bb\u4e00\u6837\uff0c\u8fd9\u91cc\u5c31\u4e0d\u591a\u4ecb\u7ecd\u3002 \u53e6\u5916\uff0c\u9664\u4e86\u901a\u8fc7 pip \u83b7\u53d6\u4ee5\u5916\uff0c\u4ecd\u7136\u53ef\u4ee5\u901a\u8fc7\u6e90\u7801\u83b7\u53d6\uff08\u76f4\u63a5 git clone\uff09\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u4f7f\u7528 pip \u5b89\u88c5 YouQu \u65f6\uff0cYouQu \u5305\u7684\u5927\u5c0f\u624d 600+ k\uff0c\u5b89\u88c5\u901f\u5ea6\u8d77\u98de\u3002 2\u3001\u65b0\u7684AT\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848 \u4e3a\u4e86\u89e3\u51b3\u4ee5\u4e0b\u95ee\u9898\uff1a \u8fc7\u53bb\u4e00\u6bb5\u65f6\u95f4\u54b1\u4eec\u7ecf\u5e38\u51fa\u73b0\u7684\uff0c\u4e0d\u540c\u7684AT\u9879\u76ee\u5728\u540c\u4e00\u53f0\u673a\u5668\u4e0a\u90e8\u7f72\u73af\u5883\u65f6\u4f9d\u8d56\u7248\u672c\u51b2\u7a81\u7684\u95ee\u9898\uff0c\u65b0\u65b9\u6848\u4e0d\u540c\u7684\u9879\u76ee\u4f1a\u52a8\u6001\u751f\u6210\u81ea\u5df1\u7684\u865a\u62df\u73af\u5883\uff0c\u76f8\u4e92\u4e4b\u95f4\u4e0d\u5f71\u54cd\uff1b \u4e1a\u5185\u4e3a\u4e86\u89e3\u51b3\u7248\u672c\u51b2\u7a81\u95ee\u9898\u4e00\u822c\u90fd\u4f1a\u4f7f\u7528Python\u865a\u62df\u73af\u5883\u7684\u5de5\u5177\uff0c\u4f46\u662f\u90fd\u6709\u4e2a\u95ee\u9898\uff0c\u65e0\u6cd5\u7ba1\u7406 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u5305\uff0c\u672c\u6b21\u6211\u4eec\u89e3\u51b3\u4e86\u8fd9\u4e2a\u95ee\u9898\uff0c\u80fd\u591f\u5b8c\u5168\u7ba1\u7406\u5e38\u89c4\u7684Python\u5305\uff0c\u4e5f\u80fd\u7ba1\u7406\u5230 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u4e09\u65b9\u5305\uff1b \u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u4f7f\u7528\u65b9\u6cd5\uff1a bash env.sh\n \u53ef\u4ee5\u770b\u51fa\u6765\u548c\u539f\u6765\u4f7f\u7528\u65b9\u6cd5\u6ca1\u6709\u53d8\u5316\uff0c\u4e5f\u5c31\u662f\u8bf4\u4ece\u4f7f\u7528\u7684\u89d2\u5ea6\u662f\u5b8c\u5168\u6ca1\u6709\u533a\u522b\u7684\uff0c\u53ea\u662f\u5185\u90e8\u505a\u4e86\u4e0d\u540c\u7684\u4e8b\u60c5\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u672c\u673a\u90e8\u7f72\u7684\u529f\u80fd\u4ecd\u7136\u4fdd\u7559 env_dev.sh\uff0c\u53ef\u4ee5\u4f5c\u4e3a\u5f00\u53d1\u65f6\u7684\u73af\u5883\u90e8\u7f72\u3002 3\u3001\u65b0\u7684\u9a71\u52a8\u547d\u4ee4 \u8fc7\u53bb\u54b1\u4eec\u90fd\u662f\u4f7f\u7528\u8fd9\u6837\u7684\u547d\u4ee4\u6765\u9a71\u52a8\u6267\u884c\uff1a python3 manage.py run\n \u7531\u4e8e\u9ed8\u8ba4\u57fa\u4e8e\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848\uff0c\u56e0\u6b64\u6211\u4eec\u589e\u52a0\u4e86\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu\uff1b \u65b0\u7684\u9a71\u52a8\u65b9\u5f0f\uff1a youqu manage.py run\n \u53ea\u9700\u8981\u628a python3 \u66ff\u6362\u6210 youqu \u5c31\u53ef\u4ee5\u4e86\uff0c\u770b\u8d77\u6765\u5f88\u548c\u8c10~ 4\u3001\u65b0\u7684\u6587\u6863\u5730\u5740 \u8fc7\u53bb\u54b1\u4eec YouQu \u7684\u5728\u7ebf\u6587\u6863\u662f\u90e8\u7f72\u5728\u516c\u53f8\u5185\u7f51\u7684\uff0c\u73b0\u5728\u5f00\u6e90\u5230 github \u4e86\uff0c\u5916\u90e8\u5f00\u53d1\u8005\u80af\u5b9a\u8bbf\u95ee\u4e0d\u5230\u5185\u7f51\u7684\u6587\u6863\uff0c\u56e0\u6b64\u9700\u8981\u5c06\u6587\u6863\u90e8\u7f72\u5230\u516c\u7f51\u3010\u516c\u7f51\u6587\u6863\u3011\uff1b \u516c\u7f51\u6587\u6863\u4f7f\u7528\u7684\u662f github pages\uff08\u767d\u5ad6\u602a\u4e00\u987f\u72c2\u559c~~\uff09\uff0c\u4f46\u53ef\u80fd\u4f1a\u51fa\u73b0\u6587\u6863\u901f\u5ea6\u6162\u7684\u95ee\u9898\uff08\u4ee3\u7406\u4e0b\u5c31\u597d\u4e86\uff09\uff0c\u4e0d\u8fc7\u6ca1\u5173\u7cfb\uff0c\u54b1\u4eec\u3010\u5185\u7f51\u6587\u6863\u3011\u4ecd\u7136\u4fdd\u7559\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u3002 5\u3001\u5176\u4ed6\u4e00\u4e9b\u5c0f\u5c0f\u529f\u80fd\u66f4\u65b0\uff1a \uff081\uff09\u65b0\u589e\u5173\u95ed\u5206\u8fa8\u7387\u68c0\u6d4b\u7684\u53c2\u6570\u503c\uff1b youqu manage.py run --resolution no\n \u6216\u8005\u4fee\u6539 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387, \u6bd4\u5982\uff1a1920x1080\n;no: \u8868\u793a\u4e0d\u505a\u5206\u8fa8\u7387\u6821\u9a8c\nRESOLUTION = 1920x1080\n resolution \u8fd9\u4e2a\u53c2\u6570\u4e00\u76f4\u90fd\u6709\u7684\uff0c\u53ea\u4e0d\u8fc7\u4e4b\u524d\u662f\u7528\u4e8e\u6307\u5b9a\u5206\u8fa8\u7387\u5927\u5c0f\uff0c\u6bd4\u5982 --resolution 1920x1080\uff0c\u4f46\u6709\u4e9b\u63a5\u53e3\u7684\u9879\u76ee\u4e0d\u9700\u8981\u8fd9\u4e2a\u68c0\u67e5\uff0c\u53ef\u4ee5\u7ed9\u5b83\u4e2a no \u5c31\u597d\u4e86\uff0c\u5f53\u7136 CICD \u4e0a\u5173\u95ed\uff0c\u9700\u8981\u6d41\u6c34\u7ebf\u4e0a\u628a\u8fd9\u4e2a\u53c2\u6570\u52a0\u4e0a\uff1b \uff082\uff09\u65b0\u589e\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u7684\u547d\u4ee4\u884c\u53c2\u6570 \u4e4b\u524d\u8fd9\u4e2a\u914d\u7f6e\u9879\u53ea\u80fd\u5728 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c 1 \u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff0cRERUN >= RECORD_FAILED_CASE\u3002\n;1.\u5173\u95ed\u5f55\u5c4f\uff1aRECORD_FAILED_CASE > RERUN\n;2.\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1aRECORD_FAILED_CASE = 0\nRECORD_FAILED_CASE = 1\n \u73b0\u5728\u5c06\u5f00\u53d1\u5230\u547d\u4ee4\u884c\u53c2\u6570\u3002 youqu manage.py run --record_failed_case 2\n fix \u4fee\u590d remote \u6267\u884c\u65f6\uff0c\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u65e0\u6cd5\u751f\u6210\u6d4b\u8bd5\u62a5\u544a\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1302023710","title":"1.3.0\uff082023/7/10\uff09","text":"fix \u8fdb\u4e00\u6b65\u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b\u53c2\u8003\uff1a\u914d\u7f6ePython\u6e90\u7684\u51e0\u79cd\u65b9\u6cd5 \u4fee\u590d wayland_autotool \u53d7\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86wayland\u4e0b\u5076\u73b0\u627e\u4e0d\u5230 .Xauthority \u6587\u4ef6\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1292023626","title":"1.2.9\uff082023/6/26\uff09","text":"fix \u4f18\u5316\u8fdc\u7a0b\u6267\u884c remote \u7684\u53c2\u6570\u76f4\u63a5\u4f20\u7ed9\u8fdc\u7a0b\u673a\u5668\u7684 run \u547d\u4ee4\uff0c\u4e0d\u7528\u518d\u5355\u72ec\u5904\u7406\u8fdc\u7a0b\u6267\u884c\u7684\u53c2\u6570\u903b\u8f91\uff0c\u540e\u7eed\u4e13\u6ce8\u4e8e\u672c\u5730\u6267\u884c\u529f\u80fd\u5f00\u53d1\uff0c\u8fdc\u7a0b\u6267\u884c\u81ea\u52a8\u9002\u7528\uff1b env.sh \u79fb\u9664 pyyaml \u5b89\u88c5\uff0c\u7531\u5b50\u9879\u76ee\u5728 requirement.txt \u91cc\u9762\u5b9a\u4e49\uff0c\u6846\u67b6\u81ea\u52a8\u52a0\u8f7d\uff1b \u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b "},{"location":"RELEASE/#128202369","title":"1.2.8\uff082023/6/9\uff09","text":"fix \u4fee\u590d\u4e86 pypi \u5b89\u88c5 numpy \u5b58\u5728\u7cfb\u7edf\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#127202368","title":"1.2.7\uff082023/6/8\uff09","text":"fix env.sh \u4e2d\u5b89\u88c5 Python \u5305\u672a\u6307\u5b9a\u7248\u672c\u65f6\uff0c\u65e5\u5fd7\u8f93\u51fa\u5b89\u88c5\u7684\u7248\u672c\uff1b pdocr-rpc 2.0.1\nallure-custom 1.2.1\nfunnylog 1.1.3\n \u4fee\u590d -f \u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u62a5\u9519\u7684\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#126202367","title":"1.2.6\uff082023/6/7\uff09","text":"fix \u4fee\u590d wayland \u4e0a\u8c03\u7528\u9f20\u6807\u4e2d\u952e\u3001\u53f3\u952e\u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b \u4fee\u590d pubilic/dde_desktop_public_widget \u91cc\u9762\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u5b9a\u4f4d\u684c\u9762\u6587\u4ef6\u7684\u65b9\u6cd5\uff0c\u5750\u6807\u6ca1\u6709\u62c6\u5305\u7684\u95ee\u9898\uff1b \u4f18\u5316\u4e86\u7b49\u5f85\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b pycreeze \u7248\u672c\u5347\u7ea7\u5230 0.1.29\uff0c\u5bfc\u81f4\u4e0e pyautogui 0.9.53 \u4e0d\u517c\u5bb9\uff0cenv.sh \u91cc\u9762\u589e\u52a0\u6307\u5b9a pycreeze \u7248\u672c\u4e3a 0.1.28\uff1b "},{"location":"RELEASE/#1252023516","title":"1.2.5\uff082023/5/16\uff09","text":"new --app \u53c2\u6570\u540e\u9762\u65b0\u589e\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u76ee\u524d\u652f\u6301\u4e09\u79cd\u53c2\u6570\u4f20\u5165\u65b9\u5f0f\uff1a ~$: youqu run -a deepin-music\n~$: youqu run -a autotest_deepin_music\n~$: youqu run -a apps/autotest_deepin_music\n \u200b \u540e\u4e24\u79cd\u5165\u53c2\u65b9\u5f0f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\u3002 remote \u8fdc\u7a0b\u6267\u884c\u65b0\u589e\u4ece\u547d\u4ee4\u884c\u4f20\u5165\u6d4b\u8bd5\u673a\u4fe1\u606f\uff0c\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679c password \u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6 setting/remote.ini \u4e2d CLIENT_PASSWORD \u7684\u503c,\u6bd4\u5982\uff1auos@10.8.13.33:1 \u6216 uos@10.8.13.33 \uff1b python3 manage.py remote -c uos@10.8.13.33/uos@10.8.13.34\npython3 manage.py remote -c uos@10.8.13.33:1/uos@10.8.13.34:2\n fix \u65e5\u5fd7\u6a21\u5757\u4fee\u6539\u4e3a\u51fd\u6570\u6267\u884c\u4e4b\u524d\u6253\u5370\u65e5\u5fd7\uff1b \u65e5\u5fd7\u6a21\u5757\u589e\u52a0\u767d\u540d\u5355\uff0c\u901a\u8fc7\u7c7b\u540d\u5f00\u5934\uff0c\u7ed3\u675f\uff0c\u5305\u542b\u7b49\u5173\u952e\u5b57\u63a7\u5236\u9700\u8981\u6253\u5370\u7684\u51fd\u6570\u65e5\u5fd7\uff1b \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5982\u679c\u4f20\u5165\u4e86 app_name \u53ea\u4f1a\u5c06 apps \u76ee\u5f55\u4e0b app_name \u7684\u76ee\u5f55\u53d1\u9001\u5230\u6d4b\u8bd5\u673a\uff1b env.sh \u79fb\u9664 python3-dev\uff1b \u4fee\u590d Wayland \u4e0b env.sh \u73af\u5883\u5b89\u88c5\u5931\u8d25\u7684\u95ee\u9898\uff0c\u4f18\u5316\u4e86 deb \u4f9d\u8d56\u5b89\u88c5\u7684\u903b\u8f91\uff1b \u5c06 env.sh \u5237\u65b0\u6e90\u7684\u65e5\u5fd7\u5728\u7ec8\u7aef\u663e\u793a\uff0c\u89e3\u51b3\u5728 CI \u73af\u5883\u4e0b\uff0c\u957f\u65f6\u95f4\u4e0d\u8f93\u51fa\u65e5\u5fd7\u8fde\u63a5\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d1060 \u534e\u4e3a\u673a\u578b\u5b89\u88c5\u952e\u9f20\u5de5\u5177\u65f6\u4f9d\u8d56\u4e0d\u517c\u5bb9\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1242023227","title":"1.2.4\uff082023/2/27\uff09","text":"fix \u4fee\u6539 CURRENT \u6587\u4ef6\uff1b "},{"location":"RELEASE/#1232023227","title":"1.2.3\uff082023/2/27\uff09","text":"new pylint.sh \u652f\u6301\u901a\u8fc7\u4f4d\u7f6e\u53c2\u6570\u4f20\u5165\u6587\u4ef6\u8def\u5f84\uff1abash pylint.sh apps/autotest_deepin_music,\u597d\u5904\u662f\u53c2\u6570\u8def\u5f84\u53ef\u4ee5\u5728\u7ec8\u7aef\u8865\u5168\uff1b \u65b0\u589e\u7cfb\u7edf\u547d\u4ee4 youqu-pylint \uff0c\u7528\u4e8e\u9759\u6001\u4ee3\u7801\u626b\u63cf\uff0c\u4f7f\u7528\u65b9\u6cd5: youqu-pylint apps/autotest_deepin_music\uff1b \u7531\u4e8e\u7cfb\u7edf\u4e00\u4e9b dbus \u63a5\u53e3\u6539\u53d8\uff0c\u516c\u5171\u5e93\u4e2d\u7684 dbus \u65b9\u6cd5\u5c06\u4e0d\u518d\u7ef4\u62a4\uff0c\u7531\u5b50\u9879\u76ee\u5728 other_widget.py \u91cc\u9762\u8fdb\u884c\u7ef4\u62a4\uff1b fix \u4fee\u590d ssh \u73af\u5883\u4e0b\u8fd0\u884c\u63d0\u793a \u201c\u65e0\u6cd5\u8fde\u63a5\u201d \u7684\u95ee\u9898\uff1b \u4fee\u590d\u8fd0\u884c\u65f6\u7a0b\u5e8f\u9000\u51fa\uff0c\u4e0d\u8f93\u51fa\u5f02\u5e38\u65e5\u5fd7\u7684\u95ee\u9898\uff1b \u4fee\u590dyouqu remote xxx \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5728\u670d\u52a1\u7aef Ctrl + C \u65e0\u6cd5\u505c\u6b62\u7a0b\u5e8f\u8fd0\u884c\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#122202328","title":"1.2.2\uff082023/2/8\uff09","text":"new \u65b0\u589e\u6c14\u6ce1\u7c7b\u56fe\u50cf\u8bc6\u522b\u65b9\u6848\uff1bimage_utils.py::ImageUtil::get_during\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u533a\u57df\u8bc6\u522b\uff0c\u4f20\u5165 [x, y, w, h]\uff0cx: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u76ee\u6807\u56fe\u7247\uff0c\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\uff1b env.sh \u79fb\u9664 pypinyin; \u4f18\u5316\u6267\u884c env.sh \u65f6\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b manage.py \u79fb\u9664\u4e86\u53c2\u6570 session_timeout \uff0c\u6846\u67b6\u6839\u636e\u5168\u5c40\u7684 timeout \u4ee5\u53ca\u7528\u4f8b\u81ea\u5b9a\u4e49\u7684 timeout \u81ea\u52a8\u8ba1\u7b97\u51fa sessiontimeout \u7684\u503c\uff1b \u65b0\u589e ocr \u670d\u52a1\u5668\u94fe\u63a5\u91cd\u8bd5\uff0c\u9ed8\u8ba4\u91cd\u8bd51\u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u53c2\u6570\uff1b fix \u4fee\u590d\u4e86\u4e00\u4e9b pylint \u626b\u63cf\u7684\u4ee3\u7801\u98ce\u683c\u95ee\u9898\uff1b \u91cd\u65b0\u8bbe\u8ba1\u4e86\u6d4b\u8bd5\u62a5\u544a\u4e3b\u9898\uff1b "},{"location":"RELEASE/#121202316","title":"1.2.1\uff082023/1/6\uff09","text":"new \u652f\u6301\u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6267\u884c\u7528\u4f8b\uff1b\u53ef\u5c06python3 manage.py \u66ff\u6362\u4e3a youqu \uff1a youqu run -a deepin-music -k 001\n RPC \u670d\u52a1 IP \u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u6307\u5b9a\u4e0d\u540c\u7684\u7aef\u53e3\uff1b \u5728\u7ebf\u6587\u6863\u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u539f\u6765\u7684\u5730\u5740 10.8.10.215 \u5c06\u4e0d\u5728\u4f7f\u7528\uff1b fix \u4fee\u590d --count \u53c2\u6570\u53ef\u80fd\u51fa\u73b0\u4e0e\u5176\u4ed6\u6846\u67b6\u7684\u5de5\u7a0b\u4f9d\u8d56\u5b58\u5728\u51b2\u7a81\uff0c\u62a5\u9519\u91cd\u590d\u6ce8\u518c\u7684\u95ee\u9898\uff1b \u4fee\u590d CI \u73af\u5883\u4e0b\u591a\u4e2a\u5de5\u7a0b\u5b58\u5728 Python \u73af\u5883\u53d8\u91cf\u6307\u5411\u9519\u8bef\uff0c\u5bfc\u5305\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u5355\u72ec\u8fd0\u884c\u65b9\u6cd5\u65f6\u65e0\u65e5\u5fd7\u8f93\u51fa\u7684 Bug\uff1b "},{"location":"RELEASE/#12020221230","title":"1.2.0\uff082022/12/30\uff09","text":"1.1.4 \u7248\u672c\u9002\u914d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e14\u65b0\u589e\u4e86\u8f83\u591a\u65b0\u7279\u6027\uff0c\u6211\u4eec\u8ba1\u5212\u4f7f\u7528 1.1.4 \u7248\u672c\u8fd0\u884c\u4e00\u6bb5\u65f6\u95f4\uff0c1.2.0 \u7248\u672c\u5c06\u4fee\u590d\u671f\u95f4\u51fa\u73b0\u7684 Bug\uff0c\u7136\u540e\u4f5c\u4e3a\u7a33\u5b9a\u7248\u672c\u53d1\u5e03\u3002 new \u4fee\u6539\u5de5\u7a0b\u540d\u79f0\u4e3a youqu\uff1b \u5c06 sphinx \u6587\u6863\u5de5\u7a0b\u8fc1\u79fb\u5230\u5355\u72ec\u7684\u4ed3\u5e93\uff1b fix \u4fee\u590d startapp \u521b\u5efa\u5de5\u7a0b\u65f6\u5b58\u5728\u5de5\u7a0b\u540d\u79f0\u65f6\u65e0\u6cd5\u7ee7\u7eed\u521b\u5efa\uff1b \u4fee\u590d\u4e86 OCR \u670d\u52a1\u5728\u5e76\u53d1\u65f6\u53ef\u80fd\u51fa\u73b0\u65e0\u6cd5\u8fd4\u56de\u7ed3\u679c\u7684\u95ee\u9898\uff0c\u63d0\u5347 OCR \u670d\u52a1\u9ad8\u5e76\u53d1\u7a33\u5b9a\u6027\uff1b \u4fee\u590d PMS \u540c\u6b65\u6807\u7b7e\u5230 CSV \u6587\u4ef6\u4e0d\u652f\u6301\u7528\u4f8b\u5e93\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11420221214","title":"1.1.4\uff082022/12/14\uff09","text":"new \u65b0\u589e startapp \u5b50\u547d\u4ee4\u521b\u5efa\u5b50\u9879\u76ee\u5de5\u7a0b\u6a21\u677f: python3 manage.py startapp autotest_deepin_xxx \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u91cd\u590d\u6267\u884c\u6b21\u6570\uff1b \u53bb\u6389\u6279\u91cf\u6267\u884c\u524d\u6536\u96c6\u7528\u4f8b\u7684\u6b65\u9aa4\uff1b \u589e\u52a0\u5f00\u59cb\u6267\u884c\u65f6\u6253\u5370\u4e00\u4e9b\u6267\u884c\u53c2\u6570\uff0c\u5982\uff1a \u7528\u4f8b\u6536\u96c6\u6570\u91cf: 99\n\u5931\u8d25\u91cd\u8dd1\u6b21\u6570: 1\n\u6700\u5927\u5931\u8d25\u6b21\u6570: 49\n\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4: 200.0s (03\u520620\u79d2)\n\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4: 11880s (3\u5c0f\u65f618\u52060\u79d2)\n \u5b9a\u5236\u4fee\u6539allure\u62a5\u544alogo\u3001title\u3001\u9ed8\u8ba4\u8bed\u8a00\uff1b manage.py \u6267\u884c\u5f00\u59cb\u65f6\u6253\u5370 logo \u548c\u5f53\u524d\u7248\u672c\uff1a \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u255a\u2588\u2588\u2557 \u2588\u2588\u2554\u255d \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2584\u2584 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2580\u2580\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u2584\u2588 \u2584\u2588 \u2588 \u2588 \u2588 \u2584 \u2588 \u2584 \u2580\u2580\u2588 \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\uff1b \u88c5\u9970\u5668\u65b9\u6cd5\u6307\u5b9a\u6b21\u6570\uff1b @pytest.mark.count(2)\ndef test_music_001():\npass\n \u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u6b21\u6570\uff1b python3 manage.py run -a deepin-music -k 001 --count 2\n \u200b image_utils \u589e\u52a0\u51fd\u6570 save_temporary_picture\uff0c\u652f\u6301\u6307\u5b9a\u5c4f\u5e55\u533a\u57df\u622a\u56fe\u5e76\u8fd4\u56de\u56fe\u7247\u5b58\u653e\u7684\u672c\u5730\u8def\u5f84\uff0c\u540e\u7eed\u4f7f\u7528 assert_image_exist \u8fdb\u884c\u65ad\u8a00 Python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(x, y, width, height) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) button_center \u65b0\u589e btn_size \u83b7\u53d6\u63a7\u4ef6\u5de6\u4e0a\u89d2\u5750\u6807\u53ca\u957f\u5bbd\uff0c\u7528\u4e8e\u52a8\u6001\u7684\u622a\u53d6\u5143\u7d20\u7684\u56fe\u7247\uff0c\u53ef\u7528\u4e8e\u5b9a\u4f4d\u65ad\u8a00 python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u6240\u6709\u97f3\u4e50\u6309\u94ae\")) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) allure \u62a5\u544a\u4e2d\u5b9a\u4f4d\u95ee\u9898\u9664\u4e86\u65e5\u5fd7\u3001\u622a\u56fe\u3001\u5f55\u5c4f\u5916\uff0c\u8c03\u7528\u7684\u51fd\u6570\u589e\u52a0\u4e86 step \u6b65\u9aa4\u5c55\u793a\uff1b env.sh \u65b0\u589e\u5b89\u88c5\u5b50\u9879\u76ee Python \u4e09\u65b9\u4f9d\u8d56\uff0c\u5728\u5b50\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u5199 requirement.txt \u6587\u4ef6\uff0cenv.sh \u4f1a\u81ea\u52a8\u52a0\u8f7d\uff1b ocr \u8bc6\u522b\u65b0\u589e\u652f\u6301\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\u8fdb\u884c\u6587\u5b57\u8bc6\u522b\uff0c\u51cf\u5c11\u56e0\u5168\u5c4f\u8bc6\u522b\u65f6\uff0c\u5176\u4ed6\u6587\u5b57\u7684\u5e72\u6270 Python # \u65ad\u8a00\u97f3\u4e50\u7684\u5220\u9664\u5f39\u7a97\u4e2d\uff0c\u5305\u542b\u4e86\u201c\u786e\u8ba4\u201d\u7684\u6587\u5b57 self.assert_ocr_exist(\"\u786e\u8ba4\", picture_abspath=DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u5220\u9664\u5f39\u7a97\"))) \u65ad\u8a00\u51fd\u6570\u7684\u8c03\u7528\u4e5f\u4f1a\u81ea\u52a8\u6253\u5370\u65e5\u5fd7; env.sh \u65b0\u589e\u88c1\u526a\u4f9d\u8d56\u7684\u65b9\u6848\uff1b fix \u4fee\u590d Jenkins \u73af\u5883\u4e0b\uff0c apps \u76ee\u5f55\u4e0b\u5b50\u9879\u76ee\u5b58\u5728 auotest_deepin_xxx@tmp \u76ee\u5f55\uff0c\u5728\u4f20\u5165 app_name \u540e\u65e0\u6cd5\u6267\u884c\u7528\u4f8b\u7684\u95ee\u9898\uff1b \u4fee\u590d\u81ea\u52a8\u751f\u6210 case_list.csv \u6587\u4ef6\u65f6\uff0c\u7528\u4f8b\u987a\u5e8f\u88ab\u8c03\u6574\u7684\u95ee\u9898\uff1b env.sh \u73af\u5883\u5b89\u88c5\u79fb\u9664 git \u548c curl\uff1b \u4fee\u590d\u7528\u4f8b\u5728 setup \u9636\u6bb5\u62a5\u9519\u540e\uff0c\u672a\u5199\u5165 ci_result.json \u7684\u95ee\u9898\uff1b \u79fb\u9664 uos_ci.py\uff1b "},{"location":"RELEASE/#11320221028","title":"1.1.3\uff082022/10/28\uff09","text":"new \u65b0\u589e\u56fe\u50cf\u65ad\u8a00\u6210\u529f\u8f93\u51fa\u5339\u914d\u5ea6\uff1b \u65b0\u589e\u73af\u5883\u5b89\u88c5 yaml \u4f9d\u8d56\uff1b \u65b0\u589e\u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6570\u636e\u56de\u586b\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b \u65b0\u589e\u6d4b\u8bd5\u7ed3\u679c\u8868\u60c5\u663e\u793a\uff0c\u5e76\u4f18\u5316\u4e86\u65e5\u5fd7\u7684\u6392\u7248\uff1b \u65b0\u589e --top {number} \u7528\u4e8e\u8bb0\u5f55\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0c\u65e5\u5fd7\u751f\u6210\u5230 report/logs/top.log\uff1b fix \u4fee\u590d\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4f46\u7ec8\u7aef\u6ca1\u6709\u9519\u8bef\u65e5\u5fd7\u8f93\u51fa\u7684\u95ee\u9898\uff1b \u4fee\u6539\u5931\u8d25\u7528\u4f8b\u56de\u6eaf\u65e5\u5fd7\u4e3a\u8be6\u7ec6\u7ea7\u522b\uff1b \u4fee\u590d\u4e86\u6267\u884c\u8fdb\u5ea6\u672a\u8ba1\u7b97\u8df3\u8fc7\u7528\u4f8b\u7684\u95ee\u9898\uff0c\u5e76\u4f18\u5316\u4e86\u8fdb\u5ea6\u83b7\u53d6\u7684\u7b97\u6cd5\uff1b \u4fee\u590d env.sh \u5728 V23 \u73af\u5883\u4e0b\u5b89\u88c5\u65e0\u6cd5\u8bfb\u53d6\u5bc6\u7801\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 pms \u6d4b\u8bd5\u5957\u6267\u884c\u6216\u6d4b\u8bd5\u5355\u6267\u884c\u65f6\uff0c\u7528\u4f8bID\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b env.sh \u91cc\u9762 hub.deepin.com \u66f4\u6362\u6210 it.uniontech.com\uff1b uos_ci.py \u6d4b\u8bd5\u7ed3\u679c\u7edf\u8ba1\u65f6\uff0c\u603b\u6570\u5254\u9664 skip \u7684\u6570\u91cf "},{"location":"RELEASE/#11220220921","title":"1.1.2\uff082022/09/21\uff09","text":"new \u5728\u6ca1\u6709\u5b89\u88c5 dogtail \u7684\u60c5\u51b5\u4e0b\uff0c\u4e5f\u80fd\u4f7f\u7528 sniff \u5de5\u5177\uff1b fix \u4fee\u590d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e2d\u6ca1\u6709\u5b89\u88c5 AT \u73af\u5883\u6267\u884c uos_ci.py \u62a5\u9519\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11120220919","title":"1.1.1\uff082022/09/19\uff09","text":"new \u65b0\u589e\u6267\u884c\u8fdb\u5ea6\u663e\u793a\uff0c\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u65f6\u65e5\u5fd7\u8f93\u51fa\u5f53\u524d\u8fdb\u5ea6\uff1a[\u5f53\u524d\u6307\u5b9a\u7b2c\u51e0\u6761/\u7528\u4f8b\u603b\u6570]\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u7528\u4f8b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\u6240\u6709\u5931\u8d25\u7528\u4f8b\u7684\u5217\u8868\uff1b \u5173\u95ed\u7ec8\u7aef\u8f93\u51fa\u6355\u83b7\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u65e5\u5fd7\u5feb\u7167\uff1b \u4f18\u5316\u7ec8\u7aef\u8f93\u51fa\u5931\u8d25\u4fe1\u606f\u5197\u957f\u4e3a\u7b80\u8981\u4fe1\u606f\u8f93\u51fa\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u663e\u793a 10 \u4e2a\u6267\u884c\u6700\u6162\u7684\u7528\u4f8b\u5217\u8868\uff0c\u5e76\u8be6\u7ec6\u5217\u51fa\u5404\u4e2a\u9636\u6bb5\u7684\u8017\u65f6\uff1b \u5931\u8d25\u91cd\u8dd1\u7528\u4f8b\u91cd\u8dd1\u4e4b\u524d\u5ef6\u8fdf 1 \u79d2\uff1b \u65b0\u589e\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4ecd\u7136\u5f3a\u5236\u6267\u884c\uff1b \u7528\u4f8b\u6536\u96c6\u65f6\u4ec5\u5728 apps \u76ee\u5f55\u4e0b\u8fdb\u884c\uff0c\u5ffd\u7565 src,setting,public \u76ee\u5f55\uff1b \u65b0\u589e allure \u62a5\u544a\u5907\u4efd\u529f\u80fd\uff0c\u9ed8\u8ba4\u5907\u4efd\u81f3 allure_back \u76ee\u5f55\u4e0b\uff1b manage.py\u65b0\u589e\u53c2\u6570 --lastfailed \u7528\u4e8e\u53ea\u8dd1\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\u7684\u529f\u80fd\uff1b fix \u4fee\u590d\u4e86\u5728\u6ca1\u6709\u6307\u5b9a\u5e94\u7528\u540d\u79f0\u6267\u884c\u65f6\uff0cxml \u62a5\u544a\u751f\u6210\u8def\u5f84\u5f02\u5e38\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 uos_ci.py \u4f20\u5165 timeout \u548c session_timeout \u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11020220916","title":"1.1.0\uff082022/09/16\uff09","text":"new \u65b0\u589ePMS\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u652f\u6301\u591a\u79cd\u6570\u636e\u56de\u586b\u6a21\u5f0f\uff1b \u4f18\u5316\u4e86\u901a\u8fc7\u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u65f6PMS \u722c\u866b\u7684\u6027\u80fd\uff1b \u65b0\u589e .gitmodules \u6587\u4ef6\uff0c\u7528\u4e8e\u6807\u8bb0\u6240\u6709\u5b50\u9879\u76ee\uff0c\u65b9\u4fbf\u7edf\u4e00\u62c9\u53d6\u4ee3\u7801\uff1b env.sh \u9002\u914d\u793e\u533a\u7248\u4e0a\u5b89\u88c5\u81ea\u52a8\u5316\u73af\u5883\uff1b \u589e\u52a0\u6267\u884c\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u9519\u8bef\u7684\u529f\u80fd\uff1b README.md \u589e\u52a0 Wayland \u4e0b\u4f7f\u7528\u3001\u6d4b\u8bd5\u62a5\u544a\u67e5\u770b\u3001\u5e38\u89c1\u95ee\u9898\u7b49\u7684\u6587\u6863\u8bf4\u660e\uff1b \u589e\u52a0\u4e86\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u5bf9 setup\u3001call\u3001teardown \u8fdb\u884c\u65e5\u5fd7\u5206\u6bb5\uff1b fix \u4fee\u590d\u4e86 \u786e\u8ba4\u4fee\u590d \u5217\u6ca1\u5199\u8868\u5934\uff0c\u4f46\u5199\u4e86 fixed-xxx \u6807\u7b7e\uff0c\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u540c\u4e00\u5e94\u7528\u5185\u591a\u4e2a csv \u6587\u4ef6\u4e2d \u786e\u8ba4\u4fee\u590d \u5217\u6709\u7684\u5199\u4e86\uff0c\u6709\u7684\u6ca1\u5199\uff0c\u53ef\u80fd\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 INFO \u65e5\u5fd7\uff0c\u663e\u793a\u4e3a DEBUG \u7684\u95ee\u9898\uff1b\u4fee\u590d\u4e86\u90e8\u5206\u673a\u5668\u4e0a INFO \u65e5\u5fd7\u5185\u5bb9\u663e\u793a\u4e3a\u7ea2\u8272\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\u770b\u4e0d\u5230\u8be6\u7ec6\u4fe1\u606f\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10220220822","title":"1.0.2\uff082022/08/22\uff09","text":"new \u79fb\u9664 loguru\uff0c\u66ff\u6362\u4e3a logging\uff0c\u63a5\u53e3\u4fdd\u6301\u4e0d\u53d8\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u53d7\u5f71\u54cd\uff1b \u9ed8\u8ba4\u5f00\u542f coredump\uff1b fix \u4fee\u590d\u4e86\u4e09\u65b9\u5e93 loguru \u5076\u73b0\u5f02\u5e38\uff0c\u5bfc\u81f4\u7a0b\u5e8f\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7b2c\u4e00\u6b21\u5931\u8d25\u4e0d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10120220812","title":"1.0.1\uff082022/08/12\uff09","text":"new \u65b0\u589e RELEASE.md \u6587\u4ef6\uff0c\u7528\u4e8e\u8bb0\u5f55\u5386\u53f2\u53d1\u5e03\u7248\u672c\u7684\u66f4\u65b0\u5185\u5bb9\uff1b \u517c\u5bb9 Wayland \u6a21\u5f0f\u4e0b\u6267\u884c\u7528\u4f8b\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u7528\u7ba1\u5f53\u524d\u6d4b\u8bd5\u673a\u6267\u884c\u73af\u5883\uff0c\u6846\u67b6\u4f1a\u81ea\u52a8\u6839\u636e\u5f53\u524d\u73af\u5883\u8d70\u4e0d\u540c\u7684\u4ee3\u7801\u903b\u8f91\uff1b \u7531\u4e8e\u9700\u8981\u4fee\u6539 dogtail \u6e90\u4ee3\u7801\uff0c\u56e0\u6b64\u5c06\u4fee\u6539\u540e\u7684\u6e90\u7801\u653e\u5165\u5230\u6838\u5fc3\u5e93\u91cc\u9762 src/depends/dogtail \u540e\u7eed\u7248\u672c\u5c06\u4e0d\u9700\u8981\u5728\u7cfb\u7edf\u4e2d\u5b89\u88c5dogtail\uff1b \u5982\u679c\u5e94\u7528\u5e93\u540c\u6837\u4f7f\u7528\u4e86\u7cfb\u7edf\u5b89\u88c5\u7684 dogtail \u53ef\u80fd\u4f1a\u62a5\u9519\uff0c\u89e3\u51b3\u65b9\u6848\u662f\u5c06\u4ee3\u7801\u4e2d\u7684 import dogtail \u4fee\u6539\u4e3a from src.depends import dogtail ; fix \u91cd\u8dd1\u5931\u8d25\u4e4b\u540e\u624d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff0c\u4fee\u6539\u4e3a\u5931\u8d25\u4e4b\u540e\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":"# Attribution \uff1achengdu Test Team\n# Date \uff1a2021/08/20\n \u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d \u4ed3\u5e93\u5730\u5740\uff1ahttps://gitlabcd.uniontech.com/autotest/cd-desktop-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u65b9\u6848\u6982\u8ff0","text":"\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u667a\u80fd\u8bc6\u522b\u5e94\u7528\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u7528\u4e8e\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u64cd\u4f5c\u8fc7\u7a0b\u4e2d\u7684\u5143\u7d20\u5b9a\u4f4d\u4ee5\u53ca\u5224\u65ad\u7ed3\u679c\u65f6\u7684\u65ad\u8a00\u5904\u7406\uff1b\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\uff0c\u6d4b\u8bd5\u673a\u4e0a\u7684\u753b\u9762\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u5230\u670d\u52a1\u5668\u4e0a\uff0c\u670d\u52a1\u5668\u5bf9\u89c6\u9891\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\u540e\uff0c\u670d\u52a1\u5668\u667a\u80fd\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\u6210\u529f\uff0c\u7136\u540e\u5bf9\u6d4b\u8bd5\u673a\u4e0b\u53d1\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\uff0c\u6d4b\u8bd5\u673a\u63a5\u53d7\u5e76\u6267\u884c\u4e0b\u4e00\u6b65\u64cd\u4f5c\u3002 \u670d\u52a1\u5668\u4e0e\u6d4b\u8bd5\u673a\u4e4b\u95f4\u7684\u94fe\u63a5\uff1a \u670d\u52a1\u5668\u901a\u8fc7 USB \u4e32\u53e3\u8bbe\u5907\uff08USB-HID \u534f\u8bae\uff09\u6a21\u62df\u9f20\u6807\u952e\u76d8\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u64cd\u4f5c\u3002 \u901a\u8fc7\u89c6\u9891\u91c7\u96c6\u8bbe\u5907\u6355\u83b7\u6d4b\u8bd5\u673a\u7684\u5b9e\u65f6\u753b\u9762\u4f20\u8f93\u7ed9\u670d\u52a1\u5668\u3002 \u670d\u52a1\u5668\u5bf9\u91c7\u96c6\u7684\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\uff0c\u8bc6\u522b\u5176\u4e2d\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5e76\u8fd4\u56de\u5143\u7d20\u63a7\u4ef6\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\uff0c\u670d\u52a1\u5668\u901a\u8fc7\u667a\u80fd\u5316\u5206\u6790\uff0c\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e00\u81f4\u5c06\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\u901a\u8fc7\u4e32\u53e3\u6a21\u62df\u952e\u9f20\u4fe1\u53f7\u53d1\u9001\u7ed9\u6d4b\u8bd5\u673a\uff1b\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e0d\u4e00\u81f4\u5c06\u4f1a\u8fdb\u5165\u4e2d\u65ad\u5904\u7406\u53ca\u5f02\u5e38\u7ed3\u679c\u8f93\u51fa\uff0c\u7ee7\u7eed\u6267\u884c\u540e\u7eed\u573a\u666f\uff0c\u76f4\u81f3\u6240\u6709\u7528\u4f8b\u6d4b\u8bd5\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u6df1\u5ea6\u5b66\u4e60\u73af\u5883\u642d\u5efa","text":"\u6a21\u578b\u8bad\u7ec3\u4e3b\u8981\u5bf9 GPU \u6709\u8981\u6c42\uff0c\u8bad\u7ec3\u6a21\u578b\u7684\u673a\u5668\u663e\u5b58\u4e0d\u4f4e\u4e8e 6G\uff0c\u5176\u4ed6\u914d\u7f6e\u65e0\u7279\u6b8a\u8981\u6c42\u3002 \u63a8\u8350\u6027\u4ef7\u6bd4\u8f83\u9ad8\u914d\u7f6e \u64cd\u4f5c\u7cfb\u7edf: UnionTech OS Desktop 20 Professional Linux version 4.19.0-desktop-amd64 (deepin@deepin-PC) (Uos 8.3.0.3-3+rebuild) \u5904\u7406\u5668: Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz (\u516b\u6838 / \u5341\u516d\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460M-HDV(RD)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))/8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: TU116 [GeForce GTX 1660]\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u865a\u62df\u73af\u5883\u5b89\u88c5","text":"cd ~\nwget -c https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh\nbash Miniconda3-latest-Linux-x86_64.sh\n \u4e00\u8def\u56de\u8f66 \u7b2c\u4e00\u6b21\u63d0\u793a\u8f93\u5165 yes/no \uff1a\u8f93\u5165 yes \u7ee7\u7eed\u4e00\u8def\u56de\u8f66 \u7b2c\u4e8c\u6b21\u63d0\u793a\uff1a\u8f93\u5165 no cd ~/miniconda3/bin\nsudo chmod 777 activate\n \u6fc0\u6d3bconda\u73af\u5883 . ./activate\n \u6dfb\u52a0\u516c\u53f8\u5185\u7f51\u6e90 conda config --add channels bioconda\nconda config --add channels conda-forge\n \u5982\u679c\u662f\u5916\u7f51\u6dfb\u52a0\u5916\u7f51\u6e90 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/\n \u5982\u679c\u8981\u5220\u9664\u6e90 conda config --remove-key channels\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"2\u3001\u5b89\u88c5\u4f9d\u8d56","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u521b\u5efa\u865a\u62df\u73af\u5883","text":"conda remove --name mmlab --all # \u79fb\u9664\u6240\u6709\u865a\u62df\u73af\u5883\n conda create -n mmlab python=3.7\n conda activate mmlab\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-pytorch","title":"\uff082\uff09\u5b89\u88c5 Pytorch","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install torch==1.7.0+cu101 torchvision==0.8.1+cu101 torchaudio==0.7.0 -f https://download.pytorch.org/whl/torch_stable.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-mmcv","title":"\uff083\uff09\u5b89\u88c5 MMCV","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install mmcv-full==1.3.3 -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.7.0/index.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"\uff084\uff09\u5b89\u88c5\u663e\u5361\u9a71\u52a8","text":"\u6839\u636e\u4f60\u7684\u663e\u5361\u4e0b\u8f7d\u5bf9\u5e94\u9a71\u52a8\uff0c\u6bd4\u5982\u6211\u7684\u663e\u5361\u4e3a GTX1660\uff0c\u9a71\u52a8\u7248\u672c\u4e3a 430\uff0c\u9a71\u52a8\u4e0b\u8f7d\u5730\u5740\uff1ahttps://www.nvidia.cn/Download/Find.aspx?lang=cn CTRL+ALT+F2 \u8fdb\u5165tty\n \u7981\u7528 nouveau \u9a71\u52a8 sudo vim /etc/modprobe.d/blacklist-nouveau.conf\n \u586b\u5165\uff1a blacklist nouveau options nouveau modeset=0\n \u5237\u65b0\u914d\u7f6e\u6587\u4ef6 sudo update-initramfs -u reboot \u91cd\u542f\u540e\u518d\u8fdb\u5165 tty \u5173\u95ed\u56fe\u50cf\u754c\u9762\uff0c\u8f93\u5165\u547d\u4ee4\u5173\u95ed\u56fe\u50cf\u754c\u9762 sudo service lightdm stop\n \u5b89\u88c5\u9a71\u52a8 sudo chmod a+x NVIDIA-Linux-x86_64-430.run\nsudo ./NVIDIA-Linux-x86_64-430.run\n reboot\u91cd\u542f\uff0cnvidia-smi\u67e5\u770b\u5b89\u88c5\u72b6\u6001\u3002\u6ce8\u610f\u770b\u4e0bcuda\u7248\u672c\uff0c10.1\uff0cdriver\u7248\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u6570\u636e\u6807\u6ce8","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u6570\u636e\u6807\u6ce8","text":"\u6807\u6ce8\u4e4b\u524d\u9700\u8981\u5148\u8f6c\u6362\u56fe\u7247\u5927\u5c0f\uff0c\u5e76\u4e14\u4ee5\u6570\u5b57\u547d\u540d\uff0c\u6bcf\u7ec4\u547d\u540d\u9012\u589e"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"\uff081\uff09\u8f6c\u6362\u5927\u5c0f\u5e76\u91cd\u547d\u540d","text":"rename_pic.py import os\nimport sys\nimport cv2\nimport time\nimport getpass\nusername = getpass.getuser()\nsource_path = f\"/home/{username}/Desktop/right_menu\" # \u56fe\u7247\u8def\u5f84\nsource_dest = os.path.join('/'.join(source_path.split(\"/\")[:-1]), 'tmp')\nif not os.path.exists(source_dest):\nos.mkdir(source_dest)\nstart_name = sys.argv[1]\nfile_name_list = list()\nfor file in os.listdir(source_path):\nif file.endswith('.png'):\nfile_name_list.append(file)\nstart_name = int(start_name)\nfor file in file_name_list:\nos.rename(os.path.join(source_path,file), os.path.join(source_path, f\"{str(start_name)}.png\"))\nstart_name += 1\ntime.sleep(1)\nfor file in os.listdir(source_path):\nimage = os.path.join(source_path, str(file))\nsrc = cv2.imread(image)\nresult = cv2.resize(src, (960, 540))\nresizeImage = os.path.join(source_dest, str(file))\nprint(resizeImage)\ncv2.imwrite(str(resizeImage), result)\ncv2.waitKey(0)\ncv2.destroyAllWindows()\ntime.sleep(1)\nos.system(f'rm -rf {source_path}/*')\nos.system(f'mv {source_dest}/* {source_path}')\nos.system(f'rm -rf {source_dest}')\nprint(\"\u4e0b\u4e00\u4e2a\u5e8f\u53f7\uff1a\", start_name)\n \u6839\u636e\u7ec8\u7aef\u8f93\u51fa\u7684\u4e0b\u4e00\u4e2a\u5e8f\u53f7\u7684\u63d0\u793a\uff0c\u6267\u884c Python \u6587\u4ef6\u7684\u65f6\u5019\u4f20\u53c2\u3002 python rename_pic.py 249\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"\uff082\uff09\u5de5\u5177\u6807\u6ce8","text":"\u4f7f\u7528\u5de5\u5177 labelImg \u6807\u6ce8 sudo pip3 install PyQt5==5.13\nsudo pip3 install labelImg\n \u7ec8\u7aef\u76f4\u63a5\u8f93\u5165 labelImg\uff0c\u56de\u8f66 \u6807\u6ce8\u6a21\u5f0f\u9009\u62e9\uff1aPascalVOC"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u667a\u80fd\u6807\u6ce8","text":"\u6253\u5f00\u5c4f\u5e55\u5f55\u5236\u8f6f\u4ef6\uff0c\u5f55\u5236\u624b\u52a8\u64cd\u4f5c\u4e00\u6b21\u6d4b\u8bd5\u7528\u4f8b\uff0c\u7136\u540e\u5c06\u5f55\u5236\u7684\u89c6\u9891\u8fdb\u884c\u5206\u5e27\uff0c\u7136\u540e\u5bf9\u6bd4\u524d\u4e24\u5e27\u56fe\u6807\u76f8\u4f3c\u5ea6\uff0c\u5254\u9664\u76f8\u4f3c\u5ea6\u8fc7\u9ad8\u7684\u56fe\u7247\uff0c\u5728\u4fdd\u8bc1\u7d20\u6750\u591a\u6837\u6027\u7684\u524d\u63d0\u4e0b\uff0c\u5254\u9664\u91cd\u590d\u591a\u4f59\u7684\u56fe\u7247\u751f\u6210\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u96c6\uff0c\u7136\u540e\u53d6\u51fa\u63a7\u4ef6\u6a21\u677f\u6570\u636e\u96c6\uff0c\u901a\u8fc7 OpenCV \u6a21\u677f\u5339\u914d\u83b7\u53d6\u63a7\u4ef6\u5728\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u56fe\u7247\u4e2d\u6240\u5728\u7684\u5de6\u4e0a\u3001\u5de6\u4e0b\u3001\u53f3\u4e0a\u3001\u53f3\u4e0b\u56db\u5904\u5750\u6807\uff0c\u4ece\u800c\u6839\u636e\u6a21\u677f\u6570\u636e\u96c6\u751f\u6210\u6807\u6ce8\u6570\u636e\u3002\u53c2\u8003\u76ee\u5f55 AnnotationMaterial"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"\uff081\uff09\u6a21\u677f\u6570\u636e\u96c6\u51c6\u5907","text":"1\u3001\u5728\u754c\u9762\u622a\u53d6\u9700\u8981\u6807\u6ce8\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u653e\u5728\u76ee\u5f55\u4e0b AnnotationMaterial/template/img 2\u3001\u7ef4\u62a4\u63a7\u4ef6\u540d\u4e0e\u5143\u7d20\u63a7\u4ef6\u7684\u952e\u5bf9\uff0c\u4e00\u4e2a\u63a7\u4ef6\u540d\u53ef\u5bf9\u5e94\u591a\u4e2a\u5143\u7d20\u63a7\u4ef6 menu:\n- menu.jpg\n- menu1.jpg\n- menu2.jpg\n- menu3.jpg\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"\uff082\uff09\u7d20\u6750\u96c6\u51c6\u5907","text":"\u5f55\u5236\u89c6\u9891\u6216\u6216\u5c4f\u5e55\u622a\u56fe\u653e\u7f6e\u76ee\u5f55 AnnotationMaterial/source"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u5f00\u59cb\u6807\u6ce8","text":"python3 AnnotationMaterial/main.py\n \u751f\u6210\u7684\u6807\u6ce8\u6570\u636e\u5b58\u653e\u5728 AnnotationMaterial/result"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#mmdetection","title":"\u56db\u3001MMDetection","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1-mmdetection","title":"1\u3001 MMDetection \u4ee3\u7801","text":"MMDetection \u662f\u4e00\u4e2a\u6709\u540d\u7684\u6df1\u5ea6\u5b66\u4e60\u76ee\u6807\u68c0\u6d4b\u5f00\u6e90\u9879\u76ee\uff0c\u4e5f\u662f openMMlab \u7684\u62db\u724c\u9879\u76ee\uff0c\u4e3a\u4ec0\u4e48\u9009\u62e9\u5b83\uff0c\u5c0f\u5b69\u513f\u6ca1\u5a18\u8bf4\u6765\u8bdd\u957f\uff0c\u611f\u5174\u8da3\u53ef\u4ee5\u81ea\u884c\u6df1\u5165\u4e86\u89e3\uff1b \u4f60\u53ef\u4ee5\u76f4\u63a5\u5728 GitHub \u4e0a\u514b\u9686\u4ee3\u7801\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u54b1\u4eec\u4ed3\u5e93\u4e0b Train \u76ee\u5f55\u4e2d\u4ee3\u7801\uff0cTrain \u4e2d\u7684\u4ee3\u7801\u4e5f\u662f\u4ece GitHub \u4e0a\u62c9\u53d6\u7684\uff0c\u4e0d\u8fc7\u6211\u4eec\u6839\u636e\u9879\u76ee\u9700\u8981\u505a\u4e86\u4e00\u4e9b\u4e8c\u6b21\u5f00\u53d1\uff0c\u63a8\u8350\u76f4\u63a5\u4f7f\u7528\u5b83\u3002 \u5982\u679c\u4f60\u60f3\u4ece GitHub \u4e0a\u62c9\uff1a git clone https://github.com/open-mmlab/mmdetection.git\n# \u4e0d\u80fd\u76f4\u63a5\u62c9\u53d6\u4e3b\u5206\u652f\uff0c\u5efa\u8bae\u4f7f\u75282.12\u7248\u672c\uff0c\u4e0d\u540c\u7684\u7248\u672c\u5bf9\u5e94\u7684mmcv\u7248\u672c\u662f\u4e0d\u540c\u7684\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-voc2coco","title":"2\u3001\u62c9\u53d6 voc2coco \u4ee3\u7801","text":"git clone https://github.com/Tony607/voc2coco.git\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-coco","title":"3\u3001\u8f6c\u6362 coco \u6570\u636e\u96c6","text":"\u5c06\u6240\u6709\u7684\u56fe\u7247\u548cxml\u6587\u4ef6\u653e\u5165train2017\uff0c\u4ece\u4e2d\u6311\u9009\u51e0\u7ec4\u653e\u5165val2017\uff08\u6d4b\u8bd5\u96c6\uff09 cd mmdetection/data/coco\npython voc2coco.py train2017 annotations/instances_train2017.json\npython voc2coco.py val2017 annotations/instances_val2017.json\n \u751f\u6210json\u6587\u4ef6"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4_1","title":"4\u3001\u4fee\u6539\u914d\u7f6e","text":"\uff081\uff09\u8bfb\u53d6\u6a21\u578b\u540d\u79f0 import json\nmodule_name = []\nwith open('./instances_train2017.json', \"r+\") as f:\njson_file = f.read()\njson_dict = json.loads(json_file)\nmodule_list = json_dict.get('categories')\nfor module_info in module_list:\nname = module_info.get('name')\nmodule_name.append(name)\nprint(module_name)\nprint(\"module_num:\", len(module_name))\n # \u6ce8\u610f\u5bf9\u6bd4instances_train2017.json\u91cc\u9762\u6a21\u578b\u540d\u79f0\u7684\u987a\u5e8f\uff0c\u4e0eCLASSES\u548ccoco_classes\u91cc\u9762\u7684\u987a\u5e8f\u4fdd\u6301\u4e00\u81f4\u3002\n \uff082\uff09\u4fee\u6539 faster_rcnn_r101_2x_coco.py mmdetection/xianjin/faster_rcnn_r101_2x_coco.py \u4fee\u653946\u884c\uff0cnum_clasess\u7684\u503c\uff0c\u65b0\u589e1\u4e2a\uff0c\u5c31 +1\uff1b \uff083\uff09\u4fee\u6539 coco.py mmdetection/mmdet/datasets/coco.py CLASSES = ()\uff0c\u5728\u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b \uff084\uff09\u4fee\u6539 class_names.py mmdetection/mmdet/core/evaluation/class_names.py coco_classes \u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#5","title":"5\u3001\u7f13\u5b58\u6e05\u7406","text":"\u5220\u9664 mmdetection/build \u76ee\u5f55 python setup.py install\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#6","title":"6\u3001\u8bad\u7ec3\u6a21\u578b","text":"\uff081\uff09\u6307\u5b9a\u81ea\u5df1\u914d\u7f6e\u7684\u8bad\u7ec3\u6a21\u578b\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py --gpus 1\n \uff082\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u6d4b\u8bd5\u96c6\u7ed3\u679c\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py xianjin/epoch_24.pth --show\n \uff083\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u51c6\u786e\u5ea6\uff1b python tools/analysis_tools/analyze_logs.py plot_curve xianjin/20210530_011907.log.json --keys acc\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#7","title":"7\u3001\u5feb\u6377\u64cd\u4f5c","text":"python3 run.py\n \u5c06\u4ee5\u4e0a 4 - 7 \u6b65\u64cd\u4f5c\u6574\u5408\u6210 run.py\uff0c\u4e00\u952e\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u4e94\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\uff1b \u670d\u52a1\u7aef\u4e00\u53f0\uff08\u76ee\u524d\u4ec5\u652f\u6301AMD\u67b6\u6784\uff09\uff1b \u91c7\u96c6\u76d2\u4e00\u4e2a \uff08ACASIS hdmi\u89c6\u9891\u91c7\u96c6\u5361\uff0chttps://item.jd.com/10024310742602.html \uff09\uff1b USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\uff1b USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff1b \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5USB\u5ef6\u957f\u7ebf\uff1b \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u63a8\u8350\u914d\u7f6e","text":"\u6267\u884c\u7528\u4f8b\u7684\u670d\u52a1\u7aef\u5bf9\u914d\u7f6e\u6ca1\u6709\u7279\u6b8a\u8981\u6c42\uff0c\u5982\u679c\u6761\u4ef6\u5141\u8bb8\u914d\u7f6e\u8d8a\u9ad8\uff0c\u8bc6\u522b\u901f\u5ea6\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n \u6d4b\u8bd5\u673a\u4e0a\u4e0d\u6267\u884c\u4efb\u4f55\u811a\u672c\uff0c\u5177\u4f53\u914d\u7f6e\u6839\u636e\u6d4b\u8bd5\u9700\u8981\u51b3\u5b9a\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#usb_mk","title":"\u516d\u3001USB_MK\u4e32\u53e3\u9a71\u52a8\u65b9\u6cd5","text":"\u4f4d\u4e8econtrol_method\u76ee\u5f55\u4e0b\u7684usb_mk.py\u6587\u4ef6 \uff081\uff09\u5217\u51fa\u53ef\u901a\u4fe1\u7684\u7aef\u53e3 python3 -m serial.tools.list_ports -v\n \uff082\uff09\u4fee\u6539\u4e32\u53e3\u7684\u6743\u9650 sudo chmod 777 /dev/ttyACM0\n \uff083\uff09\u5b9e\u4f8b\u5316USB_MK import UsbMk\nusb_mk = UsbMk(\"/dev/ttyACM0\", 9600) # \u8bbe\u5907\u9ed8\u8ba49600\u4e3a\u6ce2\u7279\u7387\uff0c\u63a7\u5236\u4f20\u8f93\u901f\u7387\n \uff084\uff09USB\u4e32\u53e3\u8bbe\u5907\u9ed8\u8ba4\u6ce2\u7279\u7387\u4e3a9600\uff08\u7ecf\u6d4b\u8bd5\u6ce2\u7279\u73879600\u51c6\u786e\u6027\u6700\u597d\uff09\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up() # \u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u6c49\u5b57\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e\n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff083\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff084\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff085\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() # \u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2\n \uff086\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff087\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff088\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e03\u3001\u65b9\u6cd5\u8c03\u7528\u5165\u53c2\u89c4\u5219","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_7","title":"1\u3001\u57fa\u7c7b","text":"class Base:\ndef __init__(self):\nself._obj = image\nself._usb = usb_mk\ndef find_element_by_ai(self, element):\nreturn self._obj.find_element(element)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_6","title":"2\u3001\u5165\u53c2\u8bf4\u660e","text":"\u56fe\u50cf\u8bc6\u522b\u65b9\u6cd5\u5165\u53e3\u4e3a Base \u7c7b\u4e0b\u7684 find_element_by_ai \u3002\u4ec5\u63a5\u53d7\u4e00\u4e2a\u53c2\u6570 element\uff0c\u7c7b\u578b\u4e3a string\u3002 \u53ef\u8bc6\u522b\u7684 string \u683c\u5f0f\uff1a \uff081\uff09\u5927\u56fe\u6807\uff08 \u56fe\u6807\u5927\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\uff0c\u4f8b\uff1a Base().find_element_by_ai(\"window\")\n \uff082\uff09\u5927\u56fe\u6807 / \u5c0f\u56fe\u6807\uff08\u56fe\u6807\u5c0f\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5c0f\u56fe\u6807\uff0c\u4f8b\uff1awindow/search_btn Base().find_element_by_ai(\"window/search_btn\")\n \uff083\uff09\u5927\u56fe\u6807 / OCR\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\u5185\u7684\u6587\u5b57\uff0c\u4f8b\uff1amenu/\u5c5e\u6027 Base().find_element_by_ai(\"menu/\u5c5e\u6027\")\n \uff084\uff09OCR\uff1a\u5168\u5c4f\u8bc6\u522b\u6587\u5b57 Base().find_element_by_ai(\"\u641c\u7d22\")\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516b\u3001\u9690\u85cf\u9f20\u6807","text":"\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u8fc7\u6765\u7684\u89c6\u9891\u6d41\uff0c\u5728\u8bc6\u522b\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u53d7\u5230\u9f20\u6807\u5f71\u54cd\uff0c\u56e0\u6b64\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u9690\u85cf\u9f20\u6807\u3002 \u5c4f\u853d\u9f20\u6807\u5149\u6807\u663e\u793a ```shell script /etc/lightdm/lightdm.conf \u5728`[Seat:*]`\u4e0b\u9762\u6dfb\u52a0\u53c2\u6570\n```shell script\nxserver-command=X -bs -core -nocursor\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e5d\u3001\u667a\u80fd\u81ea\u52a8\u5316\u7684\u610f\u4e49","text":"1\u3001\u6539\u5584 Acessibility \u5b9a\u4f4d\u7684\u7a33\u5b9a\u6027\u95ee\u9898 Acessibility \u5c5e\u6027\u5b9a\u4f4d\u5b58\u5728\u5076\u5c14\u5931\u6548\u7684\u60c5\u51b5 \uff081\uff09\u5f00\u53d1\u5728\u505a\u65b0\u9700\u6c42\u5f00\u53d1\u65f6\u53ef\u80fd\u6d89\u53ca\u5230\u5bf9\u5c5e\u6027\u6807\u7b7e\u7684\u4fee\u6539\u6216\u8005\u5c42\u7ea7\u7684\u8c03\u6574\uff0c\u53ef\u80fd\u9020\u6210\u81ea\u52a8\u5316\u7528\u4f8b\u65e0\u6cd5\u5b9a\u4f4d\u5230\u5143\u7d20\u3002 \u6bd4\u59821040\u9636\u6bb5\uff0c\u97f3\u4e50\u91cd\u6784\u7684\u65f6\u5019\uff0c\u5f00\u53d1\u5bf9\u90e8\u5206\u5c5e\u6027\u548c\u5c42\u7ea7\u505a\u4e86\u4fee\u6539\uff0c\u5bfc\u81f4\u81ea\u52a8\u5316\u7528\u4f8b\u5b9a\u4f4d\u65b9\u6cd580%\u9700\u8981\u4fee\u6539\u3002 \u5f00\u53d1\u65b0\u529f\u80fd\u7684\u65f6\u5019\u5076\u5c14\u4e5f\u4f1a\u5bf9\u5c5e\u6027\u505a\u8c03\u6574\uff0c\u9047\u52305\u6b21\u3002 \uff082\uff09\u76ee\u524d\u4e3b\u8981\u4f7f\u7528Dogtail\u8bc6\u522b\u5e94\u7528Acessibility\u5c5e\u6027\u8fdb\u884c\u5b9a\u4f4d\uff0c\u662f\u83b7\u53d6\u5e94\u7528\u5f53\u524d\u754c\u9762\u7684\u5c5e\u6027tree\uff0c\u5728\u5e94\u7528\u8df3\u8f6c\u540e\uff0cDogtail\u5b58\u5728\u65e0\u6cd5\u53ca\u65f6\u83b7\u53d6\u5f53\u524d\u5c5e\u6027\u5217\u8868\u7684\u60c5\u51b5\u3002 \u591a\u5a92\u4f53\u8c03\u7528\u6587\u7ba1\u7a97\u53e3\u7684\u65f6\u5019\uff0c\u51fa\u73b0\u627e\u4e0d\u5230\u6587\u7ba1\u91cc\u9762\u5143\u7d20\u7684\u60c5\u51b5\uff0c\u76ee\u524d\u51fa\u73b010+\u6b21\u3002 \u5e94\u7528\u8bbe\u7f6e\u9875\u9762\u7684\u5c5e\u6027\u5076\u5c14\u5b58\u5728\u627e\u4e0d\u5230\u7684\u60c5\u51b5\uff0c\u9047\u52305\u6b21\u3002 \uff083\uff09Dogtail\u5de5\u5177\u672c\u8eab\u5b58\u5728\u95ee\u9898\uff0c\u6709\u65f6\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u5019\u5f88\u6162\uff0c\u8ba9\u4eba\u65e0\u6cd5\u63a5\u53d7\uff0c\u76ee\u524d\u51fa\u73b0\u8fc7\u5f88\u591a\u6b21\u3002 \u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u95f4\u6bd4\u5e73\u5e38\u61623\u500d\uff0c\u51fa\u73b04\u6b21\u3002 2\u3001\u89e3\u51b3\u4e86\u4f7f\u7528\u7edd\u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898 \u90e8\u5206\u63a7\u4ef6\u65e0\u6cd5\u6dfb\u52a0 Acessibility \u5c5e\u6027\u4ece\u800c\u4f7f\u7528\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u51fa\u73b0\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898\u3002 \uff081\uff09\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u65b9\u6cd5\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u76ee\u6807\u56fe\u7247\u8d44\u6e90\uff0c\u5728 UI \u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u4f1a\u6d89\u53ca\u5230\u76ee\u6807\u8d44\u6e90\u7684\u66ff\u6362\uff0c\u6bd4\u8f83\u8017\u8d39\u4eba\u529b\u3002 \uff082\uff09\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6cd5\u5bf9\u6bd4\u7cbe\u5ea6\u6bd4\u8f83\u641e\uff0c\u5982\u679cUI \u7684\u53d8\u66f4\u4f1a\u9020\u6210\u65e0\u6cd5\u51c6\u786e\u5b9a\u4f4d\u5230\uff0c\u81ea\u52a8\u5316\u811a\u672c\u5065\u58ee\u6027\u4e0d\u8db3\u3002 3\u3001\u4f7f\u7528\u673a\u5668\u5206\u79bb\uff0c\u89e3\u51b3\u4e86\u81ea\u52a8\u5316\u811a\u672c\u5bf9\u5e94\u7528\u7684\u5f71\u54cd\uff0c\u771f\u5b9e\u8fd8\u539f\u7528\u6237\u7684\u4f7f\u7528\u573a\u666f \u673a\u5668\u5206\u79bb\u7684\u67b6\u6784\u8bbe\u8ba1\uff0c\u4fdd\u8bc1\u4e86\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u73af\u5883\u5b8c\u5168\u7b49\u540c\u4e8e\u7528\u6237\uff0c\u6392\u9664\u6d4b\u8bd5\u811a\u672c\u7684\u5f71\u54cd\u3002 \uff081\uff09\u76ee\u524d\u7684\u529f\u80fd\u81ea\u52a8\u5316\u662f\u5728\u6d4b\u8bd5\u673a\u4e0a\u76f4\u63a5\u8fd0\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\uff0c\u52a0\u4e0a\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u6211\u4eec\u6dfb\u52a0\u4e86\u4e00\u4e9b\u8fdb\u7a0b\u76d1\u63a7\u3001\u89c6\u9891\u5f55\u5236\u7b49\u529f\u80fd\uff0c\u81ea\u52a8\u5316\u811a\u672c\u672c\u8eab\u4f1a\u6d88\u8017\u4e00\u4e9b\u7cfb\u7edf\u8d44\u6e90\uff0c\u65e0\u6cd5\u8fd8\u539f\u771f\u662f\u7684\u7528\u6237\u4f7f\u7528\u573a\u666f\u3002 \uff082\uff09\u6027\u80fd\u6d4b\u8bd5\u9700\u8981\u6392\u9664\u5176\u4ed6\u7a0b\u5e8f\u7684\u8d44\u6e90\u6d88\u8017\u5f71\u54cd\uff0c\u6027\u80fd\u81ea\u52a8\u5316\u91c7\u7528\u673a\u5668\u5206\u79bb\uff0c\u4fdd\u8bc1\u4e86\u6027\u80fd\u6570\u636e\u7684\u51c6\u786e\u6027\u3002 \u4ee5\u524d\u7684\u7528\u4f8b\u6267\u884c\u8017\u65f6\u6ca1\u6761\u572830\u79d2\u5de6\u53f3\uff0c\u73b0\u5728\u7528\u4f8b\u8017\u65f6\u572810\u79d2\u3002 4\u3001\u89e3\u51b3\u4e86UI \u8c03\u6574\u5bfc\u81f4\u5b9a\u4f4d\u5931\u8d25\u7684\u4e0d\u7a33\u5b9a\u6027\u95ee\u9898 \uff081\uff09\u89e3\u51b3\u4e86\u56e0 UI \u8c03\u6574\u5bfc\u81f4\u63a7\u4ef6\u4f4d\u7f6e\u53d8\u5316\u6216\u8272\u5dee\u53d8\u5316\u540e\u5b9a\u4f4d\u4e0d\u51c6\u786e\u7684\u95ee\u9898\uff0c\u53ea\u8981\u63a7\u4ef6\u6587\u6848\u548c\u63a7\u4ef6\u5916\u8fb9\u6846\u65e0\u53d8\u5316\u5747\u53ef\u51c6\u786e\u5b9a\u4f4d\uff1b \uff082\uff09\u76ee\u524d\u4e5f\u4f1a\u91c7\u7528\u57fa\u4e8eUI\u7684\u5b9a\u4f4d\u65b9\u6848\uff0c\u5982\u679cUI\u4f4d\u7f6e\u6709\u8c03\u6574\uff0c\u4f1a\u5bfc\u81f4\u5143\u7d20\u65e0\u6cd5\u5b9a\u4f4d\u3002 5\u3001\u7b80\u5316\u4e86\u7528\u4f8b\u7ed3\u6784\uff0c\u63d0\u5347\u7f16\u5199\u53cb\u597d\u5ea6 \uff081\uff09\u667a\u80fd\u81ea\u52a8\u5316\u8bc6\u522b\u5143\u7d20\u7684\u65b9\u6cd5\u53ea\u6709\u4e00\u4e2a\uff0c\u5c31\u662f\u57fa\u4e8e\u6211\u4eec\u8bad\u7ec3\u7684\u6a21\u578b\u8bc6\u522b\u89c6\u9891\u6d41\u4e2d\u7684\u5143\u7d20\uff0c\u7ecf\u8fc7\u811a\u672c\u5c01\u88c5\u4e4b\u540e\uff0c\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u4e2d\u6240\u6709\u5b9a\u4f4d\u7684\u64cd\u4f5c\u90fd\u53ea\u9700\u8981\u8c03\u7528\u8fd9\u4e00\u4e2a\u65b9\u6cd5\u5c31\u884c\u4e86\uff0c\u7f16\u5199\u81ea\u52a8\u5316\u811a\u672c\u7684\u96be\u5ea6\u5927\u5927\u964d\u4f4e\u3002 \uff082\uff09\u4e5f\u662f\u7531\u4e8e\u8c03\u7528\u65b9\u6cd5\u7b80\u5355\uff0c\u5728 UI \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u4e2d\u7684\u5206\u5c42\u7ed3\u6784\u5c06\u4f1a\u51cf\u5c11\uff0c\u591a\u7ee7\u627f\u7684\u60c5\u51b5\u4f1a\u51cf\u5c11\uff0c\u81ea\u52a8\u5316\u4ee3\u7801\u7684\u8c03\u7528\u7ed3\u6784\u4e5f\u4f1a\u53d8\u5f97\u7b80\u5355\uff0c\u800c\u4e14\u529f\u80fd\u6d4b\u8bd5\u540c\u5b66\u7f16\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u66f4\u52a0\u5bb9\u6613\u4e0a\u624b\u3002 \u4ee5\u524d\u5199\u7528\u4f8b\u7531\u4e8e\u9700\u8981\u7ed3\u5408\u4e0d\u540c\u7684\u6a21\u5757\uff0c\u8c03\u7528\u4e0d\u540c\u7684\u65b9\u6cd5\uff0c\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u5e76\u5b8c\u6210\u8c03\u8bd5\u7684\u65f6\u95f4\u5e73\u5747\u572820-30\u5206\u949f\uff0c\u73b0\u5728\u5199\u7528\u4f8b\u811a\u672c\u80fd\u57285\u5206\u949f\u5de6\u53f3\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":"# =============================================\n# Attribution : Application Test Department III\n# Time : 2023/1/3\n# Author : ut003281\n# =============================================\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u7b80\u8ff0","text":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5 \u901a\u8fc7\u81ea\u52a8\u5316\u624b\u6bb5\u5bf9\u5e94\u7528\u8fdb\u884c\u6027\u80fd\u6d4b\u8bd5\uff0c\u63d0\u4f9b\u65b9\u4fbf\u7684\u73af\u5883\u90e8\u7f72\u3001\u8fd0\u884c\u914d\u7f6e\u3001\u7528\u4f8b\u7f16\u5199\u7b49\uff0c\u7528\u4e8e\u684c\u9762\u5e94\u7528\u7684\u51b7\u70ed\u542f\u52a8\u3001\u8d44\u6e90\u62f7\u8d1d\u3001\u9875\u9762\u8df3\u8f6c\u7b49\u6027\u80fd\u573a\u666f\u6d4b\u8bd5\u3002 \u4ed3\u5e93\u5730\u5740\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-perf-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u4ee3\u7801\u7ed3\u6784","text":"autotest-perf-aitest\n\u251c\u2500\u2500 apps # \u5b58\u653e\u6240\u6709\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u811a\u672c\n\u251c\u2500\u2500 conftest.py # pytest hook\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 CURRENT # \u7248\u672c\u5185\u5bb9\n\u251c\u2500\u2500 docs # \u6587\u6863\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u952e\u503c\u5bf9\u7167\u8868.pdf # \u4e32\u53e3\u7ebfcode\u4e0e\u6309\u952e\u7684\u5bf9\u7167\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u6027\u80fd\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\u6267\u884c\u5668\u4f7f\u7528\u6307\u5357.md # \u6267\u884c\u5668\u811a\u672c\u4f7f\u7528\u6307\u5357\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 USB\u4e32\u53e3\u8f6cUSB\u952e\u76d8\u9f20\u6807\u7ebf\u534f\u8bae\u6587\u4ef6V1.0.pdf # \u4e32\u53e3\u534f\u8bae\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput-0.28.2.zip # Linux\u4e0b\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\u7684\u6e90\u7801\uff0c\u53ef\u6839\u636e\u67b6\u6784\u6253\u5305\n\u251c\u2500\u2500 manage.py # \u529f\u80fd\u4e3b\u5165\u53e3\n\u251c\u2500\u2500 pytest.ini # pytst \u914d\u7f6e\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 setting # \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 client.ini # \u6d4b\u8bd5\u673a IP \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5168\u5c40\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dev_env.sh # \u5bbf\u4e3b\u673a\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose_no_relay.yml # \u65e0\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose.yml # \u6709\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker_login.sh # docker \u767b\u9646\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 res\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 black.png # \u5168\u9ed1\u56fe\u7247\uff0c\u7528\u4e8e\u4fee\u6539\u58c1\u7eb8\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_5000.deb # 3A5000 \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_amd64.deb # amd \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_arm64.deb # arm \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_mips64.deb # mips \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_sw_64.deb # sw \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 server.ini # \u670d\u52a1\u5668\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 setup.sh # \u5bb9\u5668\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 template # \u521b\u5efa app \u57fa\u7840\u811a\u672c\u6a21\u677f\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 app_template\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ${app_name}_widget.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 control-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 images\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 test_${app_name}_01_scene.json-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 test_${app_name}_01_scene.py-tpl\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 uos_docker # \u5bb9\u5668\u73af\u5883\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dockerfile\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 requirements.txt\n\u2514\u2500\u2500 src\n \u251c\u2500\u2500 analysis_save.py # \u89e3\u6790\u56fe\u7247\u6d41\u7ed3\u679c\uff0c\u6c47\u603b\u751f\u6210 excel \u62a5\u544a\n\u251c\u2500\u2500 base_widget.py # \u5c01\u88c5\u7684\u57fa\u7840\u64cd\u4f5c\uff0c\u5e94\u7528\u8c03\u7528\u7684\u4e3b\u5165\u53e3\u65b9\u6cd5\n\u251c\u2500\u2500 cmdctl.py # \u8c03\u7528\u547d\u4ee4\u884c\u4f7f\u7528\n\u251c\u2500\u2500 global_value.py # \u5168\u5c40\u53d8\u91cf\n\u251c\u2500\u2500 image_utils.py # \u56fe\u7247\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 __init__.py\n \u251c\u2500\u2500 logger_utils.py # \u65e5\u5fd7\u914d\u7f6e\n\u251c\u2500\u2500 pdocr.py # ocr \u914d\u7f6e\n\u251c\u2500\u2500 public_method.py # \u4e00\u4e9b\u65b9\u4fbf\u7684\u5c01\u4f4f\n\u251c\u2500\u2500 record.py # \u5f55\u5c4f\u76f8\u5173\n\u251c\u2500\u2500 rtk # \u8fd0\u884c\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 _base.py # \u4e00\u4e9b\u679a\u4e3e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 install_env.py # \u5b89\u88c5\u73af\u5883\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 local_runner.py # \u8fd0\u884c\u7528\u4f8b\n\u251c\u2500\u2500 serial_communication # \u4e32\u53e3\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 power_control.py # \u7ee7\u7535\u5668\u64cd\u4f5c\uff0c\u4f7f\u7528\u7ee7\u7535\u5668\u8fde\u63a5\u4e3b\u673a\u7535\u6e90\uff0c\u63a7\u5236\u5f00\u5173\u673a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 serial_common.py # \u4e32\u53e3\u516c\u5171\u65b9\u6cd5\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 usb_mk.py # \u952e\u9f20\u64cd\u4f5c\u57fa\u7840\u5c01\u88c5\n\u251c\u2500\u2500 shortcut_key.py # \u5feb\u6377\u952e\u7684\u5c01\u88c5\n\u251c\u2500\u2500 singleton.py # \u5355\u4f8b\u6a21\u5f0f\n\u251c\u2500\u2500 start_app.py # \u521b\u5efa app\n\u2514\u2500\u2500 write_xlsx.py # \u751f\u6210 excel\n# __init__.py \u6587\u4ef6\u4e3a\u6807\u8bc6\u8be5\u76ee\u5f55\u662f\u4e00\u4e2aPython\u7684\u6a21\u5757\u5305\uff0c\u9879\u76ee\u4e2d\u7684__init__.py\u5747\u4e3a\u7a7a\u6587\u4ef6\u3002\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u73af\u5883\u642d\u5efa","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\u3002 \u670d\u52a1\u7aef\u4e00\u53f0\u3002\uff08\u4ec5\u652f\u6301 AMD \u67b6\u6784\uff0c\u82e5\u9700\u5176\u4ed6\u67b6\u6784\uff0c\u54a8\u8be2\u76f8\u5173\u5f00\u53d1\u4eba\u5458\uff09 \u91c7\u96c6\u76d2\u4e00\u4e2a\u3002 \uff08ACASIS HDMI \u89c6\u9891\u91c7\u96c6\u76d2\uff0chttps://item.jd.com/100013302599.html#crumb-wrap \uff09 USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\u3002\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"\uff082\uff09\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\u3002 USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff08USB3.0 \u63a5\u53e3\u4e0a\uff09\u3002 \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5 USB \u5ef6\u957f\u7ebf\u3002 \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u670d\u52a1\u7aef\u63a8\u8350\u914d\u7f6e","text":"\u914d\u7f6e\u8d8a\u9ad8\uff0c\u89e3\u6790\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"2\u3001\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa","text":" \u6253\u5f00\u63a7\u5236\u4e2d\u5fc3\uff0c\u8d26\u6237\u8bbe\u7f6e\u4e3a\u3010\u81ea\u52a8\u767b\u5f55\u3011\u548c\u3010\u65e0\u5bc6\u7801\u767b\u5f55\u3011\uff0c\u7535\u6e90\u7ba1\u7406\u4e2d\u4f7f\u7528\u7535\u6e90\u5168\u90e8\u8bbe\u7f6e\u4e3a\u3010\u4ece\u4e0d\u3011\uff0c\u5f00\u542f\u5f00\u53d1\u8005\u6a21\u5f0f\u3002 \u6839\u636e\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u8981\u6c42\uff0c\u5bfc\u5165\u76f8\u5173\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\uff1a\u5bfc\u5165\u76f8\u518c\u3001\u5f71\u9662\u3001\u97f3\u4e50\u7684\u6d4b\u8bd5\u8d44\u6e90\u3002 \u5728\u670d\u52a1\u7aef\u6253\u5f00\u76f8\u673a\u5e94\u7528\u540e\uff0c\u5c06\u6d4b\u8bd5\u673a\u684c\u9762\u58c1\u7eb8\u66f4\u6362\u4e3a\u7eaf\u8272\u58c1\u7eb8\uff08\u6ce8\u610f\uff0c\u670d\u52a1\u7aef\u9700\u63d0\u524d\u5f00\u542f\u76f8\u673a\u540e\u518d\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u58c1\u7eb8\uff0c\u5efa\u8bae\u7eaf\u9ed1\u58c1\u7eb8 setting/res/black.png\uff09 \u5728\u6587\u4ef6\u7ba1\u7406\u5668\u4e2d\uff0c\u5c06\u9009\u9879 \u4e3b\u83dc\u5355-\u8bbe\u7f6e-\u9884\u89c8-\u56fe\u7247\u9884\u89c8 \u53d6\u6d88\u52fe\u9009\uff08\u5982\u4e0d\u53d6\u6d88\uff0c\u4f1a\u5f71\u54cd\u622a\u56fe\u5f55\u5c4f\u5e94\u7528\u7684\u6027\u80fd\u6570\u636e\uff09 \u79fb\u52a8\u6216\u5220\u9664\u7cfb\u7edf Logo \uff0c\u6392\u9664\u684c\u9762\u53f3\u4e0b\u89d2 Logo \u7684\u5f71\u54cd\uff08\u91cd\u542f\u751f\u6548\uff09\u3002 sudo mv /usr/share/deepin/uos_logo.svg ~/Pictures/\n \u5b89\u88c5\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\uff08\u5fc5\u987b\u5b89\u88c5\uff01\uff01\uff09 AMD \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_amd64.deb ARM \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_arm64.deb MIPS \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_mips64.deb 3A5000 \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_5000.deb \u5b89\u88c5\u547d\u4ee4 sudo dkpg -i xserver-xorg-input-libinput_0.28.2-2_amd64.deb\n \u5b89\u88c5\u65f6\u4f1a\u63d0\u793a\u5df2\u5b58\u5728\u76f8\u540c\u7248\u672c\uff0c\u8bf7\u5ffd\u7565\uff0c\u76f4\u63a5\u8986\u76d6\u5b89\u88c5\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u4e3b\u673a\u624d\u751f\u6548"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u670d\u52a1\u7aef\u4e00\u952e\u73af\u5883\u90e8\u7f72","text":"\u73af\u5883\u642d\u5efa\u524d\u5fc5\u987b\u5148\u8fde\u63a5\u4e0a USB \u4e32\u53e3\u7ebf\u548c\u91c7\u96c6\u76d2\u3002 \u5bbf\u4e3b\u673a\u73af\u5883\u5b89\u88c5 python3 manage.py install --env host\n \u5bb9\u5668\u73af\u5883\u5b89\u88c5 python3 manage.py install --env docker\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u56db\u3001\u914d\u7f6e\u9879","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u670d\u52a1\u7aef\u914d\u7f6e","text":"setting/config/server.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u914d\u7f6e\u9879\uff0c\u5305\u542b\u4e86\u6240\u6709\u670d\u52a1\u7aef\u6240\u6709\u7684\u53ef\u914d\u7f6e\u9879\u3002 \u672c\u5730\u65e0\u7f51\u7edc\u8fd0\u884c \u5c06\u914d\u7f6e\u9879 network=0 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u672c\u5730\u6709\u7f51\u7edc\u8fd0\u884c \u914d\u7f6e\u9879 network=1 (1)\u914d\u7f6e\u9879 client_alias= \u914d\u7f6e\u4e3a\u4f60\u8981\u6d4b\u8bd5\u7684\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5982 Alias1 \u6d4b\u8bd5\u673a\u522b\u540d\u5728 setting/config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 (2)\u914d\u7f6e\u9879 client_alias= \u4e3a\u7a7a\uff0c\u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager --client_alias Alias1\uff0c\u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002(Alias1 \u4e3a\u4f60\u914d\u7f6e\u7684\u6d4b\u8bd5\u673a\u522b\u540d) (1)\u548c(2)\u53ea\u8981\u4f7f\u7528\u5176\u4e00\u5373\u53ef\u3002 \u6709\u7f51\u7edc\u8fd0\u884c\uff0c\u4e14\u9700\u8981\u901a\u8fc7 Jenkins \u4e0a\u8fd0\u884c\u4e00\u4e2a job \uff0c\u540c\u65f6\u63a7\u5236\u591a\u53f0\u673a\u5668\u3002 \u914d\u7f6e\u9879 network=1 \u914d\u7f6e\u9879 client_alias= \u4e0d\u7528\u914d\u7f6e\uff0c\u5728\u8fd0\u884c run.sh \u7684\u65f6\u5019\u76f4\u63a5\u7a7a\u683c\u52a0\u522b\u540d\u5373\u53ef\uff0c\u6bd4\u5982\uff1a\u6d4b\u8bd5\u673a\u522b\u540d\u4e3a Alias1 \uff0c\u4e14\u5df2\u7ecf\u5728 config/client.ini \u4e2d\u914d\u7f6e\u4e86 Alias1 \u7684user ip password \uff0c\u5219\u8fd0\u884c bash run.sh Alias1 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u5728 Jenkins pipeline \u91cc\u9762\u901a\u8fc7\u5e76\u884c stage \u6216\u5e76\u884c\u8c03\u7528\u4e0b\u5c42\u4efb\u52a1\u7684\u65b9\u5f0f\u53ef\u4ee5\u5b9e\u73b0\u5927\u89c4\u6a21\u7684\u6027\u80fd\u6d4b\u8bd5\u9700\u6c42\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;1\u3001KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2\u3001KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f, e.g. TAGS = L1 or smoke\n[case_conf]\n# \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\uff0cocr\u6587\u6848\u8bc6\u522b\u8f83\u6162\uff0c\u4e0d\u63a8\u8350\u4f7f\u7528\nfind_by = stage\n# \u6700\u540e\u4e00\u4e2a\u7a33\u5b9a\u9636\u6bb5\u7684\u5e27\u6570\u8bc6\u522b\n# \u9996\u5e27\u5b58\u5728\u540e\u7684\u7b2c\u4e00\u4e2a\u5927\u4e8e\u8be5\u914d\u7f6e\u5e27\u6570\u7684\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u5c3e\u5e27\nfinal_stable_num=100\n# \u4ece\u8be5\u5e27\u6570\u5f00\u59cb\u8bc6\u522b\u6587\u6848\u6216\u56fe\u7247\uff0c\u51cf\u5c11\u5206\u6790\u65f6\u95f4\nstart_num = 150\n# \u8bc6\u522b\u7684\u6587\u6848\ntext=\n# \u8bc6\u522b\u56fe\u7247\nmatch=apps/xxx/images/match.png\n# \u8bc6\u522b\u76f8\u4f3c\u5ea6\nmatch_rate=0.9\n# \u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6bd4\u5982\u70ed\u542f\u52a8\u7528\u4f8b\uff0c\u4ece\u70b9\u51fb\u6253\u5f00\u5230\u505c\u6b62\u5f55\u5c4f\uff0c\u4e2d\u95f4\u7b49\u5f855\u79d2\uff1b\nduration = 15\n# \u5355\u6761\u7528\u4f8b\u6267\u884c\u7684\u6b21\u6570\ncount = 5\n# \u7a33\u5b9a\u9636\u6bb5\u5212\u5206\u7684\u76f8\u4f3c\u5ea6\nstable_similarity = 0.9997\n[server]\n# \u8c03\u8bd5\u6a21\u5f0f=1\uff0c\u4e3a\u5f00\u542f\u8c03\u8bd5\u6a21\u5f0f\uff0c0\u4e3a\u5173\u95ed\u3002\n# \u8c03\u8bd5\u6a21\u5f0f\u4e0b\u9ed8\u8ba4\u53ea\u6267\u884c\u4e00\u6b21\u7528\u4f8b\uff0c\u4e0d\u5173\u673a\n# \u7f16\u5199\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u5efa\u8bae\u5f00\u542fmaintain\u3002\nMAINTAIN = 0\n# \u8fd0\u884c\u7684\u73af\u5883docker\u5bb9\u5668\u73af\u5883\uff0chost\u5bbf\u4e3b\u673a\u73af\u5883\nENV = docker\n# \u670d\u52a1\u7aef\u5bc6\u7801\nPASSWORD=1\n# \u6307\u5b9a\u6d4b\u8bd5\u673a\u522b\u540d\n# \u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6bd4\u5982\uff1a\n# [AMD]\n# ip=10.8.15.86\n# user=uos\n# \u5176\u4e2d AMD \u4e3a\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5219client_alias=AMD\nCLIENT_ALIAS = x86\uff08Intel-i7\uff09\n# 1 \u5f00\u542f\u7f51\u7edc, 0 \u5173\u95ed\u7f51\u7edc\n# \uff081\uff09\u670d\u52a1\u7aef\u4e0e\u6d4b\u8bd5\u673a\u987b\u5728\u540c\u4e00\u7f51\u6bb5\u4e0b\uff0c\u4f60\u53ef\u4ee5\u5c1d\u8bd5\u5728\u670d\u52a1\u7aef\u901a\u8fc7ssh\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c\u5982\u679c\u53ef\u4ee5\u8fde\u63a5\uff0c\u8bf4\u660e\u7f51\u7edc\u6b63\u5e38\u3002\n# \uff082\uff09\u5f53input_type=FILE_NAME \u65f6\uff0c\u5fc5\u987b\u5f00\u542f\u7f51\u7edc\u3002\nNETWORK = 1\n# \u6027\u80fd\u7ed3\u679c\u7edf\u8ba1\u5355\u4f4d \u6beb\u79d2\u2014ms, \u79d2\u2014s\nUNIT=ms\n# \u6d4b\u8bd5\u673a\u5f00\u673a\u8fdb\u5165\u684c\u9762\u540e\u7b49\u5f85\u65f6\u95f4,\u5355\u4f4d/\u79d2\nSTARTUP_DELAY = 60\n# 1\u4e3a\u5220\u9664\u7f13\u5b58\uff0c0\u4e3a\u4e0d\u5220\u9664\u7f13\u5b58\n# \u7528\u4f8b\u6267\u884c\u5b8c\u540e\u4f1a\u5728report\u76ee\u5f55\u4e0b\u751f\u6210\u667a\u80fd\u89e3\u6790\u7684\u4e00\u4e9b\u7f13\u5b58\u56fe\u7247\u3002\nCACHE = 0\n# \u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u62a5\u544a\u4f1a\u4fdd\u5b58\u5728\u9879\u76ee\u4e0breport\u76ee\u5f55\u4e2d\uff1b\n# \u6307\u5b9a\u62a5\u544a\u76ee\u5f55\u5219\u5b58\u653e\u5230\u6307\u5b9a\u76ee\u5f55\u3002\nREPORT_PATH = report\n# \u670d\u52a1\u7aef\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684icon\u8d44\u6e90\u4f1a\u7f13\u5b58\u5728\u9879\u76ee\u4e0binput\u76ee\u5f55\u4e2d\nINPUT = input/\n# 1\u4e3a\u6d4b\u8bd5\u5b8c\u5173\u673a\uff0c0\u4e3a\u6d4b\u8bd5\u5b8c\u4e0d\u5173\u673a\nSHUTDOWN = 0\n# \u89e3\u6790\u8fdb\u7a0b\u6570\uff08\u4e0d\u63a8\u8350\u4fee\u6539\uff09\n# 3\u4e2a\u8fdb\u7a0b\u89e3\u6790\u89c6\u9891\u5df2\u7ecf\u80fd\u591f\u6ee1\u8db3\uff0c\u5373\u4f7f\u589e\u52a0\u8fdb\u7a0b\u6570\u4e5f\u4e0d\u80fd\u51cf\u5c11\u6574\u4f53\u8017\u65f6\n# \u53e6\u5916\u8fd8\u8981\u770bCPU\u6838\u6570\u662f\u5426\u652f\u6301\u3002\nPARSING_PROCESS = 3\n# 1\u4e3a\u4f7f\u7528\u7ee7\u7535\u5668\u5f00\u5173\u673a\uff0c0\u4e3a\u4f7f\u7528reboot\u547d\u4ee4\u91cd\u542f\u3002\u4f9d\u8d56\u7ee7\u7535\u5668\u786c\u4ef6\u8bbe\u5907\uff0c\u9700\u8981\u4f7f\u7528\u8054\u7cfb\u5f00\u53d1\u8005\nRELAY = 0\n# \u83b7\u53d6\u6d4b\u8bd5\u5e94\u7528\u7684\u7248\u672c, %s \u5360\u4f4d\u5e94\u7528\u540d\n# \u5982\u679c\u8be5\u914d\u7f6e\u4e3a\u7a7a\uff0c\u5219\u4e0d\u83b7\u53d6\u5e94\u7528\u7684\u7248\u672c\u4fe1\u606f\u3002\nCOMMAND = apt policy %s 2>/dev/null|grep \"\u5df2\u5b89\u88c5\"|awk -F \"\uff1a\" \"{print \\$2}\"\n# \u5173\u673a\u7b49\u5f85\u5f00\u542f\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6839\u636e\u6d4b\u8bd5\u673a\u6027\u80fd\u4e0d\u540c\uff0c\u5f00\u5173\u673a\u8017\u65f6\u53ef\u80fd\u4e0d\u540c\uff0c\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u673a\u60c5\u51b5\u914d\u7f6e\u3002\nSHUTDOWN_DELAY = 30\n# \u53ef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u56fe\u7247\u683c\u5f0f\uff0c\u4ee5\u82f1\u6587\u9017\u53f7\u9694\u5f00\u3002\n# \u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u76ee\u524d\u6211\u4eec\u4ec5\u9a8c\u8bc1\u4e86jpg,jpeg,png\u8fd9\u4e09\u79cd\u5e38\u7528\u7684\u56fe\u7247\u683c\u5f0f\u3002\nINPUT_TYPES = jpg,jpeg,png\n# \u6027\u80fd\u5206\u6790\u8865\u5e27\uff0c\u7b49\u4e8e\u6216\u4f4e\u4e8e\u8be5\u503c\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u9700\u8981\u51cf\u6389\u3002\nUN_STAB_START = 3\n# \u670d\u52a1\u7aef\u83b7\u53d6\u6d4b\u8bd5\u673a\u56fe\u50cf\u7684\u5e27\u7387\uff0c\u5373\u6bcf\u79d2\u83b7\u53d6\u591a\u5c11\u5f20\u6d4b\u8bd5\u673a\u4e0a\u7684\u56fe\u50cf\u3002\n# \u9ed8\u8ba4\u5e27\u7387\u4e3a30\u5e27/\u79d2\uff0c\u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u53ef\u80fd\u4f1a\u5bf9\u89e3\u6790\u7ed3\u679c\u9020\u6210\u504f\u5dee\u3002\nFPS = 30\n# \u4ee5\u4e0b\u573a\u666f\u7c7b\u578b\u4f1a\u91cd\u542f\u6d4b\u8bd5\u673a,\u591a\u79cd\u573a\u666f\u4f7f\u7528\u9017\u53f7\u9694\u5f00\nSCENE = cold\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = http://10.8.13.78:8890\n#\u5c4f\u5e55\u56fe\u7247\u4e34\u65f6\u5b58\u653e\u4f4d\u7f6e\nSCREEN_CACHE = /tmp/screen\n# =======================================\n[log]\n# \u65e5\u5fd7\u7ea7\u522b\uff0cOFF\u3001FATAL\u3001ERROR\u3001WARN\u3001INFO\u3001DEBUG\u3001ALL\n# \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u65e5\u5fd7\u8f93\u51fa\uff0clog_cli=INFO\u8868\u793a \u4ec5\u8f93\u51faINFO\u53ca\u4ee5\u4e0a\u7ea7\u522b\u7684\u65e5\u5fd7\u3002\nLOG_LEVEL = DEBUG\n# \u65e5\u5fd7\u6587\u4ef6\u4fdd\u5b58\u8def\u5f84\nLOG_PATH= logs\n# =======================================\n[dockerhub]\n# \u5bb9\u5668\u767b\u9646\u8d26\u53f7\nDOCKER_USER = user\n# \u5bb9\u5668\u767b\u9646\u5bc6\u7801\nDOCKER_PASSWORD = User1234\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u6d4b\u8bd5\u673a\u914d\u7f6e","text":"setting/config/client.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u4fe1\u606f\u3002 \u6709\u7f51\u7edc\u7684\u60c5\u51b5\u4e0b\uff0c\u670d\u52a1\u7aef\u9700\u8981\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u56e0\u6b64\u4f60\u9700\u8981\u5199\u5165 \u6d4b\u8bd5\u673a\u522b\u540d \u3001 user \u3001ip\u3001 password \u3002 # \u6d4b\u8bd5\u673a\u522b\u540d\n[Alias1] # \u6d4b\u8bd5\u673aip\nip=10.8.15.86 # \u6d4b\u8bd5\u673a\u7528\u6237\u540d\nuser=uos\n \u547d\u540d\u5efa\u8bae\uff1aAliasA1\u3001AliasA2\u3001AliasB1\u3001AliasB2\uff0c\u4e0d\u8981\u91cd\u540d\u3002 \u65e0\u7f51\u7edc\u60c5\u51b5\u4e0b\uff0c\u4ec5\u9700\u8981\u5173\u6ce8\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\u9879 width=\u3001 height= \u5373\u53ef\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a [client]\n# \u9ed8\u8ba4\u6d4b\u8bd5\u673a\u7528\u6237\u540d\uff0c\u5bc6\u7801\uff0cip\nip=\nuser=\n# \u6d4b\u8bd5\u673a\u5bc6\u7801\npassword=1\n# \u6d4b\u8bd5\u673a\u4e3b\u9898\ntheme=bloom\n# \u6d4b\u8bd5\u673aicon\u76ee\u5f55\npath=/usr/share/icons\n# \u7cfb\u7edfdesktop\u6587\u4ef6\u7684\u5b58\u653e\u76ee\u5f55\uff0cUOS\u7cfb\u7edf\u9ed8\u8ba4\u4e3a/usr/share/applications\ndesktop_path=/usr/share/applications\n# \u7528\u4e8e\u5224\u65ad\u6d4b\u8bd5\u673a\u662f\u5426\u5f00\u673a\u8fdb\u5165\u684c\u9762\u7684\u8bc6\u522b\u6807\u8bc6\u3002\n# 1\u3001\u901a\u8fc7\u684c\u9762\u56fe\u6807\u8bc6\u522b\u3002\n# - type=FILE_NAME\u65f6\uff0c\u670d\u52a1\u5668\u548c\u6d4b\u8bd5\u673a\u5fc5\u987b\u5728\u540c\u4e00\u5c40\u57df\u7f51\u5185\u3002\n# - power_on=dde-computer\u8868\u793a\u901a\u8fc7\u684c\u9762\u8ba1\u7b97\u673a\u56fe\u6807\u5224\u65ad\u5f00\u673a\u8fdb\u5165\u684c\u9762\u3002\n# 2\u3001\u901a\u8fc7\u672c\u5730\u56fe\u7247\u4f5c\u4e3a\u5f00\u673a\u8bc6\u522b\u3002\n# - type= \u4f20\u5165\u4e3a\u56fe\u7247\u683c\u5f0f\uff0ctype\u652f\u6301\u7684\u7c7b\u578b\u5305\u542b\u5728server.ini\u5185\u914d\u7f6e\u9879input_type=jpg,jpeg,png\u3002\n# - power_on= \u4f20\u5165\u7684\u662f\u672c\u5730\u56fe\u7247\u7684\u8def\u5f84\u3002\ntype=FILE_NAME\npower_on=dde-computer\n# \u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\uff08\u6d4b\u8bd5\u673a\u8fde\u63a5\u91c7\u96c6\u76d2\uff0c\u91c7\u96c6\u76d2\u7684\u5206\u8fa8\u7387\uff09\nheight=1080\nwidth=1920\n[AliasA1] ip=10.8.15.86\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n[AliasA2]\nip=10.8.15.20\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_2","title":"3\u3001\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e","text":"\u968f\u7740\u6d4b\u8bd5\u573a\u666f\u7684\u4e0d\u65ad\u5f15\u5165\uff0c\u53d1\u73b0\u73b0\u6709\u670d\u52a1\u7aef\u91cc\u7684\u914d\u7f6e\u9879\u5e76\u4e0d\u9002\u7528\u4e8e\u6240\u6709\u7684\u6027\u80fd\u573a\u666f\uff0c\u4e8e\u662f\u5c06\u670d\u52a1\u7aef\u914d\u7f6e\u8fdb\u884c\u4e00\u4e2a\u63d0\u53d6\uff0c\u53ef\u505a\u5355\u4e2a\u573a\u666f\u7684\u4e2a\u6027\u5316\u914d\u7f6e\uff0c\u5f53\u7136\u539f\u6765\u7684\u670d\u52a1\u7aef\u914d\u7f6e\u529f\u80fd\u4fdd\u7559\uff0c\u53ea\u662f\u5f53\u4f60\u914d\u7f6e\u4e86\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e\u540e\uff0c\u4f18\u5148\u4f7f\u7528\u4e2a\u6027\u5316\u914d\u7f6e\u91cc\u9762\u7684\u5185\u5bb9\uff0c\u4ee5\u4e0b\u662f\u5bf9\u4e2a\u6027\u5316\u914d\u7f6e\u7684\u4ecb\u7ecd\u3002 \u76ee\u524d\u6bcf\u4e00\u4e2a py \u6587\u4ef6\u5bf9\u5e94\u4e00\u4e2a\u6027\u80fd\u6d4b\u8bd5\u573a\u666f\uff0c\u4e8e\u662f\u5728\u540c\u7ea7\u76ee\u5f55\u4e0b\u521b\u5efa\u4e00\u4e2a\u4e0e\u4e4b\u540c\u540d\u7684 json \u6587\u4ef6\uff0c\u4f5c\u4e3a\u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6 apps\n\u251c\u2500\u2500 album\n \u251c\u2500\u2500 test_album_01_start.json # \u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6\n\u2514\u2500\u2500 test_album_01_start.py # \u6027\u80fd\u573a\u666f\u6587\u4ef6\n \u4ee5\u4e0b\u662f\u5bf9 json \u6587\u4ef6\u4e2d\u914d\u7f6e\u7684\u89e3\u91ca\uff0c\u82e5\u67d0\u9879\u914d\u7f6e\u4e0d\u9700\u8981\uff0c\u53ef\u4ee5\u7f3a\u5931\uff0c\u4f46\u4e0d\u80fd\u4e3a\u7a7a\uff1b {\n\"title\": \"test_album_start\", # \u6807\u9898\uff1b\u5fc5\u987b\n\"app_name\": \"deepin-album\", # \u573a\u666f\u6240\u5c5e\u7684\u5e94\u7528\uff1b\u5fc5\u987b\n\"scene\": \"hot\", # \u573a\u666f\u522b\u540d\uff1b\u5fc5\u987b\n\"icon\": [\"deepin-album\"], # \u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684icon\u5230\u670d\u52a1\u7aef\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\uff1b\u53ef\u7f3a\u5931\n# \u6ce8\u610f\uff1a\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684desktop\u6587\u4ef6\u540d\u4e3adeepin-album.desktop\uff0c\n# \u53ea\u9700\u8981\u5199deepin-album\u5373\u53ef\uff0c\u201c.desktop\u201d\u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002\n\"size\": { # \u56fe\u7247\u5bf9\u6bd4\u7684\u533a\u57df\u8bbe\u7f6e\u9879\uff0c\u67d0\u4e9b\u5e94\u7528\u5f53\u524d\u5c4f\u5e55\u7684\u90e8\u5206\u533a\u57df\u9700\u8981\u5c06\u5176\u53bb\u6389\uff0c\u53ef\u4ee5\u8bbe\u7f6e\u6b64\u9879\uff0c\u5982\u679c\u6ca1\u6709\u5219\u53ef\u4e0d\u5199\uff1b\u53ef\u786e\u5b9e\n\"x-coordinate\": 0, # \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n\"y-coordinate\": 0, # \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n\"width\": 850, # \u6a2a\u5411\u957f\u5ea6\n\"height\": 1920 # \u7eb5\u5411\u9ad8\u5ea6\n},\n\"count\": 5, # \u573a\u666f\u6267\u884c\u7684\u6b21\u6570\uff1b\u5fc5\u987b\n\"duration\": 5, # \u8be5\u6761\u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff0c\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7279\u5b9a\u573a\u666f\uff0c\u8be5\u914d\u7f6e\u4e3a\u53ef\u9009\u9879\uff0c\u8986\u76d6 server.ini \u4e2d\u7684\u914d\u7f6e\uff1b\u53ef\u7f3a\u5931\n\"stable_similarity\": 0.9997, # \u6027\u80fd\u573a\u666f\u5206\u9636\u6bb5\u65f6\u7684\u56fe\u7247\u76f8\u4f3c\u5ea6\u5bf9\u6bd4\uff0c\u524d\u540e\u56fe\u7247\u4f4e\u4e8e\u8be5\u503c\uff0c\u5219\u5206\u4e3a\u4e0d\u7a33\u5b9a\u9636\u6bb5\uff1b\u53ef\u7f3a\u5931\n\"find_by\": \"stage\", # \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\n\"final_stable_num\": 100, # \u67e5\u627e\u6700\u540e\u4e00\u4e2a\u5927\u4e8e\u8be5\u503c\u7684\u7a33\u5b9a\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u7684\u5c3e\u796f\uff1b\u53ef\u7f3a\u5931\n\"start_num\": 150,\n\"text\": \"\", # ocr\u8bc6\u522b\u7684\u6587\u6848\n\"match\": \"apps/xxx/images/match.png\", # \u56fe\u50cf\u5339\u914d\u7684\u56fe\u7247\u6587\u4ef6\u8def\u5f84\n\"match_rate\": 0.9 # \u5339\u914d\u76f8\u4f3c\u5ea6\n}\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e94\u3001\u6d4b\u8bd5\u6d41\u7a0b","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516d\u3001\u7528\u4f8b\u7f16\u5199\u53ca\u65b9\u6cd5\u53c2\u6570\u6307\u5f15","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"1\u3001\u7528\u4f8b\u5b9e\u4f8b\u8bf4\u660e","text":"# \u6807\u51c6\u5e93\u5bfc\u5165\nfrom time import sleep\n# \u5bfc\u5165\u4e09\u65b9\u5e93pytest\nimport pytest\n# \u5bfc\u5165\u7528\u4f8b\u6267\u884c\u8981\u7528\u5230\u7684Widget\u7c7b\nfrom src.base_widget import BaseWidget\nclass TestStart:\n# class\u7ea7\u522b\u7684fixture\uff0c\u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u6267\u884c\u3002autouse=True \u81ea\u52a8\u5728\u5f53\u524d\u4f5c\u7528\u57df\u4e0b\u4f7f\u7528\u3002\n@pytest.fixture(scope=\"class\", autouse=True)\n# \u6d4b\u8bd5\u70ed\u542f\u52a8\u4e4b\u524d\u9700\u8981\u9884\u542f\u52a8\u3002\ndef application_pre_start(self):\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().right_click_element(\"deepin-album\")\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().click_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\")\nsleep(2)\n# \u5feb\u6377\u952e\u5173\u95ed\u7a97\u53e3\nBaseWidget().hot_key(\"alt\", \"f4\")\nsleep(2)\n# \u9ed8\u8ba4\u4e3afunction\u7ea7\u522b\u7684fixture\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\uff0cclass\u7ea7\u522bfixture\u6267\u884c\u4e4b\u540e\u6267\u884c\u3002\n@pytest.fixture(autouse=True)\ndef setup_start(self):\n# \u53f3\u952e\u70b9\u51fb deepin-album \u56fe\u6807\nBaseWidget().right_click_element(\"deepin-album\")\n# \u79fb\u52a8\u5230\u53f3\u952e\u83dc\u5355\u4e2d\u6253\u5f00\uff08open.png\uff09\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().move_to(*BaseWidget().find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))\n# \u7b49\u5f85\u79fb\u52a8\u5b8c\u6210\nsleep(0.5)\ndef test_album_start(self):\n# \u70b9\u51fb\u201c\u6253\u5f00\u201d\nBaseWidget().click() \n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"2\u3001\u65b9\u6cd5\u53c2\u6570\u8bf4\u660e","text":"2.1\u3001find_element \u65b9\u6cd5 def find_element(element: str, input_type: str = \"FILE_NAME\", fill_color_position: tuple = (-1, -1), size: tuple = (25, 70)):\npass\n \u53c2\u6570 element \u548c input_type \uff081\uff09\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u5143\u7d20 - `input_type` \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a `FIEL_NAME` \uff0c\u8868\u793a\u901a\u8fc7\u5e94\u7528 `icon` \u5bfb\u627e\u5143\u7d20\uff0c\u6b64\u65b9\u6cd5\u4f1a\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u5e94\u7528 `icon` \u56fe\u6807\u3002\n \u4e3e\u4f8b\uff1a\u9ed8\u8ba4\u60c5\u51b5\u4e0b input_type \u53c2\u6570\u4e0d\u9700\u8981\u4f20\u5165\uff0c find_element(\"deepin-album\")\uff0c\u8868\u793a\u901a\u8fc7 deepin-album \u7684\u5e94\u7528 icon \u6765\u83b7\u53d6\u5750\u6807\uff0c\u6ce8\u610f\uff0c\u6b64\u65f6\u4f20\u5165\u7684 deepin-album \u53c2\u6570\u5b9e\u9645\u662f desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u548c2.3\u4e2d\u7684 icon \u53d8\u91cf\u4e00\u81f4\u3002 \u6211\u4eec\u5efa\u8bae\u4f18\u5148\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\uff0c\u4f46\u6b64\u65b9\u6cd5\u4f9d\u8d56\u7f51\u7edc\uff0c\u8bf7\u6839\u636e\u6d4b\u8bd5\u73af\u5883\u5b9e\u9645\u60c5\u51b5\u9009\u62e9\u3002 \uff082\uff09\u901a\u8fc7\u672c\u5730\u56fe\u7247\u8bc6\u522b\u5143\u7d20 - \u53c2\u6570 `input_type` \u4f20\u5165\u56fe\u7247\u683c\u5f0f\uff0c\u6bd4\u5982\u622a\u53d6\u7684\u672c\u5730\u56fe\u7247\u683c\u5f0f\u4e3a `png`\uff0c\u90a3\u4e48 `input_type=\"png\"`\uff0c\u6b64\u65f6\u53c2\u6570 `element ` \u4f20\u5165\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5efa\u8bae\u5b58\u653e\u5728\u5bf9\u5e94\u7684\u4ea7\u54c1 `apps/app/picture/` \u76ee\u5f55\u4e0b\uff0c\u8def\u5f84\u4e3a\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u7684\u76f8\u5bf9\u8def\u5f84\u3002\n- \u4e3e\u4f8b\uff1a`find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))`\uff0c\u8868\u793a\u901a\u8fc7\u672c\u5730\u56fe\u7247 `open.png` \u8bc6\u522b\u5143\u7d20\u3002\n \u53c2\u6570 fill_color_position fill_color_position \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (-1, -1)\uff0c(-1, -1) \u8868\u793a\u53d6\u5c4f\u5e55\u4e2d\u53f3\u4e0b\u89d2\u6700\u540e\u4e00\u4e2a\u50cf\u7d20\u70b9\u4f5c\u4e3a\u586b\u5145\u5750\u6807\uff0c\u5728 1920x1080 \u5c4f\u5e55\u5206\u8fa8\u7387\u4e0b\u5373\u5b9e\u9645\u5750\u6807\u4e3a (1919, 1079) \uff0c\u8fd9\u6837\u7684\u5199\u6cd5\u53ef\u4ee5\u9002\u914d\u4e0d\u540c\u5927\u5c0f\u7684\u5c4f\u5e55\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0d\u540c\u65b9\u4f4d\uff1a \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0b\u65b9\uff0c\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u4e0d\u9700\u8981\u4f20\u5165\u8be5\u53c2\u6570\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u5de6\u8fb9\uff0cfill_color_position=(1, 1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u53f3\u8fb9\uff0cfill_color_position=(-1, -1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0a\u8fb9\uff0cfill_color_position=(1, 1) \u4ece\u684c\u9762\u542f\u52a8\u5e94\u7528\uff0c\u5219\u9700\u8981\u4f20\u5165\u9664\u4efb\u52a1\u680f\u4ee5\u5916\u5176\u4ed6\u4f4d\u7f6e\u7684\u5750\u6807\uff0c\u6bd4\u5982(100, 100)\uff0c\u53ea\u8981\u8fd9\u4e2a\u5750\u6807\u4e3a\u9664\u5e94\u7528\u548c\u4efb\u52a1\u680f\u533a\u57df\u90fd\u53ef\u4ee5\u3002 \u4ece\u542f\u52a8\u5668\u91cc\u9762\u542f\u52a8\u5e94\u7528\uff0c\u9700\u8981\u586b\u5145\u7684\u5750\u6807\u4e3a\u542f\u52a8\u5668\u533a\u57df\u3002 \u6ce8\uff1a\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u65f6\uff0c\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684 icon \u539f\u6587\u4ef6\u4e3a svg \u77e2\u91cf\u56fe\uff0c\u8f6c\u6362\u4e3a png \u4e4b\u540e\u9700\u8981\u586b\u5145\u8fb9\u7f18\u900f\u660e\u90e8\u5206\u3002 \u53c2\u6570 size size \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (25, 70)\uff0c\u8868\u793a\u6d4b\u8bd5\u673a\u4e0a dock \u680f\u4e0a\u5e94\u7528\u56fe\u6807\u7684\u5927\u5c0f\u8303\u56f4\u3002 UOS \u7cfb\u7edf dock \u680f\u662f\u53ef\u4ee5\u4e0a\u4e0b\u62d6\u52a8\u5927\u5c0f\u7684\uff0c\u968f\u7740 dock \u680f\u5927\u5c0f\u6539\u53d8\uff0c\u5e94\u7528\u56fe\u6807\u7684\u8303\u56f4\u4e3a25\u523070\u4e4b\u95f4\u3002 \u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u64cd\u4f5c\u7cfb\u7edf\u4e0a dock \u680f\u5927\u5c0f\u4e0d\u4e00\u6837\uff0c\u53ef\u4ee5\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u4f20\u5165\u5927\u5c0f\u8303\u56f4\u3002 2.2\u3001click_element\u3001 right_click_element\uff0c double_click_element \u8fd9\u51e0\u4e2a\u65b9\u6cd5\u53c2\u6570\u89c4\u5219\u4e0e find_element \u65b9\u6cd5\u4e00\u6837\u3002\u4ed6\u4eec\u5b9e\u9645\u4e0a\u662f\u5728 find_element \u65b9\u6cd5\u57fa\u7840\u4e4b\u4e0a\u505a\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u589e\u52a0\u4e86\u9f20\u6807\u7684\u52a8\u4f5c\uff0c\u5982\u679c\u4f60\u4e0d\u60f3\u4f7f\u7528\u8fd9\u51e0\u4e2a\u65b9\u6cd5\uff0c\u5728\u7528\u4f8b\u4e2d\u4e5f\u53ef\u4ee5\u901a\u8fc7 find_element \u83b7\u53d6\u5230\u5750\u6807\uff0c\u7136\u540e\u5c06\u5750\u6807\u4f20\u5165\u5230\u952e\u9f20\u7684\u65b9\u6cd5\u4e2d\uff0c\u53ef\u4ee5\u5b9e\u73b0\u540c\u6837\u7684\u6548\u679c\u3002 2.3\u3001\u7528\u4f8b\u7c7b\u4e2d\u6709\u4e2a\u7c7b\u53d8\u91cf icon = [\"deepin-album\"] \u9700\u8981\u7279\u6b8a\u8bf4\u660e\uff0c\u5217\u8868\u4e2d\u7684\u5143\u7d20\u4e3a\u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709 icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684 icon \u5230\u670d\u52a1\u7aef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528 desktop \u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684 desktop \u6587\u4ef6\u540d\u4e3a deepin-album.desktop\uff0c\u53ea\u9700\u8981\u5199 deepin-album \u5373\u53ef\uff0c.desktop \u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e03\u3001\u6267\u884c\u5165\u53e3","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"1\u3001\u7528\u4f8b\u7ec4\u7ec7","text":"\u5728 setting/config/server.ini \u6587\u4ef6\u4e2d APP_NAME= \u5b57\u6bb5\u4e3a\u7528\u4f8b\u7684\u6267\u884c\u7684\u76ee\u5f55\uff0c\u9ed8\u8ba4\u4e3a apps \u76ee\u5f55\u4e0b\u6240\u6709\u7528\u4f8b\u3002\u5982\u679c\u4f60\u60f3\u6307\u5b9a\u6267\u884c\u67d0\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4f60\u53ef\u4ee5\u5c06\u8be5\u914d\u7f6e\u9879\u6307\u5b9a\u5230\u5e94\u7528\u7684\u7528\u4f8b\u76ee\u5f55\uff0c\u6bd4\u5982\uff1aAPP_NAME=deepin_album\uff0c \u8868\u793a\u6267\u884c\u76f8\u518c\u76ee\u5f55\u4e0b\u7684\u7528\u4f8b\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a python3 manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music\n -k KEYWORDS, --keywords KEYWORDS\n \u7528\u4f8b\u7684\u5173\u952e\u8bcd\n -t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e\n --log_level LOG_LEVEL \u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n --env {host,docker} \u5728\u5bbf\u4e3b\u673a\u6216\u5bb9\u5668\u73af\u5883\u6267\u884c\n --client_alias \u9009\u62e9\u6d4b\u8bd5\u673a\u522b\u540d, \u53ef\u9009\u9879\u4e3aclient.ini\u4e2d\u5df2\u914d\u7f6e, \u9ed8\u8ba4\u503c\u4e3a zx-x86.\n --count \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a python3 manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\" --env docker\n \u6ce8\uff1a\u5728\u5bb9\u5668\u4e2d\u6267\u884c\u65f6\uff0c\u82e5\u5f3a\u5236\u9000\u51fa\uff0c\u5bb9\u5668\u5e76\u4e0d\u4f1a\u505c\u6b62\u8fd0\u884c\uff01"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_9","title":"\u516b\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1json","title":"1\u3001Json \u62a5\u544a","text":"\u81ea\u7814\u89c6\u9891\u89e3\u6790\u5de5\u5177\u4f1a\u5bf9\u5355\u6761\u7528\u4f8b\u6267\u884c\u4e00\u8f6e\u751f\u6210\u4e00\u4e2a json \u6587\u4ef6\uff0c\u5b58\u653e\u4e8e report/{app_name}/{scene}/{run_num} \u76ee\u5f55\u4e0b\uff0c\u547d\u540d\u683c\u5f0f\u4e3a\uff1a report.json json \u5185\u5bb9\u4e3e\u4f8b\uff1a [\n{\n\"Stab1\": {\n\"images\": [1,2...150,151],\n\"startStub\": 0,\n\"type\": \"Stab\"\n}\n},\n{\n\"Stab2\": {\n\"images\": [152,153...169,170],\n\"startStub\": 1,\n\"type\": \"UnStab\"\n}\n},\n{\n\"Stab3\": {\n\"images\": [171,172...300,301],\n\"startStub\": 0,\n\"type\": \"UnStab\"\n}\n}\n]\n \u8bf4\u660e\uff1a Stab \uff1a\u8868\u793a\u89e3\u6790\u8fc7\u7a0b\u4e2d\u4e0d\u540c\u7684\u9636\u6bb5\u3002 images \uff1a\u8868\u793a\u6bcf\u4e00\u5e27\u7684\u56fe\u7247\u5e8f\u53f7\u3002 startStub\uff1a \u4e3a\u8bc6\u522b\u5c3e\u5e27\u7684\u9636\u6bb5\u8868\u793a\uff0c\u5982\u679c \"startStub\": 1 \uff0c\u8bf4\u660e\u5c3e\u5e27\u51fa\u73b0\u5728\u8be5\u9636\u6bb5\u3002 type\uff1a \u4e3a Stab \u6216 UnStab \uff0c\u8868\u793a\u7a33\u5b9a\u9636\u6bb5\u6216\u4e0d\u7a33\u5b9a\u9636\u6bb5\u3002 \u5404\u9636\u6bb5\u6709\u5e27\u6570\u8865\u507f\uff0c\u9ed8\u8ba4\u8865\u507f\u7684\u5e27\u6570\u4e3a 3 \u5e27\uff08\u53ef\u4ee5\u901a\u8fc7 server.ini \u91cc\u9762 un_stab_start=3 \u8fdb\u884c\u914d\u7f6e\uff09\uff0c\u8868\u793a\u5c0f\u4e8e\u7b49\u4e8e 3 \u5e27\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u524d\u540e\u5747\u9700\u8981\u51cf\u6389\u3002 \u5e94\u7528\u542f\u52a8\u9636\u6bb5\u5c31\u662f\u5728 Stab2 \u9636\u6bb5\uff0c\u542f\u52a8\u65f6\u95f4\u4e3a\uff1a171 \u51cf 151 \u518d\u51cf\u6389\u524d\u540e\u8865\u507f\u5e27\u6570 6 \u5e27\uff0c\u5373 14 \u5e27\uff0c\u89c6\u9891\u5e27\u7387 30 \u5e27/\u79d2\uff0c\u56e0\u6b64\u542f\u52a8\u8017\u65f6\u4e3a\uff1a14 * 33 = 462 ms"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2excel","title":"2\u3001Excel \u62a5\u544a","text":"\u6240\u6709\u7528\u4f8b\u6267\u884c\u5e76\u89e3\u6790\u5b8c\u4e4b\u540e\u4f1a report \u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a\u6c47\u603b\u6570\u636e\u7684 Excel \u6587\u4ef6\uff0c\u6587\u4ef6\u540d\u4e3a\uff1a{time}_perf_time.xlsx\u3002 \u6ce8\u610f\uff0creport \u76ee\u5f55\u4e3a\u53ef\u914d\u7f6e\u9879\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u4f1a\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u751f\u6210\uff0c\u5982\u679c\u4f60\u5c06 report\uff0c\u6307\u5b9a\u5230\u9879\u76ee\u4e0b\u5176\u4ed6\u8def\u5f84\uff0c\u5219\u4f1a\u5728\u5bf9\u5e94\u7684\u8def\u5f84\u4e0b\u751f\u6210 json \u548c Excel \u6587\u4ef6\u3002 \u4f60\u4e5f\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8bfb\u53d6\u6240\u6709 json / excel \u62a5\u544a\u7684\u6570\u636e\uff0c\u751f\u6210\u4f60\u81ea\u5df1\u60f3\u8981\u7684\u4e00\u4e9b\u6d4b\u8bd5\u62a5\u544a\u5f62\u5f0f\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#usb","title":"\u4e5d\u3001USB \u4e32\u53e3\u9a71\u52a8\u952e\u9f20\u65b9\u6cd5","text":"\u4f4d\u4e8e src/utils/control/serial_communication \u76ee\u5f55\u4e0b\u7684 usb_mk.py \u6587\u4ef6 usb_mk = UsbMk()\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up()\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u652f\u6301\u4f20\u5165\u6c49\u5b57\uff0c\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click()\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() \n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() \n \uff084\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() \n \uff085\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() \n \uff086\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() \n \uff087\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff088\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff0810\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_10","title":"\u5341\u3001\u7ee7\u7535\u5668\u63a7\u5236\u4e3b\u673a\u5f00\u673a/\u91cd\u542f","text":"\uff08\u82e5\u4e0d\u4f7f\u7528\u7ee7\u7535\u5668\uff0c\u53ef\u5ffd\u7565\u8be5\u6b65\u9aa4\uff0c\u6267\u884c\u65f6\u4f1a\u901a\u8fc7\u547d\u4ee4 reboot\uff09"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u7ee7\u7535\u5668\u8bbe\u5907","text":"LCUS-2 \u578b \u53cc\u8def USB \u667a\u80fd\u4e32\u53e3\u63a7\u5236\u7ee7\u7535\u5668\u3002 https://item.taobao.com/item.htm?spm=a1z09.2.0.0.41d72e8dUYx2pi&id=582653718178&_u=i25r20ia6a2e "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2usb","title":"2\u3001USB \u5ef6\u957f\u7ebf","text":"\u666e\u901a\u7684 USB \u7ebf\u5373\u53ef\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_3","title":"3\u3001\u675c\u90a6\u7ebf","text":"3.1\u300140P \u6bcd\u5bf9\u516c\u675c\u90a6\u7ebf\u3002 3.2\u3001\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"4\u3001\u5b89\u88c5\u56fe\u6587\u6559\u7a0b","text":"4.1\u3001\u4f7f\u7528 USB \u5ef6\u957f\u7ebf\u8fde\u63a5\u63a7\u5236\u7aef\u548c\u7ee7\u7535\u5668\u3002 4.2\u3001\u5728\u7ee7\u7535\u5668\u5e38\u7aef\u548c\u516c\u5171\u7aef\u5747\u8fde\u63a5\u4e00\u6839\u675c\u90a6\u7ebf\u3002 4.3\u3001\u5728\u4e3b\u677f\u4e0a\u5f00\u673a\u9488\u548c\u91cd\u542f\u9488\u4e0a\u63d2\u4e0a\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 4.4\u3001\u5c06\u5f00\u673a\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76841\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1\u5de6\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 4.5\u3001\u5c06\u91cd\u542f\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76842\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1 \u53f3\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 \u82e5\u60f3\u4fdd\u7559\u539f\u7535\u6e90\u5f00\u5173\u7684\u7535\u6e90\u706f\uff0c\u53ef\u6839\u636e\u5982\u4e0a\u56fe\u6240\u793a\uff0c\u4f7f\u7528\u675c\u90a6\u7ebf\u8fde\u63a5\u4e3b\u677f\u4e0a\u7684\u7535\u6e90\u706f\u548c\u539f\u7535\u6e90\u5f00\u5173"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_11","title":"\u5341\u4e00\u3001\u5e38\u89c1\u95ee\u9898\u8bf4\u660e","text":"1\u3001ERROR: for uos Cannot restart container 2301b1a1395d7959ee6523d61b61c87084649af530786cdb8fb5b3ecbcbd1068: linux runtime spec devices: error gathering device information while adding custom device \"/dev/ttyACM0\": no such file or directory \u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u8fde\u63a5\u72b6\u6001\uff0c\u67e5\u770b /dev/ttyACM0 \u662f\u5426\u5b58\u5728\uff0c\u82e5\u5b58\u5728 /dev/ttyACMn\uff08n\u4e3a\u4efb\u610f\u6570\u5b57\uff09\uff0c\u91cd\u542f\u7535\u8111\u89e3\u51b3\u3002 2\u3001Error response from daemon: Container 5e700fdc769e8c74666d68a7f2bc3de58268b4594cf88706609d59f8dbc7362d is not running \u5bb9\u5668\u542f\u52a8\u5931\u8d25 1\uff09\u68c0\u67e5\u54ea\u4e00\u4e2a\u5bb9\u5668\u672a\u542f\u52a8 sudo docker container ls # \u5217\u51fa\u8fd0\u884c\u4e2d\u7684 Docker \u5bb9\u5668\n 2\uff09\u7f3a\u5c11 uos \u5bb9\u5668\uff0c\u68c0\u67e5 USB \u4e32\u53e3\u8fde\u63a5\u7ebf\u548c\u91c7\u96c6\u76d2\u8fde\u63a5\u7ebf\u662f\u5426\u6b63\u5e38\uff0c\u91cd\u542f\u540e\u6267\u884c bash install/setup.up # \u91cd\u65b0\u5b8c\u6574\u90e8\u7f72\u73af\u5883\n \u6216\u6267\u884c sudo docker-compose up -d --build # \u4ec5\u91cd\u65b0\u6784\u5efa Docker \u955c\u50cf\n 3\u3001\u82e5\u90e8\u7f72\u65f6\u63d0\u793a\u6302\u8f7d ttyACM0\u3001video0 \u5931\u8d25\uff0c\u8bf7\u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u53ca\u91c7\u96c6\u76d2\u662f\u5426\u63a5\u89e6\u826f\u597d\uff0c\u82e5\u63a5\u89e6\u826f\u597d\uff0c\u91cd\u542f\u5373\u53ef\u89e3\u51b3\u3002 4\u3001\u82e5\u51fa\u73b0\u56fe\u7247\u80fd\u8bc6\u522b\uff0c\u4f46\u662f\u9f20\u6807\u672a\u79fb\u52a8\u64cd\u4f5c\u65f6\uff0c\u5b89\u88c5\u7edd\u5bf9\u9f20\u6807\u64cd\u4f5c\u7684\u4f9d\u8d56\u5305\uff0c\u89c1\u7b2c\u4e09\u8282\u7b2c\u4e8c\u5c0f\u8282\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u6d4b\u8bd5\u673a\u3002 5\u3001\u7531\u4e8e\u901a\u8fc7\u91c7\u96c6\u5361\u83b7\u53d6\u7684\u6d4b\u8bd5\u673a\u5b9e\u65f6\u753b\u9762\uff0c\u5305\u542b\u4e86\u9f20\u6807\u7684\u6837\u5f0f\uff0c\u6240\u4ee5\u5bf9\u56fe\u7247\u8bc6\u522b\u65f6\uff0c\u9f20\u6807\u82e5\u505c\u7559\u5728\u56fe\u6807\u4e0a\u5c42\uff0c\u5219\u4f1a\u5bf9\u8bc6\u522b\u7ed3\u679c\u9020\u6210\u5f71\u54cd\uff0c\u9700\u8981\u5c06\u9f20\u6807\u79fb\u52a8\u81f3\u5176\u4ed6\u4f4d\u7f6e\uff0c\u6216\u8005\u9690\u85cf\u9f20\u6807\u89e3\u51b3\u3002 6\u3001Excel \u62a5\u544a\u4e2d\uff0c\u6d4b\u8bd5\u573a\u666f\u5217\u4e0e\u7528\u4f8b\u4e2d\u7684\u4e0d\u4e00\u81f4\uff0c\u5173\u952e\u5b57scene\u3001app_name\u3001\u67b6\u6784\u522b\u540d\uff0c\u4e0d\u80fd\u5305\u542b\u4e0b\u5212\u7ebf\u548c\u82f1\u6587\u7b26\u53f7\u7684\u5706\u62ec\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/","title":"\u6846\u67b6\u529f\u80fd\u4ecb\u7ecd","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2023/1/12\n# Author : Mikigo\n# =============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_2","title":"\u4e00\u3001\u4e00\u53e5\u8bdd\u7b80\u4ecb","text":"\u6b64\u6587\u6863\u4e3b\u8981\u60f3\u5bf9 YouQu \u6846\u67b6\u4e00\u4e9b\u91cd\u70b9\u7684\u529f\u80fd\u505a\u8be6\u7ec6\u7684\u4ecb\u7ecd\uff0c\u5305\u62ec\u5bf9\u4e00\u4e9b\u529f\u80fd\u5f00\u53d1\u7684\u80cc\u666f\u3001\u8981\u89e3\u51b3\u7684\u95ee\u9898\u3001\u5b9e\u73b0\u903b\u8f91\u3001\u4ee3\u7801\u7b49\u65b9\u9762\u7684\u4ecb\u7ecd\uff0c\u4ee5\u6b64\u8ba9\u5927\u5bb6\u80fd\u66f4\u52a0\u6e05\u6670\u7684\u7406\u89e3\u5404\u9879\u529f\u80fd\uff0c\u4ece\u800c\u5728\u4f7f\u7528\u7684\u65f6\u5019\u80fd\u66f4\u52a0\u7684\u5f97\u5fc3\u5e94\u624b\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_3","title":"\u4e8c\u3001\u56fe\u50cf\u8bc6\u522b","text":"\u56fe\u50cf\u8bc6\u522b\u5728 UI \u81ea\u52a8\u5316\u4e2d\u662f\u4e0d\u53ef\u7f3a\u5c11\u7684\uff0c\u5e02\u9762\u4e0a\u751a\u81f3\u6709\u5b8c\u5168\u57fa\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\uff0c\u6bd4\u5982 Airtest\u3001Sikuli \u7b49\uff0c\u5728\u6e38\u620f\u7b49\u7279\u5b9a\u9886\u57df\u4e5f\u6709\u4e0d\u9519\u7684\u6548\u679c\uff0c\u8fd9\u4e9b\u5de5\u5177\u5b9e\u9645\u4e0a\u4e5f\u662f\u7528\u7684 OpenCV \u8fdb\u884c\u4e86\u5c01\u88c5\uff0cYouQu \u6846\u67b6\u57fa\u4e8e OpenCV \u5f00\u53d1\u4e86\u81ea\u5df1\u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\uff0c\u5b83\u53ef\u4ee5\u65b9\u4fbf\u7684\u7528\u4e8e\u754c\u9762\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u65ad\u8a00\uff1b YouQu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u51e0\u4e4e\u6ee1\u8db3\u4e86\u4f60\u7684\u6240\u6709\u8981\u6c42\uff0c\u6211\u4eec\u5728\u957f\u65f6\u95f4\u7684\u601d\u8003\u548c\u6478\u7d22\u4e2d\uff0c\u9488\u5bf9\u5e38\u89c4\u573a\u666f\u53ca\u4e00\u4e9b\u7279\u6b8a\u573a\u666f\u63a2\u7d22\u9664\u4e86\u4e00\u4e9b\u5b9e\u7528\u4e14\u6709\u6548\u7684\u65b9\u6848\uff0c\u4e14\u542c\u6211\u6162\u6162\u9053\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1","title":"1\u3001\u5e38\u89c4\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5e38\u89c4\u8bc6\u522b\u5f88\u597d\u7406\u89e3\uff0c\u4e00\u53e5\u8bdd\u8bb2\u5c31\u662f\uff0c\u8981\u83b7\u53d6\u5230\u76ee\u6807\u5143\u7d20\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u3002 \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u5728\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u9700\u8981\u83b7\u53d6\u7684\u5750\u6807\u662f\u76f8\u5bf9\u4e8e\u6574\u4e2a\u5c4f\u5e55\u7684\u5750\u6807\uff0c\u6211\u4eec\u53ef\u4ee5\u622a\u53d6\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u56fe\u7247\uff08screen\uff09\uff1b \u5728\u5143\u7d20\u8bc6\u522b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u622a\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5c0f\u56fe\u8fdb\u884c\u8bc6\u522b\uff0c\u6bd4\u5982\u622a\u53d6\u64ad\u653e\u6309\u94ae\uff1a \u90a3\u4e48\u5b9e\u9645\u4e0a\uff0c\u5143\u7d20\u5b9a\u4f4d\u7684\u95ee\u9898\u5c31\u8f6c\u6362\u4e3a\uff0c\u5c06\u622a\u56fe\u7684\u5c0f\u56fe\uff08play_btn\uff09\u62ff\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u5927\u56fe\uff08screen\uff09\u4e2d\u53bb\u505a\u5339\u914d\uff0c\u5982\u679c\u5339\u914d\u6210\u529f\uff0c\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff08 x, y \uff09\u5373\u53ef\u3002 \u4e3a\u4e86\u65b9\u4fbf\u63cf\u8ff0\uff0c\u4ee5\u4e0b\u6211\u5c06\u6574\u4e2a\u5c4f\u5e55\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5927\u56fe\uff0c\u67d0\u4e2a\u5143\u7d20\u56fe\u7247\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5c0f\u56fe\u3002 \u57fa\u4e8e OpenCV \u7684\u6a21\u677f\u5339\u914d cv.matchTemplate() \u529f\u80fd\uff0c\u6211\u4eec\u5b9e\u73b0\u4e86\u56fe\u50cf\u5b9a\u4f4d\u7684\u529f\u80fd\uff0c\u6846\u67b6\u63d0\u4f9b\u4e86\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u5e95\u5c42\u63a5\u53e3\uff08\u4e00\u822c\u4e0d\u5bf9\u4e0a\u5c42\u63d0\u4f9b\u8c03\u7528\uff09\uff1a def _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\n# \u8be6\u7ec6\u4ee3\u7801\u592a\u957f\u4e0d\u8d34\u4e86\uff0c\u611f\u5174\u8da3\u8bf7\u67e5\u770b\u6e90\u7801\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001image_path image_path \u662f\u5c0f\u56fe\u7684\u7edd\u5bf9\u8def\u5f84; \u901a\u5e38\u5728 AT \u5de5\u7a0b\u91cc\u9762\uff0c\u6211\u4eec\u7ea6\u5b9a\u5c06\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u5b9e\u9645\u7684\u5143\u7d20\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1aplay_btn.png \uff1b \u7528\u4e8e\u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 case/assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1amusic_001.png \uff1b \u8fd9\u6837\u662f\u4e3a\u4e86\u65b9\u4fbf\u7ba1\u7406\u548c\u7ef4\u62a4\u3002 2\u3001rate \u56fe\u50cf\u8bc6\u522b\u7684\u7684\u5339\u914d\u5ea6\u6216\u8005\u8bf4\u76f8\u4f3c\u5ea6\uff0c\u6846\u67b6\u9ed8\u8ba4\u7684\u914d\u7f6e\u4e3a 0.9\uff0c\u4e5f\u5c31\u662f\u8bf4\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u5b58\u5728\u4e00\u4e2a\u76f8\u4f3c\u5ea6 90% \u7684\u56fe\u6807\u5373\u8fd4\u56de\u5176\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff1b \u5982\u679c\u4f60\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u8c03\u6574\u8bc6\u522b\u5ea6\uff0c\u4f60\u53ef\u4ee5\u5728\u8c03\u7528\u51fd\u6570\u7684\u65f6\u5019\uff0c\u4f20\u5165\u4e0d\u540c\u7684\u8bc6\u522b\u5ea6\u7684\u503c\u3002 3\u3001multiple \u9ed8\u8ba4\u60c5\u51b5\u4e0b multiple=False\uff0c\u8868\u793a\u53ea\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u7b2c\u4e00\u4e2a\uff0c\u5982\u679c multiple=True \u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\uff0c\u56e0\u4e3a\u5927\u56fe\u4e2d\u53ef\u80fd\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u5c0f\u56fe\uff0c\u5728\u67d0\u4e9b\u573a\u666f\u4e0b\u4f60\u53ef\u80fd\u9700\u8981\u5168\u90e8\u83b7\u53d6\u5230\u6240\u6709\u5339\u914d\u5230\u7684\u5750\u6807\u3002 4\u3001picture_abspath \u9ed8\u8ba4\u60c5\u51b5\u4e0b picture_abspath=None \u8868\u793a\u5927\u56fe\u4e3a\u622a\u53d6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u5982\u679c\u4f60\u4e0d\u5e0c\u671b\u5927\u56fe\u662f\u5c4f\u5e55\u7684\u622a\u56fe\uff0c\u800c\u662f\u4f60\u81ea\u5b9a\u4e49\u4f20\u5165\u7684\u67d0\u4e2a\u56fe\u7247\uff0c\u4f60\u53ea\u9700\u8981\u5c06\u4f60\u7684\u56fe\u7247\u8def\u5f84\u4f20\u9012\u7ed9\u8fd9\u4e2a\u53c2\u6570\u5c31\u884c\uff0c\u6bd4\u5982\uff1a picture_abspath=\"~/Desktop/big.png\" \uff1b 5\u3001screen_bbox \u5927\u56fe\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u622a\u53d6\u6574\u4e2a\u5c4f\u5e55\uff0cscreen_bbox = [x, y, w, h] \u53ef\u4ee5\u6307\u5b9a\u622a\u53d6\u5c4f\u5e55\u4e2d\u7684\u56fa\u5b9a\u533a\u57df\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\uff0c\u53ef\u4ee5\u6392\u9664\u90e8\u5206\u533a\u57df\u5bf9\u8bc6\u522b\u7ed3\u679c\u7684\u5f71\u54cd\u3002 \u3010\u9690\u5f0f\u7b49\u5f85\u3011 \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\uff0c\u6709\u65f6\u5019\u9875\u9762\u8df3\u8f6c\u6709\u5ef6\u65f6\uff0c\u6709\u53ef\u80fd\u5b58\u5728\u8bc6\u522b\u7684\u90a3\u4e00\u523b\u9875\u9762\u4e5f\u6ca1\u6709\u8df3\u8f6c\u51fa\u6765\uff0c\u6216\u8005\u6216\u8005\u8bc6\u522b\u7684\u90a3\u4e00\u523b\uff1b \u56e0\u6b64\u6211\u4eec\u9700\u8981\u4e00\u79cd\u7b49\u5f85\u673a\u5236\uff0c\u5373\u5728\u4e00\u5b9a\u7684\u65f6\u95f4\u5185\uff0c\u5982\u679c\u8bc6\u522b\u4e0d\u5230\uff0c\u91cd\u590d\u53bb\u8bc6\u522b\uff1a def find_image(\ncls,\n*widget, rate: [float, int] = None,\nmultiple: bool = False,\nmatch_number: int = None,\npicture_abspath: str = None,\nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u5728\u5c4f\u5e55\u4e2d\u533a\u5bfb\u627e\u5c0f\u56fe\uff0c\u8fd4\u56de\u5750\u6807\uff0c\n \u5982\u679c\u627e\u4e0d\u5230\uff0c\u6839\u636e\u914d\u7f6e\u91cd\u8bd5\u6b21\u6570\uff0c\u6bcf\u6b21\u95f4\u96941\u79d2\n :param widget: \u6a21\u677f\u56fe\u7247\u8def\u5f84\n :param rate: \u76f8\u4f3c\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param match_number: \u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\n :return: \u5750\u6807\u5143\u7ec4\n \"\"\"\nif rate is None:\nrate = float(GlobalConfig.IMAGE_RATE)\ntry:\nfor element in widget:\nfor _ in range((match_number or int(GlobalConfig.IMAGE_MATCH_NUMBER)) + 1):\nlocate = cls._match_image_by_opencv(\nelement,\nrate,\nmultiple=multiple,\npicture_abspath=picture_abspath,\nscreen_bbox=screen_bbox\n)\nif not locate:\nsleep(int(GlobalConfig.IMAGE_MATCH_WAIT_TIME))\nelse:\nreturn locate\nraise TemplateElementNotFound(*widget)\nexcept Exception as e:\nraise e\n \u53c2\u6570 match_number \u7528\u4e8e\u63a7\u5236\u91cd\u590d\u8bc6\u522b\u7684\u6b21\u6570\uff0c\u9ed8\u8ba4\u4e0d\u4f20\u53c2\uff0c\u53d6\u5168\u5c40\u914d\u7f6e setting/globalconfig.ini \u91cc\u9762\u7684 IMAGE_MATCH_NUMBER \u914d\u7f6e\u9879\u7684\u503c\uff0c\u9ed8\u8ba4IMAGE_MATCH_NUMBER = 1\uff0c\u5373\u91cd\u8bd5 1 \u6b21\uff1b find_image \u662f\u6846\u67b6\u63d0\u4f9b\u7684\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u51fd\u6570\u63a5\u53e3\uff0c\u8fd9\u4e2a\u51fd\u6570\u63d0\u4f9b\u4e86\u9690\u5f0f\u7b49\u5f85\u7684\u529f\u80fd\uff0c\u4e14\u5305\u542b\u4e0a\u9762\u4ecb\u7ecd\u7684 _match_image_by_opencv \u51fd\u6570\u7684\u6240\u6709\u529f\u80fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2","title":"2\u3001\u6c14\u6ce1\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u6c14\u6ce1\u8bc6\u522b\u6307\u7684\u662f\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\u8981\u5b9a\u4f4d\u7684\u5143\u7d20\u662f\u4e00\u4e9b\u4f1a\u6d88\u5931\u7684\u5c0f\u5f39\u7a97\uff0c\u8fd9\u7c7b\u573a\u666f\u5728\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\u5c31\u53ef\u80fd\u5b58\u5728\u4e0d\u7a33\u5b9a\u6027\uff0c\u6709\u53ef\u80fd\u56fe\u50cf\u8bc6\u522b\u7684\u65f6\u5019\u6c14\u6ce1\u5df2\u7ecf\u6d88\u5931\u4e86\uff0c\u4e5f\u6709\u53ef\u80fd\u6c14\u6ce1\u51fa\u73b0\u7684\u65f6\u95f4\u592a\u77ed\u4e86\uff0c\u4e0d\u5bb9\u6613\u6355\u6349\u5230\uff0c\u5c31\u50cf\u6c14\u6ce1\u4e00\u6837\uff0c\u51fa\u73b0\u4e00\u4e0b\u5c31\u6d88\u5931\uff0c\u56e0\u6b64\u6211\u4eec\u5f62\u8c61\u7684\u79f0\u4e4b\u4e3a \u201c\u6c14\u6ce1\u8bc6\u522b\u201d\uff1b \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u4e3a\u4e86\u80fd\u7a33\u5b9a\u7684\u8bc6\u522b\u6c14\u6ce1\u7c7b\u573a\u666f\uff0c\u6211\u4eec\u91c7\u7528\u7684\u65b9\u6848\u662f\uff1a \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\uff08\u5305\u542b\u6c14\u6ce1\u4ece\u51fa\u73b0\u5230\u6d88\u5931\uff09\uff0c\u4e0d\u505c\u7684\u622a\u53d6\u8fd9\u6bb5\u65f6\u95f4\u5185\u7684\u5927\u56fe\uff0c\u4ee5\u6b64\u786e\u4fdd\u5728\u622a\u53d6\u7684\u4e00\u5806\u56fe\u7247\u4e2d\uff0c\u80af\u5b9a\u6709\u81f3\u5c11\u4e00\u5f20\u56fe\u7247\u80fd\u6355\u6349\u5230\u6c14\u6ce1\uff0c\u6700\u540e\u518d\u5bf9\u8fd9\u4e00\u5806\u56fe\u7247\u9010\u4e2a\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def get_during(\ncls,\nimage_path: str,\nscreen_time: [float, int],\nrate: float = None,\npause: [int, float] = None,\nmax_range: int = 10000\n):\n\"\"\"\n \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u622a\u56fe\u591a\u5f20\u56fe\u7247\u8fdb\u884c\u8bc6\u522b\uff0c\u5176\u4e2d\u6709\u4e00\u5f20\u56fe\u7247\u8bc6\u522b\u6210\u529f\u5373\u8fd4\u56de\u7ed3\u679c;\n \u9002\u7528\u4e8e\u6c14\u6ce1\u7c7b\u7684\u65ad\u8a00\uff0c\u6bd4\u5982\u6c14\u6ce1\u57281\u79d2\u5185\u6d88\u5931\uff0c\u5982\u679c\u7528\u5e38\u89c4\u7684\u56fe\u50cf\u8bc6\u522b\u5219\u6709\u53ef\u80fd\u65e0\u6cd5\u8bc6\u522b\u5230\uff1b\n :param image_path: \u8981\u8bc6\u522b\u7684\u6a21\u677f\u56fe\u7247\uff1b\n :param screen_time: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff1b\n :param rate: \u8bc6\u522b\u7387\uff1b\n :param pause: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u4e0d\u95f4\u9694\uff1b\n :param max_range: \u622a\u56fe\u7684\u6700\u5927\u6b21\u6570\uff0c\u8fd9\u662f\u4e00\u4e2a\u9884\u8bbe\u503c\uff0c\u4e00\u822c\u60c5\u51b5\u4e0b\u4e0d\u6d89\u53ca\u4fee\u6539\uff1b\n \"\"\"\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001screen_time \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5728\u6b64\u65f6\u95f4\u5185\u4f1a\u4e0d\u65ad\u7684\u8fdb\u884c\u622a\u56fe\u64cd\u4f5c\uff0c\u5c31\u50cf\u5f55\u5236\u89c6\u9891\u4e00\u6837\uff1b 2\u3001pause \u6bcf\u6b21\u622a\u53d6\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u4e00\u523b\u4e0d\u505c\u7684\u622a\u56fe\uff0c\u5982\u679c\u4f60\u60f3\u6bcf\u6b21\u622a\u56fe\u5b58\u5728\u4e00\u4e9b\u95f4\u9694\u65f6\u95f4\u4f20\u5165\u5bf9\u5e94\u7684\u65f6\u95f4\u95f4\u9694\u5373\u53ef\uff0c\u5355\u4f4d\u662f\u79d2\uff0c\u6bd4\u5982\uff1apause = 0.03\uff0c\u8868\u793a 30 ms\uff0c\u76f8\u5f53\u4e8e\u5e27\u7387\u4e3a 30 \u5e27\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-opencv","title":"3\u3001\u4e0d\u4f9d\u8d56 OpenCV \u7684\u56fe\u50cf\u8bc6\u522b\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31","title":"3.1\u3001\u81ea\u7814\u56fe\u50cf\u8bc6\u522b\u6280\u672f","text":"\u3010\u539f\u7406\u3011 \u4e3a\u4e86\u5b9e\u73b0\u8bc6\u522b\u56fe\u50cf\u7684\u76ee\u7684\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u5c06\u56fe\u7247\u7684\u6bcf\u4e2a\u50cf\u7d20\u7684RGB\u503c\uff0c\u4e0e\u6574\u4e2a\u5c4f\u5e55\u4e2d\u7684RGB\u8fdb\u884c\u5bf9\u6bd4\uff0c\u5982\u679c\u5c0f\u56fe\u4e0a\u7684RGB\u503c\u4e0e\u5bf9\u5e94\u5927\u56fe\u4f4d\u7f6e\u7684RGB\u90fd\u76f8\u7b49\uff0c\u5219\u5339\u914d\u6210\u529f\uff0c\u5373\u53ef\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u70b9\u3002 1\u3001\u8bfb\u53d6\u5c0f\u56fe\u548c\u5927\u56fe\u7684RGB\u503c \uff081\uff09\u5c0f\u56fe\u7684RGB\u503c small_data = small_pic.load() # load()\u4f1a\u5c06\u56fe\u7247\u7684RGB\u503c\u83b7\u53d6\u5230\uff0c\u6570\u636e\u683c\u5f0f\u4e3a\u4e00\u4e2a\u4e8c\u7ef4\u5217\u8868\uff0c\u8d4b\u503c\u7ed9\u4e00\u4e2a\u53d8\u91cfsmall_data\u3002\n \uff082\uff09\u5927\u56fe\u7684RGB\u503c big_data = big_pic.load()\n 2\u3001\u5c06\u5c0f\u56fe\u4e0e\u5927\u56fe\u7684RGB\u503c\u8fdb\u884c\u5339\u914d \uff081\uff09\u5339\u914d\u4ece\u5927\u56fe\u7684\u5750\u6807\uff080\uff0c0\uff09\u5f00\u59cb\u5339\u914d\uff0c\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff082\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\uff080\uff0c0\uff09\u5bf9\u5e94\u7684\u6240\u6709\u5c0f\u56fe\u7684RGB\u503c\u4e0d\u76f8\u7b49\uff0c\u5219\u79fb\u52a8\u5230\u4e0b\u4e00\u4e2a\u5750\u6807\u70b9\uff081\uff0c0\uff09\uff0c\u540c\u6837\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff083\uff09\u6309\u7167\u8fd9\u6837\u7684\u89c4\u5f8b\u5c06\u8fd9\u4e00\u884c\u6bcf\u79fb\u52a8\u4e00\u4e2a\u5750\u6807\u70b9\uff0c\u90fd\u5c06\u5c0f\u56fe\u6240\u6709\u7684RGB\u4e0e\u5bf9\u5e94\u5927\u56fe\u7684\u503c\u8fdb\u884c\u5339\u914d\uff1b \uff084\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\u5176\u4e2d\u4e00\u4e2a\u5750\u6807\u70b9\u4e0a\u5339\u914d\u5230\u4e86\u5c0f\u56fe\u7684\u6240\u6709RGB\u503c\uff0c\u5219\u6b64\u65f6\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\u70b9\uff1b \uff085\uff09\u5982\u679c\u5339\u914d\u4e86\u5927\u56fe\u6240\u6709\u7684\u5750\u6807\u70b9\uff0c\u90fd\u6ca1\u6709\u5339\u914d\u5230\uff0c\u5219\u8bf4\u660e\u5927\u56fe\u4e2d\u4e0d\u5b58\u5728\u5c0f\u56fe\uff0c\u5339\u914d\u5931\u8d25\uff1b \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 class ImageRgb:\n@staticmethod\ndef _check_match(_x, _y, small, bdata, sdata, rate):\n\"\"\"\n Matching degree of small graph and large graph matching\n \"\"\"\n@staticmethod\ndef _pre_random_point(small):\n\"\"\"\n Pre matching, take 10-20 points at random each time,\n and take coordinates randomly in the small graph\n \"\"\"\n@staticmethod\ndef _pre_random_match(_x, _y, point_list, bdata, sdata, rate):\n\"\"\"\n In the small graph, several points are randomly\n selected for matching, and the matching degree is\n also set for the random points\n \"\"\"\n@classmethod\ndef match_image_by_rgb(cls, image_name=None, image_path=None, rate=0.9):\n\"\"\"\n By comparing the RGB values of the small image with the large\n image on the screen, the coordinates of the small image on\n the screen are returned.\n \"\"\"\n \u901a\u8fc7 match_image_by_rgb() \u8fd9\u4e2a\u51fd\u6570\uff0c\u4f20\u5165\u76ee\u6807\u5c0f\u56fe\u7684\u6587\u4ef6\u540d\u79f0\uff0c\u5373\u53ef\u8fd4\u56de\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u3002 \u6709\u540c\u5b66\u8981\u95ee\u4e86\uff0c\u6709 OpenCV \u5e72\u561b\u4e0d\u7528\uff0c\u6709\u5fc5\u8981\u81ea\u5df1\u5b9e\u73b0\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u529f\u80fd\u5417\uff0c\u4f60\u4eec\u662f\u4e0d\u662f\u95f2\u7684\u554a\uff1f \u8fd9\u4e48\u95ee\u7684\u8bdd\uff0c\u5c0f\u4e86\uff0c\u683c\u5c40\u5c0f\u4e86\uff1b\u6211\u4eec\u81ea\u5df1\u5b9e\u73b0\u4e3b\u8981\u6709\u51e0\u65b9\u9762\u539f\u56e0\uff1a \u51cf\u5c11\u73af\u5883\u4f9d\u8d56\uff0c\u5373\u4e0d\u7528\u5b89\u88c5 OpenCV\uff0c\u6211\u4eec\u4e5f\u80fd\u5b9e\u73b0\u5176\u529f\u80fd\uff0c\u73af\u5883\u4f9d\u8d56\u8fd9\u5757\u540e\u9762\u4f1a\u5355\u72ec\u8be6\u7ec6\u8bb2\uff0c\u51cf\u5c11\u73af\u5883\u4f9d\u8d56\u5bf9\u4e8e\u4efb\u4f55\u8f6f\u4ef6\u5de5\u7a0b\u90fd\u975e\u5e38\u91cd\u8981\uff1b OpenCV \u5728\u5176\u4ed6\u56fd\u4ea7 CPU \u67b6\u6784\u4e0a\u5b89\u88c5\u5e76\u4e0d\u80fd\u4fdd\u8bc1100%\u6210\u529f\uff0c\u751a\u81f3\u6709\u6ca1\u6709\u53ef\u80fd\u5728\u4e00\u4e9b\u67b6\u6784\u4e0a\u538b\u6839\u513f\u5c31\u4e0d\u80fd\u5b89\u88c5\u4f7f\u7528 OpenCV \uff1f \u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 OpenCV \uff1f\u5c31\u50cf\u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 Windows \u5462\uff1f\u8fd9\u4e9b\u95ee\u9898\u503c\u5f97\u601d\u8003\u3002 \u5f53\u7136\uff0c\u6211\u4eec\u627f\u8ba4\u8fd9\u5957\u65b9\u6848\uff0c\u867d\u7136\u8bc6\u522b\u51c6\u786e\u7387\u6ca1\u95ee\u9898\uff0c\u4f46\u5728\u8bc6\u522b\u6548\u7387\u4e0a\u8fd8\u6ca1\u6709\u8fbe\u5230 OpenCV \u6a21\u677f\u5339\u914d\u7684\u6548\u679c\uff0c\u6211\u4eec\u7684\u65b9\u6848\u6bcf\u6b21\u8bc6\u522b\u5728 1.5s \u5de6\u53f3\uff0c\u800c OpenCV \u5728 1s \u5de6\u53f3\uff1b \u6574\u4f53\u8bc6\u522b\u6548\u679c\u6765\u8bb2\uff0c\u6211\u8ba4\u4e3a\u8fd8\u662f\u53ef\u4ee5\u63a5\u53d7\u7684\uff0c\u4e5f\u5e0c\u671b\u6709\u5fd7\u4e4b\u58eb\u80fd\u4e00\u8d77\u4f18\u5316\u6b64\u65b9\u6848\uff0c\u4e00\u8d77\u6280\u672f\u62a5\u56fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32-rpc","title":"3.2\u3001\u57fa\u4e8e RPC \u670d\u52a1\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b","text":"\u5728\u8fdc\u7a0b\u670d\u52a1\u5668\u4e0a\u90e8\u7f72 OpenCV \u7684\u73af\u5883\uff0c\u5e76\u5c06\u5176\u90e8\u7f72\u4e3a RPC \u670d\u52a1\uff0c\u6d4b\u8bd5\u673a\u4e0a\u4e0d\u7528\u5b89\u88c5 OpenCV \u4f9d\u8d56\uff0c\u800c\u662f\u901a\u8fc7\u8bf7\u6c42 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u3010\u539f\u7406\u3011 \u6d4b\u8bd5\u673a\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u56fe\u7247\u4ee5\u53ca\u6a21\u677f\u56fe\u7247\uff0c\u53d1\u9001\u7ed9 RPC \u670d\u52a1\u7aef\uff0c\u670d\u52a1\u7aef\u62ff\u5230\u4e24\u5f20\u56fe\u7247\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u6700\u540e\u5c06\u8bc6\u522b\u7ed3\u679c\u8fd4\u56de\u7ed9\u6d4b\u8bd5\u673a\uff1b \u8981\u7279\u6b8a\u8bf4\u660e\u7684\u662f\uff1a RPC \u662f\u4e00\u79cd\u534f\u8bae\uff0c\u8bb8\u591a\u8bed\u8a00\u90fd\u662f\u652f\u6301\u7684\uff0c\u6bd4\u5982\u8bf4\u670d\u52a1\u7aef\u4e5f\u53ef\u4ee5\u7528 C++ \u6765\u5b9e\u73b0\uff0c\u5ba2\u6237\u7aef\u4f7f\u7528 Python \u4e5f\u662f\u53ef\u4ee5\u8c03\u7528\u7684\u3002 \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 \u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nimport cv2 as cv\nimport numpy as np\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\nif __name__ == \"__main__\":\nserver = ThreadXMLRPCServer((\"x.x.x.x\", 8889), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(match_image_by_opencv, \"match_image_by_opencv\")\nserver.serve_forever()\n \u8fd9\u6837\uff0c\u6211\u4eec\u57fa\u4e8e Python \u6807\u51c6\u5e93 xmlrpc \u642d\u5efa\u4e86\u4e00\u4e2a RPC \u670d\u52a1\u5668\uff0c\u6ce8\u518c\u4e86 image_put \u548c match_image_by_opencv \u4e24\u4e2a\u529f\u80fd\u63a5\u53e3\uff0c\u5728\u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u901a\u8fc7 IP \u548c\u7aef\u53e3\u8fdb\u884c RPC \u8bf7\u6c42\uff1b \u5ba2\u6237\u7aef\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from xmlrpc.client import Binary\nfrom xmlrpc.client import ServerProxy\nserver = ServerProxy(GlobalConfig.OPENCV_SERVER_HOST, allow_none=True)\nscreen_rb = open(screen, \"rb\")\ntemplate_rb = open(template_path, \"rb\")\ntry:\nscreen_path = server.image_put(Binary(screen_rb.read()))\nscreen_rb.close()\ntpl_path = server.image_put(Binary(template_rb.read()))\ntemplate_rb.close()\nreturn server.match_image_by_opencv(\ntpl_path, screen_path, rate, multiple\n)\nexcept OSError as exc:\nraise EnvironmentError(\nf\"RPC\u670d\u52a1\u5668\u94fe\u63a5\u5931\u8d25. {GlobalConfig.OPENCV_SERVER_HOST}\"\n) from exc\n \u901a\u8fc7\u8fd4\u56de server.match_image_by_opencv \u5c31\u83b7\u53d6\u4e86\u5728\u670d\u52a1\u7aef\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4","title":"4\u3001\u53f3\u952e\u83dc\u5355\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41","title":"4.1\u3001\u53f3\u952e\u83dc\u5355\u5b9a\u4f4d\u7684\u65b9\u6848\u53ca\u95ee\u9898","text":"\u53f3\u952e\u83dc\u5355\u7684\u5143\u7d20\u5b9a\u4f4d\u662f\u4e00\u4e2a\u96be\u70b9\uff0c\u8fc7\u53bb\u6211\u4eec\u8c03\u7814\u548c\u4f7f\u7528\u8fc7\u7684\u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u65b9\u6cd5\u6709 4 \u79cd\uff1a \u7b2c\u4e00\u79cd\uff1a\u6b65\u957f\u64cd\u4f5c\u6cd5 \u5728\u53f3\u952e\u83dc\u5355\u547c\u51fa\u6765\u4e4b\u540e\uff0c\u901a\u8fc7\u952e\u76d8\u7684 up\u3001down \u6309\u952e\uff0c\u8fdb\u884c\u9009\u62e9\u83dc\u5355\u9009\u62e9\uff0c\u9009\u4e2d\u76ee\u6807\u4e4b\u540e enter \u5373\u53ef\uff1b\u6bd4\u5982\uff1a\u5728\u684c\u9762\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\uff0c\u6309 1 \u6b21 down \uff0c\u4f1a\u51fa\u73b0\u4e0b\u56fe\uff1a \u7ee7\u7eed\u518d\u6309 2 \u6b21 down\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u518d\u6309 enter\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u5982\u6b64\uff0c\u201c\u6392\u5e8f\u65b9\u5f0f\u201d\u7684\u6b65\u957f\u4e3a 3\uff1b\u901a\u8fc7\u4f7f\u7528\u952e\u76d8\u4e0a\u4e0b\u952e\uff0c\u5c31\u5b9e\u73b0\u4e86\u5bf9\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\uff1b \u4f46\u662f\uff0c\u8fd9\u79cd\u65b9\u5f0f\u6709\u4e2a\u5f88\u70e6\u4eba\u7684\u95ee\u9898\uff0c\u5c31\u662f\u53f3\u952e\u83dc\u5355\u7684\u9009\u9879\u4f4d\u7f6e\u4e0d\u53ef\u80fd\u4e00\u76f4\u4e0d\u53d8\uff0c\u5728\u9700\u6c42\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\uff0c\u83dc\u5355\u9009\u9879\u7684\u53d8\u5316\u662f\u5f88\u5927\u7684\uff0c\u751a\u81f3\u6709\u4e9b\u5e94\u7528\u652f\u6301\u81ea\u5b9a\u4e49\u83dc\u5355\uff0c\u6bd4\u5982\u6587\u7ba1\u53f3\u952e\u83dc\u5355\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff1b \u4e5f\u5c31\u662f\u8bf4\u4f60\u5f97\u7ecf\u5e38\u53bb\u7ef4\u62a4\u83dc\u5355\u9009\u9879\u7684\u6b65\u957f\uff0c\u4e00\u4e2a\u9009\u9879\u73b0\u5728\u7684\u6b65\u957f\u662f 3\uff0c\u4e0b\u4e2a\u8fed\u4ee3\u53ef\u80fd\u5c31\u662f 4 \u6216\u8005 5\u3002 \u7b2c\u4e8c\u79cd\uff1a\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u6cd5 \u628a\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5355\u72ec\u622a\u56fe\u4fdd\u5b58\uff0c\u56fe\u7247\u4e2d\u4ec5\u5305\u542b\u4e00\u4e2a\u83dc\u5355\u9009\u9879\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u8fd9\u6837\uff0c\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5c31\u53ef\u4ee5\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u65b9\u5f0f\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u8fd9\u79cd\u65b9\u5f0f\u4e0d\u7528\u62c5\u5fc3\u83dc\u5355\u9009\u9879\u7684\u987a\u5e8f\u6216\u4f4d\u7f6e\uff0c\u4f46\u662f\u9700\u8981\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff0c\u4e14\u5bb9\u6613\u53d7\u5230\u5b57\u4f53 UI \u53d8\u66f4\u7c7b\u9700\u6c42\u7684\u5f71\u54cd\uff0c\u6bd4\u5982\uff1a\u5b57\u4f53\u5927\u5c0f\u3001\u5b57\u4f53\u95f4\u8ddd\u7b49\u7b49\u9700\u6c42\u53d8\u66f4\u90fd\u4f1a\u5f71\u54cd\uff0c\u6bcf\u6b21\u53d8\u66f4\u4e4b\u540e\u5c31\u9700\u8981\u8fdb\u884c\u5927\u91cf\u56fe\u7247\u8d44\u6e90\u7684\u91cd\u65b0\u622a\u56fe\u66ff\u6362\uff0c\u662f\u4e2a\u6bd4\u8f83\u9ebb\u70e6\u7684\u4e8b\u60c5\uff1b \u7b2c\u4e09\u79cd\uff1a\u76f8\u5bf9\u4f4d\u79fb\u6cd5 \u9f20\u6807\u70b9\u51fb\u53f3\u952e\u7684\u65f6\u5019\uff0c\u9f20\u6807\u7684\u5f53\u524d\u5750\u6807\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u7684\uff0c\u83dc\u5355\u9009\u9879\u7684\u5bbd\uff08 w \uff09\u4e00\u822c\u662f\u56fa\u5b9a\u7684\uff0c\u53d8\u5316\u7684\u662f\u83dc\u5355\u7684\u957f\u5ea6\uff08 h \uff09\uff0c\u53ef\u4ee5\u901a\u8fc7\u67d0\u4e2a\u9009\u9879\u76f8\u5bf9\u4e8e\u9f20\u6807\u7684\u8ddd\u79bb\u5728\u786e\u5b9a\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u901a\u8fc7\u7ef4\u62a4\u83dc\u5355\u9009\u9879\uff08\u76f8\u5bf9\u4f4d\u7f6e\uff09\u76f8\u5bf9\u4e8e\u9f20\u6807\u4f4d\u7f6e\u7684\u8ddd\u79bb\uff0c\u5373\u53ef\u8f7b\u677e\u8ba1\u7b97\u51fa\u83dc\u5355\u9009\u9879\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\u3002 \u4ece\u7406\u8bba\u4e0a\u6b64\u65b9\u6848\u662f\u53ef\u884c\u7684\uff0c\u4f46\u662f\u8fd9\u91cc\u4ecd\u7136\u5b58\u5728\u4e24\u4e2a\u4e25\u91cd\u7684\u95ee\u9898\uff1a \u83dc\u5355\u987a\u5e8f\u6539\u53d8\uff0c\u5bfc\u81f4\u76f8\u5bf9\u8ddd\u79bb\u6539\u53d8\uff0c\u800c\u4e14\u8ddd\u79bb\u662f\u901a\u8fc7\u50cf\u7d20\uff08px\uff09\u6765\u8868\u793a\u7684\uff0c\u4e0d\u60f3\u6b65\u957f\u90a3\u4e48\u53ea\u7ba1\uff0c\u6bcf\u6b21\u9700\u8981\u53bb\u91cf\u4e00\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u70b9\u9ebb\u70e6\uff1b \u9f20\u6807\u5728\u684c\u9762\u4e0d\u540c\u4f4d\u7f6e\u70b9\u51fb\u53f3\u952e\uff0c\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u4f4d\u7f6e\u662f\u4e0d\u540c\u7684\uff0c\u4e0a\u56fe\u7684\u83dc\u5355\u662f\u5728\u9f20\u6807\u7684\u5de6\u4e0b\u65b9\uff0c\u5982\u679c\u4f60\u79fb\u52a8\u9f20\u6807\u5230\u5c4f\u5e55\u56db\u8fb9\uff0c\u4f60\u4f1a\u53d1\u73b0\uff0c\u53f3\u952e\u83dc\u5355\u53ef\u80fd\u51fa\u73b0\u5728\u9f20\u6807\u7684\u56db\u4e2a\u65b9\u5411\uff0c\u4e5f\u5c31\u662f\u8bf4\u4f60\u9700\u8981\u6839\u636e\u9f20\u6807\u7684\u4e0d\u540c\u4f4d\u7f6e\u6765\u5224\u65ad\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u65b9\u5411\uff0c\u800c\u4e0d\u540c\u7684\u65b9\u5411\u4e0a\u8ba1\u7b97\u65b9\u6cd5\u662f\u4e0d\u540c\u7684\uff0c\u6bd4\u5982\uff1a\u53f3\u952e\u83dc\u5355\u5728\u9f20\u6807\u7684\u5de6\u4e0a\uff0c\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\u8ba1\u7b97\u65b9\u6cd5\u4e3a\uff08x - w / 2\uff0c y - h\uff09\uff0c\u8fd9\u6837\u7ef4\u62a4\u8d77\u6765\u53ef\u4ee5\u8bf4\u975e\u5e38\u590d\u6742\uff1b \u57fa\u4e8e\u4ee5\u4e0a\u4e24\u4e2a\u539f\u56e0\uff0c\u6211\u4eec\u5e76\u4e0d\u63a8\u8350\u8fd9\u79cd\u64cd\u4f5c\u65b9\u6848\u3002 \u7b2c\u56db\u79cd\uff1a\u5c5e\u6027\u5b9a\u4f4d \u6709\u540c\u5b66\u8bf4\u5e72\u561b\u4e0d\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u5462\uff0c\u5176\u5b9e\uff0c\u6211\u4eec\u6700\u5f00\u59cb\u60f3\u5230\u7684\u65b9\u6848\u5c31\u662f\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\uff0c\u4f46\u662f\u5728\u5c5e\u6027\u7684 DOM \u6811\u91cc\u600e\u4e48\u4e5f\u627e\u4e0d\u5230\uff0c\u65e0\u6cd5\u5b9a\u4f4d\u5230\uff0c\u6211\u4eec\u4e5f\u8054\u5408\u7814\u53d1\u540c\u5b66\u4e00\u8d77\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u4f46\u6700\u7ec8\u8fd8\u662f\u6ca1\u80fd\u89e3\u51b3\uff0c\u975e\u5e38\u9057\u61be\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42","title":"4.2\u3001\u6700\u65b0\u7684\u53f3\u952e\u83dc\u5355\u7ec8\u6781\u89e3\u51b3\u65b9\u6848","text":"\u7531\u4e8e\u53f3\u952e\u83dc\u5355\u9009\u9879\u51e0\u4e4e\u90fd\u662f\u6587\u672c\uff0c\u90a3\u4e48\u901a\u8fc7 OCR \u8bc6\u522b\uff0c\u51e0\u4e4e\u662f\u6700\u4f18\u7684\u65b9\u6848\uff1a \u4e0d\u7528\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff1b \u4e0d\u4f1a\u53d7\u5230\u83dc\u5355\u9009\u9879\u987a\u5e8f\u6539\u53d8\u7684\u5f71\u54cd\uff1b \u4e0d\u4f1a\u53d7\u5230\u5b57\u4f53 UI \u53d8\u5316\u7684\u5f71\u54cd\uff1b \u5173\u4e8e OCR \u8bc6\u522b\u6211\u4eec\u5728\u540e\u9762\u4f1a\u8be6\u7ec6\u8bb2\u5230\uff0c\u672c\u7ae0\u8282\u4e3b\u8981\u8bb2\u57fa\u4e8e OCR \u8bc6\u522b\uff0c\u6211\u4eec\u5728\u53f3\u952e\u83dc\u5355\u8bc6\u522b\u4e0a\u7684\u7a81\u7834\u548c\u521b\u65b0\uff1b \u4f7f\u7528 OCR \u8bc6\u522b\u53f3\u952e\u83dc\u5355\u867d\u7136\u5df2\u7ecf\u5f88\u5b8c\u7f8e\u4e86\uff0c\u4f46\u662f\u5728\u4e00\u4e9b\u60c5\u51b5\u4e0b\u4ecd\u7136\u5b58\u5728\u4e00\u70b9\u95ee\u9898\uff0c\u5c31\u662f\u5c4f\u5e55\u4e2d\u51fa\u73b0\u591a\u4e2a\u548c\u83dc\u5355\u9009\u9879\u6587\u5b57\u76f8\u540c\u7684\u6587\u5b57\u65f6\uff0c\u6bd4\u5982\u4e0b\u9762\u8fd9\u79cd\u60c5\u51b5\uff1a \u5c4f\u5e55\u6070\u597d\u51fa\u73b0\u4e86\u4e24\u4e2a\u201c\u590d\u5236\u201d\uff0c\u6b64\u65f6\u8981\u5b9a\u4f4d\u5230\u83dc\u5355\u4e2d\u7684 \u201c\u590d\u5236\u201d\uff0c\u5c31\u9700\u8981\u8fdb\u4e00\u6b65\u505a\u6570\u636e\u5904\u7406\uff0c\u6bd4\u5982\uff1aOCR \u8fd4\u56de 2 \u4e2a\u201c\u590d\u5236\u201d\u7684\u5750\u6807\uff0c\u7528\u4f8b\u91cc\u9762\u6765\u5224\u65ad\u7528\u54ea\u4e2a\uff0c\u4ece\u4e1a\u52a1\u4e0a\u5c06\u5904\u7406\u8d77\u6765\u6bd4\u8f83\u9ebb\u70e6\uff0c\u56e0\u4e3a\u4f60\u5f97\u660e\u786e\u77e5\u9053\u83dc\u5355\u5728\u5de6\u8fb9\u8fd8\u662f\u53f3\u8fb9\uff0c\u7136\u540e\u8fd9\u672c\u8eab\u5c31\u662f\u4e0d\u786e\u5b9a\u7684\uff1b \u600e\u4e48\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u5462\uff0c\u8fd9\u5c31\u8981\u8bf4\u9053\u672c\u7ae0\u7684\u4e3b\u9898\uff1a\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b\u3002 \u3010\u539f\u7406\u3011 \u5728\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u524d\u622a\u4e00\u5f20\u56fe\uff0c\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\u518d\u622a\u53d6\u4e00\u5f20\u56fe\uff0c\u4e24\u5f20\u56fe\u552f\u4e00\u53d8\u5316\u7684\u5c31\u662f\u53f3\u952e\u83dc\u5355\uff0c\u5c06\u5176\u4ed6\u76f8\u540c\u7684\u5730\u65b9\u90fd\u5c4f\u853d\u6389\uff0c\u53ea\u7559\u4e0b\u83dc\u5355\u754c\u9762\uff0c\u5982\u6b64\u5373\u53ef\u6d88\u9664\u5e72\u6270\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u5c06\u4e24\u79cd\u56fe\u505a\u524d\u540e\u5bf9\u6bd4\u63d0\u53d6\u53ef\u4ee5\u5f97\u5230\u8fd9\u6837\u7684\u56fe\uff1a \u4f60\u770b\uff0c\u901a\u8fc7\u524d\u540e\u56fe\u7247\u7684\u5bf9\u6bd4\uff0c\u5c06\u76f8\u540c\u7684\u90e8\u5206\u7ed9\u6d88\u9664\u6389\uff0c\u518d\u8fdb\u884c OCR \u8bc6\u522b\uff0c\u8fd9\u6837\u5c31\u4e0d\u4f1a\u6709\u5e72\u6270\u4e86\uff1b \u4ee3\u7801\u5b9e\u73b0\u8bf7\u67e5\u770b src/filter_image.py \uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def filter_image(action):\n\"\"\"\n \u5bf9\u6bd4\u52a8\u4f5c\u524d\u540e\u4e24\u5f20\u56fe\u7247\uff0c\u63d0\u53d6\u4e0d\u540c\u7684\u90e8\u5206\u751f\u6210\u4e00\u5f20\u65b0\u7684\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u65b0\u56fe\u7247\u7684\u8def\u5f84\n :param action: \u52a8\u4f5c\u51fd\u6570\u7684\u51fd\u6570\u5bf9\u8c61\n :return: \u65b0\u56fe\u7247\u7684\u8def\u5f84\n \"\"\"\n action \u662f\u9f20\u6807\u4e8b\u4ef6\uff0c\u56e0\u4e3a\u6b64\u7c7b\u573a\u666f\u4e0d\u4ec5\u4ec5\u5728\u53f3\u952e\u5b58\u5728\uff0c\u5355\u51fb\u3001\u53cc\u51fb\u7b49\u7b49\uff0c\u53ea\u8981\u64cd\u4f5c\u524d\u540e\u540e\u53d8\u5316\u7684\u90fd\u53ef\u4ee5\uff1a from src.mouse_key import MouseKey\naction = (\nMouseKey.click,\nMouseKey.right_click,\nMouseKey.double_click,\nMouseKey.move_to,\n)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5","title":"5\u3001\u52a8\u6001\u56fe\u50cf\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5728\u684c\u9762\u58c1\u7eb8\u5207\u6362\uff0c\u6216\u770b\u56fe\u3001\u76f8\u518c\u5207\u6362\u56fe\u7247\u7c7b\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u7531\u4e8e\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u662f\u4e0d\u56fa\u5b9a\u7684\uff08\u4e0d\u540c\u7248\u672c\u7684\u7cfb\u7edf\u58c1\u7eb8\u4e0d\u540c\u3001\u58c1\u7eb8\u987a\u5e8f\u4e0d\u540c\uff0c\u770b\u56fe\u76f8\u518c\u5728\u56fe\u7247\u8d44\u6e90\u4e0d\u4e00\u5b9a\u56fa\u5b9a\uff09\uff0c\u90a3\u4e48\u5728\u6d4b\u8bd5\u5207\u6362\u58c1\u7eb8\u6216\u8005\u5207\u6362\u56fe\u7247\u7684\u573a\u666f\u65f6\u5c31\u4f1a\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u4f60\u4e0d\u77e5\u9053\u9884\u671f\u662f\u5565\uff0c\u7528\u4f8b\u64cd\u4f5c\u52a8\u6001\u7684\uff0c\u4e5f\u662f\u6781\u4e0d\u7a33\u5b9a\u3002 \u3010\u539f\u7406\u3011 \u5728\u5207\u6362\u56fe\u7247\u4e4b\u524d\u622a\u56fe\u4fdd\u5b58\u5e76\u8fd4\u56de\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u6b21\u8bc6\u522b\u8fd9\u5f20\u56fe\u7247\uff0c\u5982\u679c\u4e0d\u5b58\u5728\uff0c\u8bf4\u660e\u56fe\u7247\u5df2\u7ecf\u5207\u6362\u4e86\uff1b \u793a\u610f\u56fe\uff1a \u8fd9\u6837\uff0c\u6211\u4eec\u622a\u53d6\u4e86\u5f53\u524d\u56fe\u7247\u4e2d\u6bd4\u8f83\u6709\u4ee3\u8868\u6027\u7684\u4f4d\u7f6e\uff08\u4e00\u53ea\u9e1f\uff09\uff0c\u5728\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u7528\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1a \u6211\u4eec\u518d\u62ff\u7740\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd9\u6837\u5728\u5f53\u524d\u56fe\u7247\u4e2d\uff0c\u5c31\u4e0d\u80fd\u627e\u5230\u8fd9\u53ea\u9e1f\u4e86\uff0c\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u662f False\uff0c\u90a3\u4e48\u4e5f\u5c31\u53ef\u4ee5\u5224\u65ad\u56fe\u7247\u5207\u6362\u662f\u6210\u529f\u7684\u3002 \u4ee3\u7801\u793a\u610f\uff1a def save_temporary_picture(_x: int, _y: int, width: int, height: int):\n\"\"\"\n \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u56fe\u7247\u8def\u5f84\n :param x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n :param y: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n :param width: \u5bbd\u5ea6\n :param height: \u9ad8\u5ea6\n :return: \u56fe\u7247\u8def\u5f84\n \"\"\"\n \u6b64\u51fd\u6570\u7528\u4e8e\u5728\u64cd\u4f5c\u4e4b\u524d\u622a\u56fe\u4e00\u5f20\u4e34\u65f6\u56fe\u7247\uff0c\u8fd4\u56de\u56fe\u7247\u8def\u5f84\uff0c\u6700\u540e\u5728\u65ad\u8a00\u7684\u65f6\u5019\u518d\u5c06\u56fe\u7247\u8def\u5f84\u4f5c\u4e3a\u53c2\u6570\u4f20\u5165\u65ad\u8a00\u8bed\u53e5\u5373\u53ef\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ui","title":"\u4e09\u3001\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_1","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u662f\u6211\u4eec\u81ea\u7814\u7684\u4e00\u79cd\u4f7f\u7528\u7b80\u5355\uff0c\u4e14\u6548\u7387\u6781\u9ad8\u3001\u7a33\u5b9a\u6027\u597d\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u57fa\u4e8e\u5143\u7d20\u6309\u94ae\u5728\u5e94\u7528\u4e2d\u7684\u76f8\u5bf9\u4f4d\u7f6e\uff0c\u52a8\u6001\u83b7\u53d6\u5143\u7d20\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff0c\u9002\u7528\u4e8e\u5404\u79cd\u5c4f\u5e55\u5206\u8fa8\u7387\uff08\u5305\u62ec\u9ad8\u5206\u5c4f\u3001\u5bbd\u5c4f\u3001\u5e26\u9c7c\u5c4f\uff09\uff0c\u5f53\u5143\u7d20\u6309\u94ae\u4f4d\u7f6e\u76f8\u5bf9\u4e8e\u5e94\u7528\u754c\u9762\u4f4d\u7f6e\u53d1\u751f\u4fee\u6539\u4e4b\u540e\uff0c\u53ea\u9700\u8981\u6839\u636e UI \u8bbe\u8ba1\u56fe\u4e0a\u7684\u6e90\u6570\u636e\u4fee\u6539\u5bf9\u5e94\u5750\u6807\u6570\u636e\u5c31\u597d\uff0c\u7ef4\u62a4\u975e\u5e38\u7684\u65b9\u4fbf\u3002 \u6b64\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u9002\u7528\u4e8e\u4e00\u4e9b\u5143\u7d20\u4f4d\u7f6e\u76f8\u5bf9\u4e0e\u5e94\u7528\u754c\u9762\u6bd4\u8f83\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u97f3\u4e50\uff0899% \u7684\u5143\u7d20\u5b9a\u4f4d\u91c7\u7528\u8fd9\u79cd\uff0c\u6548\u679c\u975e\u5e38\u597d\uff09\uff0c\u4e0d\u9002\u7528\u4e8e\u754c\u9762\u4e0d\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u622a\u56fe\u5f55\u5c4f\uff0c\u5f88\u660e\u663e\u4e0d\u9002\u7528\u4e8e\u8fd9\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u3002\u8fd9\u79cd\u5168\u65b0\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u6709\u5b83\u7684\u9002\u7528\u6761\u4ef6\uff0c\u5982\u679c\u4f60\u53d1\u73b0\u4f7f\u7528\u5e38\u89c4\u7684\uff08\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u5b9a\u4f4d\uff09\u4e0d\u597d\u505a\u65f6\uff0c\u4e0d\u59a8\u8003\u8651\u4f7f\u7528\u8fd9\u79cd\uff0c\u5176\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff0c\u5e76\u4e14\u8fc5\u901f\u7231\u4e0a\u4ed6\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_1","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5728 UI \u8bbe\u8ba1\u56fe\u4e2d\u6211\u4eec\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u8fb9\u6846\u7684\u8ddd\u79bb\u7684\uff0c\u7136\u540e\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u6280\u672f\u624b\u6bb5\u83b7\u53d6\u5230\u5e94\u7528\u754c\u9762\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u53ca\u5e94\u7528\u7a97\u53e3\u7684\u5927\u5c0f\uff0c\u793a\u610f\u56fe\u5982\u4e0b\uff1a \uff08x1, y1\uff09\u4e3a\u5e94\u7528\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\uff1b\uff08x2, y2\uff09\u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u5de6\u4e0a\u89d2\uff08x1, y1\uff09\u7684\u5750\u6807\uff0c\u90a3\u4e48\u5b9e\u9645\u4e0a\u3010\u64ad\u653e\u6240\u6709\u3011\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\u4e3a\uff1a\uff08 x1 + x2, y1 + y2 \uff09\uff1b \u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5927\u5c0f\uff08w2, h2\uff09\uff0c\u53ef\u4ee5\u4ece UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\uff1b \u5728 UI \u8bbe\u8ba1\u7a3f\u4e0a\u70b9\u51fb\u3010\u64ad\u653e\u6240\u6709\u3011\u56fe\u6807\uff0c\u7136\u540e\u79fb\u52a8\u9f20\u6807\u5c31\u5c31\u53ef\u4ee5\u770b\u5230\u4e0a\u56fe\u7684\u53c2\u8003\u7ebf\u53ca\u6570\u636e\uff1b \u6240\u4ee5\uff0c\u6211\u4eec\u53ef\u4ee5\u8f7b\u677e\u7684\u83b7\u53d6\u5230\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u4e2d\u5fc3\u5750\u6807\u4e3a\uff1a\uff08 x1 + x2 + (w2 / 2), y1 + y2 + ( h2 / 2) \uff09 \u8be6\u7ec6\u6e90\u4ee3\u7801\u8bf7\u67e5\u770b AT \u57fa\u7840\u6846\u67b6: src/button_center.py \u83b7\u53d6\u5e94\u7528\u7a97\u53e3\u7684\u4fe1\u606f \u4f7f\u7528 xdotool \u548c xwininfo \u83b7\u53d6\u5230\u5e94\u7528\u7a97\u53e3\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u5de6\u4e0a\u89d2\uff09\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a app_id = CmdCtl.run_cmd(f\"xdotool search --classname --onlyvisible {self.app_name}\"\n).split(\"\\n\")\napp_id_list = [int(_id) for _id in app_id if _id]\nreturn CmdCtl.run_cmd(f\"xwininfo -id {app_id_list[self.number]}\")\n \u4f7f\u7528\u6b63\u5219\u83b7\u53d6\u7a97\u53e3\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u83b7\u53d6\u914d\u7f6e \u8bfb ini \u914d\u7f6e\u6587\u4ef6\uff0c\u83b7\u53d6\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e0e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a conf = ConfigParser()\nconf.read(self.config_path)\ndirection = conf.get(btn_name, \"direction\")\nposition = [int(i.strip()) for i in conf.get(btn_name, \"location\").split(\",\")]\n \u8ba1\u7b97\u5143\u7d20\u6309\u94ae\u5750\u6807 \u6839\u636e\u5e94\u7528\u7a97\u53e3\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u5927\u5c0f\u3001\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u5927\u5c0f\uff0c\u4f7f\u7528\u4e00\u5b9a\u7684\u7b97\u6cd5\u5373\u53ef\u8ba1\u7b97\u51fa\u5143\u7d20\u6309\u94ae\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u4e2d\u5fc3\u5750\u6807\uff09\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3","title":"3\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u3010\u914d\u7f6e\u65b9\u6cd5\u3011 \u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u7684\u6570\u636e\u6e90\u662f\u5e94\u7528\u5e93\u4e2d\u7684 ui.ini \u914d\u7f6e\u6587\u4ef6\uff1a ;section\n[\u65b0\u5efa\u6b4c\u5355+] ;key = value\ndirection = left_top\nlocation = 180, 268, 21, 21\n section \u662f\u4f60\u6839\u636e\u5bf9\u5e94\u7684\u5143\u7d20\u6309\u94ae\u547d\u540d\uff0c\u4f60\u53ef\u4ee5\u4efb\u610f\u547d\u540d\uff0c\u4f46\u6700\u597d\u6709\u5177\u4f53\u542b\u4e49\uff0c\u4e14\u80fd\u660e\u786e\u8868\u793a\u8fd9\u4e2a\u5143\u7d20\u6309\u94ae\u7684\u540d\u79f0\uff1b\u7528\u4e2d\u62ec\u53f7\u62ec\u8d77\u6765\u5c31\u884c\uff0c\u6bd4\u5982\uff1a[\u65b0\u5efa\u6b4c\u5355+] \uff1b direction \u662f\u914d\u7f6e\u8be5\u5143\u7d20\u7684\u53c2\u8003\u7cfb\uff0c\u5206\u522b\u4e3a\uff1a left_top \u5de6\u4e0a\uff1b left_bottom \u5de6\u4e0b\uff1b right_top \u53f3\u4e0a\uff1b right_bottom \u53f3\u4e0b\uff1b \u53c2\u8003\u7cfb\u7684\u9009\u53d6\u6807\u51c6\uff1a\u62c9\u52a8\u6539\u53d8\u7a97\u53e3\u5927\u5c0f\u65f6\uff0c\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u53c2\u8003\u7cfb\u4f4d\u7f6e\u662f\u4e0d\u53d8\u7684\uff1b location \u662f\u8be5\u5143\u7d20\u6309\u94ae\u7684\u76f8\u5bf9\u4e0e\u53c2\u8003\u7cfb\u7684 x, y \u7684\u8ddd\u79bb\uff0c\u53ca\u5927\u5c0f(w, h)\uff0c\u8fd9\u56db\u4e2a\u6570\u636e\u53ef\u4ee5\u901a\u8fc7 UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\u6570\u636e\uff0c\u5728\u7f16\u8f91\u6a21\u5f0f\u4e0b\uff0c\u70b9\u51fb UI \u56fe\u4e0a\u7684\u6309\u94ae\uff0c\u53f3\u4fa7\u5c31\u4f1a\u51fa\u73b0\u8be5\u5143\u7d20\u6309\u94ae\u7684 x, y, w, h \u6570\u636e\u3002 \u5982\u679c UI \u56fe\u4e0a\u6ca1\u6709\u63d0\u4f9b\u4f60\u60f3\u8981\u7684\u5143\u7d20\u6570\u636e\uff0c\u4f60\u53ef\u4ee5\u76f4\u63a5\u5728\u7cfb\u7edf\u4e2d\u4f7f\u7528\u622a\u56fe\u5f55\u5c4f\u8fdb\u884c\u5c3a\u91cf\uff0c\u8fd9\u662f\u4e00\u79cd\u4e0d\u63a8\u8350\u4f46\u80fd\u7528\u7684\u65b9\u6cd5\u3002 \u3010\u8c03\u7528\u65b9\u6cd5\u3011 \u5728\u5e94\u7528\u5e93\u65b9\u6cd5\u5c42\u8fd9\u6837\u5199\uff1a def click_add_music_list_btn_in_music_by_ui(self):\n\"\"\"\u70b9\u51fb\u65b0\u5efa\u6b4c\u5355\u6309\u94ae\"\"\"\nself.click(*self.ui.btn_center(\"\u65b0\u5efa\u6b4c\u5355+\"))\n self.ui.btn_center() \u662f\u56fa\u5b9a\u5199\u6cd5\uff0c\u53c2\u6570\u5c31\u662f\u914d\u7f6e\u91cc\u9762\u7684 section \u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ocr","title":"\u56db\u3001OCR \u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_2","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 OCR \u65b9\u6848\u5927\u591a\u91c7\u7528\u8c37\u6b4c OCR\uff08Tesseract\uff09\u65b9\u6848\uff0c\u4f46\u662f\u5b83\u5bf9\u4e8e\u4e2d\u6587\u7684\u8bc6\u522b\u975e\u5e38\u5dee\uff0c\u7ecf\u8fc7\u5927\u91cf\u7684\u8c03\u7814\uff0c\u6211\u4eec\u4f7f\u7528 PaddleOCR\uff0c\u5b83\u662f\u4e00\u4e2a\u5f00\u6e90\u7684\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u8bc6\u522b\u5de5\u5177\uff0c\u4e5f\u662f PaddlePaddle \u6700\u6709\u540d\u7684\u4e00\u4e2a\u5f00\u6e90\u9879\u76ee\uff0c\u611f\u5174\u8da3\u7684\u53ef\u4ee5\u70b9\u8fd9\u91cc\u4e86\u89e3\uff0c\u591a\u7684\u4e0d\u8bf4\u4e86\uff0c\u4f60\u53ea\u9700\u8981\u77e5\u9053\u5b83\u5c31\u662f\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_2","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5b89\u88c5\u4ed6\u662f\u4e2a\u5f88\u9ebb\u70e6\u7684\u4e8b\u60c5\uff0c\u867d\u7136\u64cd\u4f5c\u5f88\u7b80\u5355\uff0c\u4f46\u5176\u5b9e\u5b89\u88c5\u5305\u6709\u70b9\u5927\uff0c\u56e0\u6b64\u6211\u4eec\u4e0d\u5e0c\u671b\u76f4\u63a5\u5728 env.sh \u4e2d\u52a0\u5165\u5b83\uff0c\u8fd9\u4f1a\u8ba9\u6574\u4e2a\u81ea\u52a8\u5316\u73af\u5883\u53d8\u5f97\u975e\u5e38\u81c3\u80bf\uff1b \u56e0\u6b64\uff0c\u6211\u4eec\u60f3\u5230\u5c06\u5b83\u505a\u6210\u4e00\u4e2a RPC \u670d\u52a1\u5728\u5176\u4ed6\u673a\u5668\u4e0a\u90e8\u7f72\uff0c\u6d4b\u8bd5\u673a\u901a\u8fc7\u8fdc\u7a0b\u8c03\u7528 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u4f7f\u7528\u5b83\uff1b RPC \u7684\u8c03\u7528\u903b\u8f91\uff1a \u8fd9\u6837\u6211\u4eec\u53ea\u9700\u8981\u5728\u670d\u52a1\u7aef\u90e8\u7f72\u597d OCR \u8bc6\u522b\u7684\u670d\u52a1\uff0c\u7136\u540e\u901a\u8fc7 RPC \u670d\u52a1\u5c06\u529f\u80fd\u63d0\u4f9b\u51fa\u6765\uff0c\u6846\u67b6\u91cc\u9762\u53ea\u9700\u8981\u8c03\u7528\u5bf9\u5e94\u7684 RPC \u63a5\u53e3\u5c31\u884c\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_1","title":"3\u3001\u4f7f\u7528\u8bf4\u660e","text":"\u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nfrom paddleocr import PaddleOCR\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef paddle_ocr(pic_path, lang):\n\"\"\"\n Paddleocr\u76ee\u524d\u652f\u6301\u7684\u591a\u8bed\u8a00\u8bed\u79cd\u53ef\u4ee5\u901a\u8fc7\u4fee\u6539lang\u53c2\u6570\u8fdb\u884c\u5207\u6362\n \u4f8b\u5982`ch`, `en`, `fr`, `german`, `korean`, `japan`\n :param file_name:\n :param lang:\n :return:\n \"\"\"\nif __name__ == \"__main__\":\nIP = popen(\"hostname -I\").read().split(\" \")[0]\nPORT = 8890\nSCREEN_CACHE = \"/tmp/screen.png\"\nserver = ThreadXMLRPCServer((IP, PORT), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(paddle_ocr, \"paddle_ocr\")\nprint(\"\u76d1\u542c\u5ba2\u6237\u7aef\u8bf7\u6c42\u3002\u3002\")\nserver.serve_forever()\n \u6846\u67b6\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from src import OCR\nOCR.ocr(*target_strings, picture_abspath=None, similarity=0.6, return_default=False, return_first=False, lang=\"ch\"):\n# \u901a\u8fc7 OCR \u8fdb\u884c\u8bc6\u522b\u3002\n# target_strings:\n# \u76ee\u6807\u5b57\u7b26,\u8bc6\u522b\u4e00\u4e2a\u5b57\u7b26\u4e32\u6216\u591a\u4e2a\u5b57\u7b26\u4e32,\u5e76\u8fd4\u56de\u5176\u5728\u56fe\u7247\u4e2d\u7684\u5750\u6807;\n# \u5982\u679c\u4e0d\u4f20\u53c2\uff0c\u8fd4\u56de\u56fe\u7247\u4e2d\u8bc6\u522b\u5230\u7684\u6240\u6709\u5b57\u7b26\u4e32\u3002\n# picture_abspath: \u8981\u8bc6\u522b\u7684\u56fe\u7247\u8def\u5f84\uff0c\u5982\u679c\u4e0d\u4f20\u9ed8\u8ba4\u622a\u53d6\u5168\u5c4f\u8bc6\u522b\u3002\n# similarity: \u5339\u914d\u5ea6\u3002\n# return_default: \u8fd4\u56de\u8bc6\u522b\u7684\u539f\u751f\u6570\u636e\u3002\n# return_first: \u53ea\u8fd4\u56de\u7b2c\u4e00\u4e2a,\u9ed8\u8ba4\u4e3a False,\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u6240\u6709\u6570\u636e\u3002\n# lang: `ch`, `en`, `fr`, `german`, `korean`, `japan`\n \u6b64\u65b9\u6848\u5728\u6846\u67b6\u5185\u6ca1\u6709\u5f15\u5165\u4efb\u4f55\u4e09\u65b9\u4f9d\u8d56\u5b8c\u5168\u91c7\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\uff0c\u800c\u4e14\u4f7f\u7528\u65b9\u6cd5\u975e\u5e38\u7b80\u5355\uff0c\u53ea\u9700\u8981\u901a\u8fc7 OCR.ocr() \u5373\u53ef\uff1b \u5bf9\u4e8e\u4e00\u4e9b\u6587\u6848\u7684\u573a\u666f\u975e\u5e38\u9002\u7528\uff0c\u6b64\u65b9\u6cd5\u76f4\u63a5\u8fd4\u56de\u5750\u6807\uff0c\u53ef\u4ee5\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u3002 \u4e5f\u53ef\u4ee5\u7528\u4e8e\u6587\u5b57\u65ad\u8a00\uff0c\u4ee3\u7801\u793a\u610f\uff1a def assert_ocr_exist(\n*args, picture_abspath=None, similarity=0.6, return_first=False, lang=\"ch\"\n):\n\"\"\"\u65ad\u8a00\u6587\u6848\u5b58\u5728\"\"\"\npic = None\nif picture_abspath is not None:\npic = picture_abspath + \".png\"\nres = OCR.ocr(\n*args,\npicture_abspath=pic,\nsimilarity=similarity,\nreturn_first=return_first,\nlang=lang,\n)\nif res is False:\nraise AssertionError(\n(f\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{args}\", f\"{pic if pic else GlobalConfig.SCREEN_CACHE}\")\n)\nif isinstance(res, tuple):\npass\nelif isinstance(res, dict) and False in res.values():\nres = filter(lambda x: x[1] is False, res.items())\nraise AssertionError(\n(\nf\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{dict(res)}\",\nf\"{pic if pic else GlobalConfig.SCREEN_CACHE}\",\n)\n)\n \u5728\u7528\u4f8b\u4e2d\u4f7f\u7528\u65ad\u8a00\uff0c\u793a\u4f8b\uff1a def test_font_manager_021(self):\n\"\"\"\u53f3\u4fa7\u2665-\u6536\u85cf/\u53d6\u6d88\u6536\u85cf\u5b57\u4f53\"\"\"\n# \u5b57\u4f53\u7ba1\u7406\u5668\u754c\u9762\u53f3\u4fa7\u8be6\u60c5\u5217\u8868\uff0c\u9009\u62e9\u672a\u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e / \u6536\u85cf\u5b57\u4f53\n# \u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e\u83dc\u5355\u663e\u793a\u201c\u53d6\u6d88\u6536\u85cf\u201d\uff1b\n...\nself.assert_ocr_exist(\"\u53d6\u6d88\u6536\u85cf\")\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_1","title":"4\u3001\u670d\u52a1\u7aef\u90e8\u7f72","text":"\u6211\u4eec\u76ee\u524d\u662f\u5c06 OCR \u670d\u52a1\u90e8\u7f72\u5728\u666e\u901a\u7684\u529e\u516c\u673a\u4e0a\u7684\uff0c\u5982\u679c\u4f60\u89c9\u5f97\u73b0\u6709\u7684 OCR \u8bc6\u522b\u6027\u80fd\u4e0d\u591f\u597d\uff0c\u6070\u597d\u4f60\u6709\u66f4\u597d\u7684\u673a\u5668\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u5176\u79c1\u6709\u5316\u90e8\u7f72\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41_1","title":"4.1\u3001\u73af\u5883\u5b89\u88c5","text":"\u63a8\u8350\u4f7f\u7528 pipenv \u8fdb\u884c\u73af\u5883\u642d\u5efa\uff1b \u5b89\u88c5 pipenv \uff1a sudo pip3 install pipenv\n \u65b0\u5efa\u4e00\u4e2a\u76ee\u5f55\u4f5c\u4e3a\u73af\u5883\u5305 ocr_env\uff1a cd ~\nmkdir ocr_env\n \u521b\u5efa python 3.7 \u73af\u5883\uff1a cd ocr_env\npipenv --python 3.7\n \u5b89\u88c5 OCR \u4f9d\u8d56\u5305\uff1a pipenv install paddlepaddle -i https://mirror.baidu.com/pypi/simple\npipenv install \"paddleocr>=2.0.1\" -i https://mirror.baidu.com/pypi/simple\n \u4e0d\u51fa\u610f\u5916\uff0c\u8fd9\u6837\u5c31\u628a\u4f9d\u8d56\u5b89\u88c5\u597d\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42_1","title":"4.2\u3001\u542f\u52a8\u670d\u52a1","text":"\u5c06\u57fa\u7840\u6846\u67b6\u4e2d\u7684 scr/ocr/pdocr_rpc_server.py \u6587\u4ef6\u62f7\u8d1d\u5230 ocr_env \u76ee\u5f55\uff0c\u540e\u53f0\u6267\u884c\u5b83\u5c31\u597d\u4e86\uff1a cd ocr_env\nnohup pipenv run python pdocr_rpc_server.py &\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#43","title":"4.3\u3001\u914d\u7f6e\u5f00\u673a\u81ea\u542f\uff08\u901a\u7528\uff09","text":"\u4f60\u80af\u5b9a\u4e0d\u60f3\u6bcf\u6b21\u673a\u5668\u91cd\u542f\u4e4b\u540e\u90fd\u9700\u8981\u624b\u52a8\u542f\u52a8\u670d\u52a1\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u914d\u7f6e\u5f00\u673a\u81ea\u542f\u3002 \u5199\u5f00\u673a\u81ea\u542f\u670d\u52a1\u6587\u4ef6\uff1a sudo vim /lib/systemd/system/ocr.service\n autoocr \u540d\u79f0\u4f60\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff0c\u5199\u5165\u4ee5\u4e0b\u5185\u5bb9\uff1a [Unit]\nDescription=OCR Service\nAfter=multi-user.target\n\n[Service]\nUser=uos\nGroup=uos\nType=idle\nWorkingDirectory=/home/uos/ocr_env\nExecStart=pipenv run python pdocr_rpc_server.py\n\n[Install]\nWantedBy=multi-user.target\n \u6ce8\u610f\u66ff\u6362\u4f60\u7684${USER} \u4fee\u6539\u914d\u7f6e\u6587\u4ef6\u7684\u6743\u9650\uff1a sudo chmod 644 /lib/systemd/system/ocr.service\n \u81ea\u542f\u670d\u52a1\u751f\u6548\uff1a sudo systemctl daemon-reload\nsudo systemctl enable ocr.service\n \u67e5\u770b\u670d\u52a1\u72b6\u6001\uff1a sudo systemctl status ocr.service\n \u4f60\u53ef\u4ee5\u518d\u91cd\u542f\u4e0b\u7535\u8111\uff0c\u770b\u770b\u670d\u52a1\u662f\u4e0d\u662f\u6b63\u5e38\u542f\u52a8\u4e86\uff0c\u6ca1\u62a5\u9519\u5c31 OK \u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_4","title":"\u4e94\u3001\u5c5e\u6027\u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_3","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 UI \u81ea\u52a8\u5316\u5927\u591a\u90fd\u662f\u57fa\u4e8e\u6d4f\u89c8\u5668\u7684\uff0c\u6838\u5fc3\u662f\u5728\u7f51\u9875\u7684 DOM \u6811\u4e0a\u67e5\u627e\u5143\u7d20\uff0c\u5e76\u5bf9\u5176\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\uff1b Linux \u684c\u9762\u5e94\u7528\u5927\u591a\u662f\u91c7\u7528 Qt \u7f16\u5199\u7684\uff0c\u5728 Qt \u4e2d\u4e5f\u662f\u4ece\u6700\u9876\u5c42\u7684 MainWindow \u5f00\u59cb\u6784\u5efa\u5e94\u7528\uff0c\u6240\u4ee5\u903b\u8f91\u4e5f\u662f\u4e00\u6837\u7684\uff0cQt \u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u540c\u6837\u53ef\u4ee5\u901a\u8fc7 DOM \u6811\uff08\u5c5e\u6027\u6811\uff09\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff0c\u6211\u4eec\u79f0\u4e4b\u4e3a\u5c5e\u6027\u5b9a\u4f4d\u3002 \u501f\u52a9\u5f00\u6e90\u5de5\u5177 dogtail \u6211\u4eec\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u83b7\u53d6\uff0c\u4ece\u800c\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\u3002dogtail \u7684\u9879\u76ee\u4ecb\u7ecd\u53ef\u4ee5\u731b\u6233\u8fd9\u91cc\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_3","title":"2\u3001\u4f7f\u7528\u65b9\u6cd5","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#21sniff","title":"2.1\u3001sniff\uff08\u55c5\u63a2\u5668\uff09\u4f7f\u7528","text":"\u5728\u7ec8\u7aef\u8f93\u5165 sniff \u542f\u52a8 AT-SPI Browser mikigo@mikigo-PC:~$ sniff\n \u67e5\u770b\u5e94\u7528\u7684\u6807\u7b7e \u5728 sniff \u91cc\u9762\u53ef\u4ee5\u770b\u5230\u7cfb\u7edf\u4e2d\u5df2\u542f\u52a8\u7684\u5e94\u7528\uff0c\u70b9\u51fb\u5e94\u7528\u540d\u79f0\u524d\u9762\u7684\u4e09\u89d2\u5f62\u56fe\u6807\uff0c\u53ef\u4ee5\u5c55\u5f00\u5e94\u7528\u7684\u6807\u7b7e\uff0c\u6240\u6709\u6807\u7b7e\u4ee5 tree \u7684\u5f62\u5f0f\u5c55\u793a\uff0c\u5bf9\u5e94\u5e94\u7528\u91cc\u9762\u7684\u7236\u7a97\u53e3\u548c\u5b50\u7a97\u53e3\u3002 \u83b7\u53d6\u5143\u7d20\u63a7\u4ef6\u7684\u6807\u7b7e\u540d\u79f0 \u9996\u5148\uff0c\u4e3a\u4e86\u65b9\u4fbf\u67e5\u770b\u5143\u7d20\u63a7\u4ef6\u5bf9\u5e94\u7684\u4f4d\u7f6e\uff0c\u5efa\u8bae\u73b0\u5728\u4e0a\u65b9\u5de5\u5177\u680f\u70b9\u51fb Actions\uff0c\u7136\u540e\u52fe\u9009 Hightlight Items\uff0c\u8fd9\u6837\u5728 sniff \u4e2d\u9f20\u6807\u9009\u4e2d\u5143\u7d20\u6807\u7b7e\u7684\u65f6\u5019\uff0c\u5e94\u7528\u4e2d\u4f1a\u6709\u76f8\u5e94\u7684\u5149\u6807\u9501\u5b9a\u3002 \u5728 sniff \u91cc\u9762\u70b9\u51fb\u8fdb\u5165\u5e94\u7528\u7684\u6807\u7b7e tree \u4e2d\u540e\uff0c\u70b9\u51fb\u76f8\u5e94\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5728\u5de5\u5177\u4e0b\u65b9\uff0c\u4f1a\u5c55\u793a\u5143\u7d20\u63a7\u4ef6\u7684 Name\uff0c\u8fd9\u4e2a\u5c31\u662f\u6807\u7b7e\u540d\u79f0\u3002 \u5728 tree \u4e2d\u6709\u4e9b\u5730\u65b9\u662f\u7a7a\u767d\u7684\u6216\u8005\u662f Form\uff0c\u662f\u56e0\u4e3a\u5f00\u53d1\u4eba\u5458\u5728\u6dfb\u52a0\u6807\u7b7e\u7684\u65f6\u5019\u6ca1\u6709\u6dfb\u52a0\uff0c\u6216\u8005\u6709\u4e9b\u7236\u7a97\u53e3\u4e0d\u9700\u8981\u6dfb\u52a0\uff0c\u8fd9\u79cd\u5728\u5b9e\u9645\u4e1a\u52a1\u4e2d\u662f\u4e0d\u5f71\u54cd\u7684\uff0c\u6211\u4eec\u53ea\u8981\u4fdd\u8bc1\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\u4e2d\uff0c\u8981\u7528\u5230\u7684\u5143\u7d20\u90fd\u6dfb\u52a0\u4e86\u6807\u7b7e\u5373\u53ef\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#22","title":"2.2\u3001\u5143\u7d20\u64cd\u4f5c","text":"\u83b7\u53d6\u5e94\u7528\u5bf9\u8c61 dogtail \u83b7\u53d6\u5e94\u7528\u5bf9\u8c61\u7684\u65f6\u5019\uff0c\u4f7f\u7528\u7684\u662f tree \u5e93\u91cc\u9762\u7684 application() \u65b9\u6cd5\uff1a from dogtail.tree import root\napp_obj = root.application('deepin-music')\n app_obj\u5c31\u662f\u5e94\u7528\u7684\u5bf9\u8c61\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\uff0c\u662f\u5e94\u7528\u5bf9\u8c61\u4f7f\u7528child()\u65b9\u6cd5\uff1a element = app_obj.child('element_name')\n \u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u4f20\u5165\u5143\u7d20\u7684 Name\uff0c\u83b7\u53d6\u5230\u76f8\u5e94\u5143\u7d20\u7684\u5bf9\u8c61\u3002Name \u53ef\u4ee5\u901a\u8fc7 sniff \u67e5\u770b\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\u5217\u8868: element_list = element.children\n \u83b7\u53d6\u5230\u8fd9\u4e2a\u5143\u7d20\u4e0b\u9762\u6240\u6709\u7684\u5143\u7d20\u5217\u8868\u3002 \u8fd9\u4e2a\u65b9\u6cd5\u9002\u7528\u4e8e\u6709\u4e9b\u6807\u7b7e\u6ca1\u6709\u6dfb\u52a0\uff0c\u4f46\u662f\u4f4d\u7f6e\u662f\u56fa\u5b9a\u7684\uff0c\u6211\u4eec\u901a\u8fc7\u7d22\u5f15\u53ef\u4ee5\u53d6\u5f97\u5143\u7d20\u3002 element_list[0]\n \u5bf9\u5143\u7d20\u7684\u64cd\u4f5c \u5728\u83b7\u53d6\u5230\u5143\u7d20\u4e4b\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u76f8\u5e94\u7684\u64cd\u4f5c\u3002 \u5355\u51fb element.click(button=1)\n button 1 \u2014>\u5de6\u952e\uff0c2 \u2014>\u6eda\u8f6e\uff0c3 \u2014>\u53f3\u952e\uff0c\u9ed8\u8ba4\u4e3a 1 \u53cc\u51fb element.doubleClick(button=1)\n \u9f20\u6807\u60ac\u505c element.point()\n \u9f20\u6807\u79fb\u52a8\u5230\u5143\u7d20\u4e2d\u5fc3\u4f4d\u7f6e \u6587\u672c\u8f93\u5165 element.typeText(string)\n \u5411\u5143\u7d20\u5bf9\u8c61\u8f93\u5165\u5b57\u7b26\u4e32 \uff0c\u6bd4\u5982\u8f93\u5165\u6846 \u7ec4\u5408\u952e element.keyCombo(comboString)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#23","title":"2.3\u3001\u6846\u67b6\u5c01\u88c5","text":"\u4ee3\u7801\u793a\u4f8b\uff1a # \u8be6\u7ec6\u4ee3\u7801\u8bf7\u67e5\u770b src/dogtail_utils.py\nclass DogtailUtils:\ndef __init__(self, name=None, description=None):\nself.name = name\nself.description = description\nself.obj = root.application(self.name, self.description)\ndef app_element(self, *args, **kwargs):\n\"\"\"\n \u83b7\u53d6app\u5143\u7d20\u7684\u5bf9\u8c61\n :return: \u5143\u7d20\u7684\u5bf9\u8c61\n \"\"\"\nreturn self.obj.child(*args, **kwargs, retry=False)\ndef element_center(self, element) -> tuple:\n\"\"\"\n \u83b7\u53d6\u5143\u7d20\u7684\u4e2d\u5fc3\u4f4d\u7f6e\n :param element:\n :return: \u5143\u7d20\u4e2d\u5fc3\u5750\u6807\n \"\"\"\n_x, _y, _w, _h = self.app_element(element).extents\n_x = _x + _w / 2\n_y = _y + _h / 2\nreturn _x, _y\n \u6846\u67b6\u63d0\u4f9b\u7684\u63a5\u53e3\u975e\u5e38\u7b80\u6d01\uff0c\u5728\u8c03\u7528\u65f6\uff1a self.dog.element_center(\"\u64ad\u653e\")\n \u8fd9\u6837\u5c31\u80fd\u83b7\u53d6\u5230\u6b64\u5143\u7d20\u7684\u4e2d\u5fc3\u5750\u6807\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_5","title":"\u516d\u3001\u6807\u7b7e\u5316\u7ba1\u7406","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_4","title":"1\u3001\u6807\u7b7e\u8bf4\u660e","text":"\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u811a\u672c ID\uff1a\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c/\u51fd\u6570 ID\uff1b PMS\u7528\u4f8bID\uff1aPMS \u4e0a\u5bf9\u5e94\u7684\u7528\u4f8b ID\uff08\u7528\u4f8b\u5e93 ID\uff09\uff1b \u9ed8\u8ba4\u4f7f\u7528\u7528\u4f8b\u5e93 ID\uff0c\u5bf9\u4e8e\u6682\u65f6\u6ca1\u6709\u4f7f\u7528\u7528\u4f8b\u5e93\u7ba1\u7406\u7528\u4f8b\u7684\u9879\u76ee\uff0c\u53ef\u4ee5\u4f7f\u7528\u4ea7\u54c1\u5e93\u7528\u4f8b ID\uff1b \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1aFUNC\uff08\u529f\u80fd\uff09\u3001PERF\uff08\u6027\u80fd\uff09\u3001STR\uff08\u538b\u529b\uff09\u3001SEC\uff08\u5b89\u5168\uff09\u3001CTS\uff08\u517c\u5bb9\u6027\uff09\u3001API\uff08\u63a5\u53e3\uff09\u3001BASELINE\uff08\u57fa\u7ebf-\u9884\u7559\uff09 \u8bbe\u5907\u7c7b\u578b\uff1aPPL\uff08\u4f9d\u8d56\u5916\u8bbe\u7684\u7528\u4f8b\uff09\u3001COL\uff08\u4f9d\u8d56\u4e3b\u63a7\u673a\u7684\u7528\u4f8b\uff09 \u7528\u4f8b\u6765\u6e90\uff1aBUG\uff08\u7531 Bug \u8f6c\u7684\u7528\u4f8b\uff09 \u4e0a\u7ebf\u5bf9\u8c61\uff1aCICD\uff0c\u8868\u793a\u4e0a\u7ebf\u5230 CICD \u6d41\u6c34\u7ebf\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u53ef\u4e00\u952e\u751f\u6210 case_list.csv \u6587\u4ef6\uff0c\u7528\u4e8e\u5bfc\u5165\u5230\u660e\u9053\u4e91 AT \u7528\u4f8b\u5217\u8868\u4e2d\u63a7\u5236 CICD \u8dd1\u6d4b\u8303\u56f4\uff1b \u6d4b\u8bd5\u7ea7\u522b\uff1aC1 / C2 / C3 / C4\uff0c\u5177\u4f53\u5b9a\u4e49\u53c2\u8003\u6d41\u6c34\u7ebf\u4f7f\u7528\u6307\u5bfc\uff1b \u8df3\u8fc7\u539f\u56e0\uff1askip-XXX\uff0c\u7528\u4e8e\u63a7\u5236\u7528\u4f8b\u662f\u5426\u6267\u884c\uff1b \u786e\u8ba4\u4fee\u590d\uff1afixed-XXX\uff0c\u7528\u4e8e\u6807\u8bb0\u7528\u4f8b\u7684\u4fee\u590d\u72b6\u6001\uff08\u540e\u9762\u8be6\u7ec6\u8bb2\u89e3\u7528\u6cd5\uff09\uff1b \u5e9f\u5f03\u7528\u4f8b\uff1aremoved-\u5df2\u5e9f\u5f03\uff0c\u7528\u4e8e\u6807\u8bb0\u5df2\u7ecf\u5e9f\u5f03\u7684\u7528\u4f8b\uff0c\u6b64\u7528\u4f8b\u6807\u7b7e\u4e0d\u4f1a\u88ab\u6dfb\u52a0\uff0c\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff1b \u793a\u4f8b\uff1a \u811a\u672cID PMS\u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u8bbe\u5907\u7c7b\u578b \u7528\u4f8b\u6765\u6e90 \u4e0a\u7ebf\u5bf9\u8c61 \u6d4b\u8bd5\u7ea7\u522b \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b ... 679537 679537 L1 FUNC PPL CICD C1 skip-XXX fixed-XXX removed-\u5df2\u5e9f\u5f03 ..."},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_4","title":"2\u3001\u64cd\u4f5c\u6b65\u9aa4","text":"2.1\u3001\u5728\u5b50\u9879\u76ee\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u4ee5\u7528\u4f8b\u7684 py \u6587\u4ef6\u9664\u53bb\u9996\u5b57\u7b26\u4e32 \"test_\" \u548c\u7528\u4f8b\u5e8f\u53f7\u540e\u7684\u5b57\u7b26\u4e32\u4f5c\u4e3a csv \u7684\u6587\u4ef6\u540d\u3002 \u4f8b\u5982: \u76f8\u518c\u7684\u7528\u4f8b\u6587\u4ef6\u4e3a test_album_xxx.py\uff0cxxx \u8868\u793a\u7528\u4f8b\u7684ID\uff08\u4e5f\u53ef\u4ee5\u662f\u81ea\u5b9a\u4e49\u7684\u6570\u5b57\u4ee3\u8868\u7528\u4f8b\u5e8f\u53f7\uff09\uff0c\u6b64\u65f6 csv \u6587\u4ef6\u540d\u5c31\u5e94\u4e3a album.csv\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u6240\u6709 csv \u6587\u4ef6\u5efa\u8bae\u653e\u5728\u4e00\u4e2a tags \u76ee\u5f55\u4e0b\u3002 \u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 2.2\u3001\u7b2c\u4e00\u5217\u4e3a\u811a\u672c ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b\u7528\u4f8b\u6807\u7b7e\u53ef\u4ee5\u65e0\u5e8f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_2","title":"3\u3001\u589e\u52a0\u8bf4\u660e","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_1","title":"3.1\u3001\u8df3\u8fc7\u7528\u4f8b","text":"\u4f20\u7edf\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668(@pytest.mark.skip)\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a; \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#311","title":"3.1.1\u3001\u56fa\u5b9a\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 679537 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u7b7e\u5f00\u5934\u4e3a \u201cskip-XXX\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\uff0c\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\u5219\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u7b7e\u4e3a SKIPED\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#312","title":"3.1.2\u3001\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skipif_platform-aarch64&mips64 \u67d0\u4e9b\u7528\u4f8b\u4f1a\u56e0\u4e3a\u4e0d\u540c\u7684\u73af\u5883\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\uff0c\u5e38\u89c1\u7684\u573a\u666f\u4e3a\u5728\u4e0d\u540c\u67b6\u6784\u4e0a\u5224\u65ad\u662f\u5426\u6267\u884c\uff0c\u8df3\u8fc7\u7684\u539f\u56e0\u6807\u7b7e\u4e3a \u201cskipif_platform-\u201d \u52a0\u67b6\u6784\u540d\uff0c\u591a\u4e2a\u67b6\u6784\u4e4b\u95f4\u4f7f\u7528 \u201c&\u201d \u62fc\u63a5\uff1b \u4ee5\u4e0a\u4f8b\u5b50\u4e3a\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u5224\u65ad\u5f53\u524d\u67b6\u6784\u662f\u5426\u4e3a arrch64 \u6216\u8005 mips64\uff0c\u82e5\u662f\uff0c\u5219\u8df3\u8fc7\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u82e5\u5426\u5219\u6267\u884c\u7528\u4f8b\uff1b \u76ee\u524d\u6846\u67b6\u9ed8\u8ba4\u4ec5\u652f\u6301\u67b6\u6784\u7684\u6761\u4ef6\u5224\u65ad\uff0c\u4f46\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u903b\u8f91\u652f\u6301\u81ea\u5b9a\u4e49\u6dfb\u52a0\u3002 \u5728\u9879\u76ee\u76ee\u5f55\u8def\u5f84\u4e0b\u5b58\u5728\u6587\u4ef6 setting/skipif.py\uff0c\u6240\u6709\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u7684\u51fd\u6570\u5199\u5728\u6b64\u6587\u4ef6\u4e2d\u3002 \u9ed8\u8ba4\u67b6\u6784\u5224\u65ad\u4f8b\u5b50\uff1a def skipif_platform(args: str):\n\"\"\"\u5e73\u53f0\u8df3\u8fc7\"\"\"\n_skip_key = args.split(\"&\")\nfor key in _skip_key:\nif GlobalConfig.SYS_ARCH == key:\nreturn True\nreturn False\n \u65b9\u6cd5\u7f16\u5199\u89c4\u8303\uff1a \u65b9\u6cd5\u540d\u5fc5\u987b\u4ee5 skipif \u5f00\u5934\uff1b \u65b9\u6cd5\u5fc5\u987b\u6709\u8fd4\u56de\u7ed3\u679c\u5e76\u4e14\u4e3a\u5e03\u5c14\u503c\uff08True \u4ee3\u8868\u8df3\u8fc7\uff0cFalse \u4ee3\u8868\u4e0d\u8df3\u8fc7\uff09\uff1b \u65b9\u6cd5\u53ea\u80fd\u6709\u4e00\u4e2a\u5165\u53c2\uff1b \u5728 csv \u6587\u4ef6\u8df3\u8fc7\u539f\u56e0\u4e00\u680f\u4e2d\u586b\u5199\u4e3a \u201c{\u51fd\u6570\u540d}-{\u53c2\u6570}\u201d\uff0c\u4f8b\u5982\uff1askipif_platform-aarch64\uff1b\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u4f1a\u4ee5\u7b2c\u4e00\u4e2a \u201c-\u201d \u8fdb\u884c\u5206\u5272\uff0c\u622a\u53d6\u7684\u5de6\u4fa7\u5b57\u7b26\u4e32\u4f5c\u4e3a\u51fd\u6570\u540d\uff0c\u5728 skipif.py \u6587\u4ef6\u4e2d\u67e5\u627e\u662f\u5426\u6709\u540c\u540d\u51fd\u6570\uff0c\u5e76\u5c06\u622a\u53d6\u7684\u53f3\u4fa7\u4f5c\u4e3a\u53c2\u6570\u4f20\u9012\u7ed9\u8be5\u51fd\u6570\uff0c\u901a\u8fc7\u83b7\u53d6\u8be5\u51fd\u6570\u8fd4\u56de\u7684\u5e03\u5c14\u503c\uff0c\u8fd4\u56de True\uff0c\u5219\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u8fd4\u56de False\uff0c\u5219\u6267\u884c\u8be5\u7528\u4f8b\u3002 \u82e5\u51fd\u6570\u9700\u8981\u591a\u4e2a\u53c2\u6570\uff0c\u53ef\u81ea\u5b9a\u4e49\u591a\u4e2a\u53c2\u6570\u4e4b\u95f4\u7684\u8fde\u63a5\u7b26\uff0c\u8fde\u63a5\u7b26\u53f7\u4e0d\u53ef\u4f7f\u7528\u4e0b\u5212\u7ebf\u548c\u9017\u53f7\uff0c\u63a8\u8350\u7edf\u4e00\u4f7f\u7528 & \u7b26\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32","title":"3.2\u3001\u786e\u8ba4\u4fee\u590d","text":"\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7528\u4f8b\u4fee\u590d\u540e\uff0c\u4f46\u4e0d\u80fd\u7acb\u5373\u5220\u9664\u8df3\u8fc7\u539f\u56e0\uff08skip-XXX\uff09\u7684\u7528\u4f8b\uff0c\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u786e\u8ba4\u4fee\u590d\u201d\uff0c\u4f5c\u4e3a\u6807\u8bb0\u8be5\u7528\u4f8b\u662f\u5426\u5df2\u7ecf\u4fee\u590d\uff0c\u56fa\u5b9a\u586b\u5165\u5b57\u6bb5\u4e3a \u201cfixed-\u5df2\u4fee\u590d\u201d\u3002\u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u5373\u4f7f\u540c\u65f6\u6807\u8bb0\u4e86 skip-XXX \u4e5f\u4f1a\u6b63\u5e38\u6267\u884c\u3002 \u793a\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d 679537 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d \u3010\u540c\u65f6\u6807\u8bb0\u4e86skip \u548c fixed\uff0c\u4f46\u4ecd\u7136\u60f3\u8981\u8df3\u8fc7\u7528\u4f8b\u3011 \u5f53 \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u540c\u65f6\u586b\u5165\u540e\uff0c\u547d\u4ee4\u884c\u4f20\u9012\u53c2\u6570 --ifixed yes\uff0c\u5219\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\u8be5\u6761\u7528\u4f8b\u3002 python3 manage.py run --ifixed yes\n \u770b\u5230\u8fd9\u91cc\u6709\u4e9b\u540c\u5b66\u53ef\u80fd\u8981\u95ee\u4e86\uff0c\u6211\u60f3\u6062\u590d\u8df3\u8fc7\u6267\u884c\uff0c\u76f4\u63a5\u628a skip-XXX \u8fd9\u4e00\u5217\u6807\u7b7e\u5220\u6389\u4e0d\u5c31\u597d\u4e86\uff0c\u8fd8\u641e\u4ec0\u4e48\u786e\u8ba4\u4fee\u590d\u5e72\u5565\uff1f \u8fd9\u91cc\u7ed9\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u89e3\u91ca\u4e00\u4e0b\uff1a \uff08\u4ee5\u4e0b\u6d41\u6c34\u7ebf\u6307\u7684\u662f\u6bcf\u65e5\u6784\u5efa\u7684\u6d41\u6c34\u7ebf\uff0c\u8dd1 AT \u7684\u5168\u91cf\u7528\u4f8b\uff09 \u9996\u5148\uff0c\u6d41\u6c34\u7ebf\u4e0a\u8dd1\u7684\u662f AT \u5386\u53f2 Tag\uff0c\u8df3\u8fc7\u7528\u4f8b\u7684\u6807\u7b7e(skip-XXX) \u662f\u5728\u6700\u65b0\u7684\u4ee3\u7801\u4e0a\u63d0\u4ea4\u7684\uff0c\u6211\u4eec\u91c7\u7528\u6700\u65b0\u7684 csv \u6587\u4ef6\u8986\u76d6\u5386\u53f2 csv \u6587\u4ef6\u7684\u8bbe\u8ba1\u6765\u5b9e\u73b0\u4e86\u5bf9\u5386\u53f2 Tag \u4e0a\u7528\u4f8b\u7684\u8df3\u8fc7\uff1b \u7136\u540e\uff0c\u5728\u65e5\u5e38\u8df3\u8fc7\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u540c\u65f6\u4e5f\u5728\u4fee\u590d\u4e00\u4e9b\u7528\u4f8b\uff0c\u4fee\u590d\u540e\u7684\u8fd9\u4e9b\u7528\u4f8b\u5728\u672c\u5730\u8c03\u8bd5\u7684\u65f6\u5019\u6211\u4eec\u4e0d\u5e0c\u671b\u7ee7\u7eed\u8df3\u8fc7\uff0c\u4f46\u662f\u6b64\u65f6\uff0c\u4fee\u590d\u7684\u8fd9\u4e9b\u7528\u4f8b\u53ef\u80fd\u8fd8\u4e0d\u7a33\u5b9a\uff0c\u4e0d\u9002\u5408\u9a6c\u4e0a\u653e\u5230\u6d41\u6c34\u7ebf\u53bb\u8dd1\uff0c\u4e5f\u5c31\u662f\u8bf4\u6d41\u6c34\u7ebf\u4e0a\u6211\u4eec\u662f\u5e0c\u671b\u4ed6\u7ee7\u7eed\u8df3\u8fc7\u7684\uff0c\u56e0\u6b64\uff0c\u54b1\u4e0d\u80fd\u76f4\u63a5\u628a skip-XXX \u5e72\u6389\uff1b \u8fd9\u91cc\u5c31\u77db\u76fe\u4e86\uff0c\u4e00\u4e2a\u9700\u6c42\u662f\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u53e6\u4e00\u4e2a\u9700\u6c42\u53c8\u4e0d\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u600e\u4e48\u529e\u5462\uff1f \u6211\u4eec\u4f7f\u7528\u201c\u786e\u8ba4\u4fee\u590d\u201d\u6765\u6807\u8bb0\u8fd9\u6761\u7528\u4f8b\u5df2\u7ecf\u4fee\u590d\u4e86\uff0c\u8fd9\u6837\u4f60\u672c\u5730\u8c03\u8bd5\u7528\u4f8b\u7684\u65f6\u5019\u8fd9\u6761\u5df2\u4fee\u590d\u7684\u7528\u4f8b\u662f\u4f1a\u6267\u884c\u7684\uff0c\u540c\u65f6\u5728\u6d41\u6c34\u7ebf\u4e0a\u5c06 --ifixed yes \u53c2\u6570\u52a0\u4e0a\uff0c\u90a3\u4e48\u6d41\u6c34\u7ebf\u4e0a\u6267\u884c\u65f6\u8fd9\u6761\u7528\u4f8b\u4ecd\u7136\u662f\u8df3\u8fc7\u7684\u72b6\u6001\uff0c\u540e\u7eed\u4f60\u6253 Tag \u7684\u65f6\u5019\uff0c\u628a \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u7684\u6807\u7b7e\u5168\u90e8\u5220\u6389\u5c31\u53ef\u4ee5\u4e86\u3002 \u8fd9\u5c31\u662f\u201c\u786e\u8ba4\u4fee\u590d\u201d\u8fd9\u4e2a\u6807\u7b7e\u7684\u80cc\u666f\uff0c\u9700\u8981\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u54c1\u4e00\u54c1\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#33","title":"3.3\u3001\u5e9f\u5f03\u7528\u4f8b","text":"\u9488\u5bf9\u67d0\u4e9b\u7528\u4f8b\uff0c\u7531\u4e8e\u9700\u6c42\u53d8\u66f4\uff0c\u73af\u5883\u5f71\u54cd\u6216\u8bc4\u4f30\u4e0d\u518d\u9002\u7528\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u65f6\uff0c\u7528\u4f8b\u9700\u8981\u5e9f\u5f03\uff0c\u5219\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u5e9f\u5f03\u7528\u4f8b\u201d\uff0c\u8be5\u5217\u5b58\u5728 \u201cremoved-{\u5e9f\u5f03\u539f\u56e0}\u201d\uff0c\u5219\u7528\u4f8b\u4e0d\u4f1a\u6267\u884c\u3002 \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d removed-\u5df2\u5e9f\u5f03 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_2","title":"4\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u4e0a\u9762\u4ecb\u7ecd Pytest \u6846\u67b6\u63d0\u4f9b\u7684\u6807\u7b7e\u529f\u80fd mark\uff0c\u4f7f\u7528\u65f6\u9700\u8981\u4e3a\u6bcf\u4e00\u4e2a\u7528\u4f8b\u6dfb\u52a0\u6807\u7b7e\u88c5\u9970\u5668\uff0c\u5219\u64cd\u4f5c\u590d\u6742\uff0c\u53ef\u7ef4\u62a4\u6027\u5dee\uff0c\u5176\u6839\u672c\u95ee\u9898\u5c31\u662f\u6807\u7b7e\u5206\u6563\u5728\u6bcf\u4e00\u6761\u7528\u4f8b\u7684\u88c5\u9970\u5668\u4e0a\uff0c\u96be\u4ee5\u96c6\u4e2d\u7ef4\u62a4\uff1b\u4e8e\u662f\u4e4e\u5c06\u6240\u6709\u6807\u7b7e\u4f7f\u7528 csv \u6587\u4ef6\u8fdb\u884c\u96c6\u4e2d\u7ba1\u7406\uff0c\u5e76\u901a\u8fc7 Pytest \u7684\u94a9\u5b50\u51fd\u6570\uff0c\u8bfb\u53d6 csv \u6587\u4ef6\uff0c\u52a8\u6001\u6dfb\u52a0\u6807\u7b7e\u5230\u7528\u4e2d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5csv","title":"5\u3001CSV\u6587\u4ef6\u683c\u5f0f","text":"\u6b64\u914d\u7f6e\u6587\u4ef6\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u6807\u7b7e\u6570\u636e\uff0c\u4e14\u8981\u65b9\u4fbf\u80fd\u4f7f\u7528 Excel \u6253\u5f00\u8fdb\u884c\u7f16\u8f91\u67e5\u770b\uff0c\u66f4\u91cd\u8981\u7684\u662f\u6211\u4eec\u4e0d\u60f3\u5f15\u5165\u4e09\u65b9\u4f9d\u8d56\uff0cCSV \u6587\u4ef6\u51e0\u4e4e\u662f\u552f\u4e00\u80fd\u6ee1\u8db3\u6240\u6709\u7684\u8981\u6c42\u7684\u6587\u4ef6\u683c\u5f0f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_6","title":"\u4e03\u3001\u65e5\u5fd7\u7cfb\u7edf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_5","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e YouQu \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u64cd\u4f5c\u65b9\u6cd5\u5c01\u88c5\u5199\u6cd5\uff0c\u901a\u5e38\u662f\u8fd9\u6837\u7684\uff1a\u7c7b\u91cc\u9762\u4e00\u4e2a\u51fd\u6570\u53ea\u5305\u542b\u4e00\u4e2a\u64cd\u4f5c\u6216\u591a\u6b21\u8c03\u7528\u7684\u4e00\u7cfb\u5217\u53ef\u5408\u5e76\u7684\u64cd\u4f5c\uff1b \u4f20\u7edf\u7684\u65e5\u5fd7\u8f93\u51fa\u65b9\u5f0f\uff0c\u9700\u8981\u5728\u6bcf\u4e2a\u51fd\u6570\u91cc\u9762\u4e3b\u52a8\u7f16\u5199\u65e5\u5fd7\u8f93\u51fa\u4ee3\u7801 \uff0c\u4f8b\u5982\uff1a class XXXWidget:\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\nlogger.info(\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\")\n...\n# \u7701\u7565\u4ee3\u7801\u90e8\u5206\n \u4e00\u4e2a\u51fd\u6570\u91cc\u9762\u81f3\u5c11\u5305\u542b\u4e00\u6761\u65e5\u5fd7\u4fe1\u606f\uff0c\u5982\u679c\u6bd4\u8f83\u590d\u6742\u64cd\u4f5c\u6b65\u9aa4\uff0c\u53ef\u80fd\u5305\u542b\u591a\u6761\u65e5\u5fd7\u4fe1\u606f\uff1b \u4e00\u4e2a\u5e94\u7528\u542b\u6709\u5927\u91cf\u7684\u64cd\u4f5c\u51fd\u6570\uff0c\u4e5f\u5c31\u662f\u8bf4\u6211\u4eec\u9700\u8981\u5199\u5927\u91cf\u7684\u65e5\u5fd7\u4ee3\u7801\uff1b \u901a\u8fc7\u7ecf\u9a8c\u89c2\u5bdf\uff0c\u6211\u4eec\u53d1\u73b0\uff0c\u51fd\u6570\u8bf4\u660e\u4ee5\u53ca\u51fd\u6570\u64cd\u4f5c\u65e5\u5fd7\uff0c\u5177\u6709\u8f83\u9ad8\u7684\u91cd\u590d\u5ea6\uff08\u4ece\u4e0a\u9762\u7684\u4f8b\u5b50\u4e5f\u53ef\u4ee5\u770b\u51fa\u6765\uff09\uff0c\u56e0\u6b64\u6211\u4eec\u5927\u80c6\u7684\u8bbe\u60f3\uff0c\u80fd\u4e0d\u80fd\u57fa\u4e8e\u6846\u67b6\u6267\u884c\u65f6\uff0c\u81ea\u52a8\u7684\u5c06\u51fd\u6570\u8bf4\u660e\u4f5c\u4e3a\u65e5\u5fd7\u6253\u5370\u51fa\u6765\uff0c\u4ece\u800c\u51cf\u5c11\u5927\u91cf\u65e5\u5fd7\u4ee3\u7801\u91cf\u548c\u91cd\u590d\u7f16\u5199\uff0c\u90a3\u771f\u662f\u5999\u554a~\u3002 \u57fa\u4e8e\u6b64\u201c\u5929\u771f\u201d\u7684\u60f3\u6cd5\uff0c\u6211\u4eec\u8bbe\u8ba1\u51fa\u4e86 youqu \u7684\u65e5\u5fd7\u7cfb\u7edf\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_5","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u6838\u5fc3\u539f\u7406\uff1a \u901a\u8fc7\u7ed9\u7c7b\u52a0\u4e0a\u4e00\u4e2a\u88c5\u9970\u5668 @log\uff0c\u52a8\u6001\u7ed9\u8be5\u7c7b\u4e0b\u6240\u6709\u7684\u51fd\u6570\u53ca\u7236\u7c7b\u51fd\u6570\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668 @_trace\uff0c\u5728\u6b64\u88c5\u9970\u5668\u4e2d\u6211\u4eec\u80fd\u52a8\u6001\u7684\u6355\u83b7\u6240\u8c03\u7528\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff08func.__doc__\uff09\uff0c\u901a\u8fc7\u65e5\u5fd7\u8f93\u51fa\u5668\u5c06\u5176\u8f93\u51fa\u5373\u53ef\u3002 \u5b9e\u73b0\u6b65\u9aa4\uff1a \u901a\u8fc7 inspect.getmembers \u83b7\u53d6\u88ab\u88c5\u9970\u7684\u7c7b\u4e0b\u6240\u6709\u51fd\u6570\uff0c\u5305\u542b\u9759\u6001\u65b9\u6cd5\uff0c\u7c7b\u65b9\u6cd5\uff0c\u5b9e\u4f8b\u65b9\u6cd5\uff1b \u901a\u8fc7 setattr(\u7c7b, \u65b9\u6cd5, _trace\uff09 \u7684\u65b9\u5f0f\uff0c\u7ed9\u7b26\u5408\u6761\u4ef6\u7684\u51fd\u6570\uff0c\u52a8\u6001\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_3","title":"3\u3001\u65e5\u5fd7\u914d\u7f6e","text":"[log_cli]\n;\u65e5\u5fd7\u76f8\u5173\u914d\u7f6e\uff08\u4e0d\u6253\u5370\u6784\u9020\u51fd\u6570\u548c\u9b54\u6cd5\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff09\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = INFO\n# ============= \u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u914d\u7f6e ================\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u5f00\u5934\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7, \u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_STARTSWITH = Assert\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u7ed3\u5c3e\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_ENDSWITH = Widget\n;\u652f\u6301\u7c7b\u540d\u5305\u542b xxx \u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_CONTAIN = ShortCut\n# ==============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_3","title":"4\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u5728\u5e94\u7528\u5e93 widget \u65b9\u6cd5\u5e93\u91cc\u9762\uff0c\u53ea\u9700\u8981\u5728\u51fa\u53e3\u6587\u4ef6\u52a0\u4e0a\u7c7b\u88c5\u9970\u5668\uff0c\u5c31\u53ef\u4ee5\u5b9e\u73b0\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u4e86\uff1b # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6ce8\u610f\uff0c\u662f\u7c7b\u88c5\u9970\u5668\u3002 \u5b9e\u4f8b\uff1a # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\n@classmethod\ndef find_dfm_image(cls, *elements, multiple=False, rate=0.9):\n\"\"\"\n \u67e5\u627e\u56fe\u7247 {{elements}}.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e {{rate}} \u7684\u5750\u6807\n :param elements:\n :param multiple:\n :return:\n \"\"\"\nelement = tuple(map(lambda x: f\"{Config.PIC_RES_PATH}/{x}\", elements))\nreturn cls.find_image(*element, multiple=multiple)\n \u8c03\u7528\u65b9\u6cd5\u65f6\uff1a DfmWidget.find_dfm_image(\"dfm_001\")\n \u81ea\u52a8\u8f93\u51fa\u7684\u65e5\u5fd7\uff1a >> x86_64-uos-6: 02/28 17:48:47 | INFO | logger_utils: [find_dfm_image]: \u67e5\u627e\u56fe\u7247 dfm_001.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e 0.9 \u7684\u5750\u6807\n \u52a0\u4e0a\u88c5\u9970\u5668 @log \u4e4b\u540e\uff0c\u65b9\u6cd5\u5c42\u6240\u6709\u7684\u51fd\u6570\uff08\u5305\u62ec\u5b9e\u4f8b\u65b9\u6cd5\u3001\u7c7b\u65b9\u6cd5\u3001\u9759\u6001\u65b9\u6cd5\uff09\u90fd\u4e0d\u9700\u8981\u518d\u5199\u65e5\u5fd7\u4ee3\u7801\uff0c\u6267\u884c\u7684\u65f6\u5019\u4f1a\u81ea\u52a8\u8f93\u51fa\uff0c\u5e76\u4e14\u6240\u6709\u8c03\u7528\u7684\u65b9\u6cd5\u4f1a\u4ee5 allure.step \u7684\u65b9\u5f0f\uff0c\u5c55\u793a\u5728 allure \u62a5\u544a\u4e2d\uff0c\u5728\u62a5\u544a\u4e2d\u66f4\u80fd\u4e00\u76ee\u4e86\u7136\u7684\u770b\u5230\u7528\u4f8b\u6267\u884c\u6b65\u9aa4\u3002 \u3010\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\u3011 \u901a\u8fc7\u89c2\u5bdf\u524d\u9762\u7684\u4f8b\u5b50\uff0c\u7ec6\u5fc3\u7684\u540c\u5b66\u53ef\u80fd\u8fd8\u53d1\u73b0\u4e86\u4e00\u4e2a\u5c0f\u7ec6\u8282\uff1a\u51fd\u6570\u529f\u80fd\u8bf4\u660e\u4e2d\uff0c\u4e24\u5bf9\u5927\u62ec\u53f7\u4e2d\u7684\u5185\u5bb9 {{elements}} \u4f5c\u4e3a\u53d8\u91cf\u8f93\u51fa\u51fa\u6765\u4e86\uff1b \u6ca1\u9519\uff0c\u8fd9\u5c31\u662f\u6211\u4eec\u53c2\u8003Django \u548c jinja2 \u7684\u6a21\u677f\u8bed\u6cd5\u8bbe\u8ba1\u51fa\u7684\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\uff0c\u4f7f\u7528\u65b9\u6cd5\u5f88\u7b80\u5355\uff0c\u7528\u4e24\u5bf9\u5927\u62ec\u53f7\u628a\u51fd\u6570\u7684\u53c2\u6570\u62ec\u8d77\u6765\uff0c\u8fd9\u6837\u5728\u65e5\u5fd7\u8f93\u51fa\u7684\u65f6\u5019\u5c31\u80fd\u628a\u8c03\u7528\u51fd\u6570\u65f6\u53c2\u6570\u7684\u503c\u8f93\u51fa\u51fa\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_7","title":"\u516b\u3001\u73af\u5883\u90e8\u7f72","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_6","title":"1\u3001\u539f\u5219","text":"YouQu \u7684\u73af\u5883\u4f9d\u8d56\u4e00\u76f4\u575a\u6301 2 \u4e2a\u539f\u5219\uff1a \u6700\u5c0f\u73af\u5883\u4f9d\u8d56\u539f\u5219 \u6709\u4e9b\u540c\u5b66\u5199\u4e00\u4e9b\u529f\u80fd\uff0c\u9996\u5148\u60f3\u5230\u7684\u5c31\u662f\u53bb\u641c\u7d22\u5f15\u64ce\u641c\u4e00\u4e0b\uff0c\u770b\u6709\u6ca1\u6709\u73b0\u6210\u7684\u5de5\u5177\u6216\u8005\u4ee3\u7801\u76f4\u63a5\u80fd\u7528\uff0c\u7f8e\u5176\u540d\u66f0\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\uff0c\u522b\u4eba\u5df2\u7ecf\u9020\u597d\u4e86\u8f6e\u5b50\u54b1\u4eec\u5c31\u4e0d\u8981\u91cd\u590d\u53bb\u9020\u4e86\uff0c\u7136\u540e\u4e00\u5207\u4f3c\u4e4e\u90fd\u53d8\u5f97\u90a3\u4e48\u7684\u7406\u6240\u5e94\u5f53\u3002 \u5f53\u7136\u8fd9\u6837\u505a\u65e0\u53ef\u539a\u975e\uff0c\u6211\u76f8\u4fe1\u6709\u8fd9\u6837\u60f3\u6cd5\u5e76\u4e14\u4e00\u76f4\u8df5\u884c\u8fd9\u6837\u505a\u6cd5\u7684\u540c\u5b66\u4e0d\u5728\u5c11\u6570\uff0c\u4f46\u8fd9\u6837\u505a\u6709\u4e00\u4e2a\u5f88\u4e25\u91cd\u7684\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f60\u5199\u4e00\u4e2a\u5927\u578b\u9879\u76ee\u65f6\uff0c\u4f60\u4f1a\u5f15\u5165\u975e\u5e38\u975e\u5e38\u975e\u5e38\u591a\u7684\u4f9d\u8d56\uff0c\u6bd4\u5982\u8981\u505a\u4e2a\u63a5\u53e3\u8bf7\u6c42\u8981\u7528 requests\u3001\u8bfb\u5199\u4e2a\u6570\u636e\u7528 pandas\u3001\u5199\u4e2a\u8868\u683c\u7528 pyopenxl\u3001\u89e3\u6790\u4e2a\u6587\u672c\u8981\u7528\u8fd9\u4e2a\u90a3\u4e2a\u4e09\u65b9\u5e93 ... \u3002 \u6211\u8ba4\u4e3a\u8fd9\u662f\u975e\u5e38\u4e0d\u597d\u7684\u4e60\u60ef\uff0c\u5728\u5b9e\u73b0\u4e00\u4e2a\u529f\u80fd\u7684\u65f6\u5019\uff0c\u9996\u5148\u6211\u4eec\u5e94\u8be5\u53bb\u60f3\u81ea\u5df1\u600e\u4e48\u6837\u53bb\u5b9e\u73b0\uff0c\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff1b \u5982\u679c\u4f60\u4e0d\u4f1a\uff0c\u4f60\u53ef\u4ee5\u53bb\u5b66\u4e60\u4e09\u65b9\u5e93\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u522b\u4eba\u4e09\u65b9\u5e93\u4e5f\u662f\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\u7684\uff0c\u4e3a\u4ec0\u4e48\u54b1\u4eec\u4e0d\u884c\u5462\uff1b\u5982\u679c\u522b\u4eba\u7684\u4f60\u5b9e\u5728\u662f\u770b\u4e0d\u61c2\uff0c\u60f3\u5c3d\u4e00\u5207\u529e\u6cd5\u786e\u5b9e\u505a\u4e0d\u51fa\u6765\uff0c\u90a3\u518d\u8003\u8651\u5f15\u5165\u8fd9\u4e2a\u4e09\u65b9\u5e93\uff0c\u6211\u8ba4\u4e3a\u8fd9\u6837\u662f\u6ca1\u95ee\u9898\u7684\uff0c\u6bd5\u7adf\u54b1\u4eec\u6bb5\u4f4d\u8fd8\u4e0d\u591f\uff0c\u4f46\u5e0c\u671b\u5c06\u6765\u6709\u4e00\u5929\u6211\u4eec\u53ef\u4ee5\u3002 \u8fd9\u6837\u7684\u505a\u6cd5\u624d\u5e94\u8be5\u662f\u201c\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\u201d\u6b63\u786e\u7684\u64cd\u4f5c\u3002\u4e0d\u4f1a\u6ca1\u5173\u7cfb\uff0c\u770b\u770b\u522b\u4eba\u662f\u600e\u4e48\u5b9e\u73b0\u7684\uff0c\u81ea\u5df1\u518d\u6478\u7d22\u7740\u5199\u51fa\u6765\uff0c\u8fd9\u6837\u81ea\u5df1\u624d\u80fd\u6709\u6240\u63d0\u9ad8\uff0c\u4e0d\u7136\u4f60\u5c31\u53ea\u4f1a\u7528\u522b\u4eba\u7684\u4e1c\u897f\uff1b\u90a3\u4e9b\u5632\u7b11\u3001\u6279\u8bc4\u6211\u4eec\u91cd\u590d\u9020\u8f6e\u5b50\u7684\u4eba\uff0c\u5148\u60f3\u60f3\u81ea\u5df1\u4f1a\u9020\u8f6e\u5b50\u5417\u3002 \u672c\u7740\u81ea\u5df1\u5b9e\u73b0\u80fd\u5b9e\u73b0\u7684\u4e00\u5207\u7684\u539f\u5219\uff0cYouQu \u6846\u67b6\u505a\u5230\u4e86\u975e\u5e38\u5c11\u7684\u73af\u5883\u4f9d\u8d56\uff0c\u800c\u4e14\u6211\u4eec\u4ecd\u5728\u4e0d\u65ad\u52aa\u529b\uff0c\u51cf\u5c11\u73af\u5883\u90e8\u7f72\u7684\u4f9d\u8d56\u3002 \u6700\u5c0f\u4ed3\u5e93\u4f53\u79ef\u539f\u5219 \u5927\u6587\u4ef6\u4e0d\u80fd\u4e0a\u4f20\u5230\u5de5\u7a0b\u91cc\u9762\uff0c\u4fdd\u6301\u6574\u4e2a\u5de5\u7a0b\u7684\u8f7b\u91cf\u5316\uff0c\u8fd9\u6837\u5728\u514b\u9686\u4ee3\u7801\u7684\u65f6\u5019\u624d\u80fd\u975e\u5e38\u5feb\u901f\u65b9\u4fbf\u4f7f\u7528\uff0c\u6211\u4eec\u89c1\u8fc7\u4e00\u4e2a AT \u5de5\u7a0b clone \u5927\u5c0f\u8fbe\u5230\u597d\u51e0\u4e2a G\uff0c\u7b80\u76f4\u4e0d\u53ef\u601d\u8bae\u3002 \u5176\u5b9e\u4ee3\u7801\u6587\u4ef6\u7684\u5927\u5c0f\u662f\u5f88\u5c0f\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u7eaf\u5199\u4ee3\u7801\u968f\u4fbf\u5199\u5de5\u7a0b\u4e5f\u4e0d\u4f1a\u592a\u5927\uff0c\u800c\u6587\u6863\uff08\u5305\u542b\u63d2\u56fe\uff09\u7b49\u8d44\u6e90\u5374\u662f\u5f88\u5360\u7a7a\u95f4\u3002 \u56e0\u6b64\u6211\u4eec\u9009\u62e9\u5c06 YouQu \u7684\u6587\u6863\u5de5\u7a0b\u6d89\u53ca\u5230\u7684\u56fe\u7247\u8d44\u6e90\u90fd\u91c7\u7528\u5916\u94fe\u52a0\u8f7d\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_6","title":"2\u3001\u5b89\u88c5","text":"\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u8fd0\u884c env.sh \u5373\u53ef\u3002 bash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_4","title":"3\u3001\u5b9a\u5236\u4f9d\u8d56","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_2","title":"3.1\u3001\u65b0\u589e\u4f9d\u8d56","text":"\u5982\u679c\u5e94\u7528\u5e93\u8fd8\u9700\u8981\u5176\u4ed6 Python \u4f9d\u8d56\u5e93\uff0c\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a requirement.txt \u6587\u4ef6\uff1b autotest_xxx\n\u251c\u2500\u2500 requirement.txt\n\u251c\u2500\u2500 case ...\n \u91cc\u9762\u5199\u5165\u9700\u8981\u5b89\u88c5\u7684\u4e09\u65b9\u4f9d\u8d56\uff0c\u6bd4\u5982\u50cf\u8fd9\u6837\uff1a # requirement.txt\nPyYAML==6.0 # \u6307\u5b9a\u5b89\u88c5\u67d0\u4e2a\u7248\u672c\nrequests # \u672a\u6307\u5b9a\u7248\u672c\u5219\u5b89\u88c5\u6700\u65b0\u7248\n \u5728\u6267\u884c bash env.sh \u65f6\u4f1a\u4e00\u5e76\u5c06\u5176\u5b89\u88c5\u3002 \u5982\u679c\u591a\u4e2a\u5e94\u7528\u5e93\u90fd\u5b58\u5728 requirement.txt \u6587\u4ef6\uff0c\u6267\u884c env.sh \u65f6\u4f1a\u5c06\u591a\u4e2a requirement.txt \u6587\u4ef6\u4e00\u5e76\u52a0\u8f7d\uff1b\u90a3\u4e48\u4e00\u5b9a\u8981\u6ce8\u610f\u591a\u4e2a requirement.txt \u6587\u4ef6\u53ef\u80fd\u5b58\u5728\u76f8\u540c\u7684\u4f9d\u8d56\u88ab\u6307\u5b9a\u5b89\u88c5\u4e0d\u540c\u7248\u672c\u7b49\u7b49\u517c\u5bb9\u6027\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32_1","title":"3.2\u3001\u88c1\u526a\u4f9d\u8d56","text":"\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0c\u53ef\u80fd\u4f60\u53ea\u9700\u8981\u5b89\u88c5\u4e00\u4e9b\u6700\u6700\u57fa\u7840\u7684\u4f9d\u8d56\uff0c\u5176\u4ed6\u7684\u90fd\u4e0d\u9700\u8981\uff0c\u6bd4\u5982\u7eaf\u63a5\u53e3\u81ea\u52a8\u5316\u7684\u9879\u76ee\uff0c\u5b83\u4e0d\u9700\u8981 UI \u81ea\u52a8\u5316\u76f8\u5173\u7684\u4f9d\u8d56\u3002 \u4f60\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\uff0c\u5b58\u653e\u4e00\u4e2a BASICENV \u7684\u666e\u901a\u6587\u4ef6\uff0c\u91cc\u9762\u4e0d\u9700\u8981\u5199\u4efb\u4f55\u5185\u5bb9\uff0c\u8fd9\u6837\u6267\u884c env.sh \u65f6\uff0c\u53ea\u4f1a\u5b89\u88c5\u6700\u57fa\u7840\u7684\u4f9d\u8d56\u3002 autotest_xxx\n\u251c\u2500\u2500 BASICENV # \u53ef\u4ee5\u4f7f\u7528\uff1atouch BASICENV \u521b\u5efa\u6587\u4ef6\n\u251c\u2500\u2500 case ...\n \u57fa\u7840\u4f9d\u8d56\u4ec5\u5b89\u88c5\u4ee5\u4e0b\u51e0\u4e2a\u5305\uff1a pytest # pytest\npytest-rerunfailures # \u5931\u8d25\u91cd\u8dd1\u63d2\u4ef6\npytest-timeout # \u7528\u4f8b\u8d85\u65f6\u63d2\u4ef6\nallure-pytest # \u751f\u6210 allure \u62a5\u544a\u63d2\u4ef6\nallure.deb # allure \u62a5\u544a\u67e5\u770b\u5de5\u5177\n \u88c1\u526a\u4f9d\u8d56 \u548c \u65b0\u589e\u4f9d\u8d56 \u662f\u4e0d\u51b2\u7a81\u7684\uff0c\u53ef\u4ee5\u540c\u65f6\u4f7f\u7528\u3002 \u6b64\u65b9\u6848\u9ed8\u8ba4\u4e3a\u865a\u62df\u73af\u5883\u90e8\u7f72\uff0c\u5982\u679c\u4f60\u60f3\u76f4\u63a5\u90e8\u7f72\u5728\u672c\u673a\u4e0a\uff1a bash env_dev.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_4","title":"4\u3001\u865a\u62df\u5316\u90e8\u7f72","text":"YouQu\u9ed8\u8ba4\u91c7\u7528\u865a\u62df\u5316\u90e8\u5206\uff0c\u865a\u62df\u5316\u73af\u5883\u5b9e\u9645\u5b89\u88c5\u7684\u4f4d\u7f6e\u662f\u5728 $HOME/.local/share/virtualenvs/youqu-oHTM7l7G \u76ee\u5f55\u4e0b youqu-oHTM7l7G \u6b64\u76ee\u5f55\u540d\u79f0\u524d\u9762\u90e8\u5206\u662f\u4f60\u7684\u4ee3\u7801\u6839\u76ee\u5f55\u7684\u540d\u79f0\uff0c\u540e\u9762\u90e8\u5206\u662f\u751f\u6210\u7684\u968f\u673a\u5b57\u7b26\u4e32\uff1b \u540c\u5b66\u4eec\u5728\u8fdc\u7a0b\u673a\u5668\u4e0a\u5b9a\u4f4d\u95ee\u9898\u7684\u65f6\u5019\uff0c\u5982\u679c\u4f7f\u7528 Pycharm \u8c03\u8bd5\uff0c\u5c31\u5c06\u89e3\u91ca\u5668\u6307\u5b9a\u5230\u8fd9\u4e2a\u76ee\u5f55\u7684\u5c31\u884c\u4e86\uff1b \u5f53\u7136\uff0c\u6211\u4eec\u4e5f\u63d0\u4f9b\u4e86\u672c\u673a\u5f00\u53d1\u73af\u5883\u90e8\u7f72\uff1a bash env_dev.sh\n \u5982\u679c\u4f60\u662f\u672c\u5730\u5f00\u53d1\u73af\u5883\u53ef\u4ee5\u7528\u5b83\uff0c\u533a\u522b\u5c31\u662f\u9a71\u52a8\u6267\u884c\u7684\u65f6\u5019\u4f7f\u7528\uff1apython3 manage.py xxx"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_8","title":"\u4e5d\u3001\u5931\u8d25\u5f55\u5c4f","text":"\u5f55\u5c4f\u5176\u5b9e\u662f\u4e00\u79cd\u89c6\u9891\u5f62\u5f0f\u7684\u65e5\u5fd7\uff0c\u56e0\u4e3a\u5f88\u591a\u65f6\u5019\u6211\u4eec\u5728\u67e5\u770b\u65e5\u5fd7\u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u51c6\u786e\u7684\u5b9a\u4f4d\u5230\u7528\u4f8b\u5931\u8d25\u7684\u5177\u4f53\u539f\u56e0\uff0c\u56e0\u6b64\u7528\u4f8b\u7684\u5f55\u5c4f\u80fd\u8ba9\u6211\u4eec\u770b\u5230\u7528\u4f8b\u5728\u6267\u884c\u8fc7\u7a0b\uff1b \u3010\u4f7f\u7528\u65b9\u6cd5\u3011 \u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u5173\u6ce8 2 \u4e2a\u53c2\u6570\uff1b ;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\u3002\n;\u6ce8\u610f\uff0c\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u4e0d\u80fd\u5c0f\u4e8e\u5931\u8d25\u5f55\u5c4f\u6b21\u6570\uff0c\u5373 RERUN >= RECORD_FAILED_CASE\nRECORD_FAILED_CASE = 1\n \u9ed8\u8ba4\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u662f 1 \u6b21\uff1b RECORD_FAILED_CASE = 1 \u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff1b RECORD_FAILED_CASE = 0 \u8868\u793a\u4e0d\u7ba1\u7528\u4f8b\u6210\u529f\u6216\u5931\u8d25\u90fd\u5f55\u5c4f\uff1b \u5f55\u5c4f\u662f\u8981\u5360\u7528\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u7279\u522b\u662f\u5728\u4e00\u4e9b\u914d\u7f6e\u8f83\u4f4e\u7684\u673a\u5668\u4e0a\u4f1a\u5f88\u660e\u663e\uff0c\u6240\u4ee5\u4f60\u9700\u8981\u8003\u8651\u662f\u5426\u6709\u5fc5\u8981\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1b \u4f7f\u7528 manage.py \u6267\u884c\u7528\u4f8b\u9ed8\u8ba4\u8bfb\u53d6\u5230 globalconfig.ini \u91cc\u9762\u7684\u53c2\u6570\uff0c\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report/record \u76ee\u5f55\u4e0b\u4fdd\u5b58\u5931\u8d25\u7528\u4f8b\u7684\u5f55\u5c4f\u548c\u65ad\u8a00\u7684\u90a3\u4e2a\u65f6\u95f4\u70b9\u7684\u622a\u5c4f\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7\u89c6\u9891\u6587\u4ef6\u770b\u5230\u5931\u8d25\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u90fd\u53d1\u751f\u4e86\u4ec0\u4e48\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#wayland","title":"\u5341\u3001Wayland \u9002\u914d","text":"Wayland \u4e0b\u81ea\u52a8\u5316\u4e3b\u8981\u95ee\u9898\u662f X11 \u4e0b\u7684\u952e\u9f20\u64cd\u4f5c\u65b9\u6cd5\u65e0\u6cd5\u4f7f\u7528\uff0c\u6bd4\u5982 Xdotool\u3001 PyAutoGUI\u3001Xwininfo \u7b49\u7b49\uff1b YouQu \u5728 Wayland \u4e0b\u517c\u5bb9\u9002\u914d\uff0cenv.sh \u5728 Wayland \u4e0b\u6267\u884c\u65f6\u4f1a\u5b89\u88c5\u81ea\u7814\u7684\u952e\u9f20\u64cd\u4f5c\u670d\u52a1\uff08\u53ef\u80fd\u5b58\u5728\u4e00\u4e9b\u4f9d\u8d56\u62a5\u9519\uff0c\u6309\u7167\u6ce8\u91ca\u89e3\u51b3\u5373\u53ef\uff09\uff0c\u6846\u67b6\u6838\u5fc3\u5e93\u4e5f\u9488\u5bf9\u6027\u7684\u505a\u4e86\u9002\u914d\uff0c\u4e0a\u5c42\u7528\u4f8b\u5b8c\u5168\u4e0d\u7528\u5173\u5fc3\u673a\u5668\u662fWayland \u8fd8\u662f X11\uff0c\u6846\u67b6\u4f1a\u6839\u636e\u6267\u884c\u65f6\u72b6\u6001\u81ea\u52a8\u5224\u65ad\u8d70\u4e0d\u540c\u7684\u903b\u8f91\uff1b \u7b80\u5355\u8bb2\u5c31\u662f\uff0c\u5e94\u7528\u5e93\u53ea\u9700\u8981\u7ef4\u62a4\u4e00\u5957\u7528\u4f8b\u811a\u672c\u5373\u53ef\u3002 \u3010\u7528\u4f8b\u517c\u5bb9\u3011 \u56e0\u4e3a Wayland \u4e0b\u6709\u4e9b\u5e94\u7528\u7684\u754c\u9762\u663e\u793a\u548c\u529f\u80fd\u672c\u8eab\u5b58\u5728\u4e00\u4e9b\u5dee\u5f02\uff0c\u7528\u4f8b\u5c42\u53ef\u80fd\u9700\u8981\u5bf9\u8fd9\u90e8\u5206\u7528\u4f8b\u505a\u903b\u8f91\u5224\u65ad\uff0c\u4f7f\u7528\u5168\u5c40\u914d\u7f6e\u91cc\u9762\u7684\u5e38\u91cf\u8fdb\u884c\u903b\u8f91\u7f16\u5199\u5373\u53ef\uff1a from setting.globalconfig import GlobalConfig\n# GlobalConfig.IS_WAYLAND \u83b7\u53d6\u5230\u5f53\u524d\u7684\u663e\u793a\u670d\u52a1\u5668\uff08bool\uff09\n# \u5e94\u7528\u5e93 Config \u7ee7\u627f GlobalConfig\nif Config.IS_WAYLAND:\npass\nif Config.IS_X11:\npass\n \u6bd4\u5982\u7528\u4f8b\u91cc\u9762\u5982\u679c\u65ad\u8a00\u7684\u56fe\u7247\u4e0d\u540c\uff1a if Config.IS_WAYLAND:\nself.assert_image_exist(\"wayland_XXX\")\nelse:\nself.assert_image_exist(\"x11_XXX\")\n \u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u811a\u672c\u5728 Wayland \u548c X11 \u4e0b\u90fd\u53ef\u4ee5\u8dd1\uff0cso easy \u662f\u4e0d\u662f\uff1f\u5b8c\u5168\u6ca1\u5fc5\u8981\u4e13\u95e8\u62c9\u65b0\u5206\u652f\u8fdb\u884c Wayland \u9002\u914d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_9","title":"\u5341\u4e00\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_7","title":"1. \u76ee\u5f55\u7ed3\u6784","text":"\u6267\u884c\u65f6\u4f1a\u5728\u6839\u76ee\u5f55\u4e0b\u52a8\u6001\u751f\u6210 report \u76ee\u5f55\uff0c\u6240\u6709\u7684\u62a5\u544a\u76f8\u5173\u7684\u6587\u4ef6\u4f1a\u7edf\u4e00\u5b58\u653e\u5728\u91cc\u9762\uff0c\u793a\u4f8b\uff1a /report\n \u251c\u2500\u2500 allure # allure\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json\n \u251c\u2500\u2500 allure_html # \u751f\u6210\u7684html\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 index.html \u251c\u2500\u2500 allure_back # allure\u62a5\u544a\u5907\u4efd\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 20221108114823\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json\n \u251c\u2500\u2500 json # json\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 result_deepin-music_20221109134736_1081333.json\n \u251c\u2500\u2500 logs # \u65e5\u5fd7\u6587\u4ef6\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 2022-11-10_debug.log \u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-10_error.log\n \u251c\u2500\u2500 record # \u5f55\u5c4f\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-09\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 15\u65f614\u520609\u79d2_test_music_303_2_autotest.mp4\n \u2514\u2500\u2500 xml # xml\u62a5\u544a\n\u2514\u2500\u2500 autotest_deepin_music-20221109134736.xml\n \u9ed8\u8ba4\u60c5\u51b5\u4e0b\u540c\u65f6\u751f\u6210 html\u3001xml\u3001json\u4e09\u79cd\u5f62\u5f0f\u7684\u62a5\u544a\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_7","title":"2. \u5b9a\u5236\u62a5\u544a","text":"\u6211\u4eec\u5bf9 allure \u62a5\u544a\u8fdb\u884c\u4e86\u4e00\u7cfb\u5217\u7684\u5b9a\u5236\uff1a \u5b9a\u5236 logo\u3001title\u3001\u62a5\u544a\u9ed8\u8ba4\u8bed\u8a00\u4e3a\u4e2d\u6587\uff1b \u52a0\u5165\u4e86\u7528\u4f8b\u65ad\u8a00\u5931\u8d25\u65f6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u4ee5\u53ca\u6b64\u65f6\u56fe\u50cf\u5bf9\u6bd4\u7684\u6a21\u677f\u56fe\u7247\uff1b \u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\uff0c\u4f60\u53ef\u4ee5\u5728 html \u62a5\u544a\u4e2d\u76f4\u63a5\u770b\u5f55\u5236\u7684\u89c6\u9891\uff1b \u52a0\u5165\u4e86 IP \u5730\u5740\u3001\u7cfb\u7edf\u4fe1\u606f\u3001\u955c\u50cf\u7248\u672c\u7b49\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_5","title":"3. \u67e5\u770b\u62a5\u544a","text":" \u672c\u5730\u6267\u884c \u5728 report/allure \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u4e00\u5806\u6587\u672c\u6587\u4ef6\uff0c\u8fd9\u4e9b\u662f allure \u63d2\u4ef6\u751f\u6210\u7684\u62a5\u544a\u6e90\u6570\u636e\uff0c\u6211\u4eec\u5728 report/allure_html \u76ee\u5f55\u4e0b\u7ed9\u4f60\u751f\u6210\u4e86 html \u6587\u4ef6\uff0c\u4f46\u662f\u4f60\u4e0d\u80fd\u76f4\u63a5\u901a\u8fc7\u6d4f\u89c8\u5668\u6253\u5f00 index.html \u6587\u4ef6\uff0c\u56e0\u4e3a allure \u7684\u62a5\u544a\u90fd\u662f\u57fa\u4e8e\u5728\u7ebf\u7684\u670d\u52a1\uff0c\u4f60\u5e94\u8be5\u8fd9\u6837\u6253\u5f00\uff1a allure open report/allure_html\n \u4f7f\u7528 manage.py \u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u5728\u7ec8\u7aef\u7684\u6700\u540e\u4e00\u884c\uff0c\u6211\u4eec\u4f1a\u7ed9\u4f60\u8f93\u51fa\u6253\u5f00\u62a5\u544a\u7684\u547d\u4ee4\uff0c\u76f4\u63a5\u590d\u5236\u5b83\u5728\u7ec8\u7aef\u6267\u884c\u5c31\u53ef\u4ee5\u67e5\u770b\u4e86\uff0c\u50cf\u8fd9\u6837\uff1a \u7ec8\u7aef\u6267\u884c\u547d\u4ee4: allure open /tmp/youqu/report/allure_html \u67e5\u770b\u62a5\u544a \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 Pycharm \u91cc\u9762\u627e\u5230 index.html \u6587\u4ef6\uff0c\u7136\u540e\u53f3\u952e\u9009\u62e9\u6d4f\u89c8\u5668\u6253\u5f00\uff0c\u6216\u8005\u4f60\u53ef\u4ee5\u7528\u4e00\u4e2a http \u670d\u52a1\u6253\u5f00\u3002 \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 report/allure \u76ee\u5f55\u4e0b\u67e5\u770b\u62a5\u544a\uff1a allure serve report/allure\n \u8fdc\u7a0b\u6267\u884c \u8fdc\u7a0b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\uff0c\u4f1a\u5c06\u6240\u6709\u8fdc\u7a0b\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u62a5\u544a\u90fd\u6536\u96c6\u5230 report/allure \u76ee\u5f55\u4e0b\uff0c\u5206\u522b\u6309\u7167\u673a\u5668\u7684 IP \u7b49\u5efa\u4e86\u4e0d\u540c\u7684\u76ee\u5f55\uff0c\u4f60\u53ef\u4ee5\u5728\u8fd9\u4e9b\u76ee\u5f55\u91cc\u9762\u53bb\u67e5\u770b\u5bf9\u5e94\u7684\u6d4b\u8bd5\u62a5\u544a\uff0c\u67e5\u770b\u65b9\u6cd5\u548c\u524d\u9762\u672c\u5730\u6267\u884c\u67e5\u770b\u7684\u65b9\u6cd5\u4e00\u6837\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_10","title":"\u5341\u4e8c\u3001\u9759\u6001\u4ee3\u7801\u626b\u63cf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_8","title":"1. \u63d0\u524d\u89e3\u51b3\u4ee3\u7801\u95ee\u9898","text":"\u4e3a\u4e86\u5e2e\u52a9\u5f00\u53d1\u8005\u7edf\u4e00\u4ee3\u7801\u98ce\u683c\uff0cPython \u793e\u533a\u63d0\u51fa\u4e86 PEP8 \u4ee3\u7801\u7f16\u7801\u98ce\u683c\uff0cPython \u5b98\u65b9\u540c\u65f6\u63a8\u51fa\u4e86\u4e00\u4e2a\u68c0\u67e5\u4ee3\u7801\u98ce\u683c\u662f\u5426\u7b26\u5408 PEP8 \u7684\u5de5\u5177\uff0c\u540d\u5b57\u4e5f\u53eb PEP8\u3002 \u4f46\u662f\uff0cPycharm \u91cc\u9762\u7684 PEP8 \u63d2\u4ef6\u5b9e\u9645\u4e0a\u5e76\u4e0d\u80fd\u53d1\u73b0\u5f88\u591a\u4ee3\u7801\u95ee\u9898\uff0c\u8fd9\u4e9b\u95ee\u9898\u5e76\u4e0d\u4f1a\u5728\u8fd0\u884c\u65f6\u62a5\u9519\uff0c\u56e0\u4e3a\u4ece Python \u8bed\u8a00\u89d2\u5ea6\u5e76\u4e0d\u5173\u5fc3\u8fd9\u4e9b\u95ee\u9898\uff0c\u5728 Pycharm \u7f16\u8f91\u5668\u91cc\u9762\u4f7f\u7528\u5feb\u6377\u952e ctrl + alt + L\uff0c\u6709\u4e00\u70b9\u70b9\u683c\u5f0f\u5316\u7684\u6548\u679c\uff0c\u80fd\u89e3\u51b3\u4e00\u4e9b\u7a7a\u683c\u3001\u6362\u884c\u7b49\u5c0f\u95ee\u9898\u3002 \u8fd9\u91cc\u63a8\u8350\u4e00\u4e2a Python \u793e\u533a\u6d41\u884c\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff1a Black\uff0c\u53f7\u79f0\u4e0d\u59a5\u534f\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff0c\u5b83\u68c0\u6d4b\u5230\u4e0d\u7b26\u5408\u89c4\u8303\u7684\u4ee3\u7801\u98ce\u683c\u76f4\u63a5\u5c31\u5e2e\u4f60\u5168\u90e8\u683c\u5f0f\u5316\u597d\uff0c\u5c31\u662f\u8fd9\u4e48\u521a\uff01 \u5b89\u88c5\uff1a sudo pip3 install black \n \u4f7f\u7528\u65b9\u6cd5\uff1a black ${CheckPath}\n \u4f7f\u7528\u8fd9\u4e2a\u5de5\u5177\u683c\u5f0f\u5316\u4e4b\u540e\uff0c\u4ee3\u7801\u4f1a\u88ab\u81ea\u52a8\u8c03\u6574\uff0c\u521a\u5f00\u59cb\u4f60\u53ef\u80fd\u4f1a\u89c9\u5f97\u8c03\u6574\u5f97\u5f88\u5938\u5f20\uff0c\u6ca1\u5173\u7cfb\u575a\u6301\u770b\uff0c\u4e60\u60ef\u4e4b\u540e\uff0c\u4f60\u4f1a\u89c9\u5f97\u5f88\u4f18\u96c5\uff0c\u6ca1\u9519\uff0c\u8fd9\u5c31\u662f Pythonic Code \u7684\u6838\u5fc3\uff0c\u8bf7\u4fdd\u6301\u4f18\u96c5\uff5e\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_8","title":"2. \u4ee3\u7801\u626b\u63cf\u5de5\u5177","text":"\u4f7f\u7528\u6839\u76ee\u5f55\u4e0b pylint.sh \u626b\u63cf\u4ee3\u7801\uff0c\u5728 report \u76ee\u5f55\u4e0b\u67e5\u770b\u4ee3\u7801\u626b\u63cf\u62a5\u544a\uff0c\u5982\u679c\u6709\u4ee3\u7801\u95ee\u9898\u8bf7\u63d0\u524d\u89e3\u51b3\u4e4b\u540e\u518d\u63d0\u4ea4\u3002 \u6b64\u811a\u672c\u5df2\u7ecf\u4f7f\u7528 Python \u793e\u533a\u6700\u6d41\u884c\u7684\u4ee3\u7801\u626b\u63cf\u5de5\u5177 Pylint \u8fdb\u884c\u4ee3\u7801\u626b\u63cf\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a bash pylint.sh\n \u8fd0\u884c\u4e4b\u540e\u4f1a\u63d0\u793a\u4f60\u8981\u626b\u63cf\u7684\u76ee\u5f55\uff0c\u6bd4\u5982\u8f93\u5165 apps \uff0c\u5219\u4f1a\u626b\u63cf apps \u4e0b\u7684\u6240\u6709 Python \u4ee3\u7801\u3002 \u5728 setting/pylintrc.cfg \u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u76f8\u5173\u914d\u7f6e\uff0c\u626b\u63cf\u5b8c\u6210\u4e4b\u540e\u5728 report/pylints \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u626b\u63cf\u62a5\u544a\u3002 \u4ee3\u7801\u63d0\u4ea4\u9700\u901a\u8fc7 git review \u63d0\u4ea4\u5230 gerrit \uff0c\u4eba\u5de5 Code Review \u901a\u8fc7\u4e4b\u540e\u5408\u5165\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_11","title":"\u5341\u4e09\u3001\u63d0\u4ea4\u4ee3\u7801","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_9","title":"1. \u5b89\u88c5\u4f9d\u8d56","text":"sudo apt install git-review\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_9","title":"2. \u63d0\u4ea4\u6a21\u677f","text":"\u5728 ~ \u76ee\u5f55\u4e0b\u65b0\u5efa\u6587\u4ef6\uff0c\u5e76\u547d\u540d\u4e3a gitcommit_template \u5c06\u4ee5\u4e0b\u5185\u5bb9\u5199\u5165\u6587\u4ef6\u5f53\u4e2d\uff1a # commit type :fix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style(\u98ce\u683c\u4fee\u6539)\u3001refactor(\u91cd\u6784)\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test(\u6d4b\u8bd5) + \u7b80\u5355\u63cf\u8ff0. \u9ed8\u8ba4fix,\u6839\u636e\u60c5\u51b5\u4fee\u6539\nfix: \n\n# \u8be6\u7ec6\u8bf4\u660e\u4ee3\u7801\u7684\u6539\u52a8\uff0c\u5305\u542b\u4ee3\u7801\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u4ee5\u53ca\u4e3a\u4ec0\u4e48\u8fd9\u4e48\u505a\uff0c\u53ef\u80fd\u4f1a\u5f71\u54cd\u54ea\u4e9b\u529f\u80fd\u3002\u5bf9\u4e8e\u4ee3\u7801\u7684\u5ba1\u6838\u8005\uff0c\u9700\u8981\u4ece\u8fd9\u6bb5\u63cf\u8ff0\u4e2d\u80fd\u5b8c\u5168\u7406\u89e3\u4ee3\u7801\u4e2d\u6240\u6709\u6539\u52a8\u7684\u5185\u5bb9\nDescription: \n\n# \u5199\u4e00\u6bb5\u9762\u5411\u4e8e\u4ea7\u54c1\u7684\u603b\u7ed3\u6027\u5185\u5bb9\uff0c\u7528\u4e8e\u81ea\u52a8\u751f\u6210crp\u4e0a\u7684changlog\uff0c\u9700\u8981\u6ce8\u610f\u7684\u4e8b\uff0c\u8fd9\u6bb5\u63cf\u8ff0\u5fc5\u987b\u4ece\u4ea7\u54c1\u7684\u89d2\u5ea6\u8003\u8651\u3002\nLog: \n\n# \u5173\u8054pms\u4e0a\u7684bug\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94bug\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4fee\u590dbug\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Bug: \n\n# \u4fee\u590d github issue \n#Issue: \n\n# \u5173\u8054pms\u4e0a\u7684\u4efb\u52a1\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94\u4efb\u52a1\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4efb\u52a1\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Task: \n \u547d\u4ee4\u884c\u6267\u884c: git config --global commit.template ~/gitcommit_template\n \u6b64\u547d\u4ee4\u5c06\u6a21\u677f\u52a0\u5165\u5230 git \u7684\u63d0\u4ea4\u6a21\u677f\u4e2d\u3002 \u540e\u7eed\u63d0\u4ea4\u7684\u65f6\u5019\u9700\u8981\u5173\u6ce8\u4e00\u4e0b\u51e0\u70b9\uff1a commit type \u5bf9\u5e94\u4e0d\u540c\u7684\u4fee\u6539\u7c7b\u578b\uff1afix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style \uff08\u98ce\u683c\u4fee\u6539\uff09\u3001refactor \uff08\u91cd\u6784\uff09\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test \uff08\u6d4b\u8bd5\uff09 commit type \u5192\u53f7\u540e\u9762\u52a0\u7a7a\u683c\u3002 Description \u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u9700\u8981\u8fdb\u884c\u8be6\u7ec6\u8bf4\u660e\uff0c\u6bd4\u5982\u5bf9\u529f\u80fd\u8fdb\u884c\u5927\u6539\u7b49\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_6","title":"3. \u63a8\u9001\u4ee3\u7801","text":"\u9996\u5148\u6dfb\u52a0 commit \u4fe1\u606f git add \u540e\u9762\u52a0\u6587\u4ef6\u540d\u79f0\n git add . # \u8868\u793a\u6dfb\u52a0\u6240\u6709\u6587\u4ef6\n \u4f7f\u7528\u8fd9\u6761\u547d\u4ee4\u6ce8\u610f\u6709\u4e9b\u4e34\u65f6\u6587\u4ef6\u4e0d\u8981\u63d0\u4ea4\u5230\u4ed3\u5e93\u4e86\u3002 git commit -a\n \u4e4b\u540e\u5728 fix: \u540e\u9762\uff08\u6ce8\u610f\u5192\u53f7\u540e\u9762\u5fc5\u987b\u52a0\u7a7a\u683c\uff0c\u4e0d\u7136\u76f4\u63a5-1\uff09\u5199\u672c\u5730\u63d0\u4ea4\u7684 commit \u4fe1\u606f\uff0c\u7136\u540e\u5c31\u53ef\u4ee5\u63d0\u4ea4\u4ee3\u7801\u4e86 git review branch(\u5f53\u524d\u5206\u652f) -r origin\n \u6700\u597d\u4e00\u6b21 commit\uff0c\u4e00\u6b21 git review \uff0c\u7ecf\u5e38\u6709\u540c\u5b66\u5728\u672c\u5730\u75af\u72c2 commit \u6700\u540e git review \u62a5\u9519\u4e0d\u77e5\u9053\u548b\u56de\u4e8b\u513f\u3002 \u82e5\u4e0d\u60f3\u6bcf\u6b21\u63d0\u4ea4\u90fd\u52a0\u4e0a -r \u9009\u9879\uff0c\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a git config --global gitreview.remote origin \u63d0\u4ea4\u4ee3\u7801\uff0c\u76f4\u63a5\u4f7f\u7528 git review branch<\u76ee\u6807\u5206\u652f>\uff0c\u4f8b\u5982 git review master"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git","title":"4. Git\u6807\u7b7e","text":"Git \u6807\u7b7e\u5b9e\u9645\u4e0a\u662f commit \u7684\u4e00\u4e2a\u522b\u540d\uff0c\u4e3b\u8981\u7528\u4e8e\u7ba1\u7406\u5386\u53f2\u7248\u672c\u3002 \u60f3\u8c61\u4e00\u4e0b\u9886\u5bfc\u8ba9\u4f60\u628a\u4e4b\u524d\u7684\u67d0\u4e2a\u7248\u672c\u7684\u4ee3\u7801\u62c9\u51fa\u6765\u8dd1\uff0c\u4f60\u662f\u4e0d\u662f\u4e56\u4e56\u7684\u53bb\u628a\u6240\u6709\u63d0\u4ea4\u8bb0\u5f55\u62c9\u51fa\u6765\u627e\uff0c\u7136\u540e\u627e\u5230\u90a3\u4e2a\u54c8\u5e0c\u503c\uff0c\u901a\u8fc7\u54c8\u5e0c\u503c\u6765\u68c0\u51fa\u4ee3\u7801\u3002 \u8fd9\u4e00\u5957\u64cd\u4f5c\u4e0b\u6765\u662f\u4e0d\u662f\u5f88\u9ebb\u70e6\uff0c\u8d39\u65f6\u95f4\u8fd8\u4e0d\u4e00\u5b9a\u80fd\u627e\u5f97\u5230\uff0c\u6ca1\u4eba\u80fd\u8bb0\u4f4f\u6bcf\u4e2a\u63d0\u4ea4\u54c8\u5e0c\u503c\u4ee5\u53ca\u8fd9\u6b21\u63d0\u4ea4\u90fd\u6539\u4e86\u54ea\u4e9b\u4ee3\u7801\u3002 \u56e0\u6b64\u7ed9\u63d0\u4ea4\u6253\u4e2a\u6807\u7b7e\uff0c\u5c31\u662f\u628a\u54c8\u5e0c\u503c\u8f6c\u6362\u6210\u4eba\u7c7b\u80fd\u7406\u89e3\u7684\u8bed\u8a00\uff0c\u6bd4\u5982 v1.0\uff0c\u5c31\u53ef\u4ee5\u76f4\u63a5\u901a\u8fc7\u6807\u7b7e\u627e\u5230\u5bf9\u5e94\u7684\u63d0\u4ea4\u3002 \u65b0\u5efa\u6807\u7b7e git tag -a <tagname>\n \u56de\u8f66\u4e4b\u540e\uff0cGit \u4f1a\u6253\u5f00\u4f60\u7684\u7f16\u8f91\u5668\uff0c\u8ba9\u4f60\u5199\u4e00\u53e5\u6807\u7b7e\u6ce8\u89e3\uff0c\u5c31\u50cf\u4f60\u7ed9\u63d0\u4ea4\u5199\u6ce8\u89e3\u4e00\u6837\u3002 \u67e5\u770b\u6240\u6709\u6807\u7b7e git tag -l\n# git tag \u4e5f\u884c\n \u5220\u9664\u6807\u7b7e git tag -d <tagname>\n \u63a8\u9001\u6807\u7b7e\u81f3\u8fdc\u7a0b git push \u547d\u4ee4\u5e76\u4e0d\u4f1a\u4f20\u9001\u6807\u7b7e\u5230\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\uff0c\u5fc5\u987b\u663e\u5f0f\u5730\u63a8\u9001\u6807\u7b7e\u3002 git push origin <tagname>\n \u63a8\u9001\u6240\u6709\u4e0d\u5728\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\u7684\u6807\u7b7e git push origin --tag\n \u5220\u9664\u8fdc\u7a0b\u6807\u7b7e git push origin :refs/tag/<tagname>\n \u540e\u671f\u6253\u6807\u7b7e \u5148\u7528 git log --pretty=oneline \u67e5\u8be2\u63d0\u4ea4\u8bb0\u5f55\uff0c\u83b7\u53d6\u6821\u9a8c\u7801\u3002 git tag -a <tagname> 9fceb02(\u6821\u9a8c\u7801)\n \u68c0\u51fa\u6807\u7b7e git checkout <tagname>\n \u6b64\u65f6\uff0c\u4ed3\u5e93\u4f1a\u5904\u4e8e\u201c\u5206\u79bb\u5934\u6307\u9488\uff08detached HEAD\uff09\u201d\u7684\u72b6\u6001\u3002 \u5728\u201c\u5206\u79bb\u5934\u6307\u9488\u201d\u72b6\u6001\u4e0b\uff0c\u5982\u679c\u4f60\u505a\u4e86\u67d0\u4e9b\u66f4\u6539\u7136\u540e\u63d0\u4ea4\u5b83\u4eec\uff0c\u6807\u7b7e\u4e0d\u4f1a\u53d1\u751f\u53d8\u5316\uff0c \u4f46\u4f60\u7684\u65b0\u63d0\u4ea4\u5c06\u4e0d\u5c5e\u4e8e\u4efb\u4f55\u5206\u652f\uff0c\u5e76\u4e14\u5c06\u65e0\u6cd5\u8bbf\u95ee\uff0c\u9664\u975e\u901a\u8fc7\u786e\u5207\u7684\u63d0\u4ea4\u54c8\u5e0c\u624d\u80fd\u8bbf\u95ee\u3002 \u56e0\u6b64\uff0c\u5982\u679c\u4f60\u9700\u8981\u8fdb\u884c\u66f4\u6539\uff0c\u6bd4\u5982\u4f60\u8981\u4fee\u590d\u65e7\u7248\u672c\u4e2d\u7684\u9519\u8bef\uff0c\u90a3\u4e48\u901a\u5e38\u9700\u8981\u521b\u5efa\u4e00\u4e2a\u65b0\u5206\u652f\uff1a git checkout -b <NewBranchName> <tagname>\n \u65b0\u5206\u652f\u4e0a\u53ef\u4ee5\u8fdb\u884c\u63d0\u4ea4\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_12","title":"\u5341\u56db\u3001\u5e38\u89c1\u95ee\u9898","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_10","title":"1. \u63d0\u4ea4\u4ee3\u7801\u65f6\u63d0\u793a\u90ae\u7bb1\u6216\u8005\u540d\u79f0\u4e0d\u5bf9","text":"\u91cd\u65b0\u914d\u7f6e\u90ae\u7bb1\u6216\u8005\u540d\u79f0\uff0c\u7136\u540e\u91cd\u7f6e\u751f\u6548\uff1a git commit --amend --reset-author\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_10","title":"2. \u600e\u4e48\u56de\u6eda\u5230\u4e4b\u524d\u7684\u7248\u672c","text":"(1)\u67e5\u8be2\u5386\u53f2\u63d0\u4ea4\u8bb0\u5f55 git log\n \u627e\u5230\u4f60\u8981\u56de\u6eda\u7684\u7248\u672c\uff0c\u590d\u5236 hash \u503c\u3002 \u6ce8\u610f\uff1a\u662f commit \u7a7a\u683c\u4e4b\u540e\u7684 hash \u503c\uff0c\u4e4b\u524d\u6709\u540c\u5b66\u590d\u5236\u7684 Change-Id: \u8fd9\u6837\u80af\u5b9a\u62a5\u9519\u3002 (2)\u56de\u6eda\u7248\u672c\uff0c\u4e0d\u6e05\u9664\u4ee3\u7801 git reset --soft ${hash}\n (3)\u56de\u6eda\u7248\u672c\uff0c\u6e05\u9664\u4ee3\u7801\uff0c\u614e\u7528\u54c8 git reset --hard ${hash}\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-f-s-e","title":"3. \u6d4b\u8bd5\u62a5\u544a\u91cc\u9762 F S . E \u662f\u4ec0\u4e48\u610f\u601d","text":"F \u8868\u793a\u5931\u8d25\uff0c. \uff08\u70b9\uff09\u8868\u793a\u901a\u8fc7\uff0cS \u8868\u793a\u8df3\u8fc7\uff0cE \u8868\u793a error \u6709\u62a5\u9519"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git-status","title":"4. \u89e3\u51b3 git status \u4e2d\u6587\u663e\u793a\u7684\u95ee\u9898","text":"git config --global core.quotePath false\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5-apps","title":"5. apps \u76ee\u5f55\u4e0b\u989c\u8272\u6709\u4e9b\u662f\u9ec4\u8272\u7684","text":"\u5728 Pycharm \u4e2d apps \u76ee\u5f55\u4e0b\u5e94\u7528\u5e93\u6587\u4ef6\u662f\u9ec4\u8272\u7684\uff0c\u7f16\u8f91\u5668\u8bc6\u522b\u4e0d\u5230\u4ee3\u7801\u65b0\u589e\u548c\u4fee\u6539\uff1b \u7531\u4e8e\u793e\u533a\u7248 Pycharm \u4e0d\u80fd\u52a8\u6001\u8bc6\u522b\u591a\u4ed3\u5e93\uff0c\u9700\u8981\u5728 setting \u91cc\u9762\u624b\u52a8\u6ce8\u518c\uff0c\u64cd\u4f5c\u6b65\u9aa4\uff1a File \u2014> Settings \u2014> Version Control \u2014> \u70b9 + \u53f7 \u2014> Directory \u9009\u4e2d\u5e94\u7528\u5e93\u5de5\u7a0b\u76ee\u5f55 \u2014> VCS \u9009\u4e2d Git \u2014> Apply \u5982\u6b64\u5c31\u53ef\u4ee5\u4e86\u3002 \u4e13\u4e1a\u7248 Pycharm \u4e0d\u5b58\u5728\u8fd9\u4e2a\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#6-envsh-r","title":"6. \u6267\u884c env.sh \u62a5\u9519 $'\\r':\u672a\u627e\u5230\u547d\u4ee4","text":"\u51fa\u73b0\u8fd9\u4e2a\u95ee\u9898\u4f60\u5e94\u8be5\u662f\u5728 windows \u4e0a\u6253\u5f00\u6216\u7f16\u8f91\u8fc7 env.sh \u811a\u672c\uff0cwindows\u4e0b\u7684\u6362\u884c\u662f\u56de\u8f66\u7b26+\u6362\u884c\u7b26\uff0c\u4e5f\u5c31\u662f\\r\\n\uff0c\u800c Linxu \u4e0b\u662f\u6362\u884c\u7b26 \\n\uff0cLinux \u4e0b\u4e0d\u8bc6\u522b \\r\uff0c\u56e0\u6b64\u62a5\u9519\u3002 \u89e3\u51b3\u65b9\u6848\uff1a # \u5c06 \\r \u66ff\u6362\u4e3a\u7a7a\nsudo sed -i 's/\\r//' env.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#7","title":"7.\u600e\u6837\u4e3a\u5355\u72ec\u67d0\u4e00\u6761\u7528\u4f8b\u914d\u7f6e\u6267\u884c\u8d85\u65f6\u65f6\u95f4","text":"\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u5982\u4e0b\uff1a @pytest.mark.timeout(300) # \u5355\u4f4d\u79d2\ndef test_xxx_001():\npass\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#8-youqu","title":"8. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u6240\u6709\u4ee3\u7801\uff0c\u5305\u542b\u5b50\u4ed3\u5e93","text":"\u524d\u7f6e\u6761\u4ef6\uff1a\u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 # \u7b2c\u4e00\u6b21\u5b58\u50a8\u5bc6\u7801\uff0c\u63d0\u4f9b\u540e\u9762\u62c9\u4ee3\u7801(gerrit: ldap\u8d26\u53f7\u548c\u5bc6\u7801\uff0cgit\u62c9\u53d6\u7b2c\u4e00\u6b21\u8f93\u5165\u4fdd\u5b58\uff0c\u540e\u9762\u76f4\u63a5\u4f7f\u7528)\ngit config --global credential.helper store\n\n# \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\uff0c\u5e76\u9012\u5f52\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\" --recursive\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#9-youqu","title":"9. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\u6307\u5b9a\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u524d\u7f6e\u6761\u4ef6\uff1a \u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 \u5df2\u5b58\u50a8\u8bbf\u95ee\u5bc6\u7801 # \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\"\n# \u6307\u5b9a\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ncd youqu\ngit submodule update --init apps/autotest_xxx_xxx\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#10-youqu","title":"10. \u5982\u4f55\u66f4\u65b0 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\uff0c\u6240\u6709\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u66f4\u65b0\u6240\u6709\u5b50\u4ed3\u5e93\u4ee3\u7801 cd youqu\ngit pull & git submodule foreach git pull\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#11-youqu-master-detached-head","title":"11. \u5982\u4f55\u4fee\u590d YouQu \u6240\u6709\u5b50\u4ed3\u5e93 master \u5206\u652f\u6e38\u79bb\u5934\uff08detached head\uff09","text":"\u4fee\u590d\u6240\u6709\u5b50\u4ed3\u5e93\u9ed8\u8ba4master \u5206\u652f\u6e38\u79bb\u5934 cd youqu\ngit submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/","title":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212 \u5206\u7c7b\uff1a/ \u67b6\u6784\u5e08\uff1a/ \u76ee\u6807\uff1a \u5e94\u7528 AT \u67b6\u6784\u5de5\u7a0b\u5316\uff0c\u53c2\u8003\u6027\u80fd\u81ea\u52a8\u5316\u5de5\u7a0b\u5b8c\u6210\u5de5\u7a0b\u5316\u6539\u9020\u3002 \u5e94\u7528\u95f4\u7528\u4f8b\u89e3\u8026\uff0c\u89e3\u9664\u6240\u6709\u4ea4\u53c9\u8c03\u7528\u7684\u65b9\u6cd5\uff0c\u5404\u5e94\u7528\u80fd\u8ddf\u968f\u81ea\u8eab\u8fed\u4ee3\u5468\u671f\u72ec\u7acb\u7ef4\u62a4 AT \u7528\u4f8b\u3002 \u5b8c\u6210\u516c\u5171\u65b9\u6cd5\u7684\u62bd\u53d6\u6574\u5408\uff0c\u5f62\u6210\u4e00\u5957\u72ec\u7acb\u4e8e\u5e94\u7528\u95f4\u7684\u516c\u5171\u65b9\u6cd5\u5e93\uff0c\u5404\u5e94\u7528\u65b9\u6cd5\u91cc\u9762\u4e0d\u5b58\u5728\u88ab\u591a\u4e2a\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\u3002 \u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u4e3a\u5c06\u6765\u9002\u914d\u66f4\u591a\u7684 AT \u8fd0\u7528\u573a\u666f\u63d0\u4f9b\u652f\u6491\uff0c\u539f\u5219\u4e0a\u53ef\u5b9e\u73b0\u65e0\u9650\u6269\u5c55\uff0c\u5728\u6bcf\u65e5\u6784\u5efa\u548c\u6301\u7eed\u96c6\u6210\u6d41\u7a0b\u843d\u5730\u4f7f\u7528\u3002 \u4ee3\u7801\u89c4\u8303\u95ee\u9898\u6e05\u96f6\uff0c\u7b26\u5408 Shell Check\u3001Pylint\u3001\u7cfb\u7edf\u90e8\u76f8\u5173\u7f16\u7801\u89c4\u8303\u8981\u6c42\u3002 \u610f\u4e49\uff1a \u7edf\u4e00\u6210\u7814 AT \u67b6\u6784\u8bbe\u8ba1\u601d\u8def\uff0c\u6d88\u9664 AT \u4ee3\u7801\u5b9e\u73b0\u548c\u7ef4\u62a4\u4e0a\u53ef\u80fd\u51fa\u73b0\u7684\u5206\u6b67\uff0c\u6539\u5584\u5386\u53f2 AT \u65e0\u5de5\u7a0b\u5316\u8bbe\u8ba1\u7684\u7f3a\u9677\uff0c\u63d0\u9ad8\u67b6\u6784\u4e13\u4e1a\u6027\u3002 \u5404\u5e94\u7528 AT \u4ee3\u7801\u76f8\u4e92\u72ec\u7acb\uff0c\u5951\u5408\u5e94\u7528\u72ec\u7acb\u53d1\u5e03\u7279\u6027\uff0c\u53ef\u652f\u6301\u8fed\u4ee3\u671f\u95f4\u72ec\u7acb\u65b0\u589e\u3001\u7ef4\u62a4\u548c\u6267\u884c\u3002 \u65b9\u6cd5\u8c03\u7528\u903b\u8f91\u5f97\u5230\u7b80\u5316\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u66f4\u9ad8\u6548\uff1b\u516c\u5171\u5e93\u62bd\u53d6\uff0c\u51cf\u5c11\u65b9\u6cd5\u91cd\u590d\u7f16\u5199\uff0c\u63d0\u9ad8\u4ee3\u7801\u5229\u7528\u7387\uff1b\u5e73\u5747\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u4ece40\u5206\u949f\u964d\u4f4e\u81f330\u5206\u949f\uff0c\u65e5\u4ea7\u51fa\u7528\u4f8b\u4ece12\u6761/\u5929\u63d0\u5347\u81f316\u6761/\u5929\u3002 \u53ef\u7075\u6d3b\u652f\u6491\u4e0d\u540c\u7684\u81ea\u52a8\u5316\u8fd0\u7528\u573a\u666f\uff0c\u5982 CI\u3001\u5192\u70df\u6d4b\u8bd5\u3001\u96c6\u6210\u6d4b\u8bd5\u3001\u56de\u5f52\u6d4b\u8bd5\u3001\u4e13\u9879\u6d4b\u8bd5\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_2","title":"\u4e00\u3001\u80cc\u666f\u4ecb\u7ecd","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1","title":"1\u3001\u73b0\u6709\u67b6\u6784\u4ecb\u7ecd","text":"\u73b0\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u6574\u4f53\u5206\u4e3a\u4e09\u5c42\uff1a\u7528\u4f8b\u5c42\uff08\u4e1a\u52a1\u903b\u8f91\u5c42\uff09\u3001\u4e2d\u95f4\u5c42\uff08\u5143\u7d20\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff09\u3001\u6838\u5fc3\u5c42\uff08\u5e95\u5c42\u529f\u80fd\u5e93\u5c42\uff09\u3002 \u7528\u4f8b\u5c42\uff1a\u5373\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4e13\u6ce8\u4e8e\u4e1a\u52a1\u529f\u80fd\u903b\u8f91\uff0c\u4e0d\u5173\u5fc3\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\uff1b \u4e2d\u95f4\u5c42\uff1a\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff0c\u6bcf\u4e2a\u65b9\u6cd5\u5747\u5bf9\u5e94\u4e00\u4e2a\u5143\u7d20\u7684\u4e00\u4e2a\u5177\u4f53\u64cd\u4f5c\uff0c\u4e5f\u53ef\u4ee5\u662f\u591a\u4e2a\u64cd\u4f5c\u7684\u7ec4\u5408\u64cd\u4f5c\uff0c\u4e2d\u95f4\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u7528\u4f8b\u5c42\uff0c\u5177\u6709\u53ef\u6269\u5c55\u6027\u548c\u590d\u7528\u6027\uff1b \u6838\u5fc3\u5c42\uff1a\u4e3b\u8981\u5c01\u88c5\u7684\u5e95\u5c42\u529f\u80fd\u5b9e\u73b0\uff0c\u6b64\u5c42\u5728\u6846\u67b6\u4e2d\u63d0\u4f9b\u4e00\u4e9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u529f\u80fd\u6a21\u5757\u76f8\u5bf9\u72ec\u7acb\uff0c\u6838\u5fc3\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u64cd\u4f5c\u5c42\uff0c\u6bd4\u5982\uff1a\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7 UI \u5750\u6807\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u952e\u9f20\u64cd\u4f5c\u7684\u57fa\u7840\u65b9\u64cd\u4f5c\u6a21\u5757\u3001Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757\u3001\u6587\u4ef6\u7684\u589e\u5220\u6539\u67e5\u64cd\u4f5c\u6a21\u5757\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2","title":"2\u3001\u81ea\u52a8\u5316\u7684\u5e94\u7528","text":"2.1\u3001CI \u6d41\u7a0b \u6bcf\u65e5\u6784\u5efa\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u7814\u53d1\u6bcf\u65e5\u63d0\u4ea4\u7684\u4ee3\u7801\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u73ed\u4e4b\u540e\u4f1a\u5c06\u5404\u5e94\u7528\u8fdb\u884c\u6253\u5305\uff0c\u7136\u540e\u5728\u6d4b\u8bd5\u673a\u4e0a\u5b89\u88c5\u66f4\u65b0 deb \u5305\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u5e94\u7528\u63d0\u4ea4\u96c6\u6210\u7684\u7248\u672c\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u8f7d\u6700\u65b0\u7684 ISO \u8fdb\u884c PXE \u90e8\u7f72\uff0c\u7136\u540e\u6d4b\u8bd5\u673a\u5b89\u88c5\u6700\u65b0\u7684\u955c\u50cf\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 2.2\u3001\u9a8c\u6536\u6d4b\u8bd5 \u5728\u5404\u9a8c\u6536\u8282\u70b9\u8fdb\u884c\u81ea\u52a8\u5316\u9a8c\u6536\uff0c\u76ee\u524d\u7684\u7b56\u7565\u662f\u5168\u7528\u4f8b\u8986\u76d6\u5168\u67b6\u6784\u3002 2.3\u3001\u56de\u5f52\u6d4b\u8bd5 \u56de\u5f52\u6d4b\u8bd5\u4eca\u5e74\u89c4\u5212\u5efa\u8bbe\u4e2d\uff0c\u65e8\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u6267\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\uff0c\u51cf\u5c11\u529f\u80fd\u6d4b\u8bd5\u7684\u91cd\u590d\u52b3\u52a8\u529b\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3","title":"3\u3001\u5b58\u5728\u7684\u95ee\u9898","text":" \u5404\u5e94\u7528\u4e4b\u95f4\u5b58\u5728\u8026\u5408 \u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u521d\u671f\uff0c\u6240\u6709\u5e94\u7528\u662f\u6574\u4f53\u53d1\u5e03\uff0c\u6211\u4eec\u662f\u5c06\u6240\u6709\u5e94\u7528\u770b\u6210\u662f\u4e00\u4e2a\u6574\u4f53\uff0c\u5404\u5e94\u7528\u4f5c\u4e3a\u5176\u4e2d\u7684\u4e00\u4e2a\u6a21\u5757\uff0c\u6240\u4ee5\u5b58\u5728\u5e94\u7528\u95f4\u65b9\u6cd5\u4ea4\u53c9\u8c03\u7528\u7684\u95ee\u9898\uff0c\u8fd9\u6837\u4ece\u6700\u521d\u7684\u8bbe\u8ba1\u6765\u8bb2\u786e\u5b9e\u80fd\u591f\u51cf\u5c11\u91cd\u590d\u4ee3\u7801\u7684\u7f16\u5199\u3002\u4f46\u662f\u73b0\u5728\u5e94\u7528\u8d70\u72ec\u7acb\u53d1\u5e03\uff0c\u5404\u5e94\u7528\u90fd\u6709\u81ea\u5df1\u7684\u8fed\u4ee3\u8282\u594f\uff0c\u5728\u65b0\u9700\u6c42\u5feb\u901f\u53d8\u5316\u7684\u8fc7\u7a0b\u4e2d\uff0c\u81ea\u52a8\u5316\u7ef4\u62a4\u53d8\u5f97\u5f02\u5e38\u56f0\u96be\uff0c\u539f\u56e0\u5c31\u662f\u81ea\u52a8\u5316\u9879\u76ee\u91cc\u9762\u5404\u4e2a\u5e94\u7528\u7684\u6709\u6bd4\u8f83\u591a\u7684\u8026\u5408\u5173\u7cfb\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u8fdb\u884c\u89e3\u8026\uff0c\u4ee5\u9002\u5e94\u5e94\u7528\u4e0d\u540c\u7684\u8fed\u4ee3\u5468\u671f\u3002 \u65e0\u6cd5\u7cbe\u51c6\u7684\u5212\u5206\u7528\u4f8b\u8303\u56f4 \u7528\u4f8b\u6267\u884c\u7684\u8303\u56f4\u4e0d\u591f\u7cbe\u51c6\uff0c\u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u4e3b\u8981\u901a\u8fc7\u7528\u4f8b\u7684\u5173\u952e\u8bcd core\uff08\u6838\u5fc3\uff09\u6765\u533a\u5206\u7528\u4f8b\u662f\u5426\u4e3a\u6838\u5fc3\u7528\u4f8b\uff0c\u4f46\u662f\u8fd9\u6837\u7684\u533a\u5206\u592a\u5bbd\u6cdb\u4e86\uff0c\u4e0d\u80fd\u9002\u5e94\u81ea\u52a8\u5316\u6d4b\u8bd5\u5728\u591a\u573a\u666f\u4e0b\u7684\u5e94\u7528\u3002\u5f88\u591a\u573a\u666f\u4e0b\u6211\u4eec\u8fd8\u9700\u8981\u6839\u636e\u7528\u4f8b\u7684\u7b49\u7ea7\u3001\u7528\u4f8b\u7684\u7c7b\u578b\u3001\u7528\u4f8b\u6765\u6e90\u7b49\u7b49\uff0c\u4e0d\u540c\u7684\u7ef4\u5ea6\u6765\u6311\u9009\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u5173\u952e\u5b57\u9700\u8981\u4eba\u5de5\u4e00\u6761\u6761\u7684\u6539\uff0c\u8d39\u65f6\u8d39\u529b\uff0c\u800c\u4e14\u4e0d\u597d\u7ef4\u62a4\u3002 \u53d7\u65b0\u9700\u6c42\u5f71\u54cd\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u597d\u7ef4\u62a4 \u76ee\u524d\u9700\u8981\u8df3\u8fc7\u7684\u7528\u4f8b\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684\u7528\u4f8b\u811a\u672c\u91cc\u9762\uff0c\u6dfb\u52a0\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\uff0c\u540e\u7eed\u89e3\u9664\u8df3\u8fc7\u7684\u65f6\u5019\u53c8\u9700\u8981\u627e\u5230\u8fd9\u6761\u811a\u672c\uff0c\u5220\u6389\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\u3002\u5728\u8df3\u8fc7\u7528\u4f8b\u8f83\u591a\u7684\u60c5\u51b5\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u96be\u5ea6\u3002 \u7f16\u5199\u7528\u4f8b\u65f6\u903b\u8f91\u6bd4\u8f83\u590d\u6742\uff0c\u9700\u8981\u8c03\u7528\u591a\u4e2a\u5e94\u7528\u7684\u65b9\u6cd5\u6a21\u5757\u3002 \u6846\u67b6\u6269\u5c55\u6027\u4e0d\u8db3\uff0c\u65e0\u6cd5\u6574\u5408\u6027\u80fd\u81ea\u52a8\u5316\u3001\u538b\u6d4b\u81ea\u52a8\u5316\u3001\u5b89\u5168\u81ea\u52a8\u5316\u7b49\u4e13\u9879\u6d4b\u8bd5\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_3","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u4e3a\u89e3\u51b3\u73b0\u6709\u95ee\u9898\uff0c\u9002\u5e94\u4e0d\u65ad\u4e30\u5bcc\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u66f4\u597d\u7684\u53d1\u6325\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4f5c\u7528\uff0c\u9700\u8981\u5bf9\u81ea\u52a8\u5316\u67b6\u6784\u53ca\u5404\u529f\u80fd\u6a21\u5757\u8fdb\u884c\u91cd\u65b0\u8bbe\u8ba1\u89c4\u5212\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_1","title":"1\u3001\u67b6\u6784\u8bbe\u8ba1","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_1","title":"2\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u6846\u67b6\u7684\u8fd0\u884c\u903b\u8f91\uff1a\u901a\u8fc7\u6838\u5fc3\u5c42\u63d0\u4f9b\u4e00\u4e2a\u57fa\u7840\u80fd\u529b\uff0c\u4e1a\u52a1\u5c42\u6839\u636e\u5b9e\u9645\u4e1a\u52a1\u9700\u6c42\uff08\u6d4b\u8bd5\u7528\u4f8b\uff09\u52a8\u6001\u52a0\u8f7d\u6838\u5fc3\u5c42\uff0c\u6267\u884c\u5165\u53e3\u52a0\u8f7d\u76f8\u5e94\u7684\u7528\u4f8b\u96c6\u5e76\u63a7\u5236\u6267\u884c\uff0c\u5e94\u7528\u5c42\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u9700\u6c42\uff0c\u901a\u8fc7\u76f8\u5e94\u7684\u914d\u7f6e\u9879\u8fdb\u884c\u914d\u7f6e\uff0c\u4ece\u800c\u89e6\u53d1\u81ea\u52a8\u5316\u6d4b\u8bd5\u4efb\u52a1\u3002 \u6838\u5fc3\u5c42\uff1a\u57fa\u672c\u4fdd\u6301\u4e0d\u53d8\uff0c\u90e8\u5206\u6a21\u5757\u4f1a\u6d89\u53ca\u5230\u65b0\u529f\u80fd\u5f00\u53d1\uff0c\u6838\u5fc3\u5c42\u5404\u529f\u80fd\u6a21\u5757\u4fdd\u6301\u72ec\u7acb\u6027\uff0c\u63d0\u4f9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u4f9b\u4e0a\u5c42\u8c03\u7528\uff1b \u5e95\u5c42\u6838\u5fc3\u6a21\u5757\u5305\u62ec\uff1a \u56fe\u50cf\u8bc6\u522b\u6a21\u5757 UI \u5b9a\u4f4d\u6a21\u5757 Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757 \u5c5e\u6027\u5b9a\u4f4d\u6a21\u5757 \u65e5\u5fd7\u6a21\u5757 \u952e\u9f20\u64cd\u4f5c\u6a21\u5757 \u6587\u4ef6\u64cd\u4f5c\u6a21\u5757 \u5f55\u5c4f\u6a21\u5757 \u81ea\u5b9a\u4e49\u65ad\u8a00\u6a21\u5757 \u7528\u4f8b\u6267\u884c\u6a21\u5757 PXE \u88c5\u673a\u6a21\u5757 \u952e\u9f20\u4fe1\u53f7\u6a21\u62df\u6a21\u5757 OCR \u6a21\u5757 \u4e1a\u52a1\u5c42\uff1a\u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e94\u7528\u5185\u5305\u542b\u591a\u4e2a\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5982\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7b49\uff0c\u540e\u7eed\u53ef\u4ee5\u6839\u636e\u9700\u8981\u5ac1\u63a5\u8fdb\u6765\u3002\u5176\u4e2d\u529f\u80fd\u6d4b\u8bd5\u8bbe\u8ba1\u601d\u8def\uff1a \u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e76\u5c06\u6d4b\u8bd5\u6570\u636e\u548c\u6d4b\u8bd5\u8d44\u6e90\u6574\u5408\u8fdb\u6765\uff0c\u589e\u52a0\u7528\u4f8b\u6807\u7b7e csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ed9\u6bcf\u6761\u7528\u4f8b\u6253\u6807\u7b7e\u3002 \u5404\u6807\u7b7e\u6240\u4f7f\u7528\u5bf9\u5e94\u7684\u5b57\u6bb5\u540d\u79f0\uff0c\u4f7f\u7528 csv \u6587\u4ef6\u7ef4\u62a4\u7528\u4f8b\u4e0e\u6807\u7b7e\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u5bf9\u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u53ef\u4ee5\u7ec4\u5408\u5176\u4e2d\u7684\u6807\u7b7e\u800c\u4ece\u9a71\u52a8\u5bf9\u5e94\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\uff0c\u517c\u5bb9\u73b0\u6709\u7528\u4f8b\u6807\u7b7e\uff0c\u4e14\u652f\u6301\u7528\u4f8b\u6807\u7b7e\u53ef\u6269\u5c55\uff1b \u4f7f\u7528 csv \u683c\u5f0f\u6587\u4ef6\u53ef\u4ee5\u65b9\u4fbf\u7684\u4f7f\u7528 Excel \u8868\u683c\u6253\u5f00\u8fdb\u884c\u7f16\u8f91\uff0c\u540c\u65f6\u7531\u4e8e csv \u6587\u4ef6\u5b9e\u9645\u662f\u4ee5\u90fd\u597d\u5206\u9694\u7684\u6587\u672c\u6587\u4ef6\uff0c\u4ee3\u7801\u4e2d\u53ef\u4ee5\u5728\u4e0d\u4f9d\u8d56\u4e09\u65b9\u5e93\u7684\u60c5\u51b5\u4e0b\u65b9\u4fbf\u5feb\u901f\u7684\u89e3\u6790\u5b83\uff0c\u53ef\u64cd\u4f5c\u6027\u548c\u53ef\u7ef4\u62a4\u6027\u8f83\u9ad8\u3002 \u5404\u4e2a\u5e94\u7528\u4e4b\u95f4\uff0c\u7528\u4f8b\u3001\u65b9\u6cd5\u3001\u6807\u7b7e\u548c\u8d44\u6e90\u90fd\u662f\u76f8\u4e92\u72ec\u7acb\u7684\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u7528\u4f8b\u65f6\u53ea\u9700\u8981\u81ea\u5df1\u5e94\u7528\u4e0b\u7684\u65b9\u6cd5\u548c\u516c\u5171\u5e93\u5373\u53ef\u3002 \u7ed3\u6784\u4e3e\u4f8b\uff1a .\n\u251c\u2500\u2500 apps\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_album # \u5e94\u7528\u540d (\u7528\u4e0b\u5212\u7ebf\u8fde\u63a5\u662f Python \u7f16\u7801\u89c4\u8303)\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_assert # \u65ad\u8a00\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_function_tag.csv # \u7528\u4f8b\u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 asan_cases # \u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases # \u529f\u80fd\u6d4b\u8bd5\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 res # \u6d4b\u8bd5\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config # \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_widget # \u5e94\u7528\u81ea\u5df1\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_widget # \u65b9\u6cd5\u57fa\u7c7b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 other_widget # \u8c03\u7528\u5176\u4ed6\u5e94\u7528\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_camera\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases\n\u2502\u00a0\u00a0 \u2502\u00a0 ...\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 public_widget # \u516c\u5171\u65b9\u6cd5\u5e93\n\u251c\u2500\u2500 config # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n...\n config \u914d\u7f6e\u6a21\u5757\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u76f8\u5e94\u914d\u7f6e\uff0c\u6d4b\u8bd5\u540c\u5b66\u53ef\u4ee5\u6839\u636e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5728 config \u91cc\u9762\u8fdb\u884c\u914d\u7f6e\u3002 \u5168\u5c40\u914d\u7f6e\uff1a \u6267\u884c\u4e00\u4e2a\u6216\u591a\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff1a\u5728 pattern \u91cc\u9762\u5199\u5165\u5e94\u7528\u5305\u540d\uff0c\u591a\u4e2a\u5e94\u7528\u4e4b\u95f4\u7528 or \u8fde\u63a5\uff0c\u5982 deepin-music or deepin-movie\uff1b \u5192\u70df\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a smoke\uff1b \u96c6\u6210\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a core \uff1b \u5168\u91cf\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u4e3a\u7a7a\u5373\u53ef\uff1b \u901a\u8fc7 tags \u7684\u914d\u7f6e\u6bd4\u8f83\u7075\u6d3b\uff0c\u540e\u9762\u6807\u7b7e\u5316\u7ba1\u7406\u7ae0\u8282\u4f1a\u8bb2\u5230\uff0c\u652f\u6301\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u7075\u6d3b\u914d\u7f6e\u3002 \u6307\u5b9a\u67d0\u53f0\u673a\u5668\u5728\u6307\u5b9a\u955c\u50cf\u7248\u672c\u4e0a\u6267\u884c\u7528\u4f8b\uff1a\u5728 IP \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a IP\uff0c\u5e76\u5728 URL \u91cc\u9762\u586b\u5165\u955c\u50cf\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u6846\u67b6\u4f1a\u8c03\u7528 PXE \u8fdb\u884c\u81ea\u52a8\u88c5\u673a\uff0c\u88c5\u673a\u5b8c\u4e4b\u540e\u81ea\u52a8\u5f00\u59cb\u6267\u884c\u914d\u7f6e\u7684\u6d4b\u8bd5\u7528\u4f8b\u3002 \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\uff1a \u6bcf\u4e2a\u5e94\u7528\u5185\u90e8\u4f1a\u6709\u4e00\u4e2a\u5355\u72ec\u7684\u914d\u7f6e\u6a21\u5757\uff0c\u4f1a\u5305\u542b\u4e00\u4e9b\u672c\u5e94\u7528\u7684\u6d4b\u8bd5\u8d44\u6e90\u7684\u8def\u5f84\u3001\u6267\u884c\u7528\u4f8b\u7684\u6807\u7b7e\u914d\u7f6e\u7b49\u7b49\uff0c\u5982\u679c\u5728\u5c40\u90e8\u914d\u7f6e\u91cc\u9762\u914d\u7f6e\u4e86\u7528\u4f8b\u6267\u884c\u6807\u7b7e\uff0c\u800c\u5916\u5c42 runner \u51fa\u6ca1\u6709\u6307\u5b9a\u6267\u884c\u6807\u7b7e\uff0c\u5219\u5728\u6267\u884c\u65f6\u53ea\u4f1a\u6267\u884c\u5c40\u90e8\u914d\u7f6e\u5df2\u914d\u7f6e\u7684\uff0c\u82e5\u5916\u5c42 runner \u4e5f\u914d\u7f6e\u4e86\u6267\u884c\u6807\u7b7e\uff0c\u5219\u4f1a\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u7528\u4f8b\u3002 \u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u914d\u7f6e\u90fd\u5728\u540c\u4e00\u4e2a\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\uff0cpy \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684\u7c7b\uff0cini \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684 option\u3002 \u5168\u5c40\u914d\u7f6e\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u7b56\u7565\u5982\u4e0b\uff1a \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5c40\u90e8\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5e94\u7528\u5c42\uff1arunner \u662f\u6d4b\u8bd5\u6267\u884c\u7684\u5165\u53e3\uff0c\u5b83\u4f1a\u6839\u636e\u914d\u7f6e\u91cc\u9762\u7684\u914d\u7f6e\u9879\uff0c\u8fdb\u884c\u7528\u4f8b\u7684\u52a0\u8f7d\u548c\u6267\u884c\u3002\u5b83\u63d0\u4f9b\u63a5\u53e3\u7ed9\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\uff0c\u5e73\u53f0\u4e0a\u7684\u6307\u4ee4\u5b9e\u9645\u4e0a\u90fd\u662f\u901a\u8fc7\u4e0b\u53d1\u7ed9 runner\uff0c\u7136\u540e\u7531 runner \u6765\u6267\u884c\u76f8\u5e94\u7684\u6d4b\u8bd5\u3002 \u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u662f\u4e00\u4e2a\u524d\u7aef\u7cfb\u7edf\uff0c\u53ef\u4ee5\u8fdb\u884c\u6d4b\u8bd5\u673a\u7ba1\u7406\u3001\u81ea\u52a8\u5b89\u88c5\u955c\u50cf\u3001\u81ea\u52a8\u5b89\u88c5\u6307\u5b9a\u5e94\u7528\u7248\u672c\u3001\u8fdb\u884c\u6d4b\u8bd5\u7528\u4f8b\u8303\u56f4\u9009\u62e9\u3001\u7528\u4f8b\u89e6\u53d1\u6267\u884c\u63a7\u5236\u3001\u7ed3\u679c\u5c55\u793a\u8f93\u51fa\u7b49\u3002 \u4e00\u4e2a\u5e94\u7528\u7684\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\u90fd\u53ef\u4ee5\u5355\u72ec\u89e6\u53d1\u3002 \u517c\u5bb9\u6027\u6d4b\u8bd5\u4e3b\u8981\u901a\u8fc7 PXE \u670d\u52a1\u5668\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u88c5\u673a\uff0c\u7136\u540e\u914d\u5408 AT \u8fdb\u884c\u6d4b\u8bd5\uff0c\u53ef\u4ee5\u5b9e\u73b0\u4e0d\u540c\u7cfb\u7edf\u7248\u672c\u3001\u4e0d\u540c\u5e94\u7528\u7248\u672c\u73af\u5883\u4e0a\u90fd\u53ef\u4ee5\u8fdb\u884c\u81ea\u52a8\u5316\u7684 AT \u6267\u884c\uff0c\u63d0\u9ad8\u517c\u5bb9\u6027\u6d4b\u8bd5\u6548\u7387\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_4","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_2","title":"1\u3001\u7528\u4f8b\u89e3\u8026","text":"\u5b58\u5728\u8026\u5408\u5173\u7cfb\u7684\u65b9\u6cd5\uff1a\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u88ab\u5916\u90e8\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\uff0c\u5219\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u8026\u5408\u5173\u7cfb\u3002 1.1\u3001\u901a\u8fc7\u7f16\u8f91\u5668 Find Usages \u67e5\u770b\u6bcf\u4e2a\u65b9\u6cd5\u88ab\u8c03\u7528\u7684\u8def\u5f84\u548c\u88ab\u8c03\u7528\u6b21\u6570\uff1b 1.2\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 1 \u4e2a\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728\u5916\u90e8\u5e94\u7528\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1b 1.3\u3001\u64cd\u4f5c\u5c42\u6587\u4ef6\u540d\u5747\u4ee5 widget \u7ed3\u5c3e\uff0c\u7c7b\u540d\u4ee5 Widget \u7ed3\u5c3e\uff0c\u5982\uff1a\u6587\u4ef6\u540d music_widget.py \uff1a class MusicWidget:\n\"\"\"\u97f3\u4e50\u7684\u64cd\u4f5c\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_2","title":"2\u3001\u516c\u5171\u5e93\u5efa\u8bbe","text":"2.1\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 2 \u4e2a\u53ca\u4ee5\u4e0a\u7684\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728 public_widget \u76ee\u5f55\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1bpublic_widget \u5373\u4e3a\u516c\u5171\u65b9\u6cd5\u5e93\uff1b 2.2\u3001\u5728\u7528\u4f8b\u5c42\u4fee\u6539\u7528\u4f8b\u4e2d\u7c7b\u7684\u5bfc\u5165\u8def\u5f84\uff0c\u5c5e\u4e8e\u516c\u5171\u65b9\u6cd5\u7684\u5219\u8c03\u7528 public_widget \u4e2d\u7684\u7c7b\uff0c\u5916\u90e8\u5e94\u7528\u7684\u64cd\u4f5c\u65b9\u6cd5\uff0c\u5219\u8c03\u7528\u672c\u5e94\u7528\u76ee\u5f55\u4e0b\u91cd\u5199\u7684\u5916\u90e8\u5e94\u7528\u65b9\u6cd5\u3002 \u6bd4\u5982\uff1a\u51e0\u4e4e\u6240\u6709\u591a\u5a92\u4f53\u5e94\u7528\u90fd\u9700\u8981\u901a\u8fc7\u6587\u7ba1\u52a0\u8f7d\u8d44\u6e90\uff0c\u8c03\u8d77\u7684\u6587\u7ba1\u5bf9\u8bdd\u6846\u5b9e\u9645\u4e3a dde-desktop\uff0c\u56e0\u6b64\u5c06 desktop_widget.py \u653e\u5230 public_widget \u91cc\u9762\uff1a class DdeDesktopPublicWidget:\n\"\"\"\u516c\u5171-\u684c\u9762\u7684\u64cd\u4f5c\u65b9\u6cd5\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3_1","title":"3\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406","text":"3.1\u3001\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1a\u5bf9\u5e94 core\u3001smoke\uff0c\u6216\u4e3a\u7a7a\uff1b \u7528\u4f8b\u6765\u6e90\uff1a\u5bf9\u5e94 PMS \u7528\u4f8b\u6765\u6e90\uff0c\u5206\u522b\u7528 acp1\u3001acp2\u3001acp3\u3001acp4 \u8868\u793a\u3002 acp1 \uff1a\u4e1a\u52a1\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5199\u7684\u7528\u4f8b\uff0c\u88ab\u7528\u4e8e\u9a8c\u6536\u6d4b\u8bd5\u7684\uff1b acp2 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5f15\u5165\u7684\u4ea7\u54c1\u9a8c\u6536\u6d4b\u8bc4\u90e8\u7684\u7528\u4f8b\uff1b acp3 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u6839\u636e\u4ea7\u54c1\u9700\u6c42\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\uff1b acp4 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u901a\u8fc7\u793e\u533a\u3001\u8bba\u575b\u7528\u6237\u53cd\u9988\u95ee\u9898\u603b\u7ed3\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\u3002 \u4e3e\u4f8b\uff1a \u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u7528\u4f8b\u6765\u6e90 001 L1 core acp1 \u6807\u7b7e\u91c7\u7528\u679a\u4e3e\u7684\u65b9\u5f0f\u8fdb\u884c\u4ee3\u53f7\u7ba1\u7406\u65b9\u4fbf\u7ba1\u7406\u4ee5\u53ca\u540e\u7eed\u6269\u5c55\u3002 3.2\u3001\u5728\u6bcf\u4e2a\u5e94\u7528\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u7b2c\u4e00\u5217\u4e3a\u7528\u4f8b\u7684 ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ba1\u7406\u6a21\u5757\u5185\u7684\u7528\u4f8b\u6807\u7b7e\u3002\u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 3.3\u3001\u5bf9\u7167 PMS \u4e0a\u7528\u4f8b\u7b49\u7ea7\u3001\u7528\u4f8b\u7c7b\u578b\u548c\u7528\u4f8b\u6765\u6e90\uff0c\u6807\u8bb0\u6240\u6709\u5df2\u5b9e\u73b0\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u540e\u7eed\u7f16\u5199\u65b0\u589e\u81ea\u52a8\u5316\u7528\u4f8b\u65f6\uff0c\u6bcf\u5199\u4e00\u6761\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684 csv \u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u6b64\u6761\u7528\u4f8b\u7684\u6807\u7b7e\u3002 3.4\u3001\u8df3\u8fc7\u7528\u4f8b\u6807\u7b7e\u5316 \u73b0\u6709\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a\uff1a \u4e3e\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u8bb0\u4e3a \u201cskip-\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u8bb0\uff0c\u5982\u679c\u5df2\u7ecf\u6807\u8bb0\u4e86\u8df3\u8fc7\u539f\u56e0\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u8bb0\u4e3a SKIPED\uff0c\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\u3002 \u6240\u6709\u7684\u6807\u7b7e\u5728 docs \u76ee\u5f55\u4e0b\u4f1a\u6709\u4e00\u4e2a\u6587\u6863\uff0c\u6587\u6863\u6682\u5b9a\u540d\u79f0\u4e3a\uff1atags_info.md\uff0c\u7528\u4e8e\u8bf4\u660e\u73b0\u5728\u5df2\u7ecf\u4f7f\u7528\u5230\u7684\u6807\u7b7e\uff0c\u4ee5\u53ca\u8fd9\u4e9b\u6807\u7b7e\u7684\u89e3\u91ca\u548c\u7528\u6cd5\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#4","title":"4\u3001\u7528\u4f8b\u6267\u884c","text":"4.1\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u7684\u9a71\u52a8\u6267\u884c\u903b\u8f91\u529f\u80fd\u5b9e\u73b0 \u5f00\u53d1\u6839\u636e\u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\u91cc\u9762\u7684\u7528\u4f8b\u6807\u7b7e\u6267\u884c\u5bf9\u5e94\u7528\u4f8b\u7684\u529f\u80fd\uff0c\u80fd\u652f\u6301\u591a\u4e2a\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u6267\u884c\u5165\u53e3\u80fd\u968f\u610f\u901a\u8fc7\u7528\u4f8b\u6807\u7b7e\u6307\u5b9a\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002 \u7528\u4f8b\u6807\u7b7e\u7684\u9a71\u52a8\u65b9\u5f0f\u5fc5\u987b\u80fd\u652f\u6301\u6807\u7b7e\u7684\u6269\u5c55\uff0c\u672a\u6765\u968f\u7740\u4e1a\u52a1\u7684\u53d8\u5316\u53ef\u80fd\u9700\u8981\u589e\u52a0\u5404\u79cd\u5404\u6837\u7684\u6807\u7b7e\u3002 4.2\u3001\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u6267\u884c \u529f\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u3001\u6027\u80fd\u6d4b\u8bd5\u7b49\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u662f\u5206\u5f00\u6267\u884c\u7684\uff0c\u4e5f\u5c31\u662f\u5728\u4e00\u6b21\u6267\u884c\u4e2d\uff0c\u53ea\u80fd\u6267\u884c\u5176\u4e2d\u4e00\u79cd\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5177\u4f53\u8981\u6267\u884c\u54ea\u4e00\u79cd\u540c\u6837\u901a\u8fc7\u53c2\u6570\u6765\u63a7\u5236\u3002 4.3\u3001\u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c \u7531\u4e8e\u6d4b\u8bd5\u673a\u8d44\u6e90\u6709\u9650\uff0c\u968f\u7740\u81ea\u52a8\u5316\u7528\u4f8b\u6570\u91cf\u7684\u589e\u52a0\uff0cCI \u6267\u884c\u65f6\u95f4\u4f1a\u8d8a\u6765\u8d8a\u957f\u3002 \u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c\u7684\u529f\u80fd\uff1a \u540c\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\u5206\u6563\u5230\u4e0d\u540c\u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u4e0a\u6267\u884c\uff0c\u7f29\u77ed\u6267\u884c\u603b\u65f6\u95f4\uff1b \u7b2c\u4e8c\u5929\u8dd1\u7684\u65f6\u5019\u540c\u4e00\u4e2a\u673a\u5668\u4e0a\u4f1a\u6267\u884c\u6628\u5929\u6ca1\u6709\u6267\u884c\u5230\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u6267\u884c\u540c\u7406\uff1b \u53ef\u4ee5\u5b9e\u73b0\u5728\u5168\u67b6\u6784\u6d4b\u8bd5\u673a\u4e0a\u8f6e\u6d41\u6267\u884c\u7528\u4f8b\uff0c\u65e2\u80fd\u4fdd\u8bc1\u6267\u884c\u4e86\u6240\u6709\u7684\u7528\u4f8b\uff0c\u53c8\u80fd\u5728\u8d44\u6e90\u6709\u9650\u7684\u60c5\u51b5\u4e0b\u8986\u76d6\u4e86\u6240\u6709\u7684\u67b6\u6784\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#5","title":"5\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0","text":"5.1\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u4f5c\u4e3a\u524d\u7aef\u754c\u9762\u7cfb\u7edf\uff0c\u901a\u8fc7\u9875\u9762\u4e0a\u7684\u4e00\u4e9b\u529f\u80fd\u9009\u9879\u8fdb\u884c\u5bf9\u5e94\u6d4b\u8bd5\u4efb\u52a1\u7684\u7ba1\u7406\u6216\u89e6\u53d1\uff0c\u4e1a\u5185\u6bd4\u8f83\u6d41\u884c\u7684\u5b9e\u73b0\u65b9\u6848\u662f\u4f7f\u7528 Vue + DRF \u5b9e\u73b0\u4e00\u4e2a\u524d\u540e\u7aef\u5206\u79bb\u7684\u7cfb\u7edf\u3002 \u6d4b\u8bd5\u5e73\u53f0\u53ef\u80fd\u4f1a\u6d89\u53ca\u5230\u7684\u6a21\u5757\u6709\uff1a\u6d4b\u8bd5\u673a\u8d44\u6e90\u7ba1\u7406\u6a21\u5757\u3001\u7528\u4f8b\u6267\u884c\u63a7\u5236\u6a21\u5757\u3001\u7ed3\u679c\u5c55\u793a\u6a21\u5757\u3001PXE \u955c\u50cf\u5b89\u88c5\u6a21\u5757\u7b49\u3002 \u7528\u6237\uff08\u6d4b\u8bd5\u3001\u7814\u53d1\u540c\u5b66\u7b49\uff09\u53ef\u4ee5\u914d\u7f6e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5982\u6267\u884c\u54ea\u4e2a\u5e94\u7528\u3001\u6267\u884c\u7528\u4f8b\u7684\u8303\u56f4\u3001\u5728\u54ea\u53f0\u673a\u5668\u4e0a\u6267\u884c\u3001\u955c\u50cf\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u5e94\u7528\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u6267\u884c\u65f6\u95f4\u3002 5.2\u3001\u6267\u884c\u5165\u53e3 runner \u63d0\u4f9b\u7ed9\u6d4b\u8bd5\u5e73\u53f0\u7684\u63a5\u53e3\u5305\u62ec\uff1a\u7528\u4f8b\u6267\u884c\u63a5\u53e3\u3001\u7ed3\u679c\u8fd4\u56de\u63a5\u53e3\u3001\u955c\u50cf\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u955c\u50cf\u5b89\u88c5\u63a5\u53e3\u3001\u5e94\u7528\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u5e94\u7528\u5b89\u88c5\u66f4\u65b0\u63a5\u53e3\u7b49\u3002 \u524d\u7aef\u5e73\u53f0\u76ee\u524d\u8fd8\u6ca1\u6709\u592a\u591a\u8be6\u7ec6\u7684\u65b9\u6848\uff0c\u672c\u6b21\u8bbe\u8ba1\u4e3b\u8981\u96c6\u4e2d\u5728\u540e\u7aef\u8fd9\u90e8\u5206\u67b6\u6784\u7684\u8bbe\u8ba1\u4e0a\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_5","title":"\u56db\u3001\u5b9e\u65bd\u8ba1\u5212","text":"\u8fd1\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u6587\u7ba1\u4ee3\u7801\u89e3\u8026 2022/3/28 2022/4/8 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u56fe\u5f62\u56fe\u50cf\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u97f3\u89c6\u9891\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5168\u5c40\u641c\u7d22\u4ee3\u7801\u89e3\u8026 2022/4/25 2022/4/26 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u516c\u5171\u5e93\u5efa\u8bbe 2022/4/27 2022/5/5 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5c01\u88c5\u7684\u65b9\u6cd5\u6574\u7406\u6210\u4e00\u4e2a\u8868 2022/5/6 2022/5/10 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7528\u4f8b\u6807\u7b7e\u5206\u7c7b\u8bc4\u4f30 2022/5/11 2022/5/11 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u6807\u7b7e\u5316\u6267\u884c\u9a71\u52a8\u7a0b\u5e8f\u7f16\u5199 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u9700\u5b9e\u73b0\u81ea\u52a8\u89e3\u6790 csv \u8868\u683c\u4e2d\u7684\u7528\u4f8b\u7f16\u53f7 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u722c\u866b\u811a\u672c\uff0c\u722c\u53d6 pms \u4e0a\u7528\u4f8b\u7684\u6807\u7b7e 2022/5/11 2022/5/13 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u5b9a\u65f6\u81ea\u52a8\u7ef4\u62a4\u672c\u5730 csv \u6587\u4ef6\u811a\u672c 2022/5/11 2022/5/20 \u4e2d\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u76ee\u5f55\u7ed3\u6784\u8c03\u6574 2022/5/20 2022/6/2 \u5b8c\u6210\u5168\u5c40\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u5177\u4f53\u65b9\u6848\u548c\u903b\u8f91\u5b9e\u73b0 2022/6/6 2022/6/17 \u9759\u6001\u626b\u63cf\u95ee\u9898\u6e05\u96f6 2022/6/20 2022/7/1 \u5b8c\u6210\u65b0\u6846\u67b6\u4f7f\u7528\u57f9\u8bad 2022/7/4 2022/7/11 \u843d\u5730\u8fd0\u884c 2022/7/12 2022/7/20 \u5e95\u5c42\u5e93\u7528\u9014\u8bf4\u660e\u6587\u6863\u7f16\u5199 2022/7/21 2022/7/28"}]} \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz index 8ffaebc1..e0b7bbfc 100644 Binary files a/sitemap.xml.gz and b/sitemap.xml.gz differ diff --git "a/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" "b/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" index 25f669d5..97100667 100644 --- "a/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" +++ "b/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs @@ -1215,8 +1215,7 @@ 智能化功能测试# Attribution :chengdu Test Team # Date :2021/08/20 -此方案仍在演进中 -此方案仍在演进中 +此方案仍在演进中 仓库地址:https://gitlabcd.uniontech.com/autotest/cd-desktop-aitest 一、方案概述¶ 基于深度学习智能识别应用的元素控件,用于在自动化测试操作过程中的元素定位以及判断结果时的断言处理;自动化测试过程中,测试机上的画面通过采集盒传输到服务器上,服务器对视频画面进行智能识别后,服务器智能判断用例是否执行成功,然后对测试机下发下一步操作指令,测试机接受并执行下一步操作。 diff --git "a/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" "b/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" index cdf9ccde..06c9e9a5 100644 --- "a/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" +++ "b/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" @@ -95,7 +95,7 @@ - + @@ -226,7 +226,7 @@ - + YouQu Docs diff --git "a/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" "b/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" index 121b4507..72123668 100644 --- "a/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" +++ "b/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs @@ -752,6 +752,13 @@ + + + + + 4、虚拟化部署 + + @@ -1661,6 +1668,13 @@ + + + + + 4、虚拟化部署 + + @@ -2604,18 +2618,12 @@ 1、标签说明流水线使用指导; 跳过原因:skip-XXX,用于控制用例是否执行; 确认修复:fixed-XXX,用于标记用例的修复状态(后面详细讲解用法); @@ -2629,26 +2637,30 @@ 1、标签说明PMS用例ID 用例级别 用例类型 +设备类型 +用例来源 上线对象 测试级别 跳过原因 确认修复 -废弃用例 -... +废弃用例 +... -001 +679537 679537 L1 FUNC +PPL + CICD C1 skip-XXX fixed-XXX -removed-已废弃 -... +removed-已废弃 +... @@ -2656,7 +2668,7 @@ 2、操作步骤csv 的文件名。 例如: -相册的用例文件为 test_album_xxx.py,xxx 表示任意三位数字代表用例序号,此时 csv 文件名就应为 album.csv; +相册的用例文件为 test_album_xxx.py,xxx 表示用例的ID(也可以是自定义的数字代表用例序号),此时 csv 文件名就应为 album.csv; 对于用例规模比较大的应用,比如文件管理器,建议分模块,每个模块建立一个 csv 文件,所有 csv 文件建议放在一个 tags 目录下。 是否分模块维护 csv 取决于应用的用例复杂度,同时我们应该充分考虑后期的可维护性,csv 文件太多了也是一个很糟糕的事情。 @@ -2677,7 +2689,7 @@ 3.1.1、固定跳过001 +679537 ... skip-受到某新需求影响 @@ -2742,7 +2754,7 @@ 3.2、确认修复001 +679537 ... skip-受到某新需求影响 fixed-已修复 @@ -2787,7 +2799,7 @@ 3.3、废弃用例4、设计思路¶ 上面介绍 Pytest 框架提供的标签功能 mark,使用时需要为每一个用例添加标签装饰器,则操作复杂,可维护性差,其根本问题就是标签分散在每一条用例的装饰器上,难以集中维护;于是乎将所有标签使用 csv 文件进行集中管理,并通过 Pytest 的钩子函数,读取 csv 文件,动态添加标签到用中。 5、CSV文件格式¶ -此配置文件需要维护大量的标签数据,且要方便能使用Excel打开进行编辑查看,更重要的是我们不想引入三方依赖,CSV 文件几乎是唯一能满足所有的要求的文件格式。 +此配置文件需要维护大量的标签数据,且要方便能使用 Excel 打开进行编辑查看,更重要的是我们不想引入三方依赖,CSV 文件几乎是唯一能满足所有的要求的文件格式。 七、日志系统¶ 1、背景¶ 基于 YouQu 自动化测试框架操作方法封装写法,通常是这样的:类里面一个函数只包含一个操作或多次调用的一系列可合并的操作; @@ -2888,7 +2900,7 @@ 1、原则 大文件不能上传到工程里面,保持整个工程的轻量化,这样在克隆代码的时候才能非常快速方便使用,我们见过一个 AT 工程 clone 大小达到好几个 G,简直不可思议。 其实代码文件的大小是很小的,也就是说,纯写代码随便写工程也不会太大,而文档(包含插图)等资源却是很占空间。 -因此我们选择将 YouQu 的文档工程单独迁出到独立的仓库 youqu-docs 。 +因此我们选择将 YouQu 的文档工程涉及到的图片资源都采用外链加载; 2、安装¶ 项目根目录下运行 env.sh 即可。 bash env.sh @@ -2930,17 +2942,25 @@ 3.2、裁剪依赖bash env_dev.sh +4、虚拟化部署¶ +YouQu默认采用虚拟化部分,虚拟化环境实际安装的位置是在 $HOME/.local/share/virtualenvs/youqu-oHTM7l7G 目录下 +youqu-oHTM7l7G 此目录名称前面部分是你的代码根目录的名称,后面部分是生成的随机字符串; +同学们在远程机器上定位问题的时候,如果使用 Pycharm 调试,就将解释器指定到这个目录的就行了; +当然,我们也提供了本机开发环境部署: +bash env_dev.sh + +如果你是本地开发环境可以用它,区别就是驱动执行的时候使用:python3 manage.py xxx 九、失败录屏¶ 录屏其实是一种视频形式的日志,因为很多时候我们在查看日志之后仍然无法准确的定位到用例失败的具体原因,因此用例的录屏能让我们看到用例在执行过程; 【使用方法】 在 globalconfig.ini 里面配置关注 2 个参数; -;失败用例重跑次数 -RERUN = 1 - -;失败录屏从第几次开始录制视频。 -;比如 RECORD_FAILED_CASE = 1 ,表示用例第1次执行失败之后开始录屏。 -;注意,用例失败重跑的次数不能小于失败录屏次数,即 RERUN >= RECORD_FAILED_CASE -RECORD_FAILED_CASE = 1 +;失败用例重跑次数 +RERUN = 1 + +;失败录屏从第几次开始录制视频。 +;比如 RECORD_FAILED_CASE = 1 ,表示用例第1次执行失败之后开始录屏。 +;注意,用例失败重跑的次数不能小于失败录屏次数,即 RERUN >= RECORD_FAILED_CASE +RECORD_FAILED_CASE = 1 默认失败重跑的次数是 1 次; RECORD_FAILED_CASE = 1 表示用例第1次执行失败之后开始录屏; @@ -2953,48 +2973,48 @@ 十、Wayland 适配简单讲就是,应用库只需要维护一套用例脚本即可。 【用例兼容】 因为 Wayland 下有些应用的界面显示和功能本身存在一些差异,用例层可能需要对这部分用例做逻辑判断,使用全局配置里面的常量进行逻辑编写即可: -from setting.globalconfig import GlobalConfig - -# GlobalConfig.IS_WAYLAND 获取到当前的显示服务器(bool) -# 应用库 Config 继承 GlobalConfig -if Config.IS_WAYLAND: - pass -if Config.IS_X11: - pass +from setting.globalconfig import GlobalConfig + +# GlobalConfig.IS_WAYLAND 获取到当前的显示服务器(bool) +# 应用库 Config 继承 GlobalConfig +if Config.IS_WAYLAND: + pass +if Config.IS_X11: + pass 比如用例里面如果断言的图片不同: -if Config.IS_WAYLAND: - self.assert_image_exist("wayland_XXX") -else: - self.assert_image_exist("x11_XXX") +if Config.IS_WAYLAND: + self.assert_image_exist("wayland_XXX") +else: + self.assert_image_exist("x11_XXX") 这样这条用例脚本在 Wayland 和 X11 下都可以跑,so easy 是不是?完全没必要专门拉新分支进行 Wayland 适配。 十一、测试报告¶ 1. 目录结构¶ 执行时会在根目录下动态生成 report 目录,所有的报告相关的文件会统一存放在里面,示例: -/report - ├── allure # allure报告 - │ ├── ... - │ └── ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json - ├── allure_html # 生成的html报告 - │ ├── ... - │ └── index.html - ├── allure_back # allure报告备份 - │ └── 20221108114823 - │ ├── ... - │ └── f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json - ├── json # json报告 - │ ├── ... - │ └── result_deepin-music_20221109134736_1081333.json - ├── logs # 日志文件 - │ ├── 2022-11-10_debug.log - │ └── 2022-11-10_error.log - ├── record # 录屏 - │ └── 2022-11-09 - │ ├── ... - │ └── 15时14分09秒_test_music_303_2_autotest.mp4 - └── xml # xml报告 - └── autotest_deepin_music-20221109134736.xml +/report + ├── allure # allure报告 + │ ├── ... + │ └── ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json + ├── allure_html # 生成的html报告 + │ ├── ... + │ └── index.html + ├── allure_back # allure报告备份 + │ └── 20221108114823 + │ ├── ... + │ └── f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json + ├── json # json报告 + │ ├── ... + │ └── result_deepin-music_20221109134736_1081333.json + ├── logs # 日志文件 + │ ├── 2022-11-10_debug.log + │ └── 2022-11-10_error.log + ├── record # 录屏 + │ └── 2022-11-09 + │ ├── ... + │ └── 15时14分09秒_test_music_303_2_autotest.mp4 + └── xml # xml报告 + └── autotest_deepin_music-20221109134736.xml 默认情况下同时生成 html、xml、json三种形式的报告。 2. 定制报告¶ @@ -3011,14 +3031,14 @@ 3. 查看报告allure open report/allure_html +allure open report/allure_html 使用 manage.py 执行完之后,在终端的最后一行,我们会给你输出打开报告的命令,直接复制它在终端执行就可以查看了,像这样: - 终端执行命令: allure open /tmp/youqu/report/allure_html 查看报告 + 终端执行命令: allure open /tmp/youqu/report/allure_html 查看报告 你也可以直接在 Pycharm 里面找到 index.html 文件,然后右键选择浏览器打开,或者你可以用一个 http 服务打开。 你也可以直接在 report/allure 目录下查看报告: - allure serve report/allure + allure serve report/allure 远程执行 @@ -3031,48 +3051,48 @@ 1. 提前解决代码问题这里推荐一个 Python 社区流行的代码格式化工具: Black,号称不妥协的代码格式化工具,它检测到不符合规范的代码风格直接就帮你全部格式化好,就是这么刚! 安装: -sudo pip3 install black +sudo pip3 install black 使用方法: -black ${CheckPath} +black ${CheckPath} 使用这个工具格式化之后,代码会被自动调整,刚开始你可能会觉得调整得很夸张,没关系坚持看,习惯之后,你会觉得很优雅,没错,这就是 Pythonic Code 的核心,请保持优雅~。 2. 代码扫描工具¶ 使用根目录下 pylint.sh 扫描代码,在 report 目录下查看代码扫描报告,如果有代码问题请提前解决之后再提交。 此脚本已经使用 Python 社区最流行的代码扫描工具 Pylint 进行代码扫描。 使用方法: -bash pylint.sh +bash pylint.sh 运行之后会提示你要扫描的目录,比如输入 apps ,则会扫描 apps 下的所有 Python 代码。 在 setting/pylintrc.cfg 配置文件里面进行相关配置,扫描完成之后在 report/pylints 目录下会生成扫描报告。 代码提交需通过 git review 提交到 gerrit ,人工 Code Review 通过之后合入代码。 十三、提交代码¶ 1. 安装依赖¶ -sudo apt install git-review +sudo apt install git-review 2. 提交模板¶ 在 ~ 目录下新建文件,并命名为 gitcommit_template 将以下内容写入文件当中: -# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 -fix: - -# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 -Description: - -# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 -Log: - -# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 -#Bug: - -# 修复 github issue -#Issue: - -# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 -#Task: +# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 +fix: + +# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 +Description: + +# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 +Log: + +# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 +#Bug: + +# 修复 github issue +#Issue: + +# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 +#Task: 命令行执行: -git config --global commit.template ~/gitcommit_template +git config --global commit.template ~/gitcommit_template 此命令将模板加入到 git 的提交模板中。 后续提交的时候需要关注一下几点: @@ -3083,19 +3103,19 @@ 2. 提交模板3. 推送代码¶ 首先添加 commit 信息 -git add 后面加文件名称 +git add 后面加文件名称 -git add . # 表示添加所有文件 +git add . # 表示添加所有文件 使用这条命令注意有些临时文件不要提交到仓库了。 -git commit -a +git commit -a 之后在 fix: 后面(注意冒号后面必须加空格,不然直接-1)写本地提交的 commit 信息,然后就可以提交代码了 -git review branch(当前分支) -r origin +git review branch(当前分支) -r origin 最好一次 commit,一次 git review ,经常有同学在本地疯狂 commit 最后 git review 报错不知道咋回事儿。 若不想每次提交都加上 -r 选项,执行以下命令: -git config --global gitreview.remote origin +git config --global gitreview.remote origin 提交代码,直接使用 git review branch<目标分支>,例如 git review master 4. Git标签¶ @@ -3106,74 +3126,74 @@ 4. Git标签git tag -a <tagname> +git tag -a <tagname> 回车之后,Git 会打开你的编辑器,让你写一句标签注解,就像你给提交写注解一样。 查看所有标签 -git tag -l -# git tag 也行 +git tag -l +# git tag 也行 删除标签 -git tag -d <tagname> +git tag -d <tagname> 推送标签至远程 git push 命令并不会传送标签到远程仓库服务器上,必须显式地推送标签。 -git push origin <tagname> +git push origin <tagname> 推送所有不在远程仓库服务器上的标签 -git push origin --tag +git push origin --tag 删除远程标签 -git push origin :refs/tag/<tagname> +git push origin :refs/tag/<tagname> 后期打标签 先用 git log --pretty=oneline 查询提交记录,获取校验码。 -git tag -a <tagname> 9fceb02(校验码) +git tag -a <tagname> 9fceb02(校验码) 检出标签 -git checkout <tagname> +git checkout <tagname> 此时,仓库会处于“分离头指针(detached HEAD)”的状态。 在“分离头指针”状态下,如果你做了某些更改然后提交它们,标签不会发生变化, 但你的新提交将不属于任何分支,并且将无法访问,除非通过确切的提交哈希才能访问。 因此,如果你需要进行更改,比如你要修复旧版本中的错误,那么通常需要创建一个新分支: -git checkout -b <NewBranchName> <tagname> +git checkout -b <NewBranchName> <tagname> 新分支上可以进行提交代码。 十四、常见问题¶ 1. 提交代码时提示邮箱或者名称不对¶ 重新配置邮箱或者名称,然后重置生效: -git commit --amend --reset-author +git commit --amend --reset-author 2. 怎么回滚到之前的版本¶ (1)查询历史提交记录 -git log +git log 找到你要回滚的版本,复制 hash 值。 注意:是 commit 空格之后的 hash 值,之前有同学复制的 Change-Id: 这样肯定报错。 (2)回滚版本,不清除代码 -git reset --soft ${hash} +git reset --soft ${hash} (3)回滚版本,清除代码,慎用哈 -git reset --hard ${hash} +git reset --hard ${hash} 3. 测试报告里面 F S . E 是什么意思¶ F 表示失败,. (点)表示通过,S 表示跳过,E 表示 error 有报错 4. 解决 git status 中文显示的问题¶ -git config --global core.quotePath false +git config --global core.quotePath false 5. apps 目录下颜色有些是黄色的¶ 在 Pycharm 中 apps 目录下应用库文件是黄色的,编辑器识别不到代码新增和修改; @@ -3184,22 +3204,22 @@ 5. apps 目录下颜色有些是黄色的6. 执行 env.sh 报错 $'\r':未找到命令¶ 出现这个问题你应该是在 windows 上打开或编辑过 env.sh 脚本,windows下的换行是回车符+换行符,也就是\r\n,而 Linxu 下是换行符 \n,Linux 下不识别 \r,因此报错。 解决方案: -# 将 \r 替换为空 -sudo sed -i 's/\r//' env.sh +# 将 \r 替换为空 +sudo sed -i 's/\r//' env.sh 7.怎样为单独某一条用例配置执行超时时间¶ 在用例脚本中添加装饰器,如下: -@pytest.mark.timeout(300) # 单位秒 -def test_xxx_001(): - pass +@pytest.mark.timeout(300) # 单位秒 +def test_xxx_001(): + pass 8. 如何拉取 YouQu 自动化项目所有代码,包含子仓库¶ 前置条件:已申请访问 YouQu 权限群组 -# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) -git config --global credential.helper store - -# 拉取YouQu框架代码,并递归拉取子仓库代码 -git clone "http://gerrit.uniontech.com/youqu" --recursive +# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) +git config --global credential.helper store + +# 拉取YouQu框架代码,并递归拉取子仓库代码 +git clone "http://gerrit.uniontech.com/youqu" --recursive 9. 如何拉取 YouQu 自动化项目中指定子仓库的代码¶ 前置条件: @@ -3207,22 +3227,22 @@ 9. 如何拉取 YouQu 自动化项目中指定子仓库的代 已申请访问 YouQu 权限群组 已存储访问密码 -# 拉取YouQu框架代码 -git clone "http://gerrit.uniontech.com/youqu" - -# 指定拉取子仓库代码 -cd youqu -git submodule update --init apps/autotest_xxx_xxx +# 拉取YouQu框架代码 +git clone "http://gerrit.uniontech.com/youqu" + +# 指定拉取子仓库代码 +cd youqu +git submodule update --init apps/autotest_xxx_xxx 10. 如何更新 YouQu 自动化项目中,所有子仓库的代码¶ 更新所有子仓库代码 -cd youqu -git pull & git submodule foreach git pull +cd youqu +git pull & git submodule foreach git pull 11. 如何修复 YouQu 所有子仓库 master 分支游离头(detached head)¶ 修复所有子仓库默认master 分支游离头 -cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
PMS_USER = PMS账号 +PMS_PASSWORD = PMS密码 +SEND_PMS = finish +TASK_ID = 测试单ID +TRIGGER = auto +APP_NAME =
(3)手动回填
所有用例执行完之后不做回填的接口请求,后续手动将结果进行回填请求。
用例执行时配置:
PMS_USER = PMS账号 -PMS_PASSWORD = PMS密码 -SEND_PMS = finish -TASK_ID = 测试单ID -TRIGGER = hand -APP_NAME = +PMS_USER = PMS账号 +PMS_PASSWORD = PMS密码 +SEND_PMS = finish +TASK_ID = 测试单ID +TRIGGER = hand +APP_NAME = 后续手动回填方法: -youqu manage.py pms --send2task yes +youqu manage.py pms --send2task yes 可能遇到的问题¶ 由同学可能会发现,怎么回填一次之后,后面想再次回填就不生效了; @@ -1292,62 +1383,62 @@ 可能遇到的问题2.4. 导出 CSV 文件¶ 框架提供导出指定标签用例的功能: -youqu manage.py exportcsv -a deepin-album -t CICD +youqu manage.py exportcsv -a deepin-album -t CICD 表示导出 deepin-album 的用例中标记了 CICD 标签的用例,导出 CSV 文件的字段格式已经适配了 CICD 的要求。 2.5. 脚手架新建 APP 工程¶ 新建一个 APP 工程: -youqu manage.py startapp autotest_deepin_some +youqu manage.py startapp autotest_deepin_some 这样在 apps 目录下会创建一个子项目工程 autotest_deepin_some,同时新建好工程模板目录和模板文件: -apps -└── autotest_deepin_some - ├── case - │ ├── assert_res - │ │ └── readme - │ ├── base_case.py - │ └── __init__.py - ├── config.ini - ├── config.py - ├── conftest.py - ├── control - ├── deepin_some_assert.py - ├── deepin_some.csv - ├── __init__.py - └── widget - ├── base_widget.py - ├── case_res - │ └── readme - ├── deepin_some_widget.py - ├── __init__.py - ├── other.ini - ├── other_widget.py - ├── pic_res - │ └── readme - └── ui.ini +apps +└── autotest_deepin_some + ├── case + │ ├── assert_res + │ │ └── readme + │ ├── base_case.py + │ └── __init__.py + ├── config.ini + ├── config.py + ├── conftest.py + ├── control + ├── deepin_some_assert.py + ├── deepin_some.csv + ├── __init__.py + └── widget + ├── base_widget.py + ├── case_res + │ └── readme + ├── deepin_some_widget.py + ├── __init__.py + ├── other.ini + ├── other_widget.py + ├── pic_res + │ └── readme + └── ui.ini autotest_deepin_some 是你的工程名称,比如:autotest_deepin_music ; 在此基础上,你可以快速的开始你的 AT 项目。 2.6. 用例标签自动同步¶ 用于自动同步 PMS 用例标签数据至本地 CSV 文件,主要通过以下几个配置来控制: -APP_NAME = # 指定要同步的应用名称 -PMS_USER = # PMS的用户名 -PMS_PASSWORD = # PMS的密码 +APP_NAME = # 指定要同步的应用名称 +PMS_USER = # PMS的用户名 +PMS_PASSWORD = # PMS的密码 在 [csv_link_pms_id] 节点下指定 csv 文件名与 PMS 用例模块的对应关系,比如: -[csv_link_pms_id] -;同步PMS数据到本地CSV文件,必须要配置的配置项 -;key是本地CSV文件的文件名称; -;value是对应PMS上的模块ID; -;比如要同步音乐的数据, 首先需要将配置 APP_NAME = deepin-music, -;CSV文件名称为music.csv,其在PMS上的用例为: https://pms.uniontech.com/testcase-browse-53.html -;因此应该配置为: music = 53 -;这样才能将PMS与本地CSV文件建立联系。 -;如果你的应用分了很多模块,只需要将对应的信息依次配置好就行了。 -music = 53 +[csv_link_pms_id] +;同步PMS数据到本地CSV文件,必须要配置的配置项 +;key是本地CSV文件的文件名称; +;value是对应PMS上的模块ID; +;比如要同步音乐的数据, 首先需要将配置 APP_NAME = deepin-music, +;CSV文件名称为music.csv,其在PMS上的用例为: https://pms.uniontech.com/testcase-browse-53.html +;因此应该配置为: music = 53 +;这样才能将PMS与本地CSV文件建立联系。 +;如果你的应用分了很多模块,只需要将对应的信息依次配置好就行了。 +music = 53 将以上信息配置好之后,在命令行执行: -youqu manage.py pms --pms2csv yes +youqu manage.py pms --pms2csv yes 每次执行时原 csv 文件会自动备份在 report/csv_back 目录下,因此你不用担心脚本执行导致你的数据丢失。 diff --git a/search/search_index.json b/search/search_index.json index 91ebe84c..c7cfc7a2 100644 --- a/search/search_index.json +++ b/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\u200b\\u3000\\-\u3001\u3002\uff0c\uff0e\uff1f\uff01\uff1b]+","pipeline":["stemmer"]},"docs":[{"location":"","title":"\u9996\u9875","text":""},{"location":"#youqu","title":"\u6709\u8da3\uff08YouQu\uff09","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/4/1\n# Author : Mikigo\n# =============================================\n \u672c\u7ad9\u603b\u8bbf\u95ee\u91cf \u6b21 \u6b22\u8fce\u5728\u6d4f\u89c8\u5668\u8bbf\u95ee\u3010\u516c\u7f51\u6587\u6863\u3011 \u7edf\u4fe1\u516c\u53f8\u5185\u7f51\u8fd8\u53ef\u4ee5\u8bbf\u95ee\u3010\u5185\u7f51\u6587\u6863\u3011\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u54e6~~"},{"location":"#_1","title":"\u4e00\u3001\u7b80\u4ecb","text":"\u6709\u8da3\uff08YouQu\uff09\u662f\u6df1\u5ea6\u79d1\u6280\u8bbe\u8ba1\u548c\u5f00\u53d1\u7684\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff0c\u91c7\u7528\u7ed3\u6784\u5206\u5c42\u7684\u8bbe\u8ba1\u7406\u5ff5\uff0c\u652f\u6301\u591a\u5143\u5316\u5143\u7d20\u5b9a\u4f4d\u548c\u65ad\u8a00\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\u3001\u5f3a\u5927\u7684\u65e5\u5fd7\u548c\u62a5\u544a\u8f93\u51fa\u7b49\u7279\u8272\u529f\u80fd\uff0c\u540c\u65f6\u5b8c\u7f8e\u517c\u5bb9X11\u3001Wayland\u663e\u793a\u534f\u8bae\uff0c\u73af\u5883\u90e8\u7f72\u7b80\u5355\uff0c\u64cd\u4f5c\u6613\u4e0a\u624b\u3002"},{"location":"#17","title":"\u7231\u4e0a \u201c\u6709\u8da3\u201d \u7684 17 \u4e2a\u7406\u7531","text":" \u6838\u5fc3\u5e93\u63d0\u4f9b\u4e86\u7edf\u4e00\u7684\u63a5\u53e3\uff0c\u7f16\u5199\u65b9\u6cd5\u65f6\u53ea\u9700\u8981\u5bfc\u5165\u4e00\u4e2a\u5305\u5c31\u53ef\u4ee5\u4f7f\u7528\u5230\u6838\u5fc3\u5e93\u63d0\u4f9b\u7684\u6240\u6709\u529f\u80fd\uff1b \u516c\u5171\u5e93\u5c01\u88c5\u4e86\u5f88\u591a\u5e38\u7528\u6a21\u5757\u7684\u76f8\u5173\u65b9\u6cd5\uff0c\u6bd4\u5982\uff1a\u4efb\u52a1\u680f\u7684\u64cd\u4f5c\u3001\u684c\u9762\u7684\u64cd\u4f5c\u3001\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\u7b49\u7b49\uff1b \u9664\u4e86\u5e38\u7528\u7684\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u8bc6\u522b\u4ee5\u5916\uff0c\u6211\u4eec\u8fd8\u63d0\u4f9b\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u5176\u4f7f\u7528\u7b80\u5355\u4e14\u9ad8\u6548\uff0c\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff1b \u5bf9\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u5c06\u7f16\u5199\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u53d8\u5f97\u7b80\u5355\u800c\u4f18\u96c5\uff1b \u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u6280\u672f\u8fdb\u884c\u529f\u80fd\u5347\u7ea7\uff0c\u9664\u4e86\u652f\u6301\u5355\u4e2a\u5750\u6807\u8fd4\u56de\uff0c\u8fd8\u652f\u6301\u540c\u4e00\u754c\u9762\u4e0b\u591a\u4e2a\u76f8\u540c\u5143\u7d20\u8fd4\u56de\u591a\u4e2a\u5750\u6807\u7684\u529f\u80fd\uff1b \u63d0\u4f9b\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u548c\u6279\u91cf\u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u4e0d\u5230\u4e00\u4e2a csv \u6587\u4ef6\u539f\u6765\u80fd\u5e72\u8fd9\u4e48\u591a\u4e8b\u60c5\uff1b \u63d0\u4f9b\u4e86\u529f\u80fd\u5f3a\u5927\u7684\u6267\u884c\u5668\u5165\u53e3\uff0c\u8ba9\u4f60\u53ef\u4ee5\u65b9\u4fbf\u7684\u5728\u672c\u5730\u6267\u884c\u4efb\u4f55\u7528\u4f8b\u96c6\u7684\u7528\u4f8b\uff0c\u5176\u4e30\u5bcc\u7684\u81ea\u5b9a\u4e49\u914d\u7f6e\u9879\uff0c\u6ee1\u8db3\u4f60\u5bf9\u6267\u884c\u5668\u6240\u6709\u7684\u5e7b\u60f3\uff1b \u63d0\u4f9b\u8fdc\u7a0b\u6267\u884c\u7684\u529f\u80fd\uff0c\u53ef\u4ee5\u63a7\u5236\u591a\u53f0\u673a\u5668\u5e76\u884c\u8dd1\uff0c\u6216\u8005\u5206\u5e03\u5f0f\u8dd1\uff0c\u8fd9\u79cd\u4ed8\u8d39\u529f\u80fd\u73b0\u5728\u514d\u8d39\u7ed9\u4f60\u7528\uff1b \u63d0\u4f9b\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u529f\u80fd\uff0c\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u6bcf\u4e2a\u65b9\u6cd5\u5355\u72ec\u5199\u8f93\u51fa\u65e5\u5fd7\u7684\u4ee3\u7801\uff0c\u4e00\u5207\u6211\u4eec\u7ed9\u4f60\u641e\u5b9a\u4e86\uff0c\u65e5\u5fd7\u8f93\u51fa\u4e0d\u4ec5\u5185\u5bb9\u4e30\u5bcc\uff0c\u989c\u503c\u4e5f\u7edd\u5bf9\u5728\u7ebf\uff0c\u6211\u4eec\u8fd8\u81ea\u5df1\u8bbe\u8ba1\u4e86\u4e00\u6b3e\u7ec8\u7aef\u8f93\u51fa\u4e3b\u9898\u53eb\u300a\u4e94\u5f69\u6591\u6593\u7684\u9ed1\u300b\uff1b \u63d0\u4f9b\u4e86\u4e00\u952e\u90e8\u7f72\u81ea\u52a8\u5316\u6d4b\u8bd5\u73af\u5883\u7684\u529f\u80fd\uff0c\u8fde\u4ee3\u7801\u7f16\u8f91\u5668\u90fd\u7ed9\u4f60\u88c5\u597d\u4e86\uff0c\u8ba9\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u73af\u5883\u90e8\u7f72\u800c\u70e6\u607c\uff1b \u63d0\u4f9b\u4e86\u81ea\u52a8\u751f\u6210\u591a\u79cd\u62a5\u544a\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u8f93\u51fa\u4ec0\u4e48\u62a5\u544a\u5f62\u5f0f\u90fd\u884c\uff0c\u800c\u4e14\u6211\u4eec\u5728\u62a5\u544a\u4e2d\u8fd8\u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\u548c\u5931\u8d25\u622a\u56fe\u7684\u529f\u80fd\uff1b \u5bf9\u65ad\u8a00\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u63d0\u4f9b\u66f4\u53cb\u597d\u5316\u7684\u9519\u8bef\u63d0\u793a\uff0c\u8ba9\u5b9a\u4f4d\u95ee\u9898\u7cbe\u51c6\u9ad8\u6548\uff1b \u4e0d\u4ec5\u652f\u6301\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u63a7\u5236\uff0c\u800c\u4e14\u8fd8\u652f\u6301\u52a8\u6001\u63a7\u5236\u7528\u4f8b\u6279\u91cf\u6267\u884c\u7684\u603b\u65f6\u95f4\uff0c\u786e\u4fdd CI \u73af\u5883\u4e0b\u80fd\u987a\u7545\u8fd0\u884c\uff1b \u652f\u6301\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\u6267\u884c\u3001PMS \u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6807\u7b7e\u5316\u6267\u884c\u65b9\u6848\uff0c\u6ee1\u8db3\u4f60\u5404\u79cd\u573a\u666f\u4e0b\u7684\u6267\u884c\u9700\u6c42\uff1b \u652f\u6301\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u529f\u80fd\uff0c\u53ef\u5b9a\u4f4d\u53ef\u65ad\u8a00\uff0c\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\uff1b \u5b8c\u7f8e\u517c\u5bb9 Wayland \u548c X11\uff0c\u771f\u6b63\u505a\u5230\u4e00\u5957\u4ee3\u7801\uff0c\u968f\u5904\u6267\u884c\uff1b \u652f\u6301\u591a\u79cd\u65b9\u5f0f\u7684\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u5176\u4e2d\u5f02\u6b65\u56de\u586b\u7684\u65b9\u6848\uff0c\u5b8c\u7f8e\u89e3\u51b3\u4e86\u6570\u636e\u56de\u586b\u7684\u8017\u65f6\u95ee\u9898\uff1b \u3010\u89c6\u9891\u4ecb\u7ecd\u3011"},{"location":"#_2","title":"\u4e8c\u3001\u5b89\u88c5\u4f7f\u7528","text":"\u57fa\u7840\u6846\u67b6\uff1ahttps://github.com/linuxdeepin/deepin-autotest-framework \u4ece PyPI \u5b89\u88c5: sudo pip3 install youqu\n \u521b\u5efa\u9879\u76ee: youqu-startproject youqu\n \u5b89\u88c5\u4f9d\u8d56: cd youqu\nbash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002 \u5e94\u7528\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684\u5e94\u7528\u540d\u79f0\u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music cd apps/\n \u5c06\u5e94\u7528\u5e93\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u50cf\u8fd9\u6837\uff1a youqu\n\u251c\u2500\u2500 apps\n\u2502 \u251c\u2500\u2500 autotest_deepin_music # \u5e94\u7528\u5e93\n...\n \u5e94\u7528\u5e93\u7684\u540d\u79f0\u4e0d\u53ef\u4ee5\u4fee\u6539\u3002"},{"location":"#_3","title":"\u4e09\u3001\u8fd0\u884c","text":""},{"location":"#1","title":"1. \u5de5\u4f5c\u7a7a\u95f4","text":"\u57fa\u7840\u6846\u67b6\u5de5\u7a0b\u76ee\u5f55\u5efa\u8bae\u653e\u5728 ~ \u76ee\u5f55\u4e0b\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u4e5f\u53ef\u4ee5\u8fd0\u884c\uff0c\u4f46\u662f\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u9700\u8981\u505a\u73af\u5883\u6e05\u7406\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u5b58\u5728\u4ee3\u7801\u88ab\u5220\u9664\u7684\u98ce\u9669\u3002 \u5982\u679c\u4f60\u7684\u673a\u5668\u4e0a\u4e0d\u540c\u76ee\u5f55\u4e0b\u5b58\u5728\u591a\u4e2a YouQu \u5de5\u7a0b\uff0c\u90a3\u4e48\u5728\u8fd0\u884c\u4e4b\u524d\uff0c\u8bf7\u5148\u6267\u884c env.sh \u6821\u6b63\u76f8\u5173\u73af\u5883\u3002"},{"location":"#2","title":"2. \u6267\u884c\u5668","text":"\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u6709\u4e00\u4e2a manage.py \uff0c\u5b83\u662f\u4e00\u4e2a\u6267\u884c\u5668\u5165\u53e3\uff0c\u63d0\u4f9b\u4e86\u672c\u5730\u6267\u884c\u3001\u8fdc\u7a0b\u6267\u884c\u7b49\u7684\u529f\u80fd\u3002 \u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6765\u6267\u884c\uff1a youqu manage.py run -a deepin-music\n"},{"location":"#21","title":"2.1. \u672c\u5730\u6267\u884c","text":"youqu manage.py run\n"},{"location":"#211","title":"2.1.1. \u914d\u7f6e\u6587\u4ef6","text":"\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u914d\u7f6e\u53c2\u6570 \u5728\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u91cc\u9762\u652f\u6301\u914d\u7f6e\u5bf9\u6267\u884c\u7684\u4e00\u4e9b\u53c2\u6570\u8fdb\u884c\u914d\u7f6e\uff0c\u5e38\u7528\u7684\u5982\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;1\u3001KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2\u3001KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f, e.g. TAGS = L1 or smoke\n;\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\uff0c\u5c06\u8981\u6267\u884c\u7684\u7528\u4f8b\u5199\u5165\u6307\u5b9a\u7684 csv \u6587\u4ef6\n;\u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u4ece\u57fa\u7840\u6846\u67b6\u6839\u76ee\u5f55\u5f00\u59cb\uff1ae.g. CASE_FILE = case_list.txt\n;\u5982\u679c\u8fd9\u91cc\u6709\u503c\uff0cAPP_NAME KEYWORDS TAGS \u7684\u914d\u7f6e\u5747\u4e0d\u751f\u6548\nCASE_FILE =\n;=============================== RUNNER CONFIG ===================================\n[runner]\n;\u6700\u5927\u5931\u8d25\u7528\u4f8b\u6570\u91cf\u7684\u5360\u6bd4\n;\u6bd4\u5982\uff1a\u603b\u6267\u884c\u7528\u4f8b\u6570\u4e3a100, \u82e5 MAX_FAIL = 0.5,\u5219\u5931\u8d25\u7528\u4f8b\u6570\u8fbe\u523050\u5c31\u4f1a\u7ec8\u6b62\u6d4b\u8bd5\u3002\nMAX_FAIL = 0.5\n;\u5355\u6761\u7528\u4f8b\u7684\u8d85\u65f6\u65f6\u95f4\uff0c\u5982\u679c\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u8d85\u65f6\uff0c\u8fd9\u6761\u7528\u4f8b\u4f1a\u88ab\u505c\u6b62\uff0c\u540e\u7eed\u7528\u4f8b\u7ee7\u7eed\u6267\u884c\u3002\n;\u5355\u4f4d\u4e3a\u79d2\n; \u8fd9\u662f\u4e00\u4e2a\u5168\u5c40\u7edf\u4e00\u914d\u7f6e\uff0c\u5982\u679c\u67d0\u6761\u7528\u4f8b\u9700\u8981\u5355\u72ec\u914d\u7f6e\u8d85\u65f6\u65f6\u95f4\uff0c\u53ef\u4ee5\u5728\u7528\u4f8b\u4e2d\u8fd9\u6837\u5199\uff1a\n;@pytest.mark.timeout(500)\n;def test_xxx_001():\n; ...\n;\u4f1a\u8bdd\uff08\u6240\u6709\u7528\u4f8b\u6267\u884c\u7684\uff09\u8d85\u65f6\u662f\u6839\u636e\u5168\u5c40\u8d85\u65f6\u914d\u7f6e\u548c\u7528\u4f8b\u5355\u72ec\u8d85\u65f6\u914d\u7f6e\u81ea\u52a8\u8ba1\u7b97\u7684\uff1b\nCASE_TIME_OUT = 200\n;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\u3002\n;\u6ce8\u610f\uff0c\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u4e0d\u80fd\u5c0f\u4e8e\u5931\u8d25\u5f55\u5c4f\u6b21\u6570\uff0c\u5373 RERUN >= RECORD_FAILED_CASE\nRECORD_FAILED_CASE = 1\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = INFO\n;yes \u6bcf\u6761\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u8fdb\u884c\u73af\u5883\u6e05\u7406\nCLEAN_ALL = yes\n;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\nRESOLUTION = 1920x1080\n;\u4e0d\u8df3\u8fc7\u7528\u4f8b\uff0ccsv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86 skip-xxx\u7684\u7528\u4f8b\u4e0d\u8df3\u8fc7\nNOSKIP = no\n;ignore fixed\n;no\uff0c\u53ea\u8981\u6807\u8bb0\u4e86fixed\u7684\u7528\u4f8b\uff0c\u5373\u4f7f\u6807\u8bb0\u4e86skip-\uff0c\u4e5f\u4f1a\u6267\u884c\uff1b\n;yes\uff0cfixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\uff1b\nIFIXED = no\n;\u8981\u5b89\u88c5deb\u5305\u7684\u8def\u5f84\n;e.g : ~/Downloads/ \u5b89\u88c5\u4e0b\u8f7d\u76ee\u5f55\u4e0b\u7684deb\u5305\uff0c\u5982\u679c\u662f\u8fdc\u7a0b\u6267\u884c\uff0c\u4f1a\u81ea\u52a8\u62f7\u8d1d\u5230\u8fdc\u7a0b\u5e76\u5b89\u88c5\u3002\nDEB_PATH =\n;DEBUG \u6a21\u5f0f\u6267\u884c\u7528\u4f8b\uff0c\u53ea\u6536\u96c6\u4e0d\u6267\u884c\u7528\u4f8b\uff0c\u4e5f\u4e0d\u505a\u8bbe\u5907\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002\nDEBUG = no\n;\u8bb0\u5f55top\u547d\u4ee4\u67e5\u8be2\u7684\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0cTOP = 3 \u8868\u793a\u8bb0\u5f55\u524d3\u4e2a\u8fdb\u7a0b\u3002\nTOP =\n;\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\nREPEAT =\n;\u9ed8\u8ba4\u5728\u6240\u6709\u6d4b\u8bd5\u5b8c\u6210\u4e4b\u540e\u8f93\u51fa\u62a5\u9519\u4fe1\u606f.\n;yes, \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\nDURING_FAIL = no\n;=============================== REPORT CONFIG ===================================\n[report]\n;\u7528\u4f8b\u6267\u884c\u5b8c\u540e\u751f\u6210\u7684\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n;\u76ee\u524d\u652f\u6301 allure, xml, json \uff08\u652f\u6301\u540c\u65f6\u751f\u6210\uff09\nREPORT_FORMAT = allure, xml, json\n;\u6307\u5b9a\u62a5\u544a\u751f\u6210\u7684\u8def\u5f84\uff08\u76f8\u5bf9\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\uff09\nALLURE_REPORT_PATH = report/\nXML_REPORT_PATH = report/\nJSON_REPORT_PATH = report/\n;=============================== GLOBAL CONFIG ===================================\n[globalconfig]\n;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\nPASSWORD = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\nIMAGE_MATCH_NUMBER = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6bcf\u6b21\u95f4\u9694\u7b49\u5f85\u65f6\u95f4\nIMAGE_MATCH_WAIT_TIME = 1\n;\u56fe\u50cf\u8bc6\u522b\u5339\u914d\u5ea6\nIMAGE_RATE = 0.9\n;\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u5b9e\u65f6\u56fe\u50cf\u4fdd\u5b58\u8def\u5f84\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u5750\u6807\nSCREEN_CACHE = /tmp/screen.png\n;\u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\u7684\u8def\u5f84\nTMPDIR = /tmp/tmpdir\n;\u7cfb\u7edf\u4e3b\u9898\nSYS_THEME = deepin\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = http://youqu-dev.uniontech.com:8890\n;OpenCV\u670d\u52a1\u7aef\u5730\u5740\nOPENCV_SERVER_HOST = http://youqu-dev.uniontech.com:8889\n;=============================== PMS CONFIG ===================================\n;PMS\u76f8\u5173\u914d\u7f6e\uff0c\u5305\u542b\u4ee5\u4e0b\u51e0\u4e2a\u65b9\u9762\uff1a\n;1.PMS\u6d4b\u8bd5\u5957\u6267\u884c\n;2.\u81ea\u52a8\u4ecePMS\u722c\u53d6\u6570\u636e\u5e76\u540c\u6b65\u672c\u5730CSV\u6587\u4ef6\n;3.PMS\u6570\u636e\u56de\u586b\n[pms]\n;PMS\u7684\u7528\u6237\u540d: ut001234\nPMS_USER =\n;PMS\u7684\u5bc6\u7801\nPMS_PASSWORD =\n;PMS\u6d4b\u8bd5\u5957\u7684ID\n;\u5728PMS\u4e0a\u67e5\u770b\u7528\u4f8b\u201c\u5957\u4ef6\u201d\u94fe\u63a5: https://pms.uniontech.com/testsuite-view-495.html\n;\u6d4b\u8bd5\u5957ID\u4e3a: 495\nSUITE_ID =\n;\u6570\u636e\u56de\u586b\u5fc5\u987b\u5173\u8054PMS\u6d4b\u8bd5\u5355\n;\u5728PMS\u4e0a\u67e5\u770b\u6d4b\u8bd5\u5355\u94fe\u63a5: https://pms.uniontech.com/testtask-cases-20747.html\n;\u6d4b\u8bd5\u5355ID\u4e3a: 20747\nTASK_ID =\n;\u5c06\u6d4b\u8bd5\u7ed3\u679c\u6570\u636e\u56de\u586b\u5230PMS\n;\u4e3a\u7a7a: \u8868\u793a\u4e0d\u56de\u586b,\u4e0d\u4f1a\u5728\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u751f\u6210json\u7ed3\u679c\u6587\u4ef6;\n;async: \u8868\u793a\u9010\u6761\u5f02\u6b65\u56de\u586b,\u540e\u9762\u4e00\u6761\u6267\u884c\u5f00\u59cb\u65f6\u901a\u8fc7\u5b50\u7ebf\u7a0b\u5bf9\u524d\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u8fdb\u884c\u56de\u586b\uff0c\u5982\u6b64\u5b9e\u73b0\u65f6\u95f4\u6548\u7387\u6700\u5927\u5316;\n;finish: \u8868\u793a\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u6210\u4e4b\u540e\u9010\u4e2a\u56de\u586b(PMS\u4e0d\u652f\u6301\u5e76\u53d1);\nSEND_PMS =\n;\u6570\u636e\u56de\u586b\u7684\u89e6\u53d1\u8005\n;auto: \u6846\u67b6\u81ea\u52a8\u56de\u586b,\u914d\u5408SEND_PMS\u914d\u7f6e\u4f7f\u7528,\u4f60\u53ef\u4ee5\u9009\u62e9\u5728\u4e0d\u540c\u7684\u9636\u6bb5\u8fdb\u884c\u6570\u636e\u56de\u586b;\n;hand: \u624b\u52a8\u56de\u586b,\u6bcf\u6761\u7528\u4f8b\u4ecd\u7136\u4f1a\u751f\u6210json\u6587\u4ef6,\u4f46\u6846\u67b6\u4e0d\u4f1a\u8fdb\u884c\u6570\u636e\u56de\u586b,\u9700\u8981\u4f60\u53ef\u4ee5\u5728\u4f60\u60f3\u8981\u53d1\u9001\u7684\u65f6\u95f4\u70b9\u624b\u52a8\u89e6\u53d1\u56de\u586b;\nTRIGGER = auto\n;PMS\u56de\u586b\u7684\u91cd\u8bd5\u6b21\u6570\n;\u5982\u679c\u63a5\u53e3\u8bf7\u6c42\u5931\u8d25,\u4f1a\u8fdb\u884c\u91cd\u8bd5\nSEND_PMS_RETRY_NUMBER = 2\n[csv_link_pms_lib]\n;caselib: \u7528\u4f8b\u5e93\n;testcase: \u4ea7\u54c1\u5e93\u7528\u4f8b\nCASE_FROM = caselib\n[csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/caselib-browse-81.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 81\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic =\n[export_csv]\n;\u5bfc\u51fa\u7684csv\u6587\u4ef6\u540d\u79f0\uff0c\u9ed8\u8ba4 case_list.csv\nCSV_FILE = case_list.csv\n;exportcsv \u547d\u4ee4\u5bfc\u51fa case_list.csv \u6587\u4ef6\u65f6\u914d\u7f6e\u7684\u5b57\u6bb5\u540d\uff0c\u7528\u4f8b\u540d\u79f0\u9ed8\u8ba4\u5b58\u5728\u7b2c\u4e00\u5217\uff0c\u65e0\u9700\u6dfb\u52a0\nCSV_HEARD = \u7528\u4f8b\u7ea7\u522b,\u7528\u4f8b\u7c7b\u578b,\u6d4b\u8bd5\u7ea7\u522b,\u662f\u5426\u8df3\u8fc7\n \u914d\u7f6e\u5b8c\u6210\u4e4b\u540e\uff0c\u76f4\u63a5\u5728\u547d\u4ee4\u884c\u6267\u884c manage.py \u5c31\u597d\u4e86\u3002 youqu manage.py run\n"},{"location":"#212","title":"2.1.2. \u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a youqu manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--max_fail MAX_FAIL \u6700\u5927\u5931\u8d25\u7387\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--resolution RESOLUTION\n\u68c0\u67e5\u5206\u8fa8\u7387\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms {,async,finish}\n\u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--trigger {,auto,hand}\n\u89e6\u53d1\u8005\n-f CASE_FILE, --case_file CASE_FILE\n\u6839\u636e\u6587\u4ef6\u6267\u884c\u7528\u4f8b\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n--pms_user PMS_USER pms \u7528\u6237\u540d\n--pms_password PMS_PASSWORD\npms \u5bc6\u7801\n--suite_id SUITE_ID pms \u6d4b\u8bd5\u5957ID\n--pms_info_file PMS_INFO_FILE\npms \u4fe1\u606f\u6587\u4ef6\n--top TOP \u8fc7\u7a0b\u4e2d\u8bb0\u5f55top\u547d\u4ee4\u4e2d\u7684\u503c\n--lastfailed \u4ec5\u6267\u884c\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\n--duringfail \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\n--repeat REPEAT \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n--project_name PROJECT_NAME\n\u5de5\u7a0b\u540d\u79f0\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--build_location BUILD_LOCATION\n\u6784\u5efa\u5730\u533a\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--line LINE \u6267\u884c\u7684\u4e1a\u52a1\u7ebf\uff08\u5199\u5165json\u6587\u4ef6\uff09\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a youqu manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\"\n \u547d\u4ee4\u884c\u53c2\u6570\u4f18\u5148\u7ea7\u662f\u9ad8\u4e8e\u914d\u7f6e\u6587\u4ef6\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u4e86\u5bf9\u5e94\u7684\u53c2\u6570\uff0c\u914d\u7f6e\u6587\u4ef6\u4e2d\u4e0d\u7ba1\u662f\u5426\u914d\u7f6e\u5747\u4e0d\u751f\u6548\u3002 --app \u5165\u53c2\u8fd8\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\uff0c\u4e0b\u9762\u7684\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u540c\u6837\u652f\u6301\u3002"},{"location":"#22","title":"2.2. \u8fdc\u7a0b\u6267\u884c","text":"youqu manage.py remote\n \u8fdc\u7a0b\u6267\u884c\u540c\u6837\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u8fdb\u884c\u7528\u4f8b\u76f8\u5173\u914d\u7f6e\uff1b \u9700\u8981\u91cd\u70b9\u8bf4\u4e00\u4e0b\u8fdc\u7a0b\u6267\u884c\u65f6\u7684\u6d4b\u8bd5\u673a\u4fe1\u606f\u914d\u7f6e\uff0c\u5728\u914d\u7f6e\u6587\u4ef6 setting/remote.ini \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\u3001IP\u3001\u5bc6\u7801\u3002 ;=============================== CLIENT LIST =====================================\n; \u6d4b\u8bd5\u673a\u914d\u7f6e\u5217\u8868\n;[client{number}] ;\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u6709\u591a\u5c11\u53f0\u6d4b\u8bd5\u673a\u5c31\u5199\u591a\u5c11\u4e2a client\uff0c\u522b\u540d\u5fc5\u987b\u5305\u542b client \u5b57\u7b26\uff0c\u4e14\u4e0d\u80fd\u91cd\u590d\u3002\n;user = ;\u6d4b\u8bd5\u673a user\n;ip = ;\u6d4b\u8bd5\u673a ip\n;password = 1 ;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801, \u53ef\u4ee5\u4e0d\u914d\u7f6e\u6b64\u9879\uff0c\u9ed8\u8ba4\u53d6 CLIENT_PASSWORD \u7684\u503c\uff1b\n;\u5982\u679c\u4f60\u6240\u6709\u6d4b\u8bd5\u673a\u5bc6\u7801\u90fd\u76f8\u540c\uff0c\u90a3\u4e48\u53ea\u9700\u8981\u914d\u7f6e CLIENT_PASSWORD \u5c31\u53ef\u4ee5\u4e86\n;=================================================================================\n[client1]\nuser = uos\nip = 10.8.15.xx\n[client2]\nuser = uos\nip = 10.8.15.xx\n[client3]\nuser = uos\nip = 10.8.11.xx\n \u6709\u591a\u5c11\u53f0\u673a\u5668\u5c31\u50cf\u8fd9\u6837\u6328\u7740\u5199\u5c31\u884c\u4e86\u3002 \u7136\u540e\u5728\u547d\u4ee4\u884c\uff1a youqu manage.py remote\n \u8fd9\u6837\u8fd0\u884c\u662f\u4ece\u914d\u7f6e\u6587\u4ef6\u53bb\u8bfb\u53d6\u76f8\u5173\u914d\u7f6e\u3002 \u5982\u679c\u4f60\u4e0d\u60f3\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\uff0c\u4f60\u4ecd\u7136\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u8fdb\u884c\u4f20\u53c2\uff0c \u4ee5\u4e0b\u4e3a python3 manage.py remote \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-c CLIENTS, --clients CLIENTS\n\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679cpassword\u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6\nsetting/remote.ini \u4e2d CLIENT_PASSWORD\n\u7684\u503c,\u6bd4\u5982\uff1auos@10.8.13.33:1 \u6216 uos@10.8.13.33\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-s {yes,no,}, --send_code {yes,no,}\n\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a\uff08\u4e0d\u542breport\u76ee\u5f55\uff09\n-e, --build_env \u642d\u5efa\u6d4b\u8bd5\u73af\u5883,\u5982\u679c\u4e3ayes\uff0c\u4e0d\u7ba1send_code\u662f\u5426\u4e3ayes\u90fd\u4f1a\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a.\n-p CLIENT_PASSWORD, --client_password CLIENT_PASSWORD\n\u6d4b\u8bd5\u673a\u5bc6\u7801\uff08\u5168\u5c40\uff09\n-y PARALLEL, --parallel PARALLEL\nyes:\u8868\u793a\u6240\u6709\u6d4b\u8bd5\u673a\u5e76\u884c\u8dd1\uff0c\u6267\u884c\u76f8\u540c\u7684\u6d4b\u8bd5\u7528\u4f8b\uff0cno\n:\u8868\u793a\u6d4b\u8bd5\u673a\u5206\u5e03\u5f0f\u6267\u884c\uff0c\u670d\u52a1\u7aef\u4f1a\u6839\u636e\u6536\u96c6\u5230\u7684\u6d4b\u8bd5\u7528\u4f8b\u81ea\u52a8\u5206\u914d\u7ed9\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u3002\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms SEND_PMS \u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n \u5728\u547d\u4ee4\u884c\u8fd9\u6837\u8fd0\u884c\uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\"\n \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report \u76ee\u5f55\u4e0b\u56de\u6536\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u7684\u6d4b\u8bd5\u62a5\u544a\u3002 \u914d\u7f6e\u6587\u4ef6\u5176\u4ed6\u76f8\u5173\u914d\u7f6e\u9879\u8be6\u7ec6\u8bf4\u660e\uff0c\u8bf7\u67e5\u770b\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u6ce8\u91ca\u5185\u5bb9\u3002"},{"location":"#23-pms","title":"2.3. PMS \u6570\u636e\u56de\u586b","text":"\u6d4b\u8bd5\u5355\u5173\u8054\u7684\u7528\u4f8b\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u5bf9\u5e94\u7684\u53bb\u8dd1\u8fd9\u4e9b\u5173\u8054\u7684\u7528\u4f8b\uff0c\u5e76\u4e14\u5c06\u6267\u884c\u7684\u7ed3\u679c\u56de\u586b\u7684\u6d4b\u8bd5\u7528\u4f8b\u7684\u72b6\u6001\u91cc\u9762\u3002 PMS \u6570\u636e\u56de\u586b\u4e3b\u8981\u6709\u4e09\u79cd\u65b9\u5f0f\uff1a \uff081\uff09\u5f02\u6b65\u56de\u586b \u5728\u7528\u4f8b\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\uff0c\u91c7\u7528\u5f02\u6b65\u7684\u65b9\u5f0f\u53bb\u8fdb\u884c\u6570\u636e\u56de\u586b\uff0c\u76f4\u767d\u7684\u8bb2\u5c31\u662f\uff0c\u7b2c\u4e8c\u6761\u7528\u4f8b\u5f00\u59cb\u8dd1\u7684\u65f6\u5019\uff0c\u901a\u8fc7\u5b50\u7ebf\u7a0b\u53bb\u505a\u7b2c\u4e00\u6761\u7528\u4f8b\u7684\u6570\u636e\u56de\u586b\uff0c\u5982\u6b64\u5faa\u73af\uff0c\u76f4\u5230\u6240\u6709\u7528\u4f8b\u6267\u884c\u7ed3\u675f\uff1b \u8fd9\u79cd\u65b9\u6848\u7684\u65f6\u95f4\u6548\u7387\u6700\u9ad8\u7684\uff0c\u56e0\u4e3a\u7406\u8bba\u4e0a\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u662f\u5927\u4e8e\u6570\u636e\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\u65f6\u95f4\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u5f53\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u6570\u636e\u56de\u586b\u4e5f\u5b8c\u6210\u4e86\u3002 \u4f7f\u7528\u65b9\u6cd5\uff0c\u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u4ee5\u4e0b\u53c2\u6570\uff1a\uff08\u4ee5\u4e0b\u6d89\u53ca\u5230\u7684\u53c2\u6570\u914d\u7f6e\u90fd\u662f\u5728\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u914d\u7f6e\uff09 PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = async\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \u8fd9\u4e2a\u53c2\u6570\u53ef\u586b\u53ef\u4e0d\u586b\uff0c\u4f46\u662f\u586b\u4e86\u53ef\u4ee5\u63d0\u9ad8\u7528\u4f8b\u7684\u6267\u884c\u901f\u5ea6\uff0c\u56e0\u4e3a\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u53ef\u4ee5\u6307\u5b9a\u5230\u5177\u4f53\u7684\u5e94\u7528\u5e93\u3002\uff08\u4e0b\u540c\uff09\n \uff082\uff09\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u56de\u586b \u7b49\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u518d\u9010\u4e2a\u8fdb\u884c\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u6b64\u65b9\u6848\u65f6\u95f4\u6548\u7387\u6bd4\u8f83\u4f4e\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \uff083\uff09\u624b\u52a8\u56de\u586b \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4e0d\u505a\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u540e\u7eed\u624b\u52a8\u5c06\u7ed3\u679c\u8fdb\u884c\u56de\u586b\u8bf7\u6c42\u3002 \u7528\u4f8b\u6267\u884c\u65f6\u914d\u7f6e\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = hand\nAPP_NAME = \u540e\u7eed\u624b\u52a8\u56de\u586b\u65b9\u6cd5\uff1a youqu manage.py pms --send2task yes\n"},{"location":"#_4","title":"\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898","text":"\u7531\u540c\u5b66\u53ef\u80fd\u4f1a\u53d1\u73b0\uff0c\u600e\u4e48\u56de\u586b\u4e00\u6b21\u4e4b\u540e\uff0c\u540e\u9762\u60f3\u518d\u6b21\u56de\u586b\u5c31\u4e0d\u751f\u6548\u4e86\uff1b \u8fd9\u662f\u56e0\u4e3a\u4e3a\u4e86\u5e94\u5bf9\u524d\u9762\u63d0\u5230\u7684\u591a\u79cd\u6570\u636e\u56de\u586b\u7684\u65b9\u5f0f\uff0c\u5728 report \u76ee\u5f55\u4e0b\u4f1a\u7531 pms_xxx \u5f00\u5934\u7684\u76ee\u5f55\uff0c\u8bb0\u5f55\u4e86\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u548c\u56de\u586b\u60c5\u51b5\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u4e4b\u524d\u5df2\u7ecf\u56de\u586b\u8fc7\u4e86\uff0c\u540e\u7eed\u5c31\u4e0d\u4f1a\u518d\u6b64\u89e6\u53d1\u56de\u586b\u4e86\uff1b \u5982\u679c\u4f60\u60f3\u91cd\u65b0\u505a\u56de\u586b\uff0c\u4f60\u53ef\u4ee5\u628a report/pms_xxx \u76ee\u5f55\u5220\u6389\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u91cd\u65b0\u505a\u6570\u636e\u56de\u586b\u4e86\uff1b"},{"location":"#24-csv","title":"2.4. \u5bfc\u51fa CSV \u6587\u4ef6","text":"\u6846\u67b6\u63d0\u4f9b\u5bfc\u51fa\u6307\u5b9a\u6807\u7b7e\u7528\u4f8b\u7684\u529f\u80fd\uff1a youqu manage.py exportcsv -a deepin-album -t CICD\n \u8868\u793a\u5bfc\u51fa deepin-album \u7684\u7528\u4f8b\u4e2d\u6807\u8bb0\u4e86 CICD \u6807\u7b7e\u7684\u7528\u4f8b\uff0c\u5bfc\u51fa CSV \u6587\u4ef6\u7684\u5b57\u6bb5\u683c\u5f0f\u5df2\u7ecf\u9002\u914d\u4e86 CICD \u7684\u8981\u6c42\u3002"},{"location":"#25-app","title":"2.5. \u811a\u624b\u67b6\u65b0\u5efa APP \u5de5\u7a0b","text":"\u65b0\u5efa\u4e00\u4e2a APP \u5de5\u7a0b\uff1a youqu manage.py startapp autotest_deepin_some \u8fd9\u6837\u5728 apps \u76ee\u5f55\u4e0b\u4f1a\u521b\u5efa\u4e00\u4e2a\u5b50\u9879\u76ee\u5de5\u7a0b autotest_deepin_some\uff0c\u540c\u65f6\u65b0\u5efa\u597d\u5de5\u7a0b\u6a21\u677f\u76ee\u5f55\u548c\u6a21\u677f\u6587\u4ef6\uff1a apps\n\u2514\u2500\u2500 autotest_deepin_some\n \u00a0\u00a0 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_case.py\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 config.ini\n \u00a0\u00a0 \u251c\u2500\u2500 config.py\n \u00a0\u00a0 \u251c\u2500\u2500 conftest.py\n \u00a0\u00a0 \u251c\u2500\u2500 control\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_assert.py\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some.csv\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u2514\u2500\u2500 widget\n \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 case_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 other.ini\n \u00a0\u00a0 \u251c\u2500\u2500 other_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 pic_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2514\u2500\u2500 ui.ini\n autotest_deepin_some \u662f\u4f60\u7684\u5de5\u7a0b\u540d\u79f0\uff0c\u6bd4\u5982\uff1aautotest_deepin_music \uff1b \u5728\u6b64\u57fa\u7840\u4e0a\uff0c\u4f60\u53ef\u4ee5\u5feb\u901f\u7684\u5f00\u59cb\u4f60\u7684 AT \u9879\u76ee\u3002"},{"location":"#26","title":"2.6. \u7528\u4f8b\u6807\u7b7e\u81ea\u52a8\u540c\u6b65","text":"\u7528\u4e8e\u81ea\u52a8\u540c\u6b65 PMS \u7528\u4f8b\u6807\u7b7e\u6570\u636e\u81f3\u672c\u5730 CSV \u6587\u4ef6\uff0c\u4e3b\u8981\u901a\u8fc7\u4ee5\u4e0b\u51e0\u4e2a\u914d\u7f6e\u6765\u63a7\u5236\uff1a APP_NAME = # \u6307\u5b9a\u8981\u540c\u6b65\u7684\u5e94\u7528\u540d\u79f0\nPMS_USER = # PMS\u7684\u7528\u6237\u540d\nPMS_PASSWORD = # PMS\u7684\u5bc6\u7801\n \u5728 [csv_link_pms_id] \u8282\u70b9\u4e0b\u6307\u5b9a csv \u6587\u4ef6\u540d\u4e0e PMS \u7528\u4f8b\u6a21\u5757\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u6bd4\u5982\uff1a [csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/testcase-browse-53.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 53\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic = 53\n \u5c06\u4ee5\u4e0a\u4fe1\u606f\u914d\u7f6e\u597d\u4e4b\u540e\uff0c\u5728\u547d\u4ee4\u884c\u6267\u884c\uff1a youqu manage.py pms --pms2csv yes\n \u6bcf\u6b21\u6267\u884c\u65f6\u539f csv \u6587\u4ef6\u4f1a\u81ea\u52a8\u5907\u4efd\u5728 report/csv_back \u76ee\u5f55\u4e0b\uff0c\u56e0\u6b64\u4f60\u4e0d\u7528\u62c5\u5fc3\u811a\u672c\u6267\u884c\u5bfc\u81f4\u4f60\u7684\u6570\u636e\u4e22\u5931\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u57fa\u7840\u6846\u67b6\u8bbe\u8ba1\u65b9\u6848","text":"# ====================================\n# Author : Mikigo\n# Time : 2022/3/18\n# version \uff1a1.0\n# ====================================\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"\u505a\u4e00\u4e2a\u7b80\u5355\u3001\u597d\u7528\u3001\u529f\u80fd\u5f3a\u5927\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u3002 \u4f5c\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4e00\u4e2a\u57fa\u7840\u6846\u67b6\uff0c\u4efb\u4f55\u5e94\u7528\u90fd\u80fd\u5f88\u65b9\u4fbf\u7684\u63a5\u5165\u8fdb\u6765\uff1b \u63d0\u4f9b\u6240\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u9700\u8981\u7684\u5e95\u5c42\u529f\u80fd\uff0c\u5e76\u5bf9\u5916\u63d0\u4f9b\u552f\u4e00\u7684\u63a5\u53e3\uff0c\u65b9\u4fbf\u5e94\u7528\u5e93\u4f7f\u7528\uff1b \u6574\u5408\u516c\u5171\u5e93\uff0c\u51cf\u5c11\u5e94\u7528\u5e93\u4ee3\u7801\u91cf\u548c\u65b9\u6cd5\u7ef4\u62a4\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u8bbe\u8ba1\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u7edf\u4e00\u6982\u5ff5","text":" \u57fa\u7840\u6846\u67b6 \u672c\u9879\u76ee\u662f\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\uff08AutoTest Basic Frame\uff09\uff0c\u5168\u79f0\u4e3a\u201c\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff08AT \u57fa\u7840\u6846\u67b6\uff09\u201d\u3002 AT \u57fa\u7840\u6846\u67b6\u662f\u505a\u4e3a\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\u6765\u8bbe\u8ba1\u7684\uff0c\u5b83\u63d0\u4f9b\u4e86\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u57fa\u7840\u529f\u80fd\uff0c\u4efb\u4f55\u5e94\u7528\u63a5\u5165\u8fdb\u6765\u90fd\u80fd\u5feb\u901f\u65b9\u4fbf\u7684\u8fdb\u884c\u65b9\u6cd5\u548c\u7528\u4f8b\u7f16\u5199\uff0c\u540c\u65f6\u5728\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u3001\u6807\u7b7e\u5316\u6267\u884c\u3001\u5206\u5e03\u5f0f\u6267\u884c\u3001\u591a\u79cd\u62a5\u544a\u8f93\u51fa\u3001\u4f18\u7f8e\u7684\u6267\u884c\u65e5\u5fd7\u3001\u5931\u8d25\u81ea\u52a8\u5f55\u5c4f\u548c\u622a\u56fe\u3001\u81ea\u52a8\u73af\u5883\u6e05\u7406\u7b49\u7b49\uff0c\u5b83\u90fd\u63d0\u4f9b\u4e86\u5b8c\u5584\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u66f4\u91cd\u8981\u7684\u662f\u8fd9\u4e00\u5207\u4f7f\u7528\u8d77\u6765\u90fd\u975e\u5e38\u7b80\u5355\u3002 \u57fa\u7840\u6846\u67b6\u4e2d\u5305\u542b\u5e94\u7528\u5e93\uff08apps\uff09\u3001\u6838\u5fc3\u5e93\uff08src\uff09\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09\u3002 \u5e94\u7528\u5e93\uff08apps\uff09 \u5404\u4e2a\u5e94\u7528\u81ea\u5df1\u7684\u4ed3\u5e93\uff0c\u91cc\u9762\u4e3b\u8981\u5305\u542b\u7684\u662f\u7528\u4f8b\u3001\u65b9\u6cd5\u53ca\u4e00\u4e9b\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u53eb autotest-dde-file-manager \u3002 \u6838\u5fc3\u5e93\uff08src\uff09 \u6838\u5fc3\u5e93\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u5230\u6240\u6709\u5e95\u5c42\u6838\u5fc3\u529f\u80fd\uff0c\u8fd9\u662f\u6700\u91cd\u8981\u7684\u4e00\u4e2a\u90e8\u5206\uff0c\u7075\u9b42\u3002\u5177\u4f53\u529f\u80fd\u6a21\u5757\u53ca\u8bf4\u660e\u4f1a\u5728\u4e0b\u9762\u7b2c\u56db\u4e2a\u7ae0\u8282\u8be6\u7ec6\u63cf\u8ff0\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09 \u591a\u4e2a\u5e94\u7528\u90fd\u8981\u7528\u5230\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\uff0c\u6309\u7167\u5e94\u7528\u5212\u5206\u5b58\u653e\uff0c\u4e3b\u8981\u662f\u4e3a\u4e86\u51cf\u5c11\u4ee3\u7801\u91cf\uff0c\u6d88\u9664\u5e94\u7528\u95f4\u7684\u8026\u5408\u5173\u7cfb\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u67b6\u6784\u56fe","text":"\u6574\u4f53\u7684\u6846\u67b6\u8bbe\u8ba1\u5728\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u300b\u6587\u6863\u91cc\u9762\u5df2\u7ecf\u6709\u8be6\u7ec6\u63cf\u8ff0\u4e86\uff0c\u8fd9\u91cc\u8d34\u4e00\u4e0b\u6574\u4f53\u7684\u67b6\u6784\u56fe\uff1a \u4e3a\u4e86\u7a81\u663e\u672c\u6587\u7684\u91cd\u70b9\uff0c\u62bd\u53d6\u5176\u4e2d\u91cd\u8981\u529f\u80fd\u6a21\u5757\uff0c\u5982\u4e0b\u56fe\uff1a "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-basic-frame # \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\n\u251c\u2500\u2500 apps # \u5e94\u7528\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-dde-file-manager # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\uff08\u5e94\u7528\u5e93\u8be6\u7ec6\u76ee\u5f55\u7ed3\u6784\u8bf7\u770b\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\uff09\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 tag # \u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u2514\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u2502 \u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 xxx.png\n\u2502 \u2502 ...\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-deepin-music # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 public # \u516c\u5171\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget # dde_dock \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget # dde_desktop \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 src # \u6838\u5fc3\u5e93\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 button_center.py\n\u2502 \u251c\u2500\u2500 cmdtrl.py\n\u2502 \u251c\u2500\u2500 dogtails.py\n\u2502 \u251c\u2500\u2500 find_image.py\n\u2502 \u251c\u2500\u2500 global_config.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 setting # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 config.py\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 global_config.ini\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\u6a21\u5757\uff08Hook\uff09\n\u251c\u2500\u2500 pytest.ini # Pytest \u9ed8\u8ba4\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 docs # \u6587\u6863\u76ee\u5f55\n\u2514\u2500\u2500 manage.py # \u6267\u884c\u5668\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1apps","title":"1\u3001\u5e94\u7528\u5e93\uff08apps\uff09","text":"\u6240\u6709\u5e94\u7528\u5e93\u5747\u653e\u7f6e\u5728\u57fa\u7840\u6846\u67b6\u4e0b\u7684 apps \u76ee\u5f55\u4e0b\uff08\u89c1\u7b2c\u4e8c\u7ae0\u8282\u7b2c3\u6bb5\u76ee\u5f55\u7ed3\u6784\u5185\u5bb9\uff09\u3002\u5e94\u7528\u5e93\u7684\u67b6\u6784\u8bbe\u8ba1\u53ef\u4ee5\u53c2\u8003\u300aAT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b\u6587\u6863\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2src","title":"2\u3001\u6838\u5fc3\u5e93\uff08src\uff09","text":"\u5728 src \u76ee\u5f55\u4e0b\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u5e95\u5c42\u6838\u5fc3\u7ec4\u4ef6\uff0c\u901a\u5e38\u6765\u8bb2\u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5230\u5176\u4e2d\u67d0\u4e00\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4e48\u4f60\u9700\u8981\u663e\u793a\u7684\u5bfc\u5165\u8fd9\u4e2a\u6a21\u5757\uff0c\u7136\u540e\u624d\u80fd\u4f7f\u7528\u8be5\u6a21\u5757\u4e0b\u7684\u529f\u80fd\uff0c\u5982\u679c\u4f60\u7528\u5230\u4e86\u5341\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4f60\u5c31\u9700\u8981\u5bfc\u5165\u5341\u4e2a\u3002\u4f46\u662f\u6211\u4eec\u60f3\u8ba9\u4e8b\u60c5\u53d8\u5f97\u7b80\u5355\uff0c\u4e00\u6b21\u5bfc\u5165\uff0c\u4f7f\u7528\u6240\u6709\u3002 \u5c06\u6240\u6709\u7684\u529f\u80fd\u6a21\u5757\u90fd\u8fdb\u5165\u5230 src \u7684\u540d\u79f0\u7a7a\u95f4\uff0c\u5728 src/__init__.py \u91cc\u9762\u6211\u4eec\u8bbe\u8ba1\u6210\u8fd9\u6837\uff1a # src/__init__.py\nfrom .cmdctl import CmdCtl\nfrom .dogtails import Dogtail\nfrom .find_image import FindImage\nfrom .button_center import ButtonCenter\nclass Src(CmdCtl, FindImage):\ndef __init__(self, **kwargs):\n\"\"\"dogtail or button center param\n :param kwargs: app_name, desc, number\n \"\"\"\nif kwargs:\napp_name = kwargs.get(\"APP_NAME\")\ndesc = kwargs.get(\"DESC\")\nif app_name is None or desc is None:\nraise ValueError\nnumber = kwargs.get(\"number\")\nnumber = number if isinstance(number, int) else -1\n# \u5bf9\u8c61\u7ec4\u5408\nself.dog = Dogtail(app_name, desc, number)\nself.ui = ButtonCenter(app_name, number)\n \u9700\u8981\u4f20\u9012\u53c2\u6570\u7684\u91c7\u7528\u5bf9\u8c61\u7ec4\u5408\uff0c\u6ca1\u6709\u53c2\u6570\u7684\u4f7f\u7528\u7ee7\u627f\uff0c\u7ee7\u627f\u7684\u7c7b\u7b26\u5408 Mixin \u8bbe\u8ba1\u6a21\u5f0f\u3002 \u5e94\u7528\u5e93\u91cc\u9762\u4f7f\u7528\u7684\u65f6\u5019\u5728 widget/base_widget.py \u91cc\u9762\u53ea\u9700\u8981\u552f\u4e00\u7ee7\u627f Src \uff1a # \u5e94\u7528\u5e93\u91cc\u9762\u65b9\u6cd5\u57fa\u7c7b\n# widget/base_widget.py\nfrom src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n \u8981\u4f7f\u7528\u6838\u5fc3\u5e93\u7684\u529f\u80fd\uff0c\u53ea\u9700\u8981\u5199\u4e00\u4e2a\u5bfc\u5165 from src import Src \u5373\u53ef\u3002 \u5199 __init__ \u6784\u9020\u51fd\u6570\u7684\u539f\u56e0\u662f\u901a\u8fc7\u53c2\u6570\u6784\u9020\u5e94\u7528\uff0c\u5e76\u4e14\u4f20\u9012 number \u8fdb\u6765\uff0c\u53ef\u4ee5\u5b9e\u73b0\u591a\u7a97\u53e3\u7684\u63a7\u5236\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3public","title":"3\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09","text":"\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6bcf\u4e2a\u5e94\u7528\u90fd\u662f\u4e00\u4e2a\u5355\u72ec\u7684 py \u6587\u4ef6\uff0c\u76f8\u4e92\u4e4b\u95f4\u662f\u72ec\u7acb\u7684\uff0c\u6bcf\u4e2a py \u6587\u4ef6\u91cc\u9762\u662f\u8be5\u5e94\u7528\u7684\u65b9\u6cd5\u7c7b\uff0c\u6bd4\u5982\uff1a\u6700\u5e38\u7528\u7684\u65b9\u6cd5\u7c7b dde_desktop_public_widget.py # dde_desktop_widget.py\nfrom src import Src\nclass _DdeDesktopPublicBaseWidget(Src):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-desktop\"\nDESC = \"/usr/bin/dde-desktop\"\ndef __init__(self):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC)\nclass DdeDesktopPublicWidget(_DdeDesktopPublicBaseWidget):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u7c7b\"\"\"\ndef click_music_dir_by_ui(self):\n\"\"\"\u5728\u6587\u4ef6\u9009\u62e9\u6846\u70b9\u51fb\u97f3\u4e50\u76ee\u5f55\"\"\"\nself.click(*self.ui.btn_center(\"\u4fa7\u8fb9\u680f-\u97f3\u4e50\")) \ndef click_xxx_by_attr(self):\npass\n \u516c\u5171\u65b9\u6cd5\u5e93\u610f\u4e49\uff1a \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6240\u5c01\u88c5\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\u90fd\u662f\u81f3\u5c11\u88ab2\u4e2a\u5e94\u7528\u90fd\u7528\u5230\u7684\uff0c\u8fd9\u6837\u505a\u53ef\u4ee5\u51cf\u5c11\u6574\u4f53\u4ee3\u7801\u91cf\uff0c\u4ece\u800c\u51cf\u8f7b\u5e94\u7528\u5e93\u4ee3\u7801\u7684\u7ef4\u62a4\u5de5\u4f5c\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u7f16\u5199\u5f62\u5f0f\uff08\u547d\u540d\u89c4\u5219\u3001\u5b9a\u4f4d\u7684\u65b9\u6848\u5199\u6cd5\u3001\u6ce8\u91ca\u7684\u5199\u6cd5\u7b49\u7b49\uff09\u5177\u6709\u4e00\u5b9a\u7684\u6a21\u677f\u4f5c\u7528\uff0c\u8fd9\u6837\u5373\u4f7f\u662f\u5404\u4e2a\u5e94\u7528\u5e93\u90fd\u72ec\u7acb\u7ef4\u62a4\uff0c\u6240\u6709\u7684\u7f16\u7801\u98ce\u683c\u90fd\u662f\u8d8b\u4e8e\u76f8\u540c\u7684\uff0c\u56e0\u4e3a\u5927\u5bb6\u90fd\u5e94\u8be5\u53c2\u7167\u516c\u5171\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u5199\u6cd5\u6765\u5199\u81ea\u5df1\u5e94\u7528\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\u7c7b\uff0c\u8fd9\u6837\u4f7f\u5f97\u4ece\u516c\u53f8\u7684\u89d2\u5ea6\u53bb\u770b\u6240\u6709\u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u90fd\u662f\u7edf\u4e00\u7684\u3002 \u53ef\u4ee5\u901a\u8fc7\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\uff0c\u4e86\u89e3\u5230\u5176\u4ed6\u5e94\u7528\u7684\u529f\u80fd\uff0c\u5bf9\u4e8e\u6211\u4eec\u9700\u6c42\u7406\u89e3\uff0c\u4e86\u89e3\u7cfb\u7edf\u7684\u65b9\u65b9\u9762\u9762\u4e5f\u6709\u597d\u5904\u3002 \u5f53\u7136\uff0c\u5982\u679c\u4f60\u7684\u5e94\u7528\u672c\u8eab\u662f\u5c5e\u4e8e\u6839\u672c\u5c31\u4e0d\u9700\u8981\u548c\u5176\u4ed6\u5e94\u7528\u4ea4\u4e92\u7684\uff0c\u90a3\u4e48\u4f60\u53ef\u80fd\u4e0d\u4f1a\u7528\u5230\u8fd9\u91cc\u9762\u7684\u529f\u80fd\uff0c\u6ca1\u5173\u7cfb\uff0c\u4f60\u6240\u6709\u7684\u65b9\u6cd5\u90fd\u53ef\u4ee5\u76f4\u63a5\u5199\u5728\u5e94\u7528\u5e93\u7684\u4e1a\u52a1\u5c42\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4conftestpy","title":"4\u3001conftest.py","text":"conftest.py \u4ece\u529f\u80fd\u4e0a\u5c06\u662f\u5c5e\u4e8e\u6838\u5fc3\u5e93\uff08src\uff09\u7684\u5185\u5bb9\uff0c\u4f46\u662f\u7531\u4e8e\u5b83\u7684\u7279\u6b8a\u6027\uff0c\u5373\u5b83\u662f\u5bf9\u5e94\u7528\u5e93\u4e2d\u7684\u7528\u4f8b\u751f\u6548\u7684\uff0c\u800c\u4e14\u5b83\u7684\u4f5c\u7528\u57df\u662f\u5f53\u524d\u76ee\u5f55\u53ca\u4ee5\u4e0b\uff0c\u56e0\u6b64\u6211\u4eec\u5c06\u5b83\u653e\u5230\u9879\u76ee\u6839\u76ee\u5f55\u3002\u6211\u4eec\u6846\u67b6\u4e2d\u6709\u4e0d\u5c11\u6838\u5fc3\u529f\u80fd\u90fd\u662f\u5728\u8fd9\u91cc\u9762\u8fdb\u884c\u5f00\u53d1\u7684\uff0c\u540e\u9762\u7b2c\u56db\u7ae0\u4f1a\u8bb2\u5230\u7ec6\u8282\u3002 pytest.ini \u4f5c\u7528\u548c conftest.py \u7c7b\u4f3c\uff0c\u662f Pytest \u6846\u67b6\u7684\u56fa\u5b9a\u914d\u7f6e\u6587\u4ef6\uff0c\u76ee\u524d\u914d\u7f6e\u4e86\u4e00\u4e9b\u901a\u7528\u7684\u547d\u4ee4\u884c\u6267\u884c\u53c2\u6570\uff0c\u4e5f\u653e\u5728\u9879\u76ee\u6839\u76ee\u5f55\u3002 \u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 Hook \u51fd\u6570\uff0capps \u76ee\u5f55\u4e0b\u7684 \u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 fixture \u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5setting","title":"5\u3001setting","text":"\u5168\u5c40\u914d\u7f6e\u6a21\u5757\uff0c\u5305\u542b\u4e86\u4ee5\u4e0b\u914d\u7f6e\u6587\u4ef6\uff1a \uff081\uff09ini \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u914d\u7f6e\u4e00\u4e9b\u5168\u5c40\u7684\u914d\u7f6e\u9879\uff0c\u8b6c\u5982\uff1a\u5931\u8d25\u91cd\u8dd1\u6b21\u6570\u3001\u662f\u5426\u5931\u8d25\u5f55\u5c4f\u3001\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\u3001\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4\u3001\u6267\u884c\u65f6\u65e5\u5fd7\u7ea7\u522b\u3001\u751f\u6210\u7684\u62a5\u544a\u7c7b\u578b\u3001\u4ee5\u53ca\u5206\u5e03\u5f0f\u6267\u884c\u7684\u4e00\u4e9b\u7b56\u7565\u914d\u7f6e\u9879\u7b49\u7b49\u3002 \uff082\uff09config.py \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u63d0\u4f9b\u914d\u7f6e\u6587\u4ef6\u8bfb\u53d6\u3001\u52a8\u6001\u83b7\u53d6\u4e00\u4e9b\u5e38\u91cf\uff08\u5982\u9879\u76ee\u6839\u76ee\u5f55\u7edd\u5bf9\u8def\u5f84 (BASE_DIR)\u3001\u7cfb\u7edf\u67b6\u6784\uff08SYS_FRAME\uff09\u3001\u65f6\u95f4\u5b57\u7b26\u4e32\uff08strftime\uff09\u3001\u672c\u673a USERNAME IP \u7b49\u7b49\uff09\u3001\u516c\u5171 URL \u7b49\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u89c4\u8303","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u7248\u672c\u53ca\u4f9d\u8d56","text":"\u57fa\u7840\u6846\u67b6\u4f1a\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u8fdb\u884c\u7248\u672c\u53d1\u5e03\uff0c\u4e0d\u4e0e\u67d0\u4e2a\u5e94\u7528\u7248\u672c\u7ed1\u5b9a\uff0c\u4f46\u662f\uff0c\u5e94\u7528\u5e93\u4f1a\u4f9d\u8d56\u4e8e\u57fa\u7840\u6846\u67b6\u7684\u7248\u672c\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u5efa\u8bae\u5728\u5e94\u7528\u5e93\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a\u6587\u672c\u6587\u4ef6\u7528\u4e8e\u8bb0\u5f55\u6240\u4f9d\u8d56\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\uff0c\u7c7b\u4f3c\u4e8e\u5f00\u53d1\u5e94\u7528\u7684 debian/control \u6587\u4ef6\u7684\u529f\u80fd\uff0c\u4e3a\u4e86\u4fdd\u6301\u7edf\u4e00\uff0c\u8fd9\u4e2a\u6587\u4ef6\u5c31\u547d\u540d\u4e3a control\uff0c\u653e\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u6838\u5fc3\u5e93\u72ec\u7acb\u6027","text":"\u6838\u5fc3\u5e93\u4e0d\u5efa\u8bae\u9488\u5bf9\u67d0\u4e00\u4e2a\u5e94\u7528\u5355\u72ec\u505a\u4ee3\u7801\u4e0a\u7279\u6b8a\u5904\u7406\uff0c\u901a\u5e38\u8003\u8651\u9488\u5bf9\u67d0\u4e00\u79cd\u573a\u666f\u8fdb\u884c\u5904\u7406\uff0c\u8fd9\u4e9b\u573a\u666f\u901a\u5e38\u662f\u5b58\u5728\u4e00\u4e9b\u5171\u6027\u7684\u3002\u6bd4\u5982\u8bf4\uff1a\u684c\u9762\u7684ID\u5206\u914d\u5b58\u5728\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u903b\u8f91\u5904\u7406\u89e3\u51b3ID\u5206\u914d\u9519\u8bef\u7684\u95ee\u9898\uff0c\u4f46\u662f\u8fd9\u90e8\u5206\u903b\u8f91\u6211\u4eec\u4f1a\u5728\u684c\u9762\u7684\u65b9\u6cd5\u5c42\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u517c\u5bb9\u6027","text":"\u4e3a\u4e86\u4fdd\u6301\u517c\u5bb9\u6027\uff0c\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u539f\u5219\u4e0a\u4e0d\u5bf9\u8001\u65b9\u6cd5\u8fdb\u884c\u4fee\u6539\u6216\u5220\u9664\uff0c\u53ea\u8fdb\u884c\u65b0\u589e\u3002\u6d89\u53ca\u5230\u8001\u65b9\u6cd5\u4fee\u6539\u6216\u5220\u9664\u7684\uff0c\u4f1a\u8fdb\u884c\u63d0\u524d\u9884\u544a\uff0c\u5e76\u5728\u7b2c\u4e8c\u4e2a\u7248\u672c\u4e4b\u540e\uff08\u4e2d\u95f4\u4f1a\u9694\u4e00\u4e2a\u7248\u672c\u8fc7\u5ea6\uff09\u6b63\u5f0f\u5b9e\u65bd\u4fee\u6539\u6216\u5220\u9664\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u547d\u540d\u89c4\u8303","text":" \u7528\u4f8b ID \u6bcf\u4e2a\u5e94\u7528\u81ea\u5df1\u7ef4\u62a4\u4e00\u5957 ID\uff0c\u5728PMS\u4e0a\u7528\u4f8b\u6807\u9898\u4e0a\u5c06\u81ea\u52a8\u5316ID\u4ee5\u6807\u7b7e\u7684\u5f62\u5f0f\u5199\u5165\uff0c\u6bd4\u5982\uff1a[101]\u6253\u5f00-\u542f\u52a8\u5e94\u7528\u540edock\u53f3\u952e\u83dc\u5355 \u4e00\u4e2a\u7528\u4f8b\u7c7b\u91cc\u9762\u6709\u591a\u4e2a\u7528\u4f8b\u65f6\uff0c\u5728\u7528\u4f8b\u540d\u79f0\u540e\u9762\u52a0\u5e8f\u53f7\u3002 class TestFileManager(BaseCase):\n\"\"\"\u6587\u7ba1\u7528\u4f8b\"\"\"\ndef test_xxx_015_1(self):\npass\ndef test_xxx_015_2(self):\npass\n \u6ce8\u610f 015_1\uff0c\u4e0d\u8981\u5199015_01\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 PMS \u4e0a\u7684\u7528\u4f8bID\uff1a PMS \u4e0a\u662f6\u4f4d\u6570\uff0c\u4e0d\u591f\u76f4\u89c2\uff0c\u4e5f\u4e0d\u597d\u7ef4\u62a4\uff0c\u5728\u81ea\u52a8\u5316\u4e0b\u9762\u53bb\u627e\u4e00\u4e2a\u5e26\u6709 6 \u4f4d\u6570\u7684\u6587\u4ef6\u662f\u4e00\u4e2a\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 PMS \u4e0a\u7684 ID \u53ef\u80fd\u4f1a\u53d1\u751f\u53d8\u5316\uff0c\u6bd4\u5982\u5bfc\u51fa\u6765\u5bfc\u8fdb\u53bb\u7684\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u5b58\u5728\u95ee\u9898\uff0c\u5982\u679c\u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u8981\u60f3\u627e\u51fa\u6765\u5bf9\u5e94\u4fee\u6539\u81ea\u52a8\u5316\u7528\u4f8b ID\uff0c\u5c06\u4f1a\u662f\u4ef6\u975e\u5e38\u75db\u82e6\u7684\u4e8b\u60c5\u3002 \u51fd\u6570\u547d\u540d\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5de6\u952e\u70b9\u51fb click \u53f3\u952e\u70b9\u51fb right_click \u53cc\u51fb double_click \u79fb\u52a8 move_to \u62d6\u52a8 drag \u65b0\u5efa new \u62d6\u52a8\u5230 drag_to \u4ece\u54ea\u91cc\u62d6\u52a8\u5230\u54ea\u91cc drag_something_from_xxx_to_xxx \u83b7\u53d6 get \u83b7\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5750\u6807 get_location \u975e\u7279\u6b8a\u6587\u4ef6 file word\u6587\u4ef6 doc text\u6587\u4ef6 text \u6587\u4ef6\u5939 dir \u5173\u952e\u8bcd\u6301\u7eed\u589e\u52a0 \u5e38\u91cf\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5e94\u7528\u540d\u79f0 APP_NAME \u5e94\u7528\u63cf\u8ff0 DESC \u672c\u5e94\u7528\u4ee5\u5916\u7684\u5176\u4ed6\u5e94\u7528\uff0c\u6bd4\u5982\u5e2e\u52a9 HELP \u5176\u4ed6\u540d\u79f0\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u65b9\u6cd5\u5305\u540d widget \u65b9\u6cd5\u6587\u4ef6\u540d\uff08\u6587\u7ba1\u4e3e\u4f8b\uff09 dfm_widget.pytitle_widget.pyright_view_widget.pyleft_view_widget.pypop_widget.pybase_widget.pydfm_assert.py \u65ad\u8a00\u8bed\u53e5\u547d\u540d\u89c4\u8303 \u65ad\u8a00\u8bed\u53e5\u90fd\u662f\u4ee5 assert \u5f00\u5934 \u65ad\u8a00 \u8bed\u53e5 \u5224\u65ad\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_existsassert_file_not_exists \u5224\u65ad\u684c\u9762\u76ee\u5f55\u4e0b\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_exists_in_desktopassert_file_not_exists_in_desktop \u5224\u65ad\u56fe\u7247\u5b58\u5728 assert_image_existsassert_image_not_exists \u5224\u65ad\u5f71\u9662\u4e2d\u662f\u5426\u5b58\u5728\u56fe\u7247 assert_image_exists_in_movieassert_image_not_exists_in_movie \u5224\u65ad\u5143\u7d20\u662f\u5426\u5b58\u5728 assert_element_existassert_element_not_exist \u5224\u65ad\u662f\u5426\u76f8\u7b49 assert_equalassert_not_equal \u5224\u65ad\u662f\u5426\u4e3a\u771f assert_trueassert_false"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5fixture","title":"5\u3001fixture \u89c4\u8303","text":"\u7531\u4e8e Pytest \u6846\u67b6\u4e2d\u652f\u6301 fixture \u7684\u5199\u6cd5\u548c Xunit \u5199\u6cd5\u7684\uff0c\u6240\u4ee5\u5e94\u7528\u5e93\u4e2d\u53ef\u80fd\u5b58\u5728\u6df7\u7528\u7684\u60c5\u51b5\uff0c\u4e3a\u7edf\u4e00\u7f16\u7801\u98ce\u683c\u65b9\u4fbf\u540e\u7eed\u7528\u4f8b\u4ee3\u7801\u7ef4\u62a4\uff0c\u73b0\u505a\u4ee5\u4e0b\u89c4\u8303\u8bf4\u660e\uff1a \u629b\u5f03 Xunit \u7684\u5199\u6cd5\uff0c\u7edf\u4e00\u91c7\u7528 Pytest fixture \u7684\u5199\u6cd5\u3002 \u5e94\u7528\u5185 fixture \u8c28\u614e\u4f7f\u7528 autouse=True \uff0c\u975e\u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u975e\u5e38\u4e0d\u5efa\u8bae\u4f7f\u7528\u8fd9\u4e2a\u53c2\u6570\u3002 \u8c03\u7528 fixture \u4e0d\u80fd\u4f7f\u7528 @pytest.mark.usefixture()\uff0c\u4f7f\u7528\u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u4f20\u5165\u51fd\u6570\u5bf9\u8c61\u3002 \u5efa\u8bae\u5728\u4e00\u4e2a conftest.py \u91cc\u9762\u53bb\u5199\uff0c\u4e00\u4e2a\u5e94\u7528\u4e5f\u5c3d\u91cf\u7ef4\u62a4\u4e00\u4e2a conftest.py\u6587\u4ef6\u3002 fixture \u4e5f\u9700\u8981\u5199\u529f\u80fd\u8bf4\u660e\uff0c\u51fd\u6570\u540d\u79f0\u8981\u6709\u5177\u4f53\u542b\u4e49\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#6","title":"6\u3001\u65b9\u6cd5\u7f16\u5199\u89c4\u8303","text":" \u65b9\u6cd5\u7c7b\u578b\uff1a if \u6ca1\u6709\u7528\u5230\u5b9e\u4f8b\u5bf9\u8c61\uff1a\nif \u6ca1\u6709\u7528\u5230\u7c7b\u5bf9\u8c61\uff1a\n\u5199\u9759\u6001\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @staticmethod\nelse\uff1a\n\u5199\u7c7b\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @classmethod\nelse:\n\u76f4\u63a5\u5199\u5b9e\u4f8b\u65b9\u6cd5\n \u4e3e\u4f8b: class TitleWidget:\ndef click_xxx_by_ui(self):\npass\n@staticmethod\ndef click_xxx_by_ui():\npass\n@classmethod\ndef click_xxx_by_ui(cls):\npass\n \u51fd\u6570\u540d\u79f0\u4e0d\u51fa\u73b0\u6570\u5b57\uff0c\u9700\u8981\u8868\u793a\u6570\u91cf\u7684\u7528\u5355\u8bcd\u8868\u793a\u3002 \u51fd\u6570\u529f\u80fd\u6ce8\u91ca\u3002 \u6ca1\u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg2:xxx\n\"\"\"\n \u6709\u53c2\u6570\uff0c\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg1:xxx\nreturn: xxx\n\"\"\"\n \u200b \u7528 Pycharm \u7684\u6ce8\u91ca\u6a21\u677f\u4e5f\u53ef\u4ee5\uff0c\u53ea\u8981\u4f53\u73b0\u4e86\u53c2\u6570\u7684\u7c7b\u578b\u548c\u8fd4\u56de\u5c31\u884c\u4e86\u3002 \u6682\u4e0d\u8981\u6c42\u5199\u7c7b\u578b\u6ce8\u89e3\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#7case","title":"7\u3001\u7528\u4f8b\uff08case\uff09\u89c4\u8303","text":" \u4ee5\u7c7b\u7684\u5f62\u5f0f\u5199\u7528\u4f8b\uff0c\u7528\u4f8b\u7c7b\u96c6\u6210\u7528\u4f8b\u57fa\u7c7b\u3002 \u7528\u4f8b\u7c7b\u9700\u8981\u5199\u6ce8\u91ca\u3002 \u6d4b\u8bd5\u7528\u4f8b\u51fd\u6570\u8bf4\u660e\uff08\u5efa\u8bae\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u540d\u79f0\uff09 \"\"\"\u53f3\u4fa7\u9884\u89c8-\u56fe\u7247\u7c7b\u578b\u4fe1\u606f\u680f\u57fa\u672c\u4fe1\u606f\"\"\"\n \u4e0d\u5199\u8c03\u8bd5\u4ee3\u7801 if __name__ == '__main__':\npytest.main()\n \u6240\u6709\u7528\u4f8b\u90fd\u7ee7\u627f BaseCase\u3002 BaseCase \u91cc\u9762\u653e\u4e00\u4e9b\u6d4b\u8bd5\u6570\u636e\u7684\u5e38\u91cf\uff0c\u6bd4\u5982\u6587\u4ef6\u540d\u79f0\uff0c\u5e94\u7528\u540d\u79f0\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u4e00\u4e9b\u901a\u7528\u7684\u5b57\u7b26\u4e32\u3002 \u8fd9\u7c7b\u662f\u5c5e\u4e8e\u6d4b\u8bd5\u6570\u636e\u3002 class BaseCase(DfmAssert):\n\"\"\"\u7528\u4f8b\u57fa\u7c7b\"\"\"\nNEW_FILE = \"\u65b0\u5efa\u6587\u672c.txt\"\nTEST_FILE = \"test.txt\"\nNEW_DIR = \"\u65b0\u5efa\u6587\u4ef6\u5939\"\nNEW_WORD = \"\u65b0\u5efaWord\u6587\u6863.doc\"\nAPP_HELP = \"damn\"\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\n\"\"\"\u7528\u4f8b\u6807\u9898\uff08\u590d\u5236PMS\u4e0a\u7528\u4f8b\u6807\u9898\uff09\"\"\"\ndfm = DfmWidget()\ndfm.click_xxx_by_attr(self.NEW_FILE)\ndfm.new_file_in_desktop_by_cmd(self.NEW_FILE)\nself.assert_true(dfm.get_process_status(self.APP_NAME))\n \u7528\u4f8b\u91cc\u9762\u5c3d\u91cf\u51cf\u5c11\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\uff0c\u66f4\u8981\u51cf\u5c11\u76f8\u540c\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\u3002 \u7edf\u4e00\u6587\u4ef6\u6ce8\u91ca\u5934\u3002 #!/usr/bin/env python3\n# _*_ coding:utf-8 _*_\n\"\"\"\n:Author:email@uniontech.com\n:Date :${DATE} ${TIME}\n\"\"\"\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#8","title":"8\u3001\u5176\u4ed6\u89c4\u8303","text":" \u65e5\u5fd7\u6253\u5370\u8981\u5728\u65b9\u6cd5\u6700\u524d\u9762\uff0c\u5426\u5219\u4ee3\u7801\u62a5\u9519\u6ca1\u6709\u65e5\u5fd7\u8f93\u51fa\uff0c\u4e0d\u597d\u5b9a\u4f4d\u95ee\u9898\u3002\uff08\u6211\u4eec\u4f1a\u8003\u8651\u7ee7\u7eed\u4f7f\u7528\u62e6\u622a\u5668\u6253\u5370\u65e5\u5fd7\uff09 \u6240\u6709\u7684\u64cd\u4f5c\u90fd\u9700\u8981\u6709\u65e5\u5fd7\uff0c\u5305\u62ec sleep()\uff0c\u6211\u4eec\u4f1a\u91cd\u5199\u4e00\u4e2a\u6709\u65e5\u5fd7\u8f93\u5165\u7684 sleep\u3002 \u4e1a\u52a1\u5c42\u65e5\u5fd7\u7ea7\u522b\u4e3a INFO\u3002 hook \u51fd\u6570\u53ea\u80fd\u5199\u5230\u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u91cc\u9762\u3002 apps \u76ee\u5f55\u4e0b\u7684 conftest.py \u539f\u5219\u4e0a\u4e0d\u4f1a\u65b0\u589e fixture\u3002 \u56fa\u5b9a\u76ee\u5f55\u6216\u5143\u7d20\u63a7\u4ef6\u7684\u64cd\u4f5c\uff0c\u5c06\u64cd\u4f5c\u65b9\u6cd5\u5199\u6b7b\uff0c\u6587\u4ef6\u7c7b\u64cd\u4f5c\u5c06\u6587\u4ef6\u540d\u7559\u53c2\u6570\u3002 \u8def\u5f84\u62fc\u63a5\u89c4\u8303\uff1a \u7cfb\u7edf\u4e2d\u56fa\u5b9a\u76ee\u5f55\uff0c\u8def\u5f84\u62fc\u63a5\u65f6\u4f7f\u7528\u6ce2\u6d6a\u7b26\u53f7\uff0c\u6bd4\u5982\uff1a~/Desktop/\uff0c\u4e0b\u5c42\u4f7f\u7528 os.path.expanduser()\uff0c\u5b83\u53ef\u4ee5\u81ea\u52a8\u8bc6\u522b\u6ce2\u6d6a\u7b26\u53f7\u3002 \u9879\u76ee\u4e0b\u8def\u5f84\u4f7f\u7528\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u8def\u5f84\uff0c\u6bd4\u5982\uff1aConfig.BASE_PATH\uff0c\u56e0\u4e3a\u9879\u76ee\u662f\u53ef\u4ee5\u5728\u4efb\u610f\u8def\u5f84\u8fd0\u884c\u7684\uff0c\u9700\u8981\u52a8\u6001\u62fc\u63a5\u8def\u5f84\u3002 "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848","text":"# =================================================\n# Author : Mikigo\n# Time : 2022/3/16\n# version \uff1a1.0\n# =================================================\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"AT \u5e94\u7528\u5e93\u6539\u9020\u662f\u57fa\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u8fdb\u884c\u7528\u4f8b\u65b9\u6cd5\u548c\u4e1a\u52a1\u903b\u8f91\u7684\u91cd\u65b0\u8bbe\u8ba1\uff0c\u4ee5\u5b9e\u73b0\u5e94\u7528\u5e93\u9ad8\u6548\u7684\u7f16\u5199\u3001\u7ef4\u62a4\u7528\u4f8b\u53ca\u5176\u65b9\u6cd5\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u6587\u4ef6\u7ba1\u7406\u5668\u4ece\u4e1a\u52a1\u590d\u6742\u5ea6\u548c\u7528\u4f8b\u91cf\u6765\u8bb2\uff0c\u5728\u7cfb\u7edf\u6240\u6709\u5e94\u7528\u4e2d\uff0c\u662f\u5f88\u6709\u4ee3\u8868\u6027\u7684\uff0c\u96be\u5ea6\u4e5f\u662f\u6700\u5927\u7684\uff0c\u56e0\u6b64\u6211\u4eec\u9009\u53d6\u6587\u4ef6\u7ba1\u7406\u5668\u4f5c\u4e3a\u5e94\u7528\u5e93\u6539\u9020\u7684\u5b9e\u9a8c\u5e94\u7528\uff0c\u7ed9\u540e\u7eed\u5176\u4ed6\u5e94\u7528\u6539\u9020\u63d0\u4f9b\u5207\u5b9e\u53ef\u884c\u7684\u601d\u8def\u548c\u65b9\u6848\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u5206\u5c42\u8bbe\u8ba1\u56fe","text":"\u6574\u4f53\u4ecd\u7136\u9075\u5faa PO \u8bbe\u8ba1\u7406\u5ff5\uff0c\u6839\u636e\u4e1a\u52a1\u9700\u8981\uff0c\u5c06\u6587\u7ba1\u4e1a\u52a1\u5c42\u8fdb\u884c 3 \u5c42\u5212\u5206\uff1a "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-dde-file-manager # \u5e94\u7528\u4ed3\u5e93\n\u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 test_xxx_001.py\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u00a0\u251c\u2500\u2500 __init__.py\n\u2502 \u00a0\u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u00a0\u251c\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u00a0\u251c\u2500\u2500 base_widget.py # \u65b9\u6cd5\u57fa\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 title_widget.py # title \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 right_view_widget.py # right view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 left_view_widget.py # left view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 pop_widget.py # pop \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 dfm_widget.py # \u65b9\u6cd5\u7684\u7edf\u4e00\u51fa\u53e3\n\u2502 \u00a0\u2514\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 tag # \u7528\u4f8b\u6807\u7b7e\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 xxx.csv # \u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2514\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u57fa\u7c7b","text":" \u7ee7\u627f\u6838\u5fc3\u5c42\u7684\u5404\u4e2a\u6a21\u5757\u7c7b\u3002 \u62bd\u53d6\u64cd\u4f5c\u5c42\u7684\u4e00\u4e9b\u57fa\u7840\u65b9\u6cd5\u3002 \u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u7684\u4e00\u4e9b\u516c\u5171\u65b9\u6cd5\u3002 \u8def\u5f84\u7ec4\u88c5\u65b9\u6cd5\u3002 \u4e00\u4e9b\u4e1a\u52a1\u5c42\u76f8\u5173\u7684\u53d8\u91cf\u3001\u5e38\u91cf\u3001shell\u547d\u4ee4\u3001\u5750\u6807\u3002 \u65b9\u6cd5\u57fa\u7c7b\u7684\u5199\u6cd5\uff1a from src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u64cd\u4f5c\u5c42","text":" \u6a21\u5757\u5212\u5206 \u6309\u7167\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u6587\u7ba1\u4e3b\u754c\u9762\u5206\u4e3a\u4e09\u4e2a\u533a\u57df\uff1a\u6807\u9898\u680f\u3001\u53f3\u8fb9\u89c6\u56fe\u533a\u57df\u3001\u5de6\u8fb9\u89c6\u56fe\u533a\u57df \u5f39\u7a97\uff1a\u8bbe\u7f6e\u754c\u9762\u5f39\u7a97\u3001\u4fdd\u9669\u7bb1\u5f39\u7a97\u3001\u5220\u9664\u786e\u8ba4\u5f39\u7a97\u3001\u53ca\u5404\u79cd\u7f51\u7edc\u5f39\u7a97 \u53f3\u952e\u83dc\u5355\uff1a\u6682\u65f6\u4e0d\u8003\u8651\u4e3a\u5355\u72ec\u7684\u6a21\u5757\uff0c\u8003\u8651\u4ee5\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6848\u505a\u6210\u516c\u5171\u5e93\u3002 \u5404\u4e2a\u6a21\u5757\u53ea\u7ee7\u627f\u57fa\u7c7b from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u6784\u9020\u51fd\u6570\u91cc\u9762\u4e0d\u6784\u9020\u5bf9\u8c61\uff0c\u53ef\u4ee5\u521d\u59cb\u5316\u4e00\u4e9b\u53d8\u91cf\u3002 \u4e0d\u540c\u7684\u5b9a\u4f4d\u65b9\u6848\u8c03\u7528\u4e0d\u540c\u7684\u5b9a\u4f4d\u5de5\u5177\u5bf9\u8c61\u3002 self.dog\nself.ui\nself.d_bus\n \u65b9\u6cd5\u7f16\u5199 \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u5e94\u7528\u5c42","text":" \u7ee7\u627f\u64cd\u4f5c\u5c42\u7684\u6240\u6709\u7c7b\u3002 \u4ec5\u4ec5\u7528\u4e8e\u7528\u4f8b\u4e2d\u5bfc\u5165\u65b9\u4fbf\uff0c\u4e0d\u505a\u5176\u4ed6\u4e8b\u60c5\u3002 class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n DfmAssert \u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u7ee7\u627f\uff0c\u65b9\u4fbf\u4f7f\u7528\u65ad\u8a00\u8bed\u53e5\u3002 from apps.dde_file_manager.widget.dfm_widget import DfmWidget\nfrom public.assert import Assert\nclass DfmAssert(Assert):\ndef assert_file_exists_in_desktop(self, file_name):\nself.assert_file_exists(f\"~/Desktop{file_name}\")\n...\nDfmWidget().get_file_in_desktop()\n \u7528\u4f8b\u91cc\u9762\u76f4\u63a5\u7ee7\u627f\uff0c\u65b9\u4fbf\u5728\u7528\u4f8b\u91cc\u9762\u4f7f\u7528 self \u8fdb\u884c\u65ad\u8a00\uff0c\u66f4\u7b26\u5408\u65ad\u8a00\u7684\u4f7f\u7528\u4e60\u60ef\uff0c\u7528\u4f8b\u903b\u8f91\u4e0a\u66f4\u6e05\u695a\u3002 class BaseCase(DfmAssert):\npass\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\nself.assert_file_exists_in_desktop(\"xxx\")\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u903b\u8f91\u4e3e\u4f8b","text":"\u7528\u4f8b\u4ee3\u7801\u8c03\u7528\u903b\u8f91\u4e3e\u4f8b\uff1a # BaseWidget\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n# =============================================\n# TitleWidget\nclass TitleWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_title_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# RightViewWidget\nclass RightViewWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_right_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# =============================================\n# \u51fa\u53e3 DfmWidget\nclass DfmWidget(TitleWidget, RightViewWidget):\npass\n# =============================================\n# in case\nfrom apps.dde_file_manager.widget.dfm_widget import DfmWidget\ndfm = DfmWidget()\ndfm.click_xxx_title_by_ui()\ndfm.click_xxx_right_by_ui()\ndfm.dog.print_desc()\ndfm.ui.print_number()\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u5de5\u7a0b\u6539\u9020\u5b9e\u65bd\u6b65\u9aa4","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_2","title":"1\u3001\u5de5\u7a0b\u4ee3\u7801\u62c9\u53d6","text":"1.1. \u5c06\u81ea\u52a8\u5316\u57fa\u7840\u6846\u67b6\u7684\u529f\u80fd\u62c9\u5230\u672c\u5730 Autotest Basic Frame \uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame 1.2. \u5c06\u5e94\u7528\u5e93\u4ee3\u7801\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u5e94\u7528\u5e93\u7684\u4ed3\u5e93\u547d\u540d\u5e94\u8be5\u662f\u957f\u8fd9\u6837\u7684 autotest_deepin_xxx\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_2","title":"2\u3001\u8c03\u6574\u5de5\u7a0b\u76ee\u5f55","text":"\u6309\u7167 \u65b9\u6848\u8bbe\u8ba1-\u76ee\u5f55\u7ed3\u6784 \u8fdb\u884c\u76ee\u5f55\u8c03\u6574\uff0c\u5c3d\u91cf\u4f7f\u7528\u7f16\u8f91\u5668\u8fdb\u884c\u76f8\u5e94\u7684\u8c03\u6574\uff0c\u7f16\u8f91\u5668\u63a8\u8350\u4f7f\u7528 Pycharm \uff0c\u4ee5\u4e0b\u64cd\u4f5c\u5747\u5728 Pycharm \u91cc\u9762\u53ef\u5b9e\u73b0\u3002 2.1. \u9700\u8981\u79fb\u52a8 py \u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u76f4\u63a5\u5728\u7f16\u8f91\u5668\u91cc\u9762\uff0c\u4f7f\u7528\u9f20\u6807\u9009\u4e2d\u5e76\u6309\u4f4f\uff0c\u4e4b\u540e\u62d6\u52a8\u5230\u76ee\u6807\u4f4d\u7f6e\u5373\u53ef\uff0cPycharm \u4f1a\u5c3d\u53ef\u80fd\u7684\u81ea\u52a8\u89e3\u51b3\u79fb\u52a8\u5bfc\u81f4\u7684\u8def\u5f84\u95ee\u9898\u3002\u6ce8\u610f\uff0c\u6211\u8bf4\u7684\u662f\u201c\u5c3d\u53ef\u80fd\u201d\uff0c\u6709\u4e9b\u9a9a\u64cd\u4f5c\u7f16\u8f91\u5668\u662f\u65e0\u6cd5\u81ea\u52a8\u5904\u7406\u7684\u3002\u5982\u679c\u6ca1\u6709\u88ab\u7f16\u8f91\u5668\u81ea\u52a8\u5904\u7406\u7684\u8def\u5f84\u95ee\u9898\uff0c\u540e\u7eed\u53ea\u80fd\u624b\u52a8\u89e3\u51b3\u3002 2.2. \u9700\u8981\u91cd\u547d\u540d\u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u5728\u7f16\u8f91\u5668\u91cc\u9762\u9009\u4e2d\u6587\u4ef6\uff0c\u7136\u540e\u4f7f\u7528\u5feb\u6377\u952e Shift + F6 \uff08\u5982\u679c\u5feb\u6377\u952e\u6ca1\u53cd\u5e94\uff0c\u6587\u4ef6\u53f3\u952e\u83dc\u5355 Refactor \u2014\u2014 Rename\uff09\uff0c\u7136\u540e\u5728\u8f93\u5165\u6846\u4e2d\u8f93\u5165\u8981\u91cd\u547d\u540d\u7684\u540d\u79f0\uff0c\u540c\u65f6\uff0c\u786e\u8ba4\u52fe\u9009 Search for references \u548c Search in comments and strings \u8fd9\u4e24\u4e2a\u9009\u9879\uff0c\u6700\u540e\u6309\u56de\u8f66\u6216\u8005\u9f20\u6807\u70b9 Refactor \u3002 \u6ce8\u610f\uff0c\u6b64\u65f6\u7f16\u8f91\u5668\u53ef\u80fd\u4f1a\u63d0\u793a\u4f60\uff0c\u4f60\u8fd9\u4e2a\u91cd\u547d\u540d\u7684\u64cd\u4f5c\u5173\u8054\u4e86\u591a\u4e2a\u6a21\u5757\uff0c\u5b83\u88ab\u591a\u4e2a\u5730\u65b9\u90fd\u4f7f\u7528\u5230\u4e86\uff0c\u76f8\u5173\u7684\u6a21\u5757\u662f\u5426\u4e5f\u4e00\u8d77\u6539\u540d\u4e86\uff0c\u8fd9\u4e0d\u5e9f\u8bdd\u5417\uff0c\u7528\u8fd9\u4e2a\u529f\u80fd\u5c31\u662f\u60f3\u628a\u5173\u8054\u5230\u7684\u90fd\u4fee\u6539\uff0c\u4e0d\u7136\u6211\u4e3a\u4ec0\u4e48\u4e0d\u7528\u6587\u7ba1\u7684\u91cd\u547d\u540d\u529f\u80fd\u5462\uff0c\u522b\u60f3\u4e86\uff0c\u76f4\u63a5\u70b9\u5de6\u4e0b\u89d2\u7684 Refactor \u6309\u94ae\uff0c\u5c31\u662f\u5e72\u3002 \u7c7b\u540d\u3001\u51fd\u6570\u540d\u7684\u91cd\u547d\u540d\u90fd\u5c3d\u91cf\u91c7\u7528\u8fd9\u79cd\u65b9\u6848\uff0c\u56e0\u4e3a\u7f16\u8f91\u5668\u4f1a\u81ea\u52a8\u7ed9\u6211\u4eec\u627e\u5230\u5173\u8054\u7684\u5730\u65b9\uff0c\u7136\u540e\u540c\u6b65\u4fee\u6539\u6389\u3002\u4f60\u53ef\u5343\u4e07\u522b\u76f4\u63a5\u5220\u4e86\u4fee\u6539\u540d\u79f0\uff0c\u4e0d\u7136\u4f60\u53ef\u80fd\u4f1a\u82b1\u4e0a\u4e00\u5929\u7684\u65f6\u95f4\u6765\u89e3\u51b3\u91cd\u547d\u540d\u7684\u95ee\u9898\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u5b9e\u73b0\u6838\u5fc3\u5e93\u63a5\u53e3","text":"3.1. BaseWidget \u5728 BaseWidget \u91cc\u9762\u628a\u8be5\u5199\u7684\u90fd\u5199\u597d\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u4e0a\u9762\u7684\u8bbe\u8ba1\u7406\u5ff5\u6765\u5199\u3002 \u5982\u679c\u4f60\u5acc\u9ebb\u70e6\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u6587\u7ba1\u7684\u5b9e\u9645\u5de5\u7a0b\u4ee3\u7801 autotest_dde_file_manager : https://gerrit.uniontech.com/admin/repos/autotest_dde_file_manager \u3002 3.2. \u64cd\u4f5c\u5c42 \u5982\u679c\u4f60\u662f\u65b0\u5199\u9879\u76ee\uff0c\u4f60\u4f1a\u53d1\u73b0\u4e00\u5207\u90fd\u662f\u90a3\u4e48\u7684\u7b80\u5355\u3001\u76f4\u63a5\uff0c\u6309\u7167\u6211\u4eec\u63d0\u4f9b\u7ed9\u4f60\u7684\u63a5\u53e3\u5199\u7528\u4f8b\u7684\u64cd\u4f5c\u65b9\u6cd5\u5c31\u597d\u4e86\u3002 \u5982\u679c\u4f60\u662f\u60f3\u5bf9\u539f\u6765\u7684\u5de5\u7a0b\u8fdb\u884c\u6539\u9020\uff0c\u4f60\u9700\u8981\u6309\u7167\u6838\u5fc3\u5e93\u65b9\u6cd5\u7684\u8c03\u7528\uff0c\u5c06\u4f60\u4e4b\u524d\u5199\u7684\u6bcf\u4e2a\u65b9\u6848\u8fdb\u884c\u5bf9\u5e94\u7684\u4fee\u6539\uff0c\u5305\u62ec\u7c7b\u548c\u65b9\u6cd5\u7684\u547d\u540d\u3001\u65b9\u6cd5\u5185\u6240\u8981\u7528\u5230\u4e0d\u540c\u5b9a\u4f4d\u65b9\u6cd5\u7684\u5199\u6cd5\u4fee\u6539\u3002 \u8fd9\u65f6\u5019\u4f60\u53ef\u80fd\u4f60\u7684\u4ee3\u7801\u4e2d\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u62a5\u9519\uff0c\u4e0d\u7528\u62c5\u5fc3\uff0c\u4f60\u53ef\u4ee5\u4ece\u4e1a\u52a1\u903b\u8f91\u51fa\u53d1\uff0c\u60f3\u6e05\u695a\u8fd9\u4e2a\u65b9\u6cd5\u662f\u5e72\u4ec0\u4e48\u7684\u3001\u64cd\u4f5c\u7684\u5bf9\u8c61\u662f\u4ec0\u4e48\u3001\u53c2\u6570\u662f\u4ec0\u4e48\uff0c\u6ce8\u610f\u8fd9\u4e9b\u4fee\u6539\u662f\u4f1a\u5f71\u54cd\u5230\u7528\u4f8b\u4ee3\u7801\u91cc\u9762\u7684\uff0c\u6ca1\u5173\u7cfb\uff0c\u7528\u4f8b\u91cc\u9762\u672c\u6765\u4e5f\u5e94\u8be5\u88ab\u5173\u8054\u4fee\u6539\u3002 3.3. \u628a\u914d\u7f6e\u6a21\u5757\u5199\u597d\uff0c\u8fd9\u90e8\u5206\u57fa\u672c\u53ef\u4ee5\u590d\u5236\u6587\u7ba1\u7684\u4ee3\u7801\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4_1","title":"4\u3001\u8def\u5f84\u5904\u7406","text":"4.1. \u5bfc\u5165\u8def\u5f84 \u65b9\u6cd5\u548c\u7528\u4f8b\u4e2d\u90fd\u4f1a\u6d89\u53ca\u5230\u5bfc\u5165\u8def\u5f84\u7684\u4fee\u6539\uff0c\u5728\u4fee\u6539\u8def\u5f84\u65f6\uff0c\u5efa\u8bae\u4f60\u4f7f\u7528 Ctrl + Shift + R \u5168\u5c40\u66ff\u6362\uff0c\u4f1a\u5c06\u6574\u4e2a\u9879\u76ee\u4e0b\u7684\u76f8\u540c\u5730\u65b9\u90fd\u4fee\u6539\u5230\uff0c\u5f53\u7136\uff0c\u4f60\u4e5f\u53ef\u4ee5\u5728\u5c0f\u5f39\u7a97\u4e2d\u4fee\u6539\u5168\u5c40\u66ff\u6362\u4e3a\u5c40\u90e8\u76ee\u5f55\u4e0b\u66ff\u6362\u3002\u5904\u7406\u90a3\u79cd\u6ca1\u6709\u5173\u8054\u5173\u7cfb\uff0c\u4f46\u662f\u53c8\u662f\u76f8\u540c\u540d\u79f0\u7684\u91cd\u547d\u540d\uff0c\u6211\u4e5f\u63a8\u8350\u4f7f\u7528\u8fd9\u79cd\u65b9\u5f0f\u8fdb\u884c\u91cd\u547d\u540d\u3002 \u6ce8\u610f\uff0c\u5168\u5c40\u66ff\u6362\u7684\u65b9\u5f0f\u4efb\u7136\u65e0\u6cd5\u4fdd\u8bc1\u771f\u7684\u5168\u5c40\u88ab\u66ff\u6362\u4e86\uff08\u53ef\u80fd\u662f\u7f16\u8f91\u5668\u7684 Bug \u5427\uff09\uff0c\u6240\u4ee5\u4f60\u4ecd\u7136\u9700\u8981\u624b\u52a8\u770b\u4e0b\u5404\u5904\u662f\u5426\u4fee\u6539\u5230\u4f4d\u3002 4.2. \u8d44\u6e90\u8def\u5f84 \u4e00\u4e9b\u7528\u4f8b\u8d44\u6e90\u9700\u8981\u6839\u636e config.py \u91cc\u9762\u7684\u8def\u5f84\u914d\u7f6e\u8fdb\u884c\u8d44\u6e90\u8def\u5f84\u7684\u62fc\u63a5\uff0c\u5982\u679c\u4f60\u539f\u6765\u672c\u6765\u5c31\u6709\u4e00\u4e2a\u51fd\u6570\u4e13\u95e8\u7528\u4e8e\u7ec4\u88c5\u8def\u5f84\u7684\uff0c\u90a3\u4f60\u53ea\u9700\u8981\u4fee\u6539\u8fd9\u4e00\u4e2a\u5730\u65b9\u5c31\u597d\u4e86\uff0c\u5982\u679c\u4f60\u4e4b\u524d\u5e76\u6ca1\u6709\u8fd9\u6837\u7684\u8bbe\u8ba1\uff0c\u90a3\u53ef\u80fd\u9700\u8981\u4fee\u6539\u5927\u91cf\u6d89\u53ca\u5230\u8d44\u6e90\u8def\u5f84\u7684\u5730\u65b9\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5","title":"5\u3001\u8c03\u8bd5\u548c\u7f16\u5199\u7528\u4f8b","text":"\u4ee5\u4e0a\u51e0\u4e2a\u6b65\u9aa4\u505a\u5b8c\uff0c\u57fa\u672c\u5c31\u53ef\u4ee5\u8fdb\u884c\u7528\u4f8b\u4ee3\u7801\u7684\u8c03\u8bd5\u4e86\uff0c\u8fd9\u90e8\u5206\u5de5\u4f5c\u4e3b\u8981\u89e3\u51b3\u4f60\u4e4b\u524d\u51e0\u4e2a\u6b65\u9aa4\u9057\u6f0f\u7684\u95ee\u9898\uff0c\u5982\u679c\u6240\u6709\u7528\u4f8b\u90fd\u8c03\u8bd5\u901a\u8fc7\u4e86\uff0c\u90a3\u4e48\u5de5\u7a0b\u6539\u9020\u5c31\u5168\u90e8\u5b8c\u6210\u4e86\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/","title":"AT \u5f00\u53d1\u89c4\u8303","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u5f00\u53d1\u89c4\u8303\u662f\u6839\u636e\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fd0\u884c\u4e24\u5e74\u591a\u6765\uff0c\u9047\u5230\u95ee\u9898\u89e3\u51b3\u95ee\u9898\u800c\u5f62\u6210\u7684\u4e00\u4e9b\u89e3\u51b3\u65b9\u6848\uff0c\u6216\u8005\u8bf4\u7ecf\u9a8c\u603b\u7ed3\uff1b\u8fd9\u4e9b\u7ecf\u9a8c\u7b26\u5408\u6211\u4eec\u73b0\u9636\u6bb5 AT \u6240\u5e94\u7528\u7684\u573a\u666f\u9700\u8981\uff0c\u4e5f\u662f\u6211\u4eec\u7ecf\u8fc7\u957f\u671f\u601d\u8003\uff0c\u4e0d\u65ad\u8bd5\u9519\u4e0d\u65ad\u4fee\u6b63\uff0c\u5e76\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u5b9e\u8df5\u4e2d\u68c0\u9a8c\u8fc7\u53ef\u884c\u7684\u3002\u4ee5\u6b64\uff0c\u5e0c\u671b\u80fd\u5e2e\u52a9\u53c2\u4e0e\u5230\u81ea\u52a8\u5316\u7684\u76f8\u5173\u4eba\u5458\u51cf\u5c11\u8bd5\u9519\u6210\u672c\uff0c\u66f4\u597d\u3001\u66f4\u5feb\u7684\u7f16\u5199\u7528\u4f8b\u53ca\u7ef4\u62a4\u7528\u4f8b\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_1","title":"\u4e00\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u89c4\u8303","text":"\u6807\u7b7e\u5316\u7ba1\u7406\u6587\u6863\u8bf7\u53c2\u8003\uff1a \u300a\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u64cd\u4f5c\u6307\u5f15\u300b \u4ee5\u4e0b\u8bf4\u51e0\u4e2a\u5bb9\u6613\u51fa\u73b0\u7684\u95ee\u9898\uff1a"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1","title":"1. \u5bf9\u5e94\u5173\u7cfb","text":" \u5199\u5b8c\u81ea\u52a8\u5316\u7528\u4f8b\u4e4b\u540e\uff0c\u8bf7\u5728 CSV \u6587\u4ef6\u4e2d\u6807\u8bb0\u7528\u4f8b\u7684 ID\u3001\u7b49\u7ea7\u3002\u4e3a\u4e86\u63d0\u9192\u6807\u8bb0\uff0c\u6267\u884c\u7528\u4f8b\u65f6\u5728\u9996\u884c\u4f1a\u8f93\u51fa ERROR \u65e5\u5fd7\uff1a CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94\u7684 ID\uff1b \u5728\u6700\u7ec8\u63d0\u4ea4\u4ee3\u7801\u4e4b\u524d\uff0c\u4f60\u9700\u8981\u5728 CSV \u6587\u4ef6\u91cc\u9762\u5c06ID\u3001\u7528\u4f8b\u7b49\u7ea7\u7b49\u6807\u7b7e\u8865\u5168\uff0c\u5982\u679c CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94 ID\uff0c\u540e\u7eed\u5728\u6279\u91cf\u6267\u884c\u7684\u65f6\u5019\uff0c\u8fd9\u4e9b\u7528\u4f8b\u662f\u4e0d\u4f1a\u6267\u884c\u7684\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2","title":"2. \u540d\u79f0\u4e00\u81f4","text":" CSV \u6587\u4ef6\u7684\u6587\u4ef6\u540d\u3001\u7528\u4f8b\u51fd\u6570\u4e2d\u95f4\u7684\u540d\u79f0\u4e00\u81f4\u3001\u7528\u4f8b py \u6587\u4ef6\u4e2d\u95f4\u7684\u540d\u79f0\uff0c\u8fd9\u4e09\u4e2a\u540d\u79f0\u4e00\u81f4\u3002 \u4e3e\u4f8b\uff1a # test_music_001.py\ndef test_music_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u90a3\u4e48 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e3a music.csv\u3002 AT \u6846\u67b6\u5e95\u5c42\u4ee3\u7801\u5b9e\u73b0\u662f\u5c06 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e0e\u7528\u4f8b\u51fd\u6570\u540d\u79f0\u540d\u79f0\uff08item.name\uff09\u8fdb\u884c\u5bf9\u5e94\uff0c\u56e0\u6b64\uff0c\u6ce8\u610f CSV \u6587\u4ef6\u540d\u79f0\u5bf9\u5e94\u7684\u662f\u7528\u4f8b\u51fd\u6570\u540d\u79f0\uff0c\u5373 def test_music_001 \u91cc\u9762\u7684 music \uff0c\u800c\u4e0d\u662f test_music_001.py \u91cc\u9762\u7684 music \u3002 \u8fd9\u91cc\u7ec6\u7ec6\u54c1\u4e00\u4e0b\u54c8~ \u5982\u679c\u4f60\u5c06\u4e0a\u4f8b\u5199\u6210\u4e86\u8fd9\u6837: # test_music_001.py\ndef test_movie_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u7528\u4f8b\u6267\u884c\u6ca1\u95ee\u9898\uff0c\u4f46\u662f\u6807\u7b7e\u5316\u7ba1\u7406\u662f\u4e0d\u751f\u6548\u7684\uff0c\u6846\u67b6\u65e0\u6cd5\u5c06 music.csv\u6587\u4ef6\u91cc\u9762\u6807\u7b7e\uff0c\u6dfb\u52a0\u5230 test_movie_001\u8fd9\u4e2a\u7528\u4f8b\u4e2d\uff0c\u56e0\u4e3a\u4ed6\u4eec\u6ca1\u6709\u5bf9\u5e94\u5173\u7cfb\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#tag","title":"\u4e8c\u3001\u5206\u652f\u53ca tag \u7ba1\u7406\u89c4\u8303","text":"\u53c2\u8003\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u4ee3\u7801\u7ba1\u7406\u89c4\u8303\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2-tag","title":"2. \u5e94\u7528\u5e93 tag","text":" \u5e94\u7528\u5e93 tag \u6839\u636e\u5e94\u7528\u4ea4\u4ed8\u8282\u70b9\u751f\u6210\uff0c\u6bcf\u6b21\u6253 tag \u4e4b\u524d\uff0c\u76f8\u5173\u6d4b\u8bd5\u4eba\u5458\u9700\u8981\u8fdb\u884c\u7528\u4f8b\u8c03\u8bd5\uff1b \u8c03\u8bd5\u7528\u4f8b\u662f\u6307\u7684\u5728\u5168\u67b6\u6784\uff08x86\u3001arm\u3001mips\uff09\u4e0a\u8c03\u8bd5\u901a\u8fc7\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\u8fbe\u5230 90% \u4ee5\u4e0a\u624d\u80fd\u6253 tag\uff0c\u901a\u8fc7 Jenkins \u6267\u884c\u5668\u6267\u884c\u7528\u4f8b\uff0c\u4fdd\u7559\u901a\u8fc7\u7387\u7ed3\u679c\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\uff1a\u901a\u8fc7\u7528\u4f8b\u6570 / (\u603b\u7528\u4f8b\u6570 - \u5df2\u5e9f\u5f03\u7528\u4f8b) \u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u7b97\u901a\u8fc7 Jenkins \u6267\u884c\u5668 \u4f60\u53ef\u80fd\u4f1a\u5728\u4e00\u4e2a\u4ea4\u4ed8\u5468\u671f\u5185\u6301\u7eed\u7684\u8fdb\u884cAT\u7528\u4f8b\u8c03\u8bd5\uff0c\u4f46\u662f\u6700\u7ec8 AT \u7528\u4f8b\u6253 tag \u7684\u5e94\u7528\u7248\u672c\uff0c\u9700\u8981\u4f7f\u7528\u5e94\u7528\u96c6\u6210\u4ea4\u4ed8\u7684\u6700\u65b0\u5e94\u7528\u7248\u672c\uff0c\u53ef\u4ee5\u4f7f\u7528\u5e94\u7528\u7684\u63d0\u6d4b\u7248\u672c\uff1b\u4e00\u5b9a\u8981\u786e\u4fdd\u8c03\u8bd5\u7528\u4f8b\u7684\u5e94\u7528\u7248\u672c\u662f\u6700\u65b0\u7684\uff0c\u4e0d\u7136\u96c6\u6210\u8fdb\u53bb\u4e4b\u540e\uff0c\u6301\u7eed\u96c6\u6210\u5c31\u4f1a\u51fa\u95ee\u9898\uff1b tag \u53f7\u600e\u4e48\u6253\uff1f \u6839\u636e\u6301\u7eed\u96c6\u6210\u7684\u8981\u6c42\u751f\u6210\uff0c\u5176\u4e2d\u5e94\u7528\u7248\u672c\u53f7\u9700\u8981\u4e0e\u9879\u76ee\u7ecf\u7406\u786e\u8ba4\u672c\u6b21\u5373\u5c06\u96c6\u6210\u7684\u5e94\u7528\u7248\u672c\u53f7\u662f\u591a\u5c11\uff1b tag \u7684 commit \u4fe1\u606f\u683c\u5f0f\uff1a # commit msg\nversion:5.6.5\n \u5176\u4e2d 5.6.5 \u5199\u5e94\u7528\u7684\u96c6\u6210\u7248\u672c\u53f7\u3002 \u751f\u6210 tag \u7684\u547d\u4ee4\u53c2\u8003\uff1a\u300aGit \u6807\u7b7e\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3-tag","title":"3. \u57fa\u7840\u6846\u67b6 tag","text":"\u57fa\u7840\u6846\u67b6 tag \u4e0d\u4e0e\u4e1a\u52a1\u6302\u94a9\uff0c\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u6309\u9700\u53d1\u5e03\u7248\u672c\uff0c\u5728\u6839\u76ee\u5f55\u4e0b CURRENT \u6587\u4ef6\u4e2d\u8bb0\u5f55\u7684\u5f53\u524d\u7248\u672c\u53f7\u548c\u5386\u53f2\u7248\u672c\u53f7\uff0c\u53ca\u5176\u5bf9\u5e94\u65b0\u589e\u4e86\u54ea\u4e9b\u529f\u80fd\uff0c\u6709\u52a9\u4e8e\u5e94\u7528\u9009\u62e9\u5408\u9002\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\u3002 # CURRENT\n[current]\ntag = 0.9.5\n \u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u7684 control \u6587\u4ef6\u8bb0\u5f55\u5f53\u524d\u5e94\u7528\u5e93\u4f9d\u8d56\u7684\u57fa\u7840\u5e93\u7248\u672c\u3002 # control\n[Depends]\nautotest-basic-frame = 0.9.5\n \u7528\u4f8b\u5728\u6267\u884c\u65f6\u4f1a\u6821\u9a8c\u4e24\u4e2a\u6587\u4ef6\u7684\u7248\u672c\u53f7\u662f\u5426\u4e00\u81f4\uff0c\u5982\u679c\u4e0d\u4e00\u81f4\uff0c\u4f1a\u6253\u5370 error \u65e5\u5fd7\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_2","title":"\u4e09\u3001\u4ed3\u5e93\u6743\u9650\u7ba1\u7406","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_1","title":"1. \u57fa\u7840\u6846\u67b6","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u4ed3\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame \u57fa\u7840\u6846\u67b6\u4e0d\u5141\u8bb8\u533f\u540d\u8bbf\u95ee\uff0c\u5982\u679c\u4f60\u767b\u5f55 gerrit \u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u8bbf\u95ee\u4ee5\u4e0a\u94fe\u63a5\uff0c\u5219\u9700\u8981\u7533\u8bf7\u8bbf\u95ee\u6743\u9650\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_1","title":"2. \u5e94\u7528\u4ed3\u5e93","text":" \u81ea\u52a8\u5316\u5e94\u7528\u4ed3\u5e93\uff1a https://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684 app_name \u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_3","title":"\u56db\u3001\u65b9\u6cd5\u7f16\u5199&\u8c03\u7528\u89c4\u8303","text":"\u65b9\u6cd5\u7f16\u5199\u6574\u4f53\u8bbe\u8ba1\u601d\u8def\u53c2\u8003\uff1a[\u300aAT\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b]"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_2","title":"1. \u65b9\u6cd5\u7f16\u5199","text":"\u5199\u65b9\u6cd5\u7684\u65f6\u5019\u6ce8\u610f\u65b9\u6cd5\u5f52\u5c5e\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget\uff0c\u65b9\u6cd5\u662f\u5728\u54ea\u4e2a\u533a\u57df\u64cd\u4f5c\u7684\uff0c\u5c31\u5199\u5728\u54ea\u4e2a\u7c7b\u91cc\u9762\u3002 \u4e3e\u4f8b\uff1a from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n\"\"\"\u70b9\u51fb\u6807\u9898\u680fxxx\"\"\"\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_2","title":"2. \u65b9\u6cd5\u8c03\u7528","text":" \u5728\u7528\u4f8b\u4e2d\u8c03\u7528\u65b9\u6cd5\uff0c\u901a\u8fc7\u8be5\u5e94\u7528\u552f\u4e00\u7684\u51fa\u53e3\u8fdb\u884c\u8c03\u7528\uff0c\u6bd4\u5982\u6587\u7ba1\uff1a class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n \u4e0d\u8981\u5728\u7528\u4f8b\u4e2d\u5355\u72ec\u53bb\u8c03\u7528 TitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u8fd9\u4e9b\u7c7b\uff0c\u5426\u5219\u540e\u671f\u7528\u4f8b\u4f1a\u53d8\u5f97\u4e0d\u597d\u7ef4\u62a4\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_4","title":"\u4e94\u3001\u7528\u4f8b\u7f16\u5199\u89c4\u8303","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_3","title":"1. \u57fa\u4e8e\u7c7b\u5199\u7528\u4f8b","text":"\u6240\u6709\u7528\u4f8b\u90fd\u5e94\u8be5\u57fa\u4e8e\u7c7b\u53bb\u5199\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001(self):\n\"\"\"\u97f3\u4e50\u542f\u52a8\"\"\"\n \u6ce8\u610f\u4ee5\u4e0b\u51e0\u70b9\uff1a \u7c7b\u540d\u4e0d\u8981\u968f\u4fbf\u53d6\uff0c\u540c\u4e00\u4e2a\u5e94\u7528\u5e94\u8be5\u4f7f\u7528\u540c\u4e00\u4e2a\u7c7b\u540d\uff0c\u7528\u4f8b\u7c7b\u540d\u79f0\u5fc5\u987b\u4ee5 Test \u5f00\u5934\uff0c\u9075\u5faa\u5927\u9a7c\u5cf0\u547d\u540d\u89c4\u8303\uff1b \u7528\u4f8b\u7c7b\u7ee7\u627f BaseCase\uff0c\u4e00\u4e2a\u5e94\u7528\u53ea\u6709\u4e00\u4e2a BaseCase \u4e00\u4e2a py \u6587\u4ef6\u91cc\u9762\u53ea\u6709\u4e00\u4e2a\u7c7b\uff0c\u6211\u4eec\u79f0\u4e3a\u4e00\u4e2a\u6d4b\u8bd5\u7c7b\uff1b \u4e00\u4e2a\u7c7b\u91cc\u9762\u53ef\u4ee5\u6709\u591a\u4e2a\u7528\u4f8b\u51fd\u6570\uff0c\u8fd9\u53d6\u51b3\u8fd9\u6761\u7528\u4f8b\u6709\u591a\u5c11\u4e2a\u6d4b\u8bd5\u70b9\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001_1(self):\n\"\"\"\u4efb\u52a1\u680f\u542f\u52a8\u97f3\u4e50\"\"\"\ndef test_music_001_2(self):\n\"\"\"\u542f\u52a8\u5668\u542f\u52a8\u97f3\u4e50\"\"\" \ndef test_music_001_3(self):\n\"\"\"\u684c\u9762\u542f\u52a8\u97f3\u4e50\"\"\"\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_3","title":"2. \u7528\u4f8b\u51fd\u6570\u89c4\u8303","text":" \u7528\u4f8b\u51fd\u6570\u4ee5 test \u5f00\u5934\uff0c\u9075\u5faa\u86c7\u5f62\u547d\u540d\u89c4\u8303\uff0c\u4e2d\u95f4\u4e3a\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0\uff0c\u540e\u9762\u52a0\u7528\u4f8b ID\uff0c\u6700\u540e\u52a0\u6d4b\u8bd5\u70b9\u5e8f\u53f7\uff0c\u5373 test_${module}_${case_id}[_${index}] \uff1b \u6bd4\u5982\uff1atest_music_001_1\uff0cindex \u4ece 1 \u5f00\u59cb\u3002 \u51fd\u6570\u529f\u80fd\u8bf4\u660e\u91cc\u9762\u5199\u7528\u4f8b\u6807\u9898\uff0c\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u6807\u9898\u5373\u53ef\uff0c\u6ce8\u610f\u7528\u4e09\u5bf9\u53cc\u5f15\u53f7\uff0c\u4e0d\u8981\u7528\u5176\u4ed6\u6ce8\u91ca\uff0c\u66f4\u4e0d\u8981\u7528\u4e95\u53f7\u6ce8\u91ca\u5199\u7528\u4f8b\u6807\u9898\uff1b \u76f4\u63a5\u590d\u5236 PMS \u7528\u4f8b \u7528\u4f8b\u6b65\u9aa4\u76f4\u63a5\u5c06 PMS \u4e0a\u7528\u4f8b\u6b65\u9aa4\u548c\u9884\u671f\u590d\u5236\u8fdb\u6765\uff0c\u7136\u540e\u8fdb\u884c\u6279\u91cf\u6ce8\u91ca\uff08ctrl + /\uff09\uff0c\u5728\u6ce8\u91ca\u7684\u57fa\u7840\u4e0a\u53bb\u5199\u7528\u4f8b\u811a\u672c\u4f1a\u66f4\u52a0\u65b9\u4fbf\u5168\u9762\uff0c\u4e5f\u6bd4\u4f60\u81ea\u5df1\u5199\u6ce8\u91ca\u66f4\u8282\u7ea6\u65f6\u95f4\uff1a \u4e3e\u4f8b\uff0cPMS \u7528\u4f8b\uff1a \u76f4\u63a5\u9009\u4e2d\u7528\u4f8b\u5185\u5bb9\uff0c\u590d\u5236\u4e0b\u6765\uff0c\u7136\u540e\u7c98\u8d34\u5230\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c\u4e2d\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\n \u4e0a\u4f8b\u4e2d\u4e95\u53f7\u6ce8\u91ca\u90e8\u5206\u5c31\u662f\u76f4\u63a5\u4ece PMS \u4e0a\u590d\u5236\u8fc7\u6765\u7684\uff0c\u5728\u6b64\u57fa\u7840\u4e0a\u5199\u7528\u4f8b\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\nmusic = DeepinMusicWidget()\nmusic.click_singer_btn_in_music_by_ui()\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\nmusic.click_icon_mode_in_music_by_ui()\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\nmusic.double_click_first_singer_in_singer_icon_view_by_ui()\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\nself.assert_xxx\n \u4f60\u770b\uff0c\u975e\u5e38\u6e05\u695a\u6bcf\u4e00\u6b65\u5728\u505a\u4ec0\u4e48\uff0c\u91cd\u70b9\u662f\u7701\u53bb\u4e86\u5199\u6ce8\u91ca\u7684\u65f6\u95f4\uff0c\u771f\u7684\u7092\u9e21\u65b9\u4fbf\u3002 \u4e0d\u5199 if __name__ == '__main__':\uff0c\u4e0d\u5199\u591a\u4f59\u7684\u4ee3\u7801\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3","title":"3. \u6570\u636e\u9a71\u52a8","text":" \u5982\u679c\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u662f\u76f8\u540c\u7684\uff0c\u53ea\u662f\u4e00\u4e9b\u53c2\u6570\u53d8\u5316\uff0c\u5c3d\u91cf\u4f7f\u7528\u6570\u636e\u9a71\u52a8\u6765\u5b9e\u73b0\u7528\u4f8b\uff1b \u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u6570\u636e\u9a71\u52a8\u7684\u6570\u636e\uff0c\u4e0d\u80fd\u56e0\u6b64\u5f15\u5165\u4f9d\u8d56\uff0c\u5c3d\u91cf\u4f7f\u7528\u4e00\u4e9b\u6807\u51c6\u5e93\u80fd\u8bfb\u53d6\u7684\u6587\u4ef6\u683c\u5f0f\uff0c\u6bd4\u5982 json\u3001ini\u3001CSV\u3001xml\u3001txt \u7b49\u6587\u4ef6\u683c\u5f0f\uff1b\u4e0d\u5efa\u8bae\u4f7f\u7528 Yaml\u3001Excel\u3001MySQL \u7b49\u6570\u636e\u683c\u5f0f\uff1b \u8bfb\u53d6\u6570\u636e\u65f6\u4e5f\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff0c\u5982\u4f7f\u7528 pandas \u5904\u7406 CSV \u5c31\u5c5e\u4e8e\u5927\u6750\u5c0f\u7528\u4e86\uff0c\u6b63\u5e38\u7684\u6570\u636e\u9a71\u52a8\u8fd8\u6ca1\u5230\u9700\u8981\u5927\u6570\u636e\u5206\u6790\u6765\u5904\u7406\u7684\u5730\u6b65\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u5728 widget/ddt/ \u76ee\u5f55\u4e0b\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5199\u6cd5\uff1a @pytest.mark.parametrize(\"value\", data)\ndef test_smb_049(self, value):\n \u4ee5\u4e0a\u8fd9\u79cd\u53c2\u6570\u5316\u7684\u5199\u6cd5\u672c\u8eab\u6ca1\u4ec0\u4e48\u95ee\u9898\uff0c\u4f46\u662f\uff0c\u8fd9\u91cc\u5fc5\u987b\u8981\u8865\u5145\u4e00\u4e2a\u6ca1\u6709\u7528\u7684\u5c0f\u77e5\u8bc6\uff1a \u5982\u679c\u53c2\u6570\u5316\u6570\u636e\u91cc\u9762\u7684\u5b57\u7b26\u4f1a\u539f\u5c01\u4e0d\u52a8\u7684\u8f93\u51fa\u5230 item.name \u91cc\u9762\uff0c\u663e\u793a\u975e\u5e38\u4e0d\u4f18\u96c5\uff0c\u800c\u4e14\u53ef\u4ee5\u4f1a\u5f15\u5165\u4e00\u4e9b\u610f\u60f3\u4e0d\u5230\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u611f\u53d7\u4e00\u4e0b\uff1a \u53c2\u6570\uff1a data = [\n\"\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\", \"qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678\",\n]\n \u73b0\u8c61\u662f\u8fd9\u6837\u8272\u513f\u7684\uff1a test_smb_049.py::TestFileManager::test_smb_049[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09]\ntest_smb_049.py::TestFileManager::test_smb_049[qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui]\ntest_smb_049.py::TestFileManager::test_smb_049[12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678]\n \u8bf4\u5b9e\u8bdd\uff0c\u770b\u7740\u5fc3\u91cc\u5835\u5f97\u614c\uff0c\u5982\u679c\u8fd9\u91cc\u9762\u5305\u542b\u4e00\u4e9b\u7279\u6b8a\u5b57\u7b26\u6216\u8005\u662f\u8d85\u957f\uff0c\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u5f88\u5947\u5999\u7684\u4e8b\u60c5\u53d1\u751f\u3002 parametrize \u91cc\u9762\u6709\u4e2a\u53c2\u6570\uff1aids\uff0c\u53ef\u4ee5\u89e3\u51b3\u6b64\u7c7b\u95ee\u9898\uff0c\u5c31\u50cf\u8fd9\u6837\uff1a @pytest.mark.parametrize(\"value\", data, ids=[1, 2, 3])\ndef test_smb_049(self, value):\n \u518d\u6765\u611f\u53d7\u4e00\u4e0b\uff1a test_smb_049.py::TestFileManager::test_smb_049[1]\ntest_smb_049.py::TestFileManager::test_smb_049[2]\ntest_smb_049.py::TestFileManager::test_smb_049[3]\n \u660e\u663e\u597d\u591a\u4e86\uff0c\u6240\u4ee5\u5c3d\u91cf\u4f7f\u7528 ids \u8fd9\u4e2a\u53c2\u6570\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 fixture \u7684\u6570\u636e\u9a71\u52a8\u65b9\u5f0f\uff0c\u6846\u67b6\u867d\u7136\u652f\u6301\uff0c\u4f46\u53ef\u8bfb\u6027\u6bd4\u8f83\u5dee\uff1b\u5982\u679c\u4f60\u4e0d\u77e5\u9053\u8fd9\u53e5\u8bdd\u5728\u8bf4\u5565\uff0c\u90a3\u4f60\u53ef\u4ee5\u5ffd\u7565\uff0c\u6211\u4e5f\u4e0d\u6253\u7b97\u8be6\u7ec6\u8bf4\u8fd9\u79cd\u5b9e\u73b0\u65b9\u5f0f\uff0c\u64cd\u4f5c\u6bd4\u8f83\u9a9a\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4","title":"4. \u65ad\u8a00\u8d44\u6e90","text":" \u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u76f4\u63a5\u653e\u5728\u7528\u4f8b\u6a21\u5757\u7684\u540c\u7ea7\u76ee\u5f55\u4e0b\u7684 assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0 + \u7528\u4f8b ID \u547d\u540d\uff1b \u56fe\u50cf\u8bc6\u522b\u65ad\u8a00\uff0c\u4e0d\u8981\u622a\u53d6\u4e00\u5f20\u5f88\u5927\u7684\u56fe\uff0c\u56fe\u7247\u8d44\u6e90\u5305\u542b\u7684\u5143\u7d20\u592a\u591a\u4e86\uff0c\u975e\u5e38\u5bb9\u6613\u53d7\u5230\u9700\u6c42\u5f71\u54cd\uff0c\u5efa\u8bae\u662f\u8fdb\u884c\u5c40\u90e8\u7684\u65ad\u8a00\uff1b \u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u5339\u914d\u5ea6\u662f 0.9\uff0c\u5982\u679c\u65ad\u8a00\u7684\u573a\u666f\u5bf9\u4e8e\u7cbe\u786e\u5ea6\u8981\u6c42\u6ca1\u90a3\u4e48\u9ad8\uff0c\u53ef\u4ee5\u5728\u65ad\u8a00\u8bed\u53e5\u91cc\u9762\u4f20\u5165\u5c0f\u4e8e 0.9 \u7684\u53c2\u6570\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5","title":"5. \u5143\u7d20\u5b9a\u4f4d","text":" \u7528\u4e8e\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u4e2d\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u547d\u540d\u4e3a\u8be5\u5143\u7d20\u7684\u540d\u79f0\uff1b \u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u622a\u53d6\u65f6\u5c3d\u91cf\u7cbe\u786e\u5230\u8fd9\u4e2a\u5177\u4f53\u7684\u6309\u94ae\uff0c\u56fe\u7247\u4e5f\u4e0d\u8981\u592a\u5927\uff1b \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u64cd\u4f5c\u8f83\u5feb\uff0c\u5408\u7406\u52a0\u5165\u7b49\u5f85\u65f6\u95f4\u80fd\u63d0\u9ad8\u7528\u4f8b\u7684\u7a33\u5b9a\u6027\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6","title":"6. \u7528\u4f8b\u8d44\u6e90","text":" \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u4f7f\u7528\u5230\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u6bd4\u5982\u97f3\u4e50\u53ef\u80fd\u9700\u8981\u4e00\u4e9b mp3 \u7684\u8d44\u6e90\u7528\u4e8e\u6d4b\u8bd5\uff0c\u5b58\u653e\u5728 widget/case_res \u76ee\u5f55\u4e0b\uff0c\u524d\u63d0\u662f\u8fd9\u4e9b\u8d44\u6e90\u4e0d\u8d85\u8fc7 10M\uff1b \u5982\u679c\u662f\u4e00\u4e9b\u6bd4\u8f83\u5927\u7684\u8d44\u6e90\uff0c\u5efa\u8bae\u653e\u5230\u7edf\u4e00\u7684 ftp \u670d\u52a1\u5668 \uff08ftp://10.8.10.245\uff09\uff0c\u9700\u8981\u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\u518d\u4e0b\u8f7d\u4e0b\u6765\uff1b f\"wget ftp://{Config.FTP_IP}/uploads/\u591a\u5a92\u4f53/\u5f71\u9662/auto/{file_name};unzip {file_name};rm -rf {file_name};\"\n \u6d4b\u8bd5\u8d44\u6e90\u4e0b\u8f7d\u5230\u5e94\u7528 widget/case_res \u76ee\u5f55\u4e0b\uff1b \u7981\u6b62\u5c06\u6d4b\u8bd5\u8d44\u6e90\u5b58\u653e\u5728\u4e2a\u4eba\u7684\u673a\u5668\u4e0a\uff1b \u5e94\u8be5\u5c3d\u91cf\u4fdd\u8bc1\uff0c\u4e00\u4e2a\u8d44\u6e90\u5728\u4e00\u6b21\u7528\u4f8b\u6267\u884c\u4e2d\u53ea\u9700\u8981\u4e0b\u8f7d\u4e00\u6b21\uff0c\u6240\u4ee5\u4f60\u4e0d\u80fd\u6bcf\u6b21\u4f7f\u7528\u7684\u65f6\u5019\u90fd\u53bb\u4e0b\u8f7d\uff0c\u8fd9\u6837\u53ef\u80fd\u4f1a\u8017\u8d39\u5927\u91cf\u7684\u7f51\u7edc\u8d44\u6e90\uff0c\u800c\u56e0\u4e3a\u5148\u5224\u65ad\u672c\u5730\u662f\u5426\u5b58\u5728\u6b64\u8d44\u6e90\uff0c\u5982\u679c\u4e0d\u5b58\u5728\u518d\u53bb\u4e0b\u8f7d\uff1b \u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u5c06\u8d44\u6e90\u62f7\u8d1d\u5230\u5bf9\u5e94\u7684\u6d4b\u8bd5\u76ee\u5f55\u4e0b\uff0c\u6bd4\u5982\u5c06 mp3 \u6587\u4ef6\u62f7\u8d1d\u5230 ~/Music \u76ee\u5f55\u4e0b\uff0c\u4f46\u662f\u6211\u4eec\u66f4\u5efa\u8bae\u4f60\u4f7f\u7528\u53d1\u9001\u5feb\u6377\u94fe\u63a5\u7684\u65b9\u5f0f\u66ff\u4ee3\u62f7\u8d1d\u7684\u64cd\u4f5c\uff0c\u56e0\u4e3a\u5728\u62f7\u8d1d\u5927\u6587\u4ef6\u65f6\u662f\u5f88\u6d88\u8017\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u800c\u521b\u5efa\u94fe\u63a5\u5219\u4e0d\u4f1a\uff1b @classmethod\ndef recovery_many_movies_in_movie_by_cmd(cls):\n\"\"\"\u6062\u590d\u591a\u4e2a\u89c6\u9891\u6587\u4ef6\u81f3\u89c6\u9891\u76ee\u5f55\u4e2d\"\"\"\nwork_path = f\"/home/{Config.USERNAME}/Videos/auto\"\ncode_path = f\"{Config.CASE_RES_PATH}/auto\"\ncls.run_cmd(f\"rm -rf {work_path};mkdir {work_path}\")\nsleep(1)\nflag = False\nif not exists(code_path):\ncls.run_cmd(f\"mkdir -p {code_path}\")\nflag = True\nlogger.info(f\"ln -s {code_path}/* {work_path}/\")\ncls.run_cmd(\nf\"cd {code_path}/;\"\nf\"{cls.wget_file('auto.zip') if flag else ''}\"\nf\"ln -s {code_path}/* {work_path}/ > /dev/null 2>&1\"\n)\n \u8d44\u6e90\u4e0b\u8f7d\u8fc7\u7a0b\u4e2d\u6ce8\u610f\u8d85\u65f6\u7684\u95ee\u9898\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u5f88\u5927\uff0c\u8981\u7279\u522b\u6ce8\u610f\u8fd9\u95ee\u9898\uff0c\u5982\u679c\u4f60\u4f7f\u7528\u5f3a\u5236\u7b49\u5f85\u4e0b\u8f7d\u7ed3\u675f( os.system )\uff0c\u53ef\u80fd\u4f1a\u9020\u6210\u7528\u4f8b\u6267\u884c\u65f6\u957f\u53d8\u5f97\u4e0d\u53ef\u63a5\u53d7\uff0c\u76ee\u524d\u6211\u4eec\u53d1\u73b0\u5728\u6301\u7eed\u96c6\u6210\u73af\u5883\u6267\u884c\u65f6\u7f51\u7edc\u4e0b\u8f7d\u901f\u5ea6\u5f88\u6162\uff0c\u6240\u4ee5\u8d85\u65f6\u673a\u5236\u662f\u5f88\u6709\u5fc5\u8981\u7684\uff1brun_cmd \u65b9\u6cd5\u6709\u4e00\u4e2a\u9ed8\u8ba4\u8d85\u65f6\u7684\u65f6\u95f4\uff0c\u4f60\u53ef\u4ee5\u6839\u636e\u8d44\u6e90\u5927\u5c0f\u5bf9\u8d85\u65f6\u65f6\u95f4\u8fdb\u884c\u8c03\u6574\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_5","title":"\u516d\u3001\u7528\u4f8b\u8c03\u8bd5\u6280\u5de7","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_4","title":"1. \u65e5\u5fd7","text":" \u4e00\u5b9a\u8981\u5148\u770b\u62a5\u9519\uff0c\u770b error \u65e5\u5fd7\uff0c\u901a\u5e38\u80fd\u660e\u786e\u7684\u544a\u8bc9\u4f60\u5177\u4f53\u54ea\u91cc\u4ee3\u7801\u62a5\u9519\uff1b \u7ed3\u5408\u62a5\u9519\u70b9\u524d\u9762\u7684error\u3001 info \u548c debug \u65e5\u5fd7\u770b\u5426\u662f\u6b63\u5e38\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_4","title":"2. \u65ad\u70b9\u8c03\u8bd5","text":" \u65b9\u6cd5\u62a5\u9519\uff1a \u5728\u65b9\u6cd5\u5e93\u4e2d\u627e\u5230\u5bf9\u5e94\u7684\u65b9\u6cd5\uff0c\u5355\u72ec\u8c03\u7528\uff0c\u770b\u662f\u5426\u80fd\u6b63\u5e38\u6267\u884c\uff1b \u901a\u5e38\u5355\u4e2a\u65b9\u6cd5\u7684\u6267\u884c\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u62a5\u9519\uff0c\u5f88\u5feb\u5c31\u80fd\u6392\u67e5\u51fa\u95ee\u9898\uff1b\u5728\u65b9\u6cd5\u5185\u90e8\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u65b9\u6cd5\u5185\u90e8\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u8c03\u7528\u6ca1\u95ee\u9898\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u62a5\u9519\u7684\u65b9\u6cd5\u524d\u9762\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u7528\u4f8b\u7684\u4e1a\u52a1\u903b\u8f91\u548c\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u65ad\u8a00\u62a5\u9519\uff1a \u65ad\u8a00\u4e3a\u6570\u636e\u65ad\u8a00\uff0c\u6839\u636e\u8868\u8fbe\u5f0f\u8fdb\u884c\u65ad\u8a00\u8bed\u53e5\u8fdb\u884c\u4fee\u6539\uff1b \u6587\u4ef6\u751f\u6210\u7c7b\u65ad\u8a00\uff0c\u67e5\u770b\u662f\u5426\u9700\u8981\u52a0\u7b49\u5f85\u65f6\u95f4\uff1b \u56fe\u50cf\u65ad\u8a00\uff0c\u5728\u65ad\u8a00\u8bed\u53e5\u5904\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u7528\u4f8b\u8fd0\u884c\u5230\u65ad\u8a00\u5904\u4f1a\u505c\u6b62\uff0c\u67e5\u770b\u6b64\u65f6\u65ad\u8a00\u7684\u56fe\u7247\u4e0e\u7528\u4f8b\u6267\u884c\u7684\u73b0\u573a\u5b58\u5728\u4ec0\u4e48\u5dee\u5f02\uff0c\u6b64\u65f6\u4e5f\u53ef\u4ee5\u8fdb\u884c\u91cd\u65b0\u622a\u56fe\uff0c\u4ece\u800c\u66ff\u6362\u65b0\u7684\u56fe\u7247\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3_1","title":"3. \u8fdc\u7a0b\u6267\u884c","text":" \u8fdc\u7a0b\u6267\u884c\u6307\u7684\u662f\u7f16\u8f91\u5668\u901a\u8fc7\u6307\u5b9a\u8fdc\u7a0b\u89e3\u91ca\u5668\u6267\u884c\u81ea\u52a8\u5316\u4ee3\u7801\uff1b \u8fdc\u7a0b\u6267\u884c\u7684\u597d\u5904\u662f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u7684 Debug \u8fd0\u884c\uff0c\u4e0d\u7528\u5728\u6d4b\u8bd5\u673a\u4e0a\u6253\u5f00\u7f16\u8f91\u5668\uff0c\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u66f4\u5feb\uff1b \u652f\u6301\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u7684\u7f16\u8f91\u5668\uff1a \u4e13\u4e1a\u7248 Pycharm VScode \uff0c\u9700\u8981\u4f7f\u7528\u63d2\u4ef6 Remote-SSH \u8fdc\u7a0b\u6267\u884c\u914d\u7f6e \u4ee5 Pycharm \u4e3a\u4f8b\uff1a File \u2014> Settings \u2014> Project \u2014> Python Interpreter \u2014> \u53f3\u8fb9\u8bbe\u7f6e\u6309\u94ae \u2014> Add... \u2014> SSH Interpreter \u2014> New server configuration(\u586b\u5165host\u548cusername) \u2014> Next \u2014> password\uff08\u6d4b\u8bd5\u673a\u5bc6\u7801\uff09 \u2014> Interpreter(\u9009\u62e9\u8fdc\u7a0b\u89e3\u91ca\u5668) \u2014> Finish "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4_1","title":"4. \u73af\u5883\u6e05\u7406","text":" \u5982\u679c\u7528\u4f8b\u91cc\u9762\u7684 teardown \u6ca1\u6709\u6267\u884c\uff0c\u5927\u6982\u7387\u662f\u56e0\u4e3a setup \u91cc\u9762\u4ee3\u7801\u62a5\u9519\uff0c\u8fd9\u4e24\u4e2a\u662f\u4e00\u5bf9\u7684\uff0csetup \u91cc\u9762\u62a5\u9519\uff0cteardown \u91cc\u9762\u7684\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\uff1b \u76ee\u524d\u6211\u4eec\u5df2\u7ecf\u5c06\u5404\u5e94\u7528\u7684 clean_all \u8fd9\u4e2a fixture \u6539\u6210\u4e86\u7ec8\u7ed3\u5668\uff0c\u786e\u4fdd\u59cb\u7ec8\u80fd\u6267\u884c\u5230\u8fd9\u6b65\uff0c\u4f46\u662f\u7528\u4f8b\u91cc\u9762\u7684 fixture\uff0c\u8fd8\u662f\u9700\u8981\u6211\u4eec\u5c0f\u5fc3\u5904\u7406\uff1b \u8981\u6267\u884c clean_all \u9700\u8981\u5728\u7f16\u8f91\u5668\u8fd0\u884c\u53c2\u6570\u52a0 --clean yes\uff0c\u5199\u7528\u4f8b\u7684\u65f6\u5019\u8bf7\u52a0\u4e0a\uff0c\u4e0d\u7136\u4f60\u4e0d\u786e\u5b9a\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u7684\u73af\u5883\u662f\u5426\u6062\u590d\uff1b setup \u53ef\u4ee5\u4e0d\u8981\uff0c\u5c06 setup \u653e\u5230\u7528\u4f8b\u91cc\u9762\u662f\u4e00\u79cd\u7a33\u59a5\u7684\u505a\u6cd5\uff0cteardown \u4e00\u5b9a\u8981\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5_1","title":"5. \u5143\u7d20\u5b9a\u4f4d\u4e0d\u51c6\uff08\u5750\u6807\u8fd4\u56de\u4e0d\u5bf9\uff09","text":" \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u53ef\u80fd\u53d7\u5230\u7a97\u53e3 ID \u7684\u53d8\u5316\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u9ed8\u8ba4\u53d6\u6700\u65b0\u7684\u4e00\u4e2a\u7a97\u53e3\u7528\u4e8e\u5b9a\u4f4d\uff0c\u4f46\u5982\u679c\u5b9e\u9645\u9700\u8981\u5b9a\u4f4d\u7684\u4e0d\u662f\u6700\u65b0\u7684\u7a97\u53e3\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u91cd\u65b0\u5b9e\u4f8b\u5316\u65b9\u6cd5\u7c7b\u5bf9\u8c61\uff0c\u5e76\u5728\u7c7b\u4e2d\u4f20\u5165\u5bf9\u5e94\u7684\u7a97\u53e3\u5e8f\u53f7\uff1b \u57fa\u4e8e\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u76ee\u524d\u9047\u5230\u7684\u7b14\u8bb0\u672c\u4e0a\uff0c\u7531\u4e8e\u5c4f\u5e55\u7f29\u653e\u6bd4\u4f8b\u4e3a 1.25\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u6211\u4eec\u9ed8\u8ba4\u4f7f\u7528\u7f29\u653e\u6bd4\u4f8b\u4e3a 1\uff1b \u57fa\u4e8e\u56fe\u50cf\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u76ee\u6807\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b \u57fa\u4e8e OCR \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u6587\u5b57\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u540c\u6837\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6_1","title":"6. \u952e\u9f20\u64cd\u4f5c\u4e0d\u51c6","text":" \u9f20\u6807\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6bd4\u5982\u53f3\u952e\u3001\u53cc\u51fb\u65e0\u54cd\u5e94\uff1b \u952e\u76d8\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6216\u8005\u5ef6\u8fdf\u8f93\u5165\uff0c\u6bd4\u5982\u7528\u4f8b\u9700\u8981\u8f93\u5165\u201c\u6211\u662f\u4e2d\u56fd\u4eba\u201d\uff0c\u5b9e\u9645\u53ea\u8f93\u5165\u4e86\u201c\u6211\u56fd\u4eba\u201d\uff1b \u4ee5\u4e0a\u95ee\u9898\u6392\u9664\u5e94\u7528\u5361\u987f\u7b49\u95ee\u9898\uff0c\u5927\u6982\u7387\u662f\u7531\u4e8e\u5de5\u5177\u7684\u95ee\u9898\uff0c\u76ee\u524d\u952e\u9f20\u64cd\u4f5c\u6211\u4eec\u4f7f\u7528\u4e09\u4e2a\u5de5\u5177\uff1aDogtail \u63d0\u4f9b\u7684\u952e\u9f20\u5de5\u5177\u3001PyAutoGUI\u3001Xdotool \uff1b \u6709\u540c\u5b66\u53ef\u80fd\u8981\u8bf4\u4e3a\u5565\u8981\u7528\u4e09\u4e2a\u554a\uff0c\u7528\u4e00\u4e2a\u4e0d\u5c31\u597d\u4e86\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u5404\u6709\u4f18\u70b9\u5404\u6709\u7f3a\u70b9\u3002 \u5982\u679c\u4f60\u9047\u5230\u952e\u9f20\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u8bd5\u8bd5\u901a\u8fc7\u4e0d\u540c\u7684\u5de5\u5177\u64cd\u4f5c\uff1b\u952e\u76d8\u8f93\u5165\u5ef6\u8fdf\u7684\u95ee\u9898\uff0c\u4e00\u822c\u662f\u56e0\u4e3a\u8f93\u5165\u901f\u5ea6\u592a\u5feb\u4e86\uff0c\u7cfb\u7edf\u6ca1\u53cd\u5e94\u8fc7\u6765\uff0c\u5e38\u89c1\u4e8e ARM \u548c MIPS \u4e0a\uff0c\u4fee\u6539\u53c2\u6570 delay_time \u7684\u503c\uff0c\u5355\u4f4d\u4e3a\u6beb\u79d2\uff1b # mouse_key.py\n@classmethod\ndef input_message(cls, message, delay_time=300, interval=0.2):\n\"\"\"\n \u8f93\u5165\u5b57\u7b26\u4e32\n :param message: \u8f93\u5165\u7684\u5185\u5bb9\n :param delay_time: \u5ef6\u8fdf\u65f6\u95f4\n :param interval:\n :return:\n \"\"\"\n \u5982\u679c\u4e0d\u662f\u65b9\u6cd5\u7684\u95ee\u9898\uff0c\u5219\u9700\u8981\u7ee7\u7eed\u548c\u5f00\u53d1\u4e00\u8d77\u6392\u9664\uff0c\u662f\u5426\u4e3a\u5e94\u7528\u63a5\u53d7\u952e\u9f20\u4fe1\u53f7\u5904\u7406\u7684\u95ee\u9898\uff0c\u8fd9\u7c7b\u60c5\u51b5\u6211\u4eec\u4e5f\u662f\u9047\u5230\u8fc7\u7684\uff0c\u5177\u4f53\u95ee\u9898\u5177\u4f53\u5206\u6790\u3002 \u6bd4\u5982\u5f71\u9662\u5c31\u91cd\u5199\u4e86\u4e00\u4e2a\u53f3\u952e\u7684\u65b9\u6cd5\uff1a # base_widget.py\n@classmethod\ndef right_click(cls, _x=None, _y=None):\n\"\"\"\n \u91cd\u5199\u5e95\u5c42\u5355\u51fb\u9f20\u6807\u53f3\u952e\n \u89e3\u51b3\u5f71\u9662\u53f3\u952e\u89e6\u53d1release\u4e8b\u4ef6\u7684\u95ee\u9898\uff08\u53f3\u952e\u4e3b\u7a97\u53e3\u4f1a\u64ad\u653e\u89c6\u9891\uff09\n \"\"\"\ncls.mouse_down(_x, _y, button=3)\nsleep(0.1)\ncls.mouse_up(button=3)\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_6","title":"\u4e03\u3001\u5176\u4ed6\u4e0d\u4e3a\u4eba\u77e5\u7684\u7ec6\u8282","text":" \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u5c3d\u91cf\u7f16\u5199\u540c\u4e00\u4e2a\u5e94\u7528\u6216\u6a21\u5757\u7684\u7528\u4f8b\uff0c\u80fd\u5bf9\u8be5\u7528\u4f8b\u5df2\u6709\u65b9\u6cd5\u719f\u6089\uff0c\u907f\u514d\u8fc7\u591a\u91cd\u590d\u4e1a\u52a1\u4ee3\u7801\u7684\u5c01\u88c5\uff1b \u76f8\u540c\u7684\u573a\u666f\u4e0b\uff0c\u5404\u67b6\u6784\u7b49\u5f85\u65f6\u95f4\u4e0d\u540c\uff0c\u5efa\u8bae\u4f7f\u7528\u6846\u67b6\u63d0\u4f9b\u7684 sleep\uff0c\u6211\u4eec\u505a\u4e86\u4e0d\u540c\u67b6\u6784\u7684\u500d\u6570\u653e\u5927\uff1b \u7f16\u5199\u7528\u4f8b\u65f6\uff0c\u5c3d\u91cf\u8003\u8651\u5230\u6bcf\u4e00\u6b65\u5f02\u5e38\u540e\u7684\u73af\u5883\u6062\u590d\uff0c\u9700\u8981\u5efa\u8bae\u8fd9\u79cd\u610f\u8bc6\uff0c\u968f\u65f6\u8981\u8003\u8651\u5230\uff0c\u8fd9\u6b65\u64cd\u4f5c\u6709\u6ca1\u6709\u53ef\u80fd\u51fa\u9519\uff0c\u51fa\u9519\u4e86\u6539\u600e\u4e48\u529e\uff1b \u63d0\u4ea4\u4ee3\u7801\u7684\u65f6\u5019\u6ce8\u610f\u4e0d\u8981\u628a\u4e00\u4e9b\u4e34\u65f6\u7684\u6d4b\u8bd5\u8d44\u6e90\u63d0\u4ea4\u8fdb\u53bb\u4e86\uff0c\u6bd4\u5982\u6d4b\u8bd5\u4e86\u4e00\u4e2a\u5f71\u7247\uff0c\u6709\u4e9b\u540c\u5b66\u4e60\u60ef\u4f7f\u7528 git add . \uff0c\u7136\u540e\u5c31\u5168\u90e8\u63d0\u4ea4\u5230\u4ee3\u7801\u4ed3\u5e93\u4e86\uff0c\u8fd9\u6837\u5373\u4f7f\u540e\u671f\u628a\u5927\u6587\u4ef6\u5220\u4e86\uff0c.git \u6587\u4ef6\u91cc\u9762\u4e5f\u4f1a\u5f88\u5927\uff0c\u9020\u6210\u4ee3\u7801\u4ed3\u5e93\u53d8\u5f97\u5341\u5206\u81c3\u80bf\u3002 \u66f4\u591a\u7ec6\u8282\u67e5\u770b\uff1a\u300aAT\u7ecf\u9a8c\u603b\u7ed3\u300b"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/","title":"AT \u6267\u884c\u5668\u4f7f\u7528\u6307\u5317","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/5/25\n# Author : litao\n# =============================================\n Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1","title":"1\u3001\u529f\u80fd\u4ecb\u7ecd","text":" \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7cfb\u7edf\u8bed\u8a00\u8bbe\u7f6e\uff0c\u5206\u8fa8\u7387\u8bbe\u7f6e\u53ca\u7528\u4f8b\u6267\u884c\u73af\u5883\u642d\u5efa\uff1b \u652f\u6301 IP \u4e3a 15 \u7f51\u6bb5\u7684 AMD \u67b6\u6784\u6d4b\u8bd5\u673a\u955c\u50cf\u88c5\u673a\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u6307\u5b9a\u5e94\u7528\uff0c\u6307\u5b9a\u8303\u56f4\u6807\u7b7e\u7684\u7528\u4f8b\u6267\u884c\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u72b6\u6001\u68c0\u67e5\uff0c\u662f\u5426\u6709\u6b63\u5728\u8fd0\u884c\u7684\u6d4b\u8bd5\uff1b \u652f\u6301\u914d\u7f6e\u7528\u4f8b\u6267\u884c\u65f6\u957f\uff0c\u9632\u6b62\u4efb\u52a1\u963b\u585e\uff1b \u652f\u6301\u6839\u636e\u5e94\u7528\u7248\u672c\u81ea\u52a8\u67e5\u627e\u5bf9\u5e94\u7684\u7528\u4f8b tag\uff1b \u652f\u6301\u5f02\u5e38\u5904\u7406\u548c\u6d4b\u8bd5\u5b8c\u6210\u7684\u5b9e\u65f6\u6d88\u606f\u901a\u77e5\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2job","title":"2\u3001Job \u4ecb\u7ecd","text":"\u4ee5\u4e0b\u6309\u6267\u884c\u6d41\u7a0b\u7684\u987a\u5e8f\u4ecb\u7ecd\uff0c\u6bcf\u4e00\u6b65\u90fd\u53ef\u4ee5\u5355\u72ec\u6267\u884c\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1_1","title":"1\u3001\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/AT_test/ \u6574\u4e2a\u6d41\u7a0b\u7684\u4e3b\u5165\u53e3\uff0c\u901a\u8fc7\u8fd9\u4e2a\u5165\u53e3\uff0c\u8fde\u540c\u6574\u4e2a\u6d4b\u8bd5\u6d41\u7a0b\uff0c\u955c\u50cf\u88c5\u673a\uff0c\u73af\u5883\u90e8\u7f72\uff0c\u6d4b\u8bd5\u5e94\u7528\u53ca\u751f\u6210\u62a5\u544a\u3002 \u53c2\u6570\u4ecb\u7ecd\uff1a \u6d4b\u8bd5\u673a\uff1a\u6240\u6709\u89c4\u6574\u5230\u56fa\u5b9a\u533a\u57df\u7684\u6d4b\u8bd5\u673a\uff0c\u901a\u8fc7\u6d4b\u8bd5\u540c\u5b66\u5bf9\u6d4b\u8bd5\u673a\u7684\u4e60\u60ef\u547d\u540d\uff0c\u5728\u540e\u53f0\u6620\u5c04\u6d4b\u8bd5\u673a\u7684\u8be6\u7ec6\u4fe1\u606f\uff0c\u62ec\u53f7\u4e2d\u4e3a\u6d4b\u8bd5\u673a IP \u7684\u6700\u540e\u4e00\u4f4d\uff1b \u6d4b\u8bd5\u5e94\u7528\uff1a\u6307\u5b9a\u7684\u6d4b\u8bd5\u5e94\u7528\u7684\u5305\u540d\uff0c\u7cfb\u7edf\u6839\u636e\u540d\u79f0\u81ea\u52a8\u62c9\u53d6\u5bf9\u5e94\u7684\u4ed3\u5e93\u4ee3\u7801\uff1b deb\u5305\u4e0b\u8f7d\u5730\u5740\uff1a\u6d4b\u8bd5\u4e0a\u8ff0\u5e94\u7528\u65f6\uff0c\u9700\u8981\u5b89\u88c5\u7684deb\u5305\u4e0b\u8f7d\u5730\u5740\uff0c\u591a\u4e2a\u5730\u5740\u7528\u201c,\u201d\u9694\u5f00\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff1b \u8303\u56f4\u6807\u7b7e\uff1a\u6267\u884c\u6d4b\u8bd5\u7528\u4f8b\u7684\u6807\u7b7e\u8303\u56f4\uff0c\u5bf9\u5e94\u7528\u4f8b\u4ee3\u7801 csv \u6587\u4ef6\u4e2d\u7684\u6807\u7b7e\u4fe1\u606f\uff0c\u4ee5 pytest \u7684mark\u8bed\u6cd5\u7f16\u5199\uff1b \u7cfb\u7edf\u8bed\u8a00\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u8bed\u8a00\u73af\u5883\uff1b \u5206\u8fa8\u7387\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u5206\u8fa8\u7387\u73af\u5883\uff1b \u955c\u50cf\u5730\u5740\uff1a\u955c\u50cf\u4ed3\u5e93\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u901a\u8fc7 PXE \u88c5\u673a\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u88c5\u673a\u73af\u8282\uff08\u76ee\u524d\u4ec5\u652f\u6301\u90e8\u5206 AMD \u67b6\u6784\u7684\u88c5\u673a\uff09\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2pxe","title":"2\u3001PXE \u88c5\u673a","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/IOS_install/ \u8f93\u5165\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\uff0cIP\uff0c\u5bc6\u7801\uff0c\u955c\u50cf\u5730\u5740\u540e\uff0c\u81ea\u52a8\u88c5\u673a\uff0c\u76ee\u524d\u4ec5\u652f\u6301\u56fa\u5b9a 15 \u7f51\u6bb5\u7684\u90e8\u5206 AMD \u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#3","title":"3\u3001\u6b21\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/all_client_test/ \u8be5\u5165\u53e3\u4e0e\u4e3b\u5165\u53e3\u529f\u80fd\u57fa\u672c\u4e00\u81f4\uff0c\u53ea\u662f\u5265\u79bb\u4e86PXE\u88c5\u673a\u6d41\u7a0b\uff0c\u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7684\u6267\u884c\u6d41\u7a0b\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#4","title":"4\u3001\u73af\u5883\u90e8\u7f72","text":"Jenkins url\uff1ahttps://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/env/build?delay=0sec \u8bbe\u7f6e\u6d4b\u8bd5\u673a\u7684\u7cfb\u7edf\u8bed\u8a00\uff0c\u5206\u8fa8\u7387\u53ca\u5b89\u88c5\u6d4b\u8bd5\u6240\u9700\u7684\u4f9d\u8d56\u5305\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#5","title":"5\u3001\u53d1\u9001\u4ee3\u7801","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/send_code/ \u6839\u636e\u6d4b\u8bd5\u5e94\u7528\u540d\u79f0\uff0c\u62c9\u53d6\u5bf9\u5e94\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u5e76\u6839\u636e\u6d4b\u8bd5\u673a\u4e0a\u5e94\u7528\u7248\u672c\u5207\u6362\u5230\u5bf9\u5e94\u7684tag\u7248\u672c\uff0c\u82e5\u672a\u627e\u5230tag\u7248\u672c\uff0c\u5219\u4f7f\u7528\u6700\u65b0\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u518d\u6839\u636e\u5e94\u7528\u5e93\u4ee3\u7801\u4e2d\u914d\u7f6e\u7684\u57fa\u7840\u5e93\u7248\u672c\uff0c\u62c9\u53d6\u57fa\u7840\u5e93\u4ee3\u7801\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#6","title":"6\u3001\u7528\u4f8b\u6267\u884c","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/run_test/ \u8fd0\u884c\u6d4b\u8bd5\u673a\u4e0a\u7684\u7528\u4f8b"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/","title":"AT \u7528\u4f8b\u7b5b\u9009\u6307\u5317","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u7528\u4f8b\u7b5b\u9009\u6807\u51c6\uff0c\u662f\u6311\u9009\u5408\u9002\u7684\u6587\u672c\u7528\u4f8b\u8fdb\u884c\u81ea\u52a8\u5316\u7528\u4f8b\u8f6c\u5316\u7684\u4e00\u4e9b\u901a\u7528\u6807\u51c6\u3002 \u8fc7\u53bb\u6211\u4eec\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u5b9e\u8df5\u8fc7\u7a0b\u4e2d\uff0c\u5199\u4e86\u4e0d\u5c11\u81ea\u52a8\u5316\u7528\u4f8b\uff0c\u968f\u7740\u9700\u6c42\u7684\u8fed\u4ee3\uff0c\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u81ea\u7136\u8150\u5316\uff0c\u56e0\u800c\u9700\u8981\u5728\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\u5bf9\u81ea\u52a8\u5316\u7528\u4f8b\u8fdb\u884c\u7ef4\u62a4\uff0c\u5728\u7ef4\u62a4\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u6211\u4eec\u53d1\u73b0\uff0c\u6709\u4e9b\u7528\u4f8b\u7ef4\u62a4\u8d77\u6765\u592a\u96be\u4e86\uff0c\u8c03\u8bd5\u7528\u4f8b\u8017\u8d39\u5927\u91cf\u65f6\u95f4\uff0c\u6210\u672c\u5f88\u9ad8\u3002 \u56e0\u6b64\uff0c\u6211\u4eec\u603b\u7ed3\u4e00\u4e9b\u81ea\u52a8\u5316\u7528\u4f8b\u9009\u578b\u7684\u6807\u51c6\uff0c\u4ee5\u4f18\u5316\u540e\u7eed\u81ea\u52a8\u5316\u7528\u4f8b\u7ed3\u6784\uff0c\u671f\u5f85\u6211\u4eec\u80fd\u7f16\u5199\u51fa\u9ad8\u6548\u3001\u7a33\u5b9a\u3001\u6613\u4e8e\u7ef4\u62a4\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_1","title":"\u4e00\u3001\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u53ef\u4ee5\u5206\u4e3a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u548c\u4e13\u9879\u81ea\u52a8\u5316\u6d4b\u8bd5\uff0c\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e00\u822c\u53ea\u9488\u5bf9\u4e00\u4e9b\u5e38\u89c4\u7684\u529f\u80fd\u6d4b\u8bd5\uff0c\u5176\u4ed6\u975e\u5e38\u89c4\u529f\u80fd\u7684\u7528\u4f8b\uff0c\u5e94\u8be5\u91c7\u7528\u4e13\u9879\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u6848\uff1b \u4ee5\u4e0b\u662f\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1","title":"1. \u7a33\u5b9a\u6027\u3001\u538b\u6d4b\u7528\u4f8b","text":"\u7a33\u5b9a\u6027\u6d4b\u8bd5\u3001\u538b\u6d4b\u7528\u4f8b\u5e94\u8be5\u662f\u5c5e\u4e8e\u6027\u80fd\u76f8\u5173\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u5982\uff1a\u53cd\u590d\u591a\u6b21\u70b9\u51fb\u6309\u94ae\uff0c\u68c0\u9a8c\u5176\u529f\u80fd\u7a33\u5b9a\u6027\u3002\u56e0\u4e3a\u8fd9\u4e9b\u7528\u4f8b\u65ad\u8a00\u7684\u9884\u671f\u53ef\u80fd\u4e0d\u662f\u5f88\u660e\u786e\uff0c\u66f4\u6709\u751a\u8005\u4e0d\u9700\u8981\u65ad\u8a00\uff0c\u7528\u4f8b\u65f6\u957f\u6bd4\u8f83\u957f\uff0c\u800c\u4e14\u4e0d\u53ef\u63a7\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u76ee\u524d\u6211\u4eec\u6709\u6027\u80fd\u81ea\u52a8\u5316\u7684\u4e13\u9879\u65b9\u6848\uff0c\u4ee5\u53ca\u4e00\u4e9b\u7a33\u5b9a\u6027\u6d4b\u8bd5\u7684\u4e13\u9879\u65b9\u6848\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u6b64\u7c7b\u7528\u4f8b\u653e\u5230\u4e13\u9879\u81ea\u52a8\u5316\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2","title":"2. \u6d89\u53ca\u591a\u4e2a\u7528\u6237\u64cd\u4f5c","text":"\u5e38\u89c1\u4e0e\u6587\u7ba1\u7684\u7528\u4f8b\u4e2d\uff0c\u591a\u7528\u6237\u64cd\u4f5c\u7684\u7528\u4f8b\u4e00\u822c\u90fd\u4f1a\u6d89\u53ca\u5230\u5728\u7cfb\u7edf\u4e2d\u8fdb\u884c\u591a\u4e2a\u7528\u6237\u95f4\u7684\u5207\u6362\uff0c\u81ea\u52a8\u5316\u811a\u672c\u4e00\u822c\u662f\u8fd0\u884c\u5728\u4e00\u4e2a\u7528\u6237\u7a7a\u95f4\u4e0b\u7684\uff0c\u6240\u4ee5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u591a\u7528\u6237\u95f4\u7684\u5207\u6362\u3002 \u6b64\u7c7b\u4e0d\u5efa\u8bae\u91c7\u7528\u81ea\u52a8\u5316\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3","title":"3. \u4e0e\u5f00\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4ea4\u4e92","text":"\u6b64\u7c7b\u573a\u666f\u591a\u4e3a\u5e94\u7528\u7684\u5f02\u5e38\u573a\u666f\u6d4b\u8bd5\uff0c\u6bd4\u5982\uff1a\u590d\u5236\u5927\u6587\u4ef6\u8fc7\u7a0b\u4e2d\u6ce8\u9500\u673a\u5668\u3002 \u81ea\u52a8\u5316\u811a\u672c\u5728\u7cfb\u7edf\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4e4b\u540e\u662f\u4f1a\u505c\u6b62\u8fd0\u884c\u7684\uff1b\u6b64\u7c7b\u7528\u4f8b\u53ef\u4ee5\u505a\u81ea\u52a8\u5316\uff0c\u4f46\u662f\u540c\u6837\u9700\u8981\u505a\u4e13\u9879\u65b9\u6848\uff0c\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u7684\u5904\u7406\u903b\u8f91\u5b8c\u5168\u4e0d\u540c\u3002 \u540e\u7eed\u81ea\u52a8\u5316\u9700\u8981\u516c\u5173\u7684\u70b9\uff1a \u81ea\u52a8\u5316\u811a\u672c\u5728\u672c\u673a\u8fd0\u884c\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u81f3\u5c11\u9700\u8981\u63d0\u4f9b\u4ee5\u4e0b\u529f\u80fd\uff1a \u91cd\u542f\u4e4b\u540e\u7528\u4f8b\u80fd\u81ea\u52a8\u8fd0\u884c\uff1b\u53ef\u4ee5\u8003\u8651\u5c06\u6267\u884c\u7528\u4f8b\u5199\u6210\u4e00\u4e2a\u5f00\u673a\u81ea\u542f\u7684\u670d\u52a1\uff1b \u80fd\u8bb0\u5f55\u5173\u673a\u4e4b\u524d\u7528\u4f8b\u6267\u884c\u7684\u4f4d\u7f6e\uff0c\u91cd\u542f\u4e4b\u540e\u80fd\u4ece\u6b64\u4f4d\u7f6e\u5f00\u59cb\u6267\u884c\uff1b \u50cf\u6027\u80fd\u81ea\u52a8\u5316\u4e00\u6837\uff0c\u7531\u670d\u52a1\u7aef\u63a7\u5236\uff1b \u5b8c\u5168\u57fa\u4e8e\u56fe\u5f62\u8bc6\u522b\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u4e32\u53e3\u7ebf\u63a7\u5236\u952e\u9f20\u7a33\u5b9a\u6027\uff1b "},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4","title":"4. \u6d4b\u8bd5\u6267\u884c\u65f6\u95f4\u957f","text":"\u7528\u4f8b\u6267\u884c\u65f6\u95f4\u63a7\u5236\u57282\u5206\u949f\u4ee5\u5185\uff0c\u6781\u7aef\u60c5\u51b5\u4e0d\u8981\u8d85\u8fc75\u5206\u949f\uff0c\u6240\u6709\u7528\u4f8b\u7684\u5e73\u5747\u65f6\u957f\u5e94\u8be5\u57281\u5206\u949f\u5de6\u53f3\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u95f4\u592a\u957f\uff0c\u7f16\u5199\u7528\u4f8b\u3001\u8c03\u8bd5\u7528\u4f8b\u3001\u6267\u884c\u7528\u4f8b\u3001\u7ef4\u62a4\u7528\u4f8b\u90fd\u975e\u5e38\u7684\u8017\u65f6\uff0c\u4eba\u529b\u6210\u672c\u65f6\u95f4\u6210\u672c\u6295\u5165\u592a\u9ad8\u3002 \u4f60\u60f3\uff0c\u8fd9\u6761\u7528\u4f8b\u6267\u884c\u9700\u89815\u5206\u949f\uff0c\u90a3\u4f60\u5199\u8fd9\u6761\u7528\u4f8b\u7684\u65f6\u95f4\u4e0d\u53ef\u80fd\u4e00\u904d\u8fc7\uff0c\u5199\u7684\u8fc7\u7a0b\u4e2d\u8dd1\u4e0d\u901a\u8fd8\u5f97\u91cd\u8dd1\u81f3\u5c1115\u5206\u949f\u4e0d\u8fc7\u5206\uff0c\u5199\u5b8c\u4e86\u8fd8\u5f97\u5728\u5176\u4ed6\u67b6\u6784\u4e0a\u8c03\u8bd5\uff0c\u534a\u4e2a\u5c0f\u65f6\u8fc7\u53bb\u4e86\uff0c\u8fd9\u8fd8\u53ea\u662f\u7b2c\u4e00\u6b21\u5199\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u540e\u7eed\u5982\u679c\u7528\u4f8b\u7ef4\u62a4\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u7ecf\u5e38\u6295\u5165\u76f8\u5f53\u957f\u65f6\u95f4\uff0c\u8fd9\u6837\u5176\u5b9e\u662f\u5931\u53bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u7684\u3002\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u5c31\u5e94\u8be5\u662f\u5feb\u51c6\u72e0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5","title":"5. \u8fb9\u7f18\u6027\u6d4b\u8bd5","text":"\u6709\u4e9b\u529f\u80fd\u6a21\u5757\u672c\u8eab\u662f\u5c5e\u4e8e\u6bd4\u8f83\u8fb9\u7f18\u6027\u7684\uff0c\u5373\u6781\u5c11\u7528\u6237\u4f1a\u4f7f\u7528\u5230\u7684\u529f\u80fd\uff0c\u8fd9\u7c7b\u529f\u80fd\u6a21\u5757\u4e0d\u9700\u8981\u5927\u89c4\u6a21\u5b9e\u73b0\u81ea\u52a8\u5316\uff0c\u4e00\u4e24\u4e2a\u573a\u666f\u8986\u76d6\u57fa\u672c\u529f\u80fd\u5c31\u884c\u4e86\uff0c\u56e0\u6b64\u6211\u4eec\u5728\u6311\u9009\u6b64\u7c7b\u7528\u4f8b\u7684\u65f6\u5019\u53ef\u4ee5\u7ed3\u5408\u6574\u4e2a\u529f\u80fd\u6a21\u5757\u7684\u8986\u76d6\u60c5\u51b5\u6765\u51b3\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6","title":"6. \u9700\u8981\u4f9d\u8d56\u4eba\u5de5\u4ecb\u5165\u7684","text":"\u81ea\u52a8\u5316\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\u662f\u6ca1\u6709\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bd4\u5982\u8981\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u90a3\u4e48\u5c31\u80cc\u79bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u3002 \u6bd4\u5982\u5149\u9a71\u6a21\u5757\uff0c\u5149\u9a71\u523b\u5f55\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u4f46\u662f\u5149\u9a71\u523b\u5f55\u4e4b\u540e\u5149\u76d8\u4f1a\u5f39\u51fa\u6765\uff0c\u9700\u8981\u4eba\u5de5\u66f4\u6362\u5149\u76d8\uff0c\u518d\u624b\u52a8\u63a8\u8fdb\u5149\u9a71\u4e2d\u3002 \u8fd9\u79cd\u529f\u80fd\u6a21\u5757\u5373\u4f7f\u505a\u81ea\u52a8\u5316\uff0c\u80fd\u6d89\u53ca\u5230\u7684\u529f\u80fd\u975e\u5e38\u6709\u9650\uff0c\u800c\u4e14\u4e0d\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u6240\u4ee5\u660e\u663e\u5c31\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7","title":"7. \u96be\u4ee5\u5b9e\u73b0\u7684","text":"\u7528\u4f8b\u6240\u6d89\u53ca\u5230\u7684\u65b9\u6cd5\u5b9e\u73b0\u8d77\u6765\u53ef\u80fd\u6709\u96be\u5ea6\uff0c\u751a\u81f3\u73b0\u9636\u6bb5\u65e0\u6cd5\u5b9e\u73b0\u7684\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002 \u6bd4\u5982\u5f71\u9662\u6d4b\u8bd5\u753b\u9762\u6e05\u6670\u5ea6\u3001\u6d41\u7545\u5ea6\u3001\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u4e4b\u540e\u7684\u89c6\u9891\u662f\u5426\u5b58\u5728\u5361\u987f\u7b49\u7528\u4f8b\uff0c\u73b0\u9636\u6bb5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#8","title":"8. \u529f\u80fd\u4e0d\u7a33\u5b9a","text":"\u8fd9\u4e2a\u4e0d\u662f\u8bf4\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\uff0c\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\u4e0d\u7a33\u5b9a\u662f\u6b63\u5e38\u7684\uff0c\u8fd9\u79cd\u6211\u4eec\u53ef\u4ee5\u7b49\u5f00\u53d1\u63d0\u6d4b\u4e4b\u540e\u518d\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u3002 \u529f\u80fd\u4e0d\u7a33\u5b9a\u6307\u7684\u662f\u7528\u4f8b\u6240\u6d89\u53ca\u7684\u529f\u80fd\uff0c\u53ef\u80fd\u5b58\u5728\u591a\u79cd\u53d8\u5316\uff0c\u6bcf\u6b21\u6267\u884c\u7528\u4f8b\u53ef\u80fd\u65ad\u8a00\u7684\u9884\u671f\u90fd\u4e0d\u540c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#9","title":"9. \u52a8\u6001\u65ad\u8a00","text":"\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u76f4\u5230\u7528\u4f8b\u7ed3\u675f\uff0c\u4e00\u76f4\u662f\u4e00\u4e2a\u52a8\u6001\u53d8\u5316\u7684\u8fc7\u7a0b\uff0c\u800c\u4e14\u65e0\u6cd5\u901a\u8fc7\u5176\u4ed6\u624b\u6bb5\u505c\u4e0b\u6765\uff1b \u6bd4\u5982\uff1a\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u65f6\uff0c\u53f3\u4e0b\u89d2\u7684\u5f55\u5236\u65f6\u95f4\u662f\u4e00\u76f4\u5728\u53d8\u5316\u7684\uff0c\u7528\u4f8b\u9700\u8981\u6d4b\u8bd5\u5f55\u52361\u5206\u949f\u4e4b\u540e\uff0c\u5f55\u5236\u65f6\u95f4\u662f\u521a\u597d\u505c\u572860\u79d2\uff1b \u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fd8\u505a\u4e0d\u5230\u65f6\u95f4\u7cbe\u51c6\u63a7\u5236\uff0c\u7a0b\u5e8f\u6267\u884c\u65f6\u95f4\u662f\u6709\u6ce2\u52a8\u7684\uff0c\u800c\u4e14\u8981\u9002\u914d\u591a\u4e2a\u5e73\u53f0\uff0c\u6240\u4ee5\u6b64\u7c7b\u7528\u4f8b\u5927\u6982\u7387\u4f1a\u6267\u884c\u5931\u8d25\u3002\u7279\u522b\u662f\u5728\u6027\u80fd\u8f83\u5dee\u7684\u56fd\u4ea7\u5316\u67b6\u6784\u4e0a\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u592a\u53ef\u80fd\u7a33\u5b9a\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#10","title":"10. \u63a2\u7d22\u6027\u6d4b\u8bd5","text":"\u63a2\u7d22\u6027\u6d4b\u8bd5\u901a\u5e38\u662f\u4e00\u4e9b\u4e0d\u786e\u5b9a\u7684\u64cd\u4f5c\uff0c\u591a\u53d8\u5207\u590d\u6742\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u9884\u671f\u4e5f\u53ef\u80fd\u662f\u4e0d\u786e\u5b9a\u7684\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u9a9a\u64cd\u4f5c\u592a\u591a\u4e86\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6b64\u7c7b\u7528\u4f8b\u9002\u5408\u91c7\u7528\u624b\u5de5\u6d4b\u8bd5\uff0c\u662f\u624b\u5de5\u6d4b\u8bd5\u771f\u6b63\u7684\u4ef7\u503c\u4f53\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#11","title":"11. \u6613\u7528\u6027\u6d4b\u8bd5","text":"\u5bf9\u4e8e\u6613\u7528\u6027\u7684\u5224\u65ad\u901a\u5e38\u662f\u4e3b\u89c2\u7684\uff0c\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\u5f88\u96be\u53bb\u5b9a\u4e49\u4ec0\u4e48\u6837\u7684\u60c5\u51b5\u5bf9\u7528\u6237\u662f\u6613\u7528\u7684\uff0c\u81ea\u52a8\u5316\u9700\u8981\u6709\u660e\u786e\u7684\u53ef\u5b9e\u73b0\u7684\u9884\u671f\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_2","title":"\u4e8c\u3001\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u524d\u9762\u8bb2\u4e86\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u4e00\u4e9b\u7528\u4f8b\u60c5\u51b5\uff0c\u6709\u540c\u5b66\u5c31\u8bf4\u4e86\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\u4e0d\u7528\u8bb2\u4e86\uff0c\u5c31\u662f\u4e0d\u9002\u5408\u7684\u53cd\u9762\u3002\u6ca1\u6bdb\u75c5\u54c8\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\uff0c\u6211\u4eec\u5927\u4f53\u8fd8\u53ef\u4ee5\u5206\u4e3a\u4e24\u7c7b\uff1a \u7b2c\u4e00\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u597d\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u7b2c\u4e8c\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u4e00\u822c\uff0c\u9700\u8981\u6295\u5165\u66f4\u591a\u7cbe\u529b\u624d\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u4ee5\u4e0b\u4ecb\u7ecd\u4e00\u4e9b\u6211\u4eec\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1_1","title":"1. \u64cd\u4f5c\u76f8\u5bf9\u7b80\u5355","text":"\u7528\u4f8b\u6b65\u9aa4\u76f8\u5bf9\u8f83\u5c11\uff0c\u8fd9\u79cd\u7528\u4f8b\u901a\u5e38\u662f\u4e00\u4e9b\u8def\u5f84\u5f88\u6d45\u7684\u7528\u4f8b\uff0c\u4e00\u822c\u4e5f\u662f\u4e00\u4e9b\u57fa\u7840\u7528\u4f8b\u3002\u7528\u4f8b\u7f16\u5199\u3001\u7ef4\u62a4\u90fd\u53ef\u4ee5\u8f7b\u677e\u641e\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2_1","title":"2. \u5bb9\u6613\u5b9e\u73b0","text":"\u73b0\u6709\u6280\u672f\u662f\u53ef\u5b9e\u73b0\u7684\uff0c\u6ca1\u6709\u96be\u5ea6\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3_1","title":"3. \u7ecf\u5e38\u7528\u4e8e\u56de\u5f52\u6d4b\u8bd5","text":"\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bcf\u6b21\u56de\u5f52\u6d4b\u8bd5\u5fc5\u987b\u8981\u6267\u884c\u7684\u7528\u4f8b\uff0c\u90a3\u4e48\u8fd9\u6761\u7528\u4f8b\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u3002 \u56de\u5f52\u6d4b\u8bd5\u65f6\u6211\u4eec\u9996\u5148\u5e94\u8be5\u4fdd\u8bc1\u5e94\u7528\u5386\u53f2\u57fa\u672c\u529f\u80fd\u6b63\u5e38\uff0c\u6240\u4ee5\u90a3\u4e9b\u6bcf\u6b21\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u90fd\u8981\u6267\u884c\u7684\u7528\u4f8b\u9002\u5408\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4_1","title":"4. \u529f\u80fd\u7a33\u5b9a\u7684\u6838\u5fc3\u529f\u80fd","text":"\u6d89\u53ca\u6838\u5fc3\u529f\u80fd\u7684\u7528\u4f8b\u662f\u6700\u6700\u91cd\u8981\u7684\u7528\u4f8b\uff0c\u4e5f\u662f\u6211\u4eec\u4ea4\u4ed8\u65f6\u5fc5\u987b\u8981\u4fdd\u8bc1\u8d28\u91cf\u7684\u76f8\u5173\u529f\u80fd\uff0c\u56e0\u6b64\u5e94\u8be5\u5c3d\u53ef\u80fd\u7684\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5_1","title":"5. \u8f93\u5165\u6570\u636e\u6d4b\u8bd5","text":"\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u901a\u5e38\u662f\u68c0\u9a8c\u88ab\u6d4b\u5e94\u7528\u63a5\u53d7\u6709\u6548\u6570\u636e\u3001\u62d2\u7edd\u65e0\u6548\u6570\u636e\u7684\u80fd\u529b\u3002\u5982\uff1a\u63d0\u4ea4\u8d85\u957f\u5b57\u7b26\u4e32\u3001\u7279\u6b8a\u5b57\u7b26\u4e32\u7b49\u7b49\u3002 \u6b64\u7c7b\u7528\u4f8b\u624b\u5de5\u6d4b\u8bd5\u5f88\u96be\u6bd4\u8f83\u5168\u9762\u7684\u8986\u76d6\u5230\u6240\u6709\u7684\u8f93\u5165\u60c5\u51b5\uff0c\u4f46\u662f\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\uff0c\u6b64\u7c7b\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u90fd\u662f\u4e00\u6837\u7684\uff0c\u53d8\u5316\u7684\u4ec5\u662f\u8f93\u5165\u53c2\u6570\u548c\u65ad\u8a00\u7ed3\u679c\uff0c\u91c7\u7528\u6570\u636e\u9a71\u52a8\uff0c\u53ef\u4ee5\u8f7b\u677e\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6_1","title":"6. \u683c\u5f0f\u8986\u76d6","text":"\u539f\u56e0\u540c\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u7c7b\u7528\u4f8b\u4e00\u6837\uff0c\u591a\u79cd\u683c\u5f0f\u7684\u8986\u76d6\u4e5f\u662f\u4e00\u4e2a\u5f88\u7e41\u7410\u7684\u4e8b\u60c5\uff0c\u4ea4\u7ed9\u81ea\u52a8\u5316\u6765\u505a\u518d\u5408\u9002\u4e0d\u8fc7\u4e86\u3002 \u6bd4\u5982\u5f71\u9662\u5bf9\u5f71\u7247\u683c\u5f0f\u7684\u68c0\u67e5\u3001\u622a\u56fe\u5f55\u5c4f\u5bf9\u4fdd\u5b58\u683c\u5f0f\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7_1","title":"7. \u68c0\u67e5\u5143\u7d20\u72b6\u6001","text":"\u67e5\u770b\u88ab\u6d4b\u5e94\u7528\u7684\u5143\u7d20\u5c5e\u6027\u3002\u5982\uff1a\u56fe\u7247\u7684\u5927\u5c0f\u548c\u6392\u5217\uff1b\u6309\u94ae\u7684\u53ef\u7528\u548c\u4e0d\u53ef\u7528\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/","title":"AT \u7ecf\u9a8c\u603b\u7ed3","text":"\u6b22\u8fce\u6240\u6709\u4eba\u63d0\u4ea4\u4f60\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u9762\u7684\u4f18\u79c0\u5b9e\u8df5\u7ecf\u9a8c\uff0c\u4ee5\u5e2e\u52a9\u5927\u5bb6\u89e3\u51b3\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#1","title":"1\u3001\u7ec8\u7ed3\u5668","text":"# litaoa@uniontech.com\n \u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4 pytest \u5b9e\u73b0\u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4\u7684\u65b9\u5f0f\u6709\u4e24\u79cd\uff0cyield \u548c\u7ec8\u7ed3\u51fd\u6570\uff1b yield \u5b9e\u73b0\uff0cyield\u524d\u9762\u4e3a\u7528\u4f8b\u7684\u524d\u7f6e\u6b65\u9aa4\uff0cyield \u540e\u9762\u4e3a\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4\u3002 @pytest.fixture\ndef clean_env():\nprint(\"setup\")\nyield\nprint(\"teardown\")\n \u7ec8\u7ed3\u51fd\u6570\u5b9e\u73b0\uff0c\u4f7f\u7528 request.addfinalizer \u6ce8\u518c\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4 @pytest.fixture\ndef clean_env(request):\ndef clean():\nprint(\"teardown\")\nrequest.addfinalizer(clean)\nprint(\"setup\")\n yield\u7684\u4f18\u7f3a\u70b9\uff1a \u4f18\u70b9\uff1a\u4ee3\u7801\u7b80\u6d01\uff0c\u76f4\u89c2\uff0c\u53ef\u4f7f\u7528yield\u5728\u7528\u4f8b\u4e2d\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c \u7f3a\u70b9\uff1a\u82e5\u524d\u7f6e\u6b65\u9aa4\u4e2d\u51fa\u73b0\u9519\u8bef\uff0c\u5219\u540e\u7f6e\u6b65\u9aa4\u4e0d\u4f1a\u6267\u884c \u7ec8\u7ed3\u51fd\u6570\uff1a \u4f18\u70b9\uff1a\u524d\u7f6e\u6b65\u9aa4\u5931\u8d25\u7684\u8bdd\uff0c\u540e\u7f6e\u6b65\u9aa4\u4ecd\u4f1a\u6267\u884c\u4e14\u53ef\u4ee5\u6ce8\u518c\u591a\u4e2a\u540e\u7f6e\u6b65\u9aa4\uff08\u524d\u63d0\uff1a\u9700\u8981\u5728\u4ee3\u7801\u62a5\u9519\u4e4b\u524d\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff09\uff0c\u652f\u6301\u7075\u6d3b\u4f7f\u7528\u540e\u7f6e\u6761\u4ef6 \u7f3a\u70b9\uff1a\u4ee3\u7801\u8f83\u4e3a\u590d\u6742\uff0c\u65e0\u6cd5\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c\uff08\u672c\u4eba\u76ee\u524d\u672a\u5b9e\u73b0\uff09 \u603b\u7ed3\uff1a\u5728\u524d\u7f6e\u6b65\u9aa4\u4fdd\u8bc1\u7edd\u5bf9\u4e0d\u4f1a\u51fa\u9519\u65f6\uff0c\u4f7f\u7528yield\u66f4\u4f73\u7b80\u4fbf\uff0c\u5f53\u524d\u7f6e\u6b65\u9aa4\u6613\u51fa\u73b0\u95ee\u9898\u65f6\uff0c\u63a8\u8350\u4f7f\u7528\u7ec8\u7ed3\u51fd\u6570\u3002 \u573a\u666f\uff1a\u4fdd\u9669\u7bb1\u7528\u4f8b\uff0c\u524d\u7f6e\u6b65\u9aa4\u4e2d\u5f00\u542f\u4fdd\u9669\u7bb1\uff0c\u540e\u7f6e\u6b65\u9aa4\u5220\u9664\u4fdd\u9669\u7bb1\u3002 @pytest.fixture(scope=\"session\", autouse=True)\ndef vault_fixture(request):\nDfmWidget.reset_vault_by_cmd() # 1\u3001\u91cd\u7f6e\u4fdd\u9669\u7bb1\nDdeDockPublicWidget().close_file_manager_by_cmd() # 2\u3001\u5173\u95ed\u6587\u7ba1\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 3\u3001\u5f00\u542f\u6587\u7ba1\nvault = DfmWidget()\nvault.create_file_vault() # 4\u3001\u521b\u5efa\u4fdd\u9669\u7bb1\ndef delete_vault(): # 8\u3001\u5220\u9664\u4fdd\u9669\u7bb1\u7684\u540e\u7f6e\u6b65\u9aa4\nsleep(2)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr()\nvault = DfmWidget()\nvault.delete_file_vault()\nDfmWidget.reset_vault_by_cmd()\nDdeDockPublicWidget().close_file_manager_by_cmd()\nrequest.addfinalizer(delete_vault) # 5\u3001\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\nDdeDockPublicWidget().close_file_manager_by_cmd() # 6\u3001\u5173\u95ed\u6587\u7ba1\nsleep(1)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 7\u3001\u5f00\u542f\u6587\u7ba1\n \u4ee3\u7801\u6309\u6ce8\u91ca\u4e2d\u7684\u5e8f\u53f7\u6267\u884c\u6b65\u9aa4 \u4ee3\u7801\u5728\u6b65\u9aa41-4\u4efb\u610f\u4f4d\u7f6e\u62a5\u9519\uff0c\u5219\u4e0d\u4f1a\u6267\u884c\u6b65\u9aa48\uff0c\u56e0\u4e3a\u672a\u6267\u884c\u5230\u6b65\u9aa45\uff0c\u6b65\u9aa48\u8fd8\u672a\u6ce8\u518c \u4ee3\u7801\u5728\u6b65\u9aa46-7\u62a5\u9519\uff0c\u4ecd\u4f1a\u6267\u884c\u6b65\u9aa47\uff0c\u56e0\u4e3a\u5728\u6b65\u9aa45\u4e2d\u5df2\u7ecf\u5c06\u6b65\u9aa47\u6ce8\u518c \u53ef\u4ee5\u7075\u6d3b\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff0c\u80fd\u5b9e\u73b0\u67d0\u4e2a\u524d\u7f6e\u6b65\u9aa4\u6267\u884c\u4e4b\u540e\uff0c\u624d\u4f1a\u6267\u884c\u540e\u7f6e\u6b65\u9aa4\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#2","title":"2\u3001\u542f\u52a8\u5e94\u7528\u7684\u65b9\u5f0f","text":"# huangmingqiang@uniontech.com\n \uff081\uff09\u547d\u4ee4\u884c\u542f\u52a8 \u5728 AT \u4ee3\u7801\u4e2d\u4f7f\u7528\u547d\u4ee4\u884c\u542f\u52a8\u5e94\u7528\uff0c\u4e3e\u4f8b\uff1a os.popen(\"deepin-music\")\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f7f\u7528 ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6\uff0cdogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u3002 \uff082\uff09\u901a\u8fc7 UI \u64cd\u4f5c\u542f\u52a8 \u901a\u8fc7\u4efb\u52a1\u680f\u3001\u542f\u52a8\u5668\u3001\u684c\u9762\u7b49UI\u65b9\u5f0f\u542f\u52a8\uff0c\u6bd4\u5982\u53cc\u51fb\u6253\u5f00\u3001\u53f3\u952e\u6253\u5f00\u7b49\uff0c\u8fd9\u79cd\u64cd\u4f5c\u65b9\u5f0f\u4e0d\u5b58\u5728ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6dogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u7684\u95ee\u9898\uff0c\u4e5f\u66f4\u52a0\u7b26\u5408\u7528\u6237\u7684\u64cd\u4f5c\u884c\u4e3a\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#3","title":"3\u3001\u6587\u4ef6\u9009\u62e9\u6846\u5c5e\u6027\u5b9a\u4f4d\u5076\u73b0\u65e0\u6cd5\u627e\u5230","text":"\u6587\u4ef6\u9009\u62e9\u6846\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5728\u8c03\u7528\u6587\u4ef6\u9009\u62e9\u6846\u65f6\uff0c\u6709\u4e00\u5b9a\u7684\u6982\u7387\u51fa\u73b0\uff0c\u754c\u9762\u5df2\u7ecf\u6e32\u67d3\u51fa\u6765\u4e86\uff0c\u4f46\u662f\u5c5e\u6027\u6811\u5e76\u6ca1\u6709\u5199\u5165\uff0c\u5bfc\u81f4\u901a\u8fc7\u5c5e\u6027\u65e0\u6cd5\u627e\u5230\u5143\u7d20\uff0c\u76ee\u524d\u4e5f\u6ca1\u6709\u5f88\u597d\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u4e3a\u4e86\u7528\u4f8b\u7a33\u5b9a\u6027\uff0c\u6587\u4ef6\u9009\u62e9\u6846\u7684\u64cd\u4f5c\u5efa\u8bae\u4f7f\u7528UI\u6216\u8005\u56fe\u7247\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u53ef\u4ee5\u901a\u8fc7\u641c\u7d22\u5185\u5bb9\u56fa\u5b9a\u6587\u4ef6\u4f4d\u7f6e\u3002 # litaoa@uniontech.com\n desk = DdeDesktopPublicWidget()\n# \u9009\u62e9\u89c6\u9891\u76ee\u5f55\ndesk.click_videos_dir_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.ctrl_f()\nsleep(1)\ndesk.input_message(\"\u5143\u7d20\u540d\u79f0\")\nsleep(0.5)\ndesk.enter()\nsleep(1)\n# \u9009\u62e9\u7b2c\u4e00\u4e2a\u6587\u4ef6\ndesk.click_list_view_btn_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.click_first_file_in_desktop_plugs_by_ui()\nsleep(1)\n# \u6587\u7ba1\u63d2\u4ef6\u4e2d\u70b9\u51fb\u6253\u5f00\ndesk.click_open_btn_in_desktop_plugs_by_ui()\n"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#4","title":"4\u3001\u5e94\u7528\u542f\u52a8","text":"# mikigo\n \u5728UI\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u4e00\u5207\u64cd\u4f5c\u7684\u90fd\u662f\u4ece\u5e94\u7528\u542f\u52a8\u5f00\u59cb\u7684\uff0c\u800c\u5728Linux\u684c\u9762\u5e94\u7528\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u6211\u4eec\u542f\u52a8\u5e94\u7528\u7684\u65b9\u6cd5\u6709\u591a\u79cd\uff0c\u4e0b\u9762\u505a\u4e00\u4e2a\u7b80\u5355\u7684\u4ecb\u7ecd\uff1a \u3010\u4f7f\u7528dogtail\u542f\u52a8\u3011 dogtail\u63d0\u4f9b\u4e86\u5e94\u7528\u542f\u52a8\u7684\u65b9\u6cd5\uff0c\u5728utils\u5e93\u4e2d\uff0c\u4f7f\u7528run\u65b9\u6cd5\u542f\u52a8\uff1a \u9996\u5148\u5bfc\u5165\u65b9\u6cd5\uff1a from dogtail.utils import *\n \u8c03\u7528run\u65b9\u6cd5 run('deepin-music')\n \u5373\u53ef\u542f\u52a8\u97f3\u4e50 \u8fd9\u79cd\u65b9\u6cd5\u7684\u4f18\u70b9\u662f\u91c7\u7528\u8fdb\u7a0b\u7684\u65b9\u5f0f\u76f4\u63a5\u542f\u52a8\uff0c\u4e0d\u4f9d\u8d56\u4e0eUI\uff0c\u65e0\u8bba\u684c\u9762\u6216\u4efb\u52a1\u680f\u4e0a\u662f\u5426\u5b58\u5728\u5e94\u7528\u56fe\u6807\uff0c\u90fd\u53ef\u4ee5\u6b63\u5e38\u542f\u52a8\u3002 \u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c \u5982\u679c\u4f7f\u7528ssh\u8fdc\u7a0b\u8c03\u7528\uff0c\u6216\u8005Jenkins\u4e2d\u6267\u884c\u6d4b\u8bd5\u811a\u672c\u7684\u65f6\u5019\uff0c\u5728sniff\u4e2d\u4f1a\u51fa\u73b0\u627e\u4e0d\u5230\u5e94\u7528\uff0c\u7ecf\u8fc7\u5206\u6790\uff0c\u53ef\u80fd\u662f\u56e0\u4e3a\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\u542f\u52a8\u7684\u65f6\u5019\uff0c\u5b9e\u9645\u662f\u91c7\u7528\u4e00\u4e2a\u5b50\u8fdb\u7a0b\u542f\u52a8\u4e86\u5e94\u7528\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u5230\u3002 \u3010\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u3011 \u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807 \u901a\u5e38\u6709\u4e24\u79cd\u65b9\u6cd5\uff1a \uff081\uff09\u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807\u3002 \uff082\uff09\u5df2\u77e5\u5e94\u7528\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u7684\u4f4d\u7f6e\uff0c\u7136\u540e\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u5bf9\u5e94\u5750\u6807\u3002 \u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u7f3a\u70b9\u662f\u4f4d\u7f6e\u5fc5\u987b\u56fa\u5b9a\uff0c\u5982\u679c\u79fb\u52a8\u4f4d\u7f6e\u5c31\u4e0d\u884c\u4e86\uff0c\u800c\u4f7f\u7528\u7b2c\u4e00\u79cd\u65b9\u6cd5\uff0c\u65e0\u8bba\u4f4d\u7f6e\u5728\u54ea\u91cc\uff0c\u53ea\u8981\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u5b58\u5728\u5373\u53ef\u3002 \u3010\u70b9\u51fb\u684c\u9762\u56fe\u6807\u542f\u52a8\u3011 \u684c\u9762\u56fe\u6807\u76ee\u524d\u662f\u91c7\u7528\u56fe\u50cf\u8bc6\u522b\u6280\u672f\uff0c\u5b9a\u4f4d\u5230\u5e94\u7528\u56fe\u6807\u7684\u5750\u6807\uff0c\u7136\u540e\u901a\u8fc7pyauogui\u8fdb\u884c\u70b9\u51fb\u64cd\u4f5c\u3002 \u8be6\u7ec6\u6280\u672f\u65b9\u6848\u53ef\u4ee5\u53c2\u8003\u6211\u7684\u53e6\u5916\u4e24\u7bc7\u535a\u5ba2: \u57fa\u4e8eopencv\u7684\u6a21\u677f\u5339\u914d\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd4\u56de\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 Python\u4e09\u65b9\u5e93PyAutoGui\u7684\u4f7f\u7528\u65b9\u6cd5 \u3010\u4ece\u542f\u52a8\u5668\u542f\u52a8\uff08\u4fd7\u79f0\u5f00\u59cb\u83dc\u5355\uff09\u3011 \u542f\u52a8\u4e2d\u542f\u52a8\u7684\u5b9e\u73b0\u903b\u8f91\u5b9e\u9645\u548c\u4efb\u52a1\u680f\u4e0a\u542f\u52a8\u5dee\u4e0d\u591a\u3002 \u9996\u5148\uff0c\u9700\u8981\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u542f\u52a8\u5668\u56fe\u6807\uff0c\u6216\u8005\u952e\u76d8super\u952e\uff0c\u5c06\u542f\u52a8\u5668\u547c\u51fa\u6765\uff0c \u7136\u540e\uff0c\u5728\u542f\u52a8\u5668\u4e2d\u70b9\u51fb\u5bf9\u5e94\u7684\u56fe\u6807\uff0c \u4f46\u662f\u8fd9\u91cc\u6709\u4e2a\u95ee\u9898\uff0c\u542f\u52a8\u5668\u4e2d\u7684\u5e94\u7528\u5217\u8868\uff0c\u4e00\u9875\u5c55\u793a\u4e0d\u5b8c\uff0c\u6240\u4ee5\u5982\u679c\u6211\u4eec\u8981\u70b9\u51fb\u7684\u5e94\u7528\u56fe\u6807\u4e0d\u5728\u7b2c\u4e00\u9875\u600e\u4e48\u529e\uff0c\u901a\u5e38\u89e3\u51b3\u65b9\u6848\u6709\u4e24\u79cd\uff1a \uff081\uff09\u9700\u8981\u8fdb\u884c\u5411\u4e0b\u6ed1\u52a8\uff0c\u8fd9\u91cc\u5c31\u6d89\u53ca\u5230\u76f8\u5e94\u7684\u8bc6\u522b\u65b9\u6848\uff0c\u5224\u65ad\u5982\u679c\u4e0d\u5728\u7b2c\u4e00\u9875\u5c31\u5f80\u4e0b\u6ed1\u52a8\u7ffb\u9875\u3002 \uff082\uff09\u542f\u52a8\u5668\u63d0\u4f9b\u641c\u7d22\u7684\u529f\u80fd\uff0c\u8f93\u5165\u5e94\u7528\u540d\u79f0\u641c\u7d22\uff0c\u7136\u540e\u8fdb\u884c\u70b9\u51fb\u3002 \u4ece\u5b9e\u9645\u64cd\u4f5c\u4e2d\u6765\u770b\uff0c\u91c7\u7528\u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u6548\u7387\u4f1a\u9ad8\u4e00\u70b9\u3002 \u3010\u7ec8\u7aef\u547d\u4ee4\u542f\u52a8\u3011 \u5728python\u4e2d\uff0c\u4f7f\u7528os.popen()\u6216os.system()\u6216\u8005subprocess.Popen()\uff0c\u5b9e\u73b0\u547d\u4ee4\u884c\u542f\u52a8\uff0c\u6bd4\u5982\uff1a import os\nos.popen('deepin-music')\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u8fdc\u7a0b\u6267\u884c\u811a\u672c\u7684\u65f6\u5019\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u7684\u95ee\u9898\u3002 \u3010\u603b\u7ed3\u3011 \u4ee5\u4e0a\u51e0\u79cd\u65b9\u6cd5\uff0c\u5404\u6709\u4f18\u7f3a\u70b9\uff0c\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff1a \uff081\uff09\u5982\u679c\u9700\u8981\u5728Jenkins\u4e2d\u505a\u6301\u7eed\u96c6\u6210\uff0c\u5efa\u8bae\u4f7f\u7528\u7b2c\u4e8c\u79cd\u4efb\u52a1\u680f\u542f\u52a8\u7684\u65b9\u6cd5\u3002 \uff082\uff09\u5982\u679c\u4e0d\u4f1a\u91c7\u7528\u8fdc\u7a0b\u6267\u884c\u7684\uff0c\u5efa\u8bae\u91c7\u7528\u7b2c\u4e00\u79cd\u6216\u8005\u6700\u540e\u4e00\u79cd\u65b9\u6848\u3002 \uff083\uff09\u7b2c\u4e09\u79cd\u548c\u7b2c\u56db\u79cd\u542f\u52a8\u65b9\u6cd5\uff0c\u901a\u5e38\u5728\u6d4b\u8bd5\u7528\u4f8b\u4e2d\u4f1a\u6d89\u53ca\u5230\uff0c\u6240\u4ee5\u5076\u5c14\u4f1a\u7528\u3002"},{"location":"RELEASE/","title":"\u7248\u672c\u66f4\u65b0\u8bb0\u5f55","text":""},{"location":"RELEASE/#2122023822","title":"2.1.2\uff082023/8/22\uff09","text":"new \u589e\u52a0 OCR \u8bc6\u522b\u81ea\u52a8\u91cd\u8bd5\u673a\u5236\uff0c\u9ed8\u8ba4\u91cd\u8bd5 2 \u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u91cd\u8bd5\u6b21\u6570\uff1b \u4f7f\u7528\u7a97\u7ba1\u6700\u65b0\u63d0\u4f9b\u7684\u4e8c\u8fdb\u5236\u63a5\u53e3\uff0c\u4f18\u5316\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u5728 Wayland \u4e0b\u83b7\u53d6\u7a97\u53e3\u4fe1\u606f\u7684\u65b9\u6cd5\uff1b\u611f\u8c22\u684c\u9762\u6d4b\u8bd5\u90e8 @\u4f55\u6743 @\u5b59\u7fe0 \u3001\u7a97\u7ba1\u7814\u53d1 @\u9ec4\u6cfd\u94ed \u7684\u5927\u529b\u652f\u6301\u3002 \u6269\u5145 skipif \u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\u51fd\u6570\uff1a skipif_xdg_type \u652f\u6301 x11 \u6216 wayland \u4e0a\u8df3\u8fc7\uff1b skipif_cpu_name \u652f\u6301\u4e0d\u540c cpu \u4e0a\u8df3\u8fc7\uff0c\u6bd4\u5982\uff1askipif_cpu_name-KLVVW5821\uff1b "},{"location":"RELEASE/#2102023818","title":"2.1.0\uff082023/8/18\uff09","text":"fix \u4fee\u590d SW \u67b6\u6784\u73af\u5883\u4f9d\u8d56\u7684\u95ee\u9898\uff0c\u539f\u56e0\u662f\u4e4b\u524d\u6211\u8fd9\u91cc\u672c\u5730\u6ca1\u6709 SW \u7684\u673a\u5668\uff0c\u6ca1\u6709\u505a\u76f8\u5173\u9002\u914d\uff1b \u4fee\u590d\u5b50\u9879\u76ee\u5355\u72ec\u9700\u8981\u4e09\u65b9\u5305 pexpect\uff0c\u7531\u4e8e\u4e4b\u524d\u662f\u9884\u88c5\u5230\u955c\u50cf\u91cc\u9762\u7684\uff0c\u4f46\u57fa\u7840\u6846\u67b6\u4e0d\u9700\u8981\uff0c\u56e0\u6b64\u6ca1\u6709\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u91cc\u9762\uff0c\u5bfc\u81f4\u5b50\u9879\u76ee\u4f9d\u8d56\u62a5\u9519\u3002 \u4fee\u590d\u5b50\u9879\u76ee cv \u5bfc\u5165\u62a5\u9519\u7684\u95ee\u9898\uff1b \u539f\u56e0\u4e3a\uff1ayouqu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u517c\u5bb9\u4e24\u79cd\u60c5\u51b5\uff0c\u4e00\u79cd\u662f\u9762\u5411\u670d\u52a1\uff0c\u5c31\u662f\u672c\u5730\u6d4b\u8bd5\u673a\u4e0d\u9700\u8981\u5b89\u88c5 OpenCV\uff0c\u7528\u4f8b\u4e2d\u7684\u56fe\u50cf\u8bc6\u522b\u4f1a\u901a\u8fc7\u8fdc\u7a0b\u670d\u52a1\u63a5\u53e3\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u548c\u7ed3\u679c\u83b7\u53d6\uff1b\u7b2c\u4e8c\u79cd\u662f\u539f\u751f\uff0c\u5c31\u662f\u672c\u5730\u76f4\u63a5\u5b89\u88c5 OpenCV \u76f4\u63a5\u7528\u3002\u4e24\u4e2a\u60c5\u51b5\u7684\u4f18\u5148\u7ea7\u662f\u4f18\u5148\u5224\u65ad\u672c\u5730\u5b58\u5728\uff0c\u5426\u5219\u8d70\u670d\u52a1\u3002 \u524d\u9762\u6211\u4eec\u5df2\u7ecf\u628a OCR \u529f\u80fd\u505a\u4e86\u670d\u52a1\u5316\uff0c\u57fa\u4e8e 1 \u5e74\u591a\u4ee5\u6765\u7684\u89c2\u5bdf\uff0c\u7528\u8d77\u6765\u5f88\u7a33\u5b9a\uff0c\u518d\u4e00\u4e2a\u5c31\u662f OpenCV \u5b89\u88c5\u5305\u662f\u6bd4\u8f83\u81c3\u80bf\u7684\uff0c\u7c97\u7565\u6570\u4e86\u4e0b\u4f9d\u8d56\u6709 30+ \u4e2a\uff0c\u800c\u4e14\u5728\u5404\u67b6\u6784\u4e0a\u4f9d\u8d56\u5305\u8fd8\u4e0d\u5c3d\u76f8\u540c\uff0c\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u65b9\u6848\u4e2d\u4e0d\u592a\u597d\u5904\u7406\uff0c\u6240\u4ee5\u672c\u6b21 2.0 \u7248\u672c\u6211\u4eec\u5927\u80c6\u7684\u5c06\u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u529f\u80fd\u4fee\u6539\u4e3a\u9762\u5411\u670d\u52a1\u7684\u65b9\u5f0f\uff0c\u524d\u671f\u6d4b\u8bd5\u4e00\u5207\u770b\u8d77\u6765\u90fd\u5f88\u548c\u8c10\u3002 \u4f46\u662f\u6ca1\u6ce8\u610f\u5230\u4e4b\u524d\u7ed9\u6d77\u71d5\u59d0\u90a3\u8fb9\u9879\u76ee\u5355\u72ec\u5b9a\u5236\u505a\u4e86\u4e2a\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\uff08\u4e3a\u4e86\u80fd\u7b80\u5355\u5e73\u6ed1\u7684\u8fc1\u79fb\u5230 youqu\uff09\uff0c\u6b64\u63a5\u53e3\u5e95\u5c42\u6ca1\u6709\u517c\u5bb9\u670d\u52a1\u5316\uff0c\u6240\u4ee5\u5979\u90a3\u8fb9\u7684\u9879\u76ee\u8c03\u7528\u6b64\u5b9a\u5236\u63a5\u53e3\u4f1a\u62a5 cv \u5bfc\u5165\u7684\u95ee\u9898\u3002 \u7531\u4e8e\u5c06\u8fd9\u4e2a\u5b9a\u5236\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\u8fdb\u884c\u670d\u52a1\u5316\u517c\u5bb9\u6539\u9020\u9700\u8981\u4e00\u5b9a\u65f6\u95f4\uff0c\u6539\u5b8c\u8fd8\u9700\u8981\u6d4b\u8bd5\uff0c\u4f46\u672c\u6b21\u65f6\u95f4\u6bd4\u8f83\u7d27\uff0c\u56e0\u6b64\u5148\u628a OpenCV \u88c5\u8fdb\u865a\u62df\u73af\u5883\uff0c\u540e\u7eed\u7248\u672c\u518d\u8003\u8651\u9488\u5bf9\u6b64\u63a5\u53e3\u505a\u4fee\u6539\u3002"},{"location":"RELEASE/#2002023816","title":"2.0.0\uff082023/8/16\uff09","text":"YouQu\uff08\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff09\u5f00\u6e90\u4e86\uff0c\u540c\u65f6\u63a8\u51fa\u4e86 2.0 \u7248\u672c\u3002 \u611f\u8c22\u738b\u6ce2\u603b\u3001\u67b6\u6784\u5e08\u5f90\u5c0f\u4e1c\u3001\u7814\u53d1\u7ecf\u7406\u90d1\u5e7c\u6208\u3001\u5218\u90d1\u7b49\u7814\u53d1\u540c\u4e8b\u7684\u5927\u529b\u652f\u6301\u3002 new 1\u3001\u65b0\u7684\u57fa\u7840\u6846\u67b6\u4ee3\u7801\u83b7\u53d6\u65b9\u5f0f\u53ca\u65b0\u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4 YouQu \u540e\u7eed\u5747\u901a\u8fc7 PyPI \u8fdb\u884c\u5305\u7684\u53d1\u5e03\uff0c\u4e5f\u5c31\u662f\u8bf4\u540e\u7eed\u53ef\u4ee5\u4f7f\u7528 pip \u8fdb\u884c\u5b89\u88c5\uff1a sudo pip3 install youqu==2.0.0\n \u8fd9\u91cc\u6709 2 \u4e2a\u5c0f\u70b9\u8981\u6ce8\u610f\uff1a \u63a8\u8350\u4f7f\u7528 sudo pip3 \uff08\u52a0 sudo\uff09\u8fdb\u884c\u5b89\u88c5\uff1b \u5982\u679c\u4e0d\u52a0 sudo \u6709\u4e9b\u673a\u5668\u53ef\u80fd $HOME/.local/bin \u4e0d\u5728\u7cfb\u7edf PATH \u73af\u5883\u76ee\u5f55\u4e0b\uff0c\u5728\u4e0d\u6dfb\u52a0\u73af\u5883\u53d8\u91cf\u7684\u60c5\u51b5\u4e0b\uff0c\u4f1a\u51fa\u73b0 YouQu \u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4\uff08youqu-startproject\uff09\u65e0\u6cd5\u4f7f\u7528\u7684\u95ee\u9898\uff1b \u5f53\u7136\uff0c\u5c06\u4e0a\u8ff0\u8def\u5f84\u6dfb\u52a0\u5230\u73af\u5883\u53d8\u91cf\u4e4b\u540e\u4e5f\u662f\u53ef\u4ee5\u7528\u7684\uff0c\u6240\u4ee5\u6211\u8fd9\u91cc\u662f\u63a8\u8350\u52a0 sudo\uff0c\u4e0d\u52a0 sudo \u4e5f\u662f\u53ef\u4ee5\u7684\uff0c\u53ea\u662f\u9700\u8981\u5173\u6ce8\u4e0b\u73af\u5883\u53d8\u91cf\u7684\u95ee\u9898\u3002 \u63a8\u8350\u6307\u5b9a\u7248\u672c\u53f7\uff08youqu==2.0.0\uff09\u5b89\u88c5\uff0c\u5982\u679c\u4e0d\u6307\u5b9a\u7248\u672c\u53f7\u9ed8\u8ba4\u662f\u5b89\u88c5\u6700\u65b0\u53d1\u5e03\u7684 YouQu \u7248\u672c\uff0c\u4f60\u53ef\u4ee5\u5728 PyPI \u4e0a\u7684 Release history \u91cc\u9762\u67e5\u770b\u6709\u54ea\u4e9b\u7248\u672c\u3002 \u5b89\u88c5\u4e4b\u540e\u4f1a\u81ea\u52a8\u751f\u6210\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu-startproject\uff0c\u4f7f\u7528\u5b83\u53ef\u4ee5\u521d\u59cb\u5316\u5de5\u7a0b\uff0c\u8fd9\u91cc\u4ee5\u97f3\u4e50\u4e3e\u4f8b\uff1b youqu-startproject autotest_deepin_music\n \u8fd9\u6837\u5c31\u4f1a\u5728\u5f53\u524d\u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a autotest_deepin_music \u76ee\u5f55\uff0c\u91cc\u9762\u5305\u542b\u4e86\u57fa\u7840\u6846\u67b6\u6240\u6709\u7684\u4ee3\u7801\uff1b \u4e4b\u540e\uff0c\u8fd8\u662f\u5728 apps \u76ee\u5f55\u4e0b\uff0c\u653e\u5165\u5b50\u9879\u76ee\u7684AT\u4ee3\u7801\u5373\u53ef\uff0c\u4f7f\u7528\u65b9\u6cd5\u548c\u8fc7\u53bb\u4e00\u6837\uff0c\u8fd9\u91cc\u5c31\u4e0d\u591a\u4ecb\u7ecd\u3002 \u53e6\u5916\uff0c\u9664\u4e86\u901a\u8fc7 pip \u83b7\u53d6\u4ee5\u5916\uff0c\u4ecd\u7136\u53ef\u4ee5\u901a\u8fc7\u6e90\u7801\u83b7\u53d6\uff08\u76f4\u63a5 git clone\uff09\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u4f7f\u7528 pip \u5b89\u88c5 YouQu \u65f6\uff0cYouQu \u5305\u7684\u5927\u5c0f\u624d 600+ k\uff0c\u5b89\u88c5\u901f\u5ea6\u8d77\u98de\u3002 2\u3001\u65b0\u7684AT\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848 \u4e3a\u4e86\u89e3\u51b3\u4ee5\u4e0b\u95ee\u9898\uff1a \u8fc7\u53bb\u4e00\u6bb5\u65f6\u95f4\u54b1\u4eec\u7ecf\u5e38\u51fa\u73b0\u7684\uff0c\u4e0d\u540c\u7684AT\u9879\u76ee\u5728\u540c\u4e00\u53f0\u673a\u5668\u4e0a\u90e8\u7f72\u73af\u5883\u65f6\u4f9d\u8d56\u7248\u672c\u51b2\u7a81\u7684\u95ee\u9898\uff0c\u65b0\u65b9\u6848\u4e0d\u540c\u7684\u9879\u76ee\u4f1a\u52a8\u6001\u751f\u6210\u81ea\u5df1\u7684\u865a\u62df\u73af\u5883\uff0c\u76f8\u4e92\u4e4b\u95f4\u4e0d\u5f71\u54cd\uff1b \u4e1a\u5185\u4e3a\u4e86\u89e3\u51b3\u7248\u672c\u51b2\u7a81\u95ee\u9898\u4e00\u822c\u90fd\u4f1a\u4f7f\u7528Python\u865a\u62df\u73af\u5883\u7684\u5de5\u5177\uff0c\u4f46\u662f\u90fd\u6709\u4e2a\u95ee\u9898\uff0c\u65e0\u6cd5\u7ba1\u7406 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u5305\uff0c\u672c\u6b21\u6211\u4eec\u89e3\u51b3\u4e86\u8fd9\u4e2a\u95ee\u9898\uff0c\u80fd\u591f\u5b8c\u5168\u7ba1\u7406\u5e38\u89c4\u7684Python\u5305\uff0c\u4e5f\u80fd\u7ba1\u7406\u5230 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u4e09\u65b9\u5305\uff1b \u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u4f7f\u7528\u65b9\u6cd5\uff1a bash env.sh\n \u53ef\u4ee5\u770b\u51fa\u6765\u548c\u539f\u6765\u4f7f\u7528\u65b9\u6cd5\u6ca1\u6709\u53d8\u5316\uff0c\u4e5f\u5c31\u662f\u8bf4\u4ece\u4f7f\u7528\u7684\u89d2\u5ea6\u662f\u5b8c\u5168\u6ca1\u6709\u533a\u522b\u7684\uff0c\u53ea\u662f\u5185\u90e8\u505a\u4e86\u4e0d\u540c\u7684\u4e8b\u60c5\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u672c\u673a\u90e8\u7f72\u7684\u529f\u80fd\u4ecd\u7136\u4fdd\u7559 env_dev.sh\uff0c\u53ef\u4ee5\u4f5c\u4e3a\u5f00\u53d1\u65f6\u7684\u73af\u5883\u90e8\u7f72\u3002 3\u3001\u65b0\u7684\u9a71\u52a8\u547d\u4ee4 \u8fc7\u53bb\u54b1\u4eec\u90fd\u662f\u4f7f\u7528\u8fd9\u6837\u7684\u547d\u4ee4\u6765\u9a71\u52a8\u6267\u884c\uff1a python3 manage.py run\n \u7531\u4e8e\u9ed8\u8ba4\u57fa\u4e8e\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848\uff0c\u56e0\u6b64\u6211\u4eec\u589e\u52a0\u4e86\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu\uff1b \u65b0\u7684\u9a71\u52a8\u65b9\u5f0f\uff1a youqu manage.py run\n \u53ea\u9700\u8981\u628a python3 \u66ff\u6362\u6210 youqu \u5c31\u53ef\u4ee5\u4e86\uff0c\u770b\u8d77\u6765\u5f88\u548c\u8c10~ 4\u3001\u65b0\u7684\u6587\u6863\u5730\u5740 \u8fc7\u53bb\u54b1\u4eec YouQu \u7684\u5728\u7ebf\u6587\u6863\u662f\u90e8\u7f72\u5728\u516c\u53f8\u5185\u7f51\u7684\uff0c\u73b0\u5728\u5f00\u6e90\u5230 github \u4e86\uff0c\u5916\u90e8\u5f00\u53d1\u8005\u80af\u5b9a\u8bbf\u95ee\u4e0d\u5230\u5185\u7f51\u7684\u6587\u6863\uff0c\u56e0\u6b64\u9700\u8981\u5c06\u6587\u6863\u90e8\u7f72\u5230\u516c\u7f51\u3010\u516c\u7f51\u6587\u6863\u3011\uff1b \u516c\u7f51\u6587\u6863\u4f7f\u7528\u7684\u662f github pages\uff08\u767d\u5ad6\u602a\u4e00\u987f\u72c2\u559c~~\uff09\uff0c\u4f46\u53ef\u80fd\u4f1a\u51fa\u73b0\u6587\u6863\u901f\u5ea6\u6162\u7684\u95ee\u9898\uff08\u4ee3\u7406\u4e0b\u5c31\u597d\u4e86\uff09\uff0c\u4e0d\u8fc7\u6ca1\u5173\u7cfb\uff0c\u54b1\u4eec\u3010\u5185\u7f51\u6587\u6863\u3011\u4ecd\u7136\u4fdd\u7559\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u3002 5\u3001\u5176\u4ed6\u4e00\u4e9b\u5c0f\u5c0f\u529f\u80fd\u66f4\u65b0\uff1a \uff081\uff09\u65b0\u589e\u5173\u95ed\u5206\u8fa8\u7387\u68c0\u6d4b\u7684\u53c2\u6570\u503c\uff1b youqu manage.py run --resolution no\n \u6216\u8005\u4fee\u6539 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387, \u6bd4\u5982\uff1a1920x1080\n;no: \u8868\u793a\u4e0d\u505a\u5206\u8fa8\u7387\u6821\u9a8c\nRESOLUTION = 1920x1080\n resolution \u8fd9\u4e2a\u53c2\u6570\u4e00\u76f4\u90fd\u6709\u7684\uff0c\u53ea\u4e0d\u8fc7\u4e4b\u524d\u662f\u7528\u4e8e\u6307\u5b9a\u5206\u8fa8\u7387\u5927\u5c0f\uff0c\u6bd4\u5982 --resolution 1920x1080\uff0c\u4f46\u6709\u4e9b\u63a5\u53e3\u7684\u9879\u76ee\u4e0d\u9700\u8981\u8fd9\u4e2a\u68c0\u67e5\uff0c\u53ef\u4ee5\u7ed9\u5b83\u4e2a no \u5c31\u597d\u4e86\uff0c\u5f53\u7136 CICD \u4e0a\u5173\u95ed\uff0c\u9700\u8981\u6d41\u6c34\u7ebf\u4e0a\u628a\u8fd9\u4e2a\u53c2\u6570\u52a0\u4e0a\uff1b \uff082\uff09\u65b0\u589e\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u7684\u547d\u4ee4\u884c\u53c2\u6570 \u4e4b\u524d\u8fd9\u4e2a\u914d\u7f6e\u9879\u53ea\u80fd\u5728 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c 1 \u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff0cRERUN >= RECORD_FAILED_CASE\u3002\n;1.\u5173\u95ed\u5f55\u5c4f\uff1aRECORD_FAILED_CASE > RERUN\n;2.\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1aRECORD_FAILED_CASE = 0\nRECORD_FAILED_CASE = 1\n \u73b0\u5728\u5c06\u5f00\u53d1\u5230\u547d\u4ee4\u884c\u53c2\u6570\u3002 youqu manage.py run --record_failed_case 2\n fix \u4fee\u590d remote \u6267\u884c\u65f6\uff0c\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u65e0\u6cd5\u751f\u6210\u6d4b\u8bd5\u62a5\u544a\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1302023710","title":"1.3.0\uff082023/7/10\uff09","text":"fix \u8fdb\u4e00\u6b65\u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b\u53c2\u8003\uff1a\u914d\u7f6ePython\u6e90\u7684\u51e0\u79cd\u65b9\u6cd5 \u4fee\u590d wayland_autotool \u53d7\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86wayland\u4e0b\u5076\u73b0\u627e\u4e0d\u5230 .Xauthority \u6587\u4ef6\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1292023626","title":"1.2.9\uff082023/6/26\uff09","text":"fix \u4f18\u5316\u8fdc\u7a0b\u6267\u884c remote \u7684\u53c2\u6570\u76f4\u63a5\u4f20\u7ed9\u8fdc\u7a0b\u673a\u5668\u7684 run \u547d\u4ee4\uff0c\u4e0d\u7528\u518d\u5355\u72ec\u5904\u7406\u8fdc\u7a0b\u6267\u884c\u7684\u53c2\u6570\u903b\u8f91\uff0c\u540e\u7eed\u4e13\u6ce8\u4e8e\u672c\u5730\u6267\u884c\u529f\u80fd\u5f00\u53d1\uff0c\u8fdc\u7a0b\u6267\u884c\u81ea\u52a8\u9002\u7528\uff1b env.sh \u79fb\u9664 pyyaml \u5b89\u88c5\uff0c\u7531\u5b50\u9879\u76ee\u5728 requirement.txt \u91cc\u9762\u5b9a\u4e49\uff0c\u6846\u67b6\u81ea\u52a8\u52a0\u8f7d\uff1b \u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b "},{"location":"RELEASE/#128202369","title":"1.2.8\uff082023/6/9\uff09","text":"fix \u4fee\u590d\u4e86 pypi \u5b89\u88c5 numpy \u5b58\u5728\u7cfb\u7edf\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#127202368","title":"1.2.7\uff082023/6/8\uff09","text":"fix env.sh \u4e2d\u5b89\u88c5 Python \u5305\u672a\u6307\u5b9a\u7248\u672c\u65f6\uff0c\u65e5\u5fd7\u8f93\u51fa\u5b89\u88c5\u7684\u7248\u672c\uff1b pdocr-rpc 2.0.1\nallure-custom 1.2.1\nfunnylog 1.1.3\n \u4fee\u590d -f \u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u62a5\u9519\u7684\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#126202367","title":"1.2.6\uff082023/6/7\uff09","text":"fix \u4fee\u590d wayland \u4e0a\u8c03\u7528\u9f20\u6807\u4e2d\u952e\u3001\u53f3\u952e\u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b \u4fee\u590d pubilic/dde_desktop_public_widget \u91cc\u9762\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u5b9a\u4f4d\u684c\u9762\u6587\u4ef6\u7684\u65b9\u6cd5\uff0c\u5750\u6807\u6ca1\u6709\u62c6\u5305\u7684\u95ee\u9898\uff1b \u4f18\u5316\u4e86\u7b49\u5f85\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b pycreeze \u7248\u672c\u5347\u7ea7\u5230 0.1.29\uff0c\u5bfc\u81f4\u4e0e pyautogui 0.9.53 \u4e0d\u517c\u5bb9\uff0cenv.sh \u91cc\u9762\u589e\u52a0\u6307\u5b9a pycreeze \u7248\u672c\u4e3a 0.1.28\uff1b "},{"location":"RELEASE/#1252023516","title":"1.2.5\uff082023/5/16\uff09","text":"new --app \u53c2\u6570\u540e\u9762\u65b0\u589e\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u76ee\u524d\u652f\u6301\u4e09\u79cd\u53c2\u6570\u4f20\u5165\u65b9\u5f0f\uff1a ~$: youqu run -a deepin-music\n~$: youqu run -a autotest_deepin_music\n~$: youqu run -a apps/autotest_deepin_music\n \u200b \u540e\u4e24\u79cd\u5165\u53c2\u65b9\u5f0f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\u3002 remote \u8fdc\u7a0b\u6267\u884c\u65b0\u589e\u4ece\u547d\u4ee4\u884c\u4f20\u5165\u6d4b\u8bd5\u673a\u4fe1\u606f\uff0c\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679c password \u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6 setting/remote.ini \u4e2d CLIENT_PASSWORD \u7684\u503c,\u6bd4\u5982\uff1auos@10.8.13.33:1 \u6216 uos@10.8.13.33 \uff1b python3 manage.py remote -c uos@10.8.13.33/uos@10.8.13.34\npython3 manage.py remote -c uos@10.8.13.33:1/uos@10.8.13.34:2\n fix \u65e5\u5fd7\u6a21\u5757\u4fee\u6539\u4e3a\u51fd\u6570\u6267\u884c\u4e4b\u524d\u6253\u5370\u65e5\u5fd7\uff1b \u65e5\u5fd7\u6a21\u5757\u589e\u52a0\u767d\u540d\u5355\uff0c\u901a\u8fc7\u7c7b\u540d\u5f00\u5934\uff0c\u7ed3\u675f\uff0c\u5305\u542b\u7b49\u5173\u952e\u5b57\u63a7\u5236\u9700\u8981\u6253\u5370\u7684\u51fd\u6570\u65e5\u5fd7\uff1b \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5982\u679c\u4f20\u5165\u4e86 app_name \u53ea\u4f1a\u5c06 apps \u76ee\u5f55\u4e0b app_name \u7684\u76ee\u5f55\u53d1\u9001\u5230\u6d4b\u8bd5\u673a\uff1b env.sh \u79fb\u9664 python3-dev\uff1b \u4fee\u590d Wayland \u4e0b env.sh \u73af\u5883\u5b89\u88c5\u5931\u8d25\u7684\u95ee\u9898\uff0c\u4f18\u5316\u4e86 deb \u4f9d\u8d56\u5b89\u88c5\u7684\u903b\u8f91\uff1b \u5c06 env.sh \u5237\u65b0\u6e90\u7684\u65e5\u5fd7\u5728\u7ec8\u7aef\u663e\u793a\uff0c\u89e3\u51b3\u5728 CI \u73af\u5883\u4e0b\uff0c\u957f\u65f6\u95f4\u4e0d\u8f93\u51fa\u65e5\u5fd7\u8fde\u63a5\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d1060 \u534e\u4e3a\u673a\u578b\u5b89\u88c5\u952e\u9f20\u5de5\u5177\u65f6\u4f9d\u8d56\u4e0d\u517c\u5bb9\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1242023227","title":"1.2.4\uff082023/2/27\uff09","text":"fix \u4fee\u6539 CURRENT \u6587\u4ef6\uff1b "},{"location":"RELEASE/#1232023227","title":"1.2.3\uff082023/2/27\uff09","text":"new pylint.sh \u652f\u6301\u901a\u8fc7\u4f4d\u7f6e\u53c2\u6570\u4f20\u5165\u6587\u4ef6\u8def\u5f84\uff1abash pylint.sh apps/autotest_deepin_music,\u597d\u5904\u662f\u53c2\u6570\u8def\u5f84\u53ef\u4ee5\u5728\u7ec8\u7aef\u8865\u5168\uff1b \u65b0\u589e\u7cfb\u7edf\u547d\u4ee4 youqu-pylint \uff0c\u7528\u4e8e\u9759\u6001\u4ee3\u7801\u626b\u63cf\uff0c\u4f7f\u7528\u65b9\u6cd5: youqu-pylint apps/autotest_deepin_music\uff1b \u7531\u4e8e\u7cfb\u7edf\u4e00\u4e9b dbus \u63a5\u53e3\u6539\u53d8\uff0c\u516c\u5171\u5e93\u4e2d\u7684 dbus \u65b9\u6cd5\u5c06\u4e0d\u518d\u7ef4\u62a4\uff0c\u7531\u5b50\u9879\u76ee\u5728 other_widget.py \u91cc\u9762\u8fdb\u884c\u7ef4\u62a4\uff1b fix \u4fee\u590d ssh \u73af\u5883\u4e0b\u8fd0\u884c\u63d0\u793a \u201c\u65e0\u6cd5\u8fde\u63a5\u201d \u7684\u95ee\u9898\uff1b \u4fee\u590d\u8fd0\u884c\u65f6\u7a0b\u5e8f\u9000\u51fa\uff0c\u4e0d\u8f93\u51fa\u5f02\u5e38\u65e5\u5fd7\u7684\u95ee\u9898\uff1b \u4fee\u590dyouqu remote xxx \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5728\u670d\u52a1\u7aef Ctrl + C \u65e0\u6cd5\u505c\u6b62\u7a0b\u5e8f\u8fd0\u884c\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#122202328","title":"1.2.2\uff082023/2/8\uff09","text":"new \u65b0\u589e\u6c14\u6ce1\u7c7b\u56fe\u50cf\u8bc6\u522b\u65b9\u6848\uff1bimage_utils.py::ImageUtil::get_during\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u533a\u57df\u8bc6\u522b\uff0c\u4f20\u5165 [x, y, w, h]\uff0cx: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u76ee\u6807\u56fe\u7247\uff0c\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\uff1b env.sh \u79fb\u9664 pypinyin; \u4f18\u5316\u6267\u884c env.sh \u65f6\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b manage.py \u79fb\u9664\u4e86\u53c2\u6570 session_timeout \uff0c\u6846\u67b6\u6839\u636e\u5168\u5c40\u7684 timeout \u4ee5\u53ca\u7528\u4f8b\u81ea\u5b9a\u4e49\u7684 timeout \u81ea\u52a8\u8ba1\u7b97\u51fa sessiontimeout \u7684\u503c\uff1b \u65b0\u589e ocr \u670d\u52a1\u5668\u94fe\u63a5\u91cd\u8bd5\uff0c\u9ed8\u8ba4\u91cd\u8bd51\u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u53c2\u6570\uff1b fix \u4fee\u590d\u4e86\u4e00\u4e9b pylint \u626b\u63cf\u7684\u4ee3\u7801\u98ce\u683c\u95ee\u9898\uff1b \u91cd\u65b0\u8bbe\u8ba1\u4e86\u6d4b\u8bd5\u62a5\u544a\u4e3b\u9898\uff1b "},{"location":"RELEASE/#121202316","title":"1.2.1\uff082023/1/6\uff09","text":"new \u652f\u6301\u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6267\u884c\u7528\u4f8b\uff1b\u53ef\u5c06python3 manage.py \u66ff\u6362\u4e3a youqu \uff1a youqu run -a deepin-music -k 001\n RPC \u670d\u52a1 IP \u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u6307\u5b9a\u4e0d\u540c\u7684\u7aef\u53e3\uff1b \u5728\u7ebf\u6587\u6863\u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u539f\u6765\u7684\u5730\u5740 10.8.10.215 \u5c06\u4e0d\u5728\u4f7f\u7528\uff1b fix \u4fee\u590d --count \u53c2\u6570\u53ef\u80fd\u51fa\u73b0\u4e0e\u5176\u4ed6\u6846\u67b6\u7684\u5de5\u7a0b\u4f9d\u8d56\u5b58\u5728\u51b2\u7a81\uff0c\u62a5\u9519\u91cd\u590d\u6ce8\u518c\u7684\u95ee\u9898\uff1b \u4fee\u590d CI \u73af\u5883\u4e0b\u591a\u4e2a\u5de5\u7a0b\u5b58\u5728 Python \u73af\u5883\u53d8\u91cf\u6307\u5411\u9519\u8bef\uff0c\u5bfc\u5305\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u5355\u72ec\u8fd0\u884c\u65b9\u6cd5\u65f6\u65e0\u65e5\u5fd7\u8f93\u51fa\u7684 Bug\uff1b "},{"location":"RELEASE/#12020221230","title":"1.2.0\uff082022/12/30\uff09","text":"1.1.4 \u7248\u672c\u9002\u914d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e14\u65b0\u589e\u4e86\u8f83\u591a\u65b0\u7279\u6027\uff0c\u6211\u4eec\u8ba1\u5212\u4f7f\u7528 1.1.4 \u7248\u672c\u8fd0\u884c\u4e00\u6bb5\u65f6\u95f4\uff0c1.2.0 \u7248\u672c\u5c06\u4fee\u590d\u671f\u95f4\u51fa\u73b0\u7684 Bug\uff0c\u7136\u540e\u4f5c\u4e3a\u7a33\u5b9a\u7248\u672c\u53d1\u5e03\u3002 new \u4fee\u6539\u5de5\u7a0b\u540d\u79f0\u4e3a youqu\uff1b \u5c06 sphinx \u6587\u6863\u5de5\u7a0b\u8fc1\u79fb\u5230\u5355\u72ec\u7684\u4ed3\u5e93\uff1b fix \u4fee\u590d startapp \u521b\u5efa\u5de5\u7a0b\u65f6\u5b58\u5728\u5de5\u7a0b\u540d\u79f0\u65f6\u65e0\u6cd5\u7ee7\u7eed\u521b\u5efa\uff1b \u4fee\u590d\u4e86 OCR \u670d\u52a1\u5728\u5e76\u53d1\u65f6\u53ef\u80fd\u51fa\u73b0\u65e0\u6cd5\u8fd4\u56de\u7ed3\u679c\u7684\u95ee\u9898\uff0c\u63d0\u5347 OCR \u670d\u52a1\u9ad8\u5e76\u53d1\u7a33\u5b9a\u6027\uff1b \u4fee\u590d PMS \u540c\u6b65\u6807\u7b7e\u5230 CSV \u6587\u4ef6\u4e0d\u652f\u6301\u7528\u4f8b\u5e93\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11420221214","title":"1.1.4\uff082022/12/14\uff09","text":"new \u65b0\u589e startapp \u5b50\u547d\u4ee4\u521b\u5efa\u5b50\u9879\u76ee\u5de5\u7a0b\u6a21\u677f: python3 manage.py startapp autotest_deepin_xxx \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u91cd\u590d\u6267\u884c\u6b21\u6570\uff1b \u53bb\u6389\u6279\u91cf\u6267\u884c\u524d\u6536\u96c6\u7528\u4f8b\u7684\u6b65\u9aa4\uff1b \u589e\u52a0\u5f00\u59cb\u6267\u884c\u65f6\u6253\u5370\u4e00\u4e9b\u6267\u884c\u53c2\u6570\uff0c\u5982\uff1a \u7528\u4f8b\u6536\u96c6\u6570\u91cf: 99\n\u5931\u8d25\u91cd\u8dd1\u6b21\u6570: 1\n\u6700\u5927\u5931\u8d25\u6b21\u6570: 49\n\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4: 200.0s (03\u520620\u79d2)\n\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4: 11880s (3\u5c0f\u65f618\u52060\u79d2)\n \u5b9a\u5236\u4fee\u6539allure\u62a5\u544alogo\u3001title\u3001\u9ed8\u8ba4\u8bed\u8a00\uff1b manage.py \u6267\u884c\u5f00\u59cb\u65f6\u6253\u5370 logo \u548c\u5f53\u524d\u7248\u672c\uff1a \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u255a\u2588\u2588\u2557 \u2588\u2588\u2554\u255d \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2584\u2584 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2580\u2580\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u2584\u2588 \u2584\u2588 \u2588 \u2588 \u2588 \u2584 \u2588 \u2584 \u2580\u2580\u2588 \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\uff1b \u88c5\u9970\u5668\u65b9\u6cd5\u6307\u5b9a\u6b21\u6570\uff1b @pytest.mark.count(2)\ndef test_music_001():\npass\n \u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u6b21\u6570\uff1b python3 manage.py run -a deepin-music -k 001 --count 2\n \u200b image_utils \u589e\u52a0\u51fd\u6570 save_temporary_picture\uff0c\u652f\u6301\u6307\u5b9a\u5c4f\u5e55\u533a\u57df\u622a\u56fe\u5e76\u8fd4\u56de\u56fe\u7247\u5b58\u653e\u7684\u672c\u5730\u8def\u5f84\uff0c\u540e\u7eed\u4f7f\u7528 assert_image_exist \u8fdb\u884c\u65ad\u8a00 Python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(x, y, width, height) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) button_center \u65b0\u589e btn_size \u83b7\u53d6\u63a7\u4ef6\u5de6\u4e0a\u89d2\u5750\u6807\u53ca\u957f\u5bbd\uff0c\u7528\u4e8e\u52a8\u6001\u7684\u622a\u53d6\u5143\u7d20\u7684\u56fe\u7247\uff0c\u53ef\u7528\u4e8e\u5b9a\u4f4d\u65ad\u8a00 python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u6240\u6709\u97f3\u4e50\u6309\u94ae\")) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) allure \u62a5\u544a\u4e2d\u5b9a\u4f4d\u95ee\u9898\u9664\u4e86\u65e5\u5fd7\u3001\u622a\u56fe\u3001\u5f55\u5c4f\u5916\uff0c\u8c03\u7528\u7684\u51fd\u6570\u589e\u52a0\u4e86 step \u6b65\u9aa4\u5c55\u793a\uff1b env.sh \u65b0\u589e\u5b89\u88c5\u5b50\u9879\u76ee Python \u4e09\u65b9\u4f9d\u8d56\uff0c\u5728\u5b50\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u5199 requirement.txt \u6587\u4ef6\uff0cenv.sh \u4f1a\u81ea\u52a8\u52a0\u8f7d\uff1b ocr \u8bc6\u522b\u65b0\u589e\u652f\u6301\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\u8fdb\u884c\u6587\u5b57\u8bc6\u522b\uff0c\u51cf\u5c11\u56e0\u5168\u5c4f\u8bc6\u522b\u65f6\uff0c\u5176\u4ed6\u6587\u5b57\u7684\u5e72\u6270 Python # \u65ad\u8a00\u97f3\u4e50\u7684\u5220\u9664\u5f39\u7a97\u4e2d\uff0c\u5305\u542b\u4e86\u201c\u786e\u8ba4\u201d\u7684\u6587\u5b57 self.assert_ocr_exist(\"\u786e\u8ba4\", picture_abspath=DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u5220\u9664\u5f39\u7a97\"))) \u65ad\u8a00\u51fd\u6570\u7684\u8c03\u7528\u4e5f\u4f1a\u81ea\u52a8\u6253\u5370\u65e5\u5fd7; env.sh \u65b0\u589e\u88c1\u526a\u4f9d\u8d56\u7684\u65b9\u6848\uff1b fix \u4fee\u590d Jenkins \u73af\u5883\u4e0b\uff0c apps \u76ee\u5f55\u4e0b\u5b50\u9879\u76ee\u5b58\u5728 auotest_deepin_xxx@tmp \u76ee\u5f55\uff0c\u5728\u4f20\u5165 app_name \u540e\u65e0\u6cd5\u6267\u884c\u7528\u4f8b\u7684\u95ee\u9898\uff1b \u4fee\u590d\u81ea\u52a8\u751f\u6210 case_list.csv \u6587\u4ef6\u65f6\uff0c\u7528\u4f8b\u987a\u5e8f\u88ab\u8c03\u6574\u7684\u95ee\u9898\uff1b env.sh \u73af\u5883\u5b89\u88c5\u79fb\u9664 git \u548c curl\uff1b \u4fee\u590d\u7528\u4f8b\u5728 setup \u9636\u6bb5\u62a5\u9519\u540e\uff0c\u672a\u5199\u5165 ci_result.json \u7684\u95ee\u9898\uff1b \u79fb\u9664 uos_ci.py\uff1b "},{"location":"RELEASE/#11320221028","title":"1.1.3\uff082022/10/28\uff09","text":"new \u65b0\u589e\u56fe\u50cf\u65ad\u8a00\u6210\u529f\u8f93\u51fa\u5339\u914d\u5ea6\uff1b \u65b0\u589e\u73af\u5883\u5b89\u88c5 yaml \u4f9d\u8d56\uff1b \u65b0\u589e\u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6570\u636e\u56de\u586b\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b \u65b0\u589e\u6d4b\u8bd5\u7ed3\u679c\u8868\u60c5\u663e\u793a\uff0c\u5e76\u4f18\u5316\u4e86\u65e5\u5fd7\u7684\u6392\u7248\uff1b \u65b0\u589e --top {number} \u7528\u4e8e\u8bb0\u5f55\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0c\u65e5\u5fd7\u751f\u6210\u5230 report/logs/top.log\uff1b fix \u4fee\u590d\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4f46\u7ec8\u7aef\u6ca1\u6709\u9519\u8bef\u65e5\u5fd7\u8f93\u51fa\u7684\u95ee\u9898\uff1b \u4fee\u6539\u5931\u8d25\u7528\u4f8b\u56de\u6eaf\u65e5\u5fd7\u4e3a\u8be6\u7ec6\u7ea7\u522b\uff1b \u4fee\u590d\u4e86\u6267\u884c\u8fdb\u5ea6\u672a\u8ba1\u7b97\u8df3\u8fc7\u7528\u4f8b\u7684\u95ee\u9898\uff0c\u5e76\u4f18\u5316\u4e86\u8fdb\u5ea6\u83b7\u53d6\u7684\u7b97\u6cd5\uff1b \u4fee\u590d env.sh \u5728 V23 \u73af\u5883\u4e0b\u5b89\u88c5\u65e0\u6cd5\u8bfb\u53d6\u5bc6\u7801\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 pms \u6d4b\u8bd5\u5957\u6267\u884c\u6216\u6d4b\u8bd5\u5355\u6267\u884c\u65f6\uff0c\u7528\u4f8bID\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b env.sh \u91cc\u9762 hub.deepin.com \u66f4\u6362\u6210 it.uniontech.com\uff1b uos_ci.py \u6d4b\u8bd5\u7ed3\u679c\u7edf\u8ba1\u65f6\uff0c\u603b\u6570\u5254\u9664 skip \u7684\u6570\u91cf "},{"location":"RELEASE/#11220220921","title":"1.1.2\uff082022/09/21\uff09","text":"new \u5728\u6ca1\u6709\u5b89\u88c5 dogtail \u7684\u60c5\u51b5\u4e0b\uff0c\u4e5f\u80fd\u4f7f\u7528 sniff \u5de5\u5177\uff1b fix \u4fee\u590d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e2d\u6ca1\u6709\u5b89\u88c5 AT \u73af\u5883\u6267\u884c uos_ci.py \u62a5\u9519\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11120220919","title":"1.1.1\uff082022/09/19\uff09","text":"new \u65b0\u589e\u6267\u884c\u8fdb\u5ea6\u663e\u793a\uff0c\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u65f6\u65e5\u5fd7\u8f93\u51fa\u5f53\u524d\u8fdb\u5ea6\uff1a[\u5f53\u524d\u6307\u5b9a\u7b2c\u51e0\u6761/\u7528\u4f8b\u603b\u6570]\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u7528\u4f8b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\u6240\u6709\u5931\u8d25\u7528\u4f8b\u7684\u5217\u8868\uff1b \u5173\u95ed\u7ec8\u7aef\u8f93\u51fa\u6355\u83b7\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u65e5\u5fd7\u5feb\u7167\uff1b \u4f18\u5316\u7ec8\u7aef\u8f93\u51fa\u5931\u8d25\u4fe1\u606f\u5197\u957f\u4e3a\u7b80\u8981\u4fe1\u606f\u8f93\u51fa\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u663e\u793a 10 \u4e2a\u6267\u884c\u6700\u6162\u7684\u7528\u4f8b\u5217\u8868\uff0c\u5e76\u8be6\u7ec6\u5217\u51fa\u5404\u4e2a\u9636\u6bb5\u7684\u8017\u65f6\uff1b \u5931\u8d25\u91cd\u8dd1\u7528\u4f8b\u91cd\u8dd1\u4e4b\u524d\u5ef6\u8fdf 1 \u79d2\uff1b \u65b0\u589e\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4ecd\u7136\u5f3a\u5236\u6267\u884c\uff1b \u7528\u4f8b\u6536\u96c6\u65f6\u4ec5\u5728 apps \u76ee\u5f55\u4e0b\u8fdb\u884c\uff0c\u5ffd\u7565 src,setting,public \u76ee\u5f55\uff1b \u65b0\u589e allure \u62a5\u544a\u5907\u4efd\u529f\u80fd\uff0c\u9ed8\u8ba4\u5907\u4efd\u81f3 allure_back \u76ee\u5f55\u4e0b\uff1b manage.py\u65b0\u589e\u53c2\u6570 --lastfailed \u7528\u4e8e\u53ea\u8dd1\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\u7684\u529f\u80fd\uff1b fix \u4fee\u590d\u4e86\u5728\u6ca1\u6709\u6307\u5b9a\u5e94\u7528\u540d\u79f0\u6267\u884c\u65f6\uff0cxml \u62a5\u544a\u751f\u6210\u8def\u5f84\u5f02\u5e38\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 uos_ci.py \u4f20\u5165 timeout \u548c session_timeout \u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11020220916","title":"1.1.0\uff082022/09/16\uff09","text":"new \u65b0\u589ePMS\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u652f\u6301\u591a\u79cd\u6570\u636e\u56de\u586b\u6a21\u5f0f\uff1b \u4f18\u5316\u4e86\u901a\u8fc7\u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u65f6PMS \u722c\u866b\u7684\u6027\u80fd\uff1b \u65b0\u589e .gitmodules \u6587\u4ef6\uff0c\u7528\u4e8e\u6807\u8bb0\u6240\u6709\u5b50\u9879\u76ee\uff0c\u65b9\u4fbf\u7edf\u4e00\u62c9\u53d6\u4ee3\u7801\uff1b env.sh \u9002\u914d\u793e\u533a\u7248\u4e0a\u5b89\u88c5\u81ea\u52a8\u5316\u73af\u5883\uff1b \u589e\u52a0\u6267\u884c\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u9519\u8bef\u7684\u529f\u80fd\uff1b README.md \u589e\u52a0 Wayland \u4e0b\u4f7f\u7528\u3001\u6d4b\u8bd5\u62a5\u544a\u67e5\u770b\u3001\u5e38\u89c1\u95ee\u9898\u7b49\u7684\u6587\u6863\u8bf4\u660e\uff1b \u589e\u52a0\u4e86\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u5bf9 setup\u3001call\u3001teardown \u8fdb\u884c\u65e5\u5fd7\u5206\u6bb5\uff1b fix \u4fee\u590d\u4e86 \u786e\u8ba4\u4fee\u590d \u5217\u6ca1\u5199\u8868\u5934\uff0c\u4f46\u5199\u4e86 fixed-xxx \u6807\u7b7e\uff0c\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u540c\u4e00\u5e94\u7528\u5185\u591a\u4e2a csv \u6587\u4ef6\u4e2d \u786e\u8ba4\u4fee\u590d \u5217\u6709\u7684\u5199\u4e86\uff0c\u6709\u7684\u6ca1\u5199\uff0c\u53ef\u80fd\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 INFO \u65e5\u5fd7\uff0c\u663e\u793a\u4e3a DEBUG \u7684\u95ee\u9898\uff1b\u4fee\u590d\u4e86\u90e8\u5206\u673a\u5668\u4e0a INFO \u65e5\u5fd7\u5185\u5bb9\u663e\u793a\u4e3a\u7ea2\u8272\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\u770b\u4e0d\u5230\u8be6\u7ec6\u4fe1\u606f\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10220220822","title":"1.0.2\uff082022/08/22\uff09","text":"new \u79fb\u9664 loguru\uff0c\u66ff\u6362\u4e3a logging\uff0c\u63a5\u53e3\u4fdd\u6301\u4e0d\u53d8\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u53d7\u5f71\u54cd\uff1b \u9ed8\u8ba4\u5f00\u542f coredump\uff1b fix \u4fee\u590d\u4e86\u4e09\u65b9\u5e93 loguru \u5076\u73b0\u5f02\u5e38\uff0c\u5bfc\u81f4\u7a0b\u5e8f\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7b2c\u4e00\u6b21\u5931\u8d25\u4e0d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10120220812","title":"1.0.1\uff082022/08/12\uff09","text":"new \u65b0\u589e RELEASE.md \u6587\u4ef6\uff0c\u7528\u4e8e\u8bb0\u5f55\u5386\u53f2\u53d1\u5e03\u7248\u672c\u7684\u66f4\u65b0\u5185\u5bb9\uff1b \u517c\u5bb9 Wayland \u6a21\u5f0f\u4e0b\u6267\u884c\u7528\u4f8b\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u7528\u7ba1\u5f53\u524d\u6d4b\u8bd5\u673a\u6267\u884c\u73af\u5883\uff0c\u6846\u67b6\u4f1a\u81ea\u52a8\u6839\u636e\u5f53\u524d\u73af\u5883\u8d70\u4e0d\u540c\u7684\u4ee3\u7801\u903b\u8f91\uff1b \u7531\u4e8e\u9700\u8981\u4fee\u6539 dogtail \u6e90\u4ee3\u7801\uff0c\u56e0\u6b64\u5c06\u4fee\u6539\u540e\u7684\u6e90\u7801\u653e\u5165\u5230\u6838\u5fc3\u5e93\u91cc\u9762 src/depends/dogtail \u540e\u7eed\u7248\u672c\u5c06\u4e0d\u9700\u8981\u5728\u7cfb\u7edf\u4e2d\u5b89\u88c5dogtail\uff1b \u5982\u679c\u5e94\u7528\u5e93\u540c\u6837\u4f7f\u7528\u4e86\u7cfb\u7edf\u5b89\u88c5\u7684 dogtail \u53ef\u80fd\u4f1a\u62a5\u9519\uff0c\u89e3\u51b3\u65b9\u6848\u662f\u5c06\u4ee3\u7801\u4e2d\u7684 import dogtail \u4fee\u6539\u4e3a from src.depends import dogtail ; fix \u91cd\u8dd1\u5931\u8d25\u4e4b\u540e\u624d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff0c\u4fee\u6539\u4e3a\u5931\u8d25\u4e4b\u540e\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":"# Attribution \uff1achengdu Test Team\n# Date \uff1a2021/08/20\n \u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d \u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d \u4ed3\u5e93\u5730\u5740\uff1ahttps://gitlabcd.uniontech.com/autotest/cd-desktop-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u65b9\u6848\u6982\u8ff0","text":"\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u667a\u80fd\u8bc6\u522b\u5e94\u7528\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u7528\u4e8e\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u64cd\u4f5c\u8fc7\u7a0b\u4e2d\u7684\u5143\u7d20\u5b9a\u4f4d\u4ee5\u53ca\u5224\u65ad\u7ed3\u679c\u65f6\u7684\u65ad\u8a00\u5904\u7406\uff1b\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\uff0c\u6d4b\u8bd5\u673a\u4e0a\u7684\u753b\u9762\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u5230\u670d\u52a1\u5668\u4e0a\uff0c\u670d\u52a1\u5668\u5bf9\u89c6\u9891\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\u540e\uff0c\u670d\u52a1\u5668\u667a\u80fd\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\u6210\u529f\uff0c\u7136\u540e\u5bf9\u6d4b\u8bd5\u673a\u4e0b\u53d1\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\uff0c\u6d4b\u8bd5\u673a\u63a5\u53d7\u5e76\u6267\u884c\u4e0b\u4e00\u6b65\u64cd\u4f5c\u3002 \u670d\u52a1\u5668\u4e0e\u6d4b\u8bd5\u673a\u4e4b\u95f4\u7684\u94fe\u63a5\uff1a \u670d\u52a1\u5668\u901a\u8fc7 USB \u4e32\u53e3\u8bbe\u5907\uff08USB-HID \u534f\u8bae\uff09\u6a21\u62df\u9f20\u6807\u952e\u76d8\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u64cd\u4f5c\u3002 \u901a\u8fc7\u89c6\u9891\u91c7\u96c6\u8bbe\u5907\u6355\u83b7\u6d4b\u8bd5\u673a\u7684\u5b9e\u65f6\u753b\u9762\u4f20\u8f93\u7ed9\u670d\u52a1\u5668\u3002 \u670d\u52a1\u5668\u5bf9\u91c7\u96c6\u7684\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\uff0c\u8bc6\u522b\u5176\u4e2d\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5e76\u8fd4\u56de\u5143\u7d20\u63a7\u4ef6\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\uff0c\u670d\u52a1\u5668\u901a\u8fc7\u667a\u80fd\u5316\u5206\u6790\uff0c\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e00\u81f4\u5c06\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\u901a\u8fc7\u4e32\u53e3\u6a21\u62df\u952e\u9f20\u4fe1\u53f7\u53d1\u9001\u7ed9\u6d4b\u8bd5\u673a\uff1b\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e0d\u4e00\u81f4\u5c06\u4f1a\u8fdb\u5165\u4e2d\u65ad\u5904\u7406\u53ca\u5f02\u5e38\u7ed3\u679c\u8f93\u51fa\uff0c\u7ee7\u7eed\u6267\u884c\u540e\u7eed\u573a\u666f\uff0c\u76f4\u81f3\u6240\u6709\u7528\u4f8b\u6d4b\u8bd5\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u6df1\u5ea6\u5b66\u4e60\u73af\u5883\u642d\u5efa","text":"\u6a21\u578b\u8bad\u7ec3\u4e3b\u8981\u5bf9 GPU \u6709\u8981\u6c42\uff0c\u8bad\u7ec3\u6a21\u578b\u7684\u673a\u5668\u663e\u5b58\u4e0d\u4f4e\u4e8e 6G\uff0c\u5176\u4ed6\u914d\u7f6e\u65e0\u7279\u6b8a\u8981\u6c42\u3002 \u63a8\u8350\u6027\u4ef7\u6bd4\u8f83\u9ad8\u914d\u7f6e \u64cd\u4f5c\u7cfb\u7edf: UnionTech OS Desktop 20 Professional Linux version 4.19.0-desktop-amd64 (deepin@deepin-PC) (Uos 8.3.0.3-3+rebuild) \u5904\u7406\u5668: Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz (\u516b\u6838 / \u5341\u516d\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460M-HDV(RD)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))/8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: TU116 [GeForce GTX 1660]\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u865a\u62df\u73af\u5883\u5b89\u88c5","text":"cd ~\nwget -c https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh\nbash Miniconda3-latest-Linux-x86_64.sh\n \u4e00\u8def\u56de\u8f66 \u7b2c\u4e00\u6b21\u63d0\u793a\u8f93\u5165 yes/no \uff1a\u8f93\u5165 yes \u7ee7\u7eed\u4e00\u8def\u56de\u8f66 \u7b2c\u4e8c\u6b21\u63d0\u793a\uff1a\u8f93\u5165 no cd ~/miniconda3/bin\nsudo chmod 777 activate\n \u6fc0\u6d3bconda\u73af\u5883 . ./activate\n \u6dfb\u52a0\u516c\u53f8\u5185\u7f51\u6e90 conda config --add channels bioconda\nconda config --add channels conda-forge\n \u5982\u679c\u662f\u5916\u7f51\u6dfb\u52a0\u5916\u7f51\u6e90 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/\n \u5982\u679c\u8981\u5220\u9664\u6e90 conda config --remove-key channels\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"2\u3001\u5b89\u88c5\u4f9d\u8d56","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u521b\u5efa\u865a\u62df\u73af\u5883","text":"conda remove --name mmlab --all # \u79fb\u9664\u6240\u6709\u865a\u62df\u73af\u5883\n conda create -n mmlab python=3.7\n conda activate mmlab\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-pytorch","title":"\uff082\uff09\u5b89\u88c5 Pytorch","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install torch==1.7.0+cu101 torchvision==0.8.1+cu101 torchaudio==0.7.0 -f https://download.pytorch.org/whl/torch_stable.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-mmcv","title":"\uff083\uff09\u5b89\u88c5 MMCV","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install mmcv-full==1.3.3 -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.7.0/index.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"\uff084\uff09\u5b89\u88c5\u663e\u5361\u9a71\u52a8","text":"\u6839\u636e\u4f60\u7684\u663e\u5361\u4e0b\u8f7d\u5bf9\u5e94\u9a71\u52a8\uff0c\u6bd4\u5982\u6211\u7684\u663e\u5361\u4e3a GTX1660\uff0c\u9a71\u52a8\u7248\u672c\u4e3a 430\uff0c\u9a71\u52a8\u4e0b\u8f7d\u5730\u5740\uff1ahttps://www.nvidia.cn/Download/Find.aspx?lang=cn CTRL+ALT+F2 \u8fdb\u5165tty\n \u7981\u7528 nouveau \u9a71\u52a8 sudo vim /etc/modprobe.d/blacklist-nouveau.conf\n \u586b\u5165\uff1a blacklist nouveau options nouveau modeset=0\n \u5237\u65b0\u914d\u7f6e\u6587\u4ef6 sudo update-initramfs -u reboot \u91cd\u542f\u540e\u518d\u8fdb\u5165 tty \u5173\u95ed\u56fe\u50cf\u754c\u9762\uff0c\u8f93\u5165\u547d\u4ee4\u5173\u95ed\u56fe\u50cf\u754c\u9762 sudo service lightdm stop\n \u5b89\u88c5\u9a71\u52a8 sudo chmod a+x NVIDIA-Linux-x86_64-430.run\nsudo ./NVIDIA-Linux-x86_64-430.run\n reboot\u91cd\u542f\uff0cnvidia-smi\u67e5\u770b\u5b89\u88c5\u72b6\u6001\u3002\u6ce8\u610f\u770b\u4e0bcuda\u7248\u672c\uff0c10.1\uff0cdriver\u7248\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u6570\u636e\u6807\u6ce8","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u6570\u636e\u6807\u6ce8","text":"\u6807\u6ce8\u4e4b\u524d\u9700\u8981\u5148\u8f6c\u6362\u56fe\u7247\u5927\u5c0f\uff0c\u5e76\u4e14\u4ee5\u6570\u5b57\u547d\u540d\uff0c\u6bcf\u7ec4\u547d\u540d\u9012\u589e"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"\uff081\uff09\u8f6c\u6362\u5927\u5c0f\u5e76\u91cd\u547d\u540d","text":"rename_pic.py import os\nimport sys\nimport cv2\nimport time\nimport getpass\nusername = getpass.getuser()\nsource_path = f\"/home/{username}/Desktop/right_menu\" # \u56fe\u7247\u8def\u5f84\nsource_dest = os.path.join('/'.join(source_path.split(\"/\")[:-1]), 'tmp')\nif not os.path.exists(source_dest):\nos.mkdir(source_dest)\nstart_name = sys.argv[1]\nfile_name_list = list()\nfor file in os.listdir(source_path):\nif file.endswith('.png'):\nfile_name_list.append(file)\nstart_name = int(start_name)\nfor file in file_name_list:\nos.rename(os.path.join(source_path,file), os.path.join(source_path, f\"{str(start_name)}.png\"))\nstart_name += 1\ntime.sleep(1)\nfor file in os.listdir(source_path):\nimage = os.path.join(source_path, str(file))\nsrc = cv2.imread(image)\nresult = cv2.resize(src, (960, 540))\nresizeImage = os.path.join(source_dest, str(file))\nprint(resizeImage)\ncv2.imwrite(str(resizeImage), result)\ncv2.waitKey(0)\ncv2.destroyAllWindows()\ntime.sleep(1)\nos.system(f'rm -rf {source_path}/*')\nos.system(f'mv {source_dest}/* {source_path}')\nos.system(f'rm -rf {source_dest}')\nprint(\"\u4e0b\u4e00\u4e2a\u5e8f\u53f7\uff1a\", start_name)\n \u6839\u636e\u7ec8\u7aef\u8f93\u51fa\u7684\u4e0b\u4e00\u4e2a\u5e8f\u53f7\u7684\u63d0\u793a\uff0c\u6267\u884c Python \u6587\u4ef6\u7684\u65f6\u5019\u4f20\u53c2\u3002 python rename_pic.py 249\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"\uff082\uff09\u5de5\u5177\u6807\u6ce8","text":"\u4f7f\u7528\u5de5\u5177 labelImg \u6807\u6ce8 sudo pip3 install PyQt5==5.13\nsudo pip3 install labelImg\n \u7ec8\u7aef\u76f4\u63a5\u8f93\u5165 labelImg\uff0c\u56de\u8f66 \u6807\u6ce8\u6a21\u5f0f\u9009\u62e9\uff1aPascalVOC"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u667a\u80fd\u6807\u6ce8","text":"\u6253\u5f00\u5c4f\u5e55\u5f55\u5236\u8f6f\u4ef6\uff0c\u5f55\u5236\u624b\u52a8\u64cd\u4f5c\u4e00\u6b21\u6d4b\u8bd5\u7528\u4f8b\uff0c\u7136\u540e\u5c06\u5f55\u5236\u7684\u89c6\u9891\u8fdb\u884c\u5206\u5e27\uff0c\u7136\u540e\u5bf9\u6bd4\u524d\u4e24\u5e27\u56fe\u6807\u76f8\u4f3c\u5ea6\uff0c\u5254\u9664\u76f8\u4f3c\u5ea6\u8fc7\u9ad8\u7684\u56fe\u7247\uff0c\u5728\u4fdd\u8bc1\u7d20\u6750\u591a\u6837\u6027\u7684\u524d\u63d0\u4e0b\uff0c\u5254\u9664\u91cd\u590d\u591a\u4f59\u7684\u56fe\u7247\u751f\u6210\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u96c6\uff0c\u7136\u540e\u53d6\u51fa\u63a7\u4ef6\u6a21\u677f\u6570\u636e\u96c6\uff0c\u901a\u8fc7 OpenCV \u6a21\u677f\u5339\u914d\u83b7\u53d6\u63a7\u4ef6\u5728\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u56fe\u7247\u4e2d\u6240\u5728\u7684\u5de6\u4e0a\u3001\u5de6\u4e0b\u3001\u53f3\u4e0a\u3001\u53f3\u4e0b\u56db\u5904\u5750\u6807\uff0c\u4ece\u800c\u6839\u636e\u6a21\u677f\u6570\u636e\u96c6\u751f\u6210\u6807\u6ce8\u6570\u636e\u3002\u53c2\u8003\u76ee\u5f55 AnnotationMaterial"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"\uff081\uff09\u6a21\u677f\u6570\u636e\u96c6\u51c6\u5907","text":"1\u3001\u5728\u754c\u9762\u622a\u53d6\u9700\u8981\u6807\u6ce8\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u653e\u5728\u76ee\u5f55\u4e0b AnnotationMaterial/template/img 2\u3001\u7ef4\u62a4\u63a7\u4ef6\u540d\u4e0e\u5143\u7d20\u63a7\u4ef6\u7684\u952e\u5bf9\uff0c\u4e00\u4e2a\u63a7\u4ef6\u540d\u53ef\u5bf9\u5e94\u591a\u4e2a\u5143\u7d20\u63a7\u4ef6 menu:\n- menu.jpg\n- menu1.jpg\n- menu2.jpg\n- menu3.jpg\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"\uff082\uff09\u7d20\u6750\u96c6\u51c6\u5907","text":"\u5f55\u5236\u89c6\u9891\u6216\u6216\u5c4f\u5e55\u622a\u56fe\u653e\u7f6e\u76ee\u5f55 AnnotationMaterial/source"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u5f00\u59cb\u6807\u6ce8","text":"python3 AnnotationMaterial/main.py\n \u751f\u6210\u7684\u6807\u6ce8\u6570\u636e\u5b58\u653e\u5728 AnnotationMaterial/result"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#mmdetection","title":"\u56db\u3001MMDetection","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1-mmdetection","title":"1\u3001 MMDetection \u4ee3\u7801","text":"MMDetection \u662f\u4e00\u4e2a\u6709\u540d\u7684\u6df1\u5ea6\u5b66\u4e60\u76ee\u6807\u68c0\u6d4b\u5f00\u6e90\u9879\u76ee\uff0c\u4e5f\u662f openMMlab \u7684\u62db\u724c\u9879\u76ee\uff0c\u4e3a\u4ec0\u4e48\u9009\u62e9\u5b83\uff0c\u5c0f\u5b69\u513f\u6ca1\u5a18\u8bf4\u6765\u8bdd\u957f\uff0c\u611f\u5174\u8da3\u53ef\u4ee5\u81ea\u884c\u6df1\u5165\u4e86\u89e3\uff1b \u4f60\u53ef\u4ee5\u76f4\u63a5\u5728 GitHub \u4e0a\u514b\u9686\u4ee3\u7801\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u54b1\u4eec\u4ed3\u5e93\u4e0b Train \u76ee\u5f55\u4e2d\u4ee3\u7801\uff0cTrain \u4e2d\u7684\u4ee3\u7801\u4e5f\u662f\u4ece GitHub \u4e0a\u62c9\u53d6\u7684\uff0c\u4e0d\u8fc7\u6211\u4eec\u6839\u636e\u9879\u76ee\u9700\u8981\u505a\u4e86\u4e00\u4e9b\u4e8c\u6b21\u5f00\u53d1\uff0c\u63a8\u8350\u76f4\u63a5\u4f7f\u7528\u5b83\u3002 \u5982\u679c\u4f60\u60f3\u4ece GitHub \u4e0a\u62c9\uff1a git clone https://github.com/open-mmlab/mmdetection.git\n# \u4e0d\u80fd\u76f4\u63a5\u62c9\u53d6\u4e3b\u5206\u652f\uff0c\u5efa\u8bae\u4f7f\u75282.12\u7248\u672c\uff0c\u4e0d\u540c\u7684\u7248\u672c\u5bf9\u5e94\u7684mmcv\u7248\u672c\u662f\u4e0d\u540c\u7684\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-voc2coco","title":"2\u3001\u62c9\u53d6 voc2coco \u4ee3\u7801","text":"git clone https://github.com/Tony607/voc2coco.git\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-coco","title":"3\u3001\u8f6c\u6362 coco \u6570\u636e\u96c6","text":"\u5c06\u6240\u6709\u7684\u56fe\u7247\u548cxml\u6587\u4ef6\u653e\u5165train2017\uff0c\u4ece\u4e2d\u6311\u9009\u51e0\u7ec4\u653e\u5165val2017\uff08\u6d4b\u8bd5\u96c6\uff09 cd mmdetection/data/coco\npython voc2coco.py train2017 annotations/instances_train2017.json\npython voc2coco.py val2017 annotations/instances_val2017.json\n \u751f\u6210json\u6587\u4ef6"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4_1","title":"4\u3001\u4fee\u6539\u914d\u7f6e","text":"\uff081\uff09\u8bfb\u53d6\u6a21\u578b\u540d\u79f0 import json\nmodule_name = []\nwith open('./instances_train2017.json', \"r+\") as f:\njson_file = f.read()\njson_dict = json.loads(json_file)\nmodule_list = json_dict.get('categories')\nfor module_info in module_list:\nname = module_info.get('name')\nmodule_name.append(name)\nprint(module_name)\nprint(\"module_num:\", len(module_name))\n # \u6ce8\u610f\u5bf9\u6bd4instances_train2017.json\u91cc\u9762\u6a21\u578b\u540d\u79f0\u7684\u987a\u5e8f\uff0c\u4e0eCLASSES\u548ccoco_classes\u91cc\u9762\u7684\u987a\u5e8f\u4fdd\u6301\u4e00\u81f4\u3002\n \uff082\uff09\u4fee\u6539 faster_rcnn_r101_2x_coco.py mmdetection/xianjin/faster_rcnn_r101_2x_coco.py \u4fee\u653946\u884c\uff0cnum_clasess\u7684\u503c\uff0c\u65b0\u589e1\u4e2a\uff0c\u5c31 +1\uff1b \uff083\uff09\u4fee\u6539 coco.py mmdetection/mmdet/datasets/coco.py CLASSES = ()\uff0c\u5728\u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b \uff084\uff09\u4fee\u6539 class_names.py mmdetection/mmdet/core/evaluation/class_names.py coco_classes \u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#5","title":"5\u3001\u7f13\u5b58\u6e05\u7406","text":"\u5220\u9664 mmdetection/build \u76ee\u5f55 python setup.py install\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#6","title":"6\u3001\u8bad\u7ec3\u6a21\u578b","text":"\uff081\uff09\u6307\u5b9a\u81ea\u5df1\u914d\u7f6e\u7684\u8bad\u7ec3\u6a21\u578b\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py --gpus 1\n \uff082\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u6d4b\u8bd5\u96c6\u7ed3\u679c\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py xianjin/epoch_24.pth --show\n \uff083\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u51c6\u786e\u5ea6\uff1b python tools/analysis_tools/analyze_logs.py plot_curve xianjin/20210530_011907.log.json --keys acc\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#7","title":"7\u3001\u5feb\u6377\u64cd\u4f5c","text":"python3 run.py\n \u5c06\u4ee5\u4e0a 4 - 7 \u6b65\u64cd\u4f5c\u6574\u5408\u6210 run.py\uff0c\u4e00\u952e\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u4e94\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\uff1b \u670d\u52a1\u7aef\u4e00\u53f0\uff08\u76ee\u524d\u4ec5\u652f\u6301AMD\u67b6\u6784\uff09\uff1b \u91c7\u96c6\u76d2\u4e00\u4e2a \uff08ACASIS hdmi\u89c6\u9891\u91c7\u96c6\u5361\uff0chttps://item.jd.com/10024310742602.html \uff09\uff1b USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\uff1b USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff1b \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5USB\u5ef6\u957f\u7ebf\uff1b \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u63a8\u8350\u914d\u7f6e","text":"\u6267\u884c\u7528\u4f8b\u7684\u670d\u52a1\u7aef\u5bf9\u914d\u7f6e\u6ca1\u6709\u7279\u6b8a\u8981\u6c42\uff0c\u5982\u679c\u6761\u4ef6\u5141\u8bb8\u914d\u7f6e\u8d8a\u9ad8\uff0c\u8bc6\u522b\u901f\u5ea6\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n \u6d4b\u8bd5\u673a\u4e0a\u4e0d\u6267\u884c\u4efb\u4f55\u811a\u672c\uff0c\u5177\u4f53\u914d\u7f6e\u6839\u636e\u6d4b\u8bd5\u9700\u8981\u51b3\u5b9a\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#usb_mk","title":"\u516d\u3001USB_MK\u4e32\u53e3\u9a71\u52a8\u65b9\u6cd5","text":"\u4f4d\u4e8econtrol_method\u76ee\u5f55\u4e0b\u7684usb_mk.py\u6587\u4ef6 \uff081\uff09\u5217\u51fa\u53ef\u901a\u4fe1\u7684\u7aef\u53e3 python3 -m serial.tools.list_ports -v\n \uff082\uff09\u4fee\u6539\u4e32\u53e3\u7684\u6743\u9650 sudo chmod 777 /dev/ttyACM0\n \uff083\uff09\u5b9e\u4f8b\u5316USB_MK import UsbMk\nusb_mk = UsbMk(\"/dev/ttyACM0\", 9600) # \u8bbe\u5907\u9ed8\u8ba49600\u4e3a\u6ce2\u7279\u7387\uff0c\u63a7\u5236\u4f20\u8f93\u901f\u7387\n \uff084\uff09USB\u4e32\u53e3\u8bbe\u5907\u9ed8\u8ba4\u6ce2\u7279\u7387\u4e3a9600\uff08\u7ecf\u6d4b\u8bd5\u6ce2\u7279\u73879600\u51c6\u786e\u6027\u6700\u597d\uff09\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up() # \u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u6c49\u5b57\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e\n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff083\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff084\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff085\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() # \u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2\n \uff086\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff087\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff088\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e03\u3001\u65b9\u6cd5\u8c03\u7528\u5165\u53c2\u89c4\u5219","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_7","title":"1\u3001\u57fa\u7c7b","text":"class Base:\ndef __init__(self):\nself._obj = image\nself._usb = usb_mk\ndef find_element_by_ai(self, element):\nreturn self._obj.find_element(element)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_6","title":"2\u3001\u5165\u53c2\u8bf4\u660e","text":"\u56fe\u50cf\u8bc6\u522b\u65b9\u6cd5\u5165\u53e3\u4e3a Base \u7c7b\u4e0b\u7684 find_element_by_ai \u3002\u4ec5\u63a5\u53d7\u4e00\u4e2a\u53c2\u6570 element\uff0c\u7c7b\u578b\u4e3a string\u3002 \u53ef\u8bc6\u522b\u7684 string \u683c\u5f0f\uff1a \uff081\uff09\u5927\u56fe\u6807\uff08 \u56fe\u6807\u5927\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\uff0c\u4f8b\uff1a Base().find_element_by_ai(\"window\")\n \uff082\uff09\u5927\u56fe\u6807 / \u5c0f\u56fe\u6807\uff08\u56fe\u6807\u5c0f\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5c0f\u56fe\u6807\uff0c\u4f8b\uff1awindow/search_btn Base().find_element_by_ai(\"window/search_btn\")\n \uff083\uff09\u5927\u56fe\u6807 / OCR\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\u5185\u7684\u6587\u5b57\uff0c\u4f8b\uff1amenu/\u5c5e\u6027 Base().find_element_by_ai(\"menu/\u5c5e\u6027\")\n \uff084\uff09OCR\uff1a\u5168\u5c4f\u8bc6\u522b\u6587\u5b57 Base().find_element_by_ai(\"\u641c\u7d22\")\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516b\u3001\u9690\u85cf\u9f20\u6807","text":"\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u8fc7\u6765\u7684\u89c6\u9891\u6d41\uff0c\u5728\u8bc6\u522b\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u53d7\u5230\u9f20\u6807\u5f71\u54cd\uff0c\u56e0\u6b64\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u9690\u85cf\u9f20\u6807\u3002 \u5c4f\u853d\u9f20\u6807\u5149\u6807\u663e\u793a ```shell script /etc/lightdm/lightdm.conf \u5728`[Seat:*]`\u4e0b\u9762\u6dfb\u52a0\u53c2\u6570\n```shell script\nxserver-command=X -bs -core -nocursor\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e5d\u3001\u667a\u80fd\u81ea\u52a8\u5316\u7684\u610f\u4e49","text":"1\u3001\u6539\u5584 Acessibility \u5b9a\u4f4d\u7684\u7a33\u5b9a\u6027\u95ee\u9898 Acessibility \u5c5e\u6027\u5b9a\u4f4d\u5b58\u5728\u5076\u5c14\u5931\u6548\u7684\u60c5\u51b5 \uff081\uff09\u5f00\u53d1\u5728\u505a\u65b0\u9700\u6c42\u5f00\u53d1\u65f6\u53ef\u80fd\u6d89\u53ca\u5230\u5bf9\u5c5e\u6027\u6807\u7b7e\u7684\u4fee\u6539\u6216\u8005\u5c42\u7ea7\u7684\u8c03\u6574\uff0c\u53ef\u80fd\u9020\u6210\u81ea\u52a8\u5316\u7528\u4f8b\u65e0\u6cd5\u5b9a\u4f4d\u5230\u5143\u7d20\u3002 \u6bd4\u59821040\u9636\u6bb5\uff0c\u97f3\u4e50\u91cd\u6784\u7684\u65f6\u5019\uff0c\u5f00\u53d1\u5bf9\u90e8\u5206\u5c5e\u6027\u548c\u5c42\u7ea7\u505a\u4e86\u4fee\u6539\uff0c\u5bfc\u81f4\u81ea\u52a8\u5316\u7528\u4f8b\u5b9a\u4f4d\u65b9\u6cd580%\u9700\u8981\u4fee\u6539\u3002 \u5f00\u53d1\u65b0\u529f\u80fd\u7684\u65f6\u5019\u5076\u5c14\u4e5f\u4f1a\u5bf9\u5c5e\u6027\u505a\u8c03\u6574\uff0c\u9047\u52305\u6b21\u3002 \uff082\uff09\u76ee\u524d\u4e3b\u8981\u4f7f\u7528Dogtail\u8bc6\u522b\u5e94\u7528Acessibility\u5c5e\u6027\u8fdb\u884c\u5b9a\u4f4d\uff0c\u662f\u83b7\u53d6\u5e94\u7528\u5f53\u524d\u754c\u9762\u7684\u5c5e\u6027tree\uff0c\u5728\u5e94\u7528\u8df3\u8f6c\u540e\uff0cDogtail\u5b58\u5728\u65e0\u6cd5\u53ca\u65f6\u83b7\u53d6\u5f53\u524d\u5c5e\u6027\u5217\u8868\u7684\u60c5\u51b5\u3002 \u591a\u5a92\u4f53\u8c03\u7528\u6587\u7ba1\u7a97\u53e3\u7684\u65f6\u5019\uff0c\u51fa\u73b0\u627e\u4e0d\u5230\u6587\u7ba1\u91cc\u9762\u5143\u7d20\u7684\u60c5\u51b5\uff0c\u76ee\u524d\u51fa\u73b010+\u6b21\u3002 \u5e94\u7528\u8bbe\u7f6e\u9875\u9762\u7684\u5c5e\u6027\u5076\u5c14\u5b58\u5728\u627e\u4e0d\u5230\u7684\u60c5\u51b5\uff0c\u9047\u52305\u6b21\u3002 \uff083\uff09Dogtail\u5de5\u5177\u672c\u8eab\u5b58\u5728\u95ee\u9898\uff0c\u6709\u65f6\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u5019\u5f88\u6162\uff0c\u8ba9\u4eba\u65e0\u6cd5\u63a5\u53d7\uff0c\u76ee\u524d\u51fa\u73b0\u8fc7\u5f88\u591a\u6b21\u3002 \u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u95f4\u6bd4\u5e73\u5e38\u61623\u500d\uff0c\u51fa\u73b04\u6b21\u3002 2\u3001\u89e3\u51b3\u4e86\u4f7f\u7528\u7edd\u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898 \u90e8\u5206\u63a7\u4ef6\u65e0\u6cd5\u6dfb\u52a0 Acessibility \u5c5e\u6027\u4ece\u800c\u4f7f\u7528\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u51fa\u73b0\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898\u3002 \uff081\uff09\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u65b9\u6cd5\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u76ee\u6807\u56fe\u7247\u8d44\u6e90\uff0c\u5728 UI \u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u4f1a\u6d89\u53ca\u5230\u76ee\u6807\u8d44\u6e90\u7684\u66ff\u6362\uff0c\u6bd4\u8f83\u8017\u8d39\u4eba\u529b\u3002 \uff082\uff09\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6cd5\u5bf9\u6bd4\u7cbe\u5ea6\u6bd4\u8f83\u641e\uff0c\u5982\u679cUI \u7684\u53d8\u66f4\u4f1a\u9020\u6210\u65e0\u6cd5\u51c6\u786e\u5b9a\u4f4d\u5230\uff0c\u81ea\u52a8\u5316\u811a\u672c\u5065\u58ee\u6027\u4e0d\u8db3\u3002 3\u3001\u4f7f\u7528\u673a\u5668\u5206\u79bb\uff0c\u89e3\u51b3\u4e86\u81ea\u52a8\u5316\u811a\u672c\u5bf9\u5e94\u7528\u7684\u5f71\u54cd\uff0c\u771f\u5b9e\u8fd8\u539f\u7528\u6237\u7684\u4f7f\u7528\u573a\u666f \u673a\u5668\u5206\u79bb\u7684\u67b6\u6784\u8bbe\u8ba1\uff0c\u4fdd\u8bc1\u4e86\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u73af\u5883\u5b8c\u5168\u7b49\u540c\u4e8e\u7528\u6237\uff0c\u6392\u9664\u6d4b\u8bd5\u811a\u672c\u7684\u5f71\u54cd\u3002 \uff081\uff09\u76ee\u524d\u7684\u529f\u80fd\u81ea\u52a8\u5316\u662f\u5728\u6d4b\u8bd5\u673a\u4e0a\u76f4\u63a5\u8fd0\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\uff0c\u52a0\u4e0a\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u6211\u4eec\u6dfb\u52a0\u4e86\u4e00\u4e9b\u8fdb\u7a0b\u76d1\u63a7\u3001\u89c6\u9891\u5f55\u5236\u7b49\u529f\u80fd\uff0c\u81ea\u52a8\u5316\u811a\u672c\u672c\u8eab\u4f1a\u6d88\u8017\u4e00\u4e9b\u7cfb\u7edf\u8d44\u6e90\uff0c\u65e0\u6cd5\u8fd8\u539f\u771f\u662f\u7684\u7528\u6237\u4f7f\u7528\u573a\u666f\u3002 \uff082\uff09\u6027\u80fd\u6d4b\u8bd5\u9700\u8981\u6392\u9664\u5176\u4ed6\u7a0b\u5e8f\u7684\u8d44\u6e90\u6d88\u8017\u5f71\u54cd\uff0c\u6027\u80fd\u81ea\u52a8\u5316\u91c7\u7528\u673a\u5668\u5206\u79bb\uff0c\u4fdd\u8bc1\u4e86\u6027\u80fd\u6570\u636e\u7684\u51c6\u786e\u6027\u3002 \u4ee5\u524d\u7684\u7528\u4f8b\u6267\u884c\u8017\u65f6\u6ca1\u6761\u572830\u79d2\u5de6\u53f3\uff0c\u73b0\u5728\u7528\u4f8b\u8017\u65f6\u572810\u79d2\u3002 4\u3001\u89e3\u51b3\u4e86UI \u8c03\u6574\u5bfc\u81f4\u5b9a\u4f4d\u5931\u8d25\u7684\u4e0d\u7a33\u5b9a\u6027\u95ee\u9898 \uff081\uff09\u89e3\u51b3\u4e86\u56e0 UI \u8c03\u6574\u5bfc\u81f4\u63a7\u4ef6\u4f4d\u7f6e\u53d8\u5316\u6216\u8272\u5dee\u53d8\u5316\u540e\u5b9a\u4f4d\u4e0d\u51c6\u786e\u7684\u95ee\u9898\uff0c\u53ea\u8981\u63a7\u4ef6\u6587\u6848\u548c\u63a7\u4ef6\u5916\u8fb9\u6846\u65e0\u53d8\u5316\u5747\u53ef\u51c6\u786e\u5b9a\u4f4d\uff1b \uff082\uff09\u76ee\u524d\u4e5f\u4f1a\u91c7\u7528\u57fa\u4e8eUI\u7684\u5b9a\u4f4d\u65b9\u6848\uff0c\u5982\u679cUI\u4f4d\u7f6e\u6709\u8c03\u6574\uff0c\u4f1a\u5bfc\u81f4\u5143\u7d20\u65e0\u6cd5\u5b9a\u4f4d\u3002 5\u3001\u7b80\u5316\u4e86\u7528\u4f8b\u7ed3\u6784\uff0c\u63d0\u5347\u7f16\u5199\u53cb\u597d\u5ea6 \uff081\uff09\u667a\u80fd\u81ea\u52a8\u5316\u8bc6\u522b\u5143\u7d20\u7684\u65b9\u6cd5\u53ea\u6709\u4e00\u4e2a\uff0c\u5c31\u662f\u57fa\u4e8e\u6211\u4eec\u8bad\u7ec3\u7684\u6a21\u578b\u8bc6\u522b\u89c6\u9891\u6d41\u4e2d\u7684\u5143\u7d20\uff0c\u7ecf\u8fc7\u811a\u672c\u5c01\u88c5\u4e4b\u540e\uff0c\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u4e2d\u6240\u6709\u5b9a\u4f4d\u7684\u64cd\u4f5c\u90fd\u53ea\u9700\u8981\u8c03\u7528\u8fd9\u4e00\u4e2a\u65b9\u6cd5\u5c31\u884c\u4e86\uff0c\u7f16\u5199\u81ea\u52a8\u5316\u811a\u672c\u7684\u96be\u5ea6\u5927\u5927\u964d\u4f4e\u3002 \uff082\uff09\u4e5f\u662f\u7531\u4e8e\u8c03\u7528\u65b9\u6cd5\u7b80\u5355\uff0c\u5728 UI \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u4e2d\u7684\u5206\u5c42\u7ed3\u6784\u5c06\u4f1a\u51cf\u5c11\uff0c\u591a\u7ee7\u627f\u7684\u60c5\u51b5\u4f1a\u51cf\u5c11\uff0c\u81ea\u52a8\u5316\u4ee3\u7801\u7684\u8c03\u7528\u7ed3\u6784\u4e5f\u4f1a\u53d8\u5f97\u7b80\u5355\uff0c\u800c\u4e14\u529f\u80fd\u6d4b\u8bd5\u540c\u5b66\u7f16\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u66f4\u52a0\u5bb9\u6613\u4e0a\u624b\u3002 \u4ee5\u524d\u5199\u7528\u4f8b\u7531\u4e8e\u9700\u8981\u7ed3\u5408\u4e0d\u540c\u7684\u6a21\u5757\uff0c\u8c03\u7528\u4e0d\u540c\u7684\u65b9\u6cd5\uff0c\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u5e76\u5b8c\u6210\u8c03\u8bd5\u7684\u65f6\u95f4\u5e73\u5747\u572820-30\u5206\u949f\uff0c\u73b0\u5728\u5199\u7528\u4f8b\u811a\u672c\u80fd\u57285\u5206\u949f\u5de6\u53f3\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":"# =============================================\n# Attribution : Application Test Department III\n# Time : 2023/1/3\n# Author : ut003281\n# =============================================\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u7b80\u8ff0","text":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5 \u901a\u8fc7\u81ea\u52a8\u5316\u624b\u6bb5\u5bf9\u5e94\u7528\u8fdb\u884c\u6027\u80fd\u6d4b\u8bd5\uff0c\u63d0\u4f9b\u65b9\u4fbf\u7684\u73af\u5883\u90e8\u7f72\u3001\u8fd0\u884c\u914d\u7f6e\u3001\u7528\u4f8b\u7f16\u5199\u7b49\uff0c\u7528\u4e8e\u684c\u9762\u5e94\u7528\u7684\u51b7\u70ed\u542f\u52a8\u3001\u8d44\u6e90\u62f7\u8d1d\u3001\u9875\u9762\u8df3\u8f6c\u7b49\u6027\u80fd\u573a\u666f\u6d4b\u8bd5\u3002 \u4ed3\u5e93\u5730\u5740\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-perf-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u4ee3\u7801\u7ed3\u6784","text":"autotest-perf-aitest\n\u251c\u2500\u2500 apps # \u5b58\u653e\u6240\u6709\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u811a\u672c\n\u251c\u2500\u2500 conftest.py # pytest hook\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 CURRENT # \u7248\u672c\u5185\u5bb9\n\u251c\u2500\u2500 docs # \u6587\u6863\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u952e\u503c\u5bf9\u7167\u8868.pdf # \u4e32\u53e3\u7ebfcode\u4e0e\u6309\u952e\u7684\u5bf9\u7167\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u6027\u80fd\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\u6267\u884c\u5668\u4f7f\u7528\u6307\u5357.md # \u6267\u884c\u5668\u811a\u672c\u4f7f\u7528\u6307\u5357\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 USB\u4e32\u53e3\u8f6cUSB\u952e\u76d8\u9f20\u6807\u7ebf\u534f\u8bae\u6587\u4ef6V1.0.pdf # \u4e32\u53e3\u534f\u8bae\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput-0.28.2.zip # Linux\u4e0b\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\u7684\u6e90\u7801\uff0c\u53ef\u6839\u636e\u67b6\u6784\u6253\u5305\n\u251c\u2500\u2500 manage.py # \u529f\u80fd\u4e3b\u5165\u53e3\n\u251c\u2500\u2500 pytest.ini # pytst \u914d\u7f6e\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 setting # \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 client.ini # \u6d4b\u8bd5\u673a IP \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5168\u5c40\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dev_env.sh # \u5bbf\u4e3b\u673a\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose_no_relay.yml # \u65e0\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose.yml # \u6709\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker_login.sh # docker \u767b\u9646\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 res\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 black.png # \u5168\u9ed1\u56fe\u7247\uff0c\u7528\u4e8e\u4fee\u6539\u58c1\u7eb8\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_5000.deb # 3A5000 \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_amd64.deb # amd \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_arm64.deb # arm \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_mips64.deb # mips \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_sw_64.deb # sw \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 server.ini # \u670d\u52a1\u5668\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 setup.sh # \u5bb9\u5668\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 template # \u521b\u5efa app \u57fa\u7840\u811a\u672c\u6a21\u677f\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 app_template\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ${app_name}_widget.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 control-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 images\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 test_${app_name}_01_scene.json-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 test_${app_name}_01_scene.py-tpl\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 uos_docker # \u5bb9\u5668\u73af\u5883\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dockerfile\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 requirements.txt\n\u2514\u2500\u2500 src\n \u251c\u2500\u2500 analysis_save.py # \u89e3\u6790\u56fe\u7247\u6d41\u7ed3\u679c\uff0c\u6c47\u603b\u751f\u6210 excel \u62a5\u544a\n\u251c\u2500\u2500 base_widget.py # \u5c01\u88c5\u7684\u57fa\u7840\u64cd\u4f5c\uff0c\u5e94\u7528\u8c03\u7528\u7684\u4e3b\u5165\u53e3\u65b9\u6cd5\n\u251c\u2500\u2500 cmdctl.py # \u8c03\u7528\u547d\u4ee4\u884c\u4f7f\u7528\n\u251c\u2500\u2500 global_value.py # \u5168\u5c40\u53d8\u91cf\n\u251c\u2500\u2500 image_utils.py # \u56fe\u7247\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 __init__.py\n \u251c\u2500\u2500 logger_utils.py # \u65e5\u5fd7\u914d\u7f6e\n\u251c\u2500\u2500 pdocr.py # ocr \u914d\u7f6e\n\u251c\u2500\u2500 public_method.py # \u4e00\u4e9b\u65b9\u4fbf\u7684\u5c01\u4f4f\n\u251c\u2500\u2500 record.py # \u5f55\u5c4f\u76f8\u5173\n\u251c\u2500\u2500 rtk # \u8fd0\u884c\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 _base.py # \u4e00\u4e9b\u679a\u4e3e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 install_env.py # \u5b89\u88c5\u73af\u5883\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 local_runner.py # \u8fd0\u884c\u7528\u4f8b\n\u251c\u2500\u2500 serial_communication # \u4e32\u53e3\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 power_control.py # \u7ee7\u7535\u5668\u64cd\u4f5c\uff0c\u4f7f\u7528\u7ee7\u7535\u5668\u8fde\u63a5\u4e3b\u673a\u7535\u6e90\uff0c\u63a7\u5236\u5f00\u5173\u673a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 serial_common.py # \u4e32\u53e3\u516c\u5171\u65b9\u6cd5\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 usb_mk.py # \u952e\u9f20\u64cd\u4f5c\u57fa\u7840\u5c01\u88c5\n\u251c\u2500\u2500 shortcut_key.py # \u5feb\u6377\u952e\u7684\u5c01\u88c5\n\u251c\u2500\u2500 singleton.py # \u5355\u4f8b\u6a21\u5f0f\n\u251c\u2500\u2500 start_app.py # \u521b\u5efa app\n\u2514\u2500\u2500 write_xlsx.py # \u751f\u6210 excel\n# __init__.py \u6587\u4ef6\u4e3a\u6807\u8bc6\u8be5\u76ee\u5f55\u662f\u4e00\u4e2aPython\u7684\u6a21\u5757\u5305\uff0c\u9879\u76ee\u4e2d\u7684__init__.py\u5747\u4e3a\u7a7a\u6587\u4ef6\u3002\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u73af\u5883\u642d\u5efa","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\u3002 \u670d\u52a1\u7aef\u4e00\u53f0\u3002\uff08\u4ec5\u652f\u6301 AMD \u67b6\u6784\uff0c\u82e5\u9700\u5176\u4ed6\u67b6\u6784\uff0c\u54a8\u8be2\u76f8\u5173\u5f00\u53d1\u4eba\u5458\uff09 \u91c7\u96c6\u76d2\u4e00\u4e2a\u3002 \uff08ACASIS HDMI \u89c6\u9891\u91c7\u96c6\u76d2\uff0chttps://item.jd.com/100013302599.html#crumb-wrap \uff09 USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\u3002\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"\uff082\uff09\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\u3002 USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff08USB3.0 \u63a5\u53e3\u4e0a\uff09\u3002 \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5 USB \u5ef6\u957f\u7ebf\u3002 \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u670d\u52a1\u7aef\u63a8\u8350\u914d\u7f6e","text":"\u914d\u7f6e\u8d8a\u9ad8\uff0c\u89e3\u6790\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"2\u3001\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa","text":" \u6253\u5f00\u63a7\u5236\u4e2d\u5fc3\uff0c\u8d26\u6237\u8bbe\u7f6e\u4e3a\u3010\u81ea\u52a8\u767b\u5f55\u3011\u548c\u3010\u65e0\u5bc6\u7801\u767b\u5f55\u3011\uff0c\u7535\u6e90\u7ba1\u7406\u4e2d\u4f7f\u7528\u7535\u6e90\u5168\u90e8\u8bbe\u7f6e\u4e3a\u3010\u4ece\u4e0d\u3011\uff0c\u5f00\u542f\u5f00\u53d1\u8005\u6a21\u5f0f\u3002 \u6839\u636e\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u8981\u6c42\uff0c\u5bfc\u5165\u76f8\u5173\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\uff1a\u5bfc\u5165\u76f8\u518c\u3001\u5f71\u9662\u3001\u97f3\u4e50\u7684\u6d4b\u8bd5\u8d44\u6e90\u3002 \u5728\u670d\u52a1\u7aef\u6253\u5f00\u76f8\u673a\u5e94\u7528\u540e\uff0c\u5c06\u6d4b\u8bd5\u673a\u684c\u9762\u58c1\u7eb8\u66f4\u6362\u4e3a\u7eaf\u8272\u58c1\u7eb8\uff08\u6ce8\u610f\uff0c\u670d\u52a1\u7aef\u9700\u63d0\u524d\u5f00\u542f\u76f8\u673a\u540e\u518d\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u58c1\u7eb8\uff0c\u5efa\u8bae\u7eaf\u9ed1\u58c1\u7eb8 setting/res/black.png\uff09 \u5728\u6587\u4ef6\u7ba1\u7406\u5668\u4e2d\uff0c\u5c06\u9009\u9879 \u4e3b\u83dc\u5355-\u8bbe\u7f6e-\u9884\u89c8-\u56fe\u7247\u9884\u89c8 \u53d6\u6d88\u52fe\u9009\uff08\u5982\u4e0d\u53d6\u6d88\uff0c\u4f1a\u5f71\u54cd\u622a\u56fe\u5f55\u5c4f\u5e94\u7528\u7684\u6027\u80fd\u6570\u636e\uff09 \u79fb\u52a8\u6216\u5220\u9664\u7cfb\u7edf Logo \uff0c\u6392\u9664\u684c\u9762\u53f3\u4e0b\u89d2 Logo \u7684\u5f71\u54cd\uff08\u91cd\u542f\u751f\u6548\uff09\u3002 sudo mv /usr/share/deepin/uos_logo.svg ~/Pictures/\n \u5b89\u88c5\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\uff08\u5fc5\u987b\u5b89\u88c5\uff01\uff01\uff09 AMD \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_amd64.deb ARM \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_arm64.deb MIPS \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_mips64.deb 3A5000 \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_5000.deb \u5b89\u88c5\u547d\u4ee4 sudo dkpg -i xserver-xorg-input-libinput_0.28.2-2_amd64.deb\n \u5b89\u88c5\u65f6\u4f1a\u63d0\u793a\u5df2\u5b58\u5728\u76f8\u540c\u7248\u672c\uff0c\u8bf7\u5ffd\u7565\uff0c\u76f4\u63a5\u8986\u76d6\u5b89\u88c5\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u4e3b\u673a\u624d\u751f\u6548"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u670d\u52a1\u7aef\u4e00\u952e\u73af\u5883\u90e8\u7f72","text":"\u73af\u5883\u642d\u5efa\u524d\u5fc5\u987b\u5148\u8fde\u63a5\u4e0a USB \u4e32\u53e3\u7ebf\u548c\u91c7\u96c6\u76d2\u3002 \u5bbf\u4e3b\u673a\u73af\u5883\u5b89\u88c5 python3 manage.py install --env host\n \u5bb9\u5668\u73af\u5883\u5b89\u88c5 python3 manage.py install --env docker\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u56db\u3001\u914d\u7f6e\u9879","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u670d\u52a1\u7aef\u914d\u7f6e","text":"setting/config/server.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u914d\u7f6e\u9879\uff0c\u5305\u542b\u4e86\u6240\u6709\u670d\u52a1\u7aef\u6240\u6709\u7684\u53ef\u914d\u7f6e\u9879\u3002 \u672c\u5730\u65e0\u7f51\u7edc\u8fd0\u884c \u5c06\u914d\u7f6e\u9879 network=0 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u672c\u5730\u6709\u7f51\u7edc\u8fd0\u884c \u914d\u7f6e\u9879 network=1 (1)\u914d\u7f6e\u9879 client_alias= \u914d\u7f6e\u4e3a\u4f60\u8981\u6d4b\u8bd5\u7684\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5982 Alias1 \u6d4b\u8bd5\u673a\u522b\u540d\u5728 setting/config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 (2)\u914d\u7f6e\u9879 client_alias= \u4e3a\u7a7a\uff0c\u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager --client_alias Alias1\uff0c\u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002(Alias1 \u4e3a\u4f60\u914d\u7f6e\u7684\u6d4b\u8bd5\u673a\u522b\u540d) (1)\u548c(2)\u53ea\u8981\u4f7f\u7528\u5176\u4e00\u5373\u53ef\u3002 \u6709\u7f51\u7edc\u8fd0\u884c\uff0c\u4e14\u9700\u8981\u901a\u8fc7 Jenkins \u4e0a\u8fd0\u884c\u4e00\u4e2a job \uff0c\u540c\u65f6\u63a7\u5236\u591a\u53f0\u673a\u5668\u3002 \u914d\u7f6e\u9879 network=1 \u914d\u7f6e\u9879 client_alias= \u4e0d\u7528\u914d\u7f6e\uff0c\u5728\u8fd0\u884c run.sh \u7684\u65f6\u5019\u76f4\u63a5\u7a7a\u683c\u52a0\u522b\u540d\u5373\u53ef\uff0c\u6bd4\u5982\uff1a\u6d4b\u8bd5\u673a\u522b\u540d\u4e3a Alias1 \uff0c\u4e14\u5df2\u7ecf\u5728 config/client.ini \u4e2d\u914d\u7f6e\u4e86 Alias1 \u7684user ip password \uff0c\u5219\u8fd0\u884c bash run.sh Alias1 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u5728 Jenkins pipeline \u91cc\u9762\u901a\u8fc7\u5e76\u884c stage \u6216\u5e76\u884c\u8c03\u7528\u4e0b\u5c42\u4efb\u52a1\u7684\u65b9\u5f0f\u53ef\u4ee5\u5b9e\u73b0\u5927\u89c4\u6a21\u7684\u6027\u80fd\u6d4b\u8bd5\u9700\u6c42\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;1\u3001KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2\u3001KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f, e.g. TAGS = L1 or smoke\n[case_conf]\n# \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\uff0cocr\u6587\u6848\u8bc6\u522b\u8f83\u6162\uff0c\u4e0d\u63a8\u8350\u4f7f\u7528\nfind_by = stage\n# \u6700\u540e\u4e00\u4e2a\u7a33\u5b9a\u9636\u6bb5\u7684\u5e27\u6570\u8bc6\u522b\n# \u9996\u5e27\u5b58\u5728\u540e\u7684\u7b2c\u4e00\u4e2a\u5927\u4e8e\u8be5\u914d\u7f6e\u5e27\u6570\u7684\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u5c3e\u5e27\nfinal_stable_num=100\n# \u4ece\u8be5\u5e27\u6570\u5f00\u59cb\u8bc6\u522b\u6587\u6848\u6216\u56fe\u7247\uff0c\u51cf\u5c11\u5206\u6790\u65f6\u95f4\nstart_num = 150\n# \u8bc6\u522b\u7684\u6587\u6848\ntext=\n# \u8bc6\u522b\u56fe\u7247\nmatch=apps/xxx/images/match.png\n# \u8bc6\u522b\u76f8\u4f3c\u5ea6\nmatch_rate=0.9\n# \u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6bd4\u5982\u70ed\u542f\u52a8\u7528\u4f8b\uff0c\u4ece\u70b9\u51fb\u6253\u5f00\u5230\u505c\u6b62\u5f55\u5c4f\uff0c\u4e2d\u95f4\u7b49\u5f855\u79d2\uff1b\nduration = 15\n# \u5355\u6761\u7528\u4f8b\u6267\u884c\u7684\u6b21\u6570\ncount = 5\n# \u7a33\u5b9a\u9636\u6bb5\u5212\u5206\u7684\u76f8\u4f3c\u5ea6\nstable_similarity = 0.9997\n[server]\n# \u8c03\u8bd5\u6a21\u5f0f=1\uff0c\u4e3a\u5f00\u542f\u8c03\u8bd5\u6a21\u5f0f\uff0c0\u4e3a\u5173\u95ed\u3002\n# \u8c03\u8bd5\u6a21\u5f0f\u4e0b\u9ed8\u8ba4\u53ea\u6267\u884c\u4e00\u6b21\u7528\u4f8b\uff0c\u4e0d\u5173\u673a\n# \u7f16\u5199\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u5efa\u8bae\u5f00\u542fmaintain\u3002\nMAINTAIN = 0\n# \u8fd0\u884c\u7684\u73af\u5883docker\u5bb9\u5668\u73af\u5883\uff0chost\u5bbf\u4e3b\u673a\u73af\u5883\nENV = docker\n# \u670d\u52a1\u7aef\u5bc6\u7801\nPASSWORD=1\n# \u6307\u5b9a\u6d4b\u8bd5\u673a\u522b\u540d\n# \u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6bd4\u5982\uff1a\n# [AMD]\n# ip=10.8.15.86\n# user=uos\n# \u5176\u4e2d AMD \u4e3a\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5219client_alias=AMD\nCLIENT_ALIAS = x86\uff08Intel-i7\uff09\n# 1 \u5f00\u542f\u7f51\u7edc, 0 \u5173\u95ed\u7f51\u7edc\n# \uff081\uff09\u670d\u52a1\u7aef\u4e0e\u6d4b\u8bd5\u673a\u987b\u5728\u540c\u4e00\u7f51\u6bb5\u4e0b\uff0c\u4f60\u53ef\u4ee5\u5c1d\u8bd5\u5728\u670d\u52a1\u7aef\u901a\u8fc7ssh\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c\u5982\u679c\u53ef\u4ee5\u8fde\u63a5\uff0c\u8bf4\u660e\u7f51\u7edc\u6b63\u5e38\u3002\n# \uff082\uff09\u5f53input_type=FILE_NAME \u65f6\uff0c\u5fc5\u987b\u5f00\u542f\u7f51\u7edc\u3002\nNETWORK = 1\n# \u6027\u80fd\u7ed3\u679c\u7edf\u8ba1\u5355\u4f4d \u6beb\u79d2\u2014ms, \u79d2\u2014s\nUNIT=ms\n# \u6d4b\u8bd5\u673a\u5f00\u673a\u8fdb\u5165\u684c\u9762\u540e\u7b49\u5f85\u65f6\u95f4,\u5355\u4f4d/\u79d2\nSTARTUP_DELAY = 60\n# 1\u4e3a\u5220\u9664\u7f13\u5b58\uff0c0\u4e3a\u4e0d\u5220\u9664\u7f13\u5b58\n# \u7528\u4f8b\u6267\u884c\u5b8c\u540e\u4f1a\u5728report\u76ee\u5f55\u4e0b\u751f\u6210\u667a\u80fd\u89e3\u6790\u7684\u4e00\u4e9b\u7f13\u5b58\u56fe\u7247\u3002\nCACHE = 0\n# \u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u62a5\u544a\u4f1a\u4fdd\u5b58\u5728\u9879\u76ee\u4e0breport\u76ee\u5f55\u4e2d\uff1b\n# \u6307\u5b9a\u62a5\u544a\u76ee\u5f55\u5219\u5b58\u653e\u5230\u6307\u5b9a\u76ee\u5f55\u3002\nREPORT_PATH = report\n# \u670d\u52a1\u7aef\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684icon\u8d44\u6e90\u4f1a\u7f13\u5b58\u5728\u9879\u76ee\u4e0binput\u76ee\u5f55\u4e2d\nINPUT = input/\n# 1\u4e3a\u6d4b\u8bd5\u5b8c\u5173\u673a\uff0c0\u4e3a\u6d4b\u8bd5\u5b8c\u4e0d\u5173\u673a\nSHUTDOWN = 0\n# \u89e3\u6790\u8fdb\u7a0b\u6570\uff08\u4e0d\u63a8\u8350\u4fee\u6539\uff09\n# 3\u4e2a\u8fdb\u7a0b\u89e3\u6790\u89c6\u9891\u5df2\u7ecf\u80fd\u591f\u6ee1\u8db3\uff0c\u5373\u4f7f\u589e\u52a0\u8fdb\u7a0b\u6570\u4e5f\u4e0d\u80fd\u51cf\u5c11\u6574\u4f53\u8017\u65f6\n# \u53e6\u5916\u8fd8\u8981\u770bCPU\u6838\u6570\u662f\u5426\u652f\u6301\u3002\nPARSING_PROCESS = 3\n# 1\u4e3a\u4f7f\u7528\u7ee7\u7535\u5668\u5f00\u5173\u673a\uff0c0\u4e3a\u4f7f\u7528reboot\u547d\u4ee4\u91cd\u542f\u3002\u4f9d\u8d56\u7ee7\u7535\u5668\u786c\u4ef6\u8bbe\u5907\uff0c\u9700\u8981\u4f7f\u7528\u8054\u7cfb\u5f00\u53d1\u8005\nRELAY = 0\n# \u83b7\u53d6\u6d4b\u8bd5\u5e94\u7528\u7684\u7248\u672c, %s \u5360\u4f4d\u5e94\u7528\u540d\n# \u5982\u679c\u8be5\u914d\u7f6e\u4e3a\u7a7a\uff0c\u5219\u4e0d\u83b7\u53d6\u5e94\u7528\u7684\u7248\u672c\u4fe1\u606f\u3002\nCOMMAND = apt policy %s 2>/dev/null|grep \"\u5df2\u5b89\u88c5\"|awk -F \"\uff1a\" \"{print \\$2}\"\n# \u5173\u673a\u7b49\u5f85\u5f00\u542f\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6839\u636e\u6d4b\u8bd5\u673a\u6027\u80fd\u4e0d\u540c\uff0c\u5f00\u5173\u673a\u8017\u65f6\u53ef\u80fd\u4e0d\u540c\uff0c\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u673a\u60c5\u51b5\u914d\u7f6e\u3002\nSHUTDOWN_DELAY = 30\n# \u53ef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u56fe\u7247\u683c\u5f0f\uff0c\u4ee5\u82f1\u6587\u9017\u53f7\u9694\u5f00\u3002\n# \u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u76ee\u524d\u6211\u4eec\u4ec5\u9a8c\u8bc1\u4e86jpg,jpeg,png\u8fd9\u4e09\u79cd\u5e38\u7528\u7684\u56fe\u7247\u683c\u5f0f\u3002\nINPUT_TYPES = jpg,jpeg,png\n# \u6027\u80fd\u5206\u6790\u8865\u5e27\uff0c\u7b49\u4e8e\u6216\u4f4e\u4e8e\u8be5\u503c\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u9700\u8981\u51cf\u6389\u3002\nUN_STAB_START = 3\n# \u670d\u52a1\u7aef\u83b7\u53d6\u6d4b\u8bd5\u673a\u56fe\u50cf\u7684\u5e27\u7387\uff0c\u5373\u6bcf\u79d2\u83b7\u53d6\u591a\u5c11\u5f20\u6d4b\u8bd5\u673a\u4e0a\u7684\u56fe\u50cf\u3002\n# \u9ed8\u8ba4\u5e27\u7387\u4e3a30\u5e27/\u79d2\uff0c\u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u53ef\u80fd\u4f1a\u5bf9\u89e3\u6790\u7ed3\u679c\u9020\u6210\u504f\u5dee\u3002\nFPS = 30\n# \u4ee5\u4e0b\u573a\u666f\u7c7b\u578b\u4f1a\u91cd\u542f\u6d4b\u8bd5\u673a,\u591a\u79cd\u573a\u666f\u4f7f\u7528\u9017\u53f7\u9694\u5f00\nSCENE = cold\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = http://10.8.13.78:8890\n#\u5c4f\u5e55\u56fe\u7247\u4e34\u65f6\u5b58\u653e\u4f4d\u7f6e\nSCREEN_CACHE = /tmp/screen\n# =======================================\n[log]\n# \u65e5\u5fd7\u7ea7\u522b\uff0cOFF\u3001FATAL\u3001ERROR\u3001WARN\u3001INFO\u3001DEBUG\u3001ALL\n# \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u65e5\u5fd7\u8f93\u51fa\uff0clog_cli=INFO\u8868\u793a \u4ec5\u8f93\u51faINFO\u53ca\u4ee5\u4e0a\u7ea7\u522b\u7684\u65e5\u5fd7\u3002\nLOG_LEVEL = DEBUG\n# \u65e5\u5fd7\u6587\u4ef6\u4fdd\u5b58\u8def\u5f84\nLOG_PATH= logs\n# =======================================\n[dockerhub]\n# \u5bb9\u5668\u767b\u9646\u8d26\u53f7\nDOCKER_USER = user\n# \u5bb9\u5668\u767b\u9646\u5bc6\u7801\nDOCKER_PASSWORD = User1234\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u6d4b\u8bd5\u673a\u914d\u7f6e","text":"setting/config/client.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u4fe1\u606f\u3002 \u6709\u7f51\u7edc\u7684\u60c5\u51b5\u4e0b\uff0c\u670d\u52a1\u7aef\u9700\u8981\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u56e0\u6b64\u4f60\u9700\u8981\u5199\u5165 \u6d4b\u8bd5\u673a\u522b\u540d \u3001 user \u3001ip\u3001 password \u3002 # \u6d4b\u8bd5\u673a\u522b\u540d\n[Alias1] # \u6d4b\u8bd5\u673aip\nip=10.8.15.86 # \u6d4b\u8bd5\u673a\u7528\u6237\u540d\nuser=uos\n \u547d\u540d\u5efa\u8bae\uff1aAliasA1\u3001AliasA2\u3001AliasB1\u3001AliasB2\uff0c\u4e0d\u8981\u91cd\u540d\u3002 \u65e0\u7f51\u7edc\u60c5\u51b5\u4e0b\uff0c\u4ec5\u9700\u8981\u5173\u6ce8\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\u9879 width=\u3001 height= \u5373\u53ef\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a [client]\n# \u9ed8\u8ba4\u6d4b\u8bd5\u673a\u7528\u6237\u540d\uff0c\u5bc6\u7801\uff0cip\nip=\nuser=\n# \u6d4b\u8bd5\u673a\u5bc6\u7801\npassword=1\n# \u6d4b\u8bd5\u673a\u4e3b\u9898\ntheme=bloom\n# \u6d4b\u8bd5\u673aicon\u76ee\u5f55\npath=/usr/share/icons\n# \u7cfb\u7edfdesktop\u6587\u4ef6\u7684\u5b58\u653e\u76ee\u5f55\uff0cUOS\u7cfb\u7edf\u9ed8\u8ba4\u4e3a/usr/share/applications\ndesktop_path=/usr/share/applications\n# \u7528\u4e8e\u5224\u65ad\u6d4b\u8bd5\u673a\u662f\u5426\u5f00\u673a\u8fdb\u5165\u684c\u9762\u7684\u8bc6\u522b\u6807\u8bc6\u3002\n# 1\u3001\u901a\u8fc7\u684c\u9762\u56fe\u6807\u8bc6\u522b\u3002\n# - type=FILE_NAME\u65f6\uff0c\u670d\u52a1\u5668\u548c\u6d4b\u8bd5\u673a\u5fc5\u987b\u5728\u540c\u4e00\u5c40\u57df\u7f51\u5185\u3002\n# - power_on=dde-computer\u8868\u793a\u901a\u8fc7\u684c\u9762\u8ba1\u7b97\u673a\u56fe\u6807\u5224\u65ad\u5f00\u673a\u8fdb\u5165\u684c\u9762\u3002\n# 2\u3001\u901a\u8fc7\u672c\u5730\u56fe\u7247\u4f5c\u4e3a\u5f00\u673a\u8bc6\u522b\u3002\n# - type= \u4f20\u5165\u4e3a\u56fe\u7247\u683c\u5f0f\uff0ctype\u652f\u6301\u7684\u7c7b\u578b\u5305\u542b\u5728server.ini\u5185\u914d\u7f6e\u9879input_type=jpg,jpeg,png\u3002\n# - power_on= \u4f20\u5165\u7684\u662f\u672c\u5730\u56fe\u7247\u7684\u8def\u5f84\u3002\ntype=FILE_NAME\npower_on=dde-computer\n# \u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\uff08\u6d4b\u8bd5\u673a\u8fde\u63a5\u91c7\u96c6\u76d2\uff0c\u91c7\u96c6\u76d2\u7684\u5206\u8fa8\u7387\uff09\nheight=1080\nwidth=1920\n[AliasA1] ip=10.8.15.86\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n[AliasA2]\nip=10.8.15.20\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_2","title":"3\u3001\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e","text":"\u968f\u7740\u6d4b\u8bd5\u573a\u666f\u7684\u4e0d\u65ad\u5f15\u5165\uff0c\u53d1\u73b0\u73b0\u6709\u670d\u52a1\u7aef\u91cc\u7684\u914d\u7f6e\u9879\u5e76\u4e0d\u9002\u7528\u4e8e\u6240\u6709\u7684\u6027\u80fd\u573a\u666f\uff0c\u4e8e\u662f\u5c06\u670d\u52a1\u7aef\u914d\u7f6e\u8fdb\u884c\u4e00\u4e2a\u63d0\u53d6\uff0c\u53ef\u505a\u5355\u4e2a\u573a\u666f\u7684\u4e2a\u6027\u5316\u914d\u7f6e\uff0c\u5f53\u7136\u539f\u6765\u7684\u670d\u52a1\u7aef\u914d\u7f6e\u529f\u80fd\u4fdd\u7559\uff0c\u53ea\u662f\u5f53\u4f60\u914d\u7f6e\u4e86\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e\u540e\uff0c\u4f18\u5148\u4f7f\u7528\u4e2a\u6027\u5316\u914d\u7f6e\u91cc\u9762\u7684\u5185\u5bb9\uff0c\u4ee5\u4e0b\u662f\u5bf9\u4e2a\u6027\u5316\u914d\u7f6e\u7684\u4ecb\u7ecd\u3002 \u76ee\u524d\u6bcf\u4e00\u4e2a py \u6587\u4ef6\u5bf9\u5e94\u4e00\u4e2a\u6027\u80fd\u6d4b\u8bd5\u573a\u666f\uff0c\u4e8e\u662f\u5728\u540c\u7ea7\u76ee\u5f55\u4e0b\u521b\u5efa\u4e00\u4e2a\u4e0e\u4e4b\u540c\u540d\u7684 json \u6587\u4ef6\uff0c\u4f5c\u4e3a\u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6 apps\n\u251c\u2500\u2500 album\n \u251c\u2500\u2500 test_album_01_start.json # \u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6\n\u2514\u2500\u2500 test_album_01_start.py # \u6027\u80fd\u573a\u666f\u6587\u4ef6\n \u4ee5\u4e0b\u662f\u5bf9 json \u6587\u4ef6\u4e2d\u914d\u7f6e\u7684\u89e3\u91ca\uff0c\u82e5\u67d0\u9879\u914d\u7f6e\u4e0d\u9700\u8981\uff0c\u53ef\u4ee5\u7f3a\u5931\uff0c\u4f46\u4e0d\u80fd\u4e3a\u7a7a\uff1b {\n\"title\": \"test_album_start\", # \u6807\u9898\uff1b\u5fc5\u987b\n\"app_name\": \"deepin-album\", # \u573a\u666f\u6240\u5c5e\u7684\u5e94\u7528\uff1b\u5fc5\u987b\n\"scene\": \"hot\", # \u573a\u666f\u522b\u540d\uff1b\u5fc5\u987b\n\"icon\": [\"deepin-album\"], # \u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684icon\u5230\u670d\u52a1\u7aef\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\uff1b\u53ef\u7f3a\u5931\n# \u6ce8\u610f\uff1a\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684desktop\u6587\u4ef6\u540d\u4e3adeepin-album.desktop\uff0c\n# \u53ea\u9700\u8981\u5199deepin-album\u5373\u53ef\uff0c\u201c.desktop\u201d\u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002\n\"size\": { # \u56fe\u7247\u5bf9\u6bd4\u7684\u533a\u57df\u8bbe\u7f6e\u9879\uff0c\u67d0\u4e9b\u5e94\u7528\u5f53\u524d\u5c4f\u5e55\u7684\u90e8\u5206\u533a\u57df\u9700\u8981\u5c06\u5176\u53bb\u6389\uff0c\u53ef\u4ee5\u8bbe\u7f6e\u6b64\u9879\uff0c\u5982\u679c\u6ca1\u6709\u5219\u53ef\u4e0d\u5199\uff1b\u53ef\u786e\u5b9e\n\"x-coordinate\": 0, # \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n\"y-coordinate\": 0, # \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n\"width\": 850, # \u6a2a\u5411\u957f\u5ea6\n\"height\": 1920 # \u7eb5\u5411\u9ad8\u5ea6\n},\n\"count\": 5, # \u573a\u666f\u6267\u884c\u7684\u6b21\u6570\uff1b\u5fc5\u987b\n\"duration\": 5, # \u8be5\u6761\u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff0c\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7279\u5b9a\u573a\u666f\uff0c\u8be5\u914d\u7f6e\u4e3a\u53ef\u9009\u9879\uff0c\u8986\u76d6 server.ini \u4e2d\u7684\u914d\u7f6e\uff1b\u53ef\u7f3a\u5931\n\"stable_similarity\": 0.9997, # \u6027\u80fd\u573a\u666f\u5206\u9636\u6bb5\u65f6\u7684\u56fe\u7247\u76f8\u4f3c\u5ea6\u5bf9\u6bd4\uff0c\u524d\u540e\u56fe\u7247\u4f4e\u4e8e\u8be5\u503c\uff0c\u5219\u5206\u4e3a\u4e0d\u7a33\u5b9a\u9636\u6bb5\uff1b\u53ef\u7f3a\u5931\n\"find_by\": \"stage\", # \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\n\"final_stable_num\": 100, # \u67e5\u627e\u6700\u540e\u4e00\u4e2a\u5927\u4e8e\u8be5\u503c\u7684\u7a33\u5b9a\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u7684\u5c3e\u796f\uff1b\u53ef\u7f3a\u5931\n\"start_num\": 150,\n\"text\": \"\", # ocr\u8bc6\u522b\u7684\u6587\u6848\n\"match\": \"apps/xxx/images/match.png\", # \u56fe\u50cf\u5339\u914d\u7684\u56fe\u7247\u6587\u4ef6\u8def\u5f84\n\"match_rate\": 0.9 # \u5339\u914d\u76f8\u4f3c\u5ea6\n}\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e94\u3001\u6d4b\u8bd5\u6d41\u7a0b","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516d\u3001\u7528\u4f8b\u7f16\u5199\u53ca\u65b9\u6cd5\u53c2\u6570\u6307\u5f15","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"1\u3001\u7528\u4f8b\u5b9e\u4f8b\u8bf4\u660e","text":"# \u6807\u51c6\u5e93\u5bfc\u5165\nfrom time import sleep\n# \u5bfc\u5165\u4e09\u65b9\u5e93pytest\nimport pytest\n# \u5bfc\u5165\u7528\u4f8b\u6267\u884c\u8981\u7528\u5230\u7684Widget\u7c7b\nfrom src.base_widget import BaseWidget\nclass TestStart:\n# class\u7ea7\u522b\u7684fixture\uff0c\u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u6267\u884c\u3002autouse=True \u81ea\u52a8\u5728\u5f53\u524d\u4f5c\u7528\u57df\u4e0b\u4f7f\u7528\u3002\n@pytest.fixture(scope=\"class\", autouse=True)\n# \u6d4b\u8bd5\u70ed\u542f\u52a8\u4e4b\u524d\u9700\u8981\u9884\u542f\u52a8\u3002\ndef application_pre_start(self):\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().right_click_element(\"deepin-album\")\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().click_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\")\nsleep(2)\n# \u5feb\u6377\u952e\u5173\u95ed\u7a97\u53e3\nBaseWidget().hot_key(\"alt\", \"f4\")\nsleep(2)\n# \u9ed8\u8ba4\u4e3afunction\u7ea7\u522b\u7684fixture\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\uff0cclass\u7ea7\u522bfixture\u6267\u884c\u4e4b\u540e\u6267\u884c\u3002\n@pytest.fixture(autouse=True)\ndef setup_start(self):\n# \u53f3\u952e\u70b9\u51fb deepin-album \u56fe\u6807\nBaseWidget().right_click_element(\"deepin-album\")\n# \u79fb\u52a8\u5230\u53f3\u952e\u83dc\u5355\u4e2d\u6253\u5f00\uff08open.png\uff09\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().move_to(*BaseWidget().find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))\n# \u7b49\u5f85\u79fb\u52a8\u5b8c\u6210\nsleep(0.5)\ndef test_album_start(self):\n# \u70b9\u51fb\u201c\u6253\u5f00\u201d\nBaseWidget().click() \n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"2\u3001\u65b9\u6cd5\u53c2\u6570\u8bf4\u660e","text":"2.1\u3001find_element \u65b9\u6cd5 def find_element(element: str, input_type: str = \"FILE_NAME\", fill_color_position: tuple = (-1, -1), size: tuple = (25, 70)):\npass\n \u53c2\u6570 element \u548c input_type \uff081\uff09\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u5143\u7d20 - `input_type` \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a `FIEL_NAME` \uff0c\u8868\u793a\u901a\u8fc7\u5e94\u7528 `icon` \u5bfb\u627e\u5143\u7d20\uff0c\u6b64\u65b9\u6cd5\u4f1a\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u5e94\u7528 `icon` \u56fe\u6807\u3002\n \u4e3e\u4f8b\uff1a\u9ed8\u8ba4\u60c5\u51b5\u4e0b input_type \u53c2\u6570\u4e0d\u9700\u8981\u4f20\u5165\uff0c find_element(\"deepin-album\")\uff0c\u8868\u793a\u901a\u8fc7 deepin-album \u7684\u5e94\u7528 icon \u6765\u83b7\u53d6\u5750\u6807\uff0c\u6ce8\u610f\uff0c\u6b64\u65f6\u4f20\u5165\u7684 deepin-album \u53c2\u6570\u5b9e\u9645\u662f desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u548c2.3\u4e2d\u7684 icon \u53d8\u91cf\u4e00\u81f4\u3002 \u6211\u4eec\u5efa\u8bae\u4f18\u5148\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\uff0c\u4f46\u6b64\u65b9\u6cd5\u4f9d\u8d56\u7f51\u7edc\uff0c\u8bf7\u6839\u636e\u6d4b\u8bd5\u73af\u5883\u5b9e\u9645\u60c5\u51b5\u9009\u62e9\u3002 \uff082\uff09\u901a\u8fc7\u672c\u5730\u56fe\u7247\u8bc6\u522b\u5143\u7d20 - \u53c2\u6570 `input_type` \u4f20\u5165\u56fe\u7247\u683c\u5f0f\uff0c\u6bd4\u5982\u622a\u53d6\u7684\u672c\u5730\u56fe\u7247\u683c\u5f0f\u4e3a `png`\uff0c\u90a3\u4e48 `input_type=\"png\"`\uff0c\u6b64\u65f6\u53c2\u6570 `element ` \u4f20\u5165\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5efa\u8bae\u5b58\u653e\u5728\u5bf9\u5e94\u7684\u4ea7\u54c1 `apps/app/picture/` \u76ee\u5f55\u4e0b\uff0c\u8def\u5f84\u4e3a\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u7684\u76f8\u5bf9\u8def\u5f84\u3002\n- \u4e3e\u4f8b\uff1a`find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))`\uff0c\u8868\u793a\u901a\u8fc7\u672c\u5730\u56fe\u7247 `open.png` \u8bc6\u522b\u5143\u7d20\u3002\n \u53c2\u6570 fill_color_position fill_color_position \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (-1, -1)\uff0c(-1, -1) \u8868\u793a\u53d6\u5c4f\u5e55\u4e2d\u53f3\u4e0b\u89d2\u6700\u540e\u4e00\u4e2a\u50cf\u7d20\u70b9\u4f5c\u4e3a\u586b\u5145\u5750\u6807\uff0c\u5728 1920x1080 \u5c4f\u5e55\u5206\u8fa8\u7387\u4e0b\u5373\u5b9e\u9645\u5750\u6807\u4e3a (1919, 1079) \uff0c\u8fd9\u6837\u7684\u5199\u6cd5\u53ef\u4ee5\u9002\u914d\u4e0d\u540c\u5927\u5c0f\u7684\u5c4f\u5e55\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0d\u540c\u65b9\u4f4d\uff1a \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0b\u65b9\uff0c\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u4e0d\u9700\u8981\u4f20\u5165\u8be5\u53c2\u6570\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u5de6\u8fb9\uff0cfill_color_position=(1, 1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u53f3\u8fb9\uff0cfill_color_position=(-1, -1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0a\u8fb9\uff0cfill_color_position=(1, 1) \u4ece\u684c\u9762\u542f\u52a8\u5e94\u7528\uff0c\u5219\u9700\u8981\u4f20\u5165\u9664\u4efb\u52a1\u680f\u4ee5\u5916\u5176\u4ed6\u4f4d\u7f6e\u7684\u5750\u6807\uff0c\u6bd4\u5982(100, 100)\uff0c\u53ea\u8981\u8fd9\u4e2a\u5750\u6807\u4e3a\u9664\u5e94\u7528\u548c\u4efb\u52a1\u680f\u533a\u57df\u90fd\u53ef\u4ee5\u3002 \u4ece\u542f\u52a8\u5668\u91cc\u9762\u542f\u52a8\u5e94\u7528\uff0c\u9700\u8981\u586b\u5145\u7684\u5750\u6807\u4e3a\u542f\u52a8\u5668\u533a\u57df\u3002 \u6ce8\uff1a\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u65f6\uff0c\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684 icon \u539f\u6587\u4ef6\u4e3a svg \u77e2\u91cf\u56fe\uff0c\u8f6c\u6362\u4e3a png \u4e4b\u540e\u9700\u8981\u586b\u5145\u8fb9\u7f18\u900f\u660e\u90e8\u5206\u3002 \u53c2\u6570 size size \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (25, 70)\uff0c\u8868\u793a\u6d4b\u8bd5\u673a\u4e0a dock \u680f\u4e0a\u5e94\u7528\u56fe\u6807\u7684\u5927\u5c0f\u8303\u56f4\u3002 UOS \u7cfb\u7edf dock \u680f\u662f\u53ef\u4ee5\u4e0a\u4e0b\u62d6\u52a8\u5927\u5c0f\u7684\uff0c\u968f\u7740 dock \u680f\u5927\u5c0f\u6539\u53d8\uff0c\u5e94\u7528\u56fe\u6807\u7684\u8303\u56f4\u4e3a25\u523070\u4e4b\u95f4\u3002 \u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u64cd\u4f5c\u7cfb\u7edf\u4e0a dock \u680f\u5927\u5c0f\u4e0d\u4e00\u6837\uff0c\u53ef\u4ee5\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u4f20\u5165\u5927\u5c0f\u8303\u56f4\u3002 2.2\u3001click_element\u3001 right_click_element\uff0c double_click_element \u8fd9\u51e0\u4e2a\u65b9\u6cd5\u53c2\u6570\u89c4\u5219\u4e0e find_element \u65b9\u6cd5\u4e00\u6837\u3002\u4ed6\u4eec\u5b9e\u9645\u4e0a\u662f\u5728 find_element \u65b9\u6cd5\u57fa\u7840\u4e4b\u4e0a\u505a\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u589e\u52a0\u4e86\u9f20\u6807\u7684\u52a8\u4f5c\uff0c\u5982\u679c\u4f60\u4e0d\u60f3\u4f7f\u7528\u8fd9\u51e0\u4e2a\u65b9\u6cd5\uff0c\u5728\u7528\u4f8b\u4e2d\u4e5f\u53ef\u4ee5\u901a\u8fc7 find_element \u83b7\u53d6\u5230\u5750\u6807\uff0c\u7136\u540e\u5c06\u5750\u6807\u4f20\u5165\u5230\u952e\u9f20\u7684\u65b9\u6cd5\u4e2d\uff0c\u53ef\u4ee5\u5b9e\u73b0\u540c\u6837\u7684\u6548\u679c\u3002 2.3\u3001\u7528\u4f8b\u7c7b\u4e2d\u6709\u4e2a\u7c7b\u53d8\u91cf icon = [\"deepin-album\"] \u9700\u8981\u7279\u6b8a\u8bf4\u660e\uff0c\u5217\u8868\u4e2d\u7684\u5143\u7d20\u4e3a\u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709 icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684 icon \u5230\u670d\u52a1\u7aef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528 desktop \u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684 desktop \u6587\u4ef6\u540d\u4e3a deepin-album.desktop\uff0c\u53ea\u9700\u8981\u5199 deepin-album \u5373\u53ef\uff0c.desktop \u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e03\u3001\u6267\u884c\u5165\u53e3","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"1\u3001\u7528\u4f8b\u7ec4\u7ec7","text":"\u5728 setting/config/server.ini \u6587\u4ef6\u4e2d APP_NAME= \u5b57\u6bb5\u4e3a\u7528\u4f8b\u7684\u6267\u884c\u7684\u76ee\u5f55\uff0c\u9ed8\u8ba4\u4e3a apps \u76ee\u5f55\u4e0b\u6240\u6709\u7528\u4f8b\u3002\u5982\u679c\u4f60\u60f3\u6307\u5b9a\u6267\u884c\u67d0\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4f60\u53ef\u4ee5\u5c06\u8be5\u914d\u7f6e\u9879\u6307\u5b9a\u5230\u5e94\u7528\u7684\u7528\u4f8b\u76ee\u5f55\uff0c\u6bd4\u5982\uff1aAPP_NAME=deepin_album\uff0c \u8868\u793a\u6267\u884c\u76f8\u518c\u76ee\u5f55\u4e0b\u7684\u7528\u4f8b\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a python3 manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music\n -k KEYWORDS, --keywords KEYWORDS\n \u7528\u4f8b\u7684\u5173\u952e\u8bcd\n -t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e\n --log_level LOG_LEVEL \u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n --env {host,docker} \u5728\u5bbf\u4e3b\u673a\u6216\u5bb9\u5668\u73af\u5883\u6267\u884c\n --client_alias \u9009\u62e9\u6d4b\u8bd5\u673a\u522b\u540d, \u53ef\u9009\u9879\u4e3aclient.ini\u4e2d\u5df2\u914d\u7f6e, \u9ed8\u8ba4\u503c\u4e3a zx-x86.\n --count \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a python3 manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\" --env docker\n \u6ce8\uff1a\u5728\u5bb9\u5668\u4e2d\u6267\u884c\u65f6\uff0c\u82e5\u5f3a\u5236\u9000\u51fa\uff0c\u5bb9\u5668\u5e76\u4e0d\u4f1a\u505c\u6b62\u8fd0\u884c\uff01"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_9","title":"\u516b\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1json","title":"1\u3001Json \u62a5\u544a","text":"\u81ea\u7814\u89c6\u9891\u89e3\u6790\u5de5\u5177\u4f1a\u5bf9\u5355\u6761\u7528\u4f8b\u6267\u884c\u4e00\u8f6e\u751f\u6210\u4e00\u4e2a json \u6587\u4ef6\uff0c\u5b58\u653e\u4e8e report/{app_name}/{scene}/{run_num} \u76ee\u5f55\u4e0b\uff0c\u547d\u540d\u683c\u5f0f\u4e3a\uff1a report.json json \u5185\u5bb9\u4e3e\u4f8b\uff1a [\n{\n\"Stab1\": {\n\"images\": [1,2...150,151],\n\"startStub\": 0,\n\"type\": \"Stab\"\n}\n},\n{\n\"Stab2\": {\n\"images\": [152,153...169,170],\n\"startStub\": 1,\n\"type\": \"UnStab\"\n}\n},\n{\n\"Stab3\": {\n\"images\": [171,172...300,301],\n\"startStub\": 0,\n\"type\": \"UnStab\"\n}\n}\n]\n \u8bf4\u660e\uff1a Stab \uff1a\u8868\u793a\u89e3\u6790\u8fc7\u7a0b\u4e2d\u4e0d\u540c\u7684\u9636\u6bb5\u3002 images \uff1a\u8868\u793a\u6bcf\u4e00\u5e27\u7684\u56fe\u7247\u5e8f\u53f7\u3002 startStub\uff1a \u4e3a\u8bc6\u522b\u5c3e\u5e27\u7684\u9636\u6bb5\u8868\u793a\uff0c\u5982\u679c \"startStub\": 1 \uff0c\u8bf4\u660e\u5c3e\u5e27\u51fa\u73b0\u5728\u8be5\u9636\u6bb5\u3002 type\uff1a \u4e3a Stab \u6216 UnStab \uff0c\u8868\u793a\u7a33\u5b9a\u9636\u6bb5\u6216\u4e0d\u7a33\u5b9a\u9636\u6bb5\u3002 \u5404\u9636\u6bb5\u6709\u5e27\u6570\u8865\u507f\uff0c\u9ed8\u8ba4\u8865\u507f\u7684\u5e27\u6570\u4e3a 3 \u5e27\uff08\u53ef\u4ee5\u901a\u8fc7 server.ini \u91cc\u9762 un_stab_start=3 \u8fdb\u884c\u914d\u7f6e\uff09\uff0c\u8868\u793a\u5c0f\u4e8e\u7b49\u4e8e 3 \u5e27\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u524d\u540e\u5747\u9700\u8981\u51cf\u6389\u3002 \u5e94\u7528\u542f\u52a8\u9636\u6bb5\u5c31\u662f\u5728 Stab2 \u9636\u6bb5\uff0c\u542f\u52a8\u65f6\u95f4\u4e3a\uff1a171 \u51cf 151 \u518d\u51cf\u6389\u524d\u540e\u8865\u507f\u5e27\u6570 6 \u5e27\uff0c\u5373 14 \u5e27\uff0c\u89c6\u9891\u5e27\u7387 30 \u5e27/\u79d2\uff0c\u56e0\u6b64\u542f\u52a8\u8017\u65f6\u4e3a\uff1a14 * 33 = 462 ms"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2excel","title":"2\u3001Excel \u62a5\u544a","text":"\u6240\u6709\u7528\u4f8b\u6267\u884c\u5e76\u89e3\u6790\u5b8c\u4e4b\u540e\u4f1a report \u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a\u6c47\u603b\u6570\u636e\u7684 Excel \u6587\u4ef6\uff0c\u6587\u4ef6\u540d\u4e3a\uff1a{time}_perf_time.xlsx\u3002 \u6ce8\u610f\uff0creport \u76ee\u5f55\u4e3a\u53ef\u914d\u7f6e\u9879\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u4f1a\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u751f\u6210\uff0c\u5982\u679c\u4f60\u5c06 report\uff0c\u6307\u5b9a\u5230\u9879\u76ee\u4e0b\u5176\u4ed6\u8def\u5f84\uff0c\u5219\u4f1a\u5728\u5bf9\u5e94\u7684\u8def\u5f84\u4e0b\u751f\u6210 json \u548c Excel \u6587\u4ef6\u3002 \u4f60\u4e5f\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8bfb\u53d6\u6240\u6709 json / excel \u62a5\u544a\u7684\u6570\u636e\uff0c\u751f\u6210\u4f60\u81ea\u5df1\u60f3\u8981\u7684\u4e00\u4e9b\u6d4b\u8bd5\u62a5\u544a\u5f62\u5f0f\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#usb","title":"\u4e5d\u3001USB \u4e32\u53e3\u9a71\u52a8\u952e\u9f20\u65b9\u6cd5","text":"\u4f4d\u4e8e src/utils/control/serial_communication \u76ee\u5f55\u4e0b\u7684 usb_mk.py \u6587\u4ef6 usb_mk = UsbMk()\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up()\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u652f\u6301\u4f20\u5165\u6c49\u5b57\uff0c\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click()\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() \n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() \n \uff084\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() \n \uff085\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() \n \uff086\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() \n \uff087\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff088\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff0810\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_10","title":"\u5341\u3001\u7ee7\u7535\u5668\u63a7\u5236\u4e3b\u673a\u5f00\u673a/\u91cd\u542f","text":"\uff08\u82e5\u4e0d\u4f7f\u7528\u7ee7\u7535\u5668\uff0c\u53ef\u5ffd\u7565\u8be5\u6b65\u9aa4\uff0c\u6267\u884c\u65f6\u4f1a\u901a\u8fc7\u547d\u4ee4 reboot\uff09"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u7ee7\u7535\u5668\u8bbe\u5907","text":"LCUS-2 \u578b \u53cc\u8def USB \u667a\u80fd\u4e32\u53e3\u63a7\u5236\u7ee7\u7535\u5668\u3002 https://item.taobao.com/item.htm?spm=a1z09.2.0.0.41d72e8dUYx2pi&id=582653718178&_u=i25r20ia6a2e "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2usb","title":"2\u3001USB \u5ef6\u957f\u7ebf","text":"\u666e\u901a\u7684 USB \u7ebf\u5373\u53ef\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_3","title":"3\u3001\u675c\u90a6\u7ebf","text":"3.1\u300140P \u6bcd\u5bf9\u516c\u675c\u90a6\u7ebf\u3002 3.2\u3001\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"4\u3001\u5b89\u88c5\u56fe\u6587\u6559\u7a0b","text":"4.1\u3001\u4f7f\u7528 USB \u5ef6\u957f\u7ebf\u8fde\u63a5\u63a7\u5236\u7aef\u548c\u7ee7\u7535\u5668\u3002 4.2\u3001\u5728\u7ee7\u7535\u5668\u5e38\u7aef\u548c\u516c\u5171\u7aef\u5747\u8fde\u63a5\u4e00\u6839\u675c\u90a6\u7ebf\u3002 4.3\u3001\u5728\u4e3b\u677f\u4e0a\u5f00\u673a\u9488\u548c\u91cd\u542f\u9488\u4e0a\u63d2\u4e0a\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 4.4\u3001\u5c06\u5f00\u673a\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76841\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1\u5de6\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 4.5\u3001\u5c06\u91cd\u542f\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76842\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1 \u53f3\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 \u82e5\u60f3\u4fdd\u7559\u539f\u7535\u6e90\u5f00\u5173\u7684\u7535\u6e90\u706f\uff0c\u53ef\u6839\u636e\u5982\u4e0a\u56fe\u6240\u793a\uff0c\u4f7f\u7528\u675c\u90a6\u7ebf\u8fde\u63a5\u4e3b\u677f\u4e0a\u7684\u7535\u6e90\u706f\u548c\u539f\u7535\u6e90\u5f00\u5173"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_11","title":"\u5341\u4e00\u3001\u5e38\u89c1\u95ee\u9898\u8bf4\u660e","text":"1\u3001ERROR: for uos Cannot restart container 2301b1a1395d7959ee6523d61b61c87084649af530786cdb8fb5b3ecbcbd1068: linux runtime spec devices: error gathering device information while adding custom device \"/dev/ttyACM0\": no such file or directory \u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u8fde\u63a5\u72b6\u6001\uff0c\u67e5\u770b /dev/ttyACM0 \u662f\u5426\u5b58\u5728\uff0c\u82e5\u5b58\u5728 /dev/ttyACMn\uff08n\u4e3a\u4efb\u610f\u6570\u5b57\uff09\uff0c\u91cd\u542f\u7535\u8111\u89e3\u51b3\u3002 2\u3001Error response from daemon: Container 5e700fdc769e8c74666d68a7f2bc3de58268b4594cf88706609d59f8dbc7362d is not running \u5bb9\u5668\u542f\u52a8\u5931\u8d25 1\uff09\u68c0\u67e5\u54ea\u4e00\u4e2a\u5bb9\u5668\u672a\u542f\u52a8 sudo docker container ls # \u5217\u51fa\u8fd0\u884c\u4e2d\u7684 Docker \u5bb9\u5668\n 2\uff09\u7f3a\u5c11 uos \u5bb9\u5668\uff0c\u68c0\u67e5 USB \u4e32\u53e3\u8fde\u63a5\u7ebf\u548c\u91c7\u96c6\u76d2\u8fde\u63a5\u7ebf\u662f\u5426\u6b63\u5e38\uff0c\u91cd\u542f\u540e\u6267\u884c bash install/setup.up # \u91cd\u65b0\u5b8c\u6574\u90e8\u7f72\u73af\u5883\n \u6216\u6267\u884c sudo docker-compose up -d --build # \u4ec5\u91cd\u65b0\u6784\u5efa Docker \u955c\u50cf\n 3\u3001\u82e5\u90e8\u7f72\u65f6\u63d0\u793a\u6302\u8f7d ttyACM0\u3001video0 \u5931\u8d25\uff0c\u8bf7\u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u53ca\u91c7\u96c6\u76d2\u662f\u5426\u63a5\u89e6\u826f\u597d\uff0c\u82e5\u63a5\u89e6\u826f\u597d\uff0c\u91cd\u542f\u5373\u53ef\u89e3\u51b3\u3002 4\u3001\u82e5\u51fa\u73b0\u56fe\u7247\u80fd\u8bc6\u522b\uff0c\u4f46\u662f\u9f20\u6807\u672a\u79fb\u52a8\u64cd\u4f5c\u65f6\uff0c\u5b89\u88c5\u7edd\u5bf9\u9f20\u6807\u64cd\u4f5c\u7684\u4f9d\u8d56\u5305\uff0c\u89c1\u7b2c\u4e09\u8282\u7b2c\u4e8c\u5c0f\u8282\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u6d4b\u8bd5\u673a\u3002 5\u3001\u7531\u4e8e\u901a\u8fc7\u91c7\u96c6\u5361\u83b7\u53d6\u7684\u6d4b\u8bd5\u673a\u5b9e\u65f6\u753b\u9762\uff0c\u5305\u542b\u4e86\u9f20\u6807\u7684\u6837\u5f0f\uff0c\u6240\u4ee5\u5bf9\u56fe\u7247\u8bc6\u522b\u65f6\uff0c\u9f20\u6807\u82e5\u505c\u7559\u5728\u56fe\u6807\u4e0a\u5c42\uff0c\u5219\u4f1a\u5bf9\u8bc6\u522b\u7ed3\u679c\u9020\u6210\u5f71\u54cd\uff0c\u9700\u8981\u5c06\u9f20\u6807\u79fb\u52a8\u81f3\u5176\u4ed6\u4f4d\u7f6e\uff0c\u6216\u8005\u9690\u85cf\u9f20\u6807\u89e3\u51b3\u3002 6\u3001Excel \u62a5\u544a\u4e2d\uff0c\u6d4b\u8bd5\u573a\u666f\u5217\u4e0e\u7528\u4f8b\u4e2d\u7684\u4e0d\u4e00\u81f4\uff0c\u5173\u952e\u5b57scene\u3001app_name\u3001\u67b6\u6784\u522b\u540d\uff0c\u4e0d\u80fd\u5305\u542b\u4e0b\u5212\u7ebf\u548c\u82f1\u6587\u7b26\u53f7\u7684\u5706\u62ec\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/","title":"\u6846\u67b6\u529f\u80fd\u4ecb\u7ecd","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2023/1/12\n# Author : Mikigo\n# =============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_2","title":"\u4e00\u3001\u4e00\u53e5\u8bdd\u7b80\u4ecb","text":"\u6b64\u6587\u6863\u4e3b\u8981\u60f3\u5bf9 YouQu \u6846\u67b6\u4e00\u4e9b\u91cd\u70b9\u7684\u529f\u80fd\u505a\u8be6\u7ec6\u7684\u4ecb\u7ecd\uff0c\u5305\u62ec\u5bf9\u4e00\u4e9b\u529f\u80fd\u5f00\u53d1\u7684\u80cc\u666f\u3001\u8981\u89e3\u51b3\u7684\u95ee\u9898\u3001\u5b9e\u73b0\u903b\u8f91\u3001\u4ee3\u7801\u7b49\u65b9\u9762\u7684\u4ecb\u7ecd\uff0c\u4ee5\u6b64\u8ba9\u5927\u5bb6\u80fd\u66f4\u52a0\u6e05\u6670\u7684\u7406\u89e3\u5404\u9879\u529f\u80fd\uff0c\u4ece\u800c\u5728\u4f7f\u7528\u7684\u65f6\u5019\u80fd\u66f4\u52a0\u7684\u5f97\u5fc3\u5e94\u624b\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_3","title":"\u4e8c\u3001\u56fe\u50cf\u8bc6\u522b","text":"\u56fe\u50cf\u8bc6\u522b\u5728 UI \u81ea\u52a8\u5316\u4e2d\u662f\u4e0d\u53ef\u7f3a\u5c11\u7684\uff0c\u5e02\u9762\u4e0a\u751a\u81f3\u6709\u5b8c\u5168\u57fa\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\uff0c\u6bd4\u5982 Airtest\u3001Sikuli \u7b49\uff0c\u5728\u6e38\u620f\u7b49\u7279\u5b9a\u9886\u57df\u4e5f\u6709\u4e0d\u9519\u7684\u6548\u679c\uff0c\u8fd9\u4e9b\u5de5\u5177\u5b9e\u9645\u4e0a\u4e5f\u662f\u7528\u7684 OpenCV \u8fdb\u884c\u4e86\u5c01\u88c5\uff0cYouQu \u6846\u67b6\u57fa\u4e8e OpenCV \u5f00\u53d1\u4e86\u81ea\u5df1\u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\uff0c\u5b83\u53ef\u4ee5\u65b9\u4fbf\u7684\u7528\u4e8e\u754c\u9762\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u65ad\u8a00\uff1b YouQu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u51e0\u4e4e\u6ee1\u8db3\u4e86\u4f60\u7684\u6240\u6709\u8981\u6c42\uff0c\u6211\u4eec\u5728\u957f\u65f6\u95f4\u7684\u601d\u8003\u548c\u6478\u7d22\u4e2d\uff0c\u9488\u5bf9\u5e38\u89c4\u573a\u666f\u53ca\u4e00\u4e9b\u7279\u6b8a\u573a\u666f\u63a2\u7d22\u9664\u4e86\u4e00\u4e9b\u5b9e\u7528\u4e14\u6709\u6548\u7684\u65b9\u6848\uff0c\u4e14\u542c\u6211\u6162\u6162\u9053\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1","title":"1\u3001\u5e38\u89c4\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5e38\u89c4\u8bc6\u522b\u5f88\u597d\u7406\u89e3\uff0c\u4e00\u53e5\u8bdd\u8bb2\u5c31\u662f\uff0c\u8981\u83b7\u53d6\u5230\u76ee\u6807\u5143\u7d20\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u3002 \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u5728\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u9700\u8981\u83b7\u53d6\u7684\u5750\u6807\u662f\u76f8\u5bf9\u4e8e\u6574\u4e2a\u5c4f\u5e55\u7684\u5750\u6807\uff0c\u6211\u4eec\u53ef\u4ee5\u622a\u53d6\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u56fe\u7247\uff08screen\uff09\uff1b \u5728\u5143\u7d20\u8bc6\u522b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u622a\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5c0f\u56fe\u8fdb\u884c\u8bc6\u522b\uff0c\u6bd4\u5982\u622a\u53d6\u64ad\u653e\u6309\u94ae\uff1a \u90a3\u4e48\u5b9e\u9645\u4e0a\uff0c\u5143\u7d20\u5b9a\u4f4d\u7684\u95ee\u9898\u5c31\u8f6c\u6362\u4e3a\uff0c\u5c06\u622a\u56fe\u7684\u5c0f\u56fe\uff08play_btn\uff09\u62ff\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u5927\u56fe\uff08screen\uff09\u4e2d\u53bb\u505a\u5339\u914d\uff0c\u5982\u679c\u5339\u914d\u6210\u529f\uff0c\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff08 x, y \uff09\u5373\u53ef\u3002 \u4e3a\u4e86\u65b9\u4fbf\u63cf\u8ff0\uff0c\u4ee5\u4e0b\u6211\u5c06\u6574\u4e2a\u5c4f\u5e55\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5927\u56fe\uff0c\u67d0\u4e2a\u5143\u7d20\u56fe\u7247\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5c0f\u56fe\u3002 \u57fa\u4e8e OpenCV \u7684\u6a21\u677f\u5339\u914d cv.matchTemplate() \u529f\u80fd\uff0c\u6211\u4eec\u5b9e\u73b0\u4e86\u56fe\u50cf\u5b9a\u4f4d\u7684\u529f\u80fd\uff0c\u6846\u67b6\u63d0\u4f9b\u4e86\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u5e95\u5c42\u63a5\u53e3\uff08\u4e00\u822c\u4e0d\u5bf9\u4e0a\u5c42\u63d0\u4f9b\u8c03\u7528\uff09\uff1a def _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\n# \u8be6\u7ec6\u4ee3\u7801\u592a\u957f\u4e0d\u8d34\u4e86\uff0c\u611f\u5174\u8da3\u8bf7\u67e5\u770b\u6e90\u7801\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001image_path image_path \u662f\u5c0f\u56fe\u7684\u7edd\u5bf9\u8def\u5f84; \u901a\u5e38\u5728 AT \u5de5\u7a0b\u91cc\u9762\uff0c\u6211\u4eec\u7ea6\u5b9a\u5c06\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u5b9e\u9645\u7684\u5143\u7d20\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1aplay_btn.png \uff1b \u7528\u4e8e\u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 case/assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1amusic_001.png \uff1b \u8fd9\u6837\u662f\u4e3a\u4e86\u65b9\u4fbf\u7ba1\u7406\u548c\u7ef4\u62a4\u3002 2\u3001rate \u56fe\u50cf\u8bc6\u522b\u7684\u7684\u5339\u914d\u5ea6\u6216\u8005\u8bf4\u76f8\u4f3c\u5ea6\uff0c\u6846\u67b6\u9ed8\u8ba4\u7684\u914d\u7f6e\u4e3a 0.9\uff0c\u4e5f\u5c31\u662f\u8bf4\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u5b58\u5728\u4e00\u4e2a\u76f8\u4f3c\u5ea6 90% \u7684\u56fe\u6807\u5373\u8fd4\u56de\u5176\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff1b \u5982\u679c\u4f60\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u8c03\u6574\u8bc6\u522b\u5ea6\uff0c\u4f60\u53ef\u4ee5\u5728\u8c03\u7528\u51fd\u6570\u7684\u65f6\u5019\uff0c\u4f20\u5165\u4e0d\u540c\u7684\u8bc6\u522b\u5ea6\u7684\u503c\u3002 3\u3001multiple \u9ed8\u8ba4\u60c5\u51b5\u4e0b multiple=False\uff0c\u8868\u793a\u53ea\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u7b2c\u4e00\u4e2a\uff0c\u5982\u679c multiple=True \u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\uff0c\u56e0\u4e3a\u5927\u56fe\u4e2d\u53ef\u80fd\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u5c0f\u56fe\uff0c\u5728\u67d0\u4e9b\u573a\u666f\u4e0b\u4f60\u53ef\u80fd\u9700\u8981\u5168\u90e8\u83b7\u53d6\u5230\u6240\u6709\u5339\u914d\u5230\u7684\u5750\u6807\u3002 4\u3001picture_abspath \u9ed8\u8ba4\u60c5\u51b5\u4e0b picture_abspath=None \u8868\u793a\u5927\u56fe\u4e3a\u622a\u53d6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u5982\u679c\u4f60\u4e0d\u5e0c\u671b\u5927\u56fe\u662f\u5c4f\u5e55\u7684\u622a\u56fe\uff0c\u800c\u662f\u4f60\u81ea\u5b9a\u4e49\u4f20\u5165\u7684\u67d0\u4e2a\u56fe\u7247\uff0c\u4f60\u53ea\u9700\u8981\u5c06\u4f60\u7684\u56fe\u7247\u8def\u5f84\u4f20\u9012\u7ed9\u8fd9\u4e2a\u53c2\u6570\u5c31\u884c\uff0c\u6bd4\u5982\uff1a picture_abspath=\"~/Desktop/big.png\" \uff1b 5\u3001screen_bbox \u5927\u56fe\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u622a\u53d6\u6574\u4e2a\u5c4f\u5e55\uff0cscreen_bbox = [x, y, w, h] \u53ef\u4ee5\u6307\u5b9a\u622a\u53d6\u5c4f\u5e55\u4e2d\u7684\u56fa\u5b9a\u533a\u57df\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\uff0c\u53ef\u4ee5\u6392\u9664\u90e8\u5206\u533a\u57df\u5bf9\u8bc6\u522b\u7ed3\u679c\u7684\u5f71\u54cd\u3002 \u3010\u9690\u5f0f\u7b49\u5f85\u3011 \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\uff0c\u6709\u65f6\u5019\u9875\u9762\u8df3\u8f6c\u6709\u5ef6\u65f6\uff0c\u6709\u53ef\u80fd\u5b58\u5728\u8bc6\u522b\u7684\u90a3\u4e00\u523b\u9875\u9762\u4e5f\u6ca1\u6709\u8df3\u8f6c\u51fa\u6765\uff0c\u6216\u8005\u6216\u8005\u8bc6\u522b\u7684\u90a3\u4e00\u523b\uff1b \u56e0\u6b64\u6211\u4eec\u9700\u8981\u4e00\u79cd\u7b49\u5f85\u673a\u5236\uff0c\u5373\u5728\u4e00\u5b9a\u7684\u65f6\u95f4\u5185\uff0c\u5982\u679c\u8bc6\u522b\u4e0d\u5230\uff0c\u91cd\u590d\u53bb\u8bc6\u522b\uff1a def find_image(\ncls,\n*widget, rate: [float, int] = None,\nmultiple: bool = False,\nmatch_number: int = None,\npicture_abspath: str = None,\nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u5728\u5c4f\u5e55\u4e2d\u533a\u5bfb\u627e\u5c0f\u56fe\uff0c\u8fd4\u56de\u5750\u6807\uff0c\n \u5982\u679c\u627e\u4e0d\u5230\uff0c\u6839\u636e\u914d\u7f6e\u91cd\u8bd5\u6b21\u6570\uff0c\u6bcf\u6b21\u95f4\u96941\u79d2\n :param widget: \u6a21\u677f\u56fe\u7247\u8def\u5f84\n :param rate: \u76f8\u4f3c\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param match_number: \u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\n :return: \u5750\u6807\u5143\u7ec4\n \"\"\"\nif rate is None:\nrate = float(GlobalConfig.IMAGE_RATE)\ntry:\nfor element in widget:\nfor _ in range((match_number or int(GlobalConfig.IMAGE_MATCH_NUMBER)) + 1):\nlocate = cls._match_image_by_opencv(\nelement,\nrate,\nmultiple=multiple,\npicture_abspath=picture_abspath,\nscreen_bbox=screen_bbox\n)\nif not locate:\nsleep(int(GlobalConfig.IMAGE_MATCH_WAIT_TIME))\nelse:\nreturn locate\nraise TemplateElementNotFound(*widget)\nexcept Exception as e:\nraise e\n \u53c2\u6570 match_number \u7528\u4e8e\u63a7\u5236\u91cd\u590d\u8bc6\u522b\u7684\u6b21\u6570\uff0c\u9ed8\u8ba4\u4e0d\u4f20\u53c2\uff0c\u53d6\u5168\u5c40\u914d\u7f6e setting/globalconfig.ini \u91cc\u9762\u7684 IMAGE_MATCH_NUMBER \u914d\u7f6e\u9879\u7684\u503c\uff0c\u9ed8\u8ba4IMAGE_MATCH_NUMBER = 1\uff0c\u5373\u91cd\u8bd5 1 \u6b21\uff1b find_image \u662f\u6846\u67b6\u63d0\u4f9b\u7684\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u51fd\u6570\u63a5\u53e3\uff0c\u8fd9\u4e2a\u51fd\u6570\u63d0\u4f9b\u4e86\u9690\u5f0f\u7b49\u5f85\u7684\u529f\u80fd\uff0c\u4e14\u5305\u542b\u4e0a\u9762\u4ecb\u7ecd\u7684 _match_image_by_opencv \u51fd\u6570\u7684\u6240\u6709\u529f\u80fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2","title":"2\u3001\u6c14\u6ce1\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u6c14\u6ce1\u8bc6\u522b\u6307\u7684\u662f\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\u8981\u5b9a\u4f4d\u7684\u5143\u7d20\u662f\u4e00\u4e9b\u4f1a\u6d88\u5931\u7684\u5c0f\u5f39\u7a97\uff0c\u8fd9\u7c7b\u573a\u666f\u5728\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\u5c31\u53ef\u80fd\u5b58\u5728\u4e0d\u7a33\u5b9a\u6027\uff0c\u6709\u53ef\u80fd\u56fe\u50cf\u8bc6\u522b\u7684\u65f6\u5019\u6c14\u6ce1\u5df2\u7ecf\u6d88\u5931\u4e86\uff0c\u4e5f\u6709\u53ef\u80fd\u6c14\u6ce1\u51fa\u73b0\u7684\u65f6\u95f4\u592a\u77ed\u4e86\uff0c\u4e0d\u5bb9\u6613\u6355\u6349\u5230\uff0c\u5c31\u50cf\u6c14\u6ce1\u4e00\u6837\uff0c\u51fa\u73b0\u4e00\u4e0b\u5c31\u6d88\u5931\uff0c\u56e0\u6b64\u6211\u4eec\u5f62\u8c61\u7684\u79f0\u4e4b\u4e3a \u201c\u6c14\u6ce1\u8bc6\u522b\u201d\uff1b \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u4e3a\u4e86\u80fd\u7a33\u5b9a\u7684\u8bc6\u522b\u6c14\u6ce1\u7c7b\u573a\u666f\uff0c\u6211\u4eec\u91c7\u7528\u7684\u65b9\u6848\u662f\uff1a \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\uff08\u5305\u542b\u6c14\u6ce1\u4ece\u51fa\u73b0\u5230\u6d88\u5931\uff09\uff0c\u4e0d\u505c\u7684\u622a\u53d6\u8fd9\u6bb5\u65f6\u95f4\u5185\u7684\u5927\u56fe\uff0c\u4ee5\u6b64\u786e\u4fdd\u5728\u622a\u53d6\u7684\u4e00\u5806\u56fe\u7247\u4e2d\uff0c\u80af\u5b9a\u6709\u81f3\u5c11\u4e00\u5f20\u56fe\u7247\u80fd\u6355\u6349\u5230\u6c14\u6ce1\uff0c\u6700\u540e\u518d\u5bf9\u8fd9\u4e00\u5806\u56fe\u7247\u9010\u4e2a\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def get_during(\ncls,\nimage_path: str,\nscreen_time: [float, int],\nrate: float = None,\npause: [int, float] = None,\nmax_range: int = 10000\n):\n\"\"\"\n \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u622a\u56fe\u591a\u5f20\u56fe\u7247\u8fdb\u884c\u8bc6\u522b\uff0c\u5176\u4e2d\u6709\u4e00\u5f20\u56fe\u7247\u8bc6\u522b\u6210\u529f\u5373\u8fd4\u56de\u7ed3\u679c;\n \u9002\u7528\u4e8e\u6c14\u6ce1\u7c7b\u7684\u65ad\u8a00\uff0c\u6bd4\u5982\u6c14\u6ce1\u57281\u79d2\u5185\u6d88\u5931\uff0c\u5982\u679c\u7528\u5e38\u89c4\u7684\u56fe\u50cf\u8bc6\u522b\u5219\u6709\u53ef\u80fd\u65e0\u6cd5\u8bc6\u522b\u5230\uff1b\n :param image_path: \u8981\u8bc6\u522b\u7684\u6a21\u677f\u56fe\u7247\uff1b\n :param screen_time: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff1b\n :param rate: \u8bc6\u522b\u7387\uff1b\n :param pause: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u4e0d\u95f4\u9694\uff1b\n :param max_range: \u622a\u56fe\u7684\u6700\u5927\u6b21\u6570\uff0c\u8fd9\u662f\u4e00\u4e2a\u9884\u8bbe\u503c\uff0c\u4e00\u822c\u60c5\u51b5\u4e0b\u4e0d\u6d89\u53ca\u4fee\u6539\uff1b\n \"\"\"\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001screen_time \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5728\u6b64\u65f6\u95f4\u5185\u4f1a\u4e0d\u65ad\u7684\u8fdb\u884c\u622a\u56fe\u64cd\u4f5c\uff0c\u5c31\u50cf\u5f55\u5236\u89c6\u9891\u4e00\u6837\uff1b 2\u3001pause \u6bcf\u6b21\u622a\u53d6\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u4e00\u523b\u4e0d\u505c\u7684\u622a\u56fe\uff0c\u5982\u679c\u4f60\u60f3\u6bcf\u6b21\u622a\u56fe\u5b58\u5728\u4e00\u4e9b\u95f4\u9694\u65f6\u95f4\u4f20\u5165\u5bf9\u5e94\u7684\u65f6\u95f4\u95f4\u9694\u5373\u53ef\uff0c\u5355\u4f4d\u662f\u79d2\uff0c\u6bd4\u5982\uff1apause = 0.03\uff0c\u8868\u793a 30 ms\uff0c\u76f8\u5f53\u4e8e\u5e27\u7387\u4e3a 30 \u5e27\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-opencv","title":"3\u3001\u4e0d\u4f9d\u8d56 OpenCV \u7684\u56fe\u50cf\u8bc6\u522b\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31","title":"3.1\u3001\u81ea\u7814\u56fe\u50cf\u8bc6\u522b\u6280\u672f","text":"\u3010\u539f\u7406\u3011 \u4e3a\u4e86\u5b9e\u73b0\u8bc6\u522b\u56fe\u50cf\u7684\u76ee\u7684\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u5c06\u56fe\u7247\u7684\u6bcf\u4e2a\u50cf\u7d20\u7684RGB\u503c\uff0c\u4e0e\u6574\u4e2a\u5c4f\u5e55\u4e2d\u7684RGB\u8fdb\u884c\u5bf9\u6bd4\uff0c\u5982\u679c\u5c0f\u56fe\u4e0a\u7684RGB\u503c\u4e0e\u5bf9\u5e94\u5927\u56fe\u4f4d\u7f6e\u7684RGB\u90fd\u76f8\u7b49\uff0c\u5219\u5339\u914d\u6210\u529f\uff0c\u5373\u53ef\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u70b9\u3002 1\u3001\u8bfb\u53d6\u5c0f\u56fe\u548c\u5927\u56fe\u7684RGB\u503c \uff081\uff09\u5c0f\u56fe\u7684RGB\u503c small_data = small_pic.load() # load()\u4f1a\u5c06\u56fe\u7247\u7684RGB\u503c\u83b7\u53d6\u5230\uff0c\u6570\u636e\u683c\u5f0f\u4e3a\u4e00\u4e2a\u4e8c\u7ef4\u5217\u8868\uff0c\u8d4b\u503c\u7ed9\u4e00\u4e2a\u53d8\u91cfsmall_data\u3002\n \uff082\uff09\u5927\u56fe\u7684RGB\u503c big_data = big_pic.load()\n 2\u3001\u5c06\u5c0f\u56fe\u4e0e\u5927\u56fe\u7684RGB\u503c\u8fdb\u884c\u5339\u914d \uff081\uff09\u5339\u914d\u4ece\u5927\u56fe\u7684\u5750\u6807\uff080\uff0c0\uff09\u5f00\u59cb\u5339\u914d\uff0c\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff082\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\uff080\uff0c0\uff09\u5bf9\u5e94\u7684\u6240\u6709\u5c0f\u56fe\u7684RGB\u503c\u4e0d\u76f8\u7b49\uff0c\u5219\u79fb\u52a8\u5230\u4e0b\u4e00\u4e2a\u5750\u6807\u70b9\uff081\uff0c0\uff09\uff0c\u540c\u6837\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff083\uff09\u6309\u7167\u8fd9\u6837\u7684\u89c4\u5f8b\u5c06\u8fd9\u4e00\u884c\u6bcf\u79fb\u52a8\u4e00\u4e2a\u5750\u6807\u70b9\uff0c\u90fd\u5c06\u5c0f\u56fe\u6240\u6709\u7684RGB\u4e0e\u5bf9\u5e94\u5927\u56fe\u7684\u503c\u8fdb\u884c\u5339\u914d\uff1b \uff084\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\u5176\u4e2d\u4e00\u4e2a\u5750\u6807\u70b9\u4e0a\u5339\u914d\u5230\u4e86\u5c0f\u56fe\u7684\u6240\u6709RGB\u503c\uff0c\u5219\u6b64\u65f6\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\u70b9\uff1b \uff085\uff09\u5982\u679c\u5339\u914d\u4e86\u5927\u56fe\u6240\u6709\u7684\u5750\u6807\u70b9\uff0c\u90fd\u6ca1\u6709\u5339\u914d\u5230\uff0c\u5219\u8bf4\u660e\u5927\u56fe\u4e2d\u4e0d\u5b58\u5728\u5c0f\u56fe\uff0c\u5339\u914d\u5931\u8d25\uff1b \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 class ImageRgb:\n@staticmethod\ndef _check_match(_x, _y, small, bdata, sdata, rate):\n\"\"\"\n Matching degree of small graph and large graph matching\n \"\"\"\n@staticmethod\ndef _pre_random_point(small):\n\"\"\"\n Pre matching, take 10-20 points at random each time,\n and take coordinates randomly in the small graph\n \"\"\"\n@staticmethod\ndef _pre_random_match(_x, _y, point_list, bdata, sdata, rate):\n\"\"\"\n In the small graph, several points are randomly\n selected for matching, and the matching degree is\n also set for the random points\n \"\"\"\n@classmethod\ndef match_image_by_rgb(cls, image_name=None, image_path=None, rate=0.9):\n\"\"\"\n By comparing the RGB values of the small image with the large\n image on the screen, the coordinates of the small image on\n the screen are returned.\n \"\"\"\n \u901a\u8fc7 match_image_by_rgb() \u8fd9\u4e2a\u51fd\u6570\uff0c\u4f20\u5165\u76ee\u6807\u5c0f\u56fe\u7684\u6587\u4ef6\u540d\u79f0\uff0c\u5373\u53ef\u8fd4\u56de\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u3002 \u6709\u540c\u5b66\u8981\u95ee\u4e86\uff0c\u6709 OpenCV \u5e72\u561b\u4e0d\u7528\uff0c\u6709\u5fc5\u8981\u81ea\u5df1\u5b9e\u73b0\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u529f\u80fd\u5417\uff0c\u4f60\u4eec\u662f\u4e0d\u662f\u95f2\u7684\u554a\uff1f \u8fd9\u4e48\u95ee\u7684\u8bdd\uff0c\u5c0f\u4e86\uff0c\u683c\u5c40\u5c0f\u4e86\uff1b\u6211\u4eec\u81ea\u5df1\u5b9e\u73b0\u4e3b\u8981\u6709\u51e0\u65b9\u9762\u539f\u56e0\uff1a \u51cf\u5c11\u73af\u5883\u4f9d\u8d56\uff0c\u5373\u4e0d\u7528\u5b89\u88c5 OpenCV\uff0c\u6211\u4eec\u4e5f\u80fd\u5b9e\u73b0\u5176\u529f\u80fd\uff0c\u73af\u5883\u4f9d\u8d56\u8fd9\u5757\u540e\u9762\u4f1a\u5355\u72ec\u8be6\u7ec6\u8bb2\uff0c\u51cf\u5c11\u73af\u5883\u4f9d\u8d56\u5bf9\u4e8e\u4efb\u4f55\u8f6f\u4ef6\u5de5\u7a0b\u90fd\u975e\u5e38\u91cd\u8981\uff1b OpenCV \u5728\u5176\u4ed6\u56fd\u4ea7 CPU \u67b6\u6784\u4e0a\u5b89\u88c5\u5e76\u4e0d\u80fd\u4fdd\u8bc1100%\u6210\u529f\uff0c\u751a\u81f3\u6709\u6ca1\u6709\u53ef\u80fd\u5728\u4e00\u4e9b\u67b6\u6784\u4e0a\u538b\u6839\u513f\u5c31\u4e0d\u80fd\u5b89\u88c5\u4f7f\u7528 OpenCV \uff1f \u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 OpenCV \uff1f\u5c31\u50cf\u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 Windows \u5462\uff1f\u8fd9\u4e9b\u95ee\u9898\u503c\u5f97\u601d\u8003\u3002 \u5f53\u7136\uff0c\u6211\u4eec\u627f\u8ba4\u8fd9\u5957\u65b9\u6848\uff0c\u867d\u7136\u8bc6\u522b\u51c6\u786e\u7387\u6ca1\u95ee\u9898\uff0c\u4f46\u5728\u8bc6\u522b\u6548\u7387\u4e0a\u8fd8\u6ca1\u6709\u8fbe\u5230 OpenCV \u6a21\u677f\u5339\u914d\u7684\u6548\u679c\uff0c\u6211\u4eec\u7684\u65b9\u6848\u6bcf\u6b21\u8bc6\u522b\u5728 1.5s \u5de6\u53f3\uff0c\u800c OpenCV \u5728 1s \u5de6\u53f3\uff1b \u6574\u4f53\u8bc6\u522b\u6548\u679c\u6765\u8bb2\uff0c\u6211\u8ba4\u4e3a\u8fd8\u662f\u53ef\u4ee5\u63a5\u53d7\u7684\uff0c\u4e5f\u5e0c\u671b\u6709\u5fd7\u4e4b\u58eb\u80fd\u4e00\u8d77\u4f18\u5316\u6b64\u65b9\u6848\uff0c\u4e00\u8d77\u6280\u672f\u62a5\u56fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32-rpc","title":"3.2\u3001\u57fa\u4e8e RPC \u670d\u52a1\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b","text":"\u5728\u8fdc\u7a0b\u670d\u52a1\u5668\u4e0a\u90e8\u7f72 OpenCV \u7684\u73af\u5883\uff0c\u5e76\u5c06\u5176\u90e8\u7f72\u4e3a RPC \u670d\u52a1\uff0c\u6d4b\u8bd5\u673a\u4e0a\u4e0d\u7528\u5b89\u88c5 OpenCV \u4f9d\u8d56\uff0c\u800c\u662f\u901a\u8fc7\u8bf7\u6c42 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u3010\u539f\u7406\u3011 \u6d4b\u8bd5\u673a\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u56fe\u7247\u4ee5\u53ca\u6a21\u677f\u56fe\u7247\uff0c\u53d1\u9001\u7ed9 RPC \u670d\u52a1\u7aef\uff0c\u670d\u52a1\u7aef\u62ff\u5230\u4e24\u5f20\u56fe\u7247\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u6700\u540e\u5c06\u8bc6\u522b\u7ed3\u679c\u8fd4\u56de\u7ed9\u6d4b\u8bd5\u673a\uff1b \u8981\u7279\u6b8a\u8bf4\u660e\u7684\u662f\uff1a RPC \u662f\u4e00\u79cd\u534f\u8bae\uff0c\u8bb8\u591a\u8bed\u8a00\u90fd\u662f\u652f\u6301\u7684\uff0c\u6bd4\u5982\u8bf4\u670d\u52a1\u7aef\u4e5f\u53ef\u4ee5\u7528 C++ \u6765\u5b9e\u73b0\uff0c\u5ba2\u6237\u7aef\u4f7f\u7528 Python \u4e5f\u662f\u53ef\u4ee5\u8c03\u7528\u7684\u3002 \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 \u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nimport cv2 as cv\nimport numpy as np\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\nif __name__ == \"__main__\":\nserver = ThreadXMLRPCServer((\"x.x.x.x\", 8889), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(match_image_by_opencv, \"match_image_by_opencv\")\nserver.serve_forever()\n \u8fd9\u6837\uff0c\u6211\u4eec\u57fa\u4e8e Python \u6807\u51c6\u5e93 xmlrpc \u642d\u5efa\u4e86\u4e00\u4e2a RPC \u670d\u52a1\u5668\uff0c\u6ce8\u518c\u4e86 image_put \u548c match_image_by_opencv \u4e24\u4e2a\u529f\u80fd\u63a5\u53e3\uff0c\u5728\u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u901a\u8fc7 IP \u548c\u7aef\u53e3\u8fdb\u884c RPC \u8bf7\u6c42\uff1b \u5ba2\u6237\u7aef\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from xmlrpc.client import Binary\nfrom xmlrpc.client import ServerProxy\nserver = ServerProxy(GlobalConfig.OPENCV_SERVER_HOST, allow_none=True)\nscreen_rb = open(screen, \"rb\")\ntemplate_rb = open(template_path, \"rb\")\ntry:\nscreen_path = server.image_put(Binary(screen_rb.read()))\nscreen_rb.close()\ntpl_path = server.image_put(Binary(template_rb.read()))\ntemplate_rb.close()\nreturn server.match_image_by_opencv(\ntpl_path, screen_path, rate, multiple\n)\nexcept OSError as exc:\nraise EnvironmentError(\nf\"RPC\u670d\u52a1\u5668\u94fe\u63a5\u5931\u8d25. {GlobalConfig.OPENCV_SERVER_HOST}\"\n) from exc\n \u901a\u8fc7\u8fd4\u56de server.match_image_by_opencv \u5c31\u83b7\u53d6\u4e86\u5728\u670d\u52a1\u7aef\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4","title":"4\u3001\u53f3\u952e\u83dc\u5355\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41","title":"4.1\u3001\u53f3\u952e\u83dc\u5355\u5b9a\u4f4d\u7684\u65b9\u6848\u53ca\u95ee\u9898","text":"\u53f3\u952e\u83dc\u5355\u7684\u5143\u7d20\u5b9a\u4f4d\u662f\u4e00\u4e2a\u96be\u70b9\uff0c\u8fc7\u53bb\u6211\u4eec\u8c03\u7814\u548c\u4f7f\u7528\u8fc7\u7684\u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u65b9\u6cd5\u6709 4 \u79cd\uff1a \u7b2c\u4e00\u79cd\uff1a\u6b65\u957f\u64cd\u4f5c\u6cd5 \u5728\u53f3\u952e\u83dc\u5355\u547c\u51fa\u6765\u4e4b\u540e\uff0c\u901a\u8fc7\u952e\u76d8\u7684 up\u3001down \u6309\u952e\uff0c\u8fdb\u884c\u9009\u62e9\u83dc\u5355\u9009\u62e9\uff0c\u9009\u4e2d\u76ee\u6807\u4e4b\u540e enter \u5373\u53ef\uff1b\u6bd4\u5982\uff1a\u5728\u684c\u9762\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\uff0c\u6309 1 \u6b21 down \uff0c\u4f1a\u51fa\u73b0\u4e0b\u56fe\uff1a \u7ee7\u7eed\u518d\u6309 2 \u6b21 down\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u518d\u6309 enter\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u5982\u6b64\uff0c\u201c\u6392\u5e8f\u65b9\u5f0f\u201d\u7684\u6b65\u957f\u4e3a 3\uff1b\u901a\u8fc7\u4f7f\u7528\u952e\u76d8\u4e0a\u4e0b\u952e\uff0c\u5c31\u5b9e\u73b0\u4e86\u5bf9\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\uff1b \u4f46\u662f\uff0c\u8fd9\u79cd\u65b9\u5f0f\u6709\u4e2a\u5f88\u70e6\u4eba\u7684\u95ee\u9898\uff0c\u5c31\u662f\u53f3\u952e\u83dc\u5355\u7684\u9009\u9879\u4f4d\u7f6e\u4e0d\u53ef\u80fd\u4e00\u76f4\u4e0d\u53d8\uff0c\u5728\u9700\u6c42\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\uff0c\u83dc\u5355\u9009\u9879\u7684\u53d8\u5316\u662f\u5f88\u5927\u7684\uff0c\u751a\u81f3\u6709\u4e9b\u5e94\u7528\u652f\u6301\u81ea\u5b9a\u4e49\u83dc\u5355\uff0c\u6bd4\u5982\u6587\u7ba1\u53f3\u952e\u83dc\u5355\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff1b \u4e5f\u5c31\u662f\u8bf4\u4f60\u5f97\u7ecf\u5e38\u53bb\u7ef4\u62a4\u83dc\u5355\u9009\u9879\u7684\u6b65\u957f\uff0c\u4e00\u4e2a\u9009\u9879\u73b0\u5728\u7684\u6b65\u957f\u662f 3\uff0c\u4e0b\u4e2a\u8fed\u4ee3\u53ef\u80fd\u5c31\u662f 4 \u6216\u8005 5\u3002 \u7b2c\u4e8c\u79cd\uff1a\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u6cd5 \u628a\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5355\u72ec\u622a\u56fe\u4fdd\u5b58\uff0c\u56fe\u7247\u4e2d\u4ec5\u5305\u542b\u4e00\u4e2a\u83dc\u5355\u9009\u9879\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u8fd9\u6837\uff0c\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5c31\u53ef\u4ee5\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u65b9\u5f0f\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u8fd9\u79cd\u65b9\u5f0f\u4e0d\u7528\u62c5\u5fc3\u83dc\u5355\u9009\u9879\u7684\u987a\u5e8f\u6216\u4f4d\u7f6e\uff0c\u4f46\u662f\u9700\u8981\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff0c\u4e14\u5bb9\u6613\u53d7\u5230\u5b57\u4f53 UI \u53d8\u66f4\u7c7b\u9700\u6c42\u7684\u5f71\u54cd\uff0c\u6bd4\u5982\uff1a\u5b57\u4f53\u5927\u5c0f\u3001\u5b57\u4f53\u95f4\u8ddd\u7b49\u7b49\u9700\u6c42\u53d8\u66f4\u90fd\u4f1a\u5f71\u54cd\uff0c\u6bcf\u6b21\u53d8\u66f4\u4e4b\u540e\u5c31\u9700\u8981\u8fdb\u884c\u5927\u91cf\u56fe\u7247\u8d44\u6e90\u7684\u91cd\u65b0\u622a\u56fe\u66ff\u6362\uff0c\u662f\u4e2a\u6bd4\u8f83\u9ebb\u70e6\u7684\u4e8b\u60c5\uff1b \u7b2c\u4e09\u79cd\uff1a\u76f8\u5bf9\u4f4d\u79fb\u6cd5 \u9f20\u6807\u70b9\u51fb\u53f3\u952e\u7684\u65f6\u5019\uff0c\u9f20\u6807\u7684\u5f53\u524d\u5750\u6807\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u7684\uff0c\u83dc\u5355\u9009\u9879\u7684\u5bbd\uff08 w \uff09\u4e00\u822c\u662f\u56fa\u5b9a\u7684\uff0c\u53d8\u5316\u7684\u662f\u83dc\u5355\u7684\u957f\u5ea6\uff08 h \uff09\uff0c\u53ef\u4ee5\u901a\u8fc7\u67d0\u4e2a\u9009\u9879\u76f8\u5bf9\u4e8e\u9f20\u6807\u7684\u8ddd\u79bb\u5728\u786e\u5b9a\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u901a\u8fc7\u7ef4\u62a4\u83dc\u5355\u9009\u9879\uff08\u76f8\u5bf9\u4f4d\u7f6e\uff09\u76f8\u5bf9\u4e8e\u9f20\u6807\u4f4d\u7f6e\u7684\u8ddd\u79bb\uff0c\u5373\u53ef\u8f7b\u677e\u8ba1\u7b97\u51fa\u83dc\u5355\u9009\u9879\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\u3002 \u4ece\u7406\u8bba\u4e0a\u6b64\u65b9\u6848\u662f\u53ef\u884c\u7684\uff0c\u4f46\u662f\u8fd9\u91cc\u4ecd\u7136\u5b58\u5728\u4e24\u4e2a\u4e25\u91cd\u7684\u95ee\u9898\uff1a \u83dc\u5355\u987a\u5e8f\u6539\u53d8\uff0c\u5bfc\u81f4\u76f8\u5bf9\u8ddd\u79bb\u6539\u53d8\uff0c\u800c\u4e14\u8ddd\u79bb\u662f\u901a\u8fc7\u50cf\u7d20\uff08px\uff09\u6765\u8868\u793a\u7684\uff0c\u4e0d\u60f3\u6b65\u957f\u90a3\u4e48\u53ea\u7ba1\uff0c\u6bcf\u6b21\u9700\u8981\u53bb\u91cf\u4e00\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u70b9\u9ebb\u70e6\uff1b \u9f20\u6807\u5728\u684c\u9762\u4e0d\u540c\u4f4d\u7f6e\u70b9\u51fb\u53f3\u952e\uff0c\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u4f4d\u7f6e\u662f\u4e0d\u540c\u7684\uff0c\u4e0a\u56fe\u7684\u83dc\u5355\u662f\u5728\u9f20\u6807\u7684\u5de6\u4e0b\u65b9\uff0c\u5982\u679c\u4f60\u79fb\u52a8\u9f20\u6807\u5230\u5c4f\u5e55\u56db\u8fb9\uff0c\u4f60\u4f1a\u53d1\u73b0\uff0c\u53f3\u952e\u83dc\u5355\u53ef\u80fd\u51fa\u73b0\u5728\u9f20\u6807\u7684\u56db\u4e2a\u65b9\u5411\uff0c\u4e5f\u5c31\u662f\u8bf4\u4f60\u9700\u8981\u6839\u636e\u9f20\u6807\u7684\u4e0d\u540c\u4f4d\u7f6e\u6765\u5224\u65ad\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u65b9\u5411\uff0c\u800c\u4e0d\u540c\u7684\u65b9\u5411\u4e0a\u8ba1\u7b97\u65b9\u6cd5\u662f\u4e0d\u540c\u7684\uff0c\u6bd4\u5982\uff1a\u53f3\u952e\u83dc\u5355\u5728\u9f20\u6807\u7684\u5de6\u4e0a\uff0c\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\u8ba1\u7b97\u65b9\u6cd5\u4e3a\uff08x - w / 2\uff0c y - h\uff09\uff0c\u8fd9\u6837\u7ef4\u62a4\u8d77\u6765\u53ef\u4ee5\u8bf4\u975e\u5e38\u590d\u6742\uff1b \u57fa\u4e8e\u4ee5\u4e0a\u4e24\u4e2a\u539f\u56e0\uff0c\u6211\u4eec\u5e76\u4e0d\u63a8\u8350\u8fd9\u79cd\u64cd\u4f5c\u65b9\u6848\u3002 \u7b2c\u56db\u79cd\uff1a\u5c5e\u6027\u5b9a\u4f4d \u6709\u540c\u5b66\u8bf4\u5e72\u561b\u4e0d\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u5462\uff0c\u5176\u5b9e\uff0c\u6211\u4eec\u6700\u5f00\u59cb\u60f3\u5230\u7684\u65b9\u6848\u5c31\u662f\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\uff0c\u4f46\u662f\u5728\u5c5e\u6027\u7684 DOM \u6811\u91cc\u600e\u4e48\u4e5f\u627e\u4e0d\u5230\uff0c\u65e0\u6cd5\u5b9a\u4f4d\u5230\uff0c\u6211\u4eec\u4e5f\u8054\u5408\u7814\u53d1\u540c\u5b66\u4e00\u8d77\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u4f46\u6700\u7ec8\u8fd8\u662f\u6ca1\u80fd\u89e3\u51b3\uff0c\u975e\u5e38\u9057\u61be\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42","title":"4.2\u3001\u6700\u65b0\u7684\u53f3\u952e\u83dc\u5355\u7ec8\u6781\u89e3\u51b3\u65b9\u6848","text":"\u7531\u4e8e\u53f3\u952e\u83dc\u5355\u9009\u9879\u51e0\u4e4e\u90fd\u662f\u6587\u672c\uff0c\u90a3\u4e48\u901a\u8fc7 OCR \u8bc6\u522b\uff0c\u51e0\u4e4e\u662f\u6700\u4f18\u7684\u65b9\u6848\uff1a \u4e0d\u7528\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff1b \u4e0d\u4f1a\u53d7\u5230\u83dc\u5355\u9009\u9879\u987a\u5e8f\u6539\u53d8\u7684\u5f71\u54cd\uff1b \u4e0d\u4f1a\u53d7\u5230\u5b57\u4f53 UI \u53d8\u5316\u7684\u5f71\u54cd\uff1b \u5173\u4e8e OCR \u8bc6\u522b\u6211\u4eec\u5728\u540e\u9762\u4f1a\u8be6\u7ec6\u8bb2\u5230\uff0c\u672c\u7ae0\u8282\u4e3b\u8981\u8bb2\u57fa\u4e8e OCR \u8bc6\u522b\uff0c\u6211\u4eec\u5728\u53f3\u952e\u83dc\u5355\u8bc6\u522b\u4e0a\u7684\u7a81\u7834\u548c\u521b\u65b0\uff1b \u4f7f\u7528 OCR \u8bc6\u522b\u53f3\u952e\u83dc\u5355\u867d\u7136\u5df2\u7ecf\u5f88\u5b8c\u7f8e\u4e86\uff0c\u4f46\u662f\u5728\u4e00\u4e9b\u60c5\u51b5\u4e0b\u4ecd\u7136\u5b58\u5728\u4e00\u70b9\u95ee\u9898\uff0c\u5c31\u662f\u5c4f\u5e55\u4e2d\u51fa\u73b0\u591a\u4e2a\u548c\u83dc\u5355\u9009\u9879\u6587\u5b57\u76f8\u540c\u7684\u6587\u5b57\u65f6\uff0c\u6bd4\u5982\u4e0b\u9762\u8fd9\u79cd\u60c5\u51b5\uff1a \u5c4f\u5e55\u6070\u597d\u51fa\u73b0\u4e86\u4e24\u4e2a\u201c\u590d\u5236\u201d\uff0c\u6b64\u65f6\u8981\u5b9a\u4f4d\u5230\u83dc\u5355\u4e2d\u7684 \u201c\u590d\u5236\u201d\uff0c\u5c31\u9700\u8981\u8fdb\u4e00\u6b65\u505a\u6570\u636e\u5904\u7406\uff0c\u6bd4\u5982\uff1aOCR \u8fd4\u56de 2 \u4e2a\u201c\u590d\u5236\u201d\u7684\u5750\u6807\uff0c\u7528\u4f8b\u91cc\u9762\u6765\u5224\u65ad\u7528\u54ea\u4e2a\uff0c\u4ece\u4e1a\u52a1\u4e0a\u5c06\u5904\u7406\u8d77\u6765\u6bd4\u8f83\u9ebb\u70e6\uff0c\u56e0\u4e3a\u4f60\u5f97\u660e\u786e\u77e5\u9053\u83dc\u5355\u5728\u5de6\u8fb9\u8fd8\u662f\u53f3\u8fb9\uff0c\u7136\u540e\u8fd9\u672c\u8eab\u5c31\u662f\u4e0d\u786e\u5b9a\u7684\uff1b \u600e\u4e48\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u5462\uff0c\u8fd9\u5c31\u8981\u8bf4\u9053\u672c\u7ae0\u7684\u4e3b\u9898\uff1a\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b\u3002 \u3010\u539f\u7406\u3011 \u5728\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u524d\u622a\u4e00\u5f20\u56fe\uff0c\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\u518d\u622a\u53d6\u4e00\u5f20\u56fe\uff0c\u4e24\u5f20\u56fe\u552f\u4e00\u53d8\u5316\u7684\u5c31\u662f\u53f3\u952e\u83dc\u5355\uff0c\u5c06\u5176\u4ed6\u76f8\u540c\u7684\u5730\u65b9\u90fd\u5c4f\u853d\u6389\uff0c\u53ea\u7559\u4e0b\u83dc\u5355\u754c\u9762\uff0c\u5982\u6b64\u5373\u53ef\u6d88\u9664\u5e72\u6270\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u5c06\u4e24\u79cd\u56fe\u505a\u524d\u540e\u5bf9\u6bd4\u63d0\u53d6\u53ef\u4ee5\u5f97\u5230\u8fd9\u6837\u7684\u56fe\uff1a \u4f60\u770b\uff0c\u901a\u8fc7\u524d\u540e\u56fe\u7247\u7684\u5bf9\u6bd4\uff0c\u5c06\u76f8\u540c\u7684\u90e8\u5206\u7ed9\u6d88\u9664\u6389\uff0c\u518d\u8fdb\u884c OCR \u8bc6\u522b\uff0c\u8fd9\u6837\u5c31\u4e0d\u4f1a\u6709\u5e72\u6270\u4e86\uff1b \u4ee3\u7801\u5b9e\u73b0\u8bf7\u67e5\u770b src/filter_image.py \uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def filter_image(action):\n\"\"\"\n \u5bf9\u6bd4\u52a8\u4f5c\u524d\u540e\u4e24\u5f20\u56fe\u7247\uff0c\u63d0\u53d6\u4e0d\u540c\u7684\u90e8\u5206\u751f\u6210\u4e00\u5f20\u65b0\u7684\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u65b0\u56fe\u7247\u7684\u8def\u5f84\n :param action: \u52a8\u4f5c\u51fd\u6570\u7684\u51fd\u6570\u5bf9\u8c61\n :return: \u65b0\u56fe\u7247\u7684\u8def\u5f84\n \"\"\"\n action \u662f\u9f20\u6807\u4e8b\u4ef6\uff0c\u56e0\u4e3a\u6b64\u7c7b\u573a\u666f\u4e0d\u4ec5\u4ec5\u5728\u53f3\u952e\u5b58\u5728\uff0c\u5355\u51fb\u3001\u53cc\u51fb\u7b49\u7b49\uff0c\u53ea\u8981\u64cd\u4f5c\u524d\u540e\u540e\u53d8\u5316\u7684\u90fd\u53ef\u4ee5\uff1a from src.mouse_key import MouseKey\naction = (\nMouseKey.click,\nMouseKey.right_click,\nMouseKey.double_click,\nMouseKey.move_to,\n)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5","title":"5\u3001\u52a8\u6001\u56fe\u50cf\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5728\u684c\u9762\u58c1\u7eb8\u5207\u6362\uff0c\u6216\u770b\u56fe\u3001\u76f8\u518c\u5207\u6362\u56fe\u7247\u7c7b\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u7531\u4e8e\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u662f\u4e0d\u56fa\u5b9a\u7684\uff08\u4e0d\u540c\u7248\u672c\u7684\u7cfb\u7edf\u58c1\u7eb8\u4e0d\u540c\u3001\u58c1\u7eb8\u987a\u5e8f\u4e0d\u540c\uff0c\u770b\u56fe\u76f8\u518c\u5728\u56fe\u7247\u8d44\u6e90\u4e0d\u4e00\u5b9a\u56fa\u5b9a\uff09\uff0c\u90a3\u4e48\u5728\u6d4b\u8bd5\u5207\u6362\u58c1\u7eb8\u6216\u8005\u5207\u6362\u56fe\u7247\u7684\u573a\u666f\u65f6\u5c31\u4f1a\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u4f60\u4e0d\u77e5\u9053\u9884\u671f\u662f\u5565\uff0c\u7528\u4f8b\u64cd\u4f5c\u52a8\u6001\u7684\uff0c\u4e5f\u662f\u6781\u4e0d\u7a33\u5b9a\u3002 \u3010\u539f\u7406\u3011 \u5728\u5207\u6362\u56fe\u7247\u4e4b\u524d\u622a\u56fe\u4fdd\u5b58\u5e76\u8fd4\u56de\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u6b21\u8bc6\u522b\u8fd9\u5f20\u56fe\u7247\uff0c\u5982\u679c\u4e0d\u5b58\u5728\uff0c\u8bf4\u660e\u56fe\u7247\u5df2\u7ecf\u5207\u6362\u4e86\uff1b \u793a\u610f\u56fe\uff1a \u8fd9\u6837\uff0c\u6211\u4eec\u622a\u53d6\u4e86\u5f53\u524d\u56fe\u7247\u4e2d\u6bd4\u8f83\u6709\u4ee3\u8868\u6027\u7684\u4f4d\u7f6e\uff08\u4e00\u53ea\u9e1f\uff09\uff0c\u5728\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u7528\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1a \u6211\u4eec\u518d\u62ff\u7740\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd9\u6837\u5728\u5f53\u524d\u56fe\u7247\u4e2d\uff0c\u5c31\u4e0d\u80fd\u627e\u5230\u8fd9\u53ea\u9e1f\u4e86\uff0c\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u662f False\uff0c\u90a3\u4e48\u4e5f\u5c31\u53ef\u4ee5\u5224\u65ad\u56fe\u7247\u5207\u6362\u662f\u6210\u529f\u7684\u3002 \u4ee3\u7801\u793a\u610f\uff1a def save_temporary_picture(_x: int, _y: int, width: int, height: int):\n\"\"\"\n \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u56fe\u7247\u8def\u5f84\n :param x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n :param y: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n :param width: \u5bbd\u5ea6\n :param height: \u9ad8\u5ea6\n :return: \u56fe\u7247\u8def\u5f84\n \"\"\"\n \u6b64\u51fd\u6570\u7528\u4e8e\u5728\u64cd\u4f5c\u4e4b\u524d\u622a\u56fe\u4e00\u5f20\u4e34\u65f6\u56fe\u7247\uff0c\u8fd4\u56de\u56fe\u7247\u8def\u5f84\uff0c\u6700\u540e\u5728\u65ad\u8a00\u7684\u65f6\u5019\u518d\u5c06\u56fe\u7247\u8def\u5f84\u4f5c\u4e3a\u53c2\u6570\u4f20\u5165\u65ad\u8a00\u8bed\u53e5\u5373\u53ef\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ui","title":"\u4e09\u3001\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_1","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u662f\u6211\u4eec\u81ea\u7814\u7684\u4e00\u79cd\u4f7f\u7528\u7b80\u5355\uff0c\u4e14\u6548\u7387\u6781\u9ad8\u3001\u7a33\u5b9a\u6027\u597d\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u57fa\u4e8e\u5143\u7d20\u6309\u94ae\u5728\u5e94\u7528\u4e2d\u7684\u76f8\u5bf9\u4f4d\u7f6e\uff0c\u52a8\u6001\u83b7\u53d6\u5143\u7d20\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff0c\u9002\u7528\u4e8e\u5404\u79cd\u5c4f\u5e55\u5206\u8fa8\u7387\uff08\u5305\u62ec\u9ad8\u5206\u5c4f\u3001\u5bbd\u5c4f\u3001\u5e26\u9c7c\u5c4f\uff09\uff0c\u5f53\u5143\u7d20\u6309\u94ae\u4f4d\u7f6e\u76f8\u5bf9\u4e8e\u5e94\u7528\u754c\u9762\u4f4d\u7f6e\u53d1\u751f\u4fee\u6539\u4e4b\u540e\uff0c\u53ea\u9700\u8981\u6839\u636e UI \u8bbe\u8ba1\u56fe\u4e0a\u7684\u6e90\u6570\u636e\u4fee\u6539\u5bf9\u5e94\u5750\u6807\u6570\u636e\u5c31\u597d\uff0c\u7ef4\u62a4\u975e\u5e38\u7684\u65b9\u4fbf\u3002 \u6b64\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u9002\u7528\u4e8e\u4e00\u4e9b\u5143\u7d20\u4f4d\u7f6e\u76f8\u5bf9\u4e0e\u5e94\u7528\u754c\u9762\u6bd4\u8f83\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u97f3\u4e50\uff0899% \u7684\u5143\u7d20\u5b9a\u4f4d\u91c7\u7528\u8fd9\u79cd\uff0c\u6548\u679c\u975e\u5e38\u597d\uff09\uff0c\u4e0d\u9002\u7528\u4e8e\u754c\u9762\u4e0d\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u622a\u56fe\u5f55\u5c4f\uff0c\u5f88\u660e\u663e\u4e0d\u9002\u7528\u4e8e\u8fd9\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u3002\u8fd9\u79cd\u5168\u65b0\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u6709\u5b83\u7684\u9002\u7528\u6761\u4ef6\uff0c\u5982\u679c\u4f60\u53d1\u73b0\u4f7f\u7528\u5e38\u89c4\u7684\uff08\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u5b9a\u4f4d\uff09\u4e0d\u597d\u505a\u65f6\uff0c\u4e0d\u59a8\u8003\u8651\u4f7f\u7528\u8fd9\u79cd\uff0c\u5176\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff0c\u5e76\u4e14\u8fc5\u901f\u7231\u4e0a\u4ed6\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_1","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5728 UI \u8bbe\u8ba1\u56fe\u4e2d\u6211\u4eec\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u8fb9\u6846\u7684\u8ddd\u79bb\u7684\uff0c\u7136\u540e\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u6280\u672f\u624b\u6bb5\u83b7\u53d6\u5230\u5e94\u7528\u754c\u9762\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u53ca\u5e94\u7528\u7a97\u53e3\u7684\u5927\u5c0f\uff0c\u793a\u610f\u56fe\u5982\u4e0b\uff1a \uff08x1, y1\uff09\u4e3a\u5e94\u7528\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\uff1b\uff08x2, y2\uff09\u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u5de6\u4e0a\u89d2\uff08x1, y1\uff09\u7684\u5750\u6807\uff0c\u90a3\u4e48\u5b9e\u9645\u4e0a\u3010\u64ad\u653e\u6240\u6709\u3011\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\u4e3a\uff1a\uff08 x1 + x2, y1 + y2 \uff09\uff1b \u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5927\u5c0f\uff08w2, h2\uff09\uff0c\u53ef\u4ee5\u4ece UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\uff1b \u5728 UI \u8bbe\u8ba1\u7a3f\u4e0a\u70b9\u51fb\u3010\u64ad\u653e\u6240\u6709\u3011\u56fe\u6807\uff0c\u7136\u540e\u79fb\u52a8\u9f20\u6807\u5c31\u5c31\u53ef\u4ee5\u770b\u5230\u4e0a\u56fe\u7684\u53c2\u8003\u7ebf\u53ca\u6570\u636e\uff1b \u6240\u4ee5\uff0c\u6211\u4eec\u53ef\u4ee5\u8f7b\u677e\u7684\u83b7\u53d6\u5230\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u4e2d\u5fc3\u5750\u6807\u4e3a\uff1a\uff08 x1 + x2 + (w2 / 2), y1 + y2 + ( h2 / 2) \uff09 \u8be6\u7ec6\u6e90\u4ee3\u7801\u8bf7\u67e5\u770b AT \u57fa\u7840\u6846\u67b6: src/button_center.py \u83b7\u53d6\u5e94\u7528\u7a97\u53e3\u7684\u4fe1\u606f \u4f7f\u7528 xdotool \u548c xwininfo \u83b7\u53d6\u5230\u5e94\u7528\u7a97\u53e3\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u5de6\u4e0a\u89d2\uff09\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a app_id = CmdCtl.run_cmd(f\"xdotool search --classname --onlyvisible {self.app_name}\"\n).split(\"\\n\")\napp_id_list = [int(_id) for _id in app_id if _id]\nreturn CmdCtl.run_cmd(f\"xwininfo -id {app_id_list[self.number]}\")\n \u4f7f\u7528\u6b63\u5219\u83b7\u53d6\u7a97\u53e3\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u83b7\u53d6\u914d\u7f6e \u8bfb ini \u914d\u7f6e\u6587\u4ef6\uff0c\u83b7\u53d6\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e0e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a conf = ConfigParser()\nconf.read(self.config_path)\ndirection = conf.get(btn_name, \"direction\")\nposition = [int(i.strip()) for i in conf.get(btn_name, \"location\").split(\",\")]\n \u8ba1\u7b97\u5143\u7d20\u6309\u94ae\u5750\u6807 \u6839\u636e\u5e94\u7528\u7a97\u53e3\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u5927\u5c0f\u3001\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u5927\u5c0f\uff0c\u4f7f\u7528\u4e00\u5b9a\u7684\u7b97\u6cd5\u5373\u53ef\u8ba1\u7b97\u51fa\u5143\u7d20\u6309\u94ae\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u4e2d\u5fc3\u5750\u6807\uff09\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3","title":"3\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u3010\u914d\u7f6e\u65b9\u6cd5\u3011 \u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u7684\u6570\u636e\u6e90\u662f\u5e94\u7528\u5e93\u4e2d\u7684 ui.ini \u914d\u7f6e\u6587\u4ef6\uff1a ;section\n[\u65b0\u5efa\u6b4c\u5355+] ;key = value\ndirection = left_top\nlocation = 180, 268, 21, 21\n section \u662f\u4f60\u6839\u636e\u5bf9\u5e94\u7684\u5143\u7d20\u6309\u94ae\u547d\u540d\uff0c\u4f60\u53ef\u4ee5\u4efb\u610f\u547d\u540d\uff0c\u4f46\u6700\u597d\u6709\u5177\u4f53\u542b\u4e49\uff0c\u4e14\u80fd\u660e\u786e\u8868\u793a\u8fd9\u4e2a\u5143\u7d20\u6309\u94ae\u7684\u540d\u79f0\uff1b\u7528\u4e2d\u62ec\u53f7\u62ec\u8d77\u6765\u5c31\u884c\uff0c\u6bd4\u5982\uff1a[\u65b0\u5efa\u6b4c\u5355+] \uff1b direction \u662f\u914d\u7f6e\u8be5\u5143\u7d20\u7684\u53c2\u8003\u7cfb\uff0c\u5206\u522b\u4e3a\uff1a left_top \u5de6\u4e0a\uff1b left_bottom \u5de6\u4e0b\uff1b right_top \u53f3\u4e0a\uff1b right_bottom \u53f3\u4e0b\uff1b \u53c2\u8003\u7cfb\u7684\u9009\u53d6\u6807\u51c6\uff1a\u62c9\u52a8\u6539\u53d8\u7a97\u53e3\u5927\u5c0f\u65f6\uff0c\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u53c2\u8003\u7cfb\u4f4d\u7f6e\u662f\u4e0d\u53d8\u7684\uff1b location \u662f\u8be5\u5143\u7d20\u6309\u94ae\u7684\u76f8\u5bf9\u4e0e\u53c2\u8003\u7cfb\u7684 x, y \u7684\u8ddd\u79bb\uff0c\u53ca\u5927\u5c0f(w, h)\uff0c\u8fd9\u56db\u4e2a\u6570\u636e\u53ef\u4ee5\u901a\u8fc7 UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\u6570\u636e\uff0c\u5728\u7f16\u8f91\u6a21\u5f0f\u4e0b\uff0c\u70b9\u51fb UI \u56fe\u4e0a\u7684\u6309\u94ae\uff0c\u53f3\u4fa7\u5c31\u4f1a\u51fa\u73b0\u8be5\u5143\u7d20\u6309\u94ae\u7684 x, y, w, h \u6570\u636e\u3002 \u5982\u679c UI \u56fe\u4e0a\u6ca1\u6709\u63d0\u4f9b\u4f60\u60f3\u8981\u7684\u5143\u7d20\u6570\u636e\uff0c\u4f60\u53ef\u4ee5\u76f4\u63a5\u5728\u7cfb\u7edf\u4e2d\u4f7f\u7528\u622a\u56fe\u5f55\u5c4f\u8fdb\u884c\u5c3a\u91cf\uff0c\u8fd9\u662f\u4e00\u79cd\u4e0d\u63a8\u8350\u4f46\u80fd\u7528\u7684\u65b9\u6cd5\u3002 \u3010\u8c03\u7528\u65b9\u6cd5\u3011 \u5728\u5e94\u7528\u5e93\u65b9\u6cd5\u5c42\u8fd9\u6837\u5199\uff1a def click_add_music_list_btn_in_music_by_ui(self):\n\"\"\"\u70b9\u51fb\u65b0\u5efa\u6b4c\u5355\u6309\u94ae\"\"\"\nself.click(*self.ui.btn_center(\"\u65b0\u5efa\u6b4c\u5355+\"))\n self.ui.btn_center() \u662f\u56fa\u5b9a\u5199\u6cd5\uff0c\u53c2\u6570\u5c31\u662f\u914d\u7f6e\u91cc\u9762\u7684 section \u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ocr","title":"\u56db\u3001OCR \u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_2","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 OCR \u65b9\u6848\u5927\u591a\u91c7\u7528\u8c37\u6b4c OCR\uff08Tesseract\uff09\u65b9\u6848\uff0c\u4f46\u662f\u5b83\u5bf9\u4e8e\u4e2d\u6587\u7684\u8bc6\u522b\u975e\u5e38\u5dee\uff0c\u7ecf\u8fc7\u5927\u91cf\u7684\u8c03\u7814\uff0c\u6211\u4eec\u4f7f\u7528 PaddleOCR\uff0c\u5b83\u662f\u4e00\u4e2a\u5f00\u6e90\u7684\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u8bc6\u522b\u5de5\u5177\uff0c\u4e5f\u662f PaddlePaddle \u6700\u6709\u540d\u7684\u4e00\u4e2a\u5f00\u6e90\u9879\u76ee\uff0c\u611f\u5174\u8da3\u7684\u53ef\u4ee5\u70b9\u8fd9\u91cc\u4e86\u89e3\uff0c\u591a\u7684\u4e0d\u8bf4\u4e86\uff0c\u4f60\u53ea\u9700\u8981\u77e5\u9053\u5b83\u5c31\u662f\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_2","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5b89\u88c5\u4ed6\u662f\u4e2a\u5f88\u9ebb\u70e6\u7684\u4e8b\u60c5\uff0c\u867d\u7136\u64cd\u4f5c\u5f88\u7b80\u5355\uff0c\u4f46\u5176\u5b9e\u5b89\u88c5\u5305\u6709\u70b9\u5927\uff0c\u56e0\u6b64\u6211\u4eec\u4e0d\u5e0c\u671b\u76f4\u63a5\u5728 env.sh \u4e2d\u52a0\u5165\u5b83\uff0c\u8fd9\u4f1a\u8ba9\u6574\u4e2a\u81ea\u52a8\u5316\u73af\u5883\u53d8\u5f97\u975e\u5e38\u81c3\u80bf\uff1b \u56e0\u6b64\uff0c\u6211\u4eec\u60f3\u5230\u5c06\u5b83\u505a\u6210\u4e00\u4e2a RPC \u670d\u52a1\u5728\u5176\u4ed6\u673a\u5668\u4e0a\u90e8\u7f72\uff0c\u6d4b\u8bd5\u673a\u901a\u8fc7\u8fdc\u7a0b\u8c03\u7528 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u4f7f\u7528\u5b83\uff1b RPC \u7684\u8c03\u7528\u903b\u8f91\uff1a \u8fd9\u6837\u6211\u4eec\u53ea\u9700\u8981\u5728\u670d\u52a1\u7aef\u90e8\u7f72\u597d OCR \u8bc6\u522b\u7684\u670d\u52a1\uff0c\u7136\u540e\u901a\u8fc7 RPC \u670d\u52a1\u5c06\u529f\u80fd\u63d0\u4f9b\u51fa\u6765\uff0c\u6846\u67b6\u91cc\u9762\u53ea\u9700\u8981\u8c03\u7528\u5bf9\u5e94\u7684 RPC \u63a5\u53e3\u5c31\u884c\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_1","title":"3\u3001\u4f7f\u7528\u8bf4\u660e","text":"\u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nfrom paddleocr import PaddleOCR\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef paddle_ocr(pic_path, lang):\n\"\"\"\n Paddleocr\u76ee\u524d\u652f\u6301\u7684\u591a\u8bed\u8a00\u8bed\u79cd\u53ef\u4ee5\u901a\u8fc7\u4fee\u6539lang\u53c2\u6570\u8fdb\u884c\u5207\u6362\n \u4f8b\u5982`ch`, `en`, `fr`, `german`, `korean`, `japan`\n :param file_name:\n :param lang:\n :return:\n \"\"\"\nif __name__ == \"__main__\":\nIP = popen(\"hostname -I\").read().split(\" \")[0]\nPORT = 8890\nSCREEN_CACHE = \"/tmp/screen.png\"\nserver = ThreadXMLRPCServer((IP, PORT), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(paddle_ocr, \"paddle_ocr\")\nprint(\"\u76d1\u542c\u5ba2\u6237\u7aef\u8bf7\u6c42\u3002\u3002\")\nserver.serve_forever()\n \u6846\u67b6\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from src import OCR\nOCR.ocr(*target_strings, picture_abspath=None, similarity=0.6, return_default=False, return_first=False, lang=\"ch\"):\n# \u901a\u8fc7 OCR \u8fdb\u884c\u8bc6\u522b\u3002\n# target_strings:\n# \u76ee\u6807\u5b57\u7b26,\u8bc6\u522b\u4e00\u4e2a\u5b57\u7b26\u4e32\u6216\u591a\u4e2a\u5b57\u7b26\u4e32,\u5e76\u8fd4\u56de\u5176\u5728\u56fe\u7247\u4e2d\u7684\u5750\u6807;\n# \u5982\u679c\u4e0d\u4f20\u53c2\uff0c\u8fd4\u56de\u56fe\u7247\u4e2d\u8bc6\u522b\u5230\u7684\u6240\u6709\u5b57\u7b26\u4e32\u3002\n# picture_abspath: \u8981\u8bc6\u522b\u7684\u56fe\u7247\u8def\u5f84\uff0c\u5982\u679c\u4e0d\u4f20\u9ed8\u8ba4\u622a\u53d6\u5168\u5c4f\u8bc6\u522b\u3002\n# similarity: \u5339\u914d\u5ea6\u3002\n# return_default: \u8fd4\u56de\u8bc6\u522b\u7684\u539f\u751f\u6570\u636e\u3002\n# return_first: \u53ea\u8fd4\u56de\u7b2c\u4e00\u4e2a,\u9ed8\u8ba4\u4e3a False,\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u6240\u6709\u6570\u636e\u3002\n# lang: `ch`, `en`, `fr`, `german`, `korean`, `japan`\n \u6b64\u65b9\u6848\u5728\u6846\u67b6\u5185\u6ca1\u6709\u5f15\u5165\u4efb\u4f55\u4e09\u65b9\u4f9d\u8d56\u5b8c\u5168\u91c7\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\uff0c\u800c\u4e14\u4f7f\u7528\u65b9\u6cd5\u975e\u5e38\u7b80\u5355\uff0c\u53ea\u9700\u8981\u901a\u8fc7 OCR.ocr() \u5373\u53ef\uff1b \u5bf9\u4e8e\u4e00\u4e9b\u6587\u6848\u7684\u573a\u666f\u975e\u5e38\u9002\u7528\uff0c\u6b64\u65b9\u6cd5\u76f4\u63a5\u8fd4\u56de\u5750\u6807\uff0c\u53ef\u4ee5\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u3002 \u4e5f\u53ef\u4ee5\u7528\u4e8e\u6587\u5b57\u65ad\u8a00\uff0c\u4ee3\u7801\u793a\u610f\uff1a def assert_ocr_exist(\n*args, picture_abspath=None, similarity=0.6, return_first=False, lang=\"ch\"\n):\n\"\"\"\u65ad\u8a00\u6587\u6848\u5b58\u5728\"\"\"\npic = None\nif picture_abspath is not None:\npic = picture_abspath + \".png\"\nres = OCR.ocr(\n*args,\npicture_abspath=pic,\nsimilarity=similarity,\nreturn_first=return_first,\nlang=lang,\n)\nif res is False:\nraise AssertionError(\n(f\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{args}\", f\"{pic if pic else GlobalConfig.SCREEN_CACHE}\")\n)\nif isinstance(res, tuple):\npass\nelif isinstance(res, dict) and False in res.values():\nres = filter(lambda x: x[1] is False, res.items())\nraise AssertionError(\n(\nf\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{dict(res)}\",\nf\"{pic if pic else GlobalConfig.SCREEN_CACHE}\",\n)\n)\n \u5728\u7528\u4f8b\u4e2d\u4f7f\u7528\u65ad\u8a00\uff0c\u793a\u4f8b\uff1a def test_font_manager_021(self):\n\"\"\"\u53f3\u4fa7\u2665-\u6536\u85cf/\u53d6\u6d88\u6536\u85cf\u5b57\u4f53\"\"\"\n# \u5b57\u4f53\u7ba1\u7406\u5668\u754c\u9762\u53f3\u4fa7\u8be6\u60c5\u5217\u8868\uff0c\u9009\u62e9\u672a\u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e / \u6536\u85cf\u5b57\u4f53\n# \u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e\u83dc\u5355\u663e\u793a\u201c\u53d6\u6d88\u6536\u85cf\u201d\uff1b\n...\nself.assert_ocr_exist(\"\u53d6\u6d88\u6536\u85cf\")\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_1","title":"4\u3001\u670d\u52a1\u7aef\u90e8\u7f72","text":"\u6211\u4eec\u76ee\u524d\u662f\u5c06 OCR \u670d\u52a1\u90e8\u7f72\u5728\u666e\u901a\u7684\u529e\u516c\u673a\u4e0a\u7684\uff0c\u5982\u679c\u4f60\u89c9\u5f97\u73b0\u6709\u7684 OCR \u8bc6\u522b\u6027\u80fd\u4e0d\u591f\u597d\uff0c\u6070\u597d\u4f60\u6709\u66f4\u597d\u7684\u673a\u5668\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u5176\u79c1\u6709\u5316\u90e8\u7f72\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41_1","title":"4.1\u3001\u73af\u5883\u5b89\u88c5","text":"\u63a8\u8350\u4f7f\u7528 pipenv \u8fdb\u884c\u73af\u5883\u642d\u5efa\uff1b \u5b89\u88c5 pipenv \uff1a sudo pip3 install pipenv\n \u65b0\u5efa\u4e00\u4e2a\u76ee\u5f55\u4f5c\u4e3a\u73af\u5883\u5305 ocr_env\uff1a cd ~\nmkdir ocr_env\n \u521b\u5efa python 3.7 \u73af\u5883\uff1a cd ocr_env\npipenv --python 3.7\n \u5b89\u88c5 OCR \u4f9d\u8d56\u5305\uff1a pipenv install paddlepaddle -i https://mirror.baidu.com/pypi/simple\npipenv install \"paddleocr>=2.0.1\" -i https://mirror.baidu.com/pypi/simple\n \u4e0d\u51fa\u610f\u5916\uff0c\u8fd9\u6837\u5c31\u628a\u4f9d\u8d56\u5b89\u88c5\u597d\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42_1","title":"4.2\u3001\u542f\u52a8\u670d\u52a1","text":"\u5c06\u57fa\u7840\u6846\u67b6\u4e2d\u7684 scr/ocr/pdocr_rpc_server.py \u6587\u4ef6\u62f7\u8d1d\u5230 ocr_env \u76ee\u5f55\uff0c\u540e\u53f0\u6267\u884c\u5b83\u5c31\u597d\u4e86\uff1a cd ocr_env\nnohup pipenv run python pdocr_rpc_server.py &\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#43","title":"4.3\u3001\u914d\u7f6e\u5f00\u673a\u81ea\u542f\uff08\u901a\u7528\uff09","text":"\u4f60\u80af\u5b9a\u4e0d\u60f3\u6bcf\u6b21\u673a\u5668\u91cd\u542f\u4e4b\u540e\u90fd\u9700\u8981\u624b\u52a8\u542f\u52a8\u670d\u52a1\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u914d\u7f6e\u5f00\u673a\u81ea\u542f\u3002 \u5199\u5f00\u673a\u81ea\u542f\u670d\u52a1\u6587\u4ef6\uff1a sudo vim /lib/systemd/system/ocr.service\n autoocr \u540d\u79f0\u4f60\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff0c\u5199\u5165\u4ee5\u4e0b\u5185\u5bb9\uff1a [Unit]\nDescription=OCR Service\nAfter=multi-user.target\n\n[Service]\nUser=uos\nGroup=uos\nType=idle\nWorkingDirectory=/home/uos/ocr_env\nExecStart=pipenv run python pdocr_rpc_server.py\n\n[Install]\nWantedBy=multi-user.target\n \u6ce8\u610f\u66ff\u6362\u4f60\u7684${USER} \u4fee\u6539\u914d\u7f6e\u6587\u4ef6\u7684\u6743\u9650\uff1a sudo chmod 644 /lib/systemd/system/ocr.service\n \u81ea\u542f\u670d\u52a1\u751f\u6548\uff1a sudo systemctl daemon-reload\nsudo systemctl enable ocr.service\n \u67e5\u770b\u670d\u52a1\u72b6\u6001\uff1a sudo systemctl status ocr.service\n \u4f60\u53ef\u4ee5\u518d\u91cd\u542f\u4e0b\u7535\u8111\uff0c\u770b\u770b\u670d\u52a1\u662f\u4e0d\u662f\u6b63\u5e38\u542f\u52a8\u4e86\uff0c\u6ca1\u62a5\u9519\u5c31 OK \u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_4","title":"\u4e94\u3001\u5c5e\u6027\u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_3","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 UI \u81ea\u52a8\u5316\u5927\u591a\u90fd\u662f\u57fa\u4e8e\u6d4f\u89c8\u5668\u7684\uff0c\u6838\u5fc3\u662f\u5728\u7f51\u9875\u7684 DOM \u6811\u4e0a\u67e5\u627e\u5143\u7d20\uff0c\u5e76\u5bf9\u5176\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\uff1b Linux \u684c\u9762\u5e94\u7528\u5927\u591a\u662f\u91c7\u7528 Qt \u7f16\u5199\u7684\uff0c\u5728 Qt \u4e2d\u4e5f\u662f\u4ece\u6700\u9876\u5c42\u7684 MainWindow \u5f00\u59cb\u6784\u5efa\u5e94\u7528\uff0c\u6240\u4ee5\u903b\u8f91\u4e5f\u662f\u4e00\u6837\u7684\uff0cQt \u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u540c\u6837\u53ef\u4ee5\u901a\u8fc7 DOM \u6811\uff08\u5c5e\u6027\u6811\uff09\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff0c\u6211\u4eec\u79f0\u4e4b\u4e3a\u5c5e\u6027\u5b9a\u4f4d\u3002 \u501f\u52a9\u5f00\u6e90\u5de5\u5177 dogtail \u6211\u4eec\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u83b7\u53d6\uff0c\u4ece\u800c\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\u3002dogtail \u7684\u9879\u76ee\u4ecb\u7ecd\u53ef\u4ee5\u731b\u6233\u8fd9\u91cc\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_3","title":"2\u3001\u4f7f\u7528\u65b9\u6cd5","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#21sniff","title":"2.1\u3001sniff\uff08\u55c5\u63a2\u5668\uff09\u4f7f\u7528","text":"\u5728\u7ec8\u7aef\u8f93\u5165 sniff \u542f\u52a8 AT-SPI Browser mikigo@mikigo-PC:~$ sniff\n \u67e5\u770b\u5e94\u7528\u7684\u6807\u7b7e \u5728 sniff \u91cc\u9762\u53ef\u4ee5\u770b\u5230\u7cfb\u7edf\u4e2d\u5df2\u542f\u52a8\u7684\u5e94\u7528\uff0c\u70b9\u51fb\u5e94\u7528\u540d\u79f0\u524d\u9762\u7684\u4e09\u89d2\u5f62\u56fe\u6807\uff0c\u53ef\u4ee5\u5c55\u5f00\u5e94\u7528\u7684\u6807\u7b7e\uff0c\u6240\u6709\u6807\u7b7e\u4ee5 tree \u7684\u5f62\u5f0f\u5c55\u793a\uff0c\u5bf9\u5e94\u5e94\u7528\u91cc\u9762\u7684\u7236\u7a97\u53e3\u548c\u5b50\u7a97\u53e3\u3002 \u83b7\u53d6\u5143\u7d20\u63a7\u4ef6\u7684\u6807\u7b7e\u540d\u79f0 \u9996\u5148\uff0c\u4e3a\u4e86\u65b9\u4fbf\u67e5\u770b\u5143\u7d20\u63a7\u4ef6\u5bf9\u5e94\u7684\u4f4d\u7f6e\uff0c\u5efa\u8bae\u73b0\u5728\u4e0a\u65b9\u5de5\u5177\u680f\u70b9\u51fb Actions\uff0c\u7136\u540e\u52fe\u9009 Hightlight Items\uff0c\u8fd9\u6837\u5728 sniff \u4e2d\u9f20\u6807\u9009\u4e2d\u5143\u7d20\u6807\u7b7e\u7684\u65f6\u5019\uff0c\u5e94\u7528\u4e2d\u4f1a\u6709\u76f8\u5e94\u7684\u5149\u6807\u9501\u5b9a\u3002 \u5728 sniff \u91cc\u9762\u70b9\u51fb\u8fdb\u5165\u5e94\u7528\u7684\u6807\u7b7e tree \u4e2d\u540e\uff0c\u70b9\u51fb\u76f8\u5e94\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5728\u5de5\u5177\u4e0b\u65b9\uff0c\u4f1a\u5c55\u793a\u5143\u7d20\u63a7\u4ef6\u7684 Name\uff0c\u8fd9\u4e2a\u5c31\u662f\u6807\u7b7e\u540d\u79f0\u3002 \u5728 tree \u4e2d\u6709\u4e9b\u5730\u65b9\u662f\u7a7a\u767d\u7684\u6216\u8005\u662f Form\uff0c\u662f\u56e0\u4e3a\u5f00\u53d1\u4eba\u5458\u5728\u6dfb\u52a0\u6807\u7b7e\u7684\u65f6\u5019\u6ca1\u6709\u6dfb\u52a0\uff0c\u6216\u8005\u6709\u4e9b\u7236\u7a97\u53e3\u4e0d\u9700\u8981\u6dfb\u52a0\uff0c\u8fd9\u79cd\u5728\u5b9e\u9645\u4e1a\u52a1\u4e2d\u662f\u4e0d\u5f71\u54cd\u7684\uff0c\u6211\u4eec\u53ea\u8981\u4fdd\u8bc1\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\u4e2d\uff0c\u8981\u7528\u5230\u7684\u5143\u7d20\u90fd\u6dfb\u52a0\u4e86\u6807\u7b7e\u5373\u53ef\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#22","title":"2.2\u3001\u5143\u7d20\u64cd\u4f5c","text":"\u83b7\u53d6\u5e94\u7528\u5bf9\u8c61 dogtail \u83b7\u53d6\u5e94\u7528\u5bf9\u8c61\u7684\u65f6\u5019\uff0c\u4f7f\u7528\u7684\u662f tree \u5e93\u91cc\u9762\u7684 application() \u65b9\u6cd5\uff1a from dogtail.tree import root\napp_obj = root.application('deepin-music')\n app_obj\u5c31\u662f\u5e94\u7528\u7684\u5bf9\u8c61\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\uff0c\u662f\u5e94\u7528\u5bf9\u8c61\u4f7f\u7528child()\u65b9\u6cd5\uff1a element = app_obj.child('element_name')\n \u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u4f20\u5165\u5143\u7d20\u7684 Name\uff0c\u83b7\u53d6\u5230\u76f8\u5e94\u5143\u7d20\u7684\u5bf9\u8c61\u3002Name \u53ef\u4ee5\u901a\u8fc7 sniff \u67e5\u770b\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\u5217\u8868: element_list = element.children\n \u83b7\u53d6\u5230\u8fd9\u4e2a\u5143\u7d20\u4e0b\u9762\u6240\u6709\u7684\u5143\u7d20\u5217\u8868\u3002 \u8fd9\u4e2a\u65b9\u6cd5\u9002\u7528\u4e8e\u6709\u4e9b\u6807\u7b7e\u6ca1\u6709\u6dfb\u52a0\uff0c\u4f46\u662f\u4f4d\u7f6e\u662f\u56fa\u5b9a\u7684\uff0c\u6211\u4eec\u901a\u8fc7\u7d22\u5f15\u53ef\u4ee5\u53d6\u5f97\u5143\u7d20\u3002 element_list[0]\n \u5bf9\u5143\u7d20\u7684\u64cd\u4f5c \u5728\u83b7\u53d6\u5230\u5143\u7d20\u4e4b\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u76f8\u5e94\u7684\u64cd\u4f5c\u3002 \u5355\u51fb element.click(button=1)\n button 1 \u2014>\u5de6\u952e\uff0c2 \u2014>\u6eda\u8f6e\uff0c3 \u2014>\u53f3\u952e\uff0c\u9ed8\u8ba4\u4e3a 1 \u53cc\u51fb element.doubleClick(button=1)\n \u9f20\u6807\u60ac\u505c element.point()\n \u9f20\u6807\u79fb\u52a8\u5230\u5143\u7d20\u4e2d\u5fc3\u4f4d\u7f6e \u6587\u672c\u8f93\u5165 element.typeText(string)\n \u5411\u5143\u7d20\u5bf9\u8c61\u8f93\u5165\u5b57\u7b26\u4e32 \uff0c\u6bd4\u5982\u8f93\u5165\u6846 \u7ec4\u5408\u952e element.keyCombo(comboString)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#23","title":"2.3\u3001\u6846\u67b6\u5c01\u88c5","text":"\u4ee3\u7801\u793a\u4f8b\uff1a # \u8be6\u7ec6\u4ee3\u7801\u8bf7\u67e5\u770b src/dogtail_utils.py\nclass DogtailUtils:\ndef __init__(self, name=None, description=None):\nself.name = name\nself.description = description\nself.obj = root.application(self.name, self.description)\ndef app_element(self, *args, **kwargs):\n\"\"\"\n \u83b7\u53d6app\u5143\u7d20\u7684\u5bf9\u8c61\n :return: \u5143\u7d20\u7684\u5bf9\u8c61\n \"\"\"\nreturn self.obj.child(*args, **kwargs, retry=False)\ndef element_center(self, element) -> tuple:\n\"\"\"\n \u83b7\u53d6\u5143\u7d20\u7684\u4e2d\u5fc3\u4f4d\u7f6e\n :param element:\n :return: \u5143\u7d20\u4e2d\u5fc3\u5750\u6807\n \"\"\"\n_x, _y, _w, _h = self.app_element(element).extents\n_x = _x + _w / 2\n_y = _y + _h / 2\nreturn _x, _y\n \u6846\u67b6\u63d0\u4f9b\u7684\u63a5\u53e3\u975e\u5e38\u7b80\u6d01\uff0c\u5728\u8c03\u7528\u65f6\uff1a self.dog.element_center(\"\u64ad\u653e\")\n \u8fd9\u6837\u5c31\u80fd\u83b7\u53d6\u5230\u6b64\u5143\u7d20\u7684\u4e2d\u5fc3\u5750\u6807\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_5","title":"\u516d\u3001\u6807\u7b7e\u5316\u7ba1\u7406","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_4","title":"1\u3001\u6807\u7b7e\u8bf4\u660e","text":"\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u811a\u672c ID\uff1a\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c/\u51fd\u6570 ID\uff1b PMS\u7528\u4f8bID\uff1aPMS \u4e0a\u5bf9\u5e94\u7684\u7528\u4f8b ID\uff08\u7528\u4f8b\u5e93 ID\uff09\uff1b \u9ed8\u8ba4\u4f7f\u7528\u7528\u4f8b\u5e93 ID\uff0c\u5bf9\u4e8e\u6682\u65f6\u6ca1\u6709\u4f7f\u7528\u7528\u4f8b\u5e93\u7ba1\u7406\u7528\u4f8b\u7684\u9879\u76ee\uff0c\u53ef\u4ee5\u4f7f\u7528\u4ea7\u54c1\u5e93\u7528\u4f8b ID\uff1b \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1aFUNC\uff08\u529f\u80fd\uff09\u3001API\uff08\u63a5\u53e3\uff09\u3001BASELINE\uff08\u57fa\u7ebf\uff09\u3001PERF\uff08\u6027\u80fd\uff09\u3001STR\uff08\u538b\u529b\uff09\u3001SEC\uff08\u5b89\u5168\uff09\u3001CTS\uff08\u517c\u5bb9\u6027\uff09 \u4e0a\u7ebf\u5bf9\u8c61\uff1aCICD\uff0c\u8868\u793a\u4e0a\u7ebf\u5230 CICD \u6d41\u6c34\u7ebf\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u53ef\u4e00\u952e\u751f\u6210 case_list.csv \u6587\u4ef6\uff0c\u7528\u4e8e\u5bfc\u5165\u5230\u660e\u9053\u4e91 AT \u7528\u4f8b\u5217\u8868\u4e2d\u63a7\u5236 CICD \u8dd1\u6d4b\u8303\u56f4\uff1b \u6d4b\u8bd5\u7ea7\u522b\uff1aC1 / C2 / C3 / C4\uff0c\u5177\u4f53\u5b9a\u4e49\u53c2\u8003\u6d41\u6c34\u7ebf\u4f7f\u7528\u6307\u5bfc\uff1b \u8df3\u8fc7\u539f\u56e0\uff1askip-XXX\uff0c\u7528\u4e8e\u63a7\u5236\u7528\u4f8b\u662f\u5426\u6267\u884c\uff1b \u786e\u8ba4\u4fee\u590d\uff1afixed-XXX\uff0c\u7528\u4e8e\u6807\u8bb0\u7528\u4f8b\u7684\u4fee\u590d\u72b6\u6001\uff08\u540e\u9762\u8be6\u7ec6\u8bb2\u89e3\u7528\u6cd5\uff09\uff1b \u5e9f\u5f03\u7528\u4f8b\uff1aremoved-\u5df2\u5e9f\u5f03\uff0c\u7528\u4e8e\u6807\u8bb0\u5df2\u7ecf\u5e9f\u5f03\u7684\u7528\u4f8b\uff0c\u6b64\u7528\u4f8b\u6807\u7b7e\u4e0d\u4f1a\u88ab\u6dfb\u52a0\uff0c\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff1b \u793a\u4f8b\uff1a \u811a\u672cID PMS\u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u4e0a\u7ebf\u5bf9\u8c61 \u6d4b\u8bd5\u7ea7\u522b \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b ... 001 679537 L1 FUNC CICD C1 skip-XXX fixed-XXX removed-\u5df2\u5e9f\u5f03 ..."},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_4","title":"2\u3001\u64cd\u4f5c\u6b65\u9aa4","text":"2.1\u3001\u5728\u5b50\u9879\u76ee\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u4ee5\u7528\u4f8b\u7684 py \u6587\u4ef6\u9664\u53bb\u9996\u5b57\u7b26\u4e32 \"test_\" \u548c\u7528\u4f8b\u5e8f\u53f7\u540e\u7684\u5b57\u7b26\u4e32\u4f5c\u4e3a csv \u7684\u6587\u4ef6\u540d\u3002 \u4f8b\u5982: \u76f8\u518c\u7684\u7528\u4f8b\u6587\u4ef6\u4e3a test_album_xxx.py\uff0cxxx \u8868\u793a\u4efb\u610f\u4e09\u4f4d\u6570\u5b57\u4ee3\u8868\u7528\u4f8b\u5e8f\u53f7\uff0c\u6b64\u65f6 csv \u6587\u4ef6\u540d\u5c31\u5e94\u4e3a album.csv\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u6240\u6709 csv \u6587\u4ef6\u5efa\u8bae\u653e\u5728\u4e00\u4e2a tags \u76ee\u5f55\u4e0b\u3002 \u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 2.2\u3001\u7b2c\u4e00\u5217\u4e3a\u811a\u672c ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b\u7528\u4f8b\u6807\u7b7e\u53ef\u4ee5\u65e0\u5e8f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_2","title":"3\u3001\u589e\u52a0\u8bf4\u660e","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_1","title":"3.1\u3001\u8df3\u8fc7\u7528\u4f8b","text":"\u4f20\u7edf\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668(@pytest.mark.skip)\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a; \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#311","title":"3.1.1\u3001\u56fa\u5b9a\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u7b7e\u5f00\u5934\u4e3a \u201cskip-XXX\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\uff0c\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\u5219\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u7b7e\u4e3a SKIPED\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#312","title":"3.1.2\u3001\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skipif_platform-aarch64&mips64 \u67d0\u4e9b\u7528\u4f8b\u4f1a\u56e0\u4e3a\u4e0d\u540c\u7684\u73af\u5883\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\uff0c\u5e38\u89c1\u7684\u573a\u666f\u4e3a\u5728\u4e0d\u540c\u67b6\u6784\u4e0a\u5224\u65ad\u662f\u5426\u6267\u884c\uff0c\u8df3\u8fc7\u7684\u539f\u56e0\u6807\u7b7e\u4e3a \u201cskipif_platform-\u201d \u52a0\u67b6\u6784\u540d\uff0c\u591a\u4e2a\u67b6\u6784\u4e4b\u95f4\u4f7f\u7528 \u201c&\u201d \u62fc\u63a5\uff1b \u4ee5\u4e0a\u4f8b\u5b50\u4e3a\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u5224\u65ad\u5f53\u524d\u67b6\u6784\u662f\u5426\u4e3a arrch64 \u6216\u8005 mips64\uff0c\u82e5\u662f\uff0c\u5219\u8df3\u8fc7\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u82e5\u5426\u5219\u6267\u884c\u7528\u4f8b\uff1b \u76ee\u524d\u6846\u67b6\u9ed8\u8ba4\u4ec5\u652f\u6301\u67b6\u6784\u7684\u6761\u4ef6\u5224\u65ad\uff0c\u4f46\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u903b\u8f91\u652f\u6301\u81ea\u5b9a\u4e49\u6dfb\u52a0\u3002 \u5728\u9879\u76ee\u76ee\u5f55\u8def\u5f84\u4e0b\u5b58\u5728\u6587\u4ef6 setting/skipif.py\uff0c\u6240\u6709\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u7684\u51fd\u6570\u5199\u5728\u6b64\u6587\u4ef6\u4e2d\u3002 \u9ed8\u8ba4\u67b6\u6784\u5224\u65ad\u4f8b\u5b50\uff1a def skipif_platform(args: str):\n\"\"\"\u5e73\u53f0\u8df3\u8fc7\"\"\"\n_skip_key = args.split(\"&\")\nfor key in _skip_key:\nif GlobalConfig.SYS_ARCH == key:\nreturn True\nreturn False\n \u65b9\u6cd5\u7f16\u5199\u89c4\u8303\uff1a \u65b9\u6cd5\u540d\u5fc5\u987b\u4ee5 skipif \u5f00\u5934\uff1b \u65b9\u6cd5\u5fc5\u987b\u6709\u8fd4\u56de\u7ed3\u679c\u5e76\u4e14\u4e3a\u5e03\u5c14\u503c\uff08True \u4ee3\u8868\u8df3\u8fc7\uff0cFalse \u4ee3\u8868\u4e0d\u8df3\u8fc7\uff09\uff1b \u65b9\u6cd5\u53ea\u80fd\u6709\u4e00\u4e2a\u5165\u53c2\uff1b \u5728 csv \u6587\u4ef6\u8df3\u8fc7\u539f\u56e0\u4e00\u680f\u4e2d\u586b\u5199\u4e3a \u201c{\u51fd\u6570\u540d}-{\u53c2\u6570}\u201d\uff0c\u4f8b\u5982\uff1askipif_platform-aarch64\uff1b\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u4f1a\u4ee5\u7b2c\u4e00\u4e2a \u201c-\u201d \u8fdb\u884c\u5206\u5272\uff0c\u622a\u53d6\u7684\u5de6\u4fa7\u5b57\u7b26\u4e32\u4f5c\u4e3a\u51fd\u6570\u540d\uff0c\u5728 skipif.py \u6587\u4ef6\u4e2d\u67e5\u627e\u662f\u5426\u6709\u540c\u540d\u51fd\u6570\uff0c\u5e76\u5c06\u622a\u53d6\u7684\u53f3\u4fa7\u4f5c\u4e3a\u53c2\u6570\u4f20\u9012\u7ed9\u8be5\u51fd\u6570\uff0c\u901a\u8fc7\u83b7\u53d6\u8be5\u51fd\u6570\u8fd4\u56de\u7684\u5e03\u5c14\u503c\uff0c\u8fd4\u56de True\uff0c\u5219\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u8fd4\u56de False\uff0c\u5219\u6267\u884c\u8be5\u7528\u4f8b\u3002 \u82e5\u51fd\u6570\u9700\u8981\u591a\u4e2a\u53c2\u6570\uff0c\u53ef\u81ea\u5b9a\u4e49\u591a\u4e2a\u53c2\u6570\u4e4b\u95f4\u7684\u8fde\u63a5\u7b26\uff0c\u8fde\u63a5\u7b26\u53f7\u4e0d\u53ef\u4f7f\u7528\u4e0b\u5212\u7ebf\u548c\u9017\u53f7\uff0c\u63a8\u8350\u7edf\u4e00\u4f7f\u7528 & \u7b26\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32","title":"3.2\u3001\u786e\u8ba4\u4fee\u590d","text":"\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7528\u4f8b\u4fee\u590d\u540e\uff0c\u4f46\u4e0d\u80fd\u7acb\u5373\u5220\u9664\u8df3\u8fc7\u539f\u56e0\uff08skip-XXX\uff09\u7684\u7528\u4f8b\uff0c\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u786e\u8ba4\u4fee\u590d\u201d\uff0c\u4f5c\u4e3a\u6807\u8bb0\u8be5\u7528\u4f8b\u662f\u5426\u5df2\u7ecf\u4fee\u590d\uff0c\u56fa\u5b9a\u586b\u5165\u5b57\u6bb5\u4e3a \u201cfixed-\u5df2\u4fee\u590d\u201d\u3002\u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u5373\u4f7f\u540c\u65f6\u6807\u8bb0\u4e86 skip-XXX \u4e5f\u4f1a\u6b63\u5e38\u6267\u884c\u3002 \u793a\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d \u3010\u540c\u65f6\u6807\u8bb0\u4e86skip \u548c fixed\uff0c\u4f46\u4ecd\u7136\u60f3\u8981\u8df3\u8fc7\u7528\u4f8b\u3011 \u5f53 \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u540c\u65f6\u586b\u5165\u540e\uff0c\u547d\u4ee4\u884c\u4f20\u9012\u53c2\u6570 --ifixed yes\uff0c\u5219\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\u8be5\u6761\u7528\u4f8b\u3002 python3 manage.py run --ifixed yes\n \u770b\u5230\u8fd9\u91cc\u6709\u4e9b\u540c\u5b66\u53ef\u80fd\u8981\u95ee\u4e86\uff0c\u6211\u60f3\u6062\u590d\u8df3\u8fc7\u6267\u884c\uff0c\u76f4\u63a5\u628a skip-XXX \u8fd9\u4e00\u5217\u6807\u7b7e\u5220\u6389\u4e0d\u5c31\u597d\u4e86\uff0c\u8fd8\u641e\u4ec0\u4e48\u786e\u8ba4\u4fee\u590d\u5e72\u5565\uff1f \u8fd9\u91cc\u7ed9\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u89e3\u91ca\u4e00\u4e0b\uff1a \uff08\u4ee5\u4e0b\u6d41\u6c34\u7ebf\u6307\u7684\u662f\u6bcf\u65e5\u6784\u5efa\u7684\u6d41\u6c34\u7ebf\uff0c\u8dd1 AT \u7684\u5168\u91cf\u7528\u4f8b\uff09 \u9996\u5148\uff0c\u6d41\u6c34\u7ebf\u4e0a\u8dd1\u7684\u662f AT \u5386\u53f2 Tag\uff0c\u8df3\u8fc7\u7528\u4f8b\u7684\u6807\u7b7e(skip-XXX) \u662f\u5728\u6700\u65b0\u7684\u4ee3\u7801\u4e0a\u63d0\u4ea4\u7684\uff0c\u6211\u4eec\u91c7\u7528\u6700\u65b0\u7684 csv \u6587\u4ef6\u8986\u76d6\u5386\u53f2 csv \u6587\u4ef6\u7684\u8bbe\u8ba1\u6765\u5b9e\u73b0\u4e86\u5bf9\u5386\u53f2 Tag \u4e0a\u7528\u4f8b\u7684\u8df3\u8fc7\uff1b \u7136\u540e\uff0c\u5728\u65e5\u5e38\u8df3\u8fc7\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u540c\u65f6\u4e5f\u5728\u4fee\u590d\u4e00\u4e9b\u7528\u4f8b\uff0c\u4fee\u590d\u540e\u7684\u8fd9\u4e9b\u7528\u4f8b\u5728\u672c\u5730\u8c03\u8bd5\u7684\u65f6\u5019\u6211\u4eec\u4e0d\u5e0c\u671b\u7ee7\u7eed\u8df3\u8fc7\uff0c\u4f46\u662f\u6b64\u65f6\uff0c\u4fee\u590d\u7684\u8fd9\u4e9b\u7528\u4f8b\u53ef\u80fd\u8fd8\u4e0d\u7a33\u5b9a\uff0c\u4e0d\u9002\u5408\u9a6c\u4e0a\u653e\u5230\u6d41\u6c34\u7ebf\u53bb\u8dd1\uff0c\u4e5f\u5c31\u662f\u8bf4\u6d41\u6c34\u7ebf\u4e0a\u6211\u4eec\u662f\u5e0c\u671b\u4ed6\u7ee7\u7eed\u8df3\u8fc7\u7684\uff0c\u56e0\u6b64\uff0c\u54b1\u4e0d\u80fd\u76f4\u63a5\u628a skip-XXX \u5e72\u6389\uff1b \u8fd9\u91cc\u5c31\u77db\u76fe\u4e86\uff0c\u4e00\u4e2a\u9700\u6c42\u662f\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u53e6\u4e00\u4e2a\u9700\u6c42\u53c8\u4e0d\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u600e\u4e48\u529e\u5462\uff1f \u6211\u4eec\u4f7f\u7528\u201c\u786e\u8ba4\u4fee\u590d\u201d\u6765\u6807\u8bb0\u8fd9\u6761\u7528\u4f8b\u5df2\u7ecf\u4fee\u590d\u4e86\uff0c\u8fd9\u6837\u4f60\u672c\u5730\u8c03\u8bd5\u7528\u4f8b\u7684\u65f6\u5019\u8fd9\u6761\u5df2\u4fee\u590d\u7684\u7528\u4f8b\u662f\u4f1a\u6267\u884c\u7684\uff0c\u540c\u65f6\u5728\u6d41\u6c34\u7ebf\u4e0a\u5c06 --ifixed yes \u53c2\u6570\u52a0\u4e0a\uff0c\u90a3\u4e48\u6d41\u6c34\u7ebf\u4e0a\u6267\u884c\u65f6\u8fd9\u6761\u7528\u4f8b\u4ecd\u7136\u662f\u8df3\u8fc7\u7684\u72b6\u6001\uff0c\u540e\u7eed\u4f60\u6253 Tag \u7684\u65f6\u5019\uff0c\u628a \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u7684\u6807\u7b7e\u5168\u90e8\u5220\u6389\u5c31\u53ef\u4ee5\u4e86\u3002 \u8fd9\u5c31\u662f\u201c\u786e\u8ba4\u4fee\u590d\u201d\u8fd9\u4e2a\u6807\u7b7e\u7684\u80cc\u666f\uff0c\u9700\u8981\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u54c1\u4e00\u54c1\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#33","title":"3.3\u3001\u5e9f\u5f03\u7528\u4f8b","text":"\u9488\u5bf9\u67d0\u4e9b\u7528\u4f8b\uff0c\u7531\u4e8e\u9700\u6c42\u53d8\u66f4\uff0c\u73af\u5883\u5f71\u54cd\u6216\u8bc4\u4f30\u4e0d\u518d\u9002\u7528\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u65f6\uff0c\u7528\u4f8b\u9700\u8981\u5e9f\u5f03\uff0c\u5219\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u5e9f\u5f03\u7528\u4f8b\u201d\uff0c\u8be5\u5217\u5b58\u5728 \u201cremoved-{\u5e9f\u5f03\u539f\u56e0}\u201d\uff0c\u5219\u7528\u4f8b\u4e0d\u4f1a\u6267\u884c\u3002 \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d removed-\u5df2\u5e9f\u5f03 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_2","title":"4\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u4e0a\u9762\u4ecb\u7ecd Pytest \u6846\u67b6\u63d0\u4f9b\u7684\u6807\u7b7e\u529f\u80fd mark\uff0c\u4f7f\u7528\u65f6\u9700\u8981\u4e3a\u6bcf\u4e00\u4e2a\u7528\u4f8b\u6dfb\u52a0\u6807\u7b7e\u88c5\u9970\u5668\uff0c\u5219\u64cd\u4f5c\u590d\u6742\uff0c\u53ef\u7ef4\u62a4\u6027\u5dee\uff0c\u5176\u6839\u672c\u95ee\u9898\u5c31\u662f\u6807\u7b7e\u5206\u6563\u5728\u6bcf\u4e00\u6761\u7528\u4f8b\u7684\u88c5\u9970\u5668\u4e0a\uff0c\u96be\u4ee5\u96c6\u4e2d\u7ef4\u62a4\uff1b\u4e8e\u662f\u4e4e\u5c06\u6240\u6709\u6807\u7b7e\u4f7f\u7528 csv \u6587\u4ef6\u8fdb\u884c\u96c6\u4e2d\u7ba1\u7406\uff0c\u5e76\u901a\u8fc7 Pytest \u7684\u94a9\u5b50\u51fd\u6570\uff0c\u8bfb\u53d6 csv \u6587\u4ef6\uff0c\u52a8\u6001\u6dfb\u52a0\u6807\u7b7e\u5230\u7528\u4e2d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5csv","title":"5\u3001CSV\u6587\u4ef6\u683c\u5f0f","text":"\u6b64\u914d\u7f6e\u6587\u4ef6\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u6807\u7b7e\u6570\u636e\uff0c\u4e14\u8981\u65b9\u4fbf\u80fd\u4f7f\u7528Excel\u6253\u5f00\u8fdb\u884c\u7f16\u8f91\u67e5\u770b\uff0c\u66f4\u91cd\u8981\u7684\u662f\u6211\u4eec\u4e0d\u60f3\u5f15\u5165\u4e09\u65b9\u4f9d\u8d56\uff0cCSV \u6587\u4ef6\u51e0\u4e4e\u662f\u552f\u4e00\u80fd\u6ee1\u8db3\u6240\u6709\u7684\u8981\u6c42\u7684\u6587\u4ef6\u683c\u5f0f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_6","title":"\u4e03\u3001\u65e5\u5fd7\u7cfb\u7edf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_5","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e YouQu \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u64cd\u4f5c\u65b9\u6cd5\u5c01\u88c5\u5199\u6cd5\uff0c\u901a\u5e38\u662f\u8fd9\u6837\u7684\uff1a\u7c7b\u91cc\u9762\u4e00\u4e2a\u51fd\u6570\u53ea\u5305\u542b\u4e00\u4e2a\u64cd\u4f5c\u6216\u591a\u6b21\u8c03\u7528\u7684\u4e00\u7cfb\u5217\u53ef\u5408\u5e76\u7684\u64cd\u4f5c\uff1b \u4f20\u7edf\u7684\u65e5\u5fd7\u8f93\u51fa\u65b9\u5f0f\uff0c\u9700\u8981\u5728\u6bcf\u4e2a\u51fd\u6570\u91cc\u9762\u4e3b\u52a8\u7f16\u5199\u65e5\u5fd7\u8f93\u51fa\u4ee3\u7801 \uff0c\u4f8b\u5982\uff1a class XXXWidget:\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\nlogger.info(\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\")\n...\n# \u7701\u7565\u4ee3\u7801\u90e8\u5206\n \u4e00\u4e2a\u51fd\u6570\u91cc\u9762\u81f3\u5c11\u5305\u542b\u4e00\u6761\u65e5\u5fd7\u4fe1\u606f\uff0c\u5982\u679c\u6bd4\u8f83\u590d\u6742\u64cd\u4f5c\u6b65\u9aa4\uff0c\u53ef\u80fd\u5305\u542b\u591a\u6761\u65e5\u5fd7\u4fe1\u606f\uff1b \u4e00\u4e2a\u5e94\u7528\u542b\u6709\u5927\u91cf\u7684\u64cd\u4f5c\u51fd\u6570\uff0c\u4e5f\u5c31\u662f\u8bf4\u6211\u4eec\u9700\u8981\u5199\u5927\u91cf\u7684\u65e5\u5fd7\u4ee3\u7801\uff1b \u901a\u8fc7\u7ecf\u9a8c\u89c2\u5bdf\uff0c\u6211\u4eec\u53d1\u73b0\uff0c\u51fd\u6570\u8bf4\u660e\u4ee5\u53ca\u51fd\u6570\u64cd\u4f5c\u65e5\u5fd7\uff0c\u5177\u6709\u8f83\u9ad8\u7684\u91cd\u590d\u5ea6\uff08\u4ece\u4e0a\u9762\u7684\u4f8b\u5b50\u4e5f\u53ef\u4ee5\u770b\u51fa\u6765\uff09\uff0c\u56e0\u6b64\u6211\u4eec\u5927\u80c6\u7684\u8bbe\u60f3\uff0c\u80fd\u4e0d\u80fd\u57fa\u4e8e\u6846\u67b6\u6267\u884c\u65f6\uff0c\u81ea\u52a8\u7684\u5c06\u51fd\u6570\u8bf4\u660e\u4f5c\u4e3a\u65e5\u5fd7\u6253\u5370\u51fa\u6765\uff0c\u4ece\u800c\u51cf\u5c11\u5927\u91cf\u65e5\u5fd7\u4ee3\u7801\u91cf\u548c\u91cd\u590d\u7f16\u5199\uff0c\u90a3\u771f\u662f\u5999\u554a~\u3002 \u57fa\u4e8e\u6b64\u201c\u5929\u771f\u201d\u7684\u60f3\u6cd5\uff0c\u6211\u4eec\u8bbe\u8ba1\u51fa\u4e86 youqu \u7684\u65e5\u5fd7\u7cfb\u7edf\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_5","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u6838\u5fc3\u539f\u7406\uff1a \u901a\u8fc7\u7ed9\u7c7b\u52a0\u4e0a\u4e00\u4e2a\u88c5\u9970\u5668 @log\uff0c\u52a8\u6001\u7ed9\u8be5\u7c7b\u4e0b\u6240\u6709\u7684\u51fd\u6570\u53ca\u7236\u7c7b\u51fd\u6570\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668 @_trace\uff0c\u5728\u6b64\u88c5\u9970\u5668\u4e2d\u6211\u4eec\u80fd\u52a8\u6001\u7684\u6355\u83b7\u6240\u8c03\u7528\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff08func.__doc__\uff09\uff0c\u901a\u8fc7\u65e5\u5fd7\u8f93\u51fa\u5668\u5c06\u5176\u8f93\u51fa\u5373\u53ef\u3002 \u5b9e\u73b0\u6b65\u9aa4\uff1a \u901a\u8fc7 inspect.getmembers \u83b7\u53d6\u88ab\u88c5\u9970\u7684\u7c7b\u4e0b\u6240\u6709\u51fd\u6570\uff0c\u5305\u542b\u9759\u6001\u65b9\u6cd5\uff0c\u7c7b\u65b9\u6cd5\uff0c\u5b9e\u4f8b\u65b9\u6cd5\uff1b \u901a\u8fc7 setattr(\u7c7b, \u65b9\u6cd5, _trace\uff09 \u7684\u65b9\u5f0f\uff0c\u7ed9\u7b26\u5408\u6761\u4ef6\u7684\u51fd\u6570\uff0c\u52a8\u6001\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_3","title":"3\u3001\u65e5\u5fd7\u914d\u7f6e","text":"[log_cli]\n;\u65e5\u5fd7\u76f8\u5173\u914d\u7f6e\uff08\u4e0d\u6253\u5370\u6784\u9020\u51fd\u6570\u548c\u9b54\u6cd5\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff09\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = INFO\n# ============= \u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u914d\u7f6e ================\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u5f00\u5934\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7, \u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_STARTSWITH = Assert\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u7ed3\u5c3e\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_ENDSWITH = Widget\n;\u652f\u6301\u7c7b\u540d\u5305\u542b xxx \u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_CONTAIN = ShortCut\n# ==============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_3","title":"4\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u5728\u5e94\u7528\u5e93 widget \u65b9\u6cd5\u5e93\u91cc\u9762\uff0c\u53ea\u9700\u8981\u5728\u51fa\u53e3\u6587\u4ef6\u52a0\u4e0a\u7c7b\u88c5\u9970\u5668\uff0c\u5c31\u53ef\u4ee5\u5b9e\u73b0\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u4e86\uff1b # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6ce8\u610f\uff0c\u662f\u7c7b\u88c5\u9970\u5668\u3002 \u5b9e\u4f8b\uff1a # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\n@classmethod\ndef find_dfm_image(cls, *elements, multiple=False, rate=0.9):\n\"\"\"\n \u67e5\u627e\u56fe\u7247 {{elements}}.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e {{rate}} \u7684\u5750\u6807\n :param elements:\n :param multiple:\n :return:\n \"\"\"\nelement = tuple(map(lambda x: f\"{Config.PIC_RES_PATH}/{x}\", elements))\nreturn cls.find_image(*element, multiple=multiple)\n \u8c03\u7528\u65b9\u6cd5\u65f6\uff1a DfmWidget.find_dfm_image(\"dfm_001\")\n \u81ea\u52a8\u8f93\u51fa\u7684\u65e5\u5fd7\uff1a >> x86_64-uos-6: 02/28 17:48:47 | INFO | logger_utils: [find_dfm_image]: \u67e5\u627e\u56fe\u7247 dfm_001.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e 0.9 \u7684\u5750\u6807\n \u52a0\u4e0a\u88c5\u9970\u5668 @log \u4e4b\u540e\uff0c\u65b9\u6cd5\u5c42\u6240\u6709\u7684\u51fd\u6570\uff08\u5305\u62ec\u5b9e\u4f8b\u65b9\u6cd5\u3001\u7c7b\u65b9\u6cd5\u3001\u9759\u6001\u65b9\u6cd5\uff09\u90fd\u4e0d\u9700\u8981\u518d\u5199\u65e5\u5fd7\u4ee3\u7801\uff0c\u6267\u884c\u7684\u65f6\u5019\u4f1a\u81ea\u52a8\u8f93\u51fa\uff0c\u5e76\u4e14\u6240\u6709\u8c03\u7528\u7684\u65b9\u6cd5\u4f1a\u4ee5 allure.step \u7684\u65b9\u5f0f\uff0c\u5c55\u793a\u5728 allure \u62a5\u544a\u4e2d\uff0c\u5728\u62a5\u544a\u4e2d\u66f4\u80fd\u4e00\u76ee\u4e86\u7136\u7684\u770b\u5230\u7528\u4f8b\u6267\u884c\u6b65\u9aa4\u3002 \u3010\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\u3011 \u901a\u8fc7\u89c2\u5bdf\u524d\u9762\u7684\u4f8b\u5b50\uff0c\u7ec6\u5fc3\u7684\u540c\u5b66\u53ef\u80fd\u8fd8\u53d1\u73b0\u4e86\u4e00\u4e2a\u5c0f\u7ec6\u8282\uff1a\u51fd\u6570\u529f\u80fd\u8bf4\u660e\u4e2d\uff0c\u4e24\u5bf9\u5927\u62ec\u53f7\u4e2d\u7684\u5185\u5bb9 {{elements}} \u4f5c\u4e3a\u53d8\u91cf\u8f93\u51fa\u51fa\u6765\u4e86\uff1b \u6ca1\u9519\uff0c\u8fd9\u5c31\u662f\u6211\u4eec\u53c2\u8003Django \u548c jinja2 \u7684\u6a21\u677f\u8bed\u6cd5\u8bbe\u8ba1\u51fa\u7684\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\uff0c\u4f7f\u7528\u65b9\u6cd5\u5f88\u7b80\u5355\uff0c\u7528\u4e24\u5bf9\u5927\u62ec\u53f7\u628a\u51fd\u6570\u7684\u53c2\u6570\u62ec\u8d77\u6765\uff0c\u8fd9\u6837\u5728\u65e5\u5fd7\u8f93\u51fa\u7684\u65f6\u5019\u5c31\u80fd\u628a\u8c03\u7528\u51fd\u6570\u65f6\u53c2\u6570\u7684\u503c\u8f93\u51fa\u51fa\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_7","title":"\u516b\u3001\u73af\u5883\u90e8\u7f72","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_6","title":"1\u3001\u539f\u5219","text":"YouQu \u7684\u73af\u5883\u4f9d\u8d56\u4e00\u76f4\u575a\u6301 2 \u4e2a\u539f\u5219\uff1a \u6700\u5c0f\u73af\u5883\u4f9d\u8d56\u539f\u5219 \u6709\u4e9b\u540c\u5b66\u5199\u4e00\u4e9b\u529f\u80fd\uff0c\u9996\u5148\u60f3\u5230\u7684\u5c31\u662f\u53bb\u641c\u7d22\u5f15\u64ce\u641c\u4e00\u4e0b\uff0c\u770b\u6709\u6ca1\u6709\u73b0\u6210\u7684\u5de5\u5177\u6216\u8005\u4ee3\u7801\u76f4\u63a5\u80fd\u7528\uff0c\u7f8e\u5176\u540d\u66f0\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\uff0c\u522b\u4eba\u5df2\u7ecf\u9020\u597d\u4e86\u8f6e\u5b50\u54b1\u4eec\u5c31\u4e0d\u8981\u91cd\u590d\u53bb\u9020\u4e86\uff0c\u7136\u540e\u4e00\u5207\u4f3c\u4e4e\u90fd\u53d8\u5f97\u90a3\u4e48\u7684\u7406\u6240\u5e94\u5f53\u3002 \u5f53\u7136\u8fd9\u6837\u505a\u65e0\u53ef\u539a\u975e\uff0c\u6211\u76f8\u4fe1\u6709\u8fd9\u6837\u60f3\u6cd5\u5e76\u4e14\u4e00\u76f4\u8df5\u884c\u8fd9\u6837\u505a\u6cd5\u7684\u540c\u5b66\u4e0d\u5728\u5c11\u6570\uff0c\u4f46\u8fd9\u6837\u505a\u6709\u4e00\u4e2a\u5f88\u4e25\u91cd\u7684\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f60\u5199\u4e00\u4e2a\u5927\u578b\u9879\u76ee\u65f6\uff0c\u4f60\u4f1a\u5f15\u5165\u975e\u5e38\u975e\u5e38\u975e\u5e38\u591a\u7684\u4f9d\u8d56\uff0c\u6bd4\u5982\u8981\u505a\u4e2a\u63a5\u53e3\u8bf7\u6c42\u8981\u7528 requests\u3001\u8bfb\u5199\u4e2a\u6570\u636e\u7528 pandas\u3001\u5199\u4e2a\u8868\u683c\u7528 pyopenxl\u3001\u89e3\u6790\u4e2a\u6587\u672c\u8981\u7528\u8fd9\u4e2a\u90a3\u4e2a\u4e09\u65b9\u5e93 ... \u3002 \u6211\u8ba4\u4e3a\u8fd9\u662f\u975e\u5e38\u4e0d\u597d\u7684\u4e60\u60ef\uff0c\u5728\u5b9e\u73b0\u4e00\u4e2a\u529f\u80fd\u7684\u65f6\u5019\uff0c\u9996\u5148\u6211\u4eec\u5e94\u8be5\u53bb\u60f3\u81ea\u5df1\u600e\u4e48\u6837\u53bb\u5b9e\u73b0\uff0c\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff1b \u5982\u679c\u4f60\u4e0d\u4f1a\uff0c\u4f60\u53ef\u4ee5\u53bb\u5b66\u4e60\u4e09\u65b9\u5e93\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u522b\u4eba\u4e09\u65b9\u5e93\u4e5f\u662f\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\u7684\uff0c\u4e3a\u4ec0\u4e48\u54b1\u4eec\u4e0d\u884c\u5462\uff1b\u5982\u679c\u522b\u4eba\u7684\u4f60\u5b9e\u5728\u662f\u770b\u4e0d\u61c2\uff0c\u60f3\u5c3d\u4e00\u5207\u529e\u6cd5\u786e\u5b9e\u505a\u4e0d\u51fa\u6765\uff0c\u90a3\u518d\u8003\u8651\u5f15\u5165\u8fd9\u4e2a\u4e09\u65b9\u5e93\uff0c\u6211\u8ba4\u4e3a\u8fd9\u6837\u662f\u6ca1\u95ee\u9898\u7684\uff0c\u6bd5\u7adf\u54b1\u4eec\u6bb5\u4f4d\u8fd8\u4e0d\u591f\uff0c\u4f46\u5e0c\u671b\u5c06\u6765\u6709\u4e00\u5929\u6211\u4eec\u53ef\u4ee5\u3002 \u8fd9\u6837\u7684\u505a\u6cd5\u624d\u5e94\u8be5\u662f\u201c\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\u201d\u6b63\u786e\u7684\u64cd\u4f5c\u3002\u4e0d\u4f1a\u6ca1\u5173\u7cfb\uff0c\u770b\u770b\u522b\u4eba\u662f\u600e\u4e48\u5b9e\u73b0\u7684\uff0c\u81ea\u5df1\u518d\u6478\u7d22\u7740\u5199\u51fa\u6765\uff0c\u8fd9\u6837\u81ea\u5df1\u624d\u80fd\u6709\u6240\u63d0\u9ad8\uff0c\u4e0d\u7136\u4f60\u5c31\u53ea\u4f1a\u7528\u522b\u4eba\u7684\u4e1c\u897f\uff1b\u90a3\u4e9b\u5632\u7b11\u3001\u6279\u8bc4\u6211\u4eec\u91cd\u590d\u9020\u8f6e\u5b50\u7684\u4eba\uff0c\u5148\u60f3\u60f3\u81ea\u5df1\u4f1a\u9020\u8f6e\u5b50\u5417\u3002 \u672c\u7740\u81ea\u5df1\u5b9e\u73b0\u80fd\u5b9e\u73b0\u7684\u4e00\u5207\u7684\u539f\u5219\uff0cYouQu \u6846\u67b6\u505a\u5230\u4e86\u975e\u5e38\u5c11\u7684\u73af\u5883\u4f9d\u8d56\uff0c\u800c\u4e14\u6211\u4eec\u4ecd\u5728\u4e0d\u65ad\u52aa\u529b\uff0c\u51cf\u5c11\u73af\u5883\u90e8\u7f72\u7684\u4f9d\u8d56\u3002 \u6700\u5c0f\u4ed3\u5e93\u4f53\u79ef\u539f\u5219 \u5927\u6587\u4ef6\u4e0d\u80fd\u4e0a\u4f20\u5230\u5de5\u7a0b\u91cc\u9762\uff0c\u4fdd\u6301\u6574\u4e2a\u5de5\u7a0b\u7684\u8f7b\u91cf\u5316\uff0c\u8fd9\u6837\u5728\u514b\u9686\u4ee3\u7801\u7684\u65f6\u5019\u624d\u80fd\u975e\u5e38\u5feb\u901f\u65b9\u4fbf\u4f7f\u7528\uff0c\u6211\u4eec\u89c1\u8fc7\u4e00\u4e2a AT \u5de5\u7a0b clone \u5927\u5c0f\u8fbe\u5230\u597d\u51e0\u4e2a G\uff0c\u7b80\u76f4\u4e0d\u53ef\u601d\u8bae\u3002 \u5176\u5b9e\u4ee3\u7801\u6587\u4ef6\u7684\u5927\u5c0f\u662f\u5f88\u5c0f\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u7eaf\u5199\u4ee3\u7801\u968f\u4fbf\u5199\u5de5\u7a0b\u4e5f\u4e0d\u4f1a\u592a\u5927\uff0c\u800c\u6587\u6863\uff08\u5305\u542b\u63d2\u56fe\uff09\u7b49\u8d44\u6e90\u5374\u662f\u5f88\u5360\u7a7a\u95f4\u3002 \u56e0\u6b64\u6211\u4eec\u9009\u62e9\u5c06 YouQu \u7684\u6587\u6863\u5de5\u7a0b\u5355\u72ec\u8fc1\u51fa\u5230\u72ec\u7acb\u7684\u4ed3\u5e93 youqu-docs \u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_6","title":"2\u3001\u5b89\u88c5","text":"\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u8fd0\u884c env.sh \u5373\u53ef\u3002 bash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_4","title":"3\u3001\u5b9a\u5236\u4f9d\u8d56","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_2","title":"3.1\u3001\u65b0\u589e\u4f9d\u8d56","text":"\u5982\u679c\u5e94\u7528\u5e93\u8fd8\u9700\u8981\u5176\u4ed6 Python \u4f9d\u8d56\u5e93\uff0c\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a requirement.txt \u6587\u4ef6\uff1b autotest_xxx\n\u251c\u2500\u2500 requirement.txt\n\u251c\u2500\u2500 case ...\n \u91cc\u9762\u5199\u5165\u9700\u8981\u5b89\u88c5\u7684\u4e09\u65b9\u4f9d\u8d56\uff0c\u6bd4\u5982\u50cf\u8fd9\u6837\uff1a # requirement.txt\nPyYAML==6.0 # \u6307\u5b9a\u5b89\u88c5\u67d0\u4e2a\u7248\u672c\nrequests # \u672a\u6307\u5b9a\u7248\u672c\u5219\u5b89\u88c5\u6700\u65b0\u7248\n \u5728\u6267\u884c bash env.sh \u65f6\u4f1a\u4e00\u5e76\u5c06\u5176\u5b89\u88c5\u3002 \u5982\u679c\u591a\u4e2a\u5e94\u7528\u5e93\u90fd\u5b58\u5728 requirement.txt \u6587\u4ef6\uff0c\u6267\u884c env.sh \u65f6\u4f1a\u5c06\u591a\u4e2a requirement.txt \u6587\u4ef6\u4e00\u5e76\u52a0\u8f7d\uff1b\u90a3\u4e48\u4e00\u5b9a\u8981\u6ce8\u610f\u591a\u4e2a requirement.txt \u6587\u4ef6\u53ef\u80fd\u5b58\u5728\u76f8\u540c\u7684\u4f9d\u8d56\u88ab\u6307\u5b9a\u5b89\u88c5\u4e0d\u540c\u7248\u672c\u7b49\u7b49\u517c\u5bb9\u6027\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32_1","title":"3.2\u3001\u88c1\u526a\u4f9d\u8d56","text":"\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0c\u53ef\u80fd\u4f60\u53ea\u9700\u8981\u5b89\u88c5\u4e00\u4e9b\u6700\u6700\u57fa\u7840\u7684\u4f9d\u8d56\uff0c\u5176\u4ed6\u7684\u90fd\u4e0d\u9700\u8981\uff0c\u6bd4\u5982\u7eaf\u63a5\u53e3\u81ea\u52a8\u5316\u7684\u9879\u76ee\uff0c\u5b83\u4e0d\u9700\u8981 UI \u81ea\u52a8\u5316\u76f8\u5173\u7684\u4f9d\u8d56\u3002 \u4f60\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\uff0c\u5b58\u653e\u4e00\u4e2a BASICENV \u7684\u666e\u901a\u6587\u4ef6\uff0c\u91cc\u9762\u4e0d\u9700\u8981\u5199\u4efb\u4f55\u5185\u5bb9\uff0c\u8fd9\u6837\u6267\u884c env.sh \u65f6\uff0c\u53ea\u4f1a\u5b89\u88c5\u6700\u57fa\u7840\u7684\u4f9d\u8d56\u3002 autotest_xxx\n\u251c\u2500\u2500 BASICENV # \u53ef\u4ee5\u4f7f\u7528\uff1atouch BASICENV \u521b\u5efa\u6587\u4ef6\n\u251c\u2500\u2500 case ...\n \u57fa\u7840\u4f9d\u8d56\u4ec5\u5b89\u88c5\u4ee5\u4e0b\u51e0\u4e2a\u5305\uff1a pytest # pytest\npytest-rerunfailures # \u5931\u8d25\u91cd\u8dd1\u63d2\u4ef6\npytest-timeout # \u7528\u4f8b\u8d85\u65f6\u63d2\u4ef6\nallure-pytest # \u751f\u6210 allure \u62a5\u544a\u63d2\u4ef6\nallure.deb # allure \u62a5\u544a\u67e5\u770b\u5de5\u5177\n \u88c1\u526a\u4f9d\u8d56 \u548c \u65b0\u589e\u4f9d\u8d56 \u662f\u4e0d\u51b2\u7a81\u7684\uff0c\u53ef\u4ee5\u540c\u65f6\u4f7f\u7528\u3002 \u6b64\u65b9\u6848\u9ed8\u8ba4\u4e3a\u865a\u62df\u73af\u5883\u90e8\u7f72\uff0c\u5982\u679c\u4f60\u60f3\u76f4\u63a5\u90e8\u7f72\u5728\u672c\u673a\u4e0a\uff1a bash env_dev.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_8","title":"\u4e5d\u3001\u5931\u8d25\u5f55\u5c4f","text":"\u5f55\u5c4f\u5176\u5b9e\u662f\u4e00\u79cd\u89c6\u9891\u5f62\u5f0f\u7684\u65e5\u5fd7\uff0c\u56e0\u4e3a\u5f88\u591a\u65f6\u5019\u6211\u4eec\u5728\u67e5\u770b\u65e5\u5fd7\u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u51c6\u786e\u7684\u5b9a\u4f4d\u5230\u7528\u4f8b\u5931\u8d25\u7684\u5177\u4f53\u539f\u56e0\uff0c\u56e0\u6b64\u7528\u4f8b\u7684\u5f55\u5c4f\u80fd\u8ba9\u6211\u4eec\u770b\u5230\u7528\u4f8b\u5728\u6267\u884c\u8fc7\u7a0b\uff1b \u3010\u4f7f\u7528\u65b9\u6cd5\u3011 \u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u5173\u6ce8 2 \u4e2a\u53c2\u6570\uff1b ;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\u3002\n;\u6ce8\u610f\uff0c\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u4e0d\u80fd\u5c0f\u4e8e\u5931\u8d25\u5f55\u5c4f\u6b21\u6570\uff0c\u5373 RERUN >= RECORD_FAILED_CASE\nRECORD_FAILED_CASE = 1\n \u9ed8\u8ba4\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u662f 1 \u6b21\uff1b RECORD_FAILED_CASE = 1 \u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff1b RECORD_FAILED_CASE = 0 \u8868\u793a\u4e0d\u7ba1\u7528\u4f8b\u6210\u529f\u6216\u5931\u8d25\u90fd\u5f55\u5c4f\uff1b \u5f55\u5c4f\u662f\u8981\u5360\u7528\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u7279\u522b\u662f\u5728\u4e00\u4e9b\u914d\u7f6e\u8f83\u4f4e\u7684\u673a\u5668\u4e0a\u4f1a\u5f88\u660e\u663e\uff0c\u6240\u4ee5\u4f60\u9700\u8981\u8003\u8651\u662f\u5426\u6709\u5fc5\u8981\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1b \u4f7f\u7528 manage.py \u6267\u884c\u7528\u4f8b\u9ed8\u8ba4\u8bfb\u53d6\u5230 globalconfig.ini \u91cc\u9762\u7684\u53c2\u6570\uff0c\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report/record \u76ee\u5f55\u4e0b\u4fdd\u5b58\u5931\u8d25\u7528\u4f8b\u7684\u5f55\u5c4f\u548c\u65ad\u8a00\u7684\u90a3\u4e2a\u65f6\u95f4\u70b9\u7684\u622a\u5c4f\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7\u89c6\u9891\u6587\u4ef6\u770b\u5230\u5931\u8d25\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u90fd\u53d1\u751f\u4e86\u4ec0\u4e48\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#wayland","title":"\u5341\u3001Wayland \u9002\u914d","text":"Wayland \u4e0b\u81ea\u52a8\u5316\u4e3b\u8981\u95ee\u9898\u662f X11 \u4e0b\u7684\u952e\u9f20\u64cd\u4f5c\u65b9\u6cd5\u65e0\u6cd5\u4f7f\u7528\uff0c\u6bd4\u5982 Xdotool\u3001 PyAutoGUI\u3001Xwininfo \u7b49\u7b49\uff1b YouQu \u5728 Wayland \u4e0b\u517c\u5bb9\u9002\u914d\uff0cenv.sh \u5728 Wayland \u4e0b\u6267\u884c\u65f6\u4f1a\u5b89\u88c5\u81ea\u7814\u7684\u952e\u9f20\u64cd\u4f5c\u670d\u52a1\uff08\u53ef\u80fd\u5b58\u5728\u4e00\u4e9b\u4f9d\u8d56\u62a5\u9519\uff0c\u6309\u7167\u6ce8\u91ca\u89e3\u51b3\u5373\u53ef\uff09\uff0c\u6846\u67b6\u6838\u5fc3\u5e93\u4e5f\u9488\u5bf9\u6027\u7684\u505a\u4e86\u9002\u914d\uff0c\u4e0a\u5c42\u7528\u4f8b\u5b8c\u5168\u4e0d\u7528\u5173\u5fc3\u673a\u5668\u662fWayland \u8fd8\u662f X11\uff0c\u6846\u67b6\u4f1a\u6839\u636e\u6267\u884c\u65f6\u72b6\u6001\u81ea\u52a8\u5224\u65ad\u8d70\u4e0d\u540c\u7684\u903b\u8f91\uff1b \u7b80\u5355\u8bb2\u5c31\u662f\uff0c\u5e94\u7528\u5e93\u53ea\u9700\u8981\u7ef4\u62a4\u4e00\u5957\u7528\u4f8b\u811a\u672c\u5373\u53ef\u3002 \u3010\u7528\u4f8b\u517c\u5bb9\u3011 \u56e0\u4e3a Wayland \u4e0b\u6709\u4e9b\u5e94\u7528\u7684\u754c\u9762\u663e\u793a\u548c\u529f\u80fd\u672c\u8eab\u5b58\u5728\u4e00\u4e9b\u5dee\u5f02\uff0c\u7528\u4f8b\u5c42\u53ef\u80fd\u9700\u8981\u5bf9\u8fd9\u90e8\u5206\u7528\u4f8b\u505a\u903b\u8f91\u5224\u65ad\uff0c\u4f7f\u7528\u5168\u5c40\u914d\u7f6e\u91cc\u9762\u7684\u5e38\u91cf\u8fdb\u884c\u903b\u8f91\u7f16\u5199\u5373\u53ef\uff1a from setting.globalconfig import GlobalConfig\n# GlobalConfig.IS_WAYLAND \u83b7\u53d6\u5230\u5f53\u524d\u7684\u663e\u793a\u670d\u52a1\u5668\uff08bool\uff09\n# \u5e94\u7528\u5e93 Config \u7ee7\u627f GlobalConfig\nif Config.IS_WAYLAND:\npass\nif Config.IS_X11:\npass\n \u6bd4\u5982\u7528\u4f8b\u91cc\u9762\u5982\u679c\u65ad\u8a00\u7684\u56fe\u7247\u4e0d\u540c\uff1a if Config.IS_WAYLAND:\nself.assert_image_exist(\"wayland_XXX\")\nelse:\nself.assert_image_exist(\"x11_XXX\")\n \u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u811a\u672c\u5728 Wayland \u548c X11 \u4e0b\u90fd\u53ef\u4ee5\u8dd1\uff0cso easy \u662f\u4e0d\u662f\uff1f\u5b8c\u5168\u6ca1\u5fc5\u8981\u4e13\u95e8\u62c9\u65b0\u5206\u652f\u8fdb\u884c Wayland \u9002\u914d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_9","title":"\u5341\u4e00\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_7","title":"1. \u76ee\u5f55\u7ed3\u6784","text":"\u6267\u884c\u65f6\u4f1a\u5728\u6839\u76ee\u5f55\u4e0b\u52a8\u6001\u751f\u6210 report \u76ee\u5f55\uff0c\u6240\u6709\u7684\u62a5\u544a\u76f8\u5173\u7684\u6587\u4ef6\u4f1a\u7edf\u4e00\u5b58\u653e\u5728\u91cc\u9762\uff0c\u793a\u4f8b\uff1a /report\n \u251c\u2500\u2500 allure # allure\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json\n \u251c\u2500\u2500 allure_html # \u751f\u6210\u7684html\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 index.html \u251c\u2500\u2500 allure_back # allure\u62a5\u544a\u5907\u4efd\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 20221108114823\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json\n \u251c\u2500\u2500 json # json\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 result_deepin-music_20221109134736_1081333.json\n \u251c\u2500\u2500 logs # \u65e5\u5fd7\u6587\u4ef6\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 2022-11-10_debug.log \u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-10_error.log\n \u251c\u2500\u2500 record # \u5f55\u5c4f\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-09\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 15\u65f614\u520609\u79d2_test_music_303_2_autotest.mp4\n \u2514\u2500\u2500 xml # xml\u62a5\u544a\n\u2514\u2500\u2500 autotest_deepin_music-20221109134736.xml\n \u9ed8\u8ba4\u60c5\u51b5\u4e0b\u540c\u65f6\u751f\u6210 html\u3001xml\u3001json\u4e09\u79cd\u5f62\u5f0f\u7684\u62a5\u544a\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_7","title":"2. \u5b9a\u5236\u62a5\u544a","text":"\u6211\u4eec\u5bf9 allure \u62a5\u544a\u8fdb\u884c\u4e86\u4e00\u7cfb\u5217\u7684\u5b9a\u5236\uff1a \u5b9a\u5236 logo\u3001title\u3001\u62a5\u544a\u9ed8\u8ba4\u8bed\u8a00\u4e3a\u4e2d\u6587\uff1b \u52a0\u5165\u4e86\u7528\u4f8b\u65ad\u8a00\u5931\u8d25\u65f6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u4ee5\u53ca\u6b64\u65f6\u56fe\u50cf\u5bf9\u6bd4\u7684\u6a21\u677f\u56fe\u7247\uff1b \u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\uff0c\u4f60\u53ef\u4ee5\u5728 html \u62a5\u544a\u4e2d\u76f4\u63a5\u770b\u5f55\u5236\u7684\u89c6\u9891\uff1b \u52a0\u5165\u4e86 IP \u5730\u5740\u3001\u7cfb\u7edf\u4fe1\u606f\u3001\u955c\u50cf\u7248\u672c\u7b49\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_5","title":"3. \u67e5\u770b\u62a5\u544a","text":" \u672c\u5730\u6267\u884c \u5728 report/allure \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u4e00\u5806\u6587\u672c\u6587\u4ef6\uff0c\u8fd9\u4e9b\u662f allure \u63d2\u4ef6\u751f\u6210\u7684\u62a5\u544a\u6e90\u6570\u636e\uff0c\u6211\u4eec\u5728 report/allure_html \u76ee\u5f55\u4e0b\u7ed9\u4f60\u751f\u6210\u4e86 html \u6587\u4ef6\uff0c\u4f46\u662f\u4f60\u4e0d\u80fd\u76f4\u63a5\u901a\u8fc7\u6d4f\u89c8\u5668\u6253\u5f00 index.html \u6587\u4ef6\uff0c\u56e0\u4e3a allure \u7684\u62a5\u544a\u90fd\u662f\u57fa\u4e8e\u5728\u7ebf\u7684\u670d\u52a1\uff0c\u4f60\u5e94\u8be5\u8fd9\u6837\u6253\u5f00\uff1a allure open report/allure_html\n \u4f7f\u7528 manage.py \u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u5728\u7ec8\u7aef\u7684\u6700\u540e\u4e00\u884c\uff0c\u6211\u4eec\u4f1a\u7ed9\u4f60\u8f93\u51fa\u6253\u5f00\u62a5\u544a\u7684\u547d\u4ee4\uff0c\u76f4\u63a5\u590d\u5236\u5b83\u5728\u7ec8\u7aef\u6267\u884c\u5c31\u53ef\u4ee5\u67e5\u770b\u4e86\uff0c\u50cf\u8fd9\u6837\uff1a \u7ec8\u7aef\u6267\u884c\u547d\u4ee4: allure open /tmp/youqu/report/allure_html \u67e5\u770b\u62a5\u544a \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 Pycharm \u91cc\u9762\u627e\u5230 index.html \u6587\u4ef6\uff0c\u7136\u540e\u53f3\u952e\u9009\u62e9\u6d4f\u89c8\u5668\u6253\u5f00\uff0c\u6216\u8005\u4f60\u53ef\u4ee5\u7528\u4e00\u4e2a http \u670d\u52a1\u6253\u5f00\u3002 \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 report/allure \u76ee\u5f55\u4e0b\u67e5\u770b\u62a5\u544a\uff1a allure serve report/allure\n \u8fdc\u7a0b\u6267\u884c \u8fdc\u7a0b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\uff0c\u4f1a\u5c06\u6240\u6709\u8fdc\u7a0b\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u62a5\u544a\u90fd\u6536\u96c6\u5230 report/allure \u76ee\u5f55\u4e0b\uff0c\u5206\u522b\u6309\u7167\u673a\u5668\u7684 IP \u7b49\u5efa\u4e86\u4e0d\u540c\u7684\u76ee\u5f55\uff0c\u4f60\u53ef\u4ee5\u5728\u8fd9\u4e9b\u76ee\u5f55\u91cc\u9762\u53bb\u67e5\u770b\u5bf9\u5e94\u7684\u6d4b\u8bd5\u62a5\u544a\uff0c\u67e5\u770b\u65b9\u6cd5\u548c\u524d\u9762\u672c\u5730\u6267\u884c\u67e5\u770b\u7684\u65b9\u6cd5\u4e00\u6837\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_10","title":"\u5341\u4e8c\u3001\u9759\u6001\u4ee3\u7801\u626b\u63cf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_8","title":"1. \u63d0\u524d\u89e3\u51b3\u4ee3\u7801\u95ee\u9898","text":"\u4e3a\u4e86\u5e2e\u52a9\u5f00\u53d1\u8005\u7edf\u4e00\u4ee3\u7801\u98ce\u683c\uff0cPython \u793e\u533a\u63d0\u51fa\u4e86 PEP8 \u4ee3\u7801\u7f16\u7801\u98ce\u683c\uff0cPython \u5b98\u65b9\u540c\u65f6\u63a8\u51fa\u4e86\u4e00\u4e2a\u68c0\u67e5\u4ee3\u7801\u98ce\u683c\u662f\u5426\u7b26\u5408 PEP8 \u7684\u5de5\u5177\uff0c\u540d\u5b57\u4e5f\u53eb PEP8\u3002 \u4f46\u662f\uff0cPycharm \u91cc\u9762\u7684 PEP8 \u63d2\u4ef6\u5b9e\u9645\u4e0a\u5e76\u4e0d\u80fd\u53d1\u73b0\u5f88\u591a\u4ee3\u7801\u95ee\u9898\uff0c\u8fd9\u4e9b\u95ee\u9898\u5e76\u4e0d\u4f1a\u5728\u8fd0\u884c\u65f6\u62a5\u9519\uff0c\u56e0\u4e3a\u4ece Python \u8bed\u8a00\u89d2\u5ea6\u5e76\u4e0d\u5173\u5fc3\u8fd9\u4e9b\u95ee\u9898\uff0c\u5728 Pycharm \u7f16\u8f91\u5668\u91cc\u9762\u4f7f\u7528\u5feb\u6377\u952e ctrl + alt + L\uff0c\u6709\u4e00\u70b9\u70b9\u683c\u5f0f\u5316\u7684\u6548\u679c\uff0c\u80fd\u89e3\u51b3\u4e00\u4e9b\u7a7a\u683c\u3001\u6362\u884c\u7b49\u5c0f\u95ee\u9898\u3002 \u8fd9\u91cc\u63a8\u8350\u4e00\u4e2a Python \u793e\u533a\u6d41\u884c\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff1a Black\uff0c\u53f7\u79f0\u4e0d\u59a5\u534f\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff0c\u5b83\u68c0\u6d4b\u5230\u4e0d\u7b26\u5408\u89c4\u8303\u7684\u4ee3\u7801\u98ce\u683c\u76f4\u63a5\u5c31\u5e2e\u4f60\u5168\u90e8\u683c\u5f0f\u5316\u597d\uff0c\u5c31\u662f\u8fd9\u4e48\u521a\uff01 \u5b89\u88c5\uff1a sudo pip3 install black \n \u4f7f\u7528\u65b9\u6cd5\uff1a black ${CheckPath}\n \u4f7f\u7528\u8fd9\u4e2a\u5de5\u5177\u683c\u5f0f\u5316\u4e4b\u540e\uff0c\u4ee3\u7801\u4f1a\u88ab\u81ea\u52a8\u8c03\u6574\uff0c\u521a\u5f00\u59cb\u4f60\u53ef\u80fd\u4f1a\u89c9\u5f97\u8c03\u6574\u5f97\u5f88\u5938\u5f20\uff0c\u6ca1\u5173\u7cfb\u575a\u6301\u770b\uff0c\u4e60\u60ef\u4e4b\u540e\uff0c\u4f60\u4f1a\u89c9\u5f97\u5f88\u4f18\u96c5\uff0c\u6ca1\u9519\uff0c\u8fd9\u5c31\u662f Pythonic Code \u7684\u6838\u5fc3\uff0c\u8bf7\u4fdd\u6301\u4f18\u96c5\uff5e\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_8","title":"2. \u4ee3\u7801\u626b\u63cf\u5de5\u5177","text":"\u4f7f\u7528\u6839\u76ee\u5f55\u4e0b pylint.sh \u626b\u63cf\u4ee3\u7801\uff0c\u5728 report \u76ee\u5f55\u4e0b\u67e5\u770b\u4ee3\u7801\u626b\u63cf\u62a5\u544a\uff0c\u5982\u679c\u6709\u4ee3\u7801\u95ee\u9898\u8bf7\u63d0\u524d\u89e3\u51b3\u4e4b\u540e\u518d\u63d0\u4ea4\u3002 \u6b64\u811a\u672c\u5df2\u7ecf\u4f7f\u7528 Python \u793e\u533a\u6700\u6d41\u884c\u7684\u4ee3\u7801\u626b\u63cf\u5de5\u5177 Pylint \u8fdb\u884c\u4ee3\u7801\u626b\u63cf\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a bash pylint.sh\n \u8fd0\u884c\u4e4b\u540e\u4f1a\u63d0\u793a\u4f60\u8981\u626b\u63cf\u7684\u76ee\u5f55\uff0c\u6bd4\u5982\u8f93\u5165 apps \uff0c\u5219\u4f1a\u626b\u63cf apps \u4e0b\u7684\u6240\u6709 Python \u4ee3\u7801\u3002 \u5728 setting/pylintrc.cfg \u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u76f8\u5173\u914d\u7f6e\uff0c\u626b\u63cf\u5b8c\u6210\u4e4b\u540e\u5728 report/pylints \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u626b\u63cf\u62a5\u544a\u3002 \u4ee3\u7801\u63d0\u4ea4\u9700\u901a\u8fc7 git review \u63d0\u4ea4\u5230 gerrit \uff0c\u4eba\u5de5 Code Review \u901a\u8fc7\u4e4b\u540e\u5408\u5165\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_11","title":"\u5341\u4e09\u3001\u63d0\u4ea4\u4ee3\u7801","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_9","title":"1. \u5b89\u88c5\u4f9d\u8d56","text":"sudo apt install git-review\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_9","title":"2. \u63d0\u4ea4\u6a21\u677f","text":"\u5728 ~ \u76ee\u5f55\u4e0b\u65b0\u5efa\u6587\u4ef6\uff0c\u5e76\u547d\u540d\u4e3a gitcommit_template \u5c06\u4ee5\u4e0b\u5185\u5bb9\u5199\u5165\u6587\u4ef6\u5f53\u4e2d\uff1a # commit type :fix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style(\u98ce\u683c\u4fee\u6539)\u3001refactor(\u91cd\u6784)\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test(\u6d4b\u8bd5) + \u7b80\u5355\u63cf\u8ff0. \u9ed8\u8ba4fix,\u6839\u636e\u60c5\u51b5\u4fee\u6539\nfix: \n\n# \u8be6\u7ec6\u8bf4\u660e\u4ee3\u7801\u7684\u6539\u52a8\uff0c\u5305\u542b\u4ee3\u7801\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u4ee5\u53ca\u4e3a\u4ec0\u4e48\u8fd9\u4e48\u505a\uff0c\u53ef\u80fd\u4f1a\u5f71\u54cd\u54ea\u4e9b\u529f\u80fd\u3002\u5bf9\u4e8e\u4ee3\u7801\u7684\u5ba1\u6838\u8005\uff0c\u9700\u8981\u4ece\u8fd9\u6bb5\u63cf\u8ff0\u4e2d\u80fd\u5b8c\u5168\u7406\u89e3\u4ee3\u7801\u4e2d\u6240\u6709\u6539\u52a8\u7684\u5185\u5bb9\nDescription: \n\n# \u5199\u4e00\u6bb5\u9762\u5411\u4e8e\u4ea7\u54c1\u7684\u603b\u7ed3\u6027\u5185\u5bb9\uff0c\u7528\u4e8e\u81ea\u52a8\u751f\u6210crp\u4e0a\u7684changlog\uff0c\u9700\u8981\u6ce8\u610f\u7684\u4e8b\uff0c\u8fd9\u6bb5\u63cf\u8ff0\u5fc5\u987b\u4ece\u4ea7\u54c1\u7684\u89d2\u5ea6\u8003\u8651\u3002\nLog: \n\n# \u5173\u8054pms\u4e0a\u7684bug\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94bug\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4fee\u590dbug\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Bug: \n\n# \u4fee\u590d github issue \n#Issue: \n\n# \u5173\u8054pms\u4e0a\u7684\u4efb\u52a1\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94\u4efb\u52a1\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4efb\u52a1\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Task: \n \u547d\u4ee4\u884c\u6267\u884c: git config --global commit.template ~/gitcommit_template\n \u6b64\u547d\u4ee4\u5c06\u6a21\u677f\u52a0\u5165\u5230 git \u7684\u63d0\u4ea4\u6a21\u677f\u4e2d\u3002 \u540e\u7eed\u63d0\u4ea4\u7684\u65f6\u5019\u9700\u8981\u5173\u6ce8\u4e00\u4e0b\u51e0\u70b9\uff1a commit type \u5bf9\u5e94\u4e0d\u540c\u7684\u4fee\u6539\u7c7b\u578b\uff1afix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style \uff08\u98ce\u683c\u4fee\u6539\uff09\u3001refactor \uff08\u91cd\u6784\uff09\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test \uff08\u6d4b\u8bd5\uff09 commit type \u5192\u53f7\u540e\u9762\u52a0\u7a7a\u683c\u3002 Description \u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u9700\u8981\u8fdb\u884c\u8be6\u7ec6\u8bf4\u660e\uff0c\u6bd4\u5982\u5bf9\u529f\u80fd\u8fdb\u884c\u5927\u6539\u7b49\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_6","title":"3. \u63a8\u9001\u4ee3\u7801","text":"\u9996\u5148\u6dfb\u52a0 commit \u4fe1\u606f git add \u540e\u9762\u52a0\u6587\u4ef6\u540d\u79f0\n git add . # \u8868\u793a\u6dfb\u52a0\u6240\u6709\u6587\u4ef6\n \u4f7f\u7528\u8fd9\u6761\u547d\u4ee4\u6ce8\u610f\u6709\u4e9b\u4e34\u65f6\u6587\u4ef6\u4e0d\u8981\u63d0\u4ea4\u5230\u4ed3\u5e93\u4e86\u3002 git commit -a\n \u4e4b\u540e\u5728 fix: \u540e\u9762\uff08\u6ce8\u610f\u5192\u53f7\u540e\u9762\u5fc5\u987b\u52a0\u7a7a\u683c\uff0c\u4e0d\u7136\u76f4\u63a5-1\uff09\u5199\u672c\u5730\u63d0\u4ea4\u7684 commit \u4fe1\u606f\uff0c\u7136\u540e\u5c31\u53ef\u4ee5\u63d0\u4ea4\u4ee3\u7801\u4e86 git review branch(\u5f53\u524d\u5206\u652f) -r origin\n \u6700\u597d\u4e00\u6b21 commit\uff0c\u4e00\u6b21 git review \uff0c\u7ecf\u5e38\u6709\u540c\u5b66\u5728\u672c\u5730\u75af\u72c2 commit \u6700\u540e git review \u62a5\u9519\u4e0d\u77e5\u9053\u548b\u56de\u4e8b\u513f\u3002 \u82e5\u4e0d\u60f3\u6bcf\u6b21\u63d0\u4ea4\u90fd\u52a0\u4e0a -r \u9009\u9879\uff0c\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a git config --global gitreview.remote origin \u63d0\u4ea4\u4ee3\u7801\uff0c\u76f4\u63a5\u4f7f\u7528 git review branch<\u76ee\u6807\u5206\u652f>\uff0c\u4f8b\u5982 git review master"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git","title":"4. Git\u6807\u7b7e","text":"Git \u6807\u7b7e\u5b9e\u9645\u4e0a\u662f commit \u7684\u4e00\u4e2a\u522b\u540d\uff0c\u4e3b\u8981\u7528\u4e8e\u7ba1\u7406\u5386\u53f2\u7248\u672c\u3002 \u60f3\u8c61\u4e00\u4e0b\u9886\u5bfc\u8ba9\u4f60\u628a\u4e4b\u524d\u7684\u67d0\u4e2a\u7248\u672c\u7684\u4ee3\u7801\u62c9\u51fa\u6765\u8dd1\uff0c\u4f60\u662f\u4e0d\u662f\u4e56\u4e56\u7684\u53bb\u628a\u6240\u6709\u63d0\u4ea4\u8bb0\u5f55\u62c9\u51fa\u6765\u627e\uff0c\u7136\u540e\u627e\u5230\u90a3\u4e2a\u54c8\u5e0c\u503c\uff0c\u901a\u8fc7\u54c8\u5e0c\u503c\u6765\u68c0\u51fa\u4ee3\u7801\u3002 \u8fd9\u4e00\u5957\u64cd\u4f5c\u4e0b\u6765\u662f\u4e0d\u662f\u5f88\u9ebb\u70e6\uff0c\u8d39\u65f6\u95f4\u8fd8\u4e0d\u4e00\u5b9a\u80fd\u627e\u5f97\u5230\uff0c\u6ca1\u4eba\u80fd\u8bb0\u4f4f\u6bcf\u4e2a\u63d0\u4ea4\u54c8\u5e0c\u503c\u4ee5\u53ca\u8fd9\u6b21\u63d0\u4ea4\u90fd\u6539\u4e86\u54ea\u4e9b\u4ee3\u7801\u3002 \u56e0\u6b64\u7ed9\u63d0\u4ea4\u6253\u4e2a\u6807\u7b7e\uff0c\u5c31\u662f\u628a\u54c8\u5e0c\u503c\u8f6c\u6362\u6210\u4eba\u7c7b\u80fd\u7406\u89e3\u7684\u8bed\u8a00\uff0c\u6bd4\u5982 v1.0\uff0c\u5c31\u53ef\u4ee5\u76f4\u63a5\u901a\u8fc7\u6807\u7b7e\u627e\u5230\u5bf9\u5e94\u7684\u63d0\u4ea4\u3002 \u65b0\u5efa\u6807\u7b7e git tag -a <tagname>\n \u56de\u8f66\u4e4b\u540e\uff0cGit \u4f1a\u6253\u5f00\u4f60\u7684\u7f16\u8f91\u5668\uff0c\u8ba9\u4f60\u5199\u4e00\u53e5\u6807\u7b7e\u6ce8\u89e3\uff0c\u5c31\u50cf\u4f60\u7ed9\u63d0\u4ea4\u5199\u6ce8\u89e3\u4e00\u6837\u3002 \u67e5\u770b\u6240\u6709\u6807\u7b7e git tag -l\n# git tag \u4e5f\u884c\n \u5220\u9664\u6807\u7b7e git tag -d <tagname>\n \u63a8\u9001\u6807\u7b7e\u81f3\u8fdc\u7a0b git push \u547d\u4ee4\u5e76\u4e0d\u4f1a\u4f20\u9001\u6807\u7b7e\u5230\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\uff0c\u5fc5\u987b\u663e\u5f0f\u5730\u63a8\u9001\u6807\u7b7e\u3002 git push origin <tagname>\n \u63a8\u9001\u6240\u6709\u4e0d\u5728\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\u7684\u6807\u7b7e git push origin --tag\n \u5220\u9664\u8fdc\u7a0b\u6807\u7b7e git push origin :refs/tag/<tagname>\n \u540e\u671f\u6253\u6807\u7b7e \u5148\u7528 git log --pretty=oneline \u67e5\u8be2\u63d0\u4ea4\u8bb0\u5f55\uff0c\u83b7\u53d6\u6821\u9a8c\u7801\u3002 git tag -a <tagname> 9fceb02(\u6821\u9a8c\u7801)\n \u68c0\u51fa\u6807\u7b7e git checkout <tagname>\n \u6b64\u65f6\uff0c\u4ed3\u5e93\u4f1a\u5904\u4e8e\u201c\u5206\u79bb\u5934\u6307\u9488\uff08detached HEAD\uff09\u201d\u7684\u72b6\u6001\u3002 \u5728\u201c\u5206\u79bb\u5934\u6307\u9488\u201d\u72b6\u6001\u4e0b\uff0c\u5982\u679c\u4f60\u505a\u4e86\u67d0\u4e9b\u66f4\u6539\u7136\u540e\u63d0\u4ea4\u5b83\u4eec\uff0c\u6807\u7b7e\u4e0d\u4f1a\u53d1\u751f\u53d8\u5316\uff0c \u4f46\u4f60\u7684\u65b0\u63d0\u4ea4\u5c06\u4e0d\u5c5e\u4e8e\u4efb\u4f55\u5206\u652f\uff0c\u5e76\u4e14\u5c06\u65e0\u6cd5\u8bbf\u95ee\uff0c\u9664\u975e\u901a\u8fc7\u786e\u5207\u7684\u63d0\u4ea4\u54c8\u5e0c\u624d\u80fd\u8bbf\u95ee\u3002 \u56e0\u6b64\uff0c\u5982\u679c\u4f60\u9700\u8981\u8fdb\u884c\u66f4\u6539\uff0c\u6bd4\u5982\u4f60\u8981\u4fee\u590d\u65e7\u7248\u672c\u4e2d\u7684\u9519\u8bef\uff0c\u90a3\u4e48\u901a\u5e38\u9700\u8981\u521b\u5efa\u4e00\u4e2a\u65b0\u5206\u652f\uff1a git checkout -b <NewBranchName> <tagname>\n \u65b0\u5206\u652f\u4e0a\u53ef\u4ee5\u8fdb\u884c\u63d0\u4ea4\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_12","title":"\u5341\u56db\u3001\u5e38\u89c1\u95ee\u9898","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_10","title":"1. \u63d0\u4ea4\u4ee3\u7801\u65f6\u63d0\u793a\u90ae\u7bb1\u6216\u8005\u540d\u79f0\u4e0d\u5bf9","text":"\u91cd\u65b0\u914d\u7f6e\u90ae\u7bb1\u6216\u8005\u540d\u79f0\uff0c\u7136\u540e\u91cd\u7f6e\u751f\u6548\uff1a git commit --amend --reset-author\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_10","title":"2. \u600e\u4e48\u56de\u6eda\u5230\u4e4b\u524d\u7684\u7248\u672c","text":"(1)\u67e5\u8be2\u5386\u53f2\u63d0\u4ea4\u8bb0\u5f55 git log\n \u627e\u5230\u4f60\u8981\u56de\u6eda\u7684\u7248\u672c\uff0c\u590d\u5236 hash \u503c\u3002 \u6ce8\u610f\uff1a\u662f commit \u7a7a\u683c\u4e4b\u540e\u7684 hash \u503c\uff0c\u4e4b\u524d\u6709\u540c\u5b66\u590d\u5236\u7684 Change-Id: \u8fd9\u6837\u80af\u5b9a\u62a5\u9519\u3002 (2)\u56de\u6eda\u7248\u672c\uff0c\u4e0d\u6e05\u9664\u4ee3\u7801 git reset --soft ${hash}\n (3)\u56de\u6eda\u7248\u672c\uff0c\u6e05\u9664\u4ee3\u7801\uff0c\u614e\u7528\u54c8 git reset --hard ${hash}\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-f-s-e","title":"3. \u6d4b\u8bd5\u62a5\u544a\u91cc\u9762 F S . E \u662f\u4ec0\u4e48\u610f\u601d","text":"F \u8868\u793a\u5931\u8d25\uff0c. \uff08\u70b9\uff09\u8868\u793a\u901a\u8fc7\uff0cS \u8868\u793a\u8df3\u8fc7\uff0cE \u8868\u793a error \u6709\u62a5\u9519"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git-status","title":"4. \u89e3\u51b3 git status \u4e2d\u6587\u663e\u793a\u7684\u95ee\u9898","text":"git config --global core.quotePath false\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5-apps","title":"5. apps \u76ee\u5f55\u4e0b\u989c\u8272\u6709\u4e9b\u662f\u9ec4\u8272\u7684","text":"\u5728 Pycharm \u4e2d apps \u76ee\u5f55\u4e0b\u5e94\u7528\u5e93\u6587\u4ef6\u662f\u9ec4\u8272\u7684\uff0c\u7f16\u8f91\u5668\u8bc6\u522b\u4e0d\u5230\u4ee3\u7801\u65b0\u589e\u548c\u4fee\u6539\uff1b \u7531\u4e8e\u793e\u533a\u7248 Pycharm \u4e0d\u80fd\u52a8\u6001\u8bc6\u522b\u591a\u4ed3\u5e93\uff0c\u9700\u8981\u5728 setting \u91cc\u9762\u624b\u52a8\u6ce8\u518c\uff0c\u64cd\u4f5c\u6b65\u9aa4\uff1a File \u2014> Settings \u2014> Version Control \u2014> \u70b9 + \u53f7 \u2014> Directory \u9009\u4e2d\u5e94\u7528\u5e93\u5de5\u7a0b\u76ee\u5f55 \u2014> VCS \u9009\u4e2d Git \u2014> Apply \u5982\u6b64\u5c31\u53ef\u4ee5\u4e86\u3002 \u4e13\u4e1a\u7248 Pycharm \u4e0d\u5b58\u5728\u8fd9\u4e2a\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#6-envsh-r","title":"6. \u6267\u884c env.sh \u62a5\u9519 $'\\r':\u672a\u627e\u5230\u547d\u4ee4","text":"\u51fa\u73b0\u8fd9\u4e2a\u95ee\u9898\u4f60\u5e94\u8be5\u662f\u5728 windows \u4e0a\u6253\u5f00\u6216\u7f16\u8f91\u8fc7 env.sh \u811a\u672c\uff0cwindows\u4e0b\u7684\u6362\u884c\u662f\u56de\u8f66\u7b26+\u6362\u884c\u7b26\uff0c\u4e5f\u5c31\u662f\\r\\n\uff0c\u800c Linxu \u4e0b\u662f\u6362\u884c\u7b26 \\n\uff0cLinux \u4e0b\u4e0d\u8bc6\u522b \\r\uff0c\u56e0\u6b64\u62a5\u9519\u3002 \u89e3\u51b3\u65b9\u6848\uff1a # \u5c06 \\r \u66ff\u6362\u4e3a\u7a7a\nsudo sed -i 's/\\r//' env.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#7","title":"7.\u600e\u6837\u4e3a\u5355\u72ec\u67d0\u4e00\u6761\u7528\u4f8b\u914d\u7f6e\u6267\u884c\u8d85\u65f6\u65f6\u95f4","text":"\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u5982\u4e0b\uff1a @pytest.mark.timeout(300) # \u5355\u4f4d\u79d2\ndef test_xxx_001():\npass\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#8-youqu","title":"8. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u6240\u6709\u4ee3\u7801\uff0c\u5305\u542b\u5b50\u4ed3\u5e93","text":"\u524d\u7f6e\u6761\u4ef6\uff1a\u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 # \u7b2c\u4e00\u6b21\u5b58\u50a8\u5bc6\u7801\uff0c\u63d0\u4f9b\u540e\u9762\u62c9\u4ee3\u7801(gerrit: ldap\u8d26\u53f7\u548c\u5bc6\u7801\uff0cgit\u62c9\u53d6\u7b2c\u4e00\u6b21\u8f93\u5165\u4fdd\u5b58\uff0c\u540e\u9762\u76f4\u63a5\u4f7f\u7528)\ngit config --global credential.helper store\n\n# \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\uff0c\u5e76\u9012\u5f52\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\" --recursive\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#9-youqu","title":"9. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\u6307\u5b9a\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u524d\u7f6e\u6761\u4ef6\uff1a \u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 \u5df2\u5b58\u50a8\u8bbf\u95ee\u5bc6\u7801 # \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\"\n# \u6307\u5b9a\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ncd youqu\ngit submodule update --init apps/autotest_xxx_xxx\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#10-youqu","title":"10. \u5982\u4f55\u66f4\u65b0 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\uff0c\u6240\u6709\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u66f4\u65b0\u6240\u6709\u5b50\u4ed3\u5e93\u4ee3\u7801 cd youqu\ngit pull & git submodule foreach git pull\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#11-youqu-master-detached-head","title":"11. \u5982\u4f55\u4fee\u590d YouQu \u6240\u6709\u5b50\u4ed3\u5e93 master \u5206\u652f\u6e38\u79bb\u5934\uff08detached head\uff09","text":"\u4fee\u590d\u6240\u6709\u5b50\u4ed3\u5e93\u9ed8\u8ba4master \u5206\u652f\u6e38\u79bb\u5934 cd youqu\ngit submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/","title":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212 \u5206\u7c7b\uff1a/ \u67b6\u6784\u5e08\uff1a/ \u76ee\u6807\uff1a \u5e94\u7528 AT \u67b6\u6784\u5de5\u7a0b\u5316\uff0c\u53c2\u8003\u6027\u80fd\u81ea\u52a8\u5316\u5de5\u7a0b\u5b8c\u6210\u5de5\u7a0b\u5316\u6539\u9020\u3002 \u5e94\u7528\u95f4\u7528\u4f8b\u89e3\u8026\uff0c\u89e3\u9664\u6240\u6709\u4ea4\u53c9\u8c03\u7528\u7684\u65b9\u6cd5\uff0c\u5404\u5e94\u7528\u80fd\u8ddf\u968f\u81ea\u8eab\u8fed\u4ee3\u5468\u671f\u72ec\u7acb\u7ef4\u62a4 AT \u7528\u4f8b\u3002 \u5b8c\u6210\u516c\u5171\u65b9\u6cd5\u7684\u62bd\u53d6\u6574\u5408\uff0c\u5f62\u6210\u4e00\u5957\u72ec\u7acb\u4e8e\u5e94\u7528\u95f4\u7684\u516c\u5171\u65b9\u6cd5\u5e93\uff0c\u5404\u5e94\u7528\u65b9\u6cd5\u91cc\u9762\u4e0d\u5b58\u5728\u88ab\u591a\u4e2a\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\u3002 \u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u4e3a\u5c06\u6765\u9002\u914d\u66f4\u591a\u7684 AT \u8fd0\u7528\u573a\u666f\u63d0\u4f9b\u652f\u6491\uff0c\u539f\u5219\u4e0a\u53ef\u5b9e\u73b0\u65e0\u9650\u6269\u5c55\uff0c\u5728\u6bcf\u65e5\u6784\u5efa\u548c\u6301\u7eed\u96c6\u6210\u6d41\u7a0b\u843d\u5730\u4f7f\u7528\u3002 \u4ee3\u7801\u89c4\u8303\u95ee\u9898\u6e05\u96f6\uff0c\u7b26\u5408 Shell Check\u3001Pylint\u3001\u7cfb\u7edf\u90e8\u76f8\u5173\u7f16\u7801\u89c4\u8303\u8981\u6c42\u3002 \u610f\u4e49\uff1a \u7edf\u4e00\u6210\u7814 AT \u67b6\u6784\u8bbe\u8ba1\u601d\u8def\uff0c\u6d88\u9664 AT \u4ee3\u7801\u5b9e\u73b0\u548c\u7ef4\u62a4\u4e0a\u53ef\u80fd\u51fa\u73b0\u7684\u5206\u6b67\uff0c\u6539\u5584\u5386\u53f2 AT \u65e0\u5de5\u7a0b\u5316\u8bbe\u8ba1\u7684\u7f3a\u9677\uff0c\u63d0\u9ad8\u67b6\u6784\u4e13\u4e1a\u6027\u3002 \u5404\u5e94\u7528 AT \u4ee3\u7801\u76f8\u4e92\u72ec\u7acb\uff0c\u5951\u5408\u5e94\u7528\u72ec\u7acb\u53d1\u5e03\u7279\u6027\uff0c\u53ef\u652f\u6301\u8fed\u4ee3\u671f\u95f4\u72ec\u7acb\u65b0\u589e\u3001\u7ef4\u62a4\u548c\u6267\u884c\u3002 \u65b9\u6cd5\u8c03\u7528\u903b\u8f91\u5f97\u5230\u7b80\u5316\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u66f4\u9ad8\u6548\uff1b\u516c\u5171\u5e93\u62bd\u53d6\uff0c\u51cf\u5c11\u65b9\u6cd5\u91cd\u590d\u7f16\u5199\uff0c\u63d0\u9ad8\u4ee3\u7801\u5229\u7528\u7387\uff1b\u5e73\u5747\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u4ece40\u5206\u949f\u964d\u4f4e\u81f330\u5206\u949f\uff0c\u65e5\u4ea7\u51fa\u7528\u4f8b\u4ece12\u6761/\u5929\u63d0\u5347\u81f316\u6761/\u5929\u3002 \u53ef\u7075\u6d3b\u652f\u6491\u4e0d\u540c\u7684\u81ea\u52a8\u5316\u8fd0\u7528\u573a\u666f\uff0c\u5982 CI\u3001\u5192\u70df\u6d4b\u8bd5\u3001\u96c6\u6210\u6d4b\u8bd5\u3001\u56de\u5f52\u6d4b\u8bd5\u3001\u4e13\u9879\u6d4b\u8bd5\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_2","title":"\u4e00\u3001\u80cc\u666f\u4ecb\u7ecd","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1","title":"1\u3001\u73b0\u6709\u67b6\u6784\u4ecb\u7ecd","text":"\u73b0\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u6574\u4f53\u5206\u4e3a\u4e09\u5c42\uff1a\u7528\u4f8b\u5c42\uff08\u4e1a\u52a1\u903b\u8f91\u5c42\uff09\u3001\u4e2d\u95f4\u5c42\uff08\u5143\u7d20\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff09\u3001\u6838\u5fc3\u5c42\uff08\u5e95\u5c42\u529f\u80fd\u5e93\u5c42\uff09\u3002 \u7528\u4f8b\u5c42\uff1a\u5373\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4e13\u6ce8\u4e8e\u4e1a\u52a1\u529f\u80fd\u903b\u8f91\uff0c\u4e0d\u5173\u5fc3\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\uff1b \u4e2d\u95f4\u5c42\uff1a\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff0c\u6bcf\u4e2a\u65b9\u6cd5\u5747\u5bf9\u5e94\u4e00\u4e2a\u5143\u7d20\u7684\u4e00\u4e2a\u5177\u4f53\u64cd\u4f5c\uff0c\u4e5f\u53ef\u4ee5\u662f\u591a\u4e2a\u64cd\u4f5c\u7684\u7ec4\u5408\u64cd\u4f5c\uff0c\u4e2d\u95f4\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u7528\u4f8b\u5c42\uff0c\u5177\u6709\u53ef\u6269\u5c55\u6027\u548c\u590d\u7528\u6027\uff1b \u6838\u5fc3\u5c42\uff1a\u4e3b\u8981\u5c01\u88c5\u7684\u5e95\u5c42\u529f\u80fd\u5b9e\u73b0\uff0c\u6b64\u5c42\u5728\u6846\u67b6\u4e2d\u63d0\u4f9b\u4e00\u4e9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u529f\u80fd\u6a21\u5757\u76f8\u5bf9\u72ec\u7acb\uff0c\u6838\u5fc3\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u64cd\u4f5c\u5c42\uff0c\u6bd4\u5982\uff1a\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7 UI \u5750\u6807\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u952e\u9f20\u64cd\u4f5c\u7684\u57fa\u7840\u65b9\u64cd\u4f5c\u6a21\u5757\u3001Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757\u3001\u6587\u4ef6\u7684\u589e\u5220\u6539\u67e5\u64cd\u4f5c\u6a21\u5757\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2","title":"2\u3001\u81ea\u52a8\u5316\u7684\u5e94\u7528","text":"2.1\u3001CI \u6d41\u7a0b \u6bcf\u65e5\u6784\u5efa\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u7814\u53d1\u6bcf\u65e5\u63d0\u4ea4\u7684\u4ee3\u7801\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u73ed\u4e4b\u540e\u4f1a\u5c06\u5404\u5e94\u7528\u8fdb\u884c\u6253\u5305\uff0c\u7136\u540e\u5728\u6d4b\u8bd5\u673a\u4e0a\u5b89\u88c5\u66f4\u65b0 deb \u5305\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u5e94\u7528\u63d0\u4ea4\u96c6\u6210\u7684\u7248\u672c\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u8f7d\u6700\u65b0\u7684 ISO \u8fdb\u884c PXE \u90e8\u7f72\uff0c\u7136\u540e\u6d4b\u8bd5\u673a\u5b89\u88c5\u6700\u65b0\u7684\u955c\u50cf\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 2.2\u3001\u9a8c\u6536\u6d4b\u8bd5 \u5728\u5404\u9a8c\u6536\u8282\u70b9\u8fdb\u884c\u81ea\u52a8\u5316\u9a8c\u6536\uff0c\u76ee\u524d\u7684\u7b56\u7565\u662f\u5168\u7528\u4f8b\u8986\u76d6\u5168\u67b6\u6784\u3002 2.3\u3001\u56de\u5f52\u6d4b\u8bd5 \u56de\u5f52\u6d4b\u8bd5\u4eca\u5e74\u89c4\u5212\u5efa\u8bbe\u4e2d\uff0c\u65e8\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u6267\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\uff0c\u51cf\u5c11\u529f\u80fd\u6d4b\u8bd5\u7684\u91cd\u590d\u52b3\u52a8\u529b\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3","title":"3\u3001\u5b58\u5728\u7684\u95ee\u9898","text":" \u5404\u5e94\u7528\u4e4b\u95f4\u5b58\u5728\u8026\u5408 \u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u521d\u671f\uff0c\u6240\u6709\u5e94\u7528\u662f\u6574\u4f53\u53d1\u5e03\uff0c\u6211\u4eec\u662f\u5c06\u6240\u6709\u5e94\u7528\u770b\u6210\u662f\u4e00\u4e2a\u6574\u4f53\uff0c\u5404\u5e94\u7528\u4f5c\u4e3a\u5176\u4e2d\u7684\u4e00\u4e2a\u6a21\u5757\uff0c\u6240\u4ee5\u5b58\u5728\u5e94\u7528\u95f4\u65b9\u6cd5\u4ea4\u53c9\u8c03\u7528\u7684\u95ee\u9898\uff0c\u8fd9\u6837\u4ece\u6700\u521d\u7684\u8bbe\u8ba1\u6765\u8bb2\u786e\u5b9e\u80fd\u591f\u51cf\u5c11\u91cd\u590d\u4ee3\u7801\u7684\u7f16\u5199\u3002\u4f46\u662f\u73b0\u5728\u5e94\u7528\u8d70\u72ec\u7acb\u53d1\u5e03\uff0c\u5404\u5e94\u7528\u90fd\u6709\u81ea\u5df1\u7684\u8fed\u4ee3\u8282\u594f\uff0c\u5728\u65b0\u9700\u6c42\u5feb\u901f\u53d8\u5316\u7684\u8fc7\u7a0b\u4e2d\uff0c\u81ea\u52a8\u5316\u7ef4\u62a4\u53d8\u5f97\u5f02\u5e38\u56f0\u96be\uff0c\u539f\u56e0\u5c31\u662f\u81ea\u52a8\u5316\u9879\u76ee\u91cc\u9762\u5404\u4e2a\u5e94\u7528\u7684\u6709\u6bd4\u8f83\u591a\u7684\u8026\u5408\u5173\u7cfb\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u8fdb\u884c\u89e3\u8026\uff0c\u4ee5\u9002\u5e94\u5e94\u7528\u4e0d\u540c\u7684\u8fed\u4ee3\u5468\u671f\u3002 \u65e0\u6cd5\u7cbe\u51c6\u7684\u5212\u5206\u7528\u4f8b\u8303\u56f4 \u7528\u4f8b\u6267\u884c\u7684\u8303\u56f4\u4e0d\u591f\u7cbe\u51c6\uff0c\u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u4e3b\u8981\u901a\u8fc7\u7528\u4f8b\u7684\u5173\u952e\u8bcd core\uff08\u6838\u5fc3\uff09\u6765\u533a\u5206\u7528\u4f8b\u662f\u5426\u4e3a\u6838\u5fc3\u7528\u4f8b\uff0c\u4f46\u662f\u8fd9\u6837\u7684\u533a\u5206\u592a\u5bbd\u6cdb\u4e86\uff0c\u4e0d\u80fd\u9002\u5e94\u81ea\u52a8\u5316\u6d4b\u8bd5\u5728\u591a\u573a\u666f\u4e0b\u7684\u5e94\u7528\u3002\u5f88\u591a\u573a\u666f\u4e0b\u6211\u4eec\u8fd8\u9700\u8981\u6839\u636e\u7528\u4f8b\u7684\u7b49\u7ea7\u3001\u7528\u4f8b\u7684\u7c7b\u578b\u3001\u7528\u4f8b\u6765\u6e90\u7b49\u7b49\uff0c\u4e0d\u540c\u7684\u7ef4\u5ea6\u6765\u6311\u9009\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u5173\u952e\u5b57\u9700\u8981\u4eba\u5de5\u4e00\u6761\u6761\u7684\u6539\uff0c\u8d39\u65f6\u8d39\u529b\uff0c\u800c\u4e14\u4e0d\u597d\u7ef4\u62a4\u3002 \u53d7\u65b0\u9700\u6c42\u5f71\u54cd\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u597d\u7ef4\u62a4 \u76ee\u524d\u9700\u8981\u8df3\u8fc7\u7684\u7528\u4f8b\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684\u7528\u4f8b\u811a\u672c\u91cc\u9762\uff0c\u6dfb\u52a0\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\uff0c\u540e\u7eed\u89e3\u9664\u8df3\u8fc7\u7684\u65f6\u5019\u53c8\u9700\u8981\u627e\u5230\u8fd9\u6761\u811a\u672c\uff0c\u5220\u6389\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\u3002\u5728\u8df3\u8fc7\u7528\u4f8b\u8f83\u591a\u7684\u60c5\u51b5\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u96be\u5ea6\u3002 \u7f16\u5199\u7528\u4f8b\u65f6\u903b\u8f91\u6bd4\u8f83\u590d\u6742\uff0c\u9700\u8981\u8c03\u7528\u591a\u4e2a\u5e94\u7528\u7684\u65b9\u6cd5\u6a21\u5757\u3002 \u6846\u67b6\u6269\u5c55\u6027\u4e0d\u8db3\uff0c\u65e0\u6cd5\u6574\u5408\u6027\u80fd\u81ea\u52a8\u5316\u3001\u538b\u6d4b\u81ea\u52a8\u5316\u3001\u5b89\u5168\u81ea\u52a8\u5316\u7b49\u4e13\u9879\u6d4b\u8bd5\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_3","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u4e3a\u89e3\u51b3\u73b0\u6709\u95ee\u9898\uff0c\u9002\u5e94\u4e0d\u65ad\u4e30\u5bcc\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u66f4\u597d\u7684\u53d1\u6325\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4f5c\u7528\uff0c\u9700\u8981\u5bf9\u81ea\u52a8\u5316\u67b6\u6784\u53ca\u5404\u529f\u80fd\u6a21\u5757\u8fdb\u884c\u91cd\u65b0\u8bbe\u8ba1\u89c4\u5212\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_1","title":"1\u3001\u67b6\u6784\u8bbe\u8ba1","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_1","title":"2\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u6846\u67b6\u7684\u8fd0\u884c\u903b\u8f91\uff1a\u901a\u8fc7\u6838\u5fc3\u5c42\u63d0\u4f9b\u4e00\u4e2a\u57fa\u7840\u80fd\u529b\uff0c\u4e1a\u52a1\u5c42\u6839\u636e\u5b9e\u9645\u4e1a\u52a1\u9700\u6c42\uff08\u6d4b\u8bd5\u7528\u4f8b\uff09\u52a8\u6001\u52a0\u8f7d\u6838\u5fc3\u5c42\uff0c\u6267\u884c\u5165\u53e3\u52a0\u8f7d\u76f8\u5e94\u7684\u7528\u4f8b\u96c6\u5e76\u63a7\u5236\u6267\u884c\uff0c\u5e94\u7528\u5c42\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u9700\u6c42\uff0c\u901a\u8fc7\u76f8\u5e94\u7684\u914d\u7f6e\u9879\u8fdb\u884c\u914d\u7f6e\uff0c\u4ece\u800c\u89e6\u53d1\u81ea\u52a8\u5316\u6d4b\u8bd5\u4efb\u52a1\u3002 \u6838\u5fc3\u5c42\uff1a\u57fa\u672c\u4fdd\u6301\u4e0d\u53d8\uff0c\u90e8\u5206\u6a21\u5757\u4f1a\u6d89\u53ca\u5230\u65b0\u529f\u80fd\u5f00\u53d1\uff0c\u6838\u5fc3\u5c42\u5404\u529f\u80fd\u6a21\u5757\u4fdd\u6301\u72ec\u7acb\u6027\uff0c\u63d0\u4f9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u4f9b\u4e0a\u5c42\u8c03\u7528\uff1b \u5e95\u5c42\u6838\u5fc3\u6a21\u5757\u5305\u62ec\uff1a \u56fe\u50cf\u8bc6\u522b\u6a21\u5757 UI \u5b9a\u4f4d\u6a21\u5757 Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757 \u5c5e\u6027\u5b9a\u4f4d\u6a21\u5757 \u65e5\u5fd7\u6a21\u5757 \u952e\u9f20\u64cd\u4f5c\u6a21\u5757 \u6587\u4ef6\u64cd\u4f5c\u6a21\u5757 \u5f55\u5c4f\u6a21\u5757 \u81ea\u5b9a\u4e49\u65ad\u8a00\u6a21\u5757 \u7528\u4f8b\u6267\u884c\u6a21\u5757 PXE \u88c5\u673a\u6a21\u5757 \u952e\u9f20\u4fe1\u53f7\u6a21\u62df\u6a21\u5757 OCR \u6a21\u5757 \u4e1a\u52a1\u5c42\uff1a\u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e94\u7528\u5185\u5305\u542b\u591a\u4e2a\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5982\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7b49\uff0c\u540e\u7eed\u53ef\u4ee5\u6839\u636e\u9700\u8981\u5ac1\u63a5\u8fdb\u6765\u3002\u5176\u4e2d\u529f\u80fd\u6d4b\u8bd5\u8bbe\u8ba1\u601d\u8def\uff1a \u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e76\u5c06\u6d4b\u8bd5\u6570\u636e\u548c\u6d4b\u8bd5\u8d44\u6e90\u6574\u5408\u8fdb\u6765\uff0c\u589e\u52a0\u7528\u4f8b\u6807\u7b7e csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ed9\u6bcf\u6761\u7528\u4f8b\u6253\u6807\u7b7e\u3002 \u5404\u6807\u7b7e\u6240\u4f7f\u7528\u5bf9\u5e94\u7684\u5b57\u6bb5\u540d\u79f0\uff0c\u4f7f\u7528 csv \u6587\u4ef6\u7ef4\u62a4\u7528\u4f8b\u4e0e\u6807\u7b7e\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u5bf9\u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u53ef\u4ee5\u7ec4\u5408\u5176\u4e2d\u7684\u6807\u7b7e\u800c\u4ece\u9a71\u52a8\u5bf9\u5e94\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\uff0c\u517c\u5bb9\u73b0\u6709\u7528\u4f8b\u6807\u7b7e\uff0c\u4e14\u652f\u6301\u7528\u4f8b\u6807\u7b7e\u53ef\u6269\u5c55\uff1b \u4f7f\u7528 csv \u683c\u5f0f\u6587\u4ef6\u53ef\u4ee5\u65b9\u4fbf\u7684\u4f7f\u7528 Excel \u8868\u683c\u6253\u5f00\u8fdb\u884c\u7f16\u8f91\uff0c\u540c\u65f6\u7531\u4e8e csv \u6587\u4ef6\u5b9e\u9645\u662f\u4ee5\u90fd\u597d\u5206\u9694\u7684\u6587\u672c\u6587\u4ef6\uff0c\u4ee3\u7801\u4e2d\u53ef\u4ee5\u5728\u4e0d\u4f9d\u8d56\u4e09\u65b9\u5e93\u7684\u60c5\u51b5\u4e0b\u65b9\u4fbf\u5feb\u901f\u7684\u89e3\u6790\u5b83\uff0c\u53ef\u64cd\u4f5c\u6027\u548c\u53ef\u7ef4\u62a4\u6027\u8f83\u9ad8\u3002 \u5404\u4e2a\u5e94\u7528\u4e4b\u95f4\uff0c\u7528\u4f8b\u3001\u65b9\u6cd5\u3001\u6807\u7b7e\u548c\u8d44\u6e90\u90fd\u662f\u76f8\u4e92\u72ec\u7acb\u7684\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u7528\u4f8b\u65f6\u53ea\u9700\u8981\u81ea\u5df1\u5e94\u7528\u4e0b\u7684\u65b9\u6cd5\u548c\u516c\u5171\u5e93\u5373\u53ef\u3002 \u7ed3\u6784\u4e3e\u4f8b\uff1a .\n\u251c\u2500\u2500 apps\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_album # \u5e94\u7528\u540d (\u7528\u4e0b\u5212\u7ebf\u8fde\u63a5\u662f Python \u7f16\u7801\u89c4\u8303)\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_assert # \u65ad\u8a00\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_function_tag.csv # \u7528\u4f8b\u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 asan_cases # \u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases # \u529f\u80fd\u6d4b\u8bd5\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 res # \u6d4b\u8bd5\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config # \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_widget # \u5e94\u7528\u81ea\u5df1\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_widget # \u65b9\u6cd5\u57fa\u7c7b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 other_widget # \u8c03\u7528\u5176\u4ed6\u5e94\u7528\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_camera\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases\n\u2502\u00a0\u00a0 \u2502\u00a0 ...\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 public_widget # \u516c\u5171\u65b9\u6cd5\u5e93\n\u251c\u2500\u2500 config # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n...\n config \u914d\u7f6e\u6a21\u5757\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u76f8\u5e94\u914d\u7f6e\uff0c\u6d4b\u8bd5\u540c\u5b66\u53ef\u4ee5\u6839\u636e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5728 config \u91cc\u9762\u8fdb\u884c\u914d\u7f6e\u3002 \u5168\u5c40\u914d\u7f6e\uff1a \u6267\u884c\u4e00\u4e2a\u6216\u591a\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff1a\u5728 pattern \u91cc\u9762\u5199\u5165\u5e94\u7528\u5305\u540d\uff0c\u591a\u4e2a\u5e94\u7528\u4e4b\u95f4\u7528 or \u8fde\u63a5\uff0c\u5982 deepin-music or deepin-movie\uff1b \u5192\u70df\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a smoke\uff1b \u96c6\u6210\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a core \uff1b \u5168\u91cf\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u4e3a\u7a7a\u5373\u53ef\uff1b \u901a\u8fc7 tags \u7684\u914d\u7f6e\u6bd4\u8f83\u7075\u6d3b\uff0c\u540e\u9762\u6807\u7b7e\u5316\u7ba1\u7406\u7ae0\u8282\u4f1a\u8bb2\u5230\uff0c\u652f\u6301\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u7075\u6d3b\u914d\u7f6e\u3002 \u6307\u5b9a\u67d0\u53f0\u673a\u5668\u5728\u6307\u5b9a\u955c\u50cf\u7248\u672c\u4e0a\u6267\u884c\u7528\u4f8b\uff1a\u5728 IP \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a IP\uff0c\u5e76\u5728 URL \u91cc\u9762\u586b\u5165\u955c\u50cf\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u6846\u67b6\u4f1a\u8c03\u7528 PXE \u8fdb\u884c\u81ea\u52a8\u88c5\u673a\uff0c\u88c5\u673a\u5b8c\u4e4b\u540e\u81ea\u52a8\u5f00\u59cb\u6267\u884c\u914d\u7f6e\u7684\u6d4b\u8bd5\u7528\u4f8b\u3002 \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\uff1a \u6bcf\u4e2a\u5e94\u7528\u5185\u90e8\u4f1a\u6709\u4e00\u4e2a\u5355\u72ec\u7684\u914d\u7f6e\u6a21\u5757\uff0c\u4f1a\u5305\u542b\u4e00\u4e9b\u672c\u5e94\u7528\u7684\u6d4b\u8bd5\u8d44\u6e90\u7684\u8def\u5f84\u3001\u6267\u884c\u7528\u4f8b\u7684\u6807\u7b7e\u914d\u7f6e\u7b49\u7b49\uff0c\u5982\u679c\u5728\u5c40\u90e8\u914d\u7f6e\u91cc\u9762\u914d\u7f6e\u4e86\u7528\u4f8b\u6267\u884c\u6807\u7b7e\uff0c\u800c\u5916\u5c42 runner \u51fa\u6ca1\u6709\u6307\u5b9a\u6267\u884c\u6807\u7b7e\uff0c\u5219\u5728\u6267\u884c\u65f6\u53ea\u4f1a\u6267\u884c\u5c40\u90e8\u914d\u7f6e\u5df2\u914d\u7f6e\u7684\uff0c\u82e5\u5916\u5c42 runner \u4e5f\u914d\u7f6e\u4e86\u6267\u884c\u6807\u7b7e\uff0c\u5219\u4f1a\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u7528\u4f8b\u3002 \u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u914d\u7f6e\u90fd\u5728\u540c\u4e00\u4e2a\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\uff0cpy \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684\u7c7b\uff0cini \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684 option\u3002 \u5168\u5c40\u914d\u7f6e\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u7b56\u7565\u5982\u4e0b\uff1a \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5c40\u90e8\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5e94\u7528\u5c42\uff1arunner \u662f\u6d4b\u8bd5\u6267\u884c\u7684\u5165\u53e3\uff0c\u5b83\u4f1a\u6839\u636e\u914d\u7f6e\u91cc\u9762\u7684\u914d\u7f6e\u9879\uff0c\u8fdb\u884c\u7528\u4f8b\u7684\u52a0\u8f7d\u548c\u6267\u884c\u3002\u5b83\u63d0\u4f9b\u63a5\u53e3\u7ed9\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\uff0c\u5e73\u53f0\u4e0a\u7684\u6307\u4ee4\u5b9e\u9645\u4e0a\u90fd\u662f\u901a\u8fc7\u4e0b\u53d1\u7ed9 runner\uff0c\u7136\u540e\u7531 runner \u6765\u6267\u884c\u76f8\u5e94\u7684\u6d4b\u8bd5\u3002 \u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u662f\u4e00\u4e2a\u524d\u7aef\u7cfb\u7edf\uff0c\u53ef\u4ee5\u8fdb\u884c\u6d4b\u8bd5\u673a\u7ba1\u7406\u3001\u81ea\u52a8\u5b89\u88c5\u955c\u50cf\u3001\u81ea\u52a8\u5b89\u88c5\u6307\u5b9a\u5e94\u7528\u7248\u672c\u3001\u8fdb\u884c\u6d4b\u8bd5\u7528\u4f8b\u8303\u56f4\u9009\u62e9\u3001\u7528\u4f8b\u89e6\u53d1\u6267\u884c\u63a7\u5236\u3001\u7ed3\u679c\u5c55\u793a\u8f93\u51fa\u7b49\u3002 \u4e00\u4e2a\u5e94\u7528\u7684\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\u90fd\u53ef\u4ee5\u5355\u72ec\u89e6\u53d1\u3002 \u517c\u5bb9\u6027\u6d4b\u8bd5\u4e3b\u8981\u901a\u8fc7 PXE \u670d\u52a1\u5668\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u88c5\u673a\uff0c\u7136\u540e\u914d\u5408 AT \u8fdb\u884c\u6d4b\u8bd5\uff0c\u53ef\u4ee5\u5b9e\u73b0\u4e0d\u540c\u7cfb\u7edf\u7248\u672c\u3001\u4e0d\u540c\u5e94\u7528\u7248\u672c\u73af\u5883\u4e0a\u90fd\u53ef\u4ee5\u8fdb\u884c\u81ea\u52a8\u5316\u7684 AT \u6267\u884c\uff0c\u63d0\u9ad8\u517c\u5bb9\u6027\u6d4b\u8bd5\u6548\u7387\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_4","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_2","title":"1\u3001\u7528\u4f8b\u89e3\u8026","text":"\u5b58\u5728\u8026\u5408\u5173\u7cfb\u7684\u65b9\u6cd5\uff1a\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u88ab\u5916\u90e8\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\uff0c\u5219\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u8026\u5408\u5173\u7cfb\u3002 1.1\u3001\u901a\u8fc7\u7f16\u8f91\u5668 Find Usages \u67e5\u770b\u6bcf\u4e2a\u65b9\u6cd5\u88ab\u8c03\u7528\u7684\u8def\u5f84\u548c\u88ab\u8c03\u7528\u6b21\u6570\uff1b 1.2\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 1 \u4e2a\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728\u5916\u90e8\u5e94\u7528\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1b 1.3\u3001\u64cd\u4f5c\u5c42\u6587\u4ef6\u540d\u5747\u4ee5 widget \u7ed3\u5c3e\uff0c\u7c7b\u540d\u4ee5 Widget \u7ed3\u5c3e\uff0c\u5982\uff1a\u6587\u4ef6\u540d music_widget.py \uff1a class MusicWidget:\n\"\"\"\u97f3\u4e50\u7684\u64cd\u4f5c\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_2","title":"2\u3001\u516c\u5171\u5e93\u5efa\u8bbe","text":"2.1\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 2 \u4e2a\u53ca\u4ee5\u4e0a\u7684\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728 public_widget \u76ee\u5f55\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1bpublic_widget \u5373\u4e3a\u516c\u5171\u65b9\u6cd5\u5e93\uff1b 2.2\u3001\u5728\u7528\u4f8b\u5c42\u4fee\u6539\u7528\u4f8b\u4e2d\u7c7b\u7684\u5bfc\u5165\u8def\u5f84\uff0c\u5c5e\u4e8e\u516c\u5171\u65b9\u6cd5\u7684\u5219\u8c03\u7528 public_widget \u4e2d\u7684\u7c7b\uff0c\u5916\u90e8\u5e94\u7528\u7684\u64cd\u4f5c\u65b9\u6cd5\uff0c\u5219\u8c03\u7528\u672c\u5e94\u7528\u76ee\u5f55\u4e0b\u91cd\u5199\u7684\u5916\u90e8\u5e94\u7528\u65b9\u6cd5\u3002 \u6bd4\u5982\uff1a\u51e0\u4e4e\u6240\u6709\u591a\u5a92\u4f53\u5e94\u7528\u90fd\u9700\u8981\u901a\u8fc7\u6587\u7ba1\u52a0\u8f7d\u8d44\u6e90\uff0c\u8c03\u8d77\u7684\u6587\u7ba1\u5bf9\u8bdd\u6846\u5b9e\u9645\u4e3a dde-desktop\uff0c\u56e0\u6b64\u5c06 desktop_widget.py \u653e\u5230 public_widget \u91cc\u9762\uff1a class DdeDesktopPublicWidget:\n\"\"\"\u516c\u5171-\u684c\u9762\u7684\u64cd\u4f5c\u65b9\u6cd5\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3_1","title":"3\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406","text":"3.1\u3001\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1a\u5bf9\u5e94 core\u3001smoke\uff0c\u6216\u4e3a\u7a7a\uff1b \u7528\u4f8b\u6765\u6e90\uff1a\u5bf9\u5e94 PMS \u7528\u4f8b\u6765\u6e90\uff0c\u5206\u522b\u7528 acp1\u3001acp2\u3001acp3\u3001acp4 \u8868\u793a\u3002 acp1 \uff1a\u4e1a\u52a1\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5199\u7684\u7528\u4f8b\uff0c\u88ab\u7528\u4e8e\u9a8c\u6536\u6d4b\u8bd5\u7684\uff1b acp2 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5f15\u5165\u7684\u4ea7\u54c1\u9a8c\u6536\u6d4b\u8bc4\u90e8\u7684\u7528\u4f8b\uff1b acp3 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u6839\u636e\u4ea7\u54c1\u9700\u6c42\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\uff1b acp4 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u901a\u8fc7\u793e\u533a\u3001\u8bba\u575b\u7528\u6237\u53cd\u9988\u95ee\u9898\u603b\u7ed3\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\u3002 \u4e3e\u4f8b\uff1a \u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u7528\u4f8b\u6765\u6e90 001 L1 core acp1 \u6807\u7b7e\u91c7\u7528\u679a\u4e3e\u7684\u65b9\u5f0f\u8fdb\u884c\u4ee3\u53f7\u7ba1\u7406\u65b9\u4fbf\u7ba1\u7406\u4ee5\u53ca\u540e\u7eed\u6269\u5c55\u3002 3.2\u3001\u5728\u6bcf\u4e2a\u5e94\u7528\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u7b2c\u4e00\u5217\u4e3a\u7528\u4f8b\u7684 ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ba1\u7406\u6a21\u5757\u5185\u7684\u7528\u4f8b\u6807\u7b7e\u3002\u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 3.3\u3001\u5bf9\u7167 PMS \u4e0a\u7528\u4f8b\u7b49\u7ea7\u3001\u7528\u4f8b\u7c7b\u578b\u548c\u7528\u4f8b\u6765\u6e90\uff0c\u6807\u8bb0\u6240\u6709\u5df2\u5b9e\u73b0\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u540e\u7eed\u7f16\u5199\u65b0\u589e\u81ea\u52a8\u5316\u7528\u4f8b\u65f6\uff0c\u6bcf\u5199\u4e00\u6761\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684 csv \u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u6b64\u6761\u7528\u4f8b\u7684\u6807\u7b7e\u3002 3.4\u3001\u8df3\u8fc7\u7528\u4f8b\u6807\u7b7e\u5316 \u73b0\u6709\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a\uff1a \u4e3e\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u8bb0\u4e3a \u201cskip-\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u8bb0\uff0c\u5982\u679c\u5df2\u7ecf\u6807\u8bb0\u4e86\u8df3\u8fc7\u539f\u56e0\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u8bb0\u4e3a SKIPED\uff0c\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\u3002 \u6240\u6709\u7684\u6807\u7b7e\u5728 docs \u76ee\u5f55\u4e0b\u4f1a\u6709\u4e00\u4e2a\u6587\u6863\uff0c\u6587\u6863\u6682\u5b9a\u540d\u79f0\u4e3a\uff1atags_info.md\uff0c\u7528\u4e8e\u8bf4\u660e\u73b0\u5728\u5df2\u7ecf\u4f7f\u7528\u5230\u7684\u6807\u7b7e\uff0c\u4ee5\u53ca\u8fd9\u4e9b\u6807\u7b7e\u7684\u89e3\u91ca\u548c\u7528\u6cd5\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#4","title":"4\u3001\u7528\u4f8b\u6267\u884c","text":"4.1\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u7684\u9a71\u52a8\u6267\u884c\u903b\u8f91\u529f\u80fd\u5b9e\u73b0 \u5f00\u53d1\u6839\u636e\u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\u91cc\u9762\u7684\u7528\u4f8b\u6807\u7b7e\u6267\u884c\u5bf9\u5e94\u7528\u4f8b\u7684\u529f\u80fd\uff0c\u80fd\u652f\u6301\u591a\u4e2a\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u6267\u884c\u5165\u53e3\u80fd\u968f\u610f\u901a\u8fc7\u7528\u4f8b\u6807\u7b7e\u6307\u5b9a\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002 \u7528\u4f8b\u6807\u7b7e\u7684\u9a71\u52a8\u65b9\u5f0f\u5fc5\u987b\u80fd\u652f\u6301\u6807\u7b7e\u7684\u6269\u5c55\uff0c\u672a\u6765\u968f\u7740\u4e1a\u52a1\u7684\u53d8\u5316\u53ef\u80fd\u9700\u8981\u589e\u52a0\u5404\u79cd\u5404\u6837\u7684\u6807\u7b7e\u3002 4.2\u3001\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u6267\u884c \u529f\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u3001\u6027\u80fd\u6d4b\u8bd5\u7b49\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u662f\u5206\u5f00\u6267\u884c\u7684\uff0c\u4e5f\u5c31\u662f\u5728\u4e00\u6b21\u6267\u884c\u4e2d\uff0c\u53ea\u80fd\u6267\u884c\u5176\u4e2d\u4e00\u79cd\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5177\u4f53\u8981\u6267\u884c\u54ea\u4e00\u79cd\u540c\u6837\u901a\u8fc7\u53c2\u6570\u6765\u63a7\u5236\u3002 4.3\u3001\u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c \u7531\u4e8e\u6d4b\u8bd5\u673a\u8d44\u6e90\u6709\u9650\uff0c\u968f\u7740\u81ea\u52a8\u5316\u7528\u4f8b\u6570\u91cf\u7684\u589e\u52a0\uff0cCI \u6267\u884c\u65f6\u95f4\u4f1a\u8d8a\u6765\u8d8a\u957f\u3002 \u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c\u7684\u529f\u80fd\uff1a \u540c\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\u5206\u6563\u5230\u4e0d\u540c\u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u4e0a\u6267\u884c\uff0c\u7f29\u77ed\u6267\u884c\u603b\u65f6\u95f4\uff1b \u7b2c\u4e8c\u5929\u8dd1\u7684\u65f6\u5019\u540c\u4e00\u4e2a\u673a\u5668\u4e0a\u4f1a\u6267\u884c\u6628\u5929\u6ca1\u6709\u6267\u884c\u5230\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u6267\u884c\u540c\u7406\uff1b \u53ef\u4ee5\u5b9e\u73b0\u5728\u5168\u67b6\u6784\u6d4b\u8bd5\u673a\u4e0a\u8f6e\u6d41\u6267\u884c\u7528\u4f8b\uff0c\u65e2\u80fd\u4fdd\u8bc1\u6267\u884c\u4e86\u6240\u6709\u7684\u7528\u4f8b\uff0c\u53c8\u80fd\u5728\u8d44\u6e90\u6709\u9650\u7684\u60c5\u51b5\u4e0b\u8986\u76d6\u4e86\u6240\u6709\u7684\u67b6\u6784\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#5","title":"5\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0","text":"5.1\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u4f5c\u4e3a\u524d\u7aef\u754c\u9762\u7cfb\u7edf\uff0c\u901a\u8fc7\u9875\u9762\u4e0a\u7684\u4e00\u4e9b\u529f\u80fd\u9009\u9879\u8fdb\u884c\u5bf9\u5e94\u6d4b\u8bd5\u4efb\u52a1\u7684\u7ba1\u7406\u6216\u89e6\u53d1\uff0c\u4e1a\u5185\u6bd4\u8f83\u6d41\u884c\u7684\u5b9e\u73b0\u65b9\u6848\u662f\u4f7f\u7528 Vue + DRF \u5b9e\u73b0\u4e00\u4e2a\u524d\u540e\u7aef\u5206\u79bb\u7684\u7cfb\u7edf\u3002 \u6d4b\u8bd5\u5e73\u53f0\u53ef\u80fd\u4f1a\u6d89\u53ca\u5230\u7684\u6a21\u5757\u6709\uff1a\u6d4b\u8bd5\u673a\u8d44\u6e90\u7ba1\u7406\u6a21\u5757\u3001\u7528\u4f8b\u6267\u884c\u63a7\u5236\u6a21\u5757\u3001\u7ed3\u679c\u5c55\u793a\u6a21\u5757\u3001PXE \u955c\u50cf\u5b89\u88c5\u6a21\u5757\u7b49\u3002 \u7528\u6237\uff08\u6d4b\u8bd5\u3001\u7814\u53d1\u540c\u5b66\u7b49\uff09\u53ef\u4ee5\u914d\u7f6e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5982\u6267\u884c\u54ea\u4e2a\u5e94\u7528\u3001\u6267\u884c\u7528\u4f8b\u7684\u8303\u56f4\u3001\u5728\u54ea\u53f0\u673a\u5668\u4e0a\u6267\u884c\u3001\u955c\u50cf\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u5e94\u7528\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u6267\u884c\u65f6\u95f4\u3002 5.2\u3001\u6267\u884c\u5165\u53e3 runner \u63d0\u4f9b\u7ed9\u6d4b\u8bd5\u5e73\u53f0\u7684\u63a5\u53e3\u5305\u62ec\uff1a\u7528\u4f8b\u6267\u884c\u63a5\u53e3\u3001\u7ed3\u679c\u8fd4\u56de\u63a5\u53e3\u3001\u955c\u50cf\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u955c\u50cf\u5b89\u88c5\u63a5\u53e3\u3001\u5e94\u7528\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u5e94\u7528\u5b89\u88c5\u66f4\u65b0\u63a5\u53e3\u7b49\u3002 \u524d\u7aef\u5e73\u53f0\u76ee\u524d\u8fd8\u6ca1\u6709\u592a\u591a\u8be6\u7ec6\u7684\u65b9\u6848\uff0c\u672c\u6b21\u8bbe\u8ba1\u4e3b\u8981\u96c6\u4e2d\u5728\u540e\u7aef\u8fd9\u90e8\u5206\u67b6\u6784\u7684\u8bbe\u8ba1\u4e0a\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_5","title":"\u56db\u3001\u5b9e\u65bd\u8ba1\u5212","text":"\u8fd1\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u6587\u7ba1\u4ee3\u7801\u89e3\u8026 2022/3/28 2022/4/8 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u56fe\u5f62\u56fe\u50cf\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u97f3\u89c6\u9891\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5168\u5c40\u641c\u7d22\u4ee3\u7801\u89e3\u8026 2022/4/25 2022/4/26 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u516c\u5171\u5e93\u5efa\u8bbe 2022/4/27 2022/5/5 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5c01\u88c5\u7684\u65b9\u6cd5\u6574\u7406\u6210\u4e00\u4e2a\u8868 2022/5/6 2022/5/10 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7528\u4f8b\u6807\u7b7e\u5206\u7c7b\u8bc4\u4f30 2022/5/11 2022/5/11 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u6807\u7b7e\u5316\u6267\u884c\u9a71\u52a8\u7a0b\u5e8f\u7f16\u5199 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u9700\u5b9e\u73b0\u81ea\u52a8\u89e3\u6790 csv \u8868\u683c\u4e2d\u7684\u7528\u4f8b\u7f16\u53f7 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u722c\u866b\u811a\u672c\uff0c\u722c\u53d6 pms \u4e0a\u7528\u4f8b\u7684\u6807\u7b7e 2022/5/11 2022/5/13 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u5b9a\u65f6\u81ea\u52a8\u7ef4\u62a4\u672c\u5730 csv \u6587\u4ef6\u811a\u672c 2022/5/11 2022/5/20 \u4e2d\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u76ee\u5f55\u7ed3\u6784\u8c03\u6574 2022/5/20 2022/6/2 \u5b8c\u6210\u5168\u5c40\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u5177\u4f53\u65b9\u6848\u548c\u903b\u8f91\u5b9e\u73b0 2022/6/6 2022/6/17 \u9759\u6001\u626b\u63cf\u95ee\u9898\u6e05\u96f6 2022/6/20 2022/7/1 \u5b8c\u6210\u65b0\u6846\u67b6\u4f7f\u7528\u57f9\u8bad 2022/7/4 2022/7/11 \u843d\u5730\u8fd0\u884c 2022/7/12 2022/7/20 \u5e95\u5c42\u5e93\u7528\u9014\u8bf4\u660e\u6587\u6863\u7f16\u5199 2022/7/21 2022/7/28"}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\u200b\\u3000\\-\u3001\u3002\uff0c\uff0e\uff1f\uff01\uff1b]+","pipeline":["stemmer"]},"docs":[{"location":"","title":"\u9996\u9875","text":""},{"location":"#youqu","title":"\u6709\u8da3\uff08YouQu\uff09","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/4/1\n# Author : Mikigo\n# =============================================\n \u672c\u7ad9\u603b\u8bbf\u95ee\u91cf \u6b21 \u6b22\u8fce\u5728\u6d4f\u89c8\u5668\u8bbf\u95ee\u3010\u516c\u7f51\u6587\u6863\u3011 \u7edf\u4fe1\u516c\u53f8\u5185\u7f51\u8fd8\u53ef\u4ee5\u8bbf\u95ee\u3010\u5185\u7f51\u6587\u6863\u3011\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u54e6~~"},{"location":"#_1","title":"\u4e00\u3001\u7b80\u4ecb","text":"\u6709\u8da3\uff08YouQu\uff09\u662f\u6df1\u5ea6\u79d1\u6280\u8bbe\u8ba1\u548c\u5f00\u53d1\u7684\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff0c\u91c7\u7528\u7ed3\u6784\u5206\u5c42\u7684\u8bbe\u8ba1\u7406\u5ff5\uff0c\u652f\u6301\u591a\u5143\u5316\u5143\u7d20\u5b9a\u4f4d\u548c\u65ad\u8a00\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\u3001\u5f3a\u5927\u7684\u65e5\u5fd7\u548c\u62a5\u544a\u8f93\u51fa\u7b49\u7279\u8272\u529f\u80fd\uff0c\u540c\u65f6\u5b8c\u7f8e\u517c\u5bb9X11\u3001Wayland\u663e\u793a\u534f\u8bae\uff0c\u73af\u5883\u90e8\u7f72\u7b80\u5355\uff0c\u64cd\u4f5c\u6613\u4e0a\u624b\u3002"},{"location":"#17","title":"\u7231\u4e0a \u201c\u6709\u8da3\u201d \u7684 17 \u4e2a\u7406\u7531","text":" \u6838\u5fc3\u5e93\u63d0\u4f9b\u4e86\u7edf\u4e00\u7684\u63a5\u53e3\uff0c\u7f16\u5199\u65b9\u6cd5\u65f6\u53ea\u9700\u8981\u5bfc\u5165\u4e00\u4e2a\u5305\u5c31\u53ef\u4ee5\u4f7f\u7528\u5230\u6838\u5fc3\u5e93\u63d0\u4f9b\u7684\u6240\u6709\u529f\u80fd\uff1b \u516c\u5171\u5e93\u5c01\u88c5\u4e86\u5f88\u591a\u5e38\u7528\u6a21\u5757\u7684\u76f8\u5173\u65b9\u6cd5\uff0c\u6bd4\u5982\uff1a\u4efb\u52a1\u680f\u7684\u64cd\u4f5c\u3001\u684c\u9762\u7684\u64cd\u4f5c\u3001\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\u7b49\u7b49\uff1b \u9664\u4e86\u5e38\u7528\u7684\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u8bc6\u522b\u4ee5\u5916\uff0c\u6211\u4eec\u8fd8\u63d0\u4f9b\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u5176\u4f7f\u7528\u7b80\u5355\u4e14\u9ad8\u6548\uff0c\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff1b \u5bf9\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u5c06\u7f16\u5199\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u53d8\u5f97\u7b80\u5355\u800c\u4f18\u96c5\uff1b \u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u6280\u672f\u8fdb\u884c\u529f\u80fd\u5347\u7ea7\uff0c\u9664\u4e86\u652f\u6301\u5355\u4e2a\u5750\u6807\u8fd4\u56de\uff0c\u8fd8\u652f\u6301\u540c\u4e00\u754c\u9762\u4e0b\u591a\u4e2a\u76f8\u540c\u5143\u7d20\u8fd4\u56de\u591a\u4e2a\u5750\u6807\u7684\u529f\u80fd\uff1b \u63d0\u4f9b\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u548c\u6279\u91cf\u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u4e0d\u5230\u4e00\u4e2a csv \u6587\u4ef6\u539f\u6765\u80fd\u5e72\u8fd9\u4e48\u591a\u4e8b\u60c5\uff1b \u63d0\u4f9b\u4e86\u529f\u80fd\u5f3a\u5927\u7684\u6267\u884c\u5668\u5165\u53e3\uff0c\u8ba9\u4f60\u53ef\u4ee5\u65b9\u4fbf\u7684\u5728\u672c\u5730\u6267\u884c\u4efb\u4f55\u7528\u4f8b\u96c6\u7684\u7528\u4f8b\uff0c\u5176\u4e30\u5bcc\u7684\u81ea\u5b9a\u4e49\u914d\u7f6e\u9879\uff0c\u6ee1\u8db3\u4f60\u5bf9\u6267\u884c\u5668\u6240\u6709\u7684\u5e7b\u60f3\uff1b \u63d0\u4f9b\u8fdc\u7a0b\u6267\u884c\u7684\u529f\u80fd\uff0c\u53ef\u4ee5\u63a7\u5236\u591a\u53f0\u673a\u5668\u5e76\u884c\u8dd1\uff0c\u6216\u8005\u5206\u5e03\u5f0f\u8dd1\uff0c\u8fd9\u79cd\u4ed8\u8d39\u529f\u80fd\u73b0\u5728\u514d\u8d39\u7ed9\u4f60\u7528\uff1b \u63d0\u4f9b\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u529f\u80fd\uff0c\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u6bcf\u4e2a\u65b9\u6cd5\u5355\u72ec\u5199\u8f93\u51fa\u65e5\u5fd7\u7684\u4ee3\u7801\uff0c\u4e00\u5207\u6211\u4eec\u7ed9\u4f60\u641e\u5b9a\u4e86\uff0c\u65e5\u5fd7\u8f93\u51fa\u4e0d\u4ec5\u5185\u5bb9\u4e30\u5bcc\uff0c\u989c\u503c\u4e5f\u7edd\u5bf9\u5728\u7ebf\uff0c\u6211\u4eec\u8fd8\u81ea\u5df1\u8bbe\u8ba1\u4e86\u4e00\u6b3e\u7ec8\u7aef\u8f93\u51fa\u4e3b\u9898\u53eb\u300a\u4e94\u5f69\u6591\u6593\u7684\u9ed1\u300b\uff1b \u63d0\u4f9b\u4e86\u4e00\u952e\u90e8\u7f72\u81ea\u52a8\u5316\u6d4b\u8bd5\u73af\u5883\u7684\u529f\u80fd\uff0c\u8fde\u4ee3\u7801\u7f16\u8f91\u5668\u90fd\u7ed9\u4f60\u88c5\u597d\u4e86\uff0c\u8ba9\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u73af\u5883\u90e8\u7f72\u800c\u70e6\u607c\uff1b \u63d0\u4f9b\u4e86\u81ea\u52a8\u751f\u6210\u591a\u79cd\u62a5\u544a\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u8f93\u51fa\u4ec0\u4e48\u62a5\u544a\u5f62\u5f0f\u90fd\u884c\uff0c\u800c\u4e14\u6211\u4eec\u5728\u62a5\u544a\u4e2d\u8fd8\u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\u548c\u5931\u8d25\u622a\u56fe\u7684\u529f\u80fd\uff1b \u5bf9\u65ad\u8a00\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u63d0\u4f9b\u66f4\u53cb\u597d\u5316\u7684\u9519\u8bef\u63d0\u793a\uff0c\u8ba9\u5b9a\u4f4d\u95ee\u9898\u7cbe\u51c6\u9ad8\u6548\uff1b \u4e0d\u4ec5\u652f\u6301\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u63a7\u5236\uff0c\u800c\u4e14\u8fd8\u652f\u6301\u52a8\u6001\u63a7\u5236\u7528\u4f8b\u6279\u91cf\u6267\u884c\u7684\u603b\u65f6\u95f4\uff0c\u786e\u4fdd CI \u73af\u5883\u4e0b\u80fd\u987a\u7545\u8fd0\u884c\uff1b \u652f\u6301\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\u6267\u884c\u3001PMS \u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6807\u7b7e\u5316\u6267\u884c\u65b9\u6848\uff0c\u6ee1\u8db3\u4f60\u5404\u79cd\u573a\u666f\u4e0b\u7684\u6267\u884c\u9700\u6c42\uff1b \u652f\u6301\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u529f\u80fd\uff0c\u53ef\u5b9a\u4f4d\u53ef\u65ad\u8a00\uff0c\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\uff1b \u5b8c\u7f8e\u517c\u5bb9 Wayland \u548c X11\uff0c\u771f\u6b63\u505a\u5230\u4e00\u5957\u4ee3\u7801\uff0c\u968f\u5904\u6267\u884c\uff1b \u652f\u6301\u591a\u79cd\u65b9\u5f0f\u7684\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u5176\u4e2d\u5f02\u6b65\u56de\u586b\u7684\u65b9\u6848\uff0c\u5b8c\u7f8e\u89e3\u51b3\u4e86\u6570\u636e\u56de\u586b\u7684\u8017\u65f6\u95ee\u9898\uff1b \u3010\u89c6\u9891\u4ecb\u7ecd\u3011"},{"location":"#_2","title":"\u4e8c\u3001\u5b89\u88c5\u4f7f\u7528","text":"\u57fa\u7840\u6846\u67b6\uff1ahttps://github.com/linuxdeepin/deepin-autotest-framework \u4ece PyPI \u5b89\u88c5: sudo pip3 install youqu\n \u521b\u5efa\u9879\u76ee: youqu-startproject youqu\n \u5b89\u88c5\u4f9d\u8d56: cd youqu\nbash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002 \u5e94\u7528\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684\u5e94\u7528\u540d\u79f0\u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music cd apps/\n \u5c06\u5e94\u7528\u5e93\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u50cf\u8fd9\u6837\uff1a youqu\n\u251c\u2500\u2500 apps\n\u2502 \u251c\u2500\u2500 autotest_deepin_music # \u5e94\u7528\u5e93\n...\n \u5e94\u7528\u5e93\u7684\u540d\u79f0\u4e0d\u53ef\u4ee5\u4fee\u6539\u3002"},{"location":"#_3","title":"\u4e09\u3001\u8fd0\u884c","text":""},{"location":"#1","title":"1. \u5de5\u4f5c\u7a7a\u95f4","text":"\u57fa\u7840\u6846\u67b6\u5de5\u7a0b\u76ee\u5f55\u5efa\u8bae\u653e\u5728 ~ \u76ee\u5f55\u4e0b\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u4e5f\u53ef\u4ee5\u8fd0\u884c\uff0c\u4f46\u662f\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u9700\u8981\u505a\u73af\u5883\u6e05\u7406\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u5b58\u5728\u4ee3\u7801\u88ab\u5220\u9664\u7684\u98ce\u9669\u3002 \u5982\u679c\u4f60\u7684\u673a\u5668\u4e0a\u4e0d\u540c\u76ee\u5f55\u4e0b\u5b58\u5728\u591a\u4e2a YouQu \u5de5\u7a0b\uff0c\u90a3\u4e48\u5728\u8fd0\u884c\u4e4b\u524d\uff0c\u8bf7\u5148\u6267\u884c env.sh \u6821\u6b63\u76f8\u5173\u73af\u5883\u3002"},{"location":"#2","title":"2. \u6267\u884c\u5668","text":"\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u6709\u4e00\u4e2a manage.py \uff0c\u5b83\u662f\u4e00\u4e2a\u6267\u884c\u5668\u5165\u53e3\uff0c\u63d0\u4f9b\u4e86\u672c\u5730\u6267\u884c\u3001\u8fdc\u7a0b\u6267\u884c\u7b49\u7684\u529f\u80fd\u3002 \u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6765\u6267\u884c\uff1a youqu manage.py run -a deepin-music\n"},{"location":"#21","title":"2.1. \u672c\u5730\u6267\u884c","text":"youqu manage.py run\n"},{"location":"#211","title":"2.1.1. \u914d\u7f6e\u6587\u4ef6","text":"\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u914d\u7f6e\u53c2\u6570 \u5728\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u91cc\u9762\u652f\u6301\u914d\u7f6e\u5bf9\u6267\u884c\u7684\u4e00\u4e9b\u53c2\u6570\u8fdb\u884c\u914d\u7f6e\uff0c\u5e38\u7528\u7684\u5982\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;-----------------------------------------------\n;1.KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2.KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f\n;e.g. TAGS = L1 or smoke\n;-----------------------------------------------\n;\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\uff0c\u5c06\u8981\u6267\u884c\u7684\u7528\u4f8b\u5199\u5165\u6307\u5b9a\u7684 csv \u6587\u4ef6\n;\u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u4ece\u57fa\u7840\u6846\u67b6\u6839\u76ee\u5f55\u5f00\u59cb\uff1ae.g. CASE_FILE = case_list.txt\n;\u5982\u679c\u8fd9\u91cc\u6709\u503c\uff0cAPP_NAME KEYWORDS TAGS \u7684\u914d\u7f6e\u5747\u4e0d\u751f\u6548\nCASE_FILE =\n;=============================== RUNNER CONFIG ===================================\n[runner]\n;\u6700\u5927\u5931\u8d25\u7528\u4f8b\u6570\u91cf\u7684\u5360\u6bd4\n;\u6bd4\u5982\uff1a\u603b\u6267\u884c\u7528\u4f8b\u6570\u4e3a 100, \u82e5 MAX_FAIL = 0.5,\u5219\u5931\u8d25\u7528\u4f8b\u6570\u8fbe\u5230 50 \u5c31\u4f1a\u7ec8\u6b62\u6d4b\u8bd5\u3002\nMAX_FAIL = 1\n;\u5355\u6761\u7528\u4f8b\u7684\u8d85\u65f6\u65f6\u95f4\uff0c\u5982\u679c\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u8d85\u65f6\uff0c\u8fd9\u6761\u7528\u4f8b\u4f1a\u88ab\u505c\u6b62\uff0c\u540e\u7eed\u7528\u4f8b\u7ee7\u7eed\u6267\u884c\u3002\n;\u5355\u4f4d\u4e3a\u79d2\n;\u8fd9\u662f\u4e00\u4e2a\u5168\u5c40\u7edf\u4e00\u914d\u7f6e\uff0c\u5982\u679c\u67d0\u6761\u7528\u4f8b\u9700\u8981\u5355\u72ec\u914d\u7f6e\u8d85\u65f6\u65f6\u95f4\uff0c\u53ef\u4ee5\u5728\u7528\u4f8b\u4e2d\u8fd9\u6837\u5199\uff1a\n;@pytest.mark.timeout(500)\n;def test_xxx_001():\n; ...\n;\u4f1a\u8bdd\u8d85\u65f6\uff08\u6240\u6709\u7528\u4f8b\u6267\u884c\u7684\u8d85\u65f6\u65f6\u95f4\uff09\u662f\u6839\u636e\u5168\u5c40\u8d85\u65f6\u914d\u7f6e\u548c\u7528\u4f8b\u5355\u72ec\u8d85\u65f6\u914d\u7f6e\u81ea\u52a8\u8ba1\u7b97\u7684\u3002\nCASE_TIME_OUT = 200\n;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\n;\u6ce8\u610f\uff0cRERUN = 1 \u8868\u793a\u91cd\u8dd1 1 \u6b21\uff0c\u5373\u7b2c\u4e00\u6b21\u7528\u4f8b\u6267\u884c\u5931\u8d25\u4f1a\u81ea\u52a8\u91cd\u8dd1 1 \u6b21\uff0c\u603b\u5171\u6267\u884c 2 \u6b21\uff1b\n;\u5982\u679c\u7b2c 2 \u6b21\u6267\u884c\u6210\u529f\uff0c\u7ed3\u679c\u6210\u529f\uff0c\u5931\u8d25\u4ea6\u4e3a\u5931\u8d25\u3002\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c 1 \u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff0cRERUN >= RECORD_FAILED_CASE\u3002\n;1.\u5173\u95ed\u5f55\u5c4f\uff1aRECORD_FAILED_CASE > RERUN\n;2.\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1aRECORD_FAILED_CASE = 0\nRECORD_FAILED_CASE = 1\n;yes \u6bcf\u6761\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u8fdb\u884c\u73af\u5883\u6e05\u7406\nCLEAN_ALL = yes\n;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387, \u6bd4\u5982\uff1a1920x1080\n;no: \u8868\u793a\u4e0d\u505a\u5206\u8fa8\u7387\u6821\u9a8c\nRESOLUTION = 1920x1080\n;\u4e0d\u8df3\u8fc7\u7528\u4f8b\uff0ccsv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86 skip-xxx\u7684\u7528\u4f8b\u4e0d\u8df3\u8fc7\nNOSKIP = no\n;ignore fixed\n;no\uff0c\u53ea\u8981\u6807\u8bb0\u4e86fixed\u7684\u7528\u4f8b\uff0c\u5373\u4f7f\u6807\u8bb0\u4e86skip-\uff0c\u4e5f\u4f1a\u6267\u884c\uff1b\n;yes\uff0cfixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\uff1b\nIFIXED = no\n;\u8981\u5b89\u88c5deb\u5305\u7684\u8def\u5f84\n;e.g : ~/Downloads/ \u5b89\u88c5\u4e0b\u8f7d\u76ee\u5f55\u4e0b\u7684deb\u5305\uff0c\u5982\u679c\u662f\u8fdc\u7a0b\u6267\u884c\uff0c\u4f1a\u81ea\u52a8\u62f7\u8d1d\u5230\u8fdc\u7a0b\u5e76\u5b89\u88c5\u3002\nDEB_PATH =\n;DEBUG \u6a21\u5f0f\u6267\u884c\u7528\u4f8b\uff0c\u53ea\u6536\u96c6\u4e0d\u6267\u884c\u7528\u4f8b\uff0c\u4e5f\u4e0d\u505a\u8bbe\u5907\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002\nDEBUG = no\n;\u8bb0\u5f55top\u547d\u4ee4\u67e5\u8be2\u7684\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0cTOP = 3 \u8868\u793a\u8bb0\u5f55\u524d3\u4e2a\u8fdb\u7a0b\u3002\nTOP =\n;\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\nREPEAT =\n;\u9ed8\u8ba4\u5728\u6240\u6709\u6d4b\u8bd5\u5b8c\u6210\u4e4b\u540e\u8f93\u51fa\u62a5\u9519\u4fe1\u606f.\n;yes, \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\nDURING_FAIL = no\n;\u6ce8\u518c\u81ea\u542f\u670d\u52a1\nAUTOSTART = no\n;=============================== REPORT CONFIG ===================================\n[report]\n;\u6d4b\u8bd5\u62a5\u544a\u7684title\nREPORT_TITLE = YouQu Report\n;\u6d4b\u8bd5\u62a5\u544a\u7684name\nREPORT_NAME = YouQu Report\n;\u6d4b\u8bd5\u62a5\u544a\u7684\u9ed8\u8ba4\u8bed\u8a00\n;en:English\n;ru:\u0420\u0443\u0441\u0441\u043a\u0438\u0439\n;zh:\u4e2d\u6587\n;de:Deutsch\n;nl:Nederlands\n;he:Hebrew\n;br:Brazil\n;pl:Polski\n;ja:\u65e5\u672c\u8a9e\n;es:Espa\u00f1ol\n;kr:\ud55c\uad6d\uc5b4\n;fr:Fran\u00e7ais\n;az:Az\u0259rbaycanca\nREPORT_LANGUAGE = zh\n;\u7528\u4f8b\u6267\u884c\u5b8c\u540e\u751f\u6210\u7684\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n;\u76ee\u524d\u652f\u6301 allure, xml, json \uff08\u652f\u6301\u540c\u65f6\u751f\u6210\uff09\nREPORT_FORMAT = allure, xml, json\n;\u6307\u5b9a\u62a5\u544a\u751f\u6210\u7684\u8def\u5f84\uff08\u76f8\u5bf9\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\uff09\nALLURE_REPORT_PATH = report/\nXML_REPORT_PATH = report/\nJSON_REPORT_PATH = report/\n;=============================== GLOBAL CONFIG ===================================\n[globalconfig]\n;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\nPASSWORD = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\nIMAGE_MATCH_NUMBER = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6bcf\u6b21\u95f4\u9694\u7b49\u5f85\u65f6\u95f4\nIMAGE_MATCH_WAIT_TIME = 1\n;\u56fe\u50cf\u8bc6\u522b\u5339\u914d\u5ea6\nIMAGE_RATE = 0.9\n;\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u5b9e\u65f6\u56fe\u50cf\u4fdd\u5b58\u8def\u5f84\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u5750\u6807\nSCREEN_CACHE = /tmp/screen.png\n;\u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\u7684\u8def\u5f84\nTMPDIR = /tmp/tmpdir\n;\u7cfb\u7edf\u4e3b\u9898\nSYS_THEME = deepin\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = youqu-dev.uniontech.com\n;OpenCV\u670d\u52a1\u7aef\u5730\u5740\nOPENCV_SERVER_HOST = youqu-dev.uniontech.com\n;=============================== PMS CONFIG ===================================\n;PMS\u76f8\u5173\u914d\u7f6e\uff0c\u5305\u542b\u4ee5\u4e0b\u51e0\u4e2a\u65b9\u9762\uff1a\n;1.PMS\u6d4b\u8bd5\u5957\u6267\u884c\n;2.\u81ea\u52a8\u4ecePMS\u722c\u53d6\u6570\u636e\u5e76\u540c\u6b65\u672c\u5730CSV\u6587\u4ef6\n;3.PMS\u6570\u636e\u56de\u586b\n[pms]\n;PMS\u7684\u7528\u6237\u540d,\u5982: ut001234\nPMS_USER =\n;PMS\u7684\u5bc6\u7801\nPMS_PASSWORD =\n;PMS\u6d4b\u8bd5\u5957\u7684ID\n;\u5728PMS\u4e0a\u67e5\u770b\u7528\u4f8b\u201c\u5957\u4ef6\u201d\u94fe\u63a5: https://pms.uniontech.com/testsuite-view-495.html\n;\u6d4b\u8bd5\u5957ID\u4e3a: 495\nSUITE_ID =\n;\u6570\u636e\u56de\u586b\u5fc5\u987b\u5173\u8054PMS\u6d4b\u8bd5\u5355\n;\u5728PMS\u4e0a\u67e5\u770b\u6d4b\u8bd5\u5355\u94fe\u63a5: https://pms.uniontech.com/testtask-cases-20747.html\n;\u6d4b\u8bd5\u5355ID\u4e3a: 20747\nTASK_ID =\n;\u5c06\u6d4b\u8bd5\u7ed3\u679c\u6570\u636e\u56de\u586b\u5230PMS\n;\u4e3a\u7a7a: \u8868\u793a\u4e0d\u56de\u586b,\u4e0d\u4f1a\u5728\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u751f\u6210json\u7ed3\u679c\u6587\u4ef6;\n;async: \u8868\u793a\u9010\u6761\u5f02\u6b65\u56de\u586b,\u540e\u9762\u4e00\u6761\u6267\u884c\u5f00\u59cb\u65f6\u901a\u8fc7\u5b50\u7ebf\u7a0b\u5bf9\u524d\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u8fdb\u884c\u56de\u586b\uff0c\u5982\u6b64\u5b9e\u73b0\u65f6\u95f4\u6548\u7387\u6700\u5927\u5316;\n;finish: \u8868\u793a\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u6210\u4e4b\u540e\u9010\u4e2a\u56de\u586b(PMS\u4e0d\u652f\u6301\u5e76\u53d1);\nSEND_PMS =\n;\u6570\u636e\u56de\u586b\u7684\u89e6\u53d1\u8005\n;auto: \u6846\u67b6\u81ea\u52a8\u56de\u586b,\u914d\u5408SEND_PMS\u914d\u7f6e\u4f7f\u7528,\u4f60\u53ef\u4ee5\u9009\u62e9\u5728\u4e0d\u540c\u7684\u9636\u6bb5\u8fdb\u884c\u6570\u636e\u56de\u586b;\n;hand: \u624b\u52a8\u56de\u586b,\u6bcf\u6761\u7528\u4f8b\u4ecd\u7136\u4f1a\u751f\u6210json\u6587\u4ef6,\u4f46\u6846\u67b6\u4e0d\u4f1a\u8fdb\u884c\u6570\u636e\u56de\u586b,\u9700\u8981\u4f60\u53ef\u4ee5\u5728\u4f60\u60f3\u8981\u53d1\u9001\u7684\u65f6\u95f4\u70b9\u624b\u52a8\u89e6\u53d1\u56de\u586b;\nTRIGGER = auto\n;PMS\u56de\u586b\u7684\u91cd\u8bd5\u6b21\u6570\n;\u5982\u679c\u63a5\u53e3\u8bf7\u6c42\u5931\u8d25,\u4f1a\u8fdb\u884c\u91cd\u8bd5\nSEND_PMS_RETRY_NUMBER = 2\n[csv_link_pms_lib]\n;caselib: \u7528\u4f8b\u5e93\n;testcase: \u4ea7\u54c1\u5e93\u7528\u4f8b\nCASE_FROM = caselib\n[csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/caselib-browse-81.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 81\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic =\n[export_csv]\n;\u5bfc\u51fa\u7684csv\u6587\u4ef6\u540d\u79f0\uff0c\u9ed8\u8ba4 case_list.csv\nCSV_FILE = case_list.csv\n;exportcsv \u547d\u4ee4\u5bfc\u51fa case_list.csv \u6587\u4ef6\u65f6\u914d\u7f6e\u7684\u5b57\u6bb5\u540d\uff0c\u7528\u4f8b\u540d\u79f0\u9ed8\u8ba4\u5b58\u5728\u7b2c\u4e00\u5217\uff0c\u65e0\u9700\u6dfb\u52a0\nCSV_HEARD = \u7528\u4f8b\u7ea7\u522b,\u7528\u4f8b\u7c7b\u578b,\u6d4b\u8bd5\u7ea7\u522b,\u662f\u5426\u8df3\u8fc7\n[log_cli]\n;\u65e5\u5fd7\u76f8\u5173\u914d\u7f6e\uff08\u4e0d\u6253\u5370\u6784\u9020\u51fd\u6570\u548c\u9b54\u6cd5\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff09\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = DEBUG\n# ============= \u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u914d\u7f6e ================\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u5f00\u5934\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7, \u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_STARTSWITH = Assert\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u7ed3\u5c3e\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_ENDSWITH = Widget\n;\u652f\u6301\u7c7b\u540d\u5305\u542b xxx \u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_CONTAIN = ShortCut\n# ==============================================\n \u914d\u7f6e\u5b8c\u6210\u4e4b\u540e\uff0c\u76f4\u63a5\u5728\u547d\u4ee4\u884c\u6267\u884c manage.py \u5c31\u597d\u4e86\u3002 youqu manage.py run\n"},{"location":"#212","title":"2.1.2. \u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a youqu manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -h, --help show this help message and exit\n-a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--record_failed_case RECORD_FAILED_CASE\n\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--max_fail MAX_FAIL \u6700\u5927\u5931\u8d25\u7387\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--resolution RESOLUTION\n\u68c0\u67e5\u5206\u8fa8\u7387\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms {,async,finish}\n\u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--trigger {,auto,hand}\n\u89e6\u53d1\u8005\n-f CASE_FILE, --case_file CASE_FILE\n\u6839\u636e\u6587\u4ef6\u6267\u884c\u7528\u4f8b\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n--pms_user PMS_USER pms \u7528\u6237\u540d\n--pms_password PMS_PASSWORD\npms \u5bc6\u7801\n--suite_id SUITE_ID pms \u6d4b\u8bd5\u5957ID\n--pms_info_file PMS_INFO_FILE\npms \u4fe1\u606f\u6587\u4ef6\n--top TOP \u8fc7\u7a0b\u4e2d\u8bb0\u5f55top\u547d\u4ee4\u4e2d\u7684\u503c\n--lastfailed \u4ec5\u6267\u884c\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\n--duringfail \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\n--repeat REPEAT \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n--project_name PROJECT_NAME\n\u5de5\u7a0b\u540d\u79f0\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--build_location BUILD_LOCATION\n\u6784\u5efa\u5730\u533a\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--line LINE \u6267\u884c\u7684\u4e1a\u52a1\u7ebf\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--autostart AUTOSTART \u7528\u4f8b\u6267\u884c\u7a0b\u5e8f\u6ce8\u518c\u5230\u5f00\u673a\u81ea\u542f\u670d\u52a1\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a youqu manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\"\n \u547d\u4ee4\u884c\u53c2\u6570\u4f18\u5148\u7ea7\u662f\u9ad8\u4e8e\u914d\u7f6e\u6587\u4ef6\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u4e86\u5bf9\u5e94\u7684\u53c2\u6570\uff0c\u914d\u7f6e\u6587\u4ef6\u4e2d\u4e0d\u7ba1\u662f\u5426\u914d\u7f6e\u5747\u4e0d\u751f\u6548\u3002 --app \u5165\u53c2\u8fd8\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\uff0c\u4e0b\u9762\u7684\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u540c\u6837\u652f\u6301\u3002"},{"location":"#22","title":"2.2. \u8fdc\u7a0b\u6267\u884c","text":"\u8fdc\u7a0b\u6267\u884c\u5c31\u662f\u7528\u672c\u5730\u4f5c\u4e3a\u670d\u52a1\u7aef\u63a7\u5236\u8fdc\u7a0b\u673a\u5668\u6267\u884c\uff0c\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u76f8\u540c\uff1b \u4f7f\u7528 remote \u547d\u4ee4\uff1a youqu manage.py remote\n"},{"location":"#221","title":"2.2.1. \u8fdc\u7a0b\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u6267\u884c","text":"\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u6267\u884c\u5c31\u662f\u7531\u672c\u5730 YouQu \u4f5c\u4e3a\u670d\u52a1\u7aef\uff0c\u63a7\u5236\u8fdc\u7a0b N \u53f0\u673a\u5668\u6267\u884c\u76f8\u540c\u7684\u7528\u4f8b\uff0c\u6267\u884c\u5b8c\u4e4b\u540e\u6240\u6709\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u7ed3\u679c\u4f1a\u8fd4\u56de\u7ed9\u670d\u52a1\u7aef report \u76ee\u5f55\u4e0b\uff1b \u8fdc\u7a0b\u6267\u884c\u540c\u6837\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u8fdb\u884c\u7528\u4f8b\u76f8\u5173\u914d\u7f6e\uff1b \u9700\u8981\u91cd\u70b9\u8bf4\u4e00\u4e0b\u8fdc\u7a0b\u6267\u884c\u65f6\u7684\u6d4b\u8bd5\u673a\u4fe1\u606f\u914d\u7f6e\uff0c\u5728\u914d\u7f6e\u6587\u4ef6 setting/remote.ini \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\u3001IP\u3001\u5bc6\u7801\u3002 ;=============================== CLIENT LIST =====================================\n; \u6d4b\u8bd5\u673a\u914d\u7f6e\u5217\u8868\n;[client{number}] ;\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u6709\u591a\u5c11\u53f0\u6d4b\u8bd5\u673a\u5c31\u5199\u591a\u5c11\u4e2a client\uff0c\u522b\u540d\u5fc5\u987b\u5305\u542b client \u5b57\u7b26\uff0c\u4e14\u4e0d\u80fd\u91cd\u590d\u3002\n;user = ;\u6d4b\u8bd5\u673a user\n;ip = ;\u6d4b\u8bd5\u673a ip\n;password = 1 ;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801, \u53ef\u4ee5\u4e0d\u914d\u7f6e\u6b64\u9879\uff0c\u9ed8\u8ba4\u53d6 CLIENT_PASSWORD \u7684\u503c\uff1b\n;\u5982\u679c\u4f60\u6240\u6709\u6d4b\u8bd5\u673a\u5bc6\u7801\u90fd\u76f8\u540c\uff0c\u90a3\u4e48\u53ea\u9700\u8981\u914d\u7f6e CLIENT_PASSWORD \u5c31\u53ef\u4ee5\u4e86\n;=================================================================================\n[client1]\nuser = uos\nip = 10.8.15.xx\n[client2]\nuser = uos\nip = 10.8.15.xx\n[client3]\nuser = uos\nip = 10.8.11.xx\n \u6709\u591a\u5c11\u53f0\u673a\u5668\u5c31\u50cf\u8fd9\u6837\u53c2\u8003\u4e0a\u9762\u7684\u683c\u5f0f\u5199\u5c31\u884c\u4e86\u3002 \u7136\u540e\u5728\u547d\u4ee4\u884c\uff1a youqu manage.py remote\n \u8fd9\u6837\u8fd0\u884c\u662f\u4ece\u914d\u7f6e\u6587\u4ef6\u53bb\u8bfb\u53d6\u76f8\u5173\u914d\u7f6e\u3002 \u5982\u679c\u4f60\u4e0d\u60f3\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\uff0c\u4f60\u4ecd\u7136\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u8fdb\u884c\u4f20\u53c2\uff0c \u4ee5\u4e0b\u4e3a python3 manage.py remote \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -h, --help show this help message and exit\n-c CLIENTS, --clients CLIENTS\n\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679cpassword\u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6sett\ning/remote.ini\u4e2dCLIENT_PASSWORD\u7684\u503c,\u6bd4\u5982: uos@10.8.13.33:1\n\u6216 uos@10.8.13.33\n-s, --send_code \u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a\uff08\u4e0d\u542breport\u76ee\u5f55\uff09\n-e, --build_env \u642d\u5efa\u6d4b\u8bd5\u73af\u5883,\u5982\u679c\u4e3ayes\uff0c\u4e0d\u7ba1send_code\u662f\u5426\u4e3ayes\u90fd\u4f1a\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a.\n-p CLIENT_PASSWORD, --client_password CLIENT_PASSWORD\n\u6d4b\u8bd5\u673a\u5bc6\u7801\uff08\u5168\u5c40\uff09\n-y PARALLEL, --parallel PARALLEL\nyes:\u8868\u793a\u6240\u6709\u6d4b\u8bd5\u673a\u5e76\u884c\u8dd1\uff0c\u6267\u884c\u76f8\u540c\u7684\u6d4b\u8bd5\u7528\u4f8b;no:\u8868\u793a\u6d4b\u8bd5\u673a\u5206\u5e03\u5f0f\u6267\u884c\uff0c\u670d\u52a1\u7aef\u4f1a\u6839\u636e\u6536\u96c6\u5230\u7684\u6d4b\u8bd5\u7528\u4f8b\u81ea\n\u52a8\u5206\u914d\u7ed9\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u3002\n \u9664\u4e86\u8fd9\u4e9b\u7279\u6709\u53c2\u6570\u4ee5\u5916\uff0c\u5b83\u540c\u6837\u652f\u6301\u672c\u5730\u6267\u884c\u7684\u6240\u6709\u53c2\u6570\uff1b \u5728\u547d\u4ee4\u884c\u8fd9\u6837\u8fd0\u884c\uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\"\n \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report \u76ee\u5f55\u4e0b\u56de\u6536\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u7684\u6d4b\u8bd5\u62a5\u544a\u3002 \u6ce8\u610f\uff0c\u5982\u679c\u8fdc\u7a0b\u673a\u5668\u6ca1\u6709\u642d\u5efa\u81ea\u52a8\u5316\u6d4b\u8bd5\u73af\u5883\uff0c\u8bb0\u5f97\u52a0\u4e0a\u53c2\u6570 -e \uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\" -e\n \u6267\u884c\u524d\u786e\u4fdd\u8fdc\u7a0b\u673a\u5668\u5df2\u7ecf\u5f00\u542f\u4e86 ssh \u670d\u52a1\uff0c\u5426\u5219\u4f1a\u63d0\u793a\u65e0\u6cd5\u8fde\u63a5\uff0c\u5982\u679c\u6ca1\u6709\u5f00\u542f\uff0c\u8bf7\u624b\u52a8\u5f00\u542f\uff1a sudo systemctl restart ssh\nsudo systemctl enable ssh\n \u914d\u7f6e\u6587\u4ef6\u5176\u4ed6\u76f8\u5173\u914d\u7f6e\u9879\u8be6\u7ec6\u8bf4\u660e\uff0c\u8bf7\u67e5\u770b\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u6ce8\u91ca\u5185\u5bb9\u3002"},{"location":"#222","title":"2.2.2. \u8fdc\u7a0b\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u8d1f\u8f7d\u5747\u8861\u6267\u884c","text":"\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u8d1f\u8f7d\u5747\u8861\u6267\u884c\u4e5f\u662f\u7528\u672c\u5730\u4f5c\u4e3a\u670d\u52a1\u7aef\u63a7\u5236\u8fdc\u7a0b\u673a\u5668\u6267\u884c\uff0c\u4f46\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u4e0d\u540c\uff0c\u800c\u662f\u6240\u6709\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u4e4b\u548c\uff0c\u4e3a\u4f60\u60f3\u8981\u6267\u884c\u7684\u7528\u4f8b\u96c6\uff1b \u4f3c\u4e4e\u6709\u70b9\u96be\u4ee5\u7406\u89e3\uff0c\u6211\u7528\u5927\u767d\u8bdd\u4e3e\u4f8b\u63cf\u8ff0\u4e0b\u5c31\u662f\uff0c\u670d\u52a1\u7aef\u60f3\u8981\u6267\u884c 10 \u6761\u7528\u4f8b\uff0c\u73b0\u5728\u8fdc\u7a0b\u673a\u5668\u6709 5 \u53f0\uff1b \u7136\u540e\u670d\u52a1\u7aef\u5c31\u5148\u62ff\u7740\u7b2c 1 \u6761\u7528\u4f8b\u7ed9\u8fdc\u7a0b 1 \u53f7\u673a\u6267\u884c\uff0c\u62ff\u7b2c 2 \u6761\u7528\u4f8b\u7ed9\u8fdc\u7a0b 2 \u53f7\u673a\u6267\u884c...\uff0c\u5982\u6b64\u5faa\u73af\u76f4\u5230\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\uff0c\u8fd9\u5c31\u662f\u8d1f\u8f7d\u5747\u8861\u6267\u884c\u3002 \u4f7f\u7528\u65b9\u6cd5\u548c\u524d\u9762\u4e00\u6837\uff0c\u53ea\u662f\u9700\u8981\u589e\u52a0\u4e00\u4e2a\u53c2\u6570\uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\" --parallel no\n"},{"location":"#23-pms","title":"2.3. PMS \u6570\u636e\u56de\u586b","text":"\u6d4b\u8bd5\u5355\u5173\u8054\u7684\u7528\u4f8b\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u5bf9\u5e94\u7684\u53bb\u8dd1\u8fd9\u4e9b\u5173\u8054\u7684\u7528\u4f8b\uff0c\u5e76\u4e14\u5c06\u6267\u884c\u7684\u7ed3\u679c\u56de\u586b\u7684\u6d4b\u8bd5\u7528\u4f8b\u7684\u72b6\u6001\u91cc\u9762\u3002 PMS \u6570\u636e\u56de\u586b\u4e3b\u8981\u6709\u4e09\u79cd\u65b9\u5f0f\uff1a \uff081\uff09\u5f02\u6b65\u56de\u586b \u5728\u7528\u4f8b\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\uff0c\u91c7\u7528\u5f02\u6b65\u7684\u65b9\u5f0f\u53bb\u8fdb\u884c\u6570\u636e\u56de\u586b\uff0c\u76f4\u767d\u7684\u8bb2\u5c31\u662f\uff0c\u7b2c\u4e8c\u6761\u7528\u4f8b\u5f00\u59cb\u8dd1\u7684\u65f6\u5019\uff0c\u901a\u8fc7\u5b50\u7ebf\u7a0b\u53bb\u505a\u7b2c\u4e00\u6761\u7528\u4f8b\u7684\u6570\u636e\u56de\u586b\uff0c\u5982\u6b64\u5faa\u73af\uff0c\u76f4\u5230\u6240\u6709\u7528\u4f8b\u6267\u884c\u7ed3\u675f\uff1b \u8fd9\u79cd\u65b9\u6848\u7684\u65f6\u95f4\u6548\u7387\u6700\u9ad8\u7684\uff0c\u56e0\u4e3a\u7406\u8bba\u4e0a\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u662f\u5927\u4e8e\u6570\u636e\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\u65f6\u95f4\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u5f53\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u6570\u636e\u56de\u586b\u4e5f\u5b8c\u6210\u4e86\u3002 \u4f7f\u7528\u65b9\u6cd5\uff0c\u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u4ee5\u4e0b\u53c2\u6570\uff1a\uff08\u4ee5\u4e0b\u6d89\u53ca\u5230\u7684\u53c2\u6570\u914d\u7f6e\u90fd\u662f\u5728\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u914d\u7f6e\uff09 PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = async\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \u8fd9\u4e2a\u53c2\u6570\u53ef\u586b\u53ef\u4e0d\u586b\uff0c\u4f46\u662f\u586b\u4e86\u53ef\u4ee5\u63d0\u9ad8\u7528\u4f8b\u7684\u6267\u884c\u901f\u5ea6\uff0c\u56e0\u4e3a\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u53ef\u4ee5\u6307\u5b9a\u5230\u5177\u4f53\u7684\u5e94\u7528\u5e93\u3002\uff08\u4e0b\u540c\uff09\n \uff082\uff09\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u56de\u586b \u7b49\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u518d\u9010\u4e2a\u8fdb\u884c\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u6b64\u65b9\u6848\u65f6\u95f4\u6548\u7387\u6bd4\u8f83\u4f4e\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \uff083\uff09\u624b\u52a8\u56de\u586b \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4e0d\u505a\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u540e\u7eed\u624b\u52a8\u5c06\u7ed3\u679c\u8fdb\u884c\u56de\u586b\u8bf7\u6c42\u3002 \u7528\u4f8b\u6267\u884c\u65f6\u914d\u7f6e\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = hand\nAPP_NAME = \u540e\u7eed\u624b\u52a8\u56de\u586b\u65b9\u6cd5\uff1a youqu manage.py pms --send2task yes\n"},{"location":"#_4","title":"\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898","text":"\u7531\u540c\u5b66\u53ef\u80fd\u4f1a\u53d1\u73b0\uff0c\u600e\u4e48\u56de\u586b\u4e00\u6b21\u4e4b\u540e\uff0c\u540e\u9762\u60f3\u518d\u6b21\u56de\u586b\u5c31\u4e0d\u751f\u6548\u4e86\uff1b \u8fd9\u662f\u56e0\u4e3a\u4e3a\u4e86\u5e94\u5bf9\u524d\u9762\u63d0\u5230\u7684\u591a\u79cd\u6570\u636e\u56de\u586b\u7684\u65b9\u5f0f\uff0c\u5728 report \u76ee\u5f55\u4e0b\u4f1a\u7531 pms_xxx \u5f00\u5934\u7684\u76ee\u5f55\uff0c\u8bb0\u5f55\u4e86\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u548c\u56de\u586b\u60c5\u51b5\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u4e4b\u524d\u5df2\u7ecf\u56de\u586b\u8fc7\u4e86\uff0c\u540e\u7eed\u5c31\u4e0d\u4f1a\u518d\u6b64\u89e6\u53d1\u56de\u586b\u4e86\uff1b \u5982\u679c\u4f60\u60f3\u91cd\u65b0\u505a\u56de\u586b\uff0c\u4f60\u53ef\u4ee5\u628a report/pms_xxx \u76ee\u5f55\u5220\u6389\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u91cd\u65b0\u505a\u6570\u636e\u56de\u586b\u4e86\uff1b"},{"location":"#24-csv","title":"2.4. \u5bfc\u51fa CSV \u6587\u4ef6","text":"\u6846\u67b6\u63d0\u4f9b\u5bfc\u51fa\u6307\u5b9a\u6807\u7b7e\u7528\u4f8b\u7684\u529f\u80fd\uff1a youqu manage.py exportcsv -a deepin-album -t CICD\n \u8868\u793a\u5bfc\u51fa deepin-album \u7684\u7528\u4f8b\u4e2d\u6807\u8bb0\u4e86 CICD \u6807\u7b7e\u7684\u7528\u4f8b\uff0c\u5bfc\u51fa CSV \u6587\u4ef6\u7684\u5b57\u6bb5\u683c\u5f0f\u5df2\u7ecf\u9002\u914d\u4e86 CICD \u7684\u8981\u6c42\u3002"},{"location":"#25-app","title":"2.5. \u811a\u624b\u67b6\u65b0\u5efa APP \u5de5\u7a0b","text":"\u65b0\u5efa\u4e00\u4e2a APP \u5de5\u7a0b\uff1a youqu manage.py startapp autotest_deepin_some \u8fd9\u6837\u5728 apps \u76ee\u5f55\u4e0b\u4f1a\u521b\u5efa\u4e00\u4e2a\u5b50\u9879\u76ee\u5de5\u7a0b autotest_deepin_some\uff0c\u540c\u65f6\u65b0\u5efa\u597d\u5de5\u7a0b\u6a21\u677f\u76ee\u5f55\u548c\u6a21\u677f\u6587\u4ef6\uff1a apps\n\u2514\u2500\u2500 autotest_deepin_some\n \u00a0\u00a0 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_case.py\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 config.ini\n \u00a0\u00a0 \u251c\u2500\u2500 config.py\n \u00a0\u00a0 \u251c\u2500\u2500 conftest.py\n \u00a0\u00a0 \u251c\u2500\u2500 control\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_assert.py\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some.csv\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u2514\u2500\u2500 widget\n \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 case_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 other.ini\n \u00a0\u00a0 \u251c\u2500\u2500 other_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 pic_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2514\u2500\u2500 ui.ini\n autotest_deepin_some \u662f\u4f60\u7684\u5de5\u7a0b\u540d\u79f0\uff0c\u6bd4\u5982\uff1aautotest_deepin_music \uff1b \u5728\u6b64\u57fa\u7840\u4e0a\uff0c\u4f60\u53ef\u4ee5\u5feb\u901f\u7684\u5f00\u59cb\u4f60\u7684 AT \u9879\u76ee\u3002"},{"location":"#26","title":"2.6. \u7528\u4f8b\u6807\u7b7e\u81ea\u52a8\u540c\u6b65","text":"\u7528\u4e8e\u81ea\u52a8\u540c\u6b65 PMS \u7528\u4f8b\u6807\u7b7e\u6570\u636e\u81f3\u672c\u5730 CSV \u6587\u4ef6\uff0c\u4e3b\u8981\u901a\u8fc7\u4ee5\u4e0b\u51e0\u4e2a\u914d\u7f6e\u6765\u63a7\u5236\uff1a APP_NAME = # \u6307\u5b9a\u8981\u540c\u6b65\u7684\u5e94\u7528\u540d\u79f0\nPMS_USER = # PMS\u7684\u7528\u6237\u540d\nPMS_PASSWORD = # PMS\u7684\u5bc6\u7801\n \u5728 [csv_link_pms_id] \u8282\u70b9\u4e0b\u6307\u5b9a csv \u6587\u4ef6\u540d\u4e0e PMS \u7528\u4f8b\u6a21\u5757\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u6bd4\u5982\uff1a [csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/testcase-browse-53.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 53\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic = 53\n \u5c06\u4ee5\u4e0a\u4fe1\u606f\u914d\u7f6e\u597d\u4e4b\u540e\uff0c\u5728\u547d\u4ee4\u884c\u6267\u884c\uff1a youqu manage.py pms --pms2csv yes\n \u6bcf\u6b21\u6267\u884c\u65f6\u539f csv \u6587\u4ef6\u4f1a\u81ea\u52a8\u5907\u4efd\u5728 report/csv_back \u76ee\u5f55\u4e0b\uff0c\u56e0\u6b64\u4f60\u4e0d\u7528\u62c5\u5fc3\u811a\u672c\u6267\u884c\u5bfc\u81f4\u4f60\u7684\u6570\u636e\u4e22\u5931\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u57fa\u7840\u6846\u67b6\u8bbe\u8ba1\u65b9\u6848","text":"# ====================================\n# Author : Mikigo\n# Time : 2022/3/18\n# version \uff1a1.0\n# ====================================\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"\u505a\u4e00\u4e2a\u7b80\u5355\u3001\u597d\u7528\u3001\u529f\u80fd\u5f3a\u5927\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u3002 \u4f5c\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4e00\u4e2a\u57fa\u7840\u6846\u67b6\uff0c\u4efb\u4f55\u5e94\u7528\u90fd\u80fd\u5f88\u65b9\u4fbf\u7684\u63a5\u5165\u8fdb\u6765\uff1b \u63d0\u4f9b\u6240\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u9700\u8981\u7684\u5e95\u5c42\u529f\u80fd\uff0c\u5e76\u5bf9\u5916\u63d0\u4f9b\u552f\u4e00\u7684\u63a5\u53e3\uff0c\u65b9\u4fbf\u5e94\u7528\u5e93\u4f7f\u7528\uff1b \u6574\u5408\u516c\u5171\u5e93\uff0c\u51cf\u5c11\u5e94\u7528\u5e93\u4ee3\u7801\u91cf\u548c\u65b9\u6cd5\u7ef4\u62a4\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u8bbe\u8ba1\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u7edf\u4e00\u6982\u5ff5","text":" \u57fa\u7840\u6846\u67b6 \u672c\u9879\u76ee\u662f\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\uff08AutoTest Basic Frame\uff09\uff0c\u5168\u79f0\u4e3a\u201c\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff08AT \u57fa\u7840\u6846\u67b6\uff09\u201d\u3002 AT \u57fa\u7840\u6846\u67b6\u662f\u505a\u4e3a\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\u6765\u8bbe\u8ba1\u7684\uff0c\u5b83\u63d0\u4f9b\u4e86\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u57fa\u7840\u529f\u80fd\uff0c\u4efb\u4f55\u5e94\u7528\u63a5\u5165\u8fdb\u6765\u90fd\u80fd\u5feb\u901f\u65b9\u4fbf\u7684\u8fdb\u884c\u65b9\u6cd5\u548c\u7528\u4f8b\u7f16\u5199\uff0c\u540c\u65f6\u5728\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u3001\u6807\u7b7e\u5316\u6267\u884c\u3001\u5206\u5e03\u5f0f\u6267\u884c\u3001\u591a\u79cd\u62a5\u544a\u8f93\u51fa\u3001\u4f18\u7f8e\u7684\u6267\u884c\u65e5\u5fd7\u3001\u5931\u8d25\u81ea\u52a8\u5f55\u5c4f\u548c\u622a\u56fe\u3001\u81ea\u52a8\u73af\u5883\u6e05\u7406\u7b49\u7b49\uff0c\u5b83\u90fd\u63d0\u4f9b\u4e86\u5b8c\u5584\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u66f4\u91cd\u8981\u7684\u662f\u8fd9\u4e00\u5207\u4f7f\u7528\u8d77\u6765\u90fd\u975e\u5e38\u7b80\u5355\u3002 \u57fa\u7840\u6846\u67b6\u4e2d\u5305\u542b\u5e94\u7528\u5e93\uff08apps\uff09\u3001\u6838\u5fc3\u5e93\uff08src\uff09\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09\u3002 \u5e94\u7528\u5e93\uff08apps\uff09 \u5404\u4e2a\u5e94\u7528\u81ea\u5df1\u7684\u4ed3\u5e93\uff0c\u91cc\u9762\u4e3b\u8981\u5305\u542b\u7684\u662f\u7528\u4f8b\u3001\u65b9\u6cd5\u53ca\u4e00\u4e9b\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u53eb autotest-dde-file-manager \u3002 \u6838\u5fc3\u5e93\uff08src\uff09 \u6838\u5fc3\u5e93\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u5230\u6240\u6709\u5e95\u5c42\u6838\u5fc3\u529f\u80fd\uff0c\u8fd9\u662f\u6700\u91cd\u8981\u7684\u4e00\u4e2a\u90e8\u5206\uff0c\u7075\u9b42\u3002\u5177\u4f53\u529f\u80fd\u6a21\u5757\u53ca\u8bf4\u660e\u4f1a\u5728\u4e0b\u9762\u7b2c\u56db\u4e2a\u7ae0\u8282\u8be6\u7ec6\u63cf\u8ff0\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09 \u591a\u4e2a\u5e94\u7528\u90fd\u8981\u7528\u5230\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\uff0c\u6309\u7167\u5e94\u7528\u5212\u5206\u5b58\u653e\uff0c\u4e3b\u8981\u662f\u4e3a\u4e86\u51cf\u5c11\u4ee3\u7801\u91cf\uff0c\u6d88\u9664\u5e94\u7528\u95f4\u7684\u8026\u5408\u5173\u7cfb\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u67b6\u6784\u56fe","text":"\u6574\u4f53\u7684\u6846\u67b6\u8bbe\u8ba1\u5728\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u300b\u6587\u6863\u91cc\u9762\u5df2\u7ecf\u6709\u8be6\u7ec6\u63cf\u8ff0\u4e86\uff0c\u8fd9\u91cc\u8d34\u4e00\u4e0b\u6574\u4f53\u7684\u67b6\u6784\u56fe\uff1a \u4e3a\u4e86\u7a81\u663e\u672c\u6587\u7684\u91cd\u70b9\uff0c\u62bd\u53d6\u5176\u4e2d\u91cd\u8981\u529f\u80fd\u6a21\u5757\uff0c\u5982\u4e0b\u56fe\uff1a "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-basic-frame # \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\n\u251c\u2500\u2500 apps # \u5e94\u7528\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-dde-file-manager # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\uff08\u5e94\u7528\u5e93\u8be6\u7ec6\u76ee\u5f55\u7ed3\u6784\u8bf7\u770b\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\uff09\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 tag # \u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u2514\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u2502 \u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 xxx.png\n\u2502 \u2502 ...\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-deepin-music # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 public # \u516c\u5171\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget # dde_dock \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget # dde_desktop \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 src # \u6838\u5fc3\u5e93\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 button_center.py\n\u2502 \u251c\u2500\u2500 cmdtrl.py\n\u2502 \u251c\u2500\u2500 dogtails.py\n\u2502 \u251c\u2500\u2500 find_image.py\n\u2502 \u251c\u2500\u2500 global_config.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 setting # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 config.py\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 global_config.ini\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\u6a21\u5757\uff08Hook\uff09\n\u251c\u2500\u2500 pytest.ini # Pytest \u9ed8\u8ba4\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 docs # \u6587\u6863\u76ee\u5f55\n\u2514\u2500\u2500 manage.py # \u6267\u884c\u5668\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1apps","title":"1\u3001\u5e94\u7528\u5e93\uff08apps\uff09","text":"\u6240\u6709\u5e94\u7528\u5e93\u5747\u653e\u7f6e\u5728\u57fa\u7840\u6846\u67b6\u4e0b\u7684 apps \u76ee\u5f55\u4e0b\uff08\u89c1\u7b2c\u4e8c\u7ae0\u8282\u7b2c3\u6bb5\u76ee\u5f55\u7ed3\u6784\u5185\u5bb9\uff09\u3002\u5e94\u7528\u5e93\u7684\u67b6\u6784\u8bbe\u8ba1\u53ef\u4ee5\u53c2\u8003\u300aAT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b\u6587\u6863\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2src","title":"2\u3001\u6838\u5fc3\u5e93\uff08src\uff09","text":"\u5728 src \u76ee\u5f55\u4e0b\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u5e95\u5c42\u6838\u5fc3\u7ec4\u4ef6\uff0c\u901a\u5e38\u6765\u8bb2\u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5230\u5176\u4e2d\u67d0\u4e00\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4e48\u4f60\u9700\u8981\u663e\u793a\u7684\u5bfc\u5165\u8fd9\u4e2a\u6a21\u5757\uff0c\u7136\u540e\u624d\u80fd\u4f7f\u7528\u8be5\u6a21\u5757\u4e0b\u7684\u529f\u80fd\uff0c\u5982\u679c\u4f60\u7528\u5230\u4e86\u5341\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4f60\u5c31\u9700\u8981\u5bfc\u5165\u5341\u4e2a\u3002\u4f46\u662f\u6211\u4eec\u60f3\u8ba9\u4e8b\u60c5\u53d8\u5f97\u7b80\u5355\uff0c\u4e00\u6b21\u5bfc\u5165\uff0c\u4f7f\u7528\u6240\u6709\u3002 \u5c06\u6240\u6709\u7684\u529f\u80fd\u6a21\u5757\u90fd\u8fdb\u5165\u5230 src \u7684\u540d\u79f0\u7a7a\u95f4\uff0c\u5728 src/__init__.py \u91cc\u9762\u6211\u4eec\u8bbe\u8ba1\u6210\u8fd9\u6837\uff1a # src/__init__.py\nfrom .cmdctl import CmdCtl\nfrom .dogtails import Dogtail\nfrom .find_image import FindImage\nfrom .button_center import ButtonCenter\nclass Src(CmdCtl, FindImage):\ndef __init__(self, **kwargs):\n\"\"\"dogtail or button center param\n :param kwargs: app_name, desc, number\n \"\"\"\nif kwargs:\napp_name = kwargs.get(\"APP_NAME\")\ndesc = kwargs.get(\"DESC\")\nif app_name is None or desc is None:\nraise ValueError\nnumber = kwargs.get(\"number\")\nnumber = number if isinstance(number, int) else -1\n# \u5bf9\u8c61\u7ec4\u5408\nself.dog = Dogtail(app_name, desc, number)\nself.ui = ButtonCenter(app_name, number)\n \u9700\u8981\u4f20\u9012\u53c2\u6570\u7684\u91c7\u7528\u5bf9\u8c61\u7ec4\u5408\uff0c\u6ca1\u6709\u53c2\u6570\u7684\u4f7f\u7528\u7ee7\u627f\uff0c\u7ee7\u627f\u7684\u7c7b\u7b26\u5408 Mixin \u8bbe\u8ba1\u6a21\u5f0f\u3002 \u5e94\u7528\u5e93\u91cc\u9762\u4f7f\u7528\u7684\u65f6\u5019\u5728 widget/base_widget.py \u91cc\u9762\u53ea\u9700\u8981\u552f\u4e00\u7ee7\u627f Src \uff1a # \u5e94\u7528\u5e93\u91cc\u9762\u65b9\u6cd5\u57fa\u7c7b\n# widget/base_widget.py\nfrom src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n \u8981\u4f7f\u7528\u6838\u5fc3\u5e93\u7684\u529f\u80fd\uff0c\u53ea\u9700\u8981\u5199\u4e00\u4e2a\u5bfc\u5165 from src import Src \u5373\u53ef\u3002 \u5199 __init__ \u6784\u9020\u51fd\u6570\u7684\u539f\u56e0\u662f\u901a\u8fc7\u53c2\u6570\u6784\u9020\u5e94\u7528\uff0c\u5e76\u4e14\u4f20\u9012 number \u8fdb\u6765\uff0c\u53ef\u4ee5\u5b9e\u73b0\u591a\u7a97\u53e3\u7684\u63a7\u5236\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3public","title":"3\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09","text":"\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6bcf\u4e2a\u5e94\u7528\u90fd\u662f\u4e00\u4e2a\u5355\u72ec\u7684 py \u6587\u4ef6\uff0c\u76f8\u4e92\u4e4b\u95f4\u662f\u72ec\u7acb\u7684\uff0c\u6bcf\u4e2a py \u6587\u4ef6\u91cc\u9762\u662f\u8be5\u5e94\u7528\u7684\u65b9\u6cd5\u7c7b\uff0c\u6bd4\u5982\uff1a\u6700\u5e38\u7528\u7684\u65b9\u6cd5\u7c7b dde_desktop_public_widget.py # dde_desktop_widget.py\nfrom src import Src\nclass _DdeDesktopPublicBaseWidget(Src):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-desktop\"\nDESC = \"/usr/bin/dde-desktop\"\ndef __init__(self):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC)\nclass DdeDesktopPublicWidget(_DdeDesktopPublicBaseWidget):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u7c7b\"\"\"\ndef click_music_dir_by_ui(self):\n\"\"\"\u5728\u6587\u4ef6\u9009\u62e9\u6846\u70b9\u51fb\u97f3\u4e50\u76ee\u5f55\"\"\"\nself.click(*self.ui.btn_center(\"\u4fa7\u8fb9\u680f-\u97f3\u4e50\")) \ndef click_xxx_by_attr(self):\npass\n \u516c\u5171\u65b9\u6cd5\u5e93\u610f\u4e49\uff1a \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6240\u5c01\u88c5\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\u90fd\u662f\u81f3\u5c11\u88ab2\u4e2a\u5e94\u7528\u90fd\u7528\u5230\u7684\uff0c\u8fd9\u6837\u505a\u53ef\u4ee5\u51cf\u5c11\u6574\u4f53\u4ee3\u7801\u91cf\uff0c\u4ece\u800c\u51cf\u8f7b\u5e94\u7528\u5e93\u4ee3\u7801\u7684\u7ef4\u62a4\u5de5\u4f5c\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u7f16\u5199\u5f62\u5f0f\uff08\u547d\u540d\u89c4\u5219\u3001\u5b9a\u4f4d\u7684\u65b9\u6848\u5199\u6cd5\u3001\u6ce8\u91ca\u7684\u5199\u6cd5\u7b49\u7b49\uff09\u5177\u6709\u4e00\u5b9a\u7684\u6a21\u677f\u4f5c\u7528\uff0c\u8fd9\u6837\u5373\u4f7f\u662f\u5404\u4e2a\u5e94\u7528\u5e93\u90fd\u72ec\u7acb\u7ef4\u62a4\uff0c\u6240\u6709\u7684\u7f16\u7801\u98ce\u683c\u90fd\u662f\u8d8b\u4e8e\u76f8\u540c\u7684\uff0c\u56e0\u4e3a\u5927\u5bb6\u90fd\u5e94\u8be5\u53c2\u7167\u516c\u5171\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u5199\u6cd5\u6765\u5199\u81ea\u5df1\u5e94\u7528\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\u7c7b\uff0c\u8fd9\u6837\u4f7f\u5f97\u4ece\u516c\u53f8\u7684\u89d2\u5ea6\u53bb\u770b\u6240\u6709\u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u90fd\u662f\u7edf\u4e00\u7684\u3002 \u53ef\u4ee5\u901a\u8fc7\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\uff0c\u4e86\u89e3\u5230\u5176\u4ed6\u5e94\u7528\u7684\u529f\u80fd\uff0c\u5bf9\u4e8e\u6211\u4eec\u9700\u6c42\u7406\u89e3\uff0c\u4e86\u89e3\u7cfb\u7edf\u7684\u65b9\u65b9\u9762\u9762\u4e5f\u6709\u597d\u5904\u3002 \u5f53\u7136\uff0c\u5982\u679c\u4f60\u7684\u5e94\u7528\u672c\u8eab\u662f\u5c5e\u4e8e\u6839\u672c\u5c31\u4e0d\u9700\u8981\u548c\u5176\u4ed6\u5e94\u7528\u4ea4\u4e92\u7684\uff0c\u90a3\u4e48\u4f60\u53ef\u80fd\u4e0d\u4f1a\u7528\u5230\u8fd9\u91cc\u9762\u7684\u529f\u80fd\uff0c\u6ca1\u5173\u7cfb\uff0c\u4f60\u6240\u6709\u7684\u65b9\u6cd5\u90fd\u53ef\u4ee5\u76f4\u63a5\u5199\u5728\u5e94\u7528\u5e93\u7684\u4e1a\u52a1\u5c42\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4conftestpy","title":"4\u3001conftest.py","text":"conftest.py \u4ece\u529f\u80fd\u4e0a\u5c06\u662f\u5c5e\u4e8e\u6838\u5fc3\u5e93\uff08src\uff09\u7684\u5185\u5bb9\uff0c\u4f46\u662f\u7531\u4e8e\u5b83\u7684\u7279\u6b8a\u6027\uff0c\u5373\u5b83\u662f\u5bf9\u5e94\u7528\u5e93\u4e2d\u7684\u7528\u4f8b\u751f\u6548\u7684\uff0c\u800c\u4e14\u5b83\u7684\u4f5c\u7528\u57df\u662f\u5f53\u524d\u76ee\u5f55\u53ca\u4ee5\u4e0b\uff0c\u56e0\u6b64\u6211\u4eec\u5c06\u5b83\u653e\u5230\u9879\u76ee\u6839\u76ee\u5f55\u3002\u6211\u4eec\u6846\u67b6\u4e2d\u6709\u4e0d\u5c11\u6838\u5fc3\u529f\u80fd\u90fd\u662f\u5728\u8fd9\u91cc\u9762\u8fdb\u884c\u5f00\u53d1\u7684\uff0c\u540e\u9762\u7b2c\u56db\u7ae0\u4f1a\u8bb2\u5230\u7ec6\u8282\u3002 pytest.ini \u4f5c\u7528\u548c conftest.py \u7c7b\u4f3c\uff0c\u662f Pytest \u6846\u67b6\u7684\u56fa\u5b9a\u914d\u7f6e\u6587\u4ef6\uff0c\u76ee\u524d\u914d\u7f6e\u4e86\u4e00\u4e9b\u901a\u7528\u7684\u547d\u4ee4\u884c\u6267\u884c\u53c2\u6570\uff0c\u4e5f\u653e\u5728\u9879\u76ee\u6839\u76ee\u5f55\u3002 \u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 Hook \u51fd\u6570\uff0capps \u76ee\u5f55\u4e0b\u7684 \u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 fixture \u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5setting","title":"5\u3001setting","text":"\u5168\u5c40\u914d\u7f6e\u6a21\u5757\uff0c\u5305\u542b\u4e86\u4ee5\u4e0b\u914d\u7f6e\u6587\u4ef6\uff1a \uff081\uff09ini \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u914d\u7f6e\u4e00\u4e9b\u5168\u5c40\u7684\u914d\u7f6e\u9879\uff0c\u8b6c\u5982\uff1a\u5931\u8d25\u91cd\u8dd1\u6b21\u6570\u3001\u662f\u5426\u5931\u8d25\u5f55\u5c4f\u3001\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\u3001\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4\u3001\u6267\u884c\u65f6\u65e5\u5fd7\u7ea7\u522b\u3001\u751f\u6210\u7684\u62a5\u544a\u7c7b\u578b\u3001\u4ee5\u53ca\u5206\u5e03\u5f0f\u6267\u884c\u7684\u4e00\u4e9b\u7b56\u7565\u914d\u7f6e\u9879\u7b49\u7b49\u3002 \uff082\uff09config.py \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u63d0\u4f9b\u914d\u7f6e\u6587\u4ef6\u8bfb\u53d6\u3001\u52a8\u6001\u83b7\u53d6\u4e00\u4e9b\u5e38\u91cf\uff08\u5982\u9879\u76ee\u6839\u76ee\u5f55\u7edd\u5bf9\u8def\u5f84 (BASE_DIR)\u3001\u7cfb\u7edf\u67b6\u6784\uff08SYS_FRAME\uff09\u3001\u65f6\u95f4\u5b57\u7b26\u4e32\uff08strftime\uff09\u3001\u672c\u673a USERNAME IP \u7b49\u7b49\uff09\u3001\u516c\u5171 URL \u7b49\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u89c4\u8303","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u7248\u672c\u53ca\u4f9d\u8d56","text":"\u57fa\u7840\u6846\u67b6\u4f1a\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u8fdb\u884c\u7248\u672c\u53d1\u5e03\uff0c\u4e0d\u4e0e\u67d0\u4e2a\u5e94\u7528\u7248\u672c\u7ed1\u5b9a\uff0c\u4f46\u662f\uff0c\u5e94\u7528\u5e93\u4f1a\u4f9d\u8d56\u4e8e\u57fa\u7840\u6846\u67b6\u7684\u7248\u672c\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u5efa\u8bae\u5728\u5e94\u7528\u5e93\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a\u6587\u672c\u6587\u4ef6\u7528\u4e8e\u8bb0\u5f55\u6240\u4f9d\u8d56\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\uff0c\u7c7b\u4f3c\u4e8e\u5f00\u53d1\u5e94\u7528\u7684 debian/control \u6587\u4ef6\u7684\u529f\u80fd\uff0c\u4e3a\u4e86\u4fdd\u6301\u7edf\u4e00\uff0c\u8fd9\u4e2a\u6587\u4ef6\u5c31\u547d\u540d\u4e3a control\uff0c\u653e\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u6838\u5fc3\u5e93\u72ec\u7acb\u6027","text":"\u6838\u5fc3\u5e93\u4e0d\u5efa\u8bae\u9488\u5bf9\u67d0\u4e00\u4e2a\u5e94\u7528\u5355\u72ec\u505a\u4ee3\u7801\u4e0a\u7279\u6b8a\u5904\u7406\uff0c\u901a\u5e38\u8003\u8651\u9488\u5bf9\u67d0\u4e00\u79cd\u573a\u666f\u8fdb\u884c\u5904\u7406\uff0c\u8fd9\u4e9b\u573a\u666f\u901a\u5e38\u662f\u5b58\u5728\u4e00\u4e9b\u5171\u6027\u7684\u3002\u6bd4\u5982\u8bf4\uff1a\u684c\u9762\u7684ID\u5206\u914d\u5b58\u5728\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u903b\u8f91\u5904\u7406\u89e3\u51b3ID\u5206\u914d\u9519\u8bef\u7684\u95ee\u9898\uff0c\u4f46\u662f\u8fd9\u90e8\u5206\u903b\u8f91\u6211\u4eec\u4f1a\u5728\u684c\u9762\u7684\u65b9\u6cd5\u5c42\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u517c\u5bb9\u6027","text":"\u4e3a\u4e86\u4fdd\u6301\u517c\u5bb9\u6027\uff0c\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u539f\u5219\u4e0a\u4e0d\u5bf9\u8001\u65b9\u6cd5\u8fdb\u884c\u4fee\u6539\u6216\u5220\u9664\uff0c\u53ea\u8fdb\u884c\u65b0\u589e\u3002\u6d89\u53ca\u5230\u8001\u65b9\u6cd5\u4fee\u6539\u6216\u5220\u9664\u7684\uff0c\u4f1a\u8fdb\u884c\u63d0\u524d\u9884\u544a\uff0c\u5e76\u5728\u7b2c\u4e8c\u4e2a\u7248\u672c\u4e4b\u540e\uff08\u4e2d\u95f4\u4f1a\u9694\u4e00\u4e2a\u7248\u672c\u8fc7\u5ea6\uff09\u6b63\u5f0f\u5b9e\u65bd\u4fee\u6539\u6216\u5220\u9664\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u547d\u540d\u89c4\u8303","text":" \u7528\u4f8b ID \u6bcf\u4e2a\u5e94\u7528\u81ea\u5df1\u7ef4\u62a4\u4e00\u5957 ID\uff0c\u5728PMS\u4e0a\u7528\u4f8b\u6807\u9898\u4e0a\u5c06\u81ea\u52a8\u5316ID\u4ee5\u6807\u7b7e\u7684\u5f62\u5f0f\u5199\u5165\uff0c\u6bd4\u5982\uff1a[101]\u6253\u5f00-\u542f\u52a8\u5e94\u7528\u540edock\u53f3\u952e\u83dc\u5355 \u4e00\u4e2a\u7528\u4f8b\u7c7b\u91cc\u9762\u6709\u591a\u4e2a\u7528\u4f8b\u65f6\uff0c\u5728\u7528\u4f8b\u540d\u79f0\u540e\u9762\u52a0\u5e8f\u53f7\u3002 class TestFileManager(BaseCase):\n\"\"\"\u6587\u7ba1\u7528\u4f8b\"\"\"\ndef test_xxx_015_1(self):\npass\ndef test_xxx_015_2(self):\npass\n \u6ce8\u610f 015_1\uff0c\u4e0d\u8981\u5199015_01\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 PMS \u4e0a\u7684\u7528\u4f8bID\uff1a PMS \u4e0a\u662f6\u4f4d\u6570\uff0c\u4e0d\u591f\u76f4\u89c2\uff0c\u4e5f\u4e0d\u597d\u7ef4\u62a4\uff0c\u5728\u81ea\u52a8\u5316\u4e0b\u9762\u53bb\u627e\u4e00\u4e2a\u5e26\u6709 6 \u4f4d\u6570\u7684\u6587\u4ef6\u662f\u4e00\u4e2a\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 PMS \u4e0a\u7684 ID \u53ef\u80fd\u4f1a\u53d1\u751f\u53d8\u5316\uff0c\u6bd4\u5982\u5bfc\u51fa\u6765\u5bfc\u8fdb\u53bb\u7684\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u5b58\u5728\u95ee\u9898\uff0c\u5982\u679c\u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u8981\u60f3\u627e\u51fa\u6765\u5bf9\u5e94\u4fee\u6539\u81ea\u52a8\u5316\u7528\u4f8b ID\uff0c\u5c06\u4f1a\u662f\u4ef6\u975e\u5e38\u75db\u82e6\u7684\u4e8b\u60c5\u3002 \u51fd\u6570\u547d\u540d\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5de6\u952e\u70b9\u51fb click \u53f3\u952e\u70b9\u51fb right_click \u53cc\u51fb double_click \u79fb\u52a8 move_to \u62d6\u52a8 drag \u65b0\u5efa new \u62d6\u52a8\u5230 drag_to \u4ece\u54ea\u91cc\u62d6\u52a8\u5230\u54ea\u91cc drag_something_from_xxx_to_xxx \u83b7\u53d6 get \u83b7\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5750\u6807 get_location \u975e\u7279\u6b8a\u6587\u4ef6 file word\u6587\u4ef6 doc text\u6587\u4ef6 text \u6587\u4ef6\u5939 dir \u5173\u952e\u8bcd\u6301\u7eed\u589e\u52a0 \u5e38\u91cf\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5e94\u7528\u540d\u79f0 APP_NAME \u5e94\u7528\u63cf\u8ff0 DESC \u672c\u5e94\u7528\u4ee5\u5916\u7684\u5176\u4ed6\u5e94\u7528\uff0c\u6bd4\u5982\u5e2e\u52a9 HELP \u5176\u4ed6\u540d\u79f0\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u65b9\u6cd5\u5305\u540d widget \u65b9\u6cd5\u6587\u4ef6\u540d\uff08\u6587\u7ba1\u4e3e\u4f8b\uff09 dfm_widget.pytitle_widget.pyright_view_widget.pyleft_view_widget.pypop_widget.pybase_widget.pydfm_assert.py \u65ad\u8a00\u8bed\u53e5\u547d\u540d\u89c4\u8303 \u65ad\u8a00\u8bed\u53e5\u90fd\u662f\u4ee5 assert \u5f00\u5934 \u65ad\u8a00 \u8bed\u53e5 \u5224\u65ad\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_existsassert_file_not_exists \u5224\u65ad\u684c\u9762\u76ee\u5f55\u4e0b\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_exists_in_desktopassert_file_not_exists_in_desktop \u5224\u65ad\u56fe\u7247\u5b58\u5728 assert_image_existsassert_image_not_exists \u5224\u65ad\u5f71\u9662\u4e2d\u662f\u5426\u5b58\u5728\u56fe\u7247 assert_image_exists_in_movieassert_image_not_exists_in_movie \u5224\u65ad\u5143\u7d20\u662f\u5426\u5b58\u5728 assert_element_existassert_element_not_exist \u5224\u65ad\u662f\u5426\u76f8\u7b49 assert_equalassert_not_equal \u5224\u65ad\u662f\u5426\u4e3a\u771f assert_trueassert_false"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5fixture","title":"5\u3001fixture \u89c4\u8303","text":"\u7531\u4e8e Pytest \u6846\u67b6\u4e2d\u652f\u6301 fixture \u7684\u5199\u6cd5\u548c Xunit \u5199\u6cd5\u7684\uff0c\u6240\u4ee5\u5e94\u7528\u5e93\u4e2d\u53ef\u80fd\u5b58\u5728\u6df7\u7528\u7684\u60c5\u51b5\uff0c\u4e3a\u7edf\u4e00\u7f16\u7801\u98ce\u683c\u65b9\u4fbf\u540e\u7eed\u7528\u4f8b\u4ee3\u7801\u7ef4\u62a4\uff0c\u73b0\u505a\u4ee5\u4e0b\u89c4\u8303\u8bf4\u660e\uff1a \u629b\u5f03 Xunit \u7684\u5199\u6cd5\uff0c\u7edf\u4e00\u91c7\u7528 Pytest fixture \u7684\u5199\u6cd5\u3002 \u5e94\u7528\u5185 fixture \u8c28\u614e\u4f7f\u7528 autouse=True \uff0c\u975e\u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u975e\u5e38\u4e0d\u5efa\u8bae\u4f7f\u7528\u8fd9\u4e2a\u53c2\u6570\u3002 \u8c03\u7528 fixture \u4e0d\u80fd\u4f7f\u7528 @pytest.mark.usefixture()\uff0c\u4f7f\u7528\u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u4f20\u5165\u51fd\u6570\u5bf9\u8c61\u3002 \u5efa\u8bae\u5728\u4e00\u4e2a conftest.py \u91cc\u9762\u53bb\u5199\uff0c\u4e00\u4e2a\u5e94\u7528\u4e5f\u5c3d\u91cf\u7ef4\u62a4\u4e00\u4e2a conftest.py\u6587\u4ef6\u3002 fixture \u4e5f\u9700\u8981\u5199\u529f\u80fd\u8bf4\u660e\uff0c\u51fd\u6570\u540d\u79f0\u8981\u6709\u5177\u4f53\u542b\u4e49\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#6","title":"6\u3001\u65b9\u6cd5\u7f16\u5199\u89c4\u8303","text":" \u65b9\u6cd5\u7c7b\u578b\uff1a if \u6ca1\u6709\u7528\u5230\u5b9e\u4f8b\u5bf9\u8c61\uff1a\nif \u6ca1\u6709\u7528\u5230\u7c7b\u5bf9\u8c61\uff1a\n\u5199\u9759\u6001\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @staticmethod\nelse\uff1a\n\u5199\u7c7b\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @classmethod\nelse:\n\u76f4\u63a5\u5199\u5b9e\u4f8b\u65b9\u6cd5\n \u4e3e\u4f8b: class TitleWidget:\ndef click_xxx_by_ui(self):\npass\n@staticmethod\ndef click_xxx_by_ui():\npass\n@classmethod\ndef click_xxx_by_ui(cls):\npass\n \u51fd\u6570\u540d\u79f0\u4e0d\u51fa\u73b0\u6570\u5b57\uff0c\u9700\u8981\u8868\u793a\u6570\u91cf\u7684\u7528\u5355\u8bcd\u8868\u793a\u3002 \u51fd\u6570\u529f\u80fd\u6ce8\u91ca\u3002 \u6ca1\u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg2:xxx\n\"\"\"\n \u6709\u53c2\u6570\uff0c\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg1:xxx\nreturn: xxx\n\"\"\"\n \u200b \u7528 Pycharm \u7684\u6ce8\u91ca\u6a21\u677f\u4e5f\u53ef\u4ee5\uff0c\u53ea\u8981\u4f53\u73b0\u4e86\u53c2\u6570\u7684\u7c7b\u578b\u548c\u8fd4\u56de\u5c31\u884c\u4e86\u3002 \u6682\u4e0d\u8981\u6c42\u5199\u7c7b\u578b\u6ce8\u89e3\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#7case","title":"7\u3001\u7528\u4f8b\uff08case\uff09\u89c4\u8303","text":" \u4ee5\u7c7b\u7684\u5f62\u5f0f\u5199\u7528\u4f8b\uff0c\u7528\u4f8b\u7c7b\u96c6\u6210\u7528\u4f8b\u57fa\u7c7b\u3002 \u7528\u4f8b\u7c7b\u9700\u8981\u5199\u6ce8\u91ca\u3002 \u6d4b\u8bd5\u7528\u4f8b\u51fd\u6570\u8bf4\u660e\uff08\u5efa\u8bae\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u540d\u79f0\uff09 \"\"\"\u53f3\u4fa7\u9884\u89c8-\u56fe\u7247\u7c7b\u578b\u4fe1\u606f\u680f\u57fa\u672c\u4fe1\u606f\"\"\"\n \u4e0d\u5199\u8c03\u8bd5\u4ee3\u7801 if __name__ == '__main__':\npytest.main()\n \u6240\u6709\u7528\u4f8b\u90fd\u7ee7\u627f BaseCase\u3002 BaseCase \u91cc\u9762\u653e\u4e00\u4e9b\u6d4b\u8bd5\u6570\u636e\u7684\u5e38\u91cf\uff0c\u6bd4\u5982\u6587\u4ef6\u540d\u79f0\uff0c\u5e94\u7528\u540d\u79f0\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u4e00\u4e9b\u901a\u7528\u7684\u5b57\u7b26\u4e32\u3002 \u8fd9\u7c7b\u662f\u5c5e\u4e8e\u6d4b\u8bd5\u6570\u636e\u3002 class BaseCase(DfmAssert):\n\"\"\"\u7528\u4f8b\u57fa\u7c7b\"\"\"\nNEW_FILE = \"\u65b0\u5efa\u6587\u672c.txt\"\nTEST_FILE = \"test.txt\"\nNEW_DIR = \"\u65b0\u5efa\u6587\u4ef6\u5939\"\nNEW_WORD = \"\u65b0\u5efaWord\u6587\u6863.doc\"\nAPP_HELP = \"damn\"\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\n\"\"\"\u7528\u4f8b\u6807\u9898\uff08\u590d\u5236PMS\u4e0a\u7528\u4f8b\u6807\u9898\uff09\"\"\"\ndfm = DfmWidget()\ndfm.click_xxx_by_attr(self.NEW_FILE)\ndfm.new_file_in_desktop_by_cmd(self.NEW_FILE)\nself.assert_true(dfm.get_process_status(self.APP_NAME))\n \u7528\u4f8b\u91cc\u9762\u5c3d\u91cf\u51cf\u5c11\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\uff0c\u66f4\u8981\u51cf\u5c11\u76f8\u540c\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\u3002 \u7edf\u4e00\u6587\u4ef6\u6ce8\u91ca\u5934\u3002 #!/usr/bin/env python3\n# _*_ coding:utf-8 _*_\n\"\"\"\n:Author:email@uniontech.com\n:Date :${DATE} ${TIME}\n\"\"\"\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#8","title":"8\u3001\u5176\u4ed6\u89c4\u8303","text":" \u65e5\u5fd7\u6253\u5370\u8981\u5728\u65b9\u6cd5\u6700\u524d\u9762\uff0c\u5426\u5219\u4ee3\u7801\u62a5\u9519\u6ca1\u6709\u65e5\u5fd7\u8f93\u51fa\uff0c\u4e0d\u597d\u5b9a\u4f4d\u95ee\u9898\u3002\uff08\u6211\u4eec\u4f1a\u8003\u8651\u7ee7\u7eed\u4f7f\u7528\u62e6\u622a\u5668\u6253\u5370\u65e5\u5fd7\uff09 \u6240\u6709\u7684\u64cd\u4f5c\u90fd\u9700\u8981\u6709\u65e5\u5fd7\uff0c\u5305\u62ec sleep()\uff0c\u6211\u4eec\u4f1a\u91cd\u5199\u4e00\u4e2a\u6709\u65e5\u5fd7\u8f93\u5165\u7684 sleep\u3002 \u4e1a\u52a1\u5c42\u65e5\u5fd7\u7ea7\u522b\u4e3a INFO\u3002 hook \u51fd\u6570\u53ea\u80fd\u5199\u5230\u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u91cc\u9762\u3002 apps \u76ee\u5f55\u4e0b\u7684 conftest.py \u539f\u5219\u4e0a\u4e0d\u4f1a\u65b0\u589e fixture\u3002 \u56fa\u5b9a\u76ee\u5f55\u6216\u5143\u7d20\u63a7\u4ef6\u7684\u64cd\u4f5c\uff0c\u5c06\u64cd\u4f5c\u65b9\u6cd5\u5199\u6b7b\uff0c\u6587\u4ef6\u7c7b\u64cd\u4f5c\u5c06\u6587\u4ef6\u540d\u7559\u53c2\u6570\u3002 \u8def\u5f84\u62fc\u63a5\u89c4\u8303\uff1a \u7cfb\u7edf\u4e2d\u56fa\u5b9a\u76ee\u5f55\uff0c\u8def\u5f84\u62fc\u63a5\u65f6\u4f7f\u7528\u6ce2\u6d6a\u7b26\u53f7\uff0c\u6bd4\u5982\uff1a~/Desktop/\uff0c\u4e0b\u5c42\u4f7f\u7528 os.path.expanduser()\uff0c\u5b83\u53ef\u4ee5\u81ea\u52a8\u8bc6\u522b\u6ce2\u6d6a\u7b26\u53f7\u3002 \u9879\u76ee\u4e0b\u8def\u5f84\u4f7f\u7528\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u8def\u5f84\uff0c\u6bd4\u5982\uff1aConfig.BASE_PATH\uff0c\u56e0\u4e3a\u9879\u76ee\u662f\u53ef\u4ee5\u5728\u4efb\u610f\u8def\u5f84\u8fd0\u884c\u7684\uff0c\u9700\u8981\u52a8\u6001\u62fc\u63a5\u8def\u5f84\u3002 "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848","text":"# =================================================\n# Author : Mikigo\n# Time : 2022/3/16\n# version \uff1a1.0\n# =================================================\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"AT \u5e94\u7528\u5e93\u6539\u9020\u662f\u57fa\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u8fdb\u884c\u7528\u4f8b\u65b9\u6cd5\u548c\u4e1a\u52a1\u903b\u8f91\u7684\u91cd\u65b0\u8bbe\u8ba1\uff0c\u4ee5\u5b9e\u73b0\u5e94\u7528\u5e93\u9ad8\u6548\u7684\u7f16\u5199\u3001\u7ef4\u62a4\u7528\u4f8b\u53ca\u5176\u65b9\u6cd5\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u6587\u4ef6\u7ba1\u7406\u5668\u4ece\u4e1a\u52a1\u590d\u6742\u5ea6\u548c\u7528\u4f8b\u91cf\u6765\u8bb2\uff0c\u5728\u7cfb\u7edf\u6240\u6709\u5e94\u7528\u4e2d\uff0c\u662f\u5f88\u6709\u4ee3\u8868\u6027\u7684\uff0c\u96be\u5ea6\u4e5f\u662f\u6700\u5927\u7684\uff0c\u56e0\u6b64\u6211\u4eec\u9009\u53d6\u6587\u4ef6\u7ba1\u7406\u5668\u4f5c\u4e3a\u5e94\u7528\u5e93\u6539\u9020\u7684\u5b9e\u9a8c\u5e94\u7528\uff0c\u7ed9\u540e\u7eed\u5176\u4ed6\u5e94\u7528\u6539\u9020\u63d0\u4f9b\u5207\u5b9e\u53ef\u884c\u7684\u601d\u8def\u548c\u65b9\u6848\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u5206\u5c42\u8bbe\u8ba1\u56fe","text":"\u6574\u4f53\u4ecd\u7136\u9075\u5faa PO \u8bbe\u8ba1\u7406\u5ff5\uff0c\u6839\u636e\u4e1a\u52a1\u9700\u8981\uff0c\u5c06\u6587\u7ba1\u4e1a\u52a1\u5c42\u8fdb\u884c 3 \u5c42\u5212\u5206\uff1a "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-dde-file-manager # \u5e94\u7528\u4ed3\u5e93\n\u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 test_xxx_001.py\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u00a0\u251c\u2500\u2500 __init__.py\n\u2502 \u00a0\u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u00a0\u251c\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u00a0\u251c\u2500\u2500 base_widget.py # \u65b9\u6cd5\u57fa\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 title_widget.py # title \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 right_view_widget.py # right view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 left_view_widget.py # left view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 pop_widget.py # pop \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 dfm_widget.py # \u65b9\u6cd5\u7684\u7edf\u4e00\u51fa\u53e3\n\u2502 \u00a0\u2514\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 tag # \u7528\u4f8b\u6807\u7b7e\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 xxx.csv # \u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2514\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u57fa\u7c7b","text":" \u7ee7\u627f\u6838\u5fc3\u5c42\u7684\u5404\u4e2a\u6a21\u5757\u7c7b\u3002 \u62bd\u53d6\u64cd\u4f5c\u5c42\u7684\u4e00\u4e9b\u57fa\u7840\u65b9\u6cd5\u3002 \u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u7684\u4e00\u4e9b\u516c\u5171\u65b9\u6cd5\u3002 \u8def\u5f84\u7ec4\u88c5\u65b9\u6cd5\u3002 \u4e00\u4e9b\u4e1a\u52a1\u5c42\u76f8\u5173\u7684\u53d8\u91cf\u3001\u5e38\u91cf\u3001shell\u547d\u4ee4\u3001\u5750\u6807\u3002 \u65b9\u6cd5\u57fa\u7c7b\u7684\u5199\u6cd5\uff1a from src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u64cd\u4f5c\u5c42","text":" \u6a21\u5757\u5212\u5206 \u6309\u7167\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u6587\u7ba1\u4e3b\u754c\u9762\u5206\u4e3a\u4e09\u4e2a\u533a\u57df\uff1a\u6807\u9898\u680f\u3001\u53f3\u8fb9\u89c6\u56fe\u533a\u57df\u3001\u5de6\u8fb9\u89c6\u56fe\u533a\u57df \u5f39\u7a97\uff1a\u8bbe\u7f6e\u754c\u9762\u5f39\u7a97\u3001\u4fdd\u9669\u7bb1\u5f39\u7a97\u3001\u5220\u9664\u786e\u8ba4\u5f39\u7a97\u3001\u53ca\u5404\u79cd\u7f51\u7edc\u5f39\u7a97 \u53f3\u952e\u83dc\u5355\uff1a\u6682\u65f6\u4e0d\u8003\u8651\u4e3a\u5355\u72ec\u7684\u6a21\u5757\uff0c\u8003\u8651\u4ee5\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6848\u505a\u6210\u516c\u5171\u5e93\u3002 \u5404\u4e2a\u6a21\u5757\u53ea\u7ee7\u627f\u57fa\u7c7b from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u6784\u9020\u51fd\u6570\u91cc\u9762\u4e0d\u6784\u9020\u5bf9\u8c61\uff0c\u53ef\u4ee5\u521d\u59cb\u5316\u4e00\u4e9b\u53d8\u91cf\u3002 \u4e0d\u540c\u7684\u5b9a\u4f4d\u65b9\u6848\u8c03\u7528\u4e0d\u540c\u7684\u5b9a\u4f4d\u5de5\u5177\u5bf9\u8c61\u3002 self.dog\nself.ui\nself.d_bus\n \u65b9\u6cd5\u7f16\u5199 \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u5e94\u7528\u5c42","text":" \u7ee7\u627f\u64cd\u4f5c\u5c42\u7684\u6240\u6709\u7c7b\u3002 \u4ec5\u4ec5\u7528\u4e8e\u7528\u4f8b\u4e2d\u5bfc\u5165\u65b9\u4fbf\uff0c\u4e0d\u505a\u5176\u4ed6\u4e8b\u60c5\u3002 class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n DfmAssert \u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u7ee7\u627f\uff0c\u65b9\u4fbf\u4f7f\u7528\u65ad\u8a00\u8bed\u53e5\u3002 from apps.dde_file_manager.widget.dfm_widget import DfmWidget\nfrom public.assert import Assert\nclass DfmAssert(Assert):\ndef assert_file_exists_in_desktop(self, file_name):\nself.assert_file_exists(f\"~/Desktop{file_name}\")\n...\nDfmWidget().get_file_in_desktop()\n \u7528\u4f8b\u91cc\u9762\u76f4\u63a5\u7ee7\u627f\uff0c\u65b9\u4fbf\u5728\u7528\u4f8b\u91cc\u9762\u4f7f\u7528 self \u8fdb\u884c\u65ad\u8a00\uff0c\u66f4\u7b26\u5408\u65ad\u8a00\u7684\u4f7f\u7528\u4e60\u60ef\uff0c\u7528\u4f8b\u903b\u8f91\u4e0a\u66f4\u6e05\u695a\u3002 class BaseCase(DfmAssert):\npass\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\nself.assert_file_exists_in_desktop(\"xxx\")\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u903b\u8f91\u4e3e\u4f8b","text":"\u7528\u4f8b\u4ee3\u7801\u8c03\u7528\u903b\u8f91\u4e3e\u4f8b\uff1a # BaseWidget\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n# =============================================\n# TitleWidget\nclass TitleWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_title_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# RightViewWidget\nclass RightViewWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_right_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# =============================================\n# \u51fa\u53e3 DfmWidget\nclass DfmWidget(TitleWidget, RightViewWidget):\npass\n# =============================================\n# in case\nfrom apps.dde_file_manager.widget.dfm_widget import DfmWidget\ndfm = DfmWidget()\ndfm.click_xxx_title_by_ui()\ndfm.click_xxx_right_by_ui()\ndfm.dog.print_desc()\ndfm.ui.print_number()\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u5de5\u7a0b\u6539\u9020\u5b9e\u65bd\u6b65\u9aa4","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_2","title":"1\u3001\u5de5\u7a0b\u4ee3\u7801\u62c9\u53d6","text":"1.1. \u5c06\u81ea\u52a8\u5316\u57fa\u7840\u6846\u67b6\u7684\u529f\u80fd\u62c9\u5230\u672c\u5730 Autotest Basic Frame \uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame 1.2. \u5c06\u5e94\u7528\u5e93\u4ee3\u7801\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u5e94\u7528\u5e93\u7684\u4ed3\u5e93\u547d\u540d\u5e94\u8be5\u662f\u957f\u8fd9\u6837\u7684 autotest_deepin_xxx\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_2","title":"2\u3001\u8c03\u6574\u5de5\u7a0b\u76ee\u5f55","text":"\u6309\u7167 \u65b9\u6848\u8bbe\u8ba1-\u76ee\u5f55\u7ed3\u6784 \u8fdb\u884c\u76ee\u5f55\u8c03\u6574\uff0c\u5c3d\u91cf\u4f7f\u7528\u7f16\u8f91\u5668\u8fdb\u884c\u76f8\u5e94\u7684\u8c03\u6574\uff0c\u7f16\u8f91\u5668\u63a8\u8350\u4f7f\u7528 Pycharm \uff0c\u4ee5\u4e0b\u64cd\u4f5c\u5747\u5728 Pycharm \u91cc\u9762\u53ef\u5b9e\u73b0\u3002 2.1. \u9700\u8981\u79fb\u52a8 py \u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u76f4\u63a5\u5728\u7f16\u8f91\u5668\u91cc\u9762\uff0c\u4f7f\u7528\u9f20\u6807\u9009\u4e2d\u5e76\u6309\u4f4f\uff0c\u4e4b\u540e\u62d6\u52a8\u5230\u76ee\u6807\u4f4d\u7f6e\u5373\u53ef\uff0cPycharm \u4f1a\u5c3d\u53ef\u80fd\u7684\u81ea\u52a8\u89e3\u51b3\u79fb\u52a8\u5bfc\u81f4\u7684\u8def\u5f84\u95ee\u9898\u3002\u6ce8\u610f\uff0c\u6211\u8bf4\u7684\u662f\u201c\u5c3d\u53ef\u80fd\u201d\uff0c\u6709\u4e9b\u9a9a\u64cd\u4f5c\u7f16\u8f91\u5668\u662f\u65e0\u6cd5\u81ea\u52a8\u5904\u7406\u7684\u3002\u5982\u679c\u6ca1\u6709\u88ab\u7f16\u8f91\u5668\u81ea\u52a8\u5904\u7406\u7684\u8def\u5f84\u95ee\u9898\uff0c\u540e\u7eed\u53ea\u80fd\u624b\u52a8\u89e3\u51b3\u3002 2.2. \u9700\u8981\u91cd\u547d\u540d\u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u5728\u7f16\u8f91\u5668\u91cc\u9762\u9009\u4e2d\u6587\u4ef6\uff0c\u7136\u540e\u4f7f\u7528\u5feb\u6377\u952e Shift + F6 \uff08\u5982\u679c\u5feb\u6377\u952e\u6ca1\u53cd\u5e94\uff0c\u6587\u4ef6\u53f3\u952e\u83dc\u5355 Refactor \u2014\u2014 Rename\uff09\uff0c\u7136\u540e\u5728\u8f93\u5165\u6846\u4e2d\u8f93\u5165\u8981\u91cd\u547d\u540d\u7684\u540d\u79f0\uff0c\u540c\u65f6\uff0c\u786e\u8ba4\u52fe\u9009 Search for references \u548c Search in comments and strings \u8fd9\u4e24\u4e2a\u9009\u9879\uff0c\u6700\u540e\u6309\u56de\u8f66\u6216\u8005\u9f20\u6807\u70b9 Refactor \u3002 \u6ce8\u610f\uff0c\u6b64\u65f6\u7f16\u8f91\u5668\u53ef\u80fd\u4f1a\u63d0\u793a\u4f60\uff0c\u4f60\u8fd9\u4e2a\u91cd\u547d\u540d\u7684\u64cd\u4f5c\u5173\u8054\u4e86\u591a\u4e2a\u6a21\u5757\uff0c\u5b83\u88ab\u591a\u4e2a\u5730\u65b9\u90fd\u4f7f\u7528\u5230\u4e86\uff0c\u76f8\u5173\u7684\u6a21\u5757\u662f\u5426\u4e5f\u4e00\u8d77\u6539\u540d\u4e86\uff0c\u8fd9\u4e0d\u5e9f\u8bdd\u5417\uff0c\u7528\u8fd9\u4e2a\u529f\u80fd\u5c31\u662f\u60f3\u628a\u5173\u8054\u5230\u7684\u90fd\u4fee\u6539\uff0c\u4e0d\u7136\u6211\u4e3a\u4ec0\u4e48\u4e0d\u7528\u6587\u7ba1\u7684\u91cd\u547d\u540d\u529f\u80fd\u5462\uff0c\u522b\u60f3\u4e86\uff0c\u76f4\u63a5\u70b9\u5de6\u4e0b\u89d2\u7684 Refactor \u6309\u94ae\uff0c\u5c31\u662f\u5e72\u3002 \u7c7b\u540d\u3001\u51fd\u6570\u540d\u7684\u91cd\u547d\u540d\u90fd\u5c3d\u91cf\u91c7\u7528\u8fd9\u79cd\u65b9\u6848\uff0c\u56e0\u4e3a\u7f16\u8f91\u5668\u4f1a\u81ea\u52a8\u7ed9\u6211\u4eec\u627e\u5230\u5173\u8054\u7684\u5730\u65b9\uff0c\u7136\u540e\u540c\u6b65\u4fee\u6539\u6389\u3002\u4f60\u53ef\u5343\u4e07\u522b\u76f4\u63a5\u5220\u4e86\u4fee\u6539\u540d\u79f0\uff0c\u4e0d\u7136\u4f60\u53ef\u80fd\u4f1a\u82b1\u4e0a\u4e00\u5929\u7684\u65f6\u95f4\u6765\u89e3\u51b3\u91cd\u547d\u540d\u7684\u95ee\u9898\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u5b9e\u73b0\u6838\u5fc3\u5e93\u63a5\u53e3","text":"3.1. BaseWidget \u5728 BaseWidget \u91cc\u9762\u628a\u8be5\u5199\u7684\u90fd\u5199\u597d\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u4e0a\u9762\u7684\u8bbe\u8ba1\u7406\u5ff5\u6765\u5199\u3002 \u5982\u679c\u4f60\u5acc\u9ebb\u70e6\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u6587\u7ba1\u7684\u5b9e\u9645\u5de5\u7a0b\u4ee3\u7801 autotest_dde_file_manager : https://gerrit.uniontech.com/admin/repos/autotest_dde_file_manager \u3002 3.2. \u64cd\u4f5c\u5c42 \u5982\u679c\u4f60\u662f\u65b0\u5199\u9879\u76ee\uff0c\u4f60\u4f1a\u53d1\u73b0\u4e00\u5207\u90fd\u662f\u90a3\u4e48\u7684\u7b80\u5355\u3001\u76f4\u63a5\uff0c\u6309\u7167\u6211\u4eec\u63d0\u4f9b\u7ed9\u4f60\u7684\u63a5\u53e3\u5199\u7528\u4f8b\u7684\u64cd\u4f5c\u65b9\u6cd5\u5c31\u597d\u4e86\u3002 \u5982\u679c\u4f60\u662f\u60f3\u5bf9\u539f\u6765\u7684\u5de5\u7a0b\u8fdb\u884c\u6539\u9020\uff0c\u4f60\u9700\u8981\u6309\u7167\u6838\u5fc3\u5e93\u65b9\u6cd5\u7684\u8c03\u7528\uff0c\u5c06\u4f60\u4e4b\u524d\u5199\u7684\u6bcf\u4e2a\u65b9\u6848\u8fdb\u884c\u5bf9\u5e94\u7684\u4fee\u6539\uff0c\u5305\u62ec\u7c7b\u548c\u65b9\u6cd5\u7684\u547d\u540d\u3001\u65b9\u6cd5\u5185\u6240\u8981\u7528\u5230\u4e0d\u540c\u5b9a\u4f4d\u65b9\u6cd5\u7684\u5199\u6cd5\u4fee\u6539\u3002 \u8fd9\u65f6\u5019\u4f60\u53ef\u80fd\u4f60\u7684\u4ee3\u7801\u4e2d\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u62a5\u9519\uff0c\u4e0d\u7528\u62c5\u5fc3\uff0c\u4f60\u53ef\u4ee5\u4ece\u4e1a\u52a1\u903b\u8f91\u51fa\u53d1\uff0c\u60f3\u6e05\u695a\u8fd9\u4e2a\u65b9\u6cd5\u662f\u5e72\u4ec0\u4e48\u7684\u3001\u64cd\u4f5c\u7684\u5bf9\u8c61\u662f\u4ec0\u4e48\u3001\u53c2\u6570\u662f\u4ec0\u4e48\uff0c\u6ce8\u610f\u8fd9\u4e9b\u4fee\u6539\u662f\u4f1a\u5f71\u54cd\u5230\u7528\u4f8b\u4ee3\u7801\u91cc\u9762\u7684\uff0c\u6ca1\u5173\u7cfb\uff0c\u7528\u4f8b\u91cc\u9762\u672c\u6765\u4e5f\u5e94\u8be5\u88ab\u5173\u8054\u4fee\u6539\u3002 3.3. \u628a\u914d\u7f6e\u6a21\u5757\u5199\u597d\uff0c\u8fd9\u90e8\u5206\u57fa\u672c\u53ef\u4ee5\u590d\u5236\u6587\u7ba1\u7684\u4ee3\u7801\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4_1","title":"4\u3001\u8def\u5f84\u5904\u7406","text":"4.1. \u5bfc\u5165\u8def\u5f84 \u65b9\u6cd5\u548c\u7528\u4f8b\u4e2d\u90fd\u4f1a\u6d89\u53ca\u5230\u5bfc\u5165\u8def\u5f84\u7684\u4fee\u6539\uff0c\u5728\u4fee\u6539\u8def\u5f84\u65f6\uff0c\u5efa\u8bae\u4f60\u4f7f\u7528 Ctrl + Shift + R \u5168\u5c40\u66ff\u6362\uff0c\u4f1a\u5c06\u6574\u4e2a\u9879\u76ee\u4e0b\u7684\u76f8\u540c\u5730\u65b9\u90fd\u4fee\u6539\u5230\uff0c\u5f53\u7136\uff0c\u4f60\u4e5f\u53ef\u4ee5\u5728\u5c0f\u5f39\u7a97\u4e2d\u4fee\u6539\u5168\u5c40\u66ff\u6362\u4e3a\u5c40\u90e8\u76ee\u5f55\u4e0b\u66ff\u6362\u3002\u5904\u7406\u90a3\u79cd\u6ca1\u6709\u5173\u8054\u5173\u7cfb\uff0c\u4f46\u662f\u53c8\u662f\u76f8\u540c\u540d\u79f0\u7684\u91cd\u547d\u540d\uff0c\u6211\u4e5f\u63a8\u8350\u4f7f\u7528\u8fd9\u79cd\u65b9\u5f0f\u8fdb\u884c\u91cd\u547d\u540d\u3002 \u6ce8\u610f\uff0c\u5168\u5c40\u66ff\u6362\u7684\u65b9\u5f0f\u4efb\u7136\u65e0\u6cd5\u4fdd\u8bc1\u771f\u7684\u5168\u5c40\u88ab\u66ff\u6362\u4e86\uff08\u53ef\u80fd\u662f\u7f16\u8f91\u5668\u7684 Bug \u5427\uff09\uff0c\u6240\u4ee5\u4f60\u4ecd\u7136\u9700\u8981\u624b\u52a8\u770b\u4e0b\u5404\u5904\u662f\u5426\u4fee\u6539\u5230\u4f4d\u3002 4.2. \u8d44\u6e90\u8def\u5f84 \u4e00\u4e9b\u7528\u4f8b\u8d44\u6e90\u9700\u8981\u6839\u636e config.py \u91cc\u9762\u7684\u8def\u5f84\u914d\u7f6e\u8fdb\u884c\u8d44\u6e90\u8def\u5f84\u7684\u62fc\u63a5\uff0c\u5982\u679c\u4f60\u539f\u6765\u672c\u6765\u5c31\u6709\u4e00\u4e2a\u51fd\u6570\u4e13\u95e8\u7528\u4e8e\u7ec4\u88c5\u8def\u5f84\u7684\uff0c\u90a3\u4f60\u53ea\u9700\u8981\u4fee\u6539\u8fd9\u4e00\u4e2a\u5730\u65b9\u5c31\u597d\u4e86\uff0c\u5982\u679c\u4f60\u4e4b\u524d\u5e76\u6ca1\u6709\u8fd9\u6837\u7684\u8bbe\u8ba1\uff0c\u90a3\u53ef\u80fd\u9700\u8981\u4fee\u6539\u5927\u91cf\u6d89\u53ca\u5230\u8d44\u6e90\u8def\u5f84\u7684\u5730\u65b9\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5","title":"5\u3001\u8c03\u8bd5\u548c\u7f16\u5199\u7528\u4f8b","text":"\u4ee5\u4e0a\u51e0\u4e2a\u6b65\u9aa4\u505a\u5b8c\uff0c\u57fa\u672c\u5c31\u53ef\u4ee5\u8fdb\u884c\u7528\u4f8b\u4ee3\u7801\u7684\u8c03\u8bd5\u4e86\uff0c\u8fd9\u90e8\u5206\u5de5\u4f5c\u4e3b\u8981\u89e3\u51b3\u4f60\u4e4b\u524d\u51e0\u4e2a\u6b65\u9aa4\u9057\u6f0f\u7684\u95ee\u9898\uff0c\u5982\u679c\u6240\u6709\u7528\u4f8b\u90fd\u8c03\u8bd5\u901a\u8fc7\u4e86\uff0c\u90a3\u4e48\u5de5\u7a0b\u6539\u9020\u5c31\u5168\u90e8\u5b8c\u6210\u4e86\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/","title":"AT \u5f00\u53d1\u89c4\u8303","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u5f00\u53d1\u89c4\u8303\u662f\u6839\u636e\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fd0\u884c\u4e24\u5e74\u591a\u6765\uff0c\u9047\u5230\u95ee\u9898\u89e3\u51b3\u95ee\u9898\u800c\u5f62\u6210\u7684\u4e00\u4e9b\u89e3\u51b3\u65b9\u6848\uff0c\u6216\u8005\u8bf4\u7ecf\u9a8c\u603b\u7ed3\uff1b\u8fd9\u4e9b\u7ecf\u9a8c\u7b26\u5408\u6211\u4eec\u73b0\u9636\u6bb5 AT \u6240\u5e94\u7528\u7684\u573a\u666f\u9700\u8981\uff0c\u4e5f\u662f\u6211\u4eec\u7ecf\u8fc7\u957f\u671f\u601d\u8003\uff0c\u4e0d\u65ad\u8bd5\u9519\u4e0d\u65ad\u4fee\u6b63\uff0c\u5e76\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u5b9e\u8df5\u4e2d\u68c0\u9a8c\u8fc7\u53ef\u884c\u7684\u3002\u4ee5\u6b64\uff0c\u5e0c\u671b\u80fd\u5e2e\u52a9\u53c2\u4e0e\u5230\u81ea\u52a8\u5316\u7684\u76f8\u5173\u4eba\u5458\u51cf\u5c11\u8bd5\u9519\u6210\u672c\uff0c\u66f4\u597d\u3001\u66f4\u5feb\u7684\u7f16\u5199\u7528\u4f8b\u53ca\u7ef4\u62a4\u7528\u4f8b\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_1","title":"\u4e00\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u89c4\u8303","text":"\u6807\u7b7e\u5316\u7ba1\u7406\u6587\u6863\u8bf7\u53c2\u8003\uff1a \u300a\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u64cd\u4f5c\u6307\u5f15\u300b \u4ee5\u4e0b\u8bf4\u51e0\u4e2a\u5bb9\u6613\u51fa\u73b0\u7684\u95ee\u9898\uff1a"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1","title":"1. \u5bf9\u5e94\u5173\u7cfb","text":" \u5199\u5b8c\u81ea\u52a8\u5316\u7528\u4f8b\u4e4b\u540e\uff0c\u8bf7\u5728 CSV \u6587\u4ef6\u4e2d\u6807\u8bb0\u7528\u4f8b\u7684 ID\u3001\u7b49\u7ea7\u3002\u4e3a\u4e86\u63d0\u9192\u6807\u8bb0\uff0c\u6267\u884c\u7528\u4f8b\u65f6\u5728\u9996\u884c\u4f1a\u8f93\u51fa ERROR \u65e5\u5fd7\uff1a CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94\u7684 ID\uff1b \u5728\u6700\u7ec8\u63d0\u4ea4\u4ee3\u7801\u4e4b\u524d\uff0c\u4f60\u9700\u8981\u5728 CSV \u6587\u4ef6\u91cc\u9762\u5c06ID\u3001\u7528\u4f8b\u7b49\u7ea7\u7b49\u6807\u7b7e\u8865\u5168\uff0c\u5982\u679c CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94 ID\uff0c\u540e\u7eed\u5728\u6279\u91cf\u6267\u884c\u7684\u65f6\u5019\uff0c\u8fd9\u4e9b\u7528\u4f8b\u662f\u4e0d\u4f1a\u6267\u884c\u7684\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2","title":"2. \u540d\u79f0\u4e00\u81f4","text":" CSV \u6587\u4ef6\u7684\u6587\u4ef6\u540d\u3001\u7528\u4f8b\u51fd\u6570\u4e2d\u95f4\u7684\u540d\u79f0\u4e00\u81f4\u3001\u7528\u4f8b py \u6587\u4ef6\u4e2d\u95f4\u7684\u540d\u79f0\uff0c\u8fd9\u4e09\u4e2a\u540d\u79f0\u4e00\u81f4\u3002 \u4e3e\u4f8b\uff1a # test_music_001.py\ndef test_music_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u90a3\u4e48 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e3a music.csv\u3002 AT \u6846\u67b6\u5e95\u5c42\u4ee3\u7801\u5b9e\u73b0\u662f\u5c06 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e0e\u7528\u4f8b\u51fd\u6570\u540d\u79f0\u540d\u79f0\uff08item.name\uff09\u8fdb\u884c\u5bf9\u5e94\uff0c\u56e0\u6b64\uff0c\u6ce8\u610f CSV \u6587\u4ef6\u540d\u79f0\u5bf9\u5e94\u7684\u662f\u7528\u4f8b\u51fd\u6570\u540d\u79f0\uff0c\u5373 def test_music_001 \u91cc\u9762\u7684 music \uff0c\u800c\u4e0d\u662f test_music_001.py \u91cc\u9762\u7684 music \u3002 \u8fd9\u91cc\u7ec6\u7ec6\u54c1\u4e00\u4e0b\u54c8~ \u5982\u679c\u4f60\u5c06\u4e0a\u4f8b\u5199\u6210\u4e86\u8fd9\u6837: # test_music_001.py\ndef test_movie_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u7528\u4f8b\u6267\u884c\u6ca1\u95ee\u9898\uff0c\u4f46\u662f\u6807\u7b7e\u5316\u7ba1\u7406\u662f\u4e0d\u751f\u6548\u7684\uff0c\u6846\u67b6\u65e0\u6cd5\u5c06 music.csv\u6587\u4ef6\u91cc\u9762\u6807\u7b7e\uff0c\u6dfb\u52a0\u5230 test_movie_001\u8fd9\u4e2a\u7528\u4f8b\u4e2d\uff0c\u56e0\u4e3a\u4ed6\u4eec\u6ca1\u6709\u5bf9\u5e94\u5173\u7cfb\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#tag","title":"\u4e8c\u3001\u5206\u652f\u53ca tag \u7ba1\u7406\u89c4\u8303","text":"\u53c2\u8003\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u4ee3\u7801\u7ba1\u7406\u89c4\u8303\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2-tag","title":"2. \u5e94\u7528\u5e93 tag","text":" \u5e94\u7528\u5e93 tag \u6839\u636e\u5e94\u7528\u4ea4\u4ed8\u8282\u70b9\u751f\u6210\uff0c\u6bcf\u6b21\u6253 tag \u4e4b\u524d\uff0c\u76f8\u5173\u6d4b\u8bd5\u4eba\u5458\u9700\u8981\u8fdb\u884c\u7528\u4f8b\u8c03\u8bd5\uff1b \u8c03\u8bd5\u7528\u4f8b\u662f\u6307\u7684\u5728\u5168\u67b6\u6784\uff08x86\u3001arm\u3001mips\uff09\u4e0a\u8c03\u8bd5\u901a\u8fc7\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\u8fbe\u5230 90% \u4ee5\u4e0a\u624d\u80fd\u6253 tag\uff0c\u901a\u8fc7 Jenkins \u6267\u884c\u5668\u6267\u884c\u7528\u4f8b\uff0c\u4fdd\u7559\u901a\u8fc7\u7387\u7ed3\u679c\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\uff1a\u901a\u8fc7\u7528\u4f8b\u6570 / (\u603b\u7528\u4f8b\u6570 - \u5df2\u5e9f\u5f03\u7528\u4f8b) \u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u7b97\u901a\u8fc7 Jenkins \u6267\u884c\u5668 \u4f60\u53ef\u80fd\u4f1a\u5728\u4e00\u4e2a\u4ea4\u4ed8\u5468\u671f\u5185\u6301\u7eed\u7684\u8fdb\u884cAT\u7528\u4f8b\u8c03\u8bd5\uff0c\u4f46\u662f\u6700\u7ec8 AT \u7528\u4f8b\u6253 tag \u7684\u5e94\u7528\u7248\u672c\uff0c\u9700\u8981\u4f7f\u7528\u5e94\u7528\u96c6\u6210\u4ea4\u4ed8\u7684\u6700\u65b0\u5e94\u7528\u7248\u672c\uff0c\u53ef\u4ee5\u4f7f\u7528\u5e94\u7528\u7684\u63d0\u6d4b\u7248\u672c\uff1b\u4e00\u5b9a\u8981\u786e\u4fdd\u8c03\u8bd5\u7528\u4f8b\u7684\u5e94\u7528\u7248\u672c\u662f\u6700\u65b0\u7684\uff0c\u4e0d\u7136\u96c6\u6210\u8fdb\u53bb\u4e4b\u540e\uff0c\u6301\u7eed\u96c6\u6210\u5c31\u4f1a\u51fa\u95ee\u9898\uff1b tag \u53f7\u600e\u4e48\u6253\uff1f \u6839\u636e\u6301\u7eed\u96c6\u6210\u7684\u8981\u6c42\u751f\u6210\uff0c\u5176\u4e2d\u5e94\u7528\u7248\u672c\u53f7\u9700\u8981\u4e0e\u9879\u76ee\u7ecf\u7406\u786e\u8ba4\u672c\u6b21\u5373\u5c06\u96c6\u6210\u7684\u5e94\u7528\u7248\u672c\u53f7\u662f\u591a\u5c11\uff1b tag \u7684 commit \u4fe1\u606f\u683c\u5f0f\uff1a # commit msg\nversion:5.6.5\n \u5176\u4e2d 5.6.5 \u5199\u5e94\u7528\u7684\u96c6\u6210\u7248\u672c\u53f7\u3002 \u751f\u6210 tag \u7684\u547d\u4ee4\u53c2\u8003\uff1a\u300aGit \u6807\u7b7e\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3-tag","title":"3. \u57fa\u7840\u6846\u67b6 tag","text":"\u57fa\u7840\u6846\u67b6 tag \u4e0d\u4e0e\u4e1a\u52a1\u6302\u94a9\uff0c\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u6309\u9700\u53d1\u5e03\u7248\u672c\uff0c\u5728\u6839\u76ee\u5f55\u4e0b CURRENT \u6587\u4ef6\u4e2d\u8bb0\u5f55\u7684\u5f53\u524d\u7248\u672c\u53f7\u548c\u5386\u53f2\u7248\u672c\u53f7\uff0c\u53ca\u5176\u5bf9\u5e94\u65b0\u589e\u4e86\u54ea\u4e9b\u529f\u80fd\uff0c\u6709\u52a9\u4e8e\u5e94\u7528\u9009\u62e9\u5408\u9002\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\u3002 # CURRENT\n[current]\ntag = 0.9.5\n \u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u7684 control \u6587\u4ef6\u8bb0\u5f55\u5f53\u524d\u5e94\u7528\u5e93\u4f9d\u8d56\u7684\u57fa\u7840\u5e93\u7248\u672c\u3002 # control\n[Depends]\nautotest-basic-frame = 0.9.5\n \u7528\u4f8b\u5728\u6267\u884c\u65f6\u4f1a\u6821\u9a8c\u4e24\u4e2a\u6587\u4ef6\u7684\u7248\u672c\u53f7\u662f\u5426\u4e00\u81f4\uff0c\u5982\u679c\u4e0d\u4e00\u81f4\uff0c\u4f1a\u6253\u5370 error \u65e5\u5fd7\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_2","title":"\u4e09\u3001\u4ed3\u5e93\u6743\u9650\u7ba1\u7406","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_1","title":"1. \u57fa\u7840\u6846\u67b6","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u4ed3\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame \u57fa\u7840\u6846\u67b6\u4e0d\u5141\u8bb8\u533f\u540d\u8bbf\u95ee\uff0c\u5982\u679c\u4f60\u767b\u5f55 gerrit \u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u8bbf\u95ee\u4ee5\u4e0a\u94fe\u63a5\uff0c\u5219\u9700\u8981\u7533\u8bf7\u8bbf\u95ee\u6743\u9650\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_1","title":"2. \u5e94\u7528\u4ed3\u5e93","text":" \u81ea\u52a8\u5316\u5e94\u7528\u4ed3\u5e93\uff1a https://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684 app_name \u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_3","title":"\u56db\u3001\u65b9\u6cd5\u7f16\u5199&\u8c03\u7528\u89c4\u8303","text":"\u65b9\u6cd5\u7f16\u5199\u6574\u4f53\u8bbe\u8ba1\u601d\u8def\u53c2\u8003\uff1a[\u300aAT\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b]"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_2","title":"1. \u65b9\u6cd5\u7f16\u5199","text":"\u5199\u65b9\u6cd5\u7684\u65f6\u5019\u6ce8\u610f\u65b9\u6cd5\u5f52\u5c5e\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget\uff0c\u65b9\u6cd5\u662f\u5728\u54ea\u4e2a\u533a\u57df\u64cd\u4f5c\u7684\uff0c\u5c31\u5199\u5728\u54ea\u4e2a\u7c7b\u91cc\u9762\u3002 \u4e3e\u4f8b\uff1a from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n\"\"\"\u70b9\u51fb\u6807\u9898\u680fxxx\"\"\"\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_2","title":"2. \u65b9\u6cd5\u8c03\u7528","text":" \u5728\u7528\u4f8b\u4e2d\u8c03\u7528\u65b9\u6cd5\uff0c\u901a\u8fc7\u8be5\u5e94\u7528\u552f\u4e00\u7684\u51fa\u53e3\u8fdb\u884c\u8c03\u7528\uff0c\u6bd4\u5982\u6587\u7ba1\uff1a class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n \u4e0d\u8981\u5728\u7528\u4f8b\u4e2d\u5355\u72ec\u53bb\u8c03\u7528 TitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u8fd9\u4e9b\u7c7b\uff0c\u5426\u5219\u540e\u671f\u7528\u4f8b\u4f1a\u53d8\u5f97\u4e0d\u597d\u7ef4\u62a4\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_4","title":"\u4e94\u3001\u7528\u4f8b\u7f16\u5199\u89c4\u8303","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_3","title":"1. \u57fa\u4e8e\u7c7b\u5199\u7528\u4f8b","text":"\u6240\u6709\u7528\u4f8b\u90fd\u5e94\u8be5\u57fa\u4e8e\u7c7b\u53bb\u5199\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001(self):\n\"\"\"\u97f3\u4e50\u542f\u52a8\"\"\"\n \u6ce8\u610f\u4ee5\u4e0b\u51e0\u70b9\uff1a \u7c7b\u540d\u4e0d\u8981\u968f\u4fbf\u53d6\uff0c\u540c\u4e00\u4e2a\u5e94\u7528\u5e94\u8be5\u4f7f\u7528\u540c\u4e00\u4e2a\u7c7b\u540d\uff0c\u7528\u4f8b\u7c7b\u540d\u79f0\u5fc5\u987b\u4ee5 Test \u5f00\u5934\uff0c\u9075\u5faa\u5927\u9a7c\u5cf0\u547d\u540d\u89c4\u8303\uff1b \u7528\u4f8b\u7c7b\u7ee7\u627f BaseCase\uff0c\u4e00\u4e2a\u5e94\u7528\u53ea\u6709\u4e00\u4e2a BaseCase \u4e00\u4e2a py \u6587\u4ef6\u91cc\u9762\u53ea\u6709\u4e00\u4e2a\u7c7b\uff0c\u6211\u4eec\u79f0\u4e3a\u4e00\u4e2a\u6d4b\u8bd5\u7c7b\uff1b \u4e00\u4e2a\u7c7b\u91cc\u9762\u53ef\u4ee5\u6709\u591a\u4e2a\u7528\u4f8b\u51fd\u6570\uff0c\u8fd9\u53d6\u51b3\u8fd9\u6761\u7528\u4f8b\u6709\u591a\u5c11\u4e2a\u6d4b\u8bd5\u70b9\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001_1(self):\n\"\"\"\u4efb\u52a1\u680f\u542f\u52a8\u97f3\u4e50\"\"\"\ndef test_music_001_2(self):\n\"\"\"\u542f\u52a8\u5668\u542f\u52a8\u97f3\u4e50\"\"\" \ndef test_music_001_3(self):\n\"\"\"\u684c\u9762\u542f\u52a8\u97f3\u4e50\"\"\"\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_3","title":"2. \u7528\u4f8b\u51fd\u6570\u89c4\u8303","text":" \u7528\u4f8b\u51fd\u6570\u4ee5 test \u5f00\u5934\uff0c\u9075\u5faa\u86c7\u5f62\u547d\u540d\u89c4\u8303\uff0c\u4e2d\u95f4\u4e3a\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0\uff0c\u540e\u9762\u52a0\u7528\u4f8b ID\uff0c\u6700\u540e\u52a0\u6d4b\u8bd5\u70b9\u5e8f\u53f7\uff0c\u5373 test_${module}_${case_id}[_${index}] \uff1b \u6bd4\u5982\uff1atest_music_001_1\uff0cindex \u4ece 1 \u5f00\u59cb\u3002 \u51fd\u6570\u529f\u80fd\u8bf4\u660e\u91cc\u9762\u5199\u7528\u4f8b\u6807\u9898\uff0c\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u6807\u9898\u5373\u53ef\uff0c\u6ce8\u610f\u7528\u4e09\u5bf9\u53cc\u5f15\u53f7\uff0c\u4e0d\u8981\u7528\u5176\u4ed6\u6ce8\u91ca\uff0c\u66f4\u4e0d\u8981\u7528\u4e95\u53f7\u6ce8\u91ca\u5199\u7528\u4f8b\u6807\u9898\uff1b \u76f4\u63a5\u590d\u5236 PMS \u7528\u4f8b \u7528\u4f8b\u6b65\u9aa4\u76f4\u63a5\u5c06 PMS \u4e0a\u7528\u4f8b\u6b65\u9aa4\u548c\u9884\u671f\u590d\u5236\u8fdb\u6765\uff0c\u7136\u540e\u8fdb\u884c\u6279\u91cf\u6ce8\u91ca\uff08ctrl + /\uff09\uff0c\u5728\u6ce8\u91ca\u7684\u57fa\u7840\u4e0a\u53bb\u5199\u7528\u4f8b\u811a\u672c\u4f1a\u66f4\u52a0\u65b9\u4fbf\u5168\u9762\uff0c\u4e5f\u6bd4\u4f60\u81ea\u5df1\u5199\u6ce8\u91ca\u66f4\u8282\u7ea6\u65f6\u95f4\uff1a \u4e3e\u4f8b\uff0cPMS \u7528\u4f8b\uff1a \u76f4\u63a5\u9009\u4e2d\u7528\u4f8b\u5185\u5bb9\uff0c\u590d\u5236\u4e0b\u6765\uff0c\u7136\u540e\u7c98\u8d34\u5230\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c\u4e2d\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\n \u4e0a\u4f8b\u4e2d\u4e95\u53f7\u6ce8\u91ca\u90e8\u5206\u5c31\u662f\u76f4\u63a5\u4ece PMS \u4e0a\u590d\u5236\u8fc7\u6765\u7684\uff0c\u5728\u6b64\u57fa\u7840\u4e0a\u5199\u7528\u4f8b\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\nmusic = DeepinMusicWidget()\nmusic.click_singer_btn_in_music_by_ui()\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\nmusic.click_icon_mode_in_music_by_ui()\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\nmusic.double_click_first_singer_in_singer_icon_view_by_ui()\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\nself.assert_xxx\n \u4f60\u770b\uff0c\u975e\u5e38\u6e05\u695a\u6bcf\u4e00\u6b65\u5728\u505a\u4ec0\u4e48\uff0c\u91cd\u70b9\u662f\u7701\u53bb\u4e86\u5199\u6ce8\u91ca\u7684\u65f6\u95f4\uff0c\u771f\u7684\u7092\u9e21\u65b9\u4fbf\u3002 \u4e0d\u5199 if __name__ == '__main__':\uff0c\u4e0d\u5199\u591a\u4f59\u7684\u4ee3\u7801\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3","title":"3. \u6570\u636e\u9a71\u52a8","text":" \u5982\u679c\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u662f\u76f8\u540c\u7684\uff0c\u53ea\u662f\u4e00\u4e9b\u53c2\u6570\u53d8\u5316\uff0c\u5c3d\u91cf\u4f7f\u7528\u6570\u636e\u9a71\u52a8\u6765\u5b9e\u73b0\u7528\u4f8b\uff1b \u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u6570\u636e\u9a71\u52a8\u7684\u6570\u636e\uff0c\u4e0d\u80fd\u56e0\u6b64\u5f15\u5165\u4f9d\u8d56\uff0c\u5c3d\u91cf\u4f7f\u7528\u4e00\u4e9b\u6807\u51c6\u5e93\u80fd\u8bfb\u53d6\u7684\u6587\u4ef6\u683c\u5f0f\uff0c\u6bd4\u5982 json\u3001ini\u3001CSV\u3001xml\u3001txt \u7b49\u6587\u4ef6\u683c\u5f0f\uff1b\u4e0d\u5efa\u8bae\u4f7f\u7528 Yaml\u3001Excel\u3001MySQL \u7b49\u6570\u636e\u683c\u5f0f\uff1b \u8bfb\u53d6\u6570\u636e\u65f6\u4e5f\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff0c\u5982\u4f7f\u7528 pandas \u5904\u7406 CSV \u5c31\u5c5e\u4e8e\u5927\u6750\u5c0f\u7528\u4e86\uff0c\u6b63\u5e38\u7684\u6570\u636e\u9a71\u52a8\u8fd8\u6ca1\u5230\u9700\u8981\u5927\u6570\u636e\u5206\u6790\u6765\u5904\u7406\u7684\u5730\u6b65\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u5728 widget/ddt/ \u76ee\u5f55\u4e0b\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5199\u6cd5\uff1a @pytest.mark.parametrize(\"value\", data)\ndef test_smb_049(self, value):\n \u4ee5\u4e0a\u8fd9\u79cd\u53c2\u6570\u5316\u7684\u5199\u6cd5\u672c\u8eab\u6ca1\u4ec0\u4e48\u95ee\u9898\uff0c\u4f46\u662f\uff0c\u8fd9\u91cc\u5fc5\u987b\u8981\u8865\u5145\u4e00\u4e2a\u6ca1\u6709\u7528\u7684\u5c0f\u77e5\u8bc6\uff1a \u5982\u679c\u53c2\u6570\u5316\u6570\u636e\u91cc\u9762\u7684\u5b57\u7b26\u4f1a\u539f\u5c01\u4e0d\u52a8\u7684\u8f93\u51fa\u5230 item.name \u91cc\u9762\uff0c\u663e\u793a\u975e\u5e38\u4e0d\u4f18\u96c5\uff0c\u800c\u4e14\u53ef\u4ee5\u4f1a\u5f15\u5165\u4e00\u4e9b\u610f\u60f3\u4e0d\u5230\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u611f\u53d7\u4e00\u4e0b\uff1a \u53c2\u6570\uff1a data = [\n\"\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\", \"qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678\",\n]\n \u73b0\u8c61\u662f\u8fd9\u6837\u8272\u513f\u7684\uff1a test_smb_049.py::TestFileManager::test_smb_049[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09]\ntest_smb_049.py::TestFileManager::test_smb_049[qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui]\ntest_smb_049.py::TestFileManager::test_smb_049[12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678]\n \u8bf4\u5b9e\u8bdd\uff0c\u770b\u7740\u5fc3\u91cc\u5835\u5f97\u614c\uff0c\u5982\u679c\u8fd9\u91cc\u9762\u5305\u542b\u4e00\u4e9b\u7279\u6b8a\u5b57\u7b26\u6216\u8005\u662f\u8d85\u957f\uff0c\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u5f88\u5947\u5999\u7684\u4e8b\u60c5\u53d1\u751f\u3002 parametrize \u91cc\u9762\u6709\u4e2a\u53c2\u6570\uff1aids\uff0c\u53ef\u4ee5\u89e3\u51b3\u6b64\u7c7b\u95ee\u9898\uff0c\u5c31\u50cf\u8fd9\u6837\uff1a @pytest.mark.parametrize(\"value\", data, ids=[1, 2, 3])\ndef test_smb_049(self, value):\n \u518d\u6765\u611f\u53d7\u4e00\u4e0b\uff1a test_smb_049.py::TestFileManager::test_smb_049[1]\ntest_smb_049.py::TestFileManager::test_smb_049[2]\ntest_smb_049.py::TestFileManager::test_smb_049[3]\n \u660e\u663e\u597d\u591a\u4e86\uff0c\u6240\u4ee5\u5c3d\u91cf\u4f7f\u7528 ids \u8fd9\u4e2a\u53c2\u6570\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 fixture \u7684\u6570\u636e\u9a71\u52a8\u65b9\u5f0f\uff0c\u6846\u67b6\u867d\u7136\u652f\u6301\uff0c\u4f46\u53ef\u8bfb\u6027\u6bd4\u8f83\u5dee\uff1b\u5982\u679c\u4f60\u4e0d\u77e5\u9053\u8fd9\u53e5\u8bdd\u5728\u8bf4\u5565\uff0c\u90a3\u4f60\u53ef\u4ee5\u5ffd\u7565\uff0c\u6211\u4e5f\u4e0d\u6253\u7b97\u8be6\u7ec6\u8bf4\u8fd9\u79cd\u5b9e\u73b0\u65b9\u5f0f\uff0c\u64cd\u4f5c\u6bd4\u8f83\u9a9a\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4","title":"4. \u65ad\u8a00\u8d44\u6e90","text":" \u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u76f4\u63a5\u653e\u5728\u7528\u4f8b\u6a21\u5757\u7684\u540c\u7ea7\u76ee\u5f55\u4e0b\u7684 assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0 + \u7528\u4f8b ID \u547d\u540d\uff1b \u56fe\u50cf\u8bc6\u522b\u65ad\u8a00\uff0c\u4e0d\u8981\u622a\u53d6\u4e00\u5f20\u5f88\u5927\u7684\u56fe\uff0c\u56fe\u7247\u8d44\u6e90\u5305\u542b\u7684\u5143\u7d20\u592a\u591a\u4e86\uff0c\u975e\u5e38\u5bb9\u6613\u53d7\u5230\u9700\u6c42\u5f71\u54cd\uff0c\u5efa\u8bae\u662f\u8fdb\u884c\u5c40\u90e8\u7684\u65ad\u8a00\uff1b \u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u5339\u914d\u5ea6\u662f 0.9\uff0c\u5982\u679c\u65ad\u8a00\u7684\u573a\u666f\u5bf9\u4e8e\u7cbe\u786e\u5ea6\u8981\u6c42\u6ca1\u90a3\u4e48\u9ad8\uff0c\u53ef\u4ee5\u5728\u65ad\u8a00\u8bed\u53e5\u91cc\u9762\u4f20\u5165\u5c0f\u4e8e 0.9 \u7684\u53c2\u6570\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5","title":"5. \u5143\u7d20\u5b9a\u4f4d","text":" \u7528\u4e8e\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u4e2d\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u547d\u540d\u4e3a\u8be5\u5143\u7d20\u7684\u540d\u79f0\uff1b \u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u622a\u53d6\u65f6\u5c3d\u91cf\u7cbe\u786e\u5230\u8fd9\u4e2a\u5177\u4f53\u7684\u6309\u94ae\uff0c\u56fe\u7247\u4e5f\u4e0d\u8981\u592a\u5927\uff1b \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u64cd\u4f5c\u8f83\u5feb\uff0c\u5408\u7406\u52a0\u5165\u7b49\u5f85\u65f6\u95f4\u80fd\u63d0\u9ad8\u7528\u4f8b\u7684\u7a33\u5b9a\u6027\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6","title":"6. \u7528\u4f8b\u8d44\u6e90","text":" \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u4f7f\u7528\u5230\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u6bd4\u5982\u97f3\u4e50\u53ef\u80fd\u9700\u8981\u4e00\u4e9b mp3 \u7684\u8d44\u6e90\u7528\u4e8e\u6d4b\u8bd5\uff0c\u5b58\u653e\u5728 widget/case_res \u76ee\u5f55\u4e0b\uff0c\u524d\u63d0\u662f\u8fd9\u4e9b\u8d44\u6e90\u4e0d\u8d85\u8fc7 10M\uff1b \u5982\u679c\u662f\u4e00\u4e9b\u6bd4\u8f83\u5927\u7684\u8d44\u6e90\uff0c\u5efa\u8bae\u653e\u5230\u7edf\u4e00\u7684 ftp \u670d\u52a1\u5668 \uff08ftp://10.8.10.245\uff09\uff0c\u9700\u8981\u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\u518d\u4e0b\u8f7d\u4e0b\u6765\uff1b f\"wget ftp://{Config.FTP_IP}/uploads/\u591a\u5a92\u4f53/\u5f71\u9662/auto/{file_name};unzip {file_name};rm -rf {file_name};\"\n \u6d4b\u8bd5\u8d44\u6e90\u4e0b\u8f7d\u5230\u5e94\u7528 widget/case_res \u76ee\u5f55\u4e0b\uff1b \u7981\u6b62\u5c06\u6d4b\u8bd5\u8d44\u6e90\u5b58\u653e\u5728\u4e2a\u4eba\u7684\u673a\u5668\u4e0a\uff1b \u5e94\u8be5\u5c3d\u91cf\u4fdd\u8bc1\uff0c\u4e00\u4e2a\u8d44\u6e90\u5728\u4e00\u6b21\u7528\u4f8b\u6267\u884c\u4e2d\u53ea\u9700\u8981\u4e0b\u8f7d\u4e00\u6b21\uff0c\u6240\u4ee5\u4f60\u4e0d\u80fd\u6bcf\u6b21\u4f7f\u7528\u7684\u65f6\u5019\u90fd\u53bb\u4e0b\u8f7d\uff0c\u8fd9\u6837\u53ef\u80fd\u4f1a\u8017\u8d39\u5927\u91cf\u7684\u7f51\u7edc\u8d44\u6e90\uff0c\u800c\u56e0\u4e3a\u5148\u5224\u65ad\u672c\u5730\u662f\u5426\u5b58\u5728\u6b64\u8d44\u6e90\uff0c\u5982\u679c\u4e0d\u5b58\u5728\u518d\u53bb\u4e0b\u8f7d\uff1b \u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u5c06\u8d44\u6e90\u62f7\u8d1d\u5230\u5bf9\u5e94\u7684\u6d4b\u8bd5\u76ee\u5f55\u4e0b\uff0c\u6bd4\u5982\u5c06 mp3 \u6587\u4ef6\u62f7\u8d1d\u5230 ~/Music \u76ee\u5f55\u4e0b\uff0c\u4f46\u662f\u6211\u4eec\u66f4\u5efa\u8bae\u4f60\u4f7f\u7528\u53d1\u9001\u5feb\u6377\u94fe\u63a5\u7684\u65b9\u5f0f\u66ff\u4ee3\u62f7\u8d1d\u7684\u64cd\u4f5c\uff0c\u56e0\u4e3a\u5728\u62f7\u8d1d\u5927\u6587\u4ef6\u65f6\u662f\u5f88\u6d88\u8017\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u800c\u521b\u5efa\u94fe\u63a5\u5219\u4e0d\u4f1a\uff1b @classmethod\ndef recovery_many_movies_in_movie_by_cmd(cls):\n\"\"\"\u6062\u590d\u591a\u4e2a\u89c6\u9891\u6587\u4ef6\u81f3\u89c6\u9891\u76ee\u5f55\u4e2d\"\"\"\nwork_path = f\"/home/{Config.USERNAME}/Videos/auto\"\ncode_path = f\"{Config.CASE_RES_PATH}/auto\"\ncls.run_cmd(f\"rm -rf {work_path};mkdir {work_path}\")\nsleep(1)\nflag = False\nif not exists(code_path):\ncls.run_cmd(f\"mkdir -p {code_path}\")\nflag = True\nlogger.info(f\"ln -s {code_path}/* {work_path}/\")\ncls.run_cmd(\nf\"cd {code_path}/;\"\nf\"{cls.wget_file('auto.zip') if flag else ''}\"\nf\"ln -s {code_path}/* {work_path}/ > /dev/null 2>&1\"\n)\n \u8d44\u6e90\u4e0b\u8f7d\u8fc7\u7a0b\u4e2d\u6ce8\u610f\u8d85\u65f6\u7684\u95ee\u9898\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u5f88\u5927\uff0c\u8981\u7279\u522b\u6ce8\u610f\u8fd9\u95ee\u9898\uff0c\u5982\u679c\u4f60\u4f7f\u7528\u5f3a\u5236\u7b49\u5f85\u4e0b\u8f7d\u7ed3\u675f( os.system )\uff0c\u53ef\u80fd\u4f1a\u9020\u6210\u7528\u4f8b\u6267\u884c\u65f6\u957f\u53d8\u5f97\u4e0d\u53ef\u63a5\u53d7\uff0c\u76ee\u524d\u6211\u4eec\u53d1\u73b0\u5728\u6301\u7eed\u96c6\u6210\u73af\u5883\u6267\u884c\u65f6\u7f51\u7edc\u4e0b\u8f7d\u901f\u5ea6\u5f88\u6162\uff0c\u6240\u4ee5\u8d85\u65f6\u673a\u5236\u662f\u5f88\u6709\u5fc5\u8981\u7684\uff1brun_cmd \u65b9\u6cd5\u6709\u4e00\u4e2a\u9ed8\u8ba4\u8d85\u65f6\u7684\u65f6\u95f4\uff0c\u4f60\u53ef\u4ee5\u6839\u636e\u8d44\u6e90\u5927\u5c0f\u5bf9\u8d85\u65f6\u65f6\u95f4\u8fdb\u884c\u8c03\u6574\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_5","title":"\u516d\u3001\u7528\u4f8b\u8c03\u8bd5\u6280\u5de7","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_4","title":"1. \u65e5\u5fd7","text":" \u4e00\u5b9a\u8981\u5148\u770b\u62a5\u9519\uff0c\u770b error \u65e5\u5fd7\uff0c\u901a\u5e38\u80fd\u660e\u786e\u7684\u544a\u8bc9\u4f60\u5177\u4f53\u54ea\u91cc\u4ee3\u7801\u62a5\u9519\uff1b \u7ed3\u5408\u62a5\u9519\u70b9\u524d\u9762\u7684error\u3001 info \u548c debug \u65e5\u5fd7\u770b\u5426\u662f\u6b63\u5e38\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_4","title":"2. \u65ad\u70b9\u8c03\u8bd5","text":" \u65b9\u6cd5\u62a5\u9519\uff1a \u5728\u65b9\u6cd5\u5e93\u4e2d\u627e\u5230\u5bf9\u5e94\u7684\u65b9\u6cd5\uff0c\u5355\u72ec\u8c03\u7528\uff0c\u770b\u662f\u5426\u80fd\u6b63\u5e38\u6267\u884c\uff1b \u901a\u5e38\u5355\u4e2a\u65b9\u6cd5\u7684\u6267\u884c\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u62a5\u9519\uff0c\u5f88\u5feb\u5c31\u80fd\u6392\u67e5\u51fa\u95ee\u9898\uff1b\u5728\u65b9\u6cd5\u5185\u90e8\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u65b9\u6cd5\u5185\u90e8\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u8c03\u7528\u6ca1\u95ee\u9898\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u62a5\u9519\u7684\u65b9\u6cd5\u524d\u9762\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u7528\u4f8b\u7684\u4e1a\u52a1\u903b\u8f91\u548c\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u65ad\u8a00\u62a5\u9519\uff1a \u65ad\u8a00\u4e3a\u6570\u636e\u65ad\u8a00\uff0c\u6839\u636e\u8868\u8fbe\u5f0f\u8fdb\u884c\u65ad\u8a00\u8bed\u53e5\u8fdb\u884c\u4fee\u6539\uff1b \u6587\u4ef6\u751f\u6210\u7c7b\u65ad\u8a00\uff0c\u67e5\u770b\u662f\u5426\u9700\u8981\u52a0\u7b49\u5f85\u65f6\u95f4\uff1b \u56fe\u50cf\u65ad\u8a00\uff0c\u5728\u65ad\u8a00\u8bed\u53e5\u5904\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u7528\u4f8b\u8fd0\u884c\u5230\u65ad\u8a00\u5904\u4f1a\u505c\u6b62\uff0c\u67e5\u770b\u6b64\u65f6\u65ad\u8a00\u7684\u56fe\u7247\u4e0e\u7528\u4f8b\u6267\u884c\u7684\u73b0\u573a\u5b58\u5728\u4ec0\u4e48\u5dee\u5f02\uff0c\u6b64\u65f6\u4e5f\u53ef\u4ee5\u8fdb\u884c\u91cd\u65b0\u622a\u56fe\uff0c\u4ece\u800c\u66ff\u6362\u65b0\u7684\u56fe\u7247\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3_1","title":"3. \u8fdc\u7a0b\u6267\u884c","text":" \u8fdc\u7a0b\u6267\u884c\u6307\u7684\u662f\u7f16\u8f91\u5668\u901a\u8fc7\u6307\u5b9a\u8fdc\u7a0b\u89e3\u91ca\u5668\u6267\u884c\u81ea\u52a8\u5316\u4ee3\u7801\uff1b \u8fdc\u7a0b\u6267\u884c\u7684\u597d\u5904\u662f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u7684 Debug \u8fd0\u884c\uff0c\u4e0d\u7528\u5728\u6d4b\u8bd5\u673a\u4e0a\u6253\u5f00\u7f16\u8f91\u5668\uff0c\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u66f4\u5feb\uff1b \u652f\u6301\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u7684\u7f16\u8f91\u5668\uff1a \u4e13\u4e1a\u7248 Pycharm VScode \uff0c\u9700\u8981\u4f7f\u7528\u63d2\u4ef6 Remote-SSH \u8fdc\u7a0b\u6267\u884c\u914d\u7f6e \u4ee5 Pycharm \u4e3a\u4f8b\uff1a File \u2014> Settings \u2014> Project \u2014> Python Interpreter \u2014> \u53f3\u8fb9\u8bbe\u7f6e\u6309\u94ae \u2014> Add... \u2014> SSH Interpreter \u2014> New server configuration(\u586b\u5165host\u548cusername) \u2014> Next \u2014> password\uff08\u6d4b\u8bd5\u673a\u5bc6\u7801\uff09 \u2014> Interpreter(\u9009\u62e9\u8fdc\u7a0b\u89e3\u91ca\u5668) \u2014> Finish "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4_1","title":"4. \u73af\u5883\u6e05\u7406","text":" \u5982\u679c\u7528\u4f8b\u91cc\u9762\u7684 teardown \u6ca1\u6709\u6267\u884c\uff0c\u5927\u6982\u7387\u662f\u56e0\u4e3a setup \u91cc\u9762\u4ee3\u7801\u62a5\u9519\uff0c\u8fd9\u4e24\u4e2a\u662f\u4e00\u5bf9\u7684\uff0csetup \u91cc\u9762\u62a5\u9519\uff0cteardown \u91cc\u9762\u7684\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\uff1b \u76ee\u524d\u6211\u4eec\u5df2\u7ecf\u5c06\u5404\u5e94\u7528\u7684 clean_all \u8fd9\u4e2a fixture \u6539\u6210\u4e86\u7ec8\u7ed3\u5668\uff0c\u786e\u4fdd\u59cb\u7ec8\u80fd\u6267\u884c\u5230\u8fd9\u6b65\uff0c\u4f46\u662f\u7528\u4f8b\u91cc\u9762\u7684 fixture\uff0c\u8fd8\u662f\u9700\u8981\u6211\u4eec\u5c0f\u5fc3\u5904\u7406\uff1b \u8981\u6267\u884c clean_all \u9700\u8981\u5728\u7f16\u8f91\u5668\u8fd0\u884c\u53c2\u6570\u52a0 --clean yes\uff0c\u5199\u7528\u4f8b\u7684\u65f6\u5019\u8bf7\u52a0\u4e0a\uff0c\u4e0d\u7136\u4f60\u4e0d\u786e\u5b9a\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u7684\u73af\u5883\u662f\u5426\u6062\u590d\uff1b setup \u53ef\u4ee5\u4e0d\u8981\uff0c\u5c06 setup \u653e\u5230\u7528\u4f8b\u91cc\u9762\u662f\u4e00\u79cd\u7a33\u59a5\u7684\u505a\u6cd5\uff0cteardown \u4e00\u5b9a\u8981\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5_1","title":"5. \u5143\u7d20\u5b9a\u4f4d\u4e0d\u51c6\uff08\u5750\u6807\u8fd4\u56de\u4e0d\u5bf9\uff09","text":" \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u53ef\u80fd\u53d7\u5230\u7a97\u53e3 ID \u7684\u53d8\u5316\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u9ed8\u8ba4\u53d6\u6700\u65b0\u7684\u4e00\u4e2a\u7a97\u53e3\u7528\u4e8e\u5b9a\u4f4d\uff0c\u4f46\u5982\u679c\u5b9e\u9645\u9700\u8981\u5b9a\u4f4d\u7684\u4e0d\u662f\u6700\u65b0\u7684\u7a97\u53e3\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u91cd\u65b0\u5b9e\u4f8b\u5316\u65b9\u6cd5\u7c7b\u5bf9\u8c61\uff0c\u5e76\u5728\u7c7b\u4e2d\u4f20\u5165\u5bf9\u5e94\u7684\u7a97\u53e3\u5e8f\u53f7\uff1b \u57fa\u4e8e\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u76ee\u524d\u9047\u5230\u7684\u7b14\u8bb0\u672c\u4e0a\uff0c\u7531\u4e8e\u5c4f\u5e55\u7f29\u653e\u6bd4\u4f8b\u4e3a 1.25\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u6211\u4eec\u9ed8\u8ba4\u4f7f\u7528\u7f29\u653e\u6bd4\u4f8b\u4e3a 1\uff1b \u57fa\u4e8e\u56fe\u50cf\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u76ee\u6807\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b \u57fa\u4e8e OCR \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u6587\u5b57\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u540c\u6837\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6_1","title":"6. \u952e\u9f20\u64cd\u4f5c\u4e0d\u51c6","text":" \u9f20\u6807\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6bd4\u5982\u53f3\u952e\u3001\u53cc\u51fb\u65e0\u54cd\u5e94\uff1b \u952e\u76d8\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6216\u8005\u5ef6\u8fdf\u8f93\u5165\uff0c\u6bd4\u5982\u7528\u4f8b\u9700\u8981\u8f93\u5165\u201c\u6211\u662f\u4e2d\u56fd\u4eba\u201d\uff0c\u5b9e\u9645\u53ea\u8f93\u5165\u4e86\u201c\u6211\u56fd\u4eba\u201d\uff1b \u4ee5\u4e0a\u95ee\u9898\u6392\u9664\u5e94\u7528\u5361\u987f\u7b49\u95ee\u9898\uff0c\u5927\u6982\u7387\u662f\u7531\u4e8e\u5de5\u5177\u7684\u95ee\u9898\uff0c\u76ee\u524d\u952e\u9f20\u64cd\u4f5c\u6211\u4eec\u4f7f\u7528\u4e09\u4e2a\u5de5\u5177\uff1aDogtail \u63d0\u4f9b\u7684\u952e\u9f20\u5de5\u5177\u3001PyAutoGUI\u3001Xdotool \uff1b \u6709\u540c\u5b66\u53ef\u80fd\u8981\u8bf4\u4e3a\u5565\u8981\u7528\u4e09\u4e2a\u554a\uff0c\u7528\u4e00\u4e2a\u4e0d\u5c31\u597d\u4e86\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u5404\u6709\u4f18\u70b9\u5404\u6709\u7f3a\u70b9\u3002 \u5982\u679c\u4f60\u9047\u5230\u952e\u9f20\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u8bd5\u8bd5\u901a\u8fc7\u4e0d\u540c\u7684\u5de5\u5177\u64cd\u4f5c\uff1b\u952e\u76d8\u8f93\u5165\u5ef6\u8fdf\u7684\u95ee\u9898\uff0c\u4e00\u822c\u662f\u56e0\u4e3a\u8f93\u5165\u901f\u5ea6\u592a\u5feb\u4e86\uff0c\u7cfb\u7edf\u6ca1\u53cd\u5e94\u8fc7\u6765\uff0c\u5e38\u89c1\u4e8e ARM \u548c MIPS \u4e0a\uff0c\u4fee\u6539\u53c2\u6570 delay_time \u7684\u503c\uff0c\u5355\u4f4d\u4e3a\u6beb\u79d2\uff1b # mouse_key.py\n@classmethod\ndef input_message(cls, message, delay_time=300, interval=0.2):\n\"\"\"\n \u8f93\u5165\u5b57\u7b26\u4e32\n :param message: \u8f93\u5165\u7684\u5185\u5bb9\n :param delay_time: \u5ef6\u8fdf\u65f6\u95f4\n :param interval:\n :return:\n \"\"\"\n \u5982\u679c\u4e0d\u662f\u65b9\u6cd5\u7684\u95ee\u9898\uff0c\u5219\u9700\u8981\u7ee7\u7eed\u548c\u5f00\u53d1\u4e00\u8d77\u6392\u9664\uff0c\u662f\u5426\u4e3a\u5e94\u7528\u63a5\u53d7\u952e\u9f20\u4fe1\u53f7\u5904\u7406\u7684\u95ee\u9898\uff0c\u8fd9\u7c7b\u60c5\u51b5\u6211\u4eec\u4e5f\u662f\u9047\u5230\u8fc7\u7684\uff0c\u5177\u4f53\u95ee\u9898\u5177\u4f53\u5206\u6790\u3002 \u6bd4\u5982\u5f71\u9662\u5c31\u91cd\u5199\u4e86\u4e00\u4e2a\u53f3\u952e\u7684\u65b9\u6cd5\uff1a # base_widget.py\n@classmethod\ndef right_click(cls, _x=None, _y=None):\n\"\"\"\n \u91cd\u5199\u5e95\u5c42\u5355\u51fb\u9f20\u6807\u53f3\u952e\n \u89e3\u51b3\u5f71\u9662\u53f3\u952e\u89e6\u53d1release\u4e8b\u4ef6\u7684\u95ee\u9898\uff08\u53f3\u952e\u4e3b\u7a97\u53e3\u4f1a\u64ad\u653e\u89c6\u9891\uff09\n \"\"\"\ncls.mouse_down(_x, _y, button=3)\nsleep(0.1)\ncls.mouse_up(button=3)\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_6","title":"\u4e03\u3001\u5176\u4ed6\u4e0d\u4e3a\u4eba\u77e5\u7684\u7ec6\u8282","text":" \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u5c3d\u91cf\u7f16\u5199\u540c\u4e00\u4e2a\u5e94\u7528\u6216\u6a21\u5757\u7684\u7528\u4f8b\uff0c\u80fd\u5bf9\u8be5\u7528\u4f8b\u5df2\u6709\u65b9\u6cd5\u719f\u6089\uff0c\u907f\u514d\u8fc7\u591a\u91cd\u590d\u4e1a\u52a1\u4ee3\u7801\u7684\u5c01\u88c5\uff1b \u76f8\u540c\u7684\u573a\u666f\u4e0b\uff0c\u5404\u67b6\u6784\u7b49\u5f85\u65f6\u95f4\u4e0d\u540c\uff0c\u5efa\u8bae\u4f7f\u7528\u6846\u67b6\u63d0\u4f9b\u7684 sleep\uff0c\u6211\u4eec\u505a\u4e86\u4e0d\u540c\u67b6\u6784\u7684\u500d\u6570\u653e\u5927\uff1b \u7f16\u5199\u7528\u4f8b\u65f6\uff0c\u5c3d\u91cf\u8003\u8651\u5230\u6bcf\u4e00\u6b65\u5f02\u5e38\u540e\u7684\u73af\u5883\u6062\u590d\uff0c\u9700\u8981\u5efa\u8bae\u8fd9\u79cd\u610f\u8bc6\uff0c\u968f\u65f6\u8981\u8003\u8651\u5230\uff0c\u8fd9\u6b65\u64cd\u4f5c\u6709\u6ca1\u6709\u53ef\u80fd\u51fa\u9519\uff0c\u51fa\u9519\u4e86\u6539\u600e\u4e48\u529e\uff1b \u63d0\u4ea4\u4ee3\u7801\u7684\u65f6\u5019\u6ce8\u610f\u4e0d\u8981\u628a\u4e00\u4e9b\u4e34\u65f6\u7684\u6d4b\u8bd5\u8d44\u6e90\u63d0\u4ea4\u8fdb\u53bb\u4e86\uff0c\u6bd4\u5982\u6d4b\u8bd5\u4e86\u4e00\u4e2a\u5f71\u7247\uff0c\u6709\u4e9b\u540c\u5b66\u4e60\u60ef\u4f7f\u7528 git add . \uff0c\u7136\u540e\u5c31\u5168\u90e8\u63d0\u4ea4\u5230\u4ee3\u7801\u4ed3\u5e93\u4e86\uff0c\u8fd9\u6837\u5373\u4f7f\u540e\u671f\u628a\u5927\u6587\u4ef6\u5220\u4e86\uff0c.git \u6587\u4ef6\u91cc\u9762\u4e5f\u4f1a\u5f88\u5927\uff0c\u9020\u6210\u4ee3\u7801\u4ed3\u5e93\u53d8\u5f97\u5341\u5206\u81c3\u80bf\u3002 \u66f4\u591a\u7ec6\u8282\u67e5\u770b\uff1a\u300aAT\u7ecf\u9a8c\u603b\u7ed3\u300b"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/","title":"AT \u6267\u884c\u5668\u4f7f\u7528\u6307\u5317","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/5/25\n# Author : litao\n# =============================================\n Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1","title":"1\u3001\u529f\u80fd\u4ecb\u7ecd","text":" \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7cfb\u7edf\u8bed\u8a00\u8bbe\u7f6e\uff0c\u5206\u8fa8\u7387\u8bbe\u7f6e\u53ca\u7528\u4f8b\u6267\u884c\u73af\u5883\u642d\u5efa\uff1b \u652f\u6301 IP \u4e3a 15 \u7f51\u6bb5\u7684 AMD \u67b6\u6784\u6d4b\u8bd5\u673a\u955c\u50cf\u88c5\u673a\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u6307\u5b9a\u5e94\u7528\uff0c\u6307\u5b9a\u8303\u56f4\u6807\u7b7e\u7684\u7528\u4f8b\u6267\u884c\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u72b6\u6001\u68c0\u67e5\uff0c\u662f\u5426\u6709\u6b63\u5728\u8fd0\u884c\u7684\u6d4b\u8bd5\uff1b \u652f\u6301\u914d\u7f6e\u7528\u4f8b\u6267\u884c\u65f6\u957f\uff0c\u9632\u6b62\u4efb\u52a1\u963b\u585e\uff1b \u652f\u6301\u6839\u636e\u5e94\u7528\u7248\u672c\u81ea\u52a8\u67e5\u627e\u5bf9\u5e94\u7684\u7528\u4f8b tag\uff1b \u652f\u6301\u5f02\u5e38\u5904\u7406\u548c\u6d4b\u8bd5\u5b8c\u6210\u7684\u5b9e\u65f6\u6d88\u606f\u901a\u77e5\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2job","title":"2\u3001Job \u4ecb\u7ecd","text":"\u4ee5\u4e0b\u6309\u6267\u884c\u6d41\u7a0b\u7684\u987a\u5e8f\u4ecb\u7ecd\uff0c\u6bcf\u4e00\u6b65\u90fd\u53ef\u4ee5\u5355\u72ec\u6267\u884c\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1_1","title":"1\u3001\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/AT_test/ \u6574\u4e2a\u6d41\u7a0b\u7684\u4e3b\u5165\u53e3\uff0c\u901a\u8fc7\u8fd9\u4e2a\u5165\u53e3\uff0c\u8fde\u540c\u6574\u4e2a\u6d4b\u8bd5\u6d41\u7a0b\uff0c\u955c\u50cf\u88c5\u673a\uff0c\u73af\u5883\u90e8\u7f72\uff0c\u6d4b\u8bd5\u5e94\u7528\u53ca\u751f\u6210\u62a5\u544a\u3002 \u53c2\u6570\u4ecb\u7ecd\uff1a \u6d4b\u8bd5\u673a\uff1a\u6240\u6709\u89c4\u6574\u5230\u56fa\u5b9a\u533a\u57df\u7684\u6d4b\u8bd5\u673a\uff0c\u901a\u8fc7\u6d4b\u8bd5\u540c\u5b66\u5bf9\u6d4b\u8bd5\u673a\u7684\u4e60\u60ef\u547d\u540d\uff0c\u5728\u540e\u53f0\u6620\u5c04\u6d4b\u8bd5\u673a\u7684\u8be6\u7ec6\u4fe1\u606f\uff0c\u62ec\u53f7\u4e2d\u4e3a\u6d4b\u8bd5\u673a IP \u7684\u6700\u540e\u4e00\u4f4d\uff1b \u6d4b\u8bd5\u5e94\u7528\uff1a\u6307\u5b9a\u7684\u6d4b\u8bd5\u5e94\u7528\u7684\u5305\u540d\uff0c\u7cfb\u7edf\u6839\u636e\u540d\u79f0\u81ea\u52a8\u62c9\u53d6\u5bf9\u5e94\u7684\u4ed3\u5e93\u4ee3\u7801\uff1b deb\u5305\u4e0b\u8f7d\u5730\u5740\uff1a\u6d4b\u8bd5\u4e0a\u8ff0\u5e94\u7528\u65f6\uff0c\u9700\u8981\u5b89\u88c5\u7684deb\u5305\u4e0b\u8f7d\u5730\u5740\uff0c\u591a\u4e2a\u5730\u5740\u7528\u201c,\u201d\u9694\u5f00\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff1b \u8303\u56f4\u6807\u7b7e\uff1a\u6267\u884c\u6d4b\u8bd5\u7528\u4f8b\u7684\u6807\u7b7e\u8303\u56f4\uff0c\u5bf9\u5e94\u7528\u4f8b\u4ee3\u7801 csv \u6587\u4ef6\u4e2d\u7684\u6807\u7b7e\u4fe1\u606f\uff0c\u4ee5 pytest \u7684mark\u8bed\u6cd5\u7f16\u5199\uff1b \u7cfb\u7edf\u8bed\u8a00\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u8bed\u8a00\u73af\u5883\uff1b \u5206\u8fa8\u7387\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u5206\u8fa8\u7387\u73af\u5883\uff1b \u955c\u50cf\u5730\u5740\uff1a\u955c\u50cf\u4ed3\u5e93\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u901a\u8fc7 PXE \u88c5\u673a\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u88c5\u673a\u73af\u8282\uff08\u76ee\u524d\u4ec5\u652f\u6301\u90e8\u5206 AMD \u67b6\u6784\u7684\u88c5\u673a\uff09\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2pxe","title":"2\u3001PXE \u88c5\u673a","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/IOS_install/ \u8f93\u5165\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\uff0cIP\uff0c\u5bc6\u7801\uff0c\u955c\u50cf\u5730\u5740\u540e\uff0c\u81ea\u52a8\u88c5\u673a\uff0c\u76ee\u524d\u4ec5\u652f\u6301\u56fa\u5b9a 15 \u7f51\u6bb5\u7684\u90e8\u5206 AMD \u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#3","title":"3\u3001\u6b21\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/all_client_test/ \u8be5\u5165\u53e3\u4e0e\u4e3b\u5165\u53e3\u529f\u80fd\u57fa\u672c\u4e00\u81f4\uff0c\u53ea\u662f\u5265\u79bb\u4e86PXE\u88c5\u673a\u6d41\u7a0b\uff0c\u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7684\u6267\u884c\u6d41\u7a0b\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#4","title":"4\u3001\u73af\u5883\u90e8\u7f72","text":"Jenkins url\uff1ahttps://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/env/build?delay=0sec \u8bbe\u7f6e\u6d4b\u8bd5\u673a\u7684\u7cfb\u7edf\u8bed\u8a00\uff0c\u5206\u8fa8\u7387\u53ca\u5b89\u88c5\u6d4b\u8bd5\u6240\u9700\u7684\u4f9d\u8d56\u5305\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#5","title":"5\u3001\u53d1\u9001\u4ee3\u7801","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/send_code/ \u6839\u636e\u6d4b\u8bd5\u5e94\u7528\u540d\u79f0\uff0c\u62c9\u53d6\u5bf9\u5e94\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u5e76\u6839\u636e\u6d4b\u8bd5\u673a\u4e0a\u5e94\u7528\u7248\u672c\u5207\u6362\u5230\u5bf9\u5e94\u7684tag\u7248\u672c\uff0c\u82e5\u672a\u627e\u5230tag\u7248\u672c\uff0c\u5219\u4f7f\u7528\u6700\u65b0\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u518d\u6839\u636e\u5e94\u7528\u5e93\u4ee3\u7801\u4e2d\u914d\u7f6e\u7684\u57fa\u7840\u5e93\u7248\u672c\uff0c\u62c9\u53d6\u57fa\u7840\u5e93\u4ee3\u7801\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#6","title":"6\u3001\u7528\u4f8b\u6267\u884c","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/run_test/ \u8fd0\u884c\u6d4b\u8bd5\u673a\u4e0a\u7684\u7528\u4f8b"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/","title":"AT \u7528\u4f8b\u7b5b\u9009\u6307\u5317","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u7528\u4f8b\u7b5b\u9009\u6807\u51c6\uff0c\u662f\u6311\u9009\u5408\u9002\u7684\u6587\u672c\u7528\u4f8b\u8fdb\u884c\u81ea\u52a8\u5316\u7528\u4f8b\u8f6c\u5316\u7684\u4e00\u4e9b\u901a\u7528\u6807\u51c6\u3002 \u8fc7\u53bb\u6211\u4eec\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u5b9e\u8df5\u8fc7\u7a0b\u4e2d\uff0c\u5199\u4e86\u4e0d\u5c11\u81ea\u52a8\u5316\u7528\u4f8b\uff0c\u968f\u7740\u9700\u6c42\u7684\u8fed\u4ee3\uff0c\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u81ea\u7136\u8150\u5316\uff0c\u56e0\u800c\u9700\u8981\u5728\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\u5bf9\u81ea\u52a8\u5316\u7528\u4f8b\u8fdb\u884c\u7ef4\u62a4\uff0c\u5728\u7ef4\u62a4\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u6211\u4eec\u53d1\u73b0\uff0c\u6709\u4e9b\u7528\u4f8b\u7ef4\u62a4\u8d77\u6765\u592a\u96be\u4e86\uff0c\u8c03\u8bd5\u7528\u4f8b\u8017\u8d39\u5927\u91cf\u65f6\u95f4\uff0c\u6210\u672c\u5f88\u9ad8\u3002 \u56e0\u6b64\uff0c\u6211\u4eec\u603b\u7ed3\u4e00\u4e9b\u81ea\u52a8\u5316\u7528\u4f8b\u9009\u578b\u7684\u6807\u51c6\uff0c\u4ee5\u4f18\u5316\u540e\u7eed\u81ea\u52a8\u5316\u7528\u4f8b\u7ed3\u6784\uff0c\u671f\u5f85\u6211\u4eec\u80fd\u7f16\u5199\u51fa\u9ad8\u6548\u3001\u7a33\u5b9a\u3001\u6613\u4e8e\u7ef4\u62a4\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_1","title":"\u4e00\u3001\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u53ef\u4ee5\u5206\u4e3a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u548c\u4e13\u9879\u81ea\u52a8\u5316\u6d4b\u8bd5\uff0c\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e00\u822c\u53ea\u9488\u5bf9\u4e00\u4e9b\u5e38\u89c4\u7684\u529f\u80fd\u6d4b\u8bd5\uff0c\u5176\u4ed6\u975e\u5e38\u89c4\u529f\u80fd\u7684\u7528\u4f8b\uff0c\u5e94\u8be5\u91c7\u7528\u4e13\u9879\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u6848\uff1b \u4ee5\u4e0b\u662f\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1","title":"1. \u7a33\u5b9a\u6027\u3001\u538b\u6d4b\u7528\u4f8b","text":"\u7a33\u5b9a\u6027\u6d4b\u8bd5\u3001\u538b\u6d4b\u7528\u4f8b\u5e94\u8be5\u662f\u5c5e\u4e8e\u6027\u80fd\u76f8\u5173\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u5982\uff1a\u53cd\u590d\u591a\u6b21\u70b9\u51fb\u6309\u94ae\uff0c\u68c0\u9a8c\u5176\u529f\u80fd\u7a33\u5b9a\u6027\u3002\u56e0\u4e3a\u8fd9\u4e9b\u7528\u4f8b\u65ad\u8a00\u7684\u9884\u671f\u53ef\u80fd\u4e0d\u662f\u5f88\u660e\u786e\uff0c\u66f4\u6709\u751a\u8005\u4e0d\u9700\u8981\u65ad\u8a00\uff0c\u7528\u4f8b\u65f6\u957f\u6bd4\u8f83\u957f\uff0c\u800c\u4e14\u4e0d\u53ef\u63a7\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u76ee\u524d\u6211\u4eec\u6709\u6027\u80fd\u81ea\u52a8\u5316\u7684\u4e13\u9879\u65b9\u6848\uff0c\u4ee5\u53ca\u4e00\u4e9b\u7a33\u5b9a\u6027\u6d4b\u8bd5\u7684\u4e13\u9879\u65b9\u6848\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u6b64\u7c7b\u7528\u4f8b\u653e\u5230\u4e13\u9879\u81ea\u52a8\u5316\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2","title":"2. \u6d89\u53ca\u591a\u4e2a\u7528\u6237\u64cd\u4f5c","text":"\u5e38\u89c1\u4e0e\u6587\u7ba1\u7684\u7528\u4f8b\u4e2d\uff0c\u591a\u7528\u6237\u64cd\u4f5c\u7684\u7528\u4f8b\u4e00\u822c\u90fd\u4f1a\u6d89\u53ca\u5230\u5728\u7cfb\u7edf\u4e2d\u8fdb\u884c\u591a\u4e2a\u7528\u6237\u95f4\u7684\u5207\u6362\uff0c\u81ea\u52a8\u5316\u811a\u672c\u4e00\u822c\u662f\u8fd0\u884c\u5728\u4e00\u4e2a\u7528\u6237\u7a7a\u95f4\u4e0b\u7684\uff0c\u6240\u4ee5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u591a\u7528\u6237\u95f4\u7684\u5207\u6362\u3002 \u6b64\u7c7b\u4e0d\u5efa\u8bae\u91c7\u7528\u81ea\u52a8\u5316\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3","title":"3. \u4e0e\u5f00\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4ea4\u4e92","text":"\u6b64\u7c7b\u573a\u666f\u591a\u4e3a\u5e94\u7528\u7684\u5f02\u5e38\u573a\u666f\u6d4b\u8bd5\uff0c\u6bd4\u5982\uff1a\u590d\u5236\u5927\u6587\u4ef6\u8fc7\u7a0b\u4e2d\u6ce8\u9500\u673a\u5668\u3002 \u81ea\u52a8\u5316\u811a\u672c\u5728\u7cfb\u7edf\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4e4b\u540e\u662f\u4f1a\u505c\u6b62\u8fd0\u884c\u7684\uff1b\u6b64\u7c7b\u7528\u4f8b\u53ef\u4ee5\u505a\u81ea\u52a8\u5316\uff0c\u4f46\u662f\u540c\u6837\u9700\u8981\u505a\u4e13\u9879\u65b9\u6848\uff0c\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u7684\u5904\u7406\u903b\u8f91\u5b8c\u5168\u4e0d\u540c\u3002 \u540e\u7eed\u81ea\u52a8\u5316\u9700\u8981\u516c\u5173\u7684\u70b9\uff1a \u81ea\u52a8\u5316\u811a\u672c\u5728\u672c\u673a\u8fd0\u884c\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u81f3\u5c11\u9700\u8981\u63d0\u4f9b\u4ee5\u4e0b\u529f\u80fd\uff1a \u91cd\u542f\u4e4b\u540e\u7528\u4f8b\u80fd\u81ea\u52a8\u8fd0\u884c\uff1b\u53ef\u4ee5\u8003\u8651\u5c06\u6267\u884c\u7528\u4f8b\u5199\u6210\u4e00\u4e2a\u5f00\u673a\u81ea\u542f\u7684\u670d\u52a1\uff1b \u80fd\u8bb0\u5f55\u5173\u673a\u4e4b\u524d\u7528\u4f8b\u6267\u884c\u7684\u4f4d\u7f6e\uff0c\u91cd\u542f\u4e4b\u540e\u80fd\u4ece\u6b64\u4f4d\u7f6e\u5f00\u59cb\u6267\u884c\uff1b \u50cf\u6027\u80fd\u81ea\u52a8\u5316\u4e00\u6837\uff0c\u7531\u670d\u52a1\u7aef\u63a7\u5236\uff1b \u5b8c\u5168\u57fa\u4e8e\u56fe\u5f62\u8bc6\u522b\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u4e32\u53e3\u7ebf\u63a7\u5236\u952e\u9f20\u7a33\u5b9a\u6027\uff1b "},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4","title":"4. \u6d4b\u8bd5\u6267\u884c\u65f6\u95f4\u957f","text":"\u7528\u4f8b\u6267\u884c\u65f6\u95f4\u63a7\u5236\u57282\u5206\u949f\u4ee5\u5185\uff0c\u6781\u7aef\u60c5\u51b5\u4e0d\u8981\u8d85\u8fc75\u5206\u949f\uff0c\u6240\u6709\u7528\u4f8b\u7684\u5e73\u5747\u65f6\u957f\u5e94\u8be5\u57281\u5206\u949f\u5de6\u53f3\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u95f4\u592a\u957f\uff0c\u7f16\u5199\u7528\u4f8b\u3001\u8c03\u8bd5\u7528\u4f8b\u3001\u6267\u884c\u7528\u4f8b\u3001\u7ef4\u62a4\u7528\u4f8b\u90fd\u975e\u5e38\u7684\u8017\u65f6\uff0c\u4eba\u529b\u6210\u672c\u65f6\u95f4\u6210\u672c\u6295\u5165\u592a\u9ad8\u3002 \u4f60\u60f3\uff0c\u8fd9\u6761\u7528\u4f8b\u6267\u884c\u9700\u89815\u5206\u949f\uff0c\u90a3\u4f60\u5199\u8fd9\u6761\u7528\u4f8b\u7684\u65f6\u95f4\u4e0d\u53ef\u80fd\u4e00\u904d\u8fc7\uff0c\u5199\u7684\u8fc7\u7a0b\u4e2d\u8dd1\u4e0d\u901a\u8fd8\u5f97\u91cd\u8dd1\u81f3\u5c1115\u5206\u949f\u4e0d\u8fc7\u5206\uff0c\u5199\u5b8c\u4e86\u8fd8\u5f97\u5728\u5176\u4ed6\u67b6\u6784\u4e0a\u8c03\u8bd5\uff0c\u534a\u4e2a\u5c0f\u65f6\u8fc7\u53bb\u4e86\uff0c\u8fd9\u8fd8\u53ea\u662f\u7b2c\u4e00\u6b21\u5199\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u540e\u7eed\u5982\u679c\u7528\u4f8b\u7ef4\u62a4\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u7ecf\u5e38\u6295\u5165\u76f8\u5f53\u957f\u65f6\u95f4\uff0c\u8fd9\u6837\u5176\u5b9e\u662f\u5931\u53bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u7684\u3002\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u5c31\u5e94\u8be5\u662f\u5feb\u51c6\u72e0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5","title":"5. \u8fb9\u7f18\u6027\u6d4b\u8bd5","text":"\u6709\u4e9b\u529f\u80fd\u6a21\u5757\u672c\u8eab\u662f\u5c5e\u4e8e\u6bd4\u8f83\u8fb9\u7f18\u6027\u7684\uff0c\u5373\u6781\u5c11\u7528\u6237\u4f1a\u4f7f\u7528\u5230\u7684\u529f\u80fd\uff0c\u8fd9\u7c7b\u529f\u80fd\u6a21\u5757\u4e0d\u9700\u8981\u5927\u89c4\u6a21\u5b9e\u73b0\u81ea\u52a8\u5316\uff0c\u4e00\u4e24\u4e2a\u573a\u666f\u8986\u76d6\u57fa\u672c\u529f\u80fd\u5c31\u884c\u4e86\uff0c\u56e0\u6b64\u6211\u4eec\u5728\u6311\u9009\u6b64\u7c7b\u7528\u4f8b\u7684\u65f6\u5019\u53ef\u4ee5\u7ed3\u5408\u6574\u4e2a\u529f\u80fd\u6a21\u5757\u7684\u8986\u76d6\u60c5\u51b5\u6765\u51b3\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6","title":"6. \u9700\u8981\u4f9d\u8d56\u4eba\u5de5\u4ecb\u5165\u7684","text":"\u81ea\u52a8\u5316\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\u662f\u6ca1\u6709\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bd4\u5982\u8981\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u90a3\u4e48\u5c31\u80cc\u79bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u3002 \u6bd4\u5982\u5149\u9a71\u6a21\u5757\uff0c\u5149\u9a71\u523b\u5f55\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u4f46\u662f\u5149\u9a71\u523b\u5f55\u4e4b\u540e\u5149\u76d8\u4f1a\u5f39\u51fa\u6765\uff0c\u9700\u8981\u4eba\u5de5\u66f4\u6362\u5149\u76d8\uff0c\u518d\u624b\u52a8\u63a8\u8fdb\u5149\u9a71\u4e2d\u3002 \u8fd9\u79cd\u529f\u80fd\u6a21\u5757\u5373\u4f7f\u505a\u81ea\u52a8\u5316\uff0c\u80fd\u6d89\u53ca\u5230\u7684\u529f\u80fd\u975e\u5e38\u6709\u9650\uff0c\u800c\u4e14\u4e0d\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u6240\u4ee5\u660e\u663e\u5c31\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7","title":"7. \u96be\u4ee5\u5b9e\u73b0\u7684","text":"\u7528\u4f8b\u6240\u6d89\u53ca\u5230\u7684\u65b9\u6cd5\u5b9e\u73b0\u8d77\u6765\u53ef\u80fd\u6709\u96be\u5ea6\uff0c\u751a\u81f3\u73b0\u9636\u6bb5\u65e0\u6cd5\u5b9e\u73b0\u7684\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002 \u6bd4\u5982\u5f71\u9662\u6d4b\u8bd5\u753b\u9762\u6e05\u6670\u5ea6\u3001\u6d41\u7545\u5ea6\u3001\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u4e4b\u540e\u7684\u89c6\u9891\u662f\u5426\u5b58\u5728\u5361\u987f\u7b49\u7528\u4f8b\uff0c\u73b0\u9636\u6bb5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#8","title":"8. \u529f\u80fd\u4e0d\u7a33\u5b9a","text":"\u8fd9\u4e2a\u4e0d\u662f\u8bf4\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\uff0c\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\u4e0d\u7a33\u5b9a\u662f\u6b63\u5e38\u7684\uff0c\u8fd9\u79cd\u6211\u4eec\u53ef\u4ee5\u7b49\u5f00\u53d1\u63d0\u6d4b\u4e4b\u540e\u518d\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u3002 \u529f\u80fd\u4e0d\u7a33\u5b9a\u6307\u7684\u662f\u7528\u4f8b\u6240\u6d89\u53ca\u7684\u529f\u80fd\uff0c\u53ef\u80fd\u5b58\u5728\u591a\u79cd\u53d8\u5316\uff0c\u6bcf\u6b21\u6267\u884c\u7528\u4f8b\u53ef\u80fd\u65ad\u8a00\u7684\u9884\u671f\u90fd\u4e0d\u540c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#9","title":"9. \u52a8\u6001\u65ad\u8a00","text":"\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u76f4\u5230\u7528\u4f8b\u7ed3\u675f\uff0c\u4e00\u76f4\u662f\u4e00\u4e2a\u52a8\u6001\u53d8\u5316\u7684\u8fc7\u7a0b\uff0c\u800c\u4e14\u65e0\u6cd5\u901a\u8fc7\u5176\u4ed6\u624b\u6bb5\u505c\u4e0b\u6765\uff1b \u6bd4\u5982\uff1a\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u65f6\uff0c\u53f3\u4e0b\u89d2\u7684\u5f55\u5236\u65f6\u95f4\u662f\u4e00\u76f4\u5728\u53d8\u5316\u7684\uff0c\u7528\u4f8b\u9700\u8981\u6d4b\u8bd5\u5f55\u52361\u5206\u949f\u4e4b\u540e\uff0c\u5f55\u5236\u65f6\u95f4\u662f\u521a\u597d\u505c\u572860\u79d2\uff1b \u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fd8\u505a\u4e0d\u5230\u65f6\u95f4\u7cbe\u51c6\u63a7\u5236\uff0c\u7a0b\u5e8f\u6267\u884c\u65f6\u95f4\u662f\u6709\u6ce2\u52a8\u7684\uff0c\u800c\u4e14\u8981\u9002\u914d\u591a\u4e2a\u5e73\u53f0\uff0c\u6240\u4ee5\u6b64\u7c7b\u7528\u4f8b\u5927\u6982\u7387\u4f1a\u6267\u884c\u5931\u8d25\u3002\u7279\u522b\u662f\u5728\u6027\u80fd\u8f83\u5dee\u7684\u56fd\u4ea7\u5316\u67b6\u6784\u4e0a\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u592a\u53ef\u80fd\u7a33\u5b9a\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#10","title":"10. \u63a2\u7d22\u6027\u6d4b\u8bd5","text":"\u63a2\u7d22\u6027\u6d4b\u8bd5\u901a\u5e38\u662f\u4e00\u4e9b\u4e0d\u786e\u5b9a\u7684\u64cd\u4f5c\uff0c\u591a\u53d8\u5207\u590d\u6742\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u9884\u671f\u4e5f\u53ef\u80fd\u662f\u4e0d\u786e\u5b9a\u7684\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u9a9a\u64cd\u4f5c\u592a\u591a\u4e86\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6b64\u7c7b\u7528\u4f8b\u9002\u5408\u91c7\u7528\u624b\u5de5\u6d4b\u8bd5\uff0c\u662f\u624b\u5de5\u6d4b\u8bd5\u771f\u6b63\u7684\u4ef7\u503c\u4f53\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#11","title":"11. \u6613\u7528\u6027\u6d4b\u8bd5","text":"\u5bf9\u4e8e\u6613\u7528\u6027\u7684\u5224\u65ad\u901a\u5e38\u662f\u4e3b\u89c2\u7684\uff0c\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\u5f88\u96be\u53bb\u5b9a\u4e49\u4ec0\u4e48\u6837\u7684\u60c5\u51b5\u5bf9\u7528\u6237\u662f\u6613\u7528\u7684\uff0c\u81ea\u52a8\u5316\u9700\u8981\u6709\u660e\u786e\u7684\u53ef\u5b9e\u73b0\u7684\u9884\u671f\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_2","title":"\u4e8c\u3001\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u524d\u9762\u8bb2\u4e86\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u4e00\u4e9b\u7528\u4f8b\u60c5\u51b5\uff0c\u6709\u540c\u5b66\u5c31\u8bf4\u4e86\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\u4e0d\u7528\u8bb2\u4e86\uff0c\u5c31\u662f\u4e0d\u9002\u5408\u7684\u53cd\u9762\u3002\u6ca1\u6bdb\u75c5\u54c8\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\uff0c\u6211\u4eec\u5927\u4f53\u8fd8\u53ef\u4ee5\u5206\u4e3a\u4e24\u7c7b\uff1a \u7b2c\u4e00\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u597d\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u7b2c\u4e8c\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u4e00\u822c\uff0c\u9700\u8981\u6295\u5165\u66f4\u591a\u7cbe\u529b\u624d\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u4ee5\u4e0b\u4ecb\u7ecd\u4e00\u4e9b\u6211\u4eec\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1_1","title":"1. \u64cd\u4f5c\u76f8\u5bf9\u7b80\u5355","text":"\u7528\u4f8b\u6b65\u9aa4\u76f8\u5bf9\u8f83\u5c11\uff0c\u8fd9\u79cd\u7528\u4f8b\u901a\u5e38\u662f\u4e00\u4e9b\u8def\u5f84\u5f88\u6d45\u7684\u7528\u4f8b\uff0c\u4e00\u822c\u4e5f\u662f\u4e00\u4e9b\u57fa\u7840\u7528\u4f8b\u3002\u7528\u4f8b\u7f16\u5199\u3001\u7ef4\u62a4\u90fd\u53ef\u4ee5\u8f7b\u677e\u641e\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2_1","title":"2. \u5bb9\u6613\u5b9e\u73b0","text":"\u73b0\u6709\u6280\u672f\u662f\u53ef\u5b9e\u73b0\u7684\uff0c\u6ca1\u6709\u96be\u5ea6\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3_1","title":"3. \u7ecf\u5e38\u7528\u4e8e\u56de\u5f52\u6d4b\u8bd5","text":"\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bcf\u6b21\u56de\u5f52\u6d4b\u8bd5\u5fc5\u987b\u8981\u6267\u884c\u7684\u7528\u4f8b\uff0c\u90a3\u4e48\u8fd9\u6761\u7528\u4f8b\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u3002 \u56de\u5f52\u6d4b\u8bd5\u65f6\u6211\u4eec\u9996\u5148\u5e94\u8be5\u4fdd\u8bc1\u5e94\u7528\u5386\u53f2\u57fa\u672c\u529f\u80fd\u6b63\u5e38\uff0c\u6240\u4ee5\u90a3\u4e9b\u6bcf\u6b21\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u90fd\u8981\u6267\u884c\u7684\u7528\u4f8b\u9002\u5408\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4_1","title":"4. \u529f\u80fd\u7a33\u5b9a\u7684\u6838\u5fc3\u529f\u80fd","text":"\u6d89\u53ca\u6838\u5fc3\u529f\u80fd\u7684\u7528\u4f8b\u662f\u6700\u6700\u91cd\u8981\u7684\u7528\u4f8b\uff0c\u4e5f\u662f\u6211\u4eec\u4ea4\u4ed8\u65f6\u5fc5\u987b\u8981\u4fdd\u8bc1\u8d28\u91cf\u7684\u76f8\u5173\u529f\u80fd\uff0c\u56e0\u6b64\u5e94\u8be5\u5c3d\u53ef\u80fd\u7684\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5_1","title":"5. \u8f93\u5165\u6570\u636e\u6d4b\u8bd5","text":"\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u901a\u5e38\u662f\u68c0\u9a8c\u88ab\u6d4b\u5e94\u7528\u63a5\u53d7\u6709\u6548\u6570\u636e\u3001\u62d2\u7edd\u65e0\u6548\u6570\u636e\u7684\u80fd\u529b\u3002\u5982\uff1a\u63d0\u4ea4\u8d85\u957f\u5b57\u7b26\u4e32\u3001\u7279\u6b8a\u5b57\u7b26\u4e32\u7b49\u7b49\u3002 \u6b64\u7c7b\u7528\u4f8b\u624b\u5de5\u6d4b\u8bd5\u5f88\u96be\u6bd4\u8f83\u5168\u9762\u7684\u8986\u76d6\u5230\u6240\u6709\u7684\u8f93\u5165\u60c5\u51b5\uff0c\u4f46\u662f\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\uff0c\u6b64\u7c7b\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u90fd\u662f\u4e00\u6837\u7684\uff0c\u53d8\u5316\u7684\u4ec5\u662f\u8f93\u5165\u53c2\u6570\u548c\u65ad\u8a00\u7ed3\u679c\uff0c\u91c7\u7528\u6570\u636e\u9a71\u52a8\uff0c\u53ef\u4ee5\u8f7b\u677e\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6_1","title":"6. \u683c\u5f0f\u8986\u76d6","text":"\u539f\u56e0\u540c\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u7c7b\u7528\u4f8b\u4e00\u6837\uff0c\u591a\u79cd\u683c\u5f0f\u7684\u8986\u76d6\u4e5f\u662f\u4e00\u4e2a\u5f88\u7e41\u7410\u7684\u4e8b\u60c5\uff0c\u4ea4\u7ed9\u81ea\u52a8\u5316\u6765\u505a\u518d\u5408\u9002\u4e0d\u8fc7\u4e86\u3002 \u6bd4\u5982\u5f71\u9662\u5bf9\u5f71\u7247\u683c\u5f0f\u7684\u68c0\u67e5\u3001\u622a\u56fe\u5f55\u5c4f\u5bf9\u4fdd\u5b58\u683c\u5f0f\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7_1","title":"7. \u68c0\u67e5\u5143\u7d20\u72b6\u6001","text":"\u67e5\u770b\u88ab\u6d4b\u5e94\u7528\u7684\u5143\u7d20\u5c5e\u6027\u3002\u5982\uff1a\u56fe\u7247\u7684\u5927\u5c0f\u548c\u6392\u5217\uff1b\u6309\u94ae\u7684\u53ef\u7528\u548c\u4e0d\u53ef\u7528\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/","title":"AT \u7ecf\u9a8c\u603b\u7ed3","text":"\u6b22\u8fce\u6240\u6709\u4eba\u63d0\u4ea4\u4f60\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u9762\u7684\u4f18\u79c0\u5b9e\u8df5\u7ecf\u9a8c\uff0c\u4ee5\u5e2e\u52a9\u5927\u5bb6\u89e3\u51b3\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#1","title":"1\u3001\u7ec8\u7ed3\u5668","text":"# litaoa@uniontech.com\n \u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4 pytest \u5b9e\u73b0\u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4\u7684\u65b9\u5f0f\u6709\u4e24\u79cd\uff0cyield \u548c\u7ec8\u7ed3\u51fd\u6570\uff1b yield \u5b9e\u73b0\uff0cyield\u524d\u9762\u4e3a\u7528\u4f8b\u7684\u524d\u7f6e\u6b65\u9aa4\uff0cyield \u540e\u9762\u4e3a\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4\u3002 @pytest.fixture\ndef clean_env():\nprint(\"setup\")\nyield\nprint(\"teardown\")\n \u7ec8\u7ed3\u51fd\u6570\u5b9e\u73b0\uff0c\u4f7f\u7528 request.addfinalizer \u6ce8\u518c\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4 @pytest.fixture\ndef clean_env(request):\ndef clean():\nprint(\"teardown\")\nrequest.addfinalizer(clean)\nprint(\"setup\")\n yield\u7684\u4f18\u7f3a\u70b9\uff1a \u4f18\u70b9\uff1a\u4ee3\u7801\u7b80\u6d01\uff0c\u76f4\u89c2\uff0c\u53ef\u4f7f\u7528yield\u5728\u7528\u4f8b\u4e2d\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c \u7f3a\u70b9\uff1a\u82e5\u524d\u7f6e\u6b65\u9aa4\u4e2d\u51fa\u73b0\u9519\u8bef\uff0c\u5219\u540e\u7f6e\u6b65\u9aa4\u4e0d\u4f1a\u6267\u884c \u7ec8\u7ed3\u51fd\u6570\uff1a \u4f18\u70b9\uff1a\u524d\u7f6e\u6b65\u9aa4\u5931\u8d25\u7684\u8bdd\uff0c\u540e\u7f6e\u6b65\u9aa4\u4ecd\u4f1a\u6267\u884c\u4e14\u53ef\u4ee5\u6ce8\u518c\u591a\u4e2a\u540e\u7f6e\u6b65\u9aa4\uff08\u524d\u63d0\uff1a\u9700\u8981\u5728\u4ee3\u7801\u62a5\u9519\u4e4b\u524d\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff09\uff0c\u652f\u6301\u7075\u6d3b\u4f7f\u7528\u540e\u7f6e\u6761\u4ef6 \u7f3a\u70b9\uff1a\u4ee3\u7801\u8f83\u4e3a\u590d\u6742\uff0c\u65e0\u6cd5\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c\uff08\u672c\u4eba\u76ee\u524d\u672a\u5b9e\u73b0\uff09 \u603b\u7ed3\uff1a\u5728\u524d\u7f6e\u6b65\u9aa4\u4fdd\u8bc1\u7edd\u5bf9\u4e0d\u4f1a\u51fa\u9519\u65f6\uff0c\u4f7f\u7528yield\u66f4\u4f73\u7b80\u4fbf\uff0c\u5f53\u524d\u7f6e\u6b65\u9aa4\u6613\u51fa\u73b0\u95ee\u9898\u65f6\uff0c\u63a8\u8350\u4f7f\u7528\u7ec8\u7ed3\u51fd\u6570\u3002 \u573a\u666f\uff1a\u4fdd\u9669\u7bb1\u7528\u4f8b\uff0c\u524d\u7f6e\u6b65\u9aa4\u4e2d\u5f00\u542f\u4fdd\u9669\u7bb1\uff0c\u540e\u7f6e\u6b65\u9aa4\u5220\u9664\u4fdd\u9669\u7bb1\u3002 @pytest.fixture(scope=\"session\", autouse=True)\ndef vault_fixture(request):\nDfmWidget.reset_vault_by_cmd() # 1\u3001\u91cd\u7f6e\u4fdd\u9669\u7bb1\nDdeDockPublicWidget().close_file_manager_by_cmd() # 2\u3001\u5173\u95ed\u6587\u7ba1\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 3\u3001\u5f00\u542f\u6587\u7ba1\nvault = DfmWidget()\nvault.create_file_vault() # 4\u3001\u521b\u5efa\u4fdd\u9669\u7bb1\ndef delete_vault(): # 8\u3001\u5220\u9664\u4fdd\u9669\u7bb1\u7684\u540e\u7f6e\u6b65\u9aa4\nsleep(2)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr()\nvault = DfmWidget()\nvault.delete_file_vault()\nDfmWidget.reset_vault_by_cmd()\nDdeDockPublicWidget().close_file_manager_by_cmd()\nrequest.addfinalizer(delete_vault) # 5\u3001\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\nDdeDockPublicWidget().close_file_manager_by_cmd() # 6\u3001\u5173\u95ed\u6587\u7ba1\nsleep(1)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 7\u3001\u5f00\u542f\u6587\u7ba1\n \u4ee3\u7801\u6309\u6ce8\u91ca\u4e2d\u7684\u5e8f\u53f7\u6267\u884c\u6b65\u9aa4 \u4ee3\u7801\u5728\u6b65\u9aa41-4\u4efb\u610f\u4f4d\u7f6e\u62a5\u9519\uff0c\u5219\u4e0d\u4f1a\u6267\u884c\u6b65\u9aa48\uff0c\u56e0\u4e3a\u672a\u6267\u884c\u5230\u6b65\u9aa45\uff0c\u6b65\u9aa48\u8fd8\u672a\u6ce8\u518c \u4ee3\u7801\u5728\u6b65\u9aa46-7\u62a5\u9519\uff0c\u4ecd\u4f1a\u6267\u884c\u6b65\u9aa47\uff0c\u56e0\u4e3a\u5728\u6b65\u9aa45\u4e2d\u5df2\u7ecf\u5c06\u6b65\u9aa47\u6ce8\u518c \u53ef\u4ee5\u7075\u6d3b\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff0c\u80fd\u5b9e\u73b0\u67d0\u4e2a\u524d\u7f6e\u6b65\u9aa4\u6267\u884c\u4e4b\u540e\uff0c\u624d\u4f1a\u6267\u884c\u540e\u7f6e\u6b65\u9aa4\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#2","title":"2\u3001\u542f\u52a8\u5e94\u7528\u7684\u65b9\u5f0f","text":"# huangmingqiang@uniontech.com\n \uff081\uff09\u547d\u4ee4\u884c\u542f\u52a8 \u5728 AT \u4ee3\u7801\u4e2d\u4f7f\u7528\u547d\u4ee4\u884c\u542f\u52a8\u5e94\u7528\uff0c\u4e3e\u4f8b\uff1a os.popen(\"deepin-music\")\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f7f\u7528 ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6\uff0cdogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u3002 \uff082\uff09\u901a\u8fc7 UI \u64cd\u4f5c\u542f\u52a8 \u901a\u8fc7\u4efb\u52a1\u680f\u3001\u542f\u52a8\u5668\u3001\u684c\u9762\u7b49UI\u65b9\u5f0f\u542f\u52a8\uff0c\u6bd4\u5982\u53cc\u51fb\u6253\u5f00\u3001\u53f3\u952e\u6253\u5f00\u7b49\uff0c\u8fd9\u79cd\u64cd\u4f5c\u65b9\u5f0f\u4e0d\u5b58\u5728ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6dogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u7684\u95ee\u9898\uff0c\u4e5f\u66f4\u52a0\u7b26\u5408\u7528\u6237\u7684\u64cd\u4f5c\u884c\u4e3a\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#3","title":"3\u3001\u6587\u4ef6\u9009\u62e9\u6846\u5c5e\u6027\u5b9a\u4f4d\u5076\u73b0\u65e0\u6cd5\u627e\u5230","text":"\u6587\u4ef6\u9009\u62e9\u6846\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5728\u8c03\u7528\u6587\u4ef6\u9009\u62e9\u6846\u65f6\uff0c\u6709\u4e00\u5b9a\u7684\u6982\u7387\u51fa\u73b0\uff0c\u754c\u9762\u5df2\u7ecf\u6e32\u67d3\u51fa\u6765\u4e86\uff0c\u4f46\u662f\u5c5e\u6027\u6811\u5e76\u6ca1\u6709\u5199\u5165\uff0c\u5bfc\u81f4\u901a\u8fc7\u5c5e\u6027\u65e0\u6cd5\u627e\u5230\u5143\u7d20\uff0c\u76ee\u524d\u4e5f\u6ca1\u6709\u5f88\u597d\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u4e3a\u4e86\u7528\u4f8b\u7a33\u5b9a\u6027\uff0c\u6587\u4ef6\u9009\u62e9\u6846\u7684\u64cd\u4f5c\u5efa\u8bae\u4f7f\u7528UI\u6216\u8005\u56fe\u7247\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u53ef\u4ee5\u901a\u8fc7\u641c\u7d22\u5185\u5bb9\u56fa\u5b9a\u6587\u4ef6\u4f4d\u7f6e\u3002 # litaoa@uniontech.com\n desk = DdeDesktopPublicWidget()\n# \u9009\u62e9\u89c6\u9891\u76ee\u5f55\ndesk.click_videos_dir_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.ctrl_f()\nsleep(1)\ndesk.input_message(\"\u5143\u7d20\u540d\u79f0\")\nsleep(0.5)\ndesk.enter()\nsleep(1)\n# \u9009\u62e9\u7b2c\u4e00\u4e2a\u6587\u4ef6\ndesk.click_list_view_btn_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.click_first_file_in_desktop_plugs_by_ui()\nsleep(1)\n# \u6587\u7ba1\u63d2\u4ef6\u4e2d\u70b9\u51fb\u6253\u5f00\ndesk.click_open_btn_in_desktop_plugs_by_ui()\n"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#4","title":"4\u3001\u5e94\u7528\u542f\u52a8","text":"# mikigo\n \u5728UI\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u4e00\u5207\u64cd\u4f5c\u7684\u90fd\u662f\u4ece\u5e94\u7528\u542f\u52a8\u5f00\u59cb\u7684\uff0c\u800c\u5728Linux\u684c\u9762\u5e94\u7528\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u6211\u4eec\u542f\u52a8\u5e94\u7528\u7684\u65b9\u6cd5\u6709\u591a\u79cd\uff0c\u4e0b\u9762\u505a\u4e00\u4e2a\u7b80\u5355\u7684\u4ecb\u7ecd\uff1a \u3010\u4f7f\u7528dogtail\u542f\u52a8\u3011 dogtail\u63d0\u4f9b\u4e86\u5e94\u7528\u542f\u52a8\u7684\u65b9\u6cd5\uff0c\u5728utils\u5e93\u4e2d\uff0c\u4f7f\u7528run\u65b9\u6cd5\u542f\u52a8\uff1a \u9996\u5148\u5bfc\u5165\u65b9\u6cd5\uff1a from dogtail.utils import *\n \u8c03\u7528run\u65b9\u6cd5 run('deepin-music')\n \u5373\u53ef\u542f\u52a8\u97f3\u4e50 \u8fd9\u79cd\u65b9\u6cd5\u7684\u4f18\u70b9\u662f\u91c7\u7528\u8fdb\u7a0b\u7684\u65b9\u5f0f\u76f4\u63a5\u542f\u52a8\uff0c\u4e0d\u4f9d\u8d56\u4e0eUI\uff0c\u65e0\u8bba\u684c\u9762\u6216\u4efb\u52a1\u680f\u4e0a\u662f\u5426\u5b58\u5728\u5e94\u7528\u56fe\u6807\uff0c\u90fd\u53ef\u4ee5\u6b63\u5e38\u542f\u52a8\u3002 \u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c \u5982\u679c\u4f7f\u7528ssh\u8fdc\u7a0b\u8c03\u7528\uff0c\u6216\u8005Jenkins\u4e2d\u6267\u884c\u6d4b\u8bd5\u811a\u672c\u7684\u65f6\u5019\uff0c\u5728sniff\u4e2d\u4f1a\u51fa\u73b0\u627e\u4e0d\u5230\u5e94\u7528\uff0c\u7ecf\u8fc7\u5206\u6790\uff0c\u53ef\u80fd\u662f\u56e0\u4e3a\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\u542f\u52a8\u7684\u65f6\u5019\uff0c\u5b9e\u9645\u662f\u91c7\u7528\u4e00\u4e2a\u5b50\u8fdb\u7a0b\u542f\u52a8\u4e86\u5e94\u7528\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u5230\u3002 \u3010\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u3011 \u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807 \u901a\u5e38\u6709\u4e24\u79cd\u65b9\u6cd5\uff1a \uff081\uff09\u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807\u3002 \uff082\uff09\u5df2\u77e5\u5e94\u7528\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u7684\u4f4d\u7f6e\uff0c\u7136\u540e\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u5bf9\u5e94\u5750\u6807\u3002 \u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u7f3a\u70b9\u662f\u4f4d\u7f6e\u5fc5\u987b\u56fa\u5b9a\uff0c\u5982\u679c\u79fb\u52a8\u4f4d\u7f6e\u5c31\u4e0d\u884c\u4e86\uff0c\u800c\u4f7f\u7528\u7b2c\u4e00\u79cd\u65b9\u6cd5\uff0c\u65e0\u8bba\u4f4d\u7f6e\u5728\u54ea\u91cc\uff0c\u53ea\u8981\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u5b58\u5728\u5373\u53ef\u3002 \u3010\u70b9\u51fb\u684c\u9762\u56fe\u6807\u542f\u52a8\u3011 \u684c\u9762\u56fe\u6807\u76ee\u524d\u662f\u91c7\u7528\u56fe\u50cf\u8bc6\u522b\u6280\u672f\uff0c\u5b9a\u4f4d\u5230\u5e94\u7528\u56fe\u6807\u7684\u5750\u6807\uff0c\u7136\u540e\u901a\u8fc7pyauogui\u8fdb\u884c\u70b9\u51fb\u64cd\u4f5c\u3002 \u8be6\u7ec6\u6280\u672f\u65b9\u6848\u53ef\u4ee5\u53c2\u8003\u6211\u7684\u53e6\u5916\u4e24\u7bc7\u535a\u5ba2: \u57fa\u4e8eopencv\u7684\u6a21\u677f\u5339\u914d\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd4\u56de\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 Python\u4e09\u65b9\u5e93PyAutoGui\u7684\u4f7f\u7528\u65b9\u6cd5 \u3010\u4ece\u542f\u52a8\u5668\u542f\u52a8\uff08\u4fd7\u79f0\u5f00\u59cb\u83dc\u5355\uff09\u3011 \u542f\u52a8\u4e2d\u542f\u52a8\u7684\u5b9e\u73b0\u903b\u8f91\u5b9e\u9645\u548c\u4efb\u52a1\u680f\u4e0a\u542f\u52a8\u5dee\u4e0d\u591a\u3002 \u9996\u5148\uff0c\u9700\u8981\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u542f\u52a8\u5668\u56fe\u6807\uff0c\u6216\u8005\u952e\u76d8super\u952e\uff0c\u5c06\u542f\u52a8\u5668\u547c\u51fa\u6765\uff0c \u7136\u540e\uff0c\u5728\u542f\u52a8\u5668\u4e2d\u70b9\u51fb\u5bf9\u5e94\u7684\u56fe\u6807\uff0c \u4f46\u662f\u8fd9\u91cc\u6709\u4e2a\u95ee\u9898\uff0c\u542f\u52a8\u5668\u4e2d\u7684\u5e94\u7528\u5217\u8868\uff0c\u4e00\u9875\u5c55\u793a\u4e0d\u5b8c\uff0c\u6240\u4ee5\u5982\u679c\u6211\u4eec\u8981\u70b9\u51fb\u7684\u5e94\u7528\u56fe\u6807\u4e0d\u5728\u7b2c\u4e00\u9875\u600e\u4e48\u529e\uff0c\u901a\u5e38\u89e3\u51b3\u65b9\u6848\u6709\u4e24\u79cd\uff1a \uff081\uff09\u9700\u8981\u8fdb\u884c\u5411\u4e0b\u6ed1\u52a8\uff0c\u8fd9\u91cc\u5c31\u6d89\u53ca\u5230\u76f8\u5e94\u7684\u8bc6\u522b\u65b9\u6848\uff0c\u5224\u65ad\u5982\u679c\u4e0d\u5728\u7b2c\u4e00\u9875\u5c31\u5f80\u4e0b\u6ed1\u52a8\u7ffb\u9875\u3002 \uff082\uff09\u542f\u52a8\u5668\u63d0\u4f9b\u641c\u7d22\u7684\u529f\u80fd\uff0c\u8f93\u5165\u5e94\u7528\u540d\u79f0\u641c\u7d22\uff0c\u7136\u540e\u8fdb\u884c\u70b9\u51fb\u3002 \u4ece\u5b9e\u9645\u64cd\u4f5c\u4e2d\u6765\u770b\uff0c\u91c7\u7528\u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u6548\u7387\u4f1a\u9ad8\u4e00\u70b9\u3002 \u3010\u7ec8\u7aef\u547d\u4ee4\u542f\u52a8\u3011 \u5728python\u4e2d\uff0c\u4f7f\u7528os.popen()\u6216os.system()\u6216\u8005subprocess.Popen()\uff0c\u5b9e\u73b0\u547d\u4ee4\u884c\u542f\u52a8\uff0c\u6bd4\u5982\uff1a import os\nos.popen('deepin-music')\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u8fdc\u7a0b\u6267\u884c\u811a\u672c\u7684\u65f6\u5019\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u7684\u95ee\u9898\u3002 \u3010\u603b\u7ed3\u3011 \u4ee5\u4e0a\u51e0\u79cd\u65b9\u6cd5\uff0c\u5404\u6709\u4f18\u7f3a\u70b9\uff0c\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff1a \uff081\uff09\u5982\u679c\u9700\u8981\u5728Jenkins\u4e2d\u505a\u6301\u7eed\u96c6\u6210\uff0c\u5efa\u8bae\u4f7f\u7528\u7b2c\u4e8c\u79cd\u4efb\u52a1\u680f\u542f\u52a8\u7684\u65b9\u6cd5\u3002 \uff082\uff09\u5982\u679c\u4e0d\u4f1a\u91c7\u7528\u8fdc\u7a0b\u6267\u884c\u7684\uff0c\u5efa\u8bae\u91c7\u7528\u7b2c\u4e00\u79cd\u6216\u8005\u6700\u540e\u4e00\u79cd\u65b9\u6848\u3002 \uff083\uff09\u7b2c\u4e09\u79cd\u548c\u7b2c\u56db\u79cd\u542f\u52a8\u65b9\u6cd5\uff0c\u901a\u5e38\u5728\u6d4b\u8bd5\u7528\u4f8b\u4e2d\u4f1a\u6d89\u53ca\u5230\uff0c\u6240\u4ee5\u5076\u5c14\u4f1a\u7528\u3002"},{"location":"RELEASE/","title":"\u7248\u672c\u66f4\u65b0\u8bb0\u5f55","text":""},{"location":"RELEASE/#220202395","title":"2.2.0\uff082023/9/5\uff09","text":"new \u6b63\u5f0f\u542f\u7528 letmego \u6280\u672f\u65b9\u6848\uff1b fix \u5bf9 docs \u91cc\u9762\u7ec6\u5316\u4e86\u8fdc\u7a0b\u6267\u884c\u7ae0\u8282\u7684\u63cf\u8ff0\uff1b "},{"location":"RELEASE/#2152023831","title":"2.1.5\uff082023/8/31\uff09","text":"new \u5c06\u6709\u8da3\u7684\u6587\u6863\u7cfb\u7edf\u8fc1\u79fb\u5230 linuxdeepin \uff0c\u5265\u79bb\u6587\u6863\u4e2d\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u91c7\u7528 CDN \u52a0\u901f\u65b9\u5f0f\u52a0\u8f7d\uff1b \u5c1d\u8bd5\u5408\u5165\u4e00\u4e2a\u6709\u8da3\u7684\u529f\u80fd\uff1b fix \u4fee\u590d\u4e86 Wayland \u952e\u9f20\u5de5\u5177\u6ca1\u6709\u9f20\u6807\u76f8\u5bf9\u79fb\u52a8\u65b9\u6cd5 moveRel \u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 Wayland \u4e0b\u83b7\u53d6\u7a97\u53e3\u4fe1\u606f\u529f\u80fd\u6a21\u5757\u4e2d\u73af\u5883\u53d8\u91cf\u7684\u95ee\u9898\uff1b \u4f18\u5316\u4e86 startproject \u529f\u80fd\u7684\u4e00\u4e9b\u4fe1\u606f\u8f93\u51fa\uff1b \u4fee\u590d\u4e86\u7279\u6b8a\u573a\u666f\u4e0b env_dev.sh \u5f00\u53d1\u73af\u5883\u90e8\u7f72\u662f\u53ef\u80fd\u5f71\u54cd\u5230\u6b63\u5f0f\u73af\u5883 env.sh \u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#2122023822","title":"2.1.2\uff082023/8/22\uff09","text":"new \u589e\u52a0 OCR \u8bc6\u522b\u81ea\u52a8\u91cd\u8bd5\u673a\u5236\uff0c\u9ed8\u8ba4\u91cd\u8bd5 2 \u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u91cd\u8bd5\u6b21\u6570\uff1b \u4f7f\u7528\u7a97\u7ba1\u6700\u65b0\u63d0\u4f9b\u7684\u4e8c\u8fdb\u5236\u63a5\u53e3\uff0c\u4f18\u5316\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u5728 Wayland \u4e0b\u83b7\u53d6\u7a97\u53e3\u4fe1\u606f\u7684\u65b9\u6cd5\uff1b\u611f\u8c22\u684c\u9762\u6d4b\u8bd5\u90e8 @\u4f55\u6743 @\u5b59\u7fe0 \u3001\u7a97\u7ba1\u7814\u53d1 @\u9ec4\u6cfd\u94ed \u7684\u5927\u529b\u652f\u6301\u3002 \u6269\u5145 skipif \u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\u51fd\u6570\uff1a skipif_xdg_type \u652f\u6301 x11 \u6216 wayland \u4e0a\u8df3\u8fc7\uff1b skipif_cpu_name \u652f\u6301\u4e0d\u540c cpu \u4e0a\u8df3\u8fc7\uff0c\u6bd4\u5982\uff1askipif_cpu_name-KLVVW5821\uff1b "},{"location":"RELEASE/#2102023818","title":"2.1.0\uff082023/8/18\uff09","text":"fix \u4fee\u590d SW \u67b6\u6784\u73af\u5883\u4f9d\u8d56\u7684\u95ee\u9898\uff0c\u539f\u56e0\u662f\u4e4b\u524d\u6211\u8fd9\u91cc\u672c\u5730\u6ca1\u6709 SW \u7684\u673a\u5668\uff0c\u6ca1\u6709\u505a\u76f8\u5173\u9002\u914d\uff1b \u4fee\u590d\u5b50\u9879\u76ee\u5355\u72ec\u9700\u8981\u4e09\u65b9\u5305 pexpect\uff0c\u7531\u4e8e\u4e4b\u524d\u662f\u9884\u88c5\u5230\u955c\u50cf\u91cc\u9762\u7684\uff0c\u4f46\u57fa\u7840\u6846\u67b6\u4e0d\u9700\u8981\uff0c\u56e0\u6b64\u6ca1\u6709\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u91cc\u9762\uff0c\u5bfc\u81f4\u5b50\u9879\u76ee\u4f9d\u8d56\u62a5\u9519\u3002 \u4fee\u590d\u5b50\u9879\u76ee cv \u5bfc\u5165\u62a5\u9519\u7684\u95ee\u9898\uff1b \u539f\u56e0\u4e3a\uff1ayouqu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u517c\u5bb9\u4e24\u79cd\u60c5\u51b5\uff0c\u4e00\u79cd\u662f\u9762\u5411\u670d\u52a1\uff0c\u5c31\u662f\u672c\u5730\u6d4b\u8bd5\u673a\u4e0d\u9700\u8981\u5b89\u88c5 OpenCV\uff0c\u7528\u4f8b\u4e2d\u7684\u56fe\u50cf\u8bc6\u522b\u4f1a\u901a\u8fc7\u8fdc\u7a0b\u670d\u52a1\u63a5\u53e3\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u548c\u7ed3\u679c\u83b7\u53d6\uff1b\u7b2c\u4e8c\u79cd\u662f\u539f\u751f\uff0c\u5c31\u662f\u672c\u5730\u76f4\u63a5\u5b89\u88c5 OpenCV \u76f4\u63a5\u7528\u3002\u4e24\u4e2a\u60c5\u51b5\u7684\u4f18\u5148\u7ea7\u662f\u4f18\u5148\u5224\u65ad\u672c\u5730\u5b58\u5728\uff0c\u5426\u5219\u8d70\u670d\u52a1\u3002 \u524d\u9762\u6211\u4eec\u5df2\u7ecf\u628a OCR \u529f\u80fd\u505a\u4e86\u670d\u52a1\u5316\uff0c\u57fa\u4e8e 1 \u5e74\u591a\u4ee5\u6765\u7684\u89c2\u5bdf\uff0c\u7528\u8d77\u6765\u5f88\u7a33\u5b9a\uff0c\u518d\u4e00\u4e2a\u5c31\u662f OpenCV \u5b89\u88c5\u5305\u662f\u6bd4\u8f83\u81c3\u80bf\u7684\uff0c\u7c97\u7565\u6570\u4e86\u4e0b\u4f9d\u8d56\u6709 30+ \u4e2a\uff0c\u800c\u4e14\u5728\u5404\u67b6\u6784\u4e0a\u4f9d\u8d56\u5305\u8fd8\u4e0d\u5c3d\u76f8\u540c\uff0c\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u65b9\u6848\u4e2d\u4e0d\u592a\u597d\u5904\u7406\uff0c\u6240\u4ee5\u672c\u6b21 2.0 \u7248\u672c\u6211\u4eec\u5927\u80c6\u7684\u5c06\u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u529f\u80fd\u4fee\u6539\u4e3a\u9762\u5411\u670d\u52a1\u7684\u65b9\u5f0f\uff0c\u524d\u671f\u6d4b\u8bd5\u4e00\u5207\u770b\u8d77\u6765\u90fd\u5f88\u548c\u8c10\u3002 \u4f46\u662f\u6ca1\u6ce8\u610f\u5230\u4e4b\u524d\u7ed9\u6d77\u71d5\u59d0\u90a3\u8fb9\u9879\u76ee\u5355\u72ec\u5b9a\u5236\u505a\u4e86\u4e2a\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\uff08\u4e3a\u4e86\u80fd\u7b80\u5355\u5e73\u6ed1\u7684\u8fc1\u79fb\u5230 youqu\uff09\uff0c\u6b64\u63a5\u53e3\u5e95\u5c42\u6ca1\u6709\u517c\u5bb9\u670d\u52a1\u5316\uff0c\u6240\u4ee5\u5979\u90a3\u8fb9\u7684\u9879\u76ee\u8c03\u7528\u6b64\u5b9a\u5236\u63a5\u53e3\u4f1a\u62a5 cv \u5bfc\u5165\u7684\u95ee\u9898\u3002 \u7531\u4e8e\u5c06\u8fd9\u4e2a\u5b9a\u5236\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\u8fdb\u884c\u670d\u52a1\u5316\u517c\u5bb9\u6539\u9020\u9700\u8981\u4e00\u5b9a\u65f6\u95f4\uff0c\u6539\u5b8c\u8fd8\u9700\u8981\u6d4b\u8bd5\uff0c\u4f46\u672c\u6b21\u65f6\u95f4\u6bd4\u8f83\u7d27\uff0c\u56e0\u6b64\u5148\u628a OpenCV \u88c5\u8fdb\u865a\u62df\u73af\u5883\uff0c\u540e\u7eed\u7248\u672c\u518d\u8003\u8651\u9488\u5bf9\u6b64\u63a5\u53e3\u505a\u4fee\u6539\u3002"},{"location":"RELEASE/#2002023816","title":"2.0.0\uff082023/8/16\uff09","text":"YouQu\uff08\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff09\u5f00\u6e90\u4e86\uff0c\u540c\u65f6\u63a8\u51fa\u4e86 2.0 \u7248\u672c\u3002 \u611f\u8c22\u738b\u6ce2\u603b\u3001\u67b6\u6784\u5e08\u5f90\u5c0f\u4e1c\u3001\u7814\u53d1\u7ecf\u7406\u90d1\u5e7c\u6208\u3001\u5218\u90d1\u7b49\u7814\u53d1\u540c\u4e8b\u7684\u5927\u529b\u652f\u6301\u3002 new 1\u3001\u65b0\u7684\u57fa\u7840\u6846\u67b6\u4ee3\u7801\u83b7\u53d6\u65b9\u5f0f\u53ca\u65b0\u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4 YouQu \u540e\u7eed\u5747\u901a\u8fc7 PyPI \u8fdb\u884c\u5305\u7684\u53d1\u5e03\uff0c\u4e5f\u5c31\u662f\u8bf4\u540e\u7eed\u53ef\u4ee5\u4f7f\u7528 pip \u8fdb\u884c\u5b89\u88c5\uff1a sudo pip3 install youqu==2.0.0\n \u8fd9\u91cc\u6709 2 \u4e2a\u5c0f\u70b9\u8981\u6ce8\u610f\uff1a \u63a8\u8350\u4f7f\u7528 sudo pip3 \uff08\u52a0 sudo\uff09\u8fdb\u884c\u5b89\u88c5\uff1b \u5982\u679c\u4e0d\u52a0 sudo \u6709\u4e9b\u673a\u5668\u53ef\u80fd $HOME/.local/bin \u4e0d\u5728\u7cfb\u7edf PATH \u73af\u5883\u76ee\u5f55\u4e0b\uff0c\u5728\u4e0d\u6dfb\u52a0\u73af\u5883\u53d8\u91cf\u7684\u60c5\u51b5\u4e0b\uff0c\u4f1a\u51fa\u73b0 YouQu \u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4\uff08youqu-startproject\uff09\u65e0\u6cd5\u4f7f\u7528\u7684\u95ee\u9898\uff1b \u5f53\u7136\uff0c\u5c06\u4e0a\u8ff0\u8def\u5f84\u6dfb\u52a0\u5230\u73af\u5883\u53d8\u91cf\u4e4b\u540e\u4e5f\u662f\u53ef\u4ee5\u7528\u7684\uff0c\u6240\u4ee5\u6211\u8fd9\u91cc\u662f\u63a8\u8350\u52a0 sudo\uff0c\u4e0d\u52a0 sudo \u4e5f\u662f\u53ef\u4ee5\u7684\uff0c\u53ea\u662f\u9700\u8981\u5173\u6ce8\u4e0b\u73af\u5883\u53d8\u91cf\u7684\u95ee\u9898\u3002 \u63a8\u8350\u6307\u5b9a\u7248\u672c\u53f7\uff08youqu==2.0.0\uff09\u5b89\u88c5\uff0c\u5982\u679c\u4e0d\u6307\u5b9a\u7248\u672c\u53f7\u9ed8\u8ba4\u662f\u5b89\u88c5\u6700\u65b0\u53d1\u5e03\u7684 YouQu \u7248\u672c\uff0c\u4f60\u53ef\u4ee5\u5728 PyPI \u4e0a\u7684 Release history \u91cc\u9762\u67e5\u770b\u6709\u54ea\u4e9b\u7248\u672c\u3002 \u5b89\u88c5\u4e4b\u540e\u4f1a\u81ea\u52a8\u751f\u6210\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu-startproject\uff0c\u4f7f\u7528\u5b83\u53ef\u4ee5\u521d\u59cb\u5316\u5de5\u7a0b\uff0c\u8fd9\u91cc\u4ee5\u97f3\u4e50\u4e3e\u4f8b\uff1b youqu-startproject autotest_deepin_music\n \u8fd9\u6837\u5c31\u4f1a\u5728\u5f53\u524d\u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a autotest_deepin_music \u76ee\u5f55\uff0c\u91cc\u9762\u5305\u542b\u4e86\u57fa\u7840\u6846\u67b6\u6240\u6709\u7684\u4ee3\u7801\uff1b \u4e4b\u540e\uff0c\u8fd8\u662f\u5728 apps \u76ee\u5f55\u4e0b\uff0c\u653e\u5165\u5b50\u9879\u76ee\u7684AT\u4ee3\u7801\u5373\u53ef\uff0c\u4f7f\u7528\u65b9\u6cd5\u548c\u8fc7\u53bb\u4e00\u6837\uff0c\u8fd9\u91cc\u5c31\u4e0d\u591a\u4ecb\u7ecd\u3002 \u53e6\u5916\uff0c\u9664\u4e86\u901a\u8fc7 pip \u83b7\u53d6\u4ee5\u5916\uff0c\u4ecd\u7136\u53ef\u4ee5\u901a\u8fc7\u6e90\u7801\u83b7\u53d6\uff08\u76f4\u63a5 git clone\uff09\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u4f7f\u7528 pip \u5b89\u88c5 YouQu \u65f6\uff0cYouQu \u5305\u7684\u5927\u5c0f\u624d 600+ k\uff0c\u5b89\u88c5\u901f\u5ea6\u8d77\u98de\u3002 2\u3001\u65b0\u7684AT\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848 \u4e3a\u4e86\u89e3\u51b3\u4ee5\u4e0b\u95ee\u9898\uff1a \u8fc7\u53bb\u4e00\u6bb5\u65f6\u95f4\u54b1\u4eec\u7ecf\u5e38\u51fa\u73b0\u7684\uff0c\u4e0d\u540c\u7684AT\u9879\u76ee\u5728\u540c\u4e00\u53f0\u673a\u5668\u4e0a\u90e8\u7f72\u73af\u5883\u65f6\u4f9d\u8d56\u7248\u672c\u51b2\u7a81\u7684\u95ee\u9898\uff0c\u65b0\u65b9\u6848\u4e0d\u540c\u7684\u9879\u76ee\u4f1a\u52a8\u6001\u751f\u6210\u81ea\u5df1\u7684\u865a\u62df\u73af\u5883\uff0c\u76f8\u4e92\u4e4b\u95f4\u4e0d\u5f71\u54cd\uff1b \u4e1a\u5185\u4e3a\u4e86\u89e3\u51b3\u7248\u672c\u51b2\u7a81\u95ee\u9898\u4e00\u822c\u90fd\u4f1a\u4f7f\u7528Python\u865a\u62df\u73af\u5883\u7684\u5de5\u5177\uff0c\u4f46\u662f\u90fd\u6709\u4e2a\u95ee\u9898\uff0c\u65e0\u6cd5\u7ba1\u7406 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u5305\uff0c\u672c\u6b21\u6211\u4eec\u89e3\u51b3\u4e86\u8fd9\u4e2a\u95ee\u9898\uff0c\u80fd\u591f\u5b8c\u5168\u7ba1\u7406\u5e38\u89c4\u7684Python\u5305\uff0c\u4e5f\u80fd\u7ba1\u7406\u5230 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u4e09\u65b9\u5305\uff1b \u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u4f7f\u7528\u65b9\u6cd5\uff1a bash env.sh\n \u53ef\u4ee5\u770b\u51fa\u6765\u548c\u539f\u6765\u4f7f\u7528\u65b9\u6cd5\u6ca1\u6709\u53d8\u5316\uff0c\u4e5f\u5c31\u662f\u8bf4\u4ece\u4f7f\u7528\u7684\u89d2\u5ea6\u662f\u5b8c\u5168\u6ca1\u6709\u533a\u522b\u7684\uff0c\u53ea\u662f\u5185\u90e8\u505a\u4e86\u4e0d\u540c\u7684\u4e8b\u60c5\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u672c\u673a\u90e8\u7f72\u7684\u529f\u80fd\u4ecd\u7136\u4fdd\u7559 env_dev.sh\uff0c\u53ef\u4ee5\u4f5c\u4e3a\u5f00\u53d1\u65f6\u7684\u73af\u5883\u90e8\u7f72\u3002 3\u3001\u65b0\u7684\u9a71\u52a8\u547d\u4ee4 \u8fc7\u53bb\u54b1\u4eec\u90fd\u662f\u4f7f\u7528\u8fd9\u6837\u7684\u547d\u4ee4\u6765\u9a71\u52a8\u6267\u884c\uff1a python3 manage.py run\n \u7531\u4e8e\u9ed8\u8ba4\u57fa\u4e8e\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848\uff0c\u56e0\u6b64\u6211\u4eec\u589e\u52a0\u4e86\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu\uff1b \u65b0\u7684\u9a71\u52a8\u65b9\u5f0f\uff1a youqu manage.py run\n \u53ea\u9700\u8981\u628a python3 \u66ff\u6362\u6210 youqu \u5c31\u53ef\u4ee5\u4e86\uff0c\u770b\u8d77\u6765\u5f88\u548c\u8c10~ 4\u3001\u65b0\u7684\u6587\u6863\u5730\u5740 \u8fc7\u53bb\u54b1\u4eec YouQu \u7684\u5728\u7ebf\u6587\u6863\u662f\u90e8\u7f72\u5728\u516c\u53f8\u5185\u7f51\u7684\uff0c\u73b0\u5728\u5f00\u6e90\u5230 github \u4e86\uff0c\u5916\u90e8\u5f00\u53d1\u8005\u80af\u5b9a\u8bbf\u95ee\u4e0d\u5230\u5185\u7f51\u7684\u6587\u6863\uff0c\u56e0\u6b64\u9700\u8981\u5c06\u6587\u6863\u90e8\u7f72\u5230\u516c\u7f51\u3010\u516c\u7f51\u6587\u6863\u3011\uff1b \u516c\u7f51\u6587\u6863\u4f7f\u7528\u7684\u662f github pages\uff08\u767d\u5ad6\u602a\u4e00\u987f\u72c2\u559c~~\uff09\uff0c\u4f46\u53ef\u80fd\u4f1a\u51fa\u73b0\u6587\u6863\u901f\u5ea6\u6162\u7684\u95ee\u9898\uff08\u4ee3\u7406\u4e0b\u5c31\u597d\u4e86\uff09\uff0c\u4e0d\u8fc7\u6ca1\u5173\u7cfb\uff0c\u54b1\u4eec\u3010\u5185\u7f51\u6587\u6863\u3011\u4ecd\u7136\u4fdd\u7559\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u3002 5\u3001\u5176\u4ed6\u4e00\u4e9b\u5c0f\u5c0f\u529f\u80fd\u66f4\u65b0\uff1a \uff081\uff09\u65b0\u589e\u5173\u95ed\u5206\u8fa8\u7387\u68c0\u6d4b\u7684\u53c2\u6570\u503c\uff1b youqu manage.py run --resolution no\n \u6216\u8005\u4fee\u6539 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387, \u6bd4\u5982\uff1a1920x1080\n;no: \u8868\u793a\u4e0d\u505a\u5206\u8fa8\u7387\u6821\u9a8c\nRESOLUTION = 1920x1080\n resolution \u8fd9\u4e2a\u53c2\u6570\u4e00\u76f4\u90fd\u6709\u7684\uff0c\u53ea\u4e0d\u8fc7\u4e4b\u524d\u662f\u7528\u4e8e\u6307\u5b9a\u5206\u8fa8\u7387\u5927\u5c0f\uff0c\u6bd4\u5982 --resolution 1920x1080\uff0c\u4f46\u6709\u4e9b\u63a5\u53e3\u7684\u9879\u76ee\u4e0d\u9700\u8981\u8fd9\u4e2a\u68c0\u67e5\uff0c\u53ef\u4ee5\u7ed9\u5b83\u4e2a no \u5c31\u597d\u4e86\uff0c\u5f53\u7136 CICD \u4e0a\u5173\u95ed\uff0c\u9700\u8981\u6d41\u6c34\u7ebf\u4e0a\u628a\u8fd9\u4e2a\u53c2\u6570\u52a0\u4e0a\uff1b \uff082\uff09\u65b0\u589e\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u7684\u547d\u4ee4\u884c\u53c2\u6570 \u4e4b\u524d\u8fd9\u4e2a\u914d\u7f6e\u9879\u53ea\u80fd\u5728 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c 1 \u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff0cRERUN >= RECORD_FAILED_CASE\u3002\n;1.\u5173\u95ed\u5f55\u5c4f\uff1aRECORD_FAILED_CASE > RERUN\n;2.\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1aRECORD_FAILED_CASE = 0\nRECORD_FAILED_CASE = 1\n \u73b0\u5728\u5c06\u5f00\u53d1\u5230\u547d\u4ee4\u884c\u53c2\u6570\u3002 youqu manage.py run --record_failed_case 2\n fix \u4fee\u590d remote \u6267\u884c\u65f6\uff0c\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u65e0\u6cd5\u751f\u6210\u6d4b\u8bd5\u62a5\u544a\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1302023710","title":"1.3.0\uff082023/7/10\uff09","text":"fix \u8fdb\u4e00\u6b65\u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b\u53c2\u8003\uff1a\u914d\u7f6ePython\u6e90\u7684\u51e0\u79cd\u65b9\u6cd5 \u4fee\u590d wayland_autotool \u53d7\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86wayland\u4e0b\u5076\u73b0\u627e\u4e0d\u5230 .Xauthority \u6587\u4ef6\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1292023626","title":"1.2.9\uff082023/6/26\uff09","text":"fix \u4f18\u5316\u8fdc\u7a0b\u6267\u884c remote \u7684\u53c2\u6570\u76f4\u63a5\u4f20\u7ed9\u8fdc\u7a0b\u673a\u5668\u7684 run \u547d\u4ee4\uff0c\u4e0d\u7528\u518d\u5355\u72ec\u5904\u7406\u8fdc\u7a0b\u6267\u884c\u7684\u53c2\u6570\u903b\u8f91\uff0c\u540e\u7eed\u4e13\u6ce8\u4e8e\u672c\u5730\u6267\u884c\u529f\u80fd\u5f00\u53d1\uff0c\u8fdc\u7a0b\u6267\u884c\u81ea\u52a8\u9002\u7528\uff1b env.sh \u79fb\u9664 pyyaml \u5b89\u88c5\uff0c\u7531\u5b50\u9879\u76ee\u5728 requirement.txt \u91cc\u9762\u5b9a\u4e49\uff0c\u6846\u67b6\u81ea\u52a8\u52a0\u8f7d\uff1b \u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b "},{"location":"RELEASE/#128202369","title":"1.2.8\uff082023/6/9\uff09","text":"fix \u4fee\u590d\u4e86 pypi \u5b89\u88c5 numpy \u5b58\u5728\u7cfb\u7edf\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#127202368","title":"1.2.7\uff082023/6/8\uff09","text":"fix env.sh \u4e2d\u5b89\u88c5 Python \u5305\u672a\u6307\u5b9a\u7248\u672c\u65f6\uff0c\u65e5\u5fd7\u8f93\u51fa\u5b89\u88c5\u7684\u7248\u672c\uff1b pdocr-rpc 2.0.1\nallure-custom 1.2.1\nfunnylog 1.1.3\n \u4fee\u590d -f \u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u62a5\u9519\u7684\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#126202367","title":"1.2.6\uff082023/6/7\uff09","text":"fix \u4fee\u590d wayland \u4e0a\u8c03\u7528\u9f20\u6807\u4e2d\u952e\u3001\u53f3\u952e\u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b \u4fee\u590d pubilic/dde_desktop_public_widget \u91cc\u9762\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u5b9a\u4f4d\u684c\u9762\u6587\u4ef6\u7684\u65b9\u6cd5\uff0c\u5750\u6807\u6ca1\u6709\u62c6\u5305\u7684\u95ee\u9898\uff1b \u4f18\u5316\u4e86\u7b49\u5f85\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b pycreeze \u7248\u672c\u5347\u7ea7\u5230 0.1.29\uff0c\u5bfc\u81f4\u4e0e pyautogui 0.9.53 \u4e0d\u517c\u5bb9\uff0cenv.sh \u91cc\u9762\u589e\u52a0\u6307\u5b9a pycreeze \u7248\u672c\u4e3a 0.1.28\uff1b "},{"location":"RELEASE/#1252023516","title":"1.2.5\uff082023/5/16\uff09","text":"new --app \u53c2\u6570\u540e\u9762\u65b0\u589e\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u76ee\u524d\u652f\u6301\u4e09\u79cd\u53c2\u6570\u4f20\u5165\u65b9\u5f0f\uff1a ~$: youqu run -a deepin-music\n~$: youqu run -a autotest_deepin_music\n~$: youqu run -a apps/autotest_deepin_music\n \u200b \u540e\u4e24\u79cd\u5165\u53c2\u65b9\u5f0f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\u3002 remote \u8fdc\u7a0b\u6267\u884c\u65b0\u589e\u4ece\u547d\u4ee4\u884c\u4f20\u5165\u6d4b\u8bd5\u673a\u4fe1\u606f\uff0c\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679c password \u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6 setting/remote.ini \u4e2d CLIENT_PASSWORD \u7684\u503c,\u6bd4\u5982\uff1auos@10.8.13.33:1 \u6216 uos@10.8.13.33 \uff1b python3 manage.py remote -c uos@10.8.13.33/uos@10.8.13.34\npython3 manage.py remote -c uos@10.8.13.33:1/uos@10.8.13.34:2\n fix \u65e5\u5fd7\u6a21\u5757\u4fee\u6539\u4e3a\u51fd\u6570\u6267\u884c\u4e4b\u524d\u6253\u5370\u65e5\u5fd7\uff1b \u65e5\u5fd7\u6a21\u5757\u589e\u52a0\u767d\u540d\u5355\uff0c\u901a\u8fc7\u7c7b\u540d\u5f00\u5934\uff0c\u7ed3\u675f\uff0c\u5305\u542b\u7b49\u5173\u952e\u5b57\u63a7\u5236\u9700\u8981\u6253\u5370\u7684\u51fd\u6570\u65e5\u5fd7\uff1b \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5982\u679c\u4f20\u5165\u4e86 app_name \u53ea\u4f1a\u5c06 apps \u76ee\u5f55\u4e0b app_name \u7684\u76ee\u5f55\u53d1\u9001\u5230\u6d4b\u8bd5\u673a\uff1b env.sh \u79fb\u9664 python3-dev\uff1b \u4fee\u590d Wayland \u4e0b env.sh \u73af\u5883\u5b89\u88c5\u5931\u8d25\u7684\u95ee\u9898\uff0c\u4f18\u5316\u4e86 deb \u4f9d\u8d56\u5b89\u88c5\u7684\u903b\u8f91\uff1b \u5c06 env.sh \u5237\u65b0\u6e90\u7684\u65e5\u5fd7\u5728\u7ec8\u7aef\u663e\u793a\uff0c\u89e3\u51b3\u5728 CI \u73af\u5883\u4e0b\uff0c\u957f\u65f6\u95f4\u4e0d\u8f93\u51fa\u65e5\u5fd7\u8fde\u63a5\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d1060 \u534e\u4e3a\u673a\u578b\u5b89\u88c5\u952e\u9f20\u5de5\u5177\u65f6\u4f9d\u8d56\u4e0d\u517c\u5bb9\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1242023227","title":"1.2.4\uff082023/2/27\uff09","text":"fix \u4fee\u6539 CURRENT \u6587\u4ef6\uff1b "},{"location":"RELEASE/#1232023227","title":"1.2.3\uff082023/2/27\uff09","text":"new pylint.sh \u652f\u6301\u901a\u8fc7\u4f4d\u7f6e\u53c2\u6570\u4f20\u5165\u6587\u4ef6\u8def\u5f84\uff1abash pylint.sh apps/autotest_deepin_music,\u597d\u5904\u662f\u53c2\u6570\u8def\u5f84\u53ef\u4ee5\u5728\u7ec8\u7aef\u8865\u5168\uff1b \u65b0\u589e\u7cfb\u7edf\u547d\u4ee4 youqu-pylint \uff0c\u7528\u4e8e\u9759\u6001\u4ee3\u7801\u626b\u63cf\uff0c\u4f7f\u7528\u65b9\u6cd5: youqu-pylint apps/autotest_deepin_music\uff1b \u7531\u4e8e\u7cfb\u7edf\u4e00\u4e9b dbus \u63a5\u53e3\u6539\u53d8\uff0c\u516c\u5171\u5e93\u4e2d\u7684 dbus \u65b9\u6cd5\u5c06\u4e0d\u518d\u7ef4\u62a4\uff0c\u7531\u5b50\u9879\u76ee\u5728 other_widget.py \u91cc\u9762\u8fdb\u884c\u7ef4\u62a4\uff1b fix \u4fee\u590d ssh \u73af\u5883\u4e0b\u8fd0\u884c\u63d0\u793a \u201c\u65e0\u6cd5\u8fde\u63a5\u201d \u7684\u95ee\u9898\uff1b \u4fee\u590d\u8fd0\u884c\u65f6\u7a0b\u5e8f\u9000\u51fa\uff0c\u4e0d\u8f93\u51fa\u5f02\u5e38\u65e5\u5fd7\u7684\u95ee\u9898\uff1b \u4fee\u590dyouqu remote xxx \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5728\u670d\u52a1\u7aef Ctrl + C \u65e0\u6cd5\u505c\u6b62\u7a0b\u5e8f\u8fd0\u884c\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#122202328","title":"1.2.2\uff082023/2/8\uff09","text":"new \u65b0\u589e\u6c14\u6ce1\u7c7b\u56fe\u50cf\u8bc6\u522b\u65b9\u6848\uff1bimage_utils.py::ImageUtil::get_during\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u533a\u57df\u8bc6\u522b\uff0c\u4f20\u5165 [x, y, w, h]\uff0cx: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u76ee\u6807\u56fe\u7247\uff0c\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\uff1b env.sh \u79fb\u9664 pypinyin; \u4f18\u5316\u6267\u884c env.sh \u65f6\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b manage.py \u79fb\u9664\u4e86\u53c2\u6570 session_timeout \uff0c\u6846\u67b6\u6839\u636e\u5168\u5c40\u7684 timeout \u4ee5\u53ca\u7528\u4f8b\u81ea\u5b9a\u4e49\u7684 timeout \u81ea\u52a8\u8ba1\u7b97\u51fa sessiontimeout \u7684\u503c\uff1b \u65b0\u589e ocr \u670d\u52a1\u5668\u94fe\u63a5\u91cd\u8bd5\uff0c\u9ed8\u8ba4\u91cd\u8bd51\u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u53c2\u6570\uff1b fix \u4fee\u590d\u4e86\u4e00\u4e9b pylint \u626b\u63cf\u7684\u4ee3\u7801\u98ce\u683c\u95ee\u9898\uff1b \u91cd\u65b0\u8bbe\u8ba1\u4e86\u6d4b\u8bd5\u62a5\u544a\u4e3b\u9898\uff1b "},{"location":"RELEASE/#121202316","title":"1.2.1\uff082023/1/6\uff09","text":"new \u652f\u6301\u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6267\u884c\u7528\u4f8b\uff1b\u53ef\u5c06python3 manage.py \u66ff\u6362\u4e3a youqu \uff1a youqu run -a deepin-music -k 001\n RPC \u670d\u52a1 IP \u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u6307\u5b9a\u4e0d\u540c\u7684\u7aef\u53e3\uff1b \u5728\u7ebf\u6587\u6863\u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u539f\u6765\u7684\u5730\u5740 10.8.10.215 \u5c06\u4e0d\u5728\u4f7f\u7528\uff1b fix \u4fee\u590d --count \u53c2\u6570\u53ef\u80fd\u51fa\u73b0\u4e0e\u5176\u4ed6\u6846\u67b6\u7684\u5de5\u7a0b\u4f9d\u8d56\u5b58\u5728\u51b2\u7a81\uff0c\u62a5\u9519\u91cd\u590d\u6ce8\u518c\u7684\u95ee\u9898\uff1b \u4fee\u590d CI \u73af\u5883\u4e0b\u591a\u4e2a\u5de5\u7a0b\u5b58\u5728 Python \u73af\u5883\u53d8\u91cf\u6307\u5411\u9519\u8bef\uff0c\u5bfc\u5305\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u5355\u72ec\u8fd0\u884c\u65b9\u6cd5\u65f6\u65e0\u65e5\u5fd7\u8f93\u51fa\u7684 Bug\uff1b "},{"location":"RELEASE/#12020221230","title":"1.2.0\uff082022/12/30\uff09","text":"1.1.4 \u7248\u672c\u9002\u914d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e14\u65b0\u589e\u4e86\u8f83\u591a\u65b0\u7279\u6027\uff0c\u6211\u4eec\u8ba1\u5212\u4f7f\u7528 1.1.4 \u7248\u672c\u8fd0\u884c\u4e00\u6bb5\u65f6\u95f4\uff0c1.2.0 \u7248\u672c\u5c06\u4fee\u590d\u671f\u95f4\u51fa\u73b0\u7684 Bug\uff0c\u7136\u540e\u4f5c\u4e3a\u7a33\u5b9a\u7248\u672c\u53d1\u5e03\u3002 new \u4fee\u6539\u5de5\u7a0b\u540d\u79f0\u4e3a youqu\uff1b \u5c06 sphinx \u6587\u6863\u5de5\u7a0b\u8fc1\u79fb\u5230\u5355\u72ec\u7684\u4ed3\u5e93\uff1b fix \u4fee\u590d startapp \u521b\u5efa\u5de5\u7a0b\u65f6\u5b58\u5728\u5de5\u7a0b\u540d\u79f0\u65f6\u65e0\u6cd5\u7ee7\u7eed\u521b\u5efa\uff1b \u4fee\u590d\u4e86 OCR \u670d\u52a1\u5728\u5e76\u53d1\u65f6\u53ef\u80fd\u51fa\u73b0\u65e0\u6cd5\u8fd4\u56de\u7ed3\u679c\u7684\u95ee\u9898\uff0c\u63d0\u5347 OCR \u670d\u52a1\u9ad8\u5e76\u53d1\u7a33\u5b9a\u6027\uff1b \u4fee\u590d PMS \u540c\u6b65\u6807\u7b7e\u5230 CSV \u6587\u4ef6\u4e0d\u652f\u6301\u7528\u4f8b\u5e93\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11420221214","title":"1.1.4\uff082022/12/14\uff09","text":"new \u65b0\u589e startapp \u5b50\u547d\u4ee4\u521b\u5efa\u5b50\u9879\u76ee\u5de5\u7a0b\u6a21\u677f: python3 manage.py startapp autotest_deepin_xxx \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u91cd\u590d\u6267\u884c\u6b21\u6570\uff1b \u53bb\u6389\u6279\u91cf\u6267\u884c\u524d\u6536\u96c6\u7528\u4f8b\u7684\u6b65\u9aa4\uff1b \u589e\u52a0\u5f00\u59cb\u6267\u884c\u65f6\u6253\u5370\u4e00\u4e9b\u6267\u884c\u53c2\u6570\uff0c\u5982\uff1a \u7528\u4f8b\u6536\u96c6\u6570\u91cf: 99\n\u5931\u8d25\u91cd\u8dd1\u6b21\u6570: 1\n\u6700\u5927\u5931\u8d25\u6b21\u6570: 49\n\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4: 200.0s (03\u520620\u79d2)\n\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4: 11880s (3\u5c0f\u65f618\u52060\u79d2)\n \u5b9a\u5236\u4fee\u6539allure\u62a5\u544alogo\u3001title\u3001\u9ed8\u8ba4\u8bed\u8a00\uff1b manage.py \u6267\u884c\u5f00\u59cb\u65f6\u6253\u5370 logo \u548c\u5f53\u524d\u7248\u672c\uff1a \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u255a\u2588\u2588\u2557 \u2588\u2588\u2554\u255d \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2584\u2584 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2580\u2580\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u2584\u2588 \u2584\u2588 \u2588 \u2588 \u2588 \u2584 \u2588 \u2584 \u2580\u2580\u2588 \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\uff1b \u88c5\u9970\u5668\u65b9\u6cd5\u6307\u5b9a\u6b21\u6570\uff1b @pytest.mark.count(2)\ndef test_music_001():\npass\n \u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u6b21\u6570\uff1b python3 manage.py run -a deepin-music -k 001 --count 2\n \u200b image_utils \u589e\u52a0\u51fd\u6570 save_temporary_picture\uff0c\u652f\u6301\u6307\u5b9a\u5c4f\u5e55\u533a\u57df\u622a\u56fe\u5e76\u8fd4\u56de\u56fe\u7247\u5b58\u653e\u7684\u672c\u5730\u8def\u5f84\uff0c\u540e\u7eed\u4f7f\u7528 assert_image_exist \u8fdb\u884c\u65ad\u8a00 Python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(x, y, width, height) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) button_center \u65b0\u589e btn_size \u83b7\u53d6\u63a7\u4ef6\u5de6\u4e0a\u89d2\u5750\u6807\u53ca\u957f\u5bbd\uff0c\u7528\u4e8e\u52a8\u6001\u7684\u622a\u53d6\u5143\u7d20\u7684\u56fe\u7247\uff0c\u53ef\u7528\u4e8e\u5b9a\u4f4d\u65ad\u8a00 python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u6240\u6709\u97f3\u4e50\u6309\u94ae\")) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) allure \u62a5\u544a\u4e2d\u5b9a\u4f4d\u95ee\u9898\u9664\u4e86\u65e5\u5fd7\u3001\u622a\u56fe\u3001\u5f55\u5c4f\u5916\uff0c\u8c03\u7528\u7684\u51fd\u6570\u589e\u52a0\u4e86 step \u6b65\u9aa4\u5c55\u793a\uff1b env.sh \u65b0\u589e\u5b89\u88c5\u5b50\u9879\u76ee Python \u4e09\u65b9\u4f9d\u8d56\uff0c\u5728\u5b50\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u5199 requirement.txt \u6587\u4ef6\uff0cenv.sh \u4f1a\u81ea\u52a8\u52a0\u8f7d\uff1b ocr \u8bc6\u522b\u65b0\u589e\u652f\u6301\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\u8fdb\u884c\u6587\u5b57\u8bc6\u522b\uff0c\u51cf\u5c11\u56e0\u5168\u5c4f\u8bc6\u522b\u65f6\uff0c\u5176\u4ed6\u6587\u5b57\u7684\u5e72\u6270 Python # \u65ad\u8a00\u97f3\u4e50\u7684\u5220\u9664\u5f39\u7a97\u4e2d\uff0c\u5305\u542b\u4e86\u201c\u786e\u8ba4\u201d\u7684\u6587\u5b57 self.assert_ocr_exist(\"\u786e\u8ba4\", picture_abspath=DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u5220\u9664\u5f39\u7a97\"))) \u65ad\u8a00\u51fd\u6570\u7684\u8c03\u7528\u4e5f\u4f1a\u81ea\u52a8\u6253\u5370\u65e5\u5fd7; env.sh \u65b0\u589e\u88c1\u526a\u4f9d\u8d56\u7684\u65b9\u6848\uff1b fix \u4fee\u590d Jenkins \u73af\u5883\u4e0b\uff0c apps \u76ee\u5f55\u4e0b\u5b50\u9879\u76ee\u5b58\u5728 auotest_deepin_xxx@tmp \u76ee\u5f55\uff0c\u5728\u4f20\u5165 app_name \u540e\u65e0\u6cd5\u6267\u884c\u7528\u4f8b\u7684\u95ee\u9898\uff1b \u4fee\u590d\u81ea\u52a8\u751f\u6210 case_list.csv \u6587\u4ef6\u65f6\uff0c\u7528\u4f8b\u987a\u5e8f\u88ab\u8c03\u6574\u7684\u95ee\u9898\uff1b env.sh \u73af\u5883\u5b89\u88c5\u79fb\u9664 git \u548c curl\uff1b \u4fee\u590d\u7528\u4f8b\u5728 setup \u9636\u6bb5\u62a5\u9519\u540e\uff0c\u672a\u5199\u5165 ci_result.json \u7684\u95ee\u9898\uff1b \u79fb\u9664 uos_ci.py\uff1b "},{"location":"RELEASE/#11320221028","title":"1.1.3\uff082022/10/28\uff09","text":"new \u65b0\u589e\u56fe\u50cf\u65ad\u8a00\u6210\u529f\u8f93\u51fa\u5339\u914d\u5ea6\uff1b \u65b0\u589e\u73af\u5883\u5b89\u88c5 yaml \u4f9d\u8d56\uff1b \u65b0\u589e\u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6570\u636e\u56de\u586b\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b \u65b0\u589e\u6d4b\u8bd5\u7ed3\u679c\u8868\u60c5\u663e\u793a\uff0c\u5e76\u4f18\u5316\u4e86\u65e5\u5fd7\u7684\u6392\u7248\uff1b \u65b0\u589e --top {number} \u7528\u4e8e\u8bb0\u5f55\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0c\u65e5\u5fd7\u751f\u6210\u5230 report/logs/top.log\uff1b fix \u4fee\u590d\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4f46\u7ec8\u7aef\u6ca1\u6709\u9519\u8bef\u65e5\u5fd7\u8f93\u51fa\u7684\u95ee\u9898\uff1b \u4fee\u6539\u5931\u8d25\u7528\u4f8b\u56de\u6eaf\u65e5\u5fd7\u4e3a\u8be6\u7ec6\u7ea7\u522b\uff1b \u4fee\u590d\u4e86\u6267\u884c\u8fdb\u5ea6\u672a\u8ba1\u7b97\u8df3\u8fc7\u7528\u4f8b\u7684\u95ee\u9898\uff0c\u5e76\u4f18\u5316\u4e86\u8fdb\u5ea6\u83b7\u53d6\u7684\u7b97\u6cd5\uff1b \u4fee\u590d env.sh \u5728 V23 \u73af\u5883\u4e0b\u5b89\u88c5\u65e0\u6cd5\u8bfb\u53d6\u5bc6\u7801\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 pms \u6d4b\u8bd5\u5957\u6267\u884c\u6216\u6d4b\u8bd5\u5355\u6267\u884c\u65f6\uff0c\u7528\u4f8bID\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b env.sh \u91cc\u9762 hub.deepin.com \u66f4\u6362\u6210 it.uniontech.com\uff1b uos_ci.py \u6d4b\u8bd5\u7ed3\u679c\u7edf\u8ba1\u65f6\uff0c\u603b\u6570\u5254\u9664 skip \u7684\u6570\u91cf "},{"location":"RELEASE/#11220220921","title":"1.1.2\uff082022/09/21\uff09","text":"new \u5728\u6ca1\u6709\u5b89\u88c5 dogtail \u7684\u60c5\u51b5\u4e0b\uff0c\u4e5f\u80fd\u4f7f\u7528 sniff \u5de5\u5177\uff1b fix \u4fee\u590d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e2d\u6ca1\u6709\u5b89\u88c5 AT \u73af\u5883\u6267\u884c uos_ci.py \u62a5\u9519\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11120220919","title":"1.1.1\uff082022/09/19\uff09","text":"new \u65b0\u589e\u6267\u884c\u8fdb\u5ea6\u663e\u793a\uff0c\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u65f6\u65e5\u5fd7\u8f93\u51fa\u5f53\u524d\u8fdb\u5ea6\uff1a[\u5f53\u524d\u6307\u5b9a\u7b2c\u51e0\u6761/\u7528\u4f8b\u603b\u6570]\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u7528\u4f8b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\u6240\u6709\u5931\u8d25\u7528\u4f8b\u7684\u5217\u8868\uff1b \u5173\u95ed\u7ec8\u7aef\u8f93\u51fa\u6355\u83b7\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u65e5\u5fd7\u5feb\u7167\uff1b \u4f18\u5316\u7ec8\u7aef\u8f93\u51fa\u5931\u8d25\u4fe1\u606f\u5197\u957f\u4e3a\u7b80\u8981\u4fe1\u606f\u8f93\u51fa\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u663e\u793a 10 \u4e2a\u6267\u884c\u6700\u6162\u7684\u7528\u4f8b\u5217\u8868\uff0c\u5e76\u8be6\u7ec6\u5217\u51fa\u5404\u4e2a\u9636\u6bb5\u7684\u8017\u65f6\uff1b \u5931\u8d25\u91cd\u8dd1\u7528\u4f8b\u91cd\u8dd1\u4e4b\u524d\u5ef6\u8fdf 1 \u79d2\uff1b \u65b0\u589e\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4ecd\u7136\u5f3a\u5236\u6267\u884c\uff1b \u7528\u4f8b\u6536\u96c6\u65f6\u4ec5\u5728 apps \u76ee\u5f55\u4e0b\u8fdb\u884c\uff0c\u5ffd\u7565 src,setting,public \u76ee\u5f55\uff1b \u65b0\u589e allure \u62a5\u544a\u5907\u4efd\u529f\u80fd\uff0c\u9ed8\u8ba4\u5907\u4efd\u81f3 allure_back \u76ee\u5f55\u4e0b\uff1b manage.py\u65b0\u589e\u53c2\u6570 --lastfailed \u7528\u4e8e\u53ea\u8dd1\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\u7684\u529f\u80fd\uff1b fix \u4fee\u590d\u4e86\u5728\u6ca1\u6709\u6307\u5b9a\u5e94\u7528\u540d\u79f0\u6267\u884c\u65f6\uff0cxml \u62a5\u544a\u751f\u6210\u8def\u5f84\u5f02\u5e38\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 uos_ci.py \u4f20\u5165 timeout \u548c session_timeout \u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11020220916","title":"1.1.0\uff082022/09/16\uff09","text":"new \u65b0\u589ePMS\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u652f\u6301\u591a\u79cd\u6570\u636e\u56de\u586b\u6a21\u5f0f\uff1b \u4f18\u5316\u4e86\u901a\u8fc7\u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u65f6PMS \u722c\u866b\u7684\u6027\u80fd\uff1b \u65b0\u589e .gitmodules \u6587\u4ef6\uff0c\u7528\u4e8e\u6807\u8bb0\u6240\u6709\u5b50\u9879\u76ee\uff0c\u65b9\u4fbf\u7edf\u4e00\u62c9\u53d6\u4ee3\u7801\uff1b env.sh \u9002\u914d\u793e\u533a\u7248\u4e0a\u5b89\u88c5\u81ea\u52a8\u5316\u73af\u5883\uff1b \u589e\u52a0\u6267\u884c\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u9519\u8bef\u7684\u529f\u80fd\uff1b README.md \u589e\u52a0 Wayland \u4e0b\u4f7f\u7528\u3001\u6d4b\u8bd5\u62a5\u544a\u67e5\u770b\u3001\u5e38\u89c1\u95ee\u9898\u7b49\u7684\u6587\u6863\u8bf4\u660e\uff1b \u589e\u52a0\u4e86\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u5bf9 setup\u3001call\u3001teardown \u8fdb\u884c\u65e5\u5fd7\u5206\u6bb5\uff1b fix \u4fee\u590d\u4e86 \u786e\u8ba4\u4fee\u590d \u5217\u6ca1\u5199\u8868\u5934\uff0c\u4f46\u5199\u4e86 fixed-xxx \u6807\u7b7e\uff0c\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u540c\u4e00\u5e94\u7528\u5185\u591a\u4e2a csv \u6587\u4ef6\u4e2d \u786e\u8ba4\u4fee\u590d \u5217\u6709\u7684\u5199\u4e86\uff0c\u6709\u7684\u6ca1\u5199\uff0c\u53ef\u80fd\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 INFO \u65e5\u5fd7\uff0c\u663e\u793a\u4e3a DEBUG \u7684\u95ee\u9898\uff1b\u4fee\u590d\u4e86\u90e8\u5206\u673a\u5668\u4e0a INFO \u65e5\u5fd7\u5185\u5bb9\u663e\u793a\u4e3a\u7ea2\u8272\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\u770b\u4e0d\u5230\u8be6\u7ec6\u4fe1\u606f\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10220220822","title":"1.0.2\uff082022/08/22\uff09","text":"new \u79fb\u9664 loguru\uff0c\u66ff\u6362\u4e3a logging\uff0c\u63a5\u53e3\u4fdd\u6301\u4e0d\u53d8\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u53d7\u5f71\u54cd\uff1b \u9ed8\u8ba4\u5f00\u542f coredump\uff1b fix \u4fee\u590d\u4e86\u4e09\u65b9\u5e93 loguru \u5076\u73b0\u5f02\u5e38\uff0c\u5bfc\u81f4\u7a0b\u5e8f\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7b2c\u4e00\u6b21\u5931\u8d25\u4e0d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10120220812","title":"1.0.1\uff082022/08/12\uff09","text":"new \u65b0\u589e RELEASE.md \u6587\u4ef6\uff0c\u7528\u4e8e\u8bb0\u5f55\u5386\u53f2\u53d1\u5e03\u7248\u672c\u7684\u66f4\u65b0\u5185\u5bb9\uff1b \u517c\u5bb9 Wayland \u6a21\u5f0f\u4e0b\u6267\u884c\u7528\u4f8b\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u7528\u7ba1\u5f53\u524d\u6d4b\u8bd5\u673a\u6267\u884c\u73af\u5883\uff0c\u6846\u67b6\u4f1a\u81ea\u52a8\u6839\u636e\u5f53\u524d\u73af\u5883\u8d70\u4e0d\u540c\u7684\u4ee3\u7801\u903b\u8f91\uff1b \u7531\u4e8e\u9700\u8981\u4fee\u6539 dogtail \u6e90\u4ee3\u7801\uff0c\u56e0\u6b64\u5c06\u4fee\u6539\u540e\u7684\u6e90\u7801\u653e\u5165\u5230\u6838\u5fc3\u5e93\u91cc\u9762 src/depends/dogtail \u540e\u7eed\u7248\u672c\u5c06\u4e0d\u9700\u8981\u5728\u7cfb\u7edf\u4e2d\u5b89\u88c5dogtail\uff1b \u5982\u679c\u5e94\u7528\u5e93\u540c\u6837\u4f7f\u7528\u4e86\u7cfb\u7edf\u5b89\u88c5\u7684 dogtail \u53ef\u80fd\u4f1a\u62a5\u9519\uff0c\u89e3\u51b3\u65b9\u6848\u662f\u5c06\u4ee3\u7801\u4e2d\u7684 import dogtail \u4fee\u6539\u4e3a from src.depends import dogtail ; fix \u91cd\u8dd1\u5931\u8d25\u4e4b\u540e\u624d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff0c\u4fee\u6539\u4e3a\u5931\u8d25\u4e4b\u540e\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":"# Attribution \uff1achengdu Test Team\n# Date \uff1a2021/08/20\n \u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d \u4ed3\u5e93\u5730\u5740\uff1ahttps://gitlabcd.uniontech.com/autotest/cd-desktop-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u65b9\u6848\u6982\u8ff0","text":"\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u667a\u80fd\u8bc6\u522b\u5e94\u7528\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u7528\u4e8e\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u64cd\u4f5c\u8fc7\u7a0b\u4e2d\u7684\u5143\u7d20\u5b9a\u4f4d\u4ee5\u53ca\u5224\u65ad\u7ed3\u679c\u65f6\u7684\u65ad\u8a00\u5904\u7406\uff1b\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\uff0c\u6d4b\u8bd5\u673a\u4e0a\u7684\u753b\u9762\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u5230\u670d\u52a1\u5668\u4e0a\uff0c\u670d\u52a1\u5668\u5bf9\u89c6\u9891\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\u540e\uff0c\u670d\u52a1\u5668\u667a\u80fd\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\u6210\u529f\uff0c\u7136\u540e\u5bf9\u6d4b\u8bd5\u673a\u4e0b\u53d1\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\uff0c\u6d4b\u8bd5\u673a\u63a5\u53d7\u5e76\u6267\u884c\u4e0b\u4e00\u6b65\u64cd\u4f5c\u3002 \u670d\u52a1\u5668\u4e0e\u6d4b\u8bd5\u673a\u4e4b\u95f4\u7684\u94fe\u63a5\uff1a \u670d\u52a1\u5668\u901a\u8fc7 USB \u4e32\u53e3\u8bbe\u5907\uff08USB-HID \u534f\u8bae\uff09\u6a21\u62df\u9f20\u6807\u952e\u76d8\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u64cd\u4f5c\u3002 \u901a\u8fc7\u89c6\u9891\u91c7\u96c6\u8bbe\u5907\u6355\u83b7\u6d4b\u8bd5\u673a\u7684\u5b9e\u65f6\u753b\u9762\u4f20\u8f93\u7ed9\u670d\u52a1\u5668\u3002 \u670d\u52a1\u5668\u5bf9\u91c7\u96c6\u7684\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\uff0c\u8bc6\u522b\u5176\u4e2d\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5e76\u8fd4\u56de\u5143\u7d20\u63a7\u4ef6\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\uff0c\u670d\u52a1\u5668\u901a\u8fc7\u667a\u80fd\u5316\u5206\u6790\uff0c\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e00\u81f4\u5c06\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\u901a\u8fc7\u4e32\u53e3\u6a21\u62df\u952e\u9f20\u4fe1\u53f7\u53d1\u9001\u7ed9\u6d4b\u8bd5\u673a\uff1b\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e0d\u4e00\u81f4\u5c06\u4f1a\u8fdb\u5165\u4e2d\u65ad\u5904\u7406\u53ca\u5f02\u5e38\u7ed3\u679c\u8f93\u51fa\uff0c\u7ee7\u7eed\u6267\u884c\u540e\u7eed\u573a\u666f\uff0c\u76f4\u81f3\u6240\u6709\u7528\u4f8b\u6d4b\u8bd5\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u6df1\u5ea6\u5b66\u4e60\u73af\u5883\u642d\u5efa","text":"\u6a21\u578b\u8bad\u7ec3\u4e3b\u8981\u5bf9 GPU \u6709\u8981\u6c42\uff0c\u8bad\u7ec3\u6a21\u578b\u7684\u673a\u5668\u663e\u5b58\u4e0d\u4f4e\u4e8e 6G\uff0c\u5176\u4ed6\u914d\u7f6e\u65e0\u7279\u6b8a\u8981\u6c42\u3002 \u63a8\u8350\u6027\u4ef7\u6bd4\u8f83\u9ad8\u914d\u7f6e \u64cd\u4f5c\u7cfb\u7edf: UnionTech OS Desktop 20 Professional Linux version 4.19.0-desktop-amd64 (deepin@deepin-PC) (Uos 8.3.0.3-3+rebuild) \u5904\u7406\u5668: Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz (\u516b\u6838 / \u5341\u516d\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460M-HDV(RD)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))/8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: TU116 [GeForce GTX 1660]\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u865a\u62df\u73af\u5883\u5b89\u88c5","text":"cd ~\nwget -c https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh\nbash Miniconda3-latest-Linux-x86_64.sh\n \u4e00\u8def\u56de\u8f66 \u7b2c\u4e00\u6b21\u63d0\u793a\u8f93\u5165 yes/no \uff1a\u8f93\u5165 yes \u7ee7\u7eed\u4e00\u8def\u56de\u8f66 \u7b2c\u4e8c\u6b21\u63d0\u793a\uff1a\u8f93\u5165 no cd ~/miniconda3/bin\nsudo chmod 777 activate\n \u6fc0\u6d3bconda\u73af\u5883 . ./activate\n \u6dfb\u52a0\u516c\u53f8\u5185\u7f51\u6e90 conda config --add channels bioconda\nconda config --add channels conda-forge\n \u5982\u679c\u662f\u5916\u7f51\u6dfb\u52a0\u5916\u7f51\u6e90 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/\n \u5982\u679c\u8981\u5220\u9664\u6e90 conda config --remove-key channels\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"2\u3001\u5b89\u88c5\u4f9d\u8d56","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u521b\u5efa\u865a\u62df\u73af\u5883","text":"conda remove --name mmlab --all # \u79fb\u9664\u6240\u6709\u865a\u62df\u73af\u5883\n conda create -n mmlab python=3.7\n conda activate mmlab\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-pytorch","title":"\uff082\uff09\u5b89\u88c5 Pytorch","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install torch==1.7.0+cu101 torchvision==0.8.1+cu101 torchaudio==0.7.0 -f https://download.pytorch.org/whl/torch_stable.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-mmcv","title":"\uff083\uff09\u5b89\u88c5 MMCV","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install mmcv-full==1.3.3 -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.7.0/index.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"\uff084\uff09\u5b89\u88c5\u663e\u5361\u9a71\u52a8","text":"\u6839\u636e\u4f60\u7684\u663e\u5361\u4e0b\u8f7d\u5bf9\u5e94\u9a71\u52a8\uff0c\u6bd4\u5982\u6211\u7684\u663e\u5361\u4e3a GTX1660\uff0c\u9a71\u52a8\u7248\u672c\u4e3a 430\uff0c\u9a71\u52a8\u4e0b\u8f7d\u5730\u5740\uff1ahttps://www.nvidia.cn/Download/Find.aspx?lang=cn CTRL+ALT+F2 \u8fdb\u5165tty\n \u7981\u7528 nouveau \u9a71\u52a8 sudo vim /etc/modprobe.d/blacklist-nouveau.conf\n \u586b\u5165\uff1a blacklist nouveau options nouveau modeset=0\n \u5237\u65b0\u914d\u7f6e\u6587\u4ef6 sudo update-initramfs -u reboot \u91cd\u542f\u540e\u518d\u8fdb\u5165 tty \u5173\u95ed\u56fe\u50cf\u754c\u9762\uff0c\u8f93\u5165\u547d\u4ee4\u5173\u95ed\u56fe\u50cf\u754c\u9762 sudo service lightdm stop\n \u5b89\u88c5\u9a71\u52a8 sudo chmod a+x NVIDIA-Linux-x86_64-430.run\nsudo ./NVIDIA-Linux-x86_64-430.run\n reboot\u91cd\u542f\uff0cnvidia-smi\u67e5\u770b\u5b89\u88c5\u72b6\u6001\u3002\u6ce8\u610f\u770b\u4e0bcuda\u7248\u672c\uff0c10.1\uff0cdriver\u7248\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u6570\u636e\u6807\u6ce8","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u6570\u636e\u6807\u6ce8","text":"\u6807\u6ce8\u4e4b\u524d\u9700\u8981\u5148\u8f6c\u6362\u56fe\u7247\u5927\u5c0f\uff0c\u5e76\u4e14\u4ee5\u6570\u5b57\u547d\u540d\uff0c\u6bcf\u7ec4\u547d\u540d\u9012\u589e"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"\uff081\uff09\u8f6c\u6362\u5927\u5c0f\u5e76\u91cd\u547d\u540d","text":"rename_pic.py import os\nimport sys\nimport cv2\nimport time\nimport getpass\nusername = getpass.getuser()\nsource_path = f\"/home/{username}/Desktop/right_menu\" # \u56fe\u7247\u8def\u5f84\nsource_dest = os.path.join('/'.join(source_path.split(\"/\")[:-1]), 'tmp')\nif not os.path.exists(source_dest):\nos.mkdir(source_dest)\nstart_name = sys.argv[1]\nfile_name_list = list()\nfor file in os.listdir(source_path):\nif file.endswith('.png'):\nfile_name_list.append(file)\nstart_name = int(start_name)\nfor file in file_name_list:\nos.rename(os.path.join(source_path,file), os.path.join(source_path, f\"{str(start_name)}.png\"))\nstart_name += 1\ntime.sleep(1)\nfor file in os.listdir(source_path):\nimage = os.path.join(source_path, str(file))\nsrc = cv2.imread(image)\nresult = cv2.resize(src, (960, 540))\nresizeImage = os.path.join(source_dest, str(file))\nprint(resizeImage)\ncv2.imwrite(str(resizeImage), result)\ncv2.waitKey(0)\ncv2.destroyAllWindows()\ntime.sleep(1)\nos.system(f'rm -rf {source_path}/*')\nos.system(f'mv {source_dest}/* {source_path}')\nos.system(f'rm -rf {source_dest}')\nprint(\"\u4e0b\u4e00\u4e2a\u5e8f\u53f7\uff1a\", start_name)\n \u6839\u636e\u7ec8\u7aef\u8f93\u51fa\u7684\u4e0b\u4e00\u4e2a\u5e8f\u53f7\u7684\u63d0\u793a\uff0c\u6267\u884c Python \u6587\u4ef6\u7684\u65f6\u5019\u4f20\u53c2\u3002 python rename_pic.py 249\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"\uff082\uff09\u5de5\u5177\u6807\u6ce8","text":"\u4f7f\u7528\u5de5\u5177 labelImg \u6807\u6ce8 sudo pip3 install PyQt5==5.13\nsudo pip3 install labelImg\n \u7ec8\u7aef\u76f4\u63a5\u8f93\u5165 labelImg\uff0c\u56de\u8f66 \u6807\u6ce8\u6a21\u5f0f\u9009\u62e9\uff1aPascalVOC"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u667a\u80fd\u6807\u6ce8","text":"\u6253\u5f00\u5c4f\u5e55\u5f55\u5236\u8f6f\u4ef6\uff0c\u5f55\u5236\u624b\u52a8\u64cd\u4f5c\u4e00\u6b21\u6d4b\u8bd5\u7528\u4f8b\uff0c\u7136\u540e\u5c06\u5f55\u5236\u7684\u89c6\u9891\u8fdb\u884c\u5206\u5e27\uff0c\u7136\u540e\u5bf9\u6bd4\u524d\u4e24\u5e27\u56fe\u6807\u76f8\u4f3c\u5ea6\uff0c\u5254\u9664\u76f8\u4f3c\u5ea6\u8fc7\u9ad8\u7684\u56fe\u7247\uff0c\u5728\u4fdd\u8bc1\u7d20\u6750\u591a\u6837\u6027\u7684\u524d\u63d0\u4e0b\uff0c\u5254\u9664\u91cd\u590d\u591a\u4f59\u7684\u56fe\u7247\u751f\u6210\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u96c6\uff0c\u7136\u540e\u53d6\u51fa\u63a7\u4ef6\u6a21\u677f\u6570\u636e\u96c6\uff0c\u901a\u8fc7 OpenCV \u6a21\u677f\u5339\u914d\u83b7\u53d6\u63a7\u4ef6\u5728\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u56fe\u7247\u4e2d\u6240\u5728\u7684\u5de6\u4e0a\u3001\u5de6\u4e0b\u3001\u53f3\u4e0a\u3001\u53f3\u4e0b\u56db\u5904\u5750\u6807\uff0c\u4ece\u800c\u6839\u636e\u6a21\u677f\u6570\u636e\u96c6\u751f\u6210\u6807\u6ce8\u6570\u636e\u3002\u53c2\u8003\u76ee\u5f55 AnnotationMaterial"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"\uff081\uff09\u6a21\u677f\u6570\u636e\u96c6\u51c6\u5907","text":"1\u3001\u5728\u754c\u9762\u622a\u53d6\u9700\u8981\u6807\u6ce8\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u653e\u5728\u76ee\u5f55\u4e0b AnnotationMaterial/template/img 2\u3001\u7ef4\u62a4\u63a7\u4ef6\u540d\u4e0e\u5143\u7d20\u63a7\u4ef6\u7684\u952e\u5bf9\uff0c\u4e00\u4e2a\u63a7\u4ef6\u540d\u53ef\u5bf9\u5e94\u591a\u4e2a\u5143\u7d20\u63a7\u4ef6 menu:\n- menu.jpg\n- menu1.jpg\n- menu2.jpg\n- menu3.jpg\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"\uff082\uff09\u7d20\u6750\u96c6\u51c6\u5907","text":"\u5f55\u5236\u89c6\u9891\u6216\u6216\u5c4f\u5e55\u622a\u56fe\u653e\u7f6e\u76ee\u5f55 AnnotationMaterial/source"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u5f00\u59cb\u6807\u6ce8","text":"python3 AnnotationMaterial/main.py\n \u751f\u6210\u7684\u6807\u6ce8\u6570\u636e\u5b58\u653e\u5728 AnnotationMaterial/result"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#mmdetection","title":"\u56db\u3001MMDetection","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1-mmdetection","title":"1\u3001 MMDetection \u4ee3\u7801","text":"MMDetection \u662f\u4e00\u4e2a\u6709\u540d\u7684\u6df1\u5ea6\u5b66\u4e60\u76ee\u6807\u68c0\u6d4b\u5f00\u6e90\u9879\u76ee\uff0c\u4e5f\u662f openMMlab \u7684\u62db\u724c\u9879\u76ee\uff0c\u4e3a\u4ec0\u4e48\u9009\u62e9\u5b83\uff0c\u5c0f\u5b69\u513f\u6ca1\u5a18\u8bf4\u6765\u8bdd\u957f\uff0c\u611f\u5174\u8da3\u53ef\u4ee5\u81ea\u884c\u6df1\u5165\u4e86\u89e3\uff1b \u4f60\u53ef\u4ee5\u76f4\u63a5\u5728 GitHub \u4e0a\u514b\u9686\u4ee3\u7801\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u54b1\u4eec\u4ed3\u5e93\u4e0b Train \u76ee\u5f55\u4e2d\u4ee3\u7801\uff0cTrain \u4e2d\u7684\u4ee3\u7801\u4e5f\u662f\u4ece GitHub \u4e0a\u62c9\u53d6\u7684\uff0c\u4e0d\u8fc7\u6211\u4eec\u6839\u636e\u9879\u76ee\u9700\u8981\u505a\u4e86\u4e00\u4e9b\u4e8c\u6b21\u5f00\u53d1\uff0c\u63a8\u8350\u76f4\u63a5\u4f7f\u7528\u5b83\u3002 \u5982\u679c\u4f60\u60f3\u4ece GitHub \u4e0a\u62c9\uff1a git clone https://github.com/open-mmlab/mmdetection.git\n# \u4e0d\u80fd\u76f4\u63a5\u62c9\u53d6\u4e3b\u5206\u652f\uff0c\u5efa\u8bae\u4f7f\u75282.12\u7248\u672c\uff0c\u4e0d\u540c\u7684\u7248\u672c\u5bf9\u5e94\u7684mmcv\u7248\u672c\u662f\u4e0d\u540c\u7684\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-voc2coco","title":"2\u3001\u62c9\u53d6 voc2coco \u4ee3\u7801","text":"git clone https://github.com/Tony607/voc2coco.git\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-coco","title":"3\u3001\u8f6c\u6362 coco \u6570\u636e\u96c6","text":"\u5c06\u6240\u6709\u7684\u56fe\u7247\u548cxml\u6587\u4ef6\u653e\u5165train2017\uff0c\u4ece\u4e2d\u6311\u9009\u51e0\u7ec4\u653e\u5165val2017\uff08\u6d4b\u8bd5\u96c6\uff09 cd mmdetection/data/coco\npython voc2coco.py train2017 annotations/instances_train2017.json\npython voc2coco.py val2017 annotations/instances_val2017.json\n \u751f\u6210json\u6587\u4ef6"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4_1","title":"4\u3001\u4fee\u6539\u914d\u7f6e","text":"\uff081\uff09\u8bfb\u53d6\u6a21\u578b\u540d\u79f0 import json\nmodule_name = []\nwith open('./instances_train2017.json', \"r+\") as f:\njson_file = f.read()\njson_dict = json.loads(json_file)\nmodule_list = json_dict.get('categories')\nfor module_info in module_list:\nname = module_info.get('name')\nmodule_name.append(name)\nprint(module_name)\nprint(\"module_num:\", len(module_name))\n # \u6ce8\u610f\u5bf9\u6bd4instances_train2017.json\u91cc\u9762\u6a21\u578b\u540d\u79f0\u7684\u987a\u5e8f\uff0c\u4e0eCLASSES\u548ccoco_classes\u91cc\u9762\u7684\u987a\u5e8f\u4fdd\u6301\u4e00\u81f4\u3002\n \uff082\uff09\u4fee\u6539 faster_rcnn_r101_2x_coco.py mmdetection/xianjin/faster_rcnn_r101_2x_coco.py \u4fee\u653946\u884c\uff0cnum_clasess\u7684\u503c\uff0c\u65b0\u589e1\u4e2a\uff0c\u5c31 +1\uff1b \uff083\uff09\u4fee\u6539 coco.py mmdetection/mmdet/datasets/coco.py CLASSES = ()\uff0c\u5728\u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b \uff084\uff09\u4fee\u6539 class_names.py mmdetection/mmdet/core/evaluation/class_names.py coco_classes \u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#5","title":"5\u3001\u7f13\u5b58\u6e05\u7406","text":"\u5220\u9664 mmdetection/build \u76ee\u5f55 python setup.py install\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#6","title":"6\u3001\u8bad\u7ec3\u6a21\u578b","text":"\uff081\uff09\u6307\u5b9a\u81ea\u5df1\u914d\u7f6e\u7684\u8bad\u7ec3\u6a21\u578b\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py --gpus 1\n \uff082\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u6d4b\u8bd5\u96c6\u7ed3\u679c\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py xianjin/epoch_24.pth --show\n \uff083\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u51c6\u786e\u5ea6\uff1b python tools/analysis_tools/analyze_logs.py plot_curve xianjin/20210530_011907.log.json --keys acc\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#7","title":"7\u3001\u5feb\u6377\u64cd\u4f5c","text":"python3 run.py\n \u5c06\u4ee5\u4e0a 4 - 7 \u6b65\u64cd\u4f5c\u6574\u5408\u6210 run.py\uff0c\u4e00\u952e\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u4e94\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\uff1b \u670d\u52a1\u7aef\u4e00\u53f0\uff08\u76ee\u524d\u4ec5\u652f\u6301AMD\u67b6\u6784\uff09\uff1b \u91c7\u96c6\u76d2\u4e00\u4e2a \uff08ACASIS hdmi\u89c6\u9891\u91c7\u96c6\u5361\uff0chttps://item.jd.com/10024310742602.html \uff09\uff1b USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\uff1b USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff1b \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5USB\u5ef6\u957f\u7ebf\uff1b \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u63a8\u8350\u914d\u7f6e","text":"\u6267\u884c\u7528\u4f8b\u7684\u670d\u52a1\u7aef\u5bf9\u914d\u7f6e\u6ca1\u6709\u7279\u6b8a\u8981\u6c42\uff0c\u5982\u679c\u6761\u4ef6\u5141\u8bb8\u914d\u7f6e\u8d8a\u9ad8\uff0c\u8bc6\u522b\u901f\u5ea6\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n \u6d4b\u8bd5\u673a\u4e0a\u4e0d\u6267\u884c\u4efb\u4f55\u811a\u672c\uff0c\u5177\u4f53\u914d\u7f6e\u6839\u636e\u6d4b\u8bd5\u9700\u8981\u51b3\u5b9a\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#usb_mk","title":"\u516d\u3001USB_MK\u4e32\u53e3\u9a71\u52a8\u65b9\u6cd5","text":"\u4f4d\u4e8econtrol_method\u76ee\u5f55\u4e0b\u7684usb_mk.py\u6587\u4ef6 \uff081\uff09\u5217\u51fa\u53ef\u901a\u4fe1\u7684\u7aef\u53e3 python3 -m serial.tools.list_ports -v\n \uff082\uff09\u4fee\u6539\u4e32\u53e3\u7684\u6743\u9650 sudo chmod 777 /dev/ttyACM0\n \uff083\uff09\u5b9e\u4f8b\u5316USB_MK import UsbMk\nusb_mk = UsbMk(\"/dev/ttyACM0\", 9600) # \u8bbe\u5907\u9ed8\u8ba49600\u4e3a\u6ce2\u7279\u7387\uff0c\u63a7\u5236\u4f20\u8f93\u901f\u7387\n \uff084\uff09USB\u4e32\u53e3\u8bbe\u5907\u9ed8\u8ba4\u6ce2\u7279\u7387\u4e3a9600\uff08\u7ecf\u6d4b\u8bd5\u6ce2\u7279\u73879600\u51c6\u786e\u6027\u6700\u597d\uff09\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up() # \u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u6c49\u5b57\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e\n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff083\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff084\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff085\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() # \u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2\n \uff086\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff087\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff088\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e03\u3001\u65b9\u6cd5\u8c03\u7528\u5165\u53c2\u89c4\u5219","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_7","title":"1\u3001\u57fa\u7c7b","text":"class Base:\ndef __init__(self):\nself._obj = image\nself._usb = usb_mk\ndef find_element_by_ai(self, element):\nreturn self._obj.find_element(element)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_6","title":"2\u3001\u5165\u53c2\u8bf4\u660e","text":"\u56fe\u50cf\u8bc6\u522b\u65b9\u6cd5\u5165\u53e3\u4e3a Base \u7c7b\u4e0b\u7684 find_element_by_ai \u3002\u4ec5\u63a5\u53d7\u4e00\u4e2a\u53c2\u6570 element\uff0c\u7c7b\u578b\u4e3a string\u3002 \u53ef\u8bc6\u522b\u7684 string \u683c\u5f0f\uff1a \uff081\uff09\u5927\u56fe\u6807\uff08 \u56fe\u6807\u5927\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\uff0c\u4f8b\uff1a Base().find_element_by_ai(\"window\")\n \uff082\uff09\u5927\u56fe\u6807 / \u5c0f\u56fe\u6807\uff08\u56fe\u6807\u5c0f\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5c0f\u56fe\u6807\uff0c\u4f8b\uff1awindow/search_btn Base().find_element_by_ai(\"window/search_btn\")\n \uff083\uff09\u5927\u56fe\u6807 / OCR\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\u5185\u7684\u6587\u5b57\uff0c\u4f8b\uff1amenu/\u5c5e\u6027 Base().find_element_by_ai(\"menu/\u5c5e\u6027\")\n \uff084\uff09OCR\uff1a\u5168\u5c4f\u8bc6\u522b\u6587\u5b57 Base().find_element_by_ai(\"\u641c\u7d22\")\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516b\u3001\u9690\u85cf\u9f20\u6807","text":"\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u8fc7\u6765\u7684\u89c6\u9891\u6d41\uff0c\u5728\u8bc6\u522b\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u53d7\u5230\u9f20\u6807\u5f71\u54cd\uff0c\u56e0\u6b64\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u9690\u85cf\u9f20\u6807\u3002 \u5c4f\u853d\u9f20\u6807\u5149\u6807\u663e\u793a ```shell script /etc/lightdm/lightdm.conf \u5728`[Seat:*]`\u4e0b\u9762\u6dfb\u52a0\u53c2\u6570\n```shell script\nxserver-command=X -bs -core -nocursor\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e5d\u3001\u667a\u80fd\u81ea\u52a8\u5316\u7684\u610f\u4e49","text":"1\u3001\u6539\u5584 Acessibility \u5b9a\u4f4d\u7684\u7a33\u5b9a\u6027\u95ee\u9898 Acessibility \u5c5e\u6027\u5b9a\u4f4d\u5b58\u5728\u5076\u5c14\u5931\u6548\u7684\u60c5\u51b5 \uff081\uff09\u5f00\u53d1\u5728\u505a\u65b0\u9700\u6c42\u5f00\u53d1\u65f6\u53ef\u80fd\u6d89\u53ca\u5230\u5bf9\u5c5e\u6027\u6807\u7b7e\u7684\u4fee\u6539\u6216\u8005\u5c42\u7ea7\u7684\u8c03\u6574\uff0c\u53ef\u80fd\u9020\u6210\u81ea\u52a8\u5316\u7528\u4f8b\u65e0\u6cd5\u5b9a\u4f4d\u5230\u5143\u7d20\u3002 \u6bd4\u59821040\u9636\u6bb5\uff0c\u97f3\u4e50\u91cd\u6784\u7684\u65f6\u5019\uff0c\u5f00\u53d1\u5bf9\u90e8\u5206\u5c5e\u6027\u548c\u5c42\u7ea7\u505a\u4e86\u4fee\u6539\uff0c\u5bfc\u81f4\u81ea\u52a8\u5316\u7528\u4f8b\u5b9a\u4f4d\u65b9\u6cd580%\u9700\u8981\u4fee\u6539\u3002 \u5f00\u53d1\u65b0\u529f\u80fd\u7684\u65f6\u5019\u5076\u5c14\u4e5f\u4f1a\u5bf9\u5c5e\u6027\u505a\u8c03\u6574\uff0c\u9047\u52305\u6b21\u3002 \uff082\uff09\u76ee\u524d\u4e3b\u8981\u4f7f\u7528Dogtail\u8bc6\u522b\u5e94\u7528Acessibility\u5c5e\u6027\u8fdb\u884c\u5b9a\u4f4d\uff0c\u662f\u83b7\u53d6\u5e94\u7528\u5f53\u524d\u754c\u9762\u7684\u5c5e\u6027tree\uff0c\u5728\u5e94\u7528\u8df3\u8f6c\u540e\uff0cDogtail\u5b58\u5728\u65e0\u6cd5\u53ca\u65f6\u83b7\u53d6\u5f53\u524d\u5c5e\u6027\u5217\u8868\u7684\u60c5\u51b5\u3002 \u591a\u5a92\u4f53\u8c03\u7528\u6587\u7ba1\u7a97\u53e3\u7684\u65f6\u5019\uff0c\u51fa\u73b0\u627e\u4e0d\u5230\u6587\u7ba1\u91cc\u9762\u5143\u7d20\u7684\u60c5\u51b5\uff0c\u76ee\u524d\u51fa\u73b010+\u6b21\u3002 \u5e94\u7528\u8bbe\u7f6e\u9875\u9762\u7684\u5c5e\u6027\u5076\u5c14\u5b58\u5728\u627e\u4e0d\u5230\u7684\u60c5\u51b5\uff0c\u9047\u52305\u6b21\u3002 \uff083\uff09Dogtail\u5de5\u5177\u672c\u8eab\u5b58\u5728\u95ee\u9898\uff0c\u6709\u65f6\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u5019\u5f88\u6162\uff0c\u8ba9\u4eba\u65e0\u6cd5\u63a5\u53d7\uff0c\u76ee\u524d\u51fa\u73b0\u8fc7\u5f88\u591a\u6b21\u3002 \u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u95f4\u6bd4\u5e73\u5e38\u61623\u500d\uff0c\u51fa\u73b04\u6b21\u3002 2\u3001\u89e3\u51b3\u4e86\u4f7f\u7528\u7edd\u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898 \u90e8\u5206\u63a7\u4ef6\u65e0\u6cd5\u6dfb\u52a0 Acessibility \u5c5e\u6027\u4ece\u800c\u4f7f\u7528\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u51fa\u73b0\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898\u3002 \uff081\uff09\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u65b9\u6cd5\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u76ee\u6807\u56fe\u7247\u8d44\u6e90\uff0c\u5728 UI \u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u4f1a\u6d89\u53ca\u5230\u76ee\u6807\u8d44\u6e90\u7684\u66ff\u6362\uff0c\u6bd4\u8f83\u8017\u8d39\u4eba\u529b\u3002 \uff082\uff09\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6cd5\u5bf9\u6bd4\u7cbe\u5ea6\u6bd4\u8f83\u641e\uff0c\u5982\u679cUI \u7684\u53d8\u66f4\u4f1a\u9020\u6210\u65e0\u6cd5\u51c6\u786e\u5b9a\u4f4d\u5230\uff0c\u81ea\u52a8\u5316\u811a\u672c\u5065\u58ee\u6027\u4e0d\u8db3\u3002 3\u3001\u4f7f\u7528\u673a\u5668\u5206\u79bb\uff0c\u89e3\u51b3\u4e86\u81ea\u52a8\u5316\u811a\u672c\u5bf9\u5e94\u7528\u7684\u5f71\u54cd\uff0c\u771f\u5b9e\u8fd8\u539f\u7528\u6237\u7684\u4f7f\u7528\u573a\u666f \u673a\u5668\u5206\u79bb\u7684\u67b6\u6784\u8bbe\u8ba1\uff0c\u4fdd\u8bc1\u4e86\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u73af\u5883\u5b8c\u5168\u7b49\u540c\u4e8e\u7528\u6237\uff0c\u6392\u9664\u6d4b\u8bd5\u811a\u672c\u7684\u5f71\u54cd\u3002 \uff081\uff09\u76ee\u524d\u7684\u529f\u80fd\u81ea\u52a8\u5316\u662f\u5728\u6d4b\u8bd5\u673a\u4e0a\u76f4\u63a5\u8fd0\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\uff0c\u52a0\u4e0a\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u6211\u4eec\u6dfb\u52a0\u4e86\u4e00\u4e9b\u8fdb\u7a0b\u76d1\u63a7\u3001\u89c6\u9891\u5f55\u5236\u7b49\u529f\u80fd\uff0c\u81ea\u52a8\u5316\u811a\u672c\u672c\u8eab\u4f1a\u6d88\u8017\u4e00\u4e9b\u7cfb\u7edf\u8d44\u6e90\uff0c\u65e0\u6cd5\u8fd8\u539f\u771f\u662f\u7684\u7528\u6237\u4f7f\u7528\u573a\u666f\u3002 \uff082\uff09\u6027\u80fd\u6d4b\u8bd5\u9700\u8981\u6392\u9664\u5176\u4ed6\u7a0b\u5e8f\u7684\u8d44\u6e90\u6d88\u8017\u5f71\u54cd\uff0c\u6027\u80fd\u81ea\u52a8\u5316\u91c7\u7528\u673a\u5668\u5206\u79bb\uff0c\u4fdd\u8bc1\u4e86\u6027\u80fd\u6570\u636e\u7684\u51c6\u786e\u6027\u3002 \u4ee5\u524d\u7684\u7528\u4f8b\u6267\u884c\u8017\u65f6\u6ca1\u6761\u572830\u79d2\u5de6\u53f3\uff0c\u73b0\u5728\u7528\u4f8b\u8017\u65f6\u572810\u79d2\u3002 4\u3001\u89e3\u51b3\u4e86UI \u8c03\u6574\u5bfc\u81f4\u5b9a\u4f4d\u5931\u8d25\u7684\u4e0d\u7a33\u5b9a\u6027\u95ee\u9898 \uff081\uff09\u89e3\u51b3\u4e86\u56e0 UI \u8c03\u6574\u5bfc\u81f4\u63a7\u4ef6\u4f4d\u7f6e\u53d8\u5316\u6216\u8272\u5dee\u53d8\u5316\u540e\u5b9a\u4f4d\u4e0d\u51c6\u786e\u7684\u95ee\u9898\uff0c\u53ea\u8981\u63a7\u4ef6\u6587\u6848\u548c\u63a7\u4ef6\u5916\u8fb9\u6846\u65e0\u53d8\u5316\u5747\u53ef\u51c6\u786e\u5b9a\u4f4d\uff1b \uff082\uff09\u76ee\u524d\u4e5f\u4f1a\u91c7\u7528\u57fa\u4e8eUI\u7684\u5b9a\u4f4d\u65b9\u6848\uff0c\u5982\u679cUI\u4f4d\u7f6e\u6709\u8c03\u6574\uff0c\u4f1a\u5bfc\u81f4\u5143\u7d20\u65e0\u6cd5\u5b9a\u4f4d\u3002 5\u3001\u7b80\u5316\u4e86\u7528\u4f8b\u7ed3\u6784\uff0c\u63d0\u5347\u7f16\u5199\u53cb\u597d\u5ea6 \uff081\uff09\u667a\u80fd\u81ea\u52a8\u5316\u8bc6\u522b\u5143\u7d20\u7684\u65b9\u6cd5\u53ea\u6709\u4e00\u4e2a\uff0c\u5c31\u662f\u57fa\u4e8e\u6211\u4eec\u8bad\u7ec3\u7684\u6a21\u578b\u8bc6\u522b\u89c6\u9891\u6d41\u4e2d\u7684\u5143\u7d20\uff0c\u7ecf\u8fc7\u811a\u672c\u5c01\u88c5\u4e4b\u540e\uff0c\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u4e2d\u6240\u6709\u5b9a\u4f4d\u7684\u64cd\u4f5c\u90fd\u53ea\u9700\u8981\u8c03\u7528\u8fd9\u4e00\u4e2a\u65b9\u6cd5\u5c31\u884c\u4e86\uff0c\u7f16\u5199\u81ea\u52a8\u5316\u811a\u672c\u7684\u96be\u5ea6\u5927\u5927\u964d\u4f4e\u3002 \uff082\uff09\u4e5f\u662f\u7531\u4e8e\u8c03\u7528\u65b9\u6cd5\u7b80\u5355\uff0c\u5728 UI \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u4e2d\u7684\u5206\u5c42\u7ed3\u6784\u5c06\u4f1a\u51cf\u5c11\uff0c\u591a\u7ee7\u627f\u7684\u60c5\u51b5\u4f1a\u51cf\u5c11\uff0c\u81ea\u52a8\u5316\u4ee3\u7801\u7684\u8c03\u7528\u7ed3\u6784\u4e5f\u4f1a\u53d8\u5f97\u7b80\u5355\uff0c\u800c\u4e14\u529f\u80fd\u6d4b\u8bd5\u540c\u5b66\u7f16\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u66f4\u52a0\u5bb9\u6613\u4e0a\u624b\u3002 \u4ee5\u524d\u5199\u7528\u4f8b\u7531\u4e8e\u9700\u8981\u7ed3\u5408\u4e0d\u540c\u7684\u6a21\u5757\uff0c\u8c03\u7528\u4e0d\u540c\u7684\u65b9\u6cd5\uff0c\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u5e76\u5b8c\u6210\u8c03\u8bd5\u7684\u65f6\u95f4\u5e73\u5747\u572820-30\u5206\u949f\uff0c\u73b0\u5728\u5199\u7528\u4f8b\u811a\u672c\u80fd\u57285\u5206\u949f\u5de6\u53f3\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":"# =============================================\n# Attribution : Application Test Department III\n# Time : 2023/1/3\n# Author : ut003281\n# =============================================\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u7b80\u8ff0","text":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5 \u901a\u8fc7\u81ea\u52a8\u5316\u624b\u6bb5\u5bf9\u5e94\u7528\u8fdb\u884c\u6027\u80fd\u6d4b\u8bd5\uff0c\u63d0\u4f9b\u65b9\u4fbf\u7684\u73af\u5883\u90e8\u7f72\u3001\u8fd0\u884c\u914d\u7f6e\u3001\u7528\u4f8b\u7f16\u5199\u7b49\uff0c\u7528\u4e8e\u684c\u9762\u5e94\u7528\u7684\u51b7\u70ed\u542f\u52a8\u3001\u8d44\u6e90\u62f7\u8d1d\u3001\u9875\u9762\u8df3\u8f6c\u7b49\u6027\u80fd\u573a\u666f\u6d4b\u8bd5\u3002 \u4ed3\u5e93\u5730\u5740\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-perf-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u4ee3\u7801\u7ed3\u6784","text":"autotest-perf-aitest\n\u251c\u2500\u2500 apps # \u5b58\u653e\u6240\u6709\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u811a\u672c\n\u251c\u2500\u2500 conftest.py # pytest hook\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 CURRENT # \u7248\u672c\u5185\u5bb9\n\u251c\u2500\u2500 docs # \u6587\u6863\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u952e\u503c\u5bf9\u7167\u8868.pdf # \u4e32\u53e3\u7ebfcode\u4e0e\u6309\u952e\u7684\u5bf9\u7167\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u6027\u80fd\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\u6267\u884c\u5668\u4f7f\u7528\u6307\u5357.md # \u6267\u884c\u5668\u811a\u672c\u4f7f\u7528\u6307\u5357\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 USB\u4e32\u53e3\u8f6cUSB\u952e\u76d8\u9f20\u6807\u7ebf\u534f\u8bae\u6587\u4ef6V1.0.pdf # \u4e32\u53e3\u534f\u8bae\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput-0.28.2.zip # Linux\u4e0b\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\u7684\u6e90\u7801\uff0c\u53ef\u6839\u636e\u67b6\u6784\u6253\u5305\n\u251c\u2500\u2500 manage.py # \u529f\u80fd\u4e3b\u5165\u53e3\n\u251c\u2500\u2500 pytest.ini # pytst \u914d\u7f6e\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 setting # \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 client.ini # \u6d4b\u8bd5\u673a IP \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5168\u5c40\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dev_env.sh # \u5bbf\u4e3b\u673a\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose_no_relay.yml # \u65e0\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose.yml # \u6709\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker_login.sh # docker \u767b\u9646\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 res\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 black.png # \u5168\u9ed1\u56fe\u7247\uff0c\u7528\u4e8e\u4fee\u6539\u58c1\u7eb8\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_5000.deb # 3A5000 \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_amd64.deb # amd \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_arm64.deb # arm \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_mips64.deb # mips \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_sw_64.deb # sw \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 server.ini # \u670d\u52a1\u5668\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 setup.sh # \u5bb9\u5668\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 template # \u521b\u5efa app \u57fa\u7840\u811a\u672c\u6a21\u677f\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 app_template\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ${app_name}_widget.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 control-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 images\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 test_${app_name}_01_scene.json-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 test_${app_name}_01_scene.py-tpl\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 uos_docker # \u5bb9\u5668\u73af\u5883\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dockerfile\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 requirements.txt\n\u2514\u2500\u2500 src\n \u251c\u2500\u2500 analysis_save.py # \u89e3\u6790\u56fe\u7247\u6d41\u7ed3\u679c\uff0c\u6c47\u603b\u751f\u6210 excel \u62a5\u544a\n\u251c\u2500\u2500 base_widget.py # \u5c01\u88c5\u7684\u57fa\u7840\u64cd\u4f5c\uff0c\u5e94\u7528\u8c03\u7528\u7684\u4e3b\u5165\u53e3\u65b9\u6cd5\n\u251c\u2500\u2500 cmdctl.py # \u8c03\u7528\u547d\u4ee4\u884c\u4f7f\u7528\n\u251c\u2500\u2500 global_value.py # \u5168\u5c40\u53d8\u91cf\n\u251c\u2500\u2500 image_utils.py # \u56fe\u7247\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 __init__.py\n \u251c\u2500\u2500 logger_utils.py # \u65e5\u5fd7\u914d\u7f6e\n\u251c\u2500\u2500 pdocr.py # ocr \u914d\u7f6e\n\u251c\u2500\u2500 public_method.py # \u4e00\u4e9b\u65b9\u4fbf\u7684\u5c01\u4f4f\n\u251c\u2500\u2500 record.py # \u5f55\u5c4f\u76f8\u5173\n\u251c\u2500\u2500 rtk # \u8fd0\u884c\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 _base.py # \u4e00\u4e9b\u679a\u4e3e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 install_env.py # \u5b89\u88c5\u73af\u5883\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 local_runner.py # \u8fd0\u884c\u7528\u4f8b\n\u251c\u2500\u2500 serial_communication # \u4e32\u53e3\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 power_control.py # \u7ee7\u7535\u5668\u64cd\u4f5c\uff0c\u4f7f\u7528\u7ee7\u7535\u5668\u8fde\u63a5\u4e3b\u673a\u7535\u6e90\uff0c\u63a7\u5236\u5f00\u5173\u673a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 serial_common.py # \u4e32\u53e3\u516c\u5171\u65b9\u6cd5\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 usb_mk.py # \u952e\u9f20\u64cd\u4f5c\u57fa\u7840\u5c01\u88c5\n\u251c\u2500\u2500 shortcut_key.py # \u5feb\u6377\u952e\u7684\u5c01\u88c5\n\u251c\u2500\u2500 singleton.py # \u5355\u4f8b\u6a21\u5f0f\n\u251c\u2500\u2500 start_app.py # \u521b\u5efa app\n\u2514\u2500\u2500 write_xlsx.py # \u751f\u6210 excel\n# __init__.py \u6587\u4ef6\u4e3a\u6807\u8bc6\u8be5\u76ee\u5f55\u662f\u4e00\u4e2aPython\u7684\u6a21\u5757\u5305\uff0c\u9879\u76ee\u4e2d\u7684__init__.py\u5747\u4e3a\u7a7a\u6587\u4ef6\u3002\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u73af\u5883\u642d\u5efa","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\u3002 \u670d\u52a1\u7aef\u4e00\u53f0\u3002\uff08\u4ec5\u652f\u6301 AMD \u67b6\u6784\uff0c\u82e5\u9700\u5176\u4ed6\u67b6\u6784\uff0c\u54a8\u8be2\u76f8\u5173\u5f00\u53d1\u4eba\u5458\uff09 \u91c7\u96c6\u76d2\u4e00\u4e2a\u3002 \uff08ACASIS HDMI \u89c6\u9891\u91c7\u96c6\u76d2\uff0chttps://item.jd.com/100013302599.html#crumb-wrap \uff09 USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\u3002\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"\uff082\uff09\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\u3002 USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff08USB3.0 \u63a5\u53e3\u4e0a\uff09\u3002 \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5 USB \u5ef6\u957f\u7ebf\u3002 \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u670d\u52a1\u7aef\u63a8\u8350\u914d\u7f6e","text":"\u914d\u7f6e\u8d8a\u9ad8\uff0c\u89e3\u6790\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"2\u3001\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa","text":" \u6253\u5f00\u63a7\u5236\u4e2d\u5fc3\uff0c\u8d26\u6237\u8bbe\u7f6e\u4e3a\u3010\u81ea\u52a8\u767b\u5f55\u3011\u548c\u3010\u65e0\u5bc6\u7801\u767b\u5f55\u3011\uff0c\u7535\u6e90\u7ba1\u7406\u4e2d\u4f7f\u7528\u7535\u6e90\u5168\u90e8\u8bbe\u7f6e\u4e3a\u3010\u4ece\u4e0d\u3011\uff0c\u5f00\u542f\u5f00\u53d1\u8005\u6a21\u5f0f\u3002 \u6839\u636e\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u8981\u6c42\uff0c\u5bfc\u5165\u76f8\u5173\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\uff1a\u5bfc\u5165\u76f8\u518c\u3001\u5f71\u9662\u3001\u97f3\u4e50\u7684\u6d4b\u8bd5\u8d44\u6e90\u3002 \u5728\u670d\u52a1\u7aef\u6253\u5f00\u76f8\u673a\u5e94\u7528\u540e\uff0c\u5c06\u6d4b\u8bd5\u673a\u684c\u9762\u58c1\u7eb8\u66f4\u6362\u4e3a\u7eaf\u8272\u58c1\u7eb8\uff08\u6ce8\u610f\uff0c\u670d\u52a1\u7aef\u9700\u63d0\u524d\u5f00\u542f\u76f8\u673a\u540e\u518d\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u58c1\u7eb8\uff0c\u5efa\u8bae\u7eaf\u9ed1\u58c1\u7eb8 setting/res/black.png\uff09 \u5728\u6587\u4ef6\u7ba1\u7406\u5668\u4e2d\uff0c\u5c06\u9009\u9879 \u4e3b\u83dc\u5355-\u8bbe\u7f6e-\u9884\u89c8-\u56fe\u7247\u9884\u89c8 \u53d6\u6d88\u52fe\u9009\uff08\u5982\u4e0d\u53d6\u6d88\uff0c\u4f1a\u5f71\u54cd\u622a\u56fe\u5f55\u5c4f\u5e94\u7528\u7684\u6027\u80fd\u6570\u636e\uff09 \u79fb\u52a8\u6216\u5220\u9664\u7cfb\u7edf Logo \uff0c\u6392\u9664\u684c\u9762\u53f3\u4e0b\u89d2 Logo \u7684\u5f71\u54cd\uff08\u91cd\u542f\u751f\u6548\uff09\u3002 sudo mv /usr/share/deepin/uos_logo.svg ~/Pictures/\n \u5b89\u88c5\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\uff08\u5fc5\u987b\u5b89\u88c5\uff01\uff01\uff09 AMD \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_amd64.deb ARM \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_arm64.deb MIPS \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_mips64.deb 3A5000 \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_5000.deb \u5b89\u88c5\u547d\u4ee4 sudo dkpg -i xserver-xorg-input-libinput_0.28.2-2_amd64.deb\n \u5b89\u88c5\u65f6\u4f1a\u63d0\u793a\u5df2\u5b58\u5728\u76f8\u540c\u7248\u672c\uff0c\u8bf7\u5ffd\u7565\uff0c\u76f4\u63a5\u8986\u76d6\u5b89\u88c5\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u4e3b\u673a\u624d\u751f\u6548"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u670d\u52a1\u7aef\u4e00\u952e\u73af\u5883\u90e8\u7f72","text":"\u73af\u5883\u642d\u5efa\u524d\u5fc5\u987b\u5148\u8fde\u63a5\u4e0a USB \u4e32\u53e3\u7ebf\u548c\u91c7\u96c6\u76d2\u3002 \u5bbf\u4e3b\u673a\u73af\u5883\u5b89\u88c5 python3 manage.py install --env host\n \u5bb9\u5668\u73af\u5883\u5b89\u88c5 python3 manage.py install --env docker\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u56db\u3001\u914d\u7f6e\u9879","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u670d\u52a1\u7aef\u914d\u7f6e","text":"setting/config/server.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u914d\u7f6e\u9879\uff0c\u5305\u542b\u4e86\u6240\u6709\u670d\u52a1\u7aef\u6240\u6709\u7684\u53ef\u914d\u7f6e\u9879\u3002 \u672c\u5730\u65e0\u7f51\u7edc\u8fd0\u884c \u5c06\u914d\u7f6e\u9879 network=0 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u672c\u5730\u6709\u7f51\u7edc\u8fd0\u884c \u914d\u7f6e\u9879 network=1 (1)\u914d\u7f6e\u9879 client_alias= \u914d\u7f6e\u4e3a\u4f60\u8981\u6d4b\u8bd5\u7684\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5982 Alias1 \u6d4b\u8bd5\u673a\u522b\u540d\u5728 setting/config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 (2)\u914d\u7f6e\u9879 client_alias= \u4e3a\u7a7a\uff0c\u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager --client_alias Alias1\uff0c\u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002(Alias1 \u4e3a\u4f60\u914d\u7f6e\u7684\u6d4b\u8bd5\u673a\u522b\u540d) (1)\u548c(2)\u53ea\u8981\u4f7f\u7528\u5176\u4e00\u5373\u53ef\u3002 \u6709\u7f51\u7edc\u8fd0\u884c\uff0c\u4e14\u9700\u8981\u901a\u8fc7 Jenkins \u4e0a\u8fd0\u884c\u4e00\u4e2a job \uff0c\u540c\u65f6\u63a7\u5236\u591a\u53f0\u673a\u5668\u3002 \u914d\u7f6e\u9879 network=1 \u914d\u7f6e\u9879 client_alias= \u4e0d\u7528\u914d\u7f6e\uff0c\u5728\u8fd0\u884c run.sh \u7684\u65f6\u5019\u76f4\u63a5\u7a7a\u683c\u52a0\u522b\u540d\u5373\u53ef\uff0c\u6bd4\u5982\uff1a\u6d4b\u8bd5\u673a\u522b\u540d\u4e3a Alias1 \uff0c\u4e14\u5df2\u7ecf\u5728 config/client.ini \u4e2d\u914d\u7f6e\u4e86 Alias1 \u7684user ip password \uff0c\u5219\u8fd0\u884c bash run.sh Alias1 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u5728 Jenkins pipeline \u91cc\u9762\u901a\u8fc7\u5e76\u884c stage \u6216\u5e76\u884c\u8c03\u7528\u4e0b\u5c42\u4efb\u52a1\u7684\u65b9\u5f0f\u53ef\u4ee5\u5b9e\u73b0\u5927\u89c4\u6a21\u7684\u6027\u80fd\u6d4b\u8bd5\u9700\u6c42\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;1\u3001KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2\u3001KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f, e.g. TAGS = L1 or smoke\n[case_conf]\n# \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\uff0cocr\u6587\u6848\u8bc6\u522b\u8f83\u6162\uff0c\u4e0d\u63a8\u8350\u4f7f\u7528\nfind_by = stage\n# \u6700\u540e\u4e00\u4e2a\u7a33\u5b9a\u9636\u6bb5\u7684\u5e27\u6570\u8bc6\u522b\n# \u9996\u5e27\u5b58\u5728\u540e\u7684\u7b2c\u4e00\u4e2a\u5927\u4e8e\u8be5\u914d\u7f6e\u5e27\u6570\u7684\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u5c3e\u5e27\nfinal_stable_num=100\n# \u4ece\u8be5\u5e27\u6570\u5f00\u59cb\u8bc6\u522b\u6587\u6848\u6216\u56fe\u7247\uff0c\u51cf\u5c11\u5206\u6790\u65f6\u95f4\nstart_num = 150\n# \u8bc6\u522b\u7684\u6587\u6848\ntext=\n# \u8bc6\u522b\u56fe\u7247\nmatch=apps/xxx/images/match.png\n# \u8bc6\u522b\u76f8\u4f3c\u5ea6\nmatch_rate=0.9\n# \u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6bd4\u5982\u70ed\u542f\u52a8\u7528\u4f8b\uff0c\u4ece\u70b9\u51fb\u6253\u5f00\u5230\u505c\u6b62\u5f55\u5c4f\uff0c\u4e2d\u95f4\u7b49\u5f855\u79d2\uff1b\nduration = 15\n# \u5355\u6761\u7528\u4f8b\u6267\u884c\u7684\u6b21\u6570\ncount = 5\n# \u7a33\u5b9a\u9636\u6bb5\u5212\u5206\u7684\u76f8\u4f3c\u5ea6\nstable_similarity = 0.9997\n[server]\n# \u8c03\u8bd5\u6a21\u5f0f=1\uff0c\u4e3a\u5f00\u542f\u8c03\u8bd5\u6a21\u5f0f\uff0c0\u4e3a\u5173\u95ed\u3002\n# \u8c03\u8bd5\u6a21\u5f0f\u4e0b\u9ed8\u8ba4\u53ea\u6267\u884c\u4e00\u6b21\u7528\u4f8b\uff0c\u4e0d\u5173\u673a\n# \u7f16\u5199\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u5efa\u8bae\u5f00\u542fmaintain\u3002\nMAINTAIN = 0\n# \u8fd0\u884c\u7684\u73af\u5883docker\u5bb9\u5668\u73af\u5883\uff0chost\u5bbf\u4e3b\u673a\u73af\u5883\nENV = docker\n# \u670d\u52a1\u7aef\u5bc6\u7801\nPASSWORD=1\n# \u6307\u5b9a\u6d4b\u8bd5\u673a\u522b\u540d\n# \u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6bd4\u5982\uff1a\n# [AMD]\n# ip=10.8.15.86\n# user=uos\n# \u5176\u4e2d AMD \u4e3a\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5219client_alias=AMD\nCLIENT_ALIAS = x86\uff08Intel-i7\uff09\n# 1 \u5f00\u542f\u7f51\u7edc, 0 \u5173\u95ed\u7f51\u7edc\n# \uff081\uff09\u670d\u52a1\u7aef\u4e0e\u6d4b\u8bd5\u673a\u987b\u5728\u540c\u4e00\u7f51\u6bb5\u4e0b\uff0c\u4f60\u53ef\u4ee5\u5c1d\u8bd5\u5728\u670d\u52a1\u7aef\u901a\u8fc7ssh\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c\u5982\u679c\u53ef\u4ee5\u8fde\u63a5\uff0c\u8bf4\u660e\u7f51\u7edc\u6b63\u5e38\u3002\n# \uff082\uff09\u5f53input_type=FILE_NAME \u65f6\uff0c\u5fc5\u987b\u5f00\u542f\u7f51\u7edc\u3002\nNETWORK = 1\n# \u6027\u80fd\u7ed3\u679c\u7edf\u8ba1\u5355\u4f4d \u6beb\u79d2\u2014ms, \u79d2\u2014s\nUNIT=ms\n# \u6d4b\u8bd5\u673a\u5f00\u673a\u8fdb\u5165\u684c\u9762\u540e\u7b49\u5f85\u65f6\u95f4,\u5355\u4f4d/\u79d2\nSTARTUP_DELAY = 60\n# 1\u4e3a\u5220\u9664\u7f13\u5b58\uff0c0\u4e3a\u4e0d\u5220\u9664\u7f13\u5b58\n# \u7528\u4f8b\u6267\u884c\u5b8c\u540e\u4f1a\u5728report\u76ee\u5f55\u4e0b\u751f\u6210\u667a\u80fd\u89e3\u6790\u7684\u4e00\u4e9b\u7f13\u5b58\u56fe\u7247\u3002\nCACHE = 0\n# \u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u62a5\u544a\u4f1a\u4fdd\u5b58\u5728\u9879\u76ee\u4e0breport\u76ee\u5f55\u4e2d\uff1b\n# \u6307\u5b9a\u62a5\u544a\u76ee\u5f55\u5219\u5b58\u653e\u5230\u6307\u5b9a\u76ee\u5f55\u3002\nREPORT_PATH = report\n# \u670d\u52a1\u7aef\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684icon\u8d44\u6e90\u4f1a\u7f13\u5b58\u5728\u9879\u76ee\u4e0binput\u76ee\u5f55\u4e2d\nINPUT = input/\n# 1\u4e3a\u6d4b\u8bd5\u5b8c\u5173\u673a\uff0c0\u4e3a\u6d4b\u8bd5\u5b8c\u4e0d\u5173\u673a\nSHUTDOWN = 0\n# \u89e3\u6790\u8fdb\u7a0b\u6570\uff08\u4e0d\u63a8\u8350\u4fee\u6539\uff09\n# 3\u4e2a\u8fdb\u7a0b\u89e3\u6790\u89c6\u9891\u5df2\u7ecf\u80fd\u591f\u6ee1\u8db3\uff0c\u5373\u4f7f\u589e\u52a0\u8fdb\u7a0b\u6570\u4e5f\u4e0d\u80fd\u51cf\u5c11\u6574\u4f53\u8017\u65f6\n# \u53e6\u5916\u8fd8\u8981\u770bCPU\u6838\u6570\u662f\u5426\u652f\u6301\u3002\nPARSING_PROCESS = 3\n# 1\u4e3a\u4f7f\u7528\u7ee7\u7535\u5668\u5f00\u5173\u673a\uff0c0\u4e3a\u4f7f\u7528reboot\u547d\u4ee4\u91cd\u542f\u3002\u4f9d\u8d56\u7ee7\u7535\u5668\u786c\u4ef6\u8bbe\u5907\uff0c\u9700\u8981\u4f7f\u7528\u8054\u7cfb\u5f00\u53d1\u8005\nRELAY = 0\n# \u83b7\u53d6\u6d4b\u8bd5\u5e94\u7528\u7684\u7248\u672c, %s \u5360\u4f4d\u5e94\u7528\u540d\n# \u5982\u679c\u8be5\u914d\u7f6e\u4e3a\u7a7a\uff0c\u5219\u4e0d\u83b7\u53d6\u5e94\u7528\u7684\u7248\u672c\u4fe1\u606f\u3002\nCOMMAND = apt policy %s 2>/dev/null|grep \"\u5df2\u5b89\u88c5\"|awk -F \"\uff1a\" \"{print \\$2}\"\n# \u5173\u673a\u7b49\u5f85\u5f00\u542f\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6839\u636e\u6d4b\u8bd5\u673a\u6027\u80fd\u4e0d\u540c\uff0c\u5f00\u5173\u673a\u8017\u65f6\u53ef\u80fd\u4e0d\u540c\uff0c\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u673a\u60c5\u51b5\u914d\u7f6e\u3002\nSHUTDOWN_DELAY = 30\n# \u53ef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u56fe\u7247\u683c\u5f0f\uff0c\u4ee5\u82f1\u6587\u9017\u53f7\u9694\u5f00\u3002\n# \u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u76ee\u524d\u6211\u4eec\u4ec5\u9a8c\u8bc1\u4e86jpg,jpeg,png\u8fd9\u4e09\u79cd\u5e38\u7528\u7684\u56fe\u7247\u683c\u5f0f\u3002\nINPUT_TYPES = jpg,jpeg,png\n# \u6027\u80fd\u5206\u6790\u8865\u5e27\uff0c\u7b49\u4e8e\u6216\u4f4e\u4e8e\u8be5\u503c\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u9700\u8981\u51cf\u6389\u3002\nUN_STAB_START = 3\n# \u670d\u52a1\u7aef\u83b7\u53d6\u6d4b\u8bd5\u673a\u56fe\u50cf\u7684\u5e27\u7387\uff0c\u5373\u6bcf\u79d2\u83b7\u53d6\u591a\u5c11\u5f20\u6d4b\u8bd5\u673a\u4e0a\u7684\u56fe\u50cf\u3002\n# \u9ed8\u8ba4\u5e27\u7387\u4e3a30\u5e27/\u79d2\uff0c\u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u53ef\u80fd\u4f1a\u5bf9\u89e3\u6790\u7ed3\u679c\u9020\u6210\u504f\u5dee\u3002\nFPS = 30\n# \u4ee5\u4e0b\u573a\u666f\u7c7b\u578b\u4f1a\u91cd\u542f\u6d4b\u8bd5\u673a,\u591a\u79cd\u573a\u666f\u4f7f\u7528\u9017\u53f7\u9694\u5f00\nSCENE = cold\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = http://10.8.13.78:8890\n#\u5c4f\u5e55\u56fe\u7247\u4e34\u65f6\u5b58\u653e\u4f4d\u7f6e\nSCREEN_CACHE = /tmp/screen\n# =======================================\n[log]\n# \u65e5\u5fd7\u7ea7\u522b\uff0cOFF\u3001FATAL\u3001ERROR\u3001WARN\u3001INFO\u3001DEBUG\u3001ALL\n# \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u65e5\u5fd7\u8f93\u51fa\uff0clog_cli=INFO\u8868\u793a \u4ec5\u8f93\u51faINFO\u53ca\u4ee5\u4e0a\u7ea7\u522b\u7684\u65e5\u5fd7\u3002\nLOG_LEVEL = DEBUG\n# \u65e5\u5fd7\u6587\u4ef6\u4fdd\u5b58\u8def\u5f84\nLOG_PATH= logs\n# =======================================\n[dockerhub]\n# \u5bb9\u5668\u767b\u9646\u8d26\u53f7\nDOCKER_USER = user\n# \u5bb9\u5668\u767b\u9646\u5bc6\u7801\nDOCKER_PASSWORD = User1234\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u6d4b\u8bd5\u673a\u914d\u7f6e","text":"setting/config/client.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u4fe1\u606f\u3002 \u6709\u7f51\u7edc\u7684\u60c5\u51b5\u4e0b\uff0c\u670d\u52a1\u7aef\u9700\u8981\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u56e0\u6b64\u4f60\u9700\u8981\u5199\u5165 \u6d4b\u8bd5\u673a\u522b\u540d \u3001 user \u3001ip\u3001 password \u3002 # \u6d4b\u8bd5\u673a\u522b\u540d\n[Alias1] # \u6d4b\u8bd5\u673aip\nip=10.8.15.86 # \u6d4b\u8bd5\u673a\u7528\u6237\u540d\nuser=uos\n \u547d\u540d\u5efa\u8bae\uff1aAliasA1\u3001AliasA2\u3001AliasB1\u3001AliasB2\uff0c\u4e0d\u8981\u91cd\u540d\u3002 \u65e0\u7f51\u7edc\u60c5\u51b5\u4e0b\uff0c\u4ec5\u9700\u8981\u5173\u6ce8\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\u9879 width=\u3001 height= \u5373\u53ef\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a [client]\n# \u9ed8\u8ba4\u6d4b\u8bd5\u673a\u7528\u6237\u540d\uff0c\u5bc6\u7801\uff0cip\nip=\nuser=\n# \u6d4b\u8bd5\u673a\u5bc6\u7801\npassword=1\n# \u6d4b\u8bd5\u673a\u4e3b\u9898\ntheme=bloom\n# \u6d4b\u8bd5\u673aicon\u76ee\u5f55\npath=/usr/share/icons\n# \u7cfb\u7edfdesktop\u6587\u4ef6\u7684\u5b58\u653e\u76ee\u5f55\uff0cUOS\u7cfb\u7edf\u9ed8\u8ba4\u4e3a/usr/share/applications\ndesktop_path=/usr/share/applications\n# \u7528\u4e8e\u5224\u65ad\u6d4b\u8bd5\u673a\u662f\u5426\u5f00\u673a\u8fdb\u5165\u684c\u9762\u7684\u8bc6\u522b\u6807\u8bc6\u3002\n# 1\u3001\u901a\u8fc7\u684c\u9762\u56fe\u6807\u8bc6\u522b\u3002\n# - type=FILE_NAME\u65f6\uff0c\u670d\u52a1\u5668\u548c\u6d4b\u8bd5\u673a\u5fc5\u987b\u5728\u540c\u4e00\u5c40\u57df\u7f51\u5185\u3002\n# - power_on=dde-computer\u8868\u793a\u901a\u8fc7\u684c\u9762\u8ba1\u7b97\u673a\u56fe\u6807\u5224\u65ad\u5f00\u673a\u8fdb\u5165\u684c\u9762\u3002\n# 2\u3001\u901a\u8fc7\u672c\u5730\u56fe\u7247\u4f5c\u4e3a\u5f00\u673a\u8bc6\u522b\u3002\n# - type= \u4f20\u5165\u4e3a\u56fe\u7247\u683c\u5f0f\uff0ctype\u652f\u6301\u7684\u7c7b\u578b\u5305\u542b\u5728server.ini\u5185\u914d\u7f6e\u9879input_type=jpg,jpeg,png\u3002\n# - power_on= \u4f20\u5165\u7684\u662f\u672c\u5730\u56fe\u7247\u7684\u8def\u5f84\u3002\ntype=FILE_NAME\npower_on=dde-computer\n# \u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\uff08\u6d4b\u8bd5\u673a\u8fde\u63a5\u91c7\u96c6\u76d2\uff0c\u91c7\u96c6\u76d2\u7684\u5206\u8fa8\u7387\uff09\nheight=1080\nwidth=1920\n[AliasA1] ip=10.8.15.86\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n[AliasA2]\nip=10.8.15.20\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_2","title":"3\u3001\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e","text":"\u968f\u7740\u6d4b\u8bd5\u573a\u666f\u7684\u4e0d\u65ad\u5f15\u5165\uff0c\u53d1\u73b0\u73b0\u6709\u670d\u52a1\u7aef\u91cc\u7684\u914d\u7f6e\u9879\u5e76\u4e0d\u9002\u7528\u4e8e\u6240\u6709\u7684\u6027\u80fd\u573a\u666f\uff0c\u4e8e\u662f\u5c06\u670d\u52a1\u7aef\u914d\u7f6e\u8fdb\u884c\u4e00\u4e2a\u63d0\u53d6\uff0c\u53ef\u505a\u5355\u4e2a\u573a\u666f\u7684\u4e2a\u6027\u5316\u914d\u7f6e\uff0c\u5f53\u7136\u539f\u6765\u7684\u670d\u52a1\u7aef\u914d\u7f6e\u529f\u80fd\u4fdd\u7559\uff0c\u53ea\u662f\u5f53\u4f60\u914d\u7f6e\u4e86\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e\u540e\uff0c\u4f18\u5148\u4f7f\u7528\u4e2a\u6027\u5316\u914d\u7f6e\u91cc\u9762\u7684\u5185\u5bb9\uff0c\u4ee5\u4e0b\u662f\u5bf9\u4e2a\u6027\u5316\u914d\u7f6e\u7684\u4ecb\u7ecd\u3002 \u76ee\u524d\u6bcf\u4e00\u4e2a py \u6587\u4ef6\u5bf9\u5e94\u4e00\u4e2a\u6027\u80fd\u6d4b\u8bd5\u573a\u666f\uff0c\u4e8e\u662f\u5728\u540c\u7ea7\u76ee\u5f55\u4e0b\u521b\u5efa\u4e00\u4e2a\u4e0e\u4e4b\u540c\u540d\u7684 json \u6587\u4ef6\uff0c\u4f5c\u4e3a\u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6 apps\n\u251c\u2500\u2500 album\n \u251c\u2500\u2500 test_album_01_start.json # \u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6\n\u2514\u2500\u2500 test_album_01_start.py # \u6027\u80fd\u573a\u666f\u6587\u4ef6\n \u4ee5\u4e0b\u662f\u5bf9 json \u6587\u4ef6\u4e2d\u914d\u7f6e\u7684\u89e3\u91ca\uff0c\u82e5\u67d0\u9879\u914d\u7f6e\u4e0d\u9700\u8981\uff0c\u53ef\u4ee5\u7f3a\u5931\uff0c\u4f46\u4e0d\u80fd\u4e3a\u7a7a\uff1b {\n\"title\": \"test_album_start\", # \u6807\u9898\uff1b\u5fc5\u987b\n\"app_name\": \"deepin-album\", # \u573a\u666f\u6240\u5c5e\u7684\u5e94\u7528\uff1b\u5fc5\u987b\n\"scene\": \"hot\", # \u573a\u666f\u522b\u540d\uff1b\u5fc5\u987b\n\"icon\": [\"deepin-album\"], # \u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684icon\u5230\u670d\u52a1\u7aef\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\uff1b\u53ef\u7f3a\u5931\n# \u6ce8\u610f\uff1a\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684desktop\u6587\u4ef6\u540d\u4e3adeepin-album.desktop\uff0c\n# \u53ea\u9700\u8981\u5199deepin-album\u5373\u53ef\uff0c\u201c.desktop\u201d\u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002\n\"size\": { # \u56fe\u7247\u5bf9\u6bd4\u7684\u533a\u57df\u8bbe\u7f6e\u9879\uff0c\u67d0\u4e9b\u5e94\u7528\u5f53\u524d\u5c4f\u5e55\u7684\u90e8\u5206\u533a\u57df\u9700\u8981\u5c06\u5176\u53bb\u6389\uff0c\u53ef\u4ee5\u8bbe\u7f6e\u6b64\u9879\uff0c\u5982\u679c\u6ca1\u6709\u5219\u53ef\u4e0d\u5199\uff1b\u53ef\u786e\u5b9e\n\"x-coordinate\": 0, # \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n\"y-coordinate\": 0, # \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n\"width\": 850, # \u6a2a\u5411\u957f\u5ea6\n\"height\": 1920 # \u7eb5\u5411\u9ad8\u5ea6\n},\n\"count\": 5, # \u573a\u666f\u6267\u884c\u7684\u6b21\u6570\uff1b\u5fc5\u987b\n\"duration\": 5, # \u8be5\u6761\u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff0c\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7279\u5b9a\u573a\u666f\uff0c\u8be5\u914d\u7f6e\u4e3a\u53ef\u9009\u9879\uff0c\u8986\u76d6 server.ini \u4e2d\u7684\u914d\u7f6e\uff1b\u53ef\u7f3a\u5931\n\"stable_similarity\": 0.9997, # \u6027\u80fd\u573a\u666f\u5206\u9636\u6bb5\u65f6\u7684\u56fe\u7247\u76f8\u4f3c\u5ea6\u5bf9\u6bd4\uff0c\u524d\u540e\u56fe\u7247\u4f4e\u4e8e\u8be5\u503c\uff0c\u5219\u5206\u4e3a\u4e0d\u7a33\u5b9a\u9636\u6bb5\uff1b\u53ef\u7f3a\u5931\n\"find_by\": \"stage\", # \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\n\"final_stable_num\": 100, # \u67e5\u627e\u6700\u540e\u4e00\u4e2a\u5927\u4e8e\u8be5\u503c\u7684\u7a33\u5b9a\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u7684\u5c3e\u796f\uff1b\u53ef\u7f3a\u5931\n\"start_num\": 150,\n\"text\": \"\", # ocr\u8bc6\u522b\u7684\u6587\u6848\n\"match\": \"apps/xxx/images/match.png\", # \u56fe\u50cf\u5339\u914d\u7684\u56fe\u7247\u6587\u4ef6\u8def\u5f84\n\"match_rate\": 0.9 # \u5339\u914d\u76f8\u4f3c\u5ea6\n}\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e94\u3001\u6d4b\u8bd5\u6d41\u7a0b","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516d\u3001\u7528\u4f8b\u7f16\u5199\u53ca\u65b9\u6cd5\u53c2\u6570\u6307\u5f15","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"1\u3001\u7528\u4f8b\u5b9e\u4f8b\u8bf4\u660e","text":"# \u6807\u51c6\u5e93\u5bfc\u5165\nfrom time import sleep\n# \u5bfc\u5165\u4e09\u65b9\u5e93pytest\nimport pytest\n# \u5bfc\u5165\u7528\u4f8b\u6267\u884c\u8981\u7528\u5230\u7684Widget\u7c7b\nfrom src.base_widget import BaseWidget\nclass TestStart:\n# class\u7ea7\u522b\u7684fixture\uff0c\u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u6267\u884c\u3002autouse=True \u81ea\u52a8\u5728\u5f53\u524d\u4f5c\u7528\u57df\u4e0b\u4f7f\u7528\u3002\n@pytest.fixture(scope=\"class\", autouse=True)\n# \u6d4b\u8bd5\u70ed\u542f\u52a8\u4e4b\u524d\u9700\u8981\u9884\u542f\u52a8\u3002\ndef application_pre_start(self):\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().right_click_element(\"deepin-album\")\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().click_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\")\nsleep(2)\n# \u5feb\u6377\u952e\u5173\u95ed\u7a97\u53e3\nBaseWidget().hot_key(\"alt\", \"f4\")\nsleep(2)\n# \u9ed8\u8ba4\u4e3afunction\u7ea7\u522b\u7684fixture\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\uff0cclass\u7ea7\u522bfixture\u6267\u884c\u4e4b\u540e\u6267\u884c\u3002\n@pytest.fixture(autouse=True)\ndef setup_start(self):\n# \u53f3\u952e\u70b9\u51fb deepin-album \u56fe\u6807\nBaseWidget().right_click_element(\"deepin-album\")\n# \u79fb\u52a8\u5230\u53f3\u952e\u83dc\u5355\u4e2d\u6253\u5f00\uff08open.png\uff09\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().move_to(*BaseWidget().find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))\n# \u7b49\u5f85\u79fb\u52a8\u5b8c\u6210\nsleep(0.5)\ndef test_album_start(self):\n# \u70b9\u51fb\u201c\u6253\u5f00\u201d\nBaseWidget().click() \n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"2\u3001\u65b9\u6cd5\u53c2\u6570\u8bf4\u660e","text":"2.1\u3001find_element \u65b9\u6cd5 def find_element(element: str, input_type: str = \"FILE_NAME\", fill_color_position: tuple = (-1, -1), size: tuple = (25, 70)):\npass\n \u53c2\u6570 element \u548c input_type \uff081\uff09\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u5143\u7d20 - `input_type` \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a `FIEL_NAME` \uff0c\u8868\u793a\u901a\u8fc7\u5e94\u7528 `icon` \u5bfb\u627e\u5143\u7d20\uff0c\u6b64\u65b9\u6cd5\u4f1a\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u5e94\u7528 `icon` \u56fe\u6807\u3002\n \u4e3e\u4f8b\uff1a\u9ed8\u8ba4\u60c5\u51b5\u4e0b input_type \u53c2\u6570\u4e0d\u9700\u8981\u4f20\u5165\uff0c find_element(\"deepin-album\")\uff0c\u8868\u793a\u901a\u8fc7 deepin-album \u7684\u5e94\u7528 icon \u6765\u83b7\u53d6\u5750\u6807\uff0c\u6ce8\u610f\uff0c\u6b64\u65f6\u4f20\u5165\u7684 deepin-album \u53c2\u6570\u5b9e\u9645\u662f desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u548c2.3\u4e2d\u7684 icon \u53d8\u91cf\u4e00\u81f4\u3002 \u6211\u4eec\u5efa\u8bae\u4f18\u5148\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\uff0c\u4f46\u6b64\u65b9\u6cd5\u4f9d\u8d56\u7f51\u7edc\uff0c\u8bf7\u6839\u636e\u6d4b\u8bd5\u73af\u5883\u5b9e\u9645\u60c5\u51b5\u9009\u62e9\u3002 \uff082\uff09\u901a\u8fc7\u672c\u5730\u56fe\u7247\u8bc6\u522b\u5143\u7d20 - \u53c2\u6570 `input_type` \u4f20\u5165\u56fe\u7247\u683c\u5f0f\uff0c\u6bd4\u5982\u622a\u53d6\u7684\u672c\u5730\u56fe\u7247\u683c\u5f0f\u4e3a `png`\uff0c\u90a3\u4e48 `input_type=\"png\"`\uff0c\u6b64\u65f6\u53c2\u6570 `element ` \u4f20\u5165\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5efa\u8bae\u5b58\u653e\u5728\u5bf9\u5e94\u7684\u4ea7\u54c1 `apps/app/picture/` \u76ee\u5f55\u4e0b\uff0c\u8def\u5f84\u4e3a\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u7684\u76f8\u5bf9\u8def\u5f84\u3002\n- \u4e3e\u4f8b\uff1a`find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))`\uff0c\u8868\u793a\u901a\u8fc7\u672c\u5730\u56fe\u7247 `open.png` \u8bc6\u522b\u5143\u7d20\u3002\n \u53c2\u6570 fill_color_position fill_color_position \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (-1, -1)\uff0c(-1, -1) \u8868\u793a\u53d6\u5c4f\u5e55\u4e2d\u53f3\u4e0b\u89d2\u6700\u540e\u4e00\u4e2a\u50cf\u7d20\u70b9\u4f5c\u4e3a\u586b\u5145\u5750\u6807\uff0c\u5728 1920x1080 \u5c4f\u5e55\u5206\u8fa8\u7387\u4e0b\u5373\u5b9e\u9645\u5750\u6807\u4e3a (1919, 1079) \uff0c\u8fd9\u6837\u7684\u5199\u6cd5\u53ef\u4ee5\u9002\u914d\u4e0d\u540c\u5927\u5c0f\u7684\u5c4f\u5e55\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0d\u540c\u65b9\u4f4d\uff1a \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0b\u65b9\uff0c\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u4e0d\u9700\u8981\u4f20\u5165\u8be5\u53c2\u6570\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u5de6\u8fb9\uff0cfill_color_position=(1, 1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u53f3\u8fb9\uff0cfill_color_position=(-1, -1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0a\u8fb9\uff0cfill_color_position=(1, 1) \u4ece\u684c\u9762\u542f\u52a8\u5e94\u7528\uff0c\u5219\u9700\u8981\u4f20\u5165\u9664\u4efb\u52a1\u680f\u4ee5\u5916\u5176\u4ed6\u4f4d\u7f6e\u7684\u5750\u6807\uff0c\u6bd4\u5982(100, 100)\uff0c\u53ea\u8981\u8fd9\u4e2a\u5750\u6807\u4e3a\u9664\u5e94\u7528\u548c\u4efb\u52a1\u680f\u533a\u57df\u90fd\u53ef\u4ee5\u3002 \u4ece\u542f\u52a8\u5668\u91cc\u9762\u542f\u52a8\u5e94\u7528\uff0c\u9700\u8981\u586b\u5145\u7684\u5750\u6807\u4e3a\u542f\u52a8\u5668\u533a\u57df\u3002 \u6ce8\uff1a\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u65f6\uff0c\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684 icon \u539f\u6587\u4ef6\u4e3a svg \u77e2\u91cf\u56fe\uff0c\u8f6c\u6362\u4e3a png \u4e4b\u540e\u9700\u8981\u586b\u5145\u8fb9\u7f18\u900f\u660e\u90e8\u5206\u3002 \u53c2\u6570 size size \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (25, 70)\uff0c\u8868\u793a\u6d4b\u8bd5\u673a\u4e0a dock \u680f\u4e0a\u5e94\u7528\u56fe\u6807\u7684\u5927\u5c0f\u8303\u56f4\u3002 UOS \u7cfb\u7edf dock \u680f\u662f\u53ef\u4ee5\u4e0a\u4e0b\u62d6\u52a8\u5927\u5c0f\u7684\uff0c\u968f\u7740 dock \u680f\u5927\u5c0f\u6539\u53d8\uff0c\u5e94\u7528\u56fe\u6807\u7684\u8303\u56f4\u4e3a25\u523070\u4e4b\u95f4\u3002 \u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u64cd\u4f5c\u7cfb\u7edf\u4e0a dock \u680f\u5927\u5c0f\u4e0d\u4e00\u6837\uff0c\u53ef\u4ee5\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u4f20\u5165\u5927\u5c0f\u8303\u56f4\u3002 2.2\u3001click_element\u3001 right_click_element\uff0c double_click_element \u8fd9\u51e0\u4e2a\u65b9\u6cd5\u53c2\u6570\u89c4\u5219\u4e0e find_element \u65b9\u6cd5\u4e00\u6837\u3002\u4ed6\u4eec\u5b9e\u9645\u4e0a\u662f\u5728 find_element \u65b9\u6cd5\u57fa\u7840\u4e4b\u4e0a\u505a\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u589e\u52a0\u4e86\u9f20\u6807\u7684\u52a8\u4f5c\uff0c\u5982\u679c\u4f60\u4e0d\u60f3\u4f7f\u7528\u8fd9\u51e0\u4e2a\u65b9\u6cd5\uff0c\u5728\u7528\u4f8b\u4e2d\u4e5f\u53ef\u4ee5\u901a\u8fc7 find_element \u83b7\u53d6\u5230\u5750\u6807\uff0c\u7136\u540e\u5c06\u5750\u6807\u4f20\u5165\u5230\u952e\u9f20\u7684\u65b9\u6cd5\u4e2d\uff0c\u53ef\u4ee5\u5b9e\u73b0\u540c\u6837\u7684\u6548\u679c\u3002 2.3\u3001\u7528\u4f8b\u7c7b\u4e2d\u6709\u4e2a\u7c7b\u53d8\u91cf icon = [\"deepin-album\"] \u9700\u8981\u7279\u6b8a\u8bf4\u660e\uff0c\u5217\u8868\u4e2d\u7684\u5143\u7d20\u4e3a\u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709 icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684 icon \u5230\u670d\u52a1\u7aef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528 desktop \u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684 desktop \u6587\u4ef6\u540d\u4e3a deepin-album.desktop\uff0c\u53ea\u9700\u8981\u5199 deepin-album \u5373\u53ef\uff0c.desktop \u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e03\u3001\u6267\u884c\u5165\u53e3","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"1\u3001\u7528\u4f8b\u7ec4\u7ec7","text":"\u5728 setting/config/server.ini \u6587\u4ef6\u4e2d APP_NAME= \u5b57\u6bb5\u4e3a\u7528\u4f8b\u7684\u6267\u884c\u7684\u76ee\u5f55\uff0c\u9ed8\u8ba4\u4e3a apps \u76ee\u5f55\u4e0b\u6240\u6709\u7528\u4f8b\u3002\u5982\u679c\u4f60\u60f3\u6307\u5b9a\u6267\u884c\u67d0\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4f60\u53ef\u4ee5\u5c06\u8be5\u914d\u7f6e\u9879\u6307\u5b9a\u5230\u5e94\u7528\u7684\u7528\u4f8b\u76ee\u5f55\uff0c\u6bd4\u5982\uff1aAPP_NAME=deepin_album\uff0c \u8868\u793a\u6267\u884c\u76f8\u518c\u76ee\u5f55\u4e0b\u7684\u7528\u4f8b\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a python3 manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music\n -k KEYWORDS, --keywords KEYWORDS\n \u7528\u4f8b\u7684\u5173\u952e\u8bcd\n -t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e\n --log_level LOG_LEVEL \u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n --env {host,docker} \u5728\u5bbf\u4e3b\u673a\u6216\u5bb9\u5668\u73af\u5883\u6267\u884c\n --client_alias \u9009\u62e9\u6d4b\u8bd5\u673a\u522b\u540d, \u53ef\u9009\u9879\u4e3aclient.ini\u4e2d\u5df2\u914d\u7f6e, \u9ed8\u8ba4\u503c\u4e3a zx-x86.\n --count \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a python3 manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\" --env docker\n \u6ce8\uff1a\u5728\u5bb9\u5668\u4e2d\u6267\u884c\u65f6\uff0c\u82e5\u5f3a\u5236\u9000\u51fa\uff0c\u5bb9\u5668\u5e76\u4e0d\u4f1a\u505c\u6b62\u8fd0\u884c\uff01"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_9","title":"\u516b\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1json","title":"1\u3001Json \u62a5\u544a","text":"\u81ea\u7814\u89c6\u9891\u89e3\u6790\u5de5\u5177\u4f1a\u5bf9\u5355\u6761\u7528\u4f8b\u6267\u884c\u4e00\u8f6e\u751f\u6210\u4e00\u4e2a json \u6587\u4ef6\uff0c\u5b58\u653e\u4e8e report/{app_name}/{scene}/{run_num} \u76ee\u5f55\u4e0b\uff0c\u547d\u540d\u683c\u5f0f\u4e3a\uff1a report.json json \u5185\u5bb9\u4e3e\u4f8b\uff1a [\n{\n\"Stab1\": {\n\"images\": [1,2...150,151],\n\"startStub\": 0,\n\"type\": \"Stab\"\n}\n},\n{\n\"Stab2\": {\n\"images\": [152,153...169,170],\n\"startStub\": 1,\n\"type\": \"UnStab\"\n}\n},\n{\n\"Stab3\": {\n\"images\": [171,172...300,301],\n\"startStub\": 0,\n\"type\": \"UnStab\"\n}\n}\n]\n \u8bf4\u660e\uff1a Stab \uff1a\u8868\u793a\u89e3\u6790\u8fc7\u7a0b\u4e2d\u4e0d\u540c\u7684\u9636\u6bb5\u3002 images \uff1a\u8868\u793a\u6bcf\u4e00\u5e27\u7684\u56fe\u7247\u5e8f\u53f7\u3002 startStub\uff1a \u4e3a\u8bc6\u522b\u5c3e\u5e27\u7684\u9636\u6bb5\u8868\u793a\uff0c\u5982\u679c \"startStub\": 1 \uff0c\u8bf4\u660e\u5c3e\u5e27\u51fa\u73b0\u5728\u8be5\u9636\u6bb5\u3002 type\uff1a \u4e3a Stab \u6216 UnStab \uff0c\u8868\u793a\u7a33\u5b9a\u9636\u6bb5\u6216\u4e0d\u7a33\u5b9a\u9636\u6bb5\u3002 \u5404\u9636\u6bb5\u6709\u5e27\u6570\u8865\u507f\uff0c\u9ed8\u8ba4\u8865\u507f\u7684\u5e27\u6570\u4e3a 3 \u5e27\uff08\u53ef\u4ee5\u901a\u8fc7 server.ini \u91cc\u9762 un_stab_start=3 \u8fdb\u884c\u914d\u7f6e\uff09\uff0c\u8868\u793a\u5c0f\u4e8e\u7b49\u4e8e 3 \u5e27\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u524d\u540e\u5747\u9700\u8981\u51cf\u6389\u3002 \u5e94\u7528\u542f\u52a8\u9636\u6bb5\u5c31\u662f\u5728 Stab2 \u9636\u6bb5\uff0c\u542f\u52a8\u65f6\u95f4\u4e3a\uff1a171 \u51cf 151 \u518d\u51cf\u6389\u524d\u540e\u8865\u507f\u5e27\u6570 6 \u5e27\uff0c\u5373 14 \u5e27\uff0c\u89c6\u9891\u5e27\u7387 30 \u5e27/\u79d2\uff0c\u56e0\u6b64\u542f\u52a8\u8017\u65f6\u4e3a\uff1a14 * 33 = 462 ms"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2excel","title":"2\u3001Excel \u62a5\u544a","text":"\u6240\u6709\u7528\u4f8b\u6267\u884c\u5e76\u89e3\u6790\u5b8c\u4e4b\u540e\u4f1a report \u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a\u6c47\u603b\u6570\u636e\u7684 Excel \u6587\u4ef6\uff0c\u6587\u4ef6\u540d\u4e3a\uff1a{time}_perf_time.xlsx\u3002 \u6ce8\u610f\uff0creport \u76ee\u5f55\u4e3a\u53ef\u914d\u7f6e\u9879\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u4f1a\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u751f\u6210\uff0c\u5982\u679c\u4f60\u5c06 report\uff0c\u6307\u5b9a\u5230\u9879\u76ee\u4e0b\u5176\u4ed6\u8def\u5f84\uff0c\u5219\u4f1a\u5728\u5bf9\u5e94\u7684\u8def\u5f84\u4e0b\u751f\u6210 json \u548c Excel \u6587\u4ef6\u3002 \u4f60\u4e5f\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8bfb\u53d6\u6240\u6709 json / excel \u62a5\u544a\u7684\u6570\u636e\uff0c\u751f\u6210\u4f60\u81ea\u5df1\u60f3\u8981\u7684\u4e00\u4e9b\u6d4b\u8bd5\u62a5\u544a\u5f62\u5f0f\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#usb","title":"\u4e5d\u3001USB \u4e32\u53e3\u9a71\u52a8\u952e\u9f20\u65b9\u6cd5","text":"\u4f4d\u4e8e src/utils/control/serial_communication \u76ee\u5f55\u4e0b\u7684 usb_mk.py \u6587\u4ef6 usb_mk = UsbMk()\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up()\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u652f\u6301\u4f20\u5165\u6c49\u5b57\uff0c\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click()\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() \n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() \n \uff084\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() \n \uff085\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() \n \uff086\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() \n \uff087\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff088\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff0810\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_10","title":"\u5341\u3001\u7ee7\u7535\u5668\u63a7\u5236\u4e3b\u673a\u5f00\u673a/\u91cd\u542f","text":"\uff08\u82e5\u4e0d\u4f7f\u7528\u7ee7\u7535\u5668\uff0c\u53ef\u5ffd\u7565\u8be5\u6b65\u9aa4\uff0c\u6267\u884c\u65f6\u4f1a\u901a\u8fc7\u547d\u4ee4 reboot\uff09"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u7ee7\u7535\u5668\u8bbe\u5907","text":"LCUS-2 \u578b \u53cc\u8def USB \u667a\u80fd\u4e32\u53e3\u63a7\u5236\u7ee7\u7535\u5668\u3002 https://item.taobao.com/item.htm?spm=a1z09.2.0.0.41d72e8dUYx2pi&id=582653718178&_u=i25r20ia6a2e "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2usb","title":"2\u3001USB \u5ef6\u957f\u7ebf","text":"\u666e\u901a\u7684 USB \u7ebf\u5373\u53ef\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_3","title":"3\u3001\u675c\u90a6\u7ebf","text":"3.1\u300140P \u6bcd\u5bf9\u516c\u675c\u90a6\u7ebf\u3002 3.2\u3001\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"4\u3001\u5b89\u88c5\u56fe\u6587\u6559\u7a0b","text":"4.1\u3001\u4f7f\u7528 USB \u5ef6\u957f\u7ebf\u8fde\u63a5\u63a7\u5236\u7aef\u548c\u7ee7\u7535\u5668\u3002 4.2\u3001\u5728\u7ee7\u7535\u5668\u5e38\u7aef\u548c\u516c\u5171\u7aef\u5747\u8fde\u63a5\u4e00\u6839\u675c\u90a6\u7ebf\u3002 4.3\u3001\u5728\u4e3b\u677f\u4e0a\u5f00\u673a\u9488\u548c\u91cd\u542f\u9488\u4e0a\u63d2\u4e0a\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 4.4\u3001\u5c06\u5f00\u673a\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76841\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1\u5de6\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 4.5\u3001\u5c06\u91cd\u542f\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76842\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1 \u53f3\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 \u82e5\u60f3\u4fdd\u7559\u539f\u7535\u6e90\u5f00\u5173\u7684\u7535\u6e90\u706f\uff0c\u53ef\u6839\u636e\u5982\u4e0a\u56fe\u6240\u793a\uff0c\u4f7f\u7528\u675c\u90a6\u7ebf\u8fde\u63a5\u4e3b\u677f\u4e0a\u7684\u7535\u6e90\u706f\u548c\u539f\u7535\u6e90\u5f00\u5173"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_11","title":"\u5341\u4e00\u3001\u5e38\u89c1\u95ee\u9898\u8bf4\u660e","text":"1\u3001ERROR: for uos Cannot restart container 2301b1a1395d7959ee6523d61b61c87084649af530786cdb8fb5b3ecbcbd1068: linux runtime spec devices: error gathering device information while adding custom device \"/dev/ttyACM0\": no such file or directory \u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u8fde\u63a5\u72b6\u6001\uff0c\u67e5\u770b /dev/ttyACM0 \u662f\u5426\u5b58\u5728\uff0c\u82e5\u5b58\u5728 /dev/ttyACMn\uff08n\u4e3a\u4efb\u610f\u6570\u5b57\uff09\uff0c\u91cd\u542f\u7535\u8111\u89e3\u51b3\u3002 2\u3001Error response from daemon: Container 5e700fdc769e8c74666d68a7f2bc3de58268b4594cf88706609d59f8dbc7362d is not running \u5bb9\u5668\u542f\u52a8\u5931\u8d25 1\uff09\u68c0\u67e5\u54ea\u4e00\u4e2a\u5bb9\u5668\u672a\u542f\u52a8 sudo docker container ls # \u5217\u51fa\u8fd0\u884c\u4e2d\u7684 Docker \u5bb9\u5668\n 2\uff09\u7f3a\u5c11 uos \u5bb9\u5668\uff0c\u68c0\u67e5 USB \u4e32\u53e3\u8fde\u63a5\u7ebf\u548c\u91c7\u96c6\u76d2\u8fde\u63a5\u7ebf\u662f\u5426\u6b63\u5e38\uff0c\u91cd\u542f\u540e\u6267\u884c bash install/setup.up # \u91cd\u65b0\u5b8c\u6574\u90e8\u7f72\u73af\u5883\n \u6216\u6267\u884c sudo docker-compose up -d --build # \u4ec5\u91cd\u65b0\u6784\u5efa Docker \u955c\u50cf\n 3\u3001\u82e5\u90e8\u7f72\u65f6\u63d0\u793a\u6302\u8f7d ttyACM0\u3001video0 \u5931\u8d25\uff0c\u8bf7\u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u53ca\u91c7\u96c6\u76d2\u662f\u5426\u63a5\u89e6\u826f\u597d\uff0c\u82e5\u63a5\u89e6\u826f\u597d\uff0c\u91cd\u542f\u5373\u53ef\u89e3\u51b3\u3002 4\u3001\u82e5\u51fa\u73b0\u56fe\u7247\u80fd\u8bc6\u522b\uff0c\u4f46\u662f\u9f20\u6807\u672a\u79fb\u52a8\u64cd\u4f5c\u65f6\uff0c\u5b89\u88c5\u7edd\u5bf9\u9f20\u6807\u64cd\u4f5c\u7684\u4f9d\u8d56\u5305\uff0c\u89c1\u7b2c\u4e09\u8282\u7b2c\u4e8c\u5c0f\u8282\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u6d4b\u8bd5\u673a\u3002 5\u3001\u7531\u4e8e\u901a\u8fc7\u91c7\u96c6\u5361\u83b7\u53d6\u7684\u6d4b\u8bd5\u673a\u5b9e\u65f6\u753b\u9762\uff0c\u5305\u542b\u4e86\u9f20\u6807\u7684\u6837\u5f0f\uff0c\u6240\u4ee5\u5bf9\u56fe\u7247\u8bc6\u522b\u65f6\uff0c\u9f20\u6807\u82e5\u505c\u7559\u5728\u56fe\u6807\u4e0a\u5c42\uff0c\u5219\u4f1a\u5bf9\u8bc6\u522b\u7ed3\u679c\u9020\u6210\u5f71\u54cd\uff0c\u9700\u8981\u5c06\u9f20\u6807\u79fb\u52a8\u81f3\u5176\u4ed6\u4f4d\u7f6e\uff0c\u6216\u8005\u9690\u85cf\u9f20\u6807\u89e3\u51b3\u3002 6\u3001Excel \u62a5\u544a\u4e2d\uff0c\u6d4b\u8bd5\u573a\u666f\u5217\u4e0e\u7528\u4f8b\u4e2d\u7684\u4e0d\u4e00\u81f4\uff0c\u5173\u952e\u5b57scene\u3001app_name\u3001\u67b6\u6784\u522b\u540d\uff0c\u4e0d\u80fd\u5305\u542b\u4e0b\u5212\u7ebf\u548c\u82f1\u6587\u7b26\u53f7\u7684\u5706\u62ec\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/","title":"\u6846\u67b6\u529f\u80fd\u4ecb\u7ecd","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2023/1/12\n# Author : Mikigo\n# =============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_2","title":"\u4e00\u3001\u4e00\u53e5\u8bdd\u7b80\u4ecb","text":"\u6b64\u6587\u6863\u4e3b\u8981\u60f3\u5bf9 YouQu \u6846\u67b6\u4e00\u4e9b\u91cd\u70b9\u7684\u529f\u80fd\u505a\u8be6\u7ec6\u7684\u4ecb\u7ecd\uff0c\u5305\u62ec\u5bf9\u4e00\u4e9b\u529f\u80fd\u5f00\u53d1\u7684\u80cc\u666f\u3001\u8981\u89e3\u51b3\u7684\u95ee\u9898\u3001\u5b9e\u73b0\u903b\u8f91\u3001\u4ee3\u7801\u7b49\u65b9\u9762\u7684\u4ecb\u7ecd\uff0c\u4ee5\u6b64\u8ba9\u5927\u5bb6\u80fd\u66f4\u52a0\u6e05\u6670\u7684\u7406\u89e3\u5404\u9879\u529f\u80fd\uff0c\u4ece\u800c\u5728\u4f7f\u7528\u7684\u65f6\u5019\u80fd\u66f4\u52a0\u7684\u5f97\u5fc3\u5e94\u624b\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_3","title":"\u4e8c\u3001\u56fe\u50cf\u8bc6\u522b","text":"\u56fe\u50cf\u8bc6\u522b\u5728 UI \u81ea\u52a8\u5316\u4e2d\u662f\u4e0d\u53ef\u7f3a\u5c11\u7684\uff0c\u5e02\u9762\u4e0a\u751a\u81f3\u6709\u5b8c\u5168\u57fa\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\uff0c\u6bd4\u5982 Airtest\u3001Sikuli \u7b49\uff0c\u5728\u6e38\u620f\u7b49\u7279\u5b9a\u9886\u57df\u4e5f\u6709\u4e0d\u9519\u7684\u6548\u679c\uff0c\u8fd9\u4e9b\u5de5\u5177\u5b9e\u9645\u4e0a\u4e5f\u662f\u7528\u7684 OpenCV \u8fdb\u884c\u4e86\u5c01\u88c5\uff0cYouQu \u6846\u67b6\u57fa\u4e8e OpenCV \u5f00\u53d1\u4e86\u81ea\u5df1\u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\uff0c\u5b83\u53ef\u4ee5\u65b9\u4fbf\u7684\u7528\u4e8e\u754c\u9762\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u65ad\u8a00\uff1b YouQu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u51e0\u4e4e\u6ee1\u8db3\u4e86\u4f60\u7684\u6240\u6709\u8981\u6c42\uff0c\u6211\u4eec\u5728\u957f\u65f6\u95f4\u7684\u601d\u8003\u548c\u6478\u7d22\u4e2d\uff0c\u9488\u5bf9\u5e38\u89c4\u573a\u666f\u53ca\u4e00\u4e9b\u7279\u6b8a\u573a\u666f\u63a2\u7d22\u9664\u4e86\u4e00\u4e9b\u5b9e\u7528\u4e14\u6709\u6548\u7684\u65b9\u6848\uff0c\u4e14\u542c\u6211\u6162\u6162\u9053\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1","title":"1\u3001\u5e38\u89c4\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5e38\u89c4\u8bc6\u522b\u5f88\u597d\u7406\u89e3\uff0c\u4e00\u53e5\u8bdd\u8bb2\u5c31\u662f\uff0c\u8981\u83b7\u53d6\u5230\u76ee\u6807\u5143\u7d20\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u3002 \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u5728\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u9700\u8981\u83b7\u53d6\u7684\u5750\u6807\u662f\u76f8\u5bf9\u4e8e\u6574\u4e2a\u5c4f\u5e55\u7684\u5750\u6807\uff0c\u6211\u4eec\u53ef\u4ee5\u622a\u53d6\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u56fe\u7247\uff08screen\uff09\uff1b \u5728\u5143\u7d20\u8bc6\u522b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u622a\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5c0f\u56fe\u8fdb\u884c\u8bc6\u522b\uff0c\u6bd4\u5982\u622a\u53d6\u64ad\u653e\u6309\u94ae\uff1a \u90a3\u4e48\u5b9e\u9645\u4e0a\uff0c\u5143\u7d20\u5b9a\u4f4d\u7684\u95ee\u9898\u5c31\u8f6c\u6362\u4e3a\uff0c\u5c06\u622a\u56fe\u7684\u5c0f\u56fe\uff08play_btn\uff09\u62ff\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u5927\u56fe\uff08screen\uff09\u4e2d\u53bb\u505a\u5339\u914d\uff0c\u5982\u679c\u5339\u914d\u6210\u529f\uff0c\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff08 x, y \uff09\u5373\u53ef\u3002 \u4e3a\u4e86\u65b9\u4fbf\u63cf\u8ff0\uff0c\u4ee5\u4e0b\u6211\u5c06\u6574\u4e2a\u5c4f\u5e55\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5927\u56fe\uff0c\u67d0\u4e2a\u5143\u7d20\u56fe\u7247\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5c0f\u56fe\u3002 \u57fa\u4e8e OpenCV \u7684\u6a21\u677f\u5339\u914d cv.matchTemplate() \u529f\u80fd\uff0c\u6211\u4eec\u5b9e\u73b0\u4e86\u56fe\u50cf\u5b9a\u4f4d\u7684\u529f\u80fd\uff0c\u6846\u67b6\u63d0\u4f9b\u4e86\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u5e95\u5c42\u63a5\u53e3\uff08\u4e00\u822c\u4e0d\u5bf9\u4e0a\u5c42\u63d0\u4f9b\u8c03\u7528\uff09\uff1a def _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\n# \u8be6\u7ec6\u4ee3\u7801\u592a\u957f\u4e0d\u8d34\u4e86\uff0c\u611f\u5174\u8da3\u8bf7\u67e5\u770b\u6e90\u7801\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001image_path image_path \u662f\u5c0f\u56fe\u7684\u7edd\u5bf9\u8def\u5f84; \u901a\u5e38\u5728 AT \u5de5\u7a0b\u91cc\u9762\uff0c\u6211\u4eec\u7ea6\u5b9a\u5c06\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u5b9e\u9645\u7684\u5143\u7d20\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1aplay_btn.png \uff1b \u7528\u4e8e\u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 case/assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1amusic_001.png \uff1b \u8fd9\u6837\u662f\u4e3a\u4e86\u65b9\u4fbf\u7ba1\u7406\u548c\u7ef4\u62a4\u3002 2\u3001rate \u56fe\u50cf\u8bc6\u522b\u7684\u7684\u5339\u914d\u5ea6\u6216\u8005\u8bf4\u76f8\u4f3c\u5ea6\uff0c\u6846\u67b6\u9ed8\u8ba4\u7684\u914d\u7f6e\u4e3a 0.9\uff0c\u4e5f\u5c31\u662f\u8bf4\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u5b58\u5728\u4e00\u4e2a\u76f8\u4f3c\u5ea6 90% \u7684\u56fe\u6807\u5373\u8fd4\u56de\u5176\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff1b \u5982\u679c\u4f60\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u8c03\u6574\u8bc6\u522b\u5ea6\uff0c\u4f60\u53ef\u4ee5\u5728\u8c03\u7528\u51fd\u6570\u7684\u65f6\u5019\uff0c\u4f20\u5165\u4e0d\u540c\u7684\u8bc6\u522b\u5ea6\u7684\u503c\u3002 3\u3001multiple \u9ed8\u8ba4\u60c5\u51b5\u4e0b multiple=False\uff0c\u8868\u793a\u53ea\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u7b2c\u4e00\u4e2a\uff0c\u5982\u679c multiple=True \u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\uff0c\u56e0\u4e3a\u5927\u56fe\u4e2d\u53ef\u80fd\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u5c0f\u56fe\uff0c\u5728\u67d0\u4e9b\u573a\u666f\u4e0b\u4f60\u53ef\u80fd\u9700\u8981\u5168\u90e8\u83b7\u53d6\u5230\u6240\u6709\u5339\u914d\u5230\u7684\u5750\u6807\u3002 4\u3001picture_abspath \u9ed8\u8ba4\u60c5\u51b5\u4e0b picture_abspath=None \u8868\u793a\u5927\u56fe\u4e3a\u622a\u53d6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u5982\u679c\u4f60\u4e0d\u5e0c\u671b\u5927\u56fe\u662f\u5c4f\u5e55\u7684\u622a\u56fe\uff0c\u800c\u662f\u4f60\u81ea\u5b9a\u4e49\u4f20\u5165\u7684\u67d0\u4e2a\u56fe\u7247\uff0c\u4f60\u53ea\u9700\u8981\u5c06\u4f60\u7684\u56fe\u7247\u8def\u5f84\u4f20\u9012\u7ed9\u8fd9\u4e2a\u53c2\u6570\u5c31\u884c\uff0c\u6bd4\u5982\uff1a picture_abspath=\"~/Desktop/big.png\" \uff1b 5\u3001screen_bbox \u5927\u56fe\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u622a\u53d6\u6574\u4e2a\u5c4f\u5e55\uff0cscreen_bbox = [x, y, w, h] \u53ef\u4ee5\u6307\u5b9a\u622a\u53d6\u5c4f\u5e55\u4e2d\u7684\u56fa\u5b9a\u533a\u57df\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\uff0c\u53ef\u4ee5\u6392\u9664\u90e8\u5206\u533a\u57df\u5bf9\u8bc6\u522b\u7ed3\u679c\u7684\u5f71\u54cd\u3002 \u3010\u9690\u5f0f\u7b49\u5f85\u3011 \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\uff0c\u6709\u65f6\u5019\u9875\u9762\u8df3\u8f6c\u6709\u5ef6\u65f6\uff0c\u6709\u53ef\u80fd\u5b58\u5728\u8bc6\u522b\u7684\u90a3\u4e00\u523b\u9875\u9762\u4e5f\u6ca1\u6709\u8df3\u8f6c\u51fa\u6765\uff0c\u6216\u8005\u6216\u8005\u8bc6\u522b\u7684\u90a3\u4e00\u523b\uff1b \u56e0\u6b64\u6211\u4eec\u9700\u8981\u4e00\u79cd\u7b49\u5f85\u673a\u5236\uff0c\u5373\u5728\u4e00\u5b9a\u7684\u65f6\u95f4\u5185\uff0c\u5982\u679c\u8bc6\u522b\u4e0d\u5230\uff0c\u91cd\u590d\u53bb\u8bc6\u522b\uff1a def find_image(\ncls,\n*widget, rate: [float, int] = None,\nmultiple: bool = False,\nmatch_number: int = None,\npicture_abspath: str = None,\nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u5728\u5c4f\u5e55\u4e2d\u533a\u5bfb\u627e\u5c0f\u56fe\uff0c\u8fd4\u56de\u5750\u6807\uff0c\n \u5982\u679c\u627e\u4e0d\u5230\uff0c\u6839\u636e\u914d\u7f6e\u91cd\u8bd5\u6b21\u6570\uff0c\u6bcf\u6b21\u95f4\u96941\u79d2\n :param widget: \u6a21\u677f\u56fe\u7247\u8def\u5f84\n :param rate: \u76f8\u4f3c\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param match_number: \u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\n :return: \u5750\u6807\u5143\u7ec4\n \"\"\"\nif rate is None:\nrate = float(GlobalConfig.IMAGE_RATE)\ntry:\nfor element in widget:\nfor _ in range((match_number or int(GlobalConfig.IMAGE_MATCH_NUMBER)) + 1):\nlocate = cls._match_image_by_opencv(\nelement,\nrate,\nmultiple=multiple,\npicture_abspath=picture_abspath,\nscreen_bbox=screen_bbox\n)\nif not locate:\nsleep(int(GlobalConfig.IMAGE_MATCH_WAIT_TIME))\nelse:\nreturn locate\nraise TemplateElementNotFound(*widget)\nexcept Exception as e:\nraise e\n \u53c2\u6570 match_number \u7528\u4e8e\u63a7\u5236\u91cd\u590d\u8bc6\u522b\u7684\u6b21\u6570\uff0c\u9ed8\u8ba4\u4e0d\u4f20\u53c2\uff0c\u53d6\u5168\u5c40\u914d\u7f6e setting/globalconfig.ini \u91cc\u9762\u7684 IMAGE_MATCH_NUMBER \u914d\u7f6e\u9879\u7684\u503c\uff0c\u9ed8\u8ba4IMAGE_MATCH_NUMBER = 1\uff0c\u5373\u91cd\u8bd5 1 \u6b21\uff1b find_image \u662f\u6846\u67b6\u63d0\u4f9b\u7684\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u51fd\u6570\u63a5\u53e3\uff0c\u8fd9\u4e2a\u51fd\u6570\u63d0\u4f9b\u4e86\u9690\u5f0f\u7b49\u5f85\u7684\u529f\u80fd\uff0c\u4e14\u5305\u542b\u4e0a\u9762\u4ecb\u7ecd\u7684 _match_image_by_opencv \u51fd\u6570\u7684\u6240\u6709\u529f\u80fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2","title":"2\u3001\u6c14\u6ce1\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u6c14\u6ce1\u8bc6\u522b\u6307\u7684\u662f\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\u8981\u5b9a\u4f4d\u7684\u5143\u7d20\u662f\u4e00\u4e9b\u4f1a\u6d88\u5931\u7684\u5c0f\u5f39\u7a97\uff0c\u8fd9\u7c7b\u573a\u666f\u5728\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\u5c31\u53ef\u80fd\u5b58\u5728\u4e0d\u7a33\u5b9a\u6027\uff0c\u6709\u53ef\u80fd\u56fe\u50cf\u8bc6\u522b\u7684\u65f6\u5019\u6c14\u6ce1\u5df2\u7ecf\u6d88\u5931\u4e86\uff0c\u4e5f\u6709\u53ef\u80fd\u6c14\u6ce1\u51fa\u73b0\u7684\u65f6\u95f4\u592a\u77ed\u4e86\uff0c\u4e0d\u5bb9\u6613\u6355\u6349\u5230\uff0c\u5c31\u50cf\u6c14\u6ce1\u4e00\u6837\uff0c\u51fa\u73b0\u4e00\u4e0b\u5c31\u6d88\u5931\uff0c\u56e0\u6b64\u6211\u4eec\u5f62\u8c61\u7684\u79f0\u4e4b\u4e3a \u201c\u6c14\u6ce1\u8bc6\u522b\u201d\uff1b \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u4e3a\u4e86\u80fd\u7a33\u5b9a\u7684\u8bc6\u522b\u6c14\u6ce1\u7c7b\u573a\u666f\uff0c\u6211\u4eec\u91c7\u7528\u7684\u65b9\u6848\u662f\uff1a \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\uff08\u5305\u542b\u6c14\u6ce1\u4ece\u51fa\u73b0\u5230\u6d88\u5931\uff09\uff0c\u4e0d\u505c\u7684\u622a\u53d6\u8fd9\u6bb5\u65f6\u95f4\u5185\u7684\u5927\u56fe\uff0c\u4ee5\u6b64\u786e\u4fdd\u5728\u622a\u53d6\u7684\u4e00\u5806\u56fe\u7247\u4e2d\uff0c\u80af\u5b9a\u6709\u81f3\u5c11\u4e00\u5f20\u56fe\u7247\u80fd\u6355\u6349\u5230\u6c14\u6ce1\uff0c\u6700\u540e\u518d\u5bf9\u8fd9\u4e00\u5806\u56fe\u7247\u9010\u4e2a\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def get_during(\ncls,\nimage_path: str,\nscreen_time: [float, int],\nrate: float = None,\npause: [int, float] = None,\nmax_range: int = 10000\n):\n\"\"\"\n \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u622a\u56fe\u591a\u5f20\u56fe\u7247\u8fdb\u884c\u8bc6\u522b\uff0c\u5176\u4e2d\u6709\u4e00\u5f20\u56fe\u7247\u8bc6\u522b\u6210\u529f\u5373\u8fd4\u56de\u7ed3\u679c;\n \u9002\u7528\u4e8e\u6c14\u6ce1\u7c7b\u7684\u65ad\u8a00\uff0c\u6bd4\u5982\u6c14\u6ce1\u57281\u79d2\u5185\u6d88\u5931\uff0c\u5982\u679c\u7528\u5e38\u89c4\u7684\u56fe\u50cf\u8bc6\u522b\u5219\u6709\u53ef\u80fd\u65e0\u6cd5\u8bc6\u522b\u5230\uff1b\n :param image_path: \u8981\u8bc6\u522b\u7684\u6a21\u677f\u56fe\u7247\uff1b\n :param screen_time: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff1b\n :param rate: \u8bc6\u522b\u7387\uff1b\n :param pause: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u4e0d\u95f4\u9694\uff1b\n :param max_range: \u622a\u56fe\u7684\u6700\u5927\u6b21\u6570\uff0c\u8fd9\u662f\u4e00\u4e2a\u9884\u8bbe\u503c\uff0c\u4e00\u822c\u60c5\u51b5\u4e0b\u4e0d\u6d89\u53ca\u4fee\u6539\uff1b\n \"\"\"\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001screen_time \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5728\u6b64\u65f6\u95f4\u5185\u4f1a\u4e0d\u65ad\u7684\u8fdb\u884c\u622a\u56fe\u64cd\u4f5c\uff0c\u5c31\u50cf\u5f55\u5236\u89c6\u9891\u4e00\u6837\uff1b 2\u3001pause \u6bcf\u6b21\u622a\u53d6\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u4e00\u523b\u4e0d\u505c\u7684\u622a\u56fe\uff0c\u5982\u679c\u4f60\u60f3\u6bcf\u6b21\u622a\u56fe\u5b58\u5728\u4e00\u4e9b\u95f4\u9694\u65f6\u95f4\u4f20\u5165\u5bf9\u5e94\u7684\u65f6\u95f4\u95f4\u9694\u5373\u53ef\uff0c\u5355\u4f4d\u662f\u79d2\uff0c\u6bd4\u5982\uff1apause = 0.03\uff0c\u8868\u793a 30 ms\uff0c\u76f8\u5f53\u4e8e\u5e27\u7387\u4e3a 30 \u5e27\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-opencv","title":"3\u3001\u4e0d\u4f9d\u8d56 OpenCV \u7684\u56fe\u50cf\u8bc6\u522b\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31","title":"3.1\u3001\u81ea\u7814\u56fe\u50cf\u8bc6\u522b\u6280\u672f","text":"\u3010\u539f\u7406\u3011 \u4e3a\u4e86\u5b9e\u73b0\u8bc6\u522b\u56fe\u50cf\u7684\u76ee\u7684\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u5c06\u56fe\u7247\u7684\u6bcf\u4e2a\u50cf\u7d20\u7684RGB\u503c\uff0c\u4e0e\u6574\u4e2a\u5c4f\u5e55\u4e2d\u7684RGB\u8fdb\u884c\u5bf9\u6bd4\uff0c\u5982\u679c\u5c0f\u56fe\u4e0a\u7684RGB\u503c\u4e0e\u5bf9\u5e94\u5927\u56fe\u4f4d\u7f6e\u7684RGB\u90fd\u76f8\u7b49\uff0c\u5219\u5339\u914d\u6210\u529f\uff0c\u5373\u53ef\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u70b9\u3002 1\u3001\u8bfb\u53d6\u5c0f\u56fe\u548c\u5927\u56fe\u7684RGB\u503c \uff081\uff09\u5c0f\u56fe\u7684RGB\u503c small_data = small_pic.load() # load()\u4f1a\u5c06\u56fe\u7247\u7684RGB\u503c\u83b7\u53d6\u5230\uff0c\u6570\u636e\u683c\u5f0f\u4e3a\u4e00\u4e2a\u4e8c\u7ef4\u5217\u8868\uff0c\u8d4b\u503c\u7ed9\u4e00\u4e2a\u53d8\u91cfsmall_data\u3002\n \uff082\uff09\u5927\u56fe\u7684RGB\u503c big_data = big_pic.load()\n 2\u3001\u5c06\u5c0f\u56fe\u4e0e\u5927\u56fe\u7684RGB\u503c\u8fdb\u884c\u5339\u914d \uff081\uff09\u5339\u914d\u4ece\u5927\u56fe\u7684\u5750\u6807\uff080\uff0c0\uff09\u5f00\u59cb\u5339\u914d\uff0c\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff082\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\uff080\uff0c0\uff09\u5bf9\u5e94\u7684\u6240\u6709\u5c0f\u56fe\u7684RGB\u503c\u4e0d\u76f8\u7b49\uff0c\u5219\u79fb\u52a8\u5230\u4e0b\u4e00\u4e2a\u5750\u6807\u70b9\uff081\uff0c0\uff09\uff0c\u540c\u6837\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff083\uff09\u6309\u7167\u8fd9\u6837\u7684\u89c4\u5f8b\u5c06\u8fd9\u4e00\u884c\u6bcf\u79fb\u52a8\u4e00\u4e2a\u5750\u6807\u70b9\uff0c\u90fd\u5c06\u5c0f\u56fe\u6240\u6709\u7684RGB\u4e0e\u5bf9\u5e94\u5927\u56fe\u7684\u503c\u8fdb\u884c\u5339\u914d\uff1b \uff084\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\u5176\u4e2d\u4e00\u4e2a\u5750\u6807\u70b9\u4e0a\u5339\u914d\u5230\u4e86\u5c0f\u56fe\u7684\u6240\u6709RGB\u503c\uff0c\u5219\u6b64\u65f6\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\u70b9\uff1b \uff085\uff09\u5982\u679c\u5339\u914d\u4e86\u5927\u56fe\u6240\u6709\u7684\u5750\u6807\u70b9\uff0c\u90fd\u6ca1\u6709\u5339\u914d\u5230\uff0c\u5219\u8bf4\u660e\u5927\u56fe\u4e2d\u4e0d\u5b58\u5728\u5c0f\u56fe\uff0c\u5339\u914d\u5931\u8d25\uff1b \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 class ImageRgb:\n@staticmethod\ndef _check_match(_x, _y, small, bdata, sdata, rate):\n\"\"\"\n Matching degree of small graph and large graph matching\n \"\"\"\n@staticmethod\ndef _pre_random_point(small):\n\"\"\"\n Pre matching, take 10-20 points at random each time,\n and take coordinates randomly in the small graph\n \"\"\"\n@staticmethod\ndef _pre_random_match(_x, _y, point_list, bdata, sdata, rate):\n\"\"\"\n In the small graph, several points are randomly\n selected for matching, and the matching degree is\n also set for the random points\n \"\"\"\n@classmethod\ndef match_image_by_rgb(cls, image_name=None, image_path=None, rate=0.9):\n\"\"\"\n By comparing the RGB values of the small image with the large\n image on the screen, the coordinates of the small image on\n the screen are returned.\n \"\"\"\n \u901a\u8fc7 match_image_by_rgb() \u8fd9\u4e2a\u51fd\u6570\uff0c\u4f20\u5165\u76ee\u6807\u5c0f\u56fe\u7684\u6587\u4ef6\u540d\u79f0\uff0c\u5373\u53ef\u8fd4\u56de\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u3002 \u6709\u540c\u5b66\u8981\u95ee\u4e86\uff0c\u6709 OpenCV \u5e72\u561b\u4e0d\u7528\uff0c\u6709\u5fc5\u8981\u81ea\u5df1\u5b9e\u73b0\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u529f\u80fd\u5417\uff0c\u4f60\u4eec\u662f\u4e0d\u662f\u95f2\u7684\u554a\uff1f \u8fd9\u4e48\u95ee\u7684\u8bdd\uff0c\u5c0f\u4e86\uff0c\u683c\u5c40\u5c0f\u4e86\uff1b\u6211\u4eec\u81ea\u5df1\u5b9e\u73b0\u4e3b\u8981\u6709\u51e0\u65b9\u9762\u539f\u56e0\uff1a \u51cf\u5c11\u73af\u5883\u4f9d\u8d56\uff0c\u5373\u4e0d\u7528\u5b89\u88c5 OpenCV\uff0c\u6211\u4eec\u4e5f\u80fd\u5b9e\u73b0\u5176\u529f\u80fd\uff0c\u73af\u5883\u4f9d\u8d56\u8fd9\u5757\u540e\u9762\u4f1a\u5355\u72ec\u8be6\u7ec6\u8bb2\uff0c\u51cf\u5c11\u73af\u5883\u4f9d\u8d56\u5bf9\u4e8e\u4efb\u4f55\u8f6f\u4ef6\u5de5\u7a0b\u90fd\u975e\u5e38\u91cd\u8981\uff1b OpenCV \u5728\u5176\u4ed6\u56fd\u4ea7 CPU \u67b6\u6784\u4e0a\u5b89\u88c5\u5e76\u4e0d\u80fd\u4fdd\u8bc1100%\u6210\u529f\uff0c\u751a\u81f3\u6709\u6ca1\u6709\u53ef\u80fd\u5728\u4e00\u4e9b\u67b6\u6784\u4e0a\u538b\u6839\u513f\u5c31\u4e0d\u80fd\u5b89\u88c5\u4f7f\u7528 OpenCV \uff1f \u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 OpenCV \uff1f\u5c31\u50cf\u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 Windows \u5462\uff1f\u8fd9\u4e9b\u95ee\u9898\u503c\u5f97\u601d\u8003\u3002 \u5f53\u7136\uff0c\u6211\u4eec\u627f\u8ba4\u8fd9\u5957\u65b9\u6848\uff0c\u867d\u7136\u8bc6\u522b\u51c6\u786e\u7387\u6ca1\u95ee\u9898\uff0c\u4f46\u5728\u8bc6\u522b\u6548\u7387\u4e0a\u8fd8\u6ca1\u6709\u8fbe\u5230 OpenCV \u6a21\u677f\u5339\u914d\u7684\u6548\u679c\uff0c\u6211\u4eec\u7684\u65b9\u6848\u6bcf\u6b21\u8bc6\u522b\u5728 1.5s \u5de6\u53f3\uff0c\u800c OpenCV \u5728 1s \u5de6\u53f3\uff1b \u6574\u4f53\u8bc6\u522b\u6548\u679c\u6765\u8bb2\uff0c\u6211\u8ba4\u4e3a\u8fd8\u662f\u53ef\u4ee5\u63a5\u53d7\u7684\uff0c\u4e5f\u5e0c\u671b\u6709\u5fd7\u4e4b\u58eb\u80fd\u4e00\u8d77\u4f18\u5316\u6b64\u65b9\u6848\uff0c\u4e00\u8d77\u6280\u672f\u62a5\u56fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32-rpc","title":"3.2\u3001\u57fa\u4e8e RPC \u670d\u52a1\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b","text":"\u5728\u8fdc\u7a0b\u670d\u52a1\u5668\u4e0a\u90e8\u7f72 OpenCV \u7684\u73af\u5883\uff0c\u5e76\u5c06\u5176\u90e8\u7f72\u4e3a RPC \u670d\u52a1\uff0c\u6d4b\u8bd5\u673a\u4e0a\u4e0d\u7528\u5b89\u88c5 OpenCV \u4f9d\u8d56\uff0c\u800c\u662f\u901a\u8fc7\u8bf7\u6c42 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u3010\u539f\u7406\u3011 \u6d4b\u8bd5\u673a\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u56fe\u7247\u4ee5\u53ca\u6a21\u677f\u56fe\u7247\uff0c\u53d1\u9001\u7ed9 RPC \u670d\u52a1\u7aef\uff0c\u670d\u52a1\u7aef\u62ff\u5230\u4e24\u5f20\u56fe\u7247\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u6700\u540e\u5c06\u8bc6\u522b\u7ed3\u679c\u8fd4\u56de\u7ed9\u6d4b\u8bd5\u673a\uff1b \u8981\u7279\u6b8a\u8bf4\u660e\u7684\u662f\uff1a RPC \u662f\u4e00\u79cd\u534f\u8bae\uff0c\u8bb8\u591a\u8bed\u8a00\u90fd\u662f\u652f\u6301\u7684\uff0c\u6bd4\u5982\u8bf4\u670d\u52a1\u7aef\u4e5f\u53ef\u4ee5\u7528 C++ \u6765\u5b9e\u73b0\uff0c\u5ba2\u6237\u7aef\u4f7f\u7528 Python \u4e5f\u662f\u53ef\u4ee5\u8c03\u7528\u7684\u3002 \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 \u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nimport cv2 as cv\nimport numpy as np\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\nif __name__ == \"__main__\":\nserver = ThreadXMLRPCServer((\"x.x.x.x\", 8889), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(match_image_by_opencv, \"match_image_by_opencv\")\nserver.serve_forever()\n \u8fd9\u6837\uff0c\u6211\u4eec\u57fa\u4e8e Python \u6807\u51c6\u5e93 xmlrpc \u642d\u5efa\u4e86\u4e00\u4e2a RPC \u670d\u52a1\u5668\uff0c\u6ce8\u518c\u4e86 image_put \u548c match_image_by_opencv \u4e24\u4e2a\u529f\u80fd\u63a5\u53e3\uff0c\u5728\u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u901a\u8fc7 IP \u548c\u7aef\u53e3\u8fdb\u884c RPC \u8bf7\u6c42\uff1b \u5ba2\u6237\u7aef\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from xmlrpc.client import Binary\nfrom xmlrpc.client import ServerProxy\nserver = ServerProxy(GlobalConfig.OPENCV_SERVER_HOST, allow_none=True)\nscreen_rb = open(screen, \"rb\")\ntemplate_rb = open(template_path, \"rb\")\ntry:\nscreen_path = server.image_put(Binary(screen_rb.read()))\nscreen_rb.close()\ntpl_path = server.image_put(Binary(template_rb.read()))\ntemplate_rb.close()\nreturn server.match_image_by_opencv(\ntpl_path, screen_path, rate, multiple\n)\nexcept OSError as exc:\nraise EnvironmentError(\nf\"RPC\u670d\u52a1\u5668\u94fe\u63a5\u5931\u8d25. {GlobalConfig.OPENCV_SERVER_HOST}\"\n) from exc\n \u901a\u8fc7\u8fd4\u56de server.match_image_by_opencv \u5c31\u83b7\u53d6\u4e86\u5728\u670d\u52a1\u7aef\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4","title":"4\u3001\u53f3\u952e\u83dc\u5355\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41","title":"4.1\u3001\u53f3\u952e\u83dc\u5355\u5b9a\u4f4d\u7684\u65b9\u6848\u53ca\u95ee\u9898","text":"\u53f3\u952e\u83dc\u5355\u7684\u5143\u7d20\u5b9a\u4f4d\u662f\u4e00\u4e2a\u96be\u70b9\uff0c\u8fc7\u53bb\u6211\u4eec\u8c03\u7814\u548c\u4f7f\u7528\u8fc7\u7684\u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u65b9\u6cd5\u6709 4 \u79cd\uff1a \u7b2c\u4e00\u79cd\uff1a\u6b65\u957f\u64cd\u4f5c\u6cd5 \u5728\u53f3\u952e\u83dc\u5355\u547c\u51fa\u6765\u4e4b\u540e\uff0c\u901a\u8fc7\u952e\u76d8\u7684 up\u3001down \u6309\u952e\uff0c\u8fdb\u884c\u9009\u62e9\u83dc\u5355\u9009\u62e9\uff0c\u9009\u4e2d\u76ee\u6807\u4e4b\u540e enter \u5373\u53ef\uff1b\u6bd4\u5982\uff1a\u5728\u684c\u9762\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\uff0c\u6309 1 \u6b21 down \uff0c\u4f1a\u51fa\u73b0\u4e0b\u56fe\uff1a \u7ee7\u7eed\u518d\u6309 2 \u6b21 down\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u518d\u6309 enter\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u5982\u6b64\uff0c\u201c\u6392\u5e8f\u65b9\u5f0f\u201d\u7684\u6b65\u957f\u4e3a 3\uff1b\u901a\u8fc7\u4f7f\u7528\u952e\u76d8\u4e0a\u4e0b\u952e\uff0c\u5c31\u5b9e\u73b0\u4e86\u5bf9\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\uff1b \u4f46\u662f\uff0c\u8fd9\u79cd\u65b9\u5f0f\u6709\u4e2a\u5f88\u70e6\u4eba\u7684\u95ee\u9898\uff0c\u5c31\u662f\u53f3\u952e\u83dc\u5355\u7684\u9009\u9879\u4f4d\u7f6e\u4e0d\u53ef\u80fd\u4e00\u76f4\u4e0d\u53d8\uff0c\u5728\u9700\u6c42\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\uff0c\u83dc\u5355\u9009\u9879\u7684\u53d8\u5316\u662f\u5f88\u5927\u7684\uff0c\u751a\u81f3\u6709\u4e9b\u5e94\u7528\u652f\u6301\u81ea\u5b9a\u4e49\u83dc\u5355\uff0c\u6bd4\u5982\u6587\u7ba1\u53f3\u952e\u83dc\u5355\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff1b \u4e5f\u5c31\u662f\u8bf4\u4f60\u5f97\u7ecf\u5e38\u53bb\u7ef4\u62a4\u83dc\u5355\u9009\u9879\u7684\u6b65\u957f\uff0c\u4e00\u4e2a\u9009\u9879\u73b0\u5728\u7684\u6b65\u957f\u662f 3\uff0c\u4e0b\u4e2a\u8fed\u4ee3\u53ef\u80fd\u5c31\u662f 4 \u6216\u8005 5\u3002 \u7b2c\u4e8c\u79cd\uff1a\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u6cd5 \u628a\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5355\u72ec\u622a\u56fe\u4fdd\u5b58\uff0c\u56fe\u7247\u4e2d\u4ec5\u5305\u542b\u4e00\u4e2a\u83dc\u5355\u9009\u9879\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u8fd9\u6837\uff0c\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5c31\u53ef\u4ee5\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u65b9\u5f0f\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u8fd9\u79cd\u65b9\u5f0f\u4e0d\u7528\u62c5\u5fc3\u83dc\u5355\u9009\u9879\u7684\u987a\u5e8f\u6216\u4f4d\u7f6e\uff0c\u4f46\u662f\u9700\u8981\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff0c\u4e14\u5bb9\u6613\u53d7\u5230\u5b57\u4f53 UI \u53d8\u66f4\u7c7b\u9700\u6c42\u7684\u5f71\u54cd\uff0c\u6bd4\u5982\uff1a\u5b57\u4f53\u5927\u5c0f\u3001\u5b57\u4f53\u95f4\u8ddd\u7b49\u7b49\u9700\u6c42\u53d8\u66f4\u90fd\u4f1a\u5f71\u54cd\uff0c\u6bcf\u6b21\u53d8\u66f4\u4e4b\u540e\u5c31\u9700\u8981\u8fdb\u884c\u5927\u91cf\u56fe\u7247\u8d44\u6e90\u7684\u91cd\u65b0\u622a\u56fe\u66ff\u6362\uff0c\u662f\u4e2a\u6bd4\u8f83\u9ebb\u70e6\u7684\u4e8b\u60c5\uff1b \u7b2c\u4e09\u79cd\uff1a\u76f8\u5bf9\u4f4d\u79fb\u6cd5 \u9f20\u6807\u70b9\u51fb\u53f3\u952e\u7684\u65f6\u5019\uff0c\u9f20\u6807\u7684\u5f53\u524d\u5750\u6807\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u7684\uff0c\u83dc\u5355\u9009\u9879\u7684\u5bbd\uff08 w \uff09\u4e00\u822c\u662f\u56fa\u5b9a\u7684\uff0c\u53d8\u5316\u7684\u662f\u83dc\u5355\u7684\u957f\u5ea6\uff08 h \uff09\uff0c\u53ef\u4ee5\u901a\u8fc7\u67d0\u4e2a\u9009\u9879\u76f8\u5bf9\u4e8e\u9f20\u6807\u7684\u8ddd\u79bb\u5728\u786e\u5b9a\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u901a\u8fc7\u7ef4\u62a4\u83dc\u5355\u9009\u9879\uff08\u76f8\u5bf9\u4f4d\u7f6e\uff09\u76f8\u5bf9\u4e8e\u9f20\u6807\u4f4d\u7f6e\u7684\u8ddd\u79bb\uff0c\u5373\u53ef\u8f7b\u677e\u8ba1\u7b97\u51fa\u83dc\u5355\u9009\u9879\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\u3002 \u4ece\u7406\u8bba\u4e0a\u6b64\u65b9\u6848\u662f\u53ef\u884c\u7684\uff0c\u4f46\u662f\u8fd9\u91cc\u4ecd\u7136\u5b58\u5728\u4e24\u4e2a\u4e25\u91cd\u7684\u95ee\u9898\uff1a \u83dc\u5355\u987a\u5e8f\u6539\u53d8\uff0c\u5bfc\u81f4\u76f8\u5bf9\u8ddd\u79bb\u6539\u53d8\uff0c\u800c\u4e14\u8ddd\u79bb\u662f\u901a\u8fc7\u50cf\u7d20\uff08px\uff09\u6765\u8868\u793a\u7684\uff0c\u4e0d\u60f3\u6b65\u957f\u90a3\u4e48\u53ea\u7ba1\uff0c\u6bcf\u6b21\u9700\u8981\u53bb\u91cf\u4e00\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u70b9\u9ebb\u70e6\uff1b \u9f20\u6807\u5728\u684c\u9762\u4e0d\u540c\u4f4d\u7f6e\u70b9\u51fb\u53f3\u952e\uff0c\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u4f4d\u7f6e\u662f\u4e0d\u540c\u7684\uff0c\u4e0a\u56fe\u7684\u83dc\u5355\u662f\u5728\u9f20\u6807\u7684\u5de6\u4e0b\u65b9\uff0c\u5982\u679c\u4f60\u79fb\u52a8\u9f20\u6807\u5230\u5c4f\u5e55\u56db\u8fb9\uff0c\u4f60\u4f1a\u53d1\u73b0\uff0c\u53f3\u952e\u83dc\u5355\u53ef\u80fd\u51fa\u73b0\u5728\u9f20\u6807\u7684\u56db\u4e2a\u65b9\u5411\uff0c\u4e5f\u5c31\u662f\u8bf4\u4f60\u9700\u8981\u6839\u636e\u9f20\u6807\u7684\u4e0d\u540c\u4f4d\u7f6e\u6765\u5224\u65ad\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u65b9\u5411\uff0c\u800c\u4e0d\u540c\u7684\u65b9\u5411\u4e0a\u8ba1\u7b97\u65b9\u6cd5\u662f\u4e0d\u540c\u7684\uff0c\u6bd4\u5982\uff1a\u53f3\u952e\u83dc\u5355\u5728\u9f20\u6807\u7684\u5de6\u4e0a\uff0c\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\u8ba1\u7b97\u65b9\u6cd5\u4e3a\uff08x - w / 2\uff0c y - h\uff09\uff0c\u8fd9\u6837\u7ef4\u62a4\u8d77\u6765\u53ef\u4ee5\u8bf4\u975e\u5e38\u590d\u6742\uff1b \u57fa\u4e8e\u4ee5\u4e0a\u4e24\u4e2a\u539f\u56e0\uff0c\u6211\u4eec\u5e76\u4e0d\u63a8\u8350\u8fd9\u79cd\u64cd\u4f5c\u65b9\u6848\u3002 \u7b2c\u56db\u79cd\uff1a\u5c5e\u6027\u5b9a\u4f4d \u6709\u540c\u5b66\u8bf4\u5e72\u561b\u4e0d\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u5462\uff0c\u5176\u5b9e\uff0c\u6211\u4eec\u6700\u5f00\u59cb\u60f3\u5230\u7684\u65b9\u6848\u5c31\u662f\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\uff0c\u4f46\u662f\u5728\u5c5e\u6027\u7684 DOM \u6811\u91cc\u600e\u4e48\u4e5f\u627e\u4e0d\u5230\uff0c\u65e0\u6cd5\u5b9a\u4f4d\u5230\uff0c\u6211\u4eec\u4e5f\u8054\u5408\u7814\u53d1\u540c\u5b66\u4e00\u8d77\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u4f46\u6700\u7ec8\u8fd8\u662f\u6ca1\u80fd\u89e3\u51b3\uff0c\u975e\u5e38\u9057\u61be\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42","title":"4.2\u3001\u6700\u65b0\u7684\u53f3\u952e\u83dc\u5355\u7ec8\u6781\u89e3\u51b3\u65b9\u6848","text":"\u7531\u4e8e\u53f3\u952e\u83dc\u5355\u9009\u9879\u51e0\u4e4e\u90fd\u662f\u6587\u672c\uff0c\u90a3\u4e48\u901a\u8fc7 OCR \u8bc6\u522b\uff0c\u51e0\u4e4e\u662f\u6700\u4f18\u7684\u65b9\u6848\uff1a \u4e0d\u7528\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff1b \u4e0d\u4f1a\u53d7\u5230\u83dc\u5355\u9009\u9879\u987a\u5e8f\u6539\u53d8\u7684\u5f71\u54cd\uff1b \u4e0d\u4f1a\u53d7\u5230\u5b57\u4f53 UI \u53d8\u5316\u7684\u5f71\u54cd\uff1b \u5173\u4e8e OCR \u8bc6\u522b\u6211\u4eec\u5728\u540e\u9762\u4f1a\u8be6\u7ec6\u8bb2\u5230\uff0c\u672c\u7ae0\u8282\u4e3b\u8981\u8bb2\u57fa\u4e8e OCR \u8bc6\u522b\uff0c\u6211\u4eec\u5728\u53f3\u952e\u83dc\u5355\u8bc6\u522b\u4e0a\u7684\u7a81\u7834\u548c\u521b\u65b0\uff1b \u4f7f\u7528 OCR \u8bc6\u522b\u53f3\u952e\u83dc\u5355\u867d\u7136\u5df2\u7ecf\u5f88\u5b8c\u7f8e\u4e86\uff0c\u4f46\u662f\u5728\u4e00\u4e9b\u60c5\u51b5\u4e0b\u4ecd\u7136\u5b58\u5728\u4e00\u70b9\u95ee\u9898\uff0c\u5c31\u662f\u5c4f\u5e55\u4e2d\u51fa\u73b0\u591a\u4e2a\u548c\u83dc\u5355\u9009\u9879\u6587\u5b57\u76f8\u540c\u7684\u6587\u5b57\u65f6\uff0c\u6bd4\u5982\u4e0b\u9762\u8fd9\u79cd\u60c5\u51b5\uff1a \u5c4f\u5e55\u6070\u597d\u51fa\u73b0\u4e86\u4e24\u4e2a\u201c\u590d\u5236\u201d\uff0c\u6b64\u65f6\u8981\u5b9a\u4f4d\u5230\u83dc\u5355\u4e2d\u7684 \u201c\u590d\u5236\u201d\uff0c\u5c31\u9700\u8981\u8fdb\u4e00\u6b65\u505a\u6570\u636e\u5904\u7406\uff0c\u6bd4\u5982\uff1aOCR \u8fd4\u56de 2 \u4e2a\u201c\u590d\u5236\u201d\u7684\u5750\u6807\uff0c\u7528\u4f8b\u91cc\u9762\u6765\u5224\u65ad\u7528\u54ea\u4e2a\uff0c\u4ece\u4e1a\u52a1\u4e0a\u5c06\u5904\u7406\u8d77\u6765\u6bd4\u8f83\u9ebb\u70e6\uff0c\u56e0\u4e3a\u4f60\u5f97\u660e\u786e\u77e5\u9053\u83dc\u5355\u5728\u5de6\u8fb9\u8fd8\u662f\u53f3\u8fb9\uff0c\u7136\u540e\u8fd9\u672c\u8eab\u5c31\u662f\u4e0d\u786e\u5b9a\u7684\uff1b \u600e\u4e48\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u5462\uff0c\u8fd9\u5c31\u8981\u8bf4\u9053\u672c\u7ae0\u7684\u4e3b\u9898\uff1a\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b\u3002 \u3010\u539f\u7406\u3011 \u5728\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u524d\u622a\u4e00\u5f20\u56fe\uff0c\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\u518d\u622a\u53d6\u4e00\u5f20\u56fe\uff0c\u4e24\u5f20\u56fe\u552f\u4e00\u53d8\u5316\u7684\u5c31\u662f\u53f3\u952e\u83dc\u5355\uff0c\u5c06\u5176\u4ed6\u76f8\u540c\u7684\u5730\u65b9\u90fd\u5c4f\u853d\u6389\uff0c\u53ea\u7559\u4e0b\u83dc\u5355\u754c\u9762\uff0c\u5982\u6b64\u5373\u53ef\u6d88\u9664\u5e72\u6270\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u5c06\u4e24\u79cd\u56fe\u505a\u524d\u540e\u5bf9\u6bd4\u63d0\u53d6\u53ef\u4ee5\u5f97\u5230\u8fd9\u6837\u7684\u56fe\uff1a \u4f60\u770b\uff0c\u901a\u8fc7\u524d\u540e\u56fe\u7247\u7684\u5bf9\u6bd4\uff0c\u5c06\u76f8\u540c\u7684\u90e8\u5206\u7ed9\u6d88\u9664\u6389\uff0c\u518d\u8fdb\u884c OCR \u8bc6\u522b\uff0c\u8fd9\u6837\u5c31\u4e0d\u4f1a\u6709\u5e72\u6270\u4e86\uff1b \u4ee3\u7801\u5b9e\u73b0\u8bf7\u67e5\u770b src/filter_image.py \uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def filter_image(action):\n\"\"\"\n \u5bf9\u6bd4\u52a8\u4f5c\u524d\u540e\u4e24\u5f20\u56fe\u7247\uff0c\u63d0\u53d6\u4e0d\u540c\u7684\u90e8\u5206\u751f\u6210\u4e00\u5f20\u65b0\u7684\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u65b0\u56fe\u7247\u7684\u8def\u5f84\n :param action: \u52a8\u4f5c\u51fd\u6570\u7684\u51fd\u6570\u5bf9\u8c61\n :return: \u65b0\u56fe\u7247\u7684\u8def\u5f84\n \"\"\"\n action \u662f\u9f20\u6807\u4e8b\u4ef6\uff0c\u56e0\u4e3a\u6b64\u7c7b\u573a\u666f\u4e0d\u4ec5\u4ec5\u5728\u53f3\u952e\u5b58\u5728\uff0c\u5355\u51fb\u3001\u53cc\u51fb\u7b49\u7b49\uff0c\u53ea\u8981\u64cd\u4f5c\u524d\u540e\u540e\u53d8\u5316\u7684\u90fd\u53ef\u4ee5\uff1a from src.mouse_key import MouseKey\naction = (\nMouseKey.click,\nMouseKey.right_click,\nMouseKey.double_click,\nMouseKey.move_to,\n)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5","title":"5\u3001\u52a8\u6001\u56fe\u50cf\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5728\u684c\u9762\u58c1\u7eb8\u5207\u6362\uff0c\u6216\u770b\u56fe\u3001\u76f8\u518c\u5207\u6362\u56fe\u7247\u7c7b\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u7531\u4e8e\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u662f\u4e0d\u56fa\u5b9a\u7684\uff08\u4e0d\u540c\u7248\u672c\u7684\u7cfb\u7edf\u58c1\u7eb8\u4e0d\u540c\u3001\u58c1\u7eb8\u987a\u5e8f\u4e0d\u540c\uff0c\u770b\u56fe\u76f8\u518c\u5728\u56fe\u7247\u8d44\u6e90\u4e0d\u4e00\u5b9a\u56fa\u5b9a\uff09\uff0c\u90a3\u4e48\u5728\u6d4b\u8bd5\u5207\u6362\u58c1\u7eb8\u6216\u8005\u5207\u6362\u56fe\u7247\u7684\u573a\u666f\u65f6\u5c31\u4f1a\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u4f60\u4e0d\u77e5\u9053\u9884\u671f\u662f\u5565\uff0c\u7528\u4f8b\u64cd\u4f5c\u52a8\u6001\u7684\uff0c\u4e5f\u662f\u6781\u4e0d\u7a33\u5b9a\u3002 \u3010\u539f\u7406\u3011 \u5728\u5207\u6362\u56fe\u7247\u4e4b\u524d\u622a\u56fe\u4fdd\u5b58\u5e76\u8fd4\u56de\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u6b21\u8bc6\u522b\u8fd9\u5f20\u56fe\u7247\uff0c\u5982\u679c\u4e0d\u5b58\u5728\uff0c\u8bf4\u660e\u56fe\u7247\u5df2\u7ecf\u5207\u6362\u4e86\uff1b \u793a\u610f\u56fe\uff1a \u8fd9\u6837\uff0c\u6211\u4eec\u622a\u53d6\u4e86\u5f53\u524d\u56fe\u7247\u4e2d\u6bd4\u8f83\u6709\u4ee3\u8868\u6027\u7684\u4f4d\u7f6e\uff08\u4e00\u53ea\u9e1f\uff09\uff0c\u5728\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u7528\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1a \u6211\u4eec\u518d\u62ff\u7740\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd9\u6837\u5728\u5f53\u524d\u56fe\u7247\u4e2d\uff0c\u5c31\u4e0d\u80fd\u627e\u5230\u8fd9\u53ea\u9e1f\u4e86\uff0c\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u662f False\uff0c\u90a3\u4e48\u4e5f\u5c31\u53ef\u4ee5\u5224\u65ad\u56fe\u7247\u5207\u6362\u662f\u6210\u529f\u7684\u3002 \u4ee3\u7801\u793a\u610f\uff1a def save_temporary_picture(_x: int, _y: int, width: int, height: int):\n\"\"\"\n \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u56fe\u7247\u8def\u5f84\n :param x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n :param y: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n :param width: \u5bbd\u5ea6\n :param height: \u9ad8\u5ea6\n :return: \u56fe\u7247\u8def\u5f84\n \"\"\"\n \u6b64\u51fd\u6570\u7528\u4e8e\u5728\u64cd\u4f5c\u4e4b\u524d\u622a\u56fe\u4e00\u5f20\u4e34\u65f6\u56fe\u7247\uff0c\u8fd4\u56de\u56fe\u7247\u8def\u5f84\uff0c\u6700\u540e\u5728\u65ad\u8a00\u7684\u65f6\u5019\u518d\u5c06\u56fe\u7247\u8def\u5f84\u4f5c\u4e3a\u53c2\u6570\u4f20\u5165\u65ad\u8a00\u8bed\u53e5\u5373\u53ef\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ui","title":"\u4e09\u3001\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_1","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u662f\u6211\u4eec\u81ea\u7814\u7684\u4e00\u79cd\u4f7f\u7528\u7b80\u5355\uff0c\u4e14\u6548\u7387\u6781\u9ad8\u3001\u7a33\u5b9a\u6027\u597d\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u57fa\u4e8e\u5143\u7d20\u6309\u94ae\u5728\u5e94\u7528\u4e2d\u7684\u76f8\u5bf9\u4f4d\u7f6e\uff0c\u52a8\u6001\u83b7\u53d6\u5143\u7d20\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff0c\u9002\u7528\u4e8e\u5404\u79cd\u5c4f\u5e55\u5206\u8fa8\u7387\uff08\u5305\u62ec\u9ad8\u5206\u5c4f\u3001\u5bbd\u5c4f\u3001\u5e26\u9c7c\u5c4f\uff09\uff0c\u5f53\u5143\u7d20\u6309\u94ae\u4f4d\u7f6e\u76f8\u5bf9\u4e8e\u5e94\u7528\u754c\u9762\u4f4d\u7f6e\u53d1\u751f\u4fee\u6539\u4e4b\u540e\uff0c\u53ea\u9700\u8981\u6839\u636e UI \u8bbe\u8ba1\u56fe\u4e0a\u7684\u6e90\u6570\u636e\u4fee\u6539\u5bf9\u5e94\u5750\u6807\u6570\u636e\u5c31\u597d\uff0c\u7ef4\u62a4\u975e\u5e38\u7684\u65b9\u4fbf\u3002 \u6b64\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u9002\u7528\u4e8e\u4e00\u4e9b\u5143\u7d20\u4f4d\u7f6e\u76f8\u5bf9\u4e0e\u5e94\u7528\u754c\u9762\u6bd4\u8f83\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u97f3\u4e50\uff0899% \u7684\u5143\u7d20\u5b9a\u4f4d\u91c7\u7528\u8fd9\u79cd\uff0c\u6548\u679c\u975e\u5e38\u597d\uff09\uff0c\u4e0d\u9002\u7528\u4e8e\u754c\u9762\u4e0d\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u622a\u56fe\u5f55\u5c4f\uff0c\u5f88\u660e\u663e\u4e0d\u9002\u7528\u4e8e\u8fd9\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u3002\u8fd9\u79cd\u5168\u65b0\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u6709\u5b83\u7684\u9002\u7528\u6761\u4ef6\uff0c\u5982\u679c\u4f60\u53d1\u73b0\u4f7f\u7528\u5e38\u89c4\u7684\uff08\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u5b9a\u4f4d\uff09\u4e0d\u597d\u505a\u65f6\uff0c\u4e0d\u59a8\u8003\u8651\u4f7f\u7528\u8fd9\u79cd\uff0c\u5176\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff0c\u5e76\u4e14\u8fc5\u901f\u7231\u4e0a\u4ed6\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_1","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5728 UI \u8bbe\u8ba1\u56fe\u4e2d\u6211\u4eec\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u8fb9\u6846\u7684\u8ddd\u79bb\u7684\uff0c\u7136\u540e\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u6280\u672f\u624b\u6bb5\u83b7\u53d6\u5230\u5e94\u7528\u754c\u9762\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u53ca\u5e94\u7528\u7a97\u53e3\u7684\u5927\u5c0f\uff0c\u793a\u610f\u56fe\u5982\u4e0b\uff1a \uff08x1, y1\uff09\u4e3a\u5e94\u7528\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\uff1b\uff08x2, y2\uff09\u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u5de6\u4e0a\u89d2\uff08x1, y1\uff09\u7684\u5750\u6807\uff0c\u90a3\u4e48\u5b9e\u9645\u4e0a\u3010\u64ad\u653e\u6240\u6709\u3011\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\u4e3a\uff1a\uff08 x1 + x2, y1 + y2 \uff09\uff1b \u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5927\u5c0f\uff08w2, h2\uff09\uff0c\u53ef\u4ee5\u4ece UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\uff1b \u5728 UI \u8bbe\u8ba1\u7a3f\u4e0a\u70b9\u51fb\u3010\u64ad\u653e\u6240\u6709\u3011\u56fe\u6807\uff0c\u7136\u540e\u79fb\u52a8\u9f20\u6807\u5c31\u5c31\u53ef\u4ee5\u770b\u5230\u4e0a\u56fe\u7684\u53c2\u8003\u7ebf\u53ca\u6570\u636e\uff1b \u6240\u4ee5\uff0c\u6211\u4eec\u53ef\u4ee5\u8f7b\u677e\u7684\u83b7\u53d6\u5230\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u4e2d\u5fc3\u5750\u6807\u4e3a\uff1a\uff08 x1 + x2 + (w2 / 2), y1 + y2 + ( h2 / 2) \uff09 \u8be6\u7ec6\u6e90\u4ee3\u7801\u8bf7\u67e5\u770b AT \u57fa\u7840\u6846\u67b6: src/button_center.py \u83b7\u53d6\u5e94\u7528\u7a97\u53e3\u7684\u4fe1\u606f \u4f7f\u7528 xdotool \u548c xwininfo \u83b7\u53d6\u5230\u5e94\u7528\u7a97\u53e3\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u5de6\u4e0a\u89d2\uff09\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a app_id = CmdCtl.run_cmd(f\"xdotool search --classname --onlyvisible {self.app_name}\"\n).split(\"\\n\")\napp_id_list = [int(_id) for _id in app_id if _id]\nreturn CmdCtl.run_cmd(f\"xwininfo -id {app_id_list[self.number]}\")\n \u4f7f\u7528\u6b63\u5219\u83b7\u53d6\u7a97\u53e3\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u83b7\u53d6\u914d\u7f6e \u8bfb ini \u914d\u7f6e\u6587\u4ef6\uff0c\u83b7\u53d6\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e0e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a conf = ConfigParser()\nconf.read(self.config_path)\ndirection = conf.get(btn_name, \"direction\")\nposition = [int(i.strip()) for i in conf.get(btn_name, \"location\").split(\",\")]\n \u8ba1\u7b97\u5143\u7d20\u6309\u94ae\u5750\u6807 \u6839\u636e\u5e94\u7528\u7a97\u53e3\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u5927\u5c0f\u3001\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u5927\u5c0f\uff0c\u4f7f\u7528\u4e00\u5b9a\u7684\u7b97\u6cd5\u5373\u53ef\u8ba1\u7b97\u51fa\u5143\u7d20\u6309\u94ae\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u4e2d\u5fc3\u5750\u6807\uff09\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3","title":"3\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u3010\u914d\u7f6e\u65b9\u6cd5\u3011 \u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u7684\u6570\u636e\u6e90\u662f\u5e94\u7528\u5e93\u4e2d\u7684 ui.ini \u914d\u7f6e\u6587\u4ef6\uff1a ;section\n[\u65b0\u5efa\u6b4c\u5355+] ;key = value\ndirection = left_top\nlocation = 180, 268, 21, 21\n section \u662f\u4f60\u6839\u636e\u5bf9\u5e94\u7684\u5143\u7d20\u6309\u94ae\u547d\u540d\uff0c\u4f60\u53ef\u4ee5\u4efb\u610f\u547d\u540d\uff0c\u4f46\u6700\u597d\u6709\u5177\u4f53\u542b\u4e49\uff0c\u4e14\u80fd\u660e\u786e\u8868\u793a\u8fd9\u4e2a\u5143\u7d20\u6309\u94ae\u7684\u540d\u79f0\uff1b\u7528\u4e2d\u62ec\u53f7\u62ec\u8d77\u6765\u5c31\u884c\uff0c\u6bd4\u5982\uff1a[\u65b0\u5efa\u6b4c\u5355+] \uff1b direction \u662f\u914d\u7f6e\u8be5\u5143\u7d20\u7684\u53c2\u8003\u7cfb\uff0c\u5206\u522b\u4e3a\uff1a left_top \u5de6\u4e0a\uff1b left_bottom \u5de6\u4e0b\uff1b right_top \u53f3\u4e0a\uff1b right_bottom \u53f3\u4e0b\uff1b \u53c2\u8003\u7cfb\u7684\u9009\u53d6\u6807\u51c6\uff1a\u62c9\u52a8\u6539\u53d8\u7a97\u53e3\u5927\u5c0f\u65f6\uff0c\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u53c2\u8003\u7cfb\u4f4d\u7f6e\u662f\u4e0d\u53d8\u7684\uff1b location \u662f\u8be5\u5143\u7d20\u6309\u94ae\u7684\u76f8\u5bf9\u4e0e\u53c2\u8003\u7cfb\u7684 x, y \u7684\u8ddd\u79bb\uff0c\u53ca\u5927\u5c0f(w, h)\uff0c\u8fd9\u56db\u4e2a\u6570\u636e\u53ef\u4ee5\u901a\u8fc7 UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\u6570\u636e\uff0c\u5728\u7f16\u8f91\u6a21\u5f0f\u4e0b\uff0c\u70b9\u51fb UI \u56fe\u4e0a\u7684\u6309\u94ae\uff0c\u53f3\u4fa7\u5c31\u4f1a\u51fa\u73b0\u8be5\u5143\u7d20\u6309\u94ae\u7684 x, y, w, h \u6570\u636e\u3002 \u5982\u679c UI \u56fe\u4e0a\u6ca1\u6709\u63d0\u4f9b\u4f60\u60f3\u8981\u7684\u5143\u7d20\u6570\u636e\uff0c\u4f60\u53ef\u4ee5\u76f4\u63a5\u5728\u7cfb\u7edf\u4e2d\u4f7f\u7528\u622a\u56fe\u5f55\u5c4f\u8fdb\u884c\u5c3a\u91cf\uff0c\u8fd9\u662f\u4e00\u79cd\u4e0d\u63a8\u8350\u4f46\u80fd\u7528\u7684\u65b9\u6cd5\u3002 \u3010\u8c03\u7528\u65b9\u6cd5\u3011 \u5728\u5e94\u7528\u5e93\u65b9\u6cd5\u5c42\u8fd9\u6837\u5199\uff1a def click_add_music_list_btn_in_music_by_ui(self):\n\"\"\"\u70b9\u51fb\u65b0\u5efa\u6b4c\u5355\u6309\u94ae\"\"\"\nself.click(*self.ui.btn_center(\"\u65b0\u5efa\u6b4c\u5355+\"))\n self.ui.btn_center() \u662f\u56fa\u5b9a\u5199\u6cd5\uff0c\u53c2\u6570\u5c31\u662f\u914d\u7f6e\u91cc\u9762\u7684 section \u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ocr","title":"\u56db\u3001OCR \u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_2","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 OCR \u65b9\u6848\u5927\u591a\u91c7\u7528\u8c37\u6b4c OCR\uff08Tesseract\uff09\u65b9\u6848\uff0c\u4f46\u662f\u5b83\u5bf9\u4e8e\u4e2d\u6587\u7684\u8bc6\u522b\u975e\u5e38\u5dee\uff0c\u7ecf\u8fc7\u5927\u91cf\u7684\u8c03\u7814\uff0c\u6211\u4eec\u4f7f\u7528 PaddleOCR\uff0c\u5b83\u662f\u4e00\u4e2a\u5f00\u6e90\u7684\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u8bc6\u522b\u5de5\u5177\uff0c\u4e5f\u662f PaddlePaddle \u6700\u6709\u540d\u7684\u4e00\u4e2a\u5f00\u6e90\u9879\u76ee\uff0c\u611f\u5174\u8da3\u7684\u53ef\u4ee5\u70b9\u8fd9\u91cc\u4e86\u89e3\uff0c\u591a\u7684\u4e0d\u8bf4\u4e86\uff0c\u4f60\u53ea\u9700\u8981\u77e5\u9053\u5b83\u5c31\u662f\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_2","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5b89\u88c5\u4ed6\u662f\u4e2a\u5f88\u9ebb\u70e6\u7684\u4e8b\u60c5\uff0c\u867d\u7136\u64cd\u4f5c\u5f88\u7b80\u5355\uff0c\u4f46\u5176\u5b9e\u5b89\u88c5\u5305\u6709\u70b9\u5927\uff0c\u56e0\u6b64\u6211\u4eec\u4e0d\u5e0c\u671b\u76f4\u63a5\u5728 env.sh \u4e2d\u52a0\u5165\u5b83\uff0c\u8fd9\u4f1a\u8ba9\u6574\u4e2a\u81ea\u52a8\u5316\u73af\u5883\u53d8\u5f97\u975e\u5e38\u81c3\u80bf\uff1b \u56e0\u6b64\uff0c\u6211\u4eec\u60f3\u5230\u5c06\u5b83\u505a\u6210\u4e00\u4e2a RPC \u670d\u52a1\u5728\u5176\u4ed6\u673a\u5668\u4e0a\u90e8\u7f72\uff0c\u6d4b\u8bd5\u673a\u901a\u8fc7\u8fdc\u7a0b\u8c03\u7528 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u4f7f\u7528\u5b83\uff1b RPC \u7684\u8c03\u7528\u903b\u8f91\uff1a \u8fd9\u6837\u6211\u4eec\u53ea\u9700\u8981\u5728\u670d\u52a1\u7aef\u90e8\u7f72\u597d OCR \u8bc6\u522b\u7684\u670d\u52a1\uff0c\u7136\u540e\u901a\u8fc7 RPC \u670d\u52a1\u5c06\u529f\u80fd\u63d0\u4f9b\u51fa\u6765\uff0c\u6846\u67b6\u91cc\u9762\u53ea\u9700\u8981\u8c03\u7528\u5bf9\u5e94\u7684 RPC \u63a5\u53e3\u5c31\u884c\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_1","title":"3\u3001\u4f7f\u7528\u8bf4\u660e","text":"\u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nfrom paddleocr import PaddleOCR\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef paddle_ocr(pic_path, lang):\n\"\"\"\n Paddleocr\u76ee\u524d\u652f\u6301\u7684\u591a\u8bed\u8a00\u8bed\u79cd\u53ef\u4ee5\u901a\u8fc7\u4fee\u6539lang\u53c2\u6570\u8fdb\u884c\u5207\u6362\n \u4f8b\u5982`ch`, `en`, `fr`, `german`, `korean`, `japan`\n :param file_name:\n :param lang:\n :return:\n \"\"\"\nif __name__ == \"__main__\":\nIP = popen(\"hostname -I\").read().split(\" \")[0]\nPORT = 8890\nSCREEN_CACHE = \"/tmp/screen.png\"\nserver = ThreadXMLRPCServer((IP, PORT), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(paddle_ocr, \"paddle_ocr\")\nprint(\"\u76d1\u542c\u5ba2\u6237\u7aef\u8bf7\u6c42\u3002\u3002\")\nserver.serve_forever()\n \u6846\u67b6\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from src import OCR\nOCR.ocr(*target_strings, picture_abspath=None, similarity=0.6, return_default=False, return_first=False, lang=\"ch\"):\n# \u901a\u8fc7 OCR \u8fdb\u884c\u8bc6\u522b\u3002\n# target_strings:\n# \u76ee\u6807\u5b57\u7b26,\u8bc6\u522b\u4e00\u4e2a\u5b57\u7b26\u4e32\u6216\u591a\u4e2a\u5b57\u7b26\u4e32,\u5e76\u8fd4\u56de\u5176\u5728\u56fe\u7247\u4e2d\u7684\u5750\u6807;\n# \u5982\u679c\u4e0d\u4f20\u53c2\uff0c\u8fd4\u56de\u56fe\u7247\u4e2d\u8bc6\u522b\u5230\u7684\u6240\u6709\u5b57\u7b26\u4e32\u3002\n# picture_abspath: \u8981\u8bc6\u522b\u7684\u56fe\u7247\u8def\u5f84\uff0c\u5982\u679c\u4e0d\u4f20\u9ed8\u8ba4\u622a\u53d6\u5168\u5c4f\u8bc6\u522b\u3002\n# similarity: \u5339\u914d\u5ea6\u3002\n# return_default: \u8fd4\u56de\u8bc6\u522b\u7684\u539f\u751f\u6570\u636e\u3002\n# return_first: \u53ea\u8fd4\u56de\u7b2c\u4e00\u4e2a,\u9ed8\u8ba4\u4e3a False,\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u6240\u6709\u6570\u636e\u3002\n# lang: `ch`, `en`, `fr`, `german`, `korean`, `japan`\n \u6b64\u65b9\u6848\u5728\u6846\u67b6\u5185\u6ca1\u6709\u5f15\u5165\u4efb\u4f55\u4e09\u65b9\u4f9d\u8d56\u5b8c\u5168\u91c7\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\uff0c\u800c\u4e14\u4f7f\u7528\u65b9\u6cd5\u975e\u5e38\u7b80\u5355\uff0c\u53ea\u9700\u8981\u901a\u8fc7 OCR.ocr() \u5373\u53ef\uff1b \u5bf9\u4e8e\u4e00\u4e9b\u6587\u6848\u7684\u573a\u666f\u975e\u5e38\u9002\u7528\uff0c\u6b64\u65b9\u6cd5\u76f4\u63a5\u8fd4\u56de\u5750\u6807\uff0c\u53ef\u4ee5\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u3002 \u4e5f\u53ef\u4ee5\u7528\u4e8e\u6587\u5b57\u65ad\u8a00\uff0c\u4ee3\u7801\u793a\u610f\uff1a def assert_ocr_exist(\n*args, picture_abspath=None, similarity=0.6, return_first=False, lang=\"ch\"\n):\n\"\"\"\u65ad\u8a00\u6587\u6848\u5b58\u5728\"\"\"\npic = None\nif picture_abspath is not None:\npic = picture_abspath + \".png\"\nres = OCR.ocr(\n*args,\npicture_abspath=pic,\nsimilarity=similarity,\nreturn_first=return_first,\nlang=lang,\n)\nif res is False:\nraise AssertionError(\n(f\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{args}\", f\"{pic if pic else GlobalConfig.SCREEN_CACHE}\")\n)\nif isinstance(res, tuple):\npass\nelif isinstance(res, dict) and False in res.values():\nres = filter(lambda x: x[1] is False, res.items())\nraise AssertionError(\n(\nf\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{dict(res)}\",\nf\"{pic if pic else GlobalConfig.SCREEN_CACHE}\",\n)\n)\n \u5728\u7528\u4f8b\u4e2d\u4f7f\u7528\u65ad\u8a00\uff0c\u793a\u4f8b\uff1a def test_font_manager_021(self):\n\"\"\"\u53f3\u4fa7\u2665-\u6536\u85cf/\u53d6\u6d88\u6536\u85cf\u5b57\u4f53\"\"\"\n# \u5b57\u4f53\u7ba1\u7406\u5668\u754c\u9762\u53f3\u4fa7\u8be6\u60c5\u5217\u8868\uff0c\u9009\u62e9\u672a\u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e / \u6536\u85cf\u5b57\u4f53\n# \u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e\u83dc\u5355\u663e\u793a\u201c\u53d6\u6d88\u6536\u85cf\u201d\uff1b\n...\nself.assert_ocr_exist(\"\u53d6\u6d88\u6536\u85cf\")\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_1","title":"4\u3001\u670d\u52a1\u7aef\u90e8\u7f72","text":"\u6211\u4eec\u76ee\u524d\u662f\u5c06 OCR \u670d\u52a1\u90e8\u7f72\u5728\u666e\u901a\u7684\u529e\u516c\u673a\u4e0a\u7684\uff0c\u5982\u679c\u4f60\u89c9\u5f97\u73b0\u6709\u7684 OCR \u8bc6\u522b\u6027\u80fd\u4e0d\u591f\u597d\uff0c\u6070\u597d\u4f60\u6709\u66f4\u597d\u7684\u673a\u5668\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u5176\u79c1\u6709\u5316\u90e8\u7f72\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41_1","title":"4.1\u3001\u73af\u5883\u5b89\u88c5","text":"\u63a8\u8350\u4f7f\u7528 pipenv \u8fdb\u884c\u73af\u5883\u642d\u5efa\uff1b \u5b89\u88c5 pipenv \uff1a sudo pip3 install pipenv\n \u65b0\u5efa\u4e00\u4e2a\u76ee\u5f55\u4f5c\u4e3a\u73af\u5883\u5305 ocr_env\uff1a cd ~\nmkdir ocr_env\n \u521b\u5efa python 3.7 \u73af\u5883\uff1a cd ocr_env\npipenv --python 3.7\n \u5b89\u88c5 OCR \u4f9d\u8d56\u5305\uff1a pipenv install paddlepaddle -i https://mirror.baidu.com/pypi/simple\npipenv install \"paddleocr>=2.0.1\" -i https://mirror.baidu.com/pypi/simple\n \u4e0d\u51fa\u610f\u5916\uff0c\u8fd9\u6837\u5c31\u628a\u4f9d\u8d56\u5b89\u88c5\u597d\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42_1","title":"4.2\u3001\u542f\u52a8\u670d\u52a1","text":"\u5c06\u57fa\u7840\u6846\u67b6\u4e2d\u7684 scr/ocr/pdocr_rpc_server.py \u6587\u4ef6\u62f7\u8d1d\u5230 ocr_env \u76ee\u5f55\uff0c\u540e\u53f0\u6267\u884c\u5b83\u5c31\u597d\u4e86\uff1a cd ocr_env\nnohup pipenv run python pdocr_rpc_server.py &\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#43","title":"4.3\u3001\u914d\u7f6e\u5f00\u673a\u81ea\u542f\uff08\u901a\u7528\uff09","text":"\u4f60\u80af\u5b9a\u4e0d\u60f3\u6bcf\u6b21\u673a\u5668\u91cd\u542f\u4e4b\u540e\u90fd\u9700\u8981\u624b\u52a8\u542f\u52a8\u670d\u52a1\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u914d\u7f6e\u5f00\u673a\u81ea\u542f\u3002 \u5199\u5f00\u673a\u81ea\u542f\u670d\u52a1\u6587\u4ef6\uff1a sudo vim /lib/systemd/system/ocr.service\n autoocr \u540d\u79f0\u4f60\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff0c\u5199\u5165\u4ee5\u4e0b\u5185\u5bb9\uff1a [Unit]\nDescription=OCR Service\nAfter=multi-user.target\n\n[Service]\nUser=uos\nGroup=uos\nType=idle\nWorkingDirectory=/home/uos/ocr_env\nExecStart=pipenv run python pdocr_rpc_server.py\n\n[Install]\nWantedBy=multi-user.target\n \u6ce8\u610f\u66ff\u6362\u4f60\u7684${USER} \u4fee\u6539\u914d\u7f6e\u6587\u4ef6\u7684\u6743\u9650\uff1a sudo chmod 644 /lib/systemd/system/ocr.service\n \u81ea\u542f\u670d\u52a1\u751f\u6548\uff1a sudo systemctl daemon-reload\nsudo systemctl enable ocr.service\n \u67e5\u770b\u670d\u52a1\u72b6\u6001\uff1a sudo systemctl status ocr.service\n \u4f60\u53ef\u4ee5\u518d\u91cd\u542f\u4e0b\u7535\u8111\uff0c\u770b\u770b\u670d\u52a1\u662f\u4e0d\u662f\u6b63\u5e38\u542f\u52a8\u4e86\uff0c\u6ca1\u62a5\u9519\u5c31 OK \u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_4","title":"\u4e94\u3001\u5c5e\u6027\u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_3","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 UI \u81ea\u52a8\u5316\u5927\u591a\u90fd\u662f\u57fa\u4e8e\u6d4f\u89c8\u5668\u7684\uff0c\u6838\u5fc3\u662f\u5728\u7f51\u9875\u7684 DOM \u6811\u4e0a\u67e5\u627e\u5143\u7d20\uff0c\u5e76\u5bf9\u5176\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\uff1b Linux \u684c\u9762\u5e94\u7528\u5927\u591a\u662f\u91c7\u7528 Qt \u7f16\u5199\u7684\uff0c\u5728 Qt \u4e2d\u4e5f\u662f\u4ece\u6700\u9876\u5c42\u7684 MainWindow \u5f00\u59cb\u6784\u5efa\u5e94\u7528\uff0c\u6240\u4ee5\u903b\u8f91\u4e5f\u662f\u4e00\u6837\u7684\uff0cQt \u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u540c\u6837\u53ef\u4ee5\u901a\u8fc7 DOM \u6811\uff08\u5c5e\u6027\u6811\uff09\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff0c\u6211\u4eec\u79f0\u4e4b\u4e3a\u5c5e\u6027\u5b9a\u4f4d\u3002 \u501f\u52a9\u5f00\u6e90\u5de5\u5177 dogtail \u6211\u4eec\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u83b7\u53d6\uff0c\u4ece\u800c\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\u3002dogtail \u7684\u9879\u76ee\u4ecb\u7ecd\u53ef\u4ee5\u731b\u6233\u8fd9\u91cc\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_3","title":"2\u3001\u4f7f\u7528\u65b9\u6cd5","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#21sniff","title":"2.1\u3001sniff\uff08\u55c5\u63a2\u5668\uff09\u4f7f\u7528","text":"\u5728\u7ec8\u7aef\u8f93\u5165 sniff \u542f\u52a8 AT-SPI Browser mikigo@mikigo-PC:~$ sniff\n \u67e5\u770b\u5e94\u7528\u7684\u6807\u7b7e \u5728 sniff \u91cc\u9762\u53ef\u4ee5\u770b\u5230\u7cfb\u7edf\u4e2d\u5df2\u542f\u52a8\u7684\u5e94\u7528\uff0c\u70b9\u51fb\u5e94\u7528\u540d\u79f0\u524d\u9762\u7684\u4e09\u89d2\u5f62\u56fe\u6807\uff0c\u53ef\u4ee5\u5c55\u5f00\u5e94\u7528\u7684\u6807\u7b7e\uff0c\u6240\u6709\u6807\u7b7e\u4ee5 tree \u7684\u5f62\u5f0f\u5c55\u793a\uff0c\u5bf9\u5e94\u5e94\u7528\u91cc\u9762\u7684\u7236\u7a97\u53e3\u548c\u5b50\u7a97\u53e3\u3002 \u83b7\u53d6\u5143\u7d20\u63a7\u4ef6\u7684\u6807\u7b7e\u540d\u79f0 \u9996\u5148\uff0c\u4e3a\u4e86\u65b9\u4fbf\u67e5\u770b\u5143\u7d20\u63a7\u4ef6\u5bf9\u5e94\u7684\u4f4d\u7f6e\uff0c\u5efa\u8bae\u73b0\u5728\u4e0a\u65b9\u5de5\u5177\u680f\u70b9\u51fb Actions\uff0c\u7136\u540e\u52fe\u9009 Hightlight Items\uff0c\u8fd9\u6837\u5728 sniff \u4e2d\u9f20\u6807\u9009\u4e2d\u5143\u7d20\u6807\u7b7e\u7684\u65f6\u5019\uff0c\u5e94\u7528\u4e2d\u4f1a\u6709\u76f8\u5e94\u7684\u5149\u6807\u9501\u5b9a\u3002 \u5728 sniff \u91cc\u9762\u70b9\u51fb\u8fdb\u5165\u5e94\u7528\u7684\u6807\u7b7e tree \u4e2d\u540e\uff0c\u70b9\u51fb\u76f8\u5e94\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5728\u5de5\u5177\u4e0b\u65b9\uff0c\u4f1a\u5c55\u793a\u5143\u7d20\u63a7\u4ef6\u7684 Name\uff0c\u8fd9\u4e2a\u5c31\u662f\u6807\u7b7e\u540d\u79f0\u3002 \u5728 tree \u4e2d\u6709\u4e9b\u5730\u65b9\u662f\u7a7a\u767d\u7684\u6216\u8005\u662f Form\uff0c\u662f\u56e0\u4e3a\u5f00\u53d1\u4eba\u5458\u5728\u6dfb\u52a0\u6807\u7b7e\u7684\u65f6\u5019\u6ca1\u6709\u6dfb\u52a0\uff0c\u6216\u8005\u6709\u4e9b\u7236\u7a97\u53e3\u4e0d\u9700\u8981\u6dfb\u52a0\uff0c\u8fd9\u79cd\u5728\u5b9e\u9645\u4e1a\u52a1\u4e2d\u662f\u4e0d\u5f71\u54cd\u7684\uff0c\u6211\u4eec\u53ea\u8981\u4fdd\u8bc1\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\u4e2d\uff0c\u8981\u7528\u5230\u7684\u5143\u7d20\u90fd\u6dfb\u52a0\u4e86\u6807\u7b7e\u5373\u53ef\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#22","title":"2.2\u3001\u5143\u7d20\u64cd\u4f5c","text":"\u83b7\u53d6\u5e94\u7528\u5bf9\u8c61 dogtail \u83b7\u53d6\u5e94\u7528\u5bf9\u8c61\u7684\u65f6\u5019\uff0c\u4f7f\u7528\u7684\u662f tree \u5e93\u91cc\u9762\u7684 application() \u65b9\u6cd5\uff1a from dogtail.tree import root\napp_obj = root.application('deepin-music')\n app_obj\u5c31\u662f\u5e94\u7528\u7684\u5bf9\u8c61\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\uff0c\u662f\u5e94\u7528\u5bf9\u8c61\u4f7f\u7528child()\u65b9\u6cd5\uff1a element = app_obj.child('element_name')\n \u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u4f20\u5165\u5143\u7d20\u7684 Name\uff0c\u83b7\u53d6\u5230\u76f8\u5e94\u5143\u7d20\u7684\u5bf9\u8c61\u3002Name \u53ef\u4ee5\u901a\u8fc7 sniff \u67e5\u770b\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\u5217\u8868: element_list = element.children\n \u83b7\u53d6\u5230\u8fd9\u4e2a\u5143\u7d20\u4e0b\u9762\u6240\u6709\u7684\u5143\u7d20\u5217\u8868\u3002 \u8fd9\u4e2a\u65b9\u6cd5\u9002\u7528\u4e8e\u6709\u4e9b\u6807\u7b7e\u6ca1\u6709\u6dfb\u52a0\uff0c\u4f46\u662f\u4f4d\u7f6e\u662f\u56fa\u5b9a\u7684\uff0c\u6211\u4eec\u901a\u8fc7\u7d22\u5f15\u53ef\u4ee5\u53d6\u5f97\u5143\u7d20\u3002 element_list[0]\n \u5bf9\u5143\u7d20\u7684\u64cd\u4f5c \u5728\u83b7\u53d6\u5230\u5143\u7d20\u4e4b\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u76f8\u5e94\u7684\u64cd\u4f5c\u3002 \u5355\u51fb element.click(button=1)\n button 1 \u2014>\u5de6\u952e\uff0c2 \u2014>\u6eda\u8f6e\uff0c3 \u2014>\u53f3\u952e\uff0c\u9ed8\u8ba4\u4e3a 1 \u53cc\u51fb element.doubleClick(button=1)\n \u9f20\u6807\u60ac\u505c element.point()\n \u9f20\u6807\u79fb\u52a8\u5230\u5143\u7d20\u4e2d\u5fc3\u4f4d\u7f6e \u6587\u672c\u8f93\u5165 element.typeText(string)\n \u5411\u5143\u7d20\u5bf9\u8c61\u8f93\u5165\u5b57\u7b26\u4e32 \uff0c\u6bd4\u5982\u8f93\u5165\u6846 \u7ec4\u5408\u952e element.keyCombo(comboString)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#23","title":"2.3\u3001\u6846\u67b6\u5c01\u88c5","text":"\u4ee3\u7801\u793a\u4f8b\uff1a # \u8be6\u7ec6\u4ee3\u7801\u8bf7\u67e5\u770b src/dogtail_utils.py\nclass DogtailUtils:\ndef __init__(self, name=None, description=None):\nself.name = name\nself.description = description\nself.obj = root.application(self.name, self.description)\ndef app_element(self, *args, **kwargs):\n\"\"\"\n \u83b7\u53d6app\u5143\u7d20\u7684\u5bf9\u8c61\n :return: \u5143\u7d20\u7684\u5bf9\u8c61\n \"\"\"\nreturn self.obj.child(*args, **kwargs, retry=False)\ndef element_center(self, element) -> tuple:\n\"\"\"\n \u83b7\u53d6\u5143\u7d20\u7684\u4e2d\u5fc3\u4f4d\u7f6e\n :param element:\n :return: \u5143\u7d20\u4e2d\u5fc3\u5750\u6807\n \"\"\"\n_x, _y, _w, _h = self.app_element(element).extents\n_x = _x + _w / 2\n_y = _y + _h / 2\nreturn _x, _y\n \u6846\u67b6\u63d0\u4f9b\u7684\u63a5\u53e3\u975e\u5e38\u7b80\u6d01\uff0c\u5728\u8c03\u7528\u65f6\uff1a self.dog.element_center(\"\u64ad\u653e\")\n \u8fd9\u6837\u5c31\u80fd\u83b7\u53d6\u5230\u6b64\u5143\u7d20\u7684\u4e2d\u5fc3\u5750\u6807\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_5","title":"\u516d\u3001\u6807\u7b7e\u5316\u7ba1\u7406","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_4","title":"1\u3001\u6807\u7b7e\u8bf4\u660e","text":"\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u811a\u672c ID\uff1a\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c/\u51fd\u6570 ID\uff1b PMS\u7528\u4f8bID\uff1aPMS \u4e0a\u5bf9\u5e94\u7684\u7528\u4f8b ID\uff08\u7528\u4f8b\u5e93 ID\uff09\uff1b \u9ed8\u8ba4\u4f7f\u7528\u7528\u4f8b\u5e93 ID\uff0c\u5bf9\u4e8e\u6682\u65f6\u6ca1\u6709\u4f7f\u7528\u7528\u4f8b\u5e93\u7ba1\u7406\u7528\u4f8b\u7684\u9879\u76ee\uff0c\u53ef\u4ee5\u4f7f\u7528\u4ea7\u54c1\u5e93\u7528\u4f8b ID\uff1b \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1aFUNC\uff08\u529f\u80fd\uff09\u3001PERF\uff08\u6027\u80fd\uff09\u3001STR\uff08\u538b\u529b\uff09\u3001SEC\uff08\u5b89\u5168\uff09\u3001CTS\uff08\u517c\u5bb9\u6027\uff09\u3001API\uff08\u63a5\u53e3\uff09\u3001BASELINE\uff08\u57fa\u7ebf-\u9884\u7559\uff09 \u8bbe\u5907\u7c7b\u578b\uff1aPPL\uff08\u4f9d\u8d56\u5916\u8bbe\u7684\u7528\u4f8b\uff09\u3001COL\uff08\u4f9d\u8d56\u4e3b\u63a7\u673a\u7684\u7528\u4f8b\uff09 \u7528\u4f8b\u6765\u6e90\uff1aBUG\uff08\u7531 Bug \u8f6c\u7684\u7528\u4f8b\uff09 \u4e0a\u7ebf\u5bf9\u8c61\uff1aCICD\uff0c\u8868\u793a\u4e0a\u7ebf\u5230 CICD \u6d41\u6c34\u7ebf\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u53ef\u4e00\u952e\u751f\u6210 case_list.csv \u6587\u4ef6\uff0c\u7528\u4e8e\u5bfc\u5165\u5230\u660e\u9053\u4e91 AT \u7528\u4f8b\u5217\u8868\u4e2d\u63a7\u5236 CICD \u8dd1\u6d4b\u8303\u56f4\uff1b \u6d4b\u8bd5\u7ea7\u522b\uff1aC1 / C2 / C3 / C4\uff0c\u5177\u4f53\u5b9a\u4e49\u53c2\u8003\u6d41\u6c34\u7ebf\u4f7f\u7528\u6307\u5bfc\uff1b \u8df3\u8fc7\u539f\u56e0\uff1askip-XXX\uff0c\u7528\u4e8e\u63a7\u5236\u7528\u4f8b\u662f\u5426\u6267\u884c\uff1b \u786e\u8ba4\u4fee\u590d\uff1afixed-XXX\uff0c\u7528\u4e8e\u6807\u8bb0\u7528\u4f8b\u7684\u4fee\u590d\u72b6\u6001\uff08\u540e\u9762\u8be6\u7ec6\u8bb2\u89e3\u7528\u6cd5\uff09\uff1b \u5e9f\u5f03\u7528\u4f8b\uff1aremoved-\u5df2\u5e9f\u5f03\uff0c\u7528\u4e8e\u6807\u8bb0\u5df2\u7ecf\u5e9f\u5f03\u7684\u7528\u4f8b\uff0c\u6b64\u7528\u4f8b\u6807\u7b7e\u4e0d\u4f1a\u88ab\u6dfb\u52a0\uff0c\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff1b \u793a\u4f8b\uff1a \u811a\u672cID PMS\u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u8bbe\u5907\u7c7b\u578b \u7528\u4f8b\u6765\u6e90 \u4e0a\u7ebf\u5bf9\u8c61 \u6d4b\u8bd5\u7ea7\u522b \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b ... 679537 679537 L1 FUNC PPL CICD C1 skip-XXX fixed-XXX removed-\u5df2\u5e9f\u5f03 ..."},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_4","title":"2\u3001\u64cd\u4f5c\u6b65\u9aa4","text":"2.1\u3001\u5728\u5b50\u9879\u76ee\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u4ee5\u7528\u4f8b\u7684 py \u6587\u4ef6\u9664\u53bb\u9996\u5b57\u7b26\u4e32 \"test_\" \u548c\u7528\u4f8b\u5e8f\u53f7\u540e\u7684\u5b57\u7b26\u4e32\u4f5c\u4e3a csv \u7684\u6587\u4ef6\u540d\u3002 \u4f8b\u5982: \u76f8\u518c\u7684\u7528\u4f8b\u6587\u4ef6\u4e3a test_album_xxx.py\uff0cxxx \u8868\u793a\u7528\u4f8b\u7684ID\uff08\u4e5f\u53ef\u4ee5\u662f\u81ea\u5b9a\u4e49\u7684\u6570\u5b57\u4ee3\u8868\u7528\u4f8b\u5e8f\u53f7\uff09\uff0c\u6b64\u65f6 csv \u6587\u4ef6\u540d\u5c31\u5e94\u4e3a album.csv\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u6240\u6709 csv \u6587\u4ef6\u5efa\u8bae\u653e\u5728\u4e00\u4e2a tags \u76ee\u5f55\u4e0b\u3002 \u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 2.2\u3001\u7b2c\u4e00\u5217\u4e3a\u811a\u672c ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b\u7528\u4f8b\u6807\u7b7e\u53ef\u4ee5\u65e0\u5e8f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_2","title":"3\u3001\u589e\u52a0\u8bf4\u660e","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_1","title":"3.1\u3001\u8df3\u8fc7\u7528\u4f8b","text":"\u4f20\u7edf\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668(@pytest.mark.skip)\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a; \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#311","title":"3.1.1\u3001\u56fa\u5b9a\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 679537 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u7b7e\u5f00\u5934\u4e3a \u201cskip-XXX\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\uff0c\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\u5219\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u7b7e\u4e3a SKIPED\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#312","title":"3.1.2\u3001\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skipif_platform-aarch64&mips64 \u67d0\u4e9b\u7528\u4f8b\u4f1a\u56e0\u4e3a\u4e0d\u540c\u7684\u73af\u5883\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\uff0c\u5e38\u89c1\u7684\u573a\u666f\u4e3a\u5728\u4e0d\u540c\u67b6\u6784\u4e0a\u5224\u65ad\u662f\u5426\u6267\u884c\uff0c\u8df3\u8fc7\u7684\u539f\u56e0\u6807\u7b7e\u4e3a \u201cskipif_platform-\u201d \u52a0\u67b6\u6784\u540d\uff0c\u591a\u4e2a\u67b6\u6784\u4e4b\u95f4\u4f7f\u7528 \u201c&\u201d \u62fc\u63a5\uff1b \u4ee5\u4e0a\u4f8b\u5b50\u4e3a\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u5224\u65ad\u5f53\u524d\u67b6\u6784\u662f\u5426\u4e3a arrch64 \u6216\u8005 mips64\uff0c\u82e5\u662f\uff0c\u5219\u8df3\u8fc7\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u82e5\u5426\u5219\u6267\u884c\u7528\u4f8b\uff1b \u76ee\u524d\u6846\u67b6\u9ed8\u8ba4\u4ec5\u652f\u6301\u67b6\u6784\u7684\u6761\u4ef6\u5224\u65ad\uff0c\u4f46\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u903b\u8f91\u652f\u6301\u81ea\u5b9a\u4e49\u6dfb\u52a0\u3002 \u5728\u9879\u76ee\u76ee\u5f55\u8def\u5f84\u4e0b\u5b58\u5728\u6587\u4ef6 setting/skipif.py\uff0c\u6240\u6709\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u7684\u51fd\u6570\u5199\u5728\u6b64\u6587\u4ef6\u4e2d\u3002 \u9ed8\u8ba4\u67b6\u6784\u5224\u65ad\u4f8b\u5b50\uff1a def skipif_platform(args: str):\n\"\"\"\u5e73\u53f0\u8df3\u8fc7\"\"\"\n_skip_key = args.split(\"&\")\nfor key in _skip_key:\nif GlobalConfig.SYS_ARCH == key:\nreturn True\nreturn False\n \u65b9\u6cd5\u7f16\u5199\u89c4\u8303\uff1a \u65b9\u6cd5\u540d\u5fc5\u987b\u4ee5 skipif \u5f00\u5934\uff1b \u65b9\u6cd5\u5fc5\u987b\u6709\u8fd4\u56de\u7ed3\u679c\u5e76\u4e14\u4e3a\u5e03\u5c14\u503c\uff08True \u4ee3\u8868\u8df3\u8fc7\uff0cFalse \u4ee3\u8868\u4e0d\u8df3\u8fc7\uff09\uff1b \u65b9\u6cd5\u53ea\u80fd\u6709\u4e00\u4e2a\u5165\u53c2\uff1b \u5728 csv \u6587\u4ef6\u8df3\u8fc7\u539f\u56e0\u4e00\u680f\u4e2d\u586b\u5199\u4e3a \u201c{\u51fd\u6570\u540d}-{\u53c2\u6570}\u201d\uff0c\u4f8b\u5982\uff1askipif_platform-aarch64\uff1b\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u4f1a\u4ee5\u7b2c\u4e00\u4e2a \u201c-\u201d \u8fdb\u884c\u5206\u5272\uff0c\u622a\u53d6\u7684\u5de6\u4fa7\u5b57\u7b26\u4e32\u4f5c\u4e3a\u51fd\u6570\u540d\uff0c\u5728 skipif.py \u6587\u4ef6\u4e2d\u67e5\u627e\u662f\u5426\u6709\u540c\u540d\u51fd\u6570\uff0c\u5e76\u5c06\u622a\u53d6\u7684\u53f3\u4fa7\u4f5c\u4e3a\u53c2\u6570\u4f20\u9012\u7ed9\u8be5\u51fd\u6570\uff0c\u901a\u8fc7\u83b7\u53d6\u8be5\u51fd\u6570\u8fd4\u56de\u7684\u5e03\u5c14\u503c\uff0c\u8fd4\u56de True\uff0c\u5219\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u8fd4\u56de False\uff0c\u5219\u6267\u884c\u8be5\u7528\u4f8b\u3002 \u82e5\u51fd\u6570\u9700\u8981\u591a\u4e2a\u53c2\u6570\uff0c\u53ef\u81ea\u5b9a\u4e49\u591a\u4e2a\u53c2\u6570\u4e4b\u95f4\u7684\u8fde\u63a5\u7b26\uff0c\u8fde\u63a5\u7b26\u53f7\u4e0d\u53ef\u4f7f\u7528\u4e0b\u5212\u7ebf\u548c\u9017\u53f7\uff0c\u63a8\u8350\u7edf\u4e00\u4f7f\u7528 & \u7b26\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32","title":"3.2\u3001\u786e\u8ba4\u4fee\u590d","text":"\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7528\u4f8b\u4fee\u590d\u540e\uff0c\u4f46\u4e0d\u80fd\u7acb\u5373\u5220\u9664\u8df3\u8fc7\u539f\u56e0\uff08skip-XXX\uff09\u7684\u7528\u4f8b\uff0c\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u786e\u8ba4\u4fee\u590d\u201d\uff0c\u4f5c\u4e3a\u6807\u8bb0\u8be5\u7528\u4f8b\u662f\u5426\u5df2\u7ecf\u4fee\u590d\uff0c\u56fa\u5b9a\u586b\u5165\u5b57\u6bb5\u4e3a \u201cfixed-\u5df2\u4fee\u590d\u201d\u3002\u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u5373\u4f7f\u540c\u65f6\u6807\u8bb0\u4e86 skip-XXX \u4e5f\u4f1a\u6b63\u5e38\u6267\u884c\u3002 \u793a\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d 679537 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d \u3010\u540c\u65f6\u6807\u8bb0\u4e86skip \u548c fixed\uff0c\u4f46\u4ecd\u7136\u60f3\u8981\u8df3\u8fc7\u7528\u4f8b\u3011 \u5f53 \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u540c\u65f6\u586b\u5165\u540e\uff0c\u547d\u4ee4\u884c\u4f20\u9012\u53c2\u6570 --ifixed yes\uff0c\u5219\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\u8be5\u6761\u7528\u4f8b\u3002 python3 manage.py run --ifixed yes\n \u770b\u5230\u8fd9\u91cc\u6709\u4e9b\u540c\u5b66\u53ef\u80fd\u8981\u95ee\u4e86\uff0c\u6211\u60f3\u6062\u590d\u8df3\u8fc7\u6267\u884c\uff0c\u76f4\u63a5\u628a skip-XXX \u8fd9\u4e00\u5217\u6807\u7b7e\u5220\u6389\u4e0d\u5c31\u597d\u4e86\uff0c\u8fd8\u641e\u4ec0\u4e48\u786e\u8ba4\u4fee\u590d\u5e72\u5565\uff1f \u8fd9\u91cc\u7ed9\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u89e3\u91ca\u4e00\u4e0b\uff1a \uff08\u4ee5\u4e0b\u6d41\u6c34\u7ebf\u6307\u7684\u662f\u6bcf\u65e5\u6784\u5efa\u7684\u6d41\u6c34\u7ebf\uff0c\u8dd1 AT \u7684\u5168\u91cf\u7528\u4f8b\uff09 \u9996\u5148\uff0c\u6d41\u6c34\u7ebf\u4e0a\u8dd1\u7684\u662f AT \u5386\u53f2 Tag\uff0c\u8df3\u8fc7\u7528\u4f8b\u7684\u6807\u7b7e(skip-XXX) \u662f\u5728\u6700\u65b0\u7684\u4ee3\u7801\u4e0a\u63d0\u4ea4\u7684\uff0c\u6211\u4eec\u91c7\u7528\u6700\u65b0\u7684 csv \u6587\u4ef6\u8986\u76d6\u5386\u53f2 csv \u6587\u4ef6\u7684\u8bbe\u8ba1\u6765\u5b9e\u73b0\u4e86\u5bf9\u5386\u53f2 Tag \u4e0a\u7528\u4f8b\u7684\u8df3\u8fc7\uff1b \u7136\u540e\uff0c\u5728\u65e5\u5e38\u8df3\u8fc7\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u540c\u65f6\u4e5f\u5728\u4fee\u590d\u4e00\u4e9b\u7528\u4f8b\uff0c\u4fee\u590d\u540e\u7684\u8fd9\u4e9b\u7528\u4f8b\u5728\u672c\u5730\u8c03\u8bd5\u7684\u65f6\u5019\u6211\u4eec\u4e0d\u5e0c\u671b\u7ee7\u7eed\u8df3\u8fc7\uff0c\u4f46\u662f\u6b64\u65f6\uff0c\u4fee\u590d\u7684\u8fd9\u4e9b\u7528\u4f8b\u53ef\u80fd\u8fd8\u4e0d\u7a33\u5b9a\uff0c\u4e0d\u9002\u5408\u9a6c\u4e0a\u653e\u5230\u6d41\u6c34\u7ebf\u53bb\u8dd1\uff0c\u4e5f\u5c31\u662f\u8bf4\u6d41\u6c34\u7ebf\u4e0a\u6211\u4eec\u662f\u5e0c\u671b\u4ed6\u7ee7\u7eed\u8df3\u8fc7\u7684\uff0c\u56e0\u6b64\uff0c\u54b1\u4e0d\u80fd\u76f4\u63a5\u628a skip-XXX \u5e72\u6389\uff1b \u8fd9\u91cc\u5c31\u77db\u76fe\u4e86\uff0c\u4e00\u4e2a\u9700\u6c42\u662f\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u53e6\u4e00\u4e2a\u9700\u6c42\u53c8\u4e0d\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u600e\u4e48\u529e\u5462\uff1f \u6211\u4eec\u4f7f\u7528\u201c\u786e\u8ba4\u4fee\u590d\u201d\u6765\u6807\u8bb0\u8fd9\u6761\u7528\u4f8b\u5df2\u7ecf\u4fee\u590d\u4e86\uff0c\u8fd9\u6837\u4f60\u672c\u5730\u8c03\u8bd5\u7528\u4f8b\u7684\u65f6\u5019\u8fd9\u6761\u5df2\u4fee\u590d\u7684\u7528\u4f8b\u662f\u4f1a\u6267\u884c\u7684\uff0c\u540c\u65f6\u5728\u6d41\u6c34\u7ebf\u4e0a\u5c06 --ifixed yes \u53c2\u6570\u52a0\u4e0a\uff0c\u90a3\u4e48\u6d41\u6c34\u7ebf\u4e0a\u6267\u884c\u65f6\u8fd9\u6761\u7528\u4f8b\u4ecd\u7136\u662f\u8df3\u8fc7\u7684\u72b6\u6001\uff0c\u540e\u7eed\u4f60\u6253 Tag \u7684\u65f6\u5019\uff0c\u628a \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u7684\u6807\u7b7e\u5168\u90e8\u5220\u6389\u5c31\u53ef\u4ee5\u4e86\u3002 \u8fd9\u5c31\u662f\u201c\u786e\u8ba4\u4fee\u590d\u201d\u8fd9\u4e2a\u6807\u7b7e\u7684\u80cc\u666f\uff0c\u9700\u8981\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u54c1\u4e00\u54c1\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#33","title":"3.3\u3001\u5e9f\u5f03\u7528\u4f8b","text":"\u9488\u5bf9\u67d0\u4e9b\u7528\u4f8b\uff0c\u7531\u4e8e\u9700\u6c42\u53d8\u66f4\uff0c\u73af\u5883\u5f71\u54cd\u6216\u8bc4\u4f30\u4e0d\u518d\u9002\u7528\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u65f6\uff0c\u7528\u4f8b\u9700\u8981\u5e9f\u5f03\uff0c\u5219\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u5e9f\u5f03\u7528\u4f8b\u201d\uff0c\u8be5\u5217\u5b58\u5728 \u201cremoved-{\u5e9f\u5f03\u539f\u56e0}\u201d\uff0c\u5219\u7528\u4f8b\u4e0d\u4f1a\u6267\u884c\u3002 \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d removed-\u5df2\u5e9f\u5f03 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_2","title":"4\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u4e0a\u9762\u4ecb\u7ecd Pytest \u6846\u67b6\u63d0\u4f9b\u7684\u6807\u7b7e\u529f\u80fd mark\uff0c\u4f7f\u7528\u65f6\u9700\u8981\u4e3a\u6bcf\u4e00\u4e2a\u7528\u4f8b\u6dfb\u52a0\u6807\u7b7e\u88c5\u9970\u5668\uff0c\u5219\u64cd\u4f5c\u590d\u6742\uff0c\u53ef\u7ef4\u62a4\u6027\u5dee\uff0c\u5176\u6839\u672c\u95ee\u9898\u5c31\u662f\u6807\u7b7e\u5206\u6563\u5728\u6bcf\u4e00\u6761\u7528\u4f8b\u7684\u88c5\u9970\u5668\u4e0a\uff0c\u96be\u4ee5\u96c6\u4e2d\u7ef4\u62a4\uff1b\u4e8e\u662f\u4e4e\u5c06\u6240\u6709\u6807\u7b7e\u4f7f\u7528 csv \u6587\u4ef6\u8fdb\u884c\u96c6\u4e2d\u7ba1\u7406\uff0c\u5e76\u901a\u8fc7 Pytest \u7684\u94a9\u5b50\u51fd\u6570\uff0c\u8bfb\u53d6 csv \u6587\u4ef6\uff0c\u52a8\u6001\u6dfb\u52a0\u6807\u7b7e\u5230\u7528\u4e2d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5csv","title":"5\u3001CSV\u6587\u4ef6\u683c\u5f0f","text":"\u6b64\u914d\u7f6e\u6587\u4ef6\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u6807\u7b7e\u6570\u636e\uff0c\u4e14\u8981\u65b9\u4fbf\u80fd\u4f7f\u7528 Excel \u6253\u5f00\u8fdb\u884c\u7f16\u8f91\u67e5\u770b\uff0c\u66f4\u91cd\u8981\u7684\u662f\u6211\u4eec\u4e0d\u60f3\u5f15\u5165\u4e09\u65b9\u4f9d\u8d56\uff0cCSV \u6587\u4ef6\u51e0\u4e4e\u662f\u552f\u4e00\u80fd\u6ee1\u8db3\u6240\u6709\u7684\u8981\u6c42\u7684\u6587\u4ef6\u683c\u5f0f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_6","title":"\u4e03\u3001\u65e5\u5fd7\u7cfb\u7edf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_5","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e YouQu \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u64cd\u4f5c\u65b9\u6cd5\u5c01\u88c5\u5199\u6cd5\uff0c\u901a\u5e38\u662f\u8fd9\u6837\u7684\uff1a\u7c7b\u91cc\u9762\u4e00\u4e2a\u51fd\u6570\u53ea\u5305\u542b\u4e00\u4e2a\u64cd\u4f5c\u6216\u591a\u6b21\u8c03\u7528\u7684\u4e00\u7cfb\u5217\u53ef\u5408\u5e76\u7684\u64cd\u4f5c\uff1b \u4f20\u7edf\u7684\u65e5\u5fd7\u8f93\u51fa\u65b9\u5f0f\uff0c\u9700\u8981\u5728\u6bcf\u4e2a\u51fd\u6570\u91cc\u9762\u4e3b\u52a8\u7f16\u5199\u65e5\u5fd7\u8f93\u51fa\u4ee3\u7801 \uff0c\u4f8b\u5982\uff1a class XXXWidget:\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\nlogger.info(\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\")\n...\n# \u7701\u7565\u4ee3\u7801\u90e8\u5206\n \u4e00\u4e2a\u51fd\u6570\u91cc\u9762\u81f3\u5c11\u5305\u542b\u4e00\u6761\u65e5\u5fd7\u4fe1\u606f\uff0c\u5982\u679c\u6bd4\u8f83\u590d\u6742\u64cd\u4f5c\u6b65\u9aa4\uff0c\u53ef\u80fd\u5305\u542b\u591a\u6761\u65e5\u5fd7\u4fe1\u606f\uff1b \u4e00\u4e2a\u5e94\u7528\u542b\u6709\u5927\u91cf\u7684\u64cd\u4f5c\u51fd\u6570\uff0c\u4e5f\u5c31\u662f\u8bf4\u6211\u4eec\u9700\u8981\u5199\u5927\u91cf\u7684\u65e5\u5fd7\u4ee3\u7801\uff1b \u901a\u8fc7\u7ecf\u9a8c\u89c2\u5bdf\uff0c\u6211\u4eec\u53d1\u73b0\uff0c\u51fd\u6570\u8bf4\u660e\u4ee5\u53ca\u51fd\u6570\u64cd\u4f5c\u65e5\u5fd7\uff0c\u5177\u6709\u8f83\u9ad8\u7684\u91cd\u590d\u5ea6\uff08\u4ece\u4e0a\u9762\u7684\u4f8b\u5b50\u4e5f\u53ef\u4ee5\u770b\u51fa\u6765\uff09\uff0c\u56e0\u6b64\u6211\u4eec\u5927\u80c6\u7684\u8bbe\u60f3\uff0c\u80fd\u4e0d\u80fd\u57fa\u4e8e\u6846\u67b6\u6267\u884c\u65f6\uff0c\u81ea\u52a8\u7684\u5c06\u51fd\u6570\u8bf4\u660e\u4f5c\u4e3a\u65e5\u5fd7\u6253\u5370\u51fa\u6765\uff0c\u4ece\u800c\u51cf\u5c11\u5927\u91cf\u65e5\u5fd7\u4ee3\u7801\u91cf\u548c\u91cd\u590d\u7f16\u5199\uff0c\u90a3\u771f\u662f\u5999\u554a~\u3002 \u57fa\u4e8e\u6b64\u201c\u5929\u771f\u201d\u7684\u60f3\u6cd5\uff0c\u6211\u4eec\u8bbe\u8ba1\u51fa\u4e86 youqu \u7684\u65e5\u5fd7\u7cfb\u7edf\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_5","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u6838\u5fc3\u539f\u7406\uff1a \u901a\u8fc7\u7ed9\u7c7b\u52a0\u4e0a\u4e00\u4e2a\u88c5\u9970\u5668 @log\uff0c\u52a8\u6001\u7ed9\u8be5\u7c7b\u4e0b\u6240\u6709\u7684\u51fd\u6570\u53ca\u7236\u7c7b\u51fd\u6570\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668 @_trace\uff0c\u5728\u6b64\u88c5\u9970\u5668\u4e2d\u6211\u4eec\u80fd\u52a8\u6001\u7684\u6355\u83b7\u6240\u8c03\u7528\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff08func.__doc__\uff09\uff0c\u901a\u8fc7\u65e5\u5fd7\u8f93\u51fa\u5668\u5c06\u5176\u8f93\u51fa\u5373\u53ef\u3002 \u5b9e\u73b0\u6b65\u9aa4\uff1a \u901a\u8fc7 inspect.getmembers \u83b7\u53d6\u88ab\u88c5\u9970\u7684\u7c7b\u4e0b\u6240\u6709\u51fd\u6570\uff0c\u5305\u542b\u9759\u6001\u65b9\u6cd5\uff0c\u7c7b\u65b9\u6cd5\uff0c\u5b9e\u4f8b\u65b9\u6cd5\uff1b \u901a\u8fc7 setattr(\u7c7b, \u65b9\u6cd5, _trace\uff09 \u7684\u65b9\u5f0f\uff0c\u7ed9\u7b26\u5408\u6761\u4ef6\u7684\u51fd\u6570\uff0c\u52a8\u6001\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_3","title":"3\u3001\u65e5\u5fd7\u914d\u7f6e","text":"[log_cli]\n;\u65e5\u5fd7\u76f8\u5173\u914d\u7f6e\uff08\u4e0d\u6253\u5370\u6784\u9020\u51fd\u6570\u548c\u9b54\u6cd5\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff09\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = INFO\n# ============= \u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u914d\u7f6e ================\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u5f00\u5934\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7, \u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_STARTSWITH = Assert\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u7ed3\u5c3e\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_ENDSWITH = Widget\n;\u652f\u6301\u7c7b\u540d\u5305\u542b xxx \u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_CONTAIN = ShortCut\n# ==============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_3","title":"4\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u5728\u5e94\u7528\u5e93 widget \u65b9\u6cd5\u5e93\u91cc\u9762\uff0c\u53ea\u9700\u8981\u5728\u51fa\u53e3\u6587\u4ef6\u52a0\u4e0a\u7c7b\u88c5\u9970\u5668\uff0c\u5c31\u53ef\u4ee5\u5b9e\u73b0\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u4e86\uff1b # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6ce8\u610f\uff0c\u662f\u7c7b\u88c5\u9970\u5668\u3002 \u5b9e\u4f8b\uff1a # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\n@classmethod\ndef find_dfm_image(cls, *elements, multiple=False, rate=0.9):\n\"\"\"\n \u67e5\u627e\u56fe\u7247 {{elements}}.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e {{rate}} \u7684\u5750\u6807\n :param elements:\n :param multiple:\n :return:\n \"\"\"\nelement = tuple(map(lambda x: f\"{Config.PIC_RES_PATH}/{x}\", elements))\nreturn cls.find_image(*element, multiple=multiple)\n \u8c03\u7528\u65b9\u6cd5\u65f6\uff1a DfmWidget.find_dfm_image(\"dfm_001\")\n \u81ea\u52a8\u8f93\u51fa\u7684\u65e5\u5fd7\uff1a >> x86_64-uos-6: 02/28 17:48:47 | INFO | logger_utils: [find_dfm_image]: \u67e5\u627e\u56fe\u7247 dfm_001.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e 0.9 \u7684\u5750\u6807\n \u52a0\u4e0a\u88c5\u9970\u5668 @log \u4e4b\u540e\uff0c\u65b9\u6cd5\u5c42\u6240\u6709\u7684\u51fd\u6570\uff08\u5305\u62ec\u5b9e\u4f8b\u65b9\u6cd5\u3001\u7c7b\u65b9\u6cd5\u3001\u9759\u6001\u65b9\u6cd5\uff09\u90fd\u4e0d\u9700\u8981\u518d\u5199\u65e5\u5fd7\u4ee3\u7801\uff0c\u6267\u884c\u7684\u65f6\u5019\u4f1a\u81ea\u52a8\u8f93\u51fa\uff0c\u5e76\u4e14\u6240\u6709\u8c03\u7528\u7684\u65b9\u6cd5\u4f1a\u4ee5 allure.step \u7684\u65b9\u5f0f\uff0c\u5c55\u793a\u5728 allure \u62a5\u544a\u4e2d\uff0c\u5728\u62a5\u544a\u4e2d\u66f4\u80fd\u4e00\u76ee\u4e86\u7136\u7684\u770b\u5230\u7528\u4f8b\u6267\u884c\u6b65\u9aa4\u3002 \u3010\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\u3011 \u901a\u8fc7\u89c2\u5bdf\u524d\u9762\u7684\u4f8b\u5b50\uff0c\u7ec6\u5fc3\u7684\u540c\u5b66\u53ef\u80fd\u8fd8\u53d1\u73b0\u4e86\u4e00\u4e2a\u5c0f\u7ec6\u8282\uff1a\u51fd\u6570\u529f\u80fd\u8bf4\u660e\u4e2d\uff0c\u4e24\u5bf9\u5927\u62ec\u53f7\u4e2d\u7684\u5185\u5bb9 {{elements}} \u4f5c\u4e3a\u53d8\u91cf\u8f93\u51fa\u51fa\u6765\u4e86\uff1b \u6ca1\u9519\uff0c\u8fd9\u5c31\u662f\u6211\u4eec\u53c2\u8003Django \u548c jinja2 \u7684\u6a21\u677f\u8bed\u6cd5\u8bbe\u8ba1\u51fa\u7684\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\uff0c\u4f7f\u7528\u65b9\u6cd5\u5f88\u7b80\u5355\uff0c\u7528\u4e24\u5bf9\u5927\u62ec\u53f7\u628a\u51fd\u6570\u7684\u53c2\u6570\u62ec\u8d77\u6765\uff0c\u8fd9\u6837\u5728\u65e5\u5fd7\u8f93\u51fa\u7684\u65f6\u5019\u5c31\u80fd\u628a\u8c03\u7528\u51fd\u6570\u65f6\u53c2\u6570\u7684\u503c\u8f93\u51fa\u51fa\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_7","title":"\u516b\u3001\u73af\u5883\u90e8\u7f72","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_6","title":"1\u3001\u539f\u5219","text":"YouQu \u7684\u73af\u5883\u4f9d\u8d56\u4e00\u76f4\u575a\u6301 2 \u4e2a\u539f\u5219\uff1a \u6700\u5c0f\u73af\u5883\u4f9d\u8d56\u539f\u5219 \u6709\u4e9b\u540c\u5b66\u5199\u4e00\u4e9b\u529f\u80fd\uff0c\u9996\u5148\u60f3\u5230\u7684\u5c31\u662f\u53bb\u641c\u7d22\u5f15\u64ce\u641c\u4e00\u4e0b\uff0c\u770b\u6709\u6ca1\u6709\u73b0\u6210\u7684\u5de5\u5177\u6216\u8005\u4ee3\u7801\u76f4\u63a5\u80fd\u7528\uff0c\u7f8e\u5176\u540d\u66f0\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\uff0c\u522b\u4eba\u5df2\u7ecf\u9020\u597d\u4e86\u8f6e\u5b50\u54b1\u4eec\u5c31\u4e0d\u8981\u91cd\u590d\u53bb\u9020\u4e86\uff0c\u7136\u540e\u4e00\u5207\u4f3c\u4e4e\u90fd\u53d8\u5f97\u90a3\u4e48\u7684\u7406\u6240\u5e94\u5f53\u3002 \u5f53\u7136\u8fd9\u6837\u505a\u65e0\u53ef\u539a\u975e\uff0c\u6211\u76f8\u4fe1\u6709\u8fd9\u6837\u60f3\u6cd5\u5e76\u4e14\u4e00\u76f4\u8df5\u884c\u8fd9\u6837\u505a\u6cd5\u7684\u540c\u5b66\u4e0d\u5728\u5c11\u6570\uff0c\u4f46\u8fd9\u6837\u505a\u6709\u4e00\u4e2a\u5f88\u4e25\u91cd\u7684\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f60\u5199\u4e00\u4e2a\u5927\u578b\u9879\u76ee\u65f6\uff0c\u4f60\u4f1a\u5f15\u5165\u975e\u5e38\u975e\u5e38\u975e\u5e38\u591a\u7684\u4f9d\u8d56\uff0c\u6bd4\u5982\u8981\u505a\u4e2a\u63a5\u53e3\u8bf7\u6c42\u8981\u7528 requests\u3001\u8bfb\u5199\u4e2a\u6570\u636e\u7528 pandas\u3001\u5199\u4e2a\u8868\u683c\u7528 pyopenxl\u3001\u89e3\u6790\u4e2a\u6587\u672c\u8981\u7528\u8fd9\u4e2a\u90a3\u4e2a\u4e09\u65b9\u5e93 ... \u3002 \u6211\u8ba4\u4e3a\u8fd9\u662f\u975e\u5e38\u4e0d\u597d\u7684\u4e60\u60ef\uff0c\u5728\u5b9e\u73b0\u4e00\u4e2a\u529f\u80fd\u7684\u65f6\u5019\uff0c\u9996\u5148\u6211\u4eec\u5e94\u8be5\u53bb\u60f3\u81ea\u5df1\u600e\u4e48\u6837\u53bb\u5b9e\u73b0\uff0c\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff1b \u5982\u679c\u4f60\u4e0d\u4f1a\uff0c\u4f60\u53ef\u4ee5\u53bb\u5b66\u4e60\u4e09\u65b9\u5e93\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u522b\u4eba\u4e09\u65b9\u5e93\u4e5f\u662f\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\u7684\uff0c\u4e3a\u4ec0\u4e48\u54b1\u4eec\u4e0d\u884c\u5462\uff1b\u5982\u679c\u522b\u4eba\u7684\u4f60\u5b9e\u5728\u662f\u770b\u4e0d\u61c2\uff0c\u60f3\u5c3d\u4e00\u5207\u529e\u6cd5\u786e\u5b9e\u505a\u4e0d\u51fa\u6765\uff0c\u90a3\u518d\u8003\u8651\u5f15\u5165\u8fd9\u4e2a\u4e09\u65b9\u5e93\uff0c\u6211\u8ba4\u4e3a\u8fd9\u6837\u662f\u6ca1\u95ee\u9898\u7684\uff0c\u6bd5\u7adf\u54b1\u4eec\u6bb5\u4f4d\u8fd8\u4e0d\u591f\uff0c\u4f46\u5e0c\u671b\u5c06\u6765\u6709\u4e00\u5929\u6211\u4eec\u53ef\u4ee5\u3002 \u8fd9\u6837\u7684\u505a\u6cd5\u624d\u5e94\u8be5\u662f\u201c\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\u201d\u6b63\u786e\u7684\u64cd\u4f5c\u3002\u4e0d\u4f1a\u6ca1\u5173\u7cfb\uff0c\u770b\u770b\u522b\u4eba\u662f\u600e\u4e48\u5b9e\u73b0\u7684\uff0c\u81ea\u5df1\u518d\u6478\u7d22\u7740\u5199\u51fa\u6765\uff0c\u8fd9\u6837\u81ea\u5df1\u624d\u80fd\u6709\u6240\u63d0\u9ad8\uff0c\u4e0d\u7136\u4f60\u5c31\u53ea\u4f1a\u7528\u522b\u4eba\u7684\u4e1c\u897f\uff1b\u90a3\u4e9b\u5632\u7b11\u3001\u6279\u8bc4\u6211\u4eec\u91cd\u590d\u9020\u8f6e\u5b50\u7684\u4eba\uff0c\u5148\u60f3\u60f3\u81ea\u5df1\u4f1a\u9020\u8f6e\u5b50\u5417\u3002 \u672c\u7740\u81ea\u5df1\u5b9e\u73b0\u80fd\u5b9e\u73b0\u7684\u4e00\u5207\u7684\u539f\u5219\uff0cYouQu \u6846\u67b6\u505a\u5230\u4e86\u975e\u5e38\u5c11\u7684\u73af\u5883\u4f9d\u8d56\uff0c\u800c\u4e14\u6211\u4eec\u4ecd\u5728\u4e0d\u65ad\u52aa\u529b\uff0c\u51cf\u5c11\u73af\u5883\u90e8\u7f72\u7684\u4f9d\u8d56\u3002 \u6700\u5c0f\u4ed3\u5e93\u4f53\u79ef\u539f\u5219 \u5927\u6587\u4ef6\u4e0d\u80fd\u4e0a\u4f20\u5230\u5de5\u7a0b\u91cc\u9762\uff0c\u4fdd\u6301\u6574\u4e2a\u5de5\u7a0b\u7684\u8f7b\u91cf\u5316\uff0c\u8fd9\u6837\u5728\u514b\u9686\u4ee3\u7801\u7684\u65f6\u5019\u624d\u80fd\u975e\u5e38\u5feb\u901f\u65b9\u4fbf\u4f7f\u7528\uff0c\u6211\u4eec\u89c1\u8fc7\u4e00\u4e2a AT \u5de5\u7a0b clone \u5927\u5c0f\u8fbe\u5230\u597d\u51e0\u4e2a G\uff0c\u7b80\u76f4\u4e0d\u53ef\u601d\u8bae\u3002 \u5176\u5b9e\u4ee3\u7801\u6587\u4ef6\u7684\u5927\u5c0f\u662f\u5f88\u5c0f\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u7eaf\u5199\u4ee3\u7801\u968f\u4fbf\u5199\u5de5\u7a0b\u4e5f\u4e0d\u4f1a\u592a\u5927\uff0c\u800c\u6587\u6863\uff08\u5305\u542b\u63d2\u56fe\uff09\u7b49\u8d44\u6e90\u5374\u662f\u5f88\u5360\u7a7a\u95f4\u3002 \u56e0\u6b64\u6211\u4eec\u9009\u62e9\u5c06 YouQu \u7684\u6587\u6863\u5de5\u7a0b\u6d89\u53ca\u5230\u7684\u56fe\u7247\u8d44\u6e90\u90fd\u91c7\u7528\u5916\u94fe\u52a0\u8f7d\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_6","title":"2\u3001\u5b89\u88c5","text":"\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u8fd0\u884c env.sh \u5373\u53ef\u3002 bash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_4","title":"3\u3001\u5b9a\u5236\u4f9d\u8d56","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_2","title":"3.1\u3001\u65b0\u589e\u4f9d\u8d56","text":"\u5982\u679c\u5e94\u7528\u5e93\u8fd8\u9700\u8981\u5176\u4ed6 Python \u4f9d\u8d56\u5e93\uff0c\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a requirement.txt \u6587\u4ef6\uff1b autotest_xxx\n\u251c\u2500\u2500 requirement.txt\n\u251c\u2500\u2500 case ...\n \u91cc\u9762\u5199\u5165\u9700\u8981\u5b89\u88c5\u7684\u4e09\u65b9\u4f9d\u8d56\uff0c\u6bd4\u5982\u50cf\u8fd9\u6837\uff1a # requirement.txt\nPyYAML==6.0 # \u6307\u5b9a\u5b89\u88c5\u67d0\u4e2a\u7248\u672c\nrequests # \u672a\u6307\u5b9a\u7248\u672c\u5219\u5b89\u88c5\u6700\u65b0\u7248\n \u5728\u6267\u884c bash env.sh \u65f6\u4f1a\u4e00\u5e76\u5c06\u5176\u5b89\u88c5\u3002 \u5982\u679c\u591a\u4e2a\u5e94\u7528\u5e93\u90fd\u5b58\u5728 requirement.txt \u6587\u4ef6\uff0c\u6267\u884c env.sh \u65f6\u4f1a\u5c06\u591a\u4e2a requirement.txt \u6587\u4ef6\u4e00\u5e76\u52a0\u8f7d\uff1b\u90a3\u4e48\u4e00\u5b9a\u8981\u6ce8\u610f\u591a\u4e2a requirement.txt \u6587\u4ef6\u53ef\u80fd\u5b58\u5728\u76f8\u540c\u7684\u4f9d\u8d56\u88ab\u6307\u5b9a\u5b89\u88c5\u4e0d\u540c\u7248\u672c\u7b49\u7b49\u517c\u5bb9\u6027\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32_1","title":"3.2\u3001\u88c1\u526a\u4f9d\u8d56","text":"\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0c\u53ef\u80fd\u4f60\u53ea\u9700\u8981\u5b89\u88c5\u4e00\u4e9b\u6700\u6700\u57fa\u7840\u7684\u4f9d\u8d56\uff0c\u5176\u4ed6\u7684\u90fd\u4e0d\u9700\u8981\uff0c\u6bd4\u5982\u7eaf\u63a5\u53e3\u81ea\u52a8\u5316\u7684\u9879\u76ee\uff0c\u5b83\u4e0d\u9700\u8981 UI \u81ea\u52a8\u5316\u76f8\u5173\u7684\u4f9d\u8d56\u3002 \u4f60\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\uff0c\u5b58\u653e\u4e00\u4e2a BASICENV \u7684\u666e\u901a\u6587\u4ef6\uff0c\u91cc\u9762\u4e0d\u9700\u8981\u5199\u4efb\u4f55\u5185\u5bb9\uff0c\u8fd9\u6837\u6267\u884c env.sh \u65f6\uff0c\u53ea\u4f1a\u5b89\u88c5\u6700\u57fa\u7840\u7684\u4f9d\u8d56\u3002 autotest_xxx\n\u251c\u2500\u2500 BASICENV # \u53ef\u4ee5\u4f7f\u7528\uff1atouch BASICENV \u521b\u5efa\u6587\u4ef6\n\u251c\u2500\u2500 case ...\n \u57fa\u7840\u4f9d\u8d56\u4ec5\u5b89\u88c5\u4ee5\u4e0b\u51e0\u4e2a\u5305\uff1a pytest # pytest\npytest-rerunfailures # \u5931\u8d25\u91cd\u8dd1\u63d2\u4ef6\npytest-timeout # \u7528\u4f8b\u8d85\u65f6\u63d2\u4ef6\nallure-pytest # \u751f\u6210 allure \u62a5\u544a\u63d2\u4ef6\nallure.deb # allure \u62a5\u544a\u67e5\u770b\u5de5\u5177\n \u88c1\u526a\u4f9d\u8d56 \u548c \u65b0\u589e\u4f9d\u8d56 \u662f\u4e0d\u51b2\u7a81\u7684\uff0c\u53ef\u4ee5\u540c\u65f6\u4f7f\u7528\u3002 \u6b64\u65b9\u6848\u9ed8\u8ba4\u4e3a\u865a\u62df\u73af\u5883\u90e8\u7f72\uff0c\u5982\u679c\u4f60\u60f3\u76f4\u63a5\u90e8\u7f72\u5728\u672c\u673a\u4e0a\uff1a bash env_dev.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_4","title":"4\u3001\u865a\u62df\u5316\u90e8\u7f72","text":"YouQu\u9ed8\u8ba4\u91c7\u7528\u865a\u62df\u5316\u90e8\u5206\uff0c\u865a\u62df\u5316\u73af\u5883\u5b9e\u9645\u5b89\u88c5\u7684\u4f4d\u7f6e\u662f\u5728 $HOME/.local/share/virtualenvs/youqu-oHTM7l7G \u76ee\u5f55\u4e0b youqu-oHTM7l7G \u6b64\u76ee\u5f55\u540d\u79f0\u524d\u9762\u90e8\u5206\u662f\u4f60\u7684\u4ee3\u7801\u6839\u76ee\u5f55\u7684\u540d\u79f0\uff0c\u540e\u9762\u90e8\u5206\u662f\u751f\u6210\u7684\u968f\u673a\u5b57\u7b26\u4e32\uff1b \u540c\u5b66\u4eec\u5728\u8fdc\u7a0b\u673a\u5668\u4e0a\u5b9a\u4f4d\u95ee\u9898\u7684\u65f6\u5019\uff0c\u5982\u679c\u4f7f\u7528 Pycharm \u8c03\u8bd5\uff0c\u5c31\u5c06\u89e3\u91ca\u5668\u6307\u5b9a\u5230\u8fd9\u4e2a\u76ee\u5f55\u7684\u5c31\u884c\u4e86\uff1b \u5f53\u7136\uff0c\u6211\u4eec\u4e5f\u63d0\u4f9b\u4e86\u672c\u673a\u5f00\u53d1\u73af\u5883\u90e8\u7f72\uff1a bash env_dev.sh\n \u5982\u679c\u4f60\u662f\u672c\u5730\u5f00\u53d1\u73af\u5883\u53ef\u4ee5\u7528\u5b83\uff0c\u533a\u522b\u5c31\u662f\u9a71\u52a8\u6267\u884c\u7684\u65f6\u5019\u4f7f\u7528\uff1apython3 manage.py xxx"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_8","title":"\u4e5d\u3001\u5931\u8d25\u5f55\u5c4f","text":"\u5f55\u5c4f\u5176\u5b9e\u662f\u4e00\u79cd\u89c6\u9891\u5f62\u5f0f\u7684\u65e5\u5fd7\uff0c\u56e0\u4e3a\u5f88\u591a\u65f6\u5019\u6211\u4eec\u5728\u67e5\u770b\u65e5\u5fd7\u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u51c6\u786e\u7684\u5b9a\u4f4d\u5230\u7528\u4f8b\u5931\u8d25\u7684\u5177\u4f53\u539f\u56e0\uff0c\u56e0\u6b64\u7528\u4f8b\u7684\u5f55\u5c4f\u80fd\u8ba9\u6211\u4eec\u770b\u5230\u7528\u4f8b\u5728\u6267\u884c\u8fc7\u7a0b\uff1b \u3010\u4f7f\u7528\u65b9\u6cd5\u3011 \u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u5173\u6ce8 2 \u4e2a\u53c2\u6570\uff1b ;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\u3002\n;\u6ce8\u610f\uff0c\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u4e0d\u80fd\u5c0f\u4e8e\u5931\u8d25\u5f55\u5c4f\u6b21\u6570\uff0c\u5373 RERUN >= RECORD_FAILED_CASE\nRECORD_FAILED_CASE = 1\n \u9ed8\u8ba4\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u662f 1 \u6b21\uff1b RECORD_FAILED_CASE = 1 \u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff1b RECORD_FAILED_CASE = 0 \u8868\u793a\u4e0d\u7ba1\u7528\u4f8b\u6210\u529f\u6216\u5931\u8d25\u90fd\u5f55\u5c4f\uff1b \u5f55\u5c4f\u662f\u8981\u5360\u7528\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u7279\u522b\u662f\u5728\u4e00\u4e9b\u914d\u7f6e\u8f83\u4f4e\u7684\u673a\u5668\u4e0a\u4f1a\u5f88\u660e\u663e\uff0c\u6240\u4ee5\u4f60\u9700\u8981\u8003\u8651\u662f\u5426\u6709\u5fc5\u8981\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1b \u4f7f\u7528 manage.py \u6267\u884c\u7528\u4f8b\u9ed8\u8ba4\u8bfb\u53d6\u5230 globalconfig.ini \u91cc\u9762\u7684\u53c2\u6570\uff0c\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report/record \u76ee\u5f55\u4e0b\u4fdd\u5b58\u5931\u8d25\u7528\u4f8b\u7684\u5f55\u5c4f\u548c\u65ad\u8a00\u7684\u90a3\u4e2a\u65f6\u95f4\u70b9\u7684\u622a\u5c4f\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7\u89c6\u9891\u6587\u4ef6\u770b\u5230\u5931\u8d25\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u90fd\u53d1\u751f\u4e86\u4ec0\u4e48\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#wayland","title":"\u5341\u3001Wayland \u9002\u914d","text":"Wayland \u4e0b\u81ea\u52a8\u5316\u4e3b\u8981\u95ee\u9898\u662f X11 \u4e0b\u7684\u952e\u9f20\u64cd\u4f5c\u65b9\u6cd5\u65e0\u6cd5\u4f7f\u7528\uff0c\u6bd4\u5982 Xdotool\u3001 PyAutoGUI\u3001Xwininfo \u7b49\u7b49\uff1b YouQu \u5728 Wayland \u4e0b\u517c\u5bb9\u9002\u914d\uff0cenv.sh \u5728 Wayland \u4e0b\u6267\u884c\u65f6\u4f1a\u5b89\u88c5\u81ea\u7814\u7684\u952e\u9f20\u64cd\u4f5c\u670d\u52a1\uff08\u53ef\u80fd\u5b58\u5728\u4e00\u4e9b\u4f9d\u8d56\u62a5\u9519\uff0c\u6309\u7167\u6ce8\u91ca\u89e3\u51b3\u5373\u53ef\uff09\uff0c\u6846\u67b6\u6838\u5fc3\u5e93\u4e5f\u9488\u5bf9\u6027\u7684\u505a\u4e86\u9002\u914d\uff0c\u4e0a\u5c42\u7528\u4f8b\u5b8c\u5168\u4e0d\u7528\u5173\u5fc3\u673a\u5668\u662fWayland \u8fd8\u662f X11\uff0c\u6846\u67b6\u4f1a\u6839\u636e\u6267\u884c\u65f6\u72b6\u6001\u81ea\u52a8\u5224\u65ad\u8d70\u4e0d\u540c\u7684\u903b\u8f91\uff1b \u7b80\u5355\u8bb2\u5c31\u662f\uff0c\u5e94\u7528\u5e93\u53ea\u9700\u8981\u7ef4\u62a4\u4e00\u5957\u7528\u4f8b\u811a\u672c\u5373\u53ef\u3002 \u3010\u7528\u4f8b\u517c\u5bb9\u3011 \u56e0\u4e3a Wayland \u4e0b\u6709\u4e9b\u5e94\u7528\u7684\u754c\u9762\u663e\u793a\u548c\u529f\u80fd\u672c\u8eab\u5b58\u5728\u4e00\u4e9b\u5dee\u5f02\uff0c\u7528\u4f8b\u5c42\u53ef\u80fd\u9700\u8981\u5bf9\u8fd9\u90e8\u5206\u7528\u4f8b\u505a\u903b\u8f91\u5224\u65ad\uff0c\u4f7f\u7528\u5168\u5c40\u914d\u7f6e\u91cc\u9762\u7684\u5e38\u91cf\u8fdb\u884c\u903b\u8f91\u7f16\u5199\u5373\u53ef\uff1a from setting.globalconfig import GlobalConfig\n# GlobalConfig.IS_WAYLAND \u83b7\u53d6\u5230\u5f53\u524d\u7684\u663e\u793a\u670d\u52a1\u5668\uff08bool\uff09\n# \u5e94\u7528\u5e93 Config \u7ee7\u627f GlobalConfig\nif Config.IS_WAYLAND:\npass\nif Config.IS_X11:\npass\n \u6bd4\u5982\u7528\u4f8b\u91cc\u9762\u5982\u679c\u65ad\u8a00\u7684\u56fe\u7247\u4e0d\u540c\uff1a if Config.IS_WAYLAND:\nself.assert_image_exist(\"wayland_XXX\")\nelse:\nself.assert_image_exist(\"x11_XXX\")\n \u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u811a\u672c\u5728 Wayland \u548c X11 \u4e0b\u90fd\u53ef\u4ee5\u8dd1\uff0cso easy \u662f\u4e0d\u662f\uff1f\u5b8c\u5168\u6ca1\u5fc5\u8981\u4e13\u95e8\u62c9\u65b0\u5206\u652f\u8fdb\u884c Wayland \u9002\u914d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_9","title":"\u5341\u4e00\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_7","title":"1. \u76ee\u5f55\u7ed3\u6784","text":"\u6267\u884c\u65f6\u4f1a\u5728\u6839\u76ee\u5f55\u4e0b\u52a8\u6001\u751f\u6210 report \u76ee\u5f55\uff0c\u6240\u6709\u7684\u62a5\u544a\u76f8\u5173\u7684\u6587\u4ef6\u4f1a\u7edf\u4e00\u5b58\u653e\u5728\u91cc\u9762\uff0c\u793a\u4f8b\uff1a /report\n \u251c\u2500\u2500 allure # allure\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json\n \u251c\u2500\u2500 allure_html # \u751f\u6210\u7684html\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 index.html \u251c\u2500\u2500 allure_back # allure\u62a5\u544a\u5907\u4efd\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 20221108114823\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json\n \u251c\u2500\u2500 json # json\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 result_deepin-music_20221109134736_1081333.json\n \u251c\u2500\u2500 logs # \u65e5\u5fd7\u6587\u4ef6\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 2022-11-10_debug.log \u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-10_error.log\n \u251c\u2500\u2500 record # \u5f55\u5c4f\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-09\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 15\u65f614\u520609\u79d2_test_music_303_2_autotest.mp4\n \u2514\u2500\u2500 xml # xml\u62a5\u544a\n\u2514\u2500\u2500 autotest_deepin_music-20221109134736.xml\n \u9ed8\u8ba4\u60c5\u51b5\u4e0b\u540c\u65f6\u751f\u6210 html\u3001xml\u3001json\u4e09\u79cd\u5f62\u5f0f\u7684\u62a5\u544a\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_7","title":"2. \u5b9a\u5236\u62a5\u544a","text":"\u6211\u4eec\u5bf9 allure \u62a5\u544a\u8fdb\u884c\u4e86\u4e00\u7cfb\u5217\u7684\u5b9a\u5236\uff1a \u5b9a\u5236 logo\u3001title\u3001\u62a5\u544a\u9ed8\u8ba4\u8bed\u8a00\u4e3a\u4e2d\u6587\uff1b \u52a0\u5165\u4e86\u7528\u4f8b\u65ad\u8a00\u5931\u8d25\u65f6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u4ee5\u53ca\u6b64\u65f6\u56fe\u50cf\u5bf9\u6bd4\u7684\u6a21\u677f\u56fe\u7247\uff1b \u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\uff0c\u4f60\u53ef\u4ee5\u5728 html \u62a5\u544a\u4e2d\u76f4\u63a5\u770b\u5f55\u5236\u7684\u89c6\u9891\uff1b \u52a0\u5165\u4e86 IP \u5730\u5740\u3001\u7cfb\u7edf\u4fe1\u606f\u3001\u955c\u50cf\u7248\u672c\u7b49\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_5","title":"3. \u67e5\u770b\u62a5\u544a","text":" \u672c\u5730\u6267\u884c \u5728 report/allure \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u4e00\u5806\u6587\u672c\u6587\u4ef6\uff0c\u8fd9\u4e9b\u662f allure \u63d2\u4ef6\u751f\u6210\u7684\u62a5\u544a\u6e90\u6570\u636e\uff0c\u6211\u4eec\u5728 report/allure_html \u76ee\u5f55\u4e0b\u7ed9\u4f60\u751f\u6210\u4e86 html \u6587\u4ef6\uff0c\u4f46\u662f\u4f60\u4e0d\u80fd\u76f4\u63a5\u901a\u8fc7\u6d4f\u89c8\u5668\u6253\u5f00 index.html \u6587\u4ef6\uff0c\u56e0\u4e3a allure \u7684\u62a5\u544a\u90fd\u662f\u57fa\u4e8e\u5728\u7ebf\u7684\u670d\u52a1\uff0c\u4f60\u5e94\u8be5\u8fd9\u6837\u6253\u5f00\uff1a allure open report/allure_html\n \u4f7f\u7528 manage.py \u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u5728\u7ec8\u7aef\u7684\u6700\u540e\u4e00\u884c\uff0c\u6211\u4eec\u4f1a\u7ed9\u4f60\u8f93\u51fa\u6253\u5f00\u62a5\u544a\u7684\u547d\u4ee4\uff0c\u76f4\u63a5\u590d\u5236\u5b83\u5728\u7ec8\u7aef\u6267\u884c\u5c31\u53ef\u4ee5\u67e5\u770b\u4e86\uff0c\u50cf\u8fd9\u6837\uff1a \u7ec8\u7aef\u6267\u884c\u547d\u4ee4: allure open /tmp/youqu/report/allure_html \u67e5\u770b\u62a5\u544a \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 Pycharm \u91cc\u9762\u627e\u5230 index.html \u6587\u4ef6\uff0c\u7136\u540e\u53f3\u952e\u9009\u62e9\u6d4f\u89c8\u5668\u6253\u5f00\uff0c\u6216\u8005\u4f60\u53ef\u4ee5\u7528\u4e00\u4e2a http \u670d\u52a1\u6253\u5f00\u3002 \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 report/allure \u76ee\u5f55\u4e0b\u67e5\u770b\u62a5\u544a\uff1a allure serve report/allure\n \u8fdc\u7a0b\u6267\u884c \u8fdc\u7a0b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\uff0c\u4f1a\u5c06\u6240\u6709\u8fdc\u7a0b\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u62a5\u544a\u90fd\u6536\u96c6\u5230 report/allure \u76ee\u5f55\u4e0b\uff0c\u5206\u522b\u6309\u7167\u673a\u5668\u7684 IP \u7b49\u5efa\u4e86\u4e0d\u540c\u7684\u76ee\u5f55\uff0c\u4f60\u53ef\u4ee5\u5728\u8fd9\u4e9b\u76ee\u5f55\u91cc\u9762\u53bb\u67e5\u770b\u5bf9\u5e94\u7684\u6d4b\u8bd5\u62a5\u544a\uff0c\u67e5\u770b\u65b9\u6cd5\u548c\u524d\u9762\u672c\u5730\u6267\u884c\u67e5\u770b\u7684\u65b9\u6cd5\u4e00\u6837\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_10","title":"\u5341\u4e8c\u3001\u9759\u6001\u4ee3\u7801\u626b\u63cf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_8","title":"1. \u63d0\u524d\u89e3\u51b3\u4ee3\u7801\u95ee\u9898","text":"\u4e3a\u4e86\u5e2e\u52a9\u5f00\u53d1\u8005\u7edf\u4e00\u4ee3\u7801\u98ce\u683c\uff0cPython \u793e\u533a\u63d0\u51fa\u4e86 PEP8 \u4ee3\u7801\u7f16\u7801\u98ce\u683c\uff0cPython \u5b98\u65b9\u540c\u65f6\u63a8\u51fa\u4e86\u4e00\u4e2a\u68c0\u67e5\u4ee3\u7801\u98ce\u683c\u662f\u5426\u7b26\u5408 PEP8 \u7684\u5de5\u5177\uff0c\u540d\u5b57\u4e5f\u53eb PEP8\u3002 \u4f46\u662f\uff0cPycharm \u91cc\u9762\u7684 PEP8 \u63d2\u4ef6\u5b9e\u9645\u4e0a\u5e76\u4e0d\u80fd\u53d1\u73b0\u5f88\u591a\u4ee3\u7801\u95ee\u9898\uff0c\u8fd9\u4e9b\u95ee\u9898\u5e76\u4e0d\u4f1a\u5728\u8fd0\u884c\u65f6\u62a5\u9519\uff0c\u56e0\u4e3a\u4ece Python \u8bed\u8a00\u89d2\u5ea6\u5e76\u4e0d\u5173\u5fc3\u8fd9\u4e9b\u95ee\u9898\uff0c\u5728 Pycharm \u7f16\u8f91\u5668\u91cc\u9762\u4f7f\u7528\u5feb\u6377\u952e ctrl + alt + L\uff0c\u6709\u4e00\u70b9\u70b9\u683c\u5f0f\u5316\u7684\u6548\u679c\uff0c\u80fd\u89e3\u51b3\u4e00\u4e9b\u7a7a\u683c\u3001\u6362\u884c\u7b49\u5c0f\u95ee\u9898\u3002 \u8fd9\u91cc\u63a8\u8350\u4e00\u4e2a Python \u793e\u533a\u6d41\u884c\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff1a Black\uff0c\u53f7\u79f0\u4e0d\u59a5\u534f\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff0c\u5b83\u68c0\u6d4b\u5230\u4e0d\u7b26\u5408\u89c4\u8303\u7684\u4ee3\u7801\u98ce\u683c\u76f4\u63a5\u5c31\u5e2e\u4f60\u5168\u90e8\u683c\u5f0f\u5316\u597d\uff0c\u5c31\u662f\u8fd9\u4e48\u521a\uff01 \u5b89\u88c5\uff1a sudo pip3 install black \n \u4f7f\u7528\u65b9\u6cd5\uff1a black ${CheckPath}\n \u4f7f\u7528\u8fd9\u4e2a\u5de5\u5177\u683c\u5f0f\u5316\u4e4b\u540e\uff0c\u4ee3\u7801\u4f1a\u88ab\u81ea\u52a8\u8c03\u6574\uff0c\u521a\u5f00\u59cb\u4f60\u53ef\u80fd\u4f1a\u89c9\u5f97\u8c03\u6574\u5f97\u5f88\u5938\u5f20\uff0c\u6ca1\u5173\u7cfb\u575a\u6301\u770b\uff0c\u4e60\u60ef\u4e4b\u540e\uff0c\u4f60\u4f1a\u89c9\u5f97\u5f88\u4f18\u96c5\uff0c\u6ca1\u9519\uff0c\u8fd9\u5c31\u662f Pythonic Code \u7684\u6838\u5fc3\uff0c\u8bf7\u4fdd\u6301\u4f18\u96c5\uff5e\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_8","title":"2. \u4ee3\u7801\u626b\u63cf\u5de5\u5177","text":"\u4f7f\u7528\u6839\u76ee\u5f55\u4e0b pylint.sh \u626b\u63cf\u4ee3\u7801\uff0c\u5728 report \u76ee\u5f55\u4e0b\u67e5\u770b\u4ee3\u7801\u626b\u63cf\u62a5\u544a\uff0c\u5982\u679c\u6709\u4ee3\u7801\u95ee\u9898\u8bf7\u63d0\u524d\u89e3\u51b3\u4e4b\u540e\u518d\u63d0\u4ea4\u3002 \u6b64\u811a\u672c\u5df2\u7ecf\u4f7f\u7528 Python \u793e\u533a\u6700\u6d41\u884c\u7684\u4ee3\u7801\u626b\u63cf\u5de5\u5177 Pylint \u8fdb\u884c\u4ee3\u7801\u626b\u63cf\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a bash pylint.sh\n \u8fd0\u884c\u4e4b\u540e\u4f1a\u63d0\u793a\u4f60\u8981\u626b\u63cf\u7684\u76ee\u5f55\uff0c\u6bd4\u5982\u8f93\u5165 apps \uff0c\u5219\u4f1a\u626b\u63cf apps \u4e0b\u7684\u6240\u6709 Python \u4ee3\u7801\u3002 \u5728 setting/pylintrc.cfg \u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u76f8\u5173\u914d\u7f6e\uff0c\u626b\u63cf\u5b8c\u6210\u4e4b\u540e\u5728 report/pylints \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u626b\u63cf\u62a5\u544a\u3002 \u4ee3\u7801\u63d0\u4ea4\u9700\u901a\u8fc7 git review \u63d0\u4ea4\u5230 gerrit \uff0c\u4eba\u5de5 Code Review \u901a\u8fc7\u4e4b\u540e\u5408\u5165\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_11","title":"\u5341\u4e09\u3001\u63d0\u4ea4\u4ee3\u7801","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_9","title":"1. \u5b89\u88c5\u4f9d\u8d56","text":"sudo apt install git-review\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_9","title":"2. \u63d0\u4ea4\u6a21\u677f","text":"\u5728 ~ \u76ee\u5f55\u4e0b\u65b0\u5efa\u6587\u4ef6\uff0c\u5e76\u547d\u540d\u4e3a gitcommit_template \u5c06\u4ee5\u4e0b\u5185\u5bb9\u5199\u5165\u6587\u4ef6\u5f53\u4e2d\uff1a # commit type :fix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style(\u98ce\u683c\u4fee\u6539)\u3001refactor(\u91cd\u6784)\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test(\u6d4b\u8bd5) + \u7b80\u5355\u63cf\u8ff0. \u9ed8\u8ba4fix,\u6839\u636e\u60c5\u51b5\u4fee\u6539\nfix: \n\n# \u8be6\u7ec6\u8bf4\u660e\u4ee3\u7801\u7684\u6539\u52a8\uff0c\u5305\u542b\u4ee3\u7801\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u4ee5\u53ca\u4e3a\u4ec0\u4e48\u8fd9\u4e48\u505a\uff0c\u53ef\u80fd\u4f1a\u5f71\u54cd\u54ea\u4e9b\u529f\u80fd\u3002\u5bf9\u4e8e\u4ee3\u7801\u7684\u5ba1\u6838\u8005\uff0c\u9700\u8981\u4ece\u8fd9\u6bb5\u63cf\u8ff0\u4e2d\u80fd\u5b8c\u5168\u7406\u89e3\u4ee3\u7801\u4e2d\u6240\u6709\u6539\u52a8\u7684\u5185\u5bb9\nDescription: \n\n# \u5199\u4e00\u6bb5\u9762\u5411\u4e8e\u4ea7\u54c1\u7684\u603b\u7ed3\u6027\u5185\u5bb9\uff0c\u7528\u4e8e\u81ea\u52a8\u751f\u6210crp\u4e0a\u7684changlog\uff0c\u9700\u8981\u6ce8\u610f\u7684\u4e8b\uff0c\u8fd9\u6bb5\u63cf\u8ff0\u5fc5\u987b\u4ece\u4ea7\u54c1\u7684\u89d2\u5ea6\u8003\u8651\u3002\nLog: \n\n# \u5173\u8054pms\u4e0a\u7684bug\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94bug\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4fee\u590dbug\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Bug: \n\n# \u4fee\u590d github issue \n#Issue: \n\n# \u5173\u8054pms\u4e0a\u7684\u4efb\u52a1\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94\u4efb\u52a1\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4efb\u52a1\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Task: \n \u547d\u4ee4\u884c\u6267\u884c: git config --global commit.template ~/gitcommit_template\n \u6b64\u547d\u4ee4\u5c06\u6a21\u677f\u52a0\u5165\u5230 git \u7684\u63d0\u4ea4\u6a21\u677f\u4e2d\u3002 \u540e\u7eed\u63d0\u4ea4\u7684\u65f6\u5019\u9700\u8981\u5173\u6ce8\u4e00\u4e0b\u51e0\u70b9\uff1a commit type \u5bf9\u5e94\u4e0d\u540c\u7684\u4fee\u6539\u7c7b\u578b\uff1afix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style \uff08\u98ce\u683c\u4fee\u6539\uff09\u3001refactor \uff08\u91cd\u6784\uff09\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test \uff08\u6d4b\u8bd5\uff09 commit type \u5192\u53f7\u540e\u9762\u52a0\u7a7a\u683c\u3002 Description \u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u9700\u8981\u8fdb\u884c\u8be6\u7ec6\u8bf4\u660e\uff0c\u6bd4\u5982\u5bf9\u529f\u80fd\u8fdb\u884c\u5927\u6539\u7b49\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_6","title":"3. \u63a8\u9001\u4ee3\u7801","text":"\u9996\u5148\u6dfb\u52a0 commit \u4fe1\u606f git add \u540e\u9762\u52a0\u6587\u4ef6\u540d\u79f0\n git add . # \u8868\u793a\u6dfb\u52a0\u6240\u6709\u6587\u4ef6\n \u4f7f\u7528\u8fd9\u6761\u547d\u4ee4\u6ce8\u610f\u6709\u4e9b\u4e34\u65f6\u6587\u4ef6\u4e0d\u8981\u63d0\u4ea4\u5230\u4ed3\u5e93\u4e86\u3002 git commit -a\n \u4e4b\u540e\u5728 fix: \u540e\u9762\uff08\u6ce8\u610f\u5192\u53f7\u540e\u9762\u5fc5\u987b\u52a0\u7a7a\u683c\uff0c\u4e0d\u7136\u76f4\u63a5-1\uff09\u5199\u672c\u5730\u63d0\u4ea4\u7684 commit \u4fe1\u606f\uff0c\u7136\u540e\u5c31\u53ef\u4ee5\u63d0\u4ea4\u4ee3\u7801\u4e86 git review branch(\u5f53\u524d\u5206\u652f) -r origin\n \u6700\u597d\u4e00\u6b21 commit\uff0c\u4e00\u6b21 git review \uff0c\u7ecf\u5e38\u6709\u540c\u5b66\u5728\u672c\u5730\u75af\u72c2 commit \u6700\u540e git review \u62a5\u9519\u4e0d\u77e5\u9053\u548b\u56de\u4e8b\u513f\u3002 \u82e5\u4e0d\u60f3\u6bcf\u6b21\u63d0\u4ea4\u90fd\u52a0\u4e0a -r \u9009\u9879\uff0c\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a git config --global gitreview.remote origin \u63d0\u4ea4\u4ee3\u7801\uff0c\u76f4\u63a5\u4f7f\u7528 git review branch<\u76ee\u6807\u5206\u652f>\uff0c\u4f8b\u5982 git review master"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git","title":"4. Git\u6807\u7b7e","text":"Git \u6807\u7b7e\u5b9e\u9645\u4e0a\u662f commit \u7684\u4e00\u4e2a\u522b\u540d\uff0c\u4e3b\u8981\u7528\u4e8e\u7ba1\u7406\u5386\u53f2\u7248\u672c\u3002 \u60f3\u8c61\u4e00\u4e0b\u9886\u5bfc\u8ba9\u4f60\u628a\u4e4b\u524d\u7684\u67d0\u4e2a\u7248\u672c\u7684\u4ee3\u7801\u62c9\u51fa\u6765\u8dd1\uff0c\u4f60\u662f\u4e0d\u662f\u4e56\u4e56\u7684\u53bb\u628a\u6240\u6709\u63d0\u4ea4\u8bb0\u5f55\u62c9\u51fa\u6765\u627e\uff0c\u7136\u540e\u627e\u5230\u90a3\u4e2a\u54c8\u5e0c\u503c\uff0c\u901a\u8fc7\u54c8\u5e0c\u503c\u6765\u68c0\u51fa\u4ee3\u7801\u3002 \u8fd9\u4e00\u5957\u64cd\u4f5c\u4e0b\u6765\u662f\u4e0d\u662f\u5f88\u9ebb\u70e6\uff0c\u8d39\u65f6\u95f4\u8fd8\u4e0d\u4e00\u5b9a\u80fd\u627e\u5f97\u5230\uff0c\u6ca1\u4eba\u80fd\u8bb0\u4f4f\u6bcf\u4e2a\u63d0\u4ea4\u54c8\u5e0c\u503c\u4ee5\u53ca\u8fd9\u6b21\u63d0\u4ea4\u90fd\u6539\u4e86\u54ea\u4e9b\u4ee3\u7801\u3002 \u56e0\u6b64\u7ed9\u63d0\u4ea4\u6253\u4e2a\u6807\u7b7e\uff0c\u5c31\u662f\u628a\u54c8\u5e0c\u503c\u8f6c\u6362\u6210\u4eba\u7c7b\u80fd\u7406\u89e3\u7684\u8bed\u8a00\uff0c\u6bd4\u5982 v1.0\uff0c\u5c31\u53ef\u4ee5\u76f4\u63a5\u901a\u8fc7\u6807\u7b7e\u627e\u5230\u5bf9\u5e94\u7684\u63d0\u4ea4\u3002 \u65b0\u5efa\u6807\u7b7e git tag -a <tagname>\n \u56de\u8f66\u4e4b\u540e\uff0cGit \u4f1a\u6253\u5f00\u4f60\u7684\u7f16\u8f91\u5668\uff0c\u8ba9\u4f60\u5199\u4e00\u53e5\u6807\u7b7e\u6ce8\u89e3\uff0c\u5c31\u50cf\u4f60\u7ed9\u63d0\u4ea4\u5199\u6ce8\u89e3\u4e00\u6837\u3002 \u67e5\u770b\u6240\u6709\u6807\u7b7e git tag -l\n# git tag \u4e5f\u884c\n \u5220\u9664\u6807\u7b7e git tag -d <tagname>\n \u63a8\u9001\u6807\u7b7e\u81f3\u8fdc\u7a0b git push \u547d\u4ee4\u5e76\u4e0d\u4f1a\u4f20\u9001\u6807\u7b7e\u5230\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\uff0c\u5fc5\u987b\u663e\u5f0f\u5730\u63a8\u9001\u6807\u7b7e\u3002 git push origin <tagname>\n \u63a8\u9001\u6240\u6709\u4e0d\u5728\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\u7684\u6807\u7b7e git push origin --tag\n \u5220\u9664\u8fdc\u7a0b\u6807\u7b7e git push origin :refs/tag/<tagname>\n \u540e\u671f\u6253\u6807\u7b7e \u5148\u7528 git log --pretty=oneline \u67e5\u8be2\u63d0\u4ea4\u8bb0\u5f55\uff0c\u83b7\u53d6\u6821\u9a8c\u7801\u3002 git tag -a <tagname> 9fceb02(\u6821\u9a8c\u7801)\n \u68c0\u51fa\u6807\u7b7e git checkout <tagname>\n \u6b64\u65f6\uff0c\u4ed3\u5e93\u4f1a\u5904\u4e8e\u201c\u5206\u79bb\u5934\u6307\u9488\uff08detached HEAD\uff09\u201d\u7684\u72b6\u6001\u3002 \u5728\u201c\u5206\u79bb\u5934\u6307\u9488\u201d\u72b6\u6001\u4e0b\uff0c\u5982\u679c\u4f60\u505a\u4e86\u67d0\u4e9b\u66f4\u6539\u7136\u540e\u63d0\u4ea4\u5b83\u4eec\uff0c\u6807\u7b7e\u4e0d\u4f1a\u53d1\u751f\u53d8\u5316\uff0c \u4f46\u4f60\u7684\u65b0\u63d0\u4ea4\u5c06\u4e0d\u5c5e\u4e8e\u4efb\u4f55\u5206\u652f\uff0c\u5e76\u4e14\u5c06\u65e0\u6cd5\u8bbf\u95ee\uff0c\u9664\u975e\u901a\u8fc7\u786e\u5207\u7684\u63d0\u4ea4\u54c8\u5e0c\u624d\u80fd\u8bbf\u95ee\u3002 \u56e0\u6b64\uff0c\u5982\u679c\u4f60\u9700\u8981\u8fdb\u884c\u66f4\u6539\uff0c\u6bd4\u5982\u4f60\u8981\u4fee\u590d\u65e7\u7248\u672c\u4e2d\u7684\u9519\u8bef\uff0c\u90a3\u4e48\u901a\u5e38\u9700\u8981\u521b\u5efa\u4e00\u4e2a\u65b0\u5206\u652f\uff1a git checkout -b <NewBranchName> <tagname>\n \u65b0\u5206\u652f\u4e0a\u53ef\u4ee5\u8fdb\u884c\u63d0\u4ea4\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_12","title":"\u5341\u56db\u3001\u5e38\u89c1\u95ee\u9898","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_10","title":"1. \u63d0\u4ea4\u4ee3\u7801\u65f6\u63d0\u793a\u90ae\u7bb1\u6216\u8005\u540d\u79f0\u4e0d\u5bf9","text":"\u91cd\u65b0\u914d\u7f6e\u90ae\u7bb1\u6216\u8005\u540d\u79f0\uff0c\u7136\u540e\u91cd\u7f6e\u751f\u6548\uff1a git commit --amend --reset-author\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_10","title":"2. \u600e\u4e48\u56de\u6eda\u5230\u4e4b\u524d\u7684\u7248\u672c","text":"(1)\u67e5\u8be2\u5386\u53f2\u63d0\u4ea4\u8bb0\u5f55 git log\n \u627e\u5230\u4f60\u8981\u56de\u6eda\u7684\u7248\u672c\uff0c\u590d\u5236 hash \u503c\u3002 \u6ce8\u610f\uff1a\u662f commit \u7a7a\u683c\u4e4b\u540e\u7684 hash \u503c\uff0c\u4e4b\u524d\u6709\u540c\u5b66\u590d\u5236\u7684 Change-Id: \u8fd9\u6837\u80af\u5b9a\u62a5\u9519\u3002 (2)\u56de\u6eda\u7248\u672c\uff0c\u4e0d\u6e05\u9664\u4ee3\u7801 git reset --soft ${hash}\n (3)\u56de\u6eda\u7248\u672c\uff0c\u6e05\u9664\u4ee3\u7801\uff0c\u614e\u7528\u54c8 git reset --hard ${hash}\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-f-s-e","title":"3. \u6d4b\u8bd5\u62a5\u544a\u91cc\u9762 F S . E \u662f\u4ec0\u4e48\u610f\u601d","text":"F \u8868\u793a\u5931\u8d25\uff0c. \uff08\u70b9\uff09\u8868\u793a\u901a\u8fc7\uff0cS \u8868\u793a\u8df3\u8fc7\uff0cE \u8868\u793a error \u6709\u62a5\u9519"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git-status","title":"4. \u89e3\u51b3 git status \u4e2d\u6587\u663e\u793a\u7684\u95ee\u9898","text":"git config --global core.quotePath false\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5-apps","title":"5. apps \u76ee\u5f55\u4e0b\u989c\u8272\u6709\u4e9b\u662f\u9ec4\u8272\u7684","text":"\u5728 Pycharm \u4e2d apps \u76ee\u5f55\u4e0b\u5e94\u7528\u5e93\u6587\u4ef6\u662f\u9ec4\u8272\u7684\uff0c\u7f16\u8f91\u5668\u8bc6\u522b\u4e0d\u5230\u4ee3\u7801\u65b0\u589e\u548c\u4fee\u6539\uff1b \u7531\u4e8e\u793e\u533a\u7248 Pycharm \u4e0d\u80fd\u52a8\u6001\u8bc6\u522b\u591a\u4ed3\u5e93\uff0c\u9700\u8981\u5728 setting \u91cc\u9762\u624b\u52a8\u6ce8\u518c\uff0c\u64cd\u4f5c\u6b65\u9aa4\uff1a File \u2014> Settings \u2014> Version Control \u2014> \u70b9 + \u53f7 \u2014> Directory \u9009\u4e2d\u5e94\u7528\u5e93\u5de5\u7a0b\u76ee\u5f55 \u2014> VCS \u9009\u4e2d Git \u2014> Apply \u5982\u6b64\u5c31\u53ef\u4ee5\u4e86\u3002 \u4e13\u4e1a\u7248 Pycharm \u4e0d\u5b58\u5728\u8fd9\u4e2a\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#6-envsh-r","title":"6. \u6267\u884c env.sh \u62a5\u9519 $'\\r':\u672a\u627e\u5230\u547d\u4ee4","text":"\u51fa\u73b0\u8fd9\u4e2a\u95ee\u9898\u4f60\u5e94\u8be5\u662f\u5728 windows \u4e0a\u6253\u5f00\u6216\u7f16\u8f91\u8fc7 env.sh \u811a\u672c\uff0cwindows\u4e0b\u7684\u6362\u884c\u662f\u56de\u8f66\u7b26+\u6362\u884c\u7b26\uff0c\u4e5f\u5c31\u662f\\r\\n\uff0c\u800c Linxu \u4e0b\u662f\u6362\u884c\u7b26 \\n\uff0cLinux \u4e0b\u4e0d\u8bc6\u522b \\r\uff0c\u56e0\u6b64\u62a5\u9519\u3002 \u89e3\u51b3\u65b9\u6848\uff1a # \u5c06 \\r \u66ff\u6362\u4e3a\u7a7a\nsudo sed -i 's/\\r//' env.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#7","title":"7.\u600e\u6837\u4e3a\u5355\u72ec\u67d0\u4e00\u6761\u7528\u4f8b\u914d\u7f6e\u6267\u884c\u8d85\u65f6\u65f6\u95f4","text":"\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u5982\u4e0b\uff1a @pytest.mark.timeout(300) # \u5355\u4f4d\u79d2\ndef test_xxx_001():\npass\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#8-youqu","title":"8. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u6240\u6709\u4ee3\u7801\uff0c\u5305\u542b\u5b50\u4ed3\u5e93","text":"\u524d\u7f6e\u6761\u4ef6\uff1a\u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 # \u7b2c\u4e00\u6b21\u5b58\u50a8\u5bc6\u7801\uff0c\u63d0\u4f9b\u540e\u9762\u62c9\u4ee3\u7801(gerrit: ldap\u8d26\u53f7\u548c\u5bc6\u7801\uff0cgit\u62c9\u53d6\u7b2c\u4e00\u6b21\u8f93\u5165\u4fdd\u5b58\uff0c\u540e\u9762\u76f4\u63a5\u4f7f\u7528)\ngit config --global credential.helper store\n\n# \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\uff0c\u5e76\u9012\u5f52\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\" --recursive\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#9-youqu","title":"9. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\u6307\u5b9a\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u524d\u7f6e\u6761\u4ef6\uff1a \u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 \u5df2\u5b58\u50a8\u8bbf\u95ee\u5bc6\u7801 # \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\"\n# \u6307\u5b9a\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ncd youqu\ngit submodule update --init apps/autotest_xxx_xxx\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#10-youqu","title":"10. \u5982\u4f55\u66f4\u65b0 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\uff0c\u6240\u6709\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u66f4\u65b0\u6240\u6709\u5b50\u4ed3\u5e93\u4ee3\u7801 cd youqu\ngit pull & git submodule foreach git pull\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#11-youqu-master-detached-head","title":"11. \u5982\u4f55\u4fee\u590d YouQu \u6240\u6709\u5b50\u4ed3\u5e93 master \u5206\u652f\u6e38\u79bb\u5934\uff08detached head\uff09","text":"\u4fee\u590d\u6240\u6709\u5b50\u4ed3\u5e93\u9ed8\u8ba4master \u5206\u652f\u6e38\u79bb\u5934 cd youqu\ngit submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/","title":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212 \u5206\u7c7b\uff1a/ \u67b6\u6784\u5e08\uff1a/ \u76ee\u6807\uff1a \u5e94\u7528 AT \u67b6\u6784\u5de5\u7a0b\u5316\uff0c\u53c2\u8003\u6027\u80fd\u81ea\u52a8\u5316\u5de5\u7a0b\u5b8c\u6210\u5de5\u7a0b\u5316\u6539\u9020\u3002 \u5e94\u7528\u95f4\u7528\u4f8b\u89e3\u8026\uff0c\u89e3\u9664\u6240\u6709\u4ea4\u53c9\u8c03\u7528\u7684\u65b9\u6cd5\uff0c\u5404\u5e94\u7528\u80fd\u8ddf\u968f\u81ea\u8eab\u8fed\u4ee3\u5468\u671f\u72ec\u7acb\u7ef4\u62a4 AT \u7528\u4f8b\u3002 \u5b8c\u6210\u516c\u5171\u65b9\u6cd5\u7684\u62bd\u53d6\u6574\u5408\uff0c\u5f62\u6210\u4e00\u5957\u72ec\u7acb\u4e8e\u5e94\u7528\u95f4\u7684\u516c\u5171\u65b9\u6cd5\u5e93\uff0c\u5404\u5e94\u7528\u65b9\u6cd5\u91cc\u9762\u4e0d\u5b58\u5728\u88ab\u591a\u4e2a\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\u3002 \u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u4e3a\u5c06\u6765\u9002\u914d\u66f4\u591a\u7684 AT \u8fd0\u7528\u573a\u666f\u63d0\u4f9b\u652f\u6491\uff0c\u539f\u5219\u4e0a\u53ef\u5b9e\u73b0\u65e0\u9650\u6269\u5c55\uff0c\u5728\u6bcf\u65e5\u6784\u5efa\u548c\u6301\u7eed\u96c6\u6210\u6d41\u7a0b\u843d\u5730\u4f7f\u7528\u3002 \u4ee3\u7801\u89c4\u8303\u95ee\u9898\u6e05\u96f6\uff0c\u7b26\u5408 Shell Check\u3001Pylint\u3001\u7cfb\u7edf\u90e8\u76f8\u5173\u7f16\u7801\u89c4\u8303\u8981\u6c42\u3002 \u610f\u4e49\uff1a \u7edf\u4e00\u6210\u7814 AT \u67b6\u6784\u8bbe\u8ba1\u601d\u8def\uff0c\u6d88\u9664 AT \u4ee3\u7801\u5b9e\u73b0\u548c\u7ef4\u62a4\u4e0a\u53ef\u80fd\u51fa\u73b0\u7684\u5206\u6b67\uff0c\u6539\u5584\u5386\u53f2 AT \u65e0\u5de5\u7a0b\u5316\u8bbe\u8ba1\u7684\u7f3a\u9677\uff0c\u63d0\u9ad8\u67b6\u6784\u4e13\u4e1a\u6027\u3002 \u5404\u5e94\u7528 AT \u4ee3\u7801\u76f8\u4e92\u72ec\u7acb\uff0c\u5951\u5408\u5e94\u7528\u72ec\u7acb\u53d1\u5e03\u7279\u6027\uff0c\u53ef\u652f\u6301\u8fed\u4ee3\u671f\u95f4\u72ec\u7acb\u65b0\u589e\u3001\u7ef4\u62a4\u548c\u6267\u884c\u3002 \u65b9\u6cd5\u8c03\u7528\u903b\u8f91\u5f97\u5230\u7b80\u5316\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u66f4\u9ad8\u6548\uff1b\u516c\u5171\u5e93\u62bd\u53d6\uff0c\u51cf\u5c11\u65b9\u6cd5\u91cd\u590d\u7f16\u5199\uff0c\u63d0\u9ad8\u4ee3\u7801\u5229\u7528\u7387\uff1b\u5e73\u5747\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u4ece40\u5206\u949f\u964d\u4f4e\u81f330\u5206\u949f\uff0c\u65e5\u4ea7\u51fa\u7528\u4f8b\u4ece12\u6761/\u5929\u63d0\u5347\u81f316\u6761/\u5929\u3002 \u53ef\u7075\u6d3b\u652f\u6491\u4e0d\u540c\u7684\u81ea\u52a8\u5316\u8fd0\u7528\u573a\u666f\uff0c\u5982 CI\u3001\u5192\u70df\u6d4b\u8bd5\u3001\u96c6\u6210\u6d4b\u8bd5\u3001\u56de\u5f52\u6d4b\u8bd5\u3001\u4e13\u9879\u6d4b\u8bd5\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_2","title":"\u4e00\u3001\u80cc\u666f\u4ecb\u7ecd","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1","title":"1\u3001\u73b0\u6709\u67b6\u6784\u4ecb\u7ecd","text":"\u73b0\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u6574\u4f53\u5206\u4e3a\u4e09\u5c42\uff1a\u7528\u4f8b\u5c42\uff08\u4e1a\u52a1\u903b\u8f91\u5c42\uff09\u3001\u4e2d\u95f4\u5c42\uff08\u5143\u7d20\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff09\u3001\u6838\u5fc3\u5c42\uff08\u5e95\u5c42\u529f\u80fd\u5e93\u5c42\uff09\u3002 \u7528\u4f8b\u5c42\uff1a\u5373\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4e13\u6ce8\u4e8e\u4e1a\u52a1\u529f\u80fd\u903b\u8f91\uff0c\u4e0d\u5173\u5fc3\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\uff1b \u4e2d\u95f4\u5c42\uff1a\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff0c\u6bcf\u4e2a\u65b9\u6cd5\u5747\u5bf9\u5e94\u4e00\u4e2a\u5143\u7d20\u7684\u4e00\u4e2a\u5177\u4f53\u64cd\u4f5c\uff0c\u4e5f\u53ef\u4ee5\u662f\u591a\u4e2a\u64cd\u4f5c\u7684\u7ec4\u5408\u64cd\u4f5c\uff0c\u4e2d\u95f4\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u7528\u4f8b\u5c42\uff0c\u5177\u6709\u53ef\u6269\u5c55\u6027\u548c\u590d\u7528\u6027\uff1b \u6838\u5fc3\u5c42\uff1a\u4e3b\u8981\u5c01\u88c5\u7684\u5e95\u5c42\u529f\u80fd\u5b9e\u73b0\uff0c\u6b64\u5c42\u5728\u6846\u67b6\u4e2d\u63d0\u4f9b\u4e00\u4e9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u529f\u80fd\u6a21\u5757\u76f8\u5bf9\u72ec\u7acb\uff0c\u6838\u5fc3\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u64cd\u4f5c\u5c42\uff0c\u6bd4\u5982\uff1a\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7 UI \u5750\u6807\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u952e\u9f20\u64cd\u4f5c\u7684\u57fa\u7840\u65b9\u64cd\u4f5c\u6a21\u5757\u3001Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757\u3001\u6587\u4ef6\u7684\u589e\u5220\u6539\u67e5\u64cd\u4f5c\u6a21\u5757\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2","title":"2\u3001\u81ea\u52a8\u5316\u7684\u5e94\u7528","text":"2.1\u3001CI \u6d41\u7a0b \u6bcf\u65e5\u6784\u5efa\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u7814\u53d1\u6bcf\u65e5\u63d0\u4ea4\u7684\u4ee3\u7801\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u73ed\u4e4b\u540e\u4f1a\u5c06\u5404\u5e94\u7528\u8fdb\u884c\u6253\u5305\uff0c\u7136\u540e\u5728\u6d4b\u8bd5\u673a\u4e0a\u5b89\u88c5\u66f4\u65b0 deb \u5305\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u5e94\u7528\u63d0\u4ea4\u96c6\u6210\u7684\u7248\u672c\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u8f7d\u6700\u65b0\u7684 ISO \u8fdb\u884c PXE \u90e8\u7f72\uff0c\u7136\u540e\u6d4b\u8bd5\u673a\u5b89\u88c5\u6700\u65b0\u7684\u955c\u50cf\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 2.2\u3001\u9a8c\u6536\u6d4b\u8bd5 \u5728\u5404\u9a8c\u6536\u8282\u70b9\u8fdb\u884c\u81ea\u52a8\u5316\u9a8c\u6536\uff0c\u76ee\u524d\u7684\u7b56\u7565\u662f\u5168\u7528\u4f8b\u8986\u76d6\u5168\u67b6\u6784\u3002 2.3\u3001\u56de\u5f52\u6d4b\u8bd5 \u56de\u5f52\u6d4b\u8bd5\u4eca\u5e74\u89c4\u5212\u5efa\u8bbe\u4e2d\uff0c\u65e8\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u6267\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\uff0c\u51cf\u5c11\u529f\u80fd\u6d4b\u8bd5\u7684\u91cd\u590d\u52b3\u52a8\u529b\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3","title":"3\u3001\u5b58\u5728\u7684\u95ee\u9898","text":" \u5404\u5e94\u7528\u4e4b\u95f4\u5b58\u5728\u8026\u5408 \u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u521d\u671f\uff0c\u6240\u6709\u5e94\u7528\u662f\u6574\u4f53\u53d1\u5e03\uff0c\u6211\u4eec\u662f\u5c06\u6240\u6709\u5e94\u7528\u770b\u6210\u662f\u4e00\u4e2a\u6574\u4f53\uff0c\u5404\u5e94\u7528\u4f5c\u4e3a\u5176\u4e2d\u7684\u4e00\u4e2a\u6a21\u5757\uff0c\u6240\u4ee5\u5b58\u5728\u5e94\u7528\u95f4\u65b9\u6cd5\u4ea4\u53c9\u8c03\u7528\u7684\u95ee\u9898\uff0c\u8fd9\u6837\u4ece\u6700\u521d\u7684\u8bbe\u8ba1\u6765\u8bb2\u786e\u5b9e\u80fd\u591f\u51cf\u5c11\u91cd\u590d\u4ee3\u7801\u7684\u7f16\u5199\u3002\u4f46\u662f\u73b0\u5728\u5e94\u7528\u8d70\u72ec\u7acb\u53d1\u5e03\uff0c\u5404\u5e94\u7528\u90fd\u6709\u81ea\u5df1\u7684\u8fed\u4ee3\u8282\u594f\uff0c\u5728\u65b0\u9700\u6c42\u5feb\u901f\u53d8\u5316\u7684\u8fc7\u7a0b\u4e2d\uff0c\u81ea\u52a8\u5316\u7ef4\u62a4\u53d8\u5f97\u5f02\u5e38\u56f0\u96be\uff0c\u539f\u56e0\u5c31\u662f\u81ea\u52a8\u5316\u9879\u76ee\u91cc\u9762\u5404\u4e2a\u5e94\u7528\u7684\u6709\u6bd4\u8f83\u591a\u7684\u8026\u5408\u5173\u7cfb\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u8fdb\u884c\u89e3\u8026\uff0c\u4ee5\u9002\u5e94\u5e94\u7528\u4e0d\u540c\u7684\u8fed\u4ee3\u5468\u671f\u3002 \u65e0\u6cd5\u7cbe\u51c6\u7684\u5212\u5206\u7528\u4f8b\u8303\u56f4 \u7528\u4f8b\u6267\u884c\u7684\u8303\u56f4\u4e0d\u591f\u7cbe\u51c6\uff0c\u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u4e3b\u8981\u901a\u8fc7\u7528\u4f8b\u7684\u5173\u952e\u8bcd core\uff08\u6838\u5fc3\uff09\u6765\u533a\u5206\u7528\u4f8b\u662f\u5426\u4e3a\u6838\u5fc3\u7528\u4f8b\uff0c\u4f46\u662f\u8fd9\u6837\u7684\u533a\u5206\u592a\u5bbd\u6cdb\u4e86\uff0c\u4e0d\u80fd\u9002\u5e94\u81ea\u52a8\u5316\u6d4b\u8bd5\u5728\u591a\u573a\u666f\u4e0b\u7684\u5e94\u7528\u3002\u5f88\u591a\u573a\u666f\u4e0b\u6211\u4eec\u8fd8\u9700\u8981\u6839\u636e\u7528\u4f8b\u7684\u7b49\u7ea7\u3001\u7528\u4f8b\u7684\u7c7b\u578b\u3001\u7528\u4f8b\u6765\u6e90\u7b49\u7b49\uff0c\u4e0d\u540c\u7684\u7ef4\u5ea6\u6765\u6311\u9009\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u5173\u952e\u5b57\u9700\u8981\u4eba\u5de5\u4e00\u6761\u6761\u7684\u6539\uff0c\u8d39\u65f6\u8d39\u529b\uff0c\u800c\u4e14\u4e0d\u597d\u7ef4\u62a4\u3002 \u53d7\u65b0\u9700\u6c42\u5f71\u54cd\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u597d\u7ef4\u62a4 \u76ee\u524d\u9700\u8981\u8df3\u8fc7\u7684\u7528\u4f8b\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684\u7528\u4f8b\u811a\u672c\u91cc\u9762\uff0c\u6dfb\u52a0\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\uff0c\u540e\u7eed\u89e3\u9664\u8df3\u8fc7\u7684\u65f6\u5019\u53c8\u9700\u8981\u627e\u5230\u8fd9\u6761\u811a\u672c\uff0c\u5220\u6389\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\u3002\u5728\u8df3\u8fc7\u7528\u4f8b\u8f83\u591a\u7684\u60c5\u51b5\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u96be\u5ea6\u3002 \u7f16\u5199\u7528\u4f8b\u65f6\u903b\u8f91\u6bd4\u8f83\u590d\u6742\uff0c\u9700\u8981\u8c03\u7528\u591a\u4e2a\u5e94\u7528\u7684\u65b9\u6cd5\u6a21\u5757\u3002 \u6846\u67b6\u6269\u5c55\u6027\u4e0d\u8db3\uff0c\u65e0\u6cd5\u6574\u5408\u6027\u80fd\u81ea\u52a8\u5316\u3001\u538b\u6d4b\u81ea\u52a8\u5316\u3001\u5b89\u5168\u81ea\u52a8\u5316\u7b49\u4e13\u9879\u6d4b\u8bd5\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_3","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u4e3a\u89e3\u51b3\u73b0\u6709\u95ee\u9898\uff0c\u9002\u5e94\u4e0d\u65ad\u4e30\u5bcc\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u66f4\u597d\u7684\u53d1\u6325\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4f5c\u7528\uff0c\u9700\u8981\u5bf9\u81ea\u52a8\u5316\u67b6\u6784\u53ca\u5404\u529f\u80fd\u6a21\u5757\u8fdb\u884c\u91cd\u65b0\u8bbe\u8ba1\u89c4\u5212\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_1","title":"1\u3001\u67b6\u6784\u8bbe\u8ba1","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_1","title":"2\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u6846\u67b6\u7684\u8fd0\u884c\u903b\u8f91\uff1a\u901a\u8fc7\u6838\u5fc3\u5c42\u63d0\u4f9b\u4e00\u4e2a\u57fa\u7840\u80fd\u529b\uff0c\u4e1a\u52a1\u5c42\u6839\u636e\u5b9e\u9645\u4e1a\u52a1\u9700\u6c42\uff08\u6d4b\u8bd5\u7528\u4f8b\uff09\u52a8\u6001\u52a0\u8f7d\u6838\u5fc3\u5c42\uff0c\u6267\u884c\u5165\u53e3\u52a0\u8f7d\u76f8\u5e94\u7684\u7528\u4f8b\u96c6\u5e76\u63a7\u5236\u6267\u884c\uff0c\u5e94\u7528\u5c42\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u9700\u6c42\uff0c\u901a\u8fc7\u76f8\u5e94\u7684\u914d\u7f6e\u9879\u8fdb\u884c\u914d\u7f6e\uff0c\u4ece\u800c\u89e6\u53d1\u81ea\u52a8\u5316\u6d4b\u8bd5\u4efb\u52a1\u3002 \u6838\u5fc3\u5c42\uff1a\u57fa\u672c\u4fdd\u6301\u4e0d\u53d8\uff0c\u90e8\u5206\u6a21\u5757\u4f1a\u6d89\u53ca\u5230\u65b0\u529f\u80fd\u5f00\u53d1\uff0c\u6838\u5fc3\u5c42\u5404\u529f\u80fd\u6a21\u5757\u4fdd\u6301\u72ec\u7acb\u6027\uff0c\u63d0\u4f9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u4f9b\u4e0a\u5c42\u8c03\u7528\uff1b \u5e95\u5c42\u6838\u5fc3\u6a21\u5757\u5305\u62ec\uff1a \u56fe\u50cf\u8bc6\u522b\u6a21\u5757 UI \u5b9a\u4f4d\u6a21\u5757 Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757 \u5c5e\u6027\u5b9a\u4f4d\u6a21\u5757 \u65e5\u5fd7\u6a21\u5757 \u952e\u9f20\u64cd\u4f5c\u6a21\u5757 \u6587\u4ef6\u64cd\u4f5c\u6a21\u5757 \u5f55\u5c4f\u6a21\u5757 \u81ea\u5b9a\u4e49\u65ad\u8a00\u6a21\u5757 \u7528\u4f8b\u6267\u884c\u6a21\u5757 PXE \u88c5\u673a\u6a21\u5757 \u952e\u9f20\u4fe1\u53f7\u6a21\u62df\u6a21\u5757 OCR \u6a21\u5757 \u4e1a\u52a1\u5c42\uff1a\u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e94\u7528\u5185\u5305\u542b\u591a\u4e2a\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5982\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7b49\uff0c\u540e\u7eed\u53ef\u4ee5\u6839\u636e\u9700\u8981\u5ac1\u63a5\u8fdb\u6765\u3002\u5176\u4e2d\u529f\u80fd\u6d4b\u8bd5\u8bbe\u8ba1\u601d\u8def\uff1a \u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e76\u5c06\u6d4b\u8bd5\u6570\u636e\u548c\u6d4b\u8bd5\u8d44\u6e90\u6574\u5408\u8fdb\u6765\uff0c\u589e\u52a0\u7528\u4f8b\u6807\u7b7e csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ed9\u6bcf\u6761\u7528\u4f8b\u6253\u6807\u7b7e\u3002 \u5404\u6807\u7b7e\u6240\u4f7f\u7528\u5bf9\u5e94\u7684\u5b57\u6bb5\u540d\u79f0\uff0c\u4f7f\u7528 csv \u6587\u4ef6\u7ef4\u62a4\u7528\u4f8b\u4e0e\u6807\u7b7e\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u5bf9\u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u53ef\u4ee5\u7ec4\u5408\u5176\u4e2d\u7684\u6807\u7b7e\u800c\u4ece\u9a71\u52a8\u5bf9\u5e94\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\uff0c\u517c\u5bb9\u73b0\u6709\u7528\u4f8b\u6807\u7b7e\uff0c\u4e14\u652f\u6301\u7528\u4f8b\u6807\u7b7e\u53ef\u6269\u5c55\uff1b \u4f7f\u7528 csv \u683c\u5f0f\u6587\u4ef6\u53ef\u4ee5\u65b9\u4fbf\u7684\u4f7f\u7528 Excel \u8868\u683c\u6253\u5f00\u8fdb\u884c\u7f16\u8f91\uff0c\u540c\u65f6\u7531\u4e8e csv \u6587\u4ef6\u5b9e\u9645\u662f\u4ee5\u90fd\u597d\u5206\u9694\u7684\u6587\u672c\u6587\u4ef6\uff0c\u4ee3\u7801\u4e2d\u53ef\u4ee5\u5728\u4e0d\u4f9d\u8d56\u4e09\u65b9\u5e93\u7684\u60c5\u51b5\u4e0b\u65b9\u4fbf\u5feb\u901f\u7684\u89e3\u6790\u5b83\uff0c\u53ef\u64cd\u4f5c\u6027\u548c\u53ef\u7ef4\u62a4\u6027\u8f83\u9ad8\u3002 \u5404\u4e2a\u5e94\u7528\u4e4b\u95f4\uff0c\u7528\u4f8b\u3001\u65b9\u6cd5\u3001\u6807\u7b7e\u548c\u8d44\u6e90\u90fd\u662f\u76f8\u4e92\u72ec\u7acb\u7684\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u7528\u4f8b\u65f6\u53ea\u9700\u8981\u81ea\u5df1\u5e94\u7528\u4e0b\u7684\u65b9\u6cd5\u548c\u516c\u5171\u5e93\u5373\u53ef\u3002 \u7ed3\u6784\u4e3e\u4f8b\uff1a .\n\u251c\u2500\u2500 apps\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_album # \u5e94\u7528\u540d (\u7528\u4e0b\u5212\u7ebf\u8fde\u63a5\u662f Python \u7f16\u7801\u89c4\u8303)\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_assert # \u65ad\u8a00\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_function_tag.csv # \u7528\u4f8b\u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 asan_cases # \u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases # \u529f\u80fd\u6d4b\u8bd5\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 res # \u6d4b\u8bd5\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config # \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_widget # \u5e94\u7528\u81ea\u5df1\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_widget # \u65b9\u6cd5\u57fa\u7c7b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 other_widget # \u8c03\u7528\u5176\u4ed6\u5e94\u7528\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_camera\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases\n\u2502\u00a0\u00a0 \u2502\u00a0 ...\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 public_widget # \u516c\u5171\u65b9\u6cd5\u5e93\n\u251c\u2500\u2500 config # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n...\n config \u914d\u7f6e\u6a21\u5757\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u76f8\u5e94\u914d\u7f6e\uff0c\u6d4b\u8bd5\u540c\u5b66\u53ef\u4ee5\u6839\u636e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5728 config \u91cc\u9762\u8fdb\u884c\u914d\u7f6e\u3002 \u5168\u5c40\u914d\u7f6e\uff1a \u6267\u884c\u4e00\u4e2a\u6216\u591a\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff1a\u5728 pattern \u91cc\u9762\u5199\u5165\u5e94\u7528\u5305\u540d\uff0c\u591a\u4e2a\u5e94\u7528\u4e4b\u95f4\u7528 or \u8fde\u63a5\uff0c\u5982 deepin-music or deepin-movie\uff1b \u5192\u70df\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a smoke\uff1b \u96c6\u6210\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a core \uff1b \u5168\u91cf\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u4e3a\u7a7a\u5373\u53ef\uff1b \u901a\u8fc7 tags \u7684\u914d\u7f6e\u6bd4\u8f83\u7075\u6d3b\uff0c\u540e\u9762\u6807\u7b7e\u5316\u7ba1\u7406\u7ae0\u8282\u4f1a\u8bb2\u5230\uff0c\u652f\u6301\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u7075\u6d3b\u914d\u7f6e\u3002 \u6307\u5b9a\u67d0\u53f0\u673a\u5668\u5728\u6307\u5b9a\u955c\u50cf\u7248\u672c\u4e0a\u6267\u884c\u7528\u4f8b\uff1a\u5728 IP \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a IP\uff0c\u5e76\u5728 URL \u91cc\u9762\u586b\u5165\u955c\u50cf\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u6846\u67b6\u4f1a\u8c03\u7528 PXE \u8fdb\u884c\u81ea\u52a8\u88c5\u673a\uff0c\u88c5\u673a\u5b8c\u4e4b\u540e\u81ea\u52a8\u5f00\u59cb\u6267\u884c\u914d\u7f6e\u7684\u6d4b\u8bd5\u7528\u4f8b\u3002 \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\uff1a \u6bcf\u4e2a\u5e94\u7528\u5185\u90e8\u4f1a\u6709\u4e00\u4e2a\u5355\u72ec\u7684\u914d\u7f6e\u6a21\u5757\uff0c\u4f1a\u5305\u542b\u4e00\u4e9b\u672c\u5e94\u7528\u7684\u6d4b\u8bd5\u8d44\u6e90\u7684\u8def\u5f84\u3001\u6267\u884c\u7528\u4f8b\u7684\u6807\u7b7e\u914d\u7f6e\u7b49\u7b49\uff0c\u5982\u679c\u5728\u5c40\u90e8\u914d\u7f6e\u91cc\u9762\u914d\u7f6e\u4e86\u7528\u4f8b\u6267\u884c\u6807\u7b7e\uff0c\u800c\u5916\u5c42 runner \u51fa\u6ca1\u6709\u6307\u5b9a\u6267\u884c\u6807\u7b7e\uff0c\u5219\u5728\u6267\u884c\u65f6\u53ea\u4f1a\u6267\u884c\u5c40\u90e8\u914d\u7f6e\u5df2\u914d\u7f6e\u7684\uff0c\u82e5\u5916\u5c42 runner \u4e5f\u914d\u7f6e\u4e86\u6267\u884c\u6807\u7b7e\uff0c\u5219\u4f1a\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u7528\u4f8b\u3002 \u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u914d\u7f6e\u90fd\u5728\u540c\u4e00\u4e2a\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\uff0cpy \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684\u7c7b\uff0cini \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684 option\u3002 \u5168\u5c40\u914d\u7f6e\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u7b56\u7565\u5982\u4e0b\uff1a \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5c40\u90e8\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5e94\u7528\u5c42\uff1arunner \u662f\u6d4b\u8bd5\u6267\u884c\u7684\u5165\u53e3\uff0c\u5b83\u4f1a\u6839\u636e\u914d\u7f6e\u91cc\u9762\u7684\u914d\u7f6e\u9879\uff0c\u8fdb\u884c\u7528\u4f8b\u7684\u52a0\u8f7d\u548c\u6267\u884c\u3002\u5b83\u63d0\u4f9b\u63a5\u53e3\u7ed9\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\uff0c\u5e73\u53f0\u4e0a\u7684\u6307\u4ee4\u5b9e\u9645\u4e0a\u90fd\u662f\u901a\u8fc7\u4e0b\u53d1\u7ed9 runner\uff0c\u7136\u540e\u7531 runner \u6765\u6267\u884c\u76f8\u5e94\u7684\u6d4b\u8bd5\u3002 \u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u662f\u4e00\u4e2a\u524d\u7aef\u7cfb\u7edf\uff0c\u53ef\u4ee5\u8fdb\u884c\u6d4b\u8bd5\u673a\u7ba1\u7406\u3001\u81ea\u52a8\u5b89\u88c5\u955c\u50cf\u3001\u81ea\u52a8\u5b89\u88c5\u6307\u5b9a\u5e94\u7528\u7248\u672c\u3001\u8fdb\u884c\u6d4b\u8bd5\u7528\u4f8b\u8303\u56f4\u9009\u62e9\u3001\u7528\u4f8b\u89e6\u53d1\u6267\u884c\u63a7\u5236\u3001\u7ed3\u679c\u5c55\u793a\u8f93\u51fa\u7b49\u3002 \u4e00\u4e2a\u5e94\u7528\u7684\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\u90fd\u53ef\u4ee5\u5355\u72ec\u89e6\u53d1\u3002 \u517c\u5bb9\u6027\u6d4b\u8bd5\u4e3b\u8981\u901a\u8fc7 PXE \u670d\u52a1\u5668\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u88c5\u673a\uff0c\u7136\u540e\u914d\u5408 AT \u8fdb\u884c\u6d4b\u8bd5\uff0c\u53ef\u4ee5\u5b9e\u73b0\u4e0d\u540c\u7cfb\u7edf\u7248\u672c\u3001\u4e0d\u540c\u5e94\u7528\u7248\u672c\u73af\u5883\u4e0a\u90fd\u53ef\u4ee5\u8fdb\u884c\u81ea\u52a8\u5316\u7684 AT \u6267\u884c\uff0c\u63d0\u9ad8\u517c\u5bb9\u6027\u6d4b\u8bd5\u6548\u7387\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_4","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_2","title":"1\u3001\u7528\u4f8b\u89e3\u8026","text":"\u5b58\u5728\u8026\u5408\u5173\u7cfb\u7684\u65b9\u6cd5\uff1a\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u88ab\u5916\u90e8\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\uff0c\u5219\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u8026\u5408\u5173\u7cfb\u3002 1.1\u3001\u901a\u8fc7\u7f16\u8f91\u5668 Find Usages \u67e5\u770b\u6bcf\u4e2a\u65b9\u6cd5\u88ab\u8c03\u7528\u7684\u8def\u5f84\u548c\u88ab\u8c03\u7528\u6b21\u6570\uff1b 1.2\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 1 \u4e2a\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728\u5916\u90e8\u5e94\u7528\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1b 1.3\u3001\u64cd\u4f5c\u5c42\u6587\u4ef6\u540d\u5747\u4ee5 widget \u7ed3\u5c3e\uff0c\u7c7b\u540d\u4ee5 Widget \u7ed3\u5c3e\uff0c\u5982\uff1a\u6587\u4ef6\u540d music_widget.py \uff1a class MusicWidget:\n\"\"\"\u97f3\u4e50\u7684\u64cd\u4f5c\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_2","title":"2\u3001\u516c\u5171\u5e93\u5efa\u8bbe","text":"2.1\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 2 \u4e2a\u53ca\u4ee5\u4e0a\u7684\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728 public_widget \u76ee\u5f55\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1bpublic_widget \u5373\u4e3a\u516c\u5171\u65b9\u6cd5\u5e93\uff1b 2.2\u3001\u5728\u7528\u4f8b\u5c42\u4fee\u6539\u7528\u4f8b\u4e2d\u7c7b\u7684\u5bfc\u5165\u8def\u5f84\uff0c\u5c5e\u4e8e\u516c\u5171\u65b9\u6cd5\u7684\u5219\u8c03\u7528 public_widget \u4e2d\u7684\u7c7b\uff0c\u5916\u90e8\u5e94\u7528\u7684\u64cd\u4f5c\u65b9\u6cd5\uff0c\u5219\u8c03\u7528\u672c\u5e94\u7528\u76ee\u5f55\u4e0b\u91cd\u5199\u7684\u5916\u90e8\u5e94\u7528\u65b9\u6cd5\u3002 \u6bd4\u5982\uff1a\u51e0\u4e4e\u6240\u6709\u591a\u5a92\u4f53\u5e94\u7528\u90fd\u9700\u8981\u901a\u8fc7\u6587\u7ba1\u52a0\u8f7d\u8d44\u6e90\uff0c\u8c03\u8d77\u7684\u6587\u7ba1\u5bf9\u8bdd\u6846\u5b9e\u9645\u4e3a dde-desktop\uff0c\u56e0\u6b64\u5c06 desktop_widget.py \u653e\u5230 public_widget \u91cc\u9762\uff1a class DdeDesktopPublicWidget:\n\"\"\"\u516c\u5171-\u684c\u9762\u7684\u64cd\u4f5c\u65b9\u6cd5\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3_1","title":"3\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406","text":"3.1\u3001\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1a\u5bf9\u5e94 core\u3001smoke\uff0c\u6216\u4e3a\u7a7a\uff1b \u7528\u4f8b\u6765\u6e90\uff1a\u5bf9\u5e94 PMS \u7528\u4f8b\u6765\u6e90\uff0c\u5206\u522b\u7528 acp1\u3001acp2\u3001acp3\u3001acp4 \u8868\u793a\u3002 acp1 \uff1a\u4e1a\u52a1\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5199\u7684\u7528\u4f8b\uff0c\u88ab\u7528\u4e8e\u9a8c\u6536\u6d4b\u8bd5\u7684\uff1b acp2 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5f15\u5165\u7684\u4ea7\u54c1\u9a8c\u6536\u6d4b\u8bc4\u90e8\u7684\u7528\u4f8b\uff1b acp3 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u6839\u636e\u4ea7\u54c1\u9700\u6c42\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\uff1b acp4 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u901a\u8fc7\u793e\u533a\u3001\u8bba\u575b\u7528\u6237\u53cd\u9988\u95ee\u9898\u603b\u7ed3\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\u3002 \u4e3e\u4f8b\uff1a \u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u7528\u4f8b\u6765\u6e90 001 L1 core acp1 \u6807\u7b7e\u91c7\u7528\u679a\u4e3e\u7684\u65b9\u5f0f\u8fdb\u884c\u4ee3\u53f7\u7ba1\u7406\u65b9\u4fbf\u7ba1\u7406\u4ee5\u53ca\u540e\u7eed\u6269\u5c55\u3002 3.2\u3001\u5728\u6bcf\u4e2a\u5e94\u7528\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u7b2c\u4e00\u5217\u4e3a\u7528\u4f8b\u7684 ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ba1\u7406\u6a21\u5757\u5185\u7684\u7528\u4f8b\u6807\u7b7e\u3002\u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 3.3\u3001\u5bf9\u7167 PMS \u4e0a\u7528\u4f8b\u7b49\u7ea7\u3001\u7528\u4f8b\u7c7b\u578b\u548c\u7528\u4f8b\u6765\u6e90\uff0c\u6807\u8bb0\u6240\u6709\u5df2\u5b9e\u73b0\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u540e\u7eed\u7f16\u5199\u65b0\u589e\u81ea\u52a8\u5316\u7528\u4f8b\u65f6\uff0c\u6bcf\u5199\u4e00\u6761\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684 csv \u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u6b64\u6761\u7528\u4f8b\u7684\u6807\u7b7e\u3002 3.4\u3001\u8df3\u8fc7\u7528\u4f8b\u6807\u7b7e\u5316 \u73b0\u6709\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a\uff1a \u4e3e\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u8bb0\u4e3a \u201cskip-\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u8bb0\uff0c\u5982\u679c\u5df2\u7ecf\u6807\u8bb0\u4e86\u8df3\u8fc7\u539f\u56e0\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u8bb0\u4e3a SKIPED\uff0c\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\u3002 \u6240\u6709\u7684\u6807\u7b7e\u5728 docs \u76ee\u5f55\u4e0b\u4f1a\u6709\u4e00\u4e2a\u6587\u6863\uff0c\u6587\u6863\u6682\u5b9a\u540d\u79f0\u4e3a\uff1atags_info.md\uff0c\u7528\u4e8e\u8bf4\u660e\u73b0\u5728\u5df2\u7ecf\u4f7f\u7528\u5230\u7684\u6807\u7b7e\uff0c\u4ee5\u53ca\u8fd9\u4e9b\u6807\u7b7e\u7684\u89e3\u91ca\u548c\u7528\u6cd5\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#4","title":"4\u3001\u7528\u4f8b\u6267\u884c","text":"4.1\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u7684\u9a71\u52a8\u6267\u884c\u903b\u8f91\u529f\u80fd\u5b9e\u73b0 \u5f00\u53d1\u6839\u636e\u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\u91cc\u9762\u7684\u7528\u4f8b\u6807\u7b7e\u6267\u884c\u5bf9\u5e94\u7528\u4f8b\u7684\u529f\u80fd\uff0c\u80fd\u652f\u6301\u591a\u4e2a\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u6267\u884c\u5165\u53e3\u80fd\u968f\u610f\u901a\u8fc7\u7528\u4f8b\u6807\u7b7e\u6307\u5b9a\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002 \u7528\u4f8b\u6807\u7b7e\u7684\u9a71\u52a8\u65b9\u5f0f\u5fc5\u987b\u80fd\u652f\u6301\u6807\u7b7e\u7684\u6269\u5c55\uff0c\u672a\u6765\u968f\u7740\u4e1a\u52a1\u7684\u53d8\u5316\u53ef\u80fd\u9700\u8981\u589e\u52a0\u5404\u79cd\u5404\u6837\u7684\u6807\u7b7e\u3002 4.2\u3001\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u6267\u884c \u529f\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u3001\u6027\u80fd\u6d4b\u8bd5\u7b49\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u662f\u5206\u5f00\u6267\u884c\u7684\uff0c\u4e5f\u5c31\u662f\u5728\u4e00\u6b21\u6267\u884c\u4e2d\uff0c\u53ea\u80fd\u6267\u884c\u5176\u4e2d\u4e00\u79cd\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5177\u4f53\u8981\u6267\u884c\u54ea\u4e00\u79cd\u540c\u6837\u901a\u8fc7\u53c2\u6570\u6765\u63a7\u5236\u3002 4.3\u3001\u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c \u7531\u4e8e\u6d4b\u8bd5\u673a\u8d44\u6e90\u6709\u9650\uff0c\u968f\u7740\u81ea\u52a8\u5316\u7528\u4f8b\u6570\u91cf\u7684\u589e\u52a0\uff0cCI \u6267\u884c\u65f6\u95f4\u4f1a\u8d8a\u6765\u8d8a\u957f\u3002 \u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c\u7684\u529f\u80fd\uff1a \u540c\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\u5206\u6563\u5230\u4e0d\u540c\u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u4e0a\u6267\u884c\uff0c\u7f29\u77ed\u6267\u884c\u603b\u65f6\u95f4\uff1b \u7b2c\u4e8c\u5929\u8dd1\u7684\u65f6\u5019\u540c\u4e00\u4e2a\u673a\u5668\u4e0a\u4f1a\u6267\u884c\u6628\u5929\u6ca1\u6709\u6267\u884c\u5230\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u6267\u884c\u540c\u7406\uff1b \u53ef\u4ee5\u5b9e\u73b0\u5728\u5168\u67b6\u6784\u6d4b\u8bd5\u673a\u4e0a\u8f6e\u6d41\u6267\u884c\u7528\u4f8b\uff0c\u65e2\u80fd\u4fdd\u8bc1\u6267\u884c\u4e86\u6240\u6709\u7684\u7528\u4f8b\uff0c\u53c8\u80fd\u5728\u8d44\u6e90\u6709\u9650\u7684\u60c5\u51b5\u4e0b\u8986\u76d6\u4e86\u6240\u6709\u7684\u67b6\u6784\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#5","title":"5\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0","text":"5.1\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u4f5c\u4e3a\u524d\u7aef\u754c\u9762\u7cfb\u7edf\uff0c\u901a\u8fc7\u9875\u9762\u4e0a\u7684\u4e00\u4e9b\u529f\u80fd\u9009\u9879\u8fdb\u884c\u5bf9\u5e94\u6d4b\u8bd5\u4efb\u52a1\u7684\u7ba1\u7406\u6216\u89e6\u53d1\uff0c\u4e1a\u5185\u6bd4\u8f83\u6d41\u884c\u7684\u5b9e\u73b0\u65b9\u6848\u662f\u4f7f\u7528 Vue + DRF \u5b9e\u73b0\u4e00\u4e2a\u524d\u540e\u7aef\u5206\u79bb\u7684\u7cfb\u7edf\u3002 \u6d4b\u8bd5\u5e73\u53f0\u53ef\u80fd\u4f1a\u6d89\u53ca\u5230\u7684\u6a21\u5757\u6709\uff1a\u6d4b\u8bd5\u673a\u8d44\u6e90\u7ba1\u7406\u6a21\u5757\u3001\u7528\u4f8b\u6267\u884c\u63a7\u5236\u6a21\u5757\u3001\u7ed3\u679c\u5c55\u793a\u6a21\u5757\u3001PXE \u955c\u50cf\u5b89\u88c5\u6a21\u5757\u7b49\u3002 \u7528\u6237\uff08\u6d4b\u8bd5\u3001\u7814\u53d1\u540c\u5b66\u7b49\uff09\u53ef\u4ee5\u914d\u7f6e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5982\u6267\u884c\u54ea\u4e2a\u5e94\u7528\u3001\u6267\u884c\u7528\u4f8b\u7684\u8303\u56f4\u3001\u5728\u54ea\u53f0\u673a\u5668\u4e0a\u6267\u884c\u3001\u955c\u50cf\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u5e94\u7528\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u6267\u884c\u65f6\u95f4\u3002 5.2\u3001\u6267\u884c\u5165\u53e3 runner \u63d0\u4f9b\u7ed9\u6d4b\u8bd5\u5e73\u53f0\u7684\u63a5\u53e3\u5305\u62ec\uff1a\u7528\u4f8b\u6267\u884c\u63a5\u53e3\u3001\u7ed3\u679c\u8fd4\u56de\u63a5\u53e3\u3001\u955c\u50cf\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u955c\u50cf\u5b89\u88c5\u63a5\u53e3\u3001\u5e94\u7528\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u5e94\u7528\u5b89\u88c5\u66f4\u65b0\u63a5\u53e3\u7b49\u3002 \u524d\u7aef\u5e73\u53f0\u76ee\u524d\u8fd8\u6ca1\u6709\u592a\u591a\u8be6\u7ec6\u7684\u65b9\u6848\uff0c\u672c\u6b21\u8bbe\u8ba1\u4e3b\u8981\u96c6\u4e2d\u5728\u540e\u7aef\u8fd9\u90e8\u5206\u67b6\u6784\u7684\u8bbe\u8ba1\u4e0a\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_5","title":"\u56db\u3001\u5b9e\u65bd\u8ba1\u5212","text":"\u8fd1\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u6587\u7ba1\u4ee3\u7801\u89e3\u8026 2022/3/28 2022/4/8 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u56fe\u5f62\u56fe\u50cf\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u97f3\u89c6\u9891\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5168\u5c40\u641c\u7d22\u4ee3\u7801\u89e3\u8026 2022/4/25 2022/4/26 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u516c\u5171\u5e93\u5efa\u8bbe 2022/4/27 2022/5/5 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5c01\u88c5\u7684\u65b9\u6cd5\u6574\u7406\u6210\u4e00\u4e2a\u8868 2022/5/6 2022/5/10 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7528\u4f8b\u6807\u7b7e\u5206\u7c7b\u8bc4\u4f30 2022/5/11 2022/5/11 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u6807\u7b7e\u5316\u6267\u884c\u9a71\u52a8\u7a0b\u5e8f\u7f16\u5199 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u9700\u5b9e\u73b0\u81ea\u52a8\u89e3\u6790 csv \u8868\u683c\u4e2d\u7684\u7528\u4f8b\u7f16\u53f7 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u722c\u866b\u811a\u672c\uff0c\u722c\u53d6 pms \u4e0a\u7528\u4f8b\u7684\u6807\u7b7e 2022/5/11 2022/5/13 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u5b9a\u65f6\u81ea\u52a8\u7ef4\u62a4\u672c\u5730 csv \u6587\u4ef6\u811a\u672c 2022/5/11 2022/5/20 \u4e2d\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u76ee\u5f55\u7ed3\u6784\u8c03\u6574 2022/5/20 2022/6/2 \u5b8c\u6210\u5168\u5c40\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u5177\u4f53\u65b9\u6848\u548c\u903b\u8f91\u5b9e\u73b0 2022/6/6 2022/6/17 \u9759\u6001\u626b\u63cf\u95ee\u9898\u6e05\u96f6 2022/6/20 2022/7/1 \u5b8c\u6210\u65b0\u6846\u67b6\u4f7f\u7528\u57f9\u8bad 2022/7/4 2022/7/11 \u843d\u5730\u8fd0\u884c 2022/7/12 2022/7/20 \u5e95\u5c42\u5e93\u7528\u9014\u8bf4\u660e\u6587\u6863\u7f16\u5199 2022/7/21 2022/7/28"}]} \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz index 8ffaebc1..e0b7bbfc 100644 Binary files a/sitemap.xml.gz and b/sitemap.xml.gz differ diff --git "a/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" "b/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" index 25f669d5..97100667 100644 --- "a/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" +++ "b/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs @@ -1215,8 +1215,7 @@ 智能化功能测试# Attribution :chengdu Test Team # Date :2021/08/20 -此方案仍在演进中 -此方案仍在演进中 +此方案仍在演进中 仓库地址:https://gitlabcd.uniontech.com/autotest/cd-desktop-aitest 一、方案概述¶ 基于深度学习智能识别应用的元素控件,用于在自动化测试操作过程中的元素定位以及判断结果时的断言处理;自动化测试过程中,测试机上的画面通过采集盒传输到服务器上,服务器对视频画面进行智能识别后,服务器智能判断用例是否执行成功,然后对测试机下发下一步操作指令,测试机接受并执行下一步操作。 diff --git "a/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" "b/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" index cdf9ccde..06c9e9a5 100644 --- "a/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" +++ "b/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" @@ -95,7 +95,7 @@ - + @@ -226,7 +226,7 @@ - + YouQu Docs diff --git "a/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" "b/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" index 121b4507..72123668 100644 --- "a/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" +++ "b/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs @@ -752,6 +752,13 @@ + + + + + 4、虚拟化部署 + + @@ -1661,6 +1668,13 @@ + + + + + 4、虚拟化部署 + + @@ -2604,18 +2618,12 @@ 1、标签说明流水线使用指导; 跳过原因:skip-XXX,用于控制用例是否执行; 确认修复:fixed-XXX,用于标记用例的修复状态(后面详细讲解用法); @@ -2629,26 +2637,30 @@ 1、标签说明PMS用例ID 用例级别 用例类型 +设备类型 +用例来源 上线对象 测试级别 跳过原因 确认修复 -废弃用例 -... +废弃用例 +... -001 +679537 679537 L1 FUNC +PPL + CICD C1 skip-XXX fixed-XXX -removed-已废弃 -... +removed-已废弃 +... @@ -2656,7 +2668,7 @@ 2、操作步骤csv 的文件名。 例如: -相册的用例文件为 test_album_xxx.py,xxx 表示任意三位数字代表用例序号,此时 csv 文件名就应为 album.csv; +相册的用例文件为 test_album_xxx.py,xxx 表示用例的ID(也可以是自定义的数字代表用例序号),此时 csv 文件名就应为 album.csv; 对于用例规模比较大的应用,比如文件管理器,建议分模块,每个模块建立一个 csv 文件,所有 csv 文件建议放在一个 tags 目录下。 是否分模块维护 csv 取决于应用的用例复杂度,同时我们应该充分考虑后期的可维护性,csv 文件太多了也是一个很糟糕的事情。 @@ -2677,7 +2689,7 @@ 3.1.1、固定跳过001 +679537 ... skip-受到某新需求影响 @@ -2742,7 +2754,7 @@ 3.2、确认修复001 +679537 ... skip-受到某新需求影响 fixed-已修复 @@ -2787,7 +2799,7 @@ 3.3、废弃用例4、设计思路¶ 上面介绍 Pytest 框架提供的标签功能 mark,使用时需要为每一个用例添加标签装饰器,则操作复杂,可维护性差,其根本问题就是标签分散在每一条用例的装饰器上,难以集中维护;于是乎将所有标签使用 csv 文件进行集中管理,并通过 Pytest 的钩子函数,读取 csv 文件,动态添加标签到用中。 5、CSV文件格式¶ -此配置文件需要维护大量的标签数据,且要方便能使用Excel打开进行编辑查看,更重要的是我们不想引入三方依赖,CSV 文件几乎是唯一能满足所有的要求的文件格式。 +此配置文件需要维护大量的标签数据,且要方便能使用 Excel 打开进行编辑查看,更重要的是我们不想引入三方依赖,CSV 文件几乎是唯一能满足所有的要求的文件格式。 七、日志系统¶ 1、背景¶ 基于 YouQu 自动化测试框架操作方法封装写法,通常是这样的:类里面一个函数只包含一个操作或多次调用的一系列可合并的操作; @@ -2888,7 +2900,7 @@ 1、原则 大文件不能上传到工程里面,保持整个工程的轻量化,这样在克隆代码的时候才能非常快速方便使用,我们见过一个 AT 工程 clone 大小达到好几个 G,简直不可思议。 其实代码文件的大小是很小的,也就是说,纯写代码随便写工程也不会太大,而文档(包含插图)等资源却是很占空间。 -因此我们选择将 YouQu 的文档工程单独迁出到独立的仓库 youqu-docs 。 +因此我们选择将 YouQu 的文档工程涉及到的图片资源都采用外链加载; 2、安装¶ 项目根目录下运行 env.sh 即可。 bash env.sh @@ -2930,17 +2942,25 @@ 3.2、裁剪依赖bash env_dev.sh +4、虚拟化部署¶ +YouQu默认采用虚拟化部分,虚拟化环境实际安装的位置是在 $HOME/.local/share/virtualenvs/youqu-oHTM7l7G 目录下 +youqu-oHTM7l7G 此目录名称前面部分是你的代码根目录的名称,后面部分是生成的随机字符串; +同学们在远程机器上定位问题的时候,如果使用 Pycharm 调试,就将解释器指定到这个目录的就行了; +当然,我们也提供了本机开发环境部署: +bash env_dev.sh + +如果你是本地开发环境可以用它,区别就是驱动执行的时候使用:python3 manage.py xxx 九、失败录屏¶ 录屏其实是一种视频形式的日志,因为很多时候我们在查看日志之后仍然无法准确的定位到用例失败的具体原因,因此用例的录屏能让我们看到用例在执行过程; 【使用方法】 在 globalconfig.ini 里面配置关注 2 个参数; -;失败用例重跑次数 -RERUN = 1 - -;失败录屏从第几次开始录制视频。 -;比如 RECORD_FAILED_CASE = 1 ,表示用例第1次执行失败之后开始录屏。 -;注意,用例失败重跑的次数不能小于失败录屏次数,即 RERUN >= RECORD_FAILED_CASE -RECORD_FAILED_CASE = 1 +;失败用例重跑次数 +RERUN = 1 + +;失败录屏从第几次开始录制视频。 +;比如 RECORD_FAILED_CASE = 1 ,表示用例第1次执行失败之后开始录屏。 +;注意,用例失败重跑的次数不能小于失败录屏次数,即 RERUN >= RECORD_FAILED_CASE +RECORD_FAILED_CASE = 1 默认失败重跑的次数是 1 次; RECORD_FAILED_CASE = 1 表示用例第1次执行失败之后开始录屏; @@ -2953,48 +2973,48 @@ 十、Wayland 适配简单讲就是,应用库只需要维护一套用例脚本即可。 【用例兼容】 因为 Wayland 下有些应用的界面显示和功能本身存在一些差异,用例层可能需要对这部分用例做逻辑判断,使用全局配置里面的常量进行逻辑编写即可: -from setting.globalconfig import GlobalConfig - -# GlobalConfig.IS_WAYLAND 获取到当前的显示服务器(bool) -# 应用库 Config 继承 GlobalConfig -if Config.IS_WAYLAND: - pass -if Config.IS_X11: - pass +from setting.globalconfig import GlobalConfig + +# GlobalConfig.IS_WAYLAND 获取到当前的显示服务器(bool) +# 应用库 Config 继承 GlobalConfig +if Config.IS_WAYLAND: + pass +if Config.IS_X11: + pass 比如用例里面如果断言的图片不同: -if Config.IS_WAYLAND: - self.assert_image_exist("wayland_XXX") -else: - self.assert_image_exist("x11_XXX") +if Config.IS_WAYLAND: + self.assert_image_exist("wayland_XXX") +else: + self.assert_image_exist("x11_XXX") 这样这条用例脚本在 Wayland 和 X11 下都可以跑,so easy 是不是?完全没必要专门拉新分支进行 Wayland 适配。 十一、测试报告¶ 1. 目录结构¶ 执行时会在根目录下动态生成 report 目录,所有的报告相关的文件会统一存放在里面,示例: -/report - ├── allure # allure报告 - │ ├── ... - │ └── ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json - ├── allure_html # 生成的html报告 - │ ├── ... - │ └── index.html - ├── allure_back # allure报告备份 - │ └── 20221108114823 - │ ├── ... - │ └── f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json - ├── json # json报告 - │ ├── ... - │ └── result_deepin-music_20221109134736_1081333.json - ├── logs # 日志文件 - │ ├── 2022-11-10_debug.log - │ └── 2022-11-10_error.log - ├── record # 录屏 - │ └── 2022-11-09 - │ ├── ... - │ └── 15时14分09秒_test_music_303_2_autotest.mp4 - └── xml # xml报告 - └── autotest_deepin_music-20221109134736.xml +/report + ├── allure # allure报告 + │ ├── ... + │ └── ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json + ├── allure_html # 生成的html报告 + │ ├── ... + │ └── index.html + ├── allure_back # allure报告备份 + │ └── 20221108114823 + │ ├── ... + │ └── f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json + ├── json # json报告 + │ ├── ... + │ └── result_deepin-music_20221109134736_1081333.json + ├── logs # 日志文件 + │ ├── 2022-11-10_debug.log + │ └── 2022-11-10_error.log + ├── record # 录屏 + │ └── 2022-11-09 + │ ├── ... + │ └── 15时14分09秒_test_music_303_2_autotest.mp4 + └── xml # xml报告 + └── autotest_deepin_music-20221109134736.xml 默认情况下同时生成 html、xml、json三种形式的报告。 2. 定制报告¶ @@ -3011,14 +3031,14 @@ 3. 查看报告allure open report/allure_html +allure open report/allure_html 使用 manage.py 执行完之后,在终端的最后一行,我们会给你输出打开报告的命令,直接复制它在终端执行就可以查看了,像这样: - 终端执行命令: allure open /tmp/youqu/report/allure_html 查看报告 + 终端执行命令: allure open /tmp/youqu/report/allure_html 查看报告 你也可以直接在 Pycharm 里面找到 index.html 文件,然后右键选择浏览器打开,或者你可以用一个 http 服务打开。 你也可以直接在 report/allure 目录下查看报告: - allure serve report/allure + allure serve report/allure 远程执行 @@ -3031,48 +3051,48 @@ 1. 提前解决代码问题这里推荐一个 Python 社区流行的代码格式化工具: Black,号称不妥协的代码格式化工具,它检测到不符合规范的代码风格直接就帮你全部格式化好,就是这么刚! 安装: -sudo pip3 install black +sudo pip3 install black 使用方法: -black ${CheckPath} +black ${CheckPath} 使用这个工具格式化之后,代码会被自动调整,刚开始你可能会觉得调整得很夸张,没关系坚持看,习惯之后,你会觉得很优雅,没错,这就是 Pythonic Code 的核心,请保持优雅~。 2. 代码扫描工具¶ 使用根目录下 pylint.sh 扫描代码,在 report 目录下查看代码扫描报告,如果有代码问题请提前解决之后再提交。 此脚本已经使用 Python 社区最流行的代码扫描工具 Pylint 进行代码扫描。 使用方法: -bash pylint.sh +bash pylint.sh 运行之后会提示你要扫描的目录,比如输入 apps ,则会扫描 apps 下的所有 Python 代码。 在 setting/pylintrc.cfg 配置文件里面进行相关配置,扫描完成之后在 report/pylints 目录下会生成扫描报告。 代码提交需通过 git review 提交到 gerrit ,人工 Code Review 通过之后合入代码。 十三、提交代码¶ 1. 安装依赖¶ -sudo apt install git-review +sudo apt install git-review 2. 提交模板¶ 在 ~ 目录下新建文件,并命名为 gitcommit_template 将以下内容写入文件当中: -# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 -fix: - -# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 -Description: - -# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 -Log: - -# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 -#Bug: - -# 修复 github issue -#Issue: - -# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 -#Task: +# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 +fix: + +# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 +Description: + +# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 +Log: + +# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 +#Bug: + +# 修复 github issue +#Issue: + +# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 +#Task: 命令行执行: -git config --global commit.template ~/gitcommit_template +git config --global commit.template ~/gitcommit_template 此命令将模板加入到 git 的提交模板中。 后续提交的时候需要关注一下几点: @@ -3083,19 +3103,19 @@ 2. 提交模板3. 推送代码¶ 首先添加 commit 信息 -git add 后面加文件名称 +git add 后面加文件名称 -git add . # 表示添加所有文件 +git add . # 表示添加所有文件 使用这条命令注意有些临时文件不要提交到仓库了。 -git commit -a +git commit -a 之后在 fix: 后面(注意冒号后面必须加空格,不然直接-1)写本地提交的 commit 信息,然后就可以提交代码了 -git review branch(当前分支) -r origin +git review branch(当前分支) -r origin 最好一次 commit,一次 git review ,经常有同学在本地疯狂 commit 最后 git review 报错不知道咋回事儿。 若不想每次提交都加上 -r 选项,执行以下命令: -git config --global gitreview.remote origin +git config --global gitreview.remote origin 提交代码,直接使用 git review branch<目标分支>,例如 git review master 4. Git标签¶ @@ -3106,74 +3126,74 @@ 4. Git标签git tag -a <tagname> +git tag -a <tagname> 回车之后,Git 会打开你的编辑器,让你写一句标签注解,就像你给提交写注解一样。 查看所有标签 -git tag -l -# git tag 也行 +git tag -l +# git tag 也行 删除标签 -git tag -d <tagname> +git tag -d <tagname> 推送标签至远程 git push 命令并不会传送标签到远程仓库服务器上,必须显式地推送标签。 -git push origin <tagname> +git push origin <tagname> 推送所有不在远程仓库服务器上的标签 -git push origin --tag +git push origin --tag 删除远程标签 -git push origin :refs/tag/<tagname> +git push origin :refs/tag/<tagname> 后期打标签 先用 git log --pretty=oneline 查询提交记录,获取校验码。 -git tag -a <tagname> 9fceb02(校验码) +git tag -a <tagname> 9fceb02(校验码) 检出标签 -git checkout <tagname> +git checkout <tagname> 此时,仓库会处于“分离头指针(detached HEAD)”的状态。 在“分离头指针”状态下,如果你做了某些更改然后提交它们,标签不会发生变化, 但你的新提交将不属于任何分支,并且将无法访问,除非通过确切的提交哈希才能访问。 因此,如果你需要进行更改,比如你要修复旧版本中的错误,那么通常需要创建一个新分支: -git checkout -b <NewBranchName> <tagname> +git checkout -b <NewBranchName> <tagname> 新分支上可以进行提交代码。 十四、常见问题¶ 1. 提交代码时提示邮箱或者名称不对¶ 重新配置邮箱或者名称,然后重置生效: -git commit --amend --reset-author +git commit --amend --reset-author 2. 怎么回滚到之前的版本¶ (1)查询历史提交记录 -git log +git log 找到你要回滚的版本,复制 hash 值。 注意:是 commit 空格之后的 hash 值,之前有同学复制的 Change-Id: 这样肯定报错。 (2)回滚版本,不清除代码 -git reset --soft ${hash} +git reset --soft ${hash} (3)回滚版本,清除代码,慎用哈 -git reset --hard ${hash} +git reset --hard ${hash} 3. 测试报告里面 F S . E 是什么意思¶ F 表示失败,. (点)表示通过,S 表示跳过,E 表示 error 有报错 4. 解决 git status 中文显示的问题¶ -git config --global core.quotePath false +git config --global core.quotePath false 5. apps 目录下颜色有些是黄色的¶ 在 Pycharm 中 apps 目录下应用库文件是黄色的,编辑器识别不到代码新增和修改; @@ -3184,22 +3204,22 @@ 5. apps 目录下颜色有些是黄色的6. 执行 env.sh 报错 $'\r':未找到命令¶ 出现这个问题你应该是在 windows 上打开或编辑过 env.sh 脚本,windows下的换行是回车符+换行符,也就是\r\n,而 Linxu 下是换行符 \n,Linux 下不识别 \r,因此报错。 解决方案: -# 将 \r 替换为空 -sudo sed -i 's/\r//' env.sh +# 将 \r 替换为空 +sudo sed -i 's/\r//' env.sh 7.怎样为单独某一条用例配置执行超时时间¶ 在用例脚本中添加装饰器,如下: -@pytest.mark.timeout(300) # 单位秒 -def test_xxx_001(): - pass +@pytest.mark.timeout(300) # 单位秒 +def test_xxx_001(): + pass 8. 如何拉取 YouQu 自动化项目所有代码,包含子仓库¶ 前置条件:已申请访问 YouQu 权限群组 -# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) -git config --global credential.helper store - -# 拉取YouQu框架代码,并递归拉取子仓库代码 -git clone "http://gerrit.uniontech.com/youqu" --recursive +# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) +git config --global credential.helper store + +# 拉取YouQu框架代码,并递归拉取子仓库代码 +git clone "http://gerrit.uniontech.com/youqu" --recursive 9. 如何拉取 YouQu 自动化项目中指定子仓库的代码¶ 前置条件: @@ -3207,22 +3227,22 @@ 9. 如何拉取 YouQu 自动化项目中指定子仓库的代 已申请访问 YouQu 权限群组 已存储访问密码 -# 拉取YouQu框架代码 -git clone "http://gerrit.uniontech.com/youqu" - -# 指定拉取子仓库代码 -cd youqu -git submodule update --init apps/autotest_xxx_xxx +# 拉取YouQu框架代码 +git clone "http://gerrit.uniontech.com/youqu" + +# 指定拉取子仓库代码 +cd youqu +git submodule update --init apps/autotest_xxx_xxx 10. 如何更新 YouQu 自动化项目中,所有子仓库的代码¶ 更新所有子仓库代码 -cd youqu -git pull & git submodule foreach git pull +cd youqu +git pull & git submodule foreach git pull 11. 如何修复 YouQu 所有子仓库 master 分支游离头(detached head)¶ 修复所有子仓库默认master 分支游离头 -cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
PMS_USER = PMS账号 +PMS_PASSWORD = PMS密码 +SEND_PMS = finish +TASK_ID = 测试单ID +TRIGGER = hand +APP_NAME =
后续手动回填方法:
youqu manage.py pms --send2task yes +youqu manage.py pms --send2task yes 可能遇到的问题¶ 由同学可能会发现,怎么回填一次之后,后面想再次回填就不生效了; @@ -1292,62 +1383,62 @@ 可能遇到的问题2.4. 导出 CSV 文件¶ 框架提供导出指定标签用例的功能: -youqu manage.py exportcsv -a deepin-album -t CICD +youqu manage.py exportcsv -a deepin-album -t CICD 表示导出 deepin-album 的用例中标记了 CICD 标签的用例,导出 CSV 文件的字段格式已经适配了 CICD 的要求。 2.5. 脚手架新建 APP 工程¶ 新建一个 APP 工程: -youqu manage.py startapp autotest_deepin_some +youqu manage.py startapp autotest_deepin_some 这样在 apps 目录下会创建一个子项目工程 autotest_deepin_some,同时新建好工程模板目录和模板文件: -apps -└── autotest_deepin_some - ├── case - │ ├── assert_res - │ │ └── readme - │ ├── base_case.py - │ └── __init__.py - ├── config.ini - ├── config.py - ├── conftest.py - ├── control - ├── deepin_some_assert.py - ├── deepin_some.csv - ├── __init__.py - └── widget - ├── base_widget.py - ├── case_res - │ └── readme - ├── deepin_some_widget.py - ├── __init__.py - ├── other.ini - ├── other_widget.py - ├── pic_res - │ └── readme - └── ui.ini +apps +└── autotest_deepin_some + ├── case + │ ├── assert_res + │ │ └── readme + │ ├── base_case.py + │ └── __init__.py + ├── config.ini + ├── config.py + ├── conftest.py + ├── control + ├── deepin_some_assert.py + ├── deepin_some.csv + ├── __init__.py + └── widget + ├── base_widget.py + ├── case_res + │ └── readme + ├── deepin_some_widget.py + ├── __init__.py + ├── other.ini + ├── other_widget.py + ├── pic_res + │ └── readme + └── ui.ini autotest_deepin_some 是你的工程名称,比如:autotest_deepin_music ; 在此基础上,你可以快速的开始你的 AT 项目。 2.6. 用例标签自动同步¶ 用于自动同步 PMS 用例标签数据至本地 CSV 文件,主要通过以下几个配置来控制: -APP_NAME = # 指定要同步的应用名称 -PMS_USER = # PMS的用户名 -PMS_PASSWORD = # PMS的密码 +APP_NAME = # 指定要同步的应用名称 +PMS_USER = # PMS的用户名 +PMS_PASSWORD = # PMS的密码 在 [csv_link_pms_id] 节点下指定 csv 文件名与 PMS 用例模块的对应关系,比如: -[csv_link_pms_id] -;同步PMS数据到本地CSV文件,必须要配置的配置项 -;key是本地CSV文件的文件名称; -;value是对应PMS上的模块ID; -;比如要同步音乐的数据, 首先需要将配置 APP_NAME = deepin-music, -;CSV文件名称为music.csv,其在PMS上的用例为: https://pms.uniontech.com/testcase-browse-53.html -;因此应该配置为: music = 53 -;这样才能将PMS与本地CSV文件建立联系。 -;如果你的应用分了很多模块,只需要将对应的信息依次配置好就行了。 -music = 53 +[csv_link_pms_id] +;同步PMS数据到本地CSV文件,必须要配置的配置项 +;key是本地CSV文件的文件名称; +;value是对应PMS上的模块ID; +;比如要同步音乐的数据, 首先需要将配置 APP_NAME = deepin-music, +;CSV文件名称为music.csv,其在PMS上的用例为: https://pms.uniontech.com/testcase-browse-53.html +;因此应该配置为: music = 53 +;这样才能将PMS与本地CSV文件建立联系。 +;如果你的应用分了很多模块,只需要将对应的信息依次配置好就行了。 +music = 53 将以上信息配置好之后,在命令行执行: -youqu manage.py pms --pms2csv yes +youqu manage.py pms --pms2csv yes 每次执行时原 csv 文件会自动备份在 report/csv_back 目录下,因此你不用担心脚本执行导致你的数据丢失。 diff --git a/search/search_index.json b/search/search_index.json index 91ebe84c..c7cfc7a2 100644 --- a/search/search_index.json +++ b/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\u200b\\u3000\\-\u3001\u3002\uff0c\uff0e\uff1f\uff01\uff1b]+","pipeline":["stemmer"]},"docs":[{"location":"","title":"\u9996\u9875","text":""},{"location":"#youqu","title":"\u6709\u8da3\uff08YouQu\uff09","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/4/1\n# Author : Mikigo\n# =============================================\n \u672c\u7ad9\u603b\u8bbf\u95ee\u91cf \u6b21 \u6b22\u8fce\u5728\u6d4f\u89c8\u5668\u8bbf\u95ee\u3010\u516c\u7f51\u6587\u6863\u3011 \u7edf\u4fe1\u516c\u53f8\u5185\u7f51\u8fd8\u53ef\u4ee5\u8bbf\u95ee\u3010\u5185\u7f51\u6587\u6863\u3011\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u54e6~~"},{"location":"#_1","title":"\u4e00\u3001\u7b80\u4ecb","text":"\u6709\u8da3\uff08YouQu\uff09\u662f\u6df1\u5ea6\u79d1\u6280\u8bbe\u8ba1\u548c\u5f00\u53d1\u7684\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff0c\u91c7\u7528\u7ed3\u6784\u5206\u5c42\u7684\u8bbe\u8ba1\u7406\u5ff5\uff0c\u652f\u6301\u591a\u5143\u5316\u5143\u7d20\u5b9a\u4f4d\u548c\u65ad\u8a00\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\u3001\u5f3a\u5927\u7684\u65e5\u5fd7\u548c\u62a5\u544a\u8f93\u51fa\u7b49\u7279\u8272\u529f\u80fd\uff0c\u540c\u65f6\u5b8c\u7f8e\u517c\u5bb9X11\u3001Wayland\u663e\u793a\u534f\u8bae\uff0c\u73af\u5883\u90e8\u7f72\u7b80\u5355\uff0c\u64cd\u4f5c\u6613\u4e0a\u624b\u3002"},{"location":"#17","title":"\u7231\u4e0a \u201c\u6709\u8da3\u201d \u7684 17 \u4e2a\u7406\u7531","text":" \u6838\u5fc3\u5e93\u63d0\u4f9b\u4e86\u7edf\u4e00\u7684\u63a5\u53e3\uff0c\u7f16\u5199\u65b9\u6cd5\u65f6\u53ea\u9700\u8981\u5bfc\u5165\u4e00\u4e2a\u5305\u5c31\u53ef\u4ee5\u4f7f\u7528\u5230\u6838\u5fc3\u5e93\u63d0\u4f9b\u7684\u6240\u6709\u529f\u80fd\uff1b \u516c\u5171\u5e93\u5c01\u88c5\u4e86\u5f88\u591a\u5e38\u7528\u6a21\u5757\u7684\u76f8\u5173\u65b9\u6cd5\uff0c\u6bd4\u5982\uff1a\u4efb\u52a1\u680f\u7684\u64cd\u4f5c\u3001\u684c\u9762\u7684\u64cd\u4f5c\u3001\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\u7b49\u7b49\uff1b \u9664\u4e86\u5e38\u7528\u7684\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u8bc6\u522b\u4ee5\u5916\uff0c\u6211\u4eec\u8fd8\u63d0\u4f9b\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u5176\u4f7f\u7528\u7b80\u5355\u4e14\u9ad8\u6548\uff0c\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff1b \u5bf9\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u5c06\u7f16\u5199\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u53d8\u5f97\u7b80\u5355\u800c\u4f18\u96c5\uff1b \u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u6280\u672f\u8fdb\u884c\u529f\u80fd\u5347\u7ea7\uff0c\u9664\u4e86\u652f\u6301\u5355\u4e2a\u5750\u6807\u8fd4\u56de\uff0c\u8fd8\u652f\u6301\u540c\u4e00\u754c\u9762\u4e0b\u591a\u4e2a\u76f8\u540c\u5143\u7d20\u8fd4\u56de\u591a\u4e2a\u5750\u6807\u7684\u529f\u80fd\uff1b \u63d0\u4f9b\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u548c\u6279\u91cf\u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u4e0d\u5230\u4e00\u4e2a csv \u6587\u4ef6\u539f\u6765\u80fd\u5e72\u8fd9\u4e48\u591a\u4e8b\u60c5\uff1b \u63d0\u4f9b\u4e86\u529f\u80fd\u5f3a\u5927\u7684\u6267\u884c\u5668\u5165\u53e3\uff0c\u8ba9\u4f60\u53ef\u4ee5\u65b9\u4fbf\u7684\u5728\u672c\u5730\u6267\u884c\u4efb\u4f55\u7528\u4f8b\u96c6\u7684\u7528\u4f8b\uff0c\u5176\u4e30\u5bcc\u7684\u81ea\u5b9a\u4e49\u914d\u7f6e\u9879\uff0c\u6ee1\u8db3\u4f60\u5bf9\u6267\u884c\u5668\u6240\u6709\u7684\u5e7b\u60f3\uff1b \u63d0\u4f9b\u8fdc\u7a0b\u6267\u884c\u7684\u529f\u80fd\uff0c\u53ef\u4ee5\u63a7\u5236\u591a\u53f0\u673a\u5668\u5e76\u884c\u8dd1\uff0c\u6216\u8005\u5206\u5e03\u5f0f\u8dd1\uff0c\u8fd9\u79cd\u4ed8\u8d39\u529f\u80fd\u73b0\u5728\u514d\u8d39\u7ed9\u4f60\u7528\uff1b \u63d0\u4f9b\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u529f\u80fd\uff0c\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u6bcf\u4e2a\u65b9\u6cd5\u5355\u72ec\u5199\u8f93\u51fa\u65e5\u5fd7\u7684\u4ee3\u7801\uff0c\u4e00\u5207\u6211\u4eec\u7ed9\u4f60\u641e\u5b9a\u4e86\uff0c\u65e5\u5fd7\u8f93\u51fa\u4e0d\u4ec5\u5185\u5bb9\u4e30\u5bcc\uff0c\u989c\u503c\u4e5f\u7edd\u5bf9\u5728\u7ebf\uff0c\u6211\u4eec\u8fd8\u81ea\u5df1\u8bbe\u8ba1\u4e86\u4e00\u6b3e\u7ec8\u7aef\u8f93\u51fa\u4e3b\u9898\u53eb\u300a\u4e94\u5f69\u6591\u6593\u7684\u9ed1\u300b\uff1b \u63d0\u4f9b\u4e86\u4e00\u952e\u90e8\u7f72\u81ea\u52a8\u5316\u6d4b\u8bd5\u73af\u5883\u7684\u529f\u80fd\uff0c\u8fde\u4ee3\u7801\u7f16\u8f91\u5668\u90fd\u7ed9\u4f60\u88c5\u597d\u4e86\uff0c\u8ba9\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u73af\u5883\u90e8\u7f72\u800c\u70e6\u607c\uff1b \u63d0\u4f9b\u4e86\u81ea\u52a8\u751f\u6210\u591a\u79cd\u62a5\u544a\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u8f93\u51fa\u4ec0\u4e48\u62a5\u544a\u5f62\u5f0f\u90fd\u884c\uff0c\u800c\u4e14\u6211\u4eec\u5728\u62a5\u544a\u4e2d\u8fd8\u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\u548c\u5931\u8d25\u622a\u56fe\u7684\u529f\u80fd\uff1b \u5bf9\u65ad\u8a00\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u63d0\u4f9b\u66f4\u53cb\u597d\u5316\u7684\u9519\u8bef\u63d0\u793a\uff0c\u8ba9\u5b9a\u4f4d\u95ee\u9898\u7cbe\u51c6\u9ad8\u6548\uff1b \u4e0d\u4ec5\u652f\u6301\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u63a7\u5236\uff0c\u800c\u4e14\u8fd8\u652f\u6301\u52a8\u6001\u63a7\u5236\u7528\u4f8b\u6279\u91cf\u6267\u884c\u7684\u603b\u65f6\u95f4\uff0c\u786e\u4fdd CI \u73af\u5883\u4e0b\u80fd\u987a\u7545\u8fd0\u884c\uff1b \u652f\u6301\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\u6267\u884c\u3001PMS \u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6807\u7b7e\u5316\u6267\u884c\u65b9\u6848\uff0c\u6ee1\u8db3\u4f60\u5404\u79cd\u573a\u666f\u4e0b\u7684\u6267\u884c\u9700\u6c42\uff1b \u652f\u6301\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u529f\u80fd\uff0c\u53ef\u5b9a\u4f4d\u53ef\u65ad\u8a00\uff0c\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\uff1b \u5b8c\u7f8e\u517c\u5bb9 Wayland \u548c X11\uff0c\u771f\u6b63\u505a\u5230\u4e00\u5957\u4ee3\u7801\uff0c\u968f\u5904\u6267\u884c\uff1b \u652f\u6301\u591a\u79cd\u65b9\u5f0f\u7684\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u5176\u4e2d\u5f02\u6b65\u56de\u586b\u7684\u65b9\u6848\uff0c\u5b8c\u7f8e\u89e3\u51b3\u4e86\u6570\u636e\u56de\u586b\u7684\u8017\u65f6\u95ee\u9898\uff1b \u3010\u89c6\u9891\u4ecb\u7ecd\u3011"},{"location":"#_2","title":"\u4e8c\u3001\u5b89\u88c5\u4f7f\u7528","text":"\u57fa\u7840\u6846\u67b6\uff1ahttps://github.com/linuxdeepin/deepin-autotest-framework \u4ece PyPI \u5b89\u88c5: sudo pip3 install youqu\n \u521b\u5efa\u9879\u76ee: youqu-startproject youqu\n \u5b89\u88c5\u4f9d\u8d56: cd youqu\nbash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002 \u5e94\u7528\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684\u5e94\u7528\u540d\u79f0\u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music cd apps/\n \u5c06\u5e94\u7528\u5e93\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u50cf\u8fd9\u6837\uff1a youqu\n\u251c\u2500\u2500 apps\n\u2502 \u251c\u2500\u2500 autotest_deepin_music # \u5e94\u7528\u5e93\n...\n \u5e94\u7528\u5e93\u7684\u540d\u79f0\u4e0d\u53ef\u4ee5\u4fee\u6539\u3002"},{"location":"#_3","title":"\u4e09\u3001\u8fd0\u884c","text":""},{"location":"#1","title":"1. \u5de5\u4f5c\u7a7a\u95f4","text":"\u57fa\u7840\u6846\u67b6\u5de5\u7a0b\u76ee\u5f55\u5efa\u8bae\u653e\u5728 ~ \u76ee\u5f55\u4e0b\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u4e5f\u53ef\u4ee5\u8fd0\u884c\uff0c\u4f46\u662f\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u9700\u8981\u505a\u73af\u5883\u6e05\u7406\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u5b58\u5728\u4ee3\u7801\u88ab\u5220\u9664\u7684\u98ce\u9669\u3002 \u5982\u679c\u4f60\u7684\u673a\u5668\u4e0a\u4e0d\u540c\u76ee\u5f55\u4e0b\u5b58\u5728\u591a\u4e2a YouQu \u5de5\u7a0b\uff0c\u90a3\u4e48\u5728\u8fd0\u884c\u4e4b\u524d\uff0c\u8bf7\u5148\u6267\u884c env.sh \u6821\u6b63\u76f8\u5173\u73af\u5883\u3002"},{"location":"#2","title":"2. \u6267\u884c\u5668","text":"\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u6709\u4e00\u4e2a manage.py \uff0c\u5b83\u662f\u4e00\u4e2a\u6267\u884c\u5668\u5165\u53e3\uff0c\u63d0\u4f9b\u4e86\u672c\u5730\u6267\u884c\u3001\u8fdc\u7a0b\u6267\u884c\u7b49\u7684\u529f\u80fd\u3002 \u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6765\u6267\u884c\uff1a youqu manage.py run -a deepin-music\n"},{"location":"#21","title":"2.1. \u672c\u5730\u6267\u884c","text":"youqu manage.py run\n"},{"location":"#211","title":"2.1.1. \u914d\u7f6e\u6587\u4ef6","text":"\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u914d\u7f6e\u53c2\u6570 \u5728\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u91cc\u9762\u652f\u6301\u914d\u7f6e\u5bf9\u6267\u884c\u7684\u4e00\u4e9b\u53c2\u6570\u8fdb\u884c\u914d\u7f6e\uff0c\u5e38\u7528\u7684\u5982\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;1\u3001KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2\u3001KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f, e.g. TAGS = L1 or smoke\n;\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\uff0c\u5c06\u8981\u6267\u884c\u7684\u7528\u4f8b\u5199\u5165\u6307\u5b9a\u7684 csv \u6587\u4ef6\n;\u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u4ece\u57fa\u7840\u6846\u67b6\u6839\u76ee\u5f55\u5f00\u59cb\uff1ae.g. CASE_FILE = case_list.txt\n;\u5982\u679c\u8fd9\u91cc\u6709\u503c\uff0cAPP_NAME KEYWORDS TAGS \u7684\u914d\u7f6e\u5747\u4e0d\u751f\u6548\nCASE_FILE =\n;=============================== RUNNER CONFIG ===================================\n[runner]\n;\u6700\u5927\u5931\u8d25\u7528\u4f8b\u6570\u91cf\u7684\u5360\u6bd4\n;\u6bd4\u5982\uff1a\u603b\u6267\u884c\u7528\u4f8b\u6570\u4e3a100, \u82e5 MAX_FAIL = 0.5,\u5219\u5931\u8d25\u7528\u4f8b\u6570\u8fbe\u523050\u5c31\u4f1a\u7ec8\u6b62\u6d4b\u8bd5\u3002\nMAX_FAIL = 0.5\n;\u5355\u6761\u7528\u4f8b\u7684\u8d85\u65f6\u65f6\u95f4\uff0c\u5982\u679c\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u8d85\u65f6\uff0c\u8fd9\u6761\u7528\u4f8b\u4f1a\u88ab\u505c\u6b62\uff0c\u540e\u7eed\u7528\u4f8b\u7ee7\u7eed\u6267\u884c\u3002\n;\u5355\u4f4d\u4e3a\u79d2\n; \u8fd9\u662f\u4e00\u4e2a\u5168\u5c40\u7edf\u4e00\u914d\u7f6e\uff0c\u5982\u679c\u67d0\u6761\u7528\u4f8b\u9700\u8981\u5355\u72ec\u914d\u7f6e\u8d85\u65f6\u65f6\u95f4\uff0c\u53ef\u4ee5\u5728\u7528\u4f8b\u4e2d\u8fd9\u6837\u5199\uff1a\n;@pytest.mark.timeout(500)\n;def test_xxx_001():\n; ...\n;\u4f1a\u8bdd\uff08\u6240\u6709\u7528\u4f8b\u6267\u884c\u7684\uff09\u8d85\u65f6\u662f\u6839\u636e\u5168\u5c40\u8d85\u65f6\u914d\u7f6e\u548c\u7528\u4f8b\u5355\u72ec\u8d85\u65f6\u914d\u7f6e\u81ea\u52a8\u8ba1\u7b97\u7684\uff1b\nCASE_TIME_OUT = 200\n;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\u3002\n;\u6ce8\u610f\uff0c\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u4e0d\u80fd\u5c0f\u4e8e\u5931\u8d25\u5f55\u5c4f\u6b21\u6570\uff0c\u5373 RERUN >= RECORD_FAILED_CASE\nRECORD_FAILED_CASE = 1\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = INFO\n;yes \u6bcf\u6761\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u8fdb\u884c\u73af\u5883\u6e05\u7406\nCLEAN_ALL = yes\n;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\nRESOLUTION = 1920x1080\n;\u4e0d\u8df3\u8fc7\u7528\u4f8b\uff0ccsv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86 skip-xxx\u7684\u7528\u4f8b\u4e0d\u8df3\u8fc7\nNOSKIP = no\n;ignore fixed\n;no\uff0c\u53ea\u8981\u6807\u8bb0\u4e86fixed\u7684\u7528\u4f8b\uff0c\u5373\u4f7f\u6807\u8bb0\u4e86skip-\uff0c\u4e5f\u4f1a\u6267\u884c\uff1b\n;yes\uff0cfixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\uff1b\nIFIXED = no\n;\u8981\u5b89\u88c5deb\u5305\u7684\u8def\u5f84\n;e.g : ~/Downloads/ \u5b89\u88c5\u4e0b\u8f7d\u76ee\u5f55\u4e0b\u7684deb\u5305\uff0c\u5982\u679c\u662f\u8fdc\u7a0b\u6267\u884c\uff0c\u4f1a\u81ea\u52a8\u62f7\u8d1d\u5230\u8fdc\u7a0b\u5e76\u5b89\u88c5\u3002\nDEB_PATH =\n;DEBUG \u6a21\u5f0f\u6267\u884c\u7528\u4f8b\uff0c\u53ea\u6536\u96c6\u4e0d\u6267\u884c\u7528\u4f8b\uff0c\u4e5f\u4e0d\u505a\u8bbe\u5907\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002\nDEBUG = no\n;\u8bb0\u5f55top\u547d\u4ee4\u67e5\u8be2\u7684\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0cTOP = 3 \u8868\u793a\u8bb0\u5f55\u524d3\u4e2a\u8fdb\u7a0b\u3002\nTOP =\n;\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\nREPEAT =\n;\u9ed8\u8ba4\u5728\u6240\u6709\u6d4b\u8bd5\u5b8c\u6210\u4e4b\u540e\u8f93\u51fa\u62a5\u9519\u4fe1\u606f.\n;yes, \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\nDURING_FAIL = no\n;=============================== REPORT CONFIG ===================================\n[report]\n;\u7528\u4f8b\u6267\u884c\u5b8c\u540e\u751f\u6210\u7684\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n;\u76ee\u524d\u652f\u6301 allure, xml, json \uff08\u652f\u6301\u540c\u65f6\u751f\u6210\uff09\nREPORT_FORMAT = allure, xml, json\n;\u6307\u5b9a\u62a5\u544a\u751f\u6210\u7684\u8def\u5f84\uff08\u76f8\u5bf9\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\uff09\nALLURE_REPORT_PATH = report/\nXML_REPORT_PATH = report/\nJSON_REPORT_PATH = report/\n;=============================== GLOBAL CONFIG ===================================\n[globalconfig]\n;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\nPASSWORD = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\nIMAGE_MATCH_NUMBER = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6bcf\u6b21\u95f4\u9694\u7b49\u5f85\u65f6\u95f4\nIMAGE_MATCH_WAIT_TIME = 1\n;\u56fe\u50cf\u8bc6\u522b\u5339\u914d\u5ea6\nIMAGE_RATE = 0.9\n;\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u5b9e\u65f6\u56fe\u50cf\u4fdd\u5b58\u8def\u5f84\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u5750\u6807\nSCREEN_CACHE = /tmp/screen.png\n;\u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\u7684\u8def\u5f84\nTMPDIR = /tmp/tmpdir\n;\u7cfb\u7edf\u4e3b\u9898\nSYS_THEME = deepin\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = http://youqu-dev.uniontech.com:8890\n;OpenCV\u670d\u52a1\u7aef\u5730\u5740\nOPENCV_SERVER_HOST = http://youqu-dev.uniontech.com:8889\n;=============================== PMS CONFIG ===================================\n;PMS\u76f8\u5173\u914d\u7f6e\uff0c\u5305\u542b\u4ee5\u4e0b\u51e0\u4e2a\u65b9\u9762\uff1a\n;1.PMS\u6d4b\u8bd5\u5957\u6267\u884c\n;2.\u81ea\u52a8\u4ecePMS\u722c\u53d6\u6570\u636e\u5e76\u540c\u6b65\u672c\u5730CSV\u6587\u4ef6\n;3.PMS\u6570\u636e\u56de\u586b\n[pms]\n;PMS\u7684\u7528\u6237\u540d: ut001234\nPMS_USER =\n;PMS\u7684\u5bc6\u7801\nPMS_PASSWORD =\n;PMS\u6d4b\u8bd5\u5957\u7684ID\n;\u5728PMS\u4e0a\u67e5\u770b\u7528\u4f8b\u201c\u5957\u4ef6\u201d\u94fe\u63a5: https://pms.uniontech.com/testsuite-view-495.html\n;\u6d4b\u8bd5\u5957ID\u4e3a: 495\nSUITE_ID =\n;\u6570\u636e\u56de\u586b\u5fc5\u987b\u5173\u8054PMS\u6d4b\u8bd5\u5355\n;\u5728PMS\u4e0a\u67e5\u770b\u6d4b\u8bd5\u5355\u94fe\u63a5: https://pms.uniontech.com/testtask-cases-20747.html\n;\u6d4b\u8bd5\u5355ID\u4e3a: 20747\nTASK_ID =\n;\u5c06\u6d4b\u8bd5\u7ed3\u679c\u6570\u636e\u56de\u586b\u5230PMS\n;\u4e3a\u7a7a: \u8868\u793a\u4e0d\u56de\u586b,\u4e0d\u4f1a\u5728\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u751f\u6210json\u7ed3\u679c\u6587\u4ef6;\n;async: \u8868\u793a\u9010\u6761\u5f02\u6b65\u56de\u586b,\u540e\u9762\u4e00\u6761\u6267\u884c\u5f00\u59cb\u65f6\u901a\u8fc7\u5b50\u7ebf\u7a0b\u5bf9\u524d\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u8fdb\u884c\u56de\u586b\uff0c\u5982\u6b64\u5b9e\u73b0\u65f6\u95f4\u6548\u7387\u6700\u5927\u5316;\n;finish: \u8868\u793a\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u6210\u4e4b\u540e\u9010\u4e2a\u56de\u586b(PMS\u4e0d\u652f\u6301\u5e76\u53d1);\nSEND_PMS =\n;\u6570\u636e\u56de\u586b\u7684\u89e6\u53d1\u8005\n;auto: \u6846\u67b6\u81ea\u52a8\u56de\u586b,\u914d\u5408SEND_PMS\u914d\u7f6e\u4f7f\u7528,\u4f60\u53ef\u4ee5\u9009\u62e9\u5728\u4e0d\u540c\u7684\u9636\u6bb5\u8fdb\u884c\u6570\u636e\u56de\u586b;\n;hand: \u624b\u52a8\u56de\u586b,\u6bcf\u6761\u7528\u4f8b\u4ecd\u7136\u4f1a\u751f\u6210json\u6587\u4ef6,\u4f46\u6846\u67b6\u4e0d\u4f1a\u8fdb\u884c\u6570\u636e\u56de\u586b,\u9700\u8981\u4f60\u53ef\u4ee5\u5728\u4f60\u60f3\u8981\u53d1\u9001\u7684\u65f6\u95f4\u70b9\u624b\u52a8\u89e6\u53d1\u56de\u586b;\nTRIGGER = auto\n;PMS\u56de\u586b\u7684\u91cd\u8bd5\u6b21\u6570\n;\u5982\u679c\u63a5\u53e3\u8bf7\u6c42\u5931\u8d25,\u4f1a\u8fdb\u884c\u91cd\u8bd5\nSEND_PMS_RETRY_NUMBER = 2\n[csv_link_pms_lib]\n;caselib: \u7528\u4f8b\u5e93\n;testcase: \u4ea7\u54c1\u5e93\u7528\u4f8b\nCASE_FROM = caselib\n[csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/caselib-browse-81.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 81\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic =\n[export_csv]\n;\u5bfc\u51fa\u7684csv\u6587\u4ef6\u540d\u79f0\uff0c\u9ed8\u8ba4 case_list.csv\nCSV_FILE = case_list.csv\n;exportcsv \u547d\u4ee4\u5bfc\u51fa case_list.csv \u6587\u4ef6\u65f6\u914d\u7f6e\u7684\u5b57\u6bb5\u540d\uff0c\u7528\u4f8b\u540d\u79f0\u9ed8\u8ba4\u5b58\u5728\u7b2c\u4e00\u5217\uff0c\u65e0\u9700\u6dfb\u52a0\nCSV_HEARD = \u7528\u4f8b\u7ea7\u522b,\u7528\u4f8b\u7c7b\u578b,\u6d4b\u8bd5\u7ea7\u522b,\u662f\u5426\u8df3\u8fc7\n \u914d\u7f6e\u5b8c\u6210\u4e4b\u540e\uff0c\u76f4\u63a5\u5728\u547d\u4ee4\u884c\u6267\u884c manage.py \u5c31\u597d\u4e86\u3002 youqu manage.py run\n"},{"location":"#212","title":"2.1.2. \u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a youqu manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--max_fail MAX_FAIL \u6700\u5927\u5931\u8d25\u7387\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--resolution RESOLUTION\n\u68c0\u67e5\u5206\u8fa8\u7387\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms {,async,finish}\n\u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--trigger {,auto,hand}\n\u89e6\u53d1\u8005\n-f CASE_FILE, --case_file CASE_FILE\n\u6839\u636e\u6587\u4ef6\u6267\u884c\u7528\u4f8b\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n--pms_user PMS_USER pms \u7528\u6237\u540d\n--pms_password PMS_PASSWORD\npms \u5bc6\u7801\n--suite_id SUITE_ID pms \u6d4b\u8bd5\u5957ID\n--pms_info_file PMS_INFO_FILE\npms \u4fe1\u606f\u6587\u4ef6\n--top TOP \u8fc7\u7a0b\u4e2d\u8bb0\u5f55top\u547d\u4ee4\u4e2d\u7684\u503c\n--lastfailed \u4ec5\u6267\u884c\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\n--duringfail \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\n--repeat REPEAT \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n--project_name PROJECT_NAME\n\u5de5\u7a0b\u540d\u79f0\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--build_location BUILD_LOCATION\n\u6784\u5efa\u5730\u533a\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--line LINE \u6267\u884c\u7684\u4e1a\u52a1\u7ebf\uff08\u5199\u5165json\u6587\u4ef6\uff09\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a youqu manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\"\n \u547d\u4ee4\u884c\u53c2\u6570\u4f18\u5148\u7ea7\u662f\u9ad8\u4e8e\u914d\u7f6e\u6587\u4ef6\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u4e86\u5bf9\u5e94\u7684\u53c2\u6570\uff0c\u914d\u7f6e\u6587\u4ef6\u4e2d\u4e0d\u7ba1\u662f\u5426\u914d\u7f6e\u5747\u4e0d\u751f\u6548\u3002 --app \u5165\u53c2\u8fd8\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\uff0c\u4e0b\u9762\u7684\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u540c\u6837\u652f\u6301\u3002"},{"location":"#22","title":"2.2. \u8fdc\u7a0b\u6267\u884c","text":"youqu manage.py remote\n \u8fdc\u7a0b\u6267\u884c\u540c\u6837\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u8fdb\u884c\u7528\u4f8b\u76f8\u5173\u914d\u7f6e\uff1b \u9700\u8981\u91cd\u70b9\u8bf4\u4e00\u4e0b\u8fdc\u7a0b\u6267\u884c\u65f6\u7684\u6d4b\u8bd5\u673a\u4fe1\u606f\u914d\u7f6e\uff0c\u5728\u914d\u7f6e\u6587\u4ef6 setting/remote.ini \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\u3001IP\u3001\u5bc6\u7801\u3002 ;=============================== CLIENT LIST =====================================\n; \u6d4b\u8bd5\u673a\u914d\u7f6e\u5217\u8868\n;[client{number}] ;\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u6709\u591a\u5c11\u53f0\u6d4b\u8bd5\u673a\u5c31\u5199\u591a\u5c11\u4e2a client\uff0c\u522b\u540d\u5fc5\u987b\u5305\u542b client \u5b57\u7b26\uff0c\u4e14\u4e0d\u80fd\u91cd\u590d\u3002\n;user = ;\u6d4b\u8bd5\u673a user\n;ip = ;\u6d4b\u8bd5\u673a ip\n;password = 1 ;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801, \u53ef\u4ee5\u4e0d\u914d\u7f6e\u6b64\u9879\uff0c\u9ed8\u8ba4\u53d6 CLIENT_PASSWORD \u7684\u503c\uff1b\n;\u5982\u679c\u4f60\u6240\u6709\u6d4b\u8bd5\u673a\u5bc6\u7801\u90fd\u76f8\u540c\uff0c\u90a3\u4e48\u53ea\u9700\u8981\u914d\u7f6e CLIENT_PASSWORD \u5c31\u53ef\u4ee5\u4e86\n;=================================================================================\n[client1]\nuser = uos\nip = 10.8.15.xx\n[client2]\nuser = uos\nip = 10.8.15.xx\n[client3]\nuser = uos\nip = 10.8.11.xx\n \u6709\u591a\u5c11\u53f0\u673a\u5668\u5c31\u50cf\u8fd9\u6837\u6328\u7740\u5199\u5c31\u884c\u4e86\u3002 \u7136\u540e\u5728\u547d\u4ee4\u884c\uff1a youqu manage.py remote\n \u8fd9\u6837\u8fd0\u884c\u662f\u4ece\u914d\u7f6e\u6587\u4ef6\u53bb\u8bfb\u53d6\u76f8\u5173\u914d\u7f6e\u3002 \u5982\u679c\u4f60\u4e0d\u60f3\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\uff0c\u4f60\u4ecd\u7136\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u8fdb\u884c\u4f20\u53c2\uff0c \u4ee5\u4e0b\u4e3a python3 manage.py remote \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-c CLIENTS, --clients CLIENTS\n\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679cpassword\u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6\nsetting/remote.ini \u4e2d CLIENT_PASSWORD\n\u7684\u503c,\u6bd4\u5982\uff1auos@10.8.13.33:1 \u6216 uos@10.8.13.33\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-s {yes,no,}, --send_code {yes,no,}\n\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a\uff08\u4e0d\u542breport\u76ee\u5f55\uff09\n-e, --build_env \u642d\u5efa\u6d4b\u8bd5\u73af\u5883,\u5982\u679c\u4e3ayes\uff0c\u4e0d\u7ba1send_code\u662f\u5426\u4e3ayes\u90fd\u4f1a\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a.\n-p CLIENT_PASSWORD, --client_password CLIENT_PASSWORD\n\u6d4b\u8bd5\u673a\u5bc6\u7801\uff08\u5168\u5c40\uff09\n-y PARALLEL, --parallel PARALLEL\nyes:\u8868\u793a\u6240\u6709\u6d4b\u8bd5\u673a\u5e76\u884c\u8dd1\uff0c\u6267\u884c\u76f8\u540c\u7684\u6d4b\u8bd5\u7528\u4f8b\uff0cno\n:\u8868\u793a\u6d4b\u8bd5\u673a\u5206\u5e03\u5f0f\u6267\u884c\uff0c\u670d\u52a1\u7aef\u4f1a\u6839\u636e\u6536\u96c6\u5230\u7684\u6d4b\u8bd5\u7528\u4f8b\u81ea\u52a8\u5206\u914d\u7ed9\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u3002\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms SEND_PMS \u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n \u5728\u547d\u4ee4\u884c\u8fd9\u6837\u8fd0\u884c\uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\"\n \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report \u76ee\u5f55\u4e0b\u56de\u6536\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u7684\u6d4b\u8bd5\u62a5\u544a\u3002 \u914d\u7f6e\u6587\u4ef6\u5176\u4ed6\u76f8\u5173\u914d\u7f6e\u9879\u8be6\u7ec6\u8bf4\u660e\uff0c\u8bf7\u67e5\u770b\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u6ce8\u91ca\u5185\u5bb9\u3002"},{"location":"#23-pms","title":"2.3. PMS \u6570\u636e\u56de\u586b","text":"\u6d4b\u8bd5\u5355\u5173\u8054\u7684\u7528\u4f8b\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u5bf9\u5e94\u7684\u53bb\u8dd1\u8fd9\u4e9b\u5173\u8054\u7684\u7528\u4f8b\uff0c\u5e76\u4e14\u5c06\u6267\u884c\u7684\u7ed3\u679c\u56de\u586b\u7684\u6d4b\u8bd5\u7528\u4f8b\u7684\u72b6\u6001\u91cc\u9762\u3002 PMS \u6570\u636e\u56de\u586b\u4e3b\u8981\u6709\u4e09\u79cd\u65b9\u5f0f\uff1a \uff081\uff09\u5f02\u6b65\u56de\u586b \u5728\u7528\u4f8b\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\uff0c\u91c7\u7528\u5f02\u6b65\u7684\u65b9\u5f0f\u53bb\u8fdb\u884c\u6570\u636e\u56de\u586b\uff0c\u76f4\u767d\u7684\u8bb2\u5c31\u662f\uff0c\u7b2c\u4e8c\u6761\u7528\u4f8b\u5f00\u59cb\u8dd1\u7684\u65f6\u5019\uff0c\u901a\u8fc7\u5b50\u7ebf\u7a0b\u53bb\u505a\u7b2c\u4e00\u6761\u7528\u4f8b\u7684\u6570\u636e\u56de\u586b\uff0c\u5982\u6b64\u5faa\u73af\uff0c\u76f4\u5230\u6240\u6709\u7528\u4f8b\u6267\u884c\u7ed3\u675f\uff1b \u8fd9\u79cd\u65b9\u6848\u7684\u65f6\u95f4\u6548\u7387\u6700\u9ad8\u7684\uff0c\u56e0\u4e3a\u7406\u8bba\u4e0a\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u662f\u5927\u4e8e\u6570\u636e\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\u65f6\u95f4\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u5f53\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u6570\u636e\u56de\u586b\u4e5f\u5b8c\u6210\u4e86\u3002 \u4f7f\u7528\u65b9\u6cd5\uff0c\u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u4ee5\u4e0b\u53c2\u6570\uff1a\uff08\u4ee5\u4e0b\u6d89\u53ca\u5230\u7684\u53c2\u6570\u914d\u7f6e\u90fd\u662f\u5728\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u914d\u7f6e\uff09 PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = async\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \u8fd9\u4e2a\u53c2\u6570\u53ef\u586b\u53ef\u4e0d\u586b\uff0c\u4f46\u662f\u586b\u4e86\u53ef\u4ee5\u63d0\u9ad8\u7528\u4f8b\u7684\u6267\u884c\u901f\u5ea6\uff0c\u56e0\u4e3a\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u53ef\u4ee5\u6307\u5b9a\u5230\u5177\u4f53\u7684\u5e94\u7528\u5e93\u3002\uff08\u4e0b\u540c\uff09\n \uff082\uff09\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u56de\u586b \u7b49\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u518d\u9010\u4e2a\u8fdb\u884c\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u6b64\u65b9\u6848\u65f6\u95f4\u6548\u7387\u6bd4\u8f83\u4f4e\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \uff083\uff09\u624b\u52a8\u56de\u586b \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4e0d\u505a\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u540e\u7eed\u624b\u52a8\u5c06\u7ed3\u679c\u8fdb\u884c\u56de\u586b\u8bf7\u6c42\u3002 \u7528\u4f8b\u6267\u884c\u65f6\u914d\u7f6e\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = hand\nAPP_NAME = \u540e\u7eed\u624b\u52a8\u56de\u586b\u65b9\u6cd5\uff1a youqu manage.py pms --send2task yes\n"},{"location":"#_4","title":"\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898","text":"\u7531\u540c\u5b66\u53ef\u80fd\u4f1a\u53d1\u73b0\uff0c\u600e\u4e48\u56de\u586b\u4e00\u6b21\u4e4b\u540e\uff0c\u540e\u9762\u60f3\u518d\u6b21\u56de\u586b\u5c31\u4e0d\u751f\u6548\u4e86\uff1b \u8fd9\u662f\u56e0\u4e3a\u4e3a\u4e86\u5e94\u5bf9\u524d\u9762\u63d0\u5230\u7684\u591a\u79cd\u6570\u636e\u56de\u586b\u7684\u65b9\u5f0f\uff0c\u5728 report \u76ee\u5f55\u4e0b\u4f1a\u7531 pms_xxx \u5f00\u5934\u7684\u76ee\u5f55\uff0c\u8bb0\u5f55\u4e86\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u548c\u56de\u586b\u60c5\u51b5\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u4e4b\u524d\u5df2\u7ecf\u56de\u586b\u8fc7\u4e86\uff0c\u540e\u7eed\u5c31\u4e0d\u4f1a\u518d\u6b64\u89e6\u53d1\u56de\u586b\u4e86\uff1b \u5982\u679c\u4f60\u60f3\u91cd\u65b0\u505a\u56de\u586b\uff0c\u4f60\u53ef\u4ee5\u628a report/pms_xxx \u76ee\u5f55\u5220\u6389\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u91cd\u65b0\u505a\u6570\u636e\u56de\u586b\u4e86\uff1b"},{"location":"#24-csv","title":"2.4. \u5bfc\u51fa CSV \u6587\u4ef6","text":"\u6846\u67b6\u63d0\u4f9b\u5bfc\u51fa\u6307\u5b9a\u6807\u7b7e\u7528\u4f8b\u7684\u529f\u80fd\uff1a youqu manage.py exportcsv -a deepin-album -t CICD\n \u8868\u793a\u5bfc\u51fa deepin-album \u7684\u7528\u4f8b\u4e2d\u6807\u8bb0\u4e86 CICD \u6807\u7b7e\u7684\u7528\u4f8b\uff0c\u5bfc\u51fa CSV \u6587\u4ef6\u7684\u5b57\u6bb5\u683c\u5f0f\u5df2\u7ecf\u9002\u914d\u4e86 CICD \u7684\u8981\u6c42\u3002"},{"location":"#25-app","title":"2.5. \u811a\u624b\u67b6\u65b0\u5efa APP \u5de5\u7a0b","text":"\u65b0\u5efa\u4e00\u4e2a APP \u5de5\u7a0b\uff1a youqu manage.py startapp autotest_deepin_some \u8fd9\u6837\u5728 apps \u76ee\u5f55\u4e0b\u4f1a\u521b\u5efa\u4e00\u4e2a\u5b50\u9879\u76ee\u5de5\u7a0b autotest_deepin_some\uff0c\u540c\u65f6\u65b0\u5efa\u597d\u5de5\u7a0b\u6a21\u677f\u76ee\u5f55\u548c\u6a21\u677f\u6587\u4ef6\uff1a apps\n\u2514\u2500\u2500 autotest_deepin_some\n \u00a0\u00a0 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_case.py\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 config.ini\n \u00a0\u00a0 \u251c\u2500\u2500 config.py\n \u00a0\u00a0 \u251c\u2500\u2500 conftest.py\n \u00a0\u00a0 \u251c\u2500\u2500 control\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_assert.py\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some.csv\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u2514\u2500\u2500 widget\n \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 case_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 other.ini\n \u00a0\u00a0 \u251c\u2500\u2500 other_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 pic_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2514\u2500\u2500 ui.ini\n autotest_deepin_some \u662f\u4f60\u7684\u5de5\u7a0b\u540d\u79f0\uff0c\u6bd4\u5982\uff1aautotest_deepin_music \uff1b \u5728\u6b64\u57fa\u7840\u4e0a\uff0c\u4f60\u53ef\u4ee5\u5feb\u901f\u7684\u5f00\u59cb\u4f60\u7684 AT \u9879\u76ee\u3002"},{"location":"#26","title":"2.6. \u7528\u4f8b\u6807\u7b7e\u81ea\u52a8\u540c\u6b65","text":"\u7528\u4e8e\u81ea\u52a8\u540c\u6b65 PMS \u7528\u4f8b\u6807\u7b7e\u6570\u636e\u81f3\u672c\u5730 CSV \u6587\u4ef6\uff0c\u4e3b\u8981\u901a\u8fc7\u4ee5\u4e0b\u51e0\u4e2a\u914d\u7f6e\u6765\u63a7\u5236\uff1a APP_NAME = # \u6307\u5b9a\u8981\u540c\u6b65\u7684\u5e94\u7528\u540d\u79f0\nPMS_USER = # PMS\u7684\u7528\u6237\u540d\nPMS_PASSWORD = # PMS\u7684\u5bc6\u7801\n \u5728 [csv_link_pms_id] \u8282\u70b9\u4e0b\u6307\u5b9a csv \u6587\u4ef6\u540d\u4e0e PMS \u7528\u4f8b\u6a21\u5757\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u6bd4\u5982\uff1a [csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/testcase-browse-53.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 53\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic = 53\n \u5c06\u4ee5\u4e0a\u4fe1\u606f\u914d\u7f6e\u597d\u4e4b\u540e\uff0c\u5728\u547d\u4ee4\u884c\u6267\u884c\uff1a youqu manage.py pms --pms2csv yes\n \u6bcf\u6b21\u6267\u884c\u65f6\u539f csv \u6587\u4ef6\u4f1a\u81ea\u52a8\u5907\u4efd\u5728 report/csv_back \u76ee\u5f55\u4e0b\uff0c\u56e0\u6b64\u4f60\u4e0d\u7528\u62c5\u5fc3\u811a\u672c\u6267\u884c\u5bfc\u81f4\u4f60\u7684\u6570\u636e\u4e22\u5931\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u57fa\u7840\u6846\u67b6\u8bbe\u8ba1\u65b9\u6848","text":"# ====================================\n# Author : Mikigo\n# Time : 2022/3/18\n# version \uff1a1.0\n# ====================================\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"\u505a\u4e00\u4e2a\u7b80\u5355\u3001\u597d\u7528\u3001\u529f\u80fd\u5f3a\u5927\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u3002 \u4f5c\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4e00\u4e2a\u57fa\u7840\u6846\u67b6\uff0c\u4efb\u4f55\u5e94\u7528\u90fd\u80fd\u5f88\u65b9\u4fbf\u7684\u63a5\u5165\u8fdb\u6765\uff1b \u63d0\u4f9b\u6240\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u9700\u8981\u7684\u5e95\u5c42\u529f\u80fd\uff0c\u5e76\u5bf9\u5916\u63d0\u4f9b\u552f\u4e00\u7684\u63a5\u53e3\uff0c\u65b9\u4fbf\u5e94\u7528\u5e93\u4f7f\u7528\uff1b \u6574\u5408\u516c\u5171\u5e93\uff0c\u51cf\u5c11\u5e94\u7528\u5e93\u4ee3\u7801\u91cf\u548c\u65b9\u6cd5\u7ef4\u62a4\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u8bbe\u8ba1\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u7edf\u4e00\u6982\u5ff5","text":" \u57fa\u7840\u6846\u67b6 \u672c\u9879\u76ee\u662f\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\uff08AutoTest Basic Frame\uff09\uff0c\u5168\u79f0\u4e3a\u201c\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff08AT \u57fa\u7840\u6846\u67b6\uff09\u201d\u3002 AT \u57fa\u7840\u6846\u67b6\u662f\u505a\u4e3a\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\u6765\u8bbe\u8ba1\u7684\uff0c\u5b83\u63d0\u4f9b\u4e86\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u57fa\u7840\u529f\u80fd\uff0c\u4efb\u4f55\u5e94\u7528\u63a5\u5165\u8fdb\u6765\u90fd\u80fd\u5feb\u901f\u65b9\u4fbf\u7684\u8fdb\u884c\u65b9\u6cd5\u548c\u7528\u4f8b\u7f16\u5199\uff0c\u540c\u65f6\u5728\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u3001\u6807\u7b7e\u5316\u6267\u884c\u3001\u5206\u5e03\u5f0f\u6267\u884c\u3001\u591a\u79cd\u62a5\u544a\u8f93\u51fa\u3001\u4f18\u7f8e\u7684\u6267\u884c\u65e5\u5fd7\u3001\u5931\u8d25\u81ea\u52a8\u5f55\u5c4f\u548c\u622a\u56fe\u3001\u81ea\u52a8\u73af\u5883\u6e05\u7406\u7b49\u7b49\uff0c\u5b83\u90fd\u63d0\u4f9b\u4e86\u5b8c\u5584\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u66f4\u91cd\u8981\u7684\u662f\u8fd9\u4e00\u5207\u4f7f\u7528\u8d77\u6765\u90fd\u975e\u5e38\u7b80\u5355\u3002 \u57fa\u7840\u6846\u67b6\u4e2d\u5305\u542b\u5e94\u7528\u5e93\uff08apps\uff09\u3001\u6838\u5fc3\u5e93\uff08src\uff09\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09\u3002 \u5e94\u7528\u5e93\uff08apps\uff09 \u5404\u4e2a\u5e94\u7528\u81ea\u5df1\u7684\u4ed3\u5e93\uff0c\u91cc\u9762\u4e3b\u8981\u5305\u542b\u7684\u662f\u7528\u4f8b\u3001\u65b9\u6cd5\u53ca\u4e00\u4e9b\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u53eb autotest-dde-file-manager \u3002 \u6838\u5fc3\u5e93\uff08src\uff09 \u6838\u5fc3\u5e93\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u5230\u6240\u6709\u5e95\u5c42\u6838\u5fc3\u529f\u80fd\uff0c\u8fd9\u662f\u6700\u91cd\u8981\u7684\u4e00\u4e2a\u90e8\u5206\uff0c\u7075\u9b42\u3002\u5177\u4f53\u529f\u80fd\u6a21\u5757\u53ca\u8bf4\u660e\u4f1a\u5728\u4e0b\u9762\u7b2c\u56db\u4e2a\u7ae0\u8282\u8be6\u7ec6\u63cf\u8ff0\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09 \u591a\u4e2a\u5e94\u7528\u90fd\u8981\u7528\u5230\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\uff0c\u6309\u7167\u5e94\u7528\u5212\u5206\u5b58\u653e\uff0c\u4e3b\u8981\u662f\u4e3a\u4e86\u51cf\u5c11\u4ee3\u7801\u91cf\uff0c\u6d88\u9664\u5e94\u7528\u95f4\u7684\u8026\u5408\u5173\u7cfb\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u67b6\u6784\u56fe","text":"\u6574\u4f53\u7684\u6846\u67b6\u8bbe\u8ba1\u5728\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u300b\u6587\u6863\u91cc\u9762\u5df2\u7ecf\u6709\u8be6\u7ec6\u63cf\u8ff0\u4e86\uff0c\u8fd9\u91cc\u8d34\u4e00\u4e0b\u6574\u4f53\u7684\u67b6\u6784\u56fe\uff1a \u4e3a\u4e86\u7a81\u663e\u672c\u6587\u7684\u91cd\u70b9\uff0c\u62bd\u53d6\u5176\u4e2d\u91cd\u8981\u529f\u80fd\u6a21\u5757\uff0c\u5982\u4e0b\u56fe\uff1a "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-basic-frame # \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\n\u251c\u2500\u2500 apps # \u5e94\u7528\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-dde-file-manager # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\uff08\u5e94\u7528\u5e93\u8be6\u7ec6\u76ee\u5f55\u7ed3\u6784\u8bf7\u770b\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\uff09\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 tag # \u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u2514\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u2502 \u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 xxx.png\n\u2502 \u2502 ...\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-deepin-music # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 public # \u516c\u5171\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget # dde_dock \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget # dde_desktop \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 src # \u6838\u5fc3\u5e93\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 button_center.py\n\u2502 \u251c\u2500\u2500 cmdtrl.py\n\u2502 \u251c\u2500\u2500 dogtails.py\n\u2502 \u251c\u2500\u2500 find_image.py\n\u2502 \u251c\u2500\u2500 global_config.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 setting # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 config.py\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 global_config.ini\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\u6a21\u5757\uff08Hook\uff09\n\u251c\u2500\u2500 pytest.ini # Pytest \u9ed8\u8ba4\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 docs # \u6587\u6863\u76ee\u5f55\n\u2514\u2500\u2500 manage.py # \u6267\u884c\u5668\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1apps","title":"1\u3001\u5e94\u7528\u5e93\uff08apps\uff09","text":"\u6240\u6709\u5e94\u7528\u5e93\u5747\u653e\u7f6e\u5728\u57fa\u7840\u6846\u67b6\u4e0b\u7684 apps \u76ee\u5f55\u4e0b\uff08\u89c1\u7b2c\u4e8c\u7ae0\u8282\u7b2c3\u6bb5\u76ee\u5f55\u7ed3\u6784\u5185\u5bb9\uff09\u3002\u5e94\u7528\u5e93\u7684\u67b6\u6784\u8bbe\u8ba1\u53ef\u4ee5\u53c2\u8003\u300aAT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b\u6587\u6863\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2src","title":"2\u3001\u6838\u5fc3\u5e93\uff08src\uff09","text":"\u5728 src \u76ee\u5f55\u4e0b\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u5e95\u5c42\u6838\u5fc3\u7ec4\u4ef6\uff0c\u901a\u5e38\u6765\u8bb2\u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5230\u5176\u4e2d\u67d0\u4e00\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4e48\u4f60\u9700\u8981\u663e\u793a\u7684\u5bfc\u5165\u8fd9\u4e2a\u6a21\u5757\uff0c\u7136\u540e\u624d\u80fd\u4f7f\u7528\u8be5\u6a21\u5757\u4e0b\u7684\u529f\u80fd\uff0c\u5982\u679c\u4f60\u7528\u5230\u4e86\u5341\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4f60\u5c31\u9700\u8981\u5bfc\u5165\u5341\u4e2a\u3002\u4f46\u662f\u6211\u4eec\u60f3\u8ba9\u4e8b\u60c5\u53d8\u5f97\u7b80\u5355\uff0c\u4e00\u6b21\u5bfc\u5165\uff0c\u4f7f\u7528\u6240\u6709\u3002 \u5c06\u6240\u6709\u7684\u529f\u80fd\u6a21\u5757\u90fd\u8fdb\u5165\u5230 src \u7684\u540d\u79f0\u7a7a\u95f4\uff0c\u5728 src/__init__.py \u91cc\u9762\u6211\u4eec\u8bbe\u8ba1\u6210\u8fd9\u6837\uff1a # src/__init__.py\nfrom .cmdctl import CmdCtl\nfrom .dogtails import Dogtail\nfrom .find_image import FindImage\nfrom .button_center import ButtonCenter\nclass Src(CmdCtl, FindImage):\ndef __init__(self, **kwargs):\n\"\"\"dogtail or button center param\n :param kwargs: app_name, desc, number\n \"\"\"\nif kwargs:\napp_name = kwargs.get(\"APP_NAME\")\ndesc = kwargs.get(\"DESC\")\nif app_name is None or desc is None:\nraise ValueError\nnumber = kwargs.get(\"number\")\nnumber = number if isinstance(number, int) else -1\n# \u5bf9\u8c61\u7ec4\u5408\nself.dog = Dogtail(app_name, desc, number)\nself.ui = ButtonCenter(app_name, number)\n \u9700\u8981\u4f20\u9012\u53c2\u6570\u7684\u91c7\u7528\u5bf9\u8c61\u7ec4\u5408\uff0c\u6ca1\u6709\u53c2\u6570\u7684\u4f7f\u7528\u7ee7\u627f\uff0c\u7ee7\u627f\u7684\u7c7b\u7b26\u5408 Mixin \u8bbe\u8ba1\u6a21\u5f0f\u3002 \u5e94\u7528\u5e93\u91cc\u9762\u4f7f\u7528\u7684\u65f6\u5019\u5728 widget/base_widget.py \u91cc\u9762\u53ea\u9700\u8981\u552f\u4e00\u7ee7\u627f Src \uff1a # \u5e94\u7528\u5e93\u91cc\u9762\u65b9\u6cd5\u57fa\u7c7b\n# widget/base_widget.py\nfrom src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n \u8981\u4f7f\u7528\u6838\u5fc3\u5e93\u7684\u529f\u80fd\uff0c\u53ea\u9700\u8981\u5199\u4e00\u4e2a\u5bfc\u5165 from src import Src \u5373\u53ef\u3002 \u5199 __init__ \u6784\u9020\u51fd\u6570\u7684\u539f\u56e0\u662f\u901a\u8fc7\u53c2\u6570\u6784\u9020\u5e94\u7528\uff0c\u5e76\u4e14\u4f20\u9012 number \u8fdb\u6765\uff0c\u53ef\u4ee5\u5b9e\u73b0\u591a\u7a97\u53e3\u7684\u63a7\u5236\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3public","title":"3\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09","text":"\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6bcf\u4e2a\u5e94\u7528\u90fd\u662f\u4e00\u4e2a\u5355\u72ec\u7684 py \u6587\u4ef6\uff0c\u76f8\u4e92\u4e4b\u95f4\u662f\u72ec\u7acb\u7684\uff0c\u6bcf\u4e2a py \u6587\u4ef6\u91cc\u9762\u662f\u8be5\u5e94\u7528\u7684\u65b9\u6cd5\u7c7b\uff0c\u6bd4\u5982\uff1a\u6700\u5e38\u7528\u7684\u65b9\u6cd5\u7c7b dde_desktop_public_widget.py # dde_desktop_widget.py\nfrom src import Src\nclass _DdeDesktopPublicBaseWidget(Src):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-desktop\"\nDESC = \"/usr/bin/dde-desktop\"\ndef __init__(self):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC)\nclass DdeDesktopPublicWidget(_DdeDesktopPublicBaseWidget):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u7c7b\"\"\"\ndef click_music_dir_by_ui(self):\n\"\"\"\u5728\u6587\u4ef6\u9009\u62e9\u6846\u70b9\u51fb\u97f3\u4e50\u76ee\u5f55\"\"\"\nself.click(*self.ui.btn_center(\"\u4fa7\u8fb9\u680f-\u97f3\u4e50\")) \ndef click_xxx_by_attr(self):\npass\n \u516c\u5171\u65b9\u6cd5\u5e93\u610f\u4e49\uff1a \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6240\u5c01\u88c5\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\u90fd\u662f\u81f3\u5c11\u88ab2\u4e2a\u5e94\u7528\u90fd\u7528\u5230\u7684\uff0c\u8fd9\u6837\u505a\u53ef\u4ee5\u51cf\u5c11\u6574\u4f53\u4ee3\u7801\u91cf\uff0c\u4ece\u800c\u51cf\u8f7b\u5e94\u7528\u5e93\u4ee3\u7801\u7684\u7ef4\u62a4\u5de5\u4f5c\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u7f16\u5199\u5f62\u5f0f\uff08\u547d\u540d\u89c4\u5219\u3001\u5b9a\u4f4d\u7684\u65b9\u6848\u5199\u6cd5\u3001\u6ce8\u91ca\u7684\u5199\u6cd5\u7b49\u7b49\uff09\u5177\u6709\u4e00\u5b9a\u7684\u6a21\u677f\u4f5c\u7528\uff0c\u8fd9\u6837\u5373\u4f7f\u662f\u5404\u4e2a\u5e94\u7528\u5e93\u90fd\u72ec\u7acb\u7ef4\u62a4\uff0c\u6240\u6709\u7684\u7f16\u7801\u98ce\u683c\u90fd\u662f\u8d8b\u4e8e\u76f8\u540c\u7684\uff0c\u56e0\u4e3a\u5927\u5bb6\u90fd\u5e94\u8be5\u53c2\u7167\u516c\u5171\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u5199\u6cd5\u6765\u5199\u81ea\u5df1\u5e94\u7528\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\u7c7b\uff0c\u8fd9\u6837\u4f7f\u5f97\u4ece\u516c\u53f8\u7684\u89d2\u5ea6\u53bb\u770b\u6240\u6709\u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u90fd\u662f\u7edf\u4e00\u7684\u3002 \u53ef\u4ee5\u901a\u8fc7\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\uff0c\u4e86\u89e3\u5230\u5176\u4ed6\u5e94\u7528\u7684\u529f\u80fd\uff0c\u5bf9\u4e8e\u6211\u4eec\u9700\u6c42\u7406\u89e3\uff0c\u4e86\u89e3\u7cfb\u7edf\u7684\u65b9\u65b9\u9762\u9762\u4e5f\u6709\u597d\u5904\u3002 \u5f53\u7136\uff0c\u5982\u679c\u4f60\u7684\u5e94\u7528\u672c\u8eab\u662f\u5c5e\u4e8e\u6839\u672c\u5c31\u4e0d\u9700\u8981\u548c\u5176\u4ed6\u5e94\u7528\u4ea4\u4e92\u7684\uff0c\u90a3\u4e48\u4f60\u53ef\u80fd\u4e0d\u4f1a\u7528\u5230\u8fd9\u91cc\u9762\u7684\u529f\u80fd\uff0c\u6ca1\u5173\u7cfb\uff0c\u4f60\u6240\u6709\u7684\u65b9\u6cd5\u90fd\u53ef\u4ee5\u76f4\u63a5\u5199\u5728\u5e94\u7528\u5e93\u7684\u4e1a\u52a1\u5c42\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4conftestpy","title":"4\u3001conftest.py","text":"conftest.py \u4ece\u529f\u80fd\u4e0a\u5c06\u662f\u5c5e\u4e8e\u6838\u5fc3\u5e93\uff08src\uff09\u7684\u5185\u5bb9\uff0c\u4f46\u662f\u7531\u4e8e\u5b83\u7684\u7279\u6b8a\u6027\uff0c\u5373\u5b83\u662f\u5bf9\u5e94\u7528\u5e93\u4e2d\u7684\u7528\u4f8b\u751f\u6548\u7684\uff0c\u800c\u4e14\u5b83\u7684\u4f5c\u7528\u57df\u662f\u5f53\u524d\u76ee\u5f55\u53ca\u4ee5\u4e0b\uff0c\u56e0\u6b64\u6211\u4eec\u5c06\u5b83\u653e\u5230\u9879\u76ee\u6839\u76ee\u5f55\u3002\u6211\u4eec\u6846\u67b6\u4e2d\u6709\u4e0d\u5c11\u6838\u5fc3\u529f\u80fd\u90fd\u662f\u5728\u8fd9\u91cc\u9762\u8fdb\u884c\u5f00\u53d1\u7684\uff0c\u540e\u9762\u7b2c\u56db\u7ae0\u4f1a\u8bb2\u5230\u7ec6\u8282\u3002 pytest.ini \u4f5c\u7528\u548c conftest.py \u7c7b\u4f3c\uff0c\u662f Pytest \u6846\u67b6\u7684\u56fa\u5b9a\u914d\u7f6e\u6587\u4ef6\uff0c\u76ee\u524d\u914d\u7f6e\u4e86\u4e00\u4e9b\u901a\u7528\u7684\u547d\u4ee4\u884c\u6267\u884c\u53c2\u6570\uff0c\u4e5f\u653e\u5728\u9879\u76ee\u6839\u76ee\u5f55\u3002 \u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 Hook \u51fd\u6570\uff0capps \u76ee\u5f55\u4e0b\u7684 \u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 fixture \u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5setting","title":"5\u3001setting","text":"\u5168\u5c40\u914d\u7f6e\u6a21\u5757\uff0c\u5305\u542b\u4e86\u4ee5\u4e0b\u914d\u7f6e\u6587\u4ef6\uff1a \uff081\uff09ini \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u914d\u7f6e\u4e00\u4e9b\u5168\u5c40\u7684\u914d\u7f6e\u9879\uff0c\u8b6c\u5982\uff1a\u5931\u8d25\u91cd\u8dd1\u6b21\u6570\u3001\u662f\u5426\u5931\u8d25\u5f55\u5c4f\u3001\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\u3001\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4\u3001\u6267\u884c\u65f6\u65e5\u5fd7\u7ea7\u522b\u3001\u751f\u6210\u7684\u62a5\u544a\u7c7b\u578b\u3001\u4ee5\u53ca\u5206\u5e03\u5f0f\u6267\u884c\u7684\u4e00\u4e9b\u7b56\u7565\u914d\u7f6e\u9879\u7b49\u7b49\u3002 \uff082\uff09config.py \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u63d0\u4f9b\u914d\u7f6e\u6587\u4ef6\u8bfb\u53d6\u3001\u52a8\u6001\u83b7\u53d6\u4e00\u4e9b\u5e38\u91cf\uff08\u5982\u9879\u76ee\u6839\u76ee\u5f55\u7edd\u5bf9\u8def\u5f84 (BASE_DIR)\u3001\u7cfb\u7edf\u67b6\u6784\uff08SYS_FRAME\uff09\u3001\u65f6\u95f4\u5b57\u7b26\u4e32\uff08strftime\uff09\u3001\u672c\u673a USERNAME IP \u7b49\u7b49\uff09\u3001\u516c\u5171 URL \u7b49\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u89c4\u8303","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u7248\u672c\u53ca\u4f9d\u8d56","text":"\u57fa\u7840\u6846\u67b6\u4f1a\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u8fdb\u884c\u7248\u672c\u53d1\u5e03\uff0c\u4e0d\u4e0e\u67d0\u4e2a\u5e94\u7528\u7248\u672c\u7ed1\u5b9a\uff0c\u4f46\u662f\uff0c\u5e94\u7528\u5e93\u4f1a\u4f9d\u8d56\u4e8e\u57fa\u7840\u6846\u67b6\u7684\u7248\u672c\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u5efa\u8bae\u5728\u5e94\u7528\u5e93\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a\u6587\u672c\u6587\u4ef6\u7528\u4e8e\u8bb0\u5f55\u6240\u4f9d\u8d56\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\uff0c\u7c7b\u4f3c\u4e8e\u5f00\u53d1\u5e94\u7528\u7684 debian/control \u6587\u4ef6\u7684\u529f\u80fd\uff0c\u4e3a\u4e86\u4fdd\u6301\u7edf\u4e00\uff0c\u8fd9\u4e2a\u6587\u4ef6\u5c31\u547d\u540d\u4e3a control\uff0c\u653e\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u6838\u5fc3\u5e93\u72ec\u7acb\u6027","text":"\u6838\u5fc3\u5e93\u4e0d\u5efa\u8bae\u9488\u5bf9\u67d0\u4e00\u4e2a\u5e94\u7528\u5355\u72ec\u505a\u4ee3\u7801\u4e0a\u7279\u6b8a\u5904\u7406\uff0c\u901a\u5e38\u8003\u8651\u9488\u5bf9\u67d0\u4e00\u79cd\u573a\u666f\u8fdb\u884c\u5904\u7406\uff0c\u8fd9\u4e9b\u573a\u666f\u901a\u5e38\u662f\u5b58\u5728\u4e00\u4e9b\u5171\u6027\u7684\u3002\u6bd4\u5982\u8bf4\uff1a\u684c\u9762\u7684ID\u5206\u914d\u5b58\u5728\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u903b\u8f91\u5904\u7406\u89e3\u51b3ID\u5206\u914d\u9519\u8bef\u7684\u95ee\u9898\uff0c\u4f46\u662f\u8fd9\u90e8\u5206\u903b\u8f91\u6211\u4eec\u4f1a\u5728\u684c\u9762\u7684\u65b9\u6cd5\u5c42\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u517c\u5bb9\u6027","text":"\u4e3a\u4e86\u4fdd\u6301\u517c\u5bb9\u6027\uff0c\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u539f\u5219\u4e0a\u4e0d\u5bf9\u8001\u65b9\u6cd5\u8fdb\u884c\u4fee\u6539\u6216\u5220\u9664\uff0c\u53ea\u8fdb\u884c\u65b0\u589e\u3002\u6d89\u53ca\u5230\u8001\u65b9\u6cd5\u4fee\u6539\u6216\u5220\u9664\u7684\uff0c\u4f1a\u8fdb\u884c\u63d0\u524d\u9884\u544a\uff0c\u5e76\u5728\u7b2c\u4e8c\u4e2a\u7248\u672c\u4e4b\u540e\uff08\u4e2d\u95f4\u4f1a\u9694\u4e00\u4e2a\u7248\u672c\u8fc7\u5ea6\uff09\u6b63\u5f0f\u5b9e\u65bd\u4fee\u6539\u6216\u5220\u9664\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u547d\u540d\u89c4\u8303","text":" \u7528\u4f8b ID \u6bcf\u4e2a\u5e94\u7528\u81ea\u5df1\u7ef4\u62a4\u4e00\u5957 ID\uff0c\u5728PMS\u4e0a\u7528\u4f8b\u6807\u9898\u4e0a\u5c06\u81ea\u52a8\u5316ID\u4ee5\u6807\u7b7e\u7684\u5f62\u5f0f\u5199\u5165\uff0c\u6bd4\u5982\uff1a[101]\u6253\u5f00-\u542f\u52a8\u5e94\u7528\u540edock\u53f3\u952e\u83dc\u5355 \u4e00\u4e2a\u7528\u4f8b\u7c7b\u91cc\u9762\u6709\u591a\u4e2a\u7528\u4f8b\u65f6\uff0c\u5728\u7528\u4f8b\u540d\u79f0\u540e\u9762\u52a0\u5e8f\u53f7\u3002 class TestFileManager(BaseCase):\n\"\"\"\u6587\u7ba1\u7528\u4f8b\"\"\"\ndef test_xxx_015_1(self):\npass\ndef test_xxx_015_2(self):\npass\n \u6ce8\u610f 015_1\uff0c\u4e0d\u8981\u5199015_01\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 PMS \u4e0a\u7684\u7528\u4f8bID\uff1a PMS \u4e0a\u662f6\u4f4d\u6570\uff0c\u4e0d\u591f\u76f4\u89c2\uff0c\u4e5f\u4e0d\u597d\u7ef4\u62a4\uff0c\u5728\u81ea\u52a8\u5316\u4e0b\u9762\u53bb\u627e\u4e00\u4e2a\u5e26\u6709 6 \u4f4d\u6570\u7684\u6587\u4ef6\u662f\u4e00\u4e2a\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 PMS \u4e0a\u7684 ID \u53ef\u80fd\u4f1a\u53d1\u751f\u53d8\u5316\uff0c\u6bd4\u5982\u5bfc\u51fa\u6765\u5bfc\u8fdb\u53bb\u7684\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u5b58\u5728\u95ee\u9898\uff0c\u5982\u679c\u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u8981\u60f3\u627e\u51fa\u6765\u5bf9\u5e94\u4fee\u6539\u81ea\u52a8\u5316\u7528\u4f8b ID\uff0c\u5c06\u4f1a\u662f\u4ef6\u975e\u5e38\u75db\u82e6\u7684\u4e8b\u60c5\u3002 \u51fd\u6570\u547d\u540d\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5de6\u952e\u70b9\u51fb click \u53f3\u952e\u70b9\u51fb right_click \u53cc\u51fb double_click \u79fb\u52a8 move_to \u62d6\u52a8 drag \u65b0\u5efa new \u62d6\u52a8\u5230 drag_to \u4ece\u54ea\u91cc\u62d6\u52a8\u5230\u54ea\u91cc drag_something_from_xxx_to_xxx \u83b7\u53d6 get \u83b7\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5750\u6807 get_location \u975e\u7279\u6b8a\u6587\u4ef6 file word\u6587\u4ef6 doc text\u6587\u4ef6 text \u6587\u4ef6\u5939 dir \u5173\u952e\u8bcd\u6301\u7eed\u589e\u52a0 \u5e38\u91cf\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5e94\u7528\u540d\u79f0 APP_NAME \u5e94\u7528\u63cf\u8ff0 DESC \u672c\u5e94\u7528\u4ee5\u5916\u7684\u5176\u4ed6\u5e94\u7528\uff0c\u6bd4\u5982\u5e2e\u52a9 HELP \u5176\u4ed6\u540d\u79f0\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u65b9\u6cd5\u5305\u540d widget \u65b9\u6cd5\u6587\u4ef6\u540d\uff08\u6587\u7ba1\u4e3e\u4f8b\uff09 dfm_widget.pytitle_widget.pyright_view_widget.pyleft_view_widget.pypop_widget.pybase_widget.pydfm_assert.py \u65ad\u8a00\u8bed\u53e5\u547d\u540d\u89c4\u8303 \u65ad\u8a00\u8bed\u53e5\u90fd\u662f\u4ee5 assert \u5f00\u5934 \u65ad\u8a00 \u8bed\u53e5 \u5224\u65ad\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_existsassert_file_not_exists \u5224\u65ad\u684c\u9762\u76ee\u5f55\u4e0b\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_exists_in_desktopassert_file_not_exists_in_desktop \u5224\u65ad\u56fe\u7247\u5b58\u5728 assert_image_existsassert_image_not_exists \u5224\u65ad\u5f71\u9662\u4e2d\u662f\u5426\u5b58\u5728\u56fe\u7247 assert_image_exists_in_movieassert_image_not_exists_in_movie \u5224\u65ad\u5143\u7d20\u662f\u5426\u5b58\u5728 assert_element_existassert_element_not_exist \u5224\u65ad\u662f\u5426\u76f8\u7b49 assert_equalassert_not_equal \u5224\u65ad\u662f\u5426\u4e3a\u771f assert_trueassert_false"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5fixture","title":"5\u3001fixture \u89c4\u8303","text":"\u7531\u4e8e Pytest \u6846\u67b6\u4e2d\u652f\u6301 fixture \u7684\u5199\u6cd5\u548c Xunit \u5199\u6cd5\u7684\uff0c\u6240\u4ee5\u5e94\u7528\u5e93\u4e2d\u53ef\u80fd\u5b58\u5728\u6df7\u7528\u7684\u60c5\u51b5\uff0c\u4e3a\u7edf\u4e00\u7f16\u7801\u98ce\u683c\u65b9\u4fbf\u540e\u7eed\u7528\u4f8b\u4ee3\u7801\u7ef4\u62a4\uff0c\u73b0\u505a\u4ee5\u4e0b\u89c4\u8303\u8bf4\u660e\uff1a \u629b\u5f03 Xunit \u7684\u5199\u6cd5\uff0c\u7edf\u4e00\u91c7\u7528 Pytest fixture \u7684\u5199\u6cd5\u3002 \u5e94\u7528\u5185 fixture \u8c28\u614e\u4f7f\u7528 autouse=True \uff0c\u975e\u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u975e\u5e38\u4e0d\u5efa\u8bae\u4f7f\u7528\u8fd9\u4e2a\u53c2\u6570\u3002 \u8c03\u7528 fixture \u4e0d\u80fd\u4f7f\u7528 @pytest.mark.usefixture()\uff0c\u4f7f\u7528\u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u4f20\u5165\u51fd\u6570\u5bf9\u8c61\u3002 \u5efa\u8bae\u5728\u4e00\u4e2a conftest.py \u91cc\u9762\u53bb\u5199\uff0c\u4e00\u4e2a\u5e94\u7528\u4e5f\u5c3d\u91cf\u7ef4\u62a4\u4e00\u4e2a conftest.py\u6587\u4ef6\u3002 fixture \u4e5f\u9700\u8981\u5199\u529f\u80fd\u8bf4\u660e\uff0c\u51fd\u6570\u540d\u79f0\u8981\u6709\u5177\u4f53\u542b\u4e49\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#6","title":"6\u3001\u65b9\u6cd5\u7f16\u5199\u89c4\u8303","text":" \u65b9\u6cd5\u7c7b\u578b\uff1a if \u6ca1\u6709\u7528\u5230\u5b9e\u4f8b\u5bf9\u8c61\uff1a\nif \u6ca1\u6709\u7528\u5230\u7c7b\u5bf9\u8c61\uff1a\n\u5199\u9759\u6001\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @staticmethod\nelse\uff1a\n\u5199\u7c7b\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @classmethod\nelse:\n\u76f4\u63a5\u5199\u5b9e\u4f8b\u65b9\u6cd5\n \u4e3e\u4f8b: class TitleWidget:\ndef click_xxx_by_ui(self):\npass\n@staticmethod\ndef click_xxx_by_ui():\npass\n@classmethod\ndef click_xxx_by_ui(cls):\npass\n \u51fd\u6570\u540d\u79f0\u4e0d\u51fa\u73b0\u6570\u5b57\uff0c\u9700\u8981\u8868\u793a\u6570\u91cf\u7684\u7528\u5355\u8bcd\u8868\u793a\u3002 \u51fd\u6570\u529f\u80fd\u6ce8\u91ca\u3002 \u6ca1\u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg2:xxx\n\"\"\"\n \u6709\u53c2\u6570\uff0c\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg1:xxx\nreturn: xxx\n\"\"\"\n \u200b \u7528 Pycharm \u7684\u6ce8\u91ca\u6a21\u677f\u4e5f\u53ef\u4ee5\uff0c\u53ea\u8981\u4f53\u73b0\u4e86\u53c2\u6570\u7684\u7c7b\u578b\u548c\u8fd4\u56de\u5c31\u884c\u4e86\u3002 \u6682\u4e0d\u8981\u6c42\u5199\u7c7b\u578b\u6ce8\u89e3\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#7case","title":"7\u3001\u7528\u4f8b\uff08case\uff09\u89c4\u8303","text":" \u4ee5\u7c7b\u7684\u5f62\u5f0f\u5199\u7528\u4f8b\uff0c\u7528\u4f8b\u7c7b\u96c6\u6210\u7528\u4f8b\u57fa\u7c7b\u3002 \u7528\u4f8b\u7c7b\u9700\u8981\u5199\u6ce8\u91ca\u3002 \u6d4b\u8bd5\u7528\u4f8b\u51fd\u6570\u8bf4\u660e\uff08\u5efa\u8bae\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u540d\u79f0\uff09 \"\"\"\u53f3\u4fa7\u9884\u89c8-\u56fe\u7247\u7c7b\u578b\u4fe1\u606f\u680f\u57fa\u672c\u4fe1\u606f\"\"\"\n \u4e0d\u5199\u8c03\u8bd5\u4ee3\u7801 if __name__ == '__main__':\npytest.main()\n \u6240\u6709\u7528\u4f8b\u90fd\u7ee7\u627f BaseCase\u3002 BaseCase \u91cc\u9762\u653e\u4e00\u4e9b\u6d4b\u8bd5\u6570\u636e\u7684\u5e38\u91cf\uff0c\u6bd4\u5982\u6587\u4ef6\u540d\u79f0\uff0c\u5e94\u7528\u540d\u79f0\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u4e00\u4e9b\u901a\u7528\u7684\u5b57\u7b26\u4e32\u3002 \u8fd9\u7c7b\u662f\u5c5e\u4e8e\u6d4b\u8bd5\u6570\u636e\u3002 class BaseCase(DfmAssert):\n\"\"\"\u7528\u4f8b\u57fa\u7c7b\"\"\"\nNEW_FILE = \"\u65b0\u5efa\u6587\u672c.txt\"\nTEST_FILE = \"test.txt\"\nNEW_DIR = \"\u65b0\u5efa\u6587\u4ef6\u5939\"\nNEW_WORD = \"\u65b0\u5efaWord\u6587\u6863.doc\"\nAPP_HELP = \"damn\"\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\n\"\"\"\u7528\u4f8b\u6807\u9898\uff08\u590d\u5236PMS\u4e0a\u7528\u4f8b\u6807\u9898\uff09\"\"\"\ndfm = DfmWidget()\ndfm.click_xxx_by_attr(self.NEW_FILE)\ndfm.new_file_in_desktop_by_cmd(self.NEW_FILE)\nself.assert_true(dfm.get_process_status(self.APP_NAME))\n \u7528\u4f8b\u91cc\u9762\u5c3d\u91cf\u51cf\u5c11\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\uff0c\u66f4\u8981\u51cf\u5c11\u76f8\u540c\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\u3002 \u7edf\u4e00\u6587\u4ef6\u6ce8\u91ca\u5934\u3002 #!/usr/bin/env python3\n# _*_ coding:utf-8 _*_\n\"\"\"\n:Author:email@uniontech.com\n:Date :${DATE} ${TIME}\n\"\"\"\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#8","title":"8\u3001\u5176\u4ed6\u89c4\u8303","text":" \u65e5\u5fd7\u6253\u5370\u8981\u5728\u65b9\u6cd5\u6700\u524d\u9762\uff0c\u5426\u5219\u4ee3\u7801\u62a5\u9519\u6ca1\u6709\u65e5\u5fd7\u8f93\u51fa\uff0c\u4e0d\u597d\u5b9a\u4f4d\u95ee\u9898\u3002\uff08\u6211\u4eec\u4f1a\u8003\u8651\u7ee7\u7eed\u4f7f\u7528\u62e6\u622a\u5668\u6253\u5370\u65e5\u5fd7\uff09 \u6240\u6709\u7684\u64cd\u4f5c\u90fd\u9700\u8981\u6709\u65e5\u5fd7\uff0c\u5305\u62ec sleep()\uff0c\u6211\u4eec\u4f1a\u91cd\u5199\u4e00\u4e2a\u6709\u65e5\u5fd7\u8f93\u5165\u7684 sleep\u3002 \u4e1a\u52a1\u5c42\u65e5\u5fd7\u7ea7\u522b\u4e3a INFO\u3002 hook \u51fd\u6570\u53ea\u80fd\u5199\u5230\u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u91cc\u9762\u3002 apps \u76ee\u5f55\u4e0b\u7684 conftest.py \u539f\u5219\u4e0a\u4e0d\u4f1a\u65b0\u589e fixture\u3002 \u56fa\u5b9a\u76ee\u5f55\u6216\u5143\u7d20\u63a7\u4ef6\u7684\u64cd\u4f5c\uff0c\u5c06\u64cd\u4f5c\u65b9\u6cd5\u5199\u6b7b\uff0c\u6587\u4ef6\u7c7b\u64cd\u4f5c\u5c06\u6587\u4ef6\u540d\u7559\u53c2\u6570\u3002 \u8def\u5f84\u62fc\u63a5\u89c4\u8303\uff1a \u7cfb\u7edf\u4e2d\u56fa\u5b9a\u76ee\u5f55\uff0c\u8def\u5f84\u62fc\u63a5\u65f6\u4f7f\u7528\u6ce2\u6d6a\u7b26\u53f7\uff0c\u6bd4\u5982\uff1a~/Desktop/\uff0c\u4e0b\u5c42\u4f7f\u7528 os.path.expanduser()\uff0c\u5b83\u53ef\u4ee5\u81ea\u52a8\u8bc6\u522b\u6ce2\u6d6a\u7b26\u53f7\u3002 \u9879\u76ee\u4e0b\u8def\u5f84\u4f7f\u7528\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u8def\u5f84\uff0c\u6bd4\u5982\uff1aConfig.BASE_PATH\uff0c\u56e0\u4e3a\u9879\u76ee\u662f\u53ef\u4ee5\u5728\u4efb\u610f\u8def\u5f84\u8fd0\u884c\u7684\uff0c\u9700\u8981\u52a8\u6001\u62fc\u63a5\u8def\u5f84\u3002 "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848","text":"# =================================================\n# Author : Mikigo\n# Time : 2022/3/16\n# version \uff1a1.0\n# =================================================\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"AT \u5e94\u7528\u5e93\u6539\u9020\u662f\u57fa\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u8fdb\u884c\u7528\u4f8b\u65b9\u6cd5\u548c\u4e1a\u52a1\u903b\u8f91\u7684\u91cd\u65b0\u8bbe\u8ba1\uff0c\u4ee5\u5b9e\u73b0\u5e94\u7528\u5e93\u9ad8\u6548\u7684\u7f16\u5199\u3001\u7ef4\u62a4\u7528\u4f8b\u53ca\u5176\u65b9\u6cd5\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u6587\u4ef6\u7ba1\u7406\u5668\u4ece\u4e1a\u52a1\u590d\u6742\u5ea6\u548c\u7528\u4f8b\u91cf\u6765\u8bb2\uff0c\u5728\u7cfb\u7edf\u6240\u6709\u5e94\u7528\u4e2d\uff0c\u662f\u5f88\u6709\u4ee3\u8868\u6027\u7684\uff0c\u96be\u5ea6\u4e5f\u662f\u6700\u5927\u7684\uff0c\u56e0\u6b64\u6211\u4eec\u9009\u53d6\u6587\u4ef6\u7ba1\u7406\u5668\u4f5c\u4e3a\u5e94\u7528\u5e93\u6539\u9020\u7684\u5b9e\u9a8c\u5e94\u7528\uff0c\u7ed9\u540e\u7eed\u5176\u4ed6\u5e94\u7528\u6539\u9020\u63d0\u4f9b\u5207\u5b9e\u53ef\u884c\u7684\u601d\u8def\u548c\u65b9\u6848\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u5206\u5c42\u8bbe\u8ba1\u56fe","text":"\u6574\u4f53\u4ecd\u7136\u9075\u5faa PO \u8bbe\u8ba1\u7406\u5ff5\uff0c\u6839\u636e\u4e1a\u52a1\u9700\u8981\uff0c\u5c06\u6587\u7ba1\u4e1a\u52a1\u5c42\u8fdb\u884c 3 \u5c42\u5212\u5206\uff1a "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-dde-file-manager # \u5e94\u7528\u4ed3\u5e93\n\u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 test_xxx_001.py\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u00a0\u251c\u2500\u2500 __init__.py\n\u2502 \u00a0\u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u00a0\u251c\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u00a0\u251c\u2500\u2500 base_widget.py # \u65b9\u6cd5\u57fa\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 title_widget.py # title \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 right_view_widget.py # right view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 left_view_widget.py # left view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 pop_widget.py # pop \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 dfm_widget.py # \u65b9\u6cd5\u7684\u7edf\u4e00\u51fa\u53e3\n\u2502 \u00a0\u2514\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 tag # \u7528\u4f8b\u6807\u7b7e\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 xxx.csv # \u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2514\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u57fa\u7c7b","text":" \u7ee7\u627f\u6838\u5fc3\u5c42\u7684\u5404\u4e2a\u6a21\u5757\u7c7b\u3002 \u62bd\u53d6\u64cd\u4f5c\u5c42\u7684\u4e00\u4e9b\u57fa\u7840\u65b9\u6cd5\u3002 \u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u7684\u4e00\u4e9b\u516c\u5171\u65b9\u6cd5\u3002 \u8def\u5f84\u7ec4\u88c5\u65b9\u6cd5\u3002 \u4e00\u4e9b\u4e1a\u52a1\u5c42\u76f8\u5173\u7684\u53d8\u91cf\u3001\u5e38\u91cf\u3001shell\u547d\u4ee4\u3001\u5750\u6807\u3002 \u65b9\u6cd5\u57fa\u7c7b\u7684\u5199\u6cd5\uff1a from src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u64cd\u4f5c\u5c42","text":" \u6a21\u5757\u5212\u5206 \u6309\u7167\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u6587\u7ba1\u4e3b\u754c\u9762\u5206\u4e3a\u4e09\u4e2a\u533a\u57df\uff1a\u6807\u9898\u680f\u3001\u53f3\u8fb9\u89c6\u56fe\u533a\u57df\u3001\u5de6\u8fb9\u89c6\u56fe\u533a\u57df \u5f39\u7a97\uff1a\u8bbe\u7f6e\u754c\u9762\u5f39\u7a97\u3001\u4fdd\u9669\u7bb1\u5f39\u7a97\u3001\u5220\u9664\u786e\u8ba4\u5f39\u7a97\u3001\u53ca\u5404\u79cd\u7f51\u7edc\u5f39\u7a97 \u53f3\u952e\u83dc\u5355\uff1a\u6682\u65f6\u4e0d\u8003\u8651\u4e3a\u5355\u72ec\u7684\u6a21\u5757\uff0c\u8003\u8651\u4ee5\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6848\u505a\u6210\u516c\u5171\u5e93\u3002 \u5404\u4e2a\u6a21\u5757\u53ea\u7ee7\u627f\u57fa\u7c7b from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u6784\u9020\u51fd\u6570\u91cc\u9762\u4e0d\u6784\u9020\u5bf9\u8c61\uff0c\u53ef\u4ee5\u521d\u59cb\u5316\u4e00\u4e9b\u53d8\u91cf\u3002 \u4e0d\u540c\u7684\u5b9a\u4f4d\u65b9\u6848\u8c03\u7528\u4e0d\u540c\u7684\u5b9a\u4f4d\u5de5\u5177\u5bf9\u8c61\u3002 self.dog\nself.ui\nself.d_bus\n \u65b9\u6cd5\u7f16\u5199 \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u5e94\u7528\u5c42","text":" \u7ee7\u627f\u64cd\u4f5c\u5c42\u7684\u6240\u6709\u7c7b\u3002 \u4ec5\u4ec5\u7528\u4e8e\u7528\u4f8b\u4e2d\u5bfc\u5165\u65b9\u4fbf\uff0c\u4e0d\u505a\u5176\u4ed6\u4e8b\u60c5\u3002 class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n DfmAssert \u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u7ee7\u627f\uff0c\u65b9\u4fbf\u4f7f\u7528\u65ad\u8a00\u8bed\u53e5\u3002 from apps.dde_file_manager.widget.dfm_widget import DfmWidget\nfrom public.assert import Assert\nclass DfmAssert(Assert):\ndef assert_file_exists_in_desktop(self, file_name):\nself.assert_file_exists(f\"~/Desktop{file_name}\")\n...\nDfmWidget().get_file_in_desktop()\n \u7528\u4f8b\u91cc\u9762\u76f4\u63a5\u7ee7\u627f\uff0c\u65b9\u4fbf\u5728\u7528\u4f8b\u91cc\u9762\u4f7f\u7528 self \u8fdb\u884c\u65ad\u8a00\uff0c\u66f4\u7b26\u5408\u65ad\u8a00\u7684\u4f7f\u7528\u4e60\u60ef\uff0c\u7528\u4f8b\u903b\u8f91\u4e0a\u66f4\u6e05\u695a\u3002 class BaseCase(DfmAssert):\npass\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\nself.assert_file_exists_in_desktop(\"xxx\")\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u903b\u8f91\u4e3e\u4f8b","text":"\u7528\u4f8b\u4ee3\u7801\u8c03\u7528\u903b\u8f91\u4e3e\u4f8b\uff1a # BaseWidget\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n# =============================================\n# TitleWidget\nclass TitleWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_title_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# RightViewWidget\nclass RightViewWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_right_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# =============================================\n# \u51fa\u53e3 DfmWidget\nclass DfmWidget(TitleWidget, RightViewWidget):\npass\n# =============================================\n# in case\nfrom apps.dde_file_manager.widget.dfm_widget import DfmWidget\ndfm = DfmWidget()\ndfm.click_xxx_title_by_ui()\ndfm.click_xxx_right_by_ui()\ndfm.dog.print_desc()\ndfm.ui.print_number()\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u5de5\u7a0b\u6539\u9020\u5b9e\u65bd\u6b65\u9aa4","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_2","title":"1\u3001\u5de5\u7a0b\u4ee3\u7801\u62c9\u53d6","text":"1.1. \u5c06\u81ea\u52a8\u5316\u57fa\u7840\u6846\u67b6\u7684\u529f\u80fd\u62c9\u5230\u672c\u5730 Autotest Basic Frame \uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame 1.2. \u5c06\u5e94\u7528\u5e93\u4ee3\u7801\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u5e94\u7528\u5e93\u7684\u4ed3\u5e93\u547d\u540d\u5e94\u8be5\u662f\u957f\u8fd9\u6837\u7684 autotest_deepin_xxx\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_2","title":"2\u3001\u8c03\u6574\u5de5\u7a0b\u76ee\u5f55","text":"\u6309\u7167 \u65b9\u6848\u8bbe\u8ba1-\u76ee\u5f55\u7ed3\u6784 \u8fdb\u884c\u76ee\u5f55\u8c03\u6574\uff0c\u5c3d\u91cf\u4f7f\u7528\u7f16\u8f91\u5668\u8fdb\u884c\u76f8\u5e94\u7684\u8c03\u6574\uff0c\u7f16\u8f91\u5668\u63a8\u8350\u4f7f\u7528 Pycharm \uff0c\u4ee5\u4e0b\u64cd\u4f5c\u5747\u5728 Pycharm \u91cc\u9762\u53ef\u5b9e\u73b0\u3002 2.1. \u9700\u8981\u79fb\u52a8 py \u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u76f4\u63a5\u5728\u7f16\u8f91\u5668\u91cc\u9762\uff0c\u4f7f\u7528\u9f20\u6807\u9009\u4e2d\u5e76\u6309\u4f4f\uff0c\u4e4b\u540e\u62d6\u52a8\u5230\u76ee\u6807\u4f4d\u7f6e\u5373\u53ef\uff0cPycharm \u4f1a\u5c3d\u53ef\u80fd\u7684\u81ea\u52a8\u89e3\u51b3\u79fb\u52a8\u5bfc\u81f4\u7684\u8def\u5f84\u95ee\u9898\u3002\u6ce8\u610f\uff0c\u6211\u8bf4\u7684\u662f\u201c\u5c3d\u53ef\u80fd\u201d\uff0c\u6709\u4e9b\u9a9a\u64cd\u4f5c\u7f16\u8f91\u5668\u662f\u65e0\u6cd5\u81ea\u52a8\u5904\u7406\u7684\u3002\u5982\u679c\u6ca1\u6709\u88ab\u7f16\u8f91\u5668\u81ea\u52a8\u5904\u7406\u7684\u8def\u5f84\u95ee\u9898\uff0c\u540e\u7eed\u53ea\u80fd\u624b\u52a8\u89e3\u51b3\u3002 2.2. \u9700\u8981\u91cd\u547d\u540d\u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u5728\u7f16\u8f91\u5668\u91cc\u9762\u9009\u4e2d\u6587\u4ef6\uff0c\u7136\u540e\u4f7f\u7528\u5feb\u6377\u952e Shift + F6 \uff08\u5982\u679c\u5feb\u6377\u952e\u6ca1\u53cd\u5e94\uff0c\u6587\u4ef6\u53f3\u952e\u83dc\u5355 Refactor \u2014\u2014 Rename\uff09\uff0c\u7136\u540e\u5728\u8f93\u5165\u6846\u4e2d\u8f93\u5165\u8981\u91cd\u547d\u540d\u7684\u540d\u79f0\uff0c\u540c\u65f6\uff0c\u786e\u8ba4\u52fe\u9009 Search for references \u548c Search in comments and strings \u8fd9\u4e24\u4e2a\u9009\u9879\uff0c\u6700\u540e\u6309\u56de\u8f66\u6216\u8005\u9f20\u6807\u70b9 Refactor \u3002 \u6ce8\u610f\uff0c\u6b64\u65f6\u7f16\u8f91\u5668\u53ef\u80fd\u4f1a\u63d0\u793a\u4f60\uff0c\u4f60\u8fd9\u4e2a\u91cd\u547d\u540d\u7684\u64cd\u4f5c\u5173\u8054\u4e86\u591a\u4e2a\u6a21\u5757\uff0c\u5b83\u88ab\u591a\u4e2a\u5730\u65b9\u90fd\u4f7f\u7528\u5230\u4e86\uff0c\u76f8\u5173\u7684\u6a21\u5757\u662f\u5426\u4e5f\u4e00\u8d77\u6539\u540d\u4e86\uff0c\u8fd9\u4e0d\u5e9f\u8bdd\u5417\uff0c\u7528\u8fd9\u4e2a\u529f\u80fd\u5c31\u662f\u60f3\u628a\u5173\u8054\u5230\u7684\u90fd\u4fee\u6539\uff0c\u4e0d\u7136\u6211\u4e3a\u4ec0\u4e48\u4e0d\u7528\u6587\u7ba1\u7684\u91cd\u547d\u540d\u529f\u80fd\u5462\uff0c\u522b\u60f3\u4e86\uff0c\u76f4\u63a5\u70b9\u5de6\u4e0b\u89d2\u7684 Refactor \u6309\u94ae\uff0c\u5c31\u662f\u5e72\u3002 \u7c7b\u540d\u3001\u51fd\u6570\u540d\u7684\u91cd\u547d\u540d\u90fd\u5c3d\u91cf\u91c7\u7528\u8fd9\u79cd\u65b9\u6848\uff0c\u56e0\u4e3a\u7f16\u8f91\u5668\u4f1a\u81ea\u52a8\u7ed9\u6211\u4eec\u627e\u5230\u5173\u8054\u7684\u5730\u65b9\uff0c\u7136\u540e\u540c\u6b65\u4fee\u6539\u6389\u3002\u4f60\u53ef\u5343\u4e07\u522b\u76f4\u63a5\u5220\u4e86\u4fee\u6539\u540d\u79f0\uff0c\u4e0d\u7136\u4f60\u53ef\u80fd\u4f1a\u82b1\u4e0a\u4e00\u5929\u7684\u65f6\u95f4\u6765\u89e3\u51b3\u91cd\u547d\u540d\u7684\u95ee\u9898\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u5b9e\u73b0\u6838\u5fc3\u5e93\u63a5\u53e3","text":"3.1. BaseWidget \u5728 BaseWidget \u91cc\u9762\u628a\u8be5\u5199\u7684\u90fd\u5199\u597d\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u4e0a\u9762\u7684\u8bbe\u8ba1\u7406\u5ff5\u6765\u5199\u3002 \u5982\u679c\u4f60\u5acc\u9ebb\u70e6\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u6587\u7ba1\u7684\u5b9e\u9645\u5de5\u7a0b\u4ee3\u7801 autotest_dde_file_manager : https://gerrit.uniontech.com/admin/repos/autotest_dde_file_manager \u3002 3.2. \u64cd\u4f5c\u5c42 \u5982\u679c\u4f60\u662f\u65b0\u5199\u9879\u76ee\uff0c\u4f60\u4f1a\u53d1\u73b0\u4e00\u5207\u90fd\u662f\u90a3\u4e48\u7684\u7b80\u5355\u3001\u76f4\u63a5\uff0c\u6309\u7167\u6211\u4eec\u63d0\u4f9b\u7ed9\u4f60\u7684\u63a5\u53e3\u5199\u7528\u4f8b\u7684\u64cd\u4f5c\u65b9\u6cd5\u5c31\u597d\u4e86\u3002 \u5982\u679c\u4f60\u662f\u60f3\u5bf9\u539f\u6765\u7684\u5de5\u7a0b\u8fdb\u884c\u6539\u9020\uff0c\u4f60\u9700\u8981\u6309\u7167\u6838\u5fc3\u5e93\u65b9\u6cd5\u7684\u8c03\u7528\uff0c\u5c06\u4f60\u4e4b\u524d\u5199\u7684\u6bcf\u4e2a\u65b9\u6848\u8fdb\u884c\u5bf9\u5e94\u7684\u4fee\u6539\uff0c\u5305\u62ec\u7c7b\u548c\u65b9\u6cd5\u7684\u547d\u540d\u3001\u65b9\u6cd5\u5185\u6240\u8981\u7528\u5230\u4e0d\u540c\u5b9a\u4f4d\u65b9\u6cd5\u7684\u5199\u6cd5\u4fee\u6539\u3002 \u8fd9\u65f6\u5019\u4f60\u53ef\u80fd\u4f60\u7684\u4ee3\u7801\u4e2d\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u62a5\u9519\uff0c\u4e0d\u7528\u62c5\u5fc3\uff0c\u4f60\u53ef\u4ee5\u4ece\u4e1a\u52a1\u903b\u8f91\u51fa\u53d1\uff0c\u60f3\u6e05\u695a\u8fd9\u4e2a\u65b9\u6cd5\u662f\u5e72\u4ec0\u4e48\u7684\u3001\u64cd\u4f5c\u7684\u5bf9\u8c61\u662f\u4ec0\u4e48\u3001\u53c2\u6570\u662f\u4ec0\u4e48\uff0c\u6ce8\u610f\u8fd9\u4e9b\u4fee\u6539\u662f\u4f1a\u5f71\u54cd\u5230\u7528\u4f8b\u4ee3\u7801\u91cc\u9762\u7684\uff0c\u6ca1\u5173\u7cfb\uff0c\u7528\u4f8b\u91cc\u9762\u672c\u6765\u4e5f\u5e94\u8be5\u88ab\u5173\u8054\u4fee\u6539\u3002 3.3. \u628a\u914d\u7f6e\u6a21\u5757\u5199\u597d\uff0c\u8fd9\u90e8\u5206\u57fa\u672c\u53ef\u4ee5\u590d\u5236\u6587\u7ba1\u7684\u4ee3\u7801\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4_1","title":"4\u3001\u8def\u5f84\u5904\u7406","text":"4.1. \u5bfc\u5165\u8def\u5f84 \u65b9\u6cd5\u548c\u7528\u4f8b\u4e2d\u90fd\u4f1a\u6d89\u53ca\u5230\u5bfc\u5165\u8def\u5f84\u7684\u4fee\u6539\uff0c\u5728\u4fee\u6539\u8def\u5f84\u65f6\uff0c\u5efa\u8bae\u4f60\u4f7f\u7528 Ctrl + Shift + R \u5168\u5c40\u66ff\u6362\uff0c\u4f1a\u5c06\u6574\u4e2a\u9879\u76ee\u4e0b\u7684\u76f8\u540c\u5730\u65b9\u90fd\u4fee\u6539\u5230\uff0c\u5f53\u7136\uff0c\u4f60\u4e5f\u53ef\u4ee5\u5728\u5c0f\u5f39\u7a97\u4e2d\u4fee\u6539\u5168\u5c40\u66ff\u6362\u4e3a\u5c40\u90e8\u76ee\u5f55\u4e0b\u66ff\u6362\u3002\u5904\u7406\u90a3\u79cd\u6ca1\u6709\u5173\u8054\u5173\u7cfb\uff0c\u4f46\u662f\u53c8\u662f\u76f8\u540c\u540d\u79f0\u7684\u91cd\u547d\u540d\uff0c\u6211\u4e5f\u63a8\u8350\u4f7f\u7528\u8fd9\u79cd\u65b9\u5f0f\u8fdb\u884c\u91cd\u547d\u540d\u3002 \u6ce8\u610f\uff0c\u5168\u5c40\u66ff\u6362\u7684\u65b9\u5f0f\u4efb\u7136\u65e0\u6cd5\u4fdd\u8bc1\u771f\u7684\u5168\u5c40\u88ab\u66ff\u6362\u4e86\uff08\u53ef\u80fd\u662f\u7f16\u8f91\u5668\u7684 Bug \u5427\uff09\uff0c\u6240\u4ee5\u4f60\u4ecd\u7136\u9700\u8981\u624b\u52a8\u770b\u4e0b\u5404\u5904\u662f\u5426\u4fee\u6539\u5230\u4f4d\u3002 4.2. \u8d44\u6e90\u8def\u5f84 \u4e00\u4e9b\u7528\u4f8b\u8d44\u6e90\u9700\u8981\u6839\u636e config.py \u91cc\u9762\u7684\u8def\u5f84\u914d\u7f6e\u8fdb\u884c\u8d44\u6e90\u8def\u5f84\u7684\u62fc\u63a5\uff0c\u5982\u679c\u4f60\u539f\u6765\u672c\u6765\u5c31\u6709\u4e00\u4e2a\u51fd\u6570\u4e13\u95e8\u7528\u4e8e\u7ec4\u88c5\u8def\u5f84\u7684\uff0c\u90a3\u4f60\u53ea\u9700\u8981\u4fee\u6539\u8fd9\u4e00\u4e2a\u5730\u65b9\u5c31\u597d\u4e86\uff0c\u5982\u679c\u4f60\u4e4b\u524d\u5e76\u6ca1\u6709\u8fd9\u6837\u7684\u8bbe\u8ba1\uff0c\u90a3\u53ef\u80fd\u9700\u8981\u4fee\u6539\u5927\u91cf\u6d89\u53ca\u5230\u8d44\u6e90\u8def\u5f84\u7684\u5730\u65b9\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5","title":"5\u3001\u8c03\u8bd5\u548c\u7f16\u5199\u7528\u4f8b","text":"\u4ee5\u4e0a\u51e0\u4e2a\u6b65\u9aa4\u505a\u5b8c\uff0c\u57fa\u672c\u5c31\u53ef\u4ee5\u8fdb\u884c\u7528\u4f8b\u4ee3\u7801\u7684\u8c03\u8bd5\u4e86\uff0c\u8fd9\u90e8\u5206\u5de5\u4f5c\u4e3b\u8981\u89e3\u51b3\u4f60\u4e4b\u524d\u51e0\u4e2a\u6b65\u9aa4\u9057\u6f0f\u7684\u95ee\u9898\uff0c\u5982\u679c\u6240\u6709\u7528\u4f8b\u90fd\u8c03\u8bd5\u901a\u8fc7\u4e86\uff0c\u90a3\u4e48\u5de5\u7a0b\u6539\u9020\u5c31\u5168\u90e8\u5b8c\u6210\u4e86\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/","title":"AT \u5f00\u53d1\u89c4\u8303","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u5f00\u53d1\u89c4\u8303\u662f\u6839\u636e\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fd0\u884c\u4e24\u5e74\u591a\u6765\uff0c\u9047\u5230\u95ee\u9898\u89e3\u51b3\u95ee\u9898\u800c\u5f62\u6210\u7684\u4e00\u4e9b\u89e3\u51b3\u65b9\u6848\uff0c\u6216\u8005\u8bf4\u7ecf\u9a8c\u603b\u7ed3\uff1b\u8fd9\u4e9b\u7ecf\u9a8c\u7b26\u5408\u6211\u4eec\u73b0\u9636\u6bb5 AT \u6240\u5e94\u7528\u7684\u573a\u666f\u9700\u8981\uff0c\u4e5f\u662f\u6211\u4eec\u7ecf\u8fc7\u957f\u671f\u601d\u8003\uff0c\u4e0d\u65ad\u8bd5\u9519\u4e0d\u65ad\u4fee\u6b63\uff0c\u5e76\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u5b9e\u8df5\u4e2d\u68c0\u9a8c\u8fc7\u53ef\u884c\u7684\u3002\u4ee5\u6b64\uff0c\u5e0c\u671b\u80fd\u5e2e\u52a9\u53c2\u4e0e\u5230\u81ea\u52a8\u5316\u7684\u76f8\u5173\u4eba\u5458\u51cf\u5c11\u8bd5\u9519\u6210\u672c\uff0c\u66f4\u597d\u3001\u66f4\u5feb\u7684\u7f16\u5199\u7528\u4f8b\u53ca\u7ef4\u62a4\u7528\u4f8b\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_1","title":"\u4e00\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u89c4\u8303","text":"\u6807\u7b7e\u5316\u7ba1\u7406\u6587\u6863\u8bf7\u53c2\u8003\uff1a \u300a\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u64cd\u4f5c\u6307\u5f15\u300b \u4ee5\u4e0b\u8bf4\u51e0\u4e2a\u5bb9\u6613\u51fa\u73b0\u7684\u95ee\u9898\uff1a"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1","title":"1. \u5bf9\u5e94\u5173\u7cfb","text":" \u5199\u5b8c\u81ea\u52a8\u5316\u7528\u4f8b\u4e4b\u540e\uff0c\u8bf7\u5728 CSV \u6587\u4ef6\u4e2d\u6807\u8bb0\u7528\u4f8b\u7684 ID\u3001\u7b49\u7ea7\u3002\u4e3a\u4e86\u63d0\u9192\u6807\u8bb0\uff0c\u6267\u884c\u7528\u4f8b\u65f6\u5728\u9996\u884c\u4f1a\u8f93\u51fa ERROR \u65e5\u5fd7\uff1a CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94\u7684 ID\uff1b \u5728\u6700\u7ec8\u63d0\u4ea4\u4ee3\u7801\u4e4b\u524d\uff0c\u4f60\u9700\u8981\u5728 CSV \u6587\u4ef6\u91cc\u9762\u5c06ID\u3001\u7528\u4f8b\u7b49\u7ea7\u7b49\u6807\u7b7e\u8865\u5168\uff0c\u5982\u679c CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94 ID\uff0c\u540e\u7eed\u5728\u6279\u91cf\u6267\u884c\u7684\u65f6\u5019\uff0c\u8fd9\u4e9b\u7528\u4f8b\u662f\u4e0d\u4f1a\u6267\u884c\u7684\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2","title":"2. \u540d\u79f0\u4e00\u81f4","text":" CSV \u6587\u4ef6\u7684\u6587\u4ef6\u540d\u3001\u7528\u4f8b\u51fd\u6570\u4e2d\u95f4\u7684\u540d\u79f0\u4e00\u81f4\u3001\u7528\u4f8b py \u6587\u4ef6\u4e2d\u95f4\u7684\u540d\u79f0\uff0c\u8fd9\u4e09\u4e2a\u540d\u79f0\u4e00\u81f4\u3002 \u4e3e\u4f8b\uff1a # test_music_001.py\ndef test_music_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u90a3\u4e48 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e3a music.csv\u3002 AT \u6846\u67b6\u5e95\u5c42\u4ee3\u7801\u5b9e\u73b0\u662f\u5c06 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e0e\u7528\u4f8b\u51fd\u6570\u540d\u79f0\u540d\u79f0\uff08item.name\uff09\u8fdb\u884c\u5bf9\u5e94\uff0c\u56e0\u6b64\uff0c\u6ce8\u610f CSV \u6587\u4ef6\u540d\u79f0\u5bf9\u5e94\u7684\u662f\u7528\u4f8b\u51fd\u6570\u540d\u79f0\uff0c\u5373 def test_music_001 \u91cc\u9762\u7684 music \uff0c\u800c\u4e0d\u662f test_music_001.py \u91cc\u9762\u7684 music \u3002 \u8fd9\u91cc\u7ec6\u7ec6\u54c1\u4e00\u4e0b\u54c8~ \u5982\u679c\u4f60\u5c06\u4e0a\u4f8b\u5199\u6210\u4e86\u8fd9\u6837: # test_music_001.py\ndef test_movie_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u7528\u4f8b\u6267\u884c\u6ca1\u95ee\u9898\uff0c\u4f46\u662f\u6807\u7b7e\u5316\u7ba1\u7406\u662f\u4e0d\u751f\u6548\u7684\uff0c\u6846\u67b6\u65e0\u6cd5\u5c06 music.csv\u6587\u4ef6\u91cc\u9762\u6807\u7b7e\uff0c\u6dfb\u52a0\u5230 test_movie_001\u8fd9\u4e2a\u7528\u4f8b\u4e2d\uff0c\u56e0\u4e3a\u4ed6\u4eec\u6ca1\u6709\u5bf9\u5e94\u5173\u7cfb\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#tag","title":"\u4e8c\u3001\u5206\u652f\u53ca tag \u7ba1\u7406\u89c4\u8303","text":"\u53c2\u8003\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u4ee3\u7801\u7ba1\u7406\u89c4\u8303\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2-tag","title":"2. \u5e94\u7528\u5e93 tag","text":" \u5e94\u7528\u5e93 tag \u6839\u636e\u5e94\u7528\u4ea4\u4ed8\u8282\u70b9\u751f\u6210\uff0c\u6bcf\u6b21\u6253 tag \u4e4b\u524d\uff0c\u76f8\u5173\u6d4b\u8bd5\u4eba\u5458\u9700\u8981\u8fdb\u884c\u7528\u4f8b\u8c03\u8bd5\uff1b \u8c03\u8bd5\u7528\u4f8b\u662f\u6307\u7684\u5728\u5168\u67b6\u6784\uff08x86\u3001arm\u3001mips\uff09\u4e0a\u8c03\u8bd5\u901a\u8fc7\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\u8fbe\u5230 90% \u4ee5\u4e0a\u624d\u80fd\u6253 tag\uff0c\u901a\u8fc7 Jenkins \u6267\u884c\u5668\u6267\u884c\u7528\u4f8b\uff0c\u4fdd\u7559\u901a\u8fc7\u7387\u7ed3\u679c\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\uff1a\u901a\u8fc7\u7528\u4f8b\u6570 / (\u603b\u7528\u4f8b\u6570 - \u5df2\u5e9f\u5f03\u7528\u4f8b) \u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u7b97\u901a\u8fc7 Jenkins \u6267\u884c\u5668 \u4f60\u53ef\u80fd\u4f1a\u5728\u4e00\u4e2a\u4ea4\u4ed8\u5468\u671f\u5185\u6301\u7eed\u7684\u8fdb\u884cAT\u7528\u4f8b\u8c03\u8bd5\uff0c\u4f46\u662f\u6700\u7ec8 AT \u7528\u4f8b\u6253 tag \u7684\u5e94\u7528\u7248\u672c\uff0c\u9700\u8981\u4f7f\u7528\u5e94\u7528\u96c6\u6210\u4ea4\u4ed8\u7684\u6700\u65b0\u5e94\u7528\u7248\u672c\uff0c\u53ef\u4ee5\u4f7f\u7528\u5e94\u7528\u7684\u63d0\u6d4b\u7248\u672c\uff1b\u4e00\u5b9a\u8981\u786e\u4fdd\u8c03\u8bd5\u7528\u4f8b\u7684\u5e94\u7528\u7248\u672c\u662f\u6700\u65b0\u7684\uff0c\u4e0d\u7136\u96c6\u6210\u8fdb\u53bb\u4e4b\u540e\uff0c\u6301\u7eed\u96c6\u6210\u5c31\u4f1a\u51fa\u95ee\u9898\uff1b tag \u53f7\u600e\u4e48\u6253\uff1f \u6839\u636e\u6301\u7eed\u96c6\u6210\u7684\u8981\u6c42\u751f\u6210\uff0c\u5176\u4e2d\u5e94\u7528\u7248\u672c\u53f7\u9700\u8981\u4e0e\u9879\u76ee\u7ecf\u7406\u786e\u8ba4\u672c\u6b21\u5373\u5c06\u96c6\u6210\u7684\u5e94\u7528\u7248\u672c\u53f7\u662f\u591a\u5c11\uff1b tag \u7684 commit \u4fe1\u606f\u683c\u5f0f\uff1a # commit msg\nversion:5.6.5\n \u5176\u4e2d 5.6.5 \u5199\u5e94\u7528\u7684\u96c6\u6210\u7248\u672c\u53f7\u3002 \u751f\u6210 tag \u7684\u547d\u4ee4\u53c2\u8003\uff1a\u300aGit \u6807\u7b7e\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3-tag","title":"3. \u57fa\u7840\u6846\u67b6 tag","text":"\u57fa\u7840\u6846\u67b6 tag \u4e0d\u4e0e\u4e1a\u52a1\u6302\u94a9\uff0c\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u6309\u9700\u53d1\u5e03\u7248\u672c\uff0c\u5728\u6839\u76ee\u5f55\u4e0b CURRENT \u6587\u4ef6\u4e2d\u8bb0\u5f55\u7684\u5f53\u524d\u7248\u672c\u53f7\u548c\u5386\u53f2\u7248\u672c\u53f7\uff0c\u53ca\u5176\u5bf9\u5e94\u65b0\u589e\u4e86\u54ea\u4e9b\u529f\u80fd\uff0c\u6709\u52a9\u4e8e\u5e94\u7528\u9009\u62e9\u5408\u9002\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\u3002 # CURRENT\n[current]\ntag = 0.9.5\n \u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u7684 control \u6587\u4ef6\u8bb0\u5f55\u5f53\u524d\u5e94\u7528\u5e93\u4f9d\u8d56\u7684\u57fa\u7840\u5e93\u7248\u672c\u3002 # control\n[Depends]\nautotest-basic-frame = 0.9.5\n \u7528\u4f8b\u5728\u6267\u884c\u65f6\u4f1a\u6821\u9a8c\u4e24\u4e2a\u6587\u4ef6\u7684\u7248\u672c\u53f7\u662f\u5426\u4e00\u81f4\uff0c\u5982\u679c\u4e0d\u4e00\u81f4\uff0c\u4f1a\u6253\u5370 error \u65e5\u5fd7\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_2","title":"\u4e09\u3001\u4ed3\u5e93\u6743\u9650\u7ba1\u7406","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_1","title":"1. \u57fa\u7840\u6846\u67b6","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u4ed3\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame \u57fa\u7840\u6846\u67b6\u4e0d\u5141\u8bb8\u533f\u540d\u8bbf\u95ee\uff0c\u5982\u679c\u4f60\u767b\u5f55 gerrit \u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u8bbf\u95ee\u4ee5\u4e0a\u94fe\u63a5\uff0c\u5219\u9700\u8981\u7533\u8bf7\u8bbf\u95ee\u6743\u9650\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_1","title":"2. \u5e94\u7528\u4ed3\u5e93","text":" \u81ea\u52a8\u5316\u5e94\u7528\u4ed3\u5e93\uff1a https://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684 app_name \u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_3","title":"\u56db\u3001\u65b9\u6cd5\u7f16\u5199&\u8c03\u7528\u89c4\u8303","text":"\u65b9\u6cd5\u7f16\u5199\u6574\u4f53\u8bbe\u8ba1\u601d\u8def\u53c2\u8003\uff1a[\u300aAT\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b]"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_2","title":"1. \u65b9\u6cd5\u7f16\u5199","text":"\u5199\u65b9\u6cd5\u7684\u65f6\u5019\u6ce8\u610f\u65b9\u6cd5\u5f52\u5c5e\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget\uff0c\u65b9\u6cd5\u662f\u5728\u54ea\u4e2a\u533a\u57df\u64cd\u4f5c\u7684\uff0c\u5c31\u5199\u5728\u54ea\u4e2a\u7c7b\u91cc\u9762\u3002 \u4e3e\u4f8b\uff1a from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n\"\"\"\u70b9\u51fb\u6807\u9898\u680fxxx\"\"\"\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_2","title":"2. \u65b9\u6cd5\u8c03\u7528","text":" \u5728\u7528\u4f8b\u4e2d\u8c03\u7528\u65b9\u6cd5\uff0c\u901a\u8fc7\u8be5\u5e94\u7528\u552f\u4e00\u7684\u51fa\u53e3\u8fdb\u884c\u8c03\u7528\uff0c\u6bd4\u5982\u6587\u7ba1\uff1a class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n \u4e0d\u8981\u5728\u7528\u4f8b\u4e2d\u5355\u72ec\u53bb\u8c03\u7528 TitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u8fd9\u4e9b\u7c7b\uff0c\u5426\u5219\u540e\u671f\u7528\u4f8b\u4f1a\u53d8\u5f97\u4e0d\u597d\u7ef4\u62a4\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_4","title":"\u4e94\u3001\u7528\u4f8b\u7f16\u5199\u89c4\u8303","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_3","title":"1. \u57fa\u4e8e\u7c7b\u5199\u7528\u4f8b","text":"\u6240\u6709\u7528\u4f8b\u90fd\u5e94\u8be5\u57fa\u4e8e\u7c7b\u53bb\u5199\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001(self):\n\"\"\"\u97f3\u4e50\u542f\u52a8\"\"\"\n \u6ce8\u610f\u4ee5\u4e0b\u51e0\u70b9\uff1a \u7c7b\u540d\u4e0d\u8981\u968f\u4fbf\u53d6\uff0c\u540c\u4e00\u4e2a\u5e94\u7528\u5e94\u8be5\u4f7f\u7528\u540c\u4e00\u4e2a\u7c7b\u540d\uff0c\u7528\u4f8b\u7c7b\u540d\u79f0\u5fc5\u987b\u4ee5 Test \u5f00\u5934\uff0c\u9075\u5faa\u5927\u9a7c\u5cf0\u547d\u540d\u89c4\u8303\uff1b \u7528\u4f8b\u7c7b\u7ee7\u627f BaseCase\uff0c\u4e00\u4e2a\u5e94\u7528\u53ea\u6709\u4e00\u4e2a BaseCase \u4e00\u4e2a py \u6587\u4ef6\u91cc\u9762\u53ea\u6709\u4e00\u4e2a\u7c7b\uff0c\u6211\u4eec\u79f0\u4e3a\u4e00\u4e2a\u6d4b\u8bd5\u7c7b\uff1b \u4e00\u4e2a\u7c7b\u91cc\u9762\u53ef\u4ee5\u6709\u591a\u4e2a\u7528\u4f8b\u51fd\u6570\uff0c\u8fd9\u53d6\u51b3\u8fd9\u6761\u7528\u4f8b\u6709\u591a\u5c11\u4e2a\u6d4b\u8bd5\u70b9\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001_1(self):\n\"\"\"\u4efb\u52a1\u680f\u542f\u52a8\u97f3\u4e50\"\"\"\ndef test_music_001_2(self):\n\"\"\"\u542f\u52a8\u5668\u542f\u52a8\u97f3\u4e50\"\"\" \ndef test_music_001_3(self):\n\"\"\"\u684c\u9762\u542f\u52a8\u97f3\u4e50\"\"\"\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_3","title":"2. \u7528\u4f8b\u51fd\u6570\u89c4\u8303","text":" \u7528\u4f8b\u51fd\u6570\u4ee5 test \u5f00\u5934\uff0c\u9075\u5faa\u86c7\u5f62\u547d\u540d\u89c4\u8303\uff0c\u4e2d\u95f4\u4e3a\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0\uff0c\u540e\u9762\u52a0\u7528\u4f8b ID\uff0c\u6700\u540e\u52a0\u6d4b\u8bd5\u70b9\u5e8f\u53f7\uff0c\u5373 test_${module}_${case_id}[_${index}] \uff1b \u6bd4\u5982\uff1atest_music_001_1\uff0cindex \u4ece 1 \u5f00\u59cb\u3002 \u51fd\u6570\u529f\u80fd\u8bf4\u660e\u91cc\u9762\u5199\u7528\u4f8b\u6807\u9898\uff0c\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u6807\u9898\u5373\u53ef\uff0c\u6ce8\u610f\u7528\u4e09\u5bf9\u53cc\u5f15\u53f7\uff0c\u4e0d\u8981\u7528\u5176\u4ed6\u6ce8\u91ca\uff0c\u66f4\u4e0d\u8981\u7528\u4e95\u53f7\u6ce8\u91ca\u5199\u7528\u4f8b\u6807\u9898\uff1b \u76f4\u63a5\u590d\u5236 PMS \u7528\u4f8b \u7528\u4f8b\u6b65\u9aa4\u76f4\u63a5\u5c06 PMS \u4e0a\u7528\u4f8b\u6b65\u9aa4\u548c\u9884\u671f\u590d\u5236\u8fdb\u6765\uff0c\u7136\u540e\u8fdb\u884c\u6279\u91cf\u6ce8\u91ca\uff08ctrl + /\uff09\uff0c\u5728\u6ce8\u91ca\u7684\u57fa\u7840\u4e0a\u53bb\u5199\u7528\u4f8b\u811a\u672c\u4f1a\u66f4\u52a0\u65b9\u4fbf\u5168\u9762\uff0c\u4e5f\u6bd4\u4f60\u81ea\u5df1\u5199\u6ce8\u91ca\u66f4\u8282\u7ea6\u65f6\u95f4\uff1a \u4e3e\u4f8b\uff0cPMS \u7528\u4f8b\uff1a \u76f4\u63a5\u9009\u4e2d\u7528\u4f8b\u5185\u5bb9\uff0c\u590d\u5236\u4e0b\u6765\uff0c\u7136\u540e\u7c98\u8d34\u5230\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c\u4e2d\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\n \u4e0a\u4f8b\u4e2d\u4e95\u53f7\u6ce8\u91ca\u90e8\u5206\u5c31\u662f\u76f4\u63a5\u4ece PMS \u4e0a\u590d\u5236\u8fc7\u6765\u7684\uff0c\u5728\u6b64\u57fa\u7840\u4e0a\u5199\u7528\u4f8b\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\nmusic = DeepinMusicWidget()\nmusic.click_singer_btn_in_music_by_ui()\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\nmusic.click_icon_mode_in_music_by_ui()\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\nmusic.double_click_first_singer_in_singer_icon_view_by_ui()\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\nself.assert_xxx\n \u4f60\u770b\uff0c\u975e\u5e38\u6e05\u695a\u6bcf\u4e00\u6b65\u5728\u505a\u4ec0\u4e48\uff0c\u91cd\u70b9\u662f\u7701\u53bb\u4e86\u5199\u6ce8\u91ca\u7684\u65f6\u95f4\uff0c\u771f\u7684\u7092\u9e21\u65b9\u4fbf\u3002 \u4e0d\u5199 if __name__ == '__main__':\uff0c\u4e0d\u5199\u591a\u4f59\u7684\u4ee3\u7801\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3","title":"3. \u6570\u636e\u9a71\u52a8","text":" \u5982\u679c\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u662f\u76f8\u540c\u7684\uff0c\u53ea\u662f\u4e00\u4e9b\u53c2\u6570\u53d8\u5316\uff0c\u5c3d\u91cf\u4f7f\u7528\u6570\u636e\u9a71\u52a8\u6765\u5b9e\u73b0\u7528\u4f8b\uff1b \u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u6570\u636e\u9a71\u52a8\u7684\u6570\u636e\uff0c\u4e0d\u80fd\u56e0\u6b64\u5f15\u5165\u4f9d\u8d56\uff0c\u5c3d\u91cf\u4f7f\u7528\u4e00\u4e9b\u6807\u51c6\u5e93\u80fd\u8bfb\u53d6\u7684\u6587\u4ef6\u683c\u5f0f\uff0c\u6bd4\u5982 json\u3001ini\u3001CSV\u3001xml\u3001txt \u7b49\u6587\u4ef6\u683c\u5f0f\uff1b\u4e0d\u5efa\u8bae\u4f7f\u7528 Yaml\u3001Excel\u3001MySQL \u7b49\u6570\u636e\u683c\u5f0f\uff1b \u8bfb\u53d6\u6570\u636e\u65f6\u4e5f\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff0c\u5982\u4f7f\u7528 pandas \u5904\u7406 CSV \u5c31\u5c5e\u4e8e\u5927\u6750\u5c0f\u7528\u4e86\uff0c\u6b63\u5e38\u7684\u6570\u636e\u9a71\u52a8\u8fd8\u6ca1\u5230\u9700\u8981\u5927\u6570\u636e\u5206\u6790\u6765\u5904\u7406\u7684\u5730\u6b65\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u5728 widget/ddt/ \u76ee\u5f55\u4e0b\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5199\u6cd5\uff1a @pytest.mark.parametrize(\"value\", data)\ndef test_smb_049(self, value):\n \u4ee5\u4e0a\u8fd9\u79cd\u53c2\u6570\u5316\u7684\u5199\u6cd5\u672c\u8eab\u6ca1\u4ec0\u4e48\u95ee\u9898\uff0c\u4f46\u662f\uff0c\u8fd9\u91cc\u5fc5\u987b\u8981\u8865\u5145\u4e00\u4e2a\u6ca1\u6709\u7528\u7684\u5c0f\u77e5\u8bc6\uff1a \u5982\u679c\u53c2\u6570\u5316\u6570\u636e\u91cc\u9762\u7684\u5b57\u7b26\u4f1a\u539f\u5c01\u4e0d\u52a8\u7684\u8f93\u51fa\u5230 item.name \u91cc\u9762\uff0c\u663e\u793a\u975e\u5e38\u4e0d\u4f18\u96c5\uff0c\u800c\u4e14\u53ef\u4ee5\u4f1a\u5f15\u5165\u4e00\u4e9b\u610f\u60f3\u4e0d\u5230\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u611f\u53d7\u4e00\u4e0b\uff1a \u53c2\u6570\uff1a data = [\n\"\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\", \"qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678\",\n]\n \u73b0\u8c61\u662f\u8fd9\u6837\u8272\u513f\u7684\uff1a test_smb_049.py::TestFileManager::test_smb_049[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09]\ntest_smb_049.py::TestFileManager::test_smb_049[qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui]\ntest_smb_049.py::TestFileManager::test_smb_049[12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678]\n \u8bf4\u5b9e\u8bdd\uff0c\u770b\u7740\u5fc3\u91cc\u5835\u5f97\u614c\uff0c\u5982\u679c\u8fd9\u91cc\u9762\u5305\u542b\u4e00\u4e9b\u7279\u6b8a\u5b57\u7b26\u6216\u8005\u662f\u8d85\u957f\uff0c\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u5f88\u5947\u5999\u7684\u4e8b\u60c5\u53d1\u751f\u3002 parametrize \u91cc\u9762\u6709\u4e2a\u53c2\u6570\uff1aids\uff0c\u53ef\u4ee5\u89e3\u51b3\u6b64\u7c7b\u95ee\u9898\uff0c\u5c31\u50cf\u8fd9\u6837\uff1a @pytest.mark.parametrize(\"value\", data, ids=[1, 2, 3])\ndef test_smb_049(self, value):\n \u518d\u6765\u611f\u53d7\u4e00\u4e0b\uff1a test_smb_049.py::TestFileManager::test_smb_049[1]\ntest_smb_049.py::TestFileManager::test_smb_049[2]\ntest_smb_049.py::TestFileManager::test_smb_049[3]\n \u660e\u663e\u597d\u591a\u4e86\uff0c\u6240\u4ee5\u5c3d\u91cf\u4f7f\u7528 ids \u8fd9\u4e2a\u53c2\u6570\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 fixture \u7684\u6570\u636e\u9a71\u52a8\u65b9\u5f0f\uff0c\u6846\u67b6\u867d\u7136\u652f\u6301\uff0c\u4f46\u53ef\u8bfb\u6027\u6bd4\u8f83\u5dee\uff1b\u5982\u679c\u4f60\u4e0d\u77e5\u9053\u8fd9\u53e5\u8bdd\u5728\u8bf4\u5565\uff0c\u90a3\u4f60\u53ef\u4ee5\u5ffd\u7565\uff0c\u6211\u4e5f\u4e0d\u6253\u7b97\u8be6\u7ec6\u8bf4\u8fd9\u79cd\u5b9e\u73b0\u65b9\u5f0f\uff0c\u64cd\u4f5c\u6bd4\u8f83\u9a9a\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4","title":"4. \u65ad\u8a00\u8d44\u6e90","text":" \u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u76f4\u63a5\u653e\u5728\u7528\u4f8b\u6a21\u5757\u7684\u540c\u7ea7\u76ee\u5f55\u4e0b\u7684 assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0 + \u7528\u4f8b ID \u547d\u540d\uff1b \u56fe\u50cf\u8bc6\u522b\u65ad\u8a00\uff0c\u4e0d\u8981\u622a\u53d6\u4e00\u5f20\u5f88\u5927\u7684\u56fe\uff0c\u56fe\u7247\u8d44\u6e90\u5305\u542b\u7684\u5143\u7d20\u592a\u591a\u4e86\uff0c\u975e\u5e38\u5bb9\u6613\u53d7\u5230\u9700\u6c42\u5f71\u54cd\uff0c\u5efa\u8bae\u662f\u8fdb\u884c\u5c40\u90e8\u7684\u65ad\u8a00\uff1b \u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u5339\u914d\u5ea6\u662f 0.9\uff0c\u5982\u679c\u65ad\u8a00\u7684\u573a\u666f\u5bf9\u4e8e\u7cbe\u786e\u5ea6\u8981\u6c42\u6ca1\u90a3\u4e48\u9ad8\uff0c\u53ef\u4ee5\u5728\u65ad\u8a00\u8bed\u53e5\u91cc\u9762\u4f20\u5165\u5c0f\u4e8e 0.9 \u7684\u53c2\u6570\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5","title":"5. \u5143\u7d20\u5b9a\u4f4d","text":" \u7528\u4e8e\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u4e2d\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u547d\u540d\u4e3a\u8be5\u5143\u7d20\u7684\u540d\u79f0\uff1b \u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u622a\u53d6\u65f6\u5c3d\u91cf\u7cbe\u786e\u5230\u8fd9\u4e2a\u5177\u4f53\u7684\u6309\u94ae\uff0c\u56fe\u7247\u4e5f\u4e0d\u8981\u592a\u5927\uff1b \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u64cd\u4f5c\u8f83\u5feb\uff0c\u5408\u7406\u52a0\u5165\u7b49\u5f85\u65f6\u95f4\u80fd\u63d0\u9ad8\u7528\u4f8b\u7684\u7a33\u5b9a\u6027\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6","title":"6. \u7528\u4f8b\u8d44\u6e90","text":" \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u4f7f\u7528\u5230\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u6bd4\u5982\u97f3\u4e50\u53ef\u80fd\u9700\u8981\u4e00\u4e9b mp3 \u7684\u8d44\u6e90\u7528\u4e8e\u6d4b\u8bd5\uff0c\u5b58\u653e\u5728 widget/case_res \u76ee\u5f55\u4e0b\uff0c\u524d\u63d0\u662f\u8fd9\u4e9b\u8d44\u6e90\u4e0d\u8d85\u8fc7 10M\uff1b \u5982\u679c\u662f\u4e00\u4e9b\u6bd4\u8f83\u5927\u7684\u8d44\u6e90\uff0c\u5efa\u8bae\u653e\u5230\u7edf\u4e00\u7684 ftp \u670d\u52a1\u5668 \uff08ftp://10.8.10.245\uff09\uff0c\u9700\u8981\u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\u518d\u4e0b\u8f7d\u4e0b\u6765\uff1b f\"wget ftp://{Config.FTP_IP}/uploads/\u591a\u5a92\u4f53/\u5f71\u9662/auto/{file_name};unzip {file_name};rm -rf {file_name};\"\n \u6d4b\u8bd5\u8d44\u6e90\u4e0b\u8f7d\u5230\u5e94\u7528 widget/case_res \u76ee\u5f55\u4e0b\uff1b \u7981\u6b62\u5c06\u6d4b\u8bd5\u8d44\u6e90\u5b58\u653e\u5728\u4e2a\u4eba\u7684\u673a\u5668\u4e0a\uff1b \u5e94\u8be5\u5c3d\u91cf\u4fdd\u8bc1\uff0c\u4e00\u4e2a\u8d44\u6e90\u5728\u4e00\u6b21\u7528\u4f8b\u6267\u884c\u4e2d\u53ea\u9700\u8981\u4e0b\u8f7d\u4e00\u6b21\uff0c\u6240\u4ee5\u4f60\u4e0d\u80fd\u6bcf\u6b21\u4f7f\u7528\u7684\u65f6\u5019\u90fd\u53bb\u4e0b\u8f7d\uff0c\u8fd9\u6837\u53ef\u80fd\u4f1a\u8017\u8d39\u5927\u91cf\u7684\u7f51\u7edc\u8d44\u6e90\uff0c\u800c\u56e0\u4e3a\u5148\u5224\u65ad\u672c\u5730\u662f\u5426\u5b58\u5728\u6b64\u8d44\u6e90\uff0c\u5982\u679c\u4e0d\u5b58\u5728\u518d\u53bb\u4e0b\u8f7d\uff1b \u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u5c06\u8d44\u6e90\u62f7\u8d1d\u5230\u5bf9\u5e94\u7684\u6d4b\u8bd5\u76ee\u5f55\u4e0b\uff0c\u6bd4\u5982\u5c06 mp3 \u6587\u4ef6\u62f7\u8d1d\u5230 ~/Music \u76ee\u5f55\u4e0b\uff0c\u4f46\u662f\u6211\u4eec\u66f4\u5efa\u8bae\u4f60\u4f7f\u7528\u53d1\u9001\u5feb\u6377\u94fe\u63a5\u7684\u65b9\u5f0f\u66ff\u4ee3\u62f7\u8d1d\u7684\u64cd\u4f5c\uff0c\u56e0\u4e3a\u5728\u62f7\u8d1d\u5927\u6587\u4ef6\u65f6\u662f\u5f88\u6d88\u8017\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u800c\u521b\u5efa\u94fe\u63a5\u5219\u4e0d\u4f1a\uff1b @classmethod\ndef recovery_many_movies_in_movie_by_cmd(cls):\n\"\"\"\u6062\u590d\u591a\u4e2a\u89c6\u9891\u6587\u4ef6\u81f3\u89c6\u9891\u76ee\u5f55\u4e2d\"\"\"\nwork_path = f\"/home/{Config.USERNAME}/Videos/auto\"\ncode_path = f\"{Config.CASE_RES_PATH}/auto\"\ncls.run_cmd(f\"rm -rf {work_path};mkdir {work_path}\")\nsleep(1)\nflag = False\nif not exists(code_path):\ncls.run_cmd(f\"mkdir -p {code_path}\")\nflag = True\nlogger.info(f\"ln -s {code_path}/* {work_path}/\")\ncls.run_cmd(\nf\"cd {code_path}/;\"\nf\"{cls.wget_file('auto.zip') if flag else ''}\"\nf\"ln -s {code_path}/* {work_path}/ > /dev/null 2>&1\"\n)\n \u8d44\u6e90\u4e0b\u8f7d\u8fc7\u7a0b\u4e2d\u6ce8\u610f\u8d85\u65f6\u7684\u95ee\u9898\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u5f88\u5927\uff0c\u8981\u7279\u522b\u6ce8\u610f\u8fd9\u95ee\u9898\uff0c\u5982\u679c\u4f60\u4f7f\u7528\u5f3a\u5236\u7b49\u5f85\u4e0b\u8f7d\u7ed3\u675f( os.system )\uff0c\u53ef\u80fd\u4f1a\u9020\u6210\u7528\u4f8b\u6267\u884c\u65f6\u957f\u53d8\u5f97\u4e0d\u53ef\u63a5\u53d7\uff0c\u76ee\u524d\u6211\u4eec\u53d1\u73b0\u5728\u6301\u7eed\u96c6\u6210\u73af\u5883\u6267\u884c\u65f6\u7f51\u7edc\u4e0b\u8f7d\u901f\u5ea6\u5f88\u6162\uff0c\u6240\u4ee5\u8d85\u65f6\u673a\u5236\u662f\u5f88\u6709\u5fc5\u8981\u7684\uff1brun_cmd \u65b9\u6cd5\u6709\u4e00\u4e2a\u9ed8\u8ba4\u8d85\u65f6\u7684\u65f6\u95f4\uff0c\u4f60\u53ef\u4ee5\u6839\u636e\u8d44\u6e90\u5927\u5c0f\u5bf9\u8d85\u65f6\u65f6\u95f4\u8fdb\u884c\u8c03\u6574\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_5","title":"\u516d\u3001\u7528\u4f8b\u8c03\u8bd5\u6280\u5de7","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_4","title":"1. \u65e5\u5fd7","text":" \u4e00\u5b9a\u8981\u5148\u770b\u62a5\u9519\uff0c\u770b error \u65e5\u5fd7\uff0c\u901a\u5e38\u80fd\u660e\u786e\u7684\u544a\u8bc9\u4f60\u5177\u4f53\u54ea\u91cc\u4ee3\u7801\u62a5\u9519\uff1b \u7ed3\u5408\u62a5\u9519\u70b9\u524d\u9762\u7684error\u3001 info \u548c debug \u65e5\u5fd7\u770b\u5426\u662f\u6b63\u5e38\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_4","title":"2. \u65ad\u70b9\u8c03\u8bd5","text":" \u65b9\u6cd5\u62a5\u9519\uff1a \u5728\u65b9\u6cd5\u5e93\u4e2d\u627e\u5230\u5bf9\u5e94\u7684\u65b9\u6cd5\uff0c\u5355\u72ec\u8c03\u7528\uff0c\u770b\u662f\u5426\u80fd\u6b63\u5e38\u6267\u884c\uff1b \u901a\u5e38\u5355\u4e2a\u65b9\u6cd5\u7684\u6267\u884c\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u62a5\u9519\uff0c\u5f88\u5feb\u5c31\u80fd\u6392\u67e5\u51fa\u95ee\u9898\uff1b\u5728\u65b9\u6cd5\u5185\u90e8\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u65b9\u6cd5\u5185\u90e8\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u8c03\u7528\u6ca1\u95ee\u9898\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u62a5\u9519\u7684\u65b9\u6cd5\u524d\u9762\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u7528\u4f8b\u7684\u4e1a\u52a1\u903b\u8f91\u548c\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u65ad\u8a00\u62a5\u9519\uff1a \u65ad\u8a00\u4e3a\u6570\u636e\u65ad\u8a00\uff0c\u6839\u636e\u8868\u8fbe\u5f0f\u8fdb\u884c\u65ad\u8a00\u8bed\u53e5\u8fdb\u884c\u4fee\u6539\uff1b \u6587\u4ef6\u751f\u6210\u7c7b\u65ad\u8a00\uff0c\u67e5\u770b\u662f\u5426\u9700\u8981\u52a0\u7b49\u5f85\u65f6\u95f4\uff1b \u56fe\u50cf\u65ad\u8a00\uff0c\u5728\u65ad\u8a00\u8bed\u53e5\u5904\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u7528\u4f8b\u8fd0\u884c\u5230\u65ad\u8a00\u5904\u4f1a\u505c\u6b62\uff0c\u67e5\u770b\u6b64\u65f6\u65ad\u8a00\u7684\u56fe\u7247\u4e0e\u7528\u4f8b\u6267\u884c\u7684\u73b0\u573a\u5b58\u5728\u4ec0\u4e48\u5dee\u5f02\uff0c\u6b64\u65f6\u4e5f\u53ef\u4ee5\u8fdb\u884c\u91cd\u65b0\u622a\u56fe\uff0c\u4ece\u800c\u66ff\u6362\u65b0\u7684\u56fe\u7247\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3_1","title":"3. \u8fdc\u7a0b\u6267\u884c","text":" \u8fdc\u7a0b\u6267\u884c\u6307\u7684\u662f\u7f16\u8f91\u5668\u901a\u8fc7\u6307\u5b9a\u8fdc\u7a0b\u89e3\u91ca\u5668\u6267\u884c\u81ea\u52a8\u5316\u4ee3\u7801\uff1b \u8fdc\u7a0b\u6267\u884c\u7684\u597d\u5904\u662f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u7684 Debug \u8fd0\u884c\uff0c\u4e0d\u7528\u5728\u6d4b\u8bd5\u673a\u4e0a\u6253\u5f00\u7f16\u8f91\u5668\uff0c\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u66f4\u5feb\uff1b \u652f\u6301\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u7684\u7f16\u8f91\u5668\uff1a \u4e13\u4e1a\u7248 Pycharm VScode \uff0c\u9700\u8981\u4f7f\u7528\u63d2\u4ef6 Remote-SSH \u8fdc\u7a0b\u6267\u884c\u914d\u7f6e \u4ee5 Pycharm \u4e3a\u4f8b\uff1a File \u2014> Settings \u2014> Project \u2014> Python Interpreter \u2014> \u53f3\u8fb9\u8bbe\u7f6e\u6309\u94ae \u2014> Add... \u2014> SSH Interpreter \u2014> New server configuration(\u586b\u5165host\u548cusername) \u2014> Next \u2014> password\uff08\u6d4b\u8bd5\u673a\u5bc6\u7801\uff09 \u2014> Interpreter(\u9009\u62e9\u8fdc\u7a0b\u89e3\u91ca\u5668) \u2014> Finish "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4_1","title":"4. \u73af\u5883\u6e05\u7406","text":" \u5982\u679c\u7528\u4f8b\u91cc\u9762\u7684 teardown \u6ca1\u6709\u6267\u884c\uff0c\u5927\u6982\u7387\u662f\u56e0\u4e3a setup \u91cc\u9762\u4ee3\u7801\u62a5\u9519\uff0c\u8fd9\u4e24\u4e2a\u662f\u4e00\u5bf9\u7684\uff0csetup \u91cc\u9762\u62a5\u9519\uff0cteardown \u91cc\u9762\u7684\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\uff1b \u76ee\u524d\u6211\u4eec\u5df2\u7ecf\u5c06\u5404\u5e94\u7528\u7684 clean_all \u8fd9\u4e2a fixture \u6539\u6210\u4e86\u7ec8\u7ed3\u5668\uff0c\u786e\u4fdd\u59cb\u7ec8\u80fd\u6267\u884c\u5230\u8fd9\u6b65\uff0c\u4f46\u662f\u7528\u4f8b\u91cc\u9762\u7684 fixture\uff0c\u8fd8\u662f\u9700\u8981\u6211\u4eec\u5c0f\u5fc3\u5904\u7406\uff1b \u8981\u6267\u884c clean_all \u9700\u8981\u5728\u7f16\u8f91\u5668\u8fd0\u884c\u53c2\u6570\u52a0 --clean yes\uff0c\u5199\u7528\u4f8b\u7684\u65f6\u5019\u8bf7\u52a0\u4e0a\uff0c\u4e0d\u7136\u4f60\u4e0d\u786e\u5b9a\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u7684\u73af\u5883\u662f\u5426\u6062\u590d\uff1b setup \u53ef\u4ee5\u4e0d\u8981\uff0c\u5c06 setup \u653e\u5230\u7528\u4f8b\u91cc\u9762\u662f\u4e00\u79cd\u7a33\u59a5\u7684\u505a\u6cd5\uff0cteardown \u4e00\u5b9a\u8981\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5_1","title":"5. \u5143\u7d20\u5b9a\u4f4d\u4e0d\u51c6\uff08\u5750\u6807\u8fd4\u56de\u4e0d\u5bf9\uff09","text":" \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u53ef\u80fd\u53d7\u5230\u7a97\u53e3 ID \u7684\u53d8\u5316\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u9ed8\u8ba4\u53d6\u6700\u65b0\u7684\u4e00\u4e2a\u7a97\u53e3\u7528\u4e8e\u5b9a\u4f4d\uff0c\u4f46\u5982\u679c\u5b9e\u9645\u9700\u8981\u5b9a\u4f4d\u7684\u4e0d\u662f\u6700\u65b0\u7684\u7a97\u53e3\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u91cd\u65b0\u5b9e\u4f8b\u5316\u65b9\u6cd5\u7c7b\u5bf9\u8c61\uff0c\u5e76\u5728\u7c7b\u4e2d\u4f20\u5165\u5bf9\u5e94\u7684\u7a97\u53e3\u5e8f\u53f7\uff1b \u57fa\u4e8e\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u76ee\u524d\u9047\u5230\u7684\u7b14\u8bb0\u672c\u4e0a\uff0c\u7531\u4e8e\u5c4f\u5e55\u7f29\u653e\u6bd4\u4f8b\u4e3a 1.25\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u6211\u4eec\u9ed8\u8ba4\u4f7f\u7528\u7f29\u653e\u6bd4\u4f8b\u4e3a 1\uff1b \u57fa\u4e8e\u56fe\u50cf\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u76ee\u6807\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b \u57fa\u4e8e OCR \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u6587\u5b57\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u540c\u6837\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6_1","title":"6. \u952e\u9f20\u64cd\u4f5c\u4e0d\u51c6","text":" \u9f20\u6807\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6bd4\u5982\u53f3\u952e\u3001\u53cc\u51fb\u65e0\u54cd\u5e94\uff1b \u952e\u76d8\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6216\u8005\u5ef6\u8fdf\u8f93\u5165\uff0c\u6bd4\u5982\u7528\u4f8b\u9700\u8981\u8f93\u5165\u201c\u6211\u662f\u4e2d\u56fd\u4eba\u201d\uff0c\u5b9e\u9645\u53ea\u8f93\u5165\u4e86\u201c\u6211\u56fd\u4eba\u201d\uff1b \u4ee5\u4e0a\u95ee\u9898\u6392\u9664\u5e94\u7528\u5361\u987f\u7b49\u95ee\u9898\uff0c\u5927\u6982\u7387\u662f\u7531\u4e8e\u5de5\u5177\u7684\u95ee\u9898\uff0c\u76ee\u524d\u952e\u9f20\u64cd\u4f5c\u6211\u4eec\u4f7f\u7528\u4e09\u4e2a\u5de5\u5177\uff1aDogtail \u63d0\u4f9b\u7684\u952e\u9f20\u5de5\u5177\u3001PyAutoGUI\u3001Xdotool \uff1b \u6709\u540c\u5b66\u53ef\u80fd\u8981\u8bf4\u4e3a\u5565\u8981\u7528\u4e09\u4e2a\u554a\uff0c\u7528\u4e00\u4e2a\u4e0d\u5c31\u597d\u4e86\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u5404\u6709\u4f18\u70b9\u5404\u6709\u7f3a\u70b9\u3002 \u5982\u679c\u4f60\u9047\u5230\u952e\u9f20\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u8bd5\u8bd5\u901a\u8fc7\u4e0d\u540c\u7684\u5de5\u5177\u64cd\u4f5c\uff1b\u952e\u76d8\u8f93\u5165\u5ef6\u8fdf\u7684\u95ee\u9898\uff0c\u4e00\u822c\u662f\u56e0\u4e3a\u8f93\u5165\u901f\u5ea6\u592a\u5feb\u4e86\uff0c\u7cfb\u7edf\u6ca1\u53cd\u5e94\u8fc7\u6765\uff0c\u5e38\u89c1\u4e8e ARM \u548c MIPS \u4e0a\uff0c\u4fee\u6539\u53c2\u6570 delay_time \u7684\u503c\uff0c\u5355\u4f4d\u4e3a\u6beb\u79d2\uff1b # mouse_key.py\n@classmethod\ndef input_message(cls, message, delay_time=300, interval=0.2):\n\"\"\"\n \u8f93\u5165\u5b57\u7b26\u4e32\n :param message: \u8f93\u5165\u7684\u5185\u5bb9\n :param delay_time: \u5ef6\u8fdf\u65f6\u95f4\n :param interval:\n :return:\n \"\"\"\n \u5982\u679c\u4e0d\u662f\u65b9\u6cd5\u7684\u95ee\u9898\uff0c\u5219\u9700\u8981\u7ee7\u7eed\u548c\u5f00\u53d1\u4e00\u8d77\u6392\u9664\uff0c\u662f\u5426\u4e3a\u5e94\u7528\u63a5\u53d7\u952e\u9f20\u4fe1\u53f7\u5904\u7406\u7684\u95ee\u9898\uff0c\u8fd9\u7c7b\u60c5\u51b5\u6211\u4eec\u4e5f\u662f\u9047\u5230\u8fc7\u7684\uff0c\u5177\u4f53\u95ee\u9898\u5177\u4f53\u5206\u6790\u3002 \u6bd4\u5982\u5f71\u9662\u5c31\u91cd\u5199\u4e86\u4e00\u4e2a\u53f3\u952e\u7684\u65b9\u6cd5\uff1a # base_widget.py\n@classmethod\ndef right_click(cls, _x=None, _y=None):\n\"\"\"\n \u91cd\u5199\u5e95\u5c42\u5355\u51fb\u9f20\u6807\u53f3\u952e\n \u89e3\u51b3\u5f71\u9662\u53f3\u952e\u89e6\u53d1release\u4e8b\u4ef6\u7684\u95ee\u9898\uff08\u53f3\u952e\u4e3b\u7a97\u53e3\u4f1a\u64ad\u653e\u89c6\u9891\uff09\n \"\"\"\ncls.mouse_down(_x, _y, button=3)\nsleep(0.1)\ncls.mouse_up(button=3)\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_6","title":"\u4e03\u3001\u5176\u4ed6\u4e0d\u4e3a\u4eba\u77e5\u7684\u7ec6\u8282","text":" \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u5c3d\u91cf\u7f16\u5199\u540c\u4e00\u4e2a\u5e94\u7528\u6216\u6a21\u5757\u7684\u7528\u4f8b\uff0c\u80fd\u5bf9\u8be5\u7528\u4f8b\u5df2\u6709\u65b9\u6cd5\u719f\u6089\uff0c\u907f\u514d\u8fc7\u591a\u91cd\u590d\u4e1a\u52a1\u4ee3\u7801\u7684\u5c01\u88c5\uff1b \u76f8\u540c\u7684\u573a\u666f\u4e0b\uff0c\u5404\u67b6\u6784\u7b49\u5f85\u65f6\u95f4\u4e0d\u540c\uff0c\u5efa\u8bae\u4f7f\u7528\u6846\u67b6\u63d0\u4f9b\u7684 sleep\uff0c\u6211\u4eec\u505a\u4e86\u4e0d\u540c\u67b6\u6784\u7684\u500d\u6570\u653e\u5927\uff1b \u7f16\u5199\u7528\u4f8b\u65f6\uff0c\u5c3d\u91cf\u8003\u8651\u5230\u6bcf\u4e00\u6b65\u5f02\u5e38\u540e\u7684\u73af\u5883\u6062\u590d\uff0c\u9700\u8981\u5efa\u8bae\u8fd9\u79cd\u610f\u8bc6\uff0c\u968f\u65f6\u8981\u8003\u8651\u5230\uff0c\u8fd9\u6b65\u64cd\u4f5c\u6709\u6ca1\u6709\u53ef\u80fd\u51fa\u9519\uff0c\u51fa\u9519\u4e86\u6539\u600e\u4e48\u529e\uff1b \u63d0\u4ea4\u4ee3\u7801\u7684\u65f6\u5019\u6ce8\u610f\u4e0d\u8981\u628a\u4e00\u4e9b\u4e34\u65f6\u7684\u6d4b\u8bd5\u8d44\u6e90\u63d0\u4ea4\u8fdb\u53bb\u4e86\uff0c\u6bd4\u5982\u6d4b\u8bd5\u4e86\u4e00\u4e2a\u5f71\u7247\uff0c\u6709\u4e9b\u540c\u5b66\u4e60\u60ef\u4f7f\u7528 git add . \uff0c\u7136\u540e\u5c31\u5168\u90e8\u63d0\u4ea4\u5230\u4ee3\u7801\u4ed3\u5e93\u4e86\uff0c\u8fd9\u6837\u5373\u4f7f\u540e\u671f\u628a\u5927\u6587\u4ef6\u5220\u4e86\uff0c.git \u6587\u4ef6\u91cc\u9762\u4e5f\u4f1a\u5f88\u5927\uff0c\u9020\u6210\u4ee3\u7801\u4ed3\u5e93\u53d8\u5f97\u5341\u5206\u81c3\u80bf\u3002 \u66f4\u591a\u7ec6\u8282\u67e5\u770b\uff1a\u300aAT\u7ecf\u9a8c\u603b\u7ed3\u300b"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/","title":"AT \u6267\u884c\u5668\u4f7f\u7528\u6307\u5317","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/5/25\n# Author : litao\n# =============================================\n Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1","title":"1\u3001\u529f\u80fd\u4ecb\u7ecd","text":" \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7cfb\u7edf\u8bed\u8a00\u8bbe\u7f6e\uff0c\u5206\u8fa8\u7387\u8bbe\u7f6e\u53ca\u7528\u4f8b\u6267\u884c\u73af\u5883\u642d\u5efa\uff1b \u652f\u6301 IP \u4e3a 15 \u7f51\u6bb5\u7684 AMD \u67b6\u6784\u6d4b\u8bd5\u673a\u955c\u50cf\u88c5\u673a\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u6307\u5b9a\u5e94\u7528\uff0c\u6307\u5b9a\u8303\u56f4\u6807\u7b7e\u7684\u7528\u4f8b\u6267\u884c\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u72b6\u6001\u68c0\u67e5\uff0c\u662f\u5426\u6709\u6b63\u5728\u8fd0\u884c\u7684\u6d4b\u8bd5\uff1b \u652f\u6301\u914d\u7f6e\u7528\u4f8b\u6267\u884c\u65f6\u957f\uff0c\u9632\u6b62\u4efb\u52a1\u963b\u585e\uff1b \u652f\u6301\u6839\u636e\u5e94\u7528\u7248\u672c\u81ea\u52a8\u67e5\u627e\u5bf9\u5e94\u7684\u7528\u4f8b tag\uff1b \u652f\u6301\u5f02\u5e38\u5904\u7406\u548c\u6d4b\u8bd5\u5b8c\u6210\u7684\u5b9e\u65f6\u6d88\u606f\u901a\u77e5\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2job","title":"2\u3001Job \u4ecb\u7ecd","text":"\u4ee5\u4e0b\u6309\u6267\u884c\u6d41\u7a0b\u7684\u987a\u5e8f\u4ecb\u7ecd\uff0c\u6bcf\u4e00\u6b65\u90fd\u53ef\u4ee5\u5355\u72ec\u6267\u884c\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1_1","title":"1\u3001\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/AT_test/ \u6574\u4e2a\u6d41\u7a0b\u7684\u4e3b\u5165\u53e3\uff0c\u901a\u8fc7\u8fd9\u4e2a\u5165\u53e3\uff0c\u8fde\u540c\u6574\u4e2a\u6d4b\u8bd5\u6d41\u7a0b\uff0c\u955c\u50cf\u88c5\u673a\uff0c\u73af\u5883\u90e8\u7f72\uff0c\u6d4b\u8bd5\u5e94\u7528\u53ca\u751f\u6210\u62a5\u544a\u3002 \u53c2\u6570\u4ecb\u7ecd\uff1a \u6d4b\u8bd5\u673a\uff1a\u6240\u6709\u89c4\u6574\u5230\u56fa\u5b9a\u533a\u57df\u7684\u6d4b\u8bd5\u673a\uff0c\u901a\u8fc7\u6d4b\u8bd5\u540c\u5b66\u5bf9\u6d4b\u8bd5\u673a\u7684\u4e60\u60ef\u547d\u540d\uff0c\u5728\u540e\u53f0\u6620\u5c04\u6d4b\u8bd5\u673a\u7684\u8be6\u7ec6\u4fe1\u606f\uff0c\u62ec\u53f7\u4e2d\u4e3a\u6d4b\u8bd5\u673a IP \u7684\u6700\u540e\u4e00\u4f4d\uff1b \u6d4b\u8bd5\u5e94\u7528\uff1a\u6307\u5b9a\u7684\u6d4b\u8bd5\u5e94\u7528\u7684\u5305\u540d\uff0c\u7cfb\u7edf\u6839\u636e\u540d\u79f0\u81ea\u52a8\u62c9\u53d6\u5bf9\u5e94\u7684\u4ed3\u5e93\u4ee3\u7801\uff1b deb\u5305\u4e0b\u8f7d\u5730\u5740\uff1a\u6d4b\u8bd5\u4e0a\u8ff0\u5e94\u7528\u65f6\uff0c\u9700\u8981\u5b89\u88c5\u7684deb\u5305\u4e0b\u8f7d\u5730\u5740\uff0c\u591a\u4e2a\u5730\u5740\u7528\u201c,\u201d\u9694\u5f00\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff1b \u8303\u56f4\u6807\u7b7e\uff1a\u6267\u884c\u6d4b\u8bd5\u7528\u4f8b\u7684\u6807\u7b7e\u8303\u56f4\uff0c\u5bf9\u5e94\u7528\u4f8b\u4ee3\u7801 csv \u6587\u4ef6\u4e2d\u7684\u6807\u7b7e\u4fe1\u606f\uff0c\u4ee5 pytest \u7684mark\u8bed\u6cd5\u7f16\u5199\uff1b \u7cfb\u7edf\u8bed\u8a00\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u8bed\u8a00\u73af\u5883\uff1b \u5206\u8fa8\u7387\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u5206\u8fa8\u7387\u73af\u5883\uff1b \u955c\u50cf\u5730\u5740\uff1a\u955c\u50cf\u4ed3\u5e93\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u901a\u8fc7 PXE \u88c5\u673a\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u88c5\u673a\u73af\u8282\uff08\u76ee\u524d\u4ec5\u652f\u6301\u90e8\u5206 AMD \u67b6\u6784\u7684\u88c5\u673a\uff09\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2pxe","title":"2\u3001PXE \u88c5\u673a","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/IOS_install/ \u8f93\u5165\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\uff0cIP\uff0c\u5bc6\u7801\uff0c\u955c\u50cf\u5730\u5740\u540e\uff0c\u81ea\u52a8\u88c5\u673a\uff0c\u76ee\u524d\u4ec5\u652f\u6301\u56fa\u5b9a 15 \u7f51\u6bb5\u7684\u90e8\u5206 AMD \u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#3","title":"3\u3001\u6b21\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/all_client_test/ \u8be5\u5165\u53e3\u4e0e\u4e3b\u5165\u53e3\u529f\u80fd\u57fa\u672c\u4e00\u81f4\uff0c\u53ea\u662f\u5265\u79bb\u4e86PXE\u88c5\u673a\u6d41\u7a0b\uff0c\u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7684\u6267\u884c\u6d41\u7a0b\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#4","title":"4\u3001\u73af\u5883\u90e8\u7f72","text":"Jenkins url\uff1ahttps://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/env/build?delay=0sec \u8bbe\u7f6e\u6d4b\u8bd5\u673a\u7684\u7cfb\u7edf\u8bed\u8a00\uff0c\u5206\u8fa8\u7387\u53ca\u5b89\u88c5\u6d4b\u8bd5\u6240\u9700\u7684\u4f9d\u8d56\u5305\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#5","title":"5\u3001\u53d1\u9001\u4ee3\u7801","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/send_code/ \u6839\u636e\u6d4b\u8bd5\u5e94\u7528\u540d\u79f0\uff0c\u62c9\u53d6\u5bf9\u5e94\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u5e76\u6839\u636e\u6d4b\u8bd5\u673a\u4e0a\u5e94\u7528\u7248\u672c\u5207\u6362\u5230\u5bf9\u5e94\u7684tag\u7248\u672c\uff0c\u82e5\u672a\u627e\u5230tag\u7248\u672c\uff0c\u5219\u4f7f\u7528\u6700\u65b0\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u518d\u6839\u636e\u5e94\u7528\u5e93\u4ee3\u7801\u4e2d\u914d\u7f6e\u7684\u57fa\u7840\u5e93\u7248\u672c\uff0c\u62c9\u53d6\u57fa\u7840\u5e93\u4ee3\u7801\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#6","title":"6\u3001\u7528\u4f8b\u6267\u884c","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/run_test/ \u8fd0\u884c\u6d4b\u8bd5\u673a\u4e0a\u7684\u7528\u4f8b"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/","title":"AT \u7528\u4f8b\u7b5b\u9009\u6307\u5317","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u7528\u4f8b\u7b5b\u9009\u6807\u51c6\uff0c\u662f\u6311\u9009\u5408\u9002\u7684\u6587\u672c\u7528\u4f8b\u8fdb\u884c\u81ea\u52a8\u5316\u7528\u4f8b\u8f6c\u5316\u7684\u4e00\u4e9b\u901a\u7528\u6807\u51c6\u3002 \u8fc7\u53bb\u6211\u4eec\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u5b9e\u8df5\u8fc7\u7a0b\u4e2d\uff0c\u5199\u4e86\u4e0d\u5c11\u81ea\u52a8\u5316\u7528\u4f8b\uff0c\u968f\u7740\u9700\u6c42\u7684\u8fed\u4ee3\uff0c\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u81ea\u7136\u8150\u5316\uff0c\u56e0\u800c\u9700\u8981\u5728\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\u5bf9\u81ea\u52a8\u5316\u7528\u4f8b\u8fdb\u884c\u7ef4\u62a4\uff0c\u5728\u7ef4\u62a4\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u6211\u4eec\u53d1\u73b0\uff0c\u6709\u4e9b\u7528\u4f8b\u7ef4\u62a4\u8d77\u6765\u592a\u96be\u4e86\uff0c\u8c03\u8bd5\u7528\u4f8b\u8017\u8d39\u5927\u91cf\u65f6\u95f4\uff0c\u6210\u672c\u5f88\u9ad8\u3002 \u56e0\u6b64\uff0c\u6211\u4eec\u603b\u7ed3\u4e00\u4e9b\u81ea\u52a8\u5316\u7528\u4f8b\u9009\u578b\u7684\u6807\u51c6\uff0c\u4ee5\u4f18\u5316\u540e\u7eed\u81ea\u52a8\u5316\u7528\u4f8b\u7ed3\u6784\uff0c\u671f\u5f85\u6211\u4eec\u80fd\u7f16\u5199\u51fa\u9ad8\u6548\u3001\u7a33\u5b9a\u3001\u6613\u4e8e\u7ef4\u62a4\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_1","title":"\u4e00\u3001\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u53ef\u4ee5\u5206\u4e3a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u548c\u4e13\u9879\u81ea\u52a8\u5316\u6d4b\u8bd5\uff0c\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e00\u822c\u53ea\u9488\u5bf9\u4e00\u4e9b\u5e38\u89c4\u7684\u529f\u80fd\u6d4b\u8bd5\uff0c\u5176\u4ed6\u975e\u5e38\u89c4\u529f\u80fd\u7684\u7528\u4f8b\uff0c\u5e94\u8be5\u91c7\u7528\u4e13\u9879\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u6848\uff1b \u4ee5\u4e0b\u662f\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1","title":"1. \u7a33\u5b9a\u6027\u3001\u538b\u6d4b\u7528\u4f8b","text":"\u7a33\u5b9a\u6027\u6d4b\u8bd5\u3001\u538b\u6d4b\u7528\u4f8b\u5e94\u8be5\u662f\u5c5e\u4e8e\u6027\u80fd\u76f8\u5173\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u5982\uff1a\u53cd\u590d\u591a\u6b21\u70b9\u51fb\u6309\u94ae\uff0c\u68c0\u9a8c\u5176\u529f\u80fd\u7a33\u5b9a\u6027\u3002\u56e0\u4e3a\u8fd9\u4e9b\u7528\u4f8b\u65ad\u8a00\u7684\u9884\u671f\u53ef\u80fd\u4e0d\u662f\u5f88\u660e\u786e\uff0c\u66f4\u6709\u751a\u8005\u4e0d\u9700\u8981\u65ad\u8a00\uff0c\u7528\u4f8b\u65f6\u957f\u6bd4\u8f83\u957f\uff0c\u800c\u4e14\u4e0d\u53ef\u63a7\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u76ee\u524d\u6211\u4eec\u6709\u6027\u80fd\u81ea\u52a8\u5316\u7684\u4e13\u9879\u65b9\u6848\uff0c\u4ee5\u53ca\u4e00\u4e9b\u7a33\u5b9a\u6027\u6d4b\u8bd5\u7684\u4e13\u9879\u65b9\u6848\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u6b64\u7c7b\u7528\u4f8b\u653e\u5230\u4e13\u9879\u81ea\u52a8\u5316\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2","title":"2. \u6d89\u53ca\u591a\u4e2a\u7528\u6237\u64cd\u4f5c","text":"\u5e38\u89c1\u4e0e\u6587\u7ba1\u7684\u7528\u4f8b\u4e2d\uff0c\u591a\u7528\u6237\u64cd\u4f5c\u7684\u7528\u4f8b\u4e00\u822c\u90fd\u4f1a\u6d89\u53ca\u5230\u5728\u7cfb\u7edf\u4e2d\u8fdb\u884c\u591a\u4e2a\u7528\u6237\u95f4\u7684\u5207\u6362\uff0c\u81ea\u52a8\u5316\u811a\u672c\u4e00\u822c\u662f\u8fd0\u884c\u5728\u4e00\u4e2a\u7528\u6237\u7a7a\u95f4\u4e0b\u7684\uff0c\u6240\u4ee5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u591a\u7528\u6237\u95f4\u7684\u5207\u6362\u3002 \u6b64\u7c7b\u4e0d\u5efa\u8bae\u91c7\u7528\u81ea\u52a8\u5316\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3","title":"3. \u4e0e\u5f00\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4ea4\u4e92","text":"\u6b64\u7c7b\u573a\u666f\u591a\u4e3a\u5e94\u7528\u7684\u5f02\u5e38\u573a\u666f\u6d4b\u8bd5\uff0c\u6bd4\u5982\uff1a\u590d\u5236\u5927\u6587\u4ef6\u8fc7\u7a0b\u4e2d\u6ce8\u9500\u673a\u5668\u3002 \u81ea\u52a8\u5316\u811a\u672c\u5728\u7cfb\u7edf\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4e4b\u540e\u662f\u4f1a\u505c\u6b62\u8fd0\u884c\u7684\uff1b\u6b64\u7c7b\u7528\u4f8b\u53ef\u4ee5\u505a\u81ea\u52a8\u5316\uff0c\u4f46\u662f\u540c\u6837\u9700\u8981\u505a\u4e13\u9879\u65b9\u6848\uff0c\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u7684\u5904\u7406\u903b\u8f91\u5b8c\u5168\u4e0d\u540c\u3002 \u540e\u7eed\u81ea\u52a8\u5316\u9700\u8981\u516c\u5173\u7684\u70b9\uff1a \u81ea\u52a8\u5316\u811a\u672c\u5728\u672c\u673a\u8fd0\u884c\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u81f3\u5c11\u9700\u8981\u63d0\u4f9b\u4ee5\u4e0b\u529f\u80fd\uff1a \u91cd\u542f\u4e4b\u540e\u7528\u4f8b\u80fd\u81ea\u52a8\u8fd0\u884c\uff1b\u53ef\u4ee5\u8003\u8651\u5c06\u6267\u884c\u7528\u4f8b\u5199\u6210\u4e00\u4e2a\u5f00\u673a\u81ea\u542f\u7684\u670d\u52a1\uff1b \u80fd\u8bb0\u5f55\u5173\u673a\u4e4b\u524d\u7528\u4f8b\u6267\u884c\u7684\u4f4d\u7f6e\uff0c\u91cd\u542f\u4e4b\u540e\u80fd\u4ece\u6b64\u4f4d\u7f6e\u5f00\u59cb\u6267\u884c\uff1b \u50cf\u6027\u80fd\u81ea\u52a8\u5316\u4e00\u6837\uff0c\u7531\u670d\u52a1\u7aef\u63a7\u5236\uff1b \u5b8c\u5168\u57fa\u4e8e\u56fe\u5f62\u8bc6\u522b\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u4e32\u53e3\u7ebf\u63a7\u5236\u952e\u9f20\u7a33\u5b9a\u6027\uff1b "},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4","title":"4. \u6d4b\u8bd5\u6267\u884c\u65f6\u95f4\u957f","text":"\u7528\u4f8b\u6267\u884c\u65f6\u95f4\u63a7\u5236\u57282\u5206\u949f\u4ee5\u5185\uff0c\u6781\u7aef\u60c5\u51b5\u4e0d\u8981\u8d85\u8fc75\u5206\u949f\uff0c\u6240\u6709\u7528\u4f8b\u7684\u5e73\u5747\u65f6\u957f\u5e94\u8be5\u57281\u5206\u949f\u5de6\u53f3\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u95f4\u592a\u957f\uff0c\u7f16\u5199\u7528\u4f8b\u3001\u8c03\u8bd5\u7528\u4f8b\u3001\u6267\u884c\u7528\u4f8b\u3001\u7ef4\u62a4\u7528\u4f8b\u90fd\u975e\u5e38\u7684\u8017\u65f6\uff0c\u4eba\u529b\u6210\u672c\u65f6\u95f4\u6210\u672c\u6295\u5165\u592a\u9ad8\u3002 \u4f60\u60f3\uff0c\u8fd9\u6761\u7528\u4f8b\u6267\u884c\u9700\u89815\u5206\u949f\uff0c\u90a3\u4f60\u5199\u8fd9\u6761\u7528\u4f8b\u7684\u65f6\u95f4\u4e0d\u53ef\u80fd\u4e00\u904d\u8fc7\uff0c\u5199\u7684\u8fc7\u7a0b\u4e2d\u8dd1\u4e0d\u901a\u8fd8\u5f97\u91cd\u8dd1\u81f3\u5c1115\u5206\u949f\u4e0d\u8fc7\u5206\uff0c\u5199\u5b8c\u4e86\u8fd8\u5f97\u5728\u5176\u4ed6\u67b6\u6784\u4e0a\u8c03\u8bd5\uff0c\u534a\u4e2a\u5c0f\u65f6\u8fc7\u53bb\u4e86\uff0c\u8fd9\u8fd8\u53ea\u662f\u7b2c\u4e00\u6b21\u5199\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u540e\u7eed\u5982\u679c\u7528\u4f8b\u7ef4\u62a4\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u7ecf\u5e38\u6295\u5165\u76f8\u5f53\u957f\u65f6\u95f4\uff0c\u8fd9\u6837\u5176\u5b9e\u662f\u5931\u53bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u7684\u3002\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u5c31\u5e94\u8be5\u662f\u5feb\u51c6\u72e0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5","title":"5. \u8fb9\u7f18\u6027\u6d4b\u8bd5","text":"\u6709\u4e9b\u529f\u80fd\u6a21\u5757\u672c\u8eab\u662f\u5c5e\u4e8e\u6bd4\u8f83\u8fb9\u7f18\u6027\u7684\uff0c\u5373\u6781\u5c11\u7528\u6237\u4f1a\u4f7f\u7528\u5230\u7684\u529f\u80fd\uff0c\u8fd9\u7c7b\u529f\u80fd\u6a21\u5757\u4e0d\u9700\u8981\u5927\u89c4\u6a21\u5b9e\u73b0\u81ea\u52a8\u5316\uff0c\u4e00\u4e24\u4e2a\u573a\u666f\u8986\u76d6\u57fa\u672c\u529f\u80fd\u5c31\u884c\u4e86\uff0c\u56e0\u6b64\u6211\u4eec\u5728\u6311\u9009\u6b64\u7c7b\u7528\u4f8b\u7684\u65f6\u5019\u53ef\u4ee5\u7ed3\u5408\u6574\u4e2a\u529f\u80fd\u6a21\u5757\u7684\u8986\u76d6\u60c5\u51b5\u6765\u51b3\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6","title":"6. \u9700\u8981\u4f9d\u8d56\u4eba\u5de5\u4ecb\u5165\u7684","text":"\u81ea\u52a8\u5316\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\u662f\u6ca1\u6709\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bd4\u5982\u8981\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u90a3\u4e48\u5c31\u80cc\u79bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u3002 \u6bd4\u5982\u5149\u9a71\u6a21\u5757\uff0c\u5149\u9a71\u523b\u5f55\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u4f46\u662f\u5149\u9a71\u523b\u5f55\u4e4b\u540e\u5149\u76d8\u4f1a\u5f39\u51fa\u6765\uff0c\u9700\u8981\u4eba\u5de5\u66f4\u6362\u5149\u76d8\uff0c\u518d\u624b\u52a8\u63a8\u8fdb\u5149\u9a71\u4e2d\u3002 \u8fd9\u79cd\u529f\u80fd\u6a21\u5757\u5373\u4f7f\u505a\u81ea\u52a8\u5316\uff0c\u80fd\u6d89\u53ca\u5230\u7684\u529f\u80fd\u975e\u5e38\u6709\u9650\uff0c\u800c\u4e14\u4e0d\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u6240\u4ee5\u660e\u663e\u5c31\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7","title":"7. \u96be\u4ee5\u5b9e\u73b0\u7684","text":"\u7528\u4f8b\u6240\u6d89\u53ca\u5230\u7684\u65b9\u6cd5\u5b9e\u73b0\u8d77\u6765\u53ef\u80fd\u6709\u96be\u5ea6\uff0c\u751a\u81f3\u73b0\u9636\u6bb5\u65e0\u6cd5\u5b9e\u73b0\u7684\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002 \u6bd4\u5982\u5f71\u9662\u6d4b\u8bd5\u753b\u9762\u6e05\u6670\u5ea6\u3001\u6d41\u7545\u5ea6\u3001\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u4e4b\u540e\u7684\u89c6\u9891\u662f\u5426\u5b58\u5728\u5361\u987f\u7b49\u7528\u4f8b\uff0c\u73b0\u9636\u6bb5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#8","title":"8. \u529f\u80fd\u4e0d\u7a33\u5b9a","text":"\u8fd9\u4e2a\u4e0d\u662f\u8bf4\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\uff0c\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\u4e0d\u7a33\u5b9a\u662f\u6b63\u5e38\u7684\uff0c\u8fd9\u79cd\u6211\u4eec\u53ef\u4ee5\u7b49\u5f00\u53d1\u63d0\u6d4b\u4e4b\u540e\u518d\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u3002 \u529f\u80fd\u4e0d\u7a33\u5b9a\u6307\u7684\u662f\u7528\u4f8b\u6240\u6d89\u53ca\u7684\u529f\u80fd\uff0c\u53ef\u80fd\u5b58\u5728\u591a\u79cd\u53d8\u5316\uff0c\u6bcf\u6b21\u6267\u884c\u7528\u4f8b\u53ef\u80fd\u65ad\u8a00\u7684\u9884\u671f\u90fd\u4e0d\u540c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#9","title":"9. \u52a8\u6001\u65ad\u8a00","text":"\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u76f4\u5230\u7528\u4f8b\u7ed3\u675f\uff0c\u4e00\u76f4\u662f\u4e00\u4e2a\u52a8\u6001\u53d8\u5316\u7684\u8fc7\u7a0b\uff0c\u800c\u4e14\u65e0\u6cd5\u901a\u8fc7\u5176\u4ed6\u624b\u6bb5\u505c\u4e0b\u6765\uff1b \u6bd4\u5982\uff1a\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u65f6\uff0c\u53f3\u4e0b\u89d2\u7684\u5f55\u5236\u65f6\u95f4\u662f\u4e00\u76f4\u5728\u53d8\u5316\u7684\uff0c\u7528\u4f8b\u9700\u8981\u6d4b\u8bd5\u5f55\u52361\u5206\u949f\u4e4b\u540e\uff0c\u5f55\u5236\u65f6\u95f4\u662f\u521a\u597d\u505c\u572860\u79d2\uff1b \u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fd8\u505a\u4e0d\u5230\u65f6\u95f4\u7cbe\u51c6\u63a7\u5236\uff0c\u7a0b\u5e8f\u6267\u884c\u65f6\u95f4\u662f\u6709\u6ce2\u52a8\u7684\uff0c\u800c\u4e14\u8981\u9002\u914d\u591a\u4e2a\u5e73\u53f0\uff0c\u6240\u4ee5\u6b64\u7c7b\u7528\u4f8b\u5927\u6982\u7387\u4f1a\u6267\u884c\u5931\u8d25\u3002\u7279\u522b\u662f\u5728\u6027\u80fd\u8f83\u5dee\u7684\u56fd\u4ea7\u5316\u67b6\u6784\u4e0a\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u592a\u53ef\u80fd\u7a33\u5b9a\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#10","title":"10. \u63a2\u7d22\u6027\u6d4b\u8bd5","text":"\u63a2\u7d22\u6027\u6d4b\u8bd5\u901a\u5e38\u662f\u4e00\u4e9b\u4e0d\u786e\u5b9a\u7684\u64cd\u4f5c\uff0c\u591a\u53d8\u5207\u590d\u6742\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u9884\u671f\u4e5f\u53ef\u80fd\u662f\u4e0d\u786e\u5b9a\u7684\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u9a9a\u64cd\u4f5c\u592a\u591a\u4e86\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6b64\u7c7b\u7528\u4f8b\u9002\u5408\u91c7\u7528\u624b\u5de5\u6d4b\u8bd5\uff0c\u662f\u624b\u5de5\u6d4b\u8bd5\u771f\u6b63\u7684\u4ef7\u503c\u4f53\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#11","title":"11. \u6613\u7528\u6027\u6d4b\u8bd5","text":"\u5bf9\u4e8e\u6613\u7528\u6027\u7684\u5224\u65ad\u901a\u5e38\u662f\u4e3b\u89c2\u7684\uff0c\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\u5f88\u96be\u53bb\u5b9a\u4e49\u4ec0\u4e48\u6837\u7684\u60c5\u51b5\u5bf9\u7528\u6237\u662f\u6613\u7528\u7684\uff0c\u81ea\u52a8\u5316\u9700\u8981\u6709\u660e\u786e\u7684\u53ef\u5b9e\u73b0\u7684\u9884\u671f\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_2","title":"\u4e8c\u3001\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u524d\u9762\u8bb2\u4e86\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u4e00\u4e9b\u7528\u4f8b\u60c5\u51b5\uff0c\u6709\u540c\u5b66\u5c31\u8bf4\u4e86\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\u4e0d\u7528\u8bb2\u4e86\uff0c\u5c31\u662f\u4e0d\u9002\u5408\u7684\u53cd\u9762\u3002\u6ca1\u6bdb\u75c5\u54c8\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\uff0c\u6211\u4eec\u5927\u4f53\u8fd8\u53ef\u4ee5\u5206\u4e3a\u4e24\u7c7b\uff1a \u7b2c\u4e00\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u597d\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u7b2c\u4e8c\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u4e00\u822c\uff0c\u9700\u8981\u6295\u5165\u66f4\u591a\u7cbe\u529b\u624d\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u4ee5\u4e0b\u4ecb\u7ecd\u4e00\u4e9b\u6211\u4eec\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1_1","title":"1. \u64cd\u4f5c\u76f8\u5bf9\u7b80\u5355","text":"\u7528\u4f8b\u6b65\u9aa4\u76f8\u5bf9\u8f83\u5c11\uff0c\u8fd9\u79cd\u7528\u4f8b\u901a\u5e38\u662f\u4e00\u4e9b\u8def\u5f84\u5f88\u6d45\u7684\u7528\u4f8b\uff0c\u4e00\u822c\u4e5f\u662f\u4e00\u4e9b\u57fa\u7840\u7528\u4f8b\u3002\u7528\u4f8b\u7f16\u5199\u3001\u7ef4\u62a4\u90fd\u53ef\u4ee5\u8f7b\u677e\u641e\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2_1","title":"2. \u5bb9\u6613\u5b9e\u73b0","text":"\u73b0\u6709\u6280\u672f\u662f\u53ef\u5b9e\u73b0\u7684\uff0c\u6ca1\u6709\u96be\u5ea6\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3_1","title":"3. \u7ecf\u5e38\u7528\u4e8e\u56de\u5f52\u6d4b\u8bd5","text":"\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bcf\u6b21\u56de\u5f52\u6d4b\u8bd5\u5fc5\u987b\u8981\u6267\u884c\u7684\u7528\u4f8b\uff0c\u90a3\u4e48\u8fd9\u6761\u7528\u4f8b\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u3002 \u56de\u5f52\u6d4b\u8bd5\u65f6\u6211\u4eec\u9996\u5148\u5e94\u8be5\u4fdd\u8bc1\u5e94\u7528\u5386\u53f2\u57fa\u672c\u529f\u80fd\u6b63\u5e38\uff0c\u6240\u4ee5\u90a3\u4e9b\u6bcf\u6b21\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u90fd\u8981\u6267\u884c\u7684\u7528\u4f8b\u9002\u5408\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4_1","title":"4. \u529f\u80fd\u7a33\u5b9a\u7684\u6838\u5fc3\u529f\u80fd","text":"\u6d89\u53ca\u6838\u5fc3\u529f\u80fd\u7684\u7528\u4f8b\u662f\u6700\u6700\u91cd\u8981\u7684\u7528\u4f8b\uff0c\u4e5f\u662f\u6211\u4eec\u4ea4\u4ed8\u65f6\u5fc5\u987b\u8981\u4fdd\u8bc1\u8d28\u91cf\u7684\u76f8\u5173\u529f\u80fd\uff0c\u56e0\u6b64\u5e94\u8be5\u5c3d\u53ef\u80fd\u7684\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5_1","title":"5. \u8f93\u5165\u6570\u636e\u6d4b\u8bd5","text":"\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u901a\u5e38\u662f\u68c0\u9a8c\u88ab\u6d4b\u5e94\u7528\u63a5\u53d7\u6709\u6548\u6570\u636e\u3001\u62d2\u7edd\u65e0\u6548\u6570\u636e\u7684\u80fd\u529b\u3002\u5982\uff1a\u63d0\u4ea4\u8d85\u957f\u5b57\u7b26\u4e32\u3001\u7279\u6b8a\u5b57\u7b26\u4e32\u7b49\u7b49\u3002 \u6b64\u7c7b\u7528\u4f8b\u624b\u5de5\u6d4b\u8bd5\u5f88\u96be\u6bd4\u8f83\u5168\u9762\u7684\u8986\u76d6\u5230\u6240\u6709\u7684\u8f93\u5165\u60c5\u51b5\uff0c\u4f46\u662f\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\uff0c\u6b64\u7c7b\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u90fd\u662f\u4e00\u6837\u7684\uff0c\u53d8\u5316\u7684\u4ec5\u662f\u8f93\u5165\u53c2\u6570\u548c\u65ad\u8a00\u7ed3\u679c\uff0c\u91c7\u7528\u6570\u636e\u9a71\u52a8\uff0c\u53ef\u4ee5\u8f7b\u677e\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6_1","title":"6. \u683c\u5f0f\u8986\u76d6","text":"\u539f\u56e0\u540c\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u7c7b\u7528\u4f8b\u4e00\u6837\uff0c\u591a\u79cd\u683c\u5f0f\u7684\u8986\u76d6\u4e5f\u662f\u4e00\u4e2a\u5f88\u7e41\u7410\u7684\u4e8b\u60c5\uff0c\u4ea4\u7ed9\u81ea\u52a8\u5316\u6765\u505a\u518d\u5408\u9002\u4e0d\u8fc7\u4e86\u3002 \u6bd4\u5982\u5f71\u9662\u5bf9\u5f71\u7247\u683c\u5f0f\u7684\u68c0\u67e5\u3001\u622a\u56fe\u5f55\u5c4f\u5bf9\u4fdd\u5b58\u683c\u5f0f\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7_1","title":"7. \u68c0\u67e5\u5143\u7d20\u72b6\u6001","text":"\u67e5\u770b\u88ab\u6d4b\u5e94\u7528\u7684\u5143\u7d20\u5c5e\u6027\u3002\u5982\uff1a\u56fe\u7247\u7684\u5927\u5c0f\u548c\u6392\u5217\uff1b\u6309\u94ae\u7684\u53ef\u7528\u548c\u4e0d\u53ef\u7528\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/","title":"AT \u7ecf\u9a8c\u603b\u7ed3","text":"\u6b22\u8fce\u6240\u6709\u4eba\u63d0\u4ea4\u4f60\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u9762\u7684\u4f18\u79c0\u5b9e\u8df5\u7ecf\u9a8c\uff0c\u4ee5\u5e2e\u52a9\u5927\u5bb6\u89e3\u51b3\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#1","title":"1\u3001\u7ec8\u7ed3\u5668","text":"# litaoa@uniontech.com\n \u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4 pytest \u5b9e\u73b0\u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4\u7684\u65b9\u5f0f\u6709\u4e24\u79cd\uff0cyield \u548c\u7ec8\u7ed3\u51fd\u6570\uff1b yield \u5b9e\u73b0\uff0cyield\u524d\u9762\u4e3a\u7528\u4f8b\u7684\u524d\u7f6e\u6b65\u9aa4\uff0cyield \u540e\u9762\u4e3a\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4\u3002 @pytest.fixture\ndef clean_env():\nprint(\"setup\")\nyield\nprint(\"teardown\")\n \u7ec8\u7ed3\u51fd\u6570\u5b9e\u73b0\uff0c\u4f7f\u7528 request.addfinalizer \u6ce8\u518c\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4 @pytest.fixture\ndef clean_env(request):\ndef clean():\nprint(\"teardown\")\nrequest.addfinalizer(clean)\nprint(\"setup\")\n yield\u7684\u4f18\u7f3a\u70b9\uff1a \u4f18\u70b9\uff1a\u4ee3\u7801\u7b80\u6d01\uff0c\u76f4\u89c2\uff0c\u53ef\u4f7f\u7528yield\u5728\u7528\u4f8b\u4e2d\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c \u7f3a\u70b9\uff1a\u82e5\u524d\u7f6e\u6b65\u9aa4\u4e2d\u51fa\u73b0\u9519\u8bef\uff0c\u5219\u540e\u7f6e\u6b65\u9aa4\u4e0d\u4f1a\u6267\u884c \u7ec8\u7ed3\u51fd\u6570\uff1a \u4f18\u70b9\uff1a\u524d\u7f6e\u6b65\u9aa4\u5931\u8d25\u7684\u8bdd\uff0c\u540e\u7f6e\u6b65\u9aa4\u4ecd\u4f1a\u6267\u884c\u4e14\u53ef\u4ee5\u6ce8\u518c\u591a\u4e2a\u540e\u7f6e\u6b65\u9aa4\uff08\u524d\u63d0\uff1a\u9700\u8981\u5728\u4ee3\u7801\u62a5\u9519\u4e4b\u524d\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff09\uff0c\u652f\u6301\u7075\u6d3b\u4f7f\u7528\u540e\u7f6e\u6761\u4ef6 \u7f3a\u70b9\uff1a\u4ee3\u7801\u8f83\u4e3a\u590d\u6742\uff0c\u65e0\u6cd5\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c\uff08\u672c\u4eba\u76ee\u524d\u672a\u5b9e\u73b0\uff09 \u603b\u7ed3\uff1a\u5728\u524d\u7f6e\u6b65\u9aa4\u4fdd\u8bc1\u7edd\u5bf9\u4e0d\u4f1a\u51fa\u9519\u65f6\uff0c\u4f7f\u7528yield\u66f4\u4f73\u7b80\u4fbf\uff0c\u5f53\u524d\u7f6e\u6b65\u9aa4\u6613\u51fa\u73b0\u95ee\u9898\u65f6\uff0c\u63a8\u8350\u4f7f\u7528\u7ec8\u7ed3\u51fd\u6570\u3002 \u573a\u666f\uff1a\u4fdd\u9669\u7bb1\u7528\u4f8b\uff0c\u524d\u7f6e\u6b65\u9aa4\u4e2d\u5f00\u542f\u4fdd\u9669\u7bb1\uff0c\u540e\u7f6e\u6b65\u9aa4\u5220\u9664\u4fdd\u9669\u7bb1\u3002 @pytest.fixture(scope=\"session\", autouse=True)\ndef vault_fixture(request):\nDfmWidget.reset_vault_by_cmd() # 1\u3001\u91cd\u7f6e\u4fdd\u9669\u7bb1\nDdeDockPublicWidget().close_file_manager_by_cmd() # 2\u3001\u5173\u95ed\u6587\u7ba1\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 3\u3001\u5f00\u542f\u6587\u7ba1\nvault = DfmWidget()\nvault.create_file_vault() # 4\u3001\u521b\u5efa\u4fdd\u9669\u7bb1\ndef delete_vault(): # 8\u3001\u5220\u9664\u4fdd\u9669\u7bb1\u7684\u540e\u7f6e\u6b65\u9aa4\nsleep(2)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr()\nvault = DfmWidget()\nvault.delete_file_vault()\nDfmWidget.reset_vault_by_cmd()\nDdeDockPublicWidget().close_file_manager_by_cmd()\nrequest.addfinalizer(delete_vault) # 5\u3001\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\nDdeDockPublicWidget().close_file_manager_by_cmd() # 6\u3001\u5173\u95ed\u6587\u7ba1\nsleep(1)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 7\u3001\u5f00\u542f\u6587\u7ba1\n \u4ee3\u7801\u6309\u6ce8\u91ca\u4e2d\u7684\u5e8f\u53f7\u6267\u884c\u6b65\u9aa4 \u4ee3\u7801\u5728\u6b65\u9aa41-4\u4efb\u610f\u4f4d\u7f6e\u62a5\u9519\uff0c\u5219\u4e0d\u4f1a\u6267\u884c\u6b65\u9aa48\uff0c\u56e0\u4e3a\u672a\u6267\u884c\u5230\u6b65\u9aa45\uff0c\u6b65\u9aa48\u8fd8\u672a\u6ce8\u518c \u4ee3\u7801\u5728\u6b65\u9aa46-7\u62a5\u9519\uff0c\u4ecd\u4f1a\u6267\u884c\u6b65\u9aa47\uff0c\u56e0\u4e3a\u5728\u6b65\u9aa45\u4e2d\u5df2\u7ecf\u5c06\u6b65\u9aa47\u6ce8\u518c \u53ef\u4ee5\u7075\u6d3b\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff0c\u80fd\u5b9e\u73b0\u67d0\u4e2a\u524d\u7f6e\u6b65\u9aa4\u6267\u884c\u4e4b\u540e\uff0c\u624d\u4f1a\u6267\u884c\u540e\u7f6e\u6b65\u9aa4\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#2","title":"2\u3001\u542f\u52a8\u5e94\u7528\u7684\u65b9\u5f0f","text":"# huangmingqiang@uniontech.com\n \uff081\uff09\u547d\u4ee4\u884c\u542f\u52a8 \u5728 AT \u4ee3\u7801\u4e2d\u4f7f\u7528\u547d\u4ee4\u884c\u542f\u52a8\u5e94\u7528\uff0c\u4e3e\u4f8b\uff1a os.popen(\"deepin-music\")\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f7f\u7528 ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6\uff0cdogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u3002 \uff082\uff09\u901a\u8fc7 UI \u64cd\u4f5c\u542f\u52a8 \u901a\u8fc7\u4efb\u52a1\u680f\u3001\u542f\u52a8\u5668\u3001\u684c\u9762\u7b49UI\u65b9\u5f0f\u542f\u52a8\uff0c\u6bd4\u5982\u53cc\u51fb\u6253\u5f00\u3001\u53f3\u952e\u6253\u5f00\u7b49\uff0c\u8fd9\u79cd\u64cd\u4f5c\u65b9\u5f0f\u4e0d\u5b58\u5728ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6dogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u7684\u95ee\u9898\uff0c\u4e5f\u66f4\u52a0\u7b26\u5408\u7528\u6237\u7684\u64cd\u4f5c\u884c\u4e3a\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#3","title":"3\u3001\u6587\u4ef6\u9009\u62e9\u6846\u5c5e\u6027\u5b9a\u4f4d\u5076\u73b0\u65e0\u6cd5\u627e\u5230","text":"\u6587\u4ef6\u9009\u62e9\u6846\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5728\u8c03\u7528\u6587\u4ef6\u9009\u62e9\u6846\u65f6\uff0c\u6709\u4e00\u5b9a\u7684\u6982\u7387\u51fa\u73b0\uff0c\u754c\u9762\u5df2\u7ecf\u6e32\u67d3\u51fa\u6765\u4e86\uff0c\u4f46\u662f\u5c5e\u6027\u6811\u5e76\u6ca1\u6709\u5199\u5165\uff0c\u5bfc\u81f4\u901a\u8fc7\u5c5e\u6027\u65e0\u6cd5\u627e\u5230\u5143\u7d20\uff0c\u76ee\u524d\u4e5f\u6ca1\u6709\u5f88\u597d\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u4e3a\u4e86\u7528\u4f8b\u7a33\u5b9a\u6027\uff0c\u6587\u4ef6\u9009\u62e9\u6846\u7684\u64cd\u4f5c\u5efa\u8bae\u4f7f\u7528UI\u6216\u8005\u56fe\u7247\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u53ef\u4ee5\u901a\u8fc7\u641c\u7d22\u5185\u5bb9\u56fa\u5b9a\u6587\u4ef6\u4f4d\u7f6e\u3002 # litaoa@uniontech.com\n desk = DdeDesktopPublicWidget()\n# \u9009\u62e9\u89c6\u9891\u76ee\u5f55\ndesk.click_videos_dir_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.ctrl_f()\nsleep(1)\ndesk.input_message(\"\u5143\u7d20\u540d\u79f0\")\nsleep(0.5)\ndesk.enter()\nsleep(1)\n# \u9009\u62e9\u7b2c\u4e00\u4e2a\u6587\u4ef6\ndesk.click_list_view_btn_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.click_first_file_in_desktop_plugs_by_ui()\nsleep(1)\n# \u6587\u7ba1\u63d2\u4ef6\u4e2d\u70b9\u51fb\u6253\u5f00\ndesk.click_open_btn_in_desktop_plugs_by_ui()\n"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#4","title":"4\u3001\u5e94\u7528\u542f\u52a8","text":"# mikigo\n \u5728UI\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u4e00\u5207\u64cd\u4f5c\u7684\u90fd\u662f\u4ece\u5e94\u7528\u542f\u52a8\u5f00\u59cb\u7684\uff0c\u800c\u5728Linux\u684c\u9762\u5e94\u7528\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u6211\u4eec\u542f\u52a8\u5e94\u7528\u7684\u65b9\u6cd5\u6709\u591a\u79cd\uff0c\u4e0b\u9762\u505a\u4e00\u4e2a\u7b80\u5355\u7684\u4ecb\u7ecd\uff1a \u3010\u4f7f\u7528dogtail\u542f\u52a8\u3011 dogtail\u63d0\u4f9b\u4e86\u5e94\u7528\u542f\u52a8\u7684\u65b9\u6cd5\uff0c\u5728utils\u5e93\u4e2d\uff0c\u4f7f\u7528run\u65b9\u6cd5\u542f\u52a8\uff1a \u9996\u5148\u5bfc\u5165\u65b9\u6cd5\uff1a from dogtail.utils import *\n \u8c03\u7528run\u65b9\u6cd5 run('deepin-music')\n \u5373\u53ef\u542f\u52a8\u97f3\u4e50 \u8fd9\u79cd\u65b9\u6cd5\u7684\u4f18\u70b9\u662f\u91c7\u7528\u8fdb\u7a0b\u7684\u65b9\u5f0f\u76f4\u63a5\u542f\u52a8\uff0c\u4e0d\u4f9d\u8d56\u4e0eUI\uff0c\u65e0\u8bba\u684c\u9762\u6216\u4efb\u52a1\u680f\u4e0a\u662f\u5426\u5b58\u5728\u5e94\u7528\u56fe\u6807\uff0c\u90fd\u53ef\u4ee5\u6b63\u5e38\u542f\u52a8\u3002 \u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c \u5982\u679c\u4f7f\u7528ssh\u8fdc\u7a0b\u8c03\u7528\uff0c\u6216\u8005Jenkins\u4e2d\u6267\u884c\u6d4b\u8bd5\u811a\u672c\u7684\u65f6\u5019\uff0c\u5728sniff\u4e2d\u4f1a\u51fa\u73b0\u627e\u4e0d\u5230\u5e94\u7528\uff0c\u7ecf\u8fc7\u5206\u6790\uff0c\u53ef\u80fd\u662f\u56e0\u4e3a\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\u542f\u52a8\u7684\u65f6\u5019\uff0c\u5b9e\u9645\u662f\u91c7\u7528\u4e00\u4e2a\u5b50\u8fdb\u7a0b\u542f\u52a8\u4e86\u5e94\u7528\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u5230\u3002 \u3010\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u3011 \u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807 \u901a\u5e38\u6709\u4e24\u79cd\u65b9\u6cd5\uff1a \uff081\uff09\u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807\u3002 \uff082\uff09\u5df2\u77e5\u5e94\u7528\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u7684\u4f4d\u7f6e\uff0c\u7136\u540e\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u5bf9\u5e94\u5750\u6807\u3002 \u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u7f3a\u70b9\u662f\u4f4d\u7f6e\u5fc5\u987b\u56fa\u5b9a\uff0c\u5982\u679c\u79fb\u52a8\u4f4d\u7f6e\u5c31\u4e0d\u884c\u4e86\uff0c\u800c\u4f7f\u7528\u7b2c\u4e00\u79cd\u65b9\u6cd5\uff0c\u65e0\u8bba\u4f4d\u7f6e\u5728\u54ea\u91cc\uff0c\u53ea\u8981\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u5b58\u5728\u5373\u53ef\u3002 \u3010\u70b9\u51fb\u684c\u9762\u56fe\u6807\u542f\u52a8\u3011 \u684c\u9762\u56fe\u6807\u76ee\u524d\u662f\u91c7\u7528\u56fe\u50cf\u8bc6\u522b\u6280\u672f\uff0c\u5b9a\u4f4d\u5230\u5e94\u7528\u56fe\u6807\u7684\u5750\u6807\uff0c\u7136\u540e\u901a\u8fc7pyauogui\u8fdb\u884c\u70b9\u51fb\u64cd\u4f5c\u3002 \u8be6\u7ec6\u6280\u672f\u65b9\u6848\u53ef\u4ee5\u53c2\u8003\u6211\u7684\u53e6\u5916\u4e24\u7bc7\u535a\u5ba2: \u57fa\u4e8eopencv\u7684\u6a21\u677f\u5339\u914d\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd4\u56de\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 Python\u4e09\u65b9\u5e93PyAutoGui\u7684\u4f7f\u7528\u65b9\u6cd5 \u3010\u4ece\u542f\u52a8\u5668\u542f\u52a8\uff08\u4fd7\u79f0\u5f00\u59cb\u83dc\u5355\uff09\u3011 \u542f\u52a8\u4e2d\u542f\u52a8\u7684\u5b9e\u73b0\u903b\u8f91\u5b9e\u9645\u548c\u4efb\u52a1\u680f\u4e0a\u542f\u52a8\u5dee\u4e0d\u591a\u3002 \u9996\u5148\uff0c\u9700\u8981\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u542f\u52a8\u5668\u56fe\u6807\uff0c\u6216\u8005\u952e\u76d8super\u952e\uff0c\u5c06\u542f\u52a8\u5668\u547c\u51fa\u6765\uff0c \u7136\u540e\uff0c\u5728\u542f\u52a8\u5668\u4e2d\u70b9\u51fb\u5bf9\u5e94\u7684\u56fe\u6807\uff0c \u4f46\u662f\u8fd9\u91cc\u6709\u4e2a\u95ee\u9898\uff0c\u542f\u52a8\u5668\u4e2d\u7684\u5e94\u7528\u5217\u8868\uff0c\u4e00\u9875\u5c55\u793a\u4e0d\u5b8c\uff0c\u6240\u4ee5\u5982\u679c\u6211\u4eec\u8981\u70b9\u51fb\u7684\u5e94\u7528\u56fe\u6807\u4e0d\u5728\u7b2c\u4e00\u9875\u600e\u4e48\u529e\uff0c\u901a\u5e38\u89e3\u51b3\u65b9\u6848\u6709\u4e24\u79cd\uff1a \uff081\uff09\u9700\u8981\u8fdb\u884c\u5411\u4e0b\u6ed1\u52a8\uff0c\u8fd9\u91cc\u5c31\u6d89\u53ca\u5230\u76f8\u5e94\u7684\u8bc6\u522b\u65b9\u6848\uff0c\u5224\u65ad\u5982\u679c\u4e0d\u5728\u7b2c\u4e00\u9875\u5c31\u5f80\u4e0b\u6ed1\u52a8\u7ffb\u9875\u3002 \uff082\uff09\u542f\u52a8\u5668\u63d0\u4f9b\u641c\u7d22\u7684\u529f\u80fd\uff0c\u8f93\u5165\u5e94\u7528\u540d\u79f0\u641c\u7d22\uff0c\u7136\u540e\u8fdb\u884c\u70b9\u51fb\u3002 \u4ece\u5b9e\u9645\u64cd\u4f5c\u4e2d\u6765\u770b\uff0c\u91c7\u7528\u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u6548\u7387\u4f1a\u9ad8\u4e00\u70b9\u3002 \u3010\u7ec8\u7aef\u547d\u4ee4\u542f\u52a8\u3011 \u5728python\u4e2d\uff0c\u4f7f\u7528os.popen()\u6216os.system()\u6216\u8005subprocess.Popen()\uff0c\u5b9e\u73b0\u547d\u4ee4\u884c\u542f\u52a8\uff0c\u6bd4\u5982\uff1a import os\nos.popen('deepin-music')\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u8fdc\u7a0b\u6267\u884c\u811a\u672c\u7684\u65f6\u5019\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u7684\u95ee\u9898\u3002 \u3010\u603b\u7ed3\u3011 \u4ee5\u4e0a\u51e0\u79cd\u65b9\u6cd5\uff0c\u5404\u6709\u4f18\u7f3a\u70b9\uff0c\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff1a \uff081\uff09\u5982\u679c\u9700\u8981\u5728Jenkins\u4e2d\u505a\u6301\u7eed\u96c6\u6210\uff0c\u5efa\u8bae\u4f7f\u7528\u7b2c\u4e8c\u79cd\u4efb\u52a1\u680f\u542f\u52a8\u7684\u65b9\u6cd5\u3002 \uff082\uff09\u5982\u679c\u4e0d\u4f1a\u91c7\u7528\u8fdc\u7a0b\u6267\u884c\u7684\uff0c\u5efa\u8bae\u91c7\u7528\u7b2c\u4e00\u79cd\u6216\u8005\u6700\u540e\u4e00\u79cd\u65b9\u6848\u3002 \uff083\uff09\u7b2c\u4e09\u79cd\u548c\u7b2c\u56db\u79cd\u542f\u52a8\u65b9\u6cd5\uff0c\u901a\u5e38\u5728\u6d4b\u8bd5\u7528\u4f8b\u4e2d\u4f1a\u6d89\u53ca\u5230\uff0c\u6240\u4ee5\u5076\u5c14\u4f1a\u7528\u3002"},{"location":"RELEASE/","title":"\u7248\u672c\u66f4\u65b0\u8bb0\u5f55","text":""},{"location":"RELEASE/#2122023822","title":"2.1.2\uff082023/8/22\uff09","text":"new \u589e\u52a0 OCR \u8bc6\u522b\u81ea\u52a8\u91cd\u8bd5\u673a\u5236\uff0c\u9ed8\u8ba4\u91cd\u8bd5 2 \u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u91cd\u8bd5\u6b21\u6570\uff1b \u4f7f\u7528\u7a97\u7ba1\u6700\u65b0\u63d0\u4f9b\u7684\u4e8c\u8fdb\u5236\u63a5\u53e3\uff0c\u4f18\u5316\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u5728 Wayland \u4e0b\u83b7\u53d6\u7a97\u53e3\u4fe1\u606f\u7684\u65b9\u6cd5\uff1b\u611f\u8c22\u684c\u9762\u6d4b\u8bd5\u90e8 @\u4f55\u6743 @\u5b59\u7fe0 \u3001\u7a97\u7ba1\u7814\u53d1 @\u9ec4\u6cfd\u94ed \u7684\u5927\u529b\u652f\u6301\u3002 \u6269\u5145 skipif \u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\u51fd\u6570\uff1a skipif_xdg_type \u652f\u6301 x11 \u6216 wayland \u4e0a\u8df3\u8fc7\uff1b skipif_cpu_name \u652f\u6301\u4e0d\u540c cpu \u4e0a\u8df3\u8fc7\uff0c\u6bd4\u5982\uff1askipif_cpu_name-KLVVW5821\uff1b "},{"location":"RELEASE/#2102023818","title":"2.1.0\uff082023/8/18\uff09","text":"fix \u4fee\u590d SW \u67b6\u6784\u73af\u5883\u4f9d\u8d56\u7684\u95ee\u9898\uff0c\u539f\u56e0\u662f\u4e4b\u524d\u6211\u8fd9\u91cc\u672c\u5730\u6ca1\u6709 SW \u7684\u673a\u5668\uff0c\u6ca1\u6709\u505a\u76f8\u5173\u9002\u914d\uff1b \u4fee\u590d\u5b50\u9879\u76ee\u5355\u72ec\u9700\u8981\u4e09\u65b9\u5305 pexpect\uff0c\u7531\u4e8e\u4e4b\u524d\u662f\u9884\u88c5\u5230\u955c\u50cf\u91cc\u9762\u7684\uff0c\u4f46\u57fa\u7840\u6846\u67b6\u4e0d\u9700\u8981\uff0c\u56e0\u6b64\u6ca1\u6709\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u91cc\u9762\uff0c\u5bfc\u81f4\u5b50\u9879\u76ee\u4f9d\u8d56\u62a5\u9519\u3002 \u4fee\u590d\u5b50\u9879\u76ee cv \u5bfc\u5165\u62a5\u9519\u7684\u95ee\u9898\uff1b \u539f\u56e0\u4e3a\uff1ayouqu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u517c\u5bb9\u4e24\u79cd\u60c5\u51b5\uff0c\u4e00\u79cd\u662f\u9762\u5411\u670d\u52a1\uff0c\u5c31\u662f\u672c\u5730\u6d4b\u8bd5\u673a\u4e0d\u9700\u8981\u5b89\u88c5 OpenCV\uff0c\u7528\u4f8b\u4e2d\u7684\u56fe\u50cf\u8bc6\u522b\u4f1a\u901a\u8fc7\u8fdc\u7a0b\u670d\u52a1\u63a5\u53e3\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u548c\u7ed3\u679c\u83b7\u53d6\uff1b\u7b2c\u4e8c\u79cd\u662f\u539f\u751f\uff0c\u5c31\u662f\u672c\u5730\u76f4\u63a5\u5b89\u88c5 OpenCV \u76f4\u63a5\u7528\u3002\u4e24\u4e2a\u60c5\u51b5\u7684\u4f18\u5148\u7ea7\u662f\u4f18\u5148\u5224\u65ad\u672c\u5730\u5b58\u5728\uff0c\u5426\u5219\u8d70\u670d\u52a1\u3002 \u524d\u9762\u6211\u4eec\u5df2\u7ecf\u628a OCR \u529f\u80fd\u505a\u4e86\u670d\u52a1\u5316\uff0c\u57fa\u4e8e 1 \u5e74\u591a\u4ee5\u6765\u7684\u89c2\u5bdf\uff0c\u7528\u8d77\u6765\u5f88\u7a33\u5b9a\uff0c\u518d\u4e00\u4e2a\u5c31\u662f OpenCV \u5b89\u88c5\u5305\u662f\u6bd4\u8f83\u81c3\u80bf\u7684\uff0c\u7c97\u7565\u6570\u4e86\u4e0b\u4f9d\u8d56\u6709 30+ \u4e2a\uff0c\u800c\u4e14\u5728\u5404\u67b6\u6784\u4e0a\u4f9d\u8d56\u5305\u8fd8\u4e0d\u5c3d\u76f8\u540c\uff0c\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u65b9\u6848\u4e2d\u4e0d\u592a\u597d\u5904\u7406\uff0c\u6240\u4ee5\u672c\u6b21 2.0 \u7248\u672c\u6211\u4eec\u5927\u80c6\u7684\u5c06\u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u529f\u80fd\u4fee\u6539\u4e3a\u9762\u5411\u670d\u52a1\u7684\u65b9\u5f0f\uff0c\u524d\u671f\u6d4b\u8bd5\u4e00\u5207\u770b\u8d77\u6765\u90fd\u5f88\u548c\u8c10\u3002 \u4f46\u662f\u6ca1\u6ce8\u610f\u5230\u4e4b\u524d\u7ed9\u6d77\u71d5\u59d0\u90a3\u8fb9\u9879\u76ee\u5355\u72ec\u5b9a\u5236\u505a\u4e86\u4e2a\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\uff08\u4e3a\u4e86\u80fd\u7b80\u5355\u5e73\u6ed1\u7684\u8fc1\u79fb\u5230 youqu\uff09\uff0c\u6b64\u63a5\u53e3\u5e95\u5c42\u6ca1\u6709\u517c\u5bb9\u670d\u52a1\u5316\uff0c\u6240\u4ee5\u5979\u90a3\u8fb9\u7684\u9879\u76ee\u8c03\u7528\u6b64\u5b9a\u5236\u63a5\u53e3\u4f1a\u62a5 cv \u5bfc\u5165\u7684\u95ee\u9898\u3002 \u7531\u4e8e\u5c06\u8fd9\u4e2a\u5b9a\u5236\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\u8fdb\u884c\u670d\u52a1\u5316\u517c\u5bb9\u6539\u9020\u9700\u8981\u4e00\u5b9a\u65f6\u95f4\uff0c\u6539\u5b8c\u8fd8\u9700\u8981\u6d4b\u8bd5\uff0c\u4f46\u672c\u6b21\u65f6\u95f4\u6bd4\u8f83\u7d27\uff0c\u56e0\u6b64\u5148\u628a OpenCV \u88c5\u8fdb\u865a\u62df\u73af\u5883\uff0c\u540e\u7eed\u7248\u672c\u518d\u8003\u8651\u9488\u5bf9\u6b64\u63a5\u53e3\u505a\u4fee\u6539\u3002"},{"location":"RELEASE/#2002023816","title":"2.0.0\uff082023/8/16\uff09","text":"YouQu\uff08\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff09\u5f00\u6e90\u4e86\uff0c\u540c\u65f6\u63a8\u51fa\u4e86 2.0 \u7248\u672c\u3002 \u611f\u8c22\u738b\u6ce2\u603b\u3001\u67b6\u6784\u5e08\u5f90\u5c0f\u4e1c\u3001\u7814\u53d1\u7ecf\u7406\u90d1\u5e7c\u6208\u3001\u5218\u90d1\u7b49\u7814\u53d1\u540c\u4e8b\u7684\u5927\u529b\u652f\u6301\u3002 new 1\u3001\u65b0\u7684\u57fa\u7840\u6846\u67b6\u4ee3\u7801\u83b7\u53d6\u65b9\u5f0f\u53ca\u65b0\u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4 YouQu \u540e\u7eed\u5747\u901a\u8fc7 PyPI \u8fdb\u884c\u5305\u7684\u53d1\u5e03\uff0c\u4e5f\u5c31\u662f\u8bf4\u540e\u7eed\u53ef\u4ee5\u4f7f\u7528 pip \u8fdb\u884c\u5b89\u88c5\uff1a sudo pip3 install youqu==2.0.0\n \u8fd9\u91cc\u6709 2 \u4e2a\u5c0f\u70b9\u8981\u6ce8\u610f\uff1a \u63a8\u8350\u4f7f\u7528 sudo pip3 \uff08\u52a0 sudo\uff09\u8fdb\u884c\u5b89\u88c5\uff1b \u5982\u679c\u4e0d\u52a0 sudo \u6709\u4e9b\u673a\u5668\u53ef\u80fd $HOME/.local/bin \u4e0d\u5728\u7cfb\u7edf PATH \u73af\u5883\u76ee\u5f55\u4e0b\uff0c\u5728\u4e0d\u6dfb\u52a0\u73af\u5883\u53d8\u91cf\u7684\u60c5\u51b5\u4e0b\uff0c\u4f1a\u51fa\u73b0 YouQu \u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4\uff08youqu-startproject\uff09\u65e0\u6cd5\u4f7f\u7528\u7684\u95ee\u9898\uff1b \u5f53\u7136\uff0c\u5c06\u4e0a\u8ff0\u8def\u5f84\u6dfb\u52a0\u5230\u73af\u5883\u53d8\u91cf\u4e4b\u540e\u4e5f\u662f\u53ef\u4ee5\u7528\u7684\uff0c\u6240\u4ee5\u6211\u8fd9\u91cc\u662f\u63a8\u8350\u52a0 sudo\uff0c\u4e0d\u52a0 sudo \u4e5f\u662f\u53ef\u4ee5\u7684\uff0c\u53ea\u662f\u9700\u8981\u5173\u6ce8\u4e0b\u73af\u5883\u53d8\u91cf\u7684\u95ee\u9898\u3002 \u63a8\u8350\u6307\u5b9a\u7248\u672c\u53f7\uff08youqu==2.0.0\uff09\u5b89\u88c5\uff0c\u5982\u679c\u4e0d\u6307\u5b9a\u7248\u672c\u53f7\u9ed8\u8ba4\u662f\u5b89\u88c5\u6700\u65b0\u53d1\u5e03\u7684 YouQu \u7248\u672c\uff0c\u4f60\u53ef\u4ee5\u5728 PyPI \u4e0a\u7684 Release history \u91cc\u9762\u67e5\u770b\u6709\u54ea\u4e9b\u7248\u672c\u3002 \u5b89\u88c5\u4e4b\u540e\u4f1a\u81ea\u52a8\u751f\u6210\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu-startproject\uff0c\u4f7f\u7528\u5b83\u53ef\u4ee5\u521d\u59cb\u5316\u5de5\u7a0b\uff0c\u8fd9\u91cc\u4ee5\u97f3\u4e50\u4e3e\u4f8b\uff1b youqu-startproject autotest_deepin_music\n \u8fd9\u6837\u5c31\u4f1a\u5728\u5f53\u524d\u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a autotest_deepin_music \u76ee\u5f55\uff0c\u91cc\u9762\u5305\u542b\u4e86\u57fa\u7840\u6846\u67b6\u6240\u6709\u7684\u4ee3\u7801\uff1b \u4e4b\u540e\uff0c\u8fd8\u662f\u5728 apps \u76ee\u5f55\u4e0b\uff0c\u653e\u5165\u5b50\u9879\u76ee\u7684AT\u4ee3\u7801\u5373\u53ef\uff0c\u4f7f\u7528\u65b9\u6cd5\u548c\u8fc7\u53bb\u4e00\u6837\uff0c\u8fd9\u91cc\u5c31\u4e0d\u591a\u4ecb\u7ecd\u3002 \u53e6\u5916\uff0c\u9664\u4e86\u901a\u8fc7 pip \u83b7\u53d6\u4ee5\u5916\uff0c\u4ecd\u7136\u53ef\u4ee5\u901a\u8fc7\u6e90\u7801\u83b7\u53d6\uff08\u76f4\u63a5 git clone\uff09\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u4f7f\u7528 pip \u5b89\u88c5 YouQu \u65f6\uff0cYouQu \u5305\u7684\u5927\u5c0f\u624d 600+ k\uff0c\u5b89\u88c5\u901f\u5ea6\u8d77\u98de\u3002 2\u3001\u65b0\u7684AT\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848 \u4e3a\u4e86\u89e3\u51b3\u4ee5\u4e0b\u95ee\u9898\uff1a \u8fc7\u53bb\u4e00\u6bb5\u65f6\u95f4\u54b1\u4eec\u7ecf\u5e38\u51fa\u73b0\u7684\uff0c\u4e0d\u540c\u7684AT\u9879\u76ee\u5728\u540c\u4e00\u53f0\u673a\u5668\u4e0a\u90e8\u7f72\u73af\u5883\u65f6\u4f9d\u8d56\u7248\u672c\u51b2\u7a81\u7684\u95ee\u9898\uff0c\u65b0\u65b9\u6848\u4e0d\u540c\u7684\u9879\u76ee\u4f1a\u52a8\u6001\u751f\u6210\u81ea\u5df1\u7684\u865a\u62df\u73af\u5883\uff0c\u76f8\u4e92\u4e4b\u95f4\u4e0d\u5f71\u54cd\uff1b \u4e1a\u5185\u4e3a\u4e86\u89e3\u51b3\u7248\u672c\u51b2\u7a81\u95ee\u9898\u4e00\u822c\u90fd\u4f1a\u4f7f\u7528Python\u865a\u62df\u73af\u5883\u7684\u5de5\u5177\uff0c\u4f46\u662f\u90fd\u6709\u4e2a\u95ee\u9898\uff0c\u65e0\u6cd5\u7ba1\u7406 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u5305\uff0c\u672c\u6b21\u6211\u4eec\u89e3\u51b3\u4e86\u8fd9\u4e2a\u95ee\u9898\uff0c\u80fd\u591f\u5b8c\u5168\u7ba1\u7406\u5e38\u89c4\u7684Python\u5305\uff0c\u4e5f\u80fd\u7ba1\u7406\u5230 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u4e09\u65b9\u5305\uff1b \u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u4f7f\u7528\u65b9\u6cd5\uff1a bash env.sh\n \u53ef\u4ee5\u770b\u51fa\u6765\u548c\u539f\u6765\u4f7f\u7528\u65b9\u6cd5\u6ca1\u6709\u53d8\u5316\uff0c\u4e5f\u5c31\u662f\u8bf4\u4ece\u4f7f\u7528\u7684\u89d2\u5ea6\u662f\u5b8c\u5168\u6ca1\u6709\u533a\u522b\u7684\uff0c\u53ea\u662f\u5185\u90e8\u505a\u4e86\u4e0d\u540c\u7684\u4e8b\u60c5\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u672c\u673a\u90e8\u7f72\u7684\u529f\u80fd\u4ecd\u7136\u4fdd\u7559 env_dev.sh\uff0c\u53ef\u4ee5\u4f5c\u4e3a\u5f00\u53d1\u65f6\u7684\u73af\u5883\u90e8\u7f72\u3002 3\u3001\u65b0\u7684\u9a71\u52a8\u547d\u4ee4 \u8fc7\u53bb\u54b1\u4eec\u90fd\u662f\u4f7f\u7528\u8fd9\u6837\u7684\u547d\u4ee4\u6765\u9a71\u52a8\u6267\u884c\uff1a python3 manage.py run\n \u7531\u4e8e\u9ed8\u8ba4\u57fa\u4e8e\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848\uff0c\u56e0\u6b64\u6211\u4eec\u589e\u52a0\u4e86\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu\uff1b \u65b0\u7684\u9a71\u52a8\u65b9\u5f0f\uff1a youqu manage.py run\n \u53ea\u9700\u8981\u628a python3 \u66ff\u6362\u6210 youqu \u5c31\u53ef\u4ee5\u4e86\uff0c\u770b\u8d77\u6765\u5f88\u548c\u8c10~ 4\u3001\u65b0\u7684\u6587\u6863\u5730\u5740 \u8fc7\u53bb\u54b1\u4eec YouQu \u7684\u5728\u7ebf\u6587\u6863\u662f\u90e8\u7f72\u5728\u516c\u53f8\u5185\u7f51\u7684\uff0c\u73b0\u5728\u5f00\u6e90\u5230 github \u4e86\uff0c\u5916\u90e8\u5f00\u53d1\u8005\u80af\u5b9a\u8bbf\u95ee\u4e0d\u5230\u5185\u7f51\u7684\u6587\u6863\uff0c\u56e0\u6b64\u9700\u8981\u5c06\u6587\u6863\u90e8\u7f72\u5230\u516c\u7f51\u3010\u516c\u7f51\u6587\u6863\u3011\uff1b \u516c\u7f51\u6587\u6863\u4f7f\u7528\u7684\u662f github pages\uff08\u767d\u5ad6\u602a\u4e00\u987f\u72c2\u559c~~\uff09\uff0c\u4f46\u53ef\u80fd\u4f1a\u51fa\u73b0\u6587\u6863\u901f\u5ea6\u6162\u7684\u95ee\u9898\uff08\u4ee3\u7406\u4e0b\u5c31\u597d\u4e86\uff09\uff0c\u4e0d\u8fc7\u6ca1\u5173\u7cfb\uff0c\u54b1\u4eec\u3010\u5185\u7f51\u6587\u6863\u3011\u4ecd\u7136\u4fdd\u7559\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u3002 5\u3001\u5176\u4ed6\u4e00\u4e9b\u5c0f\u5c0f\u529f\u80fd\u66f4\u65b0\uff1a \uff081\uff09\u65b0\u589e\u5173\u95ed\u5206\u8fa8\u7387\u68c0\u6d4b\u7684\u53c2\u6570\u503c\uff1b youqu manage.py run --resolution no\n \u6216\u8005\u4fee\u6539 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387, \u6bd4\u5982\uff1a1920x1080\n;no: \u8868\u793a\u4e0d\u505a\u5206\u8fa8\u7387\u6821\u9a8c\nRESOLUTION = 1920x1080\n resolution \u8fd9\u4e2a\u53c2\u6570\u4e00\u76f4\u90fd\u6709\u7684\uff0c\u53ea\u4e0d\u8fc7\u4e4b\u524d\u662f\u7528\u4e8e\u6307\u5b9a\u5206\u8fa8\u7387\u5927\u5c0f\uff0c\u6bd4\u5982 --resolution 1920x1080\uff0c\u4f46\u6709\u4e9b\u63a5\u53e3\u7684\u9879\u76ee\u4e0d\u9700\u8981\u8fd9\u4e2a\u68c0\u67e5\uff0c\u53ef\u4ee5\u7ed9\u5b83\u4e2a no \u5c31\u597d\u4e86\uff0c\u5f53\u7136 CICD \u4e0a\u5173\u95ed\uff0c\u9700\u8981\u6d41\u6c34\u7ebf\u4e0a\u628a\u8fd9\u4e2a\u53c2\u6570\u52a0\u4e0a\uff1b \uff082\uff09\u65b0\u589e\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u7684\u547d\u4ee4\u884c\u53c2\u6570 \u4e4b\u524d\u8fd9\u4e2a\u914d\u7f6e\u9879\u53ea\u80fd\u5728 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c 1 \u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff0cRERUN >= RECORD_FAILED_CASE\u3002\n;1.\u5173\u95ed\u5f55\u5c4f\uff1aRECORD_FAILED_CASE > RERUN\n;2.\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1aRECORD_FAILED_CASE = 0\nRECORD_FAILED_CASE = 1\n \u73b0\u5728\u5c06\u5f00\u53d1\u5230\u547d\u4ee4\u884c\u53c2\u6570\u3002 youqu manage.py run --record_failed_case 2\n fix \u4fee\u590d remote \u6267\u884c\u65f6\uff0c\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u65e0\u6cd5\u751f\u6210\u6d4b\u8bd5\u62a5\u544a\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1302023710","title":"1.3.0\uff082023/7/10\uff09","text":"fix \u8fdb\u4e00\u6b65\u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b\u53c2\u8003\uff1a\u914d\u7f6ePython\u6e90\u7684\u51e0\u79cd\u65b9\u6cd5 \u4fee\u590d wayland_autotool \u53d7\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86wayland\u4e0b\u5076\u73b0\u627e\u4e0d\u5230 .Xauthority \u6587\u4ef6\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1292023626","title":"1.2.9\uff082023/6/26\uff09","text":"fix \u4f18\u5316\u8fdc\u7a0b\u6267\u884c remote \u7684\u53c2\u6570\u76f4\u63a5\u4f20\u7ed9\u8fdc\u7a0b\u673a\u5668\u7684 run \u547d\u4ee4\uff0c\u4e0d\u7528\u518d\u5355\u72ec\u5904\u7406\u8fdc\u7a0b\u6267\u884c\u7684\u53c2\u6570\u903b\u8f91\uff0c\u540e\u7eed\u4e13\u6ce8\u4e8e\u672c\u5730\u6267\u884c\u529f\u80fd\u5f00\u53d1\uff0c\u8fdc\u7a0b\u6267\u884c\u81ea\u52a8\u9002\u7528\uff1b env.sh \u79fb\u9664 pyyaml \u5b89\u88c5\uff0c\u7531\u5b50\u9879\u76ee\u5728 requirement.txt \u91cc\u9762\u5b9a\u4e49\uff0c\u6846\u67b6\u81ea\u52a8\u52a0\u8f7d\uff1b \u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b "},{"location":"RELEASE/#128202369","title":"1.2.8\uff082023/6/9\uff09","text":"fix \u4fee\u590d\u4e86 pypi \u5b89\u88c5 numpy \u5b58\u5728\u7cfb\u7edf\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#127202368","title":"1.2.7\uff082023/6/8\uff09","text":"fix env.sh \u4e2d\u5b89\u88c5 Python \u5305\u672a\u6307\u5b9a\u7248\u672c\u65f6\uff0c\u65e5\u5fd7\u8f93\u51fa\u5b89\u88c5\u7684\u7248\u672c\uff1b pdocr-rpc 2.0.1\nallure-custom 1.2.1\nfunnylog 1.1.3\n \u4fee\u590d -f \u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u62a5\u9519\u7684\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#126202367","title":"1.2.6\uff082023/6/7\uff09","text":"fix \u4fee\u590d wayland \u4e0a\u8c03\u7528\u9f20\u6807\u4e2d\u952e\u3001\u53f3\u952e\u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b \u4fee\u590d pubilic/dde_desktop_public_widget \u91cc\u9762\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u5b9a\u4f4d\u684c\u9762\u6587\u4ef6\u7684\u65b9\u6cd5\uff0c\u5750\u6807\u6ca1\u6709\u62c6\u5305\u7684\u95ee\u9898\uff1b \u4f18\u5316\u4e86\u7b49\u5f85\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b pycreeze \u7248\u672c\u5347\u7ea7\u5230 0.1.29\uff0c\u5bfc\u81f4\u4e0e pyautogui 0.9.53 \u4e0d\u517c\u5bb9\uff0cenv.sh \u91cc\u9762\u589e\u52a0\u6307\u5b9a pycreeze \u7248\u672c\u4e3a 0.1.28\uff1b "},{"location":"RELEASE/#1252023516","title":"1.2.5\uff082023/5/16\uff09","text":"new --app \u53c2\u6570\u540e\u9762\u65b0\u589e\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u76ee\u524d\u652f\u6301\u4e09\u79cd\u53c2\u6570\u4f20\u5165\u65b9\u5f0f\uff1a ~$: youqu run -a deepin-music\n~$: youqu run -a autotest_deepin_music\n~$: youqu run -a apps/autotest_deepin_music\n \u200b \u540e\u4e24\u79cd\u5165\u53c2\u65b9\u5f0f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\u3002 remote \u8fdc\u7a0b\u6267\u884c\u65b0\u589e\u4ece\u547d\u4ee4\u884c\u4f20\u5165\u6d4b\u8bd5\u673a\u4fe1\u606f\uff0c\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679c password \u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6 setting/remote.ini \u4e2d CLIENT_PASSWORD \u7684\u503c,\u6bd4\u5982\uff1auos@10.8.13.33:1 \u6216 uos@10.8.13.33 \uff1b python3 manage.py remote -c uos@10.8.13.33/uos@10.8.13.34\npython3 manage.py remote -c uos@10.8.13.33:1/uos@10.8.13.34:2\n fix \u65e5\u5fd7\u6a21\u5757\u4fee\u6539\u4e3a\u51fd\u6570\u6267\u884c\u4e4b\u524d\u6253\u5370\u65e5\u5fd7\uff1b \u65e5\u5fd7\u6a21\u5757\u589e\u52a0\u767d\u540d\u5355\uff0c\u901a\u8fc7\u7c7b\u540d\u5f00\u5934\uff0c\u7ed3\u675f\uff0c\u5305\u542b\u7b49\u5173\u952e\u5b57\u63a7\u5236\u9700\u8981\u6253\u5370\u7684\u51fd\u6570\u65e5\u5fd7\uff1b \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5982\u679c\u4f20\u5165\u4e86 app_name \u53ea\u4f1a\u5c06 apps \u76ee\u5f55\u4e0b app_name \u7684\u76ee\u5f55\u53d1\u9001\u5230\u6d4b\u8bd5\u673a\uff1b env.sh \u79fb\u9664 python3-dev\uff1b \u4fee\u590d Wayland \u4e0b env.sh \u73af\u5883\u5b89\u88c5\u5931\u8d25\u7684\u95ee\u9898\uff0c\u4f18\u5316\u4e86 deb \u4f9d\u8d56\u5b89\u88c5\u7684\u903b\u8f91\uff1b \u5c06 env.sh \u5237\u65b0\u6e90\u7684\u65e5\u5fd7\u5728\u7ec8\u7aef\u663e\u793a\uff0c\u89e3\u51b3\u5728 CI \u73af\u5883\u4e0b\uff0c\u957f\u65f6\u95f4\u4e0d\u8f93\u51fa\u65e5\u5fd7\u8fde\u63a5\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d1060 \u534e\u4e3a\u673a\u578b\u5b89\u88c5\u952e\u9f20\u5de5\u5177\u65f6\u4f9d\u8d56\u4e0d\u517c\u5bb9\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1242023227","title":"1.2.4\uff082023/2/27\uff09","text":"fix \u4fee\u6539 CURRENT \u6587\u4ef6\uff1b "},{"location":"RELEASE/#1232023227","title":"1.2.3\uff082023/2/27\uff09","text":"new pylint.sh \u652f\u6301\u901a\u8fc7\u4f4d\u7f6e\u53c2\u6570\u4f20\u5165\u6587\u4ef6\u8def\u5f84\uff1abash pylint.sh apps/autotest_deepin_music,\u597d\u5904\u662f\u53c2\u6570\u8def\u5f84\u53ef\u4ee5\u5728\u7ec8\u7aef\u8865\u5168\uff1b \u65b0\u589e\u7cfb\u7edf\u547d\u4ee4 youqu-pylint \uff0c\u7528\u4e8e\u9759\u6001\u4ee3\u7801\u626b\u63cf\uff0c\u4f7f\u7528\u65b9\u6cd5: youqu-pylint apps/autotest_deepin_music\uff1b \u7531\u4e8e\u7cfb\u7edf\u4e00\u4e9b dbus \u63a5\u53e3\u6539\u53d8\uff0c\u516c\u5171\u5e93\u4e2d\u7684 dbus \u65b9\u6cd5\u5c06\u4e0d\u518d\u7ef4\u62a4\uff0c\u7531\u5b50\u9879\u76ee\u5728 other_widget.py \u91cc\u9762\u8fdb\u884c\u7ef4\u62a4\uff1b fix \u4fee\u590d ssh \u73af\u5883\u4e0b\u8fd0\u884c\u63d0\u793a \u201c\u65e0\u6cd5\u8fde\u63a5\u201d \u7684\u95ee\u9898\uff1b \u4fee\u590d\u8fd0\u884c\u65f6\u7a0b\u5e8f\u9000\u51fa\uff0c\u4e0d\u8f93\u51fa\u5f02\u5e38\u65e5\u5fd7\u7684\u95ee\u9898\uff1b \u4fee\u590dyouqu remote xxx \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5728\u670d\u52a1\u7aef Ctrl + C \u65e0\u6cd5\u505c\u6b62\u7a0b\u5e8f\u8fd0\u884c\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#122202328","title":"1.2.2\uff082023/2/8\uff09","text":"new \u65b0\u589e\u6c14\u6ce1\u7c7b\u56fe\u50cf\u8bc6\u522b\u65b9\u6848\uff1bimage_utils.py::ImageUtil::get_during\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u533a\u57df\u8bc6\u522b\uff0c\u4f20\u5165 [x, y, w, h]\uff0cx: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u76ee\u6807\u56fe\u7247\uff0c\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\uff1b env.sh \u79fb\u9664 pypinyin; \u4f18\u5316\u6267\u884c env.sh \u65f6\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b manage.py \u79fb\u9664\u4e86\u53c2\u6570 session_timeout \uff0c\u6846\u67b6\u6839\u636e\u5168\u5c40\u7684 timeout \u4ee5\u53ca\u7528\u4f8b\u81ea\u5b9a\u4e49\u7684 timeout \u81ea\u52a8\u8ba1\u7b97\u51fa sessiontimeout \u7684\u503c\uff1b \u65b0\u589e ocr \u670d\u52a1\u5668\u94fe\u63a5\u91cd\u8bd5\uff0c\u9ed8\u8ba4\u91cd\u8bd51\u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u53c2\u6570\uff1b fix \u4fee\u590d\u4e86\u4e00\u4e9b pylint \u626b\u63cf\u7684\u4ee3\u7801\u98ce\u683c\u95ee\u9898\uff1b \u91cd\u65b0\u8bbe\u8ba1\u4e86\u6d4b\u8bd5\u62a5\u544a\u4e3b\u9898\uff1b "},{"location":"RELEASE/#121202316","title":"1.2.1\uff082023/1/6\uff09","text":"new \u652f\u6301\u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6267\u884c\u7528\u4f8b\uff1b\u53ef\u5c06python3 manage.py \u66ff\u6362\u4e3a youqu \uff1a youqu run -a deepin-music -k 001\n RPC \u670d\u52a1 IP \u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u6307\u5b9a\u4e0d\u540c\u7684\u7aef\u53e3\uff1b \u5728\u7ebf\u6587\u6863\u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u539f\u6765\u7684\u5730\u5740 10.8.10.215 \u5c06\u4e0d\u5728\u4f7f\u7528\uff1b fix \u4fee\u590d --count \u53c2\u6570\u53ef\u80fd\u51fa\u73b0\u4e0e\u5176\u4ed6\u6846\u67b6\u7684\u5de5\u7a0b\u4f9d\u8d56\u5b58\u5728\u51b2\u7a81\uff0c\u62a5\u9519\u91cd\u590d\u6ce8\u518c\u7684\u95ee\u9898\uff1b \u4fee\u590d CI \u73af\u5883\u4e0b\u591a\u4e2a\u5de5\u7a0b\u5b58\u5728 Python \u73af\u5883\u53d8\u91cf\u6307\u5411\u9519\u8bef\uff0c\u5bfc\u5305\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u5355\u72ec\u8fd0\u884c\u65b9\u6cd5\u65f6\u65e0\u65e5\u5fd7\u8f93\u51fa\u7684 Bug\uff1b "},{"location":"RELEASE/#12020221230","title":"1.2.0\uff082022/12/30\uff09","text":"1.1.4 \u7248\u672c\u9002\u914d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e14\u65b0\u589e\u4e86\u8f83\u591a\u65b0\u7279\u6027\uff0c\u6211\u4eec\u8ba1\u5212\u4f7f\u7528 1.1.4 \u7248\u672c\u8fd0\u884c\u4e00\u6bb5\u65f6\u95f4\uff0c1.2.0 \u7248\u672c\u5c06\u4fee\u590d\u671f\u95f4\u51fa\u73b0\u7684 Bug\uff0c\u7136\u540e\u4f5c\u4e3a\u7a33\u5b9a\u7248\u672c\u53d1\u5e03\u3002 new \u4fee\u6539\u5de5\u7a0b\u540d\u79f0\u4e3a youqu\uff1b \u5c06 sphinx \u6587\u6863\u5de5\u7a0b\u8fc1\u79fb\u5230\u5355\u72ec\u7684\u4ed3\u5e93\uff1b fix \u4fee\u590d startapp \u521b\u5efa\u5de5\u7a0b\u65f6\u5b58\u5728\u5de5\u7a0b\u540d\u79f0\u65f6\u65e0\u6cd5\u7ee7\u7eed\u521b\u5efa\uff1b \u4fee\u590d\u4e86 OCR \u670d\u52a1\u5728\u5e76\u53d1\u65f6\u53ef\u80fd\u51fa\u73b0\u65e0\u6cd5\u8fd4\u56de\u7ed3\u679c\u7684\u95ee\u9898\uff0c\u63d0\u5347 OCR \u670d\u52a1\u9ad8\u5e76\u53d1\u7a33\u5b9a\u6027\uff1b \u4fee\u590d PMS \u540c\u6b65\u6807\u7b7e\u5230 CSV \u6587\u4ef6\u4e0d\u652f\u6301\u7528\u4f8b\u5e93\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11420221214","title":"1.1.4\uff082022/12/14\uff09","text":"new \u65b0\u589e startapp \u5b50\u547d\u4ee4\u521b\u5efa\u5b50\u9879\u76ee\u5de5\u7a0b\u6a21\u677f: python3 manage.py startapp autotest_deepin_xxx \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u91cd\u590d\u6267\u884c\u6b21\u6570\uff1b \u53bb\u6389\u6279\u91cf\u6267\u884c\u524d\u6536\u96c6\u7528\u4f8b\u7684\u6b65\u9aa4\uff1b \u589e\u52a0\u5f00\u59cb\u6267\u884c\u65f6\u6253\u5370\u4e00\u4e9b\u6267\u884c\u53c2\u6570\uff0c\u5982\uff1a \u7528\u4f8b\u6536\u96c6\u6570\u91cf: 99\n\u5931\u8d25\u91cd\u8dd1\u6b21\u6570: 1\n\u6700\u5927\u5931\u8d25\u6b21\u6570: 49\n\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4: 200.0s (03\u520620\u79d2)\n\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4: 11880s (3\u5c0f\u65f618\u52060\u79d2)\n \u5b9a\u5236\u4fee\u6539allure\u62a5\u544alogo\u3001title\u3001\u9ed8\u8ba4\u8bed\u8a00\uff1b manage.py \u6267\u884c\u5f00\u59cb\u65f6\u6253\u5370 logo \u548c\u5f53\u524d\u7248\u672c\uff1a \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u255a\u2588\u2588\u2557 \u2588\u2588\u2554\u255d \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2584\u2584 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2580\u2580\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u2584\u2588 \u2584\u2588 \u2588 \u2588 \u2588 \u2584 \u2588 \u2584 \u2580\u2580\u2588 \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\uff1b \u88c5\u9970\u5668\u65b9\u6cd5\u6307\u5b9a\u6b21\u6570\uff1b @pytest.mark.count(2)\ndef test_music_001():\npass\n \u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u6b21\u6570\uff1b python3 manage.py run -a deepin-music -k 001 --count 2\n \u200b image_utils \u589e\u52a0\u51fd\u6570 save_temporary_picture\uff0c\u652f\u6301\u6307\u5b9a\u5c4f\u5e55\u533a\u57df\u622a\u56fe\u5e76\u8fd4\u56de\u56fe\u7247\u5b58\u653e\u7684\u672c\u5730\u8def\u5f84\uff0c\u540e\u7eed\u4f7f\u7528 assert_image_exist \u8fdb\u884c\u65ad\u8a00 Python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(x, y, width, height) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) button_center \u65b0\u589e btn_size \u83b7\u53d6\u63a7\u4ef6\u5de6\u4e0a\u89d2\u5750\u6807\u53ca\u957f\u5bbd\uff0c\u7528\u4e8e\u52a8\u6001\u7684\u622a\u53d6\u5143\u7d20\u7684\u56fe\u7247\uff0c\u53ef\u7528\u4e8e\u5b9a\u4f4d\u65ad\u8a00 python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u6240\u6709\u97f3\u4e50\u6309\u94ae\")) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) allure \u62a5\u544a\u4e2d\u5b9a\u4f4d\u95ee\u9898\u9664\u4e86\u65e5\u5fd7\u3001\u622a\u56fe\u3001\u5f55\u5c4f\u5916\uff0c\u8c03\u7528\u7684\u51fd\u6570\u589e\u52a0\u4e86 step \u6b65\u9aa4\u5c55\u793a\uff1b env.sh \u65b0\u589e\u5b89\u88c5\u5b50\u9879\u76ee Python \u4e09\u65b9\u4f9d\u8d56\uff0c\u5728\u5b50\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u5199 requirement.txt \u6587\u4ef6\uff0cenv.sh \u4f1a\u81ea\u52a8\u52a0\u8f7d\uff1b ocr \u8bc6\u522b\u65b0\u589e\u652f\u6301\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\u8fdb\u884c\u6587\u5b57\u8bc6\u522b\uff0c\u51cf\u5c11\u56e0\u5168\u5c4f\u8bc6\u522b\u65f6\uff0c\u5176\u4ed6\u6587\u5b57\u7684\u5e72\u6270 Python # \u65ad\u8a00\u97f3\u4e50\u7684\u5220\u9664\u5f39\u7a97\u4e2d\uff0c\u5305\u542b\u4e86\u201c\u786e\u8ba4\u201d\u7684\u6587\u5b57 self.assert_ocr_exist(\"\u786e\u8ba4\", picture_abspath=DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u5220\u9664\u5f39\u7a97\"))) \u65ad\u8a00\u51fd\u6570\u7684\u8c03\u7528\u4e5f\u4f1a\u81ea\u52a8\u6253\u5370\u65e5\u5fd7; env.sh \u65b0\u589e\u88c1\u526a\u4f9d\u8d56\u7684\u65b9\u6848\uff1b fix \u4fee\u590d Jenkins \u73af\u5883\u4e0b\uff0c apps \u76ee\u5f55\u4e0b\u5b50\u9879\u76ee\u5b58\u5728 auotest_deepin_xxx@tmp \u76ee\u5f55\uff0c\u5728\u4f20\u5165 app_name \u540e\u65e0\u6cd5\u6267\u884c\u7528\u4f8b\u7684\u95ee\u9898\uff1b \u4fee\u590d\u81ea\u52a8\u751f\u6210 case_list.csv \u6587\u4ef6\u65f6\uff0c\u7528\u4f8b\u987a\u5e8f\u88ab\u8c03\u6574\u7684\u95ee\u9898\uff1b env.sh \u73af\u5883\u5b89\u88c5\u79fb\u9664 git \u548c curl\uff1b \u4fee\u590d\u7528\u4f8b\u5728 setup \u9636\u6bb5\u62a5\u9519\u540e\uff0c\u672a\u5199\u5165 ci_result.json \u7684\u95ee\u9898\uff1b \u79fb\u9664 uos_ci.py\uff1b "},{"location":"RELEASE/#11320221028","title":"1.1.3\uff082022/10/28\uff09","text":"new \u65b0\u589e\u56fe\u50cf\u65ad\u8a00\u6210\u529f\u8f93\u51fa\u5339\u914d\u5ea6\uff1b \u65b0\u589e\u73af\u5883\u5b89\u88c5 yaml \u4f9d\u8d56\uff1b \u65b0\u589e\u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6570\u636e\u56de\u586b\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b \u65b0\u589e\u6d4b\u8bd5\u7ed3\u679c\u8868\u60c5\u663e\u793a\uff0c\u5e76\u4f18\u5316\u4e86\u65e5\u5fd7\u7684\u6392\u7248\uff1b \u65b0\u589e --top {number} \u7528\u4e8e\u8bb0\u5f55\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0c\u65e5\u5fd7\u751f\u6210\u5230 report/logs/top.log\uff1b fix \u4fee\u590d\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4f46\u7ec8\u7aef\u6ca1\u6709\u9519\u8bef\u65e5\u5fd7\u8f93\u51fa\u7684\u95ee\u9898\uff1b \u4fee\u6539\u5931\u8d25\u7528\u4f8b\u56de\u6eaf\u65e5\u5fd7\u4e3a\u8be6\u7ec6\u7ea7\u522b\uff1b \u4fee\u590d\u4e86\u6267\u884c\u8fdb\u5ea6\u672a\u8ba1\u7b97\u8df3\u8fc7\u7528\u4f8b\u7684\u95ee\u9898\uff0c\u5e76\u4f18\u5316\u4e86\u8fdb\u5ea6\u83b7\u53d6\u7684\u7b97\u6cd5\uff1b \u4fee\u590d env.sh \u5728 V23 \u73af\u5883\u4e0b\u5b89\u88c5\u65e0\u6cd5\u8bfb\u53d6\u5bc6\u7801\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 pms \u6d4b\u8bd5\u5957\u6267\u884c\u6216\u6d4b\u8bd5\u5355\u6267\u884c\u65f6\uff0c\u7528\u4f8bID\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b env.sh \u91cc\u9762 hub.deepin.com \u66f4\u6362\u6210 it.uniontech.com\uff1b uos_ci.py \u6d4b\u8bd5\u7ed3\u679c\u7edf\u8ba1\u65f6\uff0c\u603b\u6570\u5254\u9664 skip \u7684\u6570\u91cf "},{"location":"RELEASE/#11220220921","title":"1.1.2\uff082022/09/21\uff09","text":"new \u5728\u6ca1\u6709\u5b89\u88c5 dogtail \u7684\u60c5\u51b5\u4e0b\uff0c\u4e5f\u80fd\u4f7f\u7528 sniff \u5de5\u5177\uff1b fix \u4fee\u590d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e2d\u6ca1\u6709\u5b89\u88c5 AT \u73af\u5883\u6267\u884c uos_ci.py \u62a5\u9519\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11120220919","title":"1.1.1\uff082022/09/19\uff09","text":"new \u65b0\u589e\u6267\u884c\u8fdb\u5ea6\u663e\u793a\uff0c\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u65f6\u65e5\u5fd7\u8f93\u51fa\u5f53\u524d\u8fdb\u5ea6\uff1a[\u5f53\u524d\u6307\u5b9a\u7b2c\u51e0\u6761/\u7528\u4f8b\u603b\u6570]\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u7528\u4f8b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\u6240\u6709\u5931\u8d25\u7528\u4f8b\u7684\u5217\u8868\uff1b \u5173\u95ed\u7ec8\u7aef\u8f93\u51fa\u6355\u83b7\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u65e5\u5fd7\u5feb\u7167\uff1b \u4f18\u5316\u7ec8\u7aef\u8f93\u51fa\u5931\u8d25\u4fe1\u606f\u5197\u957f\u4e3a\u7b80\u8981\u4fe1\u606f\u8f93\u51fa\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u663e\u793a 10 \u4e2a\u6267\u884c\u6700\u6162\u7684\u7528\u4f8b\u5217\u8868\uff0c\u5e76\u8be6\u7ec6\u5217\u51fa\u5404\u4e2a\u9636\u6bb5\u7684\u8017\u65f6\uff1b \u5931\u8d25\u91cd\u8dd1\u7528\u4f8b\u91cd\u8dd1\u4e4b\u524d\u5ef6\u8fdf 1 \u79d2\uff1b \u65b0\u589e\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4ecd\u7136\u5f3a\u5236\u6267\u884c\uff1b \u7528\u4f8b\u6536\u96c6\u65f6\u4ec5\u5728 apps \u76ee\u5f55\u4e0b\u8fdb\u884c\uff0c\u5ffd\u7565 src,setting,public \u76ee\u5f55\uff1b \u65b0\u589e allure \u62a5\u544a\u5907\u4efd\u529f\u80fd\uff0c\u9ed8\u8ba4\u5907\u4efd\u81f3 allure_back \u76ee\u5f55\u4e0b\uff1b manage.py\u65b0\u589e\u53c2\u6570 --lastfailed \u7528\u4e8e\u53ea\u8dd1\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\u7684\u529f\u80fd\uff1b fix \u4fee\u590d\u4e86\u5728\u6ca1\u6709\u6307\u5b9a\u5e94\u7528\u540d\u79f0\u6267\u884c\u65f6\uff0cxml \u62a5\u544a\u751f\u6210\u8def\u5f84\u5f02\u5e38\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 uos_ci.py \u4f20\u5165 timeout \u548c session_timeout \u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11020220916","title":"1.1.0\uff082022/09/16\uff09","text":"new \u65b0\u589ePMS\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u652f\u6301\u591a\u79cd\u6570\u636e\u56de\u586b\u6a21\u5f0f\uff1b \u4f18\u5316\u4e86\u901a\u8fc7\u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u65f6PMS \u722c\u866b\u7684\u6027\u80fd\uff1b \u65b0\u589e .gitmodules \u6587\u4ef6\uff0c\u7528\u4e8e\u6807\u8bb0\u6240\u6709\u5b50\u9879\u76ee\uff0c\u65b9\u4fbf\u7edf\u4e00\u62c9\u53d6\u4ee3\u7801\uff1b env.sh \u9002\u914d\u793e\u533a\u7248\u4e0a\u5b89\u88c5\u81ea\u52a8\u5316\u73af\u5883\uff1b \u589e\u52a0\u6267\u884c\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u9519\u8bef\u7684\u529f\u80fd\uff1b README.md \u589e\u52a0 Wayland \u4e0b\u4f7f\u7528\u3001\u6d4b\u8bd5\u62a5\u544a\u67e5\u770b\u3001\u5e38\u89c1\u95ee\u9898\u7b49\u7684\u6587\u6863\u8bf4\u660e\uff1b \u589e\u52a0\u4e86\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u5bf9 setup\u3001call\u3001teardown \u8fdb\u884c\u65e5\u5fd7\u5206\u6bb5\uff1b fix \u4fee\u590d\u4e86 \u786e\u8ba4\u4fee\u590d \u5217\u6ca1\u5199\u8868\u5934\uff0c\u4f46\u5199\u4e86 fixed-xxx \u6807\u7b7e\uff0c\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u540c\u4e00\u5e94\u7528\u5185\u591a\u4e2a csv \u6587\u4ef6\u4e2d \u786e\u8ba4\u4fee\u590d \u5217\u6709\u7684\u5199\u4e86\uff0c\u6709\u7684\u6ca1\u5199\uff0c\u53ef\u80fd\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 INFO \u65e5\u5fd7\uff0c\u663e\u793a\u4e3a DEBUG \u7684\u95ee\u9898\uff1b\u4fee\u590d\u4e86\u90e8\u5206\u673a\u5668\u4e0a INFO \u65e5\u5fd7\u5185\u5bb9\u663e\u793a\u4e3a\u7ea2\u8272\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\u770b\u4e0d\u5230\u8be6\u7ec6\u4fe1\u606f\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10220220822","title":"1.0.2\uff082022/08/22\uff09","text":"new \u79fb\u9664 loguru\uff0c\u66ff\u6362\u4e3a logging\uff0c\u63a5\u53e3\u4fdd\u6301\u4e0d\u53d8\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u53d7\u5f71\u54cd\uff1b \u9ed8\u8ba4\u5f00\u542f coredump\uff1b fix \u4fee\u590d\u4e86\u4e09\u65b9\u5e93 loguru \u5076\u73b0\u5f02\u5e38\uff0c\u5bfc\u81f4\u7a0b\u5e8f\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7b2c\u4e00\u6b21\u5931\u8d25\u4e0d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10120220812","title":"1.0.1\uff082022/08/12\uff09","text":"new \u65b0\u589e RELEASE.md \u6587\u4ef6\uff0c\u7528\u4e8e\u8bb0\u5f55\u5386\u53f2\u53d1\u5e03\u7248\u672c\u7684\u66f4\u65b0\u5185\u5bb9\uff1b \u517c\u5bb9 Wayland \u6a21\u5f0f\u4e0b\u6267\u884c\u7528\u4f8b\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u7528\u7ba1\u5f53\u524d\u6d4b\u8bd5\u673a\u6267\u884c\u73af\u5883\uff0c\u6846\u67b6\u4f1a\u81ea\u52a8\u6839\u636e\u5f53\u524d\u73af\u5883\u8d70\u4e0d\u540c\u7684\u4ee3\u7801\u903b\u8f91\uff1b \u7531\u4e8e\u9700\u8981\u4fee\u6539 dogtail \u6e90\u4ee3\u7801\uff0c\u56e0\u6b64\u5c06\u4fee\u6539\u540e\u7684\u6e90\u7801\u653e\u5165\u5230\u6838\u5fc3\u5e93\u91cc\u9762 src/depends/dogtail \u540e\u7eed\u7248\u672c\u5c06\u4e0d\u9700\u8981\u5728\u7cfb\u7edf\u4e2d\u5b89\u88c5dogtail\uff1b \u5982\u679c\u5e94\u7528\u5e93\u540c\u6837\u4f7f\u7528\u4e86\u7cfb\u7edf\u5b89\u88c5\u7684 dogtail \u53ef\u80fd\u4f1a\u62a5\u9519\uff0c\u89e3\u51b3\u65b9\u6848\u662f\u5c06\u4ee3\u7801\u4e2d\u7684 import dogtail \u4fee\u6539\u4e3a from src.depends import dogtail ; fix \u91cd\u8dd1\u5931\u8d25\u4e4b\u540e\u624d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff0c\u4fee\u6539\u4e3a\u5931\u8d25\u4e4b\u540e\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":"# Attribution \uff1achengdu Test Team\n# Date \uff1a2021/08/20\n \u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d \u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d \u4ed3\u5e93\u5730\u5740\uff1ahttps://gitlabcd.uniontech.com/autotest/cd-desktop-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u65b9\u6848\u6982\u8ff0","text":"\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u667a\u80fd\u8bc6\u522b\u5e94\u7528\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u7528\u4e8e\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u64cd\u4f5c\u8fc7\u7a0b\u4e2d\u7684\u5143\u7d20\u5b9a\u4f4d\u4ee5\u53ca\u5224\u65ad\u7ed3\u679c\u65f6\u7684\u65ad\u8a00\u5904\u7406\uff1b\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\uff0c\u6d4b\u8bd5\u673a\u4e0a\u7684\u753b\u9762\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u5230\u670d\u52a1\u5668\u4e0a\uff0c\u670d\u52a1\u5668\u5bf9\u89c6\u9891\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\u540e\uff0c\u670d\u52a1\u5668\u667a\u80fd\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\u6210\u529f\uff0c\u7136\u540e\u5bf9\u6d4b\u8bd5\u673a\u4e0b\u53d1\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\uff0c\u6d4b\u8bd5\u673a\u63a5\u53d7\u5e76\u6267\u884c\u4e0b\u4e00\u6b65\u64cd\u4f5c\u3002 \u670d\u52a1\u5668\u4e0e\u6d4b\u8bd5\u673a\u4e4b\u95f4\u7684\u94fe\u63a5\uff1a \u670d\u52a1\u5668\u901a\u8fc7 USB \u4e32\u53e3\u8bbe\u5907\uff08USB-HID \u534f\u8bae\uff09\u6a21\u62df\u9f20\u6807\u952e\u76d8\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u64cd\u4f5c\u3002 \u901a\u8fc7\u89c6\u9891\u91c7\u96c6\u8bbe\u5907\u6355\u83b7\u6d4b\u8bd5\u673a\u7684\u5b9e\u65f6\u753b\u9762\u4f20\u8f93\u7ed9\u670d\u52a1\u5668\u3002 \u670d\u52a1\u5668\u5bf9\u91c7\u96c6\u7684\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\uff0c\u8bc6\u522b\u5176\u4e2d\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5e76\u8fd4\u56de\u5143\u7d20\u63a7\u4ef6\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\uff0c\u670d\u52a1\u5668\u901a\u8fc7\u667a\u80fd\u5316\u5206\u6790\uff0c\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e00\u81f4\u5c06\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\u901a\u8fc7\u4e32\u53e3\u6a21\u62df\u952e\u9f20\u4fe1\u53f7\u53d1\u9001\u7ed9\u6d4b\u8bd5\u673a\uff1b\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e0d\u4e00\u81f4\u5c06\u4f1a\u8fdb\u5165\u4e2d\u65ad\u5904\u7406\u53ca\u5f02\u5e38\u7ed3\u679c\u8f93\u51fa\uff0c\u7ee7\u7eed\u6267\u884c\u540e\u7eed\u573a\u666f\uff0c\u76f4\u81f3\u6240\u6709\u7528\u4f8b\u6d4b\u8bd5\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u6df1\u5ea6\u5b66\u4e60\u73af\u5883\u642d\u5efa","text":"\u6a21\u578b\u8bad\u7ec3\u4e3b\u8981\u5bf9 GPU \u6709\u8981\u6c42\uff0c\u8bad\u7ec3\u6a21\u578b\u7684\u673a\u5668\u663e\u5b58\u4e0d\u4f4e\u4e8e 6G\uff0c\u5176\u4ed6\u914d\u7f6e\u65e0\u7279\u6b8a\u8981\u6c42\u3002 \u63a8\u8350\u6027\u4ef7\u6bd4\u8f83\u9ad8\u914d\u7f6e \u64cd\u4f5c\u7cfb\u7edf: UnionTech OS Desktop 20 Professional Linux version 4.19.0-desktop-amd64 (deepin@deepin-PC) (Uos 8.3.0.3-3+rebuild) \u5904\u7406\u5668: Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz (\u516b\u6838 / \u5341\u516d\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460M-HDV(RD)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))/8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: TU116 [GeForce GTX 1660]\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u865a\u62df\u73af\u5883\u5b89\u88c5","text":"cd ~\nwget -c https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh\nbash Miniconda3-latest-Linux-x86_64.sh\n \u4e00\u8def\u56de\u8f66 \u7b2c\u4e00\u6b21\u63d0\u793a\u8f93\u5165 yes/no \uff1a\u8f93\u5165 yes \u7ee7\u7eed\u4e00\u8def\u56de\u8f66 \u7b2c\u4e8c\u6b21\u63d0\u793a\uff1a\u8f93\u5165 no cd ~/miniconda3/bin\nsudo chmod 777 activate\n \u6fc0\u6d3bconda\u73af\u5883 . ./activate\n \u6dfb\u52a0\u516c\u53f8\u5185\u7f51\u6e90 conda config --add channels bioconda\nconda config --add channels conda-forge\n \u5982\u679c\u662f\u5916\u7f51\u6dfb\u52a0\u5916\u7f51\u6e90 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/\n \u5982\u679c\u8981\u5220\u9664\u6e90 conda config --remove-key channels\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"2\u3001\u5b89\u88c5\u4f9d\u8d56","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u521b\u5efa\u865a\u62df\u73af\u5883","text":"conda remove --name mmlab --all # \u79fb\u9664\u6240\u6709\u865a\u62df\u73af\u5883\n conda create -n mmlab python=3.7\n conda activate mmlab\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-pytorch","title":"\uff082\uff09\u5b89\u88c5 Pytorch","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install torch==1.7.0+cu101 torchvision==0.8.1+cu101 torchaudio==0.7.0 -f https://download.pytorch.org/whl/torch_stable.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-mmcv","title":"\uff083\uff09\u5b89\u88c5 MMCV","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install mmcv-full==1.3.3 -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.7.0/index.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"\uff084\uff09\u5b89\u88c5\u663e\u5361\u9a71\u52a8","text":"\u6839\u636e\u4f60\u7684\u663e\u5361\u4e0b\u8f7d\u5bf9\u5e94\u9a71\u52a8\uff0c\u6bd4\u5982\u6211\u7684\u663e\u5361\u4e3a GTX1660\uff0c\u9a71\u52a8\u7248\u672c\u4e3a 430\uff0c\u9a71\u52a8\u4e0b\u8f7d\u5730\u5740\uff1ahttps://www.nvidia.cn/Download/Find.aspx?lang=cn CTRL+ALT+F2 \u8fdb\u5165tty\n \u7981\u7528 nouveau \u9a71\u52a8 sudo vim /etc/modprobe.d/blacklist-nouveau.conf\n \u586b\u5165\uff1a blacklist nouveau options nouveau modeset=0\n \u5237\u65b0\u914d\u7f6e\u6587\u4ef6 sudo update-initramfs -u reboot \u91cd\u542f\u540e\u518d\u8fdb\u5165 tty \u5173\u95ed\u56fe\u50cf\u754c\u9762\uff0c\u8f93\u5165\u547d\u4ee4\u5173\u95ed\u56fe\u50cf\u754c\u9762 sudo service lightdm stop\n \u5b89\u88c5\u9a71\u52a8 sudo chmod a+x NVIDIA-Linux-x86_64-430.run\nsudo ./NVIDIA-Linux-x86_64-430.run\n reboot\u91cd\u542f\uff0cnvidia-smi\u67e5\u770b\u5b89\u88c5\u72b6\u6001\u3002\u6ce8\u610f\u770b\u4e0bcuda\u7248\u672c\uff0c10.1\uff0cdriver\u7248\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u6570\u636e\u6807\u6ce8","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u6570\u636e\u6807\u6ce8","text":"\u6807\u6ce8\u4e4b\u524d\u9700\u8981\u5148\u8f6c\u6362\u56fe\u7247\u5927\u5c0f\uff0c\u5e76\u4e14\u4ee5\u6570\u5b57\u547d\u540d\uff0c\u6bcf\u7ec4\u547d\u540d\u9012\u589e"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"\uff081\uff09\u8f6c\u6362\u5927\u5c0f\u5e76\u91cd\u547d\u540d","text":"rename_pic.py import os\nimport sys\nimport cv2\nimport time\nimport getpass\nusername = getpass.getuser()\nsource_path = f\"/home/{username}/Desktop/right_menu\" # \u56fe\u7247\u8def\u5f84\nsource_dest = os.path.join('/'.join(source_path.split(\"/\")[:-1]), 'tmp')\nif not os.path.exists(source_dest):\nos.mkdir(source_dest)\nstart_name = sys.argv[1]\nfile_name_list = list()\nfor file in os.listdir(source_path):\nif file.endswith('.png'):\nfile_name_list.append(file)\nstart_name = int(start_name)\nfor file in file_name_list:\nos.rename(os.path.join(source_path,file), os.path.join(source_path, f\"{str(start_name)}.png\"))\nstart_name += 1\ntime.sleep(1)\nfor file in os.listdir(source_path):\nimage = os.path.join(source_path, str(file))\nsrc = cv2.imread(image)\nresult = cv2.resize(src, (960, 540))\nresizeImage = os.path.join(source_dest, str(file))\nprint(resizeImage)\ncv2.imwrite(str(resizeImage), result)\ncv2.waitKey(0)\ncv2.destroyAllWindows()\ntime.sleep(1)\nos.system(f'rm -rf {source_path}/*')\nos.system(f'mv {source_dest}/* {source_path}')\nos.system(f'rm -rf {source_dest}')\nprint(\"\u4e0b\u4e00\u4e2a\u5e8f\u53f7\uff1a\", start_name)\n \u6839\u636e\u7ec8\u7aef\u8f93\u51fa\u7684\u4e0b\u4e00\u4e2a\u5e8f\u53f7\u7684\u63d0\u793a\uff0c\u6267\u884c Python \u6587\u4ef6\u7684\u65f6\u5019\u4f20\u53c2\u3002 python rename_pic.py 249\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"\uff082\uff09\u5de5\u5177\u6807\u6ce8","text":"\u4f7f\u7528\u5de5\u5177 labelImg \u6807\u6ce8 sudo pip3 install PyQt5==5.13\nsudo pip3 install labelImg\n \u7ec8\u7aef\u76f4\u63a5\u8f93\u5165 labelImg\uff0c\u56de\u8f66 \u6807\u6ce8\u6a21\u5f0f\u9009\u62e9\uff1aPascalVOC"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u667a\u80fd\u6807\u6ce8","text":"\u6253\u5f00\u5c4f\u5e55\u5f55\u5236\u8f6f\u4ef6\uff0c\u5f55\u5236\u624b\u52a8\u64cd\u4f5c\u4e00\u6b21\u6d4b\u8bd5\u7528\u4f8b\uff0c\u7136\u540e\u5c06\u5f55\u5236\u7684\u89c6\u9891\u8fdb\u884c\u5206\u5e27\uff0c\u7136\u540e\u5bf9\u6bd4\u524d\u4e24\u5e27\u56fe\u6807\u76f8\u4f3c\u5ea6\uff0c\u5254\u9664\u76f8\u4f3c\u5ea6\u8fc7\u9ad8\u7684\u56fe\u7247\uff0c\u5728\u4fdd\u8bc1\u7d20\u6750\u591a\u6837\u6027\u7684\u524d\u63d0\u4e0b\uff0c\u5254\u9664\u91cd\u590d\u591a\u4f59\u7684\u56fe\u7247\u751f\u6210\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u96c6\uff0c\u7136\u540e\u53d6\u51fa\u63a7\u4ef6\u6a21\u677f\u6570\u636e\u96c6\uff0c\u901a\u8fc7 OpenCV \u6a21\u677f\u5339\u914d\u83b7\u53d6\u63a7\u4ef6\u5728\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u56fe\u7247\u4e2d\u6240\u5728\u7684\u5de6\u4e0a\u3001\u5de6\u4e0b\u3001\u53f3\u4e0a\u3001\u53f3\u4e0b\u56db\u5904\u5750\u6807\uff0c\u4ece\u800c\u6839\u636e\u6a21\u677f\u6570\u636e\u96c6\u751f\u6210\u6807\u6ce8\u6570\u636e\u3002\u53c2\u8003\u76ee\u5f55 AnnotationMaterial"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"\uff081\uff09\u6a21\u677f\u6570\u636e\u96c6\u51c6\u5907","text":"1\u3001\u5728\u754c\u9762\u622a\u53d6\u9700\u8981\u6807\u6ce8\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u653e\u5728\u76ee\u5f55\u4e0b AnnotationMaterial/template/img 2\u3001\u7ef4\u62a4\u63a7\u4ef6\u540d\u4e0e\u5143\u7d20\u63a7\u4ef6\u7684\u952e\u5bf9\uff0c\u4e00\u4e2a\u63a7\u4ef6\u540d\u53ef\u5bf9\u5e94\u591a\u4e2a\u5143\u7d20\u63a7\u4ef6 menu:\n- menu.jpg\n- menu1.jpg\n- menu2.jpg\n- menu3.jpg\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"\uff082\uff09\u7d20\u6750\u96c6\u51c6\u5907","text":"\u5f55\u5236\u89c6\u9891\u6216\u6216\u5c4f\u5e55\u622a\u56fe\u653e\u7f6e\u76ee\u5f55 AnnotationMaterial/source"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u5f00\u59cb\u6807\u6ce8","text":"python3 AnnotationMaterial/main.py\n \u751f\u6210\u7684\u6807\u6ce8\u6570\u636e\u5b58\u653e\u5728 AnnotationMaterial/result"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#mmdetection","title":"\u56db\u3001MMDetection","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1-mmdetection","title":"1\u3001 MMDetection \u4ee3\u7801","text":"MMDetection \u662f\u4e00\u4e2a\u6709\u540d\u7684\u6df1\u5ea6\u5b66\u4e60\u76ee\u6807\u68c0\u6d4b\u5f00\u6e90\u9879\u76ee\uff0c\u4e5f\u662f openMMlab \u7684\u62db\u724c\u9879\u76ee\uff0c\u4e3a\u4ec0\u4e48\u9009\u62e9\u5b83\uff0c\u5c0f\u5b69\u513f\u6ca1\u5a18\u8bf4\u6765\u8bdd\u957f\uff0c\u611f\u5174\u8da3\u53ef\u4ee5\u81ea\u884c\u6df1\u5165\u4e86\u89e3\uff1b \u4f60\u53ef\u4ee5\u76f4\u63a5\u5728 GitHub \u4e0a\u514b\u9686\u4ee3\u7801\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u54b1\u4eec\u4ed3\u5e93\u4e0b Train \u76ee\u5f55\u4e2d\u4ee3\u7801\uff0cTrain \u4e2d\u7684\u4ee3\u7801\u4e5f\u662f\u4ece GitHub \u4e0a\u62c9\u53d6\u7684\uff0c\u4e0d\u8fc7\u6211\u4eec\u6839\u636e\u9879\u76ee\u9700\u8981\u505a\u4e86\u4e00\u4e9b\u4e8c\u6b21\u5f00\u53d1\uff0c\u63a8\u8350\u76f4\u63a5\u4f7f\u7528\u5b83\u3002 \u5982\u679c\u4f60\u60f3\u4ece GitHub \u4e0a\u62c9\uff1a git clone https://github.com/open-mmlab/mmdetection.git\n# \u4e0d\u80fd\u76f4\u63a5\u62c9\u53d6\u4e3b\u5206\u652f\uff0c\u5efa\u8bae\u4f7f\u75282.12\u7248\u672c\uff0c\u4e0d\u540c\u7684\u7248\u672c\u5bf9\u5e94\u7684mmcv\u7248\u672c\u662f\u4e0d\u540c\u7684\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-voc2coco","title":"2\u3001\u62c9\u53d6 voc2coco \u4ee3\u7801","text":"git clone https://github.com/Tony607/voc2coco.git\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-coco","title":"3\u3001\u8f6c\u6362 coco \u6570\u636e\u96c6","text":"\u5c06\u6240\u6709\u7684\u56fe\u7247\u548cxml\u6587\u4ef6\u653e\u5165train2017\uff0c\u4ece\u4e2d\u6311\u9009\u51e0\u7ec4\u653e\u5165val2017\uff08\u6d4b\u8bd5\u96c6\uff09 cd mmdetection/data/coco\npython voc2coco.py train2017 annotations/instances_train2017.json\npython voc2coco.py val2017 annotations/instances_val2017.json\n \u751f\u6210json\u6587\u4ef6"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4_1","title":"4\u3001\u4fee\u6539\u914d\u7f6e","text":"\uff081\uff09\u8bfb\u53d6\u6a21\u578b\u540d\u79f0 import json\nmodule_name = []\nwith open('./instances_train2017.json', \"r+\") as f:\njson_file = f.read()\njson_dict = json.loads(json_file)\nmodule_list = json_dict.get('categories')\nfor module_info in module_list:\nname = module_info.get('name')\nmodule_name.append(name)\nprint(module_name)\nprint(\"module_num:\", len(module_name))\n # \u6ce8\u610f\u5bf9\u6bd4instances_train2017.json\u91cc\u9762\u6a21\u578b\u540d\u79f0\u7684\u987a\u5e8f\uff0c\u4e0eCLASSES\u548ccoco_classes\u91cc\u9762\u7684\u987a\u5e8f\u4fdd\u6301\u4e00\u81f4\u3002\n \uff082\uff09\u4fee\u6539 faster_rcnn_r101_2x_coco.py mmdetection/xianjin/faster_rcnn_r101_2x_coco.py \u4fee\u653946\u884c\uff0cnum_clasess\u7684\u503c\uff0c\u65b0\u589e1\u4e2a\uff0c\u5c31 +1\uff1b \uff083\uff09\u4fee\u6539 coco.py mmdetection/mmdet/datasets/coco.py CLASSES = ()\uff0c\u5728\u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b \uff084\uff09\u4fee\u6539 class_names.py mmdetection/mmdet/core/evaluation/class_names.py coco_classes \u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#5","title":"5\u3001\u7f13\u5b58\u6e05\u7406","text":"\u5220\u9664 mmdetection/build \u76ee\u5f55 python setup.py install\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#6","title":"6\u3001\u8bad\u7ec3\u6a21\u578b","text":"\uff081\uff09\u6307\u5b9a\u81ea\u5df1\u914d\u7f6e\u7684\u8bad\u7ec3\u6a21\u578b\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py --gpus 1\n \uff082\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u6d4b\u8bd5\u96c6\u7ed3\u679c\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py xianjin/epoch_24.pth --show\n \uff083\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u51c6\u786e\u5ea6\uff1b python tools/analysis_tools/analyze_logs.py plot_curve xianjin/20210530_011907.log.json --keys acc\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#7","title":"7\u3001\u5feb\u6377\u64cd\u4f5c","text":"python3 run.py\n \u5c06\u4ee5\u4e0a 4 - 7 \u6b65\u64cd\u4f5c\u6574\u5408\u6210 run.py\uff0c\u4e00\u952e\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u4e94\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\uff1b \u670d\u52a1\u7aef\u4e00\u53f0\uff08\u76ee\u524d\u4ec5\u652f\u6301AMD\u67b6\u6784\uff09\uff1b \u91c7\u96c6\u76d2\u4e00\u4e2a \uff08ACASIS hdmi\u89c6\u9891\u91c7\u96c6\u5361\uff0chttps://item.jd.com/10024310742602.html \uff09\uff1b USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\uff1b USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff1b \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5USB\u5ef6\u957f\u7ebf\uff1b \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u63a8\u8350\u914d\u7f6e","text":"\u6267\u884c\u7528\u4f8b\u7684\u670d\u52a1\u7aef\u5bf9\u914d\u7f6e\u6ca1\u6709\u7279\u6b8a\u8981\u6c42\uff0c\u5982\u679c\u6761\u4ef6\u5141\u8bb8\u914d\u7f6e\u8d8a\u9ad8\uff0c\u8bc6\u522b\u901f\u5ea6\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n \u6d4b\u8bd5\u673a\u4e0a\u4e0d\u6267\u884c\u4efb\u4f55\u811a\u672c\uff0c\u5177\u4f53\u914d\u7f6e\u6839\u636e\u6d4b\u8bd5\u9700\u8981\u51b3\u5b9a\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#usb_mk","title":"\u516d\u3001USB_MK\u4e32\u53e3\u9a71\u52a8\u65b9\u6cd5","text":"\u4f4d\u4e8econtrol_method\u76ee\u5f55\u4e0b\u7684usb_mk.py\u6587\u4ef6 \uff081\uff09\u5217\u51fa\u53ef\u901a\u4fe1\u7684\u7aef\u53e3 python3 -m serial.tools.list_ports -v\n \uff082\uff09\u4fee\u6539\u4e32\u53e3\u7684\u6743\u9650 sudo chmod 777 /dev/ttyACM0\n \uff083\uff09\u5b9e\u4f8b\u5316USB_MK import UsbMk\nusb_mk = UsbMk(\"/dev/ttyACM0\", 9600) # \u8bbe\u5907\u9ed8\u8ba49600\u4e3a\u6ce2\u7279\u7387\uff0c\u63a7\u5236\u4f20\u8f93\u901f\u7387\n \uff084\uff09USB\u4e32\u53e3\u8bbe\u5907\u9ed8\u8ba4\u6ce2\u7279\u7387\u4e3a9600\uff08\u7ecf\u6d4b\u8bd5\u6ce2\u7279\u73879600\u51c6\u786e\u6027\u6700\u597d\uff09\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up() # \u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u6c49\u5b57\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e\n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff083\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff084\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff085\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() # \u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2\n \uff086\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff087\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff088\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e03\u3001\u65b9\u6cd5\u8c03\u7528\u5165\u53c2\u89c4\u5219","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_7","title":"1\u3001\u57fa\u7c7b","text":"class Base:\ndef __init__(self):\nself._obj = image\nself._usb = usb_mk\ndef find_element_by_ai(self, element):\nreturn self._obj.find_element(element)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_6","title":"2\u3001\u5165\u53c2\u8bf4\u660e","text":"\u56fe\u50cf\u8bc6\u522b\u65b9\u6cd5\u5165\u53e3\u4e3a Base \u7c7b\u4e0b\u7684 find_element_by_ai \u3002\u4ec5\u63a5\u53d7\u4e00\u4e2a\u53c2\u6570 element\uff0c\u7c7b\u578b\u4e3a string\u3002 \u53ef\u8bc6\u522b\u7684 string \u683c\u5f0f\uff1a \uff081\uff09\u5927\u56fe\u6807\uff08 \u56fe\u6807\u5927\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\uff0c\u4f8b\uff1a Base().find_element_by_ai(\"window\")\n \uff082\uff09\u5927\u56fe\u6807 / \u5c0f\u56fe\u6807\uff08\u56fe\u6807\u5c0f\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5c0f\u56fe\u6807\uff0c\u4f8b\uff1awindow/search_btn Base().find_element_by_ai(\"window/search_btn\")\n \uff083\uff09\u5927\u56fe\u6807 / OCR\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\u5185\u7684\u6587\u5b57\uff0c\u4f8b\uff1amenu/\u5c5e\u6027 Base().find_element_by_ai(\"menu/\u5c5e\u6027\")\n \uff084\uff09OCR\uff1a\u5168\u5c4f\u8bc6\u522b\u6587\u5b57 Base().find_element_by_ai(\"\u641c\u7d22\")\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516b\u3001\u9690\u85cf\u9f20\u6807","text":"\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u8fc7\u6765\u7684\u89c6\u9891\u6d41\uff0c\u5728\u8bc6\u522b\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u53d7\u5230\u9f20\u6807\u5f71\u54cd\uff0c\u56e0\u6b64\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u9690\u85cf\u9f20\u6807\u3002 \u5c4f\u853d\u9f20\u6807\u5149\u6807\u663e\u793a ```shell script /etc/lightdm/lightdm.conf \u5728`[Seat:*]`\u4e0b\u9762\u6dfb\u52a0\u53c2\u6570\n```shell script\nxserver-command=X -bs -core -nocursor\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e5d\u3001\u667a\u80fd\u81ea\u52a8\u5316\u7684\u610f\u4e49","text":"1\u3001\u6539\u5584 Acessibility \u5b9a\u4f4d\u7684\u7a33\u5b9a\u6027\u95ee\u9898 Acessibility \u5c5e\u6027\u5b9a\u4f4d\u5b58\u5728\u5076\u5c14\u5931\u6548\u7684\u60c5\u51b5 \uff081\uff09\u5f00\u53d1\u5728\u505a\u65b0\u9700\u6c42\u5f00\u53d1\u65f6\u53ef\u80fd\u6d89\u53ca\u5230\u5bf9\u5c5e\u6027\u6807\u7b7e\u7684\u4fee\u6539\u6216\u8005\u5c42\u7ea7\u7684\u8c03\u6574\uff0c\u53ef\u80fd\u9020\u6210\u81ea\u52a8\u5316\u7528\u4f8b\u65e0\u6cd5\u5b9a\u4f4d\u5230\u5143\u7d20\u3002 \u6bd4\u59821040\u9636\u6bb5\uff0c\u97f3\u4e50\u91cd\u6784\u7684\u65f6\u5019\uff0c\u5f00\u53d1\u5bf9\u90e8\u5206\u5c5e\u6027\u548c\u5c42\u7ea7\u505a\u4e86\u4fee\u6539\uff0c\u5bfc\u81f4\u81ea\u52a8\u5316\u7528\u4f8b\u5b9a\u4f4d\u65b9\u6cd580%\u9700\u8981\u4fee\u6539\u3002 \u5f00\u53d1\u65b0\u529f\u80fd\u7684\u65f6\u5019\u5076\u5c14\u4e5f\u4f1a\u5bf9\u5c5e\u6027\u505a\u8c03\u6574\uff0c\u9047\u52305\u6b21\u3002 \uff082\uff09\u76ee\u524d\u4e3b\u8981\u4f7f\u7528Dogtail\u8bc6\u522b\u5e94\u7528Acessibility\u5c5e\u6027\u8fdb\u884c\u5b9a\u4f4d\uff0c\u662f\u83b7\u53d6\u5e94\u7528\u5f53\u524d\u754c\u9762\u7684\u5c5e\u6027tree\uff0c\u5728\u5e94\u7528\u8df3\u8f6c\u540e\uff0cDogtail\u5b58\u5728\u65e0\u6cd5\u53ca\u65f6\u83b7\u53d6\u5f53\u524d\u5c5e\u6027\u5217\u8868\u7684\u60c5\u51b5\u3002 \u591a\u5a92\u4f53\u8c03\u7528\u6587\u7ba1\u7a97\u53e3\u7684\u65f6\u5019\uff0c\u51fa\u73b0\u627e\u4e0d\u5230\u6587\u7ba1\u91cc\u9762\u5143\u7d20\u7684\u60c5\u51b5\uff0c\u76ee\u524d\u51fa\u73b010+\u6b21\u3002 \u5e94\u7528\u8bbe\u7f6e\u9875\u9762\u7684\u5c5e\u6027\u5076\u5c14\u5b58\u5728\u627e\u4e0d\u5230\u7684\u60c5\u51b5\uff0c\u9047\u52305\u6b21\u3002 \uff083\uff09Dogtail\u5de5\u5177\u672c\u8eab\u5b58\u5728\u95ee\u9898\uff0c\u6709\u65f6\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u5019\u5f88\u6162\uff0c\u8ba9\u4eba\u65e0\u6cd5\u63a5\u53d7\uff0c\u76ee\u524d\u51fa\u73b0\u8fc7\u5f88\u591a\u6b21\u3002 \u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u95f4\u6bd4\u5e73\u5e38\u61623\u500d\uff0c\u51fa\u73b04\u6b21\u3002 2\u3001\u89e3\u51b3\u4e86\u4f7f\u7528\u7edd\u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898 \u90e8\u5206\u63a7\u4ef6\u65e0\u6cd5\u6dfb\u52a0 Acessibility \u5c5e\u6027\u4ece\u800c\u4f7f\u7528\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u51fa\u73b0\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898\u3002 \uff081\uff09\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u65b9\u6cd5\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u76ee\u6807\u56fe\u7247\u8d44\u6e90\uff0c\u5728 UI \u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u4f1a\u6d89\u53ca\u5230\u76ee\u6807\u8d44\u6e90\u7684\u66ff\u6362\uff0c\u6bd4\u8f83\u8017\u8d39\u4eba\u529b\u3002 \uff082\uff09\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6cd5\u5bf9\u6bd4\u7cbe\u5ea6\u6bd4\u8f83\u641e\uff0c\u5982\u679cUI \u7684\u53d8\u66f4\u4f1a\u9020\u6210\u65e0\u6cd5\u51c6\u786e\u5b9a\u4f4d\u5230\uff0c\u81ea\u52a8\u5316\u811a\u672c\u5065\u58ee\u6027\u4e0d\u8db3\u3002 3\u3001\u4f7f\u7528\u673a\u5668\u5206\u79bb\uff0c\u89e3\u51b3\u4e86\u81ea\u52a8\u5316\u811a\u672c\u5bf9\u5e94\u7528\u7684\u5f71\u54cd\uff0c\u771f\u5b9e\u8fd8\u539f\u7528\u6237\u7684\u4f7f\u7528\u573a\u666f \u673a\u5668\u5206\u79bb\u7684\u67b6\u6784\u8bbe\u8ba1\uff0c\u4fdd\u8bc1\u4e86\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u73af\u5883\u5b8c\u5168\u7b49\u540c\u4e8e\u7528\u6237\uff0c\u6392\u9664\u6d4b\u8bd5\u811a\u672c\u7684\u5f71\u54cd\u3002 \uff081\uff09\u76ee\u524d\u7684\u529f\u80fd\u81ea\u52a8\u5316\u662f\u5728\u6d4b\u8bd5\u673a\u4e0a\u76f4\u63a5\u8fd0\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\uff0c\u52a0\u4e0a\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u6211\u4eec\u6dfb\u52a0\u4e86\u4e00\u4e9b\u8fdb\u7a0b\u76d1\u63a7\u3001\u89c6\u9891\u5f55\u5236\u7b49\u529f\u80fd\uff0c\u81ea\u52a8\u5316\u811a\u672c\u672c\u8eab\u4f1a\u6d88\u8017\u4e00\u4e9b\u7cfb\u7edf\u8d44\u6e90\uff0c\u65e0\u6cd5\u8fd8\u539f\u771f\u662f\u7684\u7528\u6237\u4f7f\u7528\u573a\u666f\u3002 \uff082\uff09\u6027\u80fd\u6d4b\u8bd5\u9700\u8981\u6392\u9664\u5176\u4ed6\u7a0b\u5e8f\u7684\u8d44\u6e90\u6d88\u8017\u5f71\u54cd\uff0c\u6027\u80fd\u81ea\u52a8\u5316\u91c7\u7528\u673a\u5668\u5206\u79bb\uff0c\u4fdd\u8bc1\u4e86\u6027\u80fd\u6570\u636e\u7684\u51c6\u786e\u6027\u3002 \u4ee5\u524d\u7684\u7528\u4f8b\u6267\u884c\u8017\u65f6\u6ca1\u6761\u572830\u79d2\u5de6\u53f3\uff0c\u73b0\u5728\u7528\u4f8b\u8017\u65f6\u572810\u79d2\u3002 4\u3001\u89e3\u51b3\u4e86UI \u8c03\u6574\u5bfc\u81f4\u5b9a\u4f4d\u5931\u8d25\u7684\u4e0d\u7a33\u5b9a\u6027\u95ee\u9898 \uff081\uff09\u89e3\u51b3\u4e86\u56e0 UI \u8c03\u6574\u5bfc\u81f4\u63a7\u4ef6\u4f4d\u7f6e\u53d8\u5316\u6216\u8272\u5dee\u53d8\u5316\u540e\u5b9a\u4f4d\u4e0d\u51c6\u786e\u7684\u95ee\u9898\uff0c\u53ea\u8981\u63a7\u4ef6\u6587\u6848\u548c\u63a7\u4ef6\u5916\u8fb9\u6846\u65e0\u53d8\u5316\u5747\u53ef\u51c6\u786e\u5b9a\u4f4d\uff1b \uff082\uff09\u76ee\u524d\u4e5f\u4f1a\u91c7\u7528\u57fa\u4e8eUI\u7684\u5b9a\u4f4d\u65b9\u6848\uff0c\u5982\u679cUI\u4f4d\u7f6e\u6709\u8c03\u6574\uff0c\u4f1a\u5bfc\u81f4\u5143\u7d20\u65e0\u6cd5\u5b9a\u4f4d\u3002 5\u3001\u7b80\u5316\u4e86\u7528\u4f8b\u7ed3\u6784\uff0c\u63d0\u5347\u7f16\u5199\u53cb\u597d\u5ea6 \uff081\uff09\u667a\u80fd\u81ea\u52a8\u5316\u8bc6\u522b\u5143\u7d20\u7684\u65b9\u6cd5\u53ea\u6709\u4e00\u4e2a\uff0c\u5c31\u662f\u57fa\u4e8e\u6211\u4eec\u8bad\u7ec3\u7684\u6a21\u578b\u8bc6\u522b\u89c6\u9891\u6d41\u4e2d\u7684\u5143\u7d20\uff0c\u7ecf\u8fc7\u811a\u672c\u5c01\u88c5\u4e4b\u540e\uff0c\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u4e2d\u6240\u6709\u5b9a\u4f4d\u7684\u64cd\u4f5c\u90fd\u53ea\u9700\u8981\u8c03\u7528\u8fd9\u4e00\u4e2a\u65b9\u6cd5\u5c31\u884c\u4e86\uff0c\u7f16\u5199\u81ea\u52a8\u5316\u811a\u672c\u7684\u96be\u5ea6\u5927\u5927\u964d\u4f4e\u3002 \uff082\uff09\u4e5f\u662f\u7531\u4e8e\u8c03\u7528\u65b9\u6cd5\u7b80\u5355\uff0c\u5728 UI \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u4e2d\u7684\u5206\u5c42\u7ed3\u6784\u5c06\u4f1a\u51cf\u5c11\uff0c\u591a\u7ee7\u627f\u7684\u60c5\u51b5\u4f1a\u51cf\u5c11\uff0c\u81ea\u52a8\u5316\u4ee3\u7801\u7684\u8c03\u7528\u7ed3\u6784\u4e5f\u4f1a\u53d8\u5f97\u7b80\u5355\uff0c\u800c\u4e14\u529f\u80fd\u6d4b\u8bd5\u540c\u5b66\u7f16\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u66f4\u52a0\u5bb9\u6613\u4e0a\u624b\u3002 \u4ee5\u524d\u5199\u7528\u4f8b\u7531\u4e8e\u9700\u8981\u7ed3\u5408\u4e0d\u540c\u7684\u6a21\u5757\uff0c\u8c03\u7528\u4e0d\u540c\u7684\u65b9\u6cd5\uff0c\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u5e76\u5b8c\u6210\u8c03\u8bd5\u7684\u65f6\u95f4\u5e73\u5747\u572820-30\u5206\u949f\uff0c\u73b0\u5728\u5199\u7528\u4f8b\u811a\u672c\u80fd\u57285\u5206\u949f\u5de6\u53f3\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":"# =============================================\n# Attribution : Application Test Department III\n# Time : 2023/1/3\n# Author : ut003281\n# =============================================\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u7b80\u8ff0","text":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5 \u901a\u8fc7\u81ea\u52a8\u5316\u624b\u6bb5\u5bf9\u5e94\u7528\u8fdb\u884c\u6027\u80fd\u6d4b\u8bd5\uff0c\u63d0\u4f9b\u65b9\u4fbf\u7684\u73af\u5883\u90e8\u7f72\u3001\u8fd0\u884c\u914d\u7f6e\u3001\u7528\u4f8b\u7f16\u5199\u7b49\uff0c\u7528\u4e8e\u684c\u9762\u5e94\u7528\u7684\u51b7\u70ed\u542f\u52a8\u3001\u8d44\u6e90\u62f7\u8d1d\u3001\u9875\u9762\u8df3\u8f6c\u7b49\u6027\u80fd\u573a\u666f\u6d4b\u8bd5\u3002 \u4ed3\u5e93\u5730\u5740\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-perf-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u4ee3\u7801\u7ed3\u6784","text":"autotest-perf-aitest\n\u251c\u2500\u2500 apps # \u5b58\u653e\u6240\u6709\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u811a\u672c\n\u251c\u2500\u2500 conftest.py # pytest hook\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 CURRENT # \u7248\u672c\u5185\u5bb9\n\u251c\u2500\u2500 docs # \u6587\u6863\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u952e\u503c\u5bf9\u7167\u8868.pdf # \u4e32\u53e3\u7ebfcode\u4e0e\u6309\u952e\u7684\u5bf9\u7167\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u6027\u80fd\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\u6267\u884c\u5668\u4f7f\u7528\u6307\u5357.md # \u6267\u884c\u5668\u811a\u672c\u4f7f\u7528\u6307\u5357\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 USB\u4e32\u53e3\u8f6cUSB\u952e\u76d8\u9f20\u6807\u7ebf\u534f\u8bae\u6587\u4ef6V1.0.pdf # \u4e32\u53e3\u534f\u8bae\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput-0.28.2.zip # Linux\u4e0b\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\u7684\u6e90\u7801\uff0c\u53ef\u6839\u636e\u67b6\u6784\u6253\u5305\n\u251c\u2500\u2500 manage.py # \u529f\u80fd\u4e3b\u5165\u53e3\n\u251c\u2500\u2500 pytest.ini # pytst \u914d\u7f6e\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 setting # \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 client.ini # \u6d4b\u8bd5\u673a IP \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5168\u5c40\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dev_env.sh # \u5bbf\u4e3b\u673a\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose_no_relay.yml # \u65e0\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose.yml # \u6709\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker_login.sh # docker \u767b\u9646\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 res\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 black.png # \u5168\u9ed1\u56fe\u7247\uff0c\u7528\u4e8e\u4fee\u6539\u58c1\u7eb8\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_5000.deb # 3A5000 \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_amd64.deb # amd \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_arm64.deb # arm \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_mips64.deb # mips \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_sw_64.deb # sw \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 server.ini # \u670d\u52a1\u5668\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 setup.sh # \u5bb9\u5668\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 template # \u521b\u5efa app \u57fa\u7840\u811a\u672c\u6a21\u677f\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 app_template\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ${app_name}_widget.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 control-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 images\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 test_${app_name}_01_scene.json-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 test_${app_name}_01_scene.py-tpl\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 uos_docker # \u5bb9\u5668\u73af\u5883\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dockerfile\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 requirements.txt\n\u2514\u2500\u2500 src\n \u251c\u2500\u2500 analysis_save.py # \u89e3\u6790\u56fe\u7247\u6d41\u7ed3\u679c\uff0c\u6c47\u603b\u751f\u6210 excel \u62a5\u544a\n\u251c\u2500\u2500 base_widget.py # \u5c01\u88c5\u7684\u57fa\u7840\u64cd\u4f5c\uff0c\u5e94\u7528\u8c03\u7528\u7684\u4e3b\u5165\u53e3\u65b9\u6cd5\n\u251c\u2500\u2500 cmdctl.py # \u8c03\u7528\u547d\u4ee4\u884c\u4f7f\u7528\n\u251c\u2500\u2500 global_value.py # \u5168\u5c40\u53d8\u91cf\n\u251c\u2500\u2500 image_utils.py # \u56fe\u7247\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 __init__.py\n \u251c\u2500\u2500 logger_utils.py # \u65e5\u5fd7\u914d\u7f6e\n\u251c\u2500\u2500 pdocr.py # ocr \u914d\u7f6e\n\u251c\u2500\u2500 public_method.py # \u4e00\u4e9b\u65b9\u4fbf\u7684\u5c01\u4f4f\n\u251c\u2500\u2500 record.py # \u5f55\u5c4f\u76f8\u5173\n\u251c\u2500\u2500 rtk # \u8fd0\u884c\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 _base.py # \u4e00\u4e9b\u679a\u4e3e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 install_env.py # \u5b89\u88c5\u73af\u5883\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 local_runner.py # \u8fd0\u884c\u7528\u4f8b\n\u251c\u2500\u2500 serial_communication # \u4e32\u53e3\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 power_control.py # \u7ee7\u7535\u5668\u64cd\u4f5c\uff0c\u4f7f\u7528\u7ee7\u7535\u5668\u8fde\u63a5\u4e3b\u673a\u7535\u6e90\uff0c\u63a7\u5236\u5f00\u5173\u673a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 serial_common.py # \u4e32\u53e3\u516c\u5171\u65b9\u6cd5\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 usb_mk.py # \u952e\u9f20\u64cd\u4f5c\u57fa\u7840\u5c01\u88c5\n\u251c\u2500\u2500 shortcut_key.py # \u5feb\u6377\u952e\u7684\u5c01\u88c5\n\u251c\u2500\u2500 singleton.py # \u5355\u4f8b\u6a21\u5f0f\n\u251c\u2500\u2500 start_app.py # \u521b\u5efa app\n\u2514\u2500\u2500 write_xlsx.py # \u751f\u6210 excel\n# __init__.py \u6587\u4ef6\u4e3a\u6807\u8bc6\u8be5\u76ee\u5f55\u662f\u4e00\u4e2aPython\u7684\u6a21\u5757\u5305\uff0c\u9879\u76ee\u4e2d\u7684__init__.py\u5747\u4e3a\u7a7a\u6587\u4ef6\u3002\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u73af\u5883\u642d\u5efa","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\u3002 \u670d\u52a1\u7aef\u4e00\u53f0\u3002\uff08\u4ec5\u652f\u6301 AMD \u67b6\u6784\uff0c\u82e5\u9700\u5176\u4ed6\u67b6\u6784\uff0c\u54a8\u8be2\u76f8\u5173\u5f00\u53d1\u4eba\u5458\uff09 \u91c7\u96c6\u76d2\u4e00\u4e2a\u3002 \uff08ACASIS HDMI \u89c6\u9891\u91c7\u96c6\u76d2\uff0chttps://item.jd.com/100013302599.html#crumb-wrap \uff09 USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\u3002\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"\uff082\uff09\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\u3002 USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff08USB3.0 \u63a5\u53e3\u4e0a\uff09\u3002 \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5 USB \u5ef6\u957f\u7ebf\u3002 \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u670d\u52a1\u7aef\u63a8\u8350\u914d\u7f6e","text":"\u914d\u7f6e\u8d8a\u9ad8\uff0c\u89e3\u6790\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"2\u3001\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa","text":" \u6253\u5f00\u63a7\u5236\u4e2d\u5fc3\uff0c\u8d26\u6237\u8bbe\u7f6e\u4e3a\u3010\u81ea\u52a8\u767b\u5f55\u3011\u548c\u3010\u65e0\u5bc6\u7801\u767b\u5f55\u3011\uff0c\u7535\u6e90\u7ba1\u7406\u4e2d\u4f7f\u7528\u7535\u6e90\u5168\u90e8\u8bbe\u7f6e\u4e3a\u3010\u4ece\u4e0d\u3011\uff0c\u5f00\u542f\u5f00\u53d1\u8005\u6a21\u5f0f\u3002 \u6839\u636e\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u8981\u6c42\uff0c\u5bfc\u5165\u76f8\u5173\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\uff1a\u5bfc\u5165\u76f8\u518c\u3001\u5f71\u9662\u3001\u97f3\u4e50\u7684\u6d4b\u8bd5\u8d44\u6e90\u3002 \u5728\u670d\u52a1\u7aef\u6253\u5f00\u76f8\u673a\u5e94\u7528\u540e\uff0c\u5c06\u6d4b\u8bd5\u673a\u684c\u9762\u58c1\u7eb8\u66f4\u6362\u4e3a\u7eaf\u8272\u58c1\u7eb8\uff08\u6ce8\u610f\uff0c\u670d\u52a1\u7aef\u9700\u63d0\u524d\u5f00\u542f\u76f8\u673a\u540e\u518d\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u58c1\u7eb8\uff0c\u5efa\u8bae\u7eaf\u9ed1\u58c1\u7eb8 setting/res/black.png\uff09 \u5728\u6587\u4ef6\u7ba1\u7406\u5668\u4e2d\uff0c\u5c06\u9009\u9879 \u4e3b\u83dc\u5355-\u8bbe\u7f6e-\u9884\u89c8-\u56fe\u7247\u9884\u89c8 \u53d6\u6d88\u52fe\u9009\uff08\u5982\u4e0d\u53d6\u6d88\uff0c\u4f1a\u5f71\u54cd\u622a\u56fe\u5f55\u5c4f\u5e94\u7528\u7684\u6027\u80fd\u6570\u636e\uff09 \u79fb\u52a8\u6216\u5220\u9664\u7cfb\u7edf Logo \uff0c\u6392\u9664\u684c\u9762\u53f3\u4e0b\u89d2 Logo \u7684\u5f71\u54cd\uff08\u91cd\u542f\u751f\u6548\uff09\u3002 sudo mv /usr/share/deepin/uos_logo.svg ~/Pictures/\n \u5b89\u88c5\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\uff08\u5fc5\u987b\u5b89\u88c5\uff01\uff01\uff09 AMD \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_amd64.deb ARM \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_arm64.deb MIPS \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_mips64.deb 3A5000 \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_5000.deb \u5b89\u88c5\u547d\u4ee4 sudo dkpg -i xserver-xorg-input-libinput_0.28.2-2_amd64.deb\n \u5b89\u88c5\u65f6\u4f1a\u63d0\u793a\u5df2\u5b58\u5728\u76f8\u540c\u7248\u672c\uff0c\u8bf7\u5ffd\u7565\uff0c\u76f4\u63a5\u8986\u76d6\u5b89\u88c5\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u4e3b\u673a\u624d\u751f\u6548"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u670d\u52a1\u7aef\u4e00\u952e\u73af\u5883\u90e8\u7f72","text":"\u73af\u5883\u642d\u5efa\u524d\u5fc5\u987b\u5148\u8fde\u63a5\u4e0a USB \u4e32\u53e3\u7ebf\u548c\u91c7\u96c6\u76d2\u3002 \u5bbf\u4e3b\u673a\u73af\u5883\u5b89\u88c5 python3 manage.py install --env host\n \u5bb9\u5668\u73af\u5883\u5b89\u88c5 python3 manage.py install --env docker\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u56db\u3001\u914d\u7f6e\u9879","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u670d\u52a1\u7aef\u914d\u7f6e","text":"setting/config/server.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u914d\u7f6e\u9879\uff0c\u5305\u542b\u4e86\u6240\u6709\u670d\u52a1\u7aef\u6240\u6709\u7684\u53ef\u914d\u7f6e\u9879\u3002 \u672c\u5730\u65e0\u7f51\u7edc\u8fd0\u884c \u5c06\u914d\u7f6e\u9879 network=0 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u672c\u5730\u6709\u7f51\u7edc\u8fd0\u884c \u914d\u7f6e\u9879 network=1 (1)\u914d\u7f6e\u9879 client_alias= \u914d\u7f6e\u4e3a\u4f60\u8981\u6d4b\u8bd5\u7684\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5982 Alias1 \u6d4b\u8bd5\u673a\u522b\u540d\u5728 setting/config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 (2)\u914d\u7f6e\u9879 client_alias= \u4e3a\u7a7a\uff0c\u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager --client_alias Alias1\uff0c\u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002(Alias1 \u4e3a\u4f60\u914d\u7f6e\u7684\u6d4b\u8bd5\u673a\u522b\u540d) (1)\u548c(2)\u53ea\u8981\u4f7f\u7528\u5176\u4e00\u5373\u53ef\u3002 \u6709\u7f51\u7edc\u8fd0\u884c\uff0c\u4e14\u9700\u8981\u901a\u8fc7 Jenkins \u4e0a\u8fd0\u884c\u4e00\u4e2a job \uff0c\u540c\u65f6\u63a7\u5236\u591a\u53f0\u673a\u5668\u3002 \u914d\u7f6e\u9879 network=1 \u914d\u7f6e\u9879 client_alias= \u4e0d\u7528\u914d\u7f6e\uff0c\u5728\u8fd0\u884c run.sh \u7684\u65f6\u5019\u76f4\u63a5\u7a7a\u683c\u52a0\u522b\u540d\u5373\u53ef\uff0c\u6bd4\u5982\uff1a\u6d4b\u8bd5\u673a\u522b\u540d\u4e3a Alias1 \uff0c\u4e14\u5df2\u7ecf\u5728 config/client.ini \u4e2d\u914d\u7f6e\u4e86 Alias1 \u7684user ip password \uff0c\u5219\u8fd0\u884c bash run.sh Alias1 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u5728 Jenkins pipeline \u91cc\u9762\u901a\u8fc7\u5e76\u884c stage \u6216\u5e76\u884c\u8c03\u7528\u4e0b\u5c42\u4efb\u52a1\u7684\u65b9\u5f0f\u53ef\u4ee5\u5b9e\u73b0\u5927\u89c4\u6a21\u7684\u6027\u80fd\u6d4b\u8bd5\u9700\u6c42\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;1\u3001KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2\u3001KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f, e.g. TAGS = L1 or smoke\n[case_conf]\n# \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\uff0cocr\u6587\u6848\u8bc6\u522b\u8f83\u6162\uff0c\u4e0d\u63a8\u8350\u4f7f\u7528\nfind_by = stage\n# \u6700\u540e\u4e00\u4e2a\u7a33\u5b9a\u9636\u6bb5\u7684\u5e27\u6570\u8bc6\u522b\n# \u9996\u5e27\u5b58\u5728\u540e\u7684\u7b2c\u4e00\u4e2a\u5927\u4e8e\u8be5\u914d\u7f6e\u5e27\u6570\u7684\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u5c3e\u5e27\nfinal_stable_num=100\n# \u4ece\u8be5\u5e27\u6570\u5f00\u59cb\u8bc6\u522b\u6587\u6848\u6216\u56fe\u7247\uff0c\u51cf\u5c11\u5206\u6790\u65f6\u95f4\nstart_num = 150\n# \u8bc6\u522b\u7684\u6587\u6848\ntext=\n# \u8bc6\u522b\u56fe\u7247\nmatch=apps/xxx/images/match.png\n# \u8bc6\u522b\u76f8\u4f3c\u5ea6\nmatch_rate=0.9\n# \u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6bd4\u5982\u70ed\u542f\u52a8\u7528\u4f8b\uff0c\u4ece\u70b9\u51fb\u6253\u5f00\u5230\u505c\u6b62\u5f55\u5c4f\uff0c\u4e2d\u95f4\u7b49\u5f855\u79d2\uff1b\nduration = 15\n# \u5355\u6761\u7528\u4f8b\u6267\u884c\u7684\u6b21\u6570\ncount = 5\n# \u7a33\u5b9a\u9636\u6bb5\u5212\u5206\u7684\u76f8\u4f3c\u5ea6\nstable_similarity = 0.9997\n[server]\n# \u8c03\u8bd5\u6a21\u5f0f=1\uff0c\u4e3a\u5f00\u542f\u8c03\u8bd5\u6a21\u5f0f\uff0c0\u4e3a\u5173\u95ed\u3002\n# \u8c03\u8bd5\u6a21\u5f0f\u4e0b\u9ed8\u8ba4\u53ea\u6267\u884c\u4e00\u6b21\u7528\u4f8b\uff0c\u4e0d\u5173\u673a\n# \u7f16\u5199\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u5efa\u8bae\u5f00\u542fmaintain\u3002\nMAINTAIN = 0\n# \u8fd0\u884c\u7684\u73af\u5883docker\u5bb9\u5668\u73af\u5883\uff0chost\u5bbf\u4e3b\u673a\u73af\u5883\nENV = docker\n# \u670d\u52a1\u7aef\u5bc6\u7801\nPASSWORD=1\n# \u6307\u5b9a\u6d4b\u8bd5\u673a\u522b\u540d\n# \u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6bd4\u5982\uff1a\n# [AMD]\n# ip=10.8.15.86\n# user=uos\n# \u5176\u4e2d AMD \u4e3a\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5219client_alias=AMD\nCLIENT_ALIAS = x86\uff08Intel-i7\uff09\n# 1 \u5f00\u542f\u7f51\u7edc, 0 \u5173\u95ed\u7f51\u7edc\n# \uff081\uff09\u670d\u52a1\u7aef\u4e0e\u6d4b\u8bd5\u673a\u987b\u5728\u540c\u4e00\u7f51\u6bb5\u4e0b\uff0c\u4f60\u53ef\u4ee5\u5c1d\u8bd5\u5728\u670d\u52a1\u7aef\u901a\u8fc7ssh\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c\u5982\u679c\u53ef\u4ee5\u8fde\u63a5\uff0c\u8bf4\u660e\u7f51\u7edc\u6b63\u5e38\u3002\n# \uff082\uff09\u5f53input_type=FILE_NAME \u65f6\uff0c\u5fc5\u987b\u5f00\u542f\u7f51\u7edc\u3002\nNETWORK = 1\n# \u6027\u80fd\u7ed3\u679c\u7edf\u8ba1\u5355\u4f4d \u6beb\u79d2\u2014ms, \u79d2\u2014s\nUNIT=ms\n# \u6d4b\u8bd5\u673a\u5f00\u673a\u8fdb\u5165\u684c\u9762\u540e\u7b49\u5f85\u65f6\u95f4,\u5355\u4f4d/\u79d2\nSTARTUP_DELAY = 60\n# 1\u4e3a\u5220\u9664\u7f13\u5b58\uff0c0\u4e3a\u4e0d\u5220\u9664\u7f13\u5b58\n# \u7528\u4f8b\u6267\u884c\u5b8c\u540e\u4f1a\u5728report\u76ee\u5f55\u4e0b\u751f\u6210\u667a\u80fd\u89e3\u6790\u7684\u4e00\u4e9b\u7f13\u5b58\u56fe\u7247\u3002\nCACHE = 0\n# \u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u62a5\u544a\u4f1a\u4fdd\u5b58\u5728\u9879\u76ee\u4e0breport\u76ee\u5f55\u4e2d\uff1b\n# \u6307\u5b9a\u62a5\u544a\u76ee\u5f55\u5219\u5b58\u653e\u5230\u6307\u5b9a\u76ee\u5f55\u3002\nREPORT_PATH = report\n# \u670d\u52a1\u7aef\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684icon\u8d44\u6e90\u4f1a\u7f13\u5b58\u5728\u9879\u76ee\u4e0binput\u76ee\u5f55\u4e2d\nINPUT = input/\n# 1\u4e3a\u6d4b\u8bd5\u5b8c\u5173\u673a\uff0c0\u4e3a\u6d4b\u8bd5\u5b8c\u4e0d\u5173\u673a\nSHUTDOWN = 0\n# \u89e3\u6790\u8fdb\u7a0b\u6570\uff08\u4e0d\u63a8\u8350\u4fee\u6539\uff09\n# 3\u4e2a\u8fdb\u7a0b\u89e3\u6790\u89c6\u9891\u5df2\u7ecf\u80fd\u591f\u6ee1\u8db3\uff0c\u5373\u4f7f\u589e\u52a0\u8fdb\u7a0b\u6570\u4e5f\u4e0d\u80fd\u51cf\u5c11\u6574\u4f53\u8017\u65f6\n# \u53e6\u5916\u8fd8\u8981\u770bCPU\u6838\u6570\u662f\u5426\u652f\u6301\u3002\nPARSING_PROCESS = 3\n# 1\u4e3a\u4f7f\u7528\u7ee7\u7535\u5668\u5f00\u5173\u673a\uff0c0\u4e3a\u4f7f\u7528reboot\u547d\u4ee4\u91cd\u542f\u3002\u4f9d\u8d56\u7ee7\u7535\u5668\u786c\u4ef6\u8bbe\u5907\uff0c\u9700\u8981\u4f7f\u7528\u8054\u7cfb\u5f00\u53d1\u8005\nRELAY = 0\n# \u83b7\u53d6\u6d4b\u8bd5\u5e94\u7528\u7684\u7248\u672c, %s \u5360\u4f4d\u5e94\u7528\u540d\n# \u5982\u679c\u8be5\u914d\u7f6e\u4e3a\u7a7a\uff0c\u5219\u4e0d\u83b7\u53d6\u5e94\u7528\u7684\u7248\u672c\u4fe1\u606f\u3002\nCOMMAND = apt policy %s 2>/dev/null|grep \"\u5df2\u5b89\u88c5\"|awk -F \"\uff1a\" \"{print \\$2}\"\n# \u5173\u673a\u7b49\u5f85\u5f00\u542f\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6839\u636e\u6d4b\u8bd5\u673a\u6027\u80fd\u4e0d\u540c\uff0c\u5f00\u5173\u673a\u8017\u65f6\u53ef\u80fd\u4e0d\u540c\uff0c\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u673a\u60c5\u51b5\u914d\u7f6e\u3002\nSHUTDOWN_DELAY = 30\n# \u53ef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u56fe\u7247\u683c\u5f0f\uff0c\u4ee5\u82f1\u6587\u9017\u53f7\u9694\u5f00\u3002\n# \u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u76ee\u524d\u6211\u4eec\u4ec5\u9a8c\u8bc1\u4e86jpg,jpeg,png\u8fd9\u4e09\u79cd\u5e38\u7528\u7684\u56fe\u7247\u683c\u5f0f\u3002\nINPUT_TYPES = jpg,jpeg,png\n# \u6027\u80fd\u5206\u6790\u8865\u5e27\uff0c\u7b49\u4e8e\u6216\u4f4e\u4e8e\u8be5\u503c\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u9700\u8981\u51cf\u6389\u3002\nUN_STAB_START = 3\n# \u670d\u52a1\u7aef\u83b7\u53d6\u6d4b\u8bd5\u673a\u56fe\u50cf\u7684\u5e27\u7387\uff0c\u5373\u6bcf\u79d2\u83b7\u53d6\u591a\u5c11\u5f20\u6d4b\u8bd5\u673a\u4e0a\u7684\u56fe\u50cf\u3002\n# \u9ed8\u8ba4\u5e27\u7387\u4e3a30\u5e27/\u79d2\uff0c\u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u53ef\u80fd\u4f1a\u5bf9\u89e3\u6790\u7ed3\u679c\u9020\u6210\u504f\u5dee\u3002\nFPS = 30\n# \u4ee5\u4e0b\u573a\u666f\u7c7b\u578b\u4f1a\u91cd\u542f\u6d4b\u8bd5\u673a,\u591a\u79cd\u573a\u666f\u4f7f\u7528\u9017\u53f7\u9694\u5f00\nSCENE = cold\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = http://10.8.13.78:8890\n#\u5c4f\u5e55\u56fe\u7247\u4e34\u65f6\u5b58\u653e\u4f4d\u7f6e\nSCREEN_CACHE = /tmp/screen\n# =======================================\n[log]\n# \u65e5\u5fd7\u7ea7\u522b\uff0cOFF\u3001FATAL\u3001ERROR\u3001WARN\u3001INFO\u3001DEBUG\u3001ALL\n# \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u65e5\u5fd7\u8f93\u51fa\uff0clog_cli=INFO\u8868\u793a \u4ec5\u8f93\u51faINFO\u53ca\u4ee5\u4e0a\u7ea7\u522b\u7684\u65e5\u5fd7\u3002\nLOG_LEVEL = DEBUG\n# \u65e5\u5fd7\u6587\u4ef6\u4fdd\u5b58\u8def\u5f84\nLOG_PATH= logs\n# =======================================\n[dockerhub]\n# \u5bb9\u5668\u767b\u9646\u8d26\u53f7\nDOCKER_USER = user\n# \u5bb9\u5668\u767b\u9646\u5bc6\u7801\nDOCKER_PASSWORD = User1234\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u6d4b\u8bd5\u673a\u914d\u7f6e","text":"setting/config/client.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u4fe1\u606f\u3002 \u6709\u7f51\u7edc\u7684\u60c5\u51b5\u4e0b\uff0c\u670d\u52a1\u7aef\u9700\u8981\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u56e0\u6b64\u4f60\u9700\u8981\u5199\u5165 \u6d4b\u8bd5\u673a\u522b\u540d \u3001 user \u3001ip\u3001 password \u3002 # \u6d4b\u8bd5\u673a\u522b\u540d\n[Alias1] # \u6d4b\u8bd5\u673aip\nip=10.8.15.86 # \u6d4b\u8bd5\u673a\u7528\u6237\u540d\nuser=uos\n \u547d\u540d\u5efa\u8bae\uff1aAliasA1\u3001AliasA2\u3001AliasB1\u3001AliasB2\uff0c\u4e0d\u8981\u91cd\u540d\u3002 \u65e0\u7f51\u7edc\u60c5\u51b5\u4e0b\uff0c\u4ec5\u9700\u8981\u5173\u6ce8\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\u9879 width=\u3001 height= \u5373\u53ef\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a [client]\n# \u9ed8\u8ba4\u6d4b\u8bd5\u673a\u7528\u6237\u540d\uff0c\u5bc6\u7801\uff0cip\nip=\nuser=\n# \u6d4b\u8bd5\u673a\u5bc6\u7801\npassword=1\n# \u6d4b\u8bd5\u673a\u4e3b\u9898\ntheme=bloom\n# \u6d4b\u8bd5\u673aicon\u76ee\u5f55\npath=/usr/share/icons\n# \u7cfb\u7edfdesktop\u6587\u4ef6\u7684\u5b58\u653e\u76ee\u5f55\uff0cUOS\u7cfb\u7edf\u9ed8\u8ba4\u4e3a/usr/share/applications\ndesktop_path=/usr/share/applications\n# \u7528\u4e8e\u5224\u65ad\u6d4b\u8bd5\u673a\u662f\u5426\u5f00\u673a\u8fdb\u5165\u684c\u9762\u7684\u8bc6\u522b\u6807\u8bc6\u3002\n# 1\u3001\u901a\u8fc7\u684c\u9762\u56fe\u6807\u8bc6\u522b\u3002\n# - type=FILE_NAME\u65f6\uff0c\u670d\u52a1\u5668\u548c\u6d4b\u8bd5\u673a\u5fc5\u987b\u5728\u540c\u4e00\u5c40\u57df\u7f51\u5185\u3002\n# - power_on=dde-computer\u8868\u793a\u901a\u8fc7\u684c\u9762\u8ba1\u7b97\u673a\u56fe\u6807\u5224\u65ad\u5f00\u673a\u8fdb\u5165\u684c\u9762\u3002\n# 2\u3001\u901a\u8fc7\u672c\u5730\u56fe\u7247\u4f5c\u4e3a\u5f00\u673a\u8bc6\u522b\u3002\n# - type= \u4f20\u5165\u4e3a\u56fe\u7247\u683c\u5f0f\uff0ctype\u652f\u6301\u7684\u7c7b\u578b\u5305\u542b\u5728server.ini\u5185\u914d\u7f6e\u9879input_type=jpg,jpeg,png\u3002\n# - power_on= \u4f20\u5165\u7684\u662f\u672c\u5730\u56fe\u7247\u7684\u8def\u5f84\u3002\ntype=FILE_NAME\npower_on=dde-computer\n# \u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\uff08\u6d4b\u8bd5\u673a\u8fde\u63a5\u91c7\u96c6\u76d2\uff0c\u91c7\u96c6\u76d2\u7684\u5206\u8fa8\u7387\uff09\nheight=1080\nwidth=1920\n[AliasA1] ip=10.8.15.86\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n[AliasA2]\nip=10.8.15.20\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_2","title":"3\u3001\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e","text":"\u968f\u7740\u6d4b\u8bd5\u573a\u666f\u7684\u4e0d\u65ad\u5f15\u5165\uff0c\u53d1\u73b0\u73b0\u6709\u670d\u52a1\u7aef\u91cc\u7684\u914d\u7f6e\u9879\u5e76\u4e0d\u9002\u7528\u4e8e\u6240\u6709\u7684\u6027\u80fd\u573a\u666f\uff0c\u4e8e\u662f\u5c06\u670d\u52a1\u7aef\u914d\u7f6e\u8fdb\u884c\u4e00\u4e2a\u63d0\u53d6\uff0c\u53ef\u505a\u5355\u4e2a\u573a\u666f\u7684\u4e2a\u6027\u5316\u914d\u7f6e\uff0c\u5f53\u7136\u539f\u6765\u7684\u670d\u52a1\u7aef\u914d\u7f6e\u529f\u80fd\u4fdd\u7559\uff0c\u53ea\u662f\u5f53\u4f60\u914d\u7f6e\u4e86\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e\u540e\uff0c\u4f18\u5148\u4f7f\u7528\u4e2a\u6027\u5316\u914d\u7f6e\u91cc\u9762\u7684\u5185\u5bb9\uff0c\u4ee5\u4e0b\u662f\u5bf9\u4e2a\u6027\u5316\u914d\u7f6e\u7684\u4ecb\u7ecd\u3002 \u76ee\u524d\u6bcf\u4e00\u4e2a py \u6587\u4ef6\u5bf9\u5e94\u4e00\u4e2a\u6027\u80fd\u6d4b\u8bd5\u573a\u666f\uff0c\u4e8e\u662f\u5728\u540c\u7ea7\u76ee\u5f55\u4e0b\u521b\u5efa\u4e00\u4e2a\u4e0e\u4e4b\u540c\u540d\u7684 json \u6587\u4ef6\uff0c\u4f5c\u4e3a\u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6 apps\n\u251c\u2500\u2500 album\n \u251c\u2500\u2500 test_album_01_start.json # \u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6\n\u2514\u2500\u2500 test_album_01_start.py # \u6027\u80fd\u573a\u666f\u6587\u4ef6\n \u4ee5\u4e0b\u662f\u5bf9 json \u6587\u4ef6\u4e2d\u914d\u7f6e\u7684\u89e3\u91ca\uff0c\u82e5\u67d0\u9879\u914d\u7f6e\u4e0d\u9700\u8981\uff0c\u53ef\u4ee5\u7f3a\u5931\uff0c\u4f46\u4e0d\u80fd\u4e3a\u7a7a\uff1b {\n\"title\": \"test_album_start\", # \u6807\u9898\uff1b\u5fc5\u987b\n\"app_name\": \"deepin-album\", # \u573a\u666f\u6240\u5c5e\u7684\u5e94\u7528\uff1b\u5fc5\u987b\n\"scene\": \"hot\", # \u573a\u666f\u522b\u540d\uff1b\u5fc5\u987b\n\"icon\": [\"deepin-album\"], # \u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684icon\u5230\u670d\u52a1\u7aef\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\uff1b\u53ef\u7f3a\u5931\n# \u6ce8\u610f\uff1a\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684desktop\u6587\u4ef6\u540d\u4e3adeepin-album.desktop\uff0c\n# \u53ea\u9700\u8981\u5199deepin-album\u5373\u53ef\uff0c\u201c.desktop\u201d\u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002\n\"size\": { # \u56fe\u7247\u5bf9\u6bd4\u7684\u533a\u57df\u8bbe\u7f6e\u9879\uff0c\u67d0\u4e9b\u5e94\u7528\u5f53\u524d\u5c4f\u5e55\u7684\u90e8\u5206\u533a\u57df\u9700\u8981\u5c06\u5176\u53bb\u6389\uff0c\u53ef\u4ee5\u8bbe\u7f6e\u6b64\u9879\uff0c\u5982\u679c\u6ca1\u6709\u5219\u53ef\u4e0d\u5199\uff1b\u53ef\u786e\u5b9e\n\"x-coordinate\": 0, # \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n\"y-coordinate\": 0, # \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n\"width\": 850, # \u6a2a\u5411\u957f\u5ea6\n\"height\": 1920 # \u7eb5\u5411\u9ad8\u5ea6\n},\n\"count\": 5, # \u573a\u666f\u6267\u884c\u7684\u6b21\u6570\uff1b\u5fc5\u987b\n\"duration\": 5, # \u8be5\u6761\u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff0c\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7279\u5b9a\u573a\u666f\uff0c\u8be5\u914d\u7f6e\u4e3a\u53ef\u9009\u9879\uff0c\u8986\u76d6 server.ini \u4e2d\u7684\u914d\u7f6e\uff1b\u53ef\u7f3a\u5931\n\"stable_similarity\": 0.9997, # \u6027\u80fd\u573a\u666f\u5206\u9636\u6bb5\u65f6\u7684\u56fe\u7247\u76f8\u4f3c\u5ea6\u5bf9\u6bd4\uff0c\u524d\u540e\u56fe\u7247\u4f4e\u4e8e\u8be5\u503c\uff0c\u5219\u5206\u4e3a\u4e0d\u7a33\u5b9a\u9636\u6bb5\uff1b\u53ef\u7f3a\u5931\n\"find_by\": \"stage\", # \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\n\"final_stable_num\": 100, # \u67e5\u627e\u6700\u540e\u4e00\u4e2a\u5927\u4e8e\u8be5\u503c\u7684\u7a33\u5b9a\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u7684\u5c3e\u796f\uff1b\u53ef\u7f3a\u5931\n\"start_num\": 150,\n\"text\": \"\", # ocr\u8bc6\u522b\u7684\u6587\u6848\n\"match\": \"apps/xxx/images/match.png\", # \u56fe\u50cf\u5339\u914d\u7684\u56fe\u7247\u6587\u4ef6\u8def\u5f84\n\"match_rate\": 0.9 # \u5339\u914d\u76f8\u4f3c\u5ea6\n}\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e94\u3001\u6d4b\u8bd5\u6d41\u7a0b","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516d\u3001\u7528\u4f8b\u7f16\u5199\u53ca\u65b9\u6cd5\u53c2\u6570\u6307\u5f15","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"1\u3001\u7528\u4f8b\u5b9e\u4f8b\u8bf4\u660e","text":"# \u6807\u51c6\u5e93\u5bfc\u5165\nfrom time import sleep\n# \u5bfc\u5165\u4e09\u65b9\u5e93pytest\nimport pytest\n# \u5bfc\u5165\u7528\u4f8b\u6267\u884c\u8981\u7528\u5230\u7684Widget\u7c7b\nfrom src.base_widget import BaseWidget\nclass TestStart:\n# class\u7ea7\u522b\u7684fixture\uff0c\u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u6267\u884c\u3002autouse=True \u81ea\u52a8\u5728\u5f53\u524d\u4f5c\u7528\u57df\u4e0b\u4f7f\u7528\u3002\n@pytest.fixture(scope=\"class\", autouse=True)\n# \u6d4b\u8bd5\u70ed\u542f\u52a8\u4e4b\u524d\u9700\u8981\u9884\u542f\u52a8\u3002\ndef application_pre_start(self):\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().right_click_element(\"deepin-album\")\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().click_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\")\nsleep(2)\n# \u5feb\u6377\u952e\u5173\u95ed\u7a97\u53e3\nBaseWidget().hot_key(\"alt\", \"f4\")\nsleep(2)\n# \u9ed8\u8ba4\u4e3afunction\u7ea7\u522b\u7684fixture\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\uff0cclass\u7ea7\u522bfixture\u6267\u884c\u4e4b\u540e\u6267\u884c\u3002\n@pytest.fixture(autouse=True)\ndef setup_start(self):\n# \u53f3\u952e\u70b9\u51fb deepin-album \u56fe\u6807\nBaseWidget().right_click_element(\"deepin-album\")\n# \u79fb\u52a8\u5230\u53f3\u952e\u83dc\u5355\u4e2d\u6253\u5f00\uff08open.png\uff09\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().move_to(*BaseWidget().find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))\n# \u7b49\u5f85\u79fb\u52a8\u5b8c\u6210\nsleep(0.5)\ndef test_album_start(self):\n# \u70b9\u51fb\u201c\u6253\u5f00\u201d\nBaseWidget().click() \n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"2\u3001\u65b9\u6cd5\u53c2\u6570\u8bf4\u660e","text":"2.1\u3001find_element \u65b9\u6cd5 def find_element(element: str, input_type: str = \"FILE_NAME\", fill_color_position: tuple = (-1, -1), size: tuple = (25, 70)):\npass\n \u53c2\u6570 element \u548c input_type \uff081\uff09\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u5143\u7d20 - `input_type` \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a `FIEL_NAME` \uff0c\u8868\u793a\u901a\u8fc7\u5e94\u7528 `icon` \u5bfb\u627e\u5143\u7d20\uff0c\u6b64\u65b9\u6cd5\u4f1a\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u5e94\u7528 `icon` \u56fe\u6807\u3002\n \u4e3e\u4f8b\uff1a\u9ed8\u8ba4\u60c5\u51b5\u4e0b input_type \u53c2\u6570\u4e0d\u9700\u8981\u4f20\u5165\uff0c find_element(\"deepin-album\")\uff0c\u8868\u793a\u901a\u8fc7 deepin-album \u7684\u5e94\u7528 icon \u6765\u83b7\u53d6\u5750\u6807\uff0c\u6ce8\u610f\uff0c\u6b64\u65f6\u4f20\u5165\u7684 deepin-album \u53c2\u6570\u5b9e\u9645\u662f desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u548c2.3\u4e2d\u7684 icon \u53d8\u91cf\u4e00\u81f4\u3002 \u6211\u4eec\u5efa\u8bae\u4f18\u5148\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\uff0c\u4f46\u6b64\u65b9\u6cd5\u4f9d\u8d56\u7f51\u7edc\uff0c\u8bf7\u6839\u636e\u6d4b\u8bd5\u73af\u5883\u5b9e\u9645\u60c5\u51b5\u9009\u62e9\u3002 \uff082\uff09\u901a\u8fc7\u672c\u5730\u56fe\u7247\u8bc6\u522b\u5143\u7d20 - \u53c2\u6570 `input_type` \u4f20\u5165\u56fe\u7247\u683c\u5f0f\uff0c\u6bd4\u5982\u622a\u53d6\u7684\u672c\u5730\u56fe\u7247\u683c\u5f0f\u4e3a `png`\uff0c\u90a3\u4e48 `input_type=\"png\"`\uff0c\u6b64\u65f6\u53c2\u6570 `element ` \u4f20\u5165\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5efa\u8bae\u5b58\u653e\u5728\u5bf9\u5e94\u7684\u4ea7\u54c1 `apps/app/picture/` \u76ee\u5f55\u4e0b\uff0c\u8def\u5f84\u4e3a\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u7684\u76f8\u5bf9\u8def\u5f84\u3002\n- \u4e3e\u4f8b\uff1a`find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))`\uff0c\u8868\u793a\u901a\u8fc7\u672c\u5730\u56fe\u7247 `open.png` \u8bc6\u522b\u5143\u7d20\u3002\n \u53c2\u6570 fill_color_position fill_color_position \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (-1, -1)\uff0c(-1, -1) \u8868\u793a\u53d6\u5c4f\u5e55\u4e2d\u53f3\u4e0b\u89d2\u6700\u540e\u4e00\u4e2a\u50cf\u7d20\u70b9\u4f5c\u4e3a\u586b\u5145\u5750\u6807\uff0c\u5728 1920x1080 \u5c4f\u5e55\u5206\u8fa8\u7387\u4e0b\u5373\u5b9e\u9645\u5750\u6807\u4e3a (1919, 1079) \uff0c\u8fd9\u6837\u7684\u5199\u6cd5\u53ef\u4ee5\u9002\u914d\u4e0d\u540c\u5927\u5c0f\u7684\u5c4f\u5e55\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0d\u540c\u65b9\u4f4d\uff1a \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0b\u65b9\uff0c\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u4e0d\u9700\u8981\u4f20\u5165\u8be5\u53c2\u6570\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u5de6\u8fb9\uff0cfill_color_position=(1, 1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u53f3\u8fb9\uff0cfill_color_position=(-1, -1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0a\u8fb9\uff0cfill_color_position=(1, 1) \u4ece\u684c\u9762\u542f\u52a8\u5e94\u7528\uff0c\u5219\u9700\u8981\u4f20\u5165\u9664\u4efb\u52a1\u680f\u4ee5\u5916\u5176\u4ed6\u4f4d\u7f6e\u7684\u5750\u6807\uff0c\u6bd4\u5982(100, 100)\uff0c\u53ea\u8981\u8fd9\u4e2a\u5750\u6807\u4e3a\u9664\u5e94\u7528\u548c\u4efb\u52a1\u680f\u533a\u57df\u90fd\u53ef\u4ee5\u3002 \u4ece\u542f\u52a8\u5668\u91cc\u9762\u542f\u52a8\u5e94\u7528\uff0c\u9700\u8981\u586b\u5145\u7684\u5750\u6807\u4e3a\u542f\u52a8\u5668\u533a\u57df\u3002 \u6ce8\uff1a\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u65f6\uff0c\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684 icon \u539f\u6587\u4ef6\u4e3a svg \u77e2\u91cf\u56fe\uff0c\u8f6c\u6362\u4e3a png \u4e4b\u540e\u9700\u8981\u586b\u5145\u8fb9\u7f18\u900f\u660e\u90e8\u5206\u3002 \u53c2\u6570 size size \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (25, 70)\uff0c\u8868\u793a\u6d4b\u8bd5\u673a\u4e0a dock \u680f\u4e0a\u5e94\u7528\u56fe\u6807\u7684\u5927\u5c0f\u8303\u56f4\u3002 UOS \u7cfb\u7edf dock \u680f\u662f\u53ef\u4ee5\u4e0a\u4e0b\u62d6\u52a8\u5927\u5c0f\u7684\uff0c\u968f\u7740 dock \u680f\u5927\u5c0f\u6539\u53d8\uff0c\u5e94\u7528\u56fe\u6807\u7684\u8303\u56f4\u4e3a25\u523070\u4e4b\u95f4\u3002 \u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u64cd\u4f5c\u7cfb\u7edf\u4e0a dock \u680f\u5927\u5c0f\u4e0d\u4e00\u6837\uff0c\u53ef\u4ee5\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u4f20\u5165\u5927\u5c0f\u8303\u56f4\u3002 2.2\u3001click_element\u3001 right_click_element\uff0c double_click_element \u8fd9\u51e0\u4e2a\u65b9\u6cd5\u53c2\u6570\u89c4\u5219\u4e0e find_element \u65b9\u6cd5\u4e00\u6837\u3002\u4ed6\u4eec\u5b9e\u9645\u4e0a\u662f\u5728 find_element \u65b9\u6cd5\u57fa\u7840\u4e4b\u4e0a\u505a\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u589e\u52a0\u4e86\u9f20\u6807\u7684\u52a8\u4f5c\uff0c\u5982\u679c\u4f60\u4e0d\u60f3\u4f7f\u7528\u8fd9\u51e0\u4e2a\u65b9\u6cd5\uff0c\u5728\u7528\u4f8b\u4e2d\u4e5f\u53ef\u4ee5\u901a\u8fc7 find_element \u83b7\u53d6\u5230\u5750\u6807\uff0c\u7136\u540e\u5c06\u5750\u6807\u4f20\u5165\u5230\u952e\u9f20\u7684\u65b9\u6cd5\u4e2d\uff0c\u53ef\u4ee5\u5b9e\u73b0\u540c\u6837\u7684\u6548\u679c\u3002 2.3\u3001\u7528\u4f8b\u7c7b\u4e2d\u6709\u4e2a\u7c7b\u53d8\u91cf icon = [\"deepin-album\"] \u9700\u8981\u7279\u6b8a\u8bf4\u660e\uff0c\u5217\u8868\u4e2d\u7684\u5143\u7d20\u4e3a\u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709 icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684 icon \u5230\u670d\u52a1\u7aef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528 desktop \u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684 desktop \u6587\u4ef6\u540d\u4e3a deepin-album.desktop\uff0c\u53ea\u9700\u8981\u5199 deepin-album \u5373\u53ef\uff0c.desktop \u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e03\u3001\u6267\u884c\u5165\u53e3","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"1\u3001\u7528\u4f8b\u7ec4\u7ec7","text":"\u5728 setting/config/server.ini \u6587\u4ef6\u4e2d APP_NAME= \u5b57\u6bb5\u4e3a\u7528\u4f8b\u7684\u6267\u884c\u7684\u76ee\u5f55\uff0c\u9ed8\u8ba4\u4e3a apps \u76ee\u5f55\u4e0b\u6240\u6709\u7528\u4f8b\u3002\u5982\u679c\u4f60\u60f3\u6307\u5b9a\u6267\u884c\u67d0\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4f60\u53ef\u4ee5\u5c06\u8be5\u914d\u7f6e\u9879\u6307\u5b9a\u5230\u5e94\u7528\u7684\u7528\u4f8b\u76ee\u5f55\uff0c\u6bd4\u5982\uff1aAPP_NAME=deepin_album\uff0c \u8868\u793a\u6267\u884c\u76f8\u518c\u76ee\u5f55\u4e0b\u7684\u7528\u4f8b\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a python3 manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music\n -k KEYWORDS, --keywords KEYWORDS\n \u7528\u4f8b\u7684\u5173\u952e\u8bcd\n -t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e\n --log_level LOG_LEVEL \u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n --env {host,docker} \u5728\u5bbf\u4e3b\u673a\u6216\u5bb9\u5668\u73af\u5883\u6267\u884c\n --client_alias \u9009\u62e9\u6d4b\u8bd5\u673a\u522b\u540d, \u53ef\u9009\u9879\u4e3aclient.ini\u4e2d\u5df2\u914d\u7f6e, \u9ed8\u8ba4\u503c\u4e3a zx-x86.\n --count \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a python3 manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\" --env docker\n \u6ce8\uff1a\u5728\u5bb9\u5668\u4e2d\u6267\u884c\u65f6\uff0c\u82e5\u5f3a\u5236\u9000\u51fa\uff0c\u5bb9\u5668\u5e76\u4e0d\u4f1a\u505c\u6b62\u8fd0\u884c\uff01"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_9","title":"\u516b\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1json","title":"1\u3001Json \u62a5\u544a","text":"\u81ea\u7814\u89c6\u9891\u89e3\u6790\u5de5\u5177\u4f1a\u5bf9\u5355\u6761\u7528\u4f8b\u6267\u884c\u4e00\u8f6e\u751f\u6210\u4e00\u4e2a json \u6587\u4ef6\uff0c\u5b58\u653e\u4e8e report/{app_name}/{scene}/{run_num} \u76ee\u5f55\u4e0b\uff0c\u547d\u540d\u683c\u5f0f\u4e3a\uff1a report.json json \u5185\u5bb9\u4e3e\u4f8b\uff1a [\n{\n\"Stab1\": {\n\"images\": [1,2...150,151],\n\"startStub\": 0,\n\"type\": \"Stab\"\n}\n},\n{\n\"Stab2\": {\n\"images\": [152,153...169,170],\n\"startStub\": 1,\n\"type\": \"UnStab\"\n}\n},\n{\n\"Stab3\": {\n\"images\": [171,172...300,301],\n\"startStub\": 0,\n\"type\": \"UnStab\"\n}\n}\n]\n \u8bf4\u660e\uff1a Stab \uff1a\u8868\u793a\u89e3\u6790\u8fc7\u7a0b\u4e2d\u4e0d\u540c\u7684\u9636\u6bb5\u3002 images \uff1a\u8868\u793a\u6bcf\u4e00\u5e27\u7684\u56fe\u7247\u5e8f\u53f7\u3002 startStub\uff1a \u4e3a\u8bc6\u522b\u5c3e\u5e27\u7684\u9636\u6bb5\u8868\u793a\uff0c\u5982\u679c \"startStub\": 1 \uff0c\u8bf4\u660e\u5c3e\u5e27\u51fa\u73b0\u5728\u8be5\u9636\u6bb5\u3002 type\uff1a \u4e3a Stab \u6216 UnStab \uff0c\u8868\u793a\u7a33\u5b9a\u9636\u6bb5\u6216\u4e0d\u7a33\u5b9a\u9636\u6bb5\u3002 \u5404\u9636\u6bb5\u6709\u5e27\u6570\u8865\u507f\uff0c\u9ed8\u8ba4\u8865\u507f\u7684\u5e27\u6570\u4e3a 3 \u5e27\uff08\u53ef\u4ee5\u901a\u8fc7 server.ini \u91cc\u9762 un_stab_start=3 \u8fdb\u884c\u914d\u7f6e\uff09\uff0c\u8868\u793a\u5c0f\u4e8e\u7b49\u4e8e 3 \u5e27\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u524d\u540e\u5747\u9700\u8981\u51cf\u6389\u3002 \u5e94\u7528\u542f\u52a8\u9636\u6bb5\u5c31\u662f\u5728 Stab2 \u9636\u6bb5\uff0c\u542f\u52a8\u65f6\u95f4\u4e3a\uff1a171 \u51cf 151 \u518d\u51cf\u6389\u524d\u540e\u8865\u507f\u5e27\u6570 6 \u5e27\uff0c\u5373 14 \u5e27\uff0c\u89c6\u9891\u5e27\u7387 30 \u5e27/\u79d2\uff0c\u56e0\u6b64\u542f\u52a8\u8017\u65f6\u4e3a\uff1a14 * 33 = 462 ms"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2excel","title":"2\u3001Excel \u62a5\u544a","text":"\u6240\u6709\u7528\u4f8b\u6267\u884c\u5e76\u89e3\u6790\u5b8c\u4e4b\u540e\u4f1a report \u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a\u6c47\u603b\u6570\u636e\u7684 Excel \u6587\u4ef6\uff0c\u6587\u4ef6\u540d\u4e3a\uff1a{time}_perf_time.xlsx\u3002 \u6ce8\u610f\uff0creport \u76ee\u5f55\u4e3a\u53ef\u914d\u7f6e\u9879\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u4f1a\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u751f\u6210\uff0c\u5982\u679c\u4f60\u5c06 report\uff0c\u6307\u5b9a\u5230\u9879\u76ee\u4e0b\u5176\u4ed6\u8def\u5f84\uff0c\u5219\u4f1a\u5728\u5bf9\u5e94\u7684\u8def\u5f84\u4e0b\u751f\u6210 json \u548c Excel \u6587\u4ef6\u3002 \u4f60\u4e5f\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8bfb\u53d6\u6240\u6709 json / excel \u62a5\u544a\u7684\u6570\u636e\uff0c\u751f\u6210\u4f60\u81ea\u5df1\u60f3\u8981\u7684\u4e00\u4e9b\u6d4b\u8bd5\u62a5\u544a\u5f62\u5f0f\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#usb","title":"\u4e5d\u3001USB \u4e32\u53e3\u9a71\u52a8\u952e\u9f20\u65b9\u6cd5","text":"\u4f4d\u4e8e src/utils/control/serial_communication \u76ee\u5f55\u4e0b\u7684 usb_mk.py \u6587\u4ef6 usb_mk = UsbMk()\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up()\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u652f\u6301\u4f20\u5165\u6c49\u5b57\uff0c\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click()\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() \n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() \n \uff084\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() \n \uff085\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() \n \uff086\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() \n \uff087\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff088\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff0810\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_10","title":"\u5341\u3001\u7ee7\u7535\u5668\u63a7\u5236\u4e3b\u673a\u5f00\u673a/\u91cd\u542f","text":"\uff08\u82e5\u4e0d\u4f7f\u7528\u7ee7\u7535\u5668\uff0c\u53ef\u5ffd\u7565\u8be5\u6b65\u9aa4\uff0c\u6267\u884c\u65f6\u4f1a\u901a\u8fc7\u547d\u4ee4 reboot\uff09"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u7ee7\u7535\u5668\u8bbe\u5907","text":"LCUS-2 \u578b \u53cc\u8def USB \u667a\u80fd\u4e32\u53e3\u63a7\u5236\u7ee7\u7535\u5668\u3002 https://item.taobao.com/item.htm?spm=a1z09.2.0.0.41d72e8dUYx2pi&id=582653718178&_u=i25r20ia6a2e "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2usb","title":"2\u3001USB \u5ef6\u957f\u7ebf","text":"\u666e\u901a\u7684 USB \u7ebf\u5373\u53ef\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_3","title":"3\u3001\u675c\u90a6\u7ebf","text":"3.1\u300140P \u6bcd\u5bf9\u516c\u675c\u90a6\u7ebf\u3002 3.2\u3001\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"4\u3001\u5b89\u88c5\u56fe\u6587\u6559\u7a0b","text":"4.1\u3001\u4f7f\u7528 USB \u5ef6\u957f\u7ebf\u8fde\u63a5\u63a7\u5236\u7aef\u548c\u7ee7\u7535\u5668\u3002 4.2\u3001\u5728\u7ee7\u7535\u5668\u5e38\u7aef\u548c\u516c\u5171\u7aef\u5747\u8fde\u63a5\u4e00\u6839\u675c\u90a6\u7ebf\u3002 4.3\u3001\u5728\u4e3b\u677f\u4e0a\u5f00\u673a\u9488\u548c\u91cd\u542f\u9488\u4e0a\u63d2\u4e0a\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 4.4\u3001\u5c06\u5f00\u673a\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76841\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1\u5de6\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 4.5\u3001\u5c06\u91cd\u542f\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76842\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1 \u53f3\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 \u82e5\u60f3\u4fdd\u7559\u539f\u7535\u6e90\u5f00\u5173\u7684\u7535\u6e90\u706f\uff0c\u53ef\u6839\u636e\u5982\u4e0a\u56fe\u6240\u793a\uff0c\u4f7f\u7528\u675c\u90a6\u7ebf\u8fde\u63a5\u4e3b\u677f\u4e0a\u7684\u7535\u6e90\u706f\u548c\u539f\u7535\u6e90\u5f00\u5173"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_11","title":"\u5341\u4e00\u3001\u5e38\u89c1\u95ee\u9898\u8bf4\u660e","text":"1\u3001ERROR: for uos Cannot restart container 2301b1a1395d7959ee6523d61b61c87084649af530786cdb8fb5b3ecbcbd1068: linux runtime spec devices: error gathering device information while adding custom device \"/dev/ttyACM0\": no such file or directory \u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u8fde\u63a5\u72b6\u6001\uff0c\u67e5\u770b /dev/ttyACM0 \u662f\u5426\u5b58\u5728\uff0c\u82e5\u5b58\u5728 /dev/ttyACMn\uff08n\u4e3a\u4efb\u610f\u6570\u5b57\uff09\uff0c\u91cd\u542f\u7535\u8111\u89e3\u51b3\u3002 2\u3001Error response from daemon: Container 5e700fdc769e8c74666d68a7f2bc3de58268b4594cf88706609d59f8dbc7362d is not running \u5bb9\u5668\u542f\u52a8\u5931\u8d25 1\uff09\u68c0\u67e5\u54ea\u4e00\u4e2a\u5bb9\u5668\u672a\u542f\u52a8 sudo docker container ls # \u5217\u51fa\u8fd0\u884c\u4e2d\u7684 Docker \u5bb9\u5668\n 2\uff09\u7f3a\u5c11 uos \u5bb9\u5668\uff0c\u68c0\u67e5 USB \u4e32\u53e3\u8fde\u63a5\u7ebf\u548c\u91c7\u96c6\u76d2\u8fde\u63a5\u7ebf\u662f\u5426\u6b63\u5e38\uff0c\u91cd\u542f\u540e\u6267\u884c bash install/setup.up # \u91cd\u65b0\u5b8c\u6574\u90e8\u7f72\u73af\u5883\n \u6216\u6267\u884c sudo docker-compose up -d --build # \u4ec5\u91cd\u65b0\u6784\u5efa Docker \u955c\u50cf\n 3\u3001\u82e5\u90e8\u7f72\u65f6\u63d0\u793a\u6302\u8f7d ttyACM0\u3001video0 \u5931\u8d25\uff0c\u8bf7\u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u53ca\u91c7\u96c6\u76d2\u662f\u5426\u63a5\u89e6\u826f\u597d\uff0c\u82e5\u63a5\u89e6\u826f\u597d\uff0c\u91cd\u542f\u5373\u53ef\u89e3\u51b3\u3002 4\u3001\u82e5\u51fa\u73b0\u56fe\u7247\u80fd\u8bc6\u522b\uff0c\u4f46\u662f\u9f20\u6807\u672a\u79fb\u52a8\u64cd\u4f5c\u65f6\uff0c\u5b89\u88c5\u7edd\u5bf9\u9f20\u6807\u64cd\u4f5c\u7684\u4f9d\u8d56\u5305\uff0c\u89c1\u7b2c\u4e09\u8282\u7b2c\u4e8c\u5c0f\u8282\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u6d4b\u8bd5\u673a\u3002 5\u3001\u7531\u4e8e\u901a\u8fc7\u91c7\u96c6\u5361\u83b7\u53d6\u7684\u6d4b\u8bd5\u673a\u5b9e\u65f6\u753b\u9762\uff0c\u5305\u542b\u4e86\u9f20\u6807\u7684\u6837\u5f0f\uff0c\u6240\u4ee5\u5bf9\u56fe\u7247\u8bc6\u522b\u65f6\uff0c\u9f20\u6807\u82e5\u505c\u7559\u5728\u56fe\u6807\u4e0a\u5c42\uff0c\u5219\u4f1a\u5bf9\u8bc6\u522b\u7ed3\u679c\u9020\u6210\u5f71\u54cd\uff0c\u9700\u8981\u5c06\u9f20\u6807\u79fb\u52a8\u81f3\u5176\u4ed6\u4f4d\u7f6e\uff0c\u6216\u8005\u9690\u85cf\u9f20\u6807\u89e3\u51b3\u3002 6\u3001Excel \u62a5\u544a\u4e2d\uff0c\u6d4b\u8bd5\u573a\u666f\u5217\u4e0e\u7528\u4f8b\u4e2d\u7684\u4e0d\u4e00\u81f4\uff0c\u5173\u952e\u5b57scene\u3001app_name\u3001\u67b6\u6784\u522b\u540d\uff0c\u4e0d\u80fd\u5305\u542b\u4e0b\u5212\u7ebf\u548c\u82f1\u6587\u7b26\u53f7\u7684\u5706\u62ec\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/","title":"\u6846\u67b6\u529f\u80fd\u4ecb\u7ecd","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2023/1/12\n# Author : Mikigo\n# =============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_2","title":"\u4e00\u3001\u4e00\u53e5\u8bdd\u7b80\u4ecb","text":"\u6b64\u6587\u6863\u4e3b\u8981\u60f3\u5bf9 YouQu \u6846\u67b6\u4e00\u4e9b\u91cd\u70b9\u7684\u529f\u80fd\u505a\u8be6\u7ec6\u7684\u4ecb\u7ecd\uff0c\u5305\u62ec\u5bf9\u4e00\u4e9b\u529f\u80fd\u5f00\u53d1\u7684\u80cc\u666f\u3001\u8981\u89e3\u51b3\u7684\u95ee\u9898\u3001\u5b9e\u73b0\u903b\u8f91\u3001\u4ee3\u7801\u7b49\u65b9\u9762\u7684\u4ecb\u7ecd\uff0c\u4ee5\u6b64\u8ba9\u5927\u5bb6\u80fd\u66f4\u52a0\u6e05\u6670\u7684\u7406\u89e3\u5404\u9879\u529f\u80fd\uff0c\u4ece\u800c\u5728\u4f7f\u7528\u7684\u65f6\u5019\u80fd\u66f4\u52a0\u7684\u5f97\u5fc3\u5e94\u624b\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_3","title":"\u4e8c\u3001\u56fe\u50cf\u8bc6\u522b","text":"\u56fe\u50cf\u8bc6\u522b\u5728 UI \u81ea\u52a8\u5316\u4e2d\u662f\u4e0d\u53ef\u7f3a\u5c11\u7684\uff0c\u5e02\u9762\u4e0a\u751a\u81f3\u6709\u5b8c\u5168\u57fa\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\uff0c\u6bd4\u5982 Airtest\u3001Sikuli \u7b49\uff0c\u5728\u6e38\u620f\u7b49\u7279\u5b9a\u9886\u57df\u4e5f\u6709\u4e0d\u9519\u7684\u6548\u679c\uff0c\u8fd9\u4e9b\u5de5\u5177\u5b9e\u9645\u4e0a\u4e5f\u662f\u7528\u7684 OpenCV \u8fdb\u884c\u4e86\u5c01\u88c5\uff0cYouQu \u6846\u67b6\u57fa\u4e8e OpenCV \u5f00\u53d1\u4e86\u81ea\u5df1\u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\uff0c\u5b83\u53ef\u4ee5\u65b9\u4fbf\u7684\u7528\u4e8e\u754c\u9762\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u65ad\u8a00\uff1b YouQu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u51e0\u4e4e\u6ee1\u8db3\u4e86\u4f60\u7684\u6240\u6709\u8981\u6c42\uff0c\u6211\u4eec\u5728\u957f\u65f6\u95f4\u7684\u601d\u8003\u548c\u6478\u7d22\u4e2d\uff0c\u9488\u5bf9\u5e38\u89c4\u573a\u666f\u53ca\u4e00\u4e9b\u7279\u6b8a\u573a\u666f\u63a2\u7d22\u9664\u4e86\u4e00\u4e9b\u5b9e\u7528\u4e14\u6709\u6548\u7684\u65b9\u6848\uff0c\u4e14\u542c\u6211\u6162\u6162\u9053\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1","title":"1\u3001\u5e38\u89c4\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5e38\u89c4\u8bc6\u522b\u5f88\u597d\u7406\u89e3\uff0c\u4e00\u53e5\u8bdd\u8bb2\u5c31\u662f\uff0c\u8981\u83b7\u53d6\u5230\u76ee\u6807\u5143\u7d20\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u3002 \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u5728\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u9700\u8981\u83b7\u53d6\u7684\u5750\u6807\u662f\u76f8\u5bf9\u4e8e\u6574\u4e2a\u5c4f\u5e55\u7684\u5750\u6807\uff0c\u6211\u4eec\u53ef\u4ee5\u622a\u53d6\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u56fe\u7247\uff08screen\uff09\uff1b \u5728\u5143\u7d20\u8bc6\u522b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u622a\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5c0f\u56fe\u8fdb\u884c\u8bc6\u522b\uff0c\u6bd4\u5982\u622a\u53d6\u64ad\u653e\u6309\u94ae\uff1a \u90a3\u4e48\u5b9e\u9645\u4e0a\uff0c\u5143\u7d20\u5b9a\u4f4d\u7684\u95ee\u9898\u5c31\u8f6c\u6362\u4e3a\uff0c\u5c06\u622a\u56fe\u7684\u5c0f\u56fe\uff08play_btn\uff09\u62ff\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u5927\u56fe\uff08screen\uff09\u4e2d\u53bb\u505a\u5339\u914d\uff0c\u5982\u679c\u5339\u914d\u6210\u529f\uff0c\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff08 x, y \uff09\u5373\u53ef\u3002 \u4e3a\u4e86\u65b9\u4fbf\u63cf\u8ff0\uff0c\u4ee5\u4e0b\u6211\u5c06\u6574\u4e2a\u5c4f\u5e55\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5927\u56fe\uff0c\u67d0\u4e2a\u5143\u7d20\u56fe\u7247\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5c0f\u56fe\u3002 \u57fa\u4e8e OpenCV \u7684\u6a21\u677f\u5339\u914d cv.matchTemplate() \u529f\u80fd\uff0c\u6211\u4eec\u5b9e\u73b0\u4e86\u56fe\u50cf\u5b9a\u4f4d\u7684\u529f\u80fd\uff0c\u6846\u67b6\u63d0\u4f9b\u4e86\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u5e95\u5c42\u63a5\u53e3\uff08\u4e00\u822c\u4e0d\u5bf9\u4e0a\u5c42\u63d0\u4f9b\u8c03\u7528\uff09\uff1a def _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\n# \u8be6\u7ec6\u4ee3\u7801\u592a\u957f\u4e0d\u8d34\u4e86\uff0c\u611f\u5174\u8da3\u8bf7\u67e5\u770b\u6e90\u7801\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001image_path image_path \u662f\u5c0f\u56fe\u7684\u7edd\u5bf9\u8def\u5f84; \u901a\u5e38\u5728 AT \u5de5\u7a0b\u91cc\u9762\uff0c\u6211\u4eec\u7ea6\u5b9a\u5c06\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u5b9e\u9645\u7684\u5143\u7d20\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1aplay_btn.png \uff1b \u7528\u4e8e\u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 case/assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1amusic_001.png \uff1b \u8fd9\u6837\u662f\u4e3a\u4e86\u65b9\u4fbf\u7ba1\u7406\u548c\u7ef4\u62a4\u3002 2\u3001rate \u56fe\u50cf\u8bc6\u522b\u7684\u7684\u5339\u914d\u5ea6\u6216\u8005\u8bf4\u76f8\u4f3c\u5ea6\uff0c\u6846\u67b6\u9ed8\u8ba4\u7684\u914d\u7f6e\u4e3a 0.9\uff0c\u4e5f\u5c31\u662f\u8bf4\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u5b58\u5728\u4e00\u4e2a\u76f8\u4f3c\u5ea6 90% \u7684\u56fe\u6807\u5373\u8fd4\u56de\u5176\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff1b \u5982\u679c\u4f60\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u8c03\u6574\u8bc6\u522b\u5ea6\uff0c\u4f60\u53ef\u4ee5\u5728\u8c03\u7528\u51fd\u6570\u7684\u65f6\u5019\uff0c\u4f20\u5165\u4e0d\u540c\u7684\u8bc6\u522b\u5ea6\u7684\u503c\u3002 3\u3001multiple \u9ed8\u8ba4\u60c5\u51b5\u4e0b multiple=False\uff0c\u8868\u793a\u53ea\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u7b2c\u4e00\u4e2a\uff0c\u5982\u679c multiple=True \u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\uff0c\u56e0\u4e3a\u5927\u56fe\u4e2d\u53ef\u80fd\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u5c0f\u56fe\uff0c\u5728\u67d0\u4e9b\u573a\u666f\u4e0b\u4f60\u53ef\u80fd\u9700\u8981\u5168\u90e8\u83b7\u53d6\u5230\u6240\u6709\u5339\u914d\u5230\u7684\u5750\u6807\u3002 4\u3001picture_abspath \u9ed8\u8ba4\u60c5\u51b5\u4e0b picture_abspath=None \u8868\u793a\u5927\u56fe\u4e3a\u622a\u53d6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u5982\u679c\u4f60\u4e0d\u5e0c\u671b\u5927\u56fe\u662f\u5c4f\u5e55\u7684\u622a\u56fe\uff0c\u800c\u662f\u4f60\u81ea\u5b9a\u4e49\u4f20\u5165\u7684\u67d0\u4e2a\u56fe\u7247\uff0c\u4f60\u53ea\u9700\u8981\u5c06\u4f60\u7684\u56fe\u7247\u8def\u5f84\u4f20\u9012\u7ed9\u8fd9\u4e2a\u53c2\u6570\u5c31\u884c\uff0c\u6bd4\u5982\uff1a picture_abspath=\"~/Desktop/big.png\" \uff1b 5\u3001screen_bbox \u5927\u56fe\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u622a\u53d6\u6574\u4e2a\u5c4f\u5e55\uff0cscreen_bbox = [x, y, w, h] \u53ef\u4ee5\u6307\u5b9a\u622a\u53d6\u5c4f\u5e55\u4e2d\u7684\u56fa\u5b9a\u533a\u57df\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\uff0c\u53ef\u4ee5\u6392\u9664\u90e8\u5206\u533a\u57df\u5bf9\u8bc6\u522b\u7ed3\u679c\u7684\u5f71\u54cd\u3002 \u3010\u9690\u5f0f\u7b49\u5f85\u3011 \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\uff0c\u6709\u65f6\u5019\u9875\u9762\u8df3\u8f6c\u6709\u5ef6\u65f6\uff0c\u6709\u53ef\u80fd\u5b58\u5728\u8bc6\u522b\u7684\u90a3\u4e00\u523b\u9875\u9762\u4e5f\u6ca1\u6709\u8df3\u8f6c\u51fa\u6765\uff0c\u6216\u8005\u6216\u8005\u8bc6\u522b\u7684\u90a3\u4e00\u523b\uff1b \u56e0\u6b64\u6211\u4eec\u9700\u8981\u4e00\u79cd\u7b49\u5f85\u673a\u5236\uff0c\u5373\u5728\u4e00\u5b9a\u7684\u65f6\u95f4\u5185\uff0c\u5982\u679c\u8bc6\u522b\u4e0d\u5230\uff0c\u91cd\u590d\u53bb\u8bc6\u522b\uff1a def find_image(\ncls,\n*widget, rate: [float, int] = None,\nmultiple: bool = False,\nmatch_number: int = None,\npicture_abspath: str = None,\nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u5728\u5c4f\u5e55\u4e2d\u533a\u5bfb\u627e\u5c0f\u56fe\uff0c\u8fd4\u56de\u5750\u6807\uff0c\n \u5982\u679c\u627e\u4e0d\u5230\uff0c\u6839\u636e\u914d\u7f6e\u91cd\u8bd5\u6b21\u6570\uff0c\u6bcf\u6b21\u95f4\u96941\u79d2\n :param widget: \u6a21\u677f\u56fe\u7247\u8def\u5f84\n :param rate: \u76f8\u4f3c\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param match_number: \u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\n :return: \u5750\u6807\u5143\u7ec4\n \"\"\"\nif rate is None:\nrate = float(GlobalConfig.IMAGE_RATE)\ntry:\nfor element in widget:\nfor _ in range((match_number or int(GlobalConfig.IMAGE_MATCH_NUMBER)) + 1):\nlocate = cls._match_image_by_opencv(\nelement,\nrate,\nmultiple=multiple,\npicture_abspath=picture_abspath,\nscreen_bbox=screen_bbox\n)\nif not locate:\nsleep(int(GlobalConfig.IMAGE_MATCH_WAIT_TIME))\nelse:\nreturn locate\nraise TemplateElementNotFound(*widget)\nexcept Exception as e:\nraise e\n \u53c2\u6570 match_number \u7528\u4e8e\u63a7\u5236\u91cd\u590d\u8bc6\u522b\u7684\u6b21\u6570\uff0c\u9ed8\u8ba4\u4e0d\u4f20\u53c2\uff0c\u53d6\u5168\u5c40\u914d\u7f6e setting/globalconfig.ini \u91cc\u9762\u7684 IMAGE_MATCH_NUMBER \u914d\u7f6e\u9879\u7684\u503c\uff0c\u9ed8\u8ba4IMAGE_MATCH_NUMBER = 1\uff0c\u5373\u91cd\u8bd5 1 \u6b21\uff1b find_image \u662f\u6846\u67b6\u63d0\u4f9b\u7684\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u51fd\u6570\u63a5\u53e3\uff0c\u8fd9\u4e2a\u51fd\u6570\u63d0\u4f9b\u4e86\u9690\u5f0f\u7b49\u5f85\u7684\u529f\u80fd\uff0c\u4e14\u5305\u542b\u4e0a\u9762\u4ecb\u7ecd\u7684 _match_image_by_opencv \u51fd\u6570\u7684\u6240\u6709\u529f\u80fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2","title":"2\u3001\u6c14\u6ce1\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u6c14\u6ce1\u8bc6\u522b\u6307\u7684\u662f\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\u8981\u5b9a\u4f4d\u7684\u5143\u7d20\u662f\u4e00\u4e9b\u4f1a\u6d88\u5931\u7684\u5c0f\u5f39\u7a97\uff0c\u8fd9\u7c7b\u573a\u666f\u5728\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\u5c31\u53ef\u80fd\u5b58\u5728\u4e0d\u7a33\u5b9a\u6027\uff0c\u6709\u53ef\u80fd\u56fe\u50cf\u8bc6\u522b\u7684\u65f6\u5019\u6c14\u6ce1\u5df2\u7ecf\u6d88\u5931\u4e86\uff0c\u4e5f\u6709\u53ef\u80fd\u6c14\u6ce1\u51fa\u73b0\u7684\u65f6\u95f4\u592a\u77ed\u4e86\uff0c\u4e0d\u5bb9\u6613\u6355\u6349\u5230\uff0c\u5c31\u50cf\u6c14\u6ce1\u4e00\u6837\uff0c\u51fa\u73b0\u4e00\u4e0b\u5c31\u6d88\u5931\uff0c\u56e0\u6b64\u6211\u4eec\u5f62\u8c61\u7684\u79f0\u4e4b\u4e3a \u201c\u6c14\u6ce1\u8bc6\u522b\u201d\uff1b \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u4e3a\u4e86\u80fd\u7a33\u5b9a\u7684\u8bc6\u522b\u6c14\u6ce1\u7c7b\u573a\u666f\uff0c\u6211\u4eec\u91c7\u7528\u7684\u65b9\u6848\u662f\uff1a \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\uff08\u5305\u542b\u6c14\u6ce1\u4ece\u51fa\u73b0\u5230\u6d88\u5931\uff09\uff0c\u4e0d\u505c\u7684\u622a\u53d6\u8fd9\u6bb5\u65f6\u95f4\u5185\u7684\u5927\u56fe\uff0c\u4ee5\u6b64\u786e\u4fdd\u5728\u622a\u53d6\u7684\u4e00\u5806\u56fe\u7247\u4e2d\uff0c\u80af\u5b9a\u6709\u81f3\u5c11\u4e00\u5f20\u56fe\u7247\u80fd\u6355\u6349\u5230\u6c14\u6ce1\uff0c\u6700\u540e\u518d\u5bf9\u8fd9\u4e00\u5806\u56fe\u7247\u9010\u4e2a\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def get_during(\ncls,\nimage_path: str,\nscreen_time: [float, int],\nrate: float = None,\npause: [int, float] = None,\nmax_range: int = 10000\n):\n\"\"\"\n \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u622a\u56fe\u591a\u5f20\u56fe\u7247\u8fdb\u884c\u8bc6\u522b\uff0c\u5176\u4e2d\u6709\u4e00\u5f20\u56fe\u7247\u8bc6\u522b\u6210\u529f\u5373\u8fd4\u56de\u7ed3\u679c;\n \u9002\u7528\u4e8e\u6c14\u6ce1\u7c7b\u7684\u65ad\u8a00\uff0c\u6bd4\u5982\u6c14\u6ce1\u57281\u79d2\u5185\u6d88\u5931\uff0c\u5982\u679c\u7528\u5e38\u89c4\u7684\u56fe\u50cf\u8bc6\u522b\u5219\u6709\u53ef\u80fd\u65e0\u6cd5\u8bc6\u522b\u5230\uff1b\n :param image_path: \u8981\u8bc6\u522b\u7684\u6a21\u677f\u56fe\u7247\uff1b\n :param screen_time: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff1b\n :param rate: \u8bc6\u522b\u7387\uff1b\n :param pause: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u4e0d\u95f4\u9694\uff1b\n :param max_range: \u622a\u56fe\u7684\u6700\u5927\u6b21\u6570\uff0c\u8fd9\u662f\u4e00\u4e2a\u9884\u8bbe\u503c\uff0c\u4e00\u822c\u60c5\u51b5\u4e0b\u4e0d\u6d89\u53ca\u4fee\u6539\uff1b\n \"\"\"\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001screen_time \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5728\u6b64\u65f6\u95f4\u5185\u4f1a\u4e0d\u65ad\u7684\u8fdb\u884c\u622a\u56fe\u64cd\u4f5c\uff0c\u5c31\u50cf\u5f55\u5236\u89c6\u9891\u4e00\u6837\uff1b 2\u3001pause \u6bcf\u6b21\u622a\u53d6\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u4e00\u523b\u4e0d\u505c\u7684\u622a\u56fe\uff0c\u5982\u679c\u4f60\u60f3\u6bcf\u6b21\u622a\u56fe\u5b58\u5728\u4e00\u4e9b\u95f4\u9694\u65f6\u95f4\u4f20\u5165\u5bf9\u5e94\u7684\u65f6\u95f4\u95f4\u9694\u5373\u53ef\uff0c\u5355\u4f4d\u662f\u79d2\uff0c\u6bd4\u5982\uff1apause = 0.03\uff0c\u8868\u793a 30 ms\uff0c\u76f8\u5f53\u4e8e\u5e27\u7387\u4e3a 30 \u5e27\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-opencv","title":"3\u3001\u4e0d\u4f9d\u8d56 OpenCV \u7684\u56fe\u50cf\u8bc6\u522b\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31","title":"3.1\u3001\u81ea\u7814\u56fe\u50cf\u8bc6\u522b\u6280\u672f","text":"\u3010\u539f\u7406\u3011 \u4e3a\u4e86\u5b9e\u73b0\u8bc6\u522b\u56fe\u50cf\u7684\u76ee\u7684\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u5c06\u56fe\u7247\u7684\u6bcf\u4e2a\u50cf\u7d20\u7684RGB\u503c\uff0c\u4e0e\u6574\u4e2a\u5c4f\u5e55\u4e2d\u7684RGB\u8fdb\u884c\u5bf9\u6bd4\uff0c\u5982\u679c\u5c0f\u56fe\u4e0a\u7684RGB\u503c\u4e0e\u5bf9\u5e94\u5927\u56fe\u4f4d\u7f6e\u7684RGB\u90fd\u76f8\u7b49\uff0c\u5219\u5339\u914d\u6210\u529f\uff0c\u5373\u53ef\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u70b9\u3002 1\u3001\u8bfb\u53d6\u5c0f\u56fe\u548c\u5927\u56fe\u7684RGB\u503c \uff081\uff09\u5c0f\u56fe\u7684RGB\u503c small_data = small_pic.load() # load()\u4f1a\u5c06\u56fe\u7247\u7684RGB\u503c\u83b7\u53d6\u5230\uff0c\u6570\u636e\u683c\u5f0f\u4e3a\u4e00\u4e2a\u4e8c\u7ef4\u5217\u8868\uff0c\u8d4b\u503c\u7ed9\u4e00\u4e2a\u53d8\u91cfsmall_data\u3002\n \uff082\uff09\u5927\u56fe\u7684RGB\u503c big_data = big_pic.load()\n 2\u3001\u5c06\u5c0f\u56fe\u4e0e\u5927\u56fe\u7684RGB\u503c\u8fdb\u884c\u5339\u914d \uff081\uff09\u5339\u914d\u4ece\u5927\u56fe\u7684\u5750\u6807\uff080\uff0c0\uff09\u5f00\u59cb\u5339\u914d\uff0c\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff082\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\uff080\uff0c0\uff09\u5bf9\u5e94\u7684\u6240\u6709\u5c0f\u56fe\u7684RGB\u503c\u4e0d\u76f8\u7b49\uff0c\u5219\u79fb\u52a8\u5230\u4e0b\u4e00\u4e2a\u5750\u6807\u70b9\uff081\uff0c0\uff09\uff0c\u540c\u6837\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff083\uff09\u6309\u7167\u8fd9\u6837\u7684\u89c4\u5f8b\u5c06\u8fd9\u4e00\u884c\u6bcf\u79fb\u52a8\u4e00\u4e2a\u5750\u6807\u70b9\uff0c\u90fd\u5c06\u5c0f\u56fe\u6240\u6709\u7684RGB\u4e0e\u5bf9\u5e94\u5927\u56fe\u7684\u503c\u8fdb\u884c\u5339\u914d\uff1b \uff084\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\u5176\u4e2d\u4e00\u4e2a\u5750\u6807\u70b9\u4e0a\u5339\u914d\u5230\u4e86\u5c0f\u56fe\u7684\u6240\u6709RGB\u503c\uff0c\u5219\u6b64\u65f6\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\u70b9\uff1b \uff085\uff09\u5982\u679c\u5339\u914d\u4e86\u5927\u56fe\u6240\u6709\u7684\u5750\u6807\u70b9\uff0c\u90fd\u6ca1\u6709\u5339\u914d\u5230\uff0c\u5219\u8bf4\u660e\u5927\u56fe\u4e2d\u4e0d\u5b58\u5728\u5c0f\u56fe\uff0c\u5339\u914d\u5931\u8d25\uff1b \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 class ImageRgb:\n@staticmethod\ndef _check_match(_x, _y, small, bdata, sdata, rate):\n\"\"\"\n Matching degree of small graph and large graph matching\n \"\"\"\n@staticmethod\ndef _pre_random_point(small):\n\"\"\"\n Pre matching, take 10-20 points at random each time,\n and take coordinates randomly in the small graph\n \"\"\"\n@staticmethod\ndef _pre_random_match(_x, _y, point_list, bdata, sdata, rate):\n\"\"\"\n In the small graph, several points are randomly\n selected for matching, and the matching degree is\n also set for the random points\n \"\"\"\n@classmethod\ndef match_image_by_rgb(cls, image_name=None, image_path=None, rate=0.9):\n\"\"\"\n By comparing the RGB values of the small image with the large\n image on the screen, the coordinates of the small image on\n the screen are returned.\n \"\"\"\n \u901a\u8fc7 match_image_by_rgb() \u8fd9\u4e2a\u51fd\u6570\uff0c\u4f20\u5165\u76ee\u6807\u5c0f\u56fe\u7684\u6587\u4ef6\u540d\u79f0\uff0c\u5373\u53ef\u8fd4\u56de\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u3002 \u6709\u540c\u5b66\u8981\u95ee\u4e86\uff0c\u6709 OpenCV \u5e72\u561b\u4e0d\u7528\uff0c\u6709\u5fc5\u8981\u81ea\u5df1\u5b9e\u73b0\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u529f\u80fd\u5417\uff0c\u4f60\u4eec\u662f\u4e0d\u662f\u95f2\u7684\u554a\uff1f \u8fd9\u4e48\u95ee\u7684\u8bdd\uff0c\u5c0f\u4e86\uff0c\u683c\u5c40\u5c0f\u4e86\uff1b\u6211\u4eec\u81ea\u5df1\u5b9e\u73b0\u4e3b\u8981\u6709\u51e0\u65b9\u9762\u539f\u56e0\uff1a \u51cf\u5c11\u73af\u5883\u4f9d\u8d56\uff0c\u5373\u4e0d\u7528\u5b89\u88c5 OpenCV\uff0c\u6211\u4eec\u4e5f\u80fd\u5b9e\u73b0\u5176\u529f\u80fd\uff0c\u73af\u5883\u4f9d\u8d56\u8fd9\u5757\u540e\u9762\u4f1a\u5355\u72ec\u8be6\u7ec6\u8bb2\uff0c\u51cf\u5c11\u73af\u5883\u4f9d\u8d56\u5bf9\u4e8e\u4efb\u4f55\u8f6f\u4ef6\u5de5\u7a0b\u90fd\u975e\u5e38\u91cd\u8981\uff1b OpenCV \u5728\u5176\u4ed6\u56fd\u4ea7 CPU \u67b6\u6784\u4e0a\u5b89\u88c5\u5e76\u4e0d\u80fd\u4fdd\u8bc1100%\u6210\u529f\uff0c\u751a\u81f3\u6709\u6ca1\u6709\u53ef\u80fd\u5728\u4e00\u4e9b\u67b6\u6784\u4e0a\u538b\u6839\u513f\u5c31\u4e0d\u80fd\u5b89\u88c5\u4f7f\u7528 OpenCV \uff1f \u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 OpenCV \uff1f\u5c31\u50cf\u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 Windows \u5462\uff1f\u8fd9\u4e9b\u95ee\u9898\u503c\u5f97\u601d\u8003\u3002 \u5f53\u7136\uff0c\u6211\u4eec\u627f\u8ba4\u8fd9\u5957\u65b9\u6848\uff0c\u867d\u7136\u8bc6\u522b\u51c6\u786e\u7387\u6ca1\u95ee\u9898\uff0c\u4f46\u5728\u8bc6\u522b\u6548\u7387\u4e0a\u8fd8\u6ca1\u6709\u8fbe\u5230 OpenCV \u6a21\u677f\u5339\u914d\u7684\u6548\u679c\uff0c\u6211\u4eec\u7684\u65b9\u6848\u6bcf\u6b21\u8bc6\u522b\u5728 1.5s \u5de6\u53f3\uff0c\u800c OpenCV \u5728 1s \u5de6\u53f3\uff1b \u6574\u4f53\u8bc6\u522b\u6548\u679c\u6765\u8bb2\uff0c\u6211\u8ba4\u4e3a\u8fd8\u662f\u53ef\u4ee5\u63a5\u53d7\u7684\uff0c\u4e5f\u5e0c\u671b\u6709\u5fd7\u4e4b\u58eb\u80fd\u4e00\u8d77\u4f18\u5316\u6b64\u65b9\u6848\uff0c\u4e00\u8d77\u6280\u672f\u62a5\u56fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32-rpc","title":"3.2\u3001\u57fa\u4e8e RPC \u670d\u52a1\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b","text":"\u5728\u8fdc\u7a0b\u670d\u52a1\u5668\u4e0a\u90e8\u7f72 OpenCV \u7684\u73af\u5883\uff0c\u5e76\u5c06\u5176\u90e8\u7f72\u4e3a RPC \u670d\u52a1\uff0c\u6d4b\u8bd5\u673a\u4e0a\u4e0d\u7528\u5b89\u88c5 OpenCV \u4f9d\u8d56\uff0c\u800c\u662f\u901a\u8fc7\u8bf7\u6c42 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u3010\u539f\u7406\u3011 \u6d4b\u8bd5\u673a\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u56fe\u7247\u4ee5\u53ca\u6a21\u677f\u56fe\u7247\uff0c\u53d1\u9001\u7ed9 RPC \u670d\u52a1\u7aef\uff0c\u670d\u52a1\u7aef\u62ff\u5230\u4e24\u5f20\u56fe\u7247\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u6700\u540e\u5c06\u8bc6\u522b\u7ed3\u679c\u8fd4\u56de\u7ed9\u6d4b\u8bd5\u673a\uff1b \u8981\u7279\u6b8a\u8bf4\u660e\u7684\u662f\uff1a RPC \u662f\u4e00\u79cd\u534f\u8bae\uff0c\u8bb8\u591a\u8bed\u8a00\u90fd\u662f\u652f\u6301\u7684\uff0c\u6bd4\u5982\u8bf4\u670d\u52a1\u7aef\u4e5f\u53ef\u4ee5\u7528 C++ \u6765\u5b9e\u73b0\uff0c\u5ba2\u6237\u7aef\u4f7f\u7528 Python \u4e5f\u662f\u53ef\u4ee5\u8c03\u7528\u7684\u3002 \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 \u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nimport cv2 as cv\nimport numpy as np\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\nif __name__ == \"__main__\":\nserver = ThreadXMLRPCServer((\"x.x.x.x\", 8889), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(match_image_by_opencv, \"match_image_by_opencv\")\nserver.serve_forever()\n \u8fd9\u6837\uff0c\u6211\u4eec\u57fa\u4e8e Python \u6807\u51c6\u5e93 xmlrpc \u642d\u5efa\u4e86\u4e00\u4e2a RPC \u670d\u52a1\u5668\uff0c\u6ce8\u518c\u4e86 image_put \u548c match_image_by_opencv \u4e24\u4e2a\u529f\u80fd\u63a5\u53e3\uff0c\u5728\u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u901a\u8fc7 IP \u548c\u7aef\u53e3\u8fdb\u884c RPC \u8bf7\u6c42\uff1b \u5ba2\u6237\u7aef\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from xmlrpc.client import Binary\nfrom xmlrpc.client import ServerProxy\nserver = ServerProxy(GlobalConfig.OPENCV_SERVER_HOST, allow_none=True)\nscreen_rb = open(screen, \"rb\")\ntemplate_rb = open(template_path, \"rb\")\ntry:\nscreen_path = server.image_put(Binary(screen_rb.read()))\nscreen_rb.close()\ntpl_path = server.image_put(Binary(template_rb.read()))\ntemplate_rb.close()\nreturn server.match_image_by_opencv(\ntpl_path, screen_path, rate, multiple\n)\nexcept OSError as exc:\nraise EnvironmentError(\nf\"RPC\u670d\u52a1\u5668\u94fe\u63a5\u5931\u8d25. {GlobalConfig.OPENCV_SERVER_HOST}\"\n) from exc\n \u901a\u8fc7\u8fd4\u56de server.match_image_by_opencv \u5c31\u83b7\u53d6\u4e86\u5728\u670d\u52a1\u7aef\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4","title":"4\u3001\u53f3\u952e\u83dc\u5355\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41","title":"4.1\u3001\u53f3\u952e\u83dc\u5355\u5b9a\u4f4d\u7684\u65b9\u6848\u53ca\u95ee\u9898","text":"\u53f3\u952e\u83dc\u5355\u7684\u5143\u7d20\u5b9a\u4f4d\u662f\u4e00\u4e2a\u96be\u70b9\uff0c\u8fc7\u53bb\u6211\u4eec\u8c03\u7814\u548c\u4f7f\u7528\u8fc7\u7684\u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u65b9\u6cd5\u6709 4 \u79cd\uff1a \u7b2c\u4e00\u79cd\uff1a\u6b65\u957f\u64cd\u4f5c\u6cd5 \u5728\u53f3\u952e\u83dc\u5355\u547c\u51fa\u6765\u4e4b\u540e\uff0c\u901a\u8fc7\u952e\u76d8\u7684 up\u3001down \u6309\u952e\uff0c\u8fdb\u884c\u9009\u62e9\u83dc\u5355\u9009\u62e9\uff0c\u9009\u4e2d\u76ee\u6807\u4e4b\u540e enter \u5373\u53ef\uff1b\u6bd4\u5982\uff1a\u5728\u684c\u9762\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\uff0c\u6309 1 \u6b21 down \uff0c\u4f1a\u51fa\u73b0\u4e0b\u56fe\uff1a \u7ee7\u7eed\u518d\u6309 2 \u6b21 down\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u518d\u6309 enter\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u5982\u6b64\uff0c\u201c\u6392\u5e8f\u65b9\u5f0f\u201d\u7684\u6b65\u957f\u4e3a 3\uff1b\u901a\u8fc7\u4f7f\u7528\u952e\u76d8\u4e0a\u4e0b\u952e\uff0c\u5c31\u5b9e\u73b0\u4e86\u5bf9\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\uff1b \u4f46\u662f\uff0c\u8fd9\u79cd\u65b9\u5f0f\u6709\u4e2a\u5f88\u70e6\u4eba\u7684\u95ee\u9898\uff0c\u5c31\u662f\u53f3\u952e\u83dc\u5355\u7684\u9009\u9879\u4f4d\u7f6e\u4e0d\u53ef\u80fd\u4e00\u76f4\u4e0d\u53d8\uff0c\u5728\u9700\u6c42\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\uff0c\u83dc\u5355\u9009\u9879\u7684\u53d8\u5316\u662f\u5f88\u5927\u7684\uff0c\u751a\u81f3\u6709\u4e9b\u5e94\u7528\u652f\u6301\u81ea\u5b9a\u4e49\u83dc\u5355\uff0c\u6bd4\u5982\u6587\u7ba1\u53f3\u952e\u83dc\u5355\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff1b \u4e5f\u5c31\u662f\u8bf4\u4f60\u5f97\u7ecf\u5e38\u53bb\u7ef4\u62a4\u83dc\u5355\u9009\u9879\u7684\u6b65\u957f\uff0c\u4e00\u4e2a\u9009\u9879\u73b0\u5728\u7684\u6b65\u957f\u662f 3\uff0c\u4e0b\u4e2a\u8fed\u4ee3\u53ef\u80fd\u5c31\u662f 4 \u6216\u8005 5\u3002 \u7b2c\u4e8c\u79cd\uff1a\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u6cd5 \u628a\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5355\u72ec\u622a\u56fe\u4fdd\u5b58\uff0c\u56fe\u7247\u4e2d\u4ec5\u5305\u542b\u4e00\u4e2a\u83dc\u5355\u9009\u9879\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u8fd9\u6837\uff0c\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5c31\u53ef\u4ee5\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u65b9\u5f0f\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u8fd9\u79cd\u65b9\u5f0f\u4e0d\u7528\u62c5\u5fc3\u83dc\u5355\u9009\u9879\u7684\u987a\u5e8f\u6216\u4f4d\u7f6e\uff0c\u4f46\u662f\u9700\u8981\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff0c\u4e14\u5bb9\u6613\u53d7\u5230\u5b57\u4f53 UI \u53d8\u66f4\u7c7b\u9700\u6c42\u7684\u5f71\u54cd\uff0c\u6bd4\u5982\uff1a\u5b57\u4f53\u5927\u5c0f\u3001\u5b57\u4f53\u95f4\u8ddd\u7b49\u7b49\u9700\u6c42\u53d8\u66f4\u90fd\u4f1a\u5f71\u54cd\uff0c\u6bcf\u6b21\u53d8\u66f4\u4e4b\u540e\u5c31\u9700\u8981\u8fdb\u884c\u5927\u91cf\u56fe\u7247\u8d44\u6e90\u7684\u91cd\u65b0\u622a\u56fe\u66ff\u6362\uff0c\u662f\u4e2a\u6bd4\u8f83\u9ebb\u70e6\u7684\u4e8b\u60c5\uff1b \u7b2c\u4e09\u79cd\uff1a\u76f8\u5bf9\u4f4d\u79fb\u6cd5 \u9f20\u6807\u70b9\u51fb\u53f3\u952e\u7684\u65f6\u5019\uff0c\u9f20\u6807\u7684\u5f53\u524d\u5750\u6807\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u7684\uff0c\u83dc\u5355\u9009\u9879\u7684\u5bbd\uff08 w \uff09\u4e00\u822c\u662f\u56fa\u5b9a\u7684\uff0c\u53d8\u5316\u7684\u662f\u83dc\u5355\u7684\u957f\u5ea6\uff08 h \uff09\uff0c\u53ef\u4ee5\u901a\u8fc7\u67d0\u4e2a\u9009\u9879\u76f8\u5bf9\u4e8e\u9f20\u6807\u7684\u8ddd\u79bb\u5728\u786e\u5b9a\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u901a\u8fc7\u7ef4\u62a4\u83dc\u5355\u9009\u9879\uff08\u76f8\u5bf9\u4f4d\u7f6e\uff09\u76f8\u5bf9\u4e8e\u9f20\u6807\u4f4d\u7f6e\u7684\u8ddd\u79bb\uff0c\u5373\u53ef\u8f7b\u677e\u8ba1\u7b97\u51fa\u83dc\u5355\u9009\u9879\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\u3002 \u4ece\u7406\u8bba\u4e0a\u6b64\u65b9\u6848\u662f\u53ef\u884c\u7684\uff0c\u4f46\u662f\u8fd9\u91cc\u4ecd\u7136\u5b58\u5728\u4e24\u4e2a\u4e25\u91cd\u7684\u95ee\u9898\uff1a \u83dc\u5355\u987a\u5e8f\u6539\u53d8\uff0c\u5bfc\u81f4\u76f8\u5bf9\u8ddd\u79bb\u6539\u53d8\uff0c\u800c\u4e14\u8ddd\u79bb\u662f\u901a\u8fc7\u50cf\u7d20\uff08px\uff09\u6765\u8868\u793a\u7684\uff0c\u4e0d\u60f3\u6b65\u957f\u90a3\u4e48\u53ea\u7ba1\uff0c\u6bcf\u6b21\u9700\u8981\u53bb\u91cf\u4e00\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u70b9\u9ebb\u70e6\uff1b \u9f20\u6807\u5728\u684c\u9762\u4e0d\u540c\u4f4d\u7f6e\u70b9\u51fb\u53f3\u952e\uff0c\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u4f4d\u7f6e\u662f\u4e0d\u540c\u7684\uff0c\u4e0a\u56fe\u7684\u83dc\u5355\u662f\u5728\u9f20\u6807\u7684\u5de6\u4e0b\u65b9\uff0c\u5982\u679c\u4f60\u79fb\u52a8\u9f20\u6807\u5230\u5c4f\u5e55\u56db\u8fb9\uff0c\u4f60\u4f1a\u53d1\u73b0\uff0c\u53f3\u952e\u83dc\u5355\u53ef\u80fd\u51fa\u73b0\u5728\u9f20\u6807\u7684\u56db\u4e2a\u65b9\u5411\uff0c\u4e5f\u5c31\u662f\u8bf4\u4f60\u9700\u8981\u6839\u636e\u9f20\u6807\u7684\u4e0d\u540c\u4f4d\u7f6e\u6765\u5224\u65ad\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u65b9\u5411\uff0c\u800c\u4e0d\u540c\u7684\u65b9\u5411\u4e0a\u8ba1\u7b97\u65b9\u6cd5\u662f\u4e0d\u540c\u7684\uff0c\u6bd4\u5982\uff1a\u53f3\u952e\u83dc\u5355\u5728\u9f20\u6807\u7684\u5de6\u4e0a\uff0c\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\u8ba1\u7b97\u65b9\u6cd5\u4e3a\uff08x - w / 2\uff0c y - h\uff09\uff0c\u8fd9\u6837\u7ef4\u62a4\u8d77\u6765\u53ef\u4ee5\u8bf4\u975e\u5e38\u590d\u6742\uff1b \u57fa\u4e8e\u4ee5\u4e0a\u4e24\u4e2a\u539f\u56e0\uff0c\u6211\u4eec\u5e76\u4e0d\u63a8\u8350\u8fd9\u79cd\u64cd\u4f5c\u65b9\u6848\u3002 \u7b2c\u56db\u79cd\uff1a\u5c5e\u6027\u5b9a\u4f4d \u6709\u540c\u5b66\u8bf4\u5e72\u561b\u4e0d\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u5462\uff0c\u5176\u5b9e\uff0c\u6211\u4eec\u6700\u5f00\u59cb\u60f3\u5230\u7684\u65b9\u6848\u5c31\u662f\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\uff0c\u4f46\u662f\u5728\u5c5e\u6027\u7684 DOM \u6811\u91cc\u600e\u4e48\u4e5f\u627e\u4e0d\u5230\uff0c\u65e0\u6cd5\u5b9a\u4f4d\u5230\uff0c\u6211\u4eec\u4e5f\u8054\u5408\u7814\u53d1\u540c\u5b66\u4e00\u8d77\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u4f46\u6700\u7ec8\u8fd8\u662f\u6ca1\u80fd\u89e3\u51b3\uff0c\u975e\u5e38\u9057\u61be\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42","title":"4.2\u3001\u6700\u65b0\u7684\u53f3\u952e\u83dc\u5355\u7ec8\u6781\u89e3\u51b3\u65b9\u6848","text":"\u7531\u4e8e\u53f3\u952e\u83dc\u5355\u9009\u9879\u51e0\u4e4e\u90fd\u662f\u6587\u672c\uff0c\u90a3\u4e48\u901a\u8fc7 OCR \u8bc6\u522b\uff0c\u51e0\u4e4e\u662f\u6700\u4f18\u7684\u65b9\u6848\uff1a \u4e0d\u7528\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff1b \u4e0d\u4f1a\u53d7\u5230\u83dc\u5355\u9009\u9879\u987a\u5e8f\u6539\u53d8\u7684\u5f71\u54cd\uff1b \u4e0d\u4f1a\u53d7\u5230\u5b57\u4f53 UI \u53d8\u5316\u7684\u5f71\u54cd\uff1b \u5173\u4e8e OCR \u8bc6\u522b\u6211\u4eec\u5728\u540e\u9762\u4f1a\u8be6\u7ec6\u8bb2\u5230\uff0c\u672c\u7ae0\u8282\u4e3b\u8981\u8bb2\u57fa\u4e8e OCR \u8bc6\u522b\uff0c\u6211\u4eec\u5728\u53f3\u952e\u83dc\u5355\u8bc6\u522b\u4e0a\u7684\u7a81\u7834\u548c\u521b\u65b0\uff1b \u4f7f\u7528 OCR \u8bc6\u522b\u53f3\u952e\u83dc\u5355\u867d\u7136\u5df2\u7ecf\u5f88\u5b8c\u7f8e\u4e86\uff0c\u4f46\u662f\u5728\u4e00\u4e9b\u60c5\u51b5\u4e0b\u4ecd\u7136\u5b58\u5728\u4e00\u70b9\u95ee\u9898\uff0c\u5c31\u662f\u5c4f\u5e55\u4e2d\u51fa\u73b0\u591a\u4e2a\u548c\u83dc\u5355\u9009\u9879\u6587\u5b57\u76f8\u540c\u7684\u6587\u5b57\u65f6\uff0c\u6bd4\u5982\u4e0b\u9762\u8fd9\u79cd\u60c5\u51b5\uff1a \u5c4f\u5e55\u6070\u597d\u51fa\u73b0\u4e86\u4e24\u4e2a\u201c\u590d\u5236\u201d\uff0c\u6b64\u65f6\u8981\u5b9a\u4f4d\u5230\u83dc\u5355\u4e2d\u7684 \u201c\u590d\u5236\u201d\uff0c\u5c31\u9700\u8981\u8fdb\u4e00\u6b65\u505a\u6570\u636e\u5904\u7406\uff0c\u6bd4\u5982\uff1aOCR \u8fd4\u56de 2 \u4e2a\u201c\u590d\u5236\u201d\u7684\u5750\u6807\uff0c\u7528\u4f8b\u91cc\u9762\u6765\u5224\u65ad\u7528\u54ea\u4e2a\uff0c\u4ece\u4e1a\u52a1\u4e0a\u5c06\u5904\u7406\u8d77\u6765\u6bd4\u8f83\u9ebb\u70e6\uff0c\u56e0\u4e3a\u4f60\u5f97\u660e\u786e\u77e5\u9053\u83dc\u5355\u5728\u5de6\u8fb9\u8fd8\u662f\u53f3\u8fb9\uff0c\u7136\u540e\u8fd9\u672c\u8eab\u5c31\u662f\u4e0d\u786e\u5b9a\u7684\uff1b \u600e\u4e48\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u5462\uff0c\u8fd9\u5c31\u8981\u8bf4\u9053\u672c\u7ae0\u7684\u4e3b\u9898\uff1a\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b\u3002 \u3010\u539f\u7406\u3011 \u5728\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u524d\u622a\u4e00\u5f20\u56fe\uff0c\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\u518d\u622a\u53d6\u4e00\u5f20\u56fe\uff0c\u4e24\u5f20\u56fe\u552f\u4e00\u53d8\u5316\u7684\u5c31\u662f\u53f3\u952e\u83dc\u5355\uff0c\u5c06\u5176\u4ed6\u76f8\u540c\u7684\u5730\u65b9\u90fd\u5c4f\u853d\u6389\uff0c\u53ea\u7559\u4e0b\u83dc\u5355\u754c\u9762\uff0c\u5982\u6b64\u5373\u53ef\u6d88\u9664\u5e72\u6270\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u5c06\u4e24\u79cd\u56fe\u505a\u524d\u540e\u5bf9\u6bd4\u63d0\u53d6\u53ef\u4ee5\u5f97\u5230\u8fd9\u6837\u7684\u56fe\uff1a \u4f60\u770b\uff0c\u901a\u8fc7\u524d\u540e\u56fe\u7247\u7684\u5bf9\u6bd4\uff0c\u5c06\u76f8\u540c\u7684\u90e8\u5206\u7ed9\u6d88\u9664\u6389\uff0c\u518d\u8fdb\u884c OCR \u8bc6\u522b\uff0c\u8fd9\u6837\u5c31\u4e0d\u4f1a\u6709\u5e72\u6270\u4e86\uff1b \u4ee3\u7801\u5b9e\u73b0\u8bf7\u67e5\u770b src/filter_image.py \uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def filter_image(action):\n\"\"\"\n \u5bf9\u6bd4\u52a8\u4f5c\u524d\u540e\u4e24\u5f20\u56fe\u7247\uff0c\u63d0\u53d6\u4e0d\u540c\u7684\u90e8\u5206\u751f\u6210\u4e00\u5f20\u65b0\u7684\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u65b0\u56fe\u7247\u7684\u8def\u5f84\n :param action: \u52a8\u4f5c\u51fd\u6570\u7684\u51fd\u6570\u5bf9\u8c61\n :return: \u65b0\u56fe\u7247\u7684\u8def\u5f84\n \"\"\"\n action \u662f\u9f20\u6807\u4e8b\u4ef6\uff0c\u56e0\u4e3a\u6b64\u7c7b\u573a\u666f\u4e0d\u4ec5\u4ec5\u5728\u53f3\u952e\u5b58\u5728\uff0c\u5355\u51fb\u3001\u53cc\u51fb\u7b49\u7b49\uff0c\u53ea\u8981\u64cd\u4f5c\u524d\u540e\u540e\u53d8\u5316\u7684\u90fd\u53ef\u4ee5\uff1a from src.mouse_key import MouseKey\naction = (\nMouseKey.click,\nMouseKey.right_click,\nMouseKey.double_click,\nMouseKey.move_to,\n)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5","title":"5\u3001\u52a8\u6001\u56fe\u50cf\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5728\u684c\u9762\u58c1\u7eb8\u5207\u6362\uff0c\u6216\u770b\u56fe\u3001\u76f8\u518c\u5207\u6362\u56fe\u7247\u7c7b\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u7531\u4e8e\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u662f\u4e0d\u56fa\u5b9a\u7684\uff08\u4e0d\u540c\u7248\u672c\u7684\u7cfb\u7edf\u58c1\u7eb8\u4e0d\u540c\u3001\u58c1\u7eb8\u987a\u5e8f\u4e0d\u540c\uff0c\u770b\u56fe\u76f8\u518c\u5728\u56fe\u7247\u8d44\u6e90\u4e0d\u4e00\u5b9a\u56fa\u5b9a\uff09\uff0c\u90a3\u4e48\u5728\u6d4b\u8bd5\u5207\u6362\u58c1\u7eb8\u6216\u8005\u5207\u6362\u56fe\u7247\u7684\u573a\u666f\u65f6\u5c31\u4f1a\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u4f60\u4e0d\u77e5\u9053\u9884\u671f\u662f\u5565\uff0c\u7528\u4f8b\u64cd\u4f5c\u52a8\u6001\u7684\uff0c\u4e5f\u662f\u6781\u4e0d\u7a33\u5b9a\u3002 \u3010\u539f\u7406\u3011 \u5728\u5207\u6362\u56fe\u7247\u4e4b\u524d\u622a\u56fe\u4fdd\u5b58\u5e76\u8fd4\u56de\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u6b21\u8bc6\u522b\u8fd9\u5f20\u56fe\u7247\uff0c\u5982\u679c\u4e0d\u5b58\u5728\uff0c\u8bf4\u660e\u56fe\u7247\u5df2\u7ecf\u5207\u6362\u4e86\uff1b \u793a\u610f\u56fe\uff1a \u8fd9\u6837\uff0c\u6211\u4eec\u622a\u53d6\u4e86\u5f53\u524d\u56fe\u7247\u4e2d\u6bd4\u8f83\u6709\u4ee3\u8868\u6027\u7684\u4f4d\u7f6e\uff08\u4e00\u53ea\u9e1f\uff09\uff0c\u5728\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u7528\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1a \u6211\u4eec\u518d\u62ff\u7740\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd9\u6837\u5728\u5f53\u524d\u56fe\u7247\u4e2d\uff0c\u5c31\u4e0d\u80fd\u627e\u5230\u8fd9\u53ea\u9e1f\u4e86\uff0c\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u662f False\uff0c\u90a3\u4e48\u4e5f\u5c31\u53ef\u4ee5\u5224\u65ad\u56fe\u7247\u5207\u6362\u662f\u6210\u529f\u7684\u3002 \u4ee3\u7801\u793a\u610f\uff1a def save_temporary_picture(_x: int, _y: int, width: int, height: int):\n\"\"\"\n \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u56fe\u7247\u8def\u5f84\n :param x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n :param y: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n :param width: \u5bbd\u5ea6\n :param height: \u9ad8\u5ea6\n :return: \u56fe\u7247\u8def\u5f84\n \"\"\"\n \u6b64\u51fd\u6570\u7528\u4e8e\u5728\u64cd\u4f5c\u4e4b\u524d\u622a\u56fe\u4e00\u5f20\u4e34\u65f6\u56fe\u7247\uff0c\u8fd4\u56de\u56fe\u7247\u8def\u5f84\uff0c\u6700\u540e\u5728\u65ad\u8a00\u7684\u65f6\u5019\u518d\u5c06\u56fe\u7247\u8def\u5f84\u4f5c\u4e3a\u53c2\u6570\u4f20\u5165\u65ad\u8a00\u8bed\u53e5\u5373\u53ef\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ui","title":"\u4e09\u3001\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_1","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u662f\u6211\u4eec\u81ea\u7814\u7684\u4e00\u79cd\u4f7f\u7528\u7b80\u5355\uff0c\u4e14\u6548\u7387\u6781\u9ad8\u3001\u7a33\u5b9a\u6027\u597d\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u57fa\u4e8e\u5143\u7d20\u6309\u94ae\u5728\u5e94\u7528\u4e2d\u7684\u76f8\u5bf9\u4f4d\u7f6e\uff0c\u52a8\u6001\u83b7\u53d6\u5143\u7d20\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff0c\u9002\u7528\u4e8e\u5404\u79cd\u5c4f\u5e55\u5206\u8fa8\u7387\uff08\u5305\u62ec\u9ad8\u5206\u5c4f\u3001\u5bbd\u5c4f\u3001\u5e26\u9c7c\u5c4f\uff09\uff0c\u5f53\u5143\u7d20\u6309\u94ae\u4f4d\u7f6e\u76f8\u5bf9\u4e8e\u5e94\u7528\u754c\u9762\u4f4d\u7f6e\u53d1\u751f\u4fee\u6539\u4e4b\u540e\uff0c\u53ea\u9700\u8981\u6839\u636e UI \u8bbe\u8ba1\u56fe\u4e0a\u7684\u6e90\u6570\u636e\u4fee\u6539\u5bf9\u5e94\u5750\u6807\u6570\u636e\u5c31\u597d\uff0c\u7ef4\u62a4\u975e\u5e38\u7684\u65b9\u4fbf\u3002 \u6b64\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u9002\u7528\u4e8e\u4e00\u4e9b\u5143\u7d20\u4f4d\u7f6e\u76f8\u5bf9\u4e0e\u5e94\u7528\u754c\u9762\u6bd4\u8f83\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u97f3\u4e50\uff0899% \u7684\u5143\u7d20\u5b9a\u4f4d\u91c7\u7528\u8fd9\u79cd\uff0c\u6548\u679c\u975e\u5e38\u597d\uff09\uff0c\u4e0d\u9002\u7528\u4e8e\u754c\u9762\u4e0d\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u622a\u56fe\u5f55\u5c4f\uff0c\u5f88\u660e\u663e\u4e0d\u9002\u7528\u4e8e\u8fd9\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u3002\u8fd9\u79cd\u5168\u65b0\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u6709\u5b83\u7684\u9002\u7528\u6761\u4ef6\uff0c\u5982\u679c\u4f60\u53d1\u73b0\u4f7f\u7528\u5e38\u89c4\u7684\uff08\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u5b9a\u4f4d\uff09\u4e0d\u597d\u505a\u65f6\uff0c\u4e0d\u59a8\u8003\u8651\u4f7f\u7528\u8fd9\u79cd\uff0c\u5176\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff0c\u5e76\u4e14\u8fc5\u901f\u7231\u4e0a\u4ed6\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_1","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5728 UI \u8bbe\u8ba1\u56fe\u4e2d\u6211\u4eec\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u8fb9\u6846\u7684\u8ddd\u79bb\u7684\uff0c\u7136\u540e\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u6280\u672f\u624b\u6bb5\u83b7\u53d6\u5230\u5e94\u7528\u754c\u9762\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u53ca\u5e94\u7528\u7a97\u53e3\u7684\u5927\u5c0f\uff0c\u793a\u610f\u56fe\u5982\u4e0b\uff1a \uff08x1, y1\uff09\u4e3a\u5e94\u7528\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\uff1b\uff08x2, y2\uff09\u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u5de6\u4e0a\u89d2\uff08x1, y1\uff09\u7684\u5750\u6807\uff0c\u90a3\u4e48\u5b9e\u9645\u4e0a\u3010\u64ad\u653e\u6240\u6709\u3011\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\u4e3a\uff1a\uff08 x1 + x2, y1 + y2 \uff09\uff1b \u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5927\u5c0f\uff08w2, h2\uff09\uff0c\u53ef\u4ee5\u4ece UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\uff1b \u5728 UI \u8bbe\u8ba1\u7a3f\u4e0a\u70b9\u51fb\u3010\u64ad\u653e\u6240\u6709\u3011\u56fe\u6807\uff0c\u7136\u540e\u79fb\u52a8\u9f20\u6807\u5c31\u5c31\u53ef\u4ee5\u770b\u5230\u4e0a\u56fe\u7684\u53c2\u8003\u7ebf\u53ca\u6570\u636e\uff1b \u6240\u4ee5\uff0c\u6211\u4eec\u53ef\u4ee5\u8f7b\u677e\u7684\u83b7\u53d6\u5230\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u4e2d\u5fc3\u5750\u6807\u4e3a\uff1a\uff08 x1 + x2 + (w2 / 2), y1 + y2 + ( h2 / 2) \uff09 \u8be6\u7ec6\u6e90\u4ee3\u7801\u8bf7\u67e5\u770b AT \u57fa\u7840\u6846\u67b6: src/button_center.py \u83b7\u53d6\u5e94\u7528\u7a97\u53e3\u7684\u4fe1\u606f \u4f7f\u7528 xdotool \u548c xwininfo \u83b7\u53d6\u5230\u5e94\u7528\u7a97\u53e3\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u5de6\u4e0a\u89d2\uff09\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a app_id = CmdCtl.run_cmd(f\"xdotool search --classname --onlyvisible {self.app_name}\"\n).split(\"\\n\")\napp_id_list = [int(_id) for _id in app_id if _id]\nreturn CmdCtl.run_cmd(f\"xwininfo -id {app_id_list[self.number]}\")\n \u4f7f\u7528\u6b63\u5219\u83b7\u53d6\u7a97\u53e3\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u83b7\u53d6\u914d\u7f6e \u8bfb ini \u914d\u7f6e\u6587\u4ef6\uff0c\u83b7\u53d6\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e0e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a conf = ConfigParser()\nconf.read(self.config_path)\ndirection = conf.get(btn_name, \"direction\")\nposition = [int(i.strip()) for i in conf.get(btn_name, \"location\").split(\",\")]\n \u8ba1\u7b97\u5143\u7d20\u6309\u94ae\u5750\u6807 \u6839\u636e\u5e94\u7528\u7a97\u53e3\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u5927\u5c0f\u3001\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u5927\u5c0f\uff0c\u4f7f\u7528\u4e00\u5b9a\u7684\u7b97\u6cd5\u5373\u53ef\u8ba1\u7b97\u51fa\u5143\u7d20\u6309\u94ae\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u4e2d\u5fc3\u5750\u6807\uff09\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3","title":"3\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u3010\u914d\u7f6e\u65b9\u6cd5\u3011 \u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u7684\u6570\u636e\u6e90\u662f\u5e94\u7528\u5e93\u4e2d\u7684 ui.ini \u914d\u7f6e\u6587\u4ef6\uff1a ;section\n[\u65b0\u5efa\u6b4c\u5355+] ;key = value\ndirection = left_top\nlocation = 180, 268, 21, 21\n section \u662f\u4f60\u6839\u636e\u5bf9\u5e94\u7684\u5143\u7d20\u6309\u94ae\u547d\u540d\uff0c\u4f60\u53ef\u4ee5\u4efb\u610f\u547d\u540d\uff0c\u4f46\u6700\u597d\u6709\u5177\u4f53\u542b\u4e49\uff0c\u4e14\u80fd\u660e\u786e\u8868\u793a\u8fd9\u4e2a\u5143\u7d20\u6309\u94ae\u7684\u540d\u79f0\uff1b\u7528\u4e2d\u62ec\u53f7\u62ec\u8d77\u6765\u5c31\u884c\uff0c\u6bd4\u5982\uff1a[\u65b0\u5efa\u6b4c\u5355+] \uff1b direction \u662f\u914d\u7f6e\u8be5\u5143\u7d20\u7684\u53c2\u8003\u7cfb\uff0c\u5206\u522b\u4e3a\uff1a left_top \u5de6\u4e0a\uff1b left_bottom \u5de6\u4e0b\uff1b right_top \u53f3\u4e0a\uff1b right_bottom \u53f3\u4e0b\uff1b \u53c2\u8003\u7cfb\u7684\u9009\u53d6\u6807\u51c6\uff1a\u62c9\u52a8\u6539\u53d8\u7a97\u53e3\u5927\u5c0f\u65f6\uff0c\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u53c2\u8003\u7cfb\u4f4d\u7f6e\u662f\u4e0d\u53d8\u7684\uff1b location \u662f\u8be5\u5143\u7d20\u6309\u94ae\u7684\u76f8\u5bf9\u4e0e\u53c2\u8003\u7cfb\u7684 x, y \u7684\u8ddd\u79bb\uff0c\u53ca\u5927\u5c0f(w, h)\uff0c\u8fd9\u56db\u4e2a\u6570\u636e\u53ef\u4ee5\u901a\u8fc7 UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\u6570\u636e\uff0c\u5728\u7f16\u8f91\u6a21\u5f0f\u4e0b\uff0c\u70b9\u51fb UI \u56fe\u4e0a\u7684\u6309\u94ae\uff0c\u53f3\u4fa7\u5c31\u4f1a\u51fa\u73b0\u8be5\u5143\u7d20\u6309\u94ae\u7684 x, y, w, h \u6570\u636e\u3002 \u5982\u679c UI \u56fe\u4e0a\u6ca1\u6709\u63d0\u4f9b\u4f60\u60f3\u8981\u7684\u5143\u7d20\u6570\u636e\uff0c\u4f60\u53ef\u4ee5\u76f4\u63a5\u5728\u7cfb\u7edf\u4e2d\u4f7f\u7528\u622a\u56fe\u5f55\u5c4f\u8fdb\u884c\u5c3a\u91cf\uff0c\u8fd9\u662f\u4e00\u79cd\u4e0d\u63a8\u8350\u4f46\u80fd\u7528\u7684\u65b9\u6cd5\u3002 \u3010\u8c03\u7528\u65b9\u6cd5\u3011 \u5728\u5e94\u7528\u5e93\u65b9\u6cd5\u5c42\u8fd9\u6837\u5199\uff1a def click_add_music_list_btn_in_music_by_ui(self):\n\"\"\"\u70b9\u51fb\u65b0\u5efa\u6b4c\u5355\u6309\u94ae\"\"\"\nself.click(*self.ui.btn_center(\"\u65b0\u5efa\u6b4c\u5355+\"))\n self.ui.btn_center() \u662f\u56fa\u5b9a\u5199\u6cd5\uff0c\u53c2\u6570\u5c31\u662f\u914d\u7f6e\u91cc\u9762\u7684 section \u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ocr","title":"\u56db\u3001OCR \u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_2","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 OCR \u65b9\u6848\u5927\u591a\u91c7\u7528\u8c37\u6b4c OCR\uff08Tesseract\uff09\u65b9\u6848\uff0c\u4f46\u662f\u5b83\u5bf9\u4e8e\u4e2d\u6587\u7684\u8bc6\u522b\u975e\u5e38\u5dee\uff0c\u7ecf\u8fc7\u5927\u91cf\u7684\u8c03\u7814\uff0c\u6211\u4eec\u4f7f\u7528 PaddleOCR\uff0c\u5b83\u662f\u4e00\u4e2a\u5f00\u6e90\u7684\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u8bc6\u522b\u5de5\u5177\uff0c\u4e5f\u662f PaddlePaddle \u6700\u6709\u540d\u7684\u4e00\u4e2a\u5f00\u6e90\u9879\u76ee\uff0c\u611f\u5174\u8da3\u7684\u53ef\u4ee5\u70b9\u8fd9\u91cc\u4e86\u89e3\uff0c\u591a\u7684\u4e0d\u8bf4\u4e86\uff0c\u4f60\u53ea\u9700\u8981\u77e5\u9053\u5b83\u5c31\u662f\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_2","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5b89\u88c5\u4ed6\u662f\u4e2a\u5f88\u9ebb\u70e6\u7684\u4e8b\u60c5\uff0c\u867d\u7136\u64cd\u4f5c\u5f88\u7b80\u5355\uff0c\u4f46\u5176\u5b9e\u5b89\u88c5\u5305\u6709\u70b9\u5927\uff0c\u56e0\u6b64\u6211\u4eec\u4e0d\u5e0c\u671b\u76f4\u63a5\u5728 env.sh \u4e2d\u52a0\u5165\u5b83\uff0c\u8fd9\u4f1a\u8ba9\u6574\u4e2a\u81ea\u52a8\u5316\u73af\u5883\u53d8\u5f97\u975e\u5e38\u81c3\u80bf\uff1b \u56e0\u6b64\uff0c\u6211\u4eec\u60f3\u5230\u5c06\u5b83\u505a\u6210\u4e00\u4e2a RPC \u670d\u52a1\u5728\u5176\u4ed6\u673a\u5668\u4e0a\u90e8\u7f72\uff0c\u6d4b\u8bd5\u673a\u901a\u8fc7\u8fdc\u7a0b\u8c03\u7528 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u4f7f\u7528\u5b83\uff1b RPC \u7684\u8c03\u7528\u903b\u8f91\uff1a \u8fd9\u6837\u6211\u4eec\u53ea\u9700\u8981\u5728\u670d\u52a1\u7aef\u90e8\u7f72\u597d OCR \u8bc6\u522b\u7684\u670d\u52a1\uff0c\u7136\u540e\u901a\u8fc7 RPC \u670d\u52a1\u5c06\u529f\u80fd\u63d0\u4f9b\u51fa\u6765\uff0c\u6846\u67b6\u91cc\u9762\u53ea\u9700\u8981\u8c03\u7528\u5bf9\u5e94\u7684 RPC \u63a5\u53e3\u5c31\u884c\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_1","title":"3\u3001\u4f7f\u7528\u8bf4\u660e","text":"\u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nfrom paddleocr import PaddleOCR\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef paddle_ocr(pic_path, lang):\n\"\"\"\n Paddleocr\u76ee\u524d\u652f\u6301\u7684\u591a\u8bed\u8a00\u8bed\u79cd\u53ef\u4ee5\u901a\u8fc7\u4fee\u6539lang\u53c2\u6570\u8fdb\u884c\u5207\u6362\n \u4f8b\u5982`ch`, `en`, `fr`, `german`, `korean`, `japan`\n :param file_name:\n :param lang:\n :return:\n \"\"\"\nif __name__ == \"__main__\":\nIP = popen(\"hostname -I\").read().split(\" \")[0]\nPORT = 8890\nSCREEN_CACHE = \"/tmp/screen.png\"\nserver = ThreadXMLRPCServer((IP, PORT), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(paddle_ocr, \"paddle_ocr\")\nprint(\"\u76d1\u542c\u5ba2\u6237\u7aef\u8bf7\u6c42\u3002\u3002\")\nserver.serve_forever()\n \u6846\u67b6\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from src import OCR\nOCR.ocr(*target_strings, picture_abspath=None, similarity=0.6, return_default=False, return_first=False, lang=\"ch\"):\n# \u901a\u8fc7 OCR \u8fdb\u884c\u8bc6\u522b\u3002\n# target_strings:\n# \u76ee\u6807\u5b57\u7b26,\u8bc6\u522b\u4e00\u4e2a\u5b57\u7b26\u4e32\u6216\u591a\u4e2a\u5b57\u7b26\u4e32,\u5e76\u8fd4\u56de\u5176\u5728\u56fe\u7247\u4e2d\u7684\u5750\u6807;\n# \u5982\u679c\u4e0d\u4f20\u53c2\uff0c\u8fd4\u56de\u56fe\u7247\u4e2d\u8bc6\u522b\u5230\u7684\u6240\u6709\u5b57\u7b26\u4e32\u3002\n# picture_abspath: \u8981\u8bc6\u522b\u7684\u56fe\u7247\u8def\u5f84\uff0c\u5982\u679c\u4e0d\u4f20\u9ed8\u8ba4\u622a\u53d6\u5168\u5c4f\u8bc6\u522b\u3002\n# similarity: \u5339\u914d\u5ea6\u3002\n# return_default: \u8fd4\u56de\u8bc6\u522b\u7684\u539f\u751f\u6570\u636e\u3002\n# return_first: \u53ea\u8fd4\u56de\u7b2c\u4e00\u4e2a,\u9ed8\u8ba4\u4e3a False,\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u6240\u6709\u6570\u636e\u3002\n# lang: `ch`, `en`, `fr`, `german`, `korean`, `japan`\n \u6b64\u65b9\u6848\u5728\u6846\u67b6\u5185\u6ca1\u6709\u5f15\u5165\u4efb\u4f55\u4e09\u65b9\u4f9d\u8d56\u5b8c\u5168\u91c7\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\uff0c\u800c\u4e14\u4f7f\u7528\u65b9\u6cd5\u975e\u5e38\u7b80\u5355\uff0c\u53ea\u9700\u8981\u901a\u8fc7 OCR.ocr() \u5373\u53ef\uff1b \u5bf9\u4e8e\u4e00\u4e9b\u6587\u6848\u7684\u573a\u666f\u975e\u5e38\u9002\u7528\uff0c\u6b64\u65b9\u6cd5\u76f4\u63a5\u8fd4\u56de\u5750\u6807\uff0c\u53ef\u4ee5\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u3002 \u4e5f\u53ef\u4ee5\u7528\u4e8e\u6587\u5b57\u65ad\u8a00\uff0c\u4ee3\u7801\u793a\u610f\uff1a def assert_ocr_exist(\n*args, picture_abspath=None, similarity=0.6, return_first=False, lang=\"ch\"\n):\n\"\"\"\u65ad\u8a00\u6587\u6848\u5b58\u5728\"\"\"\npic = None\nif picture_abspath is not None:\npic = picture_abspath + \".png\"\nres = OCR.ocr(\n*args,\npicture_abspath=pic,\nsimilarity=similarity,\nreturn_first=return_first,\nlang=lang,\n)\nif res is False:\nraise AssertionError(\n(f\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{args}\", f\"{pic if pic else GlobalConfig.SCREEN_CACHE}\")\n)\nif isinstance(res, tuple):\npass\nelif isinstance(res, dict) and False in res.values():\nres = filter(lambda x: x[1] is False, res.items())\nraise AssertionError(\n(\nf\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{dict(res)}\",\nf\"{pic if pic else GlobalConfig.SCREEN_CACHE}\",\n)\n)\n \u5728\u7528\u4f8b\u4e2d\u4f7f\u7528\u65ad\u8a00\uff0c\u793a\u4f8b\uff1a def test_font_manager_021(self):\n\"\"\"\u53f3\u4fa7\u2665-\u6536\u85cf/\u53d6\u6d88\u6536\u85cf\u5b57\u4f53\"\"\"\n# \u5b57\u4f53\u7ba1\u7406\u5668\u754c\u9762\u53f3\u4fa7\u8be6\u60c5\u5217\u8868\uff0c\u9009\u62e9\u672a\u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e / \u6536\u85cf\u5b57\u4f53\n# \u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e\u83dc\u5355\u663e\u793a\u201c\u53d6\u6d88\u6536\u85cf\u201d\uff1b\n...\nself.assert_ocr_exist(\"\u53d6\u6d88\u6536\u85cf\")\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_1","title":"4\u3001\u670d\u52a1\u7aef\u90e8\u7f72","text":"\u6211\u4eec\u76ee\u524d\u662f\u5c06 OCR \u670d\u52a1\u90e8\u7f72\u5728\u666e\u901a\u7684\u529e\u516c\u673a\u4e0a\u7684\uff0c\u5982\u679c\u4f60\u89c9\u5f97\u73b0\u6709\u7684 OCR \u8bc6\u522b\u6027\u80fd\u4e0d\u591f\u597d\uff0c\u6070\u597d\u4f60\u6709\u66f4\u597d\u7684\u673a\u5668\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u5176\u79c1\u6709\u5316\u90e8\u7f72\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41_1","title":"4.1\u3001\u73af\u5883\u5b89\u88c5","text":"\u63a8\u8350\u4f7f\u7528 pipenv \u8fdb\u884c\u73af\u5883\u642d\u5efa\uff1b \u5b89\u88c5 pipenv \uff1a sudo pip3 install pipenv\n \u65b0\u5efa\u4e00\u4e2a\u76ee\u5f55\u4f5c\u4e3a\u73af\u5883\u5305 ocr_env\uff1a cd ~\nmkdir ocr_env\n \u521b\u5efa python 3.7 \u73af\u5883\uff1a cd ocr_env\npipenv --python 3.7\n \u5b89\u88c5 OCR \u4f9d\u8d56\u5305\uff1a pipenv install paddlepaddle -i https://mirror.baidu.com/pypi/simple\npipenv install \"paddleocr>=2.0.1\" -i https://mirror.baidu.com/pypi/simple\n \u4e0d\u51fa\u610f\u5916\uff0c\u8fd9\u6837\u5c31\u628a\u4f9d\u8d56\u5b89\u88c5\u597d\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42_1","title":"4.2\u3001\u542f\u52a8\u670d\u52a1","text":"\u5c06\u57fa\u7840\u6846\u67b6\u4e2d\u7684 scr/ocr/pdocr_rpc_server.py \u6587\u4ef6\u62f7\u8d1d\u5230 ocr_env \u76ee\u5f55\uff0c\u540e\u53f0\u6267\u884c\u5b83\u5c31\u597d\u4e86\uff1a cd ocr_env\nnohup pipenv run python pdocr_rpc_server.py &\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#43","title":"4.3\u3001\u914d\u7f6e\u5f00\u673a\u81ea\u542f\uff08\u901a\u7528\uff09","text":"\u4f60\u80af\u5b9a\u4e0d\u60f3\u6bcf\u6b21\u673a\u5668\u91cd\u542f\u4e4b\u540e\u90fd\u9700\u8981\u624b\u52a8\u542f\u52a8\u670d\u52a1\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u914d\u7f6e\u5f00\u673a\u81ea\u542f\u3002 \u5199\u5f00\u673a\u81ea\u542f\u670d\u52a1\u6587\u4ef6\uff1a sudo vim /lib/systemd/system/ocr.service\n autoocr \u540d\u79f0\u4f60\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff0c\u5199\u5165\u4ee5\u4e0b\u5185\u5bb9\uff1a [Unit]\nDescription=OCR Service\nAfter=multi-user.target\n\n[Service]\nUser=uos\nGroup=uos\nType=idle\nWorkingDirectory=/home/uos/ocr_env\nExecStart=pipenv run python pdocr_rpc_server.py\n\n[Install]\nWantedBy=multi-user.target\n \u6ce8\u610f\u66ff\u6362\u4f60\u7684${USER} \u4fee\u6539\u914d\u7f6e\u6587\u4ef6\u7684\u6743\u9650\uff1a sudo chmod 644 /lib/systemd/system/ocr.service\n \u81ea\u542f\u670d\u52a1\u751f\u6548\uff1a sudo systemctl daemon-reload\nsudo systemctl enable ocr.service\n \u67e5\u770b\u670d\u52a1\u72b6\u6001\uff1a sudo systemctl status ocr.service\n \u4f60\u53ef\u4ee5\u518d\u91cd\u542f\u4e0b\u7535\u8111\uff0c\u770b\u770b\u670d\u52a1\u662f\u4e0d\u662f\u6b63\u5e38\u542f\u52a8\u4e86\uff0c\u6ca1\u62a5\u9519\u5c31 OK \u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_4","title":"\u4e94\u3001\u5c5e\u6027\u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_3","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 UI \u81ea\u52a8\u5316\u5927\u591a\u90fd\u662f\u57fa\u4e8e\u6d4f\u89c8\u5668\u7684\uff0c\u6838\u5fc3\u662f\u5728\u7f51\u9875\u7684 DOM \u6811\u4e0a\u67e5\u627e\u5143\u7d20\uff0c\u5e76\u5bf9\u5176\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\uff1b Linux \u684c\u9762\u5e94\u7528\u5927\u591a\u662f\u91c7\u7528 Qt \u7f16\u5199\u7684\uff0c\u5728 Qt \u4e2d\u4e5f\u662f\u4ece\u6700\u9876\u5c42\u7684 MainWindow \u5f00\u59cb\u6784\u5efa\u5e94\u7528\uff0c\u6240\u4ee5\u903b\u8f91\u4e5f\u662f\u4e00\u6837\u7684\uff0cQt \u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u540c\u6837\u53ef\u4ee5\u901a\u8fc7 DOM \u6811\uff08\u5c5e\u6027\u6811\uff09\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff0c\u6211\u4eec\u79f0\u4e4b\u4e3a\u5c5e\u6027\u5b9a\u4f4d\u3002 \u501f\u52a9\u5f00\u6e90\u5de5\u5177 dogtail \u6211\u4eec\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u83b7\u53d6\uff0c\u4ece\u800c\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\u3002dogtail \u7684\u9879\u76ee\u4ecb\u7ecd\u53ef\u4ee5\u731b\u6233\u8fd9\u91cc\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_3","title":"2\u3001\u4f7f\u7528\u65b9\u6cd5","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#21sniff","title":"2.1\u3001sniff\uff08\u55c5\u63a2\u5668\uff09\u4f7f\u7528","text":"\u5728\u7ec8\u7aef\u8f93\u5165 sniff \u542f\u52a8 AT-SPI Browser mikigo@mikigo-PC:~$ sniff\n \u67e5\u770b\u5e94\u7528\u7684\u6807\u7b7e \u5728 sniff \u91cc\u9762\u53ef\u4ee5\u770b\u5230\u7cfb\u7edf\u4e2d\u5df2\u542f\u52a8\u7684\u5e94\u7528\uff0c\u70b9\u51fb\u5e94\u7528\u540d\u79f0\u524d\u9762\u7684\u4e09\u89d2\u5f62\u56fe\u6807\uff0c\u53ef\u4ee5\u5c55\u5f00\u5e94\u7528\u7684\u6807\u7b7e\uff0c\u6240\u6709\u6807\u7b7e\u4ee5 tree \u7684\u5f62\u5f0f\u5c55\u793a\uff0c\u5bf9\u5e94\u5e94\u7528\u91cc\u9762\u7684\u7236\u7a97\u53e3\u548c\u5b50\u7a97\u53e3\u3002 \u83b7\u53d6\u5143\u7d20\u63a7\u4ef6\u7684\u6807\u7b7e\u540d\u79f0 \u9996\u5148\uff0c\u4e3a\u4e86\u65b9\u4fbf\u67e5\u770b\u5143\u7d20\u63a7\u4ef6\u5bf9\u5e94\u7684\u4f4d\u7f6e\uff0c\u5efa\u8bae\u73b0\u5728\u4e0a\u65b9\u5de5\u5177\u680f\u70b9\u51fb Actions\uff0c\u7136\u540e\u52fe\u9009 Hightlight Items\uff0c\u8fd9\u6837\u5728 sniff \u4e2d\u9f20\u6807\u9009\u4e2d\u5143\u7d20\u6807\u7b7e\u7684\u65f6\u5019\uff0c\u5e94\u7528\u4e2d\u4f1a\u6709\u76f8\u5e94\u7684\u5149\u6807\u9501\u5b9a\u3002 \u5728 sniff \u91cc\u9762\u70b9\u51fb\u8fdb\u5165\u5e94\u7528\u7684\u6807\u7b7e tree \u4e2d\u540e\uff0c\u70b9\u51fb\u76f8\u5e94\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5728\u5de5\u5177\u4e0b\u65b9\uff0c\u4f1a\u5c55\u793a\u5143\u7d20\u63a7\u4ef6\u7684 Name\uff0c\u8fd9\u4e2a\u5c31\u662f\u6807\u7b7e\u540d\u79f0\u3002 \u5728 tree \u4e2d\u6709\u4e9b\u5730\u65b9\u662f\u7a7a\u767d\u7684\u6216\u8005\u662f Form\uff0c\u662f\u56e0\u4e3a\u5f00\u53d1\u4eba\u5458\u5728\u6dfb\u52a0\u6807\u7b7e\u7684\u65f6\u5019\u6ca1\u6709\u6dfb\u52a0\uff0c\u6216\u8005\u6709\u4e9b\u7236\u7a97\u53e3\u4e0d\u9700\u8981\u6dfb\u52a0\uff0c\u8fd9\u79cd\u5728\u5b9e\u9645\u4e1a\u52a1\u4e2d\u662f\u4e0d\u5f71\u54cd\u7684\uff0c\u6211\u4eec\u53ea\u8981\u4fdd\u8bc1\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\u4e2d\uff0c\u8981\u7528\u5230\u7684\u5143\u7d20\u90fd\u6dfb\u52a0\u4e86\u6807\u7b7e\u5373\u53ef\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#22","title":"2.2\u3001\u5143\u7d20\u64cd\u4f5c","text":"\u83b7\u53d6\u5e94\u7528\u5bf9\u8c61 dogtail \u83b7\u53d6\u5e94\u7528\u5bf9\u8c61\u7684\u65f6\u5019\uff0c\u4f7f\u7528\u7684\u662f tree \u5e93\u91cc\u9762\u7684 application() \u65b9\u6cd5\uff1a from dogtail.tree import root\napp_obj = root.application('deepin-music')\n app_obj\u5c31\u662f\u5e94\u7528\u7684\u5bf9\u8c61\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\uff0c\u662f\u5e94\u7528\u5bf9\u8c61\u4f7f\u7528child()\u65b9\u6cd5\uff1a element = app_obj.child('element_name')\n \u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u4f20\u5165\u5143\u7d20\u7684 Name\uff0c\u83b7\u53d6\u5230\u76f8\u5e94\u5143\u7d20\u7684\u5bf9\u8c61\u3002Name \u53ef\u4ee5\u901a\u8fc7 sniff \u67e5\u770b\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\u5217\u8868: element_list = element.children\n \u83b7\u53d6\u5230\u8fd9\u4e2a\u5143\u7d20\u4e0b\u9762\u6240\u6709\u7684\u5143\u7d20\u5217\u8868\u3002 \u8fd9\u4e2a\u65b9\u6cd5\u9002\u7528\u4e8e\u6709\u4e9b\u6807\u7b7e\u6ca1\u6709\u6dfb\u52a0\uff0c\u4f46\u662f\u4f4d\u7f6e\u662f\u56fa\u5b9a\u7684\uff0c\u6211\u4eec\u901a\u8fc7\u7d22\u5f15\u53ef\u4ee5\u53d6\u5f97\u5143\u7d20\u3002 element_list[0]\n \u5bf9\u5143\u7d20\u7684\u64cd\u4f5c \u5728\u83b7\u53d6\u5230\u5143\u7d20\u4e4b\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u76f8\u5e94\u7684\u64cd\u4f5c\u3002 \u5355\u51fb element.click(button=1)\n button 1 \u2014>\u5de6\u952e\uff0c2 \u2014>\u6eda\u8f6e\uff0c3 \u2014>\u53f3\u952e\uff0c\u9ed8\u8ba4\u4e3a 1 \u53cc\u51fb element.doubleClick(button=1)\n \u9f20\u6807\u60ac\u505c element.point()\n \u9f20\u6807\u79fb\u52a8\u5230\u5143\u7d20\u4e2d\u5fc3\u4f4d\u7f6e \u6587\u672c\u8f93\u5165 element.typeText(string)\n \u5411\u5143\u7d20\u5bf9\u8c61\u8f93\u5165\u5b57\u7b26\u4e32 \uff0c\u6bd4\u5982\u8f93\u5165\u6846 \u7ec4\u5408\u952e element.keyCombo(comboString)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#23","title":"2.3\u3001\u6846\u67b6\u5c01\u88c5","text":"\u4ee3\u7801\u793a\u4f8b\uff1a # \u8be6\u7ec6\u4ee3\u7801\u8bf7\u67e5\u770b src/dogtail_utils.py\nclass DogtailUtils:\ndef __init__(self, name=None, description=None):\nself.name = name\nself.description = description\nself.obj = root.application(self.name, self.description)\ndef app_element(self, *args, **kwargs):\n\"\"\"\n \u83b7\u53d6app\u5143\u7d20\u7684\u5bf9\u8c61\n :return: \u5143\u7d20\u7684\u5bf9\u8c61\n \"\"\"\nreturn self.obj.child(*args, **kwargs, retry=False)\ndef element_center(self, element) -> tuple:\n\"\"\"\n \u83b7\u53d6\u5143\u7d20\u7684\u4e2d\u5fc3\u4f4d\u7f6e\n :param element:\n :return: \u5143\u7d20\u4e2d\u5fc3\u5750\u6807\n \"\"\"\n_x, _y, _w, _h = self.app_element(element).extents\n_x = _x + _w / 2\n_y = _y + _h / 2\nreturn _x, _y\n \u6846\u67b6\u63d0\u4f9b\u7684\u63a5\u53e3\u975e\u5e38\u7b80\u6d01\uff0c\u5728\u8c03\u7528\u65f6\uff1a self.dog.element_center(\"\u64ad\u653e\")\n \u8fd9\u6837\u5c31\u80fd\u83b7\u53d6\u5230\u6b64\u5143\u7d20\u7684\u4e2d\u5fc3\u5750\u6807\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_5","title":"\u516d\u3001\u6807\u7b7e\u5316\u7ba1\u7406","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_4","title":"1\u3001\u6807\u7b7e\u8bf4\u660e","text":"\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u811a\u672c ID\uff1a\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c/\u51fd\u6570 ID\uff1b PMS\u7528\u4f8bID\uff1aPMS \u4e0a\u5bf9\u5e94\u7684\u7528\u4f8b ID\uff08\u7528\u4f8b\u5e93 ID\uff09\uff1b \u9ed8\u8ba4\u4f7f\u7528\u7528\u4f8b\u5e93 ID\uff0c\u5bf9\u4e8e\u6682\u65f6\u6ca1\u6709\u4f7f\u7528\u7528\u4f8b\u5e93\u7ba1\u7406\u7528\u4f8b\u7684\u9879\u76ee\uff0c\u53ef\u4ee5\u4f7f\u7528\u4ea7\u54c1\u5e93\u7528\u4f8b ID\uff1b \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1aFUNC\uff08\u529f\u80fd\uff09\u3001API\uff08\u63a5\u53e3\uff09\u3001BASELINE\uff08\u57fa\u7ebf\uff09\u3001PERF\uff08\u6027\u80fd\uff09\u3001STR\uff08\u538b\u529b\uff09\u3001SEC\uff08\u5b89\u5168\uff09\u3001CTS\uff08\u517c\u5bb9\u6027\uff09 \u4e0a\u7ebf\u5bf9\u8c61\uff1aCICD\uff0c\u8868\u793a\u4e0a\u7ebf\u5230 CICD \u6d41\u6c34\u7ebf\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u53ef\u4e00\u952e\u751f\u6210 case_list.csv \u6587\u4ef6\uff0c\u7528\u4e8e\u5bfc\u5165\u5230\u660e\u9053\u4e91 AT \u7528\u4f8b\u5217\u8868\u4e2d\u63a7\u5236 CICD \u8dd1\u6d4b\u8303\u56f4\uff1b \u6d4b\u8bd5\u7ea7\u522b\uff1aC1 / C2 / C3 / C4\uff0c\u5177\u4f53\u5b9a\u4e49\u53c2\u8003\u6d41\u6c34\u7ebf\u4f7f\u7528\u6307\u5bfc\uff1b \u8df3\u8fc7\u539f\u56e0\uff1askip-XXX\uff0c\u7528\u4e8e\u63a7\u5236\u7528\u4f8b\u662f\u5426\u6267\u884c\uff1b \u786e\u8ba4\u4fee\u590d\uff1afixed-XXX\uff0c\u7528\u4e8e\u6807\u8bb0\u7528\u4f8b\u7684\u4fee\u590d\u72b6\u6001\uff08\u540e\u9762\u8be6\u7ec6\u8bb2\u89e3\u7528\u6cd5\uff09\uff1b \u5e9f\u5f03\u7528\u4f8b\uff1aremoved-\u5df2\u5e9f\u5f03\uff0c\u7528\u4e8e\u6807\u8bb0\u5df2\u7ecf\u5e9f\u5f03\u7684\u7528\u4f8b\uff0c\u6b64\u7528\u4f8b\u6807\u7b7e\u4e0d\u4f1a\u88ab\u6dfb\u52a0\uff0c\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff1b \u793a\u4f8b\uff1a \u811a\u672cID PMS\u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u4e0a\u7ebf\u5bf9\u8c61 \u6d4b\u8bd5\u7ea7\u522b \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b ... 001 679537 L1 FUNC CICD C1 skip-XXX fixed-XXX removed-\u5df2\u5e9f\u5f03 ..."},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_4","title":"2\u3001\u64cd\u4f5c\u6b65\u9aa4","text":"2.1\u3001\u5728\u5b50\u9879\u76ee\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u4ee5\u7528\u4f8b\u7684 py \u6587\u4ef6\u9664\u53bb\u9996\u5b57\u7b26\u4e32 \"test_\" \u548c\u7528\u4f8b\u5e8f\u53f7\u540e\u7684\u5b57\u7b26\u4e32\u4f5c\u4e3a csv \u7684\u6587\u4ef6\u540d\u3002 \u4f8b\u5982: \u76f8\u518c\u7684\u7528\u4f8b\u6587\u4ef6\u4e3a test_album_xxx.py\uff0cxxx \u8868\u793a\u4efb\u610f\u4e09\u4f4d\u6570\u5b57\u4ee3\u8868\u7528\u4f8b\u5e8f\u53f7\uff0c\u6b64\u65f6 csv \u6587\u4ef6\u540d\u5c31\u5e94\u4e3a album.csv\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u6240\u6709 csv \u6587\u4ef6\u5efa\u8bae\u653e\u5728\u4e00\u4e2a tags \u76ee\u5f55\u4e0b\u3002 \u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 2.2\u3001\u7b2c\u4e00\u5217\u4e3a\u811a\u672c ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b\u7528\u4f8b\u6807\u7b7e\u53ef\u4ee5\u65e0\u5e8f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_2","title":"3\u3001\u589e\u52a0\u8bf4\u660e","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_1","title":"3.1\u3001\u8df3\u8fc7\u7528\u4f8b","text":"\u4f20\u7edf\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668(@pytest.mark.skip)\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a; \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#311","title":"3.1.1\u3001\u56fa\u5b9a\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u7b7e\u5f00\u5934\u4e3a \u201cskip-XXX\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\uff0c\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\u5219\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u7b7e\u4e3a SKIPED\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#312","title":"3.1.2\u3001\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skipif_platform-aarch64&mips64 \u67d0\u4e9b\u7528\u4f8b\u4f1a\u56e0\u4e3a\u4e0d\u540c\u7684\u73af\u5883\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\uff0c\u5e38\u89c1\u7684\u573a\u666f\u4e3a\u5728\u4e0d\u540c\u67b6\u6784\u4e0a\u5224\u65ad\u662f\u5426\u6267\u884c\uff0c\u8df3\u8fc7\u7684\u539f\u56e0\u6807\u7b7e\u4e3a \u201cskipif_platform-\u201d \u52a0\u67b6\u6784\u540d\uff0c\u591a\u4e2a\u67b6\u6784\u4e4b\u95f4\u4f7f\u7528 \u201c&\u201d \u62fc\u63a5\uff1b \u4ee5\u4e0a\u4f8b\u5b50\u4e3a\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u5224\u65ad\u5f53\u524d\u67b6\u6784\u662f\u5426\u4e3a arrch64 \u6216\u8005 mips64\uff0c\u82e5\u662f\uff0c\u5219\u8df3\u8fc7\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u82e5\u5426\u5219\u6267\u884c\u7528\u4f8b\uff1b \u76ee\u524d\u6846\u67b6\u9ed8\u8ba4\u4ec5\u652f\u6301\u67b6\u6784\u7684\u6761\u4ef6\u5224\u65ad\uff0c\u4f46\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u903b\u8f91\u652f\u6301\u81ea\u5b9a\u4e49\u6dfb\u52a0\u3002 \u5728\u9879\u76ee\u76ee\u5f55\u8def\u5f84\u4e0b\u5b58\u5728\u6587\u4ef6 setting/skipif.py\uff0c\u6240\u6709\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u7684\u51fd\u6570\u5199\u5728\u6b64\u6587\u4ef6\u4e2d\u3002 \u9ed8\u8ba4\u67b6\u6784\u5224\u65ad\u4f8b\u5b50\uff1a def skipif_platform(args: str):\n\"\"\"\u5e73\u53f0\u8df3\u8fc7\"\"\"\n_skip_key = args.split(\"&\")\nfor key in _skip_key:\nif GlobalConfig.SYS_ARCH == key:\nreturn True\nreturn False\n \u65b9\u6cd5\u7f16\u5199\u89c4\u8303\uff1a \u65b9\u6cd5\u540d\u5fc5\u987b\u4ee5 skipif \u5f00\u5934\uff1b \u65b9\u6cd5\u5fc5\u987b\u6709\u8fd4\u56de\u7ed3\u679c\u5e76\u4e14\u4e3a\u5e03\u5c14\u503c\uff08True \u4ee3\u8868\u8df3\u8fc7\uff0cFalse \u4ee3\u8868\u4e0d\u8df3\u8fc7\uff09\uff1b \u65b9\u6cd5\u53ea\u80fd\u6709\u4e00\u4e2a\u5165\u53c2\uff1b \u5728 csv \u6587\u4ef6\u8df3\u8fc7\u539f\u56e0\u4e00\u680f\u4e2d\u586b\u5199\u4e3a \u201c{\u51fd\u6570\u540d}-{\u53c2\u6570}\u201d\uff0c\u4f8b\u5982\uff1askipif_platform-aarch64\uff1b\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u4f1a\u4ee5\u7b2c\u4e00\u4e2a \u201c-\u201d \u8fdb\u884c\u5206\u5272\uff0c\u622a\u53d6\u7684\u5de6\u4fa7\u5b57\u7b26\u4e32\u4f5c\u4e3a\u51fd\u6570\u540d\uff0c\u5728 skipif.py \u6587\u4ef6\u4e2d\u67e5\u627e\u662f\u5426\u6709\u540c\u540d\u51fd\u6570\uff0c\u5e76\u5c06\u622a\u53d6\u7684\u53f3\u4fa7\u4f5c\u4e3a\u53c2\u6570\u4f20\u9012\u7ed9\u8be5\u51fd\u6570\uff0c\u901a\u8fc7\u83b7\u53d6\u8be5\u51fd\u6570\u8fd4\u56de\u7684\u5e03\u5c14\u503c\uff0c\u8fd4\u56de True\uff0c\u5219\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u8fd4\u56de False\uff0c\u5219\u6267\u884c\u8be5\u7528\u4f8b\u3002 \u82e5\u51fd\u6570\u9700\u8981\u591a\u4e2a\u53c2\u6570\uff0c\u53ef\u81ea\u5b9a\u4e49\u591a\u4e2a\u53c2\u6570\u4e4b\u95f4\u7684\u8fde\u63a5\u7b26\uff0c\u8fde\u63a5\u7b26\u53f7\u4e0d\u53ef\u4f7f\u7528\u4e0b\u5212\u7ebf\u548c\u9017\u53f7\uff0c\u63a8\u8350\u7edf\u4e00\u4f7f\u7528 & \u7b26\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32","title":"3.2\u3001\u786e\u8ba4\u4fee\u590d","text":"\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7528\u4f8b\u4fee\u590d\u540e\uff0c\u4f46\u4e0d\u80fd\u7acb\u5373\u5220\u9664\u8df3\u8fc7\u539f\u56e0\uff08skip-XXX\uff09\u7684\u7528\u4f8b\uff0c\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u786e\u8ba4\u4fee\u590d\u201d\uff0c\u4f5c\u4e3a\u6807\u8bb0\u8be5\u7528\u4f8b\u662f\u5426\u5df2\u7ecf\u4fee\u590d\uff0c\u56fa\u5b9a\u586b\u5165\u5b57\u6bb5\u4e3a \u201cfixed-\u5df2\u4fee\u590d\u201d\u3002\u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u5373\u4f7f\u540c\u65f6\u6807\u8bb0\u4e86 skip-XXX \u4e5f\u4f1a\u6b63\u5e38\u6267\u884c\u3002 \u793a\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d \u3010\u540c\u65f6\u6807\u8bb0\u4e86skip \u548c fixed\uff0c\u4f46\u4ecd\u7136\u60f3\u8981\u8df3\u8fc7\u7528\u4f8b\u3011 \u5f53 \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u540c\u65f6\u586b\u5165\u540e\uff0c\u547d\u4ee4\u884c\u4f20\u9012\u53c2\u6570 --ifixed yes\uff0c\u5219\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\u8be5\u6761\u7528\u4f8b\u3002 python3 manage.py run --ifixed yes\n \u770b\u5230\u8fd9\u91cc\u6709\u4e9b\u540c\u5b66\u53ef\u80fd\u8981\u95ee\u4e86\uff0c\u6211\u60f3\u6062\u590d\u8df3\u8fc7\u6267\u884c\uff0c\u76f4\u63a5\u628a skip-XXX \u8fd9\u4e00\u5217\u6807\u7b7e\u5220\u6389\u4e0d\u5c31\u597d\u4e86\uff0c\u8fd8\u641e\u4ec0\u4e48\u786e\u8ba4\u4fee\u590d\u5e72\u5565\uff1f \u8fd9\u91cc\u7ed9\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u89e3\u91ca\u4e00\u4e0b\uff1a \uff08\u4ee5\u4e0b\u6d41\u6c34\u7ebf\u6307\u7684\u662f\u6bcf\u65e5\u6784\u5efa\u7684\u6d41\u6c34\u7ebf\uff0c\u8dd1 AT \u7684\u5168\u91cf\u7528\u4f8b\uff09 \u9996\u5148\uff0c\u6d41\u6c34\u7ebf\u4e0a\u8dd1\u7684\u662f AT \u5386\u53f2 Tag\uff0c\u8df3\u8fc7\u7528\u4f8b\u7684\u6807\u7b7e(skip-XXX) \u662f\u5728\u6700\u65b0\u7684\u4ee3\u7801\u4e0a\u63d0\u4ea4\u7684\uff0c\u6211\u4eec\u91c7\u7528\u6700\u65b0\u7684 csv \u6587\u4ef6\u8986\u76d6\u5386\u53f2 csv \u6587\u4ef6\u7684\u8bbe\u8ba1\u6765\u5b9e\u73b0\u4e86\u5bf9\u5386\u53f2 Tag \u4e0a\u7528\u4f8b\u7684\u8df3\u8fc7\uff1b \u7136\u540e\uff0c\u5728\u65e5\u5e38\u8df3\u8fc7\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u540c\u65f6\u4e5f\u5728\u4fee\u590d\u4e00\u4e9b\u7528\u4f8b\uff0c\u4fee\u590d\u540e\u7684\u8fd9\u4e9b\u7528\u4f8b\u5728\u672c\u5730\u8c03\u8bd5\u7684\u65f6\u5019\u6211\u4eec\u4e0d\u5e0c\u671b\u7ee7\u7eed\u8df3\u8fc7\uff0c\u4f46\u662f\u6b64\u65f6\uff0c\u4fee\u590d\u7684\u8fd9\u4e9b\u7528\u4f8b\u53ef\u80fd\u8fd8\u4e0d\u7a33\u5b9a\uff0c\u4e0d\u9002\u5408\u9a6c\u4e0a\u653e\u5230\u6d41\u6c34\u7ebf\u53bb\u8dd1\uff0c\u4e5f\u5c31\u662f\u8bf4\u6d41\u6c34\u7ebf\u4e0a\u6211\u4eec\u662f\u5e0c\u671b\u4ed6\u7ee7\u7eed\u8df3\u8fc7\u7684\uff0c\u56e0\u6b64\uff0c\u54b1\u4e0d\u80fd\u76f4\u63a5\u628a skip-XXX \u5e72\u6389\uff1b \u8fd9\u91cc\u5c31\u77db\u76fe\u4e86\uff0c\u4e00\u4e2a\u9700\u6c42\u662f\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u53e6\u4e00\u4e2a\u9700\u6c42\u53c8\u4e0d\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u600e\u4e48\u529e\u5462\uff1f \u6211\u4eec\u4f7f\u7528\u201c\u786e\u8ba4\u4fee\u590d\u201d\u6765\u6807\u8bb0\u8fd9\u6761\u7528\u4f8b\u5df2\u7ecf\u4fee\u590d\u4e86\uff0c\u8fd9\u6837\u4f60\u672c\u5730\u8c03\u8bd5\u7528\u4f8b\u7684\u65f6\u5019\u8fd9\u6761\u5df2\u4fee\u590d\u7684\u7528\u4f8b\u662f\u4f1a\u6267\u884c\u7684\uff0c\u540c\u65f6\u5728\u6d41\u6c34\u7ebf\u4e0a\u5c06 --ifixed yes \u53c2\u6570\u52a0\u4e0a\uff0c\u90a3\u4e48\u6d41\u6c34\u7ebf\u4e0a\u6267\u884c\u65f6\u8fd9\u6761\u7528\u4f8b\u4ecd\u7136\u662f\u8df3\u8fc7\u7684\u72b6\u6001\uff0c\u540e\u7eed\u4f60\u6253 Tag \u7684\u65f6\u5019\uff0c\u628a \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u7684\u6807\u7b7e\u5168\u90e8\u5220\u6389\u5c31\u53ef\u4ee5\u4e86\u3002 \u8fd9\u5c31\u662f\u201c\u786e\u8ba4\u4fee\u590d\u201d\u8fd9\u4e2a\u6807\u7b7e\u7684\u80cc\u666f\uff0c\u9700\u8981\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u54c1\u4e00\u54c1\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#33","title":"3.3\u3001\u5e9f\u5f03\u7528\u4f8b","text":"\u9488\u5bf9\u67d0\u4e9b\u7528\u4f8b\uff0c\u7531\u4e8e\u9700\u6c42\u53d8\u66f4\uff0c\u73af\u5883\u5f71\u54cd\u6216\u8bc4\u4f30\u4e0d\u518d\u9002\u7528\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u65f6\uff0c\u7528\u4f8b\u9700\u8981\u5e9f\u5f03\uff0c\u5219\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u5e9f\u5f03\u7528\u4f8b\u201d\uff0c\u8be5\u5217\u5b58\u5728 \u201cremoved-{\u5e9f\u5f03\u539f\u56e0}\u201d\uff0c\u5219\u7528\u4f8b\u4e0d\u4f1a\u6267\u884c\u3002 \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d removed-\u5df2\u5e9f\u5f03 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_2","title":"4\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u4e0a\u9762\u4ecb\u7ecd Pytest \u6846\u67b6\u63d0\u4f9b\u7684\u6807\u7b7e\u529f\u80fd mark\uff0c\u4f7f\u7528\u65f6\u9700\u8981\u4e3a\u6bcf\u4e00\u4e2a\u7528\u4f8b\u6dfb\u52a0\u6807\u7b7e\u88c5\u9970\u5668\uff0c\u5219\u64cd\u4f5c\u590d\u6742\uff0c\u53ef\u7ef4\u62a4\u6027\u5dee\uff0c\u5176\u6839\u672c\u95ee\u9898\u5c31\u662f\u6807\u7b7e\u5206\u6563\u5728\u6bcf\u4e00\u6761\u7528\u4f8b\u7684\u88c5\u9970\u5668\u4e0a\uff0c\u96be\u4ee5\u96c6\u4e2d\u7ef4\u62a4\uff1b\u4e8e\u662f\u4e4e\u5c06\u6240\u6709\u6807\u7b7e\u4f7f\u7528 csv \u6587\u4ef6\u8fdb\u884c\u96c6\u4e2d\u7ba1\u7406\uff0c\u5e76\u901a\u8fc7 Pytest \u7684\u94a9\u5b50\u51fd\u6570\uff0c\u8bfb\u53d6 csv \u6587\u4ef6\uff0c\u52a8\u6001\u6dfb\u52a0\u6807\u7b7e\u5230\u7528\u4e2d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5csv","title":"5\u3001CSV\u6587\u4ef6\u683c\u5f0f","text":"\u6b64\u914d\u7f6e\u6587\u4ef6\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u6807\u7b7e\u6570\u636e\uff0c\u4e14\u8981\u65b9\u4fbf\u80fd\u4f7f\u7528Excel\u6253\u5f00\u8fdb\u884c\u7f16\u8f91\u67e5\u770b\uff0c\u66f4\u91cd\u8981\u7684\u662f\u6211\u4eec\u4e0d\u60f3\u5f15\u5165\u4e09\u65b9\u4f9d\u8d56\uff0cCSV \u6587\u4ef6\u51e0\u4e4e\u662f\u552f\u4e00\u80fd\u6ee1\u8db3\u6240\u6709\u7684\u8981\u6c42\u7684\u6587\u4ef6\u683c\u5f0f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_6","title":"\u4e03\u3001\u65e5\u5fd7\u7cfb\u7edf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_5","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e YouQu \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u64cd\u4f5c\u65b9\u6cd5\u5c01\u88c5\u5199\u6cd5\uff0c\u901a\u5e38\u662f\u8fd9\u6837\u7684\uff1a\u7c7b\u91cc\u9762\u4e00\u4e2a\u51fd\u6570\u53ea\u5305\u542b\u4e00\u4e2a\u64cd\u4f5c\u6216\u591a\u6b21\u8c03\u7528\u7684\u4e00\u7cfb\u5217\u53ef\u5408\u5e76\u7684\u64cd\u4f5c\uff1b \u4f20\u7edf\u7684\u65e5\u5fd7\u8f93\u51fa\u65b9\u5f0f\uff0c\u9700\u8981\u5728\u6bcf\u4e2a\u51fd\u6570\u91cc\u9762\u4e3b\u52a8\u7f16\u5199\u65e5\u5fd7\u8f93\u51fa\u4ee3\u7801 \uff0c\u4f8b\u5982\uff1a class XXXWidget:\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\nlogger.info(\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\")\n...\n# \u7701\u7565\u4ee3\u7801\u90e8\u5206\n \u4e00\u4e2a\u51fd\u6570\u91cc\u9762\u81f3\u5c11\u5305\u542b\u4e00\u6761\u65e5\u5fd7\u4fe1\u606f\uff0c\u5982\u679c\u6bd4\u8f83\u590d\u6742\u64cd\u4f5c\u6b65\u9aa4\uff0c\u53ef\u80fd\u5305\u542b\u591a\u6761\u65e5\u5fd7\u4fe1\u606f\uff1b \u4e00\u4e2a\u5e94\u7528\u542b\u6709\u5927\u91cf\u7684\u64cd\u4f5c\u51fd\u6570\uff0c\u4e5f\u5c31\u662f\u8bf4\u6211\u4eec\u9700\u8981\u5199\u5927\u91cf\u7684\u65e5\u5fd7\u4ee3\u7801\uff1b \u901a\u8fc7\u7ecf\u9a8c\u89c2\u5bdf\uff0c\u6211\u4eec\u53d1\u73b0\uff0c\u51fd\u6570\u8bf4\u660e\u4ee5\u53ca\u51fd\u6570\u64cd\u4f5c\u65e5\u5fd7\uff0c\u5177\u6709\u8f83\u9ad8\u7684\u91cd\u590d\u5ea6\uff08\u4ece\u4e0a\u9762\u7684\u4f8b\u5b50\u4e5f\u53ef\u4ee5\u770b\u51fa\u6765\uff09\uff0c\u56e0\u6b64\u6211\u4eec\u5927\u80c6\u7684\u8bbe\u60f3\uff0c\u80fd\u4e0d\u80fd\u57fa\u4e8e\u6846\u67b6\u6267\u884c\u65f6\uff0c\u81ea\u52a8\u7684\u5c06\u51fd\u6570\u8bf4\u660e\u4f5c\u4e3a\u65e5\u5fd7\u6253\u5370\u51fa\u6765\uff0c\u4ece\u800c\u51cf\u5c11\u5927\u91cf\u65e5\u5fd7\u4ee3\u7801\u91cf\u548c\u91cd\u590d\u7f16\u5199\uff0c\u90a3\u771f\u662f\u5999\u554a~\u3002 \u57fa\u4e8e\u6b64\u201c\u5929\u771f\u201d\u7684\u60f3\u6cd5\uff0c\u6211\u4eec\u8bbe\u8ba1\u51fa\u4e86 youqu \u7684\u65e5\u5fd7\u7cfb\u7edf\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_5","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u6838\u5fc3\u539f\u7406\uff1a \u901a\u8fc7\u7ed9\u7c7b\u52a0\u4e0a\u4e00\u4e2a\u88c5\u9970\u5668 @log\uff0c\u52a8\u6001\u7ed9\u8be5\u7c7b\u4e0b\u6240\u6709\u7684\u51fd\u6570\u53ca\u7236\u7c7b\u51fd\u6570\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668 @_trace\uff0c\u5728\u6b64\u88c5\u9970\u5668\u4e2d\u6211\u4eec\u80fd\u52a8\u6001\u7684\u6355\u83b7\u6240\u8c03\u7528\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff08func.__doc__\uff09\uff0c\u901a\u8fc7\u65e5\u5fd7\u8f93\u51fa\u5668\u5c06\u5176\u8f93\u51fa\u5373\u53ef\u3002 \u5b9e\u73b0\u6b65\u9aa4\uff1a \u901a\u8fc7 inspect.getmembers \u83b7\u53d6\u88ab\u88c5\u9970\u7684\u7c7b\u4e0b\u6240\u6709\u51fd\u6570\uff0c\u5305\u542b\u9759\u6001\u65b9\u6cd5\uff0c\u7c7b\u65b9\u6cd5\uff0c\u5b9e\u4f8b\u65b9\u6cd5\uff1b \u901a\u8fc7 setattr(\u7c7b, \u65b9\u6cd5, _trace\uff09 \u7684\u65b9\u5f0f\uff0c\u7ed9\u7b26\u5408\u6761\u4ef6\u7684\u51fd\u6570\uff0c\u52a8\u6001\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_3","title":"3\u3001\u65e5\u5fd7\u914d\u7f6e","text":"[log_cli]\n;\u65e5\u5fd7\u76f8\u5173\u914d\u7f6e\uff08\u4e0d\u6253\u5370\u6784\u9020\u51fd\u6570\u548c\u9b54\u6cd5\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff09\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = INFO\n# ============= \u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u914d\u7f6e ================\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u5f00\u5934\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7, \u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_STARTSWITH = Assert\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u7ed3\u5c3e\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_ENDSWITH = Widget\n;\u652f\u6301\u7c7b\u540d\u5305\u542b xxx \u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_CONTAIN = ShortCut\n# ==============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_3","title":"4\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u5728\u5e94\u7528\u5e93 widget \u65b9\u6cd5\u5e93\u91cc\u9762\uff0c\u53ea\u9700\u8981\u5728\u51fa\u53e3\u6587\u4ef6\u52a0\u4e0a\u7c7b\u88c5\u9970\u5668\uff0c\u5c31\u53ef\u4ee5\u5b9e\u73b0\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u4e86\uff1b # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6ce8\u610f\uff0c\u662f\u7c7b\u88c5\u9970\u5668\u3002 \u5b9e\u4f8b\uff1a # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\n@classmethod\ndef find_dfm_image(cls, *elements, multiple=False, rate=0.9):\n\"\"\"\n \u67e5\u627e\u56fe\u7247 {{elements}}.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e {{rate}} \u7684\u5750\u6807\n :param elements:\n :param multiple:\n :return:\n \"\"\"\nelement = tuple(map(lambda x: f\"{Config.PIC_RES_PATH}/{x}\", elements))\nreturn cls.find_image(*element, multiple=multiple)\n \u8c03\u7528\u65b9\u6cd5\u65f6\uff1a DfmWidget.find_dfm_image(\"dfm_001\")\n \u81ea\u52a8\u8f93\u51fa\u7684\u65e5\u5fd7\uff1a >> x86_64-uos-6: 02/28 17:48:47 | INFO | logger_utils: [find_dfm_image]: \u67e5\u627e\u56fe\u7247 dfm_001.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e 0.9 \u7684\u5750\u6807\n \u52a0\u4e0a\u88c5\u9970\u5668 @log \u4e4b\u540e\uff0c\u65b9\u6cd5\u5c42\u6240\u6709\u7684\u51fd\u6570\uff08\u5305\u62ec\u5b9e\u4f8b\u65b9\u6cd5\u3001\u7c7b\u65b9\u6cd5\u3001\u9759\u6001\u65b9\u6cd5\uff09\u90fd\u4e0d\u9700\u8981\u518d\u5199\u65e5\u5fd7\u4ee3\u7801\uff0c\u6267\u884c\u7684\u65f6\u5019\u4f1a\u81ea\u52a8\u8f93\u51fa\uff0c\u5e76\u4e14\u6240\u6709\u8c03\u7528\u7684\u65b9\u6cd5\u4f1a\u4ee5 allure.step \u7684\u65b9\u5f0f\uff0c\u5c55\u793a\u5728 allure \u62a5\u544a\u4e2d\uff0c\u5728\u62a5\u544a\u4e2d\u66f4\u80fd\u4e00\u76ee\u4e86\u7136\u7684\u770b\u5230\u7528\u4f8b\u6267\u884c\u6b65\u9aa4\u3002 \u3010\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\u3011 \u901a\u8fc7\u89c2\u5bdf\u524d\u9762\u7684\u4f8b\u5b50\uff0c\u7ec6\u5fc3\u7684\u540c\u5b66\u53ef\u80fd\u8fd8\u53d1\u73b0\u4e86\u4e00\u4e2a\u5c0f\u7ec6\u8282\uff1a\u51fd\u6570\u529f\u80fd\u8bf4\u660e\u4e2d\uff0c\u4e24\u5bf9\u5927\u62ec\u53f7\u4e2d\u7684\u5185\u5bb9 {{elements}} \u4f5c\u4e3a\u53d8\u91cf\u8f93\u51fa\u51fa\u6765\u4e86\uff1b \u6ca1\u9519\uff0c\u8fd9\u5c31\u662f\u6211\u4eec\u53c2\u8003Django \u548c jinja2 \u7684\u6a21\u677f\u8bed\u6cd5\u8bbe\u8ba1\u51fa\u7684\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\uff0c\u4f7f\u7528\u65b9\u6cd5\u5f88\u7b80\u5355\uff0c\u7528\u4e24\u5bf9\u5927\u62ec\u53f7\u628a\u51fd\u6570\u7684\u53c2\u6570\u62ec\u8d77\u6765\uff0c\u8fd9\u6837\u5728\u65e5\u5fd7\u8f93\u51fa\u7684\u65f6\u5019\u5c31\u80fd\u628a\u8c03\u7528\u51fd\u6570\u65f6\u53c2\u6570\u7684\u503c\u8f93\u51fa\u51fa\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_7","title":"\u516b\u3001\u73af\u5883\u90e8\u7f72","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_6","title":"1\u3001\u539f\u5219","text":"YouQu \u7684\u73af\u5883\u4f9d\u8d56\u4e00\u76f4\u575a\u6301 2 \u4e2a\u539f\u5219\uff1a \u6700\u5c0f\u73af\u5883\u4f9d\u8d56\u539f\u5219 \u6709\u4e9b\u540c\u5b66\u5199\u4e00\u4e9b\u529f\u80fd\uff0c\u9996\u5148\u60f3\u5230\u7684\u5c31\u662f\u53bb\u641c\u7d22\u5f15\u64ce\u641c\u4e00\u4e0b\uff0c\u770b\u6709\u6ca1\u6709\u73b0\u6210\u7684\u5de5\u5177\u6216\u8005\u4ee3\u7801\u76f4\u63a5\u80fd\u7528\uff0c\u7f8e\u5176\u540d\u66f0\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\uff0c\u522b\u4eba\u5df2\u7ecf\u9020\u597d\u4e86\u8f6e\u5b50\u54b1\u4eec\u5c31\u4e0d\u8981\u91cd\u590d\u53bb\u9020\u4e86\uff0c\u7136\u540e\u4e00\u5207\u4f3c\u4e4e\u90fd\u53d8\u5f97\u90a3\u4e48\u7684\u7406\u6240\u5e94\u5f53\u3002 \u5f53\u7136\u8fd9\u6837\u505a\u65e0\u53ef\u539a\u975e\uff0c\u6211\u76f8\u4fe1\u6709\u8fd9\u6837\u60f3\u6cd5\u5e76\u4e14\u4e00\u76f4\u8df5\u884c\u8fd9\u6837\u505a\u6cd5\u7684\u540c\u5b66\u4e0d\u5728\u5c11\u6570\uff0c\u4f46\u8fd9\u6837\u505a\u6709\u4e00\u4e2a\u5f88\u4e25\u91cd\u7684\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f60\u5199\u4e00\u4e2a\u5927\u578b\u9879\u76ee\u65f6\uff0c\u4f60\u4f1a\u5f15\u5165\u975e\u5e38\u975e\u5e38\u975e\u5e38\u591a\u7684\u4f9d\u8d56\uff0c\u6bd4\u5982\u8981\u505a\u4e2a\u63a5\u53e3\u8bf7\u6c42\u8981\u7528 requests\u3001\u8bfb\u5199\u4e2a\u6570\u636e\u7528 pandas\u3001\u5199\u4e2a\u8868\u683c\u7528 pyopenxl\u3001\u89e3\u6790\u4e2a\u6587\u672c\u8981\u7528\u8fd9\u4e2a\u90a3\u4e2a\u4e09\u65b9\u5e93 ... \u3002 \u6211\u8ba4\u4e3a\u8fd9\u662f\u975e\u5e38\u4e0d\u597d\u7684\u4e60\u60ef\uff0c\u5728\u5b9e\u73b0\u4e00\u4e2a\u529f\u80fd\u7684\u65f6\u5019\uff0c\u9996\u5148\u6211\u4eec\u5e94\u8be5\u53bb\u60f3\u81ea\u5df1\u600e\u4e48\u6837\u53bb\u5b9e\u73b0\uff0c\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff1b \u5982\u679c\u4f60\u4e0d\u4f1a\uff0c\u4f60\u53ef\u4ee5\u53bb\u5b66\u4e60\u4e09\u65b9\u5e93\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u522b\u4eba\u4e09\u65b9\u5e93\u4e5f\u662f\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\u7684\uff0c\u4e3a\u4ec0\u4e48\u54b1\u4eec\u4e0d\u884c\u5462\uff1b\u5982\u679c\u522b\u4eba\u7684\u4f60\u5b9e\u5728\u662f\u770b\u4e0d\u61c2\uff0c\u60f3\u5c3d\u4e00\u5207\u529e\u6cd5\u786e\u5b9e\u505a\u4e0d\u51fa\u6765\uff0c\u90a3\u518d\u8003\u8651\u5f15\u5165\u8fd9\u4e2a\u4e09\u65b9\u5e93\uff0c\u6211\u8ba4\u4e3a\u8fd9\u6837\u662f\u6ca1\u95ee\u9898\u7684\uff0c\u6bd5\u7adf\u54b1\u4eec\u6bb5\u4f4d\u8fd8\u4e0d\u591f\uff0c\u4f46\u5e0c\u671b\u5c06\u6765\u6709\u4e00\u5929\u6211\u4eec\u53ef\u4ee5\u3002 \u8fd9\u6837\u7684\u505a\u6cd5\u624d\u5e94\u8be5\u662f\u201c\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\u201d\u6b63\u786e\u7684\u64cd\u4f5c\u3002\u4e0d\u4f1a\u6ca1\u5173\u7cfb\uff0c\u770b\u770b\u522b\u4eba\u662f\u600e\u4e48\u5b9e\u73b0\u7684\uff0c\u81ea\u5df1\u518d\u6478\u7d22\u7740\u5199\u51fa\u6765\uff0c\u8fd9\u6837\u81ea\u5df1\u624d\u80fd\u6709\u6240\u63d0\u9ad8\uff0c\u4e0d\u7136\u4f60\u5c31\u53ea\u4f1a\u7528\u522b\u4eba\u7684\u4e1c\u897f\uff1b\u90a3\u4e9b\u5632\u7b11\u3001\u6279\u8bc4\u6211\u4eec\u91cd\u590d\u9020\u8f6e\u5b50\u7684\u4eba\uff0c\u5148\u60f3\u60f3\u81ea\u5df1\u4f1a\u9020\u8f6e\u5b50\u5417\u3002 \u672c\u7740\u81ea\u5df1\u5b9e\u73b0\u80fd\u5b9e\u73b0\u7684\u4e00\u5207\u7684\u539f\u5219\uff0cYouQu \u6846\u67b6\u505a\u5230\u4e86\u975e\u5e38\u5c11\u7684\u73af\u5883\u4f9d\u8d56\uff0c\u800c\u4e14\u6211\u4eec\u4ecd\u5728\u4e0d\u65ad\u52aa\u529b\uff0c\u51cf\u5c11\u73af\u5883\u90e8\u7f72\u7684\u4f9d\u8d56\u3002 \u6700\u5c0f\u4ed3\u5e93\u4f53\u79ef\u539f\u5219 \u5927\u6587\u4ef6\u4e0d\u80fd\u4e0a\u4f20\u5230\u5de5\u7a0b\u91cc\u9762\uff0c\u4fdd\u6301\u6574\u4e2a\u5de5\u7a0b\u7684\u8f7b\u91cf\u5316\uff0c\u8fd9\u6837\u5728\u514b\u9686\u4ee3\u7801\u7684\u65f6\u5019\u624d\u80fd\u975e\u5e38\u5feb\u901f\u65b9\u4fbf\u4f7f\u7528\uff0c\u6211\u4eec\u89c1\u8fc7\u4e00\u4e2a AT \u5de5\u7a0b clone \u5927\u5c0f\u8fbe\u5230\u597d\u51e0\u4e2a G\uff0c\u7b80\u76f4\u4e0d\u53ef\u601d\u8bae\u3002 \u5176\u5b9e\u4ee3\u7801\u6587\u4ef6\u7684\u5927\u5c0f\u662f\u5f88\u5c0f\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u7eaf\u5199\u4ee3\u7801\u968f\u4fbf\u5199\u5de5\u7a0b\u4e5f\u4e0d\u4f1a\u592a\u5927\uff0c\u800c\u6587\u6863\uff08\u5305\u542b\u63d2\u56fe\uff09\u7b49\u8d44\u6e90\u5374\u662f\u5f88\u5360\u7a7a\u95f4\u3002 \u56e0\u6b64\u6211\u4eec\u9009\u62e9\u5c06 YouQu \u7684\u6587\u6863\u5de5\u7a0b\u5355\u72ec\u8fc1\u51fa\u5230\u72ec\u7acb\u7684\u4ed3\u5e93 youqu-docs \u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_6","title":"2\u3001\u5b89\u88c5","text":"\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u8fd0\u884c env.sh \u5373\u53ef\u3002 bash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_4","title":"3\u3001\u5b9a\u5236\u4f9d\u8d56","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_2","title":"3.1\u3001\u65b0\u589e\u4f9d\u8d56","text":"\u5982\u679c\u5e94\u7528\u5e93\u8fd8\u9700\u8981\u5176\u4ed6 Python \u4f9d\u8d56\u5e93\uff0c\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a requirement.txt \u6587\u4ef6\uff1b autotest_xxx\n\u251c\u2500\u2500 requirement.txt\n\u251c\u2500\u2500 case ...\n \u91cc\u9762\u5199\u5165\u9700\u8981\u5b89\u88c5\u7684\u4e09\u65b9\u4f9d\u8d56\uff0c\u6bd4\u5982\u50cf\u8fd9\u6837\uff1a # requirement.txt\nPyYAML==6.0 # \u6307\u5b9a\u5b89\u88c5\u67d0\u4e2a\u7248\u672c\nrequests # \u672a\u6307\u5b9a\u7248\u672c\u5219\u5b89\u88c5\u6700\u65b0\u7248\n \u5728\u6267\u884c bash env.sh \u65f6\u4f1a\u4e00\u5e76\u5c06\u5176\u5b89\u88c5\u3002 \u5982\u679c\u591a\u4e2a\u5e94\u7528\u5e93\u90fd\u5b58\u5728 requirement.txt \u6587\u4ef6\uff0c\u6267\u884c env.sh \u65f6\u4f1a\u5c06\u591a\u4e2a requirement.txt \u6587\u4ef6\u4e00\u5e76\u52a0\u8f7d\uff1b\u90a3\u4e48\u4e00\u5b9a\u8981\u6ce8\u610f\u591a\u4e2a requirement.txt \u6587\u4ef6\u53ef\u80fd\u5b58\u5728\u76f8\u540c\u7684\u4f9d\u8d56\u88ab\u6307\u5b9a\u5b89\u88c5\u4e0d\u540c\u7248\u672c\u7b49\u7b49\u517c\u5bb9\u6027\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32_1","title":"3.2\u3001\u88c1\u526a\u4f9d\u8d56","text":"\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0c\u53ef\u80fd\u4f60\u53ea\u9700\u8981\u5b89\u88c5\u4e00\u4e9b\u6700\u6700\u57fa\u7840\u7684\u4f9d\u8d56\uff0c\u5176\u4ed6\u7684\u90fd\u4e0d\u9700\u8981\uff0c\u6bd4\u5982\u7eaf\u63a5\u53e3\u81ea\u52a8\u5316\u7684\u9879\u76ee\uff0c\u5b83\u4e0d\u9700\u8981 UI \u81ea\u52a8\u5316\u76f8\u5173\u7684\u4f9d\u8d56\u3002 \u4f60\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\uff0c\u5b58\u653e\u4e00\u4e2a BASICENV \u7684\u666e\u901a\u6587\u4ef6\uff0c\u91cc\u9762\u4e0d\u9700\u8981\u5199\u4efb\u4f55\u5185\u5bb9\uff0c\u8fd9\u6837\u6267\u884c env.sh \u65f6\uff0c\u53ea\u4f1a\u5b89\u88c5\u6700\u57fa\u7840\u7684\u4f9d\u8d56\u3002 autotest_xxx\n\u251c\u2500\u2500 BASICENV # \u53ef\u4ee5\u4f7f\u7528\uff1atouch BASICENV \u521b\u5efa\u6587\u4ef6\n\u251c\u2500\u2500 case ...\n \u57fa\u7840\u4f9d\u8d56\u4ec5\u5b89\u88c5\u4ee5\u4e0b\u51e0\u4e2a\u5305\uff1a pytest # pytest\npytest-rerunfailures # \u5931\u8d25\u91cd\u8dd1\u63d2\u4ef6\npytest-timeout # \u7528\u4f8b\u8d85\u65f6\u63d2\u4ef6\nallure-pytest # \u751f\u6210 allure \u62a5\u544a\u63d2\u4ef6\nallure.deb # allure \u62a5\u544a\u67e5\u770b\u5de5\u5177\n \u88c1\u526a\u4f9d\u8d56 \u548c \u65b0\u589e\u4f9d\u8d56 \u662f\u4e0d\u51b2\u7a81\u7684\uff0c\u53ef\u4ee5\u540c\u65f6\u4f7f\u7528\u3002 \u6b64\u65b9\u6848\u9ed8\u8ba4\u4e3a\u865a\u62df\u73af\u5883\u90e8\u7f72\uff0c\u5982\u679c\u4f60\u60f3\u76f4\u63a5\u90e8\u7f72\u5728\u672c\u673a\u4e0a\uff1a bash env_dev.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_8","title":"\u4e5d\u3001\u5931\u8d25\u5f55\u5c4f","text":"\u5f55\u5c4f\u5176\u5b9e\u662f\u4e00\u79cd\u89c6\u9891\u5f62\u5f0f\u7684\u65e5\u5fd7\uff0c\u56e0\u4e3a\u5f88\u591a\u65f6\u5019\u6211\u4eec\u5728\u67e5\u770b\u65e5\u5fd7\u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u51c6\u786e\u7684\u5b9a\u4f4d\u5230\u7528\u4f8b\u5931\u8d25\u7684\u5177\u4f53\u539f\u56e0\uff0c\u56e0\u6b64\u7528\u4f8b\u7684\u5f55\u5c4f\u80fd\u8ba9\u6211\u4eec\u770b\u5230\u7528\u4f8b\u5728\u6267\u884c\u8fc7\u7a0b\uff1b \u3010\u4f7f\u7528\u65b9\u6cd5\u3011 \u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u5173\u6ce8 2 \u4e2a\u53c2\u6570\uff1b ;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\u3002\n;\u6ce8\u610f\uff0c\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u4e0d\u80fd\u5c0f\u4e8e\u5931\u8d25\u5f55\u5c4f\u6b21\u6570\uff0c\u5373 RERUN >= RECORD_FAILED_CASE\nRECORD_FAILED_CASE = 1\n \u9ed8\u8ba4\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u662f 1 \u6b21\uff1b RECORD_FAILED_CASE = 1 \u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff1b RECORD_FAILED_CASE = 0 \u8868\u793a\u4e0d\u7ba1\u7528\u4f8b\u6210\u529f\u6216\u5931\u8d25\u90fd\u5f55\u5c4f\uff1b \u5f55\u5c4f\u662f\u8981\u5360\u7528\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u7279\u522b\u662f\u5728\u4e00\u4e9b\u914d\u7f6e\u8f83\u4f4e\u7684\u673a\u5668\u4e0a\u4f1a\u5f88\u660e\u663e\uff0c\u6240\u4ee5\u4f60\u9700\u8981\u8003\u8651\u662f\u5426\u6709\u5fc5\u8981\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1b \u4f7f\u7528 manage.py \u6267\u884c\u7528\u4f8b\u9ed8\u8ba4\u8bfb\u53d6\u5230 globalconfig.ini \u91cc\u9762\u7684\u53c2\u6570\uff0c\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report/record \u76ee\u5f55\u4e0b\u4fdd\u5b58\u5931\u8d25\u7528\u4f8b\u7684\u5f55\u5c4f\u548c\u65ad\u8a00\u7684\u90a3\u4e2a\u65f6\u95f4\u70b9\u7684\u622a\u5c4f\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7\u89c6\u9891\u6587\u4ef6\u770b\u5230\u5931\u8d25\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u90fd\u53d1\u751f\u4e86\u4ec0\u4e48\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#wayland","title":"\u5341\u3001Wayland \u9002\u914d","text":"Wayland \u4e0b\u81ea\u52a8\u5316\u4e3b\u8981\u95ee\u9898\u662f X11 \u4e0b\u7684\u952e\u9f20\u64cd\u4f5c\u65b9\u6cd5\u65e0\u6cd5\u4f7f\u7528\uff0c\u6bd4\u5982 Xdotool\u3001 PyAutoGUI\u3001Xwininfo \u7b49\u7b49\uff1b YouQu \u5728 Wayland \u4e0b\u517c\u5bb9\u9002\u914d\uff0cenv.sh \u5728 Wayland \u4e0b\u6267\u884c\u65f6\u4f1a\u5b89\u88c5\u81ea\u7814\u7684\u952e\u9f20\u64cd\u4f5c\u670d\u52a1\uff08\u53ef\u80fd\u5b58\u5728\u4e00\u4e9b\u4f9d\u8d56\u62a5\u9519\uff0c\u6309\u7167\u6ce8\u91ca\u89e3\u51b3\u5373\u53ef\uff09\uff0c\u6846\u67b6\u6838\u5fc3\u5e93\u4e5f\u9488\u5bf9\u6027\u7684\u505a\u4e86\u9002\u914d\uff0c\u4e0a\u5c42\u7528\u4f8b\u5b8c\u5168\u4e0d\u7528\u5173\u5fc3\u673a\u5668\u662fWayland \u8fd8\u662f X11\uff0c\u6846\u67b6\u4f1a\u6839\u636e\u6267\u884c\u65f6\u72b6\u6001\u81ea\u52a8\u5224\u65ad\u8d70\u4e0d\u540c\u7684\u903b\u8f91\uff1b \u7b80\u5355\u8bb2\u5c31\u662f\uff0c\u5e94\u7528\u5e93\u53ea\u9700\u8981\u7ef4\u62a4\u4e00\u5957\u7528\u4f8b\u811a\u672c\u5373\u53ef\u3002 \u3010\u7528\u4f8b\u517c\u5bb9\u3011 \u56e0\u4e3a Wayland \u4e0b\u6709\u4e9b\u5e94\u7528\u7684\u754c\u9762\u663e\u793a\u548c\u529f\u80fd\u672c\u8eab\u5b58\u5728\u4e00\u4e9b\u5dee\u5f02\uff0c\u7528\u4f8b\u5c42\u53ef\u80fd\u9700\u8981\u5bf9\u8fd9\u90e8\u5206\u7528\u4f8b\u505a\u903b\u8f91\u5224\u65ad\uff0c\u4f7f\u7528\u5168\u5c40\u914d\u7f6e\u91cc\u9762\u7684\u5e38\u91cf\u8fdb\u884c\u903b\u8f91\u7f16\u5199\u5373\u53ef\uff1a from setting.globalconfig import GlobalConfig\n# GlobalConfig.IS_WAYLAND \u83b7\u53d6\u5230\u5f53\u524d\u7684\u663e\u793a\u670d\u52a1\u5668\uff08bool\uff09\n# \u5e94\u7528\u5e93 Config \u7ee7\u627f GlobalConfig\nif Config.IS_WAYLAND:\npass\nif Config.IS_X11:\npass\n \u6bd4\u5982\u7528\u4f8b\u91cc\u9762\u5982\u679c\u65ad\u8a00\u7684\u56fe\u7247\u4e0d\u540c\uff1a if Config.IS_WAYLAND:\nself.assert_image_exist(\"wayland_XXX\")\nelse:\nself.assert_image_exist(\"x11_XXX\")\n \u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u811a\u672c\u5728 Wayland \u548c X11 \u4e0b\u90fd\u53ef\u4ee5\u8dd1\uff0cso easy \u662f\u4e0d\u662f\uff1f\u5b8c\u5168\u6ca1\u5fc5\u8981\u4e13\u95e8\u62c9\u65b0\u5206\u652f\u8fdb\u884c Wayland \u9002\u914d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_9","title":"\u5341\u4e00\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_7","title":"1. \u76ee\u5f55\u7ed3\u6784","text":"\u6267\u884c\u65f6\u4f1a\u5728\u6839\u76ee\u5f55\u4e0b\u52a8\u6001\u751f\u6210 report \u76ee\u5f55\uff0c\u6240\u6709\u7684\u62a5\u544a\u76f8\u5173\u7684\u6587\u4ef6\u4f1a\u7edf\u4e00\u5b58\u653e\u5728\u91cc\u9762\uff0c\u793a\u4f8b\uff1a /report\n \u251c\u2500\u2500 allure # allure\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json\n \u251c\u2500\u2500 allure_html # \u751f\u6210\u7684html\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 index.html \u251c\u2500\u2500 allure_back # allure\u62a5\u544a\u5907\u4efd\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 20221108114823\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json\n \u251c\u2500\u2500 json # json\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 result_deepin-music_20221109134736_1081333.json\n \u251c\u2500\u2500 logs # \u65e5\u5fd7\u6587\u4ef6\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 2022-11-10_debug.log \u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-10_error.log\n \u251c\u2500\u2500 record # \u5f55\u5c4f\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-09\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 15\u65f614\u520609\u79d2_test_music_303_2_autotest.mp4\n \u2514\u2500\u2500 xml # xml\u62a5\u544a\n\u2514\u2500\u2500 autotest_deepin_music-20221109134736.xml\n \u9ed8\u8ba4\u60c5\u51b5\u4e0b\u540c\u65f6\u751f\u6210 html\u3001xml\u3001json\u4e09\u79cd\u5f62\u5f0f\u7684\u62a5\u544a\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_7","title":"2. \u5b9a\u5236\u62a5\u544a","text":"\u6211\u4eec\u5bf9 allure \u62a5\u544a\u8fdb\u884c\u4e86\u4e00\u7cfb\u5217\u7684\u5b9a\u5236\uff1a \u5b9a\u5236 logo\u3001title\u3001\u62a5\u544a\u9ed8\u8ba4\u8bed\u8a00\u4e3a\u4e2d\u6587\uff1b \u52a0\u5165\u4e86\u7528\u4f8b\u65ad\u8a00\u5931\u8d25\u65f6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u4ee5\u53ca\u6b64\u65f6\u56fe\u50cf\u5bf9\u6bd4\u7684\u6a21\u677f\u56fe\u7247\uff1b \u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\uff0c\u4f60\u53ef\u4ee5\u5728 html \u62a5\u544a\u4e2d\u76f4\u63a5\u770b\u5f55\u5236\u7684\u89c6\u9891\uff1b \u52a0\u5165\u4e86 IP \u5730\u5740\u3001\u7cfb\u7edf\u4fe1\u606f\u3001\u955c\u50cf\u7248\u672c\u7b49\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_5","title":"3. \u67e5\u770b\u62a5\u544a","text":" \u672c\u5730\u6267\u884c \u5728 report/allure \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u4e00\u5806\u6587\u672c\u6587\u4ef6\uff0c\u8fd9\u4e9b\u662f allure \u63d2\u4ef6\u751f\u6210\u7684\u62a5\u544a\u6e90\u6570\u636e\uff0c\u6211\u4eec\u5728 report/allure_html \u76ee\u5f55\u4e0b\u7ed9\u4f60\u751f\u6210\u4e86 html \u6587\u4ef6\uff0c\u4f46\u662f\u4f60\u4e0d\u80fd\u76f4\u63a5\u901a\u8fc7\u6d4f\u89c8\u5668\u6253\u5f00 index.html \u6587\u4ef6\uff0c\u56e0\u4e3a allure \u7684\u62a5\u544a\u90fd\u662f\u57fa\u4e8e\u5728\u7ebf\u7684\u670d\u52a1\uff0c\u4f60\u5e94\u8be5\u8fd9\u6837\u6253\u5f00\uff1a allure open report/allure_html\n \u4f7f\u7528 manage.py \u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u5728\u7ec8\u7aef\u7684\u6700\u540e\u4e00\u884c\uff0c\u6211\u4eec\u4f1a\u7ed9\u4f60\u8f93\u51fa\u6253\u5f00\u62a5\u544a\u7684\u547d\u4ee4\uff0c\u76f4\u63a5\u590d\u5236\u5b83\u5728\u7ec8\u7aef\u6267\u884c\u5c31\u53ef\u4ee5\u67e5\u770b\u4e86\uff0c\u50cf\u8fd9\u6837\uff1a \u7ec8\u7aef\u6267\u884c\u547d\u4ee4: allure open /tmp/youqu/report/allure_html \u67e5\u770b\u62a5\u544a \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 Pycharm \u91cc\u9762\u627e\u5230 index.html \u6587\u4ef6\uff0c\u7136\u540e\u53f3\u952e\u9009\u62e9\u6d4f\u89c8\u5668\u6253\u5f00\uff0c\u6216\u8005\u4f60\u53ef\u4ee5\u7528\u4e00\u4e2a http \u670d\u52a1\u6253\u5f00\u3002 \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 report/allure \u76ee\u5f55\u4e0b\u67e5\u770b\u62a5\u544a\uff1a allure serve report/allure\n \u8fdc\u7a0b\u6267\u884c \u8fdc\u7a0b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\uff0c\u4f1a\u5c06\u6240\u6709\u8fdc\u7a0b\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u62a5\u544a\u90fd\u6536\u96c6\u5230 report/allure \u76ee\u5f55\u4e0b\uff0c\u5206\u522b\u6309\u7167\u673a\u5668\u7684 IP \u7b49\u5efa\u4e86\u4e0d\u540c\u7684\u76ee\u5f55\uff0c\u4f60\u53ef\u4ee5\u5728\u8fd9\u4e9b\u76ee\u5f55\u91cc\u9762\u53bb\u67e5\u770b\u5bf9\u5e94\u7684\u6d4b\u8bd5\u62a5\u544a\uff0c\u67e5\u770b\u65b9\u6cd5\u548c\u524d\u9762\u672c\u5730\u6267\u884c\u67e5\u770b\u7684\u65b9\u6cd5\u4e00\u6837\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_10","title":"\u5341\u4e8c\u3001\u9759\u6001\u4ee3\u7801\u626b\u63cf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_8","title":"1. \u63d0\u524d\u89e3\u51b3\u4ee3\u7801\u95ee\u9898","text":"\u4e3a\u4e86\u5e2e\u52a9\u5f00\u53d1\u8005\u7edf\u4e00\u4ee3\u7801\u98ce\u683c\uff0cPython \u793e\u533a\u63d0\u51fa\u4e86 PEP8 \u4ee3\u7801\u7f16\u7801\u98ce\u683c\uff0cPython \u5b98\u65b9\u540c\u65f6\u63a8\u51fa\u4e86\u4e00\u4e2a\u68c0\u67e5\u4ee3\u7801\u98ce\u683c\u662f\u5426\u7b26\u5408 PEP8 \u7684\u5de5\u5177\uff0c\u540d\u5b57\u4e5f\u53eb PEP8\u3002 \u4f46\u662f\uff0cPycharm \u91cc\u9762\u7684 PEP8 \u63d2\u4ef6\u5b9e\u9645\u4e0a\u5e76\u4e0d\u80fd\u53d1\u73b0\u5f88\u591a\u4ee3\u7801\u95ee\u9898\uff0c\u8fd9\u4e9b\u95ee\u9898\u5e76\u4e0d\u4f1a\u5728\u8fd0\u884c\u65f6\u62a5\u9519\uff0c\u56e0\u4e3a\u4ece Python \u8bed\u8a00\u89d2\u5ea6\u5e76\u4e0d\u5173\u5fc3\u8fd9\u4e9b\u95ee\u9898\uff0c\u5728 Pycharm \u7f16\u8f91\u5668\u91cc\u9762\u4f7f\u7528\u5feb\u6377\u952e ctrl + alt + L\uff0c\u6709\u4e00\u70b9\u70b9\u683c\u5f0f\u5316\u7684\u6548\u679c\uff0c\u80fd\u89e3\u51b3\u4e00\u4e9b\u7a7a\u683c\u3001\u6362\u884c\u7b49\u5c0f\u95ee\u9898\u3002 \u8fd9\u91cc\u63a8\u8350\u4e00\u4e2a Python \u793e\u533a\u6d41\u884c\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff1a Black\uff0c\u53f7\u79f0\u4e0d\u59a5\u534f\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff0c\u5b83\u68c0\u6d4b\u5230\u4e0d\u7b26\u5408\u89c4\u8303\u7684\u4ee3\u7801\u98ce\u683c\u76f4\u63a5\u5c31\u5e2e\u4f60\u5168\u90e8\u683c\u5f0f\u5316\u597d\uff0c\u5c31\u662f\u8fd9\u4e48\u521a\uff01 \u5b89\u88c5\uff1a sudo pip3 install black \n \u4f7f\u7528\u65b9\u6cd5\uff1a black ${CheckPath}\n \u4f7f\u7528\u8fd9\u4e2a\u5de5\u5177\u683c\u5f0f\u5316\u4e4b\u540e\uff0c\u4ee3\u7801\u4f1a\u88ab\u81ea\u52a8\u8c03\u6574\uff0c\u521a\u5f00\u59cb\u4f60\u53ef\u80fd\u4f1a\u89c9\u5f97\u8c03\u6574\u5f97\u5f88\u5938\u5f20\uff0c\u6ca1\u5173\u7cfb\u575a\u6301\u770b\uff0c\u4e60\u60ef\u4e4b\u540e\uff0c\u4f60\u4f1a\u89c9\u5f97\u5f88\u4f18\u96c5\uff0c\u6ca1\u9519\uff0c\u8fd9\u5c31\u662f Pythonic Code \u7684\u6838\u5fc3\uff0c\u8bf7\u4fdd\u6301\u4f18\u96c5\uff5e\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_8","title":"2. \u4ee3\u7801\u626b\u63cf\u5de5\u5177","text":"\u4f7f\u7528\u6839\u76ee\u5f55\u4e0b pylint.sh \u626b\u63cf\u4ee3\u7801\uff0c\u5728 report \u76ee\u5f55\u4e0b\u67e5\u770b\u4ee3\u7801\u626b\u63cf\u62a5\u544a\uff0c\u5982\u679c\u6709\u4ee3\u7801\u95ee\u9898\u8bf7\u63d0\u524d\u89e3\u51b3\u4e4b\u540e\u518d\u63d0\u4ea4\u3002 \u6b64\u811a\u672c\u5df2\u7ecf\u4f7f\u7528 Python \u793e\u533a\u6700\u6d41\u884c\u7684\u4ee3\u7801\u626b\u63cf\u5de5\u5177 Pylint \u8fdb\u884c\u4ee3\u7801\u626b\u63cf\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a bash pylint.sh\n \u8fd0\u884c\u4e4b\u540e\u4f1a\u63d0\u793a\u4f60\u8981\u626b\u63cf\u7684\u76ee\u5f55\uff0c\u6bd4\u5982\u8f93\u5165 apps \uff0c\u5219\u4f1a\u626b\u63cf apps \u4e0b\u7684\u6240\u6709 Python \u4ee3\u7801\u3002 \u5728 setting/pylintrc.cfg \u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u76f8\u5173\u914d\u7f6e\uff0c\u626b\u63cf\u5b8c\u6210\u4e4b\u540e\u5728 report/pylints \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u626b\u63cf\u62a5\u544a\u3002 \u4ee3\u7801\u63d0\u4ea4\u9700\u901a\u8fc7 git review \u63d0\u4ea4\u5230 gerrit \uff0c\u4eba\u5de5 Code Review \u901a\u8fc7\u4e4b\u540e\u5408\u5165\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_11","title":"\u5341\u4e09\u3001\u63d0\u4ea4\u4ee3\u7801","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_9","title":"1. \u5b89\u88c5\u4f9d\u8d56","text":"sudo apt install git-review\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_9","title":"2. \u63d0\u4ea4\u6a21\u677f","text":"\u5728 ~ \u76ee\u5f55\u4e0b\u65b0\u5efa\u6587\u4ef6\uff0c\u5e76\u547d\u540d\u4e3a gitcommit_template \u5c06\u4ee5\u4e0b\u5185\u5bb9\u5199\u5165\u6587\u4ef6\u5f53\u4e2d\uff1a # commit type :fix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style(\u98ce\u683c\u4fee\u6539)\u3001refactor(\u91cd\u6784)\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test(\u6d4b\u8bd5) + \u7b80\u5355\u63cf\u8ff0. \u9ed8\u8ba4fix,\u6839\u636e\u60c5\u51b5\u4fee\u6539\nfix: \n\n# \u8be6\u7ec6\u8bf4\u660e\u4ee3\u7801\u7684\u6539\u52a8\uff0c\u5305\u542b\u4ee3\u7801\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u4ee5\u53ca\u4e3a\u4ec0\u4e48\u8fd9\u4e48\u505a\uff0c\u53ef\u80fd\u4f1a\u5f71\u54cd\u54ea\u4e9b\u529f\u80fd\u3002\u5bf9\u4e8e\u4ee3\u7801\u7684\u5ba1\u6838\u8005\uff0c\u9700\u8981\u4ece\u8fd9\u6bb5\u63cf\u8ff0\u4e2d\u80fd\u5b8c\u5168\u7406\u89e3\u4ee3\u7801\u4e2d\u6240\u6709\u6539\u52a8\u7684\u5185\u5bb9\nDescription: \n\n# \u5199\u4e00\u6bb5\u9762\u5411\u4e8e\u4ea7\u54c1\u7684\u603b\u7ed3\u6027\u5185\u5bb9\uff0c\u7528\u4e8e\u81ea\u52a8\u751f\u6210crp\u4e0a\u7684changlog\uff0c\u9700\u8981\u6ce8\u610f\u7684\u4e8b\uff0c\u8fd9\u6bb5\u63cf\u8ff0\u5fc5\u987b\u4ece\u4ea7\u54c1\u7684\u89d2\u5ea6\u8003\u8651\u3002\nLog: \n\n# \u5173\u8054pms\u4e0a\u7684bug\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94bug\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4fee\u590dbug\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Bug: \n\n# \u4fee\u590d github issue \n#Issue: \n\n# \u5173\u8054pms\u4e0a\u7684\u4efb\u52a1\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94\u4efb\u52a1\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4efb\u52a1\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Task: \n \u547d\u4ee4\u884c\u6267\u884c: git config --global commit.template ~/gitcommit_template\n \u6b64\u547d\u4ee4\u5c06\u6a21\u677f\u52a0\u5165\u5230 git \u7684\u63d0\u4ea4\u6a21\u677f\u4e2d\u3002 \u540e\u7eed\u63d0\u4ea4\u7684\u65f6\u5019\u9700\u8981\u5173\u6ce8\u4e00\u4e0b\u51e0\u70b9\uff1a commit type \u5bf9\u5e94\u4e0d\u540c\u7684\u4fee\u6539\u7c7b\u578b\uff1afix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style \uff08\u98ce\u683c\u4fee\u6539\uff09\u3001refactor \uff08\u91cd\u6784\uff09\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test \uff08\u6d4b\u8bd5\uff09 commit type \u5192\u53f7\u540e\u9762\u52a0\u7a7a\u683c\u3002 Description \u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u9700\u8981\u8fdb\u884c\u8be6\u7ec6\u8bf4\u660e\uff0c\u6bd4\u5982\u5bf9\u529f\u80fd\u8fdb\u884c\u5927\u6539\u7b49\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_6","title":"3. \u63a8\u9001\u4ee3\u7801","text":"\u9996\u5148\u6dfb\u52a0 commit \u4fe1\u606f git add \u540e\u9762\u52a0\u6587\u4ef6\u540d\u79f0\n git add . # \u8868\u793a\u6dfb\u52a0\u6240\u6709\u6587\u4ef6\n \u4f7f\u7528\u8fd9\u6761\u547d\u4ee4\u6ce8\u610f\u6709\u4e9b\u4e34\u65f6\u6587\u4ef6\u4e0d\u8981\u63d0\u4ea4\u5230\u4ed3\u5e93\u4e86\u3002 git commit -a\n \u4e4b\u540e\u5728 fix: \u540e\u9762\uff08\u6ce8\u610f\u5192\u53f7\u540e\u9762\u5fc5\u987b\u52a0\u7a7a\u683c\uff0c\u4e0d\u7136\u76f4\u63a5-1\uff09\u5199\u672c\u5730\u63d0\u4ea4\u7684 commit \u4fe1\u606f\uff0c\u7136\u540e\u5c31\u53ef\u4ee5\u63d0\u4ea4\u4ee3\u7801\u4e86 git review branch(\u5f53\u524d\u5206\u652f) -r origin\n \u6700\u597d\u4e00\u6b21 commit\uff0c\u4e00\u6b21 git review \uff0c\u7ecf\u5e38\u6709\u540c\u5b66\u5728\u672c\u5730\u75af\u72c2 commit \u6700\u540e git review \u62a5\u9519\u4e0d\u77e5\u9053\u548b\u56de\u4e8b\u513f\u3002 \u82e5\u4e0d\u60f3\u6bcf\u6b21\u63d0\u4ea4\u90fd\u52a0\u4e0a -r \u9009\u9879\uff0c\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a git config --global gitreview.remote origin \u63d0\u4ea4\u4ee3\u7801\uff0c\u76f4\u63a5\u4f7f\u7528 git review branch<\u76ee\u6807\u5206\u652f>\uff0c\u4f8b\u5982 git review master"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git","title":"4. Git\u6807\u7b7e","text":"Git \u6807\u7b7e\u5b9e\u9645\u4e0a\u662f commit \u7684\u4e00\u4e2a\u522b\u540d\uff0c\u4e3b\u8981\u7528\u4e8e\u7ba1\u7406\u5386\u53f2\u7248\u672c\u3002 \u60f3\u8c61\u4e00\u4e0b\u9886\u5bfc\u8ba9\u4f60\u628a\u4e4b\u524d\u7684\u67d0\u4e2a\u7248\u672c\u7684\u4ee3\u7801\u62c9\u51fa\u6765\u8dd1\uff0c\u4f60\u662f\u4e0d\u662f\u4e56\u4e56\u7684\u53bb\u628a\u6240\u6709\u63d0\u4ea4\u8bb0\u5f55\u62c9\u51fa\u6765\u627e\uff0c\u7136\u540e\u627e\u5230\u90a3\u4e2a\u54c8\u5e0c\u503c\uff0c\u901a\u8fc7\u54c8\u5e0c\u503c\u6765\u68c0\u51fa\u4ee3\u7801\u3002 \u8fd9\u4e00\u5957\u64cd\u4f5c\u4e0b\u6765\u662f\u4e0d\u662f\u5f88\u9ebb\u70e6\uff0c\u8d39\u65f6\u95f4\u8fd8\u4e0d\u4e00\u5b9a\u80fd\u627e\u5f97\u5230\uff0c\u6ca1\u4eba\u80fd\u8bb0\u4f4f\u6bcf\u4e2a\u63d0\u4ea4\u54c8\u5e0c\u503c\u4ee5\u53ca\u8fd9\u6b21\u63d0\u4ea4\u90fd\u6539\u4e86\u54ea\u4e9b\u4ee3\u7801\u3002 \u56e0\u6b64\u7ed9\u63d0\u4ea4\u6253\u4e2a\u6807\u7b7e\uff0c\u5c31\u662f\u628a\u54c8\u5e0c\u503c\u8f6c\u6362\u6210\u4eba\u7c7b\u80fd\u7406\u89e3\u7684\u8bed\u8a00\uff0c\u6bd4\u5982 v1.0\uff0c\u5c31\u53ef\u4ee5\u76f4\u63a5\u901a\u8fc7\u6807\u7b7e\u627e\u5230\u5bf9\u5e94\u7684\u63d0\u4ea4\u3002 \u65b0\u5efa\u6807\u7b7e git tag -a <tagname>\n \u56de\u8f66\u4e4b\u540e\uff0cGit \u4f1a\u6253\u5f00\u4f60\u7684\u7f16\u8f91\u5668\uff0c\u8ba9\u4f60\u5199\u4e00\u53e5\u6807\u7b7e\u6ce8\u89e3\uff0c\u5c31\u50cf\u4f60\u7ed9\u63d0\u4ea4\u5199\u6ce8\u89e3\u4e00\u6837\u3002 \u67e5\u770b\u6240\u6709\u6807\u7b7e git tag -l\n# git tag \u4e5f\u884c\n \u5220\u9664\u6807\u7b7e git tag -d <tagname>\n \u63a8\u9001\u6807\u7b7e\u81f3\u8fdc\u7a0b git push \u547d\u4ee4\u5e76\u4e0d\u4f1a\u4f20\u9001\u6807\u7b7e\u5230\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\uff0c\u5fc5\u987b\u663e\u5f0f\u5730\u63a8\u9001\u6807\u7b7e\u3002 git push origin <tagname>\n \u63a8\u9001\u6240\u6709\u4e0d\u5728\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\u7684\u6807\u7b7e git push origin --tag\n \u5220\u9664\u8fdc\u7a0b\u6807\u7b7e git push origin :refs/tag/<tagname>\n \u540e\u671f\u6253\u6807\u7b7e \u5148\u7528 git log --pretty=oneline \u67e5\u8be2\u63d0\u4ea4\u8bb0\u5f55\uff0c\u83b7\u53d6\u6821\u9a8c\u7801\u3002 git tag -a <tagname> 9fceb02(\u6821\u9a8c\u7801)\n \u68c0\u51fa\u6807\u7b7e git checkout <tagname>\n \u6b64\u65f6\uff0c\u4ed3\u5e93\u4f1a\u5904\u4e8e\u201c\u5206\u79bb\u5934\u6307\u9488\uff08detached HEAD\uff09\u201d\u7684\u72b6\u6001\u3002 \u5728\u201c\u5206\u79bb\u5934\u6307\u9488\u201d\u72b6\u6001\u4e0b\uff0c\u5982\u679c\u4f60\u505a\u4e86\u67d0\u4e9b\u66f4\u6539\u7136\u540e\u63d0\u4ea4\u5b83\u4eec\uff0c\u6807\u7b7e\u4e0d\u4f1a\u53d1\u751f\u53d8\u5316\uff0c \u4f46\u4f60\u7684\u65b0\u63d0\u4ea4\u5c06\u4e0d\u5c5e\u4e8e\u4efb\u4f55\u5206\u652f\uff0c\u5e76\u4e14\u5c06\u65e0\u6cd5\u8bbf\u95ee\uff0c\u9664\u975e\u901a\u8fc7\u786e\u5207\u7684\u63d0\u4ea4\u54c8\u5e0c\u624d\u80fd\u8bbf\u95ee\u3002 \u56e0\u6b64\uff0c\u5982\u679c\u4f60\u9700\u8981\u8fdb\u884c\u66f4\u6539\uff0c\u6bd4\u5982\u4f60\u8981\u4fee\u590d\u65e7\u7248\u672c\u4e2d\u7684\u9519\u8bef\uff0c\u90a3\u4e48\u901a\u5e38\u9700\u8981\u521b\u5efa\u4e00\u4e2a\u65b0\u5206\u652f\uff1a git checkout -b <NewBranchName> <tagname>\n \u65b0\u5206\u652f\u4e0a\u53ef\u4ee5\u8fdb\u884c\u63d0\u4ea4\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_12","title":"\u5341\u56db\u3001\u5e38\u89c1\u95ee\u9898","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_10","title":"1. \u63d0\u4ea4\u4ee3\u7801\u65f6\u63d0\u793a\u90ae\u7bb1\u6216\u8005\u540d\u79f0\u4e0d\u5bf9","text":"\u91cd\u65b0\u914d\u7f6e\u90ae\u7bb1\u6216\u8005\u540d\u79f0\uff0c\u7136\u540e\u91cd\u7f6e\u751f\u6548\uff1a git commit --amend --reset-author\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_10","title":"2. \u600e\u4e48\u56de\u6eda\u5230\u4e4b\u524d\u7684\u7248\u672c","text":"(1)\u67e5\u8be2\u5386\u53f2\u63d0\u4ea4\u8bb0\u5f55 git log\n \u627e\u5230\u4f60\u8981\u56de\u6eda\u7684\u7248\u672c\uff0c\u590d\u5236 hash \u503c\u3002 \u6ce8\u610f\uff1a\u662f commit \u7a7a\u683c\u4e4b\u540e\u7684 hash \u503c\uff0c\u4e4b\u524d\u6709\u540c\u5b66\u590d\u5236\u7684 Change-Id: \u8fd9\u6837\u80af\u5b9a\u62a5\u9519\u3002 (2)\u56de\u6eda\u7248\u672c\uff0c\u4e0d\u6e05\u9664\u4ee3\u7801 git reset --soft ${hash}\n (3)\u56de\u6eda\u7248\u672c\uff0c\u6e05\u9664\u4ee3\u7801\uff0c\u614e\u7528\u54c8 git reset --hard ${hash}\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-f-s-e","title":"3. \u6d4b\u8bd5\u62a5\u544a\u91cc\u9762 F S . E \u662f\u4ec0\u4e48\u610f\u601d","text":"F \u8868\u793a\u5931\u8d25\uff0c. \uff08\u70b9\uff09\u8868\u793a\u901a\u8fc7\uff0cS \u8868\u793a\u8df3\u8fc7\uff0cE \u8868\u793a error \u6709\u62a5\u9519"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git-status","title":"4. \u89e3\u51b3 git status \u4e2d\u6587\u663e\u793a\u7684\u95ee\u9898","text":"git config --global core.quotePath false\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5-apps","title":"5. apps \u76ee\u5f55\u4e0b\u989c\u8272\u6709\u4e9b\u662f\u9ec4\u8272\u7684","text":"\u5728 Pycharm \u4e2d apps \u76ee\u5f55\u4e0b\u5e94\u7528\u5e93\u6587\u4ef6\u662f\u9ec4\u8272\u7684\uff0c\u7f16\u8f91\u5668\u8bc6\u522b\u4e0d\u5230\u4ee3\u7801\u65b0\u589e\u548c\u4fee\u6539\uff1b \u7531\u4e8e\u793e\u533a\u7248 Pycharm \u4e0d\u80fd\u52a8\u6001\u8bc6\u522b\u591a\u4ed3\u5e93\uff0c\u9700\u8981\u5728 setting \u91cc\u9762\u624b\u52a8\u6ce8\u518c\uff0c\u64cd\u4f5c\u6b65\u9aa4\uff1a File \u2014> Settings \u2014> Version Control \u2014> \u70b9 + \u53f7 \u2014> Directory \u9009\u4e2d\u5e94\u7528\u5e93\u5de5\u7a0b\u76ee\u5f55 \u2014> VCS \u9009\u4e2d Git \u2014> Apply \u5982\u6b64\u5c31\u53ef\u4ee5\u4e86\u3002 \u4e13\u4e1a\u7248 Pycharm \u4e0d\u5b58\u5728\u8fd9\u4e2a\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#6-envsh-r","title":"6. \u6267\u884c env.sh \u62a5\u9519 $'\\r':\u672a\u627e\u5230\u547d\u4ee4","text":"\u51fa\u73b0\u8fd9\u4e2a\u95ee\u9898\u4f60\u5e94\u8be5\u662f\u5728 windows \u4e0a\u6253\u5f00\u6216\u7f16\u8f91\u8fc7 env.sh \u811a\u672c\uff0cwindows\u4e0b\u7684\u6362\u884c\u662f\u56de\u8f66\u7b26+\u6362\u884c\u7b26\uff0c\u4e5f\u5c31\u662f\\r\\n\uff0c\u800c Linxu \u4e0b\u662f\u6362\u884c\u7b26 \\n\uff0cLinux \u4e0b\u4e0d\u8bc6\u522b \\r\uff0c\u56e0\u6b64\u62a5\u9519\u3002 \u89e3\u51b3\u65b9\u6848\uff1a # \u5c06 \\r \u66ff\u6362\u4e3a\u7a7a\nsudo sed -i 's/\\r//' env.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#7","title":"7.\u600e\u6837\u4e3a\u5355\u72ec\u67d0\u4e00\u6761\u7528\u4f8b\u914d\u7f6e\u6267\u884c\u8d85\u65f6\u65f6\u95f4","text":"\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u5982\u4e0b\uff1a @pytest.mark.timeout(300) # \u5355\u4f4d\u79d2\ndef test_xxx_001():\npass\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#8-youqu","title":"8. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u6240\u6709\u4ee3\u7801\uff0c\u5305\u542b\u5b50\u4ed3\u5e93","text":"\u524d\u7f6e\u6761\u4ef6\uff1a\u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 # \u7b2c\u4e00\u6b21\u5b58\u50a8\u5bc6\u7801\uff0c\u63d0\u4f9b\u540e\u9762\u62c9\u4ee3\u7801(gerrit: ldap\u8d26\u53f7\u548c\u5bc6\u7801\uff0cgit\u62c9\u53d6\u7b2c\u4e00\u6b21\u8f93\u5165\u4fdd\u5b58\uff0c\u540e\u9762\u76f4\u63a5\u4f7f\u7528)\ngit config --global credential.helper store\n\n# \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\uff0c\u5e76\u9012\u5f52\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\" --recursive\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#9-youqu","title":"9. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\u6307\u5b9a\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u524d\u7f6e\u6761\u4ef6\uff1a \u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 \u5df2\u5b58\u50a8\u8bbf\u95ee\u5bc6\u7801 # \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\"\n# \u6307\u5b9a\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ncd youqu\ngit submodule update --init apps/autotest_xxx_xxx\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#10-youqu","title":"10. \u5982\u4f55\u66f4\u65b0 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\uff0c\u6240\u6709\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u66f4\u65b0\u6240\u6709\u5b50\u4ed3\u5e93\u4ee3\u7801 cd youqu\ngit pull & git submodule foreach git pull\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#11-youqu-master-detached-head","title":"11. \u5982\u4f55\u4fee\u590d YouQu \u6240\u6709\u5b50\u4ed3\u5e93 master \u5206\u652f\u6e38\u79bb\u5934\uff08detached head\uff09","text":"\u4fee\u590d\u6240\u6709\u5b50\u4ed3\u5e93\u9ed8\u8ba4master \u5206\u652f\u6e38\u79bb\u5934 cd youqu\ngit submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/","title":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212 \u5206\u7c7b\uff1a/ \u67b6\u6784\u5e08\uff1a/ \u76ee\u6807\uff1a \u5e94\u7528 AT \u67b6\u6784\u5de5\u7a0b\u5316\uff0c\u53c2\u8003\u6027\u80fd\u81ea\u52a8\u5316\u5de5\u7a0b\u5b8c\u6210\u5de5\u7a0b\u5316\u6539\u9020\u3002 \u5e94\u7528\u95f4\u7528\u4f8b\u89e3\u8026\uff0c\u89e3\u9664\u6240\u6709\u4ea4\u53c9\u8c03\u7528\u7684\u65b9\u6cd5\uff0c\u5404\u5e94\u7528\u80fd\u8ddf\u968f\u81ea\u8eab\u8fed\u4ee3\u5468\u671f\u72ec\u7acb\u7ef4\u62a4 AT \u7528\u4f8b\u3002 \u5b8c\u6210\u516c\u5171\u65b9\u6cd5\u7684\u62bd\u53d6\u6574\u5408\uff0c\u5f62\u6210\u4e00\u5957\u72ec\u7acb\u4e8e\u5e94\u7528\u95f4\u7684\u516c\u5171\u65b9\u6cd5\u5e93\uff0c\u5404\u5e94\u7528\u65b9\u6cd5\u91cc\u9762\u4e0d\u5b58\u5728\u88ab\u591a\u4e2a\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\u3002 \u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u4e3a\u5c06\u6765\u9002\u914d\u66f4\u591a\u7684 AT \u8fd0\u7528\u573a\u666f\u63d0\u4f9b\u652f\u6491\uff0c\u539f\u5219\u4e0a\u53ef\u5b9e\u73b0\u65e0\u9650\u6269\u5c55\uff0c\u5728\u6bcf\u65e5\u6784\u5efa\u548c\u6301\u7eed\u96c6\u6210\u6d41\u7a0b\u843d\u5730\u4f7f\u7528\u3002 \u4ee3\u7801\u89c4\u8303\u95ee\u9898\u6e05\u96f6\uff0c\u7b26\u5408 Shell Check\u3001Pylint\u3001\u7cfb\u7edf\u90e8\u76f8\u5173\u7f16\u7801\u89c4\u8303\u8981\u6c42\u3002 \u610f\u4e49\uff1a \u7edf\u4e00\u6210\u7814 AT \u67b6\u6784\u8bbe\u8ba1\u601d\u8def\uff0c\u6d88\u9664 AT \u4ee3\u7801\u5b9e\u73b0\u548c\u7ef4\u62a4\u4e0a\u53ef\u80fd\u51fa\u73b0\u7684\u5206\u6b67\uff0c\u6539\u5584\u5386\u53f2 AT \u65e0\u5de5\u7a0b\u5316\u8bbe\u8ba1\u7684\u7f3a\u9677\uff0c\u63d0\u9ad8\u67b6\u6784\u4e13\u4e1a\u6027\u3002 \u5404\u5e94\u7528 AT \u4ee3\u7801\u76f8\u4e92\u72ec\u7acb\uff0c\u5951\u5408\u5e94\u7528\u72ec\u7acb\u53d1\u5e03\u7279\u6027\uff0c\u53ef\u652f\u6301\u8fed\u4ee3\u671f\u95f4\u72ec\u7acb\u65b0\u589e\u3001\u7ef4\u62a4\u548c\u6267\u884c\u3002 \u65b9\u6cd5\u8c03\u7528\u903b\u8f91\u5f97\u5230\u7b80\u5316\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u66f4\u9ad8\u6548\uff1b\u516c\u5171\u5e93\u62bd\u53d6\uff0c\u51cf\u5c11\u65b9\u6cd5\u91cd\u590d\u7f16\u5199\uff0c\u63d0\u9ad8\u4ee3\u7801\u5229\u7528\u7387\uff1b\u5e73\u5747\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u4ece40\u5206\u949f\u964d\u4f4e\u81f330\u5206\u949f\uff0c\u65e5\u4ea7\u51fa\u7528\u4f8b\u4ece12\u6761/\u5929\u63d0\u5347\u81f316\u6761/\u5929\u3002 \u53ef\u7075\u6d3b\u652f\u6491\u4e0d\u540c\u7684\u81ea\u52a8\u5316\u8fd0\u7528\u573a\u666f\uff0c\u5982 CI\u3001\u5192\u70df\u6d4b\u8bd5\u3001\u96c6\u6210\u6d4b\u8bd5\u3001\u56de\u5f52\u6d4b\u8bd5\u3001\u4e13\u9879\u6d4b\u8bd5\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_2","title":"\u4e00\u3001\u80cc\u666f\u4ecb\u7ecd","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1","title":"1\u3001\u73b0\u6709\u67b6\u6784\u4ecb\u7ecd","text":"\u73b0\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u6574\u4f53\u5206\u4e3a\u4e09\u5c42\uff1a\u7528\u4f8b\u5c42\uff08\u4e1a\u52a1\u903b\u8f91\u5c42\uff09\u3001\u4e2d\u95f4\u5c42\uff08\u5143\u7d20\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff09\u3001\u6838\u5fc3\u5c42\uff08\u5e95\u5c42\u529f\u80fd\u5e93\u5c42\uff09\u3002 \u7528\u4f8b\u5c42\uff1a\u5373\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4e13\u6ce8\u4e8e\u4e1a\u52a1\u529f\u80fd\u903b\u8f91\uff0c\u4e0d\u5173\u5fc3\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\uff1b \u4e2d\u95f4\u5c42\uff1a\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff0c\u6bcf\u4e2a\u65b9\u6cd5\u5747\u5bf9\u5e94\u4e00\u4e2a\u5143\u7d20\u7684\u4e00\u4e2a\u5177\u4f53\u64cd\u4f5c\uff0c\u4e5f\u53ef\u4ee5\u662f\u591a\u4e2a\u64cd\u4f5c\u7684\u7ec4\u5408\u64cd\u4f5c\uff0c\u4e2d\u95f4\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u7528\u4f8b\u5c42\uff0c\u5177\u6709\u53ef\u6269\u5c55\u6027\u548c\u590d\u7528\u6027\uff1b \u6838\u5fc3\u5c42\uff1a\u4e3b\u8981\u5c01\u88c5\u7684\u5e95\u5c42\u529f\u80fd\u5b9e\u73b0\uff0c\u6b64\u5c42\u5728\u6846\u67b6\u4e2d\u63d0\u4f9b\u4e00\u4e9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u529f\u80fd\u6a21\u5757\u76f8\u5bf9\u72ec\u7acb\uff0c\u6838\u5fc3\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u64cd\u4f5c\u5c42\uff0c\u6bd4\u5982\uff1a\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7 UI \u5750\u6807\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u952e\u9f20\u64cd\u4f5c\u7684\u57fa\u7840\u65b9\u64cd\u4f5c\u6a21\u5757\u3001Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757\u3001\u6587\u4ef6\u7684\u589e\u5220\u6539\u67e5\u64cd\u4f5c\u6a21\u5757\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2","title":"2\u3001\u81ea\u52a8\u5316\u7684\u5e94\u7528","text":"2.1\u3001CI \u6d41\u7a0b \u6bcf\u65e5\u6784\u5efa\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u7814\u53d1\u6bcf\u65e5\u63d0\u4ea4\u7684\u4ee3\u7801\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u73ed\u4e4b\u540e\u4f1a\u5c06\u5404\u5e94\u7528\u8fdb\u884c\u6253\u5305\uff0c\u7136\u540e\u5728\u6d4b\u8bd5\u673a\u4e0a\u5b89\u88c5\u66f4\u65b0 deb \u5305\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u5e94\u7528\u63d0\u4ea4\u96c6\u6210\u7684\u7248\u672c\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u8f7d\u6700\u65b0\u7684 ISO \u8fdb\u884c PXE \u90e8\u7f72\uff0c\u7136\u540e\u6d4b\u8bd5\u673a\u5b89\u88c5\u6700\u65b0\u7684\u955c\u50cf\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 2.2\u3001\u9a8c\u6536\u6d4b\u8bd5 \u5728\u5404\u9a8c\u6536\u8282\u70b9\u8fdb\u884c\u81ea\u52a8\u5316\u9a8c\u6536\uff0c\u76ee\u524d\u7684\u7b56\u7565\u662f\u5168\u7528\u4f8b\u8986\u76d6\u5168\u67b6\u6784\u3002 2.3\u3001\u56de\u5f52\u6d4b\u8bd5 \u56de\u5f52\u6d4b\u8bd5\u4eca\u5e74\u89c4\u5212\u5efa\u8bbe\u4e2d\uff0c\u65e8\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u6267\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\uff0c\u51cf\u5c11\u529f\u80fd\u6d4b\u8bd5\u7684\u91cd\u590d\u52b3\u52a8\u529b\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3","title":"3\u3001\u5b58\u5728\u7684\u95ee\u9898","text":" \u5404\u5e94\u7528\u4e4b\u95f4\u5b58\u5728\u8026\u5408 \u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u521d\u671f\uff0c\u6240\u6709\u5e94\u7528\u662f\u6574\u4f53\u53d1\u5e03\uff0c\u6211\u4eec\u662f\u5c06\u6240\u6709\u5e94\u7528\u770b\u6210\u662f\u4e00\u4e2a\u6574\u4f53\uff0c\u5404\u5e94\u7528\u4f5c\u4e3a\u5176\u4e2d\u7684\u4e00\u4e2a\u6a21\u5757\uff0c\u6240\u4ee5\u5b58\u5728\u5e94\u7528\u95f4\u65b9\u6cd5\u4ea4\u53c9\u8c03\u7528\u7684\u95ee\u9898\uff0c\u8fd9\u6837\u4ece\u6700\u521d\u7684\u8bbe\u8ba1\u6765\u8bb2\u786e\u5b9e\u80fd\u591f\u51cf\u5c11\u91cd\u590d\u4ee3\u7801\u7684\u7f16\u5199\u3002\u4f46\u662f\u73b0\u5728\u5e94\u7528\u8d70\u72ec\u7acb\u53d1\u5e03\uff0c\u5404\u5e94\u7528\u90fd\u6709\u81ea\u5df1\u7684\u8fed\u4ee3\u8282\u594f\uff0c\u5728\u65b0\u9700\u6c42\u5feb\u901f\u53d8\u5316\u7684\u8fc7\u7a0b\u4e2d\uff0c\u81ea\u52a8\u5316\u7ef4\u62a4\u53d8\u5f97\u5f02\u5e38\u56f0\u96be\uff0c\u539f\u56e0\u5c31\u662f\u81ea\u52a8\u5316\u9879\u76ee\u91cc\u9762\u5404\u4e2a\u5e94\u7528\u7684\u6709\u6bd4\u8f83\u591a\u7684\u8026\u5408\u5173\u7cfb\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u8fdb\u884c\u89e3\u8026\uff0c\u4ee5\u9002\u5e94\u5e94\u7528\u4e0d\u540c\u7684\u8fed\u4ee3\u5468\u671f\u3002 \u65e0\u6cd5\u7cbe\u51c6\u7684\u5212\u5206\u7528\u4f8b\u8303\u56f4 \u7528\u4f8b\u6267\u884c\u7684\u8303\u56f4\u4e0d\u591f\u7cbe\u51c6\uff0c\u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u4e3b\u8981\u901a\u8fc7\u7528\u4f8b\u7684\u5173\u952e\u8bcd core\uff08\u6838\u5fc3\uff09\u6765\u533a\u5206\u7528\u4f8b\u662f\u5426\u4e3a\u6838\u5fc3\u7528\u4f8b\uff0c\u4f46\u662f\u8fd9\u6837\u7684\u533a\u5206\u592a\u5bbd\u6cdb\u4e86\uff0c\u4e0d\u80fd\u9002\u5e94\u81ea\u52a8\u5316\u6d4b\u8bd5\u5728\u591a\u573a\u666f\u4e0b\u7684\u5e94\u7528\u3002\u5f88\u591a\u573a\u666f\u4e0b\u6211\u4eec\u8fd8\u9700\u8981\u6839\u636e\u7528\u4f8b\u7684\u7b49\u7ea7\u3001\u7528\u4f8b\u7684\u7c7b\u578b\u3001\u7528\u4f8b\u6765\u6e90\u7b49\u7b49\uff0c\u4e0d\u540c\u7684\u7ef4\u5ea6\u6765\u6311\u9009\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u5173\u952e\u5b57\u9700\u8981\u4eba\u5de5\u4e00\u6761\u6761\u7684\u6539\uff0c\u8d39\u65f6\u8d39\u529b\uff0c\u800c\u4e14\u4e0d\u597d\u7ef4\u62a4\u3002 \u53d7\u65b0\u9700\u6c42\u5f71\u54cd\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u597d\u7ef4\u62a4 \u76ee\u524d\u9700\u8981\u8df3\u8fc7\u7684\u7528\u4f8b\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684\u7528\u4f8b\u811a\u672c\u91cc\u9762\uff0c\u6dfb\u52a0\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\uff0c\u540e\u7eed\u89e3\u9664\u8df3\u8fc7\u7684\u65f6\u5019\u53c8\u9700\u8981\u627e\u5230\u8fd9\u6761\u811a\u672c\uff0c\u5220\u6389\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\u3002\u5728\u8df3\u8fc7\u7528\u4f8b\u8f83\u591a\u7684\u60c5\u51b5\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u96be\u5ea6\u3002 \u7f16\u5199\u7528\u4f8b\u65f6\u903b\u8f91\u6bd4\u8f83\u590d\u6742\uff0c\u9700\u8981\u8c03\u7528\u591a\u4e2a\u5e94\u7528\u7684\u65b9\u6cd5\u6a21\u5757\u3002 \u6846\u67b6\u6269\u5c55\u6027\u4e0d\u8db3\uff0c\u65e0\u6cd5\u6574\u5408\u6027\u80fd\u81ea\u52a8\u5316\u3001\u538b\u6d4b\u81ea\u52a8\u5316\u3001\u5b89\u5168\u81ea\u52a8\u5316\u7b49\u4e13\u9879\u6d4b\u8bd5\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_3","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u4e3a\u89e3\u51b3\u73b0\u6709\u95ee\u9898\uff0c\u9002\u5e94\u4e0d\u65ad\u4e30\u5bcc\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u66f4\u597d\u7684\u53d1\u6325\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4f5c\u7528\uff0c\u9700\u8981\u5bf9\u81ea\u52a8\u5316\u67b6\u6784\u53ca\u5404\u529f\u80fd\u6a21\u5757\u8fdb\u884c\u91cd\u65b0\u8bbe\u8ba1\u89c4\u5212\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_1","title":"1\u3001\u67b6\u6784\u8bbe\u8ba1","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_1","title":"2\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u6846\u67b6\u7684\u8fd0\u884c\u903b\u8f91\uff1a\u901a\u8fc7\u6838\u5fc3\u5c42\u63d0\u4f9b\u4e00\u4e2a\u57fa\u7840\u80fd\u529b\uff0c\u4e1a\u52a1\u5c42\u6839\u636e\u5b9e\u9645\u4e1a\u52a1\u9700\u6c42\uff08\u6d4b\u8bd5\u7528\u4f8b\uff09\u52a8\u6001\u52a0\u8f7d\u6838\u5fc3\u5c42\uff0c\u6267\u884c\u5165\u53e3\u52a0\u8f7d\u76f8\u5e94\u7684\u7528\u4f8b\u96c6\u5e76\u63a7\u5236\u6267\u884c\uff0c\u5e94\u7528\u5c42\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u9700\u6c42\uff0c\u901a\u8fc7\u76f8\u5e94\u7684\u914d\u7f6e\u9879\u8fdb\u884c\u914d\u7f6e\uff0c\u4ece\u800c\u89e6\u53d1\u81ea\u52a8\u5316\u6d4b\u8bd5\u4efb\u52a1\u3002 \u6838\u5fc3\u5c42\uff1a\u57fa\u672c\u4fdd\u6301\u4e0d\u53d8\uff0c\u90e8\u5206\u6a21\u5757\u4f1a\u6d89\u53ca\u5230\u65b0\u529f\u80fd\u5f00\u53d1\uff0c\u6838\u5fc3\u5c42\u5404\u529f\u80fd\u6a21\u5757\u4fdd\u6301\u72ec\u7acb\u6027\uff0c\u63d0\u4f9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u4f9b\u4e0a\u5c42\u8c03\u7528\uff1b \u5e95\u5c42\u6838\u5fc3\u6a21\u5757\u5305\u62ec\uff1a \u56fe\u50cf\u8bc6\u522b\u6a21\u5757 UI \u5b9a\u4f4d\u6a21\u5757 Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757 \u5c5e\u6027\u5b9a\u4f4d\u6a21\u5757 \u65e5\u5fd7\u6a21\u5757 \u952e\u9f20\u64cd\u4f5c\u6a21\u5757 \u6587\u4ef6\u64cd\u4f5c\u6a21\u5757 \u5f55\u5c4f\u6a21\u5757 \u81ea\u5b9a\u4e49\u65ad\u8a00\u6a21\u5757 \u7528\u4f8b\u6267\u884c\u6a21\u5757 PXE \u88c5\u673a\u6a21\u5757 \u952e\u9f20\u4fe1\u53f7\u6a21\u62df\u6a21\u5757 OCR \u6a21\u5757 \u4e1a\u52a1\u5c42\uff1a\u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e94\u7528\u5185\u5305\u542b\u591a\u4e2a\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5982\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7b49\uff0c\u540e\u7eed\u53ef\u4ee5\u6839\u636e\u9700\u8981\u5ac1\u63a5\u8fdb\u6765\u3002\u5176\u4e2d\u529f\u80fd\u6d4b\u8bd5\u8bbe\u8ba1\u601d\u8def\uff1a \u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e76\u5c06\u6d4b\u8bd5\u6570\u636e\u548c\u6d4b\u8bd5\u8d44\u6e90\u6574\u5408\u8fdb\u6765\uff0c\u589e\u52a0\u7528\u4f8b\u6807\u7b7e csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ed9\u6bcf\u6761\u7528\u4f8b\u6253\u6807\u7b7e\u3002 \u5404\u6807\u7b7e\u6240\u4f7f\u7528\u5bf9\u5e94\u7684\u5b57\u6bb5\u540d\u79f0\uff0c\u4f7f\u7528 csv \u6587\u4ef6\u7ef4\u62a4\u7528\u4f8b\u4e0e\u6807\u7b7e\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u5bf9\u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u53ef\u4ee5\u7ec4\u5408\u5176\u4e2d\u7684\u6807\u7b7e\u800c\u4ece\u9a71\u52a8\u5bf9\u5e94\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\uff0c\u517c\u5bb9\u73b0\u6709\u7528\u4f8b\u6807\u7b7e\uff0c\u4e14\u652f\u6301\u7528\u4f8b\u6807\u7b7e\u53ef\u6269\u5c55\uff1b \u4f7f\u7528 csv \u683c\u5f0f\u6587\u4ef6\u53ef\u4ee5\u65b9\u4fbf\u7684\u4f7f\u7528 Excel \u8868\u683c\u6253\u5f00\u8fdb\u884c\u7f16\u8f91\uff0c\u540c\u65f6\u7531\u4e8e csv \u6587\u4ef6\u5b9e\u9645\u662f\u4ee5\u90fd\u597d\u5206\u9694\u7684\u6587\u672c\u6587\u4ef6\uff0c\u4ee3\u7801\u4e2d\u53ef\u4ee5\u5728\u4e0d\u4f9d\u8d56\u4e09\u65b9\u5e93\u7684\u60c5\u51b5\u4e0b\u65b9\u4fbf\u5feb\u901f\u7684\u89e3\u6790\u5b83\uff0c\u53ef\u64cd\u4f5c\u6027\u548c\u53ef\u7ef4\u62a4\u6027\u8f83\u9ad8\u3002 \u5404\u4e2a\u5e94\u7528\u4e4b\u95f4\uff0c\u7528\u4f8b\u3001\u65b9\u6cd5\u3001\u6807\u7b7e\u548c\u8d44\u6e90\u90fd\u662f\u76f8\u4e92\u72ec\u7acb\u7684\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u7528\u4f8b\u65f6\u53ea\u9700\u8981\u81ea\u5df1\u5e94\u7528\u4e0b\u7684\u65b9\u6cd5\u548c\u516c\u5171\u5e93\u5373\u53ef\u3002 \u7ed3\u6784\u4e3e\u4f8b\uff1a .\n\u251c\u2500\u2500 apps\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_album # \u5e94\u7528\u540d (\u7528\u4e0b\u5212\u7ebf\u8fde\u63a5\u662f Python \u7f16\u7801\u89c4\u8303)\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_assert # \u65ad\u8a00\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_function_tag.csv # \u7528\u4f8b\u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 asan_cases # \u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases # \u529f\u80fd\u6d4b\u8bd5\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 res # \u6d4b\u8bd5\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config # \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_widget # \u5e94\u7528\u81ea\u5df1\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_widget # \u65b9\u6cd5\u57fa\u7c7b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 other_widget # \u8c03\u7528\u5176\u4ed6\u5e94\u7528\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_camera\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases\n\u2502\u00a0\u00a0 \u2502\u00a0 ...\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 public_widget # \u516c\u5171\u65b9\u6cd5\u5e93\n\u251c\u2500\u2500 config # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n...\n config \u914d\u7f6e\u6a21\u5757\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u76f8\u5e94\u914d\u7f6e\uff0c\u6d4b\u8bd5\u540c\u5b66\u53ef\u4ee5\u6839\u636e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5728 config \u91cc\u9762\u8fdb\u884c\u914d\u7f6e\u3002 \u5168\u5c40\u914d\u7f6e\uff1a \u6267\u884c\u4e00\u4e2a\u6216\u591a\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff1a\u5728 pattern \u91cc\u9762\u5199\u5165\u5e94\u7528\u5305\u540d\uff0c\u591a\u4e2a\u5e94\u7528\u4e4b\u95f4\u7528 or \u8fde\u63a5\uff0c\u5982 deepin-music or deepin-movie\uff1b \u5192\u70df\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a smoke\uff1b \u96c6\u6210\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a core \uff1b \u5168\u91cf\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u4e3a\u7a7a\u5373\u53ef\uff1b \u901a\u8fc7 tags \u7684\u914d\u7f6e\u6bd4\u8f83\u7075\u6d3b\uff0c\u540e\u9762\u6807\u7b7e\u5316\u7ba1\u7406\u7ae0\u8282\u4f1a\u8bb2\u5230\uff0c\u652f\u6301\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u7075\u6d3b\u914d\u7f6e\u3002 \u6307\u5b9a\u67d0\u53f0\u673a\u5668\u5728\u6307\u5b9a\u955c\u50cf\u7248\u672c\u4e0a\u6267\u884c\u7528\u4f8b\uff1a\u5728 IP \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a IP\uff0c\u5e76\u5728 URL \u91cc\u9762\u586b\u5165\u955c\u50cf\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u6846\u67b6\u4f1a\u8c03\u7528 PXE \u8fdb\u884c\u81ea\u52a8\u88c5\u673a\uff0c\u88c5\u673a\u5b8c\u4e4b\u540e\u81ea\u52a8\u5f00\u59cb\u6267\u884c\u914d\u7f6e\u7684\u6d4b\u8bd5\u7528\u4f8b\u3002 \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\uff1a \u6bcf\u4e2a\u5e94\u7528\u5185\u90e8\u4f1a\u6709\u4e00\u4e2a\u5355\u72ec\u7684\u914d\u7f6e\u6a21\u5757\uff0c\u4f1a\u5305\u542b\u4e00\u4e9b\u672c\u5e94\u7528\u7684\u6d4b\u8bd5\u8d44\u6e90\u7684\u8def\u5f84\u3001\u6267\u884c\u7528\u4f8b\u7684\u6807\u7b7e\u914d\u7f6e\u7b49\u7b49\uff0c\u5982\u679c\u5728\u5c40\u90e8\u914d\u7f6e\u91cc\u9762\u914d\u7f6e\u4e86\u7528\u4f8b\u6267\u884c\u6807\u7b7e\uff0c\u800c\u5916\u5c42 runner \u51fa\u6ca1\u6709\u6307\u5b9a\u6267\u884c\u6807\u7b7e\uff0c\u5219\u5728\u6267\u884c\u65f6\u53ea\u4f1a\u6267\u884c\u5c40\u90e8\u914d\u7f6e\u5df2\u914d\u7f6e\u7684\uff0c\u82e5\u5916\u5c42 runner \u4e5f\u914d\u7f6e\u4e86\u6267\u884c\u6807\u7b7e\uff0c\u5219\u4f1a\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u7528\u4f8b\u3002 \u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u914d\u7f6e\u90fd\u5728\u540c\u4e00\u4e2a\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\uff0cpy \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684\u7c7b\uff0cini \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684 option\u3002 \u5168\u5c40\u914d\u7f6e\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u7b56\u7565\u5982\u4e0b\uff1a \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5c40\u90e8\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5e94\u7528\u5c42\uff1arunner \u662f\u6d4b\u8bd5\u6267\u884c\u7684\u5165\u53e3\uff0c\u5b83\u4f1a\u6839\u636e\u914d\u7f6e\u91cc\u9762\u7684\u914d\u7f6e\u9879\uff0c\u8fdb\u884c\u7528\u4f8b\u7684\u52a0\u8f7d\u548c\u6267\u884c\u3002\u5b83\u63d0\u4f9b\u63a5\u53e3\u7ed9\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\uff0c\u5e73\u53f0\u4e0a\u7684\u6307\u4ee4\u5b9e\u9645\u4e0a\u90fd\u662f\u901a\u8fc7\u4e0b\u53d1\u7ed9 runner\uff0c\u7136\u540e\u7531 runner \u6765\u6267\u884c\u76f8\u5e94\u7684\u6d4b\u8bd5\u3002 \u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u662f\u4e00\u4e2a\u524d\u7aef\u7cfb\u7edf\uff0c\u53ef\u4ee5\u8fdb\u884c\u6d4b\u8bd5\u673a\u7ba1\u7406\u3001\u81ea\u52a8\u5b89\u88c5\u955c\u50cf\u3001\u81ea\u52a8\u5b89\u88c5\u6307\u5b9a\u5e94\u7528\u7248\u672c\u3001\u8fdb\u884c\u6d4b\u8bd5\u7528\u4f8b\u8303\u56f4\u9009\u62e9\u3001\u7528\u4f8b\u89e6\u53d1\u6267\u884c\u63a7\u5236\u3001\u7ed3\u679c\u5c55\u793a\u8f93\u51fa\u7b49\u3002 \u4e00\u4e2a\u5e94\u7528\u7684\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\u90fd\u53ef\u4ee5\u5355\u72ec\u89e6\u53d1\u3002 \u517c\u5bb9\u6027\u6d4b\u8bd5\u4e3b\u8981\u901a\u8fc7 PXE \u670d\u52a1\u5668\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u88c5\u673a\uff0c\u7136\u540e\u914d\u5408 AT \u8fdb\u884c\u6d4b\u8bd5\uff0c\u53ef\u4ee5\u5b9e\u73b0\u4e0d\u540c\u7cfb\u7edf\u7248\u672c\u3001\u4e0d\u540c\u5e94\u7528\u7248\u672c\u73af\u5883\u4e0a\u90fd\u53ef\u4ee5\u8fdb\u884c\u81ea\u52a8\u5316\u7684 AT \u6267\u884c\uff0c\u63d0\u9ad8\u517c\u5bb9\u6027\u6d4b\u8bd5\u6548\u7387\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_4","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_2","title":"1\u3001\u7528\u4f8b\u89e3\u8026","text":"\u5b58\u5728\u8026\u5408\u5173\u7cfb\u7684\u65b9\u6cd5\uff1a\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u88ab\u5916\u90e8\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\uff0c\u5219\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u8026\u5408\u5173\u7cfb\u3002 1.1\u3001\u901a\u8fc7\u7f16\u8f91\u5668 Find Usages \u67e5\u770b\u6bcf\u4e2a\u65b9\u6cd5\u88ab\u8c03\u7528\u7684\u8def\u5f84\u548c\u88ab\u8c03\u7528\u6b21\u6570\uff1b 1.2\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 1 \u4e2a\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728\u5916\u90e8\u5e94\u7528\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1b 1.3\u3001\u64cd\u4f5c\u5c42\u6587\u4ef6\u540d\u5747\u4ee5 widget \u7ed3\u5c3e\uff0c\u7c7b\u540d\u4ee5 Widget \u7ed3\u5c3e\uff0c\u5982\uff1a\u6587\u4ef6\u540d music_widget.py \uff1a class MusicWidget:\n\"\"\"\u97f3\u4e50\u7684\u64cd\u4f5c\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_2","title":"2\u3001\u516c\u5171\u5e93\u5efa\u8bbe","text":"2.1\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 2 \u4e2a\u53ca\u4ee5\u4e0a\u7684\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728 public_widget \u76ee\u5f55\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1bpublic_widget \u5373\u4e3a\u516c\u5171\u65b9\u6cd5\u5e93\uff1b 2.2\u3001\u5728\u7528\u4f8b\u5c42\u4fee\u6539\u7528\u4f8b\u4e2d\u7c7b\u7684\u5bfc\u5165\u8def\u5f84\uff0c\u5c5e\u4e8e\u516c\u5171\u65b9\u6cd5\u7684\u5219\u8c03\u7528 public_widget \u4e2d\u7684\u7c7b\uff0c\u5916\u90e8\u5e94\u7528\u7684\u64cd\u4f5c\u65b9\u6cd5\uff0c\u5219\u8c03\u7528\u672c\u5e94\u7528\u76ee\u5f55\u4e0b\u91cd\u5199\u7684\u5916\u90e8\u5e94\u7528\u65b9\u6cd5\u3002 \u6bd4\u5982\uff1a\u51e0\u4e4e\u6240\u6709\u591a\u5a92\u4f53\u5e94\u7528\u90fd\u9700\u8981\u901a\u8fc7\u6587\u7ba1\u52a0\u8f7d\u8d44\u6e90\uff0c\u8c03\u8d77\u7684\u6587\u7ba1\u5bf9\u8bdd\u6846\u5b9e\u9645\u4e3a dde-desktop\uff0c\u56e0\u6b64\u5c06 desktop_widget.py \u653e\u5230 public_widget \u91cc\u9762\uff1a class DdeDesktopPublicWidget:\n\"\"\"\u516c\u5171-\u684c\u9762\u7684\u64cd\u4f5c\u65b9\u6cd5\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3_1","title":"3\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406","text":"3.1\u3001\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1a\u5bf9\u5e94 core\u3001smoke\uff0c\u6216\u4e3a\u7a7a\uff1b \u7528\u4f8b\u6765\u6e90\uff1a\u5bf9\u5e94 PMS \u7528\u4f8b\u6765\u6e90\uff0c\u5206\u522b\u7528 acp1\u3001acp2\u3001acp3\u3001acp4 \u8868\u793a\u3002 acp1 \uff1a\u4e1a\u52a1\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5199\u7684\u7528\u4f8b\uff0c\u88ab\u7528\u4e8e\u9a8c\u6536\u6d4b\u8bd5\u7684\uff1b acp2 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5f15\u5165\u7684\u4ea7\u54c1\u9a8c\u6536\u6d4b\u8bc4\u90e8\u7684\u7528\u4f8b\uff1b acp3 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u6839\u636e\u4ea7\u54c1\u9700\u6c42\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\uff1b acp4 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u901a\u8fc7\u793e\u533a\u3001\u8bba\u575b\u7528\u6237\u53cd\u9988\u95ee\u9898\u603b\u7ed3\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\u3002 \u4e3e\u4f8b\uff1a \u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u7528\u4f8b\u6765\u6e90 001 L1 core acp1 \u6807\u7b7e\u91c7\u7528\u679a\u4e3e\u7684\u65b9\u5f0f\u8fdb\u884c\u4ee3\u53f7\u7ba1\u7406\u65b9\u4fbf\u7ba1\u7406\u4ee5\u53ca\u540e\u7eed\u6269\u5c55\u3002 3.2\u3001\u5728\u6bcf\u4e2a\u5e94\u7528\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u7b2c\u4e00\u5217\u4e3a\u7528\u4f8b\u7684 ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ba1\u7406\u6a21\u5757\u5185\u7684\u7528\u4f8b\u6807\u7b7e\u3002\u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 3.3\u3001\u5bf9\u7167 PMS \u4e0a\u7528\u4f8b\u7b49\u7ea7\u3001\u7528\u4f8b\u7c7b\u578b\u548c\u7528\u4f8b\u6765\u6e90\uff0c\u6807\u8bb0\u6240\u6709\u5df2\u5b9e\u73b0\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u540e\u7eed\u7f16\u5199\u65b0\u589e\u81ea\u52a8\u5316\u7528\u4f8b\u65f6\uff0c\u6bcf\u5199\u4e00\u6761\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684 csv \u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u6b64\u6761\u7528\u4f8b\u7684\u6807\u7b7e\u3002 3.4\u3001\u8df3\u8fc7\u7528\u4f8b\u6807\u7b7e\u5316 \u73b0\u6709\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a\uff1a \u4e3e\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u8bb0\u4e3a \u201cskip-\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u8bb0\uff0c\u5982\u679c\u5df2\u7ecf\u6807\u8bb0\u4e86\u8df3\u8fc7\u539f\u56e0\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u8bb0\u4e3a SKIPED\uff0c\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\u3002 \u6240\u6709\u7684\u6807\u7b7e\u5728 docs \u76ee\u5f55\u4e0b\u4f1a\u6709\u4e00\u4e2a\u6587\u6863\uff0c\u6587\u6863\u6682\u5b9a\u540d\u79f0\u4e3a\uff1atags_info.md\uff0c\u7528\u4e8e\u8bf4\u660e\u73b0\u5728\u5df2\u7ecf\u4f7f\u7528\u5230\u7684\u6807\u7b7e\uff0c\u4ee5\u53ca\u8fd9\u4e9b\u6807\u7b7e\u7684\u89e3\u91ca\u548c\u7528\u6cd5\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#4","title":"4\u3001\u7528\u4f8b\u6267\u884c","text":"4.1\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u7684\u9a71\u52a8\u6267\u884c\u903b\u8f91\u529f\u80fd\u5b9e\u73b0 \u5f00\u53d1\u6839\u636e\u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\u91cc\u9762\u7684\u7528\u4f8b\u6807\u7b7e\u6267\u884c\u5bf9\u5e94\u7528\u4f8b\u7684\u529f\u80fd\uff0c\u80fd\u652f\u6301\u591a\u4e2a\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u6267\u884c\u5165\u53e3\u80fd\u968f\u610f\u901a\u8fc7\u7528\u4f8b\u6807\u7b7e\u6307\u5b9a\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002 \u7528\u4f8b\u6807\u7b7e\u7684\u9a71\u52a8\u65b9\u5f0f\u5fc5\u987b\u80fd\u652f\u6301\u6807\u7b7e\u7684\u6269\u5c55\uff0c\u672a\u6765\u968f\u7740\u4e1a\u52a1\u7684\u53d8\u5316\u53ef\u80fd\u9700\u8981\u589e\u52a0\u5404\u79cd\u5404\u6837\u7684\u6807\u7b7e\u3002 4.2\u3001\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u6267\u884c \u529f\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u3001\u6027\u80fd\u6d4b\u8bd5\u7b49\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u662f\u5206\u5f00\u6267\u884c\u7684\uff0c\u4e5f\u5c31\u662f\u5728\u4e00\u6b21\u6267\u884c\u4e2d\uff0c\u53ea\u80fd\u6267\u884c\u5176\u4e2d\u4e00\u79cd\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5177\u4f53\u8981\u6267\u884c\u54ea\u4e00\u79cd\u540c\u6837\u901a\u8fc7\u53c2\u6570\u6765\u63a7\u5236\u3002 4.3\u3001\u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c \u7531\u4e8e\u6d4b\u8bd5\u673a\u8d44\u6e90\u6709\u9650\uff0c\u968f\u7740\u81ea\u52a8\u5316\u7528\u4f8b\u6570\u91cf\u7684\u589e\u52a0\uff0cCI \u6267\u884c\u65f6\u95f4\u4f1a\u8d8a\u6765\u8d8a\u957f\u3002 \u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c\u7684\u529f\u80fd\uff1a \u540c\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\u5206\u6563\u5230\u4e0d\u540c\u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u4e0a\u6267\u884c\uff0c\u7f29\u77ed\u6267\u884c\u603b\u65f6\u95f4\uff1b \u7b2c\u4e8c\u5929\u8dd1\u7684\u65f6\u5019\u540c\u4e00\u4e2a\u673a\u5668\u4e0a\u4f1a\u6267\u884c\u6628\u5929\u6ca1\u6709\u6267\u884c\u5230\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u6267\u884c\u540c\u7406\uff1b \u53ef\u4ee5\u5b9e\u73b0\u5728\u5168\u67b6\u6784\u6d4b\u8bd5\u673a\u4e0a\u8f6e\u6d41\u6267\u884c\u7528\u4f8b\uff0c\u65e2\u80fd\u4fdd\u8bc1\u6267\u884c\u4e86\u6240\u6709\u7684\u7528\u4f8b\uff0c\u53c8\u80fd\u5728\u8d44\u6e90\u6709\u9650\u7684\u60c5\u51b5\u4e0b\u8986\u76d6\u4e86\u6240\u6709\u7684\u67b6\u6784\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#5","title":"5\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0","text":"5.1\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u4f5c\u4e3a\u524d\u7aef\u754c\u9762\u7cfb\u7edf\uff0c\u901a\u8fc7\u9875\u9762\u4e0a\u7684\u4e00\u4e9b\u529f\u80fd\u9009\u9879\u8fdb\u884c\u5bf9\u5e94\u6d4b\u8bd5\u4efb\u52a1\u7684\u7ba1\u7406\u6216\u89e6\u53d1\uff0c\u4e1a\u5185\u6bd4\u8f83\u6d41\u884c\u7684\u5b9e\u73b0\u65b9\u6848\u662f\u4f7f\u7528 Vue + DRF \u5b9e\u73b0\u4e00\u4e2a\u524d\u540e\u7aef\u5206\u79bb\u7684\u7cfb\u7edf\u3002 \u6d4b\u8bd5\u5e73\u53f0\u53ef\u80fd\u4f1a\u6d89\u53ca\u5230\u7684\u6a21\u5757\u6709\uff1a\u6d4b\u8bd5\u673a\u8d44\u6e90\u7ba1\u7406\u6a21\u5757\u3001\u7528\u4f8b\u6267\u884c\u63a7\u5236\u6a21\u5757\u3001\u7ed3\u679c\u5c55\u793a\u6a21\u5757\u3001PXE \u955c\u50cf\u5b89\u88c5\u6a21\u5757\u7b49\u3002 \u7528\u6237\uff08\u6d4b\u8bd5\u3001\u7814\u53d1\u540c\u5b66\u7b49\uff09\u53ef\u4ee5\u914d\u7f6e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5982\u6267\u884c\u54ea\u4e2a\u5e94\u7528\u3001\u6267\u884c\u7528\u4f8b\u7684\u8303\u56f4\u3001\u5728\u54ea\u53f0\u673a\u5668\u4e0a\u6267\u884c\u3001\u955c\u50cf\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u5e94\u7528\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u6267\u884c\u65f6\u95f4\u3002 5.2\u3001\u6267\u884c\u5165\u53e3 runner \u63d0\u4f9b\u7ed9\u6d4b\u8bd5\u5e73\u53f0\u7684\u63a5\u53e3\u5305\u62ec\uff1a\u7528\u4f8b\u6267\u884c\u63a5\u53e3\u3001\u7ed3\u679c\u8fd4\u56de\u63a5\u53e3\u3001\u955c\u50cf\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u955c\u50cf\u5b89\u88c5\u63a5\u53e3\u3001\u5e94\u7528\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u5e94\u7528\u5b89\u88c5\u66f4\u65b0\u63a5\u53e3\u7b49\u3002 \u524d\u7aef\u5e73\u53f0\u76ee\u524d\u8fd8\u6ca1\u6709\u592a\u591a\u8be6\u7ec6\u7684\u65b9\u6848\uff0c\u672c\u6b21\u8bbe\u8ba1\u4e3b\u8981\u96c6\u4e2d\u5728\u540e\u7aef\u8fd9\u90e8\u5206\u67b6\u6784\u7684\u8bbe\u8ba1\u4e0a\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_5","title":"\u56db\u3001\u5b9e\u65bd\u8ba1\u5212","text":"\u8fd1\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u6587\u7ba1\u4ee3\u7801\u89e3\u8026 2022/3/28 2022/4/8 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u56fe\u5f62\u56fe\u50cf\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u97f3\u89c6\u9891\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5168\u5c40\u641c\u7d22\u4ee3\u7801\u89e3\u8026 2022/4/25 2022/4/26 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u516c\u5171\u5e93\u5efa\u8bbe 2022/4/27 2022/5/5 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5c01\u88c5\u7684\u65b9\u6cd5\u6574\u7406\u6210\u4e00\u4e2a\u8868 2022/5/6 2022/5/10 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7528\u4f8b\u6807\u7b7e\u5206\u7c7b\u8bc4\u4f30 2022/5/11 2022/5/11 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u6807\u7b7e\u5316\u6267\u884c\u9a71\u52a8\u7a0b\u5e8f\u7f16\u5199 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u9700\u5b9e\u73b0\u81ea\u52a8\u89e3\u6790 csv \u8868\u683c\u4e2d\u7684\u7528\u4f8b\u7f16\u53f7 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u722c\u866b\u811a\u672c\uff0c\u722c\u53d6 pms \u4e0a\u7528\u4f8b\u7684\u6807\u7b7e 2022/5/11 2022/5/13 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u5b9a\u65f6\u81ea\u52a8\u7ef4\u62a4\u672c\u5730 csv \u6587\u4ef6\u811a\u672c 2022/5/11 2022/5/20 \u4e2d\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u76ee\u5f55\u7ed3\u6784\u8c03\u6574 2022/5/20 2022/6/2 \u5b8c\u6210\u5168\u5c40\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u5177\u4f53\u65b9\u6848\u548c\u903b\u8f91\u5b9e\u73b0 2022/6/6 2022/6/17 \u9759\u6001\u626b\u63cf\u95ee\u9898\u6e05\u96f6 2022/6/20 2022/7/1 \u5b8c\u6210\u65b0\u6846\u67b6\u4f7f\u7528\u57f9\u8bad 2022/7/4 2022/7/11 \u843d\u5730\u8fd0\u884c 2022/7/12 2022/7/20 \u5e95\u5c42\u5e93\u7528\u9014\u8bf4\u660e\u6587\u6863\u7f16\u5199 2022/7/21 2022/7/28"}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\u200b\\u3000\\-\u3001\u3002\uff0c\uff0e\uff1f\uff01\uff1b]+","pipeline":["stemmer"]},"docs":[{"location":"","title":"\u9996\u9875","text":""},{"location":"#youqu","title":"\u6709\u8da3\uff08YouQu\uff09","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/4/1\n# Author : Mikigo\n# =============================================\n \u672c\u7ad9\u603b\u8bbf\u95ee\u91cf \u6b21 \u6b22\u8fce\u5728\u6d4f\u89c8\u5668\u8bbf\u95ee\u3010\u516c\u7f51\u6587\u6863\u3011 \u7edf\u4fe1\u516c\u53f8\u5185\u7f51\u8fd8\u53ef\u4ee5\u8bbf\u95ee\u3010\u5185\u7f51\u6587\u6863\u3011\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u54e6~~"},{"location":"#_1","title":"\u4e00\u3001\u7b80\u4ecb","text":"\u6709\u8da3\uff08YouQu\uff09\u662f\u6df1\u5ea6\u79d1\u6280\u8bbe\u8ba1\u548c\u5f00\u53d1\u7684\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff0c\u91c7\u7528\u7ed3\u6784\u5206\u5c42\u7684\u8bbe\u8ba1\u7406\u5ff5\uff0c\u652f\u6301\u591a\u5143\u5316\u5143\u7d20\u5b9a\u4f4d\u548c\u65ad\u8a00\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\u3001\u5f3a\u5927\u7684\u65e5\u5fd7\u548c\u62a5\u544a\u8f93\u51fa\u7b49\u7279\u8272\u529f\u80fd\uff0c\u540c\u65f6\u5b8c\u7f8e\u517c\u5bb9X11\u3001Wayland\u663e\u793a\u534f\u8bae\uff0c\u73af\u5883\u90e8\u7f72\u7b80\u5355\uff0c\u64cd\u4f5c\u6613\u4e0a\u624b\u3002"},{"location":"#17","title":"\u7231\u4e0a \u201c\u6709\u8da3\u201d \u7684 17 \u4e2a\u7406\u7531","text":" \u6838\u5fc3\u5e93\u63d0\u4f9b\u4e86\u7edf\u4e00\u7684\u63a5\u53e3\uff0c\u7f16\u5199\u65b9\u6cd5\u65f6\u53ea\u9700\u8981\u5bfc\u5165\u4e00\u4e2a\u5305\u5c31\u53ef\u4ee5\u4f7f\u7528\u5230\u6838\u5fc3\u5e93\u63d0\u4f9b\u7684\u6240\u6709\u529f\u80fd\uff1b \u516c\u5171\u5e93\u5c01\u88c5\u4e86\u5f88\u591a\u5e38\u7528\u6a21\u5757\u7684\u76f8\u5173\u65b9\u6cd5\uff0c\u6bd4\u5982\uff1a\u4efb\u52a1\u680f\u7684\u64cd\u4f5c\u3001\u684c\u9762\u7684\u64cd\u4f5c\u3001\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\u7b49\u7b49\uff1b \u9664\u4e86\u5e38\u7528\u7684\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u8bc6\u522b\u4ee5\u5916\uff0c\u6211\u4eec\u8fd8\u63d0\u4f9b\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u5176\u4f7f\u7528\u7b80\u5355\u4e14\u9ad8\u6548\uff0c\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff1b \u5bf9\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u5c06\u7f16\u5199\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u53d8\u5f97\u7b80\u5355\u800c\u4f18\u96c5\uff1b \u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u6280\u672f\u8fdb\u884c\u529f\u80fd\u5347\u7ea7\uff0c\u9664\u4e86\u652f\u6301\u5355\u4e2a\u5750\u6807\u8fd4\u56de\uff0c\u8fd8\u652f\u6301\u540c\u4e00\u754c\u9762\u4e0b\u591a\u4e2a\u76f8\u540c\u5143\u7d20\u8fd4\u56de\u591a\u4e2a\u5750\u6807\u7684\u529f\u80fd\uff1b \u63d0\u4f9b\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u548c\u6279\u91cf\u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u4e0d\u5230\u4e00\u4e2a csv \u6587\u4ef6\u539f\u6765\u80fd\u5e72\u8fd9\u4e48\u591a\u4e8b\u60c5\uff1b \u63d0\u4f9b\u4e86\u529f\u80fd\u5f3a\u5927\u7684\u6267\u884c\u5668\u5165\u53e3\uff0c\u8ba9\u4f60\u53ef\u4ee5\u65b9\u4fbf\u7684\u5728\u672c\u5730\u6267\u884c\u4efb\u4f55\u7528\u4f8b\u96c6\u7684\u7528\u4f8b\uff0c\u5176\u4e30\u5bcc\u7684\u81ea\u5b9a\u4e49\u914d\u7f6e\u9879\uff0c\u6ee1\u8db3\u4f60\u5bf9\u6267\u884c\u5668\u6240\u6709\u7684\u5e7b\u60f3\uff1b \u63d0\u4f9b\u8fdc\u7a0b\u6267\u884c\u7684\u529f\u80fd\uff0c\u53ef\u4ee5\u63a7\u5236\u591a\u53f0\u673a\u5668\u5e76\u884c\u8dd1\uff0c\u6216\u8005\u5206\u5e03\u5f0f\u8dd1\uff0c\u8fd9\u79cd\u4ed8\u8d39\u529f\u80fd\u73b0\u5728\u514d\u8d39\u7ed9\u4f60\u7528\uff1b \u63d0\u4f9b\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u529f\u80fd\uff0c\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u6bcf\u4e2a\u65b9\u6cd5\u5355\u72ec\u5199\u8f93\u51fa\u65e5\u5fd7\u7684\u4ee3\u7801\uff0c\u4e00\u5207\u6211\u4eec\u7ed9\u4f60\u641e\u5b9a\u4e86\uff0c\u65e5\u5fd7\u8f93\u51fa\u4e0d\u4ec5\u5185\u5bb9\u4e30\u5bcc\uff0c\u989c\u503c\u4e5f\u7edd\u5bf9\u5728\u7ebf\uff0c\u6211\u4eec\u8fd8\u81ea\u5df1\u8bbe\u8ba1\u4e86\u4e00\u6b3e\u7ec8\u7aef\u8f93\u51fa\u4e3b\u9898\u53eb\u300a\u4e94\u5f69\u6591\u6593\u7684\u9ed1\u300b\uff1b \u63d0\u4f9b\u4e86\u4e00\u952e\u90e8\u7f72\u81ea\u52a8\u5316\u6d4b\u8bd5\u73af\u5883\u7684\u529f\u80fd\uff0c\u8fde\u4ee3\u7801\u7f16\u8f91\u5668\u90fd\u7ed9\u4f60\u88c5\u597d\u4e86\uff0c\u8ba9\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u73af\u5883\u90e8\u7f72\u800c\u70e6\u607c\uff1b \u63d0\u4f9b\u4e86\u81ea\u52a8\u751f\u6210\u591a\u79cd\u62a5\u544a\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u8f93\u51fa\u4ec0\u4e48\u62a5\u544a\u5f62\u5f0f\u90fd\u884c\uff0c\u800c\u4e14\u6211\u4eec\u5728\u62a5\u544a\u4e2d\u8fd8\u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\u548c\u5931\u8d25\u622a\u56fe\u7684\u529f\u80fd\uff1b \u5bf9\u65ad\u8a00\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u63d0\u4f9b\u66f4\u53cb\u597d\u5316\u7684\u9519\u8bef\u63d0\u793a\uff0c\u8ba9\u5b9a\u4f4d\u95ee\u9898\u7cbe\u51c6\u9ad8\u6548\uff1b \u4e0d\u4ec5\u652f\u6301\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u63a7\u5236\uff0c\u800c\u4e14\u8fd8\u652f\u6301\u52a8\u6001\u63a7\u5236\u7528\u4f8b\u6279\u91cf\u6267\u884c\u7684\u603b\u65f6\u95f4\uff0c\u786e\u4fdd CI \u73af\u5883\u4e0b\u80fd\u987a\u7545\u8fd0\u884c\uff1b \u652f\u6301\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\u6267\u884c\u3001PMS \u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6807\u7b7e\u5316\u6267\u884c\u65b9\u6848\uff0c\u6ee1\u8db3\u4f60\u5404\u79cd\u573a\u666f\u4e0b\u7684\u6267\u884c\u9700\u6c42\uff1b \u652f\u6301\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u529f\u80fd\uff0c\u53ef\u5b9a\u4f4d\u53ef\u65ad\u8a00\uff0c\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\uff1b \u5b8c\u7f8e\u517c\u5bb9 Wayland \u548c X11\uff0c\u771f\u6b63\u505a\u5230\u4e00\u5957\u4ee3\u7801\uff0c\u968f\u5904\u6267\u884c\uff1b \u652f\u6301\u591a\u79cd\u65b9\u5f0f\u7684\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u5176\u4e2d\u5f02\u6b65\u56de\u586b\u7684\u65b9\u6848\uff0c\u5b8c\u7f8e\u89e3\u51b3\u4e86\u6570\u636e\u56de\u586b\u7684\u8017\u65f6\u95ee\u9898\uff1b \u3010\u89c6\u9891\u4ecb\u7ecd\u3011"},{"location":"#_2","title":"\u4e8c\u3001\u5b89\u88c5\u4f7f\u7528","text":"\u57fa\u7840\u6846\u67b6\uff1ahttps://github.com/linuxdeepin/deepin-autotest-framework \u4ece PyPI \u5b89\u88c5: sudo pip3 install youqu\n \u521b\u5efa\u9879\u76ee: youqu-startproject youqu\n \u5b89\u88c5\u4f9d\u8d56: cd youqu\nbash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002 \u5e94\u7528\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684\u5e94\u7528\u540d\u79f0\u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music cd apps/\n \u5c06\u5e94\u7528\u5e93\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u50cf\u8fd9\u6837\uff1a youqu\n\u251c\u2500\u2500 apps\n\u2502 \u251c\u2500\u2500 autotest_deepin_music # \u5e94\u7528\u5e93\n...\n \u5e94\u7528\u5e93\u7684\u540d\u79f0\u4e0d\u53ef\u4ee5\u4fee\u6539\u3002"},{"location":"#_3","title":"\u4e09\u3001\u8fd0\u884c","text":""},{"location":"#1","title":"1. \u5de5\u4f5c\u7a7a\u95f4","text":"\u57fa\u7840\u6846\u67b6\u5de5\u7a0b\u76ee\u5f55\u5efa\u8bae\u653e\u5728 ~ \u76ee\u5f55\u4e0b\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u4e5f\u53ef\u4ee5\u8fd0\u884c\uff0c\u4f46\u662f\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u9700\u8981\u505a\u73af\u5883\u6e05\u7406\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u5b58\u5728\u4ee3\u7801\u88ab\u5220\u9664\u7684\u98ce\u9669\u3002 \u5982\u679c\u4f60\u7684\u673a\u5668\u4e0a\u4e0d\u540c\u76ee\u5f55\u4e0b\u5b58\u5728\u591a\u4e2a YouQu \u5de5\u7a0b\uff0c\u90a3\u4e48\u5728\u8fd0\u884c\u4e4b\u524d\uff0c\u8bf7\u5148\u6267\u884c env.sh \u6821\u6b63\u76f8\u5173\u73af\u5883\u3002"},{"location":"#2","title":"2. \u6267\u884c\u5668","text":"\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u6709\u4e00\u4e2a manage.py \uff0c\u5b83\u662f\u4e00\u4e2a\u6267\u884c\u5668\u5165\u53e3\uff0c\u63d0\u4f9b\u4e86\u672c\u5730\u6267\u884c\u3001\u8fdc\u7a0b\u6267\u884c\u7b49\u7684\u529f\u80fd\u3002 \u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6765\u6267\u884c\uff1a youqu manage.py run -a deepin-music\n"},{"location":"#21","title":"2.1. \u672c\u5730\u6267\u884c","text":"youqu manage.py run\n"},{"location":"#211","title":"2.1.1. \u914d\u7f6e\u6587\u4ef6","text":"\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u914d\u7f6e\u53c2\u6570 \u5728\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u91cc\u9762\u652f\u6301\u914d\u7f6e\u5bf9\u6267\u884c\u7684\u4e00\u4e9b\u53c2\u6570\u8fdb\u884c\u914d\u7f6e\uff0c\u5e38\u7528\u7684\u5982\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;-----------------------------------------------\n;1.KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2.KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f\n;e.g. TAGS = L1 or smoke\n;-----------------------------------------------\n;\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\uff0c\u5c06\u8981\u6267\u884c\u7684\u7528\u4f8b\u5199\u5165\u6307\u5b9a\u7684 csv \u6587\u4ef6\n;\u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u4ece\u57fa\u7840\u6846\u67b6\u6839\u76ee\u5f55\u5f00\u59cb\uff1ae.g. CASE_FILE = case_list.txt\n;\u5982\u679c\u8fd9\u91cc\u6709\u503c\uff0cAPP_NAME KEYWORDS TAGS \u7684\u914d\u7f6e\u5747\u4e0d\u751f\u6548\nCASE_FILE =\n;=============================== RUNNER CONFIG ===================================\n[runner]\n;\u6700\u5927\u5931\u8d25\u7528\u4f8b\u6570\u91cf\u7684\u5360\u6bd4\n;\u6bd4\u5982\uff1a\u603b\u6267\u884c\u7528\u4f8b\u6570\u4e3a 100, \u82e5 MAX_FAIL = 0.5,\u5219\u5931\u8d25\u7528\u4f8b\u6570\u8fbe\u5230 50 \u5c31\u4f1a\u7ec8\u6b62\u6d4b\u8bd5\u3002\nMAX_FAIL = 1\n;\u5355\u6761\u7528\u4f8b\u7684\u8d85\u65f6\u65f6\u95f4\uff0c\u5982\u679c\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u8d85\u65f6\uff0c\u8fd9\u6761\u7528\u4f8b\u4f1a\u88ab\u505c\u6b62\uff0c\u540e\u7eed\u7528\u4f8b\u7ee7\u7eed\u6267\u884c\u3002\n;\u5355\u4f4d\u4e3a\u79d2\n;\u8fd9\u662f\u4e00\u4e2a\u5168\u5c40\u7edf\u4e00\u914d\u7f6e\uff0c\u5982\u679c\u67d0\u6761\u7528\u4f8b\u9700\u8981\u5355\u72ec\u914d\u7f6e\u8d85\u65f6\u65f6\u95f4\uff0c\u53ef\u4ee5\u5728\u7528\u4f8b\u4e2d\u8fd9\u6837\u5199\uff1a\n;@pytest.mark.timeout(500)\n;def test_xxx_001():\n; ...\n;\u4f1a\u8bdd\u8d85\u65f6\uff08\u6240\u6709\u7528\u4f8b\u6267\u884c\u7684\u8d85\u65f6\u65f6\u95f4\uff09\u662f\u6839\u636e\u5168\u5c40\u8d85\u65f6\u914d\u7f6e\u548c\u7528\u4f8b\u5355\u72ec\u8d85\u65f6\u914d\u7f6e\u81ea\u52a8\u8ba1\u7b97\u7684\u3002\nCASE_TIME_OUT = 200\n;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\n;\u6ce8\u610f\uff0cRERUN = 1 \u8868\u793a\u91cd\u8dd1 1 \u6b21\uff0c\u5373\u7b2c\u4e00\u6b21\u7528\u4f8b\u6267\u884c\u5931\u8d25\u4f1a\u81ea\u52a8\u91cd\u8dd1 1 \u6b21\uff0c\u603b\u5171\u6267\u884c 2 \u6b21\uff1b\n;\u5982\u679c\u7b2c 2 \u6b21\u6267\u884c\u6210\u529f\uff0c\u7ed3\u679c\u6210\u529f\uff0c\u5931\u8d25\u4ea6\u4e3a\u5931\u8d25\u3002\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c 1 \u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff0cRERUN >= RECORD_FAILED_CASE\u3002\n;1.\u5173\u95ed\u5f55\u5c4f\uff1aRECORD_FAILED_CASE > RERUN\n;2.\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1aRECORD_FAILED_CASE = 0\nRECORD_FAILED_CASE = 1\n;yes \u6bcf\u6761\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u8fdb\u884c\u73af\u5883\u6e05\u7406\nCLEAN_ALL = yes\n;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387, \u6bd4\u5982\uff1a1920x1080\n;no: \u8868\u793a\u4e0d\u505a\u5206\u8fa8\u7387\u6821\u9a8c\nRESOLUTION = 1920x1080\n;\u4e0d\u8df3\u8fc7\u7528\u4f8b\uff0ccsv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86 skip-xxx\u7684\u7528\u4f8b\u4e0d\u8df3\u8fc7\nNOSKIP = no\n;ignore fixed\n;no\uff0c\u53ea\u8981\u6807\u8bb0\u4e86fixed\u7684\u7528\u4f8b\uff0c\u5373\u4f7f\u6807\u8bb0\u4e86skip-\uff0c\u4e5f\u4f1a\u6267\u884c\uff1b\n;yes\uff0cfixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\uff1b\nIFIXED = no\n;\u8981\u5b89\u88c5deb\u5305\u7684\u8def\u5f84\n;e.g : ~/Downloads/ \u5b89\u88c5\u4e0b\u8f7d\u76ee\u5f55\u4e0b\u7684deb\u5305\uff0c\u5982\u679c\u662f\u8fdc\u7a0b\u6267\u884c\uff0c\u4f1a\u81ea\u52a8\u62f7\u8d1d\u5230\u8fdc\u7a0b\u5e76\u5b89\u88c5\u3002\nDEB_PATH =\n;DEBUG \u6a21\u5f0f\u6267\u884c\u7528\u4f8b\uff0c\u53ea\u6536\u96c6\u4e0d\u6267\u884c\u7528\u4f8b\uff0c\u4e5f\u4e0d\u505a\u8bbe\u5907\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002\nDEBUG = no\n;\u8bb0\u5f55top\u547d\u4ee4\u67e5\u8be2\u7684\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0cTOP = 3 \u8868\u793a\u8bb0\u5f55\u524d3\u4e2a\u8fdb\u7a0b\u3002\nTOP =\n;\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\nREPEAT =\n;\u9ed8\u8ba4\u5728\u6240\u6709\u6d4b\u8bd5\u5b8c\u6210\u4e4b\u540e\u8f93\u51fa\u62a5\u9519\u4fe1\u606f.\n;yes, \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\nDURING_FAIL = no\n;\u6ce8\u518c\u81ea\u542f\u670d\u52a1\nAUTOSTART = no\n;=============================== REPORT CONFIG ===================================\n[report]\n;\u6d4b\u8bd5\u62a5\u544a\u7684title\nREPORT_TITLE = YouQu Report\n;\u6d4b\u8bd5\u62a5\u544a\u7684name\nREPORT_NAME = YouQu Report\n;\u6d4b\u8bd5\u62a5\u544a\u7684\u9ed8\u8ba4\u8bed\u8a00\n;en:English\n;ru:\u0420\u0443\u0441\u0441\u043a\u0438\u0439\n;zh:\u4e2d\u6587\n;de:Deutsch\n;nl:Nederlands\n;he:Hebrew\n;br:Brazil\n;pl:Polski\n;ja:\u65e5\u672c\u8a9e\n;es:Espa\u00f1ol\n;kr:\ud55c\uad6d\uc5b4\n;fr:Fran\u00e7ais\n;az:Az\u0259rbaycanca\nREPORT_LANGUAGE = zh\n;\u7528\u4f8b\u6267\u884c\u5b8c\u540e\u751f\u6210\u7684\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n;\u76ee\u524d\u652f\u6301 allure, xml, json \uff08\u652f\u6301\u540c\u65f6\u751f\u6210\uff09\nREPORT_FORMAT = allure, xml, json\n;\u6307\u5b9a\u62a5\u544a\u751f\u6210\u7684\u8def\u5f84\uff08\u76f8\u5bf9\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\uff09\nALLURE_REPORT_PATH = report/\nXML_REPORT_PATH = report/\nJSON_REPORT_PATH = report/\n;=============================== GLOBAL CONFIG ===================================\n[globalconfig]\n;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\nPASSWORD = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\nIMAGE_MATCH_NUMBER = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6bcf\u6b21\u95f4\u9694\u7b49\u5f85\u65f6\u95f4\nIMAGE_MATCH_WAIT_TIME = 1\n;\u56fe\u50cf\u8bc6\u522b\u5339\u914d\u5ea6\nIMAGE_RATE = 0.9\n;\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u5b9e\u65f6\u56fe\u50cf\u4fdd\u5b58\u8def\u5f84\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u5750\u6807\nSCREEN_CACHE = /tmp/screen.png\n;\u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\u7684\u8def\u5f84\nTMPDIR = /tmp/tmpdir\n;\u7cfb\u7edf\u4e3b\u9898\nSYS_THEME = deepin\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = youqu-dev.uniontech.com\n;OpenCV\u670d\u52a1\u7aef\u5730\u5740\nOPENCV_SERVER_HOST = youqu-dev.uniontech.com\n;=============================== PMS CONFIG ===================================\n;PMS\u76f8\u5173\u914d\u7f6e\uff0c\u5305\u542b\u4ee5\u4e0b\u51e0\u4e2a\u65b9\u9762\uff1a\n;1.PMS\u6d4b\u8bd5\u5957\u6267\u884c\n;2.\u81ea\u52a8\u4ecePMS\u722c\u53d6\u6570\u636e\u5e76\u540c\u6b65\u672c\u5730CSV\u6587\u4ef6\n;3.PMS\u6570\u636e\u56de\u586b\n[pms]\n;PMS\u7684\u7528\u6237\u540d,\u5982: ut001234\nPMS_USER =\n;PMS\u7684\u5bc6\u7801\nPMS_PASSWORD =\n;PMS\u6d4b\u8bd5\u5957\u7684ID\n;\u5728PMS\u4e0a\u67e5\u770b\u7528\u4f8b\u201c\u5957\u4ef6\u201d\u94fe\u63a5: https://pms.uniontech.com/testsuite-view-495.html\n;\u6d4b\u8bd5\u5957ID\u4e3a: 495\nSUITE_ID =\n;\u6570\u636e\u56de\u586b\u5fc5\u987b\u5173\u8054PMS\u6d4b\u8bd5\u5355\n;\u5728PMS\u4e0a\u67e5\u770b\u6d4b\u8bd5\u5355\u94fe\u63a5: https://pms.uniontech.com/testtask-cases-20747.html\n;\u6d4b\u8bd5\u5355ID\u4e3a: 20747\nTASK_ID =\n;\u5c06\u6d4b\u8bd5\u7ed3\u679c\u6570\u636e\u56de\u586b\u5230PMS\n;\u4e3a\u7a7a: \u8868\u793a\u4e0d\u56de\u586b,\u4e0d\u4f1a\u5728\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u751f\u6210json\u7ed3\u679c\u6587\u4ef6;\n;async: \u8868\u793a\u9010\u6761\u5f02\u6b65\u56de\u586b,\u540e\u9762\u4e00\u6761\u6267\u884c\u5f00\u59cb\u65f6\u901a\u8fc7\u5b50\u7ebf\u7a0b\u5bf9\u524d\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u8fdb\u884c\u56de\u586b\uff0c\u5982\u6b64\u5b9e\u73b0\u65f6\u95f4\u6548\u7387\u6700\u5927\u5316;\n;finish: \u8868\u793a\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u6210\u4e4b\u540e\u9010\u4e2a\u56de\u586b(PMS\u4e0d\u652f\u6301\u5e76\u53d1);\nSEND_PMS =\n;\u6570\u636e\u56de\u586b\u7684\u89e6\u53d1\u8005\n;auto: \u6846\u67b6\u81ea\u52a8\u56de\u586b,\u914d\u5408SEND_PMS\u914d\u7f6e\u4f7f\u7528,\u4f60\u53ef\u4ee5\u9009\u62e9\u5728\u4e0d\u540c\u7684\u9636\u6bb5\u8fdb\u884c\u6570\u636e\u56de\u586b;\n;hand: \u624b\u52a8\u56de\u586b,\u6bcf\u6761\u7528\u4f8b\u4ecd\u7136\u4f1a\u751f\u6210json\u6587\u4ef6,\u4f46\u6846\u67b6\u4e0d\u4f1a\u8fdb\u884c\u6570\u636e\u56de\u586b,\u9700\u8981\u4f60\u53ef\u4ee5\u5728\u4f60\u60f3\u8981\u53d1\u9001\u7684\u65f6\u95f4\u70b9\u624b\u52a8\u89e6\u53d1\u56de\u586b;\nTRIGGER = auto\n;PMS\u56de\u586b\u7684\u91cd\u8bd5\u6b21\u6570\n;\u5982\u679c\u63a5\u53e3\u8bf7\u6c42\u5931\u8d25,\u4f1a\u8fdb\u884c\u91cd\u8bd5\nSEND_PMS_RETRY_NUMBER = 2\n[csv_link_pms_lib]\n;caselib: \u7528\u4f8b\u5e93\n;testcase: \u4ea7\u54c1\u5e93\u7528\u4f8b\nCASE_FROM = caselib\n[csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/caselib-browse-81.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 81\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic =\n[export_csv]\n;\u5bfc\u51fa\u7684csv\u6587\u4ef6\u540d\u79f0\uff0c\u9ed8\u8ba4 case_list.csv\nCSV_FILE = case_list.csv\n;exportcsv \u547d\u4ee4\u5bfc\u51fa case_list.csv \u6587\u4ef6\u65f6\u914d\u7f6e\u7684\u5b57\u6bb5\u540d\uff0c\u7528\u4f8b\u540d\u79f0\u9ed8\u8ba4\u5b58\u5728\u7b2c\u4e00\u5217\uff0c\u65e0\u9700\u6dfb\u52a0\nCSV_HEARD = \u7528\u4f8b\u7ea7\u522b,\u7528\u4f8b\u7c7b\u578b,\u6d4b\u8bd5\u7ea7\u522b,\u662f\u5426\u8df3\u8fc7\n[log_cli]\n;\u65e5\u5fd7\u76f8\u5173\u914d\u7f6e\uff08\u4e0d\u6253\u5370\u6784\u9020\u51fd\u6570\u548c\u9b54\u6cd5\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff09\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = DEBUG\n# ============= \u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u914d\u7f6e ================\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u5f00\u5934\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7, \u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_STARTSWITH = Assert\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u7ed3\u5c3e\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_ENDSWITH = Widget\n;\u652f\u6301\u7c7b\u540d\u5305\u542b xxx \u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_CONTAIN = ShortCut\n# ==============================================\n \u914d\u7f6e\u5b8c\u6210\u4e4b\u540e\uff0c\u76f4\u63a5\u5728\u547d\u4ee4\u884c\u6267\u884c manage.py \u5c31\u597d\u4e86\u3002 youqu manage.py run\n"},{"location":"#212","title":"2.1.2. \u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a youqu manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -h, --help show this help message and exit\n-a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--record_failed_case RECORD_FAILED_CASE\n\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--max_fail MAX_FAIL \u6700\u5927\u5931\u8d25\u7387\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--resolution RESOLUTION\n\u68c0\u67e5\u5206\u8fa8\u7387\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms {,async,finish}\n\u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--trigger {,auto,hand}\n\u89e6\u53d1\u8005\n-f CASE_FILE, --case_file CASE_FILE\n\u6839\u636e\u6587\u4ef6\u6267\u884c\u7528\u4f8b\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n--pms_user PMS_USER pms \u7528\u6237\u540d\n--pms_password PMS_PASSWORD\npms \u5bc6\u7801\n--suite_id SUITE_ID pms \u6d4b\u8bd5\u5957ID\n--pms_info_file PMS_INFO_FILE\npms \u4fe1\u606f\u6587\u4ef6\n--top TOP \u8fc7\u7a0b\u4e2d\u8bb0\u5f55top\u547d\u4ee4\u4e2d\u7684\u503c\n--lastfailed \u4ec5\u6267\u884c\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\n--duringfail \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\n--repeat REPEAT \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n--project_name PROJECT_NAME\n\u5de5\u7a0b\u540d\u79f0\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--build_location BUILD_LOCATION\n\u6784\u5efa\u5730\u533a\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--line LINE \u6267\u884c\u7684\u4e1a\u52a1\u7ebf\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--autostart AUTOSTART \u7528\u4f8b\u6267\u884c\u7a0b\u5e8f\u6ce8\u518c\u5230\u5f00\u673a\u81ea\u542f\u670d\u52a1\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a youqu manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\"\n \u547d\u4ee4\u884c\u53c2\u6570\u4f18\u5148\u7ea7\u662f\u9ad8\u4e8e\u914d\u7f6e\u6587\u4ef6\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u4e86\u5bf9\u5e94\u7684\u53c2\u6570\uff0c\u914d\u7f6e\u6587\u4ef6\u4e2d\u4e0d\u7ba1\u662f\u5426\u914d\u7f6e\u5747\u4e0d\u751f\u6548\u3002 --app \u5165\u53c2\u8fd8\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\uff0c\u4e0b\u9762\u7684\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u540c\u6837\u652f\u6301\u3002"},{"location":"#22","title":"2.2. \u8fdc\u7a0b\u6267\u884c","text":"\u8fdc\u7a0b\u6267\u884c\u5c31\u662f\u7528\u672c\u5730\u4f5c\u4e3a\u670d\u52a1\u7aef\u63a7\u5236\u8fdc\u7a0b\u673a\u5668\u6267\u884c\uff0c\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u76f8\u540c\uff1b \u4f7f\u7528 remote \u547d\u4ee4\uff1a youqu manage.py remote\n"},{"location":"#221","title":"2.2.1. \u8fdc\u7a0b\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u6267\u884c","text":"\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u6267\u884c\u5c31\u662f\u7531\u672c\u5730 YouQu \u4f5c\u4e3a\u670d\u52a1\u7aef\uff0c\u63a7\u5236\u8fdc\u7a0b N \u53f0\u673a\u5668\u6267\u884c\u76f8\u540c\u7684\u7528\u4f8b\uff0c\u6267\u884c\u5b8c\u4e4b\u540e\u6240\u6709\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u7ed3\u679c\u4f1a\u8fd4\u56de\u7ed9\u670d\u52a1\u7aef report \u76ee\u5f55\u4e0b\uff1b \u8fdc\u7a0b\u6267\u884c\u540c\u6837\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u8fdb\u884c\u7528\u4f8b\u76f8\u5173\u914d\u7f6e\uff1b \u9700\u8981\u91cd\u70b9\u8bf4\u4e00\u4e0b\u8fdc\u7a0b\u6267\u884c\u65f6\u7684\u6d4b\u8bd5\u673a\u4fe1\u606f\u914d\u7f6e\uff0c\u5728\u914d\u7f6e\u6587\u4ef6 setting/remote.ini \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\u3001IP\u3001\u5bc6\u7801\u3002 ;=============================== CLIENT LIST =====================================\n; \u6d4b\u8bd5\u673a\u914d\u7f6e\u5217\u8868\n;[client{number}] ;\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u6709\u591a\u5c11\u53f0\u6d4b\u8bd5\u673a\u5c31\u5199\u591a\u5c11\u4e2a client\uff0c\u522b\u540d\u5fc5\u987b\u5305\u542b client \u5b57\u7b26\uff0c\u4e14\u4e0d\u80fd\u91cd\u590d\u3002\n;user = ;\u6d4b\u8bd5\u673a user\n;ip = ;\u6d4b\u8bd5\u673a ip\n;password = 1 ;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801, \u53ef\u4ee5\u4e0d\u914d\u7f6e\u6b64\u9879\uff0c\u9ed8\u8ba4\u53d6 CLIENT_PASSWORD \u7684\u503c\uff1b\n;\u5982\u679c\u4f60\u6240\u6709\u6d4b\u8bd5\u673a\u5bc6\u7801\u90fd\u76f8\u540c\uff0c\u90a3\u4e48\u53ea\u9700\u8981\u914d\u7f6e CLIENT_PASSWORD \u5c31\u53ef\u4ee5\u4e86\n;=================================================================================\n[client1]\nuser = uos\nip = 10.8.15.xx\n[client2]\nuser = uos\nip = 10.8.15.xx\n[client3]\nuser = uos\nip = 10.8.11.xx\n \u6709\u591a\u5c11\u53f0\u673a\u5668\u5c31\u50cf\u8fd9\u6837\u53c2\u8003\u4e0a\u9762\u7684\u683c\u5f0f\u5199\u5c31\u884c\u4e86\u3002 \u7136\u540e\u5728\u547d\u4ee4\u884c\uff1a youqu manage.py remote\n \u8fd9\u6837\u8fd0\u884c\u662f\u4ece\u914d\u7f6e\u6587\u4ef6\u53bb\u8bfb\u53d6\u76f8\u5173\u914d\u7f6e\u3002 \u5982\u679c\u4f60\u4e0d\u60f3\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\uff0c\u4f60\u4ecd\u7136\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u8fdb\u884c\u4f20\u53c2\uff0c \u4ee5\u4e0b\u4e3a python3 manage.py remote \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -h, --help show this help message and exit\n-c CLIENTS, --clients CLIENTS\n\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679cpassword\u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6sett\ning/remote.ini\u4e2dCLIENT_PASSWORD\u7684\u503c,\u6bd4\u5982: uos@10.8.13.33:1\n\u6216 uos@10.8.13.33\n-s, --send_code \u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a\uff08\u4e0d\u542breport\u76ee\u5f55\uff09\n-e, --build_env \u642d\u5efa\u6d4b\u8bd5\u73af\u5883,\u5982\u679c\u4e3ayes\uff0c\u4e0d\u7ba1send_code\u662f\u5426\u4e3ayes\u90fd\u4f1a\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a.\n-p CLIENT_PASSWORD, --client_password CLIENT_PASSWORD\n\u6d4b\u8bd5\u673a\u5bc6\u7801\uff08\u5168\u5c40\uff09\n-y PARALLEL, --parallel PARALLEL\nyes:\u8868\u793a\u6240\u6709\u6d4b\u8bd5\u673a\u5e76\u884c\u8dd1\uff0c\u6267\u884c\u76f8\u540c\u7684\u6d4b\u8bd5\u7528\u4f8b;no:\u8868\u793a\u6d4b\u8bd5\u673a\u5206\u5e03\u5f0f\u6267\u884c\uff0c\u670d\u52a1\u7aef\u4f1a\u6839\u636e\u6536\u96c6\u5230\u7684\u6d4b\u8bd5\u7528\u4f8b\u81ea\n\u52a8\u5206\u914d\u7ed9\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u3002\n \u9664\u4e86\u8fd9\u4e9b\u7279\u6709\u53c2\u6570\u4ee5\u5916\uff0c\u5b83\u540c\u6837\u652f\u6301\u672c\u5730\u6267\u884c\u7684\u6240\u6709\u53c2\u6570\uff1b \u5728\u547d\u4ee4\u884c\u8fd9\u6837\u8fd0\u884c\uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\"\n \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report \u76ee\u5f55\u4e0b\u56de\u6536\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u7684\u6d4b\u8bd5\u62a5\u544a\u3002 \u6ce8\u610f\uff0c\u5982\u679c\u8fdc\u7a0b\u673a\u5668\u6ca1\u6709\u642d\u5efa\u81ea\u52a8\u5316\u6d4b\u8bd5\u73af\u5883\uff0c\u8bb0\u5f97\u52a0\u4e0a\u53c2\u6570 -e \uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\" -e\n \u6267\u884c\u524d\u786e\u4fdd\u8fdc\u7a0b\u673a\u5668\u5df2\u7ecf\u5f00\u542f\u4e86 ssh \u670d\u52a1\uff0c\u5426\u5219\u4f1a\u63d0\u793a\u65e0\u6cd5\u8fde\u63a5\uff0c\u5982\u679c\u6ca1\u6709\u5f00\u542f\uff0c\u8bf7\u624b\u52a8\u5f00\u542f\uff1a sudo systemctl restart ssh\nsudo systemctl enable ssh\n \u914d\u7f6e\u6587\u4ef6\u5176\u4ed6\u76f8\u5173\u914d\u7f6e\u9879\u8be6\u7ec6\u8bf4\u660e\uff0c\u8bf7\u67e5\u770b\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u6ce8\u91ca\u5185\u5bb9\u3002"},{"location":"#222","title":"2.2.2. \u8fdc\u7a0b\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u8d1f\u8f7d\u5747\u8861\u6267\u884c","text":"\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u8d1f\u8f7d\u5747\u8861\u6267\u884c\u4e5f\u662f\u7528\u672c\u5730\u4f5c\u4e3a\u670d\u52a1\u7aef\u63a7\u5236\u8fdc\u7a0b\u673a\u5668\u6267\u884c\uff0c\u4f46\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u4e0d\u540c\uff0c\u800c\u662f\u6240\u6709\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u4e4b\u548c\uff0c\u4e3a\u4f60\u60f3\u8981\u6267\u884c\u7684\u7528\u4f8b\u96c6\uff1b \u4f3c\u4e4e\u6709\u70b9\u96be\u4ee5\u7406\u89e3\uff0c\u6211\u7528\u5927\u767d\u8bdd\u4e3e\u4f8b\u63cf\u8ff0\u4e0b\u5c31\u662f\uff0c\u670d\u52a1\u7aef\u60f3\u8981\u6267\u884c 10 \u6761\u7528\u4f8b\uff0c\u73b0\u5728\u8fdc\u7a0b\u673a\u5668\u6709 5 \u53f0\uff1b \u7136\u540e\u670d\u52a1\u7aef\u5c31\u5148\u62ff\u7740\u7b2c 1 \u6761\u7528\u4f8b\u7ed9\u8fdc\u7a0b 1 \u53f7\u673a\u6267\u884c\uff0c\u62ff\u7b2c 2 \u6761\u7528\u4f8b\u7ed9\u8fdc\u7a0b 2 \u53f7\u673a\u6267\u884c...\uff0c\u5982\u6b64\u5faa\u73af\u76f4\u5230\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\uff0c\u8fd9\u5c31\u662f\u8d1f\u8f7d\u5747\u8861\u6267\u884c\u3002 \u4f7f\u7528\u65b9\u6cd5\u548c\u524d\u9762\u4e00\u6837\uff0c\u53ea\u662f\u9700\u8981\u589e\u52a0\u4e00\u4e2a\u53c2\u6570\uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\" --parallel no\n"},{"location":"#23-pms","title":"2.3. PMS \u6570\u636e\u56de\u586b","text":"\u6d4b\u8bd5\u5355\u5173\u8054\u7684\u7528\u4f8b\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u5bf9\u5e94\u7684\u53bb\u8dd1\u8fd9\u4e9b\u5173\u8054\u7684\u7528\u4f8b\uff0c\u5e76\u4e14\u5c06\u6267\u884c\u7684\u7ed3\u679c\u56de\u586b\u7684\u6d4b\u8bd5\u7528\u4f8b\u7684\u72b6\u6001\u91cc\u9762\u3002 PMS \u6570\u636e\u56de\u586b\u4e3b\u8981\u6709\u4e09\u79cd\u65b9\u5f0f\uff1a \uff081\uff09\u5f02\u6b65\u56de\u586b \u5728\u7528\u4f8b\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\uff0c\u91c7\u7528\u5f02\u6b65\u7684\u65b9\u5f0f\u53bb\u8fdb\u884c\u6570\u636e\u56de\u586b\uff0c\u76f4\u767d\u7684\u8bb2\u5c31\u662f\uff0c\u7b2c\u4e8c\u6761\u7528\u4f8b\u5f00\u59cb\u8dd1\u7684\u65f6\u5019\uff0c\u901a\u8fc7\u5b50\u7ebf\u7a0b\u53bb\u505a\u7b2c\u4e00\u6761\u7528\u4f8b\u7684\u6570\u636e\u56de\u586b\uff0c\u5982\u6b64\u5faa\u73af\uff0c\u76f4\u5230\u6240\u6709\u7528\u4f8b\u6267\u884c\u7ed3\u675f\uff1b \u8fd9\u79cd\u65b9\u6848\u7684\u65f6\u95f4\u6548\u7387\u6700\u9ad8\u7684\uff0c\u56e0\u4e3a\u7406\u8bba\u4e0a\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u662f\u5927\u4e8e\u6570\u636e\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\u65f6\u95f4\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u5f53\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u6570\u636e\u56de\u586b\u4e5f\u5b8c\u6210\u4e86\u3002 \u4f7f\u7528\u65b9\u6cd5\uff0c\u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u4ee5\u4e0b\u53c2\u6570\uff1a\uff08\u4ee5\u4e0b\u6d89\u53ca\u5230\u7684\u53c2\u6570\u914d\u7f6e\u90fd\u662f\u5728\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u914d\u7f6e\uff09 PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = async\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \u8fd9\u4e2a\u53c2\u6570\u53ef\u586b\u53ef\u4e0d\u586b\uff0c\u4f46\u662f\u586b\u4e86\u53ef\u4ee5\u63d0\u9ad8\u7528\u4f8b\u7684\u6267\u884c\u901f\u5ea6\uff0c\u56e0\u4e3a\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u53ef\u4ee5\u6307\u5b9a\u5230\u5177\u4f53\u7684\u5e94\u7528\u5e93\u3002\uff08\u4e0b\u540c\uff09\n \uff082\uff09\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u56de\u586b \u7b49\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u518d\u9010\u4e2a\u8fdb\u884c\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u6b64\u65b9\u6848\u65f6\u95f4\u6548\u7387\u6bd4\u8f83\u4f4e\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \uff083\uff09\u624b\u52a8\u56de\u586b \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4e0d\u505a\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u540e\u7eed\u624b\u52a8\u5c06\u7ed3\u679c\u8fdb\u884c\u56de\u586b\u8bf7\u6c42\u3002 \u7528\u4f8b\u6267\u884c\u65f6\u914d\u7f6e\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = hand\nAPP_NAME = \u540e\u7eed\u624b\u52a8\u56de\u586b\u65b9\u6cd5\uff1a youqu manage.py pms --send2task yes\n"},{"location":"#_4","title":"\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898","text":"\u7531\u540c\u5b66\u53ef\u80fd\u4f1a\u53d1\u73b0\uff0c\u600e\u4e48\u56de\u586b\u4e00\u6b21\u4e4b\u540e\uff0c\u540e\u9762\u60f3\u518d\u6b21\u56de\u586b\u5c31\u4e0d\u751f\u6548\u4e86\uff1b \u8fd9\u662f\u56e0\u4e3a\u4e3a\u4e86\u5e94\u5bf9\u524d\u9762\u63d0\u5230\u7684\u591a\u79cd\u6570\u636e\u56de\u586b\u7684\u65b9\u5f0f\uff0c\u5728 report \u76ee\u5f55\u4e0b\u4f1a\u7531 pms_xxx \u5f00\u5934\u7684\u76ee\u5f55\uff0c\u8bb0\u5f55\u4e86\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u548c\u56de\u586b\u60c5\u51b5\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u4e4b\u524d\u5df2\u7ecf\u56de\u586b\u8fc7\u4e86\uff0c\u540e\u7eed\u5c31\u4e0d\u4f1a\u518d\u6b64\u89e6\u53d1\u56de\u586b\u4e86\uff1b \u5982\u679c\u4f60\u60f3\u91cd\u65b0\u505a\u56de\u586b\uff0c\u4f60\u53ef\u4ee5\u628a report/pms_xxx \u76ee\u5f55\u5220\u6389\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u91cd\u65b0\u505a\u6570\u636e\u56de\u586b\u4e86\uff1b"},{"location":"#24-csv","title":"2.4. \u5bfc\u51fa CSV \u6587\u4ef6","text":"\u6846\u67b6\u63d0\u4f9b\u5bfc\u51fa\u6307\u5b9a\u6807\u7b7e\u7528\u4f8b\u7684\u529f\u80fd\uff1a youqu manage.py exportcsv -a deepin-album -t CICD\n \u8868\u793a\u5bfc\u51fa deepin-album \u7684\u7528\u4f8b\u4e2d\u6807\u8bb0\u4e86 CICD \u6807\u7b7e\u7684\u7528\u4f8b\uff0c\u5bfc\u51fa CSV \u6587\u4ef6\u7684\u5b57\u6bb5\u683c\u5f0f\u5df2\u7ecf\u9002\u914d\u4e86 CICD \u7684\u8981\u6c42\u3002"},{"location":"#25-app","title":"2.5. \u811a\u624b\u67b6\u65b0\u5efa APP \u5de5\u7a0b","text":"\u65b0\u5efa\u4e00\u4e2a APP \u5de5\u7a0b\uff1a youqu manage.py startapp autotest_deepin_some \u8fd9\u6837\u5728 apps \u76ee\u5f55\u4e0b\u4f1a\u521b\u5efa\u4e00\u4e2a\u5b50\u9879\u76ee\u5de5\u7a0b autotest_deepin_some\uff0c\u540c\u65f6\u65b0\u5efa\u597d\u5de5\u7a0b\u6a21\u677f\u76ee\u5f55\u548c\u6a21\u677f\u6587\u4ef6\uff1a apps\n\u2514\u2500\u2500 autotest_deepin_some\n \u00a0\u00a0 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_case.py\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 config.ini\n \u00a0\u00a0 \u251c\u2500\u2500 config.py\n \u00a0\u00a0 \u251c\u2500\u2500 conftest.py\n \u00a0\u00a0 \u251c\u2500\u2500 control\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_assert.py\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some.csv\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u2514\u2500\u2500 widget\n \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 case_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 other.ini\n \u00a0\u00a0 \u251c\u2500\u2500 other_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 pic_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2514\u2500\u2500 ui.ini\n autotest_deepin_some \u662f\u4f60\u7684\u5de5\u7a0b\u540d\u79f0\uff0c\u6bd4\u5982\uff1aautotest_deepin_music \uff1b \u5728\u6b64\u57fa\u7840\u4e0a\uff0c\u4f60\u53ef\u4ee5\u5feb\u901f\u7684\u5f00\u59cb\u4f60\u7684 AT \u9879\u76ee\u3002"},{"location":"#26","title":"2.6. \u7528\u4f8b\u6807\u7b7e\u81ea\u52a8\u540c\u6b65","text":"\u7528\u4e8e\u81ea\u52a8\u540c\u6b65 PMS \u7528\u4f8b\u6807\u7b7e\u6570\u636e\u81f3\u672c\u5730 CSV \u6587\u4ef6\uff0c\u4e3b\u8981\u901a\u8fc7\u4ee5\u4e0b\u51e0\u4e2a\u914d\u7f6e\u6765\u63a7\u5236\uff1a APP_NAME = # \u6307\u5b9a\u8981\u540c\u6b65\u7684\u5e94\u7528\u540d\u79f0\nPMS_USER = # PMS\u7684\u7528\u6237\u540d\nPMS_PASSWORD = # PMS\u7684\u5bc6\u7801\n \u5728 [csv_link_pms_id] \u8282\u70b9\u4e0b\u6307\u5b9a csv \u6587\u4ef6\u540d\u4e0e PMS \u7528\u4f8b\u6a21\u5757\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u6bd4\u5982\uff1a [csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/testcase-browse-53.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 53\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic = 53\n \u5c06\u4ee5\u4e0a\u4fe1\u606f\u914d\u7f6e\u597d\u4e4b\u540e\uff0c\u5728\u547d\u4ee4\u884c\u6267\u884c\uff1a youqu manage.py pms --pms2csv yes\n \u6bcf\u6b21\u6267\u884c\u65f6\u539f csv \u6587\u4ef6\u4f1a\u81ea\u52a8\u5907\u4efd\u5728 report/csv_back \u76ee\u5f55\u4e0b\uff0c\u56e0\u6b64\u4f60\u4e0d\u7528\u62c5\u5fc3\u811a\u672c\u6267\u884c\u5bfc\u81f4\u4f60\u7684\u6570\u636e\u4e22\u5931\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u57fa\u7840\u6846\u67b6\u8bbe\u8ba1\u65b9\u6848","text":"# ====================================\n# Author : Mikigo\n# Time : 2022/3/18\n# version \uff1a1.0\n# ====================================\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"\u505a\u4e00\u4e2a\u7b80\u5355\u3001\u597d\u7528\u3001\u529f\u80fd\u5f3a\u5927\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u3002 \u4f5c\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4e00\u4e2a\u57fa\u7840\u6846\u67b6\uff0c\u4efb\u4f55\u5e94\u7528\u90fd\u80fd\u5f88\u65b9\u4fbf\u7684\u63a5\u5165\u8fdb\u6765\uff1b \u63d0\u4f9b\u6240\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u9700\u8981\u7684\u5e95\u5c42\u529f\u80fd\uff0c\u5e76\u5bf9\u5916\u63d0\u4f9b\u552f\u4e00\u7684\u63a5\u53e3\uff0c\u65b9\u4fbf\u5e94\u7528\u5e93\u4f7f\u7528\uff1b \u6574\u5408\u516c\u5171\u5e93\uff0c\u51cf\u5c11\u5e94\u7528\u5e93\u4ee3\u7801\u91cf\u548c\u65b9\u6cd5\u7ef4\u62a4\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u8bbe\u8ba1\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u7edf\u4e00\u6982\u5ff5","text":" \u57fa\u7840\u6846\u67b6 \u672c\u9879\u76ee\u662f\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\uff08AutoTest Basic Frame\uff09\uff0c\u5168\u79f0\u4e3a\u201c\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff08AT \u57fa\u7840\u6846\u67b6\uff09\u201d\u3002 AT \u57fa\u7840\u6846\u67b6\u662f\u505a\u4e3a\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\u6765\u8bbe\u8ba1\u7684\uff0c\u5b83\u63d0\u4f9b\u4e86\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u57fa\u7840\u529f\u80fd\uff0c\u4efb\u4f55\u5e94\u7528\u63a5\u5165\u8fdb\u6765\u90fd\u80fd\u5feb\u901f\u65b9\u4fbf\u7684\u8fdb\u884c\u65b9\u6cd5\u548c\u7528\u4f8b\u7f16\u5199\uff0c\u540c\u65f6\u5728\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u3001\u6807\u7b7e\u5316\u6267\u884c\u3001\u5206\u5e03\u5f0f\u6267\u884c\u3001\u591a\u79cd\u62a5\u544a\u8f93\u51fa\u3001\u4f18\u7f8e\u7684\u6267\u884c\u65e5\u5fd7\u3001\u5931\u8d25\u81ea\u52a8\u5f55\u5c4f\u548c\u622a\u56fe\u3001\u81ea\u52a8\u73af\u5883\u6e05\u7406\u7b49\u7b49\uff0c\u5b83\u90fd\u63d0\u4f9b\u4e86\u5b8c\u5584\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u66f4\u91cd\u8981\u7684\u662f\u8fd9\u4e00\u5207\u4f7f\u7528\u8d77\u6765\u90fd\u975e\u5e38\u7b80\u5355\u3002 \u57fa\u7840\u6846\u67b6\u4e2d\u5305\u542b\u5e94\u7528\u5e93\uff08apps\uff09\u3001\u6838\u5fc3\u5e93\uff08src\uff09\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09\u3002 \u5e94\u7528\u5e93\uff08apps\uff09 \u5404\u4e2a\u5e94\u7528\u81ea\u5df1\u7684\u4ed3\u5e93\uff0c\u91cc\u9762\u4e3b\u8981\u5305\u542b\u7684\u662f\u7528\u4f8b\u3001\u65b9\u6cd5\u53ca\u4e00\u4e9b\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u53eb autotest-dde-file-manager \u3002 \u6838\u5fc3\u5e93\uff08src\uff09 \u6838\u5fc3\u5e93\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u5230\u6240\u6709\u5e95\u5c42\u6838\u5fc3\u529f\u80fd\uff0c\u8fd9\u662f\u6700\u91cd\u8981\u7684\u4e00\u4e2a\u90e8\u5206\uff0c\u7075\u9b42\u3002\u5177\u4f53\u529f\u80fd\u6a21\u5757\u53ca\u8bf4\u660e\u4f1a\u5728\u4e0b\u9762\u7b2c\u56db\u4e2a\u7ae0\u8282\u8be6\u7ec6\u63cf\u8ff0\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09 \u591a\u4e2a\u5e94\u7528\u90fd\u8981\u7528\u5230\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\uff0c\u6309\u7167\u5e94\u7528\u5212\u5206\u5b58\u653e\uff0c\u4e3b\u8981\u662f\u4e3a\u4e86\u51cf\u5c11\u4ee3\u7801\u91cf\uff0c\u6d88\u9664\u5e94\u7528\u95f4\u7684\u8026\u5408\u5173\u7cfb\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u67b6\u6784\u56fe","text":"\u6574\u4f53\u7684\u6846\u67b6\u8bbe\u8ba1\u5728\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u300b\u6587\u6863\u91cc\u9762\u5df2\u7ecf\u6709\u8be6\u7ec6\u63cf\u8ff0\u4e86\uff0c\u8fd9\u91cc\u8d34\u4e00\u4e0b\u6574\u4f53\u7684\u67b6\u6784\u56fe\uff1a \u4e3a\u4e86\u7a81\u663e\u672c\u6587\u7684\u91cd\u70b9\uff0c\u62bd\u53d6\u5176\u4e2d\u91cd\u8981\u529f\u80fd\u6a21\u5757\uff0c\u5982\u4e0b\u56fe\uff1a "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-basic-frame # \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\n\u251c\u2500\u2500 apps # \u5e94\u7528\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-dde-file-manager # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\uff08\u5e94\u7528\u5e93\u8be6\u7ec6\u76ee\u5f55\u7ed3\u6784\u8bf7\u770b\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\uff09\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 tag # \u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u2514\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u2502 \u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 xxx.png\n\u2502 \u2502 ...\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-deepin-music # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 public # \u516c\u5171\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget # dde_dock \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget # dde_desktop \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 src # \u6838\u5fc3\u5e93\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 button_center.py\n\u2502 \u251c\u2500\u2500 cmdtrl.py\n\u2502 \u251c\u2500\u2500 dogtails.py\n\u2502 \u251c\u2500\u2500 find_image.py\n\u2502 \u251c\u2500\u2500 global_config.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 setting # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 config.py\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 global_config.ini\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\u6a21\u5757\uff08Hook\uff09\n\u251c\u2500\u2500 pytest.ini # Pytest \u9ed8\u8ba4\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 docs # \u6587\u6863\u76ee\u5f55\n\u2514\u2500\u2500 manage.py # \u6267\u884c\u5668\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1apps","title":"1\u3001\u5e94\u7528\u5e93\uff08apps\uff09","text":"\u6240\u6709\u5e94\u7528\u5e93\u5747\u653e\u7f6e\u5728\u57fa\u7840\u6846\u67b6\u4e0b\u7684 apps \u76ee\u5f55\u4e0b\uff08\u89c1\u7b2c\u4e8c\u7ae0\u8282\u7b2c3\u6bb5\u76ee\u5f55\u7ed3\u6784\u5185\u5bb9\uff09\u3002\u5e94\u7528\u5e93\u7684\u67b6\u6784\u8bbe\u8ba1\u53ef\u4ee5\u53c2\u8003\u300aAT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b\u6587\u6863\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2src","title":"2\u3001\u6838\u5fc3\u5e93\uff08src\uff09","text":"\u5728 src \u76ee\u5f55\u4e0b\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u5e95\u5c42\u6838\u5fc3\u7ec4\u4ef6\uff0c\u901a\u5e38\u6765\u8bb2\u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5230\u5176\u4e2d\u67d0\u4e00\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4e48\u4f60\u9700\u8981\u663e\u793a\u7684\u5bfc\u5165\u8fd9\u4e2a\u6a21\u5757\uff0c\u7136\u540e\u624d\u80fd\u4f7f\u7528\u8be5\u6a21\u5757\u4e0b\u7684\u529f\u80fd\uff0c\u5982\u679c\u4f60\u7528\u5230\u4e86\u5341\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4f60\u5c31\u9700\u8981\u5bfc\u5165\u5341\u4e2a\u3002\u4f46\u662f\u6211\u4eec\u60f3\u8ba9\u4e8b\u60c5\u53d8\u5f97\u7b80\u5355\uff0c\u4e00\u6b21\u5bfc\u5165\uff0c\u4f7f\u7528\u6240\u6709\u3002 \u5c06\u6240\u6709\u7684\u529f\u80fd\u6a21\u5757\u90fd\u8fdb\u5165\u5230 src \u7684\u540d\u79f0\u7a7a\u95f4\uff0c\u5728 src/__init__.py \u91cc\u9762\u6211\u4eec\u8bbe\u8ba1\u6210\u8fd9\u6837\uff1a # src/__init__.py\nfrom .cmdctl import CmdCtl\nfrom .dogtails import Dogtail\nfrom .find_image import FindImage\nfrom .button_center import ButtonCenter\nclass Src(CmdCtl, FindImage):\ndef __init__(self, **kwargs):\n\"\"\"dogtail or button center param\n :param kwargs: app_name, desc, number\n \"\"\"\nif kwargs:\napp_name = kwargs.get(\"APP_NAME\")\ndesc = kwargs.get(\"DESC\")\nif app_name is None or desc is None:\nraise ValueError\nnumber = kwargs.get(\"number\")\nnumber = number if isinstance(number, int) else -1\n# \u5bf9\u8c61\u7ec4\u5408\nself.dog = Dogtail(app_name, desc, number)\nself.ui = ButtonCenter(app_name, number)\n \u9700\u8981\u4f20\u9012\u53c2\u6570\u7684\u91c7\u7528\u5bf9\u8c61\u7ec4\u5408\uff0c\u6ca1\u6709\u53c2\u6570\u7684\u4f7f\u7528\u7ee7\u627f\uff0c\u7ee7\u627f\u7684\u7c7b\u7b26\u5408 Mixin \u8bbe\u8ba1\u6a21\u5f0f\u3002 \u5e94\u7528\u5e93\u91cc\u9762\u4f7f\u7528\u7684\u65f6\u5019\u5728 widget/base_widget.py \u91cc\u9762\u53ea\u9700\u8981\u552f\u4e00\u7ee7\u627f Src \uff1a # \u5e94\u7528\u5e93\u91cc\u9762\u65b9\u6cd5\u57fa\u7c7b\n# widget/base_widget.py\nfrom src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n \u8981\u4f7f\u7528\u6838\u5fc3\u5e93\u7684\u529f\u80fd\uff0c\u53ea\u9700\u8981\u5199\u4e00\u4e2a\u5bfc\u5165 from src import Src \u5373\u53ef\u3002 \u5199 __init__ \u6784\u9020\u51fd\u6570\u7684\u539f\u56e0\u662f\u901a\u8fc7\u53c2\u6570\u6784\u9020\u5e94\u7528\uff0c\u5e76\u4e14\u4f20\u9012 number \u8fdb\u6765\uff0c\u53ef\u4ee5\u5b9e\u73b0\u591a\u7a97\u53e3\u7684\u63a7\u5236\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3public","title":"3\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09","text":"\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6bcf\u4e2a\u5e94\u7528\u90fd\u662f\u4e00\u4e2a\u5355\u72ec\u7684 py \u6587\u4ef6\uff0c\u76f8\u4e92\u4e4b\u95f4\u662f\u72ec\u7acb\u7684\uff0c\u6bcf\u4e2a py \u6587\u4ef6\u91cc\u9762\u662f\u8be5\u5e94\u7528\u7684\u65b9\u6cd5\u7c7b\uff0c\u6bd4\u5982\uff1a\u6700\u5e38\u7528\u7684\u65b9\u6cd5\u7c7b dde_desktop_public_widget.py # dde_desktop_widget.py\nfrom src import Src\nclass _DdeDesktopPublicBaseWidget(Src):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-desktop\"\nDESC = \"/usr/bin/dde-desktop\"\ndef __init__(self):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC)\nclass DdeDesktopPublicWidget(_DdeDesktopPublicBaseWidget):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u7c7b\"\"\"\ndef click_music_dir_by_ui(self):\n\"\"\"\u5728\u6587\u4ef6\u9009\u62e9\u6846\u70b9\u51fb\u97f3\u4e50\u76ee\u5f55\"\"\"\nself.click(*self.ui.btn_center(\"\u4fa7\u8fb9\u680f-\u97f3\u4e50\")) \ndef click_xxx_by_attr(self):\npass\n \u516c\u5171\u65b9\u6cd5\u5e93\u610f\u4e49\uff1a \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6240\u5c01\u88c5\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\u90fd\u662f\u81f3\u5c11\u88ab2\u4e2a\u5e94\u7528\u90fd\u7528\u5230\u7684\uff0c\u8fd9\u6837\u505a\u53ef\u4ee5\u51cf\u5c11\u6574\u4f53\u4ee3\u7801\u91cf\uff0c\u4ece\u800c\u51cf\u8f7b\u5e94\u7528\u5e93\u4ee3\u7801\u7684\u7ef4\u62a4\u5de5\u4f5c\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u7f16\u5199\u5f62\u5f0f\uff08\u547d\u540d\u89c4\u5219\u3001\u5b9a\u4f4d\u7684\u65b9\u6848\u5199\u6cd5\u3001\u6ce8\u91ca\u7684\u5199\u6cd5\u7b49\u7b49\uff09\u5177\u6709\u4e00\u5b9a\u7684\u6a21\u677f\u4f5c\u7528\uff0c\u8fd9\u6837\u5373\u4f7f\u662f\u5404\u4e2a\u5e94\u7528\u5e93\u90fd\u72ec\u7acb\u7ef4\u62a4\uff0c\u6240\u6709\u7684\u7f16\u7801\u98ce\u683c\u90fd\u662f\u8d8b\u4e8e\u76f8\u540c\u7684\uff0c\u56e0\u4e3a\u5927\u5bb6\u90fd\u5e94\u8be5\u53c2\u7167\u516c\u5171\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u5199\u6cd5\u6765\u5199\u81ea\u5df1\u5e94\u7528\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\u7c7b\uff0c\u8fd9\u6837\u4f7f\u5f97\u4ece\u516c\u53f8\u7684\u89d2\u5ea6\u53bb\u770b\u6240\u6709\u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u90fd\u662f\u7edf\u4e00\u7684\u3002 \u53ef\u4ee5\u901a\u8fc7\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\uff0c\u4e86\u89e3\u5230\u5176\u4ed6\u5e94\u7528\u7684\u529f\u80fd\uff0c\u5bf9\u4e8e\u6211\u4eec\u9700\u6c42\u7406\u89e3\uff0c\u4e86\u89e3\u7cfb\u7edf\u7684\u65b9\u65b9\u9762\u9762\u4e5f\u6709\u597d\u5904\u3002 \u5f53\u7136\uff0c\u5982\u679c\u4f60\u7684\u5e94\u7528\u672c\u8eab\u662f\u5c5e\u4e8e\u6839\u672c\u5c31\u4e0d\u9700\u8981\u548c\u5176\u4ed6\u5e94\u7528\u4ea4\u4e92\u7684\uff0c\u90a3\u4e48\u4f60\u53ef\u80fd\u4e0d\u4f1a\u7528\u5230\u8fd9\u91cc\u9762\u7684\u529f\u80fd\uff0c\u6ca1\u5173\u7cfb\uff0c\u4f60\u6240\u6709\u7684\u65b9\u6cd5\u90fd\u53ef\u4ee5\u76f4\u63a5\u5199\u5728\u5e94\u7528\u5e93\u7684\u4e1a\u52a1\u5c42\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4conftestpy","title":"4\u3001conftest.py","text":"conftest.py \u4ece\u529f\u80fd\u4e0a\u5c06\u662f\u5c5e\u4e8e\u6838\u5fc3\u5e93\uff08src\uff09\u7684\u5185\u5bb9\uff0c\u4f46\u662f\u7531\u4e8e\u5b83\u7684\u7279\u6b8a\u6027\uff0c\u5373\u5b83\u662f\u5bf9\u5e94\u7528\u5e93\u4e2d\u7684\u7528\u4f8b\u751f\u6548\u7684\uff0c\u800c\u4e14\u5b83\u7684\u4f5c\u7528\u57df\u662f\u5f53\u524d\u76ee\u5f55\u53ca\u4ee5\u4e0b\uff0c\u56e0\u6b64\u6211\u4eec\u5c06\u5b83\u653e\u5230\u9879\u76ee\u6839\u76ee\u5f55\u3002\u6211\u4eec\u6846\u67b6\u4e2d\u6709\u4e0d\u5c11\u6838\u5fc3\u529f\u80fd\u90fd\u662f\u5728\u8fd9\u91cc\u9762\u8fdb\u884c\u5f00\u53d1\u7684\uff0c\u540e\u9762\u7b2c\u56db\u7ae0\u4f1a\u8bb2\u5230\u7ec6\u8282\u3002 pytest.ini \u4f5c\u7528\u548c conftest.py \u7c7b\u4f3c\uff0c\u662f Pytest \u6846\u67b6\u7684\u56fa\u5b9a\u914d\u7f6e\u6587\u4ef6\uff0c\u76ee\u524d\u914d\u7f6e\u4e86\u4e00\u4e9b\u901a\u7528\u7684\u547d\u4ee4\u884c\u6267\u884c\u53c2\u6570\uff0c\u4e5f\u653e\u5728\u9879\u76ee\u6839\u76ee\u5f55\u3002 \u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 Hook \u51fd\u6570\uff0capps \u76ee\u5f55\u4e0b\u7684 \u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 fixture \u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5setting","title":"5\u3001setting","text":"\u5168\u5c40\u914d\u7f6e\u6a21\u5757\uff0c\u5305\u542b\u4e86\u4ee5\u4e0b\u914d\u7f6e\u6587\u4ef6\uff1a \uff081\uff09ini \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u914d\u7f6e\u4e00\u4e9b\u5168\u5c40\u7684\u914d\u7f6e\u9879\uff0c\u8b6c\u5982\uff1a\u5931\u8d25\u91cd\u8dd1\u6b21\u6570\u3001\u662f\u5426\u5931\u8d25\u5f55\u5c4f\u3001\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\u3001\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4\u3001\u6267\u884c\u65f6\u65e5\u5fd7\u7ea7\u522b\u3001\u751f\u6210\u7684\u62a5\u544a\u7c7b\u578b\u3001\u4ee5\u53ca\u5206\u5e03\u5f0f\u6267\u884c\u7684\u4e00\u4e9b\u7b56\u7565\u914d\u7f6e\u9879\u7b49\u7b49\u3002 \uff082\uff09config.py \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u63d0\u4f9b\u914d\u7f6e\u6587\u4ef6\u8bfb\u53d6\u3001\u52a8\u6001\u83b7\u53d6\u4e00\u4e9b\u5e38\u91cf\uff08\u5982\u9879\u76ee\u6839\u76ee\u5f55\u7edd\u5bf9\u8def\u5f84 (BASE_DIR)\u3001\u7cfb\u7edf\u67b6\u6784\uff08SYS_FRAME\uff09\u3001\u65f6\u95f4\u5b57\u7b26\u4e32\uff08strftime\uff09\u3001\u672c\u673a USERNAME IP \u7b49\u7b49\uff09\u3001\u516c\u5171 URL \u7b49\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u89c4\u8303","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u7248\u672c\u53ca\u4f9d\u8d56","text":"\u57fa\u7840\u6846\u67b6\u4f1a\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u8fdb\u884c\u7248\u672c\u53d1\u5e03\uff0c\u4e0d\u4e0e\u67d0\u4e2a\u5e94\u7528\u7248\u672c\u7ed1\u5b9a\uff0c\u4f46\u662f\uff0c\u5e94\u7528\u5e93\u4f1a\u4f9d\u8d56\u4e8e\u57fa\u7840\u6846\u67b6\u7684\u7248\u672c\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u5efa\u8bae\u5728\u5e94\u7528\u5e93\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a\u6587\u672c\u6587\u4ef6\u7528\u4e8e\u8bb0\u5f55\u6240\u4f9d\u8d56\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\uff0c\u7c7b\u4f3c\u4e8e\u5f00\u53d1\u5e94\u7528\u7684 debian/control \u6587\u4ef6\u7684\u529f\u80fd\uff0c\u4e3a\u4e86\u4fdd\u6301\u7edf\u4e00\uff0c\u8fd9\u4e2a\u6587\u4ef6\u5c31\u547d\u540d\u4e3a control\uff0c\u653e\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u6838\u5fc3\u5e93\u72ec\u7acb\u6027","text":"\u6838\u5fc3\u5e93\u4e0d\u5efa\u8bae\u9488\u5bf9\u67d0\u4e00\u4e2a\u5e94\u7528\u5355\u72ec\u505a\u4ee3\u7801\u4e0a\u7279\u6b8a\u5904\u7406\uff0c\u901a\u5e38\u8003\u8651\u9488\u5bf9\u67d0\u4e00\u79cd\u573a\u666f\u8fdb\u884c\u5904\u7406\uff0c\u8fd9\u4e9b\u573a\u666f\u901a\u5e38\u662f\u5b58\u5728\u4e00\u4e9b\u5171\u6027\u7684\u3002\u6bd4\u5982\u8bf4\uff1a\u684c\u9762\u7684ID\u5206\u914d\u5b58\u5728\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u903b\u8f91\u5904\u7406\u89e3\u51b3ID\u5206\u914d\u9519\u8bef\u7684\u95ee\u9898\uff0c\u4f46\u662f\u8fd9\u90e8\u5206\u903b\u8f91\u6211\u4eec\u4f1a\u5728\u684c\u9762\u7684\u65b9\u6cd5\u5c42\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u517c\u5bb9\u6027","text":"\u4e3a\u4e86\u4fdd\u6301\u517c\u5bb9\u6027\uff0c\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u539f\u5219\u4e0a\u4e0d\u5bf9\u8001\u65b9\u6cd5\u8fdb\u884c\u4fee\u6539\u6216\u5220\u9664\uff0c\u53ea\u8fdb\u884c\u65b0\u589e\u3002\u6d89\u53ca\u5230\u8001\u65b9\u6cd5\u4fee\u6539\u6216\u5220\u9664\u7684\uff0c\u4f1a\u8fdb\u884c\u63d0\u524d\u9884\u544a\uff0c\u5e76\u5728\u7b2c\u4e8c\u4e2a\u7248\u672c\u4e4b\u540e\uff08\u4e2d\u95f4\u4f1a\u9694\u4e00\u4e2a\u7248\u672c\u8fc7\u5ea6\uff09\u6b63\u5f0f\u5b9e\u65bd\u4fee\u6539\u6216\u5220\u9664\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u547d\u540d\u89c4\u8303","text":" \u7528\u4f8b ID \u6bcf\u4e2a\u5e94\u7528\u81ea\u5df1\u7ef4\u62a4\u4e00\u5957 ID\uff0c\u5728PMS\u4e0a\u7528\u4f8b\u6807\u9898\u4e0a\u5c06\u81ea\u52a8\u5316ID\u4ee5\u6807\u7b7e\u7684\u5f62\u5f0f\u5199\u5165\uff0c\u6bd4\u5982\uff1a[101]\u6253\u5f00-\u542f\u52a8\u5e94\u7528\u540edock\u53f3\u952e\u83dc\u5355 \u4e00\u4e2a\u7528\u4f8b\u7c7b\u91cc\u9762\u6709\u591a\u4e2a\u7528\u4f8b\u65f6\uff0c\u5728\u7528\u4f8b\u540d\u79f0\u540e\u9762\u52a0\u5e8f\u53f7\u3002 class TestFileManager(BaseCase):\n\"\"\"\u6587\u7ba1\u7528\u4f8b\"\"\"\ndef test_xxx_015_1(self):\npass\ndef test_xxx_015_2(self):\npass\n \u6ce8\u610f 015_1\uff0c\u4e0d\u8981\u5199015_01\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 PMS \u4e0a\u7684\u7528\u4f8bID\uff1a PMS \u4e0a\u662f6\u4f4d\u6570\uff0c\u4e0d\u591f\u76f4\u89c2\uff0c\u4e5f\u4e0d\u597d\u7ef4\u62a4\uff0c\u5728\u81ea\u52a8\u5316\u4e0b\u9762\u53bb\u627e\u4e00\u4e2a\u5e26\u6709 6 \u4f4d\u6570\u7684\u6587\u4ef6\u662f\u4e00\u4e2a\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 PMS \u4e0a\u7684 ID \u53ef\u80fd\u4f1a\u53d1\u751f\u53d8\u5316\uff0c\u6bd4\u5982\u5bfc\u51fa\u6765\u5bfc\u8fdb\u53bb\u7684\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u5b58\u5728\u95ee\u9898\uff0c\u5982\u679c\u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u8981\u60f3\u627e\u51fa\u6765\u5bf9\u5e94\u4fee\u6539\u81ea\u52a8\u5316\u7528\u4f8b ID\uff0c\u5c06\u4f1a\u662f\u4ef6\u975e\u5e38\u75db\u82e6\u7684\u4e8b\u60c5\u3002 \u51fd\u6570\u547d\u540d\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5de6\u952e\u70b9\u51fb click \u53f3\u952e\u70b9\u51fb right_click \u53cc\u51fb double_click \u79fb\u52a8 move_to \u62d6\u52a8 drag \u65b0\u5efa new \u62d6\u52a8\u5230 drag_to \u4ece\u54ea\u91cc\u62d6\u52a8\u5230\u54ea\u91cc drag_something_from_xxx_to_xxx \u83b7\u53d6 get \u83b7\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5750\u6807 get_location \u975e\u7279\u6b8a\u6587\u4ef6 file word\u6587\u4ef6 doc text\u6587\u4ef6 text \u6587\u4ef6\u5939 dir \u5173\u952e\u8bcd\u6301\u7eed\u589e\u52a0 \u5e38\u91cf\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5e94\u7528\u540d\u79f0 APP_NAME \u5e94\u7528\u63cf\u8ff0 DESC \u672c\u5e94\u7528\u4ee5\u5916\u7684\u5176\u4ed6\u5e94\u7528\uff0c\u6bd4\u5982\u5e2e\u52a9 HELP \u5176\u4ed6\u540d\u79f0\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u65b9\u6cd5\u5305\u540d widget \u65b9\u6cd5\u6587\u4ef6\u540d\uff08\u6587\u7ba1\u4e3e\u4f8b\uff09 dfm_widget.pytitle_widget.pyright_view_widget.pyleft_view_widget.pypop_widget.pybase_widget.pydfm_assert.py \u65ad\u8a00\u8bed\u53e5\u547d\u540d\u89c4\u8303 \u65ad\u8a00\u8bed\u53e5\u90fd\u662f\u4ee5 assert \u5f00\u5934 \u65ad\u8a00 \u8bed\u53e5 \u5224\u65ad\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_existsassert_file_not_exists \u5224\u65ad\u684c\u9762\u76ee\u5f55\u4e0b\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_exists_in_desktopassert_file_not_exists_in_desktop \u5224\u65ad\u56fe\u7247\u5b58\u5728 assert_image_existsassert_image_not_exists \u5224\u65ad\u5f71\u9662\u4e2d\u662f\u5426\u5b58\u5728\u56fe\u7247 assert_image_exists_in_movieassert_image_not_exists_in_movie \u5224\u65ad\u5143\u7d20\u662f\u5426\u5b58\u5728 assert_element_existassert_element_not_exist \u5224\u65ad\u662f\u5426\u76f8\u7b49 assert_equalassert_not_equal \u5224\u65ad\u662f\u5426\u4e3a\u771f assert_trueassert_false"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5fixture","title":"5\u3001fixture \u89c4\u8303","text":"\u7531\u4e8e Pytest \u6846\u67b6\u4e2d\u652f\u6301 fixture \u7684\u5199\u6cd5\u548c Xunit \u5199\u6cd5\u7684\uff0c\u6240\u4ee5\u5e94\u7528\u5e93\u4e2d\u53ef\u80fd\u5b58\u5728\u6df7\u7528\u7684\u60c5\u51b5\uff0c\u4e3a\u7edf\u4e00\u7f16\u7801\u98ce\u683c\u65b9\u4fbf\u540e\u7eed\u7528\u4f8b\u4ee3\u7801\u7ef4\u62a4\uff0c\u73b0\u505a\u4ee5\u4e0b\u89c4\u8303\u8bf4\u660e\uff1a \u629b\u5f03 Xunit \u7684\u5199\u6cd5\uff0c\u7edf\u4e00\u91c7\u7528 Pytest fixture \u7684\u5199\u6cd5\u3002 \u5e94\u7528\u5185 fixture \u8c28\u614e\u4f7f\u7528 autouse=True \uff0c\u975e\u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u975e\u5e38\u4e0d\u5efa\u8bae\u4f7f\u7528\u8fd9\u4e2a\u53c2\u6570\u3002 \u8c03\u7528 fixture \u4e0d\u80fd\u4f7f\u7528 @pytest.mark.usefixture()\uff0c\u4f7f\u7528\u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u4f20\u5165\u51fd\u6570\u5bf9\u8c61\u3002 \u5efa\u8bae\u5728\u4e00\u4e2a conftest.py \u91cc\u9762\u53bb\u5199\uff0c\u4e00\u4e2a\u5e94\u7528\u4e5f\u5c3d\u91cf\u7ef4\u62a4\u4e00\u4e2a conftest.py\u6587\u4ef6\u3002 fixture \u4e5f\u9700\u8981\u5199\u529f\u80fd\u8bf4\u660e\uff0c\u51fd\u6570\u540d\u79f0\u8981\u6709\u5177\u4f53\u542b\u4e49\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#6","title":"6\u3001\u65b9\u6cd5\u7f16\u5199\u89c4\u8303","text":" \u65b9\u6cd5\u7c7b\u578b\uff1a if \u6ca1\u6709\u7528\u5230\u5b9e\u4f8b\u5bf9\u8c61\uff1a\nif \u6ca1\u6709\u7528\u5230\u7c7b\u5bf9\u8c61\uff1a\n\u5199\u9759\u6001\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @staticmethod\nelse\uff1a\n\u5199\u7c7b\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @classmethod\nelse:\n\u76f4\u63a5\u5199\u5b9e\u4f8b\u65b9\u6cd5\n \u4e3e\u4f8b: class TitleWidget:\ndef click_xxx_by_ui(self):\npass\n@staticmethod\ndef click_xxx_by_ui():\npass\n@classmethod\ndef click_xxx_by_ui(cls):\npass\n \u51fd\u6570\u540d\u79f0\u4e0d\u51fa\u73b0\u6570\u5b57\uff0c\u9700\u8981\u8868\u793a\u6570\u91cf\u7684\u7528\u5355\u8bcd\u8868\u793a\u3002 \u51fd\u6570\u529f\u80fd\u6ce8\u91ca\u3002 \u6ca1\u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg2:xxx\n\"\"\"\n \u6709\u53c2\u6570\uff0c\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg1:xxx\nreturn: xxx\n\"\"\"\n \u200b \u7528 Pycharm \u7684\u6ce8\u91ca\u6a21\u677f\u4e5f\u53ef\u4ee5\uff0c\u53ea\u8981\u4f53\u73b0\u4e86\u53c2\u6570\u7684\u7c7b\u578b\u548c\u8fd4\u56de\u5c31\u884c\u4e86\u3002 \u6682\u4e0d\u8981\u6c42\u5199\u7c7b\u578b\u6ce8\u89e3\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#7case","title":"7\u3001\u7528\u4f8b\uff08case\uff09\u89c4\u8303","text":" \u4ee5\u7c7b\u7684\u5f62\u5f0f\u5199\u7528\u4f8b\uff0c\u7528\u4f8b\u7c7b\u96c6\u6210\u7528\u4f8b\u57fa\u7c7b\u3002 \u7528\u4f8b\u7c7b\u9700\u8981\u5199\u6ce8\u91ca\u3002 \u6d4b\u8bd5\u7528\u4f8b\u51fd\u6570\u8bf4\u660e\uff08\u5efa\u8bae\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u540d\u79f0\uff09 \"\"\"\u53f3\u4fa7\u9884\u89c8-\u56fe\u7247\u7c7b\u578b\u4fe1\u606f\u680f\u57fa\u672c\u4fe1\u606f\"\"\"\n \u4e0d\u5199\u8c03\u8bd5\u4ee3\u7801 if __name__ == '__main__':\npytest.main()\n \u6240\u6709\u7528\u4f8b\u90fd\u7ee7\u627f BaseCase\u3002 BaseCase \u91cc\u9762\u653e\u4e00\u4e9b\u6d4b\u8bd5\u6570\u636e\u7684\u5e38\u91cf\uff0c\u6bd4\u5982\u6587\u4ef6\u540d\u79f0\uff0c\u5e94\u7528\u540d\u79f0\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u4e00\u4e9b\u901a\u7528\u7684\u5b57\u7b26\u4e32\u3002 \u8fd9\u7c7b\u662f\u5c5e\u4e8e\u6d4b\u8bd5\u6570\u636e\u3002 class BaseCase(DfmAssert):\n\"\"\"\u7528\u4f8b\u57fa\u7c7b\"\"\"\nNEW_FILE = \"\u65b0\u5efa\u6587\u672c.txt\"\nTEST_FILE = \"test.txt\"\nNEW_DIR = \"\u65b0\u5efa\u6587\u4ef6\u5939\"\nNEW_WORD = \"\u65b0\u5efaWord\u6587\u6863.doc\"\nAPP_HELP = \"damn\"\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\n\"\"\"\u7528\u4f8b\u6807\u9898\uff08\u590d\u5236PMS\u4e0a\u7528\u4f8b\u6807\u9898\uff09\"\"\"\ndfm = DfmWidget()\ndfm.click_xxx_by_attr(self.NEW_FILE)\ndfm.new_file_in_desktop_by_cmd(self.NEW_FILE)\nself.assert_true(dfm.get_process_status(self.APP_NAME))\n \u7528\u4f8b\u91cc\u9762\u5c3d\u91cf\u51cf\u5c11\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\uff0c\u66f4\u8981\u51cf\u5c11\u76f8\u540c\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\u3002 \u7edf\u4e00\u6587\u4ef6\u6ce8\u91ca\u5934\u3002 #!/usr/bin/env python3\n# _*_ coding:utf-8 _*_\n\"\"\"\n:Author:email@uniontech.com\n:Date :${DATE} ${TIME}\n\"\"\"\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#8","title":"8\u3001\u5176\u4ed6\u89c4\u8303","text":" \u65e5\u5fd7\u6253\u5370\u8981\u5728\u65b9\u6cd5\u6700\u524d\u9762\uff0c\u5426\u5219\u4ee3\u7801\u62a5\u9519\u6ca1\u6709\u65e5\u5fd7\u8f93\u51fa\uff0c\u4e0d\u597d\u5b9a\u4f4d\u95ee\u9898\u3002\uff08\u6211\u4eec\u4f1a\u8003\u8651\u7ee7\u7eed\u4f7f\u7528\u62e6\u622a\u5668\u6253\u5370\u65e5\u5fd7\uff09 \u6240\u6709\u7684\u64cd\u4f5c\u90fd\u9700\u8981\u6709\u65e5\u5fd7\uff0c\u5305\u62ec sleep()\uff0c\u6211\u4eec\u4f1a\u91cd\u5199\u4e00\u4e2a\u6709\u65e5\u5fd7\u8f93\u5165\u7684 sleep\u3002 \u4e1a\u52a1\u5c42\u65e5\u5fd7\u7ea7\u522b\u4e3a INFO\u3002 hook \u51fd\u6570\u53ea\u80fd\u5199\u5230\u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u91cc\u9762\u3002 apps \u76ee\u5f55\u4e0b\u7684 conftest.py \u539f\u5219\u4e0a\u4e0d\u4f1a\u65b0\u589e fixture\u3002 \u56fa\u5b9a\u76ee\u5f55\u6216\u5143\u7d20\u63a7\u4ef6\u7684\u64cd\u4f5c\uff0c\u5c06\u64cd\u4f5c\u65b9\u6cd5\u5199\u6b7b\uff0c\u6587\u4ef6\u7c7b\u64cd\u4f5c\u5c06\u6587\u4ef6\u540d\u7559\u53c2\u6570\u3002 \u8def\u5f84\u62fc\u63a5\u89c4\u8303\uff1a \u7cfb\u7edf\u4e2d\u56fa\u5b9a\u76ee\u5f55\uff0c\u8def\u5f84\u62fc\u63a5\u65f6\u4f7f\u7528\u6ce2\u6d6a\u7b26\u53f7\uff0c\u6bd4\u5982\uff1a~/Desktop/\uff0c\u4e0b\u5c42\u4f7f\u7528 os.path.expanduser()\uff0c\u5b83\u53ef\u4ee5\u81ea\u52a8\u8bc6\u522b\u6ce2\u6d6a\u7b26\u53f7\u3002 \u9879\u76ee\u4e0b\u8def\u5f84\u4f7f\u7528\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u8def\u5f84\uff0c\u6bd4\u5982\uff1aConfig.BASE_PATH\uff0c\u56e0\u4e3a\u9879\u76ee\u662f\u53ef\u4ee5\u5728\u4efb\u610f\u8def\u5f84\u8fd0\u884c\u7684\uff0c\u9700\u8981\u52a8\u6001\u62fc\u63a5\u8def\u5f84\u3002 "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848","text":"# =================================================\n# Author : Mikigo\n# Time : 2022/3/16\n# version \uff1a1.0\n# =================================================\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"AT \u5e94\u7528\u5e93\u6539\u9020\u662f\u57fa\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u8fdb\u884c\u7528\u4f8b\u65b9\u6cd5\u548c\u4e1a\u52a1\u903b\u8f91\u7684\u91cd\u65b0\u8bbe\u8ba1\uff0c\u4ee5\u5b9e\u73b0\u5e94\u7528\u5e93\u9ad8\u6548\u7684\u7f16\u5199\u3001\u7ef4\u62a4\u7528\u4f8b\u53ca\u5176\u65b9\u6cd5\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u6587\u4ef6\u7ba1\u7406\u5668\u4ece\u4e1a\u52a1\u590d\u6742\u5ea6\u548c\u7528\u4f8b\u91cf\u6765\u8bb2\uff0c\u5728\u7cfb\u7edf\u6240\u6709\u5e94\u7528\u4e2d\uff0c\u662f\u5f88\u6709\u4ee3\u8868\u6027\u7684\uff0c\u96be\u5ea6\u4e5f\u662f\u6700\u5927\u7684\uff0c\u56e0\u6b64\u6211\u4eec\u9009\u53d6\u6587\u4ef6\u7ba1\u7406\u5668\u4f5c\u4e3a\u5e94\u7528\u5e93\u6539\u9020\u7684\u5b9e\u9a8c\u5e94\u7528\uff0c\u7ed9\u540e\u7eed\u5176\u4ed6\u5e94\u7528\u6539\u9020\u63d0\u4f9b\u5207\u5b9e\u53ef\u884c\u7684\u601d\u8def\u548c\u65b9\u6848\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u5206\u5c42\u8bbe\u8ba1\u56fe","text":"\u6574\u4f53\u4ecd\u7136\u9075\u5faa PO \u8bbe\u8ba1\u7406\u5ff5\uff0c\u6839\u636e\u4e1a\u52a1\u9700\u8981\uff0c\u5c06\u6587\u7ba1\u4e1a\u52a1\u5c42\u8fdb\u884c 3 \u5c42\u5212\u5206\uff1a "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-dde-file-manager # \u5e94\u7528\u4ed3\u5e93\n\u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 test_xxx_001.py\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u00a0\u251c\u2500\u2500 __init__.py\n\u2502 \u00a0\u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u00a0\u251c\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u00a0\u251c\u2500\u2500 base_widget.py # \u65b9\u6cd5\u57fa\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 title_widget.py # title \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 right_view_widget.py # right view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 left_view_widget.py # left view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 pop_widget.py # pop \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 dfm_widget.py # \u65b9\u6cd5\u7684\u7edf\u4e00\u51fa\u53e3\n\u2502 \u00a0\u2514\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 tag # \u7528\u4f8b\u6807\u7b7e\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 xxx.csv # \u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2514\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u57fa\u7c7b","text":" \u7ee7\u627f\u6838\u5fc3\u5c42\u7684\u5404\u4e2a\u6a21\u5757\u7c7b\u3002 \u62bd\u53d6\u64cd\u4f5c\u5c42\u7684\u4e00\u4e9b\u57fa\u7840\u65b9\u6cd5\u3002 \u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u7684\u4e00\u4e9b\u516c\u5171\u65b9\u6cd5\u3002 \u8def\u5f84\u7ec4\u88c5\u65b9\u6cd5\u3002 \u4e00\u4e9b\u4e1a\u52a1\u5c42\u76f8\u5173\u7684\u53d8\u91cf\u3001\u5e38\u91cf\u3001shell\u547d\u4ee4\u3001\u5750\u6807\u3002 \u65b9\u6cd5\u57fa\u7c7b\u7684\u5199\u6cd5\uff1a from src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u64cd\u4f5c\u5c42","text":" \u6a21\u5757\u5212\u5206 \u6309\u7167\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u6587\u7ba1\u4e3b\u754c\u9762\u5206\u4e3a\u4e09\u4e2a\u533a\u57df\uff1a\u6807\u9898\u680f\u3001\u53f3\u8fb9\u89c6\u56fe\u533a\u57df\u3001\u5de6\u8fb9\u89c6\u56fe\u533a\u57df \u5f39\u7a97\uff1a\u8bbe\u7f6e\u754c\u9762\u5f39\u7a97\u3001\u4fdd\u9669\u7bb1\u5f39\u7a97\u3001\u5220\u9664\u786e\u8ba4\u5f39\u7a97\u3001\u53ca\u5404\u79cd\u7f51\u7edc\u5f39\u7a97 \u53f3\u952e\u83dc\u5355\uff1a\u6682\u65f6\u4e0d\u8003\u8651\u4e3a\u5355\u72ec\u7684\u6a21\u5757\uff0c\u8003\u8651\u4ee5\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6848\u505a\u6210\u516c\u5171\u5e93\u3002 \u5404\u4e2a\u6a21\u5757\u53ea\u7ee7\u627f\u57fa\u7c7b from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u6784\u9020\u51fd\u6570\u91cc\u9762\u4e0d\u6784\u9020\u5bf9\u8c61\uff0c\u53ef\u4ee5\u521d\u59cb\u5316\u4e00\u4e9b\u53d8\u91cf\u3002 \u4e0d\u540c\u7684\u5b9a\u4f4d\u65b9\u6848\u8c03\u7528\u4e0d\u540c\u7684\u5b9a\u4f4d\u5de5\u5177\u5bf9\u8c61\u3002 self.dog\nself.ui\nself.d_bus\n \u65b9\u6cd5\u7f16\u5199 \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u5e94\u7528\u5c42","text":" \u7ee7\u627f\u64cd\u4f5c\u5c42\u7684\u6240\u6709\u7c7b\u3002 \u4ec5\u4ec5\u7528\u4e8e\u7528\u4f8b\u4e2d\u5bfc\u5165\u65b9\u4fbf\uff0c\u4e0d\u505a\u5176\u4ed6\u4e8b\u60c5\u3002 class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n DfmAssert \u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u7ee7\u627f\uff0c\u65b9\u4fbf\u4f7f\u7528\u65ad\u8a00\u8bed\u53e5\u3002 from apps.dde_file_manager.widget.dfm_widget import DfmWidget\nfrom public.assert import Assert\nclass DfmAssert(Assert):\ndef assert_file_exists_in_desktop(self, file_name):\nself.assert_file_exists(f\"~/Desktop{file_name}\")\n...\nDfmWidget().get_file_in_desktop()\n \u7528\u4f8b\u91cc\u9762\u76f4\u63a5\u7ee7\u627f\uff0c\u65b9\u4fbf\u5728\u7528\u4f8b\u91cc\u9762\u4f7f\u7528 self \u8fdb\u884c\u65ad\u8a00\uff0c\u66f4\u7b26\u5408\u65ad\u8a00\u7684\u4f7f\u7528\u4e60\u60ef\uff0c\u7528\u4f8b\u903b\u8f91\u4e0a\u66f4\u6e05\u695a\u3002 class BaseCase(DfmAssert):\npass\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\nself.assert_file_exists_in_desktop(\"xxx\")\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u903b\u8f91\u4e3e\u4f8b","text":"\u7528\u4f8b\u4ee3\u7801\u8c03\u7528\u903b\u8f91\u4e3e\u4f8b\uff1a # BaseWidget\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n# =============================================\n# TitleWidget\nclass TitleWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_title_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# RightViewWidget\nclass RightViewWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_right_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# =============================================\n# \u51fa\u53e3 DfmWidget\nclass DfmWidget(TitleWidget, RightViewWidget):\npass\n# =============================================\n# in case\nfrom apps.dde_file_manager.widget.dfm_widget import DfmWidget\ndfm = DfmWidget()\ndfm.click_xxx_title_by_ui()\ndfm.click_xxx_right_by_ui()\ndfm.dog.print_desc()\ndfm.ui.print_number()\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u5de5\u7a0b\u6539\u9020\u5b9e\u65bd\u6b65\u9aa4","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_2","title":"1\u3001\u5de5\u7a0b\u4ee3\u7801\u62c9\u53d6","text":"1.1. \u5c06\u81ea\u52a8\u5316\u57fa\u7840\u6846\u67b6\u7684\u529f\u80fd\u62c9\u5230\u672c\u5730 Autotest Basic Frame \uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame 1.2. \u5c06\u5e94\u7528\u5e93\u4ee3\u7801\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u5e94\u7528\u5e93\u7684\u4ed3\u5e93\u547d\u540d\u5e94\u8be5\u662f\u957f\u8fd9\u6837\u7684 autotest_deepin_xxx\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_2","title":"2\u3001\u8c03\u6574\u5de5\u7a0b\u76ee\u5f55","text":"\u6309\u7167 \u65b9\u6848\u8bbe\u8ba1-\u76ee\u5f55\u7ed3\u6784 \u8fdb\u884c\u76ee\u5f55\u8c03\u6574\uff0c\u5c3d\u91cf\u4f7f\u7528\u7f16\u8f91\u5668\u8fdb\u884c\u76f8\u5e94\u7684\u8c03\u6574\uff0c\u7f16\u8f91\u5668\u63a8\u8350\u4f7f\u7528 Pycharm \uff0c\u4ee5\u4e0b\u64cd\u4f5c\u5747\u5728 Pycharm \u91cc\u9762\u53ef\u5b9e\u73b0\u3002 2.1. \u9700\u8981\u79fb\u52a8 py \u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u76f4\u63a5\u5728\u7f16\u8f91\u5668\u91cc\u9762\uff0c\u4f7f\u7528\u9f20\u6807\u9009\u4e2d\u5e76\u6309\u4f4f\uff0c\u4e4b\u540e\u62d6\u52a8\u5230\u76ee\u6807\u4f4d\u7f6e\u5373\u53ef\uff0cPycharm \u4f1a\u5c3d\u53ef\u80fd\u7684\u81ea\u52a8\u89e3\u51b3\u79fb\u52a8\u5bfc\u81f4\u7684\u8def\u5f84\u95ee\u9898\u3002\u6ce8\u610f\uff0c\u6211\u8bf4\u7684\u662f\u201c\u5c3d\u53ef\u80fd\u201d\uff0c\u6709\u4e9b\u9a9a\u64cd\u4f5c\u7f16\u8f91\u5668\u662f\u65e0\u6cd5\u81ea\u52a8\u5904\u7406\u7684\u3002\u5982\u679c\u6ca1\u6709\u88ab\u7f16\u8f91\u5668\u81ea\u52a8\u5904\u7406\u7684\u8def\u5f84\u95ee\u9898\uff0c\u540e\u7eed\u53ea\u80fd\u624b\u52a8\u89e3\u51b3\u3002 2.2. \u9700\u8981\u91cd\u547d\u540d\u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u5728\u7f16\u8f91\u5668\u91cc\u9762\u9009\u4e2d\u6587\u4ef6\uff0c\u7136\u540e\u4f7f\u7528\u5feb\u6377\u952e Shift + F6 \uff08\u5982\u679c\u5feb\u6377\u952e\u6ca1\u53cd\u5e94\uff0c\u6587\u4ef6\u53f3\u952e\u83dc\u5355 Refactor \u2014\u2014 Rename\uff09\uff0c\u7136\u540e\u5728\u8f93\u5165\u6846\u4e2d\u8f93\u5165\u8981\u91cd\u547d\u540d\u7684\u540d\u79f0\uff0c\u540c\u65f6\uff0c\u786e\u8ba4\u52fe\u9009 Search for references \u548c Search in comments and strings \u8fd9\u4e24\u4e2a\u9009\u9879\uff0c\u6700\u540e\u6309\u56de\u8f66\u6216\u8005\u9f20\u6807\u70b9 Refactor \u3002 \u6ce8\u610f\uff0c\u6b64\u65f6\u7f16\u8f91\u5668\u53ef\u80fd\u4f1a\u63d0\u793a\u4f60\uff0c\u4f60\u8fd9\u4e2a\u91cd\u547d\u540d\u7684\u64cd\u4f5c\u5173\u8054\u4e86\u591a\u4e2a\u6a21\u5757\uff0c\u5b83\u88ab\u591a\u4e2a\u5730\u65b9\u90fd\u4f7f\u7528\u5230\u4e86\uff0c\u76f8\u5173\u7684\u6a21\u5757\u662f\u5426\u4e5f\u4e00\u8d77\u6539\u540d\u4e86\uff0c\u8fd9\u4e0d\u5e9f\u8bdd\u5417\uff0c\u7528\u8fd9\u4e2a\u529f\u80fd\u5c31\u662f\u60f3\u628a\u5173\u8054\u5230\u7684\u90fd\u4fee\u6539\uff0c\u4e0d\u7136\u6211\u4e3a\u4ec0\u4e48\u4e0d\u7528\u6587\u7ba1\u7684\u91cd\u547d\u540d\u529f\u80fd\u5462\uff0c\u522b\u60f3\u4e86\uff0c\u76f4\u63a5\u70b9\u5de6\u4e0b\u89d2\u7684 Refactor \u6309\u94ae\uff0c\u5c31\u662f\u5e72\u3002 \u7c7b\u540d\u3001\u51fd\u6570\u540d\u7684\u91cd\u547d\u540d\u90fd\u5c3d\u91cf\u91c7\u7528\u8fd9\u79cd\u65b9\u6848\uff0c\u56e0\u4e3a\u7f16\u8f91\u5668\u4f1a\u81ea\u52a8\u7ed9\u6211\u4eec\u627e\u5230\u5173\u8054\u7684\u5730\u65b9\uff0c\u7136\u540e\u540c\u6b65\u4fee\u6539\u6389\u3002\u4f60\u53ef\u5343\u4e07\u522b\u76f4\u63a5\u5220\u4e86\u4fee\u6539\u540d\u79f0\uff0c\u4e0d\u7136\u4f60\u53ef\u80fd\u4f1a\u82b1\u4e0a\u4e00\u5929\u7684\u65f6\u95f4\u6765\u89e3\u51b3\u91cd\u547d\u540d\u7684\u95ee\u9898\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u5b9e\u73b0\u6838\u5fc3\u5e93\u63a5\u53e3","text":"3.1. BaseWidget \u5728 BaseWidget \u91cc\u9762\u628a\u8be5\u5199\u7684\u90fd\u5199\u597d\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u4e0a\u9762\u7684\u8bbe\u8ba1\u7406\u5ff5\u6765\u5199\u3002 \u5982\u679c\u4f60\u5acc\u9ebb\u70e6\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u6587\u7ba1\u7684\u5b9e\u9645\u5de5\u7a0b\u4ee3\u7801 autotest_dde_file_manager : https://gerrit.uniontech.com/admin/repos/autotest_dde_file_manager \u3002 3.2. \u64cd\u4f5c\u5c42 \u5982\u679c\u4f60\u662f\u65b0\u5199\u9879\u76ee\uff0c\u4f60\u4f1a\u53d1\u73b0\u4e00\u5207\u90fd\u662f\u90a3\u4e48\u7684\u7b80\u5355\u3001\u76f4\u63a5\uff0c\u6309\u7167\u6211\u4eec\u63d0\u4f9b\u7ed9\u4f60\u7684\u63a5\u53e3\u5199\u7528\u4f8b\u7684\u64cd\u4f5c\u65b9\u6cd5\u5c31\u597d\u4e86\u3002 \u5982\u679c\u4f60\u662f\u60f3\u5bf9\u539f\u6765\u7684\u5de5\u7a0b\u8fdb\u884c\u6539\u9020\uff0c\u4f60\u9700\u8981\u6309\u7167\u6838\u5fc3\u5e93\u65b9\u6cd5\u7684\u8c03\u7528\uff0c\u5c06\u4f60\u4e4b\u524d\u5199\u7684\u6bcf\u4e2a\u65b9\u6848\u8fdb\u884c\u5bf9\u5e94\u7684\u4fee\u6539\uff0c\u5305\u62ec\u7c7b\u548c\u65b9\u6cd5\u7684\u547d\u540d\u3001\u65b9\u6cd5\u5185\u6240\u8981\u7528\u5230\u4e0d\u540c\u5b9a\u4f4d\u65b9\u6cd5\u7684\u5199\u6cd5\u4fee\u6539\u3002 \u8fd9\u65f6\u5019\u4f60\u53ef\u80fd\u4f60\u7684\u4ee3\u7801\u4e2d\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u62a5\u9519\uff0c\u4e0d\u7528\u62c5\u5fc3\uff0c\u4f60\u53ef\u4ee5\u4ece\u4e1a\u52a1\u903b\u8f91\u51fa\u53d1\uff0c\u60f3\u6e05\u695a\u8fd9\u4e2a\u65b9\u6cd5\u662f\u5e72\u4ec0\u4e48\u7684\u3001\u64cd\u4f5c\u7684\u5bf9\u8c61\u662f\u4ec0\u4e48\u3001\u53c2\u6570\u662f\u4ec0\u4e48\uff0c\u6ce8\u610f\u8fd9\u4e9b\u4fee\u6539\u662f\u4f1a\u5f71\u54cd\u5230\u7528\u4f8b\u4ee3\u7801\u91cc\u9762\u7684\uff0c\u6ca1\u5173\u7cfb\uff0c\u7528\u4f8b\u91cc\u9762\u672c\u6765\u4e5f\u5e94\u8be5\u88ab\u5173\u8054\u4fee\u6539\u3002 3.3. \u628a\u914d\u7f6e\u6a21\u5757\u5199\u597d\uff0c\u8fd9\u90e8\u5206\u57fa\u672c\u53ef\u4ee5\u590d\u5236\u6587\u7ba1\u7684\u4ee3\u7801\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4_1","title":"4\u3001\u8def\u5f84\u5904\u7406","text":"4.1. \u5bfc\u5165\u8def\u5f84 \u65b9\u6cd5\u548c\u7528\u4f8b\u4e2d\u90fd\u4f1a\u6d89\u53ca\u5230\u5bfc\u5165\u8def\u5f84\u7684\u4fee\u6539\uff0c\u5728\u4fee\u6539\u8def\u5f84\u65f6\uff0c\u5efa\u8bae\u4f60\u4f7f\u7528 Ctrl + Shift + R \u5168\u5c40\u66ff\u6362\uff0c\u4f1a\u5c06\u6574\u4e2a\u9879\u76ee\u4e0b\u7684\u76f8\u540c\u5730\u65b9\u90fd\u4fee\u6539\u5230\uff0c\u5f53\u7136\uff0c\u4f60\u4e5f\u53ef\u4ee5\u5728\u5c0f\u5f39\u7a97\u4e2d\u4fee\u6539\u5168\u5c40\u66ff\u6362\u4e3a\u5c40\u90e8\u76ee\u5f55\u4e0b\u66ff\u6362\u3002\u5904\u7406\u90a3\u79cd\u6ca1\u6709\u5173\u8054\u5173\u7cfb\uff0c\u4f46\u662f\u53c8\u662f\u76f8\u540c\u540d\u79f0\u7684\u91cd\u547d\u540d\uff0c\u6211\u4e5f\u63a8\u8350\u4f7f\u7528\u8fd9\u79cd\u65b9\u5f0f\u8fdb\u884c\u91cd\u547d\u540d\u3002 \u6ce8\u610f\uff0c\u5168\u5c40\u66ff\u6362\u7684\u65b9\u5f0f\u4efb\u7136\u65e0\u6cd5\u4fdd\u8bc1\u771f\u7684\u5168\u5c40\u88ab\u66ff\u6362\u4e86\uff08\u53ef\u80fd\u662f\u7f16\u8f91\u5668\u7684 Bug \u5427\uff09\uff0c\u6240\u4ee5\u4f60\u4ecd\u7136\u9700\u8981\u624b\u52a8\u770b\u4e0b\u5404\u5904\u662f\u5426\u4fee\u6539\u5230\u4f4d\u3002 4.2. \u8d44\u6e90\u8def\u5f84 \u4e00\u4e9b\u7528\u4f8b\u8d44\u6e90\u9700\u8981\u6839\u636e config.py \u91cc\u9762\u7684\u8def\u5f84\u914d\u7f6e\u8fdb\u884c\u8d44\u6e90\u8def\u5f84\u7684\u62fc\u63a5\uff0c\u5982\u679c\u4f60\u539f\u6765\u672c\u6765\u5c31\u6709\u4e00\u4e2a\u51fd\u6570\u4e13\u95e8\u7528\u4e8e\u7ec4\u88c5\u8def\u5f84\u7684\uff0c\u90a3\u4f60\u53ea\u9700\u8981\u4fee\u6539\u8fd9\u4e00\u4e2a\u5730\u65b9\u5c31\u597d\u4e86\uff0c\u5982\u679c\u4f60\u4e4b\u524d\u5e76\u6ca1\u6709\u8fd9\u6837\u7684\u8bbe\u8ba1\uff0c\u90a3\u53ef\u80fd\u9700\u8981\u4fee\u6539\u5927\u91cf\u6d89\u53ca\u5230\u8d44\u6e90\u8def\u5f84\u7684\u5730\u65b9\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5","title":"5\u3001\u8c03\u8bd5\u548c\u7f16\u5199\u7528\u4f8b","text":"\u4ee5\u4e0a\u51e0\u4e2a\u6b65\u9aa4\u505a\u5b8c\uff0c\u57fa\u672c\u5c31\u53ef\u4ee5\u8fdb\u884c\u7528\u4f8b\u4ee3\u7801\u7684\u8c03\u8bd5\u4e86\uff0c\u8fd9\u90e8\u5206\u5de5\u4f5c\u4e3b\u8981\u89e3\u51b3\u4f60\u4e4b\u524d\u51e0\u4e2a\u6b65\u9aa4\u9057\u6f0f\u7684\u95ee\u9898\uff0c\u5982\u679c\u6240\u6709\u7528\u4f8b\u90fd\u8c03\u8bd5\u901a\u8fc7\u4e86\uff0c\u90a3\u4e48\u5de5\u7a0b\u6539\u9020\u5c31\u5168\u90e8\u5b8c\u6210\u4e86\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/","title":"AT \u5f00\u53d1\u89c4\u8303","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u5f00\u53d1\u89c4\u8303\u662f\u6839\u636e\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fd0\u884c\u4e24\u5e74\u591a\u6765\uff0c\u9047\u5230\u95ee\u9898\u89e3\u51b3\u95ee\u9898\u800c\u5f62\u6210\u7684\u4e00\u4e9b\u89e3\u51b3\u65b9\u6848\uff0c\u6216\u8005\u8bf4\u7ecf\u9a8c\u603b\u7ed3\uff1b\u8fd9\u4e9b\u7ecf\u9a8c\u7b26\u5408\u6211\u4eec\u73b0\u9636\u6bb5 AT \u6240\u5e94\u7528\u7684\u573a\u666f\u9700\u8981\uff0c\u4e5f\u662f\u6211\u4eec\u7ecf\u8fc7\u957f\u671f\u601d\u8003\uff0c\u4e0d\u65ad\u8bd5\u9519\u4e0d\u65ad\u4fee\u6b63\uff0c\u5e76\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u5b9e\u8df5\u4e2d\u68c0\u9a8c\u8fc7\u53ef\u884c\u7684\u3002\u4ee5\u6b64\uff0c\u5e0c\u671b\u80fd\u5e2e\u52a9\u53c2\u4e0e\u5230\u81ea\u52a8\u5316\u7684\u76f8\u5173\u4eba\u5458\u51cf\u5c11\u8bd5\u9519\u6210\u672c\uff0c\u66f4\u597d\u3001\u66f4\u5feb\u7684\u7f16\u5199\u7528\u4f8b\u53ca\u7ef4\u62a4\u7528\u4f8b\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_1","title":"\u4e00\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u89c4\u8303","text":"\u6807\u7b7e\u5316\u7ba1\u7406\u6587\u6863\u8bf7\u53c2\u8003\uff1a \u300a\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u64cd\u4f5c\u6307\u5f15\u300b \u4ee5\u4e0b\u8bf4\u51e0\u4e2a\u5bb9\u6613\u51fa\u73b0\u7684\u95ee\u9898\uff1a"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1","title":"1. \u5bf9\u5e94\u5173\u7cfb","text":" \u5199\u5b8c\u81ea\u52a8\u5316\u7528\u4f8b\u4e4b\u540e\uff0c\u8bf7\u5728 CSV \u6587\u4ef6\u4e2d\u6807\u8bb0\u7528\u4f8b\u7684 ID\u3001\u7b49\u7ea7\u3002\u4e3a\u4e86\u63d0\u9192\u6807\u8bb0\uff0c\u6267\u884c\u7528\u4f8b\u65f6\u5728\u9996\u884c\u4f1a\u8f93\u51fa ERROR \u65e5\u5fd7\uff1a CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94\u7684 ID\uff1b \u5728\u6700\u7ec8\u63d0\u4ea4\u4ee3\u7801\u4e4b\u524d\uff0c\u4f60\u9700\u8981\u5728 CSV \u6587\u4ef6\u91cc\u9762\u5c06ID\u3001\u7528\u4f8b\u7b49\u7ea7\u7b49\u6807\u7b7e\u8865\u5168\uff0c\u5982\u679c CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94 ID\uff0c\u540e\u7eed\u5728\u6279\u91cf\u6267\u884c\u7684\u65f6\u5019\uff0c\u8fd9\u4e9b\u7528\u4f8b\u662f\u4e0d\u4f1a\u6267\u884c\u7684\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2","title":"2. \u540d\u79f0\u4e00\u81f4","text":" CSV \u6587\u4ef6\u7684\u6587\u4ef6\u540d\u3001\u7528\u4f8b\u51fd\u6570\u4e2d\u95f4\u7684\u540d\u79f0\u4e00\u81f4\u3001\u7528\u4f8b py \u6587\u4ef6\u4e2d\u95f4\u7684\u540d\u79f0\uff0c\u8fd9\u4e09\u4e2a\u540d\u79f0\u4e00\u81f4\u3002 \u4e3e\u4f8b\uff1a # test_music_001.py\ndef test_music_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u90a3\u4e48 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e3a music.csv\u3002 AT \u6846\u67b6\u5e95\u5c42\u4ee3\u7801\u5b9e\u73b0\u662f\u5c06 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e0e\u7528\u4f8b\u51fd\u6570\u540d\u79f0\u540d\u79f0\uff08item.name\uff09\u8fdb\u884c\u5bf9\u5e94\uff0c\u56e0\u6b64\uff0c\u6ce8\u610f CSV \u6587\u4ef6\u540d\u79f0\u5bf9\u5e94\u7684\u662f\u7528\u4f8b\u51fd\u6570\u540d\u79f0\uff0c\u5373 def test_music_001 \u91cc\u9762\u7684 music \uff0c\u800c\u4e0d\u662f test_music_001.py \u91cc\u9762\u7684 music \u3002 \u8fd9\u91cc\u7ec6\u7ec6\u54c1\u4e00\u4e0b\u54c8~ \u5982\u679c\u4f60\u5c06\u4e0a\u4f8b\u5199\u6210\u4e86\u8fd9\u6837: # test_music_001.py\ndef test_movie_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u7528\u4f8b\u6267\u884c\u6ca1\u95ee\u9898\uff0c\u4f46\u662f\u6807\u7b7e\u5316\u7ba1\u7406\u662f\u4e0d\u751f\u6548\u7684\uff0c\u6846\u67b6\u65e0\u6cd5\u5c06 music.csv\u6587\u4ef6\u91cc\u9762\u6807\u7b7e\uff0c\u6dfb\u52a0\u5230 test_movie_001\u8fd9\u4e2a\u7528\u4f8b\u4e2d\uff0c\u56e0\u4e3a\u4ed6\u4eec\u6ca1\u6709\u5bf9\u5e94\u5173\u7cfb\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#tag","title":"\u4e8c\u3001\u5206\u652f\u53ca tag \u7ba1\u7406\u89c4\u8303","text":"\u53c2\u8003\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u4ee3\u7801\u7ba1\u7406\u89c4\u8303\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2-tag","title":"2. \u5e94\u7528\u5e93 tag","text":" \u5e94\u7528\u5e93 tag \u6839\u636e\u5e94\u7528\u4ea4\u4ed8\u8282\u70b9\u751f\u6210\uff0c\u6bcf\u6b21\u6253 tag \u4e4b\u524d\uff0c\u76f8\u5173\u6d4b\u8bd5\u4eba\u5458\u9700\u8981\u8fdb\u884c\u7528\u4f8b\u8c03\u8bd5\uff1b \u8c03\u8bd5\u7528\u4f8b\u662f\u6307\u7684\u5728\u5168\u67b6\u6784\uff08x86\u3001arm\u3001mips\uff09\u4e0a\u8c03\u8bd5\u901a\u8fc7\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\u8fbe\u5230 90% \u4ee5\u4e0a\u624d\u80fd\u6253 tag\uff0c\u901a\u8fc7 Jenkins \u6267\u884c\u5668\u6267\u884c\u7528\u4f8b\uff0c\u4fdd\u7559\u901a\u8fc7\u7387\u7ed3\u679c\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\uff1a\u901a\u8fc7\u7528\u4f8b\u6570 / (\u603b\u7528\u4f8b\u6570 - \u5df2\u5e9f\u5f03\u7528\u4f8b) \u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u7b97\u901a\u8fc7 Jenkins \u6267\u884c\u5668 \u4f60\u53ef\u80fd\u4f1a\u5728\u4e00\u4e2a\u4ea4\u4ed8\u5468\u671f\u5185\u6301\u7eed\u7684\u8fdb\u884cAT\u7528\u4f8b\u8c03\u8bd5\uff0c\u4f46\u662f\u6700\u7ec8 AT \u7528\u4f8b\u6253 tag \u7684\u5e94\u7528\u7248\u672c\uff0c\u9700\u8981\u4f7f\u7528\u5e94\u7528\u96c6\u6210\u4ea4\u4ed8\u7684\u6700\u65b0\u5e94\u7528\u7248\u672c\uff0c\u53ef\u4ee5\u4f7f\u7528\u5e94\u7528\u7684\u63d0\u6d4b\u7248\u672c\uff1b\u4e00\u5b9a\u8981\u786e\u4fdd\u8c03\u8bd5\u7528\u4f8b\u7684\u5e94\u7528\u7248\u672c\u662f\u6700\u65b0\u7684\uff0c\u4e0d\u7136\u96c6\u6210\u8fdb\u53bb\u4e4b\u540e\uff0c\u6301\u7eed\u96c6\u6210\u5c31\u4f1a\u51fa\u95ee\u9898\uff1b tag \u53f7\u600e\u4e48\u6253\uff1f \u6839\u636e\u6301\u7eed\u96c6\u6210\u7684\u8981\u6c42\u751f\u6210\uff0c\u5176\u4e2d\u5e94\u7528\u7248\u672c\u53f7\u9700\u8981\u4e0e\u9879\u76ee\u7ecf\u7406\u786e\u8ba4\u672c\u6b21\u5373\u5c06\u96c6\u6210\u7684\u5e94\u7528\u7248\u672c\u53f7\u662f\u591a\u5c11\uff1b tag \u7684 commit \u4fe1\u606f\u683c\u5f0f\uff1a # commit msg\nversion:5.6.5\n \u5176\u4e2d 5.6.5 \u5199\u5e94\u7528\u7684\u96c6\u6210\u7248\u672c\u53f7\u3002 \u751f\u6210 tag \u7684\u547d\u4ee4\u53c2\u8003\uff1a\u300aGit \u6807\u7b7e\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3-tag","title":"3. \u57fa\u7840\u6846\u67b6 tag","text":"\u57fa\u7840\u6846\u67b6 tag \u4e0d\u4e0e\u4e1a\u52a1\u6302\u94a9\uff0c\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u6309\u9700\u53d1\u5e03\u7248\u672c\uff0c\u5728\u6839\u76ee\u5f55\u4e0b CURRENT \u6587\u4ef6\u4e2d\u8bb0\u5f55\u7684\u5f53\u524d\u7248\u672c\u53f7\u548c\u5386\u53f2\u7248\u672c\u53f7\uff0c\u53ca\u5176\u5bf9\u5e94\u65b0\u589e\u4e86\u54ea\u4e9b\u529f\u80fd\uff0c\u6709\u52a9\u4e8e\u5e94\u7528\u9009\u62e9\u5408\u9002\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\u3002 # CURRENT\n[current]\ntag = 0.9.5\n \u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u7684 control \u6587\u4ef6\u8bb0\u5f55\u5f53\u524d\u5e94\u7528\u5e93\u4f9d\u8d56\u7684\u57fa\u7840\u5e93\u7248\u672c\u3002 # control\n[Depends]\nautotest-basic-frame = 0.9.5\n \u7528\u4f8b\u5728\u6267\u884c\u65f6\u4f1a\u6821\u9a8c\u4e24\u4e2a\u6587\u4ef6\u7684\u7248\u672c\u53f7\u662f\u5426\u4e00\u81f4\uff0c\u5982\u679c\u4e0d\u4e00\u81f4\uff0c\u4f1a\u6253\u5370 error \u65e5\u5fd7\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_2","title":"\u4e09\u3001\u4ed3\u5e93\u6743\u9650\u7ba1\u7406","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_1","title":"1. \u57fa\u7840\u6846\u67b6","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u4ed3\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame \u57fa\u7840\u6846\u67b6\u4e0d\u5141\u8bb8\u533f\u540d\u8bbf\u95ee\uff0c\u5982\u679c\u4f60\u767b\u5f55 gerrit \u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u8bbf\u95ee\u4ee5\u4e0a\u94fe\u63a5\uff0c\u5219\u9700\u8981\u7533\u8bf7\u8bbf\u95ee\u6743\u9650\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_1","title":"2. \u5e94\u7528\u4ed3\u5e93","text":" \u81ea\u52a8\u5316\u5e94\u7528\u4ed3\u5e93\uff1a https://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684 app_name \u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_3","title":"\u56db\u3001\u65b9\u6cd5\u7f16\u5199&\u8c03\u7528\u89c4\u8303","text":"\u65b9\u6cd5\u7f16\u5199\u6574\u4f53\u8bbe\u8ba1\u601d\u8def\u53c2\u8003\uff1a[\u300aAT\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b]"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_2","title":"1. \u65b9\u6cd5\u7f16\u5199","text":"\u5199\u65b9\u6cd5\u7684\u65f6\u5019\u6ce8\u610f\u65b9\u6cd5\u5f52\u5c5e\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget\uff0c\u65b9\u6cd5\u662f\u5728\u54ea\u4e2a\u533a\u57df\u64cd\u4f5c\u7684\uff0c\u5c31\u5199\u5728\u54ea\u4e2a\u7c7b\u91cc\u9762\u3002 \u4e3e\u4f8b\uff1a from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n\"\"\"\u70b9\u51fb\u6807\u9898\u680fxxx\"\"\"\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_2","title":"2. \u65b9\u6cd5\u8c03\u7528","text":" \u5728\u7528\u4f8b\u4e2d\u8c03\u7528\u65b9\u6cd5\uff0c\u901a\u8fc7\u8be5\u5e94\u7528\u552f\u4e00\u7684\u51fa\u53e3\u8fdb\u884c\u8c03\u7528\uff0c\u6bd4\u5982\u6587\u7ba1\uff1a class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n \u4e0d\u8981\u5728\u7528\u4f8b\u4e2d\u5355\u72ec\u53bb\u8c03\u7528 TitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u8fd9\u4e9b\u7c7b\uff0c\u5426\u5219\u540e\u671f\u7528\u4f8b\u4f1a\u53d8\u5f97\u4e0d\u597d\u7ef4\u62a4\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_4","title":"\u4e94\u3001\u7528\u4f8b\u7f16\u5199\u89c4\u8303","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_3","title":"1. \u57fa\u4e8e\u7c7b\u5199\u7528\u4f8b","text":"\u6240\u6709\u7528\u4f8b\u90fd\u5e94\u8be5\u57fa\u4e8e\u7c7b\u53bb\u5199\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001(self):\n\"\"\"\u97f3\u4e50\u542f\u52a8\"\"\"\n \u6ce8\u610f\u4ee5\u4e0b\u51e0\u70b9\uff1a \u7c7b\u540d\u4e0d\u8981\u968f\u4fbf\u53d6\uff0c\u540c\u4e00\u4e2a\u5e94\u7528\u5e94\u8be5\u4f7f\u7528\u540c\u4e00\u4e2a\u7c7b\u540d\uff0c\u7528\u4f8b\u7c7b\u540d\u79f0\u5fc5\u987b\u4ee5 Test \u5f00\u5934\uff0c\u9075\u5faa\u5927\u9a7c\u5cf0\u547d\u540d\u89c4\u8303\uff1b \u7528\u4f8b\u7c7b\u7ee7\u627f BaseCase\uff0c\u4e00\u4e2a\u5e94\u7528\u53ea\u6709\u4e00\u4e2a BaseCase \u4e00\u4e2a py \u6587\u4ef6\u91cc\u9762\u53ea\u6709\u4e00\u4e2a\u7c7b\uff0c\u6211\u4eec\u79f0\u4e3a\u4e00\u4e2a\u6d4b\u8bd5\u7c7b\uff1b \u4e00\u4e2a\u7c7b\u91cc\u9762\u53ef\u4ee5\u6709\u591a\u4e2a\u7528\u4f8b\u51fd\u6570\uff0c\u8fd9\u53d6\u51b3\u8fd9\u6761\u7528\u4f8b\u6709\u591a\u5c11\u4e2a\u6d4b\u8bd5\u70b9\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001_1(self):\n\"\"\"\u4efb\u52a1\u680f\u542f\u52a8\u97f3\u4e50\"\"\"\ndef test_music_001_2(self):\n\"\"\"\u542f\u52a8\u5668\u542f\u52a8\u97f3\u4e50\"\"\" \ndef test_music_001_3(self):\n\"\"\"\u684c\u9762\u542f\u52a8\u97f3\u4e50\"\"\"\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_3","title":"2. \u7528\u4f8b\u51fd\u6570\u89c4\u8303","text":" \u7528\u4f8b\u51fd\u6570\u4ee5 test \u5f00\u5934\uff0c\u9075\u5faa\u86c7\u5f62\u547d\u540d\u89c4\u8303\uff0c\u4e2d\u95f4\u4e3a\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0\uff0c\u540e\u9762\u52a0\u7528\u4f8b ID\uff0c\u6700\u540e\u52a0\u6d4b\u8bd5\u70b9\u5e8f\u53f7\uff0c\u5373 test_${module}_${case_id}[_${index}] \uff1b \u6bd4\u5982\uff1atest_music_001_1\uff0cindex \u4ece 1 \u5f00\u59cb\u3002 \u51fd\u6570\u529f\u80fd\u8bf4\u660e\u91cc\u9762\u5199\u7528\u4f8b\u6807\u9898\uff0c\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u6807\u9898\u5373\u53ef\uff0c\u6ce8\u610f\u7528\u4e09\u5bf9\u53cc\u5f15\u53f7\uff0c\u4e0d\u8981\u7528\u5176\u4ed6\u6ce8\u91ca\uff0c\u66f4\u4e0d\u8981\u7528\u4e95\u53f7\u6ce8\u91ca\u5199\u7528\u4f8b\u6807\u9898\uff1b \u76f4\u63a5\u590d\u5236 PMS \u7528\u4f8b \u7528\u4f8b\u6b65\u9aa4\u76f4\u63a5\u5c06 PMS \u4e0a\u7528\u4f8b\u6b65\u9aa4\u548c\u9884\u671f\u590d\u5236\u8fdb\u6765\uff0c\u7136\u540e\u8fdb\u884c\u6279\u91cf\u6ce8\u91ca\uff08ctrl + /\uff09\uff0c\u5728\u6ce8\u91ca\u7684\u57fa\u7840\u4e0a\u53bb\u5199\u7528\u4f8b\u811a\u672c\u4f1a\u66f4\u52a0\u65b9\u4fbf\u5168\u9762\uff0c\u4e5f\u6bd4\u4f60\u81ea\u5df1\u5199\u6ce8\u91ca\u66f4\u8282\u7ea6\u65f6\u95f4\uff1a \u4e3e\u4f8b\uff0cPMS \u7528\u4f8b\uff1a \u76f4\u63a5\u9009\u4e2d\u7528\u4f8b\u5185\u5bb9\uff0c\u590d\u5236\u4e0b\u6765\uff0c\u7136\u540e\u7c98\u8d34\u5230\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c\u4e2d\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\n \u4e0a\u4f8b\u4e2d\u4e95\u53f7\u6ce8\u91ca\u90e8\u5206\u5c31\u662f\u76f4\u63a5\u4ece PMS \u4e0a\u590d\u5236\u8fc7\u6765\u7684\uff0c\u5728\u6b64\u57fa\u7840\u4e0a\u5199\u7528\u4f8b\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\nmusic = DeepinMusicWidget()\nmusic.click_singer_btn_in_music_by_ui()\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\nmusic.click_icon_mode_in_music_by_ui()\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\nmusic.double_click_first_singer_in_singer_icon_view_by_ui()\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\nself.assert_xxx\n \u4f60\u770b\uff0c\u975e\u5e38\u6e05\u695a\u6bcf\u4e00\u6b65\u5728\u505a\u4ec0\u4e48\uff0c\u91cd\u70b9\u662f\u7701\u53bb\u4e86\u5199\u6ce8\u91ca\u7684\u65f6\u95f4\uff0c\u771f\u7684\u7092\u9e21\u65b9\u4fbf\u3002 \u4e0d\u5199 if __name__ == '__main__':\uff0c\u4e0d\u5199\u591a\u4f59\u7684\u4ee3\u7801\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3","title":"3. \u6570\u636e\u9a71\u52a8","text":" \u5982\u679c\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u662f\u76f8\u540c\u7684\uff0c\u53ea\u662f\u4e00\u4e9b\u53c2\u6570\u53d8\u5316\uff0c\u5c3d\u91cf\u4f7f\u7528\u6570\u636e\u9a71\u52a8\u6765\u5b9e\u73b0\u7528\u4f8b\uff1b \u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u6570\u636e\u9a71\u52a8\u7684\u6570\u636e\uff0c\u4e0d\u80fd\u56e0\u6b64\u5f15\u5165\u4f9d\u8d56\uff0c\u5c3d\u91cf\u4f7f\u7528\u4e00\u4e9b\u6807\u51c6\u5e93\u80fd\u8bfb\u53d6\u7684\u6587\u4ef6\u683c\u5f0f\uff0c\u6bd4\u5982 json\u3001ini\u3001CSV\u3001xml\u3001txt \u7b49\u6587\u4ef6\u683c\u5f0f\uff1b\u4e0d\u5efa\u8bae\u4f7f\u7528 Yaml\u3001Excel\u3001MySQL \u7b49\u6570\u636e\u683c\u5f0f\uff1b \u8bfb\u53d6\u6570\u636e\u65f6\u4e5f\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff0c\u5982\u4f7f\u7528 pandas \u5904\u7406 CSV \u5c31\u5c5e\u4e8e\u5927\u6750\u5c0f\u7528\u4e86\uff0c\u6b63\u5e38\u7684\u6570\u636e\u9a71\u52a8\u8fd8\u6ca1\u5230\u9700\u8981\u5927\u6570\u636e\u5206\u6790\u6765\u5904\u7406\u7684\u5730\u6b65\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u5728 widget/ddt/ \u76ee\u5f55\u4e0b\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5199\u6cd5\uff1a @pytest.mark.parametrize(\"value\", data)\ndef test_smb_049(self, value):\n \u4ee5\u4e0a\u8fd9\u79cd\u53c2\u6570\u5316\u7684\u5199\u6cd5\u672c\u8eab\u6ca1\u4ec0\u4e48\u95ee\u9898\uff0c\u4f46\u662f\uff0c\u8fd9\u91cc\u5fc5\u987b\u8981\u8865\u5145\u4e00\u4e2a\u6ca1\u6709\u7528\u7684\u5c0f\u77e5\u8bc6\uff1a \u5982\u679c\u53c2\u6570\u5316\u6570\u636e\u91cc\u9762\u7684\u5b57\u7b26\u4f1a\u539f\u5c01\u4e0d\u52a8\u7684\u8f93\u51fa\u5230 item.name \u91cc\u9762\uff0c\u663e\u793a\u975e\u5e38\u4e0d\u4f18\u96c5\uff0c\u800c\u4e14\u53ef\u4ee5\u4f1a\u5f15\u5165\u4e00\u4e9b\u610f\u60f3\u4e0d\u5230\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u611f\u53d7\u4e00\u4e0b\uff1a \u53c2\u6570\uff1a data = [\n\"\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\", \"qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678\",\n]\n \u73b0\u8c61\u662f\u8fd9\u6837\u8272\u513f\u7684\uff1a test_smb_049.py::TestFileManager::test_smb_049[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09]\ntest_smb_049.py::TestFileManager::test_smb_049[qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui]\ntest_smb_049.py::TestFileManager::test_smb_049[12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678]\n \u8bf4\u5b9e\u8bdd\uff0c\u770b\u7740\u5fc3\u91cc\u5835\u5f97\u614c\uff0c\u5982\u679c\u8fd9\u91cc\u9762\u5305\u542b\u4e00\u4e9b\u7279\u6b8a\u5b57\u7b26\u6216\u8005\u662f\u8d85\u957f\uff0c\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u5f88\u5947\u5999\u7684\u4e8b\u60c5\u53d1\u751f\u3002 parametrize \u91cc\u9762\u6709\u4e2a\u53c2\u6570\uff1aids\uff0c\u53ef\u4ee5\u89e3\u51b3\u6b64\u7c7b\u95ee\u9898\uff0c\u5c31\u50cf\u8fd9\u6837\uff1a @pytest.mark.parametrize(\"value\", data, ids=[1, 2, 3])\ndef test_smb_049(self, value):\n \u518d\u6765\u611f\u53d7\u4e00\u4e0b\uff1a test_smb_049.py::TestFileManager::test_smb_049[1]\ntest_smb_049.py::TestFileManager::test_smb_049[2]\ntest_smb_049.py::TestFileManager::test_smb_049[3]\n \u660e\u663e\u597d\u591a\u4e86\uff0c\u6240\u4ee5\u5c3d\u91cf\u4f7f\u7528 ids \u8fd9\u4e2a\u53c2\u6570\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 fixture \u7684\u6570\u636e\u9a71\u52a8\u65b9\u5f0f\uff0c\u6846\u67b6\u867d\u7136\u652f\u6301\uff0c\u4f46\u53ef\u8bfb\u6027\u6bd4\u8f83\u5dee\uff1b\u5982\u679c\u4f60\u4e0d\u77e5\u9053\u8fd9\u53e5\u8bdd\u5728\u8bf4\u5565\uff0c\u90a3\u4f60\u53ef\u4ee5\u5ffd\u7565\uff0c\u6211\u4e5f\u4e0d\u6253\u7b97\u8be6\u7ec6\u8bf4\u8fd9\u79cd\u5b9e\u73b0\u65b9\u5f0f\uff0c\u64cd\u4f5c\u6bd4\u8f83\u9a9a\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4","title":"4. \u65ad\u8a00\u8d44\u6e90","text":" \u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u76f4\u63a5\u653e\u5728\u7528\u4f8b\u6a21\u5757\u7684\u540c\u7ea7\u76ee\u5f55\u4e0b\u7684 assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0 + \u7528\u4f8b ID \u547d\u540d\uff1b \u56fe\u50cf\u8bc6\u522b\u65ad\u8a00\uff0c\u4e0d\u8981\u622a\u53d6\u4e00\u5f20\u5f88\u5927\u7684\u56fe\uff0c\u56fe\u7247\u8d44\u6e90\u5305\u542b\u7684\u5143\u7d20\u592a\u591a\u4e86\uff0c\u975e\u5e38\u5bb9\u6613\u53d7\u5230\u9700\u6c42\u5f71\u54cd\uff0c\u5efa\u8bae\u662f\u8fdb\u884c\u5c40\u90e8\u7684\u65ad\u8a00\uff1b \u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u5339\u914d\u5ea6\u662f 0.9\uff0c\u5982\u679c\u65ad\u8a00\u7684\u573a\u666f\u5bf9\u4e8e\u7cbe\u786e\u5ea6\u8981\u6c42\u6ca1\u90a3\u4e48\u9ad8\uff0c\u53ef\u4ee5\u5728\u65ad\u8a00\u8bed\u53e5\u91cc\u9762\u4f20\u5165\u5c0f\u4e8e 0.9 \u7684\u53c2\u6570\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5","title":"5. \u5143\u7d20\u5b9a\u4f4d","text":" \u7528\u4e8e\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u4e2d\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u547d\u540d\u4e3a\u8be5\u5143\u7d20\u7684\u540d\u79f0\uff1b \u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u622a\u53d6\u65f6\u5c3d\u91cf\u7cbe\u786e\u5230\u8fd9\u4e2a\u5177\u4f53\u7684\u6309\u94ae\uff0c\u56fe\u7247\u4e5f\u4e0d\u8981\u592a\u5927\uff1b \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u64cd\u4f5c\u8f83\u5feb\uff0c\u5408\u7406\u52a0\u5165\u7b49\u5f85\u65f6\u95f4\u80fd\u63d0\u9ad8\u7528\u4f8b\u7684\u7a33\u5b9a\u6027\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6","title":"6. \u7528\u4f8b\u8d44\u6e90","text":" \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u4f7f\u7528\u5230\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u6bd4\u5982\u97f3\u4e50\u53ef\u80fd\u9700\u8981\u4e00\u4e9b mp3 \u7684\u8d44\u6e90\u7528\u4e8e\u6d4b\u8bd5\uff0c\u5b58\u653e\u5728 widget/case_res \u76ee\u5f55\u4e0b\uff0c\u524d\u63d0\u662f\u8fd9\u4e9b\u8d44\u6e90\u4e0d\u8d85\u8fc7 10M\uff1b \u5982\u679c\u662f\u4e00\u4e9b\u6bd4\u8f83\u5927\u7684\u8d44\u6e90\uff0c\u5efa\u8bae\u653e\u5230\u7edf\u4e00\u7684 ftp \u670d\u52a1\u5668 \uff08ftp://10.8.10.245\uff09\uff0c\u9700\u8981\u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\u518d\u4e0b\u8f7d\u4e0b\u6765\uff1b f\"wget ftp://{Config.FTP_IP}/uploads/\u591a\u5a92\u4f53/\u5f71\u9662/auto/{file_name};unzip {file_name};rm -rf {file_name};\"\n \u6d4b\u8bd5\u8d44\u6e90\u4e0b\u8f7d\u5230\u5e94\u7528 widget/case_res \u76ee\u5f55\u4e0b\uff1b \u7981\u6b62\u5c06\u6d4b\u8bd5\u8d44\u6e90\u5b58\u653e\u5728\u4e2a\u4eba\u7684\u673a\u5668\u4e0a\uff1b \u5e94\u8be5\u5c3d\u91cf\u4fdd\u8bc1\uff0c\u4e00\u4e2a\u8d44\u6e90\u5728\u4e00\u6b21\u7528\u4f8b\u6267\u884c\u4e2d\u53ea\u9700\u8981\u4e0b\u8f7d\u4e00\u6b21\uff0c\u6240\u4ee5\u4f60\u4e0d\u80fd\u6bcf\u6b21\u4f7f\u7528\u7684\u65f6\u5019\u90fd\u53bb\u4e0b\u8f7d\uff0c\u8fd9\u6837\u53ef\u80fd\u4f1a\u8017\u8d39\u5927\u91cf\u7684\u7f51\u7edc\u8d44\u6e90\uff0c\u800c\u56e0\u4e3a\u5148\u5224\u65ad\u672c\u5730\u662f\u5426\u5b58\u5728\u6b64\u8d44\u6e90\uff0c\u5982\u679c\u4e0d\u5b58\u5728\u518d\u53bb\u4e0b\u8f7d\uff1b \u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u5c06\u8d44\u6e90\u62f7\u8d1d\u5230\u5bf9\u5e94\u7684\u6d4b\u8bd5\u76ee\u5f55\u4e0b\uff0c\u6bd4\u5982\u5c06 mp3 \u6587\u4ef6\u62f7\u8d1d\u5230 ~/Music \u76ee\u5f55\u4e0b\uff0c\u4f46\u662f\u6211\u4eec\u66f4\u5efa\u8bae\u4f60\u4f7f\u7528\u53d1\u9001\u5feb\u6377\u94fe\u63a5\u7684\u65b9\u5f0f\u66ff\u4ee3\u62f7\u8d1d\u7684\u64cd\u4f5c\uff0c\u56e0\u4e3a\u5728\u62f7\u8d1d\u5927\u6587\u4ef6\u65f6\u662f\u5f88\u6d88\u8017\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u800c\u521b\u5efa\u94fe\u63a5\u5219\u4e0d\u4f1a\uff1b @classmethod\ndef recovery_many_movies_in_movie_by_cmd(cls):\n\"\"\"\u6062\u590d\u591a\u4e2a\u89c6\u9891\u6587\u4ef6\u81f3\u89c6\u9891\u76ee\u5f55\u4e2d\"\"\"\nwork_path = f\"/home/{Config.USERNAME}/Videos/auto\"\ncode_path = f\"{Config.CASE_RES_PATH}/auto\"\ncls.run_cmd(f\"rm -rf {work_path};mkdir {work_path}\")\nsleep(1)\nflag = False\nif not exists(code_path):\ncls.run_cmd(f\"mkdir -p {code_path}\")\nflag = True\nlogger.info(f\"ln -s {code_path}/* {work_path}/\")\ncls.run_cmd(\nf\"cd {code_path}/;\"\nf\"{cls.wget_file('auto.zip') if flag else ''}\"\nf\"ln -s {code_path}/* {work_path}/ > /dev/null 2>&1\"\n)\n \u8d44\u6e90\u4e0b\u8f7d\u8fc7\u7a0b\u4e2d\u6ce8\u610f\u8d85\u65f6\u7684\u95ee\u9898\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u5f88\u5927\uff0c\u8981\u7279\u522b\u6ce8\u610f\u8fd9\u95ee\u9898\uff0c\u5982\u679c\u4f60\u4f7f\u7528\u5f3a\u5236\u7b49\u5f85\u4e0b\u8f7d\u7ed3\u675f( os.system )\uff0c\u53ef\u80fd\u4f1a\u9020\u6210\u7528\u4f8b\u6267\u884c\u65f6\u957f\u53d8\u5f97\u4e0d\u53ef\u63a5\u53d7\uff0c\u76ee\u524d\u6211\u4eec\u53d1\u73b0\u5728\u6301\u7eed\u96c6\u6210\u73af\u5883\u6267\u884c\u65f6\u7f51\u7edc\u4e0b\u8f7d\u901f\u5ea6\u5f88\u6162\uff0c\u6240\u4ee5\u8d85\u65f6\u673a\u5236\u662f\u5f88\u6709\u5fc5\u8981\u7684\uff1brun_cmd \u65b9\u6cd5\u6709\u4e00\u4e2a\u9ed8\u8ba4\u8d85\u65f6\u7684\u65f6\u95f4\uff0c\u4f60\u53ef\u4ee5\u6839\u636e\u8d44\u6e90\u5927\u5c0f\u5bf9\u8d85\u65f6\u65f6\u95f4\u8fdb\u884c\u8c03\u6574\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_5","title":"\u516d\u3001\u7528\u4f8b\u8c03\u8bd5\u6280\u5de7","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_4","title":"1. \u65e5\u5fd7","text":" \u4e00\u5b9a\u8981\u5148\u770b\u62a5\u9519\uff0c\u770b error \u65e5\u5fd7\uff0c\u901a\u5e38\u80fd\u660e\u786e\u7684\u544a\u8bc9\u4f60\u5177\u4f53\u54ea\u91cc\u4ee3\u7801\u62a5\u9519\uff1b \u7ed3\u5408\u62a5\u9519\u70b9\u524d\u9762\u7684error\u3001 info \u548c debug \u65e5\u5fd7\u770b\u5426\u662f\u6b63\u5e38\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_4","title":"2. \u65ad\u70b9\u8c03\u8bd5","text":" \u65b9\u6cd5\u62a5\u9519\uff1a \u5728\u65b9\u6cd5\u5e93\u4e2d\u627e\u5230\u5bf9\u5e94\u7684\u65b9\u6cd5\uff0c\u5355\u72ec\u8c03\u7528\uff0c\u770b\u662f\u5426\u80fd\u6b63\u5e38\u6267\u884c\uff1b \u901a\u5e38\u5355\u4e2a\u65b9\u6cd5\u7684\u6267\u884c\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u62a5\u9519\uff0c\u5f88\u5feb\u5c31\u80fd\u6392\u67e5\u51fa\u95ee\u9898\uff1b\u5728\u65b9\u6cd5\u5185\u90e8\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u65b9\u6cd5\u5185\u90e8\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u8c03\u7528\u6ca1\u95ee\u9898\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u62a5\u9519\u7684\u65b9\u6cd5\u524d\u9762\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u7528\u4f8b\u7684\u4e1a\u52a1\u903b\u8f91\u548c\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u65ad\u8a00\u62a5\u9519\uff1a \u65ad\u8a00\u4e3a\u6570\u636e\u65ad\u8a00\uff0c\u6839\u636e\u8868\u8fbe\u5f0f\u8fdb\u884c\u65ad\u8a00\u8bed\u53e5\u8fdb\u884c\u4fee\u6539\uff1b \u6587\u4ef6\u751f\u6210\u7c7b\u65ad\u8a00\uff0c\u67e5\u770b\u662f\u5426\u9700\u8981\u52a0\u7b49\u5f85\u65f6\u95f4\uff1b \u56fe\u50cf\u65ad\u8a00\uff0c\u5728\u65ad\u8a00\u8bed\u53e5\u5904\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u7528\u4f8b\u8fd0\u884c\u5230\u65ad\u8a00\u5904\u4f1a\u505c\u6b62\uff0c\u67e5\u770b\u6b64\u65f6\u65ad\u8a00\u7684\u56fe\u7247\u4e0e\u7528\u4f8b\u6267\u884c\u7684\u73b0\u573a\u5b58\u5728\u4ec0\u4e48\u5dee\u5f02\uff0c\u6b64\u65f6\u4e5f\u53ef\u4ee5\u8fdb\u884c\u91cd\u65b0\u622a\u56fe\uff0c\u4ece\u800c\u66ff\u6362\u65b0\u7684\u56fe\u7247\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3_1","title":"3. \u8fdc\u7a0b\u6267\u884c","text":" \u8fdc\u7a0b\u6267\u884c\u6307\u7684\u662f\u7f16\u8f91\u5668\u901a\u8fc7\u6307\u5b9a\u8fdc\u7a0b\u89e3\u91ca\u5668\u6267\u884c\u81ea\u52a8\u5316\u4ee3\u7801\uff1b \u8fdc\u7a0b\u6267\u884c\u7684\u597d\u5904\u662f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u7684 Debug \u8fd0\u884c\uff0c\u4e0d\u7528\u5728\u6d4b\u8bd5\u673a\u4e0a\u6253\u5f00\u7f16\u8f91\u5668\uff0c\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u66f4\u5feb\uff1b \u652f\u6301\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u7684\u7f16\u8f91\u5668\uff1a \u4e13\u4e1a\u7248 Pycharm VScode \uff0c\u9700\u8981\u4f7f\u7528\u63d2\u4ef6 Remote-SSH \u8fdc\u7a0b\u6267\u884c\u914d\u7f6e \u4ee5 Pycharm \u4e3a\u4f8b\uff1a File \u2014> Settings \u2014> Project \u2014> Python Interpreter \u2014> \u53f3\u8fb9\u8bbe\u7f6e\u6309\u94ae \u2014> Add... \u2014> SSH Interpreter \u2014> New server configuration(\u586b\u5165host\u548cusername) \u2014> Next \u2014> password\uff08\u6d4b\u8bd5\u673a\u5bc6\u7801\uff09 \u2014> Interpreter(\u9009\u62e9\u8fdc\u7a0b\u89e3\u91ca\u5668) \u2014> Finish "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4_1","title":"4. \u73af\u5883\u6e05\u7406","text":" \u5982\u679c\u7528\u4f8b\u91cc\u9762\u7684 teardown \u6ca1\u6709\u6267\u884c\uff0c\u5927\u6982\u7387\u662f\u56e0\u4e3a setup \u91cc\u9762\u4ee3\u7801\u62a5\u9519\uff0c\u8fd9\u4e24\u4e2a\u662f\u4e00\u5bf9\u7684\uff0csetup \u91cc\u9762\u62a5\u9519\uff0cteardown \u91cc\u9762\u7684\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\uff1b \u76ee\u524d\u6211\u4eec\u5df2\u7ecf\u5c06\u5404\u5e94\u7528\u7684 clean_all \u8fd9\u4e2a fixture \u6539\u6210\u4e86\u7ec8\u7ed3\u5668\uff0c\u786e\u4fdd\u59cb\u7ec8\u80fd\u6267\u884c\u5230\u8fd9\u6b65\uff0c\u4f46\u662f\u7528\u4f8b\u91cc\u9762\u7684 fixture\uff0c\u8fd8\u662f\u9700\u8981\u6211\u4eec\u5c0f\u5fc3\u5904\u7406\uff1b \u8981\u6267\u884c clean_all \u9700\u8981\u5728\u7f16\u8f91\u5668\u8fd0\u884c\u53c2\u6570\u52a0 --clean yes\uff0c\u5199\u7528\u4f8b\u7684\u65f6\u5019\u8bf7\u52a0\u4e0a\uff0c\u4e0d\u7136\u4f60\u4e0d\u786e\u5b9a\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u7684\u73af\u5883\u662f\u5426\u6062\u590d\uff1b setup \u53ef\u4ee5\u4e0d\u8981\uff0c\u5c06 setup \u653e\u5230\u7528\u4f8b\u91cc\u9762\u662f\u4e00\u79cd\u7a33\u59a5\u7684\u505a\u6cd5\uff0cteardown \u4e00\u5b9a\u8981\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5_1","title":"5. \u5143\u7d20\u5b9a\u4f4d\u4e0d\u51c6\uff08\u5750\u6807\u8fd4\u56de\u4e0d\u5bf9\uff09","text":" \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u53ef\u80fd\u53d7\u5230\u7a97\u53e3 ID \u7684\u53d8\u5316\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u9ed8\u8ba4\u53d6\u6700\u65b0\u7684\u4e00\u4e2a\u7a97\u53e3\u7528\u4e8e\u5b9a\u4f4d\uff0c\u4f46\u5982\u679c\u5b9e\u9645\u9700\u8981\u5b9a\u4f4d\u7684\u4e0d\u662f\u6700\u65b0\u7684\u7a97\u53e3\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u91cd\u65b0\u5b9e\u4f8b\u5316\u65b9\u6cd5\u7c7b\u5bf9\u8c61\uff0c\u5e76\u5728\u7c7b\u4e2d\u4f20\u5165\u5bf9\u5e94\u7684\u7a97\u53e3\u5e8f\u53f7\uff1b \u57fa\u4e8e\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u76ee\u524d\u9047\u5230\u7684\u7b14\u8bb0\u672c\u4e0a\uff0c\u7531\u4e8e\u5c4f\u5e55\u7f29\u653e\u6bd4\u4f8b\u4e3a 1.25\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u6211\u4eec\u9ed8\u8ba4\u4f7f\u7528\u7f29\u653e\u6bd4\u4f8b\u4e3a 1\uff1b \u57fa\u4e8e\u56fe\u50cf\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u76ee\u6807\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b \u57fa\u4e8e OCR \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u6587\u5b57\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u540c\u6837\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6_1","title":"6. \u952e\u9f20\u64cd\u4f5c\u4e0d\u51c6","text":" \u9f20\u6807\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6bd4\u5982\u53f3\u952e\u3001\u53cc\u51fb\u65e0\u54cd\u5e94\uff1b \u952e\u76d8\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6216\u8005\u5ef6\u8fdf\u8f93\u5165\uff0c\u6bd4\u5982\u7528\u4f8b\u9700\u8981\u8f93\u5165\u201c\u6211\u662f\u4e2d\u56fd\u4eba\u201d\uff0c\u5b9e\u9645\u53ea\u8f93\u5165\u4e86\u201c\u6211\u56fd\u4eba\u201d\uff1b \u4ee5\u4e0a\u95ee\u9898\u6392\u9664\u5e94\u7528\u5361\u987f\u7b49\u95ee\u9898\uff0c\u5927\u6982\u7387\u662f\u7531\u4e8e\u5de5\u5177\u7684\u95ee\u9898\uff0c\u76ee\u524d\u952e\u9f20\u64cd\u4f5c\u6211\u4eec\u4f7f\u7528\u4e09\u4e2a\u5de5\u5177\uff1aDogtail \u63d0\u4f9b\u7684\u952e\u9f20\u5de5\u5177\u3001PyAutoGUI\u3001Xdotool \uff1b \u6709\u540c\u5b66\u53ef\u80fd\u8981\u8bf4\u4e3a\u5565\u8981\u7528\u4e09\u4e2a\u554a\uff0c\u7528\u4e00\u4e2a\u4e0d\u5c31\u597d\u4e86\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u5404\u6709\u4f18\u70b9\u5404\u6709\u7f3a\u70b9\u3002 \u5982\u679c\u4f60\u9047\u5230\u952e\u9f20\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u8bd5\u8bd5\u901a\u8fc7\u4e0d\u540c\u7684\u5de5\u5177\u64cd\u4f5c\uff1b\u952e\u76d8\u8f93\u5165\u5ef6\u8fdf\u7684\u95ee\u9898\uff0c\u4e00\u822c\u662f\u56e0\u4e3a\u8f93\u5165\u901f\u5ea6\u592a\u5feb\u4e86\uff0c\u7cfb\u7edf\u6ca1\u53cd\u5e94\u8fc7\u6765\uff0c\u5e38\u89c1\u4e8e ARM \u548c MIPS \u4e0a\uff0c\u4fee\u6539\u53c2\u6570 delay_time \u7684\u503c\uff0c\u5355\u4f4d\u4e3a\u6beb\u79d2\uff1b # mouse_key.py\n@classmethod\ndef input_message(cls, message, delay_time=300, interval=0.2):\n\"\"\"\n \u8f93\u5165\u5b57\u7b26\u4e32\n :param message: \u8f93\u5165\u7684\u5185\u5bb9\n :param delay_time: \u5ef6\u8fdf\u65f6\u95f4\n :param interval:\n :return:\n \"\"\"\n \u5982\u679c\u4e0d\u662f\u65b9\u6cd5\u7684\u95ee\u9898\uff0c\u5219\u9700\u8981\u7ee7\u7eed\u548c\u5f00\u53d1\u4e00\u8d77\u6392\u9664\uff0c\u662f\u5426\u4e3a\u5e94\u7528\u63a5\u53d7\u952e\u9f20\u4fe1\u53f7\u5904\u7406\u7684\u95ee\u9898\uff0c\u8fd9\u7c7b\u60c5\u51b5\u6211\u4eec\u4e5f\u662f\u9047\u5230\u8fc7\u7684\uff0c\u5177\u4f53\u95ee\u9898\u5177\u4f53\u5206\u6790\u3002 \u6bd4\u5982\u5f71\u9662\u5c31\u91cd\u5199\u4e86\u4e00\u4e2a\u53f3\u952e\u7684\u65b9\u6cd5\uff1a # base_widget.py\n@classmethod\ndef right_click(cls, _x=None, _y=None):\n\"\"\"\n \u91cd\u5199\u5e95\u5c42\u5355\u51fb\u9f20\u6807\u53f3\u952e\n \u89e3\u51b3\u5f71\u9662\u53f3\u952e\u89e6\u53d1release\u4e8b\u4ef6\u7684\u95ee\u9898\uff08\u53f3\u952e\u4e3b\u7a97\u53e3\u4f1a\u64ad\u653e\u89c6\u9891\uff09\n \"\"\"\ncls.mouse_down(_x, _y, button=3)\nsleep(0.1)\ncls.mouse_up(button=3)\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_6","title":"\u4e03\u3001\u5176\u4ed6\u4e0d\u4e3a\u4eba\u77e5\u7684\u7ec6\u8282","text":" \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u5c3d\u91cf\u7f16\u5199\u540c\u4e00\u4e2a\u5e94\u7528\u6216\u6a21\u5757\u7684\u7528\u4f8b\uff0c\u80fd\u5bf9\u8be5\u7528\u4f8b\u5df2\u6709\u65b9\u6cd5\u719f\u6089\uff0c\u907f\u514d\u8fc7\u591a\u91cd\u590d\u4e1a\u52a1\u4ee3\u7801\u7684\u5c01\u88c5\uff1b \u76f8\u540c\u7684\u573a\u666f\u4e0b\uff0c\u5404\u67b6\u6784\u7b49\u5f85\u65f6\u95f4\u4e0d\u540c\uff0c\u5efa\u8bae\u4f7f\u7528\u6846\u67b6\u63d0\u4f9b\u7684 sleep\uff0c\u6211\u4eec\u505a\u4e86\u4e0d\u540c\u67b6\u6784\u7684\u500d\u6570\u653e\u5927\uff1b \u7f16\u5199\u7528\u4f8b\u65f6\uff0c\u5c3d\u91cf\u8003\u8651\u5230\u6bcf\u4e00\u6b65\u5f02\u5e38\u540e\u7684\u73af\u5883\u6062\u590d\uff0c\u9700\u8981\u5efa\u8bae\u8fd9\u79cd\u610f\u8bc6\uff0c\u968f\u65f6\u8981\u8003\u8651\u5230\uff0c\u8fd9\u6b65\u64cd\u4f5c\u6709\u6ca1\u6709\u53ef\u80fd\u51fa\u9519\uff0c\u51fa\u9519\u4e86\u6539\u600e\u4e48\u529e\uff1b \u63d0\u4ea4\u4ee3\u7801\u7684\u65f6\u5019\u6ce8\u610f\u4e0d\u8981\u628a\u4e00\u4e9b\u4e34\u65f6\u7684\u6d4b\u8bd5\u8d44\u6e90\u63d0\u4ea4\u8fdb\u53bb\u4e86\uff0c\u6bd4\u5982\u6d4b\u8bd5\u4e86\u4e00\u4e2a\u5f71\u7247\uff0c\u6709\u4e9b\u540c\u5b66\u4e60\u60ef\u4f7f\u7528 git add . \uff0c\u7136\u540e\u5c31\u5168\u90e8\u63d0\u4ea4\u5230\u4ee3\u7801\u4ed3\u5e93\u4e86\uff0c\u8fd9\u6837\u5373\u4f7f\u540e\u671f\u628a\u5927\u6587\u4ef6\u5220\u4e86\uff0c.git \u6587\u4ef6\u91cc\u9762\u4e5f\u4f1a\u5f88\u5927\uff0c\u9020\u6210\u4ee3\u7801\u4ed3\u5e93\u53d8\u5f97\u5341\u5206\u81c3\u80bf\u3002 \u66f4\u591a\u7ec6\u8282\u67e5\u770b\uff1a\u300aAT\u7ecf\u9a8c\u603b\u7ed3\u300b"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/","title":"AT \u6267\u884c\u5668\u4f7f\u7528\u6307\u5317","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/5/25\n# Author : litao\n# =============================================\n Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1","title":"1\u3001\u529f\u80fd\u4ecb\u7ecd","text":" \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7cfb\u7edf\u8bed\u8a00\u8bbe\u7f6e\uff0c\u5206\u8fa8\u7387\u8bbe\u7f6e\u53ca\u7528\u4f8b\u6267\u884c\u73af\u5883\u642d\u5efa\uff1b \u652f\u6301 IP \u4e3a 15 \u7f51\u6bb5\u7684 AMD \u67b6\u6784\u6d4b\u8bd5\u673a\u955c\u50cf\u88c5\u673a\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u6307\u5b9a\u5e94\u7528\uff0c\u6307\u5b9a\u8303\u56f4\u6807\u7b7e\u7684\u7528\u4f8b\u6267\u884c\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u72b6\u6001\u68c0\u67e5\uff0c\u662f\u5426\u6709\u6b63\u5728\u8fd0\u884c\u7684\u6d4b\u8bd5\uff1b \u652f\u6301\u914d\u7f6e\u7528\u4f8b\u6267\u884c\u65f6\u957f\uff0c\u9632\u6b62\u4efb\u52a1\u963b\u585e\uff1b \u652f\u6301\u6839\u636e\u5e94\u7528\u7248\u672c\u81ea\u52a8\u67e5\u627e\u5bf9\u5e94\u7684\u7528\u4f8b tag\uff1b \u652f\u6301\u5f02\u5e38\u5904\u7406\u548c\u6d4b\u8bd5\u5b8c\u6210\u7684\u5b9e\u65f6\u6d88\u606f\u901a\u77e5\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2job","title":"2\u3001Job \u4ecb\u7ecd","text":"\u4ee5\u4e0b\u6309\u6267\u884c\u6d41\u7a0b\u7684\u987a\u5e8f\u4ecb\u7ecd\uff0c\u6bcf\u4e00\u6b65\u90fd\u53ef\u4ee5\u5355\u72ec\u6267\u884c\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1_1","title":"1\u3001\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/AT_test/ \u6574\u4e2a\u6d41\u7a0b\u7684\u4e3b\u5165\u53e3\uff0c\u901a\u8fc7\u8fd9\u4e2a\u5165\u53e3\uff0c\u8fde\u540c\u6574\u4e2a\u6d4b\u8bd5\u6d41\u7a0b\uff0c\u955c\u50cf\u88c5\u673a\uff0c\u73af\u5883\u90e8\u7f72\uff0c\u6d4b\u8bd5\u5e94\u7528\u53ca\u751f\u6210\u62a5\u544a\u3002 \u53c2\u6570\u4ecb\u7ecd\uff1a \u6d4b\u8bd5\u673a\uff1a\u6240\u6709\u89c4\u6574\u5230\u56fa\u5b9a\u533a\u57df\u7684\u6d4b\u8bd5\u673a\uff0c\u901a\u8fc7\u6d4b\u8bd5\u540c\u5b66\u5bf9\u6d4b\u8bd5\u673a\u7684\u4e60\u60ef\u547d\u540d\uff0c\u5728\u540e\u53f0\u6620\u5c04\u6d4b\u8bd5\u673a\u7684\u8be6\u7ec6\u4fe1\u606f\uff0c\u62ec\u53f7\u4e2d\u4e3a\u6d4b\u8bd5\u673a IP \u7684\u6700\u540e\u4e00\u4f4d\uff1b \u6d4b\u8bd5\u5e94\u7528\uff1a\u6307\u5b9a\u7684\u6d4b\u8bd5\u5e94\u7528\u7684\u5305\u540d\uff0c\u7cfb\u7edf\u6839\u636e\u540d\u79f0\u81ea\u52a8\u62c9\u53d6\u5bf9\u5e94\u7684\u4ed3\u5e93\u4ee3\u7801\uff1b deb\u5305\u4e0b\u8f7d\u5730\u5740\uff1a\u6d4b\u8bd5\u4e0a\u8ff0\u5e94\u7528\u65f6\uff0c\u9700\u8981\u5b89\u88c5\u7684deb\u5305\u4e0b\u8f7d\u5730\u5740\uff0c\u591a\u4e2a\u5730\u5740\u7528\u201c,\u201d\u9694\u5f00\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff1b \u8303\u56f4\u6807\u7b7e\uff1a\u6267\u884c\u6d4b\u8bd5\u7528\u4f8b\u7684\u6807\u7b7e\u8303\u56f4\uff0c\u5bf9\u5e94\u7528\u4f8b\u4ee3\u7801 csv \u6587\u4ef6\u4e2d\u7684\u6807\u7b7e\u4fe1\u606f\uff0c\u4ee5 pytest \u7684mark\u8bed\u6cd5\u7f16\u5199\uff1b \u7cfb\u7edf\u8bed\u8a00\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u8bed\u8a00\u73af\u5883\uff1b \u5206\u8fa8\u7387\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u5206\u8fa8\u7387\u73af\u5883\uff1b \u955c\u50cf\u5730\u5740\uff1a\u955c\u50cf\u4ed3\u5e93\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u901a\u8fc7 PXE \u88c5\u673a\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u88c5\u673a\u73af\u8282\uff08\u76ee\u524d\u4ec5\u652f\u6301\u90e8\u5206 AMD \u67b6\u6784\u7684\u88c5\u673a\uff09\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2pxe","title":"2\u3001PXE \u88c5\u673a","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/IOS_install/ \u8f93\u5165\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\uff0cIP\uff0c\u5bc6\u7801\uff0c\u955c\u50cf\u5730\u5740\u540e\uff0c\u81ea\u52a8\u88c5\u673a\uff0c\u76ee\u524d\u4ec5\u652f\u6301\u56fa\u5b9a 15 \u7f51\u6bb5\u7684\u90e8\u5206 AMD \u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#3","title":"3\u3001\u6b21\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/all_client_test/ \u8be5\u5165\u53e3\u4e0e\u4e3b\u5165\u53e3\u529f\u80fd\u57fa\u672c\u4e00\u81f4\uff0c\u53ea\u662f\u5265\u79bb\u4e86PXE\u88c5\u673a\u6d41\u7a0b\uff0c\u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7684\u6267\u884c\u6d41\u7a0b\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#4","title":"4\u3001\u73af\u5883\u90e8\u7f72","text":"Jenkins url\uff1ahttps://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/env/build?delay=0sec \u8bbe\u7f6e\u6d4b\u8bd5\u673a\u7684\u7cfb\u7edf\u8bed\u8a00\uff0c\u5206\u8fa8\u7387\u53ca\u5b89\u88c5\u6d4b\u8bd5\u6240\u9700\u7684\u4f9d\u8d56\u5305\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#5","title":"5\u3001\u53d1\u9001\u4ee3\u7801","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/send_code/ \u6839\u636e\u6d4b\u8bd5\u5e94\u7528\u540d\u79f0\uff0c\u62c9\u53d6\u5bf9\u5e94\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u5e76\u6839\u636e\u6d4b\u8bd5\u673a\u4e0a\u5e94\u7528\u7248\u672c\u5207\u6362\u5230\u5bf9\u5e94\u7684tag\u7248\u672c\uff0c\u82e5\u672a\u627e\u5230tag\u7248\u672c\uff0c\u5219\u4f7f\u7528\u6700\u65b0\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u518d\u6839\u636e\u5e94\u7528\u5e93\u4ee3\u7801\u4e2d\u914d\u7f6e\u7684\u57fa\u7840\u5e93\u7248\u672c\uff0c\u62c9\u53d6\u57fa\u7840\u5e93\u4ee3\u7801\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#6","title":"6\u3001\u7528\u4f8b\u6267\u884c","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/run_test/ \u8fd0\u884c\u6d4b\u8bd5\u673a\u4e0a\u7684\u7528\u4f8b"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/","title":"AT \u7528\u4f8b\u7b5b\u9009\u6307\u5317","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u7528\u4f8b\u7b5b\u9009\u6807\u51c6\uff0c\u662f\u6311\u9009\u5408\u9002\u7684\u6587\u672c\u7528\u4f8b\u8fdb\u884c\u81ea\u52a8\u5316\u7528\u4f8b\u8f6c\u5316\u7684\u4e00\u4e9b\u901a\u7528\u6807\u51c6\u3002 \u8fc7\u53bb\u6211\u4eec\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u5b9e\u8df5\u8fc7\u7a0b\u4e2d\uff0c\u5199\u4e86\u4e0d\u5c11\u81ea\u52a8\u5316\u7528\u4f8b\uff0c\u968f\u7740\u9700\u6c42\u7684\u8fed\u4ee3\uff0c\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u81ea\u7136\u8150\u5316\uff0c\u56e0\u800c\u9700\u8981\u5728\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\u5bf9\u81ea\u52a8\u5316\u7528\u4f8b\u8fdb\u884c\u7ef4\u62a4\uff0c\u5728\u7ef4\u62a4\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u6211\u4eec\u53d1\u73b0\uff0c\u6709\u4e9b\u7528\u4f8b\u7ef4\u62a4\u8d77\u6765\u592a\u96be\u4e86\uff0c\u8c03\u8bd5\u7528\u4f8b\u8017\u8d39\u5927\u91cf\u65f6\u95f4\uff0c\u6210\u672c\u5f88\u9ad8\u3002 \u56e0\u6b64\uff0c\u6211\u4eec\u603b\u7ed3\u4e00\u4e9b\u81ea\u52a8\u5316\u7528\u4f8b\u9009\u578b\u7684\u6807\u51c6\uff0c\u4ee5\u4f18\u5316\u540e\u7eed\u81ea\u52a8\u5316\u7528\u4f8b\u7ed3\u6784\uff0c\u671f\u5f85\u6211\u4eec\u80fd\u7f16\u5199\u51fa\u9ad8\u6548\u3001\u7a33\u5b9a\u3001\u6613\u4e8e\u7ef4\u62a4\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_1","title":"\u4e00\u3001\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u53ef\u4ee5\u5206\u4e3a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u548c\u4e13\u9879\u81ea\u52a8\u5316\u6d4b\u8bd5\uff0c\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e00\u822c\u53ea\u9488\u5bf9\u4e00\u4e9b\u5e38\u89c4\u7684\u529f\u80fd\u6d4b\u8bd5\uff0c\u5176\u4ed6\u975e\u5e38\u89c4\u529f\u80fd\u7684\u7528\u4f8b\uff0c\u5e94\u8be5\u91c7\u7528\u4e13\u9879\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u6848\uff1b \u4ee5\u4e0b\u662f\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1","title":"1. \u7a33\u5b9a\u6027\u3001\u538b\u6d4b\u7528\u4f8b","text":"\u7a33\u5b9a\u6027\u6d4b\u8bd5\u3001\u538b\u6d4b\u7528\u4f8b\u5e94\u8be5\u662f\u5c5e\u4e8e\u6027\u80fd\u76f8\u5173\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u5982\uff1a\u53cd\u590d\u591a\u6b21\u70b9\u51fb\u6309\u94ae\uff0c\u68c0\u9a8c\u5176\u529f\u80fd\u7a33\u5b9a\u6027\u3002\u56e0\u4e3a\u8fd9\u4e9b\u7528\u4f8b\u65ad\u8a00\u7684\u9884\u671f\u53ef\u80fd\u4e0d\u662f\u5f88\u660e\u786e\uff0c\u66f4\u6709\u751a\u8005\u4e0d\u9700\u8981\u65ad\u8a00\uff0c\u7528\u4f8b\u65f6\u957f\u6bd4\u8f83\u957f\uff0c\u800c\u4e14\u4e0d\u53ef\u63a7\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u76ee\u524d\u6211\u4eec\u6709\u6027\u80fd\u81ea\u52a8\u5316\u7684\u4e13\u9879\u65b9\u6848\uff0c\u4ee5\u53ca\u4e00\u4e9b\u7a33\u5b9a\u6027\u6d4b\u8bd5\u7684\u4e13\u9879\u65b9\u6848\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u6b64\u7c7b\u7528\u4f8b\u653e\u5230\u4e13\u9879\u81ea\u52a8\u5316\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2","title":"2. \u6d89\u53ca\u591a\u4e2a\u7528\u6237\u64cd\u4f5c","text":"\u5e38\u89c1\u4e0e\u6587\u7ba1\u7684\u7528\u4f8b\u4e2d\uff0c\u591a\u7528\u6237\u64cd\u4f5c\u7684\u7528\u4f8b\u4e00\u822c\u90fd\u4f1a\u6d89\u53ca\u5230\u5728\u7cfb\u7edf\u4e2d\u8fdb\u884c\u591a\u4e2a\u7528\u6237\u95f4\u7684\u5207\u6362\uff0c\u81ea\u52a8\u5316\u811a\u672c\u4e00\u822c\u662f\u8fd0\u884c\u5728\u4e00\u4e2a\u7528\u6237\u7a7a\u95f4\u4e0b\u7684\uff0c\u6240\u4ee5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u591a\u7528\u6237\u95f4\u7684\u5207\u6362\u3002 \u6b64\u7c7b\u4e0d\u5efa\u8bae\u91c7\u7528\u81ea\u52a8\u5316\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3","title":"3. \u4e0e\u5f00\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4ea4\u4e92","text":"\u6b64\u7c7b\u573a\u666f\u591a\u4e3a\u5e94\u7528\u7684\u5f02\u5e38\u573a\u666f\u6d4b\u8bd5\uff0c\u6bd4\u5982\uff1a\u590d\u5236\u5927\u6587\u4ef6\u8fc7\u7a0b\u4e2d\u6ce8\u9500\u673a\u5668\u3002 \u81ea\u52a8\u5316\u811a\u672c\u5728\u7cfb\u7edf\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4e4b\u540e\u662f\u4f1a\u505c\u6b62\u8fd0\u884c\u7684\uff1b\u6b64\u7c7b\u7528\u4f8b\u53ef\u4ee5\u505a\u81ea\u52a8\u5316\uff0c\u4f46\u662f\u540c\u6837\u9700\u8981\u505a\u4e13\u9879\u65b9\u6848\uff0c\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u7684\u5904\u7406\u903b\u8f91\u5b8c\u5168\u4e0d\u540c\u3002 \u540e\u7eed\u81ea\u52a8\u5316\u9700\u8981\u516c\u5173\u7684\u70b9\uff1a \u81ea\u52a8\u5316\u811a\u672c\u5728\u672c\u673a\u8fd0\u884c\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u81f3\u5c11\u9700\u8981\u63d0\u4f9b\u4ee5\u4e0b\u529f\u80fd\uff1a \u91cd\u542f\u4e4b\u540e\u7528\u4f8b\u80fd\u81ea\u52a8\u8fd0\u884c\uff1b\u53ef\u4ee5\u8003\u8651\u5c06\u6267\u884c\u7528\u4f8b\u5199\u6210\u4e00\u4e2a\u5f00\u673a\u81ea\u542f\u7684\u670d\u52a1\uff1b \u80fd\u8bb0\u5f55\u5173\u673a\u4e4b\u524d\u7528\u4f8b\u6267\u884c\u7684\u4f4d\u7f6e\uff0c\u91cd\u542f\u4e4b\u540e\u80fd\u4ece\u6b64\u4f4d\u7f6e\u5f00\u59cb\u6267\u884c\uff1b \u50cf\u6027\u80fd\u81ea\u52a8\u5316\u4e00\u6837\uff0c\u7531\u670d\u52a1\u7aef\u63a7\u5236\uff1b \u5b8c\u5168\u57fa\u4e8e\u56fe\u5f62\u8bc6\u522b\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u4e32\u53e3\u7ebf\u63a7\u5236\u952e\u9f20\u7a33\u5b9a\u6027\uff1b "},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4","title":"4. \u6d4b\u8bd5\u6267\u884c\u65f6\u95f4\u957f","text":"\u7528\u4f8b\u6267\u884c\u65f6\u95f4\u63a7\u5236\u57282\u5206\u949f\u4ee5\u5185\uff0c\u6781\u7aef\u60c5\u51b5\u4e0d\u8981\u8d85\u8fc75\u5206\u949f\uff0c\u6240\u6709\u7528\u4f8b\u7684\u5e73\u5747\u65f6\u957f\u5e94\u8be5\u57281\u5206\u949f\u5de6\u53f3\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u95f4\u592a\u957f\uff0c\u7f16\u5199\u7528\u4f8b\u3001\u8c03\u8bd5\u7528\u4f8b\u3001\u6267\u884c\u7528\u4f8b\u3001\u7ef4\u62a4\u7528\u4f8b\u90fd\u975e\u5e38\u7684\u8017\u65f6\uff0c\u4eba\u529b\u6210\u672c\u65f6\u95f4\u6210\u672c\u6295\u5165\u592a\u9ad8\u3002 \u4f60\u60f3\uff0c\u8fd9\u6761\u7528\u4f8b\u6267\u884c\u9700\u89815\u5206\u949f\uff0c\u90a3\u4f60\u5199\u8fd9\u6761\u7528\u4f8b\u7684\u65f6\u95f4\u4e0d\u53ef\u80fd\u4e00\u904d\u8fc7\uff0c\u5199\u7684\u8fc7\u7a0b\u4e2d\u8dd1\u4e0d\u901a\u8fd8\u5f97\u91cd\u8dd1\u81f3\u5c1115\u5206\u949f\u4e0d\u8fc7\u5206\uff0c\u5199\u5b8c\u4e86\u8fd8\u5f97\u5728\u5176\u4ed6\u67b6\u6784\u4e0a\u8c03\u8bd5\uff0c\u534a\u4e2a\u5c0f\u65f6\u8fc7\u53bb\u4e86\uff0c\u8fd9\u8fd8\u53ea\u662f\u7b2c\u4e00\u6b21\u5199\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u540e\u7eed\u5982\u679c\u7528\u4f8b\u7ef4\u62a4\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u7ecf\u5e38\u6295\u5165\u76f8\u5f53\u957f\u65f6\u95f4\uff0c\u8fd9\u6837\u5176\u5b9e\u662f\u5931\u53bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u7684\u3002\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u5c31\u5e94\u8be5\u662f\u5feb\u51c6\u72e0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5","title":"5. \u8fb9\u7f18\u6027\u6d4b\u8bd5","text":"\u6709\u4e9b\u529f\u80fd\u6a21\u5757\u672c\u8eab\u662f\u5c5e\u4e8e\u6bd4\u8f83\u8fb9\u7f18\u6027\u7684\uff0c\u5373\u6781\u5c11\u7528\u6237\u4f1a\u4f7f\u7528\u5230\u7684\u529f\u80fd\uff0c\u8fd9\u7c7b\u529f\u80fd\u6a21\u5757\u4e0d\u9700\u8981\u5927\u89c4\u6a21\u5b9e\u73b0\u81ea\u52a8\u5316\uff0c\u4e00\u4e24\u4e2a\u573a\u666f\u8986\u76d6\u57fa\u672c\u529f\u80fd\u5c31\u884c\u4e86\uff0c\u56e0\u6b64\u6211\u4eec\u5728\u6311\u9009\u6b64\u7c7b\u7528\u4f8b\u7684\u65f6\u5019\u53ef\u4ee5\u7ed3\u5408\u6574\u4e2a\u529f\u80fd\u6a21\u5757\u7684\u8986\u76d6\u60c5\u51b5\u6765\u51b3\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6","title":"6. \u9700\u8981\u4f9d\u8d56\u4eba\u5de5\u4ecb\u5165\u7684","text":"\u81ea\u52a8\u5316\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\u662f\u6ca1\u6709\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bd4\u5982\u8981\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u90a3\u4e48\u5c31\u80cc\u79bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u3002 \u6bd4\u5982\u5149\u9a71\u6a21\u5757\uff0c\u5149\u9a71\u523b\u5f55\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u4f46\u662f\u5149\u9a71\u523b\u5f55\u4e4b\u540e\u5149\u76d8\u4f1a\u5f39\u51fa\u6765\uff0c\u9700\u8981\u4eba\u5de5\u66f4\u6362\u5149\u76d8\uff0c\u518d\u624b\u52a8\u63a8\u8fdb\u5149\u9a71\u4e2d\u3002 \u8fd9\u79cd\u529f\u80fd\u6a21\u5757\u5373\u4f7f\u505a\u81ea\u52a8\u5316\uff0c\u80fd\u6d89\u53ca\u5230\u7684\u529f\u80fd\u975e\u5e38\u6709\u9650\uff0c\u800c\u4e14\u4e0d\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u6240\u4ee5\u660e\u663e\u5c31\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7","title":"7. \u96be\u4ee5\u5b9e\u73b0\u7684","text":"\u7528\u4f8b\u6240\u6d89\u53ca\u5230\u7684\u65b9\u6cd5\u5b9e\u73b0\u8d77\u6765\u53ef\u80fd\u6709\u96be\u5ea6\uff0c\u751a\u81f3\u73b0\u9636\u6bb5\u65e0\u6cd5\u5b9e\u73b0\u7684\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002 \u6bd4\u5982\u5f71\u9662\u6d4b\u8bd5\u753b\u9762\u6e05\u6670\u5ea6\u3001\u6d41\u7545\u5ea6\u3001\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u4e4b\u540e\u7684\u89c6\u9891\u662f\u5426\u5b58\u5728\u5361\u987f\u7b49\u7528\u4f8b\uff0c\u73b0\u9636\u6bb5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#8","title":"8. \u529f\u80fd\u4e0d\u7a33\u5b9a","text":"\u8fd9\u4e2a\u4e0d\u662f\u8bf4\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\uff0c\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\u4e0d\u7a33\u5b9a\u662f\u6b63\u5e38\u7684\uff0c\u8fd9\u79cd\u6211\u4eec\u53ef\u4ee5\u7b49\u5f00\u53d1\u63d0\u6d4b\u4e4b\u540e\u518d\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u3002 \u529f\u80fd\u4e0d\u7a33\u5b9a\u6307\u7684\u662f\u7528\u4f8b\u6240\u6d89\u53ca\u7684\u529f\u80fd\uff0c\u53ef\u80fd\u5b58\u5728\u591a\u79cd\u53d8\u5316\uff0c\u6bcf\u6b21\u6267\u884c\u7528\u4f8b\u53ef\u80fd\u65ad\u8a00\u7684\u9884\u671f\u90fd\u4e0d\u540c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#9","title":"9. \u52a8\u6001\u65ad\u8a00","text":"\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u76f4\u5230\u7528\u4f8b\u7ed3\u675f\uff0c\u4e00\u76f4\u662f\u4e00\u4e2a\u52a8\u6001\u53d8\u5316\u7684\u8fc7\u7a0b\uff0c\u800c\u4e14\u65e0\u6cd5\u901a\u8fc7\u5176\u4ed6\u624b\u6bb5\u505c\u4e0b\u6765\uff1b \u6bd4\u5982\uff1a\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u65f6\uff0c\u53f3\u4e0b\u89d2\u7684\u5f55\u5236\u65f6\u95f4\u662f\u4e00\u76f4\u5728\u53d8\u5316\u7684\uff0c\u7528\u4f8b\u9700\u8981\u6d4b\u8bd5\u5f55\u52361\u5206\u949f\u4e4b\u540e\uff0c\u5f55\u5236\u65f6\u95f4\u662f\u521a\u597d\u505c\u572860\u79d2\uff1b \u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fd8\u505a\u4e0d\u5230\u65f6\u95f4\u7cbe\u51c6\u63a7\u5236\uff0c\u7a0b\u5e8f\u6267\u884c\u65f6\u95f4\u662f\u6709\u6ce2\u52a8\u7684\uff0c\u800c\u4e14\u8981\u9002\u914d\u591a\u4e2a\u5e73\u53f0\uff0c\u6240\u4ee5\u6b64\u7c7b\u7528\u4f8b\u5927\u6982\u7387\u4f1a\u6267\u884c\u5931\u8d25\u3002\u7279\u522b\u662f\u5728\u6027\u80fd\u8f83\u5dee\u7684\u56fd\u4ea7\u5316\u67b6\u6784\u4e0a\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u592a\u53ef\u80fd\u7a33\u5b9a\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#10","title":"10. \u63a2\u7d22\u6027\u6d4b\u8bd5","text":"\u63a2\u7d22\u6027\u6d4b\u8bd5\u901a\u5e38\u662f\u4e00\u4e9b\u4e0d\u786e\u5b9a\u7684\u64cd\u4f5c\uff0c\u591a\u53d8\u5207\u590d\u6742\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u9884\u671f\u4e5f\u53ef\u80fd\u662f\u4e0d\u786e\u5b9a\u7684\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u9a9a\u64cd\u4f5c\u592a\u591a\u4e86\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6b64\u7c7b\u7528\u4f8b\u9002\u5408\u91c7\u7528\u624b\u5de5\u6d4b\u8bd5\uff0c\u662f\u624b\u5de5\u6d4b\u8bd5\u771f\u6b63\u7684\u4ef7\u503c\u4f53\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#11","title":"11. \u6613\u7528\u6027\u6d4b\u8bd5","text":"\u5bf9\u4e8e\u6613\u7528\u6027\u7684\u5224\u65ad\u901a\u5e38\u662f\u4e3b\u89c2\u7684\uff0c\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\u5f88\u96be\u53bb\u5b9a\u4e49\u4ec0\u4e48\u6837\u7684\u60c5\u51b5\u5bf9\u7528\u6237\u662f\u6613\u7528\u7684\uff0c\u81ea\u52a8\u5316\u9700\u8981\u6709\u660e\u786e\u7684\u53ef\u5b9e\u73b0\u7684\u9884\u671f\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_2","title":"\u4e8c\u3001\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u524d\u9762\u8bb2\u4e86\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u4e00\u4e9b\u7528\u4f8b\u60c5\u51b5\uff0c\u6709\u540c\u5b66\u5c31\u8bf4\u4e86\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\u4e0d\u7528\u8bb2\u4e86\uff0c\u5c31\u662f\u4e0d\u9002\u5408\u7684\u53cd\u9762\u3002\u6ca1\u6bdb\u75c5\u54c8\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\uff0c\u6211\u4eec\u5927\u4f53\u8fd8\u53ef\u4ee5\u5206\u4e3a\u4e24\u7c7b\uff1a \u7b2c\u4e00\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u597d\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u7b2c\u4e8c\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u4e00\u822c\uff0c\u9700\u8981\u6295\u5165\u66f4\u591a\u7cbe\u529b\u624d\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u4ee5\u4e0b\u4ecb\u7ecd\u4e00\u4e9b\u6211\u4eec\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1_1","title":"1. \u64cd\u4f5c\u76f8\u5bf9\u7b80\u5355","text":"\u7528\u4f8b\u6b65\u9aa4\u76f8\u5bf9\u8f83\u5c11\uff0c\u8fd9\u79cd\u7528\u4f8b\u901a\u5e38\u662f\u4e00\u4e9b\u8def\u5f84\u5f88\u6d45\u7684\u7528\u4f8b\uff0c\u4e00\u822c\u4e5f\u662f\u4e00\u4e9b\u57fa\u7840\u7528\u4f8b\u3002\u7528\u4f8b\u7f16\u5199\u3001\u7ef4\u62a4\u90fd\u53ef\u4ee5\u8f7b\u677e\u641e\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2_1","title":"2. \u5bb9\u6613\u5b9e\u73b0","text":"\u73b0\u6709\u6280\u672f\u662f\u53ef\u5b9e\u73b0\u7684\uff0c\u6ca1\u6709\u96be\u5ea6\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3_1","title":"3. \u7ecf\u5e38\u7528\u4e8e\u56de\u5f52\u6d4b\u8bd5","text":"\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bcf\u6b21\u56de\u5f52\u6d4b\u8bd5\u5fc5\u987b\u8981\u6267\u884c\u7684\u7528\u4f8b\uff0c\u90a3\u4e48\u8fd9\u6761\u7528\u4f8b\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u3002 \u56de\u5f52\u6d4b\u8bd5\u65f6\u6211\u4eec\u9996\u5148\u5e94\u8be5\u4fdd\u8bc1\u5e94\u7528\u5386\u53f2\u57fa\u672c\u529f\u80fd\u6b63\u5e38\uff0c\u6240\u4ee5\u90a3\u4e9b\u6bcf\u6b21\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u90fd\u8981\u6267\u884c\u7684\u7528\u4f8b\u9002\u5408\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4_1","title":"4. \u529f\u80fd\u7a33\u5b9a\u7684\u6838\u5fc3\u529f\u80fd","text":"\u6d89\u53ca\u6838\u5fc3\u529f\u80fd\u7684\u7528\u4f8b\u662f\u6700\u6700\u91cd\u8981\u7684\u7528\u4f8b\uff0c\u4e5f\u662f\u6211\u4eec\u4ea4\u4ed8\u65f6\u5fc5\u987b\u8981\u4fdd\u8bc1\u8d28\u91cf\u7684\u76f8\u5173\u529f\u80fd\uff0c\u56e0\u6b64\u5e94\u8be5\u5c3d\u53ef\u80fd\u7684\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5_1","title":"5. \u8f93\u5165\u6570\u636e\u6d4b\u8bd5","text":"\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u901a\u5e38\u662f\u68c0\u9a8c\u88ab\u6d4b\u5e94\u7528\u63a5\u53d7\u6709\u6548\u6570\u636e\u3001\u62d2\u7edd\u65e0\u6548\u6570\u636e\u7684\u80fd\u529b\u3002\u5982\uff1a\u63d0\u4ea4\u8d85\u957f\u5b57\u7b26\u4e32\u3001\u7279\u6b8a\u5b57\u7b26\u4e32\u7b49\u7b49\u3002 \u6b64\u7c7b\u7528\u4f8b\u624b\u5de5\u6d4b\u8bd5\u5f88\u96be\u6bd4\u8f83\u5168\u9762\u7684\u8986\u76d6\u5230\u6240\u6709\u7684\u8f93\u5165\u60c5\u51b5\uff0c\u4f46\u662f\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\uff0c\u6b64\u7c7b\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u90fd\u662f\u4e00\u6837\u7684\uff0c\u53d8\u5316\u7684\u4ec5\u662f\u8f93\u5165\u53c2\u6570\u548c\u65ad\u8a00\u7ed3\u679c\uff0c\u91c7\u7528\u6570\u636e\u9a71\u52a8\uff0c\u53ef\u4ee5\u8f7b\u677e\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6_1","title":"6. \u683c\u5f0f\u8986\u76d6","text":"\u539f\u56e0\u540c\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u7c7b\u7528\u4f8b\u4e00\u6837\uff0c\u591a\u79cd\u683c\u5f0f\u7684\u8986\u76d6\u4e5f\u662f\u4e00\u4e2a\u5f88\u7e41\u7410\u7684\u4e8b\u60c5\uff0c\u4ea4\u7ed9\u81ea\u52a8\u5316\u6765\u505a\u518d\u5408\u9002\u4e0d\u8fc7\u4e86\u3002 \u6bd4\u5982\u5f71\u9662\u5bf9\u5f71\u7247\u683c\u5f0f\u7684\u68c0\u67e5\u3001\u622a\u56fe\u5f55\u5c4f\u5bf9\u4fdd\u5b58\u683c\u5f0f\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7_1","title":"7. \u68c0\u67e5\u5143\u7d20\u72b6\u6001","text":"\u67e5\u770b\u88ab\u6d4b\u5e94\u7528\u7684\u5143\u7d20\u5c5e\u6027\u3002\u5982\uff1a\u56fe\u7247\u7684\u5927\u5c0f\u548c\u6392\u5217\uff1b\u6309\u94ae\u7684\u53ef\u7528\u548c\u4e0d\u53ef\u7528\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/","title":"AT \u7ecf\u9a8c\u603b\u7ed3","text":"\u6b22\u8fce\u6240\u6709\u4eba\u63d0\u4ea4\u4f60\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u9762\u7684\u4f18\u79c0\u5b9e\u8df5\u7ecf\u9a8c\uff0c\u4ee5\u5e2e\u52a9\u5927\u5bb6\u89e3\u51b3\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#1","title":"1\u3001\u7ec8\u7ed3\u5668","text":"# litaoa@uniontech.com\n \u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4 pytest \u5b9e\u73b0\u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4\u7684\u65b9\u5f0f\u6709\u4e24\u79cd\uff0cyield \u548c\u7ec8\u7ed3\u51fd\u6570\uff1b yield \u5b9e\u73b0\uff0cyield\u524d\u9762\u4e3a\u7528\u4f8b\u7684\u524d\u7f6e\u6b65\u9aa4\uff0cyield \u540e\u9762\u4e3a\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4\u3002 @pytest.fixture\ndef clean_env():\nprint(\"setup\")\nyield\nprint(\"teardown\")\n \u7ec8\u7ed3\u51fd\u6570\u5b9e\u73b0\uff0c\u4f7f\u7528 request.addfinalizer \u6ce8\u518c\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4 @pytest.fixture\ndef clean_env(request):\ndef clean():\nprint(\"teardown\")\nrequest.addfinalizer(clean)\nprint(\"setup\")\n yield\u7684\u4f18\u7f3a\u70b9\uff1a \u4f18\u70b9\uff1a\u4ee3\u7801\u7b80\u6d01\uff0c\u76f4\u89c2\uff0c\u53ef\u4f7f\u7528yield\u5728\u7528\u4f8b\u4e2d\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c \u7f3a\u70b9\uff1a\u82e5\u524d\u7f6e\u6b65\u9aa4\u4e2d\u51fa\u73b0\u9519\u8bef\uff0c\u5219\u540e\u7f6e\u6b65\u9aa4\u4e0d\u4f1a\u6267\u884c \u7ec8\u7ed3\u51fd\u6570\uff1a \u4f18\u70b9\uff1a\u524d\u7f6e\u6b65\u9aa4\u5931\u8d25\u7684\u8bdd\uff0c\u540e\u7f6e\u6b65\u9aa4\u4ecd\u4f1a\u6267\u884c\u4e14\u53ef\u4ee5\u6ce8\u518c\u591a\u4e2a\u540e\u7f6e\u6b65\u9aa4\uff08\u524d\u63d0\uff1a\u9700\u8981\u5728\u4ee3\u7801\u62a5\u9519\u4e4b\u524d\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff09\uff0c\u652f\u6301\u7075\u6d3b\u4f7f\u7528\u540e\u7f6e\u6761\u4ef6 \u7f3a\u70b9\uff1a\u4ee3\u7801\u8f83\u4e3a\u590d\u6742\uff0c\u65e0\u6cd5\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c\uff08\u672c\u4eba\u76ee\u524d\u672a\u5b9e\u73b0\uff09 \u603b\u7ed3\uff1a\u5728\u524d\u7f6e\u6b65\u9aa4\u4fdd\u8bc1\u7edd\u5bf9\u4e0d\u4f1a\u51fa\u9519\u65f6\uff0c\u4f7f\u7528yield\u66f4\u4f73\u7b80\u4fbf\uff0c\u5f53\u524d\u7f6e\u6b65\u9aa4\u6613\u51fa\u73b0\u95ee\u9898\u65f6\uff0c\u63a8\u8350\u4f7f\u7528\u7ec8\u7ed3\u51fd\u6570\u3002 \u573a\u666f\uff1a\u4fdd\u9669\u7bb1\u7528\u4f8b\uff0c\u524d\u7f6e\u6b65\u9aa4\u4e2d\u5f00\u542f\u4fdd\u9669\u7bb1\uff0c\u540e\u7f6e\u6b65\u9aa4\u5220\u9664\u4fdd\u9669\u7bb1\u3002 @pytest.fixture(scope=\"session\", autouse=True)\ndef vault_fixture(request):\nDfmWidget.reset_vault_by_cmd() # 1\u3001\u91cd\u7f6e\u4fdd\u9669\u7bb1\nDdeDockPublicWidget().close_file_manager_by_cmd() # 2\u3001\u5173\u95ed\u6587\u7ba1\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 3\u3001\u5f00\u542f\u6587\u7ba1\nvault = DfmWidget()\nvault.create_file_vault() # 4\u3001\u521b\u5efa\u4fdd\u9669\u7bb1\ndef delete_vault(): # 8\u3001\u5220\u9664\u4fdd\u9669\u7bb1\u7684\u540e\u7f6e\u6b65\u9aa4\nsleep(2)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr()\nvault = DfmWidget()\nvault.delete_file_vault()\nDfmWidget.reset_vault_by_cmd()\nDdeDockPublicWidget().close_file_manager_by_cmd()\nrequest.addfinalizer(delete_vault) # 5\u3001\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\nDdeDockPublicWidget().close_file_manager_by_cmd() # 6\u3001\u5173\u95ed\u6587\u7ba1\nsleep(1)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 7\u3001\u5f00\u542f\u6587\u7ba1\n \u4ee3\u7801\u6309\u6ce8\u91ca\u4e2d\u7684\u5e8f\u53f7\u6267\u884c\u6b65\u9aa4 \u4ee3\u7801\u5728\u6b65\u9aa41-4\u4efb\u610f\u4f4d\u7f6e\u62a5\u9519\uff0c\u5219\u4e0d\u4f1a\u6267\u884c\u6b65\u9aa48\uff0c\u56e0\u4e3a\u672a\u6267\u884c\u5230\u6b65\u9aa45\uff0c\u6b65\u9aa48\u8fd8\u672a\u6ce8\u518c \u4ee3\u7801\u5728\u6b65\u9aa46-7\u62a5\u9519\uff0c\u4ecd\u4f1a\u6267\u884c\u6b65\u9aa47\uff0c\u56e0\u4e3a\u5728\u6b65\u9aa45\u4e2d\u5df2\u7ecf\u5c06\u6b65\u9aa47\u6ce8\u518c \u53ef\u4ee5\u7075\u6d3b\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff0c\u80fd\u5b9e\u73b0\u67d0\u4e2a\u524d\u7f6e\u6b65\u9aa4\u6267\u884c\u4e4b\u540e\uff0c\u624d\u4f1a\u6267\u884c\u540e\u7f6e\u6b65\u9aa4\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#2","title":"2\u3001\u542f\u52a8\u5e94\u7528\u7684\u65b9\u5f0f","text":"# huangmingqiang@uniontech.com\n \uff081\uff09\u547d\u4ee4\u884c\u542f\u52a8 \u5728 AT \u4ee3\u7801\u4e2d\u4f7f\u7528\u547d\u4ee4\u884c\u542f\u52a8\u5e94\u7528\uff0c\u4e3e\u4f8b\uff1a os.popen(\"deepin-music\")\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f7f\u7528 ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6\uff0cdogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u3002 \uff082\uff09\u901a\u8fc7 UI \u64cd\u4f5c\u542f\u52a8 \u901a\u8fc7\u4efb\u52a1\u680f\u3001\u542f\u52a8\u5668\u3001\u684c\u9762\u7b49UI\u65b9\u5f0f\u542f\u52a8\uff0c\u6bd4\u5982\u53cc\u51fb\u6253\u5f00\u3001\u53f3\u952e\u6253\u5f00\u7b49\uff0c\u8fd9\u79cd\u64cd\u4f5c\u65b9\u5f0f\u4e0d\u5b58\u5728ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6dogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u7684\u95ee\u9898\uff0c\u4e5f\u66f4\u52a0\u7b26\u5408\u7528\u6237\u7684\u64cd\u4f5c\u884c\u4e3a\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#3","title":"3\u3001\u6587\u4ef6\u9009\u62e9\u6846\u5c5e\u6027\u5b9a\u4f4d\u5076\u73b0\u65e0\u6cd5\u627e\u5230","text":"\u6587\u4ef6\u9009\u62e9\u6846\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5728\u8c03\u7528\u6587\u4ef6\u9009\u62e9\u6846\u65f6\uff0c\u6709\u4e00\u5b9a\u7684\u6982\u7387\u51fa\u73b0\uff0c\u754c\u9762\u5df2\u7ecf\u6e32\u67d3\u51fa\u6765\u4e86\uff0c\u4f46\u662f\u5c5e\u6027\u6811\u5e76\u6ca1\u6709\u5199\u5165\uff0c\u5bfc\u81f4\u901a\u8fc7\u5c5e\u6027\u65e0\u6cd5\u627e\u5230\u5143\u7d20\uff0c\u76ee\u524d\u4e5f\u6ca1\u6709\u5f88\u597d\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u4e3a\u4e86\u7528\u4f8b\u7a33\u5b9a\u6027\uff0c\u6587\u4ef6\u9009\u62e9\u6846\u7684\u64cd\u4f5c\u5efa\u8bae\u4f7f\u7528UI\u6216\u8005\u56fe\u7247\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u53ef\u4ee5\u901a\u8fc7\u641c\u7d22\u5185\u5bb9\u56fa\u5b9a\u6587\u4ef6\u4f4d\u7f6e\u3002 # litaoa@uniontech.com\n desk = DdeDesktopPublicWidget()\n# \u9009\u62e9\u89c6\u9891\u76ee\u5f55\ndesk.click_videos_dir_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.ctrl_f()\nsleep(1)\ndesk.input_message(\"\u5143\u7d20\u540d\u79f0\")\nsleep(0.5)\ndesk.enter()\nsleep(1)\n# \u9009\u62e9\u7b2c\u4e00\u4e2a\u6587\u4ef6\ndesk.click_list_view_btn_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.click_first_file_in_desktop_plugs_by_ui()\nsleep(1)\n# \u6587\u7ba1\u63d2\u4ef6\u4e2d\u70b9\u51fb\u6253\u5f00\ndesk.click_open_btn_in_desktop_plugs_by_ui()\n"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#4","title":"4\u3001\u5e94\u7528\u542f\u52a8","text":"# mikigo\n \u5728UI\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u4e00\u5207\u64cd\u4f5c\u7684\u90fd\u662f\u4ece\u5e94\u7528\u542f\u52a8\u5f00\u59cb\u7684\uff0c\u800c\u5728Linux\u684c\u9762\u5e94\u7528\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u6211\u4eec\u542f\u52a8\u5e94\u7528\u7684\u65b9\u6cd5\u6709\u591a\u79cd\uff0c\u4e0b\u9762\u505a\u4e00\u4e2a\u7b80\u5355\u7684\u4ecb\u7ecd\uff1a \u3010\u4f7f\u7528dogtail\u542f\u52a8\u3011 dogtail\u63d0\u4f9b\u4e86\u5e94\u7528\u542f\u52a8\u7684\u65b9\u6cd5\uff0c\u5728utils\u5e93\u4e2d\uff0c\u4f7f\u7528run\u65b9\u6cd5\u542f\u52a8\uff1a \u9996\u5148\u5bfc\u5165\u65b9\u6cd5\uff1a from dogtail.utils import *\n \u8c03\u7528run\u65b9\u6cd5 run('deepin-music')\n \u5373\u53ef\u542f\u52a8\u97f3\u4e50 \u8fd9\u79cd\u65b9\u6cd5\u7684\u4f18\u70b9\u662f\u91c7\u7528\u8fdb\u7a0b\u7684\u65b9\u5f0f\u76f4\u63a5\u542f\u52a8\uff0c\u4e0d\u4f9d\u8d56\u4e0eUI\uff0c\u65e0\u8bba\u684c\u9762\u6216\u4efb\u52a1\u680f\u4e0a\u662f\u5426\u5b58\u5728\u5e94\u7528\u56fe\u6807\uff0c\u90fd\u53ef\u4ee5\u6b63\u5e38\u542f\u52a8\u3002 \u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c \u5982\u679c\u4f7f\u7528ssh\u8fdc\u7a0b\u8c03\u7528\uff0c\u6216\u8005Jenkins\u4e2d\u6267\u884c\u6d4b\u8bd5\u811a\u672c\u7684\u65f6\u5019\uff0c\u5728sniff\u4e2d\u4f1a\u51fa\u73b0\u627e\u4e0d\u5230\u5e94\u7528\uff0c\u7ecf\u8fc7\u5206\u6790\uff0c\u53ef\u80fd\u662f\u56e0\u4e3a\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\u542f\u52a8\u7684\u65f6\u5019\uff0c\u5b9e\u9645\u662f\u91c7\u7528\u4e00\u4e2a\u5b50\u8fdb\u7a0b\u542f\u52a8\u4e86\u5e94\u7528\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u5230\u3002 \u3010\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u3011 \u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807 \u901a\u5e38\u6709\u4e24\u79cd\u65b9\u6cd5\uff1a \uff081\uff09\u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807\u3002 \uff082\uff09\u5df2\u77e5\u5e94\u7528\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u7684\u4f4d\u7f6e\uff0c\u7136\u540e\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u5bf9\u5e94\u5750\u6807\u3002 \u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u7f3a\u70b9\u662f\u4f4d\u7f6e\u5fc5\u987b\u56fa\u5b9a\uff0c\u5982\u679c\u79fb\u52a8\u4f4d\u7f6e\u5c31\u4e0d\u884c\u4e86\uff0c\u800c\u4f7f\u7528\u7b2c\u4e00\u79cd\u65b9\u6cd5\uff0c\u65e0\u8bba\u4f4d\u7f6e\u5728\u54ea\u91cc\uff0c\u53ea\u8981\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u5b58\u5728\u5373\u53ef\u3002 \u3010\u70b9\u51fb\u684c\u9762\u56fe\u6807\u542f\u52a8\u3011 \u684c\u9762\u56fe\u6807\u76ee\u524d\u662f\u91c7\u7528\u56fe\u50cf\u8bc6\u522b\u6280\u672f\uff0c\u5b9a\u4f4d\u5230\u5e94\u7528\u56fe\u6807\u7684\u5750\u6807\uff0c\u7136\u540e\u901a\u8fc7pyauogui\u8fdb\u884c\u70b9\u51fb\u64cd\u4f5c\u3002 \u8be6\u7ec6\u6280\u672f\u65b9\u6848\u53ef\u4ee5\u53c2\u8003\u6211\u7684\u53e6\u5916\u4e24\u7bc7\u535a\u5ba2: \u57fa\u4e8eopencv\u7684\u6a21\u677f\u5339\u914d\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd4\u56de\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 Python\u4e09\u65b9\u5e93PyAutoGui\u7684\u4f7f\u7528\u65b9\u6cd5 \u3010\u4ece\u542f\u52a8\u5668\u542f\u52a8\uff08\u4fd7\u79f0\u5f00\u59cb\u83dc\u5355\uff09\u3011 \u542f\u52a8\u4e2d\u542f\u52a8\u7684\u5b9e\u73b0\u903b\u8f91\u5b9e\u9645\u548c\u4efb\u52a1\u680f\u4e0a\u542f\u52a8\u5dee\u4e0d\u591a\u3002 \u9996\u5148\uff0c\u9700\u8981\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u542f\u52a8\u5668\u56fe\u6807\uff0c\u6216\u8005\u952e\u76d8super\u952e\uff0c\u5c06\u542f\u52a8\u5668\u547c\u51fa\u6765\uff0c \u7136\u540e\uff0c\u5728\u542f\u52a8\u5668\u4e2d\u70b9\u51fb\u5bf9\u5e94\u7684\u56fe\u6807\uff0c \u4f46\u662f\u8fd9\u91cc\u6709\u4e2a\u95ee\u9898\uff0c\u542f\u52a8\u5668\u4e2d\u7684\u5e94\u7528\u5217\u8868\uff0c\u4e00\u9875\u5c55\u793a\u4e0d\u5b8c\uff0c\u6240\u4ee5\u5982\u679c\u6211\u4eec\u8981\u70b9\u51fb\u7684\u5e94\u7528\u56fe\u6807\u4e0d\u5728\u7b2c\u4e00\u9875\u600e\u4e48\u529e\uff0c\u901a\u5e38\u89e3\u51b3\u65b9\u6848\u6709\u4e24\u79cd\uff1a \uff081\uff09\u9700\u8981\u8fdb\u884c\u5411\u4e0b\u6ed1\u52a8\uff0c\u8fd9\u91cc\u5c31\u6d89\u53ca\u5230\u76f8\u5e94\u7684\u8bc6\u522b\u65b9\u6848\uff0c\u5224\u65ad\u5982\u679c\u4e0d\u5728\u7b2c\u4e00\u9875\u5c31\u5f80\u4e0b\u6ed1\u52a8\u7ffb\u9875\u3002 \uff082\uff09\u542f\u52a8\u5668\u63d0\u4f9b\u641c\u7d22\u7684\u529f\u80fd\uff0c\u8f93\u5165\u5e94\u7528\u540d\u79f0\u641c\u7d22\uff0c\u7136\u540e\u8fdb\u884c\u70b9\u51fb\u3002 \u4ece\u5b9e\u9645\u64cd\u4f5c\u4e2d\u6765\u770b\uff0c\u91c7\u7528\u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u6548\u7387\u4f1a\u9ad8\u4e00\u70b9\u3002 \u3010\u7ec8\u7aef\u547d\u4ee4\u542f\u52a8\u3011 \u5728python\u4e2d\uff0c\u4f7f\u7528os.popen()\u6216os.system()\u6216\u8005subprocess.Popen()\uff0c\u5b9e\u73b0\u547d\u4ee4\u884c\u542f\u52a8\uff0c\u6bd4\u5982\uff1a import os\nos.popen('deepin-music')\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u8fdc\u7a0b\u6267\u884c\u811a\u672c\u7684\u65f6\u5019\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u7684\u95ee\u9898\u3002 \u3010\u603b\u7ed3\u3011 \u4ee5\u4e0a\u51e0\u79cd\u65b9\u6cd5\uff0c\u5404\u6709\u4f18\u7f3a\u70b9\uff0c\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff1a \uff081\uff09\u5982\u679c\u9700\u8981\u5728Jenkins\u4e2d\u505a\u6301\u7eed\u96c6\u6210\uff0c\u5efa\u8bae\u4f7f\u7528\u7b2c\u4e8c\u79cd\u4efb\u52a1\u680f\u542f\u52a8\u7684\u65b9\u6cd5\u3002 \uff082\uff09\u5982\u679c\u4e0d\u4f1a\u91c7\u7528\u8fdc\u7a0b\u6267\u884c\u7684\uff0c\u5efa\u8bae\u91c7\u7528\u7b2c\u4e00\u79cd\u6216\u8005\u6700\u540e\u4e00\u79cd\u65b9\u6848\u3002 \uff083\uff09\u7b2c\u4e09\u79cd\u548c\u7b2c\u56db\u79cd\u542f\u52a8\u65b9\u6cd5\uff0c\u901a\u5e38\u5728\u6d4b\u8bd5\u7528\u4f8b\u4e2d\u4f1a\u6d89\u53ca\u5230\uff0c\u6240\u4ee5\u5076\u5c14\u4f1a\u7528\u3002"},{"location":"RELEASE/","title":"\u7248\u672c\u66f4\u65b0\u8bb0\u5f55","text":""},{"location":"RELEASE/#220202395","title":"2.2.0\uff082023/9/5\uff09","text":"new \u6b63\u5f0f\u542f\u7528 letmego \u6280\u672f\u65b9\u6848\uff1b fix \u5bf9 docs \u91cc\u9762\u7ec6\u5316\u4e86\u8fdc\u7a0b\u6267\u884c\u7ae0\u8282\u7684\u63cf\u8ff0\uff1b "},{"location":"RELEASE/#2152023831","title":"2.1.5\uff082023/8/31\uff09","text":"new \u5c06\u6709\u8da3\u7684\u6587\u6863\u7cfb\u7edf\u8fc1\u79fb\u5230 linuxdeepin \uff0c\u5265\u79bb\u6587\u6863\u4e2d\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u91c7\u7528 CDN \u52a0\u901f\u65b9\u5f0f\u52a0\u8f7d\uff1b \u5c1d\u8bd5\u5408\u5165\u4e00\u4e2a\u6709\u8da3\u7684\u529f\u80fd\uff1b fix \u4fee\u590d\u4e86 Wayland \u952e\u9f20\u5de5\u5177\u6ca1\u6709\u9f20\u6807\u76f8\u5bf9\u79fb\u52a8\u65b9\u6cd5 moveRel \u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 Wayland \u4e0b\u83b7\u53d6\u7a97\u53e3\u4fe1\u606f\u529f\u80fd\u6a21\u5757\u4e2d\u73af\u5883\u53d8\u91cf\u7684\u95ee\u9898\uff1b \u4f18\u5316\u4e86 startproject \u529f\u80fd\u7684\u4e00\u4e9b\u4fe1\u606f\u8f93\u51fa\uff1b \u4fee\u590d\u4e86\u7279\u6b8a\u573a\u666f\u4e0b env_dev.sh \u5f00\u53d1\u73af\u5883\u90e8\u7f72\u662f\u53ef\u80fd\u5f71\u54cd\u5230\u6b63\u5f0f\u73af\u5883 env.sh \u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#2122023822","title":"2.1.2\uff082023/8/22\uff09","text":"new \u589e\u52a0 OCR \u8bc6\u522b\u81ea\u52a8\u91cd\u8bd5\u673a\u5236\uff0c\u9ed8\u8ba4\u91cd\u8bd5 2 \u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u91cd\u8bd5\u6b21\u6570\uff1b \u4f7f\u7528\u7a97\u7ba1\u6700\u65b0\u63d0\u4f9b\u7684\u4e8c\u8fdb\u5236\u63a5\u53e3\uff0c\u4f18\u5316\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u5728 Wayland \u4e0b\u83b7\u53d6\u7a97\u53e3\u4fe1\u606f\u7684\u65b9\u6cd5\uff1b\u611f\u8c22\u684c\u9762\u6d4b\u8bd5\u90e8 @\u4f55\u6743 @\u5b59\u7fe0 \u3001\u7a97\u7ba1\u7814\u53d1 @\u9ec4\u6cfd\u94ed \u7684\u5927\u529b\u652f\u6301\u3002 \u6269\u5145 skipif \u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\u51fd\u6570\uff1a skipif_xdg_type \u652f\u6301 x11 \u6216 wayland \u4e0a\u8df3\u8fc7\uff1b skipif_cpu_name \u652f\u6301\u4e0d\u540c cpu \u4e0a\u8df3\u8fc7\uff0c\u6bd4\u5982\uff1askipif_cpu_name-KLVVW5821\uff1b "},{"location":"RELEASE/#2102023818","title":"2.1.0\uff082023/8/18\uff09","text":"fix \u4fee\u590d SW \u67b6\u6784\u73af\u5883\u4f9d\u8d56\u7684\u95ee\u9898\uff0c\u539f\u56e0\u662f\u4e4b\u524d\u6211\u8fd9\u91cc\u672c\u5730\u6ca1\u6709 SW \u7684\u673a\u5668\uff0c\u6ca1\u6709\u505a\u76f8\u5173\u9002\u914d\uff1b \u4fee\u590d\u5b50\u9879\u76ee\u5355\u72ec\u9700\u8981\u4e09\u65b9\u5305 pexpect\uff0c\u7531\u4e8e\u4e4b\u524d\u662f\u9884\u88c5\u5230\u955c\u50cf\u91cc\u9762\u7684\uff0c\u4f46\u57fa\u7840\u6846\u67b6\u4e0d\u9700\u8981\uff0c\u56e0\u6b64\u6ca1\u6709\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u91cc\u9762\uff0c\u5bfc\u81f4\u5b50\u9879\u76ee\u4f9d\u8d56\u62a5\u9519\u3002 \u4fee\u590d\u5b50\u9879\u76ee cv \u5bfc\u5165\u62a5\u9519\u7684\u95ee\u9898\uff1b \u539f\u56e0\u4e3a\uff1ayouqu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u517c\u5bb9\u4e24\u79cd\u60c5\u51b5\uff0c\u4e00\u79cd\u662f\u9762\u5411\u670d\u52a1\uff0c\u5c31\u662f\u672c\u5730\u6d4b\u8bd5\u673a\u4e0d\u9700\u8981\u5b89\u88c5 OpenCV\uff0c\u7528\u4f8b\u4e2d\u7684\u56fe\u50cf\u8bc6\u522b\u4f1a\u901a\u8fc7\u8fdc\u7a0b\u670d\u52a1\u63a5\u53e3\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u548c\u7ed3\u679c\u83b7\u53d6\uff1b\u7b2c\u4e8c\u79cd\u662f\u539f\u751f\uff0c\u5c31\u662f\u672c\u5730\u76f4\u63a5\u5b89\u88c5 OpenCV \u76f4\u63a5\u7528\u3002\u4e24\u4e2a\u60c5\u51b5\u7684\u4f18\u5148\u7ea7\u662f\u4f18\u5148\u5224\u65ad\u672c\u5730\u5b58\u5728\uff0c\u5426\u5219\u8d70\u670d\u52a1\u3002 \u524d\u9762\u6211\u4eec\u5df2\u7ecf\u628a OCR \u529f\u80fd\u505a\u4e86\u670d\u52a1\u5316\uff0c\u57fa\u4e8e 1 \u5e74\u591a\u4ee5\u6765\u7684\u89c2\u5bdf\uff0c\u7528\u8d77\u6765\u5f88\u7a33\u5b9a\uff0c\u518d\u4e00\u4e2a\u5c31\u662f OpenCV \u5b89\u88c5\u5305\u662f\u6bd4\u8f83\u81c3\u80bf\u7684\uff0c\u7c97\u7565\u6570\u4e86\u4e0b\u4f9d\u8d56\u6709 30+ \u4e2a\uff0c\u800c\u4e14\u5728\u5404\u67b6\u6784\u4e0a\u4f9d\u8d56\u5305\u8fd8\u4e0d\u5c3d\u76f8\u540c\uff0c\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u65b9\u6848\u4e2d\u4e0d\u592a\u597d\u5904\u7406\uff0c\u6240\u4ee5\u672c\u6b21 2.0 \u7248\u672c\u6211\u4eec\u5927\u80c6\u7684\u5c06\u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u529f\u80fd\u4fee\u6539\u4e3a\u9762\u5411\u670d\u52a1\u7684\u65b9\u5f0f\uff0c\u524d\u671f\u6d4b\u8bd5\u4e00\u5207\u770b\u8d77\u6765\u90fd\u5f88\u548c\u8c10\u3002 \u4f46\u662f\u6ca1\u6ce8\u610f\u5230\u4e4b\u524d\u7ed9\u6d77\u71d5\u59d0\u90a3\u8fb9\u9879\u76ee\u5355\u72ec\u5b9a\u5236\u505a\u4e86\u4e2a\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\uff08\u4e3a\u4e86\u80fd\u7b80\u5355\u5e73\u6ed1\u7684\u8fc1\u79fb\u5230 youqu\uff09\uff0c\u6b64\u63a5\u53e3\u5e95\u5c42\u6ca1\u6709\u517c\u5bb9\u670d\u52a1\u5316\uff0c\u6240\u4ee5\u5979\u90a3\u8fb9\u7684\u9879\u76ee\u8c03\u7528\u6b64\u5b9a\u5236\u63a5\u53e3\u4f1a\u62a5 cv \u5bfc\u5165\u7684\u95ee\u9898\u3002 \u7531\u4e8e\u5c06\u8fd9\u4e2a\u5b9a\u5236\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\u8fdb\u884c\u670d\u52a1\u5316\u517c\u5bb9\u6539\u9020\u9700\u8981\u4e00\u5b9a\u65f6\u95f4\uff0c\u6539\u5b8c\u8fd8\u9700\u8981\u6d4b\u8bd5\uff0c\u4f46\u672c\u6b21\u65f6\u95f4\u6bd4\u8f83\u7d27\uff0c\u56e0\u6b64\u5148\u628a OpenCV \u88c5\u8fdb\u865a\u62df\u73af\u5883\uff0c\u540e\u7eed\u7248\u672c\u518d\u8003\u8651\u9488\u5bf9\u6b64\u63a5\u53e3\u505a\u4fee\u6539\u3002"},{"location":"RELEASE/#2002023816","title":"2.0.0\uff082023/8/16\uff09","text":"YouQu\uff08\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff09\u5f00\u6e90\u4e86\uff0c\u540c\u65f6\u63a8\u51fa\u4e86 2.0 \u7248\u672c\u3002 \u611f\u8c22\u738b\u6ce2\u603b\u3001\u67b6\u6784\u5e08\u5f90\u5c0f\u4e1c\u3001\u7814\u53d1\u7ecf\u7406\u90d1\u5e7c\u6208\u3001\u5218\u90d1\u7b49\u7814\u53d1\u540c\u4e8b\u7684\u5927\u529b\u652f\u6301\u3002 new 1\u3001\u65b0\u7684\u57fa\u7840\u6846\u67b6\u4ee3\u7801\u83b7\u53d6\u65b9\u5f0f\u53ca\u65b0\u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4 YouQu \u540e\u7eed\u5747\u901a\u8fc7 PyPI \u8fdb\u884c\u5305\u7684\u53d1\u5e03\uff0c\u4e5f\u5c31\u662f\u8bf4\u540e\u7eed\u53ef\u4ee5\u4f7f\u7528 pip \u8fdb\u884c\u5b89\u88c5\uff1a sudo pip3 install youqu==2.0.0\n \u8fd9\u91cc\u6709 2 \u4e2a\u5c0f\u70b9\u8981\u6ce8\u610f\uff1a \u63a8\u8350\u4f7f\u7528 sudo pip3 \uff08\u52a0 sudo\uff09\u8fdb\u884c\u5b89\u88c5\uff1b \u5982\u679c\u4e0d\u52a0 sudo \u6709\u4e9b\u673a\u5668\u53ef\u80fd $HOME/.local/bin \u4e0d\u5728\u7cfb\u7edf PATH \u73af\u5883\u76ee\u5f55\u4e0b\uff0c\u5728\u4e0d\u6dfb\u52a0\u73af\u5883\u53d8\u91cf\u7684\u60c5\u51b5\u4e0b\uff0c\u4f1a\u51fa\u73b0 YouQu \u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4\uff08youqu-startproject\uff09\u65e0\u6cd5\u4f7f\u7528\u7684\u95ee\u9898\uff1b \u5f53\u7136\uff0c\u5c06\u4e0a\u8ff0\u8def\u5f84\u6dfb\u52a0\u5230\u73af\u5883\u53d8\u91cf\u4e4b\u540e\u4e5f\u662f\u53ef\u4ee5\u7528\u7684\uff0c\u6240\u4ee5\u6211\u8fd9\u91cc\u662f\u63a8\u8350\u52a0 sudo\uff0c\u4e0d\u52a0 sudo \u4e5f\u662f\u53ef\u4ee5\u7684\uff0c\u53ea\u662f\u9700\u8981\u5173\u6ce8\u4e0b\u73af\u5883\u53d8\u91cf\u7684\u95ee\u9898\u3002 \u63a8\u8350\u6307\u5b9a\u7248\u672c\u53f7\uff08youqu==2.0.0\uff09\u5b89\u88c5\uff0c\u5982\u679c\u4e0d\u6307\u5b9a\u7248\u672c\u53f7\u9ed8\u8ba4\u662f\u5b89\u88c5\u6700\u65b0\u53d1\u5e03\u7684 YouQu \u7248\u672c\uff0c\u4f60\u53ef\u4ee5\u5728 PyPI \u4e0a\u7684 Release history \u91cc\u9762\u67e5\u770b\u6709\u54ea\u4e9b\u7248\u672c\u3002 \u5b89\u88c5\u4e4b\u540e\u4f1a\u81ea\u52a8\u751f\u6210\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu-startproject\uff0c\u4f7f\u7528\u5b83\u53ef\u4ee5\u521d\u59cb\u5316\u5de5\u7a0b\uff0c\u8fd9\u91cc\u4ee5\u97f3\u4e50\u4e3e\u4f8b\uff1b youqu-startproject autotest_deepin_music\n \u8fd9\u6837\u5c31\u4f1a\u5728\u5f53\u524d\u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a autotest_deepin_music \u76ee\u5f55\uff0c\u91cc\u9762\u5305\u542b\u4e86\u57fa\u7840\u6846\u67b6\u6240\u6709\u7684\u4ee3\u7801\uff1b \u4e4b\u540e\uff0c\u8fd8\u662f\u5728 apps \u76ee\u5f55\u4e0b\uff0c\u653e\u5165\u5b50\u9879\u76ee\u7684AT\u4ee3\u7801\u5373\u53ef\uff0c\u4f7f\u7528\u65b9\u6cd5\u548c\u8fc7\u53bb\u4e00\u6837\uff0c\u8fd9\u91cc\u5c31\u4e0d\u591a\u4ecb\u7ecd\u3002 \u53e6\u5916\uff0c\u9664\u4e86\u901a\u8fc7 pip \u83b7\u53d6\u4ee5\u5916\uff0c\u4ecd\u7136\u53ef\u4ee5\u901a\u8fc7\u6e90\u7801\u83b7\u53d6\uff08\u76f4\u63a5 git clone\uff09\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u4f7f\u7528 pip \u5b89\u88c5 YouQu \u65f6\uff0cYouQu \u5305\u7684\u5927\u5c0f\u624d 600+ k\uff0c\u5b89\u88c5\u901f\u5ea6\u8d77\u98de\u3002 2\u3001\u65b0\u7684AT\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848 \u4e3a\u4e86\u89e3\u51b3\u4ee5\u4e0b\u95ee\u9898\uff1a \u8fc7\u53bb\u4e00\u6bb5\u65f6\u95f4\u54b1\u4eec\u7ecf\u5e38\u51fa\u73b0\u7684\uff0c\u4e0d\u540c\u7684AT\u9879\u76ee\u5728\u540c\u4e00\u53f0\u673a\u5668\u4e0a\u90e8\u7f72\u73af\u5883\u65f6\u4f9d\u8d56\u7248\u672c\u51b2\u7a81\u7684\u95ee\u9898\uff0c\u65b0\u65b9\u6848\u4e0d\u540c\u7684\u9879\u76ee\u4f1a\u52a8\u6001\u751f\u6210\u81ea\u5df1\u7684\u865a\u62df\u73af\u5883\uff0c\u76f8\u4e92\u4e4b\u95f4\u4e0d\u5f71\u54cd\uff1b \u4e1a\u5185\u4e3a\u4e86\u89e3\u51b3\u7248\u672c\u51b2\u7a81\u95ee\u9898\u4e00\u822c\u90fd\u4f1a\u4f7f\u7528Python\u865a\u62df\u73af\u5883\u7684\u5de5\u5177\uff0c\u4f46\u662f\u90fd\u6709\u4e2a\u95ee\u9898\uff0c\u65e0\u6cd5\u7ba1\u7406 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u5305\uff0c\u672c\u6b21\u6211\u4eec\u89e3\u51b3\u4e86\u8fd9\u4e2a\u95ee\u9898\uff0c\u80fd\u591f\u5b8c\u5168\u7ba1\u7406\u5e38\u89c4\u7684Python\u5305\uff0c\u4e5f\u80fd\u7ba1\u7406\u5230 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u4e09\u65b9\u5305\uff1b \u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u4f7f\u7528\u65b9\u6cd5\uff1a bash env.sh\n \u53ef\u4ee5\u770b\u51fa\u6765\u548c\u539f\u6765\u4f7f\u7528\u65b9\u6cd5\u6ca1\u6709\u53d8\u5316\uff0c\u4e5f\u5c31\u662f\u8bf4\u4ece\u4f7f\u7528\u7684\u89d2\u5ea6\u662f\u5b8c\u5168\u6ca1\u6709\u533a\u522b\u7684\uff0c\u53ea\u662f\u5185\u90e8\u505a\u4e86\u4e0d\u540c\u7684\u4e8b\u60c5\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u672c\u673a\u90e8\u7f72\u7684\u529f\u80fd\u4ecd\u7136\u4fdd\u7559 env_dev.sh\uff0c\u53ef\u4ee5\u4f5c\u4e3a\u5f00\u53d1\u65f6\u7684\u73af\u5883\u90e8\u7f72\u3002 3\u3001\u65b0\u7684\u9a71\u52a8\u547d\u4ee4 \u8fc7\u53bb\u54b1\u4eec\u90fd\u662f\u4f7f\u7528\u8fd9\u6837\u7684\u547d\u4ee4\u6765\u9a71\u52a8\u6267\u884c\uff1a python3 manage.py run\n \u7531\u4e8e\u9ed8\u8ba4\u57fa\u4e8e\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848\uff0c\u56e0\u6b64\u6211\u4eec\u589e\u52a0\u4e86\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu\uff1b \u65b0\u7684\u9a71\u52a8\u65b9\u5f0f\uff1a youqu manage.py run\n \u53ea\u9700\u8981\u628a python3 \u66ff\u6362\u6210 youqu \u5c31\u53ef\u4ee5\u4e86\uff0c\u770b\u8d77\u6765\u5f88\u548c\u8c10~ 4\u3001\u65b0\u7684\u6587\u6863\u5730\u5740 \u8fc7\u53bb\u54b1\u4eec YouQu \u7684\u5728\u7ebf\u6587\u6863\u662f\u90e8\u7f72\u5728\u516c\u53f8\u5185\u7f51\u7684\uff0c\u73b0\u5728\u5f00\u6e90\u5230 github \u4e86\uff0c\u5916\u90e8\u5f00\u53d1\u8005\u80af\u5b9a\u8bbf\u95ee\u4e0d\u5230\u5185\u7f51\u7684\u6587\u6863\uff0c\u56e0\u6b64\u9700\u8981\u5c06\u6587\u6863\u90e8\u7f72\u5230\u516c\u7f51\u3010\u516c\u7f51\u6587\u6863\u3011\uff1b \u516c\u7f51\u6587\u6863\u4f7f\u7528\u7684\u662f github pages\uff08\u767d\u5ad6\u602a\u4e00\u987f\u72c2\u559c~~\uff09\uff0c\u4f46\u53ef\u80fd\u4f1a\u51fa\u73b0\u6587\u6863\u901f\u5ea6\u6162\u7684\u95ee\u9898\uff08\u4ee3\u7406\u4e0b\u5c31\u597d\u4e86\uff09\uff0c\u4e0d\u8fc7\u6ca1\u5173\u7cfb\uff0c\u54b1\u4eec\u3010\u5185\u7f51\u6587\u6863\u3011\u4ecd\u7136\u4fdd\u7559\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u3002 5\u3001\u5176\u4ed6\u4e00\u4e9b\u5c0f\u5c0f\u529f\u80fd\u66f4\u65b0\uff1a \uff081\uff09\u65b0\u589e\u5173\u95ed\u5206\u8fa8\u7387\u68c0\u6d4b\u7684\u53c2\u6570\u503c\uff1b youqu manage.py run --resolution no\n \u6216\u8005\u4fee\u6539 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387, \u6bd4\u5982\uff1a1920x1080\n;no: \u8868\u793a\u4e0d\u505a\u5206\u8fa8\u7387\u6821\u9a8c\nRESOLUTION = 1920x1080\n resolution \u8fd9\u4e2a\u53c2\u6570\u4e00\u76f4\u90fd\u6709\u7684\uff0c\u53ea\u4e0d\u8fc7\u4e4b\u524d\u662f\u7528\u4e8e\u6307\u5b9a\u5206\u8fa8\u7387\u5927\u5c0f\uff0c\u6bd4\u5982 --resolution 1920x1080\uff0c\u4f46\u6709\u4e9b\u63a5\u53e3\u7684\u9879\u76ee\u4e0d\u9700\u8981\u8fd9\u4e2a\u68c0\u67e5\uff0c\u53ef\u4ee5\u7ed9\u5b83\u4e2a no \u5c31\u597d\u4e86\uff0c\u5f53\u7136 CICD \u4e0a\u5173\u95ed\uff0c\u9700\u8981\u6d41\u6c34\u7ebf\u4e0a\u628a\u8fd9\u4e2a\u53c2\u6570\u52a0\u4e0a\uff1b \uff082\uff09\u65b0\u589e\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u7684\u547d\u4ee4\u884c\u53c2\u6570 \u4e4b\u524d\u8fd9\u4e2a\u914d\u7f6e\u9879\u53ea\u80fd\u5728 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c 1 \u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff0cRERUN >= RECORD_FAILED_CASE\u3002\n;1.\u5173\u95ed\u5f55\u5c4f\uff1aRECORD_FAILED_CASE > RERUN\n;2.\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1aRECORD_FAILED_CASE = 0\nRECORD_FAILED_CASE = 1\n \u73b0\u5728\u5c06\u5f00\u53d1\u5230\u547d\u4ee4\u884c\u53c2\u6570\u3002 youqu manage.py run --record_failed_case 2\n fix \u4fee\u590d remote \u6267\u884c\u65f6\uff0c\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u65e0\u6cd5\u751f\u6210\u6d4b\u8bd5\u62a5\u544a\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1302023710","title":"1.3.0\uff082023/7/10\uff09","text":"fix \u8fdb\u4e00\u6b65\u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b\u53c2\u8003\uff1a\u914d\u7f6ePython\u6e90\u7684\u51e0\u79cd\u65b9\u6cd5 \u4fee\u590d wayland_autotool \u53d7\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86wayland\u4e0b\u5076\u73b0\u627e\u4e0d\u5230 .Xauthority \u6587\u4ef6\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1292023626","title":"1.2.9\uff082023/6/26\uff09","text":"fix \u4f18\u5316\u8fdc\u7a0b\u6267\u884c remote \u7684\u53c2\u6570\u76f4\u63a5\u4f20\u7ed9\u8fdc\u7a0b\u673a\u5668\u7684 run \u547d\u4ee4\uff0c\u4e0d\u7528\u518d\u5355\u72ec\u5904\u7406\u8fdc\u7a0b\u6267\u884c\u7684\u53c2\u6570\u903b\u8f91\uff0c\u540e\u7eed\u4e13\u6ce8\u4e8e\u672c\u5730\u6267\u884c\u529f\u80fd\u5f00\u53d1\uff0c\u8fdc\u7a0b\u6267\u884c\u81ea\u52a8\u9002\u7528\uff1b env.sh \u79fb\u9664 pyyaml \u5b89\u88c5\uff0c\u7531\u5b50\u9879\u76ee\u5728 requirement.txt \u91cc\u9762\u5b9a\u4e49\uff0c\u6846\u67b6\u81ea\u52a8\u52a0\u8f7d\uff1b \u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b "},{"location":"RELEASE/#128202369","title":"1.2.8\uff082023/6/9\uff09","text":"fix \u4fee\u590d\u4e86 pypi \u5b89\u88c5 numpy \u5b58\u5728\u7cfb\u7edf\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#127202368","title":"1.2.7\uff082023/6/8\uff09","text":"fix env.sh \u4e2d\u5b89\u88c5 Python \u5305\u672a\u6307\u5b9a\u7248\u672c\u65f6\uff0c\u65e5\u5fd7\u8f93\u51fa\u5b89\u88c5\u7684\u7248\u672c\uff1b pdocr-rpc 2.0.1\nallure-custom 1.2.1\nfunnylog 1.1.3\n \u4fee\u590d -f \u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u62a5\u9519\u7684\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#126202367","title":"1.2.6\uff082023/6/7\uff09","text":"fix \u4fee\u590d wayland \u4e0a\u8c03\u7528\u9f20\u6807\u4e2d\u952e\u3001\u53f3\u952e\u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b \u4fee\u590d pubilic/dde_desktop_public_widget \u91cc\u9762\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u5b9a\u4f4d\u684c\u9762\u6587\u4ef6\u7684\u65b9\u6cd5\uff0c\u5750\u6807\u6ca1\u6709\u62c6\u5305\u7684\u95ee\u9898\uff1b \u4f18\u5316\u4e86\u7b49\u5f85\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b pycreeze \u7248\u672c\u5347\u7ea7\u5230 0.1.29\uff0c\u5bfc\u81f4\u4e0e pyautogui 0.9.53 \u4e0d\u517c\u5bb9\uff0cenv.sh \u91cc\u9762\u589e\u52a0\u6307\u5b9a pycreeze \u7248\u672c\u4e3a 0.1.28\uff1b "},{"location":"RELEASE/#1252023516","title":"1.2.5\uff082023/5/16\uff09","text":"new --app \u53c2\u6570\u540e\u9762\u65b0\u589e\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u76ee\u524d\u652f\u6301\u4e09\u79cd\u53c2\u6570\u4f20\u5165\u65b9\u5f0f\uff1a ~$: youqu run -a deepin-music\n~$: youqu run -a autotest_deepin_music\n~$: youqu run -a apps/autotest_deepin_music\n \u200b \u540e\u4e24\u79cd\u5165\u53c2\u65b9\u5f0f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\u3002 remote \u8fdc\u7a0b\u6267\u884c\u65b0\u589e\u4ece\u547d\u4ee4\u884c\u4f20\u5165\u6d4b\u8bd5\u673a\u4fe1\u606f\uff0c\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679c password \u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6 setting/remote.ini \u4e2d CLIENT_PASSWORD \u7684\u503c,\u6bd4\u5982\uff1auos@10.8.13.33:1 \u6216 uos@10.8.13.33 \uff1b python3 manage.py remote -c uos@10.8.13.33/uos@10.8.13.34\npython3 manage.py remote -c uos@10.8.13.33:1/uos@10.8.13.34:2\n fix \u65e5\u5fd7\u6a21\u5757\u4fee\u6539\u4e3a\u51fd\u6570\u6267\u884c\u4e4b\u524d\u6253\u5370\u65e5\u5fd7\uff1b \u65e5\u5fd7\u6a21\u5757\u589e\u52a0\u767d\u540d\u5355\uff0c\u901a\u8fc7\u7c7b\u540d\u5f00\u5934\uff0c\u7ed3\u675f\uff0c\u5305\u542b\u7b49\u5173\u952e\u5b57\u63a7\u5236\u9700\u8981\u6253\u5370\u7684\u51fd\u6570\u65e5\u5fd7\uff1b \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5982\u679c\u4f20\u5165\u4e86 app_name \u53ea\u4f1a\u5c06 apps \u76ee\u5f55\u4e0b app_name \u7684\u76ee\u5f55\u53d1\u9001\u5230\u6d4b\u8bd5\u673a\uff1b env.sh \u79fb\u9664 python3-dev\uff1b \u4fee\u590d Wayland \u4e0b env.sh \u73af\u5883\u5b89\u88c5\u5931\u8d25\u7684\u95ee\u9898\uff0c\u4f18\u5316\u4e86 deb \u4f9d\u8d56\u5b89\u88c5\u7684\u903b\u8f91\uff1b \u5c06 env.sh \u5237\u65b0\u6e90\u7684\u65e5\u5fd7\u5728\u7ec8\u7aef\u663e\u793a\uff0c\u89e3\u51b3\u5728 CI \u73af\u5883\u4e0b\uff0c\u957f\u65f6\u95f4\u4e0d\u8f93\u51fa\u65e5\u5fd7\u8fde\u63a5\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d1060 \u534e\u4e3a\u673a\u578b\u5b89\u88c5\u952e\u9f20\u5de5\u5177\u65f6\u4f9d\u8d56\u4e0d\u517c\u5bb9\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1242023227","title":"1.2.4\uff082023/2/27\uff09","text":"fix \u4fee\u6539 CURRENT \u6587\u4ef6\uff1b "},{"location":"RELEASE/#1232023227","title":"1.2.3\uff082023/2/27\uff09","text":"new pylint.sh \u652f\u6301\u901a\u8fc7\u4f4d\u7f6e\u53c2\u6570\u4f20\u5165\u6587\u4ef6\u8def\u5f84\uff1abash pylint.sh apps/autotest_deepin_music,\u597d\u5904\u662f\u53c2\u6570\u8def\u5f84\u53ef\u4ee5\u5728\u7ec8\u7aef\u8865\u5168\uff1b \u65b0\u589e\u7cfb\u7edf\u547d\u4ee4 youqu-pylint \uff0c\u7528\u4e8e\u9759\u6001\u4ee3\u7801\u626b\u63cf\uff0c\u4f7f\u7528\u65b9\u6cd5: youqu-pylint apps/autotest_deepin_music\uff1b \u7531\u4e8e\u7cfb\u7edf\u4e00\u4e9b dbus \u63a5\u53e3\u6539\u53d8\uff0c\u516c\u5171\u5e93\u4e2d\u7684 dbus \u65b9\u6cd5\u5c06\u4e0d\u518d\u7ef4\u62a4\uff0c\u7531\u5b50\u9879\u76ee\u5728 other_widget.py \u91cc\u9762\u8fdb\u884c\u7ef4\u62a4\uff1b fix \u4fee\u590d ssh \u73af\u5883\u4e0b\u8fd0\u884c\u63d0\u793a \u201c\u65e0\u6cd5\u8fde\u63a5\u201d \u7684\u95ee\u9898\uff1b \u4fee\u590d\u8fd0\u884c\u65f6\u7a0b\u5e8f\u9000\u51fa\uff0c\u4e0d\u8f93\u51fa\u5f02\u5e38\u65e5\u5fd7\u7684\u95ee\u9898\uff1b \u4fee\u590dyouqu remote xxx \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5728\u670d\u52a1\u7aef Ctrl + C \u65e0\u6cd5\u505c\u6b62\u7a0b\u5e8f\u8fd0\u884c\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#122202328","title":"1.2.2\uff082023/2/8\uff09","text":"new \u65b0\u589e\u6c14\u6ce1\u7c7b\u56fe\u50cf\u8bc6\u522b\u65b9\u6848\uff1bimage_utils.py::ImageUtil::get_during\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u533a\u57df\u8bc6\u522b\uff0c\u4f20\u5165 [x, y, w, h]\uff0cx: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u76ee\u6807\u56fe\u7247\uff0c\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\uff1b env.sh \u79fb\u9664 pypinyin; \u4f18\u5316\u6267\u884c env.sh \u65f6\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b manage.py \u79fb\u9664\u4e86\u53c2\u6570 session_timeout \uff0c\u6846\u67b6\u6839\u636e\u5168\u5c40\u7684 timeout \u4ee5\u53ca\u7528\u4f8b\u81ea\u5b9a\u4e49\u7684 timeout \u81ea\u52a8\u8ba1\u7b97\u51fa sessiontimeout \u7684\u503c\uff1b \u65b0\u589e ocr \u670d\u52a1\u5668\u94fe\u63a5\u91cd\u8bd5\uff0c\u9ed8\u8ba4\u91cd\u8bd51\u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u53c2\u6570\uff1b fix \u4fee\u590d\u4e86\u4e00\u4e9b pylint \u626b\u63cf\u7684\u4ee3\u7801\u98ce\u683c\u95ee\u9898\uff1b \u91cd\u65b0\u8bbe\u8ba1\u4e86\u6d4b\u8bd5\u62a5\u544a\u4e3b\u9898\uff1b "},{"location":"RELEASE/#121202316","title":"1.2.1\uff082023/1/6\uff09","text":"new \u652f\u6301\u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6267\u884c\u7528\u4f8b\uff1b\u53ef\u5c06python3 manage.py \u66ff\u6362\u4e3a youqu \uff1a youqu run -a deepin-music -k 001\n RPC \u670d\u52a1 IP \u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u6307\u5b9a\u4e0d\u540c\u7684\u7aef\u53e3\uff1b \u5728\u7ebf\u6587\u6863\u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u539f\u6765\u7684\u5730\u5740 10.8.10.215 \u5c06\u4e0d\u5728\u4f7f\u7528\uff1b fix \u4fee\u590d --count \u53c2\u6570\u53ef\u80fd\u51fa\u73b0\u4e0e\u5176\u4ed6\u6846\u67b6\u7684\u5de5\u7a0b\u4f9d\u8d56\u5b58\u5728\u51b2\u7a81\uff0c\u62a5\u9519\u91cd\u590d\u6ce8\u518c\u7684\u95ee\u9898\uff1b \u4fee\u590d CI \u73af\u5883\u4e0b\u591a\u4e2a\u5de5\u7a0b\u5b58\u5728 Python \u73af\u5883\u53d8\u91cf\u6307\u5411\u9519\u8bef\uff0c\u5bfc\u5305\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u5355\u72ec\u8fd0\u884c\u65b9\u6cd5\u65f6\u65e0\u65e5\u5fd7\u8f93\u51fa\u7684 Bug\uff1b "},{"location":"RELEASE/#12020221230","title":"1.2.0\uff082022/12/30\uff09","text":"1.1.4 \u7248\u672c\u9002\u914d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e14\u65b0\u589e\u4e86\u8f83\u591a\u65b0\u7279\u6027\uff0c\u6211\u4eec\u8ba1\u5212\u4f7f\u7528 1.1.4 \u7248\u672c\u8fd0\u884c\u4e00\u6bb5\u65f6\u95f4\uff0c1.2.0 \u7248\u672c\u5c06\u4fee\u590d\u671f\u95f4\u51fa\u73b0\u7684 Bug\uff0c\u7136\u540e\u4f5c\u4e3a\u7a33\u5b9a\u7248\u672c\u53d1\u5e03\u3002 new \u4fee\u6539\u5de5\u7a0b\u540d\u79f0\u4e3a youqu\uff1b \u5c06 sphinx \u6587\u6863\u5de5\u7a0b\u8fc1\u79fb\u5230\u5355\u72ec\u7684\u4ed3\u5e93\uff1b fix \u4fee\u590d startapp \u521b\u5efa\u5de5\u7a0b\u65f6\u5b58\u5728\u5de5\u7a0b\u540d\u79f0\u65f6\u65e0\u6cd5\u7ee7\u7eed\u521b\u5efa\uff1b \u4fee\u590d\u4e86 OCR \u670d\u52a1\u5728\u5e76\u53d1\u65f6\u53ef\u80fd\u51fa\u73b0\u65e0\u6cd5\u8fd4\u56de\u7ed3\u679c\u7684\u95ee\u9898\uff0c\u63d0\u5347 OCR \u670d\u52a1\u9ad8\u5e76\u53d1\u7a33\u5b9a\u6027\uff1b \u4fee\u590d PMS \u540c\u6b65\u6807\u7b7e\u5230 CSV \u6587\u4ef6\u4e0d\u652f\u6301\u7528\u4f8b\u5e93\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11420221214","title":"1.1.4\uff082022/12/14\uff09","text":"new \u65b0\u589e startapp \u5b50\u547d\u4ee4\u521b\u5efa\u5b50\u9879\u76ee\u5de5\u7a0b\u6a21\u677f: python3 manage.py startapp autotest_deepin_xxx \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u91cd\u590d\u6267\u884c\u6b21\u6570\uff1b \u53bb\u6389\u6279\u91cf\u6267\u884c\u524d\u6536\u96c6\u7528\u4f8b\u7684\u6b65\u9aa4\uff1b \u589e\u52a0\u5f00\u59cb\u6267\u884c\u65f6\u6253\u5370\u4e00\u4e9b\u6267\u884c\u53c2\u6570\uff0c\u5982\uff1a \u7528\u4f8b\u6536\u96c6\u6570\u91cf: 99\n\u5931\u8d25\u91cd\u8dd1\u6b21\u6570: 1\n\u6700\u5927\u5931\u8d25\u6b21\u6570: 49\n\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4: 200.0s (03\u520620\u79d2)\n\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4: 11880s (3\u5c0f\u65f618\u52060\u79d2)\n \u5b9a\u5236\u4fee\u6539allure\u62a5\u544alogo\u3001title\u3001\u9ed8\u8ba4\u8bed\u8a00\uff1b manage.py \u6267\u884c\u5f00\u59cb\u65f6\u6253\u5370 logo \u548c\u5f53\u524d\u7248\u672c\uff1a \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u255a\u2588\u2588\u2557 \u2588\u2588\u2554\u255d \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2584\u2584 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2580\u2580\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u2584\u2588 \u2584\u2588 \u2588 \u2588 \u2588 \u2584 \u2588 \u2584 \u2580\u2580\u2588 \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\uff1b \u88c5\u9970\u5668\u65b9\u6cd5\u6307\u5b9a\u6b21\u6570\uff1b @pytest.mark.count(2)\ndef test_music_001():\npass\n \u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u6b21\u6570\uff1b python3 manage.py run -a deepin-music -k 001 --count 2\n \u200b image_utils \u589e\u52a0\u51fd\u6570 save_temporary_picture\uff0c\u652f\u6301\u6307\u5b9a\u5c4f\u5e55\u533a\u57df\u622a\u56fe\u5e76\u8fd4\u56de\u56fe\u7247\u5b58\u653e\u7684\u672c\u5730\u8def\u5f84\uff0c\u540e\u7eed\u4f7f\u7528 assert_image_exist \u8fdb\u884c\u65ad\u8a00 Python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(x, y, width, height) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) button_center \u65b0\u589e btn_size \u83b7\u53d6\u63a7\u4ef6\u5de6\u4e0a\u89d2\u5750\u6807\u53ca\u957f\u5bbd\uff0c\u7528\u4e8e\u52a8\u6001\u7684\u622a\u53d6\u5143\u7d20\u7684\u56fe\u7247\uff0c\u53ef\u7528\u4e8e\u5b9a\u4f4d\u65ad\u8a00 python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u6240\u6709\u97f3\u4e50\u6309\u94ae\")) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) allure \u62a5\u544a\u4e2d\u5b9a\u4f4d\u95ee\u9898\u9664\u4e86\u65e5\u5fd7\u3001\u622a\u56fe\u3001\u5f55\u5c4f\u5916\uff0c\u8c03\u7528\u7684\u51fd\u6570\u589e\u52a0\u4e86 step \u6b65\u9aa4\u5c55\u793a\uff1b env.sh \u65b0\u589e\u5b89\u88c5\u5b50\u9879\u76ee Python \u4e09\u65b9\u4f9d\u8d56\uff0c\u5728\u5b50\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u5199 requirement.txt \u6587\u4ef6\uff0cenv.sh \u4f1a\u81ea\u52a8\u52a0\u8f7d\uff1b ocr \u8bc6\u522b\u65b0\u589e\u652f\u6301\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\u8fdb\u884c\u6587\u5b57\u8bc6\u522b\uff0c\u51cf\u5c11\u56e0\u5168\u5c4f\u8bc6\u522b\u65f6\uff0c\u5176\u4ed6\u6587\u5b57\u7684\u5e72\u6270 Python # \u65ad\u8a00\u97f3\u4e50\u7684\u5220\u9664\u5f39\u7a97\u4e2d\uff0c\u5305\u542b\u4e86\u201c\u786e\u8ba4\u201d\u7684\u6587\u5b57 self.assert_ocr_exist(\"\u786e\u8ba4\", picture_abspath=DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u5220\u9664\u5f39\u7a97\"))) \u65ad\u8a00\u51fd\u6570\u7684\u8c03\u7528\u4e5f\u4f1a\u81ea\u52a8\u6253\u5370\u65e5\u5fd7; env.sh \u65b0\u589e\u88c1\u526a\u4f9d\u8d56\u7684\u65b9\u6848\uff1b fix \u4fee\u590d Jenkins \u73af\u5883\u4e0b\uff0c apps \u76ee\u5f55\u4e0b\u5b50\u9879\u76ee\u5b58\u5728 auotest_deepin_xxx@tmp \u76ee\u5f55\uff0c\u5728\u4f20\u5165 app_name \u540e\u65e0\u6cd5\u6267\u884c\u7528\u4f8b\u7684\u95ee\u9898\uff1b \u4fee\u590d\u81ea\u52a8\u751f\u6210 case_list.csv \u6587\u4ef6\u65f6\uff0c\u7528\u4f8b\u987a\u5e8f\u88ab\u8c03\u6574\u7684\u95ee\u9898\uff1b env.sh \u73af\u5883\u5b89\u88c5\u79fb\u9664 git \u548c curl\uff1b \u4fee\u590d\u7528\u4f8b\u5728 setup \u9636\u6bb5\u62a5\u9519\u540e\uff0c\u672a\u5199\u5165 ci_result.json \u7684\u95ee\u9898\uff1b \u79fb\u9664 uos_ci.py\uff1b "},{"location":"RELEASE/#11320221028","title":"1.1.3\uff082022/10/28\uff09","text":"new \u65b0\u589e\u56fe\u50cf\u65ad\u8a00\u6210\u529f\u8f93\u51fa\u5339\u914d\u5ea6\uff1b \u65b0\u589e\u73af\u5883\u5b89\u88c5 yaml \u4f9d\u8d56\uff1b \u65b0\u589e\u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6570\u636e\u56de\u586b\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b \u65b0\u589e\u6d4b\u8bd5\u7ed3\u679c\u8868\u60c5\u663e\u793a\uff0c\u5e76\u4f18\u5316\u4e86\u65e5\u5fd7\u7684\u6392\u7248\uff1b \u65b0\u589e --top {number} \u7528\u4e8e\u8bb0\u5f55\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0c\u65e5\u5fd7\u751f\u6210\u5230 report/logs/top.log\uff1b fix \u4fee\u590d\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4f46\u7ec8\u7aef\u6ca1\u6709\u9519\u8bef\u65e5\u5fd7\u8f93\u51fa\u7684\u95ee\u9898\uff1b \u4fee\u6539\u5931\u8d25\u7528\u4f8b\u56de\u6eaf\u65e5\u5fd7\u4e3a\u8be6\u7ec6\u7ea7\u522b\uff1b \u4fee\u590d\u4e86\u6267\u884c\u8fdb\u5ea6\u672a\u8ba1\u7b97\u8df3\u8fc7\u7528\u4f8b\u7684\u95ee\u9898\uff0c\u5e76\u4f18\u5316\u4e86\u8fdb\u5ea6\u83b7\u53d6\u7684\u7b97\u6cd5\uff1b \u4fee\u590d env.sh \u5728 V23 \u73af\u5883\u4e0b\u5b89\u88c5\u65e0\u6cd5\u8bfb\u53d6\u5bc6\u7801\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 pms \u6d4b\u8bd5\u5957\u6267\u884c\u6216\u6d4b\u8bd5\u5355\u6267\u884c\u65f6\uff0c\u7528\u4f8bID\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b env.sh \u91cc\u9762 hub.deepin.com \u66f4\u6362\u6210 it.uniontech.com\uff1b uos_ci.py \u6d4b\u8bd5\u7ed3\u679c\u7edf\u8ba1\u65f6\uff0c\u603b\u6570\u5254\u9664 skip \u7684\u6570\u91cf "},{"location":"RELEASE/#11220220921","title":"1.1.2\uff082022/09/21\uff09","text":"new \u5728\u6ca1\u6709\u5b89\u88c5 dogtail \u7684\u60c5\u51b5\u4e0b\uff0c\u4e5f\u80fd\u4f7f\u7528 sniff \u5de5\u5177\uff1b fix \u4fee\u590d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e2d\u6ca1\u6709\u5b89\u88c5 AT \u73af\u5883\u6267\u884c uos_ci.py \u62a5\u9519\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11120220919","title":"1.1.1\uff082022/09/19\uff09","text":"new \u65b0\u589e\u6267\u884c\u8fdb\u5ea6\u663e\u793a\uff0c\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u65f6\u65e5\u5fd7\u8f93\u51fa\u5f53\u524d\u8fdb\u5ea6\uff1a[\u5f53\u524d\u6307\u5b9a\u7b2c\u51e0\u6761/\u7528\u4f8b\u603b\u6570]\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u7528\u4f8b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\u6240\u6709\u5931\u8d25\u7528\u4f8b\u7684\u5217\u8868\uff1b \u5173\u95ed\u7ec8\u7aef\u8f93\u51fa\u6355\u83b7\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u65e5\u5fd7\u5feb\u7167\uff1b \u4f18\u5316\u7ec8\u7aef\u8f93\u51fa\u5931\u8d25\u4fe1\u606f\u5197\u957f\u4e3a\u7b80\u8981\u4fe1\u606f\u8f93\u51fa\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u663e\u793a 10 \u4e2a\u6267\u884c\u6700\u6162\u7684\u7528\u4f8b\u5217\u8868\uff0c\u5e76\u8be6\u7ec6\u5217\u51fa\u5404\u4e2a\u9636\u6bb5\u7684\u8017\u65f6\uff1b \u5931\u8d25\u91cd\u8dd1\u7528\u4f8b\u91cd\u8dd1\u4e4b\u524d\u5ef6\u8fdf 1 \u79d2\uff1b \u65b0\u589e\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4ecd\u7136\u5f3a\u5236\u6267\u884c\uff1b \u7528\u4f8b\u6536\u96c6\u65f6\u4ec5\u5728 apps \u76ee\u5f55\u4e0b\u8fdb\u884c\uff0c\u5ffd\u7565 src,setting,public \u76ee\u5f55\uff1b \u65b0\u589e allure \u62a5\u544a\u5907\u4efd\u529f\u80fd\uff0c\u9ed8\u8ba4\u5907\u4efd\u81f3 allure_back \u76ee\u5f55\u4e0b\uff1b manage.py\u65b0\u589e\u53c2\u6570 --lastfailed \u7528\u4e8e\u53ea\u8dd1\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\u7684\u529f\u80fd\uff1b fix \u4fee\u590d\u4e86\u5728\u6ca1\u6709\u6307\u5b9a\u5e94\u7528\u540d\u79f0\u6267\u884c\u65f6\uff0cxml \u62a5\u544a\u751f\u6210\u8def\u5f84\u5f02\u5e38\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 uos_ci.py \u4f20\u5165 timeout \u548c session_timeout \u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11020220916","title":"1.1.0\uff082022/09/16\uff09","text":"new \u65b0\u589ePMS\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u652f\u6301\u591a\u79cd\u6570\u636e\u56de\u586b\u6a21\u5f0f\uff1b \u4f18\u5316\u4e86\u901a\u8fc7\u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u65f6PMS \u722c\u866b\u7684\u6027\u80fd\uff1b \u65b0\u589e .gitmodules \u6587\u4ef6\uff0c\u7528\u4e8e\u6807\u8bb0\u6240\u6709\u5b50\u9879\u76ee\uff0c\u65b9\u4fbf\u7edf\u4e00\u62c9\u53d6\u4ee3\u7801\uff1b env.sh \u9002\u914d\u793e\u533a\u7248\u4e0a\u5b89\u88c5\u81ea\u52a8\u5316\u73af\u5883\uff1b \u589e\u52a0\u6267\u884c\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u9519\u8bef\u7684\u529f\u80fd\uff1b README.md \u589e\u52a0 Wayland \u4e0b\u4f7f\u7528\u3001\u6d4b\u8bd5\u62a5\u544a\u67e5\u770b\u3001\u5e38\u89c1\u95ee\u9898\u7b49\u7684\u6587\u6863\u8bf4\u660e\uff1b \u589e\u52a0\u4e86\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u5bf9 setup\u3001call\u3001teardown \u8fdb\u884c\u65e5\u5fd7\u5206\u6bb5\uff1b fix \u4fee\u590d\u4e86 \u786e\u8ba4\u4fee\u590d \u5217\u6ca1\u5199\u8868\u5934\uff0c\u4f46\u5199\u4e86 fixed-xxx \u6807\u7b7e\uff0c\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u540c\u4e00\u5e94\u7528\u5185\u591a\u4e2a csv \u6587\u4ef6\u4e2d \u786e\u8ba4\u4fee\u590d \u5217\u6709\u7684\u5199\u4e86\uff0c\u6709\u7684\u6ca1\u5199\uff0c\u53ef\u80fd\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 INFO \u65e5\u5fd7\uff0c\u663e\u793a\u4e3a DEBUG \u7684\u95ee\u9898\uff1b\u4fee\u590d\u4e86\u90e8\u5206\u673a\u5668\u4e0a INFO \u65e5\u5fd7\u5185\u5bb9\u663e\u793a\u4e3a\u7ea2\u8272\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\u770b\u4e0d\u5230\u8be6\u7ec6\u4fe1\u606f\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10220220822","title":"1.0.2\uff082022/08/22\uff09","text":"new \u79fb\u9664 loguru\uff0c\u66ff\u6362\u4e3a logging\uff0c\u63a5\u53e3\u4fdd\u6301\u4e0d\u53d8\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u53d7\u5f71\u54cd\uff1b \u9ed8\u8ba4\u5f00\u542f coredump\uff1b fix \u4fee\u590d\u4e86\u4e09\u65b9\u5e93 loguru \u5076\u73b0\u5f02\u5e38\uff0c\u5bfc\u81f4\u7a0b\u5e8f\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7b2c\u4e00\u6b21\u5931\u8d25\u4e0d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10120220812","title":"1.0.1\uff082022/08/12\uff09","text":"new \u65b0\u589e RELEASE.md \u6587\u4ef6\uff0c\u7528\u4e8e\u8bb0\u5f55\u5386\u53f2\u53d1\u5e03\u7248\u672c\u7684\u66f4\u65b0\u5185\u5bb9\uff1b \u517c\u5bb9 Wayland \u6a21\u5f0f\u4e0b\u6267\u884c\u7528\u4f8b\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u7528\u7ba1\u5f53\u524d\u6d4b\u8bd5\u673a\u6267\u884c\u73af\u5883\uff0c\u6846\u67b6\u4f1a\u81ea\u52a8\u6839\u636e\u5f53\u524d\u73af\u5883\u8d70\u4e0d\u540c\u7684\u4ee3\u7801\u903b\u8f91\uff1b \u7531\u4e8e\u9700\u8981\u4fee\u6539 dogtail \u6e90\u4ee3\u7801\uff0c\u56e0\u6b64\u5c06\u4fee\u6539\u540e\u7684\u6e90\u7801\u653e\u5165\u5230\u6838\u5fc3\u5e93\u91cc\u9762 src/depends/dogtail \u540e\u7eed\u7248\u672c\u5c06\u4e0d\u9700\u8981\u5728\u7cfb\u7edf\u4e2d\u5b89\u88c5dogtail\uff1b \u5982\u679c\u5e94\u7528\u5e93\u540c\u6837\u4f7f\u7528\u4e86\u7cfb\u7edf\u5b89\u88c5\u7684 dogtail \u53ef\u80fd\u4f1a\u62a5\u9519\uff0c\u89e3\u51b3\u65b9\u6848\u662f\u5c06\u4ee3\u7801\u4e2d\u7684 import dogtail \u4fee\u6539\u4e3a from src.depends import dogtail ; fix \u91cd\u8dd1\u5931\u8d25\u4e4b\u540e\u624d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff0c\u4fee\u6539\u4e3a\u5931\u8d25\u4e4b\u540e\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":"# Attribution \uff1achengdu Test Team\n# Date \uff1a2021/08/20\n \u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d \u4ed3\u5e93\u5730\u5740\uff1ahttps://gitlabcd.uniontech.com/autotest/cd-desktop-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u65b9\u6848\u6982\u8ff0","text":"\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u667a\u80fd\u8bc6\u522b\u5e94\u7528\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u7528\u4e8e\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u64cd\u4f5c\u8fc7\u7a0b\u4e2d\u7684\u5143\u7d20\u5b9a\u4f4d\u4ee5\u53ca\u5224\u65ad\u7ed3\u679c\u65f6\u7684\u65ad\u8a00\u5904\u7406\uff1b\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\uff0c\u6d4b\u8bd5\u673a\u4e0a\u7684\u753b\u9762\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u5230\u670d\u52a1\u5668\u4e0a\uff0c\u670d\u52a1\u5668\u5bf9\u89c6\u9891\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\u540e\uff0c\u670d\u52a1\u5668\u667a\u80fd\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\u6210\u529f\uff0c\u7136\u540e\u5bf9\u6d4b\u8bd5\u673a\u4e0b\u53d1\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\uff0c\u6d4b\u8bd5\u673a\u63a5\u53d7\u5e76\u6267\u884c\u4e0b\u4e00\u6b65\u64cd\u4f5c\u3002 \u670d\u52a1\u5668\u4e0e\u6d4b\u8bd5\u673a\u4e4b\u95f4\u7684\u94fe\u63a5\uff1a \u670d\u52a1\u5668\u901a\u8fc7 USB \u4e32\u53e3\u8bbe\u5907\uff08USB-HID \u534f\u8bae\uff09\u6a21\u62df\u9f20\u6807\u952e\u76d8\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u64cd\u4f5c\u3002 \u901a\u8fc7\u89c6\u9891\u91c7\u96c6\u8bbe\u5907\u6355\u83b7\u6d4b\u8bd5\u673a\u7684\u5b9e\u65f6\u753b\u9762\u4f20\u8f93\u7ed9\u670d\u52a1\u5668\u3002 \u670d\u52a1\u5668\u5bf9\u91c7\u96c6\u7684\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\uff0c\u8bc6\u522b\u5176\u4e2d\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5e76\u8fd4\u56de\u5143\u7d20\u63a7\u4ef6\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\uff0c\u670d\u52a1\u5668\u901a\u8fc7\u667a\u80fd\u5316\u5206\u6790\uff0c\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e00\u81f4\u5c06\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\u901a\u8fc7\u4e32\u53e3\u6a21\u62df\u952e\u9f20\u4fe1\u53f7\u53d1\u9001\u7ed9\u6d4b\u8bd5\u673a\uff1b\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e0d\u4e00\u81f4\u5c06\u4f1a\u8fdb\u5165\u4e2d\u65ad\u5904\u7406\u53ca\u5f02\u5e38\u7ed3\u679c\u8f93\u51fa\uff0c\u7ee7\u7eed\u6267\u884c\u540e\u7eed\u573a\u666f\uff0c\u76f4\u81f3\u6240\u6709\u7528\u4f8b\u6d4b\u8bd5\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u6df1\u5ea6\u5b66\u4e60\u73af\u5883\u642d\u5efa","text":"\u6a21\u578b\u8bad\u7ec3\u4e3b\u8981\u5bf9 GPU \u6709\u8981\u6c42\uff0c\u8bad\u7ec3\u6a21\u578b\u7684\u673a\u5668\u663e\u5b58\u4e0d\u4f4e\u4e8e 6G\uff0c\u5176\u4ed6\u914d\u7f6e\u65e0\u7279\u6b8a\u8981\u6c42\u3002 \u63a8\u8350\u6027\u4ef7\u6bd4\u8f83\u9ad8\u914d\u7f6e \u64cd\u4f5c\u7cfb\u7edf: UnionTech OS Desktop 20 Professional Linux version 4.19.0-desktop-amd64 (deepin@deepin-PC) (Uos 8.3.0.3-3+rebuild) \u5904\u7406\u5668: Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz (\u516b\u6838 / \u5341\u516d\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460M-HDV(RD)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))/8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: TU116 [GeForce GTX 1660]\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u865a\u62df\u73af\u5883\u5b89\u88c5","text":"cd ~\nwget -c https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh\nbash Miniconda3-latest-Linux-x86_64.sh\n \u4e00\u8def\u56de\u8f66 \u7b2c\u4e00\u6b21\u63d0\u793a\u8f93\u5165 yes/no \uff1a\u8f93\u5165 yes \u7ee7\u7eed\u4e00\u8def\u56de\u8f66 \u7b2c\u4e8c\u6b21\u63d0\u793a\uff1a\u8f93\u5165 no cd ~/miniconda3/bin\nsudo chmod 777 activate\n \u6fc0\u6d3bconda\u73af\u5883 . ./activate\n \u6dfb\u52a0\u516c\u53f8\u5185\u7f51\u6e90 conda config --add channels bioconda\nconda config --add channels conda-forge\n \u5982\u679c\u662f\u5916\u7f51\u6dfb\u52a0\u5916\u7f51\u6e90 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/\n \u5982\u679c\u8981\u5220\u9664\u6e90 conda config --remove-key channels\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"2\u3001\u5b89\u88c5\u4f9d\u8d56","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u521b\u5efa\u865a\u62df\u73af\u5883","text":"conda remove --name mmlab --all # \u79fb\u9664\u6240\u6709\u865a\u62df\u73af\u5883\n conda create -n mmlab python=3.7\n conda activate mmlab\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-pytorch","title":"\uff082\uff09\u5b89\u88c5 Pytorch","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install torch==1.7.0+cu101 torchvision==0.8.1+cu101 torchaudio==0.7.0 -f https://download.pytorch.org/whl/torch_stable.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-mmcv","title":"\uff083\uff09\u5b89\u88c5 MMCV","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install mmcv-full==1.3.3 -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.7.0/index.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"\uff084\uff09\u5b89\u88c5\u663e\u5361\u9a71\u52a8","text":"\u6839\u636e\u4f60\u7684\u663e\u5361\u4e0b\u8f7d\u5bf9\u5e94\u9a71\u52a8\uff0c\u6bd4\u5982\u6211\u7684\u663e\u5361\u4e3a GTX1660\uff0c\u9a71\u52a8\u7248\u672c\u4e3a 430\uff0c\u9a71\u52a8\u4e0b\u8f7d\u5730\u5740\uff1ahttps://www.nvidia.cn/Download/Find.aspx?lang=cn CTRL+ALT+F2 \u8fdb\u5165tty\n \u7981\u7528 nouveau \u9a71\u52a8 sudo vim /etc/modprobe.d/blacklist-nouveau.conf\n \u586b\u5165\uff1a blacklist nouveau options nouveau modeset=0\n \u5237\u65b0\u914d\u7f6e\u6587\u4ef6 sudo update-initramfs -u reboot \u91cd\u542f\u540e\u518d\u8fdb\u5165 tty \u5173\u95ed\u56fe\u50cf\u754c\u9762\uff0c\u8f93\u5165\u547d\u4ee4\u5173\u95ed\u56fe\u50cf\u754c\u9762 sudo service lightdm stop\n \u5b89\u88c5\u9a71\u52a8 sudo chmod a+x NVIDIA-Linux-x86_64-430.run\nsudo ./NVIDIA-Linux-x86_64-430.run\n reboot\u91cd\u542f\uff0cnvidia-smi\u67e5\u770b\u5b89\u88c5\u72b6\u6001\u3002\u6ce8\u610f\u770b\u4e0bcuda\u7248\u672c\uff0c10.1\uff0cdriver\u7248\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u6570\u636e\u6807\u6ce8","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u6570\u636e\u6807\u6ce8","text":"\u6807\u6ce8\u4e4b\u524d\u9700\u8981\u5148\u8f6c\u6362\u56fe\u7247\u5927\u5c0f\uff0c\u5e76\u4e14\u4ee5\u6570\u5b57\u547d\u540d\uff0c\u6bcf\u7ec4\u547d\u540d\u9012\u589e"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"\uff081\uff09\u8f6c\u6362\u5927\u5c0f\u5e76\u91cd\u547d\u540d","text":"rename_pic.py import os\nimport sys\nimport cv2\nimport time\nimport getpass\nusername = getpass.getuser()\nsource_path = f\"/home/{username}/Desktop/right_menu\" # \u56fe\u7247\u8def\u5f84\nsource_dest = os.path.join('/'.join(source_path.split(\"/\")[:-1]), 'tmp')\nif not os.path.exists(source_dest):\nos.mkdir(source_dest)\nstart_name = sys.argv[1]\nfile_name_list = list()\nfor file in os.listdir(source_path):\nif file.endswith('.png'):\nfile_name_list.append(file)\nstart_name = int(start_name)\nfor file in file_name_list:\nos.rename(os.path.join(source_path,file), os.path.join(source_path, f\"{str(start_name)}.png\"))\nstart_name += 1\ntime.sleep(1)\nfor file in os.listdir(source_path):\nimage = os.path.join(source_path, str(file))\nsrc = cv2.imread(image)\nresult = cv2.resize(src, (960, 540))\nresizeImage = os.path.join(source_dest, str(file))\nprint(resizeImage)\ncv2.imwrite(str(resizeImage), result)\ncv2.waitKey(0)\ncv2.destroyAllWindows()\ntime.sleep(1)\nos.system(f'rm -rf {source_path}/*')\nos.system(f'mv {source_dest}/* {source_path}')\nos.system(f'rm -rf {source_dest}')\nprint(\"\u4e0b\u4e00\u4e2a\u5e8f\u53f7\uff1a\", start_name)\n \u6839\u636e\u7ec8\u7aef\u8f93\u51fa\u7684\u4e0b\u4e00\u4e2a\u5e8f\u53f7\u7684\u63d0\u793a\uff0c\u6267\u884c Python \u6587\u4ef6\u7684\u65f6\u5019\u4f20\u53c2\u3002 python rename_pic.py 249\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"\uff082\uff09\u5de5\u5177\u6807\u6ce8","text":"\u4f7f\u7528\u5de5\u5177 labelImg \u6807\u6ce8 sudo pip3 install PyQt5==5.13\nsudo pip3 install labelImg\n \u7ec8\u7aef\u76f4\u63a5\u8f93\u5165 labelImg\uff0c\u56de\u8f66 \u6807\u6ce8\u6a21\u5f0f\u9009\u62e9\uff1aPascalVOC"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u667a\u80fd\u6807\u6ce8","text":"\u6253\u5f00\u5c4f\u5e55\u5f55\u5236\u8f6f\u4ef6\uff0c\u5f55\u5236\u624b\u52a8\u64cd\u4f5c\u4e00\u6b21\u6d4b\u8bd5\u7528\u4f8b\uff0c\u7136\u540e\u5c06\u5f55\u5236\u7684\u89c6\u9891\u8fdb\u884c\u5206\u5e27\uff0c\u7136\u540e\u5bf9\u6bd4\u524d\u4e24\u5e27\u56fe\u6807\u76f8\u4f3c\u5ea6\uff0c\u5254\u9664\u76f8\u4f3c\u5ea6\u8fc7\u9ad8\u7684\u56fe\u7247\uff0c\u5728\u4fdd\u8bc1\u7d20\u6750\u591a\u6837\u6027\u7684\u524d\u63d0\u4e0b\uff0c\u5254\u9664\u91cd\u590d\u591a\u4f59\u7684\u56fe\u7247\u751f\u6210\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u96c6\uff0c\u7136\u540e\u53d6\u51fa\u63a7\u4ef6\u6a21\u677f\u6570\u636e\u96c6\uff0c\u901a\u8fc7 OpenCV \u6a21\u677f\u5339\u914d\u83b7\u53d6\u63a7\u4ef6\u5728\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u56fe\u7247\u4e2d\u6240\u5728\u7684\u5de6\u4e0a\u3001\u5de6\u4e0b\u3001\u53f3\u4e0a\u3001\u53f3\u4e0b\u56db\u5904\u5750\u6807\uff0c\u4ece\u800c\u6839\u636e\u6a21\u677f\u6570\u636e\u96c6\u751f\u6210\u6807\u6ce8\u6570\u636e\u3002\u53c2\u8003\u76ee\u5f55 AnnotationMaterial"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"\uff081\uff09\u6a21\u677f\u6570\u636e\u96c6\u51c6\u5907","text":"1\u3001\u5728\u754c\u9762\u622a\u53d6\u9700\u8981\u6807\u6ce8\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u653e\u5728\u76ee\u5f55\u4e0b AnnotationMaterial/template/img 2\u3001\u7ef4\u62a4\u63a7\u4ef6\u540d\u4e0e\u5143\u7d20\u63a7\u4ef6\u7684\u952e\u5bf9\uff0c\u4e00\u4e2a\u63a7\u4ef6\u540d\u53ef\u5bf9\u5e94\u591a\u4e2a\u5143\u7d20\u63a7\u4ef6 menu:\n- menu.jpg\n- menu1.jpg\n- menu2.jpg\n- menu3.jpg\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"\uff082\uff09\u7d20\u6750\u96c6\u51c6\u5907","text":"\u5f55\u5236\u89c6\u9891\u6216\u6216\u5c4f\u5e55\u622a\u56fe\u653e\u7f6e\u76ee\u5f55 AnnotationMaterial/source"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u5f00\u59cb\u6807\u6ce8","text":"python3 AnnotationMaterial/main.py\n \u751f\u6210\u7684\u6807\u6ce8\u6570\u636e\u5b58\u653e\u5728 AnnotationMaterial/result"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#mmdetection","title":"\u56db\u3001MMDetection","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1-mmdetection","title":"1\u3001 MMDetection \u4ee3\u7801","text":"MMDetection \u662f\u4e00\u4e2a\u6709\u540d\u7684\u6df1\u5ea6\u5b66\u4e60\u76ee\u6807\u68c0\u6d4b\u5f00\u6e90\u9879\u76ee\uff0c\u4e5f\u662f openMMlab \u7684\u62db\u724c\u9879\u76ee\uff0c\u4e3a\u4ec0\u4e48\u9009\u62e9\u5b83\uff0c\u5c0f\u5b69\u513f\u6ca1\u5a18\u8bf4\u6765\u8bdd\u957f\uff0c\u611f\u5174\u8da3\u53ef\u4ee5\u81ea\u884c\u6df1\u5165\u4e86\u89e3\uff1b \u4f60\u53ef\u4ee5\u76f4\u63a5\u5728 GitHub \u4e0a\u514b\u9686\u4ee3\u7801\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u54b1\u4eec\u4ed3\u5e93\u4e0b Train \u76ee\u5f55\u4e2d\u4ee3\u7801\uff0cTrain \u4e2d\u7684\u4ee3\u7801\u4e5f\u662f\u4ece GitHub \u4e0a\u62c9\u53d6\u7684\uff0c\u4e0d\u8fc7\u6211\u4eec\u6839\u636e\u9879\u76ee\u9700\u8981\u505a\u4e86\u4e00\u4e9b\u4e8c\u6b21\u5f00\u53d1\uff0c\u63a8\u8350\u76f4\u63a5\u4f7f\u7528\u5b83\u3002 \u5982\u679c\u4f60\u60f3\u4ece GitHub \u4e0a\u62c9\uff1a git clone https://github.com/open-mmlab/mmdetection.git\n# \u4e0d\u80fd\u76f4\u63a5\u62c9\u53d6\u4e3b\u5206\u652f\uff0c\u5efa\u8bae\u4f7f\u75282.12\u7248\u672c\uff0c\u4e0d\u540c\u7684\u7248\u672c\u5bf9\u5e94\u7684mmcv\u7248\u672c\u662f\u4e0d\u540c\u7684\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-voc2coco","title":"2\u3001\u62c9\u53d6 voc2coco \u4ee3\u7801","text":"git clone https://github.com/Tony607/voc2coco.git\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-coco","title":"3\u3001\u8f6c\u6362 coco \u6570\u636e\u96c6","text":"\u5c06\u6240\u6709\u7684\u56fe\u7247\u548cxml\u6587\u4ef6\u653e\u5165train2017\uff0c\u4ece\u4e2d\u6311\u9009\u51e0\u7ec4\u653e\u5165val2017\uff08\u6d4b\u8bd5\u96c6\uff09 cd mmdetection/data/coco\npython voc2coco.py train2017 annotations/instances_train2017.json\npython voc2coco.py val2017 annotations/instances_val2017.json\n \u751f\u6210json\u6587\u4ef6"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4_1","title":"4\u3001\u4fee\u6539\u914d\u7f6e","text":"\uff081\uff09\u8bfb\u53d6\u6a21\u578b\u540d\u79f0 import json\nmodule_name = []\nwith open('./instances_train2017.json', \"r+\") as f:\njson_file = f.read()\njson_dict = json.loads(json_file)\nmodule_list = json_dict.get('categories')\nfor module_info in module_list:\nname = module_info.get('name')\nmodule_name.append(name)\nprint(module_name)\nprint(\"module_num:\", len(module_name))\n # \u6ce8\u610f\u5bf9\u6bd4instances_train2017.json\u91cc\u9762\u6a21\u578b\u540d\u79f0\u7684\u987a\u5e8f\uff0c\u4e0eCLASSES\u548ccoco_classes\u91cc\u9762\u7684\u987a\u5e8f\u4fdd\u6301\u4e00\u81f4\u3002\n \uff082\uff09\u4fee\u6539 faster_rcnn_r101_2x_coco.py mmdetection/xianjin/faster_rcnn_r101_2x_coco.py \u4fee\u653946\u884c\uff0cnum_clasess\u7684\u503c\uff0c\u65b0\u589e1\u4e2a\uff0c\u5c31 +1\uff1b \uff083\uff09\u4fee\u6539 coco.py mmdetection/mmdet/datasets/coco.py CLASSES = ()\uff0c\u5728\u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b \uff084\uff09\u4fee\u6539 class_names.py mmdetection/mmdet/core/evaluation/class_names.py coco_classes \u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#5","title":"5\u3001\u7f13\u5b58\u6e05\u7406","text":"\u5220\u9664 mmdetection/build \u76ee\u5f55 python setup.py install\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#6","title":"6\u3001\u8bad\u7ec3\u6a21\u578b","text":"\uff081\uff09\u6307\u5b9a\u81ea\u5df1\u914d\u7f6e\u7684\u8bad\u7ec3\u6a21\u578b\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py --gpus 1\n \uff082\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u6d4b\u8bd5\u96c6\u7ed3\u679c\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py xianjin/epoch_24.pth --show\n \uff083\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u51c6\u786e\u5ea6\uff1b python tools/analysis_tools/analyze_logs.py plot_curve xianjin/20210530_011907.log.json --keys acc\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#7","title":"7\u3001\u5feb\u6377\u64cd\u4f5c","text":"python3 run.py\n \u5c06\u4ee5\u4e0a 4 - 7 \u6b65\u64cd\u4f5c\u6574\u5408\u6210 run.py\uff0c\u4e00\u952e\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u4e94\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\uff1b \u670d\u52a1\u7aef\u4e00\u53f0\uff08\u76ee\u524d\u4ec5\u652f\u6301AMD\u67b6\u6784\uff09\uff1b \u91c7\u96c6\u76d2\u4e00\u4e2a \uff08ACASIS hdmi\u89c6\u9891\u91c7\u96c6\u5361\uff0chttps://item.jd.com/10024310742602.html \uff09\uff1b USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\uff1b USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff1b \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5USB\u5ef6\u957f\u7ebf\uff1b \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u63a8\u8350\u914d\u7f6e","text":"\u6267\u884c\u7528\u4f8b\u7684\u670d\u52a1\u7aef\u5bf9\u914d\u7f6e\u6ca1\u6709\u7279\u6b8a\u8981\u6c42\uff0c\u5982\u679c\u6761\u4ef6\u5141\u8bb8\u914d\u7f6e\u8d8a\u9ad8\uff0c\u8bc6\u522b\u901f\u5ea6\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n \u6d4b\u8bd5\u673a\u4e0a\u4e0d\u6267\u884c\u4efb\u4f55\u811a\u672c\uff0c\u5177\u4f53\u914d\u7f6e\u6839\u636e\u6d4b\u8bd5\u9700\u8981\u51b3\u5b9a\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#usb_mk","title":"\u516d\u3001USB_MK\u4e32\u53e3\u9a71\u52a8\u65b9\u6cd5","text":"\u4f4d\u4e8econtrol_method\u76ee\u5f55\u4e0b\u7684usb_mk.py\u6587\u4ef6 \uff081\uff09\u5217\u51fa\u53ef\u901a\u4fe1\u7684\u7aef\u53e3 python3 -m serial.tools.list_ports -v\n \uff082\uff09\u4fee\u6539\u4e32\u53e3\u7684\u6743\u9650 sudo chmod 777 /dev/ttyACM0\n \uff083\uff09\u5b9e\u4f8b\u5316USB_MK import UsbMk\nusb_mk = UsbMk(\"/dev/ttyACM0\", 9600) # \u8bbe\u5907\u9ed8\u8ba49600\u4e3a\u6ce2\u7279\u7387\uff0c\u63a7\u5236\u4f20\u8f93\u901f\u7387\n \uff084\uff09USB\u4e32\u53e3\u8bbe\u5907\u9ed8\u8ba4\u6ce2\u7279\u7387\u4e3a9600\uff08\u7ecf\u6d4b\u8bd5\u6ce2\u7279\u73879600\u51c6\u786e\u6027\u6700\u597d\uff09\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up() # \u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u6c49\u5b57\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e\n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff083\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff084\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff085\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() # \u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2\n \uff086\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff087\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff088\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e03\u3001\u65b9\u6cd5\u8c03\u7528\u5165\u53c2\u89c4\u5219","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_7","title":"1\u3001\u57fa\u7c7b","text":"class Base:\ndef __init__(self):\nself._obj = image\nself._usb = usb_mk\ndef find_element_by_ai(self, element):\nreturn self._obj.find_element(element)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_6","title":"2\u3001\u5165\u53c2\u8bf4\u660e","text":"\u56fe\u50cf\u8bc6\u522b\u65b9\u6cd5\u5165\u53e3\u4e3a Base \u7c7b\u4e0b\u7684 find_element_by_ai \u3002\u4ec5\u63a5\u53d7\u4e00\u4e2a\u53c2\u6570 element\uff0c\u7c7b\u578b\u4e3a string\u3002 \u53ef\u8bc6\u522b\u7684 string \u683c\u5f0f\uff1a \uff081\uff09\u5927\u56fe\u6807\uff08 \u56fe\u6807\u5927\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\uff0c\u4f8b\uff1a Base().find_element_by_ai(\"window\")\n \uff082\uff09\u5927\u56fe\u6807 / \u5c0f\u56fe\u6807\uff08\u56fe\u6807\u5c0f\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5c0f\u56fe\u6807\uff0c\u4f8b\uff1awindow/search_btn Base().find_element_by_ai(\"window/search_btn\")\n \uff083\uff09\u5927\u56fe\u6807 / OCR\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\u5185\u7684\u6587\u5b57\uff0c\u4f8b\uff1amenu/\u5c5e\u6027 Base().find_element_by_ai(\"menu/\u5c5e\u6027\")\n \uff084\uff09OCR\uff1a\u5168\u5c4f\u8bc6\u522b\u6587\u5b57 Base().find_element_by_ai(\"\u641c\u7d22\")\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516b\u3001\u9690\u85cf\u9f20\u6807","text":"\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u8fc7\u6765\u7684\u89c6\u9891\u6d41\uff0c\u5728\u8bc6\u522b\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u53d7\u5230\u9f20\u6807\u5f71\u54cd\uff0c\u56e0\u6b64\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u9690\u85cf\u9f20\u6807\u3002 \u5c4f\u853d\u9f20\u6807\u5149\u6807\u663e\u793a ```shell script /etc/lightdm/lightdm.conf \u5728`[Seat:*]`\u4e0b\u9762\u6dfb\u52a0\u53c2\u6570\n```shell script\nxserver-command=X -bs -core -nocursor\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e5d\u3001\u667a\u80fd\u81ea\u52a8\u5316\u7684\u610f\u4e49","text":"1\u3001\u6539\u5584 Acessibility \u5b9a\u4f4d\u7684\u7a33\u5b9a\u6027\u95ee\u9898 Acessibility \u5c5e\u6027\u5b9a\u4f4d\u5b58\u5728\u5076\u5c14\u5931\u6548\u7684\u60c5\u51b5 \uff081\uff09\u5f00\u53d1\u5728\u505a\u65b0\u9700\u6c42\u5f00\u53d1\u65f6\u53ef\u80fd\u6d89\u53ca\u5230\u5bf9\u5c5e\u6027\u6807\u7b7e\u7684\u4fee\u6539\u6216\u8005\u5c42\u7ea7\u7684\u8c03\u6574\uff0c\u53ef\u80fd\u9020\u6210\u81ea\u52a8\u5316\u7528\u4f8b\u65e0\u6cd5\u5b9a\u4f4d\u5230\u5143\u7d20\u3002 \u6bd4\u59821040\u9636\u6bb5\uff0c\u97f3\u4e50\u91cd\u6784\u7684\u65f6\u5019\uff0c\u5f00\u53d1\u5bf9\u90e8\u5206\u5c5e\u6027\u548c\u5c42\u7ea7\u505a\u4e86\u4fee\u6539\uff0c\u5bfc\u81f4\u81ea\u52a8\u5316\u7528\u4f8b\u5b9a\u4f4d\u65b9\u6cd580%\u9700\u8981\u4fee\u6539\u3002 \u5f00\u53d1\u65b0\u529f\u80fd\u7684\u65f6\u5019\u5076\u5c14\u4e5f\u4f1a\u5bf9\u5c5e\u6027\u505a\u8c03\u6574\uff0c\u9047\u52305\u6b21\u3002 \uff082\uff09\u76ee\u524d\u4e3b\u8981\u4f7f\u7528Dogtail\u8bc6\u522b\u5e94\u7528Acessibility\u5c5e\u6027\u8fdb\u884c\u5b9a\u4f4d\uff0c\u662f\u83b7\u53d6\u5e94\u7528\u5f53\u524d\u754c\u9762\u7684\u5c5e\u6027tree\uff0c\u5728\u5e94\u7528\u8df3\u8f6c\u540e\uff0cDogtail\u5b58\u5728\u65e0\u6cd5\u53ca\u65f6\u83b7\u53d6\u5f53\u524d\u5c5e\u6027\u5217\u8868\u7684\u60c5\u51b5\u3002 \u591a\u5a92\u4f53\u8c03\u7528\u6587\u7ba1\u7a97\u53e3\u7684\u65f6\u5019\uff0c\u51fa\u73b0\u627e\u4e0d\u5230\u6587\u7ba1\u91cc\u9762\u5143\u7d20\u7684\u60c5\u51b5\uff0c\u76ee\u524d\u51fa\u73b010+\u6b21\u3002 \u5e94\u7528\u8bbe\u7f6e\u9875\u9762\u7684\u5c5e\u6027\u5076\u5c14\u5b58\u5728\u627e\u4e0d\u5230\u7684\u60c5\u51b5\uff0c\u9047\u52305\u6b21\u3002 \uff083\uff09Dogtail\u5de5\u5177\u672c\u8eab\u5b58\u5728\u95ee\u9898\uff0c\u6709\u65f6\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u5019\u5f88\u6162\uff0c\u8ba9\u4eba\u65e0\u6cd5\u63a5\u53d7\uff0c\u76ee\u524d\u51fa\u73b0\u8fc7\u5f88\u591a\u6b21\u3002 \u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u95f4\u6bd4\u5e73\u5e38\u61623\u500d\uff0c\u51fa\u73b04\u6b21\u3002 2\u3001\u89e3\u51b3\u4e86\u4f7f\u7528\u7edd\u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898 \u90e8\u5206\u63a7\u4ef6\u65e0\u6cd5\u6dfb\u52a0 Acessibility \u5c5e\u6027\u4ece\u800c\u4f7f\u7528\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u51fa\u73b0\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898\u3002 \uff081\uff09\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u65b9\u6cd5\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u76ee\u6807\u56fe\u7247\u8d44\u6e90\uff0c\u5728 UI \u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u4f1a\u6d89\u53ca\u5230\u76ee\u6807\u8d44\u6e90\u7684\u66ff\u6362\uff0c\u6bd4\u8f83\u8017\u8d39\u4eba\u529b\u3002 \uff082\uff09\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6cd5\u5bf9\u6bd4\u7cbe\u5ea6\u6bd4\u8f83\u641e\uff0c\u5982\u679cUI \u7684\u53d8\u66f4\u4f1a\u9020\u6210\u65e0\u6cd5\u51c6\u786e\u5b9a\u4f4d\u5230\uff0c\u81ea\u52a8\u5316\u811a\u672c\u5065\u58ee\u6027\u4e0d\u8db3\u3002 3\u3001\u4f7f\u7528\u673a\u5668\u5206\u79bb\uff0c\u89e3\u51b3\u4e86\u81ea\u52a8\u5316\u811a\u672c\u5bf9\u5e94\u7528\u7684\u5f71\u54cd\uff0c\u771f\u5b9e\u8fd8\u539f\u7528\u6237\u7684\u4f7f\u7528\u573a\u666f \u673a\u5668\u5206\u79bb\u7684\u67b6\u6784\u8bbe\u8ba1\uff0c\u4fdd\u8bc1\u4e86\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u73af\u5883\u5b8c\u5168\u7b49\u540c\u4e8e\u7528\u6237\uff0c\u6392\u9664\u6d4b\u8bd5\u811a\u672c\u7684\u5f71\u54cd\u3002 \uff081\uff09\u76ee\u524d\u7684\u529f\u80fd\u81ea\u52a8\u5316\u662f\u5728\u6d4b\u8bd5\u673a\u4e0a\u76f4\u63a5\u8fd0\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\uff0c\u52a0\u4e0a\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u6211\u4eec\u6dfb\u52a0\u4e86\u4e00\u4e9b\u8fdb\u7a0b\u76d1\u63a7\u3001\u89c6\u9891\u5f55\u5236\u7b49\u529f\u80fd\uff0c\u81ea\u52a8\u5316\u811a\u672c\u672c\u8eab\u4f1a\u6d88\u8017\u4e00\u4e9b\u7cfb\u7edf\u8d44\u6e90\uff0c\u65e0\u6cd5\u8fd8\u539f\u771f\u662f\u7684\u7528\u6237\u4f7f\u7528\u573a\u666f\u3002 \uff082\uff09\u6027\u80fd\u6d4b\u8bd5\u9700\u8981\u6392\u9664\u5176\u4ed6\u7a0b\u5e8f\u7684\u8d44\u6e90\u6d88\u8017\u5f71\u54cd\uff0c\u6027\u80fd\u81ea\u52a8\u5316\u91c7\u7528\u673a\u5668\u5206\u79bb\uff0c\u4fdd\u8bc1\u4e86\u6027\u80fd\u6570\u636e\u7684\u51c6\u786e\u6027\u3002 \u4ee5\u524d\u7684\u7528\u4f8b\u6267\u884c\u8017\u65f6\u6ca1\u6761\u572830\u79d2\u5de6\u53f3\uff0c\u73b0\u5728\u7528\u4f8b\u8017\u65f6\u572810\u79d2\u3002 4\u3001\u89e3\u51b3\u4e86UI \u8c03\u6574\u5bfc\u81f4\u5b9a\u4f4d\u5931\u8d25\u7684\u4e0d\u7a33\u5b9a\u6027\u95ee\u9898 \uff081\uff09\u89e3\u51b3\u4e86\u56e0 UI \u8c03\u6574\u5bfc\u81f4\u63a7\u4ef6\u4f4d\u7f6e\u53d8\u5316\u6216\u8272\u5dee\u53d8\u5316\u540e\u5b9a\u4f4d\u4e0d\u51c6\u786e\u7684\u95ee\u9898\uff0c\u53ea\u8981\u63a7\u4ef6\u6587\u6848\u548c\u63a7\u4ef6\u5916\u8fb9\u6846\u65e0\u53d8\u5316\u5747\u53ef\u51c6\u786e\u5b9a\u4f4d\uff1b \uff082\uff09\u76ee\u524d\u4e5f\u4f1a\u91c7\u7528\u57fa\u4e8eUI\u7684\u5b9a\u4f4d\u65b9\u6848\uff0c\u5982\u679cUI\u4f4d\u7f6e\u6709\u8c03\u6574\uff0c\u4f1a\u5bfc\u81f4\u5143\u7d20\u65e0\u6cd5\u5b9a\u4f4d\u3002 5\u3001\u7b80\u5316\u4e86\u7528\u4f8b\u7ed3\u6784\uff0c\u63d0\u5347\u7f16\u5199\u53cb\u597d\u5ea6 \uff081\uff09\u667a\u80fd\u81ea\u52a8\u5316\u8bc6\u522b\u5143\u7d20\u7684\u65b9\u6cd5\u53ea\u6709\u4e00\u4e2a\uff0c\u5c31\u662f\u57fa\u4e8e\u6211\u4eec\u8bad\u7ec3\u7684\u6a21\u578b\u8bc6\u522b\u89c6\u9891\u6d41\u4e2d\u7684\u5143\u7d20\uff0c\u7ecf\u8fc7\u811a\u672c\u5c01\u88c5\u4e4b\u540e\uff0c\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u4e2d\u6240\u6709\u5b9a\u4f4d\u7684\u64cd\u4f5c\u90fd\u53ea\u9700\u8981\u8c03\u7528\u8fd9\u4e00\u4e2a\u65b9\u6cd5\u5c31\u884c\u4e86\uff0c\u7f16\u5199\u81ea\u52a8\u5316\u811a\u672c\u7684\u96be\u5ea6\u5927\u5927\u964d\u4f4e\u3002 \uff082\uff09\u4e5f\u662f\u7531\u4e8e\u8c03\u7528\u65b9\u6cd5\u7b80\u5355\uff0c\u5728 UI \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u4e2d\u7684\u5206\u5c42\u7ed3\u6784\u5c06\u4f1a\u51cf\u5c11\uff0c\u591a\u7ee7\u627f\u7684\u60c5\u51b5\u4f1a\u51cf\u5c11\uff0c\u81ea\u52a8\u5316\u4ee3\u7801\u7684\u8c03\u7528\u7ed3\u6784\u4e5f\u4f1a\u53d8\u5f97\u7b80\u5355\uff0c\u800c\u4e14\u529f\u80fd\u6d4b\u8bd5\u540c\u5b66\u7f16\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u66f4\u52a0\u5bb9\u6613\u4e0a\u624b\u3002 \u4ee5\u524d\u5199\u7528\u4f8b\u7531\u4e8e\u9700\u8981\u7ed3\u5408\u4e0d\u540c\u7684\u6a21\u5757\uff0c\u8c03\u7528\u4e0d\u540c\u7684\u65b9\u6cd5\uff0c\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u5e76\u5b8c\u6210\u8c03\u8bd5\u7684\u65f6\u95f4\u5e73\u5747\u572820-30\u5206\u949f\uff0c\u73b0\u5728\u5199\u7528\u4f8b\u811a\u672c\u80fd\u57285\u5206\u949f\u5de6\u53f3\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":"# =============================================\n# Attribution : Application Test Department III\n# Time : 2023/1/3\n# Author : ut003281\n# =============================================\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u7b80\u8ff0","text":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5 \u901a\u8fc7\u81ea\u52a8\u5316\u624b\u6bb5\u5bf9\u5e94\u7528\u8fdb\u884c\u6027\u80fd\u6d4b\u8bd5\uff0c\u63d0\u4f9b\u65b9\u4fbf\u7684\u73af\u5883\u90e8\u7f72\u3001\u8fd0\u884c\u914d\u7f6e\u3001\u7528\u4f8b\u7f16\u5199\u7b49\uff0c\u7528\u4e8e\u684c\u9762\u5e94\u7528\u7684\u51b7\u70ed\u542f\u52a8\u3001\u8d44\u6e90\u62f7\u8d1d\u3001\u9875\u9762\u8df3\u8f6c\u7b49\u6027\u80fd\u573a\u666f\u6d4b\u8bd5\u3002 \u4ed3\u5e93\u5730\u5740\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-perf-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u4ee3\u7801\u7ed3\u6784","text":"autotest-perf-aitest\n\u251c\u2500\u2500 apps # \u5b58\u653e\u6240\u6709\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u811a\u672c\n\u251c\u2500\u2500 conftest.py # pytest hook\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 CURRENT # \u7248\u672c\u5185\u5bb9\n\u251c\u2500\u2500 docs # \u6587\u6863\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u952e\u503c\u5bf9\u7167\u8868.pdf # \u4e32\u53e3\u7ebfcode\u4e0e\u6309\u952e\u7684\u5bf9\u7167\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u6027\u80fd\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\u6267\u884c\u5668\u4f7f\u7528\u6307\u5357.md # \u6267\u884c\u5668\u811a\u672c\u4f7f\u7528\u6307\u5357\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 USB\u4e32\u53e3\u8f6cUSB\u952e\u76d8\u9f20\u6807\u7ebf\u534f\u8bae\u6587\u4ef6V1.0.pdf # \u4e32\u53e3\u534f\u8bae\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput-0.28.2.zip # Linux\u4e0b\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\u7684\u6e90\u7801\uff0c\u53ef\u6839\u636e\u67b6\u6784\u6253\u5305\n\u251c\u2500\u2500 manage.py # \u529f\u80fd\u4e3b\u5165\u53e3\n\u251c\u2500\u2500 pytest.ini # pytst \u914d\u7f6e\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 setting # \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 client.ini # \u6d4b\u8bd5\u673a IP \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5168\u5c40\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dev_env.sh # \u5bbf\u4e3b\u673a\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose_no_relay.yml # \u65e0\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose.yml # \u6709\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker_login.sh # docker \u767b\u9646\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 res\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 black.png # \u5168\u9ed1\u56fe\u7247\uff0c\u7528\u4e8e\u4fee\u6539\u58c1\u7eb8\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_5000.deb # 3A5000 \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_amd64.deb # amd \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_arm64.deb # arm \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_mips64.deb # mips \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_sw_64.deb # sw \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 server.ini # \u670d\u52a1\u5668\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 setup.sh # \u5bb9\u5668\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 template # \u521b\u5efa app \u57fa\u7840\u811a\u672c\u6a21\u677f\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 app_template\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ${app_name}_widget.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 control-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 images\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 test_${app_name}_01_scene.json-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 test_${app_name}_01_scene.py-tpl\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 uos_docker # \u5bb9\u5668\u73af\u5883\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dockerfile\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 requirements.txt\n\u2514\u2500\u2500 src\n \u251c\u2500\u2500 analysis_save.py # \u89e3\u6790\u56fe\u7247\u6d41\u7ed3\u679c\uff0c\u6c47\u603b\u751f\u6210 excel \u62a5\u544a\n\u251c\u2500\u2500 base_widget.py # \u5c01\u88c5\u7684\u57fa\u7840\u64cd\u4f5c\uff0c\u5e94\u7528\u8c03\u7528\u7684\u4e3b\u5165\u53e3\u65b9\u6cd5\n\u251c\u2500\u2500 cmdctl.py # \u8c03\u7528\u547d\u4ee4\u884c\u4f7f\u7528\n\u251c\u2500\u2500 global_value.py # \u5168\u5c40\u53d8\u91cf\n\u251c\u2500\u2500 image_utils.py # \u56fe\u7247\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 __init__.py\n \u251c\u2500\u2500 logger_utils.py # \u65e5\u5fd7\u914d\u7f6e\n\u251c\u2500\u2500 pdocr.py # ocr \u914d\u7f6e\n\u251c\u2500\u2500 public_method.py # \u4e00\u4e9b\u65b9\u4fbf\u7684\u5c01\u4f4f\n\u251c\u2500\u2500 record.py # \u5f55\u5c4f\u76f8\u5173\n\u251c\u2500\u2500 rtk # \u8fd0\u884c\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 _base.py # \u4e00\u4e9b\u679a\u4e3e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 install_env.py # \u5b89\u88c5\u73af\u5883\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 local_runner.py # \u8fd0\u884c\u7528\u4f8b\n\u251c\u2500\u2500 serial_communication # \u4e32\u53e3\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 power_control.py # \u7ee7\u7535\u5668\u64cd\u4f5c\uff0c\u4f7f\u7528\u7ee7\u7535\u5668\u8fde\u63a5\u4e3b\u673a\u7535\u6e90\uff0c\u63a7\u5236\u5f00\u5173\u673a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 serial_common.py # \u4e32\u53e3\u516c\u5171\u65b9\u6cd5\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 usb_mk.py # \u952e\u9f20\u64cd\u4f5c\u57fa\u7840\u5c01\u88c5\n\u251c\u2500\u2500 shortcut_key.py # \u5feb\u6377\u952e\u7684\u5c01\u88c5\n\u251c\u2500\u2500 singleton.py # \u5355\u4f8b\u6a21\u5f0f\n\u251c\u2500\u2500 start_app.py # \u521b\u5efa app\n\u2514\u2500\u2500 write_xlsx.py # \u751f\u6210 excel\n# __init__.py \u6587\u4ef6\u4e3a\u6807\u8bc6\u8be5\u76ee\u5f55\u662f\u4e00\u4e2aPython\u7684\u6a21\u5757\u5305\uff0c\u9879\u76ee\u4e2d\u7684__init__.py\u5747\u4e3a\u7a7a\u6587\u4ef6\u3002\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u73af\u5883\u642d\u5efa","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\u3002 \u670d\u52a1\u7aef\u4e00\u53f0\u3002\uff08\u4ec5\u652f\u6301 AMD \u67b6\u6784\uff0c\u82e5\u9700\u5176\u4ed6\u67b6\u6784\uff0c\u54a8\u8be2\u76f8\u5173\u5f00\u53d1\u4eba\u5458\uff09 \u91c7\u96c6\u76d2\u4e00\u4e2a\u3002 \uff08ACASIS HDMI \u89c6\u9891\u91c7\u96c6\u76d2\uff0chttps://item.jd.com/100013302599.html#crumb-wrap \uff09 USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\u3002\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"\uff082\uff09\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\u3002 USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff08USB3.0 \u63a5\u53e3\u4e0a\uff09\u3002 \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5 USB \u5ef6\u957f\u7ebf\u3002 \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u670d\u52a1\u7aef\u63a8\u8350\u914d\u7f6e","text":"\u914d\u7f6e\u8d8a\u9ad8\uff0c\u89e3\u6790\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"2\u3001\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa","text":" \u6253\u5f00\u63a7\u5236\u4e2d\u5fc3\uff0c\u8d26\u6237\u8bbe\u7f6e\u4e3a\u3010\u81ea\u52a8\u767b\u5f55\u3011\u548c\u3010\u65e0\u5bc6\u7801\u767b\u5f55\u3011\uff0c\u7535\u6e90\u7ba1\u7406\u4e2d\u4f7f\u7528\u7535\u6e90\u5168\u90e8\u8bbe\u7f6e\u4e3a\u3010\u4ece\u4e0d\u3011\uff0c\u5f00\u542f\u5f00\u53d1\u8005\u6a21\u5f0f\u3002 \u6839\u636e\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u8981\u6c42\uff0c\u5bfc\u5165\u76f8\u5173\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\uff1a\u5bfc\u5165\u76f8\u518c\u3001\u5f71\u9662\u3001\u97f3\u4e50\u7684\u6d4b\u8bd5\u8d44\u6e90\u3002 \u5728\u670d\u52a1\u7aef\u6253\u5f00\u76f8\u673a\u5e94\u7528\u540e\uff0c\u5c06\u6d4b\u8bd5\u673a\u684c\u9762\u58c1\u7eb8\u66f4\u6362\u4e3a\u7eaf\u8272\u58c1\u7eb8\uff08\u6ce8\u610f\uff0c\u670d\u52a1\u7aef\u9700\u63d0\u524d\u5f00\u542f\u76f8\u673a\u540e\u518d\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u58c1\u7eb8\uff0c\u5efa\u8bae\u7eaf\u9ed1\u58c1\u7eb8 setting/res/black.png\uff09 \u5728\u6587\u4ef6\u7ba1\u7406\u5668\u4e2d\uff0c\u5c06\u9009\u9879 \u4e3b\u83dc\u5355-\u8bbe\u7f6e-\u9884\u89c8-\u56fe\u7247\u9884\u89c8 \u53d6\u6d88\u52fe\u9009\uff08\u5982\u4e0d\u53d6\u6d88\uff0c\u4f1a\u5f71\u54cd\u622a\u56fe\u5f55\u5c4f\u5e94\u7528\u7684\u6027\u80fd\u6570\u636e\uff09 \u79fb\u52a8\u6216\u5220\u9664\u7cfb\u7edf Logo \uff0c\u6392\u9664\u684c\u9762\u53f3\u4e0b\u89d2 Logo \u7684\u5f71\u54cd\uff08\u91cd\u542f\u751f\u6548\uff09\u3002 sudo mv /usr/share/deepin/uos_logo.svg ~/Pictures/\n \u5b89\u88c5\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\uff08\u5fc5\u987b\u5b89\u88c5\uff01\uff01\uff09 AMD \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_amd64.deb ARM \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_arm64.deb MIPS \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_mips64.deb 3A5000 \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_5000.deb \u5b89\u88c5\u547d\u4ee4 sudo dkpg -i xserver-xorg-input-libinput_0.28.2-2_amd64.deb\n \u5b89\u88c5\u65f6\u4f1a\u63d0\u793a\u5df2\u5b58\u5728\u76f8\u540c\u7248\u672c\uff0c\u8bf7\u5ffd\u7565\uff0c\u76f4\u63a5\u8986\u76d6\u5b89\u88c5\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u4e3b\u673a\u624d\u751f\u6548"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u670d\u52a1\u7aef\u4e00\u952e\u73af\u5883\u90e8\u7f72","text":"\u73af\u5883\u642d\u5efa\u524d\u5fc5\u987b\u5148\u8fde\u63a5\u4e0a USB \u4e32\u53e3\u7ebf\u548c\u91c7\u96c6\u76d2\u3002 \u5bbf\u4e3b\u673a\u73af\u5883\u5b89\u88c5 python3 manage.py install --env host\n \u5bb9\u5668\u73af\u5883\u5b89\u88c5 python3 manage.py install --env docker\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u56db\u3001\u914d\u7f6e\u9879","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u670d\u52a1\u7aef\u914d\u7f6e","text":"setting/config/server.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u914d\u7f6e\u9879\uff0c\u5305\u542b\u4e86\u6240\u6709\u670d\u52a1\u7aef\u6240\u6709\u7684\u53ef\u914d\u7f6e\u9879\u3002 \u672c\u5730\u65e0\u7f51\u7edc\u8fd0\u884c \u5c06\u914d\u7f6e\u9879 network=0 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u672c\u5730\u6709\u7f51\u7edc\u8fd0\u884c \u914d\u7f6e\u9879 network=1 (1)\u914d\u7f6e\u9879 client_alias= \u914d\u7f6e\u4e3a\u4f60\u8981\u6d4b\u8bd5\u7684\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5982 Alias1 \u6d4b\u8bd5\u673a\u522b\u540d\u5728 setting/config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 (2)\u914d\u7f6e\u9879 client_alias= \u4e3a\u7a7a\uff0c\u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager --client_alias Alias1\uff0c\u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002(Alias1 \u4e3a\u4f60\u914d\u7f6e\u7684\u6d4b\u8bd5\u673a\u522b\u540d) (1)\u548c(2)\u53ea\u8981\u4f7f\u7528\u5176\u4e00\u5373\u53ef\u3002 \u6709\u7f51\u7edc\u8fd0\u884c\uff0c\u4e14\u9700\u8981\u901a\u8fc7 Jenkins \u4e0a\u8fd0\u884c\u4e00\u4e2a job \uff0c\u540c\u65f6\u63a7\u5236\u591a\u53f0\u673a\u5668\u3002 \u914d\u7f6e\u9879 network=1 \u914d\u7f6e\u9879 client_alias= \u4e0d\u7528\u914d\u7f6e\uff0c\u5728\u8fd0\u884c run.sh \u7684\u65f6\u5019\u76f4\u63a5\u7a7a\u683c\u52a0\u522b\u540d\u5373\u53ef\uff0c\u6bd4\u5982\uff1a\u6d4b\u8bd5\u673a\u522b\u540d\u4e3a Alias1 \uff0c\u4e14\u5df2\u7ecf\u5728 config/client.ini \u4e2d\u914d\u7f6e\u4e86 Alias1 \u7684user ip password \uff0c\u5219\u8fd0\u884c bash run.sh Alias1 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u5728 Jenkins pipeline \u91cc\u9762\u901a\u8fc7\u5e76\u884c stage \u6216\u5e76\u884c\u8c03\u7528\u4e0b\u5c42\u4efb\u52a1\u7684\u65b9\u5f0f\u53ef\u4ee5\u5b9e\u73b0\u5927\u89c4\u6a21\u7684\u6027\u80fd\u6d4b\u8bd5\u9700\u6c42\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;1\u3001KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2\u3001KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f, e.g. TAGS = L1 or smoke\n[case_conf]\n# \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\uff0cocr\u6587\u6848\u8bc6\u522b\u8f83\u6162\uff0c\u4e0d\u63a8\u8350\u4f7f\u7528\nfind_by = stage\n# \u6700\u540e\u4e00\u4e2a\u7a33\u5b9a\u9636\u6bb5\u7684\u5e27\u6570\u8bc6\u522b\n# \u9996\u5e27\u5b58\u5728\u540e\u7684\u7b2c\u4e00\u4e2a\u5927\u4e8e\u8be5\u914d\u7f6e\u5e27\u6570\u7684\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u5c3e\u5e27\nfinal_stable_num=100\n# \u4ece\u8be5\u5e27\u6570\u5f00\u59cb\u8bc6\u522b\u6587\u6848\u6216\u56fe\u7247\uff0c\u51cf\u5c11\u5206\u6790\u65f6\u95f4\nstart_num = 150\n# \u8bc6\u522b\u7684\u6587\u6848\ntext=\n# \u8bc6\u522b\u56fe\u7247\nmatch=apps/xxx/images/match.png\n# \u8bc6\u522b\u76f8\u4f3c\u5ea6\nmatch_rate=0.9\n# \u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6bd4\u5982\u70ed\u542f\u52a8\u7528\u4f8b\uff0c\u4ece\u70b9\u51fb\u6253\u5f00\u5230\u505c\u6b62\u5f55\u5c4f\uff0c\u4e2d\u95f4\u7b49\u5f855\u79d2\uff1b\nduration = 15\n# \u5355\u6761\u7528\u4f8b\u6267\u884c\u7684\u6b21\u6570\ncount = 5\n# \u7a33\u5b9a\u9636\u6bb5\u5212\u5206\u7684\u76f8\u4f3c\u5ea6\nstable_similarity = 0.9997\n[server]\n# \u8c03\u8bd5\u6a21\u5f0f=1\uff0c\u4e3a\u5f00\u542f\u8c03\u8bd5\u6a21\u5f0f\uff0c0\u4e3a\u5173\u95ed\u3002\n# \u8c03\u8bd5\u6a21\u5f0f\u4e0b\u9ed8\u8ba4\u53ea\u6267\u884c\u4e00\u6b21\u7528\u4f8b\uff0c\u4e0d\u5173\u673a\n# \u7f16\u5199\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u5efa\u8bae\u5f00\u542fmaintain\u3002\nMAINTAIN = 0\n# \u8fd0\u884c\u7684\u73af\u5883docker\u5bb9\u5668\u73af\u5883\uff0chost\u5bbf\u4e3b\u673a\u73af\u5883\nENV = docker\n# \u670d\u52a1\u7aef\u5bc6\u7801\nPASSWORD=1\n# \u6307\u5b9a\u6d4b\u8bd5\u673a\u522b\u540d\n# \u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6bd4\u5982\uff1a\n# [AMD]\n# ip=10.8.15.86\n# user=uos\n# \u5176\u4e2d AMD \u4e3a\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5219client_alias=AMD\nCLIENT_ALIAS = x86\uff08Intel-i7\uff09\n# 1 \u5f00\u542f\u7f51\u7edc, 0 \u5173\u95ed\u7f51\u7edc\n# \uff081\uff09\u670d\u52a1\u7aef\u4e0e\u6d4b\u8bd5\u673a\u987b\u5728\u540c\u4e00\u7f51\u6bb5\u4e0b\uff0c\u4f60\u53ef\u4ee5\u5c1d\u8bd5\u5728\u670d\u52a1\u7aef\u901a\u8fc7ssh\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c\u5982\u679c\u53ef\u4ee5\u8fde\u63a5\uff0c\u8bf4\u660e\u7f51\u7edc\u6b63\u5e38\u3002\n# \uff082\uff09\u5f53input_type=FILE_NAME \u65f6\uff0c\u5fc5\u987b\u5f00\u542f\u7f51\u7edc\u3002\nNETWORK = 1\n# \u6027\u80fd\u7ed3\u679c\u7edf\u8ba1\u5355\u4f4d \u6beb\u79d2\u2014ms, \u79d2\u2014s\nUNIT=ms\n# \u6d4b\u8bd5\u673a\u5f00\u673a\u8fdb\u5165\u684c\u9762\u540e\u7b49\u5f85\u65f6\u95f4,\u5355\u4f4d/\u79d2\nSTARTUP_DELAY = 60\n# 1\u4e3a\u5220\u9664\u7f13\u5b58\uff0c0\u4e3a\u4e0d\u5220\u9664\u7f13\u5b58\n# \u7528\u4f8b\u6267\u884c\u5b8c\u540e\u4f1a\u5728report\u76ee\u5f55\u4e0b\u751f\u6210\u667a\u80fd\u89e3\u6790\u7684\u4e00\u4e9b\u7f13\u5b58\u56fe\u7247\u3002\nCACHE = 0\n# \u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u62a5\u544a\u4f1a\u4fdd\u5b58\u5728\u9879\u76ee\u4e0breport\u76ee\u5f55\u4e2d\uff1b\n# \u6307\u5b9a\u62a5\u544a\u76ee\u5f55\u5219\u5b58\u653e\u5230\u6307\u5b9a\u76ee\u5f55\u3002\nREPORT_PATH = report\n# \u670d\u52a1\u7aef\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684icon\u8d44\u6e90\u4f1a\u7f13\u5b58\u5728\u9879\u76ee\u4e0binput\u76ee\u5f55\u4e2d\nINPUT = input/\n# 1\u4e3a\u6d4b\u8bd5\u5b8c\u5173\u673a\uff0c0\u4e3a\u6d4b\u8bd5\u5b8c\u4e0d\u5173\u673a\nSHUTDOWN = 0\n# \u89e3\u6790\u8fdb\u7a0b\u6570\uff08\u4e0d\u63a8\u8350\u4fee\u6539\uff09\n# 3\u4e2a\u8fdb\u7a0b\u89e3\u6790\u89c6\u9891\u5df2\u7ecf\u80fd\u591f\u6ee1\u8db3\uff0c\u5373\u4f7f\u589e\u52a0\u8fdb\u7a0b\u6570\u4e5f\u4e0d\u80fd\u51cf\u5c11\u6574\u4f53\u8017\u65f6\n# \u53e6\u5916\u8fd8\u8981\u770bCPU\u6838\u6570\u662f\u5426\u652f\u6301\u3002\nPARSING_PROCESS = 3\n# 1\u4e3a\u4f7f\u7528\u7ee7\u7535\u5668\u5f00\u5173\u673a\uff0c0\u4e3a\u4f7f\u7528reboot\u547d\u4ee4\u91cd\u542f\u3002\u4f9d\u8d56\u7ee7\u7535\u5668\u786c\u4ef6\u8bbe\u5907\uff0c\u9700\u8981\u4f7f\u7528\u8054\u7cfb\u5f00\u53d1\u8005\nRELAY = 0\n# \u83b7\u53d6\u6d4b\u8bd5\u5e94\u7528\u7684\u7248\u672c, %s \u5360\u4f4d\u5e94\u7528\u540d\n# \u5982\u679c\u8be5\u914d\u7f6e\u4e3a\u7a7a\uff0c\u5219\u4e0d\u83b7\u53d6\u5e94\u7528\u7684\u7248\u672c\u4fe1\u606f\u3002\nCOMMAND = apt policy %s 2>/dev/null|grep \"\u5df2\u5b89\u88c5\"|awk -F \"\uff1a\" \"{print \\$2}\"\n# \u5173\u673a\u7b49\u5f85\u5f00\u542f\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6839\u636e\u6d4b\u8bd5\u673a\u6027\u80fd\u4e0d\u540c\uff0c\u5f00\u5173\u673a\u8017\u65f6\u53ef\u80fd\u4e0d\u540c\uff0c\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u673a\u60c5\u51b5\u914d\u7f6e\u3002\nSHUTDOWN_DELAY = 30\n# \u53ef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u56fe\u7247\u683c\u5f0f\uff0c\u4ee5\u82f1\u6587\u9017\u53f7\u9694\u5f00\u3002\n# \u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u76ee\u524d\u6211\u4eec\u4ec5\u9a8c\u8bc1\u4e86jpg,jpeg,png\u8fd9\u4e09\u79cd\u5e38\u7528\u7684\u56fe\u7247\u683c\u5f0f\u3002\nINPUT_TYPES = jpg,jpeg,png\n# \u6027\u80fd\u5206\u6790\u8865\u5e27\uff0c\u7b49\u4e8e\u6216\u4f4e\u4e8e\u8be5\u503c\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u9700\u8981\u51cf\u6389\u3002\nUN_STAB_START = 3\n# \u670d\u52a1\u7aef\u83b7\u53d6\u6d4b\u8bd5\u673a\u56fe\u50cf\u7684\u5e27\u7387\uff0c\u5373\u6bcf\u79d2\u83b7\u53d6\u591a\u5c11\u5f20\u6d4b\u8bd5\u673a\u4e0a\u7684\u56fe\u50cf\u3002\n# \u9ed8\u8ba4\u5e27\u7387\u4e3a30\u5e27/\u79d2\uff0c\u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u53ef\u80fd\u4f1a\u5bf9\u89e3\u6790\u7ed3\u679c\u9020\u6210\u504f\u5dee\u3002\nFPS = 30\n# \u4ee5\u4e0b\u573a\u666f\u7c7b\u578b\u4f1a\u91cd\u542f\u6d4b\u8bd5\u673a,\u591a\u79cd\u573a\u666f\u4f7f\u7528\u9017\u53f7\u9694\u5f00\nSCENE = cold\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = http://10.8.13.78:8890\n#\u5c4f\u5e55\u56fe\u7247\u4e34\u65f6\u5b58\u653e\u4f4d\u7f6e\nSCREEN_CACHE = /tmp/screen\n# =======================================\n[log]\n# \u65e5\u5fd7\u7ea7\u522b\uff0cOFF\u3001FATAL\u3001ERROR\u3001WARN\u3001INFO\u3001DEBUG\u3001ALL\n# \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u65e5\u5fd7\u8f93\u51fa\uff0clog_cli=INFO\u8868\u793a \u4ec5\u8f93\u51faINFO\u53ca\u4ee5\u4e0a\u7ea7\u522b\u7684\u65e5\u5fd7\u3002\nLOG_LEVEL = DEBUG\n# \u65e5\u5fd7\u6587\u4ef6\u4fdd\u5b58\u8def\u5f84\nLOG_PATH= logs\n# =======================================\n[dockerhub]\n# \u5bb9\u5668\u767b\u9646\u8d26\u53f7\nDOCKER_USER = user\n# \u5bb9\u5668\u767b\u9646\u5bc6\u7801\nDOCKER_PASSWORD = User1234\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u6d4b\u8bd5\u673a\u914d\u7f6e","text":"setting/config/client.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u4fe1\u606f\u3002 \u6709\u7f51\u7edc\u7684\u60c5\u51b5\u4e0b\uff0c\u670d\u52a1\u7aef\u9700\u8981\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u56e0\u6b64\u4f60\u9700\u8981\u5199\u5165 \u6d4b\u8bd5\u673a\u522b\u540d \u3001 user \u3001ip\u3001 password \u3002 # \u6d4b\u8bd5\u673a\u522b\u540d\n[Alias1] # \u6d4b\u8bd5\u673aip\nip=10.8.15.86 # \u6d4b\u8bd5\u673a\u7528\u6237\u540d\nuser=uos\n \u547d\u540d\u5efa\u8bae\uff1aAliasA1\u3001AliasA2\u3001AliasB1\u3001AliasB2\uff0c\u4e0d\u8981\u91cd\u540d\u3002 \u65e0\u7f51\u7edc\u60c5\u51b5\u4e0b\uff0c\u4ec5\u9700\u8981\u5173\u6ce8\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\u9879 width=\u3001 height= \u5373\u53ef\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a [client]\n# \u9ed8\u8ba4\u6d4b\u8bd5\u673a\u7528\u6237\u540d\uff0c\u5bc6\u7801\uff0cip\nip=\nuser=\n# \u6d4b\u8bd5\u673a\u5bc6\u7801\npassword=1\n# \u6d4b\u8bd5\u673a\u4e3b\u9898\ntheme=bloom\n# \u6d4b\u8bd5\u673aicon\u76ee\u5f55\npath=/usr/share/icons\n# \u7cfb\u7edfdesktop\u6587\u4ef6\u7684\u5b58\u653e\u76ee\u5f55\uff0cUOS\u7cfb\u7edf\u9ed8\u8ba4\u4e3a/usr/share/applications\ndesktop_path=/usr/share/applications\n# \u7528\u4e8e\u5224\u65ad\u6d4b\u8bd5\u673a\u662f\u5426\u5f00\u673a\u8fdb\u5165\u684c\u9762\u7684\u8bc6\u522b\u6807\u8bc6\u3002\n# 1\u3001\u901a\u8fc7\u684c\u9762\u56fe\u6807\u8bc6\u522b\u3002\n# - type=FILE_NAME\u65f6\uff0c\u670d\u52a1\u5668\u548c\u6d4b\u8bd5\u673a\u5fc5\u987b\u5728\u540c\u4e00\u5c40\u57df\u7f51\u5185\u3002\n# - power_on=dde-computer\u8868\u793a\u901a\u8fc7\u684c\u9762\u8ba1\u7b97\u673a\u56fe\u6807\u5224\u65ad\u5f00\u673a\u8fdb\u5165\u684c\u9762\u3002\n# 2\u3001\u901a\u8fc7\u672c\u5730\u56fe\u7247\u4f5c\u4e3a\u5f00\u673a\u8bc6\u522b\u3002\n# - type= \u4f20\u5165\u4e3a\u56fe\u7247\u683c\u5f0f\uff0ctype\u652f\u6301\u7684\u7c7b\u578b\u5305\u542b\u5728server.ini\u5185\u914d\u7f6e\u9879input_type=jpg,jpeg,png\u3002\n# - power_on= \u4f20\u5165\u7684\u662f\u672c\u5730\u56fe\u7247\u7684\u8def\u5f84\u3002\ntype=FILE_NAME\npower_on=dde-computer\n# \u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\uff08\u6d4b\u8bd5\u673a\u8fde\u63a5\u91c7\u96c6\u76d2\uff0c\u91c7\u96c6\u76d2\u7684\u5206\u8fa8\u7387\uff09\nheight=1080\nwidth=1920\n[AliasA1] ip=10.8.15.86\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n[AliasA2]\nip=10.8.15.20\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_2","title":"3\u3001\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e","text":"\u968f\u7740\u6d4b\u8bd5\u573a\u666f\u7684\u4e0d\u65ad\u5f15\u5165\uff0c\u53d1\u73b0\u73b0\u6709\u670d\u52a1\u7aef\u91cc\u7684\u914d\u7f6e\u9879\u5e76\u4e0d\u9002\u7528\u4e8e\u6240\u6709\u7684\u6027\u80fd\u573a\u666f\uff0c\u4e8e\u662f\u5c06\u670d\u52a1\u7aef\u914d\u7f6e\u8fdb\u884c\u4e00\u4e2a\u63d0\u53d6\uff0c\u53ef\u505a\u5355\u4e2a\u573a\u666f\u7684\u4e2a\u6027\u5316\u914d\u7f6e\uff0c\u5f53\u7136\u539f\u6765\u7684\u670d\u52a1\u7aef\u914d\u7f6e\u529f\u80fd\u4fdd\u7559\uff0c\u53ea\u662f\u5f53\u4f60\u914d\u7f6e\u4e86\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e\u540e\uff0c\u4f18\u5148\u4f7f\u7528\u4e2a\u6027\u5316\u914d\u7f6e\u91cc\u9762\u7684\u5185\u5bb9\uff0c\u4ee5\u4e0b\u662f\u5bf9\u4e2a\u6027\u5316\u914d\u7f6e\u7684\u4ecb\u7ecd\u3002 \u76ee\u524d\u6bcf\u4e00\u4e2a py \u6587\u4ef6\u5bf9\u5e94\u4e00\u4e2a\u6027\u80fd\u6d4b\u8bd5\u573a\u666f\uff0c\u4e8e\u662f\u5728\u540c\u7ea7\u76ee\u5f55\u4e0b\u521b\u5efa\u4e00\u4e2a\u4e0e\u4e4b\u540c\u540d\u7684 json \u6587\u4ef6\uff0c\u4f5c\u4e3a\u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6 apps\n\u251c\u2500\u2500 album\n \u251c\u2500\u2500 test_album_01_start.json # \u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6\n\u2514\u2500\u2500 test_album_01_start.py # \u6027\u80fd\u573a\u666f\u6587\u4ef6\n \u4ee5\u4e0b\u662f\u5bf9 json \u6587\u4ef6\u4e2d\u914d\u7f6e\u7684\u89e3\u91ca\uff0c\u82e5\u67d0\u9879\u914d\u7f6e\u4e0d\u9700\u8981\uff0c\u53ef\u4ee5\u7f3a\u5931\uff0c\u4f46\u4e0d\u80fd\u4e3a\u7a7a\uff1b {\n\"title\": \"test_album_start\", # \u6807\u9898\uff1b\u5fc5\u987b\n\"app_name\": \"deepin-album\", # \u573a\u666f\u6240\u5c5e\u7684\u5e94\u7528\uff1b\u5fc5\u987b\n\"scene\": \"hot\", # \u573a\u666f\u522b\u540d\uff1b\u5fc5\u987b\n\"icon\": [\"deepin-album\"], # \u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684icon\u5230\u670d\u52a1\u7aef\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\uff1b\u53ef\u7f3a\u5931\n# \u6ce8\u610f\uff1a\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684desktop\u6587\u4ef6\u540d\u4e3adeepin-album.desktop\uff0c\n# \u53ea\u9700\u8981\u5199deepin-album\u5373\u53ef\uff0c\u201c.desktop\u201d\u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002\n\"size\": { # \u56fe\u7247\u5bf9\u6bd4\u7684\u533a\u57df\u8bbe\u7f6e\u9879\uff0c\u67d0\u4e9b\u5e94\u7528\u5f53\u524d\u5c4f\u5e55\u7684\u90e8\u5206\u533a\u57df\u9700\u8981\u5c06\u5176\u53bb\u6389\uff0c\u53ef\u4ee5\u8bbe\u7f6e\u6b64\u9879\uff0c\u5982\u679c\u6ca1\u6709\u5219\u53ef\u4e0d\u5199\uff1b\u53ef\u786e\u5b9e\n\"x-coordinate\": 0, # \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n\"y-coordinate\": 0, # \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n\"width\": 850, # \u6a2a\u5411\u957f\u5ea6\n\"height\": 1920 # \u7eb5\u5411\u9ad8\u5ea6\n},\n\"count\": 5, # \u573a\u666f\u6267\u884c\u7684\u6b21\u6570\uff1b\u5fc5\u987b\n\"duration\": 5, # \u8be5\u6761\u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff0c\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7279\u5b9a\u573a\u666f\uff0c\u8be5\u914d\u7f6e\u4e3a\u53ef\u9009\u9879\uff0c\u8986\u76d6 server.ini \u4e2d\u7684\u914d\u7f6e\uff1b\u53ef\u7f3a\u5931\n\"stable_similarity\": 0.9997, # \u6027\u80fd\u573a\u666f\u5206\u9636\u6bb5\u65f6\u7684\u56fe\u7247\u76f8\u4f3c\u5ea6\u5bf9\u6bd4\uff0c\u524d\u540e\u56fe\u7247\u4f4e\u4e8e\u8be5\u503c\uff0c\u5219\u5206\u4e3a\u4e0d\u7a33\u5b9a\u9636\u6bb5\uff1b\u53ef\u7f3a\u5931\n\"find_by\": \"stage\", # \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\n\"final_stable_num\": 100, # \u67e5\u627e\u6700\u540e\u4e00\u4e2a\u5927\u4e8e\u8be5\u503c\u7684\u7a33\u5b9a\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u7684\u5c3e\u796f\uff1b\u53ef\u7f3a\u5931\n\"start_num\": 150,\n\"text\": \"\", # ocr\u8bc6\u522b\u7684\u6587\u6848\n\"match\": \"apps/xxx/images/match.png\", # \u56fe\u50cf\u5339\u914d\u7684\u56fe\u7247\u6587\u4ef6\u8def\u5f84\n\"match_rate\": 0.9 # \u5339\u914d\u76f8\u4f3c\u5ea6\n}\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e94\u3001\u6d4b\u8bd5\u6d41\u7a0b","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516d\u3001\u7528\u4f8b\u7f16\u5199\u53ca\u65b9\u6cd5\u53c2\u6570\u6307\u5f15","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"1\u3001\u7528\u4f8b\u5b9e\u4f8b\u8bf4\u660e","text":"# \u6807\u51c6\u5e93\u5bfc\u5165\nfrom time import sleep\n# \u5bfc\u5165\u4e09\u65b9\u5e93pytest\nimport pytest\n# \u5bfc\u5165\u7528\u4f8b\u6267\u884c\u8981\u7528\u5230\u7684Widget\u7c7b\nfrom src.base_widget import BaseWidget\nclass TestStart:\n# class\u7ea7\u522b\u7684fixture\uff0c\u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u6267\u884c\u3002autouse=True \u81ea\u52a8\u5728\u5f53\u524d\u4f5c\u7528\u57df\u4e0b\u4f7f\u7528\u3002\n@pytest.fixture(scope=\"class\", autouse=True)\n# \u6d4b\u8bd5\u70ed\u542f\u52a8\u4e4b\u524d\u9700\u8981\u9884\u542f\u52a8\u3002\ndef application_pre_start(self):\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().right_click_element(\"deepin-album\")\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().click_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\")\nsleep(2)\n# \u5feb\u6377\u952e\u5173\u95ed\u7a97\u53e3\nBaseWidget().hot_key(\"alt\", \"f4\")\nsleep(2)\n# \u9ed8\u8ba4\u4e3afunction\u7ea7\u522b\u7684fixture\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\uff0cclass\u7ea7\u522bfixture\u6267\u884c\u4e4b\u540e\u6267\u884c\u3002\n@pytest.fixture(autouse=True)\ndef setup_start(self):\n# \u53f3\u952e\u70b9\u51fb deepin-album \u56fe\u6807\nBaseWidget().right_click_element(\"deepin-album\")\n# \u79fb\u52a8\u5230\u53f3\u952e\u83dc\u5355\u4e2d\u6253\u5f00\uff08open.png\uff09\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().move_to(*BaseWidget().find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))\n# \u7b49\u5f85\u79fb\u52a8\u5b8c\u6210\nsleep(0.5)\ndef test_album_start(self):\n# \u70b9\u51fb\u201c\u6253\u5f00\u201d\nBaseWidget().click() \n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"2\u3001\u65b9\u6cd5\u53c2\u6570\u8bf4\u660e","text":"2.1\u3001find_element \u65b9\u6cd5 def find_element(element: str, input_type: str = \"FILE_NAME\", fill_color_position: tuple = (-1, -1), size: tuple = (25, 70)):\npass\n \u53c2\u6570 element \u548c input_type \uff081\uff09\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u5143\u7d20 - `input_type` \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a `FIEL_NAME` \uff0c\u8868\u793a\u901a\u8fc7\u5e94\u7528 `icon` \u5bfb\u627e\u5143\u7d20\uff0c\u6b64\u65b9\u6cd5\u4f1a\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u5e94\u7528 `icon` \u56fe\u6807\u3002\n \u4e3e\u4f8b\uff1a\u9ed8\u8ba4\u60c5\u51b5\u4e0b input_type \u53c2\u6570\u4e0d\u9700\u8981\u4f20\u5165\uff0c find_element(\"deepin-album\")\uff0c\u8868\u793a\u901a\u8fc7 deepin-album \u7684\u5e94\u7528 icon \u6765\u83b7\u53d6\u5750\u6807\uff0c\u6ce8\u610f\uff0c\u6b64\u65f6\u4f20\u5165\u7684 deepin-album \u53c2\u6570\u5b9e\u9645\u662f desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u548c2.3\u4e2d\u7684 icon \u53d8\u91cf\u4e00\u81f4\u3002 \u6211\u4eec\u5efa\u8bae\u4f18\u5148\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\uff0c\u4f46\u6b64\u65b9\u6cd5\u4f9d\u8d56\u7f51\u7edc\uff0c\u8bf7\u6839\u636e\u6d4b\u8bd5\u73af\u5883\u5b9e\u9645\u60c5\u51b5\u9009\u62e9\u3002 \uff082\uff09\u901a\u8fc7\u672c\u5730\u56fe\u7247\u8bc6\u522b\u5143\u7d20 - \u53c2\u6570 `input_type` \u4f20\u5165\u56fe\u7247\u683c\u5f0f\uff0c\u6bd4\u5982\u622a\u53d6\u7684\u672c\u5730\u56fe\u7247\u683c\u5f0f\u4e3a `png`\uff0c\u90a3\u4e48 `input_type=\"png\"`\uff0c\u6b64\u65f6\u53c2\u6570 `element ` \u4f20\u5165\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5efa\u8bae\u5b58\u653e\u5728\u5bf9\u5e94\u7684\u4ea7\u54c1 `apps/app/picture/` \u76ee\u5f55\u4e0b\uff0c\u8def\u5f84\u4e3a\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u7684\u76f8\u5bf9\u8def\u5f84\u3002\n- \u4e3e\u4f8b\uff1a`find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))`\uff0c\u8868\u793a\u901a\u8fc7\u672c\u5730\u56fe\u7247 `open.png` \u8bc6\u522b\u5143\u7d20\u3002\n \u53c2\u6570 fill_color_position fill_color_position \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (-1, -1)\uff0c(-1, -1) \u8868\u793a\u53d6\u5c4f\u5e55\u4e2d\u53f3\u4e0b\u89d2\u6700\u540e\u4e00\u4e2a\u50cf\u7d20\u70b9\u4f5c\u4e3a\u586b\u5145\u5750\u6807\uff0c\u5728 1920x1080 \u5c4f\u5e55\u5206\u8fa8\u7387\u4e0b\u5373\u5b9e\u9645\u5750\u6807\u4e3a (1919, 1079) \uff0c\u8fd9\u6837\u7684\u5199\u6cd5\u53ef\u4ee5\u9002\u914d\u4e0d\u540c\u5927\u5c0f\u7684\u5c4f\u5e55\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0d\u540c\u65b9\u4f4d\uff1a \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0b\u65b9\uff0c\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u4e0d\u9700\u8981\u4f20\u5165\u8be5\u53c2\u6570\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u5de6\u8fb9\uff0cfill_color_position=(1, 1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u53f3\u8fb9\uff0cfill_color_position=(-1, -1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0a\u8fb9\uff0cfill_color_position=(1, 1) \u4ece\u684c\u9762\u542f\u52a8\u5e94\u7528\uff0c\u5219\u9700\u8981\u4f20\u5165\u9664\u4efb\u52a1\u680f\u4ee5\u5916\u5176\u4ed6\u4f4d\u7f6e\u7684\u5750\u6807\uff0c\u6bd4\u5982(100, 100)\uff0c\u53ea\u8981\u8fd9\u4e2a\u5750\u6807\u4e3a\u9664\u5e94\u7528\u548c\u4efb\u52a1\u680f\u533a\u57df\u90fd\u53ef\u4ee5\u3002 \u4ece\u542f\u52a8\u5668\u91cc\u9762\u542f\u52a8\u5e94\u7528\uff0c\u9700\u8981\u586b\u5145\u7684\u5750\u6807\u4e3a\u542f\u52a8\u5668\u533a\u57df\u3002 \u6ce8\uff1a\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u65f6\uff0c\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684 icon \u539f\u6587\u4ef6\u4e3a svg \u77e2\u91cf\u56fe\uff0c\u8f6c\u6362\u4e3a png \u4e4b\u540e\u9700\u8981\u586b\u5145\u8fb9\u7f18\u900f\u660e\u90e8\u5206\u3002 \u53c2\u6570 size size \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (25, 70)\uff0c\u8868\u793a\u6d4b\u8bd5\u673a\u4e0a dock \u680f\u4e0a\u5e94\u7528\u56fe\u6807\u7684\u5927\u5c0f\u8303\u56f4\u3002 UOS \u7cfb\u7edf dock \u680f\u662f\u53ef\u4ee5\u4e0a\u4e0b\u62d6\u52a8\u5927\u5c0f\u7684\uff0c\u968f\u7740 dock \u680f\u5927\u5c0f\u6539\u53d8\uff0c\u5e94\u7528\u56fe\u6807\u7684\u8303\u56f4\u4e3a25\u523070\u4e4b\u95f4\u3002 \u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u64cd\u4f5c\u7cfb\u7edf\u4e0a dock \u680f\u5927\u5c0f\u4e0d\u4e00\u6837\uff0c\u53ef\u4ee5\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u4f20\u5165\u5927\u5c0f\u8303\u56f4\u3002 2.2\u3001click_element\u3001 right_click_element\uff0c double_click_element \u8fd9\u51e0\u4e2a\u65b9\u6cd5\u53c2\u6570\u89c4\u5219\u4e0e find_element \u65b9\u6cd5\u4e00\u6837\u3002\u4ed6\u4eec\u5b9e\u9645\u4e0a\u662f\u5728 find_element \u65b9\u6cd5\u57fa\u7840\u4e4b\u4e0a\u505a\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u589e\u52a0\u4e86\u9f20\u6807\u7684\u52a8\u4f5c\uff0c\u5982\u679c\u4f60\u4e0d\u60f3\u4f7f\u7528\u8fd9\u51e0\u4e2a\u65b9\u6cd5\uff0c\u5728\u7528\u4f8b\u4e2d\u4e5f\u53ef\u4ee5\u901a\u8fc7 find_element \u83b7\u53d6\u5230\u5750\u6807\uff0c\u7136\u540e\u5c06\u5750\u6807\u4f20\u5165\u5230\u952e\u9f20\u7684\u65b9\u6cd5\u4e2d\uff0c\u53ef\u4ee5\u5b9e\u73b0\u540c\u6837\u7684\u6548\u679c\u3002 2.3\u3001\u7528\u4f8b\u7c7b\u4e2d\u6709\u4e2a\u7c7b\u53d8\u91cf icon = [\"deepin-album\"] \u9700\u8981\u7279\u6b8a\u8bf4\u660e\uff0c\u5217\u8868\u4e2d\u7684\u5143\u7d20\u4e3a\u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709 icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684 icon \u5230\u670d\u52a1\u7aef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528 desktop \u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684 desktop \u6587\u4ef6\u540d\u4e3a deepin-album.desktop\uff0c\u53ea\u9700\u8981\u5199 deepin-album \u5373\u53ef\uff0c.desktop \u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e03\u3001\u6267\u884c\u5165\u53e3","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"1\u3001\u7528\u4f8b\u7ec4\u7ec7","text":"\u5728 setting/config/server.ini \u6587\u4ef6\u4e2d APP_NAME= \u5b57\u6bb5\u4e3a\u7528\u4f8b\u7684\u6267\u884c\u7684\u76ee\u5f55\uff0c\u9ed8\u8ba4\u4e3a apps \u76ee\u5f55\u4e0b\u6240\u6709\u7528\u4f8b\u3002\u5982\u679c\u4f60\u60f3\u6307\u5b9a\u6267\u884c\u67d0\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4f60\u53ef\u4ee5\u5c06\u8be5\u914d\u7f6e\u9879\u6307\u5b9a\u5230\u5e94\u7528\u7684\u7528\u4f8b\u76ee\u5f55\uff0c\u6bd4\u5982\uff1aAPP_NAME=deepin_album\uff0c \u8868\u793a\u6267\u884c\u76f8\u518c\u76ee\u5f55\u4e0b\u7684\u7528\u4f8b\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a python3 manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music\n -k KEYWORDS, --keywords KEYWORDS\n \u7528\u4f8b\u7684\u5173\u952e\u8bcd\n -t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e\n --log_level LOG_LEVEL \u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n --env {host,docker} \u5728\u5bbf\u4e3b\u673a\u6216\u5bb9\u5668\u73af\u5883\u6267\u884c\n --client_alias \u9009\u62e9\u6d4b\u8bd5\u673a\u522b\u540d, \u53ef\u9009\u9879\u4e3aclient.ini\u4e2d\u5df2\u914d\u7f6e, \u9ed8\u8ba4\u503c\u4e3a zx-x86.\n --count \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a python3 manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\" --env docker\n \u6ce8\uff1a\u5728\u5bb9\u5668\u4e2d\u6267\u884c\u65f6\uff0c\u82e5\u5f3a\u5236\u9000\u51fa\uff0c\u5bb9\u5668\u5e76\u4e0d\u4f1a\u505c\u6b62\u8fd0\u884c\uff01"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_9","title":"\u516b\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1json","title":"1\u3001Json \u62a5\u544a","text":"\u81ea\u7814\u89c6\u9891\u89e3\u6790\u5de5\u5177\u4f1a\u5bf9\u5355\u6761\u7528\u4f8b\u6267\u884c\u4e00\u8f6e\u751f\u6210\u4e00\u4e2a json \u6587\u4ef6\uff0c\u5b58\u653e\u4e8e report/{app_name}/{scene}/{run_num} \u76ee\u5f55\u4e0b\uff0c\u547d\u540d\u683c\u5f0f\u4e3a\uff1a report.json json \u5185\u5bb9\u4e3e\u4f8b\uff1a [\n{\n\"Stab1\": {\n\"images\": [1,2...150,151],\n\"startStub\": 0,\n\"type\": \"Stab\"\n}\n},\n{\n\"Stab2\": {\n\"images\": [152,153...169,170],\n\"startStub\": 1,\n\"type\": \"UnStab\"\n}\n},\n{\n\"Stab3\": {\n\"images\": [171,172...300,301],\n\"startStub\": 0,\n\"type\": \"UnStab\"\n}\n}\n]\n \u8bf4\u660e\uff1a Stab \uff1a\u8868\u793a\u89e3\u6790\u8fc7\u7a0b\u4e2d\u4e0d\u540c\u7684\u9636\u6bb5\u3002 images \uff1a\u8868\u793a\u6bcf\u4e00\u5e27\u7684\u56fe\u7247\u5e8f\u53f7\u3002 startStub\uff1a \u4e3a\u8bc6\u522b\u5c3e\u5e27\u7684\u9636\u6bb5\u8868\u793a\uff0c\u5982\u679c \"startStub\": 1 \uff0c\u8bf4\u660e\u5c3e\u5e27\u51fa\u73b0\u5728\u8be5\u9636\u6bb5\u3002 type\uff1a \u4e3a Stab \u6216 UnStab \uff0c\u8868\u793a\u7a33\u5b9a\u9636\u6bb5\u6216\u4e0d\u7a33\u5b9a\u9636\u6bb5\u3002 \u5404\u9636\u6bb5\u6709\u5e27\u6570\u8865\u507f\uff0c\u9ed8\u8ba4\u8865\u507f\u7684\u5e27\u6570\u4e3a 3 \u5e27\uff08\u53ef\u4ee5\u901a\u8fc7 server.ini \u91cc\u9762 un_stab_start=3 \u8fdb\u884c\u914d\u7f6e\uff09\uff0c\u8868\u793a\u5c0f\u4e8e\u7b49\u4e8e 3 \u5e27\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u524d\u540e\u5747\u9700\u8981\u51cf\u6389\u3002 \u5e94\u7528\u542f\u52a8\u9636\u6bb5\u5c31\u662f\u5728 Stab2 \u9636\u6bb5\uff0c\u542f\u52a8\u65f6\u95f4\u4e3a\uff1a171 \u51cf 151 \u518d\u51cf\u6389\u524d\u540e\u8865\u507f\u5e27\u6570 6 \u5e27\uff0c\u5373 14 \u5e27\uff0c\u89c6\u9891\u5e27\u7387 30 \u5e27/\u79d2\uff0c\u56e0\u6b64\u542f\u52a8\u8017\u65f6\u4e3a\uff1a14 * 33 = 462 ms"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2excel","title":"2\u3001Excel \u62a5\u544a","text":"\u6240\u6709\u7528\u4f8b\u6267\u884c\u5e76\u89e3\u6790\u5b8c\u4e4b\u540e\u4f1a report \u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a\u6c47\u603b\u6570\u636e\u7684 Excel \u6587\u4ef6\uff0c\u6587\u4ef6\u540d\u4e3a\uff1a{time}_perf_time.xlsx\u3002 \u6ce8\u610f\uff0creport \u76ee\u5f55\u4e3a\u53ef\u914d\u7f6e\u9879\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u4f1a\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u751f\u6210\uff0c\u5982\u679c\u4f60\u5c06 report\uff0c\u6307\u5b9a\u5230\u9879\u76ee\u4e0b\u5176\u4ed6\u8def\u5f84\uff0c\u5219\u4f1a\u5728\u5bf9\u5e94\u7684\u8def\u5f84\u4e0b\u751f\u6210 json \u548c Excel \u6587\u4ef6\u3002 \u4f60\u4e5f\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8bfb\u53d6\u6240\u6709 json / excel \u62a5\u544a\u7684\u6570\u636e\uff0c\u751f\u6210\u4f60\u81ea\u5df1\u60f3\u8981\u7684\u4e00\u4e9b\u6d4b\u8bd5\u62a5\u544a\u5f62\u5f0f\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#usb","title":"\u4e5d\u3001USB \u4e32\u53e3\u9a71\u52a8\u952e\u9f20\u65b9\u6cd5","text":"\u4f4d\u4e8e src/utils/control/serial_communication \u76ee\u5f55\u4e0b\u7684 usb_mk.py \u6587\u4ef6 usb_mk = UsbMk()\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up()\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u652f\u6301\u4f20\u5165\u6c49\u5b57\uff0c\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click()\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() \n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() \n \uff084\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() \n \uff085\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() \n \uff086\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() \n \uff087\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff088\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff0810\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_10","title":"\u5341\u3001\u7ee7\u7535\u5668\u63a7\u5236\u4e3b\u673a\u5f00\u673a/\u91cd\u542f","text":"\uff08\u82e5\u4e0d\u4f7f\u7528\u7ee7\u7535\u5668\uff0c\u53ef\u5ffd\u7565\u8be5\u6b65\u9aa4\uff0c\u6267\u884c\u65f6\u4f1a\u901a\u8fc7\u547d\u4ee4 reboot\uff09"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u7ee7\u7535\u5668\u8bbe\u5907","text":"LCUS-2 \u578b \u53cc\u8def USB \u667a\u80fd\u4e32\u53e3\u63a7\u5236\u7ee7\u7535\u5668\u3002 https://item.taobao.com/item.htm?spm=a1z09.2.0.0.41d72e8dUYx2pi&id=582653718178&_u=i25r20ia6a2e "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2usb","title":"2\u3001USB \u5ef6\u957f\u7ebf","text":"\u666e\u901a\u7684 USB \u7ebf\u5373\u53ef\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_3","title":"3\u3001\u675c\u90a6\u7ebf","text":"3.1\u300140P \u6bcd\u5bf9\u516c\u675c\u90a6\u7ebf\u3002 3.2\u3001\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"4\u3001\u5b89\u88c5\u56fe\u6587\u6559\u7a0b","text":"4.1\u3001\u4f7f\u7528 USB \u5ef6\u957f\u7ebf\u8fde\u63a5\u63a7\u5236\u7aef\u548c\u7ee7\u7535\u5668\u3002 4.2\u3001\u5728\u7ee7\u7535\u5668\u5e38\u7aef\u548c\u516c\u5171\u7aef\u5747\u8fde\u63a5\u4e00\u6839\u675c\u90a6\u7ebf\u3002 4.3\u3001\u5728\u4e3b\u677f\u4e0a\u5f00\u673a\u9488\u548c\u91cd\u542f\u9488\u4e0a\u63d2\u4e0a\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 4.4\u3001\u5c06\u5f00\u673a\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76841\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1\u5de6\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 4.5\u3001\u5c06\u91cd\u542f\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76842\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1 \u53f3\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 \u82e5\u60f3\u4fdd\u7559\u539f\u7535\u6e90\u5f00\u5173\u7684\u7535\u6e90\u706f\uff0c\u53ef\u6839\u636e\u5982\u4e0a\u56fe\u6240\u793a\uff0c\u4f7f\u7528\u675c\u90a6\u7ebf\u8fde\u63a5\u4e3b\u677f\u4e0a\u7684\u7535\u6e90\u706f\u548c\u539f\u7535\u6e90\u5f00\u5173"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_11","title":"\u5341\u4e00\u3001\u5e38\u89c1\u95ee\u9898\u8bf4\u660e","text":"1\u3001ERROR: for uos Cannot restart container 2301b1a1395d7959ee6523d61b61c87084649af530786cdb8fb5b3ecbcbd1068: linux runtime spec devices: error gathering device information while adding custom device \"/dev/ttyACM0\": no such file or directory \u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u8fde\u63a5\u72b6\u6001\uff0c\u67e5\u770b /dev/ttyACM0 \u662f\u5426\u5b58\u5728\uff0c\u82e5\u5b58\u5728 /dev/ttyACMn\uff08n\u4e3a\u4efb\u610f\u6570\u5b57\uff09\uff0c\u91cd\u542f\u7535\u8111\u89e3\u51b3\u3002 2\u3001Error response from daemon: Container 5e700fdc769e8c74666d68a7f2bc3de58268b4594cf88706609d59f8dbc7362d is not running \u5bb9\u5668\u542f\u52a8\u5931\u8d25 1\uff09\u68c0\u67e5\u54ea\u4e00\u4e2a\u5bb9\u5668\u672a\u542f\u52a8 sudo docker container ls # \u5217\u51fa\u8fd0\u884c\u4e2d\u7684 Docker \u5bb9\u5668\n 2\uff09\u7f3a\u5c11 uos \u5bb9\u5668\uff0c\u68c0\u67e5 USB \u4e32\u53e3\u8fde\u63a5\u7ebf\u548c\u91c7\u96c6\u76d2\u8fde\u63a5\u7ebf\u662f\u5426\u6b63\u5e38\uff0c\u91cd\u542f\u540e\u6267\u884c bash install/setup.up # \u91cd\u65b0\u5b8c\u6574\u90e8\u7f72\u73af\u5883\n \u6216\u6267\u884c sudo docker-compose up -d --build # \u4ec5\u91cd\u65b0\u6784\u5efa Docker \u955c\u50cf\n 3\u3001\u82e5\u90e8\u7f72\u65f6\u63d0\u793a\u6302\u8f7d ttyACM0\u3001video0 \u5931\u8d25\uff0c\u8bf7\u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u53ca\u91c7\u96c6\u76d2\u662f\u5426\u63a5\u89e6\u826f\u597d\uff0c\u82e5\u63a5\u89e6\u826f\u597d\uff0c\u91cd\u542f\u5373\u53ef\u89e3\u51b3\u3002 4\u3001\u82e5\u51fa\u73b0\u56fe\u7247\u80fd\u8bc6\u522b\uff0c\u4f46\u662f\u9f20\u6807\u672a\u79fb\u52a8\u64cd\u4f5c\u65f6\uff0c\u5b89\u88c5\u7edd\u5bf9\u9f20\u6807\u64cd\u4f5c\u7684\u4f9d\u8d56\u5305\uff0c\u89c1\u7b2c\u4e09\u8282\u7b2c\u4e8c\u5c0f\u8282\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u6d4b\u8bd5\u673a\u3002 5\u3001\u7531\u4e8e\u901a\u8fc7\u91c7\u96c6\u5361\u83b7\u53d6\u7684\u6d4b\u8bd5\u673a\u5b9e\u65f6\u753b\u9762\uff0c\u5305\u542b\u4e86\u9f20\u6807\u7684\u6837\u5f0f\uff0c\u6240\u4ee5\u5bf9\u56fe\u7247\u8bc6\u522b\u65f6\uff0c\u9f20\u6807\u82e5\u505c\u7559\u5728\u56fe\u6807\u4e0a\u5c42\uff0c\u5219\u4f1a\u5bf9\u8bc6\u522b\u7ed3\u679c\u9020\u6210\u5f71\u54cd\uff0c\u9700\u8981\u5c06\u9f20\u6807\u79fb\u52a8\u81f3\u5176\u4ed6\u4f4d\u7f6e\uff0c\u6216\u8005\u9690\u85cf\u9f20\u6807\u89e3\u51b3\u3002 6\u3001Excel \u62a5\u544a\u4e2d\uff0c\u6d4b\u8bd5\u573a\u666f\u5217\u4e0e\u7528\u4f8b\u4e2d\u7684\u4e0d\u4e00\u81f4\uff0c\u5173\u952e\u5b57scene\u3001app_name\u3001\u67b6\u6784\u522b\u540d\uff0c\u4e0d\u80fd\u5305\u542b\u4e0b\u5212\u7ebf\u548c\u82f1\u6587\u7b26\u53f7\u7684\u5706\u62ec\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/","title":"\u6846\u67b6\u529f\u80fd\u4ecb\u7ecd","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2023/1/12\n# Author : Mikigo\n# =============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_2","title":"\u4e00\u3001\u4e00\u53e5\u8bdd\u7b80\u4ecb","text":"\u6b64\u6587\u6863\u4e3b\u8981\u60f3\u5bf9 YouQu \u6846\u67b6\u4e00\u4e9b\u91cd\u70b9\u7684\u529f\u80fd\u505a\u8be6\u7ec6\u7684\u4ecb\u7ecd\uff0c\u5305\u62ec\u5bf9\u4e00\u4e9b\u529f\u80fd\u5f00\u53d1\u7684\u80cc\u666f\u3001\u8981\u89e3\u51b3\u7684\u95ee\u9898\u3001\u5b9e\u73b0\u903b\u8f91\u3001\u4ee3\u7801\u7b49\u65b9\u9762\u7684\u4ecb\u7ecd\uff0c\u4ee5\u6b64\u8ba9\u5927\u5bb6\u80fd\u66f4\u52a0\u6e05\u6670\u7684\u7406\u89e3\u5404\u9879\u529f\u80fd\uff0c\u4ece\u800c\u5728\u4f7f\u7528\u7684\u65f6\u5019\u80fd\u66f4\u52a0\u7684\u5f97\u5fc3\u5e94\u624b\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_3","title":"\u4e8c\u3001\u56fe\u50cf\u8bc6\u522b","text":"\u56fe\u50cf\u8bc6\u522b\u5728 UI \u81ea\u52a8\u5316\u4e2d\u662f\u4e0d\u53ef\u7f3a\u5c11\u7684\uff0c\u5e02\u9762\u4e0a\u751a\u81f3\u6709\u5b8c\u5168\u57fa\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\uff0c\u6bd4\u5982 Airtest\u3001Sikuli \u7b49\uff0c\u5728\u6e38\u620f\u7b49\u7279\u5b9a\u9886\u57df\u4e5f\u6709\u4e0d\u9519\u7684\u6548\u679c\uff0c\u8fd9\u4e9b\u5de5\u5177\u5b9e\u9645\u4e0a\u4e5f\u662f\u7528\u7684 OpenCV \u8fdb\u884c\u4e86\u5c01\u88c5\uff0cYouQu \u6846\u67b6\u57fa\u4e8e OpenCV \u5f00\u53d1\u4e86\u81ea\u5df1\u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\uff0c\u5b83\u53ef\u4ee5\u65b9\u4fbf\u7684\u7528\u4e8e\u754c\u9762\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u65ad\u8a00\uff1b YouQu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u51e0\u4e4e\u6ee1\u8db3\u4e86\u4f60\u7684\u6240\u6709\u8981\u6c42\uff0c\u6211\u4eec\u5728\u957f\u65f6\u95f4\u7684\u601d\u8003\u548c\u6478\u7d22\u4e2d\uff0c\u9488\u5bf9\u5e38\u89c4\u573a\u666f\u53ca\u4e00\u4e9b\u7279\u6b8a\u573a\u666f\u63a2\u7d22\u9664\u4e86\u4e00\u4e9b\u5b9e\u7528\u4e14\u6709\u6548\u7684\u65b9\u6848\uff0c\u4e14\u542c\u6211\u6162\u6162\u9053\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1","title":"1\u3001\u5e38\u89c4\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5e38\u89c4\u8bc6\u522b\u5f88\u597d\u7406\u89e3\uff0c\u4e00\u53e5\u8bdd\u8bb2\u5c31\u662f\uff0c\u8981\u83b7\u53d6\u5230\u76ee\u6807\u5143\u7d20\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u3002 \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u5728\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u9700\u8981\u83b7\u53d6\u7684\u5750\u6807\u662f\u76f8\u5bf9\u4e8e\u6574\u4e2a\u5c4f\u5e55\u7684\u5750\u6807\uff0c\u6211\u4eec\u53ef\u4ee5\u622a\u53d6\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u56fe\u7247\uff08screen\uff09\uff1b \u5728\u5143\u7d20\u8bc6\u522b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u622a\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5c0f\u56fe\u8fdb\u884c\u8bc6\u522b\uff0c\u6bd4\u5982\u622a\u53d6\u64ad\u653e\u6309\u94ae\uff1a \u90a3\u4e48\u5b9e\u9645\u4e0a\uff0c\u5143\u7d20\u5b9a\u4f4d\u7684\u95ee\u9898\u5c31\u8f6c\u6362\u4e3a\uff0c\u5c06\u622a\u56fe\u7684\u5c0f\u56fe\uff08play_btn\uff09\u62ff\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u5927\u56fe\uff08screen\uff09\u4e2d\u53bb\u505a\u5339\u914d\uff0c\u5982\u679c\u5339\u914d\u6210\u529f\uff0c\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff08 x, y \uff09\u5373\u53ef\u3002 \u4e3a\u4e86\u65b9\u4fbf\u63cf\u8ff0\uff0c\u4ee5\u4e0b\u6211\u5c06\u6574\u4e2a\u5c4f\u5e55\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5927\u56fe\uff0c\u67d0\u4e2a\u5143\u7d20\u56fe\u7247\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5c0f\u56fe\u3002 \u57fa\u4e8e OpenCV \u7684\u6a21\u677f\u5339\u914d cv.matchTemplate() \u529f\u80fd\uff0c\u6211\u4eec\u5b9e\u73b0\u4e86\u56fe\u50cf\u5b9a\u4f4d\u7684\u529f\u80fd\uff0c\u6846\u67b6\u63d0\u4f9b\u4e86\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u5e95\u5c42\u63a5\u53e3\uff08\u4e00\u822c\u4e0d\u5bf9\u4e0a\u5c42\u63d0\u4f9b\u8c03\u7528\uff09\uff1a def _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\n# \u8be6\u7ec6\u4ee3\u7801\u592a\u957f\u4e0d\u8d34\u4e86\uff0c\u611f\u5174\u8da3\u8bf7\u67e5\u770b\u6e90\u7801\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001image_path image_path \u662f\u5c0f\u56fe\u7684\u7edd\u5bf9\u8def\u5f84; \u901a\u5e38\u5728 AT \u5de5\u7a0b\u91cc\u9762\uff0c\u6211\u4eec\u7ea6\u5b9a\u5c06\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u5b9e\u9645\u7684\u5143\u7d20\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1aplay_btn.png \uff1b \u7528\u4e8e\u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 case/assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1amusic_001.png \uff1b \u8fd9\u6837\u662f\u4e3a\u4e86\u65b9\u4fbf\u7ba1\u7406\u548c\u7ef4\u62a4\u3002 2\u3001rate \u56fe\u50cf\u8bc6\u522b\u7684\u7684\u5339\u914d\u5ea6\u6216\u8005\u8bf4\u76f8\u4f3c\u5ea6\uff0c\u6846\u67b6\u9ed8\u8ba4\u7684\u914d\u7f6e\u4e3a 0.9\uff0c\u4e5f\u5c31\u662f\u8bf4\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u5b58\u5728\u4e00\u4e2a\u76f8\u4f3c\u5ea6 90% \u7684\u56fe\u6807\u5373\u8fd4\u56de\u5176\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff1b \u5982\u679c\u4f60\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u8c03\u6574\u8bc6\u522b\u5ea6\uff0c\u4f60\u53ef\u4ee5\u5728\u8c03\u7528\u51fd\u6570\u7684\u65f6\u5019\uff0c\u4f20\u5165\u4e0d\u540c\u7684\u8bc6\u522b\u5ea6\u7684\u503c\u3002 3\u3001multiple \u9ed8\u8ba4\u60c5\u51b5\u4e0b multiple=False\uff0c\u8868\u793a\u53ea\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u7b2c\u4e00\u4e2a\uff0c\u5982\u679c multiple=True \u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\uff0c\u56e0\u4e3a\u5927\u56fe\u4e2d\u53ef\u80fd\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u5c0f\u56fe\uff0c\u5728\u67d0\u4e9b\u573a\u666f\u4e0b\u4f60\u53ef\u80fd\u9700\u8981\u5168\u90e8\u83b7\u53d6\u5230\u6240\u6709\u5339\u914d\u5230\u7684\u5750\u6807\u3002 4\u3001picture_abspath \u9ed8\u8ba4\u60c5\u51b5\u4e0b picture_abspath=None \u8868\u793a\u5927\u56fe\u4e3a\u622a\u53d6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u5982\u679c\u4f60\u4e0d\u5e0c\u671b\u5927\u56fe\u662f\u5c4f\u5e55\u7684\u622a\u56fe\uff0c\u800c\u662f\u4f60\u81ea\u5b9a\u4e49\u4f20\u5165\u7684\u67d0\u4e2a\u56fe\u7247\uff0c\u4f60\u53ea\u9700\u8981\u5c06\u4f60\u7684\u56fe\u7247\u8def\u5f84\u4f20\u9012\u7ed9\u8fd9\u4e2a\u53c2\u6570\u5c31\u884c\uff0c\u6bd4\u5982\uff1a picture_abspath=\"~/Desktop/big.png\" \uff1b 5\u3001screen_bbox \u5927\u56fe\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u622a\u53d6\u6574\u4e2a\u5c4f\u5e55\uff0cscreen_bbox = [x, y, w, h] \u53ef\u4ee5\u6307\u5b9a\u622a\u53d6\u5c4f\u5e55\u4e2d\u7684\u56fa\u5b9a\u533a\u57df\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\uff0c\u53ef\u4ee5\u6392\u9664\u90e8\u5206\u533a\u57df\u5bf9\u8bc6\u522b\u7ed3\u679c\u7684\u5f71\u54cd\u3002 \u3010\u9690\u5f0f\u7b49\u5f85\u3011 \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\uff0c\u6709\u65f6\u5019\u9875\u9762\u8df3\u8f6c\u6709\u5ef6\u65f6\uff0c\u6709\u53ef\u80fd\u5b58\u5728\u8bc6\u522b\u7684\u90a3\u4e00\u523b\u9875\u9762\u4e5f\u6ca1\u6709\u8df3\u8f6c\u51fa\u6765\uff0c\u6216\u8005\u6216\u8005\u8bc6\u522b\u7684\u90a3\u4e00\u523b\uff1b \u56e0\u6b64\u6211\u4eec\u9700\u8981\u4e00\u79cd\u7b49\u5f85\u673a\u5236\uff0c\u5373\u5728\u4e00\u5b9a\u7684\u65f6\u95f4\u5185\uff0c\u5982\u679c\u8bc6\u522b\u4e0d\u5230\uff0c\u91cd\u590d\u53bb\u8bc6\u522b\uff1a def find_image(\ncls,\n*widget, rate: [float, int] = None,\nmultiple: bool = False,\nmatch_number: int = None,\npicture_abspath: str = None,\nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u5728\u5c4f\u5e55\u4e2d\u533a\u5bfb\u627e\u5c0f\u56fe\uff0c\u8fd4\u56de\u5750\u6807\uff0c\n \u5982\u679c\u627e\u4e0d\u5230\uff0c\u6839\u636e\u914d\u7f6e\u91cd\u8bd5\u6b21\u6570\uff0c\u6bcf\u6b21\u95f4\u96941\u79d2\n :param widget: \u6a21\u677f\u56fe\u7247\u8def\u5f84\n :param rate: \u76f8\u4f3c\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param match_number: \u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\n :return: \u5750\u6807\u5143\u7ec4\n \"\"\"\nif rate is None:\nrate = float(GlobalConfig.IMAGE_RATE)\ntry:\nfor element in widget:\nfor _ in range((match_number or int(GlobalConfig.IMAGE_MATCH_NUMBER)) + 1):\nlocate = cls._match_image_by_opencv(\nelement,\nrate,\nmultiple=multiple,\npicture_abspath=picture_abspath,\nscreen_bbox=screen_bbox\n)\nif not locate:\nsleep(int(GlobalConfig.IMAGE_MATCH_WAIT_TIME))\nelse:\nreturn locate\nraise TemplateElementNotFound(*widget)\nexcept Exception as e:\nraise e\n \u53c2\u6570 match_number \u7528\u4e8e\u63a7\u5236\u91cd\u590d\u8bc6\u522b\u7684\u6b21\u6570\uff0c\u9ed8\u8ba4\u4e0d\u4f20\u53c2\uff0c\u53d6\u5168\u5c40\u914d\u7f6e setting/globalconfig.ini \u91cc\u9762\u7684 IMAGE_MATCH_NUMBER \u914d\u7f6e\u9879\u7684\u503c\uff0c\u9ed8\u8ba4IMAGE_MATCH_NUMBER = 1\uff0c\u5373\u91cd\u8bd5 1 \u6b21\uff1b find_image \u662f\u6846\u67b6\u63d0\u4f9b\u7684\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u51fd\u6570\u63a5\u53e3\uff0c\u8fd9\u4e2a\u51fd\u6570\u63d0\u4f9b\u4e86\u9690\u5f0f\u7b49\u5f85\u7684\u529f\u80fd\uff0c\u4e14\u5305\u542b\u4e0a\u9762\u4ecb\u7ecd\u7684 _match_image_by_opencv \u51fd\u6570\u7684\u6240\u6709\u529f\u80fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2","title":"2\u3001\u6c14\u6ce1\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u6c14\u6ce1\u8bc6\u522b\u6307\u7684\u662f\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\u8981\u5b9a\u4f4d\u7684\u5143\u7d20\u662f\u4e00\u4e9b\u4f1a\u6d88\u5931\u7684\u5c0f\u5f39\u7a97\uff0c\u8fd9\u7c7b\u573a\u666f\u5728\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\u5c31\u53ef\u80fd\u5b58\u5728\u4e0d\u7a33\u5b9a\u6027\uff0c\u6709\u53ef\u80fd\u56fe\u50cf\u8bc6\u522b\u7684\u65f6\u5019\u6c14\u6ce1\u5df2\u7ecf\u6d88\u5931\u4e86\uff0c\u4e5f\u6709\u53ef\u80fd\u6c14\u6ce1\u51fa\u73b0\u7684\u65f6\u95f4\u592a\u77ed\u4e86\uff0c\u4e0d\u5bb9\u6613\u6355\u6349\u5230\uff0c\u5c31\u50cf\u6c14\u6ce1\u4e00\u6837\uff0c\u51fa\u73b0\u4e00\u4e0b\u5c31\u6d88\u5931\uff0c\u56e0\u6b64\u6211\u4eec\u5f62\u8c61\u7684\u79f0\u4e4b\u4e3a \u201c\u6c14\u6ce1\u8bc6\u522b\u201d\uff1b \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u4e3a\u4e86\u80fd\u7a33\u5b9a\u7684\u8bc6\u522b\u6c14\u6ce1\u7c7b\u573a\u666f\uff0c\u6211\u4eec\u91c7\u7528\u7684\u65b9\u6848\u662f\uff1a \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\uff08\u5305\u542b\u6c14\u6ce1\u4ece\u51fa\u73b0\u5230\u6d88\u5931\uff09\uff0c\u4e0d\u505c\u7684\u622a\u53d6\u8fd9\u6bb5\u65f6\u95f4\u5185\u7684\u5927\u56fe\uff0c\u4ee5\u6b64\u786e\u4fdd\u5728\u622a\u53d6\u7684\u4e00\u5806\u56fe\u7247\u4e2d\uff0c\u80af\u5b9a\u6709\u81f3\u5c11\u4e00\u5f20\u56fe\u7247\u80fd\u6355\u6349\u5230\u6c14\u6ce1\uff0c\u6700\u540e\u518d\u5bf9\u8fd9\u4e00\u5806\u56fe\u7247\u9010\u4e2a\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def get_during(\ncls,\nimage_path: str,\nscreen_time: [float, int],\nrate: float = None,\npause: [int, float] = None,\nmax_range: int = 10000\n):\n\"\"\"\n \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u622a\u56fe\u591a\u5f20\u56fe\u7247\u8fdb\u884c\u8bc6\u522b\uff0c\u5176\u4e2d\u6709\u4e00\u5f20\u56fe\u7247\u8bc6\u522b\u6210\u529f\u5373\u8fd4\u56de\u7ed3\u679c;\n \u9002\u7528\u4e8e\u6c14\u6ce1\u7c7b\u7684\u65ad\u8a00\uff0c\u6bd4\u5982\u6c14\u6ce1\u57281\u79d2\u5185\u6d88\u5931\uff0c\u5982\u679c\u7528\u5e38\u89c4\u7684\u56fe\u50cf\u8bc6\u522b\u5219\u6709\u53ef\u80fd\u65e0\u6cd5\u8bc6\u522b\u5230\uff1b\n :param image_path: \u8981\u8bc6\u522b\u7684\u6a21\u677f\u56fe\u7247\uff1b\n :param screen_time: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff1b\n :param rate: \u8bc6\u522b\u7387\uff1b\n :param pause: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u4e0d\u95f4\u9694\uff1b\n :param max_range: \u622a\u56fe\u7684\u6700\u5927\u6b21\u6570\uff0c\u8fd9\u662f\u4e00\u4e2a\u9884\u8bbe\u503c\uff0c\u4e00\u822c\u60c5\u51b5\u4e0b\u4e0d\u6d89\u53ca\u4fee\u6539\uff1b\n \"\"\"\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001screen_time \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5728\u6b64\u65f6\u95f4\u5185\u4f1a\u4e0d\u65ad\u7684\u8fdb\u884c\u622a\u56fe\u64cd\u4f5c\uff0c\u5c31\u50cf\u5f55\u5236\u89c6\u9891\u4e00\u6837\uff1b 2\u3001pause \u6bcf\u6b21\u622a\u53d6\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u4e00\u523b\u4e0d\u505c\u7684\u622a\u56fe\uff0c\u5982\u679c\u4f60\u60f3\u6bcf\u6b21\u622a\u56fe\u5b58\u5728\u4e00\u4e9b\u95f4\u9694\u65f6\u95f4\u4f20\u5165\u5bf9\u5e94\u7684\u65f6\u95f4\u95f4\u9694\u5373\u53ef\uff0c\u5355\u4f4d\u662f\u79d2\uff0c\u6bd4\u5982\uff1apause = 0.03\uff0c\u8868\u793a 30 ms\uff0c\u76f8\u5f53\u4e8e\u5e27\u7387\u4e3a 30 \u5e27\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-opencv","title":"3\u3001\u4e0d\u4f9d\u8d56 OpenCV \u7684\u56fe\u50cf\u8bc6\u522b\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31","title":"3.1\u3001\u81ea\u7814\u56fe\u50cf\u8bc6\u522b\u6280\u672f","text":"\u3010\u539f\u7406\u3011 \u4e3a\u4e86\u5b9e\u73b0\u8bc6\u522b\u56fe\u50cf\u7684\u76ee\u7684\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u5c06\u56fe\u7247\u7684\u6bcf\u4e2a\u50cf\u7d20\u7684RGB\u503c\uff0c\u4e0e\u6574\u4e2a\u5c4f\u5e55\u4e2d\u7684RGB\u8fdb\u884c\u5bf9\u6bd4\uff0c\u5982\u679c\u5c0f\u56fe\u4e0a\u7684RGB\u503c\u4e0e\u5bf9\u5e94\u5927\u56fe\u4f4d\u7f6e\u7684RGB\u90fd\u76f8\u7b49\uff0c\u5219\u5339\u914d\u6210\u529f\uff0c\u5373\u53ef\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u70b9\u3002 1\u3001\u8bfb\u53d6\u5c0f\u56fe\u548c\u5927\u56fe\u7684RGB\u503c \uff081\uff09\u5c0f\u56fe\u7684RGB\u503c small_data = small_pic.load() # load()\u4f1a\u5c06\u56fe\u7247\u7684RGB\u503c\u83b7\u53d6\u5230\uff0c\u6570\u636e\u683c\u5f0f\u4e3a\u4e00\u4e2a\u4e8c\u7ef4\u5217\u8868\uff0c\u8d4b\u503c\u7ed9\u4e00\u4e2a\u53d8\u91cfsmall_data\u3002\n \uff082\uff09\u5927\u56fe\u7684RGB\u503c big_data = big_pic.load()\n 2\u3001\u5c06\u5c0f\u56fe\u4e0e\u5927\u56fe\u7684RGB\u503c\u8fdb\u884c\u5339\u914d \uff081\uff09\u5339\u914d\u4ece\u5927\u56fe\u7684\u5750\u6807\uff080\uff0c0\uff09\u5f00\u59cb\u5339\u914d\uff0c\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff082\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\uff080\uff0c0\uff09\u5bf9\u5e94\u7684\u6240\u6709\u5c0f\u56fe\u7684RGB\u503c\u4e0d\u76f8\u7b49\uff0c\u5219\u79fb\u52a8\u5230\u4e0b\u4e00\u4e2a\u5750\u6807\u70b9\uff081\uff0c0\uff09\uff0c\u540c\u6837\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff083\uff09\u6309\u7167\u8fd9\u6837\u7684\u89c4\u5f8b\u5c06\u8fd9\u4e00\u884c\u6bcf\u79fb\u52a8\u4e00\u4e2a\u5750\u6807\u70b9\uff0c\u90fd\u5c06\u5c0f\u56fe\u6240\u6709\u7684RGB\u4e0e\u5bf9\u5e94\u5927\u56fe\u7684\u503c\u8fdb\u884c\u5339\u914d\uff1b \uff084\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\u5176\u4e2d\u4e00\u4e2a\u5750\u6807\u70b9\u4e0a\u5339\u914d\u5230\u4e86\u5c0f\u56fe\u7684\u6240\u6709RGB\u503c\uff0c\u5219\u6b64\u65f6\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\u70b9\uff1b \uff085\uff09\u5982\u679c\u5339\u914d\u4e86\u5927\u56fe\u6240\u6709\u7684\u5750\u6807\u70b9\uff0c\u90fd\u6ca1\u6709\u5339\u914d\u5230\uff0c\u5219\u8bf4\u660e\u5927\u56fe\u4e2d\u4e0d\u5b58\u5728\u5c0f\u56fe\uff0c\u5339\u914d\u5931\u8d25\uff1b \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 class ImageRgb:\n@staticmethod\ndef _check_match(_x, _y, small, bdata, sdata, rate):\n\"\"\"\n Matching degree of small graph and large graph matching\n \"\"\"\n@staticmethod\ndef _pre_random_point(small):\n\"\"\"\n Pre matching, take 10-20 points at random each time,\n and take coordinates randomly in the small graph\n \"\"\"\n@staticmethod\ndef _pre_random_match(_x, _y, point_list, bdata, sdata, rate):\n\"\"\"\n In the small graph, several points are randomly\n selected for matching, and the matching degree is\n also set for the random points\n \"\"\"\n@classmethod\ndef match_image_by_rgb(cls, image_name=None, image_path=None, rate=0.9):\n\"\"\"\n By comparing the RGB values of the small image with the large\n image on the screen, the coordinates of the small image on\n the screen are returned.\n \"\"\"\n \u901a\u8fc7 match_image_by_rgb() \u8fd9\u4e2a\u51fd\u6570\uff0c\u4f20\u5165\u76ee\u6807\u5c0f\u56fe\u7684\u6587\u4ef6\u540d\u79f0\uff0c\u5373\u53ef\u8fd4\u56de\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u3002 \u6709\u540c\u5b66\u8981\u95ee\u4e86\uff0c\u6709 OpenCV \u5e72\u561b\u4e0d\u7528\uff0c\u6709\u5fc5\u8981\u81ea\u5df1\u5b9e\u73b0\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u529f\u80fd\u5417\uff0c\u4f60\u4eec\u662f\u4e0d\u662f\u95f2\u7684\u554a\uff1f \u8fd9\u4e48\u95ee\u7684\u8bdd\uff0c\u5c0f\u4e86\uff0c\u683c\u5c40\u5c0f\u4e86\uff1b\u6211\u4eec\u81ea\u5df1\u5b9e\u73b0\u4e3b\u8981\u6709\u51e0\u65b9\u9762\u539f\u56e0\uff1a \u51cf\u5c11\u73af\u5883\u4f9d\u8d56\uff0c\u5373\u4e0d\u7528\u5b89\u88c5 OpenCV\uff0c\u6211\u4eec\u4e5f\u80fd\u5b9e\u73b0\u5176\u529f\u80fd\uff0c\u73af\u5883\u4f9d\u8d56\u8fd9\u5757\u540e\u9762\u4f1a\u5355\u72ec\u8be6\u7ec6\u8bb2\uff0c\u51cf\u5c11\u73af\u5883\u4f9d\u8d56\u5bf9\u4e8e\u4efb\u4f55\u8f6f\u4ef6\u5de5\u7a0b\u90fd\u975e\u5e38\u91cd\u8981\uff1b OpenCV \u5728\u5176\u4ed6\u56fd\u4ea7 CPU \u67b6\u6784\u4e0a\u5b89\u88c5\u5e76\u4e0d\u80fd\u4fdd\u8bc1100%\u6210\u529f\uff0c\u751a\u81f3\u6709\u6ca1\u6709\u53ef\u80fd\u5728\u4e00\u4e9b\u67b6\u6784\u4e0a\u538b\u6839\u513f\u5c31\u4e0d\u80fd\u5b89\u88c5\u4f7f\u7528 OpenCV \uff1f \u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 OpenCV \uff1f\u5c31\u50cf\u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 Windows \u5462\uff1f\u8fd9\u4e9b\u95ee\u9898\u503c\u5f97\u601d\u8003\u3002 \u5f53\u7136\uff0c\u6211\u4eec\u627f\u8ba4\u8fd9\u5957\u65b9\u6848\uff0c\u867d\u7136\u8bc6\u522b\u51c6\u786e\u7387\u6ca1\u95ee\u9898\uff0c\u4f46\u5728\u8bc6\u522b\u6548\u7387\u4e0a\u8fd8\u6ca1\u6709\u8fbe\u5230 OpenCV \u6a21\u677f\u5339\u914d\u7684\u6548\u679c\uff0c\u6211\u4eec\u7684\u65b9\u6848\u6bcf\u6b21\u8bc6\u522b\u5728 1.5s \u5de6\u53f3\uff0c\u800c OpenCV \u5728 1s \u5de6\u53f3\uff1b \u6574\u4f53\u8bc6\u522b\u6548\u679c\u6765\u8bb2\uff0c\u6211\u8ba4\u4e3a\u8fd8\u662f\u53ef\u4ee5\u63a5\u53d7\u7684\uff0c\u4e5f\u5e0c\u671b\u6709\u5fd7\u4e4b\u58eb\u80fd\u4e00\u8d77\u4f18\u5316\u6b64\u65b9\u6848\uff0c\u4e00\u8d77\u6280\u672f\u62a5\u56fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32-rpc","title":"3.2\u3001\u57fa\u4e8e RPC \u670d\u52a1\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b","text":"\u5728\u8fdc\u7a0b\u670d\u52a1\u5668\u4e0a\u90e8\u7f72 OpenCV \u7684\u73af\u5883\uff0c\u5e76\u5c06\u5176\u90e8\u7f72\u4e3a RPC \u670d\u52a1\uff0c\u6d4b\u8bd5\u673a\u4e0a\u4e0d\u7528\u5b89\u88c5 OpenCV \u4f9d\u8d56\uff0c\u800c\u662f\u901a\u8fc7\u8bf7\u6c42 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u3010\u539f\u7406\u3011 \u6d4b\u8bd5\u673a\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u56fe\u7247\u4ee5\u53ca\u6a21\u677f\u56fe\u7247\uff0c\u53d1\u9001\u7ed9 RPC \u670d\u52a1\u7aef\uff0c\u670d\u52a1\u7aef\u62ff\u5230\u4e24\u5f20\u56fe\u7247\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u6700\u540e\u5c06\u8bc6\u522b\u7ed3\u679c\u8fd4\u56de\u7ed9\u6d4b\u8bd5\u673a\uff1b \u8981\u7279\u6b8a\u8bf4\u660e\u7684\u662f\uff1a RPC \u662f\u4e00\u79cd\u534f\u8bae\uff0c\u8bb8\u591a\u8bed\u8a00\u90fd\u662f\u652f\u6301\u7684\uff0c\u6bd4\u5982\u8bf4\u670d\u52a1\u7aef\u4e5f\u53ef\u4ee5\u7528 C++ \u6765\u5b9e\u73b0\uff0c\u5ba2\u6237\u7aef\u4f7f\u7528 Python \u4e5f\u662f\u53ef\u4ee5\u8c03\u7528\u7684\u3002 \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 \u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nimport cv2 as cv\nimport numpy as np\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\nif __name__ == \"__main__\":\nserver = ThreadXMLRPCServer((\"x.x.x.x\", 8889), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(match_image_by_opencv, \"match_image_by_opencv\")\nserver.serve_forever()\n \u8fd9\u6837\uff0c\u6211\u4eec\u57fa\u4e8e Python \u6807\u51c6\u5e93 xmlrpc \u642d\u5efa\u4e86\u4e00\u4e2a RPC \u670d\u52a1\u5668\uff0c\u6ce8\u518c\u4e86 image_put \u548c match_image_by_opencv \u4e24\u4e2a\u529f\u80fd\u63a5\u53e3\uff0c\u5728\u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u901a\u8fc7 IP \u548c\u7aef\u53e3\u8fdb\u884c RPC \u8bf7\u6c42\uff1b \u5ba2\u6237\u7aef\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from xmlrpc.client import Binary\nfrom xmlrpc.client import ServerProxy\nserver = ServerProxy(GlobalConfig.OPENCV_SERVER_HOST, allow_none=True)\nscreen_rb = open(screen, \"rb\")\ntemplate_rb = open(template_path, \"rb\")\ntry:\nscreen_path = server.image_put(Binary(screen_rb.read()))\nscreen_rb.close()\ntpl_path = server.image_put(Binary(template_rb.read()))\ntemplate_rb.close()\nreturn server.match_image_by_opencv(\ntpl_path, screen_path, rate, multiple\n)\nexcept OSError as exc:\nraise EnvironmentError(\nf\"RPC\u670d\u52a1\u5668\u94fe\u63a5\u5931\u8d25. {GlobalConfig.OPENCV_SERVER_HOST}\"\n) from exc\n \u901a\u8fc7\u8fd4\u56de server.match_image_by_opencv \u5c31\u83b7\u53d6\u4e86\u5728\u670d\u52a1\u7aef\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4","title":"4\u3001\u53f3\u952e\u83dc\u5355\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41","title":"4.1\u3001\u53f3\u952e\u83dc\u5355\u5b9a\u4f4d\u7684\u65b9\u6848\u53ca\u95ee\u9898","text":"\u53f3\u952e\u83dc\u5355\u7684\u5143\u7d20\u5b9a\u4f4d\u662f\u4e00\u4e2a\u96be\u70b9\uff0c\u8fc7\u53bb\u6211\u4eec\u8c03\u7814\u548c\u4f7f\u7528\u8fc7\u7684\u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u65b9\u6cd5\u6709 4 \u79cd\uff1a \u7b2c\u4e00\u79cd\uff1a\u6b65\u957f\u64cd\u4f5c\u6cd5 \u5728\u53f3\u952e\u83dc\u5355\u547c\u51fa\u6765\u4e4b\u540e\uff0c\u901a\u8fc7\u952e\u76d8\u7684 up\u3001down \u6309\u952e\uff0c\u8fdb\u884c\u9009\u62e9\u83dc\u5355\u9009\u62e9\uff0c\u9009\u4e2d\u76ee\u6807\u4e4b\u540e enter \u5373\u53ef\uff1b\u6bd4\u5982\uff1a\u5728\u684c\u9762\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\uff0c\u6309 1 \u6b21 down \uff0c\u4f1a\u51fa\u73b0\u4e0b\u56fe\uff1a \u7ee7\u7eed\u518d\u6309 2 \u6b21 down\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u518d\u6309 enter\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u5982\u6b64\uff0c\u201c\u6392\u5e8f\u65b9\u5f0f\u201d\u7684\u6b65\u957f\u4e3a 3\uff1b\u901a\u8fc7\u4f7f\u7528\u952e\u76d8\u4e0a\u4e0b\u952e\uff0c\u5c31\u5b9e\u73b0\u4e86\u5bf9\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\uff1b \u4f46\u662f\uff0c\u8fd9\u79cd\u65b9\u5f0f\u6709\u4e2a\u5f88\u70e6\u4eba\u7684\u95ee\u9898\uff0c\u5c31\u662f\u53f3\u952e\u83dc\u5355\u7684\u9009\u9879\u4f4d\u7f6e\u4e0d\u53ef\u80fd\u4e00\u76f4\u4e0d\u53d8\uff0c\u5728\u9700\u6c42\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\uff0c\u83dc\u5355\u9009\u9879\u7684\u53d8\u5316\u662f\u5f88\u5927\u7684\uff0c\u751a\u81f3\u6709\u4e9b\u5e94\u7528\u652f\u6301\u81ea\u5b9a\u4e49\u83dc\u5355\uff0c\u6bd4\u5982\u6587\u7ba1\u53f3\u952e\u83dc\u5355\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff1b \u4e5f\u5c31\u662f\u8bf4\u4f60\u5f97\u7ecf\u5e38\u53bb\u7ef4\u62a4\u83dc\u5355\u9009\u9879\u7684\u6b65\u957f\uff0c\u4e00\u4e2a\u9009\u9879\u73b0\u5728\u7684\u6b65\u957f\u662f 3\uff0c\u4e0b\u4e2a\u8fed\u4ee3\u53ef\u80fd\u5c31\u662f 4 \u6216\u8005 5\u3002 \u7b2c\u4e8c\u79cd\uff1a\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u6cd5 \u628a\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5355\u72ec\u622a\u56fe\u4fdd\u5b58\uff0c\u56fe\u7247\u4e2d\u4ec5\u5305\u542b\u4e00\u4e2a\u83dc\u5355\u9009\u9879\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u8fd9\u6837\uff0c\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5c31\u53ef\u4ee5\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u65b9\u5f0f\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u8fd9\u79cd\u65b9\u5f0f\u4e0d\u7528\u62c5\u5fc3\u83dc\u5355\u9009\u9879\u7684\u987a\u5e8f\u6216\u4f4d\u7f6e\uff0c\u4f46\u662f\u9700\u8981\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff0c\u4e14\u5bb9\u6613\u53d7\u5230\u5b57\u4f53 UI \u53d8\u66f4\u7c7b\u9700\u6c42\u7684\u5f71\u54cd\uff0c\u6bd4\u5982\uff1a\u5b57\u4f53\u5927\u5c0f\u3001\u5b57\u4f53\u95f4\u8ddd\u7b49\u7b49\u9700\u6c42\u53d8\u66f4\u90fd\u4f1a\u5f71\u54cd\uff0c\u6bcf\u6b21\u53d8\u66f4\u4e4b\u540e\u5c31\u9700\u8981\u8fdb\u884c\u5927\u91cf\u56fe\u7247\u8d44\u6e90\u7684\u91cd\u65b0\u622a\u56fe\u66ff\u6362\uff0c\u662f\u4e2a\u6bd4\u8f83\u9ebb\u70e6\u7684\u4e8b\u60c5\uff1b \u7b2c\u4e09\u79cd\uff1a\u76f8\u5bf9\u4f4d\u79fb\u6cd5 \u9f20\u6807\u70b9\u51fb\u53f3\u952e\u7684\u65f6\u5019\uff0c\u9f20\u6807\u7684\u5f53\u524d\u5750\u6807\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u7684\uff0c\u83dc\u5355\u9009\u9879\u7684\u5bbd\uff08 w \uff09\u4e00\u822c\u662f\u56fa\u5b9a\u7684\uff0c\u53d8\u5316\u7684\u662f\u83dc\u5355\u7684\u957f\u5ea6\uff08 h \uff09\uff0c\u53ef\u4ee5\u901a\u8fc7\u67d0\u4e2a\u9009\u9879\u76f8\u5bf9\u4e8e\u9f20\u6807\u7684\u8ddd\u79bb\u5728\u786e\u5b9a\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u901a\u8fc7\u7ef4\u62a4\u83dc\u5355\u9009\u9879\uff08\u76f8\u5bf9\u4f4d\u7f6e\uff09\u76f8\u5bf9\u4e8e\u9f20\u6807\u4f4d\u7f6e\u7684\u8ddd\u79bb\uff0c\u5373\u53ef\u8f7b\u677e\u8ba1\u7b97\u51fa\u83dc\u5355\u9009\u9879\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\u3002 \u4ece\u7406\u8bba\u4e0a\u6b64\u65b9\u6848\u662f\u53ef\u884c\u7684\uff0c\u4f46\u662f\u8fd9\u91cc\u4ecd\u7136\u5b58\u5728\u4e24\u4e2a\u4e25\u91cd\u7684\u95ee\u9898\uff1a \u83dc\u5355\u987a\u5e8f\u6539\u53d8\uff0c\u5bfc\u81f4\u76f8\u5bf9\u8ddd\u79bb\u6539\u53d8\uff0c\u800c\u4e14\u8ddd\u79bb\u662f\u901a\u8fc7\u50cf\u7d20\uff08px\uff09\u6765\u8868\u793a\u7684\uff0c\u4e0d\u60f3\u6b65\u957f\u90a3\u4e48\u53ea\u7ba1\uff0c\u6bcf\u6b21\u9700\u8981\u53bb\u91cf\u4e00\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u70b9\u9ebb\u70e6\uff1b \u9f20\u6807\u5728\u684c\u9762\u4e0d\u540c\u4f4d\u7f6e\u70b9\u51fb\u53f3\u952e\uff0c\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u4f4d\u7f6e\u662f\u4e0d\u540c\u7684\uff0c\u4e0a\u56fe\u7684\u83dc\u5355\u662f\u5728\u9f20\u6807\u7684\u5de6\u4e0b\u65b9\uff0c\u5982\u679c\u4f60\u79fb\u52a8\u9f20\u6807\u5230\u5c4f\u5e55\u56db\u8fb9\uff0c\u4f60\u4f1a\u53d1\u73b0\uff0c\u53f3\u952e\u83dc\u5355\u53ef\u80fd\u51fa\u73b0\u5728\u9f20\u6807\u7684\u56db\u4e2a\u65b9\u5411\uff0c\u4e5f\u5c31\u662f\u8bf4\u4f60\u9700\u8981\u6839\u636e\u9f20\u6807\u7684\u4e0d\u540c\u4f4d\u7f6e\u6765\u5224\u65ad\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u65b9\u5411\uff0c\u800c\u4e0d\u540c\u7684\u65b9\u5411\u4e0a\u8ba1\u7b97\u65b9\u6cd5\u662f\u4e0d\u540c\u7684\uff0c\u6bd4\u5982\uff1a\u53f3\u952e\u83dc\u5355\u5728\u9f20\u6807\u7684\u5de6\u4e0a\uff0c\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\u8ba1\u7b97\u65b9\u6cd5\u4e3a\uff08x - w / 2\uff0c y - h\uff09\uff0c\u8fd9\u6837\u7ef4\u62a4\u8d77\u6765\u53ef\u4ee5\u8bf4\u975e\u5e38\u590d\u6742\uff1b \u57fa\u4e8e\u4ee5\u4e0a\u4e24\u4e2a\u539f\u56e0\uff0c\u6211\u4eec\u5e76\u4e0d\u63a8\u8350\u8fd9\u79cd\u64cd\u4f5c\u65b9\u6848\u3002 \u7b2c\u56db\u79cd\uff1a\u5c5e\u6027\u5b9a\u4f4d \u6709\u540c\u5b66\u8bf4\u5e72\u561b\u4e0d\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u5462\uff0c\u5176\u5b9e\uff0c\u6211\u4eec\u6700\u5f00\u59cb\u60f3\u5230\u7684\u65b9\u6848\u5c31\u662f\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\uff0c\u4f46\u662f\u5728\u5c5e\u6027\u7684 DOM \u6811\u91cc\u600e\u4e48\u4e5f\u627e\u4e0d\u5230\uff0c\u65e0\u6cd5\u5b9a\u4f4d\u5230\uff0c\u6211\u4eec\u4e5f\u8054\u5408\u7814\u53d1\u540c\u5b66\u4e00\u8d77\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u4f46\u6700\u7ec8\u8fd8\u662f\u6ca1\u80fd\u89e3\u51b3\uff0c\u975e\u5e38\u9057\u61be\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42","title":"4.2\u3001\u6700\u65b0\u7684\u53f3\u952e\u83dc\u5355\u7ec8\u6781\u89e3\u51b3\u65b9\u6848","text":"\u7531\u4e8e\u53f3\u952e\u83dc\u5355\u9009\u9879\u51e0\u4e4e\u90fd\u662f\u6587\u672c\uff0c\u90a3\u4e48\u901a\u8fc7 OCR \u8bc6\u522b\uff0c\u51e0\u4e4e\u662f\u6700\u4f18\u7684\u65b9\u6848\uff1a \u4e0d\u7528\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff1b \u4e0d\u4f1a\u53d7\u5230\u83dc\u5355\u9009\u9879\u987a\u5e8f\u6539\u53d8\u7684\u5f71\u54cd\uff1b \u4e0d\u4f1a\u53d7\u5230\u5b57\u4f53 UI \u53d8\u5316\u7684\u5f71\u54cd\uff1b \u5173\u4e8e OCR \u8bc6\u522b\u6211\u4eec\u5728\u540e\u9762\u4f1a\u8be6\u7ec6\u8bb2\u5230\uff0c\u672c\u7ae0\u8282\u4e3b\u8981\u8bb2\u57fa\u4e8e OCR \u8bc6\u522b\uff0c\u6211\u4eec\u5728\u53f3\u952e\u83dc\u5355\u8bc6\u522b\u4e0a\u7684\u7a81\u7834\u548c\u521b\u65b0\uff1b \u4f7f\u7528 OCR \u8bc6\u522b\u53f3\u952e\u83dc\u5355\u867d\u7136\u5df2\u7ecf\u5f88\u5b8c\u7f8e\u4e86\uff0c\u4f46\u662f\u5728\u4e00\u4e9b\u60c5\u51b5\u4e0b\u4ecd\u7136\u5b58\u5728\u4e00\u70b9\u95ee\u9898\uff0c\u5c31\u662f\u5c4f\u5e55\u4e2d\u51fa\u73b0\u591a\u4e2a\u548c\u83dc\u5355\u9009\u9879\u6587\u5b57\u76f8\u540c\u7684\u6587\u5b57\u65f6\uff0c\u6bd4\u5982\u4e0b\u9762\u8fd9\u79cd\u60c5\u51b5\uff1a \u5c4f\u5e55\u6070\u597d\u51fa\u73b0\u4e86\u4e24\u4e2a\u201c\u590d\u5236\u201d\uff0c\u6b64\u65f6\u8981\u5b9a\u4f4d\u5230\u83dc\u5355\u4e2d\u7684 \u201c\u590d\u5236\u201d\uff0c\u5c31\u9700\u8981\u8fdb\u4e00\u6b65\u505a\u6570\u636e\u5904\u7406\uff0c\u6bd4\u5982\uff1aOCR \u8fd4\u56de 2 \u4e2a\u201c\u590d\u5236\u201d\u7684\u5750\u6807\uff0c\u7528\u4f8b\u91cc\u9762\u6765\u5224\u65ad\u7528\u54ea\u4e2a\uff0c\u4ece\u4e1a\u52a1\u4e0a\u5c06\u5904\u7406\u8d77\u6765\u6bd4\u8f83\u9ebb\u70e6\uff0c\u56e0\u4e3a\u4f60\u5f97\u660e\u786e\u77e5\u9053\u83dc\u5355\u5728\u5de6\u8fb9\u8fd8\u662f\u53f3\u8fb9\uff0c\u7136\u540e\u8fd9\u672c\u8eab\u5c31\u662f\u4e0d\u786e\u5b9a\u7684\uff1b \u600e\u4e48\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u5462\uff0c\u8fd9\u5c31\u8981\u8bf4\u9053\u672c\u7ae0\u7684\u4e3b\u9898\uff1a\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b\u3002 \u3010\u539f\u7406\u3011 \u5728\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u524d\u622a\u4e00\u5f20\u56fe\uff0c\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\u518d\u622a\u53d6\u4e00\u5f20\u56fe\uff0c\u4e24\u5f20\u56fe\u552f\u4e00\u53d8\u5316\u7684\u5c31\u662f\u53f3\u952e\u83dc\u5355\uff0c\u5c06\u5176\u4ed6\u76f8\u540c\u7684\u5730\u65b9\u90fd\u5c4f\u853d\u6389\uff0c\u53ea\u7559\u4e0b\u83dc\u5355\u754c\u9762\uff0c\u5982\u6b64\u5373\u53ef\u6d88\u9664\u5e72\u6270\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u5c06\u4e24\u79cd\u56fe\u505a\u524d\u540e\u5bf9\u6bd4\u63d0\u53d6\u53ef\u4ee5\u5f97\u5230\u8fd9\u6837\u7684\u56fe\uff1a \u4f60\u770b\uff0c\u901a\u8fc7\u524d\u540e\u56fe\u7247\u7684\u5bf9\u6bd4\uff0c\u5c06\u76f8\u540c\u7684\u90e8\u5206\u7ed9\u6d88\u9664\u6389\uff0c\u518d\u8fdb\u884c OCR \u8bc6\u522b\uff0c\u8fd9\u6837\u5c31\u4e0d\u4f1a\u6709\u5e72\u6270\u4e86\uff1b \u4ee3\u7801\u5b9e\u73b0\u8bf7\u67e5\u770b src/filter_image.py \uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def filter_image(action):\n\"\"\"\n \u5bf9\u6bd4\u52a8\u4f5c\u524d\u540e\u4e24\u5f20\u56fe\u7247\uff0c\u63d0\u53d6\u4e0d\u540c\u7684\u90e8\u5206\u751f\u6210\u4e00\u5f20\u65b0\u7684\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u65b0\u56fe\u7247\u7684\u8def\u5f84\n :param action: \u52a8\u4f5c\u51fd\u6570\u7684\u51fd\u6570\u5bf9\u8c61\n :return: \u65b0\u56fe\u7247\u7684\u8def\u5f84\n \"\"\"\n action \u662f\u9f20\u6807\u4e8b\u4ef6\uff0c\u56e0\u4e3a\u6b64\u7c7b\u573a\u666f\u4e0d\u4ec5\u4ec5\u5728\u53f3\u952e\u5b58\u5728\uff0c\u5355\u51fb\u3001\u53cc\u51fb\u7b49\u7b49\uff0c\u53ea\u8981\u64cd\u4f5c\u524d\u540e\u540e\u53d8\u5316\u7684\u90fd\u53ef\u4ee5\uff1a from src.mouse_key import MouseKey\naction = (\nMouseKey.click,\nMouseKey.right_click,\nMouseKey.double_click,\nMouseKey.move_to,\n)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5","title":"5\u3001\u52a8\u6001\u56fe\u50cf\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5728\u684c\u9762\u58c1\u7eb8\u5207\u6362\uff0c\u6216\u770b\u56fe\u3001\u76f8\u518c\u5207\u6362\u56fe\u7247\u7c7b\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u7531\u4e8e\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u662f\u4e0d\u56fa\u5b9a\u7684\uff08\u4e0d\u540c\u7248\u672c\u7684\u7cfb\u7edf\u58c1\u7eb8\u4e0d\u540c\u3001\u58c1\u7eb8\u987a\u5e8f\u4e0d\u540c\uff0c\u770b\u56fe\u76f8\u518c\u5728\u56fe\u7247\u8d44\u6e90\u4e0d\u4e00\u5b9a\u56fa\u5b9a\uff09\uff0c\u90a3\u4e48\u5728\u6d4b\u8bd5\u5207\u6362\u58c1\u7eb8\u6216\u8005\u5207\u6362\u56fe\u7247\u7684\u573a\u666f\u65f6\u5c31\u4f1a\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u4f60\u4e0d\u77e5\u9053\u9884\u671f\u662f\u5565\uff0c\u7528\u4f8b\u64cd\u4f5c\u52a8\u6001\u7684\uff0c\u4e5f\u662f\u6781\u4e0d\u7a33\u5b9a\u3002 \u3010\u539f\u7406\u3011 \u5728\u5207\u6362\u56fe\u7247\u4e4b\u524d\u622a\u56fe\u4fdd\u5b58\u5e76\u8fd4\u56de\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u6b21\u8bc6\u522b\u8fd9\u5f20\u56fe\u7247\uff0c\u5982\u679c\u4e0d\u5b58\u5728\uff0c\u8bf4\u660e\u56fe\u7247\u5df2\u7ecf\u5207\u6362\u4e86\uff1b \u793a\u610f\u56fe\uff1a \u8fd9\u6837\uff0c\u6211\u4eec\u622a\u53d6\u4e86\u5f53\u524d\u56fe\u7247\u4e2d\u6bd4\u8f83\u6709\u4ee3\u8868\u6027\u7684\u4f4d\u7f6e\uff08\u4e00\u53ea\u9e1f\uff09\uff0c\u5728\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u7528\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1a \u6211\u4eec\u518d\u62ff\u7740\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd9\u6837\u5728\u5f53\u524d\u56fe\u7247\u4e2d\uff0c\u5c31\u4e0d\u80fd\u627e\u5230\u8fd9\u53ea\u9e1f\u4e86\uff0c\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u662f False\uff0c\u90a3\u4e48\u4e5f\u5c31\u53ef\u4ee5\u5224\u65ad\u56fe\u7247\u5207\u6362\u662f\u6210\u529f\u7684\u3002 \u4ee3\u7801\u793a\u610f\uff1a def save_temporary_picture(_x: int, _y: int, width: int, height: int):\n\"\"\"\n \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u56fe\u7247\u8def\u5f84\n :param x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n :param y: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n :param width: \u5bbd\u5ea6\n :param height: \u9ad8\u5ea6\n :return: \u56fe\u7247\u8def\u5f84\n \"\"\"\n \u6b64\u51fd\u6570\u7528\u4e8e\u5728\u64cd\u4f5c\u4e4b\u524d\u622a\u56fe\u4e00\u5f20\u4e34\u65f6\u56fe\u7247\uff0c\u8fd4\u56de\u56fe\u7247\u8def\u5f84\uff0c\u6700\u540e\u5728\u65ad\u8a00\u7684\u65f6\u5019\u518d\u5c06\u56fe\u7247\u8def\u5f84\u4f5c\u4e3a\u53c2\u6570\u4f20\u5165\u65ad\u8a00\u8bed\u53e5\u5373\u53ef\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ui","title":"\u4e09\u3001\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_1","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u662f\u6211\u4eec\u81ea\u7814\u7684\u4e00\u79cd\u4f7f\u7528\u7b80\u5355\uff0c\u4e14\u6548\u7387\u6781\u9ad8\u3001\u7a33\u5b9a\u6027\u597d\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u57fa\u4e8e\u5143\u7d20\u6309\u94ae\u5728\u5e94\u7528\u4e2d\u7684\u76f8\u5bf9\u4f4d\u7f6e\uff0c\u52a8\u6001\u83b7\u53d6\u5143\u7d20\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff0c\u9002\u7528\u4e8e\u5404\u79cd\u5c4f\u5e55\u5206\u8fa8\u7387\uff08\u5305\u62ec\u9ad8\u5206\u5c4f\u3001\u5bbd\u5c4f\u3001\u5e26\u9c7c\u5c4f\uff09\uff0c\u5f53\u5143\u7d20\u6309\u94ae\u4f4d\u7f6e\u76f8\u5bf9\u4e8e\u5e94\u7528\u754c\u9762\u4f4d\u7f6e\u53d1\u751f\u4fee\u6539\u4e4b\u540e\uff0c\u53ea\u9700\u8981\u6839\u636e UI \u8bbe\u8ba1\u56fe\u4e0a\u7684\u6e90\u6570\u636e\u4fee\u6539\u5bf9\u5e94\u5750\u6807\u6570\u636e\u5c31\u597d\uff0c\u7ef4\u62a4\u975e\u5e38\u7684\u65b9\u4fbf\u3002 \u6b64\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u9002\u7528\u4e8e\u4e00\u4e9b\u5143\u7d20\u4f4d\u7f6e\u76f8\u5bf9\u4e0e\u5e94\u7528\u754c\u9762\u6bd4\u8f83\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u97f3\u4e50\uff0899% \u7684\u5143\u7d20\u5b9a\u4f4d\u91c7\u7528\u8fd9\u79cd\uff0c\u6548\u679c\u975e\u5e38\u597d\uff09\uff0c\u4e0d\u9002\u7528\u4e8e\u754c\u9762\u4e0d\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u622a\u56fe\u5f55\u5c4f\uff0c\u5f88\u660e\u663e\u4e0d\u9002\u7528\u4e8e\u8fd9\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u3002\u8fd9\u79cd\u5168\u65b0\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u6709\u5b83\u7684\u9002\u7528\u6761\u4ef6\uff0c\u5982\u679c\u4f60\u53d1\u73b0\u4f7f\u7528\u5e38\u89c4\u7684\uff08\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u5b9a\u4f4d\uff09\u4e0d\u597d\u505a\u65f6\uff0c\u4e0d\u59a8\u8003\u8651\u4f7f\u7528\u8fd9\u79cd\uff0c\u5176\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff0c\u5e76\u4e14\u8fc5\u901f\u7231\u4e0a\u4ed6\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_1","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5728 UI \u8bbe\u8ba1\u56fe\u4e2d\u6211\u4eec\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u8fb9\u6846\u7684\u8ddd\u79bb\u7684\uff0c\u7136\u540e\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u6280\u672f\u624b\u6bb5\u83b7\u53d6\u5230\u5e94\u7528\u754c\u9762\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u53ca\u5e94\u7528\u7a97\u53e3\u7684\u5927\u5c0f\uff0c\u793a\u610f\u56fe\u5982\u4e0b\uff1a \uff08x1, y1\uff09\u4e3a\u5e94\u7528\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\uff1b\uff08x2, y2\uff09\u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u5de6\u4e0a\u89d2\uff08x1, y1\uff09\u7684\u5750\u6807\uff0c\u90a3\u4e48\u5b9e\u9645\u4e0a\u3010\u64ad\u653e\u6240\u6709\u3011\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\u4e3a\uff1a\uff08 x1 + x2, y1 + y2 \uff09\uff1b \u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5927\u5c0f\uff08w2, h2\uff09\uff0c\u53ef\u4ee5\u4ece UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\uff1b \u5728 UI \u8bbe\u8ba1\u7a3f\u4e0a\u70b9\u51fb\u3010\u64ad\u653e\u6240\u6709\u3011\u56fe\u6807\uff0c\u7136\u540e\u79fb\u52a8\u9f20\u6807\u5c31\u5c31\u53ef\u4ee5\u770b\u5230\u4e0a\u56fe\u7684\u53c2\u8003\u7ebf\u53ca\u6570\u636e\uff1b \u6240\u4ee5\uff0c\u6211\u4eec\u53ef\u4ee5\u8f7b\u677e\u7684\u83b7\u53d6\u5230\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u4e2d\u5fc3\u5750\u6807\u4e3a\uff1a\uff08 x1 + x2 + (w2 / 2), y1 + y2 + ( h2 / 2) \uff09 \u8be6\u7ec6\u6e90\u4ee3\u7801\u8bf7\u67e5\u770b AT \u57fa\u7840\u6846\u67b6: src/button_center.py \u83b7\u53d6\u5e94\u7528\u7a97\u53e3\u7684\u4fe1\u606f \u4f7f\u7528 xdotool \u548c xwininfo \u83b7\u53d6\u5230\u5e94\u7528\u7a97\u53e3\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u5de6\u4e0a\u89d2\uff09\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a app_id = CmdCtl.run_cmd(f\"xdotool search --classname --onlyvisible {self.app_name}\"\n).split(\"\\n\")\napp_id_list = [int(_id) for _id in app_id if _id]\nreturn CmdCtl.run_cmd(f\"xwininfo -id {app_id_list[self.number]}\")\n \u4f7f\u7528\u6b63\u5219\u83b7\u53d6\u7a97\u53e3\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u83b7\u53d6\u914d\u7f6e \u8bfb ini \u914d\u7f6e\u6587\u4ef6\uff0c\u83b7\u53d6\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e0e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a conf = ConfigParser()\nconf.read(self.config_path)\ndirection = conf.get(btn_name, \"direction\")\nposition = [int(i.strip()) for i in conf.get(btn_name, \"location\").split(\",\")]\n \u8ba1\u7b97\u5143\u7d20\u6309\u94ae\u5750\u6807 \u6839\u636e\u5e94\u7528\u7a97\u53e3\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u5927\u5c0f\u3001\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u5927\u5c0f\uff0c\u4f7f\u7528\u4e00\u5b9a\u7684\u7b97\u6cd5\u5373\u53ef\u8ba1\u7b97\u51fa\u5143\u7d20\u6309\u94ae\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u4e2d\u5fc3\u5750\u6807\uff09\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3","title":"3\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u3010\u914d\u7f6e\u65b9\u6cd5\u3011 \u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u7684\u6570\u636e\u6e90\u662f\u5e94\u7528\u5e93\u4e2d\u7684 ui.ini \u914d\u7f6e\u6587\u4ef6\uff1a ;section\n[\u65b0\u5efa\u6b4c\u5355+] ;key = value\ndirection = left_top\nlocation = 180, 268, 21, 21\n section \u662f\u4f60\u6839\u636e\u5bf9\u5e94\u7684\u5143\u7d20\u6309\u94ae\u547d\u540d\uff0c\u4f60\u53ef\u4ee5\u4efb\u610f\u547d\u540d\uff0c\u4f46\u6700\u597d\u6709\u5177\u4f53\u542b\u4e49\uff0c\u4e14\u80fd\u660e\u786e\u8868\u793a\u8fd9\u4e2a\u5143\u7d20\u6309\u94ae\u7684\u540d\u79f0\uff1b\u7528\u4e2d\u62ec\u53f7\u62ec\u8d77\u6765\u5c31\u884c\uff0c\u6bd4\u5982\uff1a[\u65b0\u5efa\u6b4c\u5355+] \uff1b direction \u662f\u914d\u7f6e\u8be5\u5143\u7d20\u7684\u53c2\u8003\u7cfb\uff0c\u5206\u522b\u4e3a\uff1a left_top \u5de6\u4e0a\uff1b left_bottom \u5de6\u4e0b\uff1b right_top \u53f3\u4e0a\uff1b right_bottom \u53f3\u4e0b\uff1b \u53c2\u8003\u7cfb\u7684\u9009\u53d6\u6807\u51c6\uff1a\u62c9\u52a8\u6539\u53d8\u7a97\u53e3\u5927\u5c0f\u65f6\uff0c\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u53c2\u8003\u7cfb\u4f4d\u7f6e\u662f\u4e0d\u53d8\u7684\uff1b location \u662f\u8be5\u5143\u7d20\u6309\u94ae\u7684\u76f8\u5bf9\u4e0e\u53c2\u8003\u7cfb\u7684 x, y \u7684\u8ddd\u79bb\uff0c\u53ca\u5927\u5c0f(w, h)\uff0c\u8fd9\u56db\u4e2a\u6570\u636e\u53ef\u4ee5\u901a\u8fc7 UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\u6570\u636e\uff0c\u5728\u7f16\u8f91\u6a21\u5f0f\u4e0b\uff0c\u70b9\u51fb UI \u56fe\u4e0a\u7684\u6309\u94ae\uff0c\u53f3\u4fa7\u5c31\u4f1a\u51fa\u73b0\u8be5\u5143\u7d20\u6309\u94ae\u7684 x, y, w, h \u6570\u636e\u3002 \u5982\u679c UI \u56fe\u4e0a\u6ca1\u6709\u63d0\u4f9b\u4f60\u60f3\u8981\u7684\u5143\u7d20\u6570\u636e\uff0c\u4f60\u53ef\u4ee5\u76f4\u63a5\u5728\u7cfb\u7edf\u4e2d\u4f7f\u7528\u622a\u56fe\u5f55\u5c4f\u8fdb\u884c\u5c3a\u91cf\uff0c\u8fd9\u662f\u4e00\u79cd\u4e0d\u63a8\u8350\u4f46\u80fd\u7528\u7684\u65b9\u6cd5\u3002 \u3010\u8c03\u7528\u65b9\u6cd5\u3011 \u5728\u5e94\u7528\u5e93\u65b9\u6cd5\u5c42\u8fd9\u6837\u5199\uff1a def click_add_music_list_btn_in_music_by_ui(self):\n\"\"\"\u70b9\u51fb\u65b0\u5efa\u6b4c\u5355\u6309\u94ae\"\"\"\nself.click(*self.ui.btn_center(\"\u65b0\u5efa\u6b4c\u5355+\"))\n self.ui.btn_center() \u662f\u56fa\u5b9a\u5199\u6cd5\uff0c\u53c2\u6570\u5c31\u662f\u914d\u7f6e\u91cc\u9762\u7684 section \u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ocr","title":"\u56db\u3001OCR \u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_2","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 OCR \u65b9\u6848\u5927\u591a\u91c7\u7528\u8c37\u6b4c OCR\uff08Tesseract\uff09\u65b9\u6848\uff0c\u4f46\u662f\u5b83\u5bf9\u4e8e\u4e2d\u6587\u7684\u8bc6\u522b\u975e\u5e38\u5dee\uff0c\u7ecf\u8fc7\u5927\u91cf\u7684\u8c03\u7814\uff0c\u6211\u4eec\u4f7f\u7528 PaddleOCR\uff0c\u5b83\u662f\u4e00\u4e2a\u5f00\u6e90\u7684\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u8bc6\u522b\u5de5\u5177\uff0c\u4e5f\u662f PaddlePaddle \u6700\u6709\u540d\u7684\u4e00\u4e2a\u5f00\u6e90\u9879\u76ee\uff0c\u611f\u5174\u8da3\u7684\u53ef\u4ee5\u70b9\u8fd9\u91cc\u4e86\u89e3\uff0c\u591a\u7684\u4e0d\u8bf4\u4e86\uff0c\u4f60\u53ea\u9700\u8981\u77e5\u9053\u5b83\u5c31\u662f\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_2","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5b89\u88c5\u4ed6\u662f\u4e2a\u5f88\u9ebb\u70e6\u7684\u4e8b\u60c5\uff0c\u867d\u7136\u64cd\u4f5c\u5f88\u7b80\u5355\uff0c\u4f46\u5176\u5b9e\u5b89\u88c5\u5305\u6709\u70b9\u5927\uff0c\u56e0\u6b64\u6211\u4eec\u4e0d\u5e0c\u671b\u76f4\u63a5\u5728 env.sh \u4e2d\u52a0\u5165\u5b83\uff0c\u8fd9\u4f1a\u8ba9\u6574\u4e2a\u81ea\u52a8\u5316\u73af\u5883\u53d8\u5f97\u975e\u5e38\u81c3\u80bf\uff1b \u56e0\u6b64\uff0c\u6211\u4eec\u60f3\u5230\u5c06\u5b83\u505a\u6210\u4e00\u4e2a RPC \u670d\u52a1\u5728\u5176\u4ed6\u673a\u5668\u4e0a\u90e8\u7f72\uff0c\u6d4b\u8bd5\u673a\u901a\u8fc7\u8fdc\u7a0b\u8c03\u7528 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u4f7f\u7528\u5b83\uff1b RPC \u7684\u8c03\u7528\u903b\u8f91\uff1a \u8fd9\u6837\u6211\u4eec\u53ea\u9700\u8981\u5728\u670d\u52a1\u7aef\u90e8\u7f72\u597d OCR \u8bc6\u522b\u7684\u670d\u52a1\uff0c\u7136\u540e\u901a\u8fc7 RPC \u670d\u52a1\u5c06\u529f\u80fd\u63d0\u4f9b\u51fa\u6765\uff0c\u6846\u67b6\u91cc\u9762\u53ea\u9700\u8981\u8c03\u7528\u5bf9\u5e94\u7684 RPC \u63a5\u53e3\u5c31\u884c\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_1","title":"3\u3001\u4f7f\u7528\u8bf4\u660e","text":"\u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nfrom paddleocr import PaddleOCR\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef paddle_ocr(pic_path, lang):\n\"\"\"\n Paddleocr\u76ee\u524d\u652f\u6301\u7684\u591a\u8bed\u8a00\u8bed\u79cd\u53ef\u4ee5\u901a\u8fc7\u4fee\u6539lang\u53c2\u6570\u8fdb\u884c\u5207\u6362\n \u4f8b\u5982`ch`, `en`, `fr`, `german`, `korean`, `japan`\n :param file_name:\n :param lang:\n :return:\n \"\"\"\nif __name__ == \"__main__\":\nIP = popen(\"hostname -I\").read().split(\" \")[0]\nPORT = 8890\nSCREEN_CACHE = \"/tmp/screen.png\"\nserver = ThreadXMLRPCServer((IP, PORT), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(paddle_ocr, \"paddle_ocr\")\nprint(\"\u76d1\u542c\u5ba2\u6237\u7aef\u8bf7\u6c42\u3002\u3002\")\nserver.serve_forever()\n \u6846\u67b6\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from src import OCR\nOCR.ocr(*target_strings, picture_abspath=None, similarity=0.6, return_default=False, return_first=False, lang=\"ch\"):\n# \u901a\u8fc7 OCR \u8fdb\u884c\u8bc6\u522b\u3002\n# target_strings:\n# \u76ee\u6807\u5b57\u7b26,\u8bc6\u522b\u4e00\u4e2a\u5b57\u7b26\u4e32\u6216\u591a\u4e2a\u5b57\u7b26\u4e32,\u5e76\u8fd4\u56de\u5176\u5728\u56fe\u7247\u4e2d\u7684\u5750\u6807;\n# \u5982\u679c\u4e0d\u4f20\u53c2\uff0c\u8fd4\u56de\u56fe\u7247\u4e2d\u8bc6\u522b\u5230\u7684\u6240\u6709\u5b57\u7b26\u4e32\u3002\n# picture_abspath: \u8981\u8bc6\u522b\u7684\u56fe\u7247\u8def\u5f84\uff0c\u5982\u679c\u4e0d\u4f20\u9ed8\u8ba4\u622a\u53d6\u5168\u5c4f\u8bc6\u522b\u3002\n# similarity: \u5339\u914d\u5ea6\u3002\n# return_default: \u8fd4\u56de\u8bc6\u522b\u7684\u539f\u751f\u6570\u636e\u3002\n# return_first: \u53ea\u8fd4\u56de\u7b2c\u4e00\u4e2a,\u9ed8\u8ba4\u4e3a False,\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u6240\u6709\u6570\u636e\u3002\n# lang: `ch`, `en`, `fr`, `german`, `korean`, `japan`\n \u6b64\u65b9\u6848\u5728\u6846\u67b6\u5185\u6ca1\u6709\u5f15\u5165\u4efb\u4f55\u4e09\u65b9\u4f9d\u8d56\u5b8c\u5168\u91c7\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\uff0c\u800c\u4e14\u4f7f\u7528\u65b9\u6cd5\u975e\u5e38\u7b80\u5355\uff0c\u53ea\u9700\u8981\u901a\u8fc7 OCR.ocr() \u5373\u53ef\uff1b \u5bf9\u4e8e\u4e00\u4e9b\u6587\u6848\u7684\u573a\u666f\u975e\u5e38\u9002\u7528\uff0c\u6b64\u65b9\u6cd5\u76f4\u63a5\u8fd4\u56de\u5750\u6807\uff0c\u53ef\u4ee5\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u3002 \u4e5f\u53ef\u4ee5\u7528\u4e8e\u6587\u5b57\u65ad\u8a00\uff0c\u4ee3\u7801\u793a\u610f\uff1a def assert_ocr_exist(\n*args, picture_abspath=None, similarity=0.6, return_first=False, lang=\"ch\"\n):\n\"\"\"\u65ad\u8a00\u6587\u6848\u5b58\u5728\"\"\"\npic = None\nif picture_abspath is not None:\npic = picture_abspath + \".png\"\nres = OCR.ocr(\n*args,\npicture_abspath=pic,\nsimilarity=similarity,\nreturn_first=return_first,\nlang=lang,\n)\nif res is False:\nraise AssertionError(\n(f\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{args}\", f\"{pic if pic else GlobalConfig.SCREEN_CACHE}\")\n)\nif isinstance(res, tuple):\npass\nelif isinstance(res, dict) and False in res.values():\nres = filter(lambda x: x[1] is False, res.items())\nraise AssertionError(\n(\nf\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{dict(res)}\",\nf\"{pic if pic else GlobalConfig.SCREEN_CACHE}\",\n)\n)\n \u5728\u7528\u4f8b\u4e2d\u4f7f\u7528\u65ad\u8a00\uff0c\u793a\u4f8b\uff1a def test_font_manager_021(self):\n\"\"\"\u53f3\u4fa7\u2665-\u6536\u85cf/\u53d6\u6d88\u6536\u85cf\u5b57\u4f53\"\"\"\n# \u5b57\u4f53\u7ba1\u7406\u5668\u754c\u9762\u53f3\u4fa7\u8be6\u60c5\u5217\u8868\uff0c\u9009\u62e9\u672a\u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e / \u6536\u85cf\u5b57\u4f53\n# \u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e\u83dc\u5355\u663e\u793a\u201c\u53d6\u6d88\u6536\u85cf\u201d\uff1b\n...\nself.assert_ocr_exist(\"\u53d6\u6d88\u6536\u85cf\")\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_1","title":"4\u3001\u670d\u52a1\u7aef\u90e8\u7f72","text":"\u6211\u4eec\u76ee\u524d\u662f\u5c06 OCR \u670d\u52a1\u90e8\u7f72\u5728\u666e\u901a\u7684\u529e\u516c\u673a\u4e0a\u7684\uff0c\u5982\u679c\u4f60\u89c9\u5f97\u73b0\u6709\u7684 OCR \u8bc6\u522b\u6027\u80fd\u4e0d\u591f\u597d\uff0c\u6070\u597d\u4f60\u6709\u66f4\u597d\u7684\u673a\u5668\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u5176\u79c1\u6709\u5316\u90e8\u7f72\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41_1","title":"4.1\u3001\u73af\u5883\u5b89\u88c5","text":"\u63a8\u8350\u4f7f\u7528 pipenv \u8fdb\u884c\u73af\u5883\u642d\u5efa\uff1b \u5b89\u88c5 pipenv \uff1a sudo pip3 install pipenv\n \u65b0\u5efa\u4e00\u4e2a\u76ee\u5f55\u4f5c\u4e3a\u73af\u5883\u5305 ocr_env\uff1a cd ~\nmkdir ocr_env\n \u521b\u5efa python 3.7 \u73af\u5883\uff1a cd ocr_env\npipenv --python 3.7\n \u5b89\u88c5 OCR \u4f9d\u8d56\u5305\uff1a pipenv install paddlepaddle -i https://mirror.baidu.com/pypi/simple\npipenv install \"paddleocr>=2.0.1\" -i https://mirror.baidu.com/pypi/simple\n \u4e0d\u51fa\u610f\u5916\uff0c\u8fd9\u6837\u5c31\u628a\u4f9d\u8d56\u5b89\u88c5\u597d\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42_1","title":"4.2\u3001\u542f\u52a8\u670d\u52a1","text":"\u5c06\u57fa\u7840\u6846\u67b6\u4e2d\u7684 scr/ocr/pdocr_rpc_server.py \u6587\u4ef6\u62f7\u8d1d\u5230 ocr_env \u76ee\u5f55\uff0c\u540e\u53f0\u6267\u884c\u5b83\u5c31\u597d\u4e86\uff1a cd ocr_env\nnohup pipenv run python pdocr_rpc_server.py &\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#43","title":"4.3\u3001\u914d\u7f6e\u5f00\u673a\u81ea\u542f\uff08\u901a\u7528\uff09","text":"\u4f60\u80af\u5b9a\u4e0d\u60f3\u6bcf\u6b21\u673a\u5668\u91cd\u542f\u4e4b\u540e\u90fd\u9700\u8981\u624b\u52a8\u542f\u52a8\u670d\u52a1\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u914d\u7f6e\u5f00\u673a\u81ea\u542f\u3002 \u5199\u5f00\u673a\u81ea\u542f\u670d\u52a1\u6587\u4ef6\uff1a sudo vim /lib/systemd/system/ocr.service\n autoocr \u540d\u79f0\u4f60\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff0c\u5199\u5165\u4ee5\u4e0b\u5185\u5bb9\uff1a [Unit]\nDescription=OCR Service\nAfter=multi-user.target\n\n[Service]\nUser=uos\nGroup=uos\nType=idle\nWorkingDirectory=/home/uos/ocr_env\nExecStart=pipenv run python pdocr_rpc_server.py\n\n[Install]\nWantedBy=multi-user.target\n \u6ce8\u610f\u66ff\u6362\u4f60\u7684${USER} \u4fee\u6539\u914d\u7f6e\u6587\u4ef6\u7684\u6743\u9650\uff1a sudo chmod 644 /lib/systemd/system/ocr.service\n \u81ea\u542f\u670d\u52a1\u751f\u6548\uff1a sudo systemctl daemon-reload\nsudo systemctl enable ocr.service\n \u67e5\u770b\u670d\u52a1\u72b6\u6001\uff1a sudo systemctl status ocr.service\n \u4f60\u53ef\u4ee5\u518d\u91cd\u542f\u4e0b\u7535\u8111\uff0c\u770b\u770b\u670d\u52a1\u662f\u4e0d\u662f\u6b63\u5e38\u542f\u52a8\u4e86\uff0c\u6ca1\u62a5\u9519\u5c31 OK \u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_4","title":"\u4e94\u3001\u5c5e\u6027\u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_3","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 UI \u81ea\u52a8\u5316\u5927\u591a\u90fd\u662f\u57fa\u4e8e\u6d4f\u89c8\u5668\u7684\uff0c\u6838\u5fc3\u662f\u5728\u7f51\u9875\u7684 DOM \u6811\u4e0a\u67e5\u627e\u5143\u7d20\uff0c\u5e76\u5bf9\u5176\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\uff1b Linux \u684c\u9762\u5e94\u7528\u5927\u591a\u662f\u91c7\u7528 Qt \u7f16\u5199\u7684\uff0c\u5728 Qt \u4e2d\u4e5f\u662f\u4ece\u6700\u9876\u5c42\u7684 MainWindow \u5f00\u59cb\u6784\u5efa\u5e94\u7528\uff0c\u6240\u4ee5\u903b\u8f91\u4e5f\u662f\u4e00\u6837\u7684\uff0cQt \u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u540c\u6837\u53ef\u4ee5\u901a\u8fc7 DOM \u6811\uff08\u5c5e\u6027\u6811\uff09\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff0c\u6211\u4eec\u79f0\u4e4b\u4e3a\u5c5e\u6027\u5b9a\u4f4d\u3002 \u501f\u52a9\u5f00\u6e90\u5de5\u5177 dogtail \u6211\u4eec\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u83b7\u53d6\uff0c\u4ece\u800c\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\u3002dogtail \u7684\u9879\u76ee\u4ecb\u7ecd\u53ef\u4ee5\u731b\u6233\u8fd9\u91cc\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_3","title":"2\u3001\u4f7f\u7528\u65b9\u6cd5","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#21sniff","title":"2.1\u3001sniff\uff08\u55c5\u63a2\u5668\uff09\u4f7f\u7528","text":"\u5728\u7ec8\u7aef\u8f93\u5165 sniff \u542f\u52a8 AT-SPI Browser mikigo@mikigo-PC:~$ sniff\n \u67e5\u770b\u5e94\u7528\u7684\u6807\u7b7e \u5728 sniff \u91cc\u9762\u53ef\u4ee5\u770b\u5230\u7cfb\u7edf\u4e2d\u5df2\u542f\u52a8\u7684\u5e94\u7528\uff0c\u70b9\u51fb\u5e94\u7528\u540d\u79f0\u524d\u9762\u7684\u4e09\u89d2\u5f62\u56fe\u6807\uff0c\u53ef\u4ee5\u5c55\u5f00\u5e94\u7528\u7684\u6807\u7b7e\uff0c\u6240\u6709\u6807\u7b7e\u4ee5 tree \u7684\u5f62\u5f0f\u5c55\u793a\uff0c\u5bf9\u5e94\u5e94\u7528\u91cc\u9762\u7684\u7236\u7a97\u53e3\u548c\u5b50\u7a97\u53e3\u3002 \u83b7\u53d6\u5143\u7d20\u63a7\u4ef6\u7684\u6807\u7b7e\u540d\u79f0 \u9996\u5148\uff0c\u4e3a\u4e86\u65b9\u4fbf\u67e5\u770b\u5143\u7d20\u63a7\u4ef6\u5bf9\u5e94\u7684\u4f4d\u7f6e\uff0c\u5efa\u8bae\u73b0\u5728\u4e0a\u65b9\u5de5\u5177\u680f\u70b9\u51fb Actions\uff0c\u7136\u540e\u52fe\u9009 Hightlight Items\uff0c\u8fd9\u6837\u5728 sniff \u4e2d\u9f20\u6807\u9009\u4e2d\u5143\u7d20\u6807\u7b7e\u7684\u65f6\u5019\uff0c\u5e94\u7528\u4e2d\u4f1a\u6709\u76f8\u5e94\u7684\u5149\u6807\u9501\u5b9a\u3002 \u5728 sniff \u91cc\u9762\u70b9\u51fb\u8fdb\u5165\u5e94\u7528\u7684\u6807\u7b7e tree \u4e2d\u540e\uff0c\u70b9\u51fb\u76f8\u5e94\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5728\u5de5\u5177\u4e0b\u65b9\uff0c\u4f1a\u5c55\u793a\u5143\u7d20\u63a7\u4ef6\u7684 Name\uff0c\u8fd9\u4e2a\u5c31\u662f\u6807\u7b7e\u540d\u79f0\u3002 \u5728 tree \u4e2d\u6709\u4e9b\u5730\u65b9\u662f\u7a7a\u767d\u7684\u6216\u8005\u662f Form\uff0c\u662f\u56e0\u4e3a\u5f00\u53d1\u4eba\u5458\u5728\u6dfb\u52a0\u6807\u7b7e\u7684\u65f6\u5019\u6ca1\u6709\u6dfb\u52a0\uff0c\u6216\u8005\u6709\u4e9b\u7236\u7a97\u53e3\u4e0d\u9700\u8981\u6dfb\u52a0\uff0c\u8fd9\u79cd\u5728\u5b9e\u9645\u4e1a\u52a1\u4e2d\u662f\u4e0d\u5f71\u54cd\u7684\uff0c\u6211\u4eec\u53ea\u8981\u4fdd\u8bc1\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\u4e2d\uff0c\u8981\u7528\u5230\u7684\u5143\u7d20\u90fd\u6dfb\u52a0\u4e86\u6807\u7b7e\u5373\u53ef\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#22","title":"2.2\u3001\u5143\u7d20\u64cd\u4f5c","text":"\u83b7\u53d6\u5e94\u7528\u5bf9\u8c61 dogtail \u83b7\u53d6\u5e94\u7528\u5bf9\u8c61\u7684\u65f6\u5019\uff0c\u4f7f\u7528\u7684\u662f tree \u5e93\u91cc\u9762\u7684 application() \u65b9\u6cd5\uff1a from dogtail.tree import root\napp_obj = root.application('deepin-music')\n app_obj\u5c31\u662f\u5e94\u7528\u7684\u5bf9\u8c61\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\uff0c\u662f\u5e94\u7528\u5bf9\u8c61\u4f7f\u7528child()\u65b9\u6cd5\uff1a element = app_obj.child('element_name')\n \u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u4f20\u5165\u5143\u7d20\u7684 Name\uff0c\u83b7\u53d6\u5230\u76f8\u5e94\u5143\u7d20\u7684\u5bf9\u8c61\u3002Name \u53ef\u4ee5\u901a\u8fc7 sniff \u67e5\u770b\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\u5217\u8868: element_list = element.children\n \u83b7\u53d6\u5230\u8fd9\u4e2a\u5143\u7d20\u4e0b\u9762\u6240\u6709\u7684\u5143\u7d20\u5217\u8868\u3002 \u8fd9\u4e2a\u65b9\u6cd5\u9002\u7528\u4e8e\u6709\u4e9b\u6807\u7b7e\u6ca1\u6709\u6dfb\u52a0\uff0c\u4f46\u662f\u4f4d\u7f6e\u662f\u56fa\u5b9a\u7684\uff0c\u6211\u4eec\u901a\u8fc7\u7d22\u5f15\u53ef\u4ee5\u53d6\u5f97\u5143\u7d20\u3002 element_list[0]\n \u5bf9\u5143\u7d20\u7684\u64cd\u4f5c \u5728\u83b7\u53d6\u5230\u5143\u7d20\u4e4b\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u76f8\u5e94\u7684\u64cd\u4f5c\u3002 \u5355\u51fb element.click(button=1)\n button 1 \u2014>\u5de6\u952e\uff0c2 \u2014>\u6eda\u8f6e\uff0c3 \u2014>\u53f3\u952e\uff0c\u9ed8\u8ba4\u4e3a 1 \u53cc\u51fb element.doubleClick(button=1)\n \u9f20\u6807\u60ac\u505c element.point()\n \u9f20\u6807\u79fb\u52a8\u5230\u5143\u7d20\u4e2d\u5fc3\u4f4d\u7f6e \u6587\u672c\u8f93\u5165 element.typeText(string)\n \u5411\u5143\u7d20\u5bf9\u8c61\u8f93\u5165\u5b57\u7b26\u4e32 \uff0c\u6bd4\u5982\u8f93\u5165\u6846 \u7ec4\u5408\u952e element.keyCombo(comboString)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#23","title":"2.3\u3001\u6846\u67b6\u5c01\u88c5","text":"\u4ee3\u7801\u793a\u4f8b\uff1a # \u8be6\u7ec6\u4ee3\u7801\u8bf7\u67e5\u770b src/dogtail_utils.py\nclass DogtailUtils:\ndef __init__(self, name=None, description=None):\nself.name = name\nself.description = description\nself.obj = root.application(self.name, self.description)\ndef app_element(self, *args, **kwargs):\n\"\"\"\n \u83b7\u53d6app\u5143\u7d20\u7684\u5bf9\u8c61\n :return: \u5143\u7d20\u7684\u5bf9\u8c61\n \"\"\"\nreturn self.obj.child(*args, **kwargs, retry=False)\ndef element_center(self, element) -> tuple:\n\"\"\"\n \u83b7\u53d6\u5143\u7d20\u7684\u4e2d\u5fc3\u4f4d\u7f6e\n :param element:\n :return: \u5143\u7d20\u4e2d\u5fc3\u5750\u6807\n \"\"\"\n_x, _y, _w, _h = self.app_element(element).extents\n_x = _x + _w / 2\n_y = _y + _h / 2\nreturn _x, _y\n \u6846\u67b6\u63d0\u4f9b\u7684\u63a5\u53e3\u975e\u5e38\u7b80\u6d01\uff0c\u5728\u8c03\u7528\u65f6\uff1a self.dog.element_center(\"\u64ad\u653e\")\n \u8fd9\u6837\u5c31\u80fd\u83b7\u53d6\u5230\u6b64\u5143\u7d20\u7684\u4e2d\u5fc3\u5750\u6807\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_5","title":"\u516d\u3001\u6807\u7b7e\u5316\u7ba1\u7406","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_4","title":"1\u3001\u6807\u7b7e\u8bf4\u660e","text":"\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u811a\u672c ID\uff1a\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c/\u51fd\u6570 ID\uff1b PMS\u7528\u4f8bID\uff1aPMS \u4e0a\u5bf9\u5e94\u7684\u7528\u4f8b ID\uff08\u7528\u4f8b\u5e93 ID\uff09\uff1b \u9ed8\u8ba4\u4f7f\u7528\u7528\u4f8b\u5e93 ID\uff0c\u5bf9\u4e8e\u6682\u65f6\u6ca1\u6709\u4f7f\u7528\u7528\u4f8b\u5e93\u7ba1\u7406\u7528\u4f8b\u7684\u9879\u76ee\uff0c\u53ef\u4ee5\u4f7f\u7528\u4ea7\u54c1\u5e93\u7528\u4f8b ID\uff1b \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1aFUNC\uff08\u529f\u80fd\uff09\u3001PERF\uff08\u6027\u80fd\uff09\u3001STR\uff08\u538b\u529b\uff09\u3001SEC\uff08\u5b89\u5168\uff09\u3001CTS\uff08\u517c\u5bb9\u6027\uff09\u3001API\uff08\u63a5\u53e3\uff09\u3001BASELINE\uff08\u57fa\u7ebf-\u9884\u7559\uff09 \u8bbe\u5907\u7c7b\u578b\uff1aPPL\uff08\u4f9d\u8d56\u5916\u8bbe\u7684\u7528\u4f8b\uff09\u3001COL\uff08\u4f9d\u8d56\u4e3b\u63a7\u673a\u7684\u7528\u4f8b\uff09 \u7528\u4f8b\u6765\u6e90\uff1aBUG\uff08\u7531 Bug \u8f6c\u7684\u7528\u4f8b\uff09 \u4e0a\u7ebf\u5bf9\u8c61\uff1aCICD\uff0c\u8868\u793a\u4e0a\u7ebf\u5230 CICD \u6d41\u6c34\u7ebf\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u53ef\u4e00\u952e\u751f\u6210 case_list.csv \u6587\u4ef6\uff0c\u7528\u4e8e\u5bfc\u5165\u5230\u660e\u9053\u4e91 AT \u7528\u4f8b\u5217\u8868\u4e2d\u63a7\u5236 CICD \u8dd1\u6d4b\u8303\u56f4\uff1b \u6d4b\u8bd5\u7ea7\u522b\uff1aC1 / C2 / C3 / C4\uff0c\u5177\u4f53\u5b9a\u4e49\u53c2\u8003\u6d41\u6c34\u7ebf\u4f7f\u7528\u6307\u5bfc\uff1b \u8df3\u8fc7\u539f\u56e0\uff1askip-XXX\uff0c\u7528\u4e8e\u63a7\u5236\u7528\u4f8b\u662f\u5426\u6267\u884c\uff1b \u786e\u8ba4\u4fee\u590d\uff1afixed-XXX\uff0c\u7528\u4e8e\u6807\u8bb0\u7528\u4f8b\u7684\u4fee\u590d\u72b6\u6001\uff08\u540e\u9762\u8be6\u7ec6\u8bb2\u89e3\u7528\u6cd5\uff09\uff1b \u5e9f\u5f03\u7528\u4f8b\uff1aremoved-\u5df2\u5e9f\u5f03\uff0c\u7528\u4e8e\u6807\u8bb0\u5df2\u7ecf\u5e9f\u5f03\u7684\u7528\u4f8b\uff0c\u6b64\u7528\u4f8b\u6807\u7b7e\u4e0d\u4f1a\u88ab\u6dfb\u52a0\uff0c\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff1b \u793a\u4f8b\uff1a \u811a\u672cID PMS\u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u8bbe\u5907\u7c7b\u578b \u7528\u4f8b\u6765\u6e90 \u4e0a\u7ebf\u5bf9\u8c61 \u6d4b\u8bd5\u7ea7\u522b \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b ... 679537 679537 L1 FUNC PPL CICD C1 skip-XXX fixed-XXX removed-\u5df2\u5e9f\u5f03 ..."},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_4","title":"2\u3001\u64cd\u4f5c\u6b65\u9aa4","text":"2.1\u3001\u5728\u5b50\u9879\u76ee\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u4ee5\u7528\u4f8b\u7684 py \u6587\u4ef6\u9664\u53bb\u9996\u5b57\u7b26\u4e32 \"test_\" \u548c\u7528\u4f8b\u5e8f\u53f7\u540e\u7684\u5b57\u7b26\u4e32\u4f5c\u4e3a csv \u7684\u6587\u4ef6\u540d\u3002 \u4f8b\u5982: \u76f8\u518c\u7684\u7528\u4f8b\u6587\u4ef6\u4e3a test_album_xxx.py\uff0cxxx \u8868\u793a\u7528\u4f8b\u7684ID\uff08\u4e5f\u53ef\u4ee5\u662f\u81ea\u5b9a\u4e49\u7684\u6570\u5b57\u4ee3\u8868\u7528\u4f8b\u5e8f\u53f7\uff09\uff0c\u6b64\u65f6 csv \u6587\u4ef6\u540d\u5c31\u5e94\u4e3a album.csv\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u6240\u6709 csv \u6587\u4ef6\u5efa\u8bae\u653e\u5728\u4e00\u4e2a tags \u76ee\u5f55\u4e0b\u3002 \u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 2.2\u3001\u7b2c\u4e00\u5217\u4e3a\u811a\u672c ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b\u7528\u4f8b\u6807\u7b7e\u53ef\u4ee5\u65e0\u5e8f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_2","title":"3\u3001\u589e\u52a0\u8bf4\u660e","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_1","title":"3.1\u3001\u8df3\u8fc7\u7528\u4f8b","text":"\u4f20\u7edf\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668(@pytest.mark.skip)\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a; \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#311","title":"3.1.1\u3001\u56fa\u5b9a\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 679537 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u7b7e\u5f00\u5934\u4e3a \u201cskip-XXX\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\uff0c\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\u5219\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u7b7e\u4e3a SKIPED\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#312","title":"3.1.2\u3001\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skipif_platform-aarch64&mips64 \u67d0\u4e9b\u7528\u4f8b\u4f1a\u56e0\u4e3a\u4e0d\u540c\u7684\u73af\u5883\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\uff0c\u5e38\u89c1\u7684\u573a\u666f\u4e3a\u5728\u4e0d\u540c\u67b6\u6784\u4e0a\u5224\u65ad\u662f\u5426\u6267\u884c\uff0c\u8df3\u8fc7\u7684\u539f\u56e0\u6807\u7b7e\u4e3a \u201cskipif_platform-\u201d \u52a0\u67b6\u6784\u540d\uff0c\u591a\u4e2a\u67b6\u6784\u4e4b\u95f4\u4f7f\u7528 \u201c&\u201d \u62fc\u63a5\uff1b \u4ee5\u4e0a\u4f8b\u5b50\u4e3a\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u5224\u65ad\u5f53\u524d\u67b6\u6784\u662f\u5426\u4e3a arrch64 \u6216\u8005 mips64\uff0c\u82e5\u662f\uff0c\u5219\u8df3\u8fc7\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u82e5\u5426\u5219\u6267\u884c\u7528\u4f8b\uff1b \u76ee\u524d\u6846\u67b6\u9ed8\u8ba4\u4ec5\u652f\u6301\u67b6\u6784\u7684\u6761\u4ef6\u5224\u65ad\uff0c\u4f46\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u903b\u8f91\u652f\u6301\u81ea\u5b9a\u4e49\u6dfb\u52a0\u3002 \u5728\u9879\u76ee\u76ee\u5f55\u8def\u5f84\u4e0b\u5b58\u5728\u6587\u4ef6 setting/skipif.py\uff0c\u6240\u6709\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u7684\u51fd\u6570\u5199\u5728\u6b64\u6587\u4ef6\u4e2d\u3002 \u9ed8\u8ba4\u67b6\u6784\u5224\u65ad\u4f8b\u5b50\uff1a def skipif_platform(args: str):\n\"\"\"\u5e73\u53f0\u8df3\u8fc7\"\"\"\n_skip_key = args.split(\"&\")\nfor key in _skip_key:\nif GlobalConfig.SYS_ARCH == key:\nreturn True\nreturn False\n \u65b9\u6cd5\u7f16\u5199\u89c4\u8303\uff1a \u65b9\u6cd5\u540d\u5fc5\u987b\u4ee5 skipif \u5f00\u5934\uff1b \u65b9\u6cd5\u5fc5\u987b\u6709\u8fd4\u56de\u7ed3\u679c\u5e76\u4e14\u4e3a\u5e03\u5c14\u503c\uff08True \u4ee3\u8868\u8df3\u8fc7\uff0cFalse \u4ee3\u8868\u4e0d\u8df3\u8fc7\uff09\uff1b \u65b9\u6cd5\u53ea\u80fd\u6709\u4e00\u4e2a\u5165\u53c2\uff1b \u5728 csv \u6587\u4ef6\u8df3\u8fc7\u539f\u56e0\u4e00\u680f\u4e2d\u586b\u5199\u4e3a \u201c{\u51fd\u6570\u540d}-{\u53c2\u6570}\u201d\uff0c\u4f8b\u5982\uff1askipif_platform-aarch64\uff1b\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u4f1a\u4ee5\u7b2c\u4e00\u4e2a \u201c-\u201d \u8fdb\u884c\u5206\u5272\uff0c\u622a\u53d6\u7684\u5de6\u4fa7\u5b57\u7b26\u4e32\u4f5c\u4e3a\u51fd\u6570\u540d\uff0c\u5728 skipif.py \u6587\u4ef6\u4e2d\u67e5\u627e\u662f\u5426\u6709\u540c\u540d\u51fd\u6570\uff0c\u5e76\u5c06\u622a\u53d6\u7684\u53f3\u4fa7\u4f5c\u4e3a\u53c2\u6570\u4f20\u9012\u7ed9\u8be5\u51fd\u6570\uff0c\u901a\u8fc7\u83b7\u53d6\u8be5\u51fd\u6570\u8fd4\u56de\u7684\u5e03\u5c14\u503c\uff0c\u8fd4\u56de True\uff0c\u5219\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u8fd4\u56de False\uff0c\u5219\u6267\u884c\u8be5\u7528\u4f8b\u3002 \u82e5\u51fd\u6570\u9700\u8981\u591a\u4e2a\u53c2\u6570\uff0c\u53ef\u81ea\u5b9a\u4e49\u591a\u4e2a\u53c2\u6570\u4e4b\u95f4\u7684\u8fde\u63a5\u7b26\uff0c\u8fde\u63a5\u7b26\u53f7\u4e0d\u53ef\u4f7f\u7528\u4e0b\u5212\u7ebf\u548c\u9017\u53f7\uff0c\u63a8\u8350\u7edf\u4e00\u4f7f\u7528 & \u7b26\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32","title":"3.2\u3001\u786e\u8ba4\u4fee\u590d","text":"\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7528\u4f8b\u4fee\u590d\u540e\uff0c\u4f46\u4e0d\u80fd\u7acb\u5373\u5220\u9664\u8df3\u8fc7\u539f\u56e0\uff08skip-XXX\uff09\u7684\u7528\u4f8b\uff0c\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u786e\u8ba4\u4fee\u590d\u201d\uff0c\u4f5c\u4e3a\u6807\u8bb0\u8be5\u7528\u4f8b\u662f\u5426\u5df2\u7ecf\u4fee\u590d\uff0c\u56fa\u5b9a\u586b\u5165\u5b57\u6bb5\u4e3a \u201cfixed-\u5df2\u4fee\u590d\u201d\u3002\u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u5373\u4f7f\u540c\u65f6\u6807\u8bb0\u4e86 skip-XXX \u4e5f\u4f1a\u6b63\u5e38\u6267\u884c\u3002 \u793a\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d 679537 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d \u3010\u540c\u65f6\u6807\u8bb0\u4e86skip \u548c fixed\uff0c\u4f46\u4ecd\u7136\u60f3\u8981\u8df3\u8fc7\u7528\u4f8b\u3011 \u5f53 \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u540c\u65f6\u586b\u5165\u540e\uff0c\u547d\u4ee4\u884c\u4f20\u9012\u53c2\u6570 --ifixed yes\uff0c\u5219\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\u8be5\u6761\u7528\u4f8b\u3002 python3 manage.py run --ifixed yes\n \u770b\u5230\u8fd9\u91cc\u6709\u4e9b\u540c\u5b66\u53ef\u80fd\u8981\u95ee\u4e86\uff0c\u6211\u60f3\u6062\u590d\u8df3\u8fc7\u6267\u884c\uff0c\u76f4\u63a5\u628a skip-XXX \u8fd9\u4e00\u5217\u6807\u7b7e\u5220\u6389\u4e0d\u5c31\u597d\u4e86\uff0c\u8fd8\u641e\u4ec0\u4e48\u786e\u8ba4\u4fee\u590d\u5e72\u5565\uff1f \u8fd9\u91cc\u7ed9\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u89e3\u91ca\u4e00\u4e0b\uff1a \uff08\u4ee5\u4e0b\u6d41\u6c34\u7ebf\u6307\u7684\u662f\u6bcf\u65e5\u6784\u5efa\u7684\u6d41\u6c34\u7ebf\uff0c\u8dd1 AT \u7684\u5168\u91cf\u7528\u4f8b\uff09 \u9996\u5148\uff0c\u6d41\u6c34\u7ebf\u4e0a\u8dd1\u7684\u662f AT \u5386\u53f2 Tag\uff0c\u8df3\u8fc7\u7528\u4f8b\u7684\u6807\u7b7e(skip-XXX) \u662f\u5728\u6700\u65b0\u7684\u4ee3\u7801\u4e0a\u63d0\u4ea4\u7684\uff0c\u6211\u4eec\u91c7\u7528\u6700\u65b0\u7684 csv \u6587\u4ef6\u8986\u76d6\u5386\u53f2 csv \u6587\u4ef6\u7684\u8bbe\u8ba1\u6765\u5b9e\u73b0\u4e86\u5bf9\u5386\u53f2 Tag \u4e0a\u7528\u4f8b\u7684\u8df3\u8fc7\uff1b \u7136\u540e\uff0c\u5728\u65e5\u5e38\u8df3\u8fc7\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u540c\u65f6\u4e5f\u5728\u4fee\u590d\u4e00\u4e9b\u7528\u4f8b\uff0c\u4fee\u590d\u540e\u7684\u8fd9\u4e9b\u7528\u4f8b\u5728\u672c\u5730\u8c03\u8bd5\u7684\u65f6\u5019\u6211\u4eec\u4e0d\u5e0c\u671b\u7ee7\u7eed\u8df3\u8fc7\uff0c\u4f46\u662f\u6b64\u65f6\uff0c\u4fee\u590d\u7684\u8fd9\u4e9b\u7528\u4f8b\u53ef\u80fd\u8fd8\u4e0d\u7a33\u5b9a\uff0c\u4e0d\u9002\u5408\u9a6c\u4e0a\u653e\u5230\u6d41\u6c34\u7ebf\u53bb\u8dd1\uff0c\u4e5f\u5c31\u662f\u8bf4\u6d41\u6c34\u7ebf\u4e0a\u6211\u4eec\u662f\u5e0c\u671b\u4ed6\u7ee7\u7eed\u8df3\u8fc7\u7684\uff0c\u56e0\u6b64\uff0c\u54b1\u4e0d\u80fd\u76f4\u63a5\u628a skip-XXX \u5e72\u6389\uff1b \u8fd9\u91cc\u5c31\u77db\u76fe\u4e86\uff0c\u4e00\u4e2a\u9700\u6c42\u662f\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u53e6\u4e00\u4e2a\u9700\u6c42\u53c8\u4e0d\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u600e\u4e48\u529e\u5462\uff1f \u6211\u4eec\u4f7f\u7528\u201c\u786e\u8ba4\u4fee\u590d\u201d\u6765\u6807\u8bb0\u8fd9\u6761\u7528\u4f8b\u5df2\u7ecf\u4fee\u590d\u4e86\uff0c\u8fd9\u6837\u4f60\u672c\u5730\u8c03\u8bd5\u7528\u4f8b\u7684\u65f6\u5019\u8fd9\u6761\u5df2\u4fee\u590d\u7684\u7528\u4f8b\u662f\u4f1a\u6267\u884c\u7684\uff0c\u540c\u65f6\u5728\u6d41\u6c34\u7ebf\u4e0a\u5c06 --ifixed yes \u53c2\u6570\u52a0\u4e0a\uff0c\u90a3\u4e48\u6d41\u6c34\u7ebf\u4e0a\u6267\u884c\u65f6\u8fd9\u6761\u7528\u4f8b\u4ecd\u7136\u662f\u8df3\u8fc7\u7684\u72b6\u6001\uff0c\u540e\u7eed\u4f60\u6253 Tag \u7684\u65f6\u5019\uff0c\u628a \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u7684\u6807\u7b7e\u5168\u90e8\u5220\u6389\u5c31\u53ef\u4ee5\u4e86\u3002 \u8fd9\u5c31\u662f\u201c\u786e\u8ba4\u4fee\u590d\u201d\u8fd9\u4e2a\u6807\u7b7e\u7684\u80cc\u666f\uff0c\u9700\u8981\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u54c1\u4e00\u54c1\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#33","title":"3.3\u3001\u5e9f\u5f03\u7528\u4f8b","text":"\u9488\u5bf9\u67d0\u4e9b\u7528\u4f8b\uff0c\u7531\u4e8e\u9700\u6c42\u53d8\u66f4\uff0c\u73af\u5883\u5f71\u54cd\u6216\u8bc4\u4f30\u4e0d\u518d\u9002\u7528\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u65f6\uff0c\u7528\u4f8b\u9700\u8981\u5e9f\u5f03\uff0c\u5219\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u5e9f\u5f03\u7528\u4f8b\u201d\uff0c\u8be5\u5217\u5b58\u5728 \u201cremoved-{\u5e9f\u5f03\u539f\u56e0}\u201d\uff0c\u5219\u7528\u4f8b\u4e0d\u4f1a\u6267\u884c\u3002 \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d removed-\u5df2\u5e9f\u5f03 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_2","title":"4\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u4e0a\u9762\u4ecb\u7ecd Pytest \u6846\u67b6\u63d0\u4f9b\u7684\u6807\u7b7e\u529f\u80fd mark\uff0c\u4f7f\u7528\u65f6\u9700\u8981\u4e3a\u6bcf\u4e00\u4e2a\u7528\u4f8b\u6dfb\u52a0\u6807\u7b7e\u88c5\u9970\u5668\uff0c\u5219\u64cd\u4f5c\u590d\u6742\uff0c\u53ef\u7ef4\u62a4\u6027\u5dee\uff0c\u5176\u6839\u672c\u95ee\u9898\u5c31\u662f\u6807\u7b7e\u5206\u6563\u5728\u6bcf\u4e00\u6761\u7528\u4f8b\u7684\u88c5\u9970\u5668\u4e0a\uff0c\u96be\u4ee5\u96c6\u4e2d\u7ef4\u62a4\uff1b\u4e8e\u662f\u4e4e\u5c06\u6240\u6709\u6807\u7b7e\u4f7f\u7528 csv \u6587\u4ef6\u8fdb\u884c\u96c6\u4e2d\u7ba1\u7406\uff0c\u5e76\u901a\u8fc7 Pytest \u7684\u94a9\u5b50\u51fd\u6570\uff0c\u8bfb\u53d6 csv \u6587\u4ef6\uff0c\u52a8\u6001\u6dfb\u52a0\u6807\u7b7e\u5230\u7528\u4e2d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5csv","title":"5\u3001CSV\u6587\u4ef6\u683c\u5f0f","text":"\u6b64\u914d\u7f6e\u6587\u4ef6\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u6807\u7b7e\u6570\u636e\uff0c\u4e14\u8981\u65b9\u4fbf\u80fd\u4f7f\u7528 Excel \u6253\u5f00\u8fdb\u884c\u7f16\u8f91\u67e5\u770b\uff0c\u66f4\u91cd\u8981\u7684\u662f\u6211\u4eec\u4e0d\u60f3\u5f15\u5165\u4e09\u65b9\u4f9d\u8d56\uff0cCSV \u6587\u4ef6\u51e0\u4e4e\u662f\u552f\u4e00\u80fd\u6ee1\u8db3\u6240\u6709\u7684\u8981\u6c42\u7684\u6587\u4ef6\u683c\u5f0f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_6","title":"\u4e03\u3001\u65e5\u5fd7\u7cfb\u7edf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_5","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e YouQu \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u64cd\u4f5c\u65b9\u6cd5\u5c01\u88c5\u5199\u6cd5\uff0c\u901a\u5e38\u662f\u8fd9\u6837\u7684\uff1a\u7c7b\u91cc\u9762\u4e00\u4e2a\u51fd\u6570\u53ea\u5305\u542b\u4e00\u4e2a\u64cd\u4f5c\u6216\u591a\u6b21\u8c03\u7528\u7684\u4e00\u7cfb\u5217\u53ef\u5408\u5e76\u7684\u64cd\u4f5c\uff1b \u4f20\u7edf\u7684\u65e5\u5fd7\u8f93\u51fa\u65b9\u5f0f\uff0c\u9700\u8981\u5728\u6bcf\u4e2a\u51fd\u6570\u91cc\u9762\u4e3b\u52a8\u7f16\u5199\u65e5\u5fd7\u8f93\u51fa\u4ee3\u7801 \uff0c\u4f8b\u5982\uff1a class XXXWidget:\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\nlogger.info(\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\")\n...\n# \u7701\u7565\u4ee3\u7801\u90e8\u5206\n \u4e00\u4e2a\u51fd\u6570\u91cc\u9762\u81f3\u5c11\u5305\u542b\u4e00\u6761\u65e5\u5fd7\u4fe1\u606f\uff0c\u5982\u679c\u6bd4\u8f83\u590d\u6742\u64cd\u4f5c\u6b65\u9aa4\uff0c\u53ef\u80fd\u5305\u542b\u591a\u6761\u65e5\u5fd7\u4fe1\u606f\uff1b \u4e00\u4e2a\u5e94\u7528\u542b\u6709\u5927\u91cf\u7684\u64cd\u4f5c\u51fd\u6570\uff0c\u4e5f\u5c31\u662f\u8bf4\u6211\u4eec\u9700\u8981\u5199\u5927\u91cf\u7684\u65e5\u5fd7\u4ee3\u7801\uff1b \u901a\u8fc7\u7ecf\u9a8c\u89c2\u5bdf\uff0c\u6211\u4eec\u53d1\u73b0\uff0c\u51fd\u6570\u8bf4\u660e\u4ee5\u53ca\u51fd\u6570\u64cd\u4f5c\u65e5\u5fd7\uff0c\u5177\u6709\u8f83\u9ad8\u7684\u91cd\u590d\u5ea6\uff08\u4ece\u4e0a\u9762\u7684\u4f8b\u5b50\u4e5f\u53ef\u4ee5\u770b\u51fa\u6765\uff09\uff0c\u56e0\u6b64\u6211\u4eec\u5927\u80c6\u7684\u8bbe\u60f3\uff0c\u80fd\u4e0d\u80fd\u57fa\u4e8e\u6846\u67b6\u6267\u884c\u65f6\uff0c\u81ea\u52a8\u7684\u5c06\u51fd\u6570\u8bf4\u660e\u4f5c\u4e3a\u65e5\u5fd7\u6253\u5370\u51fa\u6765\uff0c\u4ece\u800c\u51cf\u5c11\u5927\u91cf\u65e5\u5fd7\u4ee3\u7801\u91cf\u548c\u91cd\u590d\u7f16\u5199\uff0c\u90a3\u771f\u662f\u5999\u554a~\u3002 \u57fa\u4e8e\u6b64\u201c\u5929\u771f\u201d\u7684\u60f3\u6cd5\uff0c\u6211\u4eec\u8bbe\u8ba1\u51fa\u4e86 youqu \u7684\u65e5\u5fd7\u7cfb\u7edf\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_5","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u6838\u5fc3\u539f\u7406\uff1a \u901a\u8fc7\u7ed9\u7c7b\u52a0\u4e0a\u4e00\u4e2a\u88c5\u9970\u5668 @log\uff0c\u52a8\u6001\u7ed9\u8be5\u7c7b\u4e0b\u6240\u6709\u7684\u51fd\u6570\u53ca\u7236\u7c7b\u51fd\u6570\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668 @_trace\uff0c\u5728\u6b64\u88c5\u9970\u5668\u4e2d\u6211\u4eec\u80fd\u52a8\u6001\u7684\u6355\u83b7\u6240\u8c03\u7528\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff08func.__doc__\uff09\uff0c\u901a\u8fc7\u65e5\u5fd7\u8f93\u51fa\u5668\u5c06\u5176\u8f93\u51fa\u5373\u53ef\u3002 \u5b9e\u73b0\u6b65\u9aa4\uff1a \u901a\u8fc7 inspect.getmembers \u83b7\u53d6\u88ab\u88c5\u9970\u7684\u7c7b\u4e0b\u6240\u6709\u51fd\u6570\uff0c\u5305\u542b\u9759\u6001\u65b9\u6cd5\uff0c\u7c7b\u65b9\u6cd5\uff0c\u5b9e\u4f8b\u65b9\u6cd5\uff1b \u901a\u8fc7 setattr(\u7c7b, \u65b9\u6cd5, _trace\uff09 \u7684\u65b9\u5f0f\uff0c\u7ed9\u7b26\u5408\u6761\u4ef6\u7684\u51fd\u6570\uff0c\u52a8\u6001\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_3","title":"3\u3001\u65e5\u5fd7\u914d\u7f6e","text":"[log_cli]\n;\u65e5\u5fd7\u76f8\u5173\u914d\u7f6e\uff08\u4e0d\u6253\u5370\u6784\u9020\u51fd\u6570\u548c\u9b54\u6cd5\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff09\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = INFO\n# ============= \u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u914d\u7f6e ================\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u5f00\u5934\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7, \u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_STARTSWITH = Assert\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u7ed3\u5c3e\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_ENDSWITH = Widget\n;\u652f\u6301\u7c7b\u540d\u5305\u542b xxx \u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_CONTAIN = ShortCut\n# ==============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_3","title":"4\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u5728\u5e94\u7528\u5e93 widget \u65b9\u6cd5\u5e93\u91cc\u9762\uff0c\u53ea\u9700\u8981\u5728\u51fa\u53e3\u6587\u4ef6\u52a0\u4e0a\u7c7b\u88c5\u9970\u5668\uff0c\u5c31\u53ef\u4ee5\u5b9e\u73b0\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u4e86\uff1b # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6ce8\u610f\uff0c\u662f\u7c7b\u88c5\u9970\u5668\u3002 \u5b9e\u4f8b\uff1a # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\n@classmethod\ndef find_dfm_image(cls, *elements, multiple=False, rate=0.9):\n\"\"\"\n \u67e5\u627e\u56fe\u7247 {{elements}}.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e {{rate}} \u7684\u5750\u6807\n :param elements:\n :param multiple:\n :return:\n \"\"\"\nelement = tuple(map(lambda x: f\"{Config.PIC_RES_PATH}/{x}\", elements))\nreturn cls.find_image(*element, multiple=multiple)\n \u8c03\u7528\u65b9\u6cd5\u65f6\uff1a DfmWidget.find_dfm_image(\"dfm_001\")\n \u81ea\u52a8\u8f93\u51fa\u7684\u65e5\u5fd7\uff1a >> x86_64-uos-6: 02/28 17:48:47 | INFO | logger_utils: [find_dfm_image]: \u67e5\u627e\u56fe\u7247 dfm_001.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e 0.9 \u7684\u5750\u6807\n \u52a0\u4e0a\u88c5\u9970\u5668 @log \u4e4b\u540e\uff0c\u65b9\u6cd5\u5c42\u6240\u6709\u7684\u51fd\u6570\uff08\u5305\u62ec\u5b9e\u4f8b\u65b9\u6cd5\u3001\u7c7b\u65b9\u6cd5\u3001\u9759\u6001\u65b9\u6cd5\uff09\u90fd\u4e0d\u9700\u8981\u518d\u5199\u65e5\u5fd7\u4ee3\u7801\uff0c\u6267\u884c\u7684\u65f6\u5019\u4f1a\u81ea\u52a8\u8f93\u51fa\uff0c\u5e76\u4e14\u6240\u6709\u8c03\u7528\u7684\u65b9\u6cd5\u4f1a\u4ee5 allure.step \u7684\u65b9\u5f0f\uff0c\u5c55\u793a\u5728 allure \u62a5\u544a\u4e2d\uff0c\u5728\u62a5\u544a\u4e2d\u66f4\u80fd\u4e00\u76ee\u4e86\u7136\u7684\u770b\u5230\u7528\u4f8b\u6267\u884c\u6b65\u9aa4\u3002 \u3010\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\u3011 \u901a\u8fc7\u89c2\u5bdf\u524d\u9762\u7684\u4f8b\u5b50\uff0c\u7ec6\u5fc3\u7684\u540c\u5b66\u53ef\u80fd\u8fd8\u53d1\u73b0\u4e86\u4e00\u4e2a\u5c0f\u7ec6\u8282\uff1a\u51fd\u6570\u529f\u80fd\u8bf4\u660e\u4e2d\uff0c\u4e24\u5bf9\u5927\u62ec\u53f7\u4e2d\u7684\u5185\u5bb9 {{elements}} \u4f5c\u4e3a\u53d8\u91cf\u8f93\u51fa\u51fa\u6765\u4e86\uff1b \u6ca1\u9519\uff0c\u8fd9\u5c31\u662f\u6211\u4eec\u53c2\u8003Django \u548c jinja2 \u7684\u6a21\u677f\u8bed\u6cd5\u8bbe\u8ba1\u51fa\u7684\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\uff0c\u4f7f\u7528\u65b9\u6cd5\u5f88\u7b80\u5355\uff0c\u7528\u4e24\u5bf9\u5927\u62ec\u53f7\u628a\u51fd\u6570\u7684\u53c2\u6570\u62ec\u8d77\u6765\uff0c\u8fd9\u6837\u5728\u65e5\u5fd7\u8f93\u51fa\u7684\u65f6\u5019\u5c31\u80fd\u628a\u8c03\u7528\u51fd\u6570\u65f6\u53c2\u6570\u7684\u503c\u8f93\u51fa\u51fa\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_7","title":"\u516b\u3001\u73af\u5883\u90e8\u7f72","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_6","title":"1\u3001\u539f\u5219","text":"YouQu \u7684\u73af\u5883\u4f9d\u8d56\u4e00\u76f4\u575a\u6301 2 \u4e2a\u539f\u5219\uff1a \u6700\u5c0f\u73af\u5883\u4f9d\u8d56\u539f\u5219 \u6709\u4e9b\u540c\u5b66\u5199\u4e00\u4e9b\u529f\u80fd\uff0c\u9996\u5148\u60f3\u5230\u7684\u5c31\u662f\u53bb\u641c\u7d22\u5f15\u64ce\u641c\u4e00\u4e0b\uff0c\u770b\u6709\u6ca1\u6709\u73b0\u6210\u7684\u5de5\u5177\u6216\u8005\u4ee3\u7801\u76f4\u63a5\u80fd\u7528\uff0c\u7f8e\u5176\u540d\u66f0\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\uff0c\u522b\u4eba\u5df2\u7ecf\u9020\u597d\u4e86\u8f6e\u5b50\u54b1\u4eec\u5c31\u4e0d\u8981\u91cd\u590d\u53bb\u9020\u4e86\uff0c\u7136\u540e\u4e00\u5207\u4f3c\u4e4e\u90fd\u53d8\u5f97\u90a3\u4e48\u7684\u7406\u6240\u5e94\u5f53\u3002 \u5f53\u7136\u8fd9\u6837\u505a\u65e0\u53ef\u539a\u975e\uff0c\u6211\u76f8\u4fe1\u6709\u8fd9\u6837\u60f3\u6cd5\u5e76\u4e14\u4e00\u76f4\u8df5\u884c\u8fd9\u6837\u505a\u6cd5\u7684\u540c\u5b66\u4e0d\u5728\u5c11\u6570\uff0c\u4f46\u8fd9\u6837\u505a\u6709\u4e00\u4e2a\u5f88\u4e25\u91cd\u7684\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f60\u5199\u4e00\u4e2a\u5927\u578b\u9879\u76ee\u65f6\uff0c\u4f60\u4f1a\u5f15\u5165\u975e\u5e38\u975e\u5e38\u975e\u5e38\u591a\u7684\u4f9d\u8d56\uff0c\u6bd4\u5982\u8981\u505a\u4e2a\u63a5\u53e3\u8bf7\u6c42\u8981\u7528 requests\u3001\u8bfb\u5199\u4e2a\u6570\u636e\u7528 pandas\u3001\u5199\u4e2a\u8868\u683c\u7528 pyopenxl\u3001\u89e3\u6790\u4e2a\u6587\u672c\u8981\u7528\u8fd9\u4e2a\u90a3\u4e2a\u4e09\u65b9\u5e93 ... \u3002 \u6211\u8ba4\u4e3a\u8fd9\u662f\u975e\u5e38\u4e0d\u597d\u7684\u4e60\u60ef\uff0c\u5728\u5b9e\u73b0\u4e00\u4e2a\u529f\u80fd\u7684\u65f6\u5019\uff0c\u9996\u5148\u6211\u4eec\u5e94\u8be5\u53bb\u60f3\u81ea\u5df1\u600e\u4e48\u6837\u53bb\u5b9e\u73b0\uff0c\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff1b \u5982\u679c\u4f60\u4e0d\u4f1a\uff0c\u4f60\u53ef\u4ee5\u53bb\u5b66\u4e60\u4e09\u65b9\u5e93\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u522b\u4eba\u4e09\u65b9\u5e93\u4e5f\u662f\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\u7684\uff0c\u4e3a\u4ec0\u4e48\u54b1\u4eec\u4e0d\u884c\u5462\uff1b\u5982\u679c\u522b\u4eba\u7684\u4f60\u5b9e\u5728\u662f\u770b\u4e0d\u61c2\uff0c\u60f3\u5c3d\u4e00\u5207\u529e\u6cd5\u786e\u5b9e\u505a\u4e0d\u51fa\u6765\uff0c\u90a3\u518d\u8003\u8651\u5f15\u5165\u8fd9\u4e2a\u4e09\u65b9\u5e93\uff0c\u6211\u8ba4\u4e3a\u8fd9\u6837\u662f\u6ca1\u95ee\u9898\u7684\uff0c\u6bd5\u7adf\u54b1\u4eec\u6bb5\u4f4d\u8fd8\u4e0d\u591f\uff0c\u4f46\u5e0c\u671b\u5c06\u6765\u6709\u4e00\u5929\u6211\u4eec\u53ef\u4ee5\u3002 \u8fd9\u6837\u7684\u505a\u6cd5\u624d\u5e94\u8be5\u662f\u201c\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\u201d\u6b63\u786e\u7684\u64cd\u4f5c\u3002\u4e0d\u4f1a\u6ca1\u5173\u7cfb\uff0c\u770b\u770b\u522b\u4eba\u662f\u600e\u4e48\u5b9e\u73b0\u7684\uff0c\u81ea\u5df1\u518d\u6478\u7d22\u7740\u5199\u51fa\u6765\uff0c\u8fd9\u6837\u81ea\u5df1\u624d\u80fd\u6709\u6240\u63d0\u9ad8\uff0c\u4e0d\u7136\u4f60\u5c31\u53ea\u4f1a\u7528\u522b\u4eba\u7684\u4e1c\u897f\uff1b\u90a3\u4e9b\u5632\u7b11\u3001\u6279\u8bc4\u6211\u4eec\u91cd\u590d\u9020\u8f6e\u5b50\u7684\u4eba\uff0c\u5148\u60f3\u60f3\u81ea\u5df1\u4f1a\u9020\u8f6e\u5b50\u5417\u3002 \u672c\u7740\u81ea\u5df1\u5b9e\u73b0\u80fd\u5b9e\u73b0\u7684\u4e00\u5207\u7684\u539f\u5219\uff0cYouQu \u6846\u67b6\u505a\u5230\u4e86\u975e\u5e38\u5c11\u7684\u73af\u5883\u4f9d\u8d56\uff0c\u800c\u4e14\u6211\u4eec\u4ecd\u5728\u4e0d\u65ad\u52aa\u529b\uff0c\u51cf\u5c11\u73af\u5883\u90e8\u7f72\u7684\u4f9d\u8d56\u3002 \u6700\u5c0f\u4ed3\u5e93\u4f53\u79ef\u539f\u5219 \u5927\u6587\u4ef6\u4e0d\u80fd\u4e0a\u4f20\u5230\u5de5\u7a0b\u91cc\u9762\uff0c\u4fdd\u6301\u6574\u4e2a\u5de5\u7a0b\u7684\u8f7b\u91cf\u5316\uff0c\u8fd9\u6837\u5728\u514b\u9686\u4ee3\u7801\u7684\u65f6\u5019\u624d\u80fd\u975e\u5e38\u5feb\u901f\u65b9\u4fbf\u4f7f\u7528\uff0c\u6211\u4eec\u89c1\u8fc7\u4e00\u4e2a AT \u5de5\u7a0b clone \u5927\u5c0f\u8fbe\u5230\u597d\u51e0\u4e2a G\uff0c\u7b80\u76f4\u4e0d\u53ef\u601d\u8bae\u3002 \u5176\u5b9e\u4ee3\u7801\u6587\u4ef6\u7684\u5927\u5c0f\u662f\u5f88\u5c0f\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u7eaf\u5199\u4ee3\u7801\u968f\u4fbf\u5199\u5de5\u7a0b\u4e5f\u4e0d\u4f1a\u592a\u5927\uff0c\u800c\u6587\u6863\uff08\u5305\u542b\u63d2\u56fe\uff09\u7b49\u8d44\u6e90\u5374\u662f\u5f88\u5360\u7a7a\u95f4\u3002 \u56e0\u6b64\u6211\u4eec\u9009\u62e9\u5c06 YouQu \u7684\u6587\u6863\u5de5\u7a0b\u6d89\u53ca\u5230\u7684\u56fe\u7247\u8d44\u6e90\u90fd\u91c7\u7528\u5916\u94fe\u52a0\u8f7d\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_6","title":"2\u3001\u5b89\u88c5","text":"\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u8fd0\u884c env.sh \u5373\u53ef\u3002 bash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_4","title":"3\u3001\u5b9a\u5236\u4f9d\u8d56","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_2","title":"3.1\u3001\u65b0\u589e\u4f9d\u8d56","text":"\u5982\u679c\u5e94\u7528\u5e93\u8fd8\u9700\u8981\u5176\u4ed6 Python \u4f9d\u8d56\u5e93\uff0c\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a requirement.txt \u6587\u4ef6\uff1b autotest_xxx\n\u251c\u2500\u2500 requirement.txt\n\u251c\u2500\u2500 case ...\n \u91cc\u9762\u5199\u5165\u9700\u8981\u5b89\u88c5\u7684\u4e09\u65b9\u4f9d\u8d56\uff0c\u6bd4\u5982\u50cf\u8fd9\u6837\uff1a # requirement.txt\nPyYAML==6.0 # \u6307\u5b9a\u5b89\u88c5\u67d0\u4e2a\u7248\u672c\nrequests # \u672a\u6307\u5b9a\u7248\u672c\u5219\u5b89\u88c5\u6700\u65b0\u7248\n \u5728\u6267\u884c bash env.sh \u65f6\u4f1a\u4e00\u5e76\u5c06\u5176\u5b89\u88c5\u3002 \u5982\u679c\u591a\u4e2a\u5e94\u7528\u5e93\u90fd\u5b58\u5728 requirement.txt \u6587\u4ef6\uff0c\u6267\u884c env.sh \u65f6\u4f1a\u5c06\u591a\u4e2a requirement.txt \u6587\u4ef6\u4e00\u5e76\u52a0\u8f7d\uff1b\u90a3\u4e48\u4e00\u5b9a\u8981\u6ce8\u610f\u591a\u4e2a requirement.txt \u6587\u4ef6\u53ef\u80fd\u5b58\u5728\u76f8\u540c\u7684\u4f9d\u8d56\u88ab\u6307\u5b9a\u5b89\u88c5\u4e0d\u540c\u7248\u672c\u7b49\u7b49\u517c\u5bb9\u6027\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32_1","title":"3.2\u3001\u88c1\u526a\u4f9d\u8d56","text":"\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0c\u53ef\u80fd\u4f60\u53ea\u9700\u8981\u5b89\u88c5\u4e00\u4e9b\u6700\u6700\u57fa\u7840\u7684\u4f9d\u8d56\uff0c\u5176\u4ed6\u7684\u90fd\u4e0d\u9700\u8981\uff0c\u6bd4\u5982\u7eaf\u63a5\u53e3\u81ea\u52a8\u5316\u7684\u9879\u76ee\uff0c\u5b83\u4e0d\u9700\u8981 UI \u81ea\u52a8\u5316\u76f8\u5173\u7684\u4f9d\u8d56\u3002 \u4f60\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\uff0c\u5b58\u653e\u4e00\u4e2a BASICENV \u7684\u666e\u901a\u6587\u4ef6\uff0c\u91cc\u9762\u4e0d\u9700\u8981\u5199\u4efb\u4f55\u5185\u5bb9\uff0c\u8fd9\u6837\u6267\u884c env.sh \u65f6\uff0c\u53ea\u4f1a\u5b89\u88c5\u6700\u57fa\u7840\u7684\u4f9d\u8d56\u3002 autotest_xxx\n\u251c\u2500\u2500 BASICENV # \u53ef\u4ee5\u4f7f\u7528\uff1atouch BASICENV \u521b\u5efa\u6587\u4ef6\n\u251c\u2500\u2500 case ...\n \u57fa\u7840\u4f9d\u8d56\u4ec5\u5b89\u88c5\u4ee5\u4e0b\u51e0\u4e2a\u5305\uff1a pytest # pytest\npytest-rerunfailures # \u5931\u8d25\u91cd\u8dd1\u63d2\u4ef6\npytest-timeout # \u7528\u4f8b\u8d85\u65f6\u63d2\u4ef6\nallure-pytest # \u751f\u6210 allure \u62a5\u544a\u63d2\u4ef6\nallure.deb # allure \u62a5\u544a\u67e5\u770b\u5de5\u5177\n \u88c1\u526a\u4f9d\u8d56 \u548c \u65b0\u589e\u4f9d\u8d56 \u662f\u4e0d\u51b2\u7a81\u7684\uff0c\u53ef\u4ee5\u540c\u65f6\u4f7f\u7528\u3002 \u6b64\u65b9\u6848\u9ed8\u8ba4\u4e3a\u865a\u62df\u73af\u5883\u90e8\u7f72\uff0c\u5982\u679c\u4f60\u60f3\u76f4\u63a5\u90e8\u7f72\u5728\u672c\u673a\u4e0a\uff1a bash env_dev.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_4","title":"4\u3001\u865a\u62df\u5316\u90e8\u7f72","text":"YouQu\u9ed8\u8ba4\u91c7\u7528\u865a\u62df\u5316\u90e8\u5206\uff0c\u865a\u62df\u5316\u73af\u5883\u5b9e\u9645\u5b89\u88c5\u7684\u4f4d\u7f6e\u662f\u5728 $HOME/.local/share/virtualenvs/youqu-oHTM7l7G \u76ee\u5f55\u4e0b youqu-oHTM7l7G \u6b64\u76ee\u5f55\u540d\u79f0\u524d\u9762\u90e8\u5206\u662f\u4f60\u7684\u4ee3\u7801\u6839\u76ee\u5f55\u7684\u540d\u79f0\uff0c\u540e\u9762\u90e8\u5206\u662f\u751f\u6210\u7684\u968f\u673a\u5b57\u7b26\u4e32\uff1b \u540c\u5b66\u4eec\u5728\u8fdc\u7a0b\u673a\u5668\u4e0a\u5b9a\u4f4d\u95ee\u9898\u7684\u65f6\u5019\uff0c\u5982\u679c\u4f7f\u7528 Pycharm \u8c03\u8bd5\uff0c\u5c31\u5c06\u89e3\u91ca\u5668\u6307\u5b9a\u5230\u8fd9\u4e2a\u76ee\u5f55\u7684\u5c31\u884c\u4e86\uff1b \u5f53\u7136\uff0c\u6211\u4eec\u4e5f\u63d0\u4f9b\u4e86\u672c\u673a\u5f00\u53d1\u73af\u5883\u90e8\u7f72\uff1a bash env_dev.sh\n \u5982\u679c\u4f60\u662f\u672c\u5730\u5f00\u53d1\u73af\u5883\u53ef\u4ee5\u7528\u5b83\uff0c\u533a\u522b\u5c31\u662f\u9a71\u52a8\u6267\u884c\u7684\u65f6\u5019\u4f7f\u7528\uff1apython3 manage.py xxx"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_8","title":"\u4e5d\u3001\u5931\u8d25\u5f55\u5c4f","text":"\u5f55\u5c4f\u5176\u5b9e\u662f\u4e00\u79cd\u89c6\u9891\u5f62\u5f0f\u7684\u65e5\u5fd7\uff0c\u56e0\u4e3a\u5f88\u591a\u65f6\u5019\u6211\u4eec\u5728\u67e5\u770b\u65e5\u5fd7\u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u51c6\u786e\u7684\u5b9a\u4f4d\u5230\u7528\u4f8b\u5931\u8d25\u7684\u5177\u4f53\u539f\u56e0\uff0c\u56e0\u6b64\u7528\u4f8b\u7684\u5f55\u5c4f\u80fd\u8ba9\u6211\u4eec\u770b\u5230\u7528\u4f8b\u5728\u6267\u884c\u8fc7\u7a0b\uff1b \u3010\u4f7f\u7528\u65b9\u6cd5\u3011 \u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u5173\u6ce8 2 \u4e2a\u53c2\u6570\uff1b ;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\u3002\n;\u6ce8\u610f\uff0c\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u4e0d\u80fd\u5c0f\u4e8e\u5931\u8d25\u5f55\u5c4f\u6b21\u6570\uff0c\u5373 RERUN >= RECORD_FAILED_CASE\nRECORD_FAILED_CASE = 1\n \u9ed8\u8ba4\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u662f 1 \u6b21\uff1b RECORD_FAILED_CASE = 1 \u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff1b RECORD_FAILED_CASE = 0 \u8868\u793a\u4e0d\u7ba1\u7528\u4f8b\u6210\u529f\u6216\u5931\u8d25\u90fd\u5f55\u5c4f\uff1b \u5f55\u5c4f\u662f\u8981\u5360\u7528\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u7279\u522b\u662f\u5728\u4e00\u4e9b\u914d\u7f6e\u8f83\u4f4e\u7684\u673a\u5668\u4e0a\u4f1a\u5f88\u660e\u663e\uff0c\u6240\u4ee5\u4f60\u9700\u8981\u8003\u8651\u662f\u5426\u6709\u5fc5\u8981\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1b \u4f7f\u7528 manage.py \u6267\u884c\u7528\u4f8b\u9ed8\u8ba4\u8bfb\u53d6\u5230 globalconfig.ini \u91cc\u9762\u7684\u53c2\u6570\uff0c\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report/record \u76ee\u5f55\u4e0b\u4fdd\u5b58\u5931\u8d25\u7528\u4f8b\u7684\u5f55\u5c4f\u548c\u65ad\u8a00\u7684\u90a3\u4e2a\u65f6\u95f4\u70b9\u7684\u622a\u5c4f\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7\u89c6\u9891\u6587\u4ef6\u770b\u5230\u5931\u8d25\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u90fd\u53d1\u751f\u4e86\u4ec0\u4e48\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#wayland","title":"\u5341\u3001Wayland \u9002\u914d","text":"Wayland \u4e0b\u81ea\u52a8\u5316\u4e3b\u8981\u95ee\u9898\u662f X11 \u4e0b\u7684\u952e\u9f20\u64cd\u4f5c\u65b9\u6cd5\u65e0\u6cd5\u4f7f\u7528\uff0c\u6bd4\u5982 Xdotool\u3001 PyAutoGUI\u3001Xwininfo \u7b49\u7b49\uff1b YouQu \u5728 Wayland \u4e0b\u517c\u5bb9\u9002\u914d\uff0cenv.sh \u5728 Wayland \u4e0b\u6267\u884c\u65f6\u4f1a\u5b89\u88c5\u81ea\u7814\u7684\u952e\u9f20\u64cd\u4f5c\u670d\u52a1\uff08\u53ef\u80fd\u5b58\u5728\u4e00\u4e9b\u4f9d\u8d56\u62a5\u9519\uff0c\u6309\u7167\u6ce8\u91ca\u89e3\u51b3\u5373\u53ef\uff09\uff0c\u6846\u67b6\u6838\u5fc3\u5e93\u4e5f\u9488\u5bf9\u6027\u7684\u505a\u4e86\u9002\u914d\uff0c\u4e0a\u5c42\u7528\u4f8b\u5b8c\u5168\u4e0d\u7528\u5173\u5fc3\u673a\u5668\u662fWayland \u8fd8\u662f X11\uff0c\u6846\u67b6\u4f1a\u6839\u636e\u6267\u884c\u65f6\u72b6\u6001\u81ea\u52a8\u5224\u65ad\u8d70\u4e0d\u540c\u7684\u903b\u8f91\uff1b \u7b80\u5355\u8bb2\u5c31\u662f\uff0c\u5e94\u7528\u5e93\u53ea\u9700\u8981\u7ef4\u62a4\u4e00\u5957\u7528\u4f8b\u811a\u672c\u5373\u53ef\u3002 \u3010\u7528\u4f8b\u517c\u5bb9\u3011 \u56e0\u4e3a Wayland \u4e0b\u6709\u4e9b\u5e94\u7528\u7684\u754c\u9762\u663e\u793a\u548c\u529f\u80fd\u672c\u8eab\u5b58\u5728\u4e00\u4e9b\u5dee\u5f02\uff0c\u7528\u4f8b\u5c42\u53ef\u80fd\u9700\u8981\u5bf9\u8fd9\u90e8\u5206\u7528\u4f8b\u505a\u903b\u8f91\u5224\u65ad\uff0c\u4f7f\u7528\u5168\u5c40\u914d\u7f6e\u91cc\u9762\u7684\u5e38\u91cf\u8fdb\u884c\u903b\u8f91\u7f16\u5199\u5373\u53ef\uff1a from setting.globalconfig import GlobalConfig\n# GlobalConfig.IS_WAYLAND \u83b7\u53d6\u5230\u5f53\u524d\u7684\u663e\u793a\u670d\u52a1\u5668\uff08bool\uff09\n# \u5e94\u7528\u5e93 Config \u7ee7\u627f GlobalConfig\nif Config.IS_WAYLAND:\npass\nif Config.IS_X11:\npass\n \u6bd4\u5982\u7528\u4f8b\u91cc\u9762\u5982\u679c\u65ad\u8a00\u7684\u56fe\u7247\u4e0d\u540c\uff1a if Config.IS_WAYLAND:\nself.assert_image_exist(\"wayland_XXX\")\nelse:\nself.assert_image_exist(\"x11_XXX\")\n \u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u811a\u672c\u5728 Wayland \u548c X11 \u4e0b\u90fd\u53ef\u4ee5\u8dd1\uff0cso easy \u662f\u4e0d\u662f\uff1f\u5b8c\u5168\u6ca1\u5fc5\u8981\u4e13\u95e8\u62c9\u65b0\u5206\u652f\u8fdb\u884c Wayland \u9002\u914d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_9","title":"\u5341\u4e00\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_7","title":"1. \u76ee\u5f55\u7ed3\u6784","text":"\u6267\u884c\u65f6\u4f1a\u5728\u6839\u76ee\u5f55\u4e0b\u52a8\u6001\u751f\u6210 report \u76ee\u5f55\uff0c\u6240\u6709\u7684\u62a5\u544a\u76f8\u5173\u7684\u6587\u4ef6\u4f1a\u7edf\u4e00\u5b58\u653e\u5728\u91cc\u9762\uff0c\u793a\u4f8b\uff1a /report\n \u251c\u2500\u2500 allure # allure\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json\n \u251c\u2500\u2500 allure_html # \u751f\u6210\u7684html\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 index.html \u251c\u2500\u2500 allure_back # allure\u62a5\u544a\u5907\u4efd\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 20221108114823\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json\n \u251c\u2500\u2500 json # json\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 result_deepin-music_20221109134736_1081333.json\n \u251c\u2500\u2500 logs # \u65e5\u5fd7\u6587\u4ef6\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 2022-11-10_debug.log \u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-10_error.log\n \u251c\u2500\u2500 record # \u5f55\u5c4f\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-09\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 15\u65f614\u520609\u79d2_test_music_303_2_autotest.mp4\n \u2514\u2500\u2500 xml # xml\u62a5\u544a\n\u2514\u2500\u2500 autotest_deepin_music-20221109134736.xml\n \u9ed8\u8ba4\u60c5\u51b5\u4e0b\u540c\u65f6\u751f\u6210 html\u3001xml\u3001json\u4e09\u79cd\u5f62\u5f0f\u7684\u62a5\u544a\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_7","title":"2. \u5b9a\u5236\u62a5\u544a","text":"\u6211\u4eec\u5bf9 allure \u62a5\u544a\u8fdb\u884c\u4e86\u4e00\u7cfb\u5217\u7684\u5b9a\u5236\uff1a \u5b9a\u5236 logo\u3001title\u3001\u62a5\u544a\u9ed8\u8ba4\u8bed\u8a00\u4e3a\u4e2d\u6587\uff1b \u52a0\u5165\u4e86\u7528\u4f8b\u65ad\u8a00\u5931\u8d25\u65f6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u4ee5\u53ca\u6b64\u65f6\u56fe\u50cf\u5bf9\u6bd4\u7684\u6a21\u677f\u56fe\u7247\uff1b \u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\uff0c\u4f60\u53ef\u4ee5\u5728 html \u62a5\u544a\u4e2d\u76f4\u63a5\u770b\u5f55\u5236\u7684\u89c6\u9891\uff1b \u52a0\u5165\u4e86 IP \u5730\u5740\u3001\u7cfb\u7edf\u4fe1\u606f\u3001\u955c\u50cf\u7248\u672c\u7b49\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_5","title":"3. \u67e5\u770b\u62a5\u544a","text":" \u672c\u5730\u6267\u884c \u5728 report/allure \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u4e00\u5806\u6587\u672c\u6587\u4ef6\uff0c\u8fd9\u4e9b\u662f allure \u63d2\u4ef6\u751f\u6210\u7684\u62a5\u544a\u6e90\u6570\u636e\uff0c\u6211\u4eec\u5728 report/allure_html \u76ee\u5f55\u4e0b\u7ed9\u4f60\u751f\u6210\u4e86 html \u6587\u4ef6\uff0c\u4f46\u662f\u4f60\u4e0d\u80fd\u76f4\u63a5\u901a\u8fc7\u6d4f\u89c8\u5668\u6253\u5f00 index.html \u6587\u4ef6\uff0c\u56e0\u4e3a allure \u7684\u62a5\u544a\u90fd\u662f\u57fa\u4e8e\u5728\u7ebf\u7684\u670d\u52a1\uff0c\u4f60\u5e94\u8be5\u8fd9\u6837\u6253\u5f00\uff1a allure open report/allure_html\n \u4f7f\u7528 manage.py \u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u5728\u7ec8\u7aef\u7684\u6700\u540e\u4e00\u884c\uff0c\u6211\u4eec\u4f1a\u7ed9\u4f60\u8f93\u51fa\u6253\u5f00\u62a5\u544a\u7684\u547d\u4ee4\uff0c\u76f4\u63a5\u590d\u5236\u5b83\u5728\u7ec8\u7aef\u6267\u884c\u5c31\u53ef\u4ee5\u67e5\u770b\u4e86\uff0c\u50cf\u8fd9\u6837\uff1a \u7ec8\u7aef\u6267\u884c\u547d\u4ee4: allure open /tmp/youqu/report/allure_html \u67e5\u770b\u62a5\u544a \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 Pycharm \u91cc\u9762\u627e\u5230 index.html \u6587\u4ef6\uff0c\u7136\u540e\u53f3\u952e\u9009\u62e9\u6d4f\u89c8\u5668\u6253\u5f00\uff0c\u6216\u8005\u4f60\u53ef\u4ee5\u7528\u4e00\u4e2a http \u670d\u52a1\u6253\u5f00\u3002 \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 report/allure \u76ee\u5f55\u4e0b\u67e5\u770b\u62a5\u544a\uff1a allure serve report/allure\n \u8fdc\u7a0b\u6267\u884c \u8fdc\u7a0b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\uff0c\u4f1a\u5c06\u6240\u6709\u8fdc\u7a0b\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u62a5\u544a\u90fd\u6536\u96c6\u5230 report/allure \u76ee\u5f55\u4e0b\uff0c\u5206\u522b\u6309\u7167\u673a\u5668\u7684 IP \u7b49\u5efa\u4e86\u4e0d\u540c\u7684\u76ee\u5f55\uff0c\u4f60\u53ef\u4ee5\u5728\u8fd9\u4e9b\u76ee\u5f55\u91cc\u9762\u53bb\u67e5\u770b\u5bf9\u5e94\u7684\u6d4b\u8bd5\u62a5\u544a\uff0c\u67e5\u770b\u65b9\u6cd5\u548c\u524d\u9762\u672c\u5730\u6267\u884c\u67e5\u770b\u7684\u65b9\u6cd5\u4e00\u6837\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_10","title":"\u5341\u4e8c\u3001\u9759\u6001\u4ee3\u7801\u626b\u63cf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_8","title":"1. \u63d0\u524d\u89e3\u51b3\u4ee3\u7801\u95ee\u9898","text":"\u4e3a\u4e86\u5e2e\u52a9\u5f00\u53d1\u8005\u7edf\u4e00\u4ee3\u7801\u98ce\u683c\uff0cPython \u793e\u533a\u63d0\u51fa\u4e86 PEP8 \u4ee3\u7801\u7f16\u7801\u98ce\u683c\uff0cPython \u5b98\u65b9\u540c\u65f6\u63a8\u51fa\u4e86\u4e00\u4e2a\u68c0\u67e5\u4ee3\u7801\u98ce\u683c\u662f\u5426\u7b26\u5408 PEP8 \u7684\u5de5\u5177\uff0c\u540d\u5b57\u4e5f\u53eb PEP8\u3002 \u4f46\u662f\uff0cPycharm \u91cc\u9762\u7684 PEP8 \u63d2\u4ef6\u5b9e\u9645\u4e0a\u5e76\u4e0d\u80fd\u53d1\u73b0\u5f88\u591a\u4ee3\u7801\u95ee\u9898\uff0c\u8fd9\u4e9b\u95ee\u9898\u5e76\u4e0d\u4f1a\u5728\u8fd0\u884c\u65f6\u62a5\u9519\uff0c\u56e0\u4e3a\u4ece Python \u8bed\u8a00\u89d2\u5ea6\u5e76\u4e0d\u5173\u5fc3\u8fd9\u4e9b\u95ee\u9898\uff0c\u5728 Pycharm \u7f16\u8f91\u5668\u91cc\u9762\u4f7f\u7528\u5feb\u6377\u952e ctrl + alt + L\uff0c\u6709\u4e00\u70b9\u70b9\u683c\u5f0f\u5316\u7684\u6548\u679c\uff0c\u80fd\u89e3\u51b3\u4e00\u4e9b\u7a7a\u683c\u3001\u6362\u884c\u7b49\u5c0f\u95ee\u9898\u3002 \u8fd9\u91cc\u63a8\u8350\u4e00\u4e2a Python \u793e\u533a\u6d41\u884c\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff1a Black\uff0c\u53f7\u79f0\u4e0d\u59a5\u534f\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff0c\u5b83\u68c0\u6d4b\u5230\u4e0d\u7b26\u5408\u89c4\u8303\u7684\u4ee3\u7801\u98ce\u683c\u76f4\u63a5\u5c31\u5e2e\u4f60\u5168\u90e8\u683c\u5f0f\u5316\u597d\uff0c\u5c31\u662f\u8fd9\u4e48\u521a\uff01 \u5b89\u88c5\uff1a sudo pip3 install black \n \u4f7f\u7528\u65b9\u6cd5\uff1a black ${CheckPath}\n \u4f7f\u7528\u8fd9\u4e2a\u5de5\u5177\u683c\u5f0f\u5316\u4e4b\u540e\uff0c\u4ee3\u7801\u4f1a\u88ab\u81ea\u52a8\u8c03\u6574\uff0c\u521a\u5f00\u59cb\u4f60\u53ef\u80fd\u4f1a\u89c9\u5f97\u8c03\u6574\u5f97\u5f88\u5938\u5f20\uff0c\u6ca1\u5173\u7cfb\u575a\u6301\u770b\uff0c\u4e60\u60ef\u4e4b\u540e\uff0c\u4f60\u4f1a\u89c9\u5f97\u5f88\u4f18\u96c5\uff0c\u6ca1\u9519\uff0c\u8fd9\u5c31\u662f Pythonic Code \u7684\u6838\u5fc3\uff0c\u8bf7\u4fdd\u6301\u4f18\u96c5\uff5e\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_8","title":"2. \u4ee3\u7801\u626b\u63cf\u5de5\u5177","text":"\u4f7f\u7528\u6839\u76ee\u5f55\u4e0b pylint.sh \u626b\u63cf\u4ee3\u7801\uff0c\u5728 report \u76ee\u5f55\u4e0b\u67e5\u770b\u4ee3\u7801\u626b\u63cf\u62a5\u544a\uff0c\u5982\u679c\u6709\u4ee3\u7801\u95ee\u9898\u8bf7\u63d0\u524d\u89e3\u51b3\u4e4b\u540e\u518d\u63d0\u4ea4\u3002 \u6b64\u811a\u672c\u5df2\u7ecf\u4f7f\u7528 Python \u793e\u533a\u6700\u6d41\u884c\u7684\u4ee3\u7801\u626b\u63cf\u5de5\u5177 Pylint \u8fdb\u884c\u4ee3\u7801\u626b\u63cf\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a bash pylint.sh\n \u8fd0\u884c\u4e4b\u540e\u4f1a\u63d0\u793a\u4f60\u8981\u626b\u63cf\u7684\u76ee\u5f55\uff0c\u6bd4\u5982\u8f93\u5165 apps \uff0c\u5219\u4f1a\u626b\u63cf apps \u4e0b\u7684\u6240\u6709 Python \u4ee3\u7801\u3002 \u5728 setting/pylintrc.cfg \u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u76f8\u5173\u914d\u7f6e\uff0c\u626b\u63cf\u5b8c\u6210\u4e4b\u540e\u5728 report/pylints \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u626b\u63cf\u62a5\u544a\u3002 \u4ee3\u7801\u63d0\u4ea4\u9700\u901a\u8fc7 git review \u63d0\u4ea4\u5230 gerrit \uff0c\u4eba\u5de5 Code Review \u901a\u8fc7\u4e4b\u540e\u5408\u5165\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_11","title":"\u5341\u4e09\u3001\u63d0\u4ea4\u4ee3\u7801","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_9","title":"1. \u5b89\u88c5\u4f9d\u8d56","text":"sudo apt install git-review\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_9","title":"2. \u63d0\u4ea4\u6a21\u677f","text":"\u5728 ~ \u76ee\u5f55\u4e0b\u65b0\u5efa\u6587\u4ef6\uff0c\u5e76\u547d\u540d\u4e3a gitcommit_template \u5c06\u4ee5\u4e0b\u5185\u5bb9\u5199\u5165\u6587\u4ef6\u5f53\u4e2d\uff1a # commit type :fix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style(\u98ce\u683c\u4fee\u6539)\u3001refactor(\u91cd\u6784)\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test(\u6d4b\u8bd5) + \u7b80\u5355\u63cf\u8ff0. \u9ed8\u8ba4fix,\u6839\u636e\u60c5\u51b5\u4fee\u6539\nfix: \n\n# \u8be6\u7ec6\u8bf4\u660e\u4ee3\u7801\u7684\u6539\u52a8\uff0c\u5305\u542b\u4ee3\u7801\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u4ee5\u53ca\u4e3a\u4ec0\u4e48\u8fd9\u4e48\u505a\uff0c\u53ef\u80fd\u4f1a\u5f71\u54cd\u54ea\u4e9b\u529f\u80fd\u3002\u5bf9\u4e8e\u4ee3\u7801\u7684\u5ba1\u6838\u8005\uff0c\u9700\u8981\u4ece\u8fd9\u6bb5\u63cf\u8ff0\u4e2d\u80fd\u5b8c\u5168\u7406\u89e3\u4ee3\u7801\u4e2d\u6240\u6709\u6539\u52a8\u7684\u5185\u5bb9\nDescription: \n\n# \u5199\u4e00\u6bb5\u9762\u5411\u4e8e\u4ea7\u54c1\u7684\u603b\u7ed3\u6027\u5185\u5bb9\uff0c\u7528\u4e8e\u81ea\u52a8\u751f\u6210crp\u4e0a\u7684changlog\uff0c\u9700\u8981\u6ce8\u610f\u7684\u4e8b\uff0c\u8fd9\u6bb5\u63cf\u8ff0\u5fc5\u987b\u4ece\u4ea7\u54c1\u7684\u89d2\u5ea6\u8003\u8651\u3002\nLog: \n\n# \u5173\u8054pms\u4e0a\u7684bug\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94bug\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4fee\u590dbug\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Bug: \n\n# \u4fee\u590d github issue \n#Issue: \n\n# \u5173\u8054pms\u4e0a\u7684\u4efb\u52a1\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94\u4efb\u52a1\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4efb\u52a1\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Task: \n \u547d\u4ee4\u884c\u6267\u884c: git config --global commit.template ~/gitcommit_template\n \u6b64\u547d\u4ee4\u5c06\u6a21\u677f\u52a0\u5165\u5230 git \u7684\u63d0\u4ea4\u6a21\u677f\u4e2d\u3002 \u540e\u7eed\u63d0\u4ea4\u7684\u65f6\u5019\u9700\u8981\u5173\u6ce8\u4e00\u4e0b\u51e0\u70b9\uff1a commit type \u5bf9\u5e94\u4e0d\u540c\u7684\u4fee\u6539\u7c7b\u578b\uff1afix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style \uff08\u98ce\u683c\u4fee\u6539\uff09\u3001refactor \uff08\u91cd\u6784\uff09\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test \uff08\u6d4b\u8bd5\uff09 commit type \u5192\u53f7\u540e\u9762\u52a0\u7a7a\u683c\u3002 Description \u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u9700\u8981\u8fdb\u884c\u8be6\u7ec6\u8bf4\u660e\uff0c\u6bd4\u5982\u5bf9\u529f\u80fd\u8fdb\u884c\u5927\u6539\u7b49\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_6","title":"3. \u63a8\u9001\u4ee3\u7801","text":"\u9996\u5148\u6dfb\u52a0 commit \u4fe1\u606f git add \u540e\u9762\u52a0\u6587\u4ef6\u540d\u79f0\n git add . # \u8868\u793a\u6dfb\u52a0\u6240\u6709\u6587\u4ef6\n \u4f7f\u7528\u8fd9\u6761\u547d\u4ee4\u6ce8\u610f\u6709\u4e9b\u4e34\u65f6\u6587\u4ef6\u4e0d\u8981\u63d0\u4ea4\u5230\u4ed3\u5e93\u4e86\u3002 git commit -a\n \u4e4b\u540e\u5728 fix: \u540e\u9762\uff08\u6ce8\u610f\u5192\u53f7\u540e\u9762\u5fc5\u987b\u52a0\u7a7a\u683c\uff0c\u4e0d\u7136\u76f4\u63a5-1\uff09\u5199\u672c\u5730\u63d0\u4ea4\u7684 commit \u4fe1\u606f\uff0c\u7136\u540e\u5c31\u53ef\u4ee5\u63d0\u4ea4\u4ee3\u7801\u4e86 git review branch(\u5f53\u524d\u5206\u652f) -r origin\n \u6700\u597d\u4e00\u6b21 commit\uff0c\u4e00\u6b21 git review \uff0c\u7ecf\u5e38\u6709\u540c\u5b66\u5728\u672c\u5730\u75af\u72c2 commit \u6700\u540e git review \u62a5\u9519\u4e0d\u77e5\u9053\u548b\u56de\u4e8b\u513f\u3002 \u82e5\u4e0d\u60f3\u6bcf\u6b21\u63d0\u4ea4\u90fd\u52a0\u4e0a -r \u9009\u9879\uff0c\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a git config --global gitreview.remote origin \u63d0\u4ea4\u4ee3\u7801\uff0c\u76f4\u63a5\u4f7f\u7528 git review branch<\u76ee\u6807\u5206\u652f>\uff0c\u4f8b\u5982 git review master"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git","title":"4. Git\u6807\u7b7e","text":"Git \u6807\u7b7e\u5b9e\u9645\u4e0a\u662f commit \u7684\u4e00\u4e2a\u522b\u540d\uff0c\u4e3b\u8981\u7528\u4e8e\u7ba1\u7406\u5386\u53f2\u7248\u672c\u3002 \u60f3\u8c61\u4e00\u4e0b\u9886\u5bfc\u8ba9\u4f60\u628a\u4e4b\u524d\u7684\u67d0\u4e2a\u7248\u672c\u7684\u4ee3\u7801\u62c9\u51fa\u6765\u8dd1\uff0c\u4f60\u662f\u4e0d\u662f\u4e56\u4e56\u7684\u53bb\u628a\u6240\u6709\u63d0\u4ea4\u8bb0\u5f55\u62c9\u51fa\u6765\u627e\uff0c\u7136\u540e\u627e\u5230\u90a3\u4e2a\u54c8\u5e0c\u503c\uff0c\u901a\u8fc7\u54c8\u5e0c\u503c\u6765\u68c0\u51fa\u4ee3\u7801\u3002 \u8fd9\u4e00\u5957\u64cd\u4f5c\u4e0b\u6765\u662f\u4e0d\u662f\u5f88\u9ebb\u70e6\uff0c\u8d39\u65f6\u95f4\u8fd8\u4e0d\u4e00\u5b9a\u80fd\u627e\u5f97\u5230\uff0c\u6ca1\u4eba\u80fd\u8bb0\u4f4f\u6bcf\u4e2a\u63d0\u4ea4\u54c8\u5e0c\u503c\u4ee5\u53ca\u8fd9\u6b21\u63d0\u4ea4\u90fd\u6539\u4e86\u54ea\u4e9b\u4ee3\u7801\u3002 \u56e0\u6b64\u7ed9\u63d0\u4ea4\u6253\u4e2a\u6807\u7b7e\uff0c\u5c31\u662f\u628a\u54c8\u5e0c\u503c\u8f6c\u6362\u6210\u4eba\u7c7b\u80fd\u7406\u89e3\u7684\u8bed\u8a00\uff0c\u6bd4\u5982 v1.0\uff0c\u5c31\u53ef\u4ee5\u76f4\u63a5\u901a\u8fc7\u6807\u7b7e\u627e\u5230\u5bf9\u5e94\u7684\u63d0\u4ea4\u3002 \u65b0\u5efa\u6807\u7b7e git tag -a <tagname>\n \u56de\u8f66\u4e4b\u540e\uff0cGit \u4f1a\u6253\u5f00\u4f60\u7684\u7f16\u8f91\u5668\uff0c\u8ba9\u4f60\u5199\u4e00\u53e5\u6807\u7b7e\u6ce8\u89e3\uff0c\u5c31\u50cf\u4f60\u7ed9\u63d0\u4ea4\u5199\u6ce8\u89e3\u4e00\u6837\u3002 \u67e5\u770b\u6240\u6709\u6807\u7b7e git tag -l\n# git tag \u4e5f\u884c\n \u5220\u9664\u6807\u7b7e git tag -d <tagname>\n \u63a8\u9001\u6807\u7b7e\u81f3\u8fdc\u7a0b git push \u547d\u4ee4\u5e76\u4e0d\u4f1a\u4f20\u9001\u6807\u7b7e\u5230\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\uff0c\u5fc5\u987b\u663e\u5f0f\u5730\u63a8\u9001\u6807\u7b7e\u3002 git push origin <tagname>\n \u63a8\u9001\u6240\u6709\u4e0d\u5728\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\u7684\u6807\u7b7e git push origin --tag\n \u5220\u9664\u8fdc\u7a0b\u6807\u7b7e git push origin :refs/tag/<tagname>\n \u540e\u671f\u6253\u6807\u7b7e \u5148\u7528 git log --pretty=oneline \u67e5\u8be2\u63d0\u4ea4\u8bb0\u5f55\uff0c\u83b7\u53d6\u6821\u9a8c\u7801\u3002 git tag -a <tagname> 9fceb02(\u6821\u9a8c\u7801)\n \u68c0\u51fa\u6807\u7b7e git checkout <tagname>\n \u6b64\u65f6\uff0c\u4ed3\u5e93\u4f1a\u5904\u4e8e\u201c\u5206\u79bb\u5934\u6307\u9488\uff08detached HEAD\uff09\u201d\u7684\u72b6\u6001\u3002 \u5728\u201c\u5206\u79bb\u5934\u6307\u9488\u201d\u72b6\u6001\u4e0b\uff0c\u5982\u679c\u4f60\u505a\u4e86\u67d0\u4e9b\u66f4\u6539\u7136\u540e\u63d0\u4ea4\u5b83\u4eec\uff0c\u6807\u7b7e\u4e0d\u4f1a\u53d1\u751f\u53d8\u5316\uff0c \u4f46\u4f60\u7684\u65b0\u63d0\u4ea4\u5c06\u4e0d\u5c5e\u4e8e\u4efb\u4f55\u5206\u652f\uff0c\u5e76\u4e14\u5c06\u65e0\u6cd5\u8bbf\u95ee\uff0c\u9664\u975e\u901a\u8fc7\u786e\u5207\u7684\u63d0\u4ea4\u54c8\u5e0c\u624d\u80fd\u8bbf\u95ee\u3002 \u56e0\u6b64\uff0c\u5982\u679c\u4f60\u9700\u8981\u8fdb\u884c\u66f4\u6539\uff0c\u6bd4\u5982\u4f60\u8981\u4fee\u590d\u65e7\u7248\u672c\u4e2d\u7684\u9519\u8bef\uff0c\u90a3\u4e48\u901a\u5e38\u9700\u8981\u521b\u5efa\u4e00\u4e2a\u65b0\u5206\u652f\uff1a git checkout -b <NewBranchName> <tagname>\n \u65b0\u5206\u652f\u4e0a\u53ef\u4ee5\u8fdb\u884c\u63d0\u4ea4\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_12","title":"\u5341\u56db\u3001\u5e38\u89c1\u95ee\u9898","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_10","title":"1. \u63d0\u4ea4\u4ee3\u7801\u65f6\u63d0\u793a\u90ae\u7bb1\u6216\u8005\u540d\u79f0\u4e0d\u5bf9","text":"\u91cd\u65b0\u914d\u7f6e\u90ae\u7bb1\u6216\u8005\u540d\u79f0\uff0c\u7136\u540e\u91cd\u7f6e\u751f\u6548\uff1a git commit --amend --reset-author\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_10","title":"2. \u600e\u4e48\u56de\u6eda\u5230\u4e4b\u524d\u7684\u7248\u672c","text":"(1)\u67e5\u8be2\u5386\u53f2\u63d0\u4ea4\u8bb0\u5f55 git log\n \u627e\u5230\u4f60\u8981\u56de\u6eda\u7684\u7248\u672c\uff0c\u590d\u5236 hash \u503c\u3002 \u6ce8\u610f\uff1a\u662f commit \u7a7a\u683c\u4e4b\u540e\u7684 hash \u503c\uff0c\u4e4b\u524d\u6709\u540c\u5b66\u590d\u5236\u7684 Change-Id: \u8fd9\u6837\u80af\u5b9a\u62a5\u9519\u3002 (2)\u56de\u6eda\u7248\u672c\uff0c\u4e0d\u6e05\u9664\u4ee3\u7801 git reset --soft ${hash}\n (3)\u56de\u6eda\u7248\u672c\uff0c\u6e05\u9664\u4ee3\u7801\uff0c\u614e\u7528\u54c8 git reset --hard ${hash}\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-f-s-e","title":"3. \u6d4b\u8bd5\u62a5\u544a\u91cc\u9762 F S . E \u662f\u4ec0\u4e48\u610f\u601d","text":"F \u8868\u793a\u5931\u8d25\uff0c. \uff08\u70b9\uff09\u8868\u793a\u901a\u8fc7\uff0cS \u8868\u793a\u8df3\u8fc7\uff0cE \u8868\u793a error \u6709\u62a5\u9519"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git-status","title":"4. \u89e3\u51b3 git status \u4e2d\u6587\u663e\u793a\u7684\u95ee\u9898","text":"git config --global core.quotePath false\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5-apps","title":"5. apps \u76ee\u5f55\u4e0b\u989c\u8272\u6709\u4e9b\u662f\u9ec4\u8272\u7684","text":"\u5728 Pycharm \u4e2d apps \u76ee\u5f55\u4e0b\u5e94\u7528\u5e93\u6587\u4ef6\u662f\u9ec4\u8272\u7684\uff0c\u7f16\u8f91\u5668\u8bc6\u522b\u4e0d\u5230\u4ee3\u7801\u65b0\u589e\u548c\u4fee\u6539\uff1b \u7531\u4e8e\u793e\u533a\u7248 Pycharm \u4e0d\u80fd\u52a8\u6001\u8bc6\u522b\u591a\u4ed3\u5e93\uff0c\u9700\u8981\u5728 setting \u91cc\u9762\u624b\u52a8\u6ce8\u518c\uff0c\u64cd\u4f5c\u6b65\u9aa4\uff1a File \u2014> Settings \u2014> Version Control \u2014> \u70b9 + \u53f7 \u2014> Directory \u9009\u4e2d\u5e94\u7528\u5e93\u5de5\u7a0b\u76ee\u5f55 \u2014> VCS \u9009\u4e2d Git \u2014> Apply \u5982\u6b64\u5c31\u53ef\u4ee5\u4e86\u3002 \u4e13\u4e1a\u7248 Pycharm \u4e0d\u5b58\u5728\u8fd9\u4e2a\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#6-envsh-r","title":"6. \u6267\u884c env.sh \u62a5\u9519 $'\\r':\u672a\u627e\u5230\u547d\u4ee4","text":"\u51fa\u73b0\u8fd9\u4e2a\u95ee\u9898\u4f60\u5e94\u8be5\u662f\u5728 windows \u4e0a\u6253\u5f00\u6216\u7f16\u8f91\u8fc7 env.sh \u811a\u672c\uff0cwindows\u4e0b\u7684\u6362\u884c\u662f\u56de\u8f66\u7b26+\u6362\u884c\u7b26\uff0c\u4e5f\u5c31\u662f\\r\\n\uff0c\u800c Linxu \u4e0b\u662f\u6362\u884c\u7b26 \\n\uff0cLinux \u4e0b\u4e0d\u8bc6\u522b \\r\uff0c\u56e0\u6b64\u62a5\u9519\u3002 \u89e3\u51b3\u65b9\u6848\uff1a # \u5c06 \\r \u66ff\u6362\u4e3a\u7a7a\nsudo sed -i 's/\\r//' env.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#7","title":"7.\u600e\u6837\u4e3a\u5355\u72ec\u67d0\u4e00\u6761\u7528\u4f8b\u914d\u7f6e\u6267\u884c\u8d85\u65f6\u65f6\u95f4","text":"\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u5982\u4e0b\uff1a @pytest.mark.timeout(300) # \u5355\u4f4d\u79d2\ndef test_xxx_001():\npass\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#8-youqu","title":"8. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u6240\u6709\u4ee3\u7801\uff0c\u5305\u542b\u5b50\u4ed3\u5e93","text":"\u524d\u7f6e\u6761\u4ef6\uff1a\u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 # \u7b2c\u4e00\u6b21\u5b58\u50a8\u5bc6\u7801\uff0c\u63d0\u4f9b\u540e\u9762\u62c9\u4ee3\u7801(gerrit: ldap\u8d26\u53f7\u548c\u5bc6\u7801\uff0cgit\u62c9\u53d6\u7b2c\u4e00\u6b21\u8f93\u5165\u4fdd\u5b58\uff0c\u540e\u9762\u76f4\u63a5\u4f7f\u7528)\ngit config --global credential.helper store\n\n# \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\uff0c\u5e76\u9012\u5f52\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\" --recursive\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#9-youqu","title":"9. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\u6307\u5b9a\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u524d\u7f6e\u6761\u4ef6\uff1a \u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 \u5df2\u5b58\u50a8\u8bbf\u95ee\u5bc6\u7801 # \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\"\n# \u6307\u5b9a\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ncd youqu\ngit submodule update --init apps/autotest_xxx_xxx\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#10-youqu","title":"10. \u5982\u4f55\u66f4\u65b0 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\uff0c\u6240\u6709\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u66f4\u65b0\u6240\u6709\u5b50\u4ed3\u5e93\u4ee3\u7801 cd youqu\ngit pull & git submodule foreach git pull\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#11-youqu-master-detached-head","title":"11. \u5982\u4f55\u4fee\u590d YouQu \u6240\u6709\u5b50\u4ed3\u5e93 master \u5206\u652f\u6e38\u79bb\u5934\uff08detached head\uff09","text":"\u4fee\u590d\u6240\u6709\u5b50\u4ed3\u5e93\u9ed8\u8ba4master \u5206\u652f\u6e38\u79bb\u5934 cd youqu\ngit submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/","title":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212 \u5206\u7c7b\uff1a/ \u67b6\u6784\u5e08\uff1a/ \u76ee\u6807\uff1a \u5e94\u7528 AT \u67b6\u6784\u5de5\u7a0b\u5316\uff0c\u53c2\u8003\u6027\u80fd\u81ea\u52a8\u5316\u5de5\u7a0b\u5b8c\u6210\u5de5\u7a0b\u5316\u6539\u9020\u3002 \u5e94\u7528\u95f4\u7528\u4f8b\u89e3\u8026\uff0c\u89e3\u9664\u6240\u6709\u4ea4\u53c9\u8c03\u7528\u7684\u65b9\u6cd5\uff0c\u5404\u5e94\u7528\u80fd\u8ddf\u968f\u81ea\u8eab\u8fed\u4ee3\u5468\u671f\u72ec\u7acb\u7ef4\u62a4 AT \u7528\u4f8b\u3002 \u5b8c\u6210\u516c\u5171\u65b9\u6cd5\u7684\u62bd\u53d6\u6574\u5408\uff0c\u5f62\u6210\u4e00\u5957\u72ec\u7acb\u4e8e\u5e94\u7528\u95f4\u7684\u516c\u5171\u65b9\u6cd5\u5e93\uff0c\u5404\u5e94\u7528\u65b9\u6cd5\u91cc\u9762\u4e0d\u5b58\u5728\u88ab\u591a\u4e2a\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\u3002 \u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u4e3a\u5c06\u6765\u9002\u914d\u66f4\u591a\u7684 AT \u8fd0\u7528\u573a\u666f\u63d0\u4f9b\u652f\u6491\uff0c\u539f\u5219\u4e0a\u53ef\u5b9e\u73b0\u65e0\u9650\u6269\u5c55\uff0c\u5728\u6bcf\u65e5\u6784\u5efa\u548c\u6301\u7eed\u96c6\u6210\u6d41\u7a0b\u843d\u5730\u4f7f\u7528\u3002 \u4ee3\u7801\u89c4\u8303\u95ee\u9898\u6e05\u96f6\uff0c\u7b26\u5408 Shell Check\u3001Pylint\u3001\u7cfb\u7edf\u90e8\u76f8\u5173\u7f16\u7801\u89c4\u8303\u8981\u6c42\u3002 \u610f\u4e49\uff1a \u7edf\u4e00\u6210\u7814 AT \u67b6\u6784\u8bbe\u8ba1\u601d\u8def\uff0c\u6d88\u9664 AT \u4ee3\u7801\u5b9e\u73b0\u548c\u7ef4\u62a4\u4e0a\u53ef\u80fd\u51fa\u73b0\u7684\u5206\u6b67\uff0c\u6539\u5584\u5386\u53f2 AT \u65e0\u5de5\u7a0b\u5316\u8bbe\u8ba1\u7684\u7f3a\u9677\uff0c\u63d0\u9ad8\u67b6\u6784\u4e13\u4e1a\u6027\u3002 \u5404\u5e94\u7528 AT \u4ee3\u7801\u76f8\u4e92\u72ec\u7acb\uff0c\u5951\u5408\u5e94\u7528\u72ec\u7acb\u53d1\u5e03\u7279\u6027\uff0c\u53ef\u652f\u6301\u8fed\u4ee3\u671f\u95f4\u72ec\u7acb\u65b0\u589e\u3001\u7ef4\u62a4\u548c\u6267\u884c\u3002 \u65b9\u6cd5\u8c03\u7528\u903b\u8f91\u5f97\u5230\u7b80\u5316\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u66f4\u9ad8\u6548\uff1b\u516c\u5171\u5e93\u62bd\u53d6\uff0c\u51cf\u5c11\u65b9\u6cd5\u91cd\u590d\u7f16\u5199\uff0c\u63d0\u9ad8\u4ee3\u7801\u5229\u7528\u7387\uff1b\u5e73\u5747\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u4ece40\u5206\u949f\u964d\u4f4e\u81f330\u5206\u949f\uff0c\u65e5\u4ea7\u51fa\u7528\u4f8b\u4ece12\u6761/\u5929\u63d0\u5347\u81f316\u6761/\u5929\u3002 \u53ef\u7075\u6d3b\u652f\u6491\u4e0d\u540c\u7684\u81ea\u52a8\u5316\u8fd0\u7528\u573a\u666f\uff0c\u5982 CI\u3001\u5192\u70df\u6d4b\u8bd5\u3001\u96c6\u6210\u6d4b\u8bd5\u3001\u56de\u5f52\u6d4b\u8bd5\u3001\u4e13\u9879\u6d4b\u8bd5\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_2","title":"\u4e00\u3001\u80cc\u666f\u4ecb\u7ecd","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1","title":"1\u3001\u73b0\u6709\u67b6\u6784\u4ecb\u7ecd","text":"\u73b0\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u6574\u4f53\u5206\u4e3a\u4e09\u5c42\uff1a\u7528\u4f8b\u5c42\uff08\u4e1a\u52a1\u903b\u8f91\u5c42\uff09\u3001\u4e2d\u95f4\u5c42\uff08\u5143\u7d20\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff09\u3001\u6838\u5fc3\u5c42\uff08\u5e95\u5c42\u529f\u80fd\u5e93\u5c42\uff09\u3002 \u7528\u4f8b\u5c42\uff1a\u5373\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4e13\u6ce8\u4e8e\u4e1a\u52a1\u529f\u80fd\u903b\u8f91\uff0c\u4e0d\u5173\u5fc3\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\uff1b \u4e2d\u95f4\u5c42\uff1a\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff0c\u6bcf\u4e2a\u65b9\u6cd5\u5747\u5bf9\u5e94\u4e00\u4e2a\u5143\u7d20\u7684\u4e00\u4e2a\u5177\u4f53\u64cd\u4f5c\uff0c\u4e5f\u53ef\u4ee5\u662f\u591a\u4e2a\u64cd\u4f5c\u7684\u7ec4\u5408\u64cd\u4f5c\uff0c\u4e2d\u95f4\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u7528\u4f8b\u5c42\uff0c\u5177\u6709\u53ef\u6269\u5c55\u6027\u548c\u590d\u7528\u6027\uff1b \u6838\u5fc3\u5c42\uff1a\u4e3b\u8981\u5c01\u88c5\u7684\u5e95\u5c42\u529f\u80fd\u5b9e\u73b0\uff0c\u6b64\u5c42\u5728\u6846\u67b6\u4e2d\u63d0\u4f9b\u4e00\u4e9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u529f\u80fd\u6a21\u5757\u76f8\u5bf9\u72ec\u7acb\uff0c\u6838\u5fc3\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u64cd\u4f5c\u5c42\uff0c\u6bd4\u5982\uff1a\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7 UI \u5750\u6807\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u952e\u9f20\u64cd\u4f5c\u7684\u57fa\u7840\u65b9\u64cd\u4f5c\u6a21\u5757\u3001Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757\u3001\u6587\u4ef6\u7684\u589e\u5220\u6539\u67e5\u64cd\u4f5c\u6a21\u5757\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2","title":"2\u3001\u81ea\u52a8\u5316\u7684\u5e94\u7528","text":"2.1\u3001CI \u6d41\u7a0b \u6bcf\u65e5\u6784\u5efa\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u7814\u53d1\u6bcf\u65e5\u63d0\u4ea4\u7684\u4ee3\u7801\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u73ed\u4e4b\u540e\u4f1a\u5c06\u5404\u5e94\u7528\u8fdb\u884c\u6253\u5305\uff0c\u7136\u540e\u5728\u6d4b\u8bd5\u673a\u4e0a\u5b89\u88c5\u66f4\u65b0 deb \u5305\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u5e94\u7528\u63d0\u4ea4\u96c6\u6210\u7684\u7248\u672c\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u8f7d\u6700\u65b0\u7684 ISO \u8fdb\u884c PXE \u90e8\u7f72\uff0c\u7136\u540e\u6d4b\u8bd5\u673a\u5b89\u88c5\u6700\u65b0\u7684\u955c\u50cf\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 2.2\u3001\u9a8c\u6536\u6d4b\u8bd5 \u5728\u5404\u9a8c\u6536\u8282\u70b9\u8fdb\u884c\u81ea\u52a8\u5316\u9a8c\u6536\uff0c\u76ee\u524d\u7684\u7b56\u7565\u662f\u5168\u7528\u4f8b\u8986\u76d6\u5168\u67b6\u6784\u3002 2.3\u3001\u56de\u5f52\u6d4b\u8bd5 \u56de\u5f52\u6d4b\u8bd5\u4eca\u5e74\u89c4\u5212\u5efa\u8bbe\u4e2d\uff0c\u65e8\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u6267\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\uff0c\u51cf\u5c11\u529f\u80fd\u6d4b\u8bd5\u7684\u91cd\u590d\u52b3\u52a8\u529b\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3","title":"3\u3001\u5b58\u5728\u7684\u95ee\u9898","text":" \u5404\u5e94\u7528\u4e4b\u95f4\u5b58\u5728\u8026\u5408 \u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u521d\u671f\uff0c\u6240\u6709\u5e94\u7528\u662f\u6574\u4f53\u53d1\u5e03\uff0c\u6211\u4eec\u662f\u5c06\u6240\u6709\u5e94\u7528\u770b\u6210\u662f\u4e00\u4e2a\u6574\u4f53\uff0c\u5404\u5e94\u7528\u4f5c\u4e3a\u5176\u4e2d\u7684\u4e00\u4e2a\u6a21\u5757\uff0c\u6240\u4ee5\u5b58\u5728\u5e94\u7528\u95f4\u65b9\u6cd5\u4ea4\u53c9\u8c03\u7528\u7684\u95ee\u9898\uff0c\u8fd9\u6837\u4ece\u6700\u521d\u7684\u8bbe\u8ba1\u6765\u8bb2\u786e\u5b9e\u80fd\u591f\u51cf\u5c11\u91cd\u590d\u4ee3\u7801\u7684\u7f16\u5199\u3002\u4f46\u662f\u73b0\u5728\u5e94\u7528\u8d70\u72ec\u7acb\u53d1\u5e03\uff0c\u5404\u5e94\u7528\u90fd\u6709\u81ea\u5df1\u7684\u8fed\u4ee3\u8282\u594f\uff0c\u5728\u65b0\u9700\u6c42\u5feb\u901f\u53d8\u5316\u7684\u8fc7\u7a0b\u4e2d\uff0c\u81ea\u52a8\u5316\u7ef4\u62a4\u53d8\u5f97\u5f02\u5e38\u56f0\u96be\uff0c\u539f\u56e0\u5c31\u662f\u81ea\u52a8\u5316\u9879\u76ee\u91cc\u9762\u5404\u4e2a\u5e94\u7528\u7684\u6709\u6bd4\u8f83\u591a\u7684\u8026\u5408\u5173\u7cfb\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u8fdb\u884c\u89e3\u8026\uff0c\u4ee5\u9002\u5e94\u5e94\u7528\u4e0d\u540c\u7684\u8fed\u4ee3\u5468\u671f\u3002 \u65e0\u6cd5\u7cbe\u51c6\u7684\u5212\u5206\u7528\u4f8b\u8303\u56f4 \u7528\u4f8b\u6267\u884c\u7684\u8303\u56f4\u4e0d\u591f\u7cbe\u51c6\uff0c\u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u4e3b\u8981\u901a\u8fc7\u7528\u4f8b\u7684\u5173\u952e\u8bcd core\uff08\u6838\u5fc3\uff09\u6765\u533a\u5206\u7528\u4f8b\u662f\u5426\u4e3a\u6838\u5fc3\u7528\u4f8b\uff0c\u4f46\u662f\u8fd9\u6837\u7684\u533a\u5206\u592a\u5bbd\u6cdb\u4e86\uff0c\u4e0d\u80fd\u9002\u5e94\u81ea\u52a8\u5316\u6d4b\u8bd5\u5728\u591a\u573a\u666f\u4e0b\u7684\u5e94\u7528\u3002\u5f88\u591a\u573a\u666f\u4e0b\u6211\u4eec\u8fd8\u9700\u8981\u6839\u636e\u7528\u4f8b\u7684\u7b49\u7ea7\u3001\u7528\u4f8b\u7684\u7c7b\u578b\u3001\u7528\u4f8b\u6765\u6e90\u7b49\u7b49\uff0c\u4e0d\u540c\u7684\u7ef4\u5ea6\u6765\u6311\u9009\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u5173\u952e\u5b57\u9700\u8981\u4eba\u5de5\u4e00\u6761\u6761\u7684\u6539\uff0c\u8d39\u65f6\u8d39\u529b\uff0c\u800c\u4e14\u4e0d\u597d\u7ef4\u62a4\u3002 \u53d7\u65b0\u9700\u6c42\u5f71\u54cd\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u597d\u7ef4\u62a4 \u76ee\u524d\u9700\u8981\u8df3\u8fc7\u7684\u7528\u4f8b\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684\u7528\u4f8b\u811a\u672c\u91cc\u9762\uff0c\u6dfb\u52a0\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\uff0c\u540e\u7eed\u89e3\u9664\u8df3\u8fc7\u7684\u65f6\u5019\u53c8\u9700\u8981\u627e\u5230\u8fd9\u6761\u811a\u672c\uff0c\u5220\u6389\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\u3002\u5728\u8df3\u8fc7\u7528\u4f8b\u8f83\u591a\u7684\u60c5\u51b5\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u96be\u5ea6\u3002 \u7f16\u5199\u7528\u4f8b\u65f6\u903b\u8f91\u6bd4\u8f83\u590d\u6742\uff0c\u9700\u8981\u8c03\u7528\u591a\u4e2a\u5e94\u7528\u7684\u65b9\u6cd5\u6a21\u5757\u3002 \u6846\u67b6\u6269\u5c55\u6027\u4e0d\u8db3\uff0c\u65e0\u6cd5\u6574\u5408\u6027\u80fd\u81ea\u52a8\u5316\u3001\u538b\u6d4b\u81ea\u52a8\u5316\u3001\u5b89\u5168\u81ea\u52a8\u5316\u7b49\u4e13\u9879\u6d4b\u8bd5\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_3","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u4e3a\u89e3\u51b3\u73b0\u6709\u95ee\u9898\uff0c\u9002\u5e94\u4e0d\u65ad\u4e30\u5bcc\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u66f4\u597d\u7684\u53d1\u6325\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4f5c\u7528\uff0c\u9700\u8981\u5bf9\u81ea\u52a8\u5316\u67b6\u6784\u53ca\u5404\u529f\u80fd\u6a21\u5757\u8fdb\u884c\u91cd\u65b0\u8bbe\u8ba1\u89c4\u5212\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_1","title":"1\u3001\u67b6\u6784\u8bbe\u8ba1","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_1","title":"2\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u6846\u67b6\u7684\u8fd0\u884c\u903b\u8f91\uff1a\u901a\u8fc7\u6838\u5fc3\u5c42\u63d0\u4f9b\u4e00\u4e2a\u57fa\u7840\u80fd\u529b\uff0c\u4e1a\u52a1\u5c42\u6839\u636e\u5b9e\u9645\u4e1a\u52a1\u9700\u6c42\uff08\u6d4b\u8bd5\u7528\u4f8b\uff09\u52a8\u6001\u52a0\u8f7d\u6838\u5fc3\u5c42\uff0c\u6267\u884c\u5165\u53e3\u52a0\u8f7d\u76f8\u5e94\u7684\u7528\u4f8b\u96c6\u5e76\u63a7\u5236\u6267\u884c\uff0c\u5e94\u7528\u5c42\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u9700\u6c42\uff0c\u901a\u8fc7\u76f8\u5e94\u7684\u914d\u7f6e\u9879\u8fdb\u884c\u914d\u7f6e\uff0c\u4ece\u800c\u89e6\u53d1\u81ea\u52a8\u5316\u6d4b\u8bd5\u4efb\u52a1\u3002 \u6838\u5fc3\u5c42\uff1a\u57fa\u672c\u4fdd\u6301\u4e0d\u53d8\uff0c\u90e8\u5206\u6a21\u5757\u4f1a\u6d89\u53ca\u5230\u65b0\u529f\u80fd\u5f00\u53d1\uff0c\u6838\u5fc3\u5c42\u5404\u529f\u80fd\u6a21\u5757\u4fdd\u6301\u72ec\u7acb\u6027\uff0c\u63d0\u4f9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u4f9b\u4e0a\u5c42\u8c03\u7528\uff1b \u5e95\u5c42\u6838\u5fc3\u6a21\u5757\u5305\u62ec\uff1a \u56fe\u50cf\u8bc6\u522b\u6a21\u5757 UI \u5b9a\u4f4d\u6a21\u5757 Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757 \u5c5e\u6027\u5b9a\u4f4d\u6a21\u5757 \u65e5\u5fd7\u6a21\u5757 \u952e\u9f20\u64cd\u4f5c\u6a21\u5757 \u6587\u4ef6\u64cd\u4f5c\u6a21\u5757 \u5f55\u5c4f\u6a21\u5757 \u81ea\u5b9a\u4e49\u65ad\u8a00\u6a21\u5757 \u7528\u4f8b\u6267\u884c\u6a21\u5757 PXE \u88c5\u673a\u6a21\u5757 \u952e\u9f20\u4fe1\u53f7\u6a21\u62df\u6a21\u5757 OCR \u6a21\u5757 \u4e1a\u52a1\u5c42\uff1a\u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e94\u7528\u5185\u5305\u542b\u591a\u4e2a\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5982\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7b49\uff0c\u540e\u7eed\u53ef\u4ee5\u6839\u636e\u9700\u8981\u5ac1\u63a5\u8fdb\u6765\u3002\u5176\u4e2d\u529f\u80fd\u6d4b\u8bd5\u8bbe\u8ba1\u601d\u8def\uff1a \u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e76\u5c06\u6d4b\u8bd5\u6570\u636e\u548c\u6d4b\u8bd5\u8d44\u6e90\u6574\u5408\u8fdb\u6765\uff0c\u589e\u52a0\u7528\u4f8b\u6807\u7b7e csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ed9\u6bcf\u6761\u7528\u4f8b\u6253\u6807\u7b7e\u3002 \u5404\u6807\u7b7e\u6240\u4f7f\u7528\u5bf9\u5e94\u7684\u5b57\u6bb5\u540d\u79f0\uff0c\u4f7f\u7528 csv \u6587\u4ef6\u7ef4\u62a4\u7528\u4f8b\u4e0e\u6807\u7b7e\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u5bf9\u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u53ef\u4ee5\u7ec4\u5408\u5176\u4e2d\u7684\u6807\u7b7e\u800c\u4ece\u9a71\u52a8\u5bf9\u5e94\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\uff0c\u517c\u5bb9\u73b0\u6709\u7528\u4f8b\u6807\u7b7e\uff0c\u4e14\u652f\u6301\u7528\u4f8b\u6807\u7b7e\u53ef\u6269\u5c55\uff1b \u4f7f\u7528 csv \u683c\u5f0f\u6587\u4ef6\u53ef\u4ee5\u65b9\u4fbf\u7684\u4f7f\u7528 Excel \u8868\u683c\u6253\u5f00\u8fdb\u884c\u7f16\u8f91\uff0c\u540c\u65f6\u7531\u4e8e csv \u6587\u4ef6\u5b9e\u9645\u662f\u4ee5\u90fd\u597d\u5206\u9694\u7684\u6587\u672c\u6587\u4ef6\uff0c\u4ee3\u7801\u4e2d\u53ef\u4ee5\u5728\u4e0d\u4f9d\u8d56\u4e09\u65b9\u5e93\u7684\u60c5\u51b5\u4e0b\u65b9\u4fbf\u5feb\u901f\u7684\u89e3\u6790\u5b83\uff0c\u53ef\u64cd\u4f5c\u6027\u548c\u53ef\u7ef4\u62a4\u6027\u8f83\u9ad8\u3002 \u5404\u4e2a\u5e94\u7528\u4e4b\u95f4\uff0c\u7528\u4f8b\u3001\u65b9\u6cd5\u3001\u6807\u7b7e\u548c\u8d44\u6e90\u90fd\u662f\u76f8\u4e92\u72ec\u7acb\u7684\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u7528\u4f8b\u65f6\u53ea\u9700\u8981\u81ea\u5df1\u5e94\u7528\u4e0b\u7684\u65b9\u6cd5\u548c\u516c\u5171\u5e93\u5373\u53ef\u3002 \u7ed3\u6784\u4e3e\u4f8b\uff1a .\n\u251c\u2500\u2500 apps\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_album # \u5e94\u7528\u540d (\u7528\u4e0b\u5212\u7ebf\u8fde\u63a5\u662f Python \u7f16\u7801\u89c4\u8303)\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_assert # \u65ad\u8a00\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_function_tag.csv # \u7528\u4f8b\u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 asan_cases # \u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases # \u529f\u80fd\u6d4b\u8bd5\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 res # \u6d4b\u8bd5\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config # \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_widget # \u5e94\u7528\u81ea\u5df1\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_widget # \u65b9\u6cd5\u57fa\u7c7b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 other_widget # \u8c03\u7528\u5176\u4ed6\u5e94\u7528\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_camera\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases\n\u2502\u00a0\u00a0 \u2502\u00a0 ...\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 public_widget # \u516c\u5171\u65b9\u6cd5\u5e93\n\u251c\u2500\u2500 config # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n...\n config \u914d\u7f6e\u6a21\u5757\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u76f8\u5e94\u914d\u7f6e\uff0c\u6d4b\u8bd5\u540c\u5b66\u53ef\u4ee5\u6839\u636e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5728 config \u91cc\u9762\u8fdb\u884c\u914d\u7f6e\u3002 \u5168\u5c40\u914d\u7f6e\uff1a \u6267\u884c\u4e00\u4e2a\u6216\u591a\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff1a\u5728 pattern \u91cc\u9762\u5199\u5165\u5e94\u7528\u5305\u540d\uff0c\u591a\u4e2a\u5e94\u7528\u4e4b\u95f4\u7528 or \u8fde\u63a5\uff0c\u5982 deepin-music or deepin-movie\uff1b \u5192\u70df\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a smoke\uff1b \u96c6\u6210\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a core \uff1b \u5168\u91cf\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u4e3a\u7a7a\u5373\u53ef\uff1b \u901a\u8fc7 tags \u7684\u914d\u7f6e\u6bd4\u8f83\u7075\u6d3b\uff0c\u540e\u9762\u6807\u7b7e\u5316\u7ba1\u7406\u7ae0\u8282\u4f1a\u8bb2\u5230\uff0c\u652f\u6301\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u7075\u6d3b\u914d\u7f6e\u3002 \u6307\u5b9a\u67d0\u53f0\u673a\u5668\u5728\u6307\u5b9a\u955c\u50cf\u7248\u672c\u4e0a\u6267\u884c\u7528\u4f8b\uff1a\u5728 IP \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a IP\uff0c\u5e76\u5728 URL \u91cc\u9762\u586b\u5165\u955c\u50cf\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u6846\u67b6\u4f1a\u8c03\u7528 PXE \u8fdb\u884c\u81ea\u52a8\u88c5\u673a\uff0c\u88c5\u673a\u5b8c\u4e4b\u540e\u81ea\u52a8\u5f00\u59cb\u6267\u884c\u914d\u7f6e\u7684\u6d4b\u8bd5\u7528\u4f8b\u3002 \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\uff1a \u6bcf\u4e2a\u5e94\u7528\u5185\u90e8\u4f1a\u6709\u4e00\u4e2a\u5355\u72ec\u7684\u914d\u7f6e\u6a21\u5757\uff0c\u4f1a\u5305\u542b\u4e00\u4e9b\u672c\u5e94\u7528\u7684\u6d4b\u8bd5\u8d44\u6e90\u7684\u8def\u5f84\u3001\u6267\u884c\u7528\u4f8b\u7684\u6807\u7b7e\u914d\u7f6e\u7b49\u7b49\uff0c\u5982\u679c\u5728\u5c40\u90e8\u914d\u7f6e\u91cc\u9762\u914d\u7f6e\u4e86\u7528\u4f8b\u6267\u884c\u6807\u7b7e\uff0c\u800c\u5916\u5c42 runner \u51fa\u6ca1\u6709\u6307\u5b9a\u6267\u884c\u6807\u7b7e\uff0c\u5219\u5728\u6267\u884c\u65f6\u53ea\u4f1a\u6267\u884c\u5c40\u90e8\u914d\u7f6e\u5df2\u914d\u7f6e\u7684\uff0c\u82e5\u5916\u5c42 runner \u4e5f\u914d\u7f6e\u4e86\u6267\u884c\u6807\u7b7e\uff0c\u5219\u4f1a\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u7528\u4f8b\u3002 \u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u914d\u7f6e\u90fd\u5728\u540c\u4e00\u4e2a\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\uff0cpy \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684\u7c7b\uff0cini \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684 option\u3002 \u5168\u5c40\u914d\u7f6e\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u7b56\u7565\u5982\u4e0b\uff1a \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5c40\u90e8\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5e94\u7528\u5c42\uff1arunner \u662f\u6d4b\u8bd5\u6267\u884c\u7684\u5165\u53e3\uff0c\u5b83\u4f1a\u6839\u636e\u914d\u7f6e\u91cc\u9762\u7684\u914d\u7f6e\u9879\uff0c\u8fdb\u884c\u7528\u4f8b\u7684\u52a0\u8f7d\u548c\u6267\u884c\u3002\u5b83\u63d0\u4f9b\u63a5\u53e3\u7ed9\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\uff0c\u5e73\u53f0\u4e0a\u7684\u6307\u4ee4\u5b9e\u9645\u4e0a\u90fd\u662f\u901a\u8fc7\u4e0b\u53d1\u7ed9 runner\uff0c\u7136\u540e\u7531 runner \u6765\u6267\u884c\u76f8\u5e94\u7684\u6d4b\u8bd5\u3002 \u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u662f\u4e00\u4e2a\u524d\u7aef\u7cfb\u7edf\uff0c\u53ef\u4ee5\u8fdb\u884c\u6d4b\u8bd5\u673a\u7ba1\u7406\u3001\u81ea\u52a8\u5b89\u88c5\u955c\u50cf\u3001\u81ea\u52a8\u5b89\u88c5\u6307\u5b9a\u5e94\u7528\u7248\u672c\u3001\u8fdb\u884c\u6d4b\u8bd5\u7528\u4f8b\u8303\u56f4\u9009\u62e9\u3001\u7528\u4f8b\u89e6\u53d1\u6267\u884c\u63a7\u5236\u3001\u7ed3\u679c\u5c55\u793a\u8f93\u51fa\u7b49\u3002 \u4e00\u4e2a\u5e94\u7528\u7684\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\u90fd\u53ef\u4ee5\u5355\u72ec\u89e6\u53d1\u3002 \u517c\u5bb9\u6027\u6d4b\u8bd5\u4e3b\u8981\u901a\u8fc7 PXE \u670d\u52a1\u5668\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u88c5\u673a\uff0c\u7136\u540e\u914d\u5408 AT \u8fdb\u884c\u6d4b\u8bd5\uff0c\u53ef\u4ee5\u5b9e\u73b0\u4e0d\u540c\u7cfb\u7edf\u7248\u672c\u3001\u4e0d\u540c\u5e94\u7528\u7248\u672c\u73af\u5883\u4e0a\u90fd\u53ef\u4ee5\u8fdb\u884c\u81ea\u52a8\u5316\u7684 AT \u6267\u884c\uff0c\u63d0\u9ad8\u517c\u5bb9\u6027\u6d4b\u8bd5\u6548\u7387\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_4","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_2","title":"1\u3001\u7528\u4f8b\u89e3\u8026","text":"\u5b58\u5728\u8026\u5408\u5173\u7cfb\u7684\u65b9\u6cd5\uff1a\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u88ab\u5916\u90e8\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\uff0c\u5219\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u8026\u5408\u5173\u7cfb\u3002 1.1\u3001\u901a\u8fc7\u7f16\u8f91\u5668 Find Usages \u67e5\u770b\u6bcf\u4e2a\u65b9\u6cd5\u88ab\u8c03\u7528\u7684\u8def\u5f84\u548c\u88ab\u8c03\u7528\u6b21\u6570\uff1b 1.2\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 1 \u4e2a\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728\u5916\u90e8\u5e94\u7528\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1b 1.3\u3001\u64cd\u4f5c\u5c42\u6587\u4ef6\u540d\u5747\u4ee5 widget \u7ed3\u5c3e\uff0c\u7c7b\u540d\u4ee5 Widget \u7ed3\u5c3e\uff0c\u5982\uff1a\u6587\u4ef6\u540d music_widget.py \uff1a class MusicWidget:\n\"\"\"\u97f3\u4e50\u7684\u64cd\u4f5c\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_2","title":"2\u3001\u516c\u5171\u5e93\u5efa\u8bbe","text":"2.1\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 2 \u4e2a\u53ca\u4ee5\u4e0a\u7684\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728 public_widget \u76ee\u5f55\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1bpublic_widget \u5373\u4e3a\u516c\u5171\u65b9\u6cd5\u5e93\uff1b 2.2\u3001\u5728\u7528\u4f8b\u5c42\u4fee\u6539\u7528\u4f8b\u4e2d\u7c7b\u7684\u5bfc\u5165\u8def\u5f84\uff0c\u5c5e\u4e8e\u516c\u5171\u65b9\u6cd5\u7684\u5219\u8c03\u7528 public_widget \u4e2d\u7684\u7c7b\uff0c\u5916\u90e8\u5e94\u7528\u7684\u64cd\u4f5c\u65b9\u6cd5\uff0c\u5219\u8c03\u7528\u672c\u5e94\u7528\u76ee\u5f55\u4e0b\u91cd\u5199\u7684\u5916\u90e8\u5e94\u7528\u65b9\u6cd5\u3002 \u6bd4\u5982\uff1a\u51e0\u4e4e\u6240\u6709\u591a\u5a92\u4f53\u5e94\u7528\u90fd\u9700\u8981\u901a\u8fc7\u6587\u7ba1\u52a0\u8f7d\u8d44\u6e90\uff0c\u8c03\u8d77\u7684\u6587\u7ba1\u5bf9\u8bdd\u6846\u5b9e\u9645\u4e3a dde-desktop\uff0c\u56e0\u6b64\u5c06 desktop_widget.py \u653e\u5230 public_widget \u91cc\u9762\uff1a class DdeDesktopPublicWidget:\n\"\"\"\u516c\u5171-\u684c\u9762\u7684\u64cd\u4f5c\u65b9\u6cd5\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3_1","title":"3\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406","text":"3.1\u3001\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1a\u5bf9\u5e94 core\u3001smoke\uff0c\u6216\u4e3a\u7a7a\uff1b \u7528\u4f8b\u6765\u6e90\uff1a\u5bf9\u5e94 PMS \u7528\u4f8b\u6765\u6e90\uff0c\u5206\u522b\u7528 acp1\u3001acp2\u3001acp3\u3001acp4 \u8868\u793a\u3002 acp1 \uff1a\u4e1a\u52a1\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5199\u7684\u7528\u4f8b\uff0c\u88ab\u7528\u4e8e\u9a8c\u6536\u6d4b\u8bd5\u7684\uff1b acp2 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5f15\u5165\u7684\u4ea7\u54c1\u9a8c\u6536\u6d4b\u8bc4\u90e8\u7684\u7528\u4f8b\uff1b acp3 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u6839\u636e\u4ea7\u54c1\u9700\u6c42\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\uff1b acp4 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u901a\u8fc7\u793e\u533a\u3001\u8bba\u575b\u7528\u6237\u53cd\u9988\u95ee\u9898\u603b\u7ed3\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\u3002 \u4e3e\u4f8b\uff1a \u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u7528\u4f8b\u6765\u6e90 001 L1 core acp1 \u6807\u7b7e\u91c7\u7528\u679a\u4e3e\u7684\u65b9\u5f0f\u8fdb\u884c\u4ee3\u53f7\u7ba1\u7406\u65b9\u4fbf\u7ba1\u7406\u4ee5\u53ca\u540e\u7eed\u6269\u5c55\u3002 3.2\u3001\u5728\u6bcf\u4e2a\u5e94\u7528\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u7b2c\u4e00\u5217\u4e3a\u7528\u4f8b\u7684 ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ba1\u7406\u6a21\u5757\u5185\u7684\u7528\u4f8b\u6807\u7b7e\u3002\u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 3.3\u3001\u5bf9\u7167 PMS \u4e0a\u7528\u4f8b\u7b49\u7ea7\u3001\u7528\u4f8b\u7c7b\u578b\u548c\u7528\u4f8b\u6765\u6e90\uff0c\u6807\u8bb0\u6240\u6709\u5df2\u5b9e\u73b0\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u540e\u7eed\u7f16\u5199\u65b0\u589e\u81ea\u52a8\u5316\u7528\u4f8b\u65f6\uff0c\u6bcf\u5199\u4e00\u6761\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684 csv \u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u6b64\u6761\u7528\u4f8b\u7684\u6807\u7b7e\u3002 3.4\u3001\u8df3\u8fc7\u7528\u4f8b\u6807\u7b7e\u5316 \u73b0\u6709\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a\uff1a \u4e3e\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u8bb0\u4e3a \u201cskip-\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u8bb0\uff0c\u5982\u679c\u5df2\u7ecf\u6807\u8bb0\u4e86\u8df3\u8fc7\u539f\u56e0\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u8bb0\u4e3a SKIPED\uff0c\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\u3002 \u6240\u6709\u7684\u6807\u7b7e\u5728 docs \u76ee\u5f55\u4e0b\u4f1a\u6709\u4e00\u4e2a\u6587\u6863\uff0c\u6587\u6863\u6682\u5b9a\u540d\u79f0\u4e3a\uff1atags_info.md\uff0c\u7528\u4e8e\u8bf4\u660e\u73b0\u5728\u5df2\u7ecf\u4f7f\u7528\u5230\u7684\u6807\u7b7e\uff0c\u4ee5\u53ca\u8fd9\u4e9b\u6807\u7b7e\u7684\u89e3\u91ca\u548c\u7528\u6cd5\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#4","title":"4\u3001\u7528\u4f8b\u6267\u884c","text":"4.1\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u7684\u9a71\u52a8\u6267\u884c\u903b\u8f91\u529f\u80fd\u5b9e\u73b0 \u5f00\u53d1\u6839\u636e\u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\u91cc\u9762\u7684\u7528\u4f8b\u6807\u7b7e\u6267\u884c\u5bf9\u5e94\u7528\u4f8b\u7684\u529f\u80fd\uff0c\u80fd\u652f\u6301\u591a\u4e2a\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u6267\u884c\u5165\u53e3\u80fd\u968f\u610f\u901a\u8fc7\u7528\u4f8b\u6807\u7b7e\u6307\u5b9a\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002 \u7528\u4f8b\u6807\u7b7e\u7684\u9a71\u52a8\u65b9\u5f0f\u5fc5\u987b\u80fd\u652f\u6301\u6807\u7b7e\u7684\u6269\u5c55\uff0c\u672a\u6765\u968f\u7740\u4e1a\u52a1\u7684\u53d8\u5316\u53ef\u80fd\u9700\u8981\u589e\u52a0\u5404\u79cd\u5404\u6837\u7684\u6807\u7b7e\u3002 4.2\u3001\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u6267\u884c \u529f\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u3001\u6027\u80fd\u6d4b\u8bd5\u7b49\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u662f\u5206\u5f00\u6267\u884c\u7684\uff0c\u4e5f\u5c31\u662f\u5728\u4e00\u6b21\u6267\u884c\u4e2d\uff0c\u53ea\u80fd\u6267\u884c\u5176\u4e2d\u4e00\u79cd\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5177\u4f53\u8981\u6267\u884c\u54ea\u4e00\u79cd\u540c\u6837\u901a\u8fc7\u53c2\u6570\u6765\u63a7\u5236\u3002 4.3\u3001\u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c \u7531\u4e8e\u6d4b\u8bd5\u673a\u8d44\u6e90\u6709\u9650\uff0c\u968f\u7740\u81ea\u52a8\u5316\u7528\u4f8b\u6570\u91cf\u7684\u589e\u52a0\uff0cCI \u6267\u884c\u65f6\u95f4\u4f1a\u8d8a\u6765\u8d8a\u957f\u3002 \u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c\u7684\u529f\u80fd\uff1a \u540c\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\u5206\u6563\u5230\u4e0d\u540c\u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u4e0a\u6267\u884c\uff0c\u7f29\u77ed\u6267\u884c\u603b\u65f6\u95f4\uff1b \u7b2c\u4e8c\u5929\u8dd1\u7684\u65f6\u5019\u540c\u4e00\u4e2a\u673a\u5668\u4e0a\u4f1a\u6267\u884c\u6628\u5929\u6ca1\u6709\u6267\u884c\u5230\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u6267\u884c\u540c\u7406\uff1b \u53ef\u4ee5\u5b9e\u73b0\u5728\u5168\u67b6\u6784\u6d4b\u8bd5\u673a\u4e0a\u8f6e\u6d41\u6267\u884c\u7528\u4f8b\uff0c\u65e2\u80fd\u4fdd\u8bc1\u6267\u884c\u4e86\u6240\u6709\u7684\u7528\u4f8b\uff0c\u53c8\u80fd\u5728\u8d44\u6e90\u6709\u9650\u7684\u60c5\u51b5\u4e0b\u8986\u76d6\u4e86\u6240\u6709\u7684\u67b6\u6784\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#5","title":"5\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0","text":"5.1\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u4f5c\u4e3a\u524d\u7aef\u754c\u9762\u7cfb\u7edf\uff0c\u901a\u8fc7\u9875\u9762\u4e0a\u7684\u4e00\u4e9b\u529f\u80fd\u9009\u9879\u8fdb\u884c\u5bf9\u5e94\u6d4b\u8bd5\u4efb\u52a1\u7684\u7ba1\u7406\u6216\u89e6\u53d1\uff0c\u4e1a\u5185\u6bd4\u8f83\u6d41\u884c\u7684\u5b9e\u73b0\u65b9\u6848\u662f\u4f7f\u7528 Vue + DRF \u5b9e\u73b0\u4e00\u4e2a\u524d\u540e\u7aef\u5206\u79bb\u7684\u7cfb\u7edf\u3002 \u6d4b\u8bd5\u5e73\u53f0\u53ef\u80fd\u4f1a\u6d89\u53ca\u5230\u7684\u6a21\u5757\u6709\uff1a\u6d4b\u8bd5\u673a\u8d44\u6e90\u7ba1\u7406\u6a21\u5757\u3001\u7528\u4f8b\u6267\u884c\u63a7\u5236\u6a21\u5757\u3001\u7ed3\u679c\u5c55\u793a\u6a21\u5757\u3001PXE \u955c\u50cf\u5b89\u88c5\u6a21\u5757\u7b49\u3002 \u7528\u6237\uff08\u6d4b\u8bd5\u3001\u7814\u53d1\u540c\u5b66\u7b49\uff09\u53ef\u4ee5\u914d\u7f6e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5982\u6267\u884c\u54ea\u4e2a\u5e94\u7528\u3001\u6267\u884c\u7528\u4f8b\u7684\u8303\u56f4\u3001\u5728\u54ea\u53f0\u673a\u5668\u4e0a\u6267\u884c\u3001\u955c\u50cf\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u5e94\u7528\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u6267\u884c\u65f6\u95f4\u3002 5.2\u3001\u6267\u884c\u5165\u53e3 runner \u63d0\u4f9b\u7ed9\u6d4b\u8bd5\u5e73\u53f0\u7684\u63a5\u53e3\u5305\u62ec\uff1a\u7528\u4f8b\u6267\u884c\u63a5\u53e3\u3001\u7ed3\u679c\u8fd4\u56de\u63a5\u53e3\u3001\u955c\u50cf\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u955c\u50cf\u5b89\u88c5\u63a5\u53e3\u3001\u5e94\u7528\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u5e94\u7528\u5b89\u88c5\u66f4\u65b0\u63a5\u53e3\u7b49\u3002 \u524d\u7aef\u5e73\u53f0\u76ee\u524d\u8fd8\u6ca1\u6709\u592a\u591a\u8be6\u7ec6\u7684\u65b9\u6848\uff0c\u672c\u6b21\u8bbe\u8ba1\u4e3b\u8981\u96c6\u4e2d\u5728\u540e\u7aef\u8fd9\u90e8\u5206\u67b6\u6784\u7684\u8bbe\u8ba1\u4e0a\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_5","title":"\u56db\u3001\u5b9e\u65bd\u8ba1\u5212","text":"\u8fd1\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u6587\u7ba1\u4ee3\u7801\u89e3\u8026 2022/3/28 2022/4/8 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u56fe\u5f62\u56fe\u50cf\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u97f3\u89c6\u9891\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5168\u5c40\u641c\u7d22\u4ee3\u7801\u89e3\u8026 2022/4/25 2022/4/26 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u516c\u5171\u5e93\u5efa\u8bbe 2022/4/27 2022/5/5 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5c01\u88c5\u7684\u65b9\u6cd5\u6574\u7406\u6210\u4e00\u4e2a\u8868 2022/5/6 2022/5/10 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7528\u4f8b\u6807\u7b7e\u5206\u7c7b\u8bc4\u4f30 2022/5/11 2022/5/11 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u6807\u7b7e\u5316\u6267\u884c\u9a71\u52a8\u7a0b\u5e8f\u7f16\u5199 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u9700\u5b9e\u73b0\u81ea\u52a8\u89e3\u6790 csv \u8868\u683c\u4e2d\u7684\u7528\u4f8b\u7f16\u53f7 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u722c\u866b\u811a\u672c\uff0c\u722c\u53d6 pms \u4e0a\u7528\u4f8b\u7684\u6807\u7b7e 2022/5/11 2022/5/13 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u5b9a\u65f6\u81ea\u52a8\u7ef4\u62a4\u672c\u5730 csv \u6587\u4ef6\u811a\u672c 2022/5/11 2022/5/20 \u4e2d\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u76ee\u5f55\u7ed3\u6784\u8c03\u6574 2022/5/20 2022/6/2 \u5b8c\u6210\u5168\u5c40\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u5177\u4f53\u65b9\u6848\u548c\u903b\u8f91\u5b9e\u73b0 2022/6/6 2022/6/17 \u9759\u6001\u626b\u63cf\u95ee\u9898\u6e05\u96f6 2022/6/20 2022/7/1 \u5b8c\u6210\u65b0\u6846\u67b6\u4f7f\u7528\u57f9\u8bad 2022/7/4 2022/7/11 \u843d\u5730\u8fd0\u884c 2022/7/12 2022/7/20 \u5e95\u5c42\u5e93\u7528\u9014\u8bf4\u660e\u6587\u6863\u7f16\u5199 2022/7/21 2022/7/28"}]} \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz index 8ffaebc1..e0b7bbfc 100644 Binary files a/sitemap.xml.gz and b/sitemap.xml.gz differ diff --git "a/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" "b/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" index 25f669d5..97100667 100644 --- "a/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" +++ "b/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs @@ -1215,8 +1215,7 @@ 智能化功能测试# Attribution :chengdu Test Team # Date :2021/08/20 -此方案仍在演进中 -此方案仍在演进中 +此方案仍在演进中 仓库地址:https://gitlabcd.uniontech.com/autotest/cd-desktop-aitest 一、方案概述¶ 基于深度学习智能识别应用的元素控件,用于在自动化测试操作过程中的元素定位以及判断结果时的断言处理;自动化测试过程中,测试机上的画面通过采集盒传输到服务器上,服务器对视频画面进行智能识别后,服务器智能判断用例是否执行成功,然后对测试机下发下一步操作指令,测试机接受并执行下一步操作。 diff --git "a/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" "b/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" index cdf9ccde..06c9e9a5 100644 --- "a/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" +++ "b/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" @@ -95,7 +95,7 @@ - + @@ -226,7 +226,7 @@ - + YouQu Docs diff --git "a/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" "b/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" index 121b4507..72123668 100644 --- "a/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" +++ "b/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs @@ -752,6 +752,13 @@ + + + + + 4、虚拟化部署 + + @@ -1661,6 +1668,13 @@ + + + + + 4、虚拟化部署 + + @@ -2604,18 +2618,12 @@ 1、标签说明流水线使用指导; 跳过原因:skip-XXX,用于控制用例是否执行; 确认修复:fixed-XXX,用于标记用例的修复状态(后面详细讲解用法); @@ -2629,26 +2637,30 @@ 1、标签说明PMS用例ID 用例级别 用例类型 +设备类型 +用例来源 上线对象 测试级别 跳过原因 确认修复 -废弃用例 -... +废弃用例 +... -001 +679537 679537 L1 FUNC +PPL + CICD C1 skip-XXX fixed-XXX -removed-已废弃 -... +removed-已废弃 +... @@ -2656,7 +2668,7 @@ 2、操作步骤csv 的文件名。 例如: -相册的用例文件为 test_album_xxx.py,xxx 表示任意三位数字代表用例序号,此时 csv 文件名就应为 album.csv; +相册的用例文件为 test_album_xxx.py,xxx 表示用例的ID(也可以是自定义的数字代表用例序号),此时 csv 文件名就应为 album.csv; 对于用例规模比较大的应用,比如文件管理器,建议分模块,每个模块建立一个 csv 文件,所有 csv 文件建议放在一个 tags 目录下。 是否分模块维护 csv 取决于应用的用例复杂度,同时我们应该充分考虑后期的可维护性,csv 文件太多了也是一个很糟糕的事情。 @@ -2677,7 +2689,7 @@ 3.1.1、固定跳过001 +679537 ... skip-受到某新需求影响 @@ -2742,7 +2754,7 @@ 3.2、确认修复001 +679537 ... skip-受到某新需求影响 fixed-已修复 @@ -2787,7 +2799,7 @@ 3.3、废弃用例4、设计思路¶ 上面介绍 Pytest 框架提供的标签功能 mark,使用时需要为每一个用例添加标签装饰器,则操作复杂,可维护性差,其根本问题就是标签分散在每一条用例的装饰器上,难以集中维护;于是乎将所有标签使用 csv 文件进行集中管理,并通过 Pytest 的钩子函数,读取 csv 文件,动态添加标签到用中。 5、CSV文件格式¶ -此配置文件需要维护大量的标签数据,且要方便能使用Excel打开进行编辑查看,更重要的是我们不想引入三方依赖,CSV 文件几乎是唯一能满足所有的要求的文件格式。 +此配置文件需要维护大量的标签数据,且要方便能使用 Excel 打开进行编辑查看,更重要的是我们不想引入三方依赖,CSV 文件几乎是唯一能满足所有的要求的文件格式。 七、日志系统¶ 1、背景¶ 基于 YouQu 自动化测试框架操作方法封装写法,通常是这样的:类里面一个函数只包含一个操作或多次调用的一系列可合并的操作; @@ -2888,7 +2900,7 @@ 1、原则 大文件不能上传到工程里面,保持整个工程的轻量化,这样在克隆代码的时候才能非常快速方便使用,我们见过一个 AT 工程 clone 大小达到好几个 G,简直不可思议。 其实代码文件的大小是很小的,也就是说,纯写代码随便写工程也不会太大,而文档(包含插图)等资源却是很占空间。 -因此我们选择将 YouQu 的文档工程单独迁出到独立的仓库 youqu-docs 。 +因此我们选择将 YouQu 的文档工程涉及到的图片资源都采用外链加载; 2、安装¶ 项目根目录下运行 env.sh 即可。 bash env.sh @@ -2930,17 +2942,25 @@ 3.2、裁剪依赖bash env_dev.sh +4、虚拟化部署¶ +YouQu默认采用虚拟化部分,虚拟化环境实际安装的位置是在 $HOME/.local/share/virtualenvs/youqu-oHTM7l7G 目录下 +youqu-oHTM7l7G 此目录名称前面部分是你的代码根目录的名称,后面部分是生成的随机字符串; +同学们在远程机器上定位问题的时候,如果使用 Pycharm 调试,就将解释器指定到这个目录的就行了; +当然,我们也提供了本机开发环境部署: +bash env_dev.sh + +如果你是本地开发环境可以用它,区别就是驱动执行的时候使用:python3 manage.py xxx 九、失败录屏¶ 录屏其实是一种视频形式的日志,因为很多时候我们在查看日志之后仍然无法准确的定位到用例失败的具体原因,因此用例的录屏能让我们看到用例在执行过程; 【使用方法】 在 globalconfig.ini 里面配置关注 2 个参数; -;失败用例重跑次数 -RERUN = 1 - -;失败录屏从第几次开始录制视频。 -;比如 RECORD_FAILED_CASE = 1 ,表示用例第1次执行失败之后开始录屏。 -;注意,用例失败重跑的次数不能小于失败录屏次数,即 RERUN >= RECORD_FAILED_CASE -RECORD_FAILED_CASE = 1 +;失败用例重跑次数 +RERUN = 1 + +;失败录屏从第几次开始录制视频。 +;比如 RECORD_FAILED_CASE = 1 ,表示用例第1次执行失败之后开始录屏。 +;注意,用例失败重跑的次数不能小于失败录屏次数,即 RERUN >= RECORD_FAILED_CASE +RECORD_FAILED_CASE = 1 默认失败重跑的次数是 1 次; RECORD_FAILED_CASE = 1 表示用例第1次执行失败之后开始录屏; @@ -2953,48 +2973,48 @@ 十、Wayland 适配简单讲就是,应用库只需要维护一套用例脚本即可。 【用例兼容】 因为 Wayland 下有些应用的界面显示和功能本身存在一些差异,用例层可能需要对这部分用例做逻辑判断,使用全局配置里面的常量进行逻辑编写即可: -from setting.globalconfig import GlobalConfig - -# GlobalConfig.IS_WAYLAND 获取到当前的显示服务器(bool) -# 应用库 Config 继承 GlobalConfig -if Config.IS_WAYLAND: - pass -if Config.IS_X11: - pass +from setting.globalconfig import GlobalConfig + +# GlobalConfig.IS_WAYLAND 获取到当前的显示服务器(bool) +# 应用库 Config 继承 GlobalConfig +if Config.IS_WAYLAND: + pass +if Config.IS_X11: + pass 比如用例里面如果断言的图片不同: -if Config.IS_WAYLAND: - self.assert_image_exist("wayland_XXX") -else: - self.assert_image_exist("x11_XXX") +if Config.IS_WAYLAND: + self.assert_image_exist("wayland_XXX") +else: + self.assert_image_exist("x11_XXX") 这样这条用例脚本在 Wayland 和 X11 下都可以跑,so easy 是不是?完全没必要专门拉新分支进行 Wayland 适配。 十一、测试报告¶ 1. 目录结构¶ 执行时会在根目录下动态生成 report 目录,所有的报告相关的文件会统一存放在里面,示例: -/report - ├── allure # allure报告 - │ ├── ... - │ └── ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json - ├── allure_html # 生成的html报告 - │ ├── ... - │ └── index.html - ├── allure_back # allure报告备份 - │ └── 20221108114823 - │ ├── ... - │ └── f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json - ├── json # json报告 - │ ├── ... - │ └── result_deepin-music_20221109134736_1081333.json - ├── logs # 日志文件 - │ ├── 2022-11-10_debug.log - │ └── 2022-11-10_error.log - ├── record # 录屏 - │ └── 2022-11-09 - │ ├── ... - │ └── 15时14分09秒_test_music_303_2_autotest.mp4 - └── xml # xml报告 - └── autotest_deepin_music-20221109134736.xml +/report + ├── allure # allure报告 + │ ├── ... + │ └── ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json + ├── allure_html # 生成的html报告 + │ ├── ... + │ └── index.html + ├── allure_back # allure报告备份 + │ └── 20221108114823 + │ ├── ... + │ └── f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json + ├── json # json报告 + │ ├── ... + │ └── result_deepin-music_20221109134736_1081333.json + ├── logs # 日志文件 + │ ├── 2022-11-10_debug.log + │ └── 2022-11-10_error.log + ├── record # 录屏 + │ └── 2022-11-09 + │ ├── ... + │ └── 15时14分09秒_test_music_303_2_autotest.mp4 + └── xml # xml报告 + └── autotest_deepin_music-20221109134736.xml 默认情况下同时生成 html、xml、json三种形式的报告。 2. 定制报告¶ @@ -3011,14 +3031,14 @@ 3. 查看报告allure open report/allure_html +allure open report/allure_html 使用 manage.py 执行完之后,在终端的最后一行,我们会给你输出打开报告的命令,直接复制它在终端执行就可以查看了,像这样: - 终端执行命令: allure open /tmp/youqu/report/allure_html 查看报告 + 终端执行命令: allure open /tmp/youqu/report/allure_html 查看报告 你也可以直接在 Pycharm 里面找到 index.html 文件,然后右键选择浏览器打开,或者你可以用一个 http 服务打开。 你也可以直接在 report/allure 目录下查看报告: - allure serve report/allure + allure serve report/allure 远程执行 @@ -3031,48 +3051,48 @@ 1. 提前解决代码问题这里推荐一个 Python 社区流行的代码格式化工具: Black,号称不妥协的代码格式化工具,它检测到不符合规范的代码风格直接就帮你全部格式化好,就是这么刚! 安装: -sudo pip3 install black +sudo pip3 install black 使用方法: -black ${CheckPath} +black ${CheckPath} 使用这个工具格式化之后,代码会被自动调整,刚开始你可能会觉得调整得很夸张,没关系坚持看,习惯之后,你会觉得很优雅,没错,这就是 Pythonic Code 的核心,请保持优雅~。 2. 代码扫描工具¶ 使用根目录下 pylint.sh 扫描代码,在 report 目录下查看代码扫描报告,如果有代码问题请提前解决之后再提交。 此脚本已经使用 Python 社区最流行的代码扫描工具 Pylint 进行代码扫描。 使用方法: -bash pylint.sh +bash pylint.sh 运行之后会提示你要扫描的目录,比如输入 apps ,则会扫描 apps 下的所有 Python 代码。 在 setting/pylintrc.cfg 配置文件里面进行相关配置,扫描完成之后在 report/pylints 目录下会生成扫描报告。 代码提交需通过 git review 提交到 gerrit ,人工 Code Review 通过之后合入代码。 十三、提交代码¶ 1. 安装依赖¶ -sudo apt install git-review +sudo apt install git-review 2. 提交模板¶ 在 ~ 目录下新建文件,并命名为 gitcommit_template 将以下内容写入文件当中: -# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 -fix: - -# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 -Description: - -# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 -Log: - -# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 -#Bug: - -# 修复 github issue -#Issue: - -# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 -#Task: +# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 +fix: + +# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 +Description: + +# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 +Log: + +# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 +#Bug: + +# 修复 github issue +#Issue: + +# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 +#Task: 命令行执行: -git config --global commit.template ~/gitcommit_template +git config --global commit.template ~/gitcommit_template 此命令将模板加入到 git 的提交模板中。 后续提交的时候需要关注一下几点: @@ -3083,19 +3103,19 @@ 2. 提交模板3. 推送代码¶ 首先添加 commit 信息 -git add 后面加文件名称 +git add 后面加文件名称 -git add . # 表示添加所有文件 +git add . # 表示添加所有文件 使用这条命令注意有些临时文件不要提交到仓库了。 -git commit -a +git commit -a 之后在 fix: 后面(注意冒号后面必须加空格,不然直接-1)写本地提交的 commit 信息,然后就可以提交代码了 -git review branch(当前分支) -r origin +git review branch(当前分支) -r origin 最好一次 commit,一次 git review ,经常有同学在本地疯狂 commit 最后 git review 报错不知道咋回事儿。 若不想每次提交都加上 -r 选项,执行以下命令: -git config --global gitreview.remote origin +git config --global gitreview.remote origin 提交代码,直接使用 git review branch<目标分支>,例如 git review master 4. Git标签¶ @@ -3106,74 +3126,74 @@ 4. Git标签git tag -a <tagname> +git tag -a <tagname> 回车之后,Git 会打开你的编辑器,让你写一句标签注解,就像你给提交写注解一样。 查看所有标签 -git tag -l -# git tag 也行 +git tag -l +# git tag 也行 删除标签 -git tag -d <tagname> +git tag -d <tagname> 推送标签至远程 git push 命令并不会传送标签到远程仓库服务器上,必须显式地推送标签。 -git push origin <tagname> +git push origin <tagname> 推送所有不在远程仓库服务器上的标签 -git push origin --tag +git push origin --tag 删除远程标签 -git push origin :refs/tag/<tagname> +git push origin :refs/tag/<tagname> 后期打标签 先用 git log --pretty=oneline 查询提交记录,获取校验码。 -git tag -a <tagname> 9fceb02(校验码) +git tag -a <tagname> 9fceb02(校验码) 检出标签 -git checkout <tagname> +git checkout <tagname> 此时,仓库会处于“分离头指针(detached HEAD)”的状态。 在“分离头指针”状态下,如果你做了某些更改然后提交它们,标签不会发生变化, 但你的新提交将不属于任何分支,并且将无法访问,除非通过确切的提交哈希才能访问。 因此,如果你需要进行更改,比如你要修复旧版本中的错误,那么通常需要创建一个新分支: -git checkout -b <NewBranchName> <tagname> +git checkout -b <NewBranchName> <tagname> 新分支上可以进行提交代码。 十四、常见问题¶ 1. 提交代码时提示邮箱或者名称不对¶ 重新配置邮箱或者名称,然后重置生效: -git commit --amend --reset-author +git commit --amend --reset-author 2. 怎么回滚到之前的版本¶ (1)查询历史提交记录 -git log +git log 找到你要回滚的版本,复制 hash 值。 注意:是 commit 空格之后的 hash 值,之前有同学复制的 Change-Id: 这样肯定报错。 (2)回滚版本,不清除代码 -git reset --soft ${hash} +git reset --soft ${hash} (3)回滚版本,清除代码,慎用哈 -git reset --hard ${hash} +git reset --hard ${hash} 3. 测试报告里面 F S . E 是什么意思¶ F 表示失败,. (点)表示通过,S 表示跳过,E 表示 error 有报错 4. 解决 git status 中文显示的问题¶ -git config --global core.quotePath false +git config --global core.quotePath false 5. apps 目录下颜色有些是黄色的¶ 在 Pycharm 中 apps 目录下应用库文件是黄色的,编辑器识别不到代码新增和修改; @@ -3184,22 +3204,22 @@ 5. apps 目录下颜色有些是黄色的6. 执行 env.sh 报错 $'\r':未找到命令¶ 出现这个问题你应该是在 windows 上打开或编辑过 env.sh 脚本,windows下的换行是回车符+换行符,也就是\r\n,而 Linxu 下是换行符 \n,Linux 下不识别 \r,因此报错。 解决方案: -# 将 \r 替换为空 -sudo sed -i 's/\r//' env.sh +# 将 \r 替换为空 +sudo sed -i 's/\r//' env.sh 7.怎样为单独某一条用例配置执行超时时间¶ 在用例脚本中添加装饰器,如下: -@pytest.mark.timeout(300) # 单位秒 -def test_xxx_001(): - pass +@pytest.mark.timeout(300) # 单位秒 +def test_xxx_001(): + pass 8. 如何拉取 YouQu 自动化项目所有代码,包含子仓库¶ 前置条件:已申请访问 YouQu 权限群组 -# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) -git config --global credential.helper store - -# 拉取YouQu框架代码,并递归拉取子仓库代码 -git clone "http://gerrit.uniontech.com/youqu" --recursive +# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) +git config --global credential.helper store + +# 拉取YouQu框架代码,并递归拉取子仓库代码 +git clone "http://gerrit.uniontech.com/youqu" --recursive 9. 如何拉取 YouQu 自动化项目中指定子仓库的代码¶ 前置条件: @@ -3207,22 +3227,22 @@ 9. 如何拉取 YouQu 自动化项目中指定子仓库的代 已申请访问 YouQu 权限群组 已存储访问密码 -# 拉取YouQu框架代码 -git clone "http://gerrit.uniontech.com/youqu" - -# 指定拉取子仓库代码 -cd youqu -git submodule update --init apps/autotest_xxx_xxx +# 拉取YouQu框架代码 +git clone "http://gerrit.uniontech.com/youqu" + +# 指定拉取子仓库代码 +cd youqu +git submodule update --init apps/autotest_xxx_xxx 10. 如何更新 YouQu 自动化项目中,所有子仓库的代码¶ 更新所有子仓库代码 -cd youqu -git pull & git submodule foreach git pull +cd youqu +git pull & git submodule foreach git pull 11. 如何修复 YouQu 所有子仓库 master 分支游离头(detached head)¶ 修复所有子仓库默认master 分支游离头 -cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
youqu manage.py pms --send2task yes
由同学可能会发现,怎么回填一次之后,后面想再次回填就不生效了;
框架提供导出指定标签用例的功能:
youqu manage.py exportcsv -a deepin-album -t CICD +youqu manage.py exportcsv -a deepin-album -t CICD 表示导出 deepin-album 的用例中标记了 CICD 标签的用例,导出 CSV 文件的字段格式已经适配了 CICD 的要求。 2.5. 脚手架新建 APP 工程¶ 新建一个 APP 工程: -youqu manage.py startapp autotest_deepin_some +youqu manage.py startapp autotest_deepin_some 这样在 apps 目录下会创建一个子项目工程 autotest_deepin_some,同时新建好工程模板目录和模板文件: -apps -└── autotest_deepin_some - ├── case - │ ├── assert_res - │ │ └── readme - │ ├── base_case.py - │ └── __init__.py - ├── config.ini - ├── config.py - ├── conftest.py - ├── control - ├── deepin_some_assert.py - ├── deepin_some.csv - ├── __init__.py - └── widget - ├── base_widget.py - ├── case_res - │ └── readme - ├── deepin_some_widget.py - ├── __init__.py - ├── other.ini - ├── other_widget.py - ├── pic_res - │ └── readme - └── ui.ini +apps +└── autotest_deepin_some + ├── case + │ ├── assert_res + │ │ └── readme + │ ├── base_case.py + │ └── __init__.py + ├── config.ini + ├── config.py + ├── conftest.py + ├── control + ├── deepin_some_assert.py + ├── deepin_some.csv + ├── __init__.py + └── widget + ├── base_widget.py + ├── case_res + │ └── readme + ├── deepin_some_widget.py + ├── __init__.py + ├── other.ini + ├── other_widget.py + ├── pic_res + │ └── readme + └── ui.ini autotest_deepin_some 是你的工程名称,比如:autotest_deepin_music ; 在此基础上,你可以快速的开始你的 AT 项目。 2.6. 用例标签自动同步¶ 用于自动同步 PMS 用例标签数据至本地 CSV 文件,主要通过以下几个配置来控制: -APP_NAME = # 指定要同步的应用名称 -PMS_USER = # PMS的用户名 -PMS_PASSWORD = # PMS的密码 +APP_NAME = # 指定要同步的应用名称 +PMS_USER = # PMS的用户名 +PMS_PASSWORD = # PMS的密码 在 [csv_link_pms_id] 节点下指定 csv 文件名与 PMS 用例模块的对应关系,比如: -[csv_link_pms_id] -;同步PMS数据到本地CSV文件,必须要配置的配置项 -;key是本地CSV文件的文件名称; -;value是对应PMS上的模块ID; -;比如要同步音乐的数据, 首先需要将配置 APP_NAME = deepin-music, -;CSV文件名称为music.csv,其在PMS上的用例为: https://pms.uniontech.com/testcase-browse-53.html -;因此应该配置为: music = 53 -;这样才能将PMS与本地CSV文件建立联系。 -;如果你的应用分了很多模块,只需要将对应的信息依次配置好就行了。 -music = 53 +[csv_link_pms_id] +;同步PMS数据到本地CSV文件,必须要配置的配置项 +;key是本地CSV文件的文件名称; +;value是对应PMS上的模块ID; +;比如要同步音乐的数据, 首先需要将配置 APP_NAME = deepin-music, +;CSV文件名称为music.csv,其在PMS上的用例为: https://pms.uniontech.com/testcase-browse-53.html +;因此应该配置为: music = 53 +;这样才能将PMS与本地CSV文件建立联系。 +;如果你的应用分了很多模块,只需要将对应的信息依次配置好就行了。 +music = 53 将以上信息配置好之后,在命令行执行: -youqu manage.py pms --pms2csv yes +youqu manage.py pms --pms2csv yes 每次执行时原 csv 文件会自动备份在 report/csv_back 目录下,因此你不用担心脚本执行导致你的数据丢失。 diff --git a/search/search_index.json b/search/search_index.json index 91ebe84c..c7cfc7a2 100644 --- a/search/search_index.json +++ b/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\u200b\\u3000\\-\u3001\u3002\uff0c\uff0e\uff1f\uff01\uff1b]+","pipeline":["stemmer"]},"docs":[{"location":"","title":"\u9996\u9875","text":""},{"location":"#youqu","title":"\u6709\u8da3\uff08YouQu\uff09","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/4/1\n# Author : Mikigo\n# =============================================\n \u672c\u7ad9\u603b\u8bbf\u95ee\u91cf \u6b21 \u6b22\u8fce\u5728\u6d4f\u89c8\u5668\u8bbf\u95ee\u3010\u516c\u7f51\u6587\u6863\u3011 \u7edf\u4fe1\u516c\u53f8\u5185\u7f51\u8fd8\u53ef\u4ee5\u8bbf\u95ee\u3010\u5185\u7f51\u6587\u6863\u3011\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u54e6~~"},{"location":"#_1","title":"\u4e00\u3001\u7b80\u4ecb","text":"\u6709\u8da3\uff08YouQu\uff09\u662f\u6df1\u5ea6\u79d1\u6280\u8bbe\u8ba1\u548c\u5f00\u53d1\u7684\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff0c\u91c7\u7528\u7ed3\u6784\u5206\u5c42\u7684\u8bbe\u8ba1\u7406\u5ff5\uff0c\u652f\u6301\u591a\u5143\u5316\u5143\u7d20\u5b9a\u4f4d\u548c\u65ad\u8a00\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\u3001\u5f3a\u5927\u7684\u65e5\u5fd7\u548c\u62a5\u544a\u8f93\u51fa\u7b49\u7279\u8272\u529f\u80fd\uff0c\u540c\u65f6\u5b8c\u7f8e\u517c\u5bb9X11\u3001Wayland\u663e\u793a\u534f\u8bae\uff0c\u73af\u5883\u90e8\u7f72\u7b80\u5355\uff0c\u64cd\u4f5c\u6613\u4e0a\u624b\u3002"},{"location":"#17","title":"\u7231\u4e0a \u201c\u6709\u8da3\u201d \u7684 17 \u4e2a\u7406\u7531","text":" \u6838\u5fc3\u5e93\u63d0\u4f9b\u4e86\u7edf\u4e00\u7684\u63a5\u53e3\uff0c\u7f16\u5199\u65b9\u6cd5\u65f6\u53ea\u9700\u8981\u5bfc\u5165\u4e00\u4e2a\u5305\u5c31\u53ef\u4ee5\u4f7f\u7528\u5230\u6838\u5fc3\u5e93\u63d0\u4f9b\u7684\u6240\u6709\u529f\u80fd\uff1b \u516c\u5171\u5e93\u5c01\u88c5\u4e86\u5f88\u591a\u5e38\u7528\u6a21\u5757\u7684\u76f8\u5173\u65b9\u6cd5\uff0c\u6bd4\u5982\uff1a\u4efb\u52a1\u680f\u7684\u64cd\u4f5c\u3001\u684c\u9762\u7684\u64cd\u4f5c\u3001\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\u7b49\u7b49\uff1b \u9664\u4e86\u5e38\u7528\u7684\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u8bc6\u522b\u4ee5\u5916\uff0c\u6211\u4eec\u8fd8\u63d0\u4f9b\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u5176\u4f7f\u7528\u7b80\u5355\u4e14\u9ad8\u6548\uff0c\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff1b \u5bf9\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u5c06\u7f16\u5199\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u53d8\u5f97\u7b80\u5355\u800c\u4f18\u96c5\uff1b \u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u6280\u672f\u8fdb\u884c\u529f\u80fd\u5347\u7ea7\uff0c\u9664\u4e86\u652f\u6301\u5355\u4e2a\u5750\u6807\u8fd4\u56de\uff0c\u8fd8\u652f\u6301\u540c\u4e00\u754c\u9762\u4e0b\u591a\u4e2a\u76f8\u540c\u5143\u7d20\u8fd4\u56de\u591a\u4e2a\u5750\u6807\u7684\u529f\u80fd\uff1b \u63d0\u4f9b\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u548c\u6279\u91cf\u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u4e0d\u5230\u4e00\u4e2a csv \u6587\u4ef6\u539f\u6765\u80fd\u5e72\u8fd9\u4e48\u591a\u4e8b\u60c5\uff1b \u63d0\u4f9b\u4e86\u529f\u80fd\u5f3a\u5927\u7684\u6267\u884c\u5668\u5165\u53e3\uff0c\u8ba9\u4f60\u53ef\u4ee5\u65b9\u4fbf\u7684\u5728\u672c\u5730\u6267\u884c\u4efb\u4f55\u7528\u4f8b\u96c6\u7684\u7528\u4f8b\uff0c\u5176\u4e30\u5bcc\u7684\u81ea\u5b9a\u4e49\u914d\u7f6e\u9879\uff0c\u6ee1\u8db3\u4f60\u5bf9\u6267\u884c\u5668\u6240\u6709\u7684\u5e7b\u60f3\uff1b \u63d0\u4f9b\u8fdc\u7a0b\u6267\u884c\u7684\u529f\u80fd\uff0c\u53ef\u4ee5\u63a7\u5236\u591a\u53f0\u673a\u5668\u5e76\u884c\u8dd1\uff0c\u6216\u8005\u5206\u5e03\u5f0f\u8dd1\uff0c\u8fd9\u79cd\u4ed8\u8d39\u529f\u80fd\u73b0\u5728\u514d\u8d39\u7ed9\u4f60\u7528\uff1b \u63d0\u4f9b\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u529f\u80fd\uff0c\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u6bcf\u4e2a\u65b9\u6cd5\u5355\u72ec\u5199\u8f93\u51fa\u65e5\u5fd7\u7684\u4ee3\u7801\uff0c\u4e00\u5207\u6211\u4eec\u7ed9\u4f60\u641e\u5b9a\u4e86\uff0c\u65e5\u5fd7\u8f93\u51fa\u4e0d\u4ec5\u5185\u5bb9\u4e30\u5bcc\uff0c\u989c\u503c\u4e5f\u7edd\u5bf9\u5728\u7ebf\uff0c\u6211\u4eec\u8fd8\u81ea\u5df1\u8bbe\u8ba1\u4e86\u4e00\u6b3e\u7ec8\u7aef\u8f93\u51fa\u4e3b\u9898\u53eb\u300a\u4e94\u5f69\u6591\u6593\u7684\u9ed1\u300b\uff1b \u63d0\u4f9b\u4e86\u4e00\u952e\u90e8\u7f72\u81ea\u52a8\u5316\u6d4b\u8bd5\u73af\u5883\u7684\u529f\u80fd\uff0c\u8fde\u4ee3\u7801\u7f16\u8f91\u5668\u90fd\u7ed9\u4f60\u88c5\u597d\u4e86\uff0c\u8ba9\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u73af\u5883\u90e8\u7f72\u800c\u70e6\u607c\uff1b \u63d0\u4f9b\u4e86\u81ea\u52a8\u751f\u6210\u591a\u79cd\u62a5\u544a\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u8f93\u51fa\u4ec0\u4e48\u62a5\u544a\u5f62\u5f0f\u90fd\u884c\uff0c\u800c\u4e14\u6211\u4eec\u5728\u62a5\u544a\u4e2d\u8fd8\u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\u548c\u5931\u8d25\u622a\u56fe\u7684\u529f\u80fd\uff1b \u5bf9\u65ad\u8a00\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u63d0\u4f9b\u66f4\u53cb\u597d\u5316\u7684\u9519\u8bef\u63d0\u793a\uff0c\u8ba9\u5b9a\u4f4d\u95ee\u9898\u7cbe\u51c6\u9ad8\u6548\uff1b \u4e0d\u4ec5\u652f\u6301\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u63a7\u5236\uff0c\u800c\u4e14\u8fd8\u652f\u6301\u52a8\u6001\u63a7\u5236\u7528\u4f8b\u6279\u91cf\u6267\u884c\u7684\u603b\u65f6\u95f4\uff0c\u786e\u4fdd CI \u73af\u5883\u4e0b\u80fd\u987a\u7545\u8fd0\u884c\uff1b \u652f\u6301\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\u6267\u884c\u3001PMS \u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6807\u7b7e\u5316\u6267\u884c\u65b9\u6848\uff0c\u6ee1\u8db3\u4f60\u5404\u79cd\u573a\u666f\u4e0b\u7684\u6267\u884c\u9700\u6c42\uff1b \u652f\u6301\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u529f\u80fd\uff0c\u53ef\u5b9a\u4f4d\u53ef\u65ad\u8a00\uff0c\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\uff1b \u5b8c\u7f8e\u517c\u5bb9 Wayland \u548c X11\uff0c\u771f\u6b63\u505a\u5230\u4e00\u5957\u4ee3\u7801\uff0c\u968f\u5904\u6267\u884c\uff1b \u652f\u6301\u591a\u79cd\u65b9\u5f0f\u7684\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u5176\u4e2d\u5f02\u6b65\u56de\u586b\u7684\u65b9\u6848\uff0c\u5b8c\u7f8e\u89e3\u51b3\u4e86\u6570\u636e\u56de\u586b\u7684\u8017\u65f6\u95ee\u9898\uff1b \u3010\u89c6\u9891\u4ecb\u7ecd\u3011"},{"location":"#_2","title":"\u4e8c\u3001\u5b89\u88c5\u4f7f\u7528","text":"\u57fa\u7840\u6846\u67b6\uff1ahttps://github.com/linuxdeepin/deepin-autotest-framework \u4ece PyPI \u5b89\u88c5: sudo pip3 install youqu\n \u521b\u5efa\u9879\u76ee: youqu-startproject youqu\n \u5b89\u88c5\u4f9d\u8d56: cd youqu\nbash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002 \u5e94\u7528\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684\u5e94\u7528\u540d\u79f0\u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music cd apps/\n \u5c06\u5e94\u7528\u5e93\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u50cf\u8fd9\u6837\uff1a youqu\n\u251c\u2500\u2500 apps\n\u2502 \u251c\u2500\u2500 autotest_deepin_music # \u5e94\u7528\u5e93\n...\n \u5e94\u7528\u5e93\u7684\u540d\u79f0\u4e0d\u53ef\u4ee5\u4fee\u6539\u3002"},{"location":"#_3","title":"\u4e09\u3001\u8fd0\u884c","text":""},{"location":"#1","title":"1. \u5de5\u4f5c\u7a7a\u95f4","text":"\u57fa\u7840\u6846\u67b6\u5de5\u7a0b\u76ee\u5f55\u5efa\u8bae\u653e\u5728 ~ \u76ee\u5f55\u4e0b\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u4e5f\u53ef\u4ee5\u8fd0\u884c\uff0c\u4f46\u662f\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u9700\u8981\u505a\u73af\u5883\u6e05\u7406\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u5b58\u5728\u4ee3\u7801\u88ab\u5220\u9664\u7684\u98ce\u9669\u3002 \u5982\u679c\u4f60\u7684\u673a\u5668\u4e0a\u4e0d\u540c\u76ee\u5f55\u4e0b\u5b58\u5728\u591a\u4e2a YouQu \u5de5\u7a0b\uff0c\u90a3\u4e48\u5728\u8fd0\u884c\u4e4b\u524d\uff0c\u8bf7\u5148\u6267\u884c env.sh \u6821\u6b63\u76f8\u5173\u73af\u5883\u3002"},{"location":"#2","title":"2. \u6267\u884c\u5668","text":"\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u6709\u4e00\u4e2a manage.py \uff0c\u5b83\u662f\u4e00\u4e2a\u6267\u884c\u5668\u5165\u53e3\uff0c\u63d0\u4f9b\u4e86\u672c\u5730\u6267\u884c\u3001\u8fdc\u7a0b\u6267\u884c\u7b49\u7684\u529f\u80fd\u3002 \u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6765\u6267\u884c\uff1a youqu manage.py run -a deepin-music\n"},{"location":"#21","title":"2.1. \u672c\u5730\u6267\u884c","text":"youqu manage.py run\n"},{"location":"#211","title":"2.1.1. \u914d\u7f6e\u6587\u4ef6","text":"\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u914d\u7f6e\u53c2\u6570 \u5728\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u91cc\u9762\u652f\u6301\u914d\u7f6e\u5bf9\u6267\u884c\u7684\u4e00\u4e9b\u53c2\u6570\u8fdb\u884c\u914d\u7f6e\uff0c\u5e38\u7528\u7684\u5982\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;1\u3001KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2\u3001KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f, e.g. TAGS = L1 or smoke\n;\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\uff0c\u5c06\u8981\u6267\u884c\u7684\u7528\u4f8b\u5199\u5165\u6307\u5b9a\u7684 csv \u6587\u4ef6\n;\u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u4ece\u57fa\u7840\u6846\u67b6\u6839\u76ee\u5f55\u5f00\u59cb\uff1ae.g. CASE_FILE = case_list.txt\n;\u5982\u679c\u8fd9\u91cc\u6709\u503c\uff0cAPP_NAME KEYWORDS TAGS \u7684\u914d\u7f6e\u5747\u4e0d\u751f\u6548\nCASE_FILE =\n;=============================== RUNNER CONFIG ===================================\n[runner]\n;\u6700\u5927\u5931\u8d25\u7528\u4f8b\u6570\u91cf\u7684\u5360\u6bd4\n;\u6bd4\u5982\uff1a\u603b\u6267\u884c\u7528\u4f8b\u6570\u4e3a100, \u82e5 MAX_FAIL = 0.5,\u5219\u5931\u8d25\u7528\u4f8b\u6570\u8fbe\u523050\u5c31\u4f1a\u7ec8\u6b62\u6d4b\u8bd5\u3002\nMAX_FAIL = 0.5\n;\u5355\u6761\u7528\u4f8b\u7684\u8d85\u65f6\u65f6\u95f4\uff0c\u5982\u679c\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u8d85\u65f6\uff0c\u8fd9\u6761\u7528\u4f8b\u4f1a\u88ab\u505c\u6b62\uff0c\u540e\u7eed\u7528\u4f8b\u7ee7\u7eed\u6267\u884c\u3002\n;\u5355\u4f4d\u4e3a\u79d2\n; \u8fd9\u662f\u4e00\u4e2a\u5168\u5c40\u7edf\u4e00\u914d\u7f6e\uff0c\u5982\u679c\u67d0\u6761\u7528\u4f8b\u9700\u8981\u5355\u72ec\u914d\u7f6e\u8d85\u65f6\u65f6\u95f4\uff0c\u53ef\u4ee5\u5728\u7528\u4f8b\u4e2d\u8fd9\u6837\u5199\uff1a\n;@pytest.mark.timeout(500)\n;def test_xxx_001():\n; ...\n;\u4f1a\u8bdd\uff08\u6240\u6709\u7528\u4f8b\u6267\u884c\u7684\uff09\u8d85\u65f6\u662f\u6839\u636e\u5168\u5c40\u8d85\u65f6\u914d\u7f6e\u548c\u7528\u4f8b\u5355\u72ec\u8d85\u65f6\u914d\u7f6e\u81ea\u52a8\u8ba1\u7b97\u7684\uff1b\nCASE_TIME_OUT = 200\n;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\u3002\n;\u6ce8\u610f\uff0c\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u4e0d\u80fd\u5c0f\u4e8e\u5931\u8d25\u5f55\u5c4f\u6b21\u6570\uff0c\u5373 RERUN >= RECORD_FAILED_CASE\nRECORD_FAILED_CASE = 1\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = INFO\n;yes \u6bcf\u6761\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u8fdb\u884c\u73af\u5883\u6e05\u7406\nCLEAN_ALL = yes\n;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\nRESOLUTION = 1920x1080\n;\u4e0d\u8df3\u8fc7\u7528\u4f8b\uff0ccsv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86 skip-xxx\u7684\u7528\u4f8b\u4e0d\u8df3\u8fc7\nNOSKIP = no\n;ignore fixed\n;no\uff0c\u53ea\u8981\u6807\u8bb0\u4e86fixed\u7684\u7528\u4f8b\uff0c\u5373\u4f7f\u6807\u8bb0\u4e86skip-\uff0c\u4e5f\u4f1a\u6267\u884c\uff1b\n;yes\uff0cfixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\uff1b\nIFIXED = no\n;\u8981\u5b89\u88c5deb\u5305\u7684\u8def\u5f84\n;e.g : ~/Downloads/ \u5b89\u88c5\u4e0b\u8f7d\u76ee\u5f55\u4e0b\u7684deb\u5305\uff0c\u5982\u679c\u662f\u8fdc\u7a0b\u6267\u884c\uff0c\u4f1a\u81ea\u52a8\u62f7\u8d1d\u5230\u8fdc\u7a0b\u5e76\u5b89\u88c5\u3002\nDEB_PATH =\n;DEBUG \u6a21\u5f0f\u6267\u884c\u7528\u4f8b\uff0c\u53ea\u6536\u96c6\u4e0d\u6267\u884c\u7528\u4f8b\uff0c\u4e5f\u4e0d\u505a\u8bbe\u5907\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002\nDEBUG = no\n;\u8bb0\u5f55top\u547d\u4ee4\u67e5\u8be2\u7684\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0cTOP = 3 \u8868\u793a\u8bb0\u5f55\u524d3\u4e2a\u8fdb\u7a0b\u3002\nTOP =\n;\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\nREPEAT =\n;\u9ed8\u8ba4\u5728\u6240\u6709\u6d4b\u8bd5\u5b8c\u6210\u4e4b\u540e\u8f93\u51fa\u62a5\u9519\u4fe1\u606f.\n;yes, \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\nDURING_FAIL = no\n;=============================== REPORT CONFIG ===================================\n[report]\n;\u7528\u4f8b\u6267\u884c\u5b8c\u540e\u751f\u6210\u7684\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n;\u76ee\u524d\u652f\u6301 allure, xml, json \uff08\u652f\u6301\u540c\u65f6\u751f\u6210\uff09\nREPORT_FORMAT = allure, xml, json\n;\u6307\u5b9a\u62a5\u544a\u751f\u6210\u7684\u8def\u5f84\uff08\u76f8\u5bf9\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\uff09\nALLURE_REPORT_PATH = report/\nXML_REPORT_PATH = report/\nJSON_REPORT_PATH = report/\n;=============================== GLOBAL CONFIG ===================================\n[globalconfig]\n;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\nPASSWORD = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\nIMAGE_MATCH_NUMBER = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6bcf\u6b21\u95f4\u9694\u7b49\u5f85\u65f6\u95f4\nIMAGE_MATCH_WAIT_TIME = 1\n;\u56fe\u50cf\u8bc6\u522b\u5339\u914d\u5ea6\nIMAGE_RATE = 0.9\n;\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u5b9e\u65f6\u56fe\u50cf\u4fdd\u5b58\u8def\u5f84\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u5750\u6807\nSCREEN_CACHE = /tmp/screen.png\n;\u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\u7684\u8def\u5f84\nTMPDIR = /tmp/tmpdir\n;\u7cfb\u7edf\u4e3b\u9898\nSYS_THEME = deepin\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = http://youqu-dev.uniontech.com:8890\n;OpenCV\u670d\u52a1\u7aef\u5730\u5740\nOPENCV_SERVER_HOST = http://youqu-dev.uniontech.com:8889\n;=============================== PMS CONFIG ===================================\n;PMS\u76f8\u5173\u914d\u7f6e\uff0c\u5305\u542b\u4ee5\u4e0b\u51e0\u4e2a\u65b9\u9762\uff1a\n;1.PMS\u6d4b\u8bd5\u5957\u6267\u884c\n;2.\u81ea\u52a8\u4ecePMS\u722c\u53d6\u6570\u636e\u5e76\u540c\u6b65\u672c\u5730CSV\u6587\u4ef6\n;3.PMS\u6570\u636e\u56de\u586b\n[pms]\n;PMS\u7684\u7528\u6237\u540d: ut001234\nPMS_USER =\n;PMS\u7684\u5bc6\u7801\nPMS_PASSWORD =\n;PMS\u6d4b\u8bd5\u5957\u7684ID\n;\u5728PMS\u4e0a\u67e5\u770b\u7528\u4f8b\u201c\u5957\u4ef6\u201d\u94fe\u63a5: https://pms.uniontech.com/testsuite-view-495.html\n;\u6d4b\u8bd5\u5957ID\u4e3a: 495\nSUITE_ID =\n;\u6570\u636e\u56de\u586b\u5fc5\u987b\u5173\u8054PMS\u6d4b\u8bd5\u5355\n;\u5728PMS\u4e0a\u67e5\u770b\u6d4b\u8bd5\u5355\u94fe\u63a5: https://pms.uniontech.com/testtask-cases-20747.html\n;\u6d4b\u8bd5\u5355ID\u4e3a: 20747\nTASK_ID =\n;\u5c06\u6d4b\u8bd5\u7ed3\u679c\u6570\u636e\u56de\u586b\u5230PMS\n;\u4e3a\u7a7a: \u8868\u793a\u4e0d\u56de\u586b,\u4e0d\u4f1a\u5728\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u751f\u6210json\u7ed3\u679c\u6587\u4ef6;\n;async: \u8868\u793a\u9010\u6761\u5f02\u6b65\u56de\u586b,\u540e\u9762\u4e00\u6761\u6267\u884c\u5f00\u59cb\u65f6\u901a\u8fc7\u5b50\u7ebf\u7a0b\u5bf9\u524d\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u8fdb\u884c\u56de\u586b\uff0c\u5982\u6b64\u5b9e\u73b0\u65f6\u95f4\u6548\u7387\u6700\u5927\u5316;\n;finish: \u8868\u793a\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u6210\u4e4b\u540e\u9010\u4e2a\u56de\u586b(PMS\u4e0d\u652f\u6301\u5e76\u53d1);\nSEND_PMS =\n;\u6570\u636e\u56de\u586b\u7684\u89e6\u53d1\u8005\n;auto: \u6846\u67b6\u81ea\u52a8\u56de\u586b,\u914d\u5408SEND_PMS\u914d\u7f6e\u4f7f\u7528,\u4f60\u53ef\u4ee5\u9009\u62e9\u5728\u4e0d\u540c\u7684\u9636\u6bb5\u8fdb\u884c\u6570\u636e\u56de\u586b;\n;hand: \u624b\u52a8\u56de\u586b,\u6bcf\u6761\u7528\u4f8b\u4ecd\u7136\u4f1a\u751f\u6210json\u6587\u4ef6,\u4f46\u6846\u67b6\u4e0d\u4f1a\u8fdb\u884c\u6570\u636e\u56de\u586b,\u9700\u8981\u4f60\u53ef\u4ee5\u5728\u4f60\u60f3\u8981\u53d1\u9001\u7684\u65f6\u95f4\u70b9\u624b\u52a8\u89e6\u53d1\u56de\u586b;\nTRIGGER = auto\n;PMS\u56de\u586b\u7684\u91cd\u8bd5\u6b21\u6570\n;\u5982\u679c\u63a5\u53e3\u8bf7\u6c42\u5931\u8d25,\u4f1a\u8fdb\u884c\u91cd\u8bd5\nSEND_PMS_RETRY_NUMBER = 2\n[csv_link_pms_lib]\n;caselib: \u7528\u4f8b\u5e93\n;testcase: \u4ea7\u54c1\u5e93\u7528\u4f8b\nCASE_FROM = caselib\n[csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/caselib-browse-81.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 81\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic =\n[export_csv]\n;\u5bfc\u51fa\u7684csv\u6587\u4ef6\u540d\u79f0\uff0c\u9ed8\u8ba4 case_list.csv\nCSV_FILE = case_list.csv\n;exportcsv \u547d\u4ee4\u5bfc\u51fa case_list.csv \u6587\u4ef6\u65f6\u914d\u7f6e\u7684\u5b57\u6bb5\u540d\uff0c\u7528\u4f8b\u540d\u79f0\u9ed8\u8ba4\u5b58\u5728\u7b2c\u4e00\u5217\uff0c\u65e0\u9700\u6dfb\u52a0\nCSV_HEARD = \u7528\u4f8b\u7ea7\u522b,\u7528\u4f8b\u7c7b\u578b,\u6d4b\u8bd5\u7ea7\u522b,\u662f\u5426\u8df3\u8fc7\n \u914d\u7f6e\u5b8c\u6210\u4e4b\u540e\uff0c\u76f4\u63a5\u5728\u547d\u4ee4\u884c\u6267\u884c manage.py \u5c31\u597d\u4e86\u3002 youqu manage.py run\n"},{"location":"#212","title":"2.1.2. \u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a youqu manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--max_fail MAX_FAIL \u6700\u5927\u5931\u8d25\u7387\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--resolution RESOLUTION\n\u68c0\u67e5\u5206\u8fa8\u7387\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms {,async,finish}\n\u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--trigger {,auto,hand}\n\u89e6\u53d1\u8005\n-f CASE_FILE, --case_file CASE_FILE\n\u6839\u636e\u6587\u4ef6\u6267\u884c\u7528\u4f8b\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n--pms_user PMS_USER pms \u7528\u6237\u540d\n--pms_password PMS_PASSWORD\npms \u5bc6\u7801\n--suite_id SUITE_ID pms \u6d4b\u8bd5\u5957ID\n--pms_info_file PMS_INFO_FILE\npms \u4fe1\u606f\u6587\u4ef6\n--top TOP \u8fc7\u7a0b\u4e2d\u8bb0\u5f55top\u547d\u4ee4\u4e2d\u7684\u503c\n--lastfailed \u4ec5\u6267\u884c\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\n--duringfail \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\n--repeat REPEAT \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n--project_name PROJECT_NAME\n\u5de5\u7a0b\u540d\u79f0\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--build_location BUILD_LOCATION\n\u6784\u5efa\u5730\u533a\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--line LINE \u6267\u884c\u7684\u4e1a\u52a1\u7ebf\uff08\u5199\u5165json\u6587\u4ef6\uff09\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a youqu manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\"\n \u547d\u4ee4\u884c\u53c2\u6570\u4f18\u5148\u7ea7\u662f\u9ad8\u4e8e\u914d\u7f6e\u6587\u4ef6\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u4e86\u5bf9\u5e94\u7684\u53c2\u6570\uff0c\u914d\u7f6e\u6587\u4ef6\u4e2d\u4e0d\u7ba1\u662f\u5426\u914d\u7f6e\u5747\u4e0d\u751f\u6548\u3002 --app \u5165\u53c2\u8fd8\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\uff0c\u4e0b\u9762\u7684\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u540c\u6837\u652f\u6301\u3002"},{"location":"#22","title":"2.2. \u8fdc\u7a0b\u6267\u884c","text":"youqu manage.py remote\n \u8fdc\u7a0b\u6267\u884c\u540c\u6837\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u8fdb\u884c\u7528\u4f8b\u76f8\u5173\u914d\u7f6e\uff1b \u9700\u8981\u91cd\u70b9\u8bf4\u4e00\u4e0b\u8fdc\u7a0b\u6267\u884c\u65f6\u7684\u6d4b\u8bd5\u673a\u4fe1\u606f\u914d\u7f6e\uff0c\u5728\u914d\u7f6e\u6587\u4ef6 setting/remote.ini \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\u3001IP\u3001\u5bc6\u7801\u3002 ;=============================== CLIENT LIST =====================================\n; \u6d4b\u8bd5\u673a\u914d\u7f6e\u5217\u8868\n;[client{number}] ;\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u6709\u591a\u5c11\u53f0\u6d4b\u8bd5\u673a\u5c31\u5199\u591a\u5c11\u4e2a client\uff0c\u522b\u540d\u5fc5\u987b\u5305\u542b client \u5b57\u7b26\uff0c\u4e14\u4e0d\u80fd\u91cd\u590d\u3002\n;user = ;\u6d4b\u8bd5\u673a user\n;ip = ;\u6d4b\u8bd5\u673a ip\n;password = 1 ;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801, \u53ef\u4ee5\u4e0d\u914d\u7f6e\u6b64\u9879\uff0c\u9ed8\u8ba4\u53d6 CLIENT_PASSWORD \u7684\u503c\uff1b\n;\u5982\u679c\u4f60\u6240\u6709\u6d4b\u8bd5\u673a\u5bc6\u7801\u90fd\u76f8\u540c\uff0c\u90a3\u4e48\u53ea\u9700\u8981\u914d\u7f6e CLIENT_PASSWORD \u5c31\u53ef\u4ee5\u4e86\n;=================================================================================\n[client1]\nuser = uos\nip = 10.8.15.xx\n[client2]\nuser = uos\nip = 10.8.15.xx\n[client3]\nuser = uos\nip = 10.8.11.xx\n \u6709\u591a\u5c11\u53f0\u673a\u5668\u5c31\u50cf\u8fd9\u6837\u6328\u7740\u5199\u5c31\u884c\u4e86\u3002 \u7136\u540e\u5728\u547d\u4ee4\u884c\uff1a youqu manage.py remote\n \u8fd9\u6837\u8fd0\u884c\u662f\u4ece\u914d\u7f6e\u6587\u4ef6\u53bb\u8bfb\u53d6\u76f8\u5173\u914d\u7f6e\u3002 \u5982\u679c\u4f60\u4e0d\u60f3\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\uff0c\u4f60\u4ecd\u7136\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u8fdb\u884c\u4f20\u53c2\uff0c \u4ee5\u4e0b\u4e3a python3 manage.py remote \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-c CLIENTS, --clients CLIENTS\n\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679cpassword\u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6\nsetting/remote.ini \u4e2d CLIENT_PASSWORD\n\u7684\u503c,\u6bd4\u5982\uff1auos@10.8.13.33:1 \u6216 uos@10.8.13.33\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-s {yes,no,}, --send_code {yes,no,}\n\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a\uff08\u4e0d\u542breport\u76ee\u5f55\uff09\n-e, --build_env \u642d\u5efa\u6d4b\u8bd5\u73af\u5883,\u5982\u679c\u4e3ayes\uff0c\u4e0d\u7ba1send_code\u662f\u5426\u4e3ayes\u90fd\u4f1a\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a.\n-p CLIENT_PASSWORD, --client_password CLIENT_PASSWORD\n\u6d4b\u8bd5\u673a\u5bc6\u7801\uff08\u5168\u5c40\uff09\n-y PARALLEL, --parallel PARALLEL\nyes:\u8868\u793a\u6240\u6709\u6d4b\u8bd5\u673a\u5e76\u884c\u8dd1\uff0c\u6267\u884c\u76f8\u540c\u7684\u6d4b\u8bd5\u7528\u4f8b\uff0cno\n:\u8868\u793a\u6d4b\u8bd5\u673a\u5206\u5e03\u5f0f\u6267\u884c\uff0c\u670d\u52a1\u7aef\u4f1a\u6839\u636e\u6536\u96c6\u5230\u7684\u6d4b\u8bd5\u7528\u4f8b\u81ea\u52a8\u5206\u914d\u7ed9\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u3002\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms SEND_PMS \u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n \u5728\u547d\u4ee4\u884c\u8fd9\u6837\u8fd0\u884c\uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\"\n \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report \u76ee\u5f55\u4e0b\u56de\u6536\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u7684\u6d4b\u8bd5\u62a5\u544a\u3002 \u914d\u7f6e\u6587\u4ef6\u5176\u4ed6\u76f8\u5173\u914d\u7f6e\u9879\u8be6\u7ec6\u8bf4\u660e\uff0c\u8bf7\u67e5\u770b\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u6ce8\u91ca\u5185\u5bb9\u3002"},{"location":"#23-pms","title":"2.3. PMS \u6570\u636e\u56de\u586b","text":"\u6d4b\u8bd5\u5355\u5173\u8054\u7684\u7528\u4f8b\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u5bf9\u5e94\u7684\u53bb\u8dd1\u8fd9\u4e9b\u5173\u8054\u7684\u7528\u4f8b\uff0c\u5e76\u4e14\u5c06\u6267\u884c\u7684\u7ed3\u679c\u56de\u586b\u7684\u6d4b\u8bd5\u7528\u4f8b\u7684\u72b6\u6001\u91cc\u9762\u3002 PMS \u6570\u636e\u56de\u586b\u4e3b\u8981\u6709\u4e09\u79cd\u65b9\u5f0f\uff1a \uff081\uff09\u5f02\u6b65\u56de\u586b \u5728\u7528\u4f8b\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\uff0c\u91c7\u7528\u5f02\u6b65\u7684\u65b9\u5f0f\u53bb\u8fdb\u884c\u6570\u636e\u56de\u586b\uff0c\u76f4\u767d\u7684\u8bb2\u5c31\u662f\uff0c\u7b2c\u4e8c\u6761\u7528\u4f8b\u5f00\u59cb\u8dd1\u7684\u65f6\u5019\uff0c\u901a\u8fc7\u5b50\u7ebf\u7a0b\u53bb\u505a\u7b2c\u4e00\u6761\u7528\u4f8b\u7684\u6570\u636e\u56de\u586b\uff0c\u5982\u6b64\u5faa\u73af\uff0c\u76f4\u5230\u6240\u6709\u7528\u4f8b\u6267\u884c\u7ed3\u675f\uff1b \u8fd9\u79cd\u65b9\u6848\u7684\u65f6\u95f4\u6548\u7387\u6700\u9ad8\u7684\uff0c\u56e0\u4e3a\u7406\u8bba\u4e0a\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u662f\u5927\u4e8e\u6570\u636e\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\u65f6\u95f4\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u5f53\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u6570\u636e\u56de\u586b\u4e5f\u5b8c\u6210\u4e86\u3002 \u4f7f\u7528\u65b9\u6cd5\uff0c\u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u4ee5\u4e0b\u53c2\u6570\uff1a\uff08\u4ee5\u4e0b\u6d89\u53ca\u5230\u7684\u53c2\u6570\u914d\u7f6e\u90fd\u662f\u5728\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u914d\u7f6e\uff09 PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = async\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \u8fd9\u4e2a\u53c2\u6570\u53ef\u586b\u53ef\u4e0d\u586b\uff0c\u4f46\u662f\u586b\u4e86\u53ef\u4ee5\u63d0\u9ad8\u7528\u4f8b\u7684\u6267\u884c\u901f\u5ea6\uff0c\u56e0\u4e3a\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u53ef\u4ee5\u6307\u5b9a\u5230\u5177\u4f53\u7684\u5e94\u7528\u5e93\u3002\uff08\u4e0b\u540c\uff09\n \uff082\uff09\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u56de\u586b \u7b49\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u518d\u9010\u4e2a\u8fdb\u884c\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u6b64\u65b9\u6848\u65f6\u95f4\u6548\u7387\u6bd4\u8f83\u4f4e\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \uff083\uff09\u624b\u52a8\u56de\u586b \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4e0d\u505a\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u540e\u7eed\u624b\u52a8\u5c06\u7ed3\u679c\u8fdb\u884c\u56de\u586b\u8bf7\u6c42\u3002 \u7528\u4f8b\u6267\u884c\u65f6\u914d\u7f6e\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = hand\nAPP_NAME = \u540e\u7eed\u624b\u52a8\u56de\u586b\u65b9\u6cd5\uff1a youqu manage.py pms --send2task yes\n"},{"location":"#_4","title":"\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898","text":"\u7531\u540c\u5b66\u53ef\u80fd\u4f1a\u53d1\u73b0\uff0c\u600e\u4e48\u56de\u586b\u4e00\u6b21\u4e4b\u540e\uff0c\u540e\u9762\u60f3\u518d\u6b21\u56de\u586b\u5c31\u4e0d\u751f\u6548\u4e86\uff1b \u8fd9\u662f\u56e0\u4e3a\u4e3a\u4e86\u5e94\u5bf9\u524d\u9762\u63d0\u5230\u7684\u591a\u79cd\u6570\u636e\u56de\u586b\u7684\u65b9\u5f0f\uff0c\u5728 report \u76ee\u5f55\u4e0b\u4f1a\u7531 pms_xxx \u5f00\u5934\u7684\u76ee\u5f55\uff0c\u8bb0\u5f55\u4e86\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u548c\u56de\u586b\u60c5\u51b5\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u4e4b\u524d\u5df2\u7ecf\u56de\u586b\u8fc7\u4e86\uff0c\u540e\u7eed\u5c31\u4e0d\u4f1a\u518d\u6b64\u89e6\u53d1\u56de\u586b\u4e86\uff1b \u5982\u679c\u4f60\u60f3\u91cd\u65b0\u505a\u56de\u586b\uff0c\u4f60\u53ef\u4ee5\u628a report/pms_xxx \u76ee\u5f55\u5220\u6389\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u91cd\u65b0\u505a\u6570\u636e\u56de\u586b\u4e86\uff1b"},{"location":"#24-csv","title":"2.4. \u5bfc\u51fa CSV \u6587\u4ef6","text":"\u6846\u67b6\u63d0\u4f9b\u5bfc\u51fa\u6307\u5b9a\u6807\u7b7e\u7528\u4f8b\u7684\u529f\u80fd\uff1a youqu manage.py exportcsv -a deepin-album -t CICD\n \u8868\u793a\u5bfc\u51fa deepin-album \u7684\u7528\u4f8b\u4e2d\u6807\u8bb0\u4e86 CICD \u6807\u7b7e\u7684\u7528\u4f8b\uff0c\u5bfc\u51fa CSV \u6587\u4ef6\u7684\u5b57\u6bb5\u683c\u5f0f\u5df2\u7ecf\u9002\u914d\u4e86 CICD \u7684\u8981\u6c42\u3002"},{"location":"#25-app","title":"2.5. \u811a\u624b\u67b6\u65b0\u5efa APP \u5de5\u7a0b","text":"\u65b0\u5efa\u4e00\u4e2a APP \u5de5\u7a0b\uff1a youqu manage.py startapp autotest_deepin_some \u8fd9\u6837\u5728 apps \u76ee\u5f55\u4e0b\u4f1a\u521b\u5efa\u4e00\u4e2a\u5b50\u9879\u76ee\u5de5\u7a0b autotest_deepin_some\uff0c\u540c\u65f6\u65b0\u5efa\u597d\u5de5\u7a0b\u6a21\u677f\u76ee\u5f55\u548c\u6a21\u677f\u6587\u4ef6\uff1a apps\n\u2514\u2500\u2500 autotest_deepin_some\n \u00a0\u00a0 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_case.py\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 config.ini\n \u00a0\u00a0 \u251c\u2500\u2500 config.py\n \u00a0\u00a0 \u251c\u2500\u2500 conftest.py\n \u00a0\u00a0 \u251c\u2500\u2500 control\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_assert.py\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some.csv\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u2514\u2500\u2500 widget\n \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 case_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 other.ini\n \u00a0\u00a0 \u251c\u2500\u2500 other_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 pic_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2514\u2500\u2500 ui.ini\n autotest_deepin_some \u662f\u4f60\u7684\u5de5\u7a0b\u540d\u79f0\uff0c\u6bd4\u5982\uff1aautotest_deepin_music \uff1b \u5728\u6b64\u57fa\u7840\u4e0a\uff0c\u4f60\u53ef\u4ee5\u5feb\u901f\u7684\u5f00\u59cb\u4f60\u7684 AT \u9879\u76ee\u3002"},{"location":"#26","title":"2.6. \u7528\u4f8b\u6807\u7b7e\u81ea\u52a8\u540c\u6b65","text":"\u7528\u4e8e\u81ea\u52a8\u540c\u6b65 PMS \u7528\u4f8b\u6807\u7b7e\u6570\u636e\u81f3\u672c\u5730 CSV \u6587\u4ef6\uff0c\u4e3b\u8981\u901a\u8fc7\u4ee5\u4e0b\u51e0\u4e2a\u914d\u7f6e\u6765\u63a7\u5236\uff1a APP_NAME = # \u6307\u5b9a\u8981\u540c\u6b65\u7684\u5e94\u7528\u540d\u79f0\nPMS_USER = # PMS\u7684\u7528\u6237\u540d\nPMS_PASSWORD = # PMS\u7684\u5bc6\u7801\n \u5728 [csv_link_pms_id] \u8282\u70b9\u4e0b\u6307\u5b9a csv \u6587\u4ef6\u540d\u4e0e PMS \u7528\u4f8b\u6a21\u5757\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u6bd4\u5982\uff1a [csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/testcase-browse-53.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 53\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic = 53\n \u5c06\u4ee5\u4e0a\u4fe1\u606f\u914d\u7f6e\u597d\u4e4b\u540e\uff0c\u5728\u547d\u4ee4\u884c\u6267\u884c\uff1a youqu manage.py pms --pms2csv yes\n \u6bcf\u6b21\u6267\u884c\u65f6\u539f csv \u6587\u4ef6\u4f1a\u81ea\u52a8\u5907\u4efd\u5728 report/csv_back \u76ee\u5f55\u4e0b\uff0c\u56e0\u6b64\u4f60\u4e0d\u7528\u62c5\u5fc3\u811a\u672c\u6267\u884c\u5bfc\u81f4\u4f60\u7684\u6570\u636e\u4e22\u5931\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u57fa\u7840\u6846\u67b6\u8bbe\u8ba1\u65b9\u6848","text":"# ====================================\n# Author : Mikigo\n# Time : 2022/3/18\n# version \uff1a1.0\n# ====================================\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"\u505a\u4e00\u4e2a\u7b80\u5355\u3001\u597d\u7528\u3001\u529f\u80fd\u5f3a\u5927\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u3002 \u4f5c\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4e00\u4e2a\u57fa\u7840\u6846\u67b6\uff0c\u4efb\u4f55\u5e94\u7528\u90fd\u80fd\u5f88\u65b9\u4fbf\u7684\u63a5\u5165\u8fdb\u6765\uff1b \u63d0\u4f9b\u6240\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u9700\u8981\u7684\u5e95\u5c42\u529f\u80fd\uff0c\u5e76\u5bf9\u5916\u63d0\u4f9b\u552f\u4e00\u7684\u63a5\u53e3\uff0c\u65b9\u4fbf\u5e94\u7528\u5e93\u4f7f\u7528\uff1b \u6574\u5408\u516c\u5171\u5e93\uff0c\u51cf\u5c11\u5e94\u7528\u5e93\u4ee3\u7801\u91cf\u548c\u65b9\u6cd5\u7ef4\u62a4\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u8bbe\u8ba1\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u7edf\u4e00\u6982\u5ff5","text":" \u57fa\u7840\u6846\u67b6 \u672c\u9879\u76ee\u662f\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\uff08AutoTest Basic Frame\uff09\uff0c\u5168\u79f0\u4e3a\u201c\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff08AT \u57fa\u7840\u6846\u67b6\uff09\u201d\u3002 AT \u57fa\u7840\u6846\u67b6\u662f\u505a\u4e3a\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\u6765\u8bbe\u8ba1\u7684\uff0c\u5b83\u63d0\u4f9b\u4e86\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u57fa\u7840\u529f\u80fd\uff0c\u4efb\u4f55\u5e94\u7528\u63a5\u5165\u8fdb\u6765\u90fd\u80fd\u5feb\u901f\u65b9\u4fbf\u7684\u8fdb\u884c\u65b9\u6cd5\u548c\u7528\u4f8b\u7f16\u5199\uff0c\u540c\u65f6\u5728\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u3001\u6807\u7b7e\u5316\u6267\u884c\u3001\u5206\u5e03\u5f0f\u6267\u884c\u3001\u591a\u79cd\u62a5\u544a\u8f93\u51fa\u3001\u4f18\u7f8e\u7684\u6267\u884c\u65e5\u5fd7\u3001\u5931\u8d25\u81ea\u52a8\u5f55\u5c4f\u548c\u622a\u56fe\u3001\u81ea\u52a8\u73af\u5883\u6e05\u7406\u7b49\u7b49\uff0c\u5b83\u90fd\u63d0\u4f9b\u4e86\u5b8c\u5584\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u66f4\u91cd\u8981\u7684\u662f\u8fd9\u4e00\u5207\u4f7f\u7528\u8d77\u6765\u90fd\u975e\u5e38\u7b80\u5355\u3002 \u57fa\u7840\u6846\u67b6\u4e2d\u5305\u542b\u5e94\u7528\u5e93\uff08apps\uff09\u3001\u6838\u5fc3\u5e93\uff08src\uff09\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09\u3002 \u5e94\u7528\u5e93\uff08apps\uff09 \u5404\u4e2a\u5e94\u7528\u81ea\u5df1\u7684\u4ed3\u5e93\uff0c\u91cc\u9762\u4e3b\u8981\u5305\u542b\u7684\u662f\u7528\u4f8b\u3001\u65b9\u6cd5\u53ca\u4e00\u4e9b\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u53eb autotest-dde-file-manager \u3002 \u6838\u5fc3\u5e93\uff08src\uff09 \u6838\u5fc3\u5e93\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u5230\u6240\u6709\u5e95\u5c42\u6838\u5fc3\u529f\u80fd\uff0c\u8fd9\u662f\u6700\u91cd\u8981\u7684\u4e00\u4e2a\u90e8\u5206\uff0c\u7075\u9b42\u3002\u5177\u4f53\u529f\u80fd\u6a21\u5757\u53ca\u8bf4\u660e\u4f1a\u5728\u4e0b\u9762\u7b2c\u56db\u4e2a\u7ae0\u8282\u8be6\u7ec6\u63cf\u8ff0\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09 \u591a\u4e2a\u5e94\u7528\u90fd\u8981\u7528\u5230\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\uff0c\u6309\u7167\u5e94\u7528\u5212\u5206\u5b58\u653e\uff0c\u4e3b\u8981\u662f\u4e3a\u4e86\u51cf\u5c11\u4ee3\u7801\u91cf\uff0c\u6d88\u9664\u5e94\u7528\u95f4\u7684\u8026\u5408\u5173\u7cfb\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u67b6\u6784\u56fe","text":"\u6574\u4f53\u7684\u6846\u67b6\u8bbe\u8ba1\u5728\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u300b\u6587\u6863\u91cc\u9762\u5df2\u7ecf\u6709\u8be6\u7ec6\u63cf\u8ff0\u4e86\uff0c\u8fd9\u91cc\u8d34\u4e00\u4e0b\u6574\u4f53\u7684\u67b6\u6784\u56fe\uff1a \u4e3a\u4e86\u7a81\u663e\u672c\u6587\u7684\u91cd\u70b9\uff0c\u62bd\u53d6\u5176\u4e2d\u91cd\u8981\u529f\u80fd\u6a21\u5757\uff0c\u5982\u4e0b\u56fe\uff1a "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-basic-frame # \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\n\u251c\u2500\u2500 apps # \u5e94\u7528\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-dde-file-manager # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\uff08\u5e94\u7528\u5e93\u8be6\u7ec6\u76ee\u5f55\u7ed3\u6784\u8bf7\u770b\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\uff09\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 tag # \u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u2514\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u2502 \u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 xxx.png\n\u2502 \u2502 ...\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-deepin-music # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 public # \u516c\u5171\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget # dde_dock \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget # dde_desktop \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 src # \u6838\u5fc3\u5e93\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 button_center.py\n\u2502 \u251c\u2500\u2500 cmdtrl.py\n\u2502 \u251c\u2500\u2500 dogtails.py\n\u2502 \u251c\u2500\u2500 find_image.py\n\u2502 \u251c\u2500\u2500 global_config.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 setting # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 config.py\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 global_config.ini\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\u6a21\u5757\uff08Hook\uff09\n\u251c\u2500\u2500 pytest.ini # Pytest \u9ed8\u8ba4\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 docs # \u6587\u6863\u76ee\u5f55\n\u2514\u2500\u2500 manage.py # \u6267\u884c\u5668\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1apps","title":"1\u3001\u5e94\u7528\u5e93\uff08apps\uff09","text":"\u6240\u6709\u5e94\u7528\u5e93\u5747\u653e\u7f6e\u5728\u57fa\u7840\u6846\u67b6\u4e0b\u7684 apps \u76ee\u5f55\u4e0b\uff08\u89c1\u7b2c\u4e8c\u7ae0\u8282\u7b2c3\u6bb5\u76ee\u5f55\u7ed3\u6784\u5185\u5bb9\uff09\u3002\u5e94\u7528\u5e93\u7684\u67b6\u6784\u8bbe\u8ba1\u53ef\u4ee5\u53c2\u8003\u300aAT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b\u6587\u6863\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2src","title":"2\u3001\u6838\u5fc3\u5e93\uff08src\uff09","text":"\u5728 src \u76ee\u5f55\u4e0b\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u5e95\u5c42\u6838\u5fc3\u7ec4\u4ef6\uff0c\u901a\u5e38\u6765\u8bb2\u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5230\u5176\u4e2d\u67d0\u4e00\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4e48\u4f60\u9700\u8981\u663e\u793a\u7684\u5bfc\u5165\u8fd9\u4e2a\u6a21\u5757\uff0c\u7136\u540e\u624d\u80fd\u4f7f\u7528\u8be5\u6a21\u5757\u4e0b\u7684\u529f\u80fd\uff0c\u5982\u679c\u4f60\u7528\u5230\u4e86\u5341\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4f60\u5c31\u9700\u8981\u5bfc\u5165\u5341\u4e2a\u3002\u4f46\u662f\u6211\u4eec\u60f3\u8ba9\u4e8b\u60c5\u53d8\u5f97\u7b80\u5355\uff0c\u4e00\u6b21\u5bfc\u5165\uff0c\u4f7f\u7528\u6240\u6709\u3002 \u5c06\u6240\u6709\u7684\u529f\u80fd\u6a21\u5757\u90fd\u8fdb\u5165\u5230 src \u7684\u540d\u79f0\u7a7a\u95f4\uff0c\u5728 src/__init__.py \u91cc\u9762\u6211\u4eec\u8bbe\u8ba1\u6210\u8fd9\u6837\uff1a # src/__init__.py\nfrom .cmdctl import CmdCtl\nfrom .dogtails import Dogtail\nfrom .find_image import FindImage\nfrom .button_center import ButtonCenter\nclass Src(CmdCtl, FindImage):\ndef __init__(self, **kwargs):\n\"\"\"dogtail or button center param\n :param kwargs: app_name, desc, number\n \"\"\"\nif kwargs:\napp_name = kwargs.get(\"APP_NAME\")\ndesc = kwargs.get(\"DESC\")\nif app_name is None or desc is None:\nraise ValueError\nnumber = kwargs.get(\"number\")\nnumber = number if isinstance(number, int) else -1\n# \u5bf9\u8c61\u7ec4\u5408\nself.dog = Dogtail(app_name, desc, number)\nself.ui = ButtonCenter(app_name, number)\n \u9700\u8981\u4f20\u9012\u53c2\u6570\u7684\u91c7\u7528\u5bf9\u8c61\u7ec4\u5408\uff0c\u6ca1\u6709\u53c2\u6570\u7684\u4f7f\u7528\u7ee7\u627f\uff0c\u7ee7\u627f\u7684\u7c7b\u7b26\u5408 Mixin \u8bbe\u8ba1\u6a21\u5f0f\u3002 \u5e94\u7528\u5e93\u91cc\u9762\u4f7f\u7528\u7684\u65f6\u5019\u5728 widget/base_widget.py \u91cc\u9762\u53ea\u9700\u8981\u552f\u4e00\u7ee7\u627f Src \uff1a # \u5e94\u7528\u5e93\u91cc\u9762\u65b9\u6cd5\u57fa\u7c7b\n# widget/base_widget.py\nfrom src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n \u8981\u4f7f\u7528\u6838\u5fc3\u5e93\u7684\u529f\u80fd\uff0c\u53ea\u9700\u8981\u5199\u4e00\u4e2a\u5bfc\u5165 from src import Src \u5373\u53ef\u3002 \u5199 __init__ \u6784\u9020\u51fd\u6570\u7684\u539f\u56e0\u662f\u901a\u8fc7\u53c2\u6570\u6784\u9020\u5e94\u7528\uff0c\u5e76\u4e14\u4f20\u9012 number \u8fdb\u6765\uff0c\u53ef\u4ee5\u5b9e\u73b0\u591a\u7a97\u53e3\u7684\u63a7\u5236\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3public","title":"3\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09","text":"\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6bcf\u4e2a\u5e94\u7528\u90fd\u662f\u4e00\u4e2a\u5355\u72ec\u7684 py \u6587\u4ef6\uff0c\u76f8\u4e92\u4e4b\u95f4\u662f\u72ec\u7acb\u7684\uff0c\u6bcf\u4e2a py \u6587\u4ef6\u91cc\u9762\u662f\u8be5\u5e94\u7528\u7684\u65b9\u6cd5\u7c7b\uff0c\u6bd4\u5982\uff1a\u6700\u5e38\u7528\u7684\u65b9\u6cd5\u7c7b dde_desktop_public_widget.py # dde_desktop_widget.py\nfrom src import Src\nclass _DdeDesktopPublicBaseWidget(Src):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-desktop\"\nDESC = \"/usr/bin/dde-desktop\"\ndef __init__(self):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC)\nclass DdeDesktopPublicWidget(_DdeDesktopPublicBaseWidget):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u7c7b\"\"\"\ndef click_music_dir_by_ui(self):\n\"\"\"\u5728\u6587\u4ef6\u9009\u62e9\u6846\u70b9\u51fb\u97f3\u4e50\u76ee\u5f55\"\"\"\nself.click(*self.ui.btn_center(\"\u4fa7\u8fb9\u680f-\u97f3\u4e50\")) \ndef click_xxx_by_attr(self):\npass\n \u516c\u5171\u65b9\u6cd5\u5e93\u610f\u4e49\uff1a \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6240\u5c01\u88c5\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\u90fd\u662f\u81f3\u5c11\u88ab2\u4e2a\u5e94\u7528\u90fd\u7528\u5230\u7684\uff0c\u8fd9\u6837\u505a\u53ef\u4ee5\u51cf\u5c11\u6574\u4f53\u4ee3\u7801\u91cf\uff0c\u4ece\u800c\u51cf\u8f7b\u5e94\u7528\u5e93\u4ee3\u7801\u7684\u7ef4\u62a4\u5de5\u4f5c\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u7f16\u5199\u5f62\u5f0f\uff08\u547d\u540d\u89c4\u5219\u3001\u5b9a\u4f4d\u7684\u65b9\u6848\u5199\u6cd5\u3001\u6ce8\u91ca\u7684\u5199\u6cd5\u7b49\u7b49\uff09\u5177\u6709\u4e00\u5b9a\u7684\u6a21\u677f\u4f5c\u7528\uff0c\u8fd9\u6837\u5373\u4f7f\u662f\u5404\u4e2a\u5e94\u7528\u5e93\u90fd\u72ec\u7acb\u7ef4\u62a4\uff0c\u6240\u6709\u7684\u7f16\u7801\u98ce\u683c\u90fd\u662f\u8d8b\u4e8e\u76f8\u540c\u7684\uff0c\u56e0\u4e3a\u5927\u5bb6\u90fd\u5e94\u8be5\u53c2\u7167\u516c\u5171\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u5199\u6cd5\u6765\u5199\u81ea\u5df1\u5e94\u7528\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\u7c7b\uff0c\u8fd9\u6837\u4f7f\u5f97\u4ece\u516c\u53f8\u7684\u89d2\u5ea6\u53bb\u770b\u6240\u6709\u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u90fd\u662f\u7edf\u4e00\u7684\u3002 \u53ef\u4ee5\u901a\u8fc7\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\uff0c\u4e86\u89e3\u5230\u5176\u4ed6\u5e94\u7528\u7684\u529f\u80fd\uff0c\u5bf9\u4e8e\u6211\u4eec\u9700\u6c42\u7406\u89e3\uff0c\u4e86\u89e3\u7cfb\u7edf\u7684\u65b9\u65b9\u9762\u9762\u4e5f\u6709\u597d\u5904\u3002 \u5f53\u7136\uff0c\u5982\u679c\u4f60\u7684\u5e94\u7528\u672c\u8eab\u662f\u5c5e\u4e8e\u6839\u672c\u5c31\u4e0d\u9700\u8981\u548c\u5176\u4ed6\u5e94\u7528\u4ea4\u4e92\u7684\uff0c\u90a3\u4e48\u4f60\u53ef\u80fd\u4e0d\u4f1a\u7528\u5230\u8fd9\u91cc\u9762\u7684\u529f\u80fd\uff0c\u6ca1\u5173\u7cfb\uff0c\u4f60\u6240\u6709\u7684\u65b9\u6cd5\u90fd\u53ef\u4ee5\u76f4\u63a5\u5199\u5728\u5e94\u7528\u5e93\u7684\u4e1a\u52a1\u5c42\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4conftestpy","title":"4\u3001conftest.py","text":"conftest.py \u4ece\u529f\u80fd\u4e0a\u5c06\u662f\u5c5e\u4e8e\u6838\u5fc3\u5e93\uff08src\uff09\u7684\u5185\u5bb9\uff0c\u4f46\u662f\u7531\u4e8e\u5b83\u7684\u7279\u6b8a\u6027\uff0c\u5373\u5b83\u662f\u5bf9\u5e94\u7528\u5e93\u4e2d\u7684\u7528\u4f8b\u751f\u6548\u7684\uff0c\u800c\u4e14\u5b83\u7684\u4f5c\u7528\u57df\u662f\u5f53\u524d\u76ee\u5f55\u53ca\u4ee5\u4e0b\uff0c\u56e0\u6b64\u6211\u4eec\u5c06\u5b83\u653e\u5230\u9879\u76ee\u6839\u76ee\u5f55\u3002\u6211\u4eec\u6846\u67b6\u4e2d\u6709\u4e0d\u5c11\u6838\u5fc3\u529f\u80fd\u90fd\u662f\u5728\u8fd9\u91cc\u9762\u8fdb\u884c\u5f00\u53d1\u7684\uff0c\u540e\u9762\u7b2c\u56db\u7ae0\u4f1a\u8bb2\u5230\u7ec6\u8282\u3002 pytest.ini \u4f5c\u7528\u548c conftest.py \u7c7b\u4f3c\uff0c\u662f Pytest \u6846\u67b6\u7684\u56fa\u5b9a\u914d\u7f6e\u6587\u4ef6\uff0c\u76ee\u524d\u914d\u7f6e\u4e86\u4e00\u4e9b\u901a\u7528\u7684\u547d\u4ee4\u884c\u6267\u884c\u53c2\u6570\uff0c\u4e5f\u653e\u5728\u9879\u76ee\u6839\u76ee\u5f55\u3002 \u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 Hook \u51fd\u6570\uff0capps \u76ee\u5f55\u4e0b\u7684 \u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 fixture \u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5setting","title":"5\u3001setting","text":"\u5168\u5c40\u914d\u7f6e\u6a21\u5757\uff0c\u5305\u542b\u4e86\u4ee5\u4e0b\u914d\u7f6e\u6587\u4ef6\uff1a \uff081\uff09ini \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u914d\u7f6e\u4e00\u4e9b\u5168\u5c40\u7684\u914d\u7f6e\u9879\uff0c\u8b6c\u5982\uff1a\u5931\u8d25\u91cd\u8dd1\u6b21\u6570\u3001\u662f\u5426\u5931\u8d25\u5f55\u5c4f\u3001\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\u3001\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4\u3001\u6267\u884c\u65f6\u65e5\u5fd7\u7ea7\u522b\u3001\u751f\u6210\u7684\u62a5\u544a\u7c7b\u578b\u3001\u4ee5\u53ca\u5206\u5e03\u5f0f\u6267\u884c\u7684\u4e00\u4e9b\u7b56\u7565\u914d\u7f6e\u9879\u7b49\u7b49\u3002 \uff082\uff09config.py \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u63d0\u4f9b\u914d\u7f6e\u6587\u4ef6\u8bfb\u53d6\u3001\u52a8\u6001\u83b7\u53d6\u4e00\u4e9b\u5e38\u91cf\uff08\u5982\u9879\u76ee\u6839\u76ee\u5f55\u7edd\u5bf9\u8def\u5f84 (BASE_DIR)\u3001\u7cfb\u7edf\u67b6\u6784\uff08SYS_FRAME\uff09\u3001\u65f6\u95f4\u5b57\u7b26\u4e32\uff08strftime\uff09\u3001\u672c\u673a USERNAME IP \u7b49\u7b49\uff09\u3001\u516c\u5171 URL \u7b49\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u89c4\u8303","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u7248\u672c\u53ca\u4f9d\u8d56","text":"\u57fa\u7840\u6846\u67b6\u4f1a\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u8fdb\u884c\u7248\u672c\u53d1\u5e03\uff0c\u4e0d\u4e0e\u67d0\u4e2a\u5e94\u7528\u7248\u672c\u7ed1\u5b9a\uff0c\u4f46\u662f\uff0c\u5e94\u7528\u5e93\u4f1a\u4f9d\u8d56\u4e8e\u57fa\u7840\u6846\u67b6\u7684\u7248\u672c\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u5efa\u8bae\u5728\u5e94\u7528\u5e93\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a\u6587\u672c\u6587\u4ef6\u7528\u4e8e\u8bb0\u5f55\u6240\u4f9d\u8d56\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\uff0c\u7c7b\u4f3c\u4e8e\u5f00\u53d1\u5e94\u7528\u7684 debian/control \u6587\u4ef6\u7684\u529f\u80fd\uff0c\u4e3a\u4e86\u4fdd\u6301\u7edf\u4e00\uff0c\u8fd9\u4e2a\u6587\u4ef6\u5c31\u547d\u540d\u4e3a control\uff0c\u653e\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u6838\u5fc3\u5e93\u72ec\u7acb\u6027","text":"\u6838\u5fc3\u5e93\u4e0d\u5efa\u8bae\u9488\u5bf9\u67d0\u4e00\u4e2a\u5e94\u7528\u5355\u72ec\u505a\u4ee3\u7801\u4e0a\u7279\u6b8a\u5904\u7406\uff0c\u901a\u5e38\u8003\u8651\u9488\u5bf9\u67d0\u4e00\u79cd\u573a\u666f\u8fdb\u884c\u5904\u7406\uff0c\u8fd9\u4e9b\u573a\u666f\u901a\u5e38\u662f\u5b58\u5728\u4e00\u4e9b\u5171\u6027\u7684\u3002\u6bd4\u5982\u8bf4\uff1a\u684c\u9762\u7684ID\u5206\u914d\u5b58\u5728\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u903b\u8f91\u5904\u7406\u89e3\u51b3ID\u5206\u914d\u9519\u8bef\u7684\u95ee\u9898\uff0c\u4f46\u662f\u8fd9\u90e8\u5206\u903b\u8f91\u6211\u4eec\u4f1a\u5728\u684c\u9762\u7684\u65b9\u6cd5\u5c42\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u517c\u5bb9\u6027","text":"\u4e3a\u4e86\u4fdd\u6301\u517c\u5bb9\u6027\uff0c\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u539f\u5219\u4e0a\u4e0d\u5bf9\u8001\u65b9\u6cd5\u8fdb\u884c\u4fee\u6539\u6216\u5220\u9664\uff0c\u53ea\u8fdb\u884c\u65b0\u589e\u3002\u6d89\u53ca\u5230\u8001\u65b9\u6cd5\u4fee\u6539\u6216\u5220\u9664\u7684\uff0c\u4f1a\u8fdb\u884c\u63d0\u524d\u9884\u544a\uff0c\u5e76\u5728\u7b2c\u4e8c\u4e2a\u7248\u672c\u4e4b\u540e\uff08\u4e2d\u95f4\u4f1a\u9694\u4e00\u4e2a\u7248\u672c\u8fc7\u5ea6\uff09\u6b63\u5f0f\u5b9e\u65bd\u4fee\u6539\u6216\u5220\u9664\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u547d\u540d\u89c4\u8303","text":" \u7528\u4f8b ID \u6bcf\u4e2a\u5e94\u7528\u81ea\u5df1\u7ef4\u62a4\u4e00\u5957 ID\uff0c\u5728PMS\u4e0a\u7528\u4f8b\u6807\u9898\u4e0a\u5c06\u81ea\u52a8\u5316ID\u4ee5\u6807\u7b7e\u7684\u5f62\u5f0f\u5199\u5165\uff0c\u6bd4\u5982\uff1a[101]\u6253\u5f00-\u542f\u52a8\u5e94\u7528\u540edock\u53f3\u952e\u83dc\u5355 \u4e00\u4e2a\u7528\u4f8b\u7c7b\u91cc\u9762\u6709\u591a\u4e2a\u7528\u4f8b\u65f6\uff0c\u5728\u7528\u4f8b\u540d\u79f0\u540e\u9762\u52a0\u5e8f\u53f7\u3002 class TestFileManager(BaseCase):\n\"\"\"\u6587\u7ba1\u7528\u4f8b\"\"\"\ndef test_xxx_015_1(self):\npass\ndef test_xxx_015_2(self):\npass\n \u6ce8\u610f 015_1\uff0c\u4e0d\u8981\u5199015_01\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 PMS \u4e0a\u7684\u7528\u4f8bID\uff1a PMS \u4e0a\u662f6\u4f4d\u6570\uff0c\u4e0d\u591f\u76f4\u89c2\uff0c\u4e5f\u4e0d\u597d\u7ef4\u62a4\uff0c\u5728\u81ea\u52a8\u5316\u4e0b\u9762\u53bb\u627e\u4e00\u4e2a\u5e26\u6709 6 \u4f4d\u6570\u7684\u6587\u4ef6\u662f\u4e00\u4e2a\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 PMS \u4e0a\u7684 ID \u53ef\u80fd\u4f1a\u53d1\u751f\u53d8\u5316\uff0c\u6bd4\u5982\u5bfc\u51fa\u6765\u5bfc\u8fdb\u53bb\u7684\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u5b58\u5728\u95ee\u9898\uff0c\u5982\u679c\u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u8981\u60f3\u627e\u51fa\u6765\u5bf9\u5e94\u4fee\u6539\u81ea\u52a8\u5316\u7528\u4f8b ID\uff0c\u5c06\u4f1a\u662f\u4ef6\u975e\u5e38\u75db\u82e6\u7684\u4e8b\u60c5\u3002 \u51fd\u6570\u547d\u540d\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5de6\u952e\u70b9\u51fb click \u53f3\u952e\u70b9\u51fb right_click \u53cc\u51fb double_click \u79fb\u52a8 move_to \u62d6\u52a8 drag \u65b0\u5efa new \u62d6\u52a8\u5230 drag_to \u4ece\u54ea\u91cc\u62d6\u52a8\u5230\u54ea\u91cc drag_something_from_xxx_to_xxx \u83b7\u53d6 get \u83b7\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5750\u6807 get_location \u975e\u7279\u6b8a\u6587\u4ef6 file word\u6587\u4ef6 doc text\u6587\u4ef6 text \u6587\u4ef6\u5939 dir \u5173\u952e\u8bcd\u6301\u7eed\u589e\u52a0 \u5e38\u91cf\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5e94\u7528\u540d\u79f0 APP_NAME \u5e94\u7528\u63cf\u8ff0 DESC \u672c\u5e94\u7528\u4ee5\u5916\u7684\u5176\u4ed6\u5e94\u7528\uff0c\u6bd4\u5982\u5e2e\u52a9 HELP \u5176\u4ed6\u540d\u79f0\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u65b9\u6cd5\u5305\u540d widget \u65b9\u6cd5\u6587\u4ef6\u540d\uff08\u6587\u7ba1\u4e3e\u4f8b\uff09 dfm_widget.pytitle_widget.pyright_view_widget.pyleft_view_widget.pypop_widget.pybase_widget.pydfm_assert.py \u65ad\u8a00\u8bed\u53e5\u547d\u540d\u89c4\u8303 \u65ad\u8a00\u8bed\u53e5\u90fd\u662f\u4ee5 assert \u5f00\u5934 \u65ad\u8a00 \u8bed\u53e5 \u5224\u65ad\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_existsassert_file_not_exists \u5224\u65ad\u684c\u9762\u76ee\u5f55\u4e0b\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_exists_in_desktopassert_file_not_exists_in_desktop \u5224\u65ad\u56fe\u7247\u5b58\u5728 assert_image_existsassert_image_not_exists \u5224\u65ad\u5f71\u9662\u4e2d\u662f\u5426\u5b58\u5728\u56fe\u7247 assert_image_exists_in_movieassert_image_not_exists_in_movie \u5224\u65ad\u5143\u7d20\u662f\u5426\u5b58\u5728 assert_element_existassert_element_not_exist \u5224\u65ad\u662f\u5426\u76f8\u7b49 assert_equalassert_not_equal \u5224\u65ad\u662f\u5426\u4e3a\u771f assert_trueassert_false"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5fixture","title":"5\u3001fixture \u89c4\u8303","text":"\u7531\u4e8e Pytest \u6846\u67b6\u4e2d\u652f\u6301 fixture \u7684\u5199\u6cd5\u548c Xunit \u5199\u6cd5\u7684\uff0c\u6240\u4ee5\u5e94\u7528\u5e93\u4e2d\u53ef\u80fd\u5b58\u5728\u6df7\u7528\u7684\u60c5\u51b5\uff0c\u4e3a\u7edf\u4e00\u7f16\u7801\u98ce\u683c\u65b9\u4fbf\u540e\u7eed\u7528\u4f8b\u4ee3\u7801\u7ef4\u62a4\uff0c\u73b0\u505a\u4ee5\u4e0b\u89c4\u8303\u8bf4\u660e\uff1a \u629b\u5f03 Xunit \u7684\u5199\u6cd5\uff0c\u7edf\u4e00\u91c7\u7528 Pytest fixture \u7684\u5199\u6cd5\u3002 \u5e94\u7528\u5185 fixture \u8c28\u614e\u4f7f\u7528 autouse=True \uff0c\u975e\u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u975e\u5e38\u4e0d\u5efa\u8bae\u4f7f\u7528\u8fd9\u4e2a\u53c2\u6570\u3002 \u8c03\u7528 fixture \u4e0d\u80fd\u4f7f\u7528 @pytest.mark.usefixture()\uff0c\u4f7f\u7528\u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u4f20\u5165\u51fd\u6570\u5bf9\u8c61\u3002 \u5efa\u8bae\u5728\u4e00\u4e2a conftest.py \u91cc\u9762\u53bb\u5199\uff0c\u4e00\u4e2a\u5e94\u7528\u4e5f\u5c3d\u91cf\u7ef4\u62a4\u4e00\u4e2a conftest.py\u6587\u4ef6\u3002 fixture \u4e5f\u9700\u8981\u5199\u529f\u80fd\u8bf4\u660e\uff0c\u51fd\u6570\u540d\u79f0\u8981\u6709\u5177\u4f53\u542b\u4e49\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#6","title":"6\u3001\u65b9\u6cd5\u7f16\u5199\u89c4\u8303","text":" \u65b9\u6cd5\u7c7b\u578b\uff1a if \u6ca1\u6709\u7528\u5230\u5b9e\u4f8b\u5bf9\u8c61\uff1a\nif \u6ca1\u6709\u7528\u5230\u7c7b\u5bf9\u8c61\uff1a\n\u5199\u9759\u6001\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @staticmethod\nelse\uff1a\n\u5199\u7c7b\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @classmethod\nelse:\n\u76f4\u63a5\u5199\u5b9e\u4f8b\u65b9\u6cd5\n \u4e3e\u4f8b: class TitleWidget:\ndef click_xxx_by_ui(self):\npass\n@staticmethod\ndef click_xxx_by_ui():\npass\n@classmethod\ndef click_xxx_by_ui(cls):\npass\n \u51fd\u6570\u540d\u79f0\u4e0d\u51fa\u73b0\u6570\u5b57\uff0c\u9700\u8981\u8868\u793a\u6570\u91cf\u7684\u7528\u5355\u8bcd\u8868\u793a\u3002 \u51fd\u6570\u529f\u80fd\u6ce8\u91ca\u3002 \u6ca1\u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg2:xxx\n\"\"\"\n \u6709\u53c2\u6570\uff0c\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg1:xxx\nreturn: xxx\n\"\"\"\n \u200b \u7528 Pycharm \u7684\u6ce8\u91ca\u6a21\u677f\u4e5f\u53ef\u4ee5\uff0c\u53ea\u8981\u4f53\u73b0\u4e86\u53c2\u6570\u7684\u7c7b\u578b\u548c\u8fd4\u56de\u5c31\u884c\u4e86\u3002 \u6682\u4e0d\u8981\u6c42\u5199\u7c7b\u578b\u6ce8\u89e3\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#7case","title":"7\u3001\u7528\u4f8b\uff08case\uff09\u89c4\u8303","text":" \u4ee5\u7c7b\u7684\u5f62\u5f0f\u5199\u7528\u4f8b\uff0c\u7528\u4f8b\u7c7b\u96c6\u6210\u7528\u4f8b\u57fa\u7c7b\u3002 \u7528\u4f8b\u7c7b\u9700\u8981\u5199\u6ce8\u91ca\u3002 \u6d4b\u8bd5\u7528\u4f8b\u51fd\u6570\u8bf4\u660e\uff08\u5efa\u8bae\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u540d\u79f0\uff09 \"\"\"\u53f3\u4fa7\u9884\u89c8-\u56fe\u7247\u7c7b\u578b\u4fe1\u606f\u680f\u57fa\u672c\u4fe1\u606f\"\"\"\n \u4e0d\u5199\u8c03\u8bd5\u4ee3\u7801 if __name__ == '__main__':\npytest.main()\n \u6240\u6709\u7528\u4f8b\u90fd\u7ee7\u627f BaseCase\u3002 BaseCase \u91cc\u9762\u653e\u4e00\u4e9b\u6d4b\u8bd5\u6570\u636e\u7684\u5e38\u91cf\uff0c\u6bd4\u5982\u6587\u4ef6\u540d\u79f0\uff0c\u5e94\u7528\u540d\u79f0\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u4e00\u4e9b\u901a\u7528\u7684\u5b57\u7b26\u4e32\u3002 \u8fd9\u7c7b\u662f\u5c5e\u4e8e\u6d4b\u8bd5\u6570\u636e\u3002 class BaseCase(DfmAssert):\n\"\"\"\u7528\u4f8b\u57fa\u7c7b\"\"\"\nNEW_FILE = \"\u65b0\u5efa\u6587\u672c.txt\"\nTEST_FILE = \"test.txt\"\nNEW_DIR = \"\u65b0\u5efa\u6587\u4ef6\u5939\"\nNEW_WORD = \"\u65b0\u5efaWord\u6587\u6863.doc\"\nAPP_HELP = \"damn\"\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\n\"\"\"\u7528\u4f8b\u6807\u9898\uff08\u590d\u5236PMS\u4e0a\u7528\u4f8b\u6807\u9898\uff09\"\"\"\ndfm = DfmWidget()\ndfm.click_xxx_by_attr(self.NEW_FILE)\ndfm.new_file_in_desktop_by_cmd(self.NEW_FILE)\nself.assert_true(dfm.get_process_status(self.APP_NAME))\n \u7528\u4f8b\u91cc\u9762\u5c3d\u91cf\u51cf\u5c11\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\uff0c\u66f4\u8981\u51cf\u5c11\u76f8\u540c\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\u3002 \u7edf\u4e00\u6587\u4ef6\u6ce8\u91ca\u5934\u3002 #!/usr/bin/env python3\n# _*_ coding:utf-8 _*_\n\"\"\"\n:Author:email@uniontech.com\n:Date :${DATE} ${TIME}\n\"\"\"\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#8","title":"8\u3001\u5176\u4ed6\u89c4\u8303","text":" \u65e5\u5fd7\u6253\u5370\u8981\u5728\u65b9\u6cd5\u6700\u524d\u9762\uff0c\u5426\u5219\u4ee3\u7801\u62a5\u9519\u6ca1\u6709\u65e5\u5fd7\u8f93\u51fa\uff0c\u4e0d\u597d\u5b9a\u4f4d\u95ee\u9898\u3002\uff08\u6211\u4eec\u4f1a\u8003\u8651\u7ee7\u7eed\u4f7f\u7528\u62e6\u622a\u5668\u6253\u5370\u65e5\u5fd7\uff09 \u6240\u6709\u7684\u64cd\u4f5c\u90fd\u9700\u8981\u6709\u65e5\u5fd7\uff0c\u5305\u62ec sleep()\uff0c\u6211\u4eec\u4f1a\u91cd\u5199\u4e00\u4e2a\u6709\u65e5\u5fd7\u8f93\u5165\u7684 sleep\u3002 \u4e1a\u52a1\u5c42\u65e5\u5fd7\u7ea7\u522b\u4e3a INFO\u3002 hook \u51fd\u6570\u53ea\u80fd\u5199\u5230\u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u91cc\u9762\u3002 apps \u76ee\u5f55\u4e0b\u7684 conftest.py \u539f\u5219\u4e0a\u4e0d\u4f1a\u65b0\u589e fixture\u3002 \u56fa\u5b9a\u76ee\u5f55\u6216\u5143\u7d20\u63a7\u4ef6\u7684\u64cd\u4f5c\uff0c\u5c06\u64cd\u4f5c\u65b9\u6cd5\u5199\u6b7b\uff0c\u6587\u4ef6\u7c7b\u64cd\u4f5c\u5c06\u6587\u4ef6\u540d\u7559\u53c2\u6570\u3002 \u8def\u5f84\u62fc\u63a5\u89c4\u8303\uff1a \u7cfb\u7edf\u4e2d\u56fa\u5b9a\u76ee\u5f55\uff0c\u8def\u5f84\u62fc\u63a5\u65f6\u4f7f\u7528\u6ce2\u6d6a\u7b26\u53f7\uff0c\u6bd4\u5982\uff1a~/Desktop/\uff0c\u4e0b\u5c42\u4f7f\u7528 os.path.expanduser()\uff0c\u5b83\u53ef\u4ee5\u81ea\u52a8\u8bc6\u522b\u6ce2\u6d6a\u7b26\u53f7\u3002 \u9879\u76ee\u4e0b\u8def\u5f84\u4f7f\u7528\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u8def\u5f84\uff0c\u6bd4\u5982\uff1aConfig.BASE_PATH\uff0c\u56e0\u4e3a\u9879\u76ee\u662f\u53ef\u4ee5\u5728\u4efb\u610f\u8def\u5f84\u8fd0\u884c\u7684\uff0c\u9700\u8981\u52a8\u6001\u62fc\u63a5\u8def\u5f84\u3002 "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848","text":"# =================================================\n# Author : Mikigo\n# Time : 2022/3/16\n# version \uff1a1.0\n# =================================================\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"AT \u5e94\u7528\u5e93\u6539\u9020\u662f\u57fa\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u8fdb\u884c\u7528\u4f8b\u65b9\u6cd5\u548c\u4e1a\u52a1\u903b\u8f91\u7684\u91cd\u65b0\u8bbe\u8ba1\uff0c\u4ee5\u5b9e\u73b0\u5e94\u7528\u5e93\u9ad8\u6548\u7684\u7f16\u5199\u3001\u7ef4\u62a4\u7528\u4f8b\u53ca\u5176\u65b9\u6cd5\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u6587\u4ef6\u7ba1\u7406\u5668\u4ece\u4e1a\u52a1\u590d\u6742\u5ea6\u548c\u7528\u4f8b\u91cf\u6765\u8bb2\uff0c\u5728\u7cfb\u7edf\u6240\u6709\u5e94\u7528\u4e2d\uff0c\u662f\u5f88\u6709\u4ee3\u8868\u6027\u7684\uff0c\u96be\u5ea6\u4e5f\u662f\u6700\u5927\u7684\uff0c\u56e0\u6b64\u6211\u4eec\u9009\u53d6\u6587\u4ef6\u7ba1\u7406\u5668\u4f5c\u4e3a\u5e94\u7528\u5e93\u6539\u9020\u7684\u5b9e\u9a8c\u5e94\u7528\uff0c\u7ed9\u540e\u7eed\u5176\u4ed6\u5e94\u7528\u6539\u9020\u63d0\u4f9b\u5207\u5b9e\u53ef\u884c\u7684\u601d\u8def\u548c\u65b9\u6848\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u5206\u5c42\u8bbe\u8ba1\u56fe","text":"\u6574\u4f53\u4ecd\u7136\u9075\u5faa PO \u8bbe\u8ba1\u7406\u5ff5\uff0c\u6839\u636e\u4e1a\u52a1\u9700\u8981\uff0c\u5c06\u6587\u7ba1\u4e1a\u52a1\u5c42\u8fdb\u884c 3 \u5c42\u5212\u5206\uff1a "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-dde-file-manager # \u5e94\u7528\u4ed3\u5e93\n\u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 test_xxx_001.py\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u00a0\u251c\u2500\u2500 __init__.py\n\u2502 \u00a0\u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u00a0\u251c\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u00a0\u251c\u2500\u2500 base_widget.py # \u65b9\u6cd5\u57fa\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 title_widget.py # title \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 right_view_widget.py # right view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 left_view_widget.py # left view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 pop_widget.py # pop \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 dfm_widget.py # \u65b9\u6cd5\u7684\u7edf\u4e00\u51fa\u53e3\n\u2502 \u00a0\u2514\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 tag # \u7528\u4f8b\u6807\u7b7e\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 xxx.csv # \u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2514\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u57fa\u7c7b","text":" \u7ee7\u627f\u6838\u5fc3\u5c42\u7684\u5404\u4e2a\u6a21\u5757\u7c7b\u3002 \u62bd\u53d6\u64cd\u4f5c\u5c42\u7684\u4e00\u4e9b\u57fa\u7840\u65b9\u6cd5\u3002 \u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u7684\u4e00\u4e9b\u516c\u5171\u65b9\u6cd5\u3002 \u8def\u5f84\u7ec4\u88c5\u65b9\u6cd5\u3002 \u4e00\u4e9b\u4e1a\u52a1\u5c42\u76f8\u5173\u7684\u53d8\u91cf\u3001\u5e38\u91cf\u3001shell\u547d\u4ee4\u3001\u5750\u6807\u3002 \u65b9\u6cd5\u57fa\u7c7b\u7684\u5199\u6cd5\uff1a from src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u64cd\u4f5c\u5c42","text":" \u6a21\u5757\u5212\u5206 \u6309\u7167\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u6587\u7ba1\u4e3b\u754c\u9762\u5206\u4e3a\u4e09\u4e2a\u533a\u57df\uff1a\u6807\u9898\u680f\u3001\u53f3\u8fb9\u89c6\u56fe\u533a\u57df\u3001\u5de6\u8fb9\u89c6\u56fe\u533a\u57df \u5f39\u7a97\uff1a\u8bbe\u7f6e\u754c\u9762\u5f39\u7a97\u3001\u4fdd\u9669\u7bb1\u5f39\u7a97\u3001\u5220\u9664\u786e\u8ba4\u5f39\u7a97\u3001\u53ca\u5404\u79cd\u7f51\u7edc\u5f39\u7a97 \u53f3\u952e\u83dc\u5355\uff1a\u6682\u65f6\u4e0d\u8003\u8651\u4e3a\u5355\u72ec\u7684\u6a21\u5757\uff0c\u8003\u8651\u4ee5\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6848\u505a\u6210\u516c\u5171\u5e93\u3002 \u5404\u4e2a\u6a21\u5757\u53ea\u7ee7\u627f\u57fa\u7c7b from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u6784\u9020\u51fd\u6570\u91cc\u9762\u4e0d\u6784\u9020\u5bf9\u8c61\uff0c\u53ef\u4ee5\u521d\u59cb\u5316\u4e00\u4e9b\u53d8\u91cf\u3002 \u4e0d\u540c\u7684\u5b9a\u4f4d\u65b9\u6848\u8c03\u7528\u4e0d\u540c\u7684\u5b9a\u4f4d\u5de5\u5177\u5bf9\u8c61\u3002 self.dog\nself.ui\nself.d_bus\n \u65b9\u6cd5\u7f16\u5199 \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u5e94\u7528\u5c42","text":" \u7ee7\u627f\u64cd\u4f5c\u5c42\u7684\u6240\u6709\u7c7b\u3002 \u4ec5\u4ec5\u7528\u4e8e\u7528\u4f8b\u4e2d\u5bfc\u5165\u65b9\u4fbf\uff0c\u4e0d\u505a\u5176\u4ed6\u4e8b\u60c5\u3002 class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n DfmAssert \u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u7ee7\u627f\uff0c\u65b9\u4fbf\u4f7f\u7528\u65ad\u8a00\u8bed\u53e5\u3002 from apps.dde_file_manager.widget.dfm_widget import DfmWidget\nfrom public.assert import Assert\nclass DfmAssert(Assert):\ndef assert_file_exists_in_desktop(self, file_name):\nself.assert_file_exists(f\"~/Desktop{file_name}\")\n...\nDfmWidget().get_file_in_desktop()\n \u7528\u4f8b\u91cc\u9762\u76f4\u63a5\u7ee7\u627f\uff0c\u65b9\u4fbf\u5728\u7528\u4f8b\u91cc\u9762\u4f7f\u7528 self \u8fdb\u884c\u65ad\u8a00\uff0c\u66f4\u7b26\u5408\u65ad\u8a00\u7684\u4f7f\u7528\u4e60\u60ef\uff0c\u7528\u4f8b\u903b\u8f91\u4e0a\u66f4\u6e05\u695a\u3002 class BaseCase(DfmAssert):\npass\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\nself.assert_file_exists_in_desktop(\"xxx\")\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u903b\u8f91\u4e3e\u4f8b","text":"\u7528\u4f8b\u4ee3\u7801\u8c03\u7528\u903b\u8f91\u4e3e\u4f8b\uff1a # BaseWidget\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n# =============================================\n# TitleWidget\nclass TitleWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_title_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# RightViewWidget\nclass RightViewWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_right_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# =============================================\n# \u51fa\u53e3 DfmWidget\nclass DfmWidget(TitleWidget, RightViewWidget):\npass\n# =============================================\n# in case\nfrom apps.dde_file_manager.widget.dfm_widget import DfmWidget\ndfm = DfmWidget()\ndfm.click_xxx_title_by_ui()\ndfm.click_xxx_right_by_ui()\ndfm.dog.print_desc()\ndfm.ui.print_number()\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u5de5\u7a0b\u6539\u9020\u5b9e\u65bd\u6b65\u9aa4","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_2","title":"1\u3001\u5de5\u7a0b\u4ee3\u7801\u62c9\u53d6","text":"1.1. \u5c06\u81ea\u52a8\u5316\u57fa\u7840\u6846\u67b6\u7684\u529f\u80fd\u62c9\u5230\u672c\u5730 Autotest Basic Frame \uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame 1.2. \u5c06\u5e94\u7528\u5e93\u4ee3\u7801\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u5e94\u7528\u5e93\u7684\u4ed3\u5e93\u547d\u540d\u5e94\u8be5\u662f\u957f\u8fd9\u6837\u7684 autotest_deepin_xxx\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_2","title":"2\u3001\u8c03\u6574\u5de5\u7a0b\u76ee\u5f55","text":"\u6309\u7167 \u65b9\u6848\u8bbe\u8ba1-\u76ee\u5f55\u7ed3\u6784 \u8fdb\u884c\u76ee\u5f55\u8c03\u6574\uff0c\u5c3d\u91cf\u4f7f\u7528\u7f16\u8f91\u5668\u8fdb\u884c\u76f8\u5e94\u7684\u8c03\u6574\uff0c\u7f16\u8f91\u5668\u63a8\u8350\u4f7f\u7528 Pycharm \uff0c\u4ee5\u4e0b\u64cd\u4f5c\u5747\u5728 Pycharm \u91cc\u9762\u53ef\u5b9e\u73b0\u3002 2.1. \u9700\u8981\u79fb\u52a8 py \u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u76f4\u63a5\u5728\u7f16\u8f91\u5668\u91cc\u9762\uff0c\u4f7f\u7528\u9f20\u6807\u9009\u4e2d\u5e76\u6309\u4f4f\uff0c\u4e4b\u540e\u62d6\u52a8\u5230\u76ee\u6807\u4f4d\u7f6e\u5373\u53ef\uff0cPycharm \u4f1a\u5c3d\u53ef\u80fd\u7684\u81ea\u52a8\u89e3\u51b3\u79fb\u52a8\u5bfc\u81f4\u7684\u8def\u5f84\u95ee\u9898\u3002\u6ce8\u610f\uff0c\u6211\u8bf4\u7684\u662f\u201c\u5c3d\u53ef\u80fd\u201d\uff0c\u6709\u4e9b\u9a9a\u64cd\u4f5c\u7f16\u8f91\u5668\u662f\u65e0\u6cd5\u81ea\u52a8\u5904\u7406\u7684\u3002\u5982\u679c\u6ca1\u6709\u88ab\u7f16\u8f91\u5668\u81ea\u52a8\u5904\u7406\u7684\u8def\u5f84\u95ee\u9898\uff0c\u540e\u7eed\u53ea\u80fd\u624b\u52a8\u89e3\u51b3\u3002 2.2. \u9700\u8981\u91cd\u547d\u540d\u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u5728\u7f16\u8f91\u5668\u91cc\u9762\u9009\u4e2d\u6587\u4ef6\uff0c\u7136\u540e\u4f7f\u7528\u5feb\u6377\u952e Shift + F6 \uff08\u5982\u679c\u5feb\u6377\u952e\u6ca1\u53cd\u5e94\uff0c\u6587\u4ef6\u53f3\u952e\u83dc\u5355 Refactor \u2014\u2014 Rename\uff09\uff0c\u7136\u540e\u5728\u8f93\u5165\u6846\u4e2d\u8f93\u5165\u8981\u91cd\u547d\u540d\u7684\u540d\u79f0\uff0c\u540c\u65f6\uff0c\u786e\u8ba4\u52fe\u9009 Search for references \u548c Search in comments and strings \u8fd9\u4e24\u4e2a\u9009\u9879\uff0c\u6700\u540e\u6309\u56de\u8f66\u6216\u8005\u9f20\u6807\u70b9 Refactor \u3002 \u6ce8\u610f\uff0c\u6b64\u65f6\u7f16\u8f91\u5668\u53ef\u80fd\u4f1a\u63d0\u793a\u4f60\uff0c\u4f60\u8fd9\u4e2a\u91cd\u547d\u540d\u7684\u64cd\u4f5c\u5173\u8054\u4e86\u591a\u4e2a\u6a21\u5757\uff0c\u5b83\u88ab\u591a\u4e2a\u5730\u65b9\u90fd\u4f7f\u7528\u5230\u4e86\uff0c\u76f8\u5173\u7684\u6a21\u5757\u662f\u5426\u4e5f\u4e00\u8d77\u6539\u540d\u4e86\uff0c\u8fd9\u4e0d\u5e9f\u8bdd\u5417\uff0c\u7528\u8fd9\u4e2a\u529f\u80fd\u5c31\u662f\u60f3\u628a\u5173\u8054\u5230\u7684\u90fd\u4fee\u6539\uff0c\u4e0d\u7136\u6211\u4e3a\u4ec0\u4e48\u4e0d\u7528\u6587\u7ba1\u7684\u91cd\u547d\u540d\u529f\u80fd\u5462\uff0c\u522b\u60f3\u4e86\uff0c\u76f4\u63a5\u70b9\u5de6\u4e0b\u89d2\u7684 Refactor \u6309\u94ae\uff0c\u5c31\u662f\u5e72\u3002 \u7c7b\u540d\u3001\u51fd\u6570\u540d\u7684\u91cd\u547d\u540d\u90fd\u5c3d\u91cf\u91c7\u7528\u8fd9\u79cd\u65b9\u6848\uff0c\u56e0\u4e3a\u7f16\u8f91\u5668\u4f1a\u81ea\u52a8\u7ed9\u6211\u4eec\u627e\u5230\u5173\u8054\u7684\u5730\u65b9\uff0c\u7136\u540e\u540c\u6b65\u4fee\u6539\u6389\u3002\u4f60\u53ef\u5343\u4e07\u522b\u76f4\u63a5\u5220\u4e86\u4fee\u6539\u540d\u79f0\uff0c\u4e0d\u7136\u4f60\u53ef\u80fd\u4f1a\u82b1\u4e0a\u4e00\u5929\u7684\u65f6\u95f4\u6765\u89e3\u51b3\u91cd\u547d\u540d\u7684\u95ee\u9898\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u5b9e\u73b0\u6838\u5fc3\u5e93\u63a5\u53e3","text":"3.1. BaseWidget \u5728 BaseWidget \u91cc\u9762\u628a\u8be5\u5199\u7684\u90fd\u5199\u597d\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u4e0a\u9762\u7684\u8bbe\u8ba1\u7406\u5ff5\u6765\u5199\u3002 \u5982\u679c\u4f60\u5acc\u9ebb\u70e6\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u6587\u7ba1\u7684\u5b9e\u9645\u5de5\u7a0b\u4ee3\u7801 autotest_dde_file_manager : https://gerrit.uniontech.com/admin/repos/autotest_dde_file_manager \u3002 3.2. \u64cd\u4f5c\u5c42 \u5982\u679c\u4f60\u662f\u65b0\u5199\u9879\u76ee\uff0c\u4f60\u4f1a\u53d1\u73b0\u4e00\u5207\u90fd\u662f\u90a3\u4e48\u7684\u7b80\u5355\u3001\u76f4\u63a5\uff0c\u6309\u7167\u6211\u4eec\u63d0\u4f9b\u7ed9\u4f60\u7684\u63a5\u53e3\u5199\u7528\u4f8b\u7684\u64cd\u4f5c\u65b9\u6cd5\u5c31\u597d\u4e86\u3002 \u5982\u679c\u4f60\u662f\u60f3\u5bf9\u539f\u6765\u7684\u5de5\u7a0b\u8fdb\u884c\u6539\u9020\uff0c\u4f60\u9700\u8981\u6309\u7167\u6838\u5fc3\u5e93\u65b9\u6cd5\u7684\u8c03\u7528\uff0c\u5c06\u4f60\u4e4b\u524d\u5199\u7684\u6bcf\u4e2a\u65b9\u6848\u8fdb\u884c\u5bf9\u5e94\u7684\u4fee\u6539\uff0c\u5305\u62ec\u7c7b\u548c\u65b9\u6cd5\u7684\u547d\u540d\u3001\u65b9\u6cd5\u5185\u6240\u8981\u7528\u5230\u4e0d\u540c\u5b9a\u4f4d\u65b9\u6cd5\u7684\u5199\u6cd5\u4fee\u6539\u3002 \u8fd9\u65f6\u5019\u4f60\u53ef\u80fd\u4f60\u7684\u4ee3\u7801\u4e2d\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u62a5\u9519\uff0c\u4e0d\u7528\u62c5\u5fc3\uff0c\u4f60\u53ef\u4ee5\u4ece\u4e1a\u52a1\u903b\u8f91\u51fa\u53d1\uff0c\u60f3\u6e05\u695a\u8fd9\u4e2a\u65b9\u6cd5\u662f\u5e72\u4ec0\u4e48\u7684\u3001\u64cd\u4f5c\u7684\u5bf9\u8c61\u662f\u4ec0\u4e48\u3001\u53c2\u6570\u662f\u4ec0\u4e48\uff0c\u6ce8\u610f\u8fd9\u4e9b\u4fee\u6539\u662f\u4f1a\u5f71\u54cd\u5230\u7528\u4f8b\u4ee3\u7801\u91cc\u9762\u7684\uff0c\u6ca1\u5173\u7cfb\uff0c\u7528\u4f8b\u91cc\u9762\u672c\u6765\u4e5f\u5e94\u8be5\u88ab\u5173\u8054\u4fee\u6539\u3002 3.3. \u628a\u914d\u7f6e\u6a21\u5757\u5199\u597d\uff0c\u8fd9\u90e8\u5206\u57fa\u672c\u53ef\u4ee5\u590d\u5236\u6587\u7ba1\u7684\u4ee3\u7801\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4_1","title":"4\u3001\u8def\u5f84\u5904\u7406","text":"4.1. \u5bfc\u5165\u8def\u5f84 \u65b9\u6cd5\u548c\u7528\u4f8b\u4e2d\u90fd\u4f1a\u6d89\u53ca\u5230\u5bfc\u5165\u8def\u5f84\u7684\u4fee\u6539\uff0c\u5728\u4fee\u6539\u8def\u5f84\u65f6\uff0c\u5efa\u8bae\u4f60\u4f7f\u7528 Ctrl + Shift + R \u5168\u5c40\u66ff\u6362\uff0c\u4f1a\u5c06\u6574\u4e2a\u9879\u76ee\u4e0b\u7684\u76f8\u540c\u5730\u65b9\u90fd\u4fee\u6539\u5230\uff0c\u5f53\u7136\uff0c\u4f60\u4e5f\u53ef\u4ee5\u5728\u5c0f\u5f39\u7a97\u4e2d\u4fee\u6539\u5168\u5c40\u66ff\u6362\u4e3a\u5c40\u90e8\u76ee\u5f55\u4e0b\u66ff\u6362\u3002\u5904\u7406\u90a3\u79cd\u6ca1\u6709\u5173\u8054\u5173\u7cfb\uff0c\u4f46\u662f\u53c8\u662f\u76f8\u540c\u540d\u79f0\u7684\u91cd\u547d\u540d\uff0c\u6211\u4e5f\u63a8\u8350\u4f7f\u7528\u8fd9\u79cd\u65b9\u5f0f\u8fdb\u884c\u91cd\u547d\u540d\u3002 \u6ce8\u610f\uff0c\u5168\u5c40\u66ff\u6362\u7684\u65b9\u5f0f\u4efb\u7136\u65e0\u6cd5\u4fdd\u8bc1\u771f\u7684\u5168\u5c40\u88ab\u66ff\u6362\u4e86\uff08\u53ef\u80fd\u662f\u7f16\u8f91\u5668\u7684 Bug \u5427\uff09\uff0c\u6240\u4ee5\u4f60\u4ecd\u7136\u9700\u8981\u624b\u52a8\u770b\u4e0b\u5404\u5904\u662f\u5426\u4fee\u6539\u5230\u4f4d\u3002 4.2. \u8d44\u6e90\u8def\u5f84 \u4e00\u4e9b\u7528\u4f8b\u8d44\u6e90\u9700\u8981\u6839\u636e config.py \u91cc\u9762\u7684\u8def\u5f84\u914d\u7f6e\u8fdb\u884c\u8d44\u6e90\u8def\u5f84\u7684\u62fc\u63a5\uff0c\u5982\u679c\u4f60\u539f\u6765\u672c\u6765\u5c31\u6709\u4e00\u4e2a\u51fd\u6570\u4e13\u95e8\u7528\u4e8e\u7ec4\u88c5\u8def\u5f84\u7684\uff0c\u90a3\u4f60\u53ea\u9700\u8981\u4fee\u6539\u8fd9\u4e00\u4e2a\u5730\u65b9\u5c31\u597d\u4e86\uff0c\u5982\u679c\u4f60\u4e4b\u524d\u5e76\u6ca1\u6709\u8fd9\u6837\u7684\u8bbe\u8ba1\uff0c\u90a3\u53ef\u80fd\u9700\u8981\u4fee\u6539\u5927\u91cf\u6d89\u53ca\u5230\u8d44\u6e90\u8def\u5f84\u7684\u5730\u65b9\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5","title":"5\u3001\u8c03\u8bd5\u548c\u7f16\u5199\u7528\u4f8b","text":"\u4ee5\u4e0a\u51e0\u4e2a\u6b65\u9aa4\u505a\u5b8c\uff0c\u57fa\u672c\u5c31\u53ef\u4ee5\u8fdb\u884c\u7528\u4f8b\u4ee3\u7801\u7684\u8c03\u8bd5\u4e86\uff0c\u8fd9\u90e8\u5206\u5de5\u4f5c\u4e3b\u8981\u89e3\u51b3\u4f60\u4e4b\u524d\u51e0\u4e2a\u6b65\u9aa4\u9057\u6f0f\u7684\u95ee\u9898\uff0c\u5982\u679c\u6240\u6709\u7528\u4f8b\u90fd\u8c03\u8bd5\u901a\u8fc7\u4e86\uff0c\u90a3\u4e48\u5de5\u7a0b\u6539\u9020\u5c31\u5168\u90e8\u5b8c\u6210\u4e86\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/","title":"AT \u5f00\u53d1\u89c4\u8303","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u5f00\u53d1\u89c4\u8303\u662f\u6839\u636e\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fd0\u884c\u4e24\u5e74\u591a\u6765\uff0c\u9047\u5230\u95ee\u9898\u89e3\u51b3\u95ee\u9898\u800c\u5f62\u6210\u7684\u4e00\u4e9b\u89e3\u51b3\u65b9\u6848\uff0c\u6216\u8005\u8bf4\u7ecf\u9a8c\u603b\u7ed3\uff1b\u8fd9\u4e9b\u7ecf\u9a8c\u7b26\u5408\u6211\u4eec\u73b0\u9636\u6bb5 AT \u6240\u5e94\u7528\u7684\u573a\u666f\u9700\u8981\uff0c\u4e5f\u662f\u6211\u4eec\u7ecf\u8fc7\u957f\u671f\u601d\u8003\uff0c\u4e0d\u65ad\u8bd5\u9519\u4e0d\u65ad\u4fee\u6b63\uff0c\u5e76\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u5b9e\u8df5\u4e2d\u68c0\u9a8c\u8fc7\u53ef\u884c\u7684\u3002\u4ee5\u6b64\uff0c\u5e0c\u671b\u80fd\u5e2e\u52a9\u53c2\u4e0e\u5230\u81ea\u52a8\u5316\u7684\u76f8\u5173\u4eba\u5458\u51cf\u5c11\u8bd5\u9519\u6210\u672c\uff0c\u66f4\u597d\u3001\u66f4\u5feb\u7684\u7f16\u5199\u7528\u4f8b\u53ca\u7ef4\u62a4\u7528\u4f8b\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_1","title":"\u4e00\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u89c4\u8303","text":"\u6807\u7b7e\u5316\u7ba1\u7406\u6587\u6863\u8bf7\u53c2\u8003\uff1a \u300a\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u64cd\u4f5c\u6307\u5f15\u300b \u4ee5\u4e0b\u8bf4\u51e0\u4e2a\u5bb9\u6613\u51fa\u73b0\u7684\u95ee\u9898\uff1a"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1","title":"1. \u5bf9\u5e94\u5173\u7cfb","text":" \u5199\u5b8c\u81ea\u52a8\u5316\u7528\u4f8b\u4e4b\u540e\uff0c\u8bf7\u5728 CSV \u6587\u4ef6\u4e2d\u6807\u8bb0\u7528\u4f8b\u7684 ID\u3001\u7b49\u7ea7\u3002\u4e3a\u4e86\u63d0\u9192\u6807\u8bb0\uff0c\u6267\u884c\u7528\u4f8b\u65f6\u5728\u9996\u884c\u4f1a\u8f93\u51fa ERROR \u65e5\u5fd7\uff1a CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94\u7684 ID\uff1b \u5728\u6700\u7ec8\u63d0\u4ea4\u4ee3\u7801\u4e4b\u524d\uff0c\u4f60\u9700\u8981\u5728 CSV \u6587\u4ef6\u91cc\u9762\u5c06ID\u3001\u7528\u4f8b\u7b49\u7ea7\u7b49\u6807\u7b7e\u8865\u5168\uff0c\u5982\u679c CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94 ID\uff0c\u540e\u7eed\u5728\u6279\u91cf\u6267\u884c\u7684\u65f6\u5019\uff0c\u8fd9\u4e9b\u7528\u4f8b\u662f\u4e0d\u4f1a\u6267\u884c\u7684\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2","title":"2. \u540d\u79f0\u4e00\u81f4","text":" CSV \u6587\u4ef6\u7684\u6587\u4ef6\u540d\u3001\u7528\u4f8b\u51fd\u6570\u4e2d\u95f4\u7684\u540d\u79f0\u4e00\u81f4\u3001\u7528\u4f8b py \u6587\u4ef6\u4e2d\u95f4\u7684\u540d\u79f0\uff0c\u8fd9\u4e09\u4e2a\u540d\u79f0\u4e00\u81f4\u3002 \u4e3e\u4f8b\uff1a # test_music_001.py\ndef test_music_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u90a3\u4e48 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e3a music.csv\u3002 AT \u6846\u67b6\u5e95\u5c42\u4ee3\u7801\u5b9e\u73b0\u662f\u5c06 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e0e\u7528\u4f8b\u51fd\u6570\u540d\u79f0\u540d\u79f0\uff08item.name\uff09\u8fdb\u884c\u5bf9\u5e94\uff0c\u56e0\u6b64\uff0c\u6ce8\u610f CSV \u6587\u4ef6\u540d\u79f0\u5bf9\u5e94\u7684\u662f\u7528\u4f8b\u51fd\u6570\u540d\u79f0\uff0c\u5373 def test_music_001 \u91cc\u9762\u7684 music \uff0c\u800c\u4e0d\u662f test_music_001.py \u91cc\u9762\u7684 music \u3002 \u8fd9\u91cc\u7ec6\u7ec6\u54c1\u4e00\u4e0b\u54c8~ \u5982\u679c\u4f60\u5c06\u4e0a\u4f8b\u5199\u6210\u4e86\u8fd9\u6837: # test_music_001.py\ndef test_movie_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u7528\u4f8b\u6267\u884c\u6ca1\u95ee\u9898\uff0c\u4f46\u662f\u6807\u7b7e\u5316\u7ba1\u7406\u662f\u4e0d\u751f\u6548\u7684\uff0c\u6846\u67b6\u65e0\u6cd5\u5c06 music.csv\u6587\u4ef6\u91cc\u9762\u6807\u7b7e\uff0c\u6dfb\u52a0\u5230 test_movie_001\u8fd9\u4e2a\u7528\u4f8b\u4e2d\uff0c\u56e0\u4e3a\u4ed6\u4eec\u6ca1\u6709\u5bf9\u5e94\u5173\u7cfb\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#tag","title":"\u4e8c\u3001\u5206\u652f\u53ca tag \u7ba1\u7406\u89c4\u8303","text":"\u53c2\u8003\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u4ee3\u7801\u7ba1\u7406\u89c4\u8303\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2-tag","title":"2. \u5e94\u7528\u5e93 tag","text":" \u5e94\u7528\u5e93 tag \u6839\u636e\u5e94\u7528\u4ea4\u4ed8\u8282\u70b9\u751f\u6210\uff0c\u6bcf\u6b21\u6253 tag \u4e4b\u524d\uff0c\u76f8\u5173\u6d4b\u8bd5\u4eba\u5458\u9700\u8981\u8fdb\u884c\u7528\u4f8b\u8c03\u8bd5\uff1b \u8c03\u8bd5\u7528\u4f8b\u662f\u6307\u7684\u5728\u5168\u67b6\u6784\uff08x86\u3001arm\u3001mips\uff09\u4e0a\u8c03\u8bd5\u901a\u8fc7\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\u8fbe\u5230 90% \u4ee5\u4e0a\u624d\u80fd\u6253 tag\uff0c\u901a\u8fc7 Jenkins \u6267\u884c\u5668\u6267\u884c\u7528\u4f8b\uff0c\u4fdd\u7559\u901a\u8fc7\u7387\u7ed3\u679c\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\uff1a\u901a\u8fc7\u7528\u4f8b\u6570 / (\u603b\u7528\u4f8b\u6570 - \u5df2\u5e9f\u5f03\u7528\u4f8b) \u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u7b97\u901a\u8fc7 Jenkins \u6267\u884c\u5668 \u4f60\u53ef\u80fd\u4f1a\u5728\u4e00\u4e2a\u4ea4\u4ed8\u5468\u671f\u5185\u6301\u7eed\u7684\u8fdb\u884cAT\u7528\u4f8b\u8c03\u8bd5\uff0c\u4f46\u662f\u6700\u7ec8 AT \u7528\u4f8b\u6253 tag \u7684\u5e94\u7528\u7248\u672c\uff0c\u9700\u8981\u4f7f\u7528\u5e94\u7528\u96c6\u6210\u4ea4\u4ed8\u7684\u6700\u65b0\u5e94\u7528\u7248\u672c\uff0c\u53ef\u4ee5\u4f7f\u7528\u5e94\u7528\u7684\u63d0\u6d4b\u7248\u672c\uff1b\u4e00\u5b9a\u8981\u786e\u4fdd\u8c03\u8bd5\u7528\u4f8b\u7684\u5e94\u7528\u7248\u672c\u662f\u6700\u65b0\u7684\uff0c\u4e0d\u7136\u96c6\u6210\u8fdb\u53bb\u4e4b\u540e\uff0c\u6301\u7eed\u96c6\u6210\u5c31\u4f1a\u51fa\u95ee\u9898\uff1b tag \u53f7\u600e\u4e48\u6253\uff1f \u6839\u636e\u6301\u7eed\u96c6\u6210\u7684\u8981\u6c42\u751f\u6210\uff0c\u5176\u4e2d\u5e94\u7528\u7248\u672c\u53f7\u9700\u8981\u4e0e\u9879\u76ee\u7ecf\u7406\u786e\u8ba4\u672c\u6b21\u5373\u5c06\u96c6\u6210\u7684\u5e94\u7528\u7248\u672c\u53f7\u662f\u591a\u5c11\uff1b tag \u7684 commit \u4fe1\u606f\u683c\u5f0f\uff1a # commit msg\nversion:5.6.5\n \u5176\u4e2d 5.6.5 \u5199\u5e94\u7528\u7684\u96c6\u6210\u7248\u672c\u53f7\u3002 \u751f\u6210 tag \u7684\u547d\u4ee4\u53c2\u8003\uff1a\u300aGit \u6807\u7b7e\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3-tag","title":"3. \u57fa\u7840\u6846\u67b6 tag","text":"\u57fa\u7840\u6846\u67b6 tag \u4e0d\u4e0e\u4e1a\u52a1\u6302\u94a9\uff0c\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u6309\u9700\u53d1\u5e03\u7248\u672c\uff0c\u5728\u6839\u76ee\u5f55\u4e0b CURRENT \u6587\u4ef6\u4e2d\u8bb0\u5f55\u7684\u5f53\u524d\u7248\u672c\u53f7\u548c\u5386\u53f2\u7248\u672c\u53f7\uff0c\u53ca\u5176\u5bf9\u5e94\u65b0\u589e\u4e86\u54ea\u4e9b\u529f\u80fd\uff0c\u6709\u52a9\u4e8e\u5e94\u7528\u9009\u62e9\u5408\u9002\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\u3002 # CURRENT\n[current]\ntag = 0.9.5\n \u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u7684 control \u6587\u4ef6\u8bb0\u5f55\u5f53\u524d\u5e94\u7528\u5e93\u4f9d\u8d56\u7684\u57fa\u7840\u5e93\u7248\u672c\u3002 # control\n[Depends]\nautotest-basic-frame = 0.9.5\n \u7528\u4f8b\u5728\u6267\u884c\u65f6\u4f1a\u6821\u9a8c\u4e24\u4e2a\u6587\u4ef6\u7684\u7248\u672c\u53f7\u662f\u5426\u4e00\u81f4\uff0c\u5982\u679c\u4e0d\u4e00\u81f4\uff0c\u4f1a\u6253\u5370 error \u65e5\u5fd7\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_2","title":"\u4e09\u3001\u4ed3\u5e93\u6743\u9650\u7ba1\u7406","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_1","title":"1. \u57fa\u7840\u6846\u67b6","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u4ed3\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame \u57fa\u7840\u6846\u67b6\u4e0d\u5141\u8bb8\u533f\u540d\u8bbf\u95ee\uff0c\u5982\u679c\u4f60\u767b\u5f55 gerrit \u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u8bbf\u95ee\u4ee5\u4e0a\u94fe\u63a5\uff0c\u5219\u9700\u8981\u7533\u8bf7\u8bbf\u95ee\u6743\u9650\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_1","title":"2. \u5e94\u7528\u4ed3\u5e93","text":" \u81ea\u52a8\u5316\u5e94\u7528\u4ed3\u5e93\uff1a https://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684 app_name \u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_3","title":"\u56db\u3001\u65b9\u6cd5\u7f16\u5199&\u8c03\u7528\u89c4\u8303","text":"\u65b9\u6cd5\u7f16\u5199\u6574\u4f53\u8bbe\u8ba1\u601d\u8def\u53c2\u8003\uff1a[\u300aAT\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b]"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_2","title":"1. \u65b9\u6cd5\u7f16\u5199","text":"\u5199\u65b9\u6cd5\u7684\u65f6\u5019\u6ce8\u610f\u65b9\u6cd5\u5f52\u5c5e\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget\uff0c\u65b9\u6cd5\u662f\u5728\u54ea\u4e2a\u533a\u57df\u64cd\u4f5c\u7684\uff0c\u5c31\u5199\u5728\u54ea\u4e2a\u7c7b\u91cc\u9762\u3002 \u4e3e\u4f8b\uff1a from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n\"\"\"\u70b9\u51fb\u6807\u9898\u680fxxx\"\"\"\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_2","title":"2. \u65b9\u6cd5\u8c03\u7528","text":" \u5728\u7528\u4f8b\u4e2d\u8c03\u7528\u65b9\u6cd5\uff0c\u901a\u8fc7\u8be5\u5e94\u7528\u552f\u4e00\u7684\u51fa\u53e3\u8fdb\u884c\u8c03\u7528\uff0c\u6bd4\u5982\u6587\u7ba1\uff1a class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n \u4e0d\u8981\u5728\u7528\u4f8b\u4e2d\u5355\u72ec\u53bb\u8c03\u7528 TitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u8fd9\u4e9b\u7c7b\uff0c\u5426\u5219\u540e\u671f\u7528\u4f8b\u4f1a\u53d8\u5f97\u4e0d\u597d\u7ef4\u62a4\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_4","title":"\u4e94\u3001\u7528\u4f8b\u7f16\u5199\u89c4\u8303","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_3","title":"1. \u57fa\u4e8e\u7c7b\u5199\u7528\u4f8b","text":"\u6240\u6709\u7528\u4f8b\u90fd\u5e94\u8be5\u57fa\u4e8e\u7c7b\u53bb\u5199\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001(self):\n\"\"\"\u97f3\u4e50\u542f\u52a8\"\"\"\n \u6ce8\u610f\u4ee5\u4e0b\u51e0\u70b9\uff1a \u7c7b\u540d\u4e0d\u8981\u968f\u4fbf\u53d6\uff0c\u540c\u4e00\u4e2a\u5e94\u7528\u5e94\u8be5\u4f7f\u7528\u540c\u4e00\u4e2a\u7c7b\u540d\uff0c\u7528\u4f8b\u7c7b\u540d\u79f0\u5fc5\u987b\u4ee5 Test \u5f00\u5934\uff0c\u9075\u5faa\u5927\u9a7c\u5cf0\u547d\u540d\u89c4\u8303\uff1b \u7528\u4f8b\u7c7b\u7ee7\u627f BaseCase\uff0c\u4e00\u4e2a\u5e94\u7528\u53ea\u6709\u4e00\u4e2a BaseCase \u4e00\u4e2a py \u6587\u4ef6\u91cc\u9762\u53ea\u6709\u4e00\u4e2a\u7c7b\uff0c\u6211\u4eec\u79f0\u4e3a\u4e00\u4e2a\u6d4b\u8bd5\u7c7b\uff1b \u4e00\u4e2a\u7c7b\u91cc\u9762\u53ef\u4ee5\u6709\u591a\u4e2a\u7528\u4f8b\u51fd\u6570\uff0c\u8fd9\u53d6\u51b3\u8fd9\u6761\u7528\u4f8b\u6709\u591a\u5c11\u4e2a\u6d4b\u8bd5\u70b9\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001_1(self):\n\"\"\"\u4efb\u52a1\u680f\u542f\u52a8\u97f3\u4e50\"\"\"\ndef test_music_001_2(self):\n\"\"\"\u542f\u52a8\u5668\u542f\u52a8\u97f3\u4e50\"\"\" \ndef test_music_001_3(self):\n\"\"\"\u684c\u9762\u542f\u52a8\u97f3\u4e50\"\"\"\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_3","title":"2. \u7528\u4f8b\u51fd\u6570\u89c4\u8303","text":" \u7528\u4f8b\u51fd\u6570\u4ee5 test \u5f00\u5934\uff0c\u9075\u5faa\u86c7\u5f62\u547d\u540d\u89c4\u8303\uff0c\u4e2d\u95f4\u4e3a\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0\uff0c\u540e\u9762\u52a0\u7528\u4f8b ID\uff0c\u6700\u540e\u52a0\u6d4b\u8bd5\u70b9\u5e8f\u53f7\uff0c\u5373 test_${module}_${case_id}[_${index}] \uff1b \u6bd4\u5982\uff1atest_music_001_1\uff0cindex \u4ece 1 \u5f00\u59cb\u3002 \u51fd\u6570\u529f\u80fd\u8bf4\u660e\u91cc\u9762\u5199\u7528\u4f8b\u6807\u9898\uff0c\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u6807\u9898\u5373\u53ef\uff0c\u6ce8\u610f\u7528\u4e09\u5bf9\u53cc\u5f15\u53f7\uff0c\u4e0d\u8981\u7528\u5176\u4ed6\u6ce8\u91ca\uff0c\u66f4\u4e0d\u8981\u7528\u4e95\u53f7\u6ce8\u91ca\u5199\u7528\u4f8b\u6807\u9898\uff1b \u76f4\u63a5\u590d\u5236 PMS \u7528\u4f8b \u7528\u4f8b\u6b65\u9aa4\u76f4\u63a5\u5c06 PMS \u4e0a\u7528\u4f8b\u6b65\u9aa4\u548c\u9884\u671f\u590d\u5236\u8fdb\u6765\uff0c\u7136\u540e\u8fdb\u884c\u6279\u91cf\u6ce8\u91ca\uff08ctrl + /\uff09\uff0c\u5728\u6ce8\u91ca\u7684\u57fa\u7840\u4e0a\u53bb\u5199\u7528\u4f8b\u811a\u672c\u4f1a\u66f4\u52a0\u65b9\u4fbf\u5168\u9762\uff0c\u4e5f\u6bd4\u4f60\u81ea\u5df1\u5199\u6ce8\u91ca\u66f4\u8282\u7ea6\u65f6\u95f4\uff1a \u4e3e\u4f8b\uff0cPMS \u7528\u4f8b\uff1a \u76f4\u63a5\u9009\u4e2d\u7528\u4f8b\u5185\u5bb9\uff0c\u590d\u5236\u4e0b\u6765\uff0c\u7136\u540e\u7c98\u8d34\u5230\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c\u4e2d\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\n \u4e0a\u4f8b\u4e2d\u4e95\u53f7\u6ce8\u91ca\u90e8\u5206\u5c31\u662f\u76f4\u63a5\u4ece PMS \u4e0a\u590d\u5236\u8fc7\u6765\u7684\uff0c\u5728\u6b64\u57fa\u7840\u4e0a\u5199\u7528\u4f8b\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\nmusic = DeepinMusicWidget()\nmusic.click_singer_btn_in_music_by_ui()\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\nmusic.click_icon_mode_in_music_by_ui()\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\nmusic.double_click_first_singer_in_singer_icon_view_by_ui()\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\nself.assert_xxx\n \u4f60\u770b\uff0c\u975e\u5e38\u6e05\u695a\u6bcf\u4e00\u6b65\u5728\u505a\u4ec0\u4e48\uff0c\u91cd\u70b9\u662f\u7701\u53bb\u4e86\u5199\u6ce8\u91ca\u7684\u65f6\u95f4\uff0c\u771f\u7684\u7092\u9e21\u65b9\u4fbf\u3002 \u4e0d\u5199 if __name__ == '__main__':\uff0c\u4e0d\u5199\u591a\u4f59\u7684\u4ee3\u7801\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3","title":"3. \u6570\u636e\u9a71\u52a8","text":" \u5982\u679c\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u662f\u76f8\u540c\u7684\uff0c\u53ea\u662f\u4e00\u4e9b\u53c2\u6570\u53d8\u5316\uff0c\u5c3d\u91cf\u4f7f\u7528\u6570\u636e\u9a71\u52a8\u6765\u5b9e\u73b0\u7528\u4f8b\uff1b \u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u6570\u636e\u9a71\u52a8\u7684\u6570\u636e\uff0c\u4e0d\u80fd\u56e0\u6b64\u5f15\u5165\u4f9d\u8d56\uff0c\u5c3d\u91cf\u4f7f\u7528\u4e00\u4e9b\u6807\u51c6\u5e93\u80fd\u8bfb\u53d6\u7684\u6587\u4ef6\u683c\u5f0f\uff0c\u6bd4\u5982 json\u3001ini\u3001CSV\u3001xml\u3001txt \u7b49\u6587\u4ef6\u683c\u5f0f\uff1b\u4e0d\u5efa\u8bae\u4f7f\u7528 Yaml\u3001Excel\u3001MySQL \u7b49\u6570\u636e\u683c\u5f0f\uff1b \u8bfb\u53d6\u6570\u636e\u65f6\u4e5f\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff0c\u5982\u4f7f\u7528 pandas \u5904\u7406 CSV \u5c31\u5c5e\u4e8e\u5927\u6750\u5c0f\u7528\u4e86\uff0c\u6b63\u5e38\u7684\u6570\u636e\u9a71\u52a8\u8fd8\u6ca1\u5230\u9700\u8981\u5927\u6570\u636e\u5206\u6790\u6765\u5904\u7406\u7684\u5730\u6b65\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u5728 widget/ddt/ \u76ee\u5f55\u4e0b\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5199\u6cd5\uff1a @pytest.mark.parametrize(\"value\", data)\ndef test_smb_049(self, value):\n \u4ee5\u4e0a\u8fd9\u79cd\u53c2\u6570\u5316\u7684\u5199\u6cd5\u672c\u8eab\u6ca1\u4ec0\u4e48\u95ee\u9898\uff0c\u4f46\u662f\uff0c\u8fd9\u91cc\u5fc5\u987b\u8981\u8865\u5145\u4e00\u4e2a\u6ca1\u6709\u7528\u7684\u5c0f\u77e5\u8bc6\uff1a \u5982\u679c\u53c2\u6570\u5316\u6570\u636e\u91cc\u9762\u7684\u5b57\u7b26\u4f1a\u539f\u5c01\u4e0d\u52a8\u7684\u8f93\u51fa\u5230 item.name \u91cc\u9762\uff0c\u663e\u793a\u975e\u5e38\u4e0d\u4f18\u96c5\uff0c\u800c\u4e14\u53ef\u4ee5\u4f1a\u5f15\u5165\u4e00\u4e9b\u610f\u60f3\u4e0d\u5230\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u611f\u53d7\u4e00\u4e0b\uff1a \u53c2\u6570\uff1a data = [\n\"\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\", \"qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678\",\n]\n \u73b0\u8c61\u662f\u8fd9\u6837\u8272\u513f\u7684\uff1a test_smb_049.py::TestFileManager::test_smb_049[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09]\ntest_smb_049.py::TestFileManager::test_smb_049[qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui]\ntest_smb_049.py::TestFileManager::test_smb_049[12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678]\n \u8bf4\u5b9e\u8bdd\uff0c\u770b\u7740\u5fc3\u91cc\u5835\u5f97\u614c\uff0c\u5982\u679c\u8fd9\u91cc\u9762\u5305\u542b\u4e00\u4e9b\u7279\u6b8a\u5b57\u7b26\u6216\u8005\u662f\u8d85\u957f\uff0c\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u5f88\u5947\u5999\u7684\u4e8b\u60c5\u53d1\u751f\u3002 parametrize \u91cc\u9762\u6709\u4e2a\u53c2\u6570\uff1aids\uff0c\u53ef\u4ee5\u89e3\u51b3\u6b64\u7c7b\u95ee\u9898\uff0c\u5c31\u50cf\u8fd9\u6837\uff1a @pytest.mark.parametrize(\"value\", data, ids=[1, 2, 3])\ndef test_smb_049(self, value):\n \u518d\u6765\u611f\u53d7\u4e00\u4e0b\uff1a test_smb_049.py::TestFileManager::test_smb_049[1]\ntest_smb_049.py::TestFileManager::test_smb_049[2]\ntest_smb_049.py::TestFileManager::test_smb_049[3]\n \u660e\u663e\u597d\u591a\u4e86\uff0c\u6240\u4ee5\u5c3d\u91cf\u4f7f\u7528 ids \u8fd9\u4e2a\u53c2\u6570\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 fixture \u7684\u6570\u636e\u9a71\u52a8\u65b9\u5f0f\uff0c\u6846\u67b6\u867d\u7136\u652f\u6301\uff0c\u4f46\u53ef\u8bfb\u6027\u6bd4\u8f83\u5dee\uff1b\u5982\u679c\u4f60\u4e0d\u77e5\u9053\u8fd9\u53e5\u8bdd\u5728\u8bf4\u5565\uff0c\u90a3\u4f60\u53ef\u4ee5\u5ffd\u7565\uff0c\u6211\u4e5f\u4e0d\u6253\u7b97\u8be6\u7ec6\u8bf4\u8fd9\u79cd\u5b9e\u73b0\u65b9\u5f0f\uff0c\u64cd\u4f5c\u6bd4\u8f83\u9a9a\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4","title":"4. \u65ad\u8a00\u8d44\u6e90","text":" \u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u76f4\u63a5\u653e\u5728\u7528\u4f8b\u6a21\u5757\u7684\u540c\u7ea7\u76ee\u5f55\u4e0b\u7684 assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0 + \u7528\u4f8b ID \u547d\u540d\uff1b \u56fe\u50cf\u8bc6\u522b\u65ad\u8a00\uff0c\u4e0d\u8981\u622a\u53d6\u4e00\u5f20\u5f88\u5927\u7684\u56fe\uff0c\u56fe\u7247\u8d44\u6e90\u5305\u542b\u7684\u5143\u7d20\u592a\u591a\u4e86\uff0c\u975e\u5e38\u5bb9\u6613\u53d7\u5230\u9700\u6c42\u5f71\u54cd\uff0c\u5efa\u8bae\u662f\u8fdb\u884c\u5c40\u90e8\u7684\u65ad\u8a00\uff1b \u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u5339\u914d\u5ea6\u662f 0.9\uff0c\u5982\u679c\u65ad\u8a00\u7684\u573a\u666f\u5bf9\u4e8e\u7cbe\u786e\u5ea6\u8981\u6c42\u6ca1\u90a3\u4e48\u9ad8\uff0c\u53ef\u4ee5\u5728\u65ad\u8a00\u8bed\u53e5\u91cc\u9762\u4f20\u5165\u5c0f\u4e8e 0.9 \u7684\u53c2\u6570\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5","title":"5. \u5143\u7d20\u5b9a\u4f4d","text":" \u7528\u4e8e\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u4e2d\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u547d\u540d\u4e3a\u8be5\u5143\u7d20\u7684\u540d\u79f0\uff1b \u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u622a\u53d6\u65f6\u5c3d\u91cf\u7cbe\u786e\u5230\u8fd9\u4e2a\u5177\u4f53\u7684\u6309\u94ae\uff0c\u56fe\u7247\u4e5f\u4e0d\u8981\u592a\u5927\uff1b \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u64cd\u4f5c\u8f83\u5feb\uff0c\u5408\u7406\u52a0\u5165\u7b49\u5f85\u65f6\u95f4\u80fd\u63d0\u9ad8\u7528\u4f8b\u7684\u7a33\u5b9a\u6027\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6","title":"6. \u7528\u4f8b\u8d44\u6e90","text":" \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u4f7f\u7528\u5230\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u6bd4\u5982\u97f3\u4e50\u53ef\u80fd\u9700\u8981\u4e00\u4e9b mp3 \u7684\u8d44\u6e90\u7528\u4e8e\u6d4b\u8bd5\uff0c\u5b58\u653e\u5728 widget/case_res \u76ee\u5f55\u4e0b\uff0c\u524d\u63d0\u662f\u8fd9\u4e9b\u8d44\u6e90\u4e0d\u8d85\u8fc7 10M\uff1b \u5982\u679c\u662f\u4e00\u4e9b\u6bd4\u8f83\u5927\u7684\u8d44\u6e90\uff0c\u5efa\u8bae\u653e\u5230\u7edf\u4e00\u7684 ftp \u670d\u52a1\u5668 \uff08ftp://10.8.10.245\uff09\uff0c\u9700\u8981\u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\u518d\u4e0b\u8f7d\u4e0b\u6765\uff1b f\"wget ftp://{Config.FTP_IP}/uploads/\u591a\u5a92\u4f53/\u5f71\u9662/auto/{file_name};unzip {file_name};rm -rf {file_name};\"\n \u6d4b\u8bd5\u8d44\u6e90\u4e0b\u8f7d\u5230\u5e94\u7528 widget/case_res \u76ee\u5f55\u4e0b\uff1b \u7981\u6b62\u5c06\u6d4b\u8bd5\u8d44\u6e90\u5b58\u653e\u5728\u4e2a\u4eba\u7684\u673a\u5668\u4e0a\uff1b \u5e94\u8be5\u5c3d\u91cf\u4fdd\u8bc1\uff0c\u4e00\u4e2a\u8d44\u6e90\u5728\u4e00\u6b21\u7528\u4f8b\u6267\u884c\u4e2d\u53ea\u9700\u8981\u4e0b\u8f7d\u4e00\u6b21\uff0c\u6240\u4ee5\u4f60\u4e0d\u80fd\u6bcf\u6b21\u4f7f\u7528\u7684\u65f6\u5019\u90fd\u53bb\u4e0b\u8f7d\uff0c\u8fd9\u6837\u53ef\u80fd\u4f1a\u8017\u8d39\u5927\u91cf\u7684\u7f51\u7edc\u8d44\u6e90\uff0c\u800c\u56e0\u4e3a\u5148\u5224\u65ad\u672c\u5730\u662f\u5426\u5b58\u5728\u6b64\u8d44\u6e90\uff0c\u5982\u679c\u4e0d\u5b58\u5728\u518d\u53bb\u4e0b\u8f7d\uff1b \u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u5c06\u8d44\u6e90\u62f7\u8d1d\u5230\u5bf9\u5e94\u7684\u6d4b\u8bd5\u76ee\u5f55\u4e0b\uff0c\u6bd4\u5982\u5c06 mp3 \u6587\u4ef6\u62f7\u8d1d\u5230 ~/Music \u76ee\u5f55\u4e0b\uff0c\u4f46\u662f\u6211\u4eec\u66f4\u5efa\u8bae\u4f60\u4f7f\u7528\u53d1\u9001\u5feb\u6377\u94fe\u63a5\u7684\u65b9\u5f0f\u66ff\u4ee3\u62f7\u8d1d\u7684\u64cd\u4f5c\uff0c\u56e0\u4e3a\u5728\u62f7\u8d1d\u5927\u6587\u4ef6\u65f6\u662f\u5f88\u6d88\u8017\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u800c\u521b\u5efa\u94fe\u63a5\u5219\u4e0d\u4f1a\uff1b @classmethod\ndef recovery_many_movies_in_movie_by_cmd(cls):\n\"\"\"\u6062\u590d\u591a\u4e2a\u89c6\u9891\u6587\u4ef6\u81f3\u89c6\u9891\u76ee\u5f55\u4e2d\"\"\"\nwork_path = f\"/home/{Config.USERNAME}/Videos/auto\"\ncode_path = f\"{Config.CASE_RES_PATH}/auto\"\ncls.run_cmd(f\"rm -rf {work_path};mkdir {work_path}\")\nsleep(1)\nflag = False\nif not exists(code_path):\ncls.run_cmd(f\"mkdir -p {code_path}\")\nflag = True\nlogger.info(f\"ln -s {code_path}/* {work_path}/\")\ncls.run_cmd(\nf\"cd {code_path}/;\"\nf\"{cls.wget_file('auto.zip') if flag else ''}\"\nf\"ln -s {code_path}/* {work_path}/ > /dev/null 2>&1\"\n)\n \u8d44\u6e90\u4e0b\u8f7d\u8fc7\u7a0b\u4e2d\u6ce8\u610f\u8d85\u65f6\u7684\u95ee\u9898\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u5f88\u5927\uff0c\u8981\u7279\u522b\u6ce8\u610f\u8fd9\u95ee\u9898\uff0c\u5982\u679c\u4f60\u4f7f\u7528\u5f3a\u5236\u7b49\u5f85\u4e0b\u8f7d\u7ed3\u675f( os.system )\uff0c\u53ef\u80fd\u4f1a\u9020\u6210\u7528\u4f8b\u6267\u884c\u65f6\u957f\u53d8\u5f97\u4e0d\u53ef\u63a5\u53d7\uff0c\u76ee\u524d\u6211\u4eec\u53d1\u73b0\u5728\u6301\u7eed\u96c6\u6210\u73af\u5883\u6267\u884c\u65f6\u7f51\u7edc\u4e0b\u8f7d\u901f\u5ea6\u5f88\u6162\uff0c\u6240\u4ee5\u8d85\u65f6\u673a\u5236\u662f\u5f88\u6709\u5fc5\u8981\u7684\uff1brun_cmd \u65b9\u6cd5\u6709\u4e00\u4e2a\u9ed8\u8ba4\u8d85\u65f6\u7684\u65f6\u95f4\uff0c\u4f60\u53ef\u4ee5\u6839\u636e\u8d44\u6e90\u5927\u5c0f\u5bf9\u8d85\u65f6\u65f6\u95f4\u8fdb\u884c\u8c03\u6574\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_5","title":"\u516d\u3001\u7528\u4f8b\u8c03\u8bd5\u6280\u5de7","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_4","title":"1. \u65e5\u5fd7","text":" \u4e00\u5b9a\u8981\u5148\u770b\u62a5\u9519\uff0c\u770b error \u65e5\u5fd7\uff0c\u901a\u5e38\u80fd\u660e\u786e\u7684\u544a\u8bc9\u4f60\u5177\u4f53\u54ea\u91cc\u4ee3\u7801\u62a5\u9519\uff1b \u7ed3\u5408\u62a5\u9519\u70b9\u524d\u9762\u7684error\u3001 info \u548c debug \u65e5\u5fd7\u770b\u5426\u662f\u6b63\u5e38\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_4","title":"2. \u65ad\u70b9\u8c03\u8bd5","text":" \u65b9\u6cd5\u62a5\u9519\uff1a \u5728\u65b9\u6cd5\u5e93\u4e2d\u627e\u5230\u5bf9\u5e94\u7684\u65b9\u6cd5\uff0c\u5355\u72ec\u8c03\u7528\uff0c\u770b\u662f\u5426\u80fd\u6b63\u5e38\u6267\u884c\uff1b \u901a\u5e38\u5355\u4e2a\u65b9\u6cd5\u7684\u6267\u884c\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u62a5\u9519\uff0c\u5f88\u5feb\u5c31\u80fd\u6392\u67e5\u51fa\u95ee\u9898\uff1b\u5728\u65b9\u6cd5\u5185\u90e8\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u65b9\u6cd5\u5185\u90e8\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u8c03\u7528\u6ca1\u95ee\u9898\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u62a5\u9519\u7684\u65b9\u6cd5\u524d\u9762\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u7528\u4f8b\u7684\u4e1a\u52a1\u903b\u8f91\u548c\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u65ad\u8a00\u62a5\u9519\uff1a \u65ad\u8a00\u4e3a\u6570\u636e\u65ad\u8a00\uff0c\u6839\u636e\u8868\u8fbe\u5f0f\u8fdb\u884c\u65ad\u8a00\u8bed\u53e5\u8fdb\u884c\u4fee\u6539\uff1b \u6587\u4ef6\u751f\u6210\u7c7b\u65ad\u8a00\uff0c\u67e5\u770b\u662f\u5426\u9700\u8981\u52a0\u7b49\u5f85\u65f6\u95f4\uff1b \u56fe\u50cf\u65ad\u8a00\uff0c\u5728\u65ad\u8a00\u8bed\u53e5\u5904\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u7528\u4f8b\u8fd0\u884c\u5230\u65ad\u8a00\u5904\u4f1a\u505c\u6b62\uff0c\u67e5\u770b\u6b64\u65f6\u65ad\u8a00\u7684\u56fe\u7247\u4e0e\u7528\u4f8b\u6267\u884c\u7684\u73b0\u573a\u5b58\u5728\u4ec0\u4e48\u5dee\u5f02\uff0c\u6b64\u65f6\u4e5f\u53ef\u4ee5\u8fdb\u884c\u91cd\u65b0\u622a\u56fe\uff0c\u4ece\u800c\u66ff\u6362\u65b0\u7684\u56fe\u7247\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3_1","title":"3. \u8fdc\u7a0b\u6267\u884c","text":" \u8fdc\u7a0b\u6267\u884c\u6307\u7684\u662f\u7f16\u8f91\u5668\u901a\u8fc7\u6307\u5b9a\u8fdc\u7a0b\u89e3\u91ca\u5668\u6267\u884c\u81ea\u52a8\u5316\u4ee3\u7801\uff1b \u8fdc\u7a0b\u6267\u884c\u7684\u597d\u5904\u662f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u7684 Debug \u8fd0\u884c\uff0c\u4e0d\u7528\u5728\u6d4b\u8bd5\u673a\u4e0a\u6253\u5f00\u7f16\u8f91\u5668\uff0c\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u66f4\u5feb\uff1b \u652f\u6301\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u7684\u7f16\u8f91\u5668\uff1a \u4e13\u4e1a\u7248 Pycharm VScode \uff0c\u9700\u8981\u4f7f\u7528\u63d2\u4ef6 Remote-SSH \u8fdc\u7a0b\u6267\u884c\u914d\u7f6e \u4ee5 Pycharm \u4e3a\u4f8b\uff1a File \u2014> Settings \u2014> Project \u2014> Python Interpreter \u2014> \u53f3\u8fb9\u8bbe\u7f6e\u6309\u94ae \u2014> Add... \u2014> SSH Interpreter \u2014> New server configuration(\u586b\u5165host\u548cusername) \u2014> Next \u2014> password\uff08\u6d4b\u8bd5\u673a\u5bc6\u7801\uff09 \u2014> Interpreter(\u9009\u62e9\u8fdc\u7a0b\u89e3\u91ca\u5668) \u2014> Finish "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4_1","title":"4. \u73af\u5883\u6e05\u7406","text":" \u5982\u679c\u7528\u4f8b\u91cc\u9762\u7684 teardown \u6ca1\u6709\u6267\u884c\uff0c\u5927\u6982\u7387\u662f\u56e0\u4e3a setup \u91cc\u9762\u4ee3\u7801\u62a5\u9519\uff0c\u8fd9\u4e24\u4e2a\u662f\u4e00\u5bf9\u7684\uff0csetup \u91cc\u9762\u62a5\u9519\uff0cteardown \u91cc\u9762\u7684\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\uff1b \u76ee\u524d\u6211\u4eec\u5df2\u7ecf\u5c06\u5404\u5e94\u7528\u7684 clean_all \u8fd9\u4e2a fixture \u6539\u6210\u4e86\u7ec8\u7ed3\u5668\uff0c\u786e\u4fdd\u59cb\u7ec8\u80fd\u6267\u884c\u5230\u8fd9\u6b65\uff0c\u4f46\u662f\u7528\u4f8b\u91cc\u9762\u7684 fixture\uff0c\u8fd8\u662f\u9700\u8981\u6211\u4eec\u5c0f\u5fc3\u5904\u7406\uff1b \u8981\u6267\u884c clean_all \u9700\u8981\u5728\u7f16\u8f91\u5668\u8fd0\u884c\u53c2\u6570\u52a0 --clean yes\uff0c\u5199\u7528\u4f8b\u7684\u65f6\u5019\u8bf7\u52a0\u4e0a\uff0c\u4e0d\u7136\u4f60\u4e0d\u786e\u5b9a\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u7684\u73af\u5883\u662f\u5426\u6062\u590d\uff1b setup \u53ef\u4ee5\u4e0d\u8981\uff0c\u5c06 setup \u653e\u5230\u7528\u4f8b\u91cc\u9762\u662f\u4e00\u79cd\u7a33\u59a5\u7684\u505a\u6cd5\uff0cteardown \u4e00\u5b9a\u8981\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5_1","title":"5. \u5143\u7d20\u5b9a\u4f4d\u4e0d\u51c6\uff08\u5750\u6807\u8fd4\u56de\u4e0d\u5bf9\uff09","text":" \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u53ef\u80fd\u53d7\u5230\u7a97\u53e3 ID \u7684\u53d8\u5316\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u9ed8\u8ba4\u53d6\u6700\u65b0\u7684\u4e00\u4e2a\u7a97\u53e3\u7528\u4e8e\u5b9a\u4f4d\uff0c\u4f46\u5982\u679c\u5b9e\u9645\u9700\u8981\u5b9a\u4f4d\u7684\u4e0d\u662f\u6700\u65b0\u7684\u7a97\u53e3\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u91cd\u65b0\u5b9e\u4f8b\u5316\u65b9\u6cd5\u7c7b\u5bf9\u8c61\uff0c\u5e76\u5728\u7c7b\u4e2d\u4f20\u5165\u5bf9\u5e94\u7684\u7a97\u53e3\u5e8f\u53f7\uff1b \u57fa\u4e8e\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u76ee\u524d\u9047\u5230\u7684\u7b14\u8bb0\u672c\u4e0a\uff0c\u7531\u4e8e\u5c4f\u5e55\u7f29\u653e\u6bd4\u4f8b\u4e3a 1.25\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u6211\u4eec\u9ed8\u8ba4\u4f7f\u7528\u7f29\u653e\u6bd4\u4f8b\u4e3a 1\uff1b \u57fa\u4e8e\u56fe\u50cf\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u76ee\u6807\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b \u57fa\u4e8e OCR \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u6587\u5b57\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u540c\u6837\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6_1","title":"6. \u952e\u9f20\u64cd\u4f5c\u4e0d\u51c6","text":" \u9f20\u6807\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6bd4\u5982\u53f3\u952e\u3001\u53cc\u51fb\u65e0\u54cd\u5e94\uff1b \u952e\u76d8\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6216\u8005\u5ef6\u8fdf\u8f93\u5165\uff0c\u6bd4\u5982\u7528\u4f8b\u9700\u8981\u8f93\u5165\u201c\u6211\u662f\u4e2d\u56fd\u4eba\u201d\uff0c\u5b9e\u9645\u53ea\u8f93\u5165\u4e86\u201c\u6211\u56fd\u4eba\u201d\uff1b \u4ee5\u4e0a\u95ee\u9898\u6392\u9664\u5e94\u7528\u5361\u987f\u7b49\u95ee\u9898\uff0c\u5927\u6982\u7387\u662f\u7531\u4e8e\u5de5\u5177\u7684\u95ee\u9898\uff0c\u76ee\u524d\u952e\u9f20\u64cd\u4f5c\u6211\u4eec\u4f7f\u7528\u4e09\u4e2a\u5de5\u5177\uff1aDogtail \u63d0\u4f9b\u7684\u952e\u9f20\u5de5\u5177\u3001PyAutoGUI\u3001Xdotool \uff1b \u6709\u540c\u5b66\u53ef\u80fd\u8981\u8bf4\u4e3a\u5565\u8981\u7528\u4e09\u4e2a\u554a\uff0c\u7528\u4e00\u4e2a\u4e0d\u5c31\u597d\u4e86\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u5404\u6709\u4f18\u70b9\u5404\u6709\u7f3a\u70b9\u3002 \u5982\u679c\u4f60\u9047\u5230\u952e\u9f20\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u8bd5\u8bd5\u901a\u8fc7\u4e0d\u540c\u7684\u5de5\u5177\u64cd\u4f5c\uff1b\u952e\u76d8\u8f93\u5165\u5ef6\u8fdf\u7684\u95ee\u9898\uff0c\u4e00\u822c\u662f\u56e0\u4e3a\u8f93\u5165\u901f\u5ea6\u592a\u5feb\u4e86\uff0c\u7cfb\u7edf\u6ca1\u53cd\u5e94\u8fc7\u6765\uff0c\u5e38\u89c1\u4e8e ARM \u548c MIPS \u4e0a\uff0c\u4fee\u6539\u53c2\u6570 delay_time \u7684\u503c\uff0c\u5355\u4f4d\u4e3a\u6beb\u79d2\uff1b # mouse_key.py\n@classmethod\ndef input_message(cls, message, delay_time=300, interval=0.2):\n\"\"\"\n \u8f93\u5165\u5b57\u7b26\u4e32\n :param message: \u8f93\u5165\u7684\u5185\u5bb9\n :param delay_time: \u5ef6\u8fdf\u65f6\u95f4\n :param interval:\n :return:\n \"\"\"\n \u5982\u679c\u4e0d\u662f\u65b9\u6cd5\u7684\u95ee\u9898\uff0c\u5219\u9700\u8981\u7ee7\u7eed\u548c\u5f00\u53d1\u4e00\u8d77\u6392\u9664\uff0c\u662f\u5426\u4e3a\u5e94\u7528\u63a5\u53d7\u952e\u9f20\u4fe1\u53f7\u5904\u7406\u7684\u95ee\u9898\uff0c\u8fd9\u7c7b\u60c5\u51b5\u6211\u4eec\u4e5f\u662f\u9047\u5230\u8fc7\u7684\uff0c\u5177\u4f53\u95ee\u9898\u5177\u4f53\u5206\u6790\u3002 \u6bd4\u5982\u5f71\u9662\u5c31\u91cd\u5199\u4e86\u4e00\u4e2a\u53f3\u952e\u7684\u65b9\u6cd5\uff1a # base_widget.py\n@classmethod\ndef right_click(cls, _x=None, _y=None):\n\"\"\"\n \u91cd\u5199\u5e95\u5c42\u5355\u51fb\u9f20\u6807\u53f3\u952e\n \u89e3\u51b3\u5f71\u9662\u53f3\u952e\u89e6\u53d1release\u4e8b\u4ef6\u7684\u95ee\u9898\uff08\u53f3\u952e\u4e3b\u7a97\u53e3\u4f1a\u64ad\u653e\u89c6\u9891\uff09\n \"\"\"\ncls.mouse_down(_x, _y, button=3)\nsleep(0.1)\ncls.mouse_up(button=3)\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_6","title":"\u4e03\u3001\u5176\u4ed6\u4e0d\u4e3a\u4eba\u77e5\u7684\u7ec6\u8282","text":" \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u5c3d\u91cf\u7f16\u5199\u540c\u4e00\u4e2a\u5e94\u7528\u6216\u6a21\u5757\u7684\u7528\u4f8b\uff0c\u80fd\u5bf9\u8be5\u7528\u4f8b\u5df2\u6709\u65b9\u6cd5\u719f\u6089\uff0c\u907f\u514d\u8fc7\u591a\u91cd\u590d\u4e1a\u52a1\u4ee3\u7801\u7684\u5c01\u88c5\uff1b \u76f8\u540c\u7684\u573a\u666f\u4e0b\uff0c\u5404\u67b6\u6784\u7b49\u5f85\u65f6\u95f4\u4e0d\u540c\uff0c\u5efa\u8bae\u4f7f\u7528\u6846\u67b6\u63d0\u4f9b\u7684 sleep\uff0c\u6211\u4eec\u505a\u4e86\u4e0d\u540c\u67b6\u6784\u7684\u500d\u6570\u653e\u5927\uff1b \u7f16\u5199\u7528\u4f8b\u65f6\uff0c\u5c3d\u91cf\u8003\u8651\u5230\u6bcf\u4e00\u6b65\u5f02\u5e38\u540e\u7684\u73af\u5883\u6062\u590d\uff0c\u9700\u8981\u5efa\u8bae\u8fd9\u79cd\u610f\u8bc6\uff0c\u968f\u65f6\u8981\u8003\u8651\u5230\uff0c\u8fd9\u6b65\u64cd\u4f5c\u6709\u6ca1\u6709\u53ef\u80fd\u51fa\u9519\uff0c\u51fa\u9519\u4e86\u6539\u600e\u4e48\u529e\uff1b \u63d0\u4ea4\u4ee3\u7801\u7684\u65f6\u5019\u6ce8\u610f\u4e0d\u8981\u628a\u4e00\u4e9b\u4e34\u65f6\u7684\u6d4b\u8bd5\u8d44\u6e90\u63d0\u4ea4\u8fdb\u53bb\u4e86\uff0c\u6bd4\u5982\u6d4b\u8bd5\u4e86\u4e00\u4e2a\u5f71\u7247\uff0c\u6709\u4e9b\u540c\u5b66\u4e60\u60ef\u4f7f\u7528 git add . \uff0c\u7136\u540e\u5c31\u5168\u90e8\u63d0\u4ea4\u5230\u4ee3\u7801\u4ed3\u5e93\u4e86\uff0c\u8fd9\u6837\u5373\u4f7f\u540e\u671f\u628a\u5927\u6587\u4ef6\u5220\u4e86\uff0c.git \u6587\u4ef6\u91cc\u9762\u4e5f\u4f1a\u5f88\u5927\uff0c\u9020\u6210\u4ee3\u7801\u4ed3\u5e93\u53d8\u5f97\u5341\u5206\u81c3\u80bf\u3002 \u66f4\u591a\u7ec6\u8282\u67e5\u770b\uff1a\u300aAT\u7ecf\u9a8c\u603b\u7ed3\u300b"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/","title":"AT \u6267\u884c\u5668\u4f7f\u7528\u6307\u5317","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/5/25\n# Author : litao\n# =============================================\n Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1","title":"1\u3001\u529f\u80fd\u4ecb\u7ecd","text":" \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7cfb\u7edf\u8bed\u8a00\u8bbe\u7f6e\uff0c\u5206\u8fa8\u7387\u8bbe\u7f6e\u53ca\u7528\u4f8b\u6267\u884c\u73af\u5883\u642d\u5efa\uff1b \u652f\u6301 IP \u4e3a 15 \u7f51\u6bb5\u7684 AMD \u67b6\u6784\u6d4b\u8bd5\u673a\u955c\u50cf\u88c5\u673a\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u6307\u5b9a\u5e94\u7528\uff0c\u6307\u5b9a\u8303\u56f4\u6807\u7b7e\u7684\u7528\u4f8b\u6267\u884c\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u72b6\u6001\u68c0\u67e5\uff0c\u662f\u5426\u6709\u6b63\u5728\u8fd0\u884c\u7684\u6d4b\u8bd5\uff1b \u652f\u6301\u914d\u7f6e\u7528\u4f8b\u6267\u884c\u65f6\u957f\uff0c\u9632\u6b62\u4efb\u52a1\u963b\u585e\uff1b \u652f\u6301\u6839\u636e\u5e94\u7528\u7248\u672c\u81ea\u52a8\u67e5\u627e\u5bf9\u5e94\u7684\u7528\u4f8b tag\uff1b \u652f\u6301\u5f02\u5e38\u5904\u7406\u548c\u6d4b\u8bd5\u5b8c\u6210\u7684\u5b9e\u65f6\u6d88\u606f\u901a\u77e5\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2job","title":"2\u3001Job \u4ecb\u7ecd","text":"\u4ee5\u4e0b\u6309\u6267\u884c\u6d41\u7a0b\u7684\u987a\u5e8f\u4ecb\u7ecd\uff0c\u6bcf\u4e00\u6b65\u90fd\u53ef\u4ee5\u5355\u72ec\u6267\u884c\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1_1","title":"1\u3001\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/AT_test/ \u6574\u4e2a\u6d41\u7a0b\u7684\u4e3b\u5165\u53e3\uff0c\u901a\u8fc7\u8fd9\u4e2a\u5165\u53e3\uff0c\u8fde\u540c\u6574\u4e2a\u6d4b\u8bd5\u6d41\u7a0b\uff0c\u955c\u50cf\u88c5\u673a\uff0c\u73af\u5883\u90e8\u7f72\uff0c\u6d4b\u8bd5\u5e94\u7528\u53ca\u751f\u6210\u62a5\u544a\u3002 \u53c2\u6570\u4ecb\u7ecd\uff1a \u6d4b\u8bd5\u673a\uff1a\u6240\u6709\u89c4\u6574\u5230\u56fa\u5b9a\u533a\u57df\u7684\u6d4b\u8bd5\u673a\uff0c\u901a\u8fc7\u6d4b\u8bd5\u540c\u5b66\u5bf9\u6d4b\u8bd5\u673a\u7684\u4e60\u60ef\u547d\u540d\uff0c\u5728\u540e\u53f0\u6620\u5c04\u6d4b\u8bd5\u673a\u7684\u8be6\u7ec6\u4fe1\u606f\uff0c\u62ec\u53f7\u4e2d\u4e3a\u6d4b\u8bd5\u673a IP \u7684\u6700\u540e\u4e00\u4f4d\uff1b \u6d4b\u8bd5\u5e94\u7528\uff1a\u6307\u5b9a\u7684\u6d4b\u8bd5\u5e94\u7528\u7684\u5305\u540d\uff0c\u7cfb\u7edf\u6839\u636e\u540d\u79f0\u81ea\u52a8\u62c9\u53d6\u5bf9\u5e94\u7684\u4ed3\u5e93\u4ee3\u7801\uff1b deb\u5305\u4e0b\u8f7d\u5730\u5740\uff1a\u6d4b\u8bd5\u4e0a\u8ff0\u5e94\u7528\u65f6\uff0c\u9700\u8981\u5b89\u88c5\u7684deb\u5305\u4e0b\u8f7d\u5730\u5740\uff0c\u591a\u4e2a\u5730\u5740\u7528\u201c,\u201d\u9694\u5f00\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff1b \u8303\u56f4\u6807\u7b7e\uff1a\u6267\u884c\u6d4b\u8bd5\u7528\u4f8b\u7684\u6807\u7b7e\u8303\u56f4\uff0c\u5bf9\u5e94\u7528\u4f8b\u4ee3\u7801 csv \u6587\u4ef6\u4e2d\u7684\u6807\u7b7e\u4fe1\u606f\uff0c\u4ee5 pytest \u7684mark\u8bed\u6cd5\u7f16\u5199\uff1b \u7cfb\u7edf\u8bed\u8a00\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u8bed\u8a00\u73af\u5883\uff1b \u5206\u8fa8\u7387\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u5206\u8fa8\u7387\u73af\u5883\uff1b \u955c\u50cf\u5730\u5740\uff1a\u955c\u50cf\u4ed3\u5e93\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u901a\u8fc7 PXE \u88c5\u673a\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u88c5\u673a\u73af\u8282\uff08\u76ee\u524d\u4ec5\u652f\u6301\u90e8\u5206 AMD \u67b6\u6784\u7684\u88c5\u673a\uff09\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2pxe","title":"2\u3001PXE \u88c5\u673a","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/IOS_install/ \u8f93\u5165\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\uff0cIP\uff0c\u5bc6\u7801\uff0c\u955c\u50cf\u5730\u5740\u540e\uff0c\u81ea\u52a8\u88c5\u673a\uff0c\u76ee\u524d\u4ec5\u652f\u6301\u56fa\u5b9a 15 \u7f51\u6bb5\u7684\u90e8\u5206 AMD \u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#3","title":"3\u3001\u6b21\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/all_client_test/ \u8be5\u5165\u53e3\u4e0e\u4e3b\u5165\u53e3\u529f\u80fd\u57fa\u672c\u4e00\u81f4\uff0c\u53ea\u662f\u5265\u79bb\u4e86PXE\u88c5\u673a\u6d41\u7a0b\uff0c\u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7684\u6267\u884c\u6d41\u7a0b\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#4","title":"4\u3001\u73af\u5883\u90e8\u7f72","text":"Jenkins url\uff1ahttps://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/env/build?delay=0sec \u8bbe\u7f6e\u6d4b\u8bd5\u673a\u7684\u7cfb\u7edf\u8bed\u8a00\uff0c\u5206\u8fa8\u7387\u53ca\u5b89\u88c5\u6d4b\u8bd5\u6240\u9700\u7684\u4f9d\u8d56\u5305\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#5","title":"5\u3001\u53d1\u9001\u4ee3\u7801","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/send_code/ \u6839\u636e\u6d4b\u8bd5\u5e94\u7528\u540d\u79f0\uff0c\u62c9\u53d6\u5bf9\u5e94\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u5e76\u6839\u636e\u6d4b\u8bd5\u673a\u4e0a\u5e94\u7528\u7248\u672c\u5207\u6362\u5230\u5bf9\u5e94\u7684tag\u7248\u672c\uff0c\u82e5\u672a\u627e\u5230tag\u7248\u672c\uff0c\u5219\u4f7f\u7528\u6700\u65b0\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u518d\u6839\u636e\u5e94\u7528\u5e93\u4ee3\u7801\u4e2d\u914d\u7f6e\u7684\u57fa\u7840\u5e93\u7248\u672c\uff0c\u62c9\u53d6\u57fa\u7840\u5e93\u4ee3\u7801\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#6","title":"6\u3001\u7528\u4f8b\u6267\u884c","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/run_test/ \u8fd0\u884c\u6d4b\u8bd5\u673a\u4e0a\u7684\u7528\u4f8b"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/","title":"AT \u7528\u4f8b\u7b5b\u9009\u6307\u5317","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u7528\u4f8b\u7b5b\u9009\u6807\u51c6\uff0c\u662f\u6311\u9009\u5408\u9002\u7684\u6587\u672c\u7528\u4f8b\u8fdb\u884c\u81ea\u52a8\u5316\u7528\u4f8b\u8f6c\u5316\u7684\u4e00\u4e9b\u901a\u7528\u6807\u51c6\u3002 \u8fc7\u53bb\u6211\u4eec\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u5b9e\u8df5\u8fc7\u7a0b\u4e2d\uff0c\u5199\u4e86\u4e0d\u5c11\u81ea\u52a8\u5316\u7528\u4f8b\uff0c\u968f\u7740\u9700\u6c42\u7684\u8fed\u4ee3\uff0c\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u81ea\u7136\u8150\u5316\uff0c\u56e0\u800c\u9700\u8981\u5728\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\u5bf9\u81ea\u52a8\u5316\u7528\u4f8b\u8fdb\u884c\u7ef4\u62a4\uff0c\u5728\u7ef4\u62a4\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u6211\u4eec\u53d1\u73b0\uff0c\u6709\u4e9b\u7528\u4f8b\u7ef4\u62a4\u8d77\u6765\u592a\u96be\u4e86\uff0c\u8c03\u8bd5\u7528\u4f8b\u8017\u8d39\u5927\u91cf\u65f6\u95f4\uff0c\u6210\u672c\u5f88\u9ad8\u3002 \u56e0\u6b64\uff0c\u6211\u4eec\u603b\u7ed3\u4e00\u4e9b\u81ea\u52a8\u5316\u7528\u4f8b\u9009\u578b\u7684\u6807\u51c6\uff0c\u4ee5\u4f18\u5316\u540e\u7eed\u81ea\u52a8\u5316\u7528\u4f8b\u7ed3\u6784\uff0c\u671f\u5f85\u6211\u4eec\u80fd\u7f16\u5199\u51fa\u9ad8\u6548\u3001\u7a33\u5b9a\u3001\u6613\u4e8e\u7ef4\u62a4\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_1","title":"\u4e00\u3001\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u53ef\u4ee5\u5206\u4e3a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u548c\u4e13\u9879\u81ea\u52a8\u5316\u6d4b\u8bd5\uff0c\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e00\u822c\u53ea\u9488\u5bf9\u4e00\u4e9b\u5e38\u89c4\u7684\u529f\u80fd\u6d4b\u8bd5\uff0c\u5176\u4ed6\u975e\u5e38\u89c4\u529f\u80fd\u7684\u7528\u4f8b\uff0c\u5e94\u8be5\u91c7\u7528\u4e13\u9879\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u6848\uff1b \u4ee5\u4e0b\u662f\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1","title":"1. \u7a33\u5b9a\u6027\u3001\u538b\u6d4b\u7528\u4f8b","text":"\u7a33\u5b9a\u6027\u6d4b\u8bd5\u3001\u538b\u6d4b\u7528\u4f8b\u5e94\u8be5\u662f\u5c5e\u4e8e\u6027\u80fd\u76f8\u5173\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u5982\uff1a\u53cd\u590d\u591a\u6b21\u70b9\u51fb\u6309\u94ae\uff0c\u68c0\u9a8c\u5176\u529f\u80fd\u7a33\u5b9a\u6027\u3002\u56e0\u4e3a\u8fd9\u4e9b\u7528\u4f8b\u65ad\u8a00\u7684\u9884\u671f\u53ef\u80fd\u4e0d\u662f\u5f88\u660e\u786e\uff0c\u66f4\u6709\u751a\u8005\u4e0d\u9700\u8981\u65ad\u8a00\uff0c\u7528\u4f8b\u65f6\u957f\u6bd4\u8f83\u957f\uff0c\u800c\u4e14\u4e0d\u53ef\u63a7\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u76ee\u524d\u6211\u4eec\u6709\u6027\u80fd\u81ea\u52a8\u5316\u7684\u4e13\u9879\u65b9\u6848\uff0c\u4ee5\u53ca\u4e00\u4e9b\u7a33\u5b9a\u6027\u6d4b\u8bd5\u7684\u4e13\u9879\u65b9\u6848\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u6b64\u7c7b\u7528\u4f8b\u653e\u5230\u4e13\u9879\u81ea\u52a8\u5316\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2","title":"2. \u6d89\u53ca\u591a\u4e2a\u7528\u6237\u64cd\u4f5c","text":"\u5e38\u89c1\u4e0e\u6587\u7ba1\u7684\u7528\u4f8b\u4e2d\uff0c\u591a\u7528\u6237\u64cd\u4f5c\u7684\u7528\u4f8b\u4e00\u822c\u90fd\u4f1a\u6d89\u53ca\u5230\u5728\u7cfb\u7edf\u4e2d\u8fdb\u884c\u591a\u4e2a\u7528\u6237\u95f4\u7684\u5207\u6362\uff0c\u81ea\u52a8\u5316\u811a\u672c\u4e00\u822c\u662f\u8fd0\u884c\u5728\u4e00\u4e2a\u7528\u6237\u7a7a\u95f4\u4e0b\u7684\uff0c\u6240\u4ee5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u591a\u7528\u6237\u95f4\u7684\u5207\u6362\u3002 \u6b64\u7c7b\u4e0d\u5efa\u8bae\u91c7\u7528\u81ea\u52a8\u5316\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3","title":"3. \u4e0e\u5f00\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4ea4\u4e92","text":"\u6b64\u7c7b\u573a\u666f\u591a\u4e3a\u5e94\u7528\u7684\u5f02\u5e38\u573a\u666f\u6d4b\u8bd5\uff0c\u6bd4\u5982\uff1a\u590d\u5236\u5927\u6587\u4ef6\u8fc7\u7a0b\u4e2d\u6ce8\u9500\u673a\u5668\u3002 \u81ea\u52a8\u5316\u811a\u672c\u5728\u7cfb\u7edf\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4e4b\u540e\u662f\u4f1a\u505c\u6b62\u8fd0\u884c\u7684\uff1b\u6b64\u7c7b\u7528\u4f8b\u53ef\u4ee5\u505a\u81ea\u52a8\u5316\uff0c\u4f46\u662f\u540c\u6837\u9700\u8981\u505a\u4e13\u9879\u65b9\u6848\uff0c\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u7684\u5904\u7406\u903b\u8f91\u5b8c\u5168\u4e0d\u540c\u3002 \u540e\u7eed\u81ea\u52a8\u5316\u9700\u8981\u516c\u5173\u7684\u70b9\uff1a \u81ea\u52a8\u5316\u811a\u672c\u5728\u672c\u673a\u8fd0\u884c\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u81f3\u5c11\u9700\u8981\u63d0\u4f9b\u4ee5\u4e0b\u529f\u80fd\uff1a \u91cd\u542f\u4e4b\u540e\u7528\u4f8b\u80fd\u81ea\u52a8\u8fd0\u884c\uff1b\u53ef\u4ee5\u8003\u8651\u5c06\u6267\u884c\u7528\u4f8b\u5199\u6210\u4e00\u4e2a\u5f00\u673a\u81ea\u542f\u7684\u670d\u52a1\uff1b \u80fd\u8bb0\u5f55\u5173\u673a\u4e4b\u524d\u7528\u4f8b\u6267\u884c\u7684\u4f4d\u7f6e\uff0c\u91cd\u542f\u4e4b\u540e\u80fd\u4ece\u6b64\u4f4d\u7f6e\u5f00\u59cb\u6267\u884c\uff1b \u50cf\u6027\u80fd\u81ea\u52a8\u5316\u4e00\u6837\uff0c\u7531\u670d\u52a1\u7aef\u63a7\u5236\uff1b \u5b8c\u5168\u57fa\u4e8e\u56fe\u5f62\u8bc6\u522b\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u4e32\u53e3\u7ebf\u63a7\u5236\u952e\u9f20\u7a33\u5b9a\u6027\uff1b "},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4","title":"4. \u6d4b\u8bd5\u6267\u884c\u65f6\u95f4\u957f","text":"\u7528\u4f8b\u6267\u884c\u65f6\u95f4\u63a7\u5236\u57282\u5206\u949f\u4ee5\u5185\uff0c\u6781\u7aef\u60c5\u51b5\u4e0d\u8981\u8d85\u8fc75\u5206\u949f\uff0c\u6240\u6709\u7528\u4f8b\u7684\u5e73\u5747\u65f6\u957f\u5e94\u8be5\u57281\u5206\u949f\u5de6\u53f3\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u95f4\u592a\u957f\uff0c\u7f16\u5199\u7528\u4f8b\u3001\u8c03\u8bd5\u7528\u4f8b\u3001\u6267\u884c\u7528\u4f8b\u3001\u7ef4\u62a4\u7528\u4f8b\u90fd\u975e\u5e38\u7684\u8017\u65f6\uff0c\u4eba\u529b\u6210\u672c\u65f6\u95f4\u6210\u672c\u6295\u5165\u592a\u9ad8\u3002 \u4f60\u60f3\uff0c\u8fd9\u6761\u7528\u4f8b\u6267\u884c\u9700\u89815\u5206\u949f\uff0c\u90a3\u4f60\u5199\u8fd9\u6761\u7528\u4f8b\u7684\u65f6\u95f4\u4e0d\u53ef\u80fd\u4e00\u904d\u8fc7\uff0c\u5199\u7684\u8fc7\u7a0b\u4e2d\u8dd1\u4e0d\u901a\u8fd8\u5f97\u91cd\u8dd1\u81f3\u5c1115\u5206\u949f\u4e0d\u8fc7\u5206\uff0c\u5199\u5b8c\u4e86\u8fd8\u5f97\u5728\u5176\u4ed6\u67b6\u6784\u4e0a\u8c03\u8bd5\uff0c\u534a\u4e2a\u5c0f\u65f6\u8fc7\u53bb\u4e86\uff0c\u8fd9\u8fd8\u53ea\u662f\u7b2c\u4e00\u6b21\u5199\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u540e\u7eed\u5982\u679c\u7528\u4f8b\u7ef4\u62a4\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u7ecf\u5e38\u6295\u5165\u76f8\u5f53\u957f\u65f6\u95f4\uff0c\u8fd9\u6837\u5176\u5b9e\u662f\u5931\u53bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u7684\u3002\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u5c31\u5e94\u8be5\u662f\u5feb\u51c6\u72e0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5","title":"5. \u8fb9\u7f18\u6027\u6d4b\u8bd5","text":"\u6709\u4e9b\u529f\u80fd\u6a21\u5757\u672c\u8eab\u662f\u5c5e\u4e8e\u6bd4\u8f83\u8fb9\u7f18\u6027\u7684\uff0c\u5373\u6781\u5c11\u7528\u6237\u4f1a\u4f7f\u7528\u5230\u7684\u529f\u80fd\uff0c\u8fd9\u7c7b\u529f\u80fd\u6a21\u5757\u4e0d\u9700\u8981\u5927\u89c4\u6a21\u5b9e\u73b0\u81ea\u52a8\u5316\uff0c\u4e00\u4e24\u4e2a\u573a\u666f\u8986\u76d6\u57fa\u672c\u529f\u80fd\u5c31\u884c\u4e86\uff0c\u56e0\u6b64\u6211\u4eec\u5728\u6311\u9009\u6b64\u7c7b\u7528\u4f8b\u7684\u65f6\u5019\u53ef\u4ee5\u7ed3\u5408\u6574\u4e2a\u529f\u80fd\u6a21\u5757\u7684\u8986\u76d6\u60c5\u51b5\u6765\u51b3\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6","title":"6. \u9700\u8981\u4f9d\u8d56\u4eba\u5de5\u4ecb\u5165\u7684","text":"\u81ea\u52a8\u5316\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\u662f\u6ca1\u6709\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bd4\u5982\u8981\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u90a3\u4e48\u5c31\u80cc\u79bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u3002 \u6bd4\u5982\u5149\u9a71\u6a21\u5757\uff0c\u5149\u9a71\u523b\u5f55\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u4f46\u662f\u5149\u9a71\u523b\u5f55\u4e4b\u540e\u5149\u76d8\u4f1a\u5f39\u51fa\u6765\uff0c\u9700\u8981\u4eba\u5de5\u66f4\u6362\u5149\u76d8\uff0c\u518d\u624b\u52a8\u63a8\u8fdb\u5149\u9a71\u4e2d\u3002 \u8fd9\u79cd\u529f\u80fd\u6a21\u5757\u5373\u4f7f\u505a\u81ea\u52a8\u5316\uff0c\u80fd\u6d89\u53ca\u5230\u7684\u529f\u80fd\u975e\u5e38\u6709\u9650\uff0c\u800c\u4e14\u4e0d\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u6240\u4ee5\u660e\u663e\u5c31\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7","title":"7. \u96be\u4ee5\u5b9e\u73b0\u7684","text":"\u7528\u4f8b\u6240\u6d89\u53ca\u5230\u7684\u65b9\u6cd5\u5b9e\u73b0\u8d77\u6765\u53ef\u80fd\u6709\u96be\u5ea6\uff0c\u751a\u81f3\u73b0\u9636\u6bb5\u65e0\u6cd5\u5b9e\u73b0\u7684\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002 \u6bd4\u5982\u5f71\u9662\u6d4b\u8bd5\u753b\u9762\u6e05\u6670\u5ea6\u3001\u6d41\u7545\u5ea6\u3001\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u4e4b\u540e\u7684\u89c6\u9891\u662f\u5426\u5b58\u5728\u5361\u987f\u7b49\u7528\u4f8b\uff0c\u73b0\u9636\u6bb5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#8","title":"8. \u529f\u80fd\u4e0d\u7a33\u5b9a","text":"\u8fd9\u4e2a\u4e0d\u662f\u8bf4\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\uff0c\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\u4e0d\u7a33\u5b9a\u662f\u6b63\u5e38\u7684\uff0c\u8fd9\u79cd\u6211\u4eec\u53ef\u4ee5\u7b49\u5f00\u53d1\u63d0\u6d4b\u4e4b\u540e\u518d\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u3002 \u529f\u80fd\u4e0d\u7a33\u5b9a\u6307\u7684\u662f\u7528\u4f8b\u6240\u6d89\u53ca\u7684\u529f\u80fd\uff0c\u53ef\u80fd\u5b58\u5728\u591a\u79cd\u53d8\u5316\uff0c\u6bcf\u6b21\u6267\u884c\u7528\u4f8b\u53ef\u80fd\u65ad\u8a00\u7684\u9884\u671f\u90fd\u4e0d\u540c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#9","title":"9. \u52a8\u6001\u65ad\u8a00","text":"\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u76f4\u5230\u7528\u4f8b\u7ed3\u675f\uff0c\u4e00\u76f4\u662f\u4e00\u4e2a\u52a8\u6001\u53d8\u5316\u7684\u8fc7\u7a0b\uff0c\u800c\u4e14\u65e0\u6cd5\u901a\u8fc7\u5176\u4ed6\u624b\u6bb5\u505c\u4e0b\u6765\uff1b \u6bd4\u5982\uff1a\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u65f6\uff0c\u53f3\u4e0b\u89d2\u7684\u5f55\u5236\u65f6\u95f4\u662f\u4e00\u76f4\u5728\u53d8\u5316\u7684\uff0c\u7528\u4f8b\u9700\u8981\u6d4b\u8bd5\u5f55\u52361\u5206\u949f\u4e4b\u540e\uff0c\u5f55\u5236\u65f6\u95f4\u662f\u521a\u597d\u505c\u572860\u79d2\uff1b \u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fd8\u505a\u4e0d\u5230\u65f6\u95f4\u7cbe\u51c6\u63a7\u5236\uff0c\u7a0b\u5e8f\u6267\u884c\u65f6\u95f4\u662f\u6709\u6ce2\u52a8\u7684\uff0c\u800c\u4e14\u8981\u9002\u914d\u591a\u4e2a\u5e73\u53f0\uff0c\u6240\u4ee5\u6b64\u7c7b\u7528\u4f8b\u5927\u6982\u7387\u4f1a\u6267\u884c\u5931\u8d25\u3002\u7279\u522b\u662f\u5728\u6027\u80fd\u8f83\u5dee\u7684\u56fd\u4ea7\u5316\u67b6\u6784\u4e0a\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u592a\u53ef\u80fd\u7a33\u5b9a\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#10","title":"10. \u63a2\u7d22\u6027\u6d4b\u8bd5","text":"\u63a2\u7d22\u6027\u6d4b\u8bd5\u901a\u5e38\u662f\u4e00\u4e9b\u4e0d\u786e\u5b9a\u7684\u64cd\u4f5c\uff0c\u591a\u53d8\u5207\u590d\u6742\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u9884\u671f\u4e5f\u53ef\u80fd\u662f\u4e0d\u786e\u5b9a\u7684\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u9a9a\u64cd\u4f5c\u592a\u591a\u4e86\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6b64\u7c7b\u7528\u4f8b\u9002\u5408\u91c7\u7528\u624b\u5de5\u6d4b\u8bd5\uff0c\u662f\u624b\u5de5\u6d4b\u8bd5\u771f\u6b63\u7684\u4ef7\u503c\u4f53\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#11","title":"11. \u6613\u7528\u6027\u6d4b\u8bd5","text":"\u5bf9\u4e8e\u6613\u7528\u6027\u7684\u5224\u65ad\u901a\u5e38\u662f\u4e3b\u89c2\u7684\uff0c\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\u5f88\u96be\u53bb\u5b9a\u4e49\u4ec0\u4e48\u6837\u7684\u60c5\u51b5\u5bf9\u7528\u6237\u662f\u6613\u7528\u7684\uff0c\u81ea\u52a8\u5316\u9700\u8981\u6709\u660e\u786e\u7684\u53ef\u5b9e\u73b0\u7684\u9884\u671f\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_2","title":"\u4e8c\u3001\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u524d\u9762\u8bb2\u4e86\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u4e00\u4e9b\u7528\u4f8b\u60c5\u51b5\uff0c\u6709\u540c\u5b66\u5c31\u8bf4\u4e86\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\u4e0d\u7528\u8bb2\u4e86\uff0c\u5c31\u662f\u4e0d\u9002\u5408\u7684\u53cd\u9762\u3002\u6ca1\u6bdb\u75c5\u54c8\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\uff0c\u6211\u4eec\u5927\u4f53\u8fd8\u53ef\u4ee5\u5206\u4e3a\u4e24\u7c7b\uff1a \u7b2c\u4e00\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u597d\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u7b2c\u4e8c\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u4e00\u822c\uff0c\u9700\u8981\u6295\u5165\u66f4\u591a\u7cbe\u529b\u624d\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u4ee5\u4e0b\u4ecb\u7ecd\u4e00\u4e9b\u6211\u4eec\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1_1","title":"1. \u64cd\u4f5c\u76f8\u5bf9\u7b80\u5355","text":"\u7528\u4f8b\u6b65\u9aa4\u76f8\u5bf9\u8f83\u5c11\uff0c\u8fd9\u79cd\u7528\u4f8b\u901a\u5e38\u662f\u4e00\u4e9b\u8def\u5f84\u5f88\u6d45\u7684\u7528\u4f8b\uff0c\u4e00\u822c\u4e5f\u662f\u4e00\u4e9b\u57fa\u7840\u7528\u4f8b\u3002\u7528\u4f8b\u7f16\u5199\u3001\u7ef4\u62a4\u90fd\u53ef\u4ee5\u8f7b\u677e\u641e\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2_1","title":"2. \u5bb9\u6613\u5b9e\u73b0","text":"\u73b0\u6709\u6280\u672f\u662f\u53ef\u5b9e\u73b0\u7684\uff0c\u6ca1\u6709\u96be\u5ea6\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3_1","title":"3. \u7ecf\u5e38\u7528\u4e8e\u56de\u5f52\u6d4b\u8bd5","text":"\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bcf\u6b21\u56de\u5f52\u6d4b\u8bd5\u5fc5\u987b\u8981\u6267\u884c\u7684\u7528\u4f8b\uff0c\u90a3\u4e48\u8fd9\u6761\u7528\u4f8b\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u3002 \u56de\u5f52\u6d4b\u8bd5\u65f6\u6211\u4eec\u9996\u5148\u5e94\u8be5\u4fdd\u8bc1\u5e94\u7528\u5386\u53f2\u57fa\u672c\u529f\u80fd\u6b63\u5e38\uff0c\u6240\u4ee5\u90a3\u4e9b\u6bcf\u6b21\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u90fd\u8981\u6267\u884c\u7684\u7528\u4f8b\u9002\u5408\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4_1","title":"4. \u529f\u80fd\u7a33\u5b9a\u7684\u6838\u5fc3\u529f\u80fd","text":"\u6d89\u53ca\u6838\u5fc3\u529f\u80fd\u7684\u7528\u4f8b\u662f\u6700\u6700\u91cd\u8981\u7684\u7528\u4f8b\uff0c\u4e5f\u662f\u6211\u4eec\u4ea4\u4ed8\u65f6\u5fc5\u987b\u8981\u4fdd\u8bc1\u8d28\u91cf\u7684\u76f8\u5173\u529f\u80fd\uff0c\u56e0\u6b64\u5e94\u8be5\u5c3d\u53ef\u80fd\u7684\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5_1","title":"5. \u8f93\u5165\u6570\u636e\u6d4b\u8bd5","text":"\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u901a\u5e38\u662f\u68c0\u9a8c\u88ab\u6d4b\u5e94\u7528\u63a5\u53d7\u6709\u6548\u6570\u636e\u3001\u62d2\u7edd\u65e0\u6548\u6570\u636e\u7684\u80fd\u529b\u3002\u5982\uff1a\u63d0\u4ea4\u8d85\u957f\u5b57\u7b26\u4e32\u3001\u7279\u6b8a\u5b57\u7b26\u4e32\u7b49\u7b49\u3002 \u6b64\u7c7b\u7528\u4f8b\u624b\u5de5\u6d4b\u8bd5\u5f88\u96be\u6bd4\u8f83\u5168\u9762\u7684\u8986\u76d6\u5230\u6240\u6709\u7684\u8f93\u5165\u60c5\u51b5\uff0c\u4f46\u662f\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\uff0c\u6b64\u7c7b\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u90fd\u662f\u4e00\u6837\u7684\uff0c\u53d8\u5316\u7684\u4ec5\u662f\u8f93\u5165\u53c2\u6570\u548c\u65ad\u8a00\u7ed3\u679c\uff0c\u91c7\u7528\u6570\u636e\u9a71\u52a8\uff0c\u53ef\u4ee5\u8f7b\u677e\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6_1","title":"6. \u683c\u5f0f\u8986\u76d6","text":"\u539f\u56e0\u540c\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u7c7b\u7528\u4f8b\u4e00\u6837\uff0c\u591a\u79cd\u683c\u5f0f\u7684\u8986\u76d6\u4e5f\u662f\u4e00\u4e2a\u5f88\u7e41\u7410\u7684\u4e8b\u60c5\uff0c\u4ea4\u7ed9\u81ea\u52a8\u5316\u6765\u505a\u518d\u5408\u9002\u4e0d\u8fc7\u4e86\u3002 \u6bd4\u5982\u5f71\u9662\u5bf9\u5f71\u7247\u683c\u5f0f\u7684\u68c0\u67e5\u3001\u622a\u56fe\u5f55\u5c4f\u5bf9\u4fdd\u5b58\u683c\u5f0f\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7_1","title":"7. \u68c0\u67e5\u5143\u7d20\u72b6\u6001","text":"\u67e5\u770b\u88ab\u6d4b\u5e94\u7528\u7684\u5143\u7d20\u5c5e\u6027\u3002\u5982\uff1a\u56fe\u7247\u7684\u5927\u5c0f\u548c\u6392\u5217\uff1b\u6309\u94ae\u7684\u53ef\u7528\u548c\u4e0d\u53ef\u7528\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/","title":"AT \u7ecf\u9a8c\u603b\u7ed3","text":"\u6b22\u8fce\u6240\u6709\u4eba\u63d0\u4ea4\u4f60\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u9762\u7684\u4f18\u79c0\u5b9e\u8df5\u7ecf\u9a8c\uff0c\u4ee5\u5e2e\u52a9\u5927\u5bb6\u89e3\u51b3\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#1","title":"1\u3001\u7ec8\u7ed3\u5668","text":"# litaoa@uniontech.com\n \u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4 pytest \u5b9e\u73b0\u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4\u7684\u65b9\u5f0f\u6709\u4e24\u79cd\uff0cyield \u548c\u7ec8\u7ed3\u51fd\u6570\uff1b yield \u5b9e\u73b0\uff0cyield\u524d\u9762\u4e3a\u7528\u4f8b\u7684\u524d\u7f6e\u6b65\u9aa4\uff0cyield \u540e\u9762\u4e3a\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4\u3002 @pytest.fixture\ndef clean_env():\nprint(\"setup\")\nyield\nprint(\"teardown\")\n \u7ec8\u7ed3\u51fd\u6570\u5b9e\u73b0\uff0c\u4f7f\u7528 request.addfinalizer \u6ce8\u518c\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4 @pytest.fixture\ndef clean_env(request):\ndef clean():\nprint(\"teardown\")\nrequest.addfinalizer(clean)\nprint(\"setup\")\n yield\u7684\u4f18\u7f3a\u70b9\uff1a \u4f18\u70b9\uff1a\u4ee3\u7801\u7b80\u6d01\uff0c\u76f4\u89c2\uff0c\u53ef\u4f7f\u7528yield\u5728\u7528\u4f8b\u4e2d\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c \u7f3a\u70b9\uff1a\u82e5\u524d\u7f6e\u6b65\u9aa4\u4e2d\u51fa\u73b0\u9519\u8bef\uff0c\u5219\u540e\u7f6e\u6b65\u9aa4\u4e0d\u4f1a\u6267\u884c \u7ec8\u7ed3\u51fd\u6570\uff1a \u4f18\u70b9\uff1a\u524d\u7f6e\u6b65\u9aa4\u5931\u8d25\u7684\u8bdd\uff0c\u540e\u7f6e\u6b65\u9aa4\u4ecd\u4f1a\u6267\u884c\u4e14\u53ef\u4ee5\u6ce8\u518c\u591a\u4e2a\u540e\u7f6e\u6b65\u9aa4\uff08\u524d\u63d0\uff1a\u9700\u8981\u5728\u4ee3\u7801\u62a5\u9519\u4e4b\u524d\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff09\uff0c\u652f\u6301\u7075\u6d3b\u4f7f\u7528\u540e\u7f6e\u6761\u4ef6 \u7f3a\u70b9\uff1a\u4ee3\u7801\u8f83\u4e3a\u590d\u6742\uff0c\u65e0\u6cd5\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c\uff08\u672c\u4eba\u76ee\u524d\u672a\u5b9e\u73b0\uff09 \u603b\u7ed3\uff1a\u5728\u524d\u7f6e\u6b65\u9aa4\u4fdd\u8bc1\u7edd\u5bf9\u4e0d\u4f1a\u51fa\u9519\u65f6\uff0c\u4f7f\u7528yield\u66f4\u4f73\u7b80\u4fbf\uff0c\u5f53\u524d\u7f6e\u6b65\u9aa4\u6613\u51fa\u73b0\u95ee\u9898\u65f6\uff0c\u63a8\u8350\u4f7f\u7528\u7ec8\u7ed3\u51fd\u6570\u3002 \u573a\u666f\uff1a\u4fdd\u9669\u7bb1\u7528\u4f8b\uff0c\u524d\u7f6e\u6b65\u9aa4\u4e2d\u5f00\u542f\u4fdd\u9669\u7bb1\uff0c\u540e\u7f6e\u6b65\u9aa4\u5220\u9664\u4fdd\u9669\u7bb1\u3002 @pytest.fixture(scope=\"session\", autouse=True)\ndef vault_fixture(request):\nDfmWidget.reset_vault_by_cmd() # 1\u3001\u91cd\u7f6e\u4fdd\u9669\u7bb1\nDdeDockPublicWidget().close_file_manager_by_cmd() # 2\u3001\u5173\u95ed\u6587\u7ba1\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 3\u3001\u5f00\u542f\u6587\u7ba1\nvault = DfmWidget()\nvault.create_file_vault() # 4\u3001\u521b\u5efa\u4fdd\u9669\u7bb1\ndef delete_vault(): # 8\u3001\u5220\u9664\u4fdd\u9669\u7bb1\u7684\u540e\u7f6e\u6b65\u9aa4\nsleep(2)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr()\nvault = DfmWidget()\nvault.delete_file_vault()\nDfmWidget.reset_vault_by_cmd()\nDdeDockPublicWidget().close_file_manager_by_cmd()\nrequest.addfinalizer(delete_vault) # 5\u3001\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\nDdeDockPublicWidget().close_file_manager_by_cmd() # 6\u3001\u5173\u95ed\u6587\u7ba1\nsleep(1)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 7\u3001\u5f00\u542f\u6587\u7ba1\n \u4ee3\u7801\u6309\u6ce8\u91ca\u4e2d\u7684\u5e8f\u53f7\u6267\u884c\u6b65\u9aa4 \u4ee3\u7801\u5728\u6b65\u9aa41-4\u4efb\u610f\u4f4d\u7f6e\u62a5\u9519\uff0c\u5219\u4e0d\u4f1a\u6267\u884c\u6b65\u9aa48\uff0c\u56e0\u4e3a\u672a\u6267\u884c\u5230\u6b65\u9aa45\uff0c\u6b65\u9aa48\u8fd8\u672a\u6ce8\u518c \u4ee3\u7801\u5728\u6b65\u9aa46-7\u62a5\u9519\uff0c\u4ecd\u4f1a\u6267\u884c\u6b65\u9aa47\uff0c\u56e0\u4e3a\u5728\u6b65\u9aa45\u4e2d\u5df2\u7ecf\u5c06\u6b65\u9aa47\u6ce8\u518c \u53ef\u4ee5\u7075\u6d3b\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff0c\u80fd\u5b9e\u73b0\u67d0\u4e2a\u524d\u7f6e\u6b65\u9aa4\u6267\u884c\u4e4b\u540e\uff0c\u624d\u4f1a\u6267\u884c\u540e\u7f6e\u6b65\u9aa4\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#2","title":"2\u3001\u542f\u52a8\u5e94\u7528\u7684\u65b9\u5f0f","text":"# huangmingqiang@uniontech.com\n \uff081\uff09\u547d\u4ee4\u884c\u542f\u52a8 \u5728 AT \u4ee3\u7801\u4e2d\u4f7f\u7528\u547d\u4ee4\u884c\u542f\u52a8\u5e94\u7528\uff0c\u4e3e\u4f8b\uff1a os.popen(\"deepin-music\")\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f7f\u7528 ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6\uff0cdogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u3002 \uff082\uff09\u901a\u8fc7 UI \u64cd\u4f5c\u542f\u52a8 \u901a\u8fc7\u4efb\u52a1\u680f\u3001\u542f\u52a8\u5668\u3001\u684c\u9762\u7b49UI\u65b9\u5f0f\u542f\u52a8\uff0c\u6bd4\u5982\u53cc\u51fb\u6253\u5f00\u3001\u53f3\u952e\u6253\u5f00\u7b49\uff0c\u8fd9\u79cd\u64cd\u4f5c\u65b9\u5f0f\u4e0d\u5b58\u5728ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6dogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u7684\u95ee\u9898\uff0c\u4e5f\u66f4\u52a0\u7b26\u5408\u7528\u6237\u7684\u64cd\u4f5c\u884c\u4e3a\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#3","title":"3\u3001\u6587\u4ef6\u9009\u62e9\u6846\u5c5e\u6027\u5b9a\u4f4d\u5076\u73b0\u65e0\u6cd5\u627e\u5230","text":"\u6587\u4ef6\u9009\u62e9\u6846\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5728\u8c03\u7528\u6587\u4ef6\u9009\u62e9\u6846\u65f6\uff0c\u6709\u4e00\u5b9a\u7684\u6982\u7387\u51fa\u73b0\uff0c\u754c\u9762\u5df2\u7ecf\u6e32\u67d3\u51fa\u6765\u4e86\uff0c\u4f46\u662f\u5c5e\u6027\u6811\u5e76\u6ca1\u6709\u5199\u5165\uff0c\u5bfc\u81f4\u901a\u8fc7\u5c5e\u6027\u65e0\u6cd5\u627e\u5230\u5143\u7d20\uff0c\u76ee\u524d\u4e5f\u6ca1\u6709\u5f88\u597d\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u4e3a\u4e86\u7528\u4f8b\u7a33\u5b9a\u6027\uff0c\u6587\u4ef6\u9009\u62e9\u6846\u7684\u64cd\u4f5c\u5efa\u8bae\u4f7f\u7528UI\u6216\u8005\u56fe\u7247\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u53ef\u4ee5\u901a\u8fc7\u641c\u7d22\u5185\u5bb9\u56fa\u5b9a\u6587\u4ef6\u4f4d\u7f6e\u3002 # litaoa@uniontech.com\n desk = DdeDesktopPublicWidget()\n# \u9009\u62e9\u89c6\u9891\u76ee\u5f55\ndesk.click_videos_dir_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.ctrl_f()\nsleep(1)\ndesk.input_message(\"\u5143\u7d20\u540d\u79f0\")\nsleep(0.5)\ndesk.enter()\nsleep(1)\n# \u9009\u62e9\u7b2c\u4e00\u4e2a\u6587\u4ef6\ndesk.click_list_view_btn_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.click_first_file_in_desktop_plugs_by_ui()\nsleep(1)\n# \u6587\u7ba1\u63d2\u4ef6\u4e2d\u70b9\u51fb\u6253\u5f00\ndesk.click_open_btn_in_desktop_plugs_by_ui()\n"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#4","title":"4\u3001\u5e94\u7528\u542f\u52a8","text":"# mikigo\n \u5728UI\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u4e00\u5207\u64cd\u4f5c\u7684\u90fd\u662f\u4ece\u5e94\u7528\u542f\u52a8\u5f00\u59cb\u7684\uff0c\u800c\u5728Linux\u684c\u9762\u5e94\u7528\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u6211\u4eec\u542f\u52a8\u5e94\u7528\u7684\u65b9\u6cd5\u6709\u591a\u79cd\uff0c\u4e0b\u9762\u505a\u4e00\u4e2a\u7b80\u5355\u7684\u4ecb\u7ecd\uff1a \u3010\u4f7f\u7528dogtail\u542f\u52a8\u3011 dogtail\u63d0\u4f9b\u4e86\u5e94\u7528\u542f\u52a8\u7684\u65b9\u6cd5\uff0c\u5728utils\u5e93\u4e2d\uff0c\u4f7f\u7528run\u65b9\u6cd5\u542f\u52a8\uff1a \u9996\u5148\u5bfc\u5165\u65b9\u6cd5\uff1a from dogtail.utils import *\n \u8c03\u7528run\u65b9\u6cd5 run('deepin-music')\n \u5373\u53ef\u542f\u52a8\u97f3\u4e50 \u8fd9\u79cd\u65b9\u6cd5\u7684\u4f18\u70b9\u662f\u91c7\u7528\u8fdb\u7a0b\u7684\u65b9\u5f0f\u76f4\u63a5\u542f\u52a8\uff0c\u4e0d\u4f9d\u8d56\u4e0eUI\uff0c\u65e0\u8bba\u684c\u9762\u6216\u4efb\u52a1\u680f\u4e0a\u662f\u5426\u5b58\u5728\u5e94\u7528\u56fe\u6807\uff0c\u90fd\u53ef\u4ee5\u6b63\u5e38\u542f\u52a8\u3002 \u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c \u5982\u679c\u4f7f\u7528ssh\u8fdc\u7a0b\u8c03\u7528\uff0c\u6216\u8005Jenkins\u4e2d\u6267\u884c\u6d4b\u8bd5\u811a\u672c\u7684\u65f6\u5019\uff0c\u5728sniff\u4e2d\u4f1a\u51fa\u73b0\u627e\u4e0d\u5230\u5e94\u7528\uff0c\u7ecf\u8fc7\u5206\u6790\uff0c\u53ef\u80fd\u662f\u56e0\u4e3a\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\u542f\u52a8\u7684\u65f6\u5019\uff0c\u5b9e\u9645\u662f\u91c7\u7528\u4e00\u4e2a\u5b50\u8fdb\u7a0b\u542f\u52a8\u4e86\u5e94\u7528\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u5230\u3002 \u3010\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u3011 \u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807 \u901a\u5e38\u6709\u4e24\u79cd\u65b9\u6cd5\uff1a \uff081\uff09\u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807\u3002 \uff082\uff09\u5df2\u77e5\u5e94\u7528\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u7684\u4f4d\u7f6e\uff0c\u7136\u540e\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u5bf9\u5e94\u5750\u6807\u3002 \u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u7f3a\u70b9\u662f\u4f4d\u7f6e\u5fc5\u987b\u56fa\u5b9a\uff0c\u5982\u679c\u79fb\u52a8\u4f4d\u7f6e\u5c31\u4e0d\u884c\u4e86\uff0c\u800c\u4f7f\u7528\u7b2c\u4e00\u79cd\u65b9\u6cd5\uff0c\u65e0\u8bba\u4f4d\u7f6e\u5728\u54ea\u91cc\uff0c\u53ea\u8981\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u5b58\u5728\u5373\u53ef\u3002 \u3010\u70b9\u51fb\u684c\u9762\u56fe\u6807\u542f\u52a8\u3011 \u684c\u9762\u56fe\u6807\u76ee\u524d\u662f\u91c7\u7528\u56fe\u50cf\u8bc6\u522b\u6280\u672f\uff0c\u5b9a\u4f4d\u5230\u5e94\u7528\u56fe\u6807\u7684\u5750\u6807\uff0c\u7136\u540e\u901a\u8fc7pyauogui\u8fdb\u884c\u70b9\u51fb\u64cd\u4f5c\u3002 \u8be6\u7ec6\u6280\u672f\u65b9\u6848\u53ef\u4ee5\u53c2\u8003\u6211\u7684\u53e6\u5916\u4e24\u7bc7\u535a\u5ba2: \u57fa\u4e8eopencv\u7684\u6a21\u677f\u5339\u914d\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd4\u56de\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 Python\u4e09\u65b9\u5e93PyAutoGui\u7684\u4f7f\u7528\u65b9\u6cd5 \u3010\u4ece\u542f\u52a8\u5668\u542f\u52a8\uff08\u4fd7\u79f0\u5f00\u59cb\u83dc\u5355\uff09\u3011 \u542f\u52a8\u4e2d\u542f\u52a8\u7684\u5b9e\u73b0\u903b\u8f91\u5b9e\u9645\u548c\u4efb\u52a1\u680f\u4e0a\u542f\u52a8\u5dee\u4e0d\u591a\u3002 \u9996\u5148\uff0c\u9700\u8981\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u542f\u52a8\u5668\u56fe\u6807\uff0c\u6216\u8005\u952e\u76d8super\u952e\uff0c\u5c06\u542f\u52a8\u5668\u547c\u51fa\u6765\uff0c \u7136\u540e\uff0c\u5728\u542f\u52a8\u5668\u4e2d\u70b9\u51fb\u5bf9\u5e94\u7684\u56fe\u6807\uff0c \u4f46\u662f\u8fd9\u91cc\u6709\u4e2a\u95ee\u9898\uff0c\u542f\u52a8\u5668\u4e2d\u7684\u5e94\u7528\u5217\u8868\uff0c\u4e00\u9875\u5c55\u793a\u4e0d\u5b8c\uff0c\u6240\u4ee5\u5982\u679c\u6211\u4eec\u8981\u70b9\u51fb\u7684\u5e94\u7528\u56fe\u6807\u4e0d\u5728\u7b2c\u4e00\u9875\u600e\u4e48\u529e\uff0c\u901a\u5e38\u89e3\u51b3\u65b9\u6848\u6709\u4e24\u79cd\uff1a \uff081\uff09\u9700\u8981\u8fdb\u884c\u5411\u4e0b\u6ed1\u52a8\uff0c\u8fd9\u91cc\u5c31\u6d89\u53ca\u5230\u76f8\u5e94\u7684\u8bc6\u522b\u65b9\u6848\uff0c\u5224\u65ad\u5982\u679c\u4e0d\u5728\u7b2c\u4e00\u9875\u5c31\u5f80\u4e0b\u6ed1\u52a8\u7ffb\u9875\u3002 \uff082\uff09\u542f\u52a8\u5668\u63d0\u4f9b\u641c\u7d22\u7684\u529f\u80fd\uff0c\u8f93\u5165\u5e94\u7528\u540d\u79f0\u641c\u7d22\uff0c\u7136\u540e\u8fdb\u884c\u70b9\u51fb\u3002 \u4ece\u5b9e\u9645\u64cd\u4f5c\u4e2d\u6765\u770b\uff0c\u91c7\u7528\u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u6548\u7387\u4f1a\u9ad8\u4e00\u70b9\u3002 \u3010\u7ec8\u7aef\u547d\u4ee4\u542f\u52a8\u3011 \u5728python\u4e2d\uff0c\u4f7f\u7528os.popen()\u6216os.system()\u6216\u8005subprocess.Popen()\uff0c\u5b9e\u73b0\u547d\u4ee4\u884c\u542f\u52a8\uff0c\u6bd4\u5982\uff1a import os\nos.popen('deepin-music')\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u8fdc\u7a0b\u6267\u884c\u811a\u672c\u7684\u65f6\u5019\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u7684\u95ee\u9898\u3002 \u3010\u603b\u7ed3\u3011 \u4ee5\u4e0a\u51e0\u79cd\u65b9\u6cd5\uff0c\u5404\u6709\u4f18\u7f3a\u70b9\uff0c\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff1a \uff081\uff09\u5982\u679c\u9700\u8981\u5728Jenkins\u4e2d\u505a\u6301\u7eed\u96c6\u6210\uff0c\u5efa\u8bae\u4f7f\u7528\u7b2c\u4e8c\u79cd\u4efb\u52a1\u680f\u542f\u52a8\u7684\u65b9\u6cd5\u3002 \uff082\uff09\u5982\u679c\u4e0d\u4f1a\u91c7\u7528\u8fdc\u7a0b\u6267\u884c\u7684\uff0c\u5efa\u8bae\u91c7\u7528\u7b2c\u4e00\u79cd\u6216\u8005\u6700\u540e\u4e00\u79cd\u65b9\u6848\u3002 \uff083\uff09\u7b2c\u4e09\u79cd\u548c\u7b2c\u56db\u79cd\u542f\u52a8\u65b9\u6cd5\uff0c\u901a\u5e38\u5728\u6d4b\u8bd5\u7528\u4f8b\u4e2d\u4f1a\u6d89\u53ca\u5230\uff0c\u6240\u4ee5\u5076\u5c14\u4f1a\u7528\u3002"},{"location":"RELEASE/","title":"\u7248\u672c\u66f4\u65b0\u8bb0\u5f55","text":""},{"location":"RELEASE/#2122023822","title":"2.1.2\uff082023/8/22\uff09","text":"new \u589e\u52a0 OCR \u8bc6\u522b\u81ea\u52a8\u91cd\u8bd5\u673a\u5236\uff0c\u9ed8\u8ba4\u91cd\u8bd5 2 \u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u91cd\u8bd5\u6b21\u6570\uff1b \u4f7f\u7528\u7a97\u7ba1\u6700\u65b0\u63d0\u4f9b\u7684\u4e8c\u8fdb\u5236\u63a5\u53e3\uff0c\u4f18\u5316\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u5728 Wayland \u4e0b\u83b7\u53d6\u7a97\u53e3\u4fe1\u606f\u7684\u65b9\u6cd5\uff1b\u611f\u8c22\u684c\u9762\u6d4b\u8bd5\u90e8 @\u4f55\u6743 @\u5b59\u7fe0 \u3001\u7a97\u7ba1\u7814\u53d1 @\u9ec4\u6cfd\u94ed \u7684\u5927\u529b\u652f\u6301\u3002 \u6269\u5145 skipif \u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\u51fd\u6570\uff1a skipif_xdg_type \u652f\u6301 x11 \u6216 wayland \u4e0a\u8df3\u8fc7\uff1b skipif_cpu_name \u652f\u6301\u4e0d\u540c cpu \u4e0a\u8df3\u8fc7\uff0c\u6bd4\u5982\uff1askipif_cpu_name-KLVVW5821\uff1b "},{"location":"RELEASE/#2102023818","title":"2.1.0\uff082023/8/18\uff09","text":"fix \u4fee\u590d SW \u67b6\u6784\u73af\u5883\u4f9d\u8d56\u7684\u95ee\u9898\uff0c\u539f\u56e0\u662f\u4e4b\u524d\u6211\u8fd9\u91cc\u672c\u5730\u6ca1\u6709 SW \u7684\u673a\u5668\uff0c\u6ca1\u6709\u505a\u76f8\u5173\u9002\u914d\uff1b \u4fee\u590d\u5b50\u9879\u76ee\u5355\u72ec\u9700\u8981\u4e09\u65b9\u5305 pexpect\uff0c\u7531\u4e8e\u4e4b\u524d\u662f\u9884\u88c5\u5230\u955c\u50cf\u91cc\u9762\u7684\uff0c\u4f46\u57fa\u7840\u6846\u67b6\u4e0d\u9700\u8981\uff0c\u56e0\u6b64\u6ca1\u6709\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u91cc\u9762\uff0c\u5bfc\u81f4\u5b50\u9879\u76ee\u4f9d\u8d56\u62a5\u9519\u3002 \u4fee\u590d\u5b50\u9879\u76ee cv \u5bfc\u5165\u62a5\u9519\u7684\u95ee\u9898\uff1b \u539f\u56e0\u4e3a\uff1ayouqu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u517c\u5bb9\u4e24\u79cd\u60c5\u51b5\uff0c\u4e00\u79cd\u662f\u9762\u5411\u670d\u52a1\uff0c\u5c31\u662f\u672c\u5730\u6d4b\u8bd5\u673a\u4e0d\u9700\u8981\u5b89\u88c5 OpenCV\uff0c\u7528\u4f8b\u4e2d\u7684\u56fe\u50cf\u8bc6\u522b\u4f1a\u901a\u8fc7\u8fdc\u7a0b\u670d\u52a1\u63a5\u53e3\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u548c\u7ed3\u679c\u83b7\u53d6\uff1b\u7b2c\u4e8c\u79cd\u662f\u539f\u751f\uff0c\u5c31\u662f\u672c\u5730\u76f4\u63a5\u5b89\u88c5 OpenCV \u76f4\u63a5\u7528\u3002\u4e24\u4e2a\u60c5\u51b5\u7684\u4f18\u5148\u7ea7\u662f\u4f18\u5148\u5224\u65ad\u672c\u5730\u5b58\u5728\uff0c\u5426\u5219\u8d70\u670d\u52a1\u3002 \u524d\u9762\u6211\u4eec\u5df2\u7ecf\u628a OCR \u529f\u80fd\u505a\u4e86\u670d\u52a1\u5316\uff0c\u57fa\u4e8e 1 \u5e74\u591a\u4ee5\u6765\u7684\u89c2\u5bdf\uff0c\u7528\u8d77\u6765\u5f88\u7a33\u5b9a\uff0c\u518d\u4e00\u4e2a\u5c31\u662f OpenCV \u5b89\u88c5\u5305\u662f\u6bd4\u8f83\u81c3\u80bf\u7684\uff0c\u7c97\u7565\u6570\u4e86\u4e0b\u4f9d\u8d56\u6709 30+ \u4e2a\uff0c\u800c\u4e14\u5728\u5404\u67b6\u6784\u4e0a\u4f9d\u8d56\u5305\u8fd8\u4e0d\u5c3d\u76f8\u540c\uff0c\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u65b9\u6848\u4e2d\u4e0d\u592a\u597d\u5904\u7406\uff0c\u6240\u4ee5\u672c\u6b21 2.0 \u7248\u672c\u6211\u4eec\u5927\u80c6\u7684\u5c06\u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u529f\u80fd\u4fee\u6539\u4e3a\u9762\u5411\u670d\u52a1\u7684\u65b9\u5f0f\uff0c\u524d\u671f\u6d4b\u8bd5\u4e00\u5207\u770b\u8d77\u6765\u90fd\u5f88\u548c\u8c10\u3002 \u4f46\u662f\u6ca1\u6ce8\u610f\u5230\u4e4b\u524d\u7ed9\u6d77\u71d5\u59d0\u90a3\u8fb9\u9879\u76ee\u5355\u72ec\u5b9a\u5236\u505a\u4e86\u4e2a\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\uff08\u4e3a\u4e86\u80fd\u7b80\u5355\u5e73\u6ed1\u7684\u8fc1\u79fb\u5230 youqu\uff09\uff0c\u6b64\u63a5\u53e3\u5e95\u5c42\u6ca1\u6709\u517c\u5bb9\u670d\u52a1\u5316\uff0c\u6240\u4ee5\u5979\u90a3\u8fb9\u7684\u9879\u76ee\u8c03\u7528\u6b64\u5b9a\u5236\u63a5\u53e3\u4f1a\u62a5 cv \u5bfc\u5165\u7684\u95ee\u9898\u3002 \u7531\u4e8e\u5c06\u8fd9\u4e2a\u5b9a\u5236\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\u8fdb\u884c\u670d\u52a1\u5316\u517c\u5bb9\u6539\u9020\u9700\u8981\u4e00\u5b9a\u65f6\u95f4\uff0c\u6539\u5b8c\u8fd8\u9700\u8981\u6d4b\u8bd5\uff0c\u4f46\u672c\u6b21\u65f6\u95f4\u6bd4\u8f83\u7d27\uff0c\u56e0\u6b64\u5148\u628a OpenCV \u88c5\u8fdb\u865a\u62df\u73af\u5883\uff0c\u540e\u7eed\u7248\u672c\u518d\u8003\u8651\u9488\u5bf9\u6b64\u63a5\u53e3\u505a\u4fee\u6539\u3002"},{"location":"RELEASE/#2002023816","title":"2.0.0\uff082023/8/16\uff09","text":"YouQu\uff08\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff09\u5f00\u6e90\u4e86\uff0c\u540c\u65f6\u63a8\u51fa\u4e86 2.0 \u7248\u672c\u3002 \u611f\u8c22\u738b\u6ce2\u603b\u3001\u67b6\u6784\u5e08\u5f90\u5c0f\u4e1c\u3001\u7814\u53d1\u7ecf\u7406\u90d1\u5e7c\u6208\u3001\u5218\u90d1\u7b49\u7814\u53d1\u540c\u4e8b\u7684\u5927\u529b\u652f\u6301\u3002 new 1\u3001\u65b0\u7684\u57fa\u7840\u6846\u67b6\u4ee3\u7801\u83b7\u53d6\u65b9\u5f0f\u53ca\u65b0\u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4 YouQu \u540e\u7eed\u5747\u901a\u8fc7 PyPI \u8fdb\u884c\u5305\u7684\u53d1\u5e03\uff0c\u4e5f\u5c31\u662f\u8bf4\u540e\u7eed\u53ef\u4ee5\u4f7f\u7528 pip \u8fdb\u884c\u5b89\u88c5\uff1a sudo pip3 install youqu==2.0.0\n \u8fd9\u91cc\u6709 2 \u4e2a\u5c0f\u70b9\u8981\u6ce8\u610f\uff1a \u63a8\u8350\u4f7f\u7528 sudo pip3 \uff08\u52a0 sudo\uff09\u8fdb\u884c\u5b89\u88c5\uff1b \u5982\u679c\u4e0d\u52a0 sudo \u6709\u4e9b\u673a\u5668\u53ef\u80fd $HOME/.local/bin \u4e0d\u5728\u7cfb\u7edf PATH \u73af\u5883\u76ee\u5f55\u4e0b\uff0c\u5728\u4e0d\u6dfb\u52a0\u73af\u5883\u53d8\u91cf\u7684\u60c5\u51b5\u4e0b\uff0c\u4f1a\u51fa\u73b0 YouQu \u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4\uff08youqu-startproject\uff09\u65e0\u6cd5\u4f7f\u7528\u7684\u95ee\u9898\uff1b \u5f53\u7136\uff0c\u5c06\u4e0a\u8ff0\u8def\u5f84\u6dfb\u52a0\u5230\u73af\u5883\u53d8\u91cf\u4e4b\u540e\u4e5f\u662f\u53ef\u4ee5\u7528\u7684\uff0c\u6240\u4ee5\u6211\u8fd9\u91cc\u662f\u63a8\u8350\u52a0 sudo\uff0c\u4e0d\u52a0 sudo \u4e5f\u662f\u53ef\u4ee5\u7684\uff0c\u53ea\u662f\u9700\u8981\u5173\u6ce8\u4e0b\u73af\u5883\u53d8\u91cf\u7684\u95ee\u9898\u3002 \u63a8\u8350\u6307\u5b9a\u7248\u672c\u53f7\uff08youqu==2.0.0\uff09\u5b89\u88c5\uff0c\u5982\u679c\u4e0d\u6307\u5b9a\u7248\u672c\u53f7\u9ed8\u8ba4\u662f\u5b89\u88c5\u6700\u65b0\u53d1\u5e03\u7684 YouQu \u7248\u672c\uff0c\u4f60\u53ef\u4ee5\u5728 PyPI \u4e0a\u7684 Release history \u91cc\u9762\u67e5\u770b\u6709\u54ea\u4e9b\u7248\u672c\u3002 \u5b89\u88c5\u4e4b\u540e\u4f1a\u81ea\u52a8\u751f\u6210\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu-startproject\uff0c\u4f7f\u7528\u5b83\u53ef\u4ee5\u521d\u59cb\u5316\u5de5\u7a0b\uff0c\u8fd9\u91cc\u4ee5\u97f3\u4e50\u4e3e\u4f8b\uff1b youqu-startproject autotest_deepin_music\n \u8fd9\u6837\u5c31\u4f1a\u5728\u5f53\u524d\u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a autotest_deepin_music \u76ee\u5f55\uff0c\u91cc\u9762\u5305\u542b\u4e86\u57fa\u7840\u6846\u67b6\u6240\u6709\u7684\u4ee3\u7801\uff1b \u4e4b\u540e\uff0c\u8fd8\u662f\u5728 apps \u76ee\u5f55\u4e0b\uff0c\u653e\u5165\u5b50\u9879\u76ee\u7684AT\u4ee3\u7801\u5373\u53ef\uff0c\u4f7f\u7528\u65b9\u6cd5\u548c\u8fc7\u53bb\u4e00\u6837\uff0c\u8fd9\u91cc\u5c31\u4e0d\u591a\u4ecb\u7ecd\u3002 \u53e6\u5916\uff0c\u9664\u4e86\u901a\u8fc7 pip \u83b7\u53d6\u4ee5\u5916\uff0c\u4ecd\u7136\u53ef\u4ee5\u901a\u8fc7\u6e90\u7801\u83b7\u53d6\uff08\u76f4\u63a5 git clone\uff09\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u4f7f\u7528 pip \u5b89\u88c5 YouQu \u65f6\uff0cYouQu \u5305\u7684\u5927\u5c0f\u624d 600+ k\uff0c\u5b89\u88c5\u901f\u5ea6\u8d77\u98de\u3002 2\u3001\u65b0\u7684AT\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848 \u4e3a\u4e86\u89e3\u51b3\u4ee5\u4e0b\u95ee\u9898\uff1a \u8fc7\u53bb\u4e00\u6bb5\u65f6\u95f4\u54b1\u4eec\u7ecf\u5e38\u51fa\u73b0\u7684\uff0c\u4e0d\u540c\u7684AT\u9879\u76ee\u5728\u540c\u4e00\u53f0\u673a\u5668\u4e0a\u90e8\u7f72\u73af\u5883\u65f6\u4f9d\u8d56\u7248\u672c\u51b2\u7a81\u7684\u95ee\u9898\uff0c\u65b0\u65b9\u6848\u4e0d\u540c\u7684\u9879\u76ee\u4f1a\u52a8\u6001\u751f\u6210\u81ea\u5df1\u7684\u865a\u62df\u73af\u5883\uff0c\u76f8\u4e92\u4e4b\u95f4\u4e0d\u5f71\u54cd\uff1b \u4e1a\u5185\u4e3a\u4e86\u89e3\u51b3\u7248\u672c\u51b2\u7a81\u95ee\u9898\u4e00\u822c\u90fd\u4f1a\u4f7f\u7528Python\u865a\u62df\u73af\u5883\u7684\u5de5\u5177\uff0c\u4f46\u662f\u90fd\u6709\u4e2a\u95ee\u9898\uff0c\u65e0\u6cd5\u7ba1\u7406 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u5305\uff0c\u672c\u6b21\u6211\u4eec\u89e3\u51b3\u4e86\u8fd9\u4e2a\u95ee\u9898\uff0c\u80fd\u591f\u5b8c\u5168\u7ba1\u7406\u5e38\u89c4\u7684Python\u5305\uff0c\u4e5f\u80fd\u7ba1\u7406\u5230 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u4e09\u65b9\u5305\uff1b \u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u4f7f\u7528\u65b9\u6cd5\uff1a bash env.sh\n \u53ef\u4ee5\u770b\u51fa\u6765\u548c\u539f\u6765\u4f7f\u7528\u65b9\u6cd5\u6ca1\u6709\u53d8\u5316\uff0c\u4e5f\u5c31\u662f\u8bf4\u4ece\u4f7f\u7528\u7684\u89d2\u5ea6\u662f\u5b8c\u5168\u6ca1\u6709\u533a\u522b\u7684\uff0c\u53ea\u662f\u5185\u90e8\u505a\u4e86\u4e0d\u540c\u7684\u4e8b\u60c5\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u672c\u673a\u90e8\u7f72\u7684\u529f\u80fd\u4ecd\u7136\u4fdd\u7559 env_dev.sh\uff0c\u53ef\u4ee5\u4f5c\u4e3a\u5f00\u53d1\u65f6\u7684\u73af\u5883\u90e8\u7f72\u3002 3\u3001\u65b0\u7684\u9a71\u52a8\u547d\u4ee4 \u8fc7\u53bb\u54b1\u4eec\u90fd\u662f\u4f7f\u7528\u8fd9\u6837\u7684\u547d\u4ee4\u6765\u9a71\u52a8\u6267\u884c\uff1a python3 manage.py run\n \u7531\u4e8e\u9ed8\u8ba4\u57fa\u4e8e\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848\uff0c\u56e0\u6b64\u6211\u4eec\u589e\u52a0\u4e86\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu\uff1b \u65b0\u7684\u9a71\u52a8\u65b9\u5f0f\uff1a youqu manage.py run\n \u53ea\u9700\u8981\u628a python3 \u66ff\u6362\u6210 youqu \u5c31\u53ef\u4ee5\u4e86\uff0c\u770b\u8d77\u6765\u5f88\u548c\u8c10~ 4\u3001\u65b0\u7684\u6587\u6863\u5730\u5740 \u8fc7\u53bb\u54b1\u4eec YouQu \u7684\u5728\u7ebf\u6587\u6863\u662f\u90e8\u7f72\u5728\u516c\u53f8\u5185\u7f51\u7684\uff0c\u73b0\u5728\u5f00\u6e90\u5230 github \u4e86\uff0c\u5916\u90e8\u5f00\u53d1\u8005\u80af\u5b9a\u8bbf\u95ee\u4e0d\u5230\u5185\u7f51\u7684\u6587\u6863\uff0c\u56e0\u6b64\u9700\u8981\u5c06\u6587\u6863\u90e8\u7f72\u5230\u516c\u7f51\u3010\u516c\u7f51\u6587\u6863\u3011\uff1b \u516c\u7f51\u6587\u6863\u4f7f\u7528\u7684\u662f github pages\uff08\u767d\u5ad6\u602a\u4e00\u987f\u72c2\u559c~~\uff09\uff0c\u4f46\u53ef\u80fd\u4f1a\u51fa\u73b0\u6587\u6863\u901f\u5ea6\u6162\u7684\u95ee\u9898\uff08\u4ee3\u7406\u4e0b\u5c31\u597d\u4e86\uff09\uff0c\u4e0d\u8fc7\u6ca1\u5173\u7cfb\uff0c\u54b1\u4eec\u3010\u5185\u7f51\u6587\u6863\u3011\u4ecd\u7136\u4fdd\u7559\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u3002 5\u3001\u5176\u4ed6\u4e00\u4e9b\u5c0f\u5c0f\u529f\u80fd\u66f4\u65b0\uff1a \uff081\uff09\u65b0\u589e\u5173\u95ed\u5206\u8fa8\u7387\u68c0\u6d4b\u7684\u53c2\u6570\u503c\uff1b youqu manage.py run --resolution no\n \u6216\u8005\u4fee\u6539 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387, \u6bd4\u5982\uff1a1920x1080\n;no: \u8868\u793a\u4e0d\u505a\u5206\u8fa8\u7387\u6821\u9a8c\nRESOLUTION = 1920x1080\n resolution \u8fd9\u4e2a\u53c2\u6570\u4e00\u76f4\u90fd\u6709\u7684\uff0c\u53ea\u4e0d\u8fc7\u4e4b\u524d\u662f\u7528\u4e8e\u6307\u5b9a\u5206\u8fa8\u7387\u5927\u5c0f\uff0c\u6bd4\u5982 --resolution 1920x1080\uff0c\u4f46\u6709\u4e9b\u63a5\u53e3\u7684\u9879\u76ee\u4e0d\u9700\u8981\u8fd9\u4e2a\u68c0\u67e5\uff0c\u53ef\u4ee5\u7ed9\u5b83\u4e2a no \u5c31\u597d\u4e86\uff0c\u5f53\u7136 CICD \u4e0a\u5173\u95ed\uff0c\u9700\u8981\u6d41\u6c34\u7ebf\u4e0a\u628a\u8fd9\u4e2a\u53c2\u6570\u52a0\u4e0a\uff1b \uff082\uff09\u65b0\u589e\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u7684\u547d\u4ee4\u884c\u53c2\u6570 \u4e4b\u524d\u8fd9\u4e2a\u914d\u7f6e\u9879\u53ea\u80fd\u5728 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c 1 \u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff0cRERUN >= RECORD_FAILED_CASE\u3002\n;1.\u5173\u95ed\u5f55\u5c4f\uff1aRECORD_FAILED_CASE > RERUN\n;2.\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1aRECORD_FAILED_CASE = 0\nRECORD_FAILED_CASE = 1\n \u73b0\u5728\u5c06\u5f00\u53d1\u5230\u547d\u4ee4\u884c\u53c2\u6570\u3002 youqu manage.py run --record_failed_case 2\n fix \u4fee\u590d remote \u6267\u884c\u65f6\uff0c\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u65e0\u6cd5\u751f\u6210\u6d4b\u8bd5\u62a5\u544a\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1302023710","title":"1.3.0\uff082023/7/10\uff09","text":"fix \u8fdb\u4e00\u6b65\u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b\u53c2\u8003\uff1a\u914d\u7f6ePython\u6e90\u7684\u51e0\u79cd\u65b9\u6cd5 \u4fee\u590d wayland_autotool \u53d7\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86wayland\u4e0b\u5076\u73b0\u627e\u4e0d\u5230 .Xauthority \u6587\u4ef6\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1292023626","title":"1.2.9\uff082023/6/26\uff09","text":"fix \u4f18\u5316\u8fdc\u7a0b\u6267\u884c remote \u7684\u53c2\u6570\u76f4\u63a5\u4f20\u7ed9\u8fdc\u7a0b\u673a\u5668\u7684 run \u547d\u4ee4\uff0c\u4e0d\u7528\u518d\u5355\u72ec\u5904\u7406\u8fdc\u7a0b\u6267\u884c\u7684\u53c2\u6570\u903b\u8f91\uff0c\u540e\u7eed\u4e13\u6ce8\u4e8e\u672c\u5730\u6267\u884c\u529f\u80fd\u5f00\u53d1\uff0c\u8fdc\u7a0b\u6267\u884c\u81ea\u52a8\u9002\u7528\uff1b env.sh \u79fb\u9664 pyyaml \u5b89\u88c5\uff0c\u7531\u5b50\u9879\u76ee\u5728 requirement.txt \u91cc\u9762\u5b9a\u4e49\uff0c\u6846\u67b6\u81ea\u52a8\u52a0\u8f7d\uff1b \u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b "},{"location":"RELEASE/#128202369","title":"1.2.8\uff082023/6/9\uff09","text":"fix \u4fee\u590d\u4e86 pypi \u5b89\u88c5 numpy \u5b58\u5728\u7cfb\u7edf\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#127202368","title":"1.2.7\uff082023/6/8\uff09","text":"fix env.sh \u4e2d\u5b89\u88c5 Python \u5305\u672a\u6307\u5b9a\u7248\u672c\u65f6\uff0c\u65e5\u5fd7\u8f93\u51fa\u5b89\u88c5\u7684\u7248\u672c\uff1b pdocr-rpc 2.0.1\nallure-custom 1.2.1\nfunnylog 1.1.3\n \u4fee\u590d -f \u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u62a5\u9519\u7684\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#126202367","title":"1.2.6\uff082023/6/7\uff09","text":"fix \u4fee\u590d wayland \u4e0a\u8c03\u7528\u9f20\u6807\u4e2d\u952e\u3001\u53f3\u952e\u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b \u4fee\u590d pubilic/dde_desktop_public_widget \u91cc\u9762\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u5b9a\u4f4d\u684c\u9762\u6587\u4ef6\u7684\u65b9\u6cd5\uff0c\u5750\u6807\u6ca1\u6709\u62c6\u5305\u7684\u95ee\u9898\uff1b \u4f18\u5316\u4e86\u7b49\u5f85\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b pycreeze \u7248\u672c\u5347\u7ea7\u5230 0.1.29\uff0c\u5bfc\u81f4\u4e0e pyautogui 0.9.53 \u4e0d\u517c\u5bb9\uff0cenv.sh \u91cc\u9762\u589e\u52a0\u6307\u5b9a pycreeze \u7248\u672c\u4e3a 0.1.28\uff1b "},{"location":"RELEASE/#1252023516","title":"1.2.5\uff082023/5/16\uff09","text":"new --app \u53c2\u6570\u540e\u9762\u65b0\u589e\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u76ee\u524d\u652f\u6301\u4e09\u79cd\u53c2\u6570\u4f20\u5165\u65b9\u5f0f\uff1a ~$: youqu run -a deepin-music\n~$: youqu run -a autotest_deepin_music\n~$: youqu run -a apps/autotest_deepin_music\n \u200b \u540e\u4e24\u79cd\u5165\u53c2\u65b9\u5f0f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\u3002 remote \u8fdc\u7a0b\u6267\u884c\u65b0\u589e\u4ece\u547d\u4ee4\u884c\u4f20\u5165\u6d4b\u8bd5\u673a\u4fe1\u606f\uff0c\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679c password \u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6 setting/remote.ini \u4e2d CLIENT_PASSWORD \u7684\u503c,\u6bd4\u5982\uff1auos@10.8.13.33:1 \u6216 uos@10.8.13.33 \uff1b python3 manage.py remote -c uos@10.8.13.33/uos@10.8.13.34\npython3 manage.py remote -c uos@10.8.13.33:1/uos@10.8.13.34:2\n fix \u65e5\u5fd7\u6a21\u5757\u4fee\u6539\u4e3a\u51fd\u6570\u6267\u884c\u4e4b\u524d\u6253\u5370\u65e5\u5fd7\uff1b \u65e5\u5fd7\u6a21\u5757\u589e\u52a0\u767d\u540d\u5355\uff0c\u901a\u8fc7\u7c7b\u540d\u5f00\u5934\uff0c\u7ed3\u675f\uff0c\u5305\u542b\u7b49\u5173\u952e\u5b57\u63a7\u5236\u9700\u8981\u6253\u5370\u7684\u51fd\u6570\u65e5\u5fd7\uff1b \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5982\u679c\u4f20\u5165\u4e86 app_name \u53ea\u4f1a\u5c06 apps \u76ee\u5f55\u4e0b app_name \u7684\u76ee\u5f55\u53d1\u9001\u5230\u6d4b\u8bd5\u673a\uff1b env.sh \u79fb\u9664 python3-dev\uff1b \u4fee\u590d Wayland \u4e0b env.sh \u73af\u5883\u5b89\u88c5\u5931\u8d25\u7684\u95ee\u9898\uff0c\u4f18\u5316\u4e86 deb \u4f9d\u8d56\u5b89\u88c5\u7684\u903b\u8f91\uff1b \u5c06 env.sh \u5237\u65b0\u6e90\u7684\u65e5\u5fd7\u5728\u7ec8\u7aef\u663e\u793a\uff0c\u89e3\u51b3\u5728 CI \u73af\u5883\u4e0b\uff0c\u957f\u65f6\u95f4\u4e0d\u8f93\u51fa\u65e5\u5fd7\u8fde\u63a5\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d1060 \u534e\u4e3a\u673a\u578b\u5b89\u88c5\u952e\u9f20\u5de5\u5177\u65f6\u4f9d\u8d56\u4e0d\u517c\u5bb9\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1242023227","title":"1.2.4\uff082023/2/27\uff09","text":"fix \u4fee\u6539 CURRENT \u6587\u4ef6\uff1b "},{"location":"RELEASE/#1232023227","title":"1.2.3\uff082023/2/27\uff09","text":"new pylint.sh \u652f\u6301\u901a\u8fc7\u4f4d\u7f6e\u53c2\u6570\u4f20\u5165\u6587\u4ef6\u8def\u5f84\uff1abash pylint.sh apps/autotest_deepin_music,\u597d\u5904\u662f\u53c2\u6570\u8def\u5f84\u53ef\u4ee5\u5728\u7ec8\u7aef\u8865\u5168\uff1b \u65b0\u589e\u7cfb\u7edf\u547d\u4ee4 youqu-pylint \uff0c\u7528\u4e8e\u9759\u6001\u4ee3\u7801\u626b\u63cf\uff0c\u4f7f\u7528\u65b9\u6cd5: youqu-pylint apps/autotest_deepin_music\uff1b \u7531\u4e8e\u7cfb\u7edf\u4e00\u4e9b dbus \u63a5\u53e3\u6539\u53d8\uff0c\u516c\u5171\u5e93\u4e2d\u7684 dbus \u65b9\u6cd5\u5c06\u4e0d\u518d\u7ef4\u62a4\uff0c\u7531\u5b50\u9879\u76ee\u5728 other_widget.py \u91cc\u9762\u8fdb\u884c\u7ef4\u62a4\uff1b fix \u4fee\u590d ssh \u73af\u5883\u4e0b\u8fd0\u884c\u63d0\u793a \u201c\u65e0\u6cd5\u8fde\u63a5\u201d \u7684\u95ee\u9898\uff1b \u4fee\u590d\u8fd0\u884c\u65f6\u7a0b\u5e8f\u9000\u51fa\uff0c\u4e0d\u8f93\u51fa\u5f02\u5e38\u65e5\u5fd7\u7684\u95ee\u9898\uff1b \u4fee\u590dyouqu remote xxx \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5728\u670d\u52a1\u7aef Ctrl + C \u65e0\u6cd5\u505c\u6b62\u7a0b\u5e8f\u8fd0\u884c\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#122202328","title":"1.2.2\uff082023/2/8\uff09","text":"new \u65b0\u589e\u6c14\u6ce1\u7c7b\u56fe\u50cf\u8bc6\u522b\u65b9\u6848\uff1bimage_utils.py::ImageUtil::get_during\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u533a\u57df\u8bc6\u522b\uff0c\u4f20\u5165 [x, y, w, h]\uff0cx: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u76ee\u6807\u56fe\u7247\uff0c\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\uff1b env.sh \u79fb\u9664 pypinyin; \u4f18\u5316\u6267\u884c env.sh \u65f6\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b manage.py \u79fb\u9664\u4e86\u53c2\u6570 session_timeout \uff0c\u6846\u67b6\u6839\u636e\u5168\u5c40\u7684 timeout \u4ee5\u53ca\u7528\u4f8b\u81ea\u5b9a\u4e49\u7684 timeout \u81ea\u52a8\u8ba1\u7b97\u51fa sessiontimeout \u7684\u503c\uff1b \u65b0\u589e ocr \u670d\u52a1\u5668\u94fe\u63a5\u91cd\u8bd5\uff0c\u9ed8\u8ba4\u91cd\u8bd51\u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u53c2\u6570\uff1b fix \u4fee\u590d\u4e86\u4e00\u4e9b pylint \u626b\u63cf\u7684\u4ee3\u7801\u98ce\u683c\u95ee\u9898\uff1b \u91cd\u65b0\u8bbe\u8ba1\u4e86\u6d4b\u8bd5\u62a5\u544a\u4e3b\u9898\uff1b "},{"location":"RELEASE/#121202316","title":"1.2.1\uff082023/1/6\uff09","text":"new \u652f\u6301\u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6267\u884c\u7528\u4f8b\uff1b\u53ef\u5c06python3 manage.py \u66ff\u6362\u4e3a youqu \uff1a youqu run -a deepin-music -k 001\n RPC \u670d\u52a1 IP \u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u6307\u5b9a\u4e0d\u540c\u7684\u7aef\u53e3\uff1b \u5728\u7ebf\u6587\u6863\u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u539f\u6765\u7684\u5730\u5740 10.8.10.215 \u5c06\u4e0d\u5728\u4f7f\u7528\uff1b fix \u4fee\u590d --count \u53c2\u6570\u53ef\u80fd\u51fa\u73b0\u4e0e\u5176\u4ed6\u6846\u67b6\u7684\u5de5\u7a0b\u4f9d\u8d56\u5b58\u5728\u51b2\u7a81\uff0c\u62a5\u9519\u91cd\u590d\u6ce8\u518c\u7684\u95ee\u9898\uff1b \u4fee\u590d CI \u73af\u5883\u4e0b\u591a\u4e2a\u5de5\u7a0b\u5b58\u5728 Python \u73af\u5883\u53d8\u91cf\u6307\u5411\u9519\u8bef\uff0c\u5bfc\u5305\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u5355\u72ec\u8fd0\u884c\u65b9\u6cd5\u65f6\u65e0\u65e5\u5fd7\u8f93\u51fa\u7684 Bug\uff1b "},{"location":"RELEASE/#12020221230","title":"1.2.0\uff082022/12/30\uff09","text":"1.1.4 \u7248\u672c\u9002\u914d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e14\u65b0\u589e\u4e86\u8f83\u591a\u65b0\u7279\u6027\uff0c\u6211\u4eec\u8ba1\u5212\u4f7f\u7528 1.1.4 \u7248\u672c\u8fd0\u884c\u4e00\u6bb5\u65f6\u95f4\uff0c1.2.0 \u7248\u672c\u5c06\u4fee\u590d\u671f\u95f4\u51fa\u73b0\u7684 Bug\uff0c\u7136\u540e\u4f5c\u4e3a\u7a33\u5b9a\u7248\u672c\u53d1\u5e03\u3002 new \u4fee\u6539\u5de5\u7a0b\u540d\u79f0\u4e3a youqu\uff1b \u5c06 sphinx \u6587\u6863\u5de5\u7a0b\u8fc1\u79fb\u5230\u5355\u72ec\u7684\u4ed3\u5e93\uff1b fix \u4fee\u590d startapp \u521b\u5efa\u5de5\u7a0b\u65f6\u5b58\u5728\u5de5\u7a0b\u540d\u79f0\u65f6\u65e0\u6cd5\u7ee7\u7eed\u521b\u5efa\uff1b \u4fee\u590d\u4e86 OCR \u670d\u52a1\u5728\u5e76\u53d1\u65f6\u53ef\u80fd\u51fa\u73b0\u65e0\u6cd5\u8fd4\u56de\u7ed3\u679c\u7684\u95ee\u9898\uff0c\u63d0\u5347 OCR \u670d\u52a1\u9ad8\u5e76\u53d1\u7a33\u5b9a\u6027\uff1b \u4fee\u590d PMS \u540c\u6b65\u6807\u7b7e\u5230 CSV \u6587\u4ef6\u4e0d\u652f\u6301\u7528\u4f8b\u5e93\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11420221214","title":"1.1.4\uff082022/12/14\uff09","text":"new \u65b0\u589e startapp \u5b50\u547d\u4ee4\u521b\u5efa\u5b50\u9879\u76ee\u5de5\u7a0b\u6a21\u677f: python3 manage.py startapp autotest_deepin_xxx \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u91cd\u590d\u6267\u884c\u6b21\u6570\uff1b \u53bb\u6389\u6279\u91cf\u6267\u884c\u524d\u6536\u96c6\u7528\u4f8b\u7684\u6b65\u9aa4\uff1b \u589e\u52a0\u5f00\u59cb\u6267\u884c\u65f6\u6253\u5370\u4e00\u4e9b\u6267\u884c\u53c2\u6570\uff0c\u5982\uff1a \u7528\u4f8b\u6536\u96c6\u6570\u91cf: 99\n\u5931\u8d25\u91cd\u8dd1\u6b21\u6570: 1\n\u6700\u5927\u5931\u8d25\u6b21\u6570: 49\n\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4: 200.0s (03\u520620\u79d2)\n\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4: 11880s (3\u5c0f\u65f618\u52060\u79d2)\n \u5b9a\u5236\u4fee\u6539allure\u62a5\u544alogo\u3001title\u3001\u9ed8\u8ba4\u8bed\u8a00\uff1b manage.py \u6267\u884c\u5f00\u59cb\u65f6\u6253\u5370 logo \u548c\u5f53\u524d\u7248\u672c\uff1a \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u255a\u2588\u2588\u2557 \u2588\u2588\u2554\u255d \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2584\u2584 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2580\u2580\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u2584\u2588 \u2584\u2588 \u2588 \u2588 \u2588 \u2584 \u2588 \u2584 \u2580\u2580\u2588 \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\uff1b \u88c5\u9970\u5668\u65b9\u6cd5\u6307\u5b9a\u6b21\u6570\uff1b @pytest.mark.count(2)\ndef test_music_001():\npass\n \u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u6b21\u6570\uff1b python3 manage.py run -a deepin-music -k 001 --count 2\n \u200b image_utils \u589e\u52a0\u51fd\u6570 save_temporary_picture\uff0c\u652f\u6301\u6307\u5b9a\u5c4f\u5e55\u533a\u57df\u622a\u56fe\u5e76\u8fd4\u56de\u56fe\u7247\u5b58\u653e\u7684\u672c\u5730\u8def\u5f84\uff0c\u540e\u7eed\u4f7f\u7528 assert_image_exist \u8fdb\u884c\u65ad\u8a00 Python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(x, y, width, height) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) button_center \u65b0\u589e btn_size \u83b7\u53d6\u63a7\u4ef6\u5de6\u4e0a\u89d2\u5750\u6807\u53ca\u957f\u5bbd\uff0c\u7528\u4e8e\u52a8\u6001\u7684\u622a\u53d6\u5143\u7d20\u7684\u56fe\u7247\uff0c\u53ef\u7528\u4e8e\u5b9a\u4f4d\u65ad\u8a00 python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u6240\u6709\u97f3\u4e50\u6309\u94ae\")) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) allure \u62a5\u544a\u4e2d\u5b9a\u4f4d\u95ee\u9898\u9664\u4e86\u65e5\u5fd7\u3001\u622a\u56fe\u3001\u5f55\u5c4f\u5916\uff0c\u8c03\u7528\u7684\u51fd\u6570\u589e\u52a0\u4e86 step \u6b65\u9aa4\u5c55\u793a\uff1b env.sh \u65b0\u589e\u5b89\u88c5\u5b50\u9879\u76ee Python \u4e09\u65b9\u4f9d\u8d56\uff0c\u5728\u5b50\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u5199 requirement.txt \u6587\u4ef6\uff0cenv.sh \u4f1a\u81ea\u52a8\u52a0\u8f7d\uff1b ocr \u8bc6\u522b\u65b0\u589e\u652f\u6301\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\u8fdb\u884c\u6587\u5b57\u8bc6\u522b\uff0c\u51cf\u5c11\u56e0\u5168\u5c4f\u8bc6\u522b\u65f6\uff0c\u5176\u4ed6\u6587\u5b57\u7684\u5e72\u6270 Python # \u65ad\u8a00\u97f3\u4e50\u7684\u5220\u9664\u5f39\u7a97\u4e2d\uff0c\u5305\u542b\u4e86\u201c\u786e\u8ba4\u201d\u7684\u6587\u5b57 self.assert_ocr_exist(\"\u786e\u8ba4\", picture_abspath=DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u5220\u9664\u5f39\u7a97\"))) \u65ad\u8a00\u51fd\u6570\u7684\u8c03\u7528\u4e5f\u4f1a\u81ea\u52a8\u6253\u5370\u65e5\u5fd7; env.sh \u65b0\u589e\u88c1\u526a\u4f9d\u8d56\u7684\u65b9\u6848\uff1b fix \u4fee\u590d Jenkins \u73af\u5883\u4e0b\uff0c apps \u76ee\u5f55\u4e0b\u5b50\u9879\u76ee\u5b58\u5728 auotest_deepin_xxx@tmp \u76ee\u5f55\uff0c\u5728\u4f20\u5165 app_name \u540e\u65e0\u6cd5\u6267\u884c\u7528\u4f8b\u7684\u95ee\u9898\uff1b \u4fee\u590d\u81ea\u52a8\u751f\u6210 case_list.csv \u6587\u4ef6\u65f6\uff0c\u7528\u4f8b\u987a\u5e8f\u88ab\u8c03\u6574\u7684\u95ee\u9898\uff1b env.sh \u73af\u5883\u5b89\u88c5\u79fb\u9664 git \u548c curl\uff1b \u4fee\u590d\u7528\u4f8b\u5728 setup \u9636\u6bb5\u62a5\u9519\u540e\uff0c\u672a\u5199\u5165 ci_result.json \u7684\u95ee\u9898\uff1b \u79fb\u9664 uos_ci.py\uff1b "},{"location":"RELEASE/#11320221028","title":"1.1.3\uff082022/10/28\uff09","text":"new \u65b0\u589e\u56fe\u50cf\u65ad\u8a00\u6210\u529f\u8f93\u51fa\u5339\u914d\u5ea6\uff1b \u65b0\u589e\u73af\u5883\u5b89\u88c5 yaml \u4f9d\u8d56\uff1b \u65b0\u589e\u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6570\u636e\u56de\u586b\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b \u65b0\u589e\u6d4b\u8bd5\u7ed3\u679c\u8868\u60c5\u663e\u793a\uff0c\u5e76\u4f18\u5316\u4e86\u65e5\u5fd7\u7684\u6392\u7248\uff1b \u65b0\u589e --top {number} \u7528\u4e8e\u8bb0\u5f55\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0c\u65e5\u5fd7\u751f\u6210\u5230 report/logs/top.log\uff1b fix \u4fee\u590d\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4f46\u7ec8\u7aef\u6ca1\u6709\u9519\u8bef\u65e5\u5fd7\u8f93\u51fa\u7684\u95ee\u9898\uff1b \u4fee\u6539\u5931\u8d25\u7528\u4f8b\u56de\u6eaf\u65e5\u5fd7\u4e3a\u8be6\u7ec6\u7ea7\u522b\uff1b \u4fee\u590d\u4e86\u6267\u884c\u8fdb\u5ea6\u672a\u8ba1\u7b97\u8df3\u8fc7\u7528\u4f8b\u7684\u95ee\u9898\uff0c\u5e76\u4f18\u5316\u4e86\u8fdb\u5ea6\u83b7\u53d6\u7684\u7b97\u6cd5\uff1b \u4fee\u590d env.sh \u5728 V23 \u73af\u5883\u4e0b\u5b89\u88c5\u65e0\u6cd5\u8bfb\u53d6\u5bc6\u7801\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 pms \u6d4b\u8bd5\u5957\u6267\u884c\u6216\u6d4b\u8bd5\u5355\u6267\u884c\u65f6\uff0c\u7528\u4f8bID\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b env.sh \u91cc\u9762 hub.deepin.com \u66f4\u6362\u6210 it.uniontech.com\uff1b uos_ci.py \u6d4b\u8bd5\u7ed3\u679c\u7edf\u8ba1\u65f6\uff0c\u603b\u6570\u5254\u9664 skip \u7684\u6570\u91cf "},{"location":"RELEASE/#11220220921","title":"1.1.2\uff082022/09/21\uff09","text":"new \u5728\u6ca1\u6709\u5b89\u88c5 dogtail \u7684\u60c5\u51b5\u4e0b\uff0c\u4e5f\u80fd\u4f7f\u7528 sniff \u5de5\u5177\uff1b fix \u4fee\u590d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e2d\u6ca1\u6709\u5b89\u88c5 AT \u73af\u5883\u6267\u884c uos_ci.py \u62a5\u9519\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11120220919","title":"1.1.1\uff082022/09/19\uff09","text":"new \u65b0\u589e\u6267\u884c\u8fdb\u5ea6\u663e\u793a\uff0c\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u65f6\u65e5\u5fd7\u8f93\u51fa\u5f53\u524d\u8fdb\u5ea6\uff1a[\u5f53\u524d\u6307\u5b9a\u7b2c\u51e0\u6761/\u7528\u4f8b\u603b\u6570]\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u7528\u4f8b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\u6240\u6709\u5931\u8d25\u7528\u4f8b\u7684\u5217\u8868\uff1b \u5173\u95ed\u7ec8\u7aef\u8f93\u51fa\u6355\u83b7\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u65e5\u5fd7\u5feb\u7167\uff1b \u4f18\u5316\u7ec8\u7aef\u8f93\u51fa\u5931\u8d25\u4fe1\u606f\u5197\u957f\u4e3a\u7b80\u8981\u4fe1\u606f\u8f93\u51fa\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u663e\u793a 10 \u4e2a\u6267\u884c\u6700\u6162\u7684\u7528\u4f8b\u5217\u8868\uff0c\u5e76\u8be6\u7ec6\u5217\u51fa\u5404\u4e2a\u9636\u6bb5\u7684\u8017\u65f6\uff1b \u5931\u8d25\u91cd\u8dd1\u7528\u4f8b\u91cd\u8dd1\u4e4b\u524d\u5ef6\u8fdf 1 \u79d2\uff1b \u65b0\u589e\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4ecd\u7136\u5f3a\u5236\u6267\u884c\uff1b \u7528\u4f8b\u6536\u96c6\u65f6\u4ec5\u5728 apps \u76ee\u5f55\u4e0b\u8fdb\u884c\uff0c\u5ffd\u7565 src,setting,public \u76ee\u5f55\uff1b \u65b0\u589e allure \u62a5\u544a\u5907\u4efd\u529f\u80fd\uff0c\u9ed8\u8ba4\u5907\u4efd\u81f3 allure_back \u76ee\u5f55\u4e0b\uff1b manage.py\u65b0\u589e\u53c2\u6570 --lastfailed \u7528\u4e8e\u53ea\u8dd1\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\u7684\u529f\u80fd\uff1b fix \u4fee\u590d\u4e86\u5728\u6ca1\u6709\u6307\u5b9a\u5e94\u7528\u540d\u79f0\u6267\u884c\u65f6\uff0cxml \u62a5\u544a\u751f\u6210\u8def\u5f84\u5f02\u5e38\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 uos_ci.py \u4f20\u5165 timeout \u548c session_timeout \u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11020220916","title":"1.1.0\uff082022/09/16\uff09","text":"new \u65b0\u589ePMS\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u652f\u6301\u591a\u79cd\u6570\u636e\u56de\u586b\u6a21\u5f0f\uff1b \u4f18\u5316\u4e86\u901a\u8fc7\u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u65f6PMS \u722c\u866b\u7684\u6027\u80fd\uff1b \u65b0\u589e .gitmodules \u6587\u4ef6\uff0c\u7528\u4e8e\u6807\u8bb0\u6240\u6709\u5b50\u9879\u76ee\uff0c\u65b9\u4fbf\u7edf\u4e00\u62c9\u53d6\u4ee3\u7801\uff1b env.sh \u9002\u914d\u793e\u533a\u7248\u4e0a\u5b89\u88c5\u81ea\u52a8\u5316\u73af\u5883\uff1b \u589e\u52a0\u6267\u884c\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u9519\u8bef\u7684\u529f\u80fd\uff1b README.md \u589e\u52a0 Wayland \u4e0b\u4f7f\u7528\u3001\u6d4b\u8bd5\u62a5\u544a\u67e5\u770b\u3001\u5e38\u89c1\u95ee\u9898\u7b49\u7684\u6587\u6863\u8bf4\u660e\uff1b \u589e\u52a0\u4e86\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u5bf9 setup\u3001call\u3001teardown \u8fdb\u884c\u65e5\u5fd7\u5206\u6bb5\uff1b fix \u4fee\u590d\u4e86 \u786e\u8ba4\u4fee\u590d \u5217\u6ca1\u5199\u8868\u5934\uff0c\u4f46\u5199\u4e86 fixed-xxx \u6807\u7b7e\uff0c\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u540c\u4e00\u5e94\u7528\u5185\u591a\u4e2a csv \u6587\u4ef6\u4e2d \u786e\u8ba4\u4fee\u590d \u5217\u6709\u7684\u5199\u4e86\uff0c\u6709\u7684\u6ca1\u5199\uff0c\u53ef\u80fd\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 INFO \u65e5\u5fd7\uff0c\u663e\u793a\u4e3a DEBUG \u7684\u95ee\u9898\uff1b\u4fee\u590d\u4e86\u90e8\u5206\u673a\u5668\u4e0a INFO \u65e5\u5fd7\u5185\u5bb9\u663e\u793a\u4e3a\u7ea2\u8272\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\u770b\u4e0d\u5230\u8be6\u7ec6\u4fe1\u606f\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10220220822","title":"1.0.2\uff082022/08/22\uff09","text":"new \u79fb\u9664 loguru\uff0c\u66ff\u6362\u4e3a logging\uff0c\u63a5\u53e3\u4fdd\u6301\u4e0d\u53d8\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u53d7\u5f71\u54cd\uff1b \u9ed8\u8ba4\u5f00\u542f coredump\uff1b fix \u4fee\u590d\u4e86\u4e09\u65b9\u5e93 loguru \u5076\u73b0\u5f02\u5e38\uff0c\u5bfc\u81f4\u7a0b\u5e8f\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7b2c\u4e00\u6b21\u5931\u8d25\u4e0d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10120220812","title":"1.0.1\uff082022/08/12\uff09","text":"new \u65b0\u589e RELEASE.md \u6587\u4ef6\uff0c\u7528\u4e8e\u8bb0\u5f55\u5386\u53f2\u53d1\u5e03\u7248\u672c\u7684\u66f4\u65b0\u5185\u5bb9\uff1b \u517c\u5bb9 Wayland \u6a21\u5f0f\u4e0b\u6267\u884c\u7528\u4f8b\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u7528\u7ba1\u5f53\u524d\u6d4b\u8bd5\u673a\u6267\u884c\u73af\u5883\uff0c\u6846\u67b6\u4f1a\u81ea\u52a8\u6839\u636e\u5f53\u524d\u73af\u5883\u8d70\u4e0d\u540c\u7684\u4ee3\u7801\u903b\u8f91\uff1b \u7531\u4e8e\u9700\u8981\u4fee\u6539 dogtail \u6e90\u4ee3\u7801\uff0c\u56e0\u6b64\u5c06\u4fee\u6539\u540e\u7684\u6e90\u7801\u653e\u5165\u5230\u6838\u5fc3\u5e93\u91cc\u9762 src/depends/dogtail \u540e\u7eed\u7248\u672c\u5c06\u4e0d\u9700\u8981\u5728\u7cfb\u7edf\u4e2d\u5b89\u88c5dogtail\uff1b \u5982\u679c\u5e94\u7528\u5e93\u540c\u6837\u4f7f\u7528\u4e86\u7cfb\u7edf\u5b89\u88c5\u7684 dogtail \u53ef\u80fd\u4f1a\u62a5\u9519\uff0c\u89e3\u51b3\u65b9\u6848\u662f\u5c06\u4ee3\u7801\u4e2d\u7684 import dogtail \u4fee\u6539\u4e3a from src.depends import dogtail ; fix \u91cd\u8dd1\u5931\u8d25\u4e4b\u540e\u624d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff0c\u4fee\u6539\u4e3a\u5931\u8d25\u4e4b\u540e\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":"# Attribution \uff1achengdu Test Team\n# Date \uff1a2021/08/20\n \u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d \u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d \u4ed3\u5e93\u5730\u5740\uff1ahttps://gitlabcd.uniontech.com/autotest/cd-desktop-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u65b9\u6848\u6982\u8ff0","text":"\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u667a\u80fd\u8bc6\u522b\u5e94\u7528\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u7528\u4e8e\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u64cd\u4f5c\u8fc7\u7a0b\u4e2d\u7684\u5143\u7d20\u5b9a\u4f4d\u4ee5\u53ca\u5224\u65ad\u7ed3\u679c\u65f6\u7684\u65ad\u8a00\u5904\u7406\uff1b\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\uff0c\u6d4b\u8bd5\u673a\u4e0a\u7684\u753b\u9762\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u5230\u670d\u52a1\u5668\u4e0a\uff0c\u670d\u52a1\u5668\u5bf9\u89c6\u9891\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\u540e\uff0c\u670d\u52a1\u5668\u667a\u80fd\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\u6210\u529f\uff0c\u7136\u540e\u5bf9\u6d4b\u8bd5\u673a\u4e0b\u53d1\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\uff0c\u6d4b\u8bd5\u673a\u63a5\u53d7\u5e76\u6267\u884c\u4e0b\u4e00\u6b65\u64cd\u4f5c\u3002 \u670d\u52a1\u5668\u4e0e\u6d4b\u8bd5\u673a\u4e4b\u95f4\u7684\u94fe\u63a5\uff1a \u670d\u52a1\u5668\u901a\u8fc7 USB \u4e32\u53e3\u8bbe\u5907\uff08USB-HID \u534f\u8bae\uff09\u6a21\u62df\u9f20\u6807\u952e\u76d8\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u64cd\u4f5c\u3002 \u901a\u8fc7\u89c6\u9891\u91c7\u96c6\u8bbe\u5907\u6355\u83b7\u6d4b\u8bd5\u673a\u7684\u5b9e\u65f6\u753b\u9762\u4f20\u8f93\u7ed9\u670d\u52a1\u5668\u3002 \u670d\u52a1\u5668\u5bf9\u91c7\u96c6\u7684\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\uff0c\u8bc6\u522b\u5176\u4e2d\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5e76\u8fd4\u56de\u5143\u7d20\u63a7\u4ef6\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\uff0c\u670d\u52a1\u5668\u901a\u8fc7\u667a\u80fd\u5316\u5206\u6790\uff0c\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e00\u81f4\u5c06\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\u901a\u8fc7\u4e32\u53e3\u6a21\u62df\u952e\u9f20\u4fe1\u53f7\u53d1\u9001\u7ed9\u6d4b\u8bd5\u673a\uff1b\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e0d\u4e00\u81f4\u5c06\u4f1a\u8fdb\u5165\u4e2d\u65ad\u5904\u7406\u53ca\u5f02\u5e38\u7ed3\u679c\u8f93\u51fa\uff0c\u7ee7\u7eed\u6267\u884c\u540e\u7eed\u573a\u666f\uff0c\u76f4\u81f3\u6240\u6709\u7528\u4f8b\u6d4b\u8bd5\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u6df1\u5ea6\u5b66\u4e60\u73af\u5883\u642d\u5efa","text":"\u6a21\u578b\u8bad\u7ec3\u4e3b\u8981\u5bf9 GPU \u6709\u8981\u6c42\uff0c\u8bad\u7ec3\u6a21\u578b\u7684\u673a\u5668\u663e\u5b58\u4e0d\u4f4e\u4e8e 6G\uff0c\u5176\u4ed6\u914d\u7f6e\u65e0\u7279\u6b8a\u8981\u6c42\u3002 \u63a8\u8350\u6027\u4ef7\u6bd4\u8f83\u9ad8\u914d\u7f6e \u64cd\u4f5c\u7cfb\u7edf: UnionTech OS Desktop 20 Professional Linux version 4.19.0-desktop-amd64 (deepin@deepin-PC) (Uos 8.3.0.3-3+rebuild) \u5904\u7406\u5668: Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz (\u516b\u6838 / \u5341\u516d\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460M-HDV(RD)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))/8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: TU116 [GeForce GTX 1660]\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u865a\u62df\u73af\u5883\u5b89\u88c5","text":"cd ~\nwget -c https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh\nbash Miniconda3-latest-Linux-x86_64.sh\n \u4e00\u8def\u56de\u8f66 \u7b2c\u4e00\u6b21\u63d0\u793a\u8f93\u5165 yes/no \uff1a\u8f93\u5165 yes \u7ee7\u7eed\u4e00\u8def\u56de\u8f66 \u7b2c\u4e8c\u6b21\u63d0\u793a\uff1a\u8f93\u5165 no cd ~/miniconda3/bin\nsudo chmod 777 activate\n \u6fc0\u6d3bconda\u73af\u5883 . ./activate\n \u6dfb\u52a0\u516c\u53f8\u5185\u7f51\u6e90 conda config --add channels bioconda\nconda config --add channels conda-forge\n \u5982\u679c\u662f\u5916\u7f51\u6dfb\u52a0\u5916\u7f51\u6e90 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/\n \u5982\u679c\u8981\u5220\u9664\u6e90 conda config --remove-key channels\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"2\u3001\u5b89\u88c5\u4f9d\u8d56","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u521b\u5efa\u865a\u62df\u73af\u5883","text":"conda remove --name mmlab --all # \u79fb\u9664\u6240\u6709\u865a\u62df\u73af\u5883\n conda create -n mmlab python=3.7\n conda activate mmlab\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-pytorch","title":"\uff082\uff09\u5b89\u88c5 Pytorch","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install torch==1.7.0+cu101 torchvision==0.8.1+cu101 torchaudio==0.7.0 -f https://download.pytorch.org/whl/torch_stable.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-mmcv","title":"\uff083\uff09\u5b89\u88c5 MMCV","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install mmcv-full==1.3.3 -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.7.0/index.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"\uff084\uff09\u5b89\u88c5\u663e\u5361\u9a71\u52a8","text":"\u6839\u636e\u4f60\u7684\u663e\u5361\u4e0b\u8f7d\u5bf9\u5e94\u9a71\u52a8\uff0c\u6bd4\u5982\u6211\u7684\u663e\u5361\u4e3a GTX1660\uff0c\u9a71\u52a8\u7248\u672c\u4e3a 430\uff0c\u9a71\u52a8\u4e0b\u8f7d\u5730\u5740\uff1ahttps://www.nvidia.cn/Download/Find.aspx?lang=cn CTRL+ALT+F2 \u8fdb\u5165tty\n \u7981\u7528 nouveau \u9a71\u52a8 sudo vim /etc/modprobe.d/blacklist-nouveau.conf\n \u586b\u5165\uff1a blacklist nouveau options nouveau modeset=0\n \u5237\u65b0\u914d\u7f6e\u6587\u4ef6 sudo update-initramfs -u reboot \u91cd\u542f\u540e\u518d\u8fdb\u5165 tty \u5173\u95ed\u56fe\u50cf\u754c\u9762\uff0c\u8f93\u5165\u547d\u4ee4\u5173\u95ed\u56fe\u50cf\u754c\u9762 sudo service lightdm stop\n \u5b89\u88c5\u9a71\u52a8 sudo chmod a+x NVIDIA-Linux-x86_64-430.run\nsudo ./NVIDIA-Linux-x86_64-430.run\n reboot\u91cd\u542f\uff0cnvidia-smi\u67e5\u770b\u5b89\u88c5\u72b6\u6001\u3002\u6ce8\u610f\u770b\u4e0bcuda\u7248\u672c\uff0c10.1\uff0cdriver\u7248\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u6570\u636e\u6807\u6ce8","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u6570\u636e\u6807\u6ce8","text":"\u6807\u6ce8\u4e4b\u524d\u9700\u8981\u5148\u8f6c\u6362\u56fe\u7247\u5927\u5c0f\uff0c\u5e76\u4e14\u4ee5\u6570\u5b57\u547d\u540d\uff0c\u6bcf\u7ec4\u547d\u540d\u9012\u589e"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"\uff081\uff09\u8f6c\u6362\u5927\u5c0f\u5e76\u91cd\u547d\u540d","text":"rename_pic.py import os\nimport sys\nimport cv2\nimport time\nimport getpass\nusername = getpass.getuser()\nsource_path = f\"/home/{username}/Desktop/right_menu\" # \u56fe\u7247\u8def\u5f84\nsource_dest = os.path.join('/'.join(source_path.split(\"/\")[:-1]), 'tmp')\nif not os.path.exists(source_dest):\nos.mkdir(source_dest)\nstart_name = sys.argv[1]\nfile_name_list = list()\nfor file in os.listdir(source_path):\nif file.endswith('.png'):\nfile_name_list.append(file)\nstart_name = int(start_name)\nfor file in file_name_list:\nos.rename(os.path.join(source_path,file), os.path.join(source_path, f\"{str(start_name)}.png\"))\nstart_name += 1\ntime.sleep(1)\nfor file in os.listdir(source_path):\nimage = os.path.join(source_path, str(file))\nsrc = cv2.imread(image)\nresult = cv2.resize(src, (960, 540))\nresizeImage = os.path.join(source_dest, str(file))\nprint(resizeImage)\ncv2.imwrite(str(resizeImage), result)\ncv2.waitKey(0)\ncv2.destroyAllWindows()\ntime.sleep(1)\nos.system(f'rm -rf {source_path}/*')\nos.system(f'mv {source_dest}/* {source_path}')\nos.system(f'rm -rf {source_dest}')\nprint(\"\u4e0b\u4e00\u4e2a\u5e8f\u53f7\uff1a\", start_name)\n \u6839\u636e\u7ec8\u7aef\u8f93\u51fa\u7684\u4e0b\u4e00\u4e2a\u5e8f\u53f7\u7684\u63d0\u793a\uff0c\u6267\u884c Python \u6587\u4ef6\u7684\u65f6\u5019\u4f20\u53c2\u3002 python rename_pic.py 249\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"\uff082\uff09\u5de5\u5177\u6807\u6ce8","text":"\u4f7f\u7528\u5de5\u5177 labelImg \u6807\u6ce8 sudo pip3 install PyQt5==5.13\nsudo pip3 install labelImg\n \u7ec8\u7aef\u76f4\u63a5\u8f93\u5165 labelImg\uff0c\u56de\u8f66 \u6807\u6ce8\u6a21\u5f0f\u9009\u62e9\uff1aPascalVOC"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u667a\u80fd\u6807\u6ce8","text":"\u6253\u5f00\u5c4f\u5e55\u5f55\u5236\u8f6f\u4ef6\uff0c\u5f55\u5236\u624b\u52a8\u64cd\u4f5c\u4e00\u6b21\u6d4b\u8bd5\u7528\u4f8b\uff0c\u7136\u540e\u5c06\u5f55\u5236\u7684\u89c6\u9891\u8fdb\u884c\u5206\u5e27\uff0c\u7136\u540e\u5bf9\u6bd4\u524d\u4e24\u5e27\u56fe\u6807\u76f8\u4f3c\u5ea6\uff0c\u5254\u9664\u76f8\u4f3c\u5ea6\u8fc7\u9ad8\u7684\u56fe\u7247\uff0c\u5728\u4fdd\u8bc1\u7d20\u6750\u591a\u6837\u6027\u7684\u524d\u63d0\u4e0b\uff0c\u5254\u9664\u91cd\u590d\u591a\u4f59\u7684\u56fe\u7247\u751f\u6210\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u96c6\uff0c\u7136\u540e\u53d6\u51fa\u63a7\u4ef6\u6a21\u677f\u6570\u636e\u96c6\uff0c\u901a\u8fc7 OpenCV \u6a21\u677f\u5339\u914d\u83b7\u53d6\u63a7\u4ef6\u5728\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u56fe\u7247\u4e2d\u6240\u5728\u7684\u5de6\u4e0a\u3001\u5de6\u4e0b\u3001\u53f3\u4e0a\u3001\u53f3\u4e0b\u56db\u5904\u5750\u6807\uff0c\u4ece\u800c\u6839\u636e\u6a21\u677f\u6570\u636e\u96c6\u751f\u6210\u6807\u6ce8\u6570\u636e\u3002\u53c2\u8003\u76ee\u5f55 AnnotationMaterial"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"\uff081\uff09\u6a21\u677f\u6570\u636e\u96c6\u51c6\u5907","text":"1\u3001\u5728\u754c\u9762\u622a\u53d6\u9700\u8981\u6807\u6ce8\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u653e\u5728\u76ee\u5f55\u4e0b AnnotationMaterial/template/img 2\u3001\u7ef4\u62a4\u63a7\u4ef6\u540d\u4e0e\u5143\u7d20\u63a7\u4ef6\u7684\u952e\u5bf9\uff0c\u4e00\u4e2a\u63a7\u4ef6\u540d\u53ef\u5bf9\u5e94\u591a\u4e2a\u5143\u7d20\u63a7\u4ef6 menu:\n- menu.jpg\n- menu1.jpg\n- menu2.jpg\n- menu3.jpg\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"\uff082\uff09\u7d20\u6750\u96c6\u51c6\u5907","text":"\u5f55\u5236\u89c6\u9891\u6216\u6216\u5c4f\u5e55\u622a\u56fe\u653e\u7f6e\u76ee\u5f55 AnnotationMaterial/source"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u5f00\u59cb\u6807\u6ce8","text":"python3 AnnotationMaterial/main.py\n \u751f\u6210\u7684\u6807\u6ce8\u6570\u636e\u5b58\u653e\u5728 AnnotationMaterial/result"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#mmdetection","title":"\u56db\u3001MMDetection","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1-mmdetection","title":"1\u3001 MMDetection \u4ee3\u7801","text":"MMDetection \u662f\u4e00\u4e2a\u6709\u540d\u7684\u6df1\u5ea6\u5b66\u4e60\u76ee\u6807\u68c0\u6d4b\u5f00\u6e90\u9879\u76ee\uff0c\u4e5f\u662f openMMlab \u7684\u62db\u724c\u9879\u76ee\uff0c\u4e3a\u4ec0\u4e48\u9009\u62e9\u5b83\uff0c\u5c0f\u5b69\u513f\u6ca1\u5a18\u8bf4\u6765\u8bdd\u957f\uff0c\u611f\u5174\u8da3\u53ef\u4ee5\u81ea\u884c\u6df1\u5165\u4e86\u89e3\uff1b \u4f60\u53ef\u4ee5\u76f4\u63a5\u5728 GitHub \u4e0a\u514b\u9686\u4ee3\u7801\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u54b1\u4eec\u4ed3\u5e93\u4e0b Train \u76ee\u5f55\u4e2d\u4ee3\u7801\uff0cTrain \u4e2d\u7684\u4ee3\u7801\u4e5f\u662f\u4ece GitHub \u4e0a\u62c9\u53d6\u7684\uff0c\u4e0d\u8fc7\u6211\u4eec\u6839\u636e\u9879\u76ee\u9700\u8981\u505a\u4e86\u4e00\u4e9b\u4e8c\u6b21\u5f00\u53d1\uff0c\u63a8\u8350\u76f4\u63a5\u4f7f\u7528\u5b83\u3002 \u5982\u679c\u4f60\u60f3\u4ece GitHub \u4e0a\u62c9\uff1a git clone https://github.com/open-mmlab/mmdetection.git\n# \u4e0d\u80fd\u76f4\u63a5\u62c9\u53d6\u4e3b\u5206\u652f\uff0c\u5efa\u8bae\u4f7f\u75282.12\u7248\u672c\uff0c\u4e0d\u540c\u7684\u7248\u672c\u5bf9\u5e94\u7684mmcv\u7248\u672c\u662f\u4e0d\u540c\u7684\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-voc2coco","title":"2\u3001\u62c9\u53d6 voc2coco \u4ee3\u7801","text":"git clone https://github.com/Tony607/voc2coco.git\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-coco","title":"3\u3001\u8f6c\u6362 coco \u6570\u636e\u96c6","text":"\u5c06\u6240\u6709\u7684\u56fe\u7247\u548cxml\u6587\u4ef6\u653e\u5165train2017\uff0c\u4ece\u4e2d\u6311\u9009\u51e0\u7ec4\u653e\u5165val2017\uff08\u6d4b\u8bd5\u96c6\uff09 cd mmdetection/data/coco\npython voc2coco.py train2017 annotations/instances_train2017.json\npython voc2coco.py val2017 annotations/instances_val2017.json\n \u751f\u6210json\u6587\u4ef6"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4_1","title":"4\u3001\u4fee\u6539\u914d\u7f6e","text":"\uff081\uff09\u8bfb\u53d6\u6a21\u578b\u540d\u79f0 import json\nmodule_name = []\nwith open('./instances_train2017.json', \"r+\") as f:\njson_file = f.read()\njson_dict = json.loads(json_file)\nmodule_list = json_dict.get('categories')\nfor module_info in module_list:\nname = module_info.get('name')\nmodule_name.append(name)\nprint(module_name)\nprint(\"module_num:\", len(module_name))\n # \u6ce8\u610f\u5bf9\u6bd4instances_train2017.json\u91cc\u9762\u6a21\u578b\u540d\u79f0\u7684\u987a\u5e8f\uff0c\u4e0eCLASSES\u548ccoco_classes\u91cc\u9762\u7684\u987a\u5e8f\u4fdd\u6301\u4e00\u81f4\u3002\n \uff082\uff09\u4fee\u6539 faster_rcnn_r101_2x_coco.py mmdetection/xianjin/faster_rcnn_r101_2x_coco.py \u4fee\u653946\u884c\uff0cnum_clasess\u7684\u503c\uff0c\u65b0\u589e1\u4e2a\uff0c\u5c31 +1\uff1b \uff083\uff09\u4fee\u6539 coco.py mmdetection/mmdet/datasets/coco.py CLASSES = ()\uff0c\u5728\u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b \uff084\uff09\u4fee\u6539 class_names.py mmdetection/mmdet/core/evaluation/class_names.py coco_classes \u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#5","title":"5\u3001\u7f13\u5b58\u6e05\u7406","text":"\u5220\u9664 mmdetection/build \u76ee\u5f55 python setup.py install\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#6","title":"6\u3001\u8bad\u7ec3\u6a21\u578b","text":"\uff081\uff09\u6307\u5b9a\u81ea\u5df1\u914d\u7f6e\u7684\u8bad\u7ec3\u6a21\u578b\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py --gpus 1\n \uff082\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u6d4b\u8bd5\u96c6\u7ed3\u679c\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py xianjin/epoch_24.pth --show\n \uff083\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u51c6\u786e\u5ea6\uff1b python tools/analysis_tools/analyze_logs.py plot_curve xianjin/20210530_011907.log.json --keys acc\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#7","title":"7\u3001\u5feb\u6377\u64cd\u4f5c","text":"python3 run.py\n \u5c06\u4ee5\u4e0a 4 - 7 \u6b65\u64cd\u4f5c\u6574\u5408\u6210 run.py\uff0c\u4e00\u952e\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u4e94\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\uff1b \u670d\u52a1\u7aef\u4e00\u53f0\uff08\u76ee\u524d\u4ec5\u652f\u6301AMD\u67b6\u6784\uff09\uff1b \u91c7\u96c6\u76d2\u4e00\u4e2a \uff08ACASIS hdmi\u89c6\u9891\u91c7\u96c6\u5361\uff0chttps://item.jd.com/10024310742602.html \uff09\uff1b USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\uff1b USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff1b \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5USB\u5ef6\u957f\u7ebf\uff1b \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u63a8\u8350\u914d\u7f6e","text":"\u6267\u884c\u7528\u4f8b\u7684\u670d\u52a1\u7aef\u5bf9\u914d\u7f6e\u6ca1\u6709\u7279\u6b8a\u8981\u6c42\uff0c\u5982\u679c\u6761\u4ef6\u5141\u8bb8\u914d\u7f6e\u8d8a\u9ad8\uff0c\u8bc6\u522b\u901f\u5ea6\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n \u6d4b\u8bd5\u673a\u4e0a\u4e0d\u6267\u884c\u4efb\u4f55\u811a\u672c\uff0c\u5177\u4f53\u914d\u7f6e\u6839\u636e\u6d4b\u8bd5\u9700\u8981\u51b3\u5b9a\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#usb_mk","title":"\u516d\u3001USB_MK\u4e32\u53e3\u9a71\u52a8\u65b9\u6cd5","text":"\u4f4d\u4e8econtrol_method\u76ee\u5f55\u4e0b\u7684usb_mk.py\u6587\u4ef6 \uff081\uff09\u5217\u51fa\u53ef\u901a\u4fe1\u7684\u7aef\u53e3 python3 -m serial.tools.list_ports -v\n \uff082\uff09\u4fee\u6539\u4e32\u53e3\u7684\u6743\u9650 sudo chmod 777 /dev/ttyACM0\n \uff083\uff09\u5b9e\u4f8b\u5316USB_MK import UsbMk\nusb_mk = UsbMk(\"/dev/ttyACM0\", 9600) # \u8bbe\u5907\u9ed8\u8ba49600\u4e3a\u6ce2\u7279\u7387\uff0c\u63a7\u5236\u4f20\u8f93\u901f\u7387\n \uff084\uff09USB\u4e32\u53e3\u8bbe\u5907\u9ed8\u8ba4\u6ce2\u7279\u7387\u4e3a9600\uff08\u7ecf\u6d4b\u8bd5\u6ce2\u7279\u73879600\u51c6\u786e\u6027\u6700\u597d\uff09\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up() # \u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u6c49\u5b57\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e\n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff083\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff084\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff085\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() # \u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2\n \uff086\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff087\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff088\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e03\u3001\u65b9\u6cd5\u8c03\u7528\u5165\u53c2\u89c4\u5219","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_7","title":"1\u3001\u57fa\u7c7b","text":"class Base:\ndef __init__(self):\nself._obj = image\nself._usb = usb_mk\ndef find_element_by_ai(self, element):\nreturn self._obj.find_element(element)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_6","title":"2\u3001\u5165\u53c2\u8bf4\u660e","text":"\u56fe\u50cf\u8bc6\u522b\u65b9\u6cd5\u5165\u53e3\u4e3a Base \u7c7b\u4e0b\u7684 find_element_by_ai \u3002\u4ec5\u63a5\u53d7\u4e00\u4e2a\u53c2\u6570 element\uff0c\u7c7b\u578b\u4e3a string\u3002 \u53ef\u8bc6\u522b\u7684 string \u683c\u5f0f\uff1a \uff081\uff09\u5927\u56fe\u6807\uff08 \u56fe\u6807\u5927\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\uff0c\u4f8b\uff1a Base().find_element_by_ai(\"window\")\n \uff082\uff09\u5927\u56fe\u6807 / \u5c0f\u56fe\u6807\uff08\u56fe\u6807\u5c0f\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5c0f\u56fe\u6807\uff0c\u4f8b\uff1awindow/search_btn Base().find_element_by_ai(\"window/search_btn\")\n \uff083\uff09\u5927\u56fe\u6807 / OCR\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\u5185\u7684\u6587\u5b57\uff0c\u4f8b\uff1amenu/\u5c5e\u6027 Base().find_element_by_ai(\"menu/\u5c5e\u6027\")\n \uff084\uff09OCR\uff1a\u5168\u5c4f\u8bc6\u522b\u6587\u5b57 Base().find_element_by_ai(\"\u641c\u7d22\")\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516b\u3001\u9690\u85cf\u9f20\u6807","text":"\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u8fc7\u6765\u7684\u89c6\u9891\u6d41\uff0c\u5728\u8bc6\u522b\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u53d7\u5230\u9f20\u6807\u5f71\u54cd\uff0c\u56e0\u6b64\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u9690\u85cf\u9f20\u6807\u3002 \u5c4f\u853d\u9f20\u6807\u5149\u6807\u663e\u793a ```shell script /etc/lightdm/lightdm.conf \u5728`[Seat:*]`\u4e0b\u9762\u6dfb\u52a0\u53c2\u6570\n```shell script\nxserver-command=X -bs -core -nocursor\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e5d\u3001\u667a\u80fd\u81ea\u52a8\u5316\u7684\u610f\u4e49","text":"1\u3001\u6539\u5584 Acessibility \u5b9a\u4f4d\u7684\u7a33\u5b9a\u6027\u95ee\u9898 Acessibility \u5c5e\u6027\u5b9a\u4f4d\u5b58\u5728\u5076\u5c14\u5931\u6548\u7684\u60c5\u51b5 \uff081\uff09\u5f00\u53d1\u5728\u505a\u65b0\u9700\u6c42\u5f00\u53d1\u65f6\u53ef\u80fd\u6d89\u53ca\u5230\u5bf9\u5c5e\u6027\u6807\u7b7e\u7684\u4fee\u6539\u6216\u8005\u5c42\u7ea7\u7684\u8c03\u6574\uff0c\u53ef\u80fd\u9020\u6210\u81ea\u52a8\u5316\u7528\u4f8b\u65e0\u6cd5\u5b9a\u4f4d\u5230\u5143\u7d20\u3002 \u6bd4\u59821040\u9636\u6bb5\uff0c\u97f3\u4e50\u91cd\u6784\u7684\u65f6\u5019\uff0c\u5f00\u53d1\u5bf9\u90e8\u5206\u5c5e\u6027\u548c\u5c42\u7ea7\u505a\u4e86\u4fee\u6539\uff0c\u5bfc\u81f4\u81ea\u52a8\u5316\u7528\u4f8b\u5b9a\u4f4d\u65b9\u6cd580%\u9700\u8981\u4fee\u6539\u3002 \u5f00\u53d1\u65b0\u529f\u80fd\u7684\u65f6\u5019\u5076\u5c14\u4e5f\u4f1a\u5bf9\u5c5e\u6027\u505a\u8c03\u6574\uff0c\u9047\u52305\u6b21\u3002 \uff082\uff09\u76ee\u524d\u4e3b\u8981\u4f7f\u7528Dogtail\u8bc6\u522b\u5e94\u7528Acessibility\u5c5e\u6027\u8fdb\u884c\u5b9a\u4f4d\uff0c\u662f\u83b7\u53d6\u5e94\u7528\u5f53\u524d\u754c\u9762\u7684\u5c5e\u6027tree\uff0c\u5728\u5e94\u7528\u8df3\u8f6c\u540e\uff0cDogtail\u5b58\u5728\u65e0\u6cd5\u53ca\u65f6\u83b7\u53d6\u5f53\u524d\u5c5e\u6027\u5217\u8868\u7684\u60c5\u51b5\u3002 \u591a\u5a92\u4f53\u8c03\u7528\u6587\u7ba1\u7a97\u53e3\u7684\u65f6\u5019\uff0c\u51fa\u73b0\u627e\u4e0d\u5230\u6587\u7ba1\u91cc\u9762\u5143\u7d20\u7684\u60c5\u51b5\uff0c\u76ee\u524d\u51fa\u73b010+\u6b21\u3002 \u5e94\u7528\u8bbe\u7f6e\u9875\u9762\u7684\u5c5e\u6027\u5076\u5c14\u5b58\u5728\u627e\u4e0d\u5230\u7684\u60c5\u51b5\uff0c\u9047\u52305\u6b21\u3002 \uff083\uff09Dogtail\u5de5\u5177\u672c\u8eab\u5b58\u5728\u95ee\u9898\uff0c\u6709\u65f6\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u5019\u5f88\u6162\uff0c\u8ba9\u4eba\u65e0\u6cd5\u63a5\u53d7\uff0c\u76ee\u524d\u51fa\u73b0\u8fc7\u5f88\u591a\u6b21\u3002 \u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u95f4\u6bd4\u5e73\u5e38\u61623\u500d\uff0c\u51fa\u73b04\u6b21\u3002 2\u3001\u89e3\u51b3\u4e86\u4f7f\u7528\u7edd\u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898 \u90e8\u5206\u63a7\u4ef6\u65e0\u6cd5\u6dfb\u52a0 Acessibility \u5c5e\u6027\u4ece\u800c\u4f7f\u7528\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u51fa\u73b0\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898\u3002 \uff081\uff09\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u65b9\u6cd5\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u76ee\u6807\u56fe\u7247\u8d44\u6e90\uff0c\u5728 UI \u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u4f1a\u6d89\u53ca\u5230\u76ee\u6807\u8d44\u6e90\u7684\u66ff\u6362\uff0c\u6bd4\u8f83\u8017\u8d39\u4eba\u529b\u3002 \uff082\uff09\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6cd5\u5bf9\u6bd4\u7cbe\u5ea6\u6bd4\u8f83\u641e\uff0c\u5982\u679cUI \u7684\u53d8\u66f4\u4f1a\u9020\u6210\u65e0\u6cd5\u51c6\u786e\u5b9a\u4f4d\u5230\uff0c\u81ea\u52a8\u5316\u811a\u672c\u5065\u58ee\u6027\u4e0d\u8db3\u3002 3\u3001\u4f7f\u7528\u673a\u5668\u5206\u79bb\uff0c\u89e3\u51b3\u4e86\u81ea\u52a8\u5316\u811a\u672c\u5bf9\u5e94\u7528\u7684\u5f71\u54cd\uff0c\u771f\u5b9e\u8fd8\u539f\u7528\u6237\u7684\u4f7f\u7528\u573a\u666f \u673a\u5668\u5206\u79bb\u7684\u67b6\u6784\u8bbe\u8ba1\uff0c\u4fdd\u8bc1\u4e86\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u73af\u5883\u5b8c\u5168\u7b49\u540c\u4e8e\u7528\u6237\uff0c\u6392\u9664\u6d4b\u8bd5\u811a\u672c\u7684\u5f71\u54cd\u3002 \uff081\uff09\u76ee\u524d\u7684\u529f\u80fd\u81ea\u52a8\u5316\u662f\u5728\u6d4b\u8bd5\u673a\u4e0a\u76f4\u63a5\u8fd0\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\uff0c\u52a0\u4e0a\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u6211\u4eec\u6dfb\u52a0\u4e86\u4e00\u4e9b\u8fdb\u7a0b\u76d1\u63a7\u3001\u89c6\u9891\u5f55\u5236\u7b49\u529f\u80fd\uff0c\u81ea\u52a8\u5316\u811a\u672c\u672c\u8eab\u4f1a\u6d88\u8017\u4e00\u4e9b\u7cfb\u7edf\u8d44\u6e90\uff0c\u65e0\u6cd5\u8fd8\u539f\u771f\u662f\u7684\u7528\u6237\u4f7f\u7528\u573a\u666f\u3002 \uff082\uff09\u6027\u80fd\u6d4b\u8bd5\u9700\u8981\u6392\u9664\u5176\u4ed6\u7a0b\u5e8f\u7684\u8d44\u6e90\u6d88\u8017\u5f71\u54cd\uff0c\u6027\u80fd\u81ea\u52a8\u5316\u91c7\u7528\u673a\u5668\u5206\u79bb\uff0c\u4fdd\u8bc1\u4e86\u6027\u80fd\u6570\u636e\u7684\u51c6\u786e\u6027\u3002 \u4ee5\u524d\u7684\u7528\u4f8b\u6267\u884c\u8017\u65f6\u6ca1\u6761\u572830\u79d2\u5de6\u53f3\uff0c\u73b0\u5728\u7528\u4f8b\u8017\u65f6\u572810\u79d2\u3002 4\u3001\u89e3\u51b3\u4e86UI \u8c03\u6574\u5bfc\u81f4\u5b9a\u4f4d\u5931\u8d25\u7684\u4e0d\u7a33\u5b9a\u6027\u95ee\u9898 \uff081\uff09\u89e3\u51b3\u4e86\u56e0 UI \u8c03\u6574\u5bfc\u81f4\u63a7\u4ef6\u4f4d\u7f6e\u53d8\u5316\u6216\u8272\u5dee\u53d8\u5316\u540e\u5b9a\u4f4d\u4e0d\u51c6\u786e\u7684\u95ee\u9898\uff0c\u53ea\u8981\u63a7\u4ef6\u6587\u6848\u548c\u63a7\u4ef6\u5916\u8fb9\u6846\u65e0\u53d8\u5316\u5747\u53ef\u51c6\u786e\u5b9a\u4f4d\uff1b \uff082\uff09\u76ee\u524d\u4e5f\u4f1a\u91c7\u7528\u57fa\u4e8eUI\u7684\u5b9a\u4f4d\u65b9\u6848\uff0c\u5982\u679cUI\u4f4d\u7f6e\u6709\u8c03\u6574\uff0c\u4f1a\u5bfc\u81f4\u5143\u7d20\u65e0\u6cd5\u5b9a\u4f4d\u3002 5\u3001\u7b80\u5316\u4e86\u7528\u4f8b\u7ed3\u6784\uff0c\u63d0\u5347\u7f16\u5199\u53cb\u597d\u5ea6 \uff081\uff09\u667a\u80fd\u81ea\u52a8\u5316\u8bc6\u522b\u5143\u7d20\u7684\u65b9\u6cd5\u53ea\u6709\u4e00\u4e2a\uff0c\u5c31\u662f\u57fa\u4e8e\u6211\u4eec\u8bad\u7ec3\u7684\u6a21\u578b\u8bc6\u522b\u89c6\u9891\u6d41\u4e2d\u7684\u5143\u7d20\uff0c\u7ecf\u8fc7\u811a\u672c\u5c01\u88c5\u4e4b\u540e\uff0c\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u4e2d\u6240\u6709\u5b9a\u4f4d\u7684\u64cd\u4f5c\u90fd\u53ea\u9700\u8981\u8c03\u7528\u8fd9\u4e00\u4e2a\u65b9\u6cd5\u5c31\u884c\u4e86\uff0c\u7f16\u5199\u81ea\u52a8\u5316\u811a\u672c\u7684\u96be\u5ea6\u5927\u5927\u964d\u4f4e\u3002 \uff082\uff09\u4e5f\u662f\u7531\u4e8e\u8c03\u7528\u65b9\u6cd5\u7b80\u5355\uff0c\u5728 UI \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u4e2d\u7684\u5206\u5c42\u7ed3\u6784\u5c06\u4f1a\u51cf\u5c11\uff0c\u591a\u7ee7\u627f\u7684\u60c5\u51b5\u4f1a\u51cf\u5c11\uff0c\u81ea\u52a8\u5316\u4ee3\u7801\u7684\u8c03\u7528\u7ed3\u6784\u4e5f\u4f1a\u53d8\u5f97\u7b80\u5355\uff0c\u800c\u4e14\u529f\u80fd\u6d4b\u8bd5\u540c\u5b66\u7f16\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u66f4\u52a0\u5bb9\u6613\u4e0a\u624b\u3002 \u4ee5\u524d\u5199\u7528\u4f8b\u7531\u4e8e\u9700\u8981\u7ed3\u5408\u4e0d\u540c\u7684\u6a21\u5757\uff0c\u8c03\u7528\u4e0d\u540c\u7684\u65b9\u6cd5\uff0c\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u5e76\u5b8c\u6210\u8c03\u8bd5\u7684\u65f6\u95f4\u5e73\u5747\u572820-30\u5206\u949f\uff0c\u73b0\u5728\u5199\u7528\u4f8b\u811a\u672c\u80fd\u57285\u5206\u949f\u5de6\u53f3\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":"# =============================================\n# Attribution : Application Test Department III\n# Time : 2023/1/3\n# Author : ut003281\n# =============================================\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u7b80\u8ff0","text":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5 \u901a\u8fc7\u81ea\u52a8\u5316\u624b\u6bb5\u5bf9\u5e94\u7528\u8fdb\u884c\u6027\u80fd\u6d4b\u8bd5\uff0c\u63d0\u4f9b\u65b9\u4fbf\u7684\u73af\u5883\u90e8\u7f72\u3001\u8fd0\u884c\u914d\u7f6e\u3001\u7528\u4f8b\u7f16\u5199\u7b49\uff0c\u7528\u4e8e\u684c\u9762\u5e94\u7528\u7684\u51b7\u70ed\u542f\u52a8\u3001\u8d44\u6e90\u62f7\u8d1d\u3001\u9875\u9762\u8df3\u8f6c\u7b49\u6027\u80fd\u573a\u666f\u6d4b\u8bd5\u3002 \u4ed3\u5e93\u5730\u5740\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-perf-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u4ee3\u7801\u7ed3\u6784","text":"autotest-perf-aitest\n\u251c\u2500\u2500 apps # \u5b58\u653e\u6240\u6709\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u811a\u672c\n\u251c\u2500\u2500 conftest.py # pytest hook\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 CURRENT # \u7248\u672c\u5185\u5bb9\n\u251c\u2500\u2500 docs # \u6587\u6863\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u952e\u503c\u5bf9\u7167\u8868.pdf # \u4e32\u53e3\u7ebfcode\u4e0e\u6309\u952e\u7684\u5bf9\u7167\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u6027\u80fd\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\u6267\u884c\u5668\u4f7f\u7528\u6307\u5357.md # \u6267\u884c\u5668\u811a\u672c\u4f7f\u7528\u6307\u5357\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 USB\u4e32\u53e3\u8f6cUSB\u952e\u76d8\u9f20\u6807\u7ebf\u534f\u8bae\u6587\u4ef6V1.0.pdf # \u4e32\u53e3\u534f\u8bae\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput-0.28.2.zip # Linux\u4e0b\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\u7684\u6e90\u7801\uff0c\u53ef\u6839\u636e\u67b6\u6784\u6253\u5305\n\u251c\u2500\u2500 manage.py # \u529f\u80fd\u4e3b\u5165\u53e3\n\u251c\u2500\u2500 pytest.ini # pytst \u914d\u7f6e\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 setting # \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 client.ini # \u6d4b\u8bd5\u673a IP \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5168\u5c40\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dev_env.sh # \u5bbf\u4e3b\u673a\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose_no_relay.yml # \u65e0\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose.yml # \u6709\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker_login.sh # docker \u767b\u9646\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 res\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 black.png # \u5168\u9ed1\u56fe\u7247\uff0c\u7528\u4e8e\u4fee\u6539\u58c1\u7eb8\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_5000.deb # 3A5000 \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_amd64.deb # amd \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_arm64.deb # arm \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_mips64.deb # mips \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_sw_64.deb # sw \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 server.ini # \u670d\u52a1\u5668\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 setup.sh # \u5bb9\u5668\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 template # \u521b\u5efa app \u57fa\u7840\u811a\u672c\u6a21\u677f\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 app_template\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ${app_name}_widget.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 control-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 images\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 test_${app_name}_01_scene.json-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 test_${app_name}_01_scene.py-tpl\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 uos_docker # \u5bb9\u5668\u73af\u5883\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dockerfile\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 requirements.txt\n\u2514\u2500\u2500 src\n \u251c\u2500\u2500 analysis_save.py # \u89e3\u6790\u56fe\u7247\u6d41\u7ed3\u679c\uff0c\u6c47\u603b\u751f\u6210 excel \u62a5\u544a\n\u251c\u2500\u2500 base_widget.py # \u5c01\u88c5\u7684\u57fa\u7840\u64cd\u4f5c\uff0c\u5e94\u7528\u8c03\u7528\u7684\u4e3b\u5165\u53e3\u65b9\u6cd5\n\u251c\u2500\u2500 cmdctl.py # \u8c03\u7528\u547d\u4ee4\u884c\u4f7f\u7528\n\u251c\u2500\u2500 global_value.py # \u5168\u5c40\u53d8\u91cf\n\u251c\u2500\u2500 image_utils.py # \u56fe\u7247\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 __init__.py\n \u251c\u2500\u2500 logger_utils.py # \u65e5\u5fd7\u914d\u7f6e\n\u251c\u2500\u2500 pdocr.py # ocr \u914d\u7f6e\n\u251c\u2500\u2500 public_method.py # \u4e00\u4e9b\u65b9\u4fbf\u7684\u5c01\u4f4f\n\u251c\u2500\u2500 record.py # \u5f55\u5c4f\u76f8\u5173\n\u251c\u2500\u2500 rtk # \u8fd0\u884c\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 _base.py # \u4e00\u4e9b\u679a\u4e3e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 install_env.py # \u5b89\u88c5\u73af\u5883\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 local_runner.py # \u8fd0\u884c\u7528\u4f8b\n\u251c\u2500\u2500 serial_communication # \u4e32\u53e3\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 power_control.py # \u7ee7\u7535\u5668\u64cd\u4f5c\uff0c\u4f7f\u7528\u7ee7\u7535\u5668\u8fde\u63a5\u4e3b\u673a\u7535\u6e90\uff0c\u63a7\u5236\u5f00\u5173\u673a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 serial_common.py # \u4e32\u53e3\u516c\u5171\u65b9\u6cd5\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 usb_mk.py # \u952e\u9f20\u64cd\u4f5c\u57fa\u7840\u5c01\u88c5\n\u251c\u2500\u2500 shortcut_key.py # \u5feb\u6377\u952e\u7684\u5c01\u88c5\n\u251c\u2500\u2500 singleton.py # \u5355\u4f8b\u6a21\u5f0f\n\u251c\u2500\u2500 start_app.py # \u521b\u5efa app\n\u2514\u2500\u2500 write_xlsx.py # \u751f\u6210 excel\n# __init__.py \u6587\u4ef6\u4e3a\u6807\u8bc6\u8be5\u76ee\u5f55\u662f\u4e00\u4e2aPython\u7684\u6a21\u5757\u5305\uff0c\u9879\u76ee\u4e2d\u7684__init__.py\u5747\u4e3a\u7a7a\u6587\u4ef6\u3002\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u73af\u5883\u642d\u5efa","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\u3002 \u670d\u52a1\u7aef\u4e00\u53f0\u3002\uff08\u4ec5\u652f\u6301 AMD \u67b6\u6784\uff0c\u82e5\u9700\u5176\u4ed6\u67b6\u6784\uff0c\u54a8\u8be2\u76f8\u5173\u5f00\u53d1\u4eba\u5458\uff09 \u91c7\u96c6\u76d2\u4e00\u4e2a\u3002 \uff08ACASIS HDMI \u89c6\u9891\u91c7\u96c6\u76d2\uff0chttps://item.jd.com/100013302599.html#crumb-wrap \uff09 USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\u3002\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"\uff082\uff09\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\u3002 USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff08USB3.0 \u63a5\u53e3\u4e0a\uff09\u3002 \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5 USB \u5ef6\u957f\u7ebf\u3002 \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u670d\u52a1\u7aef\u63a8\u8350\u914d\u7f6e","text":"\u914d\u7f6e\u8d8a\u9ad8\uff0c\u89e3\u6790\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"2\u3001\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa","text":" \u6253\u5f00\u63a7\u5236\u4e2d\u5fc3\uff0c\u8d26\u6237\u8bbe\u7f6e\u4e3a\u3010\u81ea\u52a8\u767b\u5f55\u3011\u548c\u3010\u65e0\u5bc6\u7801\u767b\u5f55\u3011\uff0c\u7535\u6e90\u7ba1\u7406\u4e2d\u4f7f\u7528\u7535\u6e90\u5168\u90e8\u8bbe\u7f6e\u4e3a\u3010\u4ece\u4e0d\u3011\uff0c\u5f00\u542f\u5f00\u53d1\u8005\u6a21\u5f0f\u3002 \u6839\u636e\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u8981\u6c42\uff0c\u5bfc\u5165\u76f8\u5173\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\uff1a\u5bfc\u5165\u76f8\u518c\u3001\u5f71\u9662\u3001\u97f3\u4e50\u7684\u6d4b\u8bd5\u8d44\u6e90\u3002 \u5728\u670d\u52a1\u7aef\u6253\u5f00\u76f8\u673a\u5e94\u7528\u540e\uff0c\u5c06\u6d4b\u8bd5\u673a\u684c\u9762\u58c1\u7eb8\u66f4\u6362\u4e3a\u7eaf\u8272\u58c1\u7eb8\uff08\u6ce8\u610f\uff0c\u670d\u52a1\u7aef\u9700\u63d0\u524d\u5f00\u542f\u76f8\u673a\u540e\u518d\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u58c1\u7eb8\uff0c\u5efa\u8bae\u7eaf\u9ed1\u58c1\u7eb8 setting/res/black.png\uff09 \u5728\u6587\u4ef6\u7ba1\u7406\u5668\u4e2d\uff0c\u5c06\u9009\u9879 \u4e3b\u83dc\u5355-\u8bbe\u7f6e-\u9884\u89c8-\u56fe\u7247\u9884\u89c8 \u53d6\u6d88\u52fe\u9009\uff08\u5982\u4e0d\u53d6\u6d88\uff0c\u4f1a\u5f71\u54cd\u622a\u56fe\u5f55\u5c4f\u5e94\u7528\u7684\u6027\u80fd\u6570\u636e\uff09 \u79fb\u52a8\u6216\u5220\u9664\u7cfb\u7edf Logo \uff0c\u6392\u9664\u684c\u9762\u53f3\u4e0b\u89d2 Logo \u7684\u5f71\u54cd\uff08\u91cd\u542f\u751f\u6548\uff09\u3002 sudo mv /usr/share/deepin/uos_logo.svg ~/Pictures/\n \u5b89\u88c5\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\uff08\u5fc5\u987b\u5b89\u88c5\uff01\uff01\uff09 AMD \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_amd64.deb ARM \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_arm64.deb MIPS \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_mips64.deb 3A5000 \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_5000.deb \u5b89\u88c5\u547d\u4ee4 sudo dkpg -i xserver-xorg-input-libinput_0.28.2-2_amd64.deb\n \u5b89\u88c5\u65f6\u4f1a\u63d0\u793a\u5df2\u5b58\u5728\u76f8\u540c\u7248\u672c\uff0c\u8bf7\u5ffd\u7565\uff0c\u76f4\u63a5\u8986\u76d6\u5b89\u88c5\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u4e3b\u673a\u624d\u751f\u6548"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u670d\u52a1\u7aef\u4e00\u952e\u73af\u5883\u90e8\u7f72","text":"\u73af\u5883\u642d\u5efa\u524d\u5fc5\u987b\u5148\u8fde\u63a5\u4e0a USB \u4e32\u53e3\u7ebf\u548c\u91c7\u96c6\u76d2\u3002 \u5bbf\u4e3b\u673a\u73af\u5883\u5b89\u88c5 python3 manage.py install --env host\n \u5bb9\u5668\u73af\u5883\u5b89\u88c5 python3 manage.py install --env docker\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u56db\u3001\u914d\u7f6e\u9879","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u670d\u52a1\u7aef\u914d\u7f6e","text":"setting/config/server.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u914d\u7f6e\u9879\uff0c\u5305\u542b\u4e86\u6240\u6709\u670d\u52a1\u7aef\u6240\u6709\u7684\u53ef\u914d\u7f6e\u9879\u3002 \u672c\u5730\u65e0\u7f51\u7edc\u8fd0\u884c \u5c06\u914d\u7f6e\u9879 network=0 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u672c\u5730\u6709\u7f51\u7edc\u8fd0\u884c \u914d\u7f6e\u9879 network=1 (1)\u914d\u7f6e\u9879 client_alias= \u914d\u7f6e\u4e3a\u4f60\u8981\u6d4b\u8bd5\u7684\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5982 Alias1 \u6d4b\u8bd5\u673a\u522b\u540d\u5728 setting/config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 (2)\u914d\u7f6e\u9879 client_alias= \u4e3a\u7a7a\uff0c\u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager --client_alias Alias1\uff0c\u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002(Alias1 \u4e3a\u4f60\u914d\u7f6e\u7684\u6d4b\u8bd5\u673a\u522b\u540d) (1)\u548c(2)\u53ea\u8981\u4f7f\u7528\u5176\u4e00\u5373\u53ef\u3002 \u6709\u7f51\u7edc\u8fd0\u884c\uff0c\u4e14\u9700\u8981\u901a\u8fc7 Jenkins \u4e0a\u8fd0\u884c\u4e00\u4e2a job \uff0c\u540c\u65f6\u63a7\u5236\u591a\u53f0\u673a\u5668\u3002 \u914d\u7f6e\u9879 network=1 \u914d\u7f6e\u9879 client_alias= \u4e0d\u7528\u914d\u7f6e\uff0c\u5728\u8fd0\u884c run.sh \u7684\u65f6\u5019\u76f4\u63a5\u7a7a\u683c\u52a0\u522b\u540d\u5373\u53ef\uff0c\u6bd4\u5982\uff1a\u6d4b\u8bd5\u673a\u522b\u540d\u4e3a Alias1 \uff0c\u4e14\u5df2\u7ecf\u5728 config/client.ini \u4e2d\u914d\u7f6e\u4e86 Alias1 \u7684user ip password \uff0c\u5219\u8fd0\u884c bash run.sh Alias1 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u5728 Jenkins pipeline \u91cc\u9762\u901a\u8fc7\u5e76\u884c stage \u6216\u5e76\u884c\u8c03\u7528\u4e0b\u5c42\u4efb\u52a1\u7684\u65b9\u5f0f\u53ef\u4ee5\u5b9e\u73b0\u5927\u89c4\u6a21\u7684\u6027\u80fd\u6d4b\u8bd5\u9700\u6c42\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;1\u3001KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2\u3001KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f, e.g. TAGS = L1 or smoke\n[case_conf]\n# \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\uff0cocr\u6587\u6848\u8bc6\u522b\u8f83\u6162\uff0c\u4e0d\u63a8\u8350\u4f7f\u7528\nfind_by = stage\n# \u6700\u540e\u4e00\u4e2a\u7a33\u5b9a\u9636\u6bb5\u7684\u5e27\u6570\u8bc6\u522b\n# \u9996\u5e27\u5b58\u5728\u540e\u7684\u7b2c\u4e00\u4e2a\u5927\u4e8e\u8be5\u914d\u7f6e\u5e27\u6570\u7684\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u5c3e\u5e27\nfinal_stable_num=100\n# \u4ece\u8be5\u5e27\u6570\u5f00\u59cb\u8bc6\u522b\u6587\u6848\u6216\u56fe\u7247\uff0c\u51cf\u5c11\u5206\u6790\u65f6\u95f4\nstart_num = 150\n# \u8bc6\u522b\u7684\u6587\u6848\ntext=\n# \u8bc6\u522b\u56fe\u7247\nmatch=apps/xxx/images/match.png\n# \u8bc6\u522b\u76f8\u4f3c\u5ea6\nmatch_rate=0.9\n# \u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6bd4\u5982\u70ed\u542f\u52a8\u7528\u4f8b\uff0c\u4ece\u70b9\u51fb\u6253\u5f00\u5230\u505c\u6b62\u5f55\u5c4f\uff0c\u4e2d\u95f4\u7b49\u5f855\u79d2\uff1b\nduration = 15\n# \u5355\u6761\u7528\u4f8b\u6267\u884c\u7684\u6b21\u6570\ncount = 5\n# \u7a33\u5b9a\u9636\u6bb5\u5212\u5206\u7684\u76f8\u4f3c\u5ea6\nstable_similarity = 0.9997\n[server]\n# \u8c03\u8bd5\u6a21\u5f0f=1\uff0c\u4e3a\u5f00\u542f\u8c03\u8bd5\u6a21\u5f0f\uff0c0\u4e3a\u5173\u95ed\u3002\n# \u8c03\u8bd5\u6a21\u5f0f\u4e0b\u9ed8\u8ba4\u53ea\u6267\u884c\u4e00\u6b21\u7528\u4f8b\uff0c\u4e0d\u5173\u673a\n# \u7f16\u5199\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u5efa\u8bae\u5f00\u542fmaintain\u3002\nMAINTAIN = 0\n# \u8fd0\u884c\u7684\u73af\u5883docker\u5bb9\u5668\u73af\u5883\uff0chost\u5bbf\u4e3b\u673a\u73af\u5883\nENV = docker\n# \u670d\u52a1\u7aef\u5bc6\u7801\nPASSWORD=1\n# \u6307\u5b9a\u6d4b\u8bd5\u673a\u522b\u540d\n# \u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6bd4\u5982\uff1a\n# [AMD]\n# ip=10.8.15.86\n# user=uos\n# \u5176\u4e2d AMD \u4e3a\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5219client_alias=AMD\nCLIENT_ALIAS = x86\uff08Intel-i7\uff09\n# 1 \u5f00\u542f\u7f51\u7edc, 0 \u5173\u95ed\u7f51\u7edc\n# \uff081\uff09\u670d\u52a1\u7aef\u4e0e\u6d4b\u8bd5\u673a\u987b\u5728\u540c\u4e00\u7f51\u6bb5\u4e0b\uff0c\u4f60\u53ef\u4ee5\u5c1d\u8bd5\u5728\u670d\u52a1\u7aef\u901a\u8fc7ssh\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c\u5982\u679c\u53ef\u4ee5\u8fde\u63a5\uff0c\u8bf4\u660e\u7f51\u7edc\u6b63\u5e38\u3002\n# \uff082\uff09\u5f53input_type=FILE_NAME \u65f6\uff0c\u5fc5\u987b\u5f00\u542f\u7f51\u7edc\u3002\nNETWORK = 1\n# \u6027\u80fd\u7ed3\u679c\u7edf\u8ba1\u5355\u4f4d \u6beb\u79d2\u2014ms, \u79d2\u2014s\nUNIT=ms\n# \u6d4b\u8bd5\u673a\u5f00\u673a\u8fdb\u5165\u684c\u9762\u540e\u7b49\u5f85\u65f6\u95f4,\u5355\u4f4d/\u79d2\nSTARTUP_DELAY = 60\n# 1\u4e3a\u5220\u9664\u7f13\u5b58\uff0c0\u4e3a\u4e0d\u5220\u9664\u7f13\u5b58\n# \u7528\u4f8b\u6267\u884c\u5b8c\u540e\u4f1a\u5728report\u76ee\u5f55\u4e0b\u751f\u6210\u667a\u80fd\u89e3\u6790\u7684\u4e00\u4e9b\u7f13\u5b58\u56fe\u7247\u3002\nCACHE = 0\n# \u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u62a5\u544a\u4f1a\u4fdd\u5b58\u5728\u9879\u76ee\u4e0breport\u76ee\u5f55\u4e2d\uff1b\n# \u6307\u5b9a\u62a5\u544a\u76ee\u5f55\u5219\u5b58\u653e\u5230\u6307\u5b9a\u76ee\u5f55\u3002\nREPORT_PATH = report\n# \u670d\u52a1\u7aef\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684icon\u8d44\u6e90\u4f1a\u7f13\u5b58\u5728\u9879\u76ee\u4e0binput\u76ee\u5f55\u4e2d\nINPUT = input/\n# 1\u4e3a\u6d4b\u8bd5\u5b8c\u5173\u673a\uff0c0\u4e3a\u6d4b\u8bd5\u5b8c\u4e0d\u5173\u673a\nSHUTDOWN = 0\n# \u89e3\u6790\u8fdb\u7a0b\u6570\uff08\u4e0d\u63a8\u8350\u4fee\u6539\uff09\n# 3\u4e2a\u8fdb\u7a0b\u89e3\u6790\u89c6\u9891\u5df2\u7ecf\u80fd\u591f\u6ee1\u8db3\uff0c\u5373\u4f7f\u589e\u52a0\u8fdb\u7a0b\u6570\u4e5f\u4e0d\u80fd\u51cf\u5c11\u6574\u4f53\u8017\u65f6\n# \u53e6\u5916\u8fd8\u8981\u770bCPU\u6838\u6570\u662f\u5426\u652f\u6301\u3002\nPARSING_PROCESS = 3\n# 1\u4e3a\u4f7f\u7528\u7ee7\u7535\u5668\u5f00\u5173\u673a\uff0c0\u4e3a\u4f7f\u7528reboot\u547d\u4ee4\u91cd\u542f\u3002\u4f9d\u8d56\u7ee7\u7535\u5668\u786c\u4ef6\u8bbe\u5907\uff0c\u9700\u8981\u4f7f\u7528\u8054\u7cfb\u5f00\u53d1\u8005\nRELAY = 0\n# \u83b7\u53d6\u6d4b\u8bd5\u5e94\u7528\u7684\u7248\u672c, %s \u5360\u4f4d\u5e94\u7528\u540d\n# \u5982\u679c\u8be5\u914d\u7f6e\u4e3a\u7a7a\uff0c\u5219\u4e0d\u83b7\u53d6\u5e94\u7528\u7684\u7248\u672c\u4fe1\u606f\u3002\nCOMMAND = apt policy %s 2>/dev/null|grep \"\u5df2\u5b89\u88c5\"|awk -F \"\uff1a\" \"{print \\$2}\"\n# \u5173\u673a\u7b49\u5f85\u5f00\u542f\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6839\u636e\u6d4b\u8bd5\u673a\u6027\u80fd\u4e0d\u540c\uff0c\u5f00\u5173\u673a\u8017\u65f6\u53ef\u80fd\u4e0d\u540c\uff0c\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u673a\u60c5\u51b5\u914d\u7f6e\u3002\nSHUTDOWN_DELAY = 30\n# \u53ef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u56fe\u7247\u683c\u5f0f\uff0c\u4ee5\u82f1\u6587\u9017\u53f7\u9694\u5f00\u3002\n# \u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u76ee\u524d\u6211\u4eec\u4ec5\u9a8c\u8bc1\u4e86jpg,jpeg,png\u8fd9\u4e09\u79cd\u5e38\u7528\u7684\u56fe\u7247\u683c\u5f0f\u3002\nINPUT_TYPES = jpg,jpeg,png\n# \u6027\u80fd\u5206\u6790\u8865\u5e27\uff0c\u7b49\u4e8e\u6216\u4f4e\u4e8e\u8be5\u503c\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u9700\u8981\u51cf\u6389\u3002\nUN_STAB_START = 3\n# \u670d\u52a1\u7aef\u83b7\u53d6\u6d4b\u8bd5\u673a\u56fe\u50cf\u7684\u5e27\u7387\uff0c\u5373\u6bcf\u79d2\u83b7\u53d6\u591a\u5c11\u5f20\u6d4b\u8bd5\u673a\u4e0a\u7684\u56fe\u50cf\u3002\n# \u9ed8\u8ba4\u5e27\u7387\u4e3a30\u5e27/\u79d2\uff0c\u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u53ef\u80fd\u4f1a\u5bf9\u89e3\u6790\u7ed3\u679c\u9020\u6210\u504f\u5dee\u3002\nFPS = 30\n# \u4ee5\u4e0b\u573a\u666f\u7c7b\u578b\u4f1a\u91cd\u542f\u6d4b\u8bd5\u673a,\u591a\u79cd\u573a\u666f\u4f7f\u7528\u9017\u53f7\u9694\u5f00\nSCENE = cold\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = http://10.8.13.78:8890\n#\u5c4f\u5e55\u56fe\u7247\u4e34\u65f6\u5b58\u653e\u4f4d\u7f6e\nSCREEN_CACHE = /tmp/screen\n# =======================================\n[log]\n# \u65e5\u5fd7\u7ea7\u522b\uff0cOFF\u3001FATAL\u3001ERROR\u3001WARN\u3001INFO\u3001DEBUG\u3001ALL\n# \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u65e5\u5fd7\u8f93\u51fa\uff0clog_cli=INFO\u8868\u793a \u4ec5\u8f93\u51faINFO\u53ca\u4ee5\u4e0a\u7ea7\u522b\u7684\u65e5\u5fd7\u3002\nLOG_LEVEL = DEBUG\n# \u65e5\u5fd7\u6587\u4ef6\u4fdd\u5b58\u8def\u5f84\nLOG_PATH= logs\n# =======================================\n[dockerhub]\n# \u5bb9\u5668\u767b\u9646\u8d26\u53f7\nDOCKER_USER = user\n# \u5bb9\u5668\u767b\u9646\u5bc6\u7801\nDOCKER_PASSWORD = User1234\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u6d4b\u8bd5\u673a\u914d\u7f6e","text":"setting/config/client.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u4fe1\u606f\u3002 \u6709\u7f51\u7edc\u7684\u60c5\u51b5\u4e0b\uff0c\u670d\u52a1\u7aef\u9700\u8981\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u56e0\u6b64\u4f60\u9700\u8981\u5199\u5165 \u6d4b\u8bd5\u673a\u522b\u540d \u3001 user \u3001ip\u3001 password \u3002 # \u6d4b\u8bd5\u673a\u522b\u540d\n[Alias1] # \u6d4b\u8bd5\u673aip\nip=10.8.15.86 # \u6d4b\u8bd5\u673a\u7528\u6237\u540d\nuser=uos\n \u547d\u540d\u5efa\u8bae\uff1aAliasA1\u3001AliasA2\u3001AliasB1\u3001AliasB2\uff0c\u4e0d\u8981\u91cd\u540d\u3002 \u65e0\u7f51\u7edc\u60c5\u51b5\u4e0b\uff0c\u4ec5\u9700\u8981\u5173\u6ce8\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\u9879 width=\u3001 height= \u5373\u53ef\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a [client]\n# \u9ed8\u8ba4\u6d4b\u8bd5\u673a\u7528\u6237\u540d\uff0c\u5bc6\u7801\uff0cip\nip=\nuser=\n# \u6d4b\u8bd5\u673a\u5bc6\u7801\npassword=1\n# \u6d4b\u8bd5\u673a\u4e3b\u9898\ntheme=bloom\n# \u6d4b\u8bd5\u673aicon\u76ee\u5f55\npath=/usr/share/icons\n# \u7cfb\u7edfdesktop\u6587\u4ef6\u7684\u5b58\u653e\u76ee\u5f55\uff0cUOS\u7cfb\u7edf\u9ed8\u8ba4\u4e3a/usr/share/applications\ndesktop_path=/usr/share/applications\n# \u7528\u4e8e\u5224\u65ad\u6d4b\u8bd5\u673a\u662f\u5426\u5f00\u673a\u8fdb\u5165\u684c\u9762\u7684\u8bc6\u522b\u6807\u8bc6\u3002\n# 1\u3001\u901a\u8fc7\u684c\u9762\u56fe\u6807\u8bc6\u522b\u3002\n# - type=FILE_NAME\u65f6\uff0c\u670d\u52a1\u5668\u548c\u6d4b\u8bd5\u673a\u5fc5\u987b\u5728\u540c\u4e00\u5c40\u57df\u7f51\u5185\u3002\n# - power_on=dde-computer\u8868\u793a\u901a\u8fc7\u684c\u9762\u8ba1\u7b97\u673a\u56fe\u6807\u5224\u65ad\u5f00\u673a\u8fdb\u5165\u684c\u9762\u3002\n# 2\u3001\u901a\u8fc7\u672c\u5730\u56fe\u7247\u4f5c\u4e3a\u5f00\u673a\u8bc6\u522b\u3002\n# - type= \u4f20\u5165\u4e3a\u56fe\u7247\u683c\u5f0f\uff0ctype\u652f\u6301\u7684\u7c7b\u578b\u5305\u542b\u5728server.ini\u5185\u914d\u7f6e\u9879input_type=jpg,jpeg,png\u3002\n# - power_on= \u4f20\u5165\u7684\u662f\u672c\u5730\u56fe\u7247\u7684\u8def\u5f84\u3002\ntype=FILE_NAME\npower_on=dde-computer\n# \u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\uff08\u6d4b\u8bd5\u673a\u8fde\u63a5\u91c7\u96c6\u76d2\uff0c\u91c7\u96c6\u76d2\u7684\u5206\u8fa8\u7387\uff09\nheight=1080\nwidth=1920\n[AliasA1] ip=10.8.15.86\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n[AliasA2]\nip=10.8.15.20\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_2","title":"3\u3001\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e","text":"\u968f\u7740\u6d4b\u8bd5\u573a\u666f\u7684\u4e0d\u65ad\u5f15\u5165\uff0c\u53d1\u73b0\u73b0\u6709\u670d\u52a1\u7aef\u91cc\u7684\u914d\u7f6e\u9879\u5e76\u4e0d\u9002\u7528\u4e8e\u6240\u6709\u7684\u6027\u80fd\u573a\u666f\uff0c\u4e8e\u662f\u5c06\u670d\u52a1\u7aef\u914d\u7f6e\u8fdb\u884c\u4e00\u4e2a\u63d0\u53d6\uff0c\u53ef\u505a\u5355\u4e2a\u573a\u666f\u7684\u4e2a\u6027\u5316\u914d\u7f6e\uff0c\u5f53\u7136\u539f\u6765\u7684\u670d\u52a1\u7aef\u914d\u7f6e\u529f\u80fd\u4fdd\u7559\uff0c\u53ea\u662f\u5f53\u4f60\u914d\u7f6e\u4e86\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e\u540e\uff0c\u4f18\u5148\u4f7f\u7528\u4e2a\u6027\u5316\u914d\u7f6e\u91cc\u9762\u7684\u5185\u5bb9\uff0c\u4ee5\u4e0b\u662f\u5bf9\u4e2a\u6027\u5316\u914d\u7f6e\u7684\u4ecb\u7ecd\u3002 \u76ee\u524d\u6bcf\u4e00\u4e2a py \u6587\u4ef6\u5bf9\u5e94\u4e00\u4e2a\u6027\u80fd\u6d4b\u8bd5\u573a\u666f\uff0c\u4e8e\u662f\u5728\u540c\u7ea7\u76ee\u5f55\u4e0b\u521b\u5efa\u4e00\u4e2a\u4e0e\u4e4b\u540c\u540d\u7684 json \u6587\u4ef6\uff0c\u4f5c\u4e3a\u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6 apps\n\u251c\u2500\u2500 album\n \u251c\u2500\u2500 test_album_01_start.json # \u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6\n\u2514\u2500\u2500 test_album_01_start.py # \u6027\u80fd\u573a\u666f\u6587\u4ef6\n \u4ee5\u4e0b\u662f\u5bf9 json \u6587\u4ef6\u4e2d\u914d\u7f6e\u7684\u89e3\u91ca\uff0c\u82e5\u67d0\u9879\u914d\u7f6e\u4e0d\u9700\u8981\uff0c\u53ef\u4ee5\u7f3a\u5931\uff0c\u4f46\u4e0d\u80fd\u4e3a\u7a7a\uff1b {\n\"title\": \"test_album_start\", # \u6807\u9898\uff1b\u5fc5\u987b\n\"app_name\": \"deepin-album\", # \u573a\u666f\u6240\u5c5e\u7684\u5e94\u7528\uff1b\u5fc5\u987b\n\"scene\": \"hot\", # \u573a\u666f\u522b\u540d\uff1b\u5fc5\u987b\n\"icon\": [\"deepin-album\"], # \u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684icon\u5230\u670d\u52a1\u7aef\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\uff1b\u53ef\u7f3a\u5931\n# \u6ce8\u610f\uff1a\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684desktop\u6587\u4ef6\u540d\u4e3adeepin-album.desktop\uff0c\n# \u53ea\u9700\u8981\u5199deepin-album\u5373\u53ef\uff0c\u201c.desktop\u201d\u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002\n\"size\": { # \u56fe\u7247\u5bf9\u6bd4\u7684\u533a\u57df\u8bbe\u7f6e\u9879\uff0c\u67d0\u4e9b\u5e94\u7528\u5f53\u524d\u5c4f\u5e55\u7684\u90e8\u5206\u533a\u57df\u9700\u8981\u5c06\u5176\u53bb\u6389\uff0c\u53ef\u4ee5\u8bbe\u7f6e\u6b64\u9879\uff0c\u5982\u679c\u6ca1\u6709\u5219\u53ef\u4e0d\u5199\uff1b\u53ef\u786e\u5b9e\n\"x-coordinate\": 0, # \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n\"y-coordinate\": 0, # \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n\"width\": 850, # \u6a2a\u5411\u957f\u5ea6\n\"height\": 1920 # \u7eb5\u5411\u9ad8\u5ea6\n},\n\"count\": 5, # \u573a\u666f\u6267\u884c\u7684\u6b21\u6570\uff1b\u5fc5\u987b\n\"duration\": 5, # \u8be5\u6761\u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff0c\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7279\u5b9a\u573a\u666f\uff0c\u8be5\u914d\u7f6e\u4e3a\u53ef\u9009\u9879\uff0c\u8986\u76d6 server.ini \u4e2d\u7684\u914d\u7f6e\uff1b\u53ef\u7f3a\u5931\n\"stable_similarity\": 0.9997, # \u6027\u80fd\u573a\u666f\u5206\u9636\u6bb5\u65f6\u7684\u56fe\u7247\u76f8\u4f3c\u5ea6\u5bf9\u6bd4\uff0c\u524d\u540e\u56fe\u7247\u4f4e\u4e8e\u8be5\u503c\uff0c\u5219\u5206\u4e3a\u4e0d\u7a33\u5b9a\u9636\u6bb5\uff1b\u53ef\u7f3a\u5931\n\"find_by\": \"stage\", # \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\n\"final_stable_num\": 100, # \u67e5\u627e\u6700\u540e\u4e00\u4e2a\u5927\u4e8e\u8be5\u503c\u7684\u7a33\u5b9a\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u7684\u5c3e\u796f\uff1b\u53ef\u7f3a\u5931\n\"start_num\": 150,\n\"text\": \"\", # ocr\u8bc6\u522b\u7684\u6587\u6848\n\"match\": \"apps/xxx/images/match.png\", # \u56fe\u50cf\u5339\u914d\u7684\u56fe\u7247\u6587\u4ef6\u8def\u5f84\n\"match_rate\": 0.9 # \u5339\u914d\u76f8\u4f3c\u5ea6\n}\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e94\u3001\u6d4b\u8bd5\u6d41\u7a0b","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516d\u3001\u7528\u4f8b\u7f16\u5199\u53ca\u65b9\u6cd5\u53c2\u6570\u6307\u5f15","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"1\u3001\u7528\u4f8b\u5b9e\u4f8b\u8bf4\u660e","text":"# \u6807\u51c6\u5e93\u5bfc\u5165\nfrom time import sleep\n# \u5bfc\u5165\u4e09\u65b9\u5e93pytest\nimport pytest\n# \u5bfc\u5165\u7528\u4f8b\u6267\u884c\u8981\u7528\u5230\u7684Widget\u7c7b\nfrom src.base_widget import BaseWidget\nclass TestStart:\n# class\u7ea7\u522b\u7684fixture\uff0c\u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u6267\u884c\u3002autouse=True \u81ea\u52a8\u5728\u5f53\u524d\u4f5c\u7528\u57df\u4e0b\u4f7f\u7528\u3002\n@pytest.fixture(scope=\"class\", autouse=True)\n# \u6d4b\u8bd5\u70ed\u542f\u52a8\u4e4b\u524d\u9700\u8981\u9884\u542f\u52a8\u3002\ndef application_pre_start(self):\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().right_click_element(\"deepin-album\")\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().click_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\")\nsleep(2)\n# \u5feb\u6377\u952e\u5173\u95ed\u7a97\u53e3\nBaseWidget().hot_key(\"alt\", \"f4\")\nsleep(2)\n# \u9ed8\u8ba4\u4e3afunction\u7ea7\u522b\u7684fixture\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\uff0cclass\u7ea7\u522bfixture\u6267\u884c\u4e4b\u540e\u6267\u884c\u3002\n@pytest.fixture(autouse=True)\ndef setup_start(self):\n# \u53f3\u952e\u70b9\u51fb deepin-album \u56fe\u6807\nBaseWidget().right_click_element(\"deepin-album\")\n# \u79fb\u52a8\u5230\u53f3\u952e\u83dc\u5355\u4e2d\u6253\u5f00\uff08open.png\uff09\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().move_to(*BaseWidget().find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))\n# \u7b49\u5f85\u79fb\u52a8\u5b8c\u6210\nsleep(0.5)\ndef test_album_start(self):\n# \u70b9\u51fb\u201c\u6253\u5f00\u201d\nBaseWidget().click() \n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"2\u3001\u65b9\u6cd5\u53c2\u6570\u8bf4\u660e","text":"2.1\u3001find_element \u65b9\u6cd5 def find_element(element: str, input_type: str = \"FILE_NAME\", fill_color_position: tuple = (-1, -1), size: tuple = (25, 70)):\npass\n \u53c2\u6570 element \u548c input_type \uff081\uff09\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u5143\u7d20 - `input_type` \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a `FIEL_NAME` \uff0c\u8868\u793a\u901a\u8fc7\u5e94\u7528 `icon` \u5bfb\u627e\u5143\u7d20\uff0c\u6b64\u65b9\u6cd5\u4f1a\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u5e94\u7528 `icon` \u56fe\u6807\u3002\n \u4e3e\u4f8b\uff1a\u9ed8\u8ba4\u60c5\u51b5\u4e0b input_type \u53c2\u6570\u4e0d\u9700\u8981\u4f20\u5165\uff0c find_element(\"deepin-album\")\uff0c\u8868\u793a\u901a\u8fc7 deepin-album \u7684\u5e94\u7528 icon \u6765\u83b7\u53d6\u5750\u6807\uff0c\u6ce8\u610f\uff0c\u6b64\u65f6\u4f20\u5165\u7684 deepin-album \u53c2\u6570\u5b9e\u9645\u662f desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u548c2.3\u4e2d\u7684 icon \u53d8\u91cf\u4e00\u81f4\u3002 \u6211\u4eec\u5efa\u8bae\u4f18\u5148\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\uff0c\u4f46\u6b64\u65b9\u6cd5\u4f9d\u8d56\u7f51\u7edc\uff0c\u8bf7\u6839\u636e\u6d4b\u8bd5\u73af\u5883\u5b9e\u9645\u60c5\u51b5\u9009\u62e9\u3002 \uff082\uff09\u901a\u8fc7\u672c\u5730\u56fe\u7247\u8bc6\u522b\u5143\u7d20 - \u53c2\u6570 `input_type` \u4f20\u5165\u56fe\u7247\u683c\u5f0f\uff0c\u6bd4\u5982\u622a\u53d6\u7684\u672c\u5730\u56fe\u7247\u683c\u5f0f\u4e3a `png`\uff0c\u90a3\u4e48 `input_type=\"png\"`\uff0c\u6b64\u65f6\u53c2\u6570 `element ` \u4f20\u5165\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5efa\u8bae\u5b58\u653e\u5728\u5bf9\u5e94\u7684\u4ea7\u54c1 `apps/app/picture/` \u76ee\u5f55\u4e0b\uff0c\u8def\u5f84\u4e3a\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u7684\u76f8\u5bf9\u8def\u5f84\u3002\n- \u4e3e\u4f8b\uff1a`find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))`\uff0c\u8868\u793a\u901a\u8fc7\u672c\u5730\u56fe\u7247 `open.png` \u8bc6\u522b\u5143\u7d20\u3002\n \u53c2\u6570 fill_color_position fill_color_position \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (-1, -1)\uff0c(-1, -1) \u8868\u793a\u53d6\u5c4f\u5e55\u4e2d\u53f3\u4e0b\u89d2\u6700\u540e\u4e00\u4e2a\u50cf\u7d20\u70b9\u4f5c\u4e3a\u586b\u5145\u5750\u6807\uff0c\u5728 1920x1080 \u5c4f\u5e55\u5206\u8fa8\u7387\u4e0b\u5373\u5b9e\u9645\u5750\u6807\u4e3a (1919, 1079) \uff0c\u8fd9\u6837\u7684\u5199\u6cd5\u53ef\u4ee5\u9002\u914d\u4e0d\u540c\u5927\u5c0f\u7684\u5c4f\u5e55\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0d\u540c\u65b9\u4f4d\uff1a \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0b\u65b9\uff0c\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u4e0d\u9700\u8981\u4f20\u5165\u8be5\u53c2\u6570\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u5de6\u8fb9\uff0cfill_color_position=(1, 1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u53f3\u8fb9\uff0cfill_color_position=(-1, -1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0a\u8fb9\uff0cfill_color_position=(1, 1) \u4ece\u684c\u9762\u542f\u52a8\u5e94\u7528\uff0c\u5219\u9700\u8981\u4f20\u5165\u9664\u4efb\u52a1\u680f\u4ee5\u5916\u5176\u4ed6\u4f4d\u7f6e\u7684\u5750\u6807\uff0c\u6bd4\u5982(100, 100)\uff0c\u53ea\u8981\u8fd9\u4e2a\u5750\u6807\u4e3a\u9664\u5e94\u7528\u548c\u4efb\u52a1\u680f\u533a\u57df\u90fd\u53ef\u4ee5\u3002 \u4ece\u542f\u52a8\u5668\u91cc\u9762\u542f\u52a8\u5e94\u7528\uff0c\u9700\u8981\u586b\u5145\u7684\u5750\u6807\u4e3a\u542f\u52a8\u5668\u533a\u57df\u3002 \u6ce8\uff1a\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u65f6\uff0c\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684 icon \u539f\u6587\u4ef6\u4e3a svg \u77e2\u91cf\u56fe\uff0c\u8f6c\u6362\u4e3a png \u4e4b\u540e\u9700\u8981\u586b\u5145\u8fb9\u7f18\u900f\u660e\u90e8\u5206\u3002 \u53c2\u6570 size size \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (25, 70)\uff0c\u8868\u793a\u6d4b\u8bd5\u673a\u4e0a dock \u680f\u4e0a\u5e94\u7528\u56fe\u6807\u7684\u5927\u5c0f\u8303\u56f4\u3002 UOS \u7cfb\u7edf dock \u680f\u662f\u53ef\u4ee5\u4e0a\u4e0b\u62d6\u52a8\u5927\u5c0f\u7684\uff0c\u968f\u7740 dock \u680f\u5927\u5c0f\u6539\u53d8\uff0c\u5e94\u7528\u56fe\u6807\u7684\u8303\u56f4\u4e3a25\u523070\u4e4b\u95f4\u3002 \u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u64cd\u4f5c\u7cfb\u7edf\u4e0a dock \u680f\u5927\u5c0f\u4e0d\u4e00\u6837\uff0c\u53ef\u4ee5\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u4f20\u5165\u5927\u5c0f\u8303\u56f4\u3002 2.2\u3001click_element\u3001 right_click_element\uff0c double_click_element \u8fd9\u51e0\u4e2a\u65b9\u6cd5\u53c2\u6570\u89c4\u5219\u4e0e find_element \u65b9\u6cd5\u4e00\u6837\u3002\u4ed6\u4eec\u5b9e\u9645\u4e0a\u662f\u5728 find_element \u65b9\u6cd5\u57fa\u7840\u4e4b\u4e0a\u505a\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u589e\u52a0\u4e86\u9f20\u6807\u7684\u52a8\u4f5c\uff0c\u5982\u679c\u4f60\u4e0d\u60f3\u4f7f\u7528\u8fd9\u51e0\u4e2a\u65b9\u6cd5\uff0c\u5728\u7528\u4f8b\u4e2d\u4e5f\u53ef\u4ee5\u901a\u8fc7 find_element \u83b7\u53d6\u5230\u5750\u6807\uff0c\u7136\u540e\u5c06\u5750\u6807\u4f20\u5165\u5230\u952e\u9f20\u7684\u65b9\u6cd5\u4e2d\uff0c\u53ef\u4ee5\u5b9e\u73b0\u540c\u6837\u7684\u6548\u679c\u3002 2.3\u3001\u7528\u4f8b\u7c7b\u4e2d\u6709\u4e2a\u7c7b\u53d8\u91cf icon = [\"deepin-album\"] \u9700\u8981\u7279\u6b8a\u8bf4\u660e\uff0c\u5217\u8868\u4e2d\u7684\u5143\u7d20\u4e3a\u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709 icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684 icon \u5230\u670d\u52a1\u7aef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528 desktop \u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684 desktop \u6587\u4ef6\u540d\u4e3a deepin-album.desktop\uff0c\u53ea\u9700\u8981\u5199 deepin-album \u5373\u53ef\uff0c.desktop \u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e03\u3001\u6267\u884c\u5165\u53e3","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"1\u3001\u7528\u4f8b\u7ec4\u7ec7","text":"\u5728 setting/config/server.ini \u6587\u4ef6\u4e2d APP_NAME= \u5b57\u6bb5\u4e3a\u7528\u4f8b\u7684\u6267\u884c\u7684\u76ee\u5f55\uff0c\u9ed8\u8ba4\u4e3a apps \u76ee\u5f55\u4e0b\u6240\u6709\u7528\u4f8b\u3002\u5982\u679c\u4f60\u60f3\u6307\u5b9a\u6267\u884c\u67d0\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4f60\u53ef\u4ee5\u5c06\u8be5\u914d\u7f6e\u9879\u6307\u5b9a\u5230\u5e94\u7528\u7684\u7528\u4f8b\u76ee\u5f55\uff0c\u6bd4\u5982\uff1aAPP_NAME=deepin_album\uff0c \u8868\u793a\u6267\u884c\u76f8\u518c\u76ee\u5f55\u4e0b\u7684\u7528\u4f8b\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a python3 manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music\n -k KEYWORDS, --keywords KEYWORDS\n \u7528\u4f8b\u7684\u5173\u952e\u8bcd\n -t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e\n --log_level LOG_LEVEL \u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n --env {host,docker} \u5728\u5bbf\u4e3b\u673a\u6216\u5bb9\u5668\u73af\u5883\u6267\u884c\n --client_alias \u9009\u62e9\u6d4b\u8bd5\u673a\u522b\u540d, \u53ef\u9009\u9879\u4e3aclient.ini\u4e2d\u5df2\u914d\u7f6e, \u9ed8\u8ba4\u503c\u4e3a zx-x86.\n --count \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a python3 manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\" --env docker\n \u6ce8\uff1a\u5728\u5bb9\u5668\u4e2d\u6267\u884c\u65f6\uff0c\u82e5\u5f3a\u5236\u9000\u51fa\uff0c\u5bb9\u5668\u5e76\u4e0d\u4f1a\u505c\u6b62\u8fd0\u884c\uff01"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_9","title":"\u516b\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1json","title":"1\u3001Json \u62a5\u544a","text":"\u81ea\u7814\u89c6\u9891\u89e3\u6790\u5de5\u5177\u4f1a\u5bf9\u5355\u6761\u7528\u4f8b\u6267\u884c\u4e00\u8f6e\u751f\u6210\u4e00\u4e2a json \u6587\u4ef6\uff0c\u5b58\u653e\u4e8e report/{app_name}/{scene}/{run_num} \u76ee\u5f55\u4e0b\uff0c\u547d\u540d\u683c\u5f0f\u4e3a\uff1a report.json json \u5185\u5bb9\u4e3e\u4f8b\uff1a [\n{\n\"Stab1\": {\n\"images\": [1,2...150,151],\n\"startStub\": 0,\n\"type\": \"Stab\"\n}\n},\n{\n\"Stab2\": {\n\"images\": [152,153...169,170],\n\"startStub\": 1,\n\"type\": \"UnStab\"\n}\n},\n{\n\"Stab3\": {\n\"images\": [171,172...300,301],\n\"startStub\": 0,\n\"type\": \"UnStab\"\n}\n}\n]\n \u8bf4\u660e\uff1a Stab \uff1a\u8868\u793a\u89e3\u6790\u8fc7\u7a0b\u4e2d\u4e0d\u540c\u7684\u9636\u6bb5\u3002 images \uff1a\u8868\u793a\u6bcf\u4e00\u5e27\u7684\u56fe\u7247\u5e8f\u53f7\u3002 startStub\uff1a \u4e3a\u8bc6\u522b\u5c3e\u5e27\u7684\u9636\u6bb5\u8868\u793a\uff0c\u5982\u679c \"startStub\": 1 \uff0c\u8bf4\u660e\u5c3e\u5e27\u51fa\u73b0\u5728\u8be5\u9636\u6bb5\u3002 type\uff1a \u4e3a Stab \u6216 UnStab \uff0c\u8868\u793a\u7a33\u5b9a\u9636\u6bb5\u6216\u4e0d\u7a33\u5b9a\u9636\u6bb5\u3002 \u5404\u9636\u6bb5\u6709\u5e27\u6570\u8865\u507f\uff0c\u9ed8\u8ba4\u8865\u507f\u7684\u5e27\u6570\u4e3a 3 \u5e27\uff08\u53ef\u4ee5\u901a\u8fc7 server.ini \u91cc\u9762 un_stab_start=3 \u8fdb\u884c\u914d\u7f6e\uff09\uff0c\u8868\u793a\u5c0f\u4e8e\u7b49\u4e8e 3 \u5e27\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u524d\u540e\u5747\u9700\u8981\u51cf\u6389\u3002 \u5e94\u7528\u542f\u52a8\u9636\u6bb5\u5c31\u662f\u5728 Stab2 \u9636\u6bb5\uff0c\u542f\u52a8\u65f6\u95f4\u4e3a\uff1a171 \u51cf 151 \u518d\u51cf\u6389\u524d\u540e\u8865\u507f\u5e27\u6570 6 \u5e27\uff0c\u5373 14 \u5e27\uff0c\u89c6\u9891\u5e27\u7387 30 \u5e27/\u79d2\uff0c\u56e0\u6b64\u542f\u52a8\u8017\u65f6\u4e3a\uff1a14 * 33 = 462 ms"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2excel","title":"2\u3001Excel \u62a5\u544a","text":"\u6240\u6709\u7528\u4f8b\u6267\u884c\u5e76\u89e3\u6790\u5b8c\u4e4b\u540e\u4f1a report \u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a\u6c47\u603b\u6570\u636e\u7684 Excel \u6587\u4ef6\uff0c\u6587\u4ef6\u540d\u4e3a\uff1a{time}_perf_time.xlsx\u3002 \u6ce8\u610f\uff0creport \u76ee\u5f55\u4e3a\u53ef\u914d\u7f6e\u9879\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u4f1a\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u751f\u6210\uff0c\u5982\u679c\u4f60\u5c06 report\uff0c\u6307\u5b9a\u5230\u9879\u76ee\u4e0b\u5176\u4ed6\u8def\u5f84\uff0c\u5219\u4f1a\u5728\u5bf9\u5e94\u7684\u8def\u5f84\u4e0b\u751f\u6210 json \u548c Excel \u6587\u4ef6\u3002 \u4f60\u4e5f\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8bfb\u53d6\u6240\u6709 json / excel \u62a5\u544a\u7684\u6570\u636e\uff0c\u751f\u6210\u4f60\u81ea\u5df1\u60f3\u8981\u7684\u4e00\u4e9b\u6d4b\u8bd5\u62a5\u544a\u5f62\u5f0f\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#usb","title":"\u4e5d\u3001USB \u4e32\u53e3\u9a71\u52a8\u952e\u9f20\u65b9\u6cd5","text":"\u4f4d\u4e8e src/utils/control/serial_communication \u76ee\u5f55\u4e0b\u7684 usb_mk.py \u6587\u4ef6 usb_mk = UsbMk()\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up()\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u652f\u6301\u4f20\u5165\u6c49\u5b57\uff0c\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click()\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() \n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() \n \uff084\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() \n \uff085\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() \n \uff086\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() \n \uff087\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff088\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff0810\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_10","title":"\u5341\u3001\u7ee7\u7535\u5668\u63a7\u5236\u4e3b\u673a\u5f00\u673a/\u91cd\u542f","text":"\uff08\u82e5\u4e0d\u4f7f\u7528\u7ee7\u7535\u5668\uff0c\u53ef\u5ffd\u7565\u8be5\u6b65\u9aa4\uff0c\u6267\u884c\u65f6\u4f1a\u901a\u8fc7\u547d\u4ee4 reboot\uff09"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u7ee7\u7535\u5668\u8bbe\u5907","text":"LCUS-2 \u578b \u53cc\u8def USB \u667a\u80fd\u4e32\u53e3\u63a7\u5236\u7ee7\u7535\u5668\u3002 https://item.taobao.com/item.htm?spm=a1z09.2.0.0.41d72e8dUYx2pi&id=582653718178&_u=i25r20ia6a2e "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2usb","title":"2\u3001USB \u5ef6\u957f\u7ebf","text":"\u666e\u901a\u7684 USB \u7ebf\u5373\u53ef\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_3","title":"3\u3001\u675c\u90a6\u7ebf","text":"3.1\u300140P \u6bcd\u5bf9\u516c\u675c\u90a6\u7ebf\u3002 3.2\u3001\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"4\u3001\u5b89\u88c5\u56fe\u6587\u6559\u7a0b","text":"4.1\u3001\u4f7f\u7528 USB \u5ef6\u957f\u7ebf\u8fde\u63a5\u63a7\u5236\u7aef\u548c\u7ee7\u7535\u5668\u3002 4.2\u3001\u5728\u7ee7\u7535\u5668\u5e38\u7aef\u548c\u516c\u5171\u7aef\u5747\u8fde\u63a5\u4e00\u6839\u675c\u90a6\u7ebf\u3002 4.3\u3001\u5728\u4e3b\u677f\u4e0a\u5f00\u673a\u9488\u548c\u91cd\u542f\u9488\u4e0a\u63d2\u4e0a\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 4.4\u3001\u5c06\u5f00\u673a\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76841\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1\u5de6\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 4.5\u3001\u5c06\u91cd\u542f\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76842\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1 \u53f3\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 \u82e5\u60f3\u4fdd\u7559\u539f\u7535\u6e90\u5f00\u5173\u7684\u7535\u6e90\u706f\uff0c\u53ef\u6839\u636e\u5982\u4e0a\u56fe\u6240\u793a\uff0c\u4f7f\u7528\u675c\u90a6\u7ebf\u8fde\u63a5\u4e3b\u677f\u4e0a\u7684\u7535\u6e90\u706f\u548c\u539f\u7535\u6e90\u5f00\u5173"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_11","title":"\u5341\u4e00\u3001\u5e38\u89c1\u95ee\u9898\u8bf4\u660e","text":"1\u3001ERROR: for uos Cannot restart container 2301b1a1395d7959ee6523d61b61c87084649af530786cdb8fb5b3ecbcbd1068: linux runtime spec devices: error gathering device information while adding custom device \"/dev/ttyACM0\": no such file or directory \u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u8fde\u63a5\u72b6\u6001\uff0c\u67e5\u770b /dev/ttyACM0 \u662f\u5426\u5b58\u5728\uff0c\u82e5\u5b58\u5728 /dev/ttyACMn\uff08n\u4e3a\u4efb\u610f\u6570\u5b57\uff09\uff0c\u91cd\u542f\u7535\u8111\u89e3\u51b3\u3002 2\u3001Error response from daemon: Container 5e700fdc769e8c74666d68a7f2bc3de58268b4594cf88706609d59f8dbc7362d is not running \u5bb9\u5668\u542f\u52a8\u5931\u8d25 1\uff09\u68c0\u67e5\u54ea\u4e00\u4e2a\u5bb9\u5668\u672a\u542f\u52a8 sudo docker container ls # \u5217\u51fa\u8fd0\u884c\u4e2d\u7684 Docker \u5bb9\u5668\n 2\uff09\u7f3a\u5c11 uos \u5bb9\u5668\uff0c\u68c0\u67e5 USB \u4e32\u53e3\u8fde\u63a5\u7ebf\u548c\u91c7\u96c6\u76d2\u8fde\u63a5\u7ebf\u662f\u5426\u6b63\u5e38\uff0c\u91cd\u542f\u540e\u6267\u884c bash install/setup.up # \u91cd\u65b0\u5b8c\u6574\u90e8\u7f72\u73af\u5883\n \u6216\u6267\u884c sudo docker-compose up -d --build # \u4ec5\u91cd\u65b0\u6784\u5efa Docker \u955c\u50cf\n 3\u3001\u82e5\u90e8\u7f72\u65f6\u63d0\u793a\u6302\u8f7d ttyACM0\u3001video0 \u5931\u8d25\uff0c\u8bf7\u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u53ca\u91c7\u96c6\u76d2\u662f\u5426\u63a5\u89e6\u826f\u597d\uff0c\u82e5\u63a5\u89e6\u826f\u597d\uff0c\u91cd\u542f\u5373\u53ef\u89e3\u51b3\u3002 4\u3001\u82e5\u51fa\u73b0\u56fe\u7247\u80fd\u8bc6\u522b\uff0c\u4f46\u662f\u9f20\u6807\u672a\u79fb\u52a8\u64cd\u4f5c\u65f6\uff0c\u5b89\u88c5\u7edd\u5bf9\u9f20\u6807\u64cd\u4f5c\u7684\u4f9d\u8d56\u5305\uff0c\u89c1\u7b2c\u4e09\u8282\u7b2c\u4e8c\u5c0f\u8282\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u6d4b\u8bd5\u673a\u3002 5\u3001\u7531\u4e8e\u901a\u8fc7\u91c7\u96c6\u5361\u83b7\u53d6\u7684\u6d4b\u8bd5\u673a\u5b9e\u65f6\u753b\u9762\uff0c\u5305\u542b\u4e86\u9f20\u6807\u7684\u6837\u5f0f\uff0c\u6240\u4ee5\u5bf9\u56fe\u7247\u8bc6\u522b\u65f6\uff0c\u9f20\u6807\u82e5\u505c\u7559\u5728\u56fe\u6807\u4e0a\u5c42\uff0c\u5219\u4f1a\u5bf9\u8bc6\u522b\u7ed3\u679c\u9020\u6210\u5f71\u54cd\uff0c\u9700\u8981\u5c06\u9f20\u6807\u79fb\u52a8\u81f3\u5176\u4ed6\u4f4d\u7f6e\uff0c\u6216\u8005\u9690\u85cf\u9f20\u6807\u89e3\u51b3\u3002 6\u3001Excel \u62a5\u544a\u4e2d\uff0c\u6d4b\u8bd5\u573a\u666f\u5217\u4e0e\u7528\u4f8b\u4e2d\u7684\u4e0d\u4e00\u81f4\uff0c\u5173\u952e\u5b57scene\u3001app_name\u3001\u67b6\u6784\u522b\u540d\uff0c\u4e0d\u80fd\u5305\u542b\u4e0b\u5212\u7ebf\u548c\u82f1\u6587\u7b26\u53f7\u7684\u5706\u62ec\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/","title":"\u6846\u67b6\u529f\u80fd\u4ecb\u7ecd","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2023/1/12\n# Author : Mikigo\n# =============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_2","title":"\u4e00\u3001\u4e00\u53e5\u8bdd\u7b80\u4ecb","text":"\u6b64\u6587\u6863\u4e3b\u8981\u60f3\u5bf9 YouQu \u6846\u67b6\u4e00\u4e9b\u91cd\u70b9\u7684\u529f\u80fd\u505a\u8be6\u7ec6\u7684\u4ecb\u7ecd\uff0c\u5305\u62ec\u5bf9\u4e00\u4e9b\u529f\u80fd\u5f00\u53d1\u7684\u80cc\u666f\u3001\u8981\u89e3\u51b3\u7684\u95ee\u9898\u3001\u5b9e\u73b0\u903b\u8f91\u3001\u4ee3\u7801\u7b49\u65b9\u9762\u7684\u4ecb\u7ecd\uff0c\u4ee5\u6b64\u8ba9\u5927\u5bb6\u80fd\u66f4\u52a0\u6e05\u6670\u7684\u7406\u89e3\u5404\u9879\u529f\u80fd\uff0c\u4ece\u800c\u5728\u4f7f\u7528\u7684\u65f6\u5019\u80fd\u66f4\u52a0\u7684\u5f97\u5fc3\u5e94\u624b\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_3","title":"\u4e8c\u3001\u56fe\u50cf\u8bc6\u522b","text":"\u56fe\u50cf\u8bc6\u522b\u5728 UI \u81ea\u52a8\u5316\u4e2d\u662f\u4e0d\u53ef\u7f3a\u5c11\u7684\uff0c\u5e02\u9762\u4e0a\u751a\u81f3\u6709\u5b8c\u5168\u57fa\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\uff0c\u6bd4\u5982 Airtest\u3001Sikuli \u7b49\uff0c\u5728\u6e38\u620f\u7b49\u7279\u5b9a\u9886\u57df\u4e5f\u6709\u4e0d\u9519\u7684\u6548\u679c\uff0c\u8fd9\u4e9b\u5de5\u5177\u5b9e\u9645\u4e0a\u4e5f\u662f\u7528\u7684 OpenCV \u8fdb\u884c\u4e86\u5c01\u88c5\uff0cYouQu \u6846\u67b6\u57fa\u4e8e OpenCV \u5f00\u53d1\u4e86\u81ea\u5df1\u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\uff0c\u5b83\u53ef\u4ee5\u65b9\u4fbf\u7684\u7528\u4e8e\u754c\u9762\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u65ad\u8a00\uff1b YouQu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u51e0\u4e4e\u6ee1\u8db3\u4e86\u4f60\u7684\u6240\u6709\u8981\u6c42\uff0c\u6211\u4eec\u5728\u957f\u65f6\u95f4\u7684\u601d\u8003\u548c\u6478\u7d22\u4e2d\uff0c\u9488\u5bf9\u5e38\u89c4\u573a\u666f\u53ca\u4e00\u4e9b\u7279\u6b8a\u573a\u666f\u63a2\u7d22\u9664\u4e86\u4e00\u4e9b\u5b9e\u7528\u4e14\u6709\u6548\u7684\u65b9\u6848\uff0c\u4e14\u542c\u6211\u6162\u6162\u9053\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1","title":"1\u3001\u5e38\u89c4\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5e38\u89c4\u8bc6\u522b\u5f88\u597d\u7406\u89e3\uff0c\u4e00\u53e5\u8bdd\u8bb2\u5c31\u662f\uff0c\u8981\u83b7\u53d6\u5230\u76ee\u6807\u5143\u7d20\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u3002 \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u5728\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u9700\u8981\u83b7\u53d6\u7684\u5750\u6807\u662f\u76f8\u5bf9\u4e8e\u6574\u4e2a\u5c4f\u5e55\u7684\u5750\u6807\uff0c\u6211\u4eec\u53ef\u4ee5\u622a\u53d6\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u56fe\u7247\uff08screen\uff09\uff1b \u5728\u5143\u7d20\u8bc6\u522b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u622a\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5c0f\u56fe\u8fdb\u884c\u8bc6\u522b\uff0c\u6bd4\u5982\u622a\u53d6\u64ad\u653e\u6309\u94ae\uff1a \u90a3\u4e48\u5b9e\u9645\u4e0a\uff0c\u5143\u7d20\u5b9a\u4f4d\u7684\u95ee\u9898\u5c31\u8f6c\u6362\u4e3a\uff0c\u5c06\u622a\u56fe\u7684\u5c0f\u56fe\uff08play_btn\uff09\u62ff\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u5927\u56fe\uff08screen\uff09\u4e2d\u53bb\u505a\u5339\u914d\uff0c\u5982\u679c\u5339\u914d\u6210\u529f\uff0c\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff08 x, y \uff09\u5373\u53ef\u3002 \u4e3a\u4e86\u65b9\u4fbf\u63cf\u8ff0\uff0c\u4ee5\u4e0b\u6211\u5c06\u6574\u4e2a\u5c4f\u5e55\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5927\u56fe\uff0c\u67d0\u4e2a\u5143\u7d20\u56fe\u7247\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5c0f\u56fe\u3002 \u57fa\u4e8e OpenCV \u7684\u6a21\u677f\u5339\u914d cv.matchTemplate() \u529f\u80fd\uff0c\u6211\u4eec\u5b9e\u73b0\u4e86\u56fe\u50cf\u5b9a\u4f4d\u7684\u529f\u80fd\uff0c\u6846\u67b6\u63d0\u4f9b\u4e86\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u5e95\u5c42\u63a5\u53e3\uff08\u4e00\u822c\u4e0d\u5bf9\u4e0a\u5c42\u63d0\u4f9b\u8c03\u7528\uff09\uff1a def _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\n# \u8be6\u7ec6\u4ee3\u7801\u592a\u957f\u4e0d\u8d34\u4e86\uff0c\u611f\u5174\u8da3\u8bf7\u67e5\u770b\u6e90\u7801\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001image_path image_path \u662f\u5c0f\u56fe\u7684\u7edd\u5bf9\u8def\u5f84; \u901a\u5e38\u5728 AT \u5de5\u7a0b\u91cc\u9762\uff0c\u6211\u4eec\u7ea6\u5b9a\u5c06\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u5b9e\u9645\u7684\u5143\u7d20\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1aplay_btn.png \uff1b \u7528\u4e8e\u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 case/assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1amusic_001.png \uff1b \u8fd9\u6837\u662f\u4e3a\u4e86\u65b9\u4fbf\u7ba1\u7406\u548c\u7ef4\u62a4\u3002 2\u3001rate \u56fe\u50cf\u8bc6\u522b\u7684\u7684\u5339\u914d\u5ea6\u6216\u8005\u8bf4\u76f8\u4f3c\u5ea6\uff0c\u6846\u67b6\u9ed8\u8ba4\u7684\u914d\u7f6e\u4e3a 0.9\uff0c\u4e5f\u5c31\u662f\u8bf4\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u5b58\u5728\u4e00\u4e2a\u76f8\u4f3c\u5ea6 90% \u7684\u56fe\u6807\u5373\u8fd4\u56de\u5176\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff1b \u5982\u679c\u4f60\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u8c03\u6574\u8bc6\u522b\u5ea6\uff0c\u4f60\u53ef\u4ee5\u5728\u8c03\u7528\u51fd\u6570\u7684\u65f6\u5019\uff0c\u4f20\u5165\u4e0d\u540c\u7684\u8bc6\u522b\u5ea6\u7684\u503c\u3002 3\u3001multiple \u9ed8\u8ba4\u60c5\u51b5\u4e0b multiple=False\uff0c\u8868\u793a\u53ea\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u7b2c\u4e00\u4e2a\uff0c\u5982\u679c multiple=True \u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\uff0c\u56e0\u4e3a\u5927\u56fe\u4e2d\u53ef\u80fd\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u5c0f\u56fe\uff0c\u5728\u67d0\u4e9b\u573a\u666f\u4e0b\u4f60\u53ef\u80fd\u9700\u8981\u5168\u90e8\u83b7\u53d6\u5230\u6240\u6709\u5339\u914d\u5230\u7684\u5750\u6807\u3002 4\u3001picture_abspath \u9ed8\u8ba4\u60c5\u51b5\u4e0b picture_abspath=None \u8868\u793a\u5927\u56fe\u4e3a\u622a\u53d6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u5982\u679c\u4f60\u4e0d\u5e0c\u671b\u5927\u56fe\u662f\u5c4f\u5e55\u7684\u622a\u56fe\uff0c\u800c\u662f\u4f60\u81ea\u5b9a\u4e49\u4f20\u5165\u7684\u67d0\u4e2a\u56fe\u7247\uff0c\u4f60\u53ea\u9700\u8981\u5c06\u4f60\u7684\u56fe\u7247\u8def\u5f84\u4f20\u9012\u7ed9\u8fd9\u4e2a\u53c2\u6570\u5c31\u884c\uff0c\u6bd4\u5982\uff1a picture_abspath=\"~/Desktop/big.png\" \uff1b 5\u3001screen_bbox \u5927\u56fe\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u622a\u53d6\u6574\u4e2a\u5c4f\u5e55\uff0cscreen_bbox = [x, y, w, h] \u53ef\u4ee5\u6307\u5b9a\u622a\u53d6\u5c4f\u5e55\u4e2d\u7684\u56fa\u5b9a\u533a\u57df\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\uff0c\u53ef\u4ee5\u6392\u9664\u90e8\u5206\u533a\u57df\u5bf9\u8bc6\u522b\u7ed3\u679c\u7684\u5f71\u54cd\u3002 \u3010\u9690\u5f0f\u7b49\u5f85\u3011 \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\uff0c\u6709\u65f6\u5019\u9875\u9762\u8df3\u8f6c\u6709\u5ef6\u65f6\uff0c\u6709\u53ef\u80fd\u5b58\u5728\u8bc6\u522b\u7684\u90a3\u4e00\u523b\u9875\u9762\u4e5f\u6ca1\u6709\u8df3\u8f6c\u51fa\u6765\uff0c\u6216\u8005\u6216\u8005\u8bc6\u522b\u7684\u90a3\u4e00\u523b\uff1b \u56e0\u6b64\u6211\u4eec\u9700\u8981\u4e00\u79cd\u7b49\u5f85\u673a\u5236\uff0c\u5373\u5728\u4e00\u5b9a\u7684\u65f6\u95f4\u5185\uff0c\u5982\u679c\u8bc6\u522b\u4e0d\u5230\uff0c\u91cd\u590d\u53bb\u8bc6\u522b\uff1a def find_image(\ncls,\n*widget, rate: [float, int] = None,\nmultiple: bool = False,\nmatch_number: int = None,\npicture_abspath: str = None,\nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u5728\u5c4f\u5e55\u4e2d\u533a\u5bfb\u627e\u5c0f\u56fe\uff0c\u8fd4\u56de\u5750\u6807\uff0c\n \u5982\u679c\u627e\u4e0d\u5230\uff0c\u6839\u636e\u914d\u7f6e\u91cd\u8bd5\u6b21\u6570\uff0c\u6bcf\u6b21\u95f4\u96941\u79d2\n :param widget: \u6a21\u677f\u56fe\u7247\u8def\u5f84\n :param rate: \u76f8\u4f3c\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param match_number: \u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\n :return: \u5750\u6807\u5143\u7ec4\n \"\"\"\nif rate is None:\nrate = float(GlobalConfig.IMAGE_RATE)\ntry:\nfor element in widget:\nfor _ in range((match_number or int(GlobalConfig.IMAGE_MATCH_NUMBER)) + 1):\nlocate = cls._match_image_by_opencv(\nelement,\nrate,\nmultiple=multiple,\npicture_abspath=picture_abspath,\nscreen_bbox=screen_bbox\n)\nif not locate:\nsleep(int(GlobalConfig.IMAGE_MATCH_WAIT_TIME))\nelse:\nreturn locate\nraise TemplateElementNotFound(*widget)\nexcept Exception as e:\nraise e\n \u53c2\u6570 match_number \u7528\u4e8e\u63a7\u5236\u91cd\u590d\u8bc6\u522b\u7684\u6b21\u6570\uff0c\u9ed8\u8ba4\u4e0d\u4f20\u53c2\uff0c\u53d6\u5168\u5c40\u914d\u7f6e setting/globalconfig.ini \u91cc\u9762\u7684 IMAGE_MATCH_NUMBER \u914d\u7f6e\u9879\u7684\u503c\uff0c\u9ed8\u8ba4IMAGE_MATCH_NUMBER = 1\uff0c\u5373\u91cd\u8bd5 1 \u6b21\uff1b find_image \u662f\u6846\u67b6\u63d0\u4f9b\u7684\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u51fd\u6570\u63a5\u53e3\uff0c\u8fd9\u4e2a\u51fd\u6570\u63d0\u4f9b\u4e86\u9690\u5f0f\u7b49\u5f85\u7684\u529f\u80fd\uff0c\u4e14\u5305\u542b\u4e0a\u9762\u4ecb\u7ecd\u7684 _match_image_by_opencv \u51fd\u6570\u7684\u6240\u6709\u529f\u80fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2","title":"2\u3001\u6c14\u6ce1\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u6c14\u6ce1\u8bc6\u522b\u6307\u7684\u662f\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\u8981\u5b9a\u4f4d\u7684\u5143\u7d20\u662f\u4e00\u4e9b\u4f1a\u6d88\u5931\u7684\u5c0f\u5f39\u7a97\uff0c\u8fd9\u7c7b\u573a\u666f\u5728\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\u5c31\u53ef\u80fd\u5b58\u5728\u4e0d\u7a33\u5b9a\u6027\uff0c\u6709\u53ef\u80fd\u56fe\u50cf\u8bc6\u522b\u7684\u65f6\u5019\u6c14\u6ce1\u5df2\u7ecf\u6d88\u5931\u4e86\uff0c\u4e5f\u6709\u53ef\u80fd\u6c14\u6ce1\u51fa\u73b0\u7684\u65f6\u95f4\u592a\u77ed\u4e86\uff0c\u4e0d\u5bb9\u6613\u6355\u6349\u5230\uff0c\u5c31\u50cf\u6c14\u6ce1\u4e00\u6837\uff0c\u51fa\u73b0\u4e00\u4e0b\u5c31\u6d88\u5931\uff0c\u56e0\u6b64\u6211\u4eec\u5f62\u8c61\u7684\u79f0\u4e4b\u4e3a \u201c\u6c14\u6ce1\u8bc6\u522b\u201d\uff1b \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u4e3a\u4e86\u80fd\u7a33\u5b9a\u7684\u8bc6\u522b\u6c14\u6ce1\u7c7b\u573a\u666f\uff0c\u6211\u4eec\u91c7\u7528\u7684\u65b9\u6848\u662f\uff1a \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\uff08\u5305\u542b\u6c14\u6ce1\u4ece\u51fa\u73b0\u5230\u6d88\u5931\uff09\uff0c\u4e0d\u505c\u7684\u622a\u53d6\u8fd9\u6bb5\u65f6\u95f4\u5185\u7684\u5927\u56fe\uff0c\u4ee5\u6b64\u786e\u4fdd\u5728\u622a\u53d6\u7684\u4e00\u5806\u56fe\u7247\u4e2d\uff0c\u80af\u5b9a\u6709\u81f3\u5c11\u4e00\u5f20\u56fe\u7247\u80fd\u6355\u6349\u5230\u6c14\u6ce1\uff0c\u6700\u540e\u518d\u5bf9\u8fd9\u4e00\u5806\u56fe\u7247\u9010\u4e2a\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def get_during(\ncls,\nimage_path: str,\nscreen_time: [float, int],\nrate: float = None,\npause: [int, float] = None,\nmax_range: int = 10000\n):\n\"\"\"\n \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u622a\u56fe\u591a\u5f20\u56fe\u7247\u8fdb\u884c\u8bc6\u522b\uff0c\u5176\u4e2d\u6709\u4e00\u5f20\u56fe\u7247\u8bc6\u522b\u6210\u529f\u5373\u8fd4\u56de\u7ed3\u679c;\n \u9002\u7528\u4e8e\u6c14\u6ce1\u7c7b\u7684\u65ad\u8a00\uff0c\u6bd4\u5982\u6c14\u6ce1\u57281\u79d2\u5185\u6d88\u5931\uff0c\u5982\u679c\u7528\u5e38\u89c4\u7684\u56fe\u50cf\u8bc6\u522b\u5219\u6709\u53ef\u80fd\u65e0\u6cd5\u8bc6\u522b\u5230\uff1b\n :param image_path: \u8981\u8bc6\u522b\u7684\u6a21\u677f\u56fe\u7247\uff1b\n :param screen_time: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff1b\n :param rate: \u8bc6\u522b\u7387\uff1b\n :param pause: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u4e0d\u95f4\u9694\uff1b\n :param max_range: \u622a\u56fe\u7684\u6700\u5927\u6b21\u6570\uff0c\u8fd9\u662f\u4e00\u4e2a\u9884\u8bbe\u503c\uff0c\u4e00\u822c\u60c5\u51b5\u4e0b\u4e0d\u6d89\u53ca\u4fee\u6539\uff1b\n \"\"\"\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001screen_time \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5728\u6b64\u65f6\u95f4\u5185\u4f1a\u4e0d\u65ad\u7684\u8fdb\u884c\u622a\u56fe\u64cd\u4f5c\uff0c\u5c31\u50cf\u5f55\u5236\u89c6\u9891\u4e00\u6837\uff1b 2\u3001pause \u6bcf\u6b21\u622a\u53d6\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u4e00\u523b\u4e0d\u505c\u7684\u622a\u56fe\uff0c\u5982\u679c\u4f60\u60f3\u6bcf\u6b21\u622a\u56fe\u5b58\u5728\u4e00\u4e9b\u95f4\u9694\u65f6\u95f4\u4f20\u5165\u5bf9\u5e94\u7684\u65f6\u95f4\u95f4\u9694\u5373\u53ef\uff0c\u5355\u4f4d\u662f\u79d2\uff0c\u6bd4\u5982\uff1apause = 0.03\uff0c\u8868\u793a 30 ms\uff0c\u76f8\u5f53\u4e8e\u5e27\u7387\u4e3a 30 \u5e27\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-opencv","title":"3\u3001\u4e0d\u4f9d\u8d56 OpenCV \u7684\u56fe\u50cf\u8bc6\u522b\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31","title":"3.1\u3001\u81ea\u7814\u56fe\u50cf\u8bc6\u522b\u6280\u672f","text":"\u3010\u539f\u7406\u3011 \u4e3a\u4e86\u5b9e\u73b0\u8bc6\u522b\u56fe\u50cf\u7684\u76ee\u7684\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u5c06\u56fe\u7247\u7684\u6bcf\u4e2a\u50cf\u7d20\u7684RGB\u503c\uff0c\u4e0e\u6574\u4e2a\u5c4f\u5e55\u4e2d\u7684RGB\u8fdb\u884c\u5bf9\u6bd4\uff0c\u5982\u679c\u5c0f\u56fe\u4e0a\u7684RGB\u503c\u4e0e\u5bf9\u5e94\u5927\u56fe\u4f4d\u7f6e\u7684RGB\u90fd\u76f8\u7b49\uff0c\u5219\u5339\u914d\u6210\u529f\uff0c\u5373\u53ef\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u70b9\u3002 1\u3001\u8bfb\u53d6\u5c0f\u56fe\u548c\u5927\u56fe\u7684RGB\u503c \uff081\uff09\u5c0f\u56fe\u7684RGB\u503c small_data = small_pic.load() # load()\u4f1a\u5c06\u56fe\u7247\u7684RGB\u503c\u83b7\u53d6\u5230\uff0c\u6570\u636e\u683c\u5f0f\u4e3a\u4e00\u4e2a\u4e8c\u7ef4\u5217\u8868\uff0c\u8d4b\u503c\u7ed9\u4e00\u4e2a\u53d8\u91cfsmall_data\u3002\n \uff082\uff09\u5927\u56fe\u7684RGB\u503c big_data = big_pic.load()\n 2\u3001\u5c06\u5c0f\u56fe\u4e0e\u5927\u56fe\u7684RGB\u503c\u8fdb\u884c\u5339\u914d \uff081\uff09\u5339\u914d\u4ece\u5927\u56fe\u7684\u5750\u6807\uff080\uff0c0\uff09\u5f00\u59cb\u5339\u914d\uff0c\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff082\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\uff080\uff0c0\uff09\u5bf9\u5e94\u7684\u6240\u6709\u5c0f\u56fe\u7684RGB\u503c\u4e0d\u76f8\u7b49\uff0c\u5219\u79fb\u52a8\u5230\u4e0b\u4e00\u4e2a\u5750\u6807\u70b9\uff081\uff0c0\uff09\uff0c\u540c\u6837\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff083\uff09\u6309\u7167\u8fd9\u6837\u7684\u89c4\u5f8b\u5c06\u8fd9\u4e00\u884c\u6bcf\u79fb\u52a8\u4e00\u4e2a\u5750\u6807\u70b9\uff0c\u90fd\u5c06\u5c0f\u56fe\u6240\u6709\u7684RGB\u4e0e\u5bf9\u5e94\u5927\u56fe\u7684\u503c\u8fdb\u884c\u5339\u914d\uff1b \uff084\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\u5176\u4e2d\u4e00\u4e2a\u5750\u6807\u70b9\u4e0a\u5339\u914d\u5230\u4e86\u5c0f\u56fe\u7684\u6240\u6709RGB\u503c\uff0c\u5219\u6b64\u65f6\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\u70b9\uff1b \uff085\uff09\u5982\u679c\u5339\u914d\u4e86\u5927\u56fe\u6240\u6709\u7684\u5750\u6807\u70b9\uff0c\u90fd\u6ca1\u6709\u5339\u914d\u5230\uff0c\u5219\u8bf4\u660e\u5927\u56fe\u4e2d\u4e0d\u5b58\u5728\u5c0f\u56fe\uff0c\u5339\u914d\u5931\u8d25\uff1b \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 class ImageRgb:\n@staticmethod\ndef _check_match(_x, _y, small, bdata, sdata, rate):\n\"\"\"\n Matching degree of small graph and large graph matching\n \"\"\"\n@staticmethod\ndef _pre_random_point(small):\n\"\"\"\n Pre matching, take 10-20 points at random each time,\n and take coordinates randomly in the small graph\n \"\"\"\n@staticmethod\ndef _pre_random_match(_x, _y, point_list, bdata, sdata, rate):\n\"\"\"\n In the small graph, several points are randomly\n selected for matching, and the matching degree is\n also set for the random points\n \"\"\"\n@classmethod\ndef match_image_by_rgb(cls, image_name=None, image_path=None, rate=0.9):\n\"\"\"\n By comparing the RGB values of the small image with the large\n image on the screen, the coordinates of the small image on\n the screen are returned.\n \"\"\"\n \u901a\u8fc7 match_image_by_rgb() \u8fd9\u4e2a\u51fd\u6570\uff0c\u4f20\u5165\u76ee\u6807\u5c0f\u56fe\u7684\u6587\u4ef6\u540d\u79f0\uff0c\u5373\u53ef\u8fd4\u56de\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u3002 \u6709\u540c\u5b66\u8981\u95ee\u4e86\uff0c\u6709 OpenCV \u5e72\u561b\u4e0d\u7528\uff0c\u6709\u5fc5\u8981\u81ea\u5df1\u5b9e\u73b0\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u529f\u80fd\u5417\uff0c\u4f60\u4eec\u662f\u4e0d\u662f\u95f2\u7684\u554a\uff1f \u8fd9\u4e48\u95ee\u7684\u8bdd\uff0c\u5c0f\u4e86\uff0c\u683c\u5c40\u5c0f\u4e86\uff1b\u6211\u4eec\u81ea\u5df1\u5b9e\u73b0\u4e3b\u8981\u6709\u51e0\u65b9\u9762\u539f\u56e0\uff1a \u51cf\u5c11\u73af\u5883\u4f9d\u8d56\uff0c\u5373\u4e0d\u7528\u5b89\u88c5 OpenCV\uff0c\u6211\u4eec\u4e5f\u80fd\u5b9e\u73b0\u5176\u529f\u80fd\uff0c\u73af\u5883\u4f9d\u8d56\u8fd9\u5757\u540e\u9762\u4f1a\u5355\u72ec\u8be6\u7ec6\u8bb2\uff0c\u51cf\u5c11\u73af\u5883\u4f9d\u8d56\u5bf9\u4e8e\u4efb\u4f55\u8f6f\u4ef6\u5de5\u7a0b\u90fd\u975e\u5e38\u91cd\u8981\uff1b OpenCV \u5728\u5176\u4ed6\u56fd\u4ea7 CPU \u67b6\u6784\u4e0a\u5b89\u88c5\u5e76\u4e0d\u80fd\u4fdd\u8bc1100%\u6210\u529f\uff0c\u751a\u81f3\u6709\u6ca1\u6709\u53ef\u80fd\u5728\u4e00\u4e9b\u67b6\u6784\u4e0a\u538b\u6839\u513f\u5c31\u4e0d\u80fd\u5b89\u88c5\u4f7f\u7528 OpenCV \uff1f \u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 OpenCV \uff1f\u5c31\u50cf\u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 Windows \u5462\uff1f\u8fd9\u4e9b\u95ee\u9898\u503c\u5f97\u601d\u8003\u3002 \u5f53\u7136\uff0c\u6211\u4eec\u627f\u8ba4\u8fd9\u5957\u65b9\u6848\uff0c\u867d\u7136\u8bc6\u522b\u51c6\u786e\u7387\u6ca1\u95ee\u9898\uff0c\u4f46\u5728\u8bc6\u522b\u6548\u7387\u4e0a\u8fd8\u6ca1\u6709\u8fbe\u5230 OpenCV \u6a21\u677f\u5339\u914d\u7684\u6548\u679c\uff0c\u6211\u4eec\u7684\u65b9\u6848\u6bcf\u6b21\u8bc6\u522b\u5728 1.5s \u5de6\u53f3\uff0c\u800c OpenCV \u5728 1s \u5de6\u53f3\uff1b \u6574\u4f53\u8bc6\u522b\u6548\u679c\u6765\u8bb2\uff0c\u6211\u8ba4\u4e3a\u8fd8\u662f\u53ef\u4ee5\u63a5\u53d7\u7684\uff0c\u4e5f\u5e0c\u671b\u6709\u5fd7\u4e4b\u58eb\u80fd\u4e00\u8d77\u4f18\u5316\u6b64\u65b9\u6848\uff0c\u4e00\u8d77\u6280\u672f\u62a5\u56fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32-rpc","title":"3.2\u3001\u57fa\u4e8e RPC \u670d\u52a1\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b","text":"\u5728\u8fdc\u7a0b\u670d\u52a1\u5668\u4e0a\u90e8\u7f72 OpenCV \u7684\u73af\u5883\uff0c\u5e76\u5c06\u5176\u90e8\u7f72\u4e3a RPC \u670d\u52a1\uff0c\u6d4b\u8bd5\u673a\u4e0a\u4e0d\u7528\u5b89\u88c5 OpenCV \u4f9d\u8d56\uff0c\u800c\u662f\u901a\u8fc7\u8bf7\u6c42 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u3010\u539f\u7406\u3011 \u6d4b\u8bd5\u673a\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u56fe\u7247\u4ee5\u53ca\u6a21\u677f\u56fe\u7247\uff0c\u53d1\u9001\u7ed9 RPC \u670d\u52a1\u7aef\uff0c\u670d\u52a1\u7aef\u62ff\u5230\u4e24\u5f20\u56fe\u7247\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u6700\u540e\u5c06\u8bc6\u522b\u7ed3\u679c\u8fd4\u56de\u7ed9\u6d4b\u8bd5\u673a\uff1b \u8981\u7279\u6b8a\u8bf4\u660e\u7684\u662f\uff1a RPC \u662f\u4e00\u79cd\u534f\u8bae\uff0c\u8bb8\u591a\u8bed\u8a00\u90fd\u662f\u652f\u6301\u7684\uff0c\u6bd4\u5982\u8bf4\u670d\u52a1\u7aef\u4e5f\u53ef\u4ee5\u7528 C++ \u6765\u5b9e\u73b0\uff0c\u5ba2\u6237\u7aef\u4f7f\u7528 Python \u4e5f\u662f\u53ef\u4ee5\u8c03\u7528\u7684\u3002 \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 \u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nimport cv2 as cv\nimport numpy as np\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\nif __name__ == \"__main__\":\nserver = ThreadXMLRPCServer((\"x.x.x.x\", 8889), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(match_image_by_opencv, \"match_image_by_opencv\")\nserver.serve_forever()\n \u8fd9\u6837\uff0c\u6211\u4eec\u57fa\u4e8e Python \u6807\u51c6\u5e93 xmlrpc \u642d\u5efa\u4e86\u4e00\u4e2a RPC \u670d\u52a1\u5668\uff0c\u6ce8\u518c\u4e86 image_put \u548c match_image_by_opencv \u4e24\u4e2a\u529f\u80fd\u63a5\u53e3\uff0c\u5728\u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u901a\u8fc7 IP \u548c\u7aef\u53e3\u8fdb\u884c RPC \u8bf7\u6c42\uff1b \u5ba2\u6237\u7aef\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from xmlrpc.client import Binary\nfrom xmlrpc.client import ServerProxy\nserver = ServerProxy(GlobalConfig.OPENCV_SERVER_HOST, allow_none=True)\nscreen_rb = open(screen, \"rb\")\ntemplate_rb = open(template_path, \"rb\")\ntry:\nscreen_path = server.image_put(Binary(screen_rb.read()))\nscreen_rb.close()\ntpl_path = server.image_put(Binary(template_rb.read()))\ntemplate_rb.close()\nreturn server.match_image_by_opencv(\ntpl_path, screen_path, rate, multiple\n)\nexcept OSError as exc:\nraise EnvironmentError(\nf\"RPC\u670d\u52a1\u5668\u94fe\u63a5\u5931\u8d25. {GlobalConfig.OPENCV_SERVER_HOST}\"\n) from exc\n \u901a\u8fc7\u8fd4\u56de server.match_image_by_opencv \u5c31\u83b7\u53d6\u4e86\u5728\u670d\u52a1\u7aef\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4","title":"4\u3001\u53f3\u952e\u83dc\u5355\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41","title":"4.1\u3001\u53f3\u952e\u83dc\u5355\u5b9a\u4f4d\u7684\u65b9\u6848\u53ca\u95ee\u9898","text":"\u53f3\u952e\u83dc\u5355\u7684\u5143\u7d20\u5b9a\u4f4d\u662f\u4e00\u4e2a\u96be\u70b9\uff0c\u8fc7\u53bb\u6211\u4eec\u8c03\u7814\u548c\u4f7f\u7528\u8fc7\u7684\u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u65b9\u6cd5\u6709 4 \u79cd\uff1a \u7b2c\u4e00\u79cd\uff1a\u6b65\u957f\u64cd\u4f5c\u6cd5 \u5728\u53f3\u952e\u83dc\u5355\u547c\u51fa\u6765\u4e4b\u540e\uff0c\u901a\u8fc7\u952e\u76d8\u7684 up\u3001down \u6309\u952e\uff0c\u8fdb\u884c\u9009\u62e9\u83dc\u5355\u9009\u62e9\uff0c\u9009\u4e2d\u76ee\u6807\u4e4b\u540e enter \u5373\u53ef\uff1b\u6bd4\u5982\uff1a\u5728\u684c\u9762\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\uff0c\u6309 1 \u6b21 down \uff0c\u4f1a\u51fa\u73b0\u4e0b\u56fe\uff1a \u7ee7\u7eed\u518d\u6309 2 \u6b21 down\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u518d\u6309 enter\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u5982\u6b64\uff0c\u201c\u6392\u5e8f\u65b9\u5f0f\u201d\u7684\u6b65\u957f\u4e3a 3\uff1b\u901a\u8fc7\u4f7f\u7528\u952e\u76d8\u4e0a\u4e0b\u952e\uff0c\u5c31\u5b9e\u73b0\u4e86\u5bf9\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\uff1b \u4f46\u662f\uff0c\u8fd9\u79cd\u65b9\u5f0f\u6709\u4e2a\u5f88\u70e6\u4eba\u7684\u95ee\u9898\uff0c\u5c31\u662f\u53f3\u952e\u83dc\u5355\u7684\u9009\u9879\u4f4d\u7f6e\u4e0d\u53ef\u80fd\u4e00\u76f4\u4e0d\u53d8\uff0c\u5728\u9700\u6c42\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\uff0c\u83dc\u5355\u9009\u9879\u7684\u53d8\u5316\u662f\u5f88\u5927\u7684\uff0c\u751a\u81f3\u6709\u4e9b\u5e94\u7528\u652f\u6301\u81ea\u5b9a\u4e49\u83dc\u5355\uff0c\u6bd4\u5982\u6587\u7ba1\u53f3\u952e\u83dc\u5355\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff1b \u4e5f\u5c31\u662f\u8bf4\u4f60\u5f97\u7ecf\u5e38\u53bb\u7ef4\u62a4\u83dc\u5355\u9009\u9879\u7684\u6b65\u957f\uff0c\u4e00\u4e2a\u9009\u9879\u73b0\u5728\u7684\u6b65\u957f\u662f 3\uff0c\u4e0b\u4e2a\u8fed\u4ee3\u53ef\u80fd\u5c31\u662f 4 \u6216\u8005 5\u3002 \u7b2c\u4e8c\u79cd\uff1a\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u6cd5 \u628a\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5355\u72ec\u622a\u56fe\u4fdd\u5b58\uff0c\u56fe\u7247\u4e2d\u4ec5\u5305\u542b\u4e00\u4e2a\u83dc\u5355\u9009\u9879\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u8fd9\u6837\uff0c\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5c31\u53ef\u4ee5\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u65b9\u5f0f\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u8fd9\u79cd\u65b9\u5f0f\u4e0d\u7528\u62c5\u5fc3\u83dc\u5355\u9009\u9879\u7684\u987a\u5e8f\u6216\u4f4d\u7f6e\uff0c\u4f46\u662f\u9700\u8981\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff0c\u4e14\u5bb9\u6613\u53d7\u5230\u5b57\u4f53 UI \u53d8\u66f4\u7c7b\u9700\u6c42\u7684\u5f71\u54cd\uff0c\u6bd4\u5982\uff1a\u5b57\u4f53\u5927\u5c0f\u3001\u5b57\u4f53\u95f4\u8ddd\u7b49\u7b49\u9700\u6c42\u53d8\u66f4\u90fd\u4f1a\u5f71\u54cd\uff0c\u6bcf\u6b21\u53d8\u66f4\u4e4b\u540e\u5c31\u9700\u8981\u8fdb\u884c\u5927\u91cf\u56fe\u7247\u8d44\u6e90\u7684\u91cd\u65b0\u622a\u56fe\u66ff\u6362\uff0c\u662f\u4e2a\u6bd4\u8f83\u9ebb\u70e6\u7684\u4e8b\u60c5\uff1b \u7b2c\u4e09\u79cd\uff1a\u76f8\u5bf9\u4f4d\u79fb\u6cd5 \u9f20\u6807\u70b9\u51fb\u53f3\u952e\u7684\u65f6\u5019\uff0c\u9f20\u6807\u7684\u5f53\u524d\u5750\u6807\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u7684\uff0c\u83dc\u5355\u9009\u9879\u7684\u5bbd\uff08 w \uff09\u4e00\u822c\u662f\u56fa\u5b9a\u7684\uff0c\u53d8\u5316\u7684\u662f\u83dc\u5355\u7684\u957f\u5ea6\uff08 h \uff09\uff0c\u53ef\u4ee5\u901a\u8fc7\u67d0\u4e2a\u9009\u9879\u76f8\u5bf9\u4e8e\u9f20\u6807\u7684\u8ddd\u79bb\u5728\u786e\u5b9a\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u901a\u8fc7\u7ef4\u62a4\u83dc\u5355\u9009\u9879\uff08\u76f8\u5bf9\u4f4d\u7f6e\uff09\u76f8\u5bf9\u4e8e\u9f20\u6807\u4f4d\u7f6e\u7684\u8ddd\u79bb\uff0c\u5373\u53ef\u8f7b\u677e\u8ba1\u7b97\u51fa\u83dc\u5355\u9009\u9879\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\u3002 \u4ece\u7406\u8bba\u4e0a\u6b64\u65b9\u6848\u662f\u53ef\u884c\u7684\uff0c\u4f46\u662f\u8fd9\u91cc\u4ecd\u7136\u5b58\u5728\u4e24\u4e2a\u4e25\u91cd\u7684\u95ee\u9898\uff1a \u83dc\u5355\u987a\u5e8f\u6539\u53d8\uff0c\u5bfc\u81f4\u76f8\u5bf9\u8ddd\u79bb\u6539\u53d8\uff0c\u800c\u4e14\u8ddd\u79bb\u662f\u901a\u8fc7\u50cf\u7d20\uff08px\uff09\u6765\u8868\u793a\u7684\uff0c\u4e0d\u60f3\u6b65\u957f\u90a3\u4e48\u53ea\u7ba1\uff0c\u6bcf\u6b21\u9700\u8981\u53bb\u91cf\u4e00\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u70b9\u9ebb\u70e6\uff1b \u9f20\u6807\u5728\u684c\u9762\u4e0d\u540c\u4f4d\u7f6e\u70b9\u51fb\u53f3\u952e\uff0c\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u4f4d\u7f6e\u662f\u4e0d\u540c\u7684\uff0c\u4e0a\u56fe\u7684\u83dc\u5355\u662f\u5728\u9f20\u6807\u7684\u5de6\u4e0b\u65b9\uff0c\u5982\u679c\u4f60\u79fb\u52a8\u9f20\u6807\u5230\u5c4f\u5e55\u56db\u8fb9\uff0c\u4f60\u4f1a\u53d1\u73b0\uff0c\u53f3\u952e\u83dc\u5355\u53ef\u80fd\u51fa\u73b0\u5728\u9f20\u6807\u7684\u56db\u4e2a\u65b9\u5411\uff0c\u4e5f\u5c31\u662f\u8bf4\u4f60\u9700\u8981\u6839\u636e\u9f20\u6807\u7684\u4e0d\u540c\u4f4d\u7f6e\u6765\u5224\u65ad\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u65b9\u5411\uff0c\u800c\u4e0d\u540c\u7684\u65b9\u5411\u4e0a\u8ba1\u7b97\u65b9\u6cd5\u662f\u4e0d\u540c\u7684\uff0c\u6bd4\u5982\uff1a\u53f3\u952e\u83dc\u5355\u5728\u9f20\u6807\u7684\u5de6\u4e0a\uff0c\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\u8ba1\u7b97\u65b9\u6cd5\u4e3a\uff08x - w / 2\uff0c y - h\uff09\uff0c\u8fd9\u6837\u7ef4\u62a4\u8d77\u6765\u53ef\u4ee5\u8bf4\u975e\u5e38\u590d\u6742\uff1b \u57fa\u4e8e\u4ee5\u4e0a\u4e24\u4e2a\u539f\u56e0\uff0c\u6211\u4eec\u5e76\u4e0d\u63a8\u8350\u8fd9\u79cd\u64cd\u4f5c\u65b9\u6848\u3002 \u7b2c\u56db\u79cd\uff1a\u5c5e\u6027\u5b9a\u4f4d \u6709\u540c\u5b66\u8bf4\u5e72\u561b\u4e0d\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u5462\uff0c\u5176\u5b9e\uff0c\u6211\u4eec\u6700\u5f00\u59cb\u60f3\u5230\u7684\u65b9\u6848\u5c31\u662f\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\uff0c\u4f46\u662f\u5728\u5c5e\u6027\u7684 DOM \u6811\u91cc\u600e\u4e48\u4e5f\u627e\u4e0d\u5230\uff0c\u65e0\u6cd5\u5b9a\u4f4d\u5230\uff0c\u6211\u4eec\u4e5f\u8054\u5408\u7814\u53d1\u540c\u5b66\u4e00\u8d77\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u4f46\u6700\u7ec8\u8fd8\u662f\u6ca1\u80fd\u89e3\u51b3\uff0c\u975e\u5e38\u9057\u61be\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42","title":"4.2\u3001\u6700\u65b0\u7684\u53f3\u952e\u83dc\u5355\u7ec8\u6781\u89e3\u51b3\u65b9\u6848","text":"\u7531\u4e8e\u53f3\u952e\u83dc\u5355\u9009\u9879\u51e0\u4e4e\u90fd\u662f\u6587\u672c\uff0c\u90a3\u4e48\u901a\u8fc7 OCR \u8bc6\u522b\uff0c\u51e0\u4e4e\u662f\u6700\u4f18\u7684\u65b9\u6848\uff1a \u4e0d\u7528\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff1b \u4e0d\u4f1a\u53d7\u5230\u83dc\u5355\u9009\u9879\u987a\u5e8f\u6539\u53d8\u7684\u5f71\u54cd\uff1b \u4e0d\u4f1a\u53d7\u5230\u5b57\u4f53 UI \u53d8\u5316\u7684\u5f71\u54cd\uff1b \u5173\u4e8e OCR \u8bc6\u522b\u6211\u4eec\u5728\u540e\u9762\u4f1a\u8be6\u7ec6\u8bb2\u5230\uff0c\u672c\u7ae0\u8282\u4e3b\u8981\u8bb2\u57fa\u4e8e OCR \u8bc6\u522b\uff0c\u6211\u4eec\u5728\u53f3\u952e\u83dc\u5355\u8bc6\u522b\u4e0a\u7684\u7a81\u7834\u548c\u521b\u65b0\uff1b \u4f7f\u7528 OCR \u8bc6\u522b\u53f3\u952e\u83dc\u5355\u867d\u7136\u5df2\u7ecf\u5f88\u5b8c\u7f8e\u4e86\uff0c\u4f46\u662f\u5728\u4e00\u4e9b\u60c5\u51b5\u4e0b\u4ecd\u7136\u5b58\u5728\u4e00\u70b9\u95ee\u9898\uff0c\u5c31\u662f\u5c4f\u5e55\u4e2d\u51fa\u73b0\u591a\u4e2a\u548c\u83dc\u5355\u9009\u9879\u6587\u5b57\u76f8\u540c\u7684\u6587\u5b57\u65f6\uff0c\u6bd4\u5982\u4e0b\u9762\u8fd9\u79cd\u60c5\u51b5\uff1a \u5c4f\u5e55\u6070\u597d\u51fa\u73b0\u4e86\u4e24\u4e2a\u201c\u590d\u5236\u201d\uff0c\u6b64\u65f6\u8981\u5b9a\u4f4d\u5230\u83dc\u5355\u4e2d\u7684 \u201c\u590d\u5236\u201d\uff0c\u5c31\u9700\u8981\u8fdb\u4e00\u6b65\u505a\u6570\u636e\u5904\u7406\uff0c\u6bd4\u5982\uff1aOCR \u8fd4\u56de 2 \u4e2a\u201c\u590d\u5236\u201d\u7684\u5750\u6807\uff0c\u7528\u4f8b\u91cc\u9762\u6765\u5224\u65ad\u7528\u54ea\u4e2a\uff0c\u4ece\u4e1a\u52a1\u4e0a\u5c06\u5904\u7406\u8d77\u6765\u6bd4\u8f83\u9ebb\u70e6\uff0c\u56e0\u4e3a\u4f60\u5f97\u660e\u786e\u77e5\u9053\u83dc\u5355\u5728\u5de6\u8fb9\u8fd8\u662f\u53f3\u8fb9\uff0c\u7136\u540e\u8fd9\u672c\u8eab\u5c31\u662f\u4e0d\u786e\u5b9a\u7684\uff1b \u600e\u4e48\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u5462\uff0c\u8fd9\u5c31\u8981\u8bf4\u9053\u672c\u7ae0\u7684\u4e3b\u9898\uff1a\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b\u3002 \u3010\u539f\u7406\u3011 \u5728\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u524d\u622a\u4e00\u5f20\u56fe\uff0c\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\u518d\u622a\u53d6\u4e00\u5f20\u56fe\uff0c\u4e24\u5f20\u56fe\u552f\u4e00\u53d8\u5316\u7684\u5c31\u662f\u53f3\u952e\u83dc\u5355\uff0c\u5c06\u5176\u4ed6\u76f8\u540c\u7684\u5730\u65b9\u90fd\u5c4f\u853d\u6389\uff0c\u53ea\u7559\u4e0b\u83dc\u5355\u754c\u9762\uff0c\u5982\u6b64\u5373\u53ef\u6d88\u9664\u5e72\u6270\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u5c06\u4e24\u79cd\u56fe\u505a\u524d\u540e\u5bf9\u6bd4\u63d0\u53d6\u53ef\u4ee5\u5f97\u5230\u8fd9\u6837\u7684\u56fe\uff1a \u4f60\u770b\uff0c\u901a\u8fc7\u524d\u540e\u56fe\u7247\u7684\u5bf9\u6bd4\uff0c\u5c06\u76f8\u540c\u7684\u90e8\u5206\u7ed9\u6d88\u9664\u6389\uff0c\u518d\u8fdb\u884c OCR \u8bc6\u522b\uff0c\u8fd9\u6837\u5c31\u4e0d\u4f1a\u6709\u5e72\u6270\u4e86\uff1b \u4ee3\u7801\u5b9e\u73b0\u8bf7\u67e5\u770b src/filter_image.py \uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def filter_image(action):\n\"\"\"\n \u5bf9\u6bd4\u52a8\u4f5c\u524d\u540e\u4e24\u5f20\u56fe\u7247\uff0c\u63d0\u53d6\u4e0d\u540c\u7684\u90e8\u5206\u751f\u6210\u4e00\u5f20\u65b0\u7684\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u65b0\u56fe\u7247\u7684\u8def\u5f84\n :param action: \u52a8\u4f5c\u51fd\u6570\u7684\u51fd\u6570\u5bf9\u8c61\n :return: \u65b0\u56fe\u7247\u7684\u8def\u5f84\n \"\"\"\n action \u662f\u9f20\u6807\u4e8b\u4ef6\uff0c\u56e0\u4e3a\u6b64\u7c7b\u573a\u666f\u4e0d\u4ec5\u4ec5\u5728\u53f3\u952e\u5b58\u5728\uff0c\u5355\u51fb\u3001\u53cc\u51fb\u7b49\u7b49\uff0c\u53ea\u8981\u64cd\u4f5c\u524d\u540e\u540e\u53d8\u5316\u7684\u90fd\u53ef\u4ee5\uff1a from src.mouse_key import MouseKey\naction = (\nMouseKey.click,\nMouseKey.right_click,\nMouseKey.double_click,\nMouseKey.move_to,\n)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5","title":"5\u3001\u52a8\u6001\u56fe\u50cf\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5728\u684c\u9762\u58c1\u7eb8\u5207\u6362\uff0c\u6216\u770b\u56fe\u3001\u76f8\u518c\u5207\u6362\u56fe\u7247\u7c7b\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u7531\u4e8e\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u662f\u4e0d\u56fa\u5b9a\u7684\uff08\u4e0d\u540c\u7248\u672c\u7684\u7cfb\u7edf\u58c1\u7eb8\u4e0d\u540c\u3001\u58c1\u7eb8\u987a\u5e8f\u4e0d\u540c\uff0c\u770b\u56fe\u76f8\u518c\u5728\u56fe\u7247\u8d44\u6e90\u4e0d\u4e00\u5b9a\u56fa\u5b9a\uff09\uff0c\u90a3\u4e48\u5728\u6d4b\u8bd5\u5207\u6362\u58c1\u7eb8\u6216\u8005\u5207\u6362\u56fe\u7247\u7684\u573a\u666f\u65f6\u5c31\u4f1a\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u4f60\u4e0d\u77e5\u9053\u9884\u671f\u662f\u5565\uff0c\u7528\u4f8b\u64cd\u4f5c\u52a8\u6001\u7684\uff0c\u4e5f\u662f\u6781\u4e0d\u7a33\u5b9a\u3002 \u3010\u539f\u7406\u3011 \u5728\u5207\u6362\u56fe\u7247\u4e4b\u524d\u622a\u56fe\u4fdd\u5b58\u5e76\u8fd4\u56de\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u6b21\u8bc6\u522b\u8fd9\u5f20\u56fe\u7247\uff0c\u5982\u679c\u4e0d\u5b58\u5728\uff0c\u8bf4\u660e\u56fe\u7247\u5df2\u7ecf\u5207\u6362\u4e86\uff1b \u793a\u610f\u56fe\uff1a \u8fd9\u6837\uff0c\u6211\u4eec\u622a\u53d6\u4e86\u5f53\u524d\u56fe\u7247\u4e2d\u6bd4\u8f83\u6709\u4ee3\u8868\u6027\u7684\u4f4d\u7f6e\uff08\u4e00\u53ea\u9e1f\uff09\uff0c\u5728\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u7528\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1a \u6211\u4eec\u518d\u62ff\u7740\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd9\u6837\u5728\u5f53\u524d\u56fe\u7247\u4e2d\uff0c\u5c31\u4e0d\u80fd\u627e\u5230\u8fd9\u53ea\u9e1f\u4e86\uff0c\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u662f False\uff0c\u90a3\u4e48\u4e5f\u5c31\u53ef\u4ee5\u5224\u65ad\u56fe\u7247\u5207\u6362\u662f\u6210\u529f\u7684\u3002 \u4ee3\u7801\u793a\u610f\uff1a def save_temporary_picture(_x: int, _y: int, width: int, height: int):\n\"\"\"\n \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u56fe\u7247\u8def\u5f84\n :param x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n :param y: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n :param width: \u5bbd\u5ea6\n :param height: \u9ad8\u5ea6\n :return: \u56fe\u7247\u8def\u5f84\n \"\"\"\n \u6b64\u51fd\u6570\u7528\u4e8e\u5728\u64cd\u4f5c\u4e4b\u524d\u622a\u56fe\u4e00\u5f20\u4e34\u65f6\u56fe\u7247\uff0c\u8fd4\u56de\u56fe\u7247\u8def\u5f84\uff0c\u6700\u540e\u5728\u65ad\u8a00\u7684\u65f6\u5019\u518d\u5c06\u56fe\u7247\u8def\u5f84\u4f5c\u4e3a\u53c2\u6570\u4f20\u5165\u65ad\u8a00\u8bed\u53e5\u5373\u53ef\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ui","title":"\u4e09\u3001\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_1","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u662f\u6211\u4eec\u81ea\u7814\u7684\u4e00\u79cd\u4f7f\u7528\u7b80\u5355\uff0c\u4e14\u6548\u7387\u6781\u9ad8\u3001\u7a33\u5b9a\u6027\u597d\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u57fa\u4e8e\u5143\u7d20\u6309\u94ae\u5728\u5e94\u7528\u4e2d\u7684\u76f8\u5bf9\u4f4d\u7f6e\uff0c\u52a8\u6001\u83b7\u53d6\u5143\u7d20\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff0c\u9002\u7528\u4e8e\u5404\u79cd\u5c4f\u5e55\u5206\u8fa8\u7387\uff08\u5305\u62ec\u9ad8\u5206\u5c4f\u3001\u5bbd\u5c4f\u3001\u5e26\u9c7c\u5c4f\uff09\uff0c\u5f53\u5143\u7d20\u6309\u94ae\u4f4d\u7f6e\u76f8\u5bf9\u4e8e\u5e94\u7528\u754c\u9762\u4f4d\u7f6e\u53d1\u751f\u4fee\u6539\u4e4b\u540e\uff0c\u53ea\u9700\u8981\u6839\u636e UI \u8bbe\u8ba1\u56fe\u4e0a\u7684\u6e90\u6570\u636e\u4fee\u6539\u5bf9\u5e94\u5750\u6807\u6570\u636e\u5c31\u597d\uff0c\u7ef4\u62a4\u975e\u5e38\u7684\u65b9\u4fbf\u3002 \u6b64\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u9002\u7528\u4e8e\u4e00\u4e9b\u5143\u7d20\u4f4d\u7f6e\u76f8\u5bf9\u4e0e\u5e94\u7528\u754c\u9762\u6bd4\u8f83\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u97f3\u4e50\uff0899% \u7684\u5143\u7d20\u5b9a\u4f4d\u91c7\u7528\u8fd9\u79cd\uff0c\u6548\u679c\u975e\u5e38\u597d\uff09\uff0c\u4e0d\u9002\u7528\u4e8e\u754c\u9762\u4e0d\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u622a\u56fe\u5f55\u5c4f\uff0c\u5f88\u660e\u663e\u4e0d\u9002\u7528\u4e8e\u8fd9\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u3002\u8fd9\u79cd\u5168\u65b0\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u6709\u5b83\u7684\u9002\u7528\u6761\u4ef6\uff0c\u5982\u679c\u4f60\u53d1\u73b0\u4f7f\u7528\u5e38\u89c4\u7684\uff08\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u5b9a\u4f4d\uff09\u4e0d\u597d\u505a\u65f6\uff0c\u4e0d\u59a8\u8003\u8651\u4f7f\u7528\u8fd9\u79cd\uff0c\u5176\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff0c\u5e76\u4e14\u8fc5\u901f\u7231\u4e0a\u4ed6\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_1","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5728 UI \u8bbe\u8ba1\u56fe\u4e2d\u6211\u4eec\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u8fb9\u6846\u7684\u8ddd\u79bb\u7684\uff0c\u7136\u540e\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u6280\u672f\u624b\u6bb5\u83b7\u53d6\u5230\u5e94\u7528\u754c\u9762\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u53ca\u5e94\u7528\u7a97\u53e3\u7684\u5927\u5c0f\uff0c\u793a\u610f\u56fe\u5982\u4e0b\uff1a \uff08x1, y1\uff09\u4e3a\u5e94\u7528\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\uff1b\uff08x2, y2\uff09\u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u5de6\u4e0a\u89d2\uff08x1, y1\uff09\u7684\u5750\u6807\uff0c\u90a3\u4e48\u5b9e\u9645\u4e0a\u3010\u64ad\u653e\u6240\u6709\u3011\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\u4e3a\uff1a\uff08 x1 + x2, y1 + y2 \uff09\uff1b \u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5927\u5c0f\uff08w2, h2\uff09\uff0c\u53ef\u4ee5\u4ece UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\uff1b \u5728 UI \u8bbe\u8ba1\u7a3f\u4e0a\u70b9\u51fb\u3010\u64ad\u653e\u6240\u6709\u3011\u56fe\u6807\uff0c\u7136\u540e\u79fb\u52a8\u9f20\u6807\u5c31\u5c31\u53ef\u4ee5\u770b\u5230\u4e0a\u56fe\u7684\u53c2\u8003\u7ebf\u53ca\u6570\u636e\uff1b \u6240\u4ee5\uff0c\u6211\u4eec\u53ef\u4ee5\u8f7b\u677e\u7684\u83b7\u53d6\u5230\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u4e2d\u5fc3\u5750\u6807\u4e3a\uff1a\uff08 x1 + x2 + (w2 / 2), y1 + y2 + ( h2 / 2) \uff09 \u8be6\u7ec6\u6e90\u4ee3\u7801\u8bf7\u67e5\u770b AT \u57fa\u7840\u6846\u67b6: src/button_center.py \u83b7\u53d6\u5e94\u7528\u7a97\u53e3\u7684\u4fe1\u606f \u4f7f\u7528 xdotool \u548c xwininfo \u83b7\u53d6\u5230\u5e94\u7528\u7a97\u53e3\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u5de6\u4e0a\u89d2\uff09\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a app_id = CmdCtl.run_cmd(f\"xdotool search --classname --onlyvisible {self.app_name}\"\n).split(\"\\n\")\napp_id_list = [int(_id) for _id in app_id if _id]\nreturn CmdCtl.run_cmd(f\"xwininfo -id {app_id_list[self.number]}\")\n \u4f7f\u7528\u6b63\u5219\u83b7\u53d6\u7a97\u53e3\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u83b7\u53d6\u914d\u7f6e \u8bfb ini \u914d\u7f6e\u6587\u4ef6\uff0c\u83b7\u53d6\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e0e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a conf = ConfigParser()\nconf.read(self.config_path)\ndirection = conf.get(btn_name, \"direction\")\nposition = [int(i.strip()) for i in conf.get(btn_name, \"location\").split(\",\")]\n \u8ba1\u7b97\u5143\u7d20\u6309\u94ae\u5750\u6807 \u6839\u636e\u5e94\u7528\u7a97\u53e3\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u5927\u5c0f\u3001\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u5927\u5c0f\uff0c\u4f7f\u7528\u4e00\u5b9a\u7684\u7b97\u6cd5\u5373\u53ef\u8ba1\u7b97\u51fa\u5143\u7d20\u6309\u94ae\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u4e2d\u5fc3\u5750\u6807\uff09\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3","title":"3\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u3010\u914d\u7f6e\u65b9\u6cd5\u3011 \u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u7684\u6570\u636e\u6e90\u662f\u5e94\u7528\u5e93\u4e2d\u7684 ui.ini \u914d\u7f6e\u6587\u4ef6\uff1a ;section\n[\u65b0\u5efa\u6b4c\u5355+] ;key = value\ndirection = left_top\nlocation = 180, 268, 21, 21\n section \u662f\u4f60\u6839\u636e\u5bf9\u5e94\u7684\u5143\u7d20\u6309\u94ae\u547d\u540d\uff0c\u4f60\u53ef\u4ee5\u4efb\u610f\u547d\u540d\uff0c\u4f46\u6700\u597d\u6709\u5177\u4f53\u542b\u4e49\uff0c\u4e14\u80fd\u660e\u786e\u8868\u793a\u8fd9\u4e2a\u5143\u7d20\u6309\u94ae\u7684\u540d\u79f0\uff1b\u7528\u4e2d\u62ec\u53f7\u62ec\u8d77\u6765\u5c31\u884c\uff0c\u6bd4\u5982\uff1a[\u65b0\u5efa\u6b4c\u5355+] \uff1b direction \u662f\u914d\u7f6e\u8be5\u5143\u7d20\u7684\u53c2\u8003\u7cfb\uff0c\u5206\u522b\u4e3a\uff1a left_top \u5de6\u4e0a\uff1b left_bottom \u5de6\u4e0b\uff1b right_top \u53f3\u4e0a\uff1b right_bottom \u53f3\u4e0b\uff1b \u53c2\u8003\u7cfb\u7684\u9009\u53d6\u6807\u51c6\uff1a\u62c9\u52a8\u6539\u53d8\u7a97\u53e3\u5927\u5c0f\u65f6\uff0c\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u53c2\u8003\u7cfb\u4f4d\u7f6e\u662f\u4e0d\u53d8\u7684\uff1b location \u662f\u8be5\u5143\u7d20\u6309\u94ae\u7684\u76f8\u5bf9\u4e0e\u53c2\u8003\u7cfb\u7684 x, y \u7684\u8ddd\u79bb\uff0c\u53ca\u5927\u5c0f(w, h)\uff0c\u8fd9\u56db\u4e2a\u6570\u636e\u53ef\u4ee5\u901a\u8fc7 UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\u6570\u636e\uff0c\u5728\u7f16\u8f91\u6a21\u5f0f\u4e0b\uff0c\u70b9\u51fb UI \u56fe\u4e0a\u7684\u6309\u94ae\uff0c\u53f3\u4fa7\u5c31\u4f1a\u51fa\u73b0\u8be5\u5143\u7d20\u6309\u94ae\u7684 x, y, w, h \u6570\u636e\u3002 \u5982\u679c UI \u56fe\u4e0a\u6ca1\u6709\u63d0\u4f9b\u4f60\u60f3\u8981\u7684\u5143\u7d20\u6570\u636e\uff0c\u4f60\u53ef\u4ee5\u76f4\u63a5\u5728\u7cfb\u7edf\u4e2d\u4f7f\u7528\u622a\u56fe\u5f55\u5c4f\u8fdb\u884c\u5c3a\u91cf\uff0c\u8fd9\u662f\u4e00\u79cd\u4e0d\u63a8\u8350\u4f46\u80fd\u7528\u7684\u65b9\u6cd5\u3002 \u3010\u8c03\u7528\u65b9\u6cd5\u3011 \u5728\u5e94\u7528\u5e93\u65b9\u6cd5\u5c42\u8fd9\u6837\u5199\uff1a def click_add_music_list_btn_in_music_by_ui(self):\n\"\"\"\u70b9\u51fb\u65b0\u5efa\u6b4c\u5355\u6309\u94ae\"\"\"\nself.click(*self.ui.btn_center(\"\u65b0\u5efa\u6b4c\u5355+\"))\n self.ui.btn_center() \u662f\u56fa\u5b9a\u5199\u6cd5\uff0c\u53c2\u6570\u5c31\u662f\u914d\u7f6e\u91cc\u9762\u7684 section \u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ocr","title":"\u56db\u3001OCR \u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_2","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 OCR \u65b9\u6848\u5927\u591a\u91c7\u7528\u8c37\u6b4c OCR\uff08Tesseract\uff09\u65b9\u6848\uff0c\u4f46\u662f\u5b83\u5bf9\u4e8e\u4e2d\u6587\u7684\u8bc6\u522b\u975e\u5e38\u5dee\uff0c\u7ecf\u8fc7\u5927\u91cf\u7684\u8c03\u7814\uff0c\u6211\u4eec\u4f7f\u7528 PaddleOCR\uff0c\u5b83\u662f\u4e00\u4e2a\u5f00\u6e90\u7684\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u8bc6\u522b\u5de5\u5177\uff0c\u4e5f\u662f PaddlePaddle \u6700\u6709\u540d\u7684\u4e00\u4e2a\u5f00\u6e90\u9879\u76ee\uff0c\u611f\u5174\u8da3\u7684\u53ef\u4ee5\u70b9\u8fd9\u91cc\u4e86\u89e3\uff0c\u591a\u7684\u4e0d\u8bf4\u4e86\uff0c\u4f60\u53ea\u9700\u8981\u77e5\u9053\u5b83\u5c31\u662f\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_2","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5b89\u88c5\u4ed6\u662f\u4e2a\u5f88\u9ebb\u70e6\u7684\u4e8b\u60c5\uff0c\u867d\u7136\u64cd\u4f5c\u5f88\u7b80\u5355\uff0c\u4f46\u5176\u5b9e\u5b89\u88c5\u5305\u6709\u70b9\u5927\uff0c\u56e0\u6b64\u6211\u4eec\u4e0d\u5e0c\u671b\u76f4\u63a5\u5728 env.sh \u4e2d\u52a0\u5165\u5b83\uff0c\u8fd9\u4f1a\u8ba9\u6574\u4e2a\u81ea\u52a8\u5316\u73af\u5883\u53d8\u5f97\u975e\u5e38\u81c3\u80bf\uff1b \u56e0\u6b64\uff0c\u6211\u4eec\u60f3\u5230\u5c06\u5b83\u505a\u6210\u4e00\u4e2a RPC \u670d\u52a1\u5728\u5176\u4ed6\u673a\u5668\u4e0a\u90e8\u7f72\uff0c\u6d4b\u8bd5\u673a\u901a\u8fc7\u8fdc\u7a0b\u8c03\u7528 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u4f7f\u7528\u5b83\uff1b RPC \u7684\u8c03\u7528\u903b\u8f91\uff1a \u8fd9\u6837\u6211\u4eec\u53ea\u9700\u8981\u5728\u670d\u52a1\u7aef\u90e8\u7f72\u597d OCR \u8bc6\u522b\u7684\u670d\u52a1\uff0c\u7136\u540e\u901a\u8fc7 RPC \u670d\u52a1\u5c06\u529f\u80fd\u63d0\u4f9b\u51fa\u6765\uff0c\u6846\u67b6\u91cc\u9762\u53ea\u9700\u8981\u8c03\u7528\u5bf9\u5e94\u7684 RPC \u63a5\u53e3\u5c31\u884c\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_1","title":"3\u3001\u4f7f\u7528\u8bf4\u660e","text":"\u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nfrom paddleocr import PaddleOCR\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef paddle_ocr(pic_path, lang):\n\"\"\"\n Paddleocr\u76ee\u524d\u652f\u6301\u7684\u591a\u8bed\u8a00\u8bed\u79cd\u53ef\u4ee5\u901a\u8fc7\u4fee\u6539lang\u53c2\u6570\u8fdb\u884c\u5207\u6362\n \u4f8b\u5982`ch`, `en`, `fr`, `german`, `korean`, `japan`\n :param file_name:\n :param lang:\n :return:\n \"\"\"\nif __name__ == \"__main__\":\nIP = popen(\"hostname -I\").read().split(\" \")[0]\nPORT = 8890\nSCREEN_CACHE = \"/tmp/screen.png\"\nserver = ThreadXMLRPCServer((IP, PORT), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(paddle_ocr, \"paddle_ocr\")\nprint(\"\u76d1\u542c\u5ba2\u6237\u7aef\u8bf7\u6c42\u3002\u3002\")\nserver.serve_forever()\n \u6846\u67b6\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from src import OCR\nOCR.ocr(*target_strings, picture_abspath=None, similarity=0.6, return_default=False, return_first=False, lang=\"ch\"):\n# \u901a\u8fc7 OCR \u8fdb\u884c\u8bc6\u522b\u3002\n# target_strings:\n# \u76ee\u6807\u5b57\u7b26,\u8bc6\u522b\u4e00\u4e2a\u5b57\u7b26\u4e32\u6216\u591a\u4e2a\u5b57\u7b26\u4e32,\u5e76\u8fd4\u56de\u5176\u5728\u56fe\u7247\u4e2d\u7684\u5750\u6807;\n# \u5982\u679c\u4e0d\u4f20\u53c2\uff0c\u8fd4\u56de\u56fe\u7247\u4e2d\u8bc6\u522b\u5230\u7684\u6240\u6709\u5b57\u7b26\u4e32\u3002\n# picture_abspath: \u8981\u8bc6\u522b\u7684\u56fe\u7247\u8def\u5f84\uff0c\u5982\u679c\u4e0d\u4f20\u9ed8\u8ba4\u622a\u53d6\u5168\u5c4f\u8bc6\u522b\u3002\n# similarity: \u5339\u914d\u5ea6\u3002\n# return_default: \u8fd4\u56de\u8bc6\u522b\u7684\u539f\u751f\u6570\u636e\u3002\n# return_first: \u53ea\u8fd4\u56de\u7b2c\u4e00\u4e2a,\u9ed8\u8ba4\u4e3a False,\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u6240\u6709\u6570\u636e\u3002\n# lang: `ch`, `en`, `fr`, `german`, `korean`, `japan`\n \u6b64\u65b9\u6848\u5728\u6846\u67b6\u5185\u6ca1\u6709\u5f15\u5165\u4efb\u4f55\u4e09\u65b9\u4f9d\u8d56\u5b8c\u5168\u91c7\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\uff0c\u800c\u4e14\u4f7f\u7528\u65b9\u6cd5\u975e\u5e38\u7b80\u5355\uff0c\u53ea\u9700\u8981\u901a\u8fc7 OCR.ocr() \u5373\u53ef\uff1b \u5bf9\u4e8e\u4e00\u4e9b\u6587\u6848\u7684\u573a\u666f\u975e\u5e38\u9002\u7528\uff0c\u6b64\u65b9\u6cd5\u76f4\u63a5\u8fd4\u56de\u5750\u6807\uff0c\u53ef\u4ee5\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u3002 \u4e5f\u53ef\u4ee5\u7528\u4e8e\u6587\u5b57\u65ad\u8a00\uff0c\u4ee3\u7801\u793a\u610f\uff1a def assert_ocr_exist(\n*args, picture_abspath=None, similarity=0.6, return_first=False, lang=\"ch\"\n):\n\"\"\"\u65ad\u8a00\u6587\u6848\u5b58\u5728\"\"\"\npic = None\nif picture_abspath is not None:\npic = picture_abspath + \".png\"\nres = OCR.ocr(\n*args,\npicture_abspath=pic,\nsimilarity=similarity,\nreturn_first=return_first,\nlang=lang,\n)\nif res is False:\nraise AssertionError(\n(f\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{args}\", f\"{pic if pic else GlobalConfig.SCREEN_CACHE}\")\n)\nif isinstance(res, tuple):\npass\nelif isinstance(res, dict) and False in res.values():\nres = filter(lambda x: x[1] is False, res.items())\nraise AssertionError(\n(\nf\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{dict(res)}\",\nf\"{pic if pic else GlobalConfig.SCREEN_CACHE}\",\n)\n)\n \u5728\u7528\u4f8b\u4e2d\u4f7f\u7528\u65ad\u8a00\uff0c\u793a\u4f8b\uff1a def test_font_manager_021(self):\n\"\"\"\u53f3\u4fa7\u2665-\u6536\u85cf/\u53d6\u6d88\u6536\u85cf\u5b57\u4f53\"\"\"\n# \u5b57\u4f53\u7ba1\u7406\u5668\u754c\u9762\u53f3\u4fa7\u8be6\u60c5\u5217\u8868\uff0c\u9009\u62e9\u672a\u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e / \u6536\u85cf\u5b57\u4f53\n# \u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e\u83dc\u5355\u663e\u793a\u201c\u53d6\u6d88\u6536\u85cf\u201d\uff1b\n...\nself.assert_ocr_exist(\"\u53d6\u6d88\u6536\u85cf\")\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_1","title":"4\u3001\u670d\u52a1\u7aef\u90e8\u7f72","text":"\u6211\u4eec\u76ee\u524d\u662f\u5c06 OCR \u670d\u52a1\u90e8\u7f72\u5728\u666e\u901a\u7684\u529e\u516c\u673a\u4e0a\u7684\uff0c\u5982\u679c\u4f60\u89c9\u5f97\u73b0\u6709\u7684 OCR \u8bc6\u522b\u6027\u80fd\u4e0d\u591f\u597d\uff0c\u6070\u597d\u4f60\u6709\u66f4\u597d\u7684\u673a\u5668\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u5176\u79c1\u6709\u5316\u90e8\u7f72\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41_1","title":"4.1\u3001\u73af\u5883\u5b89\u88c5","text":"\u63a8\u8350\u4f7f\u7528 pipenv \u8fdb\u884c\u73af\u5883\u642d\u5efa\uff1b \u5b89\u88c5 pipenv \uff1a sudo pip3 install pipenv\n \u65b0\u5efa\u4e00\u4e2a\u76ee\u5f55\u4f5c\u4e3a\u73af\u5883\u5305 ocr_env\uff1a cd ~\nmkdir ocr_env\n \u521b\u5efa python 3.7 \u73af\u5883\uff1a cd ocr_env\npipenv --python 3.7\n \u5b89\u88c5 OCR \u4f9d\u8d56\u5305\uff1a pipenv install paddlepaddle -i https://mirror.baidu.com/pypi/simple\npipenv install \"paddleocr>=2.0.1\" -i https://mirror.baidu.com/pypi/simple\n \u4e0d\u51fa\u610f\u5916\uff0c\u8fd9\u6837\u5c31\u628a\u4f9d\u8d56\u5b89\u88c5\u597d\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42_1","title":"4.2\u3001\u542f\u52a8\u670d\u52a1","text":"\u5c06\u57fa\u7840\u6846\u67b6\u4e2d\u7684 scr/ocr/pdocr_rpc_server.py \u6587\u4ef6\u62f7\u8d1d\u5230 ocr_env \u76ee\u5f55\uff0c\u540e\u53f0\u6267\u884c\u5b83\u5c31\u597d\u4e86\uff1a cd ocr_env\nnohup pipenv run python pdocr_rpc_server.py &\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#43","title":"4.3\u3001\u914d\u7f6e\u5f00\u673a\u81ea\u542f\uff08\u901a\u7528\uff09","text":"\u4f60\u80af\u5b9a\u4e0d\u60f3\u6bcf\u6b21\u673a\u5668\u91cd\u542f\u4e4b\u540e\u90fd\u9700\u8981\u624b\u52a8\u542f\u52a8\u670d\u52a1\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u914d\u7f6e\u5f00\u673a\u81ea\u542f\u3002 \u5199\u5f00\u673a\u81ea\u542f\u670d\u52a1\u6587\u4ef6\uff1a sudo vim /lib/systemd/system/ocr.service\n autoocr \u540d\u79f0\u4f60\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff0c\u5199\u5165\u4ee5\u4e0b\u5185\u5bb9\uff1a [Unit]\nDescription=OCR Service\nAfter=multi-user.target\n\n[Service]\nUser=uos\nGroup=uos\nType=idle\nWorkingDirectory=/home/uos/ocr_env\nExecStart=pipenv run python pdocr_rpc_server.py\n\n[Install]\nWantedBy=multi-user.target\n \u6ce8\u610f\u66ff\u6362\u4f60\u7684${USER} \u4fee\u6539\u914d\u7f6e\u6587\u4ef6\u7684\u6743\u9650\uff1a sudo chmod 644 /lib/systemd/system/ocr.service\n \u81ea\u542f\u670d\u52a1\u751f\u6548\uff1a sudo systemctl daemon-reload\nsudo systemctl enable ocr.service\n \u67e5\u770b\u670d\u52a1\u72b6\u6001\uff1a sudo systemctl status ocr.service\n \u4f60\u53ef\u4ee5\u518d\u91cd\u542f\u4e0b\u7535\u8111\uff0c\u770b\u770b\u670d\u52a1\u662f\u4e0d\u662f\u6b63\u5e38\u542f\u52a8\u4e86\uff0c\u6ca1\u62a5\u9519\u5c31 OK \u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_4","title":"\u4e94\u3001\u5c5e\u6027\u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_3","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 UI \u81ea\u52a8\u5316\u5927\u591a\u90fd\u662f\u57fa\u4e8e\u6d4f\u89c8\u5668\u7684\uff0c\u6838\u5fc3\u662f\u5728\u7f51\u9875\u7684 DOM \u6811\u4e0a\u67e5\u627e\u5143\u7d20\uff0c\u5e76\u5bf9\u5176\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\uff1b Linux \u684c\u9762\u5e94\u7528\u5927\u591a\u662f\u91c7\u7528 Qt \u7f16\u5199\u7684\uff0c\u5728 Qt \u4e2d\u4e5f\u662f\u4ece\u6700\u9876\u5c42\u7684 MainWindow \u5f00\u59cb\u6784\u5efa\u5e94\u7528\uff0c\u6240\u4ee5\u903b\u8f91\u4e5f\u662f\u4e00\u6837\u7684\uff0cQt \u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u540c\u6837\u53ef\u4ee5\u901a\u8fc7 DOM \u6811\uff08\u5c5e\u6027\u6811\uff09\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff0c\u6211\u4eec\u79f0\u4e4b\u4e3a\u5c5e\u6027\u5b9a\u4f4d\u3002 \u501f\u52a9\u5f00\u6e90\u5de5\u5177 dogtail \u6211\u4eec\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u83b7\u53d6\uff0c\u4ece\u800c\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\u3002dogtail \u7684\u9879\u76ee\u4ecb\u7ecd\u53ef\u4ee5\u731b\u6233\u8fd9\u91cc\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_3","title":"2\u3001\u4f7f\u7528\u65b9\u6cd5","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#21sniff","title":"2.1\u3001sniff\uff08\u55c5\u63a2\u5668\uff09\u4f7f\u7528","text":"\u5728\u7ec8\u7aef\u8f93\u5165 sniff \u542f\u52a8 AT-SPI Browser mikigo@mikigo-PC:~$ sniff\n \u67e5\u770b\u5e94\u7528\u7684\u6807\u7b7e \u5728 sniff \u91cc\u9762\u53ef\u4ee5\u770b\u5230\u7cfb\u7edf\u4e2d\u5df2\u542f\u52a8\u7684\u5e94\u7528\uff0c\u70b9\u51fb\u5e94\u7528\u540d\u79f0\u524d\u9762\u7684\u4e09\u89d2\u5f62\u56fe\u6807\uff0c\u53ef\u4ee5\u5c55\u5f00\u5e94\u7528\u7684\u6807\u7b7e\uff0c\u6240\u6709\u6807\u7b7e\u4ee5 tree \u7684\u5f62\u5f0f\u5c55\u793a\uff0c\u5bf9\u5e94\u5e94\u7528\u91cc\u9762\u7684\u7236\u7a97\u53e3\u548c\u5b50\u7a97\u53e3\u3002 \u83b7\u53d6\u5143\u7d20\u63a7\u4ef6\u7684\u6807\u7b7e\u540d\u79f0 \u9996\u5148\uff0c\u4e3a\u4e86\u65b9\u4fbf\u67e5\u770b\u5143\u7d20\u63a7\u4ef6\u5bf9\u5e94\u7684\u4f4d\u7f6e\uff0c\u5efa\u8bae\u73b0\u5728\u4e0a\u65b9\u5de5\u5177\u680f\u70b9\u51fb Actions\uff0c\u7136\u540e\u52fe\u9009 Hightlight Items\uff0c\u8fd9\u6837\u5728 sniff \u4e2d\u9f20\u6807\u9009\u4e2d\u5143\u7d20\u6807\u7b7e\u7684\u65f6\u5019\uff0c\u5e94\u7528\u4e2d\u4f1a\u6709\u76f8\u5e94\u7684\u5149\u6807\u9501\u5b9a\u3002 \u5728 sniff \u91cc\u9762\u70b9\u51fb\u8fdb\u5165\u5e94\u7528\u7684\u6807\u7b7e tree \u4e2d\u540e\uff0c\u70b9\u51fb\u76f8\u5e94\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5728\u5de5\u5177\u4e0b\u65b9\uff0c\u4f1a\u5c55\u793a\u5143\u7d20\u63a7\u4ef6\u7684 Name\uff0c\u8fd9\u4e2a\u5c31\u662f\u6807\u7b7e\u540d\u79f0\u3002 \u5728 tree \u4e2d\u6709\u4e9b\u5730\u65b9\u662f\u7a7a\u767d\u7684\u6216\u8005\u662f Form\uff0c\u662f\u56e0\u4e3a\u5f00\u53d1\u4eba\u5458\u5728\u6dfb\u52a0\u6807\u7b7e\u7684\u65f6\u5019\u6ca1\u6709\u6dfb\u52a0\uff0c\u6216\u8005\u6709\u4e9b\u7236\u7a97\u53e3\u4e0d\u9700\u8981\u6dfb\u52a0\uff0c\u8fd9\u79cd\u5728\u5b9e\u9645\u4e1a\u52a1\u4e2d\u662f\u4e0d\u5f71\u54cd\u7684\uff0c\u6211\u4eec\u53ea\u8981\u4fdd\u8bc1\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\u4e2d\uff0c\u8981\u7528\u5230\u7684\u5143\u7d20\u90fd\u6dfb\u52a0\u4e86\u6807\u7b7e\u5373\u53ef\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#22","title":"2.2\u3001\u5143\u7d20\u64cd\u4f5c","text":"\u83b7\u53d6\u5e94\u7528\u5bf9\u8c61 dogtail \u83b7\u53d6\u5e94\u7528\u5bf9\u8c61\u7684\u65f6\u5019\uff0c\u4f7f\u7528\u7684\u662f tree \u5e93\u91cc\u9762\u7684 application() \u65b9\u6cd5\uff1a from dogtail.tree import root\napp_obj = root.application('deepin-music')\n app_obj\u5c31\u662f\u5e94\u7528\u7684\u5bf9\u8c61\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\uff0c\u662f\u5e94\u7528\u5bf9\u8c61\u4f7f\u7528child()\u65b9\u6cd5\uff1a element = app_obj.child('element_name')\n \u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u4f20\u5165\u5143\u7d20\u7684 Name\uff0c\u83b7\u53d6\u5230\u76f8\u5e94\u5143\u7d20\u7684\u5bf9\u8c61\u3002Name \u53ef\u4ee5\u901a\u8fc7 sniff \u67e5\u770b\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\u5217\u8868: element_list = element.children\n \u83b7\u53d6\u5230\u8fd9\u4e2a\u5143\u7d20\u4e0b\u9762\u6240\u6709\u7684\u5143\u7d20\u5217\u8868\u3002 \u8fd9\u4e2a\u65b9\u6cd5\u9002\u7528\u4e8e\u6709\u4e9b\u6807\u7b7e\u6ca1\u6709\u6dfb\u52a0\uff0c\u4f46\u662f\u4f4d\u7f6e\u662f\u56fa\u5b9a\u7684\uff0c\u6211\u4eec\u901a\u8fc7\u7d22\u5f15\u53ef\u4ee5\u53d6\u5f97\u5143\u7d20\u3002 element_list[0]\n \u5bf9\u5143\u7d20\u7684\u64cd\u4f5c \u5728\u83b7\u53d6\u5230\u5143\u7d20\u4e4b\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u76f8\u5e94\u7684\u64cd\u4f5c\u3002 \u5355\u51fb element.click(button=1)\n button 1 \u2014>\u5de6\u952e\uff0c2 \u2014>\u6eda\u8f6e\uff0c3 \u2014>\u53f3\u952e\uff0c\u9ed8\u8ba4\u4e3a 1 \u53cc\u51fb element.doubleClick(button=1)\n \u9f20\u6807\u60ac\u505c element.point()\n \u9f20\u6807\u79fb\u52a8\u5230\u5143\u7d20\u4e2d\u5fc3\u4f4d\u7f6e \u6587\u672c\u8f93\u5165 element.typeText(string)\n \u5411\u5143\u7d20\u5bf9\u8c61\u8f93\u5165\u5b57\u7b26\u4e32 \uff0c\u6bd4\u5982\u8f93\u5165\u6846 \u7ec4\u5408\u952e element.keyCombo(comboString)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#23","title":"2.3\u3001\u6846\u67b6\u5c01\u88c5","text":"\u4ee3\u7801\u793a\u4f8b\uff1a # \u8be6\u7ec6\u4ee3\u7801\u8bf7\u67e5\u770b src/dogtail_utils.py\nclass DogtailUtils:\ndef __init__(self, name=None, description=None):\nself.name = name\nself.description = description\nself.obj = root.application(self.name, self.description)\ndef app_element(self, *args, **kwargs):\n\"\"\"\n \u83b7\u53d6app\u5143\u7d20\u7684\u5bf9\u8c61\n :return: \u5143\u7d20\u7684\u5bf9\u8c61\n \"\"\"\nreturn self.obj.child(*args, **kwargs, retry=False)\ndef element_center(self, element) -> tuple:\n\"\"\"\n \u83b7\u53d6\u5143\u7d20\u7684\u4e2d\u5fc3\u4f4d\u7f6e\n :param element:\n :return: \u5143\u7d20\u4e2d\u5fc3\u5750\u6807\n \"\"\"\n_x, _y, _w, _h = self.app_element(element).extents\n_x = _x + _w / 2\n_y = _y + _h / 2\nreturn _x, _y\n \u6846\u67b6\u63d0\u4f9b\u7684\u63a5\u53e3\u975e\u5e38\u7b80\u6d01\uff0c\u5728\u8c03\u7528\u65f6\uff1a self.dog.element_center(\"\u64ad\u653e\")\n \u8fd9\u6837\u5c31\u80fd\u83b7\u53d6\u5230\u6b64\u5143\u7d20\u7684\u4e2d\u5fc3\u5750\u6807\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_5","title":"\u516d\u3001\u6807\u7b7e\u5316\u7ba1\u7406","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_4","title":"1\u3001\u6807\u7b7e\u8bf4\u660e","text":"\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u811a\u672c ID\uff1a\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c/\u51fd\u6570 ID\uff1b PMS\u7528\u4f8bID\uff1aPMS \u4e0a\u5bf9\u5e94\u7684\u7528\u4f8b ID\uff08\u7528\u4f8b\u5e93 ID\uff09\uff1b \u9ed8\u8ba4\u4f7f\u7528\u7528\u4f8b\u5e93 ID\uff0c\u5bf9\u4e8e\u6682\u65f6\u6ca1\u6709\u4f7f\u7528\u7528\u4f8b\u5e93\u7ba1\u7406\u7528\u4f8b\u7684\u9879\u76ee\uff0c\u53ef\u4ee5\u4f7f\u7528\u4ea7\u54c1\u5e93\u7528\u4f8b ID\uff1b \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1aFUNC\uff08\u529f\u80fd\uff09\u3001API\uff08\u63a5\u53e3\uff09\u3001BASELINE\uff08\u57fa\u7ebf\uff09\u3001PERF\uff08\u6027\u80fd\uff09\u3001STR\uff08\u538b\u529b\uff09\u3001SEC\uff08\u5b89\u5168\uff09\u3001CTS\uff08\u517c\u5bb9\u6027\uff09 \u4e0a\u7ebf\u5bf9\u8c61\uff1aCICD\uff0c\u8868\u793a\u4e0a\u7ebf\u5230 CICD \u6d41\u6c34\u7ebf\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u53ef\u4e00\u952e\u751f\u6210 case_list.csv \u6587\u4ef6\uff0c\u7528\u4e8e\u5bfc\u5165\u5230\u660e\u9053\u4e91 AT \u7528\u4f8b\u5217\u8868\u4e2d\u63a7\u5236 CICD \u8dd1\u6d4b\u8303\u56f4\uff1b \u6d4b\u8bd5\u7ea7\u522b\uff1aC1 / C2 / C3 / C4\uff0c\u5177\u4f53\u5b9a\u4e49\u53c2\u8003\u6d41\u6c34\u7ebf\u4f7f\u7528\u6307\u5bfc\uff1b \u8df3\u8fc7\u539f\u56e0\uff1askip-XXX\uff0c\u7528\u4e8e\u63a7\u5236\u7528\u4f8b\u662f\u5426\u6267\u884c\uff1b \u786e\u8ba4\u4fee\u590d\uff1afixed-XXX\uff0c\u7528\u4e8e\u6807\u8bb0\u7528\u4f8b\u7684\u4fee\u590d\u72b6\u6001\uff08\u540e\u9762\u8be6\u7ec6\u8bb2\u89e3\u7528\u6cd5\uff09\uff1b \u5e9f\u5f03\u7528\u4f8b\uff1aremoved-\u5df2\u5e9f\u5f03\uff0c\u7528\u4e8e\u6807\u8bb0\u5df2\u7ecf\u5e9f\u5f03\u7684\u7528\u4f8b\uff0c\u6b64\u7528\u4f8b\u6807\u7b7e\u4e0d\u4f1a\u88ab\u6dfb\u52a0\uff0c\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff1b \u793a\u4f8b\uff1a \u811a\u672cID PMS\u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u4e0a\u7ebf\u5bf9\u8c61 \u6d4b\u8bd5\u7ea7\u522b \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b ... 001 679537 L1 FUNC CICD C1 skip-XXX fixed-XXX removed-\u5df2\u5e9f\u5f03 ..."},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_4","title":"2\u3001\u64cd\u4f5c\u6b65\u9aa4","text":"2.1\u3001\u5728\u5b50\u9879\u76ee\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u4ee5\u7528\u4f8b\u7684 py \u6587\u4ef6\u9664\u53bb\u9996\u5b57\u7b26\u4e32 \"test_\" \u548c\u7528\u4f8b\u5e8f\u53f7\u540e\u7684\u5b57\u7b26\u4e32\u4f5c\u4e3a csv \u7684\u6587\u4ef6\u540d\u3002 \u4f8b\u5982: \u76f8\u518c\u7684\u7528\u4f8b\u6587\u4ef6\u4e3a test_album_xxx.py\uff0cxxx \u8868\u793a\u4efb\u610f\u4e09\u4f4d\u6570\u5b57\u4ee3\u8868\u7528\u4f8b\u5e8f\u53f7\uff0c\u6b64\u65f6 csv \u6587\u4ef6\u540d\u5c31\u5e94\u4e3a album.csv\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u6240\u6709 csv \u6587\u4ef6\u5efa\u8bae\u653e\u5728\u4e00\u4e2a tags \u76ee\u5f55\u4e0b\u3002 \u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 2.2\u3001\u7b2c\u4e00\u5217\u4e3a\u811a\u672c ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b\u7528\u4f8b\u6807\u7b7e\u53ef\u4ee5\u65e0\u5e8f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_2","title":"3\u3001\u589e\u52a0\u8bf4\u660e","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_1","title":"3.1\u3001\u8df3\u8fc7\u7528\u4f8b","text":"\u4f20\u7edf\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668(@pytest.mark.skip)\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a; \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#311","title":"3.1.1\u3001\u56fa\u5b9a\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u7b7e\u5f00\u5934\u4e3a \u201cskip-XXX\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\uff0c\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\u5219\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u7b7e\u4e3a SKIPED\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#312","title":"3.1.2\u3001\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skipif_platform-aarch64&mips64 \u67d0\u4e9b\u7528\u4f8b\u4f1a\u56e0\u4e3a\u4e0d\u540c\u7684\u73af\u5883\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\uff0c\u5e38\u89c1\u7684\u573a\u666f\u4e3a\u5728\u4e0d\u540c\u67b6\u6784\u4e0a\u5224\u65ad\u662f\u5426\u6267\u884c\uff0c\u8df3\u8fc7\u7684\u539f\u56e0\u6807\u7b7e\u4e3a \u201cskipif_platform-\u201d \u52a0\u67b6\u6784\u540d\uff0c\u591a\u4e2a\u67b6\u6784\u4e4b\u95f4\u4f7f\u7528 \u201c&\u201d \u62fc\u63a5\uff1b \u4ee5\u4e0a\u4f8b\u5b50\u4e3a\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u5224\u65ad\u5f53\u524d\u67b6\u6784\u662f\u5426\u4e3a arrch64 \u6216\u8005 mips64\uff0c\u82e5\u662f\uff0c\u5219\u8df3\u8fc7\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u82e5\u5426\u5219\u6267\u884c\u7528\u4f8b\uff1b \u76ee\u524d\u6846\u67b6\u9ed8\u8ba4\u4ec5\u652f\u6301\u67b6\u6784\u7684\u6761\u4ef6\u5224\u65ad\uff0c\u4f46\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u903b\u8f91\u652f\u6301\u81ea\u5b9a\u4e49\u6dfb\u52a0\u3002 \u5728\u9879\u76ee\u76ee\u5f55\u8def\u5f84\u4e0b\u5b58\u5728\u6587\u4ef6 setting/skipif.py\uff0c\u6240\u6709\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u7684\u51fd\u6570\u5199\u5728\u6b64\u6587\u4ef6\u4e2d\u3002 \u9ed8\u8ba4\u67b6\u6784\u5224\u65ad\u4f8b\u5b50\uff1a def skipif_platform(args: str):\n\"\"\"\u5e73\u53f0\u8df3\u8fc7\"\"\"\n_skip_key = args.split(\"&\")\nfor key in _skip_key:\nif GlobalConfig.SYS_ARCH == key:\nreturn True\nreturn False\n \u65b9\u6cd5\u7f16\u5199\u89c4\u8303\uff1a \u65b9\u6cd5\u540d\u5fc5\u987b\u4ee5 skipif \u5f00\u5934\uff1b \u65b9\u6cd5\u5fc5\u987b\u6709\u8fd4\u56de\u7ed3\u679c\u5e76\u4e14\u4e3a\u5e03\u5c14\u503c\uff08True \u4ee3\u8868\u8df3\u8fc7\uff0cFalse \u4ee3\u8868\u4e0d\u8df3\u8fc7\uff09\uff1b \u65b9\u6cd5\u53ea\u80fd\u6709\u4e00\u4e2a\u5165\u53c2\uff1b \u5728 csv \u6587\u4ef6\u8df3\u8fc7\u539f\u56e0\u4e00\u680f\u4e2d\u586b\u5199\u4e3a \u201c{\u51fd\u6570\u540d}-{\u53c2\u6570}\u201d\uff0c\u4f8b\u5982\uff1askipif_platform-aarch64\uff1b\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u4f1a\u4ee5\u7b2c\u4e00\u4e2a \u201c-\u201d \u8fdb\u884c\u5206\u5272\uff0c\u622a\u53d6\u7684\u5de6\u4fa7\u5b57\u7b26\u4e32\u4f5c\u4e3a\u51fd\u6570\u540d\uff0c\u5728 skipif.py \u6587\u4ef6\u4e2d\u67e5\u627e\u662f\u5426\u6709\u540c\u540d\u51fd\u6570\uff0c\u5e76\u5c06\u622a\u53d6\u7684\u53f3\u4fa7\u4f5c\u4e3a\u53c2\u6570\u4f20\u9012\u7ed9\u8be5\u51fd\u6570\uff0c\u901a\u8fc7\u83b7\u53d6\u8be5\u51fd\u6570\u8fd4\u56de\u7684\u5e03\u5c14\u503c\uff0c\u8fd4\u56de True\uff0c\u5219\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u8fd4\u56de False\uff0c\u5219\u6267\u884c\u8be5\u7528\u4f8b\u3002 \u82e5\u51fd\u6570\u9700\u8981\u591a\u4e2a\u53c2\u6570\uff0c\u53ef\u81ea\u5b9a\u4e49\u591a\u4e2a\u53c2\u6570\u4e4b\u95f4\u7684\u8fde\u63a5\u7b26\uff0c\u8fde\u63a5\u7b26\u53f7\u4e0d\u53ef\u4f7f\u7528\u4e0b\u5212\u7ebf\u548c\u9017\u53f7\uff0c\u63a8\u8350\u7edf\u4e00\u4f7f\u7528 & \u7b26\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32","title":"3.2\u3001\u786e\u8ba4\u4fee\u590d","text":"\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7528\u4f8b\u4fee\u590d\u540e\uff0c\u4f46\u4e0d\u80fd\u7acb\u5373\u5220\u9664\u8df3\u8fc7\u539f\u56e0\uff08skip-XXX\uff09\u7684\u7528\u4f8b\uff0c\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u786e\u8ba4\u4fee\u590d\u201d\uff0c\u4f5c\u4e3a\u6807\u8bb0\u8be5\u7528\u4f8b\u662f\u5426\u5df2\u7ecf\u4fee\u590d\uff0c\u56fa\u5b9a\u586b\u5165\u5b57\u6bb5\u4e3a \u201cfixed-\u5df2\u4fee\u590d\u201d\u3002\u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u5373\u4f7f\u540c\u65f6\u6807\u8bb0\u4e86 skip-XXX \u4e5f\u4f1a\u6b63\u5e38\u6267\u884c\u3002 \u793a\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d \u3010\u540c\u65f6\u6807\u8bb0\u4e86skip \u548c fixed\uff0c\u4f46\u4ecd\u7136\u60f3\u8981\u8df3\u8fc7\u7528\u4f8b\u3011 \u5f53 \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u540c\u65f6\u586b\u5165\u540e\uff0c\u547d\u4ee4\u884c\u4f20\u9012\u53c2\u6570 --ifixed yes\uff0c\u5219\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\u8be5\u6761\u7528\u4f8b\u3002 python3 manage.py run --ifixed yes\n \u770b\u5230\u8fd9\u91cc\u6709\u4e9b\u540c\u5b66\u53ef\u80fd\u8981\u95ee\u4e86\uff0c\u6211\u60f3\u6062\u590d\u8df3\u8fc7\u6267\u884c\uff0c\u76f4\u63a5\u628a skip-XXX \u8fd9\u4e00\u5217\u6807\u7b7e\u5220\u6389\u4e0d\u5c31\u597d\u4e86\uff0c\u8fd8\u641e\u4ec0\u4e48\u786e\u8ba4\u4fee\u590d\u5e72\u5565\uff1f \u8fd9\u91cc\u7ed9\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u89e3\u91ca\u4e00\u4e0b\uff1a \uff08\u4ee5\u4e0b\u6d41\u6c34\u7ebf\u6307\u7684\u662f\u6bcf\u65e5\u6784\u5efa\u7684\u6d41\u6c34\u7ebf\uff0c\u8dd1 AT \u7684\u5168\u91cf\u7528\u4f8b\uff09 \u9996\u5148\uff0c\u6d41\u6c34\u7ebf\u4e0a\u8dd1\u7684\u662f AT \u5386\u53f2 Tag\uff0c\u8df3\u8fc7\u7528\u4f8b\u7684\u6807\u7b7e(skip-XXX) \u662f\u5728\u6700\u65b0\u7684\u4ee3\u7801\u4e0a\u63d0\u4ea4\u7684\uff0c\u6211\u4eec\u91c7\u7528\u6700\u65b0\u7684 csv \u6587\u4ef6\u8986\u76d6\u5386\u53f2 csv \u6587\u4ef6\u7684\u8bbe\u8ba1\u6765\u5b9e\u73b0\u4e86\u5bf9\u5386\u53f2 Tag \u4e0a\u7528\u4f8b\u7684\u8df3\u8fc7\uff1b \u7136\u540e\uff0c\u5728\u65e5\u5e38\u8df3\u8fc7\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u540c\u65f6\u4e5f\u5728\u4fee\u590d\u4e00\u4e9b\u7528\u4f8b\uff0c\u4fee\u590d\u540e\u7684\u8fd9\u4e9b\u7528\u4f8b\u5728\u672c\u5730\u8c03\u8bd5\u7684\u65f6\u5019\u6211\u4eec\u4e0d\u5e0c\u671b\u7ee7\u7eed\u8df3\u8fc7\uff0c\u4f46\u662f\u6b64\u65f6\uff0c\u4fee\u590d\u7684\u8fd9\u4e9b\u7528\u4f8b\u53ef\u80fd\u8fd8\u4e0d\u7a33\u5b9a\uff0c\u4e0d\u9002\u5408\u9a6c\u4e0a\u653e\u5230\u6d41\u6c34\u7ebf\u53bb\u8dd1\uff0c\u4e5f\u5c31\u662f\u8bf4\u6d41\u6c34\u7ebf\u4e0a\u6211\u4eec\u662f\u5e0c\u671b\u4ed6\u7ee7\u7eed\u8df3\u8fc7\u7684\uff0c\u56e0\u6b64\uff0c\u54b1\u4e0d\u80fd\u76f4\u63a5\u628a skip-XXX \u5e72\u6389\uff1b \u8fd9\u91cc\u5c31\u77db\u76fe\u4e86\uff0c\u4e00\u4e2a\u9700\u6c42\u662f\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u53e6\u4e00\u4e2a\u9700\u6c42\u53c8\u4e0d\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u600e\u4e48\u529e\u5462\uff1f \u6211\u4eec\u4f7f\u7528\u201c\u786e\u8ba4\u4fee\u590d\u201d\u6765\u6807\u8bb0\u8fd9\u6761\u7528\u4f8b\u5df2\u7ecf\u4fee\u590d\u4e86\uff0c\u8fd9\u6837\u4f60\u672c\u5730\u8c03\u8bd5\u7528\u4f8b\u7684\u65f6\u5019\u8fd9\u6761\u5df2\u4fee\u590d\u7684\u7528\u4f8b\u662f\u4f1a\u6267\u884c\u7684\uff0c\u540c\u65f6\u5728\u6d41\u6c34\u7ebf\u4e0a\u5c06 --ifixed yes \u53c2\u6570\u52a0\u4e0a\uff0c\u90a3\u4e48\u6d41\u6c34\u7ebf\u4e0a\u6267\u884c\u65f6\u8fd9\u6761\u7528\u4f8b\u4ecd\u7136\u662f\u8df3\u8fc7\u7684\u72b6\u6001\uff0c\u540e\u7eed\u4f60\u6253 Tag \u7684\u65f6\u5019\uff0c\u628a \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u7684\u6807\u7b7e\u5168\u90e8\u5220\u6389\u5c31\u53ef\u4ee5\u4e86\u3002 \u8fd9\u5c31\u662f\u201c\u786e\u8ba4\u4fee\u590d\u201d\u8fd9\u4e2a\u6807\u7b7e\u7684\u80cc\u666f\uff0c\u9700\u8981\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u54c1\u4e00\u54c1\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#33","title":"3.3\u3001\u5e9f\u5f03\u7528\u4f8b","text":"\u9488\u5bf9\u67d0\u4e9b\u7528\u4f8b\uff0c\u7531\u4e8e\u9700\u6c42\u53d8\u66f4\uff0c\u73af\u5883\u5f71\u54cd\u6216\u8bc4\u4f30\u4e0d\u518d\u9002\u7528\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u65f6\uff0c\u7528\u4f8b\u9700\u8981\u5e9f\u5f03\uff0c\u5219\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u5e9f\u5f03\u7528\u4f8b\u201d\uff0c\u8be5\u5217\u5b58\u5728 \u201cremoved-{\u5e9f\u5f03\u539f\u56e0}\u201d\uff0c\u5219\u7528\u4f8b\u4e0d\u4f1a\u6267\u884c\u3002 \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d removed-\u5df2\u5e9f\u5f03 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_2","title":"4\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u4e0a\u9762\u4ecb\u7ecd Pytest \u6846\u67b6\u63d0\u4f9b\u7684\u6807\u7b7e\u529f\u80fd mark\uff0c\u4f7f\u7528\u65f6\u9700\u8981\u4e3a\u6bcf\u4e00\u4e2a\u7528\u4f8b\u6dfb\u52a0\u6807\u7b7e\u88c5\u9970\u5668\uff0c\u5219\u64cd\u4f5c\u590d\u6742\uff0c\u53ef\u7ef4\u62a4\u6027\u5dee\uff0c\u5176\u6839\u672c\u95ee\u9898\u5c31\u662f\u6807\u7b7e\u5206\u6563\u5728\u6bcf\u4e00\u6761\u7528\u4f8b\u7684\u88c5\u9970\u5668\u4e0a\uff0c\u96be\u4ee5\u96c6\u4e2d\u7ef4\u62a4\uff1b\u4e8e\u662f\u4e4e\u5c06\u6240\u6709\u6807\u7b7e\u4f7f\u7528 csv \u6587\u4ef6\u8fdb\u884c\u96c6\u4e2d\u7ba1\u7406\uff0c\u5e76\u901a\u8fc7 Pytest \u7684\u94a9\u5b50\u51fd\u6570\uff0c\u8bfb\u53d6 csv \u6587\u4ef6\uff0c\u52a8\u6001\u6dfb\u52a0\u6807\u7b7e\u5230\u7528\u4e2d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5csv","title":"5\u3001CSV\u6587\u4ef6\u683c\u5f0f","text":"\u6b64\u914d\u7f6e\u6587\u4ef6\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u6807\u7b7e\u6570\u636e\uff0c\u4e14\u8981\u65b9\u4fbf\u80fd\u4f7f\u7528Excel\u6253\u5f00\u8fdb\u884c\u7f16\u8f91\u67e5\u770b\uff0c\u66f4\u91cd\u8981\u7684\u662f\u6211\u4eec\u4e0d\u60f3\u5f15\u5165\u4e09\u65b9\u4f9d\u8d56\uff0cCSV \u6587\u4ef6\u51e0\u4e4e\u662f\u552f\u4e00\u80fd\u6ee1\u8db3\u6240\u6709\u7684\u8981\u6c42\u7684\u6587\u4ef6\u683c\u5f0f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_6","title":"\u4e03\u3001\u65e5\u5fd7\u7cfb\u7edf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_5","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e YouQu \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u64cd\u4f5c\u65b9\u6cd5\u5c01\u88c5\u5199\u6cd5\uff0c\u901a\u5e38\u662f\u8fd9\u6837\u7684\uff1a\u7c7b\u91cc\u9762\u4e00\u4e2a\u51fd\u6570\u53ea\u5305\u542b\u4e00\u4e2a\u64cd\u4f5c\u6216\u591a\u6b21\u8c03\u7528\u7684\u4e00\u7cfb\u5217\u53ef\u5408\u5e76\u7684\u64cd\u4f5c\uff1b \u4f20\u7edf\u7684\u65e5\u5fd7\u8f93\u51fa\u65b9\u5f0f\uff0c\u9700\u8981\u5728\u6bcf\u4e2a\u51fd\u6570\u91cc\u9762\u4e3b\u52a8\u7f16\u5199\u65e5\u5fd7\u8f93\u51fa\u4ee3\u7801 \uff0c\u4f8b\u5982\uff1a class XXXWidget:\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\nlogger.info(\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\")\n...\n# \u7701\u7565\u4ee3\u7801\u90e8\u5206\n \u4e00\u4e2a\u51fd\u6570\u91cc\u9762\u81f3\u5c11\u5305\u542b\u4e00\u6761\u65e5\u5fd7\u4fe1\u606f\uff0c\u5982\u679c\u6bd4\u8f83\u590d\u6742\u64cd\u4f5c\u6b65\u9aa4\uff0c\u53ef\u80fd\u5305\u542b\u591a\u6761\u65e5\u5fd7\u4fe1\u606f\uff1b \u4e00\u4e2a\u5e94\u7528\u542b\u6709\u5927\u91cf\u7684\u64cd\u4f5c\u51fd\u6570\uff0c\u4e5f\u5c31\u662f\u8bf4\u6211\u4eec\u9700\u8981\u5199\u5927\u91cf\u7684\u65e5\u5fd7\u4ee3\u7801\uff1b \u901a\u8fc7\u7ecf\u9a8c\u89c2\u5bdf\uff0c\u6211\u4eec\u53d1\u73b0\uff0c\u51fd\u6570\u8bf4\u660e\u4ee5\u53ca\u51fd\u6570\u64cd\u4f5c\u65e5\u5fd7\uff0c\u5177\u6709\u8f83\u9ad8\u7684\u91cd\u590d\u5ea6\uff08\u4ece\u4e0a\u9762\u7684\u4f8b\u5b50\u4e5f\u53ef\u4ee5\u770b\u51fa\u6765\uff09\uff0c\u56e0\u6b64\u6211\u4eec\u5927\u80c6\u7684\u8bbe\u60f3\uff0c\u80fd\u4e0d\u80fd\u57fa\u4e8e\u6846\u67b6\u6267\u884c\u65f6\uff0c\u81ea\u52a8\u7684\u5c06\u51fd\u6570\u8bf4\u660e\u4f5c\u4e3a\u65e5\u5fd7\u6253\u5370\u51fa\u6765\uff0c\u4ece\u800c\u51cf\u5c11\u5927\u91cf\u65e5\u5fd7\u4ee3\u7801\u91cf\u548c\u91cd\u590d\u7f16\u5199\uff0c\u90a3\u771f\u662f\u5999\u554a~\u3002 \u57fa\u4e8e\u6b64\u201c\u5929\u771f\u201d\u7684\u60f3\u6cd5\uff0c\u6211\u4eec\u8bbe\u8ba1\u51fa\u4e86 youqu \u7684\u65e5\u5fd7\u7cfb\u7edf\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_5","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u6838\u5fc3\u539f\u7406\uff1a \u901a\u8fc7\u7ed9\u7c7b\u52a0\u4e0a\u4e00\u4e2a\u88c5\u9970\u5668 @log\uff0c\u52a8\u6001\u7ed9\u8be5\u7c7b\u4e0b\u6240\u6709\u7684\u51fd\u6570\u53ca\u7236\u7c7b\u51fd\u6570\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668 @_trace\uff0c\u5728\u6b64\u88c5\u9970\u5668\u4e2d\u6211\u4eec\u80fd\u52a8\u6001\u7684\u6355\u83b7\u6240\u8c03\u7528\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff08func.__doc__\uff09\uff0c\u901a\u8fc7\u65e5\u5fd7\u8f93\u51fa\u5668\u5c06\u5176\u8f93\u51fa\u5373\u53ef\u3002 \u5b9e\u73b0\u6b65\u9aa4\uff1a \u901a\u8fc7 inspect.getmembers \u83b7\u53d6\u88ab\u88c5\u9970\u7684\u7c7b\u4e0b\u6240\u6709\u51fd\u6570\uff0c\u5305\u542b\u9759\u6001\u65b9\u6cd5\uff0c\u7c7b\u65b9\u6cd5\uff0c\u5b9e\u4f8b\u65b9\u6cd5\uff1b \u901a\u8fc7 setattr(\u7c7b, \u65b9\u6cd5, _trace\uff09 \u7684\u65b9\u5f0f\uff0c\u7ed9\u7b26\u5408\u6761\u4ef6\u7684\u51fd\u6570\uff0c\u52a8\u6001\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_3","title":"3\u3001\u65e5\u5fd7\u914d\u7f6e","text":"[log_cli]\n;\u65e5\u5fd7\u76f8\u5173\u914d\u7f6e\uff08\u4e0d\u6253\u5370\u6784\u9020\u51fd\u6570\u548c\u9b54\u6cd5\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff09\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = INFO\n# ============= \u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u914d\u7f6e ================\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u5f00\u5934\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7, \u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_STARTSWITH = Assert\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u7ed3\u5c3e\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_ENDSWITH = Widget\n;\u652f\u6301\u7c7b\u540d\u5305\u542b xxx \u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_CONTAIN = ShortCut\n# ==============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_3","title":"4\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u5728\u5e94\u7528\u5e93 widget \u65b9\u6cd5\u5e93\u91cc\u9762\uff0c\u53ea\u9700\u8981\u5728\u51fa\u53e3\u6587\u4ef6\u52a0\u4e0a\u7c7b\u88c5\u9970\u5668\uff0c\u5c31\u53ef\u4ee5\u5b9e\u73b0\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u4e86\uff1b # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6ce8\u610f\uff0c\u662f\u7c7b\u88c5\u9970\u5668\u3002 \u5b9e\u4f8b\uff1a # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\n@classmethod\ndef find_dfm_image(cls, *elements, multiple=False, rate=0.9):\n\"\"\"\n \u67e5\u627e\u56fe\u7247 {{elements}}.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e {{rate}} \u7684\u5750\u6807\n :param elements:\n :param multiple:\n :return:\n \"\"\"\nelement = tuple(map(lambda x: f\"{Config.PIC_RES_PATH}/{x}\", elements))\nreturn cls.find_image(*element, multiple=multiple)\n \u8c03\u7528\u65b9\u6cd5\u65f6\uff1a DfmWidget.find_dfm_image(\"dfm_001\")\n \u81ea\u52a8\u8f93\u51fa\u7684\u65e5\u5fd7\uff1a >> x86_64-uos-6: 02/28 17:48:47 | INFO | logger_utils: [find_dfm_image]: \u67e5\u627e\u56fe\u7247 dfm_001.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e 0.9 \u7684\u5750\u6807\n \u52a0\u4e0a\u88c5\u9970\u5668 @log \u4e4b\u540e\uff0c\u65b9\u6cd5\u5c42\u6240\u6709\u7684\u51fd\u6570\uff08\u5305\u62ec\u5b9e\u4f8b\u65b9\u6cd5\u3001\u7c7b\u65b9\u6cd5\u3001\u9759\u6001\u65b9\u6cd5\uff09\u90fd\u4e0d\u9700\u8981\u518d\u5199\u65e5\u5fd7\u4ee3\u7801\uff0c\u6267\u884c\u7684\u65f6\u5019\u4f1a\u81ea\u52a8\u8f93\u51fa\uff0c\u5e76\u4e14\u6240\u6709\u8c03\u7528\u7684\u65b9\u6cd5\u4f1a\u4ee5 allure.step \u7684\u65b9\u5f0f\uff0c\u5c55\u793a\u5728 allure \u62a5\u544a\u4e2d\uff0c\u5728\u62a5\u544a\u4e2d\u66f4\u80fd\u4e00\u76ee\u4e86\u7136\u7684\u770b\u5230\u7528\u4f8b\u6267\u884c\u6b65\u9aa4\u3002 \u3010\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\u3011 \u901a\u8fc7\u89c2\u5bdf\u524d\u9762\u7684\u4f8b\u5b50\uff0c\u7ec6\u5fc3\u7684\u540c\u5b66\u53ef\u80fd\u8fd8\u53d1\u73b0\u4e86\u4e00\u4e2a\u5c0f\u7ec6\u8282\uff1a\u51fd\u6570\u529f\u80fd\u8bf4\u660e\u4e2d\uff0c\u4e24\u5bf9\u5927\u62ec\u53f7\u4e2d\u7684\u5185\u5bb9 {{elements}} \u4f5c\u4e3a\u53d8\u91cf\u8f93\u51fa\u51fa\u6765\u4e86\uff1b \u6ca1\u9519\uff0c\u8fd9\u5c31\u662f\u6211\u4eec\u53c2\u8003Django \u548c jinja2 \u7684\u6a21\u677f\u8bed\u6cd5\u8bbe\u8ba1\u51fa\u7684\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\uff0c\u4f7f\u7528\u65b9\u6cd5\u5f88\u7b80\u5355\uff0c\u7528\u4e24\u5bf9\u5927\u62ec\u53f7\u628a\u51fd\u6570\u7684\u53c2\u6570\u62ec\u8d77\u6765\uff0c\u8fd9\u6837\u5728\u65e5\u5fd7\u8f93\u51fa\u7684\u65f6\u5019\u5c31\u80fd\u628a\u8c03\u7528\u51fd\u6570\u65f6\u53c2\u6570\u7684\u503c\u8f93\u51fa\u51fa\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_7","title":"\u516b\u3001\u73af\u5883\u90e8\u7f72","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_6","title":"1\u3001\u539f\u5219","text":"YouQu \u7684\u73af\u5883\u4f9d\u8d56\u4e00\u76f4\u575a\u6301 2 \u4e2a\u539f\u5219\uff1a \u6700\u5c0f\u73af\u5883\u4f9d\u8d56\u539f\u5219 \u6709\u4e9b\u540c\u5b66\u5199\u4e00\u4e9b\u529f\u80fd\uff0c\u9996\u5148\u60f3\u5230\u7684\u5c31\u662f\u53bb\u641c\u7d22\u5f15\u64ce\u641c\u4e00\u4e0b\uff0c\u770b\u6709\u6ca1\u6709\u73b0\u6210\u7684\u5de5\u5177\u6216\u8005\u4ee3\u7801\u76f4\u63a5\u80fd\u7528\uff0c\u7f8e\u5176\u540d\u66f0\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\uff0c\u522b\u4eba\u5df2\u7ecf\u9020\u597d\u4e86\u8f6e\u5b50\u54b1\u4eec\u5c31\u4e0d\u8981\u91cd\u590d\u53bb\u9020\u4e86\uff0c\u7136\u540e\u4e00\u5207\u4f3c\u4e4e\u90fd\u53d8\u5f97\u90a3\u4e48\u7684\u7406\u6240\u5e94\u5f53\u3002 \u5f53\u7136\u8fd9\u6837\u505a\u65e0\u53ef\u539a\u975e\uff0c\u6211\u76f8\u4fe1\u6709\u8fd9\u6837\u60f3\u6cd5\u5e76\u4e14\u4e00\u76f4\u8df5\u884c\u8fd9\u6837\u505a\u6cd5\u7684\u540c\u5b66\u4e0d\u5728\u5c11\u6570\uff0c\u4f46\u8fd9\u6837\u505a\u6709\u4e00\u4e2a\u5f88\u4e25\u91cd\u7684\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f60\u5199\u4e00\u4e2a\u5927\u578b\u9879\u76ee\u65f6\uff0c\u4f60\u4f1a\u5f15\u5165\u975e\u5e38\u975e\u5e38\u975e\u5e38\u591a\u7684\u4f9d\u8d56\uff0c\u6bd4\u5982\u8981\u505a\u4e2a\u63a5\u53e3\u8bf7\u6c42\u8981\u7528 requests\u3001\u8bfb\u5199\u4e2a\u6570\u636e\u7528 pandas\u3001\u5199\u4e2a\u8868\u683c\u7528 pyopenxl\u3001\u89e3\u6790\u4e2a\u6587\u672c\u8981\u7528\u8fd9\u4e2a\u90a3\u4e2a\u4e09\u65b9\u5e93 ... \u3002 \u6211\u8ba4\u4e3a\u8fd9\u662f\u975e\u5e38\u4e0d\u597d\u7684\u4e60\u60ef\uff0c\u5728\u5b9e\u73b0\u4e00\u4e2a\u529f\u80fd\u7684\u65f6\u5019\uff0c\u9996\u5148\u6211\u4eec\u5e94\u8be5\u53bb\u60f3\u81ea\u5df1\u600e\u4e48\u6837\u53bb\u5b9e\u73b0\uff0c\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff1b \u5982\u679c\u4f60\u4e0d\u4f1a\uff0c\u4f60\u53ef\u4ee5\u53bb\u5b66\u4e60\u4e09\u65b9\u5e93\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u522b\u4eba\u4e09\u65b9\u5e93\u4e5f\u662f\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\u7684\uff0c\u4e3a\u4ec0\u4e48\u54b1\u4eec\u4e0d\u884c\u5462\uff1b\u5982\u679c\u522b\u4eba\u7684\u4f60\u5b9e\u5728\u662f\u770b\u4e0d\u61c2\uff0c\u60f3\u5c3d\u4e00\u5207\u529e\u6cd5\u786e\u5b9e\u505a\u4e0d\u51fa\u6765\uff0c\u90a3\u518d\u8003\u8651\u5f15\u5165\u8fd9\u4e2a\u4e09\u65b9\u5e93\uff0c\u6211\u8ba4\u4e3a\u8fd9\u6837\u662f\u6ca1\u95ee\u9898\u7684\uff0c\u6bd5\u7adf\u54b1\u4eec\u6bb5\u4f4d\u8fd8\u4e0d\u591f\uff0c\u4f46\u5e0c\u671b\u5c06\u6765\u6709\u4e00\u5929\u6211\u4eec\u53ef\u4ee5\u3002 \u8fd9\u6837\u7684\u505a\u6cd5\u624d\u5e94\u8be5\u662f\u201c\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\u201d\u6b63\u786e\u7684\u64cd\u4f5c\u3002\u4e0d\u4f1a\u6ca1\u5173\u7cfb\uff0c\u770b\u770b\u522b\u4eba\u662f\u600e\u4e48\u5b9e\u73b0\u7684\uff0c\u81ea\u5df1\u518d\u6478\u7d22\u7740\u5199\u51fa\u6765\uff0c\u8fd9\u6837\u81ea\u5df1\u624d\u80fd\u6709\u6240\u63d0\u9ad8\uff0c\u4e0d\u7136\u4f60\u5c31\u53ea\u4f1a\u7528\u522b\u4eba\u7684\u4e1c\u897f\uff1b\u90a3\u4e9b\u5632\u7b11\u3001\u6279\u8bc4\u6211\u4eec\u91cd\u590d\u9020\u8f6e\u5b50\u7684\u4eba\uff0c\u5148\u60f3\u60f3\u81ea\u5df1\u4f1a\u9020\u8f6e\u5b50\u5417\u3002 \u672c\u7740\u81ea\u5df1\u5b9e\u73b0\u80fd\u5b9e\u73b0\u7684\u4e00\u5207\u7684\u539f\u5219\uff0cYouQu \u6846\u67b6\u505a\u5230\u4e86\u975e\u5e38\u5c11\u7684\u73af\u5883\u4f9d\u8d56\uff0c\u800c\u4e14\u6211\u4eec\u4ecd\u5728\u4e0d\u65ad\u52aa\u529b\uff0c\u51cf\u5c11\u73af\u5883\u90e8\u7f72\u7684\u4f9d\u8d56\u3002 \u6700\u5c0f\u4ed3\u5e93\u4f53\u79ef\u539f\u5219 \u5927\u6587\u4ef6\u4e0d\u80fd\u4e0a\u4f20\u5230\u5de5\u7a0b\u91cc\u9762\uff0c\u4fdd\u6301\u6574\u4e2a\u5de5\u7a0b\u7684\u8f7b\u91cf\u5316\uff0c\u8fd9\u6837\u5728\u514b\u9686\u4ee3\u7801\u7684\u65f6\u5019\u624d\u80fd\u975e\u5e38\u5feb\u901f\u65b9\u4fbf\u4f7f\u7528\uff0c\u6211\u4eec\u89c1\u8fc7\u4e00\u4e2a AT \u5de5\u7a0b clone \u5927\u5c0f\u8fbe\u5230\u597d\u51e0\u4e2a G\uff0c\u7b80\u76f4\u4e0d\u53ef\u601d\u8bae\u3002 \u5176\u5b9e\u4ee3\u7801\u6587\u4ef6\u7684\u5927\u5c0f\u662f\u5f88\u5c0f\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u7eaf\u5199\u4ee3\u7801\u968f\u4fbf\u5199\u5de5\u7a0b\u4e5f\u4e0d\u4f1a\u592a\u5927\uff0c\u800c\u6587\u6863\uff08\u5305\u542b\u63d2\u56fe\uff09\u7b49\u8d44\u6e90\u5374\u662f\u5f88\u5360\u7a7a\u95f4\u3002 \u56e0\u6b64\u6211\u4eec\u9009\u62e9\u5c06 YouQu \u7684\u6587\u6863\u5de5\u7a0b\u5355\u72ec\u8fc1\u51fa\u5230\u72ec\u7acb\u7684\u4ed3\u5e93 youqu-docs \u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_6","title":"2\u3001\u5b89\u88c5","text":"\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u8fd0\u884c env.sh \u5373\u53ef\u3002 bash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_4","title":"3\u3001\u5b9a\u5236\u4f9d\u8d56","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_2","title":"3.1\u3001\u65b0\u589e\u4f9d\u8d56","text":"\u5982\u679c\u5e94\u7528\u5e93\u8fd8\u9700\u8981\u5176\u4ed6 Python \u4f9d\u8d56\u5e93\uff0c\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a requirement.txt \u6587\u4ef6\uff1b autotest_xxx\n\u251c\u2500\u2500 requirement.txt\n\u251c\u2500\u2500 case ...\n \u91cc\u9762\u5199\u5165\u9700\u8981\u5b89\u88c5\u7684\u4e09\u65b9\u4f9d\u8d56\uff0c\u6bd4\u5982\u50cf\u8fd9\u6837\uff1a # requirement.txt\nPyYAML==6.0 # \u6307\u5b9a\u5b89\u88c5\u67d0\u4e2a\u7248\u672c\nrequests # \u672a\u6307\u5b9a\u7248\u672c\u5219\u5b89\u88c5\u6700\u65b0\u7248\n \u5728\u6267\u884c bash env.sh \u65f6\u4f1a\u4e00\u5e76\u5c06\u5176\u5b89\u88c5\u3002 \u5982\u679c\u591a\u4e2a\u5e94\u7528\u5e93\u90fd\u5b58\u5728 requirement.txt \u6587\u4ef6\uff0c\u6267\u884c env.sh \u65f6\u4f1a\u5c06\u591a\u4e2a requirement.txt \u6587\u4ef6\u4e00\u5e76\u52a0\u8f7d\uff1b\u90a3\u4e48\u4e00\u5b9a\u8981\u6ce8\u610f\u591a\u4e2a requirement.txt \u6587\u4ef6\u53ef\u80fd\u5b58\u5728\u76f8\u540c\u7684\u4f9d\u8d56\u88ab\u6307\u5b9a\u5b89\u88c5\u4e0d\u540c\u7248\u672c\u7b49\u7b49\u517c\u5bb9\u6027\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32_1","title":"3.2\u3001\u88c1\u526a\u4f9d\u8d56","text":"\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0c\u53ef\u80fd\u4f60\u53ea\u9700\u8981\u5b89\u88c5\u4e00\u4e9b\u6700\u6700\u57fa\u7840\u7684\u4f9d\u8d56\uff0c\u5176\u4ed6\u7684\u90fd\u4e0d\u9700\u8981\uff0c\u6bd4\u5982\u7eaf\u63a5\u53e3\u81ea\u52a8\u5316\u7684\u9879\u76ee\uff0c\u5b83\u4e0d\u9700\u8981 UI \u81ea\u52a8\u5316\u76f8\u5173\u7684\u4f9d\u8d56\u3002 \u4f60\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\uff0c\u5b58\u653e\u4e00\u4e2a BASICENV \u7684\u666e\u901a\u6587\u4ef6\uff0c\u91cc\u9762\u4e0d\u9700\u8981\u5199\u4efb\u4f55\u5185\u5bb9\uff0c\u8fd9\u6837\u6267\u884c env.sh \u65f6\uff0c\u53ea\u4f1a\u5b89\u88c5\u6700\u57fa\u7840\u7684\u4f9d\u8d56\u3002 autotest_xxx\n\u251c\u2500\u2500 BASICENV # \u53ef\u4ee5\u4f7f\u7528\uff1atouch BASICENV \u521b\u5efa\u6587\u4ef6\n\u251c\u2500\u2500 case ...\n \u57fa\u7840\u4f9d\u8d56\u4ec5\u5b89\u88c5\u4ee5\u4e0b\u51e0\u4e2a\u5305\uff1a pytest # pytest\npytest-rerunfailures # \u5931\u8d25\u91cd\u8dd1\u63d2\u4ef6\npytest-timeout # \u7528\u4f8b\u8d85\u65f6\u63d2\u4ef6\nallure-pytest # \u751f\u6210 allure \u62a5\u544a\u63d2\u4ef6\nallure.deb # allure \u62a5\u544a\u67e5\u770b\u5de5\u5177\n \u88c1\u526a\u4f9d\u8d56 \u548c \u65b0\u589e\u4f9d\u8d56 \u662f\u4e0d\u51b2\u7a81\u7684\uff0c\u53ef\u4ee5\u540c\u65f6\u4f7f\u7528\u3002 \u6b64\u65b9\u6848\u9ed8\u8ba4\u4e3a\u865a\u62df\u73af\u5883\u90e8\u7f72\uff0c\u5982\u679c\u4f60\u60f3\u76f4\u63a5\u90e8\u7f72\u5728\u672c\u673a\u4e0a\uff1a bash env_dev.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_8","title":"\u4e5d\u3001\u5931\u8d25\u5f55\u5c4f","text":"\u5f55\u5c4f\u5176\u5b9e\u662f\u4e00\u79cd\u89c6\u9891\u5f62\u5f0f\u7684\u65e5\u5fd7\uff0c\u56e0\u4e3a\u5f88\u591a\u65f6\u5019\u6211\u4eec\u5728\u67e5\u770b\u65e5\u5fd7\u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u51c6\u786e\u7684\u5b9a\u4f4d\u5230\u7528\u4f8b\u5931\u8d25\u7684\u5177\u4f53\u539f\u56e0\uff0c\u56e0\u6b64\u7528\u4f8b\u7684\u5f55\u5c4f\u80fd\u8ba9\u6211\u4eec\u770b\u5230\u7528\u4f8b\u5728\u6267\u884c\u8fc7\u7a0b\uff1b \u3010\u4f7f\u7528\u65b9\u6cd5\u3011 \u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u5173\u6ce8 2 \u4e2a\u53c2\u6570\uff1b ;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\u3002\n;\u6ce8\u610f\uff0c\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u4e0d\u80fd\u5c0f\u4e8e\u5931\u8d25\u5f55\u5c4f\u6b21\u6570\uff0c\u5373 RERUN >= RECORD_FAILED_CASE\nRECORD_FAILED_CASE = 1\n \u9ed8\u8ba4\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u662f 1 \u6b21\uff1b RECORD_FAILED_CASE = 1 \u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff1b RECORD_FAILED_CASE = 0 \u8868\u793a\u4e0d\u7ba1\u7528\u4f8b\u6210\u529f\u6216\u5931\u8d25\u90fd\u5f55\u5c4f\uff1b \u5f55\u5c4f\u662f\u8981\u5360\u7528\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u7279\u522b\u662f\u5728\u4e00\u4e9b\u914d\u7f6e\u8f83\u4f4e\u7684\u673a\u5668\u4e0a\u4f1a\u5f88\u660e\u663e\uff0c\u6240\u4ee5\u4f60\u9700\u8981\u8003\u8651\u662f\u5426\u6709\u5fc5\u8981\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1b \u4f7f\u7528 manage.py \u6267\u884c\u7528\u4f8b\u9ed8\u8ba4\u8bfb\u53d6\u5230 globalconfig.ini \u91cc\u9762\u7684\u53c2\u6570\uff0c\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report/record \u76ee\u5f55\u4e0b\u4fdd\u5b58\u5931\u8d25\u7528\u4f8b\u7684\u5f55\u5c4f\u548c\u65ad\u8a00\u7684\u90a3\u4e2a\u65f6\u95f4\u70b9\u7684\u622a\u5c4f\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7\u89c6\u9891\u6587\u4ef6\u770b\u5230\u5931\u8d25\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u90fd\u53d1\u751f\u4e86\u4ec0\u4e48\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#wayland","title":"\u5341\u3001Wayland \u9002\u914d","text":"Wayland \u4e0b\u81ea\u52a8\u5316\u4e3b\u8981\u95ee\u9898\u662f X11 \u4e0b\u7684\u952e\u9f20\u64cd\u4f5c\u65b9\u6cd5\u65e0\u6cd5\u4f7f\u7528\uff0c\u6bd4\u5982 Xdotool\u3001 PyAutoGUI\u3001Xwininfo \u7b49\u7b49\uff1b YouQu \u5728 Wayland \u4e0b\u517c\u5bb9\u9002\u914d\uff0cenv.sh \u5728 Wayland \u4e0b\u6267\u884c\u65f6\u4f1a\u5b89\u88c5\u81ea\u7814\u7684\u952e\u9f20\u64cd\u4f5c\u670d\u52a1\uff08\u53ef\u80fd\u5b58\u5728\u4e00\u4e9b\u4f9d\u8d56\u62a5\u9519\uff0c\u6309\u7167\u6ce8\u91ca\u89e3\u51b3\u5373\u53ef\uff09\uff0c\u6846\u67b6\u6838\u5fc3\u5e93\u4e5f\u9488\u5bf9\u6027\u7684\u505a\u4e86\u9002\u914d\uff0c\u4e0a\u5c42\u7528\u4f8b\u5b8c\u5168\u4e0d\u7528\u5173\u5fc3\u673a\u5668\u662fWayland \u8fd8\u662f X11\uff0c\u6846\u67b6\u4f1a\u6839\u636e\u6267\u884c\u65f6\u72b6\u6001\u81ea\u52a8\u5224\u65ad\u8d70\u4e0d\u540c\u7684\u903b\u8f91\uff1b \u7b80\u5355\u8bb2\u5c31\u662f\uff0c\u5e94\u7528\u5e93\u53ea\u9700\u8981\u7ef4\u62a4\u4e00\u5957\u7528\u4f8b\u811a\u672c\u5373\u53ef\u3002 \u3010\u7528\u4f8b\u517c\u5bb9\u3011 \u56e0\u4e3a Wayland \u4e0b\u6709\u4e9b\u5e94\u7528\u7684\u754c\u9762\u663e\u793a\u548c\u529f\u80fd\u672c\u8eab\u5b58\u5728\u4e00\u4e9b\u5dee\u5f02\uff0c\u7528\u4f8b\u5c42\u53ef\u80fd\u9700\u8981\u5bf9\u8fd9\u90e8\u5206\u7528\u4f8b\u505a\u903b\u8f91\u5224\u65ad\uff0c\u4f7f\u7528\u5168\u5c40\u914d\u7f6e\u91cc\u9762\u7684\u5e38\u91cf\u8fdb\u884c\u903b\u8f91\u7f16\u5199\u5373\u53ef\uff1a from setting.globalconfig import GlobalConfig\n# GlobalConfig.IS_WAYLAND \u83b7\u53d6\u5230\u5f53\u524d\u7684\u663e\u793a\u670d\u52a1\u5668\uff08bool\uff09\n# \u5e94\u7528\u5e93 Config \u7ee7\u627f GlobalConfig\nif Config.IS_WAYLAND:\npass\nif Config.IS_X11:\npass\n \u6bd4\u5982\u7528\u4f8b\u91cc\u9762\u5982\u679c\u65ad\u8a00\u7684\u56fe\u7247\u4e0d\u540c\uff1a if Config.IS_WAYLAND:\nself.assert_image_exist(\"wayland_XXX\")\nelse:\nself.assert_image_exist(\"x11_XXX\")\n \u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u811a\u672c\u5728 Wayland \u548c X11 \u4e0b\u90fd\u53ef\u4ee5\u8dd1\uff0cso easy \u662f\u4e0d\u662f\uff1f\u5b8c\u5168\u6ca1\u5fc5\u8981\u4e13\u95e8\u62c9\u65b0\u5206\u652f\u8fdb\u884c Wayland \u9002\u914d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_9","title":"\u5341\u4e00\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_7","title":"1. \u76ee\u5f55\u7ed3\u6784","text":"\u6267\u884c\u65f6\u4f1a\u5728\u6839\u76ee\u5f55\u4e0b\u52a8\u6001\u751f\u6210 report \u76ee\u5f55\uff0c\u6240\u6709\u7684\u62a5\u544a\u76f8\u5173\u7684\u6587\u4ef6\u4f1a\u7edf\u4e00\u5b58\u653e\u5728\u91cc\u9762\uff0c\u793a\u4f8b\uff1a /report\n \u251c\u2500\u2500 allure # allure\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json\n \u251c\u2500\u2500 allure_html # \u751f\u6210\u7684html\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 index.html \u251c\u2500\u2500 allure_back # allure\u62a5\u544a\u5907\u4efd\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 20221108114823\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json\n \u251c\u2500\u2500 json # json\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 result_deepin-music_20221109134736_1081333.json\n \u251c\u2500\u2500 logs # \u65e5\u5fd7\u6587\u4ef6\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 2022-11-10_debug.log \u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-10_error.log\n \u251c\u2500\u2500 record # \u5f55\u5c4f\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-09\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 15\u65f614\u520609\u79d2_test_music_303_2_autotest.mp4\n \u2514\u2500\u2500 xml # xml\u62a5\u544a\n\u2514\u2500\u2500 autotest_deepin_music-20221109134736.xml\n \u9ed8\u8ba4\u60c5\u51b5\u4e0b\u540c\u65f6\u751f\u6210 html\u3001xml\u3001json\u4e09\u79cd\u5f62\u5f0f\u7684\u62a5\u544a\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_7","title":"2. \u5b9a\u5236\u62a5\u544a","text":"\u6211\u4eec\u5bf9 allure \u62a5\u544a\u8fdb\u884c\u4e86\u4e00\u7cfb\u5217\u7684\u5b9a\u5236\uff1a \u5b9a\u5236 logo\u3001title\u3001\u62a5\u544a\u9ed8\u8ba4\u8bed\u8a00\u4e3a\u4e2d\u6587\uff1b \u52a0\u5165\u4e86\u7528\u4f8b\u65ad\u8a00\u5931\u8d25\u65f6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u4ee5\u53ca\u6b64\u65f6\u56fe\u50cf\u5bf9\u6bd4\u7684\u6a21\u677f\u56fe\u7247\uff1b \u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\uff0c\u4f60\u53ef\u4ee5\u5728 html \u62a5\u544a\u4e2d\u76f4\u63a5\u770b\u5f55\u5236\u7684\u89c6\u9891\uff1b \u52a0\u5165\u4e86 IP \u5730\u5740\u3001\u7cfb\u7edf\u4fe1\u606f\u3001\u955c\u50cf\u7248\u672c\u7b49\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_5","title":"3. \u67e5\u770b\u62a5\u544a","text":" \u672c\u5730\u6267\u884c \u5728 report/allure \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u4e00\u5806\u6587\u672c\u6587\u4ef6\uff0c\u8fd9\u4e9b\u662f allure \u63d2\u4ef6\u751f\u6210\u7684\u62a5\u544a\u6e90\u6570\u636e\uff0c\u6211\u4eec\u5728 report/allure_html \u76ee\u5f55\u4e0b\u7ed9\u4f60\u751f\u6210\u4e86 html \u6587\u4ef6\uff0c\u4f46\u662f\u4f60\u4e0d\u80fd\u76f4\u63a5\u901a\u8fc7\u6d4f\u89c8\u5668\u6253\u5f00 index.html \u6587\u4ef6\uff0c\u56e0\u4e3a allure \u7684\u62a5\u544a\u90fd\u662f\u57fa\u4e8e\u5728\u7ebf\u7684\u670d\u52a1\uff0c\u4f60\u5e94\u8be5\u8fd9\u6837\u6253\u5f00\uff1a allure open report/allure_html\n \u4f7f\u7528 manage.py \u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u5728\u7ec8\u7aef\u7684\u6700\u540e\u4e00\u884c\uff0c\u6211\u4eec\u4f1a\u7ed9\u4f60\u8f93\u51fa\u6253\u5f00\u62a5\u544a\u7684\u547d\u4ee4\uff0c\u76f4\u63a5\u590d\u5236\u5b83\u5728\u7ec8\u7aef\u6267\u884c\u5c31\u53ef\u4ee5\u67e5\u770b\u4e86\uff0c\u50cf\u8fd9\u6837\uff1a \u7ec8\u7aef\u6267\u884c\u547d\u4ee4: allure open /tmp/youqu/report/allure_html \u67e5\u770b\u62a5\u544a \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 Pycharm \u91cc\u9762\u627e\u5230 index.html \u6587\u4ef6\uff0c\u7136\u540e\u53f3\u952e\u9009\u62e9\u6d4f\u89c8\u5668\u6253\u5f00\uff0c\u6216\u8005\u4f60\u53ef\u4ee5\u7528\u4e00\u4e2a http \u670d\u52a1\u6253\u5f00\u3002 \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 report/allure \u76ee\u5f55\u4e0b\u67e5\u770b\u62a5\u544a\uff1a allure serve report/allure\n \u8fdc\u7a0b\u6267\u884c \u8fdc\u7a0b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\uff0c\u4f1a\u5c06\u6240\u6709\u8fdc\u7a0b\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u62a5\u544a\u90fd\u6536\u96c6\u5230 report/allure \u76ee\u5f55\u4e0b\uff0c\u5206\u522b\u6309\u7167\u673a\u5668\u7684 IP \u7b49\u5efa\u4e86\u4e0d\u540c\u7684\u76ee\u5f55\uff0c\u4f60\u53ef\u4ee5\u5728\u8fd9\u4e9b\u76ee\u5f55\u91cc\u9762\u53bb\u67e5\u770b\u5bf9\u5e94\u7684\u6d4b\u8bd5\u62a5\u544a\uff0c\u67e5\u770b\u65b9\u6cd5\u548c\u524d\u9762\u672c\u5730\u6267\u884c\u67e5\u770b\u7684\u65b9\u6cd5\u4e00\u6837\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_10","title":"\u5341\u4e8c\u3001\u9759\u6001\u4ee3\u7801\u626b\u63cf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_8","title":"1. \u63d0\u524d\u89e3\u51b3\u4ee3\u7801\u95ee\u9898","text":"\u4e3a\u4e86\u5e2e\u52a9\u5f00\u53d1\u8005\u7edf\u4e00\u4ee3\u7801\u98ce\u683c\uff0cPython \u793e\u533a\u63d0\u51fa\u4e86 PEP8 \u4ee3\u7801\u7f16\u7801\u98ce\u683c\uff0cPython \u5b98\u65b9\u540c\u65f6\u63a8\u51fa\u4e86\u4e00\u4e2a\u68c0\u67e5\u4ee3\u7801\u98ce\u683c\u662f\u5426\u7b26\u5408 PEP8 \u7684\u5de5\u5177\uff0c\u540d\u5b57\u4e5f\u53eb PEP8\u3002 \u4f46\u662f\uff0cPycharm \u91cc\u9762\u7684 PEP8 \u63d2\u4ef6\u5b9e\u9645\u4e0a\u5e76\u4e0d\u80fd\u53d1\u73b0\u5f88\u591a\u4ee3\u7801\u95ee\u9898\uff0c\u8fd9\u4e9b\u95ee\u9898\u5e76\u4e0d\u4f1a\u5728\u8fd0\u884c\u65f6\u62a5\u9519\uff0c\u56e0\u4e3a\u4ece Python \u8bed\u8a00\u89d2\u5ea6\u5e76\u4e0d\u5173\u5fc3\u8fd9\u4e9b\u95ee\u9898\uff0c\u5728 Pycharm \u7f16\u8f91\u5668\u91cc\u9762\u4f7f\u7528\u5feb\u6377\u952e ctrl + alt + L\uff0c\u6709\u4e00\u70b9\u70b9\u683c\u5f0f\u5316\u7684\u6548\u679c\uff0c\u80fd\u89e3\u51b3\u4e00\u4e9b\u7a7a\u683c\u3001\u6362\u884c\u7b49\u5c0f\u95ee\u9898\u3002 \u8fd9\u91cc\u63a8\u8350\u4e00\u4e2a Python \u793e\u533a\u6d41\u884c\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff1a Black\uff0c\u53f7\u79f0\u4e0d\u59a5\u534f\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff0c\u5b83\u68c0\u6d4b\u5230\u4e0d\u7b26\u5408\u89c4\u8303\u7684\u4ee3\u7801\u98ce\u683c\u76f4\u63a5\u5c31\u5e2e\u4f60\u5168\u90e8\u683c\u5f0f\u5316\u597d\uff0c\u5c31\u662f\u8fd9\u4e48\u521a\uff01 \u5b89\u88c5\uff1a sudo pip3 install black \n \u4f7f\u7528\u65b9\u6cd5\uff1a black ${CheckPath}\n \u4f7f\u7528\u8fd9\u4e2a\u5de5\u5177\u683c\u5f0f\u5316\u4e4b\u540e\uff0c\u4ee3\u7801\u4f1a\u88ab\u81ea\u52a8\u8c03\u6574\uff0c\u521a\u5f00\u59cb\u4f60\u53ef\u80fd\u4f1a\u89c9\u5f97\u8c03\u6574\u5f97\u5f88\u5938\u5f20\uff0c\u6ca1\u5173\u7cfb\u575a\u6301\u770b\uff0c\u4e60\u60ef\u4e4b\u540e\uff0c\u4f60\u4f1a\u89c9\u5f97\u5f88\u4f18\u96c5\uff0c\u6ca1\u9519\uff0c\u8fd9\u5c31\u662f Pythonic Code \u7684\u6838\u5fc3\uff0c\u8bf7\u4fdd\u6301\u4f18\u96c5\uff5e\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_8","title":"2. \u4ee3\u7801\u626b\u63cf\u5de5\u5177","text":"\u4f7f\u7528\u6839\u76ee\u5f55\u4e0b pylint.sh \u626b\u63cf\u4ee3\u7801\uff0c\u5728 report \u76ee\u5f55\u4e0b\u67e5\u770b\u4ee3\u7801\u626b\u63cf\u62a5\u544a\uff0c\u5982\u679c\u6709\u4ee3\u7801\u95ee\u9898\u8bf7\u63d0\u524d\u89e3\u51b3\u4e4b\u540e\u518d\u63d0\u4ea4\u3002 \u6b64\u811a\u672c\u5df2\u7ecf\u4f7f\u7528 Python \u793e\u533a\u6700\u6d41\u884c\u7684\u4ee3\u7801\u626b\u63cf\u5de5\u5177 Pylint \u8fdb\u884c\u4ee3\u7801\u626b\u63cf\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a bash pylint.sh\n \u8fd0\u884c\u4e4b\u540e\u4f1a\u63d0\u793a\u4f60\u8981\u626b\u63cf\u7684\u76ee\u5f55\uff0c\u6bd4\u5982\u8f93\u5165 apps \uff0c\u5219\u4f1a\u626b\u63cf apps \u4e0b\u7684\u6240\u6709 Python \u4ee3\u7801\u3002 \u5728 setting/pylintrc.cfg \u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u76f8\u5173\u914d\u7f6e\uff0c\u626b\u63cf\u5b8c\u6210\u4e4b\u540e\u5728 report/pylints \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u626b\u63cf\u62a5\u544a\u3002 \u4ee3\u7801\u63d0\u4ea4\u9700\u901a\u8fc7 git review \u63d0\u4ea4\u5230 gerrit \uff0c\u4eba\u5de5 Code Review \u901a\u8fc7\u4e4b\u540e\u5408\u5165\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_11","title":"\u5341\u4e09\u3001\u63d0\u4ea4\u4ee3\u7801","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_9","title":"1. \u5b89\u88c5\u4f9d\u8d56","text":"sudo apt install git-review\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_9","title":"2. \u63d0\u4ea4\u6a21\u677f","text":"\u5728 ~ \u76ee\u5f55\u4e0b\u65b0\u5efa\u6587\u4ef6\uff0c\u5e76\u547d\u540d\u4e3a gitcommit_template \u5c06\u4ee5\u4e0b\u5185\u5bb9\u5199\u5165\u6587\u4ef6\u5f53\u4e2d\uff1a # commit type :fix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style(\u98ce\u683c\u4fee\u6539)\u3001refactor(\u91cd\u6784)\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test(\u6d4b\u8bd5) + \u7b80\u5355\u63cf\u8ff0. \u9ed8\u8ba4fix,\u6839\u636e\u60c5\u51b5\u4fee\u6539\nfix: \n\n# \u8be6\u7ec6\u8bf4\u660e\u4ee3\u7801\u7684\u6539\u52a8\uff0c\u5305\u542b\u4ee3\u7801\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u4ee5\u53ca\u4e3a\u4ec0\u4e48\u8fd9\u4e48\u505a\uff0c\u53ef\u80fd\u4f1a\u5f71\u54cd\u54ea\u4e9b\u529f\u80fd\u3002\u5bf9\u4e8e\u4ee3\u7801\u7684\u5ba1\u6838\u8005\uff0c\u9700\u8981\u4ece\u8fd9\u6bb5\u63cf\u8ff0\u4e2d\u80fd\u5b8c\u5168\u7406\u89e3\u4ee3\u7801\u4e2d\u6240\u6709\u6539\u52a8\u7684\u5185\u5bb9\nDescription: \n\n# \u5199\u4e00\u6bb5\u9762\u5411\u4e8e\u4ea7\u54c1\u7684\u603b\u7ed3\u6027\u5185\u5bb9\uff0c\u7528\u4e8e\u81ea\u52a8\u751f\u6210crp\u4e0a\u7684changlog\uff0c\u9700\u8981\u6ce8\u610f\u7684\u4e8b\uff0c\u8fd9\u6bb5\u63cf\u8ff0\u5fc5\u987b\u4ece\u4ea7\u54c1\u7684\u89d2\u5ea6\u8003\u8651\u3002\nLog: \n\n# \u5173\u8054pms\u4e0a\u7684bug\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94bug\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4fee\u590dbug\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Bug: \n\n# \u4fee\u590d github issue \n#Issue: \n\n# \u5173\u8054pms\u4e0a\u7684\u4efb\u52a1\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94\u4efb\u52a1\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4efb\u52a1\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Task: \n \u547d\u4ee4\u884c\u6267\u884c: git config --global commit.template ~/gitcommit_template\n \u6b64\u547d\u4ee4\u5c06\u6a21\u677f\u52a0\u5165\u5230 git \u7684\u63d0\u4ea4\u6a21\u677f\u4e2d\u3002 \u540e\u7eed\u63d0\u4ea4\u7684\u65f6\u5019\u9700\u8981\u5173\u6ce8\u4e00\u4e0b\u51e0\u70b9\uff1a commit type \u5bf9\u5e94\u4e0d\u540c\u7684\u4fee\u6539\u7c7b\u578b\uff1afix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style \uff08\u98ce\u683c\u4fee\u6539\uff09\u3001refactor \uff08\u91cd\u6784\uff09\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test \uff08\u6d4b\u8bd5\uff09 commit type \u5192\u53f7\u540e\u9762\u52a0\u7a7a\u683c\u3002 Description \u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u9700\u8981\u8fdb\u884c\u8be6\u7ec6\u8bf4\u660e\uff0c\u6bd4\u5982\u5bf9\u529f\u80fd\u8fdb\u884c\u5927\u6539\u7b49\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_6","title":"3. \u63a8\u9001\u4ee3\u7801","text":"\u9996\u5148\u6dfb\u52a0 commit \u4fe1\u606f git add \u540e\u9762\u52a0\u6587\u4ef6\u540d\u79f0\n git add . # \u8868\u793a\u6dfb\u52a0\u6240\u6709\u6587\u4ef6\n \u4f7f\u7528\u8fd9\u6761\u547d\u4ee4\u6ce8\u610f\u6709\u4e9b\u4e34\u65f6\u6587\u4ef6\u4e0d\u8981\u63d0\u4ea4\u5230\u4ed3\u5e93\u4e86\u3002 git commit -a\n \u4e4b\u540e\u5728 fix: \u540e\u9762\uff08\u6ce8\u610f\u5192\u53f7\u540e\u9762\u5fc5\u987b\u52a0\u7a7a\u683c\uff0c\u4e0d\u7136\u76f4\u63a5-1\uff09\u5199\u672c\u5730\u63d0\u4ea4\u7684 commit \u4fe1\u606f\uff0c\u7136\u540e\u5c31\u53ef\u4ee5\u63d0\u4ea4\u4ee3\u7801\u4e86 git review branch(\u5f53\u524d\u5206\u652f) -r origin\n \u6700\u597d\u4e00\u6b21 commit\uff0c\u4e00\u6b21 git review \uff0c\u7ecf\u5e38\u6709\u540c\u5b66\u5728\u672c\u5730\u75af\u72c2 commit \u6700\u540e git review \u62a5\u9519\u4e0d\u77e5\u9053\u548b\u56de\u4e8b\u513f\u3002 \u82e5\u4e0d\u60f3\u6bcf\u6b21\u63d0\u4ea4\u90fd\u52a0\u4e0a -r \u9009\u9879\uff0c\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a git config --global gitreview.remote origin \u63d0\u4ea4\u4ee3\u7801\uff0c\u76f4\u63a5\u4f7f\u7528 git review branch<\u76ee\u6807\u5206\u652f>\uff0c\u4f8b\u5982 git review master"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git","title":"4. Git\u6807\u7b7e","text":"Git \u6807\u7b7e\u5b9e\u9645\u4e0a\u662f commit \u7684\u4e00\u4e2a\u522b\u540d\uff0c\u4e3b\u8981\u7528\u4e8e\u7ba1\u7406\u5386\u53f2\u7248\u672c\u3002 \u60f3\u8c61\u4e00\u4e0b\u9886\u5bfc\u8ba9\u4f60\u628a\u4e4b\u524d\u7684\u67d0\u4e2a\u7248\u672c\u7684\u4ee3\u7801\u62c9\u51fa\u6765\u8dd1\uff0c\u4f60\u662f\u4e0d\u662f\u4e56\u4e56\u7684\u53bb\u628a\u6240\u6709\u63d0\u4ea4\u8bb0\u5f55\u62c9\u51fa\u6765\u627e\uff0c\u7136\u540e\u627e\u5230\u90a3\u4e2a\u54c8\u5e0c\u503c\uff0c\u901a\u8fc7\u54c8\u5e0c\u503c\u6765\u68c0\u51fa\u4ee3\u7801\u3002 \u8fd9\u4e00\u5957\u64cd\u4f5c\u4e0b\u6765\u662f\u4e0d\u662f\u5f88\u9ebb\u70e6\uff0c\u8d39\u65f6\u95f4\u8fd8\u4e0d\u4e00\u5b9a\u80fd\u627e\u5f97\u5230\uff0c\u6ca1\u4eba\u80fd\u8bb0\u4f4f\u6bcf\u4e2a\u63d0\u4ea4\u54c8\u5e0c\u503c\u4ee5\u53ca\u8fd9\u6b21\u63d0\u4ea4\u90fd\u6539\u4e86\u54ea\u4e9b\u4ee3\u7801\u3002 \u56e0\u6b64\u7ed9\u63d0\u4ea4\u6253\u4e2a\u6807\u7b7e\uff0c\u5c31\u662f\u628a\u54c8\u5e0c\u503c\u8f6c\u6362\u6210\u4eba\u7c7b\u80fd\u7406\u89e3\u7684\u8bed\u8a00\uff0c\u6bd4\u5982 v1.0\uff0c\u5c31\u53ef\u4ee5\u76f4\u63a5\u901a\u8fc7\u6807\u7b7e\u627e\u5230\u5bf9\u5e94\u7684\u63d0\u4ea4\u3002 \u65b0\u5efa\u6807\u7b7e git tag -a <tagname>\n \u56de\u8f66\u4e4b\u540e\uff0cGit \u4f1a\u6253\u5f00\u4f60\u7684\u7f16\u8f91\u5668\uff0c\u8ba9\u4f60\u5199\u4e00\u53e5\u6807\u7b7e\u6ce8\u89e3\uff0c\u5c31\u50cf\u4f60\u7ed9\u63d0\u4ea4\u5199\u6ce8\u89e3\u4e00\u6837\u3002 \u67e5\u770b\u6240\u6709\u6807\u7b7e git tag -l\n# git tag \u4e5f\u884c\n \u5220\u9664\u6807\u7b7e git tag -d <tagname>\n \u63a8\u9001\u6807\u7b7e\u81f3\u8fdc\u7a0b git push \u547d\u4ee4\u5e76\u4e0d\u4f1a\u4f20\u9001\u6807\u7b7e\u5230\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\uff0c\u5fc5\u987b\u663e\u5f0f\u5730\u63a8\u9001\u6807\u7b7e\u3002 git push origin <tagname>\n \u63a8\u9001\u6240\u6709\u4e0d\u5728\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\u7684\u6807\u7b7e git push origin --tag\n \u5220\u9664\u8fdc\u7a0b\u6807\u7b7e git push origin :refs/tag/<tagname>\n \u540e\u671f\u6253\u6807\u7b7e \u5148\u7528 git log --pretty=oneline \u67e5\u8be2\u63d0\u4ea4\u8bb0\u5f55\uff0c\u83b7\u53d6\u6821\u9a8c\u7801\u3002 git tag -a <tagname> 9fceb02(\u6821\u9a8c\u7801)\n \u68c0\u51fa\u6807\u7b7e git checkout <tagname>\n \u6b64\u65f6\uff0c\u4ed3\u5e93\u4f1a\u5904\u4e8e\u201c\u5206\u79bb\u5934\u6307\u9488\uff08detached HEAD\uff09\u201d\u7684\u72b6\u6001\u3002 \u5728\u201c\u5206\u79bb\u5934\u6307\u9488\u201d\u72b6\u6001\u4e0b\uff0c\u5982\u679c\u4f60\u505a\u4e86\u67d0\u4e9b\u66f4\u6539\u7136\u540e\u63d0\u4ea4\u5b83\u4eec\uff0c\u6807\u7b7e\u4e0d\u4f1a\u53d1\u751f\u53d8\u5316\uff0c \u4f46\u4f60\u7684\u65b0\u63d0\u4ea4\u5c06\u4e0d\u5c5e\u4e8e\u4efb\u4f55\u5206\u652f\uff0c\u5e76\u4e14\u5c06\u65e0\u6cd5\u8bbf\u95ee\uff0c\u9664\u975e\u901a\u8fc7\u786e\u5207\u7684\u63d0\u4ea4\u54c8\u5e0c\u624d\u80fd\u8bbf\u95ee\u3002 \u56e0\u6b64\uff0c\u5982\u679c\u4f60\u9700\u8981\u8fdb\u884c\u66f4\u6539\uff0c\u6bd4\u5982\u4f60\u8981\u4fee\u590d\u65e7\u7248\u672c\u4e2d\u7684\u9519\u8bef\uff0c\u90a3\u4e48\u901a\u5e38\u9700\u8981\u521b\u5efa\u4e00\u4e2a\u65b0\u5206\u652f\uff1a git checkout -b <NewBranchName> <tagname>\n \u65b0\u5206\u652f\u4e0a\u53ef\u4ee5\u8fdb\u884c\u63d0\u4ea4\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_12","title":"\u5341\u56db\u3001\u5e38\u89c1\u95ee\u9898","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_10","title":"1. \u63d0\u4ea4\u4ee3\u7801\u65f6\u63d0\u793a\u90ae\u7bb1\u6216\u8005\u540d\u79f0\u4e0d\u5bf9","text":"\u91cd\u65b0\u914d\u7f6e\u90ae\u7bb1\u6216\u8005\u540d\u79f0\uff0c\u7136\u540e\u91cd\u7f6e\u751f\u6548\uff1a git commit --amend --reset-author\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_10","title":"2. \u600e\u4e48\u56de\u6eda\u5230\u4e4b\u524d\u7684\u7248\u672c","text":"(1)\u67e5\u8be2\u5386\u53f2\u63d0\u4ea4\u8bb0\u5f55 git log\n \u627e\u5230\u4f60\u8981\u56de\u6eda\u7684\u7248\u672c\uff0c\u590d\u5236 hash \u503c\u3002 \u6ce8\u610f\uff1a\u662f commit \u7a7a\u683c\u4e4b\u540e\u7684 hash \u503c\uff0c\u4e4b\u524d\u6709\u540c\u5b66\u590d\u5236\u7684 Change-Id: \u8fd9\u6837\u80af\u5b9a\u62a5\u9519\u3002 (2)\u56de\u6eda\u7248\u672c\uff0c\u4e0d\u6e05\u9664\u4ee3\u7801 git reset --soft ${hash}\n (3)\u56de\u6eda\u7248\u672c\uff0c\u6e05\u9664\u4ee3\u7801\uff0c\u614e\u7528\u54c8 git reset --hard ${hash}\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-f-s-e","title":"3. \u6d4b\u8bd5\u62a5\u544a\u91cc\u9762 F S . E \u662f\u4ec0\u4e48\u610f\u601d","text":"F \u8868\u793a\u5931\u8d25\uff0c. \uff08\u70b9\uff09\u8868\u793a\u901a\u8fc7\uff0cS \u8868\u793a\u8df3\u8fc7\uff0cE \u8868\u793a error \u6709\u62a5\u9519"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git-status","title":"4. \u89e3\u51b3 git status \u4e2d\u6587\u663e\u793a\u7684\u95ee\u9898","text":"git config --global core.quotePath false\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5-apps","title":"5. apps \u76ee\u5f55\u4e0b\u989c\u8272\u6709\u4e9b\u662f\u9ec4\u8272\u7684","text":"\u5728 Pycharm \u4e2d apps \u76ee\u5f55\u4e0b\u5e94\u7528\u5e93\u6587\u4ef6\u662f\u9ec4\u8272\u7684\uff0c\u7f16\u8f91\u5668\u8bc6\u522b\u4e0d\u5230\u4ee3\u7801\u65b0\u589e\u548c\u4fee\u6539\uff1b \u7531\u4e8e\u793e\u533a\u7248 Pycharm \u4e0d\u80fd\u52a8\u6001\u8bc6\u522b\u591a\u4ed3\u5e93\uff0c\u9700\u8981\u5728 setting \u91cc\u9762\u624b\u52a8\u6ce8\u518c\uff0c\u64cd\u4f5c\u6b65\u9aa4\uff1a File \u2014> Settings \u2014> Version Control \u2014> \u70b9 + \u53f7 \u2014> Directory \u9009\u4e2d\u5e94\u7528\u5e93\u5de5\u7a0b\u76ee\u5f55 \u2014> VCS \u9009\u4e2d Git \u2014> Apply \u5982\u6b64\u5c31\u53ef\u4ee5\u4e86\u3002 \u4e13\u4e1a\u7248 Pycharm \u4e0d\u5b58\u5728\u8fd9\u4e2a\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#6-envsh-r","title":"6. \u6267\u884c env.sh \u62a5\u9519 $'\\r':\u672a\u627e\u5230\u547d\u4ee4","text":"\u51fa\u73b0\u8fd9\u4e2a\u95ee\u9898\u4f60\u5e94\u8be5\u662f\u5728 windows \u4e0a\u6253\u5f00\u6216\u7f16\u8f91\u8fc7 env.sh \u811a\u672c\uff0cwindows\u4e0b\u7684\u6362\u884c\u662f\u56de\u8f66\u7b26+\u6362\u884c\u7b26\uff0c\u4e5f\u5c31\u662f\\r\\n\uff0c\u800c Linxu \u4e0b\u662f\u6362\u884c\u7b26 \\n\uff0cLinux \u4e0b\u4e0d\u8bc6\u522b \\r\uff0c\u56e0\u6b64\u62a5\u9519\u3002 \u89e3\u51b3\u65b9\u6848\uff1a # \u5c06 \\r \u66ff\u6362\u4e3a\u7a7a\nsudo sed -i 's/\\r//' env.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#7","title":"7.\u600e\u6837\u4e3a\u5355\u72ec\u67d0\u4e00\u6761\u7528\u4f8b\u914d\u7f6e\u6267\u884c\u8d85\u65f6\u65f6\u95f4","text":"\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u5982\u4e0b\uff1a @pytest.mark.timeout(300) # \u5355\u4f4d\u79d2\ndef test_xxx_001():\npass\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#8-youqu","title":"8. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u6240\u6709\u4ee3\u7801\uff0c\u5305\u542b\u5b50\u4ed3\u5e93","text":"\u524d\u7f6e\u6761\u4ef6\uff1a\u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 # \u7b2c\u4e00\u6b21\u5b58\u50a8\u5bc6\u7801\uff0c\u63d0\u4f9b\u540e\u9762\u62c9\u4ee3\u7801(gerrit: ldap\u8d26\u53f7\u548c\u5bc6\u7801\uff0cgit\u62c9\u53d6\u7b2c\u4e00\u6b21\u8f93\u5165\u4fdd\u5b58\uff0c\u540e\u9762\u76f4\u63a5\u4f7f\u7528)\ngit config --global credential.helper store\n\n# \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\uff0c\u5e76\u9012\u5f52\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\" --recursive\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#9-youqu","title":"9. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\u6307\u5b9a\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u524d\u7f6e\u6761\u4ef6\uff1a \u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 \u5df2\u5b58\u50a8\u8bbf\u95ee\u5bc6\u7801 # \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\"\n# \u6307\u5b9a\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ncd youqu\ngit submodule update --init apps/autotest_xxx_xxx\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#10-youqu","title":"10. \u5982\u4f55\u66f4\u65b0 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\uff0c\u6240\u6709\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u66f4\u65b0\u6240\u6709\u5b50\u4ed3\u5e93\u4ee3\u7801 cd youqu\ngit pull & git submodule foreach git pull\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#11-youqu-master-detached-head","title":"11. \u5982\u4f55\u4fee\u590d YouQu \u6240\u6709\u5b50\u4ed3\u5e93 master \u5206\u652f\u6e38\u79bb\u5934\uff08detached head\uff09","text":"\u4fee\u590d\u6240\u6709\u5b50\u4ed3\u5e93\u9ed8\u8ba4master \u5206\u652f\u6e38\u79bb\u5934 cd youqu\ngit submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/","title":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212 \u5206\u7c7b\uff1a/ \u67b6\u6784\u5e08\uff1a/ \u76ee\u6807\uff1a \u5e94\u7528 AT \u67b6\u6784\u5de5\u7a0b\u5316\uff0c\u53c2\u8003\u6027\u80fd\u81ea\u52a8\u5316\u5de5\u7a0b\u5b8c\u6210\u5de5\u7a0b\u5316\u6539\u9020\u3002 \u5e94\u7528\u95f4\u7528\u4f8b\u89e3\u8026\uff0c\u89e3\u9664\u6240\u6709\u4ea4\u53c9\u8c03\u7528\u7684\u65b9\u6cd5\uff0c\u5404\u5e94\u7528\u80fd\u8ddf\u968f\u81ea\u8eab\u8fed\u4ee3\u5468\u671f\u72ec\u7acb\u7ef4\u62a4 AT \u7528\u4f8b\u3002 \u5b8c\u6210\u516c\u5171\u65b9\u6cd5\u7684\u62bd\u53d6\u6574\u5408\uff0c\u5f62\u6210\u4e00\u5957\u72ec\u7acb\u4e8e\u5e94\u7528\u95f4\u7684\u516c\u5171\u65b9\u6cd5\u5e93\uff0c\u5404\u5e94\u7528\u65b9\u6cd5\u91cc\u9762\u4e0d\u5b58\u5728\u88ab\u591a\u4e2a\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\u3002 \u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u4e3a\u5c06\u6765\u9002\u914d\u66f4\u591a\u7684 AT \u8fd0\u7528\u573a\u666f\u63d0\u4f9b\u652f\u6491\uff0c\u539f\u5219\u4e0a\u53ef\u5b9e\u73b0\u65e0\u9650\u6269\u5c55\uff0c\u5728\u6bcf\u65e5\u6784\u5efa\u548c\u6301\u7eed\u96c6\u6210\u6d41\u7a0b\u843d\u5730\u4f7f\u7528\u3002 \u4ee3\u7801\u89c4\u8303\u95ee\u9898\u6e05\u96f6\uff0c\u7b26\u5408 Shell Check\u3001Pylint\u3001\u7cfb\u7edf\u90e8\u76f8\u5173\u7f16\u7801\u89c4\u8303\u8981\u6c42\u3002 \u610f\u4e49\uff1a \u7edf\u4e00\u6210\u7814 AT \u67b6\u6784\u8bbe\u8ba1\u601d\u8def\uff0c\u6d88\u9664 AT \u4ee3\u7801\u5b9e\u73b0\u548c\u7ef4\u62a4\u4e0a\u53ef\u80fd\u51fa\u73b0\u7684\u5206\u6b67\uff0c\u6539\u5584\u5386\u53f2 AT \u65e0\u5de5\u7a0b\u5316\u8bbe\u8ba1\u7684\u7f3a\u9677\uff0c\u63d0\u9ad8\u67b6\u6784\u4e13\u4e1a\u6027\u3002 \u5404\u5e94\u7528 AT \u4ee3\u7801\u76f8\u4e92\u72ec\u7acb\uff0c\u5951\u5408\u5e94\u7528\u72ec\u7acb\u53d1\u5e03\u7279\u6027\uff0c\u53ef\u652f\u6301\u8fed\u4ee3\u671f\u95f4\u72ec\u7acb\u65b0\u589e\u3001\u7ef4\u62a4\u548c\u6267\u884c\u3002 \u65b9\u6cd5\u8c03\u7528\u903b\u8f91\u5f97\u5230\u7b80\u5316\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u66f4\u9ad8\u6548\uff1b\u516c\u5171\u5e93\u62bd\u53d6\uff0c\u51cf\u5c11\u65b9\u6cd5\u91cd\u590d\u7f16\u5199\uff0c\u63d0\u9ad8\u4ee3\u7801\u5229\u7528\u7387\uff1b\u5e73\u5747\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u4ece40\u5206\u949f\u964d\u4f4e\u81f330\u5206\u949f\uff0c\u65e5\u4ea7\u51fa\u7528\u4f8b\u4ece12\u6761/\u5929\u63d0\u5347\u81f316\u6761/\u5929\u3002 \u53ef\u7075\u6d3b\u652f\u6491\u4e0d\u540c\u7684\u81ea\u52a8\u5316\u8fd0\u7528\u573a\u666f\uff0c\u5982 CI\u3001\u5192\u70df\u6d4b\u8bd5\u3001\u96c6\u6210\u6d4b\u8bd5\u3001\u56de\u5f52\u6d4b\u8bd5\u3001\u4e13\u9879\u6d4b\u8bd5\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_2","title":"\u4e00\u3001\u80cc\u666f\u4ecb\u7ecd","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1","title":"1\u3001\u73b0\u6709\u67b6\u6784\u4ecb\u7ecd","text":"\u73b0\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u6574\u4f53\u5206\u4e3a\u4e09\u5c42\uff1a\u7528\u4f8b\u5c42\uff08\u4e1a\u52a1\u903b\u8f91\u5c42\uff09\u3001\u4e2d\u95f4\u5c42\uff08\u5143\u7d20\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff09\u3001\u6838\u5fc3\u5c42\uff08\u5e95\u5c42\u529f\u80fd\u5e93\u5c42\uff09\u3002 \u7528\u4f8b\u5c42\uff1a\u5373\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4e13\u6ce8\u4e8e\u4e1a\u52a1\u529f\u80fd\u903b\u8f91\uff0c\u4e0d\u5173\u5fc3\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\uff1b \u4e2d\u95f4\u5c42\uff1a\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff0c\u6bcf\u4e2a\u65b9\u6cd5\u5747\u5bf9\u5e94\u4e00\u4e2a\u5143\u7d20\u7684\u4e00\u4e2a\u5177\u4f53\u64cd\u4f5c\uff0c\u4e5f\u53ef\u4ee5\u662f\u591a\u4e2a\u64cd\u4f5c\u7684\u7ec4\u5408\u64cd\u4f5c\uff0c\u4e2d\u95f4\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u7528\u4f8b\u5c42\uff0c\u5177\u6709\u53ef\u6269\u5c55\u6027\u548c\u590d\u7528\u6027\uff1b \u6838\u5fc3\u5c42\uff1a\u4e3b\u8981\u5c01\u88c5\u7684\u5e95\u5c42\u529f\u80fd\u5b9e\u73b0\uff0c\u6b64\u5c42\u5728\u6846\u67b6\u4e2d\u63d0\u4f9b\u4e00\u4e9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u529f\u80fd\u6a21\u5757\u76f8\u5bf9\u72ec\u7acb\uff0c\u6838\u5fc3\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u64cd\u4f5c\u5c42\uff0c\u6bd4\u5982\uff1a\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7 UI \u5750\u6807\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u952e\u9f20\u64cd\u4f5c\u7684\u57fa\u7840\u65b9\u64cd\u4f5c\u6a21\u5757\u3001Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757\u3001\u6587\u4ef6\u7684\u589e\u5220\u6539\u67e5\u64cd\u4f5c\u6a21\u5757\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2","title":"2\u3001\u81ea\u52a8\u5316\u7684\u5e94\u7528","text":"2.1\u3001CI \u6d41\u7a0b \u6bcf\u65e5\u6784\u5efa\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u7814\u53d1\u6bcf\u65e5\u63d0\u4ea4\u7684\u4ee3\u7801\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u73ed\u4e4b\u540e\u4f1a\u5c06\u5404\u5e94\u7528\u8fdb\u884c\u6253\u5305\uff0c\u7136\u540e\u5728\u6d4b\u8bd5\u673a\u4e0a\u5b89\u88c5\u66f4\u65b0 deb \u5305\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u5e94\u7528\u63d0\u4ea4\u96c6\u6210\u7684\u7248\u672c\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u8f7d\u6700\u65b0\u7684 ISO \u8fdb\u884c PXE \u90e8\u7f72\uff0c\u7136\u540e\u6d4b\u8bd5\u673a\u5b89\u88c5\u6700\u65b0\u7684\u955c\u50cf\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 2.2\u3001\u9a8c\u6536\u6d4b\u8bd5 \u5728\u5404\u9a8c\u6536\u8282\u70b9\u8fdb\u884c\u81ea\u52a8\u5316\u9a8c\u6536\uff0c\u76ee\u524d\u7684\u7b56\u7565\u662f\u5168\u7528\u4f8b\u8986\u76d6\u5168\u67b6\u6784\u3002 2.3\u3001\u56de\u5f52\u6d4b\u8bd5 \u56de\u5f52\u6d4b\u8bd5\u4eca\u5e74\u89c4\u5212\u5efa\u8bbe\u4e2d\uff0c\u65e8\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u6267\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\uff0c\u51cf\u5c11\u529f\u80fd\u6d4b\u8bd5\u7684\u91cd\u590d\u52b3\u52a8\u529b\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3","title":"3\u3001\u5b58\u5728\u7684\u95ee\u9898","text":" \u5404\u5e94\u7528\u4e4b\u95f4\u5b58\u5728\u8026\u5408 \u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u521d\u671f\uff0c\u6240\u6709\u5e94\u7528\u662f\u6574\u4f53\u53d1\u5e03\uff0c\u6211\u4eec\u662f\u5c06\u6240\u6709\u5e94\u7528\u770b\u6210\u662f\u4e00\u4e2a\u6574\u4f53\uff0c\u5404\u5e94\u7528\u4f5c\u4e3a\u5176\u4e2d\u7684\u4e00\u4e2a\u6a21\u5757\uff0c\u6240\u4ee5\u5b58\u5728\u5e94\u7528\u95f4\u65b9\u6cd5\u4ea4\u53c9\u8c03\u7528\u7684\u95ee\u9898\uff0c\u8fd9\u6837\u4ece\u6700\u521d\u7684\u8bbe\u8ba1\u6765\u8bb2\u786e\u5b9e\u80fd\u591f\u51cf\u5c11\u91cd\u590d\u4ee3\u7801\u7684\u7f16\u5199\u3002\u4f46\u662f\u73b0\u5728\u5e94\u7528\u8d70\u72ec\u7acb\u53d1\u5e03\uff0c\u5404\u5e94\u7528\u90fd\u6709\u81ea\u5df1\u7684\u8fed\u4ee3\u8282\u594f\uff0c\u5728\u65b0\u9700\u6c42\u5feb\u901f\u53d8\u5316\u7684\u8fc7\u7a0b\u4e2d\uff0c\u81ea\u52a8\u5316\u7ef4\u62a4\u53d8\u5f97\u5f02\u5e38\u56f0\u96be\uff0c\u539f\u56e0\u5c31\u662f\u81ea\u52a8\u5316\u9879\u76ee\u91cc\u9762\u5404\u4e2a\u5e94\u7528\u7684\u6709\u6bd4\u8f83\u591a\u7684\u8026\u5408\u5173\u7cfb\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u8fdb\u884c\u89e3\u8026\uff0c\u4ee5\u9002\u5e94\u5e94\u7528\u4e0d\u540c\u7684\u8fed\u4ee3\u5468\u671f\u3002 \u65e0\u6cd5\u7cbe\u51c6\u7684\u5212\u5206\u7528\u4f8b\u8303\u56f4 \u7528\u4f8b\u6267\u884c\u7684\u8303\u56f4\u4e0d\u591f\u7cbe\u51c6\uff0c\u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u4e3b\u8981\u901a\u8fc7\u7528\u4f8b\u7684\u5173\u952e\u8bcd core\uff08\u6838\u5fc3\uff09\u6765\u533a\u5206\u7528\u4f8b\u662f\u5426\u4e3a\u6838\u5fc3\u7528\u4f8b\uff0c\u4f46\u662f\u8fd9\u6837\u7684\u533a\u5206\u592a\u5bbd\u6cdb\u4e86\uff0c\u4e0d\u80fd\u9002\u5e94\u81ea\u52a8\u5316\u6d4b\u8bd5\u5728\u591a\u573a\u666f\u4e0b\u7684\u5e94\u7528\u3002\u5f88\u591a\u573a\u666f\u4e0b\u6211\u4eec\u8fd8\u9700\u8981\u6839\u636e\u7528\u4f8b\u7684\u7b49\u7ea7\u3001\u7528\u4f8b\u7684\u7c7b\u578b\u3001\u7528\u4f8b\u6765\u6e90\u7b49\u7b49\uff0c\u4e0d\u540c\u7684\u7ef4\u5ea6\u6765\u6311\u9009\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u5173\u952e\u5b57\u9700\u8981\u4eba\u5de5\u4e00\u6761\u6761\u7684\u6539\uff0c\u8d39\u65f6\u8d39\u529b\uff0c\u800c\u4e14\u4e0d\u597d\u7ef4\u62a4\u3002 \u53d7\u65b0\u9700\u6c42\u5f71\u54cd\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u597d\u7ef4\u62a4 \u76ee\u524d\u9700\u8981\u8df3\u8fc7\u7684\u7528\u4f8b\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684\u7528\u4f8b\u811a\u672c\u91cc\u9762\uff0c\u6dfb\u52a0\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\uff0c\u540e\u7eed\u89e3\u9664\u8df3\u8fc7\u7684\u65f6\u5019\u53c8\u9700\u8981\u627e\u5230\u8fd9\u6761\u811a\u672c\uff0c\u5220\u6389\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\u3002\u5728\u8df3\u8fc7\u7528\u4f8b\u8f83\u591a\u7684\u60c5\u51b5\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u96be\u5ea6\u3002 \u7f16\u5199\u7528\u4f8b\u65f6\u903b\u8f91\u6bd4\u8f83\u590d\u6742\uff0c\u9700\u8981\u8c03\u7528\u591a\u4e2a\u5e94\u7528\u7684\u65b9\u6cd5\u6a21\u5757\u3002 \u6846\u67b6\u6269\u5c55\u6027\u4e0d\u8db3\uff0c\u65e0\u6cd5\u6574\u5408\u6027\u80fd\u81ea\u52a8\u5316\u3001\u538b\u6d4b\u81ea\u52a8\u5316\u3001\u5b89\u5168\u81ea\u52a8\u5316\u7b49\u4e13\u9879\u6d4b\u8bd5\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_3","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u4e3a\u89e3\u51b3\u73b0\u6709\u95ee\u9898\uff0c\u9002\u5e94\u4e0d\u65ad\u4e30\u5bcc\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u66f4\u597d\u7684\u53d1\u6325\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4f5c\u7528\uff0c\u9700\u8981\u5bf9\u81ea\u52a8\u5316\u67b6\u6784\u53ca\u5404\u529f\u80fd\u6a21\u5757\u8fdb\u884c\u91cd\u65b0\u8bbe\u8ba1\u89c4\u5212\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_1","title":"1\u3001\u67b6\u6784\u8bbe\u8ba1","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_1","title":"2\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u6846\u67b6\u7684\u8fd0\u884c\u903b\u8f91\uff1a\u901a\u8fc7\u6838\u5fc3\u5c42\u63d0\u4f9b\u4e00\u4e2a\u57fa\u7840\u80fd\u529b\uff0c\u4e1a\u52a1\u5c42\u6839\u636e\u5b9e\u9645\u4e1a\u52a1\u9700\u6c42\uff08\u6d4b\u8bd5\u7528\u4f8b\uff09\u52a8\u6001\u52a0\u8f7d\u6838\u5fc3\u5c42\uff0c\u6267\u884c\u5165\u53e3\u52a0\u8f7d\u76f8\u5e94\u7684\u7528\u4f8b\u96c6\u5e76\u63a7\u5236\u6267\u884c\uff0c\u5e94\u7528\u5c42\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u9700\u6c42\uff0c\u901a\u8fc7\u76f8\u5e94\u7684\u914d\u7f6e\u9879\u8fdb\u884c\u914d\u7f6e\uff0c\u4ece\u800c\u89e6\u53d1\u81ea\u52a8\u5316\u6d4b\u8bd5\u4efb\u52a1\u3002 \u6838\u5fc3\u5c42\uff1a\u57fa\u672c\u4fdd\u6301\u4e0d\u53d8\uff0c\u90e8\u5206\u6a21\u5757\u4f1a\u6d89\u53ca\u5230\u65b0\u529f\u80fd\u5f00\u53d1\uff0c\u6838\u5fc3\u5c42\u5404\u529f\u80fd\u6a21\u5757\u4fdd\u6301\u72ec\u7acb\u6027\uff0c\u63d0\u4f9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u4f9b\u4e0a\u5c42\u8c03\u7528\uff1b \u5e95\u5c42\u6838\u5fc3\u6a21\u5757\u5305\u62ec\uff1a \u56fe\u50cf\u8bc6\u522b\u6a21\u5757 UI \u5b9a\u4f4d\u6a21\u5757 Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757 \u5c5e\u6027\u5b9a\u4f4d\u6a21\u5757 \u65e5\u5fd7\u6a21\u5757 \u952e\u9f20\u64cd\u4f5c\u6a21\u5757 \u6587\u4ef6\u64cd\u4f5c\u6a21\u5757 \u5f55\u5c4f\u6a21\u5757 \u81ea\u5b9a\u4e49\u65ad\u8a00\u6a21\u5757 \u7528\u4f8b\u6267\u884c\u6a21\u5757 PXE \u88c5\u673a\u6a21\u5757 \u952e\u9f20\u4fe1\u53f7\u6a21\u62df\u6a21\u5757 OCR \u6a21\u5757 \u4e1a\u52a1\u5c42\uff1a\u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e94\u7528\u5185\u5305\u542b\u591a\u4e2a\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5982\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7b49\uff0c\u540e\u7eed\u53ef\u4ee5\u6839\u636e\u9700\u8981\u5ac1\u63a5\u8fdb\u6765\u3002\u5176\u4e2d\u529f\u80fd\u6d4b\u8bd5\u8bbe\u8ba1\u601d\u8def\uff1a \u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e76\u5c06\u6d4b\u8bd5\u6570\u636e\u548c\u6d4b\u8bd5\u8d44\u6e90\u6574\u5408\u8fdb\u6765\uff0c\u589e\u52a0\u7528\u4f8b\u6807\u7b7e csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ed9\u6bcf\u6761\u7528\u4f8b\u6253\u6807\u7b7e\u3002 \u5404\u6807\u7b7e\u6240\u4f7f\u7528\u5bf9\u5e94\u7684\u5b57\u6bb5\u540d\u79f0\uff0c\u4f7f\u7528 csv \u6587\u4ef6\u7ef4\u62a4\u7528\u4f8b\u4e0e\u6807\u7b7e\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u5bf9\u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u53ef\u4ee5\u7ec4\u5408\u5176\u4e2d\u7684\u6807\u7b7e\u800c\u4ece\u9a71\u52a8\u5bf9\u5e94\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\uff0c\u517c\u5bb9\u73b0\u6709\u7528\u4f8b\u6807\u7b7e\uff0c\u4e14\u652f\u6301\u7528\u4f8b\u6807\u7b7e\u53ef\u6269\u5c55\uff1b \u4f7f\u7528 csv \u683c\u5f0f\u6587\u4ef6\u53ef\u4ee5\u65b9\u4fbf\u7684\u4f7f\u7528 Excel \u8868\u683c\u6253\u5f00\u8fdb\u884c\u7f16\u8f91\uff0c\u540c\u65f6\u7531\u4e8e csv \u6587\u4ef6\u5b9e\u9645\u662f\u4ee5\u90fd\u597d\u5206\u9694\u7684\u6587\u672c\u6587\u4ef6\uff0c\u4ee3\u7801\u4e2d\u53ef\u4ee5\u5728\u4e0d\u4f9d\u8d56\u4e09\u65b9\u5e93\u7684\u60c5\u51b5\u4e0b\u65b9\u4fbf\u5feb\u901f\u7684\u89e3\u6790\u5b83\uff0c\u53ef\u64cd\u4f5c\u6027\u548c\u53ef\u7ef4\u62a4\u6027\u8f83\u9ad8\u3002 \u5404\u4e2a\u5e94\u7528\u4e4b\u95f4\uff0c\u7528\u4f8b\u3001\u65b9\u6cd5\u3001\u6807\u7b7e\u548c\u8d44\u6e90\u90fd\u662f\u76f8\u4e92\u72ec\u7acb\u7684\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u7528\u4f8b\u65f6\u53ea\u9700\u8981\u81ea\u5df1\u5e94\u7528\u4e0b\u7684\u65b9\u6cd5\u548c\u516c\u5171\u5e93\u5373\u53ef\u3002 \u7ed3\u6784\u4e3e\u4f8b\uff1a .\n\u251c\u2500\u2500 apps\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_album # \u5e94\u7528\u540d (\u7528\u4e0b\u5212\u7ebf\u8fde\u63a5\u662f Python \u7f16\u7801\u89c4\u8303)\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_assert # \u65ad\u8a00\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_function_tag.csv # \u7528\u4f8b\u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 asan_cases # \u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases # \u529f\u80fd\u6d4b\u8bd5\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 res # \u6d4b\u8bd5\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config # \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_widget # \u5e94\u7528\u81ea\u5df1\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_widget # \u65b9\u6cd5\u57fa\u7c7b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 other_widget # \u8c03\u7528\u5176\u4ed6\u5e94\u7528\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_camera\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases\n\u2502\u00a0\u00a0 \u2502\u00a0 ...\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 public_widget # \u516c\u5171\u65b9\u6cd5\u5e93\n\u251c\u2500\u2500 config # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n...\n config \u914d\u7f6e\u6a21\u5757\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u76f8\u5e94\u914d\u7f6e\uff0c\u6d4b\u8bd5\u540c\u5b66\u53ef\u4ee5\u6839\u636e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5728 config \u91cc\u9762\u8fdb\u884c\u914d\u7f6e\u3002 \u5168\u5c40\u914d\u7f6e\uff1a \u6267\u884c\u4e00\u4e2a\u6216\u591a\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff1a\u5728 pattern \u91cc\u9762\u5199\u5165\u5e94\u7528\u5305\u540d\uff0c\u591a\u4e2a\u5e94\u7528\u4e4b\u95f4\u7528 or \u8fde\u63a5\uff0c\u5982 deepin-music or deepin-movie\uff1b \u5192\u70df\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a smoke\uff1b \u96c6\u6210\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a core \uff1b \u5168\u91cf\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u4e3a\u7a7a\u5373\u53ef\uff1b \u901a\u8fc7 tags \u7684\u914d\u7f6e\u6bd4\u8f83\u7075\u6d3b\uff0c\u540e\u9762\u6807\u7b7e\u5316\u7ba1\u7406\u7ae0\u8282\u4f1a\u8bb2\u5230\uff0c\u652f\u6301\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u7075\u6d3b\u914d\u7f6e\u3002 \u6307\u5b9a\u67d0\u53f0\u673a\u5668\u5728\u6307\u5b9a\u955c\u50cf\u7248\u672c\u4e0a\u6267\u884c\u7528\u4f8b\uff1a\u5728 IP \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a IP\uff0c\u5e76\u5728 URL \u91cc\u9762\u586b\u5165\u955c\u50cf\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u6846\u67b6\u4f1a\u8c03\u7528 PXE \u8fdb\u884c\u81ea\u52a8\u88c5\u673a\uff0c\u88c5\u673a\u5b8c\u4e4b\u540e\u81ea\u52a8\u5f00\u59cb\u6267\u884c\u914d\u7f6e\u7684\u6d4b\u8bd5\u7528\u4f8b\u3002 \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\uff1a \u6bcf\u4e2a\u5e94\u7528\u5185\u90e8\u4f1a\u6709\u4e00\u4e2a\u5355\u72ec\u7684\u914d\u7f6e\u6a21\u5757\uff0c\u4f1a\u5305\u542b\u4e00\u4e9b\u672c\u5e94\u7528\u7684\u6d4b\u8bd5\u8d44\u6e90\u7684\u8def\u5f84\u3001\u6267\u884c\u7528\u4f8b\u7684\u6807\u7b7e\u914d\u7f6e\u7b49\u7b49\uff0c\u5982\u679c\u5728\u5c40\u90e8\u914d\u7f6e\u91cc\u9762\u914d\u7f6e\u4e86\u7528\u4f8b\u6267\u884c\u6807\u7b7e\uff0c\u800c\u5916\u5c42 runner \u51fa\u6ca1\u6709\u6307\u5b9a\u6267\u884c\u6807\u7b7e\uff0c\u5219\u5728\u6267\u884c\u65f6\u53ea\u4f1a\u6267\u884c\u5c40\u90e8\u914d\u7f6e\u5df2\u914d\u7f6e\u7684\uff0c\u82e5\u5916\u5c42 runner \u4e5f\u914d\u7f6e\u4e86\u6267\u884c\u6807\u7b7e\uff0c\u5219\u4f1a\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u7528\u4f8b\u3002 \u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u914d\u7f6e\u90fd\u5728\u540c\u4e00\u4e2a\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\uff0cpy \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684\u7c7b\uff0cini \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684 option\u3002 \u5168\u5c40\u914d\u7f6e\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u7b56\u7565\u5982\u4e0b\uff1a \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5c40\u90e8\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5e94\u7528\u5c42\uff1arunner \u662f\u6d4b\u8bd5\u6267\u884c\u7684\u5165\u53e3\uff0c\u5b83\u4f1a\u6839\u636e\u914d\u7f6e\u91cc\u9762\u7684\u914d\u7f6e\u9879\uff0c\u8fdb\u884c\u7528\u4f8b\u7684\u52a0\u8f7d\u548c\u6267\u884c\u3002\u5b83\u63d0\u4f9b\u63a5\u53e3\u7ed9\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\uff0c\u5e73\u53f0\u4e0a\u7684\u6307\u4ee4\u5b9e\u9645\u4e0a\u90fd\u662f\u901a\u8fc7\u4e0b\u53d1\u7ed9 runner\uff0c\u7136\u540e\u7531 runner \u6765\u6267\u884c\u76f8\u5e94\u7684\u6d4b\u8bd5\u3002 \u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u662f\u4e00\u4e2a\u524d\u7aef\u7cfb\u7edf\uff0c\u53ef\u4ee5\u8fdb\u884c\u6d4b\u8bd5\u673a\u7ba1\u7406\u3001\u81ea\u52a8\u5b89\u88c5\u955c\u50cf\u3001\u81ea\u52a8\u5b89\u88c5\u6307\u5b9a\u5e94\u7528\u7248\u672c\u3001\u8fdb\u884c\u6d4b\u8bd5\u7528\u4f8b\u8303\u56f4\u9009\u62e9\u3001\u7528\u4f8b\u89e6\u53d1\u6267\u884c\u63a7\u5236\u3001\u7ed3\u679c\u5c55\u793a\u8f93\u51fa\u7b49\u3002 \u4e00\u4e2a\u5e94\u7528\u7684\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\u90fd\u53ef\u4ee5\u5355\u72ec\u89e6\u53d1\u3002 \u517c\u5bb9\u6027\u6d4b\u8bd5\u4e3b\u8981\u901a\u8fc7 PXE \u670d\u52a1\u5668\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u88c5\u673a\uff0c\u7136\u540e\u914d\u5408 AT \u8fdb\u884c\u6d4b\u8bd5\uff0c\u53ef\u4ee5\u5b9e\u73b0\u4e0d\u540c\u7cfb\u7edf\u7248\u672c\u3001\u4e0d\u540c\u5e94\u7528\u7248\u672c\u73af\u5883\u4e0a\u90fd\u53ef\u4ee5\u8fdb\u884c\u81ea\u52a8\u5316\u7684 AT \u6267\u884c\uff0c\u63d0\u9ad8\u517c\u5bb9\u6027\u6d4b\u8bd5\u6548\u7387\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_4","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_2","title":"1\u3001\u7528\u4f8b\u89e3\u8026","text":"\u5b58\u5728\u8026\u5408\u5173\u7cfb\u7684\u65b9\u6cd5\uff1a\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u88ab\u5916\u90e8\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\uff0c\u5219\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u8026\u5408\u5173\u7cfb\u3002 1.1\u3001\u901a\u8fc7\u7f16\u8f91\u5668 Find Usages \u67e5\u770b\u6bcf\u4e2a\u65b9\u6cd5\u88ab\u8c03\u7528\u7684\u8def\u5f84\u548c\u88ab\u8c03\u7528\u6b21\u6570\uff1b 1.2\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 1 \u4e2a\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728\u5916\u90e8\u5e94\u7528\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1b 1.3\u3001\u64cd\u4f5c\u5c42\u6587\u4ef6\u540d\u5747\u4ee5 widget \u7ed3\u5c3e\uff0c\u7c7b\u540d\u4ee5 Widget \u7ed3\u5c3e\uff0c\u5982\uff1a\u6587\u4ef6\u540d music_widget.py \uff1a class MusicWidget:\n\"\"\"\u97f3\u4e50\u7684\u64cd\u4f5c\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_2","title":"2\u3001\u516c\u5171\u5e93\u5efa\u8bbe","text":"2.1\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 2 \u4e2a\u53ca\u4ee5\u4e0a\u7684\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728 public_widget \u76ee\u5f55\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1bpublic_widget \u5373\u4e3a\u516c\u5171\u65b9\u6cd5\u5e93\uff1b 2.2\u3001\u5728\u7528\u4f8b\u5c42\u4fee\u6539\u7528\u4f8b\u4e2d\u7c7b\u7684\u5bfc\u5165\u8def\u5f84\uff0c\u5c5e\u4e8e\u516c\u5171\u65b9\u6cd5\u7684\u5219\u8c03\u7528 public_widget \u4e2d\u7684\u7c7b\uff0c\u5916\u90e8\u5e94\u7528\u7684\u64cd\u4f5c\u65b9\u6cd5\uff0c\u5219\u8c03\u7528\u672c\u5e94\u7528\u76ee\u5f55\u4e0b\u91cd\u5199\u7684\u5916\u90e8\u5e94\u7528\u65b9\u6cd5\u3002 \u6bd4\u5982\uff1a\u51e0\u4e4e\u6240\u6709\u591a\u5a92\u4f53\u5e94\u7528\u90fd\u9700\u8981\u901a\u8fc7\u6587\u7ba1\u52a0\u8f7d\u8d44\u6e90\uff0c\u8c03\u8d77\u7684\u6587\u7ba1\u5bf9\u8bdd\u6846\u5b9e\u9645\u4e3a dde-desktop\uff0c\u56e0\u6b64\u5c06 desktop_widget.py \u653e\u5230 public_widget \u91cc\u9762\uff1a class DdeDesktopPublicWidget:\n\"\"\"\u516c\u5171-\u684c\u9762\u7684\u64cd\u4f5c\u65b9\u6cd5\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3_1","title":"3\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406","text":"3.1\u3001\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1a\u5bf9\u5e94 core\u3001smoke\uff0c\u6216\u4e3a\u7a7a\uff1b \u7528\u4f8b\u6765\u6e90\uff1a\u5bf9\u5e94 PMS \u7528\u4f8b\u6765\u6e90\uff0c\u5206\u522b\u7528 acp1\u3001acp2\u3001acp3\u3001acp4 \u8868\u793a\u3002 acp1 \uff1a\u4e1a\u52a1\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5199\u7684\u7528\u4f8b\uff0c\u88ab\u7528\u4e8e\u9a8c\u6536\u6d4b\u8bd5\u7684\uff1b acp2 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5f15\u5165\u7684\u4ea7\u54c1\u9a8c\u6536\u6d4b\u8bc4\u90e8\u7684\u7528\u4f8b\uff1b acp3 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u6839\u636e\u4ea7\u54c1\u9700\u6c42\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\uff1b acp4 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u901a\u8fc7\u793e\u533a\u3001\u8bba\u575b\u7528\u6237\u53cd\u9988\u95ee\u9898\u603b\u7ed3\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\u3002 \u4e3e\u4f8b\uff1a \u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u7528\u4f8b\u6765\u6e90 001 L1 core acp1 \u6807\u7b7e\u91c7\u7528\u679a\u4e3e\u7684\u65b9\u5f0f\u8fdb\u884c\u4ee3\u53f7\u7ba1\u7406\u65b9\u4fbf\u7ba1\u7406\u4ee5\u53ca\u540e\u7eed\u6269\u5c55\u3002 3.2\u3001\u5728\u6bcf\u4e2a\u5e94\u7528\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u7b2c\u4e00\u5217\u4e3a\u7528\u4f8b\u7684 ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ba1\u7406\u6a21\u5757\u5185\u7684\u7528\u4f8b\u6807\u7b7e\u3002\u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 3.3\u3001\u5bf9\u7167 PMS \u4e0a\u7528\u4f8b\u7b49\u7ea7\u3001\u7528\u4f8b\u7c7b\u578b\u548c\u7528\u4f8b\u6765\u6e90\uff0c\u6807\u8bb0\u6240\u6709\u5df2\u5b9e\u73b0\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u540e\u7eed\u7f16\u5199\u65b0\u589e\u81ea\u52a8\u5316\u7528\u4f8b\u65f6\uff0c\u6bcf\u5199\u4e00\u6761\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684 csv \u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u6b64\u6761\u7528\u4f8b\u7684\u6807\u7b7e\u3002 3.4\u3001\u8df3\u8fc7\u7528\u4f8b\u6807\u7b7e\u5316 \u73b0\u6709\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a\uff1a \u4e3e\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u8bb0\u4e3a \u201cskip-\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u8bb0\uff0c\u5982\u679c\u5df2\u7ecf\u6807\u8bb0\u4e86\u8df3\u8fc7\u539f\u56e0\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u8bb0\u4e3a SKIPED\uff0c\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\u3002 \u6240\u6709\u7684\u6807\u7b7e\u5728 docs \u76ee\u5f55\u4e0b\u4f1a\u6709\u4e00\u4e2a\u6587\u6863\uff0c\u6587\u6863\u6682\u5b9a\u540d\u79f0\u4e3a\uff1atags_info.md\uff0c\u7528\u4e8e\u8bf4\u660e\u73b0\u5728\u5df2\u7ecf\u4f7f\u7528\u5230\u7684\u6807\u7b7e\uff0c\u4ee5\u53ca\u8fd9\u4e9b\u6807\u7b7e\u7684\u89e3\u91ca\u548c\u7528\u6cd5\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#4","title":"4\u3001\u7528\u4f8b\u6267\u884c","text":"4.1\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u7684\u9a71\u52a8\u6267\u884c\u903b\u8f91\u529f\u80fd\u5b9e\u73b0 \u5f00\u53d1\u6839\u636e\u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\u91cc\u9762\u7684\u7528\u4f8b\u6807\u7b7e\u6267\u884c\u5bf9\u5e94\u7528\u4f8b\u7684\u529f\u80fd\uff0c\u80fd\u652f\u6301\u591a\u4e2a\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u6267\u884c\u5165\u53e3\u80fd\u968f\u610f\u901a\u8fc7\u7528\u4f8b\u6807\u7b7e\u6307\u5b9a\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002 \u7528\u4f8b\u6807\u7b7e\u7684\u9a71\u52a8\u65b9\u5f0f\u5fc5\u987b\u80fd\u652f\u6301\u6807\u7b7e\u7684\u6269\u5c55\uff0c\u672a\u6765\u968f\u7740\u4e1a\u52a1\u7684\u53d8\u5316\u53ef\u80fd\u9700\u8981\u589e\u52a0\u5404\u79cd\u5404\u6837\u7684\u6807\u7b7e\u3002 4.2\u3001\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u6267\u884c \u529f\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u3001\u6027\u80fd\u6d4b\u8bd5\u7b49\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u662f\u5206\u5f00\u6267\u884c\u7684\uff0c\u4e5f\u5c31\u662f\u5728\u4e00\u6b21\u6267\u884c\u4e2d\uff0c\u53ea\u80fd\u6267\u884c\u5176\u4e2d\u4e00\u79cd\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5177\u4f53\u8981\u6267\u884c\u54ea\u4e00\u79cd\u540c\u6837\u901a\u8fc7\u53c2\u6570\u6765\u63a7\u5236\u3002 4.3\u3001\u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c \u7531\u4e8e\u6d4b\u8bd5\u673a\u8d44\u6e90\u6709\u9650\uff0c\u968f\u7740\u81ea\u52a8\u5316\u7528\u4f8b\u6570\u91cf\u7684\u589e\u52a0\uff0cCI \u6267\u884c\u65f6\u95f4\u4f1a\u8d8a\u6765\u8d8a\u957f\u3002 \u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c\u7684\u529f\u80fd\uff1a \u540c\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\u5206\u6563\u5230\u4e0d\u540c\u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u4e0a\u6267\u884c\uff0c\u7f29\u77ed\u6267\u884c\u603b\u65f6\u95f4\uff1b \u7b2c\u4e8c\u5929\u8dd1\u7684\u65f6\u5019\u540c\u4e00\u4e2a\u673a\u5668\u4e0a\u4f1a\u6267\u884c\u6628\u5929\u6ca1\u6709\u6267\u884c\u5230\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u6267\u884c\u540c\u7406\uff1b \u53ef\u4ee5\u5b9e\u73b0\u5728\u5168\u67b6\u6784\u6d4b\u8bd5\u673a\u4e0a\u8f6e\u6d41\u6267\u884c\u7528\u4f8b\uff0c\u65e2\u80fd\u4fdd\u8bc1\u6267\u884c\u4e86\u6240\u6709\u7684\u7528\u4f8b\uff0c\u53c8\u80fd\u5728\u8d44\u6e90\u6709\u9650\u7684\u60c5\u51b5\u4e0b\u8986\u76d6\u4e86\u6240\u6709\u7684\u67b6\u6784\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#5","title":"5\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0","text":"5.1\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u4f5c\u4e3a\u524d\u7aef\u754c\u9762\u7cfb\u7edf\uff0c\u901a\u8fc7\u9875\u9762\u4e0a\u7684\u4e00\u4e9b\u529f\u80fd\u9009\u9879\u8fdb\u884c\u5bf9\u5e94\u6d4b\u8bd5\u4efb\u52a1\u7684\u7ba1\u7406\u6216\u89e6\u53d1\uff0c\u4e1a\u5185\u6bd4\u8f83\u6d41\u884c\u7684\u5b9e\u73b0\u65b9\u6848\u662f\u4f7f\u7528 Vue + DRF \u5b9e\u73b0\u4e00\u4e2a\u524d\u540e\u7aef\u5206\u79bb\u7684\u7cfb\u7edf\u3002 \u6d4b\u8bd5\u5e73\u53f0\u53ef\u80fd\u4f1a\u6d89\u53ca\u5230\u7684\u6a21\u5757\u6709\uff1a\u6d4b\u8bd5\u673a\u8d44\u6e90\u7ba1\u7406\u6a21\u5757\u3001\u7528\u4f8b\u6267\u884c\u63a7\u5236\u6a21\u5757\u3001\u7ed3\u679c\u5c55\u793a\u6a21\u5757\u3001PXE \u955c\u50cf\u5b89\u88c5\u6a21\u5757\u7b49\u3002 \u7528\u6237\uff08\u6d4b\u8bd5\u3001\u7814\u53d1\u540c\u5b66\u7b49\uff09\u53ef\u4ee5\u914d\u7f6e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5982\u6267\u884c\u54ea\u4e2a\u5e94\u7528\u3001\u6267\u884c\u7528\u4f8b\u7684\u8303\u56f4\u3001\u5728\u54ea\u53f0\u673a\u5668\u4e0a\u6267\u884c\u3001\u955c\u50cf\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u5e94\u7528\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u6267\u884c\u65f6\u95f4\u3002 5.2\u3001\u6267\u884c\u5165\u53e3 runner \u63d0\u4f9b\u7ed9\u6d4b\u8bd5\u5e73\u53f0\u7684\u63a5\u53e3\u5305\u62ec\uff1a\u7528\u4f8b\u6267\u884c\u63a5\u53e3\u3001\u7ed3\u679c\u8fd4\u56de\u63a5\u53e3\u3001\u955c\u50cf\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u955c\u50cf\u5b89\u88c5\u63a5\u53e3\u3001\u5e94\u7528\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u5e94\u7528\u5b89\u88c5\u66f4\u65b0\u63a5\u53e3\u7b49\u3002 \u524d\u7aef\u5e73\u53f0\u76ee\u524d\u8fd8\u6ca1\u6709\u592a\u591a\u8be6\u7ec6\u7684\u65b9\u6848\uff0c\u672c\u6b21\u8bbe\u8ba1\u4e3b\u8981\u96c6\u4e2d\u5728\u540e\u7aef\u8fd9\u90e8\u5206\u67b6\u6784\u7684\u8bbe\u8ba1\u4e0a\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_5","title":"\u56db\u3001\u5b9e\u65bd\u8ba1\u5212","text":"\u8fd1\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u6587\u7ba1\u4ee3\u7801\u89e3\u8026 2022/3/28 2022/4/8 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u56fe\u5f62\u56fe\u50cf\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u97f3\u89c6\u9891\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5168\u5c40\u641c\u7d22\u4ee3\u7801\u89e3\u8026 2022/4/25 2022/4/26 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u516c\u5171\u5e93\u5efa\u8bbe 2022/4/27 2022/5/5 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5c01\u88c5\u7684\u65b9\u6cd5\u6574\u7406\u6210\u4e00\u4e2a\u8868 2022/5/6 2022/5/10 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7528\u4f8b\u6807\u7b7e\u5206\u7c7b\u8bc4\u4f30 2022/5/11 2022/5/11 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u6807\u7b7e\u5316\u6267\u884c\u9a71\u52a8\u7a0b\u5e8f\u7f16\u5199 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u9700\u5b9e\u73b0\u81ea\u52a8\u89e3\u6790 csv \u8868\u683c\u4e2d\u7684\u7528\u4f8b\u7f16\u53f7 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u722c\u866b\u811a\u672c\uff0c\u722c\u53d6 pms \u4e0a\u7528\u4f8b\u7684\u6807\u7b7e 2022/5/11 2022/5/13 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u5b9a\u65f6\u81ea\u52a8\u7ef4\u62a4\u672c\u5730 csv \u6587\u4ef6\u811a\u672c 2022/5/11 2022/5/20 \u4e2d\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u76ee\u5f55\u7ed3\u6784\u8c03\u6574 2022/5/20 2022/6/2 \u5b8c\u6210\u5168\u5c40\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u5177\u4f53\u65b9\u6848\u548c\u903b\u8f91\u5b9e\u73b0 2022/6/6 2022/6/17 \u9759\u6001\u626b\u63cf\u95ee\u9898\u6e05\u96f6 2022/6/20 2022/7/1 \u5b8c\u6210\u65b0\u6846\u67b6\u4f7f\u7528\u57f9\u8bad 2022/7/4 2022/7/11 \u843d\u5730\u8fd0\u884c 2022/7/12 2022/7/20 \u5e95\u5c42\u5e93\u7528\u9014\u8bf4\u660e\u6587\u6863\u7f16\u5199 2022/7/21 2022/7/28"}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\u200b\\u3000\\-\u3001\u3002\uff0c\uff0e\uff1f\uff01\uff1b]+","pipeline":["stemmer"]},"docs":[{"location":"","title":"\u9996\u9875","text":""},{"location":"#youqu","title":"\u6709\u8da3\uff08YouQu\uff09","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/4/1\n# Author : Mikigo\n# =============================================\n \u672c\u7ad9\u603b\u8bbf\u95ee\u91cf \u6b21 \u6b22\u8fce\u5728\u6d4f\u89c8\u5668\u8bbf\u95ee\u3010\u516c\u7f51\u6587\u6863\u3011 \u7edf\u4fe1\u516c\u53f8\u5185\u7f51\u8fd8\u53ef\u4ee5\u8bbf\u95ee\u3010\u5185\u7f51\u6587\u6863\u3011\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u54e6~~"},{"location":"#_1","title":"\u4e00\u3001\u7b80\u4ecb","text":"\u6709\u8da3\uff08YouQu\uff09\u662f\u6df1\u5ea6\u79d1\u6280\u8bbe\u8ba1\u548c\u5f00\u53d1\u7684\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff0c\u91c7\u7528\u7ed3\u6784\u5206\u5c42\u7684\u8bbe\u8ba1\u7406\u5ff5\uff0c\u652f\u6301\u591a\u5143\u5316\u5143\u7d20\u5b9a\u4f4d\u548c\u65ad\u8a00\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\u3001\u5f3a\u5927\u7684\u65e5\u5fd7\u548c\u62a5\u544a\u8f93\u51fa\u7b49\u7279\u8272\u529f\u80fd\uff0c\u540c\u65f6\u5b8c\u7f8e\u517c\u5bb9X11\u3001Wayland\u663e\u793a\u534f\u8bae\uff0c\u73af\u5883\u90e8\u7f72\u7b80\u5355\uff0c\u64cd\u4f5c\u6613\u4e0a\u624b\u3002"},{"location":"#17","title":"\u7231\u4e0a \u201c\u6709\u8da3\u201d \u7684 17 \u4e2a\u7406\u7531","text":" \u6838\u5fc3\u5e93\u63d0\u4f9b\u4e86\u7edf\u4e00\u7684\u63a5\u53e3\uff0c\u7f16\u5199\u65b9\u6cd5\u65f6\u53ea\u9700\u8981\u5bfc\u5165\u4e00\u4e2a\u5305\u5c31\u53ef\u4ee5\u4f7f\u7528\u5230\u6838\u5fc3\u5e93\u63d0\u4f9b\u7684\u6240\u6709\u529f\u80fd\uff1b \u516c\u5171\u5e93\u5c01\u88c5\u4e86\u5f88\u591a\u5e38\u7528\u6a21\u5757\u7684\u76f8\u5173\u65b9\u6cd5\uff0c\u6bd4\u5982\uff1a\u4efb\u52a1\u680f\u7684\u64cd\u4f5c\u3001\u684c\u9762\u7684\u64cd\u4f5c\u3001\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\u7b49\u7b49\uff1b \u9664\u4e86\u5e38\u7528\u7684\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u8bc6\u522b\u4ee5\u5916\uff0c\u6211\u4eec\u8fd8\u63d0\u4f9b\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u5176\u4f7f\u7528\u7b80\u5355\u4e14\u9ad8\u6548\uff0c\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff1b \u5bf9\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u5c06\u7f16\u5199\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u53d8\u5f97\u7b80\u5355\u800c\u4f18\u96c5\uff1b \u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u6280\u672f\u8fdb\u884c\u529f\u80fd\u5347\u7ea7\uff0c\u9664\u4e86\u652f\u6301\u5355\u4e2a\u5750\u6807\u8fd4\u56de\uff0c\u8fd8\u652f\u6301\u540c\u4e00\u754c\u9762\u4e0b\u591a\u4e2a\u76f8\u540c\u5143\u7d20\u8fd4\u56de\u591a\u4e2a\u5750\u6807\u7684\u529f\u80fd\uff1b \u63d0\u4f9b\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u548c\u6279\u91cf\u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u4e0d\u5230\u4e00\u4e2a csv \u6587\u4ef6\u539f\u6765\u80fd\u5e72\u8fd9\u4e48\u591a\u4e8b\u60c5\uff1b \u63d0\u4f9b\u4e86\u529f\u80fd\u5f3a\u5927\u7684\u6267\u884c\u5668\u5165\u53e3\uff0c\u8ba9\u4f60\u53ef\u4ee5\u65b9\u4fbf\u7684\u5728\u672c\u5730\u6267\u884c\u4efb\u4f55\u7528\u4f8b\u96c6\u7684\u7528\u4f8b\uff0c\u5176\u4e30\u5bcc\u7684\u81ea\u5b9a\u4e49\u914d\u7f6e\u9879\uff0c\u6ee1\u8db3\u4f60\u5bf9\u6267\u884c\u5668\u6240\u6709\u7684\u5e7b\u60f3\uff1b \u63d0\u4f9b\u8fdc\u7a0b\u6267\u884c\u7684\u529f\u80fd\uff0c\u53ef\u4ee5\u63a7\u5236\u591a\u53f0\u673a\u5668\u5e76\u884c\u8dd1\uff0c\u6216\u8005\u5206\u5e03\u5f0f\u8dd1\uff0c\u8fd9\u79cd\u4ed8\u8d39\u529f\u80fd\u73b0\u5728\u514d\u8d39\u7ed9\u4f60\u7528\uff1b \u63d0\u4f9b\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u529f\u80fd\uff0c\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u6bcf\u4e2a\u65b9\u6cd5\u5355\u72ec\u5199\u8f93\u51fa\u65e5\u5fd7\u7684\u4ee3\u7801\uff0c\u4e00\u5207\u6211\u4eec\u7ed9\u4f60\u641e\u5b9a\u4e86\uff0c\u65e5\u5fd7\u8f93\u51fa\u4e0d\u4ec5\u5185\u5bb9\u4e30\u5bcc\uff0c\u989c\u503c\u4e5f\u7edd\u5bf9\u5728\u7ebf\uff0c\u6211\u4eec\u8fd8\u81ea\u5df1\u8bbe\u8ba1\u4e86\u4e00\u6b3e\u7ec8\u7aef\u8f93\u51fa\u4e3b\u9898\u53eb\u300a\u4e94\u5f69\u6591\u6593\u7684\u9ed1\u300b\uff1b \u63d0\u4f9b\u4e86\u4e00\u952e\u90e8\u7f72\u81ea\u52a8\u5316\u6d4b\u8bd5\u73af\u5883\u7684\u529f\u80fd\uff0c\u8fde\u4ee3\u7801\u7f16\u8f91\u5668\u90fd\u7ed9\u4f60\u88c5\u597d\u4e86\uff0c\u8ba9\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u73af\u5883\u90e8\u7f72\u800c\u70e6\u607c\uff1b \u63d0\u4f9b\u4e86\u81ea\u52a8\u751f\u6210\u591a\u79cd\u62a5\u544a\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u8f93\u51fa\u4ec0\u4e48\u62a5\u544a\u5f62\u5f0f\u90fd\u884c\uff0c\u800c\u4e14\u6211\u4eec\u5728\u62a5\u544a\u4e2d\u8fd8\u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\u548c\u5931\u8d25\u622a\u56fe\u7684\u529f\u80fd\uff1b \u5bf9\u65ad\u8a00\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u63d0\u4f9b\u66f4\u53cb\u597d\u5316\u7684\u9519\u8bef\u63d0\u793a\uff0c\u8ba9\u5b9a\u4f4d\u95ee\u9898\u7cbe\u51c6\u9ad8\u6548\uff1b \u4e0d\u4ec5\u652f\u6301\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u63a7\u5236\uff0c\u800c\u4e14\u8fd8\u652f\u6301\u52a8\u6001\u63a7\u5236\u7528\u4f8b\u6279\u91cf\u6267\u884c\u7684\u603b\u65f6\u95f4\uff0c\u786e\u4fdd CI \u73af\u5883\u4e0b\u80fd\u987a\u7545\u8fd0\u884c\uff1b \u652f\u6301\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\u6267\u884c\u3001PMS \u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6807\u7b7e\u5316\u6267\u884c\u65b9\u6848\uff0c\u6ee1\u8db3\u4f60\u5404\u79cd\u573a\u666f\u4e0b\u7684\u6267\u884c\u9700\u6c42\uff1b \u652f\u6301\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u529f\u80fd\uff0c\u53ef\u5b9a\u4f4d\u53ef\u65ad\u8a00\uff0c\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\uff1b \u5b8c\u7f8e\u517c\u5bb9 Wayland \u548c X11\uff0c\u771f\u6b63\u505a\u5230\u4e00\u5957\u4ee3\u7801\uff0c\u968f\u5904\u6267\u884c\uff1b \u652f\u6301\u591a\u79cd\u65b9\u5f0f\u7684\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u5176\u4e2d\u5f02\u6b65\u56de\u586b\u7684\u65b9\u6848\uff0c\u5b8c\u7f8e\u89e3\u51b3\u4e86\u6570\u636e\u56de\u586b\u7684\u8017\u65f6\u95ee\u9898\uff1b \u3010\u89c6\u9891\u4ecb\u7ecd\u3011"},{"location":"#_2","title":"\u4e8c\u3001\u5b89\u88c5\u4f7f\u7528","text":"\u57fa\u7840\u6846\u67b6\uff1ahttps://github.com/linuxdeepin/deepin-autotest-framework \u4ece PyPI \u5b89\u88c5: sudo pip3 install youqu\n \u521b\u5efa\u9879\u76ee: youqu-startproject youqu\n \u5b89\u88c5\u4f9d\u8d56: cd youqu\nbash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002 \u5e94\u7528\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684\u5e94\u7528\u540d\u79f0\u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music cd apps/\n \u5c06\u5e94\u7528\u5e93\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u50cf\u8fd9\u6837\uff1a youqu\n\u251c\u2500\u2500 apps\n\u2502 \u251c\u2500\u2500 autotest_deepin_music # \u5e94\u7528\u5e93\n...\n \u5e94\u7528\u5e93\u7684\u540d\u79f0\u4e0d\u53ef\u4ee5\u4fee\u6539\u3002"},{"location":"#_3","title":"\u4e09\u3001\u8fd0\u884c","text":""},{"location":"#1","title":"1. \u5de5\u4f5c\u7a7a\u95f4","text":"\u57fa\u7840\u6846\u67b6\u5de5\u7a0b\u76ee\u5f55\u5efa\u8bae\u653e\u5728 ~ \u76ee\u5f55\u4e0b\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u4e5f\u53ef\u4ee5\u8fd0\u884c\uff0c\u4f46\u662f\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u9700\u8981\u505a\u73af\u5883\u6e05\u7406\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u5b58\u5728\u4ee3\u7801\u88ab\u5220\u9664\u7684\u98ce\u9669\u3002 \u5982\u679c\u4f60\u7684\u673a\u5668\u4e0a\u4e0d\u540c\u76ee\u5f55\u4e0b\u5b58\u5728\u591a\u4e2a YouQu \u5de5\u7a0b\uff0c\u90a3\u4e48\u5728\u8fd0\u884c\u4e4b\u524d\uff0c\u8bf7\u5148\u6267\u884c env.sh \u6821\u6b63\u76f8\u5173\u73af\u5883\u3002"},{"location":"#2","title":"2. \u6267\u884c\u5668","text":"\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u6709\u4e00\u4e2a manage.py \uff0c\u5b83\u662f\u4e00\u4e2a\u6267\u884c\u5668\u5165\u53e3\uff0c\u63d0\u4f9b\u4e86\u672c\u5730\u6267\u884c\u3001\u8fdc\u7a0b\u6267\u884c\u7b49\u7684\u529f\u80fd\u3002 \u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6765\u6267\u884c\uff1a youqu manage.py run -a deepin-music\n"},{"location":"#21","title":"2.1. \u672c\u5730\u6267\u884c","text":"youqu manage.py run\n"},{"location":"#211","title":"2.1.1. \u914d\u7f6e\u6587\u4ef6","text":"\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u914d\u7f6e\u53c2\u6570 \u5728\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u91cc\u9762\u652f\u6301\u914d\u7f6e\u5bf9\u6267\u884c\u7684\u4e00\u4e9b\u53c2\u6570\u8fdb\u884c\u914d\u7f6e\uff0c\u5e38\u7528\u7684\u5982\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;-----------------------------------------------\n;1.KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2.KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f\n;e.g. TAGS = L1 or smoke\n;-----------------------------------------------\n;\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\uff0c\u5c06\u8981\u6267\u884c\u7684\u7528\u4f8b\u5199\u5165\u6307\u5b9a\u7684 csv \u6587\u4ef6\n;\u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u4ece\u57fa\u7840\u6846\u67b6\u6839\u76ee\u5f55\u5f00\u59cb\uff1ae.g. CASE_FILE = case_list.txt\n;\u5982\u679c\u8fd9\u91cc\u6709\u503c\uff0cAPP_NAME KEYWORDS TAGS \u7684\u914d\u7f6e\u5747\u4e0d\u751f\u6548\nCASE_FILE =\n;=============================== RUNNER CONFIG ===================================\n[runner]\n;\u6700\u5927\u5931\u8d25\u7528\u4f8b\u6570\u91cf\u7684\u5360\u6bd4\n;\u6bd4\u5982\uff1a\u603b\u6267\u884c\u7528\u4f8b\u6570\u4e3a 100, \u82e5 MAX_FAIL = 0.5,\u5219\u5931\u8d25\u7528\u4f8b\u6570\u8fbe\u5230 50 \u5c31\u4f1a\u7ec8\u6b62\u6d4b\u8bd5\u3002\nMAX_FAIL = 1\n;\u5355\u6761\u7528\u4f8b\u7684\u8d85\u65f6\u65f6\u95f4\uff0c\u5982\u679c\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u8d85\u65f6\uff0c\u8fd9\u6761\u7528\u4f8b\u4f1a\u88ab\u505c\u6b62\uff0c\u540e\u7eed\u7528\u4f8b\u7ee7\u7eed\u6267\u884c\u3002\n;\u5355\u4f4d\u4e3a\u79d2\n;\u8fd9\u662f\u4e00\u4e2a\u5168\u5c40\u7edf\u4e00\u914d\u7f6e\uff0c\u5982\u679c\u67d0\u6761\u7528\u4f8b\u9700\u8981\u5355\u72ec\u914d\u7f6e\u8d85\u65f6\u65f6\u95f4\uff0c\u53ef\u4ee5\u5728\u7528\u4f8b\u4e2d\u8fd9\u6837\u5199\uff1a\n;@pytest.mark.timeout(500)\n;def test_xxx_001():\n; ...\n;\u4f1a\u8bdd\u8d85\u65f6\uff08\u6240\u6709\u7528\u4f8b\u6267\u884c\u7684\u8d85\u65f6\u65f6\u95f4\uff09\u662f\u6839\u636e\u5168\u5c40\u8d85\u65f6\u914d\u7f6e\u548c\u7528\u4f8b\u5355\u72ec\u8d85\u65f6\u914d\u7f6e\u81ea\u52a8\u8ba1\u7b97\u7684\u3002\nCASE_TIME_OUT = 200\n;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\n;\u6ce8\u610f\uff0cRERUN = 1 \u8868\u793a\u91cd\u8dd1 1 \u6b21\uff0c\u5373\u7b2c\u4e00\u6b21\u7528\u4f8b\u6267\u884c\u5931\u8d25\u4f1a\u81ea\u52a8\u91cd\u8dd1 1 \u6b21\uff0c\u603b\u5171\u6267\u884c 2 \u6b21\uff1b\n;\u5982\u679c\u7b2c 2 \u6b21\u6267\u884c\u6210\u529f\uff0c\u7ed3\u679c\u6210\u529f\uff0c\u5931\u8d25\u4ea6\u4e3a\u5931\u8d25\u3002\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c 1 \u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff0cRERUN >= RECORD_FAILED_CASE\u3002\n;1.\u5173\u95ed\u5f55\u5c4f\uff1aRECORD_FAILED_CASE > RERUN\n;2.\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1aRECORD_FAILED_CASE = 0\nRECORD_FAILED_CASE = 1\n;yes \u6bcf\u6761\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u8fdb\u884c\u73af\u5883\u6e05\u7406\nCLEAN_ALL = yes\n;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387, \u6bd4\u5982\uff1a1920x1080\n;no: \u8868\u793a\u4e0d\u505a\u5206\u8fa8\u7387\u6821\u9a8c\nRESOLUTION = 1920x1080\n;\u4e0d\u8df3\u8fc7\u7528\u4f8b\uff0ccsv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86 skip-xxx\u7684\u7528\u4f8b\u4e0d\u8df3\u8fc7\nNOSKIP = no\n;ignore fixed\n;no\uff0c\u53ea\u8981\u6807\u8bb0\u4e86fixed\u7684\u7528\u4f8b\uff0c\u5373\u4f7f\u6807\u8bb0\u4e86skip-\uff0c\u4e5f\u4f1a\u6267\u884c\uff1b\n;yes\uff0cfixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\uff1b\nIFIXED = no\n;\u8981\u5b89\u88c5deb\u5305\u7684\u8def\u5f84\n;e.g : ~/Downloads/ \u5b89\u88c5\u4e0b\u8f7d\u76ee\u5f55\u4e0b\u7684deb\u5305\uff0c\u5982\u679c\u662f\u8fdc\u7a0b\u6267\u884c\uff0c\u4f1a\u81ea\u52a8\u62f7\u8d1d\u5230\u8fdc\u7a0b\u5e76\u5b89\u88c5\u3002\nDEB_PATH =\n;DEBUG \u6a21\u5f0f\u6267\u884c\u7528\u4f8b\uff0c\u53ea\u6536\u96c6\u4e0d\u6267\u884c\u7528\u4f8b\uff0c\u4e5f\u4e0d\u505a\u8bbe\u5907\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002\nDEBUG = no\n;\u8bb0\u5f55top\u547d\u4ee4\u67e5\u8be2\u7684\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0cTOP = 3 \u8868\u793a\u8bb0\u5f55\u524d3\u4e2a\u8fdb\u7a0b\u3002\nTOP =\n;\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\nREPEAT =\n;\u9ed8\u8ba4\u5728\u6240\u6709\u6d4b\u8bd5\u5b8c\u6210\u4e4b\u540e\u8f93\u51fa\u62a5\u9519\u4fe1\u606f.\n;yes, \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\nDURING_FAIL = no\n;\u6ce8\u518c\u81ea\u542f\u670d\u52a1\nAUTOSTART = no\n;=============================== REPORT CONFIG ===================================\n[report]\n;\u6d4b\u8bd5\u62a5\u544a\u7684title\nREPORT_TITLE = YouQu Report\n;\u6d4b\u8bd5\u62a5\u544a\u7684name\nREPORT_NAME = YouQu Report\n;\u6d4b\u8bd5\u62a5\u544a\u7684\u9ed8\u8ba4\u8bed\u8a00\n;en:English\n;ru:\u0420\u0443\u0441\u0441\u043a\u0438\u0439\n;zh:\u4e2d\u6587\n;de:Deutsch\n;nl:Nederlands\n;he:Hebrew\n;br:Brazil\n;pl:Polski\n;ja:\u65e5\u672c\u8a9e\n;es:Espa\u00f1ol\n;kr:\ud55c\uad6d\uc5b4\n;fr:Fran\u00e7ais\n;az:Az\u0259rbaycanca\nREPORT_LANGUAGE = zh\n;\u7528\u4f8b\u6267\u884c\u5b8c\u540e\u751f\u6210\u7684\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n;\u76ee\u524d\u652f\u6301 allure, xml, json \uff08\u652f\u6301\u540c\u65f6\u751f\u6210\uff09\nREPORT_FORMAT = allure, xml, json\n;\u6307\u5b9a\u62a5\u544a\u751f\u6210\u7684\u8def\u5f84\uff08\u76f8\u5bf9\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\uff09\nALLURE_REPORT_PATH = report/\nXML_REPORT_PATH = report/\nJSON_REPORT_PATH = report/\n;=============================== GLOBAL CONFIG ===================================\n[globalconfig]\n;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\nPASSWORD = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\nIMAGE_MATCH_NUMBER = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6bcf\u6b21\u95f4\u9694\u7b49\u5f85\u65f6\u95f4\nIMAGE_MATCH_WAIT_TIME = 1\n;\u56fe\u50cf\u8bc6\u522b\u5339\u914d\u5ea6\nIMAGE_RATE = 0.9\n;\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u5b9e\u65f6\u56fe\u50cf\u4fdd\u5b58\u8def\u5f84\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u5750\u6807\nSCREEN_CACHE = /tmp/screen.png\n;\u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\u7684\u8def\u5f84\nTMPDIR = /tmp/tmpdir\n;\u7cfb\u7edf\u4e3b\u9898\nSYS_THEME = deepin\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = youqu-dev.uniontech.com\n;OpenCV\u670d\u52a1\u7aef\u5730\u5740\nOPENCV_SERVER_HOST = youqu-dev.uniontech.com\n;=============================== PMS CONFIG ===================================\n;PMS\u76f8\u5173\u914d\u7f6e\uff0c\u5305\u542b\u4ee5\u4e0b\u51e0\u4e2a\u65b9\u9762\uff1a\n;1.PMS\u6d4b\u8bd5\u5957\u6267\u884c\n;2.\u81ea\u52a8\u4ecePMS\u722c\u53d6\u6570\u636e\u5e76\u540c\u6b65\u672c\u5730CSV\u6587\u4ef6\n;3.PMS\u6570\u636e\u56de\u586b\n[pms]\n;PMS\u7684\u7528\u6237\u540d,\u5982: ut001234\nPMS_USER =\n;PMS\u7684\u5bc6\u7801\nPMS_PASSWORD =\n;PMS\u6d4b\u8bd5\u5957\u7684ID\n;\u5728PMS\u4e0a\u67e5\u770b\u7528\u4f8b\u201c\u5957\u4ef6\u201d\u94fe\u63a5: https://pms.uniontech.com/testsuite-view-495.html\n;\u6d4b\u8bd5\u5957ID\u4e3a: 495\nSUITE_ID =\n;\u6570\u636e\u56de\u586b\u5fc5\u987b\u5173\u8054PMS\u6d4b\u8bd5\u5355\n;\u5728PMS\u4e0a\u67e5\u770b\u6d4b\u8bd5\u5355\u94fe\u63a5: https://pms.uniontech.com/testtask-cases-20747.html\n;\u6d4b\u8bd5\u5355ID\u4e3a: 20747\nTASK_ID =\n;\u5c06\u6d4b\u8bd5\u7ed3\u679c\u6570\u636e\u56de\u586b\u5230PMS\n;\u4e3a\u7a7a: \u8868\u793a\u4e0d\u56de\u586b,\u4e0d\u4f1a\u5728\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u751f\u6210json\u7ed3\u679c\u6587\u4ef6;\n;async: \u8868\u793a\u9010\u6761\u5f02\u6b65\u56de\u586b,\u540e\u9762\u4e00\u6761\u6267\u884c\u5f00\u59cb\u65f6\u901a\u8fc7\u5b50\u7ebf\u7a0b\u5bf9\u524d\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u8fdb\u884c\u56de\u586b\uff0c\u5982\u6b64\u5b9e\u73b0\u65f6\u95f4\u6548\u7387\u6700\u5927\u5316;\n;finish: \u8868\u793a\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u6210\u4e4b\u540e\u9010\u4e2a\u56de\u586b(PMS\u4e0d\u652f\u6301\u5e76\u53d1);\nSEND_PMS =\n;\u6570\u636e\u56de\u586b\u7684\u89e6\u53d1\u8005\n;auto: \u6846\u67b6\u81ea\u52a8\u56de\u586b,\u914d\u5408SEND_PMS\u914d\u7f6e\u4f7f\u7528,\u4f60\u53ef\u4ee5\u9009\u62e9\u5728\u4e0d\u540c\u7684\u9636\u6bb5\u8fdb\u884c\u6570\u636e\u56de\u586b;\n;hand: \u624b\u52a8\u56de\u586b,\u6bcf\u6761\u7528\u4f8b\u4ecd\u7136\u4f1a\u751f\u6210json\u6587\u4ef6,\u4f46\u6846\u67b6\u4e0d\u4f1a\u8fdb\u884c\u6570\u636e\u56de\u586b,\u9700\u8981\u4f60\u53ef\u4ee5\u5728\u4f60\u60f3\u8981\u53d1\u9001\u7684\u65f6\u95f4\u70b9\u624b\u52a8\u89e6\u53d1\u56de\u586b;\nTRIGGER = auto\n;PMS\u56de\u586b\u7684\u91cd\u8bd5\u6b21\u6570\n;\u5982\u679c\u63a5\u53e3\u8bf7\u6c42\u5931\u8d25,\u4f1a\u8fdb\u884c\u91cd\u8bd5\nSEND_PMS_RETRY_NUMBER = 2\n[csv_link_pms_lib]\n;caselib: \u7528\u4f8b\u5e93\n;testcase: \u4ea7\u54c1\u5e93\u7528\u4f8b\nCASE_FROM = caselib\n[csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/caselib-browse-81.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 81\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic =\n[export_csv]\n;\u5bfc\u51fa\u7684csv\u6587\u4ef6\u540d\u79f0\uff0c\u9ed8\u8ba4 case_list.csv\nCSV_FILE = case_list.csv\n;exportcsv \u547d\u4ee4\u5bfc\u51fa case_list.csv \u6587\u4ef6\u65f6\u914d\u7f6e\u7684\u5b57\u6bb5\u540d\uff0c\u7528\u4f8b\u540d\u79f0\u9ed8\u8ba4\u5b58\u5728\u7b2c\u4e00\u5217\uff0c\u65e0\u9700\u6dfb\u52a0\nCSV_HEARD = \u7528\u4f8b\u7ea7\u522b,\u7528\u4f8b\u7c7b\u578b,\u6d4b\u8bd5\u7ea7\u522b,\u662f\u5426\u8df3\u8fc7\n[log_cli]\n;\u65e5\u5fd7\u76f8\u5173\u914d\u7f6e\uff08\u4e0d\u6253\u5370\u6784\u9020\u51fd\u6570\u548c\u9b54\u6cd5\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff09\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = DEBUG\n# ============= \u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u914d\u7f6e ================\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u5f00\u5934\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7, \u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_STARTSWITH = Assert\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u7ed3\u5c3e\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_ENDSWITH = Widget\n;\u652f\u6301\u7c7b\u540d\u5305\u542b xxx \u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_CONTAIN = ShortCut\n# ==============================================\n \u914d\u7f6e\u5b8c\u6210\u4e4b\u540e\uff0c\u76f4\u63a5\u5728\u547d\u4ee4\u884c\u6267\u884c manage.py \u5c31\u597d\u4e86\u3002 youqu manage.py run\n"},{"location":"#212","title":"2.1.2. \u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a youqu manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -h, --help show this help message and exit\n-a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--record_failed_case RECORD_FAILED_CASE\n\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--max_fail MAX_FAIL \u6700\u5927\u5931\u8d25\u7387\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--resolution RESOLUTION\n\u68c0\u67e5\u5206\u8fa8\u7387\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms {,async,finish}\n\u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--trigger {,auto,hand}\n\u89e6\u53d1\u8005\n-f CASE_FILE, --case_file CASE_FILE\n\u6839\u636e\u6587\u4ef6\u6267\u884c\u7528\u4f8b\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n--pms_user PMS_USER pms \u7528\u6237\u540d\n--pms_password PMS_PASSWORD\npms \u5bc6\u7801\n--suite_id SUITE_ID pms \u6d4b\u8bd5\u5957ID\n--pms_info_file PMS_INFO_FILE\npms \u4fe1\u606f\u6587\u4ef6\n--top TOP \u8fc7\u7a0b\u4e2d\u8bb0\u5f55top\u547d\u4ee4\u4e2d\u7684\u503c\n--lastfailed \u4ec5\u6267\u884c\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\n--duringfail \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\n--repeat REPEAT \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n--project_name PROJECT_NAME\n\u5de5\u7a0b\u540d\u79f0\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--build_location BUILD_LOCATION\n\u6784\u5efa\u5730\u533a\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--line LINE \u6267\u884c\u7684\u4e1a\u52a1\u7ebf\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--autostart AUTOSTART \u7528\u4f8b\u6267\u884c\u7a0b\u5e8f\u6ce8\u518c\u5230\u5f00\u673a\u81ea\u542f\u670d\u52a1\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a youqu manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\"\n \u547d\u4ee4\u884c\u53c2\u6570\u4f18\u5148\u7ea7\u662f\u9ad8\u4e8e\u914d\u7f6e\u6587\u4ef6\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u4e86\u5bf9\u5e94\u7684\u53c2\u6570\uff0c\u914d\u7f6e\u6587\u4ef6\u4e2d\u4e0d\u7ba1\u662f\u5426\u914d\u7f6e\u5747\u4e0d\u751f\u6548\u3002 --app \u5165\u53c2\u8fd8\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\uff0c\u4e0b\u9762\u7684\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u540c\u6837\u652f\u6301\u3002"},{"location":"#22","title":"2.2. \u8fdc\u7a0b\u6267\u884c","text":"\u8fdc\u7a0b\u6267\u884c\u5c31\u662f\u7528\u672c\u5730\u4f5c\u4e3a\u670d\u52a1\u7aef\u63a7\u5236\u8fdc\u7a0b\u673a\u5668\u6267\u884c\uff0c\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u76f8\u540c\uff1b \u4f7f\u7528 remote \u547d\u4ee4\uff1a youqu manage.py remote\n"},{"location":"#221","title":"2.2.1. \u8fdc\u7a0b\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u6267\u884c","text":"\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u6267\u884c\u5c31\u662f\u7531\u672c\u5730 YouQu \u4f5c\u4e3a\u670d\u52a1\u7aef\uff0c\u63a7\u5236\u8fdc\u7a0b N \u53f0\u673a\u5668\u6267\u884c\u76f8\u540c\u7684\u7528\u4f8b\uff0c\u6267\u884c\u5b8c\u4e4b\u540e\u6240\u6709\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u7ed3\u679c\u4f1a\u8fd4\u56de\u7ed9\u670d\u52a1\u7aef report \u76ee\u5f55\u4e0b\uff1b \u8fdc\u7a0b\u6267\u884c\u540c\u6837\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u8fdb\u884c\u7528\u4f8b\u76f8\u5173\u914d\u7f6e\uff1b \u9700\u8981\u91cd\u70b9\u8bf4\u4e00\u4e0b\u8fdc\u7a0b\u6267\u884c\u65f6\u7684\u6d4b\u8bd5\u673a\u4fe1\u606f\u914d\u7f6e\uff0c\u5728\u914d\u7f6e\u6587\u4ef6 setting/remote.ini \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\u3001IP\u3001\u5bc6\u7801\u3002 ;=============================== CLIENT LIST =====================================\n; \u6d4b\u8bd5\u673a\u914d\u7f6e\u5217\u8868\n;[client{number}] ;\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u6709\u591a\u5c11\u53f0\u6d4b\u8bd5\u673a\u5c31\u5199\u591a\u5c11\u4e2a client\uff0c\u522b\u540d\u5fc5\u987b\u5305\u542b client \u5b57\u7b26\uff0c\u4e14\u4e0d\u80fd\u91cd\u590d\u3002\n;user = ;\u6d4b\u8bd5\u673a user\n;ip = ;\u6d4b\u8bd5\u673a ip\n;password = 1 ;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801, \u53ef\u4ee5\u4e0d\u914d\u7f6e\u6b64\u9879\uff0c\u9ed8\u8ba4\u53d6 CLIENT_PASSWORD \u7684\u503c\uff1b\n;\u5982\u679c\u4f60\u6240\u6709\u6d4b\u8bd5\u673a\u5bc6\u7801\u90fd\u76f8\u540c\uff0c\u90a3\u4e48\u53ea\u9700\u8981\u914d\u7f6e CLIENT_PASSWORD \u5c31\u53ef\u4ee5\u4e86\n;=================================================================================\n[client1]\nuser = uos\nip = 10.8.15.xx\n[client2]\nuser = uos\nip = 10.8.15.xx\n[client3]\nuser = uos\nip = 10.8.11.xx\n \u6709\u591a\u5c11\u53f0\u673a\u5668\u5c31\u50cf\u8fd9\u6837\u53c2\u8003\u4e0a\u9762\u7684\u683c\u5f0f\u5199\u5c31\u884c\u4e86\u3002 \u7136\u540e\u5728\u547d\u4ee4\u884c\uff1a youqu manage.py remote\n \u8fd9\u6837\u8fd0\u884c\u662f\u4ece\u914d\u7f6e\u6587\u4ef6\u53bb\u8bfb\u53d6\u76f8\u5173\u914d\u7f6e\u3002 \u5982\u679c\u4f60\u4e0d\u60f3\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\uff0c\u4f60\u4ecd\u7136\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u8fdb\u884c\u4f20\u53c2\uff0c \u4ee5\u4e0b\u4e3a python3 manage.py remote \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -h, --help show this help message and exit\n-c CLIENTS, --clients CLIENTS\n\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679cpassword\u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6sett\ning/remote.ini\u4e2dCLIENT_PASSWORD\u7684\u503c,\u6bd4\u5982: uos@10.8.13.33:1\n\u6216 uos@10.8.13.33\n-s, --send_code \u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a\uff08\u4e0d\u542breport\u76ee\u5f55\uff09\n-e, --build_env \u642d\u5efa\u6d4b\u8bd5\u73af\u5883,\u5982\u679c\u4e3ayes\uff0c\u4e0d\u7ba1send_code\u662f\u5426\u4e3ayes\u90fd\u4f1a\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a.\n-p CLIENT_PASSWORD, --client_password CLIENT_PASSWORD\n\u6d4b\u8bd5\u673a\u5bc6\u7801\uff08\u5168\u5c40\uff09\n-y PARALLEL, --parallel PARALLEL\nyes:\u8868\u793a\u6240\u6709\u6d4b\u8bd5\u673a\u5e76\u884c\u8dd1\uff0c\u6267\u884c\u76f8\u540c\u7684\u6d4b\u8bd5\u7528\u4f8b;no:\u8868\u793a\u6d4b\u8bd5\u673a\u5206\u5e03\u5f0f\u6267\u884c\uff0c\u670d\u52a1\u7aef\u4f1a\u6839\u636e\u6536\u96c6\u5230\u7684\u6d4b\u8bd5\u7528\u4f8b\u81ea\n\u52a8\u5206\u914d\u7ed9\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u3002\n \u9664\u4e86\u8fd9\u4e9b\u7279\u6709\u53c2\u6570\u4ee5\u5916\uff0c\u5b83\u540c\u6837\u652f\u6301\u672c\u5730\u6267\u884c\u7684\u6240\u6709\u53c2\u6570\uff1b \u5728\u547d\u4ee4\u884c\u8fd9\u6837\u8fd0\u884c\uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\"\n \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report \u76ee\u5f55\u4e0b\u56de\u6536\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u7684\u6d4b\u8bd5\u62a5\u544a\u3002 \u6ce8\u610f\uff0c\u5982\u679c\u8fdc\u7a0b\u673a\u5668\u6ca1\u6709\u642d\u5efa\u81ea\u52a8\u5316\u6d4b\u8bd5\u73af\u5883\uff0c\u8bb0\u5f97\u52a0\u4e0a\u53c2\u6570 -e \uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\" -e\n \u6267\u884c\u524d\u786e\u4fdd\u8fdc\u7a0b\u673a\u5668\u5df2\u7ecf\u5f00\u542f\u4e86 ssh \u670d\u52a1\uff0c\u5426\u5219\u4f1a\u63d0\u793a\u65e0\u6cd5\u8fde\u63a5\uff0c\u5982\u679c\u6ca1\u6709\u5f00\u542f\uff0c\u8bf7\u624b\u52a8\u5f00\u542f\uff1a sudo systemctl restart ssh\nsudo systemctl enable ssh\n \u914d\u7f6e\u6587\u4ef6\u5176\u4ed6\u76f8\u5173\u914d\u7f6e\u9879\u8be6\u7ec6\u8bf4\u660e\uff0c\u8bf7\u67e5\u770b\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u6ce8\u91ca\u5185\u5bb9\u3002"},{"location":"#222","title":"2.2.2. \u8fdc\u7a0b\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u8d1f\u8f7d\u5747\u8861\u6267\u884c","text":"\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u8d1f\u8f7d\u5747\u8861\u6267\u884c\u4e5f\u662f\u7528\u672c\u5730\u4f5c\u4e3a\u670d\u52a1\u7aef\u63a7\u5236\u8fdc\u7a0b\u673a\u5668\u6267\u884c\uff0c\u4f46\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u4e0d\u540c\uff0c\u800c\u662f\u6240\u6709\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u4e4b\u548c\uff0c\u4e3a\u4f60\u60f3\u8981\u6267\u884c\u7684\u7528\u4f8b\u96c6\uff1b \u4f3c\u4e4e\u6709\u70b9\u96be\u4ee5\u7406\u89e3\uff0c\u6211\u7528\u5927\u767d\u8bdd\u4e3e\u4f8b\u63cf\u8ff0\u4e0b\u5c31\u662f\uff0c\u670d\u52a1\u7aef\u60f3\u8981\u6267\u884c 10 \u6761\u7528\u4f8b\uff0c\u73b0\u5728\u8fdc\u7a0b\u673a\u5668\u6709 5 \u53f0\uff1b \u7136\u540e\u670d\u52a1\u7aef\u5c31\u5148\u62ff\u7740\u7b2c 1 \u6761\u7528\u4f8b\u7ed9\u8fdc\u7a0b 1 \u53f7\u673a\u6267\u884c\uff0c\u62ff\u7b2c 2 \u6761\u7528\u4f8b\u7ed9\u8fdc\u7a0b 2 \u53f7\u673a\u6267\u884c...\uff0c\u5982\u6b64\u5faa\u73af\u76f4\u5230\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\uff0c\u8fd9\u5c31\u662f\u8d1f\u8f7d\u5747\u8861\u6267\u884c\u3002 \u4f7f\u7528\u65b9\u6cd5\u548c\u524d\u9762\u4e00\u6837\uff0c\u53ea\u662f\u9700\u8981\u589e\u52a0\u4e00\u4e2a\u53c2\u6570\uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\" --parallel no\n"},{"location":"#23-pms","title":"2.3. PMS \u6570\u636e\u56de\u586b","text":"\u6d4b\u8bd5\u5355\u5173\u8054\u7684\u7528\u4f8b\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u5bf9\u5e94\u7684\u53bb\u8dd1\u8fd9\u4e9b\u5173\u8054\u7684\u7528\u4f8b\uff0c\u5e76\u4e14\u5c06\u6267\u884c\u7684\u7ed3\u679c\u56de\u586b\u7684\u6d4b\u8bd5\u7528\u4f8b\u7684\u72b6\u6001\u91cc\u9762\u3002 PMS \u6570\u636e\u56de\u586b\u4e3b\u8981\u6709\u4e09\u79cd\u65b9\u5f0f\uff1a \uff081\uff09\u5f02\u6b65\u56de\u586b \u5728\u7528\u4f8b\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\uff0c\u91c7\u7528\u5f02\u6b65\u7684\u65b9\u5f0f\u53bb\u8fdb\u884c\u6570\u636e\u56de\u586b\uff0c\u76f4\u767d\u7684\u8bb2\u5c31\u662f\uff0c\u7b2c\u4e8c\u6761\u7528\u4f8b\u5f00\u59cb\u8dd1\u7684\u65f6\u5019\uff0c\u901a\u8fc7\u5b50\u7ebf\u7a0b\u53bb\u505a\u7b2c\u4e00\u6761\u7528\u4f8b\u7684\u6570\u636e\u56de\u586b\uff0c\u5982\u6b64\u5faa\u73af\uff0c\u76f4\u5230\u6240\u6709\u7528\u4f8b\u6267\u884c\u7ed3\u675f\uff1b \u8fd9\u79cd\u65b9\u6848\u7684\u65f6\u95f4\u6548\u7387\u6700\u9ad8\u7684\uff0c\u56e0\u4e3a\u7406\u8bba\u4e0a\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u662f\u5927\u4e8e\u6570\u636e\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\u65f6\u95f4\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u5f53\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u6570\u636e\u56de\u586b\u4e5f\u5b8c\u6210\u4e86\u3002 \u4f7f\u7528\u65b9\u6cd5\uff0c\u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u4ee5\u4e0b\u53c2\u6570\uff1a\uff08\u4ee5\u4e0b\u6d89\u53ca\u5230\u7684\u53c2\u6570\u914d\u7f6e\u90fd\u662f\u5728\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u914d\u7f6e\uff09 PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = async\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \u8fd9\u4e2a\u53c2\u6570\u53ef\u586b\u53ef\u4e0d\u586b\uff0c\u4f46\u662f\u586b\u4e86\u53ef\u4ee5\u63d0\u9ad8\u7528\u4f8b\u7684\u6267\u884c\u901f\u5ea6\uff0c\u56e0\u4e3a\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u53ef\u4ee5\u6307\u5b9a\u5230\u5177\u4f53\u7684\u5e94\u7528\u5e93\u3002\uff08\u4e0b\u540c\uff09\n \uff082\uff09\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u56de\u586b \u7b49\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u518d\u9010\u4e2a\u8fdb\u884c\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u6b64\u65b9\u6848\u65f6\u95f4\u6548\u7387\u6bd4\u8f83\u4f4e\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \uff083\uff09\u624b\u52a8\u56de\u586b \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4e0d\u505a\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u540e\u7eed\u624b\u52a8\u5c06\u7ed3\u679c\u8fdb\u884c\u56de\u586b\u8bf7\u6c42\u3002 \u7528\u4f8b\u6267\u884c\u65f6\u914d\u7f6e\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = hand\nAPP_NAME = \u540e\u7eed\u624b\u52a8\u56de\u586b\u65b9\u6cd5\uff1a youqu manage.py pms --send2task yes\n"},{"location":"#_4","title":"\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898","text":"\u7531\u540c\u5b66\u53ef\u80fd\u4f1a\u53d1\u73b0\uff0c\u600e\u4e48\u56de\u586b\u4e00\u6b21\u4e4b\u540e\uff0c\u540e\u9762\u60f3\u518d\u6b21\u56de\u586b\u5c31\u4e0d\u751f\u6548\u4e86\uff1b \u8fd9\u662f\u56e0\u4e3a\u4e3a\u4e86\u5e94\u5bf9\u524d\u9762\u63d0\u5230\u7684\u591a\u79cd\u6570\u636e\u56de\u586b\u7684\u65b9\u5f0f\uff0c\u5728 report \u76ee\u5f55\u4e0b\u4f1a\u7531 pms_xxx \u5f00\u5934\u7684\u76ee\u5f55\uff0c\u8bb0\u5f55\u4e86\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u548c\u56de\u586b\u60c5\u51b5\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u4e4b\u524d\u5df2\u7ecf\u56de\u586b\u8fc7\u4e86\uff0c\u540e\u7eed\u5c31\u4e0d\u4f1a\u518d\u6b64\u89e6\u53d1\u56de\u586b\u4e86\uff1b \u5982\u679c\u4f60\u60f3\u91cd\u65b0\u505a\u56de\u586b\uff0c\u4f60\u53ef\u4ee5\u628a report/pms_xxx \u76ee\u5f55\u5220\u6389\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u91cd\u65b0\u505a\u6570\u636e\u56de\u586b\u4e86\uff1b"},{"location":"#24-csv","title":"2.4. \u5bfc\u51fa CSV \u6587\u4ef6","text":"\u6846\u67b6\u63d0\u4f9b\u5bfc\u51fa\u6307\u5b9a\u6807\u7b7e\u7528\u4f8b\u7684\u529f\u80fd\uff1a youqu manage.py exportcsv -a deepin-album -t CICD\n \u8868\u793a\u5bfc\u51fa deepin-album \u7684\u7528\u4f8b\u4e2d\u6807\u8bb0\u4e86 CICD \u6807\u7b7e\u7684\u7528\u4f8b\uff0c\u5bfc\u51fa CSV \u6587\u4ef6\u7684\u5b57\u6bb5\u683c\u5f0f\u5df2\u7ecf\u9002\u914d\u4e86 CICD \u7684\u8981\u6c42\u3002"},{"location":"#25-app","title":"2.5. \u811a\u624b\u67b6\u65b0\u5efa APP \u5de5\u7a0b","text":"\u65b0\u5efa\u4e00\u4e2a APP \u5de5\u7a0b\uff1a youqu manage.py startapp autotest_deepin_some \u8fd9\u6837\u5728 apps \u76ee\u5f55\u4e0b\u4f1a\u521b\u5efa\u4e00\u4e2a\u5b50\u9879\u76ee\u5de5\u7a0b autotest_deepin_some\uff0c\u540c\u65f6\u65b0\u5efa\u597d\u5de5\u7a0b\u6a21\u677f\u76ee\u5f55\u548c\u6a21\u677f\u6587\u4ef6\uff1a apps\n\u2514\u2500\u2500 autotest_deepin_some\n \u00a0\u00a0 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_case.py\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 config.ini\n \u00a0\u00a0 \u251c\u2500\u2500 config.py\n \u00a0\u00a0 \u251c\u2500\u2500 conftest.py\n \u00a0\u00a0 \u251c\u2500\u2500 control\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_assert.py\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some.csv\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u2514\u2500\u2500 widget\n \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 case_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 other.ini\n \u00a0\u00a0 \u251c\u2500\u2500 other_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 pic_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2514\u2500\u2500 ui.ini\n autotest_deepin_some \u662f\u4f60\u7684\u5de5\u7a0b\u540d\u79f0\uff0c\u6bd4\u5982\uff1aautotest_deepin_music \uff1b \u5728\u6b64\u57fa\u7840\u4e0a\uff0c\u4f60\u53ef\u4ee5\u5feb\u901f\u7684\u5f00\u59cb\u4f60\u7684 AT \u9879\u76ee\u3002"},{"location":"#26","title":"2.6. \u7528\u4f8b\u6807\u7b7e\u81ea\u52a8\u540c\u6b65","text":"\u7528\u4e8e\u81ea\u52a8\u540c\u6b65 PMS \u7528\u4f8b\u6807\u7b7e\u6570\u636e\u81f3\u672c\u5730 CSV \u6587\u4ef6\uff0c\u4e3b\u8981\u901a\u8fc7\u4ee5\u4e0b\u51e0\u4e2a\u914d\u7f6e\u6765\u63a7\u5236\uff1a APP_NAME = # \u6307\u5b9a\u8981\u540c\u6b65\u7684\u5e94\u7528\u540d\u79f0\nPMS_USER = # PMS\u7684\u7528\u6237\u540d\nPMS_PASSWORD = # PMS\u7684\u5bc6\u7801\n \u5728 [csv_link_pms_id] \u8282\u70b9\u4e0b\u6307\u5b9a csv \u6587\u4ef6\u540d\u4e0e PMS \u7528\u4f8b\u6a21\u5757\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u6bd4\u5982\uff1a [csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/testcase-browse-53.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 53\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic = 53\n \u5c06\u4ee5\u4e0a\u4fe1\u606f\u914d\u7f6e\u597d\u4e4b\u540e\uff0c\u5728\u547d\u4ee4\u884c\u6267\u884c\uff1a youqu manage.py pms --pms2csv yes\n \u6bcf\u6b21\u6267\u884c\u65f6\u539f csv \u6587\u4ef6\u4f1a\u81ea\u52a8\u5907\u4efd\u5728 report/csv_back \u76ee\u5f55\u4e0b\uff0c\u56e0\u6b64\u4f60\u4e0d\u7528\u62c5\u5fc3\u811a\u672c\u6267\u884c\u5bfc\u81f4\u4f60\u7684\u6570\u636e\u4e22\u5931\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u57fa\u7840\u6846\u67b6\u8bbe\u8ba1\u65b9\u6848","text":"# ====================================\n# Author : Mikigo\n# Time : 2022/3/18\n# version \uff1a1.0\n# ====================================\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"\u505a\u4e00\u4e2a\u7b80\u5355\u3001\u597d\u7528\u3001\u529f\u80fd\u5f3a\u5927\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u3002 \u4f5c\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4e00\u4e2a\u57fa\u7840\u6846\u67b6\uff0c\u4efb\u4f55\u5e94\u7528\u90fd\u80fd\u5f88\u65b9\u4fbf\u7684\u63a5\u5165\u8fdb\u6765\uff1b \u63d0\u4f9b\u6240\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u9700\u8981\u7684\u5e95\u5c42\u529f\u80fd\uff0c\u5e76\u5bf9\u5916\u63d0\u4f9b\u552f\u4e00\u7684\u63a5\u53e3\uff0c\u65b9\u4fbf\u5e94\u7528\u5e93\u4f7f\u7528\uff1b \u6574\u5408\u516c\u5171\u5e93\uff0c\u51cf\u5c11\u5e94\u7528\u5e93\u4ee3\u7801\u91cf\u548c\u65b9\u6cd5\u7ef4\u62a4\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u8bbe\u8ba1\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u7edf\u4e00\u6982\u5ff5","text":" \u57fa\u7840\u6846\u67b6 \u672c\u9879\u76ee\u662f\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\uff08AutoTest Basic Frame\uff09\uff0c\u5168\u79f0\u4e3a\u201c\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff08AT \u57fa\u7840\u6846\u67b6\uff09\u201d\u3002 AT \u57fa\u7840\u6846\u67b6\u662f\u505a\u4e3a\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\u6765\u8bbe\u8ba1\u7684\uff0c\u5b83\u63d0\u4f9b\u4e86\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u57fa\u7840\u529f\u80fd\uff0c\u4efb\u4f55\u5e94\u7528\u63a5\u5165\u8fdb\u6765\u90fd\u80fd\u5feb\u901f\u65b9\u4fbf\u7684\u8fdb\u884c\u65b9\u6cd5\u548c\u7528\u4f8b\u7f16\u5199\uff0c\u540c\u65f6\u5728\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u3001\u6807\u7b7e\u5316\u6267\u884c\u3001\u5206\u5e03\u5f0f\u6267\u884c\u3001\u591a\u79cd\u62a5\u544a\u8f93\u51fa\u3001\u4f18\u7f8e\u7684\u6267\u884c\u65e5\u5fd7\u3001\u5931\u8d25\u81ea\u52a8\u5f55\u5c4f\u548c\u622a\u56fe\u3001\u81ea\u52a8\u73af\u5883\u6e05\u7406\u7b49\u7b49\uff0c\u5b83\u90fd\u63d0\u4f9b\u4e86\u5b8c\u5584\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u66f4\u91cd\u8981\u7684\u662f\u8fd9\u4e00\u5207\u4f7f\u7528\u8d77\u6765\u90fd\u975e\u5e38\u7b80\u5355\u3002 \u57fa\u7840\u6846\u67b6\u4e2d\u5305\u542b\u5e94\u7528\u5e93\uff08apps\uff09\u3001\u6838\u5fc3\u5e93\uff08src\uff09\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09\u3002 \u5e94\u7528\u5e93\uff08apps\uff09 \u5404\u4e2a\u5e94\u7528\u81ea\u5df1\u7684\u4ed3\u5e93\uff0c\u91cc\u9762\u4e3b\u8981\u5305\u542b\u7684\u662f\u7528\u4f8b\u3001\u65b9\u6cd5\u53ca\u4e00\u4e9b\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u53eb autotest-dde-file-manager \u3002 \u6838\u5fc3\u5e93\uff08src\uff09 \u6838\u5fc3\u5e93\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u5230\u6240\u6709\u5e95\u5c42\u6838\u5fc3\u529f\u80fd\uff0c\u8fd9\u662f\u6700\u91cd\u8981\u7684\u4e00\u4e2a\u90e8\u5206\uff0c\u7075\u9b42\u3002\u5177\u4f53\u529f\u80fd\u6a21\u5757\u53ca\u8bf4\u660e\u4f1a\u5728\u4e0b\u9762\u7b2c\u56db\u4e2a\u7ae0\u8282\u8be6\u7ec6\u63cf\u8ff0\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09 \u591a\u4e2a\u5e94\u7528\u90fd\u8981\u7528\u5230\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\uff0c\u6309\u7167\u5e94\u7528\u5212\u5206\u5b58\u653e\uff0c\u4e3b\u8981\u662f\u4e3a\u4e86\u51cf\u5c11\u4ee3\u7801\u91cf\uff0c\u6d88\u9664\u5e94\u7528\u95f4\u7684\u8026\u5408\u5173\u7cfb\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u67b6\u6784\u56fe","text":"\u6574\u4f53\u7684\u6846\u67b6\u8bbe\u8ba1\u5728\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u300b\u6587\u6863\u91cc\u9762\u5df2\u7ecf\u6709\u8be6\u7ec6\u63cf\u8ff0\u4e86\uff0c\u8fd9\u91cc\u8d34\u4e00\u4e0b\u6574\u4f53\u7684\u67b6\u6784\u56fe\uff1a \u4e3a\u4e86\u7a81\u663e\u672c\u6587\u7684\u91cd\u70b9\uff0c\u62bd\u53d6\u5176\u4e2d\u91cd\u8981\u529f\u80fd\u6a21\u5757\uff0c\u5982\u4e0b\u56fe\uff1a "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-basic-frame # \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\n\u251c\u2500\u2500 apps # \u5e94\u7528\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-dde-file-manager # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\uff08\u5e94\u7528\u5e93\u8be6\u7ec6\u76ee\u5f55\u7ed3\u6784\u8bf7\u770b\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\uff09\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 tag # \u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u2514\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u2502 \u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 xxx.png\n\u2502 \u2502 ...\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-deepin-music # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 public # \u516c\u5171\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget # dde_dock \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget # dde_desktop \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 src # \u6838\u5fc3\u5e93\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 button_center.py\n\u2502 \u251c\u2500\u2500 cmdtrl.py\n\u2502 \u251c\u2500\u2500 dogtails.py\n\u2502 \u251c\u2500\u2500 find_image.py\n\u2502 \u251c\u2500\u2500 global_config.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 setting # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 config.py\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 global_config.ini\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\u6a21\u5757\uff08Hook\uff09\n\u251c\u2500\u2500 pytest.ini # Pytest \u9ed8\u8ba4\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 docs # \u6587\u6863\u76ee\u5f55\n\u2514\u2500\u2500 manage.py # \u6267\u884c\u5668\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1apps","title":"1\u3001\u5e94\u7528\u5e93\uff08apps\uff09","text":"\u6240\u6709\u5e94\u7528\u5e93\u5747\u653e\u7f6e\u5728\u57fa\u7840\u6846\u67b6\u4e0b\u7684 apps \u76ee\u5f55\u4e0b\uff08\u89c1\u7b2c\u4e8c\u7ae0\u8282\u7b2c3\u6bb5\u76ee\u5f55\u7ed3\u6784\u5185\u5bb9\uff09\u3002\u5e94\u7528\u5e93\u7684\u67b6\u6784\u8bbe\u8ba1\u53ef\u4ee5\u53c2\u8003\u300aAT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b\u6587\u6863\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2src","title":"2\u3001\u6838\u5fc3\u5e93\uff08src\uff09","text":"\u5728 src \u76ee\u5f55\u4e0b\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u5e95\u5c42\u6838\u5fc3\u7ec4\u4ef6\uff0c\u901a\u5e38\u6765\u8bb2\u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5230\u5176\u4e2d\u67d0\u4e00\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4e48\u4f60\u9700\u8981\u663e\u793a\u7684\u5bfc\u5165\u8fd9\u4e2a\u6a21\u5757\uff0c\u7136\u540e\u624d\u80fd\u4f7f\u7528\u8be5\u6a21\u5757\u4e0b\u7684\u529f\u80fd\uff0c\u5982\u679c\u4f60\u7528\u5230\u4e86\u5341\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4f60\u5c31\u9700\u8981\u5bfc\u5165\u5341\u4e2a\u3002\u4f46\u662f\u6211\u4eec\u60f3\u8ba9\u4e8b\u60c5\u53d8\u5f97\u7b80\u5355\uff0c\u4e00\u6b21\u5bfc\u5165\uff0c\u4f7f\u7528\u6240\u6709\u3002 \u5c06\u6240\u6709\u7684\u529f\u80fd\u6a21\u5757\u90fd\u8fdb\u5165\u5230 src \u7684\u540d\u79f0\u7a7a\u95f4\uff0c\u5728 src/__init__.py \u91cc\u9762\u6211\u4eec\u8bbe\u8ba1\u6210\u8fd9\u6837\uff1a # src/__init__.py\nfrom .cmdctl import CmdCtl\nfrom .dogtails import Dogtail\nfrom .find_image import FindImage\nfrom .button_center import ButtonCenter\nclass Src(CmdCtl, FindImage):\ndef __init__(self, **kwargs):\n\"\"\"dogtail or button center param\n :param kwargs: app_name, desc, number\n \"\"\"\nif kwargs:\napp_name = kwargs.get(\"APP_NAME\")\ndesc = kwargs.get(\"DESC\")\nif app_name is None or desc is None:\nraise ValueError\nnumber = kwargs.get(\"number\")\nnumber = number if isinstance(number, int) else -1\n# \u5bf9\u8c61\u7ec4\u5408\nself.dog = Dogtail(app_name, desc, number)\nself.ui = ButtonCenter(app_name, number)\n \u9700\u8981\u4f20\u9012\u53c2\u6570\u7684\u91c7\u7528\u5bf9\u8c61\u7ec4\u5408\uff0c\u6ca1\u6709\u53c2\u6570\u7684\u4f7f\u7528\u7ee7\u627f\uff0c\u7ee7\u627f\u7684\u7c7b\u7b26\u5408 Mixin \u8bbe\u8ba1\u6a21\u5f0f\u3002 \u5e94\u7528\u5e93\u91cc\u9762\u4f7f\u7528\u7684\u65f6\u5019\u5728 widget/base_widget.py \u91cc\u9762\u53ea\u9700\u8981\u552f\u4e00\u7ee7\u627f Src \uff1a # \u5e94\u7528\u5e93\u91cc\u9762\u65b9\u6cd5\u57fa\u7c7b\n# widget/base_widget.py\nfrom src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n \u8981\u4f7f\u7528\u6838\u5fc3\u5e93\u7684\u529f\u80fd\uff0c\u53ea\u9700\u8981\u5199\u4e00\u4e2a\u5bfc\u5165 from src import Src \u5373\u53ef\u3002 \u5199 __init__ \u6784\u9020\u51fd\u6570\u7684\u539f\u56e0\u662f\u901a\u8fc7\u53c2\u6570\u6784\u9020\u5e94\u7528\uff0c\u5e76\u4e14\u4f20\u9012 number \u8fdb\u6765\uff0c\u53ef\u4ee5\u5b9e\u73b0\u591a\u7a97\u53e3\u7684\u63a7\u5236\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3public","title":"3\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09","text":"\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6bcf\u4e2a\u5e94\u7528\u90fd\u662f\u4e00\u4e2a\u5355\u72ec\u7684 py \u6587\u4ef6\uff0c\u76f8\u4e92\u4e4b\u95f4\u662f\u72ec\u7acb\u7684\uff0c\u6bcf\u4e2a py \u6587\u4ef6\u91cc\u9762\u662f\u8be5\u5e94\u7528\u7684\u65b9\u6cd5\u7c7b\uff0c\u6bd4\u5982\uff1a\u6700\u5e38\u7528\u7684\u65b9\u6cd5\u7c7b dde_desktop_public_widget.py # dde_desktop_widget.py\nfrom src import Src\nclass _DdeDesktopPublicBaseWidget(Src):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-desktop\"\nDESC = \"/usr/bin/dde-desktop\"\ndef __init__(self):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC)\nclass DdeDesktopPublicWidget(_DdeDesktopPublicBaseWidget):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u7c7b\"\"\"\ndef click_music_dir_by_ui(self):\n\"\"\"\u5728\u6587\u4ef6\u9009\u62e9\u6846\u70b9\u51fb\u97f3\u4e50\u76ee\u5f55\"\"\"\nself.click(*self.ui.btn_center(\"\u4fa7\u8fb9\u680f-\u97f3\u4e50\")) \ndef click_xxx_by_attr(self):\npass\n \u516c\u5171\u65b9\u6cd5\u5e93\u610f\u4e49\uff1a \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6240\u5c01\u88c5\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\u90fd\u662f\u81f3\u5c11\u88ab2\u4e2a\u5e94\u7528\u90fd\u7528\u5230\u7684\uff0c\u8fd9\u6837\u505a\u53ef\u4ee5\u51cf\u5c11\u6574\u4f53\u4ee3\u7801\u91cf\uff0c\u4ece\u800c\u51cf\u8f7b\u5e94\u7528\u5e93\u4ee3\u7801\u7684\u7ef4\u62a4\u5de5\u4f5c\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u7f16\u5199\u5f62\u5f0f\uff08\u547d\u540d\u89c4\u5219\u3001\u5b9a\u4f4d\u7684\u65b9\u6848\u5199\u6cd5\u3001\u6ce8\u91ca\u7684\u5199\u6cd5\u7b49\u7b49\uff09\u5177\u6709\u4e00\u5b9a\u7684\u6a21\u677f\u4f5c\u7528\uff0c\u8fd9\u6837\u5373\u4f7f\u662f\u5404\u4e2a\u5e94\u7528\u5e93\u90fd\u72ec\u7acb\u7ef4\u62a4\uff0c\u6240\u6709\u7684\u7f16\u7801\u98ce\u683c\u90fd\u662f\u8d8b\u4e8e\u76f8\u540c\u7684\uff0c\u56e0\u4e3a\u5927\u5bb6\u90fd\u5e94\u8be5\u53c2\u7167\u516c\u5171\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u5199\u6cd5\u6765\u5199\u81ea\u5df1\u5e94\u7528\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\u7c7b\uff0c\u8fd9\u6837\u4f7f\u5f97\u4ece\u516c\u53f8\u7684\u89d2\u5ea6\u53bb\u770b\u6240\u6709\u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u90fd\u662f\u7edf\u4e00\u7684\u3002 \u53ef\u4ee5\u901a\u8fc7\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\uff0c\u4e86\u89e3\u5230\u5176\u4ed6\u5e94\u7528\u7684\u529f\u80fd\uff0c\u5bf9\u4e8e\u6211\u4eec\u9700\u6c42\u7406\u89e3\uff0c\u4e86\u89e3\u7cfb\u7edf\u7684\u65b9\u65b9\u9762\u9762\u4e5f\u6709\u597d\u5904\u3002 \u5f53\u7136\uff0c\u5982\u679c\u4f60\u7684\u5e94\u7528\u672c\u8eab\u662f\u5c5e\u4e8e\u6839\u672c\u5c31\u4e0d\u9700\u8981\u548c\u5176\u4ed6\u5e94\u7528\u4ea4\u4e92\u7684\uff0c\u90a3\u4e48\u4f60\u53ef\u80fd\u4e0d\u4f1a\u7528\u5230\u8fd9\u91cc\u9762\u7684\u529f\u80fd\uff0c\u6ca1\u5173\u7cfb\uff0c\u4f60\u6240\u6709\u7684\u65b9\u6cd5\u90fd\u53ef\u4ee5\u76f4\u63a5\u5199\u5728\u5e94\u7528\u5e93\u7684\u4e1a\u52a1\u5c42\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4conftestpy","title":"4\u3001conftest.py","text":"conftest.py \u4ece\u529f\u80fd\u4e0a\u5c06\u662f\u5c5e\u4e8e\u6838\u5fc3\u5e93\uff08src\uff09\u7684\u5185\u5bb9\uff0c\u4f46\u662f\u7531\u4e8e\u5b83\u7684\u7279\u6b8a\u6027\uff0c\u5373\u5b83\u662f\u5bf9\u5e94\u7528\u5e93\u4e2d\u7684\u7528\u4f8b\u751f\u6548\u7684\uff0c\u800c\u4e14\u5b83\u7684\u4f5c\u7528\u57df\u662f\u5f53\u524d\u76ee\u5f55\u53ca\u4ee5\u4e0b\uff0c\u56e0\u6b64\u6211\u4eec\u5c06\u5b83\u653e\u5230\u9879\u76ee\u6839\u76ee\u5f55\u3002\u6211\u4eec\u6846\u67b6\u4e2d\u6709\u4e0d\u5c11\u6838\u5fc3\u529f\u80fd\u90fd\u662f\u5728\u8fd9\u91cc\u9762\u8fdb\u884c\u5f00\u53d1\u7684\uff0c\u540e\u9762\u7b2c\u56db\u7ae0\u4f1a\u8bb2\u5230\u7ec6\u8282\u3002 pytest.ini \u4f5c\u7528\u548c conftest.py \u7c7b\u4f3c\uff0c\u662f Pytest \u6846\u67b6\u7684\u56fa\u5b9a\u914d\u7f6e\u6587\u4ef6\uff0c\u76ee\u524d\u914d\u7f6e\u4e86\u4e00\u4e9b\u901a\u7528\u7684\u547d\u4ee4\u884c\u6267\u884c\u53c2\u6570\uff0c\u4e5f\u653e\u5728\u9879\u76ee\u6839\u76ee\u5f55\u3002 \u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 Hook \u51fd\u6570\uff0capps \u76ee\u5f55\u4e0b\u7684 \u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 fixture \u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5setting","title":"5\u3001setting","text":"\u5168\u5c40\u914d\u7f6e\u6a21\u5757\uff0c\u5305\u542b\u4e86\u4ee5\u4e0b\u914d\u7f6e\u6587\u4ef6\uff1a \uff081\uff09ini \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u914d\u7f6e\u4e00\u4e9b\u5168\u5c40\u7684\u914d\u7f6e\u9879\uff0c\u8b6c\u5982\uff1a\u5931\u8d25\u91cd\u8dd1\u6b21\u6570\u3001\u662f\u5426\u5931\u8d25\u5f55\u5c4f\u3001\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\u3001\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4\u3001\u6267\u884c\u65f6\u65e5\u5fd7\u7ea7\u522b\u3001\u751f\u6210\u7684\u62a5\u544a\u7c7b\u578b\u3001\u4ee5\u53ca\u5206\u5e03\u5f0f\u6267\u884c\u7684\u4e00\u4e9b\u7b56\u7565\u914d\u7f6e\u9879\u7b49\u7b49\u3002 \uff082\uff09config.py \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u63d0\u4f9b\u914d\u7f6e\u6587\u4ef6\u8bfb\u53d6\u3001\u52a8\u6001\u83b7\u53d6\u4e00\u4e9b\u5e38\u91cf\uff08\u5982\u9879\u76ee\u6839\u76ee\u5f55\u7edd\u5bf9\u8def\u5f84 (BASE_DIR)\u3001\u7cfb\u7edf\u67b6\u6784\uff08SYS_FRAME\uff09\u3001\u65f6\u95f4\u5b57\u7b26\u4e32\uff08strftime\uff09\u3001\u672c\u673a USERNAME IP \u7b49\u7b49\uff09\u3001\u516c\u5171 URL \u7b49\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u89c4\u8303","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u7248\u672c\u53ca\u4f9d\u8d56","text":"\u57fa\u7840\u6846\u67b6\u4f1a\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u8fdb\u884c\u7248\u672c\u53d1\u5e03\uff0c\u4e0d\u4e0e\u67d0\u4e2a\u5e94\u7528\u7248\u672c\u7ed1\u5b9a\uff0c\u4f46\u662f\uff0c\u5e94\u7528\u5e93\u4f1a\u4f9d\u8d56\u4e8e\u57fa\u7840\u6846\u67b6\u7684\u7248\u672c\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u5efa\u8bae\u5728\u5e94\u7528\u5e93\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a\u6587\u672c\u6587\u4ef6\u7528\u4e8e\u8bb0\u5f55\u6240\u4f9d\u8d56\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\uff0c\u7c7b\u4f3c\u4e8e\u5f00\u53d1\u5e94\u7528\u7684 debian/control \u6587\u4ef6\u7684\u529f\u80fd\uff0c\u4e3a\u4e86\u4fdd\u6301\u7edf\u4e00\uff0c\u8fd9\u4e2a\u6587\u4ef6\u5c31\u547d\u540d\u4e3a control\uff0c\u653e\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u6838\u5fc3\u5e93\u72ec\u7acb\u6027","text":"\u6838\u5fc3\u5e93\u4e0d\u5efa\u8bae\u9488\u5bf9\u67d0\u4e00\u4e2a\u5e94\u7528\u5355\u72ec\u505a\u4ee3\u7801\u4e0a\u7279\u6b8a\u5904\u7406\uff0c\u901a\u5e38\u8003\u8651\u9488\u5bf9\u67d0\u4e00\u79cd\u573a\u666f\u8fdb\u884c\u5904\u7406\uff0c\u8fd9\u4e9b\u573a\u666f\u901a\u5e38\u662f\u5b58\u5728\u4e00\u4e9b\u5171\u6027\u7684\u3002\u6bd4\u5982\u8bf4\uff1a\u684c\u9762\u7684ID\u5206\u914d\u5b58\u5728\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u903b\u8f91\u5904\u7406\u89e3\u51b3ID\u5206\u914d\u9519\u8bef\u7684\u95ee\u9898\uff0c\u4f46\u662f\u8fd9\u90e8\u5206\u903b\u8f91\u6211\u4eec\u4f1a\u5728\u684c\u9762\u7684\u65b9\u6cd5\u5c42\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u517c\u5bb9\u6027","text":"\u4e3a\u4e86\u4fdd\u6301\u517c\u5bb9\u6027\uff0c\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u539f\u5219\u4e0a\u4e0d\u5bf9\u8001\u65b9\u6cd5\u8fdb\u884c\u4fee\u6539\u6216\u5220\u9664\uff0c\u53ea\u8fdb\u884c\u65b0\u589e\u3002\u6d89\u53ca\u5230\u8001\u65b9\u6cd5\u4fee\u6539\u6216\u5220\u9664\u7684\uff0c\u4f1a\u8fdb\u884c\u63d0\u524d\u9884\u544a\uff0c\u5e76\u5728\u7b2c\u4e8c\u4e2a\u7248\u672c\u4e4b\u540e\uff08\u4e2d\u95f4\u4f1a\u9694\u4e00\u4e2a\u7248\u672c\u8fc7\u5ea6\uff09\u6b63\u5f0f\u5b9e\u65bd\u4fee\u6539\u6216\u5220\u9664\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u547d\u540d\u89c4\u8303","text":" \u7528\u4f8b ID \u6bcf\u4e2a\u5e94\u7528\u81ea\u5df1\u7ef4\u62a4\u4e00\u5957 ID\uff0c\u5728PMS\u4e0a\u7528\u4f8b\u6807\u9898\u4e0a\u5c06\u81ea\u52a8\u5316ID\u4ee5\u6807\u7b7e\u7684\u5f62\u5f0f\u5199\u5165\uff0c\u6bd4\u5982\uff1a[101]\u6253\u5f00-\u542f\u52a8\u5e94\u7528\u540edock\u53f3\u952e\u83dc\u5355 \u4e00\u4e2a\u7528\u4f8b\u7c7b\u91cc\u9762\u6709\u591a\u4e2a\u7528\u4f8b\u65f6\uff0c\u5728\u7528\u4f8b\u540d\u79f0\u540e\u9762\u52a0\u5e8f\u53f7\u3002 class TestFileManager(BaseCase):\n\"\"\"\u6587\u7ba1\u7528\u4f8b\"\"\"\ndef test_xxx_015_1(self):\npass\ndef test_xxx_015_2(self):\npass\n \u6ce8\u610f 015_1\uff0c\u4e0d\u8981\u5199015_01\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 PMS \u4e0a\u7684\u7528\u4f8bID\uff1a PMS \u4e0a\u662f6\u4f4d\u6570\uff0c\u4e0d\u591f\u76f4\u89c2\uff0c\u4e5f\u4e0d\u597d\u7ef4\u62a4\uff0c\u5728\u81ea\u52a8\u5316\u4e0b\u9762\u53bb\u627e\u4e00\u4e2a\u5e26\u6709 6 \u4f4d\u6570\u7684\u6587\u4ef6\u662f\u4e00\u4e2a\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 PMS \u4e0a\u7684 ID \u53ef\u80fd\u4f1a\u53d1\u751f\u53d8\u5316\uff0c\u6bd4\u5982\u5bfc\u51fa\u6765\u5bfc\u8fdb\u53bb\u7684\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u5b58\u5728\u95ee\u9898\uff0c\u5982\u679c\u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u8981\u60f3\u627e\u51fa\u6765\u5bf9\u5e94\u4fee\u6539\u81ea\u52a8\u5316\u7528\u4f8b ID\uff0c\u5c06\u4f1a\u662f\u4ef6\u975e\u5e38\u75db\u82e6\u7684\u4e8b\u60c5\u3002 \u51fd\u6570\u547d\u540d\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5de6\u952e\u70b9\u51fb click \u53f3\u952e\u70b9\u51fb right_click \u53cc\u51fb double_click \u79fb\u52a8 move_to \u62d6\u52a8 drag \u65b0\u5efa new \u62d6\u52a8\u5230 drag_to \u4ece\u54ea\u91cc\u62d6\u52a8\u5230\u54ea\u91cc drag_something_from_xxx_to_xxx \u83b7\u53d6 get \u83b7\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5750\u6807 get_location \u975e\u7279\u6b8a\u6587\u4ef6 file word\u6587\u4ef6 doc text\u6587\u4ef6 text \u6587\u4ef6\u5939 dir \u5173\u952e\u8bcd\u6301\u7eed\u589e\u52a0 \u5e38\u91cf\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5e94\u7528\u540d\u79f0 APP_NAME \u5e94\u7528\u63cf\u8ff0 DESC \u672c\u5e94\u7528\u4ee5\u5916\u7684\u5176\u4ed6\u5e94\u7528\uff0c\u6bd4\u5982\u5e2e\u52a9 HELP \u5176\u4ed6\u540d\u79f0\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u65b9\u6cd5\u5305\u540d widget \u65b9\u6cd5\u6587\u4ef6\u540d\uff08\u6587\u7ba1\u4e3e\u4f8b\uff09 dfm_widget.pytitle_widget.pyright_view_widget.pyleft_view_widget.pypop_widget.pybase_widget.pydfm_assert.py \u65ad\u8a00\u8bed\u53e5\u547d\u540d\u89c4\u8303 \u65ad\u8a00\u8bed\u53e5\u90fd\u662f\u4ee5 assert \u5f00\u5934 \u65ad\u8a00 \u8bed\u53e5 \u5224\u65ad\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_existsassert_file_not_exists \u5224\u65ad\u684c\u9762\u76ee\u5f55\u4e0b\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_exists_in_desktopassert_file_not_exists_in_desktop \u5224\u65ad\u56fe\u7247\u5b58\u5728 assert_image_existsassert_image_not_exists \u5224\u65ad\u5f71\u9662\u4e2d\u662f\u5426\u5b58\u5728\u56fe\u7247 assert_image_exists_in_movieassert_image_not_exists_in_movie \u5224\u65ad\u5143\u7d20\u662f\u5426\u5b58\u5728 assert_element_existassert_element_not_exist \u5224\u65ad\u662f\u5426\u76f8\u7b49 assert_equalassert_not_equal \u5224\u65ad\u662f\u5426\u4e3a\u771f assert_trueassert_false"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5fixture","title":"5\u3001fixture \u89c4\u8303","text":"\u7531\u4e8e Pytest \u6846\u67b6\u4e2d\u652f\u6301 fixture \u7684\u5199\u6cd5\u548c Xunit \u5199\u6cd5\u7684\uff0c\u6240\u4ee5\u5e94\u7528\u5e93\u4e2d\u53ef\u80fd\u5b58\u5728\u6df7\u7528\u7684\u60c5\u51b5\uff0c\u4e3a\u7edf\u4e00\u7f16\u7801\u98ce\u683c\u65b9\u4fbf\u540e\u7eed\u7528\u4f8b\u4ee3\u7801\u7ef4\u62a4\uff0c\u73b0\u505a\u4ee5\u4e0b\u89c4\u8303\u8bf4\u660e\uff1a \u629b\u5f03 Xunit \u7684\u5199\u6cd5\uff0c\u7edf\u4e00\u91c7\u7528 Pytest fixture \u7684\u5199\u6cd5\u3002 \u5e94\u7528\u5185 fixture \u8c28\u614e\u4f7f\u7528 autouse=True \uff0c\u975e\u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u975e\u5e38\u4e0d\u5efa\u8bae\u4f7f\u7528\u8fd9\u4e2a\u53c2\u6570\u3002 \u8c03\u7528 fixture \u4e0d\u80fd\u4f7f\u7528 @pytest.mark.usefixture()\uff0c\u4f7f\u7528\u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u4f20\u5165\u51fd\u6570\u5bf9\u8c61\u3002 \u5efa\u8bae\u5728\u4e00\u4e2a conftest.py \u91cc\u9762\u53bb\u5199\uff0c\u4e00\u4e2a\u5e94\u7528\u4e5f\u5c3d\u91cf\u7ef4\u62a4\u4e00\u4e2a conftest.py\u6587\u4ef6\u3002 fixture \u4e5f\u9700\u8981\u5199\u529f\u80fd\u8bf4\u660e\uff0c\u51fd\u6570\u540d\u79f0\u8981\u6709\u5177\u4f53\u542b\u4e49\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#6","title":"6\u3001\u65b9\u6cd5\u7f16\u5199\u89c4\u8303","text":" \u65b9\u6cd5\u7c7b\u578b\uff1a if \u6ca1\u6709\u7528\u5230\u5b9e\u4f8b\u5bf9\u8c61\uff1a\nif \u6ca1\u6709\u7528\u5230\u7c7b\u5bf9\u8c61\uff1a\n\u5199\u9759\u6001\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @staticmethod\nelse\uff1a\n\u5199\u7c7b\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @classmethod\nelse:\n\u76f4\u63a5\u5199\u5b9e\u4f8b\u65b9\u6cd5\n \u4e3e\u4f8b: class TitleWidget:\ndef click_xxx_by_ui(self):\npass\n@staticmethod\ndef click_xxx_by_ui():\npass\n@classmethod\ndef click_xxx_by_ui(cls):\npass\n \u51fd\u6570\u540d\u79f0\u4e0d\u51fa\u73b0\u6570\u5b57\uff0c\u9700\u8981\u8868\u793a\u6570\u91cf\u7684\u7528\u5355\u8bcd\u8868\u793a\u3002 \u51fd\u6570\u529f\u80fd\u6ce8\u91ca\u3002 \u6ca1\u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg2:xxx\n\"\"\"\n \u6709\u53c2\u6570\uff0c\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg1:xxx\nreturn: xxx\n\"\"\"\n \u200b \u7528 Pycharm \u7684\u6ce8\u91ca\u6a21\u677f\u4e5f\u53ef\u4ee5\uff0c\u53ea\u8981\u4f53\u73b0\u4e86\u53c2\u6570\u7684\u7c7b\u578b\u548c\u8fd4\u56de\u5c31\u884c\u4e86\u3002 \u6682\u4e0d\u8981\u6c42\u5199\u7c7b\u578b\u6ce8\u89e3\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#7case","title":"7\u3001\u7528\u4f8b\uff08case\uff09\u89c4\u8303","text":" \u4ee5\u7c7b\u7684\u5f62\u5f0f\u5199\u7528\u4f8b\uff0c\u7528\u4f8b\u7c7b\u96c6\u6210\u7528\u4f8b\u57fa\u7c7b\u3002 \u7528\u4f8b\u7c7b\u9700\u8981\u5199\u6ce8\u91ca\u3002 \u6d4b\u8bd5\u7528\u4f8b\u51fd\u6570\u8bf4\u660e\uff08\u5efa\u8bae\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u540d\u79f0\uff09 \"\"\"\u53f3\u4fa7\u9884\u89c8-\u56fe\u7247\u7c7b\u578b\u4fe1\u606f\u680f\u57fa\u672c\u4fe1\u606f\"\"\"\n \u4e0d\u5199\u8c03\u8bd5\u4ee3\u7801 if __name__ == '__main__':\npytest.main()\n \u6240\u6709\u7528\u4f8b\u90fd\u7ee7\u627f BaseCase\u3002 BaseCase \u91cc\u9762\u653e\u4e00\u4e9b\u6d4b\u8bd5\u6570\u636e\u7684\u5e38\u91cf\uff0c\u6bd4\u5982\u6587\u4ef6\u540d\u79f0\uff0c\u5e94\u7528\u540d\u79f0\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u4e00\u4e9b\u901a\u7528\u7684\u5b57\u7b26\u4e32\u3002 \u8fd9\u7c7b\u662f\u5c5e\u4e8e\u6d4b\u8bd5\u6570\u636e\u3002 class BaseCase(DfmAssert):\n\"\"\"\u7528\u4f8b\u57fa\u7c7b\"\"\"\nNEW_FILE = \"\u65b0\u5efa\u6587\u672c.txt\"\nTEST_FILE = \"test.txt\"\nNEW_DIR = \"\u65b0\u5efa\u6587\u4ef6\u5939\"\nNEW_WORD = \"\u65b0\u5efaWord\u6587\u6863.doc\"\nAPP_HELP = \"damn\"\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\n\"\"\"\u7528\u4f8b\u6807\u9898\uff08\u590d\u5236PMS\u4e0a\u7528\u4f8b\u6807\u9898\uff09\"\"\"\ndfm = DfmWidget()\ndfm.click_xxx_by_attr(self.NEW_FILE)\ndfm.new_file_in_desktop_by_cmd(self.NEW_FILE)\nself.assert_true(dfm.get_process_status(self.APP_NAME))\n \u7528\u4f8b\u91cc\u9762\u5c3d\u91cf\u51cf\u5c11\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\uff0c\u66f4\u8981\u51cf\u5c11\u76f8\u540c\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\u3002 \u7edf\u4e00\u6587\u4ef6\u6ce8\u91ca\u5934\u3002 #!/usr/bin/env python3\n# _*_ coding:utf-8 _*_\n\"\"\"\n:Author:email@uniontech.com\n:Date :${DATE} ${TIME}\n\"\"\"\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#8","title":"8\u3001\u5176\u4ed6\u89c4\u8303","text":" \u65e5\u5fd7\u6253\u5370\u8981\u5728\u65b9\u6cd5\u6700\u524d\u9762\uff0c\u5426\u5219\u4ee3\u7801\u62a5\u9519\u6ca1\u6709\u65e5\u5fd7\u8f93\u51fa\uff0c\u4e0d\u597d\u5b9a\u4f4d\u95ee\u9898\u3002\uff08\u6211\u4eec\u4f1a\u8003\u8651\u7ee7\u7eed\u4f7f\u7528\u62e6\u622a\u5668\u6253\u5370\u65e5\u5fd7\uff09 \u6240\u6709\u7684\u64cd\u4f5c\u90fd\u9700\u8981\u6709\u65e5\u5fd7\uff0c\u5305\u62ec sleep()\uff0c\u6211\u4eec\u4f1a\u91cd\u5199\u4e00\u4e2a\u6709\u65e5\u5fd7\u8f93\u5165\u7684 sleep\u3002 \u4e1a\u52a1\u5c42\u65e5\u5fd7\u7ea7\u522b\u4e3a INFO\u3002 hook \u51fd\u6570\u53ea\u80fd\u5199\u5230\u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u91cc\u9762\u3002 apps \u76ee\u5f55\u4e0b\u7684 conftest.py \u539f\u5219\u4e0a\u4e0d\u4f1a\u65b0\u589e fixture\u3002 \u56fa\u5b9a\u76ee\u5f55\u6216\u5143\u7d20\u63a7\u4ef6\u7684\u64cd\u4f5c\uff0c\u5c06\u64cd\u4f5c\u65b9\u6cd5\u5199\u6b7b\uff0c\u6587\u4ef6\u7c7b\u64cd\u4f5c\u5c06\u6587\u4ef6\u540d\u7559\u53c2\u6570\u3002 \u8def\u5f84\u62fc\u63a5\u89c4\u8303\uff1a \u7cfb\u7edf\u4e2d\u56fa\u5b9a\u76ee\u5f55\uff0c\u8def\u5f84\u62fc\u63a5\u65f6\u4f7f\u7528\u6ce2\u6d6a\u7b26\u53f7\uff0c\u6bd4\u5982\uff1a~/Desktop/\uff0c\u4e0b\u5c42\u4f7f\u7528 os.path.expanduser()\uff0c\u5b83\u53ef\u4ee5\u81ea\u52a8\u8bc6\u522b\u6ce2\u6d6a\u7b26\u53f7\u3002 \u9879\u76ee\u4e0b\u8def\u5f84\u4f7f\u7528\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u8def\u5f84\uff0c\u6bd4\u5982\uff1aConfig.BASE_PATH\uff0c\u56e0\u4e3a\u9879\u76ee\u662f\u53ef\u4ee5\u5728\u4efb\u610f\u8def\u5f84\u8fd0\u884c\u7684\uff0c\u9700\u8981\u52a8\u6001\u62fc\u63a5\u8def\u5f84\u3002 "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848","text":"# =================================================\n# Author : Mikigo\n# Time : 2022/3/16\n# version \uff1a1.0\n# =================================================\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"AT \u5e94\u7528\u5e93\u6539\u9020\u662f\u57fa\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u8fdb\u884c\u7528\u4f8b\u65b9\u6cd5\u548c\u4e1a\u52a1\u903b\u8f91\u7684\u91cd\u65b0\u8bbe\u8ba1\uff0c\u4ee5\u5b9e\u73b0\u5e94\u7528\u5e93\u9ad8\u6548\u7684\u7f16\u5199\u3001\u7ef4\u62a4\u7528\u4f8b\u53ca\u5176\u65b9\u6cd5\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u6587\u4ef6\u7ba1\u7406\u5668\u4ece\u4e1a\u52a1\u590d\u6742\u5ea6\u548c\u7528\u4f8b\u91cf\u6765\u8bb2\uff0c\u5728\u7cfb\u7edf\u6240\u6709\u5e94\u7528\u4e2d\uff0c\u662f\u5f88\u6709\u4ee3\u8868\u6027\u7684\uff0c\u96be\u5ea6\u4e5f\u662f\u6700\u5927\u7684\uff0c\u56e0\u6b64\u6211\u4eec\u9009\u53d6\u6587\u4ef6\u7ba1\u7406\u5668\u4f5c\u4e3a\u5e94\u7528\u5e93\u6539\u9020\u7684\u5b9e\u9a8c\u5e94\u7528\uff0c\u7ed9\u540e\u7eed\u5176\u4ed6\u5e94\u7528\u6539\u9020\u63d0\u4f9b\u5207\u5b9e\u53ef\u884c\u7684\u601d\u8def\u548c\u65b9\u6848\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u5206\u5c42\u8bbe\u8ba1\u56fe","text":"\u6574\u4f53\u4ecd\u7136\u9075\u5faa PO \u8bbe\u8ba1\u7406\u5ff5\uff0c\u6839\u636e\u4e1a\u52a1\u9700\u8981\uff0c\u5c06\u6587\u7ba1\u4e1a\u52a1\u5c42\u8fdb\u884c 3 \u5c42\u5212\u5206\uff1a "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-dde-file-manager # \u5e94\u7528\u4ed3\u5e93\n\u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 test_xxx_001.py\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u00a0\u251c\u2500\u2500 __init__.py\n\u2502 \u00a0\u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u00a0\u251c\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u00a0\u251c\u2500\u2500 base_widget.py # \u65b9\u6cd5\u57fa\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 title_widget.py # title \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 right_view_widget.py # right view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 left_view_widget.py # left view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 pop_widget.py # pop \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 dfm_widget.py # \u65b9\u6cd5\u7684\u7edf\u4e00\u51fa\u53e3\n\u2502 \u00a0\u2514\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 tag # \u7528\u4f8b\u6807\u7b7e\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 xxx.csv # \u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2514\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u57fa\u7c7b","text":" \u7ee7\u627f\u6838\u5fc3\u5c42\u7684\u5404\u4e2a\u6a21\u5757\u7c7b\u3002 \u62bd\u53d6\u64cd\u4f5c\u5c42\u7684\u4e00\u4e9b\u57fa\u7840\u65b9\u6cd5\u3002 \u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u7684\u4e00\u4e9b\u516c\u5171\u65b9\u6cd5\u3002 \u8def\u5f84\u7ec4\u88c5\u65b9\u6cd5\u3002 \u4e00\u4e9b\u4e1a\u52a1\u5c42\u76f8\u5173\u7684\u53d8\u91cf\u3001\u5e38\u91cf\u3001shell\u547d\u4ee4\u3001\u5750\u6807\u3002 \u65b9\u6cd5\u57fa\u7c7b\u7684\u5199\u6cd5\uff1a from src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u64cd\u4f5c\u5c42","text":" \u6a21\u5757\u5212\u5206 \u6309\u7167\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u6587\u7ba1\u4e3b\u754c\u9762\u5206\u4e3a\u4e09\u4e2a\u533a\u57df\uff1a\u6807\u9898\u680f\u3001\u53f3\u8fb9\u89c6\u56fe\u533a\u57df\u3001\u5de6\u8fb9\u89c6\u56fe\u533a\u57df \u5f39\u7a97\uff1a\u8bbe\u7f6e\u754c\u9762\u5f39\u7a97\u3001\u4fdd\u9669\u7bb1\u5f39\u7a97\u3001\u5220\u9664\u786e\u8ba4\u5f39\u7a97\u3001\u53ca\u5404\u79cd\u7f51\u7edc\u5f39\u7a97 \u53f3\u952e\u83dc\u5355\uff1a\u6682\u65f6\u4e0d\u8003\u8651\u4e3a\u5355\u72ec\u7684\u6a21\u5757\uff0c\u8003\u8651\u4ee5\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6848\u505a\u6210\u516c\u5171\u5e93\u3002 \u5404\u4e2a\u6a21\u5757\u53ea\u7ee7\u627f\u57fa\u7c7b from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u6784\u9020\u51fd\u6570\u91cc\u9762\u4e0d\u6784\u9020\u5bf9\u8c61\uff0c\u53ef\u4ee5\u521d\u59cb\u5316\u4e00\u4e9b\u53d8\u91cf\u3002 \u4e0d\u540c\u7684\u5b9a\u4f4d\u65b9\u6848\u8c03\u7528\u4e0d\u540c\u7684\u5b9a\u4f4d\u5de5\u5177\u5bf9\u8c61\u3002 self.dog\nself.ui\nself.d_bus\n \u65b9\u6cd5\u7f16\u5199 \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u5e94\u7528\u5c42","text":" \u7ee7\u627f\u64cd\u4f5c\u5c42\u7684\u6240\u6709\u7c7b\u3002 \u4ec5\u4ec5\u7528\u4e8e\u7528\u4f8b\u4e2d\u5bfc\u5165\u65b9\u4fbf\uff0c\u4e0d\u505a\u5176\u4ed6\u4e8b\u60c5\u3002 class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n DfmAssert \u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u7ee7\u627f\uff0c\u65b9\u4fbf\u4f7f\u7528\u65ad\u8a00\u8bed\u53e5\u3002 from apps.dde_file_manager.widget.dfm_widget import DfmWidget\nfrom public.assert import Assert\nclass DfmAssert(Assert):\ndef assert_file_exists_in_desktop(self, file_name):\nself.assert_file_exists(f\"~/Desktop{file_name}\")\n...\nDfmWidget().get_file_in_desktop()\n \u7528\u4f8b\u91cc\u9762\u76f4\u63a5\u7ee7\u627f\uff0c\u65b9\u4fbf\u5728\u7528\u4f8b\u91cc\u9762\u4f7f\u7528 self \u8fdb\u884c\u65ad\u8a00\uff0c\u66f4\u7b26\u5408\u65ad\u8a00\u7684\u4f7f\u7528\u4e60\u60ef\uff0c\u7528\u4f8b\u903b\u8f91\u4e0a\u66f4\u6e05\u695a\u3002 class BaseCase(DfmAssert):\npass\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\nself.assert_file_exists_in_desktop(\"xxx\")\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u903b\u8f91\u4e3e\u4f8b","text":"\u7528\u4f8b\u4ee3\u7801\u8c03\u7528\u903b\u8f91\u4e3e\u4f8b\uff1a # BaseWidget\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n# =============================================\n# TitleWidget\nclass TitleWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_title_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# RightViewWidget\nclass RightViewWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_right_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# =============================================\n# \u51fa\u53e3 DfmWidget\nclass DfmWidget(TitleWidget, RightViewWidget):\npass\n# =============================================\n# in case\nfrom apps.dde_file_manager.widget.dfm_widget import DfmWidget\ndfm = DfmWidget()\ndfm.click_xxx_title_by_ui()\ndfm.click_xxx_right_by_ui()\ndfm.dog.print_desc()\ndfm.ui.print_number()\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u5de5\u7a0b\u6539\u9020\u5b9e\u65bd\u6b65\u9aa4","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_2","title":"1\u3001\u5de5\u7a0b\u4ee3\u7801\u62c9\u53d6","text":"1.1. \u5c06\u81ea\u52a8\u5316\u57fa\u7840\u6846\u67b6\u7684\u529f\u80fd\u62c9\u5230\u672c\u5730 Autotest Basic Frame \uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame 1.2. \u5c06\u5e94\u7528\u5e93\u4ee3\u7801\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u5e94\u7528\u5e93\u7684\u4ed3\u5e93\u547d\u540d\u5e94\u8be5\u662f\u957f\u8fd9\u6837\u7684 autotest_deepin_xxx\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_2","title":"2\u3001\u8c03\u6574\u5de5\u7a0b\u76ee\u5f55","text":"\u6309\u7167 \u65b9\u6848\u8bbe\u8ba1-\u76ee\u5f55\u7ed3\u6784 \u8fdb\u884c\u76ee\u5f55\u8c03\u6574\uff0c\u5c3d\u91cf\u4f7f\u7528\u7f16\u8f91\u5668\u8fdb\u884c\u76f8\u5e94\u7684\u8c03\u6574\uff0c\u7f16\u8f91\u5668\u63a8\u8350\u4f7f\u7528 Pycharm \uff0c\u4ee5\u4e0b\u64cd\u4f5c\u5747\u5728 Pycharm \u91cc\u9762\u53ef\u5b9e\u73b0\u3002 2.1. \u9700\u8981\u79fb\u52a8 py \u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u76f4\u63a5\u5728\u7f16\u8f91\u5668\u91cc\u9762\uff0c\u4f7f\u7528\u9f20\u6807\u9009\u4e2d\u5e76\u6309\u4f4f\uff0c\u4e4b\u540e\u62d6\u52a8\u5230\u76ee\u6807\u4f4d\u7f6e\u5373\u53ef\uff0cPycharm \u4f1a\u5c3d\u53ef\u80fd\u7684\u81ea\u52a8\u89e3\u51b3\u79fb\u52a8\u5bfc\u81f4\u7684\u8def\u5f84\u95ee\u9898\u3002\u6ce8\u610f\uff0c\u6211\u8bf4\u7684\u662f\u201c\u5c3d\u53ef\u80fd\u201d\uff0c\u6709\u4e9b\u9a9a\u64cd\u4f5c\u7f16\u8f91\u5668\u662f\u65e0\u6cd5\u81ea\u52a8\u5904\u7406\u7684\u3002\u5982\u679c\u6ca1\u6709\u88ab\u7f16\u8f91\u5668\u81ea\u52a8\u5904\u7406\u7684\u8def\u5f84\u95ee\u9898\uff0c\u540e\u7eed\u53ea\u80fd\u624b\u52a8\u89e3\u51b3\u3002 2.2. \u9700\u8981\u91cd\u547d\u540d\u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u5728\u7f16\u8f91\u5668\u91cc\u9762\u9009\u4e2d\u6587\u4ef6\uff0c\u7136\u540e\u4f7f\u7528\u5feb\u6377\u952e Shift + F6 \uff08\u5982\u679c\u5feb\u6377\u952e\u6ca1\u53cd\u5e94\uff0c\u6587\u4ef6\u53f3\u952e\u83dc\u5355 Refactor \u2014\u2014 Rename\uff09\uff0c\u7136\u540e\u5728\u8f93\u5165\u6846\u4e2d\u8f93\u5165\u8981\u91cd\u547d\u540d\u7684\u540d\u79f0\uff0c\u540c\u65f6\uff0c\u786e\u8ba4\u52fe\u9009 Search for references \u548c Search in comments and strings \u8fd9\u4e24\u4e2a\u9009\u9879\uff0c\u6700\u540e\u6309\u56de\u8f66\u6216\u8005\u9f20\u6807\u70b9 Refactor \u3002 \u6ce8\u610f\uff0c\u6b64\u65f6\u7f16\u8f91\u5668\u53ef\u80fd\u4f1a\u63d0\u793a\u4f60\uff0c\u4f60\u8fd9\u4e2a\u91cd\u547d\u540d\u7684\u64cd\u4f5c\u5173\u8054\u4e86\u591a\u4e2a\u6a21\u5757\uff0c\u5b83\u88ab\u591a\u4e2a\u5730\u65b9\u90fd\u4f7f\u7528\u5230\u4e86\uff0c\u76f8\u5173\u7684\u6a21\u5757\u662f\u5426\u4e5f\u4e00\u8d77\u6539\u540d\u4e86\uff0c\u8fd9\u4e0d\u5e9f\u8bdd\u5417\uff0c\u7528\u8fd9\u4e2a\u529f\u80fd\u5c31\u662f\u60f3\u628a\u5173\u8054\u5230\u7684\u90fd\u4fee\u6539\uff0c\u4e0d\u7136\u6211\u4e3a\u4ec0\u4e48\u4e0d\u7528\u6587\u7ba1\u7684\u91cd\u547d\u540d\u529f\u80fd\u5462\uff0c\u522b\u60f3\u4e86\uff0c\u76f4\u63a5\u70b9\u5de6\u4e0b\u89d2\u7684 Refactor \u6309\u94ae\uff0c\u5c31\u662f\u5e72\u3002 \u7c7b\u540d\u3001\u51fd\u6570\u540d\u7684\u91cd\u547d\u540d\u90fd\u5c3d\u91cf\u91c7\u7528\u8fd9\u79cd\u65b9\u6848\uff0c\u56e0\u4e3a\u7f16\u8f91\u5668\u4f1a\u81ea\u52a8\u7ed9\u6211\u4eec\u627e\u5230\u5173\u8054\u7684\u5730\u65b9\uff0c\u7136\u540e\u540c\u6b65\u4fee\u6539\u6389\u3002\u4f60\u53ef\u5343\u4e07\u522b\u76f4\u63a5\u5220\u4e86\u4fee\u6539\u540d\u79f0\uff0c\u4e0d\u7136\u4f60\u53ef\u80fd\u4f1a\u82b1\u4e0a\u4e00\u5929\u7684\u65f6\u95f4\u6765\u89e3\u51b3\u91cd\u547d\u540d\u7684\u95ee\u9898\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u5b9e\u73b0\u6838\u5fc3\u5e93\u63a5\u53e3","text":"3.1. BaseWidget \u5728 BaseWidget \u91cc\u9762\u628a\u8be5\u5199\u7684\u90fd\u5199\u597d\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u4e0a\u9762\u7684\u8bbe\u8ba1\u7406\u5ff5\u6765\u5199\u3002 \u5982\u679c\u4f60\u5acc\u9ebb\u70e6\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u6587\u7ba1\u7684\u5b9e\u9645\u5de5\u7a0b\u4ee3\u7801 autotest_dde_file_manager : https://gerrit.uniontech.com/admin/repos/autotest_dde_file_manager \u3002 3.2. \u64cd\u4f5c\u5c42 \u5982\u679c\u4f60\u662f\u65b0\u5199\u9879\u76ee\uff0c\u4f60\u4f1a\u53d1\u73b0\u4e00\u5207\u90fd\u662f\u90a3\u4e48\u7684\u7b80\u5355\u3001\u76f4\u63a5\uff0c\u6309\u7167\u6211\u4eec\u63d0\u4f9b\u7ed9\u4f60\u7684\u63a5\u53e3\u5199\u7528\u4f8b\u7684\u64cd\u4f5c\u65b9\u6cd5\u5c31\u597d\u4e86\u3002 \u5982\u679c\u4f60\u662f\u60f3\u5bf9\u539f\u6765\u7684\u5de5\u7a0b\u8fdb\u884c\u6539\u9020\uff0c\u4f60\u9700\u8981\u6309\u7167\u6838\u5fc3\u5e93\u65b9\u6cd5\u7684\u8c03\u7528\uff0c\u5c06\u4f60\u4e4b\u524d\u5199\u7684\u6bcf\u4e2a\u65b9\u6848\u8fdb\u884c\u5bf9\u5e94\u7684\u4fee\u6539\uff0c\u5305\u62ec\u7c7b\u548c\u65b9\u6cd5\u7684\u547d\u540d\u3001\u65b9\u6cd5\u5185\u6240\u8981\u7528\u5230\u4e0d\u540c\u5b9a\u4f4d\u65b9\u6cd5\u7684\u5199\u6cd5\u4fee\u6539\u3002 \u8fd9\u65f6\u5019\u4f60\u53ef\u80fd\u4f60\u7684\u4ee3\u7801\u4e2d\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u62a5\u9519\uff0c\u4e0d\u7528\u62c5\u5fc3\uff0c\u4f60\u53ef\u4ee5\u4ece\u4e1a\u52a1\u903b\u8f91\u51fa\u53d1\uff0c\u60f3\u6e05\u695a\u8fd9\u4e2a\u65b9\u6cd5\u662f\u5e72\u4ec0\u4e48\u7684\u3001\u64cd\u4f5c\u7684\u5bf9\u8c61\u662f\u4ec0\u4e48\u3001\u53c2\u6570\u662f\u4ec0\u4e48\uff0c\u6ce8\u610f\u8fd9\u4e9b\u4fee\u6539\u662f\u4f1a\u5f71\u54cd\u5230\u7528\u4f8b\u4ee3\u7801\u91cc\u9762\u7684\uff0c\u6ca1\u5173\u7cfb\uff0c\u7528\u4f8b\u91cc\u9762\u672c\u6765\u4e5f\u5e94\u8be5\u88ab\u5173\u8054\u4fee\u6539\u3002 3.3. \u628a\u914d\u7f6e\u6a21\u5757\u5199\u597d\uff0c\u8fd9\u90e8\u5206\u57fa\u672c\u53ef\u4ee5\u590d\u5236\u6587\u7ba1\u7684\u4ee3\u7801\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4_1","title":"4\u3001\u8def\u5f84\u5904\u7406","text":"4.1. \u5bfc\u5165\u8def\u5f84 \u65b9\u6cd5\u548c\u7528\u4f8b\u4e2d\u90fd\u4f1a\u6d89\u53ca\u5230\u5bfc\u5165\u8def\u5f84\u7684\u4fee\u6539\uff0c\u5728\u4fee\u6539\u8def\u5f84\u65f6\uff0c\u5efa\u8bae\u4f60\u4f7f\u7528 Ctrl + Shift + R \u5168\u5c40\u66ff\u6362\uff0c\u4f1a\u5c06\u6574\u4e2a\u9879\u76ee\u4e0b\u7684\u76f8\u540c\u5730\u65b9\u90fd\u4fee\u6539\u5230\uff0c\u5f53\u7136\uff0c\u4f60\u4e5f\u53ef\u4ee5\u5728\u5c0f\u5f39\u7a97\u4e2d\u4fee\u6539\u5168\u5c40\u66ff\u6362\u4e3a\u5c40\u90e8\u76ee\u5f55\u4e0b\u66ff\u6362\u3002\u5904\u7406\u90a3\u79cd\u6ca1\u6709\u5173\u8054\u5173\u7cfb\uff0c\u4f46\u662f\u53c8\u662f\u76f8\u540c\u540d\u79f0\u7684\u91cd\u547d\u540d\uff0c\u6211\u4e5f\u63a8\u8350\u4f7f\u7528\u8fd9\u79cd\u65b9\u5f0f\u8fdb\u884c\u91cd\u547d\u540d\u3002 \u6ce8\u610f\uff0c\u5168\u5c40\u66ff\u6362\u7684\u65b9\u5f0f\u4efb\u7136\u65e0\u6cd5\u4fdd\u8bc1\u771f\u7684\u5168\u5c40\u88ab\u66ff\u6362\u4e86\uff08\u53ef\u80fd\u662f\u7f16\u8f91\u5668\u7684 Bug \u5427\uff09\uff0c\u6240\u4ee5\u4f60\u4ecd\u7136\u9700\u8981\u624b\u52a8\u770b\u4e0b\u5404\u5904\u662f\u5426\u4fee\u6539\u5230\u4f4d\u3002 4.2. \u8d44\u6e90\u8def\u5f84 \u4e00\u4e9b\u7528\u4f8b\u8d44\u6e90\u9700\u8981\u6839\u636e config.py \u91cc\u9762\u7684\u8def\u5f84\u914d\u7f6e\u8fdb\u884c\u8d44\u6e90\u8def\u5f84\u7684\u62fc\u63a5\uff0c\u5982\u679c\u4f60\u539f\u6765\u672c\u6765\u5c31\u6709\u4e00\u4e2a\u51fd\u6570\u4e13\u95e8\u7528\u4e8e\u7ec4\u88c5\u8def\u5f84\u7684\uff0c\u90a3\u4f60\u53ea\u9700\u8981\u4fee\u6539\u8fd9\u4e00\u4e2a\u5730\u65b9\u5c31\u597d\u4e86\uff0c\u5982\u679c\u4f60\u4e4b\u524d\u5e76\u6ca1\u6709\u8fd9\u6837\u7684\u8bbe\u8ba1\uff0c\u90a3\u53ef\u80fd\u9700\u8981\u4fee\u6539\u5927\u91cf\u6d89\u53ca\u5230\u8d44\u6e90\u8def\u5f84\u7684\u5730\u65b9\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5","title":"5\u3001\u8c03\u8bd5\u548c\u7f16\u5199\u7528\u4f8b","text":"\u4ee5\u4e0a\u51e0\u4e2a\u6b65\u9aa4\u505a\u5b8c\uff0c\u57fa\u672c\u5c31\u53ef\u4ee5\u8fdb\u884c\u7528\u4f8b\u4ee3\u7801\u7684\u8c03\u8bd5\u4e86\uff0c\u8fd9\u90e8\u5206\u5de5\u4f5c\u4e3b\u8981\u89e3\u51b3\u4f60\u4e4b\u524d\u51e0\u4e2a\u6b65\u9aa4\u9057\u6f0f\u7684\u95ee\u9898\uff0c\u5982\u679c\u6240\u6709\u7528\u4f8b\u90fd\u8c03\u8bd5\u901a\u8fc7\u4e86\uff0c\u90a3\u4e48\u5de5\u7a0b\u6539\u9020\u5c31\u5168\u90e8\u5b8c\u6210\u4e86\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/","title":"AT \u5f00\u53d1\u89c4\u8303","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u5f00\u53d1\u89c4\u8303\u662f\u6839\u636e\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fd0\u884c\u4e24\u5e74\u591a\u6765\uff0c\u9047\u5230\u95ee\u9898\u89e3\u51b3\u95ee\u9898\u800c\u5f62\u6210\u7684\u4e00\u4e9b\u89e3\u51b3\u65b9\u6848\uff0c\u6216\u8005\u8bf4\u7ecf\u9a8c\u603b\u7ed3\uff1b\u8fd9\u4e9b\u7ecf\u9a8c\u7b26\u5408\u6211\u4eec\u73b0\u9636\u6bb5 AT \u6240\u5e94\u7528\u7684\u573a\u666f\u9700\u8981\uff0c\u4e5f\u662f\u6211\u4eec\u7ecf\u8fc7\u957f\u671f\u601d\u8003\uff0c\u4e0d\u65ad\u8bd5\u9519\u4e0d\u65ad\u4fee\u6b63\uff0c\u5e76\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u5b9e\u8df5\u4e2d\u68c0\u9a8c\u8fc7\u53ef\u884c\u7684\u3002\u4ee5\u6b64\uff0c\u5e0c\u671b\u80fd\u5e2e\u52a9\u53c2\u4e0e\u5230\u81ea\u52a8\u5316\u7684\u76f8\u5173\u4eba\u5458\u51cf\u5c11\u8bd5\u9519\u6210\u672c\uff0c\u66f4\u597d\u3001\u66f4\u5feb\u7684\u7f16\u5199\u7528\u4f8b\u53ca\u7ef4\u62a4\u7528\u4f8b\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_1","title":"\u4e00\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u89c4\u8303","text":"\u6807\u7b7e\u5316\u7ba1\u7406\u6587\u6863\u8bf7\u53c2\u8003\uff1a \u300a\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u64cd\u4f5c\u6307\u5f15\u300b \u4ee5\u4e0b\u8bf4\u51e0\u4e2a\u5bb9\u6613\u51fa\u73b0\u7684\u95ee\u9898\uff1a"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1","title":"1. \u5bf9\u5e94\u5173\u7cfb","text":" \u5199\u5b8c\u81ea\u52a8\u5316\u7528\u4f8b\u4e4b\u540e\uff0c\u8bf7\u5728 CSV \u6587\u4ef6\u4e2d\u6807\u8bb0\u7528\u4f8b\u7684 ID\u3001\u7b49\u7ea7\u3002\u4e3a\u4e86\u63d0\u9192\u6807\u8bb0\uff0c\u6267\u884c\u7528\u4f8b\u65f6\u5728\u9996\u884c\u4f1a\u8f93\u51fa ERROR \u65e5\u5fd7\uff1a CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94\u7684 ID\uff1b \u5728\u6700\u7ec8\u63d0\u4ea4\u4ee3\u7801\u4e4b\u524d\uff0c\u4f60\u9700\u8981\u5728 CSV \u6587\u4ef6\u91cc\u9762\u5c06ID\u3001\u7528\u4f8b\u7b49\u7ea7\u7b49\u6807\u7b7e\u8865\u5168\uff0c\u5982\u679c CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94 ID\uff0c\u540e\u7eed\u5728\u6279\u91cf\u6267\u884c\u7684\u65f6\u5019\uff0c\u8fd9\u4e9b\u7528\u4f8b\u662f\u4e0d\u4f1a\u6267\u884c\u7684\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2","title":"2. \u540d\u79f0\u4e00\u81f4","text":" CSV \u6587\u4ef6\u7684\u6587\u4ef6\u540d\u3001\u7528\u4f8b\u51fd\u6570\u4e2d\u95f4\u7684\u540d\u79f0\u4e00\u81f4\u3001\u7528\u4f8b py \u6587\u4ef6\u4e2d\u95f4\u7684\u540d\u79f0\uff0c\u8fd9\u4e09\u4e2a\u540d\u79f0\u4e00\u81f4\u3002 \u4e3e\u4f8b\uff1a # test_music_001.py\ndef test_music_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u90a3\u4e48 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e3a music.csv\u3002 AT \u6846\u67b6\u5e95\u5c42\u4ee3\u7801\u5b9e\u73b0\u662f\u5c06 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e0e\u7528\u4f8b\u51fd\u6570\u540d\u79f0\u540d\u79f0\uff08item.name\uff09\u8fdb\u884c\u5bf9\u5e94\uff0c\u56e0\u6b64\uff0c\u6ce8\u610f CSV \u6587\u4ef6\u540d\u79f0\u5bf9\u5e94\u7684\u662f\u7528\u4f8b\u51fd\u6570\u540d\u79f0\uff0c\u5373 def test_music_001 \u91cc\u9762\u7684 music \uff0c\u800c\u4e0d\u662f test_music_001.py \u91cc\u9762\u7684 music \u3002 \u8fd9\u91cc\u7ec6\u7ec6\u54c1\u4e00\u4e0b\u54c8~ \u5982\u679c\u4f60\u5c06\u4e0a\u4f8b\u5199\u6210\u4e86\u8fd9\u6837: # test_music_001.py\ndef test_movie_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u7528\u4f8b\u6267\u884c\u6ca1\u95ee\u9898\uff0c\u4f46\u662f\u6807\u7b7e\u5316\u7ba1\u7406\u662f\u4e0d\u751f\u6548\u7684\uff0c\u6846\u67b6\u65e0\u6cd5\u5c06 music.csv\u6587\u4ef6\u91cc\u9762\u6807\u7b7e\uff0c\u6dfb\u52a0\u5230 test_movie_001\u8fd9\u4e2a\u7528\u4f8b\u4e2d\uff0c\u56e0\u4e3a\u4ed6\u4eec\u6ca1\u6709\u5bf9\u5e94\u5173\u7cfb\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#tag","title":"\u4e8c\u3001\u5206\u652f\u53ca tag \u7ba1\u7406\u89c4\u8303","text":"\u53c2\u8003\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u4ee3\u7801\u7ba1\u7406\u89c4\u8303\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2-tag","title":"2. \u5e94\u7528\u5e93 tag","text":" \u5e94\u7528\u5e93 tag \u6839\u636e\u5e94\u7528\u4ea4\u4ed8\u8282\u70b9\u751f\u6210\uff0c\u6bcf\u6b21\u6253 tag \u4e4b\u524d\uff0c\u76f8\u5173\u6d4b\u8bd5\u4eba\u5458\u9700\u8981\u8fdb\u884c\u7528\u4f8b\u8c03\u8bd5\uff1b \u8c03\u8bd5\u7528\u4f8b\u662f\u6307\u7684\u5728\u5168\u67b6\u6784\uff08x86\u3001arm\u3001mips\uff09\u4e0a\u8c03\u8bd5\u901a\u8fc7\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\u8fbe\u5230 90% \u4ee5\u4e0a\u624d\u80fd\u6253 tag\uff0c\u901a\u8fc7 Jenkins \u6267\u884c\u5668\u6267\u884c\u7528\u4f8b\uff0c\u4fdd\u7559\u901a\u8fc7\u7387\u7ed3\u679c\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\uff1a\u901a\u8fc7\u7528\u4f8b\u6570 / (\u603b\u7528\u4f8b\u6570 - \u5df2\u5e9f\u5f03\u7528\u4f8b) \u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u7b97\u901a\u8fc7 Jenkins \u6267\u884c\u5668 \u4f60\u53ef\u80fd\u4f1a\u5728\u4e00\u4e2a\u4ea4\u4ed8\u5468\u671f\u5185\u6301\u7eed\u7684\u8fdb\u884cAT\u7528\u4f8b\u8c03\u8bd5\uff0c\u4f46\u662f\u6700\u7ec8 AT \u7528\u4f8b\u6253 tag \u7684\u5e94\u7528\u7248\u672c\uff0c\u9700\u8981\u4f7f\u7528\u5e94\u7528\u96c6\u6210\u4ea4\u4ed8\u7684\u6700\u65b0\u5e94\u7528\u7248\u672c\uff0c\u53ef\u4ee5\u4f7f\u7528\u5e94\u7528\u7684\u63d0\u6d4b\u7248\u672c\uff1b\u4e00\u5b9a\u8981\u786e\u4fdd\u8c03\u8bd5\u7528\u4f8b\u7684\u5e94\u7528\u7248\u672c\u662f\u6700\u65b0\u7684\uff0c\u4e0d\u7136\u96c6\u6210\u8fdb\u53bb\u4e4b\u540e\uff0c\u6301\u7eed\u96c6\u6210\u5c31\u4f1a\u51fa\u95ee\u9898\uff1b tag \u53f7\u600e\u4e48\u6253\uff1f \u6839\u636e\u6301\u7eed\u96c6\u6210\u7684\u8981\u6c42\u751f\u6210\uff0c\u5176\u4e2d\u5e94\u7528\u7248\u672c\u53f7\u9700\u8981\u4e0e\u9879\u76ee\u7ecf\u7406\u786e\u8ba4\u672c\u6b21\u5373\u5c06\u96c6\u6210\u7684\u5e94\u7528\u7248\u672c\u53f7\u662f\u591a\u5c11\uff1b tag \u7684 commit \u4fe1\u606f\u683c\u5f0f\uff1a # commit msg\nversion:5.6.5\n \u5176\u4e2d 5.6.5 \u5199\u5e94\u7528\u7684\u96c6\u6210\u7248\u672c\u53f7\u3002 \u751f\u6210 tag \u7684\u547d\u4ee4\u53c2\u8003\uff1a\u300aGit \u6807\u7b7e\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3-tag","title":"3. \u57fa\u7840\u6846\u67b6 tag","text":"\u57fa\u7840\u6846\u67b6 tag \u4e0d\u4e0e\u4e1a\u52a1\u6302\u94a9\uff0c\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u6309\u9700\u53d1\u5e03\u7248\u672c\uff0c\u5728\u6839\u76ee\u5f55\u4e0b CURRENT \u6587\u4ef6\u4e2d\u8bb0\u5f55\u7684\u5f53\u524d\u7248\u672c\u53f7\u548c\u5386\u53f2\u7248\u672c\u53f7\uff0c\u53ca\u5176\u5bf9\u5e94\u65b0\u589e\u4e86\u54ea\u4e9b\u529f\u80fd\uff0c\u6709\u52a9\u4e8e\u5e94\u7528\u9009\u62e9\u5408\u9002\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\u3002 # CURRENT\n[current]\ntag = 0.9.5\n \u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u7684 control \u6587\u4ef6\u8bb0\u5f55\u5f53\u524d\u5e94\u7528\u5e93\u4f9d\u8d56\u7684\u57fa\u7840\u5e93\u7248\u672c\u3002 # control\n[Depends]\nautotest-basic-frame = 0.9.5\n \u7528\u4f8b\u5728\u6267\u884c\u65f6\u4f1a\u6821\u9a8c\u4e24\u4e2a\u6587\u4ef6\u7684\u7248\u672c\u53f7\u662f\u5426\u4e00\u81f4\uff0c\u5982\u679c\u4e0d\u4e00\u81f4\uff0c\u4f1a\u6253\u5370 error \u65e5\u5fd7\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_2","title":"\u4e09\u3001\u4ed3\u5e93\u6743\u9650\u7ba1\u7406","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_1","title":"1. \u57fa\u7840\u6846\u67b6","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u4ed3\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame \u57fa\u7840\u6846\u67b6\u4e0d\u5141\u8bb8\u533f\u540d\u8bbf\u95ee\uff0c\u5982\u679c\u4f60\u767b\u5f55 gerrit \u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u8bbf\u95ee\u4ee5\u4e0a\u94fe\u63a5\uff0c\u5219\u9700\u8981\u7533\u8bf7\u8bbf\u95ee\u6743\u9650\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_1","title":"2. \u5e94\u7528\u4ed3\u5e93","text":" \u81ea\u52a8\u5316\u5e94\u7528\u4ed3\u5e93\uff1a https://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684 app_name \u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_3","title":"\u56db\u3001\u65b9\u6cd5\u7f16\u5199&\u8c03\u7528\u89c4\u8303","text":"\u65b9\u6cd5\u7f16\u5199\u6574\u4f53\u8bbe\u8ba1\u601d\u8def\u53c2\u8003\uff1a[\u300aAT\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b]"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_2","title":"1. \u65b9\u6cd5\u7f16\u5199","text":"\u5199\u65b9\u6cd5\u7684\u65f6\u5019\u6ce8\u610f\u65b9\u6cd5\u5f52\u5c5e\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget\uff0c\u65b9\u6cd5\u662f\u5728\u54ea\u4e2a\u533a\u57df\u64cd\u4f5c\u7684\uff0c\u5c31\u5199\u5728\u54ea\u4e2a\u7c7b\u91cc\u9762\u3002 \u4e3e\u4f8b\uff1a from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n\"\"\"\u70b9\u51fb\u6807\u9898\u680fxxx\"\"\"\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_2","title":"2. \u65b9\u6cd5\u8c03\u7528","text":" \u5728\u7528\u4f8b\u4e2d\u8c03\u7528\u65b9\u6cd5\uff0c\u901a\u8fc7\u8be5\u5e94\u7528\u552f\u4e00\u7684\u51fa\u53e3\u8fdb\u884c\u8c03\u7528\uff0c\u6bd4\u5982\u6587\u7ba1\uff1a class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n \u4e0d\u8981\u5728\u7528\u4f8b\u4e2d\u5355\u72ec\u53bb\u8c03\u7528 TitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u8fd9\u4e9b\u7c7b\uff0c\u5426\u5219\u540e\u671f\u7528\u4f8b\u4f1a\u53d8\u5f97\u4e0d\u597d\u7ef4\u62a4\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_4","title":"\u4e94\u3001\u7528\u4f8b\u7f16\u5199\u89c4\u8303","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_3","title":"1. \u57fa\u4e8e\u7c7b\u5199\u7528\u4f8b","text":"\u6240\u6709\u7528\u4f8b\u90fd\u5e94\u8be5\u57fa\u4e8e\u7c7b\u53bb\u5199\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001(self):\n\"\"\"\u97f3\u4e50\u542f\u52a8\"\"\"\n \u6ce8\u610f\u4ee5\u4e0b\u51e0\u70b9\uff1a \u7c7b\u540d\u4e0d\u8981\u968f\u4fbf\u53d6\uff0c\u540c\u4e00\u4e2a\u5e94\u7528\u5e94\u8be5\u4f7f\u7528\u540c\u4e00\u4e2a\u7c7b\u540d\uff0c\u7528\u4f8b\u7c7b\u540d\u79f0\u5fc5\u987b\u4ee5 Test \u5f00\u5934\uff0c\u9075\u5faa\u5927\u9a7c\u5cf0\u547d\u540d\u89c4\u8303\uff1b \u7528\u4f8b\u7c7b\u7ee7\u627f BaseCase\uff0c\u4e00\u4e2a\u5e94\u7528\u53ea\u6709\u4e00\u4e2a BaseCase \u4e00\u4e2a py \u6587\u4ef6\u91cc\u9762\u53ea\u6709\u4e00\u4e2a\u7c7b\uff0c\u6211\u4eec\u79f0\u4e3a\u4e00\u4e2a\u6d4b\u8bd5\u7c7b\uff1b \u4e00\u4e2a\u7c7b\u91cc\u9762\u53ef\u4ee5\u6709\u591a\u4e2a\u7528\u4f8b\u51fd\u6570\uff0c\u8fd9\u53d6\u51b3\u8fd9\u6761\u7528\u4f8b\u6709\u591a\u5c11\u4e2a\u6d4b\u8bd5\u70b9\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001_1(self):\n\"\"\"\u4efb\u52a1\u680f\u542f\u52a8\u97f3\u4e50\"\"\"\ndef test_music_001_2(self):\n\"\"\"\u542f\u52a8\u5668\u542f\u52a8\u97f3\u4e50\"\"\" \ndef test_music_001_3(self):\n\"\"\"\u684c\u9762\u542f\u52a8\u97f3\u4e50\"\"\"\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_3","title":"2. \u7528\u4f8b\u51fd\u6570\u89c4\u8303","text":" \u7528\u4f8b\u51fd\u6570\u4ee5 test \u5f00\u5934\uff0c\u9075\u5faa\u86c7\u5f62\u547d\u540d\u89c4\u8303\uff0c\u4e2d\u95f4\u4e3a\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0\uff0c\u540e\u9762\u52a0\u7528\u4f8b ID\uff0c\u6700\u540e\u52a0\u6d4b\u8bd5\u70b9\u5e8f\u53f7\uff0c\u5373 test_${module}_${case_id}[_${index}] \uff1b \u6bd4\u5982\uff1atest_music_001_1\uff0cindex \u4ece 1 \u5f00\u59cb\u3002 \u51fd\u6570\u529f\u80fd\u8bf4\u660e\u91cc\u9762\u5199\u7528\u4f8b\u6807\u9898\uff0c\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u6807\u9898\u5373\u53ef\uff0c\u6ce8\u610f\u7528\u4e09\u5bf9\u53cc\u5f15\u53f7\uff0c\u4e0d\u8981\u7528\u5176\u4ed6\u6ce8\u91ca\uff0c\u66f4\u4e0d\u8981\u7528\u4e95\u53f7\u6ce8\u91ca\u5199\u7528\u4f8b\u6807\u9898\uff1b \u76f4\u63a5\u590d\u5236 PMS \u7528\u4f8b \u7528\u4f8b\u6b65\u9aa4\u76f4\u63a5\u5c06 PMS \u4e0a\u7528\u4f8b\u6b65\u9aa4\u548c\u9884\u671f\u590d\u5236\u8fdb\u6765\uff0c\u7136\u540e\u8fdb\u884c\u6279\u91cf\u6ce8\u91ca\uff08ctrl + /\uff09\uff0c\u5728\u6ce8\u91ca\u7684\u57fa\u7840\u4e0a\u53bb\u5199\u7528\u4f8b\u811a\u672c\u4f1a\u66f4\u52a0\u65b9\u4fbf\u5168\u9762\uff0c\u4e5f\u6bd4\u4f60\u81ea\u5df1\u5199\u6ce8\u91ca\u66f4\u8282\u7ea6\u65f6\u95f4\uff1a \u4e3e\u4f8b\uff0cPMS \u7528\u4f8b\uff1a \u76f4\u63a5\u9009\u4e2d\u7528\u4f8b\u5185\u5bb9\uff0c\u590d\u5236\u4e0b\u6765\uff0c\u7136\u540e\u7c98\u8d34\u5230\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c\u4e2d\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\n \u4e0a\u4f8b\u4e2d\u4e95\u53f7\u6ce8\u91ca\u90e8\u5206\u5c31\u662f\u76f4\u63a5\u4ece PMS \u4e0a\u590d\u5236\u8fc7\u6765\u7684\uff0c\u5728\u6b64\u57fa\u7840\u4e0a\u5199\u7528\u4f8b\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\nmusic = DeepinMusicWidget()\nmusic.click_singer_btn_in_music_by_ui()\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\nmusic.click_icon_mode_in_music_by_ui()\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\nmusic.double_click_first_singer_in_singer_icon_view_by_ui()\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\nself.assert_xxx\n \u4f60\u770b\uff0c\u975e\u5e38\u6e05\u695a\u6bcf\u4e00\u6b65\u5728\u505a\u4ec0\u4e48\uff0c\u91cd\u70b9\u662f\u7701\u53bb\u4e86\u5199\u6ce8\u91ca\u7684\u65f6\u95f4\uff0c\u771f\u7684\u7092\u9e21\u65b9\u4fbf\u3002 \u4e0d\u5199 if __name__ == '__main__':\uff0c\u4e0d\u5199\u591a\u4f59\u7684\u4ee3\u7801\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3","title":"3. \u6570\u636e\u9a71\u52a8","text":" \u5982\u679c\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u662f\u76f8\u540c\u7684\uff0c\u53ea\u662f\u4e00\u4e9b\u53c2\u6570\u53d8\u5316\uff0c\u5c3d\u91cf\u4f7f\u7528\u6570\u636e\u9a71\u52a8\u6765\u5b9e\u73b0\u7528\u4f8b\uff1b \u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u6570\u636e\u9a71\u52a8\u7684\u6570\u636e\uff0c\u4e0d\u80fd\u56e0\u6b64\u5f15\u5165\u4f9d\u8d56\uff0c\u5c3d\u91cf\u4f7f\u7528\u4e00\u4e9b\u6807\u51c6\u5e93\u80fd\u8bfb\u53d6\u7684\u6587\u4ef6\u683c\u5f0f\uff0c\u6bd4\u5982 json\u3001ini\u3001CSV\u3001xml\u3001txt \u7b49\u6587\u4ef6\u683c\u5f0f\uff1b\u4e0d\u5efa\u8bae\u4f7f\u7528 Yaml\u3001Excel\u3001MySQL \u7b49\u6570\u636e\u683c\u5f0f\uff1b \u8bfb\u53d6\u6570\u636e\u65f6\u4e5f\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff0c\u5982\u4f7f\u7528 pandas \u5904\u7406 CSV \u5c31\u5c5e\u4e8e\u5927\u6750\u5c0f\u7528\u4e86\uff0c\u6b63\u5e38\u7684\u6570\u636e\u9a71\u52a8\u8fd8\u6ca1\u5230\u9700\u8981\u5927\u6570\u636e\u5206\u6790\u6765\u5904\u7406\u7684\u5730\u6b65\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u5728 widget/ddt/ \u76ee\u5f55\u4e0b\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5199\u6cd5\uff1a @pytest.mark.parametrize(\"value\", data)\ndef test_smb_049(self, value):\n \u4ee5\u4e0a\u8fd9\u79cd\u53c2\u6570\u5316\u7684\u5199\u6cd5\u672c\u8eab\u6ca1\u4ec0\u4e48\u95ee\u9898\uff0c\u4f46\u662f\uff0c\u8fd9\u91cc\u5fc5\u987b\u8981\u8865\u5145\u4e00\u4e2a\u6ca1\u6709\u7528\u7684\u5c0f\u77e5\u8bc6\uff1a \u5982\u679c\u53c2\u6570\u5316\u6570\u636e\u91cc\u9762\u7684\u5b57\u7b26\u4f1a\u539f\u5c01\u4e0d\u52a8\u7684\u8f93\u51fa\u5230 item.name \u91cc\u9762\uff0c\u663e\u793a\u975e\u5e38\u4e0d\u4f18\u96c5\uff0c\u800c\u4e14\u53ef\u4ee5\u4f1a\u5f15\u5165\u4e00\u4e9b\u610f\u60f3\u4e0d\u5230\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u611f\u53d7\u4e00\u4e0b\uff1a \u53c2\u6570\uff1a data = [\n\"\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\", \"qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678\",\n]\n \u73b0\u8c61\u662f\u8fd9\u6837\u8272\u513f\u7684\uff1a test_smb_049.py::TestFileManager::test_smb_049[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09]\ntest_smb_049.py::TestFileManager::test_smb_049[qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui]\ntest_smb_049.py::TestFileManager::test_smb_049[12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678]\n \u8bf4\u5b9e\u8bdd\uff0c\u770b\u7740\u5fc3\u91cc\u5835\u5f97\u614c\uff0c\u5982\u679c\u8fd9\u91cc\u9762\u5305\u542b\u4e00\u4e9b\u7279\u6b8a\u5b57\u7b26\u6216\u8005\u662f\u8d85\u957f\uff0c\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u5f88\u5947\u5999\u7684\u4e8b\u60c5\u53d1\u751f\u3002 parametrize \u91cc\u9762\u6709\u4e2a\u53c2\u6570\uff1aids\uff0c\u53ef\u4ee5\u89e3\u51b3\u6b64\u7c7b\u95ee\u9898\uff0c\u5c31\u50cf\u8fd9\u6837\uff1a @pytest.mark.parametrize(\"value\", data, ids=[1, 2, 3])\ndef test_smb_049(self, value):\n \u518d\u6765\u611f\u53d7\u4e00\u4e0b\uff1a test_smb_049.py::TestFileManager::test_smb_049[1]\ntest_smb_049.py::TestFileManager::test_smb_049[2]\ntest_smb_049.py::TestFileManager::test_smb_049[3]\n \u660e\u663e\u597d\u591a\u4e86\uff0c\u6240\u4ee5\u5c3d\u91cf\u4f7f\u7528 ids \u8fd9\u4e2a\u53c2\u6570\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 fixture \u7684\u6570\u636e\u9a71\u52a8\u65b9\u5f0f\uff0c\u6846\u67b6\u867d\u7136\u652f\u6301\uff0c\u4f46\u53ef\u8bfb\u6027\u6bd4\u8f83\u5dee\uff1b\u5982\u679c\u4f60\u4e0d\u77e5\u9053\u8fd9\u53e5\u8bdd\u5728\u8bf4\u5565\uff0c\u90a3\u4f60\u53ef\u4ee5\u5ffd\u7565\uff0c\u6211\u4e5f\u4e0d\u6253\u7b97\u8be6\u7ec6\u8bf4\u8fd9\u79cd\u5b9e\u73b0\u65b9\u5f0f\uff0c\u64cd\u4f5c\u6bd4\u8f83\u9a9a\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4","title":"4. \u65ad\u8a00\u8d44\u6e90","text":" \u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u76f4\u63a5\u653e\u5728\u7528\u4f8b\u6a21\u5757\u7684\u540c\u7ea7\u76ee\u5f55\u4e0b\u7684 assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0 + \u7528\u4f8b ID \u547d\u540d\uff1b \u56fe\u50cf\u8bc6\u522b\u65ad\u8a00\uff0c\u4e0d\u8981\u622a\u53d6\u4e00\u5f20\u5f88\u5927\u7684\u56fe\uff0c\u56fe\u7247\u8d44\u6e90\u5305\u542b\u7684\u5143\u7d20\u592a\u591a\u4e86\uff0c\u975e\u5e38\u5bb9\u6613\u53d7\u5230\u9700\u6c42\u5f71\u54cd\uff0c\u5efa\u8bae\u662f\u8fdb\u884c\u5c40\u90e8\u7684\u65ad\u8a00\uff1b \u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u5339\u914d\u5ea6\u662f 0.9\uff0c\u5982\u679c\u65ad\u8a00\u7684\u573a\u666f\u5bf9\u4e8e\u7cbe\u786e\u5ea6\u8981\u6c42\u6ca1\u90a3\u4e48\u9ad8\uff0c\u53ef\u4ee5\u5728\u65ad\u8a00\u8bed\u53e5\u91cc\u9762\u4f20\u5165\u5c0f\u4e8e 0.9 \u7684\u53c2\u6570\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5","title":"5. \u5143\u7d20\u5b9a\u4f4d","text":" \u7528\u4e8e\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u4e2d\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u547d\u540d\u4e3a\u8be5\u5143\u7d20\u7684\u540d\u79f0\uff1b \u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u622a\u53d6\u65f6\u5c3d\u91cf\u7cbe\u786e\u5230\u8fd9\u4e2a\u5177\u4f53\u7684\u6309\u94ae\uff0c\u56fe\u7247\u4e5f\u4e0d\u8981\u592a\u5927\uff1b \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u64cd\u4f5c\u8f83\u5feb\uff0c\u5408\u7406\u52a0\u5165\u7b49\u5f85\u65f6\u95f4\u80fd\u63d0\u9ad8\u7528\u4f8b\u7684\u7a33\u5b9a\u6027\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6","title":"6. \u7528\u4f8b\u8d44\u6e90","text":" \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u4f7f\u7528\u5230\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u6bd4\u5982\u97f3\u4e50\u53ef\u80fd\u9700\u8981\u4e00\u4e9b mp3 \u7684\u8d44\u6e90\u7528\u4e8e\u6d4b\u8bd5\uff0c\u5b58\u653e\u5728 widget/case_res \u76ee\u5f55\u4e0b\uff0c\u524d\u63d0\u662f\u8fd9\u4e9b\u8d44\u6e90\u4e0d\u8d85\u8fc7 10M\uff1b \u5982\u679c\u662f\u4e00\u4e9b\u6bd4\u8f83\u5927\u7684\u8d44\u6e90\uff0c\u5efa\u8bae\u653e\u5230\u7edf\u4e00\u7684 ftp \u670d\u52a1\u5668 \uff08ftp://10.8.10.245\uff09\uff0c\u9700\u8981\u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\u518d\u4e0b\u8f7d\u4e0b\u6765\uff1b f\"wget ftp://{Config.FTP_IP}/uploads/\u591a\u5a92\u4f53/\u5f71\u9662/auto/{file_name};unzip {file_name};rm -rf {file_name};\"\n \u6d4b\u8bd5\u8d44\u6e90\u4e0b\u8f7d\u5230\u5e94\u7528 widget/case_res \u76ee\u5f55\u4e0b\uff1b \u7981\u6b62\u5c06\u6d4b\u8bd5\u8d44\u6e90\u5b58\u653e\u5728\u4e2a\u4eba\u7684\u673a\u5668\u4e0a\uff1b \u5e94\u8be5\u5c3d\u91cf\u4fdd\u8bc1\uff0c\u4e00\u4e2a\u8d44\u6e90\u5728\u4e00\u6b21\u7528\u4f8b\u6267\u884c\u4e2d\u53ea\u9700\u8981\u4e0b\u8f7d\u4e00\u6b21\uff0c\u6240\u4ee5\u4f60\u4e0d\u80fd\u6bcf\u6b21\u4f7f\u7528\u7684\u65f6\u5019\u90fd\u53bb\u4e0b\u8f7d\uff0c\u8fd9\u6837\u53ef\u80fd\u4f1a\u8017\u8d39\u5927\u91cf\u7684\u7f51\u7edc\u8d44\u6e90\uff0c\u800c\u56e0\u4e3a\u5148\u5224\u65ad\u672c\u5730\u662f\u5426\u5b58\u5728\u6b64\u8d44\u6e90\uff0c\u5982\u679c\u4e0d\u5b58\u5728\u518d\u53bb\u4e0b\u8f7d\uff1b \u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u5c06\u8d44\u6e90\u62f7\u8d1d\u5230\u5bf9\u5e94\u7684\u6d4b\u8bd5\u76ee\u5f55\u4e0b\uff0c\u6bd4\u5982\u5c06 mp3 \u6587\u4ef6\u62f7\u8d1d\u5230 ~/Music \u76ee\u5f55\u4e0b\uff0c\u4f46\u662f\u6211\u4eec\u66f4\u5efa\u8bae\u4f60\u4f7f\u7528\u53d1\u9001\u5feb\u6377\u94fe\u63a5\u7684\u65b9\u5f0f\u66ff\u4ee3\u62f7\u8d1d\u7684\u64cd\u4f5c\uff0c\u56e0\u4e3a\u5728\u62f7\u8d1d\u5927\u6587\u4ef6\u65f6\u662f\u5f88\u6d88\u8017\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u800c\u521b\u5efa\u94fe\u63a5\u5219\u4e0d\u4f1a\uff1b @classmethod\ndef recovery_many_movies_in_movie_by_cmd(cls):\n\"\"\"\u6062\u590d\u591a\u4e2a\u89c6\u9891\u6587\u4ef6\u81f3\u89c6\u9891\u76ee\u5f55\u4e2d\"\"\"\nwork_path = f\"/home/{Config.USERNAME}/Videos/auto\"\ncode_path = f\"{Config.CASE_RES_PATH}/auto\"\ncls.run_cmd(f\"rm -rf {work_path};mkdir {work_path}\")\nsleep(1)\nflag = False\nif not exists(code_path):\ncls.run_cmd(f\"mkdir -p {code_path}\")\nflag = True\nlogger.info(f\"ln -s {code_path}/* {work_path}/\")\ncls.run_cmd(\nf\"cd {code_path}/;\"\nf\"{cls.wget_file('auto.zip') if flag else ''}\"\nf\"ln -s {code_path}/* {work_path}/ > /dev/null 2>&1\"\n)\n \u8d44\u6e90\u4e0b\u8f7d\u8fc7\u7a0b\u4e2d\u6ce8\u610f\u8d85\u65f6\u7684\u95ee\u9898\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u5f88\u5927\uff0c\u8981\u7279\u522b\u6ce8\u610f\u8fd9\u95ee\u9898\uff0c\u5982\u679c\u4f60\u4f7f\u7528\u5f3a\u5236\u7b49\u5f85\u4e0b\u8f7d\u7ed3\u675f( os.system )\uff0c\u53ef\u80fd\u4f1a\u9020\u6210\u7528\u4f8b\u6267\u884c\u65f6\u957f\u53d8\u5f97\u4e0d\u53ef\u63a5\u53d7\uff0c\u76ee\u524d\u6211\u4eec\u53d1\u73b0\u5728\u6301\u7eed\u96c6\u6210\u73af\u5883\u6267\u884c\u65f6\u7f51\u7edc\u4e0b\u8f7d\u901f\u5ea6\u5f88\u6162\uff0c\u6240\u4ee5\u8d85\u65f6\u673a\u5236\u662f\u5f88\u6709\u5fc5\u8981\u7684\uff1brun_cmd \u65b9\u6cd5\u6709\u4e00\u4e2a\u9ed8\u8ba4\u8d85\u65f6\u7684\u65f6\u95f4\uff0c\u4f60\u53ef\u4ee5\u6839\u636e\u8d44\u6e90\u5927\u5c0f\u5bf9\u8d85\u65f6\u65f6\u95f4\u8fdb\u884c\u8c03\u6574\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_5","title":"\u516d\u3001\u7528\u4f8b\u8c03\u8bd5\u6280\u5de7","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_4","title":"1. \u65e5\u5fd7","text":" \u4e00\u5b9a\u8981\u5148\u770b\u62a5\u9519\uff0c\u770b error \u65e5\u5fd7\uff0c\u901a\u5e38\u80fd\u660e\u786e\u7684\u544a\u8bc9\u4f60\u5177\u4f53\u54ea\u91cc\u4ee3\u7801\u62a5\u9519\uff1b \u7ed3\u5408\u62a5\u9519\u70b9\u524d\u9762\u7684error\u3001 info \u548c debug \u65e5\u5fd7\u770b\u5426\u662f\u6b63\u5e38\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_4","title":"2. \u65ad\u70b9\u8c03\u8bd5","text":" \u65b9\u6cd5\u62a5\u9519\uff1a \u5728\u65b9\u6cd5\u5e93\u4e2d\u627e\u5230\u5bf9\u5e94\u7684\u65b9\u6cd5\uff0c\u5355\u72ec\u8c03\u7528\uff0c\u770b\u662f\u5426\u80fd\u6b63\u5e38\u6267\u884c\uff1b \u901a\u5e38\u5355\u4e2a\u65b9\u6cd5\u7684\u6267\u884c\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u62a5\u9519\uff0c\u5f88\u5feb\u5c31\u80fd\u6392\u67e5\u51fa\u95ee\u9898\uff1b\u5728\u65b9\u6cd5\u5185\u90e8\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u65b9\u6cd5\u5185\u90e8\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u8c03\u7528\u6ca1\u95ee\u9898\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u62a5\u9519\u7684\u65b9\u6cd5\u524d\u9762\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u7528\u4f8b\u7684\u4e1a\u52a1\u903b\u8f91\u548c\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u65ad\u8a00\u62a5\u9519\uff1a \u65ad\u8a00\u4e3a\u6570\u636e\u65ad\u8a00\uff0c\u6839\u636e\u8868\u8fbe\u5f0f\u8fdb\u884c\u65ad\u8a00\u8bed\u53e5\u8fdb\u884c\u4fee\u6539\uff1b \u6587\u4ef6\u751f\u6210\u7c7b\u65ad\u8a00\uff0c\u67e5\u770b\u662f\u5426\u9700\u8981\u52a0\u7b49\u5f85\u65f6\u95f4\uff1b \u56fe\u50cf\u65ad\u8a00\uff0c\u5728\u65ad\u8a00\u8bed\u53e5\u5904\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u7528\u4f8b\u8fd0\u884c\u5230\u65ad\u8a00\u5904\u4f1a\u505c\u6b62\uff0c\u67e5\u770b\u6b64\u65f6\u65ad\u8a00\u7684\u56fe\u7247\u4e0e\u7528\u4f8b\u6267\u884c\u7684\u73b0\u573a\u5b58\u5728\u4ec0\u4e48\u5dee\u5f02\uff0c\u6b64\u65f6\u4e5f\u53ef\u4ee5\u8fdb\u884c\u91cd\u65b0\u622a\u56fe\uff0c\u4ece\u800c\u66ff\u6362\u65b0\u7684\u56fe\u7247\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3_1","title":"3. \u8fdc\u7a0b\u6267\u884c","text":" \u8fdc\u7a0b\u6267\u884c\u6307\u7684\u662f\u7f16\u8f91\u5668\u901a\u8fc7\u6307\u5b9a\u8fdc\u7a0b\u89e3\u91ca\u5668\u6267\u884c\u81ea\u52a8\u5316\u4ee3\u7801\uff1b \u8fdc\u7a0b\u6267\u884c\u7684\u597d\u5904\u662f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u7684 Debug \u8fd0\u884c\uff0c\u4e0d\u7528\u5728\u6d4b\u8bd5\u673a\u4e0a\u6253\u5f00\u7f16\u8f91\u5668\uff0c\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u66f4\u5feb\uff1b \u652f\u6301\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u7684\u7f16\u8f91\u5668\uff1a \u4e13\u4e1a\u7248 Pycharm VScode \uff0c\u9700\u8981\u4f7f\u7528\u63d2\u4ef6 Remote-SSH \u8fdc\u7a0b\u6267\u884c\u914d\u7f6e \u4ee5 Pycharm \u4e3a\u4f8b\uff1a File \u2014> Settings \u2014> Project \u2014> Python Interpreter \u2014> \u53f3\u8fb9\u8bbe\u7f6e\u6309\u94ae \u2014> Add... \u2014> SSH Interpreter \u2014> New server configuration(\u586b\u5165host\u548cusername) \u2014> Next \u2014> password\uff08\u6d4b\u8bd5\u673a\u5bc6\u7801\uff09 \u2014> Interpreter(\u9009\u62e9\u8fdc\u7a0b\u89e3\u91ca\u5668) \u2014> Finish "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4_1","title":"4. \u73af\u5883\u6e05\u7406","text":" \u5982\u679c\u7528\u4f8b\u91cc\u9762\u7684 teardown \u6ca1\u6709\u6267\u884c\uff0c\u5927\u6982\u7387\u662f\u56e0\u4e3a setup \u91cc\u9762\u4ee3\u7801\u62a5\u9519\uff0c\u8fd9\u4e24\u4e2a\u662f\u4e00\u5bf9\u7684\uff0csetup \u91cc\u9762\u62a5\u9519\uff0cteardown \u91cc\u9762\u7684\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\uff1b \u76ee\u524d\u6211\u4eec\u5df2\u7ecf\u5c06\u5404\u5e94\u7528\u7684 clean_all \u8fd9\u4e2a fixture \u6539\u6210\u4e86\u7ec8\u7ed3\u5668\uff0c\u786e\u4fdd\u59cb\u7ec8\u80fd\u6267\u884c\u5230\u8fd9\u6b65\uff0c\u4f46\u662f\u7528\u4f8b\u91cc\u9762\u7684 fixture\uff0c\u8fd8\u662f\u9700\u8981\u6211\u4eec\u5c0f\u5fc3\u5904\u7406\uff1b \u8981\u6267\u884c clean_all \u9700\u8981\u5728\u7f16\u8f91\u5668\u8fd0\u884c\u53c2\u6570\u52a0 --clean yes\uff0c\u5199\u7528\u4f8b\u7684\u65f6\u5019\u8bf7\u52a0\u4e0a\uff0c\u4e0d\u7136\u4f60\u4e0d\u786e\u5b9a\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u7684\u73af\u5883\u662f\u5426\u6062\u590d\uff1b setup \u53ef\u4ee5\u4e0d\u8981\uff0c\u5c06 setup \u653e\u5230\u7528\u4f8b\u91cc\u9762\u662f\u4e00\u79cd\u7a33\u59a5\u7684\u505a\u6cd5\uff0cteardown \u4e00\u5b9a\u8981\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5_1","title":"5. \u5143\u7d20\u5b9a\u4f4d\u4e0d\u51c6\uff08\u5750\u6807\u8fd4\u56de\u4e0d\u5bf9\uff09","text":" \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u53ef\u80fd\u53d7\u5230\u7a97\u53e3 ID \u7684\u53d8\u5316\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u9ed8\u8ba4\u53d6\u6700\u65b0\u7684\u4e00\u4e2a\u7a97\u53e3\u7528\u4e8e\u5b9a\u4f4d\uff0c\u4f46\u5982\u679c\u5b9e\u9645\u9700\u8981\u5b9a\u4f4d\u7684\u4e0d\u662f\u6700\u65b0\u7684\u7a97\u53e3\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u91cd\u65b0\u5b9e\u4f8b\u5316\u65b9\u6cd5\u7c7b\u5bf9\u8c61\uff0c\u5e76\u5728\u7c7b\u4e2d\u4f20\u5165\u5bf9\u5e94\u7684\u7a97\u53e3\u5e8f\u53f7\uff1b \u57fa\u4e8e\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u76ee\u524d\u9047\u5230\u7684\u7b14\u8bb0\u672c\u4e0a\uff0c\u7531\u4e8e\u5c4f\u5e55\u7f29\u653e\u6bd4\u4f8b\u4e3a 1.25\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u6211\u4eec\u9ed8\u8ba4\u4f7f\u7528\u7f29\u653e\u6bd4\u4f8b\u4e3a 1\uff1b \u57fa\u4e8e\u56fe\u50cf\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u76ee\u6807\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b \u57fa\u4e8e OCR \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u6587\u5b57\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u540c\u6837\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6_1","title":"6. \u952e\u9f20\u64cd\u4f5c\u4e0d\u51c6","text":" \u9f20\u6807\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6bd4\u5982\u53f3\u952e\u3001\u53cc\u51fb\u65e0\u54cd\u5e94\uff1b \u952e\u76d8\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6216\u8005\u5ef6\u8fdf\u8f93\u5165\uff0c\u6bd4\u5982\u7528\u4f8b\u9700\u8981\u8f93\u5165\u201c\u6211\u662f\u4e2d\u56fd\u4eba\u201d\uff0c\u5b9e\u9645\u53ea\u8f93\u5165\u4e86\u201c\u6211\u56fd\u4eba\u201d\uff1b \u4ee5\u4e0a\u95ee\u9898\u6392\u9664\u5e94\u7528\u5361\u987f\u7b49\u95ee\u9898\uff0c\u5927\u6982\u7387\u662f\u7531\u4e8e\u5de5\u5177\u7684\u95ee\u9898\uff0c\u76ee\u524d\u952e\u9f20\u64cd\u4f5c\u6211\u4eec\u4f7f\u7528\u4e09\u4e2a\u5de5\u5177\uff1aDogtail \u63d0\u4f9b\u7684\u952e\u9f20\u5de5\u5177\u3001PyAutoGUI\u3001Xdotool \uff1b \u6709\u540c\u5b66\u53ef\u80fd\u8981\u8bf4\u4e3a\u5565\u8981\u7528\u4e09\u4e2a\u554a\uff0c\u7528\u4e00\u4e2a\u4e0d\u5c31\u597d\u4e86\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u5404\u6709\u4f18\u70b9\u5404\u6709\u7f3a\u70b9\u3002 \u5982\u679c\u4f60\u9047\u5230\u952e\u9f20\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u8bd5\u8bd5\u901a\u8fc7\u4e0d\u540c\u7684\u5de5\u5177\u64cd\u4f5c\uff1b\u952e\u76d8\u8f93\u5165\u5ef6\u8fdf\u7684\u95ee\u9898\uff0c\u4e00\u822c\u662f\u56e0\u4e3a\u8f93\u5165\u901f\u5ea6\u592a\u5feb\u4e86\uff0c\u7cfb\u7edf\u6ca1\u53cd\u5e94\u8fc7\u6765\uff0c\u5e38\u89c1\u4e8e ARM \u548c MIPS \u4e0a\uff0c\u4fee\u6539\u53c2\u6570 delay_time \u7684\u503c\uff0c\u5355\u4f4d\u4e3a\u6beb\u79d2\uff1b # mouse_key.py\n@classmethod\ndef input_message(cls, message, delay_time=300, interval=0.2):\n\"\"\"\n \u8f93\u5165\u5b57\u7b26\u4e32\n :param message: \u8f93\u5165\u7684\u5185\u5bb9\n :param delay_time: \u5ef6\u8fdf\u65f6\u95f4\n :param interval:\n :return:\n \"\"\"\n \u5982\u679c\u4e0d\u662f\u65b9\u6cd5\u7684\u95ee\u9898\uff0c\u5219\u9700\u8981\u7ee7\u7eed\u548c\u5f00\u53d1\u4e00\u8d77\u6392\u9664\uff0c\u662f\u5426\u4e3a\u5e94\u7528\u63a5\u53d7\u952e\u9f20\u4fe1\u53f7\u5904\u7406\u7684\u95ee\u9898\uff0c\u8fd9\u7c7b\u60c5\u51b5\u6211\u4eec\u4e5f\u662f\u9047\u5230\u8fc7\u7684\uff0c\u5177\u4f53\u95ee\u9898\u5177\u4f53\u5206\u6790\u3002 \u6bd4\u5982\u5f71\u9662\u5c31\u91cd\u5199\u4e86\u4e00\u4e2a\u53f3\u952e\u7684\u65b9\u6cd5\uff1a # base_widget.py\n@classmethod\ndef right_click(cls, _x=None, _y=None):\n\"\"\"\n \u91cd\u5199\u5e95\u5c42\u5355\u51fb\u9f20\u6807\u53f3\u952e\n \u89e3\u51b3\u5f71\u9662\u53f3\u952e\u89e6\u53d1release\u4e8b\u4ef6\u7684\u95ee\u9898\uff08\u53f3\u952e\u4e3b\u7a97\u53e3\u4f1a\u64ad\u653e\u89c6\u9891\uff09\n \"\"\"\ncls.mouse_down(_x, _y, button=3)\nsleep(0.1)\ncls.mouse_up(button=3)\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_6","title":"\u4e03\u3001\u5176\u4ed6\u4e0d\u4e3a\u4eba\u77e5\u7684\u7ec6\u8282","text":" \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u5c3d\u91cf\u7f16\u5199\u540c\u4e00\u4e2a\u5e94\u7528\u6216\u6a21\u5757\u7684\u7528\u4f8b\uff0c\u80fd\u5bf9\u8be5\u7528\u4f8b\u5df2\u6709\u65b9\u6cd5\u719f\u6089\uff0c\u907f\u514d\u8fc7\u591a\u91cd\u590d\u4e1a\u52a1\u4ee3\u7801\u7684\u5c01\u88c5\uff1b \u76f8\u540c\u7684\u573a\u666f\u4e0b\uff0c\u5404\u67b6\u6784\u7b49\u5f85\u65f6\u95f4\u4e0d\u540c\uff0c\u5efa\u8bae\u4f7f\u7528\u6846\u67b6\u63d0\u4f9b\u7684 sleep\uff0c\u6211\u4eec\u505a\u4e86\u4e0d\u540c\u67b6\u6784\u7684\u500d\u6570\u653e\u5927\uff1b \u7f16\u5199\u7528\u4f8b\u65f6\uff0c\u5c3d\u91cf\u8003\u8651\u5230\u6bcf\u4e00\u6b65\u5f02\u5e38\u540e\u7684\u73af\u5883\u6062\u590d\uff0c\u9700\u8981\u5efa\u8bae\u8fd9\u79cd\u610f\u8bc6\uff0c\u968f\u65f6\u8981\u8003\u8651\u5230\uff0c\u8fd9\u6b65\u64cd\u4f5c\u6709\u6ca1\u6709\u53ef\u80fd\u51fa\u9519\uff0c\u51fa\u9519\u4e86\u6539\u600e\u4e48\u529e\uff1b \u63d0\u4ea4\u4ee3\u7801\u7684\u65f6\u5019\u6ce8\u610f\u4e0d\u8981\u628a\u4e00\u4e9b\u4e34\u65f6\u7684\u6d4b\u8bd5\u8d44\u6e90\u63d0\u4ea4\u8fdb\u53bb\u4e86\uff0c\u6bd4\u5982\u6d4b\u8bd5\u4e86\u4e00\u4e2a\u5f71\u7247\uff0c\u6709\u4e9b\u540c\u5b66\u4e60\u60ef\u4f7f\u7528 git add . \uff0c\u7136\u540e\u5c31\u5168\u90e8\u63d0\u4ea4\u5230\u4ee3\u7801\u4ed3\u5e93\u4e86\uff0c\u8fd9\u6837\u5373\u4f7f\u540e\u671f\u628a\u5927\u6587\u4ef6\u5220\u4e86\uff0c.git \u6587\u4ef6\u91cc\u9762\u4e5f\u4f1a\u5f88\u5927\uff0c\u9020\u6210\u4ee3\u7801\u4ed3\u5e93\u53d8\u5f97\u5341\u5206\u81c3\u80bf\u3002 \u66f4\u591a\u7ec6\u8282\u67e5\u770b\uff1a\u300aAT\u7ecf\u9a8c\u603b\u7ed3\u300b"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/","title":"AT \u6267\u884c\u5668\u4f7f\u7528\u6307\u5317","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/5/25\n# Author : litao\n# =============================================\n Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1","title":"1\u3001\u529f\u80fd\u4ecb\u7ecd","text":" \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7cfb\u7edf\u8bed\u8a00\u8bbe\u7f6e\uff0c\u5206\u8fa8\u7387\u8bbe\u7f6e\u53ca\u7528\u4f8b\u6267\u884c\u73af\u5883\u642d\u5efa\uff1b \u652f\u6301 IP \u4e3a 15 \u7f51\u6bb5\u7684 AMD \u67b6\u6784\u6d4b\u8bd5\u673a\u955c\u50cf\u88c5\u673a\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u6307\u5b9a\u5e94\u7528\uff0c\u6307\u5b9a\u8303\u56f4\u6807\u7b7e\u7684\u7528\u4f8b\u6267\u884c\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u72b6\u6001\u68c0\u67e5\uff0c\u662f\u5426\u6709\u6b63\u5728\u8fd0\u884c\u7684\u6d4b\u8bd5\uff1b \u652f\u6301\u914d\u7f6e\u7528\u4f8b\u6267\u884c\u65f6\u957f\uff0c\u9632\u6b62\u4efb\u52a1\u963b\u585e\uff1b \u652f\u6301\u6839\u636e\u5e94\u7528\u7248\u672c\u81ea\u52a8\u67e5\u627e\u5bf9\u5e94\u7684\u7528\u4f8b tag\uff1b \u652f\u6301\u5f02\u5e38\u5904\u7406\u548c\u6d4b\u8bd5\u5b8c\u6210\u7684\u5b9e\u65f6\u6d88\u606f\u901a\u77e5\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2job","title":"2\u3001Job \u4ecb\u7ecd","text":"\u4ee5\u4e0b\u6309\u6267\u884c\u6d41\u7a0b\u7684\u987a\u5e8f\u4ecb\u7ecd\uff0c\u6bcf\u4e00\u6b65\u90fd\u53ef\u4ee5\u5355\u72ec\u6267\u884c\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1_1","title":"1\u3001\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/AT_test/ \u6574\u4e2a\u6d41\u7a0b\u7684\u4e3b\u5165\u53e3\uff0c\u901a\u8fc7\u8fd9\u4e2a\u5165\u53e3\uff0c\u8fde\u540c\u6574\u4e2a\u6d4b\u8bd5\u6d41\u7a0b\uff0c\u955c\u50cf\u88c5\u673a\uff0c\u73af\u5883\u90e8\u7f72\uff0c\u6d4b\u8bd5\u5e94\u7528\u53ca\u751f\u6210\u62a5\u544a\u3002 \u53c2\u6570\u4ecb\u7ecd\uff1a \u6d4b\u8bd5\u673a\uff1a\u6240\u6709\u89c4\u6574\u5230\u56fa\u5b9a\u533a\u57df\u7684\u6d4b\u8bd5\u673a\uff0c\u901a\u8fc7\u6d4b\u8bd5\u540c\u5b66\u5bf9\u6d4b\u8bd5\u673a\u7684\u4e60\u60ef\u547d\u540d\uff0c\u5728\u540e\u53f0\u6620\u5c04\u6d4b\u8bd5\u673a\u7684\u8be6\u7ec6\u4fe1\u606f\uff0c\u62ec\u53f7\u4e2d\u4e3a\u6d4b\u8bd5\u673a IP \u7684\u6700\u540e\u4e00\u4f4d\uff1b \u6d4b\u8bd5\u5e94\u7528\uff1a\u6307\u5b9a\u7684\u6d4b\u8bd5\u5e94\u7528\u7684\u5305\u540d\uff0c\u7cfb\u7edf\u6839\u636e\u540d\u79f0\u81ea\u52a8\u62c9\u53d6\u5bf9\u5e94\u7684\u4ed3\u5e93\u4ee3\u7801\uff1b deb\u5305\u4e0b\u8f7d\u5730\u5740\uff1a\u6d4b\u8bd5\u4e0a\u8ff0\u5e94\u7528\u65f6\uff0c\u9700\u8981\u5b89\u88c5\u7684deb\u5305\u4e0b\u8f7d\u5730\u5740\uff0c\u591a\u4e2a\u5730\u5740\u7528\u201c,\u201d\u9694\u5f00\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff1b \u8303\u56f4\u6807\u7b7e\uff1a\u6267\u884c\u6d4b\u8bd5\u7528\u4f8b\u7684\u6807\u7b7e\u8303\u56f4\uff0c\u5bf9\u5e94\u7528\u4f8b\u4ee3\u7801 csv \u6587\u4ef6\u4e2d\u7684\u6807\u7b7e\u4fe1\u606f\uff0c\u4ee5 pytest \u7684mark\u8bed\u6cd5\u7f16\u5199\uff1b \u7cfb\u7edf\u8bed\u8a00\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u8bed\u8a00\u73af\u5883\uff1b \u5206\u8fa8\u7387\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u5206\u8fa8\u7387\u73af\u5883\uff1b \u955c\u50cf\u5730\u5740\uff1a\u955c\u50cf\u4ed3\u5e93\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u901a\u8fc7 PXE \u88c5\u673a\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u88c5\u673a\u73af\u8282\uff08\u76ee\u524d\u4ec5\u652f\u6301\u90e8\u5206 AMD \u67b6\u6784\u7684\u88c5\u673a\uff09\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2pxe","title":"2\u3001PXE \u88c5\u673a","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/IOS_install/ \u8f93\u5165\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\uff0cIP\uff0c\u5bc6\u7801\uff0c\u955c\u50cf\u5730\u5740\u540e\uff0c\u81ea\u52a8\u88c5\u673a\uff0c\u76ee\u524d\u4ec5\u652f\u6301\u56fa\u5b9a 15 \u7f51\u6bb5\u7684\u90e8\u5206 AMD \u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#3","title":"3\u3001\u6b21\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/all_client_test/ \u8be5\u5165\u53e3\u4e0e\u4e3b\u5165\u53e3\u529f\u80fd\u57fa\u672c\u4e00\u81f4\uff0c\u53ea\u662f\u5265\u79bb\u4e86PXE\u88c5\u673a\u6d41\u7a0b\uff0c\u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7684\u6267\u884c\u6d41\u7a0b\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#4","title":"4\u3001\u73af\u5883\u90e8\u7f72","text":"Jenkins url\uff1ahttps://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/env/build?delay=0sec \u8bbe\u7f6e\u6d4b\u8bd5\u673a\u7684\u7cfb\u7edf\u8bed\u8a00\uff0c\u5206\u8fa8\u7387\u53ca\u5b89\u88c5\u6d4b\u8bd5\u6240\u9700\u7684\u4f9d\u8d56\u5305\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#5","title":"5\u3001\u53d1\u9001\u4ee3\u7801","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/send_code/ \u6839\u636e\u6d4b\u8bd5\u5e94\u7528\u540d\u79f0\uff0c\u62c9\u53d6\u5bf9\u5e94\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u5e76\u6839\u636e\u6d4b\u8bd5\u673a\u4e0a\u5e94\u7528\u7248\u672c\u5207\u6362\u5230\u5bf9\u5e94\u7684tag\u7248\u672c\uff0c\u82e5\u672a\u627e\u5230tag\u7248\u672c\uff0c\u5219\u4f7f\u7528\u6700\u65b0\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u518d\u6839\u636e\u5e94\u7528\u5e93\u4ee3\u7801\u4e2d\u914d\u7f6e\u7684\u57fa\u7840\u5e93\u7248\u672c\uff0c\u62c9\u53d6\u57fa\u7840\u5e93\u4ee3\u7801\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#6","title":"6\u3001\u7528\u4f8b\u6267\u884c","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/run_test/ \u8fd0\u884c\u6d4b\u8bd5\u673a\u4e0a\u7684\u7528\u4f8b"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/","title":"AT \u7528\u4f8b\u7b5b\u9009\u6307\u5317","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u7528\u4f8b\u7b5b\u9009\u6807\u51c6\uff0c\u662f\u6311\u9009\u5408\u9002\u7684\u6587\u672c\u7528\u4f8b\u8fdb\u884c\u81ea\u52a8\u5316\u7528\u4f8b\u8f6c\u5316\u7684\u4e00\u4e9b\u901a\u7528\u6807\u51c6\u3002 \u8fc7\u53bb\u6211\u4eec\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u5b9e\u8df5\u8fc7\u7a0b\u4e2d\uff0c\u5199\u4e86\u4e0d\u5c11\u81ea\u52a8\u5316\u7528\u4f8b\uff0c\u968f\u7740\u9700\u6c42\u7684\u8fed\u4ee3\uff0c\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u81ea\u7136\u8150\u5316\uff0c\u56e0\u800c\u9700\u8981\u5728\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\u5bf9\u81ea\u52a8\u5316\u7528\u4f8b\u8fdb\u884c\u7ef4\u62a4\uff0c\u5728\u7ef4\u62a4\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u6211\u4eec\u53d1\u73b0\uff0c\u6709\u4e9b\u7528\u4f8b\u7ef4\u62a4\u8d77\u6765\u592a\u96be\u4e86\uff0c\u8c03\u8bd5\u7528\u4f8b\u8017\u8d39\u5927\u91cf\u65f6\u95f4\uff0c\u6210\u672c\u5f88\u9ad8\u3002 \u56e0\u6b64\uff0c\u6211\u4eec\u603b\u7ed3\u4e00\u4e9b\u81ea\u52a8\u5316\u7528\u4f8b\u9009\u578b\u7684\u6807\u51c6\uff0c\u4ee5\u4f18\u5316\u540e\u7eed\u81ea\u52a8\u5316\u7528\u4f8b\u7ed3\u6784\uff0c\u671f\u5f85\u6211\u4eec\u80fd\u7f16\u5199\u51fa\u9ad8\u6548\u3001\u7a33\u5b9a\u3001\u6613\u4e8e\u7ef4\u62a4\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_1","title":"\u4e00\u3001\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u53ef\u4ee5\u5206\u4e3a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u548c\u4e13\u9879\u81ea\u52a8\u5316\u6d4b\u8bd5\uff0c\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e00\u822c\u53ea\u9488\u5bf9\u4e00\u4e9b\u5e38\u89c4\u7684\u529f\u80fd\u6d4b\u8bd5\uff0c\u5176\u4ed6\u975e\u5e38\u89c4\u529f\u80fd\u7684\u7528\u4f8b\uff0c\u5e94\u8be5\u91c7\u7528\u4e13\u9879\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u6848\uff1b \u4ee5\u4e0b\u662f\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1","title":"1. \u7a33\u5b9a\u6027\u3001\u538b\u6d4b\u7528\u4f8b","text":"\u7a33\u5b9a\u6027\u6d4b\u8bd5\u3001\u538b\u6d4b\u7528\u4f8b\u5e94\u8be5\u662f\u5c5e\u4e8e\u6027\u80fd\u76f8\u5173\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u5982\uff1a\u53cd\u590d\u591a\u6b21\u70b9\u51fb\u6309\u94ae\uff0c\u68c0\u9a8c\u5176\u529f\u80fd\u7a33\u5b9a\u6027\u3002\u56e0\u4e3a\u8fd9\u4e9b\u7528\u4f8b\u65ad\u8a00\u7684\u9884\u671f\u53ef\u80fd\u4e0d\u662f\u5f88\u660e\u786e\uff0c\u66f4\u6709\u751a\u8005\u4e0d\u9700\u8981\u65ad\u8a00\uff0c\u7528\u4f8b\u65f6\u957f\u6bd4\u8f83\u957f\uff0c\u800c\u4e14\u4e0d\u53ef\u63a7\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u76ee\u524d\u6211\u4eec\u6709\u6027\u80fd\u81ea\u52a8\u5316\u7684\u4e13\u9879\u65b9\u6848\uff0c\u4ee5\u53ca\u4e00\u4e9b\u7a33\u5b9a\u6027\u6d4b\u8bd5\u7684\u4e13\u9879\u65b9\u6848\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u6b64\u7c7b\u7528\u4f8b\u653e\u5230\u4e13\u9879\u81ea\u52a8\u5316\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2","title":"2. \u6d89\u53ca\u591a\u4e2a\u7528\u6237\u64cd\u4f5c","text":"\u5e38\u89c1\u4e0e\u6587\u7ba1\u7684\u7528\u4f8b\u4e2d\uff0c\u591a\u7528\u6237\u64cd\u4f5c\u7684\u7528\u4f8b\u4e00\u822c\u90fd\u4f1a\u6d89\u53ca\u5230\u5728\u7cfb\u7edf\u4e2d\u8fdb\u884c\u591a\u4e2a\u7528\u6237\u95f4\u7684\u5207\u6362\uff0c\u81ea\u52a8\u5316\u811a\u672c\u4e00\u822c\u662f\u8fd0\u884c\u5728\u4e00\u4e2a\u7528\u6237\u7a7a\u95f4\u4e0b\u7684\uff0c\u6240\u4ee5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u591a\u7528\u6237\u95f4\u7684\u5207\u6362\u3002 \u6b64\u7c7b\u4e0d\u5efa\u8bae\u91c7\u7528\u81ea\u52a8\u5316\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3","title":"3. \u4e0e\u5f00\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4ea4\u4e92","text":"\u6b64\u7c7b\u573a\u666f\u591a\u4e3a\u5e94\u7528\u7684\u5f02\u5e38\u573a\u666f\u6d4b\u8bd5\uff0c\u6bd4\u5982\uff1a\u590d\u5236\u5927\u6587\u4ef6\u8fc7\u7a0b\u4e2d\u6ce8\u9500\u673a\u5668\u3002 \u81ea\u52a8\u5316\u811a\u672c\u5728\u7cfb\u7edf\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4e4b\u540e\u662f\u4f1a\u505c\u6b62\u8fd0\u884c\u7684\uff1b\u6b64\u7c7b\u7528\u4f8b\u53ef\u4ee5\u505a\u81ea\u52a8\u5316\uff0c\u4f46\u662f\u540c\u6837\u9700\u8981\u505a\u4e13\u9879\u65b9\u6848\uff0c\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u7684\u5904\u7406\u903b\u8f91\u5b8c\u5168\u4e0d\u540c\u3002 \u540e\u7eed\u81ea\u52a8\u5316\u9700\u8981\u516c\u5173\u7684\u70b9\uff1a \u81ea\u52a8\u5316\u811a\u672c\u5728\u672c\u673a\u8fd0\u884c\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u81f3\u5c11\u9700\u8981\u63d0\u4f9b\u4ee5\u4e0b\u529f\u80fd\uff1a \u91cd\u542f\u4e4b\u540e\u7528\u4f8b\u80fd\u81ea\u52a8\u8fd0\u884c\uff1b\u53ef\u4ee5\u8003\u8651\u5c06\u6267\u884c\u7528\u4f8b\u5199\u6210\u4e00\u4e2a\u5f00\u673a\u81ea\u542f\u7684\u670d\u52a1\uff1b \u80fd\u8bb0\u5f55\u5173\u673a\u4e4b\u524d\u7528\u4f8b\u6267\u884c\u7684\u4f4d\u7f6e\uff0c\u91cd\u542f\u4e4b\u540e\u80fd\u4ece\u6b64\u4f4d\u7f6e\u5f00\u59cb\u6267\u884c\uff1b \u50cf\u6027\u80fd\u81ea\u52a8\u5316\u4e00\u6837\uff0c\u7531\u670d\u52a1\u7aef\u63a7\u5236\uff1b \u5b8c\u5168\u57fa\u4e8e\u56fe\u5f62\u8bc6\u522b\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u4e32\u53e3\u7ebf\u63a7\u5236\u952e\u9f20\u7a33\u5b9a\u6027\uff1b "},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4","title":"4. \u6d4b\u8bd5\u6267\u884c\u65f6\u95f4\u957f","text":"\u7528\u4f8b\u6267\u884c\u65f6\u95f4\u63a7\u5236\u57282\u5206\u949f\u4ee5\u5185\uff0c\u6781\u7aef\u60c5\u51b5\u4e0d\u8981\u8d85\u8fc75\u5206\u949f\uff0c\u6240\u6709\u7528\u4f8b\u7684\u5e73\u5747\u65f6\u957f\u5e94\u8be5\u57281\u5206\u949f\u5de6\u53f3\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u95f4\u592a\u957f\uff0c\u7f16\u5199\u7528\u4f8b\u3001\u8c03\u8bd5\u7528\u4f8b\u3001\u6267\u884c\u7528\u4f8b\u3001\u7ef4\u62a4\u7528\u4f8b\u90fd\u975e\u5e38\u7684\u8017\u65f6\uff0c\u4eba\u529b\u6210\u672c\u65f6\u95f4\u6210\u672c\u6295\u5165\u592a\u9ad8\u3002 \u4f60\u60f3\uff0c\u8fd9\u6761\u7528\u4f8b\u6267\u884c\u9700\u89815\u5206\u949f\uff0c\u90a3\u4f60\u5199\u8fd9\u6761\u7528\u4f8b\u7684\u65f6\u95f4\u4e0d\u53ef\u80fd\u4e00\u904d\u8fc7\uff0c\u5199\u7684\u8fc7\u7a0b\u4e2d\u8dd1\u4e0d\u901a\u8fd8\u5f97\u91cd\u8dd1\u81f3\u5c1115\u5206\u949f\u4e0d\u8fc7\u5206\uff0c\u5199\u5b8c\u4e86\u8fd8\u5f97\u5728\u5176\u4ed6\u67b6\u6784\u4e0a\u8c03\u8bd5\uff0c\u534a\u4e2a\u5c0f\u65f6\u8fc7\u53bb\u4e86\uff0c\u8fd9\u8fd8\u53ea\u662f\u7b2c\u4e00\u6b21\u5199\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u540e\u7eed\u5982\u679c\u7528\u4f8b\u7ef4\u62a4\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u7ecf\u5e38\u6295\u5165\u76f8\u5f53\u957f\u65f6\u95f4\uff0c\u8fd9\u6837\u5176\u5b9e\u662f\u5931\u53bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u7684\u3002\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u5c31\u5e94\u8be5\u662f\u5feb\u51c6\u72e0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5","title":"5. \u8fb9\u7f18\u6027\u6d4b\u8bd5","text":"\u6709\u4e9b\u529f\u80fd\u6a21\u5757\u672c\u8eab\u662f\u5c5e\u4e8e\u6bd4\u8f83\u8fb9\u7f18\u6027\u7684\uff0c\u5373\u6781\u5c11\u7528\u6237\u4f1a\u4f7f\u7528\u5230\u7684\u529f\u80fd\uff0c\u8fd9\u7c7b\u529f\u80fd\u6a21\u5757\u4e0d\u9700\u8981\u5927\u89c4\u6a21\u5b9e\u73b0\u81ea\u52a8\u5316\uff0c\u4e00\u4e24\u4e2a\u573a\u666f\u8986\u76d6\u57fa\u672c\u529f\u80fd\u5c31\u884c\u4e86\uff0c\u56e0\u6b64\u6211\u4eec\u5728\u6311\u9009\u6b64\u7c7b\u7528\u4f8b\u7684\u65f6\u5019\u53ef\u4ee5\u7ed3\u5408\u6574\u4e2a\u529f\u80fd\u6a21\u5757\u7684\u8986\u76d6\u60c5\u51b5\u6765\u51b3\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6","title":"6. \u9700\u8981\u4f9d\u8d56\u4eba\u5de5\u4ecb\u5165\u7684","text":"\u81ea\u52a8\u5316\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\u662f\u6ca1\u6709\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bd4\u5982\u8981\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u90a3\u4e48\u5c31\u80cc\u79bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u3002 \u6bd4\u5982\u5149\u9a71\u6a21\u5757\uff0c\u5149\u9a71\u523b\u5f55\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u4f46\u662f\u5149\u9a71\u523b\u5f55\u4e4b\u540e\u5149\u76d8\u4f1a\u5f39\u51fa\u6765\uff0c\u9700\u8981\u4eba\u5de5\u66f4\u6362\u5149\u76d8\uff0c\u518d\u624b\u52a8\u63a8\u8fdb\u5149\u9a71\u4e2d\u3002 \u8fd9\u79cd\u529f\u80fd\u6a21\u5757\u5373\u4f7f\u505a\u81ea\u52a8\u5316\uff0c\u80fd\u6d89\u53ca\u5230\u7684\u529f\u80fd\u975e\u5e38\u6709\u9650\uff0c\u800c\u4e14\u4e0d\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u6240\u4ee5\u660e\u663e\u5c31\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7","title":"7. \u96be\u4ee5\u5b9e\u73b0\u7684","text":"\u7528\u4f8b\u6240\u6d89\u53ca\u5230\u7684\u65b9\u6cd5\u5b9e\u73b0\u8d77\u6765\u53ef\u80fd\u6709\u96be\u5ea6\uff0c\u751a\u81f3\u73b0\u9636\u6bb5\u65e0\u6cd5\u5b9e\u73b0\u7684\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002 \u6bd4\u5982\u5f71\u9662\u6d4b\u8bd5\u753b\u9762\u6e05\u6670\u5ea6\u3001\u6d41\u7545\u5ea6\u3001\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u4e4b\u540e\u7684\u89c6\u9891\u662f\u5426\u5b58\u5728\u5361\u987f\u7b49\u7528\u4f8b\uff0c\u73b0\u9636\u6bb5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#8","title":"8. \u529f\u80fd\u4e0d\u7a33\u5b9a","text":"\u8fd9\u4e2a\u4e0d\u662f\u8bf4\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\uff0c\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\u4e0d\u7a33\u5b9a\u662f\u6b63\u5e38\u7684\uff0c\u8fd9\u79cd\u6211\u4eec\u53ef\u4ee5\u7b49\u5f00\u53d1\u63d0\u6d4b\u4e4b\u540e\u518d\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u3002 \u529f\u80fd\u4e0d\u7a33\u5b9a\u6307\u7684\u662f\u7528\u4f8b\u6240\u6d89\u53ca\u7684\u529f\u80fd\uff0c\u53ef\u80fd\u5b58\u5728\u591a\u79cd\u53d8\u5316\uff0c\u6bcf\u6b21\u6267\u884c\u7528\u4f8b\u53ef\u80fd\u65ad\u8a00\u7684\u9884\u671f\u90fd\u4e0d\u540c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#9","title":"9. \u52a8\u6001\u65ad\u8a00","text":"\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u76f4\u5230\u7528\u4f8b\u7ed3\u675f\uff0c\u4e00\u76f4\u662f\u4e00\u4e2a\u52a8\u6001\u53d8\u5316\u7684\u8fc7\u7a0b\uff0c\u800c\u4e14\u65e0\u6cd5\u901a\u8fc7\u5176\u4ed6\u624b\u6bb5\u505c\u4e0b\u6765\uff1b \u6bd4\u5982\uff1a\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u65f6\uff0c\u53f3\u4e0b\u89d2\u7684\u5f55\u5236\u65f6\u95f4\u662f\u4e00\u76f4\u5728\u53d8\u5316\u7684\uff0c\u7528\u4f8b\u9700\u8981\u6d4b\u8bd5\u5f55\u52361\u5206\u949f\u4e4b\u540e\uff0c\u5f55\u5236\u65f6\u95f4\u662f\u521a\u597d\u505c\u572860\u79d2\uff1b \u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fd8\u505a\u4e0d\u5230\u65f6\u95f4\u7cbe\u51c6\u63a7\u5236\uff0c\u7a0b\u5e8f\u6267\u884c\u65f6\u95f4\u662f\u6709\u6ce2\u52a8\u7684\uff0c\u800c\u4e14\u8981\u9002\u914d\u591a\u4e2a\u5e73\u53f0\uff0c\u6240\u4ee5\u6b64\u7c7b\u7528\u4f8b\u5927\u6982\u7387\u4f1a\u6267\u884c\u5931\u8d25\u3002\u7279\u522b\u662f\u5728\u6027\u80fd\u8f83\u5dee\u7684\u56fd\u4ea7\u5316\u67b6\u6784\u4e0a\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u592a\u53ef\u80fd\u7a33\u5b9a\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#10","title":"10. \u63a2\u7d22\u6027\u6d4b\u8bd5","text":"\u63a2\u7d22\u6027\u6d4b\u8bd5\u901a\u5e38\u662f\u4e00\u4e9b\u4e0d\u786e\u5b9a\u7684\u64cd\u4f5c\uff0c\u591a\u53d8\u5207\u590d\u6742\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u9884\u671f\u4e5f\u53ef\u80fd\u662f\u4e0d\u786e\u5b9a\u7684\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u9a9a\u64cd\u4f5c\u592a\u591a\u4e86\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6b64\u7c7b\u7528\u4f8b\u9002\u5408\u91c7\u7528\u624b\u5de5\u6d4b\u8bd5\uff0c\u662f\u624b\u5de5\u6d4b\u8bd5\u771f\u6b63\u7684\u4ef7\u503c\u4f53\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#11","title":"11. \u6613\u7528\u6027\u6d4b\u8bd5","text":"\u5bf9\u4e8e\u6613\u7528\u6027\u7684\u5224\u65ad\u901a\u5e38\u662f\u4e3b\u89c2\u7684\uff0c\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\u5f88\u96be\u53bb\u5b9a\u4e49\u4ec0\u4e48\u6837\u7684\u60c5\u51b5\u5bf9\u7528\u6237\u662f\u6613\u7528\u7684\uff0c\u81ea\u52a8\u5316\u9700\u8981\u6709\u660e\u786e\u7684\u53ef\u5b9e\u73b0\u7684\u9884\u671f\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_2","title":"\u4e8c\u3001\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u524d\u9762\u8bb2\u4e86\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u4e00\u4e9b\u7528\u4f8b\u60c5\u51b5\uff0c\u6709\u540c\u5b66\u5c31\u8bf4\u4e86\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\u4e0d\u7528\u8bb2\u4e86\uff0c\u5c31\u662f\u4e0d\u9002\u5408\u7684\u53cd\u9762\u3002\u6ca1\u6bdb\u75c5\u54c8\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\uff0c\u6211\u4eec\u5927\u4f53\u8fd8\u53ef\u4ee5\u5206\u4e3a\u4e24\u7c7b\uff1a \u7b2c\u4e00\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u597d\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u7b2c\u4e8c\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u4e00\u822c\uff0c\u9700\u8981\u6295\u5165\u66f4\u591a\u7cbe\u529b\u624d\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u4ee5\u4e0b\u4ecb\u7ecd\u4e00\u4e9b\u6211\u4eec\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1_1","title":"1. \u64cd\u4f5c\u76f8\u5bf9\u7b80\u5355","text":"\u7528\u4f8b\u6b65\u9aa4\u76f8\u5bf9\u8f83\u5c11\uff0c\u8fd9\u79cd\u7528\u4f8b\u901a\u5e38\u662f\u4e00\u4e9b\u8def\u5f84\u5f88\u6d45\u7684\u7528\u4f8b\uff0c\u4e00\u822c\u4e5f\u662f\u4e00\u4e9b\u57fa\u7840\u7528\u4f8b\u3002\u7528\u4f8b\u7f16\u5199\u3001\u7ef4\u62a4\u90fd\u53ef\u4ee5\u8f7b\u677e\u641e\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2_1","title":"2. \u5bb9\u6613\u5b9e\u73b0","text":"\u73b0\u6709\u6280\u672f\u662f\u53ef\u5b9e\u73b0\u7684\uff0c\u6ca1\u6709\u96be\u5ea6\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3_1","title":"3. \u7ecf\u5e38\u7528\u4e8e\u56de\u5f52\u6d4b\u8bd5","text":"\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bcf\u6b21\u56de\u5f52\u6d4b\u8bd5\u5fc5\u987b\u8981\u6267\u884c\u7684\u7528\u4f8b\uff0c\u90a3\u4e48\u8fd9\u6761\u7528\u4f8b\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u3002 \u56de\u5f52\u6d4b\u8bd5\u65f6\u6211\u4eec\u9996\u5148\u5e94\u8be5\u4fdd\u8bc1\u5e94\u7528\u5386\u53f2\u57fa\u672c\u529f\u80fd\u6b63\u5e38\uff0c\u6240\u4ee5\u90a3\u4e9b\u6bcf\u6b21\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u90fd\u8981\u6267\u884c\u7684\u7528\u4f8b\u9002\u5408\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4_1","title":"4. \u529f\u80fd\u7a33\u5b9a\u7684\u6838\u5fc3\u529f\u80fd","text":"\u6d89\u53ca\u6838\u5fc3\u529f\u80fd\u7684\u7528\u4f8b\u662f\u6700\u6700\u91cd\u8981\u7684\u7528\u4f8b\uff0c\u4e5f\u662f\u6211\u4eec\u4ea4\u4ed8\u65f6\u5fc5\u987b\u8981\u4fdd\u8bc1\u8d28\u91cf\u7684\u76f8\u5173\u529f\u80fd\uff0c\u56e0\u6b64\u5e94\u8be5\u5c3d\u53ef\u80fd\u7684\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5_1","title":"5. \u8f93\u5165\u6570\u636e\u6d4b\u8bd5","text":"\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u901a\u5e38\u662f\u68c0\u9a8c\u88ab\u6d4b\u5e94\u7528\u63a5\u53d7\u6709\u6548\u6570\u636e\u3001\u62d2\u7edd\u65e0\u6548\u6570\u636e\u7684\u80fd\u529b\u3002\u5982\uff1a\u63d0\u4ea4\u8d85\u957f\u5b57\u7b26\u4e32\u3001\u7279\u6b8a\u5b57\u7b26\u4e32\u7b49\u7b49\u3002 \u6b64\u7c7b\u7528\u4f8b\u624b\u5de5\u6d4b\u8bd5\u5f88\u96be\u6bd4\u8f83\u5168\u9762\u7684\u8986\u76d6\u5230\u6240\u6709\u7684\u8f93\u5165\u60c5\u51b5\uff0c\u4f46\u662f\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\uff0c\u6b64\u7c7b\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u90fd\u662f\u4e00\u6837\u7684\uff0c\u53d8\u5316\u7684\u4ec5\u662f\u8f93\u5165\u53c2\u6570\u548c\u65ad\u8a00\u7ed3\u679c\uff0c\u91c7\u7528\u6570\u636e\u9a71\u52a8\uff0c\u53ef\u4ee5\u8f7b\u677e\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6_1","title":"6. \u683c\u5f0f\u8986\u76d6","text":"\u539f\u56e0\u540c\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u7c7b\u7528\u4f8b\u4e00\u6837\uff0c\u591a\u79cd\u683c\u5f0f\u7684\u8986\u76d6\u4e5f\u662f\u4e00\u4e2a\u5f88\u7e41\u7410\u7684\u4e8b\u60c5\uff0c\u4ea4\u7ed9\u81ea\u52a8\u5316\u6765\u505a\u518d\u5408\u9002\u4e0d\u8fc7\u4e86\u3002 \u6bd4\u5982\u5f71\u9662\u5bf9\u5f71\u7247\u683c\u5f0f\u7684\u68c0\u67e5\u3001\u622a\u56fe\u5f55\u5c4f\u5bf9\u4fdd\u5b58\u683c\u5f0f\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7_1","title":"7. \u68c0\u67e5\u5143\u7d20\u72b6\u6001","text":"\u67e5\u770b\u88ab\u6d4b\u5e94\u7528\u7684\u5143\u7d20\u5c5e\u6027\u3002\u5982\uff1a\u56fe\u7247\u7684\u5927\u5c0f\u548c\u6392\u5217\uff1b\u6309\u94ae\u7684\u53ef\u7528\u548c\u4e0d\u53ef\u7528\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/","title":"AT \u7ecf\u9a8c\u603b\u7ed3","text":"\u6b22\u8fce\u6240\u6709\u4eba\u63d0\u4ea4\u4f60\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u9762\u7684\u4f18\u79c0\u5b9e\u8df5\u7ecf\u9a8c\uff0c\u4ee5\u5e2e\u52a9\u5927\u5bb6\u89e3\u51b3\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#1","title":"1\u3001\u7ec8\u7ed3\u5668","text":"# litaoa@uniontech.com\n \u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4 pytest \u5b9e\u73b0\u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4\u7684\u65b9\u5f0f\u6709\u4e24\u79cd\uff0cyield \u548c\u7ec8\u7ed3\u51fd\u6570\uff1b yield \u5b9e\u73b0\uff0cyield\u524d\u9762\u4e3a\u7528\u4f8b\u7684\u524d\u7f6e\u6b65\u9aa4\uff0cyield \u540e\u9762\u4e3a\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4\u3002 @pytest.fixture\ndef clean_env():\nprint(\"setup\")\nyield\nprint(\"teardown\")\n \u7ec8\u7ed3\u51fd\u6570\u5b9e\u73b0\uff0c\u4f7f\u7528 request.addfinalizer \u6ce8\u518c\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4 @pytest.fixture\ndef clean_env(request):\ndef clean():\nprint(\"teardown\")\nrequest.addfinalizer(clean)\nprint(\"setup\")\n yield\u7684\u4f18\u7f3a\u70b9\uff1a \u4f18\u70b9\uff1a\u4ee3\u7801\u7b80\u6d01\uff0c\u76f4\u89c2\uff0c\u53ef\u4f7f\u7528yield\u5728\u7528\u4f8b\u4e2d\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c \u7f3a\u70b9\uff1a\u82e5\u524d\u7f6e\u6b65\u9aa4\u4e2d\u51fa\u73b0\u9519\u8bef\uff0c\u5219\u540e\u7f6e\u6b65\u9aa4\u4e0d\u4f1a\u6267\u884c \u7ec8\u7ed3\u51fd\u6570\uff1a \u4f18\u70b9\uff1a\u524d\u7f6e\u6b65\u9aa4\u5931\u8d25\u7684\u8bdd\uff0c\u540e\u7f6e\u6b65\u9aa4\u4ecd\u4f1a\u6267\u884c\u4e14\u53ef\u4ee5\u6ce8\u518c\u591a\u4e2a\u540e\u7f6e\u6b65\u9aa4\uff08\u524d\u63d0\uff1a\u9700\u8981\u5728\u4ee3\u7801\u62a5\u9519\u4e4b\u524d\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff09\uff0c\u652f\u6301\u7075\u6d3b\u4f7f\u7528\u540e\u7f6e\u6761\u4ef6 \u7f3a\u70b9\uff1a\u4ee3\u7801\u8f83\u4e3a\u590d\u6742\uff0c\u65e0\u6cd5\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c\uff08\u672c\u4eba\u76ee\u524d\u672a\u5b9e\u73b0\uff09 \u603b\u7ed3\uff1a\u5728\u524d\u7f6e\u6b65\u9aa4\u4fdd\u8bc1\u7edd\u5bf9\u4e0d\u4f1a\u51fa\u9519\u65f6\uff0c\u4f7f\u7528yield\u66f4\u4f73\u7b80\u4fbf\uff0c\u5f53\u524d\u7f6e\u6b65\u9aa4\u6613\u51fa\u73b0\u95ee\u9898\u65f6\uff0c\u63a8\u8350\u4f7f\u7528\u7ec8\u7ed3\u51fd\u6570\u3002 \u573a\u666f\uff1a\u4fdd\u9669\u7bb1\u7528\u4f8b\uff0c\u524d\u7f6e\u6b65\u9aa4\u4e2d\u5f00\u542f\u4fdd\u9669\u7bb1\uff0c\u540e\u7f6e\u6b65\u9aa4\u5220\u9664\u4fdd\u9669\u7bb1\u3002 @pytest.fixture(scope=\"session\", autouse=True)\ndef vault_fixture(request):\nDfmWidget.reset_vault_by_cmd() # 1\u3001\u91cd\u7f6e\u4fdd\u9669\u7bb1\nDdeDockPublicWidget().close_file_manager_by_cmd() # 2\u3001\u5173\u95ed\u6587\u7ba1\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 3\u3001\u5f00\u542f\u6587\u7ba1\nvault = DfmWidget()\nvault.create_file_vault() # 4\u3001\u521b\u5efa\u4fdd\u9669\u7bb1\ndef delete_vault(): # 8\u3001\u5220\u9664\u4fdd\u9669\u7bb1\u7684\u540e\u7f6e\u6b65\u9aa4\nsleep(2)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr()\nvault = DfmWidget()\nvault.delete_file_vault()\nDfmWidget.reset_vault_by_cmd()\nDdeDockPublicWidget().close_file_manager_by_cmd()\nrequest.addfinalizer(delete_vault) # 5\u3001\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\nDdeDockPublicWidget().close_file_manager_by_cmd() # 6\u3001\u5173\u95ed\u6587\u7ba1\nsleep(1)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 7\u3001\u5f00\u542f\u6587\u7ba1\n \u4ee3\u7801\u6309\u6ce8\u91ca\u4e2d\u7684\u5e8f\u53f7\u6267\u884c\u6b65\u9aa4 \u4ee3\u7801\u5728\u6b65\u9aa41-4\u4efb\u610f\u4f4d\u7f6e\u62a5\u9519\uff0c\u5219\u4e0d\u4f1a\u6267\u884c\u6b65\u9aa48\uff0c\u56e0\u4e3a\u672a\u6267\u884c\u5230\u6b65\u9aa45\uff0c\u6b65\u9aa48\u8fd8\u672a\u6ce8\u518c \u4ee3\u7801\u5728\u6b65\u9aa46-7\u62a5\u9519\uff0c\u4ecd\u4f1a\u6267\u884c\u6b65\u9aa47\uff0c\u56e0\u4e3a\u5728\u6b65\u9aa45\u4e2d\u5df2\u7ecf\u5c06\u6b65\u9aa47\u6ce8\u518c \u53ef\u4ee5\u7075\u6d3b\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff0c\u80fd\u5b9e\u73b0\u67d0\u4e2a\u524d\u7f6e\u6b65\u9aa4\u6267\u884c\u4e4b\u540e\uff0c\u624d\u4f1a\u6267\u884c\u540e\u7f6e\u6b65\u9aa4\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#2","title":"2\u3001\u542f\u52a8\u5e94\u7528\u7684\u65b9\u5f0f","text":"# huangmingqiang@uniontech.com\n \uff081\uff09\u547d\u4ee4\u884c\u542f\u52a8 \u5728 AT \u4ee3\u7801\u4e2d\u4f7f\u7528\u547d\u4ee4\u884c\u542f\u52a8\u5e94\u7528\uff0c\u4e3e\u4f8b\uff1a os.popen(\"deepin-music\")\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f7f\u7528 ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6\uff0cdogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u3002 \uff082\uff09\u901a\u8fc7 UI \u64cd\u4f5c\u542f\u52a8 \u901a\u8fc7\u4efb\u52a1\u680f\u3001\u542f\u52a8\u5668\u3001\u684c\u9762\u7b49UI\u65b9\u5f0f\u542f\u52a8\uff0c\u6bd4\u5982\u53cc\u51fb\u6253\u5f00\u3001\u53f3\u952e\u6253\u5f00\u7b49\uff0c\u8fd9\u79cd\u64cd\u4f5c\u65b9\u5f0f\u4e0d\u5b58\u5728ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6dogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u7684\u95ee\u9898\uff0c\u4e5f\u66f4\u52a0\u7b26\u5408\u7528\u6237\u7684\u64cd\u4f5c\u884c\u4e3a\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#3","title":"3\u3001\u6587\u4ef6\u9009\u62e9\u6846\u5c5e\u6027\u5b9a\u4f4d\u5076\u73b0\u65e0\u6cd5\u627e\u5230","text":"\u6587\u4ef6\u9009\u62e9\u6846\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5728\u8c03\u7528\u6587\u4ef6\u9009\u62e9\u6846\u65f6\uff0c\u6709\u4e00\u5b9a\u7684\u6982\u7387\u51fa\u73b0\uff0c\u754c\u9762\u5df2\u7ecf\u6e32\u67d3\u51fa\u6765\u4e86\uff0c\u4f46\u662f\u5c5e\u6027\u6811\u5e76\u6ca1\u6709\u5199\u5165\uff0c\u5bfc\u81f4\u901a\u8fc7\u5c5e\u6027\u65e0\u6cd5\u627e\u5230\u5143\u7d20\uff0c\u76ee\u524d\u4e5f\u6ca1\u6709\u5f88\u597d\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u4e3a\u4e86\u7528\u4f8b\u7a33\u5b9a\u6027\uff0c\u6587\u4ef6\u9009\u62e9\u6846\u7684\u64cd\u4f5c\u5efa\u8bae\u4f7f\u7528UI\u6216\u8005\u56fe\u7247\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u53ef\u4ee5\u901a\u8fc7\u641c\u7d22\u5185\u5bb9\u56fa\u5b9a\u6587\u4ef6\u4f4d\u7f6e\u3002 # litaoa@uniontech.com\n desk = DdeDesktopPublicWidget()\n# \u9009\u62e9\u89c6\u9891\u76ee\u5f55\ndesk.click_videos_dir_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.ctrl_f()\nsleep(1)\ndesk.input_message(\"\u5143\u7d20\u540d\u79f0\")\nsleep(0.5)\ndesk.enter()\nsleep(1)\n# \u9009\u62e9\u7b2c\u4e00\u4e2a\u6587\u4ef6\ndesk.click_list_view_btn_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.click_first_file_in_desktop_plugs_by_ui()\nsleep(1)\n# \u6587\u7ba1\u63d2\u4ef6\u4e2d\u70b9\u51fb\u6253\u5f00\ndesk.click_open_btn_in_desktop_plugs_by_ui()\n"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#4","title":"4\u3001\u5e94\u7528\u542f\u52a8","text":"# mikigo\n \u5728UI\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u4e00\u5207\u64cd\u4f5c\u7684\u90fd\u662f\u4ece\u5e94\u7528\u542f\u52a8\u5f00\u59cb\u7684\uff0c\u800c\u5728Linux\u684c\u9762\u5e94\u7528\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u6211\u4eec\u542f\u52a8\u5e94\u7528\u7684\u65b9\u6cd5\u6709\u591a\u79cd\uff0c\u4e0b\u9762\u505a\u4e00\u4e2a\u7b80\u5355\u7684\u4ecb\u7ecd\uff1a \u3010\u4f7f\u7528dogtail\u542f\u52a8\u3011 dogtail\u63d0\u4f9b\u4e86\u5e94\u7528\u542f\u52a8\u7684\u65b9\u6cd5\uff0c\u5728utils\u5e93\u4e2d\uff0c\u4f7f\u7528run\u65b9\u6cd5\u542f\u52a8\uff1a \u9996\u5148\u5bfc\u5165\u65b9\u6cd5\uff1a from dogtail.utils import *\n \u8c03\u7528run\u65b9\u6cd5 run('deepin-music')\n \u5373\u53ef\u542f\u52a8\u97f3\u4e50 \u8fd9\u79cd\u65b9\u6cd5\u7684\u4f18\u70b9\u662f\u91c7\u7528\u8fdb\u7a0b\u7684\u65b9\u5f0f\u76f4\u63a5\u542f\u52a8\uff0c\u4e0d\u4f9d\u8d56\u4e0eUI\uff0c\u65e0\u8bba\u684c\u9762\u6216\u4efb\u52a1\u680f\u4e0a\u662f\u5426\u5b58\u5728\u5e94\u7528\u56fe\u6807\uff0c\u90fd\u53ef\u4ee5\u6b63\u5e38\u542f\u52a8\u3002 \u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c \u5982\u679c\u4f7f\u7528ssh\u8fdc\u7a0b\u8c03\u7528\uff0c\u6216\u8005Jenkins\u4e2d\u6267\u884c\u6d4b\u8bd5\u811a\u672c\u7684\u65f6\u5019\uff0c\u5728sniff\u4e2d\u4f1a\u51fa\u73b0\u627e\u4e0d\u5230\u5e94\u7528\uff0c\u7ecf\u8fc7\u5206\u6790\uff0c\u53ef\u80fd\u662f\u56e0\u4e3a\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\u542f\u52a8\u7684\u65f6\u5019\uff0c\u5b9e\u9645\u662f\u91c7\u7528\u4e00\u4e2a\u5b50\u8fdb\u7a0b\u542f\u52a8\u4e86\u5e94\u7528\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u5230\u3002 \u3010\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u3011 \u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807 \u901a\u5e38\u6709\u4e24\u79cd\u65b9\u6cd5\uff1a \uff081\uff09\u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807\u3002 \uff082\uff09\u5df2\u77e5\u5e94\u7528\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u7684\u4f4d\u7f6e\uff0c\u7136\u540e\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u5bf9\u5e94\u5750\u6807\u3002 \u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u7f3a\u70b9\u662f\u4f4d\u7f6e\u5fc5\u987b\u56fa\u5b9a\uff0c\u5982\u679c\u79fb\u52a8\u4f4d\u7f6e\u5c31\u4e0d\u884c\u4e86\uff0c\u800c\u4f7f\u7528\u7b2c\u4e00\u79cd\u65b9\u6cd5\uff0c\u65e0\u8bba\u4f4d\u7f6e\u5728\u54ea\u91cc\uff0c\u53ea\u8981\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u5b58\u5728\u5373\u53ef\u3002 \u3010\u70b9\u51fb\u684c\u9762\u56fe\u6807\u542f\u52a8\u3011 \u684c\u9762\u56fe\u6807\u76ee\u524d\u662f\u91c7\u7528\u56fe\u50cf\u8bc6\u522b\u6280\u672f\uff0c\u5b9a\u4f4d\u5230\u5e94\u7528\u56fe\u6807\u7684\u5750\u6807\uff0c\u7136\u540e\u901a\u8fc7pyauogui\u8fdb\u884c\u70b9\u51fb\u64cd\u4f5c\u3002 \u8be6\u7ec6\u6280\u672f\u65b9\u6848\u53ef\u4ee5\u53c2\u8003\u6211\u7684\u53e6\u5916\u4e24\u7bc7\u535a\u5ba2: \u57fa\u4e8eopencv\u7684\u6a21\u677f\u5339\u914d\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd4\u56de\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 Python\u4e09\u65b9\u5e93PyAutoGui\u7684\u4f7f\u7528\u65b9\u6cd5 \u3010\u4ece\u542f\u52a8\u5668\u542f\u52a8\uff08\u4fd7\u79f0\u5f00\u59cb\u83dc\u5355\uff09\u3011 \u542f\u52a8\u4e2d\u542f\u52a8\u7684\u5b9e\u73b0\u903b\u8f91\u5b9e\u9645\u548c\u4efb\u52a1\u680f\u4e0a\u542f\u52a8\u5dee\u4e0d\u591a\u3002 \u9996\u5148\uff0c\u9700\u8981\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u542f\u52a8\u5668\u56fe\u6807\uff0c\u6216\u8005\u952e\u76d8super\u952e\uff0c\u5c06\u542f\u52a8\u5668\u547c\u51fa\u6765\uff0c \u7136\u540e\uff0c\u5728\u542f\u52a8\u5668\u4e2d\u70b9\u51fb\u5bf9\u5e94\u7684\u56fe\u6807\uff0c \u4f46\u662f\u8fd9\u91cc\u6709\u4e2a\u95ee\u9898\uff0c\u542f\u52a8\u5668\u4e2d\u7684\u5e94\u7528\u5217\u8868\uff0c\u4e00\u9875\u5c55\u793a\u4e0d\u5b8c\uff0c\u6240\u4ee5\u5982\u679c\u6211\u4eec\u8981\u70b9\u51fb\u7684\u5e94\u7528\u56fe\u6807\u4e0d\u5728\u7b2c\u4e00\u9875\u600e\u4e48\u529e\uff0c\u901a\u5e38\u89e3\u51b3\u65b9\u6848\u6709\u4e24\u79cd\uff1a \uff081\uff09\u9700\u8981\u8fdb\u884c\u5411\u4e0b\u6ed1\u52a8\uff0c\u8fd9\u91cc\u5c31\u6d89\u53ca\u5230\u76f8\u5e94\u7684\u8bc6\u522b\u65b9\u6848\uff0c\u5224\u65ad\u5982\u679c\u4e0d\u5728\u7b2c\u4e00\u9875\u5c31\u5f80\u4e0b\u6ed1\u52a8\u7ffb\u9875\u3002 \uff082\uff09\u542f\u52a8\u5668\u63d0\u4f9b\u641c\u7d22\u7684\u529f\u80fd\uff0c\u8f93\u5165\u5e94\u7528\u540d\u79f0\u641c\u7d22\uff0c\u7136\u540e\u8fdb\u884c\u70b9\u51fb\u3002 \u4ece\u5b9e\u9645\u64cd\u4f5c\u4e2d\u6765\u770b\uff0c\u91c7\u7528\u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u6548\u7387\u4f1a\u9ad8\u4e00\u70b9\u3002 \u3010\u7ec8\u7aef\u547d\u4ee4\u542f\u52a8\u3011 \u5728python\u4e2d\uff0c\u4f7f\u7528os.popen()\u6216os.system()\u6216\u8005subprocess.Popen()\uff0c\u5b9e\u73b0\u547d\u4ee4\u884c\u542f\u52a8\uff0c\u6bd4\u5982\uff1a import os\nos.popen('deepin-music')\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u8fdc\u7a0b\u6267\u884c\u811a\u672c\u7684\u65f6\u5019\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u7684\u95ee\u9898\u3002 \u3010\u603b\u7ed3\u3011 \u4ee5\u4e0a\u51e0\u79cd\u65b9\u6cd5\uff0c\u5404\u6709\u4f18\u7f3a\u70b9\uff0c\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff1a \uff081\uff09\u5982\u679c\u9700\u8981\u5728Jenkins\u4e2d\u505a\u6301\u7eed\u96c6\u6210\uff0c\u5efa\u8bae\u4f7f\u7528\u7b2c\u4e8c\u79cd\u4efb\u52a1\u680f\u542f\u52a8\u7684\u65b9\u6cd5\u3002 \uff082\uff09\u5982\u679c\u4e0d\u4f1a\u91c7\u7528\u8fdc\u7a0b\u6267\u884c\u7684\uff0c\u5efa\u8bae\u91c7\u7528\u7b2c\u4e00\u79cd\u6216\u8005\u6700\u540e\u4e00\u79cd\u65b9\u6848\u3002 \uff083\uff09\u7b2c\u4e09\u79cd\u548c\u7b2c\u56db\u79cd\u542f\u52a8\u65b9\u6cd5\uff0c\u901a\u5e38\u5728\u6d4b\u8bd5\u7528\u4f8b\u4e2d\u4f1a\u6d89\u53ca\u5230\uff0c\u6240\u4ee5\u5076\u5c14\u4f1a\u7528\u3002"},{"location":"RELEASE/","title":"\u7248\u672c\u66f4\u65b0\u8bb0\u5f55","text":""},{"location":"RELEASE/#220202395","title":"2.2.0\uff082023/9/5\uff09","text":"new \u6b63\u5f0f\u542f\u7528 letmego \u6280\u672f\u65b9\u6848\uff1b fix \u5bf9 docs \u91cc\u9762\u7ec6\u5316\u4e86\u8fdc\u7a0b\u6267\u884c\u7ae0\u8282\u7684\u63cf\u8ff0\uff1b "},{"location":"RELEASE/#2152023831","title":"2.1.5\uff082023/8/31\uff09","text":"new \u5c06\u6709\u8da3\u7684\u6587\u6863\u7cfb\u7edf\u8fc1\u79fb\u5230 linuxdeepin \uff0c\u5265\u79bb\u6587\u6863\u4e2d\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u91c7\u7528 CDN \u52a0\u901f\u65b9\u5f0f\u52a0\u8f7d\uff1b \u5c1d\u8bd5\u5408\u5165\u4e00\u4e2a\u6709\u8da3\u7684\u529f\u80fd\uff1b fix \u4fee\u590d\u4e86 Wayland \u952e\u9f20\u5de5\u5177\u6ca1\u6709\u9f20\u6807\u76f8\u5bf9\u79fb\u52a8\u65b9\u6cd5 moveRel \u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 Wayland \u4e0b\u83b7\u53d6\u7a97\u53e3\u4fe1\u606f\u529f\u80fd\u6a21\u5757\u4e2d\u73af\u5883\u53d8\u91cf\u7684\u95ee\u9898\uff1b \u4f18\u5316\u4e86 startproject \u529f\u80fd\u7684\u4e00\u4e9b\u4fe1\u606f\u8f93\u51fa\uff1b \u4fee\u590d\u4e86\u7279\u6b8a\u573a\u666f\u4e0b env_dev.sh \u5f00\u53d1\u73af\u5883\u90e8\u7f72\u662f\u53ef\u80fd\u5f71\u54cd\u5230\u6b63\u5f0f\u73af\u5883 env.sh \u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#2122023822","title":"2.1.2\uff082023/8/22\uff09","text":"new \u589e\u52a0 OCR \u8bc6\u522b\u81ea\u52a8\u91cd\u8bd5\u673a\u5236\uff0c\u9ed8\u8ba4\u91cd\u8bd5 2 \u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u91cd\u8bd5\u6b21\u6570\uff1b \u4f7f\u7528\u7a97\u7ba1\u6700\u65b0\u63d0\u4f9b\u7684\u4e8c\u8fdb\u5236\u63a5\u53e3\uff0c\u4f18\u5316\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u5728 Wayland \u4e0b\u83b7\u53d6\u7a97\u53e3\u4fe1\u606f\u7684\u65b9\u6cd5\uff1b\u611f\u8c22\u684c\u9762\u6d4b\u8bd5\u90e8 @\u4f55\u6743 @\u5b59\u7fe0 \u3001\u7a97\u7ba1\u7814\u53d1 @\u9ec4\u6cfd\u94ed \u7684\u5927\u529b\u652f\u6301\u3002 \u6269\u5145 skipif \u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\u51fd\u6570\uff1a skipif_xdg_type \u652f\u6301 x11 \u6216 wayland \u4e0a\u8df3\u8fc7\uff1b skipif_cpu_name \u652f\u6301\u4e0d\u540c cpu \u4e0a\u8df3\u8fc7\uff0c\u6bd4\u5982\uff1askipif_cpu_name-KLVVW5821\uff1b "},{"location":"RELEASE/#2102023818","title":"2.1.0\uff082023/8/18\uff09","text":"fix \u4fee\u590d SW \u67b6\u6784\u73af\u5883\u4f9d\u8d56\u7684\u95ee\u9898\uff0c\u539f\u56e0\u662f\u4e4b\u524d\u6211\u8fd9\u91cc\u672c\u5730\u6ca1\u6709 SW \u7684\u673a\u5668\uff0c\u6ca1\u6709\u505a\u76f8\u5173\u9002\u914d\uff1b \u4fee\u590d\u5b50\u9879\u76ee\u5355\u72ec\u9700\u8981\u4e09\u65b9\u5305 pexpect\uff0c\u7531\u4e8e\u4e4b\u524d\u662f\u9884\u88c5\u5230\u955c\u50cf\u91cc\u9762\u7684\uff0c\u4f46\u57fa\u7840\u6846\u67b6\u4e0d\u9700\u8981\uff0c\u56e0\u6b64\u6ca1\u6709\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u91cc\u9762\uff0c\u5bfc\u81f4\u5b50\u9879\u76ee\u4f9d\u8d56\u62a5\u9519\u3002 \u4fee\u590d\u5b50\u9879\u76ee cv \u5bfc\u5165\u62a5\u9519\u7684\u95ee\u9898\uff1b \u539f\u56e0\u4e3a\uff1ayouqu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u517c\u5bb9\u4e24\u79cd\u60c5\u51b5\uff0c\u4e00\u79cd\u662f\u9762\u5411\u670d\u52a1\uff0c\u5c31\u662f\u672c\u5730\u6d4b\u8bd5\u673a\u4e0d\u9700\u8981\u5b89\u88c5 OpenCV\uff0c\u7528\u4f8b\u4e2d\u7684\u56fe\u50cf\u8bc6\u522b\u4f1a\u901a\u8fc7\u8fdc\u7a0b\u670d\u52a1\u63a5\u53e3\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u548c\u7ed3\u679c\u83b7\u53d6\uff1b\u7b2c\u4e8c\u79cd\u662f\u539f\u751f\uff0c\u5c31\u662f\u672c\u5730\u76f4\u63a5\u5b89\u88c5 OpenCV \u76f4\u63a5\u7528\u3002\u4e24\u4e2a\u60c5\u51b5\u7684\u4f18\u5148\u7ea7\u662f\u4f18\u5148\u5224\u65ad\u672c\u5730\u5b58\u5728\uff0c\u5426\u5219\u8d70\u670d\u52a1\u3002 \u524d\u9762\u6211\u4eec\u5df2\u7ecf\u628a OCR \u529f\u80fd\u505a\u4e86\u670d\u52a1\u5316\uff0c\u57fa\u4e8e 1 \u5e74\u591a\u4ee5\u6765\u7684\u89c2\u5bdf\uff0c\u7528\u8d77\u6765\u5f88\u7a33\u5b9a\uff0c\u518d\u4e00\u4e2a\u5c31\u662f OpenCV \u5b89\u88c5\u5305\u662f\u6bd4\u8f83\u81c3\u80bf\u7684\uff0c\u7c97\u7565\u6570\u4e86\u4e0b\u4f9d\u8d56\u6709 30+ \u4e2a\uff0c\u800c\u4e14\u5728\u5404\u67b6\u6784\u4e0a\u4f9d\u8d56\u5305\u8fd8\u4e0d\u5c3d\u76f8\u540c\uff0c\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u65b9\u6848\u4e2d\u4e0d\u592a\u597d\u5904\u7406\uff0c\u6240\u4ee5\u672c\u6b21 2.0 \u7248\u672c\u6211\u4eec\u5927\u80c6\u7684\u5c06\u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u529f\u80fd\u4fee\u6539\u4e3a\u9762\u5411\u670d\u52a1\u7684\u65b9\u5f0f\uff0c\u524d\u671f\u6d4b\u8bd5\u4e00\u5207\u770b\u8d77\u6765\u90fd\u5f88\u548c\u8c10\u3002 \u4f46\u662f\u6ca1\u6ce8\u610f\u5230\u4e4b\u524d\u7ed9\u6d77\u71d5\u59d0\u90a3\u8fb9\u9879\u76ee\u5355\u72ec\u5b9a\u5236\u505a\u4e86\u4e2a\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\uff08\u4e3a\u4e86\u80fd\u7b80\u5355\u5e73\u6ed1\u7684\u8fc1\u79fb\u5230 youqu\uff09\uff0c\u6b64\u63a5\u53e3\u5e95\u5c42\u6ca1\u6709\u517c\u5bb9\u670d\u52a1\u5316\uff0c\u6240\u4ee5\u5979\u90a3\u8fb9\u7684\u9879\u76ee\u8c03\u7528\u6b64\u5b9a\u5236\u63a5\u53e3\u4f1a\u62a5 cv \u5bfc\u5165\u7684\u95ee\u9898\u3002 \u7531\u4e8e\u5c06\u8fd9\u4e2a\u5b9a\u5236\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\u8fdb\u884c\u670d\u52a1\u5316\u517c\u5bb9\u6539\u9020\u9700\u8981\u4e00\u5b9a\u65f6\u95f4\uff0c\u6539\u5b8c\u8fd8\u9700\u8981\u6d4b\u8bd5\uff0c\u4f46\u672c\u6b21\u65f6\u95f4\u6bd4\u8f83\u7d27\uff0c\u56e0\u6b64\u5148\u628a OpenCV \u88c5\u8fdb\u865a\u62df\u73af\u5883\uff0c\u540e\u7eed\u7248\u672c\u518d\u8003\u8651\u9488\u5bf9\u6b64\u63a5\u53e3\u505a\u4fee\u6539\u3002"},{"location":"RELEASE/#2002023816","title":"2.0.0\uff082023/8/16\uff09","text":"YouQu\uff08\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff09\u5f00\u6e90\u4e86\uff0c\u540c\u65f6\u63a8\u51fa\u4e86 2.0 \u7248\u672c\u3002 \u611f\u8c22\u738b\u6ce2\u603b\u3001\u67b6\u6784\u5e08\u5f90\u5c0f\u4e1c\u3001\u7814\u53d1\u7ecf\u7406\u90d1\u5e7c\u6208\u3001\u5218\u90d1\u7b49\u7814\u53d1\u540c\u4e8b\u7684\u5927\u529b\u652f\u6301\u3002 new 1\u3001\u65b0\u7684\u57fa\u7840\u6846\u67b6\u4ee3\u7801\u83b7\u53d6\u65b9\u5f0f\u53ca\u65b0\u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4 YouQu \u540e\u7eed\u5747\u901a\u8fc7 PyPI \u8fdb\u884c\u5305\u7684\u53d1\u5e03\uff0c\u4e5f\u5c31\u662f\u8bf4\u540e\u7eed\u53ef\u4ee5\u4f7f\u7528 pip \u8fdb\u884c\u5b89\u88c5\uff1a sudo pip3 install youqu==2.0.0\n \u8fd9\u91cc\u6709 2 \u4e2a\u5c0f\u70b9\u8981\u6ce8\u610f\uff1a \u63a8\u8350\u4f7f\u7528 sudo pip3 \uff08\u52a0 sudo\uff09\u8fdb\u884c\u5b89\u88c5\uff1b \u5982\u679c\u4e0d\u52a0 sudo \u6709\u4e9b\u673a\u5668\u53ef\u80fd $HOME/.local/bin \u4e0d\u5728\u7cfb\u7edf PATH \u73af\u5883\u76ee\u5f55\u4e0b\uff0c\u5728\u4e0d\u6dfb\u52a0\u73af\u5883\u53d8\u91cf\u7684\u60c5\u51b5\u4e0b\uff0c\u4f1a\u51fa\u73b0 YouQu \u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4\uff08youqu-startproject\uff09\u65e0\u6cd5\u4f7f\u7528\u7684\u95ee\u9898\uff1b \u5f53\u7136\uff0c\u5c06\u4e0a\u8ff0\u8def\u5f84\u6dfb\u52a0\u5230\u73af\u5883\u53d8\u91cf\u4e4b\u540e\u4e5f\u662f\u53ef\u4ee5\u7528\u7684\uff0c\u6240\u4ee5\u6211\u8fd9\u91cc\u662f\u63a8\u8350\u52a0 sudo\uff0c\u4e0d\u52a0 sudo \u4e5f\u662f\u53ef\u4ee5\u7684\uff0c\u53ea\u662f\u9700\u8981\u5173\u6ce8\u4e0b\u73af\u5883\u53d8\u91cf\u7684\u95ee\u9898\u3002 \u63a8\u8350\u6307\u5b9a\u7248\u672c\u53f7\uff08youqu==2.0.0\uff09\u5b89\u88c5\uff0c\u5982\u679c\u4e0d\u6307\u5b9a\u7248\u672c\u53f7\u9ed8\u8ba4\u662f\u5b89\u88c5\u6700\u65b0\u53d1\u5e03\u7684 YouQu \u7248\u672c\uff0c\u4f60\u53ef\u4ee5\u5728 PyPI \u4e0a\u7684 Release history \u91cc\u9762\u67e5\u770b\u6709\u54ea\u4e9b\u7248\u672c\u3002 \u5b89\u88c5\u4e4b\u540e\u4f1a\u81ea\u52a8\u751f\u6210\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu-startproject\uff0c\u4f7f\u7528\u5b83\u53ef\u4ee5\u521d\u59cb\u5316\u5de5\u7a0b\uff0c\u8fd9\u91cc\u4ee5\u97f3\u4e50\u4e3e\u4f8b\uff1b youqu-startproject autotest_deepin_music\n \u8fd9\u6837\u5c31\u4f1a\u5728\u5f53\u524d\u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a autotest_deepin_music \u76ee\u5f55\uff0c\u91cc\u9762\u5305\u542b\u4e86\u57fa\u7840\u6846\u67b6\u6240\u6709\u7684\u4ee3\u7801\uff1b \u4e4b\u540e\uff0c\u8fd8\u662f\u5728 apps \u76ee\u5f55\u4e0b\uff0c\u653e\u5165\u5b50\u9879\u76ee\u7684AT\u4ee3\u7801\u5373\u53ef\uff0c\u4f7f\u7528\u65b9\u6cd5\u548c\u8fc7\u53bb\u4e00\u6837\uff0c\u8fd9\u91cc\u5c31\u4e0d\u591a\u4ecb\u7ecd\u3002 \u53e6\u5916\uff0c\u9664\u4e86\u901a\u8fc7 pip \u83b7\u53d6\u4ee5\u5916\uff0c\u4ecd\u7136\u53ef\u4ee5\u901a\u8fc7\u6e90\u7801\u83b7\u53d6\uff08\u76f4\u63a5 git clone\uff09\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u4f7f\u7528 pip \u5b89\u88c5 YouQu \u65f6\uff0cYouQu \u5305\u7684\u5927\u5c0f\u624d 600+ k\uff0c\u5b89\u88c5\u901f\u5ea6\u8d77\u98de\u3002 2\u3001\u65b0\u7684AT\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848 \u4e3a\u4e86\u89e3\u51b3\u4ee5\u4e0b\u95ee\u9898\uff1a \u8fc7\u53bb\u4e00\u6bb5\u65f6\u95f4\u54b1\u4eec\u7ecf\u5e38\u51fa\u73b0\u7684\uff0c\u4e0d\u540c\u7684AT\u9879\u76ee\u5728\u540c\u4e00\u53f0\u673a\u5668\u4e0a\u90e8\u7f72\u73af\u5883\u65f6\u4f9d\u8d56\u7248\u672c\u51b2\u7a81\u7684\u95ee\u9898\uff0c\u65b0\u65b9\u6848\u4e0d\u540c\u7684\u9879\u76ee\u4f1a\u52a8\u6001\u751f\u6210\u81ea\u5df1\u7684\u865a\u62df\u73af\u5883\uff0c\u76f8\u4e92\u4e4b\u95f4\u4e0d\u5f71\u54cd\uff1b \u4e1a\u5185\u4e3a\u4e86\u89e3\u51b3\u7248\u672c\u51b2\u7a81\u95ee\u9898\u4e00\u822c\u90fd\u4f1a\u4f7f\u7528Python\u865a\u62df\u73af\u5883\u7684\u5de5\u5177\uff0c\u4f46\u662f\u90fd\u6709\u4e2a\u95ee\u9898\uff0c\u65e0\u6cd5\u7ba1\u7406 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u5305\uff0c\u672c\u6b21\u6211\u4eec\u89e3\u51b3\u4e86\u8fd9\u4e2a\u95ee\u9898\uff0c\u80fd\u591f\u5b8c\u5168\u7ba1\u7406\u5e38\u89c4\u7684Python\u5305\uff0c\u4e5f\u80fd\u7ba1\u7406\u5230 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u4e09\u65b9\u5305\uff1b \u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u4f7f\u7528\u65b9\u6cd5\uff1a bash env.sh\n \u53ef\u4ee5\u770b\u51fa\u6765\u548c\u539f\u6765\u4f7f\u7528\u65b9\u6cd5\u6ca1\u6709\u53d8\u5316\uff0c\u4e5f\u5c31\u662f\u8bf4\u4ece\u4f7f\u7528\u7684\u89d2\u5ea6\u662f\u5b8c\u5168\u6ca1\u6709\u533a\u522b\u7684\uff0c\u53ea\u662f\u5185\u90e8\u505a\u4e86\u4e0d\u540c\u7684\u4e8b\u60c5\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u672c\u673a\u90e8\u7f72\u7684\u529f\u80fd\u4ecd\u7136\u4fdd\u7559 env_dev.sh\uff0c\u53ef\u4ee5\u4f5c\u4e3a\u5f00\u53d1\u65f6\u7684\u73af\u5883\u90e8\u7f72\u3002 3\u3001\u65b0\u7684\u9a71\u52a8\u547d\u4ee4 \u8fc7\u53bb\u54b1\u4eec\u90fd\u662f\u4f7f\u7528\u8fd9\u6837\u7684\u547d\u4ee4\u6765\u9a71\u52a8\u6267\u884c\uff1a python3 manage.py run\n \u7531\u4e8e\u9ed8\u8ba4\u57fa\u4e8e\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848\uff0c\u56e0\u6b64\u6211\u4eec\u589e\u52a0\u4e86\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu\uff1b \u65b0\u7684\u9a71\u52a8\u65b9\u5f0f\uff1a youqu manage.py run\n \u53ea\u9700\u8981\u628a python3 \u66ff\u6362\u6210 youqu \u5c31\u53ef\u4ee5\u4e86\uff0c\u770b\u8d77\u6765\u5f88\u548c\u8c10~ 4\u3001\u65b0\u7684\u6587\u6863\u5730\u5740 \u8fc7\u53bb\u54b1\u4eec YouQu \u7684\u5728\u7ebf\u6587\u6863\u662f\u90e8\u7f72\u5728\u516c\u53f8\u5185\u7f51\u7684\uff0c\u73b0\u5728\u5f00\u6e90\u5230 github \u4e86\uff0c\u5916\u90e8\u5f00\u53d1\u8005\u80af\u5b9a\u8bbf\u95ee\u4e0d\u5230\u5185\u7f51\u7684\u6587\u6863\uff0c\u56e0\u6b64\u9700\u8981\u5c06\u6587\u6863\u90e8\u7f72\u5230\u516c\u7f51\u3010\u516c\u7f51\u6587\u6863\u3011\uff1b \u516c\u7f51\u6587\u6863\u4f7f\u7528\u7684\u662f github pages\uff08\u767d\u5ad6\u602a\u4e00\u987f\u72c2\u559c~~\uff09\uff0c\u4f46\u53ef\u80fd\u4f1a\u51fa\u73b0\u6587\u6863\u901f\u5ea6\u6162\u7684\u95ee\u9898\uff08\u4ee3\u7406\u4e0b\u5c31\u597d\u4e86\uff09\uff0c\u4e0d\u8fc7\u6ca1\u5173\u7cfb\uff0c\u54b1\u4eec\u3010\u5185\u7f51\u6587\u6863\u3011\u4ecd\u7136\u4fdd\u7559\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u3002 5\u3001\u5176\u4ed6\u4e00\u4e9b\u5c0f\u5c0f\u529f\u80fd\u66f4\u65b0\uff1a \uff081\uff09\u65b0\u589e\u5173\u95ed\u5206\u8fa8\u7387\u68c0\u6d4b\u7684\u53c2\u6570\u503c\uff1b youqu manage.py run --resolution no\n \u6216\u8005\u4fee\u6539 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387, \u6bd4\u5982\uff1a1920x1080\n;no: \u8868\u793a\u4e0d\u505a\u5206\u8fa8\u7387\u6821\u9a8c\nRESOLUTION = 1920x1080\n resolution \u8fd9\u4e2a\u53c2\u6570\u4e00\u76f4\u90fd\u6709\u7684\uff0c\u53ea\u4e0d\u8fc7\u4e4b\u524d\u662f\u7528\u4e8e\u6307\u5b9a\u5206\u8fa8\u7387\u5927\u5c0f\uff0c\u6bd4\u5982 --resolution 1920x1080\uff0c\u4f46\u6709\u4e9b\u63a5\u53e3\u7684\u9879\u76ee\u4e0d\u9700\u8981\u8fd9\u4e2a\u68c0\u67e5\uff0c\u53ef\u4ee5\u7ed9\u5b83\u4e2a no \u5c31\u597d\u4e86\uff0c\u5f53\u7136 CICD \u4e0a\u5173\u95ed\uff0c\u9700\u8981\u6d41\u6c34\u7ebf\u4e0a\u628a\u8fd9\u4e2a\u53c2\u6570\u52a0\u4e0a\uff1b \uff082\uff09\u65b0\u589e\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u7684\u547d\u4ee4\u884c\u53c2\u6570 \u4e4b\u524d\u8fd9\u4e2a\u914d\u7f6e\u9879\u53ea\u80fd\u5728 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c 1 \u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff0cRERUN >= RECORD_FAILED_CASE\u3002\n;1.\u5173\u95ed\u5f55\u5c4f\uff1aRECORD_FAILED_CASE > RERUN\n;2.\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1aRECORD_FAILED_CASE = 0\nRECORD_FAILED_CASE = 1\n \u73b0\u5728\u5c06\u5f00\u53d1\u5230\u547d\u4ee4\u884c\u53c2\u6570\u3002 youqu manage.py run --record_failed_case 2\n fix \u4fee\u590d remote \u6267\u884c\u65f6\uff0c\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u65e0\u6cd5\u751f\u6210\u6d4b\u8bd5\u62a5\u544a\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1302023710","title":"1.3.0\uff082023/7/10\uff09","text":"fix \u8fdb\u4e00\u6b65\u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b\u53c2\u8003\uff1a\u914d\u7f6ePython\u6e90\u7684\u51e0\u79cd\u65b9\u6cd5 \u4fee\u590d wayland_autotool \u53d7\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86wayland\u4e0b\u5076\u73b0\u627e\u4e0d\u5230 .Xauthority \u6587\u4ef6\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1292023626","title":"1.2.9\uff082023/6/26\uff09","text":"fix \u4f18\u5316\u8fdc\u7a0b\u6267\u884c remote \u7684\u53c2\u6570\u76f4\u63a5\u4f20\u7ed9\u8fdc\u7a0b\u673a\u5668\u7684 run \u547d\u4ee4\uff0c\u4e0d\u7528\u518d\u5355\u72ec\u5904\u7406\u8fdc\u7a0b\u6267\u884c\u7684\u53c2\u6570\u903b\u8f91\uff0c\u540e\u7eed\u4e13\u6ce8\u4e8e\u672c\u5730\u6267\u884c\u529f\u80fd\u5f00\u53d1\uff0c\u8fdc\u7a0b\u6267\u884c\u81ea\u52a8\u9002\u7528\uff1b env.sh \u79fb\u9664 pyyaml \u5b89\u88c5\uff0c\u7531\u5b50\u9879\u76ee\u5728 requirement.txt \u91cc\u9762\u5b9a\u4e49\uff0c\u6846\u67b6\u81ea\u52a8\u52a0\u8f7d\uff1b \u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b "},{"location":"RELEASE/#128202369","title":"1.2.8\uff082023/6/9\uff09","text":"fix \u4fee\u590d\u4e86 pypi \u5b89\u88c5 numpy \u5b58\u5728\u7cfb\u7edf\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#127202368","title":"1.2.7\uff082023/6/8\uff09","text":"fix env.sh \u4e2d\u5b89\u88c5 Python \u5305\u672a\u6307\u5b9a\u7248\u672c\u65f6\uff0c\u65e5\u5fd7\u8f93\u51fa\u5b89\u88c5\u7684\u7248\u672c\uff1b pdocr-rpc 2.0.1\nallure-custom 1.2.1\nfunnylog 1.1.3\n \u4fee\u590d -f \u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u62a5\u9519\u7684\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#126202367","title":"1.2.6\uff082023/6/7\uff09","text":"fix \u4fee\u590d wayland \u4e0a\u8c03\u7528\u9f20\u6807\u4e2d\u952e\u3001\u53f3\u952e\u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b \u4fee\u590d pubilic/dde_desktop_public_widget \u91cc\u9762\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u5b9a\u4f4d\u684c\u9762\u6587\u4ef6\u7684\u65b9\u6cd5\uff0c\u5750\u6807\u6ca1\u6709\u62c6\u5305\u7684\u95ee\u9898\uff1b \u4f18\u5316\u4e86\u7b49\u5f85\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b pycreeze \u7248\u672c\u5347\u7ea7\u5230 0.1.29\uff0c\u5bfc\u81f4\u4e0e pyautogui 0.9.53 \u4e0d\u517c\u5bb9\uff0cenv.sh \u91cc\u9762\u589e\u52a0\u6307\u5b9a pycreeze \u7248\u672c\u4e3a 0.1.28\uff1b "},{"location":"RELEASE/#1252023516","title":"1.2.5\uff082023/5/16\uff09","text":"new --app \u53c2\u6570\u540e\u9762\u65b0\u589e\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u76ee\u524d\u652f\u6301\u4e09\u79cd\u53c2\u6570\u4f20\u5165\u65b9\u5f0f\uff1a ~$: youqu run -a deepin-music\n~$: youqu run -a autotest_deepin_music\n~$: youqu run -a apps/autotest_deepin_music\n \u200b \u540e\u4e24\u79cd\u5165\u53c2\u65b9\u5f0f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\u3002 remote \u8fdc\u7a0b\u6267\u884c\u65b0\u589e\u4ece\u547d\u4ee4\u884c\u4f20\u5165\u6d4b\u8bd5\u673a\u4fe1\u606f\uff0c\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679c password \u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6 setting/remote.ini \u4e2d CLIENT_PASSWORD \u7684\u503c,\u6bd4\u5982\uff1auos@10.8.13.33:1 \u6216 uos@10.8.13.33 \uff1b python3 manage.py remote -c uos@10.8.13.33/uos@10.8.13.34\npython3 manage.py remote -c uos@10.8.13.33:1/uos@10.8.13.34:2\n fix \u65e5\u5fd7\u6a21\u5757\u4fee\u6539\u4e3a\u51fd\u6570\u6267\u884c\u4e4b\u524d\u6253\u5370\u65e5\u5fd7\uff1b \u65e5\u5fd7\u6a21\u5757\u589e\u52a0\u767d\u540d\u5355\uff0c\u901a\u8fc7\u7c7b\u540d\u5f00\u5934\uff0c\u7ed3\u675f\uff0c\u5305\u542b\u7b49\u5173\u952e\u5b57\u63a7\u5236\u9700\u8981\u6253\u5370\u7684\u51fd\u6570\u65e5\u5fd7\uff1b \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5982\u679c\u4f20\u5165\u4e86 app_name \u53ea\u4f1a\u5c06 apps \u76ee\u5f55\u4e0b app_name \u7684\u76ee\u5f55\u53d1\u9001\u5230\u6d4b\u8bd5\u673a\uff1b env.sh \u79fb\u9664 python3-dev\uff1b \u4fee\u590d Wayland \u4e0b env.sh \u73af\u5883\u5b89\u88c5\u5931\u8d25\u7684\u95ee\u9898\uff0c\u4f18\u5316\u4e86 deb \u4f9d\u8d56\u5b89\u88c5\u7684\u903b\u8f91\uff1b \u5c06 env.sh \u5237\u65b0\u6e90\u7684\u65e5\u5fd7\u5728\u7ec8\u7aef\u663e\u793a\uff0c\u89e3\u51b3\u5728 CI \u73af\u5883\u4e0b\uff0c\u957f\u65f6\u95f4\u4e0d\u8f93\u51fa\u65e5\u5fd7\u8fde\u63a5\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d1060 \u534e\u4e3a\u673a\u578b\u5b89\u88c5\u952e\u9f20\u5de5\u5177\u65f6\u4f9d\u8d56\u4e0d\u517c\u5bb9\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1242023227","title":"1.2.4\uff082023/2/27\uff09","text":"fix \u4fee\u6539 CURRENT \u6587\u4ef6\uff1b "},{"location":"RELEASE/#1232023227","title":"1.2.3\uff082023/2/27\uff09","text":"new pylint.sh \u652f\u6301\u901a\u8fc7\u4f4d\u7f6e\u53c2\u6570\u4f20\u5165\u6587\u4ef6\u8def\u5f84\uff1abash pylint.sh apps/autotest_deepin_music,\u597d\u5904\u662f\u53c2\u6570\u8def\u5f84\u53ef\u4ee5\u5728\u7ec8\u7aef\u8865\u5168\uff1b \u65b0\u589e\u7cfb\u7edf\u547d\u4ee4 youqu-pylint \uff0c\u7528\u4e8e\u9759\u6001\u4ee3\u7801\u626b\u63cf\uff0c\u4f7f\u7528\u65b9\u6cd5: youqu-pylint apps/autotest_deepin_music\uff1b \u7531\u4e8e\u7cfb\u7edf\u4e00\u4e9b dbus \u63a5\u53e3\u6539\u53d8\uff0c\u516c\u5171\u5e93\u4e2d\u7684 dbus \u65b9\u6cd5\u5c06\u4e0d\u518d\u7ef4\u62a4\uff0c\u7531\u5b50\u9879\u76ee\u5728 other_widget.py \u91cc\u9762\u8fdb\u884c\u7ef4\u62a4\uff1b fix \u4fee\u590d ssh \u73af\u5883\u4e0b\u8fd0\u884c\u63d0\u793a \u201c\u65e0\u6cd5\u8fde\u63a5\u201d \u7684\u95ee\u9898\uff1b \u4fee\u590d\u8fd0\u884c\u65f6\u7a0b\u5e8f\u9000\u51fa\uff0c\u4e0d\u8f93\u51fa\u5f02\u5e38\u65e5\u5fd7\u7684\u95ee\u9898\uff1b \u4fee\u590dyouqu remote xxx \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5728\u670d\u52a1\u7aef Ctrl + C \u65e0\u6cd5\u505c\u6b62\u7a0b\u5e8f\u8fd0\u884c\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#122202328","title":"1.2.2\uff082023/2/8\uff09","text":"new \u65b0\u589e\u6c14\u6ce1\u7c7b\u56fe\u50cf\u8bc6\u522b\u65b9\u6848\uff1bimage_utils.py::ImageUtil::get_during\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u533a\u57df\u8bc6\u522b\uff0c\u4f20\u5165 [x, y, w, h]\uff0cx: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u76ee\u6807\u56fe\u7247\uff0c\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\uff1b env.sh \u79fb\u9664 pypinyin; \u4f18\u5316\u6267\u884c env.sh \u65f6\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b manage.py \u79fb\u9664\u4e86\u53c2\u6570 session_timeout \uff0c\u6846\u67b6\u6839\u636e\u5168\u5c40\u7684 timeout \u4ee5\u53ca\u7528\u4f8b\u81ea\u5b9a\u4e49\u7684 timeout \u81ea\u52a8\u8ba1\u7b97\u51fa sessiontimeout \u7684\u503c\uff1b \u65b0\u589e ocr \u670d\u52a1\u5668\u94fe\u63a5\u91cd\u8bd5\uff0c\u9ed8\u8ba4\u91cd\u8bd51\u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u53c2\u6570\uff1b fix \u4fee\u590d\u4e86\u4e00\u4e9b pylint \u626b\u63cf\u7684\u4ee3\u7801\u98ce\u683c\u95ee\u9898\uff1b \u91cd\u65b0\u8bbe\u8ba1\u4e86\u6d4b\u8bd5\u62a5\u544a\u4e3b\u9898\uff1b "},{"location":"RELEASE/#121202316","title":"1.2.1\uff082023/1/6\uff09","text":"new \u652f\u6301\u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6267\u884c\u7528\u4f8b\uff1b\u53ef\u5c06python3 manage.py \u66ff\u6362\u4e3a youqu \uff1a youqu run -a deepin-music -k 001\n RPC \u670d\u52a1 IP \u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u6307\u5b9a\u4e0d\u540c\u7684\u7aef\u53e3\uff1b \u5728\u7ebf\u6587\u6863\u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u539f\u6765\u7684\u5730\u5740 10.8.10.215 \u5c06\u4e0d\u5728\u4f7f\u7528\uff1b fix \u4fee\u590d --count \u53c2\u6570\u53ef\u80fd\u51fa\u73b0\u4e0e\u5176\u4ed6\u6846\u67b6\u7684\u5de5\u7a0b\u4f9d\u8d56\u5b58\u5728\u51b2\u7a81\uff0c\u62a5\u9519\u91cd\u590d\u6ce8\u518c\u7684\u95ee\u9898\uff1b \u4fee\u590d CI \u73af\u5883\u4e0b\u591a\u4e2a\u5de5\u7a0b\u5b58\u5728 Python \u73af\u5883\u53d8\u91cf\u6307\u5411\u9519\u8bef\uff0c\u5bfc\u5305\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u5355\u72ec\u8fd0\u884c\u65b9\u6cd5\u65f6\u65e0\u65e5\u5fd7\u8f93\u51fa\u7684 Bug\uff1b "},{"location":"RELEASE/#12020221230","title":"1.2.0\uff082022/12/30\uff09","text":"1.1.4 \u7248\u672c\u9002\u914d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e14\u65b0\u589e\u4e86\u8f83\u591a\u65b0\u7279\u6027\uff0c\u6211\u4eec\u8ba1\u5212\u4f7f\u7528 1.1.4 \u7248\u672c\u8fd0\u884c\u4e00\u6bb5\u65f6\u95f4\uff0c1.2.0 \u7248\u672c\u5c06\u4fee\u590d\u671f\u95f4\u51fa\u73b0\u7684 Bug\uff0c\u7136\u540e\u4f5c\u4e3a\u7a33\u5b9a\u7248\u672c\u53d1\u5e03\u3002 new \u4fee\u6539\u5de5\u7a0b\u540d\u79f0\u4e3a youqu\uff1b \u5c06 sphinx \u6587\u6863\u5de5\u7a0b\u8fc1\u79fb\u5230\u5355\u72ec\u7684\u4ed3\u5e93\uff1b fix \u4fee\u590d startapp \u521b\u5efa\u5de5\u7a0b\u65f6\u5b58\u5728\u5de5\u7a0b\u540d\u79f0\u65f6\u65e0\u6cd5\u7ee7\u7eed\u521b\u5efa\uff1b \u4fee\u590d\u4e86 OCR \u670d\u52a1\u5728\u5e76\u53d1\u65f6\u53ef\u80fd\u51fa\u73b0\u65e0\u6cd5\u8fd4\u56de\u7ed3\u679c\u7684\u95ee\u9898\uff0c\u63d0\u5347 OCR \u670d\u52a1\u9ad8\u5e76\u53d1\u7a33\u5b9a\u6027\uff1b \u4fee\u590d PMS \u540c\u6b65\u6807\u7b7e\u5230 CSV \u6587\u4ef6\u4e0d\u652f\u6301\u7528\u4f8b\u5e93\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11420221214","title":"1.1.4\uff082022/12/14\uff09","text":"new \u65b0\u589e startapp \u5b50\u547d\u4ee4\u521b\u5efa\u5b50\u9879\u76ee\u5de5\u7a0b\u6a21\u677f: python3 manage.py startapp autotest_deepin_xxx \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u91cd\u590d\u6267\u884c\u6b21\u6570\uff1b \u53bb\u6389\u6279\u91cf\u6267\u884c\u524d\u6536\u96c6\u7528\u4f8b\u7684\u6b65\u9aa4\uff1b \u589e\u52a0\u5f00\u59cb\u6267\u884c\u65f6\u6253\u5370\u4e00\u4e9b\u6267\u884c\u53c2\u6570\uff0c\u5982\uff1a \u7528\u4f8b\u6536\u96c6\u6570\u91cf: 99\n\u5931\u8d25\u91cd\u8dd1\u6b21\u6570: 1\n\u6700\u5927\u5931\u8d25\u6b21\u6570: 49\n\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4: 200.0s (03\u520620\u79d2)\n\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4: 11880s (3\u5c0f\u65f618\u52060\u79d2)\n \u5b9a\u5236\u4fee\u6539allure\u62a5\u544alogo\u3001title\u3001\u9ed8\u8ba4\u8bed\u8a00\uff1b manage.py \u6267\u884c\u5f00\u59cb\u65f6\u6253\u5370 logo \u548c\u5f53\u524d\u7248\u672c\uff1a \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u255a\u2588\u2588\u2557 \u2588\u2588\u2554\u255d \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2584\u2584 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2580\u2580\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u2584\u2588 \u2584\u2588 \u2588 \u2588 \u2588 \u2584 \u2588 \u2584 \u2580\u2580\u2588 \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\uff1b \u88c5\u9970\u5668\u65b9\u6cd5\u6307\u5b9a\u6b21\u6570\uff1b @pytest.mark.count(2)\ndef test_music_001():\npass\n \u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u6b21\u6570\uff1b python3 manage.py run -a deepin-music -k 001 --count 2\n \u200b image_utils \u589e\u52a0\u51fd\u6570 save_temporary_picture\uff0c\u652f\u6301\u6307\u5b9a\u5c4f\u5e55\u533a\u57df\u622a\u56fe\u5e76\u8fd4\u56de\u56fe\u7247\u5b58\u653e\u7684\u672c\u5730\u8def\u5f84\uff0c\u540e\u7eed\u4f7f\u7528 assert_image_exist \u8fdb\u884c\u65ad\u8a00 Python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(x, y, width, height) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) button_center \u65b0\u589e btn_size \u83b7\u53d6\u63a7\u4ef6\u5de6\u4e0a\u89d2\u5750\u6807\u53ca\u957f\u5bbd\uff0c\u7528\u4e8e\u52a8\u6001\u7684\u622a\u53d6\u5143\u7d20\u7684\u56fe\u7247\uff0c\u53ef\u7528\u4e8e\u5b9a\u4f4d\u65ad\u8a00 python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u6240\u6709\u97f3\u4e50\u6309\u94ae\")) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) allure \u62a5\u544a\u4e2d\u5b9a\u4f4d\u95ee\u9898\u9664\u4e86\u65e5\u5fd7\u3001\u622a\u56fe\u3001\u5f55\u5c4f\u5916\uff0c\u8c03\u7528\u7684\u51fd\u6570\u589e\u52a0\u4e86 step \u6b65\u9aa4\u5c55\u793a\uff1b env.sh \u65b0\u589e\u5b89\u88c5\u5b50\u9879\u76ee Python \u4e09\u65b9\u4f9d\u8d56\uff0c\u5728\u5b50\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u5199 requirement.txt \u6587\u4ef6\uff0cenv.sh \u4f1a\u81ea\u52a8\u52a0\u8f7d\uff1b ocr \u8bc6\u522b\u65b0\u589e\u652f\u6301\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\u8fdb\u884c\u6587\u5b57\u8bc6\u522b\uff0c\u51cf\u5c11\u56e0\u5168\u5c4f\u8bc6\u522b\u65f6\uff0c\u5176\u4ed6\u6587\u5b57\u7684\u5e72\u6270 Python # \u65ad\u8a00\u97f3\u4e50\u7684\u5220\u9664\u5f39\u7a97\u4e2d\uff0c\u5305\u542b\u4e86\u201c\u786e\u8ba4\u201d\u7684\u6587\u5b57 self.assert_ocr_exist(\"\u786e\u8ba4\", picture_abspath=DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u5220\u9664\u5f39\u7a97\"))) \u65ad\u8a00\u51fd\u6570\u7684\u8c03\u7528\u4e5f\u4f1a\u81ea\u52a8\u6253\u5370\u65e5\u5fd7; env.sh \u65b0\u589e\u88c1\u526a\u4f9d\u8d56\u7684\u65b9\u6848\uff1b fix \u4fee\u590d Jenkins \u73af\u5883\u4e0b\uff0c apps \u76ee\u5f55\u4e0b\u5b50\u9879\u76ee\u5b58\u5728 auotest_deepin_xxx@tmp \u76ee\u5f55\uff0c\u5728\u4f20\u5165 app_name \u540e\u65e0\u6cd5\u6267\u884c\u7528\u4f8b\u7684\u95ee\u9898\uff1b \u4fee\u590d\u81ea\u52a8\u751f\u6210 case_list.csv \u6587\u4ef6\u65f6\uff0c\u7528\u4f8b\u987a\u5e8f\u88ab\u8c03\u6574\u7684\u95ee\u9898\uff1b env.sh \u73af\u5883\u5b89\u88c5\u79fb\u9664 git \u548c curl\uff1b \u4fee\u590d\u7528\u4f8b\u5728 setup \u9636\u6bb5\u62a5\u9519\u540e\uff0c\u672a\u5199\u5165 ci_result.json \u7684\u95ee\u9898\uff1b \u79fb\u9664 uos_ci.py\uff1b "},{"location":"RELEASE/#11320221028","title":"1.1.3\uff082022/10/28\uff09","text":"new \u65b0\u589e\u56fe\u50cf\u65ad\u8a00\u6210\u529f\u8f93\u51fa\u5339\u914d\u5ea6\uff1b \u65b0\u589e\u73af\u5883\u5b89\u88c5 yaml \u4f9d\u8d56\uff1b \u65b0\u589e\u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6570\u636e\u56de\u586b\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b \u65b0\u589e\u6d4b\u8bd5\u7ed3\u679c\u8868\u60c5\u663e\u793a\uff0c\u5e76\u4f18\u5316\u4e86\u65e5\u5fd7\u7684\u6392\u7248\uff1b \u65b0\u589e --top {number} \u7528\u4e8e\u8bb0\u5f55\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0c\u65e5\u5fd7\u751f\u6210\u5230 report/logs/top.log\uff1b fix \u4fee\u590d\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4f46\u7ec8\u7aef\u6ca1\u6709\u9519\u8bef\u65e5\u5fd7\u8f93\u51fa\u7684\u95ee\u9898\uff1b \u4fee\u6539\u5931\u8d25\u7528\u4f8b\u56de\u6eaf\u65e5\u5fd7\u4e3a\u8be6\u7ec6\u7ea7\u522b\uff1b \u4fee\u590d\u4e86\u6267\u884c\u8fdb\u5ea6\u672a\u8ba1\u7b97\u8df3\u8fc7\u7528\u4f8b\u7684\u95ee\u9898\uff0c\u5e76\u4f18\u5316\u4e86\u8fdb\u5ea6\u83b7\u53d6\u7684\u7b97\u6cd5\uff1b \u4fee\u590d env.sh \u5728 V23 \u73af\u5883\u4e0b\u5b89\u88c5\u65e0\u6cd5\u8bfb\u53d6\u5bc6\u7801\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 pms \u6d4b\u8bd5\u5957\u6267\u884c\u6216\u6d4b\u8bd5\u5355\u6267\u884c\u65f6\uff0c\u7528\u4f8bID\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b env.sh \u91cc\u9762 hub.deepin.com \u66f4\u6362\u6210 it.uniontech.com\uff1b uos_ci.py \u6d4b\u8bd5\u7ed3\u679c\u7edf\u8ba1\u65f6\uff0c\u603b\u6570\u5254\u9664 skip \u7684\u6570\u91cf "},{"location":"RELEASE/#11220220921","title":"1.1.2\uff082022/09/21\uff09","text":"new \u5728\u6ca1\u6709\u5b89\u88c5 dogtail \u7684\u60c5\u51b5\u4e0b\uff0c\u4e5f\u80fd\u4f7f\u7528 sniff \u5de5\u5177\uff1b fix \u4fee\u590d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e2d\u6ca1\u6709\u5b89\u88c5 AT \u73af\u5883\u6267\u884c uos_ci.py \u62a5\u9519\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11120220919","title":"1.1.1\uff082022/09/19\uff09","text":"new \u65b0\u589e\u6267\u884c\u8fdb\u5ea6\u663e\u793a\uff0c\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u65f6\u65e5\u5fd7\u8f93\u51fa\u5f53\u524d\u8fdb\u5ea6\uff1a[\u5f53\u524d\u6307\u5b9a\u7b2c\u51e0\u6761/\u7528\u4f8b\u603b\u6570]\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u7528\u4f8b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\u6240\u6709\u5931\u8d25\u7528\u4f8b\u7684\u5217\u8868\uff1b \u5173\u95ed\u7ec8\u7aef\u8f93\u51fa\u6355\u83b7\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u65e5\u5fd7\u5feb\u7167\uff1b \u4f18\u5316\u7ec8\u7aef\u8f93\u51fa\u5931\u8d25\u4fe1\u606f\u5197\u957f\u4e3a\u7b80\u8981\u4fe1\u606f\u8f93\u51fa\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u663e\u793a 10 \u4e2a\u6267\u884c\u6700\u6162\u7684\u7528\u4f8b\u5217\u8868\uff0c\u5e76\u8be6\u7ec6\u5217\u51fa\u5404\u4e2a\u9636\u6bb5\u7684\u8017\u65f6\uff1b \u5931\u8d25\u91cd\u8dd1\u7528\u4f8b\u91cd\u8dd1\u4e4b\u524d\u5ef6\u8fdf 1 \u79d2\uff1b \u65b0\u589e\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4ecd\u7136\u5f3a\u5236\u6267\u884c\uff1b \u7528\u4f8b\u6536\u96c6\u65f6\u4ec5\u5728 apps \u76ee\u5f55\u4e0b\u8fdb\u884c\uff0c\u5ffd\u7565 src,setting,public \u76ee\u5f55\uff1b \u65b0\u589e allure \u62a5\u544a\u5907\u4efd\u529f\u80fd\uff0c\u9ed8\u8ba4\u5907\u4efd\u81f3 allure_back \u76ee\u5f55\u4e0b\uff1b manage.py\u65b0\u589e\u53c2\u6570 --lastfailed \u7528\u4e8e\u53ea\u8dd1\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\u7684\u529f\u80fd\uff1b fix \u4fee\u590d\u4e86\u5728\u6ca1\u6709\u6307\u5b9a\u5e94\u7528\u540d\u79f0\u6267\u884c\u65f6\uff0cxml \u62a5\u544a\u751f\u6210\u8def\u5f84\u5f02\u5e38\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 uos_ci.py \u4f20\u5165 timeout \u548c session_timeout \u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11020220916","title":"1.1.0\uff082022/09/16\uff09","text":"new \u65b0\u589ePMS\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u652f\u6301\u591a\u79cd\u6570\u636e\u56de\u586b\u6a21\u5f0f\uff1b \u4f18\u5316\u4e86\u901a\u8fc7\u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u65f6PMS \u722c\u866b\u7684\u6027\u80fd\uff1b \u65b0\u589e .gitmodules \u6587\u4ef6\uff0c\u7528\u4e8e\u6807\u8bb0\u6240\u6709\u5b50\u9879\u76ee\uff0c\u65b9\u4fbf\u7edf\u4e00\u62c9\u53d6\u4ee3\u7801\uff1b env.sh \u9002\u914d\u793e\u533a\u7248\u4e0a\u5b89\u88c5\u81ea\u52a8\u5316\u73af\u5883\uff1b \u589e\u52a0\u6267\u884c\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u9519\u8bef\u7684\u529f\u80fd\uff1b README.md \u589e\u52a0 Wayland \u4e0b\u4f7f\u7528\u3001\u6d4b\u8bd5\u62a5\u544a\u67e5\u770b\u3001\u5e38\u89c1\u95ee\u9898\u7b49\u7684\u6587\u6863\u8bf4\u660e\uff1b \u589e\u52a0\u4e86\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u5bf9 setup\u3001call\u3001teardown \u8fdb\u884c\u65e5\u5fd7\u5206\u6bb5\uff1b fix \u4fee\u590d\u4e86 \u786e\u8ba4\u4fee\u590d \u5217\u6ca1\u5199\u8868\u5934\uff0c\u4f46\u5199\u4e86 fixed-xxx \u6807\u7b7e\uff0c\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u540c\u4e00\u5e94\u7528\u5185\u591a\u4e2a csv \u6587\u4ef6\u4e2d \u786e\u8ba4\u4fee\u590d \u5217\u6709\u7684\u5199\u4e86\uff0c\u6709\u7684\u6ca1\u5199\uff0c\u53ef\u80fd\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 INFO \u65e5\u5fd7\uff0c\u663e\u793a\u4e3a DEBUG \u7684\u95ee\u9898\uff1b\u4fee\u590d\u4e86\u90e8\u5206\u673a\u5668\u4e0a INFO \u65e5\u5fd7\u5185\u5bb9\u663e\u793a\u4e3a\u7ea2\u8272\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\u770b\u4e0d\u5230\u8be6\u7ec6\u4fe1\u606f\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10220220822","title":"1.0.2\uff082022/08/22\uff09","text":"new \u79fb\u9664 loguru\uff0c\u66ff\u6362\u4e3a logging\uff0c\u63a5\u53e3\u4fdd\u6301\u4e0d\u53d8\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u53d7\u5f71\u54cd\uff1b \u9ed8\u8ba4\u5f00\u542f coredump\uff1b fix \u4fee\u590d\u4e86\u4e09\u65b9\u5e93 loguru \u5076\u73b0\u5f02\u5e38\uff0c\u5bfc\u81f4\u7a0b\u5e8f\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7b2c\u4e00\u6b21\u5931\u8d25\u4e0d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10120220812","title":"1.0.1\uff082022/08/12\uff09","text":"new \u65b0\u589e RELEASE.md \u6587\u4ef6\uff0c\u7528\u4e8e\u8bb0\u5f55\u5386\u53f2\u53d1\u5e03\u7248\u672c\u7684\u66f4\u65b0\u5185\u5bb9\uff1b \u517c\u5bb9 Wayland \u6a21\u5f0f\u4e0b\u6267\u884c\u7528\u4f8b\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u7528\u7ba1\u5f53\u524d\u6d4b\u8bd5\u673a\u6267\u884c\u73af\u5883\uff0c\u6846\u67b6\u4f1a\u81ea\u52a8\u6839\u636e\u5f53\u524d\u73af\u5883\u8d70\u4e0d\u540c\u7684\u4ee3\u7801\u903b\u8f91\uff1b \u7531\u4e8e\u9700\u8981\u4fee\u6539 dogtail \u6e90\u4ee3\u7801\uff0c\u56e0\u6b64\u5c06\u4fee\u6539\u540e\u7684\u6e90\u7801\u653e\u5165\u5230\u6838\u5fc3\u5e93\u91cc\u9762 src/depends/dogtail \u540e\u7eed\u7248\u672c\u5c06\u4e0d\u9700\u8981\u5728\u7cfb\u7edf\u4e2d\u5b89\u88c5dogtail\uff1b \u5982\u679c\u5e94\u7528\u5e93\u540c\u6837\u4f7f\u7528\u4e86\u7cfb\u7edf\u5b89\u88c5\u7684 dogtail \u53ef\u80fd\u4f1a\u62a5\u9519\uff0c\u89e3\u51b3\u65b9\u6848\u662f\u5c06\u4ee3\u7801\u4e2d\u7684 import dogtail \u4fee\u6539\u4e3a from src.depends import dogtail ; fix \u91cd\u8dd1\u5931\u8d25\u4e4b\u540e\u624d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff0c\u4fee\u6539\u4e3a\u5931\u8d25\u4e4b\u540e\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":"# Attribution \uff1achengdu Test Team\n# Date \uff1a2021/08/20\n \u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d \u4ed3\u5e93\u5730\u5740\uff1ahttps://gitlabcd.uniontech.com/autotest/cd-desktop-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u65b9\u6848\u6982\u8ff0","text":"\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u667a\u80fd\u8bc6\u522b\u5e94\u7528\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u7528\u4e8e\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u64cd\u4f5c\u8fc7\u7a0b\u4e2d\u7684\u5143\u7d20\u5b9a\u4f4d\u4ee5\u53ca\u5224\u65ad\u7ed3\u679c\u65f6\u7684\u65ad\u8a00\u5904\u7406\uff1b\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\uff0c\u6d4b\u8bd5\u673a\u4e0a\u7684\u753b\u9762\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u5230\u670d\u52a1\u5668\u4e0a\uff0c\u670d\u52a1\u5668\u5bf9\u89c6\u9891\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\u540e\uff0c\u670d\u52a1\u5668\u667a\u80fd\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\u6210\u529f\uff0c\u7136\u540e\u5bf9\u6d4b\u8bd5\u673a\u4e0b\u53d1\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\uff0c\u6d4b\u8bd5\u673a\u63a5\u53d7\u5e76\u6267\u884c\u4e0b\u4e00\u6b65\u64cd\u4f5c\u3002 \u670d\u52a1\u5668\u4e0e\u6d4b\u8bd5\u673a\u4e4b\u95f4\u7684\u94fe\u63a5\uff1a \u670d\u52a1\u5668\u901a\u8fc7 USB \u4e32\u53e3\u8bbe\u5907\uff08USB-HID \u534f\u8bae\uff09\u6a21\u62df\u9f20\u6807\u952e\u76d8\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u64cd\u4f5c\u3002 \u901a\u8fc7\u89c6\u9891\u91c7\u96c6\u8bbe\u5907\u6355\u83b7\u6d4b\u8bd5\u673a\u7684\u5b9e\u65f6\u753b\u9762\u4f20\u8f93\u7ed9\u670d\u52a1\u5668\u3002 \u670d\u52a1\u5668\u5bf9\u91c7\u96c6\u7684\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\uff0c\u8bc6\u522b\u5176\u4e2d\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5e76\u8fd4\u56de\u5143\u7d20\u63a7\u4ef6\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\uff0c\u670d\u52a1\u5668\u901a\u8fc7\u667a\u80fd\u5316\u5206\u6790\uff0c\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e00\u81f4\u5c06\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\u901a\u8fc7\u4e32\u53e3\u6a21\u62df\u952e\u9f20\u4fe1\u53f7\u53d1\u9001\u7ed9\u6d4b\u8bd5\u673a\uff1b\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e0d\u4e00\u81f4\u5c06\u4f1a\u8fdb\u5165\u4e2d\u65ad\u5904\u7406\u53ca\u5f02\u5e38\u7ed3\u679c\u8f93\u51fa\uff0c\u7ee7\u7eed\u6267\u884c\u540e\u7eed\u573a\u666f\uff0c\u76f4\u81f3\u6240\u6709\u7528\u4f8b\u6d4b\u8bd5\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u6df1\u5ea6\u5b66\u4e60\u73af\u5883\u642d\u5efa","text":"\u6a21\u578b\u8bad\u7ec3\u4e3b\u8981\u5bf9 GPU \u6709\u8981\u6c42\uff0c\u8bad\u7ec3\u6a21\u578b\u7684\u673a\u5668\u663e\u5b58\u4e0d\u4f4e\u4e8e 6G\uff0c\u5176\u4ed6\u914d\u7f6e\u65e0\u7279\u6b8a\u8981\u6c42\u3002 \u63a8\u8350\u6027\u4ef7\u6bd4\u8f83\u9ad8\u914d\u7f6e \u64cd\u4f5c\u7cfb\u7edf: UnionTech OS Desktop 20 Professional Linux version 4.19.0-desktop-amd64 (deepin@deepin-PC) (Uos 8.3.0.3-3+rebuild) \u5904\u7406\u5668: Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz (\u516b\u6838 / \u5341\u516d\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460M-HDV(RD)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))/8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: TU116 [GeForce GTX 1660]\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u865a\u62df\u73af\u5883\u5b89\u88c5","text":"cd ~\nwget -c https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh\nbash Miniconda3-latest-Linux-x86_64.sh\n \u4e00\u8def\u56de\u8f66 \u7b2c\u4e00\u6b21\u63d0\u793a\u8f93\u5165 yes/no \uff1a\u8f93\u5165 yes \u7ee7\u7eed\u4e00\u8def\u56de\u8f66 \u7b2c\u4e8c\u6b21\u63d0\u793a\uff1a\u8f93\u5165 no cd ~/miniconda3/bin\nsudo chmod 777 activate\n \u6fc0\u6d3bconda\u73af\u5883 . ./activate\n \u6dfb\u52a0\u516c\u53f8\u5185\u7f51\u6e90 conda config --add channels bioconda\nconda config --add channels conda-forge\n \u5982\u679c\u662f\u5916\u7f51\u6dfb\u52a0\u5916\u7f51\u6e90 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/\n \u5982\u679c\u8981\u5220\u9664\u6e90 conda config --remove-key channels\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"2\u3001\u5b89\u88c5\u4f9d\u8d56","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u521b\u5efa\u865a\u62df\u73af\u5883","text":"conda remove --name mmlab --all # \u79fb\u9664\u6240\u6709\u865a\u62df\u73af\u5883\n conda create -n mmlab python=3.7\n conda activate mmlab\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-pytorch","title":"\uff082\uff09\u5b89\u88c5 Pytorch","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install torch==1.7.0+cu101 torchvision==0.8.1+cu101 torchaudio==0.7.0 -f https://download.pytorch.org/whl/torch_stable.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-mmcv","title":"\uff083\uff09\u5b89\u88c5 MMCV","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install mmcv-full==1.3.3 -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.7.0/index.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"\uff084\uff09\u5b89\u88c5\u663e\u5361\u9a71\u52a8","text":"\u6839\u636e\u4f60\u7684\u663e\u5361\u4e0b\u8f7d\u5bf9\u5e94\u9a71\u52a8\uff0c\u6bd4\u5982\u6211\u7684\u663e\u5361\u4e3a GTX1660\uff0c\u9a71\u52a8\u7248\u672c\u4e3a 430\uff0c\u9a71\u52a8\u4e0b\u8f7d\u5730\u5740\uff1ahttps://www.nvidia.cn/Download/Find.aspx?lang=cn CTRL+ALT+F2 \u8fdb\u5165tty\n \u7981\u7528 nouveau \u9a71\u52a8 sudo vim /etc/modprobe.d/blacklist-nouveau.conf\n \u586b\u5165\uff1a blacklist nouveau options nouveau modeset=0\n \u5237\u65b0\u914d\u7f6e\u6587\u4ef6 sudo update-initramfs -u reboot \u91cd\u542f\u540e\u518d\u8fdb\u5165 tty \u5173\u95ed\u56fe\u50cf\u754c\u9762\uff0c\u8f93\u5165\u547d\u4ee4\u5173\u95ed\u56fe\u50cf\u754c\u9762 sudo service lightdm stop\n \u5b89\u88c5\u9a71\u52a8 sudo chmod a+x NVIDIA-Linux-x86_64-430.run\nsudo ./NVIDIA-Linux-x86_64-430.run\n reboot\u91cd\u542f\uff0cnvidia-smi\u67e5\u770b\u5b89\u88c5\u72b6\u6001\u3002\u6ce8\u610f\u770b\u4e0bcuda\u7248\u672c\uff0c10.1\uff0cdriver\u7248\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u6570\u636e\u6807\u6ce8","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u6570\u636e\u6807\u6ce8","text":"\u6807\u6ce8\u4e4b\u524d\u9700\u8981\u5148\u8f6c\u6362\u56fe\u7247\u5927\u5c0f\uff0c\u5e76\u4e14\u4ee5\u6570\u5b57\u547d\u540d\uff0c\u6bcf\u7ec4\u547d\u540d\u9012\u589e"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"\uff081\uff09\u8f6c\u6362\u5927\u5c0f\u5e76\u91cd\u547d\u540d","text":"rename_pic.py import os\nimport sys\nimport cv2\nimport time\nimport getpass\nusername = getpass.getuser()\nsource_path = f\"/home/{username}/Desktop/right_menu\" # \u56fe\u7247\u8def\u5f84\nsource_dest = os.path.join('/'.join(source_path.split(\"/\")[:-1]), 'tmp')\nif not os.path.exists(source_dest):\nos.mkdir(source_dest)\nstart_name = sys.argv[1]\nfile_name_list = list()\nfor file in os.listdir(source_path):\nif file.endswith('.png'):\nfile_name_list.append(file)\nstart_name = int(start_name)\nfor file in file_name_list:\nos.rename(os.path.join(source_path,file), os.path.join(source_path, f\"{str(start_name)}.png\"))\nstart_name += 1\ntime.sleep(1)\nfor file in os.listdir(source_path):\nimage = os.path.join(source_path, str(file))\nsrc = cv2.imread(image)\nresult = cv2.resize(src, (960, 540))\nresizeImage = os.path.join(source_dest, str(file))\nprint(resizeImage)\ncv2.imwrite(str(resizeImage), result)\ncv2.waitKey(0)\ncv2.destroyAllWindows()\ntime.sleep(1)\nos.system(f'rm -rf {source_path}/*')\nos.system(f'mv {source_dest}/* {source_path}')\nos.system(f'rm -rf {source_dest}')\nprint(\"\u4e0b\u4e00\u4e2a\u5e8f\u53f7\uff1a\", start_name)\n \u6839\u636e\u7ec8\u7aef\u8f93\u51fa\u7684\u4e0b\u4e00\u4e2a\u5e8f\u53f7\u7684\u63d0\u793a\uff0c\u6267\u884c Python \u6587\u4ef6\u7684\u65f6\u5019\u4f20\u53c2\u3002 python rename_pic.py 249\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"\uff082\uff09\u5de5\u5177\u6807\u6ce8","text":"\u4f7f\u7528\u5de5\u5177 labelImg \u6807\u6ce8 sudo pip3 install PyQt5==5.13\nsudo pip3 install labelImg\n \u7ec8\u7aef\u76f4\u63a5\u8f93\u5165 labelImg\uff0c\u56de\u8f66 \u6807\u6ce8\u6a21\u5f0f\u9009\u62e9\uff1aPascalVOC"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u667a\u80fd\u6807\u6ce8","text":"\u6253\u5f00\u5c4f\u5e55\u5f55\u5236\u8f6f\u4ef6\uff0c\u5f55\u5236\u624b\u52a8\u64cd\u4f5c\u4e00\u6b21\u6d4b\u8bd5\u7528\u4f8b\uff0c\u7136\u540e\u5c06\u5f55\u5236\u7684\u89c6\u9891\u8fdb\u884c\u5206\u5e27\uff0c\u7136\u540e\u5bf9\u6bd4\u524d\u4e24\u5e27\u56fe\u6807\u76f8\u4f3c\u5ea6\uff0c\u5254\u9664\u76f8\u4f3c\u5ea6\u8fc7\u9ad8\u7684\u56fe\u7247\uff0c\u5728\u4fdd\u8bc1\u7d20\u6750\u591a\u6837\u6027\u7684\u524d\u63d0\u4e0b\uff0c\u5254\u9664\u91cd\u590d\u591a\u4f59\u7684\u56fe\u7247\u751f\u6210\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u96c6\uff0c\u7136\u540e\u53d6\u51fa\u63a7\u4ef6\u6a21\u677f\u6570\u636e\u96c6\uff0c\u901a\u8fc7 OpenCV \u6a21\u677f\u5339\u914d\u83b7\u53d6\u63a7\u4ef6\u5728\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u56fe\u7247\u4e2d\u6240\u5728\u7684\u5de6\u4e0a\u3001\u5de6\u4e0b\u3001\u53f3\u4e0a\u3001\u53f3\u4e0b\u56db\u5904\u5750\u6807\uff0c\u4ece\u800c\u6839\u636e\u6a21\u677f\u6570\u636e\u96c6\u751f\u6210\u6807\u6ce8\u6570\u636e\u3002\u53c2\u8003\u76ee\u5f55 AnnotationMaterial"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"\uff081\uff09\u6a21\u677f\u6570\u636e\u96c6\u51c6\u5907","text":"1\u3001\u5728\u754c\u9762\u622a\u53d6\u9700\u8981\u6807\u6ce8\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u653e\u5728\u76ee\u5f55\u4e0b AnnotationMaterial/template/img 2\u3001\u7ef4\u62a4\u63a7\u4ef6\u540d\u4e0e\u5143\u7d20\u63a7\u4ef6\u7684\u952e\u5bf9\uff0c\u4e00\u4e2a\u63a7\u4ef6\u540d\u53ef\u5bf9\u5e94\u591a\u4e2a\u5143\u7d20\u63a7\u4ef6 menu:\n- menu.jpg\n- menu1.jpg\n- menu2.jpg\n- menu3.jpg\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"\uff082\uff09\u7d20\u6750\u96c6\u51c6\u5907","text":"\u5f55\u5236\u89c6\u9891\u6216\u6216\u5c4f\u5e55\u622a\u56fe\u653e\u7f6e\u76ee\u5f55 AnnotationMaterial/source"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u5f00\u59cb\u6807\u6ce8","text":"python3 AnnotationMaterial/main.py\n \u751f\u6210\u7684\u6807\u6ce8\u6570\u636e\u5b58\u653e\u5728 AnnotationMaterial/result"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#mmdetection","title":"\u56db\u3001MMDetection","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1-mmdetection","title":"1\u3001 MMDetection \u4ee3\u7801","text":"MMDetection \u662f\u4e00\u4e2a\u6709\u540d\u7684\u6df1\u5ea6\u5b66\u4e60\u76ee\u6807\u68c0\u6d4b\u5f00\u6e90\u9879\u76ee\uff0c\u4e5f\u662f openMMlab \u7684\u62db\u724c\u9879\u76ee\uff0c\u4e3a\u4ec0\u4e48\u9009\u62e9\u5b83\uff0c\u5c0f\u5b69\u513f\u6ca1\u5a18\u8bf4\u6765\u8bdd\u957f\uff0c\u611f\u5174\u8da3\u53ef\u4ee5\u81ea\u884c\u6df1\u5165\u4e86\u89e3\uff1b \u4f60\u53ef\u4ee5\u76f4\u63a5\u5728 GitHub \u4e0a\u514b\u9686\u4ee3\u7801\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u54b1\u4eec\u4ed3\u5e93\u4e0b Train \u76ee\u5f55\u4e2d\u4ee3\u7801\uff0cTrain \u4e2d\u7684\u4ee3\u7801\u4e5f\u662f\u4ece GitHub \u4e0a\u62c9\u53d6\u7684\uff0c\u4e0d\u8fc7\u6211\u4eec\u6839\u636e\u9879\u76ee\u9700\u8981\u505a\u4e86\u4e00\u4e9b\u4e8c\u6b21\u5f00\u53d1\uff0c\u63a8\u8350\u76f4\u63a5\u4f7f\u7528\u5b83\u3002 \u5982\u679c\u4f60\u60f3\u4ece GitHub \u4e0a\u62c9\uff1a git clone https://github.com/open-mmlab/mmdetection.git\n# \u4e0d\u80fd\u76f4\u63a5\u62c9\u53d6\u4e3b\u5206\u652f\uff0c\u5efa\u8bae\u4f7f\u75282.12\u7248\u672c\uff0c\u4e0d\u540c\u7684\u7248\u672c\u5bf9\u5e94\u7684mmcv\u7248\u672c\u662f\u4e0d\u540c\u7684\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-voc2coco","title":"2\u3001\u62c9\u53d6 voc2coco \u4ee3\u7801","text":"git clone https://github.com/Tony607/voc2coco.git\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-coco","title":"3\u3001\u8f6c\u6362 coco \u6570\u636e\u96c6","text":"\u5c06\u6240\u6709\u7684\u56fe\u7247\u548cxml\u6587\u4ef6\u653e\u5165train2017\uff0c\u4ece\u4e2d\u6311\u9009\u51e0\u7ec4\u653e\u5165val2017\uff08\u6d4b\u8bd5\u96c6\uff09 cd mmdetection/data/coco\npython voc2coco.py train2017 annotations/instances_train2017.json\npython voc2coco.py val2017 annotations/instances_val2017.json\n \u751f\u6210json\u6587\u4ef6"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4_1","title":"4\u3001\u4fee\u6539\u914d\u7f6e","text":"\uff081\uff09\u8bfb\u53d6\u6a21\u578b\u540d\u79f0 import json\nmodule_name = []\nwith open('./instances_train2017.json', \"r+\") as f:\njson_file = f.read()\njson_dict = json.loads(json_file)\nmodule_list = json_dict.get('categories')\nfor module_info in module_list:\nname = module_info.get('name')\nmodule_name.append(name)\nprint(module_name)\nprint(\"module_num:\", len(module_name))\n # \u6ce8\u610f\u5bf9\u6bd4instances_train2017.json\u91cc\u9762\u6a21\u578b\u540d\u79f0\u7684\u987a\u5e8f\uff0c\u4e0eCLASSES\u548ccoco_classes\u91cc\u9762\u7684\u987a\u5e8f\u4fdd\u6301\u4e00\u81f4\u3002\n \uff082\uff09\u4fee\u6539 faster_rcnn_r101_2x_coco.py mmdetection/xianjin/faster_rcnn_r101_2x_coco.py \u4fee\u653946\u884c\uff0cnum_clasess\u7684\u503c\uff0c\u65b0\u589e1\u4e2a\uff0c\u5c31 +1\uff1b \uff083\uff09\u4fee\u6539 coco.py mmdetection/mmdet/datasets/coco.py CLASSES = ()\uff0c\u5728\u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b \uff084\uff09\u4fee\u6539 class_names.py mmdetection/mmdet/core/evaluation/class_names.py coco_classes \u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#5","title":"5\u3001\u7f13\u5b58\u6e05\u7406","text":"\u5220\u9664 mmdetection/build \u76ee\u5f55 python setup.py install\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#6","title":"6\u3001\u8bad\u7ec3\u6a21\u578b","text":"\uff081\uff09\u6307\u5b9a\u81ea\u5df1\u914d\u7f6e\u7684\u8bad\u7ec3\u6a21\u578b\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py --gpus 1\n \uff082\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u6d4b\u8bd5\u96c6\u7ed3\u679c\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py xianjin/epoch_24.pth --show\n \uff083\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u51c6\u786e\u5ea6\uff1b python tools/analysis_tools/analyze_logs.py plot_curve xianjin/20210530_011907.log.json --keys acc\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#7","title":"7\u3001\u5feb\u6377\u64cd\u4f5c","text":"python3 run.py\n \u5c06\u4ee5\u4e0a 4 - 7 \u6b65\u64cd\u4f5c\u6574\u5408\u6210 run.py\uff0c\u4e00\u952e\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u4e94\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\uff1b \u670d\u52a1\u7aef\u4e00\u53f0\uff08\u76ee\u524d\u4ec5\u652f\u6301AMD\u67b6\u6784\uff09\uff1b \u91c7\u96c6\u76d2\u4e00\u4e2a \uff08ACASIS hdmi\u89c6\u9891\u91c7\u96c6\u5361\uff0chttps://item.jd.com/10024310742602.html \uff09\uff1b USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\uff1b USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff1b \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5USB\u5ef6\u957f\u7ebf\uff1b \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u63a8\u8350\u914d\u7f6e","text":"\u6267\u884c\u7528\u4f8b\u7684\u670d\u52a1\u7aef\u5bf9\u914d\u7f6e\u6ca1\u6709\u7279\u6b8a\u8981\u6c42\uff0c\u5982\u679c\u6761\u4ef6\u5141\u8bb8\u914d\u7f6e\u8d8a\u9ad8\uff0c\u8bc6\u522b\u901f\u5ea6\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n \u6d4b\u8bd5\u673a\u4e0a\u4e0d\u6267\u884c\u4efb\u4f55\u811a\u672c\uff0c\u5177\u4f53\u914d\u7f6e\u6839\u636e\u6d4b\u8bd5\u9700\u8981\u51b3\u5b9a\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#usb_mk","title":"\u516d\u3001USB_MK\u4e32\u53e3\u9a71\u52a8\u65b9\u6cd5","text":"\u4f4d\u4e8econtrol_method\u76ee\u5f55\u4e0b\u7684usb_mk.py\u6587\u4ef6 \uff081\uff09\u5217\u51fa\u53ef\u901a\u4fe1\u7684\u7aef\u53e3 python3 -m serial.tools.list_ports -v\n \uff082\uff09\u4fee\u6539\u4e32\u53e3\u7684\u6743\u9650 sudo chmod 777 /dev/ttyACM0\n \uff083\uff09\u5b9e\u4f8b\u5316USB_MK import UsbMk\nusb_mk = UsbMk(\"/dev/ttyACM0\", 9600) # \u8bbe\u5907\u9ed8\u8ba49600\u4e3a\u6ce2\u7279\u7387\uff0c\u63a7\u5236\u4f20\u8f93\u901f\u7387\n \uff084\uff09USB\u4e32\u53e3\u8bbe\u5907\u9ed8\u8ba4\u6ce2\u7279\u7387\u4e3a9600\uff08\u7ecf\u6d4b\u8bd5\u6ce2\u7279\u73879600\u51c6\u786e\u6027\u6700\u597d\uff09\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up() # \u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u6c49\u5b57\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e\n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff083\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff084\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff085\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() # \u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2\n \uff086\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff087\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff088\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e03\u3001\u65b9\u6cd5\u8c03\u7528\u5165\u53c2\u89c4\u5219","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_7","title":"1\u3001\u57fa\u7c7b","text":"class Base:\ndef __init__(self):\nself._obj = image\nself._usb = usb_mk\ndef find_element_by_ai(self, element):\nreturn self._obj.find_element(element)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_6","title":"2\u3001\u5165\u53c2\u8bf4\u660e","text":"\u56fe\u50cf\u8bc6\u522b\u65b9\u6cd5\u5165\u53e3\u4e3a Base \u7c7b\u4e0b\u7684 find_element_by_ai \u3002\u4ec5\u63a5\u53d7\u4e00\u4e2a\u53c2\u6570 element\uff0c\u7c7b\u578b\u4e3a string\u3002 \u53ef\u8bc6\u522b\u7684 string \u683c\u5f0f\uff1a \uff081\uff09\u5927\u56fe\u6807\uff08 \u56fe\u6807\u5927\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\uff0c\u4f8b\uff1a Base().find_element_by_ai(\"window\")\n \uff082\uff09\u5927\u56fe\u6807 / \u5c0f\u56fe\u6807\uff08\u56fe\u6807\u5c0f\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5c0f\u56fe\u6807\uff0c\u4f8b\uff1awindow/search_btn Base().find_element_by_ai(\"window/search_btn\")\n \uff083\uff09\u5927\u56fe\u6807 / OCR\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\u5185\u7684\u6587\u5b57\uff0c\u4f8b\uff1amenu/\u5c5e\u6027 Base().find_element_by_ai(\"menu/\u5c5e\u6027\")\n \uff084\uff09OCR\uff1a\u5168\u5c4f\u8bc6\u522b\u6587\u5b57 Base().find_element_by_ai(\"\u641c\u7d22\")\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516b\u3001\u9690\u85cf\u9f20\u6807","text":"\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u8fc7\u6765\u7684\u89c6\u9891\u6d41\uff0c\u5728\u8bc6\u522b\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u53d7\u5230\u9f20\u6807\u5f71\u54cd\uff0c\u56e0\u6b64\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u9690\u85cf\u9f20\u6807\u3002 \u5c4f\u853d\u9f20\u6807\u5149\u6807\u663e\u793a ```shell script /etc/lightdm/lightdm.conf \u5728`[Seat:*]`\u4e0b\u9762\u6dfb\u52a0\u53c2\u6570\n```shell script\nxserver-command=X -bs -core -nocursor\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e5d\u3001\u667a\u80fd\u81ea\u52a8\u5316\u7684\u610f\u4e49","text":"1\u3001\u6539\u5584 Acessibility \u5b9a\u4f4d\u7684\u7a33\u5b9a\u6027\u95ee\u9898 Acessibility \u5c5e\u6027\u5b9a\u4f4d\u5b58\u5728\u5076\u5c14\u5931\u6548\u7684\u60c5\u51b5 \uff081\uff09\u5f00\u53d1\u5728\u505a\u65b0\u9700\u6c42\u5f00\u53d1\u65f6\u53ef\u80fd\u6d89\u53ca\u5230\u5bf9\u5c5e\u6027\u6807\u7b7e\u7684\u4fee\u6539\u6216\u8005\u5c42\u7ea7\u7684\u8c03\u6574\uff0c\u53ef\u80fd\u9020\u6210\u81ea\u52a8\u5316\u7528\u4f8b\u65e0\u6cd5\u5b9a\u4f4d\u5230\u5143\u7d20\u3002 \u6bd4\u59821040\u9636\u6bb5\uff0c\u97f3\u4e50\u91cd\u6784\u7684\u65f6\u5019\uff0c\u5f00\u53d1\u5bf9\u90e8\u5206\u5c5e\u6027\u548c\u5c42\u7ea7\u505a\u4e86\u4fee\u6539\uff0c\u5bfc\u81f4\u81ea\u52a8\u5316\u7528\u4f8b\u5b9a\u4f4d\u65b9\u6cd580%\u9700\u8981\u4fee\u6539\u3002 \u5f00\u53d1\u65b0\u529f\u80fd\u7684\u65f6\u5019\u5076\u5c14\u4e5f\u4f1a\u5bf9\u5c5e\u6027\u505a\u8c03\u6574\uff0c\u9047\u52305\u6b21\u3002 \uff082\uff09\u76ee\u524d\u4e3b\u8981\u4f7f\u7528Dogtail\u8bc6\u522b\u5e94\u7528Acessibility\u5c5e\u6027\u8fdb\u884c\u5b9a\u4f4d\uff0c\u662f\u83b7\u53d6\u5e94\u7528\u5f53\u524d\u754c\u9762\u7684\u5c5e\u6027tree\uff0c\u5728\u5e94\u7528\u8df3\u8f6c\u540e\uff0cDogtail\u5b58\u5728\u65e0\u6cd5\u53ca\u65f6\u83b7\u53d6\u5f53\u524d\u5c5e\u6027\u5217\u8868\u7684\u60c5\u51b5\u3002 \u591a\u5a92\u4f53\u8c03\u7528\u6587\u7ba1\u7a97\u53e3\u7684\u65f6\u5019\uff0c\u51fa\u73b0\u627e\u4e0d\u5230\u6587\u7ba1\u91cc\u9762\u5143\u7d20\u7684\u60c5\u51b5\uff0c\u76ee\u524d\u51fa\u73b010+\u6b21\u3002 \u5e94\u7528\u8bbe\u7f6e\u9875\u9762\u7684\u5c5e\u6027\u5076\u5c14\u5b58\u5728\u627e\u4e0d\u5230\u7684\u60c5\u51b5\uff0c\u9047\u52305\u6b21\u3002 \uff083\uff09Dogtail\u5de5\u5177\u672c\u8eab\u5b58\u5728\u95ee\u9898\uff0c\u6709\u65f6\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u5019\u5f88\u6162\uff0c\u8ba9\u4eba\u65e0\u6cd5\u63a5\u53d7\uff0c\u76ee\u524d\u51fa\u73b0\u8fc7\u5f88\u591a\u6b21\u3002 \u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u95f4\u6bd4\u5e73\u5e38\u61623\u500d\uff0c\u51fa\u73b04\u6b21\u3002 2\u3001\u89e3\u51b3\u4e86\u4f7f\u7528\u7edd\u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898 \u90e8\u5206\u63a7\u4ef6\u65e0\u6cd5\u6dfb\u52a0 Acessibility \u5c5e\u6027\u4ece\u800c\u4f7f\u7528\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u51fa\u73b0\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898\u3002 \uff081\uff09\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u65b9\u6cd5\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u76ee\u6807\u56fe\u7247\u8d44\u6e90\uff0c\u5728 UI \u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u4f1a\u6d89\u53ca\u5230\u76ee\u6807\u8d44\u6e90\u7684\u66ff\u6362\uff0c\u6bd4\u8f83\u8017\u8d39\u4eba\u529b\u3002 \uff082\uff09\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6cd5\u5bf9\u6bd4\u7cbe\u5ea6\u6bd4\u8f83\u641e\uff0c\u5982\u679cUI \u7684\u53d8\u66f4\u4f1a\u9020\u6210\u65e0\u6cd5\u51c6\u786e\u5b9a\u4f4d\u5230\uff0c\u81ea\u52a8\u5316\u811a\u672c\u5065\u58ee\u6027\u4e0d\u8db3\u3002 3\u3001\u4f7f\u7528\u673a\u5668\u5206\u79bb\uff0c\u89e3\u51b3\u4e86\u81ea\u52a8\u5316\u811a\u672c\u5bf9\u5e94\u7528\u7684\u5f71\u54cd\uff0c\u771f\u5b9e\u8fd8\u539f\u7528\u6237\u7684\u4f7f\u7528\u573a\u666f \u673a\u5668\u5206\u79bb\u7684\u67b6\u6784\u8bbe\u8ba1\uff0c\u4fdd\u8bc1\u4e86\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u73af\u5883\u5b8c\u5168\u7b49\u540c\u4e8e\u7528\u6237\uff0c\u6392\u9664\u6d4b\u8bd5\u811a\u672c\u7684\u5f71\u54cd\u3002 \uff081\uff09\u76ee\u524d\u7684\u529f\u80fd\u81ea\u52a8\u5316\u662f\u5728\u6d4b\u8bd5\u673a\u4e0a\u76f4\u63a5\u8fd0\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\uff0c\u52a0\u4e0a\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u6211\u4eec\u6dfb\u52a0\u4e86\u4e00\u4e9b\u8fdb\u7a0b\u76d1\u63a7\u3001\u89c6\u9891\u5f55\u5236\u7b49\u529f\u80fd\uff0c\u81ea\u52a8\u5316\u811a\u672c\u672c\u8eab\u4f1a\u6d88\u8017\u4e00\u4e9b\u7cfb\u7edf\u8d44\u6e90\uff0c\u65e0\u6cd5\u8fd8\u539f\u771f\u662f\u7684\u7528\u6237\u4f7f\u7528\u573a\u666f\u3002 \uff082\uff09\u6027\u80fd\u6d4b\u8bd5\u9700\u8981\u6392\u9664\u5176\u4ed6\u7a0b\u5e8f\u7684\u8d44\u6e90\u6d88\u8017\u5f71\u54cd\uff0c\u6027\u80fd\u81ea\u52a8\u5316\u91c7\u7528\u673a\u5668\u5206\u79bb\uff0c\u4fdd\u8bc1\u4e86\u6027\u80fd\u6570\u636e\u7684\u51c6\u786e\u6027\u3002 \u4ee5\u524d\u7684\u7528\u4f8b\u6267\u884c\u8017\u65f6\u6ca1\u6761\u572830\u79d2\u5de6\u53f3\uff0c\u73b0\u5728\u7528\u4f8b\u8017\u65f6\u572810\u79d2\u3002 4\u3001\u89e3\u51b3\u4e86UI \u8c03\u6574\u5bfc\u81f4\u5b9a\u4f4d\u5931\u8d25\u7684\u4e0d\u7a33\u5b9a\u6027\u95ee\u9898 \uff081\uff09\u89e3\u51b3\u4e86\u56e0 UI \u8c03\u6574\u5bfc\u81f4\u63a7\u4ef6\u4f4d\u7f6e\u53d8\u5316\u6216\u8272\u5dee\u53d8\u5316\u540e\u5b9a\u4f4d\u4e0d\u51c6\u786e\u7684\u95ee\u9898\uff0c\u53ea\u8981\u63a7\u4ef6\u6587\u6848\u548c\u63a7\u4ef6\u5916\u8fb9\u6846\u65e0\u53d8\u5316\u5747\u53ef\u51c6\u786e\u5b9a\u4f4d\uff1b \uff082\uff09\u76ee\u524d\u4e5f\u4f1a\u91c7\u7528\u57fa\u4e8eUI\u7684\u5b9a\u4f4d\u65b9\u6848\uff0c\u5982\u679cUI\u4f4d\u7f6e\u6709\u8c03\u6574\uff0c\u4f1a\u5bfc\u81f4\u5143\u7d20\u65e0\u6cd5\u5b9a\u4f4d\u3002 5\u3001\u7b80\u5316\u4e86\u7528\u4f8b\u7ed3\u6784\uff0c\u63d0\u5347\u7f16\u5199\u53cb\u597d\u5ea6 \uff081\uff09\u667a\u80fd\u81ea\u52a8\u5316\u8bc6\u522b\u5143\u7d20\u7684\u65b9\u6cd5\u53ea\u6709\u4e00\u4e2a\uff0c\u5c31\u662f\u57fa\u4e8e\u6211\u4eec\u8bad\u7ec3\u7684\u6a21\u578b\u8bc6\u522b\u89c6\u9891\u6d41\u4e2d\u7684\u5143\u7d20\uff0c\u7ecf\u8fc7\u811a\u672c\u5c01\u88c5\u4e4b\u540e\uff0c\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u4e2d\u6240\u6709\u5b9a\u4f4d\u7684\u64cd\u4f5c\u90fd\u53ea\u9700\u8981\u8c03\u7528\u8fd9\u4e00\u4e2a\u65b9\u6cd5\u5c31\u884c\u4e86\uff0c\u7f16\u5199\u81ea\u52a8\u5316\u811a\u672c\u7684\u96be\u5ea6\u5927\u5927\u964d\u4f4e\u3002 \uff082\uff09\u4e5f\u662f\u7531\u4e8e\u8c03\u7528\u65b9\u6cd5\u7b80\u5355\uff0c\u5728 UI \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u4e2d\u7684\u5206\u5c42\u7ed3\u6784\u5c06\u4f1a\u51cf\u5c11\uff0c\u591a\u7ee7\u627f\u7684\u60c5\u51b5\u4f1a\u51cf\u5c11\uff0c\u81ea\u52a8\u5316\u4ee3\u7801\u7684\u8c03\u7528\u7ed3\u6784\u4e5f\u4f1a\u53d8\u5f97\u7b80\u5355\uff0c\u800c\u4e14\u529f\u80fd\u6d4b\u8bd5\u540c\u5b66\u7f16\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u66f4\u52a0\u5bb9\u6613\u4e0a\u624b\u3002 \u4ee5\u524d\u5199\u7528\u4f8b\u7531\u4e8e\u9700\u8981\u7ed3\u5408\u4e0d\u540c\u7684\u6a21\u5757\uff0c\u8c03\u7528\u4e0d\u540c\u7684\u65b9\u6cd5\uff0c\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u5e76\u5b8c\u6210\u8c03\u8bd5\u7684\u65f6\u95f4\u5e73\u5747\u572820-30\u5206\u949f\uff0c\u73b0\u5728\u5199\u7528\u4f8b\u811a\u672c\u80fd\u57285\u5206\u949f\u5de6\u53f3\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":"# =============================================\n# Attribution : Application Test Department III\n# Time : 2023/1/3\n# Author : ut003281\n# =============================================\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u7b80\u8ff0","text":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5 \u901a\u8fc7\u81ea\u52a8\u5316\u624b\u6bb5\u5bf9\u5e94\u7528\u8fdb\u884c\u6027\u80fd\u6d4b\u8bd5\uff0c\u63d0\u4f9b\u65b9\u4fbf\u7684\u73af\u5883\u90e8\u7f72\u3001\u8fd0\u884c\u914d\u7f6e\u3001\u7528\u4f8b\u7f16\u5199\u7b49\uff0c\u7528\u4e8e\u684c\u9762\u5e94\u7528\u7684\u51b7\u70ed\u542f\u52a8\u3001\u8d44\u6e90\u62f7\u8d1d\u3001\u9875\u9762\u8df3\u8f6c\u7b49\u6027\u80fd\u573a\u666f\u6d4b\u8bd5\u3002 \u4ed3\u5e93\u5730\u5740\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-perf-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u4ee3\u7801\u7ed3\u6784","text":"autotest-perf-aitest\n\u251c\u2500\u2500 apps # \u5b58\u653e\u6240\u6709\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u811a\u672c\n\u251c\u2500\u2500 conftest.py # pytest hook\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 CURRENT # \u7248\u672c\u5185\u5bb9\n\u251c\u2500\u2500 docs # \u6587\u6863\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u952e\u503c\u5bf9\u7167\u8868.pdf # \u4e32\u53e3\u7ebfcode\u4e0e\u6309\u952e\u7684\u5bf9\u7167\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u6027\u80fd\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\u6267\u884c\u5668\u4f7f\u7528\u6307\u5357.md # \u6267\u884c\u5668\u811a\u672c\u4f7f\u7528\u6307\u5357\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 USB\u4e32\u53e3\u8f6cUSB\u952e\u76d8\u9f20\u6807\u7ebf\u534f\u8bae\u6587\u4ef6V1.0.pdf # \u4e32\u53e3\u534f\u8bae\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput-0.28.2.zip # Linux\u4e0b\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\u7684\u6e90\u7801\uff0c\u53ef\u6839\u636e\u67b6\u6784\u6253\u5305\n\u251c\u2500\u2500 manage.py # \u529f\u80fd\u4e3b\u5165\u53e3\n\u251c\u2500\u2500 pytest.ini # pytst \u914d\u7f6e\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 setting # \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 client.ini # \u6d4b\u8bd5\u673a IP \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5168\u5c40\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dev_env.sh # \u5bbf\u4e3b\u673a\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose_no_relay.yml # \u65e0\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose.yml # \u6709\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker_login.sh # docker \u767b\u9646\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 res\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 black.png # \u5168\u9ed1\u56fe\u7247\uff0c\u7528\u4e8e\u4fee\u6539\u58c1\u7eb8\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_5000.deb # 3A5000 \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_amd64.deb # amd \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_arm64.deb # arm \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_mips64.deb # mips \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_sw_64.deb # sw \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 server.ini # \u670d\u52a1\u5668\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 setup.sh # \u5bb9\u5668\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 template # \u521b\u5efa app \u57fa\u7840\u811a\u672c\u6a21\u677f\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 app_template\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ${app_name}_widget.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 control-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 images\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 test_${app_name}_01_scene.json-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 test_${app_name}_01_scene.py-tpl\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 uos_docker # \u5bb9\u5668\u73af\u5883\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dockerfile\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 requirements.txt\n\u2514\u2500\u2500 src\n \u251c\u2500\u2500 analysis_save.py # \u89e3\u6790\u56fe\u7247\u6d41\u7ed3\u679c\uff0c\u6c47\u603b\u751f\u6210 excel \u62a5\u544a\n\u251c\u2500\u2500 base_widget.py # \u5c01\u88c5\u7684\u57fa\u7840\u64cd\u4f5c\uff0c\u5e94\u7528\u8c03\u7528\u7684\u4e3b\u5165\u53e3\u65b9\u6cd5\n\u251c\u2500\u2500 cmdctl.py # \u8c03\u7528\u547d\u4ee4\u884c\u4f7f\u7528\n\u251c\u2500\u2500 global_value.py # \u5168\u5c40\u53d8\u91cf\n\u251c\u2500\u2500 image_utils.py # \u56fe\u7247\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 __init__.py\n \u251c\u2500\u2500 logger_utils.py # \u65e5\u5fd7\u914d\u7f6e\n\u251c\u2500\u2500 pdocr.py # ocr \u914d\u7f6e\n\u251c\u2500\u2500 public_method.py # \u4e00\u4e9b\u65b9\u4fbf\u7684\u5c01\u4f4f\n\u251c\u2500\u2500 record.py # \u5f55\u5c4f\u76f8\u5173\n\u251c\u2500\u2500 rtk # \u8fd0\u884c\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 _base.py # \u4e00\u4e9b\u679a\u4e3e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 install_env.py # \u5b89\u88c5\u73af\u5883\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 local_runner.py # \u8fd0\u884c\u7528\u4f8b\n\u251c\u2500\u2500 serial_communication # \u4e32\u53e3\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 power_control.py # \u7ee7\u7535\u5668\u64cd\u4f5c\uff0c\u4f7f\u7528\u7ee7\u7535\u5668\u8fde\u63a5\u4e3b\u673a\u7535\u6e90\uff0c\u63a7\u5236\u5f00\u5173\u673a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 serial_common.py # \u4e32\u53e3\u516c\u5171\u65b9\u6cd5\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 usb_mk.py # \u952e\u9f20\u64cd\u4f5c\u57fa\u7840\u5c01\u88c5\n\u251c\u2500\u2500 shortcut_key.py # \u5feb\u6377\u952e\u7684\u5c01\u88c5\n\u251c\u2500\u2500 singleton.py # \u5355\u4f8b\u6a21\u5f0f\n\u251c\u2500\u2500 start_app.py # \u521b\u5efa app\n\u2514\u2500\u2500 write_xlsx.py # \u751f\u6210 excel\n# __init__.py \u6587\u4ef6\u4e3a\u6807\u8bc6\u8be5\u76ee\u5f55\u662f\u4e00\u4e2aPython\u7684\u6a21\u5757\u5305\uff0c\u9879\u76ee\u4e2d\u7684__init__.py\u5747\u4e3a\u7a7a\u6587\u4ef6\u3002\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u73af\u5883\u642d\u5efa","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\u3002 \u670d\u52a1\u7aef\u4e00\u53f0\u3002\uff08\u4ec5\u652f\u6301 AMD \u67b6\u6784\uff0c\u82e5\u9700\u5176\u4ed6\u67b6\u6784\uff0c\u54a8\u8be2\u76f8\u5173\u5f00\u53d1\u4eba\u5458\uff09 \u91c7\u96c6\u76d2\u4e00\u4e2a\u3002 \uff08ACASIS HDMI \u89c6\u9891\u91c7\u96c6\u76d2\uff0chttps://item.jd.com/100013302599.html#crumb-wrap \uff09 USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\u3002\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"\uff082\uff09\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\u3002 USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff08USB3.0 \u63a5\u53e3\u4e0a\uff09\u3002 \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5 USB \u5ef6\u957f\u7ebf\u3002 \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u670d\u52a1\u7aef\u63a8\u8350\u914d\u7f6e","text":"\u914d\u7f6e\u8d8a\u9ad8\uff0c\u89e3\u6790\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"2\u3001\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa","text":" \u6253\u5f00\u63a7\u5236\u4e2d\u5fc3\uff0c\u8d26\u6237\u8bbe\u7f6e\u4e3a\u3010\u81ea\u52a8\u767b\u5f55\u3011\u548c\u3010\u65e0\u5bc6\u7801\u767b\u5f55\u3011\uff0c\u7535\u6e90\u7ba1\u7406\u4e2d\u4f7f\u7528\u7535\u6e90\u5168\u90e8\u8bbe\u7f6e\u4e3a\u3010\u4ece\u4e0d\u3011\uff0c\u5f00\u542f\u5f00\u53d1\u8005\u6a21\u5f0f\u3002 \u6839\u636e\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u8981\u6c42\uff0c\u5bfc\u5165\u76f8\u5173\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\uff1a\u5bfc\u5165\u76f8\u518c\u3001\u5f71\u9662\u3001\u97f3\u4e50\u7684\u6d4b\u8bd5\u8d44\u6e90\u3002 \u5728\u670d\u52a1\u7aef\u6253\u5f00\u76f8\u673a\u5e94\u7528\u540e\uff0c\u5c06\u6d4b\u8bd5\u673a\u684c\u9762\u58c1\u7eb8\u66f4\u6362\u4e3a\u7eaf\u8272\u58c1\u7eb8\uff08\u6ce8\u610f\uff0c\u670d\u52a1\u7aef\u9700\u63d0\u524d\u5f00\u542f\u76f8\u673a\u540e\u518d\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u58c1\u7eb8\uff0c\u5efa\u8bae\u7eaf\u9ed1\u58c1\u7eb8 setting/res/black.png\uff09 \u5728\u6587\u4ef6\u7ba1\u7406\u5668\u4e2d\uff0c\u5c06\u9009\u9879 \u4e3b\u83dc\u5355-\u8bbe\u7f6e-\u9884\u89c8-\u56fe\u7247\u9884\u89c8 \u53d6\u6d88\u52fe\u9009\uff08\u5982\u4e0d\u53d6\u6d88\uff0c\u4f1a\u5f71\u54cd\u622a\u56fe\u5f55\u5c4f\u5e94\u7528\u7684\u6027\u80fd\u6570\u636e\uff09 \u79fb\u52a8\u6216\u5220\u9664\u7cfb\u7edf Logo \uff0c\u6392\u9664\u684c\u9762\u53f3\u4e0b\u89d2 Logo \u7684\u5f71\u54cd\uff08\u91cd\u542f\u751f\u6548\uff09\u3002 sudo mv /usr/share/deepin/uos_logo.svg ~/Pictures/\n \u5b89\u88c5\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\uff08\u5fc5\u987b\u5b89\u88c5\uff01\uff01\uff09 AMD \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_amd64.deb ARM \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_arm64.deb MIPS \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_mips64.deb 3A5000 \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_5000.deb \u5b89\u88c5\u547d\u4ee4 sudo dkpg -i xserver-xorg-input-libinput_0.28.2-2_amd64.deb\n \u5b89\u88c5\u65f6\u4f1a\u63d0\u793a\u5df2\u5b58\u5728\u76f8\u540c\u7248\u672c\uff0c\u8bf7\u5ffd\u7565\uff0c\u76f4\u63a5\u8986\u76d6\u5b89\u88c5\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u4e3b\u673a\u624d\u751f\u6548"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u670d\u52a1\u7aef\u4e00\u952e\u73af\u5883\u90e8\u7f72","text":"\u73af\u5883\u642d\u5efa\u524d\u5fc5\u987b\u5148\u8fde\u63a5\u4e0a USB \u4e32\u53e3\u7ebf\u548c\u91c7\u96c6\u76d2\u3002 \u5bbf\u4e3b\u673a\u73af\u5883\u5b89\u88c5 python3 manage.py install --env host\n \u5bb9\u5668\u73af\u5883\u5b89\u88c5 python3 manage.py install --env docker\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u56db\u3001\u914d\u7f6e\u9879","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u670d\u52a1\u7aef\u914d\u7f6e","text":"setting/config/server.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u914d\u7f6e\u9879\uff0c\u5305\u542b\u4e86\u6240\u6709\u670d\u52a1\u7aef\u6240\u6709\u7684\u53ef\u914d\u7f6e\u9879\u3002 \u672c\u5730\u65e0\u7f51\u7edc\u8fd0\u884c \u5c06\u914d\u7f6e\u9879 network=0 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u672c\u5730\u6709\u7f51\u7edc\u8fd0\u884c \u914d\u7f6e\u9879 network=1 (1)\u914d\u7f6e\u9879 client_alias= \u914d\u7f6e\u4e3a\u4f60\u8981\u6d4b\u8bd5\u7684\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5982 Alias1 \u6d4b\u8bd5\u673a\u522b\u540d\u5728 setting/config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 (2)\u914d\u7f6e\u9879 client_alias= \u4e3a\u7a7a\uff0c\u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager --client_alias Alias1\uff0c\u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002(Alias1 \u4e3a\u4f60\u914d\u7f6e\u7684\u6d4b\u8bd5\u673a\u522b\u540d) (1)\u548c(2)\u53ea\u8981\u4f7f\u7528\u5176\u4e00\u5373\u53ef\u3002 \u6709\u7f51\u7edc\u8fd0\u884c\uff0c\u4e14\u9700\u8981\u901a\u8fc7 Jenkins \u4e0a\u8fd0\u884c\u4e00\u4e2a job \uff0c\u540c\u65f6\u63a7\u5236\u591a\u53f0\u673a\u5668\u3002 \u914d\u7f6e\u9879 network=1 \u914d\u7f6e\u9879 client_alias= \u4e0d\u7528\u914d\u7f6e\uff0c\u5728\u8fd0\u884c run.sh \u7684\u65f6\u5019\u76f4\u63a5\u7a7a\u683c\u52a0\u522b\u540d\u5373\u53ef\uff0c\u6bd4\u5982\uff1a\u6d4b\u8bd5\u673a\u522b\u540d\u4e3a Alias1 \uff0c\u4e14\u5df2\u7ecf\u5728 config/client.ini \u4e2d\u914d\u7f6e\u4e86 Alias1 \u7684user ip password \uff0c\u5219\u8fd0\u884c bash run.sh Alias1 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u5728 Jenkins pipeline \u91cc\u9762\u901a\u8fc7\u5e76\u884c stage \u6216\u5e76\u884c\u8c03\u7528\u4e0b\u5c42\u4efb\u52a1\u7684\u65b9\u5f0f\u53ef\u4ee5\u5b9e\u73b0\u5927\u89c4\u6a21\u7684\u6027\u80fd\u6d4b\u8bd5\u9700\u6c42\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;1\u3001KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2\u3001KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f, e.g. TAGS = L1 or smoke\n[case_conf]\n# \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\uff0cocr\u6587\u6848\u8bc6\u522b\u8f83\u6162\uff0c\u4e0d\u63a8\u8350\u4f7f\u7528\nfind_by = stage\n# \u6700\u540e\u4e00\u4e2a\u7a33\u5b9a\u9636\u6bb5\u7684\u5e27\u6570\u8bc6\u522b\n# \u9996\u5e27\u5b58\u5728\u540e\u7684\u7b2c\u4e00\u4e2a\u5927\u4e8e\u8be5\u914d\u7f6e\u5e27\u6570\u7684\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u5c3e\u5e27\nfinal_stable_num=100\n# \u4ece\u8be5\u5e27\u6570\u5f00\u59cb\u8bc6\u522b\u6587\u6848\u6216\u56fe\u7247\uff0c\u51cf\u5c11\u5206\u6790\u65f6\u95f4\nstart_num = 150\n# \u8bc6\u522b\u7684\u6587\u6848\ntext=\n# \u8bc6\u522b\u56fe\u7247\nmatch=apps/xxx/images/match.png\n# \u8bc6\u522b\u76f8\u4f3c\u5ea6\nmatch_rate=0.9\n# \u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6bd4\u5982\u70ed\u542f\u52a8\u7528\u4f8b\uff0c\u4ece\u70b9\u51fb\u6253\u5f00\u5230\u505c\u6b62\u5f55\u5c4f\uff0c\u4e2d\u95f4\u7b49\u5f855\u79d2\uff1b\nduration = 15\n# \u5355\u6761\u7528\u4f8b\u6267\u884c\u7684\u6b21\u6570\ncount = 5\n# \u7a33\u5b9a\u9636\u6bb5\u5212\u5206\u7684\u76f8\u4f3c\u5ea6\nstable_similarity = 0.9997\n[server]\n# \u8c03\u8bd5\u6a21\u5f0f=1\uff0c\u4e3a\u5f00\u542f\u8c03\u8bd5\u6a21\u5f0f\uff0c0\u4e3a\u5173\u95ed\u3002\n# \u8c03\u8bd5\u6a21\u5f0f\u4e0b\u9ed8\u8ba4\u53ea\u6267\u884c\u4e00\u6b21\u7528\u4f8b\uff0c\u4e0d\u5173\u673a\n# \u7f16\u5199\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u5efa\u8bae\u5f00\u542fmaintain\u3002\nMAINTAIN = 0\n# \u8fd0\u884c\u7684\u73af\u5883docker\u5bb9\u5668\u73af\u5883\uff0chost\u5bbf\u4e3b\u673a\u73af\u5883\nENV = docker\n# \u670d\u52a1\u7aef\u5bc6\u7801\nPASSWORD=1\n# \u6307\u5b9a\u6d4b\u8bd5\u673a\u522b\u540d\n# \u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6bd4\u5982\uff1a\n# [AMD]\n# ip=10.8.15.86\n# user=uos\n# \u5176\u4e2d AMD \u4e3a\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5219client_alias=AMD\nCLIENT_ALIAS = x86\uff08Intel-i7\uff09\n# 1 \u5f00\u542f\u7f51\u7edc, 0 \u5173\u95ed\u7f51\u7edc\n# \uff081\uff09\u670d\u52a1\u7aef\u4e0e\u6d4b\u8bd5\u673a\u987b\u5728\u540c\u4e00\u7f51\u6bb5\u4e0b\uff0c\u4f60\u53ef\u4ee5\u5c1d\u8bd5\u5728\u670d\u52a1\u7aef\u901a\u8fc7ssh\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c\u5982\u679c\u53ef\u4ee5\u8fde\u63a5\uff0c\u8bf4\u660e\u7f51\u7edc\u6b63\u5e38\u3002\n# \uff082\uff09\u5f53input_type=FILE_NAME \u65f6\uff0c\u5fc5\u987b\u5f00\u542f\u7f51\u7edc\u3002\nNETWORK = 1\n# \u6027\u80fd\u7ed3\u679c\u7edf\u8ba1\u5355\u4f4d \u6beb\u79d2\u2014ms, \u79d2\u2014s\nUNIT=ms\n# \u6d4b\u8bd5\u673a\u5f00\u673a\u8fdb\u5165\u684c\u9762\u540e\u7b49\u5f85\u65f6\u95f4,\u5355\u4f4d/\u79d2\nSTARTUP_DELAY = 60\n# 1\u4e3a\u5220\u9664\u7f13\u5b58\uff0c0\u4e3a\u4e0d\u5220\u9664\u7f13\u5b58\n# \u7528\u4f8b\u6267\u884c\u5b8c\u540e\u4f1a\u5728report\u76ee\u5f55\u4e0b\u751f\u6210\u667a\u80fd\u89e3\u6790\u7684\u4e00\u4e9b\u7f13\u5b58\u56fe\u7247\u3002\nCACHE = 0\n# \u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u62a5\u544a\u4f1a\u4fdd\u5b58\u5728\u9879\u76ee\u4e0breport\u76ee\u5f55\u4e2d\uff1b\n# \u6307\u5b9a\u62a5\u544a\u76ee\u5f55\u5219\u5b58\u653e\u5230\u6307\u5b9a\u76ee\u5f55\u3002\nREPORT_PATH = report\n# \u670d\u52a1\u7aef\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684icon\u8d44\u6e90\u4f1a\u7f13\u5b58\u5728\u9879\u76ee\u4e0binput\u76ee\u5f55\u4e2d\nINPUT = input/\n# 1\u4e3a\u6d4b\u8bd5\u5b8c\u5173\u673a\uff0c0\u4e3a\u6d4b\u8bd5\u5b8c\u4e0d\u5173\u673a\nSHUTDOWN = 0\n# \u89e3\u6790\u8fdb\u7a0b\u6570\uff08\u4e0d\u63a8\u8350\u4fee\u6539\uff09\n# 3\u4e2a\u8fdb\u7a0b\u89e3\u6790\u89c6\u9891\u5df2\u7ecf\u80fd\u591f\u6ee1\u8db3\uff0c\u5373\u4f7f\u589e\u52a0\u8fdb\u7a0b\u6570\u4e5f\u4e0d\u80fd\u51cf\u5c11\u6574\u4f53\u8017\u65f6\n# \u53e6\u5916\u8fd8\u8981\u770bCPU\u6838\u6570\u662f\u5426\u652f\u6301\u3002\nPARSING_PROCESS = 3\n# 1\u4e3a\u4f7f\u7528\u7ee7\u7535\u5668\u5f00\u5173\u673a\uff0c0\u4e3a\u4f7f\u7528reboot\u547d\u4ee4\u91cd\u542f\u3002\u4f9d\u8d56\u7ee7\u7535\u5668\u786c\u4ef6\u8bbe\u5907\uff0c\u9700\u8981\u4f7f\u7528\u8054\u7cfb\u5f00\u53d1\u8005\nRELAY = 0\n# \u83b7\u53d6\u6d4b\u8bd5\u5e94\u7528\u7684\u7248\u672c, %s \u5360\u4f4d\u5e94\u7528\u540d\n# \u5982\u679c\u8be5\u914d\u7f6e\u4e3a\u7a7a\uff0c\u5219\u4e0d\u83b7\u53d6\u5e94\u7528\u7684\u7248\u672c\u4fe1\u606f\u3002\nCOMMAND = apt policy %s 2>/dev/null|grep \"\u5df2\u5b89\u88c5\"|awk -F \"\uff1a\" \"{print \\$2}\"\n# \u5173\u673a\u7b49\u5f85\u5f00\u542f\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6839\u636e\u6d4b\u8bd5\u673a\u6027\u80fd\u4e0d\u540c\uff0c\u5f00\u5173\u673a\u8017\u65f6\u53ef\u80fd\u4e0d\u540c\uff0c\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u673a\u60c5\u51b5\u914d\u7f6e\u3002\nSHUTDOWN_DELAY = 30\n# \u53ef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u56fe\u7247\u683c\u5f0f\uff0c\u4ee5\u82f1\u6587\u9017\u53f7\u9694\u5f00\u3002\n# \u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u76ee\u524d\u6211\u4eec\u4ec5\u9a8c\u8bc1\u4e86jpg,jpeg,png\u8fd9\u4e09\u79cd\u5e38\u7528\u7684\u56fe\u7247\u683c\u5f0f\u3002\nINPUT_TYPES = jpg,jpeg,png\n# \u6027\u80fd\u5206\u6790\u8865\u5e27\uff0c\u7b49\u4e8e\u6216\u4f4e\u4e8e\u8be5\u503c\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u9700\u8981\u51cf\u6389\u3002\nUN_STAB_START = 3\n# \u670d\u52a1\u7aef\u83b7\u53d6\u6d4b\u8bd5\u673a\u56fe\u50cf\u7684\u5e27\u7387\uff0c\u5373\u6bcf\u79d2\u83b7\u53d6\u591a\u5c11\u5f20\u6d4b\u8bd5\u673a\u4e0a\u7684\u56fe\u50cf\u3002\n# \u9ed8\u8ba4\u5e27\u7387\u4e3a30\u5e27/\u79d2\uff0c\u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u53ef\u80fd\u4f1a\u5bf9\u89e3\u6790\u7ed3\u679c\u9020\u6210\u504f\u5dee\u3002\nFPS = 30\n# \u4ee5\u4e0b\u573a\u666f\u7c7b\u578b\u4f1a\u91cd\u542f\u6d4b\u8bd5\u673a,\u591a\u79cd\u573a\u666f\u4f7f\u7528\u9017\u53f7\u9694\u5f00\nSCENE = cold\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = http://10.8.13.78:8890\n#\u5c4f\u5e55\u56fe\u7247\u4e34\u65f6\u5b58\u653e\u4f4d\u7f6e\nSCREEN_CACHE = /tmp/screen\n# =======================================\n[log]\n# \u65e5\u5fd7\u7ea7\u522b\uff0cOFF\u3001FATAL\u3001ERROR\u3001WARN\u3001INFO\u3001DEBUG\u3001ALL\n# \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u65e5\u5fd7\u8f93\u51fa\uff0clog_cli=INFO\u8868\u793a \u4ec5\u8f93\u51faINFO\u53ca\u4ee5\u4e0a\u7ea7\u522b\u7684\u65e5\u5fd7\u3002\nLOG_LEVEL = DEBUG\n# \u65e5\u5fd7\u6587\u4ef6\u4fdd\u5b58\u8def\u5f84\nLOG_PATH= logs\n# =======================================\n[dockerhub]\n# \u5bb9\u5668\u767b\u9646\u8d26\u53f7\nDOCKER_USER = user\n# \u5bb9\u5668\u767b\u9646\u5bc6\u7801\nDOCKER_PASSWORD = User1234\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u6d4b\u8bd5\u673a\u914d\u7f6e","text":"setting/config/client.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u4fe1\u606f\u3002 \u6709\u7f51\u7edc\u7684\u60c5\u51b5\u4e0b\uff0c\u670d\u52a1\u7aef\u9700\u8981\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u56e0\u6b64\u4f60\u9700\u8981\u5199\u5165 \u6d4b\u8bd5\u673a\u522b\u540d \u3001 user \u3001ip\u3001 password \u3002 # \u6d4b\u8bd5\u673a\u522b\u540d\n[Alias1] # \u6d4b\u8bd5\u673aip\nip=10.8.15.86 # \u6d4b\u8bd5\u673a\u7528\u6237\u540d\nuser=uos\n \u547d\u540d\u5efa\u8bae\uff1aAliasA1\u3001AliasA2\u3001AliasB1\u3001AliasB2\uff0c\u4e0d\u8981\u91cd\u540d\u3002 \u65e0\u7f51\u7edc\u60c5\u51b5\u4e0b\uff0c\u4ec5\u9700\u8981\u5173\u6ce8\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\u9879 width=\u3001 height= \u5373\u53ef\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a [client]\n# \u9ed8\u8ba4\u6d4b\u8bd5\u673a\u7528\u6237\u540d\uff0c\u5bc6\u7801\uff0cip\nip=\nuser=\n# \u6d4b\u8bd5\u673a\u5bc6\u7801\npassword=1\n# \u6d4b\u8bd5\u673a\u4e3b\u9898\ntheme=bloom\n# \u6d4b\u8bd5\u673aicon\u76ee\u5f55\npath=/usr/share/icons\n# \u7cfb\u7edfdesktop\u6587\u4ef6\u7684\u5b58\u653e\u76ee\u5f55\uff0cUOS\u7cfb\u7edf\u9ed8\u8ba4\u4e3a/usr/share/applications\ndesktop_path=/usr/share/applications\n# \u7528\u4e8e\u5224\u65ad\u6d4b\u8bd5\u673a\u662f\u5426\u5f00\u673a\u8fdb\u5165\u684c\u9762\u7684\u8bc6\u522b\u6807\u8bc6\u3002\n# 1\u3001\u901a\u8fc7\u684c\u9762\u56fe\u6807\u8bc6\u522b\u3002\n# - type=FILE_NAME\u65f6\uff0c\u670d\u52a1\u5668\u548c\u6d4b\u8bd5\u673a\u5fc5\u987b\u5728\u540c\u4e00\u5c40\u57df\u7f51\u5185\u3002\n# - power_on=dde-computer\u8868\u793a\u901a\u8fc7\u684c\u9762\u8ba1\u7b97\u673a\u56fe\u6807\u5224\u65ad\u5f00\u673a\u8fdb\u5165\u684c\u9762\u3002\n# 2\u3001\u901a\u8fc7\u672c\u5730\u56fe\u7247\u4f5c\u4e3a\u5f00\u673a\u8bc6\u522b\u3002\n# - type= \u4f20\u5165\u4e3a\u56fe\u7247\u683c\u5f0f\uff0ctype\u652f\u6301\u7684\u7c7b\u578b\u5305\u542b\u5728server.ini\u5185\u914d\u7f6e\u9879input_type=jpg,jpeg,png\u3002\n# - power_on= \u4f20\u5165\u7684\u662f\u672c\u5730\u56fe\u7247\u7684\u8def\u5f84\u3002\ntype=FILE_NAME\npower_on=dde-computer\n# \u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\uff08\u6d4b\u8bd5\u673a\u8fde\u63a5\u91c7\u96c6\u76d2\uff0c\u91c7\u96c6\u76d2\u7684\u5206\u8fa8\u7387\uff09\nheight=1080\nwidth=1920\n[AliasA1] ip=10.8.15.86\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n[AliasA2]\nip=10.8.15.20\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_2","title":"3\u3001\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e","text":"\u968f\u7740\u6d4b\u8bd5\u573a\u666f\u7684\u4e0d\u65ad\u5f15\u5165\uff0c\u53d1\u73b0\u73b0\u6709\u670d\u52a1\u7aef\u91cc\u7684\u914d\u7f6e\u9879\u5e76\u4e0d\u9002\u7528\u4e8e\u6240\u6709\u7684\u6027\u80fd\u573a\u666f\uff0c\u4e8e\u662f\u5c06\u670d\u52a1\u7aef\u914d\u7f6e\u8fdb\u884c\u4e00\u4e2a\u63d0\u53d6\uff0c\u53ef\u505a\u5355\u4e2a\u573a\u666f\u7684\u4e2a\u6027\u5316\u914d\u7f6e\uff0c\u5f53\u7136\u539f\u6765\u7684\u670d\u52a1\u7aef\u914d\u7f6e\u529f\u80fd\u4fdd\u7559\uff0c\u53ea\u662f\u5f53\u4f60\u914d\u7f6e\u4e86\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e\u540e\uff0c\u4f18\u5148\u4f7f\u7528\u4e2a\u6027\u5316\u914d\u7f6e\u91cc\u9762\u7684\u5185\u5bb9\uff0c\u4ee5\u4e0b\u662f\u5bf9\u4e2a\u6027\u5316\u914d\u7f6e\u7684\u4ecb\u7ecd\u3002 \u76ee\u524d\u6bcf\u4e00\u4e2a py \u6587\u4ef6\u5bf9\u5e94\u4e00\u4e2a\u6027\u80fd\u6d4b\u8bd5\u573a\u666f\uff0c\u4e8e\u662f\u5728\u540c\u7ea7\u76ee\u5f55\u4e0b\u521b\u5efa\u4e00\u4e2a\u4e0e\u4e4b\u540c\u540d\u7684 json \u6587\u4ef6\uff0c\u4f5c\u4e3a\u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6 apps\n\u251c\u2500\u2500 album\n \u251c\u2500\u2500 test_album_01_start.json # \u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6\n\u2514\u2500\u2500 test_album_01_start.py # \u6027\u80fd\u573a\u666f\u6587\u4ef6\n \u4ee5\u4e0b\u662f\u5bf9 json \u6587\u4ef6\u4e2d\u914d\u7f6e\u7684\u89e3\u91ca\uff0c\u82e5\u67d0\u9879\u914d\u7f6e\u4e0d\u9700\u8981\uff0c\u53ef\u4ee5\u7f3a\u5931\uff0c\u4f46\u4e0d\u80fd\u4e3a\u7a7a\uff1b {\n\"title\": \"test_album_start\", # \u6807\u9898\uff1b\u5fc5\u987b\n\"app_name\": \"deepin-album\", # \u573a\u666f\u6240\u5c5e\u7684\u5e94\u7528\uff1b\u5fc5\u987b\n\"scene\": \"hot\", # \u573a\u666f\u522b\u540d\uff1b\u5fc5\u987b\n\"icon\": [\"deepin-album\"], # \u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684icon\u5230\u670d\u52a1\u7aef\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\uff1b\u53ef\u7f3a\u5931\n# \u6ce8\u610f\uff1a\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684desktop\u6587\u4ef6\u540d\u4e3adeepin-album.desktop\uff0c\n# \u53ea\u9700\u8981\u5199deepin-album\u5373\u53ef\uff0c\u201c.desktop\u201d\u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002\n\"size\": { # \u56fe\u7247\u5bf9\u6bd4\u7684\u533a\u57df\u8bbe\u7f6e\u9879\uff0c\u67d0\u4e9b\u5e94\u7528\u5f53\u524d\u5c4f\u5e55\u7684\u90e8\u5206\u533a\u57df\u9700\u8981\u5c06\u5176\u53bb\u6389\uff0c\u53ef\u4ee5\u8bbe\u7f6e\u6b64\u9879\uff0c\u5982\u679c\u6ca1\u6709\u5219\u53ef\u4e0d\u5199\uff1b\u53ef\u786e\u5b9e\n\"x-coordinate\": 0, # \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n\"y-coordinate\": 0, # \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n\"width\": 850, # \u6a2a\u5411\u957f\u5ea6\n\"height\": 1920 # \u7eb5\u5411\u9ad8\u5ea6\n},\n\"count\": 5, # \u573a\u666f\u6267\u884c\u7684\u6b21\u6570\uff1b\u5fc5\u987b\n\"duration\": 5, # \u8be5\u6761\u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff0c\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7279\u5b9a\u573a\u666f\uff0c\u8be5\u914d\u7f6e\u4e3a\u53ef\u9009\u9879\uff0c\u8986\u76d6 server.ini \u4e2d\u7684\u914d\u7f6e\uff1b\u53ef\u7f3a\u5931\n\"stable_similarity\": 0.9997, # \u6027\u80fd\u573a\u666f\u5206\u9636\u6bb5\u65f6\u7684\u56fe\u7247\u76f8\u4f3c\u5ea6\u5bf9\u6bd4\uff0c\u524d\u540e\u56fe\u7247\u4f4e\u4e8e\u8be5\u503c\uff0c\u5219\u5206\u4e3a\u4e0d\u7a33\u5b9a\u9636\u6bb5\uff1b\u53ef\u7f3a\u5931\n\"find_by\": \"stage\", # \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\n\"final_stable_num\": 100, # \u67e5\u627e\u6700\u540e\u4e00\u4e2a\u5927\u4e8e\u8be5\u503c\u7684\u7a33\u5b9a\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u7684\u5c3e\u796f\uff1b\u53ef\u7f3a\u5931\n\"start_num\": 150,\n\"text\": \"\", # ocr\u8bc6\u522b\u7684\u6587\u6848\n\"match\": \"apps/xxx/images/match.png\", # \u56fe\u50cf\u5339\u914d\u7684\u56fe\u7247\u6587\u4ef6\u8def\u5f84\n\"match_rate\": 0.9 # \u5339\u914d\u76f8\u4f3c\u5ea6\n}\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e94\u3001\u6d4b\u8bd5\u6d41\u7a0b","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516d\u3001\u7528\u4f8b\u7f16\u5199\u53ca\u65b9\u6cd5\u53c2\u6570\u6307\u5f15","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"1\u3001\u7528\u4f8b\u5b9e\u4f8b\u8bf4\u660e","text":"# \u6807\u51c6\u5e93\u5bfc\u5165\nfrom time import sleep\n# \u5bfc\u5165\u4e09\u65b9\u5e93pytest\nimport pytest\n# \u5bfc\u5165\u7528\u4f8b\u6267\u884c\u8981\u7528\u5230\u7684Widget\u7c7b\nfrom src.base_widget import BaseWidget\nclass TestStart:\n# class\u7ea7\u522b\u7684fixture\uff0c\u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u6267\u884c\u3002autouse=True \u81ea\u52a8\u5728\u5f53\u524d\u4f5c\u7528\u57df\u4e0b\u4f7f\u7528\u3002\n@pytest.fixture(scope=\"class\", autouse=True)\n# \u6d4b\u8bd5\u70ed\u542f\u52a8\u4e4b\u524d\u9700\u8981\u9884\u542f\u52a8\u3002\ndef application_pre_start(self):\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().right_click_element(\"deepin-album\")\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().click_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\")\nsleep(2)\n# \u5feb\u6377\u952e\u5173\u95ed\u7a97\u53e3\nBaseWidget().hot_key(\"alt\", \"f4\")\nsleep(2)\n# \u9ed8\u8ba4\u4e3afunction\u7ea7\u522b\u7684fixture\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\uff0cclass\u7ea7\u522bfixture\u6267\u884c\u4e4b\u540e\u6267\u884c\u3002\n@pytest.fixture(autouse=True)\ndef setup_start(self):\n# \u53f3\u952e\u70b9\u51fb deepin-album \u56fe\u6807\nBaseWidget().right_click_element(\"deepin-album\")\n# \u79fb\u52a8\u5230\u53f3\u952e\u83dc\u5355\u4e2d\u6253\u5f00\uff08open.png\uff09\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().move_to(*BaseWidget().find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))\n# \u7b49\u5f85\u79fb\u52a8\u5b8c\u6210\nsleep(0.5)\ndef test_album_start(self):\n# \u70b9\u51fb\u201c\u6253\u5f00\u201d\nBaseWidget().click() \n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"2\u3001\u65b9\u6cd5\u53c2\u6570\u8bf4\u660e","text":"2.1\u3001find_element \u65b9\u6cd5 def find_element(element: str, input_type: str = \"FILE_NAME\", fill_color_position: tuple = (-1, -1), size: tuple = (25, 70)):\npass\n \u53c2\u6570 element \u548c input_type \uff081\uff09\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u5143\u7d20 - `input_type` \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a `FIEL_NAME` \uff0c\u8868\u793a\u901a\u8fc7\u5e94\u7528 `icon` \u5bfb\u627e\u5143\u7d20\uff0c\u6b64\u65b9\u6cd5\u4f1a\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u5e94\u7528 `icon` \u56fe\u6807\u3002\n \u4e3e\u4f8b\uff1a\u9ed8\u8ba4\u60c5\u51b5\u4e0b input_type \u53c2\u6570\u4e0d\u9700\u8981\u4f20\u5165\uff0c find_element(\"deepin-album\")\uff0c\u8868\u793a\u901a\u8fc7 deepin-album \u7684\u5e94\u7528 icon \u6765\u83b7\u53d6\u5750\u6807\uff0c\u6ce8\u610f\uff0c\u6b64\u65f6\u4f20\u5165\u7684 deepin-album \u53c2\u6570\u5b9e\u9645\u662f desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u548c2.3\u4e2d\u7684 icon \u53d8\u91cf\u4e00\u81f4\u3002 \u6211\u4eec\u5efa\u8bae\u4f18\u5148\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\uff0c\u4f46\u6b64\u65b9\u6cd5\u4f9d\u8d56\u7f51\u7edc\uff0c\u8bf7\u6839\u636e\u6d4b\u8bd5\u73af\u5883\u5b9e\u9645\u60c5\u51b5\u9009\u62e9\u3002 \uff082\uff09\u901a\u8fc7\u672c\u5730\u56fe\u7247\u8bc6\u522b\u5143\u7d20 - \u53c2\u6570 `input_type` \u4f20\u5165\u56fe\u7247\u683c\u5f0f\uff0c\u6bd4\u5982\u622a\u53d6\u7684\u672c\u5730\u56fe\u7247\u683c\u5f0f\u4e3a `png`\uff0c\u90a3\u4e48 `input_type=\"png\"`\uff0c\u6b64\u65f6\u53c2\u6570 `element ` \u4f20\u5165\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5efa\u8bae\u5b58\u653e\u5728\u5bf9\u5e94\u7684\u4ea7\u54c1 `apps/app/picture/` \u76ee\u5f55\u4e0b\uff0c\u8def\u5f84\u4e3a\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u7684\u76f8\u5bf9\u8def\u5f84\u3002\n- \u4e3e\u4f8b\uff1a`find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))`\uff0c\u8868\u793a\u901a\u8fc7\u672c\u5730\u56fe\u7247 `open.png` \u8bc6\u522b\u5143\u7d20\u3002\n \u53c2\u6570 fill_color_position fill_color_position \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (-1, -1)\uff0c(-1, -1) \u8868\u793a\u53d6\u5c4f\u5e55\u4e2d\u53f3\u4e0b\u89d2\u6700\u540e\u4e00\u4e2a\u50cf\u7d20\u70b9\u4f5c\u4e3a\u586b\u5145\u5750\u6807\uff0c\u5728 1920x1080 \u5c4f\u5e55\u5206\u8fa8\u7387\u4e0b\u5373\u5b9e\u9645\u5750\u6807\u4e3a (1919, 1079) \uff0c\u8fd9\u6837\u7684\u5199\u6cd5\u53ef\u4ee5\u9002\u914d\u4e0d\u540c\u5927\u5c0f\u7684\u5c4f\u5e55\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0d\u540c\u65b9\u4f4d\uff1a \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0b\u65b9\uff0c\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u4e0d\u9700\u8981\u4f20\u5165\u8be5\u53c2\u6570\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u5de6\u8fb9\uff0cfill_color_position=(1, 1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u53f3\u8fb9\uff0cfill_color_position=(-1, -1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0a\u8fb9\uff0cfill_color_position=(1, 1) \u4ece\u684c\u9762\u542f\u52a8\u5e94\u7528\uff0c\u5219\u9700\u8981\u4f20\u5165\u9664\u4efb\u52a1\u680f\u4ee5\u5916\u5176\u4ed6\u4f4d\u7f6e\u7684\u5750\u6807\uff0c\u6bd4\u5982(100, 100)\uff0c\u53ea\u8981\u8fd9\u4e2a\u5750\u6807\u4e3a\u9664\u5e94\u7528\u548c\u4efb\u52a1\u680f\u533a\u57df\u90fd\u53ef\u4ee5\u3002 \u4ece\u542f\u52a8\u5668\u91cc\u9762\u542f\u52a8\u5e94\u7528\uff0c\u9700\u8981\u586b\u5145\u7684\u5750\u6807\u4e3a\u542f\u52a8\u5668\u533a\u57df\u3002 \u6ce8\uff1a\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u65f6\uff0c\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684 icon \u539f\u6587\u4ef6\u4e3a svg \u77e2\u91cf\u56fe\uff0c\u8f6c\u6362\u4e3a png \u4e4b\u540e\u9700\u8981\u586b\u5145\u8fb9\u7f18\u900f\u660e\u90e8\u5206\u3002 \u53c2\u6570 size size \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (25, 70)\uff0c\u8868\u793a\u6d4b\u8bd5\u673a\u4e0a dock \u680f\u4e0a\u5e94\u7528\u56fe\u6807\u7684\u5927\u5c0f\u8303\u56f4\u3002 UOS \u7cfb\u7edf dock \u680f\u662f\u53ef\u4ee5\u4e0a\u4e0b\u62d6\u52a8\u5927\u5c0f\u7684\uff0c\u968f\u7740 dock \u680f\u5927\u5c0f\u6539\u53d8\uff0c\u5e94\u7528\u56fe\u6807\u7684\u8303\u56f4\u4e3a25\u523070\u4e4b\u95f4\u3002 \u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u64cd\u4f5c\u7cfb\u7edf\u4e0a dock \u680f\u5927\u5c0f\u4e0d\u4e00\u6837\uff0c\u53ef\u4ee5\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u4f20\u5165\u5927\u5c0f\u8303\u56f4\u3002 2.2\u3001click_element\u3001 right_click_element\uff0c double_click_element \u8fd9\u51e0\u4e2a\u65b9\u6cd5\u53c2\u6570\u89c4\u5219\u4e0e find_element \u65b9\u6cd5\u4e00\u6837\u3002\u4ed6\u4eec\u5b9e\u9645\u4e0a\u662f\u5728 find_element \u65b9\u6cd5\u57fa\u7840\u4e4b\u4e0a\u505a\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u589e\u52a0\u4e86\u9f20\u6807\u7684\u52a8\u4f5c\uff0c\u5982\u679c\u4f60\u4e0d\u60f3\u4f7f\u7528\u8fd9\u51e0\u4e2a\u65b9\u6cd5\uff0c\u5728\u7528\u4f8b\u4e2d\u4e5f\u53ef\u4ee5\u901a\u8fc7 find_element \u83b7\u53d6\u5230\u5750\u6807\uff0c\u7136\u540e\u5c06\u5750\u6807\u4f20\u5165\u5230\u952e\u9f20\u7684\u65b9\u6cd5\u4e2d\uff0c\u53ef\u4ee5\u5b9e\u73b0\u540c\u6837\u7684\u6548\u679c\u3002 2.3\u3001\u7528\u4f8b\u7c7b\u4e2d\u6709\u4e2a\u7c7b\u53d8\u91cf icon = [\"deepin-album\"] \u9700\u8981\u7279\u6b8a\u8bf4\u660e\uff0c\u5217\u8868\u4e2d\u7684\u5143\u7d20\u4e3a\u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709 icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684 icon \u5230\u670d\u52a1\u7aef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528 desktop \u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684 desktop \u6587\u4ef6\u540d\u4e3a deepin-album.desktop\uff0c\u53ea\u9700\u8981\u5199 deepin-album \u5373\u53ef\uff0c.desktop \u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e03\u3001\u6267\u884c\u5165\u53e3","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"1\u3001\u7528\u4f8b\u7ec4\u7ec7","text":"\u5728 setting/config/server.ini \u6587\u4ef6\u4e2d APP_NAME= \u5b57\u6bb5\u4e3a\u7528\u4f8b\u7684\u6267\u884c\u7684\u76ee\u5f55\uff0c\u9ed8\u8ba4\u4e3a apps \u76ee\u5f55\u4e0b\u6240\u6709\u7528\u4f8b\u3002\u5982\u679c\u4f60\u60f3\u6307\u5b9a\u6267\u884c\u67d0\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4f60\u53ef\u4ee5\u5c06\u8be5\u914d\u7f6e\u9879\u6307\u5b9a\u5230\u5e94\u7528\u7684\u7528\u4f8b\u76ee\u5f55\uff0c\u6bd4\u5982\uff1aAPP_NAME=deepin_album\uff0c \u8868\u793a\u6267\u884c\u76f8\u518c\u76ee\u5f55\u4e0b\u7684\u7528\u4f8b\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a python3 manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music\n -k KEYWORDS, --keywords KEYWORDS\n \u7528\u4f8b\u7684\u5173\u952e\u8bcd\n -t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e\n --log_level LOG_LEVEL \u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n --env {host,docker} \u5728\u5bbf\u4e3b\u673a\u6216\u5bb9\u5668\u73af\u5883\u6267\u884c\n --client_alias \u9009\u62e9\u6d4b\u8bd5\u673a\u522b\u540d, \u53ef\u9009\u9879\u4e3aclient.ini\u4e2d\u5df2\u914d\u7f6e, \u9ed8\u8ba4\u503c\u4e3a zx-x86.\n --count \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a python3 manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\" --env docker\n \u6ce8\uff1a\u5728\u5bb9\u5668\u4e2d\u6267\u884c\u65f6\uff0c\u82e5\u5f3a\u5236\u9000\u51fa\uff0c\u5bb9\u5668\u5e76\u4e0d\u4f1a\u505c\u6b62\u8fd0\u884c\uff01"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_9","title":"\u516b\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1json","title":"1\u3001Json \u62a5\u544a","text":"\u81ea\u7814\u89c6\u9891\u89e3\u6790\u5de5\u5177\u4f1a\u5bf9\u5355\u6761\u7528\u4f8b\u6267\u884c\u4e00\u8f6e\u751f\u6210\u4e00\u4e2a json \u6587\u4ef6\uff0c\u5b58\u653e\u4e8e report/{app_name}/{scene}/{run_num} \u76ee\u5f55\u4e0b\uff0c\u547d\u540d\u683c\u5f0f\u4e3a\uff1a report.json json \u5185\u5bb9\u4e3e\u4f8b\uff1a [\n{\n\"Stab1\": {\n\"images\": [1,2...150,151],\n\"startStub\": 0,\n\"type\": \"Stab\"\n}\n},\n{\n\"Stab2\": {\n\"images\": [152,153...169,170],\n\"startStub\": 1,\n\"type\": \"UnStab\"\n}\n},\n{\n\"Stab3\": {\n\"images\": [171,172...300,301],\n\"startStub\": 0,\n\"type\": \"UnStab\"\n}\n}\n]\n \u8bf4\u660e\uff1a Stab \uff1a\u8868\u793a\u89e3\u6790\u8fc7\u7a0b\u4e2d\u4e0d\u540c\u7684\u9636\u6bb5\u3002 images \uff1a\u8868\u793a\u6bcf\u4e00\u5e27\u7684\u56fe\u7247\u5e8f\u53f7\u3002 startStub\uff1a \u4e3a\u8bc6\u522b\u5c3e\u5e27\u7684\u9636\u6bb5\u8868\u793a\uff0c\u5982\u679c \"startStub\": 1 \uff0c\u8bf4\u660e\u5c3e\u5e27\u51fa\u73b0\u5728\u8be5\u9636\u6bb5\u3002 type\uff1a \u4e3a Stab \u6216 UnStab \uff0c\u8868\u793a\u7a33\u5b9a\u9636\u6bb5\u6216\u4e0d\u7a33\u5b9a\u9636\u6bb5\u3002 \u5404\u9636\u6bb5\u6709\u5e27\u6570\u8865\u507f\uff0c\u9ed8\u8ba4\u8865\u507f\u7684\u5e27\u6570\u4e3a 3 \u5e27\uff08\u53ef\u4ee5\u901a\u8fc7 server.ini \u91cc\u9762 un_stab_start=3 \u8fdb\u884c\u914d\u7f6e\uff09\uff0c\u8868\u793a\u5c0f\u4e8e\u7b49\u4e8e 3 \u5e27\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u524d\u540e\u5747\u9700\u8981\u51cf\u6389\u3002 \u5e94\u7528\u542f\u52a8\u9636\u6bb5\u5c31\u662f\u5728 Stab2 \u9636\u6bb5\uff0c\u542f\u52a8\u65f6\u95f4\u4e3a\uff1a171 \u51cf 151 \u518d\u51cf\u6389\u524d\u540e\u8865\u507f\u5e27\u6570 6 \u5e27\uff0c\u5373 14 \u5e27\uff0c\u89c6\u9891\u5e27\u7387 30 \u5e27/\u79d2\uff0c\u56e0\u6b64\u542f\u52a8\u8017\u65f6\u4e3a\uff1a14 * 33 = 462 ms"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2excel","title":"2\u3001Excel \u62a5\u544a","text":"\u6240\u6709\u7528\u4f8b\u6267\u884c\u5e76\u89e3\u6790\u5b8c\u4e4b\u540e\u4f1a report \u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a\u6c47\u603b\u6570\u636e\u7684 Excel \u6587\u4ef6\uff0c\u6587\u4ef6\u540d\u4e3a\uff1a{time}_perf_time.xlsx\u3002 \u6ce8\u610f\uff0creport \u76ee\u5f55\u4e3a\u53ef\u914d\u7f6e\u9879\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u4f1a\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u751f\u6210\uff0c\u5982\u679c\u4f60\u5c06 report\uff0c\u6307\u5b9a\u5230\u9879\u76ee\u4e0b\u5176\u4ed6\u8def\u5f84\uff0c\u5219\u4f1a\u5728\u5bf9\u5e94\u7684\u8def\u5f84\u4e0b\u751f\u6210 json \u548c Excel \u6587\u4ef6\u3002 \u4f60\u4e5f\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8bfb\u53d6\u6240\u6709 json / excel \u62a5\u544a\u7684\u6570\u636e\uff0c\u751f\u6210\u4f60\u81ea\u5df1\u60f3\u8981\u7684\u4e00\u4e9b\u6d4b\u8bd5\u62a5\u544a\u5f62\u5f0f\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#usb","title":"\u4e5d\u3001USB \u4e32\u53e3\u9a71\u52a8\u952e\u9f20\u65b9\u6cd5","text":"\u4f4d\u4e8e src/utils/control/serial_communication \u76ee\u5f55\u4e0b\u7684 usb_mk.py \u6587\u4ef6 usb_mk = UsbMk()\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up()\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u652f\u6301\u4f20\u5165\u6c49\u5b57\uff0c\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click()\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() \n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() \n \uff084\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() \n \uff085\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() \n \uff086\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() \n \uff087\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff088\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff0810\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_10","title":"\u5341\u3001\u7ee7\u7535\u5668\u63a7\u5236\u4e3b\u673a\u5f00\u673a/\u91cd\u542f","text":"\uff08\u82e5\u4e0d\u4f7f\u7528\u7ee7\u7535\u5668\uff0c\u53ef\u5ffd\u7565\u8be5\u6b65\u9aa4\uff0c\u6267\u884c\u65f6\u4f1a\u901a\u8fc7\u547d\u4ee4 reboot\uff09"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u7ee7\u7535\u5668\u8bbe\u5907","text":"LCUS-2 \u578b \u53cc\u8def USB \u667a\u80fd\u4e32\u53e3\u63a7\u5236\u7ee7\u7535\u5668\u3002 https://item.taobao.com/item.htm?spm=a1z09.2.0.0.41d72e8dUYx2pi&id=582653718178&_u=i25r20ia6a2e "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2usb","title":"2\u3001USB \u5ef6\u957f\u7ebf","text":"\u666e\u901a\u7684 USB \u7ebf\u5373\u53ef\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_3","title":"3\u3001\u675c\u90a6\u7ebf","text":"3.1\u300140P \u6bcd\u5bf9\u516c\u675c\u90a6\u7ebf\u3002 3.2\u3001\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"4\u3001\u5b89\u88c5\u56fe\u6587\u6559\u7a0b","text":"4.1\u3001\u4f7f\u7528 USB \u5ef6\u957f\u7ebf\u8fde\u63a5\u63a7\u5236\u7aef\u548c\u7ee7\u7535\u5668\u3002 4.2\u3001\u5728\u7ee7\u7535\u5668\u5e38\u7aef\u548c\u516c\u5171\u7aef\u5747\u8fde\u63a5\u4e00\u6839\u675c\u90a6\u7ebf\u3002 4.3\u3001\u5728\u4e3b\u677f\u4e0a\u5f00\u673a\u9488\u548c\u91cd\u542f\u9488\u4e0a\u63d2\u4e0a\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 4.4\u3001\u5c06\u5f00\u673a\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76841\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1\u5de6\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 4.5\u3001\u5c06\u91cd\u542f\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76842\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1 \u53f3\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 \u82e5\u60f3\u4fdd\u7559\u539f\u7535\u6e90\u5f00\u5173\u7684\u7535\u6e90\u706f\uff0c\u53ef\u6839\u636e\u5982\u4e0a\u56fe\u6240\u793a\uff0c\u4f7f\u7528\u675c\u90a6\u7ebf\u8fde\u63a5\u4e3b\u677f\u4e0a\u7684\u7535\u6e90\u706f\u548c\u539f\u7535\u6e90\u5f00\u5173"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_11","title":"\u5341\u4e00\u3001\u5e38\u89c1\u95ee\u9898\u8bf4\u660e","text":"1\u3001ERROR: for uos Cannot restart container 2301b1a1395d7959ee6523d61b61c87084649af530786cdb8fb5b3ecbcbd1068: linux runtime spec devices: error gathering device information while adding custom device \"/dev/ttyACM0\": no such file or directory \u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u8fde\u63a5\u72b6\u6001\uff0c\u67e5\u770b /dev/ttyACM0 \u662f\u5426\u5b58\u5728\uff0c\u82e5\u5b58\u5728 /dev/ttyACMn\uff08n\u4e3a\u4efb\u610f\u6570\u5b57\uff09\uff0c\u91cd\u542f\u7535\u8111\u89e3\u51b3\u3002 2\u3001Error response from daemon: Container 5e700fdc769e8c74666d68a7f2bc3de58268b4594cf88706609d59f8dbc7362d is not running \u5bb9\u5668\u542f\u52a8\u5931\u8d25 1\uff09\u68c0\u67e5\u54ea\u4e00\u4e2a\u5bb9\u5668\u672a\u542f\u52a8 sudo docker container ls # \u5217\u51fa\u8fd0\u884c\u4e2d\u7684 Docker \u5bb9\u5668\n 2\uff09\u7f3a\u5c11 uos \u5bb9\u5668\uff0c\u68c0\u67e5 USB \u4e32\u53e3\u8fde\u63a5\u7ebf\u548c\u91c7\u96c6\u76d2\u8fde\u63a5\u7ebf\u662f\u5426\u6b63\u5e38\uff0c\u91cd\u542f\u540e\u6267\u884c bash install/setup.up # \u91cd\u65b0\u5b8c\u6574\u90e8\u7f72\u73af\u5883\n \u6216\u6267\u884c sudo docker-compose up -d --build # \u4ec5\u91cd\u65b0\u6784\u5efa Docker \u955c\u50cf\n 3\u3001\u82e5\u90e8\u7f72\u65f6\u63d0\u793a\u6302\u8f7d ttyACM0\u3001video0 \u5931\u8d25\uff0c\u8bf7\u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u53ca\u91c7\u96c6\u76d2\u662f\u5426\u63a5\u89e6\u826f\u597d\uff0c\u82e5\u63a5\u89e6\u826f\u597d\uff0c\u91cd\u542f\u5373\u53ef\u89e3\u51b3\u3002 4\u3001\u82e5\u51fa\u73b0\u56fe\u7247\u80fd\u8bc6\u522b\uff0c\u4f46\u662f\u9f20\u6807\u672a\u79fb\u52a8\u64cd\u4f5c\u65f6\uff0c\u5b89\u88c5\u7edd\u5bf9\u9f20\u6807\u64cd\u4f5c\u7684\u4f9d\u8d56\u5305\uff0c\u89c1\u7b2c\u4e09\u8282\u7b2c\u4e8c\u5c0f\u8282\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u6d4b\u8bd5\u673a\u3002 5\u3001\u7531\u4e8e\u901a\u8fc7\u91c7\u96c6\u5361\u83b7\u53d6\u7684\u6d4b\u8bd5\u673a\u5b9e\u65f6\u753b\u9762\uff0c\u5305\u542b\u4e86\u9f20\u6807\u7684\u6837\u5f0f\uff0c\u6240\u4ee5\u5bf9\u56fe\u7247\u8bc6\u522b\u65f6\uff0c\u9f20\u6807\u82e5\u505c\u7559\u5728\u56fe\u6807\u4e0a\u5c42\uff0c\u5219\u4f1a\u5bf9\u8bc6\u522b\u7ed3\u679c\u9020\u6210\u5f71\u54cd\uff0c\u9700\u8981\u5c06\u9f20\u6807\u79fb\u52a8\u81f3\u5176\u4ed6\u4f4d\u7f6e\uff0c\u6216\u8005\u9690\u85cf\u9f20\u6807\u89e3\u51b3\u3002 6\u3001Excel \u62a5\u544a\u4e2d\uff0c\u6d4b\u8bd5\u573a\u666f\u5217\u4e0e\u7528\u4f8b\u4e2d\u7684\u4e0d\u4e00\u81f4\uff0c\u5173\u952e\u5b57scene\u3001app_name\u3001\u67b6\u6784\u522b\u540d\uff0c\u4e0d\u80fd\u5305\u542b\u4e0b\u5212\u7ebf\u548c\u82f1\u6587\u7b26\u53f7\u7684\u5706\u62ec\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/","title":"\u6846\u67b6\u529f\u80fd\u4ecb\u7ecd","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2023/1/12\n# Author : Mikigo\n# =============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_2","title":"\u4e00\u3001\u4e00\u53e5\u8bdd\u7b80\u4ecb","text":"\u6b64\u6587\u6863\u4e3b\u8981\u60f3\u5bf9 YouQu \u6846\u67b6\u4e00\u4e9b\u91cd\u70b9\u7684\u529f\u80fd\u505a\u8be6\u7ec6\u7684\u4ecb\u7ecd\uff0c\u5305\u62ec\u5bf9\u4e00\u4e9b\u529f\u80fd\u5f00\u53d1\u7684\u80cc\u666f\u3001\u8981\u89e3\u51b3\u7684\u95ee\u9898\u3001\u5b9e\u73b0\u903b\u8f91\u3001\u4ee3\u7801\u7b49\u65b9\u9762\u7684\u4ecb\u7ecd\uff0c\u4ee5\u6b64\u8ba9\u5927\u5bb6\u80fd\u66f4\u52a0\u6e05\u6670\u7684\u7406\u89e3\u5404\u9879\u529f\u80fd\uff0c\u4ece\u800c\u5728\u4f7f\u7528\u7684\u65f6\u5019\u80fd\u66f4\u52a0\u7684\u5f97\u5fc3\u5e94\u624b\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_3","title":"\u4e8c\u3001\u56fe\u50cf\u8bc6\u522b","text":"\u56fe\u50cf\u8bc6\u522b\u5728 UI \u81ea\u52a8\u5316\u4e2d\u662f\u4e0d\u53ef\u7f3a\u5c11\u7684\uff0c\u5e02\u9762\u4e0a\u751a\u81f3\u6709\u5b8c\u5168\u57fa\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\uff0c\u6bd4\u5982 Airtest\u3001Sikuli \u7b49\uff0c\u5728\u6e38\u620f\u7b49\u7279\u5b9a\u9886\u57df\u4e5f\u6709\u4e0d\u9519\u7684\u6548\u679c\uff0c\u8fd9\u4e9b\u5de5\u5177\u5b9e\u9645\u4e0a\u4e5f\u662f\u7528\u7684 OpenCV \u8fdb\u884c\u4e86\u5c01\u88c5\uff0cYouQu \u6846\u67b6\u57fa\u4e8e OpenCV \u5f00\u53d1\u4e86\u81ea\u5df1\u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\uff0c\u5b83\u53ef\u4ee5\u65b9\u4fbf\u7684\u7528\u4e8e\u754c\u9762\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u65ad\u8a00\uff1b YouQu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u51e0\u4e4e\u6ee1\u8db3\u4e86\u4f60\u7684\u6240\u6709\u8981\u6c42\uff0c\u6211\u4eec\u5728\u957f\u65f6\u95f4\u7684\u601d\u8003\u548c\u6478\u7d22\u4e2d\uff0c\u9488\u5bf9\u5e38\u89c4\u573a\u666f\u53ca\u4e00\u4e9b\u7279\u6b8a\u573a\u666f\u63a2\u7d22\u9664\u4e86\u4e00\u4e9b\u5b9e\u7528\u4e14\u6709\u6548\u7684\u65b9\u6848\uff0c\u4e14\u542c\u6211\u6162\u6162\u9053\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1","title":"1\u3001\u5e38\u89c4\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5e38\u89c4\u8bc6\u522b\u5f88\u597d\u7406\u89e3\uff0c\u4e00\u53e5\u8bdd\u8bb2\u5c31\u662f\uff0c\u8981\u83b7\u53d6\u5230\u76ee\u6807\u5143\u7d20\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u3002 \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u5728\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u9700\u8981\u83b7\u53d6\u7684\u5750\u6807\u662f\u76f8\u5bf9\u4e8e\u6574\u4e2a\u5c4f\u5e55\u7684\u5750\u6807\uff0c\u6211\u4eec\u53ef\u4ee5\u622a\u53d6\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u56fe\u7247\uff08screen\uff09\uff1b \u5728\u5143\u7d20\u8bc6\u522b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u622a\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5c0f\u56fe\u8fdb\u884c\u8bc6\u522b\uff0c\u6bd4\u5982\u622a\u53d6\u64ad\u653e\u6309\u94ae\uff1a \u90a3\u4e48\u5b9e\u9645\u4e0a\uff0c\u5143\u7d20\u5b9a\u4f4d\u7684\u95ee\u9898\u5c31\u8f6c\u6362\u4e3a\uff0c\u5c06\u622a\u56fe\u7684\u5c0f\u56fe\uff08play_btn\uff09\u62ff\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u5927\u56fe\uff08screen\uff09\u4e2d\u53bb\u505a\u5339\u914d\uff0c\u5982\u679c\u5339\u914d\u6210\u529f\uff0c\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff08 x, y \uff09\u5373\u53ef\u3002 \u4e3a\u4e86\u65b9\u4fbf\u63cf\u8ff0\uff0c\u4ee5\u4e0b\u6211\u5c06\u6574\u4e2a\u5c4f\u5e55\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5927\u56fe\uff0c\u67d0\u4e2a\u5143\u7d20\u56fe\u7247\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5c0f\u56fe\u3002 \u57fa\u4e8e OpenCV \u7684\u6a21\u677f\u5339\u914d cv.matchTemplate() \u529f\u80fd\uff0c\u6211\u4eec\u5b9e\u73b0\u4e86\u56fe\u50cf\u5b9a\u4f4d\u7684\u529f\u80fd\uff0c\u6846\u67b6\u63d0\u4f9b\u4e86\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u5e95\u5c42\u63a5\u53e3\uff08\u4e00\u822c\u4e0d\u5bf9\u4e0a\u5c42\u63d0\u4f9b\u8c03\u7528\uff09\uff1a def _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\n# \u8be6\u7ec6\u4ee3\u7801\u592a\u957f\u4e0d\u8d34\u4e86\uff0c\u611f\u5174\u8da3\u8bf7\u67e5\u770b\u6e90\u7801\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001image_path image_path \u662f\u5c0f\u56fe\u7684\u7edd\u5bf9\u8def\u5f84; \u901a\u5e38\u5728 AT \u5de5\u7a0b\u91cc\u9762\uff0c\u6211\u4eec\u7ea6\u5b9a\u5c06\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u5b9e\u9645\u7684\u5143\u7d20\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1aplay_btn.png \uff1b \u7528\u4e8e\u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 case/assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1amusic_001.png \uff1b \u8fd9\u6837\u662f\u4e3a\u4e86\u65b9\u4fbf\u7ba1\u7406\u548c\u7ef4\u62a4\u3002 2\u3001rate \u56fe\u50cf\u8bc6\u522b\u7684\u7684\u5339\u914d\u5ea6\u6216\u8005\u8bf4\u76f8\u4f3c\u5ea6\uff0c\u6846\u67b6\u9ed8\u8ba4\u7684\u914d\u7f6e\u4e3a 0.9\uff0c\u4e5f\u5c31\u662f\u8bf4\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u5b58\u5728\u4e00\u4e2a\u76f8\u4f3c\u5ea6 90% \u7684\u56fe\u6807\u5373\u8fd4\u56de\u5176\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff1b \u5982\u679c\u4f60\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u8c03\u6574\u8bc6\u522b\u5ea6\uff0c\u4f60\u53ef\u4ee5\u5728\u8c03\u7528\u51fd\u6570\u7684\u65f6\u5019\uff0c\u4f20\u5165\u4e0d\u540c\u7684\u8bc6\u522b\u5ea6\u7684\u503c\u3002 3\u3001multiple \u9ed8\u8ba4\u60c5\u51b5\u4e0b multiple=False\uff0c\u8868\u793a\u53ea\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u7b2c\u4e00\u4e2a\uff0c\u5982\u679c multiple=True \u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\uff0c\u56e0\u4e3a\u5927\u56fe\u4e2d\u53ef\u80fd\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u5c0f\u56fe\uff0c\u5728\u67d0\u4e9b\u573a\u666f\u4e0b\u4f60\u53ef\u80fd\u9700\u8981\u5168\u90e8\u83b7\u53d6\u5230\u6240\u6709\u5339\u914d\u5230\u7684\u5750\u6807\u3002 4\u3001picture_abspath \u9ed8\u8ba4\u60c5\u51b5\u4e0b picture_abspath=None \u8868\u793a\u5927\u56fe\u4e3a\u622a\u53d6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u5982\u679c\u4f60\u4e0d\u5e0c\u671b\u5927\u56fe\u662f\u5c4f\u5e55\u7684\u622a\u56fe\uff0c\u800c\u662f\u4f60\u81ea\u5b9a\u4e49\u4f20\u5165\u7684\u67d0\u4e2a\u56fe\u7247\uff0c\u4f60\u53ea\u9700\u8981\u5c06\u4f60\u7684\u56fe\u7247\u8def\u5f84\u4f20\u9012\u7ed9\u8fd9\u4e2a\u53c2\u6570\u5c31\u884c\uff0c\u6bd4\u5982\uff1a picture_abspath=\"~/Desktop/big.png\" \uff1b 5\u3001screen_bbox \u5927\u56fe\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u622a\u53d6\u6574\u4e2a\u5c4f\u5e55\uff0cscreen_bbox = [x, y, w, h] \u53ef\u4ee5\u6307\u5b9a\u622a\u53d6\u5c4f\u5e55\u4e2d\u7684\u56fa\u5b9a\u533a\u57df\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\uff0c\u53ef\u4ee5\u6392\u9664\u90e8\u5206\u533a\u57df\u5bf9\u8bc6\u522b\u7ed3\u679c\u7684\u5f71\u54cd\u3002 \u3010\u9690\u5f0f\u7b49\u5f85\u3011 \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\uff0c\u6709\u65f6\u5019\u9875\u9762\u8df3\u8f6c\u6709\u5ef6\u65f6\uff0c\u6709\u53ef\u80fd\u5b58\u5728\u8bc6\u522b\u7684\u90a3\u4e00\u523b\u9875\u9762\u4e5f\u6ca1\u6709\u8df3\u8f6c\u51fa\u6765\uff0c\u6216\u8005\u6216\u8005\u8bc6\u522b\u7684\u90a3\u4e00\u523b\uff1b \u56e0\u6b64\u6211\u4eec\u9700\u8981\u4e00\u79cd\u7b49\u5f85\u673a\u5236\uff0c\u5373\u5728\u4e00\u5b9a\u7684\u65f6\u95f4\u5185\uff0c\u5982\u679c\u8bc6\u522b\u4e0d\u5230\uff0c\u91cd\u590d\u53bb\u8bc6\u522b\uff1a def find_image(\ncls,\n*widget, rate: [float, int] = None,\nmultiple: bool = False,\nmatch_number: int = None,\npicture_abspath: str = None,\nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u5728\u5c4f\u5e55\u4e2d\u533a\u5bfb\u627e\u5c0f\u56fe\uff0c\u8fd4\u56de\u5750\u6807\uff0c\n \u5982\u679c\u627e\u4e0d\u5230\uff0c\u6839\u636e\u914d\u7f6e\u91cd\u8bd5\u6b21\u6570\uff0c\u6bcf\u6b21\u95f4\u96941\u79d2\n :param widget: \u6a21\u677f\u56fe\u7247\u8def\u5f84\n :param rate: \u76f8\u4f3c\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param match_number: \u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\n :return: \u5750\u6807\u5143\u7ec4\n \"\"\"\nif rate is None:\nrate = float(GlobalConfig.IMAGE_RATE)\ntry:\nfor element in widget:\nfor _ in range((match_number or int(GlobalConfig.IMAGE_MATCH_NUMBER)) + 1):\nlocate = cls._match_image_by_opencv(\nelement,\nrate,\nmultiple=multiple,\npicture_abspath=picture_abspath,\nscreen_bbox=screen_bbox\n)\nif not locate:\nsleep(int(GlobalConfig.IMAGE_MATCH_WAIT_TIME))\nelse:\nreturn locate\nraise TemplateElementNotFound(*widget)\nexcept Exception as e:\nraise e\n \u53c2\u6570 match_number \u7528\u4e8e\u63a7\u5236\u91cd\u590d\u8bc6\u522b\u7684\u6b21\u6570\uff0c\u9ed8\u8ba4\u4e0d\u4f20\u53c2\uff0c\u53d6\u5168\u5c40\u914d\u7f6e setting/globalconfig.ini \u91cc\u9762\u7684 IMAGE_MATCH_NUMBER \u914d\u7f6e\u9879\u7684\u503c\uff0c\u9ed8\u8ba4IMAGE_MATCH_NUMBER = 1\uff0c\u5373\u91cd\u8bd5 1 \u6b21\uff1b find_image \u662f\u6846\u67b6\u63d0\u4f9b\u7684\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u51fd\u6570\u63a5\u53e3\uff0c\u8fd9\u4e2a\u51fd\u6570\u63d0\u4f9b\u4e86\u9690\u5f0f\u7b49\u5f85\u7684\u529f\u80fd\uff0c\u4e14\u5305\u542b\u4e0a\u9762\u4ecb\u7ecd\u7684 _match_image_by_opencv \u51fd\u6570\u7684\u6240\u6709\u529f\u80fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2","title":"2\u3001\u6c14\u6ce1\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u6c14\u6ce1\u8bc6\u522b\u6307\u7684\u662f\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\u8981\u5b9a\u4f4d\u7684\u5143\u7d20\u662f\u4e00\u4e9b\u4f1a\u6d88\u5931\u7684\u5c0f\u5f39\u7a97\uff0c\u8fd9\u7c7b\u573a\u666f\u5728\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\u5c31\u53ef\u80fd\u5b58\u5728\u4e0d\u7a33\u5b9a\u6027\uff0c\u6709\u53ef\u80fd\u56fe\u50cf\u8bc6\u522b\u7684\u65f6\u5019\u6c14\u6ce1\u5df2\u7ecf\u6d88\u5931\u4e86\uff0c\u4e5f\u6709\u53ef\u80fd\u6c14\u6ce1\u51fa\u73b0\u7684\u65f6\u95f4\u592a\u77ed\u4e86\uff0c\u4e0d\u5bb9\u6613\u6355\u6349\u5230\uff0c\u5c31\u50cf\u6c14\u6ce1\u4e00\u6837\uff0c\u51fa\u73b0\u4e00\u4e0b\u5c31\u6d88\u5931\uff0c\u56e0\u6b64\u6211\u4eec\u5f62\u8c61\u7684\u79f0\u4e4b\u4e3a \u201c\u6c14\u6ce1\u8bc6\u522b\u201d\uff1b \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u4e3a\u4e86\u80fd\u7a33\u5b9a\u7684\u8bc6\u522b\u6c14\u6ce1\u7c7b\u573a\u666f\uff0c\u6211\u4eec\u91c7\u7528\u7684\u65b9\u6848\u662f\uff1a \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\uff08\u5305\u542b\u6c14\u6ce1\u4ece\u51fa\u73b0\u5230\u6d88\u5931\uff09\uff0c\u4e0d\u505c\u7684\u622a\u53d6\u8fd9\u6bb5\u65f6\u95f4\u5185\u7684\u5927\u56fe\uff0c\u4ee5\u6b64\u786e\u4fdd\u5728\u622a\u53d6\u7684\u4e00\u5806\u56fe\u7247\u4e2d\uff0c\u80af\u5b9a\u6709\u81f3\u5c11\u4e00\u5f20\u56fe\u7247\u80fd\u6355\u6349\u5230\u6c14\u6ce1\uff0c\u6700\u540e\u518d\u5bf9\u8fd9\u4e00\u5806\u56fe\u7247\u9010\u4e2a\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def get_during(\ncls,\nimage_path: str,\nscreen_time: [float, int],\nrate: float = None,\npause: [int, float] = None,\nmax_range: int = 10000\n):\n\"\"\"\n \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u622a\u56fe\u591a\u5f20\u56fe\u7247\u8fdb\u884c\u8bc6\u522b\uff0c\u5176\u4e2d\u6709\u4e00\u5f20\u56fe\u7247\u8bc6\u522b\u6210\u529f\u5373\u8fd4\u56de\u7ed3\u679c;\n \u9002\u7528\u4e8e\u6c14\u6ce1\u7c7b\u7684\u65ad\u8a00\uff0c\u6bd4\u5982\u6c14\u6ce1\u57281\u79d2\u5185\u6d88\u5931\uff0c\u5982\u679c\u7528\u5e38\u89c4\u7684\u56fe\u50cf\u8bc6\u522b\u5219\u6709\u53ef\u80fd\u65e0\u6cd5\u8bc6\u522b\u5230\uff1b\n :param image_path: \u8981\u8bc6\u522b\u7684\u6a21\u677f\u56fe\u7247\uff1b\n :param screen_time: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff1b\n :param rate: \u8bc6\u522b\u7387\uff1b\n :param pause: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u4e0d\u95f4\u9694\uff1b\n :param max_range: \u622a\u56fe\u7684\u6700\u5927\u6b21\u6570\uff0c\u8fd9\u662f\u4e00\u4e2a\u9884\u8bbe\u503c\uff0c\u4e00\u822c\u60c5\u51b5\u4e0b\u4e0d\u6d89\u53ca\u4fee\u6539\uff1b\n \"\"\"\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001screen_time \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5728\u6b64\u65f6\u95f4\u5185\u4f1a\u4e0d\u65ad\u7684\u8fdb\u884c\u622a\u56fe\u64cd\u4f5c\uff0c\u5c31\u50cf\u5f55\u5236\u89c6\u9891\u4e00\u6837\uff1b 2\u3001pause \u6bcf\u6b21\u622a\u53d6\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u4e00\u523b\u4e0d\u505c\u7684\u622a\u56fe\uff0c\u5982\u679c\u4f60\u60f3\u6bcf\u6b21\u622a\u56fe\u5b58\u5728\u4e00\u4e9b\u95f4\u9694\u65f6\u95f4\u4f20\u5165\u5bf9\u5e94\u7684\u65f6\u95f4\u95f4\u9694\u5373\u53ef\uff0c\u5355\u4f4d\u662f\u79d2\uff0c\u6bd4\u5982\uff1apause = 0.03\uff0c\u8868\u793a 30 ms\uff0c\u76f8\u5f53\u4e8e\u5e27\u7387\u4e3a 30 \u5e27\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-opencv","title":"3\u3001\u4e0d\u4f9d\u8d56 OpenCV \u7684\u56fe\u50cf\u8bc6\u522b\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31","title":"3.1\u3001\u81ea\u7814\u56fe\u50cf\u8bc6\u522b\u6280\u672f","text":"\u3010\u539f\u7406\u3011 \u4e3a\u4e86\u5b9e\u73b0\u8bc6\u522b\u56fe\u50cf\u7684\u76ee\u7684\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u5c06\u56fe\u7247\u7684\u6bcf\u4e2a\u50cf\u7d20\u7684RGB\u503c\uff0c\u4e0e\u6574\u4e2a\u5c4f\u5e55\u4e2d\u7684RGB\u8fdb\u884c\u5bf9\u6bd4\uff0c\u5982\u679c\u5c0f\u56fe\u4e0a\u7684RGB\u503c\u4e0e\u5bf9\u5e94\u5927\u56fe\u4f4d\u7f6e\u7684RGB\u90fd\u76f8\u7b49\uff0c\u5219\u5339\u914d\u6210\u529f\uff0c\u5373\u53ef\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u70b9\u3002 1\u3001\u8bfb\u53d6\u5c0f\u56fe\u548c\u5927\u56fe\u7684RGB\u503c \uff081\uff09\u5c0f\u56fe\u7684RGB\u503c small_data = small_pic.load() # load()\u4f1a\u5c06\u56fe\u7247\u7684RGB\u503c\u83b7\u53d6\u5230\uff0c\u6570\u636e\u683c\u5f0f\u4e3a\u4e00\u4e2a\u4e8c\u7ef4\u5217\u8868\uff0c\u8d4b\u503c\u7ed9\u4e00\u4e2a\u53d8\u91cfsmall_data\u3002\n \uff082\uff09\u5927\u56fe\u7684RGB\u503c big_data = big_pic.load()\n 2\u3001\u5c06\u5c0f\u56fe\u4e0e\u5927\u56fe\u7684RGB\u503c\u8fdb\u884c\u5339\u914d \uff081\uff09\u5339\u914d\u4ece\u5927\u56fe\u7684\u5750\u6807\uff080\uff0c0\uff09\u5f00\u59cb\u5339\u914d\uff0c\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff082\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\uff080\uff0c0\uff09\u5bf9\u5e94\u7684\u6240\u6709\u5c0f\u56fe\u7684RGB\u503c\u4e0d\u76f8\u7b49\uff0c\u5219\u79fb\u52a8\u5230\u4e0b\u4e00\u4e2a\u5750\u6807\u70b9\uff081\uff0c0\uff09\uff0c\u540c\u6837\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff083\uff09\u6309\u7167\u8fd9\u6837\u7684\u89c4\u5f8b\u5c06\u8fd9\u4e00\u884c\u6bcf\u79fb\u52a8\u4e00\u4e2a\u5750\u6807\u70b9\uff0c\u90fd\u5c06\u5c0f\u56fe\u6240\u6709\u7684RGB\u4e0e\u5bf9\u5e94\u5927\u56fe\u7684\u503c\u8fdb\u884c\u5339\u914d\uff1b \uff084\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\u5176\u4e2d\u4e00\u4e2a\u5750\u6807\u70b9\u4e0a\u5339\u914d\u5230\u4e86\u5c0f\u56fe\u7684\u6240\u6709RGB\u503c\uff0c\u5219\u6b64\u65f6\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\u70b9\uff1b \uff085\uff09\u5982\u679c\u5339\u914d\u4e86\u5927\u56fe\u6240\u6709\u7684\u5750\u6807\u70b9\uff0c\u90fd\u6ca1\u6709\u5339\u914d\u5230\uff0c\u5219\u8bf4\u660e\u5927\u56fe\u4e2d\u4e0d\u5b58\u5728\u5c0f\u56fe\uff0c\u5339\u914d\u5931\u8d25\uff1b \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 class ImageRgb:\n@staticmethod\ndef _check_match(_x, _y, small, bdata, sdata, rate):\n\"\"\"\n Matching degree of small graph and large graph matching\n \"\"\"\n@staticmethod\ndef _pre_random_point(small):\n\"\"\"\n Pre matching, take 10-20 points at random each time,\n and take coordinates randomly in the small graph\n \"\"\"\n@staticmethod\ndef _pre_random_match(_x, _y, point_list, bdata, sdata, rate):\n\"\"\"\n In the small graph, several points are randomly\n selected for matching, and the matching degree is\n also set for the random points\n \"\"\"\n@classmethod\ndef match_image_by_rgb(cls, image_name=None, image_path=None, rate=0.9):\n\"\"\"\n By comparing the RGB values of the small image with the large\n image on the screen, the coordinates of the small image on\n the screen are returned.\n \"\"\"\n \u901a\u8fc7 match_image_by_rgb() \u8fd9\u4e2a\u51fd\u6570\uff0c\u4f20\u5165\u76ee\u6807\u5c0f\u56fe\u7684\u6587\u4ef6\u540d\u79f0\uff0c\u5373\u53ef\u8fd4\u56de\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u3002 \u6709\u540c\u5b66\u8981\u95ee\u4e86\uff0c\u6709 OpenCV \u5e72\u561b\u4e0d\u7528\uff0c\u6709\u5fc5\u8981\u81ea\u5df1\u5b9e\u73b0\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u529f\u80fd\u5417\uff0c\u4f60\u4eec\u662f\u4e0d\u662f\u95f2\u7684\u554a\uff1f \u8fd9\u4e48\u95ee\u7684\u8bdd\uff0c\u5c0f\u4e86\uff0c\u683c\u5c40\u5c0f\u4e86\uff1b\u6211\u4eec\u81ea\u5df1\u5b9e\u73b0\u4e3b\u8981\u6709\u51e0\u65b9\u9762\u539f\u56e0\uff1a \u51cf\u5c11\u73af\u5883\u4f9d\u8d56\uff0c\u5373\u4e0d\u7528\u5b89\u88c5 OpenCV\uff0c\u6211\u4eec\u4e5f\u80fd\u5b9e\u73b0\u5176\u529f\u80fd\uff0c\u73af\u5883\u4f9d\u8d56\u8fd9\u5757\u540e\u9762\u4f1a\u5355\u72ec\u8be6\u7ec6\u8bb2\uff0c\u51cf\u5c11\u73af\u5883\u4f9d\u8d56\u5bf9\u4e8e\u4efb\u4f55\u8f6f\u4ef6\u5de5\u7a0b\u90fd\u975e\u5e38\u91cd\u8981\uff1b OpenCV \u5728\u5176\u4ed6\u56fd\u4ea7 CPU \u67b6\u6784\u4e0a\u5b89\u88c5\u5e76\u4e0d\u80fd\u4fdd\u8bc1100%\u6210\u529f\uff0c\u751a\u81f3\u6709\u6ca1\u6709\u53ef\u80fd\u5728\u4e00\u4e9b\u67b6\u6784\u4e0a\u538b\u6839\u513f\u5c31\u4e0d\u80fd\u5b89\u88c5\u4f7f\u7528 OpenCV \uff1f \u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 OpenCV \uff1f\u5c31\u50cf\u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 Windows \u5462\uff1f\u8fd9\u4e9b\u95ee\u9898\u503c\u5f97\u601d\u8003\u3002 \u5f53\u7136\uff0c\u6211\u4eec\u627f\u8ba4\u8fd9\u5957\u65b9\u6848\uff0c\u867d\u7136\u8bc6\u522b\u51c6\u786e\u7387\u6ca1\u95ee\u9898\uff0c\u4f46\u5728\u8bc6\u522b\u6548\u7387\u4e0a\u8fd8\u6ca1\u6709\u8fbe\u5230 OpenCV \u6a21\u677f\u5339\u914d\u7684\u6548\u679c\uff0c\u6211\u4eec\u7684\u65b9\u6848\u6bcf\u6b21\u8bc6\u522b\u5728 1.5s \u5de6\u53f3\uff0c\u800c OpenCV \u5728 1s \u5de6\u53f3\uff1b \u6574\u4f53\u8bc6\u522b\u6548\u679c\u6765\u8bb2\uff0c\u6211\u8ba4\u4e3a\u8fd8\u662f\u53ef\u4ee5\u63a5\u53d7\u7684\uff0c\u4e5f\u5e0c\u671b\u6709\u5fd7\u4e4b\u58eb\u80fd\u4e00\u8d77\u4f18\u5316\u6b64\u65b9\u6848\uff0c\u4e00\u8d77\u6280\u672f\u62a5\u56fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32-rpc","title":"3.2\u3001\u57fa\u4e8e RPC \u670d\u52a1\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b","text":"\u5728\u8fdc\u7a0b\u670d\u52a1\u5668\u4e0a\u90e8\u7f72 OpenCV \u7684\u73af\u5883\uff0c\u5e76\u5c06\u5176\u90e8\u7f72\u4e3a RPC \u670d\u52a1\uff0c\u6d4b\u8bd5\u673a\u4e0a\u4e0d\u7528\u5b89\u88c5 OpenCV \u4f9d\u8d56\uff0c\u800c\u662f\u901a\u8fc7\u8bf7\u6c42 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u3010\u539f\u7406\u3011 \u6d4b\u8bd5\u673a\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u56fe\u7247\u4ee5\u53ca\u6a21\u677f\u56fe\u7247\uff0c\u53d1\u9001\u7ed9 RPC \u670d\u52a1\u7aef\uff0c\u670d\u52a1\u7aef\u62ff\u5230\u4e24\u5f20\u56fe\u7247\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u6700\u540e\u5c06\u8bc6\u522b\u7ed3\u679c\u8fd4\u56de\u7ed9\u6d4b\u8bd5\u673a\uff1b \u8981\u7279\u6b8a\u8bf4\u660e\u7684\u662f\uff1a RPC \u662f\u4e00\u79cd\u534f\u8bae\uff0c\u8bb8\u591a\u8bed\u8a00\u90fd\u662f\u652f\u6301\u7684\uff0c\u6bd4\u5982\u8bf4\u670d\u52a1\u7aef\u4e5f\u53ef\u4ee5\u7528 C++ \u6765\u5b9e\u73b0\uff0c\u5ba2\u6237\u7aef\u4f7f\u7528 Python \u4e5f\u662f\u53ef\u4ee5\u8c03\u7528\u7684\u3002 \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 \u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nimport cv2 as cv\nimport numpy as np\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\nif __name__ == \"__main__\":\nserver = ThreadXMLRPCServer((\"x.x.x.x\", 8889), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(match_image_by_opencv, \"match_image_by_opencv\")\nserver.serve_forever()\n \u8fd9\u6837\uff0c\u6211\u4eec\u57fa\u4e8e Python \u6807\u51c6\u5e93 xmlrpc \u642d\u5efa\u4e86\u4e00\u4e2a RPC \u670d\u52a1\u5668\uff0c\u6ce8\u518c\u4e86 image_put \u548c match_image_by_opencv \u4e24\u4e2a\u529f\u80fd\u63a5\u53e3\uff0c\u5728\u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u901a\u8fc7 IP \u548c\u7aef\u53e3\u8fdb\u884c RPC \u8bf7\u6c42\uff1b \u5ba2\u6237\u7aef\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from xmlrpc.client import Binary\nfrom xmlrpc.client import ServerProxy\nserver = ServerProxy(GlobalConfig.OPENCV_SERVER_HOST, allow_none=True)\nscreen_rb = open(screen, \"rb\")\ntemplate_rb = open(template_path, \"rb\")\ntry:\nscreen_path = server.image_put(Binary(screen_rb.read()))\nscreen_rb.close()\ntpl_path = server.image_put(Binary(template_rb.read()))\ntemplate_rb.close()\nreturn server.match_image_by_opencv(\ntpl_path, screen_path, rate, multiple\n)\nexcept OSError as exc:\nraise EnvironmentError(\nf\"RPC\u670d\u52a1\u5668\u94fe\u63a5\u5931\u8d25. {GlobalConfig.OPENCV_SERVER_HOST}\"\n) from exc\n \u901a\u8fc7\u8fd4\u56de server.match_image_by_opencv \u5c31\u83b7\u53d6\u4e86\u5728\u670d\u52a1\u7aef\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4","title":"4\u3001\u53f3\u952e\u83dc\u5355\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41","title":"4.1\u3001\u53f3\u952e\u83dc\u5355\u5b9a\u4f4d\u7684\u65b9\u6848\u53ca\u95ee\u9898","text":"\u53f3\u952e\u83dc\u5355\u7684\u5143\u7d20\u5b9a\u4f4d\u662f\u4e00\u4e2a\u96be\u70b9\uff0c\u8fc7\u53bb\u6211\u4eec\u8c03\u7814\u548c\u4f7f\u7528\u8fc7\u7684\u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u65b9\u6cd5\u6709 4 \u79cd\uff1a \u7b2c\u4e00\u79cd\uff1a\u6b65\u957f\u64cd\u4f5c\u6cd5 \u5728\u53f3\u952e\u83dc\u5355\u547c\u51fa\u6765\u4e4b\u540e\uff0c\u901a\u8fc7\u952e\u76d8\u7684 up\u3001down \u6309\u952e\uff0c\u8fdb\u884c\u9009\u62e9\u83dc\u5355\u9009\u62e9\uff0c\u9009\u4e2d\u76ee\u6807\u4e4b\u540e enter \u5373\u53ef\uff1b\u6bd4\u5982\uff1a\u5728\u684c\u9762\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\uff0c\u6309 1 \u6b21 down \uff0c\u4f1a\u51fa\u73b0\u4e0b\u56fe\uff1a \u7ee7\u7eed\u518d\u6309 2 \u6b21 down\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u518d\u6309 enter\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u5982\u6b64\uff0c\u201c\u6392\u5e8f\u65b9\u5f0f\u201d\u7684\u6b65\u957f\u4e3a 3\uff1b\u901a\u8fc7\u4f7f\u7528\u952e\u76d8\u4e0a\u4e0b\u952e\uff0c\u5c31\u5b9e\u73b0\u4e86\u5bf9\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\uff1b \u4f46\u662f\uff0c\u8fd9\u79cd\u65b9\u5f0f\u6709\u4e2a\u5f88\u70e6\u4eba\u7684\u95ee\u9898\uff0c\u5c31\u662f\u53f3\u952e\u83dc\u5355\u7684\u9009\u9879\u4f4d\u7f6e\u4e0d\u53ef\u80fd\u4e00\u76f4\u4e0d\u53d8\uff0c\u5728\u9700\u6c42\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\uff0c\u83dc\u5355\u9009\u9879\u7684\u53d8\u5316\u662f\u5f88\u5927\u7684\uff0c\u751a\u81f3\u6709\u4e9b\u5e94\u7528\u652f\u6301\u81ea\u5b9a\u4e49\u83dc\u5355\uff0c\u6bd4\u5982\u6587\u7ba1\u53f3\u952e\u83dc\u5355\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff1b \u4e5f\u5c31\u662f\u8bf4\u4f60\u5f97\u7ecf\u5e38\u53bb\u7ef4\u62a4\u83dc\u5355\u9009\u9879\u7684\u6b65\u957f\uff0c\u4e00\u4e2a\u9009\u9879\u73b0\u5728\u7684\u6b65\u957f\u662f 3\uff0c\u4e0b\u4e2a\u8fed\u4ee3\u53ef\u80fd\u5c31\u662f 4 \u6216\u8005 5\u3002 \u7b2c\u4e8c\u79cd\uff1a\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u6cd5 \u628a\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5355\u72ec\u622a\u56fe\u4fdd\u5b58\uff0c\u56fe\u7247\u4e2d\u4ec5\u5305\u542b\u4e00\u4e2a\u83dc\u5355\u9009\u9879\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u8fd9\u6837\uff0c\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5c31\u53ef\u4ee5\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u65b9\u5f0f\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u8fd9\u79cd\u65b9\u5f0f\u4e0d\u7528\u62c5\u5fc3\u83dc\u5355\u9009\u9879\u7684\u987a\u5e8f\u6216\u4f4d\u7f6e\uff0c\u4f46\u662f\u9700\u8981\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff0c\u4e14\u5bb9\u6613\u53d7\u5230\u5b57\u4f53 UI \u53d8\u66f4\u7c7b\u9700\u6c42\u7684\u5f71\u54cd\uff0c\u6bd4\u5982\uff1a\u5b57\u4f53\u5927\u5c0f\u3001\u5b57\u4f53\u95f4\u8ddd\u7b49\u7b49\u9700\u6c42\u53d8\u66f4\u90fd\u4f1a\u5f71\u54cd\uff0c\u6bcf\u6b21\u53d8\u66f4\u4e4b\u540e\u5c31\u9700\u8981\u8fdb\u884c\u5927\u91cf\u56fe\u7247\u8d44\u6e90\u7684\u91cd\u65b0\u622a\u56fe\u66ff\u6362\uff0c\u662f\u4e2a\u6bd4\u8f83\u9ebb\u70e6\u7684\u4e8b\u60c5\uff1b \u7b2c\u4e09\u79cd\uff1a\u76f8\u5bf9\u4f4d\u79fb\u6cd5 \u9f20\u6807\u70b9\u51fb\u53f3\u952e\u7684\u65f6\u5019\uff0c\u9f20\u6807\u7684\u5f53\u524d\u5750\u6807\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u7684\uff0c\u83dc\u5355\u9009\u9879\u7684\u5bbd\uff08 w \uff09\u4e00\u822c\u662f\u56fa\u5b9a\u7684\uff0c\u53d8\u5316\u7684\u662f\u83dc\u5355\u7684\u957f\u5ea6\uff08 h \uff09\uff0c\u53ef\u4ee5\u901a\u8fc7\u67d0\u4e2a\u9009\u9879\u76f8\u5bf9\u4e8e\u9f20\u6807\u7684\u8ddd\u79bb\u5728\u786e\u5b9a\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u901a\u8fc7\u7ef4\u62a4\u83dc\u5355\u9009\u9879\uff08\u76f8\u5bf9\u4f4d\u7f6e\uff09\u76f8\u5bf9\u4e8e\u9f20\u6807\u4f4d\u7f6e\u7684\u8ddd\u79bb\uff0c\u5373\u53ef\u8f7b\u677e\u8ba1\u7b97\u51fa\u83dc\u5355\u9009\u9879\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\u3002 \u4ece\u7406\u8bba\u4e0a\u6b64\u65b9\u6848\u662f\u53ef\u884c\u7684\uff0c\u4f46\u662f\u8fd9\u91cc\u4ecd\u7136\u5b58\u5728\u4e24\u4e2a\u4e25\u91cd\u7684\u95ee\u9898\uff1a \u83dc\u5355\u987a\u5e8f\u6539\u53d8\uff0c\u5bfc\u81f4\u76f8\u5bf9\u8ddd\u79bb\u6539\u53d8\uff0c\u800c\u4e14\u8ddd\u79bb\u662f\u901a\u8fc7\u50cf\u7d20\uff08px\uff09\u6765\u8868\u793a\u7684\uff0c\u4e0d\u60f3\u6b65\u957f\u90a3\u4e48\u53ea\u7ba1\uff0c\u6bcf\u6b21\u9700\u8981\u53bb\u91cf\u4e00\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u70b9\u9ebb\u70e6\uff1b \u9f20\u6807\u5728\u684c\u9762\u4e0d\u540c\u4f4d\u7f6e\u70b9\u51fb\u53f3\u952e\uff0c\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u4f4d\u7f6e\u662f\u4e0d\u540c\u7684\uff0c\u4e0a\u56fe\u7684\u83dc\u5355\u662f\u5728\u9f20\u6807\u7684\u5de6\u4e0b\u65b9\uff0c\u5982\u679c\u4f60\u79fb\u52a8\u9f20\u6807\u5230\u5c4f\u5e55\u56db\u8fb9\uff0c\u4f60\u4f1a\u53d1\u73b0\uff0c\u53f3\u952e\u83dc\u5355\u53ef\u80fd\u51fa\u73b0\u5728\u9f20\u6807\u7684\u56db\u4e2a\u65b9\u5411\uff0c\u4e5f\u5c31\u662f\u8bf4\u4f60\u9700\u8981\u6839\u636e\u9f20\u6807\u7684\u4e0d\u540c\u4f4d\u7f6e\u6765\u5224\u65ad\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u65b9\u5411\uff0c\u800c\u4e0d\u540c\u7684\u65b9\u5411\u4e0a\u8ba1\u7b97\u65b9\u6cd5\u662f\u4e0d\u540c\u7684\uff0c\u6bd4\u5982\uff1a\u53f3\u952e\u83dc\u5355\u5728\u9f20\u6807\u7684\u5de6\u4e0a\uff0c\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\u8ba1\u7b97\u65b9\u6cd5\u4e3a\uff08x - w / 2\uff0c y - h\uff09\uff0c\u8fd9\u6837\u7ef4\u62a4\u8d77\u6765\u53ef\u4ee5\u8bf4\u975e\u5e38\u590d\u6742\uff1b \u57fa\u4e8e\u4ee5\u4e0a\u4e24\u4e2a\u539f\u56e0\uff0c\u6211\u4eec\u5e76\u4e0d\u63a8\u8350\u8fd9\u79cd\u64cd\u4f5c\u65b9\u6848\u3002 \u7b2c\u56db\u79cd\uff1a\u5c5e\u6027\u5b9a\u4f4d \u6709\u540c\u5b66\u8bf4\u5e72\u561b\u4e0d\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u5462\uff0c\u5176\u5b9e\uff0c\u6211\u4eec\u6700\u5f00\u59cb\u60f3\u5230\u7684\u65b9\u6848\u5c31\u662f\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\uff0c\u4f46\u662f\u5728\u5c5e\u6027\u7684 DOM \u6811\u91cc\u600e\u4e48\u4e5f\u627e\u4e0d\u5230\uff0c\u65e0\u6cd5\u5b9a\u4f4d\u5230\uff0c\u6211\u4eec\u4e5f\u8054\u5408\u7814\u53d1\u540c\u5b66\u4e00\u8d77\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u4f46\u6700\u7ec8\u8fd8\u662f\u6ca1\u80fd\u89e3\u51b3\uff0c\u975e\u5e38\u9057\u61be\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42","title":"4.2\u3001\u6700\u65b0\u7684\u53f3\u952e\u83dc\u5355\u7ec8\u6781\u89e3\u51b3\u65b9\u6848","text":"\u7531\u4e8e\u53f3\u952e\u83dc\u5355\u9009\u9879\u51e0\u4e4e\u90fd\u662f\u6587\u672c\uff0c\u90a3\u4e48\u901a\u8fc7 OCR \u8bc6\u522b\uff0c\u51e0\u4e4e\u662f\u6700\u4f18\u7684\u65b9\u6848\uff1a \u4e0d\u7528\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff1b \u4e0d\u4f1a\u53d7\u5230\u83dc\u5355\u9009\u9879\u987a\u5e8f\u6539\u53d8\u7684\u5f71\u54cd\uff1b \u4e0d\u4f1a\u53d7\u5230\u5b57\u4f53 UI \u53d8\u5316\u7684\u5f71\u54cd\uff1b \u5173\u4e8e OCR \u8bc6\u522b\u6211\u4eec\u5728\u540e\u9762\u4f1a\u8be6\u7ec6\u8bb2\u5230\uff0c\u672c\u7ae0\u8282\u4e3b\u8981\u8bb2\u57fa\u4e8e OCR \u8bc6\u522b\uff0c\u6211\u4eec\u5728\u53f3\u952e\u83dc\u5355\u8bc6\u522b\u4e0a\u7684\u7a81\u7834\u548c\u521b\u65b0\uff1b \u4f7f\u7528 OCR \u8bc6\u522b\u53f3\u952e\u83dc\u5355\u867d\u7136\u5df2\u7ecf\u5f88\u5b8c\u7f8e\u4e86\uff0c\u4f46\u662f\u5728\u4e00\u4e9b\u60c5\u51b5\u4e0b\u4ecd\u7136\u5b58\u5728\u4e00\u70b9\u95ee\u9898\uff0c\u5c31\u662f\u5c4f\u5e55\u4e2d\u51fa\u73b0\u591a\u4e2a\u548c\u83dc\u5355\u9009\u9879\u6587\u5b57\u76f8\u540c\u7684\u6587\u5b57\u65f6\uff0c\u6bd4\u5982\u4e0b\u9762\u8fd9\u79cd\u60c5\u51b5\uff1a \u5c4f\u5e55\u6070\u597d\u51fa\u73b0\u4e86\u4e24\u4e2a\u201c\u590d\u5236\u201d\uff0c\u6b64\u65f6\u8981\u5b9a\u4f4d\u5230\u83dc\u5355\u4e2d\u7684 \u201c\u590d\u5236\u201d\uff0c\u5c31\u9700\u8981\u8fdb\u4e00\u6b65\u505a\u6570\u636e\u5904\u7406\uff0c\u6bd4\u5982\uff1aOCR \u8fd4\u56de 2 \u4e2a\u201c\u590d\u5236\u201d\u7684\u5750\u6807\uff0c\u7528\u4f8b\u91cc\u9762\u6765\u5224\u65ad\u7528\u54ea\u4e2a\uff0c\u4ece\u4e1a\u52a1\u4e0a\u5c06\u5904\u7406\u8d77\u6765\u6bd4\u8f83\u9ebb\u70e6\uff0c\u56e0\u4e3a\u4f60\u5f97\u660e\u786e\u77e5\u9053\u83dc\u5355\u5728\u5de6\u8fb9\u8fd8\u662f\u53f3\u8fb9\uff0c\u7136\u540e\u8fd9\u672c\u8eab\u5c31\u662f\u4e0d\u786e\u5b9a\u7684\uff1b \u600e\u4e48\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u5462\uff0c\u8fd9\u5c31\u8981\u8bf4\u9053\u672c\u7ae0\u7684\u4e3b\u9898\uff1a\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b\u3002 \u3010\u539f\u7406\u3011 \u5728\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u524d\u622a\u4e00\u5f20\u56fe\uff0c\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\u518d\u622a\u53d6\u4e00\u5f20\u56fe\uff0c\u4e24\u5f20\u56fe\u552f\u4e00\u53d8\u5316\u7684\u5c31\u662f\u53f3\u952e\u83dc\u5355\uff0c\u5c06\u5176\u4ed6\u76f8\u540c\u7684\u5730\u65b9\u90fd\u5c4f\u853d\u6389\uff0c\u53ea\u7559\u4e0b\u83dc\u5355\u754c\u9762\uff0c\u5982\u6b64\u5373\u53ef\u6d88\u9664\u5e72\u6270\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u5c06\u4e24\u79cd\u56fe\u505a\u524d\u540e\u5bf9\u6bd4\u63d0\u53d6\u53ef\u4ee5\u5f97\u5230\u8fd9\u6837\u7684\u56fe\uff1a \u4f60\u770b\uff0c\u901a\u8fc7\u524d\u540e\u56fe\u7247\u7684\u5bf9\u6bd4\uff0c\u5c06\u76f8\u540c\u7684\u90e8\u5206\u7ed9\u6d88\u9664\u6389\uff0c\u518d\u8fdb\u884c OCR \u8bc6\u522b\uff0c\u8fd9\u6837\u5c31\u4e0d\u4f1a\u6709\u5e72\u6270\u4e86\uff1b \u4ee3\u7801\u5b9e\u73b0\u8bf7\u67e5\u770b src/filter_image.py \uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def filter_image(action):\n\"\"\"\n \u5bf9\u6bd4\u52a8\u4f5c\u524d\u540e\u4e24\u5f20\u56fe\u7247\uff0c\u63d0\u53d6\u4e0d\u540c\u7684\u90e8\u5206\u751f\u6210\u4e00\u5f20\u65b0\u7684\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u65b0\u56fe\u7247\u7684\u8def\u5f84\n :param action: \u52a8\u4f5c\u51fd\u6570\u7684\u51fd\u6570\u5bf9\u8c61\n :return: \u65b0\u56fe\u7247\u7684\u8def\u5f84\n \"\"\"\n action \u662f\u9f20\u6807\u4e8b\u4ef6\uff0c\u56e0\u4e3a\u6b64\u7c7b\u573a\u666f\u4e0d\u4ec5\u4ec5\u5728\u53f3\u952e\u5b58\u5728\uff0c\u5355\u51fb\u3001\u53cc\u51fb\u7b49\u7b49\uff0c\u53ea\u8981\u64cd\u4f5c\u524d\u540e\u540e\u53d8\u5316\u7684\u90fd\u53ef\u4ee5\uff1a from src.mouse_key import MouseKey\naction = (\nMouseKey.click,\nMouseKey.right_click,\nMouseKey.double_click,\nMouseKey.move_to,\n)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5","title":"5\u3001\u52a8\u6001\u56fe\u50cf\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5728\u684c\u9762\u58c1\u7eb8\u5207\u6362\uff0c\u6216\u770b\u56fe\u3001\u76f8\u518c\u5207\u6362\u56fe\u7247\u7c7b\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u7531\u4e8e\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u662f\u4e0d\u56fa\u5b9a\u7684\uff08\u4e0d\u540c\u7248\u672c\u7684\u7cfb\u7edf\u58c1\u7eb8\u4e0d\u540c\u3001\u58c1\u7eb8\u987a\u5e8f\u4e0d\u540c\uff0c\u770b\u56fe\u76f8\u518c\u5728\u56fe\u7247\u8d44\u6e90\u4e0d\u4e00\u5b9a\u56fa\u5b9a\uff09\uff0c\u90a3\u4e48\u5728\u6d4b\u8bd5\u5207\u6362\u58c1\u7eb8\u6216\u8005\u5207\u6362\u56fe\u7247\u7684\u573a\u666f\u65f6\u5c31\u4f1a\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u4f60\u4e0d\u77e5\u9053\u9884\u671f\u662f\u5565\uff0c\u7528\u4f8b\u64cd\u4f5c\u52a8\u6001\u7684\uff0c\u4e5f\u662f\u6781\u4e0d\u7a33\u5b9a\u3002 \u3010\u539f\u7406\u3011 \u5728\u5207\u6362\u56fe\u7247\u4e4b\u524d\u622a\u56fe\u4fdd\u5b58\u5e76\u8fd4\u56de\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u6b21\u8bc6\u522b\u8fd9\u5f20\u56fe\u7247\uff0c\u5982\u679c\u4e0d\u5b58\u5728\uff0c\u8bf4\u660e\u56fe\u7247\u5df2\u7ecf\u5207\u6362\u4e86\uff1b \u793a\u610f\u56fe\uff1a \u8fd9\u6837\uff0c\u6211\u4eec\u622a\u53d6\u4e86\u5f53\u524d\u56fe\u7247\u4e2d\u6bd4\u8f83\u6709\u4ee3\u8868\u6027\u7684\u4f4d\u7f6e\uff08\u4e00\u53ea\u9e1f\uff09\uff0c\u5728\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u7528\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1a \u6211\u4eec\u518d\u62ff\u7740\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd9\u6837\u5728\u5f53\u524d\u56fe\u7247\u4e2d\uff0c\u5c31\u4e0d\u80fd\u627e\u5230\u8fd9\u53ea\u9e1f\u4e86\uff0c\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u662f False\uff0c\u90a3\u4e48\u4e5f\u5c31\u53ef\u4ee5\u5224\u65ad\u56fe\u7247\u5207\u6362\u662f\u6210\u529f\u7684\u3002 \u4ee3\u7801\u793a\u610f\uff1a def save_temporary_picture(_x: int, _y: int, width: int, height: int):\n\"\"\"\n \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u56fe\u7247\u8def\u5f84\n :param x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n :param y: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n :param width: \u5bbd\u5ea6\n :param height: \u9ad8\u5ea6\n :return: \u56fe\u7247\u8def\u5f84\n \"\"\"\n \u6b64\u51fd\u6570\u7528\u4e8e\u5728\u64cd\u4f5c\u4e4b\u524d\u622a\u56fe\u4e00\u5f20\u4e34\u65f6\u56fe\u7247\uff0c\u8fd4\u56de\u56fe\u7247\u8def\u5f84\uff0c\u6700\u540e\u5728\u65ad\u8a00\u7684\u65f6\u5019\u518d\u5c06\u56fe\u7247\u8def\u5f84\u4f5c\u4e3a\u53c2\u6570\u4f20\u5165\u65ad\u8a00\u8bed\u53e5\u5373\u53ef\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ui","title":"\u4e09\u3001\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_1","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u662f\u6211\u4eec\u81ea\u7814\u7684\u4e00\u79cd\u4f7f\u7528\u7b80\u5355\uff0c\u4e14\u6548\u7387\u6781\u9ad8\u3001\u7a33\u5b9a\u6027\u597d\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u57fa\u4e8e\u5143\u7d20\u6309\u94ae\u5728\u5e94\u7528\u4e2d\u7684\u76f8\u5bf9\u4f4d\u7f6e\uff0c\u52a8\u6001\u83b7\u53d6\u5143\u7d20\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff0c\u9002\u7528\u4e8e\u5404\u79cd\u5c4f\u5e55\u5206\u8fa8\u7387\uff08\u5305\u62ec\u9ad8\u5206\u5c4f\u3001\u5bbd\u5c4f\u3001\u5e26\u9c7c\u5c4f\uff09\uff0c\u5f53\u5143\u7d20\u6309\u94ae\u4f4d\u7f6e\u76f8\u5bf9\u4e8e\u5e94\u7528\u754c\u9762\u4f4d\u7f6e\u53d1\u751f\u4fee\u6539\u4e4b\u540e\uff0c\u53ea\u9700\u8981\u6839\u636e UI \u8bbe\u8ba1\u56fe\u4e0a\u7684\u6e90\u6570\u636e\u4fee\u6539\u5bf9\u5e94\u5750\u6807\u6570\u636e\u5c31\u597d\uff0c\u7ef4\u62a4\u975e\u5e38\u7684\u65b9\u4fbf\u3002 \u6b64\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u9002\u7528\u4e8e\u4e00\u4e9b\u5143\u7d20\u4f4d\u7f6e\u76f8\u5bf9\u4e0e\u5e94\u7528\u754c\u9762\u6bd4\u8f83\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u97f3\u4e50\uff0899% \u7684\u5143\u7d20\u5b9a\u4f4d\u91c7\u7528\u8fd9\u79cd\uff0c\u6548\u679c\u975e\u5e38\u597d\uff09\uff0c\u4e0d\u9002\u7528\u4e8e\u754c\u9762\u4e0d\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u622a\u56fe\u5f55\u5c4f\uff0c\u5f88\u660e\u663e\u4e0d\u9002\u7528\u4e8e\u8fd9\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u3002\u8fd9\u79cd\u5168\u65b0\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u6709\u5b83\u7684\u9002\u7528\u6761\u4ef6\uff0c\u5982\u679c\u4f60\u53d1\u73b0\u4f7f\u7528\u5e38\u89c4\u7684\uff08\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u5b9a\u4f4d\uff09\u4e0d\u597d\u505a\u65f6\uff0c\u4e0d\u59a8\u8003\u8651\u4f7f\u7528\u8fd9\u79cd\uff0c\u5176\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff0c\u5e76\u4e14\u8fc5\u901f\u7231\u4e0a\u4ed6\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_1","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5728 UI \u8bbe\u8ba1\u56fe\u4e2d\u6211\u4eec\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u8fb9\u6846\u7684\u8ddd\u79bb\u7684\uff0c\u7136\u540e\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u6280\u672f\u624b\u6bb5\u83b7\u53d6\u5230\u5e94\u7528\u754c\u9762\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u53ca\u5e94\u7528\u7a97\u53e3\u7684\u5927\u5c0f\uff0c\u793a\u610f\u56fe\u5982\u4e0b\uff1a \uff08x1, y1\uff09\u4e3a\u5e94\u7528\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\uff1b\uff08x2, y2\uff09\u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u5de6\u4e0a\u89d2\uff08x1, y1\uff09\u7684\u5750\u6807\uff0c\u90a3\u4e48\u5b9e\u9645\u4e0a\u3010\u64ad\u653e\u6240\u6709\u3011\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\u4e3a\uff1a\uff08 x1 + x2, y1 + y2 \uff09\uff1b \u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5927\u5c0f\uff08w2, h2\uff09\uff0c\u53ef\u4ee5\u4ece UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\uff1b \u5728 UI \u8bbe\u8ba1\u7a3f\u4e0a\u70b9\u51fb\u3010\u64ad\u653e\u6240\u6709\u3011\u56fe\u6807\uff0c\u7136\u540e\u79fb\u52a8\u9f20\u6807\u5c31\u5c31\u53ef\u4ee5\u770b\u5230\u4e0a\u56fe\u7684\u53c2\u8003\u7ebf\u53ca\u6570\u636e\uff1b \u6240\u4ee5\uff0c\u6211\u4eec\u53ef\u4ee5\u8f7b\u677e\u7684\u83b7\u53d6\u5230\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u4e2d\u5fc3\u5750\u6807\u4e3a\uff1a\uff08 x1 + x2 + (w2 / 2), y1 + y2 + ( h2 / 2) \uff09 \u8be6\u7ec6\u6e90\u4ee3\u7801\u8bf7\u67e5\u770b AT \u57fa\u7840\u6846\u67b6: src/button_center.py \u83b7\u53d6\u5e94\u7528\u7a97\u53e3\u7684\u4fe1\u606f \u4f7f\u7528 xdotool \u548c xwininfo \u83b7\u53d6\u5230\u5e94\u7528\u7a97\u53e3\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u5de6\u4e0a\u89d2\uff09\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a app_id = CmdCtl.run_cmd(f\"xdotool search --classname --onlyvisible {self.app_name}\"\n).split(\"\\n\")\napp_id_list = [int(_id) for _id in app_id if _id]\nreturn CmdCtl.run_cmd(f\"xwininfo -id {app_id_list[self.number]}\")\n \u4f7f\u7528\u6b63\u5219\u83b7\u53d6\u7a97\u53e3\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u83b7\u53d6\u914d\u7f6e \u8bfb ini \u914d\u7f6e\u6587\u4ef6\uff0c\u83b7\u53d6\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e0e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a conf = ConfigParser()\nconf.read(self.config_path)\ndirection = conf.get(btn_name, \"direction\")\nposition = [int(i.strip()) for i in conf.get(btn_name, \"location\").split(\",\")]\n \u8ba1\u7b97\u5143\u7d20\u6309\u94ae\u5750\u6807 \u6839\u636e\u5e94\u7528\u7a97\u53e3\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u5927\u5c0f\u3001\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u5927\u5c0f\uff0c\u4f7f\u7528\u4e00\u5b9a\u7684\u7b97\u6cd5\u5373\u53ef\u8ba1\u7b97\u51fa\u5143\u7d20\u6309\u94ae\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u4e2d\u5fc3\u5750\u6807\uff09\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3","title":"3\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u3010\u914d\u7f6e\u65b9\u6cd5\u3011 \u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u7684\u6570\u636e\u6e90\u662f\u5e94\u7528\u5e93\u4e2d\u7684 ui.ini \u914d\u7f6e\u6587\u4ef6\uff1a ;section\n[\u65b0\u5efa\u6b4c\u5355+] ;key = value\ndirection = left_top\nlocation = 180, 268, 21, 21\n section \u662f\u4f60\u6839\u636e\u5bf9\u5e94\u7684\u5143\u7d20\u6309\u94ae\u547d\u540d\uff0c\u4f60\u53ef\u4ee5\u4efb\u610f\u547d\u540d\uff0c\u4f46\u6700\u597d\u6709\u5177\u4f53\u542b\u4e49\uff0c\u4e14\u80fd\u660e\u786e\u8868\u793a\u8fd9\u4e2a\u5143\u7d20\u6309\u94ae\u7684\u540d\u79f0\uff1b\u7528\u4e2d\u62ec\u53f7\u62ec\u8d77\u6765\u5c31\u884c\uff0c\u6bd4\u5982\uff1a[\u65b0\u5efa\u6b4c\u5355+] \uff1b direction \u662f\u914d\u7f6e\u8be5\u5143\u7d20\u7684\u53c2\u8003\u7cfb\uff0c\u5206\u522b\u4e3a\uff1a left_top \u5de6\u4e0a\uff1b left_bottom \u5de6\u4e0b\uff1b right_top \u53f3\u4e0a\uff1b right_bottom \u53f3\u4e0b\uff1b \u53c2\u8003\u7cfb\u7684\u9009\u53d6\u6807\u51c6\uff1a\u62c9\u52a8\u6539\u53d8\u7a97\u53e3\u5927\u5c0f\u65f6\uff0c\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u53c2\u8003\u7cfb\u4f4d\u7f6e\u662f\u4e0d\u53d8\u7684\uff1b location \u662f\u8be5\u5143\u7d20\u6309\u94ae\u7684\u76f8\u5bf9\u4e0e\u53c2\u8003\u7cfb\u7684 x, y \u7684\u8ddd\u79bb\uff0c\u53ca\u5927\u5c0f(w, h)\uff0c\u8fd9\u56db\u4e2a\u6570\u636e\u53ef\u4ee5\u901a\u8fc7 UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\u6570\u636e\uff0c\u5728\u7f16\u8f91\u6a21\u5f0f\u4e0b\uff0c\u70b9\u51fb UI \u56fe\u4e0a\u7684\u6309\u94ae\uff0c\u53f3\u4fa7\u5c31\u4f1a\u51fa\u73b0\u8be5\u5143\u7d20\u6309\u94ae\u7684 x, y, w, h \u6570\u636e\u3002 \u5982\u679c UI \u56fe\u4e0a\u6ca1\u6709\u63d0\u4f9b\u4f60\u60f3\u8981\u7684\u5143\u7d20\u6570\u636e\uff0c\u4f60\u53ef\u4ee5\u76f4\u63a5\u5728\u7cfb\u7edf\u4e2d\u4f7f\u7528\u622a\u56fe\u5f55\u5c4f\u8fdb\u884c\u5c3a\u91cf\uff0c\u8fd9\u662f\u4e00\u79cd\u4e0d\u63a8\u8350\u4f46\u80fd\u7528\u7684\u65b9\u6cd5\u3002 \u3010\u8c03\u7528\u65b9\u6cd5\u3011 \u5728\u5e94\u7528\u5e93\u65b9\u6cd5\u5c42\u8fd9\u6837\u5199\uff1a def click_add_music_list_btn_in_music_by_ui(self):\n\"\"\"\u70b9\u51fb\u65b0\u5efa\u6b4c\u5355\u6309\u94ae\"\"\"\nself.click(*self.ui.btn_center(\"\u65b0\u5efa\u6b4c\u5355+\"))\n self.ui.btn_center() \u662f\u56fa\u5b9a\u5199\u6cd5\uff0c\u53c2\u6570\u5c31\u662f\u914d\u7f6e\u91cc\u9762\u7684 section \u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ocr","title":"\u56db\u3001OCR \u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_2","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 OCR \u65b9\u6848\u5927\u591a\u91c7\u7528\u8c37\u6b4c OCR\uff08Tesseract\uff09\u65b9\u6848\uff0c\u4f46\u662f\u5b83\u5bf9\u4e8e\u4e2d\u6587\u7684\u8bc6\u522b\u975e\u5e38\u5dee\uff0c\u7ecf\u8fc7\u5927\u91cf\u7684\u8c03\u7814\uff0c\u6211\u4eec\u4f7f\u7528 PaddleOCR\uff0c\u5b83\u662f\u4e00\u4e2a\u5f00\u6e90\u7684\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u8bc6\u522b\u5de5\u5177\uff0c\u4e5f\u662f PaddlePaddle \u6700\u6709\u540d\u7684\u4e00\u4e2a\u5f00\u6e90\u9879\u76ee\uff0c\u611f\u5174\u8da3\u7684\u53ef\u4ee5\u70b9\u8fd9\u91cc\u4e86\u89e3\uff0c\u591a\u7684\u4e0d\u8bf4\u4e86\uff0c\u4f60\u53ea\u9700\u8981\u77e5\u9053\u5b83\u5c31\u662f\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_2","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5b89\u88c5\u4ed6\u662f\u4e2a\u5f88\u9ebb\u70e6\u7684\u4e8b\u60c5\uff0c\u867d\u7136\u64cd\u4f5c\u5f88\u7b80\u5355\uff0c\u4f46\u5176\u5b9e\u5b89\u88c5\u5305\u6709\u70b9\u5927\uff0c\u56e0\u6b64\u6211\u4eec\u4e0d\u5e0c\u671b\u76f4\u63a5\u5728 env.sh \u4e2d\u52a0\u5165\u5b83\uff0c\u8fd9\u4f1a\u8ba9\u6574\u4e2a\u81ea\u52a8\u5316\u73af\u5883\u53d8\u5f97\u975e\u5e38\u81c3\u80bf\uff1b \u56e0\u6b64\uff0c\u6211\u4eec\u60f3\u5230\u5c06\u5b83\u505a\u6210\u4e00\u4e2a RPC \u670d\u52a1\u5728\u5176\u4ed6\u673a\u5668\u4e0a\u90e8\u7f72\uff0c\u6d4b\u8bd5\u673a\u901a\u8fc7\u8fdc\u7a0b\u8c03\u7528 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u4f7f\u7528\u5b83\uff1b RPC \u7684\u8c03\u7528\u903b\u8f91\uff1a \u8fd9\u6837\u6211\u4eec\u53ea\u9700\u8981\u5728\u670d\u52a1\u7aef\u90e8\u7f72\u597d OCR \u8bc6\u522b\u7684\u670d\u52a1\uff0c\u7136\u540e\u901a\u8fc7 RPC \u670d\u52a1\u5c06\u529f\u80fd\u63d0\u4f9b\u51fa\u6765\uff0c\u6846\u67b6\u91cc\u9762\u53ea\u9700\u8981\u8c03\u7528\u5bf9\u5e94\u7684 RPC \u63a5\u53e3\u5c31\u884c\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_1","title":"3\u3001\u4f7f\u7528\u8bf4\u660e","text":"\u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nfrom paddleocr import PaddleOCR\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef paddle_ocr(pic_path, lang):\n\"\"\"\n Paddleocr\u76ee\u524d\u652f\u6301\u7684\u591a\u8bed\u8a00\u8bed\u79cd\u53ef\u4ee5\u901a\u8fc7\u4fee\u6539lang\u53c2\u6570\u8fdb\u884c\u5207\u6362\n \u4f8b\u5982`ch`, `en`, `fr`, `german`, `korean`, `japan`\n :param file_name:\n :param lang:\n :return:\n \"\"\"\nif __name__ == \"__main__\":\nIP = popen(\"hostname -I\").read().split(\" \")[0]\nPORT = 8890\nSCREEN_CACHE = \"/tmp/screen.png\"\nserver = ThreadXMLRPCServer((IP, PORT), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(paddle_ocr, \"paddle_ocr\")\nprint(\"\u76d1\u542c\u5ba2\u6237\u7aef\u8bf7\u6c42\u3002\u3002\")\nserver.serve_forever()\n \u6846\u67b6\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from src import OCR\nOCR.ocr(*target_strings, picture_abspath=None, similarity=0.6, return_default=False, return_first=False, lang=\"ch\"):\n# \u901a\u8fc7 OCR \u8fdb\u884c\u8bc6\u522b\u3002\n# target_strings:\n# \u76ee\u6807\u5b57\u7b26,\u8bc6\u522b\u4e00\u4e2a\u5b57\u7b26\u4e32\u6216\u591a\u4e2a\u5b57\u7b26\u4e32,\u5e76\u8fd4\u56de\u5176\u5728\u56fe\u7247\u4e2d\u7684\u5750\u6807;\n# \u5982\u679c\u4e0d\u4f20\u53c2\uff0c\u8fd4\u56de\u56fe\u7247\u4e2d\u8bc6\u522b\u5230\u7684\u6240\u6709\u5b57\u7b26\u4e32\u3002\n# picture_abspath: \u8981\u8bc6\u522b\u7684\u56fe\u7247\u8def\u5f84\uff0c\u5982\u679c\u4e0d\u4f20\u9ed8\u8ba4\u622a\u53d6\u5168\u5c4f\u8bc6\u522b\u3002\n# similarity: \u5339\u914d\u5ea6\u3002\n# return_default: \u8fd4\u56de\u8bc6\u522b\u7684\u539f\u751f\u6570\u636e\u3002\n# return_first: \u53ea\u8fd4\u56de\u7b2c\u4e00\u4e2a,\u9ed8\u8ba4\u4e3a False,\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u6240\u6709\u6570\u636e\u3002\n# lang: `ch`, `en`, `fr`, `german`, `korean`, `japan`\n \u6b64\u65b9\u6848\u5728\u6846\u67b6\u5185\u6ca1\u6709\u5f15\u5165\u4efb\u4f55\u4e09\u65b9\u4f9d\u8d56\u5b8c\u5168\u91c7\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\uff0c\u800c\u4e14\u4f7f\u7528\u65b9\u6cd5\u975e\u5e38\u7b80\u5355\uff0c\u53ea\u9700\u8981\u901a\u8fc7 OCR.ocr() \u5373\u53ef\uff1b \u5bf9\u4e8e\u4e00\u4e9b\u6587\u6848\u7684\u573a\u666f\u975e\u5e38\u9002\u7528\uff0c\u6b64\u65b9\u6cd5\u76f4\u63a5\u8fd4\u56de\u5750\u6807\uff0c\u53ef\u4ee5\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u3002 \u4e5f\u53ef\u4ee5\u7528\u4e8e\u6587\u5b57\u65ad\u8a00\uff0c\u4ee3\u7801\u793a\u610f\uff1a def assert_ocr_exist(\n*args, picture_abspath=None, similarity=0.6, return_first=False, lang=\"ch\"\n):\n\"\"\"\u65ad\u8a00\u6587\u6848\u5b58\u5728\"\"\"\npic = None\nif picture_abspath is not None:\npic = picture_abspath + \".png\"\nres = OCR.ocr(\n*args,\npicture_abspath=pic,\nsimilarity=similarity,\nreturn_first=return_first,\nlang=lang,\n)\nif res is False:\nraise AssertionError(\n(f\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{args}\", f\"{pic if pic else GlobalConfig.SCREEN_CACHE}\")\n)\nif isinstance(res, tuple):\npass\nelif isinstance(res, dict) and False in res.values():\nres = filter(lambda x: x[1] is False, res.items())\nraise AssertionError(\n(\nf\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{dict(res)}\",\nf\"{pic if pic else GlobalConfig.SCREEN_CACHE}\",\n)\n)\n \u5728\u7528\u4f8b\u4e2d\u4f7f\u7528\u65ad\u8a00\uff0c\u793a\u4f8b\uff1a def test_font_manager_021(self):\n\"\"\"\u53f3\u4fa7\u2665-\u6536\u85cf/\u53d6\u6d88\u6536\u85cf\u5b57\u4f53\"\"\"\n# \u5b57\u4f53\u7ba1\u7406\u5668\u754c\u9762\u53f3\u4fa7\u8be6\u60c5\u5217\u8868\uff0c\u9009\u62e9\u672a\u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e / \u6536\u85cf\u5b57\u4f53\n# \u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e\u83dc\u5355\u663e\u793a\u201c\u53d6\u6d88\u6536\u85cf\u201d\uff1b\n...\nself.assert_ocr_exist(\"\u53d6\u6d88\u6536\u85cf\")\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_1","title":"4\u3001\u670d\u52a1\u7aef\u90e8\u7f72","text":"\u6211\u4eec\u76ee\u524d\u662f\u5c06 OCR \u670d\u52a1\u90e8\u7f72\u5728\u666e\u901a\u7684\u529e\u516c\u673a\u4e0a\u7684\uff0c\u5982\u679c\u4f60\u89c9\u5f97\u73b0\u6709\u7684 OCR \u8bc6\u522b\u6027\u80fd\u4e0d\u591f\u597d\uff0c\u6070\u597d\u4f60\u6709\u66f4\u597d\u7684\u673a\u5668\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u5176\u79c1\u6709\u5316\u90e8\u7f72\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41_1","title":"4.1\u3001\u73af\u5883\u5b89\u88c5","text":"\u63a8\u8350\u4f7f\u7528 pipenv \u8fdb\u884c\u73af\u5883\u642d\u5efa\uff1b \u5b89\u88c5 pipenv \uff1a sudo pip3 install pipenv\n \u65b0\u5efa\u4e00\u4e2a\u76ee\u5f55\u4f5c\u4e3a\u73af\u5883\u5305 ocr_env\uff1a cd ~\nmkdir ocr_env\n \u521b\u5efa python 3.7 \u73af\u5883\uff1a cd ocr_env\npipenv --python 3.7\n \u5b89\u88c5 OCR \u4f9d\u8d56\u5305\uff1a pipenv install paddlepaddle -i https://mirror.baidu.com/pypi/simple\npipenv install \"paddleocr>=2.0.1\" -i https://mirror.baidu.com/pypi/simple\n \u4e0d\u51fa\u610f\u5916\uff0c\u8fd9\u6837\u5c31\u628a\u4f9d\u8d56\u5b89\u88c5\u597d\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42_1","title":"4.2\u3001\u542f\u52a8\u670d\u52a1","text":"\u5c06\u57fa\u7840\u6846\u67b6\u4e2d\u7684 scr/ocr/pdocr_rpc_server.py \u6587\u4ef6\u62f7\u8d1d\u5230 ocr_env \u76ee\u5f55\uff0c\u540e\u53f0\u6267\u884c\u5b83\u5c31\u597d\u4e86\uff1a cd ocr_env\nnohup pipenv run python pdocr_rpc_server.py &\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#43","title":"4.3\u3001\u914d\u7f6e\u5f00\u673a\u81ea\u542f\uff08\u901a\u7528\uff09","text":"\u4f60\u80af\u5b9a\u4e0d\u60f3\u6bcf\u6b21\u673a\u5668\u91cd\u542f\u4e4b\u540e\u90fd\u9700\u8981\u624b\u52a8\u542f\u52a8\u670d\u52a1\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u914d\u7f6e\u5f00\u673a\u81ea\u542f\u3002 \u5199\u5f00\u673a\u81ea\u542f\u670d\u52a1\u6587\u4ef6\uff1a sudo vim /lib/systemd/system/ocr.service\n autoocr \u540d\u79f0\u4f60\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff0c\u5199\u5165\u4ee5\u4e0b\u5185\u5bb9\uff1a [Unit]\nDescription=OCR Service\nAfter=multi-user.target\n\n[Service]\nUser=uos\nGroup=uos\nType=idle\nWorkingDirectory=/home/uos/ocr_env\nExecStart=pipenv run python pdocr_rpc_server.py\n\n[Install]\nWantedBy=multi-user.target\n \u6ce8\u610f\u66ff\u6362\u4f60\u7684${USER} \u4fee\u6539\u914d\u7f6e\u6587\u4ef6\u7684\u6743\u9650\uff1a sudo chmod 644 /lib/systemd/system/ocr.service\n \u81ea\u542f\u670d\u52a1\u751f\u6548\uff1a sudo systemctl daemon-reload\nsudo systemctl enable ocr.service\n \u67e5\u770b\u670d\u52a1\u72b6\u6001\uff1a sudo systemctl status ocr.service\n \u4f60\u53ef\u4ee5\u518d\u91cd\u542f\u4e0b\u7535\u8111\uff0c\u770b\u770b\u670d\u52a1\u662f\u4e0d\u662f\u6b63\u5e38\u542f\u52a8\u4e86\uff0c\u6ca1\u62a5\u9519\u5c31 OK \u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_4","title":"\u4e94\u3001\u5c5e\u6027\u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_3","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 UI \u81ea\u52a8\u5316\u5927\u591a\u90fd\u662f\u57fa\u4e8e\u6d4f\u89c8\u5668\u7684\uff0c\u6838\u5fc3\u662f\u5728\u7f51\u9875\u7684 DOM \u6811\u4e0a\u67e5\u627e\u5143\u7d20\uff0c\u5e76\u5bf9\u5176\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\uff1b Linux \u684c\u9762\u5e94\u7528\u5927\u591a\u662f\u91c7\u7528 Qt \u7f16\u5199\u7684\uff0c\u5728 Qt \u4e2d\u4e5f\u662f\u4ece\u6700\u9876\u5c42\u7684 MainWindow \u5f00\u59cb\u6784\u5efa\u5e94\u7528\uff0c\u6240\u4ee5\u903b\u8f91\u4e5f\u662f\u4e00\u6837\u7684\uff0cQt \u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u540c\u6837\u53ef\u4ee5\u901a\u8fc7 DOM \u6811\uff08\u5c5e\u6027\u6811\uff09\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff0c\u6211\u4eec\u79f0\u4e4b\u4e3a\u5c5e\u6027\u5b9a\u4f4d\u3002 \u501f\u52a9\u5f00\u6e90\u5de5\u5177 dogtail \u6211\u4eec\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u83b7\u53d6\uff0c\u4ece\u800c\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\u3002dogtail \u7684\u9879\u76ee\u4ecb\u7ecd\u53ef\u4ee5\u731b\u6233\u8fd9\u91cc\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_3","title":"2\u3001\u4f7f\u7528\u65b9\u6cd5","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#21sniff","title":"2.1\u3001sniff\uff08\u55c5\u63a2\u5668\uff09\u4f7f\u7528","text":"\u5728\u7ec8\u7aef\u8f93\u5165 sniff \u542f\u52a8 AT-SPI Browser mikigo@mikigo-PC:~$ sniff\n \u67e5\u770b\u5e94\u7528\u7684\u6807\u7b7e \u5728 sniff \u91cc\u9762\u53ef\u4ee5\u770b\u5230\u7cfb\u7edf\u4e2d\u5df2\u542f\u52a8\u7684\u5e94\u7528\uff0c\u70b9\u51fb\u5e94\u7528\u540d\u79f0\u524d\u9762\u7684\u4e09\u89d2\u5f62\u56fe\u6807\uff0c\u53ef\u4ee5\u5c55\u5f00\u5e94\u7528\u7684\u6807\u7b7e\uff0c\u6240\u6709\u6807\u7b7e\u4ee5 tree \u7684\u5f62\u5f0f\u5c55\u793a\uff0c\u5bf9\u5e94\u5e94\u7528\u91cc\u9762\u7684\u7236\u7a97\u53e3\u548c\u5b50\u7a97\u53e3\u3002 \u83b7\u53d6\u5143\u7d20\u63a7\u4ef6\u7684\u6807\u7b7e\u540d\u79f0 \u9996\u5148\uff0c\u4e3a\u4e86\u65b9\u4fbf\u67e5\u770b\u5143\u7d20\u63a7\u4ef6\u5bf9\u5e94\u7684\u4f4d\u7f6e\uff0c\u5efa\u8bae\u73b0\u5728\u4e0a\u65b9\u5de5\u5177\u680f\u70b9\u51fb Actions\uff0c\u7136\u540e\u52fe\u9009 Hightlight Items\uff0c\u8fd9\u6837\u5728 sniff \u4e2d\u9f20\u6807\u9009\u4e2d\u5143\u7d20\u6807\u7b7e\u7684\u65f6\u5019\uff0c\u5e94\u7528\u4e2d\u4f1a\u6709\u76f8\u5e94\u7684\u5149\u6807\u9501\u5b9a\u3002 \u5728 sniff \u91cc\u9762\u70b9\u51fb\u8fdb\u5165\u5e94\u7528\u7684\u6807\u7b7e tree \u4e2d\u540e\uff0c\u70b9\u51fb\u76f8\u5e94\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5728\u5de5\u5177\u4e0b\u65b9\uff0c\u4f1a\u5c55\u793a\u5143\u7d20\u63a7\u4ef6\u7684 Name\uff0c\u8fd9\u4e2a\u5c31\u662f\u6807\u7b7e\u540d\u79f0\u3002 \u5728 tree \u4e2d\u6709\u4e9b\u5730\u65b9\u662f\u7a7a\u767d\u7684\u6216\u8005\u662f Form\uff0c\u662f\u56e0\u4e3a\u5f00\u53d1\u4eba\u5458\u5728\u6dfb\u52a0\u6807\u7b7e\u7684\u65f6\u5019\u6ca1\u6709\u6dfb\u52a0\uff0c\u6216\u8005\u6709\u4e9b\u7236\u7a97\u53e3\u4e0d\u9700\u8981\u6dfb\u52a0\uff0c\u8fd9\u79cd\u5728\u5b9e\u9645\u4e1a\u52a1\u4e2d\u662f\u4e0d\u5f71\u54cd\u7684\uff0c\u6211\u4eec\u53ea\u8981\u4fdd\u8bc1\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\u4e2d\uff0c\u8981\u7528\u5230\u7684\u5143\u7d20\u90fd\u6dfb\u52a0\u4e86\u6807\u7b7e\u5373\u53ef\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#22","title":"2.2\u3001\u5143\u7d20\u64cd\u4f5c","text":"\u83b7\u53d6\u5e94\u7528\u5bf9\u8c61 dogtail \u83b7\u53d6\u5e94\u7528\u5bf9\u8c61\u7684\u65f6\u5019\uff0c\u4f7f\u7528\u7684\u662f tree \u5e93\u91cc\u9762\u7684 application() \u65b9\u6cd5\uff1a from dogtail.tree import root\napp_obj = root.application('deepin-music')\n app_obj\u5c31\u662f\u5e94\u7528\u7684\u5bf9\u8c61\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\uff0c\u662f\u5e94\u7528\u5bf9\u8c61\u4f7f\u7528child()\u65b9\u6cd5\uff1a element = app_obj.child('element_name')\n \u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u4f20\u5165\u5143\u7d20\u7684 Name\uff0c\u83b7\u53d6\u5230\u76f8\u5e94\u5143\u7d20\u7684\u5bf9\u8c61\u3002Name \u53ef\u4ee5\u901a\u8fc7 sniff \u67e5\u770b\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\u5217\u8868: element_list = element.children\n \u83b7\u53d6\u5230\u8fd9\u4e2a\u5143\u7d20\u4e0b\u9762\u6240\u6709\u7684\u5143\u7d20\u5217\u8868\u3002 \u8fd9\u4e2a\u65b9\u6cd5\u9002\u7528\u4e8e\u6709\u4e9b\u6807\u7b7e\u6ca1\u6709\u6dfb\u52a0\uff0c\u4f46\u662f\u4f4d\u7f6e\u662f\u56fa\u5b9a\u7684\uff0c\u6211\u4eec\u901a\u8fc7\u7d22\u5f15\u53ef\u4ee5\u53d6\u5f97\u5143\u7d20\u3002 element_list[0]\n \u5bf9\u5143\u7d20\u7684\u64cd\u4f5c \u5728\u83b7\u53d6\u5230\u5143\u7d20\u4e4b\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u76f8\u5e94\u7684\u64cd\u4f5c\u3002 \u5355\u51fb element.click(button=1)\n button 1 \u2014>\u5de6\u952e\uff0c2 \u2014>\u6eda\u8f6e\uff0c3 \u2014>\u53f3\u952e\uff0c\u9ed8\u8ba4\u4e3a 1 \u53cc\u51fb element.doubleClick(button=1)\n \u9f20\u6807\u60ac\u505c element.point()\n \u9f20\u6807\u79fb\u52a8\u5230\u5143\u7d20\u4e2d\u5fc3\u4f4d\u7f6e \u6587\u672c\u8f93\u5165 element.typeText(string)\n \u5411\u5143\u7d20\u5bf9\u8c61\u8f93\u5165\u5b57\u7b26\u4e32 \uff0c\u6bd4\u5982\u8f93\u5165\u6846 \u7ec4\u5408\u952e element.keyCombo(comboString)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#23","title":"2.3\u3001\u6846\u67b6\u5c01\u88c5","text":"\u4ee3\u7801\u793a\u4f8b\uff1a # \u8be6\u7ec6\u4ee3\u7801\u8bf7\u67e5\u770b src/dogtail_utils.py\nclass DogtailUtils:\ndef __init__(self, name=None, description=None):\nself.name = name\nself.description = description\nself.obj = root.application(self.name, self.description)\ndef app_element(self, *args, **kwargs):\n\"\"\"\n \u83b7\u53d6app\u5143\u7d20\u7684\u5bf9\u8c61\n :return: \u5143\u7d20\u7684\u5bf9\u8c61\n \"\"\"\nreturn self.obj.child(*args, **kwargs, retry=False)\ndef element_center(self, element) -> tuple:\n\"\"\"\n \u83b7\u53d6\u5143\u7d20\u7684\u4e2d\u5fc3\u4f4d\u7f6e\n :param element:\n :return: \u5143\u7d20\u4e2d\u5fc3\u5750\u6807\n \"\"\"\n_x, _y, _w, _h = self.app_element(element).extents\n_x = _x + _w / 2\n_y = _y + _h / 2\nreturn _x, _y\n \u6846\u67b6\u63d0\u4f9b\u7684\u63a5\u53e3\u975e\u5e38\u7b80\u6d01\uff0c\u5728\u8c03\u7528\u65f6\uff1a self.dog.element_center(\"\u64ad\u653e\")\n \u8fd9\u6837\u5c31\u80fd\u83b7\u53d6\u5230\u6b64\u5143\u7d20\u7684\u4e2d\u5fc3\u5750\u6807\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_5","title":"\u516d\u3001\u6807\u7b7e\u5316\u7ba1\u7406","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_4","title":"1\u3001\u6807\u7b7e\u8bf4\u660e","text":"\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u811a\u672c ID\uff1a\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c/\u51fd\u6570 ID\uff1b PMS\u7528\u4f8bID\uff1aPMS \u4e0a\u5bf9\u5e94\u7684\u7528\u4f8b ID\uff08\u7528\u4f8b\u5e93 ID\uff09\uff1b \u9ed8\u8ba4\u4f7f\u7528\u7528\u4f8b\u5e93 ID\uff0c\u5bf9\u4e8e\u6682\u65f6\u6ca1\u6709\u4f7f\u7528\u7528\u4f8b\u5e93\u7ba1\u7406\u7528\u4f8b\u7684\u9879\u76ee\uff0c\u53ef\u4ee5\u4f7f\u7528\u4ea7\u54c1\u5e93\u7528\u4f8b ID\uff1b \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1aFUNC\uff08\u529f\u80fd\uff09\u3001PERF\uff08\u6027\u80fd\uff09\u3001STR\uff08\u538b\u529b\uff09\u3001SEC\uff08\u5b89\u5168\uff09\u3001CTS\uff08\u517c\u5bb9\u6027\uff09\u3001API\uff08\u63a5\u53e3\uff09\u3001BASELINE\uff08\u57fa\u7ebf-\u9884\u7559\uff09 \u8bbe\u5907\u7c7b\u578b\uff1aPPL\uff08\u4f9d\u8d56\u5916\u8bbe\u7684\u7528\u4f8b\uff09\u3001COL\uff08\u4f9d\u8d56\u4e3b\u63a7\u673a\u7684\u7528\u4f8b\uff09 \u7528\u4f8b\u6765\u6e90\uff1aBUG\uff08\u7531 Bug \u8f6c\u7684\u7528\u4f8b\uff09 \u4e0a\u7ebf\u5bf9\u8c61\uff1aCICD\uff0c\u8868\u793a\u4e0a\u7ebf\u5230 CICD \u6d41\u6c34\u7ebf\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u53ef\u4e00\u952e\u751f\u6210 case_list.csv \u6587\u4ef6\uff0c\u7528\u4e8e\u5bfc\u5165\u5230\u660e\u9053\u4e91 AT \u7528\u4f8b\u5217\u8868\u4e2d\u63a7\u5236 CICD \u8dd1\u6d4b\u8303\u56f4\uff1b \u6d4b\u8bd5\u7ea7\u522b\uff1aC1 / C2 / C3 / C4\uff0c\u5177\u4f53\u5b9a\u4e49\u53c2\u8003\u6d41\u6c34\u7ebf\u4f7f\u7528\u6307\u5bfc\uff1b \u8df3\u8fc7\u539f\u56e0\uff1askip-XXX\uff0c\u7528\u4e8e\u63a7\u5236\u7528\u4f8b\u662f\u5426\u6267\u884c\uff1b \u786e\u8ba4\u4fee\u590d\uff1afixed-XXX\uff0c\u7528\u4e8e\u6807\u8bb0\u7528\u4f8b\u7684\u4fee\u590d\u72b6\u6001\uff08\u540e\u9762\u8be6\u7ec6\u8bb2\u89e3\u7528\u6cd5\uff09\uff1b \u5e9f\u5f03\u7528\u4f8b\uff1aremoved-\u5df2\u5e9f\u5f03\uff0c\u7528\u4e8e\u6807\u8bb0\u5df2\u7ecf\u5e9f\u5f03\u7684\u7528\u4f8b\uff0c\u6b64\u7528\u4f8b\u6807\u7b7e\u4e0d\u4f1a\u88ab\u6dfb\u52a0\uff0c\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff1b \u793a\u4f8b\uff1a \u811a\u672cID PMS\u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u8bbe\u5907\u7c7b\u578b \u7528\u4f8b\u6765\u6e90 \u4e0a\u7ebf\u5bf9\u8c61 \u6d4b\u8bd5\u7ea7\u522b \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b ... 679537 679537 L1 FUNC PPL CICD C1 skip-XXX fixed-XXX removed-\u5df2\u5e9f\u5f03 ..."},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_4","title":"2\u3001\u64cd\u4f5c\u6b65\u9aa4","text":"2.1\u3001\u5728\u5b50\u9879\u76ee\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u4ee5\u7528\u4f8b\u7684 py \u6587\u4ef6\u9664\u53bb\u9996\u5b57\u7b26\u4e32 \"test_\" \u548c\u7528\u4f8b\u5e8f\u53f7\u540e\u7684\u5b57\u7b26\u4e32\u4f5c\u4e3a csv \u7684\u6587\u4ef6\u540d\u3002 \u4f8b\u5982: \u76f8\u518c\u7684\u7528\u4f8b\u6587\u4ef6\u4e3a test_album_xxx.py\uff0cxxx \u8868\u793a\u7528\u4f8b\u7684ID\uff08\u4e5f\u53ef\u4ee5\u662f\u81ea\u5b9a\u4e49\u7684\u6570\u5b57\u4ee3\u8868\u7528\u4f8b\u5e8f\u53f7\uff09\uff0c\u6b64\u65f6 csv \u6587\u4ef6\u540d\u5c31\u5e94\u4e3a album.csv\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u6240\u6709 csv \u6587\u4ef6\u5efa\u8bae\u653e\u5728\u4e00\u4e2a tags \u76ee\u5f55\u4e0b\u3002 \u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 2.2\u3001\u7b2c\u4e00\u5217\u4e3a\u811a\u672c ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b\u7528\u4f8b\u6807\u7b7e\u53ef\u4ee5\u65e0\u5e8f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_2","title":"3\u3001\u589e\u52a0\u8bf4\u660e","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_1","title":"3.1\u3001\u8df3\u8fc7\u7528\u4f8b","text":"\u4f20\u7edf\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668(@pytest.mark.skip)\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a; \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#311","title":"3.1.1\u3001\u56fa\u5b9a\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 679537 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u7b7e\u5f00\u5934\u4e3a \u201cskip-XXX\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\uff0c\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\u5219\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u7b7e\u4e3a SKIPED\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#312","title":"3.1.2\u3001\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skipif_platform-aarch64&mips64 \u67d0\u4e9b\u7528\u4f8b\u4f1a\u56e0\u4e3a\u4e0d\u540c\u7684\u73af\u5883\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\uff0c\u5e38\u89c1\u7684\u573a\u666f\u4e3a\u5728\u4e0d\u540c\u67b6\u6784\u4e0a\u5224\u65ad\u662f\u5426\u6267\u884c\uff0c\u8df3\u8fc7\u7684\u539f\u56e0\u6807\u7b7e\u4e3a \u201cskipif_platform-\u201d \u52a0\u67b6\u6784\u540d\uff0c\u591a\u4e2a\u67b6\u6784\u4e4b\u95f4\u4f7f\u7528 \u201c&\u201d \u62fc\u63a5\uff1b \u4ee5\u4e0a\u4f8b\u5b50\u4e3a\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u5224\u65ad\u5f53\u524d\u67b6\u6784\u662f\u5426\u4e3a arrch64 \u6216\u8005 mips64\uff0c\u82e5\u662f\uff0c\u5219\u8df3\u8fc7\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u82e5\u5426\u5219\u6267\u884c\u7528\u4f8b\uff1b \u76ee\u524d\u6846\u67b6\u9ed8\u8ba4\u4ec5\u652f\u6301\u67b6\u6784\u7684\u6761\u4ef6\u5224\u65ad\uff0c\u4f46\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u903b\u8f91\u652f\u6301\u81ea\u5b9a\u4e49\u6dfb\u52a0\u3002 \u5728\u9879\u76ee\u76ee\u5f55\u8def\u5f84\u4e0b\u5b58\u5728\u6587\u4ef6 setting/skipif.py\uff0c\u6240\u6709\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u7684\u51fd\u6570\u5199\u5728\u6b64\u6587\u4ef6\u4e2d\u3002 \u9ed8\u8ba4\u67b6\u6784\u5224\u65ad\u4f8b\u5b50\uff1a def skipif_platform(args: str):\n\"\"\"\u5e73\u53f0\u8df3\u8fc7\"\"\"\n_skip_key = args.split(\"&\")\nfor key in _skip_key:\nif GlobalConfig.SYS_ARCH == key:\nreturn True\nreturn False\n \u65b9\u6cd5\u7f16\u5199\u89c4\u8303\uff1a \u65b9\u6cd5\u540d\u5fc5\u987b\u4ee5 skipif \u5f00\u5934\uff1b \u65b9\u6cd5\u5fc5\u987b\u6709\u8fd4\u56de\u7ed3\u679c\u5e76\u4e14\u4e3a\u5e03\u5c14\u503c\uff08True \u4ee3\u8868\u8df3\u8fc7\uff0cFalse \u4ee3\u8868\u4e0d\u8df3\u8fc7\uff09\uff1b \u65b9\u6cd5\u53ea\u80fd\u6709\u4e00\u4e2a\u5165\u53c2\uff1b \u5728 csv \u6587\u4ef6\u8df3\u8fc7\u539f\u56e0\u4e00\u680f\u4e2d\u586b\u5199\u4e3a \u201c{\u51fd\u6570\u540d}-{\u53c2\u6570}\u201d\uff0c\u4f8b\u5982\uff1askipif_platform-aarch64\uff1b\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u4f1a\u4ee5\u7b2c\u4e00\u4e2a \u201c-\u201d \u8fdb\u884c\u5206\u5272\uff0c\u622a\u53d6\u7684\u5de6\u4fa7\u5b57\u7b26\u4e32\u4f5c\u4e3a\u51fd\u6570\u540d\uff0c\u5728 skipif.py \u6587\u4ef6\u4e2d\u67e5\u627e\u662f\u5426\u6709\u540c\u540d\u51fd\u6570\uff0c\u5e76\u5c06\u622a\u53d6\u7684\u53f3\u4fa7\u4f5c\u4e3a\u53c2\u6570\u4f20\u9012\u7ed9\u8be5\u51fd\u6570\uff0c\u901a\u8fc7\u83b7\u53d6\u8be5\u51fd\u6570\u8fd4\u56de\u7684\u5e03\u5c14\u503c\uff0c\u8fd4\u56de True\uff0c\u5219\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u8fd4\u56de False\uff0c\u5219\u6267\u884c\u8be5\u7528\u4f8b\u3002 \u82e5\u51fd\u6570\u9700\u8981\u591a\u4e2a\u53c2\u6570\uff0c\u53ef\u81ea\u5b9a\u4e49\u591a\u4e2a\u53c2\u6570\u4e4b\u95f4\u7684\u8fde\u63a5\u7b26\uff0c\u8fde\u63a5\u7b26\u53f7\u4e0d\u53ef\u4f7f\u7528\u4e0b\u5212\u7ebf\u548c\u9017\u53f7\uff0c\u63a8\u8350\u7edf\u4e00\u4f7f\u7528 & \u7b26\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32","title":"3.2\u3001\u786e\u8ba4\u4fee\u590d","text":"\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7528\u4f8b\u4fee\u590d\u540e\uff0c\u4f46\u4e0d\u80fd\u7acb\u5373\u5220\u9664\u8df3\u8fc7\u539f\u56e0\uff08skip-XXX\uff09\u7684\u7528\u4f8b\uff0c\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u786e\u8ba4\u4fee\u590d\u201d\uff0c\u4f5c\u4e3a\u6807\u8bb0\u8be5\u7528\u4f8b\u662f\u5426\u5df2\u7ecf\u4fee\u590d\uff0c\u56fa\u5b9a\u586b\u5165\u5b57\u6bb5\u4e3a \u201cfixed-\u5df2\u4fee\u590d\u201d\u3002\u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u5373\u4f7f\u540c\u65f6\u6807\u8bb0\u4e86 skip-XXX \u4e5f\u4f1a\u6b63\u5e38\u6267\u884c\u3002 \u793a\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d 679537 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d \u3010\u540c\u65f6\u6807\u8bb0\u4e86skip \u548c fixed\uff0c\u4f46\u4ecd\u7136\u60f3\u8981\u8df3\u8fc7\u7528\u4f8b\u3011 \u5f53 \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u540c\u65f6\u586b\u5165\u540e\uff0c\u547d\u4ee4\u884c\u4f20\u9012\u53c2\u6570 --ifixed yes\uff0c\u5219\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\u8be5\u6761\u7528\u4f8b\u3002 python3 manage.py run --ifixed yes\n \u770b\u5230\u8fd9\u91cc\u6709\u4e9b\u540c\u5b66\u53ef\u80fd\u8981\u95ee\u4e86\uff0c\u6211\u60f3\u6062\u590d\u8df3\u8fc7\u6267\u884c\uff0c\u76f4\u63a5\u628a skip-XXX \u8fd9\u4e00\u5217\u6807\u7b7e\u5220\u6389\u4e0d\u5c31\u597d\u4e86\uff0c\u8fd8\u641e\u4ec0\u4e48\u786e\u8ba4\u4fee\u590d\u5e72\u5565\uff1f \u8fd9\u91cc\u7ed9\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u89e3\u91ca\u4e00\u4e0b\uff1a \uff08\u4ee5\u4e0b\u6d41\u6c34\u7ebf\u6307\u7684\u662f\u6bcf\u65e5\u6784\u5efa\u7684\u6d41\u6c34\u7ebf\uff0c\u8dd1 AT \u7684\u5168\u91cf\u7528\u4f8b\uff09 \u9996\u5148\uff0c\u6d41\u6c34\u7ebf\u4e0a\u8dd1\u7684\u662f AT \u5386\u53f2 Tag\uff0c\u8df3\u8fc7\u7528\u4f8b\u7684\u6807\u7b7e(skip-XXX) \u662f\u5728\u6700\u65b0\u7684\u4ee3\u7801\u4e0a\u63d0\u4ea4\u7684\uff0c\u6211\u4eec\u91c7\u7528\u6700\u65b0\u7684 csv \u6587\u4ef6\u8986\u76d6\u5386\u53f2 csv \u6587\u4ef6\u7684\u8bbe\u8ba1\u6765\u5b9e\u73b0\u4e86\u5bf9\u5386\u53f2 Tag \u4e0a\u7528\u4f8b\u7684\u8df3\u8fc7\uff1b \u7136\u540e\uff0c\u5728\u65e5\u5e38\u8df3\u8fc7\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u540c\u65f6\u4e5f\u5728\u4fee\u590d\u4e00\u4e9b\u7528\u4f8b\uff0c\u4fee\u590d\u540e\u7684\u8fd9\u4e9b\u7528\u4f8b\u5728\u672c\u5730\u8c03\u8bd5\u7684\u65f6\u5019\u6211\u4eec\u4e0d\u5e0c\u671b\u7ee7\u7eed\u8df3\u8fc7\uff0c\u4f46\u662f\u6b64\u65f6\uff0c\u4fee\u590d\u7684\u8fd9\u4e9b\u7528\u4f8b\u53ef\u80fd\u8fd8\u4e0d\u7a33\u5b9a\uff0c\u4e0d\u9002\u5408\u9a6c\u4e0a\u653e\u5230\u6d41\u6c34\u7ebf\u53bb\u8dd1\uff0c\u4e5f\u5c31\u662f\u8bf4\u6d41\u6c34\u7ebf\u4e0a\u6211\u4eec\u662f\u5e0c\u671b\u4ed6\u7ee7\u7eed\u8df3\u8fc7\u7684\uff0c\u56e0\u6b64\uff0c\u54b1\u4e0d\u80fd\u76f4\u63a5\u628a skip-XXX \u5e72\u6389\uff1b \u8fd9\u91cc\u5c31\u77db\u76fe\u4e86\uff0c\u4e00\u4e2a\u9700\u6c42\u662f\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u53e6\u4e00\u4e2a\u9700\u6c42\u53c8\u4e0d\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u600e\u4e48\u529e\u5462\uff1f \u6211\u4eec\u4f7f\u7528\u201c\u786e\u8ba4\u4fee\u590d\u201d\u6765\u6807\u8bb0\u8fd9\u6761\u7528\u4f8b\u5df2\u7ecf\u4fee\u590d\u4e86\uff0c\u8fd9\u6837\u4f60\u672c\u5730\u8c03\u8bd5\u7528\u4f8b\u7684\u65f6\u5019\u8fd9\u6761\u5df2\u4fee\u590d\u7684\u7528\u4f8b\u662f\u4f1a\u6267\u884c\u7684\uff0c\u540c\u65f6\u5728\u6d41\u6c34\u7ebf\u4e0a\u5c06 --ifixed yes \u53c2\u6570\u52a0\u4e0a\uff0c\u90a3\u4e48\u6d41\u6c34\u7ebf\u4e0a\u6267\u884c\u65f6\u8fd9\u6761\u7528\u4f8b\u4ecd\u7136\u662f\u8df3\u8fc7\u7684\u72b6\u6001\uff0c\u540e\u7eed\u4f60\u6253 Tag \u7684\u65f6\u5019\uff0c\u628a \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u7684\u6807\u7b7e\u5168\u90e8\u5220\u6389\u5c31\u53ef\u4ee5\u4e86\u3002 \u8fd9\u5c31\u662f\u201c\u786e\u8ba4\u4fee\u590d\u201d\u8fd9\u4e2a\u6807\u7b7e\u7684\u80cc\u666f\uff0c\u9700\u8981\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u54c1\u4e00\u54c1\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#33","title":"3.3\u3001\u5e9f\u5f03\u7528\u4f8b","text":"\u9488\u5bf9\u67d0\u4e9b\u7528\u4f8b\uff0c\u7531\u4e8e\u9700\u6c42\u53d8\u66f4\uff0c\u73af\u5883\u5f71\u54cd\u6216\u8bc4\u4f30\u4e0d\u518d\u9002\u7528\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u65f6\uff0c\u7528\u4f8b\u9700\u8981\u5e9f\u5f03\uff0c\u5219\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u5e9f\u5f03\u7528\u4f8b\u201d\uff0c\u8be5\u5217\u5b58\u5728 \u201cremoved-{\u5e9f\u5f03\u539f\u56e0}\u201d\uff0c\u5219\u7528\u4f8b\u4e0d\u4f1a\u6267\u884c\u3002 \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d removed-\u5df2\u5e9f\u5f03 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_2","title":"4\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u4e0a\u9762\u4ecb\u7ecd Pytest \u6846\u67b6\u63d0\u4f9b\u7684\u6807\u7b7e\u529f\u80fd mark\uff0c\u4f7f\u7528\u65f6\u9700\u8981\u4e3a\u6bcf\u4e00\u4e2a\u7528\u4f8b\u6dfb\u52a0\u6807\u7b7e\u88c5\u9970\u5668\uff0c\u5219\u64cd\u4f5c\u590d\u6742\uff0c\u53ef\u7ef4\u62a4\u6027\u5dee\uff0c\u5176\u6839\u672c\u95ee\u9898\u5c31\u662f\u6807\u7b7e\u5206\u6563\u5728\u6bcf\u4e00\u6761\u7528\u4f8b\u7684\u88c5\u9970\u5668\u4e0a\uff0c\u96be\u4ee5\u96c6\u4e2d\u7ef4\u62a4\uff1b\u4e8e\u662f\u4e4e\u5c06\u6240\u6709\u6807\u7b7e\u4f7f\u7528 csv \u6587\u4ef6\u8fdb\u884c\u96c6\u4e2d\u7ba1\u7406\uff0c\u5e76\u901a\u8fc7 Pytest \u7684\u94a9\u5b50\u51fd\u6570\uff0c\u8bfb\u53d6 csv \u6587\u4ef6\uff0c\u52a8\u6001\u6dfb\u52a0\u6807\u7b7e\u5230\u7528\u4e2d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5csv","title":"5\u3001CSV\u6587\u4ef6\u683c\u5f0f","text":"\u6b64\u914d\u7f6e\u6587\u4ef6\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u6807\u7b7e\u6570\u636e\uff0c\u4e14\u8981\u65b9\u4fbf\u80fd\u4f7f\u7528 Excel \u6253\u5f00\u8fdb\u884c\u7f16\u8f91\u67e5\u770b\uff0c\u66f4\u91cd\u8981\u7684\u662f\u6211\u4eec\u4e0d\u60f3\u5f15\u5165\u4e09\u65b9\u4f9d\u8d56\uff0cCSV \u6587\u4ef6\u51e0\u4e4e\u662f\u552f\u4e00\u80fd\u6ee1\u8db3\u6240\u6709\u7684\u8981\u6c42\u7684\u6587\u4ef6\u683c\u5f0f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_6","title":"\u4e03\u3001\u65e5\u5fd7\u7cfb\u7edf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_5","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e YouQu \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u64cd\u4f5c\u65b9\u6cd5\u5c01\u88c5\u5199\u6cd5\uff0c\u901a\u5e38\u662f\u8fd9\u6837\u7684\uff1a\u7c7b\u91cc\u9762\u4e00\u4e2a\u51fd\u6570\u53ea\u5305\u542b\u4e00\u4e2a\u64cd\u4f5c\u6216\u591a\u6b21\u8c03\u7528\u7684\u4e00\u7cfb\u5217\u53ef\u5408\u5e76\u7684\u64cd\u4f5c\uff1b \u4f20\u7edf\u7684\u65e5\u5fd7\u8f93\u51fa\u65b9\u5f0f\uff0c\u9700\u8981\u5728\u6bcf\u4e2a\u51fd\u6570\u91cc\u9762\u4e3b\u52a8\u7f16\u5199\u65e5\u5fd7\u8f93\u51fa\u4ee3\u7801 \uff0c\u4f8b\u5982\uff1a class XXXWidget:\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\nlogger.info(\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\")\n...\n# \u7701\u7565\u4ee3\u7801\u90e8\u5206\n \u4e00\u4e2a\u51fd\u6570\u91cc\u9762\u81f3\u5c11\u5305\u542b\u4e00\u6761\u65e5\u5fd7\u4fe1\u606f\uff0c\u5982\u679c\u6bd4\u8f83\u590d\u6742\u64cd\u4f5c\u6b65\u9aa4\uff0c\u53ef\u80fd\u5305\u542b\u591a\u6761\u65e5\u5fd7\u4fe1\u606f\uff1b \u4e00\u4e2a\u5e94\u7528\u542b\u6709\u5927\u91cf\u7684\u64cd\u4f5c\u51fd\u6570\uff0c\u4e5f\u5c31\u662f\u8bf4\u6211\u4eec\u9700\u8981\u5199\u5927\u91cf\u7684\u65e5\u5fd7\u4ee3\u7801\uff1b \u901a\u8fc7\u7ecf\u9a8c\u89c2\u5bdf\uff0c\u6211\u4eec\u53d1\u73b0\uff0c\u51fd\u6570\u8bf4\u660e\u4ee5\u53ca\u51fd\u6570\u64cd\u4f5c\u65e5\u5fd7\uff0c\u5177\u6709\u8f83\u9ad8\u7684\u91cd\u590d\u5ea6\uff08\u4ece\u4e0a\u9762\u7684\u4f8b\u5b50\u4e5f\u53ef\u4ee5\u770b\u51fa\u6765\uff09\uff0c\u56e0\u6b64\u6211\u4eec\u5927\u80c6\u7684\u8bbe\u60f3\uff0c\u80fd\u4e0d\u80fd\u57fa\u4e8e\u6846\u67b6\u6267\u884c\u65f6\uff0c\u81ea\u52a8\u7684\u5c06\u51fd\u6570\u8bf4\u660e\u4f5c\u4e3a\u65e5\u5fd7\u6253\u5370\u51fa\u6765\uff0c\u4ece\u800c\u51cf\u5c11\u5927\u91cf\u65e5\u5fd7\u4ee3\u7801\u91cf\u548c\u91cd\u590d\u7f16\u5199\uff0c\u90a3\u771f\u662f\u5999\u554a~\u3002 \u57fa\u4e8e\u6b64\u201c\u5929\u771f\u201d\u7684\u60f3\u6cd5\uff0c\u6211\u4eec\u8bbe\u8ba1\u51fa\u4e86 youqu \u7684\u65e5\u5fd7\u7cfb\u7edf\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_5","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u6838\u5fc3\u539f\u7406\uff1a \u901a\u8fc7\u7ed9\u7c7b\u52a0\u4e0a\u4e00\u4e2a\u88c5\u9970\u5668 @log\uff0c\u52a8\u6001\u7ed9\u8be5\u7c7b\u4e0b\u6240\u6709\u7684\u51fd\u6570\u53ca\u7236\u7c7b\u51fd\u6570\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668 @_trace\uff0c\u5728\u6b64\u88c5\u9970\u5668\u4e2d\u6211\u4eec\u80fd\u52a8\u6001\u7684\u6355\u83b7\u6240\u8c03\u7528\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff08func.__doc__\uff09\uff0c\u901a\u8fc7\u65e5\u5fd7\u8f93\u51fa\u5668\u5c06\u5176\u8f93\u51fa\u5373\u53ef\u3002 \u5b9e\u73b0\u6b65\u9aa4\uff1a \u901a\u8fc7 inspect.getmembers \u83b7\u53d6\u88ab\u88c5\u9970\u7684\u7c7b\u4e0b\u6240\u6709\u51fd\u6570\uff0c\u5305\u542b\u9759\u6001\u65b9\u6cd5\uff0c\u7c7b\u65b9\u6cd5\uff0c\u5b9e\u4f8b\u65b9\u6cd5\uff1b \u901a\u8fc7 setattr(\u7c7b, \u65b9\u6cd5, _trace\uff09 \u7684\u65b9\u5f0f\uff0c\u7ed9\u7b26\u5408\u6761\u4ef6\u7684\u51fd\u6570\uff0c\u52a8\u6001\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_3","title":"3\u3001\u65e5\u5fd7\u914d\u7f6e","text":"[log_cli]\n;\u65e5\u5fd7\u76f8\u5173\u914d\u7f6e\uff08\u4e0d\u6253\u5370\u6784\u9020\u51fd\u6570\u548c\u9b54\u6cd5\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff09\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = INFO\n# ============= \u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u914d\u7f6e ================\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u5f00\u5934\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7, \u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_STARTSWITH = Assert\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u7ed3\u5c3e\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_ENDSWITH = Widget\n;\u652f\u6301\u7c7b\u540d\u5305\u542b xxx \u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_CONTAIN = ShortCut\n# ==============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_3","title":"4\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u5728\u5e94\u7528\u5e93 widget \u65b9\u6cd5\u5e93\u91cc\u9762\uff0c\u53ea\u9700\u8981\u5728\u51fa\u53e3\u6587\u4ef6\u52a0\u4e0a\u7c7b\u88c5\u9970\u5668\uff0c\u5c31\u53ef\u4ee5\u5b9e\u73b0\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u4e86\uff1b # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6ce8\u610f\uff0c\u662f\u7c7b\u88c5\u9970\u5668\u3002 \u5b9e\u4f8b\uff1a # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\n@classmethod\ndef find_dfm_image(cls, *elements, multiple=False, rate=0.9):\n\"\"\"\n \u67e5\u627e\u56fe\u7247 {{elements}}.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e {{rate}} \u7684\u5750\u6807\n :param elements:\n :param multiple:\n :return:\n \"\"\"\nelement = tuple(map(lambda x: f\"{Config.PIC_RES_PATH}/{x}\", elements))\nreturn cls.find_image(*element, multiple=multiple)\n \u8c03\u7528\u65b9\u6cd5\u65f6\uff1a DfmWidget.find_dfm_image(\"dfm_001\")\n \u81ea\u52a8\u8f93\u51fa\u7684\u65e5\u5fd7\uff1a >> x86_64-uos-6: 02/28 17:48:47 | INFO | logger_utils: [find_dfm_image]: \u67e5\u627e\u56fe\u7247 dfm_001.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e 0.9 \u7684\u5750\u6807\n \u52a0\u4e0a\u88c5\u9970\u5668 @log \u4e4b\u540e\uff0c\u65b9\u6cd5\u5c42\u6240\u6709\u7684\u51fd\u6570\uff08\u5305\u62ec\u5b9e\u4f8b\u65b9\u6cd5\u3001\u7c7b\u65b9\u6cd5\u3001\u9759\u6001\u65b9\u6cd5\uff09\u90fd\u4e0d\u9700\u8981\u518d\u5199\u65e5\u5fd7\u4ee3\u7801\uff0c\u6267\u884c\u7684\u65f6\u5019\u4f1a\u81ea\u52a8\u8f93\u51fa\uff0c\u5e76\u4e14\u6240\u6709\u8c03\u7528\u7684\u65b9\u6cd5\u4f1a\u4ee5 allure.step \u7684\u65b9\u5f0f\uff0c\u5c55\u793a\u5728 allure \u62a5\u544a\u4e2d\uff0c\u5728\u62a5\u544a\u4e2d\u66f4\u80fd\u4e00\u76ee\u4e86\u7136\u7684\u770b\u5230\u7528\u4f8b\u6267\u884c\u6b65\u9aa4\u3002 \u3010\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\u3011 \u901a\u8fc7\u89c2\u5bdf\u524d\u9762\u7684\u4f8b\u5b50\uff0c\u7ec6\u5fc3\u7684\u540c\u5b66\u53ef\u80fd\u8fd8\u53d1\u73b0\u4e86\u4e00\u4e2a\u5c0f\u7ec6\u8282\uff1a\u51fd\u6570\u529f\u80fd\u8bf4\u660e\u4e2d\uff0c\u4e24\u5bf9\u5927\u62ec\u53f7\u4e2d\u7684\u5185\u5bb9 {{elements}} \u4f5c\u4e3a\u53d8\u91cf\u8f93\u51fa\u51fa\u6765\u4e86\uff1b \u6ca1\u9519\uff0c\u8fd9\u5c31\u662f\u6211\u4eec\u53c2\u8003Django \u548c jinja2 \u7684\u6a21\u677f\u8bed\u6cd5\u8bbe\u8ba1\u51fa\u7684\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\uff0c\u4f7f\u7528\u65b9\u6cd5\u5f88\u7b80\u5355\uff0c\u7528\u4e24\u5bf9\u5927\u62ec\u53f7\u628a\u51fd\u6570\u7684\u53c2\u6570\u62ec\u8d77\u6765\uff0c\u8fd9\u6837\u5728\u65e5\u5fd7\u8f93\u51fa\u7684\u65f6\u5019\u5c31\u80fd\u628a\u8c03\u7528\u51fd\u6570\u65f6\u53c2\u6570\u7684\u503c\u8f93\u51fa\u51fa\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_7","title":"\u516b\u3001\u73af\u5883\u90e8\u7f72","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_6","title":"1\u3001\u539f\u5219","text":"YouQu \u7684\u73af\u5883\u4f9d\u8d56\u4e00\u76f4\u575a\u6301 2 \u4e2a\u539f\u5219\uff1a \u6700\u5c0f\u73af\u5883\u4f9d\u8d56\u539f\u5219 \u6709\u4e9b\u540c\u5b66\u5199\u4e00\u4e9b\u529f\u80fd\uff0c\u9996\u5148\u60f3\u5230\u7684\u5c31\u662f\u53bb\u641c\u7d22\u5f15\u64ce\u641c\u4e00\u4e0b\uff0c\u770b\u6709\u6ca1\u6709\u73b0\u6210\u7684\u5de5\u5177\u6216\u8005\u4ee3\u7801\u76f4\u63a5\u80fd\u7528\uff0c\u7f8e\u5176\u540d\u66f0\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\uff0c\u522b\u4eba\u5df2\u7ecf\u9020\u597d\u4e86\u8f6e\u5b50\u54b1\u4eec\u5c31\u4e0d\u8981\u91cd\u590d\u53bb\u9020\u4e86\uff0c\u7136\u540e\u4e00\u5207\u4f3c\u4e4e\u90fd\u53d8\u5f97\u90a3\u4e48\u7684\u7406\u6240\u5e94\u5f53\u3002 \u5f53\u7136\u8fd9\u6837\u505a\u65e0\u53ef\u539a\u975e\uff0c\u6211\u76f8\u4fe1\u6709\u8fd9\u6837\u60f3\u6cd5\u5e76\u4e14\u4e00\u76f4\u8df5\u884c\u8fd9\u6837\u505a\u6cd5\u7684\u540c\u5b66\u4e0d\u5728\u5c11\u6570\uff0c\u4f46\u8fd9\u6837\u505a\u6709\u4e00\u4e2a\u5f88\u4e25\u91cd\u7684\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f60\u5199\u4e00\u4e2a\u5927\u578b\u9879\u76ee\u65f6\uff0c\u4f60\u4f1a\u5f15\u5165\u975e\u5e38\u975e\u5e38\u975e\u5e38\u591a\u7684\u4f9d\u8d56\uff0c\u6bd4\u5982\u8981\u505a\u4e2a\u63a5\u53e3\u8bf7\u6c42\u8981\u7528 requests\u3001\u8bfb\u5199\u4e2a\u6570\u636e\u7528 pandas\u3001\u5199\u4e2a\u8868\u683c\u7528 pyopenxl\u3001\u89e3\u6790\u4e2a\u6587\u672c\u8981\u7528\u8fd9\u4e2a\u90a3\u4e2a\u4e09\u65b9\u5e93 ... \u3002 \u6211\u8ba4\u4e3a\u8fd9\u662f\u975e\u5e38\u4e0d\u597d\u7684\u4e60\u60ef\uff0c\u5728\u5b9e\u73b0\u4e00\u4e2a\u529f\u80fd\u7684\u65f6\u5019\uff0c\u9996\u5148\u6211\u4eec\u5e94\u8be5\u53bb\u60f3\u81ea\u5df1\u600e\u4e48\u6837\u53bb\u5b9e\u73b0\uff0c\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff1b \u5982\u679c\u4f60\u4e0d\u4f1a\uff0c\u4f60\u53ef\u4ee5\u53bb\u5b66\u4e60\u4e09\u65b9\u5e93\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u522b\u4eba\u4e09\u65b9\u5e93\u4e5f\u662f\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\u7684\uff0c\u4e3a\u4ec0\u4e48\u54b1\u4eec\u4e0d\u884c\u5462\uff1b\u5982\u679c\u522b\u4eba\u7684\u4f60\u5b9e\u5728\u662f\u770b\u4e0d\u61c2\uff0c\u60f3\u5c3d\u4e00\u5207\u529e\u6cd5\u786e\u5b9e\u505a\u4e0d\u51fa\u6765\uff0c\u90a3\u518d\u8003\u8651\u5f15\u5165\u8fd9\u4e2a\u4e09\u65b9\u5e93\uff0c\u6211\u8ba4\u4e3a\u8fd9\u6837\u662f\u6ca1\u95ee\u9898\u7684\uff0c\u6bd5\u7adf\u54b1\u4eec\u6bb5\u4f4d\u8fd8\u4e0d\u591f\uff0c\u4f46\u5e0c\u671b\u5c06\u6765\u6709\u4e00\u5929\u6211\u4eec\u53ef\u4ee5\u3002 \u8fd9\u6837\u7684\u505a\u6cd5\u624d\u5e94\u8be5\u662f\u201c\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\u201d\u6b63\u786e\u7684\u64cd\u4f5c\u3002\u4e0d\u4f1a\u6ca1\u5173\u7cfb\uff0c\u770b\u770b\u522b\u4eba\u662f\u600e\u4e48\u5b9e\u73b0\u7684\uff0c\u81ea\u5df1\u518d\u6478\u7d22\u7740\u5199\u51fa\u6765\uff0c\u8fd9\u6837\u81ea\u5df1\u624d\u80fd\u6709\u6240\u63d0\u9ad8\uff0c\u4e0d\u7136\u4f60\u5c31\u53ea\u4f1a\u7528\u522b\u4eba\u7684\u4e1c\u897f\uff1b\u90a3\u4e9b\u5632\u7b11\u3001\u6279\u8bc4\u6211\u4eec\u91cd\u590d\u9020\u8f6e\u5b50\u7684\u4eba\uff0c\u5148\u60f3\u60f3\u81ea\u5df1\u4f1a\u9020\u8f6e\u5b50\u5417\u3002 \u672c\u7740\u81ea\u5df1\u5b9e\u73b0\u80fd\u5b9e\u73b0\u7684\u4e00\u5207\u7684\u539f\u5219\uff0cYouQu \u6846\u67b6\u505a\u5230\u4e86\u975e\u5e38\u5c11\u7684\u73af\u5883\u4f9d\u8d56\uff0c\u800c\u4e14\u6211\u4eec\u4ecd\u5728\u4e0d\u65ad\u52aa\u529b\uff0c\u51cf\u5c11\u73af\u5883\u90e8\u7f72\u7684\u4f9d\u8d56\u3002 \u6700\u5c0f\u4ed3\u5e93\u4f53\u79ef\u539f\u5219 \u5927\u6587\u4ef6\u4e0d\u80fd\u4e0a\u4f20\u5230\u5de5\u7a0b\u91cc\u9762\uff0c\u4fdd\u6301\u6574\u4e2a\u5de5\u7a0b\u7684\u8f7b\u91cf\u5316\uff0c\u8fd9\u6837\u5728\u514b\u9686\u4ee3\u7801\u7684\u65f6\u5019\u624d\u80fd\u975e\u5e38\u5feb\u901f\u65b9\u4fbf\u4f7f\u7528\uff0c\u6211\u4eec\u89c1\u8fc7\u4e00\u4e2a AT \u5de5\u7a0b clone \u5927\u5c0f\u8fbe\u5230\u597d\u51e0\u4e2a G\uff0c\u7b80\u76f4\u4e0d\u53ef\u601d\u8bae\u3002 \u5176\u5b9e\u4ee3\u7801\u6587\u4ef6\u7684\u5927\u5c0f\u662f\u5f88\u5c0f\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u7eaf\u5199\u4ee3\u7801\u968f\u4fbf\u5199\u5de5\u7a0b\u4e5f\u4e0d\u4f1a\u592a\u5927\uff0c\u800c\u6587\u6863\uff08\u5305\u542b\u63d2\u56fe\uff09\u7b49\u8d44\u6e90\u5374\u662f\u5f88\u5360\u7a7a\u95f4\u3002 \u56e0\u6b64\u6211\u4eec\u9009\u62e9\u5c06 YouQu \u7684\u6587\u6863\u5de5\u7a0b\u6d89\u53ca\u5230\u7684\u56fe\u7247\u8d44\u6e90\u90fd\u91c7\u7528\u5916\u94fe\u52a0\u8f7d\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_6","title":"2\u3001\u5b89\u88c5","text":"\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u8fd0\u884c env.sh \u5373\u53ef\u3002 bash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_4","title":"3\u3001\u5b9a\u5236\u4f9d\u8d56","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_2","title":"3.1\u3001\u65b0\u589e\u4f9d\u8d56","text":"\u5982\u679c\u5e94\u7528\u5e93\u8fd8\u9700\u8981\u5176\u4ed6 Python \u4f9d\u8d56\u5e93\uff0c\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a requirement.txt \u6587\u4ef6\uff1b autotest_xxx\n\u251c\u2500\u2500 requirement.txt\n\u251c\u2500\u2500 case ...\n \u91cc\u9762\u5199\u5165\u9700\u8981\u5b89\u88c5\u7684\u4e09\u65b9\u4f9d\u8d56\uff0c\u6bd4\u5982\u50cf\u8fd9\u6837\uff1a # requirement.txt\nPyYAML==6.0 # \u6307\u5b9a\u5b89\u88c5\u67d0\u4e2a\u7248\u672c\nrequests # \u672a\u6307\u5b9a\u7248\u672c\u5219\u5b89\u88c5\u6700\u65b0\u7248\n \u5728\u6267\u884c bash env.sh \u65f6\u4f1a\u4e00\u5e76\u5c06\u5176\u5b89\u88c5\u3002 \u5982\u679c\u591a\u4e2a\u5e94\u7528\u5e93\u90fd\u5b58\u5728 requirement.txt \u6587\u4ef6\uff0c\u6267\u884c env.sh \u65f6\u4f1a\u5c06\u591a\u4e2a requirement.txt \u6587\u4ef6\u4e00\u5e76\u52a0\u8f7d\uff1b\u90a3\u4e48\u4e00\u5b9a\u8981\u6ce8\u610f\u591a\u4e2a requirement.txt \u6587\u4ef6\u53ef\u80fd\u5b58\u5728\u76f8\u540c\u7684\u4f9d\u8d56\u88ab\u6307\u5b9a\u5b89\u88c5\u4e0d\u540c\u7248\u672c\u7b49\u7b49\u517c\u5bb9\u6027\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32_1","title":"3.2\u3001\u88c1\u526a\u4f9d\u8d56","text":"\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0c\u53ef\u80fd\u4f60\u53ea\u9700\u8981\u5b89\u88c5\u4e00\u4e9b\u6700\u6700\u57fa\u7840\u7684\u4f9d\u8d56\uff0c\u5176\u4ed6\u7684\u90fd\u4e0d\u9700\u8981\uff0c\u6bd4\u5982\u7eaf\u63a5\u53e3\u81ea\u52a8\u5316\u7684\u9879\u76ee\uff0c\u5b83\u4e0d\u9700\u8981 UI \u81ea\u52a8\u5316\u76f8\u5173\u7684\u4f9d\u8d56\u3002 \u4f60\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\uff0c\u5b58\u653e\u4e00\u4e2a BASICENV \u7684\u666e\u901a\u6587\u4ef6\uff0c\u91cc\u9762\u4e0d\u9700\u8981\u5199\u4efb\u4f55\u5185\u5bb9\uff0c\u8fd9\u6837\u6267\u884c env.sh \u65f6\uff0c\u53ea\u4f1a\u5b89\u88c5\u6700\u57fa\u7840\u7684\u4f9d\u8d56\u3002 autotest_xxx\n\u251c\u2500\u2500 BASICENV # \u53ef\u4ee5\u4f7f\u7528\uff1atouch BASICENV \u521b\u5efa\u6587\u4ef6\n\u251c\u2500\u2500 case ...\n \u57fa\u7840\u4f9d\u8d56\u4ec5\u5b89\u88c5\u4ee5\u4e0b\u51e0\u4e2a\u5305\uff1a pytest # pytest\npytest-rerunfailures # \u5931\u8d25\u91cd\u8dd1\u63d2\u4ef6\npytest-timeout # \u7528\u4f8b\u8d85\u65f6\u63d2\u4ef6\nallure-pytest # \u751f\u6210 allure \u62a5\u544a\u63d2\u4ef6\nallure.deb # allure \u62a5\u544a\u67e5\u770b\u5de5\u5177\n \u88c1\u526a\u4f9d\u8d56 \u548c \u65b0\u589e\u4f9d\u8d56 \u662f\u4e0d\u51b2\u7a81\u7684\uff0c\u53ef\u4ee5\u540c\u65f6\u4f7f\u7528\u3002 \u6b64\u65b9\u6848\u9ed8\u8ba4\u4e3a\u865a\u62df\u73af\u5883\u90e8\u7f72\uff0c\u5982\u679c\u4f60\u60f3\u76f4\u63a5\u90e8\u7f72\u5728\u672c\u673a\u4e0a\uff1a bash env_dev.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_4","title":"4\u3001\u865a\u62df\u5316\u90e8\u7f72","text":"YouQu\u9ed8\u8ba4\u91c7\u7528\u865a\u62df\u5316\u90e8\u5206\uff0c\u865a\u62df\u5316\u73af\u5883\u5b9e\u9645\u5b89\u88c5\u7684\u4f4d\u7f6e\u662f\u5728 $HOME/.local/share/virtualenvs/youqu-oHTM7l7G \u76ee\u5f55\u4e0b youqu-oHTM7l7G \u6b64\u76ee\u5f55\u540d\u79f0\u524d\u9762\u90e8\u5206\u662f\u4f60\u7684\u4ee3\u7801\u6839\u76ee\u5f55\u7684\u540d\u79f0\uff0c\u540e\u9762\u90e8\u5206\u662f\u751f\u6210\u7684\u968f\u673a\u5b57\u7b26\u4e32\uff1b \u540c\u5b66\u4eec\u5728\u8fdc\u7a0b\u673a\u5668\u4e0a\u5b9a\u4f4d\u95ee\u9898\u7684\u65f6\u5019\uff0c\u5982\u679c\u4f7f\u7528 Pycharm \u8c03\u8bd5\uff0c\u5c31\u5c06\u89e3\u91ca\u5668\u6307\u5b9a\u5230\u8fd9\u4e2a\u76ee\u5f55\u7684\u5c31\u884c\u4e86\uff1b \u5f53\u7136\uff0c\u6211\u4eec\u4e5f\u63d0\u4f9b\u4e86\u672c\u673a\u5f00\u53d1\u73af\u5883\u90e8\u7f72\uff1a bash env_dev.sh\n \u5982\u679c\u4f60\u662f\u672c\u5730\u5f00\u53d1\u73af\u5883\u53ef\u4ee5\u7528\u5b83\uff0c\u533a\u522b\u5c31\u662f\u9a71\u52a8\u6267\u884c\u7684\u65f6\u5019\u4f7f\u7528\uff1apython3 manage.py xxx"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_8","title":"\u4e5d\u3001\u5931\u8d25\u5f55\u5c4f","text":"\u5f55\u5c4f\u5176\u5b9e\u662f\u4e00\u79cd\u89c6\u9891\u5f62\u5f0f\u7684\u65e5\u5fd7\uff0c\u56e0\u4e3a\u5f88\u591a\u65f6\u5019\u6211\u4eec\u5728\u67e5\u770b\u65e5\u5fd7\u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u51c6\u786e\u7684\u5b9a\u4f4d\u5230\u7528\u4f8b\u5931\u8d25\u7684\u5177\u4f53\u539f\u56e0\uff0c\u56e0\u6b64\u7528\u4f8b\u7684\u5f55\u5c4f\u80fd\u8ba9\u6211\u4eec\u770b\u5230\u7528\u4f8b\u5728\u6267\u884c\u8fc7\u7a0b\uff1b \u3010\u4f7f\u7528\u65b9\u6cd5\u3011 \u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u5173\u6ce8 2 \u4e2a\u53c2\u6570\uff1b ;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\u3002\n;\u6ce8\u610f\uff0c\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u4e0d\u80fd\u5c0f\u4e8e\u5931\u8d25\u5f55\u5c4f\u6b21\u6570\uff0c\u5373 RERUN >= RECORD_FAILED_CASE\nRECORD_FAILED_CASE = 1\n \u9ed8\u8ba4\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u662f 1 \u6b21\uff1b RECORD_FAILED_CASE = 1 \u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff1b RECORD_FAILED_CASE = 0 \u8868\u793a\u4e0d\u7ba1\u7528\u4f8b\u6210\u529f\u6216\u5931\u8d25\u90fd\u5f55\u5c4f\uff1b \u5f55\u5c4f\u662f\u8981\u5360\u7528\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u7279\u522b\u662f\u5728\u4e00\u4e9b\u914d\u7f6e\u8f83\u4f4e\u7684\u673a\u5668\u4e0a\u4f1a\u5f88\u660e\u663e\uff0c\u6240\u4ee5\u4f60\u9700\u8981\u8003\u8651\u662f\u5426\u6709\u5fc5\u8981\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1b \u4f7f\u7528 manage.py \u6267\u884c\u7528\u4f8b\u9ed8\u8ba4\u8bfb\u53d6\u5230 globalconfig.ini \u91cc\u9762\u7684\u53c2\u6570\uff0c\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report/record \u76ee\u5f55\u4e0b\u4fdd\u5b58\u5931\u8d25\u7528\u4f8b\u7684\u5f55\u5c4f\u548c\u65ad\u8a00\u7684\u90a3\u4e2a\u65f6\u95f4\u70b9\u7684\u622a\u5c4f\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7\u89c6\u9891\u6587\u4ef6\u770b\u5230\u5931\u8d25\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u90fd\u53d1\u751f\u4e86\u4ec0\u4e48\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#wayland","title":"\u5341\u3001Wayland \u9002\u914d","text":"Wayland \u4e0b\u81ea\u52a8\u5316\u4e3b\u8981\u95ee\u9898\u662f X11 \u4e0b\u7684\u952e\u9f20\u64cd\u4f5c\u65b9\u6cd5\u65e0\u6cd5\u4f7f\u7528\uff0c\u6bd4\u5982 Xdotool\u3001 PyAutoGUI\u3001Xwininfo \u7b49\u7b49\uff1b YouQu \u5728 Wayland \u4e0b\u517c\u5bb9\u9002\u914d\uff0cenv.sh \u5728 Wayland \u4e0b\u6267\u884c\u65f6\u4f1a\u5b89\u88c5\u81ea\u7814\u7684\u952e\u9f20\u64cd\u4f5c\u670d\u52a1\uff08\u53ef\u80fd\u5b58\u5728\u4e00\u4e9b\u4f9d\u8d56\u62a5\u9519\uff0c\u6309\u7167\u6ce8\u91ca\u89e3\u51b3\u5373\u53ef\uff09\uff0c\u6846\u67b6\u6838\u5fc3\u5e93\u4e5f\u9488\u5bf9\u6027\u7684\u505a\u4e86\u9002\u914d\uff0c\u4e0a\u5c42\u7528\u4f8b\u5b8c\u5168\u4e0d\u7528\u5173\u5fc3\u673a\u5668\u662fWayland \u8fd8\u662f X11\uff0c\u6846\u67b6\u4f1a\u6839\u636e\u6267\u884c\u65f6\u72b6\u6001\u81ea\u52a8\u5224\u65ad\u8d70\u4e0d\u540c\u7684\u903b\u8f91\uff1b \u7b80\u5355\u8bb2\u5c31\u662f\uff0c\u5e94\u7528\u5e93\u53ea\u9700\u8981\u7ef4\u62a4\u4e00\u5957\u7528\u4f8b\u811a\u672c\u5373\u53ef\u3002 \u3010\u7528\u4f8b\u517c\u5bb9\u3011 \u56e0\u4e3a Wayland \u4e0b\u6709\u4e9b\u5e94\u7528\u7684\u754c\u9762\u663e\u793a\u548c\u529f\u80fd\u672c\u8eab\u5b58\u5728\u4e00\u4e9b\u5dee\u5f02\uff0c\u7528\u4f8b\u5c42\u53ef\u80fd\u9700\u8981\u5bf9\u8fd9\u90e8\u5206\u7528\u4f8b\u505a\u903b\u8f91\u5224\u65ad\uff0c\u4f7f\u7528\u5168\u5c40\u914d\u7f6e\u91cc\u9762\u7684\u5e38\u91cf\u8fdb\u884c\u903b\u8f91\u7f16\u5199\u5373\u53ef\uff1a from setting.globalconfig import GlobalConfig\n# GlobalConfig.IS_WAYLAND \u83b7\u53d6\u5230\u5f53\u524d\u7684\u663e\u793a\u670d\u52a1\u5668\uff08bool\uff09\n# \u5e94\u7528\u5e93 Config \u7ee7\u627f GlobalConfig\nif Config.IS_WAYLAND:\npass\nif Config.IS_X11:\npass\n \u6bd4\u5982\u7528\u4f8b\u91cc\u9762\u5982\u679c\u65ad\u8a00\u7684\u56fe\u7247\u4e0d\u540c\uff1a if Config.IS_WAYLAND:\nself.assert_image_exist(\"wayland_XXX\")\nelse:\nself.assert_image_exist(\"x11_XXX\")\n \u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u811a\u672c\u5728 Wayland \u548c X11 \u4e0b\u90fd\u53ef\u4ee5\u8dd1\uff0cso easy \u662f\u4e0d\u662f\uff1f\u5b8c\u5168\u6ca1\u5fc5\u8981\u4e13\u95e8\u62c9\u65b0\u5206\u652f\u8fdb\u884c Wayland \u9002\u914d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_9","title":"\u5341\u4e00\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_7","title":"1. \u76ee\u5f55\u7ed3\u6784","text":"\u6267\u884c\u65f6\u4f1a\u5728\u6839\u76ee\u5f55\u4e0b\u52a8\u6001\u751f\u6210 report \u76ee\u5f55\uff0c\u6240\u6709\u7684\u62a5\u544a\u76f8\u5173\u7684\u6587\u4ef6\u4f1a\u7edf\u4e00\u5b58\u653e\u5728\u91cc\u9762\uff0c\u793a\u4f8b\uff1a /report\n \u251c\u2500\u2500 allure # allure\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json\n \u251c\u2500\u2500 allure_html # \u751f\u6210\u7684html\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 index.html \u251c\u2500\u2500 allure_back # allure\u62a5\u544a\u5907\u4efd\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 20221108114823\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json\n \u251c\u2500\u2500 json # json\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 result_deepin-music_20221109134736_1081333.json\n \u251c\u2500\u2500 logs # \u65e5\u5fd7\u6587\u4ef6\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 2022-11-10_debug.log \u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-10_error.log\n \u251c\u2500\u2500 record # \u5f55\u5c4f\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-09\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 15\u65f614\u520609\u79d2_test_music_303_2_autotest.mp4\n \u2514\u2500\u2500 xml # xml\u62a5\u544a\n\u2514\u2500\u2500 autotest_deepin_music-20221109134736.xml\n \u9ed8\u8ba4\u60c5\u51b5\u4e0b\u540c\u65f6\u751f\u6210 html\u3001xml\u3001json\u4e09\u79cd\u5f62\u5f0f\u7684\u62a5\u544a\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_7","title":"2. \u5b9a\u5236\u62a5\u544a","text":"\u6211\u4eec\u5bf9 allure \u62a5\u544a\u8fdb\u884c\u4e86\u4e00\u7cfb\u5217\u7684\u5b9a\u5236\uff1a \u5b9a\u5236 logo\u3001title\u3001\u62a5\u544a\u9ed8\u8ba4\u8bed\u8a00\u4e3a\u4e2d\u6587\uff1b \u52a0\u5165\u4e86\u7528\u4f8b\u65ad\u8a00\u5931\u8d25\u65f6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u4ee5\u53ca\u6b64\u65f6\u56fe\u50cf\u5bf9\u6bd4\u7684\u6a21\u677f\u56fe\u7247\uff1b \u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\uff0c\u4f60\u53ef\u4ee5\u5728 html \u62a5\u544a\u4e2d\u76f4\u63a5\u770b\u5f55\u5236\u7684\u89c6\u9891\uff1b \u52a0\u5165\u4e86 IP \u5730\u5740\u3001\u7cfb\u7edf\u4fe1\u606f\u3001\u955c\u50cf\u7248\u672c\u7b49\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_5","title":"3. \u67e5\u770b\u62a5\u544a","text":" \u672c\u5730\u6267\u884c \u5728 report/allure \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u4e00\u5806\u6587\u672c\u6587\u4ef6\uff0c\u8fd9\u4e9b\u662f allure \u63d2\u4ef6\u751f\u6210\u7684\u62a5\u544a\u6e90\u6570\u636e\uff0c\u6211\u4eec\u5728 report/allure_html \u76ee\u5f55\u4e0b\u7ed9\u4f60\u751f\u6210\u4e86 html \u6587\u4ef6\uff0c\u4f46\u662f\u4f60\u4e0d\u80fd\u76f4\u63a5\u901a\u8fc7\u6d4f\u89c8\u5668\u6253\u5f00 index.html \u6587\u4ef6\uff0c\u56e0\u4e3a allure \u7684\u62a5\u544a\u90fd\u662f\u57fa\u4e8e\u5728\u7ebf\u7684\u670d\u52a1\uff0c\u4f60\u5e94\u8be5\u8fd9\u6837\u6253\u5f00\uff1a allure open report/allure_html\n \u4f7f\u7528 manage.py \u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u5728\u7ec8\u7aef\u7684\u6700\u540e\u4e00\u884c\uff0c\u6211\u4eec\u4f1a\u7ed9\u4f60\u8f93\u51fa\u6253\u5f00\u62a5\u544a\u7684\u547d\u4ee4\uff0c\u76f4\u63a5\u590d\u5236\u5b83\u5728\u7ec8\u7aef\u6267\u884c\u5c31\u53ef\u4ee5\u67e5\u770b\u4e86\uff0c\u50cf\u8fd9\u6837\uff1a \u7ec8\u7aef\u6267\u884c\u547d\u4ee4: allure open /tmp/youqu/report/allure_html \u67e5\u770b\u62a5\u544a \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 Pycharm \u91cc\u9762\u627e\u5230 index.html \u6587\u4ef6\uff0c\u7136\u540e\u53f3\u952e\u9009\u62e9\u6d4f\u89c8\u5668\u6253\u5f00\uff0c\u6216\u8005\u4f60\u53ef\u4ee5\u7528\u4e00\u4e2a http \u670d\u52a1\u6253\u5f00\u3002 \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 report/allure \u76ee\u5f55\u4e0b\u67e5\u770b\u62a5\u544a\uff1a allure serve report/allure\n \u8fdc\u7a0b\u6267\u884c \u8fdc\u7a0b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\uff0c\u4f1a\u5c06\u6240\u6709\u8fdc\u7a0b\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u62a5\u544a\u90fd\u6536\u96c6\u5230 report/allure \u76ee\u5f55\u4e0b\uff0c\u5206\u522b\u6309\u7167\u673a\u5668\u7684 IP \u7b49\u5efa\u4e86\u4e0d\u540c\u7684\u76ee\u5f55\uff0c\u4f60\u53ef\u4ee5\u5728\u8fd9\u4e9b\u76ee\u5f55\u91cc\u9762\u53bb\u67e5\u770b\u5bf9\u5e94\u7684\u6d4b\u8bd5\u62a5\u544a\uff0c\u67e5\u770b\u65b9\u6cd5\u548c\u524d\u9762\u672c\u5730\u6267\u884c\u67e5\u770b\u7684\u65b9\u6cd5\u4e00\u6837\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_10","title":"\u5341\u4e8c\u3001\u9759\u6001\u4ee3\u7801\u626b\u63cf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_8","title":"1. \u63d0\u524d\u89e3\u51b3\u4ee3\u7801\u95ee\u9898","text":"\u4e3a\u4e86\u5e2e\u52a9\u5f00\u53d1\u8005\u7edf\u4e00\u4ee3\u7801\u98ce\u683c\uff0cPython \u793e\u533a\u63d0\u51fa\u4e86 PEP8 \u4ee3\u7801\u7f16\u7801\u98ce\u683c\uff0cPython \u5b98\u65b9\u540c\u65f6\u63a8\u51fa\u4e86\u4e00\u4e2a\u68c0\u67e5\u4ee3\u7801\u98ce\u683c\u662f\u5426\u7b26\u5408 PEP8 \u7684\u5de5\u5177\uff0c\u540d\u5b57\u4e5f\u53eb PEP8\u3002 \u4f46\u662f\uff0cPycharm \u91cc\u9762\u7684 PEP8 \u63d2\u4ef6\u5b9e\u9645\u4e0a\u5e76\u4e0d\u80fd\u53d1\u73b0\u5f88\u591a\u4ee3\u7801\u95ee\u9898\uff0c\u8fd9\u4e9b\u95ee\u9898\u5e76\u4e0d\u4f1a\u5728\u8fd0\u884c\u65f6\u62a5\u9519\uff0c\u56e0\u4e3a\u4ece Python \u8bed\u8a00\u89d2\u5ea6\u5e76\u4e0d\u5173\u5fc3\u8fd9\u4e9b\u95ee\u9898\uff0c\u5728 Pycharm \u7f16\u8f91\u5668\u91cc\u9762\u4f7f\u7528\u5feb\u6377\u952e ctrl + alt + L\uff0c\u6709\u4e00\u70b9\u70b9\u683c\u5f0f\u5316\u7684\u6548\u679c\uff0c\u80fd\u89e3\u51b3\u4e00\u4e9b\u7a7a\u683c\u3001\u6362\u884c\u7b49\u5c0f\u95ee\u9898\u3002 \u8fd9\u91cc\u63a8\u8350\u4e00\u4e2a Python \u793e\u533a\u6d41\u884c\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff1a Black\uff0c\u53f7\u79f0\u4e0d\u59a5\u534f\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff0c\u5b83\u68c0\u6d4b\u5230\u4e0d\u7b26\u5408\u89c4\u8303\u7684\u4ee3\u7801\u98ce\u683c\u76f4\u63a5\u5c31\u5e2e\u4f60\u5168\u90e8\u683c\u5f0f\u5316\u597d\uff0c\u5c31\u662f\u8fd9\u4e48\u521a\uff01 \u5b89\u88c5\uff1a sudo pip3 install black \n \u4f7f\u7528\u65b9\u6cd5\uff1a black ${CheckPath}\n \u4f7f\u7528\u8fd9\u4e2a\u5de5\u5177\u683c\u5f0f\u5316\u4e4b\u540e\uff0c\u4ee3\u7801\u4f1a\u88ab\u81ea\u52a8\u8c03\u6574\uff0c\u521a\u5f00\u59cb\u4f60\u53ef\u80fd\u4f1a\u89c9\u5f97\u8c03\u6574\u5f97\u5f88\u5938\u5f20\uff0c\u6ca1\u5173\u7cfb\u575a\u6301\u770b\uff0c\u4e60\u60ef\u4e4b\u540e\uff0c\u4f60\u4f1a\u89c9\u5f97\u5f88\u4f18\u96c5\uff0c\u6ca1\u9519\uff0c\u8fd9\u5c31\u662f Pythonic Code \u7684\u6838\u5fc3\uff0c\u8bf7\u4fdd\u6301\u4f18\u96c5\uff5e\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_8","title":"2. \u4ee3\u7801\u626b\u63cf\u5de5\u5177","text":"\u4f7f\u7528\u6839\u76ee\u5f55\u4e0b pylint.sh \u626b\u63cf\u4ee3\u7801\uff0c\u5728 report \u76ee\u5f55\u4e0b\u67e5\u770b\u4ee3\u7801\u626b\u63cf\u62a5\u544a\uff0c\u5982\u679c\u6709\u4ee3\u7801\u95ee\u9898\u8bf7\u63d0\u524d\u89e3\u51b3\u4e4b\u540e\u518d\u63d0\u4ea4\u3002 \u6b64\u811a\u672c\u5df2\u7ecf\u4f7f\u7528 Python \u793e\u533a\u6700\u6d41\u884c\u7684\u4ee3\u7801\u626b\u63cf\u5de5\u5177 Pylint \u8fdb\u884c\u4ee3\u7801\u626b\u63cf\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a bash pylint.sh\n \u8fd0\u884c\u4e4b\u540e\u4f1a\u63d0\u793a\u4f60\u8981\u626b\u63cf\u7684\u76ee\u5f55\uff0c\u6bd4\u5982\u8f93\u5165 apps \uff0c\u5219\u4f1a\u626b\u63cf apps \u4e0b\u7684\u6240\u6709 Python \u4ee3\u7801\u3002 \u5728 setting/pylintrc.cfg \u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u76f8\u5173\u914d\u7f6e\uff0c\u626b\u63cf\u5b8c\u6210\u4e4b\u540e\u5728 report/pylints \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u626b\u63cf\u62a5\u544a\u3002 \u4ee3\u7801\u63d0\u4ea4\u9700\u901a\u8fc7 git review \u63d0\u4ea4\u5230 gerrit \uff0c\u4eba\u5de5 Code Review \u901a\u8fc7\u4e4b\u540e\u5408\u5165\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_11","title":"\u5341\u4e09\u3001\u63d0\u4ea4\u4ee3\u7801","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_9","title":"1. \u5b89\u88c5\u4f9d\u8d56","text":"sudo apt install git-review\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_9","title":"2. \u63d0\u4ea4\u6a21\u677f","text":"\u5728 ~ \u76ee\u5f55\u4e0b\u65b0\u5efa\u6587\u4ef6\uff0c\u5e76\u547d\u540d\u4e3a gitcommit_template \u5c06\u4ee5\u4e0b\u5185\u5bb9\u5199\u5165\u6587\u4ef6\u5f53\u4e2d\uff1a # commit type :fix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style(\u98ce\u683c\u4fee\u6539)\u3001refactor(\u91cd\u6784)\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test(\u6d4b\u8bd5) + \u7b80\u5355\u63cf\u8ff0. \u9ed8\u8ba4fix,\u6839\u636e\u60c5\u51b5\u4fee\u6539\nfix: \n\n# \u8be6\u7ec6\u8bf4\u660e\u4ee3\u7801\u7684\u6539\u52a8\uff0c\u5305\u542b\u4ee3\u7801\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u4ee5\u53ca\u4e3a\u4ec0\u4e48\u8fd9\u4e48\u505a\uff0c\u53ef\u80fd\u4f1a\u5f71\u54cd\u54ea\u4e9b\u529f\u80fd\u3002\u5bf9\u4e8e\u4ee3\u7801\u7684\u5ba1\u6838\u8005\uff0c\u9700\u8981\u4ece\u8fd9\u6bb5\u63cf\u8ff0\u4e2d\u80fd\u5b8c\u5168\u7406\u89e3\u4ee3\u7801\u4e2d\u6240\u6709\u6539\u52a8\u7684\u5185\u5bb9\nDescription: \n\n# \u5199\u4e00\u6bb5\u9762\u5411\u4e8e\u4ea7\u54c1\u7684\u603b\u7ed3\u6027\u5185\u5bb9\uff0c\u7528\u4e8e\u81ea\u52a8\u751f\u6210crp\u4e0a\u7684changlog\uff0c\u9700\u8981\u6ce8\u610f\u7684\u4e8b\uff0c\u8fd9\u6bb5\u63cf\u8ff0\u5fc5\u987b\u4ece\u4ea7\u54c1\u7684\u89d2\u5ea6\u8003\u8651\u3002\nLog: \n\n# \u5173\u8054pms\u4e0a\u7684bug\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94bug\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4fee\u590dbug\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Bug: \n\n# \u4fee\u590d github issue \n#Issue: \n\n# \u5173\u8054pms\u4e0a\u7684\u4efb\u52a1\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94\u4efb\u52a1\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4efb\u52a1\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Task: \n \u547d\u4ee4\u884c\u6267\u884c: git config --global commit.template ~/gitcommit_template\n \u6b64\u547d\u4ee4\u5c06\u6a21\u677f\u52a0\u5165\u5230 git \u7684\u63d0\u4ea4\u6a21\u677f\u4e2d\u3002 \u540e\u7eed\u63d0\u4ea4\u7684\u65f6\u5019\u9700\u8981\u5173\u6ce8\u4e00\u4e0b\u51e0\u70b9\uff1a commit type \u5bf9\u5e94\u4e0d\u540c\u7684\u4fee\u6539\u7c7b\u578b\uff1afix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style \uff08\u98ce\u683c\u4fee\u6539\uff09\u3001refactor \uff08\u91cd\u6784\uff09\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test \uff08\u6d4b\u8bd5\uff09 commit type \u5192\u53f7\u540e\u9762\u52a0\u7a7a\u683c\u3002 Description \u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u9700\u8981\u8fdb\u884c\u8be6\u7ec6\u8bf4\u660e\uff0c\u6bd4\u5982\u5bf9\u529f\u80fd\u8fdb\u884c\u5927\u6539\u7b49\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_6","title":"3. \u63a8\u9001\u4ee3\u7801","text":"\u9996\u5148\u6dfb\u52a0 commit \u4fe1\u606f git add \u540e\u9762\u52a0\u6587\u4ef6\u540d\u79f0\n git add . # \u8868\u793a\u6dfb\u52a0\u6240\u6709\u6587\u4ef6\n \u4f7f\u7528\u8fd9\u6761\u547d\u4ee4\u6ce8\u610f\u6709\u4e9b\u4e34\u65f6\u6587\u4ef6\u4e0d\u8981\u63d0\u4ea4\u5230\u4ed3\u5e93\u4e86\u3002 git commit -a\n \u4e4b\u540e\u5728 fix: \u540e\u9762\uff08\u6ce8\u610f\u5192\u53f7\u540e\u9762\u5fc5\u987b\u52a0\u7a7a\u683c\uff0c\u4e0d\u7136\u76f4\u63a5-1\uff09\u5199\u672c\u5730\u63d0\u4ea4\u7684 commit \u4fe1\u606f\uff0c\u7136\u540e\u5c31\u53ef\u4ee5\u63d0\u4ea4\u4ee3\u7801\u4e86 git review branch(\u5f53\u524d\u5206\u652f) -r origin\n \u6700\u597d\u4e00\u6b21 commit\uff0c\u4e00\u6b21 git review \uff0c\u7ecf\u5e38\u6709\u540c\u5b66\u5728\u672c\u5730\u75af\u72c2 commit \u6700\u540e git review \u62a5\u9519\u4e0d\u77e5\u9053\u548b\u56de\u4e8b\u513f\u3002 \u82e5\u4e0d\u60f3\u6bcf\u6b21\u63d0\u4ea4\u90fd\u52a0\u4e0a -r \u9009\u9879\uff0c\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a git config --global gitreview.remote origin \u63d0\u4ea4\u4ee3\u7801\uff0c\u76f4\u63a5\u4f7f\u7528 git review branch<\u76ee\u6807\u5206\u652f>\uff0c\u4f8b\u5982 git review master"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git","title":"4. Git\u6807\u7b7e","text":"Git \u6807\u7b7e\u5b9e\u9645\u4e0a\u662f commit \u7684\u4e00\u4e2a\u522b\u540d\uff0c\u4e3b\u8981\u7528\u4e8e\u7ba1\u7406\u5386\u53f2\u7248\u672c\u3002 \u60f3\u8c61\u4e00\u4e0b\u9886\u5bfc\u8ba9\u4f60\u628a\u4e4b\u524d\u7684\u67d0\u4e2a\u7248\u672c\u7684\u4ee3\u7801\u62c9\u51fa\u6765\u8dd1\uff0c\u4f60\u662f\u4e0d\u662f\u4e56\u4e56\u7684\u53bb\u628a\u6240\u6709\u63d0\u4ea4\u8bb0\u5f55\u62c9\u51fa\u6765\u627e\uff0c\u7136\u540e\u627e\u5230\u90a3\u4e2a\u54c8\u5e0c\u503c\uff0c\u901a\u8fc7\u54c8\u5e0c\u503c\u6765\u68c0\u51fa\u4ee3\u7801\u3002 \u8fd9\u4e00\u5957\u64cd\u4f5c\u4e0b\u6765\u662f\u4e0d\u662f\u5f88\u9ebb\u70e6\uff0c\u8d39\u65f6\u95f4\u8fd8\u4e0d\u4e00\u5b9a\u80fd\u627e\u5f97\u5230\uff0c\u6ca1\u4eba\u80fd\u8bb0\u4f4f\u6bcf\u4e2a\u63d0\u4ea4\u54c8\u5e0c\u503c\u4ee5\u53ca\u8fd9\u6b21\u63d0\u4ea4\u90fd\u6539\u4e86\u54ea\u4e9b\u4ee3\u7801\u3002 \u56e0\u6b64\u7ed9\u63d0\u4ea4\u6253\u4e2a\u6807\u7b7e\uff0c\u5c31\u662f\u628a\u54c8\u5e0c\u503c\u8f6c\u6362\u6210\u4eba\u7c7b\u80fd\u7406\u89e3\u7684\u8bed\u8a00\uff0c\u6bd4\u5982 v1.0\uff0c\u5c31\u53ef\u4ee5\u76f4\u63a5\u901a\u8fc7\u6807\u7b7e\u627e\u5230\u5bf9\u5e94\u7684\u63d0\u4ea4\u3002 \u65b0\u5efa\u6807\u7b7e git tag -a <tagname>\n \u56de\u8f66\u4e4b\u540e\uff0cGit \u4f1a\u6253\u5f00\u4f60\u7684\u7f16\u8f91\u5668\uff0c\u8ba9\u4f60\u5199\u4e00\u53e5\u6807\u7b7e\u6ce8\u89e3\uff0c\u5c31\u50cf\u4f60\u7ed9\u63d0\u4ea4\u5199\u6ce8\u89e3\u4e00\u6837\u3002 \u67e5\u770b\u6240\u6709\u6807\u7b7e git tag -l\n# git tag \u4e5f\u884c\n \u5220\u9664\u6807\u7b7e git tag -d <tagname>\n \u63a8\u9001\u6807\u7b7e\u81f3\u8fdc\u7a0b git push \u547d\u4ee4\u5e76\u4e0d\u4f1a\u4f20\u9001\u6807\u7b7e\u5230\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\uff0c\u5fc5\u987b\u663e\u5f0f\u5730\u63a8\u9001\u6807\u7b7e\u3002 git push origin <tagname>\n \u63a8\u9001\u6240\u6709\u4e0d\u5728\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\u7684\u6807\u7b7e git push origin --tag\n \u5220\u9664\u8fdc\u7a0b\u6807\u7b7e git push origin :refs/tag/<tagname>\n \u540e\u671f\u6253\u6807\u7b7e \u5148\u7528 git log --pretty=oneline \u67e5\u8be2\u63d0\u4ea4\u8bb0\u5f55\uff0c\u83b7\u53d6\u6821\u9a8c\u7801\u3002 git tag -a <tagname> 9fceb02(\u6821\u9a8c\u7801)\n \u68c0\u51fa\u6807\u7b7e git checkout <tagname>\n \u6b64\u65f6\uff0c\u4ed3\u5e93\u4f1a\u5904\u4e8e\u201c\u5206\u79bb\u5934\u6307\u9488\uff08detached HEAD\uff09\u201d\u7684\u72b6\u6001\u3002 \u5728\u201c\u5206\u79bb\u5934\u6307\u9488\u201d\u72b6\u6001\u4e0b\uff0c\u5982\u679c\u4f60\u505a\u4e86\u67d0\u4e9b\u66f4\u6539\u7136\u540e\u63d0\u4ea4\u5b83\u4eec\uff0c\u6807\u7b7e\u4e0d\u4f1a\u53d1\u751f\u53d8\u5316\uff0c \u4f46\u4f60\u7684\u65b0\u63d0\u4ea4\u5c06\u4e0d\u5c5e\u4e8e\u4efb\u4f55\u5206\u652f\uff0c\u5e76\u4e14\u5c06\u65e0\u6cd5\u8bbf\u95ee\uff0c\u9664\u975e\u901a\u8fc7\u786e\u5207\u7684\u63d0\u4ea4\u54c8\u5e0c\u624d\u80fd\u8bbf\u95ee\u3002 \u56e0\u6b64\uff0c\u5982\u679c\u4f60\u9700\u8981\u8fdb\u884c\u66f4\u6539\uff0c\u6bd4\u5982\u4f60\u8981\u4fee\u590d\u65e7\u7248\u672c\u4e2d\u7684\u9519\u8bef\uff0c\u90a3\u4e48\u901a\u5e38\u9700\u8981\u521b\u5efa\u4e00\u4e2a\u65b0\u5206\u652f\uff1a git checkout -b <NewBranchName> <tagname>\n \u65b0\u5206\u652f\u4e0a\u53ef\u4ee5\u8fdb\u884c\u63d0\u4ea4\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_12","title":"\u5341\u56db\u3001\u5e38\u89c1\u95ee\u9898","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_10","title":"1. \u63d0\u4ea4\u4ee3\u7801\u65f6\u63d0\u793a\u90ae\u7bb1\u6216\u8005\u540d\u79f0\u4e0d\u5bf9","text":"\u91cd\u65b0\u914d\u7f6e\u90ae\u7bb1\u6216\u8005\u540d\u79f0\uff0c\u7136\u540e\u91cd\u7f6e\u751f\u6548\uff1a git commit --amend --reset-author\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_10","title":"2. \u600e\u4e48\u56de\u6eda\u5230\u4e4b\u524d\u7684\u7248\u672c","text":"(1)\u67e5\u8be2\u5386\u53f2\u63d0\u4ea4\u8bb0\u5f55 git log\n \u627e\u5230\u4f60\u8981\u56de\u6eda\u7684\u7248\u672c\uff0c\u590d\u5236 hash \u503c\u3002 \u6ce8\u610f\uff1a\u662f commit \u7a7a\u683c\u4e4b\u540e\u7684 hash \u503c\uff0c\u4e4b\u524d\u6709\u540c\u5b66\u590d\u5236\u7684 Change-Id: \u8fd9\u6837\u80af\u5b9a\u62a5\u9519\u3002 (2)\u56de\u6eda\u7248\u672c\uff0c\u4e0d\u6e05\u9664\u4ee3\u7801 git reset --soft ${hash}\n (3)\u56de\u6eda\u7248\u672c\uff0c\u6e05\u9664\u4ee3\u7801\uff0c\u614e\u7528\u54c8 git reset --hard ${hash}\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-f-s-e","title":"3. \u6d4b\u8bd5\u62a5\u544a\u91cc\u9762 F S . E \u662f\u4ec0\u4e48\u610f\u601d","text":"F \u8868\u793a\u5931\u8d25\uff0c. \uff08\u70b9\uff09\u8868\u793a\u901a\u8fc7\uff0cS \u8868\u793a\u8df3\u8fc7\uff0cE \u8868\u793a error \u6709\u62a5\u9519"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git-status","title":"4. \u89e3\u51b3 git status \u4e2d\u6587\u663e\u793a\u7684\u95ee\u9898","text":"git config --global core.quotePath false\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5-apps","title":"5. apps \u76ee\u5f55\u4e0b\u989c\u8272\u6709\u4e9b\u662f\u9ec4\u8272\u7684","text":"\u5728 Pycharm \u4e2d apps \u76ee\u5f55\u4e0b\u5e94\u7528\u5e93\u6587\u4ef6\u662f\u9ec4\u8272\u7684\uff0c\u7f16\u8f91\u5668\u8bc6\u522b\u4e0d\u5230\u4ee3\u7801\u65b0\u589e\u548c\u4fee\u6539\uff1b \u7531\u4e8e\u793e\u533a\u7248 Pycharm \u4e0d\u80fd\u52a8\u6001\u8bc6\u522b\u591a\u4ed3\u5e93\uff0c\u9700\u8981\u5728 setting \u91cc\u9762\u624b\u52a8\u6ce8\u518c\uff0c\u64cd\u4f5c\u6b65\u9aa4\uff1a File \u2014> Settings \u2014> Version Control \u2014> \u70b9 + \u53f7 \u2014> Directory \u9009\u4e2d\u5e94\u7528\u5e93\u5de5\u7a0b\u76ee\u5f55 \u2014> VCS \u9009\u4e2d Git \u2014> Apply \u5982\u6b64\u5c31\u53ef\u4ee5\u4e86\u3002 \u4e13\u4e1a\u7248 Pycharm \u4e0d\u5b58\u5728\u8fd9\u4e2a\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#6-envsh-r","title":"6. \u6267\u884c env.sh \u62a5\u9519 $'\\r':\u672a\u627e\u5230\u547d\u4ee4","text":"\u51fa\u73b0\u8fd9\u4e2a\u95ee\u9898\u4f60\u5e94\u8be5\u662f\u5728 windows \u4e0a\u6253\u5f00\u6216\u7f16\u8f91\u8fc7 env.sh \u811a\u672c\uff0cwindows\u4e0b\u7684\u6362\u884c\u662f\u56de\u8f66\u7b26+\u6362\u884c\u7b26\uff0c\u4e5f\u5c31\u662f\\r\\n\uff0c\u800c Linxu \u4e0b\u662f\u6362\u884c\u7b26 \\n\uff0cLinux \u4e0b\u4e0d\u8bc6\u522b \\r\uff0c\u56e0\u6b64\u62a5\u9519\u3002 \u89e3\u51b3\u65b9\u6848\uff1a # \u5c06 \\r \u66ff\u6362\u4e3a\u7a7a\nsudo sed -i 's/\\r//' env.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#7","title":"7.\u600e\u6837\u4e3a\u5355\u72ec\u67d0\u4e00\u6761\u7528\u4f8b\u914d\u7f6e\u6267\u884c\u8d85\u65f6\u65f6\u95f4","text":"\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u5982\u4e0b\uff1a @pytest.mark.timeout(300) # \u5355\u4f4d\u79d2\ndef test_xxx_001():\npass\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#8-youqu","title":"8. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u6240\u6709\u4ee3\u7801\uff0c\u5305\u542b\u5b50\u4ed3\u5e93","text":"\u524d\u7f6e\u6761\u4ef6\uff1a\u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 # \u7b2c\u4e00\u6b21\u5b58\u50a8\u5bc6\u7801\uff0c\u63d0\u4f9b\u540e\u9762\u62c9\u4ee3\u7801(gerrit: ldap\u8d26\u53f7\u548c\u5bc6\u7801\uff0cgit\u62c9\u53d6\u7b2c\u4e00\u6b21\u8f93\u5165\u4fdd\u5b58\uff0c\u540e\u9762\u76f4\u63a5\u4f7f\u7528)\ngit config --global credential.helper store\n\n# \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\uff0c\u5e76\u9012\u5f52\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\" --recursive\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#9-youqu","title":"9. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\u6307\u5b9a\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u524d\u7f6e\u6761\u4ef6\uff1a \u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 \u5df2\u5b58\u50a8\u8bbf\u95ee\u5bc6\u7801 # \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\"\n# \u6307\u5b9a\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ncd youqu\ngit submodule update --init apps/autotest_xxx_xxx\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#10-youqu","title":"10. \u5982\u4f55\u66f4\u65b0 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\uff0c\u6240\u6709\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u66f4\u65b0\u6240\u6709\u5b50\u4ed3\u5e93\u4ee3\u7801 cd youqu\ngit pull & git submodule foreach git pull\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#11-youqu-master-detached-head","title":"11. \u5982\u4f55\u4fee\u590d YouQu \u6240\u6709\u5b50\u4ed3\u5e93 master \u5206\u652f\u6e38\u79bb\u5934\uff08detached head\uff09","text":"\u4fee\u590d\u6240\u6709\u5b50\u4ed3\u5e93\u9ed8\u8ba4master \u5206\u652f\u6e38\u79bb\u5934 cd youqu\ngit submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/","title":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212 \u5206\u7c7b\uff1a/ \u67b6\u6784\u5e08\uff1a/ \u76ee\u6807\uff1a \u5e94\u7528 AT \u67b6\u6784\u5de5\u7a0b\u5316\uff0c\u53c2\u8003\u6027\u80fd\u81ea\u52a8\u5316\u5de5\u7a0b\u5b8c\u6210\u5de5\u7a0b\u5316\u6539\u9020\u3002 \u5e94\u7528\u95f4\u7528\u4f8b\u89e3\u8026\uff0c\u89e3\u9664\u6240\u6709\u4ea4\u53c9\u8c03\u7528\u7684\u65b9\u6cd5\uff0c\u5404\u5e94\u7528\u80fd\u8ddf\u968f\u81ea\u8eab\u8fed\u4ee3\u5468\u671f\u72ec\u7acb\u7ef4\u62a4 AT \u7528\u4f8b\u3002 \u5b8c\u6210\u516c\u5171\u65b9\u6cd5\u7684\u62bd\u53d6\u6574\u5408\uff0c\u5f62\u6210\u4e00\u5957\u72ec\u7acb\u4e8e\u5e94\u7528\u95f4\u7684\u516c\u5171\u65b9\u6cd5\u5e93\uff0c\u5404\u5e94\u7528\u65b9\u6cd5\u91cc\u9762\u4e0d\u5b58\u5728\u88ab\u591a\u4e2a\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\u3002 \u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u4e3a\u5c06\u6765\u9002\u914d\u66f4\u591a\u7684 AT \u8fd0\u7528\u573a\u666f\u63d0\u4f9b\u652f\u6491\uff0c\u539f\u5219\u4e0a\u53ef\u5b9e\u73b0\u65e0\u9650\u6269\u5c55\uff0c\u5728\u6bcf\u65e5\u6784\u5efa\u548c\u6301\u7eed\u96c6\u6210\u6d41\u7a0b\u843d\u5730\u4f7f\u7528\u3002 \u4ee3\u7801\u89c4\u8303\u95ee\u9898\u6e05\u96f6\uff0c\u7b26\u5408 Shell Check\u3001Pylint\u3001\u7cfb\u7edf\u90e8\u76f8\u5173\u7f16\u7801\u89c4\u8303\u8981\u6c42\u3002 \u610f\u4e49\uff1a \u7edf\u4e00\u6210\u7814 AT \u67b6\u6784\u8bbe\u8ba1\u601d\u8def\uff0c\u6d88\u9664 AT \u4ee3\u7801\u5b9e\u73b0\u548c\u7ef4\u62a4\u4e0a\u53ef\u80fd\u51fa\u73b0\u7684\u5206\u6b67\uff0c\u6539\u5584\u5386\u53f2 AT \u65e0\u5de5\u7a0b\u5316\u8bbe\u8ba1\u7684\u7f3a\u9677\uff0c\u63d0\u9ad8\u67b6\u6784\u4e13\u4e1a\u6027\u3002 \u5404\u5e94\u7528 AT \u4ee3\u7801\u76f8\u4e92\u72ec\u7acb\uff0c\u5951\u5408\u5e94\u7528\u72ec\u7acb\u53d1\u5e03\u7279\u6027\uff0c\u53ef\u652f\u6301\u8fed\u4ee3\u671f\u95f4\u72ec\u7acb\u65b0\u589e\u3001\u7ef4\u62a4\u548c\u6267\u884c\u3002 \u65b9\u6cd5\u8c03\u7528\u903b\u8f91\u5f97\u5230\u7b80\u5316\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u66f4\u9ad8\u6548\uff1b\u516c\u5171\u5e93\u62bd\u53d6\uff0c\u51cf\u5c11\u65b9\u6cd5\u91cd\u590d\u7f16\u5199\uff0c\u63d0\u9ad8\u4ee3\u7801\u5229\u7528\u7387\uff1b\u5e73\u5747\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u4ece40\u5206\u949f\u964d\u4f4e\u81f330\u5206\u949f\uff0c\u65e5\u4ea7\u51fa\u7528\u4f8b\u4ece12\u6761/\u5929\u63d0\u5347\u81f316\u6761/\u5929\u3002 \u53ef\u7075\u6d3b\u652f\u6491\u4e0d\u540c\u7684\u81ea\u52a8\u5316\u8fd0\u7528\u573a\u666f\uff0c\u5982 CI\u3001\u5192\u70df\u6d4b\u8bd5\u3001\u96c6\u6210\u6d4b\u8bd5\u3001\u56de\u5f52\u6d4b\u8bd5\u3001\u4e13\u9879\u6d4b\u8bd5\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_2","title":"\u4e00\u3001\u80cc\u666f\u4ecb\u7ecd","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1","title":"1\u3001\u73b0\u6709\u67b6\u6784\u4ecb\u7ecd","text":"\u73b0\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u6574\u4f53\u5206\u4e3a\u4e09\u5c42\uff1a\u7528\u4f8b\u5c42\uff08\u4e1a\u52a1\u903b\u8f91\u5c42\uff09\u3001\u4e2d\u95f4\u5c42\uff08\u5143\u7d20\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff09\u3001\u6838\u5fc3\u5c42\uff08\u5e95\u5c42\u529f\u80fd\u5e93\u5c42\uff09\u3002 \u7528\u4f8b\u5c42\uff1a\u5373\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4e13\u6ce8\u4e8e\u4e1a\u52a1\u529f\u80fd\u903b\u8f91\uff0c\u4e0d\u5173\u5fc3\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\uff1b \u4e2d\u95f4\u5c42\uff1a\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff0c\u6bcf\u4e2a\u65b9\u6cd5\u5747\u5bf9\u5e94\u4e00\u4e2a\u5143\u7d20\u7684\u4e00\u4e2a\u5177\u4f53\u64cd\u4f5c\uff0c\u4e5f\u53ef\u4ee5\u662f\u591a\u4e2a\u64cd\u4f5c\u7684\u7ec4\u5408\u64cd\u4f5c\uff0c\u4e2d\u95f4\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u7528\u4f8b\u5c42\uff0c\u5177\u6709\u53ef\u6269\u5c55\u6027\u548c\u590d\u7528\u6027\uff1b \u6838\u5fc3\u5c42\uff1a\u4e3b\u8981\u5c01\u88c5\u7684\u5e95\u5c42\u529f\u80fd\u5b9e\u73b0\uff0c\u6b64\u5c42\u5728\u6846\u67b6\u4e2d\u63d0\u4f9b\u4e00\u4e9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u529f\u80fd\u6a21\u5757\u76f8\u5bf9\u72ec\u7acb\uff0c\u6838\u5fc3\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u64cd\u4f5c\u5c42\uff0c\u6bd4\u5982\uff1a\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7 UI \u5750\u6807\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u952e\u9f20\u64cd\u4f5c\u7684\u57fa\u7840\u65b9\u64cd\u4f5c\u6a21\u5757\u3001Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757\u3001\u6587\u4ef6\u7684\u589e\u5220\u6539\u67e5\u64cd\u4f5c\u6a21\u5757\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2","title":"2\u3001\u81ea\u52a8\u5316\u7684\u5e94\u7528","text":"2.1\u3001CI \u6d41\u7a0b \u6bcf\u65e5\u6784\u5efa\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u7814\u53d1\u6bcf\u65e5\u63d0\u4ea4\u7684\u4ee3\u7801\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u73ed\u4e4b\u540e\u4f1a\u5c06\u5404\u5e94\u7528\u8fdb\u884c\u6253\u5305\uff0c\u7136\u540e\u5728\u6d4b\u8bd5\u673a\u4e0a\u5b89\u88c5\u66f4\u65b0 deb \u5305\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u5e94\u7528\u63d0\u4ea4\u96c6\u6210\u7684\u7248\u672c\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u8f7d\u6700\u65b0\u7684 ISO \u8fdb\u884c PXE \u90e8\u7f72\uff0c\u7136\u540e\u6d4b\u8bd5\u673a\u5b89\u88c5\u6700\u65b0\u7684\u955c\u50cf\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 2.2\u3001\u9a8c\u6536\u6d4b\u8bd5 \u5728\u5404\u9a8c\u6536\u8282\u70b9\u8fdb\u884c\u81ea\u52a8\u5316\u9a8c\u6536\uff0c\u76ee\u524d\u7684\u7b56\u7565\u662f\u5168\u7528\u4f8b\u8986\u76d6\u5168\u67b6\u6784\u3002 2.3\u3001\u56de\u5f52\u6d4b\u8bd5 \u56de\u5f52\u6d4b\u8bd5\u4eca\u5e74\u89c4\u5212\u5efa\u8bbe\u4e2d\uff0c\u65e8\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u6267\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\uff0c\u51cf\u5c11\u529f\u80fd\u6d4b\u8bd5\u7684\u91cd\u590d\u52b3\u52a8\u529b\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3","title":"3\u3001\u5b58\u5728\u7684\u95ee\u9898","text":" \u5404\u5e94\u7528\u4e4b\u95f4\u5b58\u5728\u8026\u5408 \u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u521d\u671f\uff0c\u6240\u6709\u5e94\u7528\u662f\u6574\u4f53\u53d1\u5e03\uff0c\u6211\u4eec\u662f\u5c06\u6240\u6709\u5e94\u7528\u770b\u6210\u662f\u4e00\u4e2a\u6574\u4f53\uff0c\u5404\u5e94\u7528\u4f5c\u4e3a\u5176\u4e2d\u7684\u4e00\u4e2a\u6a21\u5757\uff0c\u6240\u4ee5\u5b58\u5728\u5e94\u7528\u95f4\u65b9\u6cd5\u4ea4\u53c9\u8c03\u7528\u7684\u95ee\u9898\uff0c\u8fd9\u6837\u4ece\u6700\u521d\u7684\u8bbe\u8ba1\u6765\u8bb2\u786e\u5b9e\u80fd\u591f\u51cf\u5c11\u91cd\u590d\u4ee3\u7801\u7684\u7f16\u5199\u3002\u4f46\u662f\u73b0\u5728\u5e94\u7528\u8d70\u72ec\u7acb\u53d1\u5e03\uff0c\u5404\u5e94\u7528\u90fd\u6709\u81ea\u5df1\u7684\u8fed\u4ee3\u8282\u594f\uff0c\u5728\u65b0\u9700\u6c42\u5feb\u901f\u53d8\u5316\u7684\u8fc7\u7a0b\u4e2d\uff0c\u81ea\u52a8\u5316\u7ef4\u62a4\u53d8\u5f97\u5f02\u5e38\u56f0\u96be\uff0c\u539f\u56e0\u5c31\u662f\u81ea\u52a8\u5316\u9879\u76ee\u91cc\u9762\u5404\u4e2a\u5e94\u7528\u7684\u6709\u6bd4\u8f83\u591a\u7684\u8026\u5408\u5173\u7cfb\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u8fdb\u884c\u89e3\u8026\uff0c\u4ee5\u9002\u5e94\u5e94\u7528\u4e0d\u540c\u7684\u8fed\u4ee3\u5468\u671f\u3002 \u65e0\u6cd5\u7cbe\u51c6\u7684\u5212\u5206\u7528\u4f8b\u8303\u56f4 \u7528\u4f8b\u6267\u884c\u7684\u8303\u56f4\u4e0d\u591f\u7cbe\u51c6\uff0c\u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u4e3b\u8981\u901a\u8fc7\u7528\u4f8b\u7684\u5173\u952e\u8bcd core\uff08\u6838\u5fc3\uff09\u6765\u533a\u5206\u7528\u4f8b\u662f\u5426\u4e3a\u6838\u5fc3\u7528\u4f8b\uff0c\u4f46\u662f\u8fd9\u6837\u7684\u533a\u5206\u592a\u5bbd\u6cdb\u4e86\uff0c\u4e0d\u80fd\u9002\u5e94\u81ea\u52a8\u5316\u6d4b\u8bd5\u5728\u591a\u573a\u666f\u4e0b\u7684\u5e94\u7528\u3002\u5f88\u591a\u573a\u666f\u4e0b\u6211\u4eec\u8fd8\u9700\u8981\u6839\u636e\u7528\u4f8b\u7684\u7b49\u7ea7\u3001\u7528\u4f8b\u7684\u7c7b\u578b\u3001\u7528\u4f8b\u6765\u6e90\u7b49\u7b49\uff0c\u4e0d\u540c\u7684\u7ef4\u5ea6\u6765\u6311\u9009\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u5173\u952e\u5b57\u9700\u8981\u4eba\u5de5\u4e00\u6761\u6761\u7684\u6539\uff0c\u8d39\u65f6\u8d39\u529b\uff0c\u800c\u4e14\u4e0d\u597d\u7ef4\u62a4\u3002 \u53d7\u65b0\u9700\u6c42\u5f71\u54cd\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u597d\u7ef4\u62a4 \u76ee\u524d\u9700\u8981\u8df3\u8fc7\u7684\u7528\u4f8b\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684\u7528\u4f8b\u811a\u672c\u91cc\u9762\uff0c\u6dfb\u52a0\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\uff0c\u540e\u7eed\u89e3\u9664\u8df3\u8fc7\u7684\u65f6\u5019\u53c8\u9700\u8981\u627e\u5230\u8fd9\u6761\u811a\u672c\uff0c\u5220\u6389\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\u3002\u5728\u8df3\u8fc7\u7528\u4f8b\u8f83\u591a\u7684\u60c5\u51b5\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u96be\u5ea6\u3002 \u7f16\u5199\u7528\u4f8b\u65f6\u903b\u8f91\u6bd4\u8f83\u590d\u6742\uff0c\u9700\u8981\u8c03\u7528\u591a\u4e2a\u5e94\u7528\u7684\u65b9\u6cd5\u6a21\u5757\u3002 \u6846\u67b6\u6269\u5c55\u6027\u4e0d\u8db3\uff0c\u65e0\u6cd5\u6574\u5408\u6027\u80fd\u81ea\u52a8\u5316\u3001\u538b\u6d4b\u81ea\u52a8\u5316\u3001\u5b89\u5168\u81ea\u52a8\u5316\u7b49\u4e13\u9879\u6d4b\u8bd5\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_3","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u4e3a\u89e3\u51b3\u73b0\u6709\u95ee\u9898\uff0c\u9002\u5e94\u4e0d\u65ad\u4e30\u5bcc\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u66f4\u597d\u7684\u53d1\u6325\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4f5c\u7528\uff0c\u9700\u8981\u5bf9\u81ea\u52a8\u5316\u67b6\u6784\u53ca\u5404\u529f\u80fd\u6a21\u5757\u8fdb\u884c\u91cd\u65b0\u8bbe\u8ba1\u89c4\u5212\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_1","title":"1\u3001\u67b6\u6784\u8bbe\u8ba1","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_1","title":"2\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u6846\u67b6\u7684\u8fd0\u884c\u903b\u8f91\uff1a\u901a\u8fc7\u6838\u5fc3\u5c42\u63d0\u4f9b\u4e00\u4e2a\u57fa\u7840\u80fd\u529b\uff0c\u4e1a\u52a1\u5c42\u6839\u636e\u5b9e\u9645\u4e1a\u52a1\u9700\u6c42\uff08\u6d4b\u8bd5\u7528\u4f8b\uff09\u52a8\u6001\u52a0\u8f7d\u6838\u5fc3\u5c42\uff0c\u6267\u884c\u5165\u53e3\u52a0\u8f7d\u76f8\u5e94\u7684\u7528\u4f8b\u96c6\u5e76\u63a7\u5236\u6267\u884c\uff0c\u5e94\u7528\u5c42\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u9700\u6c42\uff0c\u901a\u8fc7\u76f8\u5e94\u7684\u914d\u7f6e\u9879\u8fdb\u884c\u914d\u7f6e\uff0c\u4ece\u800c\u89e6\u53d1\u81ea\u52a8\u5316\u6d4b\u8bd5\u4efb\u52a1\u3002 \u6838\u5fc3\u5c42\uff1a\u57fa\u672c\u4fdd\u6301\u4e0d\u53d8\uff0c\u90e8\u5206\u6a21\u5757\u4f1a\u6d89\u53ca\u5230\u65b0\u529f\u80fd\u5f00\u53d1\uff0c\u6838\u5fc3\u5c42\u5404\u529f\u80fd\u6a21\u5757\u4fdd\u6301\u72ec\u7acb\u6027\uff0c\u63d0\u4f9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u4f9b\u4e0a\u5c42\u8c03\u7528\uff1b \u5e95\u5c42\u6838\u5fc3\u6a21\u5757\u5305\u62ec\uff1a \u56fe\u50cf\u8bc6\u522b\u6a21\u5757 UI \u5b9a\u4f4d\u6a21\u5757 Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757 \u5c5e\u6027\u5b9a\u4f4d\u6a21\u5757 \u65e5\u5fd7\u6a21\u5757 \u952e\u9f20\u64cd\u4f5c\u6a21\u5757 \u6587\u4ef6\u64cd\u4f5c\u6a21\u5757 \u5f55\u5c4f\u6a21\u5757 \u81ea\u5b9a\u4e49\u65ad\u8a00\u6a21\u5757 \u7528\u4f8b\u6267\u884c\u6a21\u5757 PXE \u88c5\u673a\u6a21\u5757 \u952e\u9f20\u4fe1\u53f7\u6a21\u62df\u6a21\u5757 OCR \u6a21\u5757 \u4e1a\u52a1\u5c42\uff1a\u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e94\u7528\u5185\u5305\u542b\u591a\u4e2a\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5982\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7b49\uff0c\u540e\u7eed\u53ef\u4ee5\u6839\u636e\u9700\u8981\u5ac1\u63a5\u8fdb\u6765\u3002\u5176\u4e2d\u529f\u80fd\u6d4b\u8bd5\u8bbe\u8ba1\u601d\u8def\uff1a \u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e76\u5c06\u6d4b\u8bd5\u6570\u636e\u548c\u6d4b\u8bd5\u8d44\u6e90\u6574\u5408\u8fdb\u6765\uff0c\u589e\u52a0\u7528\u4f8b\u6807\u7b7e csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ed9\u6bcf\u6761\u7528\u4f8b\u6253\u6807\u7b7e\u3002 \u5404\u6807\u7b7e\u6240\u4f7f\u7528\u5bf9\u5e94\u7684\u5b57\u6bb5\u540d\u79f0\uff0c\u4f7f\u7528 csv \u6587\u4ef6\u7ef4\u62a4\u7528\u4f8b\u4e0e\u6807\u7b7e\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u5bf9\u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u53ef\u4ee5\u7ec4\u5408\u5176\u4e2d\u7684\u6807\u7b7e\u800c\u4ece\u9a71\u52a8\u5bf9\u5e94\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\uff0c\u517c\u5bb9\u73b0\u6709\u7528\u4f8b\u6807\u7b7e\uff0c\u4e14\u652f\u6301\u7528\u4f8b\u6807\u7b7e\u53ef\u6269\u5c55\uff1b \u4f7f\u7528 csv \u683c\u5f0f\u6587\u4ef6\u53ef\u4ee5\u65b9\u4fbf\u7684\u4f7f\u7528 Excel \u8868\u683c\u6253\u5f00\u8fdb\u884c\u7f16\u8f91\uff0c\u540c\u65f6\u7531\u4e8e csv \u6587\u4ef6\u5b9e\u9645\u662f\u4ee5\u90fd\u597d\u5206\u9694\u7684\u6587\u672c\u6587\u4ef6\uff0c\u4ee3\u7801\u4e2d\u53ef\u4ee5\u5728\u4e0d\u4f9d\u8d56\u4e09\u65b9\u5e93\u7684\u60c5\u51b5\u4e0b\u65b9\u4fbf\u5feb\u901f\u7684\u89e3\u6790\u5b83\uff0c\u53ef\u64cd\u4f5c\u6027\u548c\u53ef\u7ef4\u62a4\u6027\u8f83\u9ad8\u3002 \u5404\u4e2a\u5e94\u7528\u4e4b\u95f4\uff0c\u7528\u4f8b\u3001\u65b9\u6cd5\u3001\u6807\u7b7e\u548c\u8d44\u6e90\u90fd\u662f\u76f8\u4e92\u72ec\u7acb\u7684\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u7528\u4f8b\u65f6\u53ea\u9700\u8981\u81ea\u5df1\u5e94\u7528\u4e0b\u7684\u65b9\u6cd5\u548c\u516c\u5171\u5e93\u5373\u53ef\u3002 \u7ed3\u6784\u4e3e\u4f8b\uff1a .\n\u251c\u2500\u2500 apps\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_album # \u5e94\u7528\u540d (\u7528\u4e0b\u5212\u7ebf\u8fde\u63a5\u662f Python \u7f16\u7801\u89c4\u8303)\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_assert # \u65ad\u8a00\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_function_tag.csv # \u7528\u4f8b\u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 asan_cases # \u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases # \u529f\u80fd\u6d4b\u8bd5\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 res # \u6d4b\u8bd5\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config # \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_widget # \u5e94\u7528\u81ea\u5df1\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_widget # \u65b9\u6cd5\u57fa\u7c7b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 other_widget # \u8c03\u7528\u5176\u4ed6\u5e94\u7528\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_camera\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases\n\u2502\u00a0\u00a0 \u2502\u00a0 ...\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 public_widget # \u516c\u5171\u65b9\u6cd5\u5e93\n\u251c\u2500\u2500 config # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n...\n config \u914d\u7f6e\u6a21\u5757\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u76f8\u5e94\u914d\u7f6e\uff0c\u6d4b\u8bd5\u540c\u5b66\u53ef\u4ee5\u6839\u636e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5728 config \u91cc\u9762\u8fdb\u884c\u914d\u7f6e\u3002 \u5168\u5c40\u914d\u7f6e\uff1a \u6267\u884c\u4e00\u4e2a\u6216\u591a\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff1a\u5728 pattern \u91cc\u9762\u5199\u5165\u5e94\u7528\u5305\u540d\uff0c\u591a\u4e2a\u5e94\u7528\u4e4b\u95f4\u7528 or \u8fde\u63a5\uff0c\u5982 deepin-music or deepin-movie\uff1b \u5192\u70df\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a smoke\uff1b \u96c6\u6210\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a core \uff1b \u5168\u91cf\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u4e3a\u7a7a\u5373\u53ef\uff1b \u901a\u8fc7 tags \u7684\u914d\u7f6e\u6bd4\u8f83\u7075\u6d3b\uff0c\u540e\u9762\u6807\u7b7e\u5316\u7ba1\u7406\u7ae0\u8282\u4f1a\u8bb2\u5230\uff0c\u652f\u6301\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u7075\u6d3b\u914d\u7f6e\u3002 \u6307\u5b9a\u67d0\u53f0\u673a\u5668\u5728\u6307\u5b9a\u955c\u50cf\u7248\u672c\u4e0a\u6267\u884c\u7528\u4f8b\uff1a\u5728 IP \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a IP\uff0c\u5e76\u5728 URL \u91cc\u9762\u586b\u5165\u955c\u50cf\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u6846\u67b6\u4f1a\u8c03\u7528 PXE \u8fdb\u884c\u81ea\u52a8\u88c5\u673a\uff0c\u88c5\u673a\u5b8c\u4e4b\u540e\u81ea\u52a8\u5f00\u59cb\u6267\u884c\u914d\u7f6e\u7684\u6d4b\u8bd5\u7528\u4f8b\u3002 \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\uff1a \u6bcf\u4e2a\u5e94\u7528\u5185\u90e8\u4f1a\u6709\u4e00\u4e2a\u5355\u72ec\u7684\u914d\u7f6e\u6a21\u5757\uff0c\u4f1a\u5305\u542b\u4e00\u4e9b\u672c\u5e94\u7528\u7684\u6d4b\u8bd5\u8d44\u6e90\u7684\u8def\u5f84\u3001\u6267\u884c\u7528\u4f8b\u7684\u6807\u7b7e\u914d\u7f6e\u7b49\u7b49\uff0c\u5982\u679c\u5728\u5c40\u90e8\u914d\u7f6e\u91cc\u9762\u914d\u7f6e\u4e86\u7528\u4f8b\u6267\u884c\u6807\u7b7e\uff0c\u800c\u5916\u5c42 runner \u51fa\u6ca1\u6709\u6307\u5b9a\u6267\u884c\u6807\u7b7e\uff0c\u5219\u5728\u6267\u884c\u65f6\u53ea\u4f1a\u6267\u884c\u5c40\u90e8\u914d\u7f6e\u5df2\u914d\u7f6e\u7684\uff0c\u82e5\u5916\u5c42 runner \u4e5f\u914d\u7f6e\u4e86\u6267\u884c\u6807\u7b7e\uff0c\u5219\u4f1a\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u7528\u4f8b\u3002 \u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u914d\u7f6e\u90fd\u5728\u540c\u4e00\u4e2a\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\uff0cpy \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684\u7c7b\uff0cini \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684 option\u3002 \u5168\u5c40\u914d\u7f6e\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u7b56\u7565\u5982\u4e0b\uff1a \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5c40\u90e8\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5e94\u7528\u5c42\uff1arunner \u662f\u6d4b\u8bd5\u6267\u884c\u7684\u5165\u53e3\uff0c\u5b83\u4f1a\u6839\u636e\u914d\u7f6e\u91cc\u9762\u7684\u914d\u7f6e\u9879\uff0c\u8fdb\u884c\u7528\u4f8b\u7684\u52a0\u8f7d\u548c\u6267\u884c\u3002\u5b83\u63d0\u4f9b\u63a5\u53e3\u7ed9\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\uff0c\u5e73\u53f0\u4e0a\u7684\u6307\u4ee4\u5b9e\u9645\u4e0a\u90fd\u662f\u901a\u8fc7\u4e0b\u53d1\u7ed9 runner\uff0c\u7136\u540e\u7531 runner \u6765\u6267\u884c\u76f8\u5e94\u7684\u6d4b\u8bd5\u3002 \u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u662f\u4e00\u4e2a\u524d\u7aef\u7cfb\u7edf\uff0c\u53ef\u4ee5\u8fdb\u884c\u6d4b\u8bd5\u673a\u7ba1\u7406\u3001\u81ea\u52a8\u5b89\u88c5\u955c\u50cf\u3001\u81ea\u52a8\u5b89\u88c5\u6307\u5b9a\u5e94\u7528\u7248\u672c\u3001\u8fdb\u884c\u6d4b\u8bd5\u7528\u4f8b\u8303\u56f4\u9009\u62e9\u3001\u7528\u4f8b\u89e6\u53d1\u6267\u884c\u63a7\u5236\u3001\u7ed3\u679c\u5c55\u793a\u8f93\u51fa\u7b49\u3002 \u4e00\u4e2a\u5e94\u7528\u7684\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\u90fd\u53ef\u4ee5\u5355\u72ec\u89e6\u53d1\u3002 \u517c\u5bb9\u6027\u6d4b\u8bd5\u4e3b\u8981\u901a\u8fc7 PXE \u670d\u52a1\u5668\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u88c5\u673a\uff0c\u7136\u540e\u914d\u5408 AT \u8fdb\u884c\u6d4b\u8bd5\uff0c\u53ef\u4ee5\u5b9e\u73b0\u4e0d\u540c\u7cfb\u7edf\u7248\u672c\u3001\u4e0d\u540c\u5e94\u7528\u7248\u672c\u73af\u5883\u4e0a\u90fd\u53ef\u4ee5\u8fdb\u884c\u81ea\u52a8\u5316\u7684 AT \u6267\u884c\uff0c\u63d0\u9ad8\u517c\u5bb9\u6027\u6d4b\u8bd5\u6548\u7387\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_4","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_2","title":"1\u3001\u7528\u4f8b\u89e3\u8026","text":"\u5b58\u5728\u8026\u5408\u5173\u7cfb\u7684\u65b9\u6cd5\uff1a\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u88ab\u5916\u90e8\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\uff0c\u5219\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u8026\u5408\u5173\u7cfb\u3002 1.1\u3001\u901a\u8fc7\u7f16\u8f91\u5668 Find Usages \u67e5\u770b\u6bcf\u4e2a\u65b9\u6cd5\u88ab\u8c03\u7528\u7684\u8def\u5f84\u548c\u88ab\u8c03\u7528\u6b21\u6570\uff1b 1.2\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 1 \u4e2a\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728\u5916\u90e8\u5e94\u7528\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1b 1.3\u3001\u64cd\u4f5c\u5c42\u6587\u4ef6\u540d\u5747\u4ee5 widget \u7ed3\u5c3e\uff0c\u7c7b\u540d\u4ee5 Widget \u7ed3\u5c3e\uff0c\u5982\uff1a\u6587\u4ef6\u540d music_widget.py \uff1a class MusicWidget:\n\"\"\"\u97f3\u4e50\u7684\u64cd\u4f5c\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_2","title":"2\u3001\u516c\u5171\u5e93\u5efa\u8bbe","text":"2.1\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 2 \u4e2a\u53ca\u4ee5\u4e0a\u7684\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728 public_widget \u76ee\u5f55\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1bpublic_widget \u5373\u4e3a\u516c\u5171\u65b9\u6cd5\u5e93\uff1b 2.2\u3001\u5728\u7528\u4f8b\u5c42\u4fee\u6539\u7528\u4f8b\u4e2d\u7c7b\u7684\u5bfc\u5165\u8def\u5f84\uff0c\u5c5e\u4e8e\u516c\u5171\u65b9\u6cd5\u7684\u5219\u8c03\u7528 public_widget \u4e2d\u7684\u7c7b\uff0c\u5916\u90e8\u5e94\u7528\u7684\u64cd\u4f5c\u65b9\u6cd5\uff0c\u5219\u8c03\u7528\u672c\u5e94\u7528\u76ee\u5f55\u4e0b\u91cd\u5199\u7684\u5916\u90e8\u5e94\u7528\u65b9\u6cd5\u3002 \u6bd4\u5982\uff1a\u51e0\u4e4e\u6240\u6709\u591a\u5a92\u4f53\u5e94\u7528\u90fd\u9700\u8981\u901a\u8fc7\u6587\u7ba1\u52a0\u8f7d\u8d44\u6e90\uff0c\u8c03\u8d77\u7684\u6587\u7ba1\u5bf9\u8bdd\u6846\u5b9e\u9645\u4e3a dde-desktop\uff0c\u56e0\u6b64\u5c06 desktop_widget.py \u653e\u5230 public_widget \u91cc\u9762\uff1a class DdeDesktopPublicWidget:\n\"\"\"\u516c\u5171-\u684c\u9762\u7684\u64cd\u4f5c\u65b9\u6cd5\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3_1","title":"3\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406","text":"3.1\u3001\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1a\u5bf9\u5e94 core\u3001smoke\uff0c\u6216\u4e3a\u7a7a\uff1b \u7528\u4f8b\u6765\u6e90\uff1a\u5bf9\u5e94 PMS \u7528\u4f8b\u6765\u6e90\uff0c\u5206\u522b\u7528 acp1\u3001acp2\u3001acp3\u3001acp4 \u8868\u793a\u3002 acp1 \uff1a\u4e1a\u52a1\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5199\u7684\u7528\u4f8b\uff0c\u88ab\u7528\u4e8e\u9a8c\u6536\u6d4b\u8bd5\u7684\uff1b acp2 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5f15\u5165\u7684\u4ea7\u54c1\u9a8c\u6536\u6d4b\u8bc4\u90e8\u7684\u7528\u4f8b\uff1b acp3 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u6839\u636e\u4ea7\u54c1\u9700\u6c42\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\uff1b acp4 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u901a\u8fc7\u793e\u533a\u3001\u8bba\u575b\u7528\u6237\u53cd\u9988\u95ee\u9898\u603b\u7ed3\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\u3002 \u4e3e\u4f8b\uff1a \u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u7528\u4f8b\u6765\u6e90 001 L1 core acp1 \u6807\u7b7e\u91c7\u7528\u679a\u4e3e\u7684\u65b9\u5f0f\u8fdb\u884c\u4ee3\u53f7\u7ba1\u7406\u65b9\u4fbf\u7ba1\u7406\u4ee5\u53ca\u540e\u7eed\u6269\u5c55\u3002 3.2\u3001\u5728\u6bcf\u4e2a\u5e94\u7528\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u7b2c\u4e00\u5217\u4e3a\u7528\u4f8b\u7684 ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ba1\u7406\u6a21\u5757\u5185\u7684\u7528\u4f8b\u6807\u7b7e\u3002\u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 3.3\u3001\u5bf9\u7167 PMS \u4e0a\u7528\u4f8b\u7b49\u7ea7\u3001\u7528\u4f8b\u7c7b\u578b\u548c\u7528\u4f8b\u6765\u6e90\uff0c\u6807\u8bb0\u6240\u6709\u5df2\u5b9e\u73b0\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u540e\u7eed\u7f16\u5199\u65b0\u589e\u81ea\u52a8\u5316\u7528\u4f8b\u65f6\uff0c\u6bcf\u5199\u4e00\u6761\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684 csv \u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u6b64\u6761\u7528\u4f8b\u7684\u6807\u7b7e\u3002 3.4\u3001\u8df3\u8fc7\u7528\u4f8b\u6807\u7b7e\u5316 \u73b0\u6709\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a\uff1a \u4e3e\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u8bb0\u4e3a \u201cskip-\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u8bb0\uff0c\u5982\u679c\u5df2\u7ecf\u6807\u8bb0\u4e86\u8df3\u8fc7\u539f\u56e0\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u8bb0\u4e3a SKIPED\uff0c\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\u3002 \u6240\u6709\u7684\u6807\u7b7e\u5728 docs \u76ee\u5f55\u4e0b\u4f1a\u6709\u4e00\u4e2a\u6587\u6863\uff0c\u6587\u6863\u6682\u5b9a\u540d\u79f0\u4e3a\uff1atags_info.md\uff0c\u7528\u4e8e\u8bf4\u660e\u73b0\u5728\u5df2\u7ecf\u4f7f\u7528\u5230\u7684\u6807\u7b7e\uff0c\u4ee5\u53ca\u8fd9\u4e9b\u6807\u7b7e\u7684\u89e3\u91ca\u548c\u7528\u6cd5\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#4","title":"4\u3001\u7528\u4f8b\u6267\u884c","text":"4.1\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u7684\u9a71\u52a8\u6267\u884c\u903b\u8f91\u529f\u80fd\u5b9e\u73b0 \u5f00\u53d1\u6839\u636e\u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\u91cc\u9762\u7684\u7528\u4f8b\u6807\u7b7e\u6267\u884c\u5bf9\u5e94\u7528\u4f8b\u7684\u529f\u80fd\uff0c\u80fd\u652f\u6301\u591a\u4e2a\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u6267\u884c\u5165\u53e3\u80fd\u968f\u610f\u901a\u8fc7\u7528\u4f8b\u6807\u7b7e\u6307\u5b9a\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002 \u7528\u4f8b\u6807\u7b7e\u7684\u9a71\u52a8\u65b9\u5f0f\u5fc5\u987b\u80fd\u652f\u6301\u6807\u7b7e\u7684\u6269\u5c55\uff0c\u672a\u6765\u968f\u7740\u4e1a\u52a1\u7684\u53d8\u5316\u53ef\u80fd\u9700\u8981\u589e\u52a0\u5404\u79cd\u5404\u6837\u7684\u6807\u7b7e\u3002 4.2\u3001\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u6267\u884c \u529f\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u3001\u6027\u80fd\u6d4b\u8bd5\u7b49\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u662f\u5206\u5f00\u6267\u884c\u7684\uff0c\u4e5f\u5c31\u662f\u5728\u4e00\u6b21\u6267\u884c\u4e2d\uff0c\u53ea\u80fd\u6267\u884c\u5176\u4e2d\u4e00\u79cd\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5177\u4f53\u8981\u6267\u884c\u54ea\u4e00\u79cd\u540c\u6837\u901a\u8fc7\u53c2\u6570\u6765\u63a7\u5236\u3002 4.3\u3001\u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c \u7531\u4e8e\u6d4b\u8bd5\u673a\u8d44\u6e90\u6709\u9650\uff0c\u968f\u7740\u81ea\u52a8\u5316\u7528\u4f8b\u6570\u91cf\u7684\u589e\u52a0\uff0cCI \u6267\u884c\u65f6\u95f4\u4f1a\u8d8a\u6765\u8d8a\u957f\u3002 \u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c\u7684\u529f\u80fd\uff1a \u540c\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\u5206\u6563\u5230\u4e0d\u540c\u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u4e0a\u6267\u884c\uff0c\u7f29\u77ed\u6267\u884c\u603b\u65f6\u95f4\uff1b \u7b2c\u4e8c\u5929\u8dd1\u7684\u65f6\u5019\u540c\u4e00\u4e2a\u673a\u5668\u4e0a\u4f1a\u6267\u884c\u6628\u5929\u6ca1\u6709\u6267\u884c\u5230\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u6267\u884c\u540c\u7406\uff1b \u53ef\u4ee5\u5b9e\u73b0\u5728\u5168\u67b6\u6784\u6d4b\u8bd5\u673a\u4e0a\u8f6e\u6d41\u6267\u884c\u7528\u4f8b\uff0c\u65e2\u80fd\u4fdd\u8bc1\u6267\u884c\u4e86\u6240\u6709\u7684\u7528\u4f8b\uff0c\u53c8\u80fd\u5728\u8d44\u6e90\u6709\u9650\u7684\u60c5\u51b5\u4e0b\u8986\u76d6\u4e86\u6240\u6709\u7684\u67b6\u6784\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#5","title":"5\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0","text":"5.1\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u4f5c\u4e3a\u524d\u7aef\u754c\u9762\u7cfb\u7edf\uff0c\u901a\u8fc7\u9875\u9762\u4e0a\u7684\u4e00\u4e9b\u529f\u80fd\u9009\u9879\u8fdb\u884c\u5bf9\u5e94\u6d4b\u8bd5\u4efb\u52a1\u7684\u7ba1\u7406\u6216\u89e6\u53d1\uff0c\u4e1a\u5185\u6bd4\u8f83\u6d41\u884c\u7684\u5b9e\u73b0\u65b9\u6848\u662f\u4f7f\u7528 Vue + DRF \u5b9e\u73b0\u4e00\u4e2a\u524d\u540e\u7aef\u5206\u79bb\u7684\u7cfb\u7edf\u3002 \u6d4b\u8bd5\u5e73\u53f0\u53ef\u80fd\u4f1a\u6d89\u53ca\u5230\u7684\u6a21\u5757\u6709\uff1a\u6d4b\u8bd5\u673a\u8d44\u6e90\u7ba1\u7406\u6a21\u5757\u3001\u7528\u4f8b\u6267\u884c\u63a7\u5236\u6a21\u5757\u3001\u7ed3\u679c\u5c55\u793a\u6a21\u5757\u3001PXE \u955c\u50cf\u5b89\u88c5\u6a21\u5757\u7b49\u3002 \u7528\u6237\uff08\u6d4b\u8bd5\u3001\u7814\u53d1\u540c\u5b66\u7b49\uff09\u53ef\u4ee5\u914d\u7f6e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5982\u6267\u884c\u54ea\u4e2a\u5e94\u7528\u3001\u6267\u884c\u7528\u4f8b\u7684\u8303\u56f4\u3001\u5728\u54ea\u53f0\u673a\u5668\u4e0a\u6267\u884c\u3001\u955c\u50cf\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u5e94\u7528\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u6267\u884c\u65f6\u95f4\u3002 5.2\u3001\u6267\u884c\u5165\u53e3 runner \u63d0\u4f9b\u7ed9\u6d4b\u8bd5\u5e73\u53f0\u7684\u63a5\u53e3\u5305\u62ec\uff1a\u7528\u4f8b\u6267\u884c\u63a5\u53e3\u3001\u7ed3\u679c\u8fd4\u56de\u63a5\u53e3\u3001\u955c\u50cf\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u955c\u50cf\u5b89\u88c5\u63a5\u53e3\u3001\u5e94\u7528\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u5e94\u7528\u5b89\u88c5\u66f4\u65b0\u63a5\u53e3\u7b49\u3002 \u524d\u7aef\u5e73\u53f0\u76ee\u524d\u8fd8\u6ca1\u6709\u592a\u591a\u8be6\u7ec6\u7684\u65b9\u6848\uff0c\u672c\u6b21\u8bbe\u8ba1\u4e3b\u8981\u96c6\u4e2d\u5728\u540e\u7aef\u8fd9\u90e8\u5206\u67b6\u6784\u7684\u8bbe\u8ba1\u4e0a\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_5","title":"\u56db\u3001\u5b9e\u65bd\u8ba1\u5212","text":"\u8fd1\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u6587\u7ba1\u4ee3\u7801\u89e3\u8026 2022/3/28 2022/4/8 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u56fe\u5f62\u56fe\u50cf\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u97f3\u89c6\u9891\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5168\u5c40\u641c\u7d22\u4ee3\u7801\u89e3\u8026 2022/4/25 2022/4/26 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u516c\u5171\u5e93\u5efa\u8bbe 2022/4/27 2022/5/5 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5c01\u88c5\u7684\u65b9\u6cd5\u6574\u7406\u6210\u4e00\u4e2a\u8868 2022/5/6 2022/5/10 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7528\u4f8b\u6807\u7b7e\u5206\u7c7b\u8bc4\u4f30 2022/5/11 2022/5/11 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u6807\u7b7e\u5316\u6267\u884c\u9a71\u52a8\u7a0b\u5e8f\u7f16\u5199 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u9700\u5b9e\u73b0\u81ea\u52a8\u89e3\u6790 csv \u8868\u683c\u4e2d\u7684\u7528\u4f8b\u7f16\u53f7 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u722c\u866b\u811a\u672c\uff0c\u722c\u53d6 pms \u4e0a\u7528\u4f8b\u7684\u6807\u7b7e 2022/5/11 2022/5/13 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u5b9a\u65f6\u81ea\u52a8\u7ef4\u62a4\u672c\u5730 csv \u6587\u4ef6\u811a\u672c 2022/5/11 2022/5/20 \u4e2d\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u76ee\u5f55\u7ed3\u6784\u8c03\u6574 2022/5/20 2022/6/2 \u5b8c\u6210\u5168\u5c40\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u5177\u4f53\u65b9\u6848\u548c\u903b\u8f91\u5b9e\u73b0 2022/6/6 2022/6/17 \u9759\u6001\u626b\u63cf\u95ee\u9898\u6e05\u96f6 2022/6/20 2022/7/1 \u5b8c\u6210\u65b0\u6846\u67b6\u4f7f\u7528\u57f9\u8bad 2022/7/4 2022/7/11 \u843d\u5730\u8fd0\u884c 2022/7/12 2022/7/20 \u5e95\u5c42\u5e93\u7528\u9014\u8bf4\u660e\u6587\u6863\u7f16\u5199 2022/7/21 2022/7/28"}]} \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz index 8ffaebc1..e0b7bbfc 100644 Binary files a/sitemap.xml.gz and b/sitemap.xml.gz differ diff --git "a/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" "b/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" index 25f669d5..97100667 100644 --- "a/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" +++ "b/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs @@ -1215,8 +1215,7 @@ 智能化功能测试# Attribution :chengdu Test Team # Date :2021/08/20 -此方案仍在演进中 -此方案仍在演进中 +此方案仍在演进中 仓库地址:https://gitlabcd.uniontech.com/autotest/cd-desktop-aitest 一、方案概述¶ 基于深度学习智能识别应用的元素控件,用于在自动化测试操作过程中的元素定位以及判断结果时的断言处理;自动化测试过程中,测试机上的画面通过采集盒传输到服务器上,服务器对视频画面进行智能识别后,服务器智能判断用例是否执行成功,然后对测试机下发下一步操作指令,测试机接受并执行下一步操作。 diff --git "a/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" "b/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" index cdf9ccde..06c9e9a5 100644 --- "a/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" +++ "b/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" @@ -95,7 +95,7 @@ - + @@ -226,7 +226,7 @@ - + YouQu Docs diff --git "a/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" "b/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" index 121b4507..72123668 100644 --- "a/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" +++ "b/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs @@ -752,6 +752,13 @@ + + + + + 4、虚拟化部署 + + @@ -1661,6 +1668,13 @@ + + + + + 4、虚拟化部署 + + @@ -2604,18 +2618,12 @@ 1、标签说明流水线使用指导; 跳过原因:skip-XXX,用于控制用例是否执行; 确认修复:fixed-XXX,用于标记用例的修复状态(后面详细讲解用法); @@ -2629,26 +2637,30 @@ 1、标签说明PMS用例ID 用例级别 用例类型 +设备类型 +用例来源 上线对象 测试级别 跳过原因 确认修复 -废弃用例 -... +废弃用例 +... -001 +679537 679537 L1 FUNC +PPL + CICD C1 skip-XXX fixed-XXX -removed-已废弃 -... +removed-已废弃 +... @@ -2656,7 +2668,7 @@ 2、操作步骤csv 的文件名。 例如: -相册的用例文件为 test_album_xxx.py,xxx 表示任意三位数字代表用例序号,此时 csv 文件名就应为 album.csv; +相册的用例文件为 test_album_xxx.py,xxx 表示用例的ID(也可以是自定义的数字代表用例序号),此时 csv 文件名就应为 album.csv; 对于用例规模比较大的应用,比如文件管理器,建议分模块,每个模块建立一个 csv 文件,所有 csv 文件建议放在一个 tags 目录下。 是否分模块维护 csv 取决于应用的用例复杂度,同时我们应该充分考虑后期的可维护性,csv 文件太多了也是一个很糟糕的事情。 @@ -2677,7 +2689,7 @@ 3.1.1、固定跳过001 +679537 ... skip-受到某新需求影响 @@ -2742,7 +2754,7 @@ 3.2、确认修复001 +679537 ... skip-受到某新需求影响 fixed-已修复 @@ -2787,7 +2799,7 @@ 3.3、废弃用例4、设计思路¶ 上面介绍 Pytest 框架提供的标签功能 mark,使用时需要为每一个用例添加标签装饰器,则操作复杂,可维护性差,其根本问题就是标签分散在每一条用例的装饰器上,难以集中维护;于是乎将所有标签使用 csv 文件进行集中管理,并通过 Pytest 的钩子函数,读取 csv 文件,动态添加标签到用中。 5、CSV文件格式¶ -此配置文件需要维护大量的标签数据,且要方便能使用Excel打开进行编辑查看,更重要的是我们不想引入三方依赖,CSV 文件几乎是唯一能满足所有的要求的文件格式。 +此配置文件需要维护大量的标签数据,且要方便能使用 Excel 打开进行编辑查看,更重要的是我们不想引入三方依赖,CSV 文件几乎是唯一能满足所有的要求的文件格式。 七、日志系统¶ 1、背景¶ 基于 YouQu 自动化测试框架操作方法封装写法,通常是这样的:类里面一个函数只包含一个操作或多次调用的一系列可合并的操作; @@ -2888,7 +2900,7 @@ 1、原则 大文件不能上传到工程里面,保持整个工程的轻量化,这样在克隆代码的时候才能非常快速方便使用,我们见过一个 AT 工程 clone 大小达到好几个 G,简直不可思议。 其实代码文件的大小是很小的,也就是说,纯写代码随便写工程也不会太大,而文档(包含插图)等资源却是很占空间。 -因此我们选择将 YouQu 的文档工程单独迁出到独立的仓库 youqu-docs 。 +因此我们选择将 YouQu 的文档工程涉及到的图片资源都采用外链加载; 2、安装¶ 项目根目录下运行 env.sh 即可。 bash env.sh @@ -2930,17 +2942,25 @@ 3.2、裁剪依赖bash env_dev.sh +4、虚拟化部署¶ +YouQu默认采用虚拟化部分,虚拟化环境实际安装的位置是在 $HOME/.local/share/virtualenvs/youqu-oHTM7l7G 目录下 +youqu-oHTM7l7G 此目录名称前面部分是你的代码根目录的名称,后面部分是生成的随机字符串; +同学们在远程机器上定位问题的时候,如果使用 Pycharm 调试,就将解释器指定到这个目录的就行了; +当然,我们也提供了本机开发环境部署: +bash env_dev.sh + +如果你是本地开发环境可以用它,区别就是驱动执行的时候使用:python3 manage.py xxx 九、失败录屏¶ 录屏其实是一种视频形式的日志,因为很多时候我们在查看日志之后仍然无法准确的定位到用例失败的具体原因,因此用例的录屏能让我们看到用例在执行过程; 【使用方法】 在 globalconfig.ini 里面配置关注 2 个参数; -;失败用例重跑次数 -RERUN = 1 - -;失败录屏从第几次开始录制视频。 -;比如 RECORD_FAILED_CASE = 1 ,表示用例第1次执行失败之后开始录屏。 -;注意,用例失败重跑的次数不能小于失败录屏次数,即 RERUN >= RECORD_FAILED_CASE -RECORD_FAILED_CASE = 1 +;失败用例重跑次数 +RERUN = 1 + +;失败录屏从第几次开始录制视频。 +;比如 RECORD_FAILED_CASE = 1 ,表示用例第1次执行失败之后开始录屏。 +;注意,用例失败重跑的次数不能小于失败录屏次数,即 RERUN >= RECORD_FAILED_CASE +RECORD_FAILED_CASE = 1 默认失败重跑的次数是 1 次; RECORD_FAILED_CASE = 1 表示用例第1次执行失败之后开始录屏; @@ -2953,48 +2973,48 @@ 十、Wayland 适配简单讲就是,应用库只需要维护一套用例脚本即可。 【用例兼容】 因为 Wayland 下有些应用的界面显示和功能本身存在一些差异,用例层可能需要对这部分用例做逻辑判断,使用全局配置里面的常量进行逻辑编写即可: -from setting.globalconfig import GlobalConfig - -# GlobalConfig.IS_WAYLAND 获取到当前的显示服务器(bool) -# 应用库 Config 继承 GlobalConfig -if Config.IS_WAYLAND: - pass -if Config.IS_X11: - pass +from setting.globalconfig import GlobalConfig + +# GlobalConfig.IS_WAYLAND 获取到当前的显示服务器(bool) +# 应用库 Config 继承 GlobalConfig +if Config.IS_WAYLAND: + pass +if Config.IS_X11: + pass 比如用例里面如果断言的图片不同: -if Config.IS_WAYLAND: - self.assert_image_exist("wayland_XXX") -else: - self.assert_image_exist("x11_XXX") +if Config.IS_WAYLAND: + self.assert_image_exist("wayland_XXX") +else: + self.assert_image_exist("x11_XXX") 这样这条用例脚本在 Wayland 和 X11 下都可以跑,so easy 是不是?完全没必要专门拉新分支进行 Wayland 适配。 十一、测试报告¶ 1. 目录结构¶ 执行时会在根目录下动态生成 report 目录,所有的报告相关的文件会统一存放在里面,示例: -/report - ├── allure # allure报告 - │ ├── ... - │ └── ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json - ├── allure_html # 生成的html报告 - │ ├── ... - │ └── index.html - ├── allure_back # allure报告备份 - │ └── 20221108114823 - │ ├── ... - │ └── f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json - ├── json # json报告 - │ ├── ... - │ └── result_deepin-music_20221109134736_1081333.json - ├── logs # 日志文件 - │ ├── 2022-11-10_debug.log - │ └── 2022-11-10_error.log - ├── record # 录屏 - │ └── 2022-11-09 - │ ├── ... - │ └── 15时14分09秒_test_music_303_2_autotest.mp4 - └── xml # xml报告 - └── autotest_deepin_music-20221109134736.xml +/report + ├── allure # allure报告 + │ ├── ... + │ └── ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json + ├── allure_html # 生成的html报告 + │ ├── ... + │ └── index.html + ├── allure_back # allure报告备份 + │ └── 20221108114823 + │ ├── ... + │ └── f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json + ├── json # json报告 + │ ├── ... + │ └── result_deepin-music_20221109134736_1081333.json + ├── logs # 日志文件 + │ ├── 2022-11-10_debug.log + │ └── 2022-11-10_error.log + ├── record # 录屏 + │ └── 2022-11-09 + │ ├── ... + │ └── 15时14分09秒_test_music_303_2_autotest.mp4 + └── xml # xml报告 + └── autotest_deepin_music-20221109134736.xml 默认情况下同时生成 html、xml、json三种形式的报告。 2. 定制报告¶ @@ -3011,14 +3031,14 @@ 3. 查看报告allure open report/allure_html +allure open report/allure_html 使用 manage.py 执行完之后,在终端的最后一行,我们会给你输出打开报告的命令,直接复制它在终端执行就可以查看了,像这样: - 终端执行命令: allure open /tmp/youqu/report/allure_html 查看报告 + 终端执行命令: allure open /tmp/youqu/report/allure_html 查看报告 你也可以直接在 Pycharm 里面找到 index.html 文件,然后右键选择浏览器打开,或者你可以用一个 http 服务打开。 你也可以直接在 report/allure 目录下查看报告: - allure serve report/allure + allure serve report/allure 远程执行 @@ -3031,48 +3051,48 @@ 1. 提前解决代码问题这里推荐一个 Python 社区流行的代码格式化工具: Black,号称不妥协的代码格式化工具,它检测到不符合规范的代码风格直接就帮你全部格式化好,就是这么刚! 安装: -sudo pip3 install black +sudo pip3 install black 使用方法: -black ${CheckPath} +black ${CheckPath} 使用这个工具格式化之后,代码会被自动调整,刚开始你可能会觉得调整得很夸张,没关系坚持看,习惯之后,你会觉得很优雅,没错,这就是 Pythonic Code 的核心,请保持优雅~。 2. 代码扫描工具¶ 使用根目录下 pylint.sh 扫描代码,在 report 目录下查看代码扫描报告,如果有代码问题请提前解决之后再提交。 此脚本已经使用 Python 社区最流行的代码扫描工具 Pylint 进行代码扫描。 使用方法: -bash pylint.sh +bash pylint.sh 运行之后会提示你要扫描的目录,比如输入 apps ,则会扫描 apps 下的所有 Python 代码。 在 setting/pylintrc.cfg 配置文件里面进行相关配置,扫描完成之后在 report/pylints 目录下会生成扫描报告。 代码提交需通过 git review 提交到 gerrit ,人工 Code Review 通过之后合入代码。 十三、提交代码¶ 1. 安装依赖¶ -sudo apt install git-review +sudo apt install git-review 2. 提交模板¶ 在 ~ 目录下新建文件,并命名为 gitcommit_template 将以下内容写入文件当中: -# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 -fix: - -# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 -Description: - -# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 -Log: - -# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 -#Bug: - -# 修复 github issue -#Issue: - -# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 -#Task: +# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 +fix: + +# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 +Description: + +# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 +Log: + +# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 +#Bug: + +# 修复 github issue +#Issue: + +# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 +#Task: 命令行执行: -git config --global commit.template ~/gitcommit_template +git config --global commit.template ~/gitcommit_template 此命令将模板加入到 git 的提交模板中。 后续提交的时候需要关注一下几点: @@ -3083,19 +3103,19 @@ 2. 提交模板3. 推送代码¶ 首先添加 commit 信息 -git add 后面加文件名称 +git add 后面加文件名称 -git add . # 表示添加所有文件 +git add . # 表示添加所有文件 使用这条命令注意有些临时文件不要提交到仓库了。 -git commit -a +git commit -a 之后在 fix: 后面(注意冒号后面必须加空格,不然直接-1)写本地提交的 commit 信息,然后就可以提交代码了 -git review branch(当前分支) -r origin +git review branch(当前分支) -r origin 最好一次 commit,一次 git review ,经常有同学在本地疯狂 commit 最后 git review 报错不知道咋回事儿。 若不想每次提交都加上 -r 选项,执行以下命令: -git config --global gitreview.remote origin +git config --global gitreview.remote origin 提交代码,直接使用 git review branch<目标分支>,例如 git review master 4. Git标签¶ @@ -3106,74 +3126,74 @@ 4. Git标签git tag -a <tagname> +git tag -a <tagname> 回车之后,Git 会打开你的编辑器,让你写一句标签注解,就像你给提交写注解一样。 查看所有标签 -git tag -l -# git tag 也行 +git tag -l +# git tag 也行 删除标签 -git tag -d <tagname> +git tag -d <tagname> 推送标签至远程 git push 命令并不会传送标签到远程仓库服务器上,必须显式地推送标签。 -git push origin <tagname> +git push origin <tagname> 推送所有不在远程仓库服务器上的标签 -git push origin --tag +git push origin --tag 删除远程标签 -git push origin :refs/tag/<tagname> +git push origin :refs/tag/<tagname> 后期打标签 先用 git log --pretty=oneline 查询提交记录,获取校验码。 -git tag -a <tagname> 9fceb02(校验码) +git tag -a <tagname> 9fceb02(校验码) 检出标签 -git checkout <tagname> +git checkout <tagname> 此时,仓库会处于“分离头指针(detached HEAD)”的状态。 在“分离头指针”状态下,如果你做了某些更改然后提交它们,标签不会发生变化, 但你的新提交将不属于任何分支,并且将无法访问,除非通过确切的提交哈希才能访问。 因此,如果你需要进行更改,比如你要修复旧版本中的错误,那么通常需要创建一个新分支: -git checkout -b <NewBranchName> <tagname> +git checkout -b <NewBranchName> <tagname> 新分支上可以进行提交代码。 十四、常见问题¶ 1. 提交代码时提示邮箱或者名称不对¶ 重新配置邮箱或者名称,然后重置生效: -git commit --amend --reset-author +git commit --amend --reset-author 2. 怎么回滚到之前的版本¶ (1)查询历史提交记录 -git log +git log 找到你要回滚的版本,复制 hash 值。 注意:是 commit 空格之后的 hash 值,之前有同学复制的 Change-Id: 这样肯定报错。 (2)回滚版本,不清除代码 -git reset --soft ${hash} +git reset --soft ${hash} (3)回滚版本,清除代码,慎用哈 -git reset --hard ${hash} +git reset --hard ${hash} 3. 测试报告里面 F S . E 是什么意思¶ F 表示失败,. (点)表示通过,S 表示跳过,E 表示 error 有报错 4. 解决 git status 中文显示的问题¶ -git config --global core.quotePath false +git config --global core.quotePath false 5. apps 目录下颜色有些是黄色的¶ 在 Pycharm 中 apps 目录下应用库文件是黄色的,编辑器识别不到代码新增和修改; @@ -3184,22 +3204,22 @@ 5. apps 目录下颜色有些是黄色的6. 执行 env.sh 报错 $'\r':未找到命令¶ 出现这个问题你应该是在 windows 上打开或编辑过 env.sh 脚本,windows下的换行是回车符+换行符,也就是\r\n,而 Linxu 下是换行符 \n,Linux 下不识别 \r,因此报错。 解决方案: -# 将 \r 替换为空 -sudo sed -i 's/\r//' env.sh +# 将 \r 替换为空 +sudo sed -i 's/\r//' env.sh 7.怎样为单独某一条用例配置执行超时时间¶ 在用例脚本中添加装饰器,如下: -@pytest.mark.timeout(300) # 单位秒 -def test_xxx_001(): - pass +@pytest.mark.timeout(300) # 单位秒 +def test_xxx_001(): + pass 8. 如何拉取 YouQu 自动化项目所有代码,包含子仓库¶ 前置条件:已申请访问 YouQu 权限群组 -# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) -git config --global credential.helper store - -# 拉取YouQu框架代码,并递归拉取子仓库代码 -git clone "http://gerrit.uniontech.com/youqu" --recursive +# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) +git config --global credential.helper store + +# 拉取YouQu框架代码,并递归拉取子仓库代码 +git clone "http://gerrit.uniontech.com/youqu" --recursive 9. 如何拉取 YouQu 自动化项目中指定子仓库的代码¶ 前置条件: @@ -3207,22 +3227,22 @@ 9. 如何拉取 YouQu 自动化项目中指定子仓库的代 已申请访问 YouQu 权限群组 已存储访问密码 -# 拉取YouQu框架代码 -git clone "http://gerrit.uniontech.com/youqu" - -# 指定拉取子仓库代码 -cd youqu -git submodule update --init apps/autotest_xxx_xxx +# 拉取YouQu框架代码 +git clone "http://gerrit.uniontech.com/youqu" + +# 指定拉取子仓库代码 +cd youqu +git submodule update --init apps/autotest_xxx_xxx 10. 如何更新 YouQu 自动化项目中,所有子仓库的代码¶ 更新所有子仓库代码 -cd youqu -git pull & git submodule foreach git pull +cd youqu +git pull & git submodule foreach git pull 11. 如何修复 YouQu 所有子仓库 master 分支游离头(detached head)¶ 修复所有子仓库默认master 分支游离头 -cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
youqu manage.py exportcsv -a deepin-album -t CICD
表示导出 deepin-album 的用例中标记了 CICD 标签的用例,导出 CSV 文件的字段格式已经适配了 CICD 的要求。
deepin-album
CICD
CSV
新建一个 APP 工程:
youqu manage.py startapp autotest_deepin_some +youqu manage.py startapp autotest_deepin_some 这样在 apps 目录下会创建一个子项目工程 autotest_deepin_some,同时新建好工程模板目录和模板文件: -apps -└── autotest_deepin_some - ├── case - │ ├── assert_res - │ │ └── readme - │ ├── base_case.py - │ └── __init__.py - ├── config.ini - ├── config.py - ├── conftest.py - ├── control - ├── deepin_some_assert.py - ├── deepin_some.csv - ├── __init__.py - └── widget - ├── base_widget.py - ├── case_res - │ └── readme - ├── deepin_some_widget.py - ├── __init__.py - ├── other.ini - ├── other_widget.py - ├── pic_res - │ └── readme - └── ui.ini +apps +└── autotest_deepin_some + ├── case + │ ├── assert_res + │ │ └── readme + │ ├── base_case.py + │ └── __init__.py + ├── config.ini + ├── config.py + ├── conftest.py + ├── control + ├── deepin_some_assert.py + ├── deepin_some.csv + ├── __init__.py + └── widget + ├── base_widget.py + ├── case_res + │ └── readme + ├── deepin_some_widget.py + ├── __init__.py + ├── other.ini + ├── other_widget.py + ├── pic_res + │ └── readme + └── ui.ini autotest_deepin_some 是你的工程名称,比如:autotest_deepin_music ; 在此基础上,你可以快速的开始你的 AT 项目。 2.6. 用例标签自动同步¶ 用于自动同步 PMS 用例标签数据至本地 CSV 文件,主要通过以下几个配置来控制: -APP_NAME = # 指定要同步的应用名称 -PMS_USER = # PMS的用户名 -PMS_PASSWORD = # PMS的密码 +APP_NAME = # 指定要同步的应用名称 +PMS_USER = # PMS的用户名 +PMS_PASSWORD = # PMS的密码 在 [csv_link_pms_id] 节点下指定 csv 文件名与 PMS 用例模块的对应关系,比如: -[csv_link_pms_id] -;同步PMS数据到本地CSV文件,必须要配置的配置项 -;key是本地CSV文件的文件名称; -;value是对应PMS上的模块ID; -;比如要同步音乐的数据, 首先需要将配置 APP_NAME = deepin-music, -;CSV文件名称为music.csv,其在PMS上的用例为: https://pms.uniontech.com/testcase-browse-53.html -;因此应该配置为: music = 53 -;这样才能将PMS与本地CSV文件建立联系。 -;如果你的应用分了很多模块,只需要将对应的信息依次配置好就行了。 -music = 53 +[csv_link_pms_id] +;同步PMS数据到本地CSV文件,必须要配置的配置项 +;key是本地CSV文件的文件名称; +;value是对应PMS上的模块ID; +;比如要同步音乐的数据, 首先需要将配置 APP_NAME = deepin-music, +;CSV文件名称为music.csv,其在PMS上的用例为: https://pms.uniontech.com/testcase-browse-53.html +;因此应该配置为: music = 53 +;这样才能将PMS与本地CSV文件建立联系。 +;如果你的应用分了很多模块,只需要将对应的信息依次配置好就行了。 +music = 53 将以上信息配置好之后,在命令行执行: -youqu manage.py pms --pms2csv yes +youqu manage.py pms --pms2csv yes 每次执行时原 csv 文件会自动备份在 report/csv_back 目录下,因此你不用担心脚本执行导致你的数据丢失。 diff --git a/search/search_index.json b/search/search_index.json index 91ebe84c..c7cfc7a2 100644 --- a/search/search_index.json +++ b/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\u200b\\u3000\\-\u3001\u3002\uff0c\uff0e\uff1f\uff01\uff1b]+","pipeline":["stemmer"]},"docs":[{"location":"","title":"\u9996\u9875","text":""},{"location":"#youqu","title":"\u6709\u8da3\uff08YouQu\uff09","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/4/1\n# Author : Mikigo\n# =============================================\n \u672c\u7ad9\u603b\u8bbf\u95ee\u91cf \u6b21 \u6b22\u8fce\u5728\u6d4f\u89c8\u5668\u8bbf\u95ee\u3010\u516c\u7f51\u6587\u6863\u3011 \u7edf\u4fe1\u516c\u53f8\u5185\u7f51\u8fd8\u53ef\u4ee5\u8bbf\u95ee\u3010\u5185\u7f51\u6587\u6863\u3011\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u54e6~~"},{"location":"#_1","title":"\u4e00\u3001\u7b80\u4ecb","text":"\u6709\u8da3\uff08YouQu\uff09\u662f\u6df1\u5ea6\u79d1\u6280\u8bbe\u8ba1\u548c\u5f00\u53d1\u7684\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff0c\u91c7\u7528\u7ed3\u6784\u5206\u5c42\u7684\u8bbe\u8ba1\u7406\u5ff5\uff0c\u652f\u6301\u591a\u5143\u5316\u5143\u7d20\u5b9a\u4f4d\u548c\u65ad\u8a00\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\u3001\u5f3a\u5927\u7684\u65e5\u5fd7\u548c\u62a5\u544a\u8f93\u51fa\u7b49\u7279\u8272\u529f\u80fd\uff0c\u540c\u65f6\u5b8c\u7f8e\u517c\u5bb9X11\u3001Wayland\u663e\u793a\u534f\u8bae\uff0c\u73af\u5883\u90e8\u7f72\u7b80\u5355\uff0c\u64cd\u4f5c\u6613\u4e0a\u624b\u3002"},{"location":"#17","title":"\u7231\u4e0a \u201c\u6709\u8da3\u201d \u7684 17 \u4e2a\u7406\u7531","text":" \u6838\u5fc3\u5e93\u63d0\u4f9b\u4e86\u7edf\u4e00\u7684\u63a5\u53e3\uff0c\u7f16\u5199\u65b9\u6cd5\u65f6\u53ea\u9700\u8981\u5bfc\u5165\u4e00\u4e2a\u5305\u5c31\u53ef\u4ee5\u4f7f\u7528\u5230\u6838\u5fc3\u5e93\u63d0\u4f9b\u7684\u6240\u6709\u529f\u80fd\uff1b \u516c\u5171\u5e93\u5c01\u88c5\u4e86\u5f88\u591a\u5e38\u7528\u6a21\u5757\u7684\u76f8\u5173\u65b9\u6cd5\uff0c\u6bd4\u5982\uff1a\u4efb\u52a1\u680f\u7684\u64cd\u4f5c\u3001\u684c\u9762\u7684\u64cd\u4f5c\u3001\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\u7b49\u7b49\uff1b \u9664\u4e86\u5e38\u7528\u7684\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u8bc6\u522b\u4ee5\u5916\uff0c\u6211\u4eec\u8fd8\u63d0\u4f9b\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u5176\u4f7f\u7528\u7b80\u5355\u4e14\u9ad8\u6548\uff0c\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff1b \u5bf9\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u5c06\u7f16\u5199\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u53d8\u5f97\u7b80\u5355\u800c\u4f18\u96c5\uff1b \u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u6280\u672f\u8fdb\u884c\u529f\u80fd\u5347\u7ea7\uff0c\u9664\u4e86\u652f\u6301\u5355\u4e2a\u5750\u6807\u8fd4\u56de\uff0c\u8fd8\u652f\u6301\u540c\u4e00\u754c\u9762\u4e0b\u591a\u4e2a\u76f8\u540c\u5143\u7d20\u8fd4\u56de\u591a\u4e2a\u5750\u6807\u7684\u529f\u80fd\uff1b \u63d0\u4f9b\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u548c\u6279\u91cf\u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u4e0d\u5230\u4e00\u4e2a csv \u6587\u4ef6\u539f\u6765\u80fd\u5e72\u8fd9\u4e48\u591a\u4e8b\u60c5\uff1b \u63d0\u4f9b\u4e86\u529f\u80fd\u5f3a\u5927\u7684\u6267\u884c\u5668\u5165\u53e3\uff0c\u8ba9\u4f60\u53ef\u4ee5\u65b9\u4fbf\u7684\u5728\u672c\u5730\u6267\u884c\u4efb\u4f55\u7528\u4f8b\u96c6\u7684\u7528\u4f8b\uff0c\u5176\u4e30\u5bcc\u7684\u81ea\u5b9a\u4e49\u914d\u7f6e\u9879\uff0c\u6ee1\u8db3\u4f60\u5bf9\u6267\u884c\u5668\u6240\u6709\u7684\u5e7b\u60f3\uff1b \u63d0\u4f9b\u8fdc\u7a0b\u6267\u884c\u7684\u529f\u80fd\uff0c\u53ef\u4ee5\u63a7\u5236\u591a\u53f0\u673a\u5668\u5e76\u884c\u8dd1\uff0c\u6216\u8005\u5206\u5e03\u5f0f\u8dd1\uff0c\u8fd9\u79cd\u4ed8\u8d39\u529f\u80fd\u73b0\u5728\u514d\u8d39\u7ed9\u4f60\u7528\uff1b \u63d0\u4f9b\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u529f\u80fd\uff0c\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u6bcf\u4e2a\u65b9\u6cd5\u5355\u72ec\u5199\u8f93\u51fa\u65e5\u5fd7\u7684\u4ee3\u7801\uff0c\u4e00\u5207\u6211\u4eec\u7ed9\u4f60\u641e\u5b9a\u4e86\uff0c\u65e5\u5fd7\u8f93\u51fa\u4e0d\u4ec5\u5185\u5bb9\u4e30\u5bcc\uff0c\u989c\u503c\u4e5f\u7edd\u5bf9\u5728\u7ebf\uff0c\u6211\u4eec\u8fd8\u81ea\u5df1\u8bbe\u8ba1\u4e86\u4e00\u6b3e\u7ec8\u7aef\u8f93\u51fa\u4e3b\u9898\u53eb\u300a\u4e94\u5f69\u6591\u6593\u7684\u9ed1\u300b\uff1b \u63d0\u4f9b\u4e86\u4e00\u952e\u90e8\u7f72\u81ea\u52a8\u5316\u6d4b\u8bd5\u73af\u5883\u7684\u529f\u80fd\uff0c\u8fde\u4ee3\u7801\u7f16\u8f91\u5668\u90fd\u7ed9\u4f60\u88c5\u597d\u4e86\uff0c\u8ba9\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u73af\u5883\u90e8\u7f72\u800c\u70e6\u607c\uff1b \u63d0\u4f9b\u4e86\u81ea\u52a8\u751f\u6210\u591a\u79cd\u62a5\u544a\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u8f93\u51fa\u4ec0\u4e48\u62a5\u544a\u5f62\u5f0f\u90fd\u884c\uff0c\u800c\u4e14\u6211\u4eec\u5728\u62a5\u544a\u4e2d\u8fd8\u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\u548c\u5931\u8d25\u622a\u56fe\u7684\u529f\u80fd\uff1b \u5bf9\u65ad\u8a00\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u63d0\u4f9b\u66f4\u53cb\u597d\u5316\u7684\u9519\u8bef\u63d0\u793a\uff0c\u8ba9\u5b9a\u4f4d\u95ee\u9898\u7cbe\u51c6\u9ad8\u6548\uff1b \u4e0d\u4ec5\u652f\u6301\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u63a7\u5236\uff0c\u800c\u4e14\u8fd8\u652f\u6301\u52a8\u6001\u63a7\u5236\u7528\u4f8b\u6279\u91cf\u6267\u884c\u7684\u603b\u65f6\u95f4\uff0c\u786e\u4fdd CI \u73af\u5883\u4e0b\u80fd\u987a\u7545\u8fd0\u884c\uff1b \u652f\u6301\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\u6267\u884c\u3001PMS \u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6807\u7b7e\u5316\u6267\u884c\u65b9\u6848\uff0c\u6ee1\u8db3\u4f60\u5404\u79cd\u573a\u666f\u4e0b\u7684\u6267\u884c\u9700\u6c42\uff1b \u652f\u6301\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u529f\u80fd\uff0c\u53ef\u5b9a\u4f4d\u53ef\u65ad\u8a00\uff0c\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\uff1b \u5b8c\u7f8e\u517c\u5bb9 Wayland \u548c X11\uff0c\u771f\u6b63\u505a\u5230\u4e00\u5957\u4ee3\u7801\uff0c\u968f\u5904\u6267\u884c\uff1b \u652f\u6301\u591a\u79cd\u65b9\u5f0f\u7684\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u5176\u4e2d\u5f02\u6b65\u56de\u586b\u7684\u65b9\u6848\uff0c\u5b8c\u7f8e\u89e3\u51b3\u4e86\u6570\u636e\u56de\u586b\u7684\u8017\u65f6\u95ee\u9898\uff1b \u3010\u89c6\u9891\u4ecb\u7ecd\u3011"},{"location":"#_2","title":"\u4e8c\u3001\u5b89\u88c5\u4f7f\u7528","text":"\u57fa\u7840\u6846\u67b6\uff1ahttps://github.com/linuxdeepin/deepin-autotest-framework \u4ece PyPI \u5b89\u88c5: sudo pip3 install youqu\n \u521b\u5efa\u9879\u76ee: youqu-startproject youqu\n \u5b89\u88c5\u4f9d\u8d56: cd youqu\nbash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002 \u5e94\u7528\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684\u5e94\u7528\u540d\u79f0\u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music cd apps/\n \u5c06\u5e94\u7528\u5e93\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u50cf\u8fd9\u6837\uff1a youqu\n\u251c\u2500\u2500 apps\n\u2502 \u251c\u2500\u2500 autotest_deepin_music # \u5e94\u7528\u5e93\n...\n \u5e94\u7528\u5e93\u7684\u540d\u79f0\u4e0d\u53ef\u4ee5\u4fee\u6539\u3002"},{"location":"#_3","title":"\u4e09\u3001\u8fd0\u884c","text":""},{"location":"#1","title":"1. \u5de5\u4f5c\u7a7a\u95f4","text":"\u57fa\u7840\u6846\u67b6\u5de5\u7a0b\u76ee\u5f55\u5efa\u8bae\u653e\u5728 ~ \u76ee\u5f55\u4e0b\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u4e5f\u53ef\u4ee5\u8fd0\u884c\uff0c\u4f46\u662f\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u9700\u8981\u505a\u73af\u5883\u6e05\u7406\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u5b58\u5728\u4ee3\u7801\u88ab\u5220\u9664\u7684\u98ce\u9669\u3002 \u5982\u679c\u4f60\u7684\u673a\u5668\u4e0a\u4e0d\u540c\u76ee\u5f55\u4e0b\u5b58\u5728\u591a\u4e2a YouQu \u5de5\u7a0b\uff0c\u90a3\u4e48\u5728\u8fd0\u884c\u4e4b\u524d\uff0c\u8bf7\u5148\u6267\u884c env.sh \u6821\u6b63\u76f8\u5173\u73af\u5883\u3002"},{"location":"#2","title":"2. \u6267\u884c\u5668","text":"\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u6709\u4e00\u4e2a manage.py \uff0c\u5b83\u662f\u4e00\u4e2a\u6267\u884c\u5668\u5165\u53e3\uff0c\u63d0\u4f9b\u4e86\u672c\u5730\u6267\u884c\u3001\u8fdc\u7a0b\u6267\u884c\u7b49\u7684\u529f\u80fd\u3002 \u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6765\u6267\u884c\uff1a youqu manage.py run -a deepin-music\n"},{"location":"#21","title":"2.1. \u672c\u5730\u6267\u884c","text":"youqu manage.py run\n"},{"location":"#211","title":"2.1.1. \u914d\u7f6e\u6587\u4ef6","text":"\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u914d\u7f6e\u53c2\u6570 \u5728\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u91cc\u9762\u652f\u6301\u914d\u7f6e\u5bf9\u6267\u884c\u7684\u4e00\u4e9b\u53c2\u6570\u8fdb\u884c\u914d\u7f6e\uff0c\u5e38\u7528\u7684\u5982\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;1\u3001KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2\u3001KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f, e.g. TAGS = L1 or smoke\n;\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\uff0c\u5c06\u8981\u6267\u884c\u7684\u7528\u4f8b\u5199\u5165\u6307\u5b9a\u7684 csv \u6587\u4ef6\n;\u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u4ece\u57fa\u7840\u6846\u67b6\u6839\u76ee\u5f55\u5f00\u59cb\uff1ae.g. CASE_FILE = case_list.txt\n;\u5982\u679c\u8fd9\u91cc\u6709\u503c\uff0cAPP_NAME KEYWORDS TAGS \u7684\u914d\u7f6e\u5747\u4e0d\u751f\u6548\nCASE_FILE =\n;=============================== RUNNER CONFIG ===================================\n[runner]\n;\u6700\u5927\u5931\u8d25\u7528\u4f8b\u6570\u91cf\u7684\u5360\u6bd4\n;\u6bd4\u5982\uff1a\u603b\u6267\u884c\u7528\u4f8b\u6570\u4e3a100, \u82e5 MAX_FAIL = 0.5,\u5219\u5931\u8d25\u7528\u4f8b\u6570\u8fbe\u523050\u5c31\u4f1a\u7ec8\u6b62\u6d4b\u8bd5\u3002\nMAX_FAIL = 0.5\n;\u5355\u6761\u7528\u4f8b\u7684\u8d85\u65f6\u65f6\u95f4\uff0c\u5982\u679c\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u8d85\u65f6\uff0c\u8fd9\u6761\u7528\u4f8b\u4f1a\u88ab\u505c\u6b62\uff0c\u540e\u7eed\u7528\u4f8b\u7ee7\u7eed\u6267\u884c\u3002\n;\u5355\u4f4d\u4e3a\u79d2\n; \u8fd9\u662f\u4e00\u4e2a\u5168\u5c40\u7edf\u4e00\u914d\u7f6e\uff0c\u5982\u679c\u67d0\u6761\u7528\u4f8b\u9700\u8981\u5355\u72ec\u914d\u7f6e\u8d85\u65f6\u65f6\u95f4\uff0c\u53ef\u4ee5\u5728\u7528\u4f8b\u4e2d\u8fd9\u6837\u5199\uff1a\n;@pytest.mark.timeout(500)\n;def test_xxx_001():\n; ...\n;\u4f1a\u8bdd\uff08\u6240\u6709\u7528\u4f8b\u6267\u884c\u7684\uff09\u8d85\u65f6\u662f\u6839\u636e\u5168\u5c40\u8d85\u65f6\u914d\u7f6e\u548c\u7528\u4f8b\u5355\u72ec\u8d85\u65f6\u914d\u7f6e\u81ea\u52a8\u8ba1\u7b97\u7684\uff1b\nCASE_TIME_OUT = 200\n;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\u3002\n;\u6ce8\u610f\uff0c\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u4e0d\u80fd\u5c0f\u4e8e\u5931\u8d25\u5f55\u5c4f\u6b21\u6570\uff0c\u5373 RERUN >= RECORD_FAILED_CASE\nRECORD_FAILED_CASE = 1\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = INFO\n;yes \u6bcf\u6761\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u8fdb\u884c\u73af\u5883\u6e05\u7406\nCLEAN_ALL = yes\n;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\nRESOLUTION = 1920x1080\n;\u4e0d\u8df3\u8fc7\u7528\u4f8b\uff0ccsv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86 skip-xxx\u7684\u7528\u4f8b\u4e0d\u8df3\u8fc7\nNOSKIP = no\n;ignore fixed\n;no\uff0c\u53ea\u8981\u6807\u8bb0\u4e86fixed\u7684\u7528\u4f8b\uff0c\u5373\u4f7f\u6807\u8bb0\u4e86skip-\uff0c\u4e5f\u4f1a\u6267\u884c\uff1b\n;yes\uff0cfixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\uff1b\nIFIXED = no\n;\u8981\u5b89\u88c5deb\u5305\u7684\u8def\u5f84\n;e.g : ~/Downloads/ \u5b89\u88c5\u4e0b\u8f7d\u76ee\u5f55\u4e0b\u7684deb\u5305\uff0c\u5982\u679c\u662f\u8fdc\u7a0b\u6267\u884c\uff0c\u4f1a\u81ea\u52a8\u62f7\u8d1d\u5230\u8fdc\u7a0b\u5e76\u5b89\u88c5\u3002\nDEB_PATH =\n;DEBUG \u6a21\u5f0f\u6267\u884c\u7528\u4f8b\uff0c\u53ea\u6536\u96c6\u4e0d\u6267\u884c\u7528\u4f8b\uff0c\u4e5f\u4e0d\u505a\u8bbe\u5907\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002\nDEBUG = no\n;\u8bb0\u5f55top\u547d\u4ee4\u67e5\u8be2\u7684\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0cTOP = 3 \u8868\u793a\u8bb0\u5f55\u524d3\u4e2a\u8fdb\u7a0b\u3002\nTOP =\n;\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\nREPEAT =\n;\u9ed8\u8ba4\u5728\u6240\u6709\u6d4b\u8bd5\u5b8c\u6210\u4e4b\u540e\u8f93\u51fa\u62a5\u9519\u4fe1\u606f.\n;yes, \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\nDURING_FAIL = no\n;=============================== REPORT CONFIG ===================================\n[report]\n;\u7528\u4f8b\u6267\u884c\u5b8c\u540e\u751f\u6210\u7684\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n;\u76ee\u524d\u652f\u6301 allure, xml, json \uff08\u652f\u6301\u540c\u65f6\u751f\u6210\uff09\nREPORT_FORMAT = allure, xml, json\n;\u6307\u5b9a\u62a5\u544a\u751f\u6210\u7684\u8def\u5f84\uff08\u76f8\u5bf9\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\uff09\nALLURE_REPORT_PATH = report/\nXML_REPORT_PATH = report/\nJSON_REPORT_PATH = report/\n;=============================== GLOBAL CONFIG ===================================\n[globalconfig]\n;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\nPASSWORD = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\nIMAGE_MATCH_NUMBER = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6bcf\u6b21\u95f4\u9694\u7b49\u5f85\u65f6\u95f4\nIMAGE_MATCH_WAIT_TIME = 1\n;\u56fe\u50cf\u8bc6\u522b\u5339\u914d\u5ea6\nIMAGE_RATE = 0.9\n;\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u5b9e\u65f6\u56fe\u50cf\u4fdd\u5b58\u8def\u5f84\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u5750\u6807\nSCREEN_CACHE = /tmp/screen.png\n;\u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\u7684\u8def\u5f84\nTMPDIR = /tmp/tmpdir\n;\u7cfb\u7edf\u4e3b\u9898\nSYS_THEME = deepin\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = http://youqu-dev.uniontech.com:8890\n;OpenCV\u670d\u52a1\u7aef\u5730\u5740\nOPENCV_SERVER_HOST = http://youqu-dev.uniontech.com:8889\n;=============================== PMS CONFIG ===================================\n;PMS\u76f8\u5173\u914d\u7f6e\uff0c\u5305\u542b\u4ee5\u4e0b\u51e0\u4e2a\u65b9\u9762\uff1a\n;1.PMS\u6d4b\u8bd5\u5957\u6267\u884c\n;2.\u81ea\u52a8\u4ecePMS\u722c\u53d6\u6570\u636e\u5e76\u540c\u6b65\u672c\u5730CSV\u6587\u4ef6\n;3.PMS\u6570\u636e\u56de\u586b\n[pms]\n;PMS\u7684\u7528\u6237\u540d: ut001234\nPMS_USER =\n;PMS\u7684\u5bc6\u7801\nPMS_PASSWORD =\n;PMS\u6d4b\u8bd5\u5957\u7684ID\n;\u5728PMS\u4e0a\u67e5\u770b\u7528\u4f8b\u201c\u5957\u4ef6\u201d\u94fe\u63a5: https://pms.uniontech.com/testsuite-view-495.html\n;\u6d4b\u8bd5\u5957ID\u4e3a: 495\nSUITE_ID =\n;\u6570\u636e\u56de\u586b\u5fc5\u987b\u5173\u8054PMS\u6d4b\u8bd5\u5355\n;\u5728PMS\u4e0a\u67e5\u770b\u6d4b\u8bd5\u5355\u94fe\u63a5: https://pms.uniontech.com/testtask-cases-20747.html\n;\u6d4b\u8bd5\u5355ID\u4e3a: 20747\nTASK_ID =\n;\u5c06\u6d4b\u8bd5\u7ed3\u679c\u6570\u636e\u56de\u586b\u5230PMS\n;\u4e3a\u7a7a: \u8868\u793a\u4e0d\u56de\u586b,\u4e0d\u4f1a\u5728\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u751f\u6210json\u7ed3\u679c\u6587\u4ef6;\n;async: \u8868\u793a\u9010\u6761\u5f02\u6b65\u56de\u586b,\u540e\u9762\u4e00\u6761\u6267\u884c\u5f00\u59cb\u65f6\u901a\u8fc7\u5b50\u7ebf\u7a0b\u5bf9\u524d\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u8fdb\u884c\u56de\u586b\uff0c\u5982\u6b64\u5b9e\u73b0\u65f6\u95f4\u6548\u7387\u6700\u5927\u5316;\n;finish: \u8868\u793a\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u6210\u4e4b\u540e\u9010\u4e2a\u56de\u586b(PMS\u4e0d\u652f\u6301\u5e76\u53d1);\nSEND_PMS =\n;\u6570\u636e\u56de\u586b\u7684\u89e6\u53d1\u8005\n;auto: \u6846\u67b6\u81ea\u52a8\u56de\u586b,\u914d\u5408SEND_PMS\u914d\u7f6e\u4f7f\u7528,\u4f60\u53ef\u4ee5\u9009\u62e9\u5728\u4e0d\u540c\u7684\u9636\u6bb5\u8fdb\u884c\u6570\u636e\u56de\u586b;\n;hand: \u624b\u52a8\u56de\u586b,\u6bcf\u6761\u7528\u4f8b\u4ecd\u7136\u4f1a\u751f\u6210json\u6587\u4ef6,\u4f46\u6846\u67b6\u4e0d\u4f1a\u8fdb\u884c\u6570\u636e\u56de\u586b,\u9700\u8981\u4f60\u53ef\u4ee5\u5728\u4f60\u60f3\u8981\u53d1\u9001\u7684\u65f6\u95f4\u70b9\u624b\u52a8\u89e6\u53d1\u56de\u586b;\nTRIGGER = auto\n;PMS\u56de\u586b\u7684\u91cd\u8bd5\u6b21\u6570\n;\u5982\u679c\u63a5\u53e3\u8bf7\u6c42\u5931\u8d25,\u4f1a\u8fdb\u884c\u91cd\u8bd5\nSEND_PMS_RETRY_NUMBER = 2\n[csv_link_pms_lib]\n;caselib: \u7528\u4f8b\u5e93\n;testcase: \u4ea7\u54c1\u5e93\u7528\u4f8b\nCASE_FROM = caselib\n[csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/caselib-browse-81.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 81\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic =\n[export_csv]\n;\u5bfc\u51fa\u7684csv\u6587\u4ef6\u540d\u79f0\uff0c\u9ed8\u8ba4 case_list.csv\nCSV_FILE = case_list.csv\n;exportcsv \u547d\u4ee4\u5bfc\u51fa case_list.csv \u6587\u4ef6\u65f6\u914d\u7f6e\u7684\u5b57\u6bb5\u540d\uff0c\u7528\u4f8b\u540d\u79f0\u9ed8\u8ba4\u5b58\u5728\u7b2c\u4e00\u5217\uff0c\u65e0\u9700\u6dfb\u52a0\nCSV_HEARD = \u7528\u4f8b\u7ea7\u522b,\u7528\u4f8b\u7c7b\u578b,\u6d4b\u8bd5\u7ea7\u522b,\u662f\u5426\u8df3\u8fc7\n \u914d\u7f6e\u5b8c\u6210\u4e4b\u540e\uff0c\u76f4\u63a5\u5728\u547d\u4ee4\u884c\u6267\u884c manage.py \u5c31\u597d\u4e86\u3002 youqu manage.py run\n"},{"location":"#212","title":"2.1.2. \u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a youqu manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--max_fail MAX_FAIL \u6700\u5927\u5931\u8d25\u7387\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--resolution RESOLUTION\n\u68c0\u67e5\u5206\u8fa8\u7387\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms {,async,finish}\n\u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--trigger {,auto,hand}\n\u89e6\u53d1\u8005\n-f CASE_FILE, --case_file CASE_FILE\n\u6839\u636e\u6587\u4ef6\u6267\u884c\u7528\u4f8b\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n--pms_user PMS_USER pms \u7528\u6237\u540d\n--pms_password PMS_PASSWORD\npms \u5bc6\u7801\n--suite_id SUITE_ID pms \u6d4b\u8bd5\u5957ID\n--pms_info_file PMS_INFO_FILE\npms \u4fe1\u606f\u6587\u4ef6\n--top TOP \u8fc7\u7a0b\u4e2d\u8bb0\u5f55top\u547d\u4ee4\u4e2d\u7684\u503c\n--lastfailed \u4ec5\u6267\u884c\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\n--duringfail \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\n--repeat REPEAT \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n--project_name PROJECT_NAME\n\u5de5\u7a0b\u540d\u79f0\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--build_location BUILD_LOCATION\n\u6784\u5efa\u5730\u533a\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--line LINE \u6267\u884c\u7684\u4e1a\u52a1\u7ebf\uff08\u5199\u5165json\u6587\u4ef6\uff09\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a youqu manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\"\n \u547d\u4ee4\u884c\u53c2\u6570\u4f18\u5148\u7ea7\u662f\u9ad8\u4e8e\u914d\u7f6e\u6587\u4ef6\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u4e86\u5bf9\u5e94\u7684\u53c2\u6570\uff0c\u914d\u7f6e\u6587\u4ef6\u4e2d\u4e0d\u7ba1\u662f\u5426\u914d\u7f6e\u5747\u4e0d\u751f\u6548\u3002 --app \u5165\u53c2\u8fd8\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\uff0c\u4e0b\u9762\u7684\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u540c\u6837\u652f\u6301\u3002"},{"location":"#22","title":"2.2. \u8fdc\u7a0b\u6267\u884c","text":"youqu manage.py remote\n \u8fdc\u7a0b\u6267\u884c\u540c\u6837\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u8fdb\u884c\u7528\u4f8b\u76f8\u5173\u914d\u7f6e\uff1b \u9700\u8981\u91cd\u70b9\u8bf4\u4e00\u4e0b\u8fdc\u7a0b\u6267\u884c\u65f6\u7684\u6d4b\u8bd5\u673a\u4fe1\u606f\u914d\u7f6e\uff0c\u5728\u914d\u7f6e\u6587\u4ef6 setting/remote.ini \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\u3001IP\u3001\u5bc6\u7801\u3002 ;=============================== CLIENT LIST =====================================\n; \u6d4b\u8bd5\u673a\u914d\u7f6e\u5217\u8868\n;[client{number}] ;\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u6709\u591a\u5c11\u53f0\u6d4b\u8bd5\u673a\u5c31\u5199\u591a\u5c11\u4e2a client\uff0c\u522b\u540d\u5fc5\u987b\u5305\u542b client \u5b57\u7b26\uff0c\u4e14\u4e0d\u80fd\u91cd\u590d\u3002\n;user = ;\u6d4b\u8bd5\u673a user\n;ip = ;\u6d4b\u8bd5\u673a ip\n;password = 1 ;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801, \u53ef\u4ee5\u4e0d\u914d\u7f6e\u6b64\u9879\uff0c\u9ed8\u8ba4\u53d6 CLIENT_PASSWORD \u7684\u503c\uff1b\n;\u5982\u679c\u4f60\u6240\u6709\u6d4b\u8bd5\u673a\u5bc6\u7801\u90fd\u76f8\u540c\uff0c\u90a3\u4e48\u53ea\u9700\u8981\u914d\u7f6e CLIENT_PASSWORD \u5c31\u53ef\u4ee5\u4e86\n;=================================================================================\n[client1]\nuser = uos\nip = 10.8.15.xx\n[client2]\nuser = uos\nip = 10.8.15.xx\n[client3]\nuser = uos\nip = 10.8.11.xx\n \u6709\u591a\u5c11\u53f0\u673a\u5668\u5c31\u50cf\u8fd9\u6837\u6328\u7740\u5199\u5c31\u884c\u4e86\u3002 \u7136\u540e\u5728\u547d\u4ee4\u884c\uff1a youqu manage.py remote\n \u8fd9\u6837\u8fd0\u884c\u662f\u4ece\u914d\u7f6e\u6587\u4ef6\u53bb\u8bfb\u53d6\u76f8\u5173\u914d\u7f6e\u3002 \u5982\u679c\u4f60\u4e0d\u60f3\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\uff0c\u4f60\u4ecd\u7136\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u8fdb\u884c\u4f20\u53c2\uff0c \u4ee5\u4e0b\u4e3a python3 manage.py remote \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-c CLIENTS, --clients CLIENTS\n\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679cpassword\u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6\nsetting/remote.ini \u4e2d CLIENT_PASSWORD\n\u7684\u503c,\u6bd4\u5982\uff1auos@10.8.13.33:1 \u6216 uos@10.8.13.33\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-s {yes,no,}, --send_code {yes,no,}\n\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a\uff08\u4e0d\u542breport\u76ee\u5f55\uff09\n-e, --build_env \u642d\u5efa\u6d4b\u8bd5\u73af\u5883,\u5982\u679c\u4e3ayes\uff0c\u4e0d\u7ba1send_code\u662f\u5426\u4e3ayes\u90fd\u4f1a\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a.\n-p CLIENT_PASSWORD, --client_password CLIENT_PASSWORD\n\u6d4b\u8bd5\u673a\u5bc6\u7801\uff08\u5168\u5c40\uff09\n-y PARALLEL, --parallel PARALLEL\nyes:\u8868\u793a\u6240\u6709\u6d4b\u8bd5\u673a\u5e76\u884c\u8dd1\uff0c\u6267\u884c\u76f8\u540c\u7684\u6d4b\u8bd5\u7528\u4f8b\uff0cno\n:\u8868\u793a\u6d4b\u8bd5\u673a\u5206\u5e03\u5f0f\u6267\u884c\uff0c\u670d\u52a1\u7aef\u4f1a\u6839\u636e\u6536\u96c6\u5230\u7684\u6d4b\u8bd5\u7528\u4f8b\u81ea\u52a8\u5206\u914d\u7ed9\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u3002\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms SEND_PMS \u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n \u5728\u547d\u4ee4\u884c\u8fd9\u6837\u8fd0\u884c\uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\"\n \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report \u76ee\u5f55\u4e0b\u56de\u6536\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u7684\u6d4b\u8bd5\u62a5\u544a\u3002 \u914d\u7f6e\u6587\u4ef6\u5176\u4ed6\u76f8\u5173\u914d\u7f6e\u9879\u8be6\u7ec6\u8bf4\u660e\uff0c\u8bf7\u67e5\u770b\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u6ce8\u91ca\u5185\u5bb9\u3002"},{"location":"#23-pms","title":"2.3. PMS \u6570\u636e\u56de\u586b","text":"\u6d4b\u8bd5\u5355\u5173\u8054\u7684\u7528\u4f8b\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u5bf9\u5e94\u7684\u53bb\u8dd1\u8fd9\u4e9b\u5173\u8054\u7684\u7528\u4f8b\uff0c\u5e76\u4e14\u5c06\u6267\u884c\u7684\u7ed3\u679c\u56de\u586b\u7684\u6d4b\u8bd5\u7528\u4f8b\u7684\u72b6\u6001\u91cc\u9762\u3002 PMS \u6570\u636e\u56de\u586b\u4e3b\u8981\u6709\u4e09\u79cd\u65b9\u5f0f\uff1a \uff081\uff09\u5f02\u6b65\u56de\u586b \u5728\u7528\u4f8b\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\uff0c\u91c7\u7528\u5f02\u6b65\u7684\u65b9\u5f0f\u53bb\u8fdb\u884c\u6570\u636e\u56de\u586b\uff0c\u76f4\u767d\u7684\u8bb2\u5c31\u662f\uff0c\u7b2c\u4e8c\u6761\u7528\u4f8b\u5f00\u59cb\u8dd1\u7684\u65f6\u5019\uff0c\u901a\u8fc7\u5b50\u7ebf\u7a0b\u53bb\u505a\u7b2c\u4e00\u6761\u7528\u4f8b\u7684\u6570\u636e\u56de\u586b\uff0c\u5982\u6b64\u5faa\u73af\uff0c\u76f4\u5230\u6240\u6709\u7528\u4f8b\u6267\u884c\u7ed3\u675f\uff1b \u8fd9\u79cd\u65b9\u6848\u7684\u65f6\u95f4\u6548\u7387\u6700\u9ad8\u7684\uff0c\u56e0\u4e3a\u7406\u8bba\u4e0a\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u662f\u5927\u4e8e\u6570\u636e\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\u65f6\u95f4\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u5f53\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u6570\u636e\u56de\u586b\u4e5f\u5b8c\u6210\u4e86\u3002 \u4f7f\u7528\u65b9\u6cd5\uff0c\u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u4ee5\u4e0b\u53c2\u6570\uff1a\uff08\u4ee5\u4e0b\u6d89\u53ca\u5230\u7684\u53c2\u6570\u914d\u7f6e\u90fd\u662f\u5728\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u914d\u7f6e\uff09 PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = async\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \u8fd9\u4e2a\u53c2\u6570\u53ef\u586b\u53ef\u4e0d\u586b\uff0c\u4f46\u662f\u586b\u4e86\u53ef\u4ee5\u63d0\u9ad8\u7528\u4f8b\u7684\u6267\u884c\u901f\u5ea6\uff0c\u56e0\u4e3a\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u53ef\u4ee5\u6307\u5b9a\u5230\u5177\u4f53\u7684\u5e94\u7528\u5e93\u3002\uff08\u4e0b\u540c\uff09\n \uff082\uff09\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u56de\u586b \u7b49\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u518d\u9010\u4e2a\u8fdb\u884c\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u6b64\u65b9\u6848\u65f6\u95f4\u6548\u7387\u6bd4\u8f83\u4f4e\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \uff083\uff09\u624b\u52a8\u56de\u586b \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4e0d\u505a\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u540e\u7eed\u624b\u52a8\u5c06\u7ed3\u679c\u8fdb\u884c\u56de\u586b\u8bf7\u6c42\u3002 \u7528\u4f8b\u6267\u884c\u65f6\u914d\u7f6e\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = hand\nAPP_NAME = \u540e\u7eed\u624b\u52a8\u56de\u586b\u65b9\u6cd5\uff1a youqu manage.py pms --send2task yes\n"},{"location":"#_4","title":"\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898","text":"\u7531\u540c\u5b66\u53ef\u80fd\u4f1a\u53d1\u73b0\uff0c\u600e\u4e48\u56de\u586b\u4e00\u6b21\u4e4b\u540e\uff0c\u540e\u9762\u60f3\u518d\u6b21\u56de\u586b\u5c31\u4e0d\u751f\u6548\u4e86\uff1b \u8fd9\u662f\u56e0\u4e3a\u4e3a\u4e86\u5e94\u5bf9\u524d\u9762\u63d0\u5230\u7684\u591a\u79cd\u6570\u636e\u56de\u586b\u7684\u65b9\u5f0f\uff0c\u5728 report \u76ee\u5f55\u4e0b\u4f1a\u7531 pms_xxx \u5f00\u5934\u7684\u76ee\u5f55\uff0c\u8bb0\u5f55\u4e86\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u548c\u56de\u586b\u60c5\u51b5\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u4e4b\u524d\u5df2\u7ecf\u56de\u586b\u8fc7\u4e86\uff0c\u540e\u7eed\u5c31\u4e0d\u4f1a\u518d\u6b64\u89e6\u53d1\u56de\u586b\u4e86\uff1b \u5982\u679c\u4f60\u60f3\u91cd\u65b0\u505a\u56de\u586b\uff0c\u4f60\u53ef\u4ee5\u628a report/pms_xxx \u76ee\u5f55\u5220\u6389\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u91cd\u65b0\u505a\u6570\u636e\u56de\u586b\u4e86\uff1b"},{"location":"#24-csv","title":"2.4. \u5bfc\u51fa CSV \u6587\u4ef6","text":"\u6846\u67b6\u63d0\u4f9b\u5bfc\u51fa\u6307\u5b9a\u6807\u7b7e\u7528\u4f8b\u7684\u529f\u80fd\uff1a youqu manage.py exportcsv -a deepin-album -t CICD\n \u8868\u793a\u5bfc\u51fa deepin-album \u7684\u7528\u4f8b\u4e2d\u6807\u8bb0\u4e86 CICD \u6807\u7b7e\u7684\u7528\u4f8b\uff0c\u5bfc\u51fa CSV \u6587\u4ef6\u7684\u5b57\u6bb5\u683c\u5f0f\u5df2\u7ecf\u9002\u914d\u4e86 CICD \u7684\u8981\u6c42\u3002"},{"location":"#25-app","title":"2.5. \u811a\u624b\u67b6\u65b0\u5efa APP \u5de5\u7a0b","text":"\u65b0\u5efa\u4e00\u4e2a APP \u5de5\u7a0b\uff1a youqu manage.py startapp autotest_deepin_some \u8fd9\u6837\u5728 apps \u76ee\u5f55\u4e0b\u4f1a\u521b\u5efa\u4e00\u4e2a\u5b50\u9879\u76ee\u5de5\u7a0b autotest_deepin_some\uff0c\u540c\u65f6\u65b0\u5efa\u597d\u5de5\u7a0b\u6a21\u677f\u76ee\u5f55\u548c\u6a21\u677f\u6587\u4ef6\uff1a apps\n\u2514\u2500\u2500 autotest_deepin_some\n \u00a0\u00a0 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_case.py\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 config.ini\n \u00a0\u00a0 \u251c\u2500\u2500 config.py\n \u00a0\u00a0 \u251c\u2500\u2500 conftest.py\n \u00a0\u00a0 \u251c\u2500\u2500 control\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_assert.py\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some.csv\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u2514\u2500\u2500 widget\n \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 case_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 other.ini\n \u00a0\u00a0 \u251c\u2500\u2500 other_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 pic_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2514\u2500\u2500 ui.ini\n autotest_deepin_some \u662f\u4f60\u7684\u5de5\u7a0b\u540d\u79f0\uff0c\u6bd4\u5982\uff1aautotest_deepin_music \uff1b \u5728\u6b64\u57fa\u7840\u4e0a\uff0c\u4f60\u53ef\u4ee5\u5feb\u901f\u7684\u5f00\u59cb\u4f60\u7684 AT \u9879\u76ee\u3002"},{"location":"#26","title":"2.6. \u7528\u4f8b\u6807\u7b7e\u81ea\u52a8\u540c\u6b65","text":"\u7528\u4e8e\u81ea\u52a8\u540c\u6b65 PMS \u7528\u4f8b\u6807\u7b7e\u6570\u636e\u81f3\u672c\u5730 CSV \u6587\u4ef6\uff0c\u4e3b\u8981\u901a\u8fc7\u4ee5\u4e0b\u51e0\u4e2a\u914d\u7f6e\u6765\u63a7\u5236\uff1a APP_NAME = # \u6307\u5b9a\u8981\u540c\u6b65\u7684\u5e94\u7528\u540d\u79f0\nPMS_USER = # PMS\u7684\u7528\u6237\u540d\nPMS_PASSWORD = # PMS\u7684\u5bc6\u7801\n \u5728 [csv_link_pms_id] \u8282\u70b9\u4e0b\u6307\u5b9a csv \u6587\u4ef6\u540d\u4e0e PMS \u7528\u4f8b\u6a21\u5757\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u6bd4\u5982\uff1a [csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/testcase-browse-53.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 53\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic = 53\n \u5c06\u4ee5\u4e0a\u4fe1\u606f\u914d\u7f6e\u597d\u4e4b\u540e\uff0c\u5728\u547d\u4ee4\u884c\u6267\u884c\uff1a youqu manage.py pms --pms2csv yes\n \u6bcf\u6b21\u6267\u884c\u65f6\u539f csv \u6587\u4ef6\u4f1a\u81ea\u52a8\u5907\u4efd\u5728 report/csv_back \u76ee\u5f55\u4e0b\uff0c\u56e0\u6b64\u4f60\u4e0d\u7528\u62c5\u5fc3\u811a\u672c\u6267\u884c\u5bfc\u81f4\u4f60\u7684\u6570\u636e\u4e22\u5931\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u57fa\u7840\u6846\u67b6\u8bbe\u8ba1\u65b9\u6848","text":"# ====================================\n# Author : Mikigo\n# Time : 2022/3/18\n# version \uff1a1.0\n# ====================================\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"\u505a\u4e00\u4e2a\u7b80\u5355\u3001\u597d\u7528\u3001\u529f\u80fd\u5f3a\u5927\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u3002 \u4f5c\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4e00\u4e2a\u57fa\u7840\u6846\u67b6\uff0c\u4efb\u4f55\u5e94\u7528\u90fd\u80fd\u5f88\u65b9\u4fbf\u7684\u63a5\u5165\u8fdb\u6765\uff1b \u63d0\u4f9b\u6240\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u9700\u8981\u7684\u5e95\u5c42\u529f\u80fd\uff0c\u5e76\u5bf9\u5916\u63d0\u4f9b\u552f\u4e00\u7684\u63a5\u53e3\uff0c\u65b9\u4fbf\u5e94\u7528\u5e93\u4f7f\u7528\uff1b \u6574\u5408\u516c\u5171\u5e93\uff0c\u51cf\u5c11\u5e94\u7528\u5e93\u4ee3\u7801\u91cf\u548c\u65b9\u6cd5\u7ef4\u62a4\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u8bbe\u8ba1\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u7edf\u4e00\u6982\u5ff5","text":" \u57fa\u7840\u6846\u67b6 \u672c\u9879\u76ee\u662f\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\uff08AutoTest Basic Frame\uff09\uff0c\u5168\u79f0\u4e3a\u201c\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff08AT \u57fa\u7840\u6846\u67b6\uff09\u201d\u3002 AT \u57fa\u7840\u6846\u67b6\u662f\u505a\u4e3a\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\u6765\u8bbe\u8ba1\u7684\uff0c\u5b83\u63d0\u4f9b\u4e86\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u57fa\u7840\u529f\u80fd\uff0c\u4efb\u4f55\u5e94\u7528\u63a5\u5165\u8fdb\u6765\u90fd\u80fd\u5feb\u901f\u65b9\u4fbf\u7684\u8fdb\u884c\u65b9\u6cd5\u548c\u7528\u4f8b\u7f16\u5199\uff0c\u540c\u65f6\u5728\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u3001\u6807\u7b7e\u5316\u6267\u884c\u3001\u5206\u5e03\u5f0f\u6267\u884c\u3001\u591a\u79cd\u62a5\u544a\u8f93\u51fa\u3001\u4f18\u7f8e\u7684\u6267\u884c\u65e5\u5fd7\u3001\u5931\u8d25\u81ea\u52a8\u5f55\u5c4f\u548c\u622a\u56fe\u3001\u81ea\u52a8\u73af\u5883\u6e05\u7406\u7b49\u7b49\uff0c\u5b83\u90fd\u63d0\u4f9b\u4e86\u5b8c\u5584\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u66f4\u91cd\u8981\u7684\u662f\u8fd9\u4e00\u5207\u4f7f\u7528\u8d77\u6765\u90fd\u975e\u5e38\u7b80\u5355\u3002 \u57fa\u7840\u6846\u67b6\u4e2d\u5305\u542b\u5e94\u7528\u5e93\uff08apps\uff09\u3001\u6838\u5fc3\u5e93\uff08src\uff09\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09\u3002 \u5e94\u7528\u5e93\uff08apps\uff09 \u5404\u4e2a\u5e94\u7528\u81ea\u5df1\u7684\u4ed3\u5e93\uff0c\u91cc\u9762\u4e3b\u8981\u5305\u542b\u7684\u662f\u7528\u4f8b\u3001\u65b9\u6cd5\u53ca\u4e00\u4e9b\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u53eb autotest-dde-file-manager \u3002 \u6838\u5fc3\u5e93\uff08src\uff09 \u6838\u5fc3\u5e93\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u5230\u6240\u6709\u5e95\u5c42\u6838\u5fc3\u529f\u80fd\uff0c\u8fd9\u662f\u6700\u91cd\u8981\u7684\u4e00\u4e2a\u90e8\u5206\uff0c\u7075\u9b42\u3002\u5177\u4f53\u529f\u80fd\u6a21\u5757\u53ca\u8bf4\u660e\u4f1a\u5728\u4e0b\u9762\u7b2c\u56db\u4e2a\u7ae0\u8282\u8be6\u7ec6\u63cf\u8ff0\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09 \u591a\u4e2a\u5e94\u7528\u90fd\u8981\u7528\u5230\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\uff0c\u6309\u7167\u5e94\u7528\u5212\u5206\u5b58\u653e\uff0c\u4e3b\u8981\u662f\u4e3a\u4e86\u51cf\u5c11\u4ee3\u7801\u91cf\uff0c\u6d88\u9664\u5e94\u7528\u95f4\u7684\u8026\u5408\u5173\u7cfb\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u67b6\u6784\u56fe","text":"\u6574\u4f53\u7684\u6846\u67b6\u8bbe\u8ba1\u5728\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u300b\u6587\u6863\u91cc\u9762\u5df2\u7ecf\u6709\u8be6\u7ec6\u63cf\u8ff0\u4e86\uff0c\u8fd9\u91cc\u8d34\u4e00\u4e0b\u6574\u4f53\u7684\u67b6\u6784\u56fe\uff1a \u4e3a\u4e86\u7a81\u663e\u672c\u6587\u7684\u91cd\u70b9\uff0c\u62bd\u53d6\u5176\u4e2d\u91cd\u8981\u529f\u80fd\u6a21\u5757\uff0c\u5982\u4e0b\u56fe\uff1a "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-basic-frame # \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\n\u251c\u2500\u2500 apps # \u5e94\u7528\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-dde-file-manager # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\uff08\u5e94\u7528\u5e93\u8be6\u7ec6\u76ee\u5f55\u7ed3\u6784\u8bf7\u770b\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\uff09\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 tag # \u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u2514\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u2502 \u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 xxx.png\n\u2502 \u2502 ...\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-deepin-music # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 public # \u516c\u5171\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget # dde_dock \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget # dde_desktop \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 src # \u6838\u5fc3\u5e93\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 button_center.py\n\u2502 \u251c\u2500\u2500 cmdtrl.py\n\u2502 \u251c\u2500\u2500 dogtails.py\n\u2502 \u251c\u2500\u2500 find_image.py\n\u2502 \u251c\u2500\u2500 global_config.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 setting # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 config.py\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 global_config.ini\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\u6a21\u5757\uff08Hook\uff09\n\u251c\u2500\u2500 pytest.ini # Pytest \u9ed8\u8ba4\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 docs # \u6587\u6863\u76ee\u5f55\n\u2514\u2500\u2500 manage.py # \u6267\u884c\u5668\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1apps","title":"1\u3001\u5e94\u7528\u5e93\uff08apps\uff09","text":"\u6240\u6709\u5e94\u7528\u5e93\u5747\u653e\u7f6e\u5728\u57fa\u7840\u6846\u67b6\u4e0b\u7684 apps \u76ee\u5f55\u4e0b\uff08\u89c1\u7b2c\u4e8c\u7ae0\u8282\u7b2c3\u6bb5\u76ee\u5f55\u7ed3\u6784\u5185\u5bb9\uff09\u3002\u5e94\u7528\u5e93\u7684\u67b6\u6784\u8bbe\u8ba1\u53ef\u4ee5\u53c2\u8003\u300aAT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b\u6587\u6863\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2src","title":"2\u3001\u6838\u5fc3\u5e93\uff08src\uff09","text":"\u5728 src \u76ee\u5f55\u4e0b\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u5e95\u5c42\u6838\u5fc3\u7ec4\u4ef6\uff0c\u901a\u5e38\u6765\u8bb2\u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5230\u5176\u4e2d\u67d0\u4e00\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4e48\u4f60\u9700\u8981\u663e\u793a\u7684\u5bfc\u5165\u8fd9\u4e2a\u6a21\u5757\uff0c\u7136\u540e\u624d\u80fd\u4f7f\u7528\u8be5\u6a21\u5757\u4e0b\u7684\u529f\u80fd\uff0c\u5982\u679c\u4f60\u7528\u5230\u4e86\u5341\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4f60\u5c31\u9700\u8981\u5bfc\u5165\u5341\u4e2a\u3002\u4f46\u662f\u6211\u4eec\u60f3\u8ba9\u4e8b\u60c5\u53d8\u5f97\u7b80\u5355\uff0c\u4e00\u6b21\u5bfc\u5165\uff0c\u4f7f\u7528\u6240\u6709\u3002 \u5c06\u6240\u6709\u7684\u529f\u80fd\u6a21\u5757\u90fd\u8fdb\u5165\u5230 src \u7684\u540d\u79f0\u7a7a\u95f4\uff0c\u5728 src/__init__.py \u91cc\u9762\u6211\u4eec\u8bbe\u8ba1\u6210\u8fd9\u6837\uff1a # src/__init__.py\nfrom .cmdctl import CmdCtl\nfrom .dogtails import Dogtail\nfrom .find_image import FindImage\nfrom .button_center import ButtonCenter\nclass Src(CmdCtl, FindImage):\ndef __init__(self, **kwargs):\n\"\"\"dogtail or button center param\n :param kwargs: app_name, desc, number\n \"\"\"\nif kwargs:\napp_name = kwargs.get(\"APP_NAME\")\ndesc = kwargs.get(\"DESC\")\nif app_name is None or desc is None:\nraise ValueError\nnumber = kwargs.get(\"number\")\nnumber = number if isinstance(number, int) else -1\n# \u5bf9\u8c61\u7ec4\u5408\nself.dog = Dogtail(app_name, desc, number)\nself.ui = ButtonCenter(app_name, number)\n \u9700\u8981\u4f20\u9012\u53c2\u6570\u7684\u91c7\u7528\u5bf9\u8c61\u7ec4\u5408\uff0c\u6ca1\u6709\u53c2\u6570\u7684\u4f7f\u7528\u7ee7\u627f\uff0c\u7ee7\u627f\u7684\u7c7b\u7b26\u5408 Mixin \u8bbe\u8ba1\u6a21\u5f0f\u3002 \u5e94\u7528\u5e93\u91cc\u9762\u4f7f\u7528\u7684\u65f6\u5019\u5728 widget/base_widget.py \u91cc\u9762\u53ea\u9700\u8981\u552f\u4e00\u7ee7\u627f Src \uff1a # \u5e94\u7528\u5e93\u91cc\u9762\u65b9\u6cd5\u57fa\u7c7b\n# widget/base_widget.py\nfrom src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n \u8981\u4f7f\u7528\u6838\u5fc3\u5e93\u7684\u529f\u80fd\uff0c\u53ea\u9700\u8981\u5199\u4e00\u4e2a\u5bfc\u5165 from src import Src \u5373\u53ef\u3002 \u5199 __init__ \u6784\u9020\u51fd\u6570\u7684\u539f\u56e0\u662f\u901a\u8fc7\u53c2\u6570\u6784\u9020\u5e94\u7528\uff0c\u5e76\u4e14\u4f20\u9012 number \u8fdb\u6765\uff0c\u53ef\u4ee5\u5b9e\u73b0\u591a\u7a97\u53e3\u7684\u63a7\u5236\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3public","title":"3\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09","text":"\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6bcf\u4e2a\u5e94\u7528\u90fd\u662f\u4e00\u4e2a\u5355\u72ec\u7684 py \u6587\u4ef6\uff0c\u76f8\u4e92\u4e4b\u95f4\u662f\u72ec\u7acb\u7684\uff0c\u6bcf\u4e2a py \u6587\u4ef6\u91cc\u9762\u662f\u8be5\u5e94\u7528\u7684\u65b9\u6cd5\u7c7b\uff0c\u6bd4\u5982\uff1a\u6700\u5e38\u7528\u7684\u65b9\u6cd5\u7c7b dde_desktop_public_widget.py # dde_desktop_widget.py\nfrom src import Src\nclass _DdeDesktopPublicBaseWidget(Src):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-desktop\"\nDESC = \"/usr/bin/dde-desktop\"\ndef __init__(self):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC)\nclass DdeDesktopPublicWidget(_DdeDesktopPublicBaseWidget):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u7c7b\"\"\"\ndef click_music_dir_by_ui(self):\n\"\"\"\u5728\u6587\u4ef6\u9009\u62e9\u6846\u70b9\u51fb\u97f3\u4e50\u76ee\u5f55\"\"\"\nself.click(*self.ui.btn_center(\"\u4fa7\u8fb9\u680f-\u97f3\u4e50\")) \ndef click_xxx_by_attr(self):\npass\n \u516c\u5171\u65b9\u6cd5\u5e93\u610f\u4e49\uff1a \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6240\u5c01\u88c5\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\u90fd\u662f\u81f3\u5c11\u88ab2\u4e2a\u5e94\u7528\u90fd\u7528\u5230\u7684\uff0c\u8fd9\u6837\u505a\u53ef\u4ee5\u51cf\u5c11\u6574\u4f53\u4ee3\u7801\u91cf\uff0c\u4ece\u800c\u51cf\u8f7b\u5e94\u7528\u5e93\u4ee3\u7801\u7684\u7ef4\u62a4\u5de5\u4f5c\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u7f16\u5199\u5f62\u5f0f\uff08\u547d\u540d\u89c4\u5219\u3001\u5b9a\u4f4d\u7684\u65b9\u6848\u5199\u6cd5\u3001\u6ce8\u91ca\u7684\u5199\u6cd5\u7b49\u7b49\uff09\u5177\u6709\u4e00\u5b9a\u7684\u6a21\u677f\u4f5c\u7528\uff0c\u8fd9\u6837\u5373\u4f7f\u662f\u5404\u4e2a\u5e94\u7528\u5e93\u90fd\u72ec\u7acb\u7ef4\u62a4\uff0c\u6240\u6709\u7684\u7f16\u7801\u98ce\u683c\u90fd\u662f\u8d8b\u4e8e\u76f8\u540c\u7684\uff0c\u56e0\u4e3a\u5927\u5bb6\u90fd\u5e94\u8be5\u53c2\u7167\u516c\u5171\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u5199\u6cd5\u6765\u5199\u81ea\u5df1\u5e94\u7528\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\u7c7b\uff0c\u8fd9\u6837\u4f7f\u5f97\u4ece\u516c\u53f8\u7684\u89d2\u5ea6\u53bb\u770b\u6240\u6709\u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u90fd\u662f\u7edf\u4e00\u7684\u3002 \u53ef\u4ee5\u901a\u8fc7\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\uff0c\u4e86\u89e3\u5230\u5176\u4ed6\u5e94\u7528\u7684\u529f\u80fd\uff0c\u5bf9\u4e8e\u6211\u4eec\u9700\u6c42\u7406\u89e3\uff0c\u4e86\u89e3\u7cfb\u7edf\u7684\u65b9\u65b9\u9762\u9762\u4e5f\u6709\u597d\u5904\u3002 \u5f53\u7136\uff0c\u5982\u679c\u4f60\u7684\u5e94\u7528\u672c\u8eab\u662f\u5c5e\u4e8e\u6839\u672c\u5c31\u4e0d\u9700\u8981\u548c\u5176\u4ed6\u5e94\u7528\u4ea4\u4e92\u7684\uff0c\u90a3\u4e48\u4f60\u53ef\u80fd\u4e0d\u4f1a\u7528\u5230\u8fd9\u91cc\u9762\u7684\u529f\u80fd\uff0c\u6ca1\u5173\u7cfb\uff0c\u4f60\u6240\u6709\u7684\u65b9\u6cd5\u90fd\u53ef\u4ee5\u76f4\u63a5\u5199\u5728\u5e94\u7528\u5e93\u7684\u4e1a\u52a1\u5c42\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4conftestpy","title":"4\u3001conftest.py","text":"conftest.py \u4ece\u529f\u80fd\u4e0a\u5c06\u662f\u5c5e\u4e8e\u6838\u5fc3\u5e93\uff08src\uff09\u7684\u5185\u5bb9\uff0c\u4f46\u662f\u7531\u4e8e\u5b83\u7684\u7279\u6b8a\u6027\uff0c\u5373\u5b83\u662f\u5bf9\u5e94\u7528\u5e93\u4e2d\u7684\u7528\u4f8b\u751f\u6548\u7684\uff0c\u800c\u4e14\u5b83\u7684\u4f5c\u7528\u57df\u662f\u5f53\u524d\u76ee\u5f55\u53ca\u4ee5\u4e0b\uff0c\u56e0\u6b64\u6211\u4eec\u5c06\u5b83\u653e\u5230\u9879\u76ee\u6839\u76ee\u5f55\u3002\u6211\u4eec\u6846\u67b6\u4e2d\u6709\u4e0d\u5c11\u6838\u5fc3\u529f\u80fd\u90fd\u662f\u5728\u8fd9\u91cc\u9762\u8fdb\u884c\u5f00\u53d1\u7684\uff0c\u540e\u9762\u7b2c\u56db\u7ae0\u4f1a\u8bb2\u5230\u7ec6\u8282\u3002 pytest.ini \u4f5c\u7528\u548c conftest.py \u7c7b\u4f3c\uff0c\u662f Pytest \u6846\u67b6\u7684\u56fa\u5b9a\u914d\u7f6e\u6587\u4ef6\uff0c\u76ee\u524d\u914d\u7f6e\u4e86\u4e00\u4e9b\u901a\u7528\u7684\u547d\u4ee4\u884c\u6267\u884c\u53c2\u6570\uff0c\u4e5f\u653e\u5728\u9879\u76ee\u6839\u76ee\u5f55\u3002 \u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 Hook \u51fd\u6570\uff0capps \u76ee\u5f55\u4e0b\u7684 \u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 fixture \u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5setting","title":"5\u3001setting","text":"\u5168\u5c40\u914d\u7f6e\u6a21\u5757\uff0c\u5305\u542b\u4e86\u4ee5\u4e0b\u914d\u7f6e\u6587\u4ef6\uff1a \uff081\uff09ini \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u914d\u7f6e\u4e00\u4e9b\u5168\u5c40\u7684\u914d\u7f6e\u9879\uff0c\u8b6c\u5982\uff1a\u5931\u8d25\u91cd\u8dd1\u6b21\u6570\u3001\u662f\u5426\u5931\u8d25\u5f55\u5c4f\u3001\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\u3001\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4\u3001\u6267\u884c\u65f6\u65e5\u5fd7\u7ea7\u522b\u3001\u751f\u6210\u7684\u62a5\u544a\u7c7b\u578b\u3001\u4ee5\u53ca\u5206\u5e03\u5f0f\u6267\u884c\u7684\u4e00\u4e9b\u7b56\u7565\u914d\u7f6e\u9879\u7b49\u7b49\u3002 \uff082\uff09config.py \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u63d0\u4f9b\u914d\u7f6e\u6587\u4ef6\u8bfb\u53d6\u3001\u52a8\u6001\u83b7\u53d6\u4e00\u4e9b\u5e38\u91cf\uff08\u5982\u9879\u76ee\u6839\u76ee\u5f55\u7edd\u5bf9\u8def\u5f84 (BASE_DIR)\u3001\u7cfb\u7edf\u67b6\u6784\uff08SYS_FRAME\uff09\u3001\u65f6\u95f4\u5b57\u7b26\u4e32\uff08strftime\uff09\u3001\u672c\u673a USERNAME IP \u7b49\u7b49\uff09\u3001\u516c\u5171 URL \u7b49\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u89c4\u8303","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u7248\u672c\u53ca\u4f9d\u8d56","text":"\u57fa\u7840\u6846\u67b6\u4f1a\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u8fdb\u884c\u7248\u672c\u53d1\u5e03\uff0c\u4e0d\u4e0e\u67d0\u4e2a\u5e94\u7528\u7248\u672c\u7ed1\u5b9a\uff0c\u4f46\u662f\uff0c\u5e94\u7528\u5e93\u4f1a\u4f9d\u8d56\u4e8e\u57fa\u7840\u6846\u67b6\u7684\u7248\u672c\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u5efa\u8bae\u5728\u5e94\u7528\u5e93\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a\u6587\u672c\u6587\u4ef6\u7528\u4e8e\u8bb0\u5f55\u6240\u4f9d\u8d56\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\uff0c\u7c7b\u4f3c\u4e8e\u5f00\u53d1\u5e94\u7528\u7684 debian/control \u6587\u4ef6\u7684\u529f\u80fd\uff0c\u4e3a\u4e86\u4fdd\u6301\u7edf\u4e00\uff0c\u8fd9\u4e2a\u6587\u4ef6\u5c31\u547d\u540d\u4e3a control\uff0c\u653e\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u6838\u5fc3\u5e93\u72ec\u7acb\u6027","text":"\u6838\u5fc3\u5e93\u4e0d\u5efa\u8bae\u9488\u5bf9\u67d0\u4e00\u4e2a\u5e94\u7528\u5355\u72ec\u505a\u4ee3\u7801\u4e0a\u7279\u6b8a\u5904\u7406\uff0c\u901a\u5e38\u8003\u8651\u9488\u5bf9\u67d0\u4e00\u79cd\u573a\u666f\u8fdb\u884c\u5904\u7406\uff0c\u8fd9\u4e9b\u573a\u666f\u901a\u5e38\u662f\u5b58\u5728\u4e00\u4e9b\u5171\u6027\u7684\u3002\u6bd4\u5982\u8bf4\uff1a\u684c\u9762\u7684ID\u5206\u914d\u5b58\u5728\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u903b\u8f91\u5904\u7406\u89e3\u51b3ID\u5206\u914d\u9519\u8bef\u7684\u95ee\u9898\uff0c\u4f46\u662f\u8fd9\u90e8\u5206\u903b\u8f91\u6211\u4eec\u4f1a\u5728\u684c\u9762\u7684\u65b9\u6cd5\u5c42\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u517c\u5bb9\u6027","text":"\u4e3a\u4e86\u4fdd\u6301\u517c\u5bb9\u6027\uff0c\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u539f\u5219\u4e0a\u4e0d\u5bf9\u8001\u65b9\u6cd5\u8fdb\u884c\u4fee\u6539\u6216\u5220\u9664\uff0c\u53ea\u8fdb\u884c\u65b0\u589e\u3002\u6d89\u53ca\u5230\u8001\u65b9\u6cd5\u4fee\u6539\u6216\u5220\u9664\u7684\uff0c\u4f1a\u8fdb\u884c\u63d0\u524d\u9884\u544a\uff0c\u5e76\u5728\u7b2c\u4e8c\u4e2a\u7248\u672c\u4e4b\u540e\uff08\u4e2d\u95f4\u4f1a\u9694\u4e00\u4e2a\u7248\u672c\u8fc7\u5ea6\uff09\u6b63\u5f0f\u5b9e\u65bd\u4fee\u6539\u6216\u5220\u9664\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u547d\u540d\u89c4\u8303","text":" \u7528\u4f8b ID \u6bcf\u4e2a\u5e94\u7528\u81ea\u5df1\u7ef4\u62a4\u4e00\u5957 ID\uff0c\u5728PMS\u4e0a\u7528\u4f8b\u6807\u9898\u4e0a\u5c06\u81ea\u52a8\u5316ID\u4ee5\u6807\u7b7e\u7684\u5f62\u5f0f\u5199\u5165\uff0c\u6bd4\u5982\uff1a[101]\u6253\u5f00-\u542f\u52a8\u5e94\u7528\u540edock\u53f3\u952e\u83dc\u5355 \u4e00\u4e2a\u7528\u4f8b\u7c7b\u91cc\u9762\u6709\u591a\u4e2a\u7528\u4f8b\u65f6\uff0c\u5728\u7528\u4f8b\u540d\u79f0\u540e\u9762\u52a0\u5e8f\u53f7\u3002 class TestFileManager(BaseCase):\n\"\"\"\u6587\u7ba1\u7528\u4f8b\"\"\"\ndef test_xxx_015_1(self):\npass\ndef test_xxx_015_2(self):\npass\n \u6ce8\u610f 015_1\uff0c\u4e0d\u8981\u5199015_01\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 PMS \u4e0a\u7684\u7528\u4f8bID\uff1a PMS \u4e0a\u662f6\u4f4d\u6570\uff0c\u4e0d\u591f\u76f4\u89c2\uff0c\u4e5f\u4e0d\u597d\u7ef4\u62a4\uff0c\u5728\u81ea\u52a8\u5316\u4e0b\u9762\u53bb\u627e\u4e00\u4e2a\u5e26\u6709 6 \u4f4d\u6570\u7684\u6587\u4ef6\u662f\u4e00\u4e2a\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 PMS \u4e0a\u7684 ID \u53ef\u80fd\u4f1a\u53d1\u751f\u53d8\u5316\uff0c\u6bd4\u5982\u5bfc\u51fa\u6765\u5bfc\u8fdb\u53bb\u7684\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u5b58\u5728\u95ee\u9898\uff0c\u5982\u679c\u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u8981\u60f3\u627e\u51fa\u6765\u5bf9\u5e94\u4fee\u6539\u81ea\u52a8\u5316\u7528\u4f8b ID\uff0c\u5c06\u4f1a\u662f\u4ef6\u975e\u5e38\u75db\u82e6\u7684\u4e8b\u60c5\u3002 \u51fd\u6570\u547d\u540d\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5de6\u952e\u70b9\u51fb click \u53f3\u952e\u70b9\u51fb right_click \u53cc\u51fb double_click \u79fb\u52a8 move_to \u62d6\u52a8 drag \u65b0\u5efa new \u62d6\u52a8\u5230 drag_to \u4ece\u54ea\u91cc\u62d6\u52a8\u5230\u54ea\u91cc drag_something_from_xxx_to_xxx \u83b7\u53d6 get \u83b7\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5750\u6807 get_location \u975e\u7279\u6b8a\u6587\u4ef6 file word\u6587\u4ef6 doc text\u6587\u4ef6 text \u6587\u4ef6\u5939 dir \u5173\u952e\u8bcd\u6301\u7eed\u589e\u52a0 \u5e38\u91cf\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5e94\u7528\u540d\u79f0 APP_NAME \u5e94\u7528\u63cf\u8ff0 DESC \u672c\u5e94\u7528\u4ee5\u5916\u7684\u5176\u4ed6\u5e94\u7528\uff0c\u6bd4\u5982\u5e2e\u52a9 HELP \u5176\u4ed6\u540d\u79f0\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u65b9\u6cd5\u5305\u540d widget \u65b9\u6cd5\u6587\u4ef6\u540d\uff08\u6587\u7ba1\u4e3e\u4f8b\uff09 dfm_widget.pytitle_widget.pyright_view_widget.pyleft_view_widget.pypop_widget.pybase_widget.pydfm_assert.py \u65ad\u8a00\u8bed\u53e5\u547d\u540d\u89c4\u8303 \u65ad\u8a00\u8bed\u53e5\u90fd\u662f\u4ee5 assert \u5f00\u5934 \u65ad\u8a00 \u8bed\u53e5 \u5224\u65ad\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_existsassert_file_not_exists \u5224\u65ad\u684c\u9762\u76ee\u5f55\u4e0b\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_exists_in_desktopassert_file_not_exists_in_desktop \u5224\u65ad\u56fe\u7247\u5b58\u5728 assert_image_existsassert_image_not_exists \u5224\u65ad\u5f71\u9662\u4e2d\u662f\u5426\u5b58\u5728\u56fe\u7247 assert_image_exists_in_movieassert_image_not_exists_in_movie \u5224\u65ad\u5143\u7d20\u662f\u5426\u5b58\u5728 assert_element_existassert_element_not_exist \u5224\u65ad\u662f\u5426\u76f8\u7b49 assert_equalassert_not_equal \u5224\u65ad\u662f\u5426\u4e3a\u771f assert_trueassert_false"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5fixture","title":"5\u3001fixture \u89c4\u8303","text":"\u7531\u4e8e Pytest \u6846\u67b6\u4e2d\u652f\u6301 fixture \u7684\u5199\u6cd5\u548c Xunit \u5199\u6cd5\u7684\uff0c\u6240\u4ee5\u5e94\u7528\u5e93\u4e2d\u53ef\u80fd\u5b58\u5728\u6df7\u7528\u7684\u60c5\u51b5\uff0c\u4e3a\u7edf\u4e00\u7f16\u7801\u98ce\u683c\u65b9\u4fbf\u540e\u7eed\u7528\u4f8b\u4ee3\u7801\u7ef4\u62a4\uff0c\u73b0\u505a\u4ee5\u4e0b\u89c4\u8303\u8bf4\u660e\uff1a \u629b\u5f03 Xunit \u7684\u5199\u6cd5\uff0c\u7edf\u4e00\u91c7\u7528 Pytest fixture \u7684\u5199\u6cd5\u3002 \u5e94\u7528\u5185 fixture \u8c28\u614e\u4f7f\u7528 autouse=True \uff0c\u975e\u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u975e\u5e38\u4e0d\u5efa\u8bae\u4f7f\u7528\u8fd9\u4e2a\u53c2\u6570\u3002 \u8c03\u7528 fixture \u4e0d\u80fd\u4f7f\u7528 @pytest.mark.usefixture()\uff0c\u4f7f\u7528\u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u4f20\u5165\u51fd\u6570\u5bf9\u8c61\u3002 \u5efa\u8bae\u5728\u4e00\u4e2a conftest.py \u91cc\u9762\u53bb\u5199\uff0c\u4e00\u4e2a\u5e94\u7528\u4e5f\u5c3d\u91cf\u7ef4\u62a4\u4e00\u4e2a conftest.py\u6587\u4ef6\u3002 fixture \u4e5f\u9700\u8981\u5199\u529f\u80fd\u8bf4\u660e\uff0c\u51fd\u6570\u540d\u79f0\u8981\u6709\u5177\u4f53\u542b\u4e49\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#6","title":"6\u3001\u65b9\u6cd5\u7f16\u5199\u89c4\u8303","text":" \u65b9\u6cd5\u7c7b\u578b\uff1a if \u6ca1\u6709\u7528\u5230\u5b9e\u4f8b\u5bf9\u8c61\uff1a\nif \u6ca1\u6709\u7528\u5230\u7c7b\u5bf9\u8c61\uff1a\n\u5199\u9759\u6001\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @staticmethod\nelse\uff1a\n\u5199\u7c7b\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @classmethod\nelse:\n\u76f4\u63a5\u5199\u5b9e\u4f8b\u65b9\u6cd5\n \u4e3e\u4f8b: class TitleWidget:\ndef click_xxx_by_ui(self):\npass\n@staticmethod\ndef click_xxx_by_ui():\npass\n@classmethod\ndef click_xxx_by_ui(cls):\npass\n \u51fd\u6570\u540d\u79f0\u4e0d\u51fa\u73b0\u6570\u5b57\uff0c\u9700\u8981\u8868\u793a\u6570\u91cf\u7684\u7528\u5355\u8bcd\u8868\u793a\u3002 \u51fd\u6570\u529f\u80fd\u6ce8\u91ca\u3002 \u6ca1\u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg2:xxx\n\"\"\"\n \u6709\u53c2\u6570\uff0c\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg1:xxx\nreturn: xxx\n\"\"\"\n \u200b \u7528 Pycharm \u7684\u6ce8\u91ca\u6a21\u677f\u4e5f\u53ef\u4ee5\uff0c\u53ea\u8981\u4f53\u73b0\u4e86\u53c2\u6570\u7684\u7c7b\u578b\u548c\u8fd4\u56de\u5c31\u884c\u4e86\u3002 \u6682\u4e0d\u8981\u6c42\u5199\u7c7b\u578b\u6ce8\u89e3\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#7case","title":"7\u3001\u7528\u4f8b\uff08case\uff09\u89c4\u8303","text":" \u4ee5\u7c7b\u7684\u5f62\u5f0f\u5199\u7528\u4f8b\uff0c\u7528\u4f8b\u7c7b\u96c6\u6210\u7528\u4f8b\u57fa\u7c7b\u3002 \u7528\u4f8b\u7c7b\u9700\u8981\u5199\u6ce8\u91ca\u3002 \u6d4b\u8bd5\u7528\u4f8b\u51fd\u6570\u8bf4\u660e\uff08\u5efa\u8bae\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u540d\u79f0\uff09 \"\"\"\u53f3\u4fa7\u9884\u89c8-\u56fe\u7247\u7c7b\u578b\u4fe1\u606f\u680f\u57fa\u672c\u4fe1\u606f\"\"\"\n \u4e0d\u5199\u8c03\u8bd5\u4ee3\u7801 if __name__ == '__main__':\npytest.main()\n \u6240\u6709\u7528\u4f8b\u90fd\u7ee7\u627f BaseCase\u3002 BaseCase \u91cc\u9762\u653e\u4e00\u4e9b\u6d4b\u8bd5\u6570\u636e\u7684\u5e38\u91cf\uff0c\u6bd4\u5982\u6587\u4ef6\u540d\u79f0\uff0c\u5e94\u7528\u540d\u79f0\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u4e00\u4e9b\u901a\u7528\u7684\u5b57\u7b26\u4e32\u3002 \u8fd9\u7c7b\u662f\u5c5e\u4e8e\u6d4b\u8bd5\u6570\u636e\u3002 class BaseCase(DfmAssert):\n\"\"\"\u7528\u4f8b\u57fa\u7c7b\"\"\"\nNEW_FILE = \"\u65b0\u5efa\u6587\u672c.txt\"\nTEST_FILE = \"test.txt\"\nNEW_DIR = \"\u65b0\u5efa\u6587\u4ef6\u5939\"\nNEW_WORD = \"\u65b0\u5efaWord\u6587\u6863.doc\"\nAPP_HELP = \"damn\"\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\n\"\"\"\u7528\u4f8b\u6807\u9898\uff08\u590d\u5236PMS\u4e0a\u7528\u4f8b\u6807\u9898\uff09\"\"\"\ndfm = DfmWidget()\ndfm.click_xxx_by_attr(self.NEW_FILE)\ndfm.new_file_in_desktop_by_cmd(self.NEW_FILE)\nself.assert_true(dfm.get_process_status(self.APP_NAME))\n \u7528\u4f8b\u91cc\u9762\u5c3d\u91cf\u51cf\u5c11\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\uff0c\u66f4\u8981\u51cf\u5c11\u76f8\u540c\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\u3002 \u7edf\u4e00\u6587\u4ef6\u6ce8\u91ca\u5934\u3002 #!/usr/bin/env python3\n# _*_ coding:utf-8 _*_\n\"\"\"\n:Author:email@uniontech.com\n:Date :${DATE} ${TIME}\n\"\"\"\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#8","title":"8\u3001\u5176\u4ed6\u89c4\u8303","text":" \u65e5\u5fd7\u6253\u5370\u8981\u5728\u65b9\u6cd5\u6700\u524d\u9762\uff0c\u5426\u5219\u4ee3\u7801\u62a5\u9519\u6ca1\u6709\u65e5\u5fd7\u8f93\u51fa\uff0c\u4e0d\u597d\u5b9a\u4f4d\u95ee\u9898\u3002\uff08\u6211\u4eec\u4f1a\u8003\u8651\u7ee7\u7eed\u4f7f\u7528\u62e6\u622a\u5668\u6253\u5370\u65e5\u5fd7\uff09 \u6240\u6709\u7684\u64cd\u4f5c\u90fd\u9700\u8981\u6709\u65e5\u5fd7\uff0c\u5305\u62ec sleep()\uff0c\u6211\u4eec\u4f1a\u91cd\u5199\u4e00\u4e2a\u6709\u65e5\u5fd7\u8f93\u5165\u7684 sleep\u3002 \u4e1a\u52a1\u5c42\u65e5\u5fd7\u7ea7\u522b\u4e3a INFO\u3002 hook \u51fd\u6570\u53ea\u80fd\u5199\u5230\u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u91cc\u9762\u3002 apps \u76ee\u5f55\u4e0b\u7684 conftest.py \u539f\u5219\u4e0a\u4e0d\u4f1a\u65b0\u589e fixture\u3002 \u56fa\u5b9a\u76ee\u5f55\u6216\u5143\u7d20\u63a7\u4ef6\u7684\u64cd\u4f5c\uff0c\u5c06\u64cd\u4f5c\u65b9\u6cd5\u5199\u6b7b\uff0c\u6587\u4ef6\u7c7b\u64cd\u4f5c\u5c06\u6587\u4ef6\u540d\u7559\u53c2\u6570\u3002 \u8def\u5f84\u62fc\u63a5\u89c4\u8303\uff1a \u7cfb\u7edf\u4e2d\u56fa\u5b9a\u76ee\u5f55\uff0c\u8def\u5f84\u62fc\u63a5\u65f6\u4f7f\u7528\u6ce2\u6d6a\u7b26\u53f7\uff0c\u6bd4\u5982\uff1a~/Desktop/\uff0c\u4e0b\u5c42\u4f7f\u7528 os.path.expanduser()\uff0c\u5b83\u53ef\u4ee5\u81ea\u52a8\u8bc6\u522b\u6ce2\u6d6a\u7b26\u53f7\u3002 \u9879\u76ee\u4e0b\u8def\u5f84\u4f7f\u7528\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u8def\u5f84\uff0c\u6bd4\u5982\uff1aConfig.BASE_PATH\uff0c\u56e0\u4e3a\u9879\u76ee\u662f\u53ef\u4ee5\u5728\u4efb\u610f\u8def\u5f84\u8fd0\u884c\u7684\uff0c\u9700\u8981\u52a8\u6001\u62fc\u63a5\u8def\u5f84\u3002 "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848","text":"# =================================================\n# Author : Mikigo\n# Time : 2022/3/16\n# version \uff1a1.0\n# =================================================\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"AT \u5e94\u7528\u5e93\u6539\u9020\u662f\u57fa\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u8fdb\u884c\u7528\u4f8b\u65b9\u6cd5\u548c\u4e1a\u52a1\u903b\u8f91\u7684\u91cd\u65b0\u8bbe\u8ba1\uff0c\u4ee5\u5b9e\u73b0\u5e94\u7528\u5e93\u9ad8\u6548\u7684\u7f16\u5199\u3001\u7ef4\u62a4\u7528\u4f8b\u53ca\u5176\u65b9\u6cd5\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u6587\u4ef6\u7ba1\u7406\u5668\u4ece\u4e1a\u52a1\u590d\u6742\u5ea6\u548c\u7528\u4f8b\u91cf\u6765\u8bb2\uff0c\u5728\u7cfb\u7edf\u6240\u6709\u5e94\u7528\u4e2d\uff0c\u662f\u5f88\u6709\u4ee3\u8868\u6027\u7684\uff0c\u96be\u5ea6\u4e5f\u662f\u6700\u5927\u7684\uff0c\u56e0\u6b64\u6211\u4eec\u9009\u53d6\u6587\u4ef6\u7ba1\u7406\u5668\u4f5c\u4e3a\u5e94\u7528\u5e93\u6539\u9020\u7684\u5b9e\u9a8c\u5e94\u7528\uff0c\u7ed9\u540e\u7eed\u5176\u4ed6\u5e94\u7528\u6539\u9020\u63d0\u4f9b\u5207\u5b9e\u53ef\u884c\u7684\u601d\u8def\u548c\u65b9\u6848\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u5206\u5c42\u8bbe\u8ba1\u56fe","text":"\u6574\u4f53\u4ecd\u7136\u9075\u5faa PO \u8bbe\u8ba1\u7406\u5ff5\uff0c\u6839\u636e\u4e1a\u52a1\u9700\u8981\uff0c\u5c06\u6587\u7ba1\u4e1a\u52a1\u5c42\u8fdb\u884c 3 \u5c42\u5212\u5206\uff1a "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-dde-file-manager # \u5e94\u7528\u4ed3\u5e93\n\u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 test_xxx_001.py\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u00a0\u251c\u2500\u2500 __init__.py\n\u2502 \u00a0\u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u00a0\u251c\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u00a0\u251c\u2500\u2500 base_widget.py # \u65b9\u6cd5\u57fa\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 title_widget.py # title \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 right_view_widget.py # right view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 left_view_widget.py # left view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 pop_widget.py # pop \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 dfm_widget.py # \u65b9\u6cd5\u7684\u7edf\u4e00\u51fa\u53e3\n\u2502 \u00a0\u2514\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 tag # \u7528\u4f8b\u6807\u7b7e\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 xxx.csv # \u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2514\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u57fa\u7c7b","text":" \u7ee7\u627f\u6838\u5fc3\u5c42\u7684\u5404\u4e2a\u6a21\u5757\u7c7b\u3002 \u62bd\u53d6\u64cd\u4f5c\u5c42\u7684\u4e00\u4e9b\u57fa\u7840\u65b9\u6cd5\u3002 \u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u7684\u4e00\u4e9b\u516c\u5171\u65b9\u6cd5\u3002 \u8def\u5f84\u7ec4\u88c5\u65b9\u6cd5\u3002 \u4e00\u4e9b\u4e1a\u52a1\u5c42\u76f8\u5173\u7684\u53d8\u91cf\u3001\u5e38\u91cf\u3001shell\u547d\u4ee4\u3001\u5750\u6807\u3002 \u65b9\u6cd5\u57fa\u7c7b\u7684\u5199\u6cd5\uff1a from src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u64cd\u4f5c\u5c42","text":" \u6a21\u5757\u5212\u5206 \u6309\u7167\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u6587\u7ba1\u4e3b\u754c\u9762\u5206\u4e3a\u4e09\u4e2a\u533a\u57df\uff1a\u6807\u9898\u680f\u3001\u53f3\u8fb9\u89c6\u56fe\u533a\u57df\u3001\u5de6\u8fb9\u89c6\u56fe\u533a\u57df \u5f39\u7a97\uff1a\u8bbe\u7f6e\u754c\u9762\u5f39\u7a97\u3001\u4fdd\u9669\u7bb1\u5f39\u7a97\u3001\u5220\u9664\u786e\u8ba4\u5f39\u7a97\u3001\u53ca\u5404\u79cd\u7f51\u7edc\u5f39\u7a97 \u53f3\u952e\u83dc\u5355\uff1a\u6682\u65f6\u4e0d\u8003\u8651\u4e3a\u5355\u72ec\u7684\u6a21\u5757\uff0c\u8003\u8651\u4ee5\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6848\u505a\u6210\u516c\u5171\u5e93\u3002 \u5404\u4e2a\u6a21\u5757\u53ea\u7ee7\u627f\u57fa\u7c7b from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u6784\u9020\u51fd\u6570\u91cc\u9762\u4e0d\u6784\u9020\u5bf9\u8c61\uff0c\u53ef\u4ee5\u521d\u59cb\u5316\u4e00\u4e9b\u53d8\u91cf\u3002 \u4e0d\u540c\u7684\u5b9a\u4f4d\u65b9\u6848\u8c03\u7528\u4e0d\u540c\u7684\u5b9a\u4f4d\u5de5\u5177\u5bf9\u8c61\u3002 self.dog\nself.ui\nself.d_bus\n \u65b9\u6cd5\u7f16\u5199 \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u5e94\u7528\u5c42","text":" \u7ee7\u627f\u64cd\u4f5c\u5c42\u7684\u6240\u6709\u7c7b\u3002 \u4ec5\u4ec5\u7528\u4e8e\u7528\u4f8b\u4e2d\u5bfc\u5165\u65b9\u4fbf\uff0c\u4e0d\u505a\u5176\u4ed6\u4e8b\u60c5\u3002 class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n DfmAssert \u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u7ee7\u627f\uff0c\u65b9\u4fbf\u4f7f\u7528\u65ad\u8a00\u8bed\u53e5\u3002 from apps.dde_file_manager.widget.dfm_widget import DfmWidget\nfrom public.assert import Assert\nclass DfmAssert(Assert):\ndef assert_file_exists_in_desktop(self, file_name):\nself.assert_file_exists(f\"~/Desktop{file_name}\")\n...\nDfmWidget().get_file_in_desktop()\n \u7528\u4f8b\u91cc\u9762\u76f4\u63a5\u7ee7\u627f\uff0c\u65b9\u4fbf\u5728\u7528\u4f8b\u91cc\u9762\u4f7f\u7528 self \u8fdb\u884c\u65ad\u8a00\uff0c\u66f4\u7b26\u5408\u65ad\u8a00\u7684\u4f7f\u7528\u4e60\u60ef\uff0c\u7528\u4f8b\u903b\u8f91\u4e0a\u66f4\u6e05\u695a\u3002 class BaseCase(DfmAssert):\npass\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\nself.assert_file_exists_in_desktop(\"xxx\")\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u903b\u8f91\u4e3e\u4f8b","text":"\u7528\u4f8b\u4ee3\u7801\u8c03\u7528\u903b\u8f91\u4e3e\u4f8b\uff1a # BaseWidget\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n# =============================================\n# TitleWidget\nclass TitleWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_title_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# RightViewWidget\nclass RightViewWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_right_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# =============================================\n# \u51fa\u53e3 DfmWidget\nclass DfmWidget(TitleWidget, RightViewWidget):\npass\n# =============================================\n# in case\nfrom apps.dde_file_manager.widget.dfm_widget import DfmWidget\ndfm = DfmWidget()\ndfm.click_xxx_title_by_ui()\ndfm.click_xxx_right_by_ui()\ndfm.dog.print_desc()\ndfm.ui.print_number()\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u5de5\u7a0b\u6539\u9020\u5b9e\u65bd\u6b65\u9aa4","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_2","title":"1\u3001\u5de5\u7a0b\u4ee3\u7801\u62c9\u53d6","text":"1.1. \u5c06\u81ea\u52a8\u5316\u57fa\u7840\u6846\u67b6\u7684\u529f\u80fd\u62c9\u5230\u672c\u5730 Autotest Basic Frame \uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame 1.2. \u5c06\u5e94\u7528\u5e93\u4ee3\u7801\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u5e94\u7528\u5e93\u7684\u4ed3\u5e93\u547d\u540d\u5e94\u8be5\u662f\u957f\u8fd9\u6837\u7684 autotest_deepin_xxx\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_2","title":"2\u3001\u8c03\u6574\u5de5\u7a0b\u76ee\u5f55","text":"\u6309\u7167 \u65b9\u6848\u8bbe\u8ba1-\u76ee\u5f55\u7ed3\u6784 \u8fdb\u884c\u76ee\u5f55\u8c03\u6574\uff0c\u5c3d\u91cf\u4f7f\u7528\u7f16\u8f91\u5668\u8fdb\u884c\u76f8\u5e94\u7684\u8c03\u6574\uff0c\u7f16\u8f91\u5668\u63a8\u8350\u4f7f\u7528 Pycharm \uff0c\u4ee5\u4e0b\u64cd\u4f5c\u5747\u5728 Pycharm \u91cc\u9762\u53ef\u5b9e\u73b0\u3002 2.1. \u9700\u8981\u79fb\u52a8 py \u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u76f4\u63a5\u5728\u7f16\u8f91\u5668\u91cc\u9762\uff0c\u4f7f\u7528\u9f20\u6807\u9009\u4e2d\u5e76\u6309\u4f4f\uff0c\u4e4b\u540e\u62d6\u52a8\u5230\u76ee\u6807\u4f4d\u7f6e\u5373\u53ef\uff0cPycharm \u4f1a\u5c3d\u53ef\u80fd\u7684\u81ea\u52a8\u89e3\u51b3\u79fb\u52a8\u5bfc\u81f4\u7684\u8def\u5f84\u95ee\u9898\u3002\u6ce8\u610f\uff0c\u6211\u8bf4\u7684\u662f\u201c\u5c3d\u53ef\u80fd\u201d\uff0c\u6709\u4e9b\u9a9a\u64cd\u4f5c\u7f16\u8f91\u5668\u662f\u65e0\u6cd5\u81ea\u52a8\u5904\u7406\u7684\u3002\u5982\u679c\u6ca1\u6709\u88ab\u7f16\u8f91\u5668\u81ea\u52a8\u5904\u7406\u7684\u8def\u5f84\u95ee\u9898\uff0c\u540e\u7eed\u53ea\u80fd\u624b\u52a8\u89e3\u51b3\u3002 2.2. \u9700\u8981\u91cd\u547d\u540d\u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u5728\u7f16\u8f91\u5668\u91cc\u9762\u9009\u4e2d\u6587\u4ef6\uff0c\u7136\u540e\u4f7f\u7528\u5feb\u6377\u952e Shift + F6 \uff08\u5982\u679c\u5feb\u6377\u952e\u6ca1\u53cd\u5e94\uff0c\u6587\u4ef6\u53f3\u952e\u83dc\u5355 Refactor \u2014\u2014 Rename\uff09\uff0c\u7136\u540e\u5728\u8f93\u5165\u6846\u4e2d\u8f93\u5165\u8981\u91cd\u547d\u540d\u7684\u540d\u79f0\uff0c\u540c\u65f6\uff0c\u786e\u8ba4\u52fe\u9009 Search for references \u548c Search in comments and strings \u8fd9\u4e24\u4e2a\u9009\u9879\uff0c\u6700\u540e\u6309\u56de\u8f66\u6216\u8005\u9f20\u6807\u70b9 Refactor \u3002 \u6ce8\u610f\uff0c\u6b64\u65f6\u7f16\u8f91\u5668\u53ef\u80fd\u4f1a\u63d0\u793a\u4f60\uff0c\u4f60\u8fd9\u4e2a\u91cd\u547d\u540d\u7684\u64cd\u4f5c\u5173\u8054\u4e86\u591a\u4e2a\u6a21\u5757\uff0c\u5b83\u88ab\u591a\u4e2a\u5730\u65b9\u90fd\u4f7f\u7528\u5230\u4e86\uff0c\u76f8\u5173\u7684\u6a21\u5757\u662f\u5426\u4e5f\u4e00\u8d77\u6539\u540d\u4e86\uff0c\u8fd9\u4e0d\u5e9f\u8bdd\u5417\uff0c\u7528\u8fd9\u4e2a\u529f\u80fd\u5c31\u662f\u60f3\u628a\u5173\u8054\u5230\u7684\u90fd\u4fee\u6539\uff0c\u4e0d\u7136\u6211\u4e3a\u4ec0\u4e48\u4e0d\u7528\u6587\u7ba1\u7684\u91cd\u547d\u540d\u529f\u80fd\u5462\uff0c\u522b\u60f3\u4e86\uff0c\u76f4\u63a5\u70b9\u5de6\u4e0b\u89d2\u7684 Refactor \u6309\u94ae\uff0c\u5c31\u662f\u5e72\u3002 \u7c7b\u540d\u3001\u51fd\u6570\u540d\u7684\u91cd\u547d\u540d\u90fd\u5c3d\u91cf\u91c7\u7528\u8fd9\u79cd\u65b9\u6848\uff0c\u56e0\u4e3a\u7f16\u8f91\u5668\u4f1a\u81ea\u52a8\u7ed9\u6211\u4eec\u627e\u5230\u5173\u8054\u7684\u5730\u65b9\uff0c\u7136\u540e\u540c\u6b65\u4fee\u6539\u6389\u3002\u4f60\u53ef\u5343\u4e07\u522b\u76f4\u63a5\u5220\u4e86\u4fee\u6539\u540d\u79f0\uff0c\u4e0d\u7136\u4f60\u53ef\u80fd\u4f1a\u82b1\u4e0a\u4e00\u5929\u7684\u65f6\u95f4\u6765\u89e3\u51b3\u91cd\u547d\u540d\u7684\u95ee\u9898\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u5b9e\u73b0\u6838\u5fc3\u5e93\u63a5\u53e3","text":"3.1. BaseWidget \u5728 BaseWidget \u91cc\u9762\u628a\u8be5\u5199\u7684\u90fd\u5199\u597d\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u4e0a\u9762\u7684\u8bbe\u8ba1\u7406\u5ff5\u6765\u5199\u3002 \u5982\u679c\u4f60\u5acc\u9ebb\u70e6\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u6587\u7ba1\u7684\u5b9e\u9645\u5de5\u7a0b\u4ee3\u7801 autotest_dde_file_manager : https://gerrit.uniontech.com/admin/repos/autotest_dde_file_manager \u3002 3.2. \u64cd\u4f5c\u5c42 \u5982\u679c\u4f60\u662f\u65b0\u5199\u9879\u76ee\uff0c\u4f60\u4f1a\u53d1\u73b0\u4e00\u5207\u90fd\u662f\u90a3\u4e48\u7684\u7b80\u5355\u3001\u76f4\u63a5\uff0c\u6309\u7167\u6211\u4eec\u63d0\u4f9b\u7ed9\u4f60\u7684\u63a5\u53e3\u5199\u7528\u4f8b\u7684\u64cd\u4f5c\u65b9\u6cd5\u5c31\u597d\u4e86\u3002 \u5982\u679c\u4f60\u662f\u60f3\u5bf9\u539f\u6765\u7684\u5de5\u7a0b\u8fdb\u884c\u6539\u9020\uff0c\u4f60\u9700\u8981\u6309\u7167\u6838\u5fc3\u5e93\u65b9\u6cd5\u7684\u8c03\u7528\uff0c\u5c06\u4f60\u4e4b\u524d\u5199\u7684\u6bcf\u4e2a\u65b9\u6848\u8fdb\u884c\u5bf9\u5e94\u7684\u4fee\u6539\uff0c\u5305\u62ec\u7c7b\u548c\u65b9\u6cd5\u7684\u547d\u540d\u3001\u65b9\u6cd5\u5185\u6240\u8981\u7528\u5230\u4e0d\u540c\u5b9a\u4f4d\u65b9\u6cd5\u7684\u5199\u6cd5\u4fee\u6539\u3002 \u8fd9\u65f6\u5019\u4f60\u53ef\u80fd\u4f60\u7684\u4ee3\u7801\u4e2d\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u62a5\u9519\uff0c\u4e0d\u7528\u62c5\u5fc3\uff0c\u4f60\u53ef\u4ee5\u4ece\u4e1a\u52a1\u903b\u8f91\u51fa\u53d1\uff0c\u60f3\u6e05\u695a\u8fd9\u4e2a\u65b9\u6cd5\u662f\u5e72\u4ec0\u4e48\u7684\u3001\u64cd\u4f5c\u7684\u5bf9\u8c61\u662f\u4ec0\u4e48\u3001\u53c2\u6570\u662f\u4ec0\u4e48\uff0c\u6ce8\u610f\u8fd9\u4e9b\u4fee\u6539\u662f\u4f1a\u5f71\u54cd\u5230\u7528\u4f8b\u4ee3\u7801\u91cc\u9762\u7684\uff0c\u6ca1\u5173\u7cfb\uff0c\u7528\u4f8b\u91cc\u9762\u672c\u6765\u4e5f\u5e94\u8be5\u88ab\u5173\u8054\u4fee\u6539\u3002 3.3. \u628a\u914d\u7f6e\u6a21\u5757\u5199\u597d\uff0c\u8fd9\u90e8\u5206\u57fa\u672c\u53ef\u4ee5\u590d\u5236\u6587\u7ba1\u7684\u4ee3\u7801\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4_1","title":"4\u3001\u8def\u5f84\u5904\u7406","text":"4.1. \u5bfc\u5165\u8def\u5f84 \u65b9\u6cd5\u548c\u7528\u4f8b\u4e2d\u90fd\u4f1a\u6d89\u53ca\u5230\u5bfc\u5165\u8def\u5f84\u7684\u4fee\u6539\uff0c\u5728\u4fee\u6539\u8def\u5f84\u65f6\uff0c\u5efa\u8bae\u4f60\u4f7f\u7528 Ctrl + Shift + R \u5168\u5c40\u66ff\u6362\uff0c\u4f1a\u5c06\u6574\u4e2a\u9879\u76ee\u4e0b\u7684\u76f8\u540c\u5730\u65b9\u90fd\u4fee\u6539\u5230\uff0c\u5f53\u7136\uff0c\u4f60\u4e5f\u53ef\u4ee5\u5728\u5c0f\u5f39\u7a97\u4e2d\u4fee\u6539\u5168\u5c40\u66ff\u6362\u4e3a\u5c40\u90e8\u76ee\u5f55\u4e0b\u66ff\u6362\u3002\u5904\u7406\u90a3\u79cd\u6ca1\u6709\u5173\u8054\u5173\u7cfb\uff0c\u4f46\u662f\u53c8\u662f\u76f8\u540c\u540d\u79f0\u7684\u91cd\u547d\u540d\uff0c\u6211\u4e5f\u63a8\u8350\u4f7f\u7528\u8fd9\u79cd\u65b9\u5f0f\u8fdb\u884c\u91cd\u547d\u540d\u3002 \u6ce8\u610f\uff0c\u5168\u5c40\u66ff\u6362\u7684\u65b9\u5f0f\u4efb\u7136\u65e0\u6cd5\u4fdd\u8bc1\u771f\u7684\u5168\u5c40\u88ab\u66ff\u6362\u4e86\uff08\u53ef\u80fd\u662f\u7f16\u8f91\u5668\u7684 Bug \u5427\uff09\uff0c\u6240\u4ee5\u4f60\u4ecd\u7136\u9700\u8981\u624b\u52a8\u770b\u4e0b\u5404\u5904\u662f\u5426\u4fee\u6539\u5230\u4f4d\u3002 4.2. \u8d44\u6e90\u8def\u5f84 \u4e00\u4e9b\u7528\u4f8b\u8d44\u6e90\u9700\u8981\u6839\u636e config.py \u91cc\u9762\u7684\u8def\u5f84\u914d\u7f6e\u8fdb\u884c\u8d44\u6e90\u8def\u5f84\u7684\u62fc\u63a5\uff0c\u5982\u679c\u4f60\u539f\u6765\u672c\u6765\u5c31\u6709\u4e00\u4e2a\u51fd\u6570\u4e13\u95e8\u7528\u4e8e\u7ec4\u88c5\u8def\u5f84\u7684\uff0c\u90a3\u4f60\u53ea\u9700\u8981\u4fee\u6539\u8fd9\u4e00\u4e2a\u5730\u65b9\u5c31\u597d\u4e86\uff0c\u5982\u679c\u4f60\u4e4b\u524d\u5e76\u6ca1\u6709\u8fd9\u6837\u7684\u8bbe\u8ba1\uff0c\u90a3\u53ef\u80fd\u9700\u8981\u4fee\u6539\u5927\u91cf\u6d89\u53ca\u5230\u8d44\u6e90\u8def\u5f84\u7684\u5730\u65b9\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5","title":"5\u3001\u8c03\u8bd5\u548c\u7f16\u5199\u7528\u4f8b","text":"\u4ee5\u4e0a\u51e0\u4e2a\u6b65\u9aa4\u505a\u5b8c\uff0c\u57fa\u672c\u5c31\u53ef\u4ee5\u8fdb\u884c\u7528\u4f8b\u4ee3\u7801\u7684\u8c03\u8bd5\u4e86\uff0c\u8fd9\u90e8\u5206\u5de5\u4f5c\u4e3b\u8981\u89e3\u51b3\u4f60\u4e4b\u524d\u51e0\u4e2a\u6b65\u9aa4\u9057\u6f0f\u7684\u95ee\u9898\uff0c\u5982\u679c\u6240\u6709\u7528\u4f8b\u90fd\u8c03\u8bd5\u901a\u8fc7\u4e86\uff0c\u90a3\u4e48\u5de5\u7a0b\u6539\u9020\u5c31\u5168\u90e8\u5b8c\u6210\u4e86\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/","title":"AT \u5f00\u53d1\u89c4\u8303","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u5f00\u53d1\u89c4\u8303\u662f\u6839\u636e\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fd0\u884c\u4e24\u5e74\u591a\u6765\uff0c\u9047\u5230\u95ee\u9898\u89e3\u51b3\u95ee\u9898\u800c\u5f62\u6210\u7684\u4e00\u4e9b\u89e3\u51b3\u65b9\u6848\uff0c\u6216\u8005\u8bf4\u7ecf\u9a8c\u603b\u7ed3\uff1b\u8fd9\u4e9b\u7ecf\u9a8c\u7b26\u5408\u6211\u4eec\u73b0\u9636\u6bb5 AT \u6240\u5e94\u7528\u7684\u573a\u666f\u9700\u8981\uff0c\u4e5f\u662f\u6211\u4eec\u7ecf\u8fc7\u957f\u671f\u601d\u8003\uff0c\u4e0d\u65ad\u8bd5\u9519\u4e0d\u65ad\u4fee\u6b63\uff0c\u5e76\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u5b9e\u8df5\u4e2d\u68c0\u9a8c\u8fc7\u53ef\u884c\u7684\u3002\u4ee5\u6b64\uff0c\u5e0c\u671b\u80fd\u5e2e\u52a9\u53c2\u4e0e\u5230\u81ea\u52a8\u5316\u7684\u76f8\u5173\u4eba\u5458\u51cf\u5c11\u8bd5\u9519\u6210\u672c\uff0c\u66f4\u597d\u3001\u66f4\u5feb\u7684\u7f16\u5199\u7528\u4f8b\u53ca\u7ef4\u62a4\u7528\u4f8b\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_1","title":"\u4e00\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u89c4\u8303","text":"\u6807\u7b7e\u5316\u7ba1\u7406\u6587\u6863\u8bf7\u53c2\u8003\uff1a \u300a\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u64cd\u4f5c\u6307\u5f15\u300b \u4ee5\u4e0b\u8bf4\u51e0\u4e2a\u5bb9\u6613\u51fa\u73b0\u7684\u95ee\u9898\uff1a"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1","title":"1. \u5bf9\u5e94\u5173\u7cfb","text":" \u5199\u5b8c\u81ea\u52a8\u5316\u7528\u4f8b\u4e4b\u540e\uff0c\u8bf7\u5728 CSV \u6587\u4ef6\u4e2d\u6807\u8bb0\u7528\u4f8b\u7684 ID\u3001\u7b49\u7ea7\u3002\u4e3a\u4e86\u63d0\u9192\u6807\u8bb0\uff0c\u6267\u884c\u7528\u4f8b\u65f6\u5728\u9996\u884c\u4f1a\u8f93\u51fa ERROR \u65e5\u5fd7\uff1a CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94\u7684 ID\uff1b \u5728\u6700\u7ec8\u63d0\u4ea4\u4ee3\u7801\u4e4b\u524d\uff0c\u4f60\u9700\u8981\u5728 CSV \u6587\u4ef6\u91cc\u9762\u5c06ID\u3001\u7528\u4f8b\u7b49\u7ea7\u7b49\u6807\u7b7e\u8865\u5168\uff0c\u5982\u679c CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94 ID\uff0c\u540e\u7eed\u5728\u6279\u91cf\u6267\u884c\u7684\u65f6\u5019\uff0c\u8fd9\u4e9b\u7528\u4f8b\u662f\u4e0d\u4f1a\u6267\u884c\u7684\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2","title":"2. \u540d\u79f0\u4e00\u81f4","text":" CSV \u6587\u4ef6\u7684\u6587\u4ef6\u540d\u3001\u7528\u4f8b\u51fd\u6570\u4e2d\u95f4\u7684\u540d\u79f0\u4e00\u81f4\u3001\u7528\u4f8b py \u6587\u4ef6\u4e2d\u95f4\u7684\u540d\u79f0\uff0c\u8fd9\u4e09\u4e2a\u540d\u79f0\u4e00\u81f4\u3002 \u4e3e\u4f8b\uff1a # test_music_001.py\ndef test_music_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u90a3\u4e48 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e3a music.csv\u3002 AT \u6846\u67b6\u5e95\u5c42\u4ee3\u7801\u5b9e\u73b0\u662f\u5c06 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e0e\u7528\u4f8b\u51fd\u6570\u540d\u79f0\u540d\u79f0\uff08item.name\uff09\u8fdb\u884c\u5bf9\u5e94\uff0c\u56e0\u6b64\uff0c\u6ce8\u610f CSV \u6587\u4ef6\u540d\u79f0\u5bf9\u5e94\u7684\u662f\u7528\u4f8b\u51fd\u6570\u540d\u79f0\uff0c\u5373 def test_music_001 \u91cc\u9762\u7684 music \uff0c\u800c\u4e0d\u662f test_music_001.py \u91cc\u9762\u7684 music \u3002 \u8fd9\u91cc\u7ec6\u7ec6\u54c1\u4e00\u4e0b\u54c8~ \u5982\u679c\u4f60\u5c06\u4e0a\u4f8b\u5199\u6210\u4e86\u8fd9\u6837: # test_music_001.py\ndef test_movie_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u7528\u4f8b\u6267\u884c\u6ca1\u95ee\u9898\uff0c\u4f46\u662f\u6807\u7b7e\u5316\u7ba1\u7406\u662f\u4e0d\u751f\u6548\u7684\uff0c\u6846\u67b6\u65e0\u6cd5\u5c06 music.csv\u6587\u4ef6\u91cc\u9762\u6807\u7b7e\uff0c\u6dfb\u52a0\u5230 test_movie_001\u8fd9\u4e2a\u7528\u4f8b\u4e2d\uff0c\u56e0\u4e3a\u4ed6\u4eec\u6ca1\u6709\u5bf9\u5e94\u5173\u7cfb\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#tag","title":"\u4e8c\u3001\u5206\u652f\u53ca tag \u7ba1\u7406\u89c4\u8303","text":"\u53c2\u8003\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u4ee3\u7801\u7ba1\u7406\u89c4\u8303\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2-tag","title":"2. \u5e94\u7528\u5e93 tag","text":" \u5e94\u7528\u5e93 tag \u6839\u636e\u5e94\u7528\u4ea4\u4ed8\u8282\u70b9\u751f\u6210\uff0c\u6bcf\u6b21\u6253 tag \u4e4b\u524d\uff0c\u76f8\u5173\u6d4b\u8bd5\u4eba\u5458\u9700\u8981\u8fdb\u884c\u7528\u4f8b\u8c03\u8bd5\uff1b \u8c03\u8bd5\u7528\u4f8b\u662f\u6307\u7684\u5728\u5168\u67b6\u6784\uff08x86\u3001arm\u3001mips\uff09\u4e0a\u8c03\u8bd5\u901a\u8fc7\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\u8fbe\u5230 90% \u4ee5\u4e0a\u624d\u80fd\u6253 tag\uff0c\u901a\u8fc7 Jenkins \u6267\u884c\u5668\u6267\u884c\u7528\u4f8b\uff0c\u4fdd\u7559\u901a\u8fc7\u7387\u7ed3\u679c\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\uff1a\u901a\u8fc7\u7528\u4f8b\u6570 / (\u603b\u7528\u4f8b\u6570 - \u5df2\u5e9f\u5f03\u7528\u4f8b) \u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u7b97\u901a\u8fc7 Jenkins \u6267\u884c\u5668 \u4f60\u53ef\u80fd\u4f1a\u5728\u4e00\u4e2a\u4ea4\u4ed8\u5468\u671f\u5185\u6301\u7eed\u7684\u8fdb\u884cAT\u7528\u4f8b\u8c03\u8bd5\uff0c\u4f46\u662f\u6700\u7ec8 AT \u7528\u4f8b\u6253 tag \u7684\u5e94\u7528\u7248\u672c\uff0c\u9700\u8981\u4f7f\u7528\u5e94\u7528\u96c6\u6210\u4ea4\u4ed8\u7684\u6700\u65b0\u5e94\u7528\u7248\u672c\uff0c\u53ef\u4ee5\u4f7f\u7528\u5e94\u7528\u7684\u63d0\u6d4b\u7248\u672c\uff1b\u4e00\u5b9a\u8981\u786e\u4fdd\u8c03\u8bd5\u7528\u4f8b\u7684\u5e94\u7528\u7248\u672c\u662f\u6700\u65b0\u7684\uff0c\u4e0d\u7136\u96c6\u6210\u8fdb\u53bb\u4e4b\u540e\uff0c\u6301\u7eed\u96c6\u6210\u5c31\u4f1a\u51fa\u95ee\u9898\uff1b tag \u53f7\u600e\u4e48\u6253\uff1f \u6839\u636e\u6301\u7eed\u96c6\u6210\u7684\u8981\u6c42\u751f\u6210\uff0c\u5176\u4e2d\u5e94\u7528\u7248\u672c\u53f7\u9700\u8981\u4e0e\u9879\u76ee\u7ecf\u7406\u786e\u8ba4\u672c\u6b21\u5373\u5c06\u96c6\u6210\u7684\u5e94\u7528\u7248\u672c\u53f7\u662f\u591a\u5c11\uff1b tag \u7684 commit \u4fe1\u606f\u683c\u5f0f\uff1a # commit msg\nversion:5.6.5\n \u5176\u4e2d 5.6.5 \u5199\u5e94\u7528\u7684\u96c6\u6210\u7248\u672c\u53f7\u3002 \u751f\u6210 tag \u7684\u547d\u4ee4\u53c2\u8003\uff1a\u300aGit \u6807\u7b7e\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3-tag","title":"3. \u57fa\u7840\u6846\u67b6 tag","text":"\u57fa\u7840\u6846\u67b6 tag \u4e0d\u4e0e\u4e1a\u52a1\u6302\u94a9\uff0c\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u6309\u9700\u53d1\u5e03\u7248\u672c\uff0c\u5728\u6839\u76ee\u5f55\u4e0b CURRENT \u6587\u4ef6\u4e2d\u8bb0\u5f55\u7684\u5f53\u524d\u7248\u672c\u53f7\u548c\u5386\u53f2\u7248\u672c\u53f7\uff0c\u53ca\u5176\u5bf9\u5e94\u65b0\u589e\u4e86\u54ea\u4e9b\u529f\u80fd\uff0c\u6709\u52a9\u4e8e\u5e94\u7528\u9009\u62e9\u5408\u9002\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\u3002 # CURRENT\n[current]\ntag = 0.9.5\n \u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u7684 control \u6587\u4ef6\u8bb0\u5f55\u5f53\u524d\u5e94\u7528\u5e93\u4f9d\u8d56\u7684\u57fa\u7840\u5e93\u7248\u672c\u3002 # control\n[Depends]\nautotest-basic-frame = 0.9.5\n \u7528\u4f8b\u5728\u6267\u884c\u65f6\u4f1a\u6821\u9a8c\u4e24\u4e2a\u6587\u4ef6\u7684\u7248\u672c\u53f7\u662f\u5426\u4e00\u81f4\uff0c\u5982\u679c\u4e0d\u4e00\u81f4\uff0c\u4f1a\u6253\u5370 error \u65e5\u5fd7\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_2","title":"\u4e09\u3001\u4ed3\u5e93\u6743\u9650\u7ba1\u7406","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_1","title":"1. \u57fa\u7840\u6846\u67b6","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u4ed3\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame \u57fa\u7840\u6846\u67b6\u4e0d\u5141\u8bb8\u533f\u540d\u8bbf\u95ee\uff0c\u5982\u679c\u4f60\u767b\u5f55 gerrit \u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u8bbf\u95ee\u4ee5\u4e0a\u94fe\u63a5\uff0c\u5219\u9700\u8981\u7533\u8bf7\u8bbf\u95ee\u6743\u9650\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_1","title":"2. \u5e94\u7528\u4ed3\u5e93","text":" \u81ea\u52a8\u5316\u5e94\u7528\u4ed3\u5e93\uff1a https://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684 app_name \u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_3","title":"\u56db\u3001\u65b9\u6cd5\u7f16\u5199&\u8c03\u7528\u89c4\u8303","text":"\u65b9\u6cd5\u7f16\u5199\u6574\u4f53\u8bbe\u8ba1\u601d\u8def\u53c2\u8003\uff1a[\u300aAT\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b]"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_2","title":"1. \u65b9\u6cd5\u7f16\u5199","text":"\u5199\u65b9\u6cd5\u7684\u65f6\u5019\u6ce8\u610f\u65b9\u6cd5\u5f52\u5c5e\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget\uff0c\u65b9\u6cd5\u662f\u5728\u54ea\u4e2a\u533a\u57df\u64cd\u4f5c\u7684\uff0c\u5c31\u5199\u5728\u54ea\u4e2a\u7c7b\u91cc\u9762\u3002 \u4e3e\u4f8b\uff1a from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n\"\"\"\u70b9\u51fb\u6807\u9898\u680fxxx\"\"\"\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_2","title":"2. \u65b9\u6cd5\u8c03\u7528","text":" \u5728\u7528\u4f8b\u4e2d\u8c03\u7528\u65b9\u6cd5\uff0c\u901a\u8fc7\u8be5\u5e94\u7528\u552f\u4e00\u7684\u51fa\u53e3\u8fdb\u884c\u8c03\u7528\uff0c\u6bd4\u5982\u6587\u7ba1\uff1a class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n \u4e0d\u8981\u5728\u7528\u4f8b\u4e2d\u5355\u72ec\u53bb\u8c03\u7528 TitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u8fd9\u4e9b\u7c7b\uff0c\u5426\u5219\u540e\u671f\u7528\u4f8b\u4f1a\u53d8\u5f97\u4e0d\u597d\u7ef4\u62a4\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_4","title":"\u4e94\u3001\u7528\u4f8b\u7f16\u5199\u89c4\u8303","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_3","title":"1. \u57fa\u4e8e\u7c7b\u5199\u7528\u4f8b","text":"\u6240\u6709\u7528\u4f8b\u90fd\u5e94\u8be5\u57fa\u4e8e\u7c7b\u53bb\u5199\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001(self):\n\"\"\"\u97f3\u4e50\u542f\u52a8\"\"\"\n \u6ce8\u610f\u4ee5\u4e0b\u51e0\u70b9\uff1a \u7c7b\u540d\u4e0d\u8981\u968f\u4fbf\u53d6\uff0c\u540c\u4e00\u4e2a\u5e94\u7528\u5e94\u8be5\u4f7f\u7528\u540c\u4e00\u4e2a\u7c7b\u540d\uff0c\u7528\u4f8b\u7c7b\u540d\u79f0\u5fc5\u987b\u4ee5 Test \u5f00\u5934\uff0c\u9075\u5faa\u5927\u9a7c\u5cf0\u547d\u540d\u89c4\u8303\uff1b \u7528\u4f8b\u7c7b\u7ee7\u627f BaseCase\uff0c\u4e00\u4e2a\u5e94\u7528\u53ea\u6709\u4e00\u4e2a BaseCase \u4e00\u4e2a py \u6587\u4ef6\u91cc\u9762\u53ea\u6709\u4e00\u4e2a\u7c7b\uff0c\u6211\u4eec\u79f0\u4e3a\u4e00\u4e2a\u6d4b\u8bd5\u7c7b\uff1b \u4e00\u4e2a\u7c7b\u91cc\u9762\u53ef\u4ee5\u6709\u591a\u4e2a\u7528\u4f8b\u51fd\u6570\uff0c\u8fd9\u53d6\u51b3\u8fd9\u6761\u7528\u4f8b\u6709\u591a\u5c11\u4e2a\u6d4b\u8bd5\u70b9\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001_1(self):\n\"\"\"\u4efb\u52a1\u680f\u542f\u52a8\u97f3\u4e50\"\"\"\ndef test_music_001_2(self):\n\"\"\"\u542f\u52a8\u5668\u542f\u52a8\u97f3\u4e50\"\"\" \ndef test_music_001_3(self):\n\"\"\"\u684c\u9762\u542f\u52a8\u97f3\u4e50\"\"\"\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_3","title":"2. \u7528\u4f8b\u51fd\u6570\u89c4\u8303","text":" \u7528\u4f8b\u51fd\u6570\u4ee5 test \u5f00\u5934\uff0c\u9075\u5faa\u86c7\u5f62\u547d\u540d\u89c4\u8303\uff0c\u4e2d\u95f4\u4e3a\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0\uff0c\u540e\u9762\u52a0\u7528\u4f8b ID\uff0c\u6700\u540e\u52a0\u6d4b\u8bd5\u70b9\u5e8f\u53f7\uff0c\u5373 test_${module}_${case_id}[_${index}] \uff1b \u6bd4\u5982\uff1atest_music_001_1\uff0cindex \u4ece 1 \u5f00\u59cb\u3002 \u51fd\u6570\u529f\u80fd\u8bf4\u660e\u91cc\u9762\u5199\u7528\u4f8b\u6807\u9898\uff0c\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u6807\u9898\u5373\u53ef\uff0c\u6ce8\u610f\u7528\u4e09\u5bf9\u53cc\u5f15\u53f7\uff0c\u4e0d\u8981\u7528\u5176\u4ed6\u6ce8\u91ca\uff0c\u66f4\u4e0d\u8981\u7528\u4e95\u53f7\u6ce8\u91ca\u5199\u7528\u4f8b\u6807\u9898\uff1b \u76f4\u63a5\u590d\u5236 PMS \u7528\u4f8b \u7528\u4f8b\u6b65\u9aa4\u76f4\u63a5\u5c06 PMS \u4e0a\u7528\u4f8b\u6b65\u9aa4\u548c\u9884\u671f\u590d\u5236\u8fdb\u6765\uff0c\u7136\u540e\u8fdb\u884c\u6279\u91cf\u6ce8\u91ca\uff08ctrl + /\uff09\uff0c\u5728\u6ce8\u91ca\u7684\u57fa\u7840\u4e0a\u53bb\u5199\u7528\u4f8b\u811a\u672c\u4f1a\u66f4\u52a0\u65b9\u4fbf\u5168\u9762\uff0c\u4e5f\u6bd4\u4f60\u81ea\u5df1\u5199\u6ce8\u91ca\u66f4\u8282\u7ea6\u65f6\u95f4\uff1a \u4e3e\u4f8b\uff0cPMS \u7528\u4f8b\uff1a \u76f4\u63a5\u9009\u4e2d\u7528\u4f8b\u5185\u5bb9\uff0c\u590d\u5236\u4e0b\u6765\uff0c\u7136\u540e\u7c98\u8d34\u5230\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c\u4e2d\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\n \u4e0a\u4f8b\u4e2d\u4e95\u53f7\u6ce8\u91ca\u90e8\u5206\u5c31\u662f\u76f4\u63a5\u4ece PMS \u4e0a\u590d\u5236\u8fc7\u6765\u7684\uff0c\u5728\u6b64\u57fa\u7840\u4e0a\u5199\u7528\u4f8b\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\nmusic = DeepinMusicWidget()\nmusic.click_singer_btn_in_music_by_ui()\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\nmusic.click_icon_mode_in_music_by_ui()\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\nmusic.double_click_first_singer_in_singer_icon_view_by_ui()\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\nself.assert_xxx\n \u4f60\u770b\uff0c\u975e\u5e38\u6e05\u695a\u6bcf\u4e00\u6b65\u5728\u505a\u4ec0\u4e48\uff0c\u91cd\u70b9\u662f\u7701\u53bb\u4e86\u5199\u6ce8\u91ca\u7684\u65f6\u95f4\uff0c\u771f\u7684\u7092\u9e21\u65b9\u4fbf\u3002 \u4e0d\u5199 if __name__ == '__main__':\uff0c\u4e0d\u5199\u591a\u4f59\u7684\u4ee3\u7801\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3","title":"3. \u6570\u636e\u9a71\u52a8","text":" \u5982\u679c\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u662f\u76f8\u540c\u7684\uff0c\u53ea\u662f\u4e00\u4e9b\u53c2\u6570\u53d8\u5316\uff0c\u5c3d\u91cf\u4f7f\u7528\u6570\u636e\u9a71\u52a8\u6765\u5b9e\u73b0\u7528\u4f8b\uff1b \u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u6570\u636e\u9a71\u52a8\u7684\u6570\u636e\uff0c\u4e0d\u80fd\u56e0\u6b64\u5f15\u5165\u4f9d\u8d56\uff0c\u5c3d\u91cf\u4f7f\u7528\u4e00\u4e9b\u6807\u51c6\u5e93\u80fd\u8bfb\u53d6\u7684\u6587\u4ef6\u683c\u5f0f\uff0c\u6bd4\u5982 json\u3001ini\u3001CSV\u3001xml\u3001txt \u7b49\u6587\u4ef6\u683c\u5f0f\uff1b\u4e0d\u5efa\u8bae\u4f7f\u7528 Yaml\u3001Excel\u3001MySQL \u7b49\u6570\u636e\u683c\u5f0f\uff1b \u8bfb\u53d6\u6570\u636e\u65f6\u4e5f\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff0c\u5982\u4f7f\u7528 pandas \u5904\u7406 CSV \u5c31\u5c5e\u4e8e\u5927\u6750\u5c0f\u7528\u4e86\uff0c\u6b63\u5e38\u7684\u6570\u636e\u9a71\u52a8\u8fd8\u6ca1\u5230\u9700\u8981\u5927\u6570\u636e\u5206\u6790\u6765\u5904\u7406\u7684\u5730\u6b65\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u5728 widget/ddt/ \u76ee\u5f55\u4e0b\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5199\u6cd5\uff1a @pytest.mark.parametrize(\"value\", data)\ndef test_smb_049(self, value):\n \u4ee5\u4e0a\u8fd9\u79cd\u53c2\u6570\u5316\u7684\u5199\u6cd5\u672c\u8eab\u6ca1\u4ec0\u4e48\u95ee\u9898\uff0c\u4f46\u662f\uff0c\u8fd9\u91cc\u5fc5\u987b\u8981\u8865\u5145\u4e00\u4e2a\u6ca1\u6709\u7528\u7684\u5c0f\u77e5\u8bc6\uff1a \u5982\u679c\u53c2\u6570\u5316\u6570\u636e\u91cc\u9762\u7684\u5b57\u7b26\u4f1a\u539f\u5c01\u4e0d\u52a8\u7684\u8f93\u51fa\u5230 item.name \u91cc\u9762\uff0c\u663e\u793a\u975e\u5e38\u4e0d\u4f18\u96c5\uff0c\u800c\u4e14\u53ef\u4ee5\u4f1a\u5f15\u5165\u4e00\u4e9b\u610f\u60f3\u4e0d\u5230\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u611f\u53d7\u4e00\u4e0b\uff1a \u53c2\u6570\uff1a data = [\n\"\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\", \"qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678\",\n]\n \u73b0\u8c61\u662f\u8fd9\u6837\u8272\u513f\u7684\uff1a test_smb_049.py::TestFileManager::test_smb_049[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09]\ntest_smb_049.py::TestFileManager::test_smb_049[qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui]\ntest_smb_049.py::TestFileManager::test_smb_049[12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678]\n \u8bf4\u5b9e\u8bdd\uff0c\u770b\u7740\u5fc3\u91cc\u5835\u5f97\u614c\uff0c\u5982\u679c\u8fd9\u91cc\u9762\u5305\u542b\u4e00\u4e9b\u7279\u6b8a\u5b57\u7b26\u6216\u8005\u662f\u8d85\u957f\uff0c\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u5f88\u5947\u5999\u7684\u4e8b\u60c5\u53d1\u751f\u3002 parametrize \u91cc\u9762\u6709\u4e2a\u53c2\u6570\uff1aids\uff0c\u53ef\u4ee5\u89e3\u51b3\u6b64\u7c7b\u95ee\u9898\uff0c\u5c31\u50cf\u8fd9\u6837\uff1a @pytest.mark.parametrize(\"value\", data, ids=[1, 2, 3])\ndef test_smb_049(self, value):\n \u518d\u6765\u611f\u53d7\u4e00\u4e0b\uff1a test_smb_049.py::TestFileManager::test_smb_049[1]\ntest_smb_049.py::TestFileManager::test_smb_049[2]\ntest_smb_049.py::TestFileManager::test_smb_049[3]\n \u660e\u663e\u597d\u591a\u4e86\uff0c\u6240\u4ee5\u5c3d\u91cf\u4f7f\u7528 ids \u8fd9\u4e2a\u53c2\u6570\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 fixture \u7684\u6570\u636e\u9a71\u52a8\u65b9\u5f0f\uff0c\u6846\u67b6\u867d\u7136\u652f\u6301\uff0c\u4f46\u53ef\u8bfb\u6027\u6bd4\u8f83\u5dee\uff1b\u5982\u679c\u4f60\u4e0d\u77e5\u9053\u8fd9\u53e5\u8bdd\u5728\u8bf4\u5565\uff0c\u90a3\u4f60\u53ef\u4ee5\u5ffd\u7565\uff0c\u6211\u4e5f\u4e0d\u6253\u7b97\u8be6\u7ec6\u8bf4\u8fd9\u79cd\u5b9e\u73b0\u65b9\u5f0f\uff0c\u64cd\u4f5c\u6bd4\u8f83\u9a9a\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4","title":"4. \u65ad\u8a00\u8d44\u6e90","text":" \u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u76f4\u63a5\u653e\u5728\u7528\u4f8b\u6a21\u5757\u7684\u540c\u7ea7\u76ee\u5f55\u4e0b\u7684 assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0 + \u7528\u4f8b ID \u547d\u540d\uff1b \u56fe\u50cf\u8bc6\u522b\u65ad\u8a00\uff0c\u4e0d\u8981\u622a\u53d6\u4e00\u5f20\u5f88\u5927\u7684\u56fe\uff0c\u56fe\u7247\u8d44\u6e90\u5305\u542b\u7684\u5143\u7d20\u592a\u591a\u4e86\uff0c\u975e\u5e38\u5bb9\u6613\u53d7\u5230\u9700\u6c42\u5f71\u54cd\uff0c\u5efa\u8bae\u662f\u8fdb\u884c\u5c40\u90e8\u7684\u65ad\u8a00\uff1b \u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u5339\u914d\u5ea6\u662f 0.9\uff0c\u5982\u679c\u65ad\u8a00\u7684\u573a\u666f\u5bf9\u4e8e\u7cbe\u786e\u5ea6\u8981\u6c42\u6ca1\u90a3\u4e48\u9ad8\uff0c\u53ef\u4ee5\u5728\u65ad\u8a00\u8bed\u53e5\u91cc\u9762\u4f20\u5165\u5c0f\u4e8e 0.9 \u7684\u53c2\u6570\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5","title":"5. \u5143\u7d20\u5b9a\u4f4d","text":" \u7528\u4e8e\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u4e2d\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u547d\u540d\u4e3a\u8be5\u5143\u7d20\u7684\u540d\u79f0\uff1b \u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u622a\u53d6\u65f6\u5c3d\u91cf\u7cbe\u786e\u5230\u8fd9\u4e2a\u5177\u4f53\u7684\u6309\u94ae\uff0c\u56fe\u7247\u4e5f\u4e0d\u8981\u592a\u5927\uff1b \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u64cd\u4f5c\u8f83\u5feb\uff0c\u5408\u7406\u52a0\u5165\u7b49\u5f85\u65f6\u95f4\u80fd\u63d0\u9ad8\u7528\u4f8b\u7684\u7a33\u5b9a\u6027\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6","title":"6. \u7528\u4f8b\u8d44\u6e90","text":" \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u4f7f\u7528\u5230\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u6bd4\u5982\u97f3\u4e50\u53ef\u80fd\u9700\u8981\u4e00\u4e9b mp3 \u7684\u8d44\u6e90\u7528\u4e8e\u6d4b\u8bd5\uff0c\u5b58\u653e\u5728 widget/case_res \u76ee\u5f55\u4e0b\uff0c\u524d\u63d0\u662f\u8fd9\u4e9b\u8d44\u6e90\u4e0d\u8d85\u8fc7 10M\uff1b \u5982\u679c\u662f\u4e00\u4e9b\u6bd4\u8f83\u5927\u7684\u8d44\u6e90\uff0c\u5efa\u8bae\u653e\u5230\u7edf\u4e00\u7684 ftp \u670d\u52a1\u5668 \uff08ftp://10.8.10.245\uff09\uff0c\u9700\u8981\u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\u518d\u4e0b\u8f7d\u4e0b\u6765\uff1b f\"wget ftp://{Config.FTP_IP}/uploads/\u591a\u5a92\u4f53/\u5f71\u9662/auto/{file_name};unzip {file_name};rm -rf {file_name};\"\n \u6d4b\u8bd5\u8d44\u6e90\u4e0b\u8f7d\u5230\u5e94\u7528 widget/case_res \u76ee\u5f55\u4e0b\uff1b \u7981\u6b62\u5c06\u6d4b\u8bd5\u8d44\u6e90\u5b58\u653e\u5728\u4e2a\u4eba\u7684\u673a\u5668\u4e0a\uff1b \u5e94\u8be5\u5c3d\u91cf\u4fdd\u8bc1\uff0c\u4e00\u4e2a\u8d44\u6e90\u5728\u4e00\u6b21\u7528\u4f8b\u6267\u884c\u4e2d\u53ea\u9700\u8981\u4e0b\u8f7d\u4e00\u6b21\uff0c\u6240\u4ee5\u4f60\u4e0d\u80fd\u6bcf\u6b21\u4f7f\u7528\u7684\u65f6\u5019\u90fd\u53bb\u4e0b\u8f7d\uff0c\u8fd9\u6837\u53ef\u80fd\u4f1a\u8017\u8d39\u5927\u91cf\u7684\u7f51\u7edc\u8d44\u6e90\uff0c\u800c\u56e0\u4e3a\u5148\u5224\u65ad\u672c\u5730\u662f\u5426\u5b58\u5728\u6b64\u8d44\u6e90\uff0c\u5982\u679c\u4e0d\u5b58\u5728\u518d\u53bb\u4e0b\u8f7d\uff1b \u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u5c06\u8d44\u6e90\u62f7\u8d1d\u5230\u5bf9\u5e94\u7684\u6d4b\u8bd5\u76ee\u5f55\u4e0b\uff0c\u6bd4\u5982\u5c06 mp3 \u6587\u4ef6\u62f7\u8d1d\u5230 ~/Music \u76ee\u5f55\u4e0b\uff0c\u4f46\u662f\u6211\u4eec\u66f4\u5efa\u8bae\u4f60\u4f7f\u7528\u53d1\u9001\u5feb\u6377\u94fe\u63a5\u7684\u65b9\u5f0f\u66ff\u4ee3\u62f7\u8d1d\u7684\u64cd\u4f5c\uff0c\u56e0\u4e3a\u5728\u62f7\u8d1d\u5927\u6587\u4ef6\u65f6\u662f\u5f88\u6d88\u8017\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u800c\u521b\u5efa\u94fe\u63a5\u5219\u4e0d\u4f1a\uff1b @classmethod\ndef recovery_many_movies_in_movie_by_cmd(cls):\n\"\"\"\u6062\u590d\u591a\u4e2a\u89c6\u9891\u6587\u4ef6\u81f3\u89c6\u9891\u76ee\u5f55\u4e2d\"\"\"\nwork_path = f\"/home/{Config.USERNAME}/Videos/auto\"\ncode_path = f\"{Config.CASE_RES_PATH}/auto\"\ncls.run_cmd(f\"rm -rf {work_path};mkdir {work_path}\")\nsleep(1)\nflag = False\nif not exists(code_path):\ncls.run_cmd(f\"mkdir -p {code_path}\")\nflag = True\nlogger.info(f\"ln -s {code_path}/* {work_path}/\")\ncls.run_cmd(\nf\"cd {code_path}/;\"\nf\"{cls.wget_file('auto.zip') if flag else ''}\"\nf\"ln -s {code_path}/* {work_path}/ > /dev/null 2>&1\"\n)\n \u8d44\u6e90\u4e0b\u8f7d\u8fc7\u7a0b\u4e2d\u6ce8\u610f\u8d85\u65f6\u7684\u95ee\u9898\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u5f88\u5927\uff0c\u8981\u7279\u522b\u6ce8\u610f\u8fd9\u95ee\u9898\uff0c\u5982\u679c\u4f60\u4f7f\u7528\u5f3a\u5236\u7b49\u5f85\u4e0b\u8f7d\u7ed3\u675f( os.system )\uff0c\u53ef\u80fd\u4f1a\u9020\u6210\u7528\u4f8b\u6267\u884c\u65f6\u957f\u53d8\u5f97\u4e0d\u53ef\u63a5\u53d7\uff0c\u76ee\u524d\u6211\u4eec\u53d1\u73b0\u5728\u6301\u7eed\u96c6\u6210\u73af\u5883\u6267\u884c\u65f6\u7f51\u7edc\u4e0b\u8f7d\u901f\u5ea6\u5f88\u6162\uff0c\u6240\u4ee5\u8d85\u65f6\u673a\u5236\u662f\u5f88\u6709\u5fc5\u8981\u7684\uff1brun_cmd \u65b9\u6cd5\u6709\u4e00\u4e2a\u9ed8\u8ba4\u8d85\u65f6\u7684\u65f6\u95f4\uff0c\u4f60\u53ef\u4ee5\u6839\u636e\u8d44\u6e90\u5927\u5c0f\u5bf9\u8d85\u65f6\u65f6\u95f4\u8fdb\u884c\u8c03\u6574\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_5","title":"\u516d\u3001\u7528\u4f8b\u8c03\u8bd5\u6280\u5de7","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_4","title":"1. \u65e5\u5fd7","text":" \u4e00\u5b9a\u8981\u5148\u770b\u62a5\u9519\uff0c\u770b error \u65e5\u5fd7\uff0c\u901a\u5e38\u80fd\u660e\u786e\u7684\u544a\u8bc9\u4f60\u5177\u4f53\u54ea\u91cc\u4ee3\u7801\u62a5\u9519\uff1b \u7ed3\u5408\u62a5\u9519\u70b9\u524d\u9762\u7684error\u3001 info \u548c debug \u65e5\u5fd7\u770b\u5426\u662f\u6b63\u5e38\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_4","title":"2. \u65ad\u70b9\u8c03\u8bd5","text":" \u65b9\u6cd5\u62a5\u9519\uff1a \u5728\u65b9\u6cd5\u5e93\u4e2d\u627e\u5230\u5bf9\u5e94\u7684\u65b9\u6cd5\uff0c\u5355\u72ec\u8c03\u7528\uff0c\u770b\u662f\u5426\u80fd\u6b63\u5e38\u6267\u884c\uff1b \u901a\u5e38\u5355\u4e2a\u65b9\u6cd5\u7684\u6267\u884c\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u62a5\u9519\uff0c\u5f88\u5feb\u5c31\u80fd\u6392\u67e5\u51fa\u95ee\u9898\uff1b\u5728\u65b9\u6cd5\u5185\u90e8\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u65b9\u6cd5\u5185\u90e8\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u8c03\u7528\u6ca1\u95ee\u9898\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u62a5\u9519\u7684\u65b9\u6cd5\u524d\u9762\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u7528\u4f8b\u7684\u4e1a\u52a1\u903b\u8f91\u548c\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u65ad\u8a00\u62a5\u9519\uff1a \u65ad\u8a00\u4e3a\u6570\u636e\u65ad\u8a00\uff0c\u6839\u636e\u8868\u8fbe\u5f0f\u8fdb\u884c\u65ad\u8a00\u8bed\u53e5\u8fdb\u884c\u4fee\u6539\uff1b \u6587\u4ef6\u751f\u6210\u7c7b\u65ad\u8a00\uff0c\u67e5\u770b\u662f\u5426\u9700\u8981\u52a0\u7b49\u5f85\u65f6\u95f4\uff1b \u56fe\u50cf\u65ad\u8a00\uff0c\u5728\u65ad\u8a00\u8bed\u53e5\u5904\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u7528\u4f8b\u8fd0\u884c\u5230\u65ad\u8a00\u5904\u4f1a\u505c\u6b62\uff0c\u67e5\u770b\u6b64\u65f6\u65ad\u8a00\u7684\u56fe\u7247\u4e0e\u7528\u4f8b\u6267\u884c\u7684\u73b0\u573a\u5b58\u5728\u4ec0\u4e48\u5dee\u5f02\uff0c\u6b64\u65f6\u4e5f\u53ef\u4ee5\u8fdb\u884c\u91cd\u65b0\u622a\u56fe\uff0c\u4ece\u800c\u66ff\u6362\u65b0\u7684\u56fe\u7247\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3_1","title":"3. \u8fdc\u7a0b\u6267\u884c","text":" \u8fdc\u7a0b\u6267\u884c\u6307\u7684\u662f\u7f16\u8f91\u5668\u901a\u8fc7\u6307\u5b9a\u8fdc\u7a0b\u89e3\u91ca\u5668\u6267\u884c\u81ea\u52a8\u5316\u4ee3\u7801\uff1b \u8fdc\u7a0b\u6267\u884c\u7684\u597d\u5904\u662f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u7684 Debug \u8fd0\u884c\uff0c\u4e0d\u7528\u5728\u6d4b\u8bd5\u673a\u4e0a\u6253\u5f00\u7f16\u8f91\u5668\uff0c\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u66f4\u5feb\uff1b \u652f\u6301\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u7684\u7f16\u8f91\u5668\uff1a \u4e13\u4e1a\u7248 Pycharm VScode \uff0c\u9700\u8981\u4f7f\u7528\u63d2\u4ef6 Remote-SSH \u8fdc\u7a0b\u6267\u884c\u914d\u7f6e \u4ee5 Pycharm \u4e3a\u4f8b\uff1a File \u2014> Settings \u2014> Project \u2014> Python Interpreter \u2014> \u53f3\u8fb9\u8bbe\u7f6e\u6309\u94ae \u2014> Add... \u2014> SSH Interpreter \u2014> New server configuration(\u586b\u5165host\u548cusername) \u2014> Next \u2014> password\uff08\u6d4b\u8bd5\u673a\u5bc6\u7801\uff09 \u2014> Interpreter(\u9009\u62e9\u8fdc\u7a0b\u89e3\u91ca\u5668) \u2014> Finish "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4_1","title":"4. \u73af\u5883\u6e05\u7406","text":" \u5982\u679c\u7528\u4f8b\u91cc\u9762\u7684 teardown \u6ca1\u6709\u6267\u884c\uff0c\u5927\u6982\u7387\u662f\u56e0\u4e3a setup \u91cc\u9762\u4ee3\u7801\u62a5\u9519\uff0c\u8fd9\u4e24\u4e2a\u662f\u4e00\u5bf9\u7684\uff0csetup \u91cc\u9762\u62a5\u9519\uff0cteardown \u91cc\u9762\u7684\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\uff1b \u76ee\u524d\u6211\u4eec\u5df2\u7ecf\u5c06\u5404\u5e94\u7528\u7684 clean_all \u8fd9\u4e2a fixture \u6539\u6210\u4e86\u7ec8\u7ed3\u5668\uff0c\u786e\u4fdd\u59cb\u7ec8\u80fd\u6267\u884c\u5230\u8fd9\u6b65\uff0c\u4f46\u662f\u7528\u4f8b\u91cc\u9762\u7684 fixture\uff0c\u8fd8\u662f\u9700\u8981\u6211\u4eec\u5c0f\u5fc3\u5904\u7406\uff1b \u8981\u6267\u884c clean_all \u9700\u8981\u5728\u7f16\u8f91\u5668\u8fd0\u884c\u53c2\u6570\u52a0 --clean yes\uff0c\u5199\u7528\u4f8b\u7684\u65f6\u5019\u8bf7\u52a0\u4e0a\uff0c\u4e0d\u7136\u4f60\u4e0d\u786e\u5b9a\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u7684\u73af\u5883\u662f\u5426\u6062\u590d\uff1b setup \u53ef\u4ee5\u4e0d\u8981\uff0c\u5c06 setup \u653e\u5230\u7528\u4f8b\u91cc\u9762\u662f\u4e00\u79cd\u7a33\u59a5\u7684\u505a\u6cd5\uff0cteardown \u4e00\u5b9a\u8981\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5_1","title":"5. \u5143\u7d20\u5b9a\u4f4d\u4e0d\u51c6\uff08\u5750\u6807\u8fd4\u56de\u4e0d\u5bf9\uff09","text":" \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u53ef\u80fd\u53d7\u5230\u7a97\u53e3 ID \u7684\u53d8\u5316\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u9ed8\u8ba4\u53d6\u6700\u65b0\u7684\u4e00\u4e2a\u7a97\u53e3\u7528\u4e8e\u5b9a\u4f4d\uff0c\u4f46\u5982\u679c\u5b9e\u9645\u9700\u8981\u5b9a\u4f4d\u7684\u4e0d\u662f\u6700\u65b0\u7684\u7a97\u53e3\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u91cd\u65b0\u5b9e\u4f8b\u5316\u65b9\u6cd5\u7c7b\u5bf9\u8c61\uff0c\u5e76\u5728\u7c7b\u4e2d\u4f20\u5165\u5bf9\u5e94\u7684\u7a97\u53e3\u5e8f\u53f7\uff1b \u57fa\u4e8e\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u76ee\u524d\u9047\u5230\u7684\u7b14\u8bb0\u672c\u4e0a\uff0c\u7531\u4e8e\u5c4f\u5e55\u7f29\u653e\u6bd4\u4f8b\u4e3a 1.25\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u6211\u4eec\u9ed8\u8ba4\u4f7f\u7528\u7f29\u653e\u6bd4\u4f8b\u4e3a 1\uff1b \u57fa\u4e8e\u56fe\u50cf\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u76ee\u6807\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b \u57fa\u4e8e OCR \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u6587\u5b57\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u540c\u6837\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6_1","title":"6. \u952e\u9f20\u64cd\u4f5c\u4e0d\u51c6","text":" \u9f20\u6807\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6bd4\u5982\u53f3\u952e\u3001\u53cc\u51fb\u65e0\u54cd\u5e94\uff1b \u952e\u76d8\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6216\u8005\u5ef6\u8fdf\u8f93\u5165\uff0c\u6bd4\u5982\u7528\u4f8b\u9700\u8981\u8f93\u5165\u201c\u6211\u662f\u4e2d\u56fd\u4eba\u201d\uff0c\u5b9e\u9645\u53ea\u8f93\u5165\u4e86\u201c\u6211\u56fd\u4eba\u201d\uff1b \u4ee5\u4e0a\u95ee\u9898\u6392\u9664\u5e94\u7528\u5361\u987f\u7b49\u95ee\u9898\uff0c\u5927\u6982\u7387\u662f\u7531\u4e8e\u5de5\u5177\u7684\u95ee\u9898\uff0c\u76ee\u524d\u952e\u9f20\u64cd\u4f5c\u6211\u4eec\u4f7f\u7528\u4e09\u4e2a\u5de5\u5177\uff1aDogtail \u63d0\u4f9b\u7684\u952e\u9f20\u5de5\u5177\u3001PyAutoGUI\u3001Xdotool \uff1b \u6709\u540c\u5b66\u53ef\u80fd\u8981\u8bf4\u4e3a\u5565\u8981\u7528\u4e09\u4e2a\u554a\uff0c\u7528\u4e00\u4e2a\u4e0d\u5c31\u597d\u4e86\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u5404\u6709\u4f18\u70b9\u5404\u6709\u7f3a\u70b9\u3002 \u5982\u679c\u4f60\u9047\u5230\u952e\u9f20\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u8bd5\u8bd5\u901a\u8fc7\u4e0d\u540c\u7684\u5de5\u5177\u64cd\u4f5c\uff1b\u952e\u76d8\u8f93\u5165\u5ef6\u8fdf\u7684\u95ee\u9898\uff0c\u4e00\u822c\u662f\u56e0\u4e3a\u8f93\u5165\u901f\u5ea6\u592a\u5feb\u4e86\uff0c\u7cfb\u7edf\u6ca1\u53cd\u5e94\u8fc7\u6765\uff0c\u5e38\u89c1\u4e8e ARM \u548c MIPS \u4e0a\uff0c\u4fee\u6539\u53c2\u6570 delay_time \u7684\u503c\uff0c\u5355\u4f4d\u4e3a\u6beb\u79d2\uff1b # mouse_key.py\n@classmethod\ndef input_message(cls, message, delay_time=300, interval=0.2):\n\"\"\"\n \u8f93\u5165\u5b57\u7b26\u4e32\n :param message: \u8f93\u5165\u7684\u5185\u5bb9\n :param delay_time: \u5ef6\u8fdf\u65f6\u95f4\n :param interval:\n :return:\n \"\"\"\n \u5982\u679c\u4e0d\u662f\u65b9\u6cd5\u7684\u95ee\u9898\uff0c\u5219\u9700\u8981\u7ee7\u7eed\u548c\u5f00\u53d1\u4e00\u8d77\u6392\u9664\uff0c\u662f\u5426\u4e3a\u5e94\u7528\u63a5\u53d7\u952e\u9f20\u4fe1\u53f7\u5904\u7406\u7684\u95ee\u9898\uff0c\u8fd9\u7c7b\u60c5\u51b5\u6211\u4eec\u4e5f\u662f\u9047\u5230\u8fc7\u7684\uff0c\u5177\u4f53\u95ee\u9898\u5177\u4f53\u5206\u6790\u3002 \u6bd4\u5982\u5f71\u9662\u5c31\u91cd\u5199\u4e86\u4e00\u4e2a\u53f3\u952e\u7684\u65b9\u6cd5\uff1a # base_widget.py\n@classmethod\ndef right_click(cls, _x=None, _y=None):\n\"\"\"\n \u91cd\u5199\u5e95\u5c42\u5355\u51fb\u9f20\u6807\u53f3\u952e\n \u89e3\u51b3\u5f71\u9662\u53f3\u952e\u89e6\u53d1release\u4e8b\u4ef6\u7684\u95ee\u9898\uff08\u53f3\u952e\u4e3b\u7a97\u53e3\u4f1a\u64ad\u653e\u89c6\u9891\uff09\n \"\"\"\ncls.mouse_down(_x, _y, button=3)\nsleep(0.1)\ncls.mouse_up(button=3)\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_6","title":"\u4e03\u3001\u5176\u4ed6\u4e0d\u4e3a\u4eba\u77e5\u7684\u7ec6\u8282","text":" \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u5c3d\u91cf\u7f16\u5199\u540c\u4e00\u4e2a\u5e94\u7528\u6216\u6a21\u5757\u7684\u7528\u4f8b\uff0c\u80fd\u5bf9\u8be5\u7528\u4f8b\u5df2\u6709\u65b9\u6cd5\u719f\u6089\uff0c\u907f\u514d\u8fc7\u591a\u91cd\u590d\u4e1a\u52a1\u4ee3\u7801\u7684\u5c01\u88c5\uff1b \u76f8\u540c\u7684\u573a\u666f\u4e0b\uff0c\u5404\u67b6\u6784\u7b49\u5f85\u65f6\u95f4\u4e0d\u540c\uff0c\u5efa\u8bae\u4f7f\u7528\u6846\u67b6\u63d0\u4f9b\u7684 sleep\uff0c\u6211\u4eec\u505a\u4e86\u4e0d\u540c\u67b6\u6784\u7684\u500d\u6570\u653e\u5927\uff1b \u7f16\u5199\u7528\u4f8b\u65f6\uff0c\u5c3d\u91cf\u8003\u8651\u5230\u6bcf\u4e00\u6b65\u5f02\u5e38\u540e\u7684\u73af\u5883\u6062\u590d\uff0c\u9700\u8981\u5efa\u8bae\u8fd9\u79cd\u610f\u8bc6\uff0c\u968f\u65f6\u8981\u8003\u8651\u5230\uff0c\u8fd9\u6b65\u64cd\u4f5c\u6709\u6ca1\u6709\u53ef\u80fd\u51fa\u9519\uff0c\u51fa\u9519\u4e86\u6539\u600e\u4e48\u529e\uff1b \u63d0\u4ea4\u4ee3\u7801\u7684\u65f6\u5019\u6ce8\u610f\u4e0d\u8981\u628a\u4e00\u4e9b\u4e34\u65f6\u7684\u6d4b\u8bd5\u8d44\u6e90\u63d0\u4ea4\u8fdb\u53bb\u4e86\uff0c\u6bd4\u5982\u6d4b\u8bd5\u4e86\u4e00\u4e2a\u5f71\u7247\uff0c\u6709\u4e9b\u540c\u5b66\u4e60\u60ef\u4f7f\u7528 git add . \uff0c\u7136\u540e\u5c31\u5168\u90e8\u63d0\u4ea4\u5230\u4ee3\u7801\u4ed3\u5e93\u4e86\uff0c\u8fd9\u6837\u5373\u4f7f\u540e\u671f\u628a\u5927\u6587\u4ef6\u5220\u4e86\uff0c.git \u6587\u4ef6\u91cc\u9762\u4e5f\u4f1a\u5f88\u5927\uff0c\u9020\u6210\u4ee3\u7801\u4ed3\u5e93\u53d8\u5f97\u5341\u5206\u81c3\u80bf\u3002 \u66f4\u591a\u7ec6\u8282\u67e5\u770b\uff1a\u300aAT\u7ecf\u9a8c\u603b\u7ed3\u300b"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/","title":"AT \u6267\u884c\u5668\u4f7f\u7528\u6307\u5317","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/5/25\n# Author : litao\n# =============================================\n Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1","title":"1\u3001\u529f\u80fd\u4ecb\u7ecd","text":" \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7cfb\u7edf\u8bed\u8a00\u8bbe\u7f6e\uff0c\u5206\u8fa8\u7387\u8bbe\u7f6e\u53ca\u7528\u4f8b\u6267\u884c\u73af\u5883\u642d\u5efa\uff1b \u652f\u6301 IP \u4e3a 15 \u7f51\u6bb5\u7684 AMD \u67b6\u6784\u6d4b\u8bd5\u673a\u955c\u50cf\u88c5\u673a\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u6307\u5b9a\u5e94\u7528\uff0c\u6307\u5b9a\u8303\u56f4\u6807\u7b7e\u7684\u7528\u4f8b\u6267\u884c\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u72b6\u6001\u68c0\u67e5\uff0c\u662f\u5426\u6709\u6b63\u5728\u8fd0\u884c\u7684\u6d4b\u8bd5\uff1b \u652f\u6301\u914d\u7f6e\u7528\u4f8b\u6267\u884c\u65f6\u957f\uff0c\u9632\u6b62\u4efb\u52a1\u963b\u585e\uff1b \u652f\u6301\u6839\u636e\u5e94\u7528\u7248\u672c\u81ea\u52a8\u67e5\u627e\u5bf9\u5e94\u7684\u7528\u4f8b tag\uff1b \u652f\u6301\u5f02\u5e38\u5904\u7406\u548c\u6d4b\u8bd5\u5b8c\u6210\u7684\u5b9e\u65f6\u6d88\u606f\u901a\u77e5\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2job","title":"2\u3001Job \u4ecb\u7ecd","text":"\u4ee5\u4e0b\u6309\u6267\u884c\u6d41\u7a0b\u7684\u987a\u5e8f\u4ecb\u7ecd\uff0c\u6bcf\u4e00\u6b65\u90fd\u53ef\u4ee5\u5355\u72ec\u6267\u884c\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1_1","title":"1\u3001\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/AT_test/ \u6574\u4e2a\u6d41\u7a0b\u7684\u4e3b\u5165\u53e3\uff0c\u901a\u8fc7\u8fd9\u4e2a\u5165\u53e3\uff0c\u8fde\u540c\u6574\u4e2a\u6d4b\u8bd5\u6d41\u7a0b\uff0c\u955c\u50cf\u88c5\u673a\uff0c\u73af\u5883\u90e8\u7f72\uff0c\u6d4b\u8bd5\u5e94\u7528\u53ca\u751f\u6210\u62a5\u544a\u3002 \u53c2\u6570\u4ecb\u7ecd\uff1a \u6d4b\u8bd5\u673a\uff1a\u6240\u6709\u89c4\u6574\u5230\u56fa\u5b9a\u533a\u57df\u7684\u6d4b\u8bd5\u673a\uff0c\u901a\u8fc7\u6d4b\u8bd5\u540c\u5b66\u5bf9\u6d4b\u8bd5\u673a\u7684\u4e60\u60ef\u547d\u540d\uff0c\u5728\u540e\u53f0\u6620\u5c04\u6d4b\u8bd5\u673a\u7684\u8be6\u7ec6\u4fe1\u606f\uff0c\u62ec\u53f7\u4e2d\u4e3a\u6d4b\u8bd5\u673a IP \u7684\u6700\u540e\u4e00\u4f4d\uff1b \u6d4b\u8bd5\u5e94\u7528\uff1a\u6307\u5b9a\u7684\u6d4b\u8bd5\u5e94\u7528\u7684\u5305\u540d\uff0c\u7cfb\u7edf\u6839\u636e\u540d\u79f0\u81ea\u52a8\u62c9\u53d6\u5bf9\u5e94\u7684\u4ed3\u5e93\u4ee3\u7801\uff1b deb\u5305\u4e0b\u8f7d\u5730\u5740\uff1a\u6d4b\u8bd5\u4e0a\u8ff0\u5e94\u7528\u65f6\uff0c\u9700\u8981\u5b89\u88c5\u7684deb\u5305\u4e0b\u8f7d\u5730\u5740\uff0c\u591a\u4e2a\u5730\u5740\u7528\u201c,\u201d\u9694\u5f00\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff1b \u8303\u56f4\u6807\u7b7e\uff1a\u6267\u884c\u6d4b\u8bd5\u7528\u4f8b\u7684\u6807\u7b7e\u8303\u56f4\uff0c\u5bf9\u5e94\u7528\u4f8b\u4ee3\u7801 csv \u6587\u4ef6\u4e2d\u7684\u6807\u7b7e\u4fe1\u606f\uff0c\u4ee5 pytest \u7684mark\u8bed\u6cd5\u7f16\u5199\uff1b \u7cfb\u7edf\u8bed\u8a00\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u8bed\u8a00\u73af\u5883\uff1b \u5206\u8fa8\u7387\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u5206\u8fa8\u7387\u73af\u5883\uff1b \u955c\u50cf\u5730\u5740\uff1a\u955c\u50cf\u4ed3\u5e93\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u901a\u8fc7 PXE \u88c5\u673a\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u88c5\u673a\u73af\u8282\uff08\u76ee\u524d\u4ec5\u652f\u6301\u90e8\u5206 AMD \u67b6\u6784\u7684\u88c5\u673a\uff09\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2pxe","title":"2\u3001PXE \u88c5\u673a","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/IOS_install/ \u8f93\u5165\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\uff0cIP\uff0c\u5bc6\u7801\uff0c\u955c\u50cf\u5730\u5740\u540e\uff0c\u81ea\u52a8\u88c5\u673a\uff0c\u76ee\u524d\u4ec5\u652f\u6301\u56fa\u5b9a 15 \u7f51\u6bb5\u7684\u90e8\u5206 AMD \u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#3","title":"3\u3001\u6b21\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/all_client_test/ \u8be5\u5165\u53e3\u4e0e\u4e3b\u5165\u53e3\u529f\u80fd\u57fa\u672c\u4e00\u81f4\uff0c\u53ea\u662f\u5265\u79bb\u4e86PXE\u88c5\u673a\u6d41\u7a0b\uff0c\u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7684\u6267\u884c\u6d41\u7a0b\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#4","title":"4\u3001\u73af\u5883\u90e8\u7f72","text":"Jenkins url\uff1ahttps://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/env/build?delay=0sec \u8bbe\u7f6e\u6d4b\u8bd5\u673a\u7684\u7cfb\u7edf\u8bed\u8a00\uff0c\u5206\u8fa8\u7387\u53ca\u5b89\u88c5\u6d4b\u8bd5\u6240\u9700\u7684\u4f9d\u8d56\u5305\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#5","title":"5\u3001\u53d1\u9001\u4ee3\u7801","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/send_code/ \u6839\u636e\u6d4b\u8bd5\u5e94\u7528\u540d\u79f0\uff0c\u62c9\u53d6\u5bf9\u5e94\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u5e76\u6839\u636e\u6d4b\u8bd5\u673a\u4e0a\u5e94\u7528\u7248\u672c\u5207\u6362\u5230\u5bf9\u5e94\u7684tag\u7248\u672c\uff0c\u82e5\u672a\u627e\u5230tag\u7248\u672c\uff0c\u5219\u4f7f\u7528\u6700\u65b0\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u518d\u6839\u636e\u5e94\u7528\u5e93\u4ee3\u7801\u4e2d\u914d\u7f6e\u7684\u57fa\u7840\u5e93\u7248\u672c\uff0c\u62c9\u53d6\u57fa\u7840\u5e93\u4ee3\u7801\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#6","title":"6\u3001\u7528\u4f8b\u6267\u884c","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/run_test/ \u8fd0\u884c\u6d4b\u8bd5\u673a\u4e0a\u7684\u7528\u4f8b"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/","title":"AT \u7528\u4f8b\u7b5b\u9009\u6307\u5317","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u7528\u4f8b\u7b5b\u9009\u6807\u51c6\uff0c\u662f\u6311\u9009\u5408\u9002\u7684\u6587\u672c\u7528\u4f8b\u8fdb\u884c\u81ea\u52a8\u5316\u7528\u4f8b\u8f6c\u5316\u7684\u4e00\u4e9b\u901a\u7528\u6807\u51c6\u3002 \u8fc7\u53bb\u6211\u4eec\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u5b9e\u8df5\u8fc7\u7a0b\u4e2d\uff0c\u5199\u4e86\u4e0d\u5c11\u81ea\u52a8\u5316\u7528\u4f8b\uff0c\u968f\u7740\u9700\u6c42\u7684\u8fed\u4ee3\uff0c\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u81ea\u7136\u8150\u5316\uff0c\u56e0\u800c\u9700\u8981\u5728\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\u5bf9\u81ea\u52a8\u5316\u7528\u4f8b\u8fdb\u884c\u7ef4\u62a4\uff0c\u5728\u7ef4\u62a4\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u6211\u4eec\u53d1\u73b0\uff0c\u6709\u4e9b\u7528\u4f8b\u7ef4\u62a4\u8d77\u6765\u592a\u96be\u4e86\uff0c\u8c03\u8bd5\u7528\u4f8b\u8017\u8d39\u5927\u91cf\u65f6\u95f4\uff0c\u6210\u672c\u5f88\u9ad8\u3002 \u56e0\u6b64\uff0c\u6211\u4eec\u603b\u7ed3\u4e00\u4e9b\u81ea\u52a8\u5316\u7528\u4f8b\u9009\u578b\u7684\u6807\u51c6\uff0c\u4ee5\u4f18\u5316\u540e\u7eed\u81ea\u52a8\u5316\u7528\u4f8b\u7ed3\u6784\uff0c\u671f\u5f85\u6211\u4eec\u80fd\u7f16\u5199\u51fa\u9ad8\u6548\u3001\u7a33\u5b9a\u3001\u6613\u4e8e\u7ef4\u62a4\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_1","title":"\u4e00\u3001\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u53ef\u4ee5\u5206\u4e3a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u548c\u4e13\u9879\u81ea\u52a8\u5316\u6d4b\u8bd5\uff0c\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e00\u822c\u53ea\u9488\u5bf9\u4e00\u4e9b\u5e38\u89c4\u7684\u529f\u80fd\u6d4b\u8bd5\uff0c\u5176\u4ed6\u975e\u5e38\u89c4\u529f\u80fd\u7684\u7528\u4f8b\uff0c\u5e94\u8be5\u91c7\u7528\u4e13\u9879\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u6848\uff1b \u4ee5\u4e0b\u662f\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1","title":"1. \u7a33\u5b9a\u6027\u3001\u538b\u6d4b\u7528\u4f8b","text":"\u7a33\u5b9a\u6027\u6d4b\u8bd5\u3001\u538b\u6d4b\u7528\u4f8b\u5e94\u8be5\u662f\u5c5e\u4e8e\u6027\u80fd\u76f8\u5173\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u5982\uff1a\u53cd\u590d\u591a\u6b21\u70b9\u51fb\u6309\u94ae\uff0c\u68c0\u9a8c\u5176\u529f\u80fd\u7a33\u5b9a\u6027\u3002\u56e0\u4e3a\u8fd9\u4e9b\u7528\u4f8b\u65ad\u8a00\u7684\u9884\u671f\u53ef\u80fd\u4e0d\u662f\u5f88\u660e\u786e\uff0c\u66f4\u6709\u751a\u8005\u4e0d\u9700\u8981\u65ad\u8a00\uff0c\u7528\u4f8b\u65f6\u957f\u6bd4\u8f83\u957f\uff0c\u800c\u4e14\u4e0d\u53ef\u63a7\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u76ee\u524d\u6211\u4eec\u6709\u6027\u80fd\u81ea\u52a8\u5316\u7684\u4e13\u9879\u65b9\u6848\uff0c\u4ee5\u53ca\u4e00\u4e9b\u7a33\u5b9a\u6027\u6d4b\u8bd5\u7684\u4e13\u9879\u65b9\u6848\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u6b64\u7c7b\u7528\u4f8b\u653e\u5230\u4e13\u9879\u81ea\u52a8\u5316\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2","title":"2. \u6d89\u53ca\u591a\u4e2a\u7528\u6237\u64cd\u4f5c","text":"\u5e38\u89c1\u4e0e\u6587\u7ba1\u7684\u7528\u4f8b\u4e2d\uff0c\u591a\u7528\u6237\u64cd\u4f5c\u7684\u7528\u4f8b\u4e00\u822c\u90fd\u4f1a\u6d89\u53ca\u5230\u5728\u7cfb\u7edf\u4e2d\u8fdb\u884c\u591a\u4e2a\u7528\u6237\u95f4\u7684\u5207\u6362\uff0c\u81ea\u52a8\u5316\u811a\u672c\u4e00\u822c\u662f\u8fd0\u884c\u5728\u4e00\u4e2a\u7528\u6237\u7a7a\u95f4\u4e0b\u7684\uff0c\u6240\u4ee5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u591a\u7528\u6237\u95f4\u7684\u5207\u6362\u3002 \u6b64\u7c7b\u4e0d\u5efa\u8bae\u91c7\u7528\u81ea\u52a8\u5316\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3","title":"3. \u4e0e\u5f00\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4ea4\u4e92","text":"\u6b64\u7c7b\u573a\u666f\u591a\u4e3a\u5e94\u7528\u7684\u5f02\u5e38\u573a\u666f\u6d4b\u8bd5\uff0c\u6bd4\u5982\uff1a\u590d\u5236\u5927\u6587\u4ef6\u8fc7\u7a0b\u4e2d\u6ce8\u9500\u673a\u5668\u3002 \u81ea\u52a8\u5316\u811a\u672c\u5728\u7cfb\u7edf\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4e4b\u540e\u662f\u4f1a\u505c\u6b62\u8fd0\u884c\u7684\uff1b\u6b64\u7c7b\u7528\u4f8b\u53ef\u4ee5\u505a\u81ea\u52a8\u5316\uff0c\u4f46\u662f\u540c\u6837\u9700\u8981\u505a\u4e13\u9879\u65b9\u6848\uff0c\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u7684\u5904\u7406\u903b\u8f91\u5b8c\u5168\u4e0d\u540c\u3002 \u540e\u7eed\u81ea\u52a8\u5316\u9700\u8981\u516c\u5173\u7684\u70b9\uff1a \u81ea\u52a8\u5316\u811a\u672c\u5728\u672c\u673a\u8fd0\u884c\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u81f3\u5c11\u9700\u8981\u63d0\u4f9b\u4ee5\u4e0b\u529f\u80fd\uff1a \u91cd\u542f\u4e4b\u540e\u7528\u4f8b\u80fd\u81ea\u52a8\u8fd0\u884c\uff1b\u53ef\u4ee5\u8003\u8651\u5c06\u6267\u884c\u7528\u4f8b\u5199\u6210\u4e00\u4e2a\u5f00\u673a\u81ea\u542f\u7684\u670d\u52a1\uff1b \u80fd\u8bb0\u5f55\u5173\u673a\u4e4b\u524d\u7528\u4f8b\u6267\u884c\u7684\u4f4d\u7f6e\uff0c\u91cd\u542f\u4e4b\u540e\u80fd\u4ece\u6b64\u4f4d\u7f6e\u5f00\u59cb\u6267\u884c\uff1b \u50cf\u6027\u80fd\u81ea\u52a8\u5316\u4e00\u6837\uff0c\u7531\u670d\u52a1\u7aef\u63a7\u5236\uff1b \u5b8c\u5168\u57fa\u4e8e\u56fe\u5f62\u8bc6\u522b\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u4e32\u53e3\u7ebf\u63a7\u5236\u952e\u9f20\u7a33\u5b9a\u6027\uff1b "},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4","title":"4. \u6d4b\u8bd5\u6267\u884c\u65f6\u95f4\u957f","text":"\u7528\u4f8b\u6267\u884c\u65f6\u95f4\u63a7\u5236\u57282\u5206\u949f\u4ee5\u5185\uff0c\u6781\u7aef\u60c5\u51b5\u4e0d\u8981\u8d85\u8fc75\u5206\u949f\uff0c\u6240\u6709\u7528\u4f8b\u7684\u5e73\u5747\u65f6\u957f\u5e94\u8be5\u57281\u5206\u949f\u5de6\u53f3\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u95f4\u592a\u957f\uff0c\u7f16\u5199\u7528\u4f8b\u3001\u8c03\u8bd5\u7528\u4f8b\u3001\u6267\u884c\u7528\u4f8b\u3001\u7ef4\u62a4\u7528\u4f8b\u90fd\u975e\u5e38\u7684\u8017\u65f6\uff0c\u4eba\u529b\u6210\u672c\u65f6\u95f4\u6210\u672c\u6295\u5165\u592a\u9ad8\u3002 \u4f60\u60f3\uff0c\u8fd9\u6761\u7528\u4f8b\u6267\u884c\u9700\u89815\u5206\u949f\uff0c\u90a3\u4f60\u5199\u8fd9\u6761\u7528\u4f8b\u7684\u65f6\u95f4\u4e0d\u53ef\u80fd\u4e00\u904d\u8fc7\uff0c\u5199\u7684\u8fc7\u7a0b\u4e2d\u8dd1\u4e0d\u901a\u8fd8\u5f97\u91cd\u8dd1\u81f3\u5c1115\u5206\u949f\u4e0d\u8fc7\u5206\uff0c\u5199\u5b8c\u4e86\u8fd8\u5f97\u5728\u5176\u4ed6\u67b6\u6784\u4e0a\u8c03\u8bd5\uff0c\u534a\u4e2a\u5c0f\u65f6\u8fc7\u53bb\u4e86\uff0c\u8fd9\u8fd8\u53ea\u662f\u7b2c\u4e00\u6b21\u5199\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u540e\u7eed\u5982\u679c\u7528\u4f8b\u7ef4\u62a4\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u7ecf\u5e38\u6295\u5165\u76f8\u5f53\u957f\u65f6\u95f4\uff0c\u8fd9\u6837\u5176\u5b9e\u662f\u5931\u53bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u7684\u3002\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u5c31\u5e94\u8be5\u662f\u5feb\u51c6\u72e0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5","title":"5. \u8fb9\u7f18\u6027\u6d4b\u8bd5","text":"\u6709\u4e9b\u529f\u80fd\u6a21\u5757\u672c\u8eab\u662f\u5c5e\u4e8e\u6bd4\u8f83\u8fb9\u7f18\u6027\u7684\uff0c\u5373\u6781\u5c11\u7528\u6237\u4f1a\u4f7f\u7528\u5230\u7684\u529f\u80fd\uff0c\u8fd9\u7c7b\u529f\u80fd\u6a21\u5757\u4e0d\u9700\u8981\u5927\u89c4\u6a21\u5b9e\u73b0\u81ea\u52a8\u5316\uff0c\u4e00\u4e24\u4e2a\u573a\u666f\u8986\u76d6\u57fa\u672c\u529f\u80fd\u5c31\u884c\u4e86\uff0c\u56e0\u6b64\u6211\u4eec\u5728\u6311\u9009\u6b64\u7c7b\u7528\u4f8b\u7684\u65f6\u5019\u53ef\u4ee5\u7ed3\u5408\u6574\u4e2a\u529f\u80fd\u6a21\u5757\u7684\u8986\u76d6\u60c5\u51b5\u6765\u51b3\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6","title":"6. \u9700\u8981\u4f9d\u8d56\u4eba\u5de5\u4ecb\u5165\u7684","text":"\u81ea\u52a8\u5316\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\u662f\u6ca1\u6709\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bd4\u5982\u8981\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u90a3\u4e48\u5c31\u80cc\u79bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u3002 \u6bd4\u5982\u5149\u9a71\u6a21\u5757\uff0c\u5149\u9a71\u523b\u5f55\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u4f46\u662f\u5149\u9a71\u523b\u5f55\u4e4b\u540e\u5149\u76d8\u4f1a\u5f39\u51fa\u6765\uff0c\u9700\u8981\u4eba\u5de5\u66f4\u6362\u5149\u76d8\uff0c\u518d\u624b\u52a8\u63a8\u8fdb\u5149\u9a71\u4e2d\u3002 \u8fd9\u79cd\u529f\u80fd\u6a21\u5757\u5373\u4f7f\u505a\u81ea\u52a8\u5316\uff0c\u80fd\u6d89\u53ca\u5230\u7684\u529f\u80fd\u975e\u5e38\u6709\u9650\uff0c\u800c\u4e14\u4e0d\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u6240\u4ee5\u660e\u663e\u5c31\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7","title":"7. \u96be\u4ee5\u5b9e\u73b0\u7684","text":"\u7528\u4f8b\u6240\u6d89\u53ca\u5230\u7684\u65b9\u6cd5\u5b9e\u73b0\u8d77\u6765\u53ef\u80fd\u6709\u96be\u5ea6\uff0c\u751a\u81f3\u73b0\u9636\u6bb5\u65e0\u6cd5\u5b9e\u73b0\u7684\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002 \u6bd4\u5982\u5f71\u9662\u6d4b\u8bd5\u753b\u9762\u6e05\u6670\u5ea6\u3001\u6d41\u7545\u5ea6\u3001\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u4e4b\u540e\u7684\u89c6\u9891\u662f\u5426\u5b58\u5728\u5361\u987f\u7b49\u7528\u4f8b\uff0c\u73b0\u9636\u6bb5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#8","title":"8. \u529f\u80fd\u4e0d\u7a33\u5b9a","text":"\u8fd9\u4e2a\u4e0d\u662f\u8bf4\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\uff0c\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\u4e0d\u7a33\u5b9a\u662f\u6b63\u5e38\u7684\uff0c\u8fd9\u79cd\u6211\u4eec\u53ef\u4ee5\u7b49\u5f00\u53d1\u63d0\u6d4b\u4e4b\u540e\u518d\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u3002 \u529f\u80fd\u4e0d\u7a33\u5b9a\u6307\u7684\u662f\u7528\u4f8b\u6240\u6d89\u53ca\u7684\u529f\u80fd\uff0c\u53ef\u80fd\u5b58\u5728\u591a\u79cd\u53d8\u5316\uff0c\u6bcf\u6b21\u6267\u884c\u7528\u4f8b\u53ef\u80fd\u65ad\u8a00\u7684\u9884\u671f\u90fd\u4e0d\u540c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#9","title":"9. \u52a8\u6001\u65ad\u8a00","text":"\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u76f4\u5230\u7528\u4f8b\u7ed3\u675f\uff0c\u4e00\u76f4\u662f\u4e00\u4e2a\u52a8\u6001\u53d8\u5316\u7684\u8fc7\u7a0b\uff0c\u800c\u4e14\u65e0\u6cd5\u901a\u8fc7\u5176\u4ed6\u624b\u6bb5\u505c\u4e0b\u6765\uff1b \u6bd4\u5982\uff1a\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u65f6\uff0c\u53f3\u4e0b\u89d2\u7684\u5f55\u5236\u65f6\u95f4\u662f\u4e00\u76f4\u5728\u53d8\u5316\u7684\uff0c\u7528\u4f8b\u9700\u8981\u6d4b\u8bd5\u5f55\u52361\u5206\u949f\u4e4b\u540e\uff0c\u5f55\u5236\u65f6\u95f4\u662f\u521a\u597d\u505c\u572860\u79d2\uff1b \u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fd8\u505a\u4e0d\u5230\u65f6\u95f4\u7cbe\u51c6\u63a7\u5236\uff0c\u7a0b\u5e8f\u6267\u884c\u65f6\u95f4\u662f\u6709\u6ce2\u52a8\u7684\uff0c\u800c\u4e14\u8981\u9002\u914d\u591a\u4e2a\u5e73\u53f0\uff0c\u6240\u4ee5\u6b64\u7c7b\u7528\u4f8b\u5927\u6982\u7387\u4f1a\u6267\u884c\u5931\u8d25\u3002\u7279\u522b\u662f\u5728\u6027\u80fd\u8f83\u5dee\u7684\u56fd\u4ea7\u5316\u67b6\u6784\u4e0a\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u592a\u53ef\u80fd\u7a33\u5b9a\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#10","title":"10. \u63a2\u7d22\u6027\u6d4b\u8bd5","text":"\u63a2\u7d22\u6027\u6d4b\u8bd5\u901a\u5e38\u662f\u4e00\u4e9b\u4e0d\u786e\u5b9a\u7684\u64cd\u4f5c\uff0c\u591a\u53d8\u5207\u590d\u6742\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u9884\u671f\u4e5f\u53ef\u80fd\u662f\u4e0d\u786e\u5b9a\u7684\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u9a9a\u64cd\u4f5c\u592a\u591a\u4e86\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6b64\u7c7b\u7528\u4f8b\u9002\u5408\u91c7\u7528\u624b\u5de5\u6d4b\u8bd5\uff0c\u662f\u624b\u5de5\u6d4b\u8bd5\u771f\u6b63\u7684\u4ef7\u503c\u4f53\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#11","title":"11. \u6613\u7528\u6027\u6d4b\u8bd5","text":"\u5bf9\u4e8e\u6613\u7528\u6027\u7684\u5224\u65ad\u901a\u5e38\u662f\u4e3b\u89c2\u7684\uff0c\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\u5f88\u96be\u53bb\u5b9a\u4e49\u4ec0\u4e48\u6837\u7684\u60c5\u51b5\u5bf9\u7528\u6237\u662f\u6613\u7528\u7684\uff0c\u81ea\u52a8\u5316\u9700\u8981\u6709\u660e\u786e\u7684\u53ef\u5b9e\u73b0\u7684\u9884\u671f\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_2","title":"\u4e8c\u3001\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u524d\u9762\u8bb2\u4e86\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u4e00\u4e9b\u7528\u4f8b\u60c5\u51b5\uff0c\u6709\u540c\u5b66\u5c31\u8bf4\u4e86\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\u4e0d\u7528\u8bb2\u4e86\uff0c\u5c31\u662f\u4e0d\u9002\u5408\u7684\u53cd\u9762\u3002\u6ca1\u6bdb\u75c5\u54c8\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\uff0c\u6211\u4eec\u5927\u4f53\u8fd8\u53ef\u4ee5\u5206\u4e3a\u4e24\u7c7b\uff1a \u7b2c\u4e00\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u597d\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u7b2c\u4e8c\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u4e00\u822c\uff0c\u9700\u8981\u6295\u5165\u66f4\u591a\u7cbe\u529b\u624d\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u4ee5\u4e0b\u4ecb\u7ecd\u4e00\u4e9b\u6211\u4eec\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1_1","title":"1. \u64cd\u4f5c\u76f8\u5bf9\u7b80\u5355","text":"\u7528\u4f8b\u6b65\u9aa4\u76f8\u5bf9\u8f83\u5c11\uff0c\u8fd9\u79cd\u7528\u4f8b\u901a\u5e38\u662f\u4e00\u4e9b\u8def\u5f84\u5f88\u6d45\u7684\u7528\u4f8b\uff0c\u4e00\u822c\u4e5f\u662f\u4e00\u4e9b\u57fa\u7840\u7528\u4f8b\u3002\u7528\u4f8b\u7f16\u5199\u3001\u7ef4\u62a4\u90fd\u53ef\u4ee5\u8f7b\u677e\u641e\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2_1","title":"2. \u5bb9\u6613\u5b9e\u73b0","text":"\u73b0\u6709\u6280\u672f\u662f\u53ef\u5b9e\u73b0\u7684\uff0c\u6ca1\u6709\u96be\u5ea6\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3_1","title":"3. \u7ecf\u5e38\u7528\u4e8e\u56de\u5f52\u6d4b\u8bd5","text":"\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bcf\u6b21\u56de\u5f52\u6d4b\u8bd5\u5fc5\u987b\u8981\u6267\u884c\u7684\u7528\u4f8b\uff0c\u90a3\u4e48\u8fd9\u6761\u7528\u4f8b\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u3002 \u56de\u5f52\u6d4b\u8bd5\u65f6\u6211\u4eec\u9996\u5148\u5e94\u8be5\u4fdd\u8bc1\u5e94\u7528\u5386\u53f2\u57fa\u672c\u529f\u80fd\u6b63\u5e38\uff0c\u6240\u4ee5\u90a3\u4e9b\u6bcf\u6b21\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u90fd\u8981\u6267\u884c\u7684\u7528\u4f8b\u9002\u5408\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4_1","title":"4. \u529f\u80fd\u7a33\u5b9a\u7684\u6838\u5fc3\u529f\u80fd","text":"\u6d89\u53ca\u6838\u5fc3\u529f\u80fd\u7684\u7528\u4f8b\u662f\u6700\u6700\u91cd\u8981\u7684\u7528\u4f8b\uff0c\u4e5f\u662f\u6211\u4eec\u4ea4\u4ed8\u65f6\u5fc5\u987b\u8981\u4fdd\u8bc1\u8d28\u91cf\u7684\u76f8\u5173\u529f\u80fd\uff0c\u56e0\u6b64\u5e94\u8be5\u5c3d\u53ef\u80fd\u7684\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5_1","title":"5. \u8f93\u5165\u6570\u636e\u6d4b\u8bd5","text":"\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u901a\u5e38\u662f\u68c0\u9a8c\u88ab\u6d4b\u5e94\u7528\u63a5\u53d7\u6709\u6548\u6570\u636e\u3001\u62d2\u7edd\u65e0\u6548\u6570\u636e\u7684\u80fd\u529b\u3002\u5982\uff1a\u63d0\u4ea4\u8d85\u957f\u5b57\u7b26\u4e32\u3001\u7279\u6b8a\u5b57\u7b26\u4e32\u7b49\u7b49\u3002 \u6b64\u7c7b\u7528\u4f8b\u624b\u5de5\u6d4b\u8bd5\u5f88\u96be\u6bd4\u8f83\u5168\u9762\u7684\u8986\u76d6\u5230\u6240\u6709\u7684\u8f93\u5165\u60c5\u51b5\uff0c\u4f46\u662f\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\uff0c\u6b64\u7c7b\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u90fd\u662f\u4e00\u6837\u7684\uff0c\u53d8\u5316\u7684\u4ec5\u662f\u8f93\u5165\u53c2\u6570\u548c\u65ad\u8a00\u7ed3\u679c\uff0c\u91c7\u7528\u6570\u636e\u9a71\u52a8\uff0c\u53ef\u4ee5\u8f7b\u677e\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6_1","title":"6. \u683c\u5f0f\u8986\u76d6","text":"\u539f\u56e0\u540c\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u7c7b\u7528\u4f8b\u4e00\u6837\uff0c\u591a\u79cd\u683c\u5f0f\u7684\u8986\u76d6\u4e5f\u662f\u4e00\u4e2a\u5f88\u7e41\u7410\u7684\u4e8b\u60c5\uff0c\u4ea4\u7ed9\u81ea\u52a8\u5316\u6765\u505a\u518d\u5408\u9002\u4e0d\u8fc7\u4e86\u3002 \u6bd4\u5982\u5f71\u9662\u5bf9\u5f71\u7247\u683c\u5f0f\u7684\u68c0\u67e5\u3001\u622a\u56fe\u5f55\u5c4f\u5bf9\u4fdd\u5b58\u683c\u5f0f\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7_1","title":"7. \u68c0\u67e5\u5143\u7d20\u72b6\u6001","text":"\u67e5\u770b\u88ab\u6d4b\u5e94\u7528\u7684\u5143\u7d20\u5c5e\u6027\u3002\u5982\uff1a\u56fe\u7247\u7684\u5927\u5c0f\u548c\u6392\u5217\uff1b\u6309\u94ae\u7684\u53ef\u7528\u548c\u4e0d\u53ef\u7528\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/","title":"AT \u7ecf\u9a8c\u603b\u7ed3","text":"\u6b22\u8fce\u6240\u6709\u4eba\u63d0\u4ea4\u4f60\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u9762\u7684\u4f18\u79c0\u5b9e\u8df5\u7ecf\u9a8c\uff0c\u4ee5\u5e2e\u52a9\u5927\u5bb6\u89e3\u51b3\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#1","title":"1\u3001\u7ec8\u7ed3\u5668","text":"# litaoa@uniontech.com\n \u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4 pytest \u5b9e\u73b0\u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4\u7684\u65b9\u5f0f\u6709\u4e24\u79cd\uff0cyield \u548c\u7ec8\u7ed3\u51fd\u6570\uff1b yield \u5b9e\u73b0\uff0cyield\u524d\u9762\u4e3a\u7528\u4f8b\u7684\u524d\u7f6e\u6b65\u9aa4\uff0cyield \u540e\u9762\u4e3a\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4\u3002 @pytest.fixture\ndef clean_env():\nprint(\"setup\")\nyield\nprint(\"teardown\")\n \u7ec8\u7ed3\u51fd\u6570\u5b9e\u73b0\uff0c\u4f7f\u7528 request.addfinalizer \u6ce8\u518c\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4 @pytest.fixture\ndef clean_env(request):\ndef clean():\nprint(\"teardown\")\nrequest.addfinalizer(clean)\nprint(\"setup\")\n yield\u7684\u4f18\u7f3a\u70b9\uff1a \u4f18\u70b9\uff1a\u4ee3\u7801\u7b80\u6d01\uff0c\u76f4\u89c2\uff0c\u53ef\u4f7f\u7528yield\u5728\u7528\u4f8b\u4e2d\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c \u7f3a\u70b9\uff1a\u82e5\u524d\u7f6e\u6b65\u9aa4\u4e2d\u51fa\u73b0\u9519\u8bef\uff0c\u5219\u540e\u7f6e\u6b65\u9aa4\u4e0d\u4f1a\u6267\u884c \u7ec8\u7ed3\u51fd\u6570\uff1a \u4f18\u70b9\uff1a\u524d\u7f6e\u6b65\u9aa4\u5931\u8d25\u7684\u8bdd\uff0c\u540e\u7f6e\u6b65\u9aa4\u4ecd\u4f1a\u6267\u884c\u4e14\u53ef\u4ee5\u6ce8\u518c\u591a\u4e2a\u540e\u7f6e\u6b65\u9aa4\uff08\u524d\u63d0\uff1a\u9700\u8981\u5728\u4ee3\u7801\u62a5\u9519\u4e4b\u524d\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff09\uff0c\u652f\u6301\u7075\u6d3b\u4f7f\u7528\u540e\u7f6e\u6761\u4ef6 \u7f3a\u70b9\uff1a\u4ee3\u7801\u8f83\u4e3a\u590d\u6742\uff0c\u65e0\u6cd5\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c\uff08\u672c\u4eba\u76ee\u524d\u672a\u5b9e\u73b0\uff09 \u603b\u7ed3\uff1a\u5728\u524d\u7f6e\u6b65\u9aa4\u4fdd\u8bc1\u7edd\u5bf9\u4e0d\u4f1a\u51fa\u9519\u65f6\uff0c\u4f7f\u7528yield\u66f4\u4f73\u7b80\u4fbf\uff0c\u5f53\u524d\u7f6e\u6b65\u9aa4\u6613\u51fa\u73b0\u95ee\u9898\u65f6\uff0c\u63a8\u8350\u4f7f\u7528\u7ec8\u7ed3\u51fd\u6570\u3002 \u573a\u666f\uff1a\u4fdd\u9669\u7bb1\u7528\u4f8b\uff0c\u524d\u7f6e\u6b65\u9aa4\u4e2d\u5f00\u542f\u4fdd\u9669\u7bb1\uff0c\u540e\u7f6e\u6b65\u9aa4\u5220\u9664\u4fdd\u9669\u7bb1\u3002 @pytest.fixture(scope=\"session\", autouse=True)\ndef vault_fixture(request):\nDfmWidget.reset_vault_by_cmd() # 1\u3001\u91cd\u7f6e\u4fdd\u9669\u7bb1\nDdeDockPublicWidget().close_file_manager_by_cmd() # 2\u3001\u5173\u95ed\u6587\u7ba1\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 3\u3001\u5f00\u542f\u6587\u7ba1\nvault = DfmWidget()\nvault.create_file_vault() # 4\u3001\u521b\u5efa\u4fdd\u9669\u7bb1\ndef delete_vault(): # 8\u3001\u5220\u9664\u4fdd\u9669\u7bb1\u7684\u540e\u7f6e\u6b65\u9aa4\nsleep(2)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr()\nvault = DfmWidget()\nvault.delete_file_vault()\nDfmWidget.reset_vault_by_cmd()\nDdeDockPublicWidget().close_file_manager_by_cmd()\nrequest.addfinalizer(delete_vault) # 5\u3001\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\nDdeDockPublicWidget().close_file_manager_by_cmd() # 6\u3001\u5173\u95ed\u6587\u7ba1\nsleep(1)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 7\u3001\u5f00\u542f\u6587\u7ba1\n \u4ee3\u7801\u6309\u6ce8\u91ca\u4e2d\u7684\u5e8f\u53f7\u6267\u884c\u6b65\u9aa4 \u4ee3\u7801\u5728\u6b65\u9aa41-4\u4efb\u610f\u4f4d\u7f6e\u62a5\u9519\uff0c\u5219\u4e0d\u4f1a\u6267\u884c\u6b65\u9aa48\uff0c\u56e0\u4e3a\u672a\u6267\u884c\u5230\u6b65\u9aa45\uff0c\u6b65\u9aa48\u8fd8\u672a\u6ce8\u518c \u4ee3\u7801\u5728\u6b65\u9aa46-7\u62a5\u9519\uff0c\u4ecd\u4f1a\u6267\u884c\u6b65\u9aa47\uff0c\u56e0\u4e3a\u5728\u6b65\u9aa45\u4e2d\u5df2\u7ecf\u5c06\u6b65\u9aa47\u6ce8\u518c \u53ef\u4ee5\u7075\u6d3b\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff0c\u80fd\u5b9e\u73b0\u67d0\u4e2a\u524d\u7f6e\u6b65\u9aa4\u6267\u884c\u4e4b\u540e\uff0c\u624d\u4f1a\u6267\u884c\u540e\u7f6e\u6b65\u9aa4\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#2","title":"2\u3001\u542f\u52a8\u5e94\u7528\u7684\u65b9\u5f0f","text":"# huangmingqiang@uniontech.com\n \uff081\uff09\u547d\u4ee4\u884c\u542f\u52a8 \u5728 AT \u4ee3\u7801\u4e2d\u4f7f\u7528\u547d\u4ee4\u884c\u542f\u52a8\u5e94\u7528\uff0c\u4e3e\u4f8b\uff1a os.popen(\"deepin-music\")\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f7f\u7528 ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6\uff0cdogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u3002 \uff082\uff09\u901a\u8fc7 UI \u64cd\u4f5c\u542f\u52a8 \u901a\u8fc7\u4efb\u52a1\u680f\u3001\u542f\u52a8\u5668\u3001\u684c\u9762\u7b49UI\u65b9\u5f0f\u542f\u52a8\uff0c\u6bd4\u5982\u53cc\u51fb\u6253\u5f00\u3001\u53f3\u952e\u6253\u5f00\u7b49\uff0c\u8fd9\u79cd\u64cd\u4f5c\u65b9\u5f0f\u4e0d\u5b58\u5728ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6dogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u7684\u95ee\u9898\uff0c\u4e5f\u66f4\u52a0\u7b26\u5408\u7528\u6237\u7684\u64cd\u4f5c\u884c\u4e3a\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#3","title":"3\u3001\u6587\u4ef6\u9009\u62e9\u6846\u5c5e\u6027\u5b9a\u4f4d\u5076\u73b0\u65e0\u6cd5\u627e\u5230","text":"\u6587\u4ef6\u9009\u62e9\u6846\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5728\u8c03\u7528\u6587\u4ef6\u9009\u62e9\u6846\u65f6\uff0c\u6709\u4e00\u5b9a\u7684\u6982\u7387\u51fa\u73b0\uff0c\u754c\u9762\u5df2\u7ecf\u6e32\u67d3\u51fa\u6765\u4e86\uff0c\u4f46\u662f\u5c5e\u6027\u6811\u5e76\u6ca1\u6709\u5199\u5165\uff0c\u5bfc\u81f4\u901a\u8fc7\u5c5e\u6027\u65e0\u6cd5\u627e\u5230\u5143\u7d20\uff0c\u76ee\u524d\u4e5f\u6ca1\u6709\u5f88\u597d\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u4e3a\u4e86\u7528\u4f8b\u7a33\u5b9a\u6027\uff0c\u6587\u4ef6\u9009\u62e9\u6846\u7684\u64cd\u4f5c\u5efa\u8bae\u4f7f\u7528UI\u6216\u8005\u56fe\u7247\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u53ef\u4ee5\u901a\u8fc7\u641c\u7d22\u5185\u5bb9\u56fa\u5b9a\u6587\u4ef6\u4f4d\u7f6e\u3002 # litaoa@uniontech.com\n desk = DdeDesktopPublicWidget()\n# \u9009\u62e9\u89c6\u9891\u76ee\u5f55\ndesk.click_videos_dir_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.ctrl_f()\nsleep(1)\ndesk.input_message(\"\u5143\u7d20\u540d\u79f0\")\nsleep(0.5)\ndesk.enter()\nsleep(1)\n# \u9009\u62e9\u7b2c\u4e00\u4e2a\u6587\u4ef6\ndesk.click_list_view_btn_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.click_first_file_in_desktop_plugs_by_ui()\nsleep(1)\n# \u6587\u7ba1\u63d2\u4ef6\u4e2d\u70b9\u51fb\u6253\u5f00\ndesk.click_open_btn_in_desktop_plugs_by_ui()\n"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#4","title":"4\u3001\u5e94\u7528\u542f\u52a8","text":"# mikigo\n \u5728UI\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u4e00\u5207\u64cd\u4f5c\u7684\u90fd\u662f\u4ece\u5e94\u7528\u542f\u52a8\u5f00\u59cb\u7684\uff0c\u800c\u5728Linux\u684c\u9762\u5e94\u7528\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u6211\u4eec\u542f\u52a8\u5e94\u7528\u7684\u65b9\u6cd5\u6709\u591a\u79cd\uff0c\u4e0b\u9762\u505a\u4e00\u4e2a\u7b80\u5355\u7684\u4ecb\u7ecd\uff1a \u3010\u4f7f\u7528dogtail\u542f\u52a8\u3011 dogtail\u63d0\u4f9b\u4e86\u5e94\u7528\u542f\u52a8\u7684\u65b9\u6cd5\uff0c\u5728utils\u5e93\u4e2d\uff0c\u4f7f\u7528run\u65b9\u6cd5\u542f\u52a8\uff1a \u9996\u5148\u5bfc\u5165\u65b9\u6cd5\uff1a from dogtail.utils import *\n \u8c03\u7528run\u65b9\u6cd5 run('deepin-music')\n \u5373\u53ef\u542f\u52a8\u97f3\u4e50 \u8fd9\u79cd\u65b9\u6cd5\u7684\u4f18\u70b9\u662f\u91c7\u7528\u8fdb\u7a0b\u7684\u65b9\u5f0f\u76f4\u63a5\u542f\u52a8\uff0c\u4e0d\u4f9d\u8d56\u4e0eUI\uff0c\u65e0\u8bba\u684c\u9762\u6216\u4efb\u52a1\u680f\u4e0a\u662f\u5426\u5b58\u5728\u5e94\u7528\u56fe\u6807\uff0c\u90fd\u53ef\u4ee5\u6b63\u5e38\u542f\u52a8\u3002 \u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c \u5982\u679c\u4f7f\u7528ssh\u8fdc\u7a0b\u8c03\u7528\uff0c\u6216\u8005Jenkins\u4e2d\u6267\u884c\u6d4b\u8bd5\u811a\u672c\u7684\u65f6\u5019\uff0c\u5728sniff\u4e2d\u4f1a\u51fa\u73b0\u627e\u4e0d\u5230\u5e94\u7528\uff0c\u7ecf\u8fc7\u5206\u6790\uff0c\u53ef\u80fd\u662f\u56e0\u4e3a\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\u542f\u52a8\u7684\u65f6\u5019\uff0c\u5b9e\u9645\u662f\u91c7\u7528\u4e00\u4e2a\u5b50\u8fdb\u7a0b\u542f\u52a8\u4e86\u5e94\u7528\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u5230\u3002 \u3010\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u3011 \u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807 \u901a\u5e38\u6709\u4e24\u79cd\u65b9\u6cd5\uff1a \uff081\uff09\u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807\u3002 \uff082\uff09\u5df2\u77e5\u5e94\u7528\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u7684\u4f4d\u7f6e\uff0c\u7136\u540e\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u5bf9\u5e94\u5750\u6807\u3002 \u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u7f3a\u70b9\u662f\u4f4d\u7f6e\u5fc5\u987b\u56fa\u5b9a\uff0c\u5982\u679c\u79fb\u52a8\u4f4d\u7f6e\u5c31\u4e0d\u884c\u4e86\uff0c\u800c\u4f7f\u7528\u7b2c\u4e00\u79cd\u65b9\u6cd5\uff0c\u65e0\u8bba\u4f4d\u7f6e\u5728\u54ea\u91cc\uff0c\u53ea\u8981\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u5b58\u5728\u5373\u53ef\u3002 \u3010\u70b9\u51fb\u684c\u9762\u56fe\u6807\u542f\u52a8\u3011 \u684c\u9762\u56fe\u6807\u76ee\u524d\u662f\u91c7\u7528\u56fe\u50cf\u8bc6\u522b\u6280\u672f\uff0c\u5b9a\u4f4d\u5230\u5e94\u7528\u56fe\u6807\u7684\u5750\u6807\uff0c\u7136\u540e\u901a\u8fc7pyauogui\u8fdb\u884c\u70b9\u51fb\u64cd\u4f5c\u3002 \u8be6\u7ec6\u6280\u672f\u65b9\u6848\u53ef\u4ee5\u53c2\u8003\u6211\u7684\u53e6\u5916\u4e24\u7bc7\u535a\u5ba2: \u57fa\u4e8eopencv\u7684\u6a21\u677f\u5339\u914d\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd4\u56de\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 Python\u4e09\u65b9\u5e93PyAutoGui\u7684\u4f7f\u7528\u65b9\u6cd5 \u3010\u4ece\u542f\u52a8\u5668\u542f\u52a8\uff08\u4fd7\u79f0\u5f00\u59cb\u83dc\u5355\uff09\u3011 \u542f\u52a8\u4e2d\u542f\u52a8\u7684\u5b9e\u73b0\u903b\u8f91\u5b9e\u9645\u548c\u4efb\u52a1\u680f\u4e0a\u542f\u52a8\u5dee\u4e0d\u591a\u3002 \u9996\u5148\uff0c\u9700\u8981\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u542f\u52a8\u5668\u56fe\u6807\uff0c\u6216\u8005\u952e\u76d8super\u952e\uff0c\u5c06\u542f\u52a8\u5668\u547c\u51fa\u6765\uff0c \u7136\u540e\uff0c\u5728\u542f\u52a8\u5668\u4e2d\u70b9\u51fb\u5bf9\u5e94\u7684\u56fe\u6807\uff0c \u4f46\u662f\u8fd9\u91cc\u6709\u4e2a\u95ee\u9898\uff0c\u542f\u52a8\u5668\u4e2d\u7684\u5e94\u7528\u5217\u8868\uff0c\u4e00\u9875\u5c55\u793a\u4e0d\u5b8c\uff0c\u6240\u4ee5\u5982\u679c\u6211\u4eec\u8981\u70b9\u51fb\u7684\u5e94\u7528\u56fe\u6807\u4e0d\u5728\u7b2c\u4e00\u9875\u600e\u4e48\u529e\uff0c\u901a\u5e38\u89e3\u51b3\u65b9\u6848\u6709\u4e24\u79cd\uff1a \uff081\uff09\u9700\u8981\u8fdb\u884c\u5411\u4e0b\u6ed1\u52a8\uff0c\u8fd9\u91cc\u5c31\u6d89\u53ca\u5230\u76f8\u5e94\u7684\u8bc6\u522b\u65b9\u6848\uff0c\u5224\u65ad\u5982\u679c\u4e0d\u5728\u7b2c\u4e00\u9875\u5c31\u5f80\u4e0b\u6ed1\u52a8\u7ffb\u9875\u3002 \uff082\uff09\u542f\u52a8\u5668\u63d0\u4f9b\u641c\u7d22\u7684\u529f\u80fd\uff0c\u8f93\u5165\u5e94\u7528\u540d\u79f0\u641c\u7d22\uff0c\u7136\u540e\u8fdb\u884c\u70b9\u51fb\u3002 \u4ece\u5b9e\u9645\u64cd\u4f5c\u4e2d\u6765\u770b\uff0c\u91c7\u7528\u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u6548\u7387\u4f1a\u9ad8\u4e00\u70b9\u3002 \u3010\u7ec8\u7aef\u547d\u4ee4\u542f\u52a8\u3011 \u5728python\u4e2d\uff0c\u4f7f\u7528os.popen()\u6216os.system()\u6216\u8005subprocess.Popen()\uff0c\u5b9e\u73b0\u547d\u4ee4\u884c\u542f\u52a8\uff0c\u6bd4\u5982\uff1a import os\nos.popen('deepin-music')\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u8fdc\u7a0b\u6267\u884c\u811a\u672c\u7684\u65f6\u5019\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u7684\u95ee\u9898\u3002 \u3010\u603b\u7ed3\u3011 \u4ee5\u4e0a\u51e0\u79cd\u65b9\u6cd5\uff0c\u5404\u6709\u4f18\u7f3a\u70b9\uff0c\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff1a \uff081\uff09\u5982\u679c\u9700\u8981\u5728Jenkins\u4e2d\u505a\u6301\u7eed\u96c6\u6210\uff0c\u5efa\u8bae\u4f7f\u7528\u7b2c\u4e8c\u79cd\u4efb\u52a1\u680f\u542f\u52a8\u7684\u65b9\u6cd5\u3002 \uff082\uff09\u5982\u679c\u4e0d\u4f1a\u91c7\u7528\u8fdc\u7a0b\u6267\u884c\u7684\uff0c\u5efa\u8bae\u91c7\u7528\u7b2c\u4e00\u79cd\u6216\u8005\u6700\u540e\u4e00\u79cd\u65b9\u6848\u3002 \uff083\uff09\u7b2c\u4e09\u79cd\u548c\u7b2c\u56db\u79cd\u542f\u52a8\u65b9\u6cd5\uff0c\u901a\u5e38\u5728\u6d4b\u8bd5\u7528\u4f8b\u4e2d\u4f1a\u6d89\u53ca\u5230\uff0c\u6240\u4ee5\u5076\u5c14\u4f1a\u7528\u3002"},{"location":"RELEASE/","title":"\u7248\u672c\u66f4\u65b0\u8bb0\u5f55","text":""},{"location":"RELEASE/#2122023822","title":"2.1.2\uff082023/8/22\uff09","text":"new \u589e\u52a0 OCR \u8bc6\u522b\u81ea\u52a8\u91cd\u8bd5\u673a\u5236\uff0c\u9ed8\u8ba4\u91cd\u8bd5 2 \u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u91cd\u8bd5\u6b21\u6570\uff1b \u4f7f\u7528\u7a97\u7ba1\u6700\u65b0\u63d0\u4f9b\u7684\u4e8c\u8fdb\u5236\u63a5\u53e3\uff0c\u4f18\u5316\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u5728 Wayland \u4e0b\u83b7\u53d6\u7a97\u53e3\u4fe1\u606f\u7684\u65b9\u6cd5\uff1b\u611f\u8c22\u684c\u9762\u6d4b\u8bd5\u90e8 @\u4f55\u6743 @\u5b59\u7fe0 \u3001\u7a97\u7ba1\u7814\u53d1 @\u9ec4\u6cfd\u94ed \u7684\u5927\u529b\u652f\u6301\u3002 \u6269\u5145 skipif \u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\u51fd\u6570\uff1a skipif_xdg_type \u652f\u6301 x11 \u6216 wayland \u4e0a\u8df3\u8fc7\uff1b skipif_cpu_name \u652f\u6301\u4e0d\u540c cpu \u4e0a\u8df3\u8fc7\uff0c\u6bd4\u5982\uff1askipif_cpu_name-KLVVW5821\uff1b "},{"location":"RELEASE/#2102023818","title":"2.1.0\uff082023/8/18\uff09","text":"fix \u4fee\u590d SW \u67b6\u6784\u73af\u5883\u4f9d\u8d56\u7684\u95ee\u9898\uff0c\u539f\u56e0\u662f\u4e4b\u524d\u6211\u8fd9\u91cc\u672c\u5730\u6ca1\u6709 SW \u7684\u673a\u5668\uff0c\u6ca1\u6709\u505a\u76f8\u5173\u9002\u914d\uff1b \u4fee\u590d\u5b50\u9879\u76ee\u5355\u72ec\u9700\u8981\u4e09\u65b9\u5305 pexpect\uff0c\u7531\u4e8e\u4e4b\u524d\u662f\u9884\u88c5\u5230\u955c\u50cf\u91cc\u9762\u7684\uff0c\u4f46\u57fa\u7840\u6846\u67b6\u4e0d\u9700\u8981\uff0c\u56e0\u6b64\u6ca1\u6709\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u91cc\u9762\uff0c\u5bfc\u81f4\u5b50\u9879\u76ee\u4f9d\u8d56\u62a5\u9519\u3002 \u4fee\u590d\u5b50\u9879\u76ee cv \u5bfc\u5165\u62a5\u9519\u7684\u95ee\u9898\uff1b \u539f\u56e0\u4e3a\uff1ayouqu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u517c\u5bb9\u4e24\u79cd\u60c5\u51b5\uff0c\u4e00\u79cd\u662f\u9762\u5411\u670d\u52a1\uff0c\u5c31\u662f\u672c\u5730\u6d4b\u8bd5\u673a\u4e0d\u9700\u8981\u5b89\u88c5 OpenCV\uff0c\u7528\u4f8b\u4e2d\u7684\u56fe\u50cf\u8bc6\u522b\u4f1a\u901a\u8fc7\u8fdc\u7a0b\u670d\u52a1\u63a5\u53e3\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u548c\u7ed3\u679c\u83b7\u53d6\uff1b\u7b2c\u4e8c\u79cd\u662f\u539f\u751f\uff0c\u5c31\u662f\u672c\u5730\u76f4\u63a5\u5b89\u88c5 OpenCV \u76f4\u63a5\u7528\u3002\u4e24\u4e2a\u60c5\u51b5\u7684\u4f18\u5148\u7ea7\u662f\u4f18\u5148\u5224\u65ad\u672c\u5730\u5b58\u5728\uff0c\u5426\u5219\u8d70\u670d\u52a1\u3002 \u524d\u9762\u6211\u4eec\u5df2\u7ecf\u628a OCR \u529f\u80fd\u505a\u4e86\u670d\u52a1\u5316\uff0c\u57fa\u4e8e 1 \u5e74\u591a\u4ee5\u6765\u7684\u89c2\u5bdf\uff0c\u7528\u8d77\u6765\u5f88\u7a33\u5b9a\uff0c\u518d\u4e00\u4e2a\u5c31\u662f OpenCV \u5b89\u88c5\u5305\u662f\u6bd4\u8f83\u81c3\u80bf\u7684\uff0c\u7c97\u7565\u6570\u4e86\u4e0b\u4f9d\u8d56\u6709 30+ \u4e2a\uff0c\u800c\u4e14\u5728\u5404\u67b6\u6784\u4e0a\u4f9d\u8d56\u5305\u8fd8\u4e0d\u5c3d\u76f8\u540c\uff0c\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u65b9\u6848\u4e2d\u4e0d\u592a\u597d\u5904\u7406\uff0c\u6240\u4ee5\u672c\u6b21 2.0 \u7248\u672c\u6211\u4eec\u5927\u80c6\u7684\u5c06\u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u529f\u80fd\u4fee\u6539\u4e3a\u9762\u5411\u670d\u52a1\u7684\u65b9\u5f0f\uff0c\u524d\u671f\u6d4b\u8bd5\u4e00\u5207\u770b\u8d77\u6765\u90fd\u5f88\u548c\u8c10\u3002 \u4f46\u662f\u6ca1\u6ce8\u610f\u5230\u4e4b\u524d\u7ed9\u6d77\u71d5\u59d0\u90a3\u8fb9\u9879\u76ee\u5355\u72ec\u5b9a\u5236\u505a\u4e86\u4e2a\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\uff08\u4e3a\u4e86\u80fd\u7b80\u5355\u5e73\u6ed1\u7684\u8fc1\u79fb\u5230 youqu\uff09\uff0c\u6b64\u63a5\u53e3\u5e95\u5c42\u6ca1\u6709\u517c\u5bb9\u670d\u52a1\u5316\uff0c\u6240\u4ee5\u5979\u90a3\u8fb9\u7684\u9879\u76ee\u8c03\u7528\u6b64\u5b9a\u5236\u63a5\u53e3\u4f1a\u62a5 cv \u5bfc\u5165\u7684\u95ee\u9898\u3002 \u7531\u4e8e\u5c06\u8fd9\u4e2a\u5b9a\u5236\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\u8fdb\u884c\u670d\u52a1\u5316\u517c\u5bb9\u6539\u9020\u9700\u8981\u4e00\u5b9a\u65f6\u95f4\uff0c\u6539\u5b8c\u8fd8\u9700\u8981\u6d4b\u8bd5\uff0c\u4f46\u672c\u6b21\u65f6\u95f4\u6bd4\u8f83\u7d27\uff0c\u56e0\u6b64\u5148\u628a OpenCV \u88c5\u8fdb\u865a\u62df\u73af\u5883\uff0c\u540e\u7eed\u7248\u672c\u518d\u8003\u8651\u9488\u5bf9\u6b64\u63a5\u53e3\u505a\u4fee\u6539\u3002"},{"location":"RELEASE/#2002023816","title":"2.0.0\uff082023/8/16\uff09","text":"YouQu\uff08\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff09\u5f00\u6e90\u4e86\uff0c\u540c\u65f6\u63a8\u51fa\u4e86 2.0 \u7248\u672c\u3002 \u611f\u8c22\u738b\u6ce2\u603b\u3001\u67b6\u6784\u5e08\u5f90\u5c0f\u4e1c\u3001\u7814\u53d1\u7ecf\u7406\u90d1\u5e7c\u6208\u3001\u5218\u90d1\u7b49\u7814\u53d1\u540c\u4e8b\u7684\u5927\u529b\u652f\u6301\u3002 new 1\u3001\u65b0\u7684\u57fa\u7840\u6846\u67b6\u4ee3\u7801\u83b7\u53d6\u65b9\u5f0f\u53ca\u65b0\u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4 YouQu \u540e\u7eed\u5747\u901a\u8fc7 PyPI \u8fdb\u884c\u5305\u7684\u53d1\u5e03\uff0c\u4e5f\u5c31\u662f\u8bf4\u540e\u7eed\u53ef\u4ee5\u4f7f\u7528 pip \u8fdb\u884c\u5b89\u88c5\uff1a sudo pip3 install youqu==2.0.0\n \u8fd9\u91cc\u6709 2 \u4e2a\u5c0f\u70b9\u8981\u6ce8\u610f\uff1a \u63a8\u8350\u4f7f\u7528 sudo pip3 \uff08\u52a0 sudo\uff09\u8fdb\u884c\u5b89\u88c5\uff1b \u5982\u679c\u4e0d\u52a0 sudo \u6709\u4e9b\u673a\u5668\u53ef\u80fd $HOME/.local/bin \u4e0d\u5728\u7cfb\u7edf PATH \u73af\u5883\u76ee\u5f55\u4e0b\uff0c\u5728\u4e0d\u6dfb\u52a0\u73af\u5883\u53d8\u91cf\u7684\u60c5\u51b5\u4e0b\uff0c\u4f1a\u51fa\u73b0 YouQu \u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4\uff08youqu-startproject\uff09\u65e0\u6cd5\u4f7f\u7528\u7684\u95ee\u9898\uff1b \u5f53\u7136\uff0c\u5c06\u4e0a\u8ff0\u8def\u5f84\u6dfb\u52a0\u5230\u73af\u5883\u53d8\u91cf\u4e4b\u540e\u4e5f\u662f\u53ef\u4ee5\u7528\u7684\uff0c\u6240\u4ee5\u6211\u8fd9\u91cc\u662f\u63a8\u8350\u52a0 sudo\uff0c\u4e0d\u52a0 sudo \u4e5f\u662f\u53ef\u4ee5\u7684\uff0c\u53ea\u662f\u9700\u8981\u5173\u6ce8\u4e0b\u73af\u5883\u53d8\u91cf\u7684\u95ee\u9898\u3002 \u63a8\u8350\u6307\u5b9a\u7248\u672c\u53f7\uff08youqu==2.0.0\uff09\u5b89\u88c5\uff0c\u5982\u679c\u4e0d\u6307\u5b9a\u7248\u672c\u53f7\u9ed8\u8ba4\u662f\u5b89\u88c5\u6700\u65b0\u53d1\u5e03\u7684 YouQu \u7248\u672c\uff0c\u4f60\u53ef\u4ee5\u5728 PyPI \u4e0a\u7684 Release history \u91cc\u9762\u67e5\u770b\u6709\u54ea\u4e9b\u7248\u672c\u3002 \u5b89\u88c5\u4e4b\u540e\u4f1a\u81ea\u52a8\u751f\u6210\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu-startproject\uff0c\u4f7f\u7528\u5b83\u53ef\u4ee5\u521d\u59cb\u5316\u5de5\u7a0b\uff0c\u8fd9\u91cc\u4ee5\u97f3\u4e50\u4e3e\u4f8b\uff1b youqu-startproject autotest_deepin_music\n \u8fd9\u6837\u5c31\u4f1a\u5728\u5f53\u524d\u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a autotest_deepin_music \u76ee\u5f55\uff0c\u91cc\u9762\u5305\u542b\u4e86\u57fa\u7840\u6846\u67b6\u6240\u6709\u7684\u4ee3\u7801\uff1b \u4e4b\u540e\uff0c\u8fd8\u662f\u5728 apps \u76ee\u5f55\u4e0b\uff0c\u653e\u5165\u5b50\u9879\u76ee\u7684AT\u4ee3\u7801\u5373\u53ef\uff0c\u4f7f\u7528\u65b9\u6cd5\u548c\u8fc7\u53bb\u4e00\u6837\uff0c\u8fd9\u91cc\u5c31\u4e0d\u591a\u4ecb\u7ecd\u3002 \u53e6\u5916\uff0c\u9664\u4e86\u901a\u8fc7 pip \u83b7\u53d6\u4ee5\u5916\uff0c\u4ecd\u7136\u53ef\u4ee5\u901a\u8fc7\u6e90\u7801\u83b7\u53d6\uff08\u76f4\u63a5 git clone\uff09\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u4f7f\u7528 pip \u5b89\u88c5 YouQu \u65f6\uff0cYouQu \u5305\u7684\u5927\u5c0f\u624d 600+ k\uff0c\u5b89\u88c5\u901f\u5ea6\u8d77\u98de\u3002 2\u3001\u65b0\u7684AT\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848 \u4e3a\u4e86\u89e3\u51b3\u4ee5\u4e0b\u95ee\u9898\uff1a \u8fc7\u53bb\u4e00\u6bb5\u65f6\u95f4\u54b1\u4eec\u7ecf\u5e38\u51fa\u73b0\u7684\uff0c\u4e0d\u540c\u7684AT\u9879\u76ee\u5728\u540c\u4e00\u53f0\u673a\u5668\u4e0a\u90e8\u7f72\u73af\u5883\u65f6\u4f9d\u8d56\u7248\u672c\u51b2\u7a81\u7684\u95ee\u9898\uff0c\u65b0\u65b9\u6848\u4e0d\u540c\u7684\u9879\u76ee\u4f1a\u52a8\u6001\u751f\u6210\u81ea\u5df1\u7684\u865a\u62df\u73af\u5883\uff0c\u76f8\u4e92\u4e4b\u95f4\u4e0d\u5f71\u54cd\uff1b \u4e1a\u5185\u4e3a\u4e86\u89e3\u51b3\u7248\u672c\u51b2\u7a81\u95ee\u9898\u4e00\u822c\u90fd\u4f1a\u4f7f\u7528Python\u865a\u62df\u73af\u5883\u7684\u5de5\u5177\uff0c\u4f46\u662f\u90fd\u6709\u4e2a\u95ee\u9898\uff0c\u65e0\u6cd5\u7ba1\u7406 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u5305\uff0c\u672c\u6b21\u6211\u4eec\u89e3\u51b3\u4e86\u8fd9\u4e2a\u95ee\u9898\uff0c\u80fd\u591f\u5b8c\u5168\u7ba1\u7406\u5e38\u89c4\u7684Python\u5305\uff0c\u4e5f\u80fd\u7ba1\u7406\u5230 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u4e09\u65b9\u5305\uff1b \u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u4f7f\u7528\u65b9\u6cd5\uff1a bash env.sh\n \u53ef\u4ee5\u770b\u51fa\u6765\u548c\u539f\u6765\u4f7f\u7528\u65b9\u6cd5\u6ca1\u6709\u53d8\u5316\uff0c\u4e5f\u5c31\u662f\u8bf4\u4ece\u4f7f\u7528\u7684\u89d2\u5ea6\u662f\u5b8c\u5168\u6ca1\u6709\u533a\u522b\u7684\uff0c\u53ea\u662f\u5185\u90e8\u505a\u4e86\u4e0d\u540c\u7684\u4e8b\u60c5\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u672c\u673a\u90e8\u7f72\u7684\u529f\u80fd\u4ecd\u7136\u4fdd\u7559 env_dev.sh\uff0c\u53ef\u4ee5\u4f5c\u4e3a\u5f00\u53d1\u65f6\u7684\u73af\u5883\u90e8\u7f72\u3002 3\u3001\u65b0\u7684\u9a71\u52a8\u547d\u4ee4 \u8fc7\u53bb\u54b1\u4eec\u90fd\u662f\u4f7f\u7528\u8fd9\u6837\u7684\u547d\u4ee4\u6765\u9a71\u52a8\u6267\u884c\uff1a python3 manage.py run\n \u7531\u4e8e\u9ed8\u8ba4\u57fa\u4e8e\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848\uff0c\u56e0\u6b64\u6211\u4eec\u589e\u52a0\u4e86\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu\uff1b \u65b0\u7684\u9a71\u52a8\u65b9\u5f0f\uff1a youqu manage.py run\n \u53ea\u9700\u8981\u628a python3 \u66ff\u6362\u6210 youqu \u5c31\u53ef\u4ee5\u4e86\uff0c\u770b\u8d77\u6765\u5f88\u548c\u8c10~ 4\u3001\u65b0\u7684\u6587\u6863\u5730\u5740 \u8fc7\u53bb\u54b1\u4eec YouQu \u7684\u5728\u7ebf\u6587\u6863\u662f\u90e8\u7f72\u5728\u516c\u53f8\u5185\u7f51\u7684\uff0c\u73b0\u5728\u5f00\u6e90\u5230 github \u4e86\uff0c\u5916\u90e8\u5f00\u53d1\u8005\u80af\u5b9a\u8bbf\u95ee\u4e0d\u5230\u5185\u7f51\u7684\u6587\u6863\uff0c\u56e0\u6b64\u9700\u8981\u5c06\u6587\u6863\u90e8\u7f72\u5230\u516c\u7f51\u3010\u516c\u7f51\u6587\u6863\u3011\uff1b \u516c\u7f51\u6587\u6863\u4f7f\u7528\u7684\u662f github pages\uff08\u767d\u5ad6\u602a\u4e00\u987f\u72c2\u559c~~\uff09\uff0c\u4f46\u53ef\u80fd\u4f1a\u51fa\u73b0\u6587\u6863\u901f\u5ea6\u6162\u7684\u95ee\u9898\uff08\u4ee3\u7406\u4e0b\u5c31\u597d\u4e86\uff09\uff0c\u4e0d\u8fc7\u6ca1\u5173\u7cfb\uff0c\u54b1\u4eec\u3010\u5185\u7f51\u6587\u6863\u3011\u4ecd\u7136\u4fdd\u7559\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u3002 5\u3001\u5176\u4ed6\u4e00\u4e9b\u5c0f\u5c0f\u529f\u80fd\u66f4\u65b0\uff1a \uff081\uff09\u65b0\u589e\u5173\u95ed\u5206\u8fa8\u7387\u68c0\u6d4b\u7684\u53c2\u6570\u503c\uff1b youqu manage.py run --resolution no\n \u6216\u8005\u4fee\u6539 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387, \u6bd4\u5982\uff1a1920x1080\n;no: \u8868\u793a\u4e0d\u505a\u5206\u8fa8\u7387\u6821\u9a8c\nRESOLUTION = 1920x1080\n resolution \u8fd9\u4e2a\u53c2\u6570\u4e00\u76f4\u90fd\u6709\u7684\uff0c\u53ea\u4e0d\u8fc7\u4e4b\u524d\u662f\u7528\u4e8e\u6307\u5b9a\u5206\u8fa8\u7387\u5927\u5c0f\uff0c\u6bd4\u5982 --resolution 1920x1080\uff0c\u4f46\u6709\u4e9b\u63a5\u53e3\u7684\u9879\u76ee\u4e0d\u9700\u8981\u8fd9\u4e2a\u68c0\u67e5\uff0c\u53ef\u4ee5\u7ed9\u5b83\u4e2a no \u5c31\u597d\u4e86\uff0c\u5f53\u7136 CICD \u4e0a\u5173\u95ed\uff0c\u9700\u8981\u6d41\u6c34\u7ebf\u4e0a\u628a\u8fd9\u4e2a\u53c2\u6570\u52a0\u4e0a\uff1b \uff082\uff09\u65b0\u589e\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u7684\u547d\u4ee4\u884c\u53c2\u6570 \u4e4b\u524d\u8fd9\u4e2a\u914d\u7f6e\u9879\u53ea\u80fd\u5728 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c 1 \u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff0cRERUN >= RECORD_FAILED_CASE\u3002\n;1.\u5173\u95ed\u5f55\u5c4f\uff1aRECORD_FAILED_CASE > RERUN\n;2.\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1aRECORD_FAILED_CASE = 0\nRECORD_FAILED_CASE = 1\n \u73b0\u5728\u5c06\u5f00\u53d1\u5230\u547d\u4ee4\u884c\u53c2\u6570\u3002 youqu manage.py run --record_failed_case 2\n fix \u4fee\u590d remote \u6267\u884c\u65f6\uff0c\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u65e0\u6cd5\u751f\u6210\u6d4b\u8bd5\u62a5\u544a\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1302023710","title":"1.3.0\uff082023/7/10\uff09","text":"fix \u8fdb\u4e00\u6b65\u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b\u53c2\u8003\uff1a\u914d\u7f6ePython\u6e90\u7684\u51e0\u79cd\u65b9\u6cd5 \u4fee\u590d wayland_autotool \u53d7\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86wayland\u4e0b\u5076\u73b0\u627e\u4e0d\u5230 .Xauthority \u6587\u4ef6\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1292023626","title":"1.2.9\uff082023/6/26\uff09","text":"fix \u4f18\u5316\u8fdc\u7a0b\u6267\u884c remote \u7684\u53c2\u6570\u76f4\u63a5\u4f20\u7ed9\u8fdc\u7a0b\u673a\u5668\u7684 run \u547d\u4ee4\uff0c\u4e0d\u7528\u518d\u5355\u72ec\u5904\u7406\u8fdc\u7a0b\u6267\u884c\u7684\u53c2\u6570\u903b\u8f91\uff0c\u540e\u7eed\u4e13\u6ce8\u4e8e\u672c\u5730\u6267\u884c\u529f\u80fd\u5f00\u53d1\uff0c\u8fdc\u7a0b\u6267\u884c\u81ea\u52a8\u9002\u7528\uff1b env.sh \u79fb\u9664 pyyaml \u5b89\u88c5\uff0c\u7531\u5b50\u9879\u76ee\u5728 requirement.txt \u91cc\u9762\u5b9a\u4e49\uff0c\u6846\u67b6\u81ea\u52a8\u52a0\u8f7d\uff1b \u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b "},{"location":"RELEASE/#128202369","title":"1.2.8\uff082023/6/9\uff09","text":"fix \u4fee\u590d\u4e86 pypi \u5b89\u88c5 numpy \u5b58\u5728\u7cfb\u7edf\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#127202368","title":"1.2.7\uff082023/6/8\uff09","text":"fix env.sh \u4e2d\u5b89\u88c5 Python \u5305\u672a\u6307\u5b9a\u7248\u672c\u65f6\uff0c\u65e5\u5fd7\u8f93\u51fa\u5b89\u88c5\u7684\u7248\u672c\uff1b pdocr-rpc 2.0.1\nallure-custom 1.2.1\nfunnylog 1.1.3\n \u4fee\u590d -f \u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u62a5\u9519\u7684\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#126202367","title":"1.2.6\uff082023/6/7\uff09","text":"fix \u4fee\u590d wayland \u4e0a\u8c03\u7528\u9f20\u6807\u4e2d\u952e\u3001\u53f3\u952e\u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b \u4fee\u590d pubilic/dde_desktop_public_widget \u91cc\u9762\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u5b9a\u4f4d\u684c\u9762\u6587\u4ef6\u7684\u65b9\u6cd5\uff0c\u5750\u6807\u6ca1\u6709\u62c6\u5305\u7684\u95ee\u9898\uff1b \u4f18\u5316\u4e86\u7b49\u5f85\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b pycreeze \u7248\u672c\u5347\u7ea7\u5230 0.1.29\uff0c\u5bfc\u81f4\u4e0e pyautogui 0.9.53 \u4e0d\u517c\u5bb9\uff0cenv.sh \u91cc\u9762\u589e\u52a0\u6307\u5b9a pycreeze \u7248\u672c\u4e3a 0.1.28\uff1b "},{"location":"RELEASE/#1252023516","title":"1.2.5\uff082023/5/16\uff09","text":"new --app \u53c2\u6570\u540e\u9762\u65b0\u589e\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u76ee\u524d\u652f\u6301\u4e09\u79cd\u53c2\u6570\u4f20\u5165\u65b9\u5f0f\uff1a ~$: youqu run -a deepin-music\n~$: youqu run -a autotest_deepin_music\n~$: youqu run -a apps/autotest_deepin_music\n \u200b \u540e\u4e24\u79cd\u5165\u53c2\u65b9\u5f0f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\u3002 remote \u8fdc\u7a0b\u6267\u884c\u65b0\u589e\u4ece\u547d\u4ee4\u884c\u4f20\u5165\u6d4b\u8bd5\u673a\u4fe1\u606f\uff0c\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679c password \u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6 setting/remote.ini \u4e2d CLIENT_PASSWORD \u7684\u503c,\u6bd4\u5982\uff1auos@10.8.13.33:1 \u6216 uos@10.8.13.33 \uff1b python3 manage.py remote -c uos@10.8.13.33/uos@10.8.13.34\npython3 manage.py remote -c uos@10.8.13.33:1/uos@10.8.13.34:2\n fix \u65e5\u5fd7\u6a21\u5757\u4fee\u6539\u4e3a\u51fd\u6570\u6267\u884c\u4e4b\u524d\u6253\u5370\u65e5\u5fd7\uff1b \u65e5\u5fd7\u6a21\u5757\u589e\u52a0\u767d\u540d\u5355\uff0c\u901a\u8fc7\u7c7b\u540d\u5f00\u5934\uff0c\u7ed3\u675f\uff0c\u5305\u542b\u7b49\u5173\u952e\u5b57\u63a7\u5236\u9700\u8981\u6253\u5370\u7684\u51fd\u6570\u65e5\u5fd7\uff1b \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5982\u679c\u4f20\u5165\u4e86 app_name \u53ea\u4f1a\u5c06 apps \u76ee\u5f55\u4e0b app_name \u7684\u76ee\u5f55\u53d1\u9001\u5230\u6d4b\u8bd5\u673a\uff1b env.sh \u79fb\u9664 python3-dev\uff1b \u4fee\u590d Wayland \u4e0b env.sh \u73af\u5883\u5b89\u88c5\u5931\u8d25\u7684\u95ee\u9898\uff0c\u4f18\u5316\u4e86 deb \u4f9d\u8d56\u5b89\u88c5\u7684\u903b\u8f91\uff1b \u5c06 env.sh \u5237\u65b0\u6e90\u7684\u65e5\u5fd7\u5728\u7ec8\u7aef\u663e\u793a\uff0c\u89e3\u51b3\u5728 CI \u73af\u5883\u4e0b\uff0c\u957f\u65f6\u95f4\u4e0d\u8f93\u51fa\u65e5\u5fd7\u8fde\u63a5\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d1060 \u534e\u4e3a\u673a\u578b\u5b89\u88c5\u952e\u9f20\u5de5\u5177\u65f6\u4f9d\u8d56\u4e0d\u517c\u5bb9\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1242023227","title":"1.2.4\uff082023/2/27\uff09","text":"fix \u4fee\u6539 CURRENT \u6587\u4ef6\uff1b "},{"location":"RELEASE/#1232023227","title":"1.2.3\uff082023/2/27\uff09","text":"new pylint.sh \u652f\u6301\u901a\u8fc7\u4f4d\u7f6e\u53c2\u6570\u4f20\u5165\u6587\u4ef6\u8def\u5f84\uff1abash pylint.sh apps/autotest_deepin_music,\u597d\u5904\u662f\u53c2\u6570\u8def\u5f84\u53ef\u4ee5\u5728\u7ec8\u7aef\u8865\u5168\uff1b \u65b0\u589e\u7cfb\u7edf\u547d\u4ee4 youqu-pylint \uff0c\u7528\u4e8e\u9759\u6001\u4ee3\u7801\u626b\u63cf\uff0c\u4f7f\u7528\u65b9\u6cd5: youqu-pylint apps/autotest_deepin_music\uff1b \u7531\u4e8e\u7cfb\u7edf\u4e00\u4e9b dbus \u63a5\u53e3\u6539\u53d8\uff0c\u516c\u5171\u5e93\u4e2d\u7684 dbus \u65b9\u6cd5\u5c06\u4e0d\u518d\u7ef4\u62a4\uff0c\u7531\u5b50\u9879\u76ee\u5728 other_widget.py \u91cc\u9762\u8fdb\u884c\u7ef4\u62a4\uff1b fix \u4fee\u590d ssh \u73af\u5883\u4e0b\u8fd0\u884c\u63d0\u793a \u201c\u65e0\u6cd5\u8fde\u63a5\u201d \u7684\u95ee\u9898\uff1b \u4fee\u590d\u8fd0\u884c\u65f6\u7a0b\u5e8f\u9000\u51fa\uff0c\u4e0d\u8f93\u51fa\u5f02\u5e38\u65e5\u5fd7\u7684\u95ee\u9898\uff1b \u4fee\u590dyouqu remote xxx \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5728\u670d\u52a1\u7aef Ctrl + C \u65e0\u6cd5\u505c\u6b62\u7a0b\u5e8f\u8fd0\u884c\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#122202328","title":"1.2.2\uff082023/2/8\uff09","text":"new \u65b0\u589e\u6c14\u6ce1\u7c7b\u56fe\u50cf\u8bc6\u522b\u65b9\u6848\uff1bimage_utils.py::ImageUtil::get_during\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u533a\u57df\u8bc6\u522b\uff0c\u4f20\u5165 [x, y, w, h]\uff0cx: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u76ee\u6807\u56fe\u7247\uff0c\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\uff1b env.sh \u79fb\u9664 pypinyin; \u4f18\u5316\u6267\u884c env.sh \u65f6\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b manage.py \u79fb\u9664\u4e86\u53c2\u6570 session_timeout \uff0c\u6846\u67b6\u6839\u636e\u5168\u5c40\u7684 timeout \u4ee5\u53ca\u7528\u4f8b\u81ea\u5b9a\u4e49\u7684 timeout \u81ea\u52a8\u8ba1\u7b97\u51fa sessiontimeout \u7684\u503c\uff1b \u65b0\u589e ocr \u670d\u52a1\u5668\u94fe\u63a5\u91cd\u8bd5\uff0c\u9ed8\u8ba4\u91cd\u8bd51\u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u53c2\u6570\uff1b fix \u4fee\u590d\u4e86\u4e00\u4e9b pylint \u626b\u63cf\u7684\u4ee3\u7801\u98ce\u683c\u95ee\u9898\uff1b \u91cd\u65b0\u8bbe\u8ba1\u4e86\u6d4b\u8bd5\u62a5\u544a\u4e3b\u9898\uff1b "},{"location":"RELEASE/#121202316","title":"1.2.1\uff082023/1/6\uff09","text":"new \u652f\u6301\u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6267\u884c\u7528\u4f8b\uff1b\u53ef\u5c06python3 manage.py \u66ff\u6362\u4e3a youqu \uff1a youqu run -a deepin-music -k 001\n RPC \u670d\u52a1 IP \u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u6307\u5b9a\u4e0d\u540c\u7684\u7aef\u53e3\uff1b \u5728\u7ebf\u6587\u6863\u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u539f\u6765\u7684\u5730\u5740 10.8.10.215 \u5c06\u4e0d\u5728\u4f7f\u7528\uff1b fix \u4fee\u590d --count \u53c2\u6570\u53ef\u80fd\u51fa\u73b0\u4e0e\u5176\u4ed6\u6846\u67b6\u7684\u5de5\u7a0b\u4f9d\u8d56\u5b58\u5728\u51b2\u7a81\uff0c\u62a5\u9519\u91cd\u590d\u6ce8\u518c\u7684\u95ee\u9898\uff1b \u4fee\u590d CI \u73af\u5883\u4e0b\u591a\u4e2a\u5de5\u7a0b\u5b58\u5728 Python \u73af\u5883\u53d8\u91cf\u6307\u5411\u9519\u8bef\uff0c\u5bfc\u5305\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u5355\u72ec\u8fd0\u884c\u65b9\u6cd5\u65f6\u65e0\u65e5\u5fd7\u8f93\u51fa\u7684 Bug\uff1b "},{"location":"RELEASE/#12020221230","title":"1.2.0\uff082022/12/30\uff09","text":"1.1.4 \u7248\u672c\u9002\u914d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e14\u65b0\u589e\u4e86\u8f83\u591a\u65b0\u7279\u6027\uff0c\u6211\u4eec\u8ba1\u5212\u4f7f\u7528 1.1.4 \u7248\u672c\u8fd0\u884c\u4e00\u6bb5\u65f6\u95f4\uff0c1.2.0 \u7248\u672c\u5c06\u4fee\u590d\u671f\u95f4\u51fa\u73b0\u7684 Bug\uff0c\u7136\u540e\u4f5c\u4e3a\u7a33\u5b9a\u7248\u672c\u53d1\u5e03\u3002 new \u4fee\u6539\u5de5\u7a0b\u540d\u79f0\u4e3a youqu\uff1b \u5c06 sphinx \u6587\u6863\u5de5\u7a0b\u8fc1\u79fb\u5230\u5355\u72ec\u7684\u4ed3\u5e93\uff1b fix \u4fee\u590d startapp \u521b\u5efa\u5de5\u7a0b\u65f6\u5b58\u5728\u5de5\u7a0b\u540d\u79f0\u65f6\u65e0\u6cd5\u7ee7\u7eed\u521b\u5efa\uff1b \u4fee\u590d\u4e86 OCR \u670d\u52a1\u5728\u5e76\u53d1\u65f6\u53ef\u80fd\u51fa\u73b0\u65e0\u6cd5\u8fd4\u56de\u7ed3\u679c\u7684\u95ee\u9898\uff0c\u63d0\u5347 OCR \u670d\u52a1\u9ad8\u5e76\u53d1\u7a33\u5b9a\u6027\uff1b \u4fee\u590d PMS \u540c\u6b65\u6807\u7b7e\u5230 CSV \u6587\u4ef6\u4e0d\u652f\u6301\u7528\u4f8b\u5e93\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11420221214","title":"1.1.4\uff082022/12/14\uff09","text":"new \u65b0\u589e startapp \u5b50\u547d\u4ee4\u521b\u5efa\u5b50\u9879\u76ee\u5de5\u7a0b\u6a21\u677f: python3 manage.py startapp autotest_deepin_xxx \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u91cd\u590d\u6267\u884c\u6b21\u6570\uff1b \u53bb\u6389\u6279\u91cf\u6267\u884c\u524d\u6536\u96c6\u7528\u4f8b\u7684\u6b65\u9aa4\uff1b \u589e\u52a0\u5f00\u59cb\u6267\u884c\u65f6\u6253\u5370\u4e00\u4e9b\u6267\u884c\u53c2\u6570\uff0c\u5982\uff1a \u7528\u4f8b\u6536\u96c6\u6570\u91cf: 99\n\u5931\u8d25\u91cd\u8dd1\u6b21\u6570: 1\n\u6700\u5927\u5931\u8d25\u6b21\u6570: 49\n\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4: 200.0s (03\u520620\u79d2)\n\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4: 11880s (3\u5c0f\u65f618\u52060\u79d2)\n \u5b9a\u5236\u4fee\u6539allure\u62a5\u544alogo\u3001title\u3001\u9ed8\u8ba4\u8bed\u8a00\uff1b manage.py \u6267\u884c\u5f00\u59cb\u65f6\u6253\u5370 logo \u548c\u5f53\u524d\u7248\u672c\uff1a \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u255a\u2588\u2588\u2557 \u2588\u2588\u2554\u255d \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2584\u2584 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2580\u2580\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u2584\u2588 \u2584\u2588 \u2588 \u2588 \u2588 \u2584 \u2588 \u2584 \u2580\u2580\u2588 \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\uff1b \u88c5\u9970\u5668\u65b9\u6cd5\u6307\u5b9a\u6b21\u6570\uff1b @pytest.mark.count(2)\ndef test_music_001():\npass\n \u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u6b21\u6570\uff1b python3 manage.py run -a deepin-music -k 001 --count 2\n \u200b image_utils \u589e\u52a0\u51fd\u6570 save_temporary_picture\uff0c\u652f\u6301\u6307\u5b9a\u5c4f\u5e55\u533a\u57df\u622a\u56fe\u5e76\u8fd4\u56de\u56fe\u7247\u5b58\u653e\u7684\u672c\u5730\u8def\u5f84\uff0c\u540e\u7eed\u4f7f\u7528 assert_image_exist \u8fdb\u884c\u65ad\u8a00 Python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(x, y, width, height) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) button_center \u65b0\u589e btn_size \u83b7\u53d6\u63a7\u4ef6\u5de6\u4e0a\u89d2\u5750\u6807\u53ca\u957f\u5bbd\uff0c\u7528\u4e8e\u52a8\u6001\u7684\u622a\u53d6\u5143\u7d20\u7684\u56fe\u7247\uff0c\u53ef\u7528\u4e8e\u5b9a\u4f4d\u65ad\u8a00 python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u6240\u6709\u97f3\u4e50\u6309\u94ae\")) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) allure \u62a5\u544a\u4e2d\u5b9a\u4f4d\u95ee\u9898\u9664\u4e86\u65e5\u5fd7\u3001\u622a\u56fe\u3001\u5f55\u5c4f\u5916\uff0c\u8c03\u7528\u7684\u51fd\u6570\u589e\u52a0\u4e86 step \u6b65\u9aa4\u5c55\u793a\uff1b env.sh \u65b0\u589e\u5b89\u88c5\u5b50\u9879\u76ee Python \u4e09\u65b9\u4f9d\u8d56\uff0c\u5728\u5b50\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u5199 requirement.txt \u6587\u4ef6\uff0cenv.sh \u4f1a\u81ea\u52a8\u52a0\u8f7d\uff1b ocr \u8bc6\u522b\u65b0\u589e\u652f\u6301\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\u8fdb\u884c\u6587\u5b57\u8bc6\u522b\uff0c\u51cf\u5c11\u56e0\u5168\u5c4f\u8bc6\u522b\u65f6\uff0c\u5176\u4ed6\u6587\u5b57\u7684\u5e72\u6270 Python # \u65ad\u8a00\u97f3\u4e50\u7684\u5220\u9664\u5f39\u7a97\u4e2d\uff0c\u5305\u542b\u4e86\u201c\u786e\u8ba4\u201d\u7684\u6587\u5b57 self.assert_ocr_exist(\"\u786e\u8ba4\", picture_abspath=DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u5220\u9664\u5f39\u7a97\"))) \u65ad\u8a00\u51fd\u6570\u7684\u8c03\u7528\u4e5f\u4f1a\u81ea\u52a8\u6253\u5370\u65e5\u5fd7; env.sh \u65b0\u589e\u88c1\u526a\u4f9d\u8d56\u7684\u65b9\u6848\uff1b fix \u4fee\u590d Jenkins \u73af\u5883\u4e0b\uff0c apps \u76ee\u5f55\u4e0b\u5b50\u9879\u76ee\u5b58\u5728 auotest_deepin_xxx@tmp \u76ee\u5f55\uff0c\u5728\u4f20\u5165 app_name \u540e\u65e0\u6cd5\u6267\u884c\u7528\u4f8b\u7684\u95ee\u9898\uff1b \u4fee\u590d\u81ea\u52a8\u751f\u6210 case_list.csv \u6587\u4ef6\u65f6\uff0c\u7528\u4f8b\u987a\u5e8f\u88ab\u8c03\u6574\u7684\u95ee\u9898\uff1b env.sh \u73af\u5883\u5b89\u88c5\u79fb\u9664 git \u548c curl\uff1b \u4fee\u590d\u7528\u4f8b\u5728 setup \u9636\u6bb5\u62a5\u9519\u540e\uff0c\u672a\u5199\u5165 ci_result.json \u7684\u95ee\u9898\uff1b \u79fb\u9664 uos_ci.py\uff1b "},{"location":"RELEASE/#11320221028","title":"1.1.3\uff082022/10/28\uff09","text":"new \u65b0\u589e\u56fe\u50cf\u65ad\u8a00\u6210\u529f\u8f93\u51fa\u5339\u914d\u5ea6\uff1b \u65b0\u589e\u73af\u5883\u5b89\u88c5 yaml \u4f9d\u8d56\uff1b \u65b0\u589e\u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6570\u636e\u56de\u586b\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b \u65b0\u589e\u6d4b\u8bd5\u7ed3\u679c\u8868\u60c5\u663e\u793a\uff0c\u5e76\u4f18\u5316\u4e86\u65e5\u5fd7\u7684\u6392\u7248\uff1b \u65b0\u589e --top {number} \u7528\u4e8e\u8bb0\u5f55\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0c\u65e5\u5fd7\u751f\u6210\u5230 report/logs/top.log\uff1b fix \u4fee\u590d\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4f46\u7ec8\u7aef\u6ca1\u6709\u9519\u8bef\u65e5\u5fd7\u8f93\u51fa\u7684\u95ee\u9898\uff1b \u4fee\u6539\u5931\u8d25\u7528\u4f8b\u56de\u6eaf\u65e5\u5fd7\u4e3a\u8be6\u7ec6\u7ea7\u522b\uff1b \u4fee\u590d\u4e86\u6267\u884c\u8fdb\u5ea6\u672a\u8ba1\u7b97\u8df3\u8fc7\u7528\u4f8b\u7684\u95ee\u9898\uff0c\u5e76\u4f18\u5316\u4e86\u8fdb\u5ea6\u83b7\u53d6\u7684\u7b97\u6cd5\uff1b \u4fee\u590d env.sh \u5728 V23 \u73af\u5883\u4e0b\u5b89\u88c5\u65e0\u6cd5\u8bfb\u53d6\u5bc6\u7801\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 pms \u6d4b\u8bd5\u5957\u6267\u884c\u6216\u6d4b\u8bd5\u5355\u6267\u884c\u65f6\uff0c\u7528\u4f8bID\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b env.sh \u91cc\u9762 hub.deepin.com \u66f4\u6362\u6210 it.uniontech.com\uff1b uos_ci.py \u6d4b\u8bd5\u7ed3\u679c\u7edf\u8ba1\u65f6\uff0c\u603b\u6570\u5254\u9664 skip \u7684\u6570\u91cf "},{"location":"RELEASE/#11220220921","title":"1.1.2\uff082022/09/21\uff09","text":"new \u5728\u6ca1\u6709\u5b89\u88c5 dogtail \u7684\u60c5\u51b5\u4e0b\uff0c\u4e5f\u80fd\u4f7f\u7528 sniff \u5de5\u5177\uff1b fix \u4fee\u590d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e2d\u6ca1\u6709\u5b89\u88c5 AT \u73af\u5883\u6267\u884c uos_ci.py \u62a5\u9519\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11120220919","title":"1.1.1\uff082022/09/19\uff09","text":"new \u65b0\u589e\u6267\u884c\u8fdb\u5ea6\u663e\u793a\uff0c\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u65f6\u65e5\u5fd7\u8f93\u51fa\u5f53\u524d\u8fdb\u5ea6\uff1a[\u5f53\u524d\u6307\u5b9a\u7b2c\u51e0\u6761/\u7528\u4f8b\u603b\u6570]\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u7528\u4f8b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\u6240\u6709\u5931\u8d25\u7528\u4f8b\u7684\u5217\u8868\uff1b \u5173\u95ed\u7ec8\u7aef\u8f93\u51fa\u6355\u83b7\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u65e5\u5fd7\u5feb\u7167\uff1b \u4f18\u5316\u7ec8\u7aef\u8f93\u51fa\u5931\u8d25\u4fe1\u606f\u5197\u957f\u4e3a\u7b80\u8981\u4fe1\u606f\u8f93\u51fa\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u663e\u793a 10 \u4e2a\u6267\u884c\u6700\u6162\u7684\u7528\u4f8b\u5217\u8868\uff0c\u5e76\u8be6\u7ec6\u5217\u51fa\u5404\u4e2a\u9636\u6bb5\u7684\u8017\u65f6\uff1b \u5931\u8d25\u91cd\u8dd1\u7528\u4f8b\u91cd\u8dd1\u4e4b\u524d\u5ef6\u8fdf 1 \u79d2\uff1b \u65b0\u589e\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4ecd\u7136\u5f3a\u5236\u6267\u884c\uff1b \u7528\u4f8b\u6536\u96c6\u65f6\u4ec5\u5728 apps \u76ee\u5f55\u4e0b\u8fdb\u884c\uff0c\u5ffd\u7565 src,setting,public \u76ee\u5f55\uff1b \u65b0\u589e allure \u62a5\u544a\u5907\u4efd\u529f\u80fd\uff0c\u9ed8\u8ba4\u5907\u4efd\u81f3 allure_back \u76ee\u5f55\u4e0b\uff1b manage.py\u65b0\u589e\u53c2\u6570 --lastfailed \u7528\u4e8e\u53ea\u8dd1\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\u7684\u529f\u80fd\uff1b fix \u4fee\u590d\u4e86\u5728\u6ca1\u6709\u6307\u5b9a\u5e94\u7528\u540d\u79f0\u6267\u884c\u65f6\uff0cxml \u62a5\u544a\u751f\u6210\u8def\u5f84\u5f02\u5e38\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 uos_ci.py \u4f20\u5165 timeout \u548c session_timeout \u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11020220916","title":"1.1.0\uff082022/09/16\uff09","text":"new \u65b0\u589ePMS\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u652f\u6301\u591a\u79cd\u6570\u636e\u56de\u586b\u6a21\u5f0f\uff1b \u4f18\u5316\u4e86\u901a\u8fc7\u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u65f6PMS \u722c\u866b\u7684\u6027\u80fd\uff1b \u65b0\u589e .gitmodules \u6587\u4ef6\uff0c\u7528\u4e8e\u6807\u8bb0\u6240\u6709\u5b50\u9879\u76ee\uff0c\u65b9\u4fbf\u7edf\u4e00\u62c9\u53d6\u4ee3\u7801\uff1b env.sh \u9002\u914d\u793e\u533a\u7248\u4e0a\u5b89\u88c5\u81ea\u52a8\u5316\u73af\u5883\uff1b \u589e\u52a0\u6267\u884c\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u9519\u8bef\u7684\u529f\u80fd\uff1b README.md \u589e\u52a0 Wayland \u4e0b\u4f7f\u7528\u3001\u6d4b\u8bd5\u62a5\u544a\u67e5\u770b\u3001\u5e38\u89c1\u95ee\u9898\u7b49\u7684\u6587\u6863\u8bf4\u660e\uff1b \u589e\u52a0\u4e86\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u5bf9 setup\u3001call\u3001teardown \u8fdb\u884c\u65e5\u5fd7\u5206\u6bb5\uff1b fix \u4fee\u590d\u4e86 \u786e\u8ba4\u4fee\u590d \u5217\u6ca1\u5199\u8868\u5934\uff0c\u4f46\u5199\u4e86 fixed-xxx \u6807\u7b7e\uff0c\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u540c\u4e00\u5e94\u7528\u5185\u591a\u4e2a csv \u6587\u4ef6\u4e2d \u786e\u8ba4\u4fee\u590d \u5217\u6709\u7684\u5199\u4e86\uff0c\u6709\u7684\u6ca1\u5199\uff0c\u53ef\u80fd\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 INFO \u65e5\u5fd7\uff0c\u663e\u793a\u4e3a DEBUG \u7684\u95ee\u9898\uff1b\u4fee\u590d\u4e86\u90e8\u5206\u673a\u5668\u4e0a INFO \u65e5\u5fd7\u5185\u5bb9\u663e\u793a\u4e3a\u7ea2\u8272\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\u770b\u4e0d\u5230\u8be6\u7ec6\u4fe1\u606f\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10220220822","title":"1.0.2\uff082022/08/22\uff09","text":"new \u79fb\u9664 loguru\uff0c\u66ff\u6362\u4e3a logging\uff0c\u63a5\u53e3\u4fdd\u6301\u4e0d\u53d8\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u53d7\u5f71\u54cd\uff1b \u9ed8\u8ba4\u5f00\u542f coredump\uff1b fix \u4fee\u590d\u4e86\u4e09\u65b9\u5e93 loguru \u5076\u73b0\u5f02\u5e38\uff0c\u5bfc\u81f4\u7a0b\u5e8f\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7b2c\u4e00\u6b21\u5931\u8d25\u4e0d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10120220812","title":"1.0.1\uff082022/08/12\uff09","text":"new \u65b0\u589e RELEASE.md \u6587\u4ef6\uff0c\u7528\u4e8e\u8bb0\u5f55\u5386\u53f2\u53d1\u5e03\u7248\u672c\u7684\u66f4\u65b0\u5185\u5bb9\uff1b \u517c\u5bb9 Wayland \u6a21\u5f0f\u4e0b\u6267\u884c\u7528\u4f8b\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u7528\u7ba1\u5f53\u524d\u6d4b\u8bd5\u673a\u6267\u884c\u73af\u5883\uff0c\u6846\u67b6\u4f1a\u81ea\u52a8\u6839\u636e\u5f53\u524d\u73af\u5883\u8d70\u4e0d\u540c\u7684\u4ee3\u7801\u903b\u8f91\uff1b \u7531\u4e8e\u9700\u8981\u4fee\u6539 dogtail \u6e90\u4ee3\u7801\uff0c\u56e0\u6b64\u5c06\u4fee\u6539\u540e\u7684\u6e90\u7801\u653e\u5165\u5230\u6838\u5fc3\u5e93\u91cc\u9762 src/depends/dogtail \u540e\u7eed\u7248\u672c\u5c06\u4e0d\u9700\u8981\u5728\u7cfb\u7edf\u4e2d\u5b89\u88c5dogtail\uff1b \u5982\u679c\u5e94\u7528\u5e93\u540c\u6837\u4f7f\u7528\u4e86\u7cfb\u7edf\u5b89\u88c5\u7684 dogtail \u53ef\u80fd\u4f1a\u62a5\u9519\uff0c\u89e3\u51b3\u65b9\u6848\u662f\u5c06\u4ee3\u7801\u4e2d\u7684 import dogtail \u4fee\u6539\u4e3a from src.depends import dogtail ; fix \u91cd\u8dd1\u5931\u8d25\u4e4b\u540e\u624d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff0c\u4fee\u6539\u4e3a\u5931\u8d25\u4e4b\u540e\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":"# Attribution \uff1achengdu Test Team\n# Date \uff1a2021/08/20\n \u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d \u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d \u4ed3\u5e93\u5730\u5740\uff1ahttps://gitlabcd.uniontech.com/autotest/cd-desktop-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u65b9\u6848\u6982\u8ff0","text":"\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u667a\u80fd\u8bc6\u522b\u5e94\u7528\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u7528\u4e8e\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u64cd\u4f5c\u8fc7\u7a0b\u4e2d\u7684\u5143\u7d20\u5b9a\u4f4d\u4ee5\u53ca\u5224\u65ad\u7ed3\u679c\u65f6\u7684\u65ad\u8a00\u5904\u7406\uff1b\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\uff0c\u6d4b\u8bd5\u673a\u4e0a\u7684\u753b\u9762\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u5230\u670d\u52a1\u5668\u4e0a\uff0c\u670d\u52a1\u5668\u5bf9\u89c6\u9891\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\u540e\uff0c\u670d\u52a1\u5668\u667a\u80fd\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\u6210\u529f\uff0c\u7136\u540e\u5bf9\u6d4b\u8bd5\u673a\u4e0b\u53d1\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\uff0c\u6d4b\u8bd5\u673a\u63a5\u53d7\u5e76\u6267\u884c\u4e0b\u4e00\u6b65\u64cd\u4f5c\u3002 \u670d\u52a1\u5668\u4e0e\u6d4b\u8bd5\u673a\u4e4b\u95f4\u7684\u94fe\u63a5\uff1a \u670d\u52a1\u5668\u901a\u8fc7 USB \u4e32\u53e3\u8bbe\u5907\uff08USB-HID \u534f\u8bae\uff09\u6a21\u62df\u9f20\u6807\u952e\u76d8\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u64cd\u4f5c\u3002 \u901a\u8fc7\u89c6\u9891\u91c7\u96c6\u8bbe\u5907\u6355\u83b7\u6d4b\u8bd5\u673a\u7684\u5b9e\u65f6\u753b\u9762\u4f20\u8f93\u7ed9\u670d\u52a1\u5668\u3002 \u670d\u52a1\u5668\u5bf9\u91c7\u96c6\u7684\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\uff0c\u8bc6\u522b\u5176\u4e2d\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5e76\u8fd4\u56de\u5143\u7d20\u63a7\u4ef6\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\uff0c\u670d\u52a1\u5668\u901a\u8fc7\u667a\u80fd\u5316\u5206\u6790\uff0c\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e00\u81f4\u5c06\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\u901a\u8fc7\u4e32\u53e3\u6a21\u62df\u952e\u9f20\u4fe1\u53f7\u53d1\u9001\u7ed9\u6d4b\u8bd5\u673a\uff1b\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e0d\u4e00\u81f4\u5c06\u4f1a\u8fdb\u5165\u4e2d\u65ad\u5904\u7406\u53ca\u5f02\u5e38\u7ed3\u679c\u8f93\u51fa\uff0c\u7ee7\u7eed\u6267\u884c\u540e\u7eed\u573a\u666f\uff0c\u76f4\u81f3\u6240\u6709\u7528\u4f8b\u6d4b\u8bd5\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u6df1\u5ea6\u5b66\u4e60\u73af\u5883\u642d\u5efa","text":"\u6a21\u578b\u8bad\u7ec3\u4e3b\u8981\u5bf9 GPU \u6709\u8981\u6c42\uff0c\u8bad\u7ec3\u6a21\u578b\u7684\u673a\u5668\u663e\u5b58\u4e0d\u4f4e\u4e8e 6G\uff0c\u5176\u4ed6\u914d\u7f6e\u65e0\u7279\u6b8a\u8981\u6c42\u3002 \u63a8\u8350\u6027\u4ef7\u6bd4\u8f83\u9ad8\u914d\u7f6e \u64cd\u4f5c\u7cfb\u7edf: UnionTech OS Desktop 20 Professional Linux version 4.19.0-desktop-amd64 (deepin@deepin-PC) (Uos 8.3.0.3-3+rebuild) \u5904\u7406\u5668: Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz (\u516b\u6838 / \u5341\u516d\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460M-HDV(RD)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))/8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: TU116 [GeForce GTX 1660]\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u865a\u62df\u73af\u5883\u5b89\u88c5","text":"cd ~\nwget -c https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh\nbash Miniconda3-latest-Linux-x86_64.sh\n \u4e00\u8def\u56de\u8f66 \u7b2c\u4e00\u6b21\u63d0\u793a\u8f93\u5165 yes/no \uff1a\u8f93\u5165 yes \u7ee7\u7eed\u4e00\u8def\u56de\u8f66 \u7b2c\u4e8c\u6b21\u63d0\u793a\uff1a\u8f93\u5165 no cd ~/miniconda3/bin\nsudo chmod 777 activate\n \u6fc0\u6d3bconda\u73af\u5883 . ./activate\n \u6dfb\u52a0\u516c\u53f8\u5185\u7f51\u6e90 conda config --add channels bioconda\nconda config --add channels conda-forge\n \u5982\u679c\u662f\u5916\u7f51\u6dfb\u52a0\u5916\u7f51\u6e90 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/\n \u5982\u679c\u8981\u5220\u9664\u6e90 conda config --remove-key channels\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"2\u3001\u5b89\u88c5\u4f9d\u8d56","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u521b\u5efa\u865a\u62df\u73af\u5883","text":"conda remove --name mmlab --all # \u79fb\u9664\u6240\u6709\u865a\u62df\u73af\u5883\n conda create -n mmlab python=3.7\n conda activate mmlab\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-pytorch","title":"\uff082\uff09\u5b89\u88c5 Pytorch","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install torch==1.7.0+cu101 torchvision==0.8.1+cu101 torchaudio==0.7.0 -f https://download.pytorch.org/whl/torch_stable.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-mmcv","title":"\uff083\uff09\u5b89\u88c5 MMCV","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install mmcv-full==1.3.3 -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.7.0/index.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"\uff084\uff09\u5b89\u88c5\u663e\u5361\u9a71\u52a8","text":"\u6839\u636e\u4f60\u7684\u663e\u5361\u4e0b\u8f7d\u5bf9\u5e94\u9a71\u52a8\uff0c\u6bd4\u5982\u6211\u7684\u663e\u5361\u4e3a GTX1660\uff0c\u9a71\u52a8\u7248\u672c\u4e3a 430\uff0c\u9a71\u52a8\u4e0b\u8f7d\u5730\u5740\uff1ahttps://www.nvidia.cn/Download/Find.aspx?lang=cn CTRL+ALT+F2 \u8fdb\u5165tty\n \u7981\u7528 nouveau \u9a71\u52a8 sudo vim /etc/modprobe.d/blacklist-nouveau.conf\n \u586b\u5165\uff1a blacklist nouveau options nouveau modeset=0\n \u5237\u65b0\u914d\u7f6e\u6587\u4ef6 sudo update-initramfs -u reboot \u91cd\u542f\u540e\u518d\u8fdb\u5165 tty \u5173\u95ed\u56fe\u50cf\u754c\u9762\uff0c\u8f93\u5165\u547d\u4ee4\u5173\u95ed\u56fe\u50cf\u754c\u9762 sudo service lightdm stop\n \u5b89\u88c5\u9a71\u52a8 sudo chmod a+x NVIDIA-Linux-x86_64-430.run\nsudo ./NVIDIA-Linux-x86_64-430.run\n reboot\u91cd\u542f\uff0cnvidia-smi\u67e5\u770b\u5b89\u88c5\u72b6\u6001\u3002\u6ce8\u610f\u770b\u4e0bcuda\u7248\u672c\uff0c10.1\uff0cdriver\u7248\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u6570\u636e\u6807\u6ce8","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u6570\u636e\u6807\u6ce8","text":"\u6807\u6ce8\u4e4b\u524d\u9700\u8981\u5148\u8f6c\u6362\u56fe\u7247\u5927\u5c0f\uff0c\u5e76\u4e14\u4ee5\u6570\u5b57\u547d\u540d\uff0c\u6bcf\u7ec4\u547d\u540d\u9012\u589e"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"\uff081\uff09\u8f6c\u6362\u5927\u5c0f\u5e76\u91cd\u547d\u540d","text":"rename_pic.py import os\nimport sys\nimport cv2\nimport time\nimport getpass\nusername = getpass.getuser()\nsource_path = f\"/home/{username}/Desktop/right_menu\" # \u56fe\u7247\u8def\u5f84\nsource_dest = os.path.join('/'.join(source_path.split(\"/\")[:-1]), 'tmp')\nif not os.path.exists(source_dest):\nos.mkdir(source_dest)\nstart_name = sys.argv[1]\nfile_name_list = list()\nfor file in os.listdir(source_path):\nif file.endswith('.png'):\nfile_name_list.append(file)\nstart_name = int(start_name)\nfor file in file_name_list:\nos.rename(os.path.join(source_path,file), os.path.join(source_path, f\"{str(start_name)}.png\"))\nstart_name += 1\ntime.sleep(1)\nfor file in os.listdir(source_path):\nimage = os.path.join(source_path, str(file))\nsrc = cv2.imread(image)\nresult = cv2.resize(src, (960, 540))\nresizeImage = os.path.join(source_dest, str(file))\nprint(resizeImage)\ncv2.imwrite(str(resizeImage), result)\ncv2.waitKey(0)\ncv2.destroyAllWindows()\ntime.sleep(1)\nos.system(f'rm -rf {source_path}/*')\nos.system(f'mv {source_dest}/* {source_path}')\nos.system(f'rm -rf {source_dest}')\nprint(\"\u4e0b\u4e00\u4e2a\u5e8f\u53f7\uff1a\", start_name)\n \u6839\u636e\u7ec8\u7aef\u8f93\u51fa\u7684\u4e0b\u4e00\u4e2a\u5e8f\u53f7\u7684\u63d0\u793a\uff0c\u6267\u884c Python \u6587\u4ef6\u7684\u65f6\u5019\u4f20\u53c2\u3002 python rename_pic.py 249\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"\uff082\uff09\u5de5\u5177\u6807\u6ce8","text":"\u4f7f\u7528\u5de5\u5177 labelImg \u6807\u6ce8 sudo pip3 install PyQt5==5.13\nsudo pip3 install labelImg\n \u7ec8\u7aef\u76f4\u63a5\u8f93\u5165 labelImg\uff0c\u56de\u8f66 \u6807\u6ce8\u6a21\u5f0f\u9009\u62e9\uff1aPascalVOC"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u667a\u80fd\u6807\u6ce8","text":"\u6253\u5f00\u5c4f\u5e55\u5f55\u5236\u8f6f\u4ef6\uff0c\u5f55\u5236\u624b\u52a8\u64cd\u4f5c\u4e00\u6b21\u6d4b\u8bd5\u7528\u4f8b\uff0c\u7136\u540e\u5c06\u5f55\u5236\u7684\u89c6\u9891\u8fdb\u884c\u5206\u5e27\uff0c\u7136\u540e\u5bf9\u6bd4\u524d\u4e24\u5e27\u56fe\u6807\u76f8\u4f3c\u5ea6\uff0c\u5254\u9664\u76f8\u4f3c\u5ea6\u8fc7\u9ad8\u7684\u56fe\u7247\uff0c\u5728\u4fdd\u8bc1\u7d20\u6750\u591a\u6837\u6027\u7684\u524d\u63d0\u4e0b\uff0c\u5254\u9664\u91cd\u590d\u591a\u4f59\u7684\u56fe\u7247\u751f\u6210\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u96c6\uff0c\u7136\u540e\u53d6\u51fa\u63a7\u4ef6\u6a21\u677f\u6570\u636e\u96c6\uff0c\u901a\u8fc7 OpenCV \u6a21\u677f\u5339\u914d\u83b7\u53d6\u63a7\u4ef6\u5728\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u56fe\u7247\u4e2d\u6240\u5728\u7684\u5de6\u4e0a\u3001\u5de6\u4e0b\u3001\u53f3\u4e0a\u3001\u53f3\u4e0b\u56db\u5904\u5750\u6807\uff0c\u4ece\u800c\u6839\u636e\u6a21\u677f\u6570\u636e\u96c6\u751f\u6210\u6807\u6ce8\u6570\u636e\u3002\u53c2\u8003\u76ee\u5f55 AnnotationMaterial"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"\uff081\uff09\u6a21\u677f\u6570\u636e\u96c6\u51c6\u5907","text":"1\u3001\u5728\u754c\u9762\u622a\u53d6\u9700\u8981\u6807\u6ce8\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u653e\u5728\u76ee\u5f55\u4e0b AnnotationMaterial/template/img 2\u3001\u7ef4\u62a4\u63a7\u4ef6\u540d\u4e0e\u5143\u7d20\u63a7\u4ef6\u7684\u952e\u5bf9\uff0c\u4e00\u4e2a\u63a7\u4ef6\u540d\u53ef\u5bf9\u5e94\u591a\u4e2a\u5143\u7d20\u63a7\u4ef6 menu:\n- menu.jpg\n- menu1.jpg\n- menu2.jpg\n- menu3.jpg\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"\uff082\uff09\u7d20\u6750\u96c6\u51c6\u5907","text":"\u5f55\u5236\u89c6\u9891\u6216\u6216\u5c4f\u5e55\u622a\u56fe\u653e\u7f6e\u76ee\u5f55 AnnotationMaterial/source"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u5f00\u59cb\u6807\u6ce8","text":"python3 AnnotationMaterial/main.py\n \u751f\u6210\u7684\u6807\u6ce8\u6570\u636e\u5b58\u653e\u5728 AnnotationMaterial/result"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#mmdetection","title":"\u56db\u3001MMDetection","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1-mmdetection","title":"1\u3001 MMDetection \u4ee3\u7801","text":"MMDetection \u662f\u4e00\u4e2a\u6709\u540d\u7684\u6df1\u5ea6\u5b66\u4e60\u76ee\u6807\u68c0\u6d4b\u5f00\u6e90\u9879\u76ee\uff0c\u4e5f\u662f openMMlab \u7684\u62db\u724c\u9879\u76ee\uff0c\u4e3a\u4ec0\u4e48\u9009\u62e9\u5b83\uff0c\u5c0f\u5b69\u513f\u6ca1\u5a18\u8bf4\u6765\u8bdd\u957f\uff0c\u611f\u5174\u8da3\u53ef\u4ee5\u81ea\u884c\u6df1\u5165\u4e86\u89e3\uff1b \u4f60\u53ef\u4ee5\u76f4\u63a5\u5728 GitHub \u4e0a\u514b\u9686\u4ee3\u7801\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u54b1\u4eec\u4ed3\u5e93\u4e0b Train \u76ee\u5f55\u4e2d\u4ee3\u7801\uff0cTrain \u4e2d\u7684\u4ee3\u7801\u4e5f\u662f\u4ece GitHub \u4e0a\u62c9\u53d6\u7684\uff0c\u4e0d\u8fc7\u6211\u4eec\u6839\u636e\u9879\u76ee\u9700\u8981\u505a\u4e86\u4e00\u4e9b\u4e8c\u6b21\u5f00\u53d1\uff0c\u63a8\u8350\u76f4\u63a5\u4f7f\u7528\u5b83\u3002 \u5982\u679c\u4f60\u60f3\u4ece GitHub \u4e0a\u62c9\uff1a git clone https://github.com/open-mmlab/mmdetection.git\n# \u4e0d\u80fd\u76f4\u63a5\u62c9\u53d6\u4e3b\u5206\u652f\uff0c\u5efa\u8bae\u4f7f\u75282.12\u7248\u672c\uff0c\u4e0d\u540c\u7684\u7248\u672c\u5bf9\u5e94\u7684mmcv\u7248\u672c\u662f\u4e0d\u540c\u7684\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-voc2coco","title":"2\u3001\u62c9\u53d6 voc2coco \u4ee3\u7801","text":"git clone https://github.com/Tony607/voc2coco.git\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-coco","title":"3\u3001\u8f6c\u6362 coco \u6570\u636e\u96c6","text":"\u5c06\u6240\u6709\u7684\u56fe\u7247\u548cxml\u6587\u4ef6\u653e\u5165train2017\uff0c\u4ece\u4e2d\u6311\u9009\u51e0\u7ec4\u653e\u5165val2017\uff08\u6d4b\u8bd5\u96c6\uff09 cd mmdetection/data/coco\npython voc2coco.py train2017 annotations/instances_train2017.json\npython voc2coco.py val2017 annotations/instances_val2017.json\n \u751f\u6210json\u6587\u4ef6"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4_1","title":"4\u3001\u4fee\u6539\u914d\u7f6e","text":"\uff081\uff09\u8bfb\u53d6\u6a21\u578b\u540d\u79f0 import json\nmodule_name = []\nwith open('./instances_train2017.json', \"r+\") as f:\njson_file = f.read()\njson_dict = json.loads(json_file)\nmodule_list = json_dict.get('categories')\nfor module_info in module_list:\nname = module_info.get('name')\nmodule_name.append(name)\nprint(module_name)\nprint(\"module_num:\", len(module_name))\n # \u6ce8\u610f\u5bf9\u6bd4instances_train2017.json\u91cc\u9762\u6a21\u578b\u540d\u79f0\u7684\u987a\u5e8f\uff0c\u4e0eCLASSES\u548ccoco_classes\u91cc\u9762\u7684\u987a\u5e8f\u4fdd\u6301\u4e00\u81f4\u3002\n \uff082\uff09\u4fee\u6539 faster_rcnn_r101_2x_coco.py mmdetection/xianjin/faster_rcnn_r101_2x_coco.py \u4fee\u653946\u884c\uff0cnum_clasess\u7684\u503c\uff0c\u65b0\u589e1\u4e2a\uff0c\u5c31 +1\uff1b \uff083\uff09\u4fee\u6539 coco.py mmdetection/mmdet/datasets/coco.py CLASSES = ()\uff0c\u5728\u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b \uff084\uff09\u4fee\u6539 class_names.py mmdetection/mmdet/core/evaluation/class_names.py coco_classes \u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#5","title":"5\u3001\u7f13\u5b58\u6e05\u7406","text":"\u5220\u9664 mmdetection/build \u76ee\u5f55 python setup.py install\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#6","title":"6\u3001\u8bad\u7ec3\u6a21\u578b","text":"\uff081\uff09\u6307\u5b9a\u81ea\u5df1\u914d\u7f6e\u7684\u8bad\u7ec3\u6a21\u578b\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py --gpus 1\n \uff082\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u6d4b\u8bd5\u96c6\u7ed3\u679c\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py xianjin/epoch_24.pth --show\n \uff083\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u51c6\u786e\u5ea6\uff1b python tools/analysis_tools/analyze_logs.py plot_curve xianjin/20210530_011907.log.json --keys acc\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#7","title":"7\u3001\u5feb\u6377\u64cd\u4f5c","text":"python3 run.py\n \u5c06\u4ee5\u4e0a 4 - 7 \u6b65\u64cd\u4f5c\u6574\u5408\u6210 run.py\uff0c\u4e00\u952e\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u4e94\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\uff1b \u670d\u52a1\u7aef\u4e00\u53f0\uff08\u76ee\u524d\u4ec5\u652f\u6301AMD\u67b6\u6784\uff09\uff1b \u91c7\u96c6\u76d2\u4e00\u4e2a \uff08ACASIS hdmi\u89c6\u9891\u91c7\u96c6\u5361\uff0chttps://item.jd.com/10024310742602.html \uff09\uff1b USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\uff1b USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff1b \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5USB\u5ef6\u957f\u7ebf\uff1b \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u63a8\u8350\u914d\u7f6e","text":"\u6267\u884c\u7528\u4f8b\u7684\u670d\u52a1\u7aef\u5bf9\u914d\u7f6e\u6ca1\u6709\u7279\u6b8a\u8981\u6c42\uff0c\u5982\u679c\u6761\u4ef6\u5141\u8bb8\u914d\u7f6e\u8d8a\u9ad8\uff0c\u8bc6\u522b\u901f\u5ea6\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n \u6d4b\u8bd5\u673a\u4e0a\u4e0d\u6267\u884c\u4efb\u4f55\u811a\u672c\uff0c\u5177\u4f53\u914d\u7f6e\u6839\u636e\u6d4b\u8bd5\u9700\u8981\u51b3\u5b9a\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#usb_mk","title":"\u516d\u3001USB_MK\u4e32\u53e3\u9a71\u52a8\u65b9\u6cd5","text":"\u4f4d\u4e8econtrol_method\u76ee\u5f55\u4e0b\u7684usb_mk.py\u6587\u4ef6 \uff081\uff09\u5217\u51fa\u53ef\u901a\u4fe1\u7684\u7aef\u53e3 python3 -m serial.tools.list_ports -v\n \uff082\uff09\u4fee\u6539\u4e32\u53e3\u7684\u6743\u9650 sudo chmod 777 /dev/ttyACM0\n \uff083\uff09\u5b9e\u4f8b\u5316USB_MK import UsbMk\nusb_mk = UsbMk(\"/dev/ttyACM0\", 9600) # \u8bbe\u5907\u9ed8\u8ba49600\u4e3a\u6ce2\u7279\u7387\uff0c\u63a7\u5236\u4f20\u8f93\u901f\u7387\n \uff084\uff09USB\u4e32\u53e3\u8bbe\u5907\u9ed8\u8ba4\u6ce2\u7279\u7387\u4e3a9600\uff08\u7ecf\u6d4b\u8bd5\u6ce2\u7279\u73879600\u51c6\u786e\u6027\u6700\u597d\uff09\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up() # \u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u6c49\u5b57\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e\n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff083\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff084\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff085\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() # \u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2\n \uff086\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff087\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff088\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e03\u3001\u65b9\u6cd5\u8c03\u7528\u5165\u53c2\u89c4\u5219","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_7","title":"1\u3001\u57fa\u7c7b","text":"class Base:\ndef __init__(self):\nself._obj = image\nself._usb = usb_mk\ndef find_element_by_ai(self, element):\nreturn self._obj.find_element(element)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_6","title":"2\u3001\u5165\u53c2\u8bf4\u660e","text":"\u56fe\u50cf\u8bc6\u522b\u65b9\u6cd5\u5165\u53e3\u4e3a Base \u7c7b\u4e0b\u7684 find_element_by_ai \u3002\u4ec5\u63a5\u53d7\u4e00\u4e2a\u53c2\u6570 element\uff0c\u7c7b\u578b\u4e3a string\u3002 \u53ef\u8bc6\u522b\u7684 string \u683c\u5f0f\uff1a \uff081\uff09\u5927\u56fe\u6807\uff08 \u56fe\u6807\u5927\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\uff0c\u4f8b\uff1a Base().find_element_by_ai(\"window\")\n \uff082\uff09\u5927\u56fe\u6807 / \u5c0f\u56fe\u6807\uff08\u56fe\u6807\u5c0f\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5c0f\u56fe\u6807\uff0c\u4f8b\uff1awindow/search_btn Base().find_element_by_ai(\"window/search_btn\")\n \uff083\uff09\u5927\u56fe\u6807 / OCR\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\u5185\u7684\u6587\u5b57\uff0c\u4f8b\uff1amenu/\u5c5e\u6027 Base().find_element_by_ai(\"menu/\u5c5e\u6027\")\n \uff084\uff09OCR\uff1a\u5168\u5c4f\u8bc6\u522b\u6587\u5b57 Base().find_element_by_ai(\"\u641c\u7d22\")\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516b\u3001\u9690\u85cf\u9f20\u6807","text":"\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u8fc7\u6765\u7684\u89c6\u9891\u6d41\uff0c\u5728\u8bc6\u522b\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u53d7\u5230\u9f20\u6807\u5f71\u54cd\uff0c\u56e0\u6b64\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u9690\u85cf\u9f20\u6807\u3002 \u5c4f\u853d\u9f20\u6807\u5149\u6807\u663e\u793a ```shell script /etc/lightdm/lightdm.conf \u5728`[Seat:*]`\u4e0b\u9762\u6dfb\u52a0\u53c2\u6570\n```shell script\nxserver-command=X -bs -core -nocursor\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e5d\u3001\u667a\u80fd\u81ea\u52a8\u5316\u7684\u610f\u4e49","text":"1\u3001\u6539\u5584 Acessibility \u5b9a\u4f4d\u7684\u7a33\u5b9a\u6027\u95ee\u9898 Acessibility \u5c5e\u6027\u5b9a\u4f4d\u5b58\u5728\u5076\u5c14\u5931\u6548\u7684\u60c5\u51b5 \uff081\uff09\u5f00\u53d1\u5728\u505a\u65b0\u9700\u6c42\u5f00\u53d1\u65f6\u53ef\u80fd\u6d89\u53ca\u5230\u5bf9\u5c5e\u6027\u6807\u7b7e\u7684\u4fee\u6539\u6216\u8005\u5c42\u7ea7\u7684\u8c03\u6574\uff0c\u53ef\u80fd\u9020\u6210\u81ea\u52a8\u5316\u7528\u4f8b\u65e0\u6cd5\u5b9a\u4f4d\u5230\u5143\u7d20\u3002 \u6bd4\u59821040\u9636\u6bb5\uff0c\u97f3\u4e50\u91cd\u6784\u7684\u65f6\u5019\uff0c\u5f00\u53d1\u5bf9\u90e8\u5206\u5c5e\u6027\u548c\u5c42\u7ea7\u505a\u4e86\u4fee\u6539\uff0c\u5bfc\u81f4\u81ea\u52a8\u5316\u7528\u4f8b\u5b9a\u4f4d\u65b9\u6cd580%\u9700\u8981\u4fee\u6539\u3002 \u5f00\u53d1\u65b0\u529f\u80fd\u7684\u65f6\u5019\u5076\u5c14\u4e5f\u4f1a\u5bf9\u5c5e\u6027\u505a\u8c03\u6574\uff0c\u9047\u52305\u6b21\u3002 \uff082\uff09\u76ee\u524d\u4e3b\u8981\u4f7f\u7528Dogtail\u8bc6\u522b\u5e94\u7528Acessibility\u5c5e\u6027\u8fdb\u884c\u5b9a\u4f4d\uff0c\u662f\u83b7\u53d6\u5e94\u7528\u5f53\u524d\u754c\u9762\u7684\u5c5e\u6027tree\uff0c\u5728\u5e94\u7528\u8df3\u8f6c\u540e\uff0cDogtail\u5b58\u5728\u65e0\u6cd5\u53ca\u65f6\u83b7\u53d6\u5f53\u524d\u5c5e\u6027\u5217\u8868\u7684\u60c5\u51b5\u3002 \u591a\u5a92\u4f53\u8c03\u7528\u6587\u7ba1\u7a97\u53e3\u7684\u65f6\u5019\uff0c\u51fa\u73b0\u627e\u4e0d\u5230\u6587\u7ba1\u91cc\u9762\u5143\u7d20\u7684\u60c5\u51b5\uff0c\u76ee\u524d\u51fa\u73b010+\u6b21\u3002 \u5e94\u7528\u8bbe\u7f6e\u9875\u9762\u7684\u5c5e\u6027\u5076\u5c14\u5b58\u5728\u627e\u4e0d\u5230\u7684\u60c5\u51b5\uff0c\u9047\u52305\u6b21\u3002 \uff083\uff09Dogtail\u5de5\u5177\u672c\u8eab\u5b58\u5728\u95ee\u9898\uff0c\u6709\u65f6\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u5019\u5f88\u6162\uff0c\u8ba9\u4eba\u65e0\u6cd5\u63a5\u53d7\uff0c\u76ee\u524d\u51fa\u73b0\u8fc7\u5f88\u591a\u6b21\u3002 \u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u95f4\u6bd4\u5e73\u5e38\u61623\u500d\uff0c\u51fa\u73b04\u6b21\u3002 2\u3001\u89e3\u51b3\u4e86\u4f7f\u7528\u7edd\u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898 \u90e8\u5206\u63a7\u4ef6\u65e0\u6cd5\u6dfb\u52a0 Acessibility \u5c5e\u6027\u4ece\u800c\u4f7f\u7528\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u51fa\u73b0\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898\u3002 \uff081\uff09\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u65b9\u6cd5\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u76ee\u6807\u56fe\u7247\u8d44\u6e90\uff0c\u5728 UI \u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u4f1a\u6d89\u53ca\u5230\u76ee\u6807\u8d44\u6e90\u7684\u66ff\u6362\uff0c\u6bd4\u8f83\u8017\u8d39\u4eba\u529b\u3002 \uff082\uff09\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6cd5\u5bf9\u6bd4\u7cbe\u5ea6\u6bd4\u8f83\u641e\uff0c\u5982\u679cUI \u7684\u53d8\u66f4\u4f1a\u9020\u6210\u65e0\u6cd5\u51c6\u786e\u5b9a\u4f4d\u5230\uff0c\u81ea\u52a8\u5316\u811a\u672c\u5065\u58ee\u6027\u4e0d\u8db3\u3002 3\u3001\u4f7f\u7528\u673a\u5668\u5206\u79bb\uff0c\u89e3\u51b3\u4e86\u81ea\u52a8\u5316\u811a\u672c\u5bf9\u5e94\u7528\u7684\u5f71\u54cd\uff0c\u771f\u5b9e\u8fd8\u539f\u7528\u6237\u7684\u4f7f\u7528\u573a\u666f \u673a\u5668\u5206\u79bb\u7684\u67b6\u6784\u8bbe\u8ba1\uff0c\u4fdd\u8bc1\u4e86\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u73af\u5883\u5b8c\u5168\u7b49\u540c\u4e8e\u7528\u6237\uff0c\u6392\u9664\u6d4b\u8bd5\u811a\u672c\u7684\u5f71\u54cd\u3002 \uff081\uff09\u76ee\u524d\u7684\u529f\u80fd\u81ea\u52a8\u5316\u662f\u5728\u6d4b\u8bd5\u673a\u4e0a\u76f4\u63a5\u8fd0\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\uff0c\u52a0\u4e0a\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u6211\u4eec\u6dfb\u52a0\u4e86\u4e00\u4e9b\u8fdb\u7a0b\u76d1\u63a7\u3001\u89c6\u9891\u5f55\u5236\u7b49\u529f\u80fd\uff0c\u81ea\u52a8\u5316\u811a\u672c\u672c\u8eab\u4f1a\u6d88\u8017\u4e00\u4e9b\u7cfb\u7edf\u8d44\u6e90\uff0c\u65e0\u6cd5\u8fd8\u539f\u771f\u662f\u7684\u7528\u6237\u4f7f\u7528\u573a\u666f\u3002 \uff082\uff09\u6027\u80fd\u6d4b\u8bd5\u9700\u8981\u6392\u9664\u5176\u4ed6\u7a0b\u5e8f\u7684\u8d44\u6e90\u6d88\u8017\u5f71\u54cd\uff0c\u6027\u80fd\u81ea\u52a8\u5316\u91c7\u7528\u673a\u5668\u5206\u79bb\uff0c\u4fdd\u8bc1\u4e86\u6027\u80fd\u6570\u636e\u7684\u51c6\u786e\u6027\u3002 \u4ee5\u524d\u7684\u7528\u4f8b\u6267\u884c\u8017\u65f6\u6ca1\u6761\u572830\u79d2\u5de6\u53f3\uff0c\u73b0\u5728\u7528\u4f8b\u8017\u65f6\u572810\u79d2\u3002 4\u3001\u89e3\u51b3\u4e86UI \u8c03\u6574\u5bfc\u81f4\u5b9a\u4f4d\u5931\u8d25\u7684\u4e0d\u7a33\u5b9a\u6027\u95ee\u9898 \uff081\uff09\u89e3\u51b3\u4e86\u56e0 UI \u8c03\u6574\u5bfc\u81f4\u63a7\u4ef6\u4f4d\u7f6e\u53d8\u5316\u6216\u8272\u5dee\u53d8\u5316\u540e\u5b9a\u4f4d\u4e0d\u51c6\u786e\u7684\u95ee\u9898\uff0c\u53ea\u8981\u63a7\u4ef6\u6587\u6848\u548c\u63a7\u4ef6\u5916\u8fb9\u6846\u65e0\u53d8\u5316\u5747\u53ef\u51c6\u786e\u5b9a\u4f4d\uff1b \uff082\uff09\u76ee\u524d\u4e5f\u4f1a\u91c7\u7528\u57fa\u4e8eUI\u7684\u5b9a\u4f4d\u65b9\u6848\uff0c\u5982\u679cUI\u4f4d\u7f6e\u6709\u8c03\u6574\uff0c\u4f1a\u5bfc\u81f4\u5143\u7d20\u65e0\u6cd5\u5b9a\u4f4d\u3002 5\u3001\u7b80\u5316\u4e86\u7528\u4f8b\u7ed3\u6784\uff0c\u63d0\u5347\u7f16\u5199\u53cb\u597d\u5ea6 \uff081\uff09\u667a\u80fd\u81ea\u52a8\u5316\u8bc6\u522b\u5143\u7d20\u7684\u65b9\u6cd5\u53ea\u6709\u4e00\u4e2a\uff0c\u5c31\u662f\u57fa\u4e8e\u6211\u4eec\u8bad\u7ec3\u7684\u6a21\u578b\u8bc6\u522b\u89c6\u9891\u6d41\u4e2d\u7684\u5143\u7d20\uff0c\u7ecf\u8fc7\u811a\u672c\u5c01\u88c5\u4e4b\u540e\uff0c\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u4e2d\u6240\u6709\u5b9a\u4f4d\u7684\u64cd\u4f5c\u90fd\u53ea\u9700\u8981\u8c03\u7528\u8fd9\u4e00\u4e2a\u65b9\u6cd5\u5c31\u884c\u4e86\uff0c\u7f16\u5199\u81ea\u52a8\u5316\u811a\u672c\u7684\u96be\u5ea6\u5927\u5927\u964d\u4f4e\u3002 \uff082\uff09\u4e5f\u662f\u7531\u4e8e\u8c03\u7528\u65b9\u6cd5\u7b80\u5355\uff0c\u5728 UI \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u4e2d\u7684\u5206\u5c42\u7ed3\u6784\u5c06\u4f1a\u51cf\u5c11\uff0c\u591a\u7ee7\u627f\u7684\u60c5\u51b5\u4f1a\u51cf\u5c11\uff0c\u81ea\u52a8\u5316\u4ee3\u7801\u7684\u8c03\u7528\u7ed3\u6784\u4e5f\u4f1a\u53d8\u5f97\u7b80\u5355\uff0c\u800c\u4e14\u529f\u80fd\u6d4b\u8bd5\u540c\u5b66\u7f16\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u66f4\u52a0\u5bb9\u6613\u4e0a\u624b\u3002 \u4ee5\u524d\u5199\u7528\u4f8b\u7531\u4e8e\u9700\u8981\u7ed3\u5408\u4e0d\u540c\u7684\u6a21\u5757\uff0c\u8c03\u7528\u4e0d\u540c\u7684\u65b9\u6cd5\uff0c\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u5e76\u5b8c\u6210\u8c03\u8bd5\u7684\u65f6\u95f4\u5e73\u5747\u572820-30\u5206\u949f\uff0c\u73b0\u5728\u5199\u7528\u4f8b\u811a\u672c\u80fd\u57285\u5206\u949f\u5de6\u53f3\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":"# =============================================\n# Attribution : Application Test Department III\n# Time : 2023/1/3\n# Author : ut003281\n# =============================================\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u7b80\u8ff0","text":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5 \u901a\u8fc7\u81ea\u52a8\u5316\u624b\u6bb5\u5bf9\u5e94\u7528\u8fdb\u884c\u6027\u80fd\u6d4b\u8bd5\uff0c\u63d0\u4f9b\u65b9\u4fbf\u7684\u73af\u5883\u90e8\u7f72\u3001\u8fd0\u884c\u914d\u7f6e\u3001\u7528\u4f8b\u7f16\u5199\u7b49\uff0c\u7528\u4e8e\u684c\u9762\u5e94\u7528\u7684\u51b7\u70ed\u542f\u52a8\u3001\u8d44\u6e90\u62f7\u8d1d\u3001\u9875\u9762\u8df3\u8f6c\u7b49\u6027\u80fd\u573a\u666f\u6d4b\u8bd5\u3002 \u4ed3\u5e93\u5730\u5740\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-perf-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u4ee3\u7801\u7ed3\u6784","text":"autotest-perf-aitest\n\u251c\u2500\u2500 apps # \u5b58\u653e\u6240\u6709\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u811a\u672c\n\u251c\u2500\u2500 conftest.py # pytest hook\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 CURRENT # \u7248\u672c\u5185\u5bb9\n\u251c\u2500\u2500 docs # \u6587\u6863\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u952e\u503c\u5bf9\u7167\u8868.pdf # \u4e32\u53e3\u7ebfcode\u4e0e\u6309\u952e\u7684\u5bf9\u7167\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u6027\u80fd\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\u6267\u884c\u5668\u4f7f\u7528\u6307\u5357.md # \u6267\u884c\u5668\u811a\u672c\u4f7f\u7528\u6307\u5357\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 USB\u4e32\u53e3\u8f6cUSB\u952e\u76d8\u9f20\u6807\u7ebf\u534f\u8bae\u6587\u4ef6V1.0.pdf # \u4e32\u53e3\u534f\u8bae\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput-0.28.2.zip # Linux\u4e0b\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\u7684\u6e90\u7801\uff0c\u53ef\u6839\u636e\u67b6\u6784\u6253\u5305\n\u251c\u2500\u2500 manage.py # \u529f\u80fd\u4e3b\u5165\u53e3\n\u251c\u2500\u2500 pytest.ini # pytst \u914d\u7f6e\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 setting # \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 client.ini # \u6d4b\u8bd5\u673a IP \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5168\u5c40\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dev_env.sh # \u5bbf\u4e3b\u673a\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose_no_relay.yml # \u65e0\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose.yml # \u6709\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker_login.sh # docker \u767b\u9646\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 res\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 black.png # \u5168\u9ed1\u56fe\u7247\uff0c\u7528\u4e8e\u4fee\u6539\u58c1\u7eb8\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_5000.deb # 3A5000 \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_amd64.deb # amd \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_arm64.deb # arm \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_mips64.deb # mips \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_sw_64.deb # sw \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 server.ini # \u670d\u52a1\u5668\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 setup.sh # \u5bb9\u5668\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 template # \u521b\u5efa app \u57fa\u7840\u811a\u672c\u6a21\u677f\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 app_template\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ${app_name}_widget.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 control-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 images\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 test_${app_name}_01_scene.json-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 test_${app_name}_01_scene.py-tpl\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 uos_docker # \u5bb9\u5668\u73af\u5883\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dockerfile\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 requirements.txt\n\u2514\u2500\u2500 src\n \u251c\u2500\u2500 analysis_save.py # \u89e3\u6790\u56fe\u7247\u6d41\u7ed3\u679c\uff0c\u6c47\u603b\u751f\u6210 excel \u62a5\u544a\n\u251c\u2500\u2500 base_widget.py # \u5c01\u88c5\u7684\u57fa\u7840\u64cd\u4f5c\uff0c\u5e94\u7528\u8c03\u7528\u7684\u4e3b\u5165\u53e3\u65b9\u6cd5\n\u251c\u2500\u2500 cmdctl.py # \u8c03\u7528\u547d\u4ee4\u884c\u4f7f\u7528\n\u251c\u2500\u2500 global_value.py # \u5168\u5c40\u53d8\u91cf\n\u251c\u2500\u2500 image_utils.py # \u56fe\u7247\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 __init__.py\n \u251c\u2500\u2500 logger_utils.py # \u65e5\u5fd7\u914d\u7f6e\n\u251c\u2500\u2500 pdocr.py # ocr \u914d\u7f6e\n\u251c\u2500\u2500 public_method.py # \u4e00\u4e9b\u65b9\u4fbf\u7684\u5c01\u4f4f\n\u251c\u2500\u2500 record.py # \u5f55\u5c4f\u76f8\u5173\n\u251c\u2500\u2500 rtk # \u8fd0\u884c\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 _base.py # \u4e00\u4e9b\u679a\u4e3e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 install_env.py # \u5b89\u88c5\u73af\u5883\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 local_runner.py # \u8fd0\u884c\u7528\u4f8b\n\u251c\u2500\u2500 serial_communication # \u4e32\u53e3\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 power_control.py # \u7ee7\u7535\u5668\u64cd\u4f5c\uff0c\u4f7f\u7528\u7ee7\u7535\u5668\u8fde\u63a5\u4e3b\u673a\u7535\u6e90\uff0c\u63a7\u5236\u5f00\u5173\u673a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 serial_common.py # \u4e32\u53e3\u516c\u5171\u65b9\u6cd5\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 usb_mk.py # \u952e\u9f20\u64cd\u4f5c\u57fa\u7840\u5c01\u88c5\n\u251c\u2500\u2500 shortcut_key.py # \u5feb\u6377\u952e\u7684\u5c01\u88c5\n\u251c\u2500\u2500 singleton.py # \u5355\u4f8b\u6a21\u5f0f\n\u251c\u2500\u2500 start_app.py # \u521b\u5efa app\n\u2514\u2500\u2500 write_xlsx.py # \u751f\u6210 excel\n# __init__.py \u6587\u4ef6\u4e3a\u6807\u8bc6\u8be5\u76ee\u5f55\u662f\u4e00\u4e2aPython\u7684\u6a21\u5757\u5305\uff0c\u9879\u76ee\u4e2d\u7684__init__.py\u5747\u4e3a\u7a7a\u6587\u4ef6\u3002\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u73af\u5883\u642d\u5efa","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\u3002 \u670d\u52a1\u7aef\u4e00\u53f0\u3002\uff08\u4ec5\u652f\u6301 AMD \u67b6\u6784\uff0c\u82e5\u9700\u5176\u4ed6\u67b6\u6784\uff0c\u54a8\u8be2\u76f8\u5173\u5f00\u53d1\u4eba\u5458\uff09 \u91c7\u96c6\u76d2\u4e00\u4e2a\u3002 \uff08ACASIS HDMI \u89c6\u9891\u91c7\u96c6\u76d2\uff0chttps://item.jd.com/100013302599.html#crumb-wrap \uff09 USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\u3002\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"\uff082\uff09\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\u3002 USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff08USB3.0 \u63a5\u53e3\u4e0a\uff09\u3002 \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5 USB \u5ef6\u957f\u7ebf\u3002 \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u670d\u52a1\u7aef\u63a8\u8350\u914d\u7f6e","text":"\u914d\u7f6e\u8d8a\u9ad8\uff0c\u89e3\u6790\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"2\u3001\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa","text":" \u6253\u5f00\u63a7\u5236\u4e2d\u5fc3\uff0c\u8d26\u6237\u8bbe\u7f6e\u4e3a\u3010\u81ea\u52a8\u767b\u5f55\u3011\u548c\u3010\u65e0\u5bc6\u7801\u767b\u5f55\u3011\uff0c\u7535\u6e90\u7ba1\u7406\u4e2d\u4f7f\u7528\u7535\u6e90\u5168\u90e8\u8bbe\u7f6e\u4e3a\u3010\u4ece\u4e0d\u3011\uff0c\u5f00\u542f\u5f00\u53d1\u8005\u6a21\u5f0f\u3002 \u6839\u636e\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u8981\u6c42\uff0c\u5bfc\u5165\u76f8\u5173\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\uff1a\u5bfc\u5165\u76f8\u518c\u3001\u5f71\u9662\u3001\u97f3\u4e50\u7684\u6d4b\u8bd5\u8d44\u6e90\u3002 \u5728\u670d\u52a1\u7aef\u6253\u5f00\u76f8\u673a\u5e94\u7528\u540e\uff0c\u5c06\u6d4b\u8bd5\u673a\u684c\u9762\u58c1\u7eb8\u66f4\u6362\u4e3a\u7eaf\u8272\u58c1\u7eb8\uff08\u6ce8\u610f\uff0c\u670d\u52a1\u7aef\u9700\u63d0\u524d\u5f00\u542f\u76f8\u673a\u540e\u518d\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u58c1\u7eb8\uff0c\u5efa\u8bae\u7eaf\u9ed1\u58c1\u7eb8 setting/res/black.png\uff09 \u5728\u6587\u4ef6\u7ba1\u7406\u5668\u4e2d\uff0c\u5c06\u9009\u9879 \u4e3b\u83dc\u5355-\u8bbe\u7f6e-\u9884\u89c8-\u56fe\u7247\u9884\u89c8 \u53d6\u6d88\u52fe\u9009\uff08\u5982\u4e0d\u53d6\u6d88\uff0c\u4f1a\u5f71\u54cd\u622a\u56fe\u5f55\u5c4f\u5e94\u7528\u7684\u6027\u80fd\u6570\u636e\uff09 \u79fb\u52a8\u6216\u5220\u9664\u7cfb\u7edf Logo \uff0c\u6392\u9664\u684c\u9762\u53f3\u4e0b\u89d2 Logo \u7684\u5f71\u54cd\uff08\u91cd\u542f\u751f\u6548\uff09\u3002 sudo mv /usr/share/deepin/uos_logo.svg ~/Pictures/\n \u5b89\u88c5\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\uff08\u5fc5\u987b\u5b89\u88c5\uff01\uff01\uff09 AMD \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_amd64.deb ARM \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_arm64.deb MIPS \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_mips64.deb 3A5000 \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_5000.deb \u5b89\u88c5\u547d\u4ee4 sudo dkpg -i xserver-xorg-input-libinput_0.28.2-2_amd64.deb\n \u5b89\u88c5\u65f6\u4f1a\u63d0\u793a\u5df2\u5b58\u5728\u76f8\u540c\u7248\u672c\uff0c\u8bf7\u5ffd\u7565\uff0c\u76f4\u63a5\u8986\u76d6\u5b89\u88c5\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u4e3b\u673a\u624d\u751f\u6548"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u670d\u52a1\u7aef\u4e00\u952e\u73af\u5883\u90e8\u7f72","text":"\u73af\u5883\u642d\u5efa\u524d\u5fc5\u987b\u5148\u8fde\u63a5\u4e0a USB \u4e32\u53e3\u7ebf\u548c\u91c7\u96c6\u76d2\u3002 \u5bbf\u4e3b\u673a\u73af\u5883\u5b89\u88c5 python3 manage.py install --env host\n \u5bb9\u5668\u73af\u5883\u5b89\u88c5 python3 manage.py install --env docker\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u56db\u3001\u914d\u7f6e\u9879","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u670d\u52a1\u7aef\u914d\u7f6e","text":"setting/config/server.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u914d\u7f6e\u9879\uff0c\u5305\u542b\u4e86\u6240\u6709\u670d\u52a1\u7aef\u6240\u6709\u7684\u53ef\u914d\u7f6e\u9879\u3002 \u672c\u5730\u65e0\u7f51\u7edc\u8fd0\u884c \u5c06\u914d\u7f6e\u9879 network=0 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u672c\u5730\u6709\u7f51\u7edc\u8fd0\u884c \u914d\u7f6e\u9879 network=1 (1)\u914d\u7f6e\u9879 client_alias= \u914d\u7f6e\u4e3a\u4f60\u8981\u6d4b\u8bd5\u7684\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5982 Alias1 \u6d4b\u8bd5\u673a\u522b\u540d\u5728 setting/config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 (2)\u914d\u7f6e\u9879 client_alias= \u4e3a\u7a7a\uff0c\u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager --client_alias Alias1\uff0c\u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002(Alias1 \u4e3a\u4f60\u914d\u7f6e\u7684\u6d4b\u8bd5\u673a\u522b\u540d) (1)\u548c(2)\u53ea\u8981\u4f7f\u7528\u5176\u4e00\u5373\u53ef\u3002 \u6709\u7f51\u7edc\u8fd0\u884c\uff0c\u4e14\u9700\u8981\u901a\u8fc7 Jenkins \u4e0a\u8fd0\u884c\u4e00\u4e2a job \uff0c\u540c\u65f6\u63a7\u5236\u591a\u53f0\u673a\u5668\u3002 \u914d\u7f6e\u9879 network=1 \u914d\u7f6e\u9879 client_alias= \u4e0d\u7528\u914d\u7f6e\uff0c\u5728\u8fd0\u884c run.sh \u7684\u65f6\u5019\u76f4\u63a5\u7a7a\u683c\u52a0\u522b\u540d\u5373\u53ef\uff0c\u6bd4\u5982\uff1a\u6d4b\u8bd5\u673a\u522b\u540d\u4e3a Alias1 \uff0c\u4e14\u5df2\u7ecf\u5728 config/client.ini \u4e2d\u914d\u7f6e\u4e86 Alias1 \u7684user ip password \uff0c\u5219\u8fd0\u884c bash run.sh Alias1 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u5728 Jenkins pipeline \u91cc\u9762\u901a\u8fc7\u5e76\u884c stage \u6216\u5e76\u884c\u8c03\u7528\u4e0b\u5c42\u4efb\u52a1\u7684\u65b9\u5f0f\u53ef\u4ee5\u5b9e\u73b0\u5927\u89c4\u6a21\u7684\u6027\u80fd\u6d4b\u8bd5\u9700\u6c42\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;1\u3001KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2\u3001KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f, e.g. TAGS = L1 or smoke\n[case_conf]\n# \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\uff0cocr\u6587\u6848\u8bc6\u522b\u8f83\u6162\uff0c\u4e0d\u63a8\u8350\u4f7f\u7528\nfind_by = stage\n# \u6700\u540e\u4e00\u4e2a\u7a33\u5b9a\u9636\u6bb5\u7684\u5e27\u6570\u8bc6\u522b\n# \u9996\u5e27\u5b58\u5728\u540e\u7684\u7b2c\u4e00\u4e2a\u5927\u4e8e\u8be5\u914d\u7f6e\u5e27\u6570\u7684\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u5c3e\u5e27\nfinal_stable_num=100\n# \u4ece\u8be5\u5e27\u6570\u5f00\u59cb\u8bc6\u522b\u6587\u6848\u6216\u56fe\u7247\uff0c\u51cf\u5c11\u5206\u6790\u65f6\u95f4\nstart_num = 150\n# \u8bc6\u522b\u7684\u6587\u6848\ntext=\n# \u8bc6\u522b\u56fe\u7247\nmatch=apps/xxx/images/match.png\n# \u8bc6\u522b\u76f8\u4f3c\u5ea6\nmatch_rate=0.9\n# \u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6bd4\u5982\u70ed\u542f\u52a8\u7528\u4f8b\uff0c\u4ece\u70b9\u51fb\u6253\u5f00\u5230\u505c\u6b62\u5f55\u5c4f\uff0c\u4e2d\u95f4\u7b49\u5f855\u79d2\uff1b\nduration = 15\n# \u5355\u6761\u7528\u4f8b\u6267\u884c\u7684\u6b21\u6570\ncount = 5\n# \u7a33\u5b9a\u9636\u6bb5\u5212\u5206\u7684\u76f8\u4f3c\u5ea6\nstable_similarity = 0.9997\n[server]\n# \u8c03\u8bd5\u6a21\u5f0f=1\uff0c\u4e3a\u5f00\u542f\u8c03\u8bd5\u6a21\u5f0f\uff0c0\u4e3a\u5173\u95ed\u3002\n# \u8c03\u8bd5\u6a21\u5f0f\u4e0b\u9ed8\u8ba4\u53ea\u6267\u884c\u4e00\u6b21\u7528\u4f8b\uff0c\u4e0d\u5173\u673a\n# \u7f16\u5199\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u5efa\u8bae\u5f00\u542fmaintain\u3002\nMAINTAIN = 0\n# \u8fd0\u884c\u7684\u73af\u5883docker\u5bb9\u5668\u73af\u5883\uff0chost\u5bbf\u4e3b\u673a\u73af\u5883\nENV = docker\n# \u670d\u52a1\u7aef\u5bc6\u7801\nPASSWORD=1\n# \u6307\u5b9a\u6d4b\u8bd5\u673a\u522b\u540d\n# \u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6bd4\u5982\uff1a\n# [AMD]\n# ip=10.8.15.86\n# user=uos\n# \u5176\u4e2d AMD \u4e3a\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5219client_alias=AMD\nCLIENT_ALIAS = x86\uff08Intel-i7\uff09\n# 1 \u5f00\u542f\u7f51\u7edc, 0 \u5173\u95ed\u7f51\u7edc\n# \uff081\uff09\u670d\u52a1\u7aef\u4e0e\u6d4b\u8bd5\u673a\u987b\u5728\u540c\u4e00\u7f51\u6bb5\u4e0b\uff0c\u4f60\u53ef\u4ee5\u5c1d\u8bd5\u5728\u670d\u52a1\u7aef\u901a\u8fc7ssh\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c\u5982\u679c\u53ef\u4ee5\u8fde\u63a5\uff0c\u8bf4\u660e\u7f51\u7edc\u6b63\u5e38\u3002\n# \uff082\uff09\u5f53input_type=FILE_NAME \u65f6\uff0c\u5fc5\u987b\u5f00\u542f\u7f51\u7edc\u3002\nNETWORK = 1\n# \u6027\u80fd\u7ed3\u679c\u7edf\u8ba1\u5355\u4f4d \u6beb\u79d2\u2014ms, \u79d2\u2014s\nUNIT=ms\n# \u6d4b\u8bd5\u673a\u5f00\u673a\u8fdb\u5165\u684c\u9762\u540e\u7b49\u5f85\u65f6\u95f4,\u5355\u4f4d/\u79d2\nSTARTUP_DELAY = 60\n# 1\u4e3a\u5220\u9664\u7f13\u5b58\uff0c0\u4e3a\u4e0d\u5220\u9664\u7f13\u5b58\n# \u7528\u4f8b\u6267\u884c\u5b8c\u540e\u4f1a\u5728report\u76ee\u5f55\u4e0b\u751f\u6210\u667a\u80fd\u89e3\u6790\u7684\u4e00\u4e9b\u7f13\u5b58\u56fe\u7247\u3002\nCACHE = 0\n# \u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u62a5\u544a\u4f1a\u4fdd\u5b58\u5728\u9879\u76ee\u4e0breport\u76ee\u5f55\u4e2d\uff1b\n# \u6307\u5b9a\u62a5\u544a\u76ee\u5f55\u5219\u5b58\u653e\u5230\u6307\u5b9a\u76ee\u5f55\u3002\nREPORT_PATH = report\n# \u670d\u52a1\u7aef\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684icon\u8d44\u6e90\u4f1a\u7f13\u5b58\u5728\u9879\u76ee\u4e0binput\u76ee\u5f55\u4e2d\nINPUT = input/\n# 1\u4e3a\u6d4b\u8bd5\u5b8c\u5173\u673a\uff0c0\u4e3a\u6d4b\u8bd5\u5b8c\u4e0d\u5173\u673a\nSHUTDOWN = 0\n# \u89e3\u6790\u8fdb\u7a0b\u6570\uff08\u4e0d\u63a8\u8350\u4fee\u6539\uff09\n# 3\u4e2a\u8fdb\u7a0b\u89e3\u6790\u89c6\u9891\u5df2\u7ecf\u80fd\u591f\u6ee1\u8db3\uff0c\u5373\u4f7f\u589e\u52a0\u8fdb\u7a0b\u6570\u4e5f\u4e0d\u80fd\u51cf\u5c11\u6574\u4f53\u8017\u65f6\n# \u53e6\u5916\u8fd8\u8981\u770bCPU\u6838\u6570\u662f\u5426\u652f\u6301\u3002\nPARSING_PROCESS = 3\n# 1\u4e3a\u4f7f\u7528\u7ee7\u7535\u5668\u5f00\u5173\u673a\uff0c0\u4e3a\u4f7f\u7528reboot\u547d\u4ee4\u91cd\u542f\u3002\u4f9d\u8d56\u7ee7\u7535\u5668\u786c\u4ef6\u8bbe\u5907\uff0c\u9700\u8981\u4f7f\u7528\u8054\u7cfb\u5f00\u53d1\u8005\nRELAY = 0\n# \u83b7\u53d6\u6d4b\u8bd5\u5e94\u7528\u7684\u7248\u672c, %s \u5360\u4f4d\u5e94\u7528\u540d\n# \u5982\u679c\u8be5\u914d\u7f6e\u4e3a\u7a7a\uff0c\u5219\u4e0d\u83b7\u53d6\u5e94\u7528\u7684\u7248\u672c\u4fe1\u606f\u3002\nCOMMAND = apt policy %s 2>/dev/null|grep \"\u5df2\u5b89\u88c5\"|awk -F \"\uff1a\" \"{print \\$2}\"\n# \u5173\u673a\u7b49\u5f85\u5f00\u542f\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6839\u636e\u6d4b\u8bd5\u673a\u6027\u80fd\u4e0d\u540c\uff0c\u5f00\u5173\u673a\u8017\u65f6\u53ef\u80fd\u4e0d\u540c\uff0c\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u673a\u60c5\u51b5\u914d\u7f6e\u3002\nSHUTDOWN_DELAY = 30\n# \u53ef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u56fe\u7247\u683c\u5f0f\uff0c\u4ee5\u82f1\u6587\u9017\u53f7\u9694\u5f00\u3002\n# \u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u76ee\u524d\u6211\u4eec\u4ec5\u9a8c\u8bc1\u4e86jpg,jpeg,png\u8fd9\u4e09\u79cd\u5e38\u7528\u7684\u56fe\u7247\u683c\u5f0f\u3002\nINPUT_TYPES = jpg,jpeg,png\n# \u6027\u80fd\u5206\u6790\u8865\u5e27\uff0c\u7b49\u4e8e\u6216\u4f4e\u4e8e\u8be5\u503c\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u9700\u8981\u51cf\u6389\u3002\nUN_STAB_START = 3\n# \u670d\u52a1\u7aef\u83b7\u53d6\u6d4b\u8bd5\u673a\u56fe\u50cf\u7684\u5e27\u7387\uff0c\u5373\u6bcf\u79d2\u83b7\u53d6\u591a\u5c11\u5f20\u6d4b\u8bd5\u673a\u4e0a\u7684\u56fe\u50cf\u3002\n# \u9ed8\u8ba4\u5e27\u7387\u4e3a30\u5e27/\u79d2\uff0c\u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u53ef\u80fd\u4f1a\u5bf9\u89e3\u6790\u7ed3\u679c\u9020\u6210\u504f\u5dee\u3002\nFPS = 30\n# \u4ee5\u4e0b\u573a\u666f\u7c7b\u578b\u4f1a\u91cd\u542f\u6d4b\u8bd5\u673a,\u591a\u79cd\u573a\u666f\u4f7f\u7528\u9017\u53f7\u9694\u5f00\nSCENE = cold\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = http://10.8.13.78:8890\n#\u5c4f\u5e55\u56fe\u7247\u4e34\u65f6\u5b58\u653e\u4f4d\u7f6e\nSCREEN_CACHE = /tmp/screen\n# =======================================\n[log]\n# \u65e5\u5fd7\u7ea7\u522b\uff0cOFF\u3001FATAL\u3001ERROR\u3001WARN\u3001INFO\u3001DEBUG\u3001ALL\n# \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u65e5\u5fd7\u8f93\u51fa\uff0clog_cli=INFO\u8868\u793a \u4ec5\u8f93\u51faINFO\u53ca\u4ee5\u4e0a\u7ea7\u522b\u7684\u65e5\u5fd7\u3002\nLOG_LEVEL = DEBUG\n# \u65e5\u5fd7\u6587\u4ef6\u4fdd\u5b58\u8def\u5f84\nLOG_PATH= logs\n# =======================================\n[dockerhub]\n# \u5bb9\u5668\u767b\u9646\u8d26\u53f7\nDOCKER_USER = user\n# \u5bb9\u5668\u767b\u9646\u5bc6\u7801\nDOCKER_PASSWORD = User1234\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u6d4b\u8bd5\u673a\u914d\u7f6e","text":"setting/config/client.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u4fe1\u606f\u3002 \u6709\u7f51\u7edc\u7684\u60c5\u51b5\u4e0b\uff0c\u670d\u52a1\u7aef\u9700\u8981\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u56e0\u6b64\u4f60\u9700\u8981\u5199\u5165 \u6d4b\u8bd5\u673a\u522b\u540d \u3001 user \u3001ip\u3001 password \u3002 # \u6d4b\u8bd5\u673a\u522b\u540d\n[Alias1] # \u6d4b\u8bd5\u673aip\nip=10.8.15.86 # \u6d4b\u8bd5\u673a\u7528\u6237\u540d\nuser=uos\n \u547d\u540d\u5efa\u8bae\uff1aAliasA1\u3001AliasA2\u3001AliasB1\u3001AliasB2\uff0c\u4e0d\u8981\u91cd\u540d\u3002 \u65e0\u7f51\u7edc\u60c5\u51b5\u4e0b\uff0c\u4ec5\u9700\u8981\u5173\u6ce8\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\u9879 width=\u3001 height= \u5373\u53ef\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a [client]\n# \u9ed8\u8ba4\u6d4b\u8bd5\u673a\u7528\u6237\u540d\uff0c\u5bc6\u7801\uff0cip\nip=\nuser=\n# \u6d4b\u8bd5\u673a\u5bc6\u7801\npassword=1\n# \u6d4b\u8bd5\u673a\u4e3b\u9898\ntheme=bloom\n# \u6d4b\u8bd5\u673aicon\u76ee\u5f55\npath=/usr/share/icons\n# \u7cfb\u7edfdesktop\u6587\u4ef6\u7684\u5b58\u653e\u76ee\u5f55\uff0cUOS\u7cfb\u7edf\u9ed8\u8ba4\u4e3a/usr/share/applications\ndesktop_path=/usr/share/applications\n# \u7528\u4e8e\u5224\u65ad\u6d4b\u8bd5\u673a\u662f\u5426\u5f00\u673a\u8fdb\u5165\u684c\u9762\u7684\u8bc6\u522b\u6807\u8bc6\u3002\n# 1\u3001\u901a\u8fc7\u684c\u9762\u56fe\u6807\u8bc6\u522b\u3002\n# - type=FILE_NAME\u65f6\uff0c\u670d\u52a1\u5668\u548c\u6d4b\u8bd5\u673a\u5fc5\u987b\u5728\u540c\u4e00\u5c40\u57df\u7f51\u5185\u3002\n# - power_on=dde-computer\u8868\u793a\u901a\u8fc7\u684c\u9762\u8ba1\u7b97\u673a\u56fe\u6807\u5224\u65ad\u5f00\u673a\u8fdb\u5165\u684c\u9762\u3002\n# 2\u3001\u901a\u8fc7\u672c\u5730\u56fe\u7247\u4f5c\u4e3a\u5f00\u673a\u8bc6\u522b\u3002\n# - type= \u4f20\u5165\u4e3a\u56fe\u7247\u683c\u5f0f\uff0ctype\u652f\u6301\u7684\u7c7b\u578b\u5305\u542b\u5728server.ini\u5185\u914d\u7f6e\u9879input_type=jpg,jpeg,png\u3002\n# - power_on= \u4f20\u5165\u7684\u662f\u672c\u5730\u56fe\u7247\u7684\u8def\u5f84\u3002\ntype=FILE_NAME\npower_on=dde-computer\n# \u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\uff08\u6d4b\u8bd5\u673a\u8fde\u63a5\u91c7\u96c6\u76d2\uff0c\u91c7\u96c6\u76d2\u7684\u5206\u8fa8\u7387\uff09\nheight=1080\nwidth=1920\n[AliasA1] ip=10.8.15.86\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n[AliasA2]\nip=10.8.15.20\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_2","title":"3\u3001\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e","text":"\u968f\u7740\u6d4b\u8bd5\u573a\u666f\u7684\u4e0d\u65ad\u5f15\u5165\uff0c\u53d1\u73b0\u73b0\u6709\u670d\u52a1\u7aef\u91cc\u7684\u914d\u7f6e\u9879\u5e76\u4e0d\u9002\u7528\u4e8e\u6240\u6709\u7684\u6027\u80fd\u573a\u666f\uff0c\u4e8e\u662f\u5c06\u670d\u52a1\u7aef\u914d\u7f6e\u8fdb\u884c\u4e00\u4e2a\u63d0\u53d6\uff0c\u53ef\u505a\u5355\u4e2a\u573a\u666f\u7684\u4e2a\u6027\u5316\u914d\u7f6e\uff0c\u5f53\u7136\u539f\u6765\u7684\u670d\u52a1\u7aef\u914d\u7f6e\u529f\u80fd\u4fdd\u7559\uff0c\u53ea\u662f\u5f53\u4f60\u914d\u7f6e\u4e86\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e\u540e\uff0c\u4f18\u5148\u4f7f\u7528\u4e2a\u6027\u5316\u914d\u7f6e\u91cc\u9762\u7684\u5185\u5bb9\uff0c\u4ee5\u4e0b\u662f\u5bf9\u4e2a\u6027\u5316\u914d\u7f6e\u7684\u4ecb\u7ecd\u3002 \u76ee\u524d\u6bcf\u4e00\u4e2a py \u6587\u4ef6\u5bf9\u5e94\u4e00\u4e2a\u6027\u80fd\u6d4b\u8bd5\u573a\u666f\uff0c\u4e8e\u662f\u5728\u540c\u7ea7\u76ee\u5f55\u4e0b\u521b\u5efa\u4e00\u4e2a\u4e0e\u4e4b\u540c\u540d\u7684 json \u6587\u4ef6\uff0c\u4f5c\u4e3a\u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6 apps\n\u251c\u2500\u2500 album\n \u251c\u2500\u2500 test_album_01_start.json # \u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6\n\u2514\u2500\u2500 test_album_01_start.py # \u6027\u80fd\u573a\u666f\u6587\u4ef6\n \u4ee5\u4e0b\u662f\u5bf9 json \u6587\u4ef6\u4e2d\u914d\u7f6e\u7684\u89e3\u91ca\uff0c\u82e5\u67d0\u9879\u914d\u7f6e\u4e0d\u9700\u8981\uff0c\u53ef\u4ee5\u7f3a\u5931\uff0c\u4f46\u4e0d\u80fd\u4e3a\u7a7a\uff1b {\n\"title\": \"test_album_start\", # \u6807\u9898\uff1b\u5fc5\u987b\n\"app_name\": \"deepin-album\", # \u573a\u666f\u6240\u5c5e\u7684\u5e94\u7528\uff1b\u5fc5\u987b\n\"scene\": \"hot\", # \u573a\u666f\u522b\u540d\uff1b\u5fc5\u987b\n\"icon\": [\"deepin-album\"], # \u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684icon\u5230\u670d\u52a1\u7aef\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\uff1b\u53ef\u7f3a\u5931\n# \u6ce8\u610f\uff1a\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684desktop\u6587\u4ef6\u540d\u4e3adeepin-album.desktop\uff0c\n# \u53ea\u9700\u8981\u5199deepin-album\u5373\u53ef\uff0c\u201c.desktop\u201d\u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002\n\"size\": { # \u56fe\u7247\u5bf9\u6bd4\u7684\u533a\u57df\u8bbe\u7f6e\u9879\uff0c\u67d0\u4e9b\u5e94\u7528\u5f53\u524d\u5c4f\u5e55\u7684\u90e8\u5206\u533a\u57df\u9700\u8981\u5c06\u5176\u53bb\u6389\uff0c\u53ef\u4ee5\u8bbe\u7f6e\u6b64\u9879\uff0c\u5982\u679c\u6ca1\u6709\u5219\u53ef\u4e0d\u5199\uff1b\u53ef\u786e\u5b9e\n\"x-coordinate\": 0, # \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n\"y-coordinate\": 0, # \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n\"width\": 850, # \u6a2a\u5411\u957f\u5ea6\n\"height\": 1920 # \u7eb5\u5411\u9ad8\u5ea6\n},\n\"count\": 5, # \u573a\u666f\u6267\u884c\u7684\u6b21\u6570\uff1b\u5fc5\u987b\n\"duration\": 5, # \u8be5\u6761\u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff0c\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7279\u5b9a\u573a\u666f\uff0c\u8be5\u914d\u7f6e\u4e3a\u53ef\u9009\u9879\uff0c\u8986\u76d6 server.ini \u4e2d\u7684\u914d\u7f6e\uff1b\u53ef\u7f3a\u5931\n\"stable_similarity\": 0.9997, # \u6027\u80fd\u573a\u666f\u5206\u9636\u6bb5\u65f6\u7684\u56fe\u7247\u76f8\u4f3c\u5ea6\u5bf9\u6bd4\uff0c\u524d\u540e\u56fe\u7247\u4f4e\u4e8e\u8be5\u503c\uff0c\u5219\u5206\u4e3a\u4e0d\u7a33\u5b9a\u9636\u6bb5\uff1b\u53ef\u7f3a\u5931\n\"find_by\": \"stage\", # \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\n\"final_stable_num\": 100, # \u67e5\u627e\u6700\u540e\u4e00\u4e2a\u5927\u4e8e\u8be5\u503c\u7684\u7a33\u5b9a\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u7684\u5c3e\u796f\uff1b\u53ef\u7f3a\u5931\n\"start_num\": 150,\n\"text\": \"\", # ocr\u8bc6\u522b\u7684\u6587\u6848\n\"match\": \"apps/xxx/images/match.png\", # \u56fe\u50cf\u5339\u914d\u7684\u56fe\u7247\u6587\u4ef6\u8def\u5f84\n\"match_rate\": 0.9 # \u5339\u914d\u76f8\u4f3c\u5ea6\n}\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e94\u3001\u6d4b\u8bd5\u6d41\u7a0b","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516d\u3001\u7528\u4f8b\u7f16\u5199\u53ca\u65b9\u6cd5\u53c2\u6570\u6307\u5f15","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"1\u3001\u7528\u4f8b\u5b9e\u4f8b\u8bf4\u660e","text":"# \u6807\u51c6\u5e93\u5bfc\u5165\nfrom time import sleep\n# \u5bfc\u5165\u4e09\u65b9\u5e93pytest\nimport pytest\n# \u5bfc\u5165\u7528\u4f8b\u6267\u884c\u8981\u7528\u5230\u7684Widget\u7c7b\nfrom src.base_widget import BaseWidget\nclass TestStart:\n# class\u7ea7\u522b\u7684fixture\uff0c\u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u6267\u884c\u3002autouse=True \u81ea\u52a8\u5728\u5f53\u524d\u4f5c\u7528\u57df\u4e0b\u4f7f\u7528\u3002\n@pytest.fixture(scope=\"class\", autouse=True)\n# \u6d4b\u8bd5\u70ed\u542f\u52a8\u4e4b\u524d\u9700\u8981\u9884\u542f\u52a8\u3002\ndef application_pre_start(self):\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().right_click_element(\"deepin-album\")\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().click_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\")\nsleep(2)\n# \u5feb\u6377\u952e\u5173\u95ed\u7a97\u53e3\nBaseWidget().hot_key(\"alt\", \"f4\")\nsleep(2)\n# \u9ed8\u8ba4\u4e3afunction\u7ea7\u522b\u7684fixture\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\uff0cclass\u7ea7\u522bfixture\u6267\u884c\u4e4b\u540e\u6267\u884c\u3002\n@pytest.fixture(autouse=True)\ndef setup_start(self):\n# \u53f3\u952e\u70b9\u51fb deepin-album \u56fe\u6807\nBaseWidget().right_click_element(\"deepin-album\")\n# \u79fb\u52a8\u5230\u53f3\u952e\u83dc\u5355\u4e2d\u6253\u5f00\uff08open.png\uff09\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().move_to(*BaseWidget().find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))\n# \u7b49\u5f85\u79fb\u52a8\u5b8c\u6210\nsleep(0.5)\ndef test_album_start(self):\n# \u70b9\u51fb\u201c\u6253\u5f00\u201d\nBaseWidget().click() \n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"2\u3001\u65b9\u6cd5\u53c2\u6570\u8bf4\u660e","text":"2.1\u3001find_element \u65b9\u6cd5 def find_element(element: str, input_type: str = \"FILE_NAME\", fill_color_position: tuple = (-1, -1), size: tuple = (25, 70)):\npass\n \u53c2\u6570 element \u548c input_type \uff081\uff09\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u5143\u7d20 - `input_type` \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a `FIEL_NAME` \uff0c\u8868\u793a\u901a\u8fc7\u5e94\u7528 `icon` \u5bfb\u627e\u5143\u7d20\uff0c\u6b64\u65b9\u6cd5\u4f1a\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u5e94\u7528 `icon` \u56fe\u6807\u3002\n \u4e3e\u4f8b\uff1a\u9ed8\u8ba4\u60c5\u51b5\u4e0b input_type \u53c2\u6570\u4e0d\u9700\u8981\u4f20\u5165\uff0c find_element(\"deepin-album\")\uff0c\u8868\u793a\u901a\u8fc7 deepin-album \u7684\u5e94\u7528 icon \u6765\u83b7\u53d6\u5750\u6807\uff0c\u6ce8\u610f\uff0c\u6b64\u65f6\u4f20\u5165\u7684 deepin-album \u53c2\u6570\u5b9e\u9645\u662f desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u548c2.3\u4e2d\u7684 icon \u53d8\u91cf\u4e00\u81f4\u3002 \u6211\u4eec\u5efa\u8bae\u4f18\u5148\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\uff0c\u4f46\u6b64\u65b9\u6cd5\u4f9d\u8d56\u7f51\u7edc\uff0c\u8bf7\u6839\u636e\u6d4b\u8bd5\u73af\u5883\u5b9e\u9645\u60c5\u51b5\u9009\u62e9\u3002 \uff082\uff09\u901a\u8fc7\u672c\u5730\u56fe\u7247\u8bc6\u522b\u5143\u7d20 - \u53c2\u6570 `input_type` \u4f20\u5165\u56fe\u7247\u683c\u5f0f\uff0c\u6bd4\u5982\u622a\u53d6\u7684\u672c\u5730\u56fe\u7247\u683c\u5f0f\u4e3a `png`\uff0c\u90a3\u4e48 `input_type=\"png\"`\uff0c\u6b64\u65f6\u53c2\u6570 `element ` \u4f20\u5165\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5efa\u8bae\u5b58\u653e\u5728\u5bf9\u5e94\u7684\u4ea7\u54c1 `apps/app/picture/` \u76ee\u5f55\u4e0b\uff0c\u8def\u5f84\u4e3a\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u7684\u76f8\u5bf9\u8def\u5f84\u3002\n- \u4e3e\u4f8b\uff1a`find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))`\uff0c\u8868\u793a\u901a\u8fc7\u672c\u5730\u56fe\u7247 `open.png` \u8bc6\u522b\u5143\u7d20\u3002\n \u53c2\u6570 fill_color_position fill_color_position \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (-1, -1)\uff0c(-1, -1) \u8868\u793a\u53d6\u5c4f\u5e55\u4e2d\u53f3\u4e0b\u89d2\u6700\u540e\u4e00\u4e2a\u50cf\u7d20\u70b9\u4f5c\u4e3a\u586b\u5145\u5750\u6807\uff0c\u5728 1920x1080 \u5c4f\u5e55\u5206\u8fa8\u7387\u4e0b\u5373\u5b9e\u9645\u5750\u6807\u4e3a (1919, 1079) \uff0c\u8fd9\u6837\u7684\u5199\u6cd5\u53ef\u4ee5\u9002\u914d\u4e0d\u540c\u5927\u5c0f\u7684\u5c4f\u5e55\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0d\u540c\u65b9\u4f4d\uff1a \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0b\u65b9\uff0c\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u4e0d\u9700\u8981\u4f20\u5165\u8be5\u53c2\u6570\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u5de6\u8fb9\uff0cfill_color_position=(1, 1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u53f3\u8fb9\uff0cfill_color_position=(-1, -1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0a\u8fb9\uff0cfill_color_position=(1, 1) \u4ece\u684c\u9762\u542f\u52a8\u5e94\u7528\uff0c\u5219\u9700\u8981\u4f20\u5165\u9664\u4efb\u52a1\u680f\u4ee5\u5916\u5176\u4ed6\u4f4d\u7f6e\u7684\u5750\u6807\uff0c\u6bd4\u5982(100, 100)\uff0c\u53ea\u8981\u8fd9\u4e2a\u5750\u6807\u4e3a\u9664\u5e94\u7528\u548c\u4efb\u52a1\u680f\u533a\u57df\u90fd\u53ef\u4ee5\u3002 \u4ece\u542f\u52a8\u5668\u91cc\u9762\u542f\u52a8\u5e94\u7528\uff0c\u9700\u8981\u586b\u5145\u7684\u5750\u6807\u4e3a\u542f\u52a8\u5668\u533a\u57df\u3002 \u6ce8\uff1a\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u65f6\uff0c\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684 icon \u539f\u6587\u4ef6\u4e3a svg \u77e2\u91cf\u56fe\uff0c\u8f6c\u6362\u4e3a png \u4e4b\u540e\u9700\u8981\u586b\u5145\u8fb9\u7f18\u900f\u660e\u90e8\u5206\u3002 \u53c2\u6570 size size \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (25, 70)\uff0c\u8868\u793a\u6d4b\u8bd5\u673a\u4e0a dock \u680f\u4e0a\u5e94\u7528\u56fe\u6807\u7684\u5927\u5c0f\u8303\u56f4\u3002 UOS \u7cfb\u7edf dock \u680f\u662f\u53ef\u4ee5\u4e0a\u4e0b\u62d6\u52a8\u5927\u5c0f\u7684\uff0c\u968f\u7740 dock \u680f\u5927\u5c0f\u6539\u53d8\uff0c\u5e94\u7528\u56fe\u6807\u7684\u8303\u56f4\u4e3a25\u523070\u4e4b\u95f4\u3002 \u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u64cd\u4f5c\u7cfb\u7edf\u4e0a dock \u680f\u5927\u5c0f\u4e0d\u4e00\u6837\uff0c\u53ef\u4ee5\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u4f20\u5165\u5927\u5c0f\u8303\u56f4\u3002 2.2\u3001click_element\u3001 right_click_element\uff0c double_click_element \u8fd9\u51e0\u4e2a\u65b9\u6cd5\u53c2\u6570\u89c4\u5219\u4e0e find_element \u65b9\u6cd5\u4e00\u6837\u3002\u4ed6\u4eec\u5b9e\u9645\u4e0a\u662f\u5728 find_element \u65b9\u6cd5\u57fa\u7840\u4e4b\u4e0a\u505a\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u589e\u52a0\u4e86\u9f20\u6807\u7684\u52a8\u4f5c\uff0c\u5982\u679c\u4f60\u4e0d\u60f3\u4f7f\u7528\u8fd9\u51e0\u4e2a\u65b9\u6cd5\uff0c\u5728\u7528\u4f8b\u4e2d\u4e5f\u53ef\u4ee5\u901a\u8fc7 find_element \u83b7\u53d6\u5230\u5750\u6807\uff0c\u7136\u540e\u5c06\u5750\u6807\u4f20\u5165\u5230\u952e\u9f20\u7684\u65b9\u6cd5\u4e2d\uff0c\u53ef\u4ee5\u5b9e\u73b0\u540c\u6837\u7684\u6548\u679c\u3002 2.3\u3001\u7528\u4f8b\u7c7b\u4e2d\u6709\u4e2a\u7c7b\u53d8\u91cf icon = [\"deepin-album\"] \u9700\u8981\u7279\u6b8a\u8bf4\u660e\uff0c\u5217\u8868\u4e2d\u7684\u5143\u7d20\u4e3a\u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709 icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684 icon \u5230\u670d\u52a1\u7aef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528 desktop \u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684 desktop \u6587\u4ef6\u540d\u4e3a deepin-album.desktop\uff0c\u53ea\u9700\u8981\u5199 deepin-album \u5373\u53ef\uff0c.desktop \u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e03\u3001\u6267\u884c\u5165\u53e3","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"1\u3001\u7528\u4f8b\u7ec4\u7ec7","text":"\u5728 setting/config/server.ini \u6587\u4ef6\u4e2d APP_NAME= \u5b57\u6bb5\u4e3a\u7528\u4f8b\u7684\u6267\u884c\u7684\u76ee\u5f55\uff0c\u9ed8\u8ba4\u4e3a apps \u76ee\u5f55\u4e0b\u6240\u6709\u7528\u4f8b\u3002\u5982\u679c\u4f60\u60f3\u6307\u5b9a\u6267\u884c\u67d0\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4f60\u53ef\u4ee5\u5c06\u8be5\u914d\u7f6e\u9879\u6307\u5b9a\u5230\u5e94\u7528\u7684\u7528\u4f8b\u76ee\u5f55\uff0c\u6bd4\u5982\uff1aAPP_NAME=deepin_album\uff0c \u8868\u793a\u6267\u884c\u76f8\u518c\u76ee\u5f55\u4e0b\u7684\u7528\u4f8b\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a python3 manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music\n -k KEYWORDS, --keywords KEYWORDS\n \u7528\u4f8b\u7684\u5173\u952e\u8bcd\n -t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e\n --log_level LOG_LEVEL \u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n --env {host,docker} \u5728\u5bbf\u4e3b\u673a\u6216\u5bb9\u5668\u73af\u5883\u6267\u884c\n --client_alias \u9009\u62e9\u6d4b\u8bd5\u673a\u522b\u540d, \u53ef\u9009\u9879\u4e3aclient.ini\u4e2d\u5df2\u914d\u7f6e, \u9ed8\u8ba4\u503c\u4e3a zx-x86.\n --count \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a python3 manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\" --env docker\n \u6ce8\uff1a\u5728\u5bb9\u5668\u4e2d\u6267\u884c\u65f6\uff0c\u82e5\u5f3a\u5236\u9000\u51fa\uff0c\u5bb9\u5668\u5e76\u4e0d\u4f1a\u505c\u6b62\u8fd0\u884c\uff01"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_9","title":"\u516b\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1json","title":"1\u3001Json \u62a5\u544a","text":"\u81ea\u7814\u89c6\u9891\u89e3\u6790\u5de5\u5177\u4f1a\u5bf9\u5355\u6761\u7528\u4f8b\u6267\u884c\u4e00\u8f6e\u751f\u6210\u4e00\u4e2a json \u6587\u4ef6\uff0c\u5b58\u653e\u4e8e report/{app_name}/{scene}/{run_num} \u76ee\u5f55\u4e0b\uff0c\u547d\u540d\u683c\u5f0f\u4e3a\uff1a report.json json \u5185\u5bb9\u4e3e\u4f8b\uff1a [\n{\n\"Stab1\": {\n\"images\": [1,2...150,151],\n\"startStub\": 0,\n\"type\": \"Stab\"\n}\n},\n{\n\"Stab2\": {\n\"images\": [152,153...169,170],\n\"startStub\": 1,\n\"type\": \"UnStab\"\n}\n},\n{\n\"Stab3\": {\n\"images\": [171,172...300,301],\n\"startStub\": 0,\n\"type\": \"UnStab\"\n}\n}\n]\n \u8bf4\u660e\uff1a Stab \uff1a\u8868\u793a\u89e3\u6790\u8fc7\u7a0b\u4e2d\u4e0d\u540c\u7684\u9636\u6bb5\u3002 images \uff1a\u8868\u793a\u6bcf\u4e00\u5e27\u7684\u56fe\u7247\u5e8f\u53f7\u3002 startStub\uff1a \u4e3a\u8bc6\u522b\u5c3e\u5e27\u7684\u9636\u6bb5\u8868\u793a\uff0c\u5982\u679c \"startStub\": 1 \uff0c\u8bf4\u660e\u5c3e\u5e27\u51fa\u73b0\u5728\u8be5\u9636\u6bb5\u3002 type\uff1a \u4e3a Stab \u6216 UnStab \uff0c\u8868\u793a\u7a33\u5b9a\u9636\u6bb5\u6216\u4e0d\u7a33\u5b9a\u9636\u6bb5\u3002 \u5404\u9636\u6bb5\u6709\u5e27\u6570\u8865\u507f\uff0c\u9ed8\u8ba4\u8865\u507f\u7684\u5e27\u6570\u4e3a 3 \u5e27\uff08\u53ef\u4ee5\u901a\u8fc7 server.ini \u91cc\u9762 un_stab_start=3 \u8fdb\u884c\u914d\u7f6e\uff09\uff0c\u8868\u793a\u5c0f\u4e8e\u7b49\u4e8e 3 \u5e27\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u524d\u540e\u5747\u9700\u8981\u51cf\u6389\u3002 \u5e94\u7528\u542f\u52a8\u9636\u6bb5\u5c31\u662f\u5728 Stab2 \u9636\u6bb5\uff0c\u542f\u52a8\u65f6\u95f4\u4e3a\uff1a171 \u51cf 151 \u518d\u51cf\u6389\u524d\u540e\u8865\u507f\u5e27\u6570 6 \u5e27\uff0c\u5373 14 \u5e27\uff0c\u89c6\u9891\u5e27\u7387 30 \u5e27/\u79d2\uff0c\u56e0\u6b64\u542f\u52a8\u8017\u65f6\u4e3a\uff1a14 * 33 = 462 ms"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2excel","title":"2\u3001Excel \u62a5\u544a","text":"\u6240\u6709\u7528\u4f8b\u6267\u884c\u5e76\u89e3\u6790\u5b8c\u4e4b\u540e\u4f1a report \u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a\u6c47\u603b\u6570\u636e\u7684 Excel \u6587\u4ef6\uff0c\u6587\u4ef6\u540d\u4e3a\uff1a{time}_perf_time.xlsx\u3002 \u6ce8\u610f\uff0creport \u76ee\u5f55\u4e3a\u53ef\u914d\u7f6e\u9879\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u4f1a\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u751f\u6210\uff0c\u5982\u679c\u4f60\u5c06 report\uff0c\u6307\u5b9a\u5230\u9879\u76ee\u4e0b\u5176\u4ed6\u8def\u5f84\uff0c\u5219\u4f1a\u5728\u5bf9\u5e94\u7684\u8def\u5f84\u4e0b\u751f\u6210 json \u548c Excel \u6587\u4ef6\u3002 \u4f60\u4e5f\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8bfb\u53d6\u6240\u6709 json / excel \u62a5\u544a\u7684\u6570\u636e\uff0c\u751f\u6210\u4f60\u81ea\u5df1\u60f3\u8981\u7684\u4e00\u4e9b\u6d4b\u8bd5\u62a5\u544a\u5f62\u5f0f\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#usb","title":"\u4e5d\u3001USB \u4e32\u53e3\u9a71\u52a8\u952e\u9f20\u65b9\u6cd5","text":"\u4f4d\u4e8e src/utils/control/serial_communication \u76ee\u5f55\u4e0b\u7684 usb_mk.py \u6587\u4ef6 usb_mk = UsbMk()\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up()\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u652f\u6301\u4f20\u5165\u6c49\u5b57\uff0c\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click()\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() \n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() \n \uff084\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() \n \uff085\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() \n \uff086\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() \n \uff087\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff088\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff0810\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_10","title":"\u5341\u3001\u7ee7\u7535\u5668\u63a7\u5236\u4e3b\u673a\u5f00\u673a/\u91cd\u542f","text":"\uff08\u82e5\u4e0d\u4f7f\u7528\u7ee7\u7535\u5668\uff0c\u53ef\u5ffd\u7565\u8be5\u6b65\u9aa4\uff0c\u6267\u884c\u65f6\u4f1a\u901a\u8fc7\u547d\u4ee4 reboot\uff09"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u7ee7\u7535\u5668\u8bbe\u5907","text":"LCUS-2 \u578b \u53cc\u8def USB \u667a\u80fd\u4e32\u53e3\u63a7\u5236\u7ee7\u7535\u5668\u3002 https://item.taobao.com/item.htm?spm=a1z09.2.0.0.41d72e8dUYx2pi&id=582653718178&_u=i25r20ia6a2e "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2usb","title":"2\u3001USB \u5ef6\u957f\u7ebf","text":"\u666e\u901a\u7684 USB \u7ebf\u5373\u53ef\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_3","title":"3\u3001\u675c\u90a6\u7ebf","text":"3.1\u300140P \u6bcd\u5bf9\u516c\u675c\u90a6\u7ebf\u3002 3.2\u3001\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"4\u3001\u5b89\u88c5\u56fe\u6587\u6559\u7a0b","text":"4.1\u3001\u4f7f\u7528 USB \u5ef6\u957f\u7ebf\u8fde\u63a5\u63a7\u5236\u7aef\u548c\u7ee7\u7535\u5668\u3002 4.2\u3001\u5728\u7ee7\u7535\u5668\u5e38\u7aef\u548c\u516c\u5171\u7aef\u5747\u8fde\u63a5\u4e00\u6839\u675c\u90a6\u7ebf\u3002 4.3\u3001\u5728\u4e3b\u677f\u4e0a\u5f00\u673a\u9488\u548c\u91cd\u542f\u9488\u4e0a\u63d2\u4e0a\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 4.4\u3001\u5c06\u5f00\u673a\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76841\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1\u5de6\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 4.5\u3001\u5c06\u91cd\u542f\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76842\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1 \u53f3\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 \u82e5\u60f3\u4fdd\u7559\u539f\u7535\u6e90\u5f00\u5173\u7684\u7535\u6e90\u706f\uff0c\u53ef\u6839\u636e\u5982\u4e0a\u56fe\u6240\u793a\uff0c\u4f7f\u7528\u675c\u90a6\u7ebf\u8fde\u63a5\u4e3b\u677f\u4e0a\u7684\u7535\u6e90\u706f\u548c\u539f\u7535\u6e90\u5f00\u5173"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_11","title":"\u5341\u4e00\u3001\u5e38\u89c1\u95ee\u9898\u8bf4\u660e","text":"1\u3001ERROR: for uos Cannot restart container 2301b1a1395d7959ee6523d61b61c87084649af530786cdb8fb5b3ecbcbd1068: linux runtime spec devices: error gathering device information while adding custom device \"/dev/ttyACM0\": no such file or directory \u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u8fde\u63a5\u72b6\u6001\uff0c\u67e5\u770b /dev/ttyACM0 \u662f\u5426\u5b58\u5728\uff0c\u82e5\u5b58\u5728 /dev/ttyACMn\uff08n\u4e3a\u4efb\u610f\u6570\u5b57\uff09\uff0c\u91cd\u542f\u7535\u8111\u89e3\u51b3\u3002 2\u3001Error response from daemon: Container 5e700fdc769e8c74666d68a7f2bc3de58268b4594cf88706609d59f8dbc7362d is not running \u5bb9\u5668\u542f\u52a8\u5931\u8d25 1\uff09\u68c0\u67e5\u54ea\u4e00\u4e2a\u5bb9\u5668\u672a\u542f\u52a8 sudo docker container ls # \u5217\u51fa\u8fd0\u884c\u4e2d\u7684 Docker \u5bb9\u5668\n 2\uff09\u7f3a\u5c11 uos \u5bb9\u5668\uff0c\u68c0\u67e5 USB \u4e32\u53e3\u8fde\u63a5\u7ebf\u548c\u91c7\u96c6\u76d2\u8fde\u63a5\u7ebf\u662f\u5426\u6b63\u5e38\uff0c\u91cd\u542f\u540e\u6267\u884c bash install/setup.up # \u91cd\u65b0\u5b8c\u6574\u90e8\u7f72\u73af\u5883\n \u6216\u6267\u884c sudo docker-compose up -d --build # \u4ec5\u91cd\u65b0\u6784\u5efa Docker \u955c\u50cf\n 3\u3001\u82e5\u90e8\u7f72\u65f6\u63d0\u793a\u6302\u8f7d ttyACM0\u3001video0 \u5931\u8d25\uff0c\u8bf7\u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u53ca\u91c7\u96c6\u76d2\u662f\u5426\u63a5\u89e6\u826f\u597d\uff0c\u82e5\u63a5\u89e6\u826f\u597d\uff0c\u91cd\u542f\u5373\u53ef\u89e3\u51b3\u3002 4\u3001\u82e5\u51fa\u73b0\u56fe\u7247\u80fd\u8bc6\u522b\uff0c\u4f46\u662f\u9f20\u6807\u672a\u79fb\u52a8\u64cd\u4f5c\u65f6\uff0c\u5b89\u88c5\u7edd\u5bf9\u9f20\u6807\u64cd\u4f5c\u7684\u4f9d\u8d56\u5305\uff0c\u89c1\u7b2c\u4e09\u8282\u7b2c\u4e8c\u5c0f\u8282\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u6d4b\u8bd5\u673a\u3002 5\u3001\u7531\u4e8e\u901a\u8fc7\u91c7\u96c6\u5361\u83b7\u53d6\u7684\u6d4b\u8bd5\u673a\u5b9e\u65f6\u753b\u9762\uff0c\u5305\u542b\u4e86\u9f20\u6807\u7684\u6837\u5f0f\uff0c\u6240\u4ee5\u5bf9\u56fe\u7247\u8bc6\u522b\u65f6\uff0c\u9f20\u6807\u82e5\u505c\u7559\u5728\u56fe\u6807\u4e0a\u5c42\uff0c\u5219\u4f1a\u5bf9\u8bc6\u522b\u7ed3\u679c\u9020\u6210\u5f71\u54cd\uff0c\u9700\u8981\u5c06\u9f20\u6807\u79fb\u52a8\u81f3\u5176\u4ed6\u4f4d\u7f6e\uff0c\u6216\u8005\u9690\u85cf\u9f20\u6807\u89e3\u51b3\u3002 6\u3001Excel \u62a5\u544a\u4e2d\uff0c\u6d4b\u8bd5\u573a\u666f\u5217\u4e0e\u7528\u4f8b\u4e2d\u7684\u4e0d\u4e00\u81f4\uff0c\u5173\u952e\u5b57scene\u3001app_name\u3001\u67b6\u6784\u522b\u540d\uff0c\u4e0d\u80fd\u5305\u542b\u4e0b\u5212\u7ebf\u548c\u82f1\u6587\u7b26\u53f7\u7684\u5706\u62ec\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/","title":"\u6846\u67b6\u529f\u80fd\u4ecb\u7ecd","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2023/1/12\n# Author : Mikigo\n# =============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_2","title":"\u4e00\u3001\u4e00\u53e5\u8bdd\u7b80\u4ecb","text":"\u6b64\u6587\u6863\u4e3b\u8981\u60f3\u5bf9 YouQu \u6846\u67b6\u4e00\u4e9b\u91cd\u70b9\u7684\u529f\u80fd\u505a\u8be6\u7ec6\u7684\u4ecb\u7ecd\uff0c\u5305\u62ec\u5bf9\u4e00\u4e9b\u529f\u80fd\u5f00\u53d1\u7684\u80cc\u666f\u3001\u8981\u89e3\u51b3\u7684\u95ee\u9898\u3001\u5b9e\u73b0\u903b\u8f91\u3001\u4ee3\u7801\u7b49\u65b9\u9762\u7684\u4ecb\u7ecd\uff0c\u4ee5\u6b64\u8ba9\u5927\u5bb6\u80fd\u66f4\u52a0\u6e05\u6670\u7684\u7406\u89e3\u5404\u9879\u529f\u80fd\uff0c\u4ece\u800c\u5728\u4f7f\u7528\u7684\u65f6\u5019\u80fd\u66f4\u52a0\u7684\u5f97\u5fc3\u5e94\u624b\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_3","title":"\u4e8c\u3001\u56fe\u50cf\u8bc6\u522b","text":"\u56fe\u50cf\u8bc6\u522b\u5728 UI \u81ea\u52a8\u5316\u4e2d\u662f\u4e0d\u53ef\u7f3a\u5c11\u7684\uff0c\u5e02\u9762\u4e0a\u751a\u81f3\u6709\u5b8c\u5168\u57fa\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\uff0c\u6bd4\u5982 Airtest\u3001Sikuli \u7b49\uff0c\u5728\u6e38\u620f\u7b49\u7279\u5b9a\u9886\u57df\u4e5f\u6709\u4e0d\u9519\u7684\u6548\u679c\uff0c\u8fd9\u4e9b\u5de5\u5177\u5b9e\u9645\u4e0a\u4e5f\u662f\u7528\u7684 OpenCV \u8fdb\u884c\u4e86\u5c01\u88c5\uff0cYouQu \u6846\u67b6\u57fa\u4e8e OpenCV \u5f00\u53d1\u4e86\u81ea\u5df1\u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\uff0c\u5b83\u53ef\u4ee5\u65b9\u4fbf\u7684\u7528\u4e8e\u754c\u9762\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u65ad\u8a00\uff1b YouQu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u51e0\u4e4e\u6ee1\u8db3\u4e86\u4f60\u7684\u6240\u6709\u8981\u6c42\uff0c\u6211\u4eec\u5728\u957f\u65f6\u95f4\u7684\u601d\u8003\u548c\u6478\u7d22\u4e2d\uff0c\u9488\u5bf9\u5e38\u89c4\u573a\u666f\u53ca\u4e00\u4e9b\u7279\u6b8a\u573a\u666f\u63a2\u7d22\u9664\u4e86\u4e00\u4e9b\u5b9e\u7528\u4e14\u6709\u6548\u7684\u65b9\u6848\uff0c\u4e14\u542c\u6211\u6162\u6162\u9053\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1","title":"1\u3001\u5e38\u89c4\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5e38\u89c4\u8bc6\u522b\u5f88\u597d\u7406\u89e3\uff0c\u4e00\u53e5\u8bdd\u8bb2\u5c31\u662f\uff0c\u8981\u83b7\u53d6\u5230\u76ee\u6807\u5143\u7d20\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u3002 \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u5728\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u9700\u8981\u83b7\u53d6\u7684\u5750\u6807\u662f\u76f8\u5bf9\u4e8e\u6574\u4e2a\u5c4f\u5e55\u7684\u5750\u6807\uff0c\u6211\u4eec\u53ef\u4ee5\u622a\u53d6\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u56fe\u7247\uff08screen\uff09\uff1b \u5728\u5143\u7d20\u8bc6\u522b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u622a\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5c0f\u56fe\u8fdb\u884c\u8bc6\u522b\uff0c\u6bd4\u5982\u622a\u53d6\u64ad\u653e\u6309\u94ae\uff1a \u90a3\u4e48\u5b9e\u9645\u4e0a\uff0c\u5143\u7d20\u5b9a\u4f4d\u7684\u95ee\u9898\u5c31\u8f6c\u6362\u4e3a\uff0c\u5c06\u622a\u56fe\u7684\u5c0f\u56fe\uff08play_btn\uff09\u62ff\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u5927\u56fe\uff08screen\uff09\u4e2d\u53bb\u505a\u5339\u914d\uff0c\u5982\u679c\u5339\u914d\u6210\u529f\uff0c\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff08 x, y \uff09\u5373\u53ef\u3002 \u4e3a\u4e86\u65b9\u4fbf\u63cf\u8ff0\uff0c\u4ee5\u4e0b\u6211\u5c06\u6574\u4e2a\u5c4f\u5e55\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5927\u56fe\uff0c\u67d0\u4e2a\u5143\u7d20\u56fe\u7247\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5c0f\u56fe\u3002 \u57fa\u4e8e OpenCV \u7684\u6a21\u677f\u5339\u914d cv.matchTemplate() \u529f\u80fd\uff0c\u6211\u4eec\u5b9e\u73b0\u4e86\u56fe\u50cf\u5b9a\u4f4d\u7684\u529f\u80fd\uff0c\u6846\u67b6\u63d0\u4f9b\u4e86\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u5e95\u5c42\u63a5\u53e3\uff08\u4e00\u822c\u4e0d\u5bf9\u4e0a\u5c42\u63d0\u4f9b\u8c03\u7528\uff09\uff1a def _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\n# \u8be6\u7ec6\u4ee3\u7801\u592a\u957f\u4e0d\u8d34\u4e86\uff0c\u611f\u5174\u8da3\u8bf7\u67e5\u770b\u6e90\u7801\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001image_path image_path \u662f\u5c0f\u56fe\u7684\u7edd\u5bf9\u8def\u5f84; \u901a\u5e38\u5728 AT \u5de5\u7a0b\u91cc\u9762\uff0c\u6211\u4eec\u7ea6\u5b9a\u5c06\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u5b9e\u9645\u7684\u5143\u7d20\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1aplay_btn.png \uff1b \u7528\u4e8e\u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 case/assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1amusic_001.png \uff1b \u8fd9\u6837\u662f\u4e3a\u4e86\u65b9\u4fbf\u7ba1\u7406\u548c\u7ef4\u62a4\u3002 2\u3001rate \u56fe\u50cf\u8bc6\u522b\u7684\u7684\u5339\u914d\u5ea6\u6216\u8005\u8bf4\u76f8\u4f3c\u5ea6\uff0c\u6846\u67b6\u9ed8\u8ba4\u7684\u914d\u7f6e\u4e3a 0.9\uff0c\u4e5f\u5c31\u662f\u8bf4\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u5b58\u5728\u4e00\u4e2a\u76f8\u4f3c\u5ea6 90% \u7684\u56fe\u6807\u5373\u8fd4\u56de\u5176\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff1b \u5982\u679c\u4f60\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u8c03\u6574\u8bc6\u522b\u5ea6\uff0c\u4f60\u53ef\u4ee5\u5728\u8c03\u7528\u51fd\u6570\u7684\u65f6\u5019\uff0c\u4f20\u5165\u4e0d\u540c\u7684\u8bc6\u522b\u5ea6\u7684\u503c\u3002 3\u3001multiple \u9ed8\u8ba4\u60c5\u51b5\u4e0b multiple=False\uff0c\u8868\u793a\u53ea\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u7b2c\u4e00\u4e2a\uff0c\u5982\u679c multiple=True \u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\uff0c\u56e0\u4e3a\u5927\u56fe\u4e2d\u53ef\u80fd\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u5c0f\u56fe\uff0c\u5728\u67d0\u4e9b\u573a\u666f\u4e0b\u4f60\u53ef\u80fd\u9700\u8981\u5168\u90e8\u83b7\u53d6\u5230\u6240\u6709\u5339\u914d\u5230\u7684\u5750\u6807\u3002 4\u3001picture_abspath \u9ed8\u8ba4\u60c5\u51b5\u4e0b picture_abspath=None \u8868\u793a\u5927\u56fe\u4e3a\u622a\u53d6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u5982\u679c\u4f60\u4e0d\u5e0c\u671b\u5927\u56fe\u662f\u5c4f\u5e55\u7684\u622a\u56fe\uff0c\u800c\u662f\u4f60\u81ea\u5b9a\u4e49\u4f20\u5165\u7684\u67d0\u4e2a\u56fe\u7247\uff0c\u4f60\u53ea\u9700\u8981\u5c06\u4f60\u7684\u56fe\u7247\u8def\u5f84\u4f20\u9012\u7ed9\u8fd9\u4e2a\u53c2\u6570\u5c31\u884c\uff0c\u6bd4\u5982\uff1a picture_abspath=\"~/Desktop/big.png\" \uff1b 5\u3001screen_bbox \u5927\u56fe\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u622a\u53d6\u6574\u4e2a\u5c4f\u5e55\uff0cscreen_bbox = [x, y, w, h] \u53ef\u4ee5\u6307\u5b9a\u622a\u53d6\u5c4f\u5e55\u4e2d\u7684\u56fa\u5b9a\u533a\u57df\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\uff0c\u53ef\u4ee5\u6392\u9664\u90e8\u5206\u533a\u57df\u5bf9\u8bc6\u522b\u7ed3\u679c\u7684\u5f71\u54cd\u3002 \u3010\u9690\u5f0f\u7b49\u5f85\u3011 \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\uff0c\u6709\u65f6\u5019\u9875\u9762\u8df3\u8f6c\u6709\u5ef6\u65f6\uff0c\u6709\u53ef\u80fd\u5b58\u5728\u8bc6\u522b\u7684\u90a3\u4e00\u523b\u9875\u9762\u4e5f\u6ca1\u6709\u8df3\u8f6c\u51fa\u6765\uff0c\u6216\u8005\u6216\u8005\u8bc6\u522b\u7684\u90a3\u4e00\u523b\uff1b \u56e0\u6b64\u6211\u4eec\u9700\u8981\u4e00\u79cd\u7b49\u5f85\u673a\u5236\uff0c\u5373\u5728\u4e00\u5b9a\u7684\u65f6\u95f4\u5185\uff0c\u5982\u679c\u8bc6\u522b\u4e0d\u5230\uff0c\u91cd\u590d\u53bb\u8bc6\u522b\uff1a def find_image(\ncls,\n*widget, rate: [float, int] = None,\nmultiple: bool = False,\nmatch_number: int = None,\npicture_abspath: str = None,\nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u5728\u5c4f\u5e55\u4e2d\u533a\u5bfb\u627e\u5c0f\u56fe\uff0c\u8fd4\u56de\u5750\u6807\uff0c\n \u5982\u679c\u627e\u4e0d\u5230\uff0c\u6839\u636e\u914d\u7f6e\u91cd\u8bd5\u6b21\u6570\uff0c\u6bcf\u6b21\u95f4\u96941\u79d2\n :param widget: \u6a21\u677f\u56fe\u7247\u8def\u5f84\n :param rate: \u76f8\u4f3c\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param match_number: \u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\n :return: \u5750\u6807\u5143\u7ec4\n \"\"\"\nif rate is None:\nrate = float(GlobalConfig.IMAGE_RATE)\ntry:\nfor element in widget:\nfor _ in range((match_number or int(GlobalConfig.IMAGE_MATCH_NUMBER)) + 1):\nlocate = cls._match_image_by_opencv(\nelement,\nrate,\nmultiple=multiple,\npicture_abspath=picture_abspath,\nscreen_bbox=screen_bbox\n)\nif not locate:\nsleep(int(GlobalConfig.IMAGE_MATCH_WAIT_TIME))\nelse:\nreturn locate\nraise TemplateElementNotFound(*widget)\nexcept Exception as e:\nraise e\n \u53c2\u6570 match_number \u7528\u4e8e\u63a7\u5236\u91cd\u590d\u8bc6\u522b\u7684\u6b21\u6570\uff0c\u9ed8\u8ba4\u4e0d\u4f20\u53c2\uff0c\u53d6\u5168\u5c40\u914d\u7f6e setting/globalconfig.ini \u91cc\u9762\u7684 IMAGE_MATCH_NUMBER \u914d\u7f6e\u9879\u7684\u503c\uff0c\u9ed8\u8ba4IMAGE_MATCH_NUMBER = 1\uff0c\u5373\u91cd\u8bd5 1 \u6b21\uff1b find_image \u662f\u6846\u67b6\u63d0\u4f9b\u7684\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u51fd\u6570\u63a5\u53e3\uff0c\u8fd9\u4e2a\u51fd\u6570\u63d0\u4f9b\u4e86\u9690\u5f0f\u7b49\u5f85\u7684\u529f\u80fd\uff0c\u4e14\u5305\u542b\u4e0a\u9762\u4ecb\u7ecd\u7684 _match_image_by_opencv \u51fd\u6570\u7684\u6240\u6709\u529f\u80fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2","title":"2\u3001\u6c14\u6ce1\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u6c14\u6ce1\u8bc6\u522b\u6307\u7684\u662f\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\u8981\u5b9a\u4f4d\u7684\u5143\u7d20\u662f\u4e00\u4e9b\u4f1a\u6d88\u5931\u7684\u5c0f\u5f39\u7a97\uff0c\u8fd9\u7c7b\u573a\u666f\u5728\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\u5c31\u53ef\u80fd\u5b58\u5728\u4e0d\u7a33\u5b9a\u6027\uff0c\u6709\u53ef\u80fd\u56fe\u50cf\u8bc6\u522b\u7684\u65f6\u5019\u6c14\u6ce1\u5df2\u7ecf\u6d88\u5931\u4e86\uff0c\u4e5f\u6709\u53ef\u80fd\u6c14\u6ce1\u51fa\u73b0\u7684\u65f6\u95f4\u592a\u77ed\u4e86\uff0c\u4e0d\u5bb9\u6613\u6355\u6349\u5230\uff0c\u5c31\u50cf\u6c14\u6ce1\u4e00\u6837\uff0c\u51fa\u73b0\u4e00\u4e0b\u5c31\u6d88\u5931\uff0c\u56e0\u6b64\u6211\u4eec\u5f62\u8c61\u7684\u79f0\u4e4b\u4e3a \u201c\u6c14\u6ce1\u8bc6\u522b\u201d\uff1b \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u4e3a\u4e86\u80fd\u7a33\u5b9a\u7684\u8bc6\u522b\u6c14\u6ce1\u7c7b\u573a\u666f\uff0c\u6211\u4eec\u91c7\u7528\u7684\u65b9\u6848\u662f\uff1a \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\uff08\u5305\u542b\u6c14\u6ce1\u4ece\u51fa\u73b0\u5230\u6d88\u5931\uff09\uff0c\u4e0d\u505c\u7684\u622a\u53d6\u8fd9\u6bb5\u65f6\u95f4\u5185\u7684\u5927\u56fe\uff0c\u4ee5\u6b64\u786e\u4fdd\u5728\u622a\u53d6\u7684\u4e00\u5806\u56fe\u7247\u4e2d\uff0c\u80af\u5b9a\u6709\u81f3\u5c11\u4e00\u5f20\u56fe\u7247\u80fd\u6355\u6349\u5230\u6c14\u6ce1\uff0c\u6700\u540e\u518d\u5bf9\u8fd9\u4e00\u5806\u56fe\u7247\u9010\u4e2a\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def get_during(\ncls,\nimage_path: str,\nscreen_time: [float, int],\nrate: float = None,\npause: [int, float] = None,\nmax_range: int = 10000\n):\n\"\"\"\n \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u622a\u56fe\u591a\u5f20\u56fe\u7247\u8fdb\u884c\u8bc6\u522b\uff0c\u5176\u4e2d\u6709\u4e00\u5f20\u56fe\u7247\u8bc6\u522b\u6210\u529f\u5373\u8fd4\u56de\u7ed3\u679c;\n \u9002\u7528\u4e8e\u6c14\u6ce1\u7c7b\u7684\u65ad\u8a00\uff0c\u6bd4\u5982\u6c14\u6ce1\u57281\u79d2\u5185\u6d88\u5931\uff0c\u5982\u679c\u7528\u5e38\u89c4\u7684\u56fe\u50cf\u8bc6\u522b\u5219\u6709\u53ef\u80fd\u65e0\u6cd5\u8bc6\u522b\u5230\uff1b\n :param image_path: \u8981\u8bc6\u522b\u7684\u6a21\u677f\u56fe\u7247\uff1b\n :param screen_time: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff1b\n :param rate: \u8bc6\u522b\u7387\uff1b\n :param pause: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u4e0d\u95f4\u9694\uff1b\n :param max_range: \u622a\u56fe\u7684\u6700\u5927\u6b21\u6570\uff0c\u8fd9\u662f\u4e00\u4e2a\u9884\u8bbe\u503c\uff0c\u4e00\u822c\u60c5\u51b5\u4e0b\u4e0d\u6d89\u53ca\u4fee\u6539\uff1b\n \"\"\"\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001screen_time \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5728\u6b64\u65f6\u95f4\u5185\u4f1a\u4e0d\u65ad\u7684\u8fdb\u884c\u622a\u56fe\u64cd\u4f5c\uff0c\u5c31\u50cf\u5f55\u5236\u89c6\u9891\u4e00\u6837\uff1b 2\u3001pause \u6bcf\u6b21\u622a\u53d6\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u4e00\u523b\u4e0d\u505c\u7684\u622a\u56fe\uff0c\u5982\u679c\u4f60\u60f3\u6bcf\u6b21\u622a\u56fe\u5b58\u5728\u4e00\u4e9b\u95f4\u9694\u65f6\u95f4\u4f20\u5165\u5bf9\u5e94\u7684\u65f6\u95f4\u95f4\u9694\u5373\u53ef\uff0c\u5355\u4f4d\u662f\u79d2\uff0c\u6bd4\u5982\uff1apause = 0.03\uff0c\u8868\u793a 30 ms\uff0c\u76f8\u5f53\u4e8e\u5e27\u7387\u4e3a 30 \u5e27\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-opencv","title":"3\u3001\u4e0d\u4f9d\u8d56 OpenCV \u7684\u56fe\u50cf\u8bc6\u522b\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31","title":"3.1\u3001\u81ea\u7814\u56fe\u50cf\u8bc6\u522b\u6280\u672f","text":"\u3010\u539f\u7406\u3011 \u4e3a\u4e86\u5b9e\u73b0\u8bc6\u522b\u56fe\u50cf\u7684\u76ee\u7684\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u5c06\u56fe\u7247\u7684\u6bcf\u4e2a\u50cf\u7d20\u7684RGB\u503c\uff0c\u4e0e\u6574\u4e2a\u5c4f\u5e55\u4e2d\u7684RGB\u8fdb\u884c\u5bf9\u6bd4\uff0c\u5982\u679c\u5c0f\u56fe\u4e0a\u7684RGB\u503c\u4e0e\u5bf9\u5e94\u5927\u56fe\u4f4d\u7f6e\u7684RGB\u90fd\u76f8\u7b49\uff0c\u5219\u5339\u914d\u6210\u529f\uff0c\u5373\u53ef\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u70b9\u3002 1\u3001\u8bfb\u53d6\u5c0f\u56fe\u548c\u5927\u56fe\u7684RGB\u503c \uff081\uff09\u5c0f\u56fe\u7684RGB\u503c small_data = small_pic.load() # load()\u4f1a\u5c06\u56fe\u7247\u7684RGB\u503c\u83b7\u53d6\u5230\uff0c\u6570\u636e\u683c\u5f0f\u4e3a\u4e00\u4e2a\u4e8c\u7ef4\u5217\u8868\uff0c\u8d4b\u503c\u7ed9\u4e00\u4e2a\u53d8\u91cfsmall_data\u3002\n \uff082\uff09\u5927\u56fe\u7684RGB\u503c big_data = big_pic.load()\n 2\u3001\u5c06\u5c0f\u56fe\u4e0e\u5927\u56fe\u7684RGB\u503c\u8fdb\u884c\u5339\u914d \uff081\uff09\u5339\u914d\u4ece\u5927\u56fe\u7684\u5750\u6807\uff080\uff0c0\uff09\u5f00\u59cb\u5339\u914d\uff0c\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff082\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\uff080\uff0c0\uff09\u5bf9\u5e94\u7684\u6240\u6709\u5c0f\u56fe\u7684RGB\u503c\u4e0d\u76f8\u7b49\uff0c\u5219\u79fb\u52a8\u5230\u4e0b\u4e00\u4e2a\u5750\u6807\u70b9\uff081\uff0c0\uff09\uff0c\u540c\u6837\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff083\uff09\u6309\u7167\u8fd9\u6837\u7684\u89c4\u5f8b\u5c06\u8fd9\u4e00\u884c\u6bcf\u79fb\u52a8\u4e00\u4e2a\u5750\u6807\u70b9\uff0c\u90fd\u5c06\u5c0f\u56fe\u6240\u6709\u7684RGB\u4e0e\u5bf9\u5e94\u5927\u56fe\u7684\u503c\u8fdb\u884c\u5339\u914d\uff1b \uff084\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\u5176\u4e2d\u4e00\u4e2a\u5750\u6807\u70b9\u4e0a\u5339\u914d\u5230\u4e86\u5c0f\u56fe\u7684\u6240\u6709RGB\u503c\uff0c\u5219\u6b64\u65f6\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\u70b9\uff1b \uff085\uff09\u5982\u679c\u5339\u914d\u4e86\u5927\u56fe\u6240\u6709\u7684\u5750\u6807\u70b9\uff0c\u90fd\u6ca1\u6709\u5339\u914d\u5230\uff0c\u5219\u8bf4\u660e\u5927\u56fe\u4e2d\u4e0d\u5b58\u5728\u5c0f\u56fe\uff0c\u5339\u914d\u5931\u8d25\uff1b \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 class ImageRgb:\n@staticmethod\ndef _check_match(_x, _y, small, bdata, sdata, rate):\n\"\"\"\n Matching degree of small graph and large graph matching\n \"\"\"\n@staticmethod\ndef _pre_random_point(small):\n\"\"\"\n Pre matching, take 10-20 points at random each time,\n and take coordinates randomly in the small graph\n \"\"\"\n@staticmethod\ndef _pre_random_match(_x, _y, point_list, bdata, sdata, rate):\n\"\"\"\n In the small graph, several points are randomly\n selected for matching, and the matching degree is\n also set for the random points\n \"\"\"\n@classmethod\ndef match_image_by_rgb(cls, image_name=None, image_path=None, rate=0.9):\n\"\"\"\n By comparing the RGB values of the small image with the large\n image on the screen, the coordinates of the small image on\n the screen are returned.\n \"\"\"\n \u901a\u8fc7 match_image_by_rgb() \u8fd9\u4e2a\u51fd\u6570\uff0c\u4f20\u5165\u76ee\u6807\u5c0f\u56fe\u7684\u6587\u4ef6\u540d\u79f0\uff0c\u5373\u53ef\u8fd4\u56de\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u3002 \u6709\u540c\u5b66\u8981\u95ee\u4e86\uff0c\u6709 OpenCV \u5e72\u561b\u4e0d\u7528\uff0c\u6709\u5fc5\u8981\u81ea\u5df1\u5b9e\u73b0\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u529f\u80fd\u5417\uff0c\u4f60\u4eec\u662f\u4e0d\u662f\u95f2\u7684\u554a\uff1f \u8fd9\u4e48\u95ee\u7684\u8bdd\uff0c\u5c0f\u4e86\uff0c\u683c\u5c40\u5c0f\u4e86\uff1b\u6211\u4eec\u81ea\u5df1\u5b9e\u73b0\u4e3b\u8981\u6709\u51e0\u65b9\u9762\u539f\u56e0\uff1a \u51cf\u5c11\u73af\u5883\u4f9d\u8d56\uff0c\u5373\u4e0d\u7528\u5b89\u88c5 OpenCV\uff0c\u6211\u4eec\u4e5f\u80fd\u5b9e\u73b0\u5176\u529f\u80fd\uff0c\u73af\u5883\u4f9d\u8d56\u8fd9\u5757\u540e\u9762\u4f1a\u5355\u72ec\u8be6\u7ec6\u8bb2\uff0c\u51cf\u5c11\u73af\u5883\u4f9d\u8d56\u5bf9\u4e8e\u4efb\u4f55\u8f6f\u4ef6\u5de5\u7a0b\u90fd\u975e\u5e38\u91cd\u8981\uff1b OpenCV \u5728\u5176\u4ed6\u56fd\u4ea7 CPU \u67b6\u6784\u4e0a\u5b89\u88c5\u5e76\u4e0d\u80fd\u4fdd\u8bc1100%\u6210\u529f\uff0c\u751a\u81f3\u6709\u6ca1\u6709\u53ef\u80fd\u5728\u4e00\u4e9b\u67b6\u6784\u4e0a\u538b\u6839\u513f\u5c31\u4e0d\u80fd\u5b89\u88c5\u4f7f\u7528 OpenCV \uff1f \u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 OpenCV \uff1f\u5c31\u50cf\u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 Windows \u5462\uff1f\u8fd9\u4e9b\u95ee\u9898\u503c\u5f97\u601d\u8003\u3002 \u5f53\u7136\uff0c\u6211\u4eec\u627f\u8ba4\u8fd9\u5957\u65b9\u6848\uff0c\u867d\u7136\u8bc6\u522b\u51c6\u786e\u7387\u6ca1\u95ee\u9898\uff0c\u4f46\u5728\u8bc6\u522b\u6548\u7387\u4e0a\u8fd8\u6ca1\u6709\u8fbe\u5230 OpenCV \u6a21\u677f\u5339\u914d\u7684\u6548\u679c\uff0c\u6211\u4eec\u7684\u65b9\u6848\u6bcf\u6b21\u8bc6\u522b\u5728 1.5s \u5de6\u53f3\uff0c\u800c OpenCV \u5728 1s \u5de6\u53f3\uff1b \u6574\u4f53\u8bc6\u522b\u6548\u679c\u6765\u8bb2\uff0c\u6211\u8ba4\u4e3a\u8fd8\u662f\u53ef\u4ee5\u63a5\u53d7\u7684\uff0c\u4e5f\u5e0c\u671b\u6709\u5fd7\u4e4b\u58eb\u80fd\u4e00\u8d77\u4f18\u5316\u6b64\u65b9\u6848\uff0c\u4e00\u8d77\u6280\u672f\u62a5\u56fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32-rpc","title":"3.2\u3001\u57fa\u4e8e RPC \u670d\u52a1\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b","text":"\u5728\u8fdc\u7a0b\u670d\u52a1\u5668\u4e0a\u90e8\u7f72 OpenCV \u7684\u73af\u5883\uff0c\u5e76\u5c06\u5176\u90e8\u7f72\u4e3a RPC \u670d\u52a1\uff0c\u6d4b\u8bd5\u673a\u4e0a\u4e0d\u7528\u5b89\u88c5 OpenCV \u4f9d\u8d56\uff0c\u800c\u662f\u901a\u8fc7\u8bf7\u6c42 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u3010\u539f\u7406\u3011 \u6d4b\u8bd5\u673a\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u56fe\u7247\u4ee5\u53ca\u6a21\u677f\u56fe\u7247\uff0c\u53d1\u9001\u7ed9 RPC \u670d\u52a1\u7aef\uff0c\u670d\u52a1\u7aef\u62ff\u5230\u4e24\u5f20\u56fe\u7247\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u6700\u540e\u5c06\u8bc6\u522b\u7ed3\u679c\u8fd4\u56de\u7ed9\u6d4b\u8bd5\u673a\uff1b \u8981\u7279\u6b8a\u8bf4\u660e\u7684\u662f\uff1a RPC \u662f\u4e00\u79cd\u534f\u8bae\uff0c\u8bb8\u591a\u8bed\u8a00\u90fd\u662f\u652f\u6301\u7684\uff0c\u6bd4\u5982\u8bf4\u670d\u52a1\u7aef\u4e5f\u53ef\u4ee5\u7528 C++ \u6765\u5b9e\u73b0\uff0c\u5ba2\u6237\u7aef\u4f7f\u7528 Python \u4e5f\u662f\u53ef\u4ee5\u8c03\u7528\u7684\u3002 \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 \u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nimport cv2 as cv\nimport numpy as np\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\nif __name__ == \"__main__\":\nserver = ThreadXMLRPCServer((\"x.x.x.x\", 8889), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(match_image_by_opencv, \"match_image_by_opencv\")\nserver.serve_forever()\n \u8fd9\u6837\uff0c\u6211\u4eec\u57fa\u4e8e Python \u6807\u51c6\u5e93 xmlrpc \u642d\u5efa\u4e86\u4e00\u4e2a RPC \u670d\u52a1\u5668\uff0c\u6ce8\u518c\u4e86 image_put \u548c match_image_by_opencv \u4e24\u4e2a\u529f\u80fd\u63a5\u53e3\uff0c\u5728\u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u901a\u8fc7 IP \u548c\u7aef\u53e3\u8fdb\u884c RPC \u8bf7\u6c42\uff1b \u5ba2\u6237\u7aef\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from xmlrpc.client import Binary\nfrom xmlrpc.client import ServerProxy\nserver = ServerProxy(GlobalConfig.OPENCV_SERVER_HOST, allow_none=True)\nscreen_rb = open(screen, \"rb\")\ntemplate_rb = open(template_path, \"rb\")\ntry:\nscreen_path = server.image_put(Binary(screen_rb.read()))\nscreen_rb.close()\ntpl_path = server.image_put(Binary(template_rb.read()))\ntemplate_rb.close()\nreturn server.match_image_by_opencv(\ntpl_path, screen_path, rate, multiple\n)\nexcept OSError as exc:\nraise EnvironmentError(\nf\"RPC\u670d\u52a1\u5668\u94fe\u63a5\u5931\u8d25. {GlobalConfig.OPENCV_SERVER_HOST}\"\n) from exc\n \u901a\u8fc7\u8fd4\u56de server.match_image_by_opencv \u5c31\u83b7\u53d6\u4e86\u5728\u670d\u52a1\u7aef\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4","title":"4\u3001\u53f3\u952e\u83dc\u5355\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41","title":"4.1\u3001\u53f3\u952e\u83dc\u5355\u5b9a\u4f4d\u7684\u65b9\u6848\u53ca\u95ee\u9898","text":"\u53f3\u952e\u83dc\u5355\u7684\u5143\u7d20\u5b9a\u4f4d\u662f\u4e00\u4e2a\u96be\u70b9\uff0c\u8fc7\u53bb\u6211\u4eec\u8c03\u7814\u548c\u4f7f\u7528\u8fc7\u7684\u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u65b9\u6cd5\u6709 4 \u79cd\uff1a \u7b2c\u4e00\u79cd\uff1a\u6b65\u957f\u64cd\u4f5c\u6cd5 \u5728\u53f3\u952e\u83dc\u5355\u547c\u51fa\u6765\u4e4b\u540e\uff0c\u901a\u8fc7\u952e\u76d8\u7684 up\u3001down \u6309\u952e\uff0c\u8fdb\u884c\u9009\u62e9\u83dc\u5355\u9009\u62e9\uff0c\u9009\u4e2d\u76ee\u6807\u4e4b\u540e enter \u5373\u53ef\uff1b\u6bd4\u5982\uff1a\u5728\u684c\u9762\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\uff0c\u6309 1 \u6b21 down \uff0c\u4f1a\u51fa\u73b0\u4e0b\u56fe\uff1a \u7ee7\u7eed\u518d\u6309 2 \u6b21 down\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u518d\u6309 enter\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u5982\u6b64\uff0c\u201c\u6392\u5e8f\u65b9\u5f0f\u201d\u7684\u6b65\u957f\u4e3a 3\uff1b\u901a\u8fc7\u4f7f\u7528\u952e\u76d8\u4e0a\u4e0b\u952e\uff0c\u5c31\u5b9e\u73b0\u4e86\u5bf9\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\uff1b \u4f46\u662f\uff0c\u8fd9\u79cd\u65b9\u5f0f\u6709\u4e2a\u5f88\u70e6\u4eba\u7684\u95ee\u9898\uff0c\u5c31\u662f\u53f3\u952e\u83dc\u5355\u7684\u9009\u9879\u4f4d\u7f6e\u4e0d\u53ef\u80fd\u4e00\u76f4\u4e0d\u53d8\uff0c\u5728\u9700\u6c42\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\uff0c\u83dc\u5355\u9009\u9879\u7684\u53d8\u5316\u662f\u5f88\u5927\u7684\uff0c\u751a\u81f3\u6709\u4e9b\u5e94\u7528\u652f\u6301\u81ea\u5b9a\u4e49\u83dc\u5355\uff0c\u6bd4\u5982\u6587\u7ba1\u53f3\u952e\u83dc\u5355\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff1b \u4e5f\u5c31\u662f\u8bf4\u4f60\u5f97\u7ecf\u5e38\u53bb\u7ef4\u62a4\u83dc\u5355\u9009\u9879\u7684\u6b65\u957f\uff0c\u4e00\u4e2a\u9009\u9879\u73b0\u5728\u7684\u6b65\u957f\u662f 3\uff0c\u4e0b\u4e2a\u8fed\u4ee3\u53ef\u80fd\u5c31\u662f 4 \u6216\u8005 5\u3002 \u7b2c\u4e8c\u79cd\uff1a\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u6cd5 \u628a\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5355\u72ec\u622a\u56fe\u4fdd\u5b58\uff0c\u56fe\u7247\u4e2d\u4ec5\u5305\u542b\u4e00\u4e2a\u83dc\u5355\u9009\u9879\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u8fd9\u6837\uff0c\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5c31\u53ef\u4ee5\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u65b9\u5f0f\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u8fd9\u79cd\u65b9\u5f0f\u4e0d\u7528\u62c5\u5fc3\u83dc\u5355\u9009\u9879\u7684\u987a\u5e8f\u6216\u4f4d\u7f6e\uff0c\u4f46\u662f\u9700\u8981\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff0c\u4e14\u5bb9\u6613\u53d7\u5230\u5b57\u4f53 UI \u53d8\u66f4\u7c7b\u9700\u6c42\u7684\u5f71\u54cd\uff0c\u6bd4\u5982\uff1a\u5b57\u4f53\u5927\u5c0f\u3001\u5b57\u4f53\u95f4\u8ddd\u7b49\u7b49\u9700\u6c42\u53d8\u66f4\u90fd\u4f1a\u5f71\u54cd\uff0c\u6bcf\u6b21\u53d8\u66f4\u4e4b\u540e\u5c31\u9700\u8981\u8fdb\u884c\u5927\u91cf\u56fe\u7247\u8d44\u6e90\u7684\u91cd\u65b0\u622a\u56fe\u66ff\u6362\uff0c\u662f\u4e2a\u6bd4\u8f83\u9ebb\u70e6\u7684\u4e8b\u60c5\uff1b \u7b2c\u4e09\u79cd\uff1a\u76f8\u5bf9\u4f4d\u79fb\u6cd5 \u9f20\u6807\u70b9\u51fb\u53f3\u952e\u7684\u65f6\u5019\uff0c\u9f20\u6807\u7684\u5f53\u524d\u5750\u6807\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u7684\uff0c\u83dc\u5355\u9009\u9879\u7684\u5bbd\uff08 w \uff09\u4e00\u822c\u662f\u56fa\u5b9a\u7684\uff0c\u53d8\u5316\u7684\u662f\u83dc\u5355\u7684\u957f\u5ea6\uff08 h \uff09\uff0c\u53ef\u4ee5\u901a\u8fc7\u67d0\u4e2a\u9009\u9879\u76f8\u5bf9\u4e8e\u9f20\u6807\u7684\u8ddd\u79bb\u5728\u786e\u5b9a\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u901a\u8fc7\u7ef4\u62a4\u83dc\u5355\u9009\u9879\uff08\u76f8\u5bf9\u4f4d\u7f6e\uff09\u76f8\u5bf9\u4e8e\u9f20\u6807\u4f4d\u7f6e\u7684\u8ddd\u79bb\uff0c\u5373\u53ef\u8f7b\u677e\u8ba1\u7b97\u51fa\u83dc\u5355\u9009\u9879\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\u3002 \u4ece\u7406\u8bba\u4e0a\u6b64\u65b9\u6848\u662f\u53ef\u884c\u7684\uff0c\u4f46\u662f\u8fd9\u91cc\u4ecd\u7136\u5b58\u5728\u4e24\u4e2a\u4e25\u91cd\u7684\u95ee\u9898\uff1a \u83dc\u5355\u987a\u5e8f\u6539\u53d8\uff0c\u5bfc\u81f4\u76f8\u5bf9\u8ddd\u79bb\u6539\u53d8\uff0c\u800c\u4e14\u8ddd\u79bb\u662f\u901a\u8fc7\u50cf\u7d20\uff08px\uff09\u6765\u8868\u793a\u7684\uff0c\u4e0d\u60f3\u6b65\u957f\u90a3\u4e48\u53ea\u7ba1\uff0c\u6bcf\u6b21\u9700\u8981\u53bb\u91cf\u4e00\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u70b9\u9ebb\u70e6\uff1b \u9f20\u6807\u5728\u684c\u9762\u4e0d\u540c\u4f4d\u7f6e\u70b9\u51fb\u53f3\u952e\uff0c\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u4f4d\u7f6e\u662f\u4e0d\u540c\u7684\uff0c\u4e0a\u56fe\u7684\u83dc\u5355\u662f\u5728\u9f20\u6807\u7684\u5de6\u4e0b\u65b9\uff0c\u5982\u679c\u4f60\u79fb\u52a8\u9f20\u6807\u5230\u5c4f\u5e55\u56db\u8fb9\uff0c\u4f60\u4f1a\u53d1\u73b0\uff0c\u53f3\u952e\u83dc\u5355\u53ef\u80fd\u51fa\u73b0\u5728\u9f20\u6807\u7684\u56db\u4e2a\u65b9\u5411\uff0c\u4e5f\u5c31\u662f\u8bf4\u4f60\u9700\u8981\u6839\u636e\u9f20\u6807\u7684\u4e0d\u540c\u4f4d\u7f6e\u6765\u5224\u65ad\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u65b9\u5411\uff0c\u800c\u4e0d\u540c\u7684\u65b9\u5411\u4e0a\u8ba1\u7b97\u65b9\u6cd5\u662f\u4e0d\u540c\u7684\uff0c\u6bd4\u5982\uff1a\u53f3\u952e\u83dc\u5355\u5728\u9f20\u6807\u7684\u5de6\u4e0a\uff0c\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\u8ba1\u7b97\u65b9\u6cd5\u4e3a\uff08x - w / 2\uff0c y - h\uff09\uff0c\u8fd9\u6837\u7ef4\u62a4\u8d77\u6765\u53ef\u4ee5\u8bf4\u975e\u5e38\u590d\u6742\uff1b \u57fa\u4e8e\u4ee5\u4e0a\u4e24\u4e2a\u539f\u56e0\uff0c\u6211\u4eec\u5e76\u4e0d\u63a8\u8350\u8fd9\u79cd\u64cd\u4f5c\u65b9\u6848\u3002 \u7b2c\u56db\u79cd\uff1a\u5c5e\u6027\u5b9a\u4f4d \u6709\u540c\u5b66\u8bf4\u5e72\u561b\u4e0d\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u5462\uff0c\u5176\u5b9e\uff0c\u6211\u4eec\u6700\u5f00\u59cb\u60f3\u5230\u7684\u65b9\u6848\u5c31\u662f\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\uff0c\u4f46\u662f\u5728\u5c5e\u6027\u7684 DOM \u6811\u91cc\u600e\u4e48\u4e5f\u627e\u4e0d\u5230\uff0c\u65e0\u6cd5\u5b9a\u4f4d\u5230\uff0c\u6211\u4eec\u4e5f\u8054\u5408\u7814\u53d1\u540c\u5b66\u4e00\u8d77\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u4f46\u6700\u7ec8\u8fd8\u662f\u6ca1\u80fd\u89e3\u51b3\uff0c\u975e\u5e38\u9057\u61be\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42","title":"4.2\u3001\u6700\u65b0\u7684\u53f3\u952e\u83dc\u5355\u7ec8\u6781\u89e3\u51b3\u65b9\u6848","text":"\u7531\u4e8e\u53f3\u952e\u83dc\u5355\u9009\u9879\u51e0\u4e4e\u90fd\u662f\u6587\u672c\uff0c\u90a3\u4e48\u901a\u8fc7 OCR \u8bc6\u522b\uff0c\u51e0\u4e4e\u662f\u6700\u4f18\u7684\u65b9\u6848\uff1a \u4e0d\u7528\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff1b \u4e0d\u4f1a\u53d7\u5230\u83dc\u5355\u9009\u9879\u987a\u5e8f\u6539\u53d8\u7684\u5f71\u54cd\uff1b \u4e0d\u4f1a\u53d7\u5230\u5b57\u4f53 UI \u53d8\u5316\u7684\u5f71\u54cd\uff1b \u5173\u4e8e OCR \u8bc6\u522b\u6211\u4eec\u5728\u540e\u9762\u4f1a\u8be6\u7ec6\u8bb2\u5230\uff0c\u672c\u7ae0\u8282\u4e3b\u8981\u8bb2\u57fa\u4e8e OCR \u8bc6\u522b\uff0c\u6211\u4eec\u5728\u53f3\u952e\u83dc\u5355\u8bc6\u522b\u4e0a\u7684\u7a81\u7834\u548c\u521b\u65b0\uff1b \u4f7f\u7528 OCR \u8bc6\u522b\u53f3\u952e\u83dc\u5355\u867d\u7136\u5df2\u7ecf\u5f88\u5b8c\u7f8e\u4e86\uff0c\u4f46\u662f\u5728\u4e00\u4e9b\u60c5\u51b5\u4e0b\u4ecd\u7136\u5b58\u5728\u4e00\u70b9\u95ee\u9898\uff0c\u5c31\u662f\u5c4f\u5e55\u4e2d\u51fa\u73b0\u591a\u4e2a\u548c\u83dc\u5355\u9009\u9879\u6587\u5b57\u76f8\u540c\u7684\u6587\u5b57\u65f6\uff0c\u6bd4\u5982\u4e0b\u9762\u8fd9\u79cd\u60c5\u51b5\uff1a \u5c4f\u5e55\u6070\u597d\u51fa\u73b0\u4e86\u4e24\u4e2a\u201c\u590d\u5236\u201d\uff0c\u6b64\u65f6\u8981\u5b9a\u4f4d\u5230\u83dc\u5355\u4e2d\u7684 \u201c\u590d\u5236\u201d\uff0c\u5c31\u9700\u8981\u8fdb\u4e00\u6b65\u505a\u6570\u636e\u5904\u7406\uff0c\u6bd4\u5982\uff1aOCR \u8fd4\u56de 2 \u4e2a\u201c\u590d\u5236\u201d\u7684\u5750\u6807\uff0c\u7528\u4f8b\u91cc\u9762\u6765\u5224\u65ad\u7528\u54ea\u4e2a\uff0c\u4ece\u4e1a\u52a1\u4e0a\u5c06\u5904\u7406\u8d77\u6765\u6bd4\u8f83\u9ebb\u70e6\uff0c\u56e0\u4e3a\u4f60\u5f97\u660e\u786e\u77e5\u9053\u83dc\u5355\u5728\u5de6\u8fb9\u8fd8\u662f\u53f3\u8fb9\uff0c\u7136\u540e\u8fd9\u672c\u8eab\u5c31\u662f\u4e0d\u786e\u5b9a\u7684\uff1b \u600e\u4e48\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u5462\uff0c\u8fd9\u5c31\u8981\u8bf4\u9053\u672c\u7ae0\u7684\u4e3b\u9898\uff1a\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b\u3002 \u3010\u539f\u7406\u3011 \u5728\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u524d\u622a\u4e00\u5f20\u56fe\uff0c\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\u518d\u622a\u53d6\u4e00\u5f20\u56fe\uff0c\u4e24\u5f20\u56fe\u552f\u4e00\u53d8\u5316\u7684\u5c31\u662f\u53f3\u952e\u83dc\u5355\uff0c\u5c06\u5176\u4ed6\u76f8\u540c\u7684\u5730\u65b9\u90fd\u5c4f\u853d\u6389\uff0c\u53ea\u7559\u4e0b\u83dc\u5355\u754c\u9762\uff0c\u5982\u6b64\u5373\u53ef\u6d88\u9664\u5e72\u6270\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u5c06\u4e24\u79cd\u56fe\u505a\u524d\u540e\u5bf9\u6bd4\u63d0\u53d6\u53ef\u4ee5\u5f97\u5230\u8fd9\u6837\u7684\u56fe\uff1a \u4f60\u770b\uff0c\u901a\u8fc7\u524d\u540e\u56fe\u7247\u7684\u5bf9\u6bd4\uff0c\u5c06\u76f8\u540c\u7684\u90e8\u5206\u7ed9\u6d88\u9664\u6389\uff0c\u518d\u8fdb\u884c OCR \u8bc6\u522b\uff0c\u8fd9\u6837\u5c31\u4e0d\u4f1a\u6709\u5e72\u6270\u4e86\uff1b \u4ee3\u7801\u5b9e\u73b0\u8bf7\u67e5\u770b src/filter_image.py \uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def filter_image(action):\n\"\"\"\n \u5bf9\u6bd4\u52a8\u4f5c\u524d\u540e\u4e24\u5f20\u56fe\u7247\uff0c\u63d0\u53d6\u4e0d\u540c\u7684\u90e8\u5206\u751f\u6210\u4e00\u5f20\u65b0\u7684\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u65b0\u56fe\u7247\u7684\u8def\u5f84\n :param action: \u52a8\u4f5c\u51fd\u6570\u7684\u51fd\u6570\u5bf9\u8c61\n :return: \u65b0\u56fe\u7247\u7684\u8def\u5f84\n \"\"\"\n action \u662f\u9f20\u6807\u4e8b\u4ef6\uff0c\u56e0\u4e3a\u6b64\u7c7b\u573a\u666f\u4e0d\u4ec5\u4ec5\u5728\u53f3\u952e\u5b58\u5728\uff0c\u5355\u51fb\u3001\u53cc\u51fb\u7b49\u7b49\uff0c\u53ea\u8981\u64cd\u4f5c\u524d\u540e\u540e\u53d8\u5316\u7684\u90fd\u53ef\u4ee5\uff1a from src.mouse_key import MouseKey\naction = (\nMouseKey.click,\nMouseKey.right_click,\nMouseKey.double_click,\nMouseKey.move_to,\n)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5","title":"5\u3001\u52a8\u6001\u56fe\u50cf\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5728\u684c\u9762\u58c1\u7eb8\u5207\u6362\uff0c\u6216\u770b\u56fe\u3001\u76f8\u518c\u5207\u6362\u56fe\u7247\u7c7b\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u7531\u4e8e\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u662f\u4e0d\u56fa\u5b9a\u7684\uff08\u4e0d\u540c\u7248\u672c\u7684\u7cfb\u7edf\u58c1\u7eb8\u4e0d\u540c\u3001\u58c1\u7eb8\u987a\u5e8f\u4e0d\u540c\uff0c\u770b\u56fe\u76f8\u518c\u5728\u56fe\u7247\u8d44\u6e90\u4e0d\u4e00\u5b9a\u56fa\u5b9a\uff09\uff0c\u90a3\u4e48\u5728\u6d4b\u8bd5\u5207\u6362\u58c1\u7eb8\u6216\u8005\u5207\u6362\u56fe\u7247\u7684\u573a\u666f\u65f6\u5c31\u4f1a\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u4f60\u4e0d\u77e5\u9053\u9884\u671f\u662f\u5565\uff0c\u7528\u4f8b\u64cd\u4f5c\u52a8\u6001\u7684\uff0c\u4e5f\u662f\u6781\u4e0d\u7a33\u5b9a\u3002 \u3010\u539f\u7406\u3011 \u5728\u5207\u6362\u56fe\u7247\u4e4b\u524d\u622a\u56fe\u4fdd\u5b58\u5e76\u8fd4\u56de\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u6b21\u8bc6\u522b\u8fd9\u5f20\u56fe\u7247\uff0c\u5982\u679c\u4e0d\u5b58\u5728\uff0c\u8bf4\u660e\u56fe\u7247\u5df2\u7ecf\u5207\u6362\u4e86\uff1b \u793a\u610f\u56fe\uff1a \u8fd9\u6837\uff0c\u6211\u4eec\u622a\u53d6\u4e86\u5f53\u524d\u56fe\u7247\u4e2d\u6bd4\u8f83\u6709\u4ee3\u8868\u6027\u7684\u4f4d\u7f6e\uff08\u4e00\u53ea\u9e1f\uff09\uff0c\u5728\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u7528\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1a \u6211\u4eec\u518d\u62ff\u7740\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd9\u6837\u5728\u5f53\u524d\u56fe\u7247\u4e2d\uff0c\u5c31\u4e0d\u80fd\u627e\u5230\u8fd9\u53ea\u9e1f\u4e86\uff0c\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u662f False\uff0c\u90a3\u4e48\u4e5f\u5c31\u53ef\u4ee5\u5224\u65ad\u56fe\u7247\u5207\u6362\u662f\u6210\u529f\u7684\u3002 \u4ee3\u7801\u793a\u610f\uff1a def save_temporary_picture(_x: int, _y: int, width: int, height: int):\n\"\"\"\n \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u56fe\u7247\u8def\u5f84\n :param x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n :param y: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n :param width: \u5bbd\u5ea6\n :param height: \u9ad8\u5ea6\n :return: \u56fe\u7247\u8def\u5f84\n \"\"\"\n \u6b64\u51fd\u6570\u7528\u4e8e\u5728\u64cd\u4f5c\u4e4b\u524d\u622a\u56fe\u4e00\u5f20\u4e34\u65f6\u56fe\u7247\uff0c\u8fd4\u56de\u56fe\u7247\u8def\u5f84\uff0c\u6700\u540e\u5728\u65ad\u8a00\u7684\u65f6\u5019\u518d\u5c06\u56fe\u7247\u8def\u5f84\u4f5c\u4e3a\u53c2\u6570\u4f20\u5165\u65ad\u8a00\u8bed\u53e5\u5373\u53ef\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ui","title":"\u4e09\u3001\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_1","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u662f\u6211\u4eec\u81ea\u7814\u7684\u4e00\u79cd\u4f7f\u7528\u7b80\u5355\uff0c\u4e14\u6548\u7387\u6781\u9ad8\u3001\u7a33\u5b9a\u6027\u597d\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u57fa\u4e8e\u5143\u7d20\u6309\u94ae\u5728\u5e94\u7528\u4e2d\u7684\u76f8\u5bf9\u4f4d\u7f6e\uff0c\u52a8\u6001\u83b7\u53d6\u5143\u7d20\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff0c\u9002\u7528\u4e8e\u5404\u79cd\u5c4f\u5e55\u5206\u8fa8\u7387\uff08\u5305\u62ec\u9ad8\u5206\u5c4f\u3001\u5bbd\u5c4f\u3001\u5e26\u9c7c\u5c4f\uff09\uff0c\u5f53\u5143\u7d20\u6309\u94ae\u4f4d\u7f6e\u76f8\u5bf9\u4e8e\u5e94\u7528\u754c\u9762\u4f4d\u7f6e\u53d1\u751f\u4fee\u6539\u4e4b\u540e\uff0c\u53ea\u9700\u8981\u6839\u636e UI \u8bbe\u8ba1\u56fe\u4e0a\u7684\u6e90\u6570\u636e\u4fee\u6539\u5bf9\u5e94\u5750\u6807\u6570\u636e\u5c31\u597d\uff0c\u7ef4\u62a4\u975e\u5e38\u7684\u65b9\u4fbf\u3002 \u6b64\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u9002\u7528\u4e8e\u4e00\u4e9b\u5143\u7d20\u4f4d\u7f6e\u76f8\u5bf9\u4e0e\u5e94\u7528\u754c\u9762\u6bd4\u8f83\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u97f3\u4e50\uff0899% \u7684\u5143\u7d20\u5b9a\u4f4d\u91c7\u7528\u8fd9\u79cd\uff0c\u6548\u679c\u975e\u5e38\u597d\uff09\uff0c\u4e0d\u9002\u7528\u4e8e\u754c\u9762\u4e0d\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u622a\u56fe\u5f55\u5c4f\uff0c\u5f88\u660e\u663e\u4e0d\u9002\u7528\u4e8e\u8fd9\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u3002\u8fd9\u79cd\u5168\u65b0\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u6709\u5b83\u7684\u9002\u7528\u6761\u4ef6\uff0c\u5982\u679c\u4f60\u53d1\u73b0\u4f7f\u7528\u5e38\u89c4\u7684\uff08\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u5b9a\u4f4d\uff09\u4e0d\u597d\u505a\u65f6\uff0c\u4e0d\u59a8\u8003\u8651\u4f7f\u7528\u8fd9\u79cd\uff0c\u5176\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff0c\u5e76\u4e14\u8fc5\u901f\u7231\u4e0a\u4ed6\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_1","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5728 UI \u8bbe\u8ba1\u56fe\u4e2d\u6211\u4eec\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u8fb9\u6846\u7684\u8ddd\u79bb\u7684\uff0c\u7136\u540e\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u6280\u672f\u624b\u6bb5\u83b7\u53d6\u5230\u5e94\u7528\u754c\u9762\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u53ca\u5e94\u7528\u7a97\u53e3\u7684\u5927\u5c0f\uff0c\u793a\u610f\u56fe\u5982\u4e0b\uff1a \uff08x1, y1\uff09\u4e3a\u5e94\u7528\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\uff1b\uff08x2, y2\uff09\u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u5de6\u4e0a\u89d2\uff08x1, y1\uff09\u7684\u5750\u6807\uff0c\u90a3\u4e48\u5b9e\u9645\u4e0a\u3010\u64ad\u653e\u6240\u6709\u3011\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\u4e3a\uff1a\uff08 x1 + x2, y1 + y2 \uff09\uff1b \u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5927\u5c0f\uff08w2, h2\uff09\uff0c\u53ef\u4ee5\u4ece UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\uff1b \u5728 UI \u8bbe\u8ba1\u7a3f\u4e0a\u70b9\u51fb\u3010\u64ad\u653e\u6240\u6709\u3011\u56fe\u6807\uff0c\u7136\u540e\u79fb\u52a8\u9f20\u6807\u5c31\u5c31\u53ef\u4ee5\u770b\u5230\u4e0a\u56fe\u7684\u53c2\u8003\u7ebf\u53ca\u6570\u636e\uff1b \u6240\u4ee5\uff0c\u6211\u4eec\u53ef\u4ee5\u8f7b\u677e\u7684\u83b7\u53d6\u5230\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u4e2d\u5fc3\u5750\u6807\u4e3a\uff1a\uff08 x1 + x2 + (w2 / 2), y1 + y2 + ( h2 / 2) \uff09 \u8be6\u7ec6\u6e90\u4ee3\u7801\u8bf7\u67e5\u770b AT \u57fa\u7840\u6846\u67b6: src/button_center.py \u83b7\u53d6\u5e94\u7528\u7a97\u53e3\u7684\u4fe1\u606f \u4f7f\u7528 xdotool \u548c xwininfo \u83b7\u53d6\u5230\u5e94\u7528\u7a97\u53e3\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u5de6\u4e0a\u89d2\uff09\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a app_id = CmdCtl.run_cmd(f\"xdotool search --classname --onlyvisible {self.app_name}\"\n).split(\"\\n\")\napp_id_list = [int(_id) for _id in app_id if _id]\nreturn CmdCtl.run_cmd(f\"xwininfo -id {app_id_list[self.number]}\")\n \u4f7f\u7528\u6b63\u5219\u83b7\u53d6\u7a97\u53e3\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u83b7\u53d6\u914d\u7f6e \u8bfb ini \u914d\u7f6e\u6587\u4ef6\uff0c\u83b7\u53d6\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e0e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a conf = ConfigParser()\nconf.read(self.config_path)\ndirection = conf.get(btn_name, \"direction\")\nposition = [int(i.strip()) for i in conf.get(btn_name, \"location\").split(\",\")]\n \u8ba1\u7b97\u5143\u7d20\u6309\u94ae\u5750\u6807 \u6839\u636e\u5e94\u7528\u7a97\u53e3\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u5927\u5c0f\u3001\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u5927\u5c0f\uff0c\u4f7f\u7528\u4e00\u5b9a\u7684\u7b97\u6cd5\u5373\u53ef\u8ba1\u7b97\u51fa\u5143\u7d20\u6309\u94ae\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u4e2d\u5fc3\u5750\u6807\uff09\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3","title":"3\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u3010\u914d\u7f6e\u65b9\u6cd5\u3011 \u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u7684\u6570\u636e\u6e90\u662f\u5e94\u7528\u5e93\u4e2d\u7684 ui.ini \u914d\u7f6e\u6587\u4ef6\uff1a ;section\n[\u65b0\u5efa\u6b4c\u5355+] ;key = value\ndirection = left_top\nlocation = 180, 268, 21, 21\n section \u662f\u4f60\u6839\u636e\u5bf9\u5e94\u7684\u5143\u7d20\u6309\u94ae\u547d\u540d\uff0c\u4f60\u53ef\u4ee5\u4efb\u610f\u547d\u540d\uff0c\u4f46\u6700\u597d\u6709\u5177\u4f53\u542b\u4e49\uff0c\u4e14\u80fd\u660e\u786e\u8868\u793a\u8fd9\u4e2a\u5143\u7d20\u6309\u94ae\u7684\u540d\u79f0\uff1b\u7528\u4e2d\u62ec\u53f7\u62ec\u8d77\u6765\u5c31\u884c\uff0c\u6bd4\u5982\uff1a[\u65b0\u5efa\u6b4c\u5355+] \uff1b direction \u662f\u914d\u7f6e\u8be5\u5143\u7d20\u7684\u53c2\u8003\u7cfb\uff0c\u5206\u522b\u4e3a\uff1a left_top \u5de6\u4e0a\uff1b left_bottom \u5de6\u4e0b\uff1b right_top \u53f3\u4e0a\uff1b right_bottom \u53f3\u4e0b\uff1b \u53c2\u8003\u7cfb\u7684\u9009\u53d6\u6807\u51c6\uff1a\u62c9\u52a8\u6539\u53d8\u7a97\u53e3\u5927\u5c0f\u65f6\uff0c\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u53c2\u8003\u7cfb\u4f4d\u7f6e\u662f\u4e0d\u53d8\u7684\uff1b location \u662f\u8be5\u5143\u7d20\u6309\u94ae\u7684\u76f8\u5bf9\u4e0e\u53c2\u8003\u7cfb\u7684 x, y \u7684\u8ddd\u79bb\uff0c\u53ca\u5927\u5c0f(w, h)\uff0c\u8fd9\u56db\u4e2a\u6570\u636e\u53ef\u4ee5\u901a\u8fc7 UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\u6570\u636e\uff0c\u5728\u7f16\u8f91\u6a21\u5f0f\u4e0b\uff0c\u70b9\u51fb UI \u56fe\u4e0a\u7684\u6309\u94ae\uff0c\u53f3\u4fa7\u5c31\u4f1a\u51fa\u73b0\u8be5\u5143\u7d20\u6309\u94ae\u7684 x, y, w, h \u6570\u636e\u3002 \u5982\u679c UI \u56fe\u4e0a\u6ca1\u6709\u63d0\u4f9b\u4f60\u60f3\u8981\u7684\u5143\u7d20\u6570\u636e\uff0c\u4f60\u53ef\u4ee5\u76f4\u63a5\u5728\u7cfb\u7edf\u4e2d\u4f7f\u7528\u622a\u56fe\u5f55\u5c4f\u8fdb\u884c\u5c3a\u91cf\uff0c\u8fd9\u662f\u4e00\u79cd\u4e0d\u63a8\u8350\u4f46\u80fd\u7528\u7684\u65b9\u6cd5\u3002 \u3010\u8c03\u7528\u65b9\u6cd5\u3011 \u5728\u5e94\u7528\u5e93\u65b9\u6cd5\u5c42\u8fd9\u6837\u5199\uff1a def click_add_music_list_btn_in_music_by_ui(self):\n\"\"\"\u70b9\u51fb\u65b0\u5efa\u6b4c\u5355\u6309\u94ae\"\"\"\nself.click(*self.ui.btn_center(\"\u65b0\u5efa\u6b4c\u5355+\"))\n self.ui.btn_center() \u662f\u56fa\u5b9a\u5199\u6cd5\uff0c\u53c2\u6570\u5c31\u662f\u914d\u7f6e\u91cc\u9762\u7684 section \u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ocr","title":"\u56db\u3001OCR \u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_2","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 OCR \u65b9\u6848\u5927\u591a\u91c7\u7528\u8c37\u6b4c OCR\uff08Tesseract\uff09\u65b9\u6848\uff0c\u4f46\u662f\u5b83\u5bf9\u4e8e\u4e2d\u6587\u7684\u8bc6\u522b\u975e\u5e38\u5dee\uff0c\u7ecf\u8fc7\u5927\u91cf\u7684\u8c03\u7814\uff0c\u6211\u4eec\u4f7f\u7528 PaddleOCR\uff0c\u5b83\u662f\u4e00\u4e2a\u5f00\u6e90\u7684\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u8bc6\u522b\u5de5\u5177\uff0c\u4e5f\u662f PaddlePaddle \u6700\u6709\u540d\u7684\u4e00\u4e2a\u5f00\u6e90\u9879\u76ee\uff0c\u611f\u5174\u8da3\u7684\u53ef\u4ee5\u70b9\u8fd9\u91cc\u4e86\u89e3\uff0c\u591a\u7684\u4e0d\u8bf4\u4e86\uff0c\u4f60\u53ea\u9700\u8981\u77e5\u9053\u5b83\u5c31\u662f\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_2","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5b89\u88c5\u4ed6\u662f\u4e2a\u5f88\u9ebb\u70e6\u7684\u4e8b\u60c5\uff0c\u867d\u7136\u64cd\u4f5c\u5f88\u7b80\u5355\uff0c\u4f46\u5176\u5b9e\u5b89\u88c5\u5305\u6709\u70b9\u5927\uff0c\u56e0\u6b64\u6211\u4eec\u4e0d\u5e0c\u671b\u76f4\u63a5\u5728 env.sh \u4e2d\u52a0\u5165\u5b83\uff0c\u8fd9\u4f1a\u8ba9\u6574\u4e2a\u81ea\u52a8\u5316\u73af\u5883\u53d8\u5f97\u975e\u5e38\u81c3\u80bf\uff1b \u56e0\u6b64\uff0c\u6211\u4eec\u60f3\u5230\u5c06\u5b83\u505a\u6210\u4e00\u4e2a RPC \u670d\u52a1\u5728\u5176\u4ed6\u673a\u5668\u4e0a\u90e8\u7f72\uff0c\u6d4b\u8bd5\u673a\u901a\u8fc7\u8fdc\u7a0b\u8c03\u7528 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u4f7f\u7528\u5b83\uff1b RPC \u7684\u8c03\u7528\u903b\u8f91\uff1a \u8fd9\u6837\u6211\u4eec\u53ea\u9700\u8981\u5728\u670d\u52a1\u7aef\u90e8\u7f72\u597d OCR \u8bc6\u522b\u7684\u670d\u52a1\uff0c\u7136\u540e\u901a\u8fc7 RPC \u670d\u52a1\u5c06\u529f\u80fd\u63d0\u4f9b\u51fa\u6765\uff0c\u6846\u67b6\u91cc\u9762\u53ea\u9700\u8981\u8c03\u7528\u5bf9\u5e94\u7684 RPC \u63a5\u53e3\u5c31\u884c\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_1","title":"3\u3001\u4f7f\u7528\u8bf4\u660e","text":"\u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nfrom paddleocr import PaddleOCR\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef paddle_ocr(pic_path, lang):\n\"\"\"\n Paddleocr\u76ee\u524d\u652f\u6301\u7684\u591a\u8bed\u8a00\u8bed\u79cd\u53ef\u4ee5\u901a\u8fc7\u4fee\u6539lang\u53c2\u6570\u8fdb\u884c\u5207\u6362\n \u4f8b\u5982`ch`, `en`, `fr`, `german`, `korean`, `japan`\n :param file_name:\n :param lang:\n :return:\n \"\"\"\nif __name__ == \"__main__\":\nIP = popen(\"hostname -I\").read().split(\" \")[0]\nPORT = 8890\nSCREEN_CACHE = \"/tmp/screen.png\"\nserver = ThreadXMLRPCServer((IP, PORT), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(paddle_ocr, \"paddle_ocr\")\nprint(\"\u76d1\u542c\u5ba2\u6237\u7aef\u8bf7\u6c42\u3002\u3002\")\nserver.serve_forever()\n \u6846\u67b6\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from src import OCR\nOCR.ocr(*target_strings, picture_abspath=None, similarity=0.6, return_default=False, return_first=False, lang=\"ch\"):\n# \u901a\u8fc7 OCR \u8fdb\u884c\u8bc6\u522b\u3002\n# target_strings:\n# \u76ee\u6807\u5b57\u7b26,\u8bc6\u522b\u4e00\u4e2a\u5b57\u7b26\u4e32\u6216\u591a\u4e2a\u5b57\u7b26\u4e32,\u5e76\u8fd4\u56de\u5176\u5728\u56fe\u7247\u4e2d\u7684\u5750\u6807;\n# \u5982\u679c\u4e0d\u4f20\u53c2\uff0c\u8fd4\u56de\u56fe\u7247\u4e2d\u8bc6\u522b\u5230\u7684\u6240\u6709\u5b57\u7b26\u4e32\u3002\n# picture_abspath: \u8981\u8bc6\u522b\u7684\u56fe\u7247\u8def\u5f84\uff0c\u5982\u679c\u4e0d\u4f20\u9ed8\u8ba4\u622a\u53d6\u5168\u5c4f\u8bc6\u522b\u3002\n# similarity: \u5339\u914d\u5ea6\u3002\n# return_default: \u8fd4\u56de\u8bc6\u522b\u7684\u539f\u751f\u6570\u636e\u3002\n# return_first: \u53ea\u8fd4\u56de\u7b2c\u4e00\u4e2a,\u9ed8\u8ba4\u4e3a False,\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u6240\u6709\u6570\u636e\u3002\n# lang: `ch`, `en`, `fr`, `german`, `korean`, `japan`\n \u6b64\u65b9\u6848\u5728\u6846\u67b6\u5185\u6ca1\u6709\u5f15\u5165\u4efb\u4f55\u4e09\u65b9\u4f9d\u8d56\u5b8c\u5168\u91c7\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\uff0c\u800c\u4e14\u4f7f\u7528\u65b9\u6cd5\u975e\u5e38\u7b80\u5355\uff0c\u53ea\u9700\u8981\u901a\u8fc7 OCR.ocr() \u5373\u53ef\uff1b \u5bf9\u4e8e\u4e00\u4e9b\u6587\u6848\u7684\u573a\u666f\u975e\u5e38\u9002\u7528\uff0c\u6b64\u65b9\u6cd5\u76f4\u63a5\u8fd4\u56de\u5750\u6807\uff0c\u53ef\u4ee5\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u3002 \u4e5f\u53ef\u4ee5\u7528\u4e8e\u6587\u5b57\u65ad\u8a00\uff0c\u4ee3\u7801\u793a\u610f\uff1a def assert_ocr_exist(\n*args, picture_abspath=None, similarity=0.6, return_first=False, lang=\"ch\"\n):\n\"\"\"\u65ad\u8a00\u6587\u6848\u5b58\u5728\"\"\"\npic = None\nif picture_abspath is not None:\npic = picture_abspath + \".png\"\nres = OCR.ocr(\n*args,\npicture_abspath=pic,\nsimilarity=similarity,\nreturn_first=return_first,\nlang=lang,\n)\nif res is False:\nraise AssertionError(\n(f\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{args}\", f\"{pic if pic else GlobalConfig.SCREEN_CACHE}\")\n)\nif isinstance(res, tuple):\npass\nelif isinstance(res, dict) and False in res.values():\nres = filter(lambda x: x[1] is False, res.items())\nraise AssertionError(\n(\nf\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{dict(res)}\",\nf\"{pic if pic else GlobalConfig.SCREEN_CACHE}\",\n)\n)\n \u5728\u7528\u4f8b\u4e2d\u4f7f\u7528\u65ad\u8a00\uff0c\u793a\u4f8b\uff1a def test_font_manager_021(self):\n\"\"\"\u53f3\u4fa7\u2665-\u6536\u85cf/\u53d6\u6d88\u6536\u85cf\u5b57\u4f53\"\"\"\n# \u5b57\u4f53\u7ba1\u7406\u5668\u754c\u9762\u53f3\u4fa7\u8be6\u60c5\u5217\u8868\uff0c\u9009\u62e9\u672a\u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e / \u6536\u85cf\u5b57\u4f53\n# \u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e\u83dc\u5355\u663e\u793a\u201c\u53d6\u6d88\u6536\u85cf\u201d\uff1b\n...\nself.assert_ocr_exist(\"\u53d6\u6d88\u6536\u85cf\")\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_1","title":"4\u3001\u670d\u52a1\u7aef\u90e8\u7f72","text":"\u6211\u4eec\u76ee\u524d\u662f\u5c06 OCR \u670d\u52a1\u90e8\u7f72\u5728\u666e\u901a\u7684\u529e\u516c\u673a\u4e0a\u7684\uff0c\u5982\u679c\u4f60\u89c9\u5f97\u73b0\u6709\u7684 OCR \u8bc6\u522b\u6027\u80fd\u4e0d\u591f\u597d\uff0c\u6070\u597d\u4f60\u6709\u66f4\u597d\u7684\u673a\u5668\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u5176\u79c1\u6709\u5316\u90e8\u7f72\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41_1","title":"4.1\u3001\u73af\u5883\u5b89\u88c5","text":"\u63a8\u8350\u4f7f\u7528 pipenv \u8fdb\u884c\u73af\u5883\u642d\u5efa\uff1b \u5b89\u88c5 pipenv \uff1a sudo pip3 install pipenv\n \u65b0\u5efa\u4e00\u4e2a\u76ee\u5f55\u4f5c\u4e3a\u73af\u5883\u5305 ocr_env\uff1a cd ~\nmkdir ocr_env\n \u521b\u5efa python 3.7 \u73af\u5883\uff1a cd ocr_env\npipenv --python 3.7\n \u5b89\u88c5 OCR \u4f9d\u8d56\u5305\uff1a pipenv install paddlepaddle -i https://mirror.baidu.com/pypi/simple\npipenv install \"paddleocr>=2.0.1\" -i https://mirror.baidu.com/pypi/simple\n \u4e0d\u51fa\u610f\u5916\uff0c\u8fd9\u6837\u5c31\u628a\u4f9d\u8d56\u5b89\u88c5\u597d\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42_1","title":"4.2\u3001\u542f\u52a8\u670d\u52a1","text":"\u5c06\u57fa\u7840\u6846\u67b6\u4e2d\u7684 scr/ocr/pdocr_rpc_server.py \u6587\u4ef6\u62f7\u8d1d\u5230 ocr_env \u76ee\u5f55\uff0c\u540e\u53f0\u6267\u884c\u5b83\u5c31\u597d\u4e86\uff1a cd ocr_env\nnohup pipenv run python pdocr_rpc_server.py &\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#43","title":"4.3\u3001\u914d\u7f6e\u5f00\u673a\u81ea\u542f\uff08\u901a\u7528\uff09","text":"\u4f60\u80af\u5b9a\u4e0d\u60f3\u6bcf\u6b21\u673a\u5668\u91cd\u542f\u4e4b\u540e\u90fd\u9700\u8981\u624b\u52a8\u542f\u52a8\u670d\u52a1\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u914d\u7f6e\u5f00\u673a\u81ea\u542f\u3002 \u5199\u5f00\u673a\u81ea\u542f\u670d\u52a1\u6587\u4ef6\uff1a sudo vim /lib/systemd/system/ocr.service\n autoocr \u540d\u79f0\u4f60\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff0c\u5199\u5165\u4ee5\u4e0b\u5185\u5bb9\uff1a [Unit]\nDescription=OCR Service\nAfter=multi-user.target\n\n[Service]\nUser=uos\nGroup=uos\nType=idle\nWorkingDirectory=/home/uos/ocr_env\nExecStart=pipenv run python pdocr_rpc_server.py\n\n[Install]\nWantedBy=multi-user.target\n \u6ce8\u610f\u66ff\u6362\u4f60\u7684${USER} \u4fee\u6539\u914d\u7f6e\u6587\u4ef6\u7684\u6743\u9650\uff1a sudo chmod 644 /lib/systemd/system/ocr.service\n \u81ea\u542f\u670d\u52a1\u751f\u6548\uff1a sudo systemctl daemon-reload\nsudo systemctl enable ocr.service\n \u67e5\u770b\u670d\u52a1\u72b6\u6001\uff1a sudo systemctl status ocr.service\n \u4f60\u53ef\u4ee5\u518d\u91cd\u542f\u4e0b\u7535\u8111\uff0c\u770b\u770b\u670d\u52a1\u662f\u4e0d\u662f\u6b63\u5e38\u542f\u52a8\u4e86\uff0c\u6ca1\u62a5\u9519\u5c31 OK \u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_4","title":"\u4e94\u3001\u5c5e\u6027\u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_3","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 UI \u81ea\u52a8\u5316\u5927\u591a\u90fd\u662f\u57fa\u4e8e\u6d4f\u89c8\u5668\u7684\uff0c\u6838\u5fc3\u662f\u5728\u7f51\u9875\u7684 DOM \u6811\u4e0a\u67e5\u627e\u5143\u7d20\uff0c\u5e76\u5bf9\u5176\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\uff1b Linux \u684c\u9762\u5e94\u7528\u5927\u591a\u662f\u91c7\u7528 Qt \u7f16\u5199\u7684\uff0c\u5728 Qt \u4e2d\u4e5f\u662f\u4ece\u6700\u9876\u5c42\u7684 MainWindow \u5f00\u59cb\u6784\u5efa\u5e94\u7528\uff0c\u6240\u4ee5\u903b\u8f91\u4e5f\u662f\u4e00\u6837\u7684\uff0cQt \u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u540c\u6837\u53ef\u4ee5\u901a\u8fc7 DOM \u6811\uff08\u5c5e\u6027\u6811\uff09\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff0c\u6211\u4eec\u79f0\u4e4b\u4e3a\u5c5e\u6027\u5b9a\u4f4d\u3002 \u501f\u52a9\u5f00\u6e90\u5de5\u5177 dogtail \u6211\u4eec\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u83b7\u53d6\uff0c\u4ece\u800c\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\u3002dogtail \u7684\u9879\u76ee\u4ecb\u7ecd\u53ef\u4ee5\u731b\u6233\u8fd9\u91cc\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_3","title":"2\u3001\u4f7f\u7528\u65b9\u6cd5","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#21sniff","title":"2.1\u3001sniff\uff08\u55c5\u63a2\u5668\uff09\u4f7f\u7528","text":"\u5728\u7ec8\u7aef\u8f93\u5165 sniff \u542f\u52a8 AT-SPI Browser mikigo@mikigo-PC:~$ sniff\n \u67e5\u770b\u5e94\u7528\u7684\u6807\u7b7e \u5728 sniff \u91cc\u9762\u53ef\u4ee5\u770b\u5230\u7cfb\u7edf\u4e2d\u5df2\u542f\u52a8\u7684\u5e94\u7528\uff0c\u70b9\u51fb\u5e94\u7528\u540d\u79f0\u524d\u9762\u7684\u4e09\u89d2\u5f62\u56fe\u6807\uff0c\u53ef\u4ee5\u5c55\u5f00\u5e94\u7528\u7684\u6807\u7b7e\uff0c\u6240\u6709\u6807\u7b7e\u4ee5 tree \u7684\u5f62\u5f0f\u5c55\u793a\uff0c\u5bf9\u5e94\u5e94\u7528\u91cc\u9762\u7684\u7236\u7a97\u53e3\u548c\u5b50\u7a97\u53e3\u3002 \u83b7\u53d6\u5143\u7d20\u63a7\u4ef6\u7684\u6807\u7b7e\u540d\u79f0 \u9996\u5148\uff0c\u4e3a\u4e86\u65b9\u4fbf\u67e5\u770b\u5143\u7d20\u63a7\u4ef6\u5bf9\u5e94\u7684\u4f4d\u7f6e\uff0c\u5efa\u8bae\u73b0\u5728\u4e0a\u65b9\u5de5\u5177\u680f\u70b9\u51fb Actions\uff0c\u7136\u540e\u52fe\u9009 Hightlight Items\uff0c\u8fd9\u6837\u5728 sniff \u4e2d\u9f20\u6807\u9009\u4e2d\u5143\u7d20\u6807\u7b7e\u7684\u65f6\u5019\uff0c\u5e94\u7528\u4e2d\u4f1a\u6709\u76f8\u5e94\u7684\u5149\u6807\u9501\u5b9a\u3002 \u5728 sniff \u91cc\u9762\u70b9\u51fb\u8fdb\u5165\u5e94\u7528\u7684\u6807\u7b7e tree \u4e2d\u540e\uff0c\u70b9\u51fb\u76f8\u5e94\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5728\u5de5\u5177\u4e0b\u65b9\uff0c\u4f1a\u5c55\u793a\u5143\u7d20\u63a7\u4ef6\u7684 Name\uff0c\u8fd9\u4e2a\u5c31\u662f\u6807\u7b7e\u540d\u79f0\u3002 \u5728 tree \u4e2d\u6709\u4e9b\u5730\u65b9\u662f\u7a7a\u767d\u7684\u6216\u8005\u662f Form\uff0c\u662f\u56e0\u4e3a\u5f00\u53d1\u4eba\u5458\u5728\u6dfb\u52a0\u6807\u7b7e\u7684\u65f6\u5019\u6ca1\u6709\u6dfb\u52a0\uff0c\u6216\u8005\u6709\u4e9b\u7236\u7a97\u53e3\u4e0d\u9700\u8981\u6dfb\u52a0\uff0c\u8fd9\u79cd\u5728\u5b9e\u9645\u4e1a\u52a1\u4e2d\u662f\u4e0d\u5f71\u54cd\u7684\uff0c\u6211\u4eec\u53ea\u8981\u4fdd\u8bc1\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\u4e2d\uff0c\u8981\u7528\u5230\u7684\u5143\u7d20\u90fd\u6dfb\u52a0\u4e86\u6807\u7b7e\u5373\u53ef\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#22","title":"2.2\u3001\u5143\u7d20\u64cd\u4f5c","text":"\u83b7\u53d6\u5e94\u7528\u5bf9\u8c61 dogtail \u83b7\u53d6\u5e94\u7528\u5bf9\u8c61\u7684\u65f6\u5019\uff0c\u4f7f\u7528\u7684\u662f tree \u5e93\u91cc\u9762\u7684 application() \u65b9\u6cd5\uff1a from dogtail.tree import root\napp_obj = root.application('deepin-music')\n app_obj\u5c31\u662f\u5e94\u7528\u7684\u5bf9\u8c61\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\uff0c\u662f\u5e94\u7528\u5bf9\u8c61\u4f7f\u7528child()\u65b9\u6cd5\uff1a element = app_obj.child('element_name')\n \u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u4f20\u5165\u5143\u7d20\u7684 Name\uff0c\u83b7\u53d6\u5230\u76f8\u5e94\u5143\u7d20\u7684\u5bf9\u8c61\u3002Name \u53ef\u4ee5\u901a\u8fc7 sniff \u67e5\u770b\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\u5217\u8868: element_list = element.children\n \u83b7\u53d6\u5230\u8fd9\u4e2a\u5143\u7d20\u4e0b\u9762\u6240\u6709\u7684\u5143\u7d20\u5217\u8868\u3002 \u8fd9\u4e2a\u65b9\u6cd5\u9002\u7528\u4e8e\u6709\u4e9b\u6807\u7b7e\u6ca1\u6709\u6dfb\u52a0\uff0c\u4f46\u662f\u4f4d\u7f6e\u662f\u56fa\u5b9a\u7684\uff0c\u6211\u4eec\u901a\u8fc7\u7d22\u5f15\u53ef\u4ee5\u53d6\u5f97\u5143\u7d20\u3002 element_list[0]\n \u5bf9\u5143\u7d20\u7684\u64cd\u4f5c \u5728\u83b7\u53d6\u5230\u5143\u7d20\u4e4b\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u76f8\u5e94\u7684\u64cd\u4f5c\u3002 \u5355\u51fb element.click(button=1)\n button 1 \u2014>\u5de6\u952e\uff0c2 \u2014>\u6eda\u8f6e\uff0c3 \u2014>\u53f3\u952e\uff0c\u9ed8\u8ba4\u4e3a 1 \u53cc\u51fb element.doubleClick(button=1)\n \u9f20\u6807\u60ac\u505c element.point()\n \u9f20\u6807\u79fb\u52a8\u5230\u5143\u7d20\u4e2d\u5fc3\u4f4d\u7f6e \u6587\u672c\u8f93\u5165 element.typeText(string)\n \u5411\u5143\u7d20\u5bf9\u8c61\u8f93\u5165\u5b57\u7b26\u4e32 \uff0c\u6bd4\u5982\u8f93\u5165\u6846 \u7ec4\u5408\u952e element.keyCombo(comboString)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#23","title":"2.3\u3001\u6846\u67b6\u5c01\u88c5","text":"\u4ee3\u7801\u793a\u4f8b\uff1a # \u8be6\u7ec6\u4ee3\u7801\u8bf7\u67e5\u770b src/dogtail_utils.py\nclass DogtailUtils:\ndef __init__(self, name=None, description=None):\nself.name = name\nself.description = description\nself.obj = root.application(self.name, self.description)\ndef app_element(self, *args, **kwargs):\n\"\"\"\n \u83b7\u53d6app\u5143\u7d20\u7684\u5bf9\u8c61\n :return: \u5143\u7d20\u7684\u5bf9\u8c61\n \"\"\"\nreturn self.obj.child(*args, **kwargs, retry=False)\ndef element_center(self, element) -> tuple:\n\"\"\"\n \u83b7\u53d6\u5143\u7d20\u7684\u4e2d\u5fc3\u4f4d\u7f6e\n :param element:\n :return: \u5143\u7d20\u4e2d\u5fc3\u5750\u6807\n \"\"\"\n_x, _y, _w, _h = self.app_element(element).extents\n_x = _x + _w / 2\n_y = _y + _h / 2\nreturn _x, _y\n \u6846\u67b6\u63d0\u4f9b\u7684\u63a5\u53e3\u975e\u5e38\u7b80\u6d01\uff0c\u5728\u8c03\u7528\u65f6\uff1a self.dog.element_center(\"\u64ad\u653e\")\n \u8fd9\u6837\u5c31\u80fd\u83b7\u53d6\u5230\u6b64\u5143\u7d20\u7684\u4e2d\u5fc3\u5750\u6807\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_5","title":"\u516d\u3001\u6807\u7b7e\u5316\u7ba1\u7406","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_4","title":"1\u3001\u6807\u7b7e\u8bf4\u660e","text":"\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u811a\u672c ID\uff1a\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c/\u51fd\u6570 ID\uff1b PMS\u7528\u4f8bID\uff1aPMS \u4e0a\u5bf9\u5e94\u7684\u7528\u4f8b ID\uff08\u7528\u4f8b\u5e93 ID\uff09\uff1b \u9ed8\u8ba4\u4f7f\u7528\u7528\u4f8b\u5e93 ID\uff0c\u5bf9\u4e8e\u6682\u65f6\u6ca1\u6709\u4f7f\u7528\u7528\u4f8b\u5e93\u7ba1\u7406\u7528\u4f8b\u7684\u9879\u76ee\uff0c\u53ef\u4ee5\u4f7f\u7528\u4ea7\u54c1\u5e93\u7528\u4f8b ID\uff1b \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1aFUNC\uff08\u529f\u80fd\uff09\u3001API\uff08\u63a5\u53e3\uff09\u3001BASELINE\uff08\u57fa\u7ebf\uff09\u3001PERF\uff08\u6027\u80fd\uff09\u3001STR\uff08\u538b\u529b\uff09\u3001SEC\uff08\u5b89\u5168\uff09\u3001CTS\uff08\u517c\u5bb9\u6027\uff09 \u4e0a\u7ebf\u5bf9\u8c61\uff1aCICD\uff0c\u8868\u793a\u4e0a\u7ebf\u5230 CICD \u6d41\u6c34\u7ebf\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u53ef\u4e00\u952e\u751f\u6210 case_list.csv \u6587\u4ef6\uff0c\u7528\u4e8e\u5bfc\u5165\u5230\u660e\u9053\u4e91 AT \u7528\u4f8b\u5217\u8868\u4e2d\u63a7\u5236 CICD \u8dd1\u6d4b\u8303\u56f4\uff1b \u6d4b\u8bd5\u7ea7\u522b\uff1aC1 / C2 / C3 / C4\uff0c\u5177\u4f53\u5b9a\u4e49\u53c2\u8003\u6d41\u6c34\u7ebf\u4f7f\u7528\u6307\u5bfc\uff1b \u8df3\u8fc7\u539f\u56e0\uff1askip-XXX\uff0c\u7528\u4e8e\u63a7\u5236\u7528\u4f8b\u662f\u5426\u6267\u884c\uff1b \u786e\u8ba4\u4fee\u590d\uff1afixed-XXX\uff0c\u7528\u4e8e\u6807\u8bb0\u7528\u4f8b\u7684\u4fee\u590d\u72b6\u6001\uff08\u540e\u9762\u8be6\u7ec6\u8bb2\u89e3\u7528\u6cd5\uff09\uff1b \u5e9f\u5f03\u7528\u4f8b\uff1aremoved-\u5df2\u5e9f\u5f03\uff0c\u7528\u4e8e\u6807\u8bb0\u5df2\u7ecf\u5e9f\u5f03\u7684\u7528\u4f8b\uff0c\u6b64\u7528\u4f8b\u6807\u7b7e\u4e0d\u4f1a\u88ab\u6dfb\u52a0\uff0c\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff1b \u793a\u4f8b\uff1a \u811a\u672cID PMS\u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u4e0a\u7ebf\u5bf9\u8c61 \u6d4b\u8bd5\u7ea7\u522b \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b ... 001 679537 L1 FUNC CICD C1 skip-XXX fixed-XXX removed-\u5df2\u5e9f\u5f03 ..."},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_4","title":"2\u3001\u64cd\u4f5c\u6b65\u9aa4","text":"2.1\u3001\u5728\u5b50\u9879\u76ee\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u4ee5\u7528\u4f8b\u7684 py \u6587\u4ef6\u9664\u53bb\u9996\u5b57\u7b26\u4e32 \"test_\" \u548c\u7528\u4f8b\u5e8f\u53f7\u540e\u7684\u5b57\u7b26\u4e32\u4f5c\u4e3a csv \u7684\u6587\u4ef6\u540d\u3002 \u4f8b\u5982: \u76f8\u518c\u7684\u7528\u4f8b\u6587\u4ef6\u4e3a test_album_xxx.py\uff0cxxx \u8868\u793a\u4efb\u610f\u4e09\u4f4d\u6570\u5b57\u4ee3\u8868\u7528\u4f8b\u5e8f\u53f7\uff0c\u6b64\u65f6 csv \u6587\u4ef6\u540d\u5c31\u5e94\u4e3a album.csv\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u6240\u6709 csv \u6587\u4ef6\u5efa\u8bae\u653e\u5728\u4e00\u4e2a tags \u76ee\u5f55\u4e0b\u3002 \u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 2.2\u3001\u7b2c\u4e00\u5217\u4e3a\u811a\u672c ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b\u7528\u4f8b\u6807\u7b7e\u53ef\u4ee5\u65e0\u5e8f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_2","title":"3\u3001\u589e\u52a0\u8bf4\u660e","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_1","title":"3.1\u3001\u8df3\u8fc7\u7528\u4f8b","text":"\u4f20\u7edf\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668(@pytest.mark.skip)\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a; \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#311","title":"3.1.1\u3001\u56fa\u5b9a\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u7b7e\u5f00\u5934\u4e3a \u201cskip-XXX\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\uff0c\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\u5219\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u7b7e\u4e3a SKIPED\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#312","title":"3.1.2\u3001\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skipif_platform-aarch64&mips64 \u67d0\u4e9b\u7528\u4f8b\u4f1a\u56e0\u4e3a\u4e0d\u540c\u7684\u73af\u5883\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\uff0c\u5e38\u89c1\u7684\u573a\u666f\u4e3a\u5728\u4e0d\u540c\u67b6\u6784\u4e0a\u5224\u65ad\u662f\u5426\u6267\u884c\uff0c\u8df3\u8fc7\u7684\u539f\u56e0\u6807\u7b7e\u4e3a \u201cskipif_platform-\u201d \u52a0\u67b6\u6784\u540d\uff0c\u591a\u4e2a\u67b6\u6784\u4e4b\u95f4\u4f7f\u7528 \u201c&\u201d \u62fc\u63a5\uff1b \u4ee5\u4e0a\u4f8b\u5b50\u4e3a\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u5224\u65ad\u5f53\u524d\u67b6\u6784\u662f\u5426\u4e3a arrch64 \u6216\u8005 mips64\uff0c\u82e5\u662f\uff0c\u5219\u8df3\u8fc7\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u82e5\u5426\u5219\u6267\u884c\u7528\u4f8b\uff1b \u76ee\u524d\u6846\u67b6\u9ed8\u8ba4\u4ec5\u652f\u6301\u67b6\u6784\u7684\u6761\u4ef6\u5224\u65ad\uff0c\u4f46\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u903b\u8f91\u652f\u6301\u81ea\u5b9a\u4e49\u6dfb\u52a0\u3002 \u5728\u9879\u76ee\u76ee\u5f55\u8def\u5f84\u4e0b\u5b58\u5728\u6587\u4ef6 setting/skipif.py\uff0c\u6240\u6709\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u7684\u51fd\u6570\u5199\u5728\u6b64\u6587\u4ef6\u4e2d\u3002 \u9ed8\u8ba4\u67b6\u6784\u5224\u65ad\u4f8b\u5b50\uff1a def skipif_platform(args: str):\n\"\"\"\u5e73\u53f0\u8df3\u8fc7\"\"\"\n_skip_key = args.split(\"&\")\nfor key in _skip_key:\nif GlobalConfig.SYS_ARCH == key:\nreturn True\nreturn False\n \u65b9\u6cd5\u7f16\u5199\u89c4\u8303\uff1a \u65b9\u6cd5\u540d\u5fc5\u987b\u4ee5 skipif \u5f00\u5934\uff1b \u65b9\u6cd5\u5fc5\u987b\u6709\u8fd4\u56de\u7ed3\u679c\u5e76\u4e14\u4e3a\u5e03\u5c14\u503c\uff08True \u4ee3\u8868\u8df3\u8fc7\uff0cFalse \u4ee3\u8868\u4e0d\u8df3\u8fc7\uff09\uff1b \u65b9\u6cd5\u53ea\u80fd\u6709\u4e00\u4e2a\u5165\u53c2\uff1b \u5728 csv \u6587\u4ef6\u8df3\u8fc7\u539f\u56e0\u4e00\u680f\u4e2d\u586b\u5199\u4e3a \u201c{\u51fd\u6570\u540d}-{\u53c2\u6570}\u201d\uff0c\u4f8b\u5982\uff1askipif_platform-aarch64\uff1b\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u4f1a\u4ee5\u7b2c\u4e00\u4e2a \u201c-\u201d \u8fdb\u884c\u5206\u5272\uff0c\u622a\u53d6\u7684\u5de6\u4fa7\u5b57\u7b26\u4e32\u4f5c\u4e3a\u51fd\u6570\u540d\uff0c\u5728 skipif.py \u6587\u4ef6\u4e2d\u67e5\u627e\u662f\u5426\u6709\u540c\u540d\u51fd\u6570\uff0c\u5e76\u5c06\u622a\u53d6\u7684\u53f3\u4fa7\u4f5c\u4e3a\u53c2\u6570\u4f20\u9012\u7ed9\u8be5\u51fd\u6570\uff0c\u901a\u8fc7\u83b7\u53d6\u8be5\u51fd\u6570\u8fd4\u56de\u7684\u5e03\u5c14\u503c\uff0c\u8fd4\u56de True\uff0c\u5219\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u8fd4\u56de False\uff0c\u5219\u6267\u884c\u8be5\u7528\u4f8b\u3002 \u82e5\u51fd\u6570\u9700\u8981\u591a\u4e2a\u53c2\u6570\uff0c\u53ef\u81ea\u5b9a\u4e49\u591a\u4e2a\u53c2\u6570\u4e4b\u95f4\u7684\u8fde\u63a5\u7b26\uff0c\u8fde\u63a5\u7b26\u53f7\u4e0d\u53ef\u4f7f\u7528\u4e0b\u5212\u7ebf\u548c\u9017\u53f7\uff0c\u63a8\u8350\u7edf\u4e00\u4f7f\u7528 & \u7b26\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32","title":"3.2\u3001\u786e\u8ba4\u4fee\u590d","text":"\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7528\u4f8b\u4fee\u590d\u540e\uff0c\u4f46\u4e0d\u80fd\u7acb\u5373\u5220\u9664\u8df3\u8fc7\u539f\u56e0\uff08skip-XXX\uff09\u7684\u7528\u4f8b\uff0c\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u786e\u8ba4\u4fee\u590d\u201d\uff0c\u4f5c\u4e3a\u6807\u8bb0\u8be5\u7528\u4f8b\u662f\u5426\u5df2\u7ecf\u4fee\u590d\uff0c\u56fa\u5b9a\u586b\u5165\u5b57\u6bb5\u4e3a \u201cfixed-\u5df2\u4fee\u590d\u201d\u3002\u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u5373\u4f7f\u540c\u65f6\u6807\u8bb0\u4e86 skip-XXX \u4e5f\u4f1a\u6b63\u5e38\u6267\u884c\u3002 \u793a\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d \u3010\u540c\u65f6\u6807\u8bb0\u4e86skip \u548c fixed\uff0c\u4f46\u4ecd\u7136\u60f3\u8981\u8df3\u8fc7\u7528\u4f8b\u3011 \u5f53 \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u540c\u65f6\u586b\u5165\u540e\uff0c\u547d\u4ee4\u884c\u4f20\u9012\u53c2\u6570 --ifixed yes\uff0c\u5219\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\u8be5\u6761\u7528\u4f8b\u3002 python3 manage.py run --ifixed yes\n \u770b\u5230\u8fd9\u91cc\u6709\u4e9b\u540c\u5b66\u53ef\u80fd\u8981\u95ee\u4e86\uff0c\u6211\u60f3\u6062\u590d\u8df3\u8fc7\u6267\u884c\uff0c\u76f4\u63a5\u628a skip-XXX \u8fd9\u4e00\u5217\u6807\u7b7e\u5220\u6389\u4e0d\u5c31\u597d\u4e86\uff0c\u8fd8\u641e\u4ec0\u4e48\u786e\u8ba4\u4fee\u590d\u5e72\u5565\uff1f \u8fd9\u91cc\u7ed9\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u89e3\u91ca\u4e00\u4e0b\uff1a \uff08\u4ee5\u4e0b\u6d41\u6c34\u7ebf\u6307\u7684\u662f\u6bcf\u65e5\u6784\u5efa\u7684\u6d41\u6c34\u7ebf\uff0c\u8dd1 AT \u7684\u5168\u91cf\u7528\u4f8b\uff09 \u9996\u5148\uff0c\u6d41\u6c34\u7ebf\u4e0a\u8dd1\u7684\u662f AT \u5386\u53f2 Tag\uff0c\u8df3\u8fc7\u7528\u4f8b\u7684\u6807\u7b7e(skip-XXX) \u662f\u5728\u6700\u65b0\u7684\u4ee3\u7801\u4e0a\u63d0\u4ea4\u7684\uff0c\u6211\u4eec\u91c7\u7528\u6700\u65b0\u7684 csv \u6587\u4ef6\u8986\u76d6\u5386\u53f2 csv \u6587\u4ef6\u7684\u8bbe\u8ba1\u6765\u5b9e\u73b0\u4e86\u5bf9\u5386\u53f2 Tag \u4e0a\u7528\u4f8b\u7684\u8df3\u8fc7\uff1b \u7136\u540e\uff0c\u5728\u65e5\u5e38\u8df3\u8fc7\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u540c\u65f6\u4e5f\u5728\u4fee\u590d\u4e00\u4e9b\u7528\u4f8b\uff0c\u4fee\u590d\u540e\u7684\u8fd9\u4e9b\u7528\u4f8b\u5728\u672c\u5730\u8c03\u8bd5\u7684\u65f6\u5019\u6211\u4eec\u4e0d\u5e0c\u671b\u7ee7\u7eed\u8df3\u8fc7\uff0c\u4f46\u662f\u6b64\u65f6\uff0c\u4fee\u590d\u7684\u8fd9\u4e9b\u7528\u4f8b\u53ef\u80fd\u8fd8\u4e0d\u7a33\u5b9a\uff0c\u4e0d\u9002\u5408\u9a6c\u4e0a\u653e\u5230\u6d41\u6c34\u7ebf\u53bb\u8dd1\uff0c\u4e5f\u5c31\u662f\u8bf4\u6d41\u6c34\u7ebf\u4e0a\u6211\u4eec\u662f\u5e0c\u671b\u4ed6\u7ee7\u7eed\u8df3\u8fc7\u7684\uff0c\u56e0\u6b64\uff0c\u54b1\u4e0d\u80fd\u76f4\u63a5\u628a skip-XXX \u5e72\u6389\uff1b \u8fd9\u91cc\u5c31\u77db\u76fe\u4e86\uff0c\u4e00\u4e2a\u9700\u6c42\u662f\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u53e6\u4e00\u4e2a\u9700\u6c42\u53c8\u4e0d\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u600e\u4e48\u529e\u5462\uff1f \u6211\u4eec\u4f7f\u7528\u201c\u786e\u8ba4\u4fee\u590d\u201d\u6765\u6807\u8bb0\u8fd9\u6761\u7528\u4f8b\u5df2\u7ecf\u4fee\u590d\u4e86\uff0c\u8fd9\u6837\u4f60\u672c\u5730\u8c03\u8bd5\u7528\u4f8b\u7684\u65f6\u5019\u8fd9\u6761\u5df2\u4fee\u590d\u7684\u7528\u4f8b\u662f\u4f1a\u6267\u884c\u7684\uff0c\u540c\u65f6\u5728\u6d41\u6c34\u7ebf\u4e0a\u5c06 --ifixed yes \u53c2\u6570\u52a0\u4e0a\uff0c\u90a3\u4e48\u6d41\u6c34\u7ebf\u4e0a\u6267\u884c\u65f6\u8fd9\u6761\u7528\u4f8b\u4ecd\u7136\u662f\u8df3\u8fc7\u7684\u72b6\u6001\uff0c\u540e\u7eed\u4f60\u6253 Tag \u7684\u65f6\u5019\uff0c\u628a \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u7684\u6807\u7b7e\u5168\u90e8\u5220\u6389\u5c31\u53ef\u4ee5\u4e86\u3002 \u8fd9\u5c31\u662f\u201c\u786e\u8ba4\u4fee\u590d\u201d\u8fd9\u4e2a\u6807\u7b7e\u7684\u80cc\u666f\uff0c\u9700\u8981\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u54c1\u4e00\u54c1\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#33","title":"3.3\u3001\u5e9f\u5f03\u7528\u4f8b","text":"\u9488\u5bf9\u67d0\u4e9b\u7528\u4f8b\uff0c\u7531\u4e8e\u9700\u6c42\u53d8\u66f4\uff0c\u73af\u5883\u5f71\u54cd\u6216\u8bc4\u4f30\u4e0d\u518d\u9002\u7528\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u65f6\uff0c\u7528\u4f8b\u9700\u8981\u5e9f\u5f03\uff0c\u5219\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u5e9f\u5f03\u7528\u4f8b\u201d\uff0c\u8be5\u5217\u5b58\u5728 \u201cremoved-{\u5e9f\u5f03\u539f\u56e0}\u201d\uff0c\u5219\u7528\u4f8b\u4e0d\u4f1a\u6267\u884c\u3002 \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d removed-\u5df2\u5e9f\u5f03 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_2","title":"4\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u4e0a\u9762\u4ecb\u7ecd Pytest \u6846\u67b6\u63d0\u4f9b\u7684\u6807\u7b7e\u529f\u80fd mark\uff0c\u4f7f\u7528\u65f6\u9700\u8981\u4e3a\u6bcf\u4e00\u4e2a\u7528\u4f8b\u6dfb\u52a0\u6807\u7b7e\u88c5\u9970\u5668\uff0c\u5219\u64cd\u4f5c\u590d\u6742\uff0c\u53ef\u7ef4\u62a4\u6027\u5dee\uff0c\u5176\u6839\u672c\u95ee\u9898\u5c31\u662f\u6807\u7b7e\u5206\u6563\u5728\u6bcf\u4e00\u6761\u7528\u4f8b\u7684\u88c5\u9970\u5668\u4e0a\uff0c\u96be\u4ee5\u96c6\u4e2d\u7ef4\u62a4\uff1b\u4e8e\u662f\u4e4e\u5c06\u6240\u6709\u6807\u7b7e\u4f7f\u7528 csv \u6587\u4ef6\u8fdb\u884c\u96c6\u4e2d\u7ba1\u7406\uff0c\u5e76\u901a\u8fc7 Pytest \u7684\u94a9\u5b50\u51fd\u6570\uff0c\u8bfb\u53d6 csv \u6587\u4ef6\uff0c\u52a8\u6001\u6dfb\u52a0\u6807\u7b7e\u5230\u7528\u4e2d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5csv","title":"5\u3001CSV\u6587\u4ef6\u683c\u5f0f","text":"\u6b64\u914d\u7f6e\u6587\u4ef6\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u6807\u7b7e\u6570\u636e\uff0c\u4e14\u8981\u65b9\u4fbf\u80fd\u4f7f\u7528Excel\u6253\u5f00\u8fdb\u884c\u7f16\u8f91\u67e5\u770b\uff0c\u66f4\u91cd\u8981\u7684\u662f\u6211\u4eec\u4e0d\u60f3\u5f15\u5165\u4e09\u65b9\u4f9d\u8d56\uff0cCSV \u6587\u4ef6\u51e0\u4e4e\u662f\u552f\u4e00\u80fd\u6ee1\u8db3\u6240\u6709\u7684\u8981\u6c42\u7684\u6587\u4ef6\u683c\u5f0f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_6","title":"\u4e03\u3001\u65e5\u5fd7\u7cfb\u7edf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_5","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e YouQu \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u64cd\u4f5c\u65b9\u6cd5\u5c01\u88c5\u5199\u6cd5\uff0c\u901a\u5e38\u662f\u8fd9\u6837\u7684\uff1a\u7c7b\u91cc\u9762\u4e00\u4e2a\u51fd\u6570\u53ea\u5305\u542b\u4e00\u4e2a\u64cd\u4f5c\u6216\u591a\u6b21\u8c03\u7528\u7684\u4e00\u7cfb\u5217\u53ef\u5408\u5e76\u7684\u64cd\u4f5c\uff1b \u4f20\u7edf\u7684\u65e5\u5fd7\u8f93\u51fa\u65b9\u5f0f\uff0c\u9700\u8981\u5728\u6bcf\u4e2a\u51fd\u6570\u91cc\u9762\u4e3b\u52a8\u7f16\u5199\u65e5\u5fd7\u8f93\u51fa\u4ee3\u7801 \uff0c\u4f8b\u5982\uff1a class XXXWidget:\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\nlogger.info(\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\")\n...\n# \u7701\u7565\u4ee3\u7801\u90e8\u5206\n \u4e00\u4e2a\u51fd\u6570\u91cc\u9762\u81f3\u5c11\u5305\u542b\u4e00\u6761\u65e5\u5fd7\u4fe1\u606f\uff0c\u5982\u679c\u6bd4\u8f83\u590d\u6742\u64cd\u4f5c\u6b65\u9aa4\uff0c\u53ef\u80fd\u5305\u542b\u591a\u6761\u65e5\u5fd7\u4fe1\u606f\uff1b \u4e00\u4e2a\u5e94\u7528\u542b\u6709\u5927\u91cf\u7684\u64cd\u4f5c\u51fd\u6570\uff0c\u4e5f\u5c31\u662f\u8bf4\u6211\u4eec\u9700\u8981\u5199\u5927\u91cf\u7684\u65e5\u5fd7\u4ee3\u7801\uff1b \u901a\u8fc7\u7ecf\u9a8c\u89c2\u5bdf\uff0c\u6211\u4eec\u53d1\u73b0\uff0c\u51fd\u6570\u8bf4\u660e\u4ee5\u53ca\u51fd\u6570\u64cd\u4f5c\u65e5\u5fd7\uff0c\u5177\u6709\u8f83\u9ad8\u7684\u91cd\u590d\u5ea6\uff08\u4ece\u4e0a\u9762\u7684\u4f8b\u5b50\u4e5f\u53ef\u4ee5\u770b\u51fa\u6765\uff09\uff0c\u56e0\u6b64\u6211\u4eec\u5927\u80c6\u7684\u8bbe\u60f3\uff0c\u80fd\u4e0d\u80fd\u57fa\u4e8e\u6846\u67b6\u6267\u884c\u65f6\uff0c\u81ea\u52a8\u7684\u5c06\u51fd\u6570\u8bf4\u660e\u4f5c\u4e3a\u65e5\u5fd7\u6253\u5370\u51fa\u6765\uff0c\u4ece\u800c\u51cf\u5c11\u5927\u91cf\u65e5\u5fd7\u4ee3\u7801\u91cf\u548c\u91cd\u590d\u7f16\u5199\uff0c\u90a3\u771f\u662f\u5999\u554a~\u3002 \u57fa\u4e8e\u6b64\u201c\u5929\u771f\u201d\u7684\u60f3\u6cd5\uff0c\u6211\u4eec\u8bbe\u8ba1\u51fa\u4e86 youqu \u7684\u65e5\u5fd7\u7cfb\u7edf\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_5","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u6838\u5fc3\u539f\u7406\uff1a \u901a\u8fc7\u7ed9\u7c7b\u52a0\u4e0a\u4e00\u4e2a\u88c5\u9970\u5668 @log\uff0c\u52a8\u6001\u7ed9\u8be5\u7c7b\u4e0b\u6240\u6709\u7684\u51fd\u6570\u53ca\u7236\u7c7b\u51fd\u6570\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668 @_trace\uff0c\u5728\u6b64\u88c5\u9970\u5668\u4e2d\u6211\u4eec\u80fd\u52a8\u6001\u7684\u6355\u83b7\u6240\u8c03\u7528\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff08func.__doc__\uff09\uff0c\u901a\u8fc7\u65e5\u5fd7\u8f93\u51fa\u5668\u5c06\u5176\u8f93\u51fa\u5373\u53ef\u3002 \u5b9e\u73b0\u6b65\u9aa4\uff1a \u901a\u8fc7 inspect.getmembers \u83b7\u53d6\u88ab\u88c5\u9970\u7684\u7c7b\u4e0b\u6240\u6709\u51fd\u6570\uff0c\u5305\u542b\u9759\u6001\u65b9\u6cd5\uff0c\u7c7b\u65b9\u6cd5\uff0c\u5b9e\u4f8b\u65b9\u6cd5\uff1b \u901a\u8fc7 setattr(\u7c7b, \u65b9\u6cd5, _trace\uff09 \u7684\u65b9\u5f0f\uff0c\u7ed9\u7b26\u5408\u6761\u4ef6\u7684\u51fd\u6570\uff0c\u52a8\u6001\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_3","title":"3\u3001\u65e5\u5fd7\u914d\u7f6e","text":"[log_cli]\n;\u65e5\u5fd7\u76f8\u5173\u914d\u7f6e\uff08\u4e0d\u6253\u5370\u6784\u9020\u51fd\u6570\u548c\u9b54\u6cd5\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff09\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = INFO\n# ============= \u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u914d\u7f6e ================\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u5f00\u5934\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7, \u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_STARTSWITH = Assert\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u7ed3\u5c3e\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_ENDSWITH = Widget\n;\u652f\u6301\u7c7b\u540d\u5305\u542b xxx \u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_CONTAIN = ShortCut\n# ==============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_3","title":"4\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u5728\u5e94\u7528\u5e93 widget \u65b9\u6cd5\u5e93\u91cc\u9762\uff0c\u53ea\u9700\u8981\u5728\u51fa\u53e3\u6587\u4ef6\u52a0\u4e0a\u7c7b\u88c5\u9970\u5668\uff0c\u5c31\u53ef\u4ee5\u5b9e\u73b0\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u4e86\uff1b # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6ce8\u610f\uff0c\u662f\u7c7b\u88c5\u9970\u5668\u3002 \u5b9e\u4f8b\uff1a # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\n@classmethod\ndef find_dfm_image(cls, *elements, multiple=False, rate=0.9):\n\"\"\"\n \u67e5\u627e\u56fe\u7247 {{elements}}.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e {{rate}} \u7684\u5750\u6807\n :param elements:\n :param multiple:\n :return:\n \"\"\"\nelement = tuple(map(lambda x: f\"{Config.PIC_RES_PATH}/{x}\", elements))\nreturn cls.find_image(*element, multiple=multiple)\n \u8c03\u7528\u65b9\u6cd5\u65f6\uff1a DfmWidget.find_dfm_image(\"dfm_001\")\n \u81ea\u52a8\u8f93\u51fa\u7684\u65e5\u5fd7\uff1a >> x86_64-uos-6: 02/28 17:48:47 | INFO | logger_utils: [find_dfm_image]: \u67e5\u627e\u56fe\u7247 dfm_001.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e 0.9 \u7684\u5750\u6807\n \u52a0\u4e0a\u88c5\u9970\u5668 @log \u4e4b\u540e\uff0c\u65b9\u6cd5\u5c42\u6240\u6709\u7684\u51fd\u6570\uff08\u5305\u62ec\u5b9e\u4f8b\u65b9\u6cd5\u3001\u7c7b\u65b9\u6cd5\u3001\u9759\u6001\u65b9\u6cd5\uff09\u90fd\u4e0d\u9700\u8981\u518d\u5199\u65e5\u5fd7\u4ee3\u7801\uff0c\u6267\u884c\u7684\u65f6\u5019\u4f1a\u81ea\u52a8\u8f93\u51fa\uff0c\u5e76\u4e14\u6240\u6709\u8c03\u7528\u7684\u65b9\u6cd5\u4f1a\u4ee5 allure.step \u7684\u65b9\u5f0f\uff0c\u5c55\u793a\u5728 allure \u62a5\u544a\u4e2d\uff0c\u5728\u62a5\u544a\u4e2d\u66f4\u80fd\u4e00\u76ee\u4e86\u7136\u7684\u770b\u5230\u7528\u4f8b\u6267\u884c\u6b65\u9aa4\u3002 \u3010\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\u3011 \u901a\u8fc7\u89c2\u5bdf\u524d\u9762\u7684\u4f8b\u5b50\uff0c\u7ec6\u5fc3\u7684\u540c\u5b66\u53ef\u80fd\u8fd8\u53d1\u73b0\u4e86\u4e00\u4e2a\u5c0f\u7ec6\u8282\uff1a\u51fd\u6570\u529f\u80fd\u8bf4\u660e\u4e2d\uff0c\u4e24\u5bf9\u5927\u62ec\u53f7\u4e2d\u7684\u5185\u5bb9 {{elements}} \u4f5c\u4e3a\u53d8\u91cf\u8f93\u51fa\u51fa\u6765\u4e86\uff1b \u6ca1\u9519\uff0c\u8fd9\u5c31\u662f\u6211\u4eec\u53c2\u8003Django \u548c jinja2 \u7684\u6a21\u677f\u8bed\u6cd5\u8bbe\u8ba1\u51fa\u7684\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\uff0c\u4f7f\u7528\u65b9\u6cd5\u5f88\u7b80\u5355\uff0c\u7528\u4e24\u5bf9\u5927\u62ec\u53f7\u628a\u51fd\u6570\u7684\u53c2\u6570\u62ec\u8d77\u6765\uff0c\u8fd9\u6837\u5728\u65e5\u5fd7\u8f93\u51fa\u7684\u65f6\u5019\u5c31\u80fd\u628a\u8c03\u7528\u51fd\u6570\u65f6\u53c2\u6570\u7684\u503c\u8f93\u51fa\u51fa\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_7","title":"\u516b\u3001\u73af\u5883\u90e8\u7f72","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_6","title":"1\u3001\u539f\u5219","text":"YouQu \u7684\u73af\u5883\u4f9d\u8d56\u4e00\u76f4\u575a\u6301 2 \u4e2a\u539f\u5219\uff1a \u6700\u5c0f\u73af\u5883\u4f9d\u8d56\u539f\u5219 \u6709\u4e9b\u540c\u5b66\u5199\u4e00\u4e9b\u529f\u80fd\uff0c\u9996\u5148\u60f3\u5230\u7684\u5c31\u662f\u53bb\u641c\u7d22\u5f15\u64ce\u641c\u4e00\u4e0b\uff0c\u770b\u6709\u6ca1\u6709\u73b0\u6210\u7684\u5de5\u5177\u6216\u8005\u4ee3\u7801\u76f4\u63a5\u80fd\u7528\uff0c\u7f8e\u5176\u540d\u66f0\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\uff0c\u522b\u4eba\u5df2\u7ecf\u9020\u597d\u4e86\u8f6e\u5b50\u54b1\u4eec\u5c31\u4e0d\u8981\u91cd\u590d\u53bb\u9020\u4e86\uff0c\u7136\u540e\u4e00\u5207\u4f3c\u4e4e\u90fd\u53d8\u5f97\u90a3\u4e48\u7684\u7406\u6240\u5e94\u5f53\u3002 \u5f53\u7136\u8fd9\u6837\u505a\u65e0\u53ef\u539a\u975e\uff0c\u6211\u76f8\u4fe1\u6709\u8fd9\u6837\u60f3\u6cd5\u5e76\u4e14\u4e00\u76f4\u8df5\u884c\u8fd9\u6837\u505a\u6cd5\u7684\u540c\u5b66\u4e0d\u5728\u5c11\u6570\uff0c\u4f46\u8fd9\u6837\u505a\u6709\u4e00\u4e2a\u5f88\u4e25\u91cd\u7684\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f60\u5199\u4e00\u4e2a\u5927\u578b\u9879\u76ee\u65f6\uff0c\u4f60\u4f1a\u5f15\u5165\u975e\u5e38\u975e\u5e38\u975e\u5e38\u591a\u7684\u4f9d\u8d56\uff0c\u6bd4\u5982\u8981\u505a\u4e2a\u63a5\u53e3\u8bf7\u6c42\u8981\u7528 requests\u3001\u8bfb\u5199\u4e2a\u6570\u636e\u7528 pandas\u3001\u5199\u4e2a\u8868\u683c\u7528 pyopenxl\u3001\u89e3\u6790\u4e2a\u6587\u672c\u8981\u7528\u8fd9\u4e2a\u90a3\u4e2a\u4e09\u65b9\u5e93 ... \u3002 \u6211\u8ba4\u4e3a\u8fd9\u662f\u975e\u5e38\u4e0d\u597d\u7684\u4e60\u60ef\uff0c\u5728\u5b9e\u73b0\u4e00\u4e2a\u529f\u80fd\u7684\u65f6\u5019\uff0c\u9996\u5148\u6211\u4eec\u5e94\u8be5\u53bb\u60f3\u81ea\u5df1\u600e\u4e48\u6837\u53bb\u5b9e\u73b0\uff0c\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff1b \u5982\u679c\u4f60\u4e0d\u4f1a\uff0c\u4f60\u53ef\u4ee5\u53bb\u5b66\u4e60\u4e09\u65b9\u5e93\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u522b\u4eba\u4e09\u65b9\u5e93\u4e5f\u662f\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\u7684\uff0c\u4e3a\u4ec0\u4e48\u54b1\u4eec\u4e0d\u884c\u5462\uff1b\u5982\u679c\u522b\u4eba\u7684\u4f60\u5b9e\u5728\u662f\u770b\u4e0d\u61c2\uff0c\u60f3\u5c3d\u4e00\u5207\u529e\u6cd5\u786e\u5b9e\u505a\u4e0d\u51fa\u6765\uff0c\u90a3\u518d\u8003\u8651\u5f15\u5165\u8fd9\u4e2a\u4e09\u65b9\u5e93\uff0c\u6211\u8ba4\u4e3a\u8fd9\u6837\u662f\u6ca1\u95ee\u9898\u7684\uff0c\u6bd5\u7adf\u54b1\u4eec\u6bb5\u4f4d\u8fd8\u4e0d\u591f\uff0c\u4f46\u5e0c\u671b\u5c06\u6765\u6709\u4e00\u5929\u6211\u4eec\u53ef\u4ee5\u3002 \u8fd9\u6837\u7684\u505a\u6cd5\u624d\u5e94\u8be5\u662f\u201c\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\u201d\u6b63\u786e\u7684\u64cd\u4f5c\u3002\u4e0d\u4f1a\u6ca1\u5173\u7cfb\uff0c\u770b\u770b\u522b\u4eba\u662f\u600e\u4e48\u5b9e\u73b0\u7684\uff0c\u81ea\u5df1\u518d\u6478\u7d22\u7740\u5199\u51fa\u6765\uff0c\u8fd9\u6837\u81ea\u5df1\u624d\u80fd\u6709\u6240\u63d0\u9ad8\uff0c\u4e0d\u7136\u4f60\u5c31\u53ea\u4f1a\u7528\u522b\u4eba\u7684\u4e1c\u897f\uff1b\u90a3\u4e9b\u5632\u7b11\u3001\u6279\u8bc4\u6211\u4eec\u91cd\u590d\u9020\u8f6e\u5b50\u7684\u4eba\uff0c\u5148\u60f3\u60f3\u81ea\u5df1\u4f1a\u9020\u8f6e\u5b50\u5417\u3002 \u672c\u7740\u81ea\u5df1\u5b9e\u73b0\u80fd\u5b9e\u73b0\u7684\u4e00\u5207\u7684\u539f\u5219\uff0cYouQu \u6846\u67b6\u505a\u5230\u4e86\u975e\u5e38\u5c11\u7684\u73af\u5883\u4f9d\u8d56\uff0c\u800c\u4e14\u6211\u4eec\u4ecd\u5728\u4e0d\u65ad\u52aa\u529b\uff0c\u51cf\u5c11\u73af\u5883\u90e8\u7f72\u7684\u4f9d\u8d56\u3002 \u6700\u5c0f\u4ed3\u5e93\u4f53\u79ef\u539f\u5219 \u5927\u6587\u4ef6\u4e0d\u80fd\u4e0a\u4f20\u5230\u5de5\u7a0b\u91cc\u9762\uff0c\u4fdd\u6301\u6574\u4e2a\u5de5\u7a0b\u7684\u8f7b\u91cf\u5316\uff0c\u8fd9\u6837\u5728\u514b\u9686\u4ee3\u7801\u7684\u65f6\u5019\u624d\u80fd\u975e\u5e38\u5feb\u901f\u65b9\u4fbf\u4f7f\u7528\uff0c\u6211\u4eec\u89c1\u8fc7\u4e00\u4e2a AT \u5de5\u7a0b clone \u5927\u5c0f\u8fbe\u5230\u597d\u51e0\u4e2a G\uff0c\u7b80\u76f4\u4e0d\u53ef\u601d\u8bae\u3002 \u5176\u5b9e\u4ee3\u7801\u6587\u4ef6\u7684\u5927\u5c0f\u662f\u5f88\u5c0f\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u7eaf\u5199\u4ee3\u7801\u968f\u4fbf\u5199\u5de5\u7a0b\u4e5f\u4e0d\u4f1a\u592a\u5927\uff0c\u800c\u6587\u6863\uff08\u5305\u542b\u63d2\u56fe\uff09\u7b49\u8d44\u6e90\u5374\u662f\u5f88\u5360\u7a7a\u95f4\u3002 \u56e0\u6b64\u6211\u4eec\u9009\u62e9\u5c06 YouQu \u7684\u6587\u6863\u5de5\u7a0b\u5355\u72ec\u8fc1\u51fa\u5230\u72ec\u7acb\u7684\u4ed3\u5e93 youqu-docs \u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_6","title":"2\u3001\u5b89\u88c5","text":"\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u8fd0\u884c env.sh \u5373\u53ef\u3002 bash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_4","title":"3\u3001\u5b9a\u5236\u4f9d\u8d56","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_2","title":"3.1\u3001\u65b0\u589e\u4f9d\u8d56","text":"\u5982\u679c\u5e94\u7528\u5e93\u8fd8\u9700\u8981\u5176\u4ed6 Python \u4f9d\u8d56\u5e93\uff0c\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a requirement.txt \u6587\u4ef6\uff1b autotest_xxx\n\u251c\u2500\u2500 requirement.txt\n\u251c\u2500\u2500 case ...\n \u91cc\u9762\u5199\u5165\u9700\u8981\u5b89\u88c5\u7684\u4e09\u65b9\u4f9d\u8d56\uff0c\u6bd4\u5982\u50cf\u8fd9\u6837\uff1a # requirement.txt\nPyYAML==6.0 # \u6307\u5b9a\u5b89\u88c5\u67d0\u4e2a\u7248\u672c\nrequests # \u672a\u6307\u5b9a\u7248\u672c\u5219\u5b89\u88c5\u6700\u65b0\u7248\n \u5728\u6267\u884c bash env.sh \u65f6\u4f1a\u4e00\u5e76\u5c06\u5176\u5b89\u88c5\u3002 \u5982\u679c\u591a\u4e2a\u5e94\u7528\u5e93\u90fd\u5b58\u5728 requirement.txt \u6587\u4ef6\uff0c\u6267\u884c env.sh \u65f6\u4f1a\u5c06\u591a\u4e2a requirement.txt \u6587\u4ef6\u4e00\u5e76\u52a0\u8f7d\uff1b\u90a3\u4e48\u4e00\u5b9a\u8981\u6ce8\u610f\u591a\u4e2a requirement.txt \u6587\u4ef6\u53ef\u80fd\u5b58\u5728\u76f8\u540c\u7684\u4f9d\u8d56\u88ab\u6307\u5b9a\u5b89\u88c5\u4e0d\u540c\u7248\u672c\u7b49\u7b49\u517c\u5bb9\u6027\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32_1","title":"3.2\u3001\u88c1\u526a\u4f9d\u8d56","text":"\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0c\u53ef\u80fd\u4f60\u53ea\u9700\u8981\u5b89\u88c5\u4e00\u4e9b\u6700\u6700\u57fa\u7840\u7684\u4f9d\u8d56\uff0c\u5176\u4ed6\u7684\u90fd\u4e0d\u9700\u8981\uff0c\u6bd4\u5982\u7eaf\u63a5\u53e3\u81ea\u52a8\u5316\u7684\u9879\u76ee\uff0c\u5b83\u4e0d\u9700\u8981 UI \u81ea\u52a8\u5316\u76f8\u5173\u7684\u4f9d\u8d56\u3002 \u4f60\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\uff0c\u5b58\u653e\u4e00\u4e2a BASICENV \u7684\u666e\u901a\u6587\u4ef6\uff0c\u91cc\u9762\u4e0d\u9700\u8981\u5199\u4efb\u4f55\u5185\u5bb9\uff0c\u8fd9\u6837\u6267\u884c env.sh \u65f6\uff0c\u53ea\u4f1a\u5b89\u88c5\u6700\u57fa\u7840\u7684\u4f9d\u8d56\u3002 autotest_xxx\n\u251c\u2500\u2500 BASICENV # \u53ef\u4ee5\u4f7f\u7528\uff1atouch BASICENV \u521b\u5efa\u6587\u4ef6\n\u251c\u2500\u2500 case ...\n \u57fa\u7840\u4f9d\u8d56\u4ec5\u5b89\u88c5\u4ee5\u4e0b\u51e0\u4e2a\u5305\uff1a pytest # pytest\npytest-rerunfailures # \u5931\u8d25\u91cd\u8dd1\u63d2\u4ef6\npytest-timeout # \u7528\u4f8b\u8d85\u65f6\u63d2\u4ef6\nallure-pytest # \u751f\u6210 allure \u62a5\u544a\u63d2\u4ef6\nallure.deb # allure \u62a5\u544a\u67e5\u770b\u5de5\u5177\n \u88c1\u526a\u4f9d\u8d56 \u548c \u65b0\u589e\u4f9d\u8d56 \u662f\u4e0d\u51b2\u7a81\u7684\uff0c\u53ef\u4ee5\u540c\u65f6\u4f7f\u7528\u3002 \u6b64\u65b9\u6848\u9ed8\u8ba4\u4e3a\u865a\u62df\u73af\u5883\u90e8\u7f72\uff0c\u5982\u679c\u4f60\u60f3\u76f4\u63a5\u90e8\u7f72\u5728\u672c\u673a\u4e0a\uff1a bash env_dev.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_8","title":"\u4e5d\u3001\u5931\u8d25\u5f55\u5c4f","text":"\u5f55\u5c4f\u5176\u5b9e\u662f\u4e00\u79cd\u89c6\u9891\u5f62\u5f0f\u7684\u65e5\u5fd7\uff0c\u56e0\u4e3a\u5f88\u591a\u65f6\u5019\u6211\u4eec\u5728\u67e5\u770b\u65e5\u5fd7\u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u51c6\u786e\u7684\u5b9a\u4f4d\u5230\u7528\u4f8b\u5931\u8d25\u7684\u5177\u4f53\u539f\u56e0\uff0c\u56e0\u6b64\u7528\u4f8b\u7684\u5f55\u5c4f\u80fd\u8ba9\u6211\u4eec\u770b\u5230\u7528\u4f8b\u5728\u6267\u884c\u8fc7\u7a0b\uff1b \u3010\u4f7f\u7528\u65b9\u6cd5\u3011 \u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u5173\u6ce8 2 \u4e2a\u53c2\u6570\uff1b ;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\u3002\n;\u6ce8\u610f\uff0c\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u4e0d\u80fd\u5c0f\u4e8e\u5931\u8d25\u5f55\u5c4f\u6b21\u6570\uff0c\u5373 RERUN >= RECORD_FAILED_CASE\nRECORD_FAILED_CASE = 1\n \u9ed8\u8ba4\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u662f 1 \u6b21\uff1b RECORD_FAILED_CASE = 1 \u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff1b RECORD_FAILED_CASE = 0 \u8868\u793a\u4e0d\u7ba1\u7528\u4f8b\u6210\u529f\u6216\u5931\u8d25\u90fd\u5f55\u5c4f\uff1b \u5f55\u5c4f\u662f\u8981\u5360\u7528\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u7279\u522b\u662f\u5728\u4e00\u4e9b\u914d\u7f6e\u8f83\u4f4e\u7684\u673a\u5668\u4e0a\u4f1a\u5f88\u660e\u663e\uff0c\u6240\u4ee5\u4f60\u9700\u8981\u8003\u8651\u662f\u5426\u6709\u5fc5\u8981\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1b \u4f7f\u7528 manage.py \u6267\u884c\u7528\u4f8b\u9ed8\u8ba4\u8bfb\u53d6\u5230 globalconfig.ini \u91cc\u9762\u7684\u53c2\u6570\uff0c\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report/record \u76ee\u5f55\u4e0b\u4fdd\u5b58\u5931\u8d25\u7528\u4f8b\u7684\u5f55\u5c4f\u548c\u65ad\u8a00\u7684\u90a3\u4e2a\u65f6\u95f4\u70b9\u7684\u622a\u5c4f\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7\u89c6\u9891\u6587\u4ef6\u770b\u5230\u5931\u8d25\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u90fd\u53d1\u751f\u4e86\u4ec0\u4e48\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#wayland","title":"\u5341\u3001Wayland \u9002\u914d","text":"Wayland \u4e0b\u81ea\u52a8\u5316\u4e3b\u8981\u95ee\u9898\u662f X11 \u4e0b\u7684\u952e\u9f20\u64cd\u4f5c\u65b9\u6cd5\u65e0\u6cd5\u4f7f\u7528\uff0c\u6bd4\u5982 Xdotool\u3001 PyAutoGUI\u3001Xwininfo \u7b49\u7b49\uff1b YouQu \u5728 Wayland \u4e0b\u517c\u5bb9\u9002\u914d\uff0cenv.sh \u5728 Wayland \u4e0b\u6267\u884c\u65f6\u4f1a\u5b89\u88c5\u81ea\u7814\u7684\u952e\u9f20\u64cd\u4f5c\u670d\u52a1\uff08\u53ef\u80fd\u5b58\u5728\u4e00\u4e9b\u4f9d\u8d56\u62a5\u9519\uff0c\u6309\u7167\u6ce8\u91ca\u89e3\u51b3\u5373\u53ef\uff09\uff0c\u6846\u67b6\u6838\u5fc3\u5e93\u4e5f\u9488\u5bf9\u6027\u7684\u505a\u4e86\u9002\u914d\uff0c\u4e0a\u5c42\u7528\u4f8b\u5b8c\u5168\u4e0d\u7528\u5173\u5fc3\u673a\u5668\u662fWayland \u8fd8\u662f X11\uff0c\u6846\u67b6\u4f1a\u6839\u636e\u6267\u884c\u65f6\u72b6\u6001\u81ea\u52a8\u5224\u65ad\u8d70\u4e0d\u540c\u7684\u903b\u8f91\uff1b \u7b80\u5355\u8bb2\u5c31\u662f\uff0c\u5e94\u7528\u5e93\u53ea\u9700\u8981\u7ef4\u62a4\u4e00\u5957\u7528\u4f8b\u811a\u672c\u5373\u53ef\u3002 \u3010\u7528\u4f8b\u517c\u5bb9\u3011 \u56e0\u4e3a Wayland \u4e0b\u6709\u4e9b\u5e94\u7528\u7684\u754c\u9762\u663e\u793a\u548c\u529f\u80fd\u672c\u8eab\u5b58\u5728\u4e00\u4e9b\u5dee\u5f02\uff0c\u7528\u4f8b\u5c42\u53ef\u80fd\u9700\u8981\u5bf9\u8fd9\u90e8\u5206\u7528\u4f8b\u505a\u903b\u8f91\u5224\u65ad\uff0c\u4f7f\u7528\u5168\u5c40\u914d\u7f6e\u91cc\u9762\u7684\u5e38\u91cf\u8fdb\u884c\u903b\u8f91\u7f16\u5199\u5373\u53ef\uff1a from setting.globalconfig import GlobalConfig\n# GlobalConfig.IS_WAYLAND \u83b7\u53d6\u5230\u5f53\u524d\u7684\u663e\u793a\u670d\u52a1\u5668\uff08bool\uff09\n# \u5e94\u7528\u5e93 Config \u7ee7\u627f GlobalConfig\nif Config.IS_WAYLAND:\npass\nif Config.IS_X11:\npass\n \u6bd4\u5982\u7528\u4f8b\u91cc\u9762\u5982\u679c\u65ad\u8a00\u7684\u56fe\u7247\u4e0d\u540c\uff1a if Config.IS_WAYLAND:\nself.assert_image_exist(\"wayland_XXX\")\nelse:\nself.assert_image_exist(\"x11_XXX\")\n \u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u811a\u672c\u5728 Wayland \u548c X11 \u4e0b\u90fd\u53ef\u4ee5\u8dd1\uff0cso easy \u662f\u4e0d\u662f\uff1f\u5b8c\u5168\u6ca1\u5fc5\u8981\u4e13\u95e8\u62c9\u65b0\u5206\u652f\u8fdb\u884c Wayland \u9002\u914d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_9","title":"\u5341\u4e00\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_7","title":"1. \u76ee\u5f55\u7ed3\u6784","text":"\u6267\u884c\u65f6\u4f1a\u5728\u6839\u76ee\u5f55\u4e0b\u52a8\u6001\u751f\u6210 report \u76ee\u5f55\uff0c\u6240\u6709\u7684\u62a5\u544a\u76f8\u5173\u7684\u6587\u4ef6\u4f1a\u7edf\u4e00\u5b58\u653e\u5728\u91cc\u9762\uff0c\u793a\u4f8b\uff1a /report\n \u251c\u2500\u2500 allure # allure\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json\n \u251c\u2500\u2500 allure_html # \u751f\u6210\u7684html\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 index.html \u251c\u2500\u2500 allure_back # allure\u62a5\u544a\u5907\u4efd\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 20221108114823\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json\n \u251c\u2500\u2500 json # json\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 result_deepin-music_20221109134736_1081333.json\n \u251c\u2500\u2500 logs # \u65e5\u5fd7\u6587\u4ef6\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 2022-11-10_debug.log \u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-10_error.log\n \u251c\u2500\u2500 record # \u5f55\u5c4f\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-09\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 15\u65f614\u520609\u79d2_test_music_303_2_autotest.mp4\n \u2514\u2500\u2500 xml # xml\u62a5\u544a\n\u2514\u2500\u2500 autotest_deepin_music-20221109134736.xml\n \u9ed8\u8ba4\u60c5\u51b5\u4e0b\u540c\u65f6\u751f\u6210 html\u3001xml\u3001json\u4e09\u79cd\u5f62\u5f0f\u7684\u62a5\u544a\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_7","title":"2. \u5b9a\u5236\u62a5\u544a","text":"\u6211\u4eec\u5bf9 allure \u62a5\u544a\u8fdb\u884c\u4e86\u4e00\u7cfb\u5217\u7684\u5b9a\u5236\uff1a \u5b9a\u5236 logo\u3001title\u3001\u62a5\u544a\u9ed8\u8ba4\u8bed\u8a00\u4e3a\u4e2d\u6587\uff1b \u52a0\u5165\u4e86\u7528\u4f8b\u65ad\u8a00\u5931\u8d25\u65f6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u4ee5\u53ca\u6b64\u65f6\u56fe\u50cf\u5bf9\u6bd4\u7684\u6a21\u677f\u56fe\u7247\uff1b \u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\uff0c\u4f60\u53ef\u4ee5\u5728 html \u62a5\u544a\u4e2d\u76f4\u63a5\u770b\u5f55\u5236\u7684\u89c6\u9891\uff1b \u52a0\u5165\u4e86 IP \u5730\u5740\u3001\u7cfb\u7edf\u4fe1\u606f\u3001\u955c\u50cf\u7248\u672c\u7b49\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_5","title":"3. \u67e5\u770b\u62a5\u544a","text":" \u672c\u5730\u6267\u884c \u5728 report/allure \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u4e00\u5806\u6587\u672c\u6587\u4ef6\uff0c\u8fd9\u4e9b\u662f allure \u63d2\u4ef6\u751f\u6210\u7684\u62a5\u544a\u6e90\u6570\u636e\uff0c\u6211\u4eec\u5728 report/allure_html \u76ee\u5f55\u4e0b\u7ed9\u4f60\u751f\u6210\u4e86 html \u6587\u4ef6\uff0c\u4f46\u662f\u4f60\u4e0d\u80fd\u76f4\u63a5\u901a\u8fc7\u6d4f\u89c8\u5668\u6253\u5f00 index.html \u6587\u4ef6\uff0c\u56e0\u4e3a allure \u7684\u62a5\u544a\u90fd\u662f\u57fa\u4e8e\u5728\u7ebf\u7684\u670d\u52a1\uff0c\u4f60\u5e94\u8be5\u8fd9\u6837\u6253\u5f00\uff1a allure open report/allure_html\n \u4f7f\u7528 manage.py \u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u5728\u7ec8\u7aef\u7684\u6700\u540e\u4e00\u884c\uff0c\u6211\u4eec\u4f1a\u7ed9\u4f60\u8f93\u51fa\u6253\u5f00\u62a5\u544a\u7684\u547d\u4ee4\uff0c\u76f4\u63a5\u590d\u5236\u5b83\u5728\u7ec8\u7aef\u6267\u884c\u5c31\u53ef\u4ee5\u67e5\u770b\u4e86\uff0c\u50cf\u8fd9\u6837\uff1a \u7ec8\u7aef\u6267\u884c\u547d\u4ee4: allure open /tmp/youqu/report/allure_html \u67e5\u770b\u62a5\u544a \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 Pycharm \u91cc\u9762\u627e\u5230 index.html \u6587\u4ef6\uff0c\u7136\u540e\u53f3\u952e\u9009\u62e9\u6d4f\u89c8\u5668\u6253\u5f00\uff0c\u6216\u8005\u4f60\u53ef\u4ee5\u7528\u4e00\u4e2a http \u670d\u52a1\u6253\u5f00\u3002 \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 report/allure \u76ee\u5f55\u4e0b\u67e5\u770b\u62a5\u544a\uff1a allure serve report/allure\n \u8fdc\u7a0b\u6267\u884c \u8fdc\u7a0b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\uff0c\u4f1a\u5c06\u6240\u6709\u8fdc\u7a0b\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u62a5\u544a\u90fd\u6536\u96c6\u5230 report/allure \u76ee\u5f55\u4e0b\uff0c\u5206\u522b\u6309\u7167\u673a\u5668\u7684 IP \u7b49\u5efa\u4e86\u4e0d\u540c\u7684\u76ee\u5f55\uff0c\u4f60\u53ef\u4ee5\u5728\u8fd9\u4e9b\u76ee\u5f55\u91cc\u9762\u53bb\u67e5\u770b\u5bf9\u5e94\u7684\u6d4b\u8bd5\u62a5\u544a\uff0c\u67e5\u770b\u65b9\u6cd5\u548c\u524d\u9762\u672c\u5730\u6267\u884c\u67e5\u770b\u7684\u65b9\u6cd5\u4e00\u6837\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_10","title":"\u5341\u4e8c\u3001\u9759\u6001\u4ee3\u7801\u626b\u63cf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_8","title":"1. \u63d0\u524d\u89e3\u51b3\u4ee3\u7801\u95ee\u9898","text":"\u4e3a\u4e86\u5e2e\u52a9\u5f00\u53d1\u8005\u7edf\u4e00\u4ee3\u7801\u98ce\u683c\uff0cPython \u793e\u533a\u63d0\u51fa\u4e86 PEP8 \u4ee3\u7801\u7f16\u7801\u98ce\u683c\uff0cPython \u5b98\u65b9\u540c\u65f6\u63a8\u51fa\u4e86\u4e00\u4e2a\u68c0\u67e5\u4ee3\u7801\u98ce\u683c\u662f\u5426\u7b26\u5408 PEP8 \u7684\u5de5\u5177\uff0c\u540d\u5b57\u4e5f\u53eb PEP8\u3002 \u4f46\u662f\uff0cPycharm \u91cc\u9762\u7684 PEP8 \u63d2\u4ef6\u5b9e\u9645\u4e0a\u5e76\u4e0d\u80fd\u53d1\u73b0\u5f88\u591a\u4ee3\u7801\u95ee\u9898\uff0c\u8fd9\u4e9b\u95ee\u9898\u5e76\u4e0d\u4f1a\u5728\u8fd0\u884c\u65f6\u62a5\u9519\uff0c\u56e0\u4e3a\u4ece Python \u8bed\u8a00\u89d2\u5ea6\u5e76\u4e0d\u5173\u5fc3\u8fd9\u4e9b\u95ee\u9898\uff0c\u5728 Pycharm \u7f16\u8f91\u5668\u91cc\u9762\u4f7f\u7528\u5feb\u6377\u952e ctrl + alt + L\uff0c\u6709\u4e00\u70b9\u70b9\u683c\u5f0f\u5316\u7684\u6548\u679c\uff0c\u80fd\u89e3\u51b3\u4e00\u4e9b\u7a7a\u683c\u3001\u6362\u884c\u7b49\u5c0f\u95ee\u9898\u3002 \u8fd9\u91cc\u63a8\u8350\u4e00\u4e2a Python \u793e\u533a\u6d41\u884c\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff1a Black\uff0c\u53f7\u79f0\u4e0d\u59a5\u534f\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff0c\u5b83\u68c0\u6d4b\u5230\u4e0d\u7b26\u5408\u89c4\u8303\u7684\u4ee3\u7801\u98ce\u683c\u76f4\u63a5\u5c31\u5e2e\u4f60\u5168\u90e8\u683c\u5f0f\u5316\u597d\uff0c\u5c31\u662f\u8fd9\u4e48\u521a\uff01 \u5b89\u88c5\uff1a sudo pip3 install black \n \u4f7f\u7528\u65b9\u6cd5\uff1a black ${CheckPath}\n \u4f7f\u7528\u8fd9\u4e2a\u5de5\u5177\u683c\u5f0f\u5316\u4e4b\u540e\uff0c\u4ee3\u7801\u4f1a\u88ab\u81ea\u52a8\u8c03\u6574\uff0c\u521a\u5f00\u59cb\u4f60\u53ef\u80fd\u4f1a\u89c9\u5f97\u8c03\u6574\u5f97\u5f88\u5938\u5f20\uff0c\u6ca1\u5173\u7cfb\u575a\u6301\u770b\uff0c\u4e60\u60ef\u4e4b\u540e\uff0c\u4f60\u4f1a\u89c9\u5f97\u5f88\u4f18\u96c5\uff0c\u6ca1\u9519\uff0c\u8fd9\u5c31\u662f Pythonic Code \u7684\u6838\u5fc3\uff0c\u8bf7\u4fdd\u6301\u4f18\u96c5\uff5e\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_8","title":"2. \u4ee3\u7801\u626b\u63cf\u5de5\u5177","text":"\u4f7f\u7528\u6839\u76ee\u5f55\u4e0b pylint.sh \u626b\u63cf\u4ee3\u7801\uff0c\u5728 report \u76ee\u5f55\u4e0b\u67e5\u770b\u4ee3\u7801\u626b\u63cf\u62a5\u544a\uff0c\u5982\u679c\u6709\u4ee3\u7801\u95ee\u9898\u8bf7\u63d0\u524d\u89e3\u51b3\u4e4b\u540e\u518d\u63d0\u4ea4\u3002 \u6b64\u811a\u672c\u5df2\u7ecf\u4f7f\u7528 Python \u793e\u533a\u6700\u6d41\u884c\u7684\u4ee3\u7801\u626b\u63cf\u5de5\u5177 Pylint \u8fdb\u884c\u4ee3\u7801\u626b\u63cf\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a bash pylint.sh\n \u8fd0\u884c\u4e4b\u540e\u4f1a\u63d0\u793a\u4f60\u8981\u626b\u63cf\u7684\u76ee\u5f55\uff0c\u6bd4\u5982\u8f93\u5165 apps \uff0c\u5219\u4f1a\u626b\u63cf apps \u4e0b\u7684\u6240\u6709 Python \u4ee3\u7801\u3002 \u5728 setting/pylintrc.cfg \u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u76f8\u5173\u914d\u7f6e\uff0c\u626b\u63cf\u5b8c\u6210\u4e4b\u540e\u5728 report/pylints \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u626b\u63cf\u62a5\u544a\u3002 \u4ee3\u7801\u63d0\u4ea4\u9700\u901a\u8fc7 git review \u63d0\u4ea4\u5230 gerrit \uff0c\u4eba\u5de5 Code Review \u901a\u8fc7\u4e4b\u540e\u5408\u5165\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_11","title":"\u5341\u4e09\u3001\u63d0\u4ea4\u4ee3\u7801","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_9","title":"1. \u5b89\u88c5\u4f9d\u8d56","text":"sudo apt install git-review\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_9","title":"2. \u63d0\u4ea4\u6a21\u677f","text":"\u5728 ~ \u76ee\u5f55\u4e0b\u65b0\u5efa\u6587\u4ef6\uff0c\u5e76\u547d\u540d\u4e3a gitcommit_template \u5c06\u4ee5\u4e0b\u5185\u5bb9\u5199\u5165\u6587\u4ef6\u5f53\u4e2d\uff1a # commit type :fix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style(\u98ce\u683c\u4fee\u6539)\u3001refactor(\u91cd\u6784)\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test(\u6d4b\u8bd5) + \u7b80\u5355\u63cf\u8ff0. \u9ed8\u8ba4fix,\u6839\u636e\u60c5\u51b5\u4fee\u6539\nfix: \n\n# \u8be6\u7ec6\u8bf4\u660e\u4ee3\u7801\u7684\u6539\u52a8\uff0c\u5305\u542b\u4ee3\u7801\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u4ee5\u53ca\u4e3a\u4ec0\u4e48\u8fd9\u4e48\u505a\uff0c\u53ef\u80fd\u4f1a\u5f71\u54cd\u54ea\u4e9b\u529f\u80fd\u3002\u5bf9\u4e8e\u4ee3\u7801\u7684\u5ba1\u6838\u8005\uff0c\u9700\u8981\u4ece\u8fd9\u6bb5\u63cf\u8ff0\u4e2d\u80fd\u5b8c\u5168\u7406\u89e3\u4ee3\u7801\u4e2d\u6240\u6709\u6539\u52a8\u7684\u5185\u5bb9\nDescription: \n\n# \u5199\u4e00\u6bb5\u9762\u5411\u4e8e\u4ea7\u54c1\u7684\u603b\u7ed3\u6027\u5185\u5bb9\uff0c\u7528\u4e8e\u81ea\u52a8\u751f\u6210crp\u4e0a\u7684changlog\uff0c\u9700\u8981\u6ce8\u610f\u7684\u4e8b\uff0c\u8fd9\u6bb5\u63cf\u8ff0\u5fc5\u987b\u4ece\u4ea7\u54c1\u7684\u89d2\u5ea6\u8003\u8651\u3002\nLog: \n\n# \u5173\u8054pms\u4e0a\u7684bug\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94bug\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4fee\u590dbug\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Bug: \n\n# \u4fee\u590d github issue \n#Issue: \n\n# \u5173\u8054pms\u4e0a\u7684\u4efb\u52a1\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94\u4efb\u52a1\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4efb\u52a1\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Task: \n \u547d\u4ee4\u884c\u6267\u884c: git config --global commit.template ~/gitcommit_template\n \u6b64\u547d\u4ee4\u5c06\u6a21\u677f\u52a0\u5165\u5230 git \u7684\u63d0\u4ea4\u6a21\u677f\u4e2d\u3002 \u540e\u7eed\u63d0\u4ea4\u7684\u65f6\u5019\u9700\u8981\u5173\u6ce8\u4e00\u4e0b\u51e0\u70b9\uff1a commit type \u5bf9\u5e94\u4e0d\u540c\u7684\u4fee\u6539\u7c7b\u578b\uff1afix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style \uff08\u98ce\u683c\u4fee\u6539\uff09\u3001refactor \uff08\u91cd\u6784\uff09\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test \uff08\u6d4b\u8bd5\uff09 commit type \u5192\u53f7\u540e\u9762\u52a0\u7a7a\u683c\u3002 Description \u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u9700\u8981\u8fdb\u884c\u8be6\u7ec6\u8bf4\u660e\uff0c\u6bd4\u5982\u5bf9\u529f\u80fd\u8fdb\u884c\u5927\u6539\u7b49\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_6","title":"3. \u63a8\u9001\u4ee3\u7801","text":"\u9996\u5148\u6dfb\u52a0 commit \u4fe1\u606f git add \u540e\u9762\u52a0\u6587\u4ef6\u540d\u79f0\n git add . # \u8868\u793a\u6dfb\u52a0\u6240\u6709\u6587\u4ef6\n \u4f7f\u7528\u8fd9\u6761\u547d\u4ee4\u6ce8\u610f\u6709\u4e9b\u4e34\u65f6\u6587\u4ef6\u4e0d\u8981\u63d0\u4ea4\u5230\u4ed3\u5e93\u4e86\u3002 git commit -a\n \u4e4b\u540e\u5728 fix: \u540e\u9762\uff08\u6ce8\u610f\u5192\u53f7\u540e\u9762\u5fc5\u987b\u52a0\u7a7a\u683c\uff0c\u4e0d\u7136\u76f4\u63a5-1\uff09\u5199\u672c\u5730\u63d0\u4ea4\u7684 commit \u4fe1\u606f\uff0c\u7136\u540e\u5c31\u53ef\u4ee5\u63d0\u4ea4\u4ee3\u7801\u4e86 git review branch(\u5f53\u524d\u5206\u652f) -r origin\n \u6700\u597d\u4e00\u6b21 commit\uff0c\u4e00\u6b21 git review \uff0c\u7ecf\u5e38\u6709\u540c\u5b66\u5728\u672c\u5730\u75af\u72c2 commit \u6700\u540e git review \u62a5\u9519\u4e0d\u77e5\u9053\u548b\u56de\u4e8b\u513f\u3002 \u82e5\u4e0d\u60f3\u6bcf\u6b21\u63d0\u4ea4\u90fd\u52a0\u4e0a -r \u9009\u9879\uff0c\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a git config --global gitreview.remote origin \u63d0\u4ea4\u4ee3\u7801\uff0c\u76f4\u63a5\u4f7f\u7528 git review branch<\u76ee\u6807\u5206\u652f>\uff0c\u4f8b\u5982 git review master"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git","title":"4. Git\u6807\u7b7e","text":"Git \u6807\u7b7e\u5b9e\u9645\u4e0a\u662f commit \u7684\u4e00\u4e2a\u522b\u540d\uff0c\u4e3b\u8981\u7528\u4e8e\u7ba1\u7406\u5386\u53f2\u7248\u672c\u3002 \u60f3\u8c61\u4e00\u4e0b\u9886\u5bfc\u8ba9\u4f60\u628a\u4e4b\u524d\u7684\u67d0\u4e2a\u7248\u672c\u7684\u4ee3\u7801\u62c9\u51fa\u6765\u8dd1\uff0c\u4f60\u662f\u4e0d\u662f\u4e56\u4e56\u7684\u53bb\u628a\u6240\u6709\u63d0\u4ea4\u8bb0\u5f55\u62c9\u51fa\u6765\u627e\uff0c\u7136\u540e\u627e\u5230\u90a3\u4e2a\u54c8\u5e0c\u503c\uff0c\u901a\u8fc7\u54c8\u5e0c\u503c\u6765\u68c0\u51fa\u4ee3\u7801\u3002 \u8fd9\u4e00\u5957\u64cd\u4f5c\u4e0b\u6765\u662f\u4e0d\u662f\u5f88\u9ebb\u70e6\uff0c\u8d39\u65f6\u95f4\u8fd8\u4e0d\u4e00\u5b9a\u80fd\u627e\u5f97\u5230\uff0c\u6ca1\u4eba\u80fd\u8bb0\u4f4f\u6bcf\u4e2a\u63d0\u4ea4\u54c8\u5e0c\u503c\u4ee5\u53ca\u8fd9\u6b21\u63d0\u4ea4\u90fd\u6539\u4e86\u54ea\u4e9b\u4ee3\u7801\u3002 \u56e0\u6b64\u7ed9\u63d0\u4ea4\u6253\u4e2a\u6807\u7b7e\uff0c\u5c31\u662f\u628a\u54c8\u5e0c\u503c\u8f6c\u6362\u6210\u4eba\u7c7b\u80fd\u7406\u89e3\u7684\u8bed\u8a00\uff0c\u6bd4\u5982 v1.0\uff0c\u5c31\u53ef\u4ee5\u76f4\u63a5\u901a\u8fc7\u6807\u7b7e\u627e\u5230\u5bf9\u5e94\u7684\u63d0\u4ea4\u3002 \u65b0\u5efa\u6807\u7b7e git tag -a <tagname>\n \u56de\u8f66\u4e4b\u540e\uff0cGit \u4f1a\u6253\u5f00\u4f60\u7684\u7f16\u8f91\u5668\uff0c\u8ba9\u4f60\u5199\u4e00\u53e5\u6807\u7b7e\u6ce8\u89e3\uff0c\u5c31\u50cf\u4f60\u7ed9\u63d0\u4ea4\u5199\u6ce8\u89e3\u4e00\u6837\u3002 \u67e5\u770b\u6240\u6709\u6807\u7b7e git tag -l\n# git tag \u4e5f\u884c\n \u5220\u9664\u6807\u7b7e git tag -d <tagname>\n \u63a8\u9001\u6807\u7b7e\u81f3\u8fdc\u7a0b git push \u547d\u4ee4\u5e76\u4e0d\u4f1a\u4f20\u9001\u6807\u7b7e\u5230\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\uff0c\u5fc5\u987b\u663e\u5f0f\u5730\u63a8\u9001\u6807\u7b7e\u3002 git push origin <tagname>\n \u63a8\u9001\u6240\u6709\u4e0d\u5728\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\u7684\u6807\u7b7e git push origin --tag\n \u5220\u9664\u8fdc\u7a0b\u6807\u7b7e git push origin :refs/tag/<tagname>\n \u540e\u671f\u6253\u6807\u7b7e \u5148\u7528 git log --pretty=oneline \u67e5\u8be2\u63d0\u4ea4\u8bb0\u5f55\uff0c\u83b7\u53d6\u6821\u9a8c\u7801\u3002 git tag -a <tagname> 9fceb02(\u6821\u9a8c\u7801)\n \u68c0\u51fa\u6807\u7b7e git checkout <tagname>\n \u6b64\u65f6\uff0c\u4ed3\u5e93\u4f1a\u5904\u4e8e\u201c\u5206\u79bb\u5934\u6307\u9488\uff08detached HEAD\uff09\u201d\u7684\u72b6\u6001\u3002 \u5728\u201c\u5206\u79bb\u5934\u6307\u9488\u201d\u72b6\u6001\u4e0b\uff0c\u5982\u679c\u4f60\u505a\u4e86\u67d0\u4e9b\u66f4\u6539\u7136\u540e\u63d0\u4ea4\u5b83\u4eec\uff0c\u6807\u7b7e\u4e0d\u4f1a\u53d1\u751f\u53d8\u5316\uff0c \u4f46\u4f60\u7684\u65b0\u63d0\u4ea4\u5c06\u4e0d\u5c5e\u4e8e\u4efb\u4f55\u5206\u652f\uff0c\u5e76\u4e14\u5c06\u65e0\u6cd5\u8bbf\u95ee\uff0c\u9664\u975e\u901a\u8fc7\u786e\u5207\u7684\u63d0\u4ea4\u54c8\u5e0c\u624d\u80fd\u8bbf\u95ee\u3002 \u56e0\u6b64\uff0c\u5982\u679c\u4f60\u9700\u8981\u8fdb\u884c\u66f4\u6539\uff0c\u6bd4\u5982\u4f60\u8981\u4fee\u590d\u65e7\u7248\u672c\u4e2d\u7684\u9519\u8bef\uff0c\u90a3\u4e48\u901a\u5e38\u9700\u8981\u521b\u5efa\u4e00\u4e2a\u65b0\u5206\u652f\uff1a git checkout -b <NewBranchName> <tagname>\n \u65b0\u5206\u652f\u4e0a\u53ef\u4ee5\u8fdb\u884c\u63d0\u4ea4\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_12","title":"\u5341\u56db\u3001\u5e38\u89c1\u95ee\u9898","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_10","title":"1. \u63d0\u4ea4\u4ee3\u7801\u65f6\u63d0\u793a\u90ae\u7bb1\u6216\u8005\u540d\u79f0\u4e0d\u5bf9","text":"\u91cd\u65b0\u914d\u7f6e\u90ae\u7bb1\u6216\u8005\u540d\u79f0\uff0c\u7136\u540e\u91cd\u7f6e\u751f\u6548\uff1a git commit --amend --reset-author\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_10","title":"2. \u600e\u4e48\u56de\u6eda\u5230\u4e4b\u524d\u7684\u7248\u672c","text":"(1)\u67e5\u8be2\u5386\u53f2\u63d0\u4ea4\u8bb0\u5f55 git log\n \u627e\u5230\u4f60\u8981\u56de\u6eda\u7684\u7248\u672c\uff0c\u590d\u5236 hash \u503c\u3002 \u6ce8\u610f\uff1a\u662f commit \u7a7a\u683c\u4e4b\u540e\u7684 hash \u503c\uff0c\u4e4b\u524d\u6709\u540c\u5b66\u590d\u5236\u7684 Change-Id: \u8fd9\u6837\u80af\u5b9a\u62a5\u9519\u3002 (2)\u56de\u6eda\u7248\u672c\uff0c\u4e0d\u6e05\u9664\u4ee3\u7801 git reset --soft ${hash}\n (3)\u56de\u6eda\u7248\u672c\uff0c\u6e05\u9664\u4ee3\u7801\uff0c\u614e\u7528\u54c8 git reset --hard ${hash}\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-f-s-e","title":"3. \u6d4b\u8bd5\u62a5\u544a\u91cc\u9762 F S . E \u662f\u4ec0\u4e48\u610f\u601d","text":"F \u8868\u793a\u5931\u8d25\uff0c. \uff08\u70b9\uff09\u8868\u793a\u901a\u8fc7\uff0cS \u8868\u793a\u8df3\u8fc7\uff0cE \u8868\u793a error \u6709\u62a5\u9519"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git-status","title":"4. \u89e3\u51b3 git status \u4e2d\u6587\u663e\u793a\u7684\u95ee\u9898","text":"git config --global core.quotePath false\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5-apps","title":"5. apps \u76ee\u5f55\u4e0b\u989c\u8272\u6709\u4e9b\u662f\u9ec4\u8272\u7684","text":"\u5728 Pycharm \u4e2d apps \u76ee\u5f55\u4e0b\u5e94\u7528\u5e93\u6587\u4ef6\u662f\u9ec4\u8272\u7684\uff0c\u7f16\u8f91\u5668\u8bc6\u522b\u4e0d\u5230\u4ee3\u7801\u65b0\u589e\u548c\u4fee\u6539\uff1b \u7531\u4e8e\u793e\u533a\u7248 Pycharm \u4e0d\u80fd\u52a8\u6001\u8bc6\u522b\u591a\u4ed3\u5e93\uff0c\u9700\u8981\u5728 setting \u91cc\u9762\u624b\u52a8\u6ce8\u518c\uff0c\u64cd\u4f5c\u6b65\u9aa4\uff1a File \u2014> Settings \u2014> Version Control \u2014> \u70b9 + \u53f7 \u2014> Directory \u9009\u4e2d\u5e94\u7528\u5e93\u5de5\u7a0b\u76ee\u5f55 \u2014> VCS \u9009\u4e2d Git \u2014> Apply \u5982\u6b64\u5c31\u53ef\u4ee5\u4e86\u3002 \u4e13\u4e1a\u7248 Pycharm \u4e0d\u5b58\u5728\u8fd9\u4e2a\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#6-envsh-r","title":"6. \u6267\u884c env.sh \u62a5\u9519 $'\\r':\u672a\u627e\u5230\u547d\u4ee4","text":"\u51fa\u73b0\u8fd9\u4e2a\u95ee\u9898\u4f60\u5e94\u8be5\u662f\u5728 windows \u4e0a\u6253\u5f00\u6216\u7f16\u8f91\u8fc7 env.sh \u811a\u672c\uff0cwindows\u4e0b\u7684\u6362\u884c\u662f\u56de\u8f66\u7b26+\u6362\u884c\u7b26\uff0c\u4e5f\u5c31\u662f\\r\\n\uff0c\u800c Linxu \u4e0b\u662f\u6362\u884c\u7b26 \\n\uff0cLinux \u4e0b\u4e0d\u8bc6\u522b \\r\uff0c\u56e0\u6b64\u62a5\u9519\u3002 \u89e3\u51b3\u65b9\u6848\uff1a # \u5c06 \\r \u66ff\u6362\u4e3a\u7a7a\nsudo sed -i 's/\\r//' env.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#7","title":"7.\u600e\u6837\u4e3a\u5355\u72ec\u67d0\u4e00\u6761\u7528\u4f8b\u914d\u7f6e\u6267\u884c\u8d85\u65f6\u65f6\u95f4","text":"\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u5982\u4e0b\uff1a @pytest.mark.timeout(300) # \u5355\u4f4d\u79d2\ndef test_xxx_001():\npass\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#8-youqu","title":"8. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u6240\u6709\u4ee3\u7801\uff0c\u5305\u542b\u5b50\u4ed3\u5e93","text":"\u524d\u7f6e\u6761\u4ef6\uff1a\u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 # \u7b2c\u4e00\u6b21\u5b58\u50a8\u5bc6\u7801\uff0c\u63d0\u4f9b\u540e\u9762\u62c9\u4ee3\u7801(gerrit: ldap\u8d26\u53f7\u548c\u5bc6\u7801\uff0cgit\u62c9\u53d6\u7b2c\u4e00\u6b21\u8f93\u5165\u4fdd\u5b58\uff0c\u540e\u9762\u76f4\u63a5\u4f7f\u7528)\ngit config --global credential.helper store\n\n# \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\uff0c\u5e76\u9012\u5f52\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\" --recursive\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#9-youqu","title":"9. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\u6307\u5b9a\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u524d\u7f6e\u6761\u4ef6\uff1a \u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 \u5df2\u5b58\u50a8\u8bbf\u95ee\u5bc6\u7801 # \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\"\n# \u6307\u5b9a\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ncd youqu\ngit submodule update --init apps/autotest_xxx_xxx\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#10-youqu","title":"10. \u5982\u4f55\u66f4\u65b0 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\uff0c\u6240\u6709\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u66f4\u65b0\u6240\u6709\u5b50\u4ed3\u5e93\u4ee3\u7801 cd youqu\ngit pull & git submodule foreach git pull\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#11-youqu-master-detached-head","title":"11. \u5982\u4f55\u4fee\u590d YouQu \u6240\u6709\u5b50\u4ed3\u5e93 master \u5206\u652f\u6e38\u79bb\u5934\uff08detached head\uff09","text":"\u4fee\u590d\u6240\u6709\u5b50\u4ed3\u5e93\u9ed8\u8ba4master \u5206\u652f\u6e38\u79bb\u5934 cd youqu\ngit submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/","title":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212 \u5206\u7c7b\uff1a/ \u67b6\u6784\u5e08\uff1a/ \u76ee\u6807\uff1a \u5e94\u7528 AT \u67b6\u6784\u5de5\u7a0b\u5316\uff0c\u53c2\u8003\u6027\u80fd\u81ea\u52a8\u5316\u5de5\u7a0b\u5b8c\u6210\u5de5\u7a0b\u5316\u6539\u9020\u3002 \u5e94\u7528\u95f4\u7528\u4f8b\u89e3\u8026\uff0c\u89e3\u9664\u6240\u6709\u4ea4\u53c9\u8c03\u7528\u7684\u65b9\u6cd5\uff0c\u5404\u5e94\u7528\u80fd\u8ddf\u968f\u81ea\u8eab\u8fed\u4ee3\u5468\u671f\u72ec\u7acb\u7ef4\u62a4 AT \u7528\u4f8b\u3002 \u5b8c\u6210\u516c\u5171\u65b9\u6cd5\u7684\u62bd\u53d6\u6574\u5408\uff0c\u5f62\u6210\u4e00\u5957\u72ec\u7acb\u4e8e\u5e94\u7528\u95f4\u7684\u516c\u5171\u65b9\u6cd5\u5e93\uff0c\u5404\u5e94\u7528\u65b9\u6cd5\u91cc\u9762\u4e0d\u5b58\u5728\u88ab\u591a\u4e2a\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\u3002 \u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u4e3a\u5c06\u6765\u9002\u914d\u66f4\u591a\u7684 AT \u8fd0\u7528\u573a\u666f\u63d0\u4f9b\u652f\u6491\uff0c\u539f\u5219\u4e0a\u53ef\u5b9e\u73b0\u65e0\u9650\u6269\u5c55\uff0c\u5728\u6bcf\u65e5\u6784\u5efa\u548c\u6301\u7eed\u96c6\u6210\u6d41\u7a0b\u843d\u5730\u4f7f\u7528\u3002 \u4ee3\u7801\u89c4\u8303\u95ee\u9898\u6e05\u96f6\uff0c\u7b26\u5408 Shell Check\u3001Pylint\u3001\u7cfb\u7edf\u90e8\u76f8\u5173\u7f16\u7801\u89c4\u8303\u8981\u6c42\u3002 \u610f\u4e49\uff1a \u7edf\u4e00\u6210\u7814 AT \u67b6\u6784\u8bbe\u8ba1\u601d\u8def\uff0c\u6d88\u9664 AT \u4ee3\u7801\u5b9e\u73b0\u548c\u7ef4\u62a4\u4e0a\u53ef\u80fd\u51fa\u73b0\u7684\u5206\u6b67\uff0c\u6539\u5584\u5386\u53f2 AT \u65e0\u5de5\u7a0b\u5316\u8bbe\u8ba1\u7684\u7f3a\u9677\uff0c\u63d0\u9ad8\u67b6\u6784\u4e13\u4e1a\u6027\u3002 \u5404\u5e94\u7528 AT \u4ee3\u7801\u76f8\u4e92\u72ec\u7acb\uff0c\u5951\u5408\u5e94\u7528\u72ec\u7acb\u53d1\u5e03\u7279\u6027\uff0c\u53ef\u652f\u6301\u8fed\u4ee3\u671f\u95f4\u72ec\u7acb\u65b0\u589e\u3001\u7ef4\u62a4\u548c\u6267\u884c\u3002 \u65b9\u6cd5\u8c03\u7528\u903b\u8f91\u5f97\u5230\u7b80\u5316\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u66f4\u9ad8\u6548\uff1b\u516c\u5171\u5e93\u62bd\u53d6\uff0c\u51cf\u5c11\u65b9\u6cd5\u91cd\u590d\u7f16\u5199\uff0c\u63d0\u9ad8\u4ee3\u7801\u5229\u7528\u7387\uff1b\u5e73\u5747\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u4ece40\u5206\u949f\u964d\u4f4e\u81f330\u5206\u949f\uff0c\u65e5\u4ea7\u51fa\u7528\u4f8b\u4ece12\u6761/\u5929\u63d0\u5347\u81f316\u6761/\u5929\u3002 \u53ef\u7075\u6d3b\u652f\u6491\u4e0d\u540c\u7684\u81ea\u52a8\u5316\u8fd0\u7528\u573a\u666f\uff0c\u5982 CI\u3001\u5192\u70df\u6d4b\u8bd5\u3001\u96c6\u6210\u6d4b\u8bd5\u3001\u56de\u5f52\u6d4b\u8bd5\u3001\u4e13\u9879\u6d4b\u8bd5\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_2","title":"\u4e00\u3001\u80cc\u666f\u4ecb\u7ecd","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1","title":"1\u3001\u73b0\u6709\u67b6\u6784\u4ecb\u7ecd","text":"\u73b0\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u6574\u4f53\u5206\u4e3a\u4e09\u5c42\uff1a\u7528\u4f8b\u5c42\uff08\u4e1a\u52a1\u903b\u8f91\u5c42\uff09\u3001\u4e2d\u95f4\u5c42\uff08\u5143\u7d20\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff09\u3001\u6838\u5fc3\u5c42\uff08\u5e95\u5c42\u529f\u80fd\u5e93\u5c42\uff09\u3002 \u7528\u4f8b\u5c42\uff1a\u5373\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4e13\u6ce8\u4e8e\u4e1a\u52a1\u529f\u80fd\u903b\u8f91\uff0c\u4e0d\u5173\u5fc3\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\uff1b \u4e2d\u95f4\u5c42\uff1a\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff0c\u6bcf\u4e2a\u65b9\u6cd5\u5747\u5bf9\u5e94\u4e00\u4e2a\u5143\u7d20\u7684\u4e00\u4e2a\u5177\u4f53\u64cd\u4f5c\uff0c\u4e5f\u53ef\u4ee5\u662f\u591a\u4e2a\u64cd\u4f5c\u7684\u7ec4\u5408\u64cd\u4f5c\uff0c\u4e2d\u95f4\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u7528\u4f8b\u5c42\uff0c\u5177\u6709\u53ef\u6269\u5c55\u6027\u548c\u590d\u7528\u6027\uff1b \u6838\u5fc3\u5c42\uff1a\u4e3b\u8981\u5c01\u88c5\u7684\u5e95\u5c42\u529f\u80fd\u5b9e\u73b0\uff0c\u6b64\u5c42\u5728\u6846\u67b6\u4e2d\u63d0\u4f9b\u4e00\u4e9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u529f\u80fd\u6a21\u5757\u76f8\u5bf9\u72ec\u7acb\uff0c\u6838\u5fc3\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u64cd\u4f5c\u5c42\uff0c\u6bd4\u5982\uff1a\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7 UI \u5750\u6807\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u952e\u9f20\u64cd\u4f5c\u7684\u57fa\u7840\u65b9\u64cd\u4f5c\u6a21\u5757\u3001Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757\u3001\u6587\u4ef6\u7684\u589e\u5220\u6539\u67e5\u64cd\u4f5c\u6a21\u5757\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2","title":"2\u3001\u81ea\u52a8\u5316\u7684\u5e94\u7528","text":"2.1\u3001CI \u6d41\u7a0b \u6bcf\u65e5\u6784\u5efa\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u7814\u53d1\u6bcf\u65e5\u63d0\u4ea4\u7684\u4ee3\u7801\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u73ed\u4e4b\u540e\u4f1a\u5c06\u5404\u5e94\u7528\u8fdb\u884c\u6253\u5305\uff0c\u7136\u540e\u5728\u6d4b\u8bd5\u673a\u4e0a\u5b89\u88c5\u66f4\u65b0 deb \u5305\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u5e94\u7528\u63d0\u4ea4\u96c6\u6210\u7684\u7248\u672c\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u8f7d\u6700\u65b0\u7684 ISO \u8fdb\u884c PXE \u90e8\u7f72\uff0c\u7136\u540e\u6d4b\u8bd5\u673a\u5b89\u88c5\u6700\u65b0\u7684\u955c\u50cf\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 2.2\u3001\u9a8c\u6536\u6d4b\u8bd5 \u5728\u5404\u9a8c\u6536\u8282\u70b9\u8fdb\u884c\u81ea\u52a8\u5316\u9a8c\u6536\uff0c\u76ee\u524d\u7684\u7b56\u7565\u662f\u5168\u7528\u4f8b\u8986\u76d6\u5168\u67b6\u6784\u3002 2.3\u3001\u56de\u5f52\u6d4b\u8bd5 \u56de\u5f52\u6d4b\u8bd5\u4eca\u5e74\u89c4\u5212\u5efa\u8bbe\u4e2d\uff0c\u65e8\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u6267\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\uff0c\u51cf\u5c11\u529f\u80fd\u6d4b\u8bd5\u7684\u91cd\u590d\u52b3\u52a8\u529b\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3","title":"3\u3001\u5b58\u5728\u7684\u95ee\u9898","text":" \u5404\u5e94\u7528\u4e4b\u95f4\u5b58\u5728\u8026\u5408 \u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u521d\u671f\uff0c\u6240\u6709\u5e94\u7528\u662f\u6574\u4f53\u53d1\u5e03\uff0c\u6211\u4eec\u662f\u5c06\u6240\u6709\u5e94\u7528\u770b\u6210\u662f\u4e00\u4e2a\u6574\u4f53\uff0c\u5404\u5e94\u7528\u4f5c\u4e3a\u5176\u4e2d\u7684\u4e00\u4e2a\u6a21\u5757\uff0c\u6240\u4ee5\u5b58\u5728\u5e94\u7528\u95f4\u65b9\u6cd5\u4ea4\u53c9\u8c03\u7528\u7684\u95ee\u9898\uff0c\u8fd9\u6837\u4ece\u6700\u521d\u7684\u8bbe\u8ba1\u6765\u8bb2\u786e\u5b9e\u80fd\u591f\u51cf\u5c11\u91cd\u590d\u4ee3\u7801\u7684\u7f16\u5199\u3002\u4f46\u662f\u73b0\u5728\u5e94\u7528\u8d70\u72ec\u7acb\u53d1\u5e03\uff0c\u5404\u5e94\u7528\u90fd\u6709\u81ea\u5df1\u7684\u8fed\u4ee3\u8282\u594f\uff0c\u5728\u65b0\u9700\u6c42\u5feb\u901f\u53d8\u5316\u7684\u8fc7\u7a0b\u4e2d\uff0c\u81ea\u52a8\u5316\u7ef4\u62a4\u53d8\u5f97\u5f02\u5e38\u56f0\u96be\uff0c\u539f\u56e0\u5c31\u662f\u81ea\u52a8\u5316\u9879\u76ee\u91cc\u9762\u5404\u4e2a\u5e94\u7528\u7684\u6709\u6bd4\u8f83\u591a\u7684\u8026\u5408\u5173\u7cfb\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u8fdb\u884c\u89e3\u8026\uff0c\u4ee5\u9002\u5e94\u5e94\u7528\u4e0d\u540c\u7684\u8fed\u4ee3\u5468\u671f\u3002 \u65e0\u6cd5\u7cbe\u51c6\u7684\u5212\u5206\u7528\u4f8b\u8303\u56f4 \u7528\u4f8b\u6267\u884c\u7684\u8303\u56f4\u4e0d\u591f\u7cbe\u51c6\uff0c\u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u4e3b\u8981\u901a\u8fc7\u7528\u4f8b\u7684\u5173\u952e\u8bcd core\uff08\u6838\u5fc3\uff09\u6765\u533a\u5206\u7528\u4f8b\u662f\u5426\u4e3a\u6838\u5fc3\u7528\u4f8b\uff0c\u4f46\u662f\u8fd9\u6837\u7684\u533a\u5206\u592a\u5bbd\u6cdb\u4e86\uff0c\u4e0d\u80fd\u9002\u5e94\u81ea\u52a8\u5316\u6d4b\u8bd5\u5728\u591a\u573a\u666f\u4e0b\u7684\u5e94\u7528\u3002\u5f88\u591a\u573a\u666f\u4e0b\u6211\u4eec\u8fd8\u9700\u8981\u6839\u636e\u7528\u4f8b\u7684\u7b49\u7ea7\u3001\u7528\u4f8b\u7684\u7c7b\u578b\u3001\u7528\u4f8b\u6765\u6e90\u7b49\u7b49\uff0c\u4e0d\u540c\u7684\u7ef4\u5ea6\u6765\u6311\u9009\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u5173\u952e\u5b57\u9700\u8981\u4eba\u5de5\u4e00\u6761\u6761\u7684\u6539\uff0c\u8d39\u65f6\u8d39\u529b\uff0c\u800c\u4e14\u4e0d\u597d\u7ef4\u62a4\u3002 \u53d7\u65b0\u9700\u6c42\u5f71\u54cd\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u597d\u7ef4\u62a4 \u76ee\u524d\u9700\u8981\u8df3\u8fc7\u7684\u7528\u4f8b\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684\u7528\u4f8b\u811a\u672c\u91cc\u9762\uff0c\u6dfb\u52a0\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\uff0c\u540e\u7eed\u89e3\u9664\u8df3\u8fc7\u7684\u65f6\u5019\u53c8\u9700\u8981\u627e\u5230\u8fd9\u6761\u811a\u672c\uff0c\u5220\u6389\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\u3002\u5728\u8df3\u8fc7\u7528\u4f8b\u8f83\u591a\u7684\u60c5\u51b5\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u96be\u5ea6\u3002 \u7f16\u5199\u7528\u4f8b\u65f6\u903b\u8f91\u6bd4\u8f83\u590d\u6742\uff0c\u9700\u8981\u8c03\u7528\u591a\u4e2a\u5e94\u7528\u7684\u65b9\u6cd5\u6a21\u5757\u3002 \u6846\u67b6\u6269\u5c55\u6027\u4e0d\u8db3\uff0c\u65e0\u6cd5\u6574\u5408\u6027\u80fd\u81ea\u52a8\u5316\u3001\u538b\u6d4b\u81ea\u52a8\u5316\u3001\u5b89\u5168\u81ea\u52a8\u5316\u7b49\u4e13\u9879\u6d4b\u8bd5\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_3","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u4e3a\u89e3\u51b3\u73b0\u6709\u95ee\u9898\uff0c\u9002\u5e94\u4e0d\u65ad\u4e30\u5bcc\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u66f4\u597d\u7684\u53d1\u6325\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4f5c\u7528\uff0c\u9700\u8981\u5bf9\u81ea\u52a8\u5316\u67b6\u6784\u53ca\u5404\u529f\u80fd\u6a21\u5757\u8fdb\u884c\u91cd\u65b0\u8bbe\u8ba1\u89c4\u5212\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_1","title":"1\u3001\u67b6\u6784\u8bbe\u8ba1","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_1","title":"2\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u6846\u67b6\u7684\u8fd0\u884c\u903b\u8f91\uff1a\u901a\u8fc7\u6838\u5fc3\u5c42\u63d0\u4f9b\u4e00\u4e2a\u57fa\u7840\u80fd\u529b\uff0c\u4e1a\u52a1\u5c42\u6839\u636e\u5b9e\u9645\u4e1a\u52a1\u9700\u6c42\uff08\u6d4b\u8bd5\u7528\u4f8b\uff09\u52a8\u6001\u52a0\u8f7d\u6838\u5fc3\u5c42\uff0c\u6267\u884c\u5165\u53e3\u52a0\u8f7d\u76f8\u5e94\u7684\u7528\u4f8b\u96c6\u5e76\u63a7\u5236\u6267\u884c\uff0c\u5e94\u7528\u5c42\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u9700\u6c42\uff0c\u901a\u8fc7\u76f8\u5e94\u7684\u914d\u7f6e\u9879\u8fdb\u884c\u914d\u7f6e\uff0c\u4ece\u800c\u89e6\u53d1\u81ea\u52a8\u5316\u6d4b\u8bd5\u4efb\u52a1\u3002 \u6838\u5fc3\u5c42\uff1a\u57fa\u672c\u4fdd\u6301\u4e0d\u53d8\uff0c\u90e8\u5206\u6a21\u5757\u4f1a\u6d89\u53ca\u5230\u65b0\u529f\u80fd\u5f00\u53d1\uff0c\u6838\u5fc3\u5c42\u5404\u529f\u80fd\u6a21\u5757\u4fdd\u6301\u72ec\u7acb\u6027\uff0c\u63d0\u4f9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u4f9b\u4e0a\u5c42\u8c03\u7528\uff1b \u5e95\u5c42\u6838\u5fc3\u6a21\u5757\u5305\u62ec\uff1a \u56fe\u50cf\u8bc6\u522b\u6a21\u5757 UI \u5b9a\u4f4d\u6a21\u5757 Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757 \u5c5e\u6027\u5b9a\u4f4d\u6a21\u5757 \u65e5\u5fd7\u6a21\u5757 \u952e\u9f20\u64cd\u4f5c\u6a21\u5757 \u6587\u4ef6\u64cd\u4f5c\u6a21\u5757 \u5f55\u5c4f\u6a21\u5757 \u81ea\u5b9a\u4e49\u65ad\u8a00\u6a21\u5757 \u7528\u4f8b\u6267\u884c\u6a21\u5757 PXE \u88c5\u673a\u6a21\u5757 \u952e\u9f20\u4fe1\u53f7\u6a21\u62df\u6a21\u5757 OCR \u6a21\u5757 \u4e1a\u52a1\u5c42\uff1a\u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e94\u7528\u5185\u5305\u542b\u591a\u4e2a\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5982\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7b49\uff0c\u540e\u7eed\u53ef\u4ee5\u6839\u636e\u9700\u8981\u5ac1\u63a5\u8fdb\u6765\u3002\u5176\u4e2d\u529f\u80fd\u6d4b\u8bd5\u8bbe\u8ba1\u601d\u8def\uff1a \u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e76\u5c06\u6d4b\u8bd5\u6570\u636e\u548c\u6d4b\u8bd5\u8d44\u6e90\u6574\u5408\u8fdb\u6765\uff0c\u589e\u52a0\u7528\u4f8b\u6807\u7b7e csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ed9\u6bcf\u6761\u7528\u4f8b\u6253\u6807\u7b7e\u3002 \u5404\u6807\u7b7e\u6240\u4f7f\u7528\u5bf9\u5e94\u7684\u5b57\u6bb5\u540d\u79f0\uff0c\u4f7f\u7528 csv \u6587\u4ef6\u7ef4\u62a4\u7528\u4f8b\u4e0e\u6807\u7b7e\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u5bf9\u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u53ef\u4ee5\u7ec4\u5408\u5176\u4e2d\u7684\u6807\u7b7e\u800c\u4ece\u9a71\u52a8\u5bf9\u5e94\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\uff0c\u517c\u5bb9\u73b0\u6709\u7528\u4f8b\u6807\u7b7e\uff0c\u4e14\u652f\u6301\u7528\u4f8b\u6807\u7b7e\u53ef\u6269\u5c55\uff1b \u4f7f\u7528 csv \u683c\u5f0f\u6587\u4ef6\u53ef\u4ee5\u65b9\u4fbf\u7684\u4f7f\u7528 Excel \u8868\u683c\u6253\u5f00\u8fdb\u884c\u7f16\u8f91\uff0c\u540c\u65f6\u7531\u4e8e csv \u6587\u4ef6\u5b9e\u9645\u662f\u4ee5\u90fd\u597d\u5206\u9694\u7684\u6587\u672c\u6587\u4ef6\uff0c\u4ee3\u7801\u4e2d\u53ef\u4ee5\u5728\u4e0d\u4f9d\u8d56\u4e09\u65b9\u5e93\u7684\u60c5\u51b5\u4e0b\u65b9\u4fbf\u5feb\u901f\u7684\u89e3\u6790\u5b83\uff0c\u53ef\u64cd\u4f5c\u6027\u548c\u53ef\u7ef4\u62a4\u6027\u8f83\u9ad8\u3002 \u5404\u4e2a\u5e94\u7528\u4e4b\u95f4\uff0c\u7528\u4f8b\u3001\u65b9\u6cd5\u3001\u6807\u7b7e\u548c\u8d44\u6e90\u90fd\u662f\u76f8\u4e92\u72ec\u7acb\u7684\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u7528\u4f8b\u65f6\u53ea\u9700\u8981\u81ea\u5df1\u5e94\u7528\u4e0b\u7684\u65b9\u6cd5\u548c\u516c\u5171\u5e93\u5373\u53ef\u3002 \u7ed3\u6784\u4e3e\u4f8b\uff1a .\n\u251c\u2500\u2500 apps\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_album # \u5e94\u7528\u540d (\u7528\u4e0b\u5212\u7ebf\u8fde\u63a5\u662f Python \u7f16\u7801\u89c4\u8303)\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_assert # \u65ad\u8a00\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_function_tag.csv # \u7528\u4f8b\u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 asan_cases # \u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases # \u529f\u80fd\u6d4b\u8bd5\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 res # \u6d4b\u8bd5\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config # \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_widget # \u5e94\u7528\u81ea\u5df1\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_widget # \u65b9\u6cd5\u57fa\u7c7b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 other_widget # \u8c03\u7528\u5176\u4ed6\u5e94\u7528\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_camera\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases\n\u2502\u00a0\u00a0 \u2502\u00a0 ...\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 public_widget # \u516c\u5171\u65b9\u6cd5\u5e93\n\u251c\u2500\u2500 config # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n...\n config \u914d\u7f6e\u6a21\u5757\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u76f8\u5e94\u914d\u7f6e\uff0c\u6d4b\u8bd5\u540c\u5b66\u53ef\u4ee5\u6839\u636e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5728 config \u91cc\u9762\u8fdb\u884c\u914d\u7f6e\u3002 \u5168\u5c40\u914d\u7f6e\uff1a \u6267\u884c\u4e00\u4e2a\u6216\u591a\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff1a\u5728 pattern \u91cc\u9762\u5199\u5165\u5e94\u7528\u5305\u540d\uff0c\u591a\u4e2a\u5e94\u7528\u4e4b\u95f4\u7528 or \u8fde\u63a5\uff0c\u5982 deepin-music or deepin-movie\uff1b \u5192\u70df\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a smoke\uff1b \u96c6\u6210\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a core \uff1b \u5168\u91cf\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u4e3a\u7a7a\u5373\u53ef\uff1b \u901a\u8fc7 tags \u7684\u914d\u7f6e\u6bd4\u8f83\u7075\u6d3b\uff0c\u540e\u9762\u6807\u7b7e\u5316\u7ba1\u7406\u7ae0\u8282\u4f1a\u8bb2\u5230\uff0c\u652f\u6301\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u7075\u6d3b\u914d\u7f6e\u3002 \u6307\u5b9a\u67d0\u53f0\u673a\u5668\u5728\u6307\u5b9a\u955c\u50cf\u7248\u672c\u4e0a\u6267\u884c\u7528\u4f8b\uff1a\u5728 IP \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a IP\uff0c\u5e76\u5728 URL \u91cc\u9762\u586b\u5165\u955c\u50cf\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u6846\u67b6\u4f1a\u8c03\u7528 PXE \u8fdb\u884c\u81ea\u52a8\u88c5\u673a\uff0c\u88c5\u673a\u5b8c\u4e4b\u540e\u81ea\u52a8\u5f00\u59cb\u6267\u884c\u914d\u7f6e\u7684\u6d4b\u8bd5\u7528\u4f8b\u3002 \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\uff1a \u6bcf\u4e2a\u5e94\u7528\u5185\u90e8\u4f1a\u6709\u4e00\u4e2a\u5355\u72ec\u7684\u914d\u7f6e\u6a21\u5757\uff0c\u4f1a\u5305\u542b\u4e00\u4e9b\u672c\u5e94\u7528\u7684\u6d4b\u8bd5\u8d44\u6e90\u7684\u8def\u5f84\u3001\u6267\u884c\u7528\u4f8b\u7684\u6807\u7b7e\u914d\u7f6e\u7b49\u7b49\uff0c\u5982\u679c\u5728\u5c40\u90e8\u914d\u7f6e\u91cc\u9762\u914d\u7f6e\u4e86\u7528\u4f8b\u6267\u884c\u6807\u7b7e\uff0c\u800c\u5916\u5c42 runner \u51fa\u6ca1\u6709\u6307\u5b9a\u6267\u884c\u6807\u7b7e\uff0c\u5219\u5728\u6267\u884c\u65f6\u53ea\u4f1a\u6267\u884c\u5c40\u90e8\u914d\u7f6e\u5df2\u914d\u7f6e\u7684\uff0c\u82e5\u5916\u5c42 runner \u4e5f\u914d\u7f6e\u4e86\u6267\u884c\u6807\u7b7e\uff0c\u5219\u4f1a\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u7528\u4f8b\u3002 \u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u914d\u7f6e\u90fd\u5728\u540c\u4e00\u4e2a\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\uff0cpy \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684\u7c7b\uff0cini \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684 option\u3002 \u5168\u5c40\u914d\u7f6e\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u7b56\u7565\u5982\u4e0b\uff1a \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5c40\u90e8\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5e94\u7528\u5c42\uff1arunner \u662f\u6d4b\u8bd5\u6267\u884c\u7684\u5165\u53e3\uff0c\u5b83\u4f1a\u6839\u636e\u914d\u7f6e\u91cc\u9762\u7684\u914d\u7f6e\u9879\uff0c\u8fdb\u884c\u7528\u4f8b\u7684\u52a0\u8f7d\u548c\u6267\u884c\u3002\u5b83\u63d0\u4f9b\u63a5\u53e3\u7ed9\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\uff0c\u5e73\u53f0\u4e0a\u7684\u6307\u4ee4\u5b9e\u9645\u4e0a\u90fd\u662f\u901a\u8fc7\u4e0b\u53d1\u7ed9 runner\uff0c\u7136\u540e\u7531 runner \u6765\u6267\u884c\u76f8\u5e94\u7684\u6d4b\u8bd5\u3002 \u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u662f\u4e00\u4e2a\u524d\u7aef\u7cfb\u7edf\uff0c\u53ef\u4ee5\u8fdb\u884c\u6d4b\u8bd5\u673a\u7ba1\u7406\u3001\u81ea\u52a8\u5b89\u88c5\u955c\u50cf\u3001\u81ea\u52a8\u5b89\u88c5\u6307\u5b9a\u5e94\u7528\u7248\u672c\u3001\u8fdb\u884c\u6d4b\u8bd5\u7528\u4f8b\u8303\u56f4\u9009\u62e9\u3001\u7528\u4f8b\u89e6\u53d1\u6267\u884c\u63a7\u5236\u3001\u7ed3\u679c\u5c55\u793a\u8f93\u51fa\u7b49\u3002 \u4e00\u4e2a\u5e94\u7528\u7684\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\u90fd\u53ef\u4ee5\u5355\u72ec\u89e6\u53d1\u3002 \u517c\u5bb9\u6027\u6d4b\u8bd5\u4e3b\u8981\u901a\u8fc7 PXE \u670d\u52a1\u5668\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u88c5\u673a\uff0c\u7136\u540e\u914d\u5408 AT \u8fdb\u884c\u6d4b\u8bd5\uff0c\u53ef\u4ee5\u5b9e\u73b0\u4e0d\u540c\u7cfb\u7edf\u7248\u672c\u3001\u4e0d\u540c\u5e94\u7528\u7248\u672c\u73af\u5883\u4e0a\u90fd\u53ef\u4ee5\u8fdb\u884c\u81ea\u52a8\u5316\u7684 AT \u6267\u884c\uff0c\u63d0\u9ad8\u517c\u5bb9\u6027\u6d4b\u8bd5\u6548\u7387\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_4","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_2","title":"1\u3001\u7528\u4f8b\u89e3\u8026","text":"\u5b58\u5728\u8026\u5408\u5173\u7cfb\u7684\u65b9\u6cd5\uff1a\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u88ab\u5916\u90e8\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\uff0c\u5219\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u8026\u5408\u5173\u7cfb\u3002 1.1\u3001\u901a\u8fc7\u7f16\u8f91\u5668 Find Usages \u67e5\u770b\u6bcf\u4e2a\u65b9\u6cd5\u88ab\u8c03\u7528\u7684\u8def\u5f84\u548c\u88ab\u8c03\u7528\u6b21\u6570\uff1b 1.2\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 1 \u4e2a\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728\u5916\u90e8\u5e94\u7528\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1b 1.3\u3001\u64cd\u4f5c\u5c42\u6587\u4ef6\u540d\u5747\u4ee5 widget \u7ed3\u5c3e\uff0c\u7c7b\u540d\u4ee5 Widget \u7ed3\u5c3e\uff0c\u5982\uff1a\u6587\u4ef6\u540d music_widget.py \uff1a class MusicWidget:\n\"\"\"\u97f3\u4e50\u7684\u64cd\u4f5c\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_2","title":"2\u3001\u516c\u5171\u5e93\u5efa\u8bbe","text":"2.1\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 2 \u4e2a\u53ca\u4ee5\u4e0a\u7684\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728 public_widget \u76ee\u5f55\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1bpublic_widget \u5373\u4e3a\u516c\u5171\u65b9\u6cd5\u5e93\uff1b 2.2\u3001\u5728\u7528\u4f8b\u5c42\u4fee\u6539\u7528\u4f8b\u4e2d\u7c7b\u7684\u5bfc\u5165\u8def\u5f84\uff0c\u5c5e\u4e8e\u516c\u5171\u65b9\u6cd5\u7684\u5219\u8c03\u7528 public_widget \u4e2d\u7684\u7c7b\uff0c\u5916\u90e8\u5e94\u7528\u7684\u64cd\u4f5c\u65b9\u6cd5\uff0c\u5219\u8c03\u7528\u672c\u5e94\u7528\u76ee\u5f55\u4e0b\u91cd\u5199\u7684\u5916\u90e8\u5e94\u7528\u65b9\u6cd5\u3002 \u6bd4\u5982\uff1a\u51e0\u4e4e\u6240\u6709\u591a\u5a92\u4f53\u5e94\u7528\u90fd\u9700\u8981\u901a\u8fc7\u6587\u7ba1\u52a0\u8f7d\u8d44\u6e90\uff0c\u8c03\u8d77\u7684\u6587\u7ba1\u5bf9\u8bdd\u6846\u5b9e\u9645\u4e3a dde-desktop\uff0c\u56e0\u6b64\u5c06 desktop_widget.py \u653e\u5230 public_widget \u91cc\u9762\uff1a class DdeDesktopPublicWidget:\n\"\"\"\u516c\u5171-\u684c\u9762\u7684\u64cd\u4f5c\u65b9\u6cd5\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3_1","title":"3\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406","text":"3.1\u3001\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1a\u5bf9\u5e94 core\u3001smoke\uff0c\u6216\u4e3a\u7a7a\uff1b \u7528\u4f8b\u6765\u6e90\uff1a\u5bf9\u5e94 PMS \u7528\u4f8b\u6765\u6e90\uff0c\u5206\u522b\u7528 acp1\u3001acp2\u3001acp3\u3001acp4 \u8868\u793a\u3002 acp1 \uff1a\u4e1a\u52a1\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5199\u7684\u7528\u4f8b\uff0c\u88ab\u7528\u4e8e\u9a8c\u6536\u6d4b\u8bd5\u7684\uff1b acp2 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5f15\u5165\u7684\u4ea7\u54c1\u9a8c\u6536\u6d4b\u8bc4\u90e8\u7684\u7528\u4f8b\uff1b acp3 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u6839\u636e\u4ea7\u54c1\u9700\u6c42\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\uff1b acp4 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u901a\u8fc7\u793e\u533a\u3001\u8bba\u575b\u7528\u6237\u53cd\u9988\u95ee\u9898\u603b\u7ed3\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\u3002 \u4e3e\u4f8b\uff1a \u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u7528\u4f8b\u6765\u6e90 001 L1 core acp1 \u6807\u7b7e\u91c7\u7528\u679a\u4e3e\u7684\u65b9\u5f0f\u8fdb\u884c\u4ee3\u53f7\u7ba1\u7406\u65b9\u4fbf\u7ba1\u7406\u4ee5\u53ca\u540e\u7eed\u6269\u5c55\u3002 3.2\u3001\u5728\u6bcf\u4e2a\u5e94\u7528\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u7b2c\u4e00\u5217\u4e3a\u7528\u4f8b\u7684 ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ba1\u7406\u6a21\u5757\u5185\u7684\u7528\u4f8b\u6807\u7b7e\u3002\u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 3.3\u3001\u5bf9\u7167 PMS \u4e0a\u7528\u4f8b\u7b49\u7ea7\u3001\u7528\u4f8b\u7c7b\u578b\u548c\u7528\u4f8b\u6765\u6e90\uff0c\u6807\u8bb0\u6240\u6709\u5df2\u5b9e\u73b0\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u540e\u7eed\u7f16\u5199\u65b0\u589e\u81ea\u52a8\u5316\u7528\u4f8b\u65f6\uff0c\u6bcf\u5199\u4e00\u6761\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684 csv \u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u6b64\u6761\u7528\u4f8b\u7684\u6807\u7b7e\u3002 3.4\u3001\u8df3\u8fc7\u7528\u4f8b\u6807\u7b7e\u5316 \u73b0\u6709\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a\uff1a \u4e3e\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u8bb0\u4e3a \u201cskip-\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u8bb0\uff0c\u5982\u679c\u5df2\u7ecf\u6807\u8bb0\u4e86\u8df3\u8fc7\u539f\u56e0\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u8bb0\u4e3a SKIPED\uff0c\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\u3002 \u6240\u6709\u7684\u6807\u7b7e\u5728 docs \u76ee\u5f55\u4e0b\u4f1a\u6709\u4e00\u4e2a\u6587\u6863\uff0c\u6587\u6863\u6682\u5b9a\u540d\u79f0\u4e3a\uff1atags_info.md\uff0c\u7528\u4e8e\u8bf4\u660e\u73b0\u5728\u5df2\u7ecf\u4f7f\u7528\u5230\u7684\u6807\u7b7e\uff0c\u4ee5\u53ca\u8fd9\u4e9b\u6807\u7b7e\u7684\u89e3\u91ca\u548c\u7528\u6cd5\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#4","title":"4\u3001\u7528\u4f8b\u6267\u884c","text":"4.1\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u7684\u9a71\u52a8\u6267\u884c\u903b\u8f91\u529f\u80fd\u5b9e\u73b0 \u5f00\u53d1\u6839\u636e\u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\u91cc\u9762\u7684\u7528\u4f8b\u6807\u7b7e\u6267\u884c\u5bf9\u5e94\u7528\u4f8b\u7684\u529f\u80fd\uff0c\u80fd\u652f\u6301\u591a\u4e2a\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u6267\u884c\u5165\u53e3\u80fd\u968f\u610f\u901a\u8fc7\u7528\u4f8b\u6807\u7b7e\u6307\u5b9a\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002 \u7528\u4f8b\u6807\u7b7e\u7684\u9a71\u52a8\u65b9\u5f0f\u5fc5\u987b\u80fd\u652f\u6301\u6807\u7b7e\u7684\u6269\u5c55\uff0c\u672a\u6765\u968f\u7740\u4e1a\u52a1\u7684\u53d8\u5316\u53ef\u80fd\u9700\u8981\u589e\u52a0\u5404\u79cd\u5404\u6837\u7684\u6807\u7b7e\u3002 4.2\u3001\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u6267\u884c \u529f\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u3001\u6027\u80fd\u6d4b\u8bd5\u7b49\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u662f\u5206\u5f00\u6267\u884c\u7684\uff0c\u4e5f\u5c31\u662f\u5728\u4e00\u6b21\u6267\u884c\u4e2d\uff0c\u53ea\u80fd\u6267\u884c\u5176\u4e2d\u4e00\u79cd\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5177\u4f53\u8981\u6267\u884c\u54ea\u4e00\u79cd\u540c\u6837\u901a\u8fc7\u53c2\u6570\u6765\u63a7\u5236\u3002 4.3\u3001\u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c \u7531\u4e8e\u6d4b\u8bd5\u673a\u8d44\u6e90\u6709\u9650\uff0c\u968f\u7740\u81ea\u52a8\u5316\u7528\u4f8b\u6570\u91cf\u7684\u589e\u52a0\uff0cCI \u6267\u884c\u65f6\u95f4\u4f1a\u8d8a\u6765\u8d8a\u957f\u3002 \u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c\u7684\u529f\u80fd\uff1a \u540c\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\u5206\u6563\u5230\u4e0d\u540c\u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u4e0a\u6267\u884c\uff0c\u7f29\u77ed\u6267\u884c\u603b\u65f6\u95f4\uff1b \u7b2c\u4e8c\u5929\u8dd1\u7684\u65f6\u5019\u540c\u4e00\u4e2a\u673a\u5668\u4e0a\u4f1a\u6267\u884c\u6628\u5929\u6ca1\u6709\u6267\u884c\u5230\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u6267\u884c\u540c\u7406\uff1b \u53ef\u4ee5\u5b9e\u73b0\u5728\u5168\u67b6\u6784\u6d4b\u8bd5\u673a\u4e0a\u8f6e\u6d41\u6267\u884c\u7528\u4f8b\uff0c\u65e2\u80fd\u4fdd\u8bc1\u6267\u884c\u4e86\u6240\u6709\u7684\u7528\u4f8b\uff0c\u53c8\u80fd\u5728\u8d44\u6e90\u6709\u9650\u7684\u60c5\u51b5\u4e0b\u8986\u76d6\u4e86\u6240\u6709\u7684\u67b6\u6784\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#5","title":"5\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0","text":"5.1\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u4f5c\u4e3a\u524d\u7aef\u754c\u9762\u7cfb\u7edf\uff0c\u901a\u8fc7\u9875\u9762\u4e0a\u7684\u4e00\u4e9b\u529f\u80fd\u9009\u9879\u8fdb\u884c\u5bf9\u5e94\u6d4b\u8bd5\u4efb\u52a1\u7684\u7ba1\u7406\u6216\u89e6\u53d1\uff0c\u4e1a\u5185\u6bd4\u8f83\u6d41\u884c\u7684\u5b9e\u73b0\u65b9\u6848\u662f\u4f7f\u7528 Vue + DRF \u5b9e\u73b0\u4e00\u4e2a\u524d\u540e\u7aef\u5206\u79bb\u7684\u7cfb\u7edf\u3002 \u6d4b\u8bd5\u5e73\u53f0\u53ef\u80fd\u4f1a\u6d89\u53ca\u5230\u7684\u6a21\u5757\u6709\uff1a\u6d4b\u8bd5\u673a\u8d44\u6e90\u7ba1\u7406\u6a21\u5757\u3001\u7528\u4f8b\u6267\u884c\u63a7\u5236\u6a21\u5757\u3001\u7ed3\u679c\u5c55\u793a\u6a21\u5757\u3001PXE \u955c\u50cf\u5b89\u88c5\u6a21\u5757\u7b49\u3002 \u7528\u6237\uff08\u6d4b\u8bd5\u3001\u7814\u53d1\u540c\u5b66\u7b49\uff09\u53ef\u4ee5\u914d\u7f6e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5982\u6267\u884c\u54ea\u4e2a\u5e94\u7528\u3001\u6267\u884c\u7528\u4f8b\u7684\u8303\u56f4\u3001\u5728\u54ea\u53f0\u673a\u5668\u4e0a\u6267\u884c\u3001\u955c\u50cf\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u5e94\u7528\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u6267\u884c\u65f6\u95f4\u3002 5.2\u3001\u6267\u884c\u5165\u53e3 runner \u63d0\u4f9b\u7ed9\u6d4b\u8bd5\u5e73\u53f0\u7684\u63a5\u53e3\u5305\u62ec\uff1a\u7528\u4f8b\u6267\u884c\u63a5\u53e3\u3001\u7ed3\u679c\u8fd4\u56de\u63a5\u53e3\u3001\u955c\u50cf\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u955c\u50cf\u5b89\u88c5\u63a5\u53e3\u3001\u5e94\u7528\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u5e94\u7528\u5b89\u88c5\u66f4\u65b0\u63a5\u53e3\u7b49\u3002 \u524d\u7aef\u5e73\u53f0\u76ee\u524d\u8fd8\u6ca1\u6709\u592a\u591a\u8be6\u7ec6\u7684\u65b9\u6848\uff0c\u672c\u6b21\u8bbe\u8ba1\u4e3b\u8981\u96c6\u4e2d\u5728\u540e\u7aef\u8fd9\u90e8\u5206\u67b6\u6784\u7684\u8bbe\u8ba1\u4e0a\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_5","title":"\u56db\u3001\u5b9e\u65bd\u8ba1\u5212","text":"\u8fd1\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u6587\u7ba1\u4ee3\u7801\u89e3\u8026 2022/3/28 2022/4/8 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u56fe\u5f62\u56fe\u50cf\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u97f3\u89c6\u9891\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5168\u5c40\u641c\u7d22\u4ee3\u7801\u89e3\u8026 2022/4/25 2022/4/26 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u516c\u5171\u5e93\u5efa\u8bbe 2022/4/27 2022/5/5 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5c01\u88c5\u7684\u65b9\u6cd5\u6574\u7406\u6210\u4e00\u4e2a\u8868 2022/5/6 2022/5/10 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7528\u4f8b\u6807\u7b7e\u5206\u7c7b\u8bc4\u4f30 2022/5/11 2022/5/11 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u6807\u7b7e\u5316\u6267\u884c\u9a71\u52a8\u7a0b\u5e8f\u7f16\u5199 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u9700\u5b9e\u73b0\u81ea\u52a8\u89e3\u6790 csv \u8868\u683c\u4e2d\u7684\u7528\u4f8b\u7f16\u53f7 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u722c\u866b\u811a\u672c\uff0c\u722c\u53d6 pms \u4e0a\u7528\u4f8b\u7684\u6807\u7b7e 2022/5/11 2022/5/13 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u5b9a\u65f6\u81ea\u52a8\u7ef4\u62a4\u672c\u5730 csv \u6587\u4ef6\u811a\u672c 2022/5/11 2022/5/20 \u4e2d\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u76ee\u5f55\u7ed3\u6784\u8c03\u6574 2022/5/20 2022/6/2 \u5b8c\u6210\u5168\u5c40\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u5177\u4f53\u65b9\u6848\u548c\u903b\u8f91\u5b9e\u73b0 2022/6/6 2022/6/17 \u9759\u6001\u626b\u63cf\u95ee\u9898\u6e05\u96f6 2022/6/20 2022/7/1 \u5b8c\u6210\u65b0\u6846\u67b6\u4f7f\u7528\u57f9\u8bad 2022/7/4 2022/7/11 \u843d\u5730\u8fd0\u884c 2022/7/12 2022/7/20 \u5e95\u5c42\u5e93\u7528\u9014\u8bf4\u660e\u6587\u6863\u7f16\u5199 2022/7/21 2022/7/28"}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\u200b\\u3000\\-\u3001\u3002\uff0c\uff0e\uff1f\uff01\uff1b]+","pipeline":["stemmer"]},"docs":[{"location":"","title":"\u9996\u9875","text":""},{"location":"#youqu","title":"\u6709\u8da3\uff08YouQu\uff09","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/4/1\n# Author : Mikigo\n# =============================================\n \u672c\u7ad9\u603b\u8bbf\u95ee\u91cf \u6b21 \u6b22\u8fce\u5728\u6d4f\u89c8\u5668\u8bbf\u95ee\u3010\u516c\u7f51\u6587\u6863\u3011 \u7edf\u4fe1\u516c\u53f8\u5185\u7f51\u8fd8\u53ef\u4ee5\u8bbf\u95ee\u3010\u5185\u7f51\u6587\u6863\u3011\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u54e6~~"},{"location":"#_1","title":"\u4e00\u3001\u7b80\u4ecb","text":"\u6709\u8da3\uff08YouQu\uff09\u662f\u6df1\u5ea6\u79d1\u6280\u8bbe\u8ba1\u548c\u5f00\u53d1\u7684\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff0c\u91c7\u7528\u7ed3\u6784\u5206\u5c42\u7684\u8bbe\u8ba1\u7406\u5ff5\uff0c\u652f\u6301\u591a\u5143\u5316\u5143\u7d20\u5b9a\u4f4d\u548c\u65ad\u8a00\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\u3001\u5f3a\u5927\u7684\u65e5\u5fd7\u548c\u62a5\u544a\u8f93\u51fa\u7b49\u7279\u8272\u529f\u80fd\uff0c\u540c\u65f6\u5b8c\u7f8e\u517c\u5bb9X11\u3001Wayland\u663e\u793a\u534f\u8bae\uff0c\u73af\u5883\u90e8\u7f72\u7b80\u5355\uff0c\u64cd\u4f5c\u6613\u4e0a\u624b\u3002"},{"location":"#17","title":"\u7231\u4e0a \u201c\u6709\u8da3\u201d \u7684 17 \u4e2a\u7406\u7531","text":" \u6838\u5fc3\u5e93\u63d0\u4f9b\u4e86\u7edf\u4e00\u7684\u63a5\u53e3\uff0c\u7f16\u5199\u65b9\u6cd5\u65f6\u53ea\u9700\u8981\u5bfc\u5165\u4e00\u4e2a\u5305\u5c31\u53ef\u4ee5\u4f7f\u7528\u5230\u6838\u5fc3\u5e93\u63d0\u4f9b\u7684\u6240\u6709\u529f\u80fd\uff1b \u516c\u5171\u5e93\u5c01\u88c5\u4e86\u5f88\u591a\u5e38\u7528\u6a21\u5757\u7684\u76f8\u5173\u65b9\u6cd5\uff0c\u6bd4\u5982\uff1a\u4efb\u52a1\u680f\u7684\u64cd\u4f5c\u3001\u684c\u9762\u7684\u64cd\u4f5c\u3001\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\u7b49\u7b49\uff1b \u9664\u4e86\u5e38\u7528\u7684\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u8bc6\u522b\u4ee5\u5916\uff0c\u6211\u4eec\u8fd8\u63d0\u4f9b\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u5176\u4f7f\u7528\u7b80\u5355\u4e14\u9ad8\u6548\uff0c\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff1b \u5bf9\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u5c06\u7f16\u5199\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u53d8\u5f97\u7b80\u5355\u800c\u4f18\u96c5\uff1b \u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u6280\u672f\u8fdb\u884c\u529f\u80fd\u5347\u7ea7\uff0c\u9664\u4e86\u652f\u6301\u5355\u4e2a\u5750\u6807\u8fd4\u56de\uff0c\u8fd8\u652f\u6301\u540c\u4e00\u754c\u9762\u4e0b\u591a\u4e2a\u76f8\u540c\u5143\u7d20\u8fd4\u56de\u591a\u4e2a\u5750\u6807\u7684\u529f\u80fd\uff1b \u63d0\u4f9b\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u548c\u6279\u91cf\u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u4e0d\u5230\u4e00\u4e2a csv \u6587\u4ef6\u539f\u6765\u80fd\u5e72\u8fd9\u4e48\u591a\u4e8b\u60c5\uff1b \u63d0\u4f9b\u4e86\u529f\u80fd\u5f3a\u5927\u7684\u6267\u884c\u5668\u5165\u53e3\uff0c\u8ba9\u4f60\u53ef\u4ee5\u65b9\u4fbf\u7684\u5728\u672c\u5730\u6267\u884c\u4efb\u4f55\u7528\u4f8b\u96c6\u7684\u7528\u4f8b\uff0c\u5176\u4e30\u5bcc\u7684\u81ea\u5b9a\u4e49\u914d\u7f6e\u9879\uff0c\u6ee1\u8db3\u4f60\u5bf9\u6267\u884c\u5668\u6240\u6709\u7684\u5e7b\u60f3\uff1b \u63d0\u4f9b\u8fdc\u7a0b\u6267\u884c\u7684\u529f\u80fd\uff0c\u53ef\u4ee5\u63a7\u5236\u591a\u53f0\u673a\u5668\u5e76\u884c\u8dd1\uff0c\u6216\u8005\u5206\u5e03\u5f0f\u8dd1\uff0c\u8fd9\u79cd\u4ed8\u8d39\u529f\u80fd\u73b0\u5728\u514d\u8d39\u7ed9\u4f60\u7528\uff1b \u63d0\u4f9b\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u529f\u80fd\uff0c\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u6bcf\u4e2a\u65b9\u6cd5\u5355\u72ec\u5199\u8f93\u51fa\u65e5\u5fd7\u7684\u4ee3\u7801\uff0c\u4e00\u5207\u6211\u4eec\u7ed9\u4f60\u641e\u5b9a\u4e86\uff0c\u65e5\u5fd7\u8f93\u51fa\u4e0d\u4ec5\u5185\u5bb9\u4e30\u5bcc\uff0c\u989c\u503c\u4e5f\u7edd\u5bf9\u5728\u7ebf\uff0c\u6211\u4eec\u8fd8\u81ea\u5df1\u8bbe\u8ba1\u4e86\u4e00\u6b3e\u7ec8\u7aef\u8f93\u51fa\u4e3b\u9898\u53eb\u300a\u4e94\u5f69\u6591\u6593\u7684\u9ed1\u300b\uff1b \u63d0\u4f9b\u4e86\u4e00\u952e\u90e8\u7f72\u81ea\u52a8\u5316\u6d4b\u8bd5\u73af\u5883\u7684\u529f\u80fd\uff0c\u8fde\u4ee3\u7801\u7f16\u8f91\u5668\u90fd\u7ed9\u4f60\u88c5\u597d\u4e86\uff0c\u8ba9\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u73af\u5883\u90e8\u7f72\u800c\u70e6\u607c\uff1b \u63d0\u4f9b\u4e86\u81ea\u52a8\u751f\u6210\u591a\u79cd\u62a5\u544a\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u8f93\u51fa\u4ec0\u4e48\u62a5\u544a\u5f62\u5f0f\u90fd\u884c\uff0c\u800c\u4e14\u6211\u4eec\u5728\u62a5\u544a\u4e2d\u8fd8\u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\u548c\u5931\u8d25\u622a\u56fe\u7684\u529f\u80fd\uff1b \u5bf9\u65ad\u8a00\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u63d0\u4f9b\u66f4\u53cb\u597d\u5316\u7684\u9519\u8bef\u63d0\u793a\uff0c\u8ba9\u5b9a\u4f4d\u95ee\u9898\u7cbe\u51c6\u9ad8\u6548\uff1b \u4e0d\u4ec5\u652f\u6301\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u63a7\u5236\uff0c\u800c\u4e14\u8fd8\u652f\u6301\u52a8\u6001\u63a7\u5236\u7528\u4f8b\u6279\u91cf\u6267\u884c\u7684\u603b\u65f6\u95f4\uff0c\u786e\u4fdd CI \u73af\u5883\u4e0b\u80fd\u987a\u7545\u8fd0\u884c\uff1b \u652f\u6301\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\u6267\u884c\u3001PMS \u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6807\u7b7e\u5316\u6267\u884c\u65b9\u6848\uff0c\u6ee1\u8db3\u4f60\u5404\u79cd\u573a\u666f\u4e0b\u7684\u6267\u884c\u9700\u6c42\uff1b \u652f\u6301\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u529f\u80fd\uff0c\u53ef\u5b9a\u4f4d\u53ef\u65ad\u8a00\uff0c\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\uff1b \u5b8c\u7f8e\u517c\u5bb9 Wayland \u548c X11\uff0c\u771f\u6b63\u505a\u5230\u4e00\u5957\u4ee3\u7801\uff0c\u968f\u5904\u6267\u884c\uff1b \u652f\u6301\u591a\u79cd\u65b9\u5f0f\u7684\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u5176\u4e2d\u5f02\u6b65\u56de\u586b\u7684\u65b9\u6848\uff0c\u5b8c\u7f8e\u89e3\u51b3\u4e86\u6570\u636e\u56de\u586b\u7684\u8017\u65f6\u95ee\u9898\uff1b \u3010\u89c6\u9891\u4ecb\u7ecd\u3011"},{"location":"#_2","title":"\u4e8c\u3001\u5b89\u88c5\u4f7f\u7528","text":"\u57fa\u7840\u6846\u67b6\uff1ahttps://github.com/linuxdeepin/deepin-autotest-framework \u4ece PyPI \u5b89\u88c5: sudo pip3 install youqu\n \u521b\u5efa\u9879\u76ee: youqu-startproject youqu\n \u5b89\u88c5\u4f9d\u8d56: cd youqu\nbash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002 \u5e94\u7528\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684\u5e94\u7528\u540d\u79f0\u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music cd apps/\n \u5c06\u5e94\u7528\u5e93\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u50cf\u8fd9\u6837\uff1a youqu\n\u251c\u2500\u2500 apps\n\u2502 \u251c\u2500\u2500 autotest_deepin_music # \u5e94\u7528\u5e93\n...\n \u5e94\u7528\u5e93\u7684\u540d\u79f0\u4e0d\u53ef\u4ee5\u4fee\u6539\u3002"},{"location":"#_3","title":"\u4e09\u3001\u8fd0\u884c","text":""},{"location":"#1","title":"1. \u5de5\u4f5c\u7a7a\u95f4","text":"\u57fa\u7840\u6846\u67b6\u5de5\u7a0b\u76ee\u5f55\u5efa\u8bae\u653e\u5728 ~ \u76ee\u5f55\u4e0b\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u4e5f\u53ef\u4ee5\u8fd0\u884c\uff0c\u4f46\u662f\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u9700\u8981\u505a\u73af\u5883\u6e05\u7406\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u5b58\u5728\u4ee3\u7801\u88ab\u5220\u9664\u7684\u98ce\u9669\u3002 \u5982\u679c\u4f60\u7684\u673a\u5668\u4e0a\u4e0d\u540c\u76ee\u5f55\u4e0b\u5b58\u5728\u591a\u4e2a YouQu \u5de5\u7a0b\uff0c\u90a3\u4e48\u5728\u8fd0\u884c\u4e4b\u524d\uff0c\u8bf7\u5148\u6267\u884c env.sh \u6821\u6b63\u76f8\u5173\u73af\u5883\u3002"},{"location":"#2","title":"2. \u6267\u884c\u5668","text":"\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u6709\u4e00\u4e2a manage.py \uff0c\u5b83\u662f\u4e00\u4e2a\u6267\u884c\u5668\u5165\u53e3\uff0c\u63d0\u4f9b\u4e86\u672c\u5730\u6267\u884c\u3001\u8fdc\u7a0b\u6267\u884c\u7b49\u7684\u529f\u80fd\u3002 \u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6765\u6267\u884c\uff1a youqu manage.py run -a deepin-music\n"},{"location":"#21","title":"2.1. \u672c\u5730\u6267\u884c","text":"youqu manage.py run\n"},{"location":"#211","title":"2.1.1. \u914d\u7f6e\u6587\u4ef6","text":"\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u914d\u7f6e\u53c2\u6570 \u5728\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u91cc\u9762\u652f\u6301\u914d\u7f6e\u5bf9\u6267\u884c\u7684\u4e00\u4e9b\u53c2\u6570\u8fdb\u884c\u914d\u7f6e\uff0c\u5e38\u7528\u7684\u5982\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;-----------------------------------------------\n;1.KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2.KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f\n;e.g. TAGS = L1 or smoke\n;-----------------------------------------------\n;\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\uff0c\u5c06\u8981\u6267\u884c\u7684\u7528\u4f8b\u5199\u5165\u6307\u5b9a\u7684 csv \u6587\u4ef6\n;\u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u4ece\u57fa\u7840\u6846\u67b6\u6839\u76ee\u5f55\u5f00\u59cb\uff1ae.g. CASE_FILE = case_list.txt\n;\u5982\u679c\u8fd9\u91cc\u6709\u503c\uff0cAPP_NAME KEYWORDS TAGS \u7684\u914d\u7f6e\u5747\u4e0d\u751f\u6548\nCASE_FILE =\n;=============================== RUNNER CONFIG ===================================\n[runner]\n;\u6700\u5927\u5931\u8d25\u7528\u4f8b\u6570\u91cf\u7684\u5360\u6bd4\n;\u6bd4\u5982\uff1a\u603b\u6267\u884c\u7528\u4f8b\u6570\u4e3a 100, \u82e5 MAX_FAIL = 0.5,\u5219\u5931\u8d25\u7528\u4f8b\u6570\u8fbe\u5230 50 \u5c31\u4f1a\u7ec8\u6b62\u6d4b\u8bd5\u3002\nMAX_FAIL = 1\n;\u5355\u6761\u7528\u4f8b\u7684\u8d85\u65f6\u65f6\u95f4\uff0c\u5982\u679c\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u8d85\u65f6\uff0c\u8fd9\u6761\u7528\u4f8b\u4f1a\u88ab\u505c\u6b62\uff0c\u540e\u7eed\u7528\u4f8b\u7ee7\u7eed\u6267\u884c\u3002\n;\u5355\u4f4d\u4e3a\u79d2\n;\u8fd9\u662f\u4e00\u4e2a\u5168\u5c40\u7edf\u4e00\u914d\u7f6e\uff0c\u5982\u679c\u67d0\u6761\u7528\u4f8b\u9700\u8981\u5355\u72ec\u914d\u7f6e\u8d85\u65f6\u65f6\u95f4\uff0c\u53ef\u4ee5\u5728\u7528\u4f8b\u4e2d\u8fd9\u6837\u5199\uff1a\n;@pytest.mark.timeout(500)\n;def test_xxx_001():\n; ...\n;\u4f1a\u8bdd\u8d85\u65f6\uff08\u6240\u6709\u7528\u4f8b\u6267\u884c\u7684\u8d85\u65f6\u65f6\u95f4\uff09\u662f\u6839\u636e\u5168\u5c40\u8d85\u65f6\u914d\u7f6e\u548c\u7528\u4f8b\u5355\u72ec\u8d85\u65f6\u914d\u7f6e\u81ea\u52a8\u8ba1\u7b97\u7684\u3002\nCASE_TIME_OUT = 200\n;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\n;\u6ce8\u610f\uff0cRERUN = 1 \u8868\u793a\u91cd\u8dd1 1 \u6b21\uff0c\u5373\u7b2c\u4e00\u6b21\u7528\u4f8b\u6267\u884c\u5931\u8d25\u4f1a\u81ea\u52a8\u91cd\u8dd1 1 \u6b21\uff0c\u603b\u5171\u6267\u884c 2 \u6b21\uff1b\n;\u5982\u679c\u7b2c 2 \u6b21\u6267\u884c\u6210\u529f\uff0c\u7ed3\u679c\u6210\u529f\uff0c\u5931\u8d25\u4ea6\u4e3a\u5931\u8d25\u3002\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c 1 \u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff0cRERUN >= RECORD_FAILED_CASE\u3002\n;1.\u5173\u95ed\u5f55\u5c4f\uff1aRECORD_FAILED_CASE > RERUN\n;2.\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1aRECORD_FAILED_CASE = 0\nRECORD_FAILED_CASE = 1\n;yes \u6bcf\u6761\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u8fdb\u884c\u73af\u5883\u6e05\u7406\nCLEAN_ALL = yes\n;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387, \u6bd4\u5982\uff1a1920x1080\n;no: \u8868\u793a\u4e0d\u505a\u5206\u8fa8\u7387\u6821\u9a8c\nRESOLUTION = 1920x1080\n;\u4e0d\u8df3\u8fc7\u7528\u4f8b\uff0ccsv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86 skip-xxx\u7684\u7528\u4f8b\u4e0d\u8df3\u8fc7\nNOSKIP = no\n;ignore fixed\n;no\uff0c\u53ea\u8981\u6807\u8bb0\u4e86fixed\u7684\u7528\u4f8b\uff0c\u5373\u4f7f\u6807\u8bb0\u4e86skip-\uff0c\u4e5f\u4f1a\u6267\u884c\uff1b\n;yes\uff0cfixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\uff1b\nIFIXED = no\n;\u8981\u5b89\u88c5deb\u5305\u7684\u8def\u5f84\n;e.g : ~/Downloads/ \u5b89\u88c5\u4e0b\u8f7d\u76ee\u5f55\u4e0b\u7684deb\u5305\uff0c\u5982\u679c\u662f\u8fdc\u7a0b\u6267\u884c\uff0c\u4f1a\u81ea\u52a8\u62f7\u8d1d\u5230\u8fdc\u7a0b\u5e76\u5b89\u88c5\u3002\nDEB_PATH =\n;DEBUG \u6a21\u5f0f\u6267\u884c\u7528\u4f8b\uff0c\u53ea\u6536\u96c6\u4e0d\u6267\u884c\u7528\u4f8b\uff0c\u4e5f\u4e0d\u505a\u8bbe\u5907\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002\nDEBUG = no\n;\u8bb0\u5f55top\u547d\u4ee4\u67e5\u8be2\u7684\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0cTOP = 3 \u8868\u793a\u8bb0\u5f55\u524d3\u4e2a\u8fdb\u7a0b\u3002\nTOP =\n;\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\nREPEAT =\n;\u9ed8\u8ba4\u5728\u6240\u6709\u6d4b\u8bd5\u5b8c\u6210\u4e4b\u540e\u8f93\u51fa\u62a5\u9519\u4fe1\u606f.\n;yes, \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\nDURING_FAIL = no\n;\u6ce8\u518c\u81ea\u542f\u670d\u52a1\nAUTOSTART = no\n;=============================== REPORT CONFIG ===================================\n[report]\n;\u6d4b\u8bd5\u62a5\u544a\u7684title\nREPORT_TITLE = YouQu Report\n;\u6d4b\u8bd5\u62a5\u544a\u7684name\nREPORT_NAME = YouQu Report\n;\u6d4b\u8bd5\u62a5\u544a\u7684\u9ed8\u8ba4\u8bed\u8a00\n;en:English\n;ru:\u0420\u0443\u0441\u0441\u043a\u0438\u0439\n;zh:\u4e2d\u6587\n;de:Deutsch\n;nl:Nederlands\n;he:Hebrew\n;br:Brazil\n;pl:Polski\n;ja:\u65e5\u672c\u8a9e\n;es:Espa\u00f1ol\n;kr:\ud55c\uad6d\uc5b4\n;fr:Fran\u00e7ais\n;az:Az\u0259rbaycanca\nREPORT_LANGUAGE = zh\n;\u7528\u4f8b\u6267\u884c\u5b8c\u540e\u751f\u6210\u7684\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n;\u76ee\u524d\u652f\u6301 allure, xml, json \uff08\u652f\u6301\u540c\u65f6\u751f\u6210\uff09\nREPORT_FORMAT = allure, xml, json\n;\u6307\u5b9a\u62a5\u544a\u751f\u6210\u7684\u8def\u5f84\uff08\u76f8\u5bf9\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\uff09\nALLURE_REPORT_PATH = report/\nXML_REPORT_PATH = report/\nJSON_REPORT_PATH = report/\n;=============================== GLOBAL CONFIG ===================================\n[globalconfig]\n;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\nPASSWORD = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\nIMAGE_MATCH_NUMBER = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6bcf\u6b21\u95f4\u9694\u7b49\u5f85\u65f6\u95f4\nIMAGE_MATCH_WAIT_TIME = 1\n;\u56fe\u50cf\u8bc6\u522b\u5339\u914d\u5ea6\nIMAGE_RATE = 0.9\n;\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u5b9e\u65f6\u56fe\u50cf\u4fdd\u5b58\u8def\u5f84\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u5750\u6807\nSCREEN_CACHE = /tmp/screen.png\n;\u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\u7684\u8def\u5f84\nTMPDIR = /tmp/tmpdir\n;\u7cfb\u7edf\u4e3b\u9898\nSYS_THEME = deepin\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = youqu-dev.uniontech.com\n;OpenCV\u670d\u52a1\u7aef\u5730\u5740\nOPENCV_SERVER_HOST = youqu-dev.uniontech.com\n;=============================== PMS CONFIG ===================================\n;PMS\u76f8\u5173\u914d\u7f6e\uff0c\u5305\u542b\u4ee5\u4e0b\u51e0\u4e2a\u65b9\u9762\uff1a\n;1.PMS\u6d4b\u8bd5\u5957\u6267\u884c\n;2.\u81ea\u52a8\u4ecePMS\u722c\u53d6\u6570\u636e\u5e76\u540c\u6b65\u672c\u5730CSV\u6587\u4ef6\n;3.PMS\u6570\u636e\u56de\u586b\n[pms]\n;PMS\u7684\u7528\u6237\u540d,\u5982: ut001234\nPMS_USER =\n;PMS\u7684\u5bc6\u7801\nPMS_PASSWORD =\n;PMS\u6d4b\u8bd5\u5957\u7684ID\n;\u5728PMS\u4e0a\u67e5\u770b\u7528\u4f8b\u201c\u5957\u4ef6\u201d\u94fe\u63a5: https://pms.uniontech.com/testsuite-view-495.html\n;\u6d4b\u8bd5\u5957ID\u4e3a: 495\nSUITE_ID =\n;\u6570\u636e\u56de\u586b\u5fc5\u987b\u5173\u8054PMS\u6d4b\u8bd5\u5355\n;\u5728PMS\u4e0a\u67e5\u770b\u6d4b\u8bd5\u5355\u94fe\u63a5: https://pms.uniontech.com/testtask-cases-20747.html\n;\u6d4b\u8bd5\u5355ID\u4e3a: 20747\nTASK_ID =\n;\u5c06\u6d4b\u8bd5\u7ed3\u679c\u6570\u636e\u56de\u586b\u5230PMS\n;\u4e3a\u7a7a: \u8868\u793a\u4e0d\u56de\u586b,\u4e0d\u4f1a\u5728\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u751f\u6210json\u7ed3\u679c\u6587\u4ef6;\n;async: \u8868\u793a\u9010\u6761\u5f02\u6b65\u56de\u586b,\u540e\u9762\u4e00\u6761\u6267\u884c\u5f00\u59cb\u65f6\u901a\u8fc7\u5b50\u7ebf\u7a0b\u5bf9\u524d\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u8fdb\u884c\u56de\u586b\uff0c\u5982\u6b64\u5b9e\u73b0\u65f6\u95f4\u6548\u7387\u6700\u5927\u5316;\n;finish: \u8868\u793a\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u6210\u4e4b\u540e\u9010\u4e2a\u56de\u586b(PMS\u4e0d\u652f\u6301\u5e76\u53d1);\nSEND_PMS =\n;\u6570\u636e\u56de\u586b\u7684\u89e6\u53d1\u8005\n;auto: \u6846\u67b6\u81ea\u52a8\u56de\u586b,\u914d\u5408SEND_PMS\u914d\u7f6e\u4f7f\u7528,\u4f60\u53ef\u4ee5\u9009\u62e9\u5728\u4e0d\u540c\u7684\u9636\u6bb5\u8fdb\u884c\u6570\u636e\u56de\u586b;\n;hand: \u624b\u52a8\u56de\u586b,\u6bcf\u6761\u7528\u4f8b\u4ecd\u7136\u4f1a\u751f\u6210json\u6587\u4ef6,\u4f46\u6846\u67b6\u4e0d\u4f1a\u8fdb\u884c\u6570\u636e\u56de\u586b,\u9700\u8981\u4f60\u53ef\u4ee5\u5728\u4f60\u60f3\u8981\u53d1\u9001\u7684\u65f6\u95f4\u70b9\u624b\u52a8\u89e6\u53d1\u56de\u586b;\nTRIGGER = auto\n;PMS\u56de\u586b\u7684\u91cd\u8bd5\u6b21\u6570\n;\u5982\u679c\u63a5\u53e3\u8bf7\u6c42\u5931\u8d25,\u4f1a\u8fdb\u884c\u91cd\u8bd5\nSEND_PMS_RETRY_NUMBER = 2\n[csv_link_pms_lib]\n;caselib: \u7528\u4f8b\u5e93\n;testcase: \u4ea7\u54c1\u5e93\u7528\u4f8b\nCASE_FROM = caselib\n[csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/caselib-browse-81.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 81\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic =\n[export_csv]\n;\u5bfc\u51fa\u7684csv\u6587\u4ef6\u540d\u79f0\uff0c\u9ed8\u8ba4 case_list.csv\nCSV_FILE = case_list.csv\n;exportcsv \u547d\u4ee4\u5bfc\u51fa case_list.csv \u6587\u4ef6\u65f6\u914d\u7f6e\u7684\u5b57\u6bb5\u540d\uff0c\u7528\u4f8b\u540d\u79f0\u9ed8\u8ba4\u5b58\u5728\u7b2c\u4e00\u5217\uff0c\u65e0\u9700\u6dfb\u52a0\nCSV_HEARD = \u7528\u4f8b\u7ea7\u522b,\u7528\u4f8b\u7c7b\u578b,\u6d4b\u8bd5\u7ea7\u522b,\u662f\u5426\u8df3\u8fc7\n[log_cli]\n;\u65e5\u5fd7\u76f8\u5173\u914d\u7f6e\uff08\u4e0d\u6253\u5370\u6784\u9020\u51fd\u6570\u548c\u9b54\u6cd5\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff09\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = DEBUG\n# ============= \u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u914d\u7f6e ================\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u5f00\u5934\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7, \u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_STARTSWITH = Assert\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u7ed3\u5c3e\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_ENDSWITH = Widget\n;\u652f\u6301\u7c7b\u540d\u5305\u542b xxx \u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_CONTAIN = ShortCut\n# ==============================================\n \u914d\u7f6e\u5b8c\u6210\u4e4b\u540e\uff0c\u76f4\u63a5\u5728\u547d\u4ee4\u884c\u6267\u884c manage.py \u5c31\u597d\u4e86\u3002 youqu manage.py run\n"},{"location":"#212","title":"2.1.2. \u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a youqu manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -h, --help show this help message and exit\n-a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--record_failed_case RECORD_FAILED_CASE\n\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--max_fail MAX_FAIL \u6700\u5927\u5931\u8d25\u7387\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--resolution RESOLUTION\n\u68c0\u67e5\u5206\u8fa8\u7387\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms {,async,finish}\n\u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--trigger {,auto,hand}\n\u89e6\u53d1\u8005\n-f CASE_FILE, --case_file CASE_FILE\n\u6839\u636e\u6587\u4ef6\u6267\u884c\u7528\u4f8b\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n--pms_user PMS_USER pms \u7528\u6237\u540d\n--pms_password PMS_PASSWORD\npms \u5bc6\u7801\n--suite_id SUITE_ID pms \u6d4b\u8bd5\u5957ID\n--pms_info_file PMS_INFO_FILE\npms \u4fe1\u606f\u6587\u4ef6\n--top TOP \u8fc7\u7a0b\u4e2d\u8bb0\u5f55top\u547d\u4ee4\u4e2d\u7684\u503c\n--lastfailed \u4ec5\u6267\u884c\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\n--duringfail \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\n--repeat REPEAT \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n--project_name PROJECT_NAME\n\u5de5\u7a0b\u540d\u79f0\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--build_location BUILD_LOCATION\n\u6784\u5efa\u5730\u533a\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--line LINE \u6267\u884c\u7684\u4e1a\u52a1\u7ebf\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--autostart AUTOSTART \u7528\u4f8b\u6267\u884c\u7a0b\u5e8f\u6ce8\u518c\u5230\u5f00\u673a\u81ea\u542f\u670d\u52a1\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a youqu manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\"\n \u547d\u4ee4\u884c\u53c2\u6570\u4f18\u5148\u7ea7\u662f\u9ad8\u4e8e\u914d\u7f6e\u6587\u4ef6\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u4e86\u5bf9\u5e94\u7684\u53c2\u6570\uff0c\u914d\u7f6e\u6587\u4ef6\u4e2d\u4e0d\u7ba1\u662f\u5426\u914d\u7f6e\u5747\u4e0d\u751f\u6548\u3002 --app \u5165\u53c2\u8fd8\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\uff0c\u4e0b\u9762\u7684\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u540c\u6837\u652f\u6301\u3002"},{"location":"#22","title":"2.2. \u8fdc\u7a0b\u6267\u884c","text":"\u8fdc\u7a0b\u6267\u884c\u5c31\u662f\u7528\u672c\u5730\u4f5c\u4e3a\u670d\u52a1\u7aef\u63a7\u5236\u8fdc\u7a0b\u673a\u5668\u6267\u884c\uff0c\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u76f8\u540c\uff1b \u4f7f\u7528 remote \u547d\u4ee4\uff1a youqu manage.py remote\n"},{"location":"#221","title":"2.2.1. \u8fdc\u7a0b\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u6267\u884c","text":"\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u6267\u884c\u5c31\u662f\u7531\u672c\u5730 YouQu \u4f5c\u4e3a\u670d\u52a1\u7aef\uff0c\u63a7\u5236\u8fdc\u7a0b N \u53f0\u673a\u5668\u6267\u884c\u76f8\u540c\u7684\u7528\u4f8b\uff0c\u6267\u884c\u5b8c\u4e4b\u540e\u6240\u6709\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u7ed3\u679c\u4f1a\u8fd4\u56de\u7ed9\u670d\u52a1\u7aef report \u76ee\u5f55\u4e0b\uff1b \u8fdc\u7a0b\u6267\u884c\u540c\u6837\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u8fdb\u884c\u7528\u4f8b\u76f8\u5173\u914d\u7f6e\uff1b \u9700\u8981\u91cd\u70b9\u8bf4\u4e00\u4e0b\u8fdc\u7a0b\u6267\u884c\u65f6\u7684\u6d4b\u8bd5\u673a\u4fe1\u606f\u914d\u7f6e\uff0c\u5728\u914d\u7f6e\u6587\u4ef6 setting/remote.ini \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\u3001IP\u3001\u5bc6\u7801\u3002 ;=============================== CLIENT LIST =====================================\n; \u6d4b\u8bd5\u673a\u914d\u7f6e\u5217\u8868\n;[client{number}] ;\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u6709\u591a\u5c11\u53f0\u6d4b\u8bd5\u673a\u5c31\u5199\u591a\u5c11\u4e2a client\uff0c\u522b\u540d\u5fc5\u987b\u5305\u542b client \u5b57\u7b26\uff0c\u4e14\u4e0d\u80fd\u91cd\u590d\u3002\n;user = ;\u6d4b\u8bd5\u673a user\n;ip = ;\u6d4b\u8bd5\u673a ip\n;password = 1 ;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801, \u53ef\u4ee5\u4e0d\u914d\u7f6e\u6b64\u9879\uff0c\u9ed8\u8ba4\u53d6 CLIENT_PASSWORD \u7684\u503c\uff1b\n;\u5982\u679c\u4f60\u6240\u6709\u6d4b\u8bd5\u673a\u5bc6\u7801\u90fd\u76f8\u540c\uff0c\u90a3\u4e48\u53ea\u9700\u8981\u914d\u7f6e CLIENT_PASSWORD \u5c31\u53ef\u4ee5\u4e86\n;=================================================================================\n[client1]\nuser = uos\nip = 10.8.15.xx\n[client2]\nuser = uos\nip = 10.8.15.xx\n[client3]\nuser = uos\nip = 10.8.11.xx\n \u6709\u591a\u5c11\u53f0\u673a\u5668\u5c31\u50cf\u8fd9\u6837\u53c2\u8003\u4e0a\u9762\u7684\u683c\u5f0f\u5199\u5c31\u884c\u4e86\u3002 \u7136\u540e\u5728\u547d\u4ee4\u884c\uff1a youqu manage.py remote\n \u8fd9\u6837\u8fd0\u884c\u662f\u4ece\u914d\u7f6e\u6587\u4ef6\u53bb\u8bfb\u53d6\u76f8\u5173\u914d\u7f6e\u3002 \u5982\u679c\u4f60\u4e0d\u60f3\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\uff0c\u4f60\u4ecd\u7136\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u8fdb\u884c\u4f20\u53c2\uff0c \u4ee5\u4e0b\u4e3a python3 manage.py remote \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -h, --help show this help message and exit\n-c CLIENTS, --clients CLIENTS\n\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679cpassword\u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6sett\ning/remote.ini\u4e2dCLIENT_PASSWORD\u7684\u503c,\u6bd4\u5982: uos@10.8.13.33:1\n\u6216 uos@10.8.13.33\n-s, --send_code \u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a\uff08\u4e0d\u542breport\u76ee\u5f55\uff09\n-e, --build_env \u642d\u5efa\u6d4b\u8bd5\u73af\u5883,\u5982\u679c\u4e3ayes\uff0c\u4e0d\u7ba1send_code\u662f\u5426\u4e3ayes\u90fd\u4f1a\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a.\n-p CLIENT_PASSWORD, --client_password CLIENT_PASSWORD\n\u6d4b\u8bd5\u673a\u5bc6\u7801\uff08\u5168\u5c40\uff09\n-y PARALLEL, --parallel PARALLEL\nyes:\u8868\u793a\u6240\u6709\u6d4b\u8bd5\u673a\u5e76\u884c\u8dd1\uff0c\u6267\u884c\u76f8\u540c\u7684\u6d4b\u8bd5\u7528\u4f8b;no:\u8868\u793a\u6d4b\u8bd5\u673a\u5206\u5e03\u5f0f\u6267\u884c\uff0c\u670d\u52a1\u7aef\u4f1a\u6839\u636e\u6536\u96c6\u5230\u7684\u6d4b\u8bd5\u7528\u4f8b\u81ea\n\u52a8\u5206\u914d\u7ed9\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u3002\n \u9664\u4e86\u8fd9\u4e9b\u7279\u6709\u53c2\u6570\u4ee5\u5916\uff0c\u5b83\u540c\u6837\u652f\u6301\u672c\u5730\u6267\u884c\u7684\u6240\u6709\u53c2\u6570\uff1b \u5728\u547d\u4ee4\u884c\u8fd9\u6837\u8fd0\u884c\uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\"\n \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report \u76ee\u5f55\u4e0b\u56de\u6536\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u7684\u6d4b\u8bd5\u62a5\u544a\u3002 \u6ce8\u610f\uff0c\u5982\u679c\u8fdc\u7a0b\u673a\u5668\u6ca1\u6709\u642d\u5efa\u81ea\u52a8\u5316\u6d4b\u8bd5\u73af\u5883\uff0c\u8bb0\u5f97\u52a0\u4e0a\u53c2\u6570 -e \uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\" -e\n \u6267\u884c\u524d\u786e\u4fdd\u8fdc\u7a0b\u673a\u5668\u5df2\u7ecf\u5f00\u542f\u4e86 ssh \u670d\u52a1\uff0c\u5426\u5219\u4f1a\u63d0\u793a\u65e0\u6cd5\u8fde\u63a5\uff0c\u5982\u679c\u6ca1\u6709\u5f00\u542f\uff0c\u8bf7\u624b\u52a8\u5f00\u542f\uff1a sudo systemctl restart ssh\nsudo systemctl enable ssh\n \u914d\u7f6e\u6587\u4ef6\u5176\u4ed6\u76f8\u5173\u914d\u7f6e\u9879\u8be6\u7ec6\u8bf4\u660e\uff0c\u8bf7\u67e5\u770b\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u6ce8\u91ca\u5185\u5bb9\u3002"},{"location":"#222","title":"2.2.2. \u8fdc\u7a0b\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u8d1f\u8f7d\u5747\u8861\u6267\u884c","text":"\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u8d1f\u8f7d\u5747\u8861\u6267\u884c\u4e5f\u662f\u7528\u672c\u5730\u4f5c\u4e3a\u670d\u52a1\u7aef\u63a7\u5236\u8fdc\u7a0b\u673a\u5668\u6267\u884c\uff0c\u4f46\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u4e0d\u540c\uff0c\u800c\u662f\u6240\u6709\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u4e4b\u548c\uff0c\u4e3a\u4f60\u60f3\u8981\u6267\u884c\u7684\u7528\u4f8b\u96c6\uff1b \u4f3c\u4e4e\u6709\u70b9\u96be\u4ee5\u7406\u89e3\uff0c\u6211\u7528\u5927\u767d\u8bdd\u4e3e\u4f8b\u63cf\u8ff0\u4e0b\u5c31\u662f\uff0c\u670d\u52a1\u7aef\u60f3\u8981\u6267\u884c 10 \u6761\u7528\u4f8b\uff0c\u73b0\u5728\u8fdc\u7a0b\u673a\u5668\u6709 5 \u53f0\uff1b \u7136\u540e\u670d\u52a1\u7aef\u5c31\u5148\u62ff\u7740\u7b2c 1 \u6761\u7528\u4f8b\u7ed9\u8fdc\u7a0b 1 \u53f7\u673a\u6267\u884c\uff0c\u62ff\u7b2c 2 \u6761\u7528\u4f8b\u7ed9\u8fdc\u7a0b 2 \u53f7\u673a\u6267\u884c...\uff0c\u5982\u6b64\u5faa\u73af\u76f4\u5230\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\uff0c\u8fd9\u5c31\u662f\u8d1f\u8f7d\u5747\u8861\u6267\u884c\u3002 \u4f7f\u7528\u65b9\u6cd5\u548c\u524d\u9762\u4e00\u6837\uff0c\u53ea\u662f\u9700\u8981\u589e\u52a0\u4e00\u4e2a\u53c2\u6570\uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\" --parallel no\n"},{"location":"#23-pms","title":"2.3. PMS \u6570\u636e\u56de\u586b","text":"\u6d4b\u8bd5\u5355\u5173\u8054\u7684\u7528\u4f8b\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u5bf9\u5e94\u7684\u53bb\u8dd1\u8fd9\u4e9b\u5173\u8054\u7684\u7528\u4f8b\uff0c\u5e76\u4e14\u5c06\u6267\u884c\u7684\u7ed3\u679c\u56de\u586b\u7684\u6d4b\u8bd5\u7528\u4f8b\u7684\u72b6\u6001\u91cc\u9762\u3002 PMS \u6570\u636e\u56de\u586b\u4e3b\u8981\u6709\u4e09\u79cd\u65b9\u5f0f\uff1a \uff081\uff09\u5f02\u6b65\u56de\u586b \u5728\u7528\u4f8b\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\uff0c\u91c7\u7528\u5f02\u6b65\u7684\u65b9\u5f0f\u53bb\u8fdb\u884c\u6570\u636e\u56de\u586b\uff0c\u76f4\u767d\u7684\u8bb2\u5c31\u662f\uff0c\u7b2c\u4e8c\u6761\u7528\u4f8b\u5f00\u59cb\u8dd1\u7684\u65f6\u5019\uff0c\u901a\u8fc7\u5b50\u7ebf\u7a0b\u53bb\u505a\u7b2c\u4e00\u6761\u7528\u4f8b\u7684\u6570\u636e\u56de\u586b\uff0c\u5982\u6b64\u5faa\u73af\uff0c\u76f4\u5230\u6240\u6709\u7528\u4f8b\u6267\u884c\u7ed3\u675f\uff1b \u8fd9\u79cd\u65b9\u6848\u7684\u65f6\u95f4\u6548\u7387\u6700\u9ad8\u7684\uff0c\u56e0\u4e3a\u7406\u8bba\u4e0a\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u662f\u5927\u4e8e\u6570\u636e\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\u65f6\u95f4\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u5f53\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u6570\u636e\u56de\u586b\u4e5f\u5b8c\u6210\u4e86\u3002 \u4f7f\u7528\u65b9\u6cd5\uff0c\u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u4ee5\u4e0b\u53c2\u6570\uff1a\uff08\u4ee5\u4e0b\u6d89\u53ca\u5230\u7684\u53c2\u6570\u914d\u7f6e\u90fd\u662f\u5728\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u914d\u7f6e\uff09 PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = async\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \u8fd9\u4e2a\u53c2\u6570\u53ef\u586b\u53ef\u4e0d\u586b\uff0c\u4f46\u662f\u586b\u4e86\u53ef\u4ee5\u63d0\u9ad8\u7528\u4f8b\u7684\u6267\u884c\u901f\u5ea6\uff0c\u56e0\u4e3a\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u53ef\u4ee5\u6307\u5b9a\u5230\u5177\u4f53\u7684\u5e94\u7528\u5e93\u3002\uff08\u4e0b\u540c\uff09\n \uff082\uff09\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u56de\u586b \u7b49\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u518d\u9010\u4e2a\u8fdb\u884c\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u6b64\u65b9\u6848\u65f6\u95f4\u6548\u7387\u6bd4\u8f83\u4f4e\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \uff083\uff09\u624b\u52a8\u56de\u586b \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4e0d\u505a\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u540e\u7eed\u624b\u52a8\u5c06\u7ed3\u679c\u8fdb\u884c\u56de\u586b\u8bf7\u6c42\u3002 \u7528\u4f8b\u6267\u884c\u65f6\u914d\u7f6e\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = hand\nAPP_NAME = \u540e\u7eed\u624b\u52a8\u56de\u586b\u65b9\u6cd5\uff1a youqu manage.py pms --send2task yes\n"},{"location":"#_4","title":"\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898","text":"\u7531\u540c\u5b66\u53ef\u80fd\u4f1a\u53d1\u73b0\uff0c\u600e\u4e48\u56de\u586b\u4e00\u6b21\u4e4b\u540e\uff0c\u540e\u9762\u60f3\u518d\u6b21\u56de\u586b\u5c31\u4e0d\u751f\u6548\u4e86\uff1b \u8fd9\u662f\u56e0\u4e3a\u4e3a\u4e86\u5e94\u5bf9\u524d\u9762\u63d0\u5230\u7684\u591a\u79cd\u6570\u636e\u56de\u586b\u7684\u65b9\u5f0f\uff0c\u5728 report \u76ee\u5f55\u4e0b\u4f1a\u7531 pms_xxx \u5f00\u5934\u7684\u76ee\u5f55\uff0c\u8bb0\u5f55\u4e86\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u548c\u56de\u586b\u60c5\u51b5\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u4e4b\u524d\u5df2\u7ecf\u56de\u586b\u8fc7\u4e86\uff0c\u540e\u7eed\u5c31\u4e0d\u4f1a\u518d\u6b64\u89e6\u53d1\u56de\u586b\u4e86\uff1b \u5982\u679c\u4f60\u60f3\u91cd\u65b0\u505a\u56de\u586b\uff0c\u4f60\u53ef\u4ee5\u628a report/pms_xxx \u76ee\u5f55\u5220\u6389\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u91cd\u65b0\u505a\u6570\u636e\u56de\u586b\u4e86\uff1b"},{"location":"#24-csv","title":"2.4. \u5bfc\u51fa CSV \u6587\u4ef6","text":"\u6846\u67b6\u63d0\u4f9b\u5bfc\u51fa\u6307\u5b9a\u6807\u7b7e\u7528\u4f8b\u7684\u529f\u80fd\uff1a youqu manage.py exportcsv -a deepin-album -t CICD\n \u8868\u793a\u5bfc\u51fa deepin-album \u7684\u7528\u4f8b\u4e2d\u6807\u8bb0\u4e86 CICD \u6807\u7b7e\u7684\u7528\u4f8b\uff0c\u5bfc\u51fa CSV \u6587\u4ef6\u7684\u5b57\u6bb5\u683c\u5f0f\u5df2\u7ecf\u9002\u914d\u4e86 CICD \u7684\u8981\u6c42\u3002"},{"location":"#25-app","title":"2.5. \u811a\u624b\u67b6\u65b0\u5efa APP \u5de5\u7a0b","text":"\u65b0\u5efa\u4e00\u4e2a APP \u5de5\u7a0b\uff1a youqu manage.py startapp autotest_deepin_some \u8fd9\u6837\u5728 apps \u76ee\u5f55\u4e0b\u4f1a\u521b\u5efa\u4e00\u4e2a\u5b50\u9879\u76ee\u5de5\u7a0b autotest_deepin_some\uff0c\u540c\u65f6\u65b0\u5efa\u597d\u5de5\u7a0b\u6a21\u677f\u76ee\u5f55\u548c\u6a21\u677f\u6587\u4ef6\uff1a apps\n\u2514\u2500\u2500 autotest_deepin_some\n \u00a0\u00a0 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_case.py\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 config.ini\n \u00a0\u00a0 \u251c\u2500\u2500 config.py\n \u00a0\u00a0 \u251c\u2500\u2500 conftest.py\n \u00a0\u00a0 \u251c\u2500\u2500 control\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_assert.py\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some.csv\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u2514\u2500\u2500 widget\n \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 case_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 other.ini\n \u00a0\u00a0 \u251c\u2500\u2500 other_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 pic_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2514\u2500\u2500 ui.ini\n autotest_deepin_some \u662f\u4f60\u7684\u5de5\u7a0b\u540d\u79f0\uff0c\u6bd4\u5982\uff1aautotest_deepin_music \uff1b \u5728\u6b64\u57fa\u7840\u4e0a\uff0c\u4f60\u53ef\u4ee5\u5feb\u901f\u7684\u5f00\u59cb\u4f60\u7684 AT \u9879\u76ee\u3002"},{"location":"#26","title":"2.6. \u7528\u4f8b\u6807\u7b7e\u81ea\u52a8\u540c\u6b65","text":"\u7528\u4e8e\u81ea\u52a8\u540c\u6b65 PMS \u7528\u4f8b\u6807\u7b7e\u6570\u636e\u81f3\u672c\u5730 CSV \u6587\u4ef6\uff0c\u4e3b\u8981\u901a\u8fc7\u4ee5\u4e0b\u51e0\u4e2a\u914d\u7f6e\u6765\u63a7\u5236\uff1a APP_NAME = # \u6307\u5b9a\u8981\u540c\u6b65\u7684\u5e94\u7528\u540d\u79f0\nPMS_USER = # PMS\u7684\u7528\u6237\u540d\nPMS_PASSWORD = # PMS\u7684\u5bc6\u7801\n \u5728 [csv_link_pms_id] \u8282\u70b9\u4e0b\u6307\u5b9a csv \u6587\u4ef6\u540d\u4e0e PMS \u7528\u4f8b\u6a21\u5757\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u6bd4\u5982\uff1a [csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/testcase-browse-53.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 53\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic = 53\n \u5c06\u4ee5\u4e0a\u4fe1\u606f\u914d\u7f6e\u597d\u4e4b\u540e\uff0c\u5728\u547d\u4ee4\u884c\u6267\u884c\uff1a youqu manage.py pms --pms2csv yes\n \u6bcf\u6b21\u6267\u884c\u65f6\u539f csv \u6587\u4ef6\u4f1a\u81ea\u52a8\u5907\u4efd\u5728 report/csv_back \u76ee\u5f55\u4e0b\uff0c\u56e0\u6b64\u4f60\u4e0d\u7528\u62c5\u5fc3\u811a\u672c\u6267\u884c\u5bfc\u81f4\u4f60\u7684\u6570\u636e\u4e22\u5931\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u57fa\u7840\u6846\u67b6\u8bbe\u8ba1\u65b9\u6848","text":"# ====================================\n# Author : Mikigo\n# Time : 2022/3/18\n# version \uff1a1.0\n# ====================================\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"\u505a\u4e00\u4e2a\u7b80\u5355\u3001\u597d\u7528\u3001\u529f\u80fd\u5f3a\u5927\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u3002 \u4f5c\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4e00\u4e2a\u57fa\u7840\u6846\u67b6\uff0c\u4efb\u4f55\u5e94\u7528\u90fd\u80fd\u5f88\u65b9\u4fbf\u7684\u63a5\u5165\u8fdb\u6765\uff1b \u63d0\u4f9b\u6240\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u9700\u8981\u7684\u5e95\u5c42\u529f\u80fd\uff0c\u5e76\u5bf9\u5916\u63d0\u4f9b\u552f\u4e00\u7684\u63a5\u53e3\uff0c\u65b9\u4fbf\u5e94\u7528\u5e93\u4f7f\u7528\uff1b \u6574\u5408\u516c\u5171\u5e93\uff0c\u51cf\u5c11\u5e94\u7528\u5e93\u4ee3\u7801\u91cf\u548c\u65b9\u6cd5\u7ef4\u62a4\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u8bbe\u8ba1\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u7edf\u4e00\u6982\u5ff5","text":" \u57fa\u7840\u6846\u67b6 \u672c\u9879\u76ee\u662f\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\uff08AutoTest Basic Frame\uff09\uff0c\u5168\u79f0\u4e3a\u201c\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff08AT \u57fa\u7840\u6846\u67b6\uff09\u201d\u3002 AT \u57fa\u7840\u6846\u67b6\u662f\u505a\u4e3a\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\u6765\u8bbe\u8ba1\u7684\uff0c\u5b83\u63d0\u4f9b\u4e86\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u57fa\u7840\u529f\u80fd\uff0c\u4efb\u4f55\u5e94\u7528\u63a5\u5165\u8fdb\u6765\u90fd\u80fd\u5feb\u901f\u65b9\u4fbf\u7684\u8fdb\u884c\u65b9\u6cd5\u548c\u7528\u4f8b\u7f16\u5199\uff0c\u540c\u65f6\u5728\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u3001\u6807\u7b7e\u5316\u6267\u884c\u3001\u5206\u5e03\u5f0f\u6267\u884c\u3001\u591a\u79cd\u62a5\u544a\u8f93\u51fa\u3001\u4f18\u7f8e\u7684\u6267\u884c\u65e5\u5fd7\u3001\u5931\u8d25\u81ea\u52a8\u5f55\u5c4f\u548c\u622a\u56fe\u3001\u81ea\u52a8\u73af\u5883\u6e05\u7406\u7b49\u7b49\uff0c\u5b83\u90fd\u63d0\u4f9b\u4e86\u5b8c\u5584\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u66f4\u91cd\u8981\u7684\u662f\u8fd9\u4e00\u5207\u4f7f\u7528\u8d77\u6765\u90fd\u975e\u5e38\u7b80\u5355\u3002 \u57fa\u7840\u6846\u67b6\u4e2d\u5305\u542b\u5e94\u7528\u5e93\uff08apps\uff09\u3001\u6838\u5fc3\u5e93\uff08src\uff09\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09\u3002 \u5e94\u7528\u5e93\uff08apps\uff09 \u5404\u4e2a\u5e94\u7528\u81ea\u5df1\u7684\u4ed3\u5e93\uff0c\u91cc\u9762\u4e3b\u8981\u5305\u542b\u7684\u662f\u7528\u4f8b\u3001\u65b9\u6cd5\u53ca\u4e00\u4e9b\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u53eb autotest-dde-file-manager \u3002 \u6838\u5fc3\u5e93\uff08src\uff09 \u6838\u5fc3\u5e93\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u5230\u6240\u6709\u5e95\u5c42\u6838\u5fc3\u529f\u80fd\uff0c\u8fd9\u662f\u6700\u91cd\u8981\u7684\u4e00\u4e2a\u90e8\u5206\uff0c\u7075\u9b42\u3002\u5177\u4f53\u529f\u80fd\u6a21\u5757\u53ca\u8bf4\u660e\u4f1a\u5728\u4e0b\u9762\u7b2c\u56db\u4e2a\u7ae0\u8282\u8be6\u7ec6\u63cf\u8ff0\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09 \u591a\u4e2a\u5e94\u7528\u90fd\u8981\u7528\u5230\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\uff0c\u6309\u7167\u5e94\u7528\u5212\u5206\u5b58\u653e\uff0c\u4e3b\u8981\u662f\u4e3a\u4e86\u51cf\u5c11\u4ee3\u7801\u91cf\uff0c\u6d88\u9664\u5e94\u7528\u95f4\u7684\u8026\u5408\u5173\u7cfb\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u67b6\u6784\u56fe","text":"\u6574\u4f53\u7684\u6846\u67b6\u8bbe\u8ba1\u5728\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u300b\u6587\u6863\u91cc\u9762\u5df2\u7ecf\u6709\u8be6\u7ec6\u63cf\u8ff0\u4e86\uff0c\u8fd9\u91cc\u8d34\u4e00\u4e0b\u6574\u4f53\u7684\u67b6\u6784\u56fe\uff1a \u4e3a\u4e86\u7a81\u663e\u672c\u6587\u7684\u91cd\u70b9\uff0c\u62bd\u53d6\u5176\u4e2d\u91cd\u8981\u529f\u80fd\u6a21\u5757\uff0c\u5982\u4e0b\u56fe\uff1a "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-basic-frame # \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\n\u251c\u2500\u2500 apps # \u5e94\u7528\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-dde-file-manager # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\uff08\u5e94\u7528\u5e93\u8be6\u7ec6\u76ee\u5f55\u7ed3\u6784\u8bf7\u770b\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\uff09\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 tag # \u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u2514\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u2502 \u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 xxx.png\n\u2502 \u2502 ...\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-deepin-music # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 public # \u516c\u5171\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget # dde_dock \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget # dde_desktop \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 src # \u6838\u5fc3\u5e93\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 button_center.py\n\u2502 \u251c\u2500\u2500 cmdtrl.py\n\u2502 \u251c\u2500\u2500 dogtails.py\n\u2502 \u251c\u2500\u2500 find_image.py\n\u2502 \u251c\u2500\u2500 global_config.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 setting # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 config.py\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 global_config.ini\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\u6a21\u5757\uff08Hook\uff09\n\u251c\u2500\u2500 pytest.ini # Pytest \u9ed8\u8ba4\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 docs # \u6587\u6863\u76ee\u5f55\n\u2514\u2500\u2500 manage.py # \u6267\u884c\u5668\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1apps","title":"1\u3001\u5e94\u7528\u5e93\uff08apps\uff09","text":"\u6240\u6709\u5e94\u7528\u5e93\u5747\u653e\u7f6e\u5728\u57fa\u7840\u6846\u67b6\u4e0b\u7684 apps \u76ee\u5f55\u4e0b\uff08\u89c1\u7b2c\u4e8c\u7ae0\u8282\u7b2c3\u6bb5\u76ee\u5f55\u7ed3\u6784\u5185\u5bb9\uff09\u3002\u5e94\u7528\u5e93\u7684\u67b6\u6784\u8bbe\u8ba1\u53ef\u4ee5\u53c2\u8003\u300aAT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b\u6587\u6863\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2src","title":"2\u3001\u6838\u5fc3\u5e93\uff08src\uff09","text":"\u5728 src \u76ee\u5f55\u4e0b\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u5e95\u5c42\u6838\u5fc3\u7ec4\u4ef6\uff0c\u901a\u5e38\u6765\u8bb2\u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5230\u5176\u4e2d\u67d0\u4e00\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4e48\u4f60\u9700\u8981\u663e\u793a\u7684\u5bfc\u5165\u8fd9\u4e2a\u6a21\u5757\uff0c\u7136\u540e\u624d\u80fd\u4f7f\u7528\u8be5\u6a21\u5757\u4e0b\u7684\u529f\u80fd\uff0c\u5982\u679c\u4f60\u7528\u5230\u4e86\u5341\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4f60\u5c31\u9700\u8981\u5bfc\u5165\u5341\u4e2a\u3002\u4f46\u662f\u6211\u4eec\u60f3\u8ba9\u4e8b\u60c5\u53d8\u5f97\u7b80\u5355\uff0c\u4e00\u6b21\u5bfc\u5165\uff0c\u4f7f\u7528\u6240\u6709\u3002 \u5c06\u6240\u6709\u7684\u529f\u80fd\u6a21\u5757\u90fd\u8fdb\u5165\u5230 src \u7684\u540d\u79f0\u7a7a\u95f4\uff0c\u5728 src/__init__.py \u91cc\u9762\u6211\u4eec\u8bbe\u8ba1\u6210\u8fd9\u6837\uff1a # src/__init__.py\nfrom .cmdctl import CmdCtl\nfrom .dogtails import Dogtail\nfrom .find_image import FindImage\nfrom .button_center import ButtonCenter\nclass Src(CmdCtl, FindImage):\ndef __init__(self, **kwargs):\n\"\"\"dogtail or button center param\n :param kwargs: app_name, desc, number\n \"\"\"\nif kwargs:\napp_name = kwargs.get(\"APP_NAME\")\ndesc = kwargs.get(\"DESC\")\nif app_name is None or desc is None:\nraise ValueError\nnumber = kwargs.get(\"number\")\nnumber = number if isinstance(number, int) else -1\n# \u5bf9\u8c61\u7ec4\u5408\nself.dog = Dogtail(app_name, desc, number)\nself.ui = ButtonCenter(app_name, number)\n \u9700\u8981\u4f20\u9012\u53c2\u6570\u7684\u91c7\u7528\u5bf9\u8c61\u7ec4\u5408\uff0c\u6ca1\u6709\u53c2\u6570\u7684\u4f7f\u7528\u7ee7\u627f\uff0c\u7ee7\u627f\u7684\u7c7b\u7b26\u5408 Mixin \u8bbe\u8ba1\u6a21\u5f0f\u3002 \u5e94\u7528\u5e93\u91cc\u9762\u4f7f\u7528\u7684\u65f6\u5019\u5728 widget/base_widget.py \u91cc\u9762\u53ea\u9700\u8981\u552f\u4e00\u7ee7\u627f Src \uff1a # \u5e94\u7528\u5e93\u91cc\u9762\u65b9\u6cd5\u57fa\u7c7b\n# widget/base_widget.py\nfrom src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n \u8981\u4f7f\u7528\u6838\u5fc3\u5e93\u7684\u529f\u80fd\uff0c\u53ea\u9700\u8981\u5199\u4e00\u4e2a\u5bfc\u5165 from src import Src \u5373\u53ef\u3002 \u5199 __init__ \u6784\u9020\u51fd\u6570\u7684\u539f\u56e0\u662f\u901a\u8fc7\u53c2\u6570\u6784\u9020\u5e94\u7528\uff0c\u5e76\u4e14\u4f20\u9012 number \u8fdb\u6765\uff0c\u53ef\u4ee5\u5b9e\u73b0\u591a\u7a97\u53e3\u7684\u63a7\u5236\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3public","title":"3\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09","text":"\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6bcf\u4e2a\u5e94\u7528\u90fd\u662f\u4e00\u4e2a\u5355\u72ec\u7684 py \u6587\u4ef6\uff0c\u76f8\u4e92\u4e4b\u95f4\u662f\u72ec\u7acb\u7684\uff0c\u6bcf\u4e2a py \u6587\u4ef6\u91cc\u9762\u662f\u8be5\u5e94\u7528\u7684\u65b9\u6cd5\u7c7b\uff0c\u6bd4\u5982\uff1a\u6700\u5e38\u7528\u7684\u65b9\u6cd5\u7c7b dde_desktop_public_widget.py # dde_desktop_widget.py\nfrom src import Src\nclass _DdeDesktopPublicBaseWidget(Src):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-desktop\"\nDESC = \"/usr/bin/dde-desktop\"\ndef __init__(self):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC)\nclass DdeDesktopPublicWidget(_DdeDesktopPublicBaseWidget):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u7c7b\"\"\"\ndef click_music_dir_by_ui(self):\n\"\"\"\u5728\u6587\u4ef6\u9009\u62e9\u6846\u70b9\u51fb\u97f3\u4e50\u76ee\u5f55\"\"\"\nself.click(*self.ui.btn_center(\"\u4fa7\u8fb9\u680f-\u97f3\u4e50\")) \ndef click_xxx_by_attr(self):\npass\n \u516c\u5171\u65b9\u6cd5\u5e93\u610f\u4e49\uff1a \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6240\u5c01\u88c5\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\u90fd\u662f\u81f3\u5c11\u88ab2\u4e2a\u5e94\u7528\u90fd\u7528\u5230\u7684\uff0c\u8fd9\u6837\u505a\u53ef\u4ee5\u51cf\u5c11\u6574\u4f53\u4ee3\u7801\u91cf\uff0c\u4ece\u800c\u51cf\u8f7b\u5e94\u7528\u5e93\u4ee3\u7801\u7684\u7ef4\u62a4\u5de5\u4f5c\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u7f16\u5199\u5f62\u5f0f\uff08\u547d\u540d\u89c4\u5219\u3001\u5b9a\u4f4d\u7684\u65b9\u6848\u5199\u6cd5\u3001\u6ce8\u91ca\u7684\u5199\u6cd5\u7b49\u7b49\uff09\u5177\u6709\u4e00\u5b9a\u7684\u6a21\u677f\u4f5c\u7528\uff0c\u8fd9\u6837\u5373\u4f7f\u662f\u5404\u4e2a\u5e94\u7528\u5e93\u90fd\u72ec\u7acb\u7ef4\u62a4\uff0c\u6240\u6709\u7684\u7f16\u7801\u98ce\u683c\u90fd\u662f\u8d8b\u4e8e\u76f8\u540c\u7684\uff0c\u56e0\u4e3a\u5927\u5bb6\u90fd\u5e94\u8be5\u53c2\u7167\u516c\u5171\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u5199\u6cd5\u6765\u5199\u81ea\u5df1\u5e94\u7528\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\u7c7b\uff0c\u8fd9\u6837\u4f7f\u5f97\u4ece\u516c\u53f8\u7684\u89d2\u5ea6\u53bb\u770b\u6240\u6709\u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u90fd\u662f\u7edf\u4e00\u7684\u3002 \u53ef\u4ee5\u901a\u8fc7\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\uff0c\u4e86\u89e3\u5230\u5176\u4ed6\u5e94\u7528\u7684\u529f\u80fd\uff0c\u5bf9\u4e8e\u6211\u4eec\u9700\u6c42\u7406\u89e3\uff0c\u4e86\u89e3\u7cfb\u7edf\u7684\u65b9\u65b9\u9762\u9762\u4e5f\u6709\u597d\u5904\u3002 \u5f53\u7136\uff0c\u5982\u679c\u4f60\u7684\u5e94\u7528\u672c\u8eab\u662f\u5c5e\u4e8e\u6839\u672c\u5c31\u4e0d\u9700\u8981\u548c\u5176\u4ed6\u5e94\u7528\u4ea4\u4e92\u7684\uff0c\u90a3\u4e48\u4f60\u53ef\u80fd\u4e0d\u4f1a\u7528\u5230\u8fd9\u91cc\u9762\u7684\u529f\u80fd\uff0c\u6ca1\u5173\u7cfb\uff0c\u4f60\u6240\u6709\u7684\u65b9\u6cd5\u90fd\u53ef\u4ee5\u76f4\u63a5\u5199\u5728\u5e94\u7528\u5e93\u7684\u4e1a\u52a1\u5c42\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4conftestpy","title":"4\u3001conftest.py","text":"conftest.py \u4ece\u529f\u80fd\u4e0a\u5c06\u662f\u5c5e\u4e8e\u6838\u5fc3\u5e93\uff08src\uff09\u7684\u5185\u5bb9\uff0c\u4f46\u662f\u7531\u4e8e\u5b83\u7684\u7279\u6b8a\u6027\uff0c\u5373\u5b83\u662f\u5bf9\u5e94\u7528\u5e93\u4e2d\u7684\u7528\u4f8b\u751f\u6548\u7684\uff0c\u800c\u4e14\u5b83\u7684\u4f5c\u7528\u57df\u662f\u5f53\u524d\u76ee\u5f55\u53ca\u4ee5\u4e0b\uff0c\u56e0\u6b64\u6211\u4eec\u5c06\u5b83\u653e\u5230\u9879\u76ee\u6839\u76ee\u5f55\u3002\u6211\u4eec\u6846\u67b6\u4e2d\u6709\u4e0d\u5c11\u6838\u5fc3\u529f\u80fd\u90fd\u662f\u5728\u8fd9\u91cc\u9762\u8fdb\u884c\u5f00\u53d1\u7684\uff0c\u540e\u9762\u7b2c\u56db\u7ae0\u4f1a\u8bb2\u5230\u7ec6\u8282\u3002 pytest.ini \u4f5c\u7528\u548c conftest.py \u7c7b\u4f3c\uff0c\u662f Pytest \u6846\u67b6\u7684\u56fa\u5b9a\u914d\u7f6e\u6587\u4ef6\uff0c\u76ee\u524d\u914d\u7f6e\u4e86\u4e00\u4e9b\u901a\u7528\u7684\u547d\u4ee4\u884c\u6267\u884c\u53c2\u6570\uff0c\u4e5f\u653e\u5728\u9879\u76ee\u6839\u76ee\u5f55\u3002 \u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 Hook \u51fd\u6570\uff0capps \u76ee\u5f55\u4e0b\u7684 \u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 fixture \u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5setting","title":"5\u3001setting","text":"\u5168\u5c40\u914d\u7f6e\u6a21\u5757\uff0c\u5305\u542b\u4e86\u4ee5\u4e0b\u914d\u7f6e\u6587\u4ef6\uff1a \uff081\uff09ini \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u914d\u7f6e\u4e00\u4e9b\u5168\u5c40\u7684\u914d\u7f6e\u9879\uff0c\u8b6c\u5982\uff1a\u5931\u8d25\u91cd\u8dd1\u6b21\u6570\u3001\u662f\u5426\u5931\u8d25\u5f55\u5c4f\u3001\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\u3001\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4\u3001\u6267\u884c\u65f6\u65e5\u5fd7\u7ea7\u522b\u3001\u751f\u6210\u7684\u62a5\u544a\u7c7b\u578b\u3001\u4ee5\u53ca\u5206\u5e03\u5f0f\u6267\u884c\u7684\u4e00\u4e9b\u7b56\u7565\u914d\u7f6e\u9879\u7b49\u7b49\u3002 \uff082\uff09config.py \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u63d0\u4f9b\u914d\u7f6e\u6587\u4ef6\u8bfb\u53d6\u3001\u52a8\u6001\u83b7\u53d6\u4e00\u4e9b\u5e38\u91cf\uff08\u5982\u9879\u76ee\u6839\u76ee\u5f55\u7edd\u5bf9\u8def\u5f84 (BASE_DIR)\u3001\u7cfb\u7edf\u67b6\u6784\uff08SYS_FRAME\uff09\u3001\u65f6\u95f4\u5b57\u7b26\u4e32\uff08strftime\uff09\u3001\u672c\u673a USERNAME IP \u7b49\u7b49\uff09\u3001\u516c\u5171 URL \u7b49\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u89c4\u8303","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u7248\u672c\u53ca\u4f9d\u8d56","text":"\u57fa\u7840\u6846\u67b6\u4f1a\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u8fdb\u884c\u7248\u672c\u53d1\u5e03\uff0c\u4e0d\u4e0e\u67d0\u4e2a\u5e94\u7528\u7248\u672c\u7ed1\u5b9a\uff0c\u4f46\u662f\uff0c\u5e94\u7528\u5e93\u4f1a\u4f9d\u8d56\u4e8e\u57fa\u7840\u6846\u67b6\u7684\u7248\u672c\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u5efa\u8bae\u5728\u5e94\u7528\u5e93\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a\u6587\u672c\u6587\u4ef6\u7528\u4e8e\u8bb0\u5f55\u6240\u4f9d\u8d56\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\uff0c\u7c7b\u4f3c\u4e8e\u5f00\u53d1\u5e94\u7528\u7684 debian/control \u6587\u4ef6\u7684\u529f\u80fd\uff0c\u4e3a\u4e86\u4fdd\u6301\u7edf\u4e00\uff0c\u8fd9\u4e2a\u6587\u4ef6\u5c31\u547d\u540d\u4e3a control\uff0c\u653e\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u6838\u5fc3\u5e93\u72ec\u7acb\u6027","text":"\u6838\u5fc3\u5e93\u4e0d\u5efa\u8bae\u9488\u5bf9\u67d0\u4e00\u4e2a\u5e94\u7528\u5355\u72ec\u505a\u4ee3\u7801\u4e0a\u7279\u6b8a\u5904\u7406\uff0c\u901a\u5e38\u8003\u8651\u9488\u5bf9\u67d0\u4e00\u79cd\u573a\u666f\u8fdb\u884c\u5904\u7406\uff0c\u8fd9\u4e9b\u573a\u666f\u901a\u5e38\u662f\u5b58\u5728\u4e00\u4e9b\u5171\u6027\u7684\u3002\u6bd4\u5982\u8bf4\uff1a\u684c\u9762\u7684ID\u5206\u914d\u5b58\u5728\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u903b\u8f91\u5904\u7406\u89e3\u51b3ID\u5206\u914d\u9519\u8bef\u7684\u95ee\u9898\uff0c\u4f46\u662f\u8fd9\u90e8\u5206\u903b\u8f91\u6211\u4eec\u4f1a\u5728\u684c\u9762\u7684\u65b9\u6cd5\u5c42\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u517c\u5bb9\u6027","text":"\u4e3a\u4e86\u4fdd\u6301\u517c\u5bb9\u6027\uff0c\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u539f\u5219\u4e0a\u4e0d\u5bf9\u8001\u65b9\u6cd5\u8fdb\u884c\u4fee\u6539\u6216\u5220\u9664\uff0c\u53ea\u8fdb\u884c\u65b0\u589e\u3002\u6d89\u53ca\u5230\u8001\u65b9\u6cd5\u4fee\u6539\u6216\u5220\u9664\u7684\uff0c\u4f1a\u8fdb\u884c\u63d0\u524d\u9884\u544a\uff0c\u5e76\u5728\u7b2c\u4e8c\u4e2a\u7248\u672c\u4e4b\u540e\uff08\u4e2d\u95f4\u4f1a\u9694\u4e00\u4e2a\u7248\u672c\u8fc7\u5ea6\uff09\u6b63\u5f0f\u5b9e\u65bd\u4fee\u6539\u6216\u5220\u9664\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u547d\u540d\u89c4\u8303","text":" \u7528\u4f8b ID \u6bcf\u4e2a\u5e94\u7528\u81ea\u5df1\u7ef4\u62a4\u4e00\u5957 ID\uff0c\u5728PMS\u4e0a\u7528\u4f8b\u6807\u9898\u4e0a\u5c06\u81ea\u52a8\u5316ID\u4ee5\u6807\u7b7e\u7684\u5f62\u5f0f\u5199\u5165\uff0c\u6bd4\u5982\uff1a[101]\u6253\u5f00-\u542f\u52a8\u5e94\u7528\u540edock\u53f3\u952e\u83dc\u5355 \u4e00\u4e2a\u7528\u4f8b\u7c7b\u91cc\u9762\u6709\u591a\u4e2a\u7528\u4f8b\u65f6\uff0c\u5728\u7528\u4f8b\u540d\u79f0\u540e\u9762\u52a0\u5e8f\u53f7\u3002 class TestFileManager(BaseCase):\n\"\"\"\u6587\u7ba1\u7528\u4f8b\"\"\"\ndef test_xxx_015_1(self):\npass\ndef test_xxx_015_2(self):\npass\n \u6ce8\u610f 015_1\uff0c\u4e0d\u8981\u5199015_01\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 PMS \u4e0a\u7684\u7528\u4f8bID\uff1a PMS \u4e0a\u662f6\u4f4d\u6570\uff0c\u4e0d\u591f\u76f4\u89c2\uff0c\u4e5f\u4e0d\u597d\u7ef4\u62a4\uff0c\u5728\u81ea\u52a8\u5316\u4e0b\u9762\u53bb\u627e\u4e00\u4e2a\u5e26\u6709 6 \u4f4d\u6570\u7684\u6587\u4ef6\u662f\u4e00\u4e2a\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 PMS \u4e0a\u7684 ID \u53ef\u80fd\u4f1a\u53d1\u751f\u53d8\u5316\uff0c\u6bd4\u5982\u5bfc\u51fa\u6765\u5bfc\u8fdb\u53bb\u7684\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u5b58\u5728\u95ee\u9898\uff0c\u5982\u679c\u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u8981\u60f3\u627e\u51fa\u6765\u5bf9\u5e94\u4fee\u6539\u81ea\u52a8\u5316\u7528\u4f8b ID\uff0c\u5c06\u4f1a\u662f\u4ef6\u975e\u5e38\u75db\u82e6\u7684\u4e8b\u60c5\u3002 \u51fd\u6570\u547d\u540d\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5de6\u952e\u70b9\u51fb click \u53f3\u952e\u70b9\u51fb right_click \u53cc\u51fb double_click \u79fb\u52a8 move_to \u62d6\u52a8 drag \u65b0\u5efa new \u62d6\u52a8\u5230 drag_to \u4ece\u54ea\u91cc\u62d6\u52a8\u5230\u54ea\u91cc drag_something_from_xxx_to_xxx \u83b7\u53d6 get \u83b7\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5750\u6807 get_location \u975e\u7279\u6b8a\u6587\u4ef6 file word\u6587\u4ef6 doc text\u6587\u4ef6 text \u6587\u4ef6\u5939 dir \u5173\u952e\u8bcd\u6301\u7eed\u589e\u52a0 \u5e38\u91cf\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5e94\u7528\u540d\u79f0 APP_NAME \u5e94\u7528\u63cf\u8ff0 DESC \u672c\u5e94\u7528\u4ee5\u5916\u7684\u5176\u4ed6\u5e94\u7528\uff0c\u6bd4\u5982\u5e2e\u52a9 HELP \u5176\u4ed6\u540d\u79f0\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u65b9\u6cd5\u5305\u540d widget \u65b9\u6cd5\u6587\u4ef6\u540d\uff08\u6587\u7ba1\u4e3e\u4f8b\uff09 dfm_widget.pytitle_widget.pyright_view_widget.pyleft_view_widget.pypop_widget.pybase_widget.pydfm_assert.py \u65ad\u8a00\u8bed\u53e5\u547d\u540d\u89c4\u8303 \u65ad\u8a00\u8bed\u53e5\u90fd\u662f\u4ee5 assert \u5f00\u5934 \u65ad\u8a00 \u8bed\u53e5 \u5224\u65ad\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_existsassert_file_not_exists \u5224\u65ad\u684c\u9762\u76ee\u5f55\u4e0b\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_exists_in_desktopassert_file_not_exists_in_desktop \u5224\u65ad\u56fe\u7247\u5b58\u5728 assert_image_existsassert_image_not_exists \u5224\u65ad\u5f71\u9662\u4e2d\u662f\u5426\u5b58\u5728\u56fe\u7247 assert_image_exists_in_movieassert_image_not_exists_in_movie \u5224\u65ad\u5143\u7d20\u662f\u5426\u5b58\u5728 assert_element_existassert_element_not_exist \u5224\u65ad\u662f\u5426\u76f8\u7b49 assert_equalassert_not_equal \u5224\u65ad\u662f\u5426\u4e3a\u771f assert_trueassert_false"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5fixture","title":"5\u3001fixture \u89c4\u8303","text":"\u7531\u4e8e Pytest \u6846\u67b6\u4e2d\u652f\u6301 fixture \u7684\u5199\u6cd5\u548c Xunit \u5199\u6cd5\u7684\uff0c\u6240\u4ee5\u5e94\u7528\u5e93\u4e2d\u53ef\u80fd\u5b58\u5728\u6df7\u7528\u7684\u60c5\u51b5\uff0c\u4e3a\u7edf\u4e00\u7f16\u7801\u98ce\u683c\u65b9\u4fbf\u540e\u7eed\u7528\u4f8b\u4ee3\u7801\u7ef4\u62a4\uff0c\u73b0\u505a\u4ee5\u4e0b\u89c4\u8303\u8bf4\u660e\uff1a \u629b\u5f03 Xunit \u7684\u5199\u6cd5\uff0c\u7edf\u4e00\u91c7\u7528 Pytest fixture \u7684\u5199\u6cd5\u3002 \u5e94\u7528\u5185 fixture \u8c28\u614e\u4f7f\u7528 autouse=True \uff0c\u975e\u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u975e\u5e38\u4e0d\u5efa\u8bae\u4f7f\u7528\u8fd9\u4e2a\u53c2\u6570\u3002 \u8c03\u7528 fixture \u4e0d\u80fd\u4f7f\u7528 @pytest.mark.usefixture()\uff0c\u4f7f\u7528\u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u4f20\u5165\u51fd\u6570\u5bf9\u8c61\u3002 \u5efa\u8bae\u5728\u4e00\u4e2a conftest.py \u91cc\u9762\u53bb\u5199\uff0c\u4e00\u4e2a\u5e94\u7528\u4e5f\u5c3d\u91cf\u7ef4\u62a4\u4e00\u4e2a conftest.py\u6587\u4ef6\u3002 fixture \u4e5f\u9700\u8981\u5199\u529f\u80fd\u8bf4\u660e\uff0c\u51fd\u6570\u540d\u79f0\u8981\u6709\u5177\u4f53\u542b\u4e49\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#6","title":"6\u3001\u65b9\u6cd5\u7f16\u5199\u89c4\u8303","text":" \u65b9\u6cd5\u7c7b\u578b\uff1a if \u6ca1\u6709\u7528\u5230\u5b9e\u4f8b\u5bf9\u8c61\uff1a\nif \u6ca1\u6709\u7528\u5230\u7c7b\u5bf9\u8c61\uff1a\n\u5199\u9759\u6001\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @staticmethod\nelse\uff1a\n\u5199\u7c7b\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @classmethod\nelse:\n\u76f4\u63a5\u5199\u5b9e\u4f8b\u65b9\u6cd5\n \u4e3e\u4f8b: class TitleWidget:\ndef click_xxx_by_ui(self):\npass\n@staticmethod\ndef click_xxx_by_ui():\npass\n@classmethod\ndef click_xxx_by_ui(cls):\npass\n \u51fd\u6570\u540d\u79f0\u4e0d\u51fa\u73b0\u6570\u5b57\uff0c\u9700\u8981\u8868\u793a\u6570\u91cf\u7684\u7528\u5355\u8bcd\u8868\u793a\u3002 \u51fd\u6570\u529f\u80fd\u6ce8\u91ca\u3002 \u6ca1\u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg2:xxx\n\"\"\"\n \u6709\u53c2\u6570\uff0c\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg1:xxx\nreturn: xxx\n\"\"\"\n \u200b \u7528 Pycharm \u7684\u6ce8\u91ca\u6a21\u677f\u4e5f\u53ef\u4ee5\uff0c\u53ea\u8981\u4f53\u73b0\u4e86\u53c2\u6570\u7684\u7c7b\u578b\u548c\u8fd4\u56de\u5c31\u884c\u4e86\u3002 \u6682\u4e0d\u8981\u6c42\u5199\u7c7b\u578b\u6ce8\u89e3\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#7case","title":"7\u3001\u7528\u4f8b\uff08case\uff09\u89c4\u8303","text":" \u4ee5\u7c7b\u7684\u5f62\u5f0f\u5199\u7528\u4f8b\uff0c\u7528\u4f8b\u7c7b\u96c6\u6210\u7528\u4f8b\u57fa\u7c7b\u3002 \u7528\u4f8b\u7c7b\u9700\u8981\u5199\u6ce8\u91ca\u3002 \u6d4b\u8bd5\u7528\u4f8b\u51fd\u6570\u8bf4\u660e\uff08\u5efa\u8bae\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u540d\u79f0\uff09 \"\"\"\u53f3\u4fa7\u9884\u89c8-\u56fe\u7247\u7c7b\u578b\u4fe1\u606f\u680f\u57fa\u672c\u4fe1\u606f\"\"\"\n \u4e0d\u5199\u8c03\u8bd5\u4ee3\u7801 if __name__ == '__main__':\npytest.main()\n \u6240\u6709\u7528\u4f8b\u90fd\u7ee7\u627f BaseCase\u3002 BaseCase \u91cc\u9762\u653e\u4e00\u4e9b\u6d4b\u8bd5\u6570\u636e\u7684\u5e38\u91cf\uff0c\u6bd4\u5982\u6587\u4ef6\u540d\u79f0\uff0c\u5e94\u7528\u540d\u79f0\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u4e00\u4e9b\u901a\u7528\u7684\u5b57\u7b26\u4e32\u3002 \u8fd9\u7c7b\u662f\u5c5e\u4e8e\u6d4b\u8bd5\u6570\u636e\u3002 class BaseCase(DfmAssert):\n\"\"\"\u7528\u4f8b\u57fa\u7c7b\"\"\"\nNEW_FILE = \"\u65b0\u5efa\u6587\u672c.txt\"\nTEST_FILE = \"test.txt\"\nNEW_DIR = \"\u65b0\u5efa\u6587\u4ef6\u5939\"\nNEW_WORD = \"\u65b0\u5efaWord\u6587\u6863.doc\"\nAPP_HELP = \"damn\"\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\n\"\"\"\u7528\u4f8b\u6807\u9898\uff08\u590d\u5236PMS\u4e0a\u7528\u4f8b\u6807\u9898\uff09\"\"\"\ndfm = DfmWidget()\ndfm.click_xxx_by_attr(self.NEW_FILE)\ndfm.new_file_in_desktop_by_cmd(self.NEW_FILE)\nself.assert_true(dfm.get_process_status(self.APP_NAME))\n \u7528\u4f8b\u91cc\u9762\u5c3d\u91cf\u51cf\u5c11\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\uff0c\u66f4\u8981\u51cf\u5c11\u76f8\u540c\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\u3002 \u7edf\u4e00\u6587\u4ef6\u6ce8\u91ca\u5934\u3002 #!/usr/bin/env python3\n# _*_ coding:utf-8 _*_\n\"\"\"\n:Author:email@uniontech.com\n:Date :${DATE} ${TIME}\n\"\"\"\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#8","title":"8\u3001\u5176\u4ed6\u89c4\u8303","text":" \u65e5\u5fd7\u6253\u5370\u8981\u5728\u65b9\u6cd5\u6700\u524d\u9762\uff0c\u5426\u5219\u4ee3\u7801\u62a5\u9519\u6ca1\u6709\u65e5\u5fd7\u8f93\u51fa\uff0c\u4e0d\u597d\u5b9a\u4f4d\u95ee\u9898\u3002\uff08\u6211\u4eec\u4f1a\u8003\u8651\u7ee7\u7eed\u4f7f\u7528\u62e6\u622a\u5668\u6253\u5370\u65e5\u5fd7\uff09 \u6240\u6709\u7684\u64cd\u4f5c\u90fd\u9700\u8981\u6709\u65e5\u5fd7\uff0c\u5305\u62ec sleep()\uff0c\u6211\u4eec\u4f1a\u91cd\u5199\u4e00\u4e2a\u6709\u65e5\u5fd7\u8f93\u5165\u7684 sleep\u3002 \u4e1a\u52a1\u5c42\u65e5\u5fd7\u7ea7\u522b\u4e3a INFO\u3002 hook \u51fd\u6570\u53ea\u80fd\u5199\u5230\u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u91cc\u9762\u3002 apps \u76ee\u5f55\u4e0b\u7684 conftest.py \u539f\u5219\u4e0a\u4e0d\u4f1a\u65b0\u589e fixture\u3002 \u56fa\u5b9a\u76ee\u5f55\u6216\u5143\u7d20\u63a7\u4ef6\u7684\u64cd\u4f5c\uff0c\u5c06\u64cd\u4f5c\u65b9\u6cd5\u5199\u6b7b\uff0c\u6587\u4ef6\u7c7b\u64cd\u4f5c\u5c06\u6587\u4ef6\u540d\u7559\u53c2\u6570\u3002 \u8def\u5f84\u62fc\u63a5\u89c4\u8303\uff1a \u7cfb\u7edf\u4e2d\u56fa\u5b9a\u76ee\u5f55\uff0c\u8def\u5f84\u62fc\u63a5\u65f6\u4f7f\u7528\u6ce2\u6d6a\u7b26\u53f7\uff0c\u6bd4\u5982\uff1a~/Desktop/\uff0c\u4e0b\u5c42\u4f7f\u7528 os.path.expanduser()\uff0c\u5b83\u53ef\u4ee5\u81ea\u52a8\u8bc6\u522b\u6ce2\u6d6a\u7b26\u53f7\u3002 \u9879\u76ee\u4e0b\u8def\u5f84\u4f7f\u7528\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u8def\u5f84\uff0c\u6bd4\u5982\uff1aConfig.BASE_PATH\uff0c\u56e0\u4e3a\u9879\u76ee\u662f\u53ef\u4ee5\u5728\u4efb\u610f\u8def\u5f84\u8fd0\u884c\u7684\uff0c\u9700\u8981\u52a8\u6001\u62fc\u63a5\u8def\u5f84\u3002 "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848","text":"# =================================================\n# Author : Mikigo\n# Time : 2022/3/16\n# version \uff1a1.0\n# =================================================\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"AT \u5e94\u7528\u5e93\u6539\u9020\u662f\u57fa\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u8fdb\u884c\u7528\u4f8b\u65b9\u6cd5\u548c\u4e1a\u52a1\u903b\u8f91\u7684\u91cd\u65b0\u8bbe\u8ba1\uff0c\u4ee5\u5b9e\u73b0\u5e94\u7528\u5e93\u9ad8\u6548\u7684\u7f16\u5199\u3001\u7ef4\u62a4\u7528\u4f8b\u53ca\u5176\u65b9\u6cd5\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u6587\u4ef6\u7ba1\u7406\u5668\u4ece\u4e1a\u52a1\u590d\u6742\u5ea6\u548c\u7528\u4f8b\u91cf\u6765\u8bb2\uff0c\u5728\u7cfb\u7edf\u6240\u6709\u5e94\u7528\u4e2d\uff0c\u662f\u5f88\u6709\u4ee3\u8868\u6027\u7684\uff0c\u96be\u5ea6\u4e5f\u662f\u6700\u5927\u7684\uff0c\u56e0\u6b64\u6211\u4eec\u9009\u53d6\u6587\u4ef6\u7ba1\u7406\u5668\u4f5c\u4e3a\u5e94\u7528\u5e93\u6539\u9020\u7684\u5b9e\u9a8c\u5e94\u7528\uff0c\u7ed9\u540e\u7eed\u5176\u4ed6\u5e94\u7528\u6539\u9020\u63d0\u4f9b\u5207\u5b9e\u53ef\u884c\u7684\u601d\u8def\u548c\u65b9\u6848\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u5206\u5c42\u8bbe\u8ba1\u56fe","text":"\u6574\u4f53\u4ecd\u7136\u9075\u5faa PO \u8bbe\u8ba1\u7406\u5ff5\uff0c\u6839\u636e\u4e1a\u52a1\u9700\u8981\uff0c\u5c06\u6587\u7ba1\u4e1a\u52a1\u5c42\u8fdb\u884c 3 \u5c42\u5212\u5206\uff1a "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-dde-file-manager # \u5e94\u7528\u4ed3\u5e93\n\u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 test_xxx_001.py\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u00a0\u251c\u2500\u2500 __init__.py\n\u2502 \u00a0\u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u00a0\u251c\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u00a0\u251c\u2500\u2500 base_widget.py # \u65b9\u6cd5\u57fa\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 title_widget.py # title \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 right_view_widget.py # right view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 left_view_widget.py # left view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 pop_widget.py # pop \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 dfm_widget.py # \u65b9\u6cd5\u7684\u7edf\u4e00\u51fa\u53e3\n\u2502 \u00a0\u2514\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 tag # \u7528\u4f8b\u6807\u7b7e\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 xxx.csv # \u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2514\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u57fa\u7c7b","text":" \u7ee7\u627f\u6838\u5fc3\u5c42\u7684\u5404\u4e2a\u6a21\u5757\u7c7b\u3002 \u62bd\u53d6\u64cd\u4f5c\u5c42\u7684\u4e00\u4e9b\u57fa\u7840\u65b9\u6cd5\u3002 \u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u7684\u4e00\u4e9b\u516c\u5171\u65b9\u6cd5\u3002 \u8def\u5f84\u7ec4\u88c5\u65b9\u6cd5\u3002 \u4e00\u4e9b\u4e1a\u52a1\u5c42\u76f8\u5173\u7684\u53d8\u91cf\u3001\u5e38\u91cf\u3001shell\u547d\u4ee4\u3001\u5750\u6807\u3002 \u65b9\u6cd5\u57fa\u7c7b\u7684\u5199\u6cd5\uff1a from src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u64cd\u4f5c\u5c42","text":" \u6a21\u5757\u5212\u5206 \u6309\u7167\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u6587\u7ba1\u4e3b\u754c\u9762\u5206\u4e3a\u4e09\u4e2a\u533a\u57df\uff1a\u6807\u9898\u680f\u3001\u53f3\u8fb9\u89c6\u56fe\u533a\u57df\u3001\u5de6\u8fb9\u89c6\u56fe\u533a\u57df \u5f39\u7a97\uff1a\u8bbe\u7f6e\u754c\u9762\u5f39\u7a97\u3001\u4fdd\u9669\u7bb1\u5f39\u7a97\u3001\u5220\u9664\u786e\u8ba4\u5f39\u7a97\u3001\u53ca\u5404\u79cd\u7f51\u7edc\u5f39\u7a97 \u53f3\u952e\u83dc\u5355\uff1a\u6682\u65f6\u4e0d\u8003\u8651\u4e3a\u5355\u72ec\u7684\u6a21\u5757\uff0c\u8003\u8651\u4ee5\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6848\u505a\u6210\u516c\u5171\u5e93\u3002 \u5404\u4e2a\u6a21\u5757\u53ea\u7ee7\u627f\u57fa\u7c7b from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u6784\u9020\u51fd\u6570\u91cc\u9762\u4e0d\u6784\u9020\u5bf9\u8c61\uff0c\u53ef\u4ee5\u521d\u59cb\u5316\u4e00\u4e9b\u53d8\u91cf\u3002 \u4e0d\u540c\u7684\u5b9a\u4f4d\u65b9\u6848\u8c03\u7528\u4e0d\u540c\u7684\u5b9a\u4f4d\u5de5\u5177\u5bf9\u8c61\u3002 self.dog\nself.ui\nself.d_bus\n \u65b9\u6cd5\u7f16\u5199 \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u5e94\u7528\u5c42","text":" \u7ee7\u627f\u64cd\u4f5c\u5c42\u7684\u6240\u6709\u7c7b\u3002 \u4ec5\u4ec5\u7528\u4e8e\u7528\u4f8b\u4e2d\u5bfc\u5165\u65b9\u4fbf\uff0c\u4e0d\u505a\u5176\u4ed6\u4e8b\u60c5\u3002 class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n DfmAssert \u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u7ee7\u627f\uff0c\u65b9\u4fbf\u4f7f\u7528\u65ad\u8a00\u8bed\u53e5\u3002 from apps.dde_file_manager.widget.dfm_widget import DfmWidget\nfrom public.assert import Assert\nclass DfmAssert(Assert):\ndef assert_file_exists_in_desktop(self, file_name):\nself.assert_file_exists(f\"~/Desktop{file_name}\")\n...\nDfmWidget().get_file_in_desktop()\n \u7528\u4f8b\u91cc\u9762\u76f4\u63a5\u7ee7\u627f\uff0c\u65b9\u4fbf\u5728\u7528\u4f8b\u91cc\u9762\u4f7f\u7528 self \u8fdb\u884c\u65ad\u8a00\uff0c\u66f4\u7b26\u5408\u65ad\u8a00\u7684\u4f7f\u7528\u4e60\u60ef\uff0c\u7528\u4f8b\u903b\u8f91\u4e0a\u66f4\u6e05\u695a\u3002 class BaseCase(DfmAssert):\npass\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\nself.assert_file_exists_in_desktop(\"xxx\")\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u903b\u8f91\u4e3e\u4f8b","text":"\u7528\u4f8b\u4ee3\u7801\u8c03\u7528\u903b\u8f91\u4e3e\u4f8b\uff1a # BaseWidget\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n# =============================================\n# TitleWidget\nclass TitleWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_title_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# RightViewWidget\nclass RightViewWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_right_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# =============================================\n# \u51fa\u53e3 DfmWidget\nclass DfmWidget(TitleWidget, RightViewWidget):\npass\n# =============================================\n# in case\nfrom apps.dde_file_manager.widget.dfm_widget import DfmWidget\ndfm = DfmWidget()\ndfm.click_xxx_title_by_ui()\ndfm.click_xxx_right_by_ui()\ndfm.dog.print_desc()\ndfm.ui.print_number()\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u5de5\u7a0b\u6539\u9020\u5b9e\u65bd\u6b65\u9aa4","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_2","title":"1\u3001\u5de5\u7a0b\u4ee3\u7801\u62c9\u53d6","text":"1.1. \u5c06\u81ea\u52a8\u5316\u57fa\u7840\u6846\u67b6\u7684\u529f\u80fd\u62c9\u5230\u672c\u5730 Autotest Basic Frame \uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame 1.2. \u5c06\u5e94\u7528\u5e93\u4ee3\u7801\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u5e94\u7528\u5e93\u7684\u4ed3\u5e93\u547d\u540d\u5e94\u8be5\u662f\u957f\u8fd9\u6837\u7684 autotest_deepin_xxx\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_2","title":"2\u3001\u8c03\u6574\u5de5\u7a0b\u76ee\u5f55","text":"\u6309\u7167 \u65b9\u6848\u8bbe\u8ba1-\u76ee\u5f55\u7ed3\u6784 \u8fdb\u884c\u76ee\u5f55\u8c03\u6574\uff0c\u5c3d\u91cf\u4f7f\u7528\u7f16\u8f91\u5668\u8fdb\u884c\u76f8\u5e94\u7684\u8c03\u6574\uff0c\u7f16\u8f91\u5668\u63a8\u8350\u4f7f\u7528 Pycharm \uff0c\u4ee5\u4e0b\u64cd\u4f5c\u5747\u5728 Pycharm \u91cc\u9762\u53ef\u5b9e\u73b0\u3002 2.1. \u9700\u8981\u79fb\u52a8 py \u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u76f4\u63a5\u5728\u7f16\u8f91\u5668\u91cc\u9762\uff0c\u4f7f\u7528\u9f20\u6807\u9009\u4e2d\u5e76\u6309\u4f4f\uff0c\u4e4b\u540e\u62d6\u52a8\u5230\u76ee\u6807\u4f4d\u7f6e\u5373\u53ef\uff0cPycharm \u4f1a\u5c3d\u53ef\u80fd\u7684\u81ea\u52a8\u89e3\u51b3\u79fb\u52a8\u5bfc\u81f4\u7684\u8def\u5f84\u95ee\u9898\u3002\u6ce8\u610f\uff0c\u6211\u8bf4\u7684\u662f\u201c\u5c3d\u53ef\u80fd\u201d\uff0c\u6709\u4e9b\u9a9a\u64cd\u4f5c\u7f16\u8f91\u5668\u662f\u65e0\u6cd5\u81ea\u52a8\u5904\u7406\u7684\u3002\u5982\u679c\u6ca1\u6709\u88ab\u7f16\u8f91\u5668\u81ea\u52a8\u5904\u7406\u7684\u8def\u5f84\u95ee\u9898\uff0c\u540e\u7eed\u53ea\u80fd\u624b\u52a8\u89e3\u51b3\u3002 2.2. \u9700\u8981\u91cd\u547d\u540d\u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u5728\u7f16\u8f91\u5668\u91cc\u9762\u9009\u4e2d\u6587\u4ef6\uff0c\u7136\u540e\u4f7f\u7528\u5feb\u6377\u952e Shift + F6 \uff08\u5982\u679c\u5feb\u6377\u952e\u6ca1\u53cd\u5e94\uff0c\u6587\u4ef6\u53f3\u952e\u83dc\u5355 Refactor \u2014\u2014 Rename\uff09\uff0c\u7136\u540e\u5728\u8f93\u5165\u6846\u4e2d\u8f93\u5165\u8981\u91cd\u547d\u540d\u7684\u540d\u79f0\uff0c\u540c\u65f6\uff0c\u786e\u8ba4\u52fe\u9009 Search for references \u548c Search in comments and strings \u8fd9\u4e24\u4e2a\u9009\u9879\uff0c\u6700\u540e\u6309\u56de\u8f66\u6216\u8005\u9f20\u6807\u70b9 Refactor \u3002 \u6ce8\u610f\uff0c\u6b64\u65f6\u7f16\u8f91\u5668\u53ef\u80fd\u4f1a\u63d0\u793a\u4f60\uff0c\u4f60\u8fd9\u4e2a\u91cd\u547d\u540d\u7684\u64cd\u4f5c\u5173\u8054\u4e86\u591a\u4e2a\u6a21\u5757\uff0c\u5b83\u88ab\u591a\u4e2a\u5730\u65b9\u90fd\u4f7f\u7528\u5230\u4e86\uff0c\u76f8\u5173\u7684\u6a21\u5757\u662f\u5426\u4e5f\u4e00\u8d77\u6539\u540d\u4e86\uff0c\u8fd9\u4e0d\u5e9f\u8bdd\u5417\uff0c\u7528\u8fd9\u4e2a\u529f\u80fd\u5c31\u662f\u60f3\u628a\u5173\u8054\u5230\u7684\u90fd\u4fee\u6539\uff0c\u4e0d\u7136\u6211\u4e3a\u4ec0\u4e48\u4e0d\u7528\u6587\u7ba1\u7684\u91cd\u547d\u540d\u529f\u80fd\u5462\uff0c\u522b\u60f3\u4e86\uff0c\u76f4\u63a5\u70b9\u5de6\u4e0b\u89d2\u7684 Refactor \u6309\u94ae\uff0c\u5c31\u662f\u5e72\u3002 \u7c7b\u540d\u3001\u51fd\u6570\u540d\u7684\u91cd\u547d\u540d\u90fd\u5c3d\u91cf\u91c7\u7528\u8fd9\u79cd\u65b9\u6848\uff0c\u56e0\u4e3a\u7f16\u8f91\u5668\u4f1a\u81ea\u52a8\u7ed9\u6211\u4eec\u627e\u5230\u5173\u8054\u7684\u5730\u65b9\uff0c\u7136\u540e\u540c\u6b65\u4fee\u6539\u6389\u3002\u4f60\u53ef\u5343\u4e07\u522b\u76f4\u63a5\u5220\u4e86\u4fee\u6539\u540d\u79f0\uff0c\u4e0d\u7136\u4f60\u53ef\u80fd\u4f1a\u82b1\u4e0a\u4e00\u5929\u7684\u65f6\u95f4\u6765\u89e3\u51b3\u91cd\u547d\u540d\u7684\u95ee\u9898\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u5b9e\u73b0\u6838\u5fc3\u5e93\u63a5\u53e3","text":"3.1. BaseWidget \u5728 BaseWidget \u91cc\u9762\u628a\u8be5\u5199\u7684\u90fd\u5199\u597d\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u4e0a\u9762\u7684\u8bbe\u8ba1\u7406\u5ff5\u6765\u5199\u3002 \u5982\u679c\u4f60\u5acc\u9ebb\u70e6\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u6587\u7ba1\u7684\u5b9e\u9645\u5de5\u7a0b\u4ee3\u7801 autotest_dde_file_manager : https://gerrit.uniontech.com/admin/repos/autotest_dde_file_manager \u3002 3.2. \u64cd\u4f5c\u5c42 \u5982\u679c\u4f60\u662f\u65b0\u5199\u9879\u76ee\uff0c\u4f60\u4f1a\u53d1\u73b0\u4e00\u5207\u90fd\u662f\u90a3\u4e48\u7684\u7b80\u5355\u3001\u76f4\u63a5\uff0c\u6309\u7167\u6211\u4eec\u63d0\u4f9b\u7ed9\u4f60\u7684\u63a5\u53e3\u5199\u7528\u4f8b\u7684\u64cd\u4f5c\u65b9\u6cd5\u5c31\u597d\u4e86\u3002 \u5982\u679c\u4f60\u662f\u60f3\u5bf9\u539f\u6765\u7684\u5de5\u7a0b\u8fdb\u884c\u6539\u9020\uff0c\u4f60\u9700\u8981\u6309\u7167\u6838\u5fc3\u5e93\u65b9\u6cd5\u7684\u8c03\u7528\uff0c\u5c06\u4f60\u4e4b\u524d\u5199\u7684\u6bcf\u4e2a\u65b9\u6848\u8fdb\u884c\u5bf9\u5e94\u7684\u4fee\u6539\uff0c\u5305\u62ec\u7c7b\u548c\u65b9\u6cd5\u7684\u547d\u540d\u3001\u65b9\u6cd5\u5185\u6240\u8981\u7528\u5230\u4e0d\u540c\u5b9a\u4f4d\u65b9\u6cd5\u7684\u5199\u6cd5\u4fee\u6539\u3002 \u8fd9\u65f6\u5019\u4f60\u53ef\u80fd\u4f60\u7684\u4ee3\u7801\u4e2d\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u62a5\u9519\uff0c\u4e0d\u7528\u62c5\u5fc3\uff0c\u4f60\u53ef\u4ee5\u4ece\u4e1a\u52a1\u903b\u8f91\u51fa\u53d1\uff0c\u60f3\u6e05\u695a\u8fd9\u4e2a\u65b9\u6cd5\u662f\u5e72\u4ec0\u4e48\u7684\u3001\u64cd\u4f5c\u7684\u5bf9\u8c61\u662f\u4ec0\u4e48\u3001\u53c2\u6570\u662f\u4ec0\u4e48\uff0c\u6ce8\u610f\u8fd9\u4e9b\u4fee\u6539\u662f\u4f1a\u5f71\u54cd\u5230\u7528\u4f8b\u4ee3\u7801\u91cc\u9762\u7684\uff0c\u6ca1\u5173\u7cfb\uff0c\u7528\u4f8b\u91cc\u9762\u672c\u6765\u4e5f\u5e94\u8be5\u88ab\u5173\u8054\u4fee\u6539\u3002 3.3. \u628a\u914d\u7f6e\u6a21\u5757\u5199\u597d\uff0c\u8fd9\u90e8\u5206\u57fa\u672c\u53ef\u4ee5\u590d\u5236\u6587\u7ba1\u7684\u4ee3\u7801\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4_1","title":"4\u3001\u8def\u5f84\u5904\u7406","text":"4.1. \u5bfc\u5165\u8def\u5f84 \u65b9\u6cd5\u548c\u7528\u4f8b\u4e2d\u90fd\u4f1a\u6d89\u53ca\u5230\u5bfc\u5165\u8def\u5f84\u7684\u4fee\u6539\uff0c\u5728\u4fee\u6539\u8def\u5f84\u65f6\uff0c\u5efa\u8bae\u4f60\u4f7f\u7528 Ctrl + Shift + R \u5168\u5c40\u66ff\u6362\uff0c\u4f1a\u5c06\u6574\u4e2a\u9879\u76ee\u4e0b\u7684\u76f8\u540c\u5730\u65b9\u90fd\u4fee\u6539\u5230\uff0c\u5f53\u7136\uff0c\u4f60\u4e5f\u53ef\u4ee5\u5728\u5c0f\u5f39\u7a97\u4e2d\u4fee\u6539\u5168\u5c40\u66ff\u6362\u4e3a\u5c40\u90e8\u76ee\u5f55\u4e0b\u66ff\u6362\u3002\u5904\u7406\u90a3\u79cd\u6ca1\u6709\u5173\u8054\u5173\u7cfb\uff0c\u4f46\u662f\u53c8\u662f\u76f8\u540c\u540d\u79f0\u7684\u91cd\u547d\u540d\uff0c\u6211\u4e5f\u63a8\u8350\u4f7f\u7528\u8fd9\u79cd\u65b9\u5f0f\u8fdb\u884c\u91cd\u547d\u540d\u3002 \u6ce8\u610f\uff0c\u5168\u5c40\u66ff\u6362\u7684\u65b9\u5f0f\u4efb\u7136\u65e0\u6cd5\u4fdd\u8bc1\u771f\u7684\u5168\u5c40\u88ab\u66ff\u6362\u4e86\uff08\u53ef\u80fd\u662f\u7f16\u8f91\u5668\u7684 Bug \u5427\uff09\uff0c\u6240\u4ee5\u4f60\u4ecd\u7136\u9700\u8981\u624b\u52a8\u770b\u4e0b\u5404\u5904\u662f\u5426\u4fee\u6539\u5230\u4f4d\u3002 4.2. \u8d44\u6e90\u8def\u5f84 \u4e00\u4e9b\u7528\u4f8b\u8d44\u6e90\u9700\u8981\u6839\u636e config.py \u91cc\u9762\u7684\u8def\u5f84\u914d\u7f6e\u8fdb\u884c\u8d44\u6e90\u8def\u5f84\u7684\u62fc\u63a5\uff0c\u5982\u679c\u4f60\u539f\u6765\u672c\u6765\u5c31\u6709\u4e00\u4e2a\u51fd\u6570\u4e13\u95e8\u7528\u4e8e\u7ec4\u88c5\u8def\u5f84\u7684\uff0c\u90a3\u4f60\u53ea\u9700\u8981\u4fee\u6539\u8fd9\u4e00\u4e2a\u5730\u65b9\u5c31\u597d\u4e86\uff0c\u5982\u679c\u4f60\u4e4b\u524d\u5e76\u6ca1\u6709\u8fd9\u6837\u7684\u8bbe\u8ba1\uff0c\u90a3\u53ef\u80fd\u9700\u8981\u4fee\u6539\u5927\u91cf\u6d89\u53ca\u5230\u8d44\u6e90\u8def\u5f84\u7684\u5730\u65b9\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5","title":"5\u3001\u8c03\u8bd5\u548c\u7f16\u5199\u7528\u4f8b","text":"\u4ee5\u4e0a\u51e0\u4e2a\u6b65\u9aa4\u505a\u5b8c\uff0c\u57fa\u672c\u5c31\u53ef\u4ee5\u8fdb\u884c\u7528\u4f8b\u4ee3\u7801\u7684\u8c03\u8bd5\u4e86\uff0c\u8fd9\u90e8\u5206\u5de5\u4f5c\u4e3b\u8981\u89e3\u51b3\u4f60\u4e4b\u524d\u51e0\u4e2a\u6b65\u9aa4\u9057\u6f0f\u7684\u95ee\u9898\uff0c\u5982\u679c\u6240\u6709\u7528\u4f8b\u90fd\u8c03\u8bd5\u901a\u8fc7\u4e86\uff0c\u90a3\u4e48\u5de5\u7a0b\u6539\u9020\u5c31\u5168\u90e8\u5b8c\u6210\u4e86\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/","title":"AT \u5f00\u53d1\u89c4\u8303","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u5f00\u53d1\u89c4\u8303\u662f\u6839\u636e\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fd0\u884c\u4e24\u5e74\u591a\u6765\uff0c\u9047\u5230\u95ee\u9898\u89e3\u51b3\u95ee\u9898\u800c\u5f62\u6210\u7684\u4e00\u4e9b\u89e3\u51b3\u65b9\u6848\uff0c\u6216\u8005\u8bf4\u7ecf\u9a8c\u603b\u7ed3\uff1b\u8fd9\u4e9b\u7ecf\u9a8c\u7b26\u5408\u6211\u4eec\u73b0\u9636\u6bb5 AT \u6240\u5e94\u7528\u7684\u573a\u666f\u9700\u8981\uff0c\u4e5f\u662f\u6211\u4eec\u7ecf\u8fc7\u957f\u671f\u601d\u8003\uff0c\u4e0d\u65ad\u8bd5\u9519\u4e0d\u65ad\u4fee\u6b63\uff0c\u5e76\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u5b9e\u8df5\u4e2d\u68c0\u9a8c\u8fc7\u53ef\u884c\u7684\u3002\u4ee5\u6b64\uff0c\u5e0c\u671b\u80fd\u5e2e\u52a9\u53c2\u4e0e\u5230\u81ea\u52a8\u5316\u7684\u76f8\u5173\u4eba\u5458\u51cf\u5c11\u8bd5\u9519\u6210\u672c\uff0c\u66f4\u597d\u3001\u66f4\u5feb\u7684\u7f16\u5199\u7528\u4f8b\u53ca\u7ef4\u62a4\u7528\u4f8b\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_1","title":"\u4e00\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u89c4\u8303","text":"\u6807\u7b7e\u5316\u7ba1\u7406\u6587\u6863\u8bf7\u53c2\u8003\uff1a \u300a\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u64cd\u4f5c\u6307\u5f15\u300b \u4ee5\u4e0b\u8bf4\u51e0\u4e2a\u5bb9\u6613\u51fa\u73b0\u7684\u95ee\u9898\uff1a"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1","title":"1. \u5bf9\u5e94\u5173\u7cfb","text":" \u5199\u5b8c\u81ea\u52a8\u5316\u7528\u4f8b\u4e4b\u540e\uff0c\u8bf7\u5728 CSV \u6587\u4ef6\u4e2d\u6807\u8bb0\u7528\u4f8b\u7684 ID\u3001\u7b49\u7ea7\u3002\u4e3a\u4e86\u63d0\u9192\u6807\u8bb0\uff0c\u6267\u884c\u7528\u4f8b\u65f6\u5728\u9996\u884c\u4f1a\u8f93\u51fa ERROR \u65e5\u5fd7\uff1a CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94\u7684 ID\uff1b \u5728\u6700\u7ec8\u63d0\u4ea4\u4ee3\u7801\u4e4b\u524d\uff0c\u4f60\u9700\u8981\u5728 CSV \u6587\u4ef6\u91cc\u9762\u5c06ID\u3001\u7528\u4f8b\u7b49\u7ea7\u7b49\u6807\u7b7e\u8865\u5168\uff0c\u5982\u679c CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94 ID\uff0c\u540e\u7eed\u5728\u6279\u91cf\u6267\u884c\u7684\u65f6\u5019\uff0c\u8fd9\u4e9b\u7528\u4f8b\u662f\u4e0d\u4f1a\u6267\u884c\u7684\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2","title":"2. \u540d\u79f0\u4e00\u81f4","text":" CSV \u6587\u4ef6\u7684\u6587\u4ef6\u540d\u3001\u7528\u4f8b\u51fd\u6570\u4e2d\u95f4\u7684\u540d\u79f0\u4e00\u81f4\u3001\u7528\u4f8b py \u6587\u4ef6\u4e2d\u95f4\u7684\u540d\u79f0\uff0c\u8fd9\u4e09\u4e2a\u540d\u79f0\u4e00\u81f4\u3002 \u4e3e\u4f8b\uff1a # test_music_001.py\ndef test_music_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u90a3\u4e48 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e3a music.csv\u3002 AT \u6846\u67b6\u5e95\u5c42\u4ee3\u7801\u5b9e\u73b0\u662f\u5c06 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e0e\u7528\u4f8b\u51fd\u6570\u540d\u79f0\u540d\u79f0\uff08item.name\uff09\u8fdb\u884c\u5bf9\u5e94\uff0c\u56e0\u6b64\uff0c\u6ce8\u610f CSV \u6587\u4ef6\u540d\u79f0\u5bf9\u5e94\u7684\u662f\u7528\u4f8b\u51fd\u6570\u540d\u79f0\uff0c\u5373 def test_music_001 \u91cc\u9762\u7684 music \uff0c\u800c\u4e0d\u662f test_music_001.py \u91cc\u9762\u7684 music \u3002 \u8fd9\u91cc\u7ec6\u7ec6\u54c1\u4e00\u4e0b\u54c8~ \u5982\u679c\u4f60\u5c06\u4e0a\u4f8b\u5199\u6210\u4e86\u8fd9\u6837: # test_music_001.py\ndef test_movie_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u7528\u4f8b\u6267\u884c\u6ca1\u95ee\u9898\uff0c\u4f46\u662f\u6807\u7b7e\u5316\u7ba1\u7406\u662f\u4e0d\u751f\u6548\u7684\uff0c\u6846\u67b6\u65e0\u6cd5\u5c06 music.csv\u6587\u4ef6\u91cc\u9762\u6807\u7b7e\uff0c\u6dfb\u52a0\u5230 test_movie_001\u8fd9\u4e2a\u7528\u4f8b\u4e2d\uff0c\u56e0\u4e3a\u4ed6\u4eec\u6ca1\u6709\u5bf9\u5e94\u5173\u7cfb\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#tag","title":"\u4e8c\u3001\u5206\u652f\u53ca tag \u7ba1\u7406\u89c4\u8303","text":"\u53c2\u8003\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u4ee3\u7801\u7ba1\u7406\u89c4\u8303\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2-tag","title":"2. \u5e94\u7528\u5e93 tag","text":" \u5e94\u7528\u5e93 tag \u6839\u636e\u5e94\u7528\u4ea4\u4ed8\u8282\u70b9\u751f\u6210\uff0c\u6bcf\u6b21\u6253 tag \u4e4b\u524d\uff0c\u76f8\u5173\u6d4b\u8bd5\u4eba\u5458\u9700\u8981\u8fdb\u884c\u7528\u4f8b\u8c03\u8bd5\uff1b \u8c03\u8bd5\u7528\u4f8b\u662f\u6307\u7684\u5728\u5168\u67b6\u6784\uff08x86\u3001arm\u3001mips\uff09\u4e0a\u8c03\u8bd5\u901a\u8fc7\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\u8fbe\u5230 90% \u4ee5\u4e0a\u624d\u80fd\u6253 tag\uff0c\u901a\u8fc7 Jenkins \u6267\u884c\u5668\u6267\u884c\u7528\u4f8b\uff0c\u4fdd\u7559\u901a\u8fc7\u7387\u7ed3\u679c\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\uff1a\u901a\u8fc7\u7528\u4f8b\u6570 / (\u603b\u7528\u4f8b\u6570 - \u5df2\u5e9f\u5f03\u7528\u4f8b) \u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u7b97\u901a\u8fc7 Jenkins \u6267\u884c\u5668 \u4f60\u53ef\u80fd\u4f1a\u5728\u4e00\u4e2a\u4ea4\u4ed8\u5468\u671f\u5185\u6301\u7eed\u7684\u8fdb\u884cAT\u7528\u4f8b\u8c03\u8bd5\uff0c\u4f46\u662f\u6700\u7ec8 AT \u7528\u4f8b\u6253 tag \u7684\u5e94\u7528\u7248\u672c\uff0c\u9700\u8981\u4f7f\u7528\u5e94\u7528\u96c6\u6210\u4ea4\u4ed8\u7684\u6700\u65b0\u5e94\u7528\u7248\u672c\uff0c\u53ef\u4ee5\u4f7f\u7528\u5e94\u7528\u7684\u63d0\u6d4b\u7248\u672c\uff1b\u4e00\u5b9a\u8981\u786e\u4fdd\u8c03\u8bd5\u7528\u4f8b\u7684\u5e94\u7528\u7248\u672c\u662f\u6700\u65b0\u7684\uff0c\u4e0d\u7136\u96c6\u6210\u8fdb\u53bb\u4e4b\u540e\uff0c\u6301\u7eed\u96c6\u6210\u5c31\u4f1a\u51fa\u95ee\u9898\uff1b tag \u53f7\u600e\u4e48\u6253\uff1f \u6839\u636e\u6301\u7eed\u96c6\u6210\u7684\u8981\u6c42\u751f\u6210\uff0c\u5176\u4e2d\u5e94\u7528\u7248\u672c\u53f7\u9700\u8981\u4e0e\u9879\u76ee\u7ecf\u7406\u786e\u8ba4\u672c\u6b21\u5373\u5c06\u96c6\u6210\u7684\u5e94\u7528\u7248\u672c\u53f7\u662f\u591a\u5c11\uff1b tag \u7684 commit \u4fe1\u606f\u683c\u5f0f\uff1a # commit msg\nversion:5.6.5\n \u5176\u4e2d 5.6.5 \u5199\u5e94\u7528\u7684\u96c6\u6210\u7248\u672c\u53f7\u3002 \u751f\u6210 tag \u7684\u547d\u4ee4\u53c2\u8003\uff1a\u300aGit \u6807\u7b7e\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3-tag","title":"3. \u57fa\u7840\u6846\u67b6 tag","text":"\u57fa\u7840\u6846\u67b6 tag \u4e0d\u4e0e\u4e1a\u52a1\u6302\u94a9\uff0c\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u6309\u9700\u53d1\u5e03\u7248\u672c\uff0c\u5728\u6839\u76ee\u5f55\u4e0b CURRENT \u6587\u4ef6\u4e2d\u8bb0\u5f55\u7684\u5f53\u524d\u7248\u672c\u53f7\u548c\u5386\u53f2\u7248\u672c\u53f7\uff0c\u53ca\u5176\u5bf9\u5e94\u65b0\u589e\u4e86\u54ea\u4e9b\u529f\u80fd\uff0c\u6709\u52a9\u4e8e\u5e94\u7528\u9009\u62e9\u5408\u9002\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\u3002 # CURRENT\n[current]\ntag = 0.9.5\n \u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u7684 control \u6587\u4ef6\u8bb0\u5f55\u5f53\u524d\u5e94\u7528\u5e93\u4f9d\u8d56\u7684\u57fa\u7840\u5e93\u7248\u672c\u3002 # control\n[Depends]\nautotest-basic-frame = 0.9.5\n \u7528\u4f8b\u5728\u6267\u884c\u65f6\u4f1a\u6821\u9a8c\u4e24\u4e2a\u6587\u4ef6\u7684\u7248\u672c\u53f7\u662f\u5426\u4e00\u81f4\uff0c\u5982\u679c\u4e0d\u4e00\u81f4\uff0c\u4f1a\u6253\u5370 error \u65e5\u5fd7\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_2","title":"\u4e09\u3001\u4ed3\u5e93\u6743\u9650\u7ba1\u7406","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_1","title":"1. \u57fa\u7840\u6846\u67b6","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u4ed3\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame \u57fa\u7840\u6846\u67b6\u4e0d\u5141\u8bb8\u533f\u540d\u8bbf\u95ee\uff0c\u5982\u679c\u4f60\u767b\u5f55 gerrit \u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u8bbf\u95ee\u4ee5\u4e0a\u94fe\u63a5\uff0c\u5219\u9700\u8981\u7533\u8bf7\u8bbf\u95ee\u6743\u9650\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_1","title":"2. \u5e94\u7528\u4ed3\u5e93","text":" \u81ea\u52a8\u5316\u5e94\u7528\u4ed3\u5e93\uff1a https://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684 app_name \u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_3","title":"\u56db\u3001\u65b9\u6cd5\u7f16\u5199&\u8c03\u7528\u89c4\u8303","text":"\u65b9\u6cd5\u7f16\u5199\u6574\u4f53\u8bbe\u8ba1\u601d\u8def\u53c2\u8003\uff1a[\u300aAT\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b]"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_2","title":"1. \u65b9\u6cd5\u7f16\u5199","text":"\u5199\u65b9\u6cd5\u7684\u65f6\u5019\u6ce8\u610f\u65b9\u6cd5\u5f52\u5c5e\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget\uff0c\u65b9\u6cd5\u662f\u5728\u54ea\u4e2a\u533a\u57df\u64cd\u4f5c\u7684\uff0c\u5c31\u5199\u5728\u54ea\u4e2a\u7c7b\u91cc\u9762\u3002 \u4e3e\u4f8b\uff1a from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n\"\"\"\u70b9\u51fb\u6807\u9898\u680fxxx\"\"\"\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_2","title":"2. \u65b9\u6cd5\u8c03\u7528","text":" \u5728\u7528\u4f8b\u4e2d\u8c03\u7528\u65b9\u6cd5\uff0c\u901a\u8fc7\u8be5\u5e94\u7528\u552f\u4e00\u7684\u51fa\u53e3\u8fdb\u884c\u8c03\u7528\uff0c\u6bd4\u5982\u6587\u7ba1\uff1a class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n \u4e0d\u8981\u5728\u7528\u4f8b\u4e2d\u5355\u72ec\u53bb\u8c03\u7528 TitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u8fd9\u4e9b\u7c7b\uff0c\u5426\u5219\u540e\u671f\u7528\u4f8b\u4f1a\u53d8\u5f97\u4e0d\u597d\u7ef4\u62a4\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_4","title":"\u4e94\u3001\u7528\u4f8b\u7f16\u5199\u89c4\u8303","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_3","title":"1. \u57fa\u4e8e\u7c7b\u5199\u7528\u4f8b","text":"\u6240\u6709\u7528\u4f8b\u90fd\u5e94\u8be5\u57fa\u4e8e\u7c7b\u53bb\u5199\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001(self):\n\"\"\"\u97f3\u4e50\u542f\u52a8\"\"\"\n \u6ce8\u610f\u4ee5\u4e0b\u51e0\u70b9\uff1a \u7c7b\u540d\u4e0d\u8981\u968f\u4fbf\u53d6\uff0c\u540c\u4e00\u4e2a\u5e94\u7528\u5e94\u8be5\u4f7f\u7528\u540c\u4e00\u4e2a\u7c7b\u540d\uff0c\u7528\u4f8b\u7c7b\u540d\u79f0\u5fc5\u987b\u4ee5 Test \u5f00\u5934\uff0c\u9075\u5faa\u5927\u9a7c\u5cf0\u547d\u540d\u89c4\u8303\uff1b \u7528\u4f8b\u7c7b\u7ee7\u627f BaseCase\uff0c\u4e00\u4e2a\u5e94\u7528\u53ea\u6709\u4e00\u4e2a BaseCase \u4e00\u4e2a py \u6587\u4ef6\u91cc\u9762\u53ea\u6709\u4e00\u4e2a\u7c7b\uff0c\u6211\u4eec\u79f0\u4e3a\u4e00\u4e2a\u6d4b\u8bd5\u7c7b\uff1b \u4e00\u4e2a\u7c7b\u91cc\u9762\u53ef\u4ee5\u6709\u591a\u4e2a\u7528\u4f8b\u51fd\u6570\uff0c\u8fd9\u53d6\u51b3\u8fd9\u6761\u7528\u4f8b\u6709\u591a\u5c11\u4e2a\u6d4b\u8bd5\u70b9\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001_1(self):\n\"\"\"\u4efb\u52a1\u680f\u542f\u52a8\u97f3\u4e50\"\"\"\ndef test_music_001_2(self):\n\"\"\"\u542f\u52a8\u5668\u542f\u52a8\u97f3\u4e50\"\"\" \ndef test_music_001_3(self):\n\"\"\"\u684c\u9762\u542f\u52a8\u97f3\u4e50\"\"\"\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_3","title":"2. \u7528\u4f8b\u51fd\u6570\u89c4\u8303","text":" \u7528\u4f8b\u51fd\u6570\u4ee5 test \u5f00\u5934\uff0c\u9075\u5faa\u86c7\u5f62\u547d\u540d\u89c4\u8303\uff0c\u4e2d\u95f4\u4e3a\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0\uff0c\u540e\u9762\u52a0\u7528\u4f8b ID\uff0c\u6700\u540e\u52a0\u6d4b\u8bd5\u70b9\u5e8f\u53f7\uff0c\u5373 test_${module}_${case_id}[_${index}] \uff1b \u6bd4\u5982\uff1atest_music_001_1\uff0cindex \u4ece 1 \u5f00\u59cb\u3002 \u51fd\u6570\u529f\u80fd\u8bf4\u660e\u91cc\u9762\u5199\u7528\u4f8b\u6807\u9898\uff0c\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u6807\u9898\u5373\u53ef\uff0c\u6ce8\u610f\u7528\u4e09\u5bf9\u53cc\u5f15\u53f7\uff0c\u4e0d\u8981\u7528\u5176\u4ed6\u6ce8\u91ca\uff0c\u66f4\u4e0d\u8981\u7528\u4e95\u53f7\u6ce8\u91ca\u5199\u7528\u4f8b\u6807\u9898\uff1b \u76f4\u63a5\u590d\u5236 PMS \u7528\u4f8b \u7528\u4f8b\u6b65\u9aa4\u76f4\u63a5\u5c06 PMS \u4e0a\u7528\u4f8b\u6b65\u9aa4\u548c\u9884\u671f\u590d\u5236\u8fdb\u6765\uff0c\u7136\u540e\u8fdb\u884c\u6279\u91cf\u6ce8\u91ca\uff08ctrl + /\uff09\uff0c\u5728\u6ce8\u91ca\u7684\u57fa\u7840\u4e0a\u53bb\u5199\u7528\u4f8b\u811a\u672c\u4f1a\u66f4\u52a0\u65b9\u4fbf\u5168\u9762\uff0c\u4e5f\u6bd4\u4f60\u81ea\u5df1\u5199\u6ce8\u91ca\u66f4\u8282\u7ea6\u65f6\u95f4\uff1a \u4e3e\u4f8b\uff0cPMS \u7528\u4f8b\uff1a \u76f4\u63a5\u9009\u4e2d\u7528\u4f8b\u5185\u5bb9\uff0c\u590d\u5236\u4e0b\u6765\uff0c\u7136\u540e\u7c98\u8d34\u5230\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c\u4e2d\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\n \u4e0a\u4f8b\u4e2d\u4e95\u53f7\u6ce8\u91ca\u90e8\u5206\u5c31\u662f\u76f4\u63a5\u4ece PMS \u4e0a\u590d\u5236\u8fc7\u6765\u7684\uff0c\u5728\u6b64\u57fa\u7840\u4e0a\u5199\u7528\u4f8b\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\nmusic = DeepinMusicWidget()\nmusic.click_singer_btn_in_music_by_ui()\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\nmusic.click_icon_mode_in_music_by_ui()\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\nmusic.double_click_first_singer_in_singer_icon_view_by_ui()\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\nself.assert_xxx\n \u4f60\u770b\uff0c\u975e\u5e38\u6e05\u695a\u6bcf\u4e00\u6b65\u5728\u505a\u4ec0\u4e48\uff0c\u91cd\u70b9\u662f\u7701\u53bb\u4e86\u5199\u6ce8\u91ca\u7684\u65f6\u95f4\uff0c\u771f\u7684\u7092\u9e21\u65b9\u4fbf\u3002 \u4e0d\u5199 if __name__ == '__main__':\uff0c\u4e0d\u5199\u591a\u4f59\u7684\u4ee3\u7801\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3","title":"3. \u6570\u636e\u9a71\u52a8","text":" \u5982\u679c\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u662f\u76f8\u540c\u7684\uff0c\u53ea\u662f\u4e00\u4e9b\u53c2\u6570\u53d8\u5316\uff0c\u5c3d\u91cf\u4f7f\u7528\u6570\u636e\u9a71\u52a8\u6765\u5b9e\u73b0\u7528\u4f8b\uff1b \u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u6570\u636e\u9a71\u52a8\u7684\u6570\u636e\uff0c\u4e0d\u80fd\u56e0\u6b64\u5f15\u5165\u4f9d\u8d56\uff0c\u5c3d\u91cf\u4f7f\u7528\u4e00\u4e9b\u6807\u51c6\u5e93\u80fd\u8bfb\u53d6\u7684\u6587\u4ef6\u683c\u5f0f\uff0c\u6bd4\u5982 json\u3001ini\u3001CSV\u3001xml\u3001txt \u7b49\u6587\u4ef6\u683c\u5f0f\uff1b\u4e0d\u5efa\u8bae\u4f7f\u7528 Yaml\u3001Excel\u3001MySQL \u7b49\u6570\u636e\u683c\u5f0f\uff1b \u8bfb\u53d6\u6570\u636e\u65f6\u4e5f\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff0c\u5982\u4f7f\u7528 pandas \u5904\u7406 CSV \u5c31\u5c5e\u4e8e\u5927\u6750\u5c0f\u7528\u4e86\uff0c\u6b63\u5e38\u7684\u6570\u636e\u9a71\u52a8\u8fd8\u6ca1\u5230\u9700\u8981\u5927\u6570\u636e\u5206\u6790\u6765\u5904\u7406\u7684\u5730\u6b65\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u5728 widget/ddt/ \u76ee\u5f55\u4e0b\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5199\u6cd5\uff1a @pytest.mark.parametrize(\"value\", data)\ndef test_smb_049(self, value):\n \u4ee5\u4e0a\u8fd9\u79cd\u53c2\u6570\u5316\u7684\u5199\u6cd5\u672c\u8eab\u6ca1\u4ec0\u4e48\u95ee\u9898\uff0c\u4f46\u662f\uff0c\u8fd9\u91cc\u5fc5\u987b\u8981\u8865\u5145\u4e00\u4e2a\u6ca1\u6709\u7528\u7684\u5c0f\u77e5\u8bc6\uff1a \u5982\u679c\u53c2\u6570\u5316\u6570\u636e\u91cc\u9762\u7684\u5b57\u7b26\u4f1a\u539f\u5c01\u4e0d\u52a8\u7684\u8f93\u51fa\u5230 item.name \u91cc\u9762\uff0c\u663e\u793a\u975e\u5e38\u4e0d\u4f18\u96c5\uff0c\u800c\u4e14\u53ef\u4ee5\u4f1a\u5f15\u5165\u4e00\u4e9b\u610f\u60f3\u4e0d\u5230\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u611f\u53d7\u4e00\u4e0b\uff1a \u53c2\u6570\uff1a data = [\n\"\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\", \"qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678\",\n]\n \u73b0\u8c61\u662f\u8fd9\u6837\u8272\u513f\u7684\uff1a test_smb_049.py::TestFileManager::test_smb_049[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09]\ntest_smb_049.py::TestFileManager::test_smb_049[qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui]\ntest_smb_049.py::TestFileManager::test_smb_049[12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678]\n \u8bf4\u5b9e\u8bdd\uff0c\u770b\u7740\u5fc3\u91cc\u5835\u5f97\u614c\uff0c\u5982\u679c\u8fd9\u91cc\u9762\u5305\u542b\u4e00\u4e9b\u7279\u6b8a\u5b57\u7b26\u6216\u8005\u662f\u8d85\u957f\uff0c\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u5f88\u5947\u5999\u7684\u4e8b\u60c5\u53d1\u751f\u3002 parametrize \u91cc\u9762\u6709\u4e2a\u53c2\u6570\uff1aids\uff0c\u53ef\u4ee5\u89e3\u51b3\u6b64\u7c7b\u95ee\u9898\uff0c\u5c31\u50cf\u8fd9\u6837\uff1a @pytest.mark.parametrize(\"value\", data, ids=[1, 2, 3])\ndef test_smb_049(self, value):\n \u518d\u6765\u611f\u53d7\u4e00\u4e0b\uff1a test_smb_049.py::TestFileManager::test_smb_049[1]\ntest_smb_049.py::TestFileManager::test_smb_049[2]\ntest_smb_049.py::TestFileManager::test_smb_049[3]\n \u660e\u663e\u597d\u591a\u4e86\uff0c\u6240\u4ee5\u5c3d\u91cf\u4f7f\u7528 ids \u8fd9\u4e2a\u53c2\u6570\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 fixture \u7684\u6570\u636e\u9a71\u52a8\u65b9\u5f0f\uff0c\u6846\u67b6\u867d\u7136\u652f\u6301\uff0c\u4f46\u53ef\u8bfb\u6027\u6bd4\u8f83\u5dee\uff1b\u5982\u679c\u4f60\u4e0d\u77e5\u9053\u8fd9\u53e5\u8bdd\u5728\u8bf4\u5565\uff0c\u90a3\u4f60\u53ef\u4ee5\u5ffd\u7565\uff0c\u6211\u4e5f\u4e0d\u6253\u7b97\u8be6\u7ec6\u8bf4\u8fd9\u79cd\u5b9e\u73b0\u65b9\u5f0f\uff0c\u64cd\u4f5c\u6bd4\u8f83\u9a9a\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4","title":"4. \u65ad\u8a00\u8d44\u6e90","text":" \u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u76f4\u63a5\u653e\u5728\u7528\u4f8b\u6a21\u5757\u7684\u540c\u7ea7\u76ee\u5f55\u4e0b\u7684 assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0 + \u7528\u4f8b ID \u547d\u540d\uff1b \u56fe\u50cf\u8bc6\u522b\u65ad\u8a00\uff0c\u4e0d\u8981\u622a\u53d6\u4e00\u5f20\u5f88\u5927\u7684\u56fe\uff0c\u56fe\u7247\u8d44\u6e90\u5305\u542b\u7684\u5143\u7d20\u592a\u591a\u4e86\uff0c\u975e\u5e38\u5bb9\u6613\u53d7\u5230\u9700\u6c42\u5f71\u54cd\uff0c\u5efa\u8bae\u662f\u8fdb\u884c\u5c40\u90e8\u7684\u65ad\u8a00\uff1b \u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u5339\u914d\u5ea6\u662f 0.9\uff0c\u5982\u679c\u65ad\u8a00\u7684\u573a\u666f\u5bf9\u4e8e\u7cbe\u786e\u5ea6\u8981\u6c42\u6ca1\u90a3\u4e48\u9ad8\uff0c\u53ef\u4ee5\u5728\u65ad\u8a00\u8bed\u53e5\u91cc\u9762\u4f20\u5165\u5c0f\u4e8e 0.9 \u7684\u53c2\u6570\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5","title":"5. \u5143\u7d20\u5b9a\u4f4d","text":" \u7528\u4e8e\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u4e2d\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u547d\u540d\u4e3a\u8be5\u5143\u7d20\u7684\u540d\u79f0\uff1b \u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u622a\u53d6\u65f6\u5c3d\u91cf\u7cbe\u786e\u5230\u8fd9\u4e2a\u5177\u4f53\u7684\u6309\u94ae\uff0c\u56fe\u7247\u4e5f\u4e0d\u8981\u592a\u5927\uff1b \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u64cd\u4f5c\u8f83\u5feb\uff0c\u5408\u7406\u52a0\u5165\u7b49\u5f85\u65f6\u95f4\u80fd\u63d0\u9ad8\u7528\u4f8b\u7684\u7a33\u5b9a\u6027\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6","title":"6. \u7528\u4f8b\u8d44\u6e90","text":" \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u4f7f\u7528\u5230\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u6bd4\u5982\u97f3\u4e50\u53ef\u80fd\u9700\u8981\u4e00\u4e9b mp3 \u7684\u8d44\u6e90\u7528\u4e8e\u6d4b\u8bd5\uff0c\u5b58\u653e\u5728 widget/case_res \u76ee\u5f55\u4e0b\uff0c\u524d\u63d0\u662f\u8fd9\u4e9b\u8d44\u6e90\u4e0d\u8d85\u8fc7 10M\uff1b \u5982\u679c\u662f\u4e00\u4e9b\u6bd4\u8f83\u5927\u7684\u8d44\u6e90\uff0c\u5efa\u8bae\u653e\u5230\u7edf\u4e00\u7684 ftp \u670d\u52a1\u5668 \uff08ftp://10.8.10.245\uff09\uff0c\u9700\u8981\u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\u518d\u4e0b\u8f7d\u4e0b\u6765\uff1b f\"wget ftp://{Config.FTP_IP}/uploads/\u591a\u5a92\u4f53/\u5f71\u9662/auto/{file_name};unzip {file_name};rm -rf {file_name};\"\n \u6d4b\u8bd5\u8d44\u6e90\u4e0b\u8f7d\u5230\u5e94\u7528 widget/case_res \u76ee\u5f55\u4e0b\uff1b \u7981\u6b62\u5c06\u6d4b\u8bd5\u8d44\u6e90\u5b58\u653e\u5728\u4e2a\u4eba\u7684\u673a\u5668\u4e0a\uff1b \u5e94\u8be5\u5c3d\u91cf\u4fdd\u8bc1\uff0c\u4e00\u4e2a\u8d44\u6e90\u5728\u4e00\u6b21\u7528\u4f8b\u6267\u884c\u4e2d\u53ea\u9700\u8981\u4e0b\u8f7d\u4e00\u6b21\uff0c\u6240\u4ee5\u4f60\u4e0d\u80fd\u6bcf\u6b21\u4f7f\u7528\u7684\u65f6\u5019\u90fd\u53bb\u4e0b\u8f7d\uff0c\u8fd9\u6837\u53ef\u80fd\u4f1a\u8017\u8d39\u5927\u91cf\u7684\u7f51\u7edc\u8d44\u6e90\uff0c\u800c\u56e0\u4e3a\u5148\u5224\u65ad\u672c\u5730\u662f\u5426\u5b58\u5728\u6b64\u8d44\u6e90\uff0c\u5982\u679c\u4e0d\u5b58\u5728\u518d\u53bb\u4e0b\u8f7d\uff1b \u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u5c06\u8d44\u6e90\u62f7\u8d1d\u5230\u5bf9\u5e94\u7684\u6d4b\u8bd5\u76ee\u5f55\u4e0b\uff0c\u6bd4\u5982\u5c06 mp3 \u6587\u4ef6\u62f7\u8d1d\u5230 ~/Music \u76ee\u5f55\u4e0b\uff0c\u4f46\u662f\u6211\u4eec\u66f4\u5efa\u8bae\u4f60\u4f7f\u7528\u53d1\u9001\u5feb\u6377\u94fe\u63a5\u7684\u65b9\u5f0f\u66ff\u4ee3\u62f7\u8d1d\u7684\u64cd\u4f5c\uff0c\u56e0\u4e3a\u5728\u62f7\u8d1d\u5927\u6587\u4ef6\u65f6\u662f\u5f88\u6d88\u8017\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u800c\u521b\u5efa\u94fe\u63a5\u5219\u4e0d\u4f1a\uff1b @classmethod\ndef recovery_many_movies_in_movie_by_cmd(cls):\n\"\"\"\u6062\u590d\u591a\u4e2a\u89c6\u9891\u6587\u4ef6\u81f3\u89c6\u9891\u76ee\u5f55\u4e2d\"\"\"\nwork_path = f\"/home/{Config.USERNAME}/Videos/auto\"\ncode_path = f\"{Config.CASE_RES_PATH}/auto\"\ncls.run_cmd(f\"rm -rf {work_path};mkdir {work_path}\")\nsleep(1)\nflag = False\nif not exists(code_path):\ncls.run_cmd(f\"mkdir -p {code_path}\")\nflag = True\nlogger.info(f\"ln -s {code_path}/* {work_path}/\")\ncls.run_cmd(\nf\"cd {code_path}/;\"\nf\"{cls.wget_file('auto.zip') if flag else ''}\"\nf\"ln -s {code_path}/* {work_path}/ > /dev/null 2>&1\"\n)\n \u8d44\u6e90\u4e0b\u8f7d\u8fc7\u7a0b\u4e2d\u6ce8\u610f\u8d85\u65f6\u7684\u95ee\u9898\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u5f88\u5927\uff0c\u8981\u7279\u522b\u6ce8\u610f\u8fd9\u95ee\u9898\uff0c\u5982\u679c\u4f60\u4f7f\u7528\u5f3a\u5236\u7b49\u5f85\u4e0b\u8f7d\u7ed3\u675f( os.system )\uff0c\u53ef\u80fd\u4f1a\u9020\u6210\u7528\u4f8b\u6267\u884c\u65f6\u957f\u53d8\u5f97\u4e0d\u53ef\u63a5\u53d7\uff0c\u76ee\u524d\u6211\u4eec\u53d1\u73b0\u5728\u6301\u7eed\u96c6\u6210\u73af\u5883\u6267\u884c\u65f6\u7f51\u7edc\u4e0b\u8f7d\u901f\u5ea6\u5f88\u6162\uff0c\u6240\u4ee5\u8d85\u65f6\u673a\u5236\u662f\u5f88\u6709\u5fc5\u8981\u7684\uff1brun_cmd \u65b9\u6cd5\u6709\u4e00\u4e2a\u9ed8\u8ba4\u8d85\u65f6\u7684\u65f6\u95f4\uff0c\u4f60\u53ef\u4ee5\u6839\u636e\u8d44\u6e90\u5927\u5c0f\u5bf9\u8d85\u65f6\u65f6\u95f4\u8fdb\u884c\u8c03\u6574\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_5","title":"\u516d\u3001\u7528\u4f8b\u8c03\u8bd5\u6280\u5de7","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_4","title":"1. \u65e5\u5fd7","text":" \u4e00\u5b9a\u8981\u5148\u770b\u62a5\u9519\uff0c\u770b error \u65e5\u5fd7\uff0c\u901a\u5e38\u80fd\u660e\u786e\u7684\u544a\u8bc9\u4f60\u5177\u4f53\u54ea\u91cc\u4ee3\u7801\u62a5\u9519\uff1b \u7ed3\u5408\u62a5\u9519\u70b9\u524d\u9762\u7684error\u3001 info \u548c debug \u65e5\u5fd7\u770b\u5426\u662f\u6b63\u5e38\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_4","title":"2. \u65ad\u70b9\u8c03\u8bd5","text":" \u65b9\u6cd5\u62a5\u9519\uff1a \u5728\u65b9\u6cd5\u5e93\u4e2d\u627e\u5230\u5bf9\u5e94\u7684\u65b9\u6cd5\uff0c\u5355\u72ec\u8c03\u7528\uff0c\u770b\u662f\u5426\u80fd\u6b63\u5e38\u6267\u884c\uff1b \u901a\u5e38\u5355\u4e2a\u65b9\u6cd5\u7684\u6267\u884c\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u62a5\u9519\uff0c\u5f88\u5feb\u5c31\u80fd\u6392\u67e5\u51fa\u95ee\u9898\uff1b\u5728\u65b9\u6cd5\u5185\u90e8\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u65b9\u6cd5\u5185\u90e8\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u8c03\u7528\u6ca1\u95ee\u9898\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u62a5\u9519\u7684\u65b9\u6cd5\u524d\u9762\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u7528\u4f8b\u7684\u4e1a\u52a1\u903b\u8f91\u548c\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u65ad\u8a00\u62a5\u9519\uff1a \u65ad\u8a00\u4e3a\u6570\u636e\u65ad\u8a00\uff0c\u6839\u636e\u8868\u8fbe\u5f0f\u8fdb\u884c\u65ad\u8a00\u8bed\u53e5\u8fdb\u884c\u4fee\u6539\uff1b \u6587\u4ef6\u751f\u6210\u7c7b\u65ad\u8a00\uff0c\u67e5\u770b\u662f\u5426\u9700\u8981\u52a0\u7b49\u5f85\u65f6\u95f4\uff1b \u56fe\u50cf\u65ad\u8a00\uff0c\u5728\u65ad\u8a00\u8bed\u53e5\u5904\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u7528\u4f8b\u8fd0\u884c\u5230\u65ad\u8a00\u5904\u4f1a\u505c\u6b62\uff0c\u67e5\u770b\u6b64\u65f6\u65ad\u8a00\u7684\u56fe\u7247\u4e0e\u7528\u4f8b\u6267\u884c\u7684\u73b0\u573a\u5b58\u5728\u4ec0\u4e48\u5dee\u5f02\uff0c\u6b64\u65f6\u4e5f\u53ef\u4ee5\u8fdb\u884c\u91cd\u65b0\u622a\u56fe\uff0c\u4ece\u800c\u66ff\u6362\u65b0\u7684\u56fe\u7247\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3_1","title":"3. \u8fdc\u7a0b\u6267\u884c","text":" \u8fdc\u7a0b\u6267\u884c\u6307\u7684\u662f\u7f16\u8f91\u5668\u901a\u8fc7\u6307\u5b9a\u8fdc\u7a0b\u89e3\u91ca\u5668\u6267\u884c\u81ea\u52a8\u5316\u4ee3\u7801\uff1b \u8fdc\u7a0b\u6267\u884c\u7684\u597d\u5904\u662f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u7684 Debug \u8fd0\u884c\uff0c\u4e0d\u7528\u5728\u6d4b\u8bd5\u673a\u4e0a\u6253\u5f00\u7f16\u8f91\u5668\uff0c\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u66f4\u5feb\uff1b \u652f\u6301\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u7684\u7f16\u8f91\u5668\uff1a \u4e13\u4e1a\u7248 Pycharm VScode \uff0c\u9700\u8981\u4f7f\u7528\u63d2\u4ef6 Remote-SSH \u8fdc\u7a0b\u6267\u884c\u914d\u7f6e \u4ee5 Pycharm \u4e3a\u4f8b\uff1a File \u2014> Settings \u2014> Project \u2014> Python Interpreter \u2014> \u53f3\u8fb9\u8bbe\u7f6e\u6309\u94ae \u2014> Add... \u2014> SSH Interpreter \u2014> New server configuration(\u586b\u5165host\u548cusername) \u2014> Next \u2014> password\uff08\u6d4b\u8bd5\u673a\u5bc6\u7801\uff09 \u2014> Interpreter(\u9009\u62e9\u8fdc\u7a0b\u89e3\u91ca\u5668) \u2014> Finish "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4_1","title":"4. \u73af\u5883\u6e05\u7406","text":" \u5982\u679c\u7528\u4f8b\u91cc\u9762\u7684 teardown \u6ca1\u6709\u6267\u884c\uff0c\u5927\u6982\u7387\u662f\u56e0\u4e3a setup \u91cc\u9762\u4ee3\u7801\u62a5\u9519\uff0c\u8fd9\u4e24\u4e2a\u662f\u4e00\u5bf9\u7684\uff0csetup \u91cc\u9762\u62a5\u9519\uff0cteardown \u91cc\u9762\u7684\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\uff1b \u76ee\u524d\u6211\u4eec\u5df2\u7ecf\u5c06\u5404\u5e94\u7528\u7684 clean_all \u8fd9\u4e2a fixture \u6539\u6210\u4e86\u7ec8\u7ed3\u5668\uff0c\u786e\u4fdd\u59cb\u7ec8\u80fd\u6267\u884c\u5230\u8fd9\u6b65\uff0c\u4f46\u662f\u7528\u4f8b\u91cc\u9762\u7684 fixture\uff0c\u8fd8\u662f\u9700\u8981\u6211\u4eec\u5c0f\u5fc3\u5904\u7406\uff1b \u8981\u6267\u884c clean_all \u9700\u8981\u5728\u7f16\u8f91\u5668\u8fd0\u884c\u53c2\u6570\u52a0 --clean yes\uff0c\u5199\u7528\u4f8b\u7684\u65f6\u5019\u8bf7\u52a0\u4e0a\uff0c\u4e0d\u7136\u4f60\u4e0d\u786e\u5b9a\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u7684\u73af\u5883\u662f\u5426\u6062\u590d\uff1b setup \u53ef\u4ee5\u4e0d\u8981\uff0c\u5c06 setup \u653e\u5230\u7528\u4f8b\u91cc\u9762\u662f\u4e00\u79cd\u7a33\u59a5\u7684\u505a\u6cd5\uff0cteardown \u4e00\u5b9a\u8981\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5_1","title":"5. \u5143\u7d20\u5b9a\u4f4d\u4e0d\u51c6\uff08\u5750\u6807\u8fd4\u56de\u4e0d\u5bf9\uff09","text":" \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u53ef\u80fd\u53d7\u5230\u7a97\u53e3 ID \u7684\u53d8\u5316\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u9ed8\u8ba4\u53d6\u6700\u65b0\u7684\u4e00\u4e2a\u7a97\u53e3\u7528\u4e8e\u5b9a\u4f4d\uff0c\u4f46\u5982\u679c\u5b9e\u9645\u9700\u8981\u5b9a\u4f4d\u7684\u4e0d\u662f\u6700\u65b0\u7684\u7a97\u53e3\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u91cd\u65b0\u5b9e\u4f8b\u5316\u65b9\u6cd5\u7c7b\u5bf9\u8c61\uff0c\u5e76\u5728\u7c7b\u4e2d\u4f20\u5165\u5bf9\u5e94\u7684\u7a97\u53e3\u5e8f\u53f7\uff1b \u57fa\u4e8e\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u76ee\u524d\u9047\u5230\u7684\u7b14\u8bb0\u672c\u4e0a\uff0c\u7531\u4e8e\u5c4f\u5e55\u7f29\u653e\u6bd4\u4f8b\u4e3a 1.25\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u6211\u4eec\u9ed8\u8ba4\u4f7f\u7528\u7f29\u653e\u6bd4\u4f8b\u4e3a 1\uff1b \u57fa\u4e8e\u56fe\u50cf\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u76ee\u6807\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b \u57fa\u4e8e OCR \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u6587\u5b57\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u540c\u6837\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6_1","title":"6. \u952e\u9f20\u64cd\u4f5c\u4e0d\u51c6","text":" \u9f20\u6807\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6bd4\u5982\u53f3\u952e\u3001\u53cc\u51fb\u65e0\u54cd\u5e94\uff1b \u952e\u76d8\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6216\u8005\u5ef6\u8fdf\u8f93\u5165\uff0c\u6bd4\u5982\u7528\u4f8b\u9700\u8981\u8f93\u5165\u201c\u6211\u662f\u4e2d\u56fd\u4eba\u201d\uff0c\u5b9e\u9645\u53ea\u8f93\u5165\u4e86\u201c\u6211\u56fd\u4eba\u201d\uff1b \u4ee5\u4e0a\u95ee\u9898\u6392\u9664\u5e94\u7528\u5361\u987f\u7b49\u95ee\u9898\uff0c\u5927\u6982\u7387\u662f\u7531\u4e8e\u5de5\u5177\u7684\u95ee\u9898\uff0c\u76ee\u524d\u952e\u9f20\u64cd\u4f5c\u6211\u4eec\u4f7f\u7528\u4e09\u4e2a\u5de5\u5177\uff1aDogtail \u63d0\u4f9b\u7684\u952e\u9f20\u5de5\u5177\u3001PyAutoGUI\u3001Xdotool \uff1b \u6709\u540c\u5b66\u53ef\u80fd\u8981\u8bf4\u4e3a\u5565\u8981\u7528\u4e09\u4e2a\u554a\uff0c\u7528\u4e00\u4e2a\u4e0d\u5c31\u597d\u4e86\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u5404\u6709\u4f18\u70b9\u5404\u6709\u7f3a\u70b9\u3002 \u5982\u679c\u4f60\u9047\u5230\u952e\u9f20\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u8bd5\u8bd5\u901a\u8fc7\u4e0d\u540c\u7684\u5de5\u5177\u64cd\u4f5c\uff1b\u952e\u76d8\u8f93\u5165\u5ef6\u8fdf\u7684\u95ee\u9898\uff0c\u4e00\u822c\u662f\u56e0\u4e3a\u8f93\u5165\u901f\u5ea6\u592a\u5feb\u4e86\uff0c\u7cfb\u7edf\u6ca1\u53cd\u5e94\u8fc7\u6765\uff0c\u5e38\u89c1\u4e8e ARM \u548c MIPS \u4e0a\uff0c\u4fee\u6539\u53c2\u6570 delay_time \u7684\u503c\uff0c\u5355\u4f4d\u4e3a\u6beb\u79d2\uff1b # mouse_key.py\n@classmethod\ndef input_message(cls, message, delay_time=300, interval=0.2):\n\"\"\"\n \u8f93\u5165\u5b57\u7b26\u4e32\n :param message: \u8f93\u5165\u7684\u5185\u5bb9\n :param delay_time: \u5ef6\u8fdf\u65f6\u95f4\n :param interval:\n :return:\n \"\"\"\n \u5982\u679c\u4e0d\u662f\u65b9\u6cd5\u7684\u95ee\u9898\uff0c\u5219\u9700\u8981\u7ee7\u7eed\u548c\u5f00\u53d1\u4e00\u8d77\u6392\u9664\uff0c\u662f\u5426\u4e3a\u5e94\u7528\u63a5\u53d7\u952e\u9f20\u4fe1\u53f7\u5904\u7406\u7684\u95ee\u9898\uff0c\u8fd9\u7c7b\u60c5\u51b5\u6211\u4eec\u4e5f\u662f\u9047\u5230\u8fc7\u7684\uff0c\u5177\u4f53\u95ee\u9898\u5177\u4f53\u5206\u6790\u3002 \u6bd4\u5982\u5f71\u9662\u5c31\u91cd\u5199\u4e86\u4e00\u4e2a\u53f3\u952e\u7684\u65b9\u6cd5\uff1a # base_widget.py\n@classmethod\ndef right_click(cls, _x=None, _y=None):\n\"\"\"\n \u91cd\u5199\u5e95\u5c42\u5355\u51fb\u9f20\u6807\u53f3\u952e\n \u89e3\u51b3\u5f71\u9662\u53f3\u952e\u89e6\u53d1release\u4e8b\u4ef6\u7684\u95ee\u9898\uff08\u53f3\u952e\u4e3b\u7a97\u53e3\u4f1a\u64ad\u653e\u89c6\u9891\uff09\n \"\"\"\ncls.mouse_down(_x, _y, button=3)\nsleep(0.1)\ncls.mouse_up(button=3)\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_6","title":"\u4e03\u3001\u5176\u4ed6\u4e0d\u4e3a\u4eba\u77e5\u7684\u7ec6\u8282","text":" \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u5c3d\u91cf\u7f16\u5199\u540c\u4e00\u4e2a\u5e94\u7528\u6216\u6a21\u5757\u7684\u7528\u4f8b\uff0c\u80fd\u5bf9\u8be5\u7528\u4f8b\u5df2\u6709\u65b9\u6cd5\u719f\u6089\uff0c\u907f\u514d\u8fc7\u591a\u91cd\u590d\u4e1a\u52a1\u4ee3\u7801\u7684\u5c01\u88c5\uff1b \u76f8\u540c\u7684\u573a\u666f\u4e0b\uff0c\u5404\u67b6\u6784\u7b49\u5f85\u65f6\u95f4\u4e0d\u540c\uff0c\u5efa\u8bae\u4f7f\u7528\u6846\u67b6\u63d0\u4f9b\u7684 sleep\uff0c\u6211\u4eec\u505a\u4e86\u4e0d\u540c\u67b6\u6784\u7684\u500d\u6570\u653e\u5927\uff1b \u7f16\u5199\u7528\u4f8b\u65f6\uff0c\u5c3d\u91cf\u8003\u8651\u5230\u6bcf\u4e00\u6b65\u5f02\u5e38\u540e\u7684\u73af\u5883\u6062\u590d\uff0c\u9700\u8981\u5efa\u8bae\u8fd9\u79cd\u610f\u8bc6\uff0c\u968f\u65f6\u8981\u8003\u8651\u5230\uff0c\u8fd9\u6b65\u64cd\u4f5c\u6709\u6ca1\u6709\u53ef\u80fd\u51fa\u9519\uff0c\u51fa\u9519\u4e86\u6539\u600e\u4e48\u529e\uff1b \u63d0\u4ea4\u4ee3\u7801\u7684\u65f6\u5019\u6ce8\u610f\u4e0d\u8981\u628a\u4e00\u4e9b\u4e34\u65f6\u7684\u6d4b\u8bd5\u8d44\u6e90\u63d0\u4ea4\u8fdb\u53bb\u4e86\uff0c\u6bd4\u5982\u6d4b\u8bd5\u4e86\u4e00\u4e2a\u5f71\u7247\uff0c\u6709\u4e9b\u540c\u5b66\u4e60\u60ef\u4f7f\u7528 git add . \uff0c\u7136\u540e\u5c31\u5168\u90e8\u63d0\u4ea4\u5230\u4ee3\u7801\u4ed3\u5e93\u4e86\uff0c\u8fd9\u6837\u5373\u4f7f\u540e\u671f\u628a\u5927\u6587\u4ef6\u5220\u4e86\uff0c.git \u6587\u4ef6\u91cc\u9762\u4e5f\u4f1a\u5f88\u5927\uff0c\u9020\u6210\u4ee3\u7801\u4ed3\u5e93\u53d8\u5f97\u5341\u5206\u81c3\u80bf\u3002 \u66f4\u591a\u7ec6\u8282\u67e5\u770b\uff1a\u300aAT\u7ecf\u9a8c\u603b\u7ed3\u300b"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/","title":"AT \u6267\u884c\u5668\u4f7f\u7528\u6307\u5317","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/5/25\n# Author : litao\n# =============================================\n Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1","title":"1\u3001\u529f\u80fd\u4ecb\u7ecd","text":" \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7cfb\u7edf\u8bed\u8a00\u8bbe\u7f6e\uff0c\u5206\u8fa8\u7387\u8bbe\u7f6e\u53ca\u7528\u4f8b\u6267\u884c\u73af\u5883\u642d\u5efa\uff1b \u652f\u6301 IP \u4e3a 15 \u7f51\u6bb5\u7684 AMD \u67b6\u6784\u6d4b\u8bd5\u673a\u955c\u50cf\u88c5\u673a\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u6307\u5b9a\u5e94\u7528\uff0c\u6307\u5b9a\u8303\u56f4\u6807\u7b7e\u7684\u7528\u4f8b\u6267\u884c\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u72b6\u6001\u68c0\u67e5\uff0c\u662f\u5426\u6709\u6b63\u5728\u8fd0\u884c\u7684\u6d4b\u8bd5\uff1b \u652f\u6301\u914d\u7f6e\u7528\u4f8b\u6267\u884c\u65f6\u957f\uff0c\u9632\u6b62\u4efb\u52a1\u963b\u585e\uff1b \u652f\u6301\u6839\u636e\u5e94\u7528\u7248\u672c\u81ea\u52a8\u67e5\u627e\u5bf9\u5e94\u7684\u7528\u4f8b tag\uff1b \u652f\u6301\u5f02\u5e38\u5904\u7406\u548c\u6d4b\u8bd5\u5b8c\u6210\u7684\u5b9e\u65f6\u6d88\u606f\u901a\u77e5\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2job","title":"2\u3001Job \u4ecb\u7ecd","text":"\u4ee5\u4e0b\u6309\u6267\u884c\u6d41\u7a0b\u7684\u987a\u5e8f\u4ecb\u7ecd\uff0c\u6bcf\u4e00\u6b65\u90fd\u53ef\u4ee5\u5355\u72ec\u6267\u884c\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1_1","title":"1\u3001\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/AT_test/ \u6574\u4e2a\u6d41\u7a0b\u7684\u4e3b\u5165\u53e3\uff0c\u901a\u8fc7\u8fd9\u4e2a\u5165\u53e3\uff0c\u8fde\u540c\u6574\u4e2a\u6d4b\u8bd5\u6d41\u7a0b\uff0c\u955c\u50cf\u88c5\u673a\uff0c\u73af\u5883\u90e8\u7f72\uff0c\u6d4b\u8bd5\u5e94\u7528\u53ca\u751f\u6210\u62a5\u544a\u3002 \u53c2\u6570\u4ecb\u7ecd\uff1a \u6d4b\u8bd5\u673a\uff1a\u6240\u6709\u89c4\u6574\u5230\u56fa\u5b9a\u533a\u57df\u7684\u6d4b\u8bd5\u673a\uff0c\u901a\u8fc7\u6d4b\u8bd5\u540c\u5b66\u5bf9\u6d4b\u8bd5\u673a\u7684\u4e60\u60ef\u547d\u540d\uff0c\u5728\u540e\u53f0\u6620\u5c04\u6d4b\u8bd5\u673a\u7684\u8be6\u7ec6\u4fe1\u606f\uff0c\u62ec\u53f7\u4e2d\u4e3a\u6d4b\u8bd5\u673a IP \u7684\u6700\u540e\u4e00\u4f4d\uff1b \u6d4b\u8bd5\u5e94\u7528\uff1a\u6307\u5b9a\u7684\u6d4b\u8bd5\u5e94\u7528\u7684\u5305\u540d\uff0c\u7cfb\u7edf\u6839\u636e\u540d\u79f0\u81ea\u52a8\u62c9\u53d6\u5bf9\u5e94\u7684\u4ed3\u5e93\u4ee3\u7801\uff1b deb\u5305\u4e0b\u8f7d\u5730\u5740\uff1a\u6d4b\u8bd5\u4e0a\u8ff0\u5e94\u7528\u65f6\uff0c\u9700\u8981\u5b89\u88c5\u7684deb\u5305\u4e0b\u8f7d\u5730\u5740\uff0c\u591a\u4e2a\u5730\u5740\u7528\u201c,\u201d\u9694\u5f00\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff1b \u8303\u56f4\u6807\u7b7e\uff1a\u6267\u884c\u6d4b\u8bd5\u7528\u4f8b\u7684\u6807\u7b7e\u8303\u56f4\uff0c\u5bf9\u5e94\u7528\u4f8b\u4ee3\u7801 csv \u6587\u4ef6\u4e2d\u7684\u6807\u7b7e\u4fe1\u606f\uff0c\u4ee5 pytest \u7684mark\u8bed\u6cd5\u7f16\u5199\uff1b \u7cfb\u7edf\u8bed\u8a00\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u8bed\u8a00\u73af\u5883\uff1b \u5206\u8fa8\u7387\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u5206\u8fa8\u7387\u73af\u5883\uff1b \u955c\u50cf\u5730\u5740\uff1a\u955c\u50cf\u4ed3\u5e93\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u901a\u8fc7 PXE \u88c5\u673a\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u88c5\u673a\u73af\u8282\uff08\u76ee\u524d\u4ec5\u652f\u6301\u90e8\u5206 AMD \u67b6\u6784\u7684\u88c5\u673a\uff09\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2pxe","title":"2\u3001PXE \u88c5\u673a","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/IOS_install/ \u8f93\u5165\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\uff0cIP\uff0c\u5bc6\u7801\uff0c\u955c\u50cf\u5730\u5740\u540e\uff0c\u81ea\u52a8\u88c5\u673a\uff0c\u76ee\u524d\u4ec5\u652f\u6301\u56fa\u5b9a 15 \u7f51\u6bb5\u7684\u90e8\u5206 AMD \u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#3","title":"3\u3001\u6b21\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/all_client_test/ \u8be5\u5165\u53e3\u4e0e\u4e3b\u5165\u53e3\u529f\u80fd\u57fa\u672c\u4e00\u81f4\uff0c\u53ea\u662f\u5265\u79bb\u4e86PXE\u88c5\u673a\u6d41\u7a0b\uff0c\u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7684\u6267\u884c\u6d41\u7a0b\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#4","title":"4\u3001\u73af\u5883\u90e8\u7f72","text":"Jenkins url\uff1ahttps://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/env/build?delay=0sec \u8bbe\u7f6e\u6d4b\u8bd5\u673a\u7684\u7cfb\u7edf\u8bed\u8a00\uff0c\u5206\u8fa8\u7387\u53ca\u5b89\u88c5\u6d4b\u8bd5\u6240\u9700\u7684\u4f9d\u8d56\u5305\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#5","title":"5\u3001\u53d1\u9001\u4ee3\u7801","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/send_code/ \u6839\u636e\u6d4b\u8bd5\u5e94\u7528\u540d\u79f0\uff0c\u62c9\u53d6\u5bf9\u5e94\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u5e76\u6839\u636e\u6d4b\u8bd5\u673a\u4e0a\u5e94\u7528\u7248\u672c\u5207\u6362\u5230\u5bf9\u5e94\u7684tag\u7248\u672c\uff0c\u82e5\u672a\u627e\u5230tag\u7248\u672c\uff0c\u5219\u4f7f\u7528\u6700\u65b0\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u518d\u6839\u636e\u5e94\u7528\u5e93\u4ee3\u7801\u4e2d\u914d\u7f6e\u7684\u57fa\u7840\u5e93\u7248\u672c\uff0c\u62c9\u53d6\u57fa\u7840\u5e93\u4ee3\u7801\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#6","title":"6\u3001\u7528\u4f8b\u6267\u884c","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/run_test/ \u8fd0\u884c\u6d4b\u8bd5\u673a\u4e0a\u7684\u7528\u4f8b"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/","title":"AT \u7528\u4f8b\u7b5b\u9009\u6307\u5317","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u7528\u4f8b\u7b5b\u9009\u6807\u51c6\uff0c\u662f\u6311\u9009\u5408\u9002\u7684\u6587\u672c\u7528\u4f8b\u8fdb\u884c\u81ea\u52a8\u5316\u7528\u4f8b\u8f6c\u5316\u7684\u4e00\u4e9b\u901a\u7528\u6807\u51c6\u3002 \u8fc7\u53bb\u6211\u4eec\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u5b9e\u8df5\u8fc7\u7a0b\u4e2d\uff0c\u5199\u4e86\u4e0d\u5c11\u81ea\u52a8\u5316\u7528\u4f8b\uff0c\u968f\u7740\u9700\u6c42\u7684\u8fed\u4ee3\uff0c\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u81ea\u7136\u8150\u5316\uff0c\u56e0\u800c\u9700\u8981\u5728\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\u5bf9\u81ea\u52a8\u5316\u7528\u4f8b\u8fdb\u884c\u7ef4\u62a4\uff0c\u5728\u7ef4\u62a4\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u6211\u4eec\u53d1\u73b0\uff0c\u6709\u4e9b\u7528\u4f8b\u7ef4\u62a4\u8d77\u6765\u592a\u96be\u4e86\uff0c\u8c03\u8bd5\u7528\u4f8b\u8017\u8d39\u5927\u91cf\u65f6\u95f4\uff0c\u6210\u672c\u5f88\u9ad8\u3002 \u56e0\u6b64\uff0c\u6211\u4eec\u603b\u7ed3\u4e00\u4e9b\u81ea\u52a8\u5316\u7528\u4f8b\u9009\u578b\u7684\u6807\u51c6\uff0c\u4ee5\u4f18\u5316\u540e\u7eed\u81ea\u52a8\u5316\u7528\u4f8b\u7ed3\u6784\uff0c\u671f\u5f85\u6211\u4eec\u80fd\u7f16\u5199\u51fa\u9ad8\u6548\u3001\u7a33\u5b9a\u3001\u6613\u4e8e\u7ef4\u62a4\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_1","title":"\u4e00\u3001\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u53ef\u4ee5\u5206\u4e3a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u548c\u4e13\u9879\u81ea\u52a8\u5316\u6d4b\u8bd5\uff0c\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e00\u822c\u53ea\u9488\u5bf9\u4e00\u4e9b\u5e38\u89c4\u7684\u529f\u80fd\u6d4b\u8bd5\uff0c\u5176\u4ed6\u975e\u5e38\u89c4\u529f\u80fd\u7684\u7528\u4f8b\uff0c\u5e94\u8be5\u91c7\u7528\u4e13\u9879\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u6848\uff1b \u4ee5\u4e0b\u662f\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1","title":"1. \u7a33\u5b9a\u6027\u3001\u538b\u6d4b\u7528\u4f8b","text":"\u7a33\u5b9a\u6027\u6d4b\u8bd5\u3001\u538b\u6d4b\u7528\u4f8b\u5e94\u8be5\u662f\u5c5e\u4e8e\u6027\u80fd\u76f8\u5173\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u5982\uff1a\u53cd\u590d\u591a\u6b21\u70b9\u51fb\u6309\u94ae\uff0c\u68c0\u9a8c\u5176\u529f\u80fd\u7a33\u5b9a\u6027\u3002\u56e0\u4e3a\u8fd9\u4e9b\u7528\u4f8b\u65ad\u8a00\u7684\u9884\u671f\u53ef\u80fd\u4e0d\u662f\u5f88\u660e\u786e\uff0c\u66f4\u6709\u751a\u8005\u4e0d\u9700\u8981\u65ad\u8a00\uff0c\u7528\u4f8b\u65f6\u957f\u6bd4\u8f83\u957f\uff0c\u800c\u4e14\u4e0d\u53ef\u63a7\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u76ee\u524d\u6211\u4eec\u6709\u6027\u80fd\u81ea\u52a8\u5316\u7684\u4e13\u9879\u65b9\u6848\uff0c\u4ee5\u53ca\u4e00\u4e9b\u7a33\u5b9a\u6027\u6d4b\u8bd5\u7684\u4e13\u9879\u65b9\u6848\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u6b64\u7c7b\u7528\u4f8b\u653e\u5230\u4e13\u9879\u81ea\u52a8\u5316\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2","title":"2. \u6d89\u53ca\u591a\u4e2a\u7528\u6237\u64cd\u4f5c","text":"\u5e38\u89c1\u4e0e\u6587\u7ba1\u7684\u7528\u4f8b\u4e2d\uff0c\u591a\u7528\u6237\u64cd\u4f5c\u7684\u7528\u4f8b\u4e00\u822c\u90fd\u4f1a\u6d89\u53ca\u5230\u5728\u7cfb\u7edf\u4e2d\u8fdb\u884c\u591a\u4e2a\u7528\u6237\u95f4\u7684\u5207\u6362\uff0c\u81ea\u52a8\u5316\u811a\u672c\u4e00\u822c\u662f\u8fd0\u884c\u5728\u4e00\u4e2a\u7528\u6237\u7a7a\u95f4\u4e0b\u7684\uff0c\u6240\u4ee5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u591a\u7528\u6237\u95f4\u7684\u5207\u6362\u3002 \u6b64\u7c7b\u4e0d\u5efa\u8bae\u91c7\u7528\u81ea\u52a8\u5316\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3","title":"3. \u4e0e\u5f00\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4ea4\u4e92","text":"\u6b64\u7c7b\u573a\u666f\u591a\u4e3a\u5e94\u7528\u7684\u5f02\u5e38\u573a\u666f\u6d4b\u8bd5\uff0c\u6bd4\u5982\uff1a\u590d\u5236\u5927\u6587\u4ef6\u8fc7\u7a0b\u4e2d\u6ce8\u9500\u673a\u5668\u3002 \u81ea\u52a8\u5316\u811a\u672c\u5728\u7cfb\u7edf\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4e4b\u540e\u662f\u4f1a\u505c\u6b62\u8fd0\u884c\u7684\uff1b\u6b64\u7c7b\u7528\u4f8b\u53ef\u4ee5\u505a\u81ea\u52a8\u5316\uff0c\u4f46\u662f\u540c\u6837\u9700\u8981\u505a\u4e13\u9879\u65b9\u6848\uff0c\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u7684\u5904\u7406\u903b\u8f91\u5b8c\u5168\u4e0d\u540c\u3002 \u540e\u7eed\u81ea\u52a8\u5316\u9700\u8981\u516c\u5173\u7684\u70b9\uff1a \u81ea\u52a8\u5316\u811a\u672c\u5728\u672c\u673a\u8fd0\u884c\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u81f3\u5c11\u9700\u8981\u63d0\u4f9b\u4ee5\u4e0b\u529f\u80fd\uff1a \u91cd\u542f\u4e4b\u540e\u7528\u4f8b\u80fd\u81ea\u52a8\u8fd0\u884c\uff1b\u53ef\u4ee5\u8003\u8651\u5c06\u6267\u884c\u7528\u4f8b\u5199\u6210\u4e00\u4e2a\u5f00\u673a\u81ea\u542f\u7684\u670d\u52a1\uff1b \u80fd\u8bb0\u5f55\u5173\u673a\u4e4b\u524d\u7528\u4f8b\u6267\u884c\u7684\u4f4d\u7f6e\uff0c\u91cd\u542f\u4e4b\u540e\u80fd\u4ece\u6b64\u4f4d\u7f6e\u5f00\u59cb\u6267\u884c\uff1b \u50cf\u6027\u80fd\u81ea\u52a8\u5316\u4e00\u6837\uff0c\u7531\u670d\u52a1\u7aef\u63a7\u5236\uff1b \u5b8c\u5168\u57fa\u4e8e\u56fe\u5f62\u8bc6\u522b\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u4e32\u53e3\u7ebf\u63a7\u5236\u952e\u9f20\u7a33\u5b9a\u6027\uff1b "},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4","title":"4. \u6d4b\u8bd5\u6267\u884c\u65f6\u95f4\u957f","text":"\u7528\u4f8b\u6267\u884c\u65f6\u95f4\u63a7\u5236\u57282\u5206\u949f\u4ee5\u5185\uff0c\u6781\u7aef\u60c5\u51b5\u4e0d\u8981\u8d85\u8fc75\u5206\u949f\uff0c\u6240\u6709\u7528\u4f8b\u7684\u5e73\u5747\u65f6\u957f\u5e94\u8be5\u57281\u5206\u949f\u5de6\u53f3\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u95f4\u592a\u957f\uff0c\u7f16\u5199\u7528\u4f8b\u3001\u8c03\u8bd5\u7528\u4f8b\u3001\u6267\u884c\u7528\u4f8b\u3001\u7ef4\u62a4\u7528\u4f8b\u90fd\u975e\u5e38\u7684\u8017\u65f6\uff0c\u4eba\u529b\u6210\u672c\u65f6\u95f4\u6210\u672c\u6295\u5165\u592a\u9ad8\u3002 \u4f60\u60f3\uff0c\u8fd9\u6761\u7528\u4f8b\u6267\u884c\u9700\u89815\u5206\u949f\uff0c\u90a3\u4f60\u5199\u8fd9\u6761\u7528\u4f8b\u7684\u65f6\u95f4\u4e0d\u53ef\u80fd\u4e00\u904d\u8fc7\uff0c\u5199\u7684\u8fc7\u7a0b\u4e2d\u8dd1\u4e0d\u901a\u8fd8\u5f97\u91cd\u8dd1\u81f3\u5c1115\u5206\u949f\u4e0d\u8fc7\u5206\uff0c\u5199\u5b8c\u4e86\u8fd8\u5f97\u5728\u5176\u4ed6\u67b6\u6784\u4e0a\u8c03\u8bd5\uff0c\u534a\u4e2a\u5c0f\u65f6\u8fc7\u53bb\u4e86\uff0c\u8fd9\u8fd8\u53ea\u662f\u7b2c\u4e00\u6b21\u5199\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u540e\u7eed\u5982\u679c\u7528\u4f8b\u7ef4\u62a4\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u7ecf\u5e38\u6295\u5165\u76f8\u5f53\u957f\u65f6\u95f4\uff0c\u8fd9\u6837\u5176\u5b9e\u662f\u5931\u53bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u7684\u3002\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u5c31\u5e94\u8be5\u662f\u5feb\u51c6\u72e0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5","title":"5. \u8fb9\u7f18\u6027\u6d4b\u8bd5","text":"\u6709\u4e9b\u529f\u80fd\u6a21\u5757\u672c\u8eab\u662f\u5c5e\u4e8e\u6bd4\u8f83\u8fb9\u7f18\u6027\u7684\uff0c\u5373\u6781\u5c11\u7528\u6237\u4f1a\u4f7f\u7528\u5230\u7684\u529f\u80fd\uff0c\u8fd9\u7c7b\u529f\u80fd\u6a21\u5757\u4e0d\u9700\u8981\u5927\u89c4\u6a21\u5b9e\u73b0\u81ea\u52a8\u5316\uff0c\u4e00\u4e24\u4e2a\u573a\u666f\u8986\u76d6\u57fa\u672c\u529f\u80fd\u5c31\u884c\u4e86\uff0c\u56e0\u6b64\u6211\u4eec\u5728\u6311\u9009\u6b64\u7c7b\u7528\u4f8b\u7684\u65f6\u5019\u53ef\u4ee5\u7ed3\u5408\u6574\u4e2a\u529f\u80fd\u6a21\u5757\u7684\u8986\u76d6\u60c5\u51b5\u6765\u51b3\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6","title":"6. \u9700\u8981\u4f9d\u8d56\u4eba\u5de5\u4ecb\u5165\u7684","text":"\u81ea\u52a8\u5316\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\u662f\u6ca1\u6709\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bd4\u5982\u8981\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u90a3\u4e48\u5c31\u80cc\u79bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u3002 \u6bd4\u5982\u5149\u9a71\u6a21\u5757\uff0c\u5149\u9a71\u523b\u5f55\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u4f46\u662f\u5149\u9a71\u523b\u5f55\u4e4b\u540e\u5149\u76d8\u4f1a\u5f39\u51fa\u6765\uff0c\u9700\u8981\u4eba\u5de5\u66f4\u6362\u5149\u76d8\uff0c\u518d\u624b\u52a8\u63a8\u8fdb\u5149\u9a71\u4e2d\u3002 \u8fd9\u79cd\u529f\u80fd\u6a21\u5757\u5373\u4f7f\u505a\u81ea\u52a8\u5316\uff0c\u80fd\u6d89\u53ca\u5230\u7684\u529f\u80fd\u975e\u5e38\u6709\u9650\uff0c\u800c\u4e14\u4e0d\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u6240\u4ee5\u660e\u663e\u5c31\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7","title":"7. \u96be\u4ee5\u5b9e\u73b0\u7684","text":"\u7528\u4f8b\u6240\u6d89\u53ca\u5230\u7684\u65b9\u6cd5\u5b9e\u73b0\u8d77\u6765\u53ef\u80fd\u6709\u96be\u5ea6\uff0c\u751a\u81f3\u73b0\u9636\u6bb5\u65e0\u6cd5\u5b9e\u73b0\u7684\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002 \u6bd4\u5982\u5f71\u9662\u6d4b\u8bd5\u753b\u9762\u6e05\u6670\u5ea6\u3001\u6d41\u7545\u5ea6\u3001\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u4e4b\u540e\u7684\u89c6\u9891\u662f\u5426\u5b58\u5728\u5361\u987f\u7b49\u7528\u4f8b\uff0c\u73b0\u9636\u6bb5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#8","title":"8. \u529f\u80fd\u4e0d\u7a33\u5b9a","text":"\u8fd9\u4e2a\u4e0d\u662f\u8bf4\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\uff0c\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\u4e0d\u7a33\u5b9a\u662f\u6b63\u5e38\u7684\uff0c\u8fd9\u79cd\u6211\u4eec\u53ef\u4ee5\u7b49\u5f00\u53d1\u63d0\u6d4b\u4e4b\u540e\u518d\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u3002 \u529f\u80fd\u4e0d\u7a33\u5b9a\u6307\u7684\u662f\u7528\u4f8b\u6240\u6d89\u53ca\u7684\u529f\u80fd\uff0c\u53ef\u80fd\u5b58\u5728\u591a\u79cd\u53d8\u5316\uff0c\u6bcf\u6b21\u6267\u884c\u7528\u4f8b\u53ef\u80fd\u65ad\u8a00\u7684\u9884\u671f\u90fd\u4e0d\u540c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#9","title":"9. \u52a8\u6001\u65ad\u8a00","text":"\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u76f4\u5230\u7528\u4f8b\u7ed3\u675f\uff0c\u4e00\u76f4\u662f\u4e00\u4e2a\u52a8\u6001\u53d8\u5316\u7684\u8fc7\u7a0b\uff0c\u800c\u4e14\u65e0\u6cd5\u901a\u8fc7\u5176\u4ed6\u624b\u6bb5\u505c\u4e0b\u6765\uff1b \u6bd4\u5982\uff1a\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u65f6\uff0c\u53f3\u4e0b\u89d2\u7684\u5f55\u5236\u65f6\u95f4\u662f\u4e00\u76f4\u5728\u53d8\u5316\u7684\uff0c\u7528\u4f8b\u9700\u8981\u6d4b\u8bd5\u5f55\u52361\u5206\u949f\u4e4b\u540e\uff0c\u5f55\u5236\u65f6\u95f4\u662f\u521a\u597d\u505c\u572860\u79d2\uff1b \u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fd8\u505a\u4e0d\u5230\u65f6\u95f4\u7cbe\u51c6\u63a7\u5236\uff0c\u7a0b\u5e8f\u6267\u884c\u65f6\u95f4\u662f\u6709\u6ce2\u52a8\u7684\uff0c\u800c\u4e14\u8981\u9002\u914d\u591a\u4e2a\u5e73\u53f0\uff0c\u6240\u4ee5\u6b64\u7c7b\u7528\u4f8b\u5927\u6982\u7387\u4f1a\u6267\u884c\u5931\u8d25\u3002\u7279\u522b\u662f\u5728\u6027\u80fd\u8f83\u5dee\u7684\u56fd\u4ea7\u5316\u67b6\u6784\u4e0a\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u592a\u53ef\u80fd\u7a33\u5b9a\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#10","title":"10. \u63a2\u7d22\u6027\u6d4b\u8bd5","text":"\u63a2\u7d22\u6027\u6d4b\u8bd5\u901a\u5e38\u662f\u4e00\u4e9b\u4e0d\u786e\u5b9a\u7684\u64cd\u4f5c\uff0c\u591a\u53d8\u5207\u590d\u6742\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u9884\u671f\u4e5f\u53ef\u80fd\u662f\u4e0d\u786e\u5b9a\u7684\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u9a9a\u64cd\u4f5c\u592a\u591a\u4e86\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6b64\u7c7b\u7528\u4f8b\u9002\u5408\u91c7\u7528\u624b\u5de5\u6d4b\u8bd5\uff0c\u662f\u624b\u5de5\u6d4b\u8bd5\u771f\u6b63\u7684\u4ef7\u503c\u4f53\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#11","title":"11. \u6613\u7528\u6027\u6d4b\u8bd5","text":"\u5bf9\u4e8e\u6613\u7528\u6027\u7684\u5224\u65ad\u901a\u5e38\u662f\u4e3b\u89c2\u7684\uff0c\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\u5f88\u96be\u53bb\u5b9a\u4e49\u4ec0\u4e48\u6837\u7684\u60c5\u51b5\u5bf9\u7528\u6237\u662f\u6613\u7528\u7684\uff0c\u81ea\u52a8\u5316\u9700\u8981\u6709\u660e\u786e\u7684\u53ef\u5b9e\u73b0\u7684\u9884\u671f\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_2","title":"\u4e8c\u3001\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u524d\u9762\u8bb2\u4e86\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u4e00\u4e9b\u7528\u4f8b\u60c5\u51b5\uff0c\u6709\u540c\u5b66\u5c31\u8bf4\u4e86\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\u4e0d\u7528\u8bb2\u4e86\uff0c\u5c31\u662f\u4e0d\u9002\u5408\u7684\u53cd\u9762\u3002\u6ca1\u6bdb\u75c5\u54c8\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\uff0c\u6211\u4eec\u5927\u4f53\u8fd8\u53ef\u4ee5\u5206\u4e3a\u4e24\u7c7b\uff1a \u7b2c\u4e00\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u597d\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u7b2c\u4e8c\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u4e00\u822c\uff0c\u9700\u8981\u6295\u5165\u66f4\u591a\u7cbe\u529b\u624d\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u4ee5\u4e0b\u4ecb\u7ecd\u4e00\u4e9b\u6211\u4eec\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1_1","title":"1. \u64cd\u4f5c\u76f8\u5bf9\u7b80\u5355","text":"\u7528\u4f8b\u6b65\u9aa4\u76f8\u5bf9\u8f83\u5c11\uff0c\u8fd9\u79cd\u7528\u4f8b\u901a\u5e38\u662f\u4e00\u4e9b\u8def\u5f84\u5f88\u6d45\u7684\u7528\u4f8b\uff0c\u4e00\u822c\u4e5f\u662f\u4e00\u4e9b\u57fa\u7840\u7528\u4f8b\u3002\u7528\u4f8b\u7f16\u5199\u3001\u7ef4\u62a4\u90fd\u53ef\u4ee5\u8f7b\u677e\u641e\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2_1","title":"2. \u5bb9\u6613\u5b9e\u73b0","text":"\u73b0\u6709\u6280\u672f\u662f\u53ef\u5b9e\u73b0\u7684\uff0c\u6ca1\u6709\u96be\u5ea6\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3_1","title":"3. \u7ecf\u5e38\u7528\u4e8e\u56de\u5f52\u6d4b\u8bd5","text":"\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bcf\u6b21\u56de\u5f52\u6d4b\u8bd5\u5fc5\u987b\u8981\u6267\u884c\u7684\u7528\u4f8b\uff0c\u90a3\u4e48\u8fd9\u6761\u7528\u4f8b\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u3002 \u56de\u5f52\u6d4b\u8bd5\u65f6\u6211\u4eec\u9996\u5148\u5e94\u8be5\u4fdd\u8bc1\u5e94\u7528\u5386\u53f2\u57fa\u672c\u529f\u80fd\u6b63\u5e38\uff0c\u6240\u4ee5\u90a3\u4e9b\u6bcf\u6b21\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u90fd\u8981\u6267\u884c\u7684\u7528\u4f8b\u9002\u5408\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4_1","title":"4. \u529f\u80fd\u7a33\u5b9a\u7684\u6838\u5fc3\u529f\u80fd","text":"\u6d89\u53ca\u6838\u5fc3\u529f\u80fd\u7684\u7528\u4f8b\u662f\u6700\u6700\u91cd\u8981\u7684\u7528\u4f8b\uff0c\u4e5f\u662f\u6211\u4eec\u4ea4\u4ed8\u65f6\u5fc5\u987b\u8981\u4fdd\u8bc1\u8d28\u91cf\u7684\u76f8\u5173\u529f\u80fd\uff0c\u56e0\u6b64\u5e94\u8be5\u5c3d\u53ef\u80fd\u7684\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5_1","title":"5. \u8f93\u5165\u6570\u636e\u6d4b\u8bd5","text":"\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u901a\u5e38\u662f\u68c0\u9a8c\u88ab\u6d4b\u5e94\u7528\u63a5\u53d7\u6709\u6548\u6570\u636e\u3001\u62d2\u7edd\u65e0\u6548\u6570\u636e\u7684\u80fd\u529b\u3002\u5982\uff1a\u63d0\u4ea4\u8d85\u957f\u5b57\u7b26\u4e32\u3001\u7279\u6b8a\u5b57\u7b26\u4e32\u7b49\u7b49\u3002 \u6b64\u7c7b\u7528\u4f8b\u624b\u5de5\u6d4b\u8bd5\u5f88\u96be\u6bd4\u8f83\u5168\u9762\u7684\u8986\u76d6\u5230\u6240\u6709\u7684\u8f93\u5165\u60c5\u51b5\uff0c\u4f46\u662f\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\uff0c\u6b64\u7c7b\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u90fd\u662f\u4e00\u6837\u7684\uff0c\u53d8\u5316\u7684\u4ec5\u662f\u8f93\u5165\u53c2\u6570\u548c\u65ad\u8a00\u7ed3\u679c\uff0c\u91c7\u7528\u6570\u636e\u9a71\u52a8\uff0c\u53ef\u4ee5\u8f7b\u677e\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6_1","title":"6. \u683c\u5f0f\u8986\u76d6","text":"\u539f\u56e0\u540c\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u7c7b\u7528\u4f8b\u4e00\u6837\uff0c\u591a\u79cd\u683c\u5f0f\u7684\u8986\u76d6\u4e5f\u662f\u4e00\u4e2a\u5f88\u7e41\u7410\u7684\u4e8b\u60c5\uff0c\u4ea4\u7ed9\u81ea\u52a8\u5316\u6765\u505a\u518d\u5408\u9002\u4e0d\u8fc7\u4e86\u3002 \u6bd4\u5982\u5f71\u9662\u5bf9\u5f71\u7247\u683c\u5f0f\u7684\u68c0\u67e5\u3001\u622a\u56fe\u5f55\u5c4f\u5bf9\u4fdd\u5b58\u683c\u5f0f\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7_1","title":"7. \u68c0\u67e5\u5143\u7d20\u72b6\u6001","text":"\u67e5\u770b\u88ab\u6d4b\u5e94\u7528\u7684\u5143\u7d20\u5c5e\u6027\u3002\u5982\uff1a\u56fe\u7247\u7684\u5927\u5c0f\u548c\u6392\u5217\uff1b\u6309\u94ae\u7684\u53ef\u7528\u548c\u4e0d\u53ef\u7528\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/","title":"AT \u7ecf\u9a8c\u603b\u7ed3","text":"\u6b22\u8fce\u6240\u6709\u4eba\u63d0\u4ea4\u4f60\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u9762\u7684\u4f18\u79c0\u5b9e\u8df5\u7ecf\u9a8c\uff0c\u4ee5\u5e2e\u52a9\u5927\u5bb6\u89e3\u51b3\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#1","title":"1\u3001\u7ec8\u7ed3\u5668","text":"# litaoa@uniontech.com\n \u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4 pytest \u5b9e\u73b0\u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4\u7684\u65b9\u5f0f\u6709\u4e24\u79cd\uff0cyield \u548c\u7ec8\u7ed3\u51fd\u6570\uff1b yield \u5b9e\u73b0\uff0cyield\u524d\u9762\u4e3a\u7528\u4f8b\u7684\u524d\u7f6e\u6b65\u9aa4\uff0cyield \u540e\u9762\u4e3a\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4\u3002 @pytest.fixture\ndef clean_env():\nprint(\"setup\")\nyield\nprint(\"teardown\")\n \u7ec8\u7ed3\u51fd\u6570\u5b9e\u73b0\uff0c\u4f7f\u7528 request.addfinalizer \u6ce8\u518c\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4 @pytest.fixture\ndef clean_env(request):\ndef clean():\nprint(\"teardown\")\nrequest.addfinalizer(clean)\nprint(\"setup\")\n yield\u7684\u4f18\u7f3a\u70b9\uff1a \u4f18\u70b9\uff1a\u4ee3\u7801\u7b80\u6d01\uff0c\u76f4\u89c2\uff0c\u53ef\u4f7f\u7528yield\u5728\u7528\u4f8b\u4e2d\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c \u7f3a\u70b9\uff1a\u82e5\u524d\u7f6e\u6b65\u9aa4\u4e2d\u51fa\u73b0\u9519\u8bef\uff0c\u5219\u540e\u7f6e\u6b65\u9aa4\u4e0d\u4f1a\u6267\u884c \u7ec8\u7ed3\u51fd\u6570\uff1a \u4f18\u70b9\uff1a\u524d\u7f6e\u6b65\u9aa4\u5931\u8d25\u7684\u8bdd\uff0c\u540e\u7f6e\u6b65\u9aa4\u4ecd\u4f1a\u6267\u884c\u4e14\u53ef\u4ee5\u6ce8\u518c\u591a\u4e2a\u540e\u7f6e\u6b65\u9aa4\uff08\u524d\u63d0\uff1a\u9700\u8981\u5728\u4ee3\u7801\u62a5\u9519\u4e4b\u524d\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff09\uff0c\u652f\u6301\u7075\u6d3b\u4f7f\u7528\u540e\u7f6e\u6761\u4ef6 \u7f3a\u70b9\uff1a\u4ee3\u7801\u8f83\u4e3a\u590d\u6742\uff0c\u65e0\u6cd5\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c\uff08\u672c\u4eba\u76ee\u524d\u672a\u5b9e\u73b0\uff09 \u603b\u7ed3\uff1a\u5728\u524d\u7f6e\u6b65\u9aa4\u4fdd\u8bc1\u7edd\u5bf9\u4e0d\u4f1a\u51fa\u9519\u65f6\uff0c\u4f7f\u7528yield\u66f4\u4f73\u7b80\u4fbf\uff0c\u5f53\u524d\u7f6e\u6b65\u9aa4\u6613\u51fa\u73b0\u95ee\u9898\u65f6\uff0c\u63a8\u8350\u4f7f\u7528\u7ec8\u7ed3\u51fd\u6570\u3002 \u573a\u666f\uff1a\u4fdd\u9669\u7bb1\u7528\u4f8b\uff0c\u524d\u7f6e\u6b65\u9aa4\u4e2d\u5f00\u542f\u4fdd\u9669\u7bb1\uff0c\u540e\u7f6e\u6b65\u9aa4\u5220\u9664\u4fdd\u9669\u7bb1\u3002 @pytest.fixture(scope=\"session\", autouse=True)\ndef vault_fixture(request):\nDfmWidget.reset_vault_by_cmd() # 1\u3001\u91cd\u7f6e\u4fdd\u9669\u7bb1\nDdeDockPublicWidget().close_file_manager_by_cmd() # 2\u3001\u5173\u95ed\u6587\u7ba1\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 3\u3001\u5f00\u542f\u6587\u7ba1\nvault = DfmWidget()\nvault.create_file_vault() # 4\u3001\u521b\u5efa\u4fdd\u9669\u7bb1\ndef delete_vault(): # 8\u3001\u5220\u9664\u4fdd\u9669\u7bb1\u7684\u540e\u7f6e\u6b65\u9aa4\nsleep(2)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr()\nvault = DfmWidget()\nvault.delete_file_vault()\nDfmWidget.reset_vault_by_cmd()\nDdeDockPublicWidget().close_file_manager_by_cmd()\nrequest.addfinalizer(delete_vault) # 5\u3001\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\nDdeDockPublicWidget().close_file_manager_by_cmd() # 6\u3001\u5173\u95ed\u6587\u7ba1\nsleep(1)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 7\u3001\u5f00\u542f\u6587\u7ba1\n \u4ee3\u7801\u6309\u6ce8\u91ca\u4e2d\u7684\u5e8f\u53f7\u6267\u884c\u6b65\u9aa4 \u4ee3\u7801\u5728\u6b65\u9aa41-4\u4efb\u610f\u4f4d\u7f6e\u62a5\u9519\uff0c\u5219\u4e0d\u4f1a\u6267\u884c\u6b65\u9aa48\uff0c\u56e0\u4e3a\u672a\u6267\u884c\u5230\u6b65\u9aa45\uff0c\u6b65\u9aa48\u8fd8\u672a\u6ce8\u518c \u4ee3\u7801\u5728\u6b65\u9aa46-7\u62a5\u9519\uff0c\u4ecd\u4f1a\u6267\u884c\u6b65\u9aa47\uff0c\u56e0\u4e3a\u5728\u6b65\u9aa45\u4e2d\u5df2\u7ecf\u5c06\u6b65\u9aa47\u6ce8\u518c \u53ef\u4ee5\u7075\u6d3b\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff0c\u80fd\u5b9e\u73b0\u67d0\u4e2a\u524d\u7f6e\u6b65\u9aa4\u6267\u884c\u4e4b\u540e\uff0c\u624d\u4f1a\u6267\u884c\u540e\u7f6e\u6b65\u9aa4\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#2","title":"2\u3001\u542f\u52a8\u5e94\u7528\u7684\u65b9\u5f0f","text":"# huangmingqiang@uniontech.com\n \uff081\uff09\u547d\u4ee4\u884c\u542f\u52a8 \u5728 AT \u4ee3\u7801\u4e2d\u4f7f\u7528\u547d\u4ee4\u884c\u542f\u52a8\u5e94\u7528\uff0c\u4e3e\u4f8b\uff1a os.popen(\"deepin-music\")\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f7f\u7528 ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6\uff0cdogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u3002 \uff082\uff09\u901a\u8fc7 UI \u64cd\u4f5c\u542f\u52a8 \u901a\u8fc7\u4efb\u52a1\u680f\u3001\u542f\u52a8\u5668\u3001\u684c\u9762\u7b49UI\u65b9\u5f0f\u542f\u52a8\uff0c\u6bd4\u5982\u53cc\u51fb\u6253\u5f00\u3001\u53f3\u952e\u6253\u5f00\u7b49\uff0c\u8fd9\u79cd\u64cd\u4f5c\u65b9\u5f0f\u4e0d\u5b58\u5728ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6dogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u7684\u95ee\u9898\uff0c\u4e5f\u66f4\u52a0\u7b26\u5408\u7528\u6237\u7684\u64cd\u4f5c\u884c\u4e3a\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#3","title":"3\u3001\u6587\u4ef6\u9009\u62e9\u6846\u5c5e\u6027\u5b9a\u4f4d\u5076\u73b0\u65e0\u6cd5\u627e\u5230","text":"\u6587\u4ef6\u9009\u62e9\u6846\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5728\u8c03\u7528\u6587\u4ef6\u9009\u62e9\u6846\u65f6\uff0c\u6709\u4e00\u5b9a\u7684\u6982\u7387\u51fa\u73b0\uff0c\u754c\u9762\u5df2\u7ecf\u6e32\u67d3\u51fa\u6765\u4e86\uff0c\u4f46\u662f\u5c5e\u6027\u6811\u5e76\u6ca1\u6709\u5199\u5165\uff0c\u5bfc\u81f4\u901a\u8fc7\u5c5e\u6027\u65e0\u6cd5\u627e\u5230\u5143\u7d20\uff0c\u76ee\u524d\u4e5f\u6ca1\u6709\u5f88\u597d\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u4e3a\u4e86\u7528\u4f8b\u7a33\u5b9a\u6027\uff0c\u6587\u4ef6\u9009\u62e9\u6846\u7684\u64cd\u4f5c\u5efa\u8bae\u4f7f\u7528UI\u6216\u8005\u56fe\u7247\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u53ef\u4ee5\u901a\u8fc7\u641c\u7d22\u5185\u5bb9\u56fa\u5b9a\u6587\u4ef6\u4f4d\u7f6e\u3002 # litaoa@uniontech.com\n desk = DdeDesktopPublicWidget()\n# \u9009\u62e9\u89c6\u9891\u76ee\u5f55\ndesk.click_videos_dir_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.ctrl_f()\nsleep(1)\ndesk.input_message(\"\u5143\u7d20\u540d\u79f0\")\nsleep(0.5)\ndesk.enter()\nsleep(1)\n# \u9009\u62e9\u7b2c\u4e00\u4e2a\u6587\u4ef6\ndesk.click_list_view_btn_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.click_first_file_in_desktop_plugs_by_ui()\nsleep(1)\n# \u6587\u7ba1\u63d2\u4ef6\u4e2d\u70b9\u51fb\u6253\u5f00\ndesk.click_open_btn_in_desktop_plugs_by_ui()\n"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#4","title":"4\u3001\u5e94\u7528\u542f\u52a8","text":"# mikigo\n \u5728UI\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u4e00\u5207\u64cd\u4f5c\u7684\u90fd\u662f\u4ece\u5e94\u7528\u542f\u52a8\u5f00\u59cb\u7684\uff0c\u800c\u5728Linux\u684c\u9762\u5e94\u7528\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u6211\u4eec\u542f\u52a8\u5e94\u7528\u7684\u65b9\u6cd5\u6709\u591a\u79cd\uff0c\u4e0b\u9762\u505a\u4e00\u4e2a\u7b80\u5355\u7684\u4ecb\u7ecd\uff1a \u3010\u4f7f\u7528dogtail\u542f\u52a8\u3011 dogtail\u63d0\u4f9b\u4e86\u5e94\u7528\u542f\u52a8\u7684\u65b9\u6cd5\uff0c\u5728utils\u5e93\u4e2d\uff0c\u4f7f\u7528run\u65b9\u6cd5\u542f\u52a8\uff1a \u9996\u5148\u5bfc\u5165\u65b9\u6cd5\uff1a from dogtail.utils import *\n \u8c03\u7528run\u65b9\u6cd5 run('deepin-music')\n \u5373\u53ef\u542f\u52a8\u97f3\u4e50 \u8fd9\u79cd\u65b9\u6cd5\u7684\u4f18\u70b9\u662f\u91c7\u7528\u8fdb\u7a0b\u7684\u65b9\u5f0f\u76f4\u63a5\u542f\u52a8\uff0c\u4e0d\u4f9d\u8d56\u4e0eUI\uff0c\u65e0\u8bba\u684c\u9762\u6216\u4efb\u52a1\u680f\u4e0a\u662f\u5426\u5b58\u5728\u5e94\u7528\u56fe\u6807\uff0c\u90fd\u53ef\u4ee5\u6b63\u5e38\u542f\u52a8\u3002 \u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c \u5982\u679c\u4f7f\u7528ssh\u8fdc\u7a0b\u8c03\u7528\uff0c\u6216\u8005Jenkins\u4e2d\u6267\u884c\u6d4b\u8bd5\u811a\u672c\u7684\u65f6\u5019\uff0c\u5728sniff\u4e2d\u4f1a\u51fa\u73b0\u627e\u4e0d\u5230\u5e94\u7528\uff0c\u7ecf\u8fc7\u5206\u6790\uff0c\u53ef\u80fd\u662f\u56e0\u4e3a\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\u542f\u52a8\u7684\u65f6\u5019\uff0c\u5b9e\u9645\u662f\u91c7\u7528\u4e00\u4e2a\u5b50\u8fdb\u7a0b\u542f\u52a8\u4e86\u5e94\u7528\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u5230\u3002 \u3010\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u3011 \u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807 \u901a\u5e38\u6709\u4e24\u79cd\u65b9\u6cd5\uff1a \uff081\uff09\u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807\u3002 \uff082\uff09\u5df2\u77e5\u5e94\u7528\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u7684\u4f4d\u7f6e\uff0c\u7136\u540e\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u5bf9\u5e94\u5750\u6807\u3002 \u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u7f3a\u70b9\u662f\u4f4d\u7f6e\u5fc5\u987b\u56fa\u5b9a\uff0c\u5982\u679c\u79fb\u52a8\u4f4d\u7f6e\u5c31\u4e0d\u884c\u4e86\uff0c\u800c\u4f7f\u7528\u7b2c\u4e00\u79cd\u65b9\u6cd5\uff0c\u65e0\u8bba\u4f4d\u7f6e\u5728\u54ea\u91cc\uff0c\u53ea\u8981\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u5b58\u5728\u5373\u53ef\u3002 \u3010\u70b9\u51fb\u684c\u9762\u56fe\u6807\u542f\u52a8\u3011 \u684c\u9762\u56fe\u6807\u76ee\u524d\u662f\u91c7\u7528\u56fe\u50cf\u8bc6\u522b\u6280\u672f\uff0c\u5b9a\u4f4d\u5230\u5e94\u7528\u56fe\u6807\u7684\u5750\u6807\uff0c\u7136\u540e\u901a\u8fc7pyauogui\u8fdb\u884c\u70b9\u51fb\u64cd\u4f5c\u3002 \u8be6\u7ec6\u6280\u672f\u65b9\u6848\u53ef\u4ee5\u53c2\u8003\u6211\u7684\u53e6\u5916\u4e24\u7bc7\u535a\u5ba2: \u57fa\u4e8eopencv\u7684\u6a21\u677f\u5339\u914d\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd4\u56de\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 Python\u4e09\u65b9\u5e93PyAutoGui\u7684\u4f7f\u7528\u65b9\u6cd5 \u3010\u4ece\u542f\u52a8\u5668\u542f\u52a8\uff08\u4fd7\u79f0\u5f00\u59cb\u83dc\u5355\uff09\u3011 \u542f\u52a8\u4e2d\u542f\u52a8\u7684\u5b9e\u73b0\u903b\u8f91\u5b9e\u9645\u548c\u4efb\u52a1\u680f\u4e0a\u542f\u52a8\u5dee\u4e0d\u591a\u3002 \u9996\u5148\uff0c\u9700\u8981\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u542f\u52a8\u5668\u56fe\u6807\uff0c\u6216\u8005\u952e\u76d8super\u952e\uff0c\u5c06\u542f\u52a8\u5668\u547c\u51fa\u6765\uff0c \u7136\u540e\uff0c\u5728\u542f\u52a8\u5668\u4e2d\u70b9\u51fb\u5bf9\u5e94\u7684\u56fe\u6807\uff0c \u4f46\u662f\u8fd9\u91cc\u6709\u4e2a\u95ee\u9898\uff0c\u542f\u52a8\u5668\u4e2d\u7684\u5e94\u7528\u5217\u8868\uff0c\u4e00\u9875\u5c55\u793a\u4e0d\u5b8c\uff0c\u6240\u4ee5\u5982\u679c\u6211\u4eec\u8981\u70b9\u51fb\u7684\u5e94\u7528\u56fe\u6807\u4e0d\u5728\u7b2c\u4e00\u9875\u600e\u4e48\u529e\uff0c\u901a\u5e38\u89e3\u51b3\u65b9\u6848\u6709\u4e24\u79cd\uff1a \uff081\uff09\u9700\u8981\u8fdb\u884c\u5411\u4e0b\u6ed1\u52a8\uff0c\u8fd9\u91cc\u5c31\u6d89\u53ca\u5230\u76f8\u5e94\u7684\u8bc6\u522b\u65b9\u6848\uff0c\u5224\u65ad\u5982\u679c\u4e0d\u5728\u7b2c\u4e00\u9875\u5c31\u5f80\u4e0b\u6ed1\u52a8\u7ffb\u9875\u3002 \uff082\uff09\u542f\u52a8\u5668\u63d0\u4f9b\u641c\u7d22\u7684\u529f\u80fd\uff0c\u8f93\u5165\u5e94\u7528\u540d\u79f0\u641c\u7d22\uff0c\u7136\u540e\u8fdb\u884c\u70b9\u51fb\u3002 \u4ece\u5b9e\u9645\u64cd\u4f5c\u4e2d\u6765\u770b\uff0c\u91c7\u7528\u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u6548\u7387\u4f1a\u9ad8\u4e00\u70b9\u3002 \u3010\u7ec8\u7aef\u547d\u4ee4\u542f\u52a8\u3011 \u5728python\u4e2d\uff0c\u4f7f\u7528os.popen()\u6216os.system()\u6216\u8005subprocess.Popen()\uff0c\u5b9e\u73b0\u547d\u4ee4\u884c\u542f\u52a8\uff0c\u6bd4\u5982\uff1a import os\nos.popen('deepin-music')\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u8fdc\u7a0b\u6267\u884c\u811a\u672c\u7684\u65f6\u5019\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u7684\u95ee\u9898\u3002 \u3010\u603b\u7ed3\u3011 \u4ee5\u4e0a\u51e0\u79cd\u65b9\u6cd5\uff0c\u5404\u6709\u4f18\u7f3a\u70b9\uff0c\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff1a \uff081\uff09\u5982\u679c\u9700\u8981\u5728Jenkins\u4e2d\u505a\u6301\u7eed\u96c6\u6210\uff0c\u5efa\u8bae\u4f7f\u7528\u7b2c\u4e8c\u79cd\u4efb\u52a1\u680f\u542f\u52a8\u7684\u65b9\u6cd5\u3002 \uff082\uff09\u5982\u679c\u4e0d\u4f1a\u91c7\u7528\u8fdc\u7a0b\u6267\u884c\u7684\uff0c\u5efa\u8bae\u91c7\u7528\u7b2c\u4e00\u79cd\u6216\u8005\u6700\u540e\u4e00\u79cd\u65b9\u6848\u3002 \uff083\uff09\u7b2c\u4e09\u79cd\u548c\u7b2c\u56db\u79cd\u542f\u52a8\u65b9\u6cd5\uff0c\u901a\u5e38\u5728\u6d4b\u8bd5\u7528\u4f8b\u4e2d\u4f1a\u6d89\u53ca\u5230\uff0c\u6240\u4ee5\u5076\u5c14\u4f1a\u7528\u3002"},{"location":"RELEASE/","title":"\u7248\u672c\u66f4\u65b0\u8bb0\u5f55","text":""},{"location":"RELEASE/#220202395","title":"2.2.0\uff082023/9/5\uff09","text":"new \u6b63\u5f0f\u542f\u7528 letmego \u6280\u672f\u65b9\u6848\uff1b fix \u5bf9 docs \u91cc\u9762\u7ec6\u5316\u4e86\u8fdc\u7a0b\u6267\u884c\u7ae0\u8282\u7684\u63cf\u8ff0\uff1b "},{"location":"RELEASE/#2152023831","title":"2.1.5\uff082023/8/31\uff09","text":"new \u5c06\u6709\u8da3\u7684\u6587\u6863\u7cfb\u7edf\u8fc1\u79fb\u5230 linuxdeepin \uff0c\u5265\u79bb\u6587\u6863\u4e2d\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u91c7\u7528 CDN \u52a0\u901f\u65b9\u5f0f\u52a0\u8f7d\uff1b \u5c1d\u8bd5\u5408\u5165\u4e00\u4e2a\u6709\u8da3\u7684\u529f\u80fd\uff1b fix \u4fee\u590d\u4e86 Wayland \u952e\u9f20\u5de5\u5177\u6ca1\u6709\u9f20\u6807\u76f8\u5bf9\u79fb\u52a8\u65b9\u6cd5 moveRel \u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 Wayland \u4e0b\u83b7\u53d6\u7a97\u53e3\u4fe1\u606f\u529f\u80fd\u6a21\u5757\u4e2d\u73af\u5883\u53d8\u91cf\u7684\u95ee\u9898\uff1b \u4f18\u5316\u4e86 startproject \u529f\u80fd\u7684\u4e00\u4e9b\u4fe1\u606f\u8f93\u51fa\uff1b \u4fee\u590d\u4e86\u7279\u6b8a\u573a\u666f\u4e0b env_dev.sh \u5f00\u53d1\u73af\u5883\u90e8\u7f72\u662f\u53ef\u80fd\u5f71\u54cd\u5230\u6b63\u5f0f\u73af\u5883 env.sh \u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#2122023822","title":"2.1.2\uff082023/8/22\uff09","text":"new \u589e\u52a0 OCR \u8bc6\u522b\u81ea\u52a8\u91cd\u8bd5\u673a\u5236\uff0c\u9ed8\u8ba4\u91cd\u8bd5 2 \u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u91cd\u8bd5\u6b21\u6570\uff1b \u4f7f\u7528\u7a97\u7ba1\u6700\u65b0\u63d0\u4f9b\u7684\u4e8c\u8fdb\u5236\u63a5\u53e3\uff0c\u4f18\u5316\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u5728 Wayland \u4e0b\u83b7\u53d6\u7a97\u53e3\u4fe1\u606f\u7684\u65b9\u6cd5\uff1b\u611f\u8c22\u684c\u9762\u6d4b\u8bd5\u90e8 @\u4f55\u6743 @\u5b59\u7fe0 \u3001\u7a97\u7ba1\u7814\u53d1 @\u9ec4\u6cfd\u94ed \u7684\u5927\u529b\u652f\u6301\u3002 \u6269\u5145 skipif \u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\u51fd\u6570\uff1a skipif_xdg_type \u652f\u6301 x11 \u6216 wayland \u4e0a\u8df3\u8fc7\uff1b skipif_cpu_name \u652f\u6301\u4e0d\u540c cpu \u4e0a\u8df3\u8fc7\uff0c\u6bd4\u5982\uff1askipif_cpu_name-KLVVW5821\uff1b "},{"location":"RELEASE/#2102023818","title":"2.1.0\uff082023/8/18\uff09","text":"fix \u4fee\u590d SW \u67b6\u6784\u73af\u5883\u4f9d\u8d56\u7684\u95ee\u9898\uff0c\u539f\u56e0\u662f\u4e4b\u524d\u6211\u8fd9\u91cc\u672c\u5730\u6ca1\u6709 SW \u7684\u673a\u5668\uff0c\u6ca1\u6709\u505a\u76f8\u5173\u9002\u914d\uff1b \u4fee\u590d\u5b50\u9879\u76ee\u5355\u72ec\u9700\u8981\u4e09\u65b9\u5305 pexpect\uff0c\u7531\u4e8e\u4e4b\u524d\u662f\u9884\u88c5\u5230\u955c\u50cf\u91cc\u9762\u7684\uff0c\u4f46\u57fa\u7840\u6846\u67b6\u4e0d\u9700\u8981\uff0c\u56e0\u6b64\u6ca1\u6709\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u91cc\u9762\uff0c\u5bfc\u81f4\u5b50\u9879\u76ee\u4f9d\u8d56\u62a5\u9519\u3002 \u4fee\u590d\u5b50\u9879\u76ee cv \u5bfc\u5165\u62a5\u9519\u7684\u95ee\u9898\uff1b \u539f\u56e0\u4e3a\uff1ayouqu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u517c\u5bb9\u4e24\u79cd\u60c5\u51b5\uff0c\u4e00\u79cd\u662f\u9762\u5411\u670d\u52a1\uff0c\u5c31\u662f\u672c\u5730\u6d4b\u8bd5\u673a\u4e0d\u9700\u8981\u5b89\u88c5 OpenCV\uff0c\u7528\u4f8b\u4e2d\u7684\u56fe\u50cf\u8bc6\u522b\u4f1a\u901a\u8fc7\u8fdc\u7a0b\u670d\u52a1\u63a5\u53e3\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u548c\u7ed3\u679c\u83b7\u53d6\uff1b\u7b2c\u4e8c\u79cd\u662f\u539f\u751f\uff0c\u5c31\u662f\u672c\u5730\u76f4\u63a5\u5b89\u88c5 OpenCV \u76f4\u63a5\u7528\u3002\u4e24\u4e2a\u60c5\u51b5\u7684\u4f18\u5148\u7ea7\u662f\u4f18\u5148\u5224\u65ad\u672c\u5730\u5b58\u5728\uff0c\u5426\u5219\u8d70\u670d\u52a1\u3002 \u524d\u9762\u6211\u4eec\u5df2\u7ecf\u628a OCR \u529f\u80fd\u505a\u4e86\u670d\u52a1\u5316\uff0c\u57fa\u4e8e 1 \u5e74\u591a\u4ee5\u6765\u7684\u89c2\u5bdf\uff0c\u7528\u8d77\u6765\u5f88\u7a33\u5b9a\uff0c\u518d\u4e00\u4e2a\u5c31\u662f OpenCV \u5b89\u88c5\u5305\u662f\u6bd4\u8f83\u81c3\u80bf\u7684\uff0c\u7c97\u7565\u6570\u4e86\u4e0b\u4f9d\u8d56\u6709 30+ \u4e2a\uff0c\u800c\u4e14\u5728\u5404\u67b6\u6784\u4e0a\u4f9d\u8d56\u5305\u8fd8\u4e0d\u5c3d\u76f8\u540c\uff0c\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u65b9\u6848\u4e2d\u4e0d\u592a\u597d\u5904\u7406\uff0c\u6240\u4ee5\u672c\u6b21 2.0 \u7248\u672c\u6211\u4eec\u5927\u80c6\u7684\u5c06\u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u529f\u80fd\u4fee\u6539\u4e3a\u9762\u5411\u670d\u52a1\u7684\u65b9\u5f0f\uff0c\u524d\u671f\u6d4b\u8bd5\u4e00\u5207\u770b\u8d77\u6765\u90fd\u5f88\u548c\u8c10\u3002 \u4f46\u662f\u6ca1\u6ce8\u610f\u5230\u4e4b\u524d\u7ed9\u6d77\u71d5\u59d0\u90a3\u8fb9\u9879\u76ee\u5355\u72ec\u5b9a\u5236\u505a\u4e86\u4e2a\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\uff08\u4e3a\u4e86\u80fd\u7b80\u5355\u5e73\u6ed1\u7684\u8fc1\u79fb\u5230 youqu\uff09\uff0c\u6b64\u63a5\u53e3\u5e95\u5c42\u6ca1\u6709\u517c\u5bb9\u670d\u52a1\u5316\uff0c\u6240\u4ee5\u5979\u90a3\u8fb9\u7684\u9879\u76ee\u8c03\u7528\u6b64\u5b9a\u5236\u63a5\u53e3\u4f1a\u62a5 cv \u5bfc\u5165\u7684\u95ee\u9898\u3002 \u7531\u4e8e\u5c06\u8fd9\u4e2a\u5b9a\u5236\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\u8fdb\u884c\u670d\u52a1\u5316\u517c\u5bb9\u6539\u9020\u9700\u8981\u4e00\u5b9a\u65f6\u95f4\uff0c\u6539\u5b8c\u8fd8\u9700\u8981\u6d4b\u8bd5\uff0c\u4f46\u672c\u6b21\u65f6\u95f4\u6bd4\u8f83\u7d27\uff0c\u56e0\u6b64\u5148\u628a OpenCV \u88c5\u8fdb\u865a\u62df\u73af\u5883\uff0c\u540e\u7eed\u7248\u672c\u518d\u8003\u8651\u9488\u5bf9\u6b64\u63a5\u53e3\u505a\u4fee\u6539\u3002"},{"location":"RELEASE/#2002023816","title":"2.0.0\uff082023/8/16\uff09","text":"YouQu\uff08\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff09\u5f00\u6e90\u4e86\uff0c\u540c\u65f6\u63a8\u51fa\u4e86 2.0 \u7248\u672c\u3002 \u611f\u8c22\u738b\u6ce2\u603b\u3001\u67b6\u6784\u5e08\u5f90\u5c0f\u4e1c\u3001\u7814\u53d1\u7ecf\u7406\u90d1\u5e7c\u6208\u3001\u5218\u90d1\u7b49\u7814\u53d1\u540c\u4e8b\u7684\u5927\u529b\u652f\u6301\u3002 new 1\u3001\u65b0\u7684\u57fa\u7840\u6846\u67b6\u4ee3\u7801\u83b7\u53d6\u65b9\u5f0f\u53ca\u65b0\u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4 YouQu \u540e\u7eed\u5747\u901a\u8fc7 PyPI \u8fdb\u884c\u5305\u7684\u53d1\u5e03\uff0c\u4e5f\u5c31\u662f\u8bf4\u540e\u7eed\u53ef\u4ee5\u4f7f\u7528 pip \u8fdb\u884c\u5b89\u88c5\uff1a sudo pip3 install youqu==2.0.0\n \u8fd9\u91cc\u6709 2 \u4e2a\u5c0f\u70b9\u8981\u6ce8\u610f\uff1a \u63a8\u8350\u4f7f\u7528 sudo pip3 \uff08\u52a0 sudo\uff09\u8fdb\u884c\u5b89\u88c5\uff1b \u5982\u679c\u4e0d\u52a0 sudo \u6709\u4e9b\u673a\u5668\u53ef\u80fd $HOME/.local/bin \u4e0d\u5728\u7cfb\u7edf PATH \u73af\u5883\u76ee\u5f55\u4e0b\uff0c\u5728\u4e0d\u6dfb\u52a0\u73af\u5883\u53d8\u91cf\u7684\u60c5\u51b5\u4e0b\uff0c\u4f1a\u51fa\u73b0 YouQu \u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4\uff08youqu-startproject\uff09\u65e0\u6cd5\u4f7f\u7528\u7684\u95ee\u9898\uff1b \u5f53\u7136\uff0c\u5c06\u4e0a\u8ff0\u8def\u5f84\u6dfb\u52a0\u5230\u73af\u5883\u53d8\u91cf\u4e4b\u540e\u4e5f\u662f\u53ef\u4ee5\u7528\u7684\uff0c\u6240\u4ee5\u6211\u8fd9\u91cc\u662f\u63a8\u8350\u52a0 sudo\uff0c\u4e0d\u52a0 sudo \u4e5f\u662f\u53ef\u4ee5\u7684\uff0c\u53ea\u662f\u9700\u8981\u5173\u6ce8\u4e0b\u73af\u5883\u53d8\u91cf\u7684\u95ee\u9898\u3002 \u63a8\u8350\u6307\u5b9a\u7248\u672c\u53f7\uff08youqu==2.0.0\uff09\u5b89\u88c5\uff0c\u5982\u679c\u4e0d\u6307\u5b9a\u7248\u672c\u53f7\u9ed8\u8ba4\u662f\u5b89\u88c5\u6700\u65b0\u53d1\u5e03\u7684 YouQu \u7248\u672c\uff0c\u4f60\u53ef\u4ee5\u5728 PyPI \u4e0a\u7684 Release history \u91cc\u9762\u67e5\u770b\u6709\u54ea\u4e9b\u7248\u672c\u3002 \u5b89\u88c5\u4e4b\u540e\u4f1a\u81ea\u52a8\u751f\u6210\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu-startproject\uff0c\u4f7f\u7528\u5b83\u53ef\u4ee5\u521d\u59cb\u5316\u5de5\u7a0b\uff0c\u8fd9\u91cc\u4ee5\u97f3\u4e50\u4e3e\u4f8b\uff1b youqu-startproject autotest_deepin_music\n \u8fd9\u6837\u5c31\u4f1a\u5728\u5f53\u524d\u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a autotest_deepin_music \u76ee\u5f55\uff0c\u91cc\u9762\u5305\u542b\u4e86\u57fa\u7840\u6846\u67b6\u6240\u6709\u7684\u4ee3\u7801\uff1b \u4e4b\u540e\uff0c\u8fd8\u662f\u5728 apps \u76ee\u5f55\u4e0b\uff0c\u653e\u5165\u5b50\u9879\u76ee\u7684AT\u4ee3\u7801\u5373\u53ef\uff0c\u4f7f\u7528\u65b9\u6cd5\u548c\u8fc7\u53bb\u4e00\u6837\uff0c\u8fd9\u91cc\u5c31\u4e0d\u591a\u4ecb\u7ecd\u3002 \u53e6\u5916\uff0c\u9664\u4e86\u901a\u8fc7 pip \u83b7\u53d6\u4ee5\u5916\uff0c\u4ecd\u7136\u53ef\u4ee5\u901a\u8fc7\u6e90\u7801\u83b7\u53d6\uff08\u76f4\u63a5 git clone\uff09\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u4f7f\u7528 pip \u5b89\u88c5 YouQu \u65f6\uff0cYouQu \u5305\u7684\u5927\u5c0f\u624d 600+ k\uff0c\u5b89\u88c5\u901f\u5ea6\u8d77\u98de\u3002 2\u3001\u65b0\u7684AT\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848 \u4e3a\u4e86\u89e3\u51b3\u4ee5\u4e0b\u95ee\u9898\uff1a \u8fc7\u53bb\u4e00\u6bb5\u65f6\u95f4\u54b1\u4eec\u7ecf\u5e38\u51fa\u73b0\u7684\uff0c\u4e0d\u540c\u7684AT\u9879\u76ee\u5728\u540c\u4e00\u53f0\u673a\u5668\u4e0a\u90e8\u7f72\u73af\u5883\u65f6\u4f9d\u8d56\u7248\u672c\u51b2\u7a81\u7684\u95ee\u9898\uff0c\u65b0\u65b9\u6848\u4e0d\u540c\u7684\u9879\u76ee\u4f1a\u52a8\u6001\u751f\u6210\u81ea\u5df1\u7684\u865a\u62df\u73af\u5883\uff0c\u76f8\u4e92\u4e4b\u95f4\u4e0d\u5f71\u54cd\uff1b \u4e1a\u5185\u4e3a\u4e86\u89e3\u51b3\u7248\u672c\u51b2\u7a81\u95ee\u9898\u4e00\u822c\u90fd\u4f1a\u4f7f\u7528Python\u865a\u62df\u73af\u5883\u7684\u5de5\u5177\uff0c\u4f46\u662f\u90fd\u6709\u4e2a\u95ee\u9898\uff0c\u65e0\u6cd5\u7ba1\u7406 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u5305\uff0c\u672c\u6b21\u6211\u4eec\u89e3\u51b3\u4e86\u8fd9\u4e2a\u95ee\u9898\uff0c\u80fd\u591f\u5b8c\u5168\u7ba1\u7406\u5e38\u89c4\u7684Python\u5305\uff0c\u4e5f\u80fd\u7ba1\u7406\u5230 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u4e09\u65b9\u5305\uff1b \u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u4f7f\u7528\u65b9\u6cd5\uff1a bash env.sh\n \u53ef\u4ee5\u770b\u51fa\u6765\u548c\u539f\u6765\u4f7f\u7528\u65b9\u6cd5\u6ca1\u6709\u53d8\u5316\uff0c\u4e5f\u5c31\u662f\u8bf4\u4ece\u4f7f\u7528\u7684\u89d2\u5ea6\u662f\u5b8c\u5168\u6ca1\u6709\u533a\u522b\u7684\uff0c\u53ea\u662f\u5185\u90e8\u505a\u4e86\u4e0d\u540c\u7684\u4e8b\u60c5\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u672c\u673a\u90e8\u7f72\u7684\u529f\u80fd\u4ecd\u7136\u4fdd\u7559 env_dev.sh\uff0c\u53ef\u4ee5\u4f5c\u4e3a\u5f00\u53d1\u65f6\u7684\u73af\u5883\u90e8\u7f72\u3002 3\u3001\u65b0\u7684\u9a71\u52a8\u547d\u4ee4 \u8fc7\u53bb\u54b1\u4eec\u90fd\u662f\u4f7f\u7528\u8fd9\u6837\u7684\u547d\u4ee4\u6765\u9a71\u52a8\u6267\u884c\uff1a python3 manage.py run\n \u7531\u4e8e\u9ed8\u8ba4\u57fa\u4e8e\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848\uff0c\u56e0\u6b64\u6211\u4eec\u589e\u52a0\u4e86\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu\uff1b \u65b0\u7684\u9a71\u52a8\u65b9\u5f0f\uff1a youqu manage.py run\n \u53ea\u9700\u8981\u628a python3 \u66ff\u6362\u6210 youqu \u5c31\u53ef\u4ee5\u4e86\uff0c\u770b\u8d77\u6765\u5f88\u548c\u8c10~ 4\u3001\u65b0\u7684\u6587\u6863\u5730\u5740 \u8fc7\u53bb\u54b1\u4eec YouQu \u7684\u5728\u7ebf\u6587\u6863\u662f\u90e8\u7f72\u5728\u516c\u53f8\u5185\u7f51\u7684\uff0c\u73b0\u5728\u5f00\u6e90\u5230 github \u4e86\uff0c\u5916\u90e8\u5f00\u53d1\u8005\u80af\u5b9a\u8bbf\u95ee\u4e0d\u5230\u5185\u7f51\u7684\u6587\u6863\uff0c\u56e0\u6b64\u9700\u8981\u5c06\u6587\u6863\u90e8\u7f72\u5230\u516c\u7f51\u3010\u516c\u7f51\u6587\u6863\u3011\uff1b \u516c\u7f51\u6587\u6863\u4f7f\u7528\u7684\u662f github pages\uff08\u767d\u5ad6\u602a\u4e00\u987f\u72c2\u559c~~\uff09\uff0c\u4f46\u53ef\u80fd\u4f1a\u51fa\u73b0\u6587\u6863\u901f\u5ea6\u6162\u7684\u95ee\u9898\uff08\u4ee3\u7406\u4e0b\u5c31\u597d\u4e86\uff09\uff0c\u4e0d\u8fc7\u6ca1\u5173\u7cfb\uff0c\u54b1\u4eec\u3010\u5185\u7f51\u6587\u6863\u3011\u4ecd\u7136\u4fdd\u7559\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u3002 5\u3001\u5176\u4ed6\u4e00\u4e9b\u5c0f\u5c0f\u529f\u80fd\u66f4\u65b0\uff1a \uff081\uff09\u65b0\u589e\u5173\u95ed\u5206\u8fa8\u7387\u68c0\u6d4b\u7684\u53c2\u6570\u503c\uff1b youqu manage.py run --resolution no\n \u6216\u8005\u4fee\u6539 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387, \u6bd4\u5982\uff1a1920x1080\n;no: \u8868\u793a\u4e0d\u505a\u5206\u8fa8\u7387\u6821\u9a8c\nRESOLUTION = 1920x1080\n resolution \u8fd9\u4e2a\u53c2\u6570\u4e00\u76f4\u90fd\u6709\u7684\uff0c\u53ea\u4e0d\u8fc7\u4e4b\u524d\u662f\u7528\u4e8e\u6307\u5b9a\u5206\u8fa8\u7387\u5927\u5c0f\uff0c\u6bd4\u5982 --resolution 1920x1080\uff0c\u4f46\u6709\u4e9b\u63a5\u53e3\u7684\u9879\u76ee\u4e0d\u9700\u8981\u8fd9\u4e2a\u68c0\u67e5\uff0c\u53ef\u4ee5\u7ed9\u5b83\u4e2a no \u5c31\u597d\u4e86\uff0c\u5f53\u7136 CICD \u4e0a\u5173\u95ed\uff0c\u9700\u8981\u6d41\u6c34\u7ebf\u4e0a\u628a\u8fd9\u4e2a\u53c2\u6570\u52a0\u4e0a\uff1b \uff082\uff09\u65b0\u589e\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u7684\u547d\u4ee4\u884c\u53c2\u6570 \u4e4b\u524d\u8fd9\u4e2a\u914d\u7f6e\u9879\u53ea\u80fd\u5728 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c 1 \u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff0cRERUN >= RECORD_FAILED_CASE\u3002\n;1.\u5173\u95ed\u5f55\u5c4f\uff1aRECORD_FAILED_CASE > RERUN\n;2.\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1aRECORD_FAILED_CASE = 0\nRECORD_FAILED_CASE = 1\n \u73b0\u5728\u5c06\u5f00\u53d1\u5230\u547d\u4ee4\u884c\u53c2\u6570\u3002 youqu manage.py run --record_failed_case 2\n fix \u4fee\u590d remote \u6267\u884c\u65f6\uff0c\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u65e0\u6cd5\u751f\u6210\u6d4b\u8bd5\u62a5\u544a\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1302023710","title":"1.3.0\uff082023/7/10\uff09","text":"fix \u8fdb\u4e00\u6b65\u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b\u53c2\u8003\uff1a\u914d\u7f6ePython\u6e90\u7684\u51e0\u79cd\u65b9\u6cd5 \u4fee\u590d wayland_autotool \u53d7\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86wayland\u4e0b\u5076\u73b0\u627e\u4e0d\u5230 .Xauthority \u6587\u4ef6\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1292023626","title":"1.2.9\uff082023/6/26\uff09","text":"fix \u4f18\u5316\u8fdc\u7a0b\u6267\u884c remote \u7684\u53c2\u6570\u76f4\u63a5\u4f20\u7ed9\u8fdc\u7a0b\u673a\u5668\u7684 run \u547d\u4ee4\uff0c\u4e0d\u7528\u518d\u5355\u72ec\u5904\u7406\u8fdc\u7a0b\u6267\u884c\u7684\u53c2\u6570\u903b\u8f91\uff0c\u540e\u7eed\u4e13\u6ce8\u4e8e\u672c\u5730\u6267\u884c\u529f\u80fd\u5f00\u53d1\uff0c\u8fdc\u7a0b\u6267\u884c\u81ea\u52a8\u9002\u7528\uff1b env.sh \u79fb\u9664 pyyaml \u5b89\u88c5\uff0c\u7531\u5b50\u9879\u76ee\u5728 requirement.txt \u91cc\u9762\u5b9a\u4e49\uff0c\u6846\u67b6\u81ea\u52a8\u52a0\u8f7d\uff1b \u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b "},{"location":"RELEASE/#128202369","title":"1.2.8\uff082023/6/9\uff09","text":"fix \u4fee\u590d\u4e86 pypi \u5b89\u88c5 numpy \u5b58\u5728\u7cfb\u7edf\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#127202368","title":"1.2.7\uff082023/6/8\uff09","text":"fix env.sh \u4e2d\u5b89\u88c5 Python \u5305\u672a\u6307\u5b9a\u7248\u672c\u65f6\uff0c\u65e5\u5fd7\u8f93\u51fa\u5b89\u88c5\u7684\u7248\u672c\uff1b pdocr-rpc 2.0.1\nallure-custom 1.2.1\nfunnylog 1.1.3\n \u4fee\u590d -f \u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u62a5\u9519\u7684\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#126202367","title":"1.2.6\uff082023/6/7\uff09","text":"fix \u4fee\u590d wayland \u4e0a\u8c03\u7528\u9f20\u6807\u4e2d\u952e\u3001\u53f3\u952e\u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b \u4fee\u590d pubilic/dde_desktop_public_widget \u91cc\u9762\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u5b9a\u4f4d\u684c\u9762\u6587\u4ef6\u7684\u65b9\u6cd5\uff0c\u5750\u6807\u6ca1\u6709\u62c6\u5305\u7684\u95ee\u9898\uff1b \u4f18\u5316\u4e86\u7b49\u5f85\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b pycreeze \u7248\u672c\u5347\u7ea7\u5230 0.1.29\uff0c\u5bfc\u81f4\u4e0e pyautogui 0.9.53 \u4e0d\u517c\u5bb9\uff0cenv.sh \u91cc\u9762\u589e\u52a0\u6307\u5b9a pycreeze \u7248\u672c\u4e3a 0.1.28\uff1b "},{"location":"RELEASE/#1252023516","title":"1.2.5\uff082023/5/16\uff09","text":"new --app \u53c2\u6570\u540e\u9762\u65b0\u589e\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u76ee\u524d\u652f\u6301\u4e09\u79cd\u53c2\u6570\u4f20\u5165\u65b9\u5f0f\uff1a ~$: youqu run -a deepin-music\n~$: youqu run -a autotest_deepin_music\n~$: youqu run -a apps/autotest_deepin_music\n \u200b \u540e\u4e24\u79cd\u5165\u53c2\u65b9\u5f0f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\u3002 remote \u8fdc\u7a0b\u6267\u884c\u65b0\u589e\u4ece\u547d\u4ee4\u884c\u4f20\u5165\u6d4b\u8bd5\u673a\u4fe1\u606f\uff0c\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679c password \u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6 setting/remote.ini \u4e2d CLIENT_PASSWORD \u7684\u503c,\u6bd4\u5982\uff1auos@10.8.13.33:1 \u6216 uos@10.8.13.33 \uff1b python3 manage.py remote -c uos@10.8.13.33/uos@10.8.13.34\npython3 manage.py remote -c uos@10.8.13.33:1/uos@10.8.13.34:2\n fix \u65e5\u5fd7\u6a21\u5757\u4fee\u6539\u4e3a\u51fd\u6570\u6267\u884c\u4e4b\u524d\u6253\u5370\u65e5\u5fd7\uff1b \u65e5\u5fd7\u6a21\u5757\u589e\u52a0\u767d\u540d\u5355\uff0c\u901a\u8fc7\u7c7b\u540d\u5f00\u5934\uff0c\u7ed3\u675f\uff0c\u5305\u542b\u7b49\u5173\u952e\u5b57\u63a7\u5236\u9700\u8981\u6253\u5370\u7684\u51fd\u6570\u65e5\u5fd7\uff1b \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5982\u679c\u4f20\u5165\u4e86 app_name \u53ea\u4f1a\u5c06 apps \u76ee\u5f55\u4e0b app_name \u7684\u76ee\u5f55\u53d1\u9001\u5230\u6d4b\u8bd5\u673a\uff1b env.sh \u79fb\u9664 python3-dev\uff1b \u4fee\u590d Wayland \u4e0b env.sh \u73af\u5883\u5b89\u88c5\u5931\u8d25\u7684\u95ee\u9898\uff0c\u4f18\u5316\u4e86 deb \u4f9d\u8d56\u5b89\u88c5\u7684\u903b\u8f91\uff1b \u5c06 env.sh \u5237\u65b0\u6e90\u7684\u65e5\u5fd7\u5728\u7ec8\u7aef\u663e\u793a\uff0c\u89e3\u51b3\u5728 CI \u73af\u5883\u4e0b\uff0c\u957f\u65f6\u95f4\u4e0d\u8f93\u51fa\u65e5\u5fd7\u8fde\u63a5\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d1060 \u534e\u4e3a\u673a\u578b\u5b89\u88c5\u952e\u9f20\u5de5\u5177\u65f6\u4f9d\u8d56\u4e0d\u517c\u5bb9\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1242023227","title":"1.2.4\uff082023/2/27\uff09","text":"fix \u4fee\u6539 CURRENT \u6587\u4ef6\uff1b "},{"location":"RELEASE/#1232023227","title":"1.2.3\uff082023/2/27\uff09","text":"new pylint.sh \u652f\u6301\u901a\u8fc7\u4f4d\u7f6e\u53c2\u6570\u4f20\u5165\u6587\u4ef6\u8def\u5f84\uff1abash pylint.sh apps/autotest_deepin_music,\u597d\u5904\u662f\u53c2\u6570\u8def\u5f84\u53ef\u4ee5\u5728\u7ec8\u7aef\u8865\u5168\uff1b \u65b0\u589e\u7cfb\u7edf\u547d\u4ee4 youqu-pylint \uff0c\u7528\u4e8e\u9759\u6001\u4ee3\u7801\u626b\u63cf\uff0c\u4f7f\u7528\u65b9\u6cd5: youqu-pylint apps/autotest_deepin_music\uff1b \u7531\u4e8e\u7cfb\u7edf\u4e00\u4e9b dbus \u63a5\u53e3\u6539\u53d8\uff0c\u516c\u5171\u5e93\u4e2d\u7684 dbus \u65b9\u6cd5\u5c06\u4e0d\u518d\u7ef4\u62a4\uff0c\u7531\u5b50\u9879\u76ee\u5728 other_widget.py \u91cc\u9762\u8fdb\u884c\u7ef4\u62a4\uff1b fix \u4fee\u590d ssh \u73af\u5883\u4e0b\u8fd0\u884c\u63d0\u793a \u201c\u65e0\u6cd5\u8fde\u63a5\u201d \u7684\u95ee\u9898\uff1b \u4fee\u590d\u8fd0\u884c\u65f6\u7a0b\u5e8f\u9000\u51fa\uff0c\u4e0d\u8f93\u51fa\u5f02\u5e38\u65e5\u5fd7\u7684\u95ee\u9898\uff1b \u4fee\u590dyouqu remote xxx \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5728\u670d\u52a1\u7aef Ctrl + C \u65e0\u6cd5\u505c\u6b62\u7a0b\u5e8f\u8fd0\u884c\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#122202328","title":"1.2.2\uff082023/2/8\uff09","text":"new \u65b0\u589e\u6c14\u6ce1\u7c7b\u56fe\u50cf\u8bc6\u522b\u65b9\u6848\uff1bimage_utils.py::ImageUtil::get_during\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u533a\u57df\u8bc6\u522b\uff0c\u4f20\u5165 [x, y, w, h]\uff0cx: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u76ee\u6807\u56fe\u7247\uff0c\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\uff1b env.sh \u79fb\u9664 pypinyin; \u4f18\u5316\u6267\u884c env.sh \u65f6\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b manage.py \u79fb\u9664\u4e86\u53c2\u6570 session_timeout \uff0c\u6846\u67b6\u6839\u636e\u5168\u5c40\u7684 timeout \u4ee5\u53ca\u7528\u4f8b\u81ea\u5b9a\u4e49\u7684 timeout \u81ea\u52a8\u8ba1\u7b97\u51fa sessiontimeout \u7684\u503c\uff1b \u65b0\u589e ocr \u670d\u52a1\u5668\u94fe\u63a5\u91cd\u8bd5\uff0c\u9ed8\u8ba4\u91cd\u8bd51\u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u53c2\u6570\uff1b fix \u4fee\u590d\u4e86\u4e00\u4e9b pylint \u626b\u63cf\u7684\u4ee3\u7801\u98ce\u683c\u95ee\u9898\uff1b \u91cd\u65b0\u8bbe\u8ba1\u4e86\u6d4b\u8bd5\u62a5\u544a\u4e3b\u9898\uff1b "},{"location":"RELEASE/#121202316","title":"1.2.1\uff082023/1/6\uff09","text":"new \u652f\u6301\u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6267\u884c\u7528\u4f8b\uff1b\u53ef\u5c06python3 manage.py \u66ff\u6362\u4e3a youqu \uff1a youqu run -a deepin-music -k 001\n RPC \u670d\u52a1 IP \u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u6307\u5b9a\u4e0d\u540c\u7684\u7aef\u53e3\uff1b \u5728\u7ebf\u6587\u6863\u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u539f\u6765\u7684\u5730\u5740 10.8.10.215 \u5c06\u4e0d\u5728\u4f7f\u7528\uff1b fix \u4fee\u590d --count \u53c2\u6570\u53ef\u80fd\u51fa\u73b0\u4e0e\u5176\u4ed6\u6846\u67b6\u7684\u5de5\u7a0b\u4f9d\u8d56\u5b58\u5728\u51b2\u7a81\uff0c\u62a5\u9519\u91cd\u590d\u6ce8\u518c\u7684\u95ee\u9898\uff1b \u4fee\u590d CI \u73af\u5883\u4e0b\u591a\u4e2a\u5de5\u7a0b\u5b58\u5728 Python \u73af\u5883\u53d8\u91cf\u6307\u5411\u9519\u8bef\uff0c\u5bfc\u5305\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u5355\u72ec\u8fd0\u884c\u65b9\u6cd5\u65f6\u65e0\u65e5\u5fd7\u8f93\u51fa\u7684 Bug\uff1b "},{"location":"RELEASE/#12020221230","title":"1.2.0\uff082022/12/30\uff09","text":"1.1.4 \u7248\u672c\u9002\u914d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e14\u65b0\u589e\u4e86\u8f83\u591a\u65b0\u7279\u6027\uff0c\u6211\u4eec\u8ba1\u5212\u4f7f\u7528 1.1.4 \u7248\u672c\u8fd0\u884c\u4e00\u6bb5\u65f6\u95f4\uff0c1.2.0 \u7248\u672c\u5c06\u4fee\u590d\u671f\u95f4\u51fa\u73b0\u7684 Bug\uff0c\u7136\u540e\u4f5c\u4e3a\u7a33\u5b9a\u7248\u672c\u53d1\u5e03\u3002 new \u4fee\u6539\u5de5\u7a0b\u540d\u79f0\u4e3a youqu\uff1b \u5c06 sphinx \u6587\u6863\u5de5\u7a0b\u8fc1\u79fb\u5230\u5355\u72ec\u7684\u4ed3\u5e93\uff1b fix \u4fee\u590d startapp \u521b\u5efa\u5de5\u7a0b\u65f6\u5b58\u5728\u5de5\u7a0b\u540d\u79f0\u65f6\u65e0\u6cd5\u7ee7\u7eed\u521b\u5efa\uff1b \u4fee\u590d\u4e86 OCR \u670d\u52a1\u5728\u5e76\u53d1\u65f6\u53ef\u80fd\u51fa\u73b0\u65e0\u6cd5\u8fd4\u56de\u7ed3\u679c\u7684\u95ee\u9898\uff0c\u63d0\u5347 OCR \u670d\u52a1\u9ad8\u5e76\u53d1\u7a33\u5b9a\u6027\uff1b \u4fee\u590d PMS \u540c\u6b65\u6807\u7b7e\u5230 CSV \u6587\u4ef6\u4e0d\u652f\u6301\u7528\u4f8b\u5e93\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11420221214","title":"1.1.4\uff082022/12/14\uff09","text":"new \u65b0\u589e startapp \u5b50\u547d\u4ee4\u521b\u5efa\u5b50\u9879\u76ee\u5de5\u7a0b\u6a21\u677f: python3 manage.py startapp autotest_deepin_xxx \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u91cd\u590d\u6267\u884c\u6b21\u6570\uff1b \u53bb\u6389\u6279\u91cf\u6267\u884c\u524d\u6536\u96c6\u7528\u4f8b\u7684\u6b65\u9aa4\uff1b \u589e\u52a0\u5f00\u59cb\u6267\u884c\u65f6\u6253\u5370\u4e00\u4e9b\u6267\u884c\u53c2\u6570\uff0c\u5982\uff1a \u7528\u4f8b\u6536\u96c6\u6570\u91cf: 99\n\u5931\u8d25\u91cd\u8dd1\u6b21\u6570: 1\n\u6700\u5927\u5931\u8d25\u6b21\u6570: 49\n\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4: 200.0s (03\u520620\u79d2)\n\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4: 11880s (3\u5c0f\u65f618\u52060\u79d2)\n \u5b9a\u5236\u4fee\u6539allure\u62a5\u544alogo\u3001title\u3001\u9ed8\u8ba4\u8bed\u8a00\uff1b manage.py \u6267\u884c\u5f00\u59cb\u65f6\u6253\u5370 logo \u548c\u5f53\u524d\u7248\u672c\uff1a \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u255a\u2588\u2588\u2557 \u2588\u2588\u2554\u255d \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2584\u2584 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2580\u2580\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u2584\u2588 \u2584\u2588 \u2588 \u2588 \u2588 \u2584 \u2588 \u2584 \u2580\u2580\u2588 \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\uff1b \u88c5\u9970\u5668\u65b9\u6cd5\u6307\u5b9a\u6b21\u6570\uff1b @pytest.mark.count(2)\ndef test_music_001():\npass\n \u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u6b21\u6570\uff1b python3 manage.py run -a deepin-music -k 001 --count 2\n \u200b image_utils \u589e\u52a0\u51fd\u6570 save_temporary_picture\uff0c\u652f\u6301\u6307\u5b9a\u5c4f\u5e55\u533a\u57df\u622a\u56fe\u5e76\u8fd4\u56de\u56fe\u7247\u5b58\u653e\u7684\u672c\u5730\u8def\u5f84\uff0c\u540e\u7eed\u4f7f\u7528 assert_image_exist \u8fdb\u884c\u65ad\u8a00 Python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(x, y, width, height) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) button_center \u65b0\u589e btn_size \u83b7\u53d6\u63a7\u4ef6\u5de6\u4e0a\u89d2\u5750\u6807\u53ca\u957f\u5bbd\uff0c\u7528\u4e8e\u52a8\u6001\u7684\u622a\u53d6\u5143\u7d20\u7684\u56fe\u7247\uff0c\u53ef\u7528\u4e8e\u5b9a\u4f4d\u65ad\u8a00 python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u6240\u6709\u97f3\u4e50\u6309\u94ae\")) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) allure \u62a5\u544a\u4e2d\u5b9a\u4f4d\u95ee\u9898\u9664\u4e86\u65e5\u5fd7\u3001\u622a\u56fe\u3001\u5f55\u5c4f\u5916\uff0c\u8c03\u7528\u7684\u51fd\u6570\u589e\u52a0\u4e86 step \u6b65\u9aa4\u5c55\u793a\uff1b env.sh \u65b0\u589e\u5b89\u88c5\u5b50\u9879\u76ee Python \u4e09\u65b9\u4f9d\u8d56\uff0c\u5728\u5b50\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u5199 requirement.txt \u6587\u4ef6\uff0cenv.sh \u4f1a\u81ea\u52a8\u52a0\u8f7d\uff1b ocr \u8bc6\u522b\u65b0\u589e\u652f\u6301\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\u8fdb\u884c\u6587\u5b57\u8bc6\u522b\uff0c\u51cf\u5c11\u56e0\u5168\u5c4f\u8bc6\u522b\u65f6\uff0c\u5176\u4ed6\u6587\u5b57\u7684\u5e72\u6270 Python # \u65ad\u8a00\u97f3\u4e50\u7684\u5220\u9664\u5f39\u7a97\u4e2d\uff0c\u5305\u542b\u4e86\u201c\u786e\u8ba4\u201d\u7684\u6587\u5b57 self.assert_ocr_exist(\"\u786e\u8ba4\", picture_abspath=DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u5220\u9664\u5f39\u7a97\"))) \u65ad\u8a00\u51fd\u6570\u7684\u8c03\u7528\u4e5f\u4f1a\u81ea\u52a8\u6253\u5370\u65e5\u5fd7; env.sh \u65b0\u589e\u88c1\u526a\u4f9d\u8d56\u7684\u65b9\u6848\uff1b fix \u4fee\u590d Jenkins \u73af\u5883\u4e0b\uff0c apps \u76ee\u5f55\u4e0b\u5b50\u9879\u76ee\u5b58\u5728 auotest_deepin_xxx@tmp \u76ee\u5f55\uff0c\u5728\u4f20\u5165 app_name \u540e\u65e0\u6cd5\u6267\u884c\u7528\u4f8b\u7684\u95ee\u9898\uff1b \u4fee\u590d\u81ea\u52a8\u751f\u6210 case_list.csv \u6587\u4ef6\u65f6\uff0c\u7528\u4f8b\u987a\u5e8f\u88ab\u8c03\u6574\u7684\u95ee\u9898\uff1b env.sh \u73af\u5883\u5b89\u88c5\u79fb\u9664 git \u548c curl\uff1b \u4fee\u590d\u7528\u4f8b\u5728 setup \u9636\u6bb5\u62a5\u9519\u540e\uff0c\u672a\u5199\u5165 ci_result.json \u7684\u95ee\u9898\uff1b \u79fb\u9664 uos_ci.py\uff1b "},{"location":"RELEASE/#11320221028","title":"1.1.3\uff082022/10/28\uff09","text":"new \u65b0\u589e\u56fe\u50cf\u65ad\u8a00\u6210\u529f\u8f93\u51fa\u5339\u914d\u5ea6\uff1b \u65b0\u589e\u73af\u5883\u5b89\u88c5 yaml \u4f9d\u8d56\uff1b \u65b0\u589e\u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6570\u636e\u56de\u586b\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b \u65b0\u589e\u6d4b\u8bd5\u7ed3\u679c\u8868\u60c5\u663e\u793a\uff0c\u5e76\u4f18\u5316\u4e86\u65e5\u5fd7\u7684\u6392\u7248\uff1b \u65b0\u589e --top {number} \u7528\u4e8e\u8bb0\u5f55\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0c\u65e5\u5fd7\u751f\u6210\u5230 report/logs/top.log\uff1b fix \u4fee\u590d\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4f46\u7ec8\u7aef\u6ca1\u6709\u9519\u8bef\u65e5\u5fd7\u8f93\u51fa\u7684\u95ee\u9898\uff1b \u4fee\u6539\u5931\u8d25\u7528\u4f8b\u56de\u6eaf\u65e5\u5fd7\u4e3a\u8be6\u7ec6\u7ea7\u522b\uff1b \u4fee\u590d\u4e86\u6267\u884c\u8fdb\u5ea6\u672a\u8ba1\u7b97\u8df3\u8fc7\u7528\u4f8b\u7684\u95ee\u9898\uff0c\u5e76\u4f18\u5316\u4e86\u8fdb\u5ea6\u83b7\u53d6\u7684\u7b97\u6cd5\uff1b \u4fee\u590d env.sh \u5728 V23 \u73af\u5883\u4e0b\u5b89\u88c5\u65e0\u6cd5\u8bfb\u53d6\u5bc6\u7801\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 pms \u6d4b\u8bd5\u5957\u6267\u884c\u6216\u6d4b\u8bd5\u5355\u6267\u884c\u65f6\uff0c\u7528\u4f8bID\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b env.sh \u91cc\u9762 hub.deepin.com \u66f4\u6362\u6210 it.uniontech.com\uff1b uos_ci.py \u6d4b\u8bd5\u7ed3\u679c\u7edf\u8ba1\u65f6\uff0c\u603b\u6570\u5254\u9664 skip \u7684\u6570\u91cf "},{"location":"RELEASE/#11220220921","title":"1.1.2\uff082022/09/21\uff09","text":"new \u5728\u6ca1\u6709\u5b89\u88c5 dogtail \u7684\u60c5\u51b5\u4e0b\uff0c\u4e5f\u80fd\u4f7f\u7528 sniff \u5de5\u5177\uff1b fix \u4fee\u590d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e2d\u6ca1\u6709\u5b89\u88c5 AT \u73af\u5883\u6267\u884c uos_ci.py \u62a5\u9519\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11120220919","title":"1.1.1\uff082022/09/19\uff09","text":"new \u65b0\u589e\u6267\u884c\u8fdb\u5ea6\u663e\u793a\uff0c\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u65f6\u65e5\u5fd7\u8f93\u51fa\u5f53\u524d\u8fdb\u5ea6\uff1a[\u5f53\u524d\u6307\u5b9a\u7b2c\u51e0\u6761/\u7528\u4f8b\u603b\u6570]\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u7528\u4f8b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\u6240\u6709\u5931\u8d25\u7528\u4f8b\u7684\u5217\u8868\uff1b \u5173\u95ed\u7ec8\u7aef\u8f93\u51fa\u6355\u83b7\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u65e5\u5fd7\u5feb\u7167\uff1b \u4f18\u5316\u7ec8\u7aef\u8f93\u51fa\u5931\u8d25\u4fe1\u606f\u5197\u957f\u4e3a\u7b80\u8981\u4fe1\u606f\u8f93\u51fa\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u663e\u793a 10 \u4e2a\u6267\u884c\u6700\u6162\u7684\u7528\u4f8b\u5217\u8868\uff0c\u5e76\u8be6\u7ec6\u5217\u51fa\u5404\u4e2a\u9636\u6bb5\u7684\u8017\u65f6\uff1b \u5931\u8d25\u91cd\u8dd1\u7528\u4f8b\u91cd\u8dd1\u4e4b\u524d\u5ef6\u8fdf 1 \u79d2\uff1b \u65b0\u589e\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4ecd\u7136\u5f3a\u5236\u6267\u884c\uff1b \u7528\u4f8b\u6536\u96c6\u65f6\u4ec5\u5728 apps \u76ee\u5f55\u4e0b\u8fdb\u884c\uff0c\u5ffd\u7565 src,setting,public \u76ee\u5f55\uff1b \u65b0\u589e allure \u62a5\u544a\u5907\u4efd\u529f\u80fd\uff0c\u9ed8\u8ba4\u5907\u4efd\u81f3 allure_back \u76ee\u5f55\u4e0b\uff1b manage.py\u65b0\u589e\u53c2\u6570 --lastfailed \u7528\u4e8e\u53ea\u8dd1\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\u7684\u529f\u80fd\uff1b fix \u4fee\u590d\u4e86\u5728\u6ca1\u6709\u6307\u5b9a\u5e94\u7528\u540d\u79f0\u6267\u884c\u65f6\uff0cxml \u62a5\u544a\u751f\u6210\u8def\u5f84\u5f02\u5e38\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 uos_ci.py \u4f20\u5165 timeout \u548c session_timeout \u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11020220916","title":"1.1.0\uff082022/09/16\uff09","text":"new \u65b0\u589ePMS\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u652f\u6301\u591a\u79cd\u6570\u636e\u56de\u586b\u6a21\u5f0f\uff1b \u4f18\u5316\u4e86\u901a\u8fc7\u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u65f6PMS \u722c\u866b\u7684\u6027\u80fd\uff1b \u65b0\u589e .gitmodules \u6587\u4ef6\uff0c\u7528\u4e8e\u6807\u8bb0\u6240\u6709\u5b50\u9879\u76ee\uff0c\u65b9\u4fbf\u7edf\u4e00\u62c9\u53d6\u4ee3\u7801\uff1b env.sh \u9002\u914d\u793e\u533a\u7248\u4e0a\u5b89\u88c5\u81ea\u52a8\u5316\u73af\u5883\uff1b \u589e\u52a0\u6267\u884c\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u9519\u8bef\u7684\u529f\u80fd\uff1b README.md \u589e\u52a0 Wayland \u4e0b\u4f7f\u7528\u3001\u6d4b\u8bd5\u62a5\u544a\u67e5\u770b\u3001\u5e38\u89c1\u95ee\u9898\u7b49\u7684\u6587\u6863\u8bf4\u660e\uff1b \u589e\u52a0\u4e86\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u5bf9 setup\u3001call\u3001teardown \u8fdb\u884c\u65e5\u5fd7\u5206\u6bb5\uff1b fix \u4fee\u590d\u4e86 \u786e\u8ba4\u4fee\u590d \u5217\u6ca1\u5199\u8868\u5934\uff0c\u4f46\u5199\u4e86 fixed-xxx \u6807\u7b7e\uff0c\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u540c\u4e00\u5e94\u7528\u5185\u591a\u4e2a csv \u6587\u4ef6\u4e2d \u786e\u8ba4\u4fee\u590d \u5217\u6709\u7684\u5199\u4e86\uff0c\u6709\u7684\u6ca1\u5199\uff0c\u53ef\u80fd\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 INFO \u65e5\u5fd7\uff0c\u663e\u793a\u4e3a DEBUG \u7684\u95ee\u9898\uff1b\u4fee\u590d\u4e86\u90e8\u5206\u673a\u5668\u4e0a INFO \u65e5\u5fd7\u5185\u5bb9\u663e\u793a\u4e3a\u7ea2\u8272\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\u770b\u4e0d\u5230\u8be6\u7ec6\u4fe1\u606f\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10220220822","title":"1.0.2\uff082022/08/22\uff09","text":"new \u79fb\u9664 loguru\uff0c\u66ff\u6362\u4e3a logging\uff0c\u63a5\u53e3\u4fdd\u6301\u4e0d\u53d8\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u53d7\u5f71\u54cd\uff1b \u9ed8\u8ba4\u5f00\u542f coredump\uff1b fix \u4fee\u590d\u4e86\u4e09\u65b9\u5e93 loguru \u5076\u73b0\u5f02\u5e38\uff0c\u5bfc\u81f4\u7a0b\u5e8f\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7b2c\u4e00\u6b21\u5931\u8d25\u4e0d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10120220812","title":"1.0.1\uff082022/08/12\uff09","text":"new \u65b0\u589e RELEASE.md \u6587\u4ef6\uff0c\u7528\u4e8e\u8bb0\u5f55\u5386\u53f2\u53d1\u5e03\u7248\u672c\u7684\u66f4\u65b0\u5185\u5bb9\uff1b \u517c\u5bb9 Wayland \u6a21\u5f0f\u4e0b\u6267\u884c\u7528\u4f8b\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u7528\u7ba1\u5f53\u524d\u6d4b\u8bd5\u673a\u6267\u884c\u73af\u5883\uff0c\u6846\u67b6\u4f1a\u81ea\u52a8\u6839\u636e\u5f53\u524d\u73af\u5883\u8d70\u4e0d\u540c\u7684\u4ee3\u7801\u903b\u8f91\uff1b \u7531\u4e8e\u9700\u8981\u4fee\u6539 dogtail \u6e90\u4ee3\u7801\uff0c\u56e0\u6b64\u5c06\u4fee\u6539\u540e\u7684\u6e90\u7801\u653e\u5165\u5230\u6838\u5fc3\u5e93\u91cc\u9762 src/depends/dogtail \u540e\u7eed\u7248\u672c\u5c06\u4e0d\u9700\u8981\u5728\u7cfb\u7edf\u4e2d\u5b89\u88c5dogtail\uff1b \u5982\u679c\u5e94\u7528\u5e93\u540c\u6837\u4f7f\u7528\u4e86\u7cfb\u7edf\u5b89\u88c5\u7684 dogtail \u53ef\u80fd\u4f1a\u62a5\u9519\uff0c\u89e3\u51b3\u65b9\u6848\u662f\u5c06\u4ee3\u7801\u4e2d\u7684 import dogtail \u4fee\u6539\u4e3a from src.depends import dogtail ; fix \u91cd\u8dd1\u5931\u8d25\u4e4b\u540e\u624d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff0c\u4fee\u6539\u4e3a\u5931\u8d25\u4e4b\u540e\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":"# Attribution \uff1achengdu Test Team\n# Date \uff1a2021/08/20\n \u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d \u4ed3\u5e93\u5730\u5740\uff1ahttps://gitlabcd.uniontech.com/autotest/cd-desktop-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u65b9\u6848\u6982\u8ff0","text":"\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u667a\u80fd\u8bc6\u522b\u5e94\u7528\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u7528\u4e8e\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u64cd\u4f5c\u8fc7\u7a0b\u4e2d\u7684\u5143\u7d20\u5b9a\u4f4d\u4ee5\u53ca\u5224\u65ad\u7ed3\u679c\u65f6\u7684\u65ad\u8a00\u5904\u7406\uff1b\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\uff0c\u6d4b\u8bd5\u673a\u4e0a\u7684\u753b\u9762\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u5230\u670d\u52a1\u5668\u4e0a\uff0c\u670d\u52a1\u5668\u5bf9\u89c6\u9891\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\u540e\uff0c\u670d\u52a1\u5668\u667a\u80fd\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\u6210\u529f\uff0c\u7136\u540e\u5bf9\u6d4b\u8bd5\u673a\u4e0b\u53d1\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\uff0c\u6d4b\u8bd5\u673a\u63a5\u53d7\u5e76\u6267\u884c\u4e0b\u4e00\u6b65\u64cd\u4f5c\u3002 \u670d\u52a1\u5668\u4e0e\u6d4b\u8bd5\u673a\u4e4b\u95f4\u7684\u94fe\u63a5\uff1a \u670d\u52a1\u5668\u901a\u8fc7 USB \u4e32\u53e3\u8bbe\u5907\uff08USB-HID \u534f\u8bae\uff09\u6a21\u62df\u9f20\u6807\u952e\u76d8\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u64cd\u4f5c\u3002 \u901a\u8fc7\u89c6\u9891\u91c7\u96c6\u8bbe\u5907\u6355\u83b7\u6d4b\u8bd5\u673a\u7684\u5b9e\u65f6\u753b\u9762\u4f20\u8f93\u7ed9\u670d\u52a1\u5668\u3002 \u670d\u52a1\u5668\u5bf9\u91c7\u96c6\u7684\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\uff0c\u8bc6\u522b\u5176\u4e2d\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5e76\u8fd4\u56de\u5143\u7d20\u63a7\u4ef6\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\uff0c\u670d\u52a1\u5668\u901a\u8fc7\u667a\u80fd\u5316\u5206\u6790\uff0c\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e00\u81f4\u5c06\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\u901a\u8fc7\u4e32\u53e3\u6a21\u62df\u952e\u9f20\u4fe1\u53f7\u53d1\u9001\u7ed9\u6d4b\u8bd5\u673a\uff1b\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e0d\u4e00\u81f4\u5c06\u4f1a\u8fdb\u5165\u4e2d\u65ad\u5904\u7406\u53ca\u5f02\u5e38\u7ed3\u679c\u8f93\u51fa\uff0c\u7ee7\u7eed\u6267\u884c\u540e\u7eed\u573a\u666f\uff0c\u76f4\u81f3\u6240\u6709\u7528\u4f8b\u6d4b\u8bd5\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u6df1\u5ea6\u5b66\u4e60\u73af\u5883\u642d\u5efa","text":"\u6a21\u578b\u8bad\u7ec3\u4e3b\u8981\u5bf9 GPU \u6709\u8981\u6c42\uff0c\u8bad\u7ec3\u6a21\u578b\u7684\u673a\u5668\u663e\u5b58\u4e0d\u4f4e\u4e8e 6G\uff0c\u5176\u4ed6\u914d\u7f6e\u65e0\u7279\u6b8a\u8981\u6c42\u3002 \u63a8\u8350\u6027\u4ef7\u6bd4\u8f83\u9ad8\u914d\u7f6e \u64cd\u4f5c\u7cfb\u7edf: UnionTech OS Desktop 20 Professional Linux version 4.19.0-desktop-amd64 (deepin@deepin-PC) (Uos 8.3.0.3-3+rebuild) \u5904\u7406\u5668: Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz (\u516b\u6838 / \u5341\u516d\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460M-HDV(RD)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))/8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: TU116 [GeForce GTX 1660]\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u865a\u62df\u73af\u5883\u5b89\u88c5","text":"cd ~\nwget -c https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh\nbash Miniconda3-latest-Linux-x86_64.sh\n \u4e00\u8def\u56de\u8f66 \u7b2c\u4e00\u6b21\u63d0\u793a\u8f93\u5165 yes/no \uff1a\u8f93\u5165 yes \u7ee7\u7eed\u4e00\u8def\u56de\u8f66 \u7b2c\u4e8c\u6b21\u63d0\u793a\uff1a\u8f93\u5165 no cd ~/miniconda3/bin\nsudo chmod 777 activate\n \u6fc0\u6d3bconda\u73af\u5883 . ./activate\n \u6dfb\u52a0\u516c\u53f8\u5185\u7f51\u6e90 conda config --add channels bioconda\nconda config --add channels conda-forge\n \u5982\u679c\u662f\u5916\u7f51\u6dfb\u52a0\u5916\u7f51\u6e90 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/\n \u5982\u679c\u8981\u5220\u9664\u6e90 conda config --remove-key channels\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"2\u3001\u5b89\u88c5\u4f9d\u8d56","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u521b\u5efa\u865a\u62df\u73af\u5883","text":"conda remove --name mmlab --all # \u79fb\u9664\u6240\u6709\u865a\u62df\u73af\u5883\n conda create -n mmlab python=3.7\n conda activate mmlab\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-pytorch","title":"\uff082\uff09\u5b89\u88c5 Pytorch","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install torch==1.7.0+cu101 torchvision==0.8.1+cu101 torchaudio==0.7.0 -f https://download.pytorch.org/whl/torch_stable.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-mmcv","title":"\uff083\uff09\u5b89\u88c5 MMCV","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install mmcv-full==1.3.3 -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.7.0/index.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"\uff084\uff09\u5b89\u88c5\u663e\u5361\u9a71\u52a8","text":"\u6839\u636e\u4f60\u7684\u663e\u5361\u4e0b\u8f7d\u5bf9\u5e94\u9a71\u52a8\uff0c\u6bd4\u5982\u6211\u7684\u663e\u5361\u4e3a GTX1660\uff0c\u9a71\u52a8\u7248\u672c\u4e3a 430\uff0c\u9a71\u52a8\u4e0b\u8f7d\u5730\u5740\uff1ahttps://www.nvidia.cn/Download/Find.aspx?lang=cn CTRL+ALT+F2 \u8fdb\u5165tty\n \u7981\u7528 nouveau \u9a71\u52a8 sudo vim /etc/modprobe.d/blacklist-nouveau.conf\n \u586b\u5165\uff1a blacklist nouveau options nouveau modeset=0\n \u5237\u65b0\u914d\u7f6e\u6587\u4ef6 sudo update-initramfs -u reboot \u91cd\u542f\u540e\u518d\u8fdb\u5165 tty \u5173\u95ed\u56fe\u50cf\u754c\u9762\uff0c\u8f93\u5165\u547d\u4ee4\u5173\u95ed\u56fe\u50cf\u754c\u9762 sudo service lightdm stop\n \u5b89\u88c5\u9a71\u52a8 sudo chmod a+x NVIDIA-Linux-x86_64-430.run\nsudo ./NVIDIA-Linux-x86_64-430.run\n reboot\u91cd\u542f\uff0cnvidia-smi\u67e5\u770b\u5b89\u88c5\u72b6\u6001\u3002\u6ce8\u610f\u770b\u4e0bcuda\u7248\u672c\uff0c10.1\uff0cdriver\u7248\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u6570\u636e\u6807\u6ce8","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u6570\u636e\u6807\u6ce8","text":"\u6807\u6ce8\u4e4b\u524d\u9700\u8981\u5148\u8f6c\u6362\u56fe\u7247\u5927\u5c0f\uff0c\u5e76\u4e14\u4ee5\u6570\u5b57\u547d\u540d\uff0c\u6bcf\u7ec4\u547d\u540d\u9012\u589e"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"\uff081\uff09\u8f6c\u6362\u5927\u5c0f\u5e76\u91cd\u547d\u540d","text":"rename_pic.py import os\nimport sys\nimport cv2\nimport time\nimport getpass\nusername = getpass.getuser()\nsource_path = f\"/home/{username}/Desktop/right_menu\" # \u56fe\u7247\u8def\u5f84\nsource_dest = os.path.join('/'.join(source_path.split(\"/\")[:-1]), 'tmp')\nif not os.path.exists(source_dest):\nos.mkdir(source_dest)\nstart_name = sys.argv[1]\nfile_name_list = list()\nfor file in os.listdir(source_path):\nif file.endswith('.png'):\nfile_name_list.append(file)\nstart_name = int(start_name)\nfor file in file_name_list:\nos.rename(os.path.join(source_path,file), os.path.join(source_path, f\"{str(start_name)}.png\"))\nstart_name += 1\ntime.sleep(1)\nfor file in os.listdir(source_path):\nimage = os.path.join(source_path, str(file))\nsrc = cv2.imread(image)\nresult = cv2.resize(src, (960, 540))\nresizeImage = os.path.join(source_dest, str(file))\nprint(resizeImage)\ncv2.imwrite(str(resizeImage), result)\ncv2.waitKey(0)\ncv2.destroyAllWindows()\ntime.sleep(1)\nos.system(f'rm -rf {source_path}/*')\nos.system(f'mv {source_dest}/* {source_path}')\nos.system(f'rm -rf {source_dest}')\nprint(\"\u4e0b\u4e00\u4e2a\u5e8f\u53f7\uff1a\", start_name)\n \u6839\u636e\u7ec8\u7aef\u8f93\u51fa\u7684\u4e0b\u4e00\u4e2a\u5e8f\u53f7\u7684\u63d0\u793a\uff0c\u6267\u884c Python \u6587\u4ef6\u7684\u65f6\u5019\u4f20\u53c2\u3002 python rename_pic.py 249\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"\uff082\uff09\u5de5\u5177\u6807\u6ce8","text":"\u4f7f\u7528\u5de5\u5177 labelImg \u6807\u6ce8 sudo pip3 install PyQt5==5.13\nsudo pip3 install labelImg\n \u7ec8\u7aef\u76f4\u63a5\u8f93\u5165 labelImg\uff0c\u56de\u8f66 \u6807\u6ce8\u6a21\u5f0f\u9009\u62e9\uff1aPascalVOC"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u667a\u80fd\u6807\u6ce8","text":"\u6253\u5f00\u5c4f\u5e55\u5f55\u5236\u8f6f\u4ef6\uff0c\u5f55\u5236\u624b\u52a8\u64cd\u4f5c\u4e00\u6b21\u6d4b\u8bd5\u7528\u4f8b\uff0c\u7136\u540e\u5c06\u5f55\u5236\u7684\u89c6\u9891\u8fdb\u884c\u5206\u5e27\uff0c\u7136\u540e\u5bf9\u6bd4\u524d\u4e24\u5e27\u56fe\u6807\u76f8\u4f3c\u5ea6\uff0c\u5254\u9664\u76f8\u4f3c\u5ea6\u8fc7\u9ad8\u7684\u56fe\u7247\uff0c\u5728\u4fdd\u8bc1\u7d20\u6750\u591a\u6837\u6027\u7684\u524d\u63d0\u4e0b\uff0c\u5254\u9664\u91cd\u590d\u591a\u4f59\u7684\u56fe\u7247\u751f\u6210\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u96c6\uff0c\u7136\u540e\u53d6\u51fa\u63a7\u4ef6\u6a21\u677f\u6570\u636e\u96c6\uff0c\u901a\u8fc7 OpenCV \u6a21\u677f\u5339\u914d\u83b7\u53d6\u63a7\u4ef6\u5728\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u56fe\u7247\u4e2d\u6240\u5728\u7684\u5de6\u4e0a\u3001\u5de6\u4e0b\u3001\u53f3\u4e0a\u3001\u53f3\u4e0b\u56db\u5904\u5750\u6807\uff0c\u4ece\u800c\u6839\u636e\u6a21\u677f\u6570\u636e\u96c6\u751f\u6210\u6807\u6ce8\u6570\u636e\u3002\u53c2\u8003\u76ee\u5f55 AnnotationMaterial"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"\uff081\uff09\u6a21\u677f\u6570\u636e\u96c6\u51c6\u5907","text":"1\u3001\u5728\u754c\u9762\u622a\u53d6\u9700\u8981\u6807\u6ce8\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u653e\u5728\u76ee\u5f55\u4e0b AnnotationMaterial/template/img 2\u3001\u7ef4\u62a4\u63a7\u4ef6\u540d\u4e0e\u5143\u7d20\u63a7\u4ef6\u7684\u952e\u5bf9\uff0c\u4e00\u4e2a\u63a7\u4ef6\u540d\u53ef\u5bf9\u5e94\u591a\u4e2a\u5143\u7d20\u63a7\u4ef6 menu:\n- menu.jpg\n- menu1.jpg\n- menu2.jpg\n- menu3.jpg\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"\uff082\uff09\u7d20\u6750\u96c6\u51c6\u5907","text":"\u5f55\u5236\u89c6\u9891\u6216\u6216\u5c4f\u5e55\u622a\u56fe\u653e\u7f6e\u76ee\u5f55 AnnotationMaterial/source"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u5f00\u59cb\u6807\u6ce8","text":"python3 AnnotationMaterial/main.py\n \u751f\u6210\u7684\u6807\u6ce8\u6570\u636e\u5b58\u653e\u5728 AnnotationMaterial/result"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#mmdetection","title":"\u56db\u3001MMDetection","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1-mmdetection","title":"1\u3001 MMDetection \u4ee3\u7801","text":"MMDetection \u662f\u4e00\u4e2a\u6709\u540d\u7684\u6df1\u5ea6\u5b66\u4e60\u76ee\u6807\u68c0\u6d4b\u5f00\u6e90\u9879\u76ee\uff0c\u4e5f\u662f openMMlab \u7684\u62db\u724c\u9879\u76ee\uff0c\u4e3a\u4ec0\u4e48\u9009\u62e9\u5b83\uff0c\u5c0f\u5b69\u513f\u6ca1\u5a18\u8bf4\u6765\u8bdd\u957f\uff0c\u611f\u5174\u8da3\u53ef\u4ee5\u81ea\u884c\u6df1\u5165\u4e86\u89e3\uff1b \u4f60\u53ef\u4ee5\u76f4\u63a5\u5728 GitHub \u4e0a\u514b\u9686\u4ee3\u7801\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u54b1\u4eec\u4ed3\u5e93\u4e0b Train \u76ee\u5f55\u4e2d\u4ee3\u7801\uff0cTrain \u4e2d\u7684\u4ee3\u7801\u4e5f\u662f\u4ece GitHub \u4e0a\u62c9\u53d6\u7684\uff0c\u4e0d\u8fc7\u6211\u4eec\u6839\u636e\u9879\u76ee\u9700\u8981\u505a\u4e86\u4e00\u4e9b\u4e8c\u6b21\u5f00\u53d1\uff0c\u63a8\u8350\u76f4\u63a5\u4f7f\u7528\u5b83\u3002 \u5982\u679c\u4f60\u60f3\u4ece GitHub \u4e0a\u62c9\uff1a git clone https://github.com/open-mmlab/mmdetection.git\n# \u4e0d\u80fd\u76f4\u63a5\u62c9\u53d6\u4e3b\u5206\u652f\uff0c\u5efa\u8bae\u4f7f\u75282.12\u7248\u672c\uff0c\u4e0d\u540c\u7684\u7248\u672c\u5bf9\u5e94\u7684mmcv\u7248\u672c\u662f\u4e0d\u540c\u7684\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-voc2coco","title":"2\u3001\u62c9\u53d6 voc2coco \u4ee3\u7801","text":"git clone https://github.com/Tony607/voc2coco.git\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-coco","title":"3\u3001\u8f6c\u6362 coco \u6570\u636e\u96c6","text":"\u5c06\u6240\u6709\u7684\u56fe\u7247\u548cxml\u6587\u4ef6\u653e\u5165train2017\uff0c\u4ece\u4e2d\u6311\u9009\u51e0\u7ec4\u653e\u5165val2017\uff08\u6d4b\u8bd5\u96c6\uff09 cd mmdetection/data/coco\npython voc2coco.py train2017 annotations/instances_train2017.json\npython voc2coco.py val2017 annotations/instances_val2017.json\n \u751f\u6210json\u6587\u4ef6"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4_1","title":"4\u3001\u4fee\u6539\u914d\u7f6e","text":"\uff081\uff09\u8bfb\u53d6\u6a21\u578b\u540d\u79f0 import json\nmodule_name = []\nwith open('./instances_train2017.json', \"r+\") as f:\njson_file = f.read()\njson_dict = json.loads(json_file)\nmodule_list = json_dict.get('categories')\nfor module_info in module_list:\nname = module_info.get('name')\nmodule_name.append(name)\nprint(module_name)\nprint(\"module_num:\", len(module_name))\n # \u6ce8\u610f\u5bf9\u6bd4instances_train2017.json\u91cc\u9762\u6a21\u578b\u540d\u79f0\u7684\u987a\u5e8f\uff0c\u4e0eCLASSES\u548ccoco_classes\u91cc\u9762\u7684\u987a\u5e8f\u4fdd\u6301\u4e00\u81f4\u3002\n \uff082\uff09\u4fee\u6539 faster_rcnn_r101_2x_coco.py mmdetection/xianjin/faster_rcnn_r101_2x_coco.py \u4fee\u653946\u884c\uff0cnum_clasess\u7684\u503c\uff0c\u65b0\u589e1\u4e2a\uff0c\u5c31 +1\uff1b \uff083\uff09\u4fee\u6539 coco.py mmdetection/mmdet/datasets/coco.py CLASSES = ()\uff0c\u5728\u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b \uff084\uff09\u4fee\u6539 class_names.py mmdetection/mmdet/core/evaluation/class_names.py coco_classes \u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#5","title":"5\u3001\u7f13\u5b58\u6e05\u7406","text":"\u5220\u9664 mmdetection/build \u76ee\u5f55 python setup.py install\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#6","title":"6\u3001\u8bad\u7ec3\u6a21\u578b","text":"\uff081\uff09\u6307\u5b9a\u81ea\u5df1\u914d\u7f6e\u7684\u8bad\u7ec3\u6a21\u578b\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py --gpus 1\n \uff082\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u6d4b\u8bd5\u96c6\u7ed3\u679c\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py xianjin/epoch_24.pth --show\n \uff083\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u51c6\u786e\u5ea6\uff1b python tools/analysis_tools/analyze_logs.py plot_curve xianjin/20210530_011907.log.json --keys acc\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#7","title":"7\u3001\u5feb\u6377\u64cd\u4f5c","text":"python3 run.py\n \u5c06\u4ee5\u4e0a 4 - 7 \u6b65\u64cd\u4f5c\u6574\u5408\u6210 run.py\uff0c\u4e00\u952e\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u4e94\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\uff1b \u670d\u52a1\u7aef\u4e00\u53f0\uff08\u76ee\u524d\u4ec5\u652f\u6301AMD\u67b6\u6784\uff09\uff1b \u91c7\u96c6\u76d2\u4e00\u4e2a \uff08ACASIS hdmi\u89c6\u9891\u91c7\u96c6\u5361\uff0chttps://item.jd.com/10024310742602.html \uff09\uff1b USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\uff1b USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff1b \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5USB\u5ef6\u957f\u7ebf\uff1b \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u63a8\u8350\u914d\u7f6e","text":"\u6267\u884c\u7528\u4f8b\u7684\u670d\u52a1\u7aef\u5bf9\u914d\u7f6e\u6ca1\u6709\u7279\u6b8a\u8981\u6c42\uff0c\u5982\u679c\u6761\u4ef6\u5141\u8bb8\u914d\u7f6e\u8d8a\u9ad8\uff0c\u8bc6\u522b\u901f\u5ea6\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n \u6d4b\u8bd5\u673a\u4e0a\u4e0d\u6267\u884c\u4efb\u4f55\u811a\u672c\uff0c\u5177\u4f53\u914d\u7f6e\u6839\u636e\u6d4b\u8bd5\u9700\u8981\u51b3\u5b9a\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#usb_mk","title":"\u516d\u3001USB_MK\u4e32\u53e3\u9a71\u52a8\u65b9\u6cd5","text":"\u4f4d\u4e8econtrol_method\u76ee\u5f55\u4e0b\u7684usb_mk.py\u6587\u4ef6 \uff081\uff09\u5217\u51fa\u53ef\u901a\u4fe1\u7684\u7aef\u53e3 python3 -m serial.tools.list_ports -v\n \uff082\uff09\u4fee\u6539\u4e32\u53e3\u7684\u6743\u9650 sudo chmod 777 /dev/ttyACM0\n \uff083\uff09\u5b9e\u4f8b\u5316USB_MK import UsbMk\nusb_mk = UsbMk(\"/dev/ttyACM0\", 9600) # \u8bbe\u5907\u9ed8\u8ba49600\u4e3a\u6ce2\u7279\u7387\uff0c\u63a7\u5236\u4f20\u8f93\u901f\u7387\n \uff084\uff09USB\u4e32\u53e3\u8bbe\u5907\u9ed8\u8ba4\u6ce2\u7279\u7387\u4e3a9600\uff08\u7ecf\u6d4b\u8bd5\u6ce2\u7279\u73879600\u51c6\u786e\u6027\u6700\u597d\uff09\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up() # \u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u6c49\u5b57\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e\n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff083\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff084\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff085\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() # \u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2\n \uff086\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff087\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff088\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e03\u3001\u65b9\u6cd5\u8c03\u7528\u5165\u53c2\u89c4\u5219","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_7","title":"1\u3001\u57fa\u7c7b","text":"class Base:\ndef __init__(self):\nself._obj = image\nself._usb = usb_mk\ndef find_element_by_ai(self, element):\nreturn self._obj.find_element(element)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_6","title":"2\u3001\u5165\u53c2\u8bf4\u660e","text":"\u56fe\u50cf\u8bc6\u522b\u65b9\u6cd5\u5165\u53e3\u4e3a Base \u7c7b\u4e0b\u7684 find_element_by_ai \u3002\u4ec5\u63a5\u53d7\u4e00\u4e2a\u53c2\u6570 element\uff0c\u7c7b\u578b\u4e3a string\u3002 \u53ef\u8bc6\u522b\u7684 string \u683c\u5f0f\uff1a \uff081\uff09\u5927\u56fe\u6807\uff08 \u56fe\u6807\u5927\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\uff0c\u4f8b\uff1a Base().find_element_by_ai(\"window\")\n \uff082\uff09\u5927\u56fe\u6807 / \u5c0f\u56fe\u6807\uff08\u56fe\u6807\u5c0f\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5c0f\u56fe\u6807\uff0c\u4f8b\uff1awindow/search_btn Base().find_element_by_ai(\"window/search_btn\")\n \uff083\uff09\u5927\u56fe\u6807 / OCR\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\u5185\u7684\u6587\u5b57\uff0c\u4f8b\uff1amenu/\u5c5e\u6027 Base().find_element_by_ai(\"menu/\u5c5e\u6027\")\n \uff084\uff09OCR\uff1a\u5168\u5c4f\u8bc6\u522b\u6587\u5b57 Base().find_element_by_ai(\"\u641c\u7d22\")\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516b\u3001\u9690\u85cf\u9f20\u6807","text":"\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u8fc7\u6765\u7684\u89c6\u9891\u6d41\uff0c\u5728\u8bc6\u522b\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u53d7\u5230\u9f20\u6807\u5f71\u54cd\uff0c\u56e0\u6b64\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u9690\u85cf\u9f20\u6807\u3002 \u5c4f\u853d\u9f20\u6807\u5149\u6807\u663e\u793a ```shell script /etc/lightdm/lightdm.conf \u5728`[Seat:*]`\u4e0b\u9762\u6dfb\u52a0\u53c2\u6570\n```shell script\nxserver-command=X -bs -core -nocursor\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e5d\u3001\u667a\u80fd\u81ea\u52a8\u5316\u7684\u610f\u4e49","text":"1\u3001\u6539\u5584 Acessibility \u5b9a\u4f4d\u7684\u7a33\u5b9a\u6027\u95ee\u9898 Acessibility \u5c5e\u6027\u5b9a\u4f4d\u5b58\u5728\u5076\u5c14\u5931\u6548\u7684\u60c5\u51b5 \uff081\uff09\u5f00\u53d1\u5728\u505a\u65b0\u9700\u6c42\u5f00\u53d1\u65f6\u53ef\u80fd\u6d89\u53ca\u5230\u5bf9\u5c5e\u6027\u6807\u7b7e\u7684\u4fee\u6539\u6216\u8005\u5c42\u7ea7\u7684\u8c03\u6574\uff0c\u53ef\u80fd\u9020\u6210\u81ea\u52a8\u5316\u7528\u4f8b\u65e0\u6cd5\u5b9a\u4f4d\u5230\u5143\u7d20\u3002 \u6bd4\u59821040\u9636\u6bb5\uff0c\u97f3\u4e50\u91cd\u6784\u7684\u65f6\u5019\uff0c\u5f00\u53d1\u5bf9\u90e8\u5206\u5c5e\u6027\u548c\u5c42\u7ea7\u505a\u4e86\u4fee\u6539\uff0c\u5bfc\u81f4\u81ea\u52a8\u5316\u7528\u4f8b\u5b9a\u4f4d\u65b9\u6cd580%\u9700\u8981\u4fee\u6539\u3002 \u5f00\u53d1\u65b0\u529f\u80fd\u7684\u65f6\u5019\u5076\u5c14\u4e5f\u4f1a\u5bf9\u5c5e\u6027\u505a\u8c03\u6574\uff0c\u9047\u52305\u6b21\u3002 \uff082\uff09\u76ee\u524d\u4e3b\u8981\u4f7f\u7528Dogtail\u8bc6\u522b\u5e94\u7528Acessibility\u5c5e\u6027\u8fdb\u884c\u5b9a\u4f4d\uff0c\u662f\u83b7\u53d6\u5e94\u7528\u5f53\u524d\u754c\u9762\u7684\u5c5e\u6027tree\uff0c\u5728\u5e94\u7528\u8df3\u8f6c\u540e\uff0cDogtail\u5b58\u5728\u65e0\u6cd5\u53ca\u65f6\u83b7\u53d6\u5f53\u524d\u5c5e\u6027\u5217\u8868\u7684\u60c5\u51b5\u3002 \u591a\u5a92\u4f53\u8c03\u7528\u6587\u7ba1\u7a97\u53e3\u7684\u65f6\u5019\uff0c\u51fa\u73b0\u627e\u4e0d\u5230\u6587\u7ba1\u91cc\u9762\u5143\u7d20\u7684\u60c5\u51b5\uff0c\u76ee\u524d\u51fa\u73b010+\u6b21\u3002 \u5e94\u7528\u8bbe\u7f6e\u9875\u9762\u7684\u5c5e\u6027\u5076\u5c14\u5b58\u5728\u627e\u4e0d\u5230\u7684\u60c5\u51b5\uff0c\u9047\u52305\u6b21\u3002 \uff083\uff09Dogtail\u5de5\u5177\u672c\u8eab\u5b58\u5728\u95ee\u9898\uff0c\u6709\u65f6\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u5019\u5f88\u6162\uff0c\u8ba9\u4eba\u65e0\u6cd5\u63a5\u53d7\uff0c\u76ee\u524d\u51fa\u73b0\u8fc7\u5f88\u591a\u6b21\u3002 \u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u95f4\u6bd4\u5e73\u5e38\u61623\u500d\uff0c\u51fa\u73b04\u6b21\u3002 2\u3001\u89e3\u51b3\u4e86\u4f7f\u7528\u7edd\u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898 \u90e8\u5206\u63a7\u4ef6\u65e0\u6cd5\u6dfb\u52a0 Acessibility \u5c5e\u6027\u4ece\u800c\u4f7f\u7528\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u51fa\u73b0\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898\u3002 \uff081\uff09\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u65b9\u6cd5\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u76ee\u6807\u56fe\u7247\u8d44\u6e90\uff0c\u5728 UI \u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u4f1a\u6d89\u53ca\u5230\u76ee\u6807\u8d44\u6e90\u7684\u66ff\u6362\uff0c\u6bd4\u8f83\u8017\u8d39\u4eba\u529b\u3002 \uff082\uff09\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6cd5\u5bf9\u6bd4\u7cbe\u5ea6\u6bd4\u8f83\u641e\uff0c\u5982\u679cUI \u7684\u53d8\u66f4\u4f1a\u9020\u6210\u65e0\u6cd5\u51c6\u786e\u5b9a\u4f4d\u5230\uff0c\u81ea\u52a8\u5316\u811a\u672c\u5065\u58ee\u6027\u4e0d\u8db3\u3002 3\u3001\u4f7f\u7528\u673a\u5668\u5206\u79bb\uff0c\u89e3\u51b3\u4e86\u81ea\u52a8\u5316\u811a\u672c\u5bf9\u5e94\u7528\u7684\u5f71\u54cd\uff0c\u771f\u5b9e\u8fd8\u539f\u7528\u6237\u7684\u4f7f\u7528\u573a\u666f \u673a\u5668\u5206\u79bb\u7684\u67b6\u6784\u8bbe\u8ba1\uff0c\u4fdd\u8bc1\u4e86\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u73af\u5883\u5b8c\u5168\u7b49\u540c\u4e8e\u7528\u6237\uff0c\u6392\u9664\u6d4b\u8bd5\u811a\u672c\u7684\u5f71\u54cd\u3002 \uff081\uff09\u76ee\u524d\u7684\u529f\u80fd\u81ea\u52a8\u5316\u662f\u5728\u6d4b\u8bd5\u673a\u4e0a\u76f4\u63a5\u8fd0\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\uff0c\u52a0\u4e0a\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u6211\u4eec\u6dfb\u52a0\u4e86\u4e00\u4e9b\u8fdb\u7a0b\u76d1\u63a7\u3001\u89c6\u9891\u5f55\u5236\u7b49\u529f\u80fd\uff0c\u81ea\u52a8\u5316\u811a\u672c\u672c\u8eab\u4f1a\u6d88\u8017\u4e00\u4e9b\u7cfb\u7edf\u8d44\u6e90\uff0c\u65e0\u6cd5\u8fd8\u539f\u771f\u662f\u7684\u7528\u6237\u4f7f\u7528\u573a\u666f\u3002 \uff082\uff09\u6027\u80fd\u6d4b\u8bd5\u9700\u8981\u6392\u9664\u5176\u4ed6\u7a0b\u5e8f\u7684\u8d44\u6e90\u6d88\u8017\u5f71\u54cd\uff0c\u6027\u80fd\u81ea\u52a8\u5316\u91c7\u7528\u673a\u5668\u5206\u79bb\uff0c\u4fdd\u8bc1\u4e86\u6027\u80fd\u6570\u636e\u7684\u51c6\u786e\u6027\u3002 \u4ee5\u524d\u7684\u7528\u4f8b\u6267\u884c\u8017\u65f6\u6ca1\u6761\u572830\u79d2\u5de6\u53f3\uff0c\u73b0\u5728\u7528\u4f8b\u8017\u65f6\u572810\u79d2\u3002 4\u3001\u89e3\u51b3\u4e86UI \u8c03\u6574\u5bfc\u81f4\u5b9a\u4f4d\u5931\u8d25\u7684\u4e0d\u7a33\u5b9a\u6027\u95ee\u9898 \uff081\uff09\u89e3\u51b3\u4e86\u56e0 UI \u8c03\u6574\u5bfc\u81f4\u63a7\u4ef6\u4f4d\u7f6e\u53d8\u5316\u6216\u8272\u5dee\u53d8\u5316\u540e\u5b9a\u4f4d\u4e0d\u51c6\u786e\u7684\u95ee\u9898\uff0c\u53ea\u8981\u63a7\u4ef6\u6587\u6848\u548c\u63a7\u4ef6\u5916\u8fb9\u6846\u65e0\u53d8\u5316\u5747\u53ef\u51c6\u786e\u5b9a\u4f4d\uff1b \uff082\uff09\u76ee\u524d\u4e5f\u4f1a\u91c7\u7528\u57fa\u4e8eUI\u7684\u5b9a\u4f4d\u65b9\u6848\uff0c\u5982\u679cUI\u4f4d\u7f6e\u6709\u8c03\u6574\uff0c\u4f1a\u5bfc\u81f4\u5143\u7d20\u65e0\u6cd5\u5b9a\u4f4d\u3002 5\u3001\u7b80\u5316\u4e86\u7528\u4f8b\u7ed3\u6784\uff0c\u63d0\u5347\u7f16\u5199\u53cb\u597d\u5ea6 \uff081\uff09\u667a\u80fd\u81ea\u52a8\u5316\u8bc6\u522b\u5143\u7d20\u7684\u65b9\u6cd5\u53ea\u6709\u4e00\u4e2a\uff0c\u5c31\u662f\u57fa\u4e8e\u6211\u4eec\u8bad\u7ec3\u7684\u6a21\u578b\u8bc6\u522b\u89c6\u9891\u6d41\u4e2d\u7684\u5143\u7d20\uff0c\u7ecf\u8fc7\u811a\u672c\u5c01\u88c5\u4e4b\u540e\uff0c\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u4e2d\u6240\u6709\u5b9a\u4f4d\u7684\u64cd\u4f5c\u90fd\u53ea\u9700\u8981\u8c03\u7528\u8fd9\u4e00\u4e2a\u65b9\u6cd5\u5c31\u884c\u4e86\uff0c\u7f16\u5199\u81ea\u52a8\u5316\u811a\u672c\u7684\u96be\u5ea6\u5927\u5927\u964d\u4f4e\u3002 \uff082\uff09\u4e5f\u662f\u7531\u4e8e\u8c03\u7528\u65b9\u6cd5\u7b80\u5355\uff0c\u5728 UI \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u4e2d\u7684\u5206\u5c42\u7ed3\u6784\u5c06\u4f1a\u51cf\u5c11\uff0c\u591a\u7ee7\u627f\u7684\u60c5\u51b5\u4f1a\u51cf\u5c11\uff0c\u81ea\u52a8\u5316\u4ee3\u7801\u7684\u8c03\u7528\u7ed3\u6784\u4e5f\u4f1a\u53d8\u5f97\u7b80\u5355\uff0c\u800c\u4e14\u529f\u80fd\u6d4b\u8bd5\u540c\u5b66\u7f16\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u66f4\u52a0\u5bb9\u6613\u4e0a\u624b\u3002 \u4ee5\u524d\u5199\u7528\u4f8b\u7531\u4e8e\u9700\u8981\u7ed3\u5408\u4e0d\u540c\u7684\u6a21\u5757\uff0c\u8c03\u7528\u4e0d\u540c\u7684\u65b9\u6cd5\uff0c\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u5e76\u5b8c\u6210\u8c03\u8bd5\u7684\u65f6\u95f4\u5e73\u5747\u572820-30\u5206\u949f\uff0c\u73b0\u5728\u5199\u7528\u4f8b\u811a\u672c\u80fd\u57285\u5206\u949f\u5de6\u53f3\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":"# =============================================\n# Attribution : Application Test Department III\n# Time : 2023/1/3\n# Author : ut003281\n# =============================================\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u7b80\u8ff0","text":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5 \u901a\u8fc7\u81ea\u52a8\u5316\u624b\u6bb5\u5bf9\u5e94\u7528\u8fdb\u884c\u6027\u80fd\u6d4b\u8bd5\uff0c\u63d0\u4f9b\u65b9\u4fbf\u7684\u73af\u5883\u90e8\u7f72\u3001\u8fd0\u884c\u914d\u7f6e\u3001\u7528\u4f8b\u7f16\u5199\u7b49\uff0c\u7528\u4e8e\u684c\u9762\u5e94\u7528\u7684\u51b7\u70ed\u542f\u52a8\u3001\u8d44\u6e90\u62f7\u8d1d\u3001\u9875\u9762\u8df3\u8f6c\u7b49\u6027\u80fd\u573a\u666f\u6d4b\u8bd5\u3002 \u4ed3\u5e93\u5730\u5740\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-perf-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u4ee3\u7801\u7ed3\u6784","text":"autotest-perf-aitest\n\u251c\u2500\u2500 apps # \u5b58\u653e\u6240\u6709\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u811a\u672c\n\u251c\u2500\u2500 conftest.py # pytest hook\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 CURRENT # \u7248\u672c\u5185\u5bb9\n\u251c\u2500\u2500 docs # \u6587\u6863\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u952e\u503c\u5bf9\u7167\u8868.pdf # \u4e32\u53e3\u7ebfcode\u4e0e\u6309\u952e\u7684\u5bf9\u7167\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u6027\u80fd\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\u6267\u884c\u5668\u4f7f\u7528\u6307\u5357.md # \u6267\u884c\u5668\u811a\u672c\u4f7f\u7528\u6307\u5357\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 USB\u4e32\u53e3\u8f6cUSB\u952e\u76d8\u9f20\u6807\u7ebf\u534f\u8bae\u6587\u4ef6V1.0.pdf # \u4e32\u53e3\u534f\u8bae\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput-0.28.2.zip # Linux\u4e0b\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\u7684\u6e90\u7801\uff0c\u53ef\u6839\u636e\u67b6\u6784\u6253\u5305\n\u251c\u2500\u2500 manage.py # \u529f\u80fd\u4e3b\u5165\u53e3\n\u251c\u2500\u2500 pytest.ini # pytst \u914d\u7f6e\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 setting # \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 client.ini # \u6d4b\u8bd5\u673a IP \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5168\u5c40\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dev_env.sh # \u5bbf\u4e3b\u673a\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose_no_relay.yml # \u65e0\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose.yml # \u6709\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker_login.sh # docker \u767b\u9646\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 res\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 black.png # \u5168\u9ed1\u56fe\u7247\uff0c\u7528\u4e8e\u4fee\u6539\u58c1\u7eb8\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_5000.deb # 3A5000 \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_amd64.deb # amd \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_arm64.deb # arm \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_mips64.deb # mips \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_sw_64.deb # sw \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 server.ini # \u670d\u52a1\u5668\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 setup.sh # \u5bb9\u5668\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 template # \u521b\u5efa app \u57fa\u7840\u811a\u672c\u6a21\u677f\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 app_template\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ${app_name}_widget.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 control-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 images\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 test_${app_name}_01_scene.json-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 test_${app_name}_01_scene.py-tpl\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 uos_docker # \u5bb9\u5668\u73af\u5883\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dockerfile\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 requirements.txt\n\u2514\u2500\u2500 src\n \u251c\u2500\u2500 analysis_save.py # \u89e3\u6790\u56fe\u7247\u6d41\u7ed3\u679c\uff0c\u6c47\u603b\u751f\u6210 excel \u62a5\u544a\n\u251c\u2500\u2500 base_widget.py # \u5c01\u88c5\u7684\u57fa\u7840\u64cd\u4f5c\uff0c\u5e94\u7528\u8c03\u7528\u7684\u4e3b\u5165\u53e3\u65b9\u6cd5\n\u251c\u2500\u2500 cmdctl.py # \u8c03\u7528\u547d\u4ee4\u884c\u4f7f\u7528\n\u251c\u2500\u2500 global_value.py # \u5168\u5c40\u53d8\u91cf\n\u251c\u2500\u2500 image_utils.py # \u56fe\u7247\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 __init__.py\n \u251c\u2500\u2500 logger_utils.py # \u65e5\u5fd7\u914d\u7f6e\n\u251c\u2500\u2500 pdocr.py # ocr \u914d\u7f6e\n\u251c\u2500\u2500 public_method.py # \u4e00\u4e9b\u65b9\u4fbf\u7684\u5c01\u4f4f\n\u251c\u2500\u2500 record.py # \u5f55\u5c4f\u76f8\u5173\n\u251c\u2500\u2500 rtk # \u8fd0\u884c\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 _base.py # \u4e00\u4e9b\u679a\u4e3e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 install_env.py # \u5b89\u88c5\u73af\u5883\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 local_runner.py # \u8fd0\u884c\u7528\u4f8b\n\u251c\u2500\u2500 serial_communication # \u4e32\u53e3\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 power_control.py # \u7ee7\u7535\u5668\u64cd\u4f5c\uff0c\u4f7f\u7528\u7ee7\u7535\u5668\u8fde\u63a5\u4e3b\u673a\u7535\u6e90\uff0c\u63a7\u5236\u5f00\u5173\u673a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 serial_common.py # \u4e32\u53e3\u516c\u5171\u65b9\u6cd5\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 usb_mk.py # \u952e\u9f20\u64cd\u4f5c\u57fa\u7840\u5c01\u88c5\n\u251c\u2500\u2500 shortcut_key.py # \u5feb\u6377\u952e\u7684\u5c01\u88c5\n\u251c\u2500\u2500 singleton.py # \u5355\u4f8b\u6a21\u5f0f\n\u251c\u2500\u2500 start_app.py # \u521b\u5efa app\n\u2514\u2500\u2500 write_xlsx.py # \u751f\u6210 excel\n# __init__.py \u6587\u4ef6\u4e3a\u6807\u8bc6\u8be5\u76ee\u5f55\u662f\u4e00\u4e2aPython\u7684\u6a21\u5757\u5305\uff0c\u9879\u76ee\u4e2d\u7684__init__.py\u5747\u4e3a\u7a7a\u6587\u4ef6\u3002\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u73af\u5883\u642d\u5efa","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\u3002 \u670d\u52a1\u7aef\u4e00\u53f0\u3002\uff08\u4ec5\u652f\u6301 AMD \u67b6\u6784\uff0c\u82e5\u9700\u5176\u4ed6\u67b6\u6784\uff0c\u54a8\u8be2\u76f8\u5173\u5f00\u53d1\u4eba\u5458\uff09 \u91c7\u96c6\u76d2\u4e00\u4e2a\u3002 \uff08ACASIS HDMI \u89c6\u9891\u91c7\u96c6\u76d2\uff0chttps://item.jd.com/100013302599.html#crumb-wrap \uff09 USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\u3002\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"\uff082\uff09\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\u3002 USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff08USB3.0 \u63a5\u53e3\u4e0a\uff09\u3002 \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5 USB \u5ef6\u957f\u7ebf\u3002 \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u670d\u52a1\u7aef\u63a8\u8350\u914d\u7f6e","text":"\u914d\u7f6e\u8d8a\u9ad8\uff0c\u89e3\u6790\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"2\u3001\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa","text":" \u6253\u5f00\u63a7\u5236\u4e2d\u5fc3\uff0c\u8d26\u6237\u8bbe\u7f6e\u4e3a\u3010\u81ea\u52a8\u767b\u5f55\u3011\u548c\u3010\u65e0\u5bc6\u7801\u767b\u5f55\u3011\uff0c\u7535\u6e90\u7ba1\u7406\u4e2d\u4f7f\u7528\u7535\u6e90\u5168\u90e8\u8bbe\u7f6e\u4e3a\u3010\u4ece\u4e0d\u3011\uff0c\u5f00\u542f\u5f00\u53d1\u8005\u6a21\u5f0f\u3002 \u6839\u636e\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u8981\u6c42\uff0c\u5bfc\u5165\u76f8\u5173\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\uff1a\u5bfc\u5165\u76f8\u518c\u3001\u5f71\u9662\u3001\u97f3\u4e50\u7684\u6d4b\u8bd5\u8d44\u6e90\u3002 \u5728\u670d\u52a1\u7aef\u6253\u5f00\u76f8\u673a\u5e94\u7528\u540e\uff0c\u5c06\u6d4b\u8bd5\u673a\u684c\u9762\u58c1\u7eb8\u66f4\u6362\u4e3a\u7eaf\u8272\u58c1\u7eb8\uff08\u6ce8\u610f\uff0c\u670d\u52a1\u7aef\u9700\u63d0\u524d\u5f00\u542f\u76f8\u673a\u540e\u518d\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u58c1\u7eb8\uff0c\u5efa\u8bae\u7eaf\u9ed1\u58c1\u7eb8 setting/res/black.png\uff09 \u5728\u6587\u4ef6\u7ba1\u7406\u5668\u4e2d\uff0c\u5c06\u9009\u9879 \u4e3b\u83dc\u5355-\u8bbe\u7f6e-\u9884\u89c8-\u56fe\u7247\u9884\u89c8 \u53d6\u6d88\u52fe\u9009\uff08\u5982\u4e0d\u53d6\u6d88\uff0c\u4f1a\u5f71\u54cd\u622a\u56fe\u5f55\u5c4f\u5e94\u7528\u7684\u6027\u80fd\u6570\u636e\uff09 \u79fb\u52a8\u6216\u5220\u9664\u7cfb\u7edf Logo \uff0c\u6392\u9664\u684c\u9762\u53f3\u4e0b\u89d2 Logo \u7684\u5f71\u54cd\uff08\u91cd\u542f\u751f\u6548\uff09\u3002 sudo mv /usr/share/deepin/uos_logo.svg ~/Pictures/\n \u5b89\u88c5\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\uff08\u5fc5\u987b\u5b89\u88c5\uff01\uff01\uff09 AMD \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_amd64.deb ARM \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_arm64.deb MIPS \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_mips64.deb 3A5000 \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_5000.deb \u5b89\u88c5\u547d\u4ee4 sudo dkpg -i xserver-xorg-input-libinput_0.28.2-2_amd64.deb\n \u5b89\u88c5\u65f6\u4f1a\u63d0\u793a\u5df2\u5b58\u5728\u76f8\u540c\u7248\u672c\uff0c\u8bf7\u5ffd\u7565\uff0c\u76f4\u63a5\u8986\u76d6\u5b89\u88c5\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u4e3b\u673a\u624d\u751f\u6548"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u670d\u52a1\u7aef\u4e00\u952e\u73af\u5883\u90e8\u7f72","text":"\u73af\u5883\u642d\u5efa\u524d\u5fc5\u987b\u5148\u8fde\u63a5\u4e0a USB \u4e32\u53e3\u7ebf\u548c\u91c7\u96c6\u76d2\u3002 \u5bbf\u4e3b\u673a\u73af\u5883\u5b89\u88c5 python3 manage.py install --env host\n \u5bb9\u5668\u73af\u5883\u5b89\u88c5 python3 manage.py install --env docker\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u56db\u3001\u914d\u7f6e\u9879","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u670d\u52a1\u7aef\u914d\u7f6e","text":"setting/config/server.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u914d\u7f6e\u9879\uff0c\u5305\u542b\u4e86\u6240\u6709\u670d\u52a1\u7aef\u6240\u6709\u7684\u53ef\u914d\u7f6e\u9879\u3002 \u672c\u5730\u65e0\u7f51\u7edc\u8fd0\u884c \u5c06\u914d\u7f6e\u9879 network=0 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u672c\u5730\u6709\u7f51\u7edc\u8fd0\u884c \u914d\u7f6e\u9879 network=1 (1)\u914d\u7f6e\u9879 client_alias= \u914d\u7f6e\u4e3a\u4f60\u8981\u6d4b\u8bd5\u7684\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5982 Alias1 \u6d4b\u8bd5\u673a\u522b\u540d\u5728 setting/config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 (2)\u914d\u7f6e\u9879 client_alias= \u4e3a\u7a7a\uff0c\u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager --client_alias Alias1\uff0c\u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002(Alias1 \u4e3a\u4f60\u914d\u7f6e\u7684\u6d4b\u8bd5\u673a\u522b\u540d) (1)\u548c(2)\u53ea\u8981\u4f7f\u7528\u5176\u4e00\u5373\u53ef\u3002 \u6709\u7f51\u7edc\u8fd0\u884c\uff0c\u4e14\u9700\u8981\u901a\u8fc7 Jenkins \u4e0a\u8fd0\u884c\u4e00\u4e2a job \uff0c\u540c\u65f6\u63a7\u5236\u591a\u53f0\u673a\u5668\u3002 \u914d\u7f6e\u9879 network=1 \u914d\u7f6e\u9879 client_alias= \u4e0d\u7528\u914d\u7f6e\uff0c\u5728\u8fd0\u884c run.sh \u7684\u65f6\u5019\u76f4\u63a5\u7a7a\u683c\u52a0\u522b\u540d\u5373\u53ef\uff0c\u6bd4\u5982\uff1a\u6d4b\u8bd5\u673a\u522b\u540d\u4e3a Alias1 \uff0c\u4e14\u5df2\u7ecf\u5728 config/client.ini \u4e2d\u914d\u7f6e\u4e86 Alias1 \u7684user ip password \uff0c\u5219\u8fd0\u884c bash run.sh Alias1 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u5728 Jenkins pipeline \u91cc\u9762\u901a\u8fc7\u5e76\u884c stage \u6216\u5e76\u884c\u8c03\u7528\u4e0b\u5c42\u4efb\u52a1\u7684\u65b9\u5f0f\u53ef\u4ee5\u5b9e\u73b0\u5927\u89c4\u6a21\u7684\u6027\u80fd\u6d4b\u8bd5\u9700\u6c42\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;1\u3001KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2\u3001KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f, e.g. TAGS = L1 or smoke\n[case_conf]\n# \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\uff0cocr\u6587\u6848\u8bc6\u522b\u8f83\u6162\uff0c\u4e0d\u63a8\u8350\u4f7f\u7528\nfind_by = stage\n# \u6700\u540e\u4e00\u4e2a\u7a33\u5b9a\u9636\u6bb5\u7684\u5e27\u6570\u8bc6\u522b\n# \u9996\u5e27\u5b58\u5728\u540e\u7684\u7b2c\u4e00\u4e2a\u5927\u4e8e\u8be5\u914d\u7f6e\u5e27\u6570\u7684\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u5c3e\u5e27\nfinal_stable_num=100\n# \u4ece\u8be5\u5e27\u6570\u5f00\u59cb\u8bc6\u522b\u6587\u6848\u6216\u56fe\u7247\uff0c\u51cf\u5c11\u5206\u6790\u65f6\u95f4\nstart_num = 150\n# \u8bc6\u522b\u7684\u6587\u6848\ntext=\n# \u8bc6\u522b\u56fe\u7247\nmatch=apps/xxx/images/match.png\n# \u8bc6\u522b\u76f8\u4f3c\u5ea6\nmatch_rate=0.9\n# \u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6bd4\u5982\u70ed\u542f\u52a8\u7528\u4f8b\uff0c\u4ece\u70b9\u51fb\u6253\u5f00\u5230\u505c\u6b62\u5f55\u5c4f\uff0c\u4e2d\u95f4\u7b49\u5f855\u79d2\uff1b\nduration = 15\n# \u5355\u6761\u7528\u4f8b\u6267\u884c\u7684\u6b21\u6570\ncount = 5\n# \u7a33\u5b9a\u9636\u6bb5\u5212\u5206\u7684\u76f8\u4f3c\u5ea6\nstable_similarity = 0.9997\n[server]\n# \u8c03\u8bd5\u6a21\u5f0f=1\uff0c\u4e3a\u5f00\u542f\u8c03\u8bd5\u6a21\u5f0f\uff0c0\u4e3a\u5173\u95ed\u3002\n# \u8c03\u8bd5\u6a21\u5f0f\u4e0b\u9ed8\u8ba4\u53ea\u6267\u884c\u4e00\u6b21\u7528\u4f8b\uff0c\u4e0d\u5173\u673a\n# \u7f16\u5199\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u5efa\u8bae\u5f00\u542fmaintain\u3002\nMAINTAIN = 0\n# \u8fd0\u884c\u7684\u73af\u5883docker\u5bb9\u5668\u73af\u5883\uff0chost\u5bbf\u4e3b\u673a\u73af\u5883\nENV = docker\n# \u670d\u52a1\u7aef\u5bc6\u7801\nPASSWORD=1\n# \u6307\u5b9a\u6d4b\u8bd5\u673a\u522b\u540d\n# \u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6bd4\u5982\uff1a\n# [AMD]\n# ip=10.8.15.86\n# user=uos\n# \u5176\u4e2d AMD \u4e3a\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5219client_alias=AMD\nCLIENT_ALIAS = x86\uff08Intel-i7\uff09\n# 1 \u5f00\u542f\u7f51\u7edc, 0 \u5173\u95ed\u7f51\u7edc\n# \uff081\uff09\u670d\u52a1\u7aef\u4e0e\u6d4b\u8bd5\u673a\u987b\u5728\u540c\u4e00\u7f51\u6bb5\u4e0b\uff0c\u4f60\u53ef\u4ee5\u5c1d\u8bd5\u5728\u670d\u52a1\u7aef\u901a\u8fc7ssh\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c\u5982\u679c\u53ef\u4ee5\u8fde\u63a5\uff0c\u8bf4\u660e\u7f51\u7edc\u6b63\u5e38\u3002\n# \uff082\uff09\u5f53input_type=FILE_NAME \u65f6\uff0c\u5fc5\u987b\u5f00\u542f\u7f51\u7edc\u3002\nNETWORK = 1\n# \u6027\u80fd\u7ed3\u679c\u7edf\u8ba1\u5355\u4f4d \u6beb\u79d2\u2014ms, \u79d2\u2014s\nUNIT=ms\n# \u6d4b\u8bd5\u673a\u5f00\u673a\u8fdb\u5165\u684c\u9762\u540e\u7b49\u5f85\u65f6\u95f4,\u5355\u4f4d/\u79d2\nSTARTUP_DELAY = 60\n# 1\u4e3a\u5220\u9664\u7f13\u5b58\uff0c0\u4e3a\u4e0d\u5220\u9664\u7f13\u5b58\n# \u7528\u4f8b\u6267\u884c\u5b8c\u540e\u4f1a\u5728report\u76ee\u5f55\u4e0b\u751f\u6210\u667a\u80fd\u89e3\u6790\u7684\u4e00\u4e9b\u7f13\u5b58\u56fe\u7247\u3002\nCACHE = 0\n# \u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u62a5\u544a\u4f1a\u4fdd\u5b58\u5728\u9879\u76ee\u4e0breport\u76ee\u5f55\u4e2d\uff1b\n# \u6307\u5b9a\u62a5\u544a\u76ee\u5f55\u5219\u5b58\u653e\u5230\u6307\u5b9a\u76ee\u5f55\u3002\nREPORT_PATH = report\n# \u670d\u52a1\u7aef\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684icon\u8d44\u6e90\u4f1a\u7f13\u5b58\u5728\u9879\u76ee\u4e0binput\u76ee\u5f55\u4e2d\nINPUT = input/\n# 1\u4e3a\u6d4b\u8bd5\u5b8c\u5173\u673a\uff0c0\u4e3a\u6d4b\u8bd5\u5b8c\u4e0d\u5173\u673a\nSHUTDOWN = 0\n# \u89e3\u6790\u8fdb\u7a0b\u6570\uff08\u4e0d\u63a8\u8350\u4fee\u6539\uff09\n# 3\u4e2a\u8fdb\u7a0b\u89e3\u6790\u89c6\u9891\u5df2\u7ecf\u80fd\u591f\u6ee1\u8db3\uff0c\u5373\u4f7f\u589e\u52a0\u8fdb\u7a0b\u6570\u4e5f\u4e0d\u80fd\u51cf\u5c11\u6574\u4f53\u8017\u65f6\n# \u53e6\u5916\u8fd8\u8981\u770bCPU\u6838\u6570\u662f\u5426\u652f\u6301\u3002\nPARSING_PROCESS = 3\n# 1\u4e3a\u4f7f\u7528\u7ee7\u7535\u5668\u5f00\u5173\u673a\uff0c0\u4e3a\u4f7f\u7528reboot\u547d\u4ee4\u91cd\u542f\u3002\u4f9d\u8d56\u7ee7\u7535\u5668\u786c\u4ef6\u8bbe\u5907\uff0c\u9700\u8981\u4f7f\u7528\u8054\u7cfb\u5f00\u53d1\u8005\nRELAY = 0\n# \u83b7\u53d6\u6d4b\u8bd5\u5e94\u7528\u7684\u7248\u672c, %s \u5360\u4f4d\u5e94\u7528\u540d\n# \u5982\u679c\u8be5\u914d\u7f6e\u4e3a\u7a7a\uff0c\u5219\u4e0d\u83b7\u53d6\u5e94\u7528\u7684\u7248\u672c\u4fe1\u606f\u3002\nCOMMAND = apt policy %s 2>/dev/null|grep \"\u5df2\u5b89\u88c5\"|awk -F \"\uff1a\" \"{print \\$2}\"\n# \u5173\u673a\u7b49\u5f85\u5f00\u542f\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6839\u636e\u6d4b\u8bd5\u673a\u6027\u80fd\u4e0d\u540c\uff0c\u5f00\u5173\u673a\u8017\u65f6\u53ef\u80fd\u4e0d\u540c\uff0c\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u673a\u60c5\u51b5\u914d\u7f6e\u3002\nSHUTDOWN_DELAY = 30\n# \u53ef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u56fe\u7247\u683c\u5f0f\uff0c\u4ee5\u82f1\u6587\u9017\u53f7\u9694\u5f00\u3002\n# \u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u76ee\u524d\u6211\u4eec\u4ec5\u9a8c\u8bc1\u4e86jpg,jpeg,png\u8fd9\u4e09\u79cd\u5e38\u7528\u7684\u56fe\u7247\u683c\u5f0f\u3002\nINPUT_TYPES = jpg,jpeg,png\n# \u6027\u80fd\u5206\u6790\u8865\u5e27\uff0c\u7b49\u4e8e\u6216\u4f4e\u4e8e\u8be5\u503c\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u9700\u8981\u51cf\u6389\u3002\nUN_STAB_START = 3\n# \u670d\u52a1\u7aef\u83b7\u53d6\u6d4b\u8bd5\u673a\u56fe\u50cf\u7684\u5e27\u7387\uff0c\u5373\u6bcf\u79d2\u83b7\u53d6\u591a\u5c11\u5f20\u6d4b\u8bd5\u673a\u4e0a\u7684\u56fe\u50cf\u3002\n# \u9ed8\u8ba4\u5e27\u7387\u4e3a30\u5e27/\u79d2\uff0c\u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u53ef\u80fd\u4f1a\u5bf9\u89e3\u6790\u7ed3\u679c\u9020\u6210\u504f\u5dee\u3002\nFPS = 30\n# \u4ee5\u4e0b\u573a\u666f\u7c7b\u578b\u4f1a\u91cd\u542f\u6d4b\u8bd5\u673a,\u591a\u79cd\u573a\u666f\u4f7f\u7528\u9017\u53f7\u9694\u5f00\nSCENE = cold\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = http://10.8.13.78:8890\n#\u5c4f\u5e55\u56fe\u7247\u4e34\u65f6\u5b58\u653e\u4f4d\u7f6e\nSCREEN_CACHE = /tmp/screen\n# =======================================\n[log]\n# \u65e5\u5fd7\u7ea7\u522b\uff0cOFF\u3001FATAL\u3001ERROR\u3001WARN\u3001INFO\u3001DEBUG\u3001ALL\n# \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u65e5\u5fd7\u8f93\u51fa\uff0clog_cli=INFO\u8868\u793a \u4ec5\u8f93\u51faINFO\u53ca\u4ee5\u4e0a\u7ea7\u522b\u7684\u65e5\u5fd7\u3002\nLOG_LEVEL = DEBUG\n# \u65e5\u5fd7\u6587\u4ef6\u4fdd\u5b58\u8def\u5f84\nLOG_PATH= logs\n# =======================================\n[dockerhub]\n# \u5bb9\u5668\u767b\u9646\u8d26\u53f7\nDOCKER_USER = user\n# \u5bb9\u5668\u767b\u9646\u5bc6\u7801\nDOCKER_PASSWORD = User1234\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u6d4b\u8bd5\u673a\u914d\u7f6e","text":"setting/config/client.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u4fe1\u606f\u3002 \u6709\u7f51\u7edc\u7684\u60c5\u51b5\u4e0b\uff0c\u670d\u52a1\u7aef\u9700\u8981\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u56e0\u6b64\u4f60\u9700\u8981\u5199\u5165 \u6d4b\u8bd5\u673a\u522b\u540d \u3001 user \u3001ip\u3001 password \u3002 # \u6d4b\u8bd5\u673a\u522b\u540d\n[Alias1] # \u6d4b\u8bd5\u673aip\nip=10.8.15.86 # \u6d4b\u8bd5\u673a\u7528\u6237\u540d\nuser=uos\n \u547d\u540d\u5efa\u8bae\uff1aAliasA1\u3001AliasA2\u3001AliasB1\u3001AliasB2\uff0c\u4e0d\u8981\u91cd\u540d\u3002 \u65e0\u7f51\u7edc\u60c5\u51b5\u4e0b\uff0c\u4ec5\u9700\u8981\u5173\u6ce8\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\u9879 width=\u3001 height= \u5373\u53ef\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a [client]\n# \u9ed8\u8ba4\u6d4b\u8bd5\u673a\u7528\u6237\u540d\uff0c\u5bc6\u7801\uff0cip\nip=\nuser=\n# \u6d4b\u8bd5\u673a\u5bc6\u7801\npassword=1\n# \u6d4b\u8bd5\u673a\u4e3b\u9898\ntheme=bloom\n# \u6d4b\u8bd5\u673aicon\u76ee\u5f55\npath=/usr/share/icons\n# \u7cfb\u7edfdesktop\u6587\u4ef6\u7684\u5b58\u653e\u76ee\u5f55\uff0cUOS\u7cfb\u7edf\u9ed8\u8ba4\u4e3a/usr/share/applications\ndesktop_path=/usr/share/applications\n# \u7528\u4e8e\u5224\u65ad\u6d4b\u8bd5\u673a\u662f\u5426\u5f00\u673a\u8fdb\u5165\u684c\u9762\u7684\u8bc6\u522b\u6807\u8bc6\u3002\n# 1\u3001\u901a\u8fc7\u684c\u9762\u56fe\u6807\u8bc6\u522b\u3002\n# - type=FILE_NAME\u65f6\uff0c\u670d\u52a1\u5668\u548c\u6d4b\u8bd5\u673a\u5fc5\u987b\u5728\u540c\u4e00\u5c40\u57df\u7f51\u5185\u3002\n# - power_on=dde-computer\u8868\u793a\u901a\u8fc7\u684c\u9762\u8ba1\u7b97\u673a\u56fe\u6807\u5224\u65ad\u5f00\u673a\u8fdb\u5165\u684c\u9762\u3002\n# 2\u3001\u901a\u8fc7\u672c\u5730\u56fe\u7247\u4f5c\u4e3a\u5f00\u673a\u8bc6\u522b\u3002\n# - type= \u4f20\u5165\u4e3a\u56fe\u7247\u683c\u5f0f\uff0ctype\u652f\u6301\u7684\u7c7b\u578b\u5305\u542b\u5728server.ini\u5185\u914d\u7f6e\u9879input_type=jpg,jpeg,png\u3002\n# - power_on= \u4f20\u5165\u7684\u662f\u672c\u5730\u56fe\u7247\u7684\u8def\u5f84\u3002\ntype=FILE_NAME\npower_on=dde-computer\n# \u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\uff08\u6d4b\u8bd5\u673a\u8fde\u63a5\u91c7\u96c6\u76d2\uff0c\u91c7\u96c6\u76d2\u7684\u5206\u8fa8\u7387\uff09\nheight=1080\nwidth=1920\n[AliasA1] ip=10.8.15.86\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n[AliasA2]\nip=10.8.15.20\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_2","title":"3\u3001\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e","text":"\u968f\u7740\u6d4b\u8bd5\u573a\u666f\u7684\u4e0d\u65ad\u5f15\u5165\uff0c\u53d1\u73b0\u73b0\u6709\u670d\u52a1\u7aef\u91cc\u7684\u914d\u7f6e\u9879\u5e76\u4e0d\u9002\u7528\u4e8e\u6240\u6709\u7684\u6027\u80fd\u573a\u666f\uff0c\u4e8e\u662f\u5c06\u670d\u52a1\u7aef\u914d\u7f6e\u8fdb\u884c\u4e00\u4e2a\u63d0\u53d6\uff0c\u53ef\u505a\u5355\u4e2a\u573a\u666f\u7684\u4e2a\u6027\u5316\u914d\u7f6e\uff0c\u5f53\u7136\u539f\u6765\u7684\u670d\u52a1\u7aef\u914d\u7f6e\u529f\u80fd\u4fdd\u7559\uff0c\u53ea\u662f\u5f53\u4f60\u914d\u7f6e\u4e86\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e\u540e\uff0c\u4f18\u5148\u4f7f\u7528\u4e2a\u6027\u5316\u914d\u7f6e\u91cc\u9762\u7684\u5185\u5bb9\uff0c\u4ee5\u4e0b\u662f\u5bf9\u4e2a\u6027\u5316\u914d\u7f6e\u7684\u4ecb\u7ecd\u3002 \u76ee\u524d\u6bcf\u4e00\u4e2a py \u6587\u4ef6\u5bf9\u5e94\u4e00\u4e2a\u6027\u80fd\u6d4b\u8bd5\u573a\u666f\uff0c\u4e8e\u662f\u5728\u540c\u7ea7\u76ee\u5f55\u4e0b\u521b\u5efa\u4e00\u4e2a\u4e0e\u4e4b\u540c\u540d\u7684 json \u6587\u4ef6\uff0c\u4f5c\u4e3a\u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6 apps\n\u251c\u2500\u2500 album\n \u251c\u2500\u2500 test_album_01_start.json # \u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6\n\u2514\u2500\u2500 test_album_01_start.py # \u6027\u80fd\u573a\u666f\u6587\u4ef6\n \u4ee5\u4e0b\u662f\u5bf9 json \u6587\u4ef6\u4e2d\u914d\u7f6e\u7684\u89e3\u91ca\uff0c\u82e5\u67d0\u9879\u914d\u7f6e\u4e0d\u9700\u8981\uff0c\u53ef\u4ee5\u7f3a\u5931\uff0c\u4f46\u4e0d\u80fd\u4e3a\u7a7a\uff1b {\n\"title\": \"test_album_start\", # \u6807\u9898\uff1b\u5fc5\u987b\n\"app_name\": \"deepin-album\", # \u573a\u666f\u6240\u5c5e\u7684\u5e94\u7528\uff1b\u5fc5\u987b\n\"scene\": \"hot\", # \u573a\u666f\u522b\u540d\uff1b\u5fc5\u987b\n\"icon\": [\"deepin-album\"], # \u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684icon\u5230\u670d\u52a1\u7aef\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\uff1b\u53ef\u7f3a\u5931\n# \u6ce8\u610f\uff1a\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684desktop\u6587\u4ef6\u540d\u4e3adeepin-album.desktop\uff0c\n# \u53ea\u9700\u8981\u5199deepin-album\u5373\u53ef\uff0c\u201c.desktop\u201d\u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002\n\"size\": { # \u56fe\u7247\u5bf9\u6bd4\u7684\u533a\u57df\u8bbe\u7f6e\u9879\uff0c\u67d0\u4e9b\u5e94\u7528\u5f53\u524d\u5c4f\u5e55\u7684\u90e8\u5206\u533a\u57df\u9700\u8981\u5c06\u5176\u53bb\u6389\uff0c\u53ef\u4ee5\u8bbe\u7f6e\u6b64\u9879\uff0c\u5982\u679c\u6ca1\u6709\u5219\u53ef\u4e0d\u5199\uff1b\u53ef\u786e\u5b9e\n\"x-coordinate\": 0, # \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n\"y-coordinate\": 0, # \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n\"width\": 850, # \u6a2a\u5411\u957f\u5ea6\n\"height\": 1920 # \u7eb5\u5411\u9ad8\u5ea6\n},\n\"count\": 5, # \u573a\u666f\u6267\u884c\u7684\u6b21\u6570\uff1b\u5fc5\u987b\n\"duration\": 5, # \u8be5\u6761\u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff0c\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7279\u5b9a\u573a\u666f\uff0c\u8be5\u914d\u7f6e\u4e3a\u53ef\u9009\u9879\uff0c\u8986\u76d6 server.ini \u4e2d\u7684\u914d\u7f6e\uff1b\u53ef\u7f3a\u5931\n\"stable_similarity\": 0.9997, # \u6027\u80fd\u573a\u666f\u5206\u9636\u6bb5\u65f6\u7684\u56fe\u7247\u76f8\u4f3c\u5ea6\u5bf9\u6bd4\uff0c\u524d\u540e\u56fe\u7247\u4f4e\u4e8e\u8be5\u503c\uff0c\u5219\u5206\u4e3a\u4e0d\u7a33\u5b9a\u9636\u6bb5\uff1b\u53ef\u7f3a\u5931\n\"find_by\": \"stage\", # \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\n\"final_stable_num\": 100, # \u67e5\u627e\u6700\u540e\u4e00\u4e2a\u5927\u4e8e\u8be5\u503c\u7684\u7a33\u5b9a\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u7684\u5c3e\u796f\uff1b\u53ef\u7f3a\u5931\n\"start_num\": 150,\n\"text\": \"\", # ocr\u8bc6\u522b\u7684\u6587\u6848\n\"match\": \"apps/xxx/images/match.png\", # \u56fe\u50cf\u5339\u914d\u7684\u56fe\u7247\u6587\u4ef6\u8def\u5f84\n\"match_rate\": 0.9 # \u5339\u914d\u76f8\u4f3c\u5ea6\n}\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e94\u3001\u6d4b\u8bd5\u6d41\u7a0b","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516d\u3001\u7528\u4f8b\u7f16\u5199\u53ca\u65b9\u6cd5\u53c2\u6570\u6307\u5f15","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"1\u3001\u7528\u4f8b\u5b9e\u4f8b\u8bf4\u660e","text":"# \u6807\u51c6\u5e93\u5bfc\u5165\nfrom time import sleep\n# \u5bfc\u5165\u4e09\u65b9\u5e93pytest\nimport pytest\n# \u5bfc\u5165\u7528\u4f8b\u6267\u884c\u8981\u7528\u5230\u7684Widget\u7c7b\nfrom src.base_widget import BaseWidget\nclass TestStart:\n# class\u7ea7\u522b\u7684fixture\uff0c\u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u6267\u884c\u3002autouse=True \u81ea\u52a8\u5728\u5f53\u524d\u4f5c\u7528\u57df\u4e0b\u4f7f\u7528\u3002\n@pytest.fixture(scope=\"class\", autouse=True)\n# \u6d4b\u8bd5\u70ed\u542f\u52a8\u4e4b\u524d\u9700\u8981\u9884\u542f\u52a8\u3002\ndef application_pre_start(self):\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().right_click_element(\"deepin-album\")\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().click_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\")\nsleep(2)\n# \u5feb\u6377\u952e\u5173\u95ed\u7a97\u53e3\nBaseWidget().hot_key(\"alt\", \"f4\")\nsleep(2)\n# \u9ed8\u8ba4\u4e3afunction\u7ea7\u522b\u7684fixture\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\uff0cclass\u7ea7\u522bfixture\u6267\u884c\u4e4b\u540e\u6267\u884c\u3002\n@pytest.fixture(autouse=True)\ndef setup_start(self):\n# \u53f3\u952e\u70b9\u51fb deepin-album \u56fe\u6807\nBaseWidget().right_click_element(\"deepin-album\")\n# \u79fb\u52a8\u5230\u53f3\u952e\u83dc\u5355\u4e2d\u6253\u5f00\uff08open.png\uff09\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().move_to(*BaseWidget().find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))\n# \u7b49\u5f85\u79fb\u52a8\u5b8c\u6210\nsleep(0.5)\ndef test_album_start(self):\n# \u70b9\u51fb\u201c\u6253\u5f00\u201d\nBaseWidget().click() \n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"2\u3001\u65b9\u6cd5\u53c2\u6570\u8bf4\u660e","text":"2.1\u3001find_element \u65b9\u6cd5 def find_element(element: str, input_type: str = \"FILE_NAME\", fill_color_position: tuple = (-1, -1), size: tuple = (25, 70)):\npass\n \u53c2\u6570 element \u548c input_type \uff081\uff09\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u5143\u7d20 - `input_type` \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a `FIEL_NAME` \uff0c\u8868\u793a\u901a\u8fc7\u5e94\u7528 `icon` \u5bfb\u627e\u5143\u7d20\uff0c\u6b64\u65b9\u6cd5\u4f1a\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u5e94\u7528 `icon` \u56fe\u6807\u3002\n \u4e3e\u4f8b\uff1a\u9ed8\u8ba4\u60c5\u51b5\u4e0b input_type \u53c2\u6570\u4e0d\u9700\u8981\u4f20\u5165\uff0c find_element(\"deepin-album\")\uff0c\u8868\u793a\u901a\u8fc7 deepin-album \u7684\u5e94\u7528 icon \u6765\u83b7\u53d6\u5750\u6807\uff0c\u6ce8\u610f\uff0c\u6b64\u65f6\u4f20\u5165\u7684 deepin-album \u53c2\u6570\u5b9e\u9645\u662f desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u548c2.3\u4e2d\u7684 icon \u53d8\u91cf\u4e00\u81f4\u3002 \u6211\u4eec\u5efa\u8bae\u4f18\u5148\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\uff0c\u4f46\u6b64\u65b9\u6cd5\u4f9d\u8d56\u7f51\u7edc\uff0c\u8bf7\u6839\u636e\u6d4b\u8bd5\u73af\u5883\u5b9e\u9645\u60c5\u51b5\u9009\u62e9\u3002 \uff082\uff09\u901a\u8fc7\u672c\u5730\u56fe\u7247\u8bc6\u522b\u5143\u7d20 - \u53c2\u6570 `input_type` \u4f20\u5165\u56fe\u7247\u683c\u5f0f\uff0c\u6bd4\u5982\u622a\u53d6\u7684\u672c\u5730\u56fe\u7247\u683c\u5f0f\u4e3a `png`\uff0c\u90a3\u4e48 `input_type=\"png\"`\uff0c\u6b64\u65f6\u53c2\u6570 `element ` \u4f20\u5165\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5efa\u8bae\u5b58\u653e\u5728\u5bf9\u5e94\u7684\u4ea7\u54c1 `apps/app/picture/` \u76ee\u5f55\u4e0b\uff0c\u8def\u5f84\u4e3a\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u7684\u76f8\u5bf9\u8def\u5f84\u3002\n- \u4e3e\u4f8b\uff1a`find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))`\uff0c\u8868\u793a\u901a\u8fc7\u672c\u5730\u56fe\u7247 `open.png` \u8bc6\u522b\u5143\u7d20\u3002\n \u53c2\u6570 fill_color_position fill_color_position \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (-1, -1)\uff0c(-1, -1) \u8868\u793a\u53d6\u5c4f\u5e55\u4e2d\u53f3\u4e0b\u89d2\u6700\u540e\u4e00\u4e2a\u50cf\u7d20\u70b9\u4f5c\u4e3a\u586b\u5145\u5750\u6807\uff0c\u5728 1920x1080 \u5c4f\u5e55\u5206\u8fa8\u7387\u4e0b\u5373\u5b9e\u9645\u5750\u6807\u4e3a (1919, 1079) \uff0c\u8fd9\u6837\u7684\u5199\u6cd5\u53ef\u4ee5\u9002\u914d\u4e0d\u540c\u5927\u5c0f\u7684\u5c4f\u5e55\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0d\u540c\u65b9\u4f4d\uff1a \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0b\u65b9\uff0c\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u4e0d\u9700\u8981\u4f20\u5165\u8be5\u53c2\u6570\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u5de6\u8fb9\uff0cfill_color_position=(1, 1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u53f3\u8fb9\uff0cfill_color_position=(-1, -1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0a\u8fb9\uff0cfill_color_position=(1, 1) \u4ece\u684c\u9762\u542f\u52a8\u5e94\u7528\uff0c\u5219\u9700\u8981\u4f20\u5165\u9664\u4efb\u52a1\u680f\u4ee5\u5916\u5176\u4ed6\u4f4d\u7f6e\u7684\u5750\u6807\uff0c\u6bd4\u5982(100, 100)\uff0c\u53ea\u8981\u8fd9\u4e2a\u5750\u6807\u4e3a\u9664\u5e94\u7528\u548c\u4efb\u52a1\u680f\u533a\u57df\u90fd\u53ef\u4ee5\u3002 \u4ece\u542f\u52a8\u5668\u91cc\u9762\u542f\u52a8\u5e94\u7528\uff0c\u9700\u8981\u586b\u5145\u7684\u5750\u6807\u4e3a\u542f\u52a8\u5668\u533a\u57df\u3002 \u6ce8\uff1a\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u65f6\uff0c\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684 icon \u539f\u6587\u4ef6\u4e3a svg \u77e2\u91cf\u56fe\uff0c\u8f6c\u6362\u4e3a png \u4e4b\u540e\u9700\u8981\u586b\u5145\u8fb9\u7f18\u900f\u660e\u90e8\u5206\u3002 \u53c2\u6570 size size \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (25, 70)\uff0c\u8868\u793a\u6d4b\u8bd5\u673a\u4e0a dock \u680f\u4e0a\u5e94\u7528\u56fe\u6807\u7684\u5927\u5c0f\u8303\u56f4\u3002 UOS \u7cfb\u7edf dock \u680f\u662f\u53ef\u4ee5\u4e0a\u4e0b\u62d6\u52a8\u5927\u5c0f\u7684\uff0c\u968f\u7740 dock \u680f\u5927\u5c0f\u6539\u53d8\uff0c\u5e94\u7528\u56fe\u6807\u7684\u8303\u56f4\u4e3a25\u523070\u4e4b\u95f4\u3002 \u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u64cd\u4f5c\u7cfb\u7edf\u4e0a dock \u680f\u5927\u5c0f\u4e0d\u4e00\u6837\uff0c\u53ef\u4ee5\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u4f20\u5165\u5927\u5c0f\u8303\u56f4\u3002 2.2\u3001click_element\u3001 right_click_element\uff0c double_click_element \u8fd9\u51e0\u4e2a\u65b9\u6cd5\u53c2\u6570\u89c4\u5219\u4e0e find_element \u65b9\u6cd5\u4e00\u6837\u3002\u4ed6\u4eec\u5b9e\u9645\u4e0a\u662f\u5728 find_element \u65b9\u6cd5\u57fa\u7840\u4e4b\u4e0a\u505a\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u589e\u52a0\u4e86\u9f20\u6807\u7684\u52a8\u4f5c\uff0c\u5982\u679c\u4f60\u4e0d\u60f3\u4f7f\u7528\u8fd9\u51e0\u4e2a\u65b9\u6cd5\uff0c\u5728\u7528\u4f8b\u4e2d\u4e5f\u53ef\u4ee5\u901a\u8fc7 find_element \u83b7\u53d6\u5230\u5750\u6807\uff0c\u7136\u540e\u5c06\u5750\u6807\u4f20\u5165\u5230\u952e\u9f20\u7684\u65b9\u6cd5\u4e2d\uff0c\u53ef\u4ee5\u5b9e\u73b0\u540c\u6837\u7684\u6548\u679c\u3002 2.3\u3001\u7528\u4f8b\u7c7b\u4e2d\u6709\u4e2a\u7c7b\u53d8\u91cf icon = [\"deepin-album\"] \u9700\u8981\u7279\u6b8a\u8bf4\u660e\uff0c\u5217\u8868\u4e2d\u7684\u5143\u7d20\u4e3a\u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709 icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684 icon \u5230\u670d\u52a1\u7aef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528 desktop \u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684 desktop \u6587\u4ef6\u540d\u4e3a deepin-album.desktop\uff0c\u53ea\u9700\u8981\u5199 deepin-album \u5373\u53ef\uff0c.desktop \u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e03\u3001\u6267\u884c\u5165\u53e3","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"1\u3001\u7528\u4f8b\u7ec4\u7ec7","text":"\u5728 setting/config/server.ini \u6587\u4ef6\u4e2d APP_NAME= \u5b57\u6bb5\u4e3a\u7528\u4f8b\u7684\u6267\u884c\u7684\u76ee\u5f55\uff0c\u9ed8\u8ba4\u4e3a apps \u76ee\u5f55\u4e0b\u6240\u6709\u7528\u4f8b\u3002\u5982\u679c\u4f60\u60f3\u6307\u5b9a\u6267\u884c\u67d0\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4f60\u53ef\u4ee5\u5c06\u8be5\u914d\u7f6e\u9879\u6307\u5b9a\u5230\u5e94\u7528\u7684\u7528\u4f8b\u76ee\u5f55\uff0c\u6bd4\u5982\uff1aAPP_NAME=deepin_album\uff0c \u8868\u793a\u6267\u884c\u76f8\u518c\u76ee\u5f55\u4e0b\u7684\u7528\u4f8b\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a python3 manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music\n -k KEYWORDS, --keywords KEYWORDS\n \u7528\u4f8b\u7684\u5173\u952e\u8bcd\n -t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e\n --log_level LOG_LEVEL \u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n --env {host,docker} \u5728\u5bbf\u4e3b\u673a\u6216\u5bb9\u5668\u73af\u5883\u6267\u884c\n --client_alias \u9009\u62e9\u6d4b\u8bd5\u673a\u522b\u540d, \u53ef\u9009\u9879\u4e3aclient.ini\u4e2d\u5df2\u914d\u7f6e, \u9ed8\u8ba4\u503c\u4e3a zx-x86.\n --count \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a python3 manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\" --env docker\n \u6ce8\uff1a\u5728\u5bb9\u5668\u4e2d\u6267\u884c\u65f6\uff0c\u82e5\u5f3a\u5236\u9000\u51fa\uff0c\u5bb9\u5668\u5e76\u4e0d\u4f1a\u505c\u6b62\u8fd0\u884c\uff01"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_9","title":"\u516b\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1json","title":"1\u3001Json \u62a5\u544a","text":"\u81ea\u7814\u89c6\u9891\u89e3\u6790\u5de5\u5177\u4f1a\u5bf9\u5355\u6761\u7528\u4f8b\u6267\u884c\u4e00\u8f6e\u751f\u6210\u4e00\u4e2a json \u6587\u4ef6\uff0c\u5b58\u653e\u4e8e report/{app_name}/{scene}/{run_num} \u76ee\u5f55\u4e0b\uff0c\u547d\u540d\u683c\u5f0f\u4e3a\uff1a report.json json \u5185\u5bb9\u4e3e\u4f8b\uff1a [\n{\n\"Stab1\": {\n\"images\": [1,2...150,151],\n\"startStub\": 0,\n\"type\": \"Stab\"\n}\n},\n{\n\"Stab2\": {\n\"images\": [152,153...169,170],\n\"startStub\": 1,\n\"type\": \"UnStab\"\n}\n},\n{\n\"Stab3\": {\n\"images\": [171,172...300,301],\n\"startStub\": 0,\n\"type\": \"UnStab\"\n}\n}\n]\n \u8bf4\u660e\uff1a Stab \uff1a\u8868\u793a\u89e3\u6790\u8fc7\u7a0b\u4e2d\u4e0d\u540c\u7684\u9636\u6bb5\u3002 images \uff1a\u8868\u793a\u6bcf\u4e00\u5e27\u7684\u56fe\u7247\u5e8f\u53f7\u3002 startStub\uff1a \u4e3a\u8bc6\u522b\u5c3e\u5e27\u7684\u9636\u6bb5\u8868\u793a\uff0c\u5982\u679c \"startStub\": 1 \uff0c\u8bf4\u660e\u5c3e\u5e27\u51fa\u73b0\u5728\u8be5\u9636\u6bb5\u3002 type\uff1a \u4e3a Stab \u6216 UnStab \uff0c\u8868\u793a\u7a33\u5b9a\u9636\u6bb5\u6216\u4e0d\u7a33\u5b9a\u9636\u6bb5\u3002 \u5404\u9636\u6bb5\u6709\u5e27\u6570\u8865\u507f\uff0c\u9ed8\u8ba4\u8865\u507f\u7684\u5e27\u6570\u4e3a 3 \u5e27\uff08\u53ef\u4ee5\u901a\u8fc7 server.ini \u91cc\u9762 un_stab_start=3 \u8fdb\u884c\u914d\u7f6e\uff09\uff0c\u8868\u793a\u5c0f\u4e8e\u7b49\u4e8e 3 \u5e27\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u524d\u540e\u5747\u9700\u8981\u51cf\u6389\u3002 \u5e94\u7528\u542f\u52a8\u9636\u6bb5\u5c31\u662f\u5728 Stab2 \u9636\u6bb5\uff0c\u542f\u52a8\u65f6\u95f4\u4e3a\uff1a171 \u51cf 151 \u518d\u51cf\u6389\u524d\u540e\u8865\u507f\u5e27\u6570 6 \u5e27\uff0c\u5373 14 \u5e27\uff0c\u89c6\u9891\u5e27\u7387 30 \u5e27/\u79d2\uff0c\u56e0\u6b64\u542f\u52a8\u8017\u65f6\u4e3a\uff1a14 * 33 = 462 ms"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2excel","title":"2\u3001Excel \u62a5\u544a","text":"\u6240\u6709\u7528\u4f8b\u6267\u884c\u5e76\u89e3\u6790\u5b8c\u4e4b\u540e\u4f1a report \u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a\u6c47\u603b\u6570\u636e\u7684 Excel \u6587\u4ef6\uff0c\u6587\u4ef6\u540d\u4e3a\uff1a{time}_perf_time.xlsx\u3002 \u6ce8\u610f\uff0creport \u76ee\u5f55\u4e3a\u53ef\u914d\u7f6e\u9879\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u4f1a\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u751f\u6210\uff0c\u5982\u679c\u4f60\u5c06 report\uff0c\u6307\u5b9a\u5230\u9879\u76ee\u4e0b\u5176\u4ed6\u8def\u5f84\uff0c\u5219\u4f1a\u5728\u5bf9\u5e94\u7684\u8def\u5f84\u4e0b\u751f\u6210 json \u548c Excel \u6587\u4ef6\u3002 \u4f60\u4e5f\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8bfb\u53d6\u6240\u6709 json / excel \u62a5\u544a\u7684\u6570\u636e\uff0c\u751f\u6210\u4f60\u81ea\u5df1\u60f3\u8981\u7684\u4e00\u4e9b\u6d4b\u8bd5\u62a5\u544a\u5f62\u5f0f\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#usb","title":"\u4e5d\u3001USB \u4e32\u53e3\u9a71\u52a8\u952e\u9f20\u65b9\u6cd5","text":"\u4f4d\u4e8e src/utils/control/serial_communication \u76ee\u5f55\u4e0b\u7684 usb_mk.py \u6587\u4ef6 usb_mk = UsbMk()\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up()\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u652f\u6301\u4f20\u5165\u6c49\u5b57\uff0c\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click()\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() \n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() \n \uff084\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() \n \uff085\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() \n \uff086\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() \n \uff087\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff088\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff0810\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_10","title":"\u5341\u3001\u7ee7\u7535\u5668\u63a7\u5236\u4e3b\u673a\u5f00\u673a/\u91cd\u542f","text":"\uff08\u82e5\u4e0d\u4f7f\u7528\u7ee7\u7535\u5668\uff0c\u53ef\u5ffd\u7565\u8be5\u6b65\u9aa4\uff0c\u6267\u884c\u65f6\u4f1a\u901a\u8fc7\u547d\u4ee4 reboot\uff09"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u7ee7\u7535\u5668\u8bbe\u5907","text":"LCUS-2 \u578b \u53cc\u8def USB \u667a\u80fd\u4e32\u53e3\u63a7\u5236\u7ee7\u7535\u5668\u3002 https://item.taobao.com/item.htm?spm=a1z09.2.0.0.41d72e8dUYx2pi&id=582653718178&_u=i25r20ia6a2e "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2usb","title":"2\u3001USB \u5ef6\u957f\u7ebf","text":"\u666e\u901a\u7684 USB \u7ebf\u5373\u53ef\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_3","title":"3\u3001\u675c\u90a6\u7ebf","text":"3.1\u300140P \u6bcd\u5bf9\u516c\u675c\u90a6\u7ebf\u3002 3.2\u3001\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"4\u3001\u5b89\u88c5\u56fe\u6587\u6559\u7a0b","text":"4.1\u3001\u4f7f\u7528 USB \u5ef6\u957f\u7ebf\u8fde\u63a5\u63a7\u5236\u7aef\u548c\u7ee7\u7535\u5668\u3002 4.2\u3001\u5728\u7ee7\u7535\u5668\u5e38\u7aef\u548c\u516c\u5171\u7aef\u5747\u8fde\u63a5\u4e00\u6839\u675c\u90a6\u7ebf\u3002 4.3\u3001\u5728\u4e3b\u677f\u4e0a\u5f00\u673a\u9488\u548c\u91cd\u542f\u9488\u4e0a\u63d2\u4e0a\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 4.4\u3001\u5c06\u5f00\u673a\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76841\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1\u5de6\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 4.5\u3001\u5c06\u91cd\u542f\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76842\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1 \u53f3\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 \u82e5\u60f3\u4fdd\u7559\u539f\u7535\u6e90\u5f00\u5173\u7684\u7535\u6e90\u706f\uff0c\u53ef\u6839\u636e\u5982\u4e0a\u56fe\u6240\u793a\uff0c\u4f7f\u7528\u675c\u90a6\u7ebf\u8fde\u63a5\u4e3b\u677f\u4e0a\u7684\u7535\u6e90\u706f\u548c\u539f\u7535\u6e90\u5f00\u5173"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_11","title":"\u5341\u4e00\u3001\u5e38\u89c1\u95ee\u9898\u8bf4\u660e","text":"1\u3001ERROR: for uos Cannot restart container 2301b1a1395d7959ee6523d61b61c87084649af530786cdb8fb5b3ecbcbd1068: linux runtime spec devices: error gathering device information while adding custom device \"/dev/ttyACM0\": no such file or directory \u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u8fde\u63a5\u72b6\u6001\uff0c\u67e5\u770b /dev/ttyACM0 \u662f\u5426\u5b58\u5728\uff0c\u82e5\u5b58\u5728 /dev/ttyACMn\uff08n\u4e3a\u4efb\u610f\u6570\u5b57\uff09\uff0c\u91cd\u542f\u7535\u8111\u89e3\u51b3\u3002 2\u3001Error response from daemon: Container 5e700fdc769e8c74666d68a7f2bc3de58268b4594cf88706609d59f8dbc7362d is not running \u5bb9\u5668\u542f\u52a8\u5931\u8d25 1\uff09\u68c0\u67e5\u54ea\u4e00\u4e2a\u5bb9\u5668\u672a\u542f\u52a8 sudo docker container ls # \u5217\u51fa\u8fd0\u884c\u4e2d\u7684 Docker \u5bb9\u5668\n 2\uff09\u7f3a\u5c11 uos \u5bb9\u5668\uff0c\u68c0\u67e5 USB \u4e32\u53e3\u8fde\u63a5\u7ebf\u548c\u91c7\u96c6\u76d2\u8fde\u63a5\u7ebf\u662f\u5426\u6b63\u5e38\uff0c\u91cd\u542f\u540e\u6267\u884c bash install/setup.up # \u91cd\u65b0\u5b8c\u6574\u90e8\u7f72\u73af\u5883\n \u6216\u6267\u884c sudo docker-compose up -d --build # \u4ec5\u91cd\u65b0\u6784\u5efa Docker \u955c\u50cf\n 3\u3001\u82e5\u90e8\u7f72\u65f6\u63d0\u793a\u6302\u8f7d ttyACM0\u3001video0 \u5931\u8d25\uff0c\u8bf7\u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u53ca\u91c7\u96c6\u76d2\u662f\u5426\u63a5\u89e6\u826f\u597d\uff0c\u82e5\u63a5\u89e6\u826f\u597d\uff0c\u91cd\u542f\u5373\u53ef\u89e3\u51b3\u3002 4\u3001\u82e5\u51fa\u73b0\u56fe\u7247\u80fd\u8bc6\u522b\uff0c\u4f46\u662f\u9f20\u6807\u672a\u79fb\u52a8\u64cd\u4f5c\u65f6\uff0c\u5b89\u88c5\u7edd\u5bf9\u9f20\u6807\u64cd\u4f5c\u7684\u4f9d\u8d56\u5305\uff0c\u89c1\u7b2c\u4e09\u8282\u7b2c\u4e8c\u5c0f\u8282\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u6d4b\u8bd5\u673a\u3002 5\u3001\u7531\u4e8e\u901a\u8fc7\u91c7\u96c6\u5361\u83b7\u53d6\u7684\u6d4b\u8bd5\u673a\u5b9e\u65f6\u753b\u9762\uff0c\u5305\u542b\u4e86\u9f20\u6807\u7684\u6837\u5f0f\uff0c\u6240\u4ee5\u5bf9\u56fe\u7247\u8bc6\u522b\u65f6\uff0c\u9f20\u6807\u82e5\u505c\u7559\u5728\u56fe\u6807\u4e0a\u5c42\uff0c\u5219\u4f1a\u5bf9\u8bc6\u522b\u7ed3\u679c\u9020\u6210\u5f71\u54cd\uff0c\u9700\u8981\u5c06\u9f20\u6807\u79fb\u52a8\u81f3\u5176\u4ed6\u4f4d\u7f6e\uff0c\u6216\u8005\u9690\u85cf\u9f20\u6807\u89e3\u51b3\u3002 6\u3001Excel \u62a5\u544a\u4e2d\uff0c\u6d4b\u8bd5\u573a\u666f\u5217\u4e0e\u7528\u4f8b\u4e2d\u7684\u4e0d\u4e00\u81f4\uff0c\u5173\u952e\u5b57scene\u3001app_name\u3001\u67b6\u6784\u522b\u540d\uff0c\u4e0d\u80fd\u5305\u542b\u4e0b\u5212\u7ebf\u548c\u82f1\u6587\u7b26\u53f7\u7684\u5706\u62ec\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/","title":"\u6846\u67b6\u529f\u80fd\u4ecb\u7ecd","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2023/1/12\n# Author : Mikigo\n# =============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_2","title":"\u4e00\u3001\u4e00\u53e5\u8bdd\u7b80\u4ecb","text":"\u6b64\u6587\u6863\u4e3b\u8981\u60f3\u5bf9 YouQu \u6846\u67b6\u4e00\u4e9b\u91cd\u70b9\u7684\u529f\u80fd\u505a\u8be6\u7ec6\u7684\u4ecb\u7ecd\uff0c\u5305\u62ec\u5bf9\u4e00\u4e9b\u529f\u80fd\u5f00\u53d1\u7684\u80cc\u666f\u3001\u8981\u89e3\u51b3\u7684\u95ee\u9898\u3001\u5b9e\u73b0\u903b\u8f91\u3001\u4ee3\u7801\u7b49\u65b9\u9762\u7684\u4ecb\u7ecd\uff0c\u4ee5\u6b64\u8ba9\u5927\u5bb6\u80fd\u66f4\u52a0\u6e05\u6670\u7684\u7406\u89e3\u5404\u9879\u529f\u80fd\uff0c\u4ece\u800c\u5728\u4f7f\u7528\u7684\u65f6\u5019\u80fd\u66f4\u52a0\u7684\u5f97\u5fc3\u5e94\u624b\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_3","title":"\u4e8c\u3001\u56fe\u50cf\u8bc6\u522b","text":"\u56fe\u50cf\u8bc6\u522b\u5728 UI \u81ea\u52a8\u5316\u4e2d\u662f\u4e0d\u53ef\u7f3a\u5c11\u7684\uff0c\u5e02\u9762\u4e0a\u751a\u81f3\u6709\u5b8c\u5168\u57fa\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\uff0c\u6bd4\u5982 Airtest\u3001Sikuli \u7b49\uff0c\u5728\u6e38\u620f\u7b49\u7279\u5b9a\u9886\u57df\u4e5f\u6709\u4e0d\u9519\u7684\u6548\u679c\uff0c\u8fd9\u4e9b\u5de5\u5177\u5b9e\u9645\u4e0a\u4e5f\u662f\u7528\u7684 OpenCV \u8fdb\u884c\u4e86\u5c01\u88c5\uff0cYouQu \u6846\u67b6\u57fa\u4e8e OpenCV \u5f00\u53d1\u4e86\u81ea\u5df1\u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\uff0c\u5b83\u53ef\u4ee5\u65b9\u4fbf\u7684\u7528\u4e8e\u754c\u9762\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u65ad\u8a00\uff1b YouQu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u51e0\u4e4e\u6ee1\u8db3\u4e86\u4f60\u7684\u6240\u6709\u8981\u6c42\uff0c\u6211\u4eec\u5728\u957f\u65f6\u95f4\u7684\u601d\u8003\u548c\u6478\u7d22\u4e2d\uff0c\u9488\u5bf9\u5e38\u89c4\u573a\u666f\u53ca\u4e00\u4e9b\u7279\u6b8a\u573a\u666f\u63a2\u7d22\u9664\u4e86\u4e00\u4e9b\u5b9e\u7528\u4e14\u6709\u6548\u7684\u65b9\u6848\uff0c\u4e14\u542c\u6211\u6162\u6162\u9053\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1","title":"1\u3001\u5e38\u89c4\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5e38\u89c4\u8bc6\u522b\u5f88\u597d\u7406\u89e3\uff0c\u4e00\u53e5\u8bdd\u8bb2\u5c31\u662f\uff0c\u8981\u83b7\u53d6\u5230\u76ee\u6807\u5143\u7d20\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u3002 \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u5728\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u9700\u8981\u83b7\u53d6\u7684\u5750\u6807\u662f\u76f8\u5bf9\u4e8e\u6574\u4e2a\u5c4f\u5e55\u7684\u5750\u6807\uff0c\u6211\u4eec\u53ef\u4ee5\u622a\u53d6\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u56fe\u7247\uff08screen\uff09\uff1b \u5728\u5143\u7d20\u8bc6\u522b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u622a\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5c0f\u56fe\u8fdb\u884c\u8bc6\u522b\uff0c\u6bd4\u5982\u622a\u53d6\u64ad\u653e\u6309\u94ae\uff1a \u90a3\u4e48\u5b9e\u9645\u4e0a\uff0c\u5143\u7d20\u5b9a\u4f4d\u7684\u95ee\u9898\u5c31\u8f6c\u6362\u4e3a\uff0c\u5c06\u622a\u56fe\u7684\u5c0f\u56fe\uff08play_btn\uff09\u62ff\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u5927\u56fe\uff08screen\uff09\u4e2d\u53bb\u505a\u5339\u914d\uff0c\u5982\u679c\u5339\u914d\u6210\u529f\uff0c\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff08 x, y \uff09\u5373\u53ef\u3002 \u4e3a\u4e86\u65b9\u4fbf\u63cf\u8ff0\uff0c\u4ee5\u4e0b\u6211\u5c06\u6574\u4e2a\u5c4f\u5e55\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5927\u56fe\uff0c\u67d0\u4e2a\u5143\u7d20\u56fe\u7247\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5c0f\u56fe\u3002 \u57fa\u4e8e OpenCV \u7684\u6a21\u677f\u5339\u914d cv.matchTemplate() \u529f\u80fd\uff0c\u6211\u4eec\u5b9e\u73b0\u4e86\u56fe\u50cf\u5b9a\u4f4d\u7684\u529f\u80fd\uff0c\u6846\u67b6\u63d0\u4f9b\u4e86\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u5e95\u5c42\u63a5\u53e3\uff08\u4e00\u822c\u4e0d\u5bf9\u4e0a\u5c42\u63d0\u4f9b\u8c03\u7528\uff09\uff1a def _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\n# \u8be6\u7ec6\u4ee3\u7801\u592a\u957f\u4e0d\u8d34\u4e86\uff0c\u611f\u5174\u8da3\u8bf7\u67e5\u770b\u6e90\u7801\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001image_path image_path \u662f\u5c0f\u56fe\u7684\u7edd\u5bf9\u8def\u5f84; \u901a\u5e38\u5728 AT \u5de5\u7a0b\u91cc\u9762\uff0c\u6211\u4eec\u7ea6\u5b9a\u5c06\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u5b9e\u9645\u7684\u5143\u7d20\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1aplay_btn.png \uff1b \u7528\u4e8e\u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 case/assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1amusic_001.png \uff1b \u8fd9\u6837\u662f\u4e3a\u4e86\u65b9\u4fbf\u7ba1\u7406\u548c\u7ef4\u62a4\u3002 2\u3001rate \u56fe\u50cf\u8bc6\u522b\u7684\u7684\u5339\u914d\u5ea6\u6216\u8005\u8bf4\u76f8\u4f3c\u5ea6\uff0c\u6846\u67b6\u9ed8\u8ba4\u7684\u914d\u7f6e\u4e3a 0.9\uff0c\u4e5f\u5c31\u662f\u8bf4\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u5b58\u5728\u4e00\u4e2a\u76f8\u4f3c\u5ea6 90% \u7684\u56fe\u6807\u5373\u8fd4\u56de\u5176\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff1b \u5982\u679c\u4f60\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u8c03\u6574\u8bc6\u522b\u5ea6\uff0c\u4f60\u53ef\u4ee5\u5728\u8c03\u7528\u51fd\u6570\u7684\u65f6\u5019\uff0c\u4f20\u5165\u4e0d\u540c\u7684\u8bc6\u522b\u5ea6\u7684\u503c\u3002 3\u3001multiple \u9ed8\u8ba4\u60c5\u51b5\u4e0b multiple=False\uff0c\u8868\u793a\u53ea\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u7b2c\u4e00\u4e2a\uff0c\u5982\u679c multiple=True \u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\uff0c\u56e0\u4e3a\u5927\u56fe\u4e2d\u53ef\u80fd\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u5c0f\u56fe\uff0c\u5728\u67d0\u4e9b\u573a\u666f\u4e0b\u4f60\u53ef\u80fd\u9700\u8981\u5168\u90e8\u83b7\u53d6\u5230\u6240\u6709\u5339\u914d\u5230\u7684\u5750\u6807\u3002 4\u3001picture_abspath \u9ed8\u8ba4\u60c5\u51b5\u4e0b picture_abspath=None \u8868\u793a\u5927\u56fe\u4e3a\u622a\u53d6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u5982\u679c\u4f60\u4e0d\u5e0c\u671b\u5927\u56fe\u662f\u5c4f\u5e55\u7684\u622a\u56fe\uff0c\u800c\u662f\u4f60\u81ea\u5b9a\u4e49\u4f20\u5165\u7684\u67d0\u4e2a\u56fe\u7247\uff0c\u4f60\u53ea\u9700\u8981\u5c06\u4f60\u7684\u56fe\u7247\u8def\u5f84\u4f20\u9012\u7ed9\u8fd9\u4e2a\u53c2\u6570\u5c31\u884c\uff0c\u6bd4\u5982\uff1a picture_abspath=\"~/Desktop/big.png\" \uff1b 5\u3001screen_bbox \u5927\u56fe\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u622a\u53d6\u6574\u4e2a\u5c4f\u5e55\uff0cscreen_bbox = [x, y, w, h] \u53ef\u4ee5\u6307\u5b9a\u622a\u53d6\u5c4f\u5e55\u4e2d\u7684\u56fa\u5b9a\u533a\u57df\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\uff0c\u53ef\u4ee5\u6392\u9664\u90e8\u5206\u533a\u57df\u5bf9\u8bc6\u522b\u7ed3\u679c\u7684\u5f71\u54cd\u3002 \u3010\u9690\u5f0f\u7b49\u5f85\u3011 \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\uff0c\u6709\u65f6\u5019\u9875\u9762\u8df3\u8f6c\u6709\u5ef6\u65f6\uff0c\u6709\u53ef\u80fd\u5b58\u5728\u8bc6\u522b\u7684\u90a3\u4e00\u523b\u9875\u9762\u4e5f\u6ca1\u6709\u8df3\u8f6c\u51fa\u6765\uff0c\u6216\u8005\u6216\u8005\u8bc6\u522b\u7684\u90a3\u4e00\u523b\uff1b \u56e0\u6b64\u6211\u4eec\u9700\u8981\u4e00\u79cd\u7b49\u5f85\u673a\u5236\uff0c\u5373\u5728\u4e00\u5b9a\u7684\u65f6\u95f4\u5185\uff0c\u5982\u679c\u8bc6\u522b\u4e0d\u5230\uff0c\u91cd\u590d\u53bb\u8bc6\u522b\uff1a def find_image(\ncls,\n*widget, rate: [float, int] = None,\nmultiple: bool = False,\nmatch_number: int = None,\npicture_abspath: str = None,\nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u5728\u5c4f\u5e55\u4e2d\u533a\u5bfb\u627e\u5c0f\u56fe\uff0c\u8fd4\u56de\u5750\u6807\uff0c\n \u5982\u679c\u627e\u4e0d\u5230\uff0c\u6839\u636e\u914d\u7f6e\u91cd\u8bd5\u6b21\u6570\uff0c\u6bcf\u6b21\u95f4\u96941\u79d2\n :param widget: \u6a21\u677f\u56fe\u7247\u8def\u5f84\n :param rate: \u76f8\u4f3c\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param match_number: \u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\n :return: \u5750\u6807\u5143\u7ec4\n \"\"\"\nif rate is None:\nrate = float(GlobalConfig.IMAGE_RATE)\ntry:\nfor element in widget:\nfor _ in range((match_number or int(GlobalConfig.IMAGE_MATCH_NUMBER)) + 1):\nlocate = cls._match_image_by_opencv(\nelement,\nrate,\nmultiple=multiple,\npicture_abspath=picture_abspath,\nscreen_bbox=screen_bbox\n)\nif not locate:\nsleep(int(GlobalConfig.IMAGE_MATCH_WAIT_TIME))\nelse:\nreturn locate\nraise TemplateElementNotFound(*widget)\nexcept Exception as e:\nraise e\n \u53c2\u6570 match_number \u7528\u4e8e\u63a7\u5236\u91cd\u590d\u8bc6\u522b\u7684\u6b21\u6570\uff0c\u9ed8\u8ba4\u4e0d\u4f20\u53c2\uff0c\u53d6\u5168\u5c40\u914d\u7f6e setting/globalconfig.ini \u91cc\u9762\u7684 IMAGE_MATCH_NUMBER \u914d\u7f6e\u9879\u7684\u503c\uff0c\u9ed8\u8ba4IMAGE_MATCH_NUMBER = 1\uff0c\u5373\u91cd\u8bd5 1 \u6b21\uff1b find_image \u662f\u6846\u67b6\u63d0\u4f9b\u7684\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u51fd\u6570\u63a5\u53e3\uff0c\u8fd9\u4e2a\u51fd\u6570\u63d0\u4f9b\u4e86\u9690\u5f0f\u7b49\u5f85\u7684\u529f\u80fd\uff0c\u4e14\u5305\u542b\u4e0a\u9762\u4ecb\u7ecd\u7684 _match_image_by_opencv \u51fd\u6570\u7684\u6240\u6709\u529f\u80fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2","title":"2\u3001\u6c14\u6ce1\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u6c14\u6ce1\u8bc6\u522b\u6307\u7684\u662f\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\u8981\u5b9a\u4f4d\u7684\u5143\u7d20\u662f\u4e00\u4e9b\u4f1a\u6d88\u5931\u7684\u5c0f\u5f39\u7a97\uff0c\u8fd9\u7c7b\u573a\u666f\u5728\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\u5c31\u53ef\u80fd\u5b58\u5728\u4e0d\u7a33\u5b9a\u6027\uff0c\u6709\u53ef\u80fd\u56fe\u50cf\u8bc6\u522b\u7684\u65f6\u5019\u6c14\u6ce1\u5df2\u7ecf\u6d88\u5931\u4e86\uff0c\u4e5f\u6709\u53ef\u80fd\u6c14\u6ce1\u51fa\u73b0\u7684\u65f6\u95f4\u592a\u77ed\u4e86\uff0c\u4e0d\u5bb9\u6613\u6355\u6349\u5230\uff0c\u5c31\u50cf\u6c14\u6ce1\u4e00\u6837\uff0c\u51fa\u73b0\u4e00\u4e0b\u5c31\u6d88\u5931\uff0c\u56e0\u6b64\u6211\u4eec\u5f62\u8c61\u7684\u79f0\u4e4b\u4e3a \u201c\u6c14\u6ce1\u8bc6\u522b\u201d\uff1b \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u4e3a\u4e86\u80fd\u7a33\u5b9a\u7684\u8bc6\u522b\u6c14\u6ce1\u7c7b\u573a\u666f\uff0c\u6211\u4eec\u91c7\u7528\u7684\u65b9\u6848\u662f\uff1a \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\uff08\u5305\u542b\u6c14\u6ce1\u4ece\u51fa\u73b0\u5230\u6d88\u5931\uff09\uff0c\u4e0d\u505c\u7684\u622a\u53d6\u8fd9\u6bb5\u65f6\u95f4\u5185\u7684\u5927\u56fe\uff0c\u4ee5\u6b64\u786e\u4fdd\u5728\u622a\u53d6\u7684\u4e00\u5806\u56fe\u7247\u4e2d\uff0c\u80af\u5b9a\u6709\u81f3\u5c11\u4e00\u5f20\u56fe\u7247\u80fd\u6355\u6349\u5230\u6c14\u6ce1\uff0c\u6700\u540e\u518d\u5bf9\u8fd9\u4e00\u5806\u56fe\u7247\u9010\u4e2a\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def get_during(\ncls,\nimage_path: str,\nscreen_time: [float, int],\nrate: float = None,\npause: [int, float] = None,\nmax_range: int = 10000\n):\n\"\"\"\n \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u622a\u56fe\u591a\u5f20\u56fe\u7247\u8fdb\u884c\u8bc6\u522b\uff0c\u5176\u4e2d\u6709\u4e00\u5f20\u56fe\u7247\u8bc6\u522b\u6210\u529f\u5373\u8fd4\u56de\u7ed3\u679c;\n \u9002\u7528\u4e8e\u6c14\u6ce1\u7c7b\u7684\u65ad\u8a00\uff0c\u6bd4\u5982\u6c14\u6ce1\u57281\u79d2\u5185\u6d88\u5931\uff0c\u5982\u679c\u7528\u5e38\u89c4\u7684\u56fe\u50cf\u8bc6\u522b\u5219\u6709\u53ef\u80fd\u65e0\u6cd5\u8bc6\u522b\u5230\uff1b\n :param image_path: \u8981\u8bc6\u522b\u7684\u6a21\u677f\u56fe\u7247\uff1b\n :param screen_time: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff1b\n :param rate: \u8bc6\u522b\u7387\uff1b\n :param pause: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u4e0d\u95f4\u9694\uff1b\n :param max_range: \u622a\u56fe\u7684\u6700\u5927\u6b21\u6570\uff0c\u8fd9\u662f\u4e00\u4e2a\u9884\u8bbe\u503c\uff0c\u4e00\u822c\u60c5\u51b5\u4e0b\u4e0d\u6d89\u53ca\u4fee\u6539\uff1b\n \"\"\"\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001screen_time \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5728\u6b64\u65f6\u95f4\u5185\u4f1a\u4e0d\u65ad\u7684\u8fdb\u884c\u622a\u56fe\u64cd\u4f5c\uff0c\u5c31\u50cf\u5f55\u5236\u89c6\u9891\u4e00\u6837\uff1b 2\u3001pause \u6bcf\u6b21\u622a\u53d6\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u4e00\u523b\u4e0d\u505c\u7684\u622a\u56fe\uff0c\u5982\u679c\u4f60\u60f3\u6bcf\u6b21\u622a\u56fe\u5b58\u5728\u4e00\u4e9b\u95f4\u9694\u65f6\u95f4\u4f20\u5165\u5bf9\u5e94\u7684\u65f6\u95f4\u95f4\u9694\u5373\u53ef\uff0c\u5355\u4f4d\u662f\u79d2\uff0c\u6bd4\u5982\uff1apause = 0.03\uff0c\u8868\u793a 30 ms\uff0c\u76f8\u5f53\u4e8e\u5e27\u7387\u4e3a 30 \u5e27\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-opencv","title":"3\u3001\u4e0d\u4f9d\u8d56 OpenCV \u7684\u56fe\u50cf\u8bc6\u522b\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31","title":"3.1\u3001\u81ea\u7814\u56fe\u50cf\u8bc6\u522b\u6280\u672f","text":"\u3010\u539f\u7406\u3011 \u4e3a\u4e86\u5b9e\u73b0\u8bc6\u522b\u56fe\u50cf\u7684\u76ee\u7684\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u5c06\u56fe\u7247\u7684\u6bcf\u4e2a\u50cf\u7d20\u7684RGB\u503c\uff0c\u4e0e\u6574\u4e2a\u5c4f\u5e55\u4e2d\u7684RGB\u8fdb\u884c\u5bf9\u6bd4\uff0c\u5982\u679c\u5c0f\u56fe\u4e0a\u7684RGB\u503c\u4e0e\u5bf9\u5e94\u5927\u56fe\u4f4d\u7f6e\u7684RGB\u90fd\u76f8\u7b49\uff0c\u5219\u5339\u914d\u6210\u529f\uff0c\u5373\u53ef\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u70b9\u3002 1\u3001\u8bfb\u53d6\u5c0f\u56fe\u548c\u5927\u56fe\u7684RGB\u503c \uff081\uff09\u5c0f\u56fe\u7684RGB\u503c small_data = small_pic.load() # load()\u4f1a\u5c06\u56fe\u7247\u7684RGB\u503c\u83b7\u53d6\u5230\uff0c\u6570\u636e\u683c\u5f0f\u4e3a\u4e00\u4e2a\u4e8c\u7ef4\u5217\u8868\uff0c\u8d4b\u503c\u7ed9\u4e00\u4e2a\u53d8\u91cfsmall_data\u3002\n \uff082\uff09\u5927\u56fe\u7684RGB\u503c big_data = big_pic.load()\n 2\u3001\u5c06\u5c0f\u56fe\u4e0e\u5927\u56fe\u7684RGB\u503c\u8fdb\u884c\u5339\u914d \uff081\uff09\u5339\u914d\u4ece\u5927\u56fe\u7684\u5750\u6807\uff080\uff0c0\uff09\u5f00\u59cb\u5339\u914d\uff0c\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff082\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\uff080\uff0c0\uff09\u5bf9\u5e94\u7684\u6240\u6709\u5c0f\u56fe\u7684RGB\u503c\u4e0d\u76f8\u7b49\uff0c\u5219\u79fb\u52a8\u5230\u4e0b\u4e00\u4e2a\u5750\u6807\u70b9\uff081\uff0c0\uff09\uff0c\u540c\u6837\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff083\uff09\u6309\u7167\u8fd9\u6837\u7684\u89c4\u5f8b\u5c06\u8fd9\u4e00\u884c\u6bcf\u79fb\u52a8\u4e00\u4e2a\u5750\u6807\u70b9\uff0c\u90fd\u5c06\u5c0f\u56fe\u6240\u6709\u7684RGB\u4e0e\u5bf9\u5e94\u5927\u56fe\u7684\u503c\u8fdb\u884c\u5339\u914d\uff1b \uff084\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\u5176\u4e2d\u4e00\u4e2a\u5750\u6807\u70b9\u4e0a\u5339\u914d\u5230\u4e86\u5c0f\u56fe\u7684\u6240\u6709RGB\u503c\uff0c\u5219\u6b64\u65f6\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\u70b9\uff1b \uff085\uff09\u5982\u679c\u5339\u914d\u4e86\u5927\u56fe\u6240\u6709\u7684\u5750\u6807\u70b9\uff0c\u90fd\u6ca1\u6709\u5339\u914d\u5230\uff0c\u5219\u8bf4\u660e\u5927\u56fe\u4e2d\u4e0d\u5b58\u5728\u5c0f\u56fe\uff0c\u5339\u914d\u5931\u8d25\uff1b \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 class ImageRgb:\n@staticmethod\ndef _check_match(_x, _y, small, bdata, sdata, rate):\n\"\"\"\n Matching degree of small graph and large graph matching\n \"\"\"\n@staticmethod\ndef _pre_random_point(small):\n\"\"\"\n Pre matching, take 10-20 points at random each time,\n and take coordinates randomly in the small graph\n \"\"\"\n@staticmethod\ndef _pre_random_match(_x, _y, point_list, bdata, sdata, rate):\n\"\"\"\n In the small graph, several points are randomly\n selected for matching, and the matching degree is\n also set for the random points\n \"\"\"\n@classmethod\ndef match_image_by_rgb(cls, image_name=None, image_path=None, rate=0.9):\n\"\"\"\n By comparing the RGB values of the small image with the large\n image on the screen, the coordinates of the small image on\n the screen are returned.\n \"\"\"\n \u901a\u8fc7 match_image_by_rgb() \u8fd9\u4e2a\u51fd\u6570\uff0c\u4f20\u5165\u76ee\u6807\u5c0f\u56fe\u7684\u6587\u4ef6\u540d\u79f0\uff0c\u5373\u53ef\u8fd4\u56de\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u3002 \u6709\u540c\u5b66\u8981\u95ee\u4e86\uff0c\u6709 OpenCV \u5e72\u561b\u4e0d\u7528\uff0c\u6709\u5fc5\u8981\u81ea\u5df1\u5b9e\u73b0\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u529f\u80fd\u5417\uff0c\u4f60\u4eec\u662f\u4e0d\u662f\u95f2\u7684\u554a\uff1f \u8fd9\u4e48\u95ee\u7684\u8bdd\uff0c\u5c0f\u4e86\uff0c\u683c\u5c40\u5c0f\u4e86\uff1b\u6211\u4eec\u81ea\u5df1\u5b9e\u73b0\u4e3b\u8981\u6709\u51e0\u65b9\u9762\u539f\u56e0\uff1a \u51cf\u5c11\u73af\u5883\u4f9d\u8d56\uff0c\u5373\u4e0d\u7528\u5b89\u88c5 OpenCV\uff0c\u6211\u4eec\u4e5f\u80fd\u5b9e\u73b0\u5176\u529f\u80fd\uff0c\u73af\u5883\u4f9d\u8d56\u8fd9\u5757\u540e\u9762\u4f1a\u5355\u72ec\u8be6\u7ec6\u8bb2\uff0c\u51cf\u5c11\u73af\u5883\u4f9d\u8d56\u5bf9\u4e8e\u4efb\u4f55\u8f6f\u4ef6\u5de5\u7a0b\u90fd\u975e\u5e38\u91cd\u8981\uff1b OpenCV \u5728\u5176\u4ed6\u56fd\u4ea7 CPU \u67b6\u6784\u4e0a\u5b89\u88c5\u5e76\u4e0d\u80fd\u4fdd\u8bc1100%\u6210\u529f\uff0c\u751a\u81f3\u6709\u6ca1\u6709\u53ef\u80fd\u5728\u4e00\u4e9b\u67b6\u6784\u4e0a\u538b\u6839\u513f\u5c31\u4e0d\u80fd\u5b89\u88c5\u4f7f\u7528 OpenCV \uff1f \u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 OpenCV \uff1f\u5c31\u50cf\u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 Windows \u5462\uff1f\u8fd9\u4e9b\u95ee\u9898\u503c\u5f97\u601d\u8003\u3002 \u5f53\u7136\uff0c\u6211\u4eec\u627f\u8ba4\u8fd9\u5957\u65b9\u6848\uff0c\u867d\u7136\u8bc6\u522b\u51c6\u786e\u7387\u6ca1\u95ee\u9898\uff0c\u4f46\u5728\u8bc6\u522b\u6548\u7387\u4e0a\u8fd8\u6ca1\u6709\u8fbe\u5230 OpenCV \u6a21\u677f\u5339\u914d\u7684\u6548\u679c\uff0c\u6211\u4eec\u7684\u65b9\u6848\u6bcf\u6b21\u8bc6\u522b\u5728 1.5s \u5de6\u53f3\uff0c\u800c OpenCV \u5728 1s \u5de6\u53f3\uff1b \u6574\u4f53\u8bc6\u522b\u6548\u679c\u6765\u8bb2\uff0c\u6211\u8ba4\u4e3a\u8fd8\u662f\u53ef\u4ee5\u63a5\u53d7\u7684\uff0c\u4e5f\u5e0c\u671b\u6709\u5fd7\u4e4b\u58eb\u80fd\u4e00\u8d77\u4f18\u5316\u6b64\u65b9\u6848\uff0c\u4e00\u8d77\u6280\u672f\u62a5\u56fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32-rpc","title":"3.2\u3001\u57fa\u4e8e RPC \u670d\u52a1\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b","text":"\u5728\u8fdc\u7a0b\u670d\u52a1\u5668\u4e0a\u90e8\u7f72 OpenCV \u7684\u73af\u5883\uff0c\u5e76\u5c06\u5176\u90e8\u7f72\u4e3a RPC \u670d\u52a1\uff0c\u6d4b\u8bd5\u673a\u4e0a\u4e0d\u7528\u5b89\u88c5 OpenCV \u4f9d\u8d56\uff0c\u800c\u662f\u901a\u8fc7\u8bf7\u6c42 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u3010\u539f\u7406\u3011 \u6d4b\u8bd5\u673a\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u56fe\u7247\u4ee5\u53ca\u6a21\u677f\u56fe\u7247\uff0c\u53d1\u9001\u7ed9 RPC \u670d\u52a1\u7aef\uff0c\u670d\u52a1\u7aef\u62ff\u5230\u4e24\u5f20\u56fe\u7247\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u6700\u540e\u5c06\u8bc6\u522b\u7ed3\u679c\u8fd4\u56de\u7ed9\u6d4b\u8bd5\u673a\uff1b \u8981\u7279\u6b8a\u8bf4\u660e\u7684\u662f\uff1a RPC \u662f\u4e00\u79cd\u534f\u8bae\uff0c\u8bb8\u591a\u8bed\u8a00\u90fd\u662f\u652f\u6301\u7684\uff0c\u6bd4\u5982\u8bf4\u670d\u52a1\u7aef\u4e5f\u53ef\u4ee5\u7528 C++ \u6765\u5b9e\u73b0\uff0c\u5ba2\u6237\u7aef\u4f7f\u7528 Python \u4e5f\u662f\u53ef\u4ee5\u8c03\u7528\u7684\u3002 \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 \u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nimport cv2 as cv\nimport numpy as np\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\nif __name__ == \"__main__\":\nserver = ThreadXMLRPCServer((\"x.x.x.x\", 8889), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(match_image_by_opencv, \"match_image_by_opencv\")\nserver.serve_forever()\n \u8fd9\u6837\uff0c\u6211\u4eec\u57fa\u4e8e Python \u6807\u51c6\u5e93 xmlrpc \u642d\u5efa\u4e86\u4e00\u4e2a RPC \u670d\u52a1\u5668\uff0c\u6ce8\u518c\u4e86 image_put \u548c match_image_by_opencv \u4e24\u4e2a\u529f\u80fd\u63a5\u53e3\uff0c\u5728\u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u901a\u8fc7 IP \u548c\u7aef\u53e3\u8fdb\u884c RPC \u8bf7\u6c42\uff1b \u5ba2\u6237\u7aef\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from xmlrpc.client import Binary\nfrom xmlrpc.client import ServerProxy\nserver = ServerProxy(GlobalConfig.OPENCV_SERVER_HOST, allow_none=True)\nscreen_rb = open(screen, \"rb\")\ntemplate_rb = open(template_path, \"rb\")\ntry:\nscreen_path = server.image_put(Binary(screen_rb.read()))\nscreen_rb.close()\ntpl_path = server.image_put(Binary(template_rb.read()))\ntemplate_rb.close()\nreturn server.match_image_by_opencv(\ntpl_path, screen_path, rate, multiple\n)\nexcept OSError as exc:\nraise EnvironmentError(\nf\"RPC\u670d\u52a1\u5668\u94fe\u63a5\u5931\u8d25. {GlobalConfig.OPENCV_SERVER_HOST}\"\n) from exc\n \u901a\u8fc7\u8fd4\u56de server.match_image_by_opencv \u5c31\u83b7\u53d6\u4e86\u5728\u670d\u52a1\u7aef\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4","title":"4\u3001\u53f3\u952e\u83dc\u5355\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41","title":"4.1\u3001\u53f3\u952e\u83dc\u5355\u5b9a\u4f4d\u7684\u65b9\u6848\u53ca\u95ee\u9898","text":"\u53f3\u952e\u83dc\u5355\u7684\u5143\u7d20\u5b9a\u4f4d\u662f\u4e00\u4e2a\u96be\u70b9\uff0c\u8fc7\u53bb\u6211\u4eec\u8c03\u7814\u548c\u4f7f\u7528\u8fc7\u7684\u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u65b9\u6cd5\u6709 4 \u79cd\uff1a \u7b2c\u4e00\u79cd\uff1a\u6b65\u957f\u64cd\u4f5c\u6cd5 \u5728\u53f3\u952e\u83dc\u5355\u547c\u51fa\u6765\u4e4b\u540e\uff0c\u901a\u8fc7\u952e\u76d8\u7684 up\u3001down \u6309\u952e\uff0c\u8fdb\u884c\u9009\u62e9\u83dc\u5355\u9009\u62e9\uff0c\u9009\u4e2d\u76ee\u6807\u4e4b\u540e enter \u5373\u53ef\uff1b\u6bd4\u5982\uff1a\u5728\u684c\u9762\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\uff0c\u6309 1 \u6b21 down \uff0c\u4f1a\u51fa\u73b0\u4e0b\u56fe\uff1a \u7ee7\u7eed\u518d\u6309 2 \u6b21 down\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u518d\u6309 enter\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u5982\u6b64\uff0c\u201c\u6392\u5e8f\u65b9\u5f0f\u201d\u7684\u6b65\u957f\u4e3a 3\uff1b\u901a\u8fc7\u4f7f\u7528\u952e\u76d8\u4e0a\u4e0b\u952e\uff0c\u5c31\u5b9e\u73b0\u4e86\u5bf9\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\uff1b \u4f46\u662f\uff0c\u8fd9\u79cd\u65b9\u5f0f\u6709\u4e2a\u5f88\u70e6\u4eba\u7684\u95ee\u9898\uff0c\u5c31\u662f\u53f3\u952e\u83dc\u5355\u7684\u9009\u9879\u4f4d\u7f6e\u4e0d\u53ef\u80fd\u4e00\u76f4\u4e0d\u53d8\uff0c\u5728\u9700\u6c42\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\uff0c\u83dc\u5355\u9009\u9879\u7684\u53d8\u5316\u662f\u5f88\u5927\u7684\uff0c\u751a\u81f3\u6709\u4e9b\u5e94\u7528\u652f\u6301\u81ea\u5b9a\u4e49\u83dc\u5355\uff0c\u6bd4\u5982\u6587\u7ba1\u53f3\u952e\u83dc\u5355\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff1b \u4e5f\u5c31\u662f\u8bf4\u4f60\u5f97\u7ecf\u5e38\u53bb\u7ef4\u62a4\u83dc\u5355\u9009\u9879\u7684\u6b65\u957f\uff0c\u4e00\u4e2a\u9009\u9879\u73b0\u5728\u7684\u6b65\u957f\u662f 3\uff0c\u4e0b\u4e2a\u8fed\u4ee3\u53ef\u80fd\u5c31\u662f 4 \u6216\u8005 5\u3002 \u7b2c\u4e8c\u79cd\uff1a\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u6cd5 \u628a\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5355\u72ec\u622a\u56fe\u4fdd\u5b58\uff0c\u56fe\u7247\u4e2d\u4ec5\u5305\u542b\u4e00\u4e2a\u83dc\u5355\u9009\u9879\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u8fd9\u6837\uff0c\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5c31\u53ef\u4ee5\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u65b9\u5f0f\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u8fd9\u79cd\u65b9\u5f0f\u4e0d\u7528\u62c5\u5fc3\u83dc\u5355\u9009\u9879\u7684\u987a\u5e8f\u6216\u4f4d\u7f6e\uff0c\u4f46\u662f\u9700\u8981\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff0c\u4e14\u5bb9\u6613\u53d7\u5230\u5b57\u4f53 UI \u53d8\u66f4\u7c7b\u9700\u6c42\u7684\u5f71\u54cd\uff0c\u6bd4\u5982\uff1a\u5b57\u4f53\u5927\u5c0f\u3001\u5b57\u4f53\u95f4\u8ddd\u7b49\u7b49\u9700\u6c42\u53d8\u66f4\u90fd\u4f1a\u5f71\u54cd\uff0c\u6bcf\u6b21\u53d8\u66f4\u4e4b\u540e\u5c31\u9700\u8981\u8fdb\u884c\u5927\u91cf\u56fe\u7247\u8d44\u6e90\u7684\u91cd\u65b0\u622a\u56fe\u66ff\u6362\uff0c\u662f\u4e2a\u6bd4\u8f83\u9ebb\u70e6\u7684\u4e8b\u60c5\uff1b \u7b2c\u4e09\u79cd\uff1a\u76f8\u5bf9\u4f4d\u79fb\u6cd5 \u9f20\u6807\u70b9\u51fb\u53f3\u952e\u7684\u65f6\u5019\uff0c\u9f20\u6807\u7684\u5f53\u524d\u5750\u6807\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u7684\uff0c\u83dc\u5355\u9009\u9879\u7684\u5bbd\uff08 w \uff09\u4e00\u822c\u662f\u56fa\u5b9a\u7684\uff0c\u53d8\u5316\u7684\u662f\u83dc\u5355\u7684\u957f\u5ea6\uff08 h \uff09\uff0c\u53ef\u4ee5\u901a\u8fc7\u67d0\u4e2a\u9009\u9879\u76f8\u5bf9\u4e8e\u9f20\u6807\u7684\u8ddd\u79bb\u5728\u786e\u5b9a\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u901a\u8fc7\u7ef4\u62a4\u83dc\u5355\u9009\u9879\uff08\u76f8\u5bf9\u4f4d\u7f6e\uff09\u76f8\u5bf9\u4e8e\u9f20\u6807\u4f4d\u7f6e\u7684\u8ddd\u79bb\uff0c\u5373\u53ef\u8f7b\u677e\u8ba1\u7b97\u51fa\u83dc\u5355\u9009\u9879\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\u3002 \u4ece\u7406\u8bba\u4e0a\u6b64\u65b9\u6848\u662f\u53ef\u884c\u7684\uff0c\u4f46\u662f\u8fd9\u91cc\u4ecd\u7136\u5b58\u5728\u4e24\u4e2a\u4e25\u91cd\u7684\u95ee\u9898\uff1a \u83dc\u5355\u987a\u5e8f\u6539\u53d8\uff0c\u5bfc\u81f4\u76f8\u5bf9\u8ddd\u79bb\u6539\u53d8\uff0c\u800c\u4e14\u8ddd\u79bb\u662f\u901a\u8fc7\u50cf\u7d20\uff08px\uff09\u6765\u8868\u793a\u7684\uff0c\u4e0d\u60f3\u6b65\u957f\u90a3\u4e48\u53ea\u7ba1\uff0c\u6bcf\u6b21\u9700\u8981\u53bb\u91cf\u4e00\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u70b9\u9ebb\u70e6\uff1b \u9f20\u6807\u5728\u684c\u9762\u4e0d\u540c\u4f4d\u7f6e\u70b9\u51fb\u53f3\u952e\uff0c\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u4f4d\u7f6e\u662f\u4e0d\u540c\u7684\uff0c\u4e0a\u56fe\u7684\u83dc\u5355\u662f\u5728\u9f20\u6807\u7684\u5de6\u4e0b\u65b9\uff0c\u5982\u679c\u4f60\u79fb\u52a8\u9f20\u6807\u5230\u5c4f\u5e55\u56db\u8fb9\uff0c\u4f60\u4f1a\u53d1\u73b0\uff0c\u53f3\u952e\u83dc\u5355\u53ef\u80fd\u51fa\u73b0\u5728\u9f20\u6807\u7684\u56db\u4e2a\u65b9\u5411\uff0c\u4e5f\u5c31\u662f\u8bf4\u4f60\u9700\u8981\u6839\u636e\u9f20\u6807\u7684\u4e0d\u540c\u4f4d\u7f6e\u6765\u5224\u65ad\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u65b9\u5411\uff0c\u800c\u4e0d\u540c\u7684\u65b9\u5411\u4e0a\u8ba1\u7b97\u65b9\u6cd5\u662f\u4e0d\u540c\u7684\uff0c\u6bd4\u5982\uff1a\u53f3\u952e\u83dc\u5355\u5728\u9f20\u6807\u7684\u5de6\u4e0a\uff0c\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\u8ba1\u7b97\u65b9\u6cd5\u4e3a\uff08x - w / 2\uff0c y - h\uff09\uff0c\u8fd9\u6837\u7ef4\u62a4\u8d77\u6765\u53ef\u4ee5\u8bf4\u975e\u5e38\u590d\u6742\uff1b \u57fa\u4e8e\u4ee5\u4e0a\u4e24\u4e2a\u539f\u56e0\uff0c\u6211\u4eec\u5e76\u4e0d\u63a8\u8350\u8fd9\u79cd\u64cd\u4f5c\u65b9\u6848\u3002 \u7b2c\u56db\u79cd\uff1a\u5c5e\u6027\u5b9a\u4f4d \u6709\u540c\u5b66\u8bf4\u5e72\u561b\u4e0d\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u5462\uff0c\u5176\u5b9e\uff0c\u6211\u4eec\u6700\u5f00\u59cb\u60f3\u5230\u7684\u65b9\u6848\u5c31\u662f\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\uff0c\u4f46\u662f\u5728\u5c5e\u6027\u7684 DOM \u6811\u91cc\u600e\u4e48\u4e5f\u627e\u4e0d\u5230\uff0c\u65e0\u6cd5\u5b9a\u4f4d\u5230\uff0c\u6211\u4eec\u4e5f\u8054\u5408\u7814\u53d1\u540c\u5b66\u4e00\u8d77\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u4f46\u6700\u7ec8\u8fd8\u662f\u6ca1\u80fd\u89e3\u51b3\uff0c\u975e\u5e38\u9057\u61be\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42","title":"4.2\u3001\u6700\u65b0\u7684\u53f3\u952e\u83dc\u5355\u7ec8\u6781\u89e3\u51b3\u65b9\u6848","text":"\u7531\u4e8e\u53f3\u952e\u83dc\u5355\u9009\u9879\u51e0\u4e4e\u90fd\u662f\u6587\u672c\uff0c\u90a3\u4e48\u901a\u8fc7 OCR \u8bc6\u522b\uff0c\u51e0\u4e4e\u662f\u6700\u4f18\u7684\u65b9\u6848\uff1a \u4e0d\u7528\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff1b \u4e0d\u4f1a\u53d7\u5230\u83dc\u5355\u9009\u9879\u987a\u5e8f\u6539\u53d8\u7684\u5f71\u54cd\uff1b \u4e0d\u4f1a\u53d7\u5230\u5b57\u4f53 UI \u53d8\u5316\u7684\u5f71\u54cd\uff1b \u5173\u4e8e OCR \u8bc6\u522b\u6211\u4eec\u5728\u540e\u9762\u4f1a\u8be6\u7ec6\u8bb2\u5230\uff0c\u672c\u7ae0\u8282\u4e3b\u8981\u8bb2\u57fa\u4e8e OCR \u8bc6\u522b\uff0c\u6211\u4eec\u5728\u53f3\u952e\u83dc\u5355\u8bc6\u522b\u4e0a\u7684\u7a81\u7834\u548c\u521b\u65b0\uff1b \u4f7f\u7528 OCR \u8bc6\u522b\u53f3\u952e\u83dc\u5355\u867d\u7136\u5df2\u7ecf\u5f88\u5b8c\u7f8e\u4e86\uff0c\u4f46\u662f\u5728\u4e00\u4e9b\u60c5\u51b5\u4e0b\u4ecd\u7136\u5b58\u5728\u4e00\u70b9\u95ee\u9898\uff0c\u5c31\u662f\u5c4f\u5e55\u4e2d\u51fa\u73b0\u591a\u4e2a\u548c\u83dc\u5355\u9009\u9879\u6587\u5b57\u76f8\u540c\u7684\u6587\u5b57\u65f6\uff0c\u6bd4\u5982\u4e0b\u9762\u8fd9\u79cd\u60c5\u51b5\uff1a \u5c4f\u5e55\u6070\u597d\u51fa\u73b0\u4e86\u4e24\u4e2a\u201c\u590d\u5236\u201d\uff0c\u6b64\u65f6\u8981\u5b9a\u4f4d\u5230\u83dc\u5355\u4e2d\u7684 \u201c\u590d\u5236\u201d\uff0c\u5c31\u9700\u8981\u8fdb\u4e00\u6b65\u505a\u6570\u636e\u5904\u7406\uff0c\u6bd4\u5982\uff1aOCR \u8fd4\u56de 2 \u4e2a\u201c\u590d\u5236\u201d\u7684\u5750\u6807\uff0c\u7528\u4f8b\u91cc\u9762\u6765\u5224\u65ad\u7528\u54ea\u4e2a\uff0c\u4ece\u4e1a\u52a1\u4e0a\u5c06\u5904\u7406\u8d77\u6765\u6bd4\u8f83\u9ebb\u70e6\uff0c\u56e0\u4e3a\u4f60\u5f97\u660e\u786e\u77e5\u9053\u83dc\u5355\u5728\u5de6\u8fb9\u8fd8\u662f\u53f3\u8fb9\uff0c\u7136\u540e\u8fd9\u672c\u8eab\u5c31\u662f\u4e0d\u786e\u5b9a\u7684\uff1b \u600e\u4e48\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u5462\uff0c\u8fd9\u5c31\u8981\u8bf4\u9053\u672c\u7ae0\u7684\u4e3b\u9898\uff1a\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b\u3002 \u3010\u539f\u7406\u3011 \u5728\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u524d\u622a\u4e00\u5f20\u56fe\uff0c\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\u518d\u622a\u53d6\u4e00\u5f20\u56fe\uff0c\u4e24\u5f20\u56fe\u552f\u4e00\u53d8\u5316\u7684\u5c31\u662f\u53f3\u952e\u83dc\u5355\uff0c\u5c06\u5176\u4ed6\u76f8\u540c\u7684\u5730\u65b9\u90fd\u5c4f\u853d\u6389\uff0c\u53ea\u7559\u4e0b\u83dc\u5355\u754c\u9762\uff0c\u5982\u6b64\u5373\u53ef\u6d88\u9664\u5e72\u6270\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u5c06\u4e24\u79cd\u56fe\u505a\u524d\u540e\u5bf9\u6bd4\u63d0\u53d6\u53ef\u4ee5\u5f97\u5230\u8fd9\u6837\u7684\u56fe\uff1a \u4f60\u770b\uff0c\u901a\u8fc7\u524d\u540e\u56fe\u7247\u7684\u5bf9\u6bd4\uff0c\u5c06\u76f8\u540c\u7684\u90e8\u5206\u7ed9\u6d88\u9664\u6389\uff0c\u518d\u8fdb\u884c OCR \u8bc6\u522b\uff0c\u8fd9\u6837\u5c31\u4e0d\u4f1a\u6709\u5e72\u6270\u4e86\uff1b \u4ee3\u7801\u5b9e\u73b0\u8bf7\u67e5\u770b src/filter_image.py \uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def filter_image(action):\n\"\"\"\n \u5bf9\u6bd4\u52a8\u4f5c\u524d\u540e\u4e24\u5f20\u56fe\u7247\uff0c\u63d0\u53d6\u4e0d\u540c\u7684\u90e8\u5206\u751f\u6210\u4e00\u5f20\u65b0\u7684\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u65b0\u56fe\u7247\u7684\u8def\u5f84\n :param action: \u52a8\u4f5c\u51fd\u6570\u7684\u51fd\u6570\u5bf9\u8c61\n :return: \u65b0\u56fe\u7247\u7684\u8def\u5f84\n \"\"\"\n action \u662f\u9f20\u6807\u4e8b\u4ef6\uff0c\u56e0\u4e3a\u6b64\u7c7b\u573a\u666f\u4e0d\u4ec5\u4ec5\u5728\u53f3\u952e\u5b58\u5728\uff0c\u5355\u51fb\u3001\u53cc\u51fb\u7b49\u7b49\uff0c\u53ea\u8981\u64cd\u4f5c\u524d\u540e\u540e\u53d8\u5316\u7684\u90fd\u53ef\u4ee5\uff1a from src.mouse_key import MouseKey\naction = (\nMouseKey.click,\nMouseKey.right_click,\nMouseKey.double_click,\nMouseKey.move_to,\n)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5","title":"5\u3001\u52a8\u6001\u56fe\u50cf\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5728\u684c\u9762\u58c1\u7eb8\u5207\u6362\uff0c\u6216\u770b\u56fe\u3001\u76f8\u518c\u5207\u6362\u56fe\u7247\u7c7b\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u7531\u4e8e\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u662f\u4e0d\u56fa\u5b9a\u7684\uff08\u4e0d\u540c\u7248\u672c\u7684\u7cfb\u7edf\u58c1\u7eb8\u4e0d\u540c\u3001\u58c1\u7eb8\u987a\u5e8f\u4e0d\u540c\uff0c\u770b\u56fe\u76f8\u518c\u5728\u56fe\u7247\u8d44\u6e90\u4e0d\u4e00\u5b9a\u56fa\u5b9a\uff09\uff0c\u90a3\u4e48\u5728\u6d4b\u8bd5\u5207\u6362\u58c1\u7eb8\u6216\u8005\u5207\u6362\u56fe\u7247\u7684\u573a\u666f\u65f6\u5c31\u4f1a\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u4f60\u4e0d\u77e5\u9053\u9884\u671f\u662f\u5565\uff0c\u7528\u4f8b\u64cd\u4f5c\u52a8\u6001\u7684\uff0c\u4e5f\u662f\u6781\u4e0d\u7a33\u5b9a\u3002 \u3010\u539f\u7406\u3011 \u5728\u5207\u6362\u56fe\u7247\u4e4b\u524d\u622a\u56fe\u4fdd\u5b58\u5e76\u8fd4\u56de\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u6b21\u8bc6\u522b\u8fd9\u5f20\u56fe\u7247\uff0c\u5982\u679c\u4e0d\u5b58\u5728\uff0c\u8bf4\u660e\u56fe\u7247\u5df2\u7ecf\u5207\u6362\u4e86\uff1b \u793a\u610f\u56fe\uff1a \u8fd9\u6837\uff0c\u6211\u4eec\u622a\u53d6\u4e86\u5f53\u524d\u56fe\u7247\u4e2d\u6bd4\u8f83\u6709\u4ee3\u8868\u6027\u7684\u4f4d\u7f6e\uff08\u4e00\u53ea\u9e1f\uff09\uff0c\u5728\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u7528\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1a \u6211\u4eec\u518d\u62ff\u7740\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd9\u6837\u5728\u5f53\u524d\u56fe\u7247\u4e2d\uff0c\u5c31\u4e0d\u80fd\u627e\u5230\u8fd9\u53ea\u9e1f\u4e86\uff0c\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u662f False\uff0c\u90a3\u4e48\u4e5f\u5c31\u53ef\u4ee5\u5224\u65ad\u56fe\u7247\u5207\u6362\u662f\u6210\u529f\u7684\u3002 \u4ee3\u7801\u793a\u610f\uff1a def save_temporary_picture(_x: int, _y: int, width: int, height: int):\n\"\"\"\n \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u56fe\u7247\u8def\u5f84\n :param x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n :param y: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n :param width: \u5bbd\u5ea6\n :param height: \u9ad8\u5ea6\n :return: \u56fe\u7247\u8def\u5f84\n \"\"\"\n \u6b64\u51fd\u6570\u7528\u4e8e\u5728\u64cd\u4f5c\u4e4b\u524d\u622a\u56fe\u4e00\u5f20\u4e34\u65f6\u56fe\u7247\uff0c\u8fd4\u56de\u56fe\u7247\u8def\u5f84\uff0c\u6700\u540e\u5728\u65ad\u8a00\u7684\u65f6\u5019\u518d\u5c06\u56fe\u7247\u8def\u5f84\u4f5c\u4e3a\u53c2\u6570\u4f20\u5165\u65ad\u8a00\u8bed\u53e5\u5373\u53ef\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ui","title":"\u4e09\u3001\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_1","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u662f\u6211\u4eec\u81ea\u7814\u7684\u4e00\u79cd\u4f7f\u7528\u7b80\u5355\uff0c\u4e14\u6548\u7387\u6781\u9ad8\u3001\u7a33\u5b9a\u6027\u597d\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u57fa\u4e8e\u5143\u7d20\u6309\u94ae\u5728\u5e94\u7528\u4e2d\u7684\u76f8\u5bf9\u4f4d\u7f6e\uff0c\u52a8\u6001\u83b7\u53d6\u5143\u7d20\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff0c\u9002\u7528\u4e8e\u5404\u79cd\u5c4f\u5e55\u5206\u8fa8\u7387\uff08\u5305\u62ec\u9ad8\u5206\u5c4f\u3001\u5bbd\u5c4f\u3001\u5e26\u9c7c\u5c4f\uff09\uff0c\u5f53\u5143\u7d20\u6309\u94ae\u4f4d\u7f6e\u76f8\u5bf9\u4e8e\u5e94\u7528\u754c\u9762\u4f4d\u7f6e\u53d1\u751f\u4fee\u6539\u4e4b\u540e\uff0c\u53ea\u9700\u8981\u6839\u636e UI \u8bbe\u8ba1\u56fe\u4e0a\u7684\u6e90\u6570\u636e\u4fee\u6539\u5bf9\u5e94\u5750\u6807\u6570\u636e\u5c31\u597d\uff0c\u7ef4\u62a4\u975e\u5e38\u7684\u65b9\u4fbf\u3002 \u6b64\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u9002\u7528\u4e8e\u4e00\u4e9b\u5143\u7d20\u4f4d\u7f6e\u76f8\u5bf9\u4e0e\u5e94\u7528\u754c\u9762\u6bd4\u8f83\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u97f3\u4e50\uff0899% \u7684\u5143\u7d20\u5b9a\u4f4d\u91c7\u7528\u8fd9\u79cd\uff0c\u6548\u679c\u975e\u5e38\u597d\uff09\uff0c\u4e0d\u9002\u7528\u4e8e\u754c\u9762\u4e0d\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u622a\u56fe\u5f55\u5c4f\uff0c\u5f88\u660e\u663e\u4e0d\u9002\u7528\u4e8e\u8fd9\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u3002\u8fd9\u79cd\u5168\u65b0\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u6709\u5b83\u7684\u9002\u7528\u6761\u4ef6\uff0c\u5982\u679c\u4f60\u53d1\u73b0\u4f7f\u7528\u5e38\u89c4\u7684\uff08\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u5b9a\u4f4d\uff09\u4e0d\u597d\u505a\u65f6\uff0c\u4e0d\u59a8\u8003\u8651\u4f7f\u7528\u8fd9\u79cd\uff0c\u5176\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff0c\u5e76\u4e14\u8fc5\u901f\u7231\u4e0a\u4ed6\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_1","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5728 UI \u8bbe\u8ba1\u56fe\u4e2d\u6211\u4eec\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u8fb9\u6846\u7684\u8ddd\u79bb\u7684\uff0c\u7136\u540e\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u6280\u672f\u624b\u6bb5\u83b7\u53d6\u5230\u5e94\u7528\u754c\u9762\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u53ca\u5e94\u7528\u7a97\u53e3\u7684\u5927\u5c0f\uff0c\u793a\u610f\u56fe\u5982\u4e0b\uff1a \uff08x1, y1\uff09\u4e3a\u5e94\u7528\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\uff1b\uff08x2, y2\uff09\u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u5de6\u4e0a\u89d2\uff08x1, y1\uff09\u7684\u5750\u6807\uff0c\u90a3\u4e48\u5b9e\u9645\u4e0a\u3010\u64ad\u653e\u6240\u6709\u3011\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\u4e3a\uff1a\uff08 x1 + x2, y1 + y2 \uff09\uff1b \u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5927\u5c0f\uff08w2, h2\uff09\uff0c\u53ef\u4ee5\u4ece UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\uff1b \u5728 UI \u8bbe\u8ba1\u7a3f\u4e0a\u70b9\u51fb\u3010\u64ad\u653e\u6240\u6709\u3011\u56fe\u6807\uff0c\u7136\u540e\u79fb\u52a8\u9f20\u6807\u5c31\u5c31\u53ef\u4ee5\u770b\u5230\u4e0a\u56fe\u7684\u53c2\u8003\u7ebf\u53ca\u6570\u636e\uff1b \u6240\u4ee5\uff0c\u6211\u4eec\u53ef\u4ee5\u8f7b\u677e\u7684\u83b7\u53d6\u5230\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u4e2d\u5fc3\u5750\u6807\u4e3a\uff1a\uff08 x1 + x2 + (w2 / 2), y1 + y2 + ( h2 / 2) \uff09 \u8be6\u7ec6\u6e90\u4ee3\u7801\u8bf7\u67e5\u770b AT \u57fa\u7840\u6846\u67b6: src/button_center.py \u83b7\u53d6\u5e94\u7528\u7a97\u53e3\u7684\u4fe1\u606f \u4f7f\u7528 xdotool \u548c xwininfo \u83b7\u53d6\u5230\u5e94\u7528\u7a97\u53e3\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u5de6\u4e0a\u89d2\uff09\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a app_id = CmdCtl.run_cmd(f\"xdotool search --classname --onlyvisible {self.app_name}\"\n).split(\"\\n\")\napp_id_list = [int(_id) for _id in app_id if _id]\nreturn CmdCtl.run_cmd(f\"xwininfo -id {app_id_list[self.number]}\")\n \u4f7f\u7528\u6b63\u5219\u83b7\u53d6\u7a97\u53e3\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u83b7\u53d6\u914d\u7f6e \u8bfb ini \u914d\u7f6e\u6587\u4ef6\uff0c\u83b7\u53d6\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e0e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a conf = ConfigParser()\nconf.read(self.config_path)\ndirection = conf.get(btn_name, \"direction\")\nposition = [int(i.strip()) for i in conf.get(btn_name, \"location\").split(\",\")]\n \u8ba1\u7b97\u5143\u7d20\u6309\u94ae\u5750\u6807 \u6839\u636e\u5e94\u7528\u7a97\u53e3\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u5927\u5c0f\u3001\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u5927\u5c0f\uff0c\u4f7f\u7528\u4e00\u5b9a\u7684\u7b97\u6cd5\u5373\u53ef\u8ba1\u7b97\u51fa\u5143\u7d20\u6309\u94ae\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u4e2d\u5fc3\u5750\u6807\uff09\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3","title":"3\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u3010\u914d\u7f6e\u65b9\u6cd5\u3011 \u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u7684\u6570\u636e\u6e90\u662f\u5e94\u7528\u5e93\u4e2d\u7684 ui.ini \u914d\u7f6e\u6587\u4ef6\uff1a ;section\n[\u65b0\u5efa\u6b4c\u5355+] ;key = value\ndirection = left_top\nlocation = 180, 268, 21, 21\n section \u662f\u4f60\u6839\u636e\u5bf9\u5e94\u7684\u5143\u7d20\u6309\u94ae\u547d\u540d\uff0c\u4f60\u53ef\u4ee5\u4efb\u610f\u547d\u540d\uff0c\u4f46\u6700\u597d\u6709\u5177\u4f53\u542b\u4e49\uff0c\u4e14\u80fd\u660e\u786e\u8868\u793a\u8fd9\u4e2a\u5143\u7d20\u6309\u94ae\u7684\u540d\u79f0\uff1b\u7528\u4e2d\u62ec\u53f7\u62ec\u8d77\u6765\u5c31\u884c\uff0c\u6bd4\u5982\uff1a[\u65b0\u5efa\u6b4c\u5355+] \uff1b direction \u662f\u914d\u7f6e\u8be5\u5143\u7d20\u7684\u53c2\u8003\u7cfb\uff0c\u5206\u522b\u4e3a\uff1a left_top \u5de6\u4e0a\uff1b left_bottom \u5de6\u4e0b\uff1b right_top \u53f3\u4e0a\uff1b right_bottom \u53f3\u4e0b\uff1b \u53c2\u8003\u7cfb\u7684\u9009\u53d6\u6807\u51c6\uff1a\u62c9\u52a8\u6539\u53d8\u7a97\u53e3\u5927\u5c0f\u65f6\uff0c\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u53c2\u8003\u7cfb\u4f4d\u7f6e\u662f\u4e0d\u53d8\u7684\uff1b location \u662f\u8be5\u5143\u7d20\u6309\u94ae\u7684\u76f8\u5bf9\u4e0e\u53c2\u8003\u7cfb\u7684 x, y \u7684\u8ddd\u79bb\uff0c\u53ca\u5927\u5c0f(w, h)\uff0c\u8fd9\u56db\u4e2a\u6570\u636e\u53ef\u4ee5\u901a\u8fc7 UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\u6570\u636e\uff0c\u5728\u7f16\u8f91\u6a21\u5f0f\u4e0b\uff0c\u70b9\u51fb UI \u56fe\u4e0a\u7684\u6309\u94ae\uff0c\u53f3\u4fa7\u5c31\u4f1a\u51fa\u73b0\u8be5\u5143\u7d20\u6309\u94ae\u7684 x, y, w, h \u6570\u636e\u3002 \u5982\u679c UI \u56fe\u4e0a\u6ca1\u6709\u63d0\u4f9b\u4f60\u60f3\u8981\u7684\u5143\u7d20\u6570\u636e\uff0c\u4f60\u53ef\u4ee5\u76f4\u63a5\u5728\u7cfb\u7edf\u4e2d\u4f7f\u7528\u622a\u56fe\u5f55\u5c4f\u8fdb\u884c\u5c3a\u91cf\uff0c\u8fd9\u662f\u4e00\u79cd\u4e0d\u63a8\u8350\u4f46\u80fd\u7528\u7684\u65b9\u6cd5\u3002 \u3010\u8c03\u7528\u65b9\u6cd5\u3011 \u5728\u5e94\u7528\u5e93\u65b9\u6cd5\u5c42\u8fd9\u6837\u5199\uff1a def click_add_music_list_btn_in_music_by_ui(self):\n\"\"\"\u70b9\u51fb\u65b0\u5efa\u6b4c\u5355\u6309\u94ae\"\"\"\nself.click(*self.ui.btn_center(\"\u65b0\u5efa\u6b4c\u5355+\"))\n self.ui.btn_center() \u662f\u56fa\u5b9a\u5199\u6cd5\uff0c\u53c2\u6570\u5c31\u662f\u914d\u7f6e\u91cc\u9762\u7684 section \u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ocr","title":"\u56db\u3001OCR \u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_2","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 OCR \u65b9\u6848\u5927\u591a\u91c7\u7528\u8c37\u6b4c OCR\uff08Tesseract\uff09\u65b9\u6848\uff0c\u4f46\u662f\u5b83\u5bf9\u4e8e\u4e2d\u6587\u7684\u8bc6\u522b\u975e\u5e38\u5dee\uff0c\u7ecf\u8fc7\u5927\u91cf\u7684\u8c03\u7814\uff0c\u6211\u4eec\u4f7f\u7528 PaddleOCR\uff0c\u5b83\u662f\u4e00\u4e2a\u5f00\u6e90\u7684\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u8bc6\u522b\u5de5\u5177\uff0c\u4e5f\u662f PaddlePaddle \u6700\u6709\u540d\u7684\u4e00\u4e2a\u5f00\u6e90\u9879\u76ee\uff0c\u611f\u5174\u8da3\u7684\u53ef\u4ee5\u70b9\u8fd9\u91cc\u4e86\u89e3\uff0c\u591a\u7684\u4e0d\u8bf4\u4e86\uff0c\u4f60\u53ea\u9700\u8981\u77e5\u9053\u5b83\u5c31\u662f\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_2","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5b89\u88c5\u4ed6\u662f\u4e2a\u5f88\u9ebb\u70e6\u7684\u4e8b\u60c5\uff0c\u867d\u7136\u64cd\u4f5c\u5f88\u7b80\u5355\uff0c\u4f46\u5176\u5b9e\u5b89\u88c5\u5305\u6709\u70b9\u5927\uff0c\u56e0\u6b64\u6211\u4eec\u4e0d\u5e0c\u671b\u76f4\u63a5\u5728 env.sh \u4e2d\u52a0\u5165\u5b83\uff0c\u8fd9\u4f1a\u8ba9\u6574\u4e2a\u81ea\u52a8\u5316\u73af\u5883\u53d8\u5f97\u975e\u5e38\u81c3\u80bf\uff1b \u56e0\u6b64\uff0c\u6211\u4eec\u60f3\u5230\u5c06\u5b83\u505a\u6210\u4e00\u4e2a RPC \u670d\u52a1\u5728\u5176\u4ed6\u673a\u5668\u4e0a\u90e8\u7f72\uff0c\u6d4b\u8bd5\u673a\u901a\u8fc7\u8fdc\u7a0b\u8c03\u7528 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u4f7f\u7528\u5b83\uff1b RPC \u7684\u8c03\u7528\u903b\u8f91\uff1a \u8fd9\u6837\u6211\u4eec\u53ea\u9700\u8981\u5728\u670d\u52a1\u7aef\u90e8\u7f72\u597d OCR \u8bc6\u522b\u7684\u670d\u52a1\uff0c\u7136\u540e\u901a\u8fc7 RPC \u670d\u52a1\u5c06\u529f\u80fd\u63d0\u4f9b\u51fa\u6765\uff0c\u6846\u67b6\u91cc\u9762\u53ea\u9700\u8981\u8c03\u7528\u5bf9\u5e94\u7684 RPC \u63a5\u53e3\u5c31\u884c\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_1","title":"3\u3001\u4f7f\u7528\u8bf4\u660e","text":"\u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nfrom paddleocr import PaddleOCR\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef paddle_ocr(pic_path, lang):\n\"\"\"\n Paddleocr\u76ee\u524d\u652f\u6301\u7684\u591a\u8bed\u8a00\u8bed\u79cd\u53ef\u4ee5\u901a\u8fc7\u4fee\u6539lang\u53c2\u6570\u8fdb\u884c\u5207\u6362\n \u4f8b\u5982`ch`, `en`, `fr`, `german`, `korean`, `japan`\n :param file_name:\n :param lang:\n :return:\n \"\"\"\nif __name__ == \"__main__\":\nIP = popen(\"hostname -I\").read().split(\" \")[0]\nPORT = 8890\nSCREEN_CACHE = \"/tmp/screen.png\"\nserver = ThreadXMLRPCServer((IP, PORT), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(paddle_ocr, \"paddle_ocr\")\nprint(\"\u76d1\u542c\u5ba2\u6237\u7aef\u8bf7\u6c42\u3002\u3002\")\nserver.serve_forever()\n \u6846\u67b6\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from src import OCR\nOCR.ocr(*target_strings, picture_abspath=None, similarity=0.6, return_default=False, return_first=False, lang=\"ch\"):\n# \u901a\u8fc7 OCR \u8fdb\u884c\u8bc6\u522b\u3002\n# target_strings:\n# \u76ee\u6807\u5b57\u7b26,\u8bc6\u522b\u4e00\u4e2a\u5b57\u7b26\u4e32\u6216\u591a\u4e2a\u5b57\u7b26\u4e32,\u5e76\u8fd4\u56de\u5176\u5728\u56fe\u7247\u4e2d\u7684\u5750\u6807;\n# \u5982\u679c\u4e0d\u4f20\u53c2\uff0c\u8fd4\u56de\u56fe\u7247\u4e2d\u8bc6\u522b\u5230\u7684\u6240\u6709\u5b57\u7b26\u4e32\u3002\n# picture_abspath: \u8981\u8bc6\u522b\u7684\u56fe\u7247\u8def\u5f84\uff0c\u5982\u679c\u4e0d\u4f20\u9ed8\u8ba4\u622a\u53d6\u5168\u5c4f\u8bc6\u522b\u3002\n# similarity: \u5339\u914d\u5ea6\u3002\n# return_default: \u8fd4\u56de\u8bc6\u522b\u7684\u539f\u751f\u6570\u636e\u3002\n# return_first: \u53ea\u8fd4\u56de\u7b2c\u4e00\u4e2a,\u9ed8\u8ba4\u4e3a False,\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u6240\u6709\u6570\u636e\u3002\n# lang: `ch`, `en`, `fr`, `german`, `korean`, `japan`\n \u6b64\u65b9\u6848\u5728\u6846\u67b6\u5185\u6ca1\u6709\u5f15\u5165\u4efb\u4f55\u4e09\u65b9\u4f9d\u8d56\u5b8c\u5168\u91c7\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\uff0c\u800c\u4e14\u4f7f\u7528\u65b9\u6cd5\u975e\u5e38\u7b80\u5355\uff0c\u53ea\u9700\u8981\u901a\u8fc7 OCR.ocr() \u5373\u53ef\uff1b \u5bf9\u4e8e\u4e00\u4e9b\u6587\u6848\u7684\u573a\u666f\u975e\u5e38\u9002\u7528\uff0c\u6b64\u65b9\u6cd5\u76f4\u63a5\u8fd4\u56de\u5750\u6807\uff0c\u53ef\u4ee5\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u3002 \u4e5f\u53ef\u4ee5\u7528\u4e8e\u6587\u5b57\u65ad\u8a00\uff0c\u4ee3\u7801\u793a\u610f\uff1a def assert_ocr_exist(\n*args, picture_abspath=None, similarity=0.6, return_first=False, lang=\"ch\"\n):\n\"\"\"\u65ad\u8a00\u6587\u6848\u5b58\u5728\"\"\"\npic = None\nif picture_abspath is not None:\npic = picture_abspath + \".png\"\nres = OCR.ocr(\n*args,\npicture_abspath=pic,\nsimilarity=similarity,\nreturn_first=return_first,\nlang=lang,\n)\nif res is False:\nraise AssertionError(\n(f\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{args}\", f\"{pic if pic else GlobalConfig.SCREEN_CACHE}\")\n)\nif isinstance(res, tuple):\npass\nelif isinstance(res, dict) and False in res.values():\nres = filter(lambda x: x[1] is False, res.items())\nraise AssertionError(\n(\nf\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{dict(res)}\",\nf\"{pic if pic else GlobalConfig.SCREEN_CACHE}\",\n)\n)\n \u5728\u7528\u4f8b\u4e2d\u4f7f\u7528\u65ad\u8a00\uff0c\u793a\u4f8b\uff1a def test_font_manager_021(self):\n\"\"\"\u53f3\u4fa7\u2665-\u6536\u85cf/\u53d6\u6d88\u6536\u85cf\u5b57\u4f53\"\"\"\n# \u5b57\u4f53\u7ba1\u7406\u5668\u754c\u9762\u53f3\u4fa7\u8be6\u60c5\u5217\u8868\uff0c\u9009\u62e9\u672a\u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e / \u6536\u85cf\u5b57\u4f53\n# \u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e\u83dc\u5355\u663e\u793a\u201c\u53d6\u6d88\u6536\u85cf\u201d\uff1b\n...\nself.assert_ocr_exist(\"\u53d6\u6d88\u6536\u85cf\")\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_1","title":"4\u3001\u670d\u52a1\u7aef\u90e8\u7f72","text":"\u6211\u4eec\u76ee\u524d\u662f\u5c06 OCR \u670d\u52a1\u90e8\u7f72\u5728\u666e\u901a\u7684\u529e\u516c\u673a\u4e0a\u7684\uff0c\u5982\u679c\u4f60\u89c9\u5f97\u73b0\u6709\u7684 OCR \u8bc6\u522b\u6027\u80fd\u4e0d\u591f\u597d\uff0c\u6070\u597d\u4f60\u6709\u66f4\u597d\u7684\u673a\u5668\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u5176\u79c1\u6709\u5316\u90e8\u7f72\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41_1","title":"4.1\u3001\u73af\u5883\u5b89\u88c5","text":"\u63a8\u8350\u4f7f\u7528 pipenv \u8fdb\u884c\u73af\u5883\u642d\u5efa\uff1b \u5b89\u88c5 pipenv \uff1a sudo pip3 install pipenv\n \u65b0\u5efa\u4e00\u4e2a\u76ee\u5f55\u4f5c\u4e3a\u73af\u5883\u5305 ocr_env\uff1a cd ~\nmkdir ocr_env\n \u521b\u5efa python 3.7 \u73af\u5883\uff1a cd ocr_env\npipenv --python 3.7\n \u5b89\u88c5 OCR \u4f9d\u8d56\u5305\uff1a pipenv install paddlepaddle -i https://mirror.baidu.com/pypi/simple\npipenv install \"paddleocr>=2.0.1\" -i https://mirror.baidu.com/pypi/simple\n \u4e0d\u51fa\u610f\u5916\uff0c\u8fd9\u6837\u5c31\u628a\u4f9d\u8d56\u5b89\u88c5\u597d\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42_1","title":"4.2\u3001\u542f\u52a8\u670d\u52a1","text":"\u5c06\u57fa\u7840\u6846\u67b6\u4e2d\u7684 scr/ocr/pdocr_rpc_server.py \u6587\u4ef6\u62f7\u8d1d\u5230 ocr_env \u76ee\u5f55\uff0c\u540e\u53f0\u6267\u884c\u5b83\u5c31\u597d\u4e86\uff1a cd ocr_env\nnohup pipenv run python pdocr_rpc_server.py &\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#43","title":"4.3\u3001\u914d\u7f6e\u5f00\u673a\u81ea\u542f\uff08\u901a\u7528\uff09","text":"\u4f60\u80af\u5b9a\u4e0d\u60f3\u6bcf\u6b21\u673a\u5668\u91cd\u542f\u4e4b\u540e\u90fd\u9700\u8981\u624b\u52a8\u542f\u52a8\u670d\u52a1\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u914d\u7f6e\u5f00\u673a\u81ea\u542f\u3002 \u5199\u5f00\u673a\u81ea\u542f\u670d\u52a1\u6587\u4ef6\uff1a sudo vim /lib/systemd/system/ocr.service\n autoocr \u540d\u79f0\u4f60\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff0c\u5199\u5165\u4ee5\u4e0b\u5185\u5bb9\uff1a [Unit]\nDescription=OCR Service\nAfter=multi-user.target\n\n[Service]\nUser=uos\nGroup=uos\nType=idle\nWorkingDirectory=/home/uos/ocr_env\nExecStart=pipenv run python pdocr_rpc_server.py\n\n[Install]\nWantedBy=multi-user.target\n \u6ce8\u610f\u66ff\u6362\u4f60\u7684${USER} \u4fee\u6539\u914d\u7f6e\u6587\u4ef6\u7684\u6743\u9650\uff1a sudo chmod 644 /lib/systemd/system/ocr.service\n \u81ea\u542f\u670d\u52a1\u751f\u6548\uff1a sudo systemctl daemon-reload\nsudo systemctl enable ocr.service\n \u67e5\u770b\u670d\u52a1\u72b6\u6001\uff1a sudo systemctl status ocr.service\n \u4f60\u53ef\u4ee5\u518d\u91cd\u542f\u4e0b\u7535\u8111\uff0c\u770b\u770b\u670d\u52a1\u662f\u4e0d\u662f\u6b63\u5e38\u542f\u52a8\u4e86\uff0c\u6ca1\u62a5\u9519\u5c31 OK \u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_4","title":"\u4e94\u3001\u5c5e\u6027\u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_3","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 UI \u81ea\u52a8\u5316\u5927\u591a\u90fd\u662f\u57fa\u4e8e\u6d4f\u89c8\u5668\u7684\uff0c\u6838\u5fc3\u662f\u5728\u7f51\u9875\u7684 DOM \u6811\u4e0a\u67e5\u627e\u5143\u7d20\uff0c\u5e76\u5bf9\u5176\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\uff1b Linux \u684c\u9762\u5e94\u7528\u5927\u591a\u662f\u91c7\u7528 Qt \u7f16\u5199\u7684\uff0c\u5728 Qt \u4e2d\u4e5f\u662f\u4ece\u6700\u9876\u5c42\u7684 MainWindow \u5f00\u59cb\u6784\u5efa\u5e94\u7528\uff0c\u6240\u4ee5\u903b\u8f91\u4e5f\u662f\u4e00\u6837\u7684\uff0cQt \u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u540c\u6837\u53ef\u4ee5\u901a\u8fc7 DOM \u6811\uff08\u5c5e\u6027\u6811\uff09\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff0c\u6211\u4eec\u79f0\u4e4b\u4e3a\u5c5e\u6027\u5b9a\u4f4d\u3002 \u501f\u52a9\u5f00\u6e90\u5de5\u5177 dogtail \u6211\u4eec\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u83b7\u53d6\uff0c\u4ece\u800c\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\u3002dogtail \u7684\u9879\u76ee\u4ecb\u7ecd\u53ef\u4ee5\u731b\u6233\u8fd9\u91cc\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_3","title":"2\u3001\u4f7f\u7528\u65b9\u6cd5","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#21sniff","title":"2.1\u3001sniff\uff08\u55c5\u63a2\u5668\uff09\u4f7f\u7528","text":"\u5728\u7ec8\u7aef\u8f93\u5165 sniff \u542f\u52a8 AT-SPI Browser mikigo@mikigo-PC:~$ sniff\n \u67e5\u770b\u5e94\u7528\u7684\u6807\u7b7e \u5728 sniff \u91cc\u9762\u53ef\u4ee5\u770b\u5230\u7cfb\u7edf\u4e2d\u5df2\u542f\u52a8\u7684\u5e94\u7528\uff0c\u70b9\u51fb\u5e94\u7528\u540d\u79f0\u524d\u9762\u7684\u4e09\u89d2\u5f62\u56fe\u6807\uff0c\u53ef\u4ee5\u5c55\u5f00\u5e94\u7528\u7684\u6807\u7b7e\uff0c\u6240\u6709\u6807\u7b7e\u4ee5 tree \u7684\u5f62\u5f0f\u5c55\u793a\uff0c\u5bf9\u5e94\u5e94\u7528\u91cc\u9762\u7684\u7236\u7a97\u53e3\u548c\u5b50\u7a97\u53e3\u3002 \u83b7\u53d6\u5143\u7d20\u63a7\u4ef6\u7684\u6807\u7b7e\u540d\u79f0 \u9996\u5148\uff0c\u4e3a\u4e86\u65b9\u4fbf\u67e5\u770b\u5143\u7d20\u63a7\u4ef6\u5bf9\u5e94\u7684\u4f4d\u7f6e\uff0c\u5efa\u8bae\u73b0\u5728\u4e0a\u65b9\u5de5\u5177\u680f\u70b9\u51fb Actions\uff0c\u7136\u540e\u52fe\u9009 Hightlight Items\uff0c\u8fd9\u6837\u5728 sniff \u4e2d\u9f20\u6807\u9009\u4e2d\u5143\u7d20\u6807\u7b7e\u7684\u65f6\u5019\uff0c\u5e94\u7528\u4e2d\u4f1a\u6709\u76f8\u5e94\u7684\u5149\u6807\u9501\u5b9a\u3002 \u5728 sniff \u91cc\u9762\u70b9\u51fb\u8fdb\u5165\u5e94\u7528\u7684\u6807\u7b7e tree \u4e2d\u540e\uff0c\u70b9\u51fb\u76f8\u5e94\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5728\u5de5\u5177\u4e0b\u65b9\uff0c\u4f1a\u5c55\u793a\u5143\u7d20\u63a7\u4ef6\u7684 Name\uff0c\u8fd9\u4e2a\u5c31\u662f\u6807\u7b7e\u540d\u79f0\u3002 \u5728 tree \u4e2d\u6709\u4e9b\u5730\u65b9\u662f\u7a7a\u767d\u7684\u6216\u8005\u662f Form\uff0c\u662f\u56e0\u4e3a\u5f00\u53d1\u4eba\u5458\u5728\u6dfb\u52a0\u6807\u7b7e\u7684\u65f6\u5019\u6ca1\u6709\u6dfb\u52a0\uff0c\u6216\u8005\u6709\u4e9b\u7236\u7a97\u53e3\u4e0d\u9700\u8981\u6dfb\u52a0\uff0c\u8fd9\u79cd\u5728\u5b9e\u9645\u4e1a\u52a1\u4e2d\u662f\u4e0d\u5f71\u54cd\u7684\uff0c\u6211\u4eec\u53ea\u8981\u4fdd\u8bc1\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\u4e2d\uff0c\u8981\u7528\u5230\u7684\u5143\u7d20\u90fd\u6dfb\u52a0\u4e86\u6807\u7b7e\u5373\u53ef\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#22","title":"2.2\u3001\u5143\u7d20\u64cd\u4f5c","text":"\u83b7\u53d6\u5e94\u7528\u5bf9\u8c61 dogtail \u83b7\u53d6\u5e94\u7528\u5bf9\u8c61\u7684\u65f6\u5019\uff0c\u4f7f\u7528\u7684\u662f tree \u5e93\u91cc\u9762\u7684 application() \u65b9\u6cd5\uff1a from dogtail.tree import root\napp_obj = root.application('deepin-music')\n app_obj\u5c31\u662f\u5e94\u7528\u7684\u5bf9\u8c61\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\uff0c\u662f\u5e94\u7528\u5bf9\u8c61\u4f7f\u7528child()\u65b9\u6cd5\uff1a element = app_obj.child('element_name')\n \u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u4f20\u5165\u5143\u7d20\u7684 Name\uff0c\u83b7\u53d6\u5230\u76f8\u5e94\u5143\u7d20\u7684\u5bf9\u8c61\u3002Name \u53ef\u4ee5\u901a\u8fc7 sniff \u67e5\u770b\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\u5217\u8868: element_list = element.children\n \u83b7\u53d6\u5230\u8fd9\u4e2a\u5143\u7d20\u4e0b\u9762\u6240\u6709\u7684\u5143\u7d20\u5217\u8868\u3002 \u8fd9\u4e2a\u65b9\u6cd5\u9002\u7528\u4e8e\u6709\u4e9b\u6807\u7b7e\u6ca1\u6709\u6dfb\u52a0\uff0c\u4f46\u662f\u4f4d\u7f6e\u662f\u56fa\u5b9a\u7684\uff0c\u6211\u4eec\u901a\u8fc7\u7d22\u5f15\u53ef\u4ee5\u53d6\u5f97\u5143\u7d20\u3002 element_list[0]\n \u5bf9\u5143\u7d20\u7684\u64cd\u4f5c \u5728\u83b7\u53d6\u5230\u5143\u7d20\u4e4b\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u76f8\u5e94\u7684\u64cd\u4f5c\u3002 \u5355\u51fb element.click(button=1)\n button 1 \u2014>\u5de6\u952e\uff0c2 \u2014>\u6eda\u8f6e\uff0c3 \u2014>\u53f3\u952e\uff0c\u9ed8\u8ba4\u4e3a 1 \u53cc\u51fb element.doubleClick(button=1)\n \u9f20\u6807\u60ac\u505c element.point()\n \u9f20\u6807\u79fb\u52a8\u5230\u5143\u7d20\u4e2d\u5fc3\u4f4d\u7f6e \u6587\u672c\u8f93\u5165 element.typeText(string)\n \u5411\u5143\u7d20\u5bf9\u8c61\u8f93\u5165\u5b57\u7b26\u4e32 \uff0c\u6bd4\u5982\u8f93\u5165\u6846 \u7ec4\u5408\u952e element.keyCombo(comboString)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#23","title":"2.3\u3001\u6846\u67b6\u5c01\u88c5","text":"\u4ee3\u7801\u793a\u4f8b\uff1a # \u8be6\u7ec6\u4ee3\u7801\u8bf7\u67e5\u770b src/dogtail_utils.py\nclass DogtailUtils:\ndef __init__(self, name=None, description=None):\nself.name = name\nself.description = description\nself.obj = root.application(self.name, self.description)\ndef app_element(self, *args, **kwargs):\n\"\"\"\n \u83b7\u53d6app\u5143\u7d20\u7684\u5bf9\u8c61\n :return: \u5143\u7d20\u7684\u5bf9\u8c61\n \"\"\"\nreturn self.obj.child(*args, **kwargs, retry=False)\ndef element_center(self, element) -> tuple:\n\"\"\"\n \u83b7\u53d6\u5143\u7d20\u7684\u4e2d\u5fc3\u4f4d\u7f6e\n :param element:\n :return: \u5143\u7d20\u4e2d\u5fc3\u5750\u6807\n \"\"\"\n_x, _y, _w, _h = self.app_element(element).extents\n_x = _x + _w / 2\n_y = _y + _h / 2\nreturn _x, _y\n \u6846\u67b6\u63d0\u4f9b\u7684\u63a5\u53e3\u975e\u5e38\u7b80\u6d01\uff0c\u5728\u8c03\u7528\u65f6\uff1a self.dog.element_center(\"\u64ad\u653e\")\n \u8fd9\u6837\u5c31\u80fd\u83b7\u53d6\u5230\u6b64\u5143\u7d20\u7684\u4e2d\u5fc3\u5750\u6807\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_5","title":"\u516d\u3001\u6807\u7b7e\u5316\u7ba1\u7406","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_4","title":"1\u3001\u6807\u7b7e\u8bf4\u660e","text":"\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u811a\u672c ID\uff1a\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c/\u51fd\u6570 ID\uff1b PMS\u7528\u4f8bID\uff1aPMS \u4e0a\u5bf9\u5e94\u7684\u7528\u4f8b ID\uff08\u7528\u4f8b\u5e93 ID\uff09\uff1b \u9ed8\u8ba4\u4f7f\u7528\u7528\u4f8b\u5e93 ID\uff0c\u5bf9\u4e8e\u6682\u65f6\u6ca1\u6709\u4f7f\u7528\u7528\u4f8b\u5e93\u7ba1\u7406\u7528\u4f8b\u7684\u9879\u76ee\uff0c\u53ef\u4ee5\u4f7f\u7528\u4ea7\u54c1\u5e93\u7528\u4f8b ID\uff1b \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1aFUNC\uff08\u529f\u80fd\uff09\u3001PERF\uff08\u6027\u80fd\uff09\u3001STR\uff08\u538b\u529b\uff09\u3001SEC\uff08\u5b89\u5168\uff09\u3001CTS\uff08\u517c\u5bb9\u6027\uff09\u3001API\uff08\u63a5\u53e3\uff09\u3001BASELINE\uff08\u57fa\u7ebf-\u9884\u7559\uff09 \u8bbe\u5907\u7c7b\u578b\uff1aPPL\uff08\u4f9d\u8d56\u5916\u8bbe\u7684\u7528\u4f8b\uff09\u3001COL\uff08\u4f9d\u8d56\u4e3b\u63a7\u673a\u7684\u7528\u4f8b\uff09 \u7528\u4f8b\u6765\u6e90\uff1aBUG\uff08\u7531 Bug \u8f6c\u7684\u7528\u4f8b\uff09 \u4e0a\u7ebf\u5bf9\u8c61\uff1aCICD\uff0c\u8868\u793a\u4e0a\u7ebf\u5230 CICD \u6d41\u6c34\u7ebf\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u53ef\u4e00\u952e\u751f\u6210 case_list.csv \u6587\u4ef6\uff0c\u7528\u4e8e\u5bfc\u5165\u5230\u660e\u9053\u4e91 AT \u7528\u4f8b\u5217\u8868\u4e2d\u63a7\u5236 CICD \u8dd1\u6d4b\u8303\u56f4\uff1b \u6d4b\u8bd5\u7ea7\u522b\uff1aC1 / C2 / C3 / C4\uff0c\u5177\u4f53\u5b9a\u4e49\u53c2\u8003\u6d41\u6c34\u7ebf\u4f7f\u7528\u6307\u5bfc\uff1b \u8df3\u8fc7\u539f\u56e0\uff1askip-XXX\uff0c\u7528\u4e8e\u63a7\u5236\u7528\u4f8b\u662f\u5426\u6267\u884c\uff1b \u786e\u8ba4\u4fee\u590d\uff1afixed-XXX\uff0c\u7528\u4e8e\u6807\u8bb0\u7528\u4f8b\u7684\u4fee\u590d\u72b6\u6001\uff08\u540e\u9762\u8be6\u7ec6\u8bb2\u89e3\u7528\u6cd5\uff09\uff1b \u5e9f\u5f03\u7528\u4f8b\uff1aremoved-\u5df2\u5e9f\u5f03\uff0c\u7528\u4e8e\u6807\u8bb0\u5df2\u7ecf\u5e9f\u5f03\u7684\u7528\u4f8b\uff0c\u6b64\u7528\u4f8b\u6807\u7b7e\u4e0d\u4f1a\u88ab\u6dfb\u52a0\uff0c\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff1b \u793a\u4f8b\uff1a \u811a\u672cID PMS\u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u8bbe\u5907\u7c7b\u578b \u7528\u4f8b\u6765\u6e90 \u4e0a\u7ebf\u5bf9\u8c61 \u6d4b\u8bd5\u7ea7\u522b \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b ... 679537 679537 L1 FUNC PPL CICD C1 skip-XXX fixed-XXX removed-\u5df2\u5e9f\u5f03 ..."},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_4","title":"2\u3001\u64cd\u4f5c\u6b65\u9aa4","text":"2.1\u3001\u5728\u5b50\u9879\u76ee\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u4ee5\u7528\u4f8b\u7684 py \u6587\u4ef6\u9664\u53bb\u9996\u5b57\u7b26\u4e32 \"test_\" \u548c\u7528\u4f8b\u5e8f\u53f7\u540e\u7684\u5b57\u7b26\u4e32\u4f5c\u4e3a csv \u7684\u6587\u4ef6\u540d\u3002 \u4f8b\u5982: \u76f8\u518c\u7684\u7528\u4f8b\u6587\u4ef6\u4e3a test_album_xxx.py\uff0cxxx \u8868\u793a\u7528\u4f8b\u7684ID\uff08\u4e5f\u53ef\u4ee5\u662f\u81ea\u5b9a\u4e49\u7684\u6570\u5b57\u4ee3\u8868\u7528\u4f8b\u5e8f\u53f7\uff09\uff0c\u6b64\u65f6 csv \u6587\u4ef6\u540d\u5c31\u5e94\u4e3a album.csv\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u6240\u6709 csv \u6587\u4ef6\u5efa\u8bae\u653e\u5728\u4e00\u4e2a tags \u76ee\u5f55\u4e0b\u3002 \u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 2.2\u3001\u7b2c\u4e00\u5217\u4e3a\u811a\u672c ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b\u7528\u4f8b\u6807\u7b7e\u53ef\u4ee5\u65e0\u5e8f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_2","title":"3\u3001\u589e\u52a0\u8bf4\u660e","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_1","title":"3.1\u3001\u8df3\u8fc7\u7528\u4f8b","text":"\u4f20\u7edf\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668(@pytest.mark.skip)\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a; \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#311","title":"3.1.1\u3001\u56fa\u5b9a\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 679537 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u7b7e\u5f00\u5934\u4e3a \u201cskip-XXX\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\uff0c\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\u5219\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u7b7e\u4e3a SKIPED\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#312","title":"3.1.2\u3001\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skipif_platform-aarch64&mips64 \u67d0\u4e9b\u7528\u4f8b\u4f1a\u56e0\u4e3a\u4e0d\u540c\u7684\u73af\u5883\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\uff0c\u5e38\u89c1\u7684\u573a\u666f\u4e3a\u5728\u4e0d\u540c\u67b6\u6784\u4e0a\u5224\u65ad\u662f\u5426\u6267\u884c\uff0c\u8df3\u8fc7\u7684\u539f\u56e0\u6807\u7b7e\u4e3a \u201cskipif_platform-\u201d \u52a0\u67b6\u6784\u540d\uff0c\u591a\u4e2a\u67b6\u6784\u4e4b\u95f4\u4f7f\u7528 \u201c&\u201d \u62fc\u63a5\uff1b \u4ee5\u4e0a\u4f8b\u5b50\u4e3a\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u5224\u65ad\u5f53\u524d\u67b6\u6784\u662f\u5426\u4e3a arrch64 \u6216\u8005 mips64\uff0c\u82e5\u662f\uff0c\u5219\u8df3\u8fc7\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u82e5\u5426\u5219\u6267\u884c\u7528\u4f8b\uff1b \u76ee\u524d\u6846\u67b6\u9ed8\u8ba4\u4ec5\u652f\u6301\u67b6\u6784\u7684\u6761\u4ef6\u5224\u65ad\uff0c\u4f46\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u903b\u8f91\u652f\u6301\u81ea\u5b9a\u4e49\u6dfb\u52a0\u3002 \u5728\u9879\u76ee\u76ee\u5f55\u8def\u5f84\u4e0b\u5b58\u5728\u6587\u4ef6 setting/skipif.py\uff0c\u6240\u6709\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u7684\u51fd\u6570\u5199\u5728\u6b64\u6587\u4ef6\u4e2d\u3002 \u9ed8\u8ba4\u67b6\u6784\u5224\u65ad\u4f8b\u5b50\uff1a def skipif_platform(args: str):\n\"\"\"\u5e73\u53f0\u8df3\u8fc7\"\"\"\n_skip_key = args.split(\"&\")\nfor key in _skip_key:\nif GlobalConfig.SYS_ARCH == key:\nreturn True\nreturn False\n \u65b9\u6cd5\u7f16\u5199\u89c4\u8303\uff1a \u65b9\u6cd5\u540d\u5fc5\u987b\u4ee5 skipif \u5f00\u5934\uff1b \u65b9\u6cd5\u5fc5\u987b\u6709\u8fd4\u56de\u7ed3\u679c\u5e76\u4e14\u4e3a\u5e03\u5c14\u503c\uff08True \u4ee3\u8868\u8df3\u8fc7\uff0cFalse \u4ee3\u8868\u4e0d\u8df3\u8fc7\uff09\uff1b \u65b9\u6cd5\u53ea\u80fd\u6709\u4e00\u4e2a\u5165\u53c2\uff1b \u5728 csv \u6587\u4ef6\u8df3\u8fc7\u539f\u56e0\u4e00\u680f\u4e2d\u586b\u5199\u4e3a \u201c{\u51fd\u6570\u540d}-{\u53c2\u6570}\u201d\uff0c\u4f8b\u5982\uff1askipif_platform-aarch64\uff1b\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u4f1a\u4ee5\u7b2c\u4e00\u4e2a \u201c-\u201d \u8fdb\u884c\u5206\u5272\uff0c\u622a\u53d6\u7684\u5de6\u4fa7\u5b57\u7b26\u4e32\u4f5c\u4e3a\u51fd\u6570\u540d\uff0c\u5728 skipif.py \u6587\u4ef6\u4e2d\u67e5\u627e\u662f\u5426\u6709\u540c\u540d\u51fd\u6570\uff0c\u5e76\u5c06\u622a\u53d6\u7684\u53f3\u4fa7\u4f5c\u4e3a\u53c2\u6570\u4f20\u9012\u7ed9\u8be5\u51fd\u6570\uff0c\u901a\u8fc7\u83b7\u53d6\u8be5\u51fd\u6570\u8fd4\u56de\u7684\u5e03\u5c14\u503c\uff0c\u8fd4\u56de True\uff0c\u5219\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u8fd4\u56de False\uff0c\u5219\u6267\u884c\u8be5\u7528\u4f8b\u3002 \u82e5\u51fd\u6570\u9700\u8981\u591a\u4e2a\u53c2\u6570\uff0c\u53ef\u81ea\u5b9a\u4e49\u591a\u4e2a\u53c2\u6570\u4e4b\u95f4\u7684\u8fde\u63a5\u7b26\uff0c\u8fde\u63a5\u7b26\u53f7\u4e0d\u53ef\u4f7f\u7528\u4e0b\u5212\u7ebf\u548c\u9017\u53f7\uff0c\u63a8\u8350\u7edf\u4e00\u4f7f\u7528 & \u7b26\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32","title":"3.2\u3001\u786e\u8ba4\u4fee\u590d","text":"\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7528\u4f8b\u4fee\u590d\u540e\uff0c\u4f46\u4e0d\u80fd\u7acb\u5373\u5220\u9664\u8df3\u8fc7\u539f\u56e0\uff08skip-XXX\uff09\u7684\u7528\u4f8b\uff0c\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u786e\u8ba4\u4fee\u590d\u201d\uff0c\u4f5c\u4e3a\u6807\u8bb0\u8be5\u7528\u4f8b\u662f\u5426\u5df2\u7ecf\u4fee\u590d\uff0c\u56fa\u5b9a\u586b\u5165\u5b57\u6bb5\u4e3a \u201cfixed-\u5df2\u4fee\u590d\u201d\u3002\u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u5373\u4f7f\u540c\u65f6\u6807\u8bb0\u4e86 skip-XXX \u4e5f\u4f1a\u6b63\u5e38\u6267\u884c\u3002 \u793a\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d 679537 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d \u3010\u540c\u65f6\u6807\u8bb0\u4e86skip \u548c fixed\uff0c\u4f46\u4ecd\u7136\u60f3\u8981\u8df3\u8fc7\u7528\u4f8b\u3011 \u5f53 \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u540c\u65f6\u586b\u5165\u540e\uff0c\u547d\u4ee4\u884c\u4f20\u9012\u53c2\u6570 --ifixed yes\uff0c\u5219\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\u8be5\u6761\u7528\u4f8b\u3002 python3 manage.py run --ifixed yes\n \u770b\u5230\u8fd9\u91cc\u6709\u4e9b\u540c\u5b66\u53ef\u80fd\u8981\u95ee\u4e86\uff0c\u6211\u60f3\u6062\u590d\u8df3\u8fc7\u6267\u884c\uff0c\u76f4\u63a5\u628a skip-XXX \u8fd9\u4e00\u5217\u6807\u7b7e\u5220\u6389\u4e0d\u5c31\u597d\u4e86\uff0c\u8fd8\u641e\u4ec0\u4e48\u786e\u8ba4\u4fee\u590d\u5e72\u5565\uff1f \u8fd9\u91cc\u7ed9\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u89e3\u91ca\u4e00\u4e0b\uff1a \uff08\u4ee5\u4e0b\u6d41\u6c34\u7ebf\u6307\u7684\u662f\u6bcf\u65e5\u6784\u5efa\u7684\u6d41\u6c34\u7ebf\uff0c\u8dd1 AT \u7684\u5168\u91cf\u7528\u4f8b\uff09 \u9996\u5148\uff0c\u6d41\u6c34\u7ebf\u4e0a\u8dd1\u7684\u662f AT \u5386\u53f2 Tag\uff0c\u8df3\u8fc7\u7528\u4f8b\u7684\u6807\u7b7e(skip-XXX) \u662f\u5728\u6700\u65b0\u7684\u4ee3\u7801\u4e0a\u63d0\u4ea4\u7684\uff0c\u6211\u4eec\u91c7\u7528\u6700\u65b0\u7684 csv \u6587\u4ef6\u8986\u76d6\u5386\u53f2 csv \u6587\u4ef6\u7684\u8bbe\u8ba1\u6765\u5b9e\u73b0\u4e86\u5bf9\u5386\u53f2 Tag \u4e0a\u7528\u4f8b\u7684\u8df3\u8fc7\uff1b \u7136\u540e\uff0c\u5728\u65e5\u5e38\u8df3\u8fc7\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u540c\u65f6\u4e5f\u5728\u4fee\u590d\u4e00\u4e9b\u7528\u4f8b\uff0c\u4fee\u590d\u540e\u7684\u8fd9\u4e9b\u7528\u4f8b\u5728\u672c\u5730\u8c03\u8bd5\u7684\u65f6\u5019\u6211\u4eec\u4e0d\u5e0c\u671b\u7ee7\u7eed\u8df3\u8fc7\uff0c\u4f46\u662f\u6b64\u65f6\uff0c\u4fee\u590d\u7684\u8fd9\u4e9b\u7528\u4f8b\u53ef\u80fd\u8fd8\u4e0d\u7a33\u5b9a\uff0c\u4e0d\u9002\u5408\u9a6c\u4e0a\u653e\u5230\u6d41\u6c34\u7ebf\u53bb\u8dd1\uff0c\u4e5f\u5c31\u662f\u8bf4\u6d41\u6c34\u7ebf\u4e0a\u6211\u4eec\u662f\u5e0c\u671b\u4ed6\u7ee7\u7eed\u8df3\u8fc7\u7684\uff0c\u56e0\u6b64\uff0c\u54b1\u4e0d\u80fd\u76f4\u63a5\u628a skip-XXX \u5e72\u6389\uff1b \u8fd9\u91cc\u5c31\u77db\u76fe\u4e86\uff0c\u4e00\u4e2a\u9700\u6c42\u662f\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u53e6\u4e00\u4e2a\u9700\u6c42\u53c8\u4e0d\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u600e\u4e48\u529e\u5462\uff1f \u6211\u4eec\u4f7f\u7528\u201c\u786e\u8ba4\u4fee\u590d\u201d\u6765\u6807\u8bb0\u8fd9\u6761\u7528\u4f8b\u5df2\u7ecf\u4fee\u590d\u4e86\uff0c\u8fd9\u6837\u4f60\u672c\u5730\u8c03\u8bd5\u7528\u4f8b\u7684\u65f6\u5019\u8fd9\u6761\u5df2\u4fee\u590d\u7684\u7528\u4f8b\u662f\u4f1a\u6267\u884c\u7684\uff0c\u540c\u65f6\u5728\u6d41\u6c34\u7ebf\u4e0a\u5c06 --ifixed yes \u53c2\u6570\u52a0\u4e0a\uff0c\u90a3\u4e48\u6d41\u6c34\u7ebf\u4e0a\u6267\u884c\u65f6\u8fd9\u6761\u7528\u4f8b\u4ecd\u7136\u662f\u8df3\u8fc7\u7684\u72b6\u6001\uff0c\u540e\u7eed\u4f60\u6253 Tag \u7684\u65f6\u5019\uff0c\u628a \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u7684\u6807\u7b7e\u5168\u90e8\u5220\u6389\u5c31\u53ef\u4ee5\u4e86\u3002 \u8fd9\u5c31\u662f\u201c\u786e\u8ba4\u4fee\u590d\u201d\u8fd9\u4e2a\u6807\u7b7e\u7684\u80cc\u666f\uff0c\u9700\u8981\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u54c1\u4e00\u54c1\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#33","title":"3.3\u3001\u5e9f\u5f03\u7528\u4f8b","text":"\u9488\u5bf9\u67d0\u4e9b\u7528\u4f8b\uff0c\u7531\u4e8e\u9700\u6c42\u53d8\u66f4\uff0c\u73af\u5883\u5f71\u54cd\u6216\u8bc4\u4f30\u4e0d\u518d\u9002\u7528\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u65f6\uff0c\u7528\u4f8b\u9700\u8981\u5e9f\u5f03\uff0c\u5219\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u5e9f\u5f03\u7528\u4f8b\u201d\uff0c\u8be5\u5217\u5b58\u5728 \u201cremoved-{\u5e9f\u5f03\u539f\u56e0}\u201d\uff0c\u5219\u7528\u4f8b\u4e0d\u4f1a\u6267\u884c\u3002 \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d removed-\u5df2\u5e9f\u5f03 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_2","title":"4\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u4e0a\u9762\u4ecb\u7ecd Pytest \u6846\u67b6\u63d0\u4f9b\u7684\u6807\u7b7e\u529f\u80fd mark\uff0c\u4f7f\u7528\u65f6\u9700\u8981\u4e3a\u6bcf\u4e00\u4e2a\u7528\u4f8b\u6dfb\u52a0\u6807\u7b7e\u88c5\u9970\u5668\uff0c\u5219\u64cd\u4f5c\u590d\u6742\uff0c\u53ef\u7ef4\u62a4\u6027\u5dee\uff0c\u5176\u6839\u672c\u95ee\u9898\u5c31\u662f\u6807\u7b7e\u5206\u6563\u5728\u6bcf\u4e00\u6761\u7528\u4f8b\u7684\u88c5\u9970\u5668\u4e0a\uff0c\u96be\u4ee5\u96c6\u4e2d\u7ef4\u62a4\uff1b\u4e8e\u662f\u4e4e\u5c06\u6240\u6709\u6807\u7b7e\u4f7f\u7528 csv \u6587\u4ef6\u8fdb\u884c\u96c6\u4e2d\u7ba1\u7406\uff0c\u5e76\u901a\u8fc7 Pytest \u7684\u94a9\u5b50\u51fd\u6570\uff0c\u8bfb\u53d6 csv \u6587\u4ef6\uff0c\u52a8\u6001\u6dfb\u52a0\u6807\u7b7e\u5230\u7528\u4e2d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5csv","title":"5\u3001CSV\u6587\u4ef6\u683c\u5f0f","text":"\u6b64\u914d\u7f6e\u6587\u4ef6\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u6807\u7b7e\u6570\u636e\uff0c\u4e14\u8981\u65b9\u4fbf\u80fd\u4f7f\u7528 Excel \u6253\u5f00\u8fdb\u884c\u7f16\u8f91\u67e5\u770b\uff0c\u66f4\u91cd\u8981\u7684\u662f\u6211\u4eec\u4e0d\u60f3\u5f15\u5165\u4e09\u65b9\u4f9d\u8d56\uff0cCSV \u6587\u4ef6\u51e0\u4e4e\u662f\u552f\u4e00\u80fd\u6ee1\u8db3\u6240\u6709\u7684\u8981\u6c42\u7684\u6587\u4ef6\u683c\u5f0f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_6","title":"\u4e03\u3001\u65e5\u5fd7\u7cfb\u7edf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_5","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e YouQu \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u64cd\u4f5c\u65b9\u6cd5\u5c01\u88c5\u5199\u6cd5\uff0c\u901a\u5e38\u662f\u8fd9\u6837\u7684\uff1a\u7c7b\u91cc\u9762\u4e00\u4e2a\u51fd\u6570\u53ea\u5305\u542b\u4e00\u4e2a\u64cd\u4f5c\u6216\u591a\u6b21\u8c03\u7528\u7684\u4e00\u7cfb\u5217\u53ef\u5408\u5e76\u7684\u64cd\u4f5c\uff1b \u4f20\u7edf\u7684\u65e5\u5fd7\u8f93\u51fa\u65b9\u5f0f\uff0c\u9700\u8981\u5728\u6bcf\u4e2a\u51fd\u6570\u91cc\u9762\u4e3b\u52a8\u7f16\u5199\u65e5\u5fd7\u8f93\u51fa\u4ee3\u7801 \uff0c\u4f8b\u5982\uff1a class XXXWidget:\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\nlogger.info(\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\")\n...\n# \u7701\u7565\u4ee3\u7801\u90e8\u5206\n \u4e00\u4e2a\u51fd\u6570\u91cc\u9762\u81f3\u5c11\u5305\u542b\u4e00\u6761\u65e5\u5fd7\u4fe1\u606f\uff0c\u5982\u679c\u6bd4\u8f83\u590d\u6742\u64cd\u4f5c\u6b65\u9aa4\uff0c\u53ef\u80fd\u5305\u542b\u591a\u6761\u65e5\u5fd7\u4fe1\u606f\uff1b \u4e00\u4e2a\u5e94\u7528\u542b\u6709\u5927\u91cf\u7684\u64cd\u4f5c\u51fd\u6570\uff0c\u4e5f\u5c31\u662f\u8bf4\u6211\u4eec\u9700\u8981\u5199\u5927\u91cf\u7684\u65e5\u5fd7\u4ee3\u7801\uff1b \u901a\u8fc7\u7ecf\u9a8c\u89c2\u5bdf\uff0c\u6211\u4eec\u53d1\u73b0\uff0c\u51fd\u6570\u8bf4\u660e\u4ee5\u53ca\u51fd\u6570\u64cd\u4f5c\u65e5\u5fd7\uff0c\u5177\u6709\u8f83\u9ad8\u7684\u91cd\u590d\u5ea6\uff08\u4ece\u4e0a\u9762\u7684\u4f8b\u5b50\u4e5f\u53ef\u4ee5\u770b\u51fa\u6765\uff09\uff0c\u56e0\u6b64\u6211\u4eec\u5927\u80c6\u7684\u8bbe\u60f3\uff0c\u80fd\u4e0d\u80fd\u57fa\u4e8e\u6846\u67b6\u6267\u884c\u65f6\uff0c\u81ea\u52a8\u7684\u5c06\u51fd\u6570\u8bf4\u660e\u4f5c\u4e3a\u65e5\u5fd7\u6253\u5370\u51fa\u6765\uff0c\u4ece\u800c\u51cf\u5c11\u5927\u91cf\u65e5\u5fd7\u4ee3\u7801\u91cf\u548c\u91cd\u590d\u7f16\u5199\uff0c\u90a3\u771f\u662f\u5999\u554a~\u3002 \u57fa\u4e8e\u6b64\u201c\u5929\u771f\u201d\u7684\u60f3\u6cd5\uff0c\u6211\u4eec\u8bbe\u8ba1\u51fa\u4e86 youqu \u7684\u65e5\u5fd7\u7cfb\u7edf\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_5","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u6838\u5fc3\u539f\u7406\uff1a \u901a\u8fc7\u7ed9\u7c7b\u52a0\u4e0a\u4e00\u4e2a\u88c5\u9970\u5668 @log\uff0c\u52a8\u6001\u7ed9\u8be5\u7c7b\u4e0b\u6240\u6709\u7684\u51fd\u6570\u53ca\u7236\u7c7b\u51fd\u6570\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668 @_trace\uff0c\u5728\u6b64\u88c5\u9970\u5668\u4e2d\u6211\u4eec\u80fd\u52a8\u6001\u7684\u6355\u83b7\u6240\u8c03\u7528\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff08func.__doc__\uff09\uff0c\u901a\u8fc7\u65e5\u5fd7\u8f93\u51fa\u5668\u5c06\u5176\u8f93\u51fa\u5373\u53ef\u3002 \u5b9e\u73b0\u6b65\u9aa4\uff1a \u901a\u8fc7 inspect.getmembers \u83b7\u53d6\u88ab\u88c5\u9970\u7684\u7c7b\u4e0b\u6240\u6709\u51fd\u6570\uff0c\u5305\u542b\u9759\u6001\u65b9\u6cd5\uff0c\u7c7b\u65b9\u6cd5\uff0c\u5b9e\u4f8b\u65b9\u6cd5\uff1b \u901a\u8fc7 setattr(\u7c7b, \u65b9\u6cd5, _trace\uff09 \u7684\u65b9\u5f0f\uff0c\u7ed9\u7b26\u5408\u6761\u4ef6\u7684\u51fd\u6570\uff0c\u52a8\u6001\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_3","title":"3\u3001\u65e5\u5fd7\u914d\u7f6e","text":"[log_cli]\n;\u65e5\u5fd7\u76f8\u5173\u914d\u7f6e\uff08\u4e0d\u6253\u5370\u6784\u9020\u51fd\u6570\u548c\u9b54\u6cd5\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff09\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = INFO\n# ============= \u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u914d\u7f6e ================\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u5f00\u5934\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7, \u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_STARTSWITH = Assert\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u7ed3\u5c3e\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_ENDSWITH = Widget\n;\u652f\u6301\u7c7b\u540d\u5305\u542b xxx \u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_CONTAIN = ShortCut\n# ==============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_3","title":"4\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u5728\u5e94\u7528\u5e93 widget \u65b9\u6cd5\u5e93\u91cc\u9762\uff0c\u53ea\u9700\u8981\u5728\u51fa\u53e3\u6587\u4ef6\u52a0\u4e0a\u7c7b\u88c5\u9970\u5668\uff0c\u5c31\u53ef\u4ee5\u5b9e\u73b0\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u4e86\uff1b # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6ce8\u610f\uff0c\u662f\u7c7b\u88c5\u9970\u5668\u3002 \u5b9e\u4f8b\uff1a # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\n@classmethod\ndef find_dfm_image(cls, *elements, multiple=False, rate=0.9):\n\"\"\"\n \u67e5\u627e\u56fe\u7247 {{elements}}.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e {{rate}} \u7684\u5750\u6807\n :param elements:\n :param multiple:\n :return:\n \"\"\"\nelement = tuple(map(lambda x: f\"{Config.PIC_RES_PATH}/{x}\", elements))\nreturn cls.find_image(*element, multiple=multiple)\n \u8c03\u7528\u65b9\u6cd5\u65f6\uff1a DfmWidget.find_dfm_image(\"dfm_001\")\n \u81ea\u52a8\u8f93\u51fa\u7684\u65e5\u5fd7\uff1a >> x86_64-uos-6: 02/28 17:48:47 | INFO | logger_utils: [find_dfm_image]: \u67e5\u627e\u56fe\u7247 dfm_001.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e 0.9 \u7684\u5750\u6807\n \u52a0\u4e0a\u88c5\u9970\u5668 @log \u4e4b\u540e\uff0c\u65b9\u6cd5\u5c42\u6240\u6709\u7684\u51fd\u6570\uff08\u5305\u62ec\u5b9e\u4f8b\u65b9\u6cd5\u3001\u7c7b\u65b9\u6cd5\u3001\u9759\u6001\u65b9\u6cd5\uff09\u90fd\u4e0d\u9700\u8981\u518d\u5199\u65e5\u5fd7\u4ee3\u7801\uff0c\u6267\u884c\u7684\u65f6\u5019\u4f1a\u81ea\u52a8\u8f93\u51fa\uff0c\u5e76\u4e14\u6240\u6709\u8c03\u7528\u7684\u65b9\u6cd5\u4f1a\u4ee5 allure.step \u7684\u65b9\u5f0f\uff0c\u5c55\u793a\u5728 allure \u62a5\u544a\u4e2d\uff0c\u5728\u62a5\u544a\u4e2d\u66f4\u80fd\u4e00\u76ee\u4e86\u7136\u7684\u770b\u5230\u7528\u4f8b\u6267\u884c\u6b65\u9aa4\u3002 \u3010\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\u3011 \u901a\u8fc7\u89c2\u5bdf\u524d\u9762\u7684\u4f8b\u5b50\uff0c\u7ec6\u5fc3\u7684\u540c\u5b66\u53ef\u80fd\u8fd8\u53d1\u73b0\u4e86\u4e00\u4e2a\u5c0f\u7ec6\u8282\uff1a\u51fd\u6570\u529f\u80fd\u8bf4\u660e\u4e2d\uff0c\u4e24\u5bf9\u5927\u62ec\u53f7\u4e2d\u7684\u5185\u5bb9 {{elements}} \u4f5c\u4e3a\u53d8\u91cf\u8f93\u51fa\u51fa\u6765\u4e86\uff1b \u6ca1\u9519\uff0c\u8fd9\u5c31\u662f\u6211\u4eec\u53c2\u8003Django \u548c jinja2 \u7684\u6a21\u677f\u8bed\u6cd5\u8bbe\u8ba1\u51fa\u7684\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\uff0c\u4f7f\u7528\u65b9\u6cd5\u5f88\u7b80\u5355\uff0c\u7528\u4e24\u5bf9\u5927\u62ec\u53f7\u628a\u51fd\u6570\u7684\u53c2\u6570\u62ec\u8d77\u6765\uff0c\u8fd9\u6837\u5728\u65e5\u5fd7\u8f93\u51fa\u7684\u65f6\u5019\u5c31\u80fd\u628a\u8c03\u7528\u51fd\u6570\u65f6\u53c2\u6570\u7684\u503c\u8f93\u51fa\u51fa\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_7","title":"\u516b\u3001\u73af\u5883\u90e8\u7f72","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_6","title":"1\u3001\u539f\u5219","text":"YouQu \u7684\u73af\u5883\u4f9d\u8d56\u4e00\u76f4\u575a\u6301 2 \u4e2a\u539f\u5219\uff1a \u6700\u5c0f\u73af\u5883\u4f9d\u8d56\u539f\u5219 \u6709\u4e9b\u540c\u5b66\u5199\u4e00\u4e9b\u529f\u80fd\uff0c\u9996\u5148\u60f3\u5230\u7684\u5c31\u662f\u53bb\u641c\u7d22\u5f15\u64ce\u641c\u4e00\u4e0b\uff0c\u770b\u6709\u6ca1\u6709\u73b0\u6210\u7684\u5de5\u5177\u6216\u8005\u4ee3\u7801\u76f4\u63a5\u80fd\u7528\uff0c\u7f8e\u5176\u540d\u66f0\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\uff0c\u522b\u4eba\u5df2\u7ecf\u9020\u597d\u4e86\u8f6e\u5b50\u54b1\u4eec\u5c31\u4e0d\u8981\u91cd\u590d\u53bb\u9020\u4e86\uff0c\u7136\u540e\u4e00\u5207\u4f3c\u4e4e\u90fd\u53d8\u5f97\u90a3\u4e48\u7684\u7406\u6240\u5e94\u5f53\u3002 \u5f53\u7136\u8fd9\u6837\u505a\u65e0\u53ef\u539a\u975e\uff0c\u6211\u76f8\u4fe1\u6709\u8fd9\u6837\u60f3\u6cd5\u5e76\u4e14\u4e00\u76f4\u8df5\u884c\u8fd9\u6837\u505a\u6cd5\u7684\u540c\u5b66\u4e0d\u5728\u5c11\u6570\uff0c\u4f46\u8fd9\u6837\u505a\u6709\u4e00\u4e2a\u5f88\u4e25\u91cd\u7684\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f60\u5199\u4e00\u4e2a\u5927\u578b\u9879\u76ee\u65f6\uff0c\u4f60\u4f1a\u5f15\u5165\u975e\u5e38\u975e\u5e38\u975e\u5e38\u591a\u7684\u4f9d\u8d56\uff0c\u6bd4\u5982\u8981\u505a\u4e2a\u63a5\u53e3\u8bf7\u6c42\u8981\u7528 requests\u3001\u8bfb\u5199\u4e2a\u6570\u636e\u7528 pandas\u3001\u5199\u4e2a\u8868\u683c\u7528 pyopenxl\u3001\u89e3\u6790\u4e2a\u6587\u672c\u8981\u7528\u8fd9\u4e2a\u90a3\u4e2a\u4e09\u65b9\u5e93 ... \u3002 \u6211\u8ba4\u4e3a\u8fd9\u662f\u975e\u5e38\u4e0d\u597d\u7684\u4e60\u60ef\uff0c\u5728\u5b9e\u73b0\u4e00\u4e2a\u529f\u80fd\u7684\u65f6\u5019\uff0c\u9996\u5148\u6211\u4eec\u5e94\u8be5\u53bb\u60f3\u81ea\u5df1\u600e\u4e48\u6837\u53bb\u5b9e\u73b0\uff0c\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff1b \u5982\u679c\u4f60\u4e0d\u4f1a\uff0c\u4f60\u53ef\u4ee5\u53bb\u5b66\u4e60\u4e09\u65b9\u5e93\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u522b\u4eba\u4e09\u65b9\u5e93\u4e5f\u662f\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\u7684\uff0c\u4e3a\u4ec0\u4e48\u54b1\u4eec\u4e0d\u884c\u5462\uff1b\u5982\u679c\u522b\u4eba\u7684\u4f60\u5b9e\u5728\u662f\u770b\u4e0d\u61c2\uff0c\u60f3\u5c3d\u4e00\u5207\u529e\u6cd5\u786e\u5b9e\u505a\u4e0d\u51fa\u6765\uff0c\u90a3\u518d\u8003\u8651\u5f15\u5165\u8fd9\u4e2a\u4e09\u65b9\u5e93\uff0c\u6211\u8ba4\u4e3a\u8fd9\u6837\u662f\u6ca1\u95ee\u9898\u7684\uff0c\u6bd5\u7adf\u54b1\u4eec\u6bb5\u4f4d\u8fd8\u4e0d\u591f\uff0c\u4f46\u5e0c\u671b\u5c06\u6765\u6709\u4e00\u5929\u6211\u4eec\u53ef\u4ee5\u3002 \u8fd9\u6837\u7684\u505a\u6cd5\u624d\u5e94\u8be5\u662f\u201c\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\u201d\u6b63\u786e\u7684\u64cd\u4f5c\u3002\u4e0d\u4f1a\u6ca1\u5173\u7cfb\uff0c\u770b\u770b\u522b\u4eba\u662f\u600e\u4e48\u5b9e\u73b0\u7684\uff0c\u81ea\u5df1\u518d\u6478\u7d22\u7740\u5199\u51fa\u6765\uff0c\u8fd9\u6837\u81ea\u5df1\u624d\u80fd\u6709\u6240\u63d0\u9ad8\uff0c\u4e0d\u7136\u4f60\u5c31\u53ea\u4f1a\u7528\u522b\u4eba\u7684\u4e1c\u897f\uff1b\u90a3\u4e9b\u5632\u7b11\u3001\u6279\u8bc4\u6211\u4eec\u91cd\u590d\u9020\u8f6e\u5b50\u7684\u4eba\uff0c\u5148\u60f3\u60f3\u81ea\u5df1\u4f1a\u9020\u8f6e\u5b50\u5417\u3002 \u672c\u7740\u81ea\u5df1\u5b9e\u73b0\u80fd\u5b9e\u73b0\u7684\u4e00\u5207\u7684\u539f\u5219\uff0cYouQu \u6846\u67b6\u505a\u5230\u4e86\u975e\u5e38\u5c11\u7684\u73af\u5883\u4f9d\u8d56\uff0c\u800c\u4e14\u6211\u4eec\u4ecd\u5728\u4e0d\u65ad\u52aa\u529b\uff0c\u51cf\u5c11\u73af\u5883\u90e8\u7f72\u7684\u4f9d\u8d56\u3002 \u6700\u5c0f\u4ed3\u5e93\u4f53\u79ef\u539f\u5219 \u5927\u6587\u4ef6\u4e0d\u80fd\u4e0a\u4f20\u5230\u5de5\u7a0b\u91cc\u9762\uff0c\u4fdd\u6301\u6574\u4e2a\u5de5\u7a0b\u7684\u8f7b\u91cf\u5316\uff0c\u8fd9\u6837\u5728\u514b\u9686\u4ee3\u7801\u7684\u65f6\u5019\u624d\u80fd\u975e\u5e38\u5feb\u901f\u65b9\u4fbf\u4f7f\u7528\uff0c\u6211\u4eec\u89c1\u8fc7\u4e00\u4e2a AT \u5de5\u7a0b clone \u5927\u5c0f\u8fbe\u5230\u597d\u51e0\u4e2a G\uff0c\u7b80\u76f4\u4e0d\u53ef\u601d\u8bae\u3002 \u5176\u5b9e\u4ee3\u7801\u6587\u4ef6\u7684\u5927\u5c0f\u662f\u5f88\u5c0f\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u7eaf\u5199\u4ee3\u7801\u968f\u4fbf\u5199\u5de5\u7a0b\u4e5f\u4e0d\u4f1a\u592a\u5927\uff0c\u800c\u6587\u6863\uff08\u5305\u542b\u63d2\u56fe\uff09\u7b49\u8d44\u6e90\u5374\u662f\u5f88\u5360\u7a7a\u95f4\u3002 \u56e0\u6b64\u6211\u4eec\u9009\u62e9\u5c06 YouQu \u7684\u6587\u6863\u5de5\u7a0b\u6d89\u53ca\u5230\u7684\u56fe\u7247\u8d44\u6e90\u90fd\u91c7\u7528\u5916\u94fe\u52a0\u8f7d\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_6","title":"2\u3001\u5b89\u88c5","text":"\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u8fd0\u884c env.sh \u5373\u53ef\u3002 bash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_4","title":"3\u3001\u5b9a\u5236\u4f9d\u8d56","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_2","title":"3.1\u3001\u65b0\u589e\u4f9d\u8d56","text":"\u5982\u679c\u5e94\u7528\u5e93\u8fd8\u9700\u8981\u5176\u4ed6 Python \u4f9d\u8d56\u5e93\uff0c\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a requirement.txt \u6587\u4ef6\uff1b autotest_xxx\n\u251c\u2500\u2500 requirement.txt\n\u251c\u2500\u2500 case ...\n \u91cc\u9762\u5199\u5165\u9700\u8981\u5b89\u88c5\u7684\u4e09\u65b9\u4f9d\u8d56\uff0c\u6bd4\u5982\u50cf\u8fd9\u6837\uff1a # requirement.txt\nPyYAML==6.0 # \u6307\u5b9a\u5b89\u88c5\u67d0\u4e2a\u7248\u672c\nrequests # \u672a\u6307\u5b9a\u7248\u672c\u5219\u5b89\u88c5\u6700\u65b0\u7248\n \u5728\u6267\u884c bash env.sh \u65f6\u4f1a\u4e00\u5e76\u5c06\u5176\u5b89\u88c5\u3002 \u5982\u679c\u591a\u4e2a\u5e94\u7528\u5e93\u90fd\u5b58\u5728 requirement.txt \u6587\u4ef6\uff0c\u6267\u884c env.sh \u65f6\u4f1a\u5c06\u591a\u4e2a requirement.txt \u6587\u4ef6\u4e00\u5e76\u52a0\u8f7d\uff1b\u90a3\u4e48\u4e00\u5b9a\u8981\u6ce8\u610f\u591a\u4e2a requirement.txt \u6587\u4ef6\u53ef\u80fd\u5b58\u5728\u76f8\u540c\u7684\u4f9d\u8d56\u88ab\u6307\u5b9a\u5b89\u88c5\u4e0d\u540c\u7248\u672c\u7b49\u7b49\u517c\u5bb9\u6027\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32_1","title":"3.2\u3001\u88c1\u526a\u4f9d\u8d56","text":"\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0c\u53ef\u80fd\u4f60\u53ea\u9700\u8981\u5b89\u88c5\u4e00\u4e9b\u6700\u6700\u57fa\u7840\u7684\u4f9d\u8d56\uff0c\u5176\u4ed6\u7684\u90fd\u4e0d\u9700\u8981\uff0c\u6bd4\u5982\u7eaf\u63a5\u53e3\u81ea\u52a8\u5316\u7684\u9879\u76ee\uff0c\u5b83\u4e0d\u9700\u8981 UI \u81ea\u52a8\u5316\u76f8\u5173\u7684\u4f9d\u8d56\u3002 \u4f60\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\uff0c\u5b58\u653e\u4e00\u4e2a BASICENV \u7684\u666e\u901a\u6587\u4ef6\uff0c\u91cc\u9762\u4e0d\u9700\u8981\u5199\u4efb\u4f55\u5185\u5bb9\uff0c\u8fd9\u6837\u6267\u884c env.sh \u65f6\uff0c\u53ea\u4f1a\u5b89\u88c5\u6700\u57fa\u7840\u7684\u4f9d\u8d56\u3002 autotest_xxx\n\u251c\u2500\u2500 BASICENV # \u53ef\u4ee5\u4f7f\u7528\uff1atouch BASICENV \u521b\u5efa\u6587\u4ef6\n\u251c\u2500\u2500 case ...\n \u57fa\u7840\u4f9d\u8d56\u4ec5\u5b89\u88c5\u4ee5\u4e0b\u51e0\u4e2a\u5305\uff1a pytest # pytest\npytest-rerunfailures # \u5931\u8d25\u91cd\u8dd1\u63d2\u4ef6\npytest-timeout # \u7528\u4f8b\u8d85\u65f6\u63d2\u4ef6\nallure-pytest # \u751f\u6210 allure \u62a5\u544a\u63d2\u4ef6\nallure.deb # allure \u62a5\u544a\u67e5\u770b\u5de5\u5177\n \u88c1\u526a\u4f9d\u8d56 \u548c \u65b0\u589e\u4f9d\u8d56 \u662f\u4e0d\u51b2\u7a81\u7684\uff0c\u53ef\u4ee5\u540c\u65f6\u4f7f\u7528\u3002 \u6b64\u65b9\u6848\u9ed8\u8ba4\u4e3a\u865a\u62df\u73af\u5883\u90e8\u7f72\uff0c\u5982\u679c\u4f60\u60f3\u76f4\u63a5\u90e8\u7f72\u5728\u672c\u673a\u4e0a\uff1a bash env_dev.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_4","title":"4\u3001\u865a\u62df\u5316\u90e8\u7f72","text":"YouQu\u9ed8\u8ba4\u91c7\u7528\u865a\u62df\u5316\u90e8\u5206\uff0c\u865a\u62df\u5316\u73af\u5883\u5b9e\u9645\u5b89\u88c5\u7684\u4f4d\u7f6e\u662f\u5728 $HOME/.local/share/virtualenvs/youqu-oHTM7l7G \u76ee\u5f55\u4e0b youqu-oHTM7l7G \u6b64\u76ee\u5f55\u540d\u79f0\u524d\u9762\u90e8\u5206\u662f\u4f60\u7684\u4ee3\u7801\u6839\u76ee\u5f55\u7684\u540d\u79f0\uff0c\u540e\u9762\u90e8\u5206\u662f\u751f\u6210\u7684\u968f\u673a\u5b57\u7b26\u4e32\uff1b \u540c\u5b66\u4eec\u5728\u8fdc\u7a0b\u673a\u5668\u4e0a\u5b9a\u4f4d\u95ee\u9898\u7684\u65f6\u5019\uff0c\u5982\u679c\u4f7f\u7528 Pycharm \u8c03\u8bd5\uff0c\u5c31\u5c06\u89e3\u91ca\u5668\u6307\u5b9a\u5230\u8fd9\u4e2a\u76ee\u5f55\u7684\u5c31\u884c\u4e86\uff1b \u5f53\u7136\uff0c\u6211\u4eec\u4e5f\u63d0\u4f9b\u4e86\u672c\u673a\u5f00\u53d1\u73af\u5883\u90e8\u7f72\uff1a bash env_dev.sh\n \u5982\u679c\u4f60\u662f\u672c\u5730\u5f00\u53d1\u73af\u5883\u53ef\u4ee5\u7528\u5b83\uff0c\u533a\u522b\u5c31\u662f\u9a71\u52a8\u6267\u884c\u7684\u65f6\u5019\u4f7f\u7528\uff1apython3 manage.py xxx"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_8","title":"\u4e5d\u3001\u5931\u8d25\u5f55\u5c4f","text":"\u5f55\u5c4f\u5176\u5b9e\u662f\u4e00\u79cd\u89c6\u9891\u5f62\u5f0f\u7684\u65e5\u5fd7\uff0c\u56e0\u4e3a\u5f88\u591a\u65f6\u5019\u6211\u4eec\u5728\u67e5\u770b\u65e5\u5fd7\u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u51c6\u786e\u7684\u5b9a\u4f4d\u5230\u7528\u4f8b\u5931\u8d25\u7684\u5177\u4f53\u539f\u56e0\uff0c\u56e0\u6b64\u7528\u4f8b\u7684\u5f55\u5c4f\u80fd\u8ba9\u6211\u4eec\u770b\u5230\u7528\u4f8b\u5728\u6267\u884c\u8fc7\u7a0b\uff1b \u3010\u4f7f\u7528\u65b9\u6cd5\u3011 \u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u5173\u6ce8 2 \u4e2a\u53c2\u6570\uff1b ;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\u3002\n;\u6ce8\u610f\uff0c\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u4e0d\u80fd\u5c0f\u4e8e\u5931\u8d25\u5f55\u5c4f\u6b21\u6570\uff0c\u5373 RERUN >= RECORD_FAILED_CASE\nRECORD_FAILED_CASE = 1\n \u9ed8\u8ba4\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u662f 1 \u6b21\uff1b RECORD_FAILED_CASE = 1 \u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff1b RECORD_FAILED_CASE = 0 \u8868\u793a\u4e0d\u7ba1\u7528\u4f8b\u6210\u529f\u6216\u5931\u8d25\u90fd\u5f55\u5c4f\uff1b \u5f55\u5c4f\u662f\u8981\u5360\u7528\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u7279\u522b\u662f\u5728\u4e00\u4e9b\u914d\u7f6e\u8f83\u4f4e\u7684\u673a\u5668\u4e0a\u4f1a\u5f88\u660e\u663e\uff0c\u6240\u4ee5\u4f60\u9700\u8981\u8003\u8651\u662f\u5426\u6709\u5fc5\u8981\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1b \u4f7f\u7528 manage.py \u6267\u884c\u7528\u4f8b\u9ed8\u8ba4\u8bfb\u53d6\u5230 globalconfig.ini \u91cc\u9762\u7684\u53c2\u6570\uff0c\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report/record \u76ee\u5f55\u4e0b\u4fdd\u5b58\u5931\u8d25\u7528\u4f8b\u7684\u5f55\u5c4f\u548c\u65ad\u8a00\u7684\u90a3\u4e2a\u65f6\u95f4\u70b9\u7684\u622a\u5c4f\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7\u89c6\u9891\u6587\u4ef6\u770b\u5230\u5931\u8d25\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u90fd\u53d1\u751f\u4e86\u4ec0\u4e48\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#wayland","title":"\u5341\u3001Wayland \u9002\u914d","text":"Wayland \u4e0b\u81ea\u52a8\u5316\u4e3b\u8981\u95ee\u9898\u662f X11 \u4e0b\u7684\u952e\u9f20\u64cd\u4f5c\u65b9\u6cd5\u65e0\u6cd5\u4f7f\u7528\uff0c\u6bd4\u5982 Xdotool\u3001 PyAutoGUI\u3001Xwininfo \u7b49\u7b49\uff1b YouQu \u5728 Wayland \u4e0b\u517c\u5bb9\u9002\u914d\uff0cenv.sh \u5728 Wayland \u4e0b\u6267\u884c\u65f6\u4f1a\u5b89\u88c5\u81ea\u7814\u7684\u952e\u9f20\u64cd\u4f5c\u670d\u52a1\uff08\u53ef\u80fd\u5b58\u5728\u4e00\u4e9b\u4f9d\u8d56\u62a5\u9519\uff0c\u6309\u7167\u6ce8\u91ca\u89e3\u51b3\u5373\u53ef\uff09\uff0c\u6846\u67b6\u6838\u5fc3\u5e93\u4e5f\u9488\u5bf9\u6027\u7684\u505a\u4e86\u9002\u914d\uff0c\u4e0a\u5c42\u7528\u4f8b\u5b8c\u5168\u4e0d\u7528\u5173\u5fc3\u673a\u5668\u662fWayland \u8fd8\u662f X11\uff0c\u6846\u67b6\u4f1a\u6839\u636e\u6267\u884c\u65f6\u72b6\u6001\u81ea\u52a8\u5224\u65ad\u8d70\u4e0d\u540c\u7684\u903b\u8f91\uff1b \u7b80\u5355\u8bb2\u5c31\u662f\uff0c\u5e94\u7528\u5e93\u53ea\u9700\u8981\u7ef4\u62a4\u4e00\u5957\u7528\u4f8b\u811a\u672c\u5373\u53ef\u3002 \u3010\u7528\u4f8b\u517c\u5bb9\u3011 \u56e0\u4e3a Wayland \u4e0b\u6709\u4e9b\u5e94\u7528\u7684\u754c\u9762\u663e\u793a\u548c\u529f\u80fd\u672c\u8eab\u5b58\u5728\u4e00\u4e9b\u5dee\u5f02\uff0c\u7528\u4f8b\u5c42\u53ef\u80fd\u9700\u8981\u5bf9\u8fd9\u90e8\u5206\u7528\u4f8b\u505a\u903b\u8f91\u5224\u65ad\uff0c\u4f7f\u7528\u5168\u5c40\u914d\u7f6e\u91cc\u9762\u7684\u5e38\u91cf\u8fdb\u884c\u903b\u8f91\u7f16\u5199\u5373\u53ef\uff1a from setting.globalconfig import GlobalConfig\n# GlobalConfig.IS_WAYLAND \u83b7\u53d6\u5230\u5f53\u524d\u7684\u663e\u793a\u670d\u52a1\u5668\uff08bool\uff09\n# \u5e94\u7528\u5e93 Config \u7ee7\u627f GlobalConfig\nif Config.IS_WAYLAND:\npass\nif Config.IS_X11:\npass\n \u6bd4\u5982\u7528\u4f8b\u91cc\u9762\u5982\u679c\u65ad\u8a00\u7684\u56fe\u7247\u4e0d\u540c\uff1a if Config.IS_WAYLAND:\nself.assert_image_exist(\"wayland_XXX\")\nelse:\nself.assert_image_exist(\"x11_XXX\")\n \u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u811a\u672c\u5728 Wayland \u548c X11 \u4e0b\u90fd\u53ef\u4ee5\u8dd1\uff0cso easy \u662f\u4e0d\u662f\uff1f\u5b8c\u5168\u6ca1\u5fc5\u8981\u4e13\u95e8\u62c9\u65b0\u5206\u652f\u8fdb\u884c Wayland \u9002\u914d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_9","title":"\u5341\u4e00\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_7","title":"1. \u76ee\u5f55\u7ed3\u6784","text":"\u6267\u884c\u65f6\u4f1a\u5728\u6839\u76ee\u5f55\u4e0b\u52a8\u6001\u751f\u6210 report \u76ee\u5f55\uff0c\u6240\u6709\u7684\u62a5\u544a\u76f8\u5173\u7684\u6587\u4ef6\u4f1a\u7edf\u4e00\u5b58\u653e\u5728\u91cc\u9762\uff0c\u793a\u4f8b\uff1a /report\n \u251c\u2500\u2500 allure # allure\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json\n \u251c\u2500\u2500 allure_html # \u751f\u6210\u7684html\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 index.html \u251c\u2500\u2500 allure_back # allure\u62a5\u544a\u5907\u4efd\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 20221108114823\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json\n \u251c\u2500\u2500 json # json\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 result_deepin-music_20221109134736_1081333.json\n \u251c\u2500\u2500 logs # \u65e5\u5fd7\u6587\u4ef6\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 2022-11-10_debug.log \u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-10_error.log\n \u251c\u2500\u2500 record # \u5f55\u5c4f\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-09\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 15\u65f614\u520609\u79d2_test_music_303_2_autotest.mp4\n \u2514\u2500\u2500 xml # xml\u62a5\u544a\n\u2514\u2500\u2500 autotest_deepin_music-20221109134736.xml\n \u9ed8\u8ba4\u60c5\u51b5\u4e0b\u540c\u65f6\u751f\u6210 html\u3001xml\u3001json\u4e09\u79cd\u5f62\u5f0f\u7684\u62a5\u544a\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_7","title":"2. \u5b9a\u5236\u62a5\u544a","text":"\u6211\u4eec\u5bf9 allure \u62a5\u544a\u8fdb\u884c\u4e86\u4e00\u7cfb\u5217\u7684\u5b9a\u5236\uff1a \u5b9a\u5236 logo\u3001title\u3001\u62a5\u544a\u9ed8\u8ba4\u8bed\u8a00\u4e3a\u4e2d\u6587\uff1b \u52a0\u5165\u4e86\u7528\u4f8b\u65ad\u8a00\u5931\u8d25\u65f6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u4ee5\u53ca\u6b64\u65f6\u56fe\u50cf\u5bf9\u6bd4\u7684\u6a21\u677f\u56fe\u7247\uff1b \u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\uff0c\u4f60\u53ef\u4ee5\u5728 html \u62a5\u544a\u4e2d\u76f4\u63a5\u770b\u5f55\u5236\u7684\u89c6\u9891\uff1b \u52a0\u5165\u4e86 IP \u5730\u5740\u3001\u7cfb\u7edf\u4fe1\u606f\u3001\u955c\u50cf\u7248\u672c\u7b49\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_5","title":"3. \u67e5\u770b\u62a5\u544a","text":" \u672c\u5730\u6267\u884c \u5728 report/allure \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u4e00\u5806\u6587\u672c\u6587\u4ef6\uff0c\u8fd9\u4e9b\u662f allure \u63d2\u4ef6\u751f\u6210\u7684\u62a5\u544a\u6e90\u6570\u636e\uff0c\u6211\u4eec\u5728 report/allure_html \u76ee\u5f55\u4e0b\u7ed9\u4f60\u751f\u6210\u4e86 html \u6587\u4ef6\uff0c\u4f46\u662f\u4f60\u4e0d\u80fd\u76f4\u63a5\u901a\u8fc7\u6d4f\u89c8\u5668\u6253\u5f00 index.html \u6587\u4ef6\uff0c\u56e0\u4e3a allure \u7684\u62a5\u544a\u90fd\u662f\u57fa\u4e8e\u5728\u7ebf\u7684\u670d\u52a1\uff0c\u4f60\u5e94\u8be5\u8fd9\u6837\u6253\u5f00\uff1a allure open report/allure_html\n \u4f7f\u7528 manage.py \u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u5728\u7ec8\u7aef\u7684\u6700\u540e\u4e00\u884c\uff0c\u6211\u4eec\u4f1a\u7ed9\u4f60\u8f93\u51fa\u6253\u5f00\u62a5\u544a\u7684\u547d\u4ee4\uff0c\u76f4\u63a5\u590d\u5236\u5b83\u5728\u7ec8\u7aef\u6267\u884c\u5c31\u53ef\u4ee5\u67e5\u770b\u4e86\uff0c\u50cf\u8fd9\u6837\uff1a \u7ec8\u7aef\u6267\u884c\u547d\u4ee4: allure open /tmp/youqu/report/allure_html \u67e5\u770b\u62a5\u544a \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 Pycharm \u91cc\u9762\u627e\u5230 index.html \u6587\u4ef6\uff0c\u7136\u540e\u53f3\u952e\u9009\u62e9\u6d4f\u89c8\u5668\u6253\u5f00\uff0c\u6216\u8005\u4f60\u53ef\u4ee5\u7528\u4e00\u4e2a http \u670d\u52a1\u6253\u5f00\u3002 \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 report/allure \u76ee\u5f55\u4e0b\u67e5\u770b\u62a5\u544a\uff1a allure serve report/allure\n \u8fdc\u7a0b\u6267\u884c \u8fdc\u7a0b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\uff0c\u4f1a\u5c06\u6240\u6709\u8fdc\u7a0b\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u62a5\u544a\u90fd\u6536\u96c6\u5230 report/allure \u76ee\u5f55\u4e0b\uff0c\u5206\u522b\u6309\u7167\u673a\u5668\u7684 IP \u7b49\u5efa\u4e86\u4e0d\u540c\u7684\u76ee\u5f55\uff0c\u4f60\u53ef\u4ee5\u5728\u8fd9\u4e9b\u76ee\u5f55\u91cc\u9762\u53bb\u67e5\u770b\u5bf9\u5e94\u7684\u6d4b\u8bd5\u62a5\u544a\uff0c\u67e5\u770b\u65b9\u6cd5\u548c\u524d\u9762\u672c\u5730\u6267\u884c\u67e5\u770b\u7684\u65b9\u6cd5\u4e00\u6837\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_10","title":"\u5341\u4e8c\u3001\u9759\u6001\u4ee3\u7801\u626b\u63cf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_8","title":"1. \u63d0\u524d\u89e3\u51b3\u4ee3\u7801\u95ee\u9898","text":"\u4e3a\u4e86\u5e2e\u52a9\u5f00\u53d1\u8005\u7edf\u4e00\u4ee3\u7801\u98ce\u683c\uff0cPython \u793e\u533a\u63d0\u51fa\u4e86 PEP8 \u4ee3\u7801\u7f16\u7801\u98ce\u683c\uff0cPython \u5b98\u65b9\u540c\u65f6\u63a8\u51fa\u4e86\u4e00\u4e2a\u68c0\u67e5\u4ee3\u7801\u98ce\u683c\u662f\u5426\u7b26\u5408 PEP8 \u7684\u5de5\u5177\uff0c\u540d\u5b57\u4e5f\u53eb PEP8\u3002 \u4f46\u662f\uff0cPycharm \u91cc\u9762\u7684 PEP8 \u63d2\u4ef6\u5b9e\u9645\u4e0a\u5e76\u4e0d\u80fd\u53d1\u73b0\u5f88\u591a\u4ee3\u7801\u95ee\u9898\uff0c\u8fd9\u4e9b\u95ee\u9898\u5e76\u4e0d\u4f1a\u5728\u8fd0\u884c\u65f6\u62a5\u9519\uff0c\u56e0\u4e3a\u4ece Python \u8bed\u8a00\u89d2\u5ea6\u5e76\u4e0d\u5173\u5fc3\u8fd9\u4e9b\u95ee\u9898\uff0c\u5728 Pycharm \u7f16\u8f91\u5668\u91cc\u9762\u4f7f\u7528\u5feb\u6377\u952e ctrl + alt + L\uff0c\u6709\u4e00\u70b9\u70b9\u683c\u5f0f\u5316\u7684\u6548\u679c\uff0c\u80fd\u89e3\u51b3\u4e00\u4e9b\u7a7a\u683c\u3001\u6362\u884c\u7b49\u5c0f\u95ee\u9898\u3002 \u8fd9\u91cc\u63a8\u8350\u4e00\u4e2a Python \u793e\u533a\u6d41\u884c\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff1a Black\uff0c\u53f7\u79f0\u4e0d\u59a5\u534f\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff0c\u5b83\u68c0\u6d4b\u5230\u4e0d\u7b26\u5408\u89c4\u8303\u7684\u4ee3\u7801\u98ce\u683c\u76f4\u63a5\u5c31\u5e2e\u4f60\u5168\u90e8\u683c\u5f0f\u5316\u597d\uff0c\u5c31\u662f\u8fd9\u4e48\u521a\uff01 \u5b89\u88c5\uff1a sudo pip3 install black \n \u4f7f\u7528\u65b9\u6cd5\uff1a black ${CheckPath}\n \u4f7f\u7528\u8fd9\u4e2a\u5de5\u5177\u683c\u5f0f\u5316\u4e4b\u540e\uff0c\u4ee3\u7801\u4f1a\u88ab\u81ea\u52a8\u8c03\u6574\uff0c\u521a\u5f00\u59cb\u4f60\u53ef\u80fd\u4f1a\u89c9\u5f97\u8c03\u6574\u5f97\u5f88\u5938\u5f20\uff0c\u6ca1\u5173\u7cfb\u575a\u6301\u770b\uff0c\u4e60\u60ef\u4e4b\u540e\uff0c\u4f60\u4f1a\u89c9\u5f97\u5f88\u4f18\u96c5\uff0c\u6ca1\u9519\uff0c\u8fd9\u5c31\u662f Pythonic Code \u7684\u6838\u5fc3\uff0c\u8bf7\u4fdd\u6301\u4f18\u96c5\uff5e\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_8","title":"2. \u4ee3\u7801\u626b\u63cf\u5de5\u5177","text":"\u4f7f\u7528\u6839\u76ee\u5f55\u4e0b pylint.sh \u626b\u63cf\u4ee3\u7801\uff0c\u5728 report \u76ee\u5f55\u4e0b\u67e5\u770b\u4ee3\u7801\u626b\u63cf\u62a5\u544a\uff0c\u5982\u679c\u6709\u4ee3\u7801\u95ee\u9898\u8bf7\u63d0\u524d\u89e3\u51b3\u4e4b\u540e\u518d\u63d0\u4ea4\u3002 \u6b64\u811a\u672c\u5df2\u7ecf\u4f7f\u7528 Python \u793e\u533a\u6700\u6d41\u884c\u7684\u4ee3\u7801\u626b\u63cf\u5de5\u5177 Pylint \u8fdb\u884c\u4ee3\u7801\u626b\u63cf\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a bash pylint.sh\n \u8fd0\u884c\u4e4b\u540e\u4f1a\u63d0\u793a\u4f60\u8981\u626b\u63cf\u7684\u76ee\u5f55\uff0c\u6bd4\u5982\u8f93\u5165 apps \uff0c\u5219\u4f1a\u626b\u63cf apps \u4e0b\u7684\u6240\u6709 Python \u4ee3\u7801\u3002 \u5728 setting/pylintrc.cfg \u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u76f8\u5173\u914d\u7f6e\uff0c\u626b\u63cf\u5b8c\u6210\u4e4b\u540e\u5728 report/pylints \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u626b\u63cf\u62a5\u544a\u3002 \u4ee3\u7801\u63d0\u4ea4\u9700\u901a\u8fc7 git review \u63d0\u4ea4\u5230 gerrit \uff0c\u4eba\u5de5 Code Review \u901a\u8fc7\u4e4b\u540e\u5408\u5165\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_11","title":"\u5341\u4e09\u3001\u63d0\u4ea4\u4ee3\u7801","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_9","title":"1. \u5b89\u88c5\u4f9d\u8d56","text":"sudo apt install git-review\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_9","title":"2. \u63d0\u4ea4\u6a21\u677f","text":"\u5728 ~ \u76ee\u5f55\u4e0b\u65b0\u5efa\u6587\u4ef6\uff0c\u5e76\u547d\u540d\u4e3a gitcommit_template \u5c06\u4ee5\u4e0b\u5185\u5bb9\u5199\u5165\u6587\u4ef6\u5f53\u4e2d\uff1a # commit type :fix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style(\u98ce\u683c\u4fee\u6539)\u3001refactor(\u91cd\u6784)\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test(\u6d4b\u8bd5) + \u7b80\u5355\u63cf\u8ff0. \u9ed8\u8ba4fix,\u6839\u636e\u60c5\u51b5\u4fee\u6539\nfix: \n\n# \u8be6\u7ec6\u8bf4\u660e\u4ee3\u7801\u7684\u6539\u52a8\uff0c\u5305\u542b\u4ee3\u7801\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u4ee5\u53ca\u4e3a\u4ec0\u4e48\u8fd9\u4e48\u505a\uff0c\u53ef\u80fd\u4f1a\u5f71\u54cd\u54ea\u4e9b\u529f\u80fd\u3002\u5bf9\u4e8e\u4ee3\u7801\u7684\u5ba1\u6838\u8005\uff0c\u9700\u8981\u4ece\u8fd9\u6bb5\u63cf\u8ff0\u4e2d\u80fd\u5b8c\u5168\u7406\u89e3\u4ee3\u7801\u4e2d\u6240\u6709\u6539\u52a8\u7684\u5185\u5bb9\nDescription: \n\n# \u5199\u4e00\u6bb5\u9762\u5411\u4e8e\u4ea7\u54c1\u7684\u603b\u7ed3\u6027\u5185\u5bb9\uff0c\u7528\u4e8e\u81ea\u52a8\u751f\u6210crp\u4e0a\u7684changlog\uff0c\u9700\u8981\u6ce8\u610f\u7684\u4e8b\uff0c\u8fd9\u6bb5\u63cf\u8ff0\u5fc5\u987b\u4ece\u4ea7\u54c1\u7684\u89d2\u5ea6\u8003\u8651\u3002\nLog: \n\n# \u5173\u8054pms\u4e0a\u7684bug\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94bug\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4fee\u590dbug\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Bug: \n\n# \u4fee\u590d github issue \n#Issue: \n\n# \u5173\u8054pms\u4e0a\u7684\u4efb\u52a1\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94\u4efb\u52a1\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4efb\u52a1\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Task: \n \u547d\u4ee4\u884c\u6267\u884c: git config --global commit.template ~/gitcommit_template\n \u6b64\u547d\u4ee4\u5c06\u6a21\u677f\u52a0\u5165\u5230 git \u7684\u63d0\u4ea4\u6a21\u677f\u4e2d\u3002 \u540e\u7eed\u63d0\u4ea4\u7684\u65f6\u5019\u9700\u8981\u5173\u6ce8\u4e00\u4e0b\u51e0\u70b9\uff1a commit type \u5bf9\u5e94\u4e0d\u540c\u7684\u4fee\u6539\u7c7b\u578b\uff1afix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style \uff08\u98ce\u683c\u4fee\u6539\uff09\u3001refactor \uff08\u91cd\u6784\uff09\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test \uff08\u6d4b\u8bd5\uff09 commit type \u5192\u53f7\u540e\u9762\u52a0\u7a7a\u683c\u3002 Description \u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u9700\u8981\u8fdb\u884c\u8be6\u7ec6\u8bf4\u660e\uff0c\u6bd4\u5982\u5bf9\u529f\u80fd\u8fdb\u884c\u5927\u6539\u7b49\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_6","title":"3. \u63a8\u9001\u4ee3\u7801","text":"\u9996\u5148\u6dfb\u52a0 commit \u4fe1\u606f git add \u540e\u9762\u52a0\u6587\u4ef6\u540d\u79f0\n git add . # \u8868\u793a\u6dfb\u52a0\u6240\u6709\u6587\u4ef6\n \u4f7f\u7528\u8fd9\u6761\u547d\u4ee4\u6ce8\u610f\u6709\u4e9b\u4e34\u65f6\u6587\u4ef6\u4e0d\u8981\u63d0\u4ea4\u5230\u4ed3\u5e93\u4e86\u3002 git commit -a\n \u4e4b\u540e\u5728 fix: \u540e\u9762\uff08\u6ce8\u610f\u5192\u53f7\u540e\u9762\u5fc5\u987b\u52a0\u7a7a\u683c\uff0c\u4e0d\u7136\u76f4\u63a5-1\uff09\u5199\u672c\u5730\u63d0\u4ea4\u7684 commit \u4fe1\u606f\uff0c\u7136\u540e\u5c31\u53ef\u4ee5\u63d0\u4ea4\u4ee3\u7801\u4e86 git review branch(\u5f53\u524d\u5206\u652f) -r origin\n \u6700\u597d\u4e00\u6b21 commit\uff0c\u4e00\u6b21 git review \uff0c\u7ecf\u5e38\u6709\u540c\u5b66\u5728\u672c\u5730\u75af\u72c2 commit \u6700\u540e git review \u62a5\u9519\u4e0d\u77e5\u9053\u548b\u56de\u4e8b\u513f\u3002 \u82e5\u4e0d\u60f3\u6bcf\u6b21\u63d0\u4ea4\u90fd\u52a0\u4e0a -r \u9009\u9879\uff0c\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a git config --global gitreview.remote origin \u63d0\u4ea4\u4ee3\u7801\uff0c\u76f4\u63a5\u4f7f\u7528 git review branch<\u76ee\u6807\u5206\u652f>\uff0c\u4f8b\u5982 git review master"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git","title":"4. Git\u6807\u7b7e","text":"Git \u6807\u7b7e\u5b9e\u9645\u4e0a\u662f commit \u7684\u4e00\u4e2a\u522b\u540d\uff0c\u4e3b\u8981\u7528\u4e8e\u7ba1\u7406\u5386\u53f2\u7248\u672c\u3002 \u60f3\u8c61\u4e00\u4e0b\u9886\u5bfc\u8ba9\u4f60\u628a\u4e4b\u524d\u7684\u67d0\u4e2a\u7248\u672c\u7684\u4ee3\u7801\u62c9\u51fa\u6765\u8dd1\uff0c\u4f60\u662f\u4e0d\u662f\u4e56\u4e56\u7684\u53bb\u628a\u6240\u6709\u63d0\u4ea4\u8bb0\u5f55\u62c9\u51fa\u6765\u627e\uff0c\u7136\u540e\u627e\u5230\u90a3\u4e2a\u54c8\u5e0c\u503c\uff0c\u901a\u8fc7\u54c8\u5e0c\u503c\u6765\u68c0\u51fa\u4ee3\u7801\u3002 \u8fd9\u4e00\u5957\u64cd\u4f5c\u4e0b\u6765\u662f\u4e0d\u662f\u5f88\u9ebb\u70e6\uff0c\u8d39\u65f6\u95f4\u8fd8\u4e0d\u4e00\u5b9a\u80fd\u627e\u5f97\u5230\uff0c\u6ca1\u4eba\u80fd\u8bb0\u4f4f\u6bcf\u4e2a\u63d0\u4ea4\u54c8\u5e0c\u503c\u4ee5\u53ca\u8fd9\u6b21\u63d0\u4ea4\u90fd\u6539\u4e86\u54ea\u4e9b\u4ee3\u7801\u3002 \u56e0\u6b64\u7ed9\u63d0\u4ea4\u6253\u4e2a\u6807\u7b7e\uff0c\u5c31\u662f\u628a\u54c8\u5e0c\u503c\u8f6c\u6362\u6210\u4eba\u7c7b\u80fd\u7406\u89e3\u7684\u8bed\u8a00\uff0c\u6bd4\u5982 v1.0\uff0c\u5c31\u53ef\u4ee5\u76f4\u63a5\u901a\u8fc7\u6807\u7b7e\u627e\u5230\u5bf9\u5e94\u7684\u63d0\u4ea4\u3002 \u65b0\u5efa\u6807\u7b7e git tag -a <tagname>\n \u56de\u8f66\u4e4b\u540e\uff0cGit \u4f1a\u6253\u5f00\u4f60\u7684\u7f16\u8f91\u5668\uff0c\u8ba9\u4f60\u5199\u4e00\u53e5\u6807\u7b7e\u6ce8\u89e3\uff0c\u5c31\u50cf\u4f60\u7ed9\u63d0\u4ea4\u5199\u6ce8\u89e3\u4e00\u6837\u3002 \u67e5\u770b\u6240\u6709\u6807\u7b7e git tag -l\n# git tag \u4e5f\u884c\n \u5220\u9664\u6807\u7b7e git tag -d <tagname>\n \u63a8\u9001\u6807\u7b7e\u81f3\u8fdc\u7a0b git push \u547d\u4ee4\u5e76\u4e0d\u4f1a\u4f20\u9001\u6807\u7b7e\u5230\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\uff0c\u5fc5\u987b\u663e\u5f0f\u5730\u63a8\u9001\u6807\u7b7e\u3002 git push origin <tagname>\n \u63a8\u9001\u6240\u6709\u4e0d\u5728\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\u7684\u6807\u7b7e git push origin --tag\n \u5220\u9664\u8fdc\u7a0b\u6807\u7b7e git push origin :refs/tag/<tagname>\n \u540e\u671f\u6253\u6807\u7b7e \u5148\u7528 git log --pretty=oneline \u67e5\u8be2\u63d0\u4ea4\u8bb0\u5f55\uff0c\u83b7\u53d6\u6821\u9a8c\u7801\u3002 git tag -a <tagname> 9fceb02(\u6821\u9a8c\u7801)\n \u68c0\u51fa\u6807\u7b7e git checkout <tagname>\n \u6b64\u65f6\uff0c\u4ed3\u5e93\u4f1a\u5904\u4e8e\u201c\u5206\u79bb\u5934\u6307\u9488\uff08detached HEAD\uff09\u201d\u7684\u72b6\u6001\u3002 \u5728\u201c\u5206\u79bb\u5934\u6307\u9488\u201d\u72b6\u6001\u4e0b\uff0c\u5982\u679c\u4f60\u505a\u4e86\u67d0\u4e9b\u66f4\u6539\u7136\u540e\u63d0\u4ea4\u5b83\u4eec\uff0c\u6807\u7b7e\u4e0d\u4f1a\u53d1\u751f\u53d8\u5316\uff0c \u4f46\u4f60\u7684\u65b0\u63d0\u4ea4\u5c06\u4e0d\u5c5e\u4e8e\u4efb\u4f55\u5206\u652f\uff0c\u5e76\u4e14\u5c06\u65e0\u6cd5\u8bbf\u95ee\uff0c\u9664\u975e\u901a\u8fc7\u786e\u5207\u7684\u63d0\u4ea4\u54c8\u5e0c\u624d\u80fd\u8bbf\u95ee\u3002 \u56e0\u6b64\uff0c\u5982\u679c\u4f60\u9700\u8981\u8fdb\u884c\u66f4\u6539\uff0c\u6bd4\u5982\u4f60\u8981\u4fee\u590d\u65e7\u7248\u672c\u4e2d\u7684\u9519\u8bef\uff0c\u90a3\u4e48\u901a\u5e38\u9700\u8981\u521b\u5efa\u4e00\u4e2a\u65b0\u5206\u652f\uff1a git checkout -b <NewBranchName> <tagname>\n \u65b0\u5206\u652f\u4e0a\u53ef\u4ee5\u8fdb\u884c\u63d0\u4ea4\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_12","title":"\u5341\u56db\u3001\u5e38\u89c1\u95ee\u9898","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_10","title":"1. \u63d0\u4ea4\u4ee3\u7801\u65f6\u63d0\u793a\u90ae\u7bb1\u6216\u8005\u540d\u79f0\u4e0d\u5bf9","text":"\u91cd\u65b0\u914d\u7f6e\u90ae\u7bb1\u6216\u8005\u540d\u79f0\uff0c\u7136\u540e\u91cd\u7f6e\u751f\u6548\uff1a git commit --amend --reset-author\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_10","title":"2. \u600e\u4e48\u56de\u6eda\u5230\u4e4b\u524d\u7684\u7248\u672c","text":"(1)\u67e5\u8be2\u5386\u53f2\u63d0\u4ea4\u8bb0\u5f55 git log\n \u627e\u5230\u4f60\u8981\u56de\u6eda\u7684\u7248\u672c\uff0c\u590d\u5236 hash \u503c\u3002 \u6ce8\u610f\uff1a\u662f commit \u7a7a\u683c\u4e4b\u540e\u7684 hash \u503c\uff0c\u4e4b\u524d\u6709\u540c\u5b66\u590d\u5236\u7684 Change-Id: \u8fd9\u6837\u80af\u5b9a\u62a5\u9519\u3002 (2)\u56de\u6eda\u7248\u672c\uff0c\u4e0d\u6e05\u9664\u4ee3\u7801 git reset --soft ${hash}\n (3)\u56de\u6eda\u7248\u672c\uff0c\u6e05\u9664\u4ee3\u7801\uff0c\u614e\u7528\u54c8 git reset --hard ${hash}\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-f-s-e","title":"3. \u6d4b\u8bd5\u62a5\u544a\u91cc\u9762 F S . E \u662f\u4ec0\u4e48\u610f\u601d","text":"F \u8868\u793a\u5931\u8d25\uff0c. \uff08\u70b9\uff09\u8868\u793a\u901a\u8fc7\uff0cS \u8868\u793a\u8df3\u8fc7\uff0cE \u8868\u793a error \u6709\u62a5\u9519"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git-status","title":"4. \u89e3\u51b3 git status \u4e2d\u6587\u663e\u793a\u7684\u95ee\u9898","text":"git config --global core.quotePath false\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5-apps","title":"5. apps \u76ee\u5f55\u4e0b\u989c\u8272\u6709\u4e9b\u662f\u9ec4\u8272\u7684","text":"\u5728 Pycharm \u4e2d apps \u76ee\u5f55\u4e0b\u5e94\u7528\u5e93\u6587\u4ef6\u662f\u9ec4\u8272\u7684\uff0c\u7f16\u8f91\u5668\u8bc6\u522b\u4e0d\u5230\u4ee3\u7801\u65b0\u589e\u548c\u4fee\u6539\uff1b \u7531\u4e8e\u793e\u533a\u7248 Pycharm \u4e0d\u80fd\u52a8\u6001\u8bc6\u522b\u591a\u4ed3\u5e93\uff0c\u9700\u8981\u5728 setting \u91cc\u9762\u624b\u52a8\u6ce8\u518c\uff0c\u64cd\u4f5c\u6b65\u9aa4\uff1a File \u2014> Settings \u2014> Version Control \u2014> \u70b9 + \u53f7 \u2014> Directory \u9009\u4e2d\u5e94\u7528\u5e93\u5de5\u7a0b\u76ee\u5f55 \u2014> VCS \u9009\u4e2d Git \u2014> Apply \u5982\u6b64\u5c31\u53ef\u4ee5\u4e86\u3002 \u4e13\u4e1a\u7248 Pycharm \u4e0d\u5b58\u5728\u8fd9\u4e2a\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#6-envsh-r","title":"6. \u6267\u884c env.sh \u62a5\u9519 $'\\r':\u672a\u627e\u5230\u547d\u4ee4","text":"\u51fa\u73b0\u8fd9\u4e2a\u95ee\u9898\u4f60\u5e94\u8be5\u662f\u5728 windows \u4e0a\u6253\u5f00\u6216\u7f16\u8f91\u8fc7 env.sh \u811a\u672c\uff0cwindows\u4e0b\u7684\u6362\u884c\u662f\u56de\u8f66\u7b26+\u6362\u884c\u7b26\uff0c\u4e5f\u5c31\u662f\\r\\n\uff0c\u800c Linxu \u4e0b\u662f\u6362\u884c\u7b26 \\n\uff0cLinux \u4e0b\u4e0d\u8bc6\u522b \\r\uff0c\u56e0\u6b64\u62a5\u9519\u3002 \u89e3\u51b3\u65b9\u6848\uff1a # \u5c06 \\r \u66ff\u6362\u4e3a\u7a7a\nsudo sed -i 's/\\r//' env.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#7","title":"7.\u600e\u6837\u4e3a\u5355\u72ec\u67d0\u4e00\u6761\u7528\u4f8b\u914d\u7f6e\u6267\u884c\u8d85\u65f6\u65f6\u95f4","text":"\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u5982\u4e0b\uff1a @pytest.mark.timeout(300) # \u5355\u4f4d\u79d2\ndef test_xxx_001():\npass\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#8-youqu","title":"8. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u6240\u6709\u4ee3\u7801\uff0c\u5305\u542b\u5b50\u4ed3\u5e93","text":"\u524d\u7f6e\u6761\u4ef6\uff1a\u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 # \u7b2c\u4e00\u6b21\u5b58\u50a8\u5bc6\u7801\uff0c\u63d0\u4f9b\u540e\u9762\u62c9\u4ee3\u7801(gerrit: ldap\u8d26\u53f7\u548c\u5bc6\u7801\uff0cgit\u62c9\u53d6\u7b2c\u4e00\u6b21\u8f93\u5165\u4fdd\u5b58\uff0c\u540e\u9762\u76f4\u63a5\u4f7f\u7528)\ngit config --global credential.helper store\n\n# \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\uff0c\u5e76\u9012\u5f52\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\" --recursive\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#9-youqu","title":"9. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\u6307\u5b9a\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u524d\u7f6e\u6761\u4ef6\uff1a \u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 \u5df2\u5b58\u50a8\u8bbf\u95ee\u5bc6\u7801 # \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\"\n# \u6307\u5b9a\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ncd youqu\ngit submodule update --init apps/autotest_xxx_xxx\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#10-youqu","title":"10. \u5982\u4f55\u66f4\u65b0 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\uff0c\u6240\u6709\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u66f4\u65b0\u6240\u6709\u5b50\u4ed3\u5e93\u4ee3\u7801 cd youqu\ngit pull & git submodule foreach git pull\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#11-youqu-master-detached-head","title":"11. \u5982\u4f55\u4fee\u590d YouQu \u6240\u6709\u5b50\u4ed3\u5e93 master \u5206\u652f\u6e38\u79bb\u5934\uff08detached head\uff09","text":"\u4fee\u590d\u6240\u6709\u5b50\u4ed3\u5e93\u9ed8\u8ba4master \u5206\u652f\u6e38\u79bb\u5934 cd youqu\ngit submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/","title":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212 \u5206\u7c7b\uff1a/ \u67b6\u6784\u5e08\uff1a/ \u76ee\u6807\uff1a \u5e94\u7528 AT \u67b6\u6784\u5de5\u7a0b\u5316\uff0c\u53c2\u8003\u6027\u80fd\u81ea\u52a8\u5316\u5de5\u7a0b\u5b8c\u6210\u5de5\u7a0b\u5316\u6539\u9020\u3002 \u5e94\u7528\u95f4\u7528\u4f8b\u89e3\u8026\uff0c\u89e3\u9664\u6240\u6709\u4ea4\u53c9\u8c03\u7528\u7684\u65b9\u6cd5\uff0c\u5404\u5e94\u7528\u80fd\u8ddf\u968f\u81ea\u8eab\u8fed\u4ee3\u5468\u671f\u72ec\u7acb\u7ef4\u62a4 AT \u7528\u4f8b\u3002 \u5b8c\u6210\u516c\u5171\u65b9\u6cd5\u7684\u62bd\u53d6\u6574\u5408\uff0c\u5f62\u6210\u4e00\u5957\u72ec\u7acb\u4e8e\u5e94\u7528\u95f4\u7684\u516c\u5171\u65b9\u6cd5\u5e93\uff0c\u5404\u5e94\u7528\u65b9\u6cd5\u91cc\u9762\u4e0d\u5b58\u5728\u88ab\u591a\u4e2a\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\u3002 \u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u4e3a\u5c06\u6765\u9002\u914d\u66f4\u591a\u7684 AT \u8fd0\u7528\u573a\u666f\u63d0\u4f9b\u652f\u6491\uff0c\u539f\u5219\u4e0a\u53ef\u5b9e\u73b0\u65e0\u9650\u6269\u5c55\uff0c\u5728\u6bcf\u65e5\u6784\u5efa\u548c\u6301\u7eed\u96c6\u6210\u6d41\u7a0b\u843d\u5730\u4f7f\u7528\u3002 \u4ee3\u7801\u89c4\u8303\u95ee\u9898\u6e05\u96f6\uff0c\u7b26\u5408 Shell Check\u3001Pylint\u3001\u7cfb\u7edf\u90e8\u76f8\u5173\u7f16\u7801\u89c4\u8303\u8981\u6c42\u3002 \u610f\u4e49\uff1a \u7edf\u4e00\u6210\u7814 AT \u67b6\u6784\u8bbe\u8ba1\u601d\u8def\uff0c\u6d88\u9664 AT \u4ee3\u7801\u5b9e\u73b0\u548c\u7ef4\u62a4\u4e0a\u53ef\u80fd\u51fa\u73b0\u7684\u5206\u6b67\uff0c\u6539\u5584\u5386\u53f2 AT \u65e0\u5de5\u7a0b\u5316\u8bbe\u8ba1\u7684\u7f3a\u9677\uff0c\u63d0\u9ad8\u67b6\u6784\u4e13\u4e1a\u6027\u3002 \u5404\u5e94\u7528 AT \u4ee3\u7801\u76f8\u4e92\u72ec\u7acb\uff0c\u5951\u5408\u5e94\u7528\u72ec\u7acb\u53d1\u5e03\u7279\u6027\uff0c\u53ef\u652f\u6301\u8fed\u4ee3\u671f\u95f4\u72ec\u7acb\u65b0\u589e\u3001\u7ef4\u62a4\u548c\u6267\u884c\u3002 \u65b9\u6cd5\u8c03\u7528\u903b\u8f91\u5f97\u5230\u7b80\u5316\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u66f4\u9ad8\u6548\uff1b\u516c\u5171\u5e93\u62bd\u53d6\uff0c\u51cf\u5c11\u65b9\u6cd5\u91cd\u590d\u7f16\u5199\uff0c\u63d0\u9ad8\u4ee3\u7801\u5229\u7528\u7387\uff1b\u5e73\u5747\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u4ece40\u5206\u949f\u964d\u4f4e\u81f330\u5206\u949f\uff0c\u65e5\u4ea7\u51fa\u7528\u4f8b\u4ece12\u6761/\u5929\u63d0\u5347\u81f316\u6761/\u5929\u3002 \u53ef\u7075\u6d3b\u652f\u6491\u4e0d\u540c\u7684\u81ea\u52a8\u5316\u8fd0\u7528\u573a\u666f\uff0c\u5982 CI\u3001\u5192\u70df\u6d4b\u8bd5\u3001\u96c6\u6210\u6d4b\u8bd5\u3001\u56de\u5f52\u6d4b\u8bd5\u3001\u4e13\u9879\u6d4b\u8bd5\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_2","title":"\u4e00\u3001\u80cc\u666f\u4ecb\u7ecd","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1","title":"1\u3001\u73b0\u6709\u67b6\u6784\u4ecb\u7ecd","text":"\u73b0\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u6574\u4f53\u5206\u4e3a\u4e09\u5c42\uff1a\u7528\u4f8b\u5c42\uff08\u4e1a\u52a1\u903b\u8f91\u5c42\uff09\u3001\u4e2d\u95f4\u5c42\uff08\u5143\u7d20\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff09\u3001\u6838\u5fc3\u5c42\uff08\u5e95\u5c42\u529f\u80fd\u5e93\u5c42\uff09\u3002 \u7528\u4f8b\u5c42\uff1a\u5373\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4e13\u6ce8\u4e8e\u4e1a\u52a1\u529f\u80fd\u903b\u8f91\uff0c\u4e0d\u5173\u5fc3\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\uff1b \u4e2d\u95f4\u5c42\uff1a\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff0c\u6bcf\u4e2a\u65b9\u6cd5\u5747\u5bf9\u5e94\u4e00\u4e2a\u5143\u7d20\u7684\u4e00\u4e2a\u5177\u4f53\u64cd\u4f5c\uff0c\u4e5f\u53ef\u4ee5\u662f\u591a\u4e2a\u64cd\u4f5c\u7684\u7ec4\u5408\u64cd\u4f5c\uff0c\u4e2d\u95f4\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u7528\u4f8b\u5c42\uff0c\u5177\u6709\u53ef\u6269\u5c55\u6027\u548c\u590d\u7528\u6027\uff1b \u6838\u5fc3\u5c42\uff1a\u4e3b\u8981\u5c01\u88c5\u7684\u5e95\u5c42\u529f\u80fd\u5b9e\u73b0\uff0c\u6b64\u5c42\u5728\u6846\u67b6\u4e2d\u63d0\u4f9b\u4e00\u4e9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u529f\u80fd\u6a21\u5757\u76f8\u5bf9\u72ec\u7acb\uff0c\u6838\u5fc3\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u64cd\u4f5c\u5c42\uff0c\u6bd4\u5982\uff1a\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7 UI \u5750\u6807\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u952e\u9f20\u64cd\u4f5c\u7684\u57fa\u7840\u65b9\u64cd\u4f5c\u6a21\u5757\u3001Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757\u3001\u6587\u4ef6\u7684\u589e\u5220\u6539\u67e5\u64cd\u4f5c\u6a21\u5757\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2","title":"2\u3001\u81ea\u52a8\u5316\u7684\u5e94\u7528","text":"2.1\u3001CI \u6d41\u7a0b \u6bcf\u65e5\u6784\u5efa\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u7814\u53d1\u6bcf\u65e5\u63d0\u4ea4\u7684\u4ee3\u7801\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u73ed\u4e4b\u540e\u4f1a\u5c06\u5404\u5e94\u7528\u8fdb\u884c\u6253\u5305\uff0c\u7136\u540e\u5728\u6d4b\u8bd5\u673a\u4e0a\u5b89\u88c5\u66f4\u65b0 deb \u5305\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u5e94\u7528\u63d0\u4ea4\u96c6\u6210\u7684\u7248\u672c\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u8f7d\u6700\u65b0\u7684 ISO \u8fdb\u884c PXE \u90e8\u7f72\uff0c\u7136\u540e\u6d4b\u8bd5\u673a\u5b89\u88c5\u6700\u65b0\u7684\u955c\u50cf\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 2.2\u3001\u9a8c\u6536\u6d4b\u8bd5 \u5728\u5404\u9a8c\u6536\u8282\u70b9\u8fdb\u884c\u81ea\u52a8\u5316\u9a8c\u6536\uff0c\u76ee\u524d\u7684\u7b56\u7565\u662f\u5168\u7528\u4f8b\u8986\u76d6\u5168\u67b6\u6784\u3002 2.3\u3001\u56de\u5f52\u6d4b\u8bd5 \u56de\u5f52\u6d4b\u8bd5\u4eca\u5e74\u89c4\u5212\u5efa\u8bbe\u4e2d\uff0c\u65e8\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u6267\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\uff0c\u51cf\u5c11\u529f\u80fd\u6d4b\u8bd5\u7684\u91cd\u590d\u52b3\u52a8\u529b\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3","title":"3\u3001\u5b58\u5728\u7684\u95ee\u9898","text":" \u5404\u5e94\u7528\u4e4b\u95f4\u5b58\u5728\u8026\u5408 \u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u521d\u671f\uff0c\u6240\u6709\u5e94\u7528\u662f\u6574\u4f53\u53d1\u5e03\uff0c\u6211\u4eec\u662f\u5c06\u6240\u6709\u5e94\u7528\u770b\u6210\u662f\u4e00\u4e2a\u6574\u4f53\uff0c\u5404\u5e94\u7528\u4f5c\u4e3a\u5176\u4e2d\u7684\u4e00\u4e2a\u6a21\u5757\uff0c\u6240\u4ee5\u5b58\u5728\u5e94\u7528\u95f4\u65b9\u6cd5\u4ea4\u53c9\u8c03\u7528\u7684\u95ee\u9898\uff0c\u8fd9\u6837\u4ece\u6700\u521d\u7684\u8bbe\u8ba1\u6765\u8bb2\u786e\u5b9e\u80fd\u591f\u51cf\u5c11\u91cd\u590d\u4ee3\u7801\u7684\u7f16\u5199\u3002\u4f46\u662f\u73b0\u5728\u5e94\u7528\u8d70\u72ec\u7acb\u53d1\u5e03\uff0c\u5404\u5e94\u7528\u90fd\u6709\u81ea\u5df1\u7684\u8fed\u4ee3\u8282\u594f\uff0c\u5728\u65b0\u9700\u6c42\u5feb\u901f\u53d8\u5316\u7684\u8fc7\u7a0b\u4e2d\uff0c\u81ea\u52a8\u5316\u7ef4\u62a4\u53d8\u5f97\u5f02\u5e38\u56f0\u96be\uff0c\u539f\u56e0\u5c31\u662f\u81ea\u52a8\u5316\u9879\u76ee\u91cc\u9762\u5404\u4e2a\u5e94\u7528\u7684\u6709\u6bd4\u8f83\u591a\u7684\u8026\u5408\u5173\u7cfb\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u8fdb\u884c\u89e3\u8026\uff0c\u4ee5\u9002\u5e94\u5e94\u7528\u4e0d\u540c\u7684\u8fed\u4ee3\u5468\u671f\u3002 \u65e0\u6cd5\u7cbe\u51c6\u7684\u5212\u5206\u7528\u4f8b\u8303\u56f4 \u7528\u4f8b\u6267\u884c\u7684\u8303\u56f4\u4e0d\u591f\u7cbe\u51c6\uff0c\u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u4e3b\u8981\u901a\u8fc7\u7528\u4f8b\u7684\u5173\u952e\u8bcd core\uff08\u6838\u5fc3\uff09\u6765\u533a\u5206\u7528\u4f8b\u662f\u5426\u4e3a\u6838\u5fc3\u7528\u4f8b\uff0c\u4f46\u662f\u8fd9\u6837\u7684\u533a\u5206\u592a\u5bbd\u6cdb\u4e86\uff0c\u4e0d\u80fd\u9002\u5e94\u81ea\u52a8\u5316\u6d4b\u8bd5\u5728\u591a\u573a\u666f\u4e0b\u7684\u5e94\u7528\u3002\u5f88\u591a\u573a\u666f\u4e0b\u6211\u4eec\u8fd8\u9700\u8981\u6839\u636e\u7528\u4f8b\u7684\u7b49\u7ea7\u3001\u7528\u4f8b\u7684\u7c7b\u578b\u3001\u7528\u4f8b\u6765\u6e90\u7b49\u7b49\uff0c\u4e0d\u540c\u7684\u7ef4\u5ea6\u6765\u6311\u9009\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u5173\u952e\u5b57\u9700\u8981\u4eba\u5de5\u4e00\u6761\u6761\u7684\u6539\uff0c\u8d39\u65f6\u8d39\u529b\uff0c\u800c\u4e14\u4e0d\u597d\u7ef4\u62a4\u3002 \u53d7\u65b0\u9700\u6c42\u5f71\u54cd\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u597d\u7ef4\u62a4 \u76ee\u524d\u9700\u8981\u8df3\u8fc7\u7684\u7528\u4f8b\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684\u7528\u4f8b\u811a\u672c\u91cc\u9762\uff0c\u6dfb\u52a0\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\uff0c\u540e\u7eed\u89e3\u9664\u8df3\u8fc7\u7684\u65f6\u5019\u53c8\u9700\u8981\u627e\u5230\u8fd9\u6761\u811a\u672c\uff0c\u5220\u6389\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\u3002\u5728\u8df3\u8fc7\u7528\u4f8b\u8f83\u591a\u7684\u60c5\u51b5\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u96be\u5ea6\u3002 \u7f16\u5199\u7528\u4f8b\u65f6\u903b\u8f91\u6bd4\u8f83\u590d\u6742\uff0c\u9700\u8981\u8c03\u7528\u591a\u4e2a\u5e94\u7528\u7684\u65b9\u6cd5\u6a21\u5757\u3002 \u6846\u67b6\u6269\u5c55\u6027\u4e0d\u8db3\uff0c\u65e0\u6cd5\u6574\u5408\u6027\u80fd\u81ea\u52a8\u5316\u3001\u538b\u6d4b\u81ea\u52a8\u5316\u3001\u5b89\u5168\u81ea\u52a8\u5316\u7b49\u4e13\u9879\u6d4b\u8bd5\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_3","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u4e3a\u89e3\u51b3\u73b0\u6709\u95ee\u9898\uff0c\u9002\u5e94\u4e0d\u65ad\u4e30\u5bcc\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u66f4\u597d\u7684\u53d1\u6325\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4f5c\u7528\uff0c\u9700\u8981\u5bf9\u81ea\u52a8\u5316\u67b6\u6784\u53ca\u5404\u529f\u80fd\u6a21\u5757\u8fdb\u884c\u91cd\u65b0\u8bbe\u8ba1\u89c4\u5212\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_1","title":"1\u3001\u67b6\u6784\u8bbe\u8ba1","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_1","title":"2\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u6846\u67b6\u7684\u8fd0\u884c\u903b\u8f91\uff1a\u901a\u8fc7\u6838\u5fc3\u5c42\u63d0\u4f9b\u4e00\u4e2a\u57fa\u7840\u80fd\u529b\uff0c\u4e1a\u52a1\u5c42\u6839\u636e\u5b9e\u9645\u4e1a\u52a1\u9700\u6c42\uff08\u6d4b\u8bd5\u7528\u4f8b\uff09\u52a8\u6001\u52a0\u8f7d\u6838\u5fc3\u5c42\uff0c\u6267\u884c\u5165\u53e3\u52a0\u8f7d\u76f8\u5e94\u7684\u7528\u4f8b\u96c6\u5e76\u63a7\u5236\u6267\u884c\uff0c\u5e94\u7528\u5c42\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u9700\u6c42\uff0c\u901a\u8fc7\u76f8\u5e94\u7684\u914d\u7f6e\u9879\u8fdb\u884c\u914d\u7f6e\uff0c\u4ece\u800c\u89e6\u53d1\u81ea\u52a8\u5316\u6d4b\u8bd5\u4efb\u52a1\u3002 \u6838\u5fc3\u5c42\uff1a\u57fa\u672c\u4fdd\u6301\u4e0d\u53d8\uff0c\u90e8\u5206\u6a21\u5757\u4f1a\u6d89\u53ca\u5230\u65b0\u529f\u80fd\u5f00\u53d1\uff0c\u6838\u5fc3\u5c42\u5404\u529f\u80fd\u6a21\u5757\u4fdd\u6301\u72ec\u7acb\u6027\uff0c\u63d0\u4f9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u4f9b\u4e0a\u5c42\u8c03\u7528\uff1b \u5e95\u5c42\u6838\u5fc3\u6a21\u5757\u5305\u62ec\uff1a \u56fe\u50cf\u8bc6\u522b\u6a21\u5757 UI \u5b9a\u4f4d\u6a21\u5757 Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757 \u5c5e\u6027\u5b9a\u4f4d\u6a21\u5757 \u65e5\u5fd7\u6a21\u5757 \u952e\u9f20\u64cd\u4f5c\u6a21\u5757 \u6587\u4ef6\u64cd\u4f5c\u6a21\u5757 \u5f55\u5c4f\u6a21\u5757 \u81ea\u5b9a\u4e49\u65ad\u8a00\u6a21\u5757 \u7528\u4f8b\u6267\u884c\u6a21\u5757 PXE \u88c5\u673a\u6a21\u5757 \u952e\u9f20\u4fe1\u53f7\u6a21\u62df\u6a21\u5757 OCR \u6a21\u5757 \u4e1a\u52a1\u5c42\uff1a\u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e94\u7528\u5185\u5305\u542b\u591a\u4e2a\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5982\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7b49\uff0c\u540e\u7eed\u53ef\u4ee5\u6839\u636e\u9700\u8981\u5ac1\u63a5\u8fdb\u6765\u3002\u5176\u4e2d\u529f\u80fd\u6d4b\u8bd5\u8bbe\u8ba1\u601d\u8def\uff1a \u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e76\u5c06\u6d4b\u8bd5\u6570\u636e\u548c\u6d4b\u8bd5\u8d44\u6e90\u6574\u5408\u8fdb\u6765\uff0c\u589e\u52a0\u7528\u4f8b\u6807\u7b7e csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ed9\u6bcf\u6761\u7528\u4f8b\u6253\u6807\u7b7e\u3002 \u5404\u6807\u7b7e\u6240\u4f7f\u7528\u5bf9\u5e94\u7684\u5b57\u6bb5\u540d\u79f0\uff0c\u4f7f\u7528 csv \u6587\u4ef6\u7ef4\u62a4\u7528\u4f8b\u4e0e\u6807\u7b7e\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u5bf9\u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u53ef\u4ee5\u7ec4\u5408\u5176\u4e2d\u7684\u6807\u7b7e\u800c\u4ece\u9a71\u52a8\u5bf9\u5e94\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\uff0c\u517c\u5bb9\u73b0\u6709\u7528\u4f8b\u6807\u7b7e\uff0c\u4e14\u652f\u6301\u7528\u4f8b\u6807\u7b7e\u53ef\u6269\u5c55\uff1b \u4f7f\u7528 csv \u683c\u5f0f\u6587\u4ef6\u53ef\u4ee5\u65b9\u4fbf\u7684\u4f7f\u7528 Excel \u8868\u683c\u6253\u5f00\u8fdb\u884c\u7f16\u8f91\uff0c\u540c\u65f6\u7531\u4e8e csv \u6587\u4ef6\u5b9e\u9645\u662f\u4ee5\u90fd\u597d\u5206\u9694\u7684\u6587\u672c\u6587\u4ef6\uff0c\u4ee3\u7801\u4e2d\u53ef\u4ee5\u5728\u4e0d\u4f9d\u8d56\u4e09\u65b9\u5e93\u7684\u60c5\u51b5\u4e0b\u65b9\u4fbf\u5feb\u901f\u7684\u89e3\u6790\u5b83\uff0c\u53ef\u64cd\u4f5c\u6027\u548c\u53ef\u7ef4\u62a4\u6027\u8f83\u9ad8\u3002 \u5404\u4e2a\u5e94\u7528\u4e4b\u95f4\uff0c\u7528\u4f8b\u3001\u65b9\u6cd5\u3001\u6807\u7b7e\u548c\u8d44\u6e90\u90fd\u662f\u76f8\u4e92\u72ec\u7acb\u7684\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u7528\u4f8b\u65f6\u53ea\u9700\u8981\u81ea\u5df1\u5e94\u7528\u4e0b\u7684\u65b9\u6cd5\u548c\u516c\u5171\u5e93\u5373\u53ef\u3002 \u7ed3\u6784\u4e3e\u4f8b\uff1a .\n\u251c\u2500\u2500 apps\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_album # \u5e94\u7528\u540d (\u7528\u4e0b\u5212\u7ebf\u8fde\u63a5\u662f Python \u7f16\u7801\u89c4\u8303)\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_assert # \u65ad\u8a00\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_function_tag.csv # \u7528\u4f8b\u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 asan_cases # \u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases # \u529f\u80fd\u6d4b\u8bd5\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 res # \u6d4b\u8bd5\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config # \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_widget # \u5e94\u7528\u81ea\u5df1\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_widget # \u65b9\u6cd5\u57fa\u7c7b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 other_widget # \u8c03\u7528\u5176\u4ed6\u5e94\u7528\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_camera\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases\n\u2502\u00a0\u00a0 \u2502\u00a0 ...\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 public_widget # \u516c\u5171\u65b9\u6cd5\u5e93\n\u251c\u2500\u2500 config # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n...\n config \u914d\u7f6e\u6a21\u5757\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u76f8\u5e94\u914d\u7f6e\uff0c\u6d4b\u8bd5\u540c\u5b66\u53ef\u4ee5\u6839\u636e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5728 config \u91cc\u9762\u8fdb\u884c\u914d\u7f6e\u3002 \u5168\u5c40\u914d\u7f6e\uff1a \u6267\u884c\u4e00\u4e2a\u6216\u591a\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff1a\u5728 pattern \u91cc\u9762\u5199\u5165\u5e94\u7528\u5305\u540d\uff0c\u591a\u4e2a\u5e94\u7528\u4e4b\u95f4\u7528 or \u8fde\u63a5\uff0c\u5982 deepin-music or deepin-movie\uff1b \u5192\u70df\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a smoke\uff1b \u96c6\u6210\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a core \uff1b \u5168\u91cf\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u4e3a\u7a7a\u5373\u53ef\uff1b \u901a\u8fc7 tags \u7684\u914d\u7f6e\u6bd4\u8f83\u7075\u6d3b\uff0c\u540e\u9762\u6807\u7b7e\u5316\u7ba1\u7406\u7ae0\u8282\u4f1a\u8bb2\u5230\uff0c\u652f\u6301\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u7075\u6d3b\u914d\u7f6e\u3002 \u6307\u5b9a\u67d0\u53f0\u673a\u5668\u5728\u6307\u5b9a\u955c\u50cf\u7248\u672c\u4e0a\u6267\u884c\u7528\u4f8b\uff1a\u5728 IP \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a IP\uff0c\u5e76\u5728 URL \u91cc\u9762\u586b\u5165\u955c\u50cf\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u6846\u67b6\u4f1a\u8c03\u7528 PXE \u8fdb\u884c\u81ea\u52a8\u88c5\u673a\uff0c\u88c5\u673a\u5b8c\u4e4b\u540e\u81ea\u52a8\u5f00\u59cb\u6267\u884c\u914d\u7f6e\u7684\u6d4b\u8bd5\u7528\u4f8b\u3002 \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\uff1a \u6bcf\u4e2a\u5e94\u7528\u5185\u90e8\u4f1a\u6709\u4e00\u4e2a\u5355\u72ec\u7684\u914d\u7f6e\u6a21\u5757\uff0c\u4f1a\u5305\u542b\u4e00\u4e9b\u672c\u5e94\u7528\u7684\u6d4b\u8bd5\u8d44\u6e90\u7684\u8def\u5f84\u3001\u6267\u884c\u7528\u4f8b\u7684\u6807\u7b7e\u914d\u7f6e\u7b49\u7b49\uff0c\u5982\u679c\u5728\u5c40\u90e8\u914d\u7f6e\u91cc\u9762\u914d\u7f6e\u4e86\u7528\u4f8b\u6267\u884c\u6807\u7b7e\uff0c\u800c\u5916\u5c42 runner \u51fa\u6ca1\u6709\u6307\u5b9a\u6267\u884c\u6807\u7b7e\uff0c\u5219\u5728\u6267\u884c\u65f6\u53ea\u4f1a\u6267\u884c\u5c40\u90e8\u914d\u7f6e\u5df2\u914d\u7f6e\u7684\uff0c\u82e5\u5916\u5c42 runner \u4e5f\u914d\u7f6e\u4e86\u6267\u884c\u6807\u7b7e\uff0c\u5219\u4f1a\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u7528\u4f8b\u3002 \u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u914d\u7f6e\u90fd\u5728\u540c\u4e00\u4e2a\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\uff0cpy \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684\u7c7b\uff0cini \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684 option\u3002 \u5168\u5c40\u914d\u7f6e\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u7b56\u7565\u5982\u4e0b\uff1a \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5c40\u90e8\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5e94\u7528\u5c42\uff1arunner \u662f\u6d4b\u8bd5\u6267\u884c\u7684\u5165\u53e3\uff0c\u5b83\u4f1a\u6839\u636e\u914d\u7f6e\u91cc\u9762\u7684\u914d\u7f6e\u9879\uff0c\u8fdb\u884c\u7528\u4f8b\u7684\u52a0\u8f7d\u548c\u6267\u884c\u3002\u5b83\u63d0\u4f9b\u63a5\u53e3\u7ed9\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\uff0c\u5e73\u53f0\u4e0a\u7684\u6307\u4ee4\u5b9e\u9645\u4e0a\u90fd\u662f\u901a\u8fc7\u4e0b\u53d1\u7ed9 runner\uff0c\u7136\u540e\u7531 runner \u6765\u6267\u884c\u76f8\u5e94\u7684\u6d4b\u8bd5\u3002 \u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u662f\u4e00\u4e2a\u524d\u7aef\u7cfb\u7edf\uff0c\u53ef\u4ee5\u8fdb\u884c\u6d4b\u8bd5\u673a\u7ba1\u7406\u3001\u81ea\u52a8\u5b89\u88c5\u955c\u50cf\u3001\u81ea\u52a8\u5b89\u88c5\u6307\u5b9a\u5e94\u7528\u7248\u672c\u3001\u8fdb\u884c\u6d4b\u8bd5\u7528\u4f8b\u8303\u56f4\u9009\u62e9\u3001\u7528\u4f8b\u89e6\u53d1\u6267\u884c\u63a7\u5236\u3001\u7ed3\u679c\u5c55\u793a\u8f93\u51fa\u7b49\u3002 \u4e00\u4e2a\u5e94\u7528\u7684\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\u90fd\u53ef\u4ee5\u5355\u72ec\u89e6\u53d1\u3002 \u517c\u5bb9\u6027\u6d4b\u8bd5\u4e3b\u8981\u901a\u8fc7 PXE \u670d\u52a1\u5668\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u88c5\u673a\uff0c\u7136\u540e\u914d\u5408 AT \u8fdb\u884c\u6d4b\u8bd5\uff0c\u53ef\u4ee5\u5b9e\u73b0\u4e0d\u540c\u7cfb\u7edf\u7248\u672c\u3001\u4e0d\u540c\u5e94\u7528\u7248\u672c\u73af\u5883\u4e0a\u90fd\u53ef\u4ee5\u8fdb\u884c\u81ea\u52a8\u5316\u7684 AT \u6267\u884c\uff0c\u63d0\u9ad8\u517c\u5bb9\u6027\u6d4b\u8bd5\u6548\u7387\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_4","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_2","title":"1\u3001\u7528\u4f8b\u89e3\u8026","text":"\u5b58\u5728\u8026\u5408\u5173\u7cfb\u7684\u65b9\u6cd5\uff1a\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u88ab\u5916\u90e8\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\uff0c\u5219\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u8026\u5408\u5173\u7cfb\u3002 1.1\u3001\u901a\u8fc7\u7f16\u8f91\u5668 Find Usages \u67e5\u770b\u6bcf\u4e2a\u65b9\u6cd5\u88ab\u8c03\u7528\u7684\u8def\u5f84\u548c\u88ab\u8c03\u7528\u6b21\u6570\uff1b 1.2\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 1 \u4e2a\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728\u5916\u90e8\u5e94\u7528\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1b 1.3\u3001\u64cd\u4f5c\u5c42\u6587\u4ef6\u540d\u5747\u4ee5 widget \u7ed3\u5c3e\uff0c\u7c7b\u540d\u4ee5 Widget \u7ed3\u5c3e\uff0c\u5982\uff1a\u6587\u4ef6\u540d music_widget.py \uff1a class MusicWidget:\n\"\"\"\u97f3\u4e50\u7684\u64cd\u4f5c\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_2","title":"2\u3001\u516c\u5171\u5e93\u5efa\u8bbe","text":"2.1\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 2 \u4e2a\u53ca\u4ee5\u4e0a\u7684\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728 public_widget \u76ee\u5f55\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1bpublic_widget \u5373\u4e3a\u516c\u5171\u65b9\u6cd5\u5e93\uff1b 2.2\u3001\u5728\u7528\u4f8b\u5c42\u4fee\u6539\u7528\u4f8b\u4e2d\u7c7b\u7684\u5bfc\u5165\u8def\u5f84\uff0c\u5c5e\u4e8e\u516c\u5171\u65b9\u6cd5\u7684\u5219\u8c03\u7528 public_widget \u4e2d\u7684\u7c7b\uff0c\u5916\u90e8\u5e94\u7528\u7684\u64cd\u4f5c\u65b9\u6cd5\uff0c\u5219\u8c03\u7528\u672c\u5e94\u7528\u76ee\u5f55\u4e0b\u91cd\u5199\u7684\u5916\u90e8\u5e94\u7528\u65b9\u6cd5\u3002 \u6bd4\u5982\uff1a\u51e0\u4e4e\u6240\u6709\u591a\u5a92\u4f53\u5e94\u7528\u90fd\u9700\u8981\u901a\u8fc7\u6587\u7ba1\u52a0\u8f7d\u8d44\u6e90\uff0c\u8c03\u8d77\u7684\u6587\u7ba1\u5bf9\u8bdd\u6846\u5b9e\u9645\u4e3a dde-desktop\uff0c\u56e0\u6b64\u5c06 desktop_widget.py \u653e\u5230 public_widget \u91cc\u9762\uff1a class DdeDesktopPublicWidget:\n\"\"\"\u516c\u5171-\u684c\u9762\u7684\u64cd\u4f5c\u65b9\u6cd5\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3_1","title":"3\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406","text":"3.1\u3001\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1a\u5bf9\u5e94 core\u3001smoke\uff0c\u6216\u4e3a\u7a7a\uff1b \u7528\u4f8b\u6765\u6e90\uff1a\u5bf9\u5e94 PMS \u7528\u4f8b\u6765\u6e90\uff0c\u5206\u522b\u7528 acp1\u3001acp2\u3001acp3\u3001acp4 \u8868\u793a\u3002 acp1 \uff1a\u4e1a\u52a1\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5199\u7684\u7528\u4f8b\uff0c\u88ab\u7528\u4e8e\u9a8c\u6536\u6d4b\u8bd5\u7684\uff1b acp2 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5f15\u5165\u7684\u4ea7\u54c1\u9a8c\u6536\u6d4b\u8bc4\u90e8\u7684\u7528\u4f8b\uff1b acp3 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u6839\u636e\u4ea7\u54c1\u9700\u6c42\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\uff1b acp4 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u901a\u8fc7\u793e\u533a\u3001\u8bba\u575b\u7528\u6237\u53cd\u9988\u95ee\u9898\u603b\u7ed3\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\u3002 \u4e3e\u4f8b\uff1a \u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u7528\u4f8b\u6765\u6e90 001 L1 core acp1 \u6807\u7b7e\u91c7\u7528\u679a\u4e3e\u7684\u65b9\u5f0f\u8fdb\u884c\u4ee3\u53f7\u7ba1\u7406\u65b9\u4fbf\u7ba1\u7406\u4ee5\u53ca\u540e\u7eed\u6269\u5c55\u3002 3.2\u3001\u5728\u6bcf\u4e2a\u5e94\u7528\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u7b2c\u4e00\u5217\u4e3a\u7528\u4f8b\u7684 ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ba1\u7406\u6a21\u5757\u5185\u7684\u7528\u4f8b\u6807\u7b7e\u3002\u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 3.3\u3001\u5bf9\u7167 PMS \u4e0a\u7528\u4f8b\u7b49\u7ea7\u3001\u7528\u4f8b\u7c7b\u578b\u548c\u7528\u4f8b\u6765\u6e90\uff0c\u6807\u8bb0\u6240\u6709\u5df2\u5b9e\u73b0\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u540e\u7eed\u7f16\u5199\u65b0\u589e\u81ea\u52a8\u5316\u7528\u4f8b\u65f6\uff0c\u6bcf\u5199\u4e00\u6761\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684 csv \u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u6b64\u6761\u7528\u4f8b\u7684\u6807\u7b7e\u3002 3.4\u3001\u8df3\u8fc7\u7528\u4f8b\u6807\u7b7e\u5316 \u73b0\u6709\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a\uff1a \u4e3e\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u8bb0\u4e3a \u201cskip-\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u8bb0\uff0c\u5982\u679c\u5df2\u7ecf\u6807\u8bb0\u4e86\u8df3\u8fc7\u539f\u56e0\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u8bb0\u4e3a SKIPED\uff0c\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\u3002 \u6240\u6709\u7684\u6807\u7b7e\u5728 docs \u76ee\u5f55\u4e0b\u4f1a\u6709\u4e00\u4e2a\u6587\u6863\uff0c\u6587\u6863\u6682\u5b9a\u540d\u79f0\u4e3a\uff1atags_info.md\uff0c\u7528\u4e8e\u8bf4\u660e\u73b0\u5728\u5df2\u7ecf\u4f7f\u7528\u5230\u7684\u6807\u7b7e\uff0c\u4ee5\u53ca\u8fd9\u4e9b\u6807\u7b7e\u7684\u89e3\u91ca\u548c\u7528\u6cd5\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#4","title":"4\u3001\u7528\u4f8b\u6267\u884c","text":"4.1\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u7684\u9a71\u52a8\u6267\u884c\u903b\u8f91\u529f\u80fd\u5b9e\u73b0 \u5f00\u53d1\u6839\u636e\u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\u91cc\u9762\u7684\u7528\u4f8b\u6807\u7b7e\u6267\u884c\u5bf9\u5e94\u7528\u4f8b\u7684\u529f\u80fd\uff0c\u80fd\u652f\u6301\u591a\u4e2a\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u6267\u884c\u5165\u53e3\u80fd\u968f\u610f\u901a\u8fc7\u7528\u4f8b\u6807\u7b7e\u6307\u5b9a\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002 \u7528\u4f8b\u6807\u7b7e\u7684\u9a71\u52a8\u65b9\u5f0f\u5fc5\u987b\u80fd\u652f\u6301\u6807\u7b7e\u7684\u6269\u5c55\uff0c\u672a\u6765\u968f\u7740\u4e1a\u52a1\u7684\u53d8\u5316\u53ef\u80fd\u9700\u8981\u589e\u52a0\u5404\u79cd\u5404\u6837\u7684\u6807\u7b7e\u3002 4.2\u3001\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u6267\u884c \u529f\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u3001\u6027\u80fd\u6d4b\u8bd5\u7b49\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u662f\u5206\u5f00\u6267\u884c\u7684\uff0c\u4e5f\u5c31\u662f\u5728\u4e00\u6b21\u6267\u884c\u4e2d\uff0c\u53ea\u80fd\u6267\u884c\u5176\u4e2d\u4e00\u79cd\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5177\u4f53\u8981\u6267\u884c\u54ea\u4e00\u79cd\u540c\u6837\u901a\u8fc7\u53c2\u6570\u6765\u63a7\u5236\u3002 4.3\u3001\u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c \u7531\u4e8e\u6d4b\u8bd5\u673a\u8d44\u6e90\u6709\u9650\uff0c\u968f\u7740\u81ea\u52a8\u5316\u7528\u4f8b\u6570\u91cf\u7684\u589e\u52a0\uff0cCI \u6267\u884c\u65f6\u95f4\u4f1a\u8d8a\u6765\u8d8a\u957f\u3002 \u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c\u7684\u529f\u80fd\uff1a \u540c\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\u5206\u6563\u5230\u4e0d\u540c\u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u4e0a\u6267\u884c\uff0c\u7f29\u77ed\u6267\u884c\u603b\u65f6\u95f4\uff1b \u7b2c\u4e8c\u5929\u8dd1\u7684\u65f6\u5019\u540c\u4e00\u4e2a\u673a\u5668\u4e0a\u4f1a\u6267\u884c\u6628\u5929\u6ca1\u6709\u6267\u884c\u5230\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u6267\u884c\u540c\u7406\uff1b \u53ef\u4ee5\u5b9e\u73b0\u5728\u5168\u67b6\u6784\u6d4b\u8bd5\u673a\u4e0a\u8f6e\u6d41\u6267\u884c\u7528\u4f8b\uff0c\u65e2\u80fd\u4fdd\u8bc1\u6267\u884c\u4e86\u6240\u6709\u7684\u7528\u4f8b\uff0c\u53c8\u80fd\u5728\u8d44\u6e90\u6709\u9650\u7684\u60c5\u51b5\u4e0b\u8986\u76d6\u4e86\u6240\u6709\u7684\u67b6\u6784\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#5","title":"5\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0","text":"5.1\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u4f5c\u4e3a\u524d\u7aef\u754c\u9762\u7cfb\u7edf\uff0c\u901a\u8fc7\u9875\u9762\u4e0a\u7684\u4e00\u4e9b\u529f\u80fd\u9009\u9879\u8fdb\u884c\u5bf9\u5e94\u6d4b\u8bd5\u4efb\u52a1\u7684\u7ba1\u7406\u6216\u89e6\u53d1\uff0c\u4e1a\u5185\u6bd4\u8f83\u6d41\u884c\u7684\u5b9e\u73b0\u65b9\u6848\u662f\u4f7f\u7528 Vue + DRF \u5b9e\u73b0\u4e00\u4e2a\u524d\u540e\u7aef\u5206\u79bb\u7684\u7cfb\u7edf\u3002 \u6d4b\u8bd5\u5e73\u53f0\u53ef\u80fd\u4f1a\u6d89\u53ca\u5230\u7684\u6a21\u5757\u6709\uff1a\u6d4b\u8bd5\u673a\u8d44\u6e90\u7ba1\u7406\u6a21\u5757\u3001\u7528\u4f8b\u6267\u884c\u63a7\u5236\u6a21\u5757\u3001\u7ed3\u679c\u5c55\u793a\u6a21\u5757\u3001PXE \u955c\u50cf\u5b89\u88c5\u6a21\u5757\u7b49\u3002 \u7528\u6237\uff08\u6d4b\u8bd5\u3001\u7814\u53d1\u540c\u5b66\u7b49\uff09\u53ef\u4ee5\u914d\u7f6e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5982\u6267\u884c\u54ea\u4e2a\u5e94\u7528\u3001\u6267\u884c\u7528\u4f8b\u7684\u8303\u56f4\u3001\u5728\u54ea\u53f0\u673a\u5668\u4e0a\u6267\u884c\u3001\u955c\u50cf\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u5e94\u7528\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u6267\u884c\u65f6\u95f4\u3002 5.2\u3001\u6267\u884c\u5165\u53e3 runner \u63d0\u4f9b\u7ed9\u6d4b\u8bd5\u5e73\u53f0\u7684\u63a5\u53e3\u5305\u62ec\uff1a\u7528\u4f8b\u6267\u884c\u63a5\u53e3\u3001\u7ed3\u679c\u8fd4\u56de\u63a5\u53e3\u3001\u955c\u50cf\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u955c\u50cf\u5b89\u88c5\u63a5\u53e3\u3001\u5e94\u7528\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u5e94\u7528\u5b89\u88c5\u66f4\u65b0\u63a5\u53e3\u7b49\u3002 \u524d\u7aef\u5e73\u53f0\u76ee\u524d\u8fd8\u6ca1\u6709\u592a\u591a\u8be6\u7ec6\u7684\u65b9\u6848\uff0c\u672c\u6b21\u8bbe\u8ba1\u4e3b\u8981\u96c6\u4e2d\u5728\u540e\u7aef\u8fd9\u90e8\u5206\u67b6\u6784\u7684\u8bbe\u8ba1\u4e0a\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_5","title":"\u56db\u3001\u5b9e\u65bd\u8ba1\u5212","text":"\u8fd1\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u6587\u7ba1\u4ee3\u7801\u89e3\u8026 2022/3/28 2022/4/8 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u56fe\u5f62\u56fe\u50cf\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u97f3\u89c6\u9891\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5168\u5c40\u641c\u7d22\u4ee3\u7801\u89e3\u8026 2022/4/25 2022/4/26 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u516c\u5171\u5e93\u5efa\u8bbe 2022/4/27 2022/5/5 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5c01\u88c5\u7684\u65b9\u6cd5\u6574\u7406\u6210\u4e00\u4e2a\u8868 2022/5/6 2022/5/10 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7528\u4f8b\u6807\u7b7e\u5206\u7c7b\u8bc4\u4f30 2022/5/11 2022/5/11 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u6807\u7b7e\u5316\u6267\u884c\u9a71\u52a8\u7a0b\u5e8f\u7f16\u5199 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u9700\u5b9e\u73b0\u81ea\u52a8\u89e3\u6790 csv \u8868\u683c\u4e2d\u7684\u7528\u4f8b\u7f16\u53f7 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u722c\u866b\u811a\u672c\uff0c\u722c\u53d6 pms \u4e0a\u7528\u4f8b\u7684\u6807\u7b7e 2022/5/11 2022/5/13 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u5b9a\u65f6\u81ea\u52a8\u7ef4\u62a4\u672c\u5730 csv \u6587\u4ef6\u811a\u672c 2022/5/11 2022/5/20 \u4e2d\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u76ee\u5f55\u7ed3\u6784\u8c03\u6574 2022/5/20 2022/6/2 \u5b8c\u6210\u5168\u5c40\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u5177\u4f53\u65b9\u6848\u548c\u903b\u8f91\u5b9e\u73b0 2022/6/6 2022/6/17 \u9759\u6001\u626b\u63cf\u95ee\u9898\u6e05\u96f6 2022/6/20 2022/7/1 \u5b8c\u6210\u65b0\u6846\u67b6\u4f7f\u7528\u57f9\u8bad 2022/7/4 2022/7/11 \u843d\u5730\u8fd0\u884c 2022/7/12 2022/7/20 \u5e95\u5c42\u5e93\u7528\u9014\u8bf4\u660e\u6587\u6863\u7f16\u5199 2022/7/21 2022/7/28"}]} \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz index 8ffaebc1..e0b7bbfc 100644 Binary files a/sitemap.xml.gz and b/sitemap.xml.gz differ diff --git "a/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" "b/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" index 25f669d5..97100667 100644 --- "a/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" +++ "b/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs @@ -1215,8 +1215,7 @@ 智能化功能测试# Attribution :chengdu Test Team # Date :2021/08/20 -此方案仍在演进中 -此方案仍在演进中 +此方案仍在演进中 仓库地址:https://gitlabcd.uniontech.com/autotest/cd-desktop-aitest 一、方案概述¶ 基于深度学习智能识别应用的元素控件,用于在自动化测试操作过程中的元素定位以及判断结果时的断言处理;自动化测试过程中,测试机上的画面通过采集盒传输到服务器上,服务器对视频画面进行智能识别后,服务器智能判断用例是否执行成功,然后对测试机下发下一步操作指令,测试机接受并执行下一步操作。 diff --git "a/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" "b/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" index cdf9ccde..06c9e9a5 100644 --- "a/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" +++ "b/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" @@ -95,7 +95,7 @@ - + @@ -226,7 +226,7 @@ - + YouQu Docs diff --git "a/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" "b/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" index 121b4507..72123668 100644 --- "a/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" +++ "b/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs @@ -752,6 +752,13 @@ + + + + + 4、虚拟化部署 + + @@ -1661,6 +1668,13 @@ + + + + + 4、虚拟化部署 + + @@ -2604,18 +2618,12 @@ 1、标签说明流水线使用指导; 跳过原因:skip-XXX,用于控制用例是否执行; 确认修复:fixed-XXX,用于标记用例的修复状态(后面详细讲解用法); @@ -2629,26 +2637,30 @@ 1、标签说明PMS用例ID 用例级别 用例类型 +设备类型 +用例来源 上线对象 测试级别 跳过原因 确认修复 -废弃用例 -... +废弃用例 +... -001 +679537 679537 L1 FUNC +PPL + CICD C1 skip-XXX fixed-XXX -removed-已废弃 -... +removed-已废弃 +... @@ -2656,7 +2668,7 @@ 2、操作步骤csv 的文件名。 例如: -相册的用例文件为 test_album_xxx.py,xxx 表示任意三位数字代表用例序号,此时 csv 文件名就应为 album.csv; +相册的用例文件为 test_album_xxx.py,xxx 表示用例的ID(也可以是自定义的数字代表用例序号),此时 csv 文件名就应为 album.csv; 对于用例规模比较大的应用,比如文件管理器,建议分模块,每个模块建立一个 csv 文件,所有 csv 文件建议放在一个 tags 目录下。 是否分模块维护 csv 取决于应用的用例复杂度,同时我们应该充分考虑后期的可维护性,csv 文件太多了也是一个很糟糕的事情。 @@ -2677,7 +2689,7 @@ 3.1.1、固定跳过001 +679537 ... skip-受到某新需求影响 @@ -2742,7 +2754,7 @@ 3.2、确认修复001 +679537 ... skip-受到某新需求影响 fixed-已修复 @@ -2787,7 +2799,7 @@ 3.3、废弃用例4、设计思路¶ 上面介绍 Pytest 框架提供的标签功能 mark,使用时需要为每一个用例添加标签装饰器,则操作复杂,可维护性差,其根本问题就是标签分散在每一条用例的装饰器上,难以集中维护;于是乎将所有标签使用 csv 文件进行集中管理,并通过 Pytest 的钩子函数,读取 csv 文件,动态添加标签到用中。 5、CSV文件格式¶ -此配置文件需要维护大量的标签数据,且要方便能使用Excel打开进行编辑查看,更重要的是我们不想引入三方依赖,CSV 文件几乎是唯一能满足所有的要求的文件格式。 +此配置文件需要维护大量的标签数据,且要方便能使用 Excel 打开进行编辑查看,更重要的是我们不想引入三方依赖,CSV 文件几乎是唯一能满足所有的要求的文件格式。 七、日志系统¶ 1、背景¶ 基于 YouQu 自动化测试框架操作方法封装写法,通常是这样的:类里面一个函数只包含一个操作或多次调用的一系列可合并的操作; @@ -2888,7 +2900,7 @@ 1、原则 大文件不能上传到工程里面,保持整个工程的轻量化,这样在克隆代码的时候才能非常快速方便使用,我们见过一个 AT 工程 clone 大小达到好几个 G,简直不可思议。 其实代码文件的大小是很小的,也就是说,纯写代码随便写工程也不会太大,而文档(包含插图)等资源却是很占空间。 -因此我们选择将 YouQu 的文档工程单独迁出到独立的仓库 youqu-docs 。 +因此我们选择将 YouQu 的文档工程涉及到的图片资源都采用外链加载; 2、安装¶ 项目根目录下运行 env.sh 即可。 bash env.sh @@ -2930,17 +2942,25 @@ 3.2、裁剪依赖bash env_dev.sh +4、虚拟化部署¶ +YouQu默认采用虚拟化部分,虚拟化环境实际安装的位置是在 $HOME/.local/share/virtualenvs/youqu-oHTM7l7G 目录下 +youqu-oHTM7l7G 此目录名称前面部分是你的代码根目录的名称,后面部分是生成的随机字符串; +同学们在远程机器上定位问题的时候,如果使用 Pycharm 调试,就将解释器指定到这个目录的就行了; +当然,我们也提供了本机开发环境部署: +bash env_dev.sh + +如果你是本地开发环境可以用它,区别就是驱动执行的时候使用:python3 manage.py xxx 九、失败录屏¶ 录屏其实是一种视频形式的日志,因为很多时候我们在查看日志之后仍然无法准确的定位到用例失败的具体原因,因此用例的录屏能让我们看到用例在执行过程; 【使用方法】 在 globalconfig.ini 里面配置关注 2 个参数; -;失败用例重跑次数 -RERUN = 1 - -;失败录屏从第几次开始录制视频。 -;比如 RECORD_FAILED_CASE = 1 ,表示用例第1次执行失败之后开始录屏。 -;注意,用例失败重跑的次数不能小于失败录屏次数,即 RERUN >= RECORD_FAILED_CASE -RECORD_FAILED_CASE = 1 +;失败用例重跑次数 +RERUN = 1 + +;失败录屏从第几次开始录制视频。 +;比如 RECORD_FAILED_CASE = 1 ,表示用例第1次执行失败之后开始录屏。 +;注意,用例失败重跑的次数不能小于失败录屏次数,即 RERUN >= RECORD_FAILED_CASE +RECORD_FAILED_CASE = 1 默认失败重跑的次数是 1 次; RECORD_FAILED_CASE = 1 表示用例第1次执行失败之后开始录屏; @@ -2953,48 +2973,48 @@ 十、Wayland 适配简单讲就是,应用库只需要维护一套用例脚本即可。 【用例兼容】 因为 Wayland 下有些应用的界面显示和功能本身存在一些差异,用例层可能需要对这部分用例做逻辑判断,使用全局配置里面的常量进行逻辑编写即可: -from setting.globalconfig import GlobalConfig - -# GlobalConfig.IS_WAYLAND 获取到当前的显示服务器(bool) -# 应用库 Config 继承 GlobalConfig -if Config.IS_WAYLAND: - pass -if Config.IS_X11: - pass +from setting.globalconfig import GlobalConfig + +# GlobalConfig.IS_WAYLAND 获取到当前的显示服务器(bool) +# 应用库 Config 继承 GlobalConfig +if Config.IS_WAYLAND: + pass +if Config.IS_X11: + pass 比如用例里面如果断言的图片不同: -if Config.IS_WAYLAND: - self.assert_image_exist("wayland_XXX") -else: - self.assert_image_exist("x11_XXX") +if Config.IS_WAYLAND: + self.assert_image_exist("wayland_XXX") +else: + self.assert_image_exist("x11_XXX") 这样这条用例脚本在 Wayland 和 X11 下都可以跑,so easy 是不是?完全没必要专门拉新分支进行 Wayland 适配。 十一、测试报告¶ 1. 目录结构¶ 执行时会在根目录下动态生成 report 目录,所有的报告相关的文件会统一存放在里面,示例: -/report - ├── allure # allure报告 - │ ├── ... - │ └── ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json - ├── allure_html # 生成的html报告 - │ ├── ... - │ └── index.html - ├── allure_back # allure报告备份 - │ └── 20221108114823 - │ ├── ... - │ └── f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json - ├── json # json报告 - │ ├── ... - │ └── result_deepin-music_20221109134736_1081333.json - ├── logs # 日志文件 - │ ├── 2022-11-10_debug.log - │ └── 2022-11-10_error.log - ├── record # 录屏 - │ └── 2022-11-09 - │ ├── ... - │ └── 15时14分09秒_test_music_303_2_autotest.mp4 - └── xml # xml报告 - └── autotest_deepin_music-20221109134736.xml +/report + ├── allure # allure报告 + │ ├── ... + │ └── ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json + ├── allure_html # 生成的html报告 + │ ├── ... + │ └── index.html + ├── allure_back # allure报告备份 + │ └── 20221108114823 + │ ├── ... + │ └── f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json + ├── json # json报告 + │ ├── ... + │ └── result_deepin-music_20221109134736_1081333.json + ├── logs # 日志文件 + │ ├── 2022-11-10_debug.log + │ └── 2022-11-10_error.log + ├── record # 录屏 + │ └── 2022-11-09 + │ ├── ... + │ └── 15时14分09秒_test_music_303_2_autotest.mp4 + └── xml # xml报告 + └── autotest_deepin_music-20221109134736.xml 默认情况下同时生成 html、xml、json三种形式的报告。 2. 定制报告¶ @@ -3011,14 +3031,14 @@ 3. 查看报告allure open report/allure_html +allure open report/allure_html 使用 manage.py 执行完之后,在终端的最后一行,我们会给你输出打开报告的命令,直接复制它在终端执行就可以查看了,像这样: - 终端执行命令: allure open /tmp/youqu/report/allure_html 查看报告 + 终端执行命令: allure open /tmp/youqu/report/allure_html 查看报告 你也可以直接在 Pycharm 里面找到 index.html 文件,然后右键选择浏览器打开,或者你可以用一个 http 服务打开。 你也可以直接在 report/allure 目录下查看报告: - allure serve report/allure + allure serve report/allure 远程执行 @@ -3031,48 +3051,48 @@ 1. 提前解决代码问题这里推荐一个 Python 社区流行的代码格式化工具: Black,号称不妥协的代码格式化工具,它检测到不符合规范的代码风格直接就帮你全部格式化好,就是这么刚! 安装: -sudo pip3 install black +sudo pip3 install black 使用方法: -black ${CheckPath} +black ${CheckPath} 使用这个工具格式化之后,代码会被自动调整,刚开始你可能会觉得调整得很夸张,没关系坚持看,习惯之后,你会觉得很优雅,没错,这就是 Pythonic Code 的核心,请保持优雅~。 2. 代码扫描工具¶ 使用根目录下 pylint.sh 扫描代码,在 report 目录下查看代码扫描报告,如果有代码问题请提前解决之后再提交。 此脚本已经使用 Python 社区最流行的代码扫描工具 Pylint 进行代码扫描。 使用方法: -bash pylint.sh +bash pylint.sh 运行之后会提示你要扫描的目录,比如输入 apps ,则会扫描 apps 下的所有 Python 代码。 在 setting/pylintrc.cfg 配置文件里面进行相关配置,扫描完成之后在 report/pylints 目录下会生成扫描报告。 代码提交需通过 git review 提交到 gerrit ,人工 Code Review 通过之后合入代码。 十三、提交代码¶ 1. 安装依赖¶ -sudo apt install git-review +sudo apt install git-review 2. 提交模板¶ 在 ~ 目录下新建文件,并命名为 gitcommit_template 将以下内容写入文件当中: -# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 -fix: - -# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 -Description: - -# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 -Log: - -# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 -#Bug: - -# 修复 github issue -#Issue: - -# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 -#Task: +# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 +fix: + +# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 +Description: + +# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 +Log: + +# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 +#Bug: + +# 修复 github issue +#Issue: + +# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 +#Task: 命令行执行: -git config --global commit.template ~/gitcommit_template +git config --global commit.template ~/gitcommit_template 此命令将模板加入到 git 的提交模板中。 后续提交的时候需要关注一下几点: @@ -3083,19 +3103,19 @@ 2. 提交模板3. 推送代码¶ 首先添加 commit 信息 -git add 后面加文件名称 +git add 后面加文件名称 -git add . # 表示添加所有文件 +git add . # 表示添加所有文件 使用这条命令注意有些临时文件不要提交到仓库了。 -git commit -a +git commit -a 之后在 fix: 后面(注意冒号后面必须加空格,不然直接-1)写本地提交的 commit 信息,然后就可以提交代码了 -git review branch(当前分支) -r origin +git review branch(当前分支) -r origin 最好一次 commit,一次 git review ,经常有同学在本地疯狂 commit 最后 git review 报错不知道咋回事儿。 若不想每次提交都加上 -r 选项,执行以下命令: -git config --global gitreview.remote origin +git config --global gitreview.remote origin 提交代码,直接使用 git review branch<目标分支>,例如 git review master 4. Git标签¶ @@ -3106,74 +3126,74 @@ 4. Git标签git tag -a <tagname> +git tag -a <tagname> 回车之后,Git 会打开你的编辑器,让你写一句标签注解,就像你给提交写注解一样。 查看所有标签 -git tag -l -# git tag 也行 +git tag -l +# git tag 也行 删除标签 -git tag -d <tagname> +git tag -d <tagname> 推送标签至远程 git push 命令并不会传送标签到远程仓库服务器上,必须显式地推送标签。 -git push origin <tagname> +git push origin <tagname> 推送所有不在远程仓库服务器上的标签 -git push origin --tag +git push origin --tag 删除远程标签 -git push origin :refs/tag/<tagname> +git push origin :refs/tag/<tagname> 后期打标签 先用 git log --pretty=oneline 查询提交记录,获取校验码。 -git tag -a <tagname> 9fceb02(校验码) +git tag -a <tagname> 9fceb02(校验码) 检出标签 -git checkout <tagname> +git checkout <tagname> 此时,仓库会处于“分离头指针(detached HEAD)”的状态。 在“分离头指针”状态下,如果你做了某些更改然后提交它们,标签不会发生变化, 但你的新提交将不属于任何分支,并且将无法访问,除非通过确切的提交哈希才能访问。 因此,如果你需要进行更改,比如你要修复旧版本中的错误,那么通常需要创建一个新分支: -git checkout -b <NewBranchName> <tagname> +git checkout -b <NewBranchName> <tagname> 新分支上可以进行提交代码。 十四、常见问题¶ 1. 提交代码时提示邮箱或者名称不对¶ 重新配置邮箱或者名称,然后重置生效: -git commit --amend --reset-author +git commit --amend --reset-author 2. 怎么回滚到之前的版本¶ (1)查询历史提交记录 -git log +git log 找到你要回滚的版本,复制 hash 值。 注意:是 commit 空格之后的 hash 值,之前有同学复制的 Change-Id: 这样肯定报错。 (2)回滚版本,不清除代码 -git reset --soft ${hash} +git reset --soft ${hash} (3)回滚版本,清除代码,慎用哈 -git reset --hard ${hash} +git reset --hard ${hash} 3. 测试报告里面 F S . E 是什么意思¶ F 表示失败,. (点)表示通过,S 表示跳过,E 表示 error 有报错 4. 解决 git status 中文显示的问题¶ -git config --global core.quotePath false +git config --global core.quotePath false 5. apps 目录下颜色有些是黄色的¶ 在 Pycharm 中 apps 目录下应用库文件是黄色的,编辑器识别不到代码新增和修改; @@ -3184,22 +3204,22 @@ 5. apps 目录下颜色有些是黄色的6. 执行 env.sh 报错 $'\r':未找到命令¶ 出现这个问题你应该是在 windows 上打开或编辑过 env.sh 脚本,windows下的换行是回车符+换行符,也就是\r\n,而 Linxu 下是换行符 \n,Linux 下不识别 \r,因此报错。 解决方案: -# 将 \r 替换为空 -sudo sed -i 's/\r//' env.sh +# 将 \r 替换为空 +sudo sed -i 's/\r//' env.sh 7.怎样为单独某一条用例配置执行超时时间¶ 在用例脚本中添加装饰器,如下: -@pytest.mark.timeout(300) # 单位秒 -def test_xxx_001(): - pass +@pytest.mark.timeout(300) # 单位秒 +def test_xxx_001(): + pass 8. 如何拉取 YouQu 自动化项目所有代码,包含子仓库¶ 前置条件:已申请访问 YouQu 权限群组 -# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) -git config --global credential.helper store - -# 拉取YouQu框架代码,并递归拉取子仓库代码 -git clone "http://gerrit.uniontech.com/youqu" --recursive +# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) +git config --global credential.helper store + +# 拉取YouQu框架代码,并递归拉取子仓库代码 +git clone "http://gerrit.uniontech.com/youqu" --recursive 9. 如何拉取 YouQu 自动化项目中指定子仓库的代码¶ 前置条件: @@ -3207,22 +3227,22 @@ 9. 如何拉取 YouQu 自动化项目中指定子仓库的代 已申请访问 YouQu 权限群组 已存储访问密码 -# 拉取YouQu框架代码 -git clone "http://gerrit.uniontech.com/youqu" - -# 指定拉取子仓库代码 -cd youqu -git submodule update --init apps/autotest_xxx_xxx +# 拉取YouQu框架代码 +git clone "http://gerrit.uniontech.com/youqu" + +# 指定拉取子仓库代码 +cd youqu +git submodule update --init apps/autotest_xxx_xxx 10. 如何更新 YouQu 自动化项目中,所有子仓库的代码¶ 更新所有子仓库代码 -cd youqu -git pull & git submodule foreach git pull +cd youqu +git pull & git submodule foreach git pull 11. 如何修复 YouQu 所有子仓库 master 分支游离头(detached head)¶ 修复所有子仓库默认master 分支游离头 -cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
youqu manage.py startapp autotest_deepin_some
这样在 apps 目录下会创建一个子项目工程 autotest_deepin_some,同时新建好工程模板目录和模板文件:
apps
autotest_deepin_some
apps -└── autotest_deepin_some - ├── case - │ ├── assert_res - │ │ └── readme - │ ├── base_case.py - │ └── __init__.py - ├── config.ini - ├── config.py - ├── conftest.py - ├── control - ├── deepin_some_assert.py - ├── deepin_some.csv - ├── __init__.py - └── widget - ├── base_widget.py - ├── case_res - │ └── readme - ├── deepin_some_widget.py - ├── __init__.py - ├── other.ini - ├── other_widget.py - ├── pic_res - │ └── readme - └── ui.ini +apps +└── autotest_deepin_some + ├── case + │ ├── assert_res + │ │ └── readme + │ ├── base_case.py + │ └── __init__.py + ├── config.ini + ├── config.py + ├── conftest.py + ├── control + ├── deepin_some_assert.py + ├── deepin_some.csv + ├── __init__.py + └── widget + ├── base_widget.py + ├── case_res + │ └── readme + ├── deepin_some_widget.py + ├── __init__.py + ├── other.ini + ├── other_widget.py + ├── pic_res + │ └── readme + └── ui.ini autotest_deepin_some 是你的工程名称,比如:autotest_deepin_music ; 在此基础上,你可以快速的开始你的 AT 项目。 2.6. 用例标签自动同步¶ 用于自动同步 PMS 用例标签数据至本地 CSV 文件,主要通过以下几个配置来控制: -APP_NAME = # 指定要同步的应用名称 -PMS_USER = # PMS的用户名 -PMS_PASSWORD = # PMS的密码 +APP_NAME = # 指定要同步的应用名称 +PMS_USER = # PMS的用户名 +PMS_PASSWORD = # PMS的密码 在 [csv_link_pms_id] 节点下指定 csv 文件名与 PMS 用例模块的对应关系,比如: -[csv_link_pms_id] -;同步PMS数据到本地CSV文件,必须要配置的配置项 -;key是本地CSV文件的文件名称; -;value是对应PMS上的模块ID; -;比如要同步音乐的数据, 首先需要将配置 APP_NAME = deepin-music, -;CSV文件名称为music.csv,其在PMS上的用例为: https://pms.uniontech.com/testcase-browse-53.html -;因此应该配置为: music = 53 -;这样才能将PMS与本地CSV文件建立联系。 -;如果你的应用分了很多模块,只需要将对应的信息依次配置好就行了。 -music = 53 +[csv_link_pms_id] +;同步PMS数据到本地CSV文件,必须要配置的配置项 +;key是本地CSV文件的文件名称; +;value是对应PMS上的模块ID; +;比如要同步音乐的数据, 首先需要将配置 APP_NAME = deepin-music, +;CSV文件名称为music.csv,其在PMS上的用例为: https://pms.uniontech.com/testcase-browse-53.html +;因此应该配置为: music = 53 +;这样才能将PMS与本地CSV文件建立联系。 +;如果你的应用分了很多模块,只需要将对应的信息依次配置好就行了。 +music = 53 将以上信息配置好之后,在命令行执行: -youqu manage.py pms --pms2csv yes +youqu manage.py pms --pms2csv yes 每次执行时原 csv 文件会自动备份在 report/csv_back 目录下,因此你不用担心脚本执行导致你的数据丢失。 diff --git a/search/search_index.json b/search/search_index.json index 91ebe84c..c7cfc7a2 100644 --- a/search/search_index.json +++ b/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\u200b\\u3000\\-\u3001\u3002\uff0c\uff0e\uff1f\uff01\uff1b]+","pipeline":["stemmer"]},"docs":[{"location":"","title":"\u9996\u9875","text":""},{"location":"#youqu","title":"\u6709\u8da3\uff08YouQu\uff09","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/4/1\n# Author : Mikigo\n# =============================================\n \u672c\u7ad9\u603b\u8bbf\u95ee\u91cf \u6b21 \u6b22\u8fce\u5728\u6d4f\u89c8\u5668\u8bbf\u95ee\u3010\u516c\u7f51\u6587\u6863\u3011 \u7edf\u4fe1\u516c\u53f8\u5185\u7f51\u8fd8\u53ef\u4ee5\u8bbf\u95ee\u3010\u5185\u7f51\u6587\u6863\u3011\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u54e6~~"},{"location":"#_1","title":"\u4e00\u3001\u7b80\u4ecb","text":"\u6709\u8da3\uff08YouQu\uff09\u662f\u6df1\u5ea6\u79d1\u6280\u8bbe\u8ba1\u548c\u5f00\u53d1\u7684\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff0c\u91c7\u7528\u7ed3\u6784\u5206\u5c42\u7684\u8bbe\u8ba1\u7406\u5ff5\uff0c\u652f\u6301\u591a\u5143\u5316\u5143\u7d20\u5b9a\u4f4d\u548c\u65ad\u8a00\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\u3001\u5f3a\u5927\u7684\u65e5\u5fd7\u548c\u62a5\u544a\u8f93\u51fa\u7b49\u7279\u8272\u529f\u80fd\uff0c\u540c\u65f6\u5b8c\u7f8e\u517c\u5bb9X11\u3001Wayland\u663e\u793a\u534f\u8bae\uff0c\u73af\u5883\u90e8\u7f72\u7b80\u5355\uff0c\u64cd\u4f5c\u6613\u4e0a\u624b\u3002"},{"location":"#17","title":"\u7231\u4e0a \u201c\u6709\u8da3\u201d \u7684 17 \u4e2a\u7406\u7531","text":" \u6838\u5fc3\u5e93\u63d0\u4f9b\u4e86\u7edf\u4e00\u7684\u63a5\u53e3\uff0c\u7f16\u5199\u65b9\u6cd5\u65f6\u53ea\u9700\u8981\u5bfc\u5165\u4e00\u4e2a\u5305\u5c31\u53ef\u4ee5\u4f7f\u7528\u5230\u6838\u5fc3\u5e93\u63d0\u4f9b\u7684\u6240\u6709\u529f\u80fd\uff1b \u516c\u5171\u5e93\u5c01\u88c5\u4e86\u5f88\u591a\u5e38\u7528\u6a21\u5757\u7684\u76f8\u5173\u65b9\u6cd5\uff0c\u6bd4\u5982\uff1a\u4efb\u52a1\u680f\u7684\u64cd\u4f5c\u3001\u684c\u9762\u7684\u64cd\u4f5c\u3001\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\u7b49\u7b49\uff1b \u9664\u4e86\u5e38\u7528\u7684\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u8bc6\u522b\u4ee5\u5916\uff0c\u6211\u4eec\u8fd8\u63d0\u4f9b\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u5176\u4f7f\u7528\u7b80\u5355\u4e14\u9ad8\u6548\uff0c\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff1b \u5bf9\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u5c06\u7f16\u5199\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u53d8\u5f97\u7b80\u5355\u800c\u4f18\u96c5\uff1b \u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u6280\u672f\u8fdb\u884c\u529f\u80fd\u5347\u7ea7\uff0c\u9664\u4e86\u652f\u6301\u5355\u4e2a\u5750\u6807\u8fd4\u56de\uff0c\u8fd8\u652f\u6301\u540c\u4e00\u754c\u9762\u4e0b\u591a\u4e2a\u76f8\u540c\u5143\u7d20\u8fd4\u56de\u591a\u4e2a\u5750\u6807\u7684\u529f\u80fd\uff1b \u63d0\u4f9b\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u548c\u6279\u91cf\u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u4e0d\u5230\u4e00\u4e2a csv \u6587\u4ef6\u539f\u6765\u80fd\u5e72\u8fd9\u4e48\u591a\u4e8b\u60c5\uff1b \u63d0\u4f9b\u4e86\u529f\u80fd\u5f3a\u5927\u7684\u6267\u884c\u5668\u5165\u53e3\uff0c\u8ba9\u4f60\u53ef\u4ee5\u65b9\u4fbf\u7684\u5728\u672c\u5730\u6267\u884c\u4efb\u4f55\u7528\u4f8b\u96c6\u7684\u7528\u4f8b\uff0c\u5176\u4e30\u5bcc\u7684\u81ea\u5b9a\u4e49\u914d\u7f6e\u9879\uff0c\u6ee1\u8db3\u4f60\u5bf9\u6267\u884c\u5668\u6240\u6709\u7684\u5e7b\u60f3\uff1b \u63d0\u4f9b\u8fdc\u7a0b\u6267\u884c\u7684\u529f\u80fd\uff0c\u53ef\u4ee5\u63a7\u5236\u591a\u53f0\u673a\u5668\u5e76\u884c\u8dd1\uff0c\u6216\u8005\u5206\u5e03\u5f0f\u8dd1\uff0c\u8fd9\u79cd\u4ed8\u8d39\u529f\u80fd\u73b0\u5728\u514d\u8d39\u7ed9\u4f60\u7528\uff1b \u63d0\u4f9b\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u529f\u80fd\uff0c\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u6bcf\u4e2a\u65b9\u6cd5\u5355\u72ec\u5199\u8f93\u51fa\u65e5\u5fd7\u7684\u4ee3\u7801\uff0c\u4e00\u5207\u6211\u4eec\u7ed9\u4f60\u641e\u5b9a\u4e86\uff0c\u65e5\u5fd7\u8f93\u51fa\u4e0d\u4ec5\u5185\u5bb9\u4e30\u5bcc\uff0c\u989c\u503c\u4e5f\u7edd\u5bf9\u5728\u7ebf\uff0c\u6211\u4eec\u8fd8\u81ea\u5df1\u8bbe\u8ba1\u4e86\u4e00\u6b3e\u7ec8\u7aef\u8f93\u51fa\u4e3b\u9898\u53eb\u300a\u4e94\u5f69\u6591\u6593\u7684\u9ed1\u300b\uff1b \u63d0\u4f9b\u4e86\u4e00\u952e\u90e8\u7f72\u81ea\u52a8\u5316\u6d4b\u8bd5\u73af\u5883\u7684\u529f\u80fd\uff0c\u8fde\u4ee3\u7801\u7f16\u8f91\u5668\u90fd\u7ed9\u4f60\u88c5\u597d\u4e86\uff0c\u8ba9\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u73af\u5883\u90e8\u7f72\u800c\u70e6\u607c\uff1b \u63d0\u4f9b\u4e86\u81ea\u52a8\u751f\u6210\u591a\u79cd\u62a5\u544a\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u8f93\u51fa\u4ec0\u4e48\u62a5\u544a\u5f62\u5f0f\u90fd\u884c\uff0c\u800c\u4e14\u6211\u4eec\u5728\u62a5\u544a\u4e2d\u8fd8\u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\u548c\u5931\u8d25\u622a\u56fe\u7684\u529f\u80fd\uff1b \u5bf9\u65ad\u8a00\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u63d0\u4f9b\u66f4\u53cb\u597d\u5316\u7684\u9519\u8bef\u63d0\u793a\uff0c\u8ba9\u5b9a\u4f4d\u95ee\u9898\u7cbe\u51c6\u9ad8\u6548\uff1b \u4e0d\u4ec5\u652f\u6301\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u63a7\u5236\uff0c\u800c\u4e14\u8fd8\u652f\u6301\u52a8\u6001\u63a7\u5236\u7528\u4f8b\u6279\u91cf\u6267\u884c\u7684\u603b\u65f6\u95f4\uff0c\u786e\u4fdd CI \u73af\u5883\u4e0b\u80fd\u987a\u7545\u8fd0\u884c\uff1b \u652f\u6301\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\u6267\u884c\u3001PMS \u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6807\u7b7e\u5316\u6267\u884c\u65b9\u6848\uff0c\u6ee1\u8db3\u4f60\u5404\u79cd\u573a\u666f\u4e0b\u7684\u6267\u884c\u9700\u6c42\uff1b \u652f\u6301\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u529f\u80fd\uff0c\u53ef\u5b9a\u4f4d\u53ef\u65ad\u8a00\uff0c\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\uff1b \u5b8c\u7f8e\u517c\u5bb9 Wayland \u548c X11\uff0c\u771f\u6b63\u505a\u5230\u4e00\u5957\u4ee3\u7801\uff0c\u968f\u5904\u6267\u884c\uff1b \u652f\u6301\u591a\u79cd\u65b9\u5f0f\u7684\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u5176\u4e2d\u5f02\u6b65\u56de\u586b\u7684\u65b9\u6848\uff0c\u5b8c\u7f8e\u89e3\u51b3\u4e86\u6570\u636e\u56de\u586b\u7684\u8017\u65f6\u95ee\u9898\uff1b \u3010\u89c6\u9891\u4ecb\u7ecd\u3011"},{"location":"#_2","title":"\u4e8c\u3001\u5b89\u88c5\u4f7f\u7528","text":"\u57fa\u7840\u6846\u67b6\uff1ahttps://github.com/linuxdeepin/deepin-autotest-framework \u4ece PyPI \u5b89\u88c5: sudo pip3 install youqu\n \u521b\u5efa\u9879\u76ee: youqu-startproject youqu\n \u5b89\u88c5\u4f9d\u8d56: cd youqu\nbash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002 \u5e94\u7528\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684\u5e94\u7528\u540d\u79f0\u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music cd apps/\n \u5c06\u5e94\u7528\u5e93\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u50cf\u8fd9\u6837\uff1a youqu\n\u251c\u2500\u2500 apps\n\u2502 \u251c\u2500\u2500 autotest_deepin_music # \u5e94\u7528\u5e93\n...\n \u5e94\u7528\u5e93\u7684\u540d\u79f0\u4e0d\u53ef\u4ee5\u4fee\u6539\u3002"},{"location":"#_3","title":"\u4e09\u3001\u8fd0\u884c","text":""},{"location":"#1","title":"1. \u5de5\u4f5c\u7a7a\u95f4","text":"\u57fa\u7840\u6846\u67b6\u5de5\u7a0b\u76ee\u5f55\u5efa\u8bae\u653e\u5728 ~ \u76ee\u5f55\u4e0b\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u4e5f\u53ef\u4ee5\u8fd0\u884c\uff0c\u4f46\u662f\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u9700\u8981\u505a\u73af\u5883\u6e05\u7406\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u5b58\u5728\u4ee3\u7801\u88ab\u5220\u9664\u7684\u98ce\u9669\u3002 \u5982\u679c\u4f60\u7684\u673a\u5668\u4e0a\u4e0d\u540c\u76ee\u5f55\u4e0b\u5b58\u5728\u591a\u4e2a YouQu \u5de5\u7a0b\uff0c\u90a3\u4e48\u5728\u8fd0\u884c\u4e4b\u524d\uff0c\u8bf7\u5148\u6267\u884c env.sh \u6821\u6b63\u76f8\u5173\u73af\u5883\u3002"},{"location":"#2","title":"2. \u6267\u884c\u5668","text":"\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u6709\u4e00\u4e2a manage.py \uff0c\u5b83\u662f\u4e00\u4e2a\u6267\u884c\u5668\u5165\u53e3\uff0c\u63d0\u4f9b\u4e86\u672c\u5730\u6267\u884c\u3001\u8fdc\u7a0b\u6267\u884c\u7b49\u7684\u529f\u80fd\u3002 \u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6765\u6267\u884c\uff1a youqu manage.py run -a deepin-music\n"},{"location":"#21","title":"2.1. \u672c\u5730\u6267\u884c","text":"youqu manage.py run\n"},{"location":"#211","title":"2.1.1. \u914d\u7f6e\u6587\u4ef6","text":"\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u914d\u7f6e\u53c2\u6570 \u5728\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u91cc\u9762\u652f\u6301\u914d\u7f6e\u5bf9\u6267\u884c\u7684\u4e00\u4e9b\u53c2\u6570\u8fdb\u884c\u914d\u7f6e\uff0c\u5e38\u7528\u7684\u5982\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;1\u3001KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2\u3001KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f, e.g. TAGS = L1 or smoke\n;\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\uff0c\u5c06\u8981\u6267\u884c\u7684\u7528\u4f8b\u5199\u5165\u6307\u5b9a\u7684 csv \u6587\u4ef6\n;\u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u4ece\u57fa\u7840\u6846\u67b6\u6839\u76ee\u5f55\u5f00\u59cb\uff1ae.g. CASE_FILE = case_list.txt\n;\u5982\u679c\u8fd9\u91cc\u6709\u503c\uff0cAPP_NAME KEYWORDS TAGS \u7684\u914d\u7f6e\u5747\u4e0d\u751f\u6548\nCASE_FILE =\n;=============================== RUNNER CONFIG ===================================\n[runner]\n;\u6700\u5927\u5931\u8d25\u7528\u4f8b\u6570\u91cf\u7684\u5360\u6bd4\n;\u6bd4\u5982\uff1a\u603b\u6267\u884c\u7528\u4f8b\u6570\u4e3a100, \u82e5 MAX_FAIL = 0.5,\u5219\u5931\u8d25\u7528\u4f8b\u6570\u8fbe\u523050\u5c31\u4f1a\u7ec8\u6b62\u6d4b\u8bd5\u3002\nMAX_FAIL = 0.5\n;\u5355\u6761\u7528\u4f8b\u7684\u8d85\u65f6\u65f6\u95f4\uff0c\u5982\u679c\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u8d85\u65f6\uff0c\u8fd9\u6761\u7528\u4f8b\u4f1a\u88ab\u505c\u6b62\uff0c\u540e\u7eed\u7528\u4f8b\u7ee7\u7eed\u6267\u884c\u3002\n;\u5355\u4f4d\u4e3a\u79d2\n; \u8fd9\u662f\u4e00\u4e2a\u5168\u5c40\u7edf\u4e00\u914d\u7f6e\uff0c\u5982\u679c\u67d0\u6761\u7528\u4f8b\u9700\u8981\u5355\u72ec\u914d\u7f6e\u8d85\u65f6\u65f6\u95f4\uff0c\u53ef\u4ee5\u5728\u7528\u4f8b\u4e2d\u8fd9\u6837\u5199\uff1a\n;@pytest.mark.timeout(500)\n;def test_xxx_001():\n; ...\n;\u4f1a\u8bdd\uff08\u6240\u6709\u7528\u4f8b\u6267\u884c\u7684\uff09\u8d85\u65f6\u662f\u6839\u636e\u5168\u5c40\u8d85\u65f6\u914d\u7f6e\u548c\u7528\u4f8b\u5355\u72ec\u8d85\u65f6\u914d\u7f6e\u81ea\u52a8\u8ba1\u7b97\u7684\uff1b\nCASE_TIME_OUT = 200\n;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\u3002\n;\u6ce8\u610f\uff0c\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u4e0d\u80fd\u5c0f\u4e8e\u5931\u8d25\u5f55\u5c4f\u6b21\u6570\uff0c\u5373 RERUN >= RECORD_FAILED_CASE\nRECORD_FAILED_CASE = 1\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = INFO\n;yes \u6bcf\u6761\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u8fdb\u884c\u73af\u5883\u6e05\u7406\nCLEAN_ALL = yes\n;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\nRESOLUTION = 1920x1080\n;\u4e0d\u8df3\u8fc7\u7528\u4f8b\uff0ccsv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86 skip-xxx\u7684\u7528\u4f8b\u4e0d\u8df3\u8fc7\nNOSKIP = no\n;ignore fixed\n;no\uff0c\u53ea\u8981\u6807\u8bb0\u4e86fixed\u7684\u7528\u4f8b\uff0c\u5373\u4f7f\u6807\u8bb0\u4e86skip-\uff0c\u4e5f\u4f1a\u6267\u884c\uff1b\n;yes\uff0cfixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\uff1b\nIFIXED = no\n;\u8981\u5b89\u88c5deb\u5305\u7684\u8def\u5f84\n;e.g : ~/Downloads/ \u5b89\u88c5\u4e0b\u8f7d\u76ee\u5f55\u4e0b\u7684deb\u5305\uff0c\u5982\u679c\u662f\u8fdc\u7a0b\u6267\u884c\uff0c\u4f1a\u81ea\u52a8\u62f7\u8d1d\u5230\u8fdc\u7a0b\u5e76\u5b89\u88c5\u3002\nDEB_PATH =\n;DEBUG \u6a21\u5f0f\u6267\u884c\u7528\u4f8b\uff0c\u53ea\u6536\u96c6\u4e0d\u6267\u884c\u7528\u4f8b\uff0c\u4e5f\u4e0d\u505a\u8bbe\u5907\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002\nDEBUG = no\n;\u8bb0\u5f55top\u547d\u4ee4\u67e5\u8be2\u7684\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0cTOP = 3 \u8868\u793a\u8bb0\u5f55\u524d3\u4e2a\u8fdb\u7a0b\u3002\nTOP =\n;\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\nREPEAT =\n;\u9ed8\u8ba4\u5728\u6240\u6709\u6d4b\u8bd5\u5b8c\u6210\u4e4b\u540e\u8f93\u51fa\u62a5\u9519\u4fe1\u606f.\n;yes, \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\nDURING_FAIL = no\n;=============================== REPORT CONFIG ===================================\n[report]\n;\u7528\u4f8b\u6267\u884c\u5b8c\u540e\u751f\u6210\u7684\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n;\u76ee\u524d\u652f\u6301 allure, xml, json \uff08\u652f\u6301\u540c\u65f6\u751f\u6210\uff09\nREPORT_FORMAT = allure, xml, json\n;\u6307\u5b9a\u62a5\u544a\u751f\u6210\u7684\u8def\u5f84\uff08\u76f8\u5bf9\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\uff09\nALLURE_REPORT_PATH = report/\nXML_REPORT_PATH = report/\nJSON_REPORT_PATH = report/\n;=============================== GLOBAL CONFIG ===================================\n[globalconfig]\n;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\nPASSWORD = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\nIMAGE_MATCH_NUMBER = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6bcf\u6b21\u95f4\u9694\u7b49\u5f85\u65f6\u95f4\nIMAGE_MATCH_WAIT_TIME = 1\n;\u56fe\u50cf\u8bc6\u522b\u5339\u914d\u5ea6\nIMAGE_RATE = 0.9\n;\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u5b9e\u65f6\u56fe\u50cf\u4fdd\u5b58\u8def\u5f84\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u5750\u6807\nSCREEN_CACHE = /tmp/screen.png\n;\u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\u7684\u8def\u5f84\nTMPDIR = /tmp/tmpdir\n;\u7cfb\u7edf\u4e3b\u9898\nSYS_THEME = deepin\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = http://youqu-dev.uniontech.com:8890\n;OpenCV\u670d\u52a1\u7aef\u5730\u5740\nOPENCV_SERVER_HOST = http://youqu-dev.uniontech.com:8889\n;=============================== PMS CONFIG ===================================\n;PMS\u76f8\u5173\u914d\u7f6e\uff0c\u5305\u542b\u4ee5\u4e0b\u51e0\u4e2a\u65b9\u9762\uff1a\n;1.PMS\u6d4b\u8bd5\u5957\u6267\u884c\n;2.\u81ea\u52a8\u4ecePMS\u722c\u53d6\u6570\u636e\u5e76\u540c\u6b65\u672c\u5730CSV\u6587\u4ef6\n;3.PMS\u6570\u636e\u56de\u586b\n[pms]\n;PMS\u7684\u7528\u6237\u540d: ut001234\nPMS_USER =\n;PMS\u7684\u5bc6\u7801\nPMS_PASSWORD =\n;PMS\u6d4b\u8bd5\u5957\u7684ID\n;\u5728PMS\u4e0a\u67e5\u770b\u7528\u4f8b\u201c\u5957\u4ef6\u201d\u94fe\u63a5: https://pms.uniontech.com/testsuite-view-495.html\n;\u6d4b\u8bd5\u5957ID\u4e3a: 495\nSUITE_ID =\n;\u6570\u636e\u56de\u586b\u5fc5\u987b\u5173\u8054PMS\u6d4b\u8bd5\u5355\n;\u5728PMS\u4e0a\u67e5\u770b\u6d4b\u8bd5\u5355\u94fe\u63a5: https://pms.uniontech.com/testtask-cases-20747.html\n;\u6d4b\u8bd5\u5355ID\u4e3a: 20747\nTASK_ID =\n;\u5c06\u6d4b\u8bd5\u7ed3\u679c\u6570\u636e\u56de\u586b\u5230PMS\n;\u4e3a\u7a7a: \u8868\u793a\u4e0d\u56de\u586b,\u4e0d\u4f1a\u5728\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u751f\u6210json\u7ed3\u679c\u6587\u4ef6;\n;async: \u8868\u793a\u9010\u6761\u5f02\u6b65\u56de\u586b,\u540e\u9762\u4e00\u6761\u6267\u884c\u5f00\u59cb\u65f6\u901a\u8fc7\u5b50\u7ebf\u7a0b\u5bf9\u524d\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u8fdb\u884c\u56de\u586b\uff0c\u5982\u6b64\u5b9e\u73b0\u65f6\u95f4\u6548\u7387\u6700\u5927\u5316;\n;finish: \u8868\u793a\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u6210\u4e4b\u540e\u9010\u4e2a\u56de\u586b(PMS\u4e0d\u652f\u6301\u5e76\u53d1);\nSEND_PMS =\n;\u6570\u636e\u56de\u586b\u7684\u89e6\u53d1\u8005\n;auto: \u6846\u67b6\u81ea\u52a8\u56de\u586b,\u914d\u5408SEND_PMS\u914d\u7f6e\u4f7f\u7528,\u4f60\u53ef\u4ee5\u9009\u62e9\u5728\u4e0d\u540c\u7684\u9636\u6bb5\u8fdb\u884c\u6570\u636e\u56de\u586b;\n;hand: \u624b\u52a8\u56de\u586b,\u6bcf\u6761\u7528\u4f8b\u4ecd\u7136\u4f1a\u751f\u6210json\u6587\u4ef6,\u4f46\u6846\u67b6\u4e0d\u4f1a\u8fdb\u884c\u6570\u636e\u56de\u586b,\u9700\u8981\u4f60\u53ef\u4ee5\u5728\u4f60\u60f3\u8981\u53d1\u9001\u7684\u65f6\u95f4\u70b9\u624b\u52a8\u89e6\u53d1\u56de\u586b;\nTRIGGER = auto\n;PMS\u56de\u586b\u7684\u91cd\u8bd5\u6b21\u6570\n;\u5982\u679c\u63a5\u53e3\u8bf7\u6c42\u5931\u8d25,\u4f1a\u8fdb\u884c\u91cd\u8bd5\nSEND_PMS_RETRY_NUMBER = 2\n[csv_link_pms_lib]\n;caselib: \u7528\u4f8b\u5e93\n;testcase: \u4ea7\u54c1\u5e93\u7528\u4f8b\nCASE_FROM = caselib\n[csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/caselib-browse-81.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 81\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic =\n[export_csv]\n;\u5bfc\u51fa\u7684csv\u6587\u4ef6\u540d\u79f0\uff0c\u9ed8\u8ba4 case_list.csv\nCSV_FILE = case_list.csv\n;exportcsv \u547d\u4ee4\u5bfc\u51fa case_list.csv \u6587\u4ef6\u65f6\u914d\u7f6e\u7684\u5b57\u6bb5\u540d\uff0c\u7528\u4f8b\u540d\u79f0\u9ed8\u8ba4\u5b58\u5728\u7b2c\u4e00\u5217\uff0c\u65e0\u9700\u6dfb\u52a0\nCSV_HEARD = \u7528\u4f8b\u7ea7\u522b,\u7528\u4f8b\u7c7b\u578b,\u6d4b\u8bd5\u7ea7\u522b,\u662f\u5426\u8df3\u8fc7\n \u914d\u7f6e\u5b8c\u6210\u4e4b\u540e\uff0c\u76f4\u63a5\u5728\u547d\u4ee4\u884c\u6267\u884c manage.py \u5c31\u597d\u4e86\u3002 youqu manage.py run\n"},{"location":"#212","title":"2.1.2. \u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a youqu manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--max_fail MAX_FAIL \u6700\u5927\u5931\u8d25\u7387\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--resolution RESOLUTION\n\u68c0\u67e5\u5206\u8fa8\u7387\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms {,async,finish}\n\u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--trigger {,auto,hand}\n\u89e6\u53d1\u8005\n-f CASE_FILE, --case_file CASE_FILE\n\u6839\u636e\u6587\u4ef6\u6267\u884c\u7528\u4f8b\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n--pms_user PMS_USER pms \u7528\u6237\u540d\n--pms_password PMS_PASSWORD\npms \u5bc6\u7801\n--suite_id SUITE_ID pms \u6d4b\u8bd5\u5957ID\n--pms_info_file PMS_INFO_FILE\npms \u4fe1\u606f\u6587\u4ef6\n--top TOP \u8fc7\u7a0b\u4e2d\u8bb0\u5f55top\u547d\u4ee4\u4e2d\u7684\u503c\n--lastfailed \u4ec5\u6267\u884c\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\n--duringfail \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\n--repeat REPEAT \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n--project_name PROJECT_NAME\n\u5de5\u7a0b\u540d\u79f0\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--build_location BUILD_LOCATION\n\u6784\u5efa\u5730\u533a\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--line LINE \u6267\u884c\u7684\u4e1a\u52a1\u7ebf\uff08\u5199\u5165json\u6587\u4ef6\uff09\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a youqu manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\"\n \u547d\u4ee4\u884c\u53c2\u6570\u4f18\u5148\u7ea7\u662f\u9ad8\u4e8e\u914d\u7f6e\u6587\u4ef6\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u4e86\u5bf9\u5e94\u7684\u53c2\u6570\uff0c\u914d\u7f6e\u6587\u4ef6\u4e2d\u4e0d\u7ba1\u662f\u5426\u914d\u7f6e\u5747\u4e0d\u751f\u6548\u3002 --app \u5165\u53c2\u8fd8\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\uff0c\u4e0b\u9762\u7684\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u540c\u6837\u652f\u6301\u3002"},{"location":"#22","title":"2.2. \u8fdc\u7a0b\u6267\u884c","text":"youqu manage.py remote\n \u8fdc\u7a0b\u6267\u884c\u540c\u6837\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u8fdb\u884c\u7528\u4f8b\u76f8\u5173\u914d\u7f6e\uff1b \u9700\u8981\u91cd\u70b9\u8bf4\u4e00\u4e0b\u8fdc\u7a0b\u6267\u884c\u65f6\u7684\u6d4b\u8bd5\u673a\u4fe1\u606f\u914d\u7f6e\uff0c\u5728\u914d\u7f6e\u6587\u4ef6 setting/remote.ini \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\u3001IP\u3001\u5bc6\u7801\u3002 ;=============================== CLIENT LIST =====================================\n; \u6d4b\u8bd5\u673a\u914d\u7f6e\u5217\u8868\n;[client{number}] ;\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u6709\u591a\u5c11\u53f0\u6d4b\u8bd5\u673a\u5c31\u5199\u591a\u5c11\u4e2a client\uff0c\u522b\u540d\u5fc5\u987b\u5305\u542b client \u5b57\u7b26\uff0c\u4e14\u4e0d\u80fd\u91cd\u590d\u3002\n;user = ;\u6d4b\u8bd5\u673a user\n;ip = ;\u6d4b\u8bd5\u673a ip\n;password = 1 ;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801, \u53ef\u4ee5\u4e0d\u914d\u7f6e\u6b64\u9879\uff0c\u9ed8\u8ba4\u53d6 CLIENT_PASSWORD \u7684\u503c\uff1b\n;\u5982\u679c\u4f60\u6240\u6709\u6d4b\u8bd5\u673a\u5bc6\u7801\u90fd\u76f8\u540c\uff0c\u90a3\u4e48\u53ea\u9700\u8981\u914d\u7f6e CLIENT_PASSWORD \u5c31\u53ef\u4ee5\u4e86\n;=================================================================================\n[client1]\nuser = uos\nip = 10.8.15.xx\n[client2]\nuser = uos\nip = 10.8.15.xx\n[client3]\nuser = uos\nip = 10.8.11.xx\n \u6709\u591a\u5c11\u53f0\u673a\u5668\u5c31\u50cf\u8fd9\u6837\u6328\u7740\u5199\u5c31\u884c\u4e86\u3002 \u7136\u540e\u5728\u547d\u4ee4\u884c\uff1a youqu manage.py remote\n \u8fd9\u6837\u8fd0\u884c\u662f\u4ece\u914d\u7f6e\u6587\u4ef6\u53bb\u8bfb\u53d6\u76f8\u5173\u914d\u7f6e\u3002 \u5982\u679c\u4f60\u4e0d\u60f3\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\uff0c\u4f60\u4ecd\u7136\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u8fdb\u884c\u4f20\u53c2\uff0c \u4ee5\u4e0b\u4e3a python3 manage.py remote \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-c CLIENTS, --clients CLIENTS\n\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679cpassword\u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6\nsetting/remote.ini \u4e2d CLIENT_PASSWORD\n\u7684\u503c,\u6bd4\u5982\uff1auos@10.8.13.33:1 \u6216 uos@10.8.13.33\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-s {yes,no,}, --send_code {yes,no,}\n\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a\uff08\u4e0d\u542breport\u76ee\u5f55\uff09\n-e, --build_env \u642d\u5efa\u6d4b\u8bd5\u73af\u5883,\u5982\u679c\u4e3ayes\uff0c\u4e0d\u7ba1send_code\u662f\u5426\u4e3ayes\u90fd\u4f1a\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a.\n-p CLIENT_PASSWORD, --client_password CLIENT_PASSWORD\n\u6d4b\u8bd5\u673a\u5bc6\u7801\uff08\u5168\u5c40\uff09\n-y PARALLEL, --parallel PARALLEL\nyes:\u8868\u793a\u6240\u6709\u6d4b\u8bd5\u673a\u5e76\u884c\u8dd1\uff0c\u6267\u884c\u76f8\u540c\u7684\u6d4b\u8bd5\u7528\u4f8b\uff0cno\n:\u8868\u793a\u6d4b\u8bd5\u673a\u5206\u5e03\u5f0f\u6267\u884c\uff0c\u670d\u52a1\u7aef\u4f1a\u6839\u636e\u6536\u96c6\u5230\u7684\u6d4b\u8bd5\u7528\u4f8b\u81ea\u52a8\u5206\u914d\u7ed9\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u3002\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms SEND_PMS \u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n \u5728\u547d\u4ee4\u884c\u8fd9\u6837\u8fd0\u884c\uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\"\n \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report \u76ee\u5f55\u4e0b\u56de\u6536\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u7684\u6d4b\u8bd5\u62a5\u544a\u3002 \u914d\u7f6e\u6587\u4ef6\u5176\u4ed6\u76f8\u5173\u914d\u7f6e\u9879\u8be6\u7ec6\u8bf4\u660e\uff0c\u8bf7\u67e5\u770b\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u6ce8\u91ca\u5185\u5bb9\u3002"},{"location":"#23-pms","title":"2.3. PMS \u6570\u636e\u56de\u586b","text":"\u6d4b\u8bd5\u5355\u5173\u8054\u7684\u7528\u4f8b\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u5bf9\u5e94\u7684\u53bb\u8dd1\u8fd9\u4e9b\u5173\u8054\u7684\u7528\u4f8b\uff0c\u5e76\u4e14\u5c06\u6267\u884c\u7684\u7ed3\u679c\u56de\u586b\u7684\u6d4b\u8bd5\u7528\u4f8b\u7684\u72b6\u6001\u91cc\u9762\u3002 PMS \u6570\u636e\u56de\u586b\u4e3b\u8981\u6709\u4e09\u79cd\u65b9\u5f0f\uff1a \uff081\uff09\u5f02\u6b65\u56de\u586b \u5728\u7528\u4f8b\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\uff0c\u91c7\u7528\u5f02\u6b65\u7684\u65b9\u5f0f\u53bb\u8fdb\u884c\u6570\u636e\u56de\u586b\uff0c\u76f4\u767d\u7684\u8bb2\u5c31\u662f\uff0c\u7b2c\u4e8c\u6761\u7528\u4f8b\u5f00\u59cb\u8dd1\u7684\u65f6\u5019\uff0c\u901a\u8fc7\u5b50\u7ebf\u7a0b\u53bb\u505a\u7b2c\u4e00\u6761\u7528\u4f8b\u7684\u6570\u636e\u56de\u586b\uff0c\u5982\u6b64\u5faa\u73af\uff0c\u76f4\u5230\u6240\u6709\u7528\u4f8b\u6267\u884c\u7ed3\u675f\uff1b \u8fd9\u79cd\u65b9\u6848\u7684\u65f6\u95f4\u6548\u7387\u6700\u9ad8\u7684\uff0c\u56e0\u4e3a\u7406\u8bba\u4e0a\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u662f\u5927\u4e8e\u6570\u636e\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\u65f6\u95f4\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u5f53\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u6570\u636e\u56de\u586b\u4e5f\u5b8c\u6210\u4e86\u3002 \u4f7f\u7528\u65b9\u6cd5\uff0c\u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u4ee5\u4e0b\u53c2\u6570\uff1a\uff08\u4ee5\u4e0b\u6d89\u53ca\u5230\u7684\u53c2\u6570\u914d\u7f6e\u90fd\u662f\u5728\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u914d\u7f6e\uff09 PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = async\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \u8fd9\u4e2a\u53c2\u6570\u53ef\u586b\u53ef\u4e0d\u586b\uff0c\u4f46\u662f\u586b\u4e86\u53ef\u4ee5\u63d0\u9ad8\u7528\u4f8b\u7684\u6267\u884c\u901f\u5ea6\uff0c\u56e0\u4e3a\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u53ef\u4ee5\u6307\u5b9a\u5230\u5177\u4f53\u7684\u5e94\u7528\u5e93\u3002\uff08\u4e0b\u540c\uff09\n \uff082\uff09\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u56de\u586b \u7b49\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u518d\u9010\u4e2a\u8fdb\u884c\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u6b64\u65b9\u6848\u65f6\u95f4\u6548\u7387\u6bd4\u8f83\u4f4e\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \uff083\uff09\u624b\u52a8\u56de\u586b \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4e0d\u505a\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u540e\u7eed\u624b\u52a8\u5c06\u7ed3\u679c\u8fdb\u884c\u56de\u586b\u8bf7\u6c42\u3002 \u7528\u4f8b\u6267\u884c\u65f6\u914d\u7f6e\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = hand\nAPP_NAME = \u540e\u7eed\u624b\u52a8\u56de\u586b\u65b9\u6cd5\uff1a youqu manage.py pms --send2task yes\n"},{"location":"#_4","title":"\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898","text":"\u7531\u540c\u5b66\u53ef\u80fd\u4f1a\u53d1\u73b0\uff0c\u600e\u4e48\u56de\u586b\u4e00\u6b21\u4e4b\u540e\uff0c\u540e\u9762\u60f3\u518d\u6b21\u56de\u586b\u5c31\u4e0d\u751f\u6548\u4e86\uff1b \u8fd9\u662f\u56e0\u4e3a\u4e3a\u4e86\u5e94\u5bf9\u524d\u9762\u63d0\u5230\u7684\u591a\u79cd\u6570\u636e\u56de\u586b\u7684\u65b9\u5f0f\uff0c\u5728 report \u76ee\u5f55\u4e0b\u4f1a\u7531 pms_xxx \u5f00\u5934\u7684\u76ee\u5f55\uff0c\u8bb0\u5f55\u4e86\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u548c\u56de\u586b\u60c5\u51b5\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u4e4b\u524d\u5df2\u7ecf\u56de\u586b\u8fc7\u4e86\uff0c\u540e\u7eed\u5c31\u4e0d\u4f1a\u518d\u6b64\u89e6\u53d1\u56de\u586b\u4e86\uff1b \u5982\u679c\u4f60\u60f3\u91cd\u65b0\u505a\u56de\u586b\uff0c\u4f60\u53ef\u4ee5\u628a report/pms_xxx \u76ee\u5f55\u5220\u6389\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u91cd\u65b0\u505a\u6570\u636e\u56de\u586b\u4e86\uff1b"},{"location":"#24-csv","title":"2.4. \u5bfc\u51fa CSV \u6587\u4ef6","text":"\u6846\u67b6\u63d0\u4f9b\u5bfc\u51fa\u6307\u5b9a\u6807\u7b7e\u7528\u4f8b\u7684\u529f\u80fd\uff1a youqu manage.py exportcsv -a deepin-album -t CICD\n \u8868\u793a\u5bfc\u51fa deepin-album \u7684\u7528\u4f8b\u4e2d\u6807\u8bb0\u4e86 CICD \u6807\u7b7e\u7684\u7528\u4f8b\uff0c\u5bfc\u51fa CSV \u6587\u4ef6\u7684\u5b57\u6bb5\u683c\u5f0f\u5df2\u7ecf\u9002\u914d\u4e86 CICD \u7684\u8981\u6c42\u3002"},{"location":"#25-app","title":"2.5. \u811a\u624b\u67b6\u65b0\u5efa APP \u5de5\u7a0b","text":"\u65b0\u5efa\u4e00\u4e2a APP \u5de5\u7a0b\uff1a youqu manage.py startapp autotest_deepin_some \u8fd9\u6837\u5728 apps \u76ee\u5f55\u4e0b\u4f1a\u521b\u5efa\u4e00\u4e2a\u5b50\u9879\u76ee\u5de5\u7a0b autotest_deepin_some\uff0c\u540c\u65f6\u65b0\u5efa\u597d\u5de5\u7a0b\u6a21\u677f\u76ee\u5f55\u548c\u6a21\u677f\u6587\u4ef6\uff1a apps\n\u2514\u2500\u2500 autotest_deepin_some\n \u00a0\u00a0 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_case.py\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 config.ini\n \u00a0\u00a0 \u251c\u2500\u2500 config.py\n \u00a0\u00a0 \u251c\u2500\u2500 conftest.py\n \u00a0\u00a0 \u251c\u2500\u2500 control\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_assert.py\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some.csv\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u2514\u2500\u2500 widget\n \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 case_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 other.ini\n \u00a0\u00a0 \u251c\u2500\u2500 other_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 pic_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2514\u2500\u2500 ui.ini\n autotest_deepin_some \u662f\u4f60\u7684\u5de5\u7a0b\u540d\u79f0\uff0c\u6bd4\u5982\uff1aautotest_deepin_music \uff1b \u5728\u6b64\u57fa\u7840\u4e0a\uff0c\u4f60\u53ef\u4ee5\u5feb\u901f\u7684\u5f00\u59cb\u4f60\u7684 AT \u9879\u76ee\u3002"},{"location":"#26","title":"2.6. \u7528\u4f8b\u6807\u7b7e\u81ea\u52a8\u540c\u6b65","text":"\u7528\u4e8e\u81ea\u52a8\u540c\u6b65 PMS \u7528\u4f8b\u6807\u7b7e\u6570\u636e\u81f3\u672c\u5730 CSV \u6587\u4ef6\uff0c\u4e3b\u8981\u901a\u8fc7\u4ee5\u4e0b\u51e0\u4e2a\u914d\u7f6e\u6765\u63a7\u5236\uff1a APP_NAME = # \u6307\u5b9a\u8981\u540c\u6b65\u7684\u5e94\u7528\u540d\u79f0\nPMS_USER = # PMS\u7684\u7528\u6237\u540d\nPMS_PASSWORD = # PMS\u7684\u5bc6\u7801\n \u5728 [csv_link_pms_id] \u8282\u70b9\u4e0b\u6307\u5b9a csv \u6587\u4ef6\u540d\u4e0e PMS \u7528\u4f8b\u6a21\u5757\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u6bd4\u5982\uff1a [csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/testcase-browse-53.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 53\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic = 53\n \u5c06\u4ee5\u4e0a\u4fe1\u606f\u914d\u7f6e\u597d\u4e4b\u540e\uff0c\u5728\u547d\u4ee4\u884c\u6267\u884c\uff1a youqu manage.py pms --pms2csv yes\n \u6bcf\u6b21\u6267\u884c\u65f6\u539f csv \u6587\u4ef6\u4f1a\u81ea\u52a8\u5907\u4efd\u5728 report/csv_back \u76ee\u5f55\u4e0b\uff0c\u56e0\u6b64\u4f60\u4e0d\u7528\u62c5\u5fc3\u811a\u672c\u6267\u884c\u5bfc\u81f4\u4f60\u7684\u6570\u636e\u4e22\u5931\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u57fa\u7840\u6846\u67b6\u8bbe\u8ba1\u65b9\u6848","text":"# ====================================\n# Author : Mikigo\n# Time : 2022/3/18\n# version \uff1a1.0\n# ====================================\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"\u505a\u4e00\u4e2a\u7b80\u5355\u3001\u597d\u7528\u3001\u529f\u80fd\u5f3a\u5927\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u3002 \u4f5c\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4e00\u4e2a\u57fa\u7840\u6846\u67b6\uff0c\u4efb\u4f55\u5e94\u7528\u90fd\u80fd\u5f88\u65b9\u4fbf\u7684\u63a5\u5165\u8fdb\u6765\uff1b \u63d0\u4f9b\u6240\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u9700\u8981\u7684\u5e95\u5c42\u529f\u80fd\uff0c\u5e76\u5bf9\u5916\u63d0\u4f9b\u552f\u4e00\u7684\u63a5\u53e3\uff0c\u65b9\u4fbf\u5e94\u7528\u5e93\u4f7f\u7528\uff1b \u6574\u5408\u516c\u5171\u5e93\uff0c\u51cf\u5c11\u5e94\u7528\u5e93\u4ee3\u7801\u91cf\u548c\u65b9\u6cd5\u7ef4\u62a4\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u8bbe\u8ba1\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u7edf\u4e00\u6982\u5ff5","text":" \u57fa\u7840\u6846\u67b6 \u672c\u9879\u76ee\u662f\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\uff08AutoTest Basic Frame\uff09\uff0c\u5168\u79f0\u4e3a\u201c\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff08AT \u57fa\u7840\u6846\u67b6\uff09\u201d\u3002 AT \u57fa\u7840\u6846\u67b6\u662f\u505a\u4e3a\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\u6765\u8bbe\u8ba1\u7684\uff0c\u5b83\u63d0\u4f9b\u4e86\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u57fa\u7840\u529f\u80fd\uff0c\u4efb\u4f55\u5e94\u7528\u63a5\u5165\u8fdb\u6765\u90fd\u80fd\u5feb\u901f\u65b9\u4fbf\u7684\u8fdb\u884c\u65b9\u6cd5\u548c\u7528\u4f8b\u7f16\u5199\uff0c\u540c\u65f6\u5728\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u3001\u6807\u7b7e\u5316\u6267\u884c\u3001\u5206\u5e03\u5f0f\u6267\u884c\u3001\u591a\u79cd\u62a5\u544a\u8f93\u51fa\u3001\u4f18\u7f8e\u7684\u6267\u884c\u65e5\u5fd7\u3001\u5931\u8d25\u81ea\u52a8\u5f55\u5c4f\u548c\u622a\u56fe\u3001\u81ea\u52a8\u73af\u5883\u6e05\u7406\u7b49\u7b49\uff0c\u5b83\u90fd\u63d0\u4f9b\u4e86\u5b8c\u5584\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u66f4\u91cd\u8981\u7684\u662f\u8fd9\u4e00\u5207\u4f7f\u7528\u8d77\u6765\u90fd\u975e\u5e38\u7b80\u5355\u3002 \u57fa\u7840\u6846\u67b6\u4e2d\u5305\u542b\u5e94\u7528\u5e93\uff08apps\uff09\u3001\u6838\u5fc3\u5e93\uff08src\uff09\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09\u3002 \u5e94\u7528\u5e93\uff08apps\uff09 \u5404\u4e2a\u5e94\u7528\u81ea\u5df1\u7684\u4ed3\u5e93\uff0c\u91cc\u9762\u4e3b\u8981\u5305\u542b\u7684\u662f\u7528\u4f8b\u3001\u65b9\u6cd5\u53ca\u4e00\u4e9b\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u53eb autotest-dde-file-manager \u3002 \u6838\u5fc3\u5e93\uff08src\uff09 \u6838\u5fc3\u5e93\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u5230\u6240\u6709\u5e95\u5c42\u6838\u5fc3\u529f\u80fd\uff0c\u8fd9\u662f\u6700\u91cd\u8981\u7684\u4e00\u4e2a\u90e8\u5206\uff0c\u7075\u9b42\u3002\u5177\u4f53\u529f\u80fd\u6a21\u5757\u53ca\u8bf4\u660e\u4f1a\u5728\u4e0b\u9762\u7b2c\u56db\u4e2a\u7ae0\u8282\u8be6\u7ec6\u63cf\u8ff0\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09 \u591a\u4e2a\u5e94\u7528\u90fd\u8981\u7528\u5230\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\uff0c\u6309\u7167\u5e94\u7528\u5212\u5206\u5b58\u653e\uff0c\u4e3b\u8981\u662f\u4e3a\u4e86\u51cf\u5c11\u4ee3\u7801\u91cf\uff0c\u6d88\u9664\u5e94\u7528\u95f4\u7684\u8026\u5408\u5173\u7cfb\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u67b6\u6784\u56fe","text":"\u6574\u4f53\u7684\u6846\u67b6\u8bbe\u8ba1\u5728\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u300b\u6587\u6863\u91cc\u9762\u5df2\u7ecf\u6709\u8be6\u7ec6\u63cf\u8ff0\u4e86\uff0c\u8fd9\u91cc\u8d34\u4e00\u4e0b\u6574\u4f53\u7684\u67b6\u6784\u56fe\uff1a \u4e3a\u4e86\u7a81\u663e\u672c\u6587\u7684\u91cd\u70b9\uff0c\u62bd\u53d6\u5176\u4e2d\u91cd\u8981\u529f\u80fd\u6a21\u5757\uff0c\u5982\u4e0b\u56fe\uff1a "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-basic-frame # \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\n\u251c\u2500\u2500 apps # \u5e94\u7528\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-dde-file-manager # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\uff08\u5e94\u7528\u5e93\u8be6\u7ec6\u76ee\u5f55\u7ed3\u6784\u8bf7\u770b\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\uff09\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 tag # \u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u2514\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u2502 \u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 xxx.png\n\u2502 \u2502 ...\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-deepin-music # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 public # \u516c\u5171\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget # dde_dock \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget # dde_desktop \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 src # \u6838\u5fc3\u5e93\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 button_center.py\n\u2502 \u251c\u2500\u2500 cmdtrl.py\n\u2502 \u251c\u2500\u2500 dogtails.py\n\u2502 \u251c\u2500\u2500 find_image.py\n\u2502 \u251c\u2500\u2500 global_config.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 setting # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 config.py\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 global_config.ini\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\u6a21\u5757\uff08Hook\uff09\n\u251c\u2500\u2500 pytest.ini # Pytest \u9ed8\u8ba4\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 docs # \u6587\u6863\u76ee\u5f55\n\u2514\u2500\u2500 manage.py # \u6267\u884c\u5668\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1apps","title":"1\u3001\u5e94\u7528\u5e93\uff08apps\uff09","text":"\u6240\u6709\u5e94\u7528\u5e93\u5747\u653e\u7f6e\u5728\u57fa\u7840\u6846\u67b6\u4e0b\u7684 apps \u76ee\u5f55\u4e0b\uff08\u89c1\u7b2c\u4e8c\u7ae0\u8282\u7b2c3\u6bb5\u76ee\u5f55\u7ed3\u6784\u5185\u5bb9\uff09\u3002\u5e94\u7528\u5e93\u7684\u67b6\u6784\u8bbe\u8ba1\u53ef\u4ee5\u53c2\u8003\u300aAT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b\u6587\u6863\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2src","title":"2\u3001\u6838\u5fc3\u5e93\uff08src\uff09","text":"\u5728 src \u76ee\u5f55\u4e0b\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u5e95\u5c42\u6838\u5fc3\u7ec4\u4ef6\uff0c\u901a\u5e38\u6765\u8bb2\u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5230\u5176\u4e2d\u67d0\u4e00\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4e48\u4f60\u9700\u8981\u663e\u793a\u7684\u5bfc\u5165\u8fd9\u4e2a\u6a21\u5757\uff0c\u7136\u540e\u624d\u80fd\u4f7f\u7528\u8be5\u6a21\u5757\u4e0b\u7684\u529f\u80fd\uff0c\u5982\u679c\u4f60\u7528\u5230\u4e86\u5341\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4f60\u5c31\u9700\u8981\u5bfc\u5165\u5341\u4e2a\u3002\u4f46\u662f\u6211\u4eec\u60f3\u8ba9\u4e8b\u60c5\u53d8\u5f97\u7b80\u5355\uff0c\u4e00\u6b21\u5bfc\u5165\uff0c\u4f7f\u7528\u6240\u6709\u3002 \u5c06\u6240\u6709\u7684\u529f\u80fd\u6a21\u5757\u90fd\u8fdb\u5165\u5230 src \u7684\u540d\u79f0\u7a7a\u95f4\uff0c\u5728 src/__init__.py \u91cc\u9762\u6211\u4eec\u8bbe\u8ba1\u6210\u8fd9\u6837\uff1a # src/__init__.py\nfrom .cmdctl import CmdCtl\nfrom .dogtails import Dogtail\nfrom .find_image import FindImage\nfrom .button_center import ButtonCenter\nclass Src(CmdCtl, FindImage):\ndef __init__(self, **kwargs):\n\"\"\"dogtail or button center param\n :param kwargs: app_name, desc, number\n \"\"\"\nif kwargs:\napp_name = kwargs.get(\"APP_NAME\")\ndesc = kwargs.get(\"DESC\")\nif app_name is None or desc is None:\nraise ValueError\nnumber = kwargs.get(\"number\")\nnumber = number if isinstance(number, int) else -1\n# \u5bf9\u8c61\u7ec4\u5408\nself.dog = Dogtail(app_name, desc, number)\nself.ui = ButtonCenter(app_name, number)\n \u9700\u8981\u4f20\u9012\u53c2\u6570\u7684\u91c7\u7528\u5bf9\u8c61\u7ec4\u5408\uff0c\u6ca1\u6709\u53c2\u6570\u7684\u4f7f\u7528\u7ee7\u627f\uff0c\u7ee7\u627f\u7684\u7c7b\u7b26\u5408 Mixin \u8bbe\u8ba1\u6a21\u5f0f\u3002 \u5e94\u7528\u5e93\u91cc\u9762\u4f7f\u7528\u7684\u65f6\u5019\u5728 widget/base_widget.py \u91cc\u9762\u53ea\u9700\u8981\u552f\u4e00\u7ee7\u627f Src \uff1a # \u5e94\u7528\u5e93\u91cc\u9762\u65b9\u6cd5\u57fa\u7c7b\n# widget/base_widget.py\nfrom src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n \u8981\u4f7f\u7528\u6838\u5fc3\u5e93\u7684\u529f\u80fd\uff0c\u53ea\u9700\u8981\u5199\u4e00\u4e2a\u5bfc\u5165 from src import Src \u5373\u53ef\u3002 \u5199 __init__ \u6784\u9020\u51fd\u6570\u7684\u539f\u56e0\u662f\u901a\u8fc7\u53c2\u6570\u6784\u9020\u5e94\u7528\uff0c\u5e76\u4e14\u4f20\u9012 number \u8fdb\u6765\uff0c\u53ef\u4ee5\u5b9e\u73b0\u591a\u7a97\u53e3\u7684\u63a7\u5236\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3public","title":"3\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09","text":"\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6bcf\u4e2a\u5e94\u7528\u90fd\u662f\u4e00\u4e2a\u5355\u72ec\u7684 py \u6587\u4ef6\uff0c\u76f8\u4e92\u4e4b\u95f4\u662f\u72ec\u7acb\u7684\uff0c\u6bcf\u4e2a py \u6587\u4ef6\u91cc\u9762\u662f\u8be5\u5e94\u7528\u7684\u65b9\u6cd5\u7c7b\uff0c\u6bd4\u5982\uff1a\u6700\u5e38\u7528\u7684\u65b9\u6cd5\u7c7b dde_desktop_public_widget.py # dde_desktop_widget.py\nfrom src import Src\nclass _DdeDesktopPublicBaseWidget(Src):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-desktop\"\nDESC = \"/usr/bin/dde-desktop\"\ndef __init__(self):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC)\nclass DdeDesktopPublicWidget(_DdeDesktopPublicBaseWidget):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u7c7b\"\"\"\ndef click_music_dir_by_ui(self):\n\"\"\"\u5728\u6587\u4ef6\u9009\u62e9\u6846\u70b9\u51fb\u97f3\u4e50\u76ee\u5f55\"\"\"\nself.click(*self.ui.btn_center(\"\u4fa7\u8fb9\u680f-\u97f3\u4e50\")) \ndef click_xxx_by_attr(self):\npass\n \u516c\u5171\u65b9\u6cd5\u5e93\u610f\u4e49\uff1a \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6240\u5c01\u88c5\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\u90fd\u662f\u81f3\u5c11\u88ab2\u4e2a\u5e94\u7528\u90fd\u7528\u5230\u7684\uff0c\u8fd9\u6837\u505a\u53ef\u4ee5\u51cf\u5c11\u6574\u4f53\u4ee3\u7801\u91cf\uff0c\u4ece\u800c\u51cf\u8f7b\u5e94\u7528\u5e93\u4ee3\u7801\u7684\u7ef4\u62a4\u5de5\u4f5c\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u7f16\u5199\u5f62\u5f0f\uff08\u547d\u540d\u89c4\u5219\u3001\u5b9a\u4f4d\u7684\u65b9\u6848\u5199\u6cd5\u3001\u6ce8\u91ca\u7684\u5199\u6cd5\u7b49\u7b49\uff09\u5177\u6709\u4e00\u5b9a\u7684\u6a21\u677f\u4f5c\u7528\uff0c\u8fd9\u6837\u5373\u4f7f\u662f\u5404\u4e2a\u5e94\u7528\u5e93\u90fd\u72ec\u7acb\u7ef4\u62a4\uff0c\u6240\u6709\u7684\u7f16\u7801\u98ce\u683c\u90fd\u662f\u8d8b\u4e8e\u76f8\u540c\u7684\uff0c\u56e0\u4e3a\u5927\u5bb6\u90fd\u5e94\u8be5\u53c2\u7167\u516c\u5171\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u5199\u6cd5\u6765\u5199\u81ea\u5df1\u5e94\u7528\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\u7c7b\uff0c\u8fd9\u6837\u4f7f\u5f97\u4ece\u516c\u53f8\u7684\u89d2\u5ea6\u53bb\u770b\u6240\u6709\u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u90fd\u662f\u7edf\u4e00\u7684\u3002 \u53ef\u4ee5\u901a\u8fc7\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\uff0c\u4e86\u89e3\u5230\u5176\u4ed6\u5e94\u7528\u7684\u529f\u80fd\uff0c\u5bf9\u4e8e\u6211\u4eec\u9700\u6c42\u7406\u89e3\uff0c\u4e86\u89e3\u7cfb\u7edf\u7684\u65b9\u65b9\u9762\u9762\u4e5f\u6709\u597d\u5904\u3002 \u5f53\u7136\uff0c\u5982\u679c\u4f60\u7684\u5e94\u7528\u672c\u8eab\u662f\u5c5e\u4e8e\u6839\u672c\u5c31\u4e0d\u9700\u8981\u548c\u5176\u4ed6\u5e94\u7528\u4ea4\u4e92\u7684\uff0c\u90a3\u4e48\u4f60\u53ef\u80fd\u4e0d\u4f1a\u7528\u5230\u8fd9\u91cc\u9762\u7684\u529f\u80fd\uff0c\u6ca1\u5173\u7cfb\uff0c\u4f60\u6240\u6709\u7684\u65b9\u6cd5\u90fd\u53ef\u4ee5\u76f4\u63a5\u5199\u5728\u5e94\u7528\u5e93\u7684\u4e1a\u52a1\u5c42\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4conftestpy","title":"4\u3001conftest.py","text":"conftest.py \u4ece\u529f\u80fd\u4e0a\u5c06\u662f\u5c5e\u4e8e\u6838\u5fc3\u5e93\uff08src\uff09\u7684\u5185\u5bb9\uff0c\u4f46\u662f\u7531\u4e8e\u5b83\u7684\u7279\u6b8a\u6027\uff0c\u5373\u5b83\u662f\u5bf9\u5e94\u7528\u5e93\u4e2d\u7684\u7528\u4f8b\u751f\u6548\u7684\uff0c\u800c\u4e14\u5b83\u7684\u4f5c\u7528\u57df\u662f\u5f53\u524d\u76ee\u5f55\u53ca\u4ee5\u4e0b\uff0c\u56e0\u6b64\u6211\u4eec\u5c06\u5b83\u653e\u5230\u9879\u76ee\u6839\u76ee\u5f55\u3002\u6211\u4eec\u6846\u67b6\u4e2d\u6709\u4e0d\u5c11\u6838\u5fc3\u529f\u80fd\u90fd\u662f\u5728\u8fd9\u91cc\u9762\u8fdb\u884c\u5f00\u53d1\u7684\uff0c\u540e\u9762\u7b2c\u56db\u7ae0\u4f1a\u8bb2\u5230\u7ec6\u8282\u3002 pytest.ini \u4f5c\u7528\u548c conftest.py \u7c7b\u4f3c\uff0c\u662f Pytest \u6846\u67b6\u7684\u56fa\u5b9a\u914d\u7f6e\u6587\u4ef6\uff0c\u76ee\u524d\u914d\u7f6e\u4e86\u4e00\u4e9b\u901a\u7528\u7684\u547d\u4ee4\u884c\u6267\u884c\u53c2\u6570\uff0c\u4e5f\u653e\u5728\u9879\u76ee\u6839\u76ee\u5f55\u3002 \u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 Hook \u51fd\u6570\uff0capps \u76ee\u5f55\u4e0b\u7684 \u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 fixture \u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5setting","title":"5\u3001setting","text":"\u5168\u5c40\u914d\u7f6e\u6a21\u5757\uff0c\u5305\u542b\u4e86\u4ee5\u4e0b\u914d\u7f6e\u6587\u4ef6\uff1a \uff081\uff09ini \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u914d\u7f6e\u4e00\u4e9b\u5168\u5c40\u7684\u914d\u7f6e\u9879\uff0c\u8b6c\u5982\uff1a\u5931\u8d25\u91cd\u8dd1\u6b21\u6570\u3001\u662f\u5426\u5931\u8d25\u5f55\u5c4f\u3001\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\u3001\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4\u3001\u6267\u884c\u65f6\u65e5\u5fd7\u7ea7\u522b\u3001\u751f\u6210\u7684\u62a5\u544a\u7c7b\u578b\u3001\u4ee5\u53ca\u5206\u5e03\u5f0f\u6267\u884c\u7684\u4e00\u4e9b\u7b56\u7565\u914d\u7f6e\u9879\u7b49\u7b49\u3002 \uff082\uff09config.py \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u63d0\u4f9b\u914d\u7f6e\u6587\u4ef6\u8bfb\u53d6\u3001\u52a8\u6001\u83b7\u53d6\u4e00\u4e9b\u5e38\u91cf\uff08\u5982\u9879\u76ee\u6839\u76ee\u5f55\u7edd\u5bf9\u8def\u5f84 (BASE_DIR)\u3001\u7cfb\u7edf\u67b6\u6784\uff08SYS_FRAME\uff09\u3001\u65f6\u95f4\u5b57\u7b26\u4e32\uff08strftime\uff09\u3001\u672c\u673a USERNAME IP \u7b49\u7b49\uff09\u3001\u516c\u5171 URL \u7b49\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u89c4\u8303","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u7248\u672c\u53ca\u4f9d\u8d56","text":"\u57fa\u7840\u6846\u67b6\u4f1a\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u8fdb\u884c\u7248\u672c\u53d1\u5e03\uff0c\u4e0d\u4e0e\u67d0\u4e2a\u5e94\u7528\u7248\u672c\u7ed1\u5b9a\uff0c\u4f46\u662f\uff0c\u5e94\u7528\u5e93\u4f1a\u4f9d\u8d56\u4e8e\u57fa\u7840\u6846\u67b6\u7684\u7248\u672c\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u5efa\u8bae\u5728\u5e94\u7528\u5e93\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a\u6587\u672c\u6587\u4ef6\u7528\u4e8e\u8bb0\u5f55\u6240\u4f9d\u8d56\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\uff0c\u7c7b\u4f3c\u4e8e\u5f00\u53d1\u5e94\u7528\u7684 debian/control \u6587\u4ef6\u7684\u529f\u80fd\uff0c\u4e3a\u4e86\u4fdd\u6301\u7edf\u4e00\uff0c\u8fd9\u4e2a\u6587\u4ef6\u5c31\u547d\u540d\u4e3a control\uff0c\u653e\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u6838\u5fc3\u5e93\u72ec\u7acb\u6027","text":"\u6838\u5fc3\u5e93\u4e0d\u5efa\u8bae\u9488\u5bf9\u67d0\u4e00\u4e2a\u5e94\u7528\u5355\u72ec\u505a\u4ee3\u7801\u4e0a\u7279\u6b8a\u5904\u7406\uff0c\u901a\u5e38\u8003\u8651\u9488\u5bf9\u67d0\u4e00\u79cd\u573a\u666f\u8fdb\u884c\u5904\u7406\uff0c\u8fd9\u4e9b\u573a\u666f\u901a\u5e38\u662f\u5b58\u5728\u4e00\u4e9b\u5171\u6027\u7684\u3002\u6bd4\u5982\u8bf4\uff1a\u684c\u9762\u7684ID\u5206\u914d\u5b58\u5728\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u903b\u8f91\u5904\u7406\u89e3\u51b3ID\u5206\u914d\u9519\u8bef\u7684\u95ee\u9898\uff0c\u4f46\u662f\u8fd9\u90e8\u5206\u903b\u8f91\u6211\u4eec\u4f1a\u5728\u684c\u9762\u7684\u65b9\u6cd5\u5c42\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u517c\u5bb9\u6027","text":"\u4e3a\u4e86\u4fdd\u6301\u517c\u5bb9\u6027\uff0c\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u539f\u5219\u4e0a\u4e0d\u5bf9\u8001\u65b9\u6cd5\u8fdb\u884c\u4fee\u6539\u6216\u5220\u9664\uff0c\u53ea\u8fdb\u884c\u65b0\u589e\u3002\u6d89\u53ca\u5230\u8001\u65b9\u6cd5\u4fee\u6539\u6216\u5220\u9664\u7684\uff0c\u4f1a\u8fdb\u884c\u63d0\u524d\u9884\u544a\uff0c\u5e76\u5728\u7b2c\u4e8c\u4e2a\u7248\u672c\u4e4b\u540e\uff08\u4e2d\u95f4\u4f1a\u9694\u4e00\u4e2a\u7248\u672c\u8fc7\u5ea6\uff09\u6b63\u5f0f\u5b9e\u65bd\u4fee\u6539\u6216\u5220\u9664\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u547d\u540d\u89c4\u8303","text":" \u7528\u4f8b ID \u6bcf\u4e2a\u5e94\u7528\u81ea\u5df1\u7ef4\u62a4\u4e00\u5957 ID\uff0c\u5728PMS\u4e0a\u7528\u4f8b\u6807\u9898\u4e0a\u5c06\u81ea\u52a8\u5316ID\u4ee5\u6807\u7b7e\u7684\u5f62\u5f0f\u5199\u5165\uff0c\u6bd4\u5982\uff1a[101]\u6253\u5f00-\u542f\u52a8\u5e94\u7528\u540edock\u53f3\u952e\u83dc\u5355 \u4e00\u4e2a\u7528\u4f8b\u7c7b\u91cc\u9762\u6709\u591a\u4e2a\u7528\u4f8b\u65f6\uff0c\u5728\u7528\u4f8b\u540d\u79f0\u540e\u9762\u52a0\u5e8f\u53f7\u3002 class TestFileManager(BaseCase):\n\"\"\"\u6587\u7ba1\u7528\u4f8b\"\"\"\ndef test_xxx_015_1(self):\npass\ndef test_xxx_015_2(self):\npass\n \u6ce8\u610f 015_1\uff0c\u4e0d\u8981\u5199015_01\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 PMS \u4e0a\u7684\u7528\u4f8bID\uff1a PMS \u4e0a\u662f6\u4f4d\u6570\uff0c\u4e0d\u591f\u76f4\u89c2\uff0c\u4e5f\u4e0d\u597d\u7ef4\u62a4\uff0c\u5728\u81ea\u52a8\u5316\u4e0b\u9762\u53bb\u627e\u4e00\u4e2a\u5e26\u6709 6 \u4f4d\u6570\u7684\u6587\u4ef6\u662f\u4e00\u4e2a\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 PMS \u4e0a\u7684 ID \u53ef\u80fd\u4f1a\u53d1\u751f\u53d8\u5316\uff0c\u6bd4\u5982\u5bfc\u51fa\u6765\u5bfc\u8fdb\u53bb\u7684\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u5b58\u5728\u95ee\u9898\uff0c\u5982\u679c\u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u8981\u60f3\u627e\u51fa\u6765\u5bf9\u5e94\u4fee\u6539\u81ea\u52a8\u5316\u7528\u4f8b ID\uff0c\u5c06\u4f1a\u662f\u4ef6\u975e\u5e38\u75db\u82e6\u7684\u4e8b\u60c5\u3002 \u51fd\u6570\u547d\u540d\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5de6\u952e\u70b9\u51fb click \u53f3\u952e\u70b9\u51fb right_click \u53cc\u51fb double_click \u79fb\u52a8 move_to \u62d6\u52a8 drag \u65b0\u5efa new \u62d6\u52a8\u5230 drag_to \u4ece\u54ea\u91cc\u62d6\u52a8\u5230\u54ea\u91cc drag_something_from_xxx_to_xxx \u83b7\u53d6 get \u83b7\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5750\u6807 get_location \u975e\u7279\u6b8a\u6587\u4ef6 file word\u6587\u4ef6 doc text\u6587\u4ef6 text \u6587\u4ef6\u5939 dir \u5173\u952e\u8bcd\u6301\u7eed\u589e\u52a0 \u5e38\u91cf\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5e94\u7528\u540d\u79f0 APP_NAME \u5e94\u7528\u63cf\u8ff0 DESC \u672c\u5e94\u7528\u4ee5\u5916\u7684\u5176\u4ed6\u5e94\u7528\uff0c\u6bd4\u5982\u5e2e\u52a9 HELP \u5176\u4ed6\u540d\u79f0\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u65b9\u6cd5\u5305\u540d widget \u65b9\u6cd5\u6587\u4ef6\u540d\uff08\u6587\u7ba1\u4e3e\u4f8b\uff09 dfm_widget.pytitle_widget.pyright_view_widget.pyleft_view_widget.pypop_widget.pybase_widget.pydfm_assert.py \u65ad\u8a00\u8bed\u53e5\u547d\u540d\u89c4\u8303 \u65ad\u8a00\u8bed\u53e5\u90fd\u662f\u4ee5 assert \u5f00\u5934 \u65ad\u8a00 \u8bed\u53e5 \u5224\u65ad\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_existsassert_file_not_exists \u5224\u65ad\u684c\u9762\u76ee\u5f55\u4e0b\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_exists_in_desktopassert_file_not_exists_in_desktop \u5224\u65ad\u56fe\u7247\u5b58\u5728 assert_image_existsassert_image_not_exists \u5224\u65ad\u5f71\u9662\u4e2d\u662f\u5426\u5b58\u5728\u56fe\u7247 assert_image_exists_in_movieassert_image_not_exists_in_movie \u5224\u65ad\u5143\u7d20\u662f\u5426\u5b58\u5728 assert_element_existassert_element_not_exist \u5224\u65ad\u662f\u5426\u76f8\u7b49 assert_equalassert_not_equal \u5224\u65ad\u662f\u5426\u4e3a\u771f assert_trueassert_false"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5fixture","title":"5\u3001fixture \u89c4\u8303","text":"\u7531\u4e8e Pytest \u6846\u67b6\u4e2d\u652f\u6301 fixture \u7684\u5199\u6cd5\u548c Xunit \u5199\u6cd5\u7684\uff0c\u6240\u4ee5\u5e94\u7528\u5e93\u4e2d\u53ef\u80fd\u5b58\u5728\u6df7\u7528\u7684\u60c5\u51b5\uff0c\u4e3a\u7edf\u4e00\u7f16\u7801\u98ce\u683c\u65b9\u4fbf\u540e\u7eed\u7528\u4f8b\u4ee3\u7801\u7ef4\u62a4\uff0c\u73b0\u505a\u4ee5\u4e0b\u89c4\u8303\u8bf4\u660e\uff1a \u629b\u5f03 Xunit \u7684\u5199\u6cd5\uff0c\u7edf\u4e00\u91c7\u7528 Pytest fixture \u7684\u5199\u6cd5\u3002 \u5e94\u7528\u5185 fixture \u8c28\u614e\u4f7f\u7528 autouse=True \uff0c\u975e\u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u975e\u5e38\u4e0d\u5efa\u8bae\u4f7f\u7528\u8fd9\u4e2a\u53c2\u6570\u3002 \u8c03\u7528 fixture \u4e0d\u80fd\u4f7f\u7528 @pytest.mark.usefixture()\uff0c\u4f7f\u7528\u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u4f20\u5165\u51fd\u6570\u5bf9\u8c61\u3002 \u5efa\u8bae\u5728\u4e00\u4e2a conftest.py \u91cc\u9762\u53bb\u5199\uff0c\u4e00\u4e2a\u5e94\u7528\u4e5f\u5c3d\u91cf\u7ef4\u62a4\u4e00\u4e2a conftest.py\u6587\u4ef6\u3002 fixture \u4e5f\u9700\u8981\u5199\u529f\u80fd\u8bf4\u660e\uff0c\u51fd\u6570\u540d\u79f0\u8981\u6709\u5177\u4f53\u542b\u4e49\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#6","title":"6\u3001\u65b9\u6cd5\u7f16\u5199\u89c4\u8303","text":" \u65b9\u6cd5\u7c7b\u578b\uff1a if \u6ca1\u6709\u7528\u5230\u5b9e\u4f8b\u5bf9\u8c61\uff1a\nif \u6ca1\u6709\u7528\u5230\u7c7b\u5bf9\u8c61\uff1a\n\u5199\u9759\u6001\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @staticmethod\nelse\uff1a\n\u5199\u7c7b\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @classmethod\nelse:\n\u76f4\u63a5\u5199\u5b9e\u4f8b\u65b9\u6cd5\n \u4e3e\u4f8b: class TitleWidget:\ndef click_xxx_by_ui(self):\npass\n@staticmethod\ndef click_xxx_by_ui():\npass\n@classmethod\ndef click_xxx_by_ui(cls):\npass\n \u51fd\u6570\u540d\u79f0\u4e0d\u51fa\u73b0\u6570\u5b57\uff0c\u9700\u8981\u8868\u793a\u6570\u91cf\u7684\u7528\u5355\u8bcd\u8868\u793a\u3002 \u51fd\u6570\u529f\u80fd\u6ce8\u91ca\u3002 \u6ca1\u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg2:xxx\n\"\"\"\n \u6709\u53c2\u6570\uff0c\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg1:xxx\nreturn: xxx\n\"\"\"\n \u200b \u7528 Pycharm \u7684\u6ce8\u91ca\u6a21\u677f\u4e5f\u53ef\u4ee5\uff0c\u53ea\u8981\u4f53\u73b0\u4e86\u53c2\u6570\u7684\u7c7b\u578b\u548c\u8fd4\u56de\u5c31\u884c\u4e86\u3002 \u6682\u4e0d\u8981\u6c42\u5199\u7c7b\u578b\u6ce8\u89e3\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#7case","title":"7\u3001\u7528\u4f8b\uff08case\uff09\u89c4\u8303","text":" \u4ee5\u7c7b\u7684\u5f62\u5f0f\u5199\u7528\u4f8b\uff0c\u7528\u4f8b\u7c7b\u96c6\u6210\u7528\u4f8b\u57fa\u7c7b\u3002 \u7528\u4f8b\u7c7b\u9700\u8981\u5199\u6ce8\u91ca\u3002 \u6d4b\u8bd5\u7528\u4f8b\u51fd\u6570\u8bf4\u660e\uff08\u5efa\u8bae\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u540d\u79f0\uff09 \"\"\"\u53f3\u4fa7\u9884\u89c8-\u56fe\u7247\u7c7b\u578b\u4fe1\u606f\u680f\u57fa\u672c\u4fe1\u606f\"\"\"\n \u4e0d\u5199\u8c03\u8bd5\u4ee3\u7801 if __name__ == '__main__':\npytest.main()\n \u6240\u6709\u7528\u4f8b\u90fd\u7ee7\u627f BaseCase\u3002 BaseCase \u91cc\u9762\u653e\u4e00\u4e9b\u6d4b\u8bd5\u6570\u636e\u7684\u5e38\u91cf\uff0c\u6bd4\u5982\u6587\u4ef6\u540d\u79f0\uff0c\u5e94\u7528\u540d\u79f0\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u4e00\u4e9b\u901a\u7528\u7684\u5b57\u7b26\u4e32\u3002 \u8fd9\u7c7b\u662f\u5c5e\u4e8e\u6d4b\u8bd5\u6570\u636e\u3002 class BaseCase(DfmAssert):\n\"\"\"\u7528\u4f8b\u57fa\u7c7b\"\"\"\nNEW_FILE = \"\u65b0\u5efa\u6587\u672c.txt\"\nTEST_FILE = \"test.txt\"\nNEW_DIR = \"\u65b0\u5efa\u6587\u4ef6\u5939\"\nNEW_WORD = \"\u65b0\u5efaWord\u6587\u6863.doc\"\nAPP_HELP = \"damn\"\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\n\"\"\"\u7528\u4f8b\u6807\u9898\uff08\u590d\u5236PMS\u4e0a\u7528\u4f8b\u6807\u9898\uff09\"\"\"\ndfm = DfmWidget()\ndfm.click_xxx_by_attr(self.NEW_FILE)\ndfm.new_file_in_desktop_by_cmd(self.NEW_FILE)\nself.assert_true(dfm.get_process_status(self.APP_NAME))\n \u7528\u4f8b\u91cc\u9762\u5c3d\u91cf\u51cf\u5c11\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\uff0c\u66f4\u8981\u51cf\u5c11\u76f8\u540c\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\u3002 \u7edf\u4e00\u6587\u4ef6\u6ce8\u91ca\u5934\u3002 #!/usr/bin/env python3\n# _*_ coding:utf-8 _*_\n\"\"\"\n:Author:email@uniontech.com\n:Date :${DATE} ${TIME}\n\"\"\"\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#8","title":"8\u3001\u5176\u4ed6\u89c4\u8303","text":" \u65e5\u5fd7\u6253\u5370\u8981\u5728\u65b9\u6cd5\u6700\u524d\u9762\uff0c\u5426\u5219\u4ee3\u7801\u62a5\u9519\u6ca1\u6709\u65e5\u5fd7\u8f93\u51fa\uff0c\u4e0d\u597d\u5b9a\u4f4d\u95ee\u9898\u3002\uff08\u6211\u4eec\u4f1a\u8003\u8651\u7ee7\u7eed\u4f7f\u7528\u62e6\u622a\u5668\u6253\u5370\u65e5\u5fd7\uff09 \u6240\u6709\u7684\u64cd\u4f5c\u90fd\u9700\u8981\u6709\u65e5\u5fd7\uff0c\u5305\u62ec sleep()\uff0c\u6211\u4eec\u4f1a\u91cd\u5199\u4e00\u4e2a\u6709\u65e5\u5fd7\u8f93\u5165\u7684 sleep\u3002 \u4e1a\u52a1\u5c42\u65e5\u5fd7\u7ea7\u522b\u4e3a INFO\u3002 hook \u51fd\u6570\u53ea\u80fd\u5199\u5230\u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u91cc\u9762\u3002 apps \u76ee\u5f55\u4e0b\u7684 conftest.py \u539f\u5219\u4e0a\u4e0d\u4f1a\u65b0\u589e fixture\u3002 \u56fa\u5b9a\u76ee\u5f55\u6216\u5143\u7d20\u63a7\u4ef6\u7684\u64cd\u4f5c\uff0c\u5c06\u64cd\u4f5c\u65b9\u6cd5\u5199\u6b7b\uff0c\u6587\u4ef6\u7c7b\u64cd\u4f5c\u5c06\u6587\u4ef6\u540d\u7559\u53c2\u6570\u3002 \u8def\u5f84\u62fc\u63a5\u89c4\u8303\uff1a \u7cfb\u7edf\u4e2d\u56fa\u5b9a\u76ee\u5f55\uff0c\u8def\u5f84\u62fc\u63a5\u65f6\u4f7f\u7528\u6ce2\u6d6a\u7b26\u53f7\uff0c\u6bd4\u5982\uff1a~/Desktop/\uff0c\u4e0b\u5c42\u4f7f\u7528 os.path.expanduser()\uff0c\u5b83\u53ef\u4ee5\u81ea\u52a8\u8bc6\u522b\u6ce2\u6d6a\u7b26\u53f7\u3002 \u9879\u76ee\u4e0b\u8def\u5f84\u4f7f\u7528\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u8def\u5f84\uff0c\u6bd4\u5982\uff1aConfig.BASE_PATH\uff0c\u56e0\u4e3a\u9879\u76ee\u662f\u53ef\u4ee5\u5728\u4efb\u610f\u8def\u5f84\u8fd0\u884c\u7684\uff0c\u9700\u8981\u52a8\u6001\u62fc\u63a5\u8def\u5f84\u3002 "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848","text":"# =================================================\n# Author : Mikigo\n# Time : 2022/3/16\n# version \uff1a1.0\n# =================================================\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"AT \u5e94\u7528\u5e93\u6539\u9020\u662f\u57fa\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u8fdb\u884c\u7528\u4f8b\u65b9\u6cd5\u548c\u4e1a\u52a1\u903b\u8f91\u7684\u91cd\u65b0\u8bbe\u8ba1\uff0c\u4ee5\u5b9e\u73b0\u5e94\u7528\u5e93\u9ad8\u6548\u7684\u7f16\u5199\u3001\u7ef4\u62a4\u7528\u4f8b\u53ca\u5176\u65b9\u6cd5\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u6587\u4ef6\u7ba1\u7406\u5668\u4ece\u4e1a\u52a1\u590d\u6742\u5ea6\u548c\u7528\u4f8b\u91cf\u6765\u8bb2\uff0c\u5728\u7cfb\u7edf\u6240\u6709\u5e94\u7528\u4e2d\uff0c\u662f\u5f88\u6709\u4ee3\u8868\u6027\u7684\uff0c\u96be\u5ea6\u4e5f\u662f\u6700\u5927\u7684\uff0c\u56e0\u6b64\u6211\u4eec\u9009\u53d6\u6587\u4ef6\u7ba1\u7406\u5668\u4f5c\u4e3a\u5e94\u7528\u5e93\u6539\u9020\u7684\u5b9e\u9a8c\u5e94\u7528\uff0c\u7ed9\u540e\u7eed\u5176\u4ed6\u5e94\u7528\u6539\u9020\u63d0\u4f9b\u5207\u5b9e\u53ef\u884c\u7684\u601d\u8def\u548c\u65b9\u6848\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u5206\u5c42\u8bbe\u8ba1\u56fe","text":"\u6574\u4f53\u4ecd\u7136\u9075\u5faa PO \u8bbe\u8ba1\u7406\u5ff5\uff0c\u6839\u636e\u4e1a\u52a1\u9700\u8981\uff0c\u5c06\u6587\u7ba1\u4e1a\u52a1\u5c42\u8fdb\u884c 3 \u5c42\u5212\u5206\uff1a "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-dde-file-manager # \u5e94\u7528\u4ed3\u5e93\n\u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 test_xxx_001.py\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u00a0\u251c\u2500\u2500 __init__.py\n\u2502 \u00a0\u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u00a0\u251c\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u00a0\u251c\u2500\u2500 base_widget.py # \u65b9\u6cd5\u57fa\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 title_widget.py # title \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 right_view_widget.py # right view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 left_view_widget.py # left view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 pop_widget.py # pop \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 dfm_widget.py # \u65b9\u6cd5\u7684\u7edf\u4e00\u51fa\u53e3\n\u2502 \u00a0\u2514\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 tag # \u7528\u4f8b\u6807\u7b7e\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 xxx.csv # \u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2514\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u57fa\u7c7b","text":" \u7ee7\u627f\u6838\u5fc3\u5c42\u7684\u5404\u4e2a\u6a21\u5757\u7c7b\u3002 \u62bd\u53d6\u64cd\u4f5c\u5c42\u7684\u4e00\u4e9b\u57fa\u7840\u65b9\u6cd5\u3002 \u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u7684\u4e00\u4e9b\u516c\u5171\u65b9\u6cd5\u3002 \u8def\u5f84\u7ec4\u88c5\u65b9\u6cd5\u3002 \u4e00\u4e9b\u4e1a\u52a1\u5c42\u76f8\u5173\u7684\u53d8\u91cf\u3001\u5e38\u91cf\u3001shell\u547d\u4ee4\u3001\u5750\u6807\u3002 \u65b9\u6cd5\u57fa\u7c7b\u7684\u5199\u6cd5\uff1a from src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u64cd\u4f5c\u5c42","text":" \u6a21\u5757\u5212\u5206 \u6309\u7167\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u6587\u7ba1\u4e3b\u754c\u9762\u5206\u4e3a\u4e09\u4e2a\u533a\u57df\uff1a\u6807\u9898\u680f\u3001\u53f3\u8fb9\u89c6\u56fe\u533a\u57df\u3001\u5de6\u8fb9\u89c6\u56fe\u533a\u57df \u5f39\u7a97\uff1a\u8bbe\u7f6e\u754c\u9762\u5f39\u7a97\u3001\u4fdd\u9669\u7bb1\u5f39\u7a97\u3001\u5220\u9664\u786e\u8ba4\u5f39\u7a97\u3001\u53ca\u5404\u79cd\u7f51\u7edc\u5f39\u7a97 \u53f3\u952e\u83dc\u5355\uff1a\u6682\u65f6\u4e0d\u8003\u8651\u4e3a\u5355\u72ec\u7684\u6a21\u5757\uff0c\u8003\u8651\u4ee5\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6848\u505a\u6210\u516c\u5171\u5e93\u3002 \u5404\u4e2a\u6a21\u5757\u53ea\u7ee7\u627f\u57fa\u7c7b from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u6784\u9020\u51fd\u6570\u91cc\u9762\u4e0d\u6784\u9020\u5bf9\u8c61\uff0c\u53ef\u4ee5\u521d\u59cb\u5316\u4e00\u4e9b\u53d8\u91cf\u3002 \u4e0d\u540c\u7684\u5b9a\u4f4d\u65b9\u6848\u8c03\u7528\u4e0d\u540c\u7684\u5b9a\u4f4d\u5de5\u5177\u5bf9\u8c61\u3002 self.dog\nself.ui\nself.d_bus\n \u65b9\u6cd5\u7f16\u5199 \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u5e94\u7528\u5c42","text":" \u7ee7\u627f\u64cd\u4f5c\u5c42\u7684\u6240\u6709\u7c7b\u3002 \u4ec5\u4ec5\u7528\u4e8e\u7528\u4f8b\u4e2d\u5bfc\u5165\u65b9\u4fbf\uff0c\u4e0d\u505a\u5176\u4ed6\u4e8b\u60c5\u3002 class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n DfmAssert \u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u7ee7\u627f\uff0c\u65b9\u4fbf\u4f7f\u7528\u65ad\u8a00\u8bed\u53e5\u3002 from apps.dde_file_manager.widget.dfm_widget import DfmWidget\nfrom public.assert import Assert\nclass DfmAssert(Assert):\ndef assert_file_exists_in_desktop(self, file_name):\nself.assert_file_exists(f\"~/Desktop{file_name}\")\n...\nDfmWidget().get_file_in_desktop()\n \u7528\u4f8b\u91cc\u9762\u76f4\u63a5\u7ee7\u627f\uff0c\u65b9\u4fbf\u5728\u7528\u4f8b\u91cc\u9762\u4f7f\u7528 self \u8fdb\u884c\u65ad\u8a00\uff0c\u66f4\u7b26\u5408\u65ad\u8a00\u7684\u4f7f\u7528\u4e60\u60ef\uff0c\u7528\u4f8b\u903b\u8f91\u4e0a\u66f4\u6e05\u695a\u3002 class BaseCase(DfmAssert):\npass\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\nself.assert_file_exists_in_desktop(\"xxx\")\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u903b\u8f91\u4e3e\u4f8b","text":"\u7528\u4f8b\u4ee3\u7801\u8c03\u7528\u903b\u8f91\u4e3e\u4f8b\uff1a # BaseWidget\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n# =============================================\n# TitleWidget\nclass TitleWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_title_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# RightViewWidget\nclass RightViewWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_right_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# =============================================\n# \u51fa\u53e3 DfmWidget\nclass DfmWidget(TitleWidget, RightViewWidget):\npass\n# =============================================\n# in case\nfrom apps.dde_file_manager.widget.dfm_widget import DfmWidget\ndfm = DfmWidget()\ndfm.click_xxx_title_by_ui()\ndfm.click_xxx_right_by_ui()\ndfm.dog.print_desc()\ndfm.ui.print_number()\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u5de5\u7a0b\u6539\u9020\u5b9e\u65bd\u6b65\u9aa4","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_2","title":"1\u3001\u5de5\u7a0b\u4ee3\u7801\u62c9\u53d6","text":"1.1. \u5c06\u81ea\u52a8\u5316\u57fa\u7840\u6846\u67b6\u7684\u529f\u80fd\u62c9\u5230\u672c\u5730 Autotest Basic Frame \uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame 1.2. \u5c06\u5e94\u7528\u5e93\u4ee3\u7801\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u5e94\u7528\u5e93\u7684\u4ed3\u5e93\u547d\u540d\u5e94\u8be5\u662f\u957f\u8fd9\u6837\u7684 autotest_deepin_xxx\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_2","title":"2\u3001\u8c03\u6574\u5de5\u7a0b\u76ee\u5f55","text":"\u6309\u7167 \u65b9\u6848\u8bbe\u8ba1-\u76ee\u5f55\u7ed3\u6784 \u8fdb\u884c\u76ee\u5f55\u8c03\u6574\uff0c\u5c3d\u91cf\u4f7f\u7528\u7f16\u8f91\u5668\u8fdb\u884c\u76f8\u5e94\u7684\u8c03\u6574\uff0c\u7f16\u8f91\u5668\u63a8\u8350\u4f7f\u7528 Pycharm \uff0c\u4ee5\u4e0b\u64cd\u4f5c\u5747\u5728 Pycharm \u91cc\u9762\u53ef\u5b9e\u73b0\u3002 2.1. \u9700\u8981\u79fb\u52a8 py \u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u76f4\u63a5\u5728\u7f16\u8f91\u5668\u91cc\u9762\uff0c\u4f7f\u7528\u9f20\u6807\u9009\u4e2d\u5e76\u6309\u4f4f\uff0c\u4e4b\u540e\u62d6\u52a8\u5230\u76ee\u6807\u4f4d\u7f6e\u5373\u53ef\uff0cPycharm \u4f1a\u5c3d\u53ef\u80fd\u7684\u81ea\u52a8\u89e3\u51b3\u79fb\u52a8\u5bfc\u81f4\u7684\u8def\u5f84\u95ee\u9898\u3002\u6ce8\u610f\uff0c\u6211\u8bf4\u7684\u662f\u201c\u5c3d\u53ef\u80fd\u201d\uff0c\u6709\u4e9b\u9a9a\u64cd\u4f5c\u7f16\u8f91\u5668\u662f\u65e0\u6cd5\u81ea\u52a8\u5904\u7406\u7684\u3002\u5982\u679c\u6ca1\u6709\u88ab\u7f16\u8f91\u5668\u81ea\u52a8\u5904\u7406\u7684\u8def\u5f84\u95ee\u9898\uff0c\u540e\u7eed\u53ea\u80fd\u624b\u52a8\u89e3\u51b3\u3002 2.2. \u9700\u8981\u91cd\u547d\u540d\u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u5728\u7f16\u8f91\u5668\u91cc\u9762\u9009\u4e2d\u6587\u4ef6\uff0c\u7136\u540e\u4f7f\u7528\u5feb\u6377\u952e Shift + F6 \uff08\u5982\u679c\u5feb\u6377\u952e\u6ca1\u53cd\u5e94\uff0c\u6587\u4ef6\u53f3\u952e\u83dc\u5355 Refactor \u2014\u2014 Rename\uff09\uff0c\u7136\u540e\u5728\u8f93\u5165\u6846\u4e2d\u8f93\u5165\u8981\u91cd\u547d\u540d\u7684\u540d\u79f0\uff0c\u540c\u65f6\uff0c\u786e\u8ba4\u52fe\u9009 Search for references \u548c Search in comments and strings \u8fd9\u4e24\u4e2a\u9009\u9879\uff0c\u6700\u540e\u6309\u56de\u8f66\u6216\u8005\u9f20\u6807\u70b9 Refactor \u3002 \u6ce8\u610f\uff0c\u6b64\u65f6\u7f16\u8f91\u5668\u53ef\u80fd\u4f1a\u63d0\u793a\u4f60\uff0c\u4f60\u8fd9\u4e2a\u91cd\u547d\u540d\u7684\u64cd\u4f5c\u5173\u8054\u4e86\u591a\u4e2a\u6a21\u5757\uff0c\u5b83\u88ab\u591a\u4e2a\u5730\u65b9\u90fd\u4f7f\u7528\u5230\u4e86\uff0c\u76f8\u5173\u7684\u6a21\u5757\u662f\u5426\u4e5f\u4e00\u8d77\u6539\u540d\u4e86\uff0c\u8fd9\u4e0d\u5e9f\u8bdd\u5417\uff0c\u7528\u8fd9\u4e2a\u529f\u80fd\u5c31\u662f\u60f3\u628a\u5173\u8054\u5230\u7684\u90fd\u4fee\u6539\uff0c\u4e0d\u7136\u6211\u4e3a\u4ec0\u4e48\u4e0d\u7528\u6587\u7ba1\u7684\u91cd\u547d\u540d\u529f\u80fd\u5462\uff0c\u522b\u60f3\u4e86\uff0c\u76f4\u63a5\u70b9\u5de6\u4e0b\u89d2\u7684 Refactor \u6309\u94ae\uff0c\u5c31\u662f\u5e72\u3002 \u7c7b\u540d\u3001\u51fd\u6570\u540d\u7684\u91cd\u547d\u540d\u90fd\u5c3d\u91cf\u91c7\u7528\u8fd9\u79cd\u65b9\u6848\uff0c\u56e0\u4e3a\u7f16\u8f91\u5668\u4f1a\u81ea\u52a8\u7ed9\u6211\u4eec\u627e\u5230\u5173\u8054\u7684\u5730\u65b9\uff0c\u7136\u540e\u540c\u6b65\u4fee\u6539\u6389\u3002\u4f60\u53ef\u5343\u4e07\u522b\u76f4\u63a5\u5220\u4e86\u4fee\u6539\u540d\u79f0\uff0c\u4e0d\u7136\u4f60\u53ef\u80fd\u4f1a\u82b1\u4e0a\u4e00\u5929\u7684\u65f6\u95f4\u6765\u89e3\u51b3\u91cd\u547d\u540d\u7684\u95ee\u9898\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u5b9e\u73b0\u6838\u5fc3\u5e93\u63a5\u53e3","text":"3.1. BaseWidget \u5728 BaseWidget \u91cc\u9762\u628a\u8be5\u5199\u7684\u90fd\u5199\u597d\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u4e0a\u9762\u7684\u8bbe\u8ba1\u7406\u5ff5\u6765\u5199\u3002 \u5982\u679c\u4f60\u5acc\u9ebb\u70e6\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u6587\u7ba1\u7684\u5b9e\u9645\u5de5\u7a0b\u4ee3\u7801 autotest_dde_file_manager : https://gerrit.uniontech.com/admin/repos/autotest_dde_file_manager \u3002 3.2. \u64cd\u4f5c\u5c42 \u5982\u679c\u4f60\u662f\u65b0\u5199\u9879\u76ee\uff0c\u4f60\u4f1a\u53d1\u73b0\u4e00\u5207\u90fd\u662f\u90a3\u4e48\u7684\u7b80\u5355\u3001\u76f4\u63a5\uff0c\u6309\u7167\u6211\u4eec\u63d0\u4f9b\u7ed9\u4f60\u7684\u63a5\u53e3\u5199\u7528\u4f8b\u7684\u64cd\u4f5c\u65b9\u6cd5\u5c31\u597d\u4e86\u3002 \u5982\u679c\u4f60\u662f\u60f3\u5bf9\u539f\u6765\u7684\u5de5\u7a0b\u8fdb\u884c\u6539\u9020\uff0c\u4f60\u9700\u8981\u6309\u7167\u6838\u5fc3\u5e93\u65b9\u6cd5\u7684\u8c03\u7528\uff0c\u5c06\u4f60\u4e4b\u524d\u5199\u7684\u6bcf\u4e2a\u65b9\u6848\u8fdb\u884c\u5bf9\u5e94\u7684\u4fee\u6539\uff0c\u5305\u62ec\u7c7b\u548c\u65b9\u6cd5\u7684\u547d\u540d\u3001\u65b9\u6cd5\u5185\u6240\u8981\u7528\u5230\u4e0d\u540c\u5b9a\u4f4d\u65b9\u6cd5\u7684\u5199\u6cd5\u4fee\u6539\u3002 \u8fd9\u65f6\u5019\u4f60\u53ef\u80fd\u4f60\u7684\u4ee3\u7801\u4e2d\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u62a5\u9519\uff0c\u4e0d\u7528\u62c5\u5fc3\uff0c\u4f60\u53ef\u4ee5\u4ece\u4e1a\u52a1\u903b\u8f91\u51fa\u53d1\uff0c\u60f3\u6e05\u695a\u8fd9\u4e2a\u65b9\u6cd5\u662f\u5e72\u4ec0\u4e48\u7684\u3001\u64cd\u4f5c\u7684\u5bf9\u8c61\u662f\u4ec0\u4e48\u3001\u53c2\u6570\u662f\u4ec0\u4e48\uff0c\u6ce8\u610f\u8fd9\u4e9b\u4fee\u6539\u662f\u4f1a\u5f71\u54cd\u5230\u7528\u4f8b\u4ee3\u7801\u91cc\u9762\u7684\uff0c\u6ca1\u5173\u7cfb\uff0c\u7528\u4f8b\u91cc\u9762\u672c\u6765\u4e5f\u5e94\u8be5\u88ab\u5173\u8054\u4fee\u6539\u3002 3.3. \u628a\u914d\u7f6e\u6a21\u5757\u5199\u597d\uff0c\u8fd9\u90e8\u5206\u57fa\u672c\u53ef\u4ee5\u590d\u5236\u6587\u7ba1\u7684\u4ee3\u7801\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4_1","title":"4\u3001\u8def\u5f84\u5904\u7406","text":"4.1. \u5bfc\u5165\u8def\u5f84 \u65b9\u6cd5\u548c\u7528\u4f8b\u4e2d\u90fd\u4f1a\u6d89\u53ca\u5230\u5bfc\u5165\u8def\u5f84\u7684\u4fee\u6539\uff0c\u5728\u4fee\u6539\u8def\u5f84\u65f6\uff0c\u5efa\u8bae\u4f60\u4f7f\u7528 Ctrl + Shift + R \u5168\u5c40\u66ff\u6362\uff0c\u4f1a\u5c06\u6574\u4e2a\u9879\u76ee\u4e0b\u7684\u76f8\u540c\u5730\u65b9\u90fd\u4fee\u6539\u5230\uff0c\u5f53\u7136\uff0c\u4f60\u4e5f\u53ef\u4ee5\u5728\u5c0f\u5f39\u7a97\u4e2d\u4fee\u6539\u5168\u5c40\u66ff\u6362\u4e3a\u5c40\u90e8\u76ee\u5f55\u4e0b\u66ff\u6362\u3002\u5904\u7406\u90a3\u79cd\u6ca1\u6709\u5173\u8054\u5173\u7cfb\uff0c\u4f46\u662f\u53c8\u662f\u76f8\u540c\u540d\u79f0\u7684\u91cd\u547d\u540d\uff0c\u6211\u4e5f\u63a8\u8350\u4f7f\u7528\u8fd9\u79cd\u65b9\u5f0f\u8fdb\u884c\u91cd\u547d\u540d\u3002 \u6ce8\u610f\uff0c\u5168\u5c40\u66ff\u6362\u7684\u65b9\u5f0f\u4efb\u7136\u65e0\u6cd5\u4fdd\u8bc1\u771f\u7684\u5168\u5c40\u88ab\u66ff\u6362\u4e86\uff08\u53ef\u80fd\u662f\u7f16\u8f91\u5668\u7684 Bug \u5427\uff09\uff0c\u6240\u4ee5\u4f60\u4ecd\u7136\u9700\u8981\u624b\u52a8\u770b\u4e0b\u5404\u5904\u662f\u5426\u4fee\u6539\u5230\u4f4d\u3002 4.2. \u8d44\u6e90\u8def\u5f84 \u4e00\u4e9b\u7528\u4f8b\u8d44\u6e90\u9700\u8981\u6839\u636e config.py \u91cc\u9762\u7684\u8def\u5f84\u914d\u7f6e\u8fdb\u884c\u8d44\u6e90\u8def\u5f84\u7684\u62fc\u63a5\uff0c\u5982\u679c\u4f60\u539f\u6765\u672c\u6765\u5c31\u6709\u4e00\u4e2a\u51fd\u6570\u4e13\u95e8\u7528\u4e8e\u7ec4\u88c5\u8def\u5f84\u7684\uff0c\u90a3\u4f60\u53ea\u9700\u8981\u4fee\u6539\u8fd9\u4e00\u4e2a\u5730\u65b9\u5c31\u597d\u4e86\uff0c\u5982\u679c\u4f60\u4e4b\u524d\u5e76\u6ca1\u6709\u8fd9\u6837\u7684\u8bbe\u8ba1\uff0c\u90a3\u53ef\u80fd\u9700\u8981\u4fee\u6539\u5927\u91cf\u6d89\u53ca\u5230\u8d44\u6e90\u8def\u5f84\u7684\u5730\u65b9\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5","title":"5\u3001\u8c03\u8bd5\u548c\u7f16\u5199\u7528\u4f8b","text":"\u4ee5\u4e0a\u51e0\u4e2a\u6b65\u9aa4\u505a\u5b8c\uff0c\u57fa\u672c\u5c31\u53ef\u4ee5\u8fdb\u884c\u7528\u4f8b\u4ee3\u7801\u7684\u8c03\u8bd5\u4e86\uff0c\u8fd9\u90e8\u5206\u5de5\u4f5c\u4e3b\u8981\u89e3\u51b3\u4f60\u4e4b\u524d\u51e0\u4e2a\u6b65\u9aa4\u9057\u6f0f\u7684\u95ee\u9898\uff0c\u5982\u679c\u6240\u6709\u7528\u4f8b\u90fd\u8c03\u8bd5\u901a\u8fc7\u4e86\uff0c\u90a3\u4e48\u5de5\u7a0b\u6539\u9020\u5c31\u5168\u90e8\u5b8c\u6210\u4e86\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/","title":"AT \u5f00\u53d1\u89c4\u8303","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u5f00\u53d1\u89c4\u8303\u662f\u6839\u636e\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fd0\u884c\u4e24\u5e74\u591a\u6765\uff0c\u9047\u5230\u95ee\u9898\u89e3\u51b3\u95ee\u9898\u800c\u5f62\u6210\u7684\u4e00\u4e9b\u89e3\u51b3\u65b9\u6848\uff0c\u6216\u8005\u8bf4\u7ecf\u9a8c\u603b\u7ed3\uff1b\u8fd9\u4e9b\u7ecf\u9a8c\u7b26\u5408\u6211\u4eec\u73b0\u9636\u6bb5 AT \u6240\u5e94\u7528\u7684\u573a\u666f\u9700\u8981\uff0c\u4e5f\u662f\u6211\u4eec\u7ecf\u8fc7\u957f\u671f\u601d\u8003\uff0c\u4e0d\u65ad\u8bd5\u9519\u4e0d\u65ad\u4fee\u6b63\uff0c\u5e76\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u5b9e\u8df5\u4e2d\u68c0\u9a8c\u8fc7\u53ef\u884c\u7684\u3002\u4ee5\u6b64\uff0c\u5e0c\u671b\u80fd\u5e2e\u52a9\u53c2\u4e0e\u5230\u81ea\u52a8\u5316\u7684\u76f8\u5173\u4eba\u5458\u51cf\u5c11\u8bd5\u9519\u6210\u672c\uff0c\u66f4\u597d\u3001\u66f4\u5feb\u7684\u7f16\u5199\u7528\u4f8b\u53ca\u7ef4\u62a4\u7528\u4f8b\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_1","title":"\u4e00\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u89c4\u8303","text":"\u6807\u7b7e\u5316\u7ba1\u7406\u6587\u6863\u8bf7\u53c2\u8003\uff1a \u300a\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u64cd\u4f5c\u6307\u5f15\u300b \u4ee5\u4e0b\u8bf4\u51e0\u4e2a\u5bb9\u6613\u51fa\u73b0\u7684\u95ee\u9898\uff1a"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1","title":"1. \u5bf9\u5e94\u5173\u7cfb","text":" \u5199\u5b8c\u81ea\u52a8\u5316\u7528\u4f8b\u4e4b\u540e\uff0c\u8bf7\u5728 CSV \u6587\u4ef6\u4e2d\u6807\u8bb0\u7528\u4f8b\u7684 ID\u3001\u7b49\u7ea7\u3002\u4e3a\u4e86\u63d0\u9192\u6807\u8bb0\uff0c\u6267\u884c\u7528\u4f8b\u65f6\u5728\u9996\u884c\u4f1a\u8f93\u51fa ERROR \u65e5\u5fd7\uff1a CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94\u7684 ID\uff1b \u5728\u6700\u7ec8\u63d0\u4ea4\u4ee3\u7801\u4e4b\u524d\uff0c\u4f60\u9700\u8981\u5728 CSV \u6587\u4ef6\u91cc\u9762\u5c06ID\u3001\u7528\u4f8b\u7b49\u7ea7\u7b49\u6807\u7b7e\u8865\u5168\uff0c\u5982\u679c CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94 ID\uff0c\u540e\u7eed\u5728\u6279\u91cf\u6267\u884c\u7684\u65f6\u5019\uff0c\u8fd9\u4e9b\u7528\u4f8b\u662f\u4e0d\u4f1a\u6267\u884c\u7684\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2","title":"2. \u540d\u79f0\u4e00\u81f4","text":" CSV \u6587\u4ef6\u7684\u6587\u4ef6\u540d\u3001\u7528\u4f8b\u51fd\u6570\u4e2d\u95f4\u7684\u540d\u79f0\u4e00\u81f4\u3001\u7528\u4f8b py \u6587\u4ef6\u4e2d\u95f4\u7684\u540d\u79f0\uff0c\u8fd9\u4e09\u4e2a\u540d\u79f0\u4e00\u81f4\u3002 \u4e3e\u4f8b\uff1a # test_music_001.py\ndef test_music_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u90a3\u4e48 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e3a music.csv\u3002 AT \u6846\u67b6\u5e95\u5c42\u4ee3\u7801\u5b9e\u73b0\u662f\u5c06 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e0e\u7528\u4f8b\u51fd\u6570\u540d\u79f0\u540d\u79f0\uff08item.name\uff09\u8fdb\u884c\u5bf9\u5e94\uff0c\u56e0\u6b64\uff0c\u6ce8\u610f CSV \u6587\u4ef6\u540d\u79f0\u5bf9\u5e94\u7684\u662f\u7528\u4f8b\u51fd\u6570\u540d\u79f0\uff0c\u5373 def test_music_001 \u91cc\u9762\u7684 music \uff0c\u800c\u4e0d\u662f test_music_001.py \u91cc\u9762\u7684 music \u3002 \u8fd9\u91cc\u7ec6\u7ec6\u54c1\u4e00\u4e0b\u54c8~ \u5982\u679c\u4f60\u5c06\u4e0a\u4f8b\u5199\u6210\u4e86\u8fd9\u6837: # test_music_001.py\ndef test_movie_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u7528\u4f8b\u6267\u884c\u6ca1\u95ee\u9898\uff0c\u4f46\u662f\u6807\u7b7e\u5316\u7ba1\u7406\u662f\u4e0d\u751f\u6548\u7684\uff0c\u6846\u67b6\u65e0\u6cd5\u5c06 music.csv\u6587\u4ef6\u91cc\u9762\u6807\u7b7e\uff0c\u6dfb\u52a0\u5230 test_movie_001\u8fd9\u4e2a\u7528\u4f8b\u4e2d\uff0c\u56e0\u4e3a\u4ed6\u4eec\u6ca1\u6709\u5bf9\u5e94\u5173\u7cfb\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#tag","title":"\u4e8c\u3001\u5206\u652f\u53ca tag \u7ba1\u7406\u89c4\u8303","text":"\u53c2\u8003\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u4ee3\u7801\u7ba1\u7406\u89c4\u8303\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2-tag","title":"2. \u5e94\u7528\u5e93 tag","text":" \u5e94\u7528\u5e93 tag \u6839\u636e\u5e94\u7528\u4ea4\u4ed8\u8282\u70b9\u751f\u6210\uff0c\u6bcf\u6b21\u6253 tag \u4e4b\u524d\uff0c\u76f8\u5173\u6d4b\u8bd5\u4eba\u5458\u9700\u8981\u8fdb\u884c\u7528\u4f8b\u8c03\u8bd5\uff1b \u8c03\u8bd5\u7528\u4f8b\u662f\u6307\u7684\u5728\u5168\u67b6\u6784\uff08x86\u3001arm\u3001mips\uff09\u4e0a\u8c03\u8bd5\u901a\u8fc7\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\u8fbe\u5230 90% \u4ee5\u4e0a\u624d\u80fd\u6253 tag\uff0c\u901a\u8fc7 Jenkins \u6267\u884c\u5668\u6267\u884c\u7528\u4f8b\uff0c\u4fdd\u7559\u901a\u8fc7\u7387\u7ed3\u679c\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\uff1a\u901a\u8fc7\u7528\u4f8b\u6570 / (\u603b\u7528\u4f8b\u6570 - \u5df2\u5e9f\u5f03\u7528\u4f8b) \u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u7b97\u901a\u8fc7 Jenkins \u6267\u884c\u5668 \u4f60\u53ef\u80fd\u4f1a\u5728\u4e00\u4e2a\u4ea4\u4ed8\u5468\u671f\u5185\u6301\u7eed\u7684\u8fdb\u884cAT\u7528\u4f8b\u8c03\u8bd5\uff0c\u4f46\u662f\u6700\u7ec8 AT \u7528\u4f8b\u6253 tag \u7684\u5e94\u7528\u7248\u672c\uff0c\u9700\u8981\u4f7f\u7528\u5e94\u7528\u96c6\u6210\u4ea4\u4ed8\u7684\u6700\u65b0\u5e94\u7528\u7248\u672c\uff0c\u53ef\u4ee5\u4f7f\u7528\u5e94\u7528\u7684\u63d0\u6d4b\u7248\u672c\uff1b\u4e00\u5b9a\u8981\u786e\u4fdd\u8c03\u8bd5\u7528\u4f8b\u7684\u5e94\u7528\u7248\u672c\u662f\u6700\u65b0\u7684\uff0c\u4e0d\u7136\u96c6\u6210\u8fdb\u53bb\u4e4b\u540e\uff0c\u6301\u7eed\u96c6\u6210\u5c31\u4f1a\u51fa\u95ee\u9898\uff1b tag \u53f7\u600e\u4e48\u6253\uff1f \u6839\u636e\u6301\u7eed\u96c6\u6210\u7684\u8981\u6c42\u751f\u6210\uff0c\u5176\u4e2d\u5e94\u7528\u7248\u672c\u53f7\u9700\u8981\u4e0e\u9879\u76ee\u7ecf\u7406\u786e\u8ba4\u672c\u6b21\u5373\u5c06\u96c6\u6210\u7684\u5e94\u7528\u7248\u672c\u53f7\u662f\u591a\u5c11\uff1b tag \u7684 commit \u4fe1\u606f\u683c\u5f0f\uff1a # commit msg\nversion:5.6.5\n \u5176\u4e2d 5.6.5 \u5199\u5e94\u7528\u7684\u96c6\u6210\u7248\u672c\u53f7\u3002 \u751f\u6210 tag \u7684\u547d\u4ee4\u53c2\u8003\uff1a\u300aGit \u6807\u7b7e\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3-tag","title":"3. \u57fa\u7840\u6846\u67b6 tag","text":"\u57fa\u7840\u6846\u67b6 tag \u4e0d\u4e0e\u4e1a\u52a1\u6302\u94a9\uff0c\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u6309\u9700\u53d1\u5e03\u7248\u672c\uff0c\u5728\u6839\u76ee\u5f55\u4e0b CURRENT \u6587\u4ef6\u4e2d\u8bb0\u5f55\u7684\u5f53\u524d\u7248\u672c\u53f7\u548c\u5386\u53f2\u7248\u672c\u53f7\uff0c\u53ca\u5176\u5bf9\u5e94\u65b0\u589e\u4e86\u54ea\u4e9b\u529f\u80fd\uff0c\u6709\u52a9\u4e8e\u5e94\u7528\u9009\u62e9\u5408\u9002\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\u3002 # CURRENT\n[current]\ntag = 0.9.5\n \u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u7684 control \u6587\u4ef6\u8bb0\u5f55\u5f53\u524d\u5e94\u7528\u5e93\u4f9d\u8d56\u7684\u57fa\u7840\u5e93\u7248\u672c\u3002 # control\n[Depends]\nautotest-basic-frame = 0.9.5\n \u7528\u4f8b\u5728\u6267\u884c\u65f6\u4f1a\u6821\u9a8c\u4e24\u4e2a\u6587\u4ef6\u7684\u7248\u672c\u53f7\u662f\u5426\u4e00\u81f4\uff0c\u5982\u679c\u4e0d\u4e00\u81f4\uff0c\u4f1a\u6253\u5370 error \u65e5\u5fd7\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_2","title":"\u4e09\u3001\u4ed3\u5e93\u6743\u9650\u7ba1\u7406","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_1","title":"1. \u57fa\u7840\u6846\u67b6","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u4ed3\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame \u57fa\u7840\u6846\u67b6\u4e0d\u5141\u8bb8\u533f\u540d\u8bbf\u95ee\uff0c\u5982\u679c\u4f60\u767b\u5f55 gerrit \u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u8bbf\u95ee\u4ee5\u4e0a\u94fe\u63a5\uff0c\u5219\u9700\u8981\u7533\u8bf7\u8bbf\u95ee\u6743\u9650\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_1","title":"2. \u5e94\u7528\u4ed3\u5e93","text":" \u81ea\u52a8\u5316\u5e94\u7528\u4ed3\u5e93\uff1a https://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684 app_name \u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_3","title":"\u56db\u3001\u65b9\u6cd5\u7f16\u5199&\u8c03\u7528\u89c4\u8303","text":"\u65b9\u6cd5\u7f16\u5199\u6574\u4f53\u8bbe\u8ba1\u601d\u8def\u53c2\u8003\uff1a[\u300aAT\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b]"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_2","title":"1. \u65b9\u6cd5\u7f16\u5199","text":"\u5199\u65b9\u6cd5\u7684\u65f6\u5019\u6ce8\u610f\u65b9\u6cd5\u5f52\u5c5e\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget\uff0c\u65b9\u6cd5\u662f\u5728\u54ea\u4e2a\u533a\u57df\u64cd\u4f5c\u7684\uff0c\u5c31\u5199\u5728\u54ea\u4e2a\u7c7b\u91cc\u9762\u3002 \u4e3e\u4f8b\uff1a from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n\"\"\"\u70b9\u51fb\u6807\u9898\u680fxxx\"\"\"\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_2","title":"2. \u65b9\u6cd5\u8c03\u7528","text":" \u5728\u7528\u4f8b\u4e2d\u8c03\u7528\u65b9\u6cd5\uff0c\u901a\u8fc7\u8be5\u5e94\u7528\u552f\u4e00\u7684\u51fa\u53e3\u8fdb\u884c\u8c03\u7528\uff0c\u6bd4\u5982\u6587\u7ba1\uff1a class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n \u4e0d\u8981\u5728\u7528\u4f8b\u4e2d\u5355\u72ec\u53bb\u8c03\u7528 TitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u8fd9\u4e9b\u7c7b\uff0c\u5426\u5219\u540e\u671f\u7528\u4f8b\u4f1a\u53d8\u5f97\u4e0d\u597d\u7ef4\u62a4\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_4","title":"\u4e94\u3001\u7528\u4f8b\u7f16\u5199\u89c4\u8303","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_3","title":"1. \u57fa\u4e8e\u7c7b\u5199\u7528\u4f8b","text":"\u6240\u6709\u7528\u4f8b\u90fd\u5e94\u8be5\u57fa\u4e8e\u7c7b\u53bb\u5199\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001(self):\n\"\"\"\u97f3\u4e50\u542f\u52a8\"\"\"\n \u6ce8\u610f\u4ee5\u4e0b\u51e0\u70b9\uff1a \u7c7b\u540d\u4e0d\u8981\u968f\u4fbf\u53d6\uff0c\u540c\u4e00\u4e2a\u5e94\u7528\u5e94\u8be5\u4f7f\u7528\u540c\u4e00\u4e2a\u7c7b\u540d\uff0c\u7528\u4f8b\u7c7b\u540d\u79f0\u5fc5\u987b\u4ee5 Test \u5f00\u5934\uff0c\u9075\u5faa\u5927\u9a7c\u5cf0\u547d\u540d\u89c4\u8303\uff1b \u7528\u4f8b\u7c7b\u7ee7\u627f BaseCase\uff0c\u4e00\u4e2a\u5e94\u7528\u53ea\u6709\u4e00\u4e2a BaseCase \u4e00\u4e2a py \u6587\u4ef6\u91cc\u9762\u53ea\u6709\u4e00\u4e2a\u7c7b\uff0c\u6211\u4eec\u79f0\u4e3a\u4e00\u4e2a\u6d4b\u8bd5\u7c7b\uff1b \u4e00\u4e2a\u7c7b\u91cc\u9762\u53ef\u4ee5\u6709\u591a\u4e2a\u7528\u4f8b\u51fd\u6570\uff0c\u8fd9\u53d6\u51b3\u8fd9\u6761\u7528\u4f8b\u6709\u591a\u5c11\u4e2a\u6d4b\u8bd5\u70b9\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001_1(self):\n\"\"\"\u4efb\u52a1\u680f\u542f\u52a8\u97f3\u4e50\"\"\"\ndef test_music_001_2(self):\n\"\"\"\u542f\u52a8\u5668\u542f\u52a8\u97f3\u4e50\"\"\" \ndef test_music_001_3(self):\n\"\"\"\u684c\u9762\u542f\u52a8\u97f3\u4e50\"\"\"\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_3","title":"2. \u7528\u4f8b\u51fd\u6570\u89c4\u8303","text":" \u7528\u4f8b\u51fd\u6570\u4ee5 test \u5f00\u5934\uff0c\u9075\u5faa\u86c7\u5f62\u547d\u540d\u89c4\u8303\uff0c\u4e2d\u95f4\u4e3a\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0\uff0c\u540e\u9762\u52a0\u7528\u4f8b ID\uff0c\u6700\u540e\u52a0\u6d4b\u8bd5\u70b9\u5e8f\u53f7\uff0c\u5373 test_${module}_${case_id}[_${index}] \uff1b \u6bd4\u5982\uff1atest_music_001_1\uff0cindex \u4ece 1 \u5f00\u59cb\u3002 \u51fd\u6570\u529f\u80fd\u8bf4\u660e\u91cc\u9762\u5199\u7528\u4f8b\u6807\u9898\uff0c\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u6807\u9898\u5373\u53ef\uff0c\u6ce8\u610f\u7528\u4e09\u5bf9\u53cc\u5f15\u53f7\uff0c\u4e0d\u8981\u7528\u5176\u4ed6\u6ce8\u91ca\uff0c\u66f4\u4e0d\u8981\u7528\u4e95\u53f7\u6ce8\u91ca\u5199\u7528\u4f8b\u6807\u9898\uff1b \u76f4\u63a5\u590d\u5236 PMS \u7528\u4f8b \u7528\u4f8b\u6b65\u9aa4\u76f4\u63a5\u5c06 PMS \u4e0a\u7528\u4f8b\u6b65\u9aa4\u548c\u9884\u671f\u590d\u5236\u8fdb\u6765\uff0c\u7136\u540e\u8fdb\u884c\u6279\u91cf\u6ce8\u91ca\uff08ctrl + /\uff09\uff0c\u5728\u6ce8\u91ca\u7684\u57fa\u7840\u4e0a\u53bb\u5199\u7528\u4f8b\u811a\u672c\u4f1a\u66f4\u52a0\u65b9\u4fbf\u5168\u9762\uff0c\u4e5f\u6bd4\u4f60\u81ea\u5df1\u5199\u6ce8\u91ca\u66f4\u8282\u7ea6\u65f6\u95f4\uff1a \u4e3e\u4f8b\uff0cPMS \u7528\u4f8b\uff1a \u76f4\u63a5\u9009\u4e2d\u7528\u4f8b\u5185\u5bb9\uff0c\u590d\u5236\u4e0b\u6765\uff0c\u7136\u540e\u7c98\u8d34\u5230\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c\u4e2d\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\n \u4e0a\u4f8b\u4e2d\u4e95\u53f7\u6ce8\u91ca\u90e8\u5206\u5c31\u662f\u76f4\u63a5\u4ece PMS \u4e0a\u590d\u5236\u8fc7\u6765\u7684\uff0c\u5728\u6b64\u57fa\u7840\u4e0a\u5199\u7528\u4f8b\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\nmusic = DeepinMusicWidget()\nmusic.click_singer_btn_in_music_by_ui()\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\nmusic.click_icon_mode_in_music_by_ui()\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\nmusic.double_click_first_singer_in_singer_icon_view_by_ui()\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\nself.assert_xxx\n \u4f60\u770b\uff0c\u975e\u5e38\u6e05\u695a\u6bcf\u4e00\u6b65\u5728\u505a\u4ec0\u4e48\uff0c\u91cd\u70b9\u662f\u7701\u53bb\u4e86\u5199\u6ce8\u91ca\u7684\u65f6\u95f4\uff0c\u771f\u7684\u7092\u9e21\u65b9\u4fbf\u3002 \u4e0d\u5199 if __name__ == '__main__':\uff0c\u4e0d\u5199\u591a\u4f59\u7684\u4ee3\u7801\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3","title":"3. \u6570\u636e\u9a71\u52a8","text":" \u5982\u679c\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u662f\u76f8\u540c\u7684\uff0c\u53ea\u662f\u4e00\u4e9b\u53c2\u6570\u53d8\u5316\uff0c\u5c3d\u91cf\u4f7f\u7528\u6570\u636e\u9a71\u52a8\u6765\u5b9e\u73b0\u7528\u4f8b\uff1b \u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u6570\u636e\u9a71\u52a8\u7684\u6570\u636e\uff0c\u4e0d\u80fd\u56e0\u6b64\u5f15\u5165\u4f9d\u8d56\uff0c\u5c3d\u91cf\u4f7f\u7528\u4e00\u4e9b\u6807\u51c6\u5e93\u80fd\u8bfb\u53d6\u7684\u6587\u4ef6\u683c\u5f0f\uff0c\u6bd4\u5982 json\u3001ini\u3001CSV\u3001xml\u3001txt \u7b49\u6587\u4ef6\u683c\u5f0f\uff1b\u4e0d\u5efa\u8bae\u4f7f\u7528 Yaml\u3001Excel\u3001MySQL \u7b49\u6570\u636e\u683c\u5f0f\uff1b \u8bfb\u53d6\u6570\u636e\u65f6\u4e5f\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff0c\u5982\u4f7f\u7528 pandas \u5904\u7406 CSV \u5c31\u5c5e\u4e8e\u5927\u6750\u5c0f\u7528\u4e86\uff0c\u6b63\u5e38\u7684\u6570\u636e\u9a71\u52a8\u8fd8\u6ca1\u5230\u9700\u8981\u5927\u6570\u636e\u5206\u6790\u6765\u5904\u7406\u7684\u5730\u6b65\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u5728 widget/ddt/ \u76ee\u5f55\u4e0b\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5199\u6cd5\uff1a @pytest.mark.parametrize(\"value\", data)\ndef test_smb_049(self, value):\n \u4ee5\u4e0a\u8fd9\u79cd\u53c2\u6570\u5316\u7684\u5199\u6cd5\u672c\u8eab\u6ca1\u4ec0\u4e48\u95ee\u9898\uff0c\u4f46\u662f\uff0c\u8fd9\u91cc\u5fc5\u987b\u8981\u8865\u5145\u4e00\u4e2a\u6ca1\u6709\u7528\u7684\u5c0f\u77e5\u8bc6\uff1a \u5982\u679c\u53c2\u6570\u5316\u6570\u636e\u91cc\u9762\u7684\u5b57\u7b26\u4f1a\u539f\u5c01\u4e0d\u52a8\u7684\u8f93\u51fa\u5230 item.name \u91cc\u9762\uff0c\u663e\u793a\u975e\u5e38\u4e0d\u4f18\u96c5\uff0c\u800c\u4e14\u53ef\u4ee5\u4f1a\u5f15\u5165\u4e00\u4e9b\u610f\u60f3\u4e0d\u5230\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u611f\u53d7\u4e00\u4e0b\uff1a \u53c2\u6570\uff1a data = [\n\"\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\", \"qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678\",\n]\n \u73b0\u8c61\u662f\u8fd9\u6837\u8272\u513f\u7684\uff1a test_smb_049.py::TestFileManager::test_smb_049[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09]\ntest_smb_049.py::TestFileManager::test_smb_049[qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui]\ntest_smb_049.py::TestFileManager::test_smb_049[12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678]\n \u8bf4\u5b9e\u8bdd\uff0c\u770b\u7740\u5fc3\u91cc\u5835\u5f97\u614c\uff0c\u5982\u679c\u8fd9\u91cc\u9762\u5305\u542b\u4e00\u4e9b\u7279\u6b8a\u5b57\u7b26\u6216\u8005\u662f\u8d85\u957f\uff0c\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u5f88\u5947\u5999\u7684\u4e8b\u60c5\u53d1\u751f\u3002 parametrize \u91cc\u9762\u6709\u4e2a\u53c2\u6570\uff1aids\uff0c\u53ef\u4ee5\u89e3\u51b3\u6b64\u7c7b\u95ee\u9898\uff0c\u5c31\u50cf\u8fd9\u6837\uff1a @pytest.mark.parametrize(\"value\", data, ids=[1, 2, 3])\ndef test_smb_049(self, value):\n \u518d\u6765\u611f\u53d7\u4e00\u4e0b\uff1a test_smb_049.py::TestFileManager::test_smb_049[1]\ntest_smb_049.py::TestFileManager::test_smb_049[2]\ntest_smb_049.py::TestFileManager::test_smb_049[3]\n \u660e\u663e\u597d\u591a\u4e86\uff0c\u6240\u4ee5\u5c3d\u91cf\u4f7f\u7528 ids \u8fd9\u4e2a\u53c2\u6570\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 fixture \u7684\u6570\u636e\u9a71\u52a8\u65b9\u5f0f\uff0c\u6846\u67b6\u867d\u7136\u652f\u6301\uff0c\u4f46\u53ef\u8bfb\u6027\u6bd4\u8f83\u5dee\uff1b\u5982\u679c\u4f60\u4e0d\u77e5\u9053\u8fd9\u53e5\u8bdd\u5728\u8bf4\u5565\uff0c\u90a3\u4f60\u53ef\u4ee5\u5ffd\u7565\uff0c\u6211\u4e5f\u4e0d\u6253\u7b97\u8be6\u7ec6\u8bf4\u8fd9\u79cd\u5b9e\u73b0\u65b9\u5f0f\uff0c\u64cd\u4f5c\u6bd4\u8f83\u9a9a\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4","title":"4. \u65ad\u8a00\u8d44\u6e90","text":" \u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u76f4\u63a5\u653e\u5728\u7528\u4f8b\u6a21\u5757\u7684\u540c\u7ea7\u76ee\u5f55\u4e0b\u7684 assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0 + \u7528\u4f8b ID \u547d\u540d\uff1b \u56fe\u50cf\u8bc6\u522b\u65ad\u8a00\uff0c\u4e0d\u8981\u622a\u53d6\u4e00\u5f20\u5f88\u5927\u7684\u56fe\uff0c\u56fe\u7247\u8d44\u6e90\u5305\u542b\u7684\u5143\u7d20\u592a\u591a\u4e86\uff0c\u975e\u5e38\u5bb9\u6613\u53d7\u5230\u9700\u6c42\u5f71\u54cd\uff0c\u5efa\u8bae\u662f\u8fdb\u884c\u5c40\u90e8\u7684\u65ad\u8a00\uff1b \u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u5339\u914d\u5ea6\u662f 0.9\uff0c\u5982\u679c\u65ad\u8a00\u7684\u573a\u666f\u5bf9\u4e8e\u7cbe\u786e\u5ea6\u8981\u6c42\u6ca1\u90a3\u4e48\u9ad8\uff0c\u53ef\u4ee5\u5728\u65ad\u8a00\u8bed\u53e5\u91cc\u9762\u4f20\u5165\u5c0f\u4e8e 0.9 \u7684\u53c2\u6570\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5","title":"5. \u5143\u7d20\u5b9a\u4f4d","text":" \u7528\u4e8e\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u4e2d\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u547d\u540d\u4e3a\u8be5\u5143\u7d20\u7684\u540d\u79f0\uff1b \u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u622a\u53d6\u65f6\u5c3d\u91cf\u7cbe\u786e\u5230\u8fd9\u4e2a\u5177\u4f53\u7684\u6309\u94ae\uff0c\u56fe\u7247\u4e5f\u4e0d\u8981\u592a\u5927\uff1b \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u64cd\u4f5c\u8f83\u5feb\uff0c\u5408\u7406\u52a0\u5165\u7b49\u5f85\u65f6\u95f4\u80fd\u63d0\u9ad8\u7528\u4f8b\u7684\u7a33\u5b9a\u6027\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6","title":"6. \u7528\u4f8b\u8d44\u6e90","text":" \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u4f7f\u7528\u5230\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u6bd4\u5982\u97f3\u4e50\u53ef\u80fd\u9700\u8981\u4e00\u4e9b mp3 \u7684\u8d44\u6e90\u7528\u4e8e\u6d4b\u8bd5\uff0c\u5b58\u653e\u5728 widget/case_res \u76ee\u5f55\u4e0b\uff0c\u524d\u63d0\u662f\u8fd9\u4e9b\u8d44\u6e90\u4e0d\u8d85\u8fc7 10M\uff1b \u5982\u679c\u662f\u4e00\u4e9b\u6bd4\u8f83\u5927\u7684\u8d44\u6e90\uff0c\u5efa\u8bae\u653e\u5230\u7edf\u4e00\u7684 ftp \u670d\u52a1\u5668 \uff08ftp://10.8.10.245\uff09\uff0c\u9700\u8981\u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\u518d\u4e0b\u8f7d\u4e0b\u6765\uff1b f\"wget ftp://{Config.FTP_IP}/uploads/\u591a\u5a92\u4f53/\u5f71\u9662/auto/{file_name};unzip {file_name};rm -rf {file_name};\"\n \u6d4b\u8bd5\u8d44\u6e90\u4e0b\u8f7d\u5230\u5e94\u7528 widget/case_res \u76ee\u5f55\u4e0b\uff1b \u7981\u6b62\u5c06\u6d4b\u8bd5\u8d44\u6e90\u5b58\u653e\u5728\u4e2a\u4eba\u7684\u673a\u5668\u4e0a\uff1b \u5e94\u8be5\u5c3d\u91cf\u4fdd\u8bc1\uff0c\u4e00\u4e2a\u8d44\u6e90\u5728\u4e00\u6b21\u7528\u4f8b\u6267\u884c\u4e2d\u53ea\u9700\u8981\u4e0b\u8f7d\u4e00\u6b21\uff0c\u6240\u4ee5\u4f60\u4e0d\u80fd\u6bcf\u6b21\u4f7f\u7528\u7684\u65f6\u5019\u90fd\u53bb\u4e0b\u8f7d\uff0c\u8fd9\u6837\u53ef\u80fd\u4f1a\u8017\u8d39\u5927\u91cf\u7684\u7f51\u7edc\u8d44\u6e90\uff0c\u800c\u56e0\u4e3a\u5148\u5224\u65ad\u672c\u5730\u662f\u5426\u5b58\u5728\u6b64\u8d44\u6e90\uff0c\u5982\u679c\u4e0d\u5b58\u5728\u518d\u53bb\u4e0b\u8f7d\uff1b \u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u5c06\u8d44\u6e90\u62f7\u8d1d\u5230\u5bf9\u5e94\u7684\u6d4b\u8bd5\u76ee\u5f55\u4e0b\uff0c\u6bd4\u5982\u5c06 mp3 \u6587\u4ef6\u62f7\u8d1d\u5230 ~/Music \u76ee\u5f55\u4e0b\uff0c\u4f46\u662f\u6211\u4eec\u66f4\u5efa\u8bae\u4f60\u4f7f\u7528\u53d1\u9001\u5feb\u6377\u94fe\u63a5\u7684\u65b9\u5f0f\u66ff\u4ee3\u62f7\u8d1d\u7684\u64cd\u4f5c\uff0c\u56e0\u4e3a\u5728\u62f7\u8d1d\u5927\u6587\u4ef6\u65f6\u662f\u5f88\u6d88\u8017\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u800c\u521b\u5efa\u94fe\u63a5\u5219\u4e0d\u4f1a\uff1b @classmethod\ndef recovery_many_movies_in_movie_by_cmd(cls):\n\"\"\"\u6062\u590d\u591a\u4e2a\u89c6\u9891\u6587\u4ef6\u81f3\u89c6\u9891\u76ee\u5f55\u4e2d\"\"\"\nwork_path = f\"/home/{Config.USERNAME}/Videos/auto\"\ncode_path = f\"{Config.CASE_RES_PATH}/auto\"\ncls.run_cmd(f\"rm -rf {work_path};mkdir {work_path}\")\nsleep(1)\nflag = False\nif not exists(code_path):\ncls.run_cmd(f\"mkdir -p {code_path}\")\nflag = True\nlogger.info(f\"ln -s {code_path}/* {work_path}/\")\ncls.run_cmd(\nf\"cd {code_path}/;\"\nf\"{cls.wget_file('auto.zip') if flag else ''}\"\nf\"ln -s {code_path}/* {work_path}/ > /dev/null 2>&1\"\n)\n \u8d44\u6e90\u4e0b\u8f7d\u8fc7\u7a0b\u4e2d\u6ce8\u610f\u8d85\u65f6\u7684\u95ee\u9898\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u5f88\u5927\uff0c\u8981\u7279\u522b\u6ce8\u610f\u8fd9\u95ee\u9898\uff0c\u5982\u679c\u4f60\u4f7f\u7528\u5f3a\u5236\u7b49\u5f85\u4e0b\u8f7d\u7ed3\u675f( os.system )\uff0c\u53ef\u80fd\u4f1a\u9020\u6210\u7528\u4f8b\u6267\u884c\u65f6\u957f\u53d8\u5f97\u4e0d\u53ef\u63a5\u53d7\uff0c\u76ee\u524d\u6211\u4eec\u53d1\u73b0\u5728\u6301\u7eed\u96c6\u6210\u73af\u5883\u6267\u884c\u65f6\u7f51\u7edc\u4e0b\u8f7d\u901f\u5ea6\u5f88\u6162\uff0c\u6240\u4ee5\u8d85\u65f6\u673a\u5236\u662f\u5f88\u6709\u5fc5\u8981\u7684\uff1brun_cmd \u65b9\u6cd5\u6709\u4e00\u4e2a\u9ed8\u8ba4\u8d85\u65f6\u7684\u65f6\u95f4\uff0c\u4f60\u53ef\u4ee5\u6839\u636e\u8d44\u6e90\u5927\u5c0f\u5bf9\u8d85\u65f6\u65f6\u95f4\u8fdb\u884c\u8c03\u6574\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_5","title":"\u516d\u3001\u7528\u4f8b\u8c03\u8bd5\u6280\u5de7","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_4","title":"1. \u65e5\u5fd7","text":" \u4e00\u5b9a\u8981\u5148\u770b\u62a5\u9519\uff0c\u770b error \u65e5\u5fd7\uff0c\u901a\u5e38\u80fd\u660e\u786e\u7684\u544a\u8bc9\u4f60\u5177\u4f53\u54ea\u91cc\u4ee3\u7801\u62a5\u9519\uff1b \u7ed3\u5408\u62a5\u9519\u70b9\u524d\u9762\u7684error\u3001 info \u548c debug \u65e5\u5fd7\u770b\u5426\u662f\u6b63\u5e38\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_4","title":"2. \u65ad\u70b9\u8c03\u8bd5","text":" \u65b9\u6cd5\u62a5\u9519\uff1a \u5728\u65b9\u6cd5\u5e93\u4e2d\u627e\u5230\u5bf9\u5e94\u7684\u65b9\u6cd5\uff0c\u5355\u72ec\u8c03\u7528\uff0c\u770b\u662f\u5426\u80fd\u6b63\u5e38\u6267\u884c\uff1b \u901a\u5e38\u5355\u4e2a\u65b9\u6cd5\u7684\u6267\u884c\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u62a5\u9519\uff0c\u5f88\u5feb\u5c31\u80fd\u6392\u67e5\u51fa\u95ee\u9898\uff1b\u5728\u65b9\u6cd5\u5185\u90e8\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u65b9\u6cd5\u5185\u90e8\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u8c03\u7528\u6ca1\u95ee\u9898\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u62a5\u9519\u7684\u65b9\u6cd5\u524d\u9762\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u7528\u4f8b\u7684\u4e1a\u52a1\u903b\u8f91\u548c\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u65ad\u8a00\u62a5\u9519\uff1a \u65ad\u8a00\u4e3a\u6570\u636e\u65ad\u8a00\uff0c\u6839\u636e\u8868\u8fbe\u5f0f\u8fdb\u884c\u65ad\u8a00\u8bed\u53e5\u8fdb\u884c\u4fee\u6539\uff1b \u6587\u4ef6\u751f\u6210\u7c7b\u65ad\u8a00\uff0c\u67e5\u770b\u662f\u5426\u9700\u8981\u52a0\u7b49\u5f85\u65f6\u95f4\uff1b \u56fe\u50cf\u65ad\u8a00\uff0c\u5728\u65ad\u8a00\u8bed\u53e5\u5904\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u7528\u4f8b\u8fd0\u884c\u5230\u65ad\u8a00\u5904\u4f1a\u505c\u6b62\uff0c\u67e5\u770b\u6b64\u65f6\u65ad\u8a00\u7684\u56fe\u7247\u4e0e\u7528\u4f8b\u6267\u884c\u7684\u73b0\u573a\u5b58\u5728\u4ec0\u4e48\u5dee\u5f02\uff0c\u6b64\u65f6\u4e5f\u53ef\u4ee5\u8fdb\u884c\u91cd\u65b0\u622a\u56fe\uff0c\u4ece\u800c\u66ff\u6362\u65b0\u7684\u56fe\u7247\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3_1","title":"3. \u8fdc\u7a0b\u6267\u884c","text":" \u8fdc\u7a0b\u6267\u884c\u6307\u7684\u662f\u7f16\u8f91\u5668\u901a\u8fc7\u6307\u5b9a\u8fdc\u7a0b\u89e3\u91ca\u5668\u6267\u884c\u81ea\u52a8\u5316\u4ee3\u7801\uff1b \u8fdc\u7a0b\u6267\u884c\u7684\u597d\u5904\u662f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u7684 Debug \u8fd0\u884c\uff0c\u4e0d\u7528\u5728\u6d4b\u8bd5\u673a\u4e0a\u6253\u5f00\u7f16\u8f91\u5668\uff0c\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u66f4\u5feb\uff1b \u652f\u6301\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u7684\u7f16\u8f91\u5668\uff1a \u4e13\u4e1a\u7248 Pycharm VScode \uff0c\u9700\u8981\u4f7f\u7528\u63d2\u4ef6 Remote-SSH \u8fdc\u7a0b\u6267\u884c\u914d\u7f6e \u4ee5 Pycharm \u4e3a\u4f8b\uff1a File \u2014> Settings \u2014> Project \u2014> Python Interpreter \u2014> \u53f3\u8fb9\u8bbe\u7f6e\u6309\u94ae \u2014> Add... \u2014> SSH Interpreter \u2014> New server configuration(\u586b\u5165host\u548cusername) \u2014> Next \u2014> password\uff08\u6d4b\u8bd5\u673a\u5bc6\u7801\uff09 \u2014> Interpreter(\u9009\u62e9\u8fdc\u7a0b\u89e3\u91ca\u5668) \u2014> Finish "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4_1","title":"4. \u73af\u5883\u6e05\u7406","text":" \u5982\u679c\u7528\u4f8b\u91cc\u9762\u7684 teardown \u6ca1\u6709\u6267\u884c\uff0c\u5927\u6982\u7387\u662f\u56e0\u4e3a setup \u91cc\u9762\u4ee3\u7801\u62a5\u9519\uff0c\u8fd9\u4e24\u4e2a\u662f\u4e00\u5bf9\u7684\uff0csetup \u91cc\u9762\u62a5\u9519\uff0cteardown \u91cc\u9762\u7684\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\uff1b \u76ee\u524d\u6211\u4eec\u5df2\u7ecf\u5c06\u5404\u5e94\u7528\u7684 clean_all \u8fd9\u4e2a fixture \u6539\u6210\u4e86\u7ec8\u7ed3\u5668\uff0c\u786e\u4fdd\u59cb\u7ec8\u80fd\u6267\u884c\u5230\u8fd9\u6b65\uff0c\u4f46\u662f\u7528\u4f8b\u91cc\u9762\u7684 fixture\uff0c\u8fd8\u662f\u9700\u8981\u6211\u4eec\u5c0f\u5fc3\u5904\u7406\uff1b \u8981\u6267\u884c clean_all \u9700\u8981\u5728\u7f16\u8f91\u5668\u8fd0\u884c\u53c2\u6570\u52a0 --clean yes\uff0c\u5199\u7528\u4f8b\u7684\u65f6\u5019\u8bf7\u52a0\u4e0a\uff0c\u4e0d\u7136\u4f60\u4e0d\u786e\u5b9a\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u7684\u73af\u5883\u662f\u5426\u6062\u590d\uff1b setup \u53ef\u4ee5\u4e0d\u8981\uff0c\u5c06 setup \u653e\u5230\u7528\u4f8b\u91cc\u9762\u662f\u4e00\u79cd\u7a33\u59a5\u7684\u505a\u6cd5\uff0cteardown \u4e00\u5b9a\u8981\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5_1","title":"5. \u5143\u7d20\u5b9a\u4f4d\u4e0d\u51c6\uff08\u5750\u6807\u8fd4\u56de\u4e0d\u5bf9\uff09","text":" \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u53ef\u80fd\u53d7\u5230\u7a97\u53e3 ID \u7684\u53d8\u5316\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u9ed8\u8ba4\u53d6\u6700\u65b0\u7684\u4e00\u4e2a\u7a97\u53e3\u7528\u4e8e\u5b9a\u4f4d\uff0c\u4f46\u5982\u679c\u5b9e\u9645\u9700\u8981\u5b9a\u4f4d\u7684\u4e0d\u662f\u6700\u65b0\u7684\u7a97\u53e3\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u91cd\u65b0\u5b9e\u4f8b\u5316\u65b9\u6cd5\u7c7b\u5bf9\u8c61\uff0c\u5e76\u5728\u7c7b\u4e2d\u4f20\u5165\u5bf9\u5e94\u7684\u7a97\u53e3\u5e8f\u53f7\uff1b \u57fa\u4e8e\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u76ee\u524d\u9047\u5230\u7684\u7b14\u8bb0\u672c\u4e0a\uff0c\u7531\u4e8e\u5c4f\u5e55\u7f29\u653e\u6bd4\u4f8b\u4e3a 1.25\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u6211\u4eec\u9ed8\u8ba4\u4f7f\u7528\u7f29\u653e\u6bd4\u4f8b\u4e3a 1\uff1b \u57fa\u4e8e\u56fe\u50cf\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u76ee\u6807\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b \u57fa\u4e8e OCR \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u6587\u5b57\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u540c\u6837\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6_1","title":"6. \u952e\u9f20\u64cd\u4f5c\u4e0d\u51c6","text":" \u9f20\u6807\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6bd4\u5982\u53f3\u952e\u3001\u53cc\u51fb\u65e0\u54cd\u5e94\uff1b \u952e\u76d8\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6216\u8005\u5ef6\u8fdf\u8f93\u5165\uff0c\u6bd4\u5982\u7528\u4f8b\u9700\u8981\u8f93\u5165\u201c\u6211\u662f\u4e2d\u56fd\u4eba\u201d\uff0c\u5b9e\u9645\u53ea\u8f93\u5165\u4e86\u201c\u6211\u56fd\u4eba\u201d\uff1b \u4ee5\u4e0a\u95ee\u9898\u6392\u9664\u5e94\u7528\u5361\u987f\u7b49\u95ee\u9898\uff0c\u5927\u6982\u7387\u662f\u7531\u4e8e\u5de5\u5177\u7684\u95ee\u9898\uff0c\u76ee\u524d\u952e\u9f20\u64cd\u4f5c\u6211\u4eec\u4f7f\u7528\u4e09\u4e2a\u5de5\u5177\uff1aDogtail \u63d0\u4f9b\u7684\u952e\u9f20\u5de5\u5177\u3001PyAutoGUI\u3001Xdotool \uff1b \u6709\u540c\u5b66\u53ef\u80fd\u8981\u8bf4\u4e3a\u5565\u8981\u7528\u4e09\u4e2a\u554a\uff0c\u7528\u4e00\u4e2a\u4e0d\u5c31\u597d\u4e86\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u5404\u6709\u4f18\u70b9\u5404\u6709\u7f3a\u70b9\u3002 \u5982\u679c\u4f60\u9047\u5230\u952e\u9f20\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u8bd5\u8bd5\u901a\u8fc7\u4e0d\u540c\u7684\u5de5\u5177\u64cd\u4f5c\uff1b\u952e\u76d8\u8f93\u5165\u5ef6\u8fdf\u7684\u95ee\u9898\uff0c\u4e00\u822c\u662f\u56e0\u4e3a\u8f93\u5165\u901f\u5ea6\u592a\u5feb\u4e86\uff0c\u7cfb\u7edf\u6ca1\u53cd\u5e94\u8fc7\u6765\uff0c\u5e38\u89c1\u4e8e ARM \u548c MIPS \u4e0a\uff0c\u4fee\u6539\u53c2\u6570 delay_time \u7684\u503c\uff0c\u5355\u4f4d\u4e3a\u6beb\u79d2\uff1b # mouse_key.py\n@classmethod\ndef input_message(cls, message, delay_time=300, interval=0.2):\n\"\"\"\n \u8f93\u5165\u5b57\u7b26\u4e32\n :param message: \u8f93\u5165\u7684\u5185\u5bb9\n :param delay_time: \u5ef6\u8fdf\u65f6\u95f4\n :param interval:\n :return:\n \"\"\"\n \u5982\u679c\u4e0d\u662f\u65b9\u6cd5\u7684\u95ee\u9898\uff0c\u5219\u9700\u8981\u7ee7\u7eed\u548c\u5f00\u53d1\u4e00\u8d77\u6392\u9664\uff0c\u662f\u5426\u4e3a\u5e94\u7528\u63a5\u53d7\u952e\u9f20\u4fe1\u53f7\u5904\u7406\u7684\u95ee\u9898\uff0c\u8fd9\u7c7b\u60c5\u51b5\u6211\u4eec\u4e5f\u662f\u9047\u5230\u8fc7\u7684\uff0c\u5177\u4f53\u95ee\u9898\u5177\u4f53\u5206\u6790\u3002 \u6bd4\u5982\u5f71\u9662\u5c31\u91cd\u5199\u4e86\u4e00\u4e2a\u53f3\u952e\u7684\u65b9\u6cd5\uff1a # base_widget.py\n@classmethod\ndef right_click(cls, _x=None, _y=None):\n\"\"\"\n \u91cd\u5199\u5e95\u5c42\u5355\u51fb\u9f20\u6807\u53f3\u952e\n \u89e3\u51b3\u5f71\u9662\u53f3\u952e\u89e6\u53d1release\u4e8b\u4ef6\u7684\u95ee\u9898\uff08\u53f3\u952e\u4e3b\u7a97\u53e3\u4f1a\u64ad\u653e\u89c6\u9891\uff09\n \"\"\"\ncls.mouse_down(_x, _y, button=3)\nsleep(0.1)\ncls.mouse_up(button=3)\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_6","title":"\u4e03\u3001\u5176\u4ed6\u4e0d\u4e3a\u4eba\u77e5\u7684\u7ec6\u8282","text":" \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u5c3d\u91cf\u7f16\u5199\u540c\u4e00\u4e2a\u5e94\u7528\u6216\u6a21\u5757\u7684\u7528\u4f8b\uff0c\u80fd\u5bf9\u8be5\u7528\u4f8b\u5df2\u6709\u65b9\u6cd5\u719f\u6089\uff0c\u907f\u514d\u8fc7\u591a\u91cd\u590d\u4e1a\u52a1\u4ee3\u7801\u7684\u5c01\u88c5\uff1b \u76f8\u540c\u7684\u573a\u666f\u4e0b\uff0c\u5404\u67b6\u6784\u7b49\u5f85\u65f6\u95f4\u4e0d\u540c\uff0c\u5efa\u8bae\u4f7f\u7528\u6846\u67b6\u63d0\u4f9b\u7684 sleep\uff0c\u6211\u4eec\u505a\u4e86\u4e0d\u540c\u67b6\u6784\u7684\u500d\u6570\u653e\u5927\uff1b \u7f16\u5199\u7528\u4f8b\u65f6\uff0c\u5c3d\u91cf\u8003\u8651\u5230\u6bcf\u4e00\u6b65\u5f02\u5e38\u540e\u7684\u73af\u5883\u6062\u590d\uff0c\u9700\u8981\u5efa\u8bae\u8fd9\u79cd\u610f\u8bc6\uff0c\u968f\u65f6\u8981\u8003\u8651\u5230\uff0c\u8fd9\u6b65\u64cd\u4f5c\u6709\u6ca1\u6709\u53ef\u80fd\u51fa\u9519\uff0c\u51fa\u9519\u4e86\u6539\u600e\u4e48\u529e\uff1b \u63d0\u4ea4\u4ee3\u7801\u7684\u65f6\u5019\u6ce8\u610f\u4e0d\u8981\u628a\u4e00\u4e9b\u4e34\u65f6\u7684\u6d4b\u8bd5\u8d44\u6e90\u63d0\u4ea4\u8fdb\u53bb\u4e86\uff0c\u6bd4\u5982\u6d4b\u8bd5\u4e86\u4e00\u4e2a\u5f71\u7247\uff0c\u6709\u4e9b\u540c\u5b66\u4e60\u60ef\u4f7f\u7528 git add . \uff0c\u7136\u540e\u5c31\u5168\u90e8\u63d0\u4ea4\u5230\u4ee3\u7801\u4ed3\u5e93\u4e86\uff0c\u8fd9\u6837\u5373\u4f7f\u540e\u671f\u628a\u5927\u6587\u4ef6\u5220\u4e86\uff0c.git \u6587\u4ef6\u91cc\u9762\u4e5f\u4f1a\u5f88\u5927\uff0c\u9020\u6210\u4ee3\u7801\u4ed3\u5e93\u53d8\u5f97\u5341\u5206\u81c3\u80bf\u3002 \u66f4\u591a\u7ec6\u8282\u67e5\u770b\uff1a\u300aAT\u7ecf\u9a8c\u603b\u7ed3\u300b"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/","title":"AT \u6267\u884c\u5668\u4f7f\u7528\u6307\u5317","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/5/25\n# Author : litao\n# =============================================\n Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1","title":"1\u3001\u529f\u80fd\u4ecb\u7ecd","text":" \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7cfb\u7edf\u8bed\u8a00\u8bbe\u7f6e\uff0c\u5206\u8fa8\u7387\u8bbe\u7f6e\u53ca\u7528\u4f8b\u6267\u884c\u73af\u5883\u642d\u5efa\uff1b \u652f\u6301 IP \u4e3a 15 \u7f51\u6bb5\u7684 AMD \u67b6\u6784\u6d4b\u8bd5\u673a\u955c\u50cf\u88c5\u673a\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u6307\u5b9a\u5e94\u7528\uff0c\u6307\u5b9a\u8303\u56f4\u6807\u7b7e\u7684\u7528\u4f8b\u6267\u884c\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u72b6\u6001\u68c0\u67e5\uff0c\u662f\u5426\u6709\u6b63\u5728\u8fd0\u884c\u7684\u6d4b\u8bd5\uff1b \u652f\u6301\u914d\u7f6e\u7528\u4f8b\u6267\u884c\u65f6\u957f\uff0c\u9632\u6b62\u4efb\u52a1\u963b\u585e\uff1b \u652f\u6301\u6839\u636e\u5e94\u7528\u7248\u672c\u81ea\u52a8\u67e5\u627e\u5bf9\u5e94\u7684\u7528\u4f8b tag\uff1b \u652f\u6301\u5f02\u5e38\u5904\u7406\u548c\u6d4b\u8bd5\u5b8c\u6210\u7684\u5b9e\u65f6\u6d88\u606f\u901a\u77e5\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2job","title":"2\u3001Job \u4ecb\u7ecd","text":"\u4ee5\u4e0b\u6309\u6267\u884c\u6d41\u7a0b\u7684\u987a\u5e8f\u4ecb\u7ecd\uff0c\u6bcf\u4e00\u6b65\u90fd\u53ef\u4ee5\u5355\u72ec\u6267\u884c\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1_1","title":"1\u3001\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/AT_test/ \u6574\u4e2a\u6d41\u7a0b\u7684\u4e3b\u5165\u53e3\uff0c\u901a\u8fc7\u8fd9\u4e2a\u5165\u53e3\uff0c\u8fde\u540c\u6574\u4e2a\u6d4b\u8bd5\u6d41\u7a0b\uff0c\u955c\u50cf\u88c5\u673a\uff0c\u73af\u5883\u90e8\u7f72\uff0c\u6d4b\u8bd5\u5e94\u7528\u53ca\u751f\u6210\u62a5\u544a\u3002 \u53c2\u6570\u4ecb\u7ecd\uff1a \u6d4b\u8bd5\u673a\uff1a\u6240\u6709\u89c4\u6574\u5230\u56fa\u5b9a\u533a\u57df\u7684\u6d4b\u8bd5\u673a\uff0c\u901a\u8fc7\u6d4b\u8bd5\u540c\u5b66\u5bf9\u6d4b\u8bd5\u673a\u7684\u4e60\u60ef\u547d\u540d\uff0c\u5728\u540e\u53f0\u6620\u5c04\u6d4b\u8bd5\u673a\u7684\u8be6\u7ec6\u4fe1\u606f\uff0c\u62ec\u53f7\u4e2d\u4e3a\u6d4b\u8bd5\u673a IP \u7684\u6700\u540e\u4e00\u4f4d\uff1b \u6d4b\u8bd5\u5e94\u7528\uff1a\u6307\u5b9a\u7684\u6d4b\u8bd5\u5e94\u7528\u7684\u5305\u540d\uff0c\u7cfb\u7edf\u6839\u636e\u540d\u79f0\u81ea\u52a8\u62c9\u53d6\u5bf9\u5e94\u7684\u4ed3\u5e93\u4ee3\u7801\uff1b deb\u5305\u4e0b\u8f7d\u5730\u5740\uff1a\u6d4b\u8bd5\u4e0a\u8ff0\u5e94\u7528\u65f6\uff0c\u9700\u8981\u5b89\u88c5\u7684deb\u5305\u4e0b\u8f7d\u5730\u5740\uff0c\u591a\u4e2a\u5730\u5740\u7528\u201c,\u201d\u9694\u5f00\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff1b \u8303\u56f4\u6807\u7b7e\uff1a\u6267\u884c\u6d4b\u8bd5\u7528\u4f8b\u7684\u6807\u7b7e\u8303\u56f4\uff0c\u5bf9\u5e94\u7528\u4f8b\u4ee3\u7801 csv \u6587\u4ef6\u4e2d\u7684\u6807\u7b7e\u4fe1\u606f\uff0c\u4ee5 pytest \u7684mark\u8bed\u6cd5\u7f16\u5199\uff1b \u7cfb\u7edf\u8bed\u8a00\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u8bed\u8a00\u73af\u5883\uff1b \u5206\u8fa8\u7387\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u5206\u8fa8\u7387\u73af\u5883\uff1b \u955c\u50cf\u5730\u5740\uff1a\u955c\u50cf\u4ed3\u5e93\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u901a\u8fc7 PXE \u88c5\u673a\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u88c5\u673a\u73af\u8282\uff08\u76ee\u524d\u4ec5\u652f\u6301\u90e8\u5206 AMD \u67b6\u6784\u7684\u88c5\u673a\uff09\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2pxe","title":"2\u3001PXE \u88c5\u673a","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/IOS_install/ \u8f93\u5165\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\uff0cIP\uff0c\u5bc6\u7801\uff0c\u955c\u50cf\u5730\u5740\u540e\uff0c\u81ea\u52a8\u88c5\u673a\uff0c\u76ee\u524d\u4ec5\u652f\u6301\u56fa\u5b9a 15 \u7f51\u6bb5\u7684\u90e8\u5206 AMD \u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#3","title":"3\u3001\u6b21\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/all_client_test/ \u8be5\u5165\u53e3\u4e0e\u4e3b\u5165\u53e3\u529f\u80fd\u57fa\u672c\u4e00\u81f4\uff0c\u53ea\u662f\u5265\u79bb\u4e86PXE\u88c5\u673a\u6d41\u7a0b\uff0c\u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7684\u6267\u884c\u6d41\u7a0b\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#4","title":"4\u3001\u73af\u5883\u90e8\u7f72","text":"Jenkins url\uff1ahttps://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/env/build?delay=0sec \u8bbe\u7f6e\u6d4b\u8bd5\u673a\u7684\u7cfb\u7edf\u8bed\u8a00\uff0c\u5206\u8fa8\u7387\u53ca\u5b89\u88c5\u6d4b\u8bd5\u6240\u9700\u7684\u4f9d\u8d56\u5305\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#5","title":"5\u3001\u53d1\u9001\u4ee3\u7801","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/send_code/ \u6839\u636e\u6d4b\u8bd5\u5e94\u7528\u540d\u79f0\uff0c\u62c9\u53d6\u5bf9\u5e94\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u5e76\u6839\u636e\u6d4b\u8bd5\u673a\u4e0a\u5e94\u7528\u7248\u672c\u5207\u6362\u5230\u5bf9\u5e94\u7684tag\u7248\u672c\uff0c\u82e5\u672a\u627e\u5230tag\u7248\u672c\uff0c\u5219\u4f7f\u7528\u6700\u65b0\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u518d\u6839\u636e\u5e94\u7528\u5e93\u4ee3\u7801\u4e2d\u914d\u7f6e\u7684\u57fa\u7840\u5e93\u7248\u672c\uff0c\u62c9\u53d6\u57fa\u7840\u5e93\u4ee3\u7801\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#6","title":"6\u3001\u7528\u4f8b\u6267\u884c","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/run_test/ \u8fd0\u884c\u6d4b\u8bd5\u673a\u4e0a\u7684\u7528\u4f8b"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/","title":"AT \u7528\u4f8b\u7b5b\u9009\u6307\u5317","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u7528\u4f8b\u7b5b\u9009\u6807\u51c6\uff0c\u662f\u6311\u9009\u5408\u9002\u7684\u6587\u672c\u7528\u4f8b\u8fdb\u884c\u81ea\u52a8\u5316\u7528\u4f8b\u8f6c\u5316\u7684\u4e00\u4e9b\u901a\u7528\u6807\u51c6\u3002 \u8fc7\u53bb\u6211\u4eec\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u5b9e\u8df5\u8fc7\u7a0b\u4e2d\uff0c\u5199\u4e86\u4e0d\u5c11\u81ea\u52a8\u5316\u7528\u4f8b\uff0c\u968f\u7740\u9700\u6c42\u7684\u8fed\u4ee3\uff0c\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u81ea\u7136\u8150\u5316\uff0c\u56e0\u800c\u9700\u8981\u5728\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\u5bf9\u81ea\u52a8\u5316\u7528\u4f8b\u8fdb\u884c\u7ef4\u62a4\uff0c\u5728\u7ef4\u62a4\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u6211\u4eec\u53d1\u73b0\uff0c\u6709\u4e9b\u7528\u4f8b\u7ef4\u62a4\u8d77\u6765\u592a\u96be\u4e86\uff0c\u8c03\u8bd5\u7528\u4f8b\u8017\u8d39\u5927\u91cf\u65f6\u95f4\uff0c\u6210\u672c\u5f88\u9ad8\u3002 \u56e0\u6b64\uff0c\u6211\u4eec\u603b\u7ed3\u4e00\u4e9b\u81ea\u52a8\u5316\u7528\u4f8b\u9009\u578b\u7684\u6807\u51c6\uff0c\u4ee5\u4f18\u5316\u540e\u7eed\u81ea\u52a8\u5316\u7528\u4f8b\u7ed3\u6784\uff0c\u671f\u5f85\u6211\u4eec\u80fd\u7f16\u5199\u51fa\u9ad8\u6548\u3001\u7a33\u5b9a\u3001\u6613\u4e8e\u7ef4\u62a4\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_1","title":"\u4e00\u3001\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u53ef\u4ee5\u5206\u4e3a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u548c\u4e13\u9879\u81ea\u52a8\u5316\u6d4b\u8bd5\uff0c\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e00\u822c\u53ea\u9488\u5bf9\u4e00\u4e9b\u5e38\u89c4\u7684\u529f\u80fd\u6d4b\u8bd5\uff0c\u5176\u4ed6\u975e\u5e38\u89c4\u529f\u80fd\u7684\u7528\u4f8b\uff0c\u5e94\u8be5\u91c7\u7528\u4e13\u9879\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u6848\uff1b \u4ee5\u4e0b\u662f\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1","title":"1. \u7a33\u5b9a\u6027\u3001\u538b\u6d4b\u7528\u4f8b","text":"\u7a33\u5b9a\u6027\u6d4b\u8bd5\u3001\u538b\u6d4b\u7528\u4f8b\u5e94\u8be5\u662f\u5c5e\u4e8e\u6027\u80fd\u76f8\u5173\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u5982\uff1a\u53cd\u590d\u591a\u6b21\u70b9\u51fb\u6309\u94ae\uff0c\u68c0\u9a8c\u5176\u529f\u80fd\u7a33\u5b9a\u6027\u3002\u56e0\u4e3a\u8fd9\u4e9b\u7528\u4f8b\u65ad\u8a00\u7684\u9884\u671f\u53ef\u80fd\u4e0d\u662f\u5f88\u660e\u786e\uff0c\u66f4\u6709\u751a\u8005\u4e0d\u9700\u8981\u65ad\u8a00\uff0c\u7528\u4f8b\u65f6\u957f\u6bd4\u8f83\u957f\uff0c\u800c\u4e14\u4e0d\u53ef\u63a7\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u76ee\u524d\u6211\u4eec\u6709\u6027\u80fd\u81ea\u52a8\u5316\u7684\u4e13\u9879\u65b9\u6848\uff0c\u4ee5\u53ca\u4e00\u4e9b\u7a33\u5b9a\u6027\u6d4b\u8bd5\u7684\u4e13\u9879\u65b9\u6848\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u6b64\u7c7b\u7528\u4f8b\u653e\u5230\u4e13\u9879\u81ea\u52a8\u5316\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2","title":"2. \u6d89\u53ca\u591a\u4e2a\u7528\u6237\u64cd\u4f5c","text":"\u5e38\u89c1\u4e0e\u6587\u7ba1\u7684\u7528\u4f8b\u4e2d\uff0c\u591a\u7528\u6237\u64cd\u4f5c\u7684\u7528\u4f8b\u4e00\u822c\u90fd\u4f1a\u6d89\u53ca\u5230\u5728\u7cfb\u7edf\u4e2d\u8fdb\u884c\u591a\u4e2a\u7528\u6237\u95f4\u7684\u5207\u6362\uff0c\u81ea\u52a8\u5316\u811a\u672c\u4e00\u822c\u662f\u8fd0\u884c\u5728\u4e00\u4e2a\u7528\u6237\u7a7a\u95f4\u4e0b\u7684\uff0c\u6240\u4ee5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u591a\u7528\u6237\u95f4\u7684\u5207\u6362\u3002 \u6b64\u7c7b\u4e0d\u5efa\u8bae\u91c7\u7528\u81ea\u52a8\u5316\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3","title":"3. \u4e0e\u5f00\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4ea4\u4e92","text":"\u6b64\u7c7b\u573a\u666f\u591a\u4e3a\u5e94\u7528\u7684\u5f02\u5e38\u573a\u666f\u6d4b\u8bd5\uff0c\u6bd4\u5982\uff1a\u590d\u5236\u5927\u6587\u4ef6\u8fc7\u7a0b\u4e2d\u6ce8\u9500\u673a\u5668\u3002 \u81ea\u52a8\u5316\u811a\u672c\u5728\u7cfb\u7edf\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4e4b\u540e\u662f\u4f1a\u505c\u6b62\u8fd0\u884c\u7684\uff1b\u6b64\u7c7b\u7528\u4f8b\u53ef\u4ee5\u505a\u81ea\u52a8\u5316\uff0c\u4f46\u662f\u540c\u6837\u9700\u8981\u505a\u4e13\u9879\u65b9\u6848\uff0c\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u7684\u5904\u7406\u903b\u8f91\u5b8c\u5168\u4e0d\u540c\u3002 \u540e\u7eed\u81ea\u52a8\u5316\u9700\u8981\u516c\u5173\u7684\u70b9\uff1a \u81ea\u52a8\u5316\u811a\u672c\u5728\u672c\u673a\u8fd0\u884c\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u81f3\u5c11\u9700\u8981\u63d0\u4f9b\u4ee5\u4e0b\u529f\u80fd\uff1a \u91cd\u542f\u4e4b\u540e\u7528\u4f8b\u80fd\u81ea\u52a8\u8fd0\u884c\uff1b\u53ef\u4ee5\u8003\u8651\u5c06\u6267\u884c\u7528\u4f8b\u5199\u6210\u4e00\u4e2a\u5f00\u673a\u81ea\u542f\u7684\u670d\u52a1\uff1b \u80fd\u8bb0\u5f55\u5173\u673a\u4e4b\u524d\u7528\u4f8b\u6267\u884c\u7684\u4f4d\u7f6e\uff0c\u91cd\u542f\u4e4b\u540e\u80fd\u4ece\u6b64\u4f4d\u7f6e\u5f00\u59cb\u6267\u884c\uff1b \u50cf\u6027\u80fd\u81ea\u52a8\u5316\u4e00\u6837\uff0c\u7531\u670d\u52a1\u7aef\u63a7\u5236\uff1b \u5b8c\u5168\u57fa\u4e8e\u56fe\u5f62\u8bc6\u522b\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u4e32\u53e3\u7ebf\u63a7\u5236\u952e\u9f20\u7a33\u5b9a\u6027\uff1b "},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4","title":"4. \u6d4b\u8bd5\u6267\u884c\u65f6\u95f4\u957f","text":"\u7528\u4f8b\u6267\u884c\u65f6\u95f4\u63a7\u5236\u57282\u5206\u949f\u4ee5\u5185\uff0c\u6781\u7aef\u60c5\u51b5\u4e0d\u8981\u8d85\u8fc75\u5206\u949f\uff0c\u6240\u6709\u7528\u4f8b\u7684\u5e73\u5747\u65f6\u957f\u5e94\u8be5\u57281\u5206\u949f\u5de6\u53f3\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u95f4\u592a\u957f\uff0c\u7f16\u5199\u7528\u4f8b\u3001\u8c03\u8bd5\u7528\u4f8b\u3001\u6267\u884c\u7528\u4f8b\u3001\u7ef4\u62a4\u7528\u4f8b\u90fd\u975e\u5e38\u7684\u8017\u65f6\uff0c\u4eba\u529b\u6210\u672c\u65f6\u95f4\u6210\u672c\u6295\u5165\u592a\u9ad8\u3002 \u4f60\u60f3\uff0c\u8fd9\u6761\u7528\u4f8b\u6267\u884c\u9700\u89815\u5206\u949f\uff0c\u90a3\u4f60\u5199\u8fd9\u6761\u7528\u4f8b\u7684\u65f6\u95f4\u4e0d\u53ef\u80fd\u4e00\u904d\u8fc7\uff0c\u5199\u7684\u8fc7\u7a0b\u4e2d\u8dd1\u4e0d\u901a\u8fd8\u5f97\u91cd\u8dd1\u81f3\u5c1115\u5206\u949f\u4e0d\u8fc7\u5206\uff0c\u5199\u5b8c\u4e86\u8fd8\u5f97\u5728\u5176\u4ed6\u67b6\u6784\u4e0a\u8c03\u8bd5\uff0c\u534a\u4e2a\u5c0f\u65f6\u8fc7\u53bb\u4e86\uff0c\u8fd9\u8fd8\u53ea\u662f\u7b2c\u4e00\u6b21\u5199\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u540e\u7eed\u5982\u679c\u7528\u4f8b\u7ef4\u62a4\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u7ecf\u5e38\u6295\u5165\u76f8\u5f53\u957f\u65f6\u95f4\uff0c\u8fd9\u6837\u5176\u5b9e\u662f\u5931\u53bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u7684\u3002\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u5c31\u5e94\u8be5\u662f\u5feb\u51c6\u72e0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5","title":"5. \u8fb9\u7f18\u6027\u6d4b\u8bd5","text":"\u6709\u4e9b\u529f\u80fd\u6a21\u5757\u672c\u8eab\u662f\u5c5e\u4e8e\u6bd4\u8f83\u8fb9\u7f18\u6027\u7684\uff0c\u5373\u6781\u5c11\u7528\u6237\u4f1a\u4f7f\u7528\u5230\u7684\u529f\u80fd\uff0c\u8fd9\u7c7b\u529f\u80fd\u6a21\u5757\u4e0d\u9700\u8981\u5927\u89c4\u6a21\u5b9e\u73b0\u81ea\u52a8\u5316\uff0c\u4e00\u4e24\u4e2a\u573a\u666f\u8986\u76d6\u57fa\u672c\u529f\u80fd\u5c31\u884c\u4e86\uff0c\u56e0\u6b64\u6211\u4eec\u5728\u6311\u9009\u6b64\u7c7b\u7528\u4f8b\u7684\u65f6\u5019\u53ef\u4ee5\u7ed3\u5408\u6574\u4e2a\u529f\u80fd\u6a21\u5757\u7684\u8986\u76d6\u60c5\u51b5\u6765\u51b3\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6","title":"6. \u9700\u8981\u4f9d\u8d56\u4eba\u5de5\u4ecb\u5165\u7684","text":"\u81ea\u52a8\u5316\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\u662f\u6ca1\u6709\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bd4\u5982\u8981\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u90a3\u4e48\u5c31\u80cc\u79bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u3002 \u6bd4\u5982\u5149\u9a71\u6a21\u5757\uff0c\u5149\u9a71\u523b\u5f55\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u4f46\u662f\u5149\u9a71\u523b\u5f55\u4e4b\u540e\u5149\u76d8\u4f1a\u5f39\u51fa\u6765\uff0c\u9700\u8981\u4eba\u5de5\u66f4\u6362\u5149\u76d8\uff0c\u518d\u624b\u52a8\u63a8\u8fdb\u5149\u9a71\u4e2d\u3002 \u8fd9\u79cd\u529f\u80fd\u6a21\u5757\u5373\u4f7f\u505a\u81ea\u52a8\u5316\uff0c\u80fd\u6d89\u53ca\u5230\u7684\u529f\u80fd\u975e\u5e38\u6709\u9650\uff0c\u800c\u4e14\u4e0d\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u6240\u4ee5\u660e\u663e\u5c31\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7","title":"7. \u96be\u4ee5\u5b9e\u73b0\u7684","text":"\u7528\u4f8b\u6240\u6d89\u53ca\u5230\u7684\u65b9\u6cd5\u5b9e\u73b0\u8d77\u6765\u53ef\u80fd\u6709\u96be\u5ea6\uff0c\u751a\u81f3\u73b0\u9636\u6bb5\u65e0\u6cd5\u5b9e\u73b0\u7684\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002 \u6bd4\u5982\u5f71\u9662\u6d4b\u8bd5\u753b\u9762\u6e05\u6670\u5ea6\u3001\u6d41\u7545\u5ea6\u3001\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u4e4b\u540e\u7684\u89c6\u9891\u662f\u5426\u5b58\u5728\u5361\u987f\u7b49\u7528\u4f8b\uff0c\u73b0\u9636\u6bb5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#8","title":"8. \u529f\u80fd\u4e0d\u7a33\u5b9a","text":"\u8fd9\u4e2a\u4e0d\u662f\u8bf4\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\uff0c\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\u4e0d\u7a33\u5b9a\u662f\u6b63\u5e38\u7684\uff0c\u8fd9\u79cd\u6211\u4eec\u53ef\u4ee5\u7b49\u5f00\u53d1\u63d0\u6d4b\u4e4b\u540e\u518d\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u3002 \u529f\u80fd\u4e0d\u7a33\u5b9a\u6307\u7684\u662f\u7528\u4f8b\u6240\u6d89\u53ca\u7684\u529f\u80fd\uff0c\u53ef\u80fd\u5b58\u5728\u591a\u79cd\u53d8\u5316\uff0c\u6bcf\u6b21\u6267\u884c\u7528\u4f8b\u53ef\u80fd\u65ad\u8a00\u7684\u9884\u671f\u90fd\u4e0d\u540c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#9","title":"9. \u52a8\u6001\u65ad\u8a00","text":"\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u76f4\u5230\u7528\u4f8b\u7ed3\u675f\uff0c\u4e00\u76f4\u662f\u4e00\u4e2a\u52a8\u6001\u53d8\u5316\u7684\u8fc7\u7a0b\uff0c\u800c\u4e14\u65e0\u6cd5\u901a\u8fc7\u5176\u4ed6\u624b\u6bb5\u505c\u4e0b\u6765\uff1b \u6bd4\u5982\uff1a\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u65f6\uff0c\u53f3\u4e0b\u89d2\u7684\u5f55\u5236\u65f6\u95f4\u662f\u4e00\u76f4\u5728\u53d8\u5316\u7684\uff0c\u7528\u4f8b\u9700\u8981\u6d4b\u8bd5\u5f55\u52361\u5206\u949f\u4e4b\u540e\uff0c\u5f55\u5236\u65f6\u95f4\u662f\u521a\u597d\u505c\u572860\u79d2\uff1b \u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fd8\u505a\u4e0d\u5230\u65f6\u95f4\u7cbe\u51c6\u63a7\u5236\uff0c\u7a0b\u5e8f\u6267\u884c\u65f6\u95f4\u662f\u6709\u6ce2\u52a8\u7684\uff0c\u800c\u4e14\u8981\u9002\u914d\u591a\u4e2a\u5e73\u53f0\uff0c\u6240\u4ee5\u6b64\u7c7b\u7528\u4f8b\u5927\u6982\u7387\u4f1a\u6267\u884c\u5931\u8d25\u3002\u7279\u522b\u662f\u5728\u6027\u80fd\u8f83\u5dee\u7684\u56fd\u4ea7\u5316\u67b6\u6784\u4e0a\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u592a\u53ef\u80fd\u7a33\u5b9a\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#10","title":"10. \u63a2\u7d22\u6027\u6d4b\u8bd5","text":"\u63a2\u7d22\u6027\u6d4b\u8bd5\u901a\u5e38\u662f\u4e00\u4e9b\u4e0d\u786e\u5b9a\u7684\u64cd\u4f5c\uff0c\u591a\u53d8\u5207\u590d\u6742\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u9884\u671f\u4e5f\u53ef\u80fd\u662f\u4e0d\u786e\u5b9a\u7684\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u9a9a\u64cd\u4f5c\u592a\u591a\u4e86\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6b64\u7c7b\u7528\u4f8b\u9002\u5408\u91c7\u7528\u624b\u5de5\u6d4b\u8bd5\uff0c\u662f\u624b\u5de5\u6d4b\u8bd5\u771f\u6b63\u7684\u4ef7\u503c\u4f53\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#11","title":"11. \u6613\u7528\u6027\u6d4b\u8bd5","text":"\u5bf9\u4e8e\u6613\u7528\u6027\u7684\u5224\u65ad\u901a\u5e38\u662f\u4e3b\u89c2\u7684\uff0c\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\u5f88\u96be\u53bb\u5b9a\u4e49\u4ec0\u4e48\u6837\u7684\u60c5\u51b5\u5bf9\u7528\u6237\u662f\u6613\u7528\u7684\uff0c\u81ea\u52a8\u5316\u9700\u8981\u6709\u660e\u786e\u7684\u53ef\u5b9e\u73b0\u7684\u9884\u671f\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_2","title":"\u4e8c\u3001\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u524d\u9762\u8bb2\u4e86\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u4e00\u4e9b\u7528\u4f8b\u60c5\u51b5\uff0c\u6709\u540c\u5b66\u5c31\u8bf4\u4e86\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\u4e0d\u7528\u8bb2\u4e86\uff0c\u5c31\u662f\u4e0d\u9002\u5408\u7684\u53cd\u9762\u3002\u6ca1\u6bdb\u75c5\u54c8\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\uff0c\u6211\u4eec\u5927\u4f53\u8fd8\u53ef\u4ee5\u5206\u4e3a\u4e24\u7c7b\uff1a \u7b2c\u4e00\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u597d\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u7b2c\u4e8c\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u4e00\u822c\uff0c\u9700\u8981\u6295\u5165\u66f4\u591a\u7cbe\u529b\u624d\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u4ee5\u4e0b\u4ecb\u7ecd\u4e00\u4e9b\u6211\u4eec\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1_1","title":"1. \u64cd\u4f5c\u76f8\u5bf9\u7b80\u5355","text":"\u7528\u4f8b\u6b65\u9aa4\u76f8\u5bf9\u8f83\u5c11\uff0c\u8fd9\u79cd\u7528\u4f8b\u901a\u5e38\u662f\u4e00\u4e9b\u8def\u5f84\u5f88\u6d45\u7684\u7528\u4f8b\uff0c\u4e00\u822c\u4e5f\u662f\u4e00\u4e9b\u57fa\u7840\u7528\u4f8b\u3002\u7528\u4f8b\u7f16\u5199\u3001\u7ef4\u62a4\u90fd\u53ef\u4ee5\u8f7b\u677e\u641e\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2_1","title":"2. \u5bb9\u6613\u5b9e\u73b0","text":"\u73b0\u6709\u6280\u672f\u662f\u53ef\u5b9e\u73b0\u7684\uff0c\u6ca1\u6709\u96be\u5ea6\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3_1","title":"3. \u7ecf\u5e38\u7528\u4e8e\u56de\u5f52\u6d4b\u8bd5","text":"\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bcf\u6b21\u56de\u5f52\u6d4b\u8bd5\u5fc5\u987b\u8981\u6267\u884c\u7684\u7528\u4f8b\uff0c\u90a3\u4e48\u8fd9\u6761\u7528\u4f8b\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u3002 \u56de\u5f52\u6d4b\u8bd5\u65f6\u6211\u4eec\u9996\u5148\u5e94\u8be5\u4fdd\u8bc1\u5e94\u7528\u5386\u53f2\u57fa\u672c\u529f\u80fd\u6b63\u5e38\uff0c\u6240\u4ee5\u90a3\u4e9b\u6bcf\u6b21\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u90fd\u8981\u6267\u884c\u7684\u7528\u4f8b\u9002\u5408\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4_1","title":"4. \u529f\u80fd\u7a33\u5b9a\u7684\u6838\u5fc3\u529f\u80fd","text":"\u6d89\u53ca\u6838\u5fc3\u529f\u80fd\u7684\u7528\u4f8b\u662f\u6700\u6700\u91cd\u8981\u7684\u7528\u4f8b\uff0c\u4e5f\u662f\u6211\u4eec\u4ea4\u4ed8\u65f6\u5fc5\u987b\u8981\u4fdd\u8bc1\u8d28\u91cf\u7684\u76f8\u5173\u529f\u80fd\uff0c\u56e0\u6b64\u5e94\u8be5\u5c3d\u53ef\u80fd\u7684\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5_1","title":"5. \u8f93\u5165\u6570\u636e\u6d4b\u8bd5","text":"\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u901a\u5e38\u662f\u68c0\u9a8c\u88ab\u6d4b\u5e94\u7528\u63a5\u53d7\u6709\u6548\u6570\u636e\u3001\u62d2\u7edd\u65e0\u6548\u6570\u636e\u7684\u80fd\u529b\u3002\u5982\uff1a\u63d0\u4ea4\u8d85\u957f\u5b57\u7b26\u4e32\u3001\u7279\u6b8a\u5b57\u7b26\u4e32\u7b49\u7b49\u3002 \u6b64\u7c7b\u7528\u4f8b\u624b\u5de5\u6d4b\u8bd5\u5f88\u96be\u6bd4\u8f83\u5168\u9762\u7684\u8986\u76d6\u5230\u6240\u6709\u7684\u8f93\u5165\u60c5\u51b5\uff0c\u4f46\u662f\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\uff0c\u6b64\u7c7b\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u90fd\u662f\u4e00\u6837\u7684\uff0c\u53d8\u5316\u7684\u4ec5\u662f\u8f93\u5165\u53c2\u6570\u548c\u65ad\u8a00\u7ed3\u679c\uff0c\u91c7\u7528\u6570\u636e\u9a71\u52a8\uff0c\u53ef\u4ee5\u8f7b\u677e\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6_1","title":"6. \u683c\u5f0f\u8986\u76d6","text":"\u539f\u56e0\u540c\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u7c7b\u7528\u4f8b\u4e00\u6837\uff0c\u591a\u79cd\u683c\u5f0f\u7684\u8986\u76d6\u4e5f\u662f\u4e00\u4e2a\u5f88\u7e41\u7410\u7684\u4e8b\u60c5\uff0c\u4ea4\u7ed9\u81ea\u52a8\u5316\u6765\u505a\u518d\u5408\u9002\u4e0d\u8fc7\u4e86\u3002 \u6bd4\u5982\u5f71\u9662\u5bf9\u5f71\u7247\u683c\u5f0f\u7684\u68c0\u67e5\u3001\u622a\u56fe\u5f55\u5c4f\u5bf9\u4fdd\u5b58\u683c\u5f0f\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7_1","title":"7. \u68c0\u67e5\u5143\u7d20\u72b6\u6001","text":"\u67e5\u770b\u88ab\u6d4b\u5e94\u7528\u7684\u5143\u7d20\u5c5e\u6027\u3002\u5982\uff1a\u56fe\u7247\u7684\u5927\u5c0f\u548c\u6392\u5217\uff1b\u6309\u94ae\u7684\u53ef\u7528\u548c\u4e0d\u53ef\u7528\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/","title":"AT \u7ecf\u9a8c\u603b\u7ed3","text":"\u6b22\u8fce\u6240\u6709\u4eba\u63d0\u4ea4\u4f60\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u9762\u7684\u4f18\u79c0\u5b9e\u8df5\u7ecf\u9a8c\uff0c\u4ee5\u5e2e\u52a9\u5927\u5bb6\u89e3\u51b3\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#1","title":"1\u3001\u7ec8\u7ed3\u5668","text":"# litaoa@uniontech.com\n \u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4 pytest \u5b9e\u73b0\u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4\u7684\u65b9\u5f0f\u6709\u4e24\u79cd\uff0cyield \u548c\u7ec8\u7ed3\u51fd\u6570\uff1b yield \u5b9e\u73b0\uff0cyield\u524d\u9762\u4e3a\u7528\u4f8b\u7684\u524d\u7f6e\u6b65\u9aa4\uff0cyield \u540e\u9762\u4e3a\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4\u3002 @pytest.fixture\ndef clean_env():\nprint(\"setup\")\nyield\nprint(\"teardown\")\n \u7ec8\u7ed3\u51fd\u6570\u5b9e\u73b0\uff0c\u4f7f\u7528 request.addfinalizer \u6ce8\u518c\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4 @pytest.fixture\ndef clean_env(request):\ndef clean():\nprint(\"teardown\")\nrequest.addfinalizer(clean)\nprint(\"setup\")\n yield\u7684\u4f18\u7f3a\u70b9\uff1a \u4f18\u70b9\uff1a\u4ee3\u7801\u7b80\u6d01\uff0c\u76f4\u89c2\uff0c\u53ef\u4f7f\u7528yield\u5728\u7528\u4f8b\u4e2d\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c \u7f3a\u70b9\uff1a\u82e5\u524d\u7f6e\u6b65\u9aa4\u4e2d\u51fa\u73b0\u9519\u8bef\uff0c\u5219\u540e\u7f6e\u6b65\u9aa4\u4e0d\u4f1a\u6267\u884c \u7ec8\u7ed3\u51fd\u6570\uff1a \u4f18\u70b9\uff1a\u524d\u7f6e\u6b65\u9aa4\u5931\u8d25\u7684\u8bdd\uff0c\u540e\u7f6e\u6b65\u9aa4\u4ecd\u4f1a\u6267\u884c\u4e14\u53ef\u4ee5\u6ce8\u518c\u591a\u4e2a\u540e\u7f6e\u6b65\u9aa4\uff08\u524d\u63d0\uff1a\u9700\u8981\u5728\u4ee3\u7801\u62a5\u9519\u4e4b\u524d\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff09\uff0c\u652f\u6301\u7075\u6d3b\u4f7f\u7528\u540e\u7f6e\u6761\u4ef6 \u7f3a\u70b9\uff1a\u4ee3\u7801\u8f83\u4e3a\u590d\u6742\uff0c\u65e0\u6cd5\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c\uff08\u672c\u4eba\u76ee\u524d\u672a\u5b9e\u73b0\uff09 \u603b\u7ed3\uff1a\u5728\u524d\u7f6e\u6b65\u9aa4\u4fdd\u8bc1\u7edd\u5bf9\u4e0d\u4f1a\u51fa\u9519\u65f6\uff0c\u4f7f\u7528yield\u66f4\u4f73\u7b80\u4fbf\uff0c\u5f53\u524d\u7f6e\u6b65\u9aa4\u6613\u51fa\u73b0\u95ee\u9898\u65f6\uff0c\u63a8\u8350\u4f7f\u7528\u7ec8\u7ed3\u51fd\u6570\u3002 \u573a\u666f\uff1a\u4fdd\u9669\u7bb1\u7528\u4f8b\uff0c\u524d\u7f6e\u6b65\u9aa4\u4e2d\u5f00\u542f\u4fdd\u9669\u7bb1\uff0c\u540e\u7f6e\u6b65\u9aa4\u5220\u9664\u4fdd\u9669\u7bb1\u3002 @pytest.fixture(scope=\"session\", autouse=True)\ndef vault_fixture(request):\nDfmWidget.reset_vault_by_cmd() # 1\u3001\u91cd\u7f6e\u4fdd\u9669\u7bb1\nDdeDockPublicWidget().close_file_manager_by_cmd() # 2\u3001\u5173\u95ed\u6587\u7ba1\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 3\u3001\u5f00\u542f\u6587\u7ba1\nvault = DfmWidget()\nvault.create_file_vault() # 4\u3001\u521b\u5efa\u4fdd\u9669\u7bb1\ndef delete_vault(): # 8\u3001\u5220\u9664\u4fdd\u9669\u7bb1\u7684\u540e\u7f6e\u6b65\u9aa4\nsleep(2)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr()\nvault = DfmWidget()\nvault.delete_file_vault()\nDfmWidget.reset_vault_by_cmd()\nDdeDockPublicWidget().close_file_manager_by_cmd()\nrequest.addfinalizer(delete_vault) # 5\u3001\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\nDdeDockPublicWidget().close_file_manager_by_cmd() # 6\u3001\u5173\u95ed\u6587\u7ba1\nsleep(1)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 7\u3001\u5f00\u542f\u6587\u7ba1\n \u4ee3\u7801\u6309\u6ce8\u91ca\u4e2d\u7684\u5e8f\u53f7\u6267\u884c\u6b65\u9aa4 \u4ee3\u7801\u5728\u6b65\u9aa41-4\u4efb\u610f\u4f4d\u7f6e\u62a5\u9519\uff0c\u5219\u4e0d\u4f1a\u6267\u884c\u6b65\u9aa48\uff0c\u56e0\u4e3a\u672a\u6267\u884c\u5230\u6b65\u9aa45\uff0c\u6b65\u9aa48\u8fd8\u672a\u6ce8\u518c \u4ee3\u7801\u5728\u6b65\u9aa46-7\u62a5\u9519\uff0c\u4ecd\u4f1a\u6267\u884c\u6b65\u9aa47\uff0c\u56e0\u4e3a\u5728\u6b65\u9aa45\u4e2d\u5df2\u7ecf\u5c06\u6b65\u9aa47\u6ce8\u518c \u53ef\u4ee5\u7075\u6d3b\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff0c\u80fd\u5b9e\u73b0\u67d0\u4e2a\u524d\u7f6e\u6b65\u9aa4\u6267\u884c\u4e4b\u540e\uff0c\u624d\u4f1a\u6267\u884c\u540e\u7f6e\u6b65\u9aa4\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#2","title":"2\u3001\u542f\u52a8\u5e94\u7528\u7684\u65b9\u5f0f","text":"# huangmingqiang@uniontech.com\n \uff081\uff09\u547d\u4ee4\u884c\u542f\u52a8 \u5728 AT \u4ee3\u7801\u4e2d\u4f7f\u7528\u547d\u4ee4\u884c\u542f\u52a8\u5e94\u7528\uff0c\u4e3e\u4f8b\uff1a os.popen(\"deepin-music\")\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f7f\u7528 ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6\uff0cdogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u3002 \uff082\uff09\u901a\u8fc7 UI \u64cd\u4f5c\u542f\u52a8 \u901a\u8fc7\u4efb\u52a1\u680f\u3001\u542f\u52a8\u5668\u3001\u684c\u9762\u7b49UI\u65b9\u5f0f\u542f\u52a8\uff0c\u6bd4\u5982\u53cc\u51fb\u6253\u5f00\u3001\u53f3\u952e\u6253\u5f00\u7b49\uff0c\u8fd9\u79cd\u64cd\u4f5c\u65b9\u5f0f\u4e0d\u5b58\u5728ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6dogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u7684\u95ee\u9898\uff0c\u4e5f\u66f4\u52a0\u7b26\u5408\u7528\u6237\u7684\u64cd\u4f5c\u884c\u4e3a\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#3","title":"3\u3001\u6587\u4ef6\u9009\u62e9\u6846\u5c5e\u6027\u5b9a\u4f4d\u5076\u73b0\u65e0\u6cd5\u627e\u5230","text":"\u6587\u4ef6\u9009\u62e9\u6846\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5728\u8c03\u7528\u6587\u4ef6\u9009\u62e9\u6846\u65f6\uff0c\u6709\u4e00\u5b9a\u7684\u6982\u7387\u51fa\u73b0\uff0c\u754c\u9762\u5df2\u7ecf\u6e32\u67d3\u51fa\u6765\u4e86\uff0c\u4f46\u662f\u5c5e\u6027\u6811\u5e76\u6ca1\u6709\u5199\u5165\uff0c\u5bfc\u81f4\u901a\u8fc7\u5c5e\u6027\u65e0\u6cd5\u627e\u5230\u5143\u7d20\uff0c\u76ee\u524d\u4e5f\u6ca1\u6709\u5f88\u597d\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u4e3a\u4e86\u7528\u4f8b\u7a33\u5b9a\u6027\uff0c\u6587\u4ef6\u9009\u62e9\u6846\u7684\u64cd\u4f5c\u5efa\u8bae\u4f7f\u7528UI\u6216\u8005\u56fe\u7247\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u53ef\u4ee5\u901a\u8fc7\u641c\u7d22\u5185\u5bb9\u56fa\u5b9a\u6587\u4ef6\u4f4d\u7f6e\u3002 # litaoa@uniontech.com\n desk = DdeDesktopPublicWidget()\n# \u9009\u62e9\u89c6\u9891\u76ee\u5f55\ndesk.click_videos_dir_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.ctrl_f()\nsleep(1)\ndesk.input_message(\"\u5143\u7d20\u540d\u79f0\")\nsleep(0.5)\ndesk.enter()\nsleep(1)\n# \u9009\u62e9\u7b2c\u4e00\u4e2a\u6587\u4ef6\ndesk.click_list_view_btn_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.click_first_file_in_desktop_plugs_by_ui()\nsleep(1)\n# \u6587\u7ba1\u63d2\u4ef6\u4e2d\u70b9\u51fb\u6253\u5f00\ndesk.click_open_btn_in_desktop_plugs_by_ui()\n"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#4","title":"4\u3001\u5e94\u7528\u542f\u52a8","text":"# mikigo\n \u5728UI\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u4e00\u5207\u64cd\u4f5c\u7684\u90fd\u662f\u4ece\u5e94\u7528\u542f\u52a8\u5f00\u59cb\u7684\uff0c\u800c\u5728Linux\u684c\u9762\u5e94\u7528\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u6211\u4eec\u542f\u52a8\u5e94\u7528\u7684\u65b9\u6cd5\u6709\u591a\u79cd\uff0c\u4e0b\u9762\u505a\u4e00\u4e2a\u7b80\u5355\u7684\u4ecb\u7ecd\uff1a \u3010\u4f7f\u7528dogtail\u542f\u52a8\u3011 dogtail\u63d0\u4f9b\u4e86\u5e94\u7528\u542f\u52a8\u7684\u65b9\u6cd5\uff0c\u5728utils\u5e93\u4e2d\uff0c\u4f7f\u7528run\u65b9\u6cd5\u542f\u52a8\uff1a \u9996\u5148\u5bfc\u5165\u65b9\u6cd5\uff1a from dogtail.utils import *\n \u8c03\u7528run\u65b9\u6cd5 run('deepin-music')\n \u5373\u53ef\u542f\u52a8\u97f3\u4e50 \u8fd9\u79cd\u65b9\u6cd5\u7684\u4f18\u70b9\u662f\u91c7\u7528\u8fdb\u7a0b\u7684\u65b9\u5f0f\u76f4\u63a5\u542f\u52a8\uff0c\u4e0d\u4f9d\u8d56\u4e0eUI\uff0c\u65e0\u8bba\u684c\u9762\u6216\u4efb\u52a1\u680f\u4e0a\u662f\u5426\u5b58\u5728\u5e94\u7528\u56fe\u6807\uff0c\u90fd\u53ef\u4ee5\u6b63\u5e38\u542f\u52a8\u3002 \u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c \u5982\u679c\u4f7f\u7528ssh\u8fdc\u7a0b\u8c03\u7528\uff0c\u6216\u8005Jenkins\u4e2d\u6267\u884c\u6d4b\u8bd5\u811a\u672c\u7684\u65f6\u5019\uff0c\u5728sniff\u4e2d\u4f1a\u51fa\u73b0\u627e\u4e0d\u5230\u5e94\u7528\uff0c\u7ecf\u8fc7\u5206\u6790\uff0c\u53ef\u80fd\u662f\u56e0\u4e3a\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\u542f\u52a8\u7684\u65f6\u5019\uff0c\u5b9e\u9645\u662f\u91c7\u7528\u4e00\u4e2a\u5b50\u8fdb\u7a0b\u542f\u52a8\u4e86\u5e94\u7528\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u5230\u3002 \u3010\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u3011 \u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807 \u901a\u5e38\u6709\u4e24\u79cd\u65b9\u6cd5\uff1a \uff081\uff09\u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807\u3002 \uff082\uff09\u5df2\u77e5\u5e94\u7528\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u7684\u4f4d\u7f6e\uff0c\u7136\u540e\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u5bf9\u5e94\u5750\u6807\u3002 \u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u7f3a\u70b9\u662f\u4f4d\u7f6e\u5fc5\u987b\u56fa\u5b9a\uff0c\u5982\u679c\u79fb\u52a8\u4f4d\u7f6e\u5c31\u4e0d\u884c\u4e86\uff0c\u800c\u4f7f\u7528\u7b2c\u4e00\u79cd\u65b9\u6cd5\uff0c\u65e0\u8bba\u4f4d\u7f6e\u5728\u54ea\u91cc\uff0c\u53ea\u8981\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u5b58\u5728\u5373\u53ef\u3002 \u3010\u70b9\u51fb\u684c\u9762\u56fe\u6807\u542f\u52a8\u3011 \u684c\u9762\u56fe\u6807\u76ee\u524d\u662f\u91c7\u7528\u56fe\u50cf\u8bc6\u522b\u6280\u672f\uff0c\u5b9a\u4f4d\u5230\u5e94\u7528\u56fe\u6807\u7684\u5750\u6807\uff0c\u7136\u540e\u901a\u8fc7pyauogui\u8fdb\u884c\u70b9\u51fb\u64cd\u4f5c\u3002 \u8be6\u7ec6\u6280\u672f\u65b9\u6848\u53ef\u4ee5\u53c2\u8003\u6211\u7684\u53e6\u5916\u4e24\u7bc7\u535a\u5ba2: \u57fa\u4e8eopencv\u7684\u6a21\u677f\u5339\u914d\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd4\u56de\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 Python\u4e09\u65b9\u5e93PyAutoGui\u7684\u4f7f\u7528\u65b9\u6cd5 \u3010\u4ece\u542f\u52a8\u5668\u542f\u52a8\uff08\u4fd7\u79f0\u5f00\u59cb\u83dc\u5355\uff09\u3011 \u542f\u52a8\u4e2d\u542f\u52a8\u7684\u5b9e\u73b0\u903b\u8f91\u5b9e\u9645\u548c\u4efb\u52a1\u680f\u4e0a\u542f\u52a8\u5dee\u4e0d\u591a\u3002 \u9996\u5148\uff0c\u9700\u8981\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u542f\u52a8\u5668\u56fe\u6807\uff0c\u6216\u8005\u952e\u76d8super\u952e\uff0c\u5c06\u542f\u52a8\u5668\u547c\u51fa\u6765\uff0c \u7136\u540e\uff0c\u5728\u542f\u52a8\u5668\u4e2d\u70b9\u51fb\u5bf9\u5e94\u7684\u56fe\u6807\uff0c \u4f46\u662f\u8fd9\u91cc\u6709\u4e2a\u95ee\u9898\uff0c\u542f\u52a8\u5668\u4e2d\u7684\u5e94\u7528\u5217\u8868\uff0c\u4e00\u9875\u5c55\u793a\u4e0d\u5b8c\uff0c\u6240\u4ee5\u5982\u679c\u6211\u4eec\u8981\u70b9\u51fb\u7684\u5e94\u7528\u56fe\u6807\u4e0d\u5728\u7b2c\u4e00\u9875\u600e\u4e48\u529e\uff0c\u901a\u5e38\u89e3\u51b3\u65b9\u6848\u6709\u4e24\u79cd\uff1a \uff081\uff09\u9700\u8981\u8fdb\u884c\u5411\u4e0b\u6ed1\u52a8\uff0c\u8fd9\u91cc\u5c31\u6d89\u53ca\u5230\u76f8\u5e94\u7684\u8bc6\u522b\u65b9\u6848\uff0c\u5224\u65ad\u5982\u679c\u4e0d\u5728\u7b2c\u4e00\u9875\u5c31\u5f80\u4e0b\u6ed1\u52a8\u7ffb\u9875\u3002 \uff082\uff09\u542f\u52a8\u5668\u63d0\u4f9b\u641c\u7d22\u7684\u529f\u80fd\uff0c\u8f93\u5165\u5e94\u7528\u540d\u79f0\u641c\u7d22\uff0c\u7136\u540e\u8fdb\u884c\u70b9\u51fb\u3002 \u4ece\u5b9e\u9645\u64cd\u4f5c\u4e2d\u6765\u770b\uff0c\u91c7\u7528\u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u6548\u7387\u4f1a\u9ad8\u4e00\u70b9\u3002 \u3010\u7ec8\u7aef\u547d\u4ee4\u542f\u52a8\u3011 \u5728python\u4e2d\uff0c\u4f7f\u7528os.popen()\u6216os.system()\u6216\u8005subprocess.Popen()\uff0c\u5b9e\u73b0\u547d\u4ee4\u884c\u542f\u52a8\uff0c\u6bd4\u5982\uff1a import os\nos.popen('deepin-music')\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u8fdc\u7a0b\u6267\u884c\u811a\u672c\u7684\u65f6\u5019\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u7684\u95ee\u9898\u3002 \u3010\u603b\u7ed3\u3011 \u4ee5\u4e0a\u51e0\u79cd\u65b9\u6cd5\uff0c\u5404\u6709\u4f18\u7f3a\u70b9\uff0c\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff1a \uff081\uff09\u5982\u679c\u9700\u8981\u5728Jenkins\u4e2d\u505a\u6301\u7eed\u96c6\u6210\uff0c\u5efa\u8bae\u4f7f\u7528\u7b2c\u4e8c\u79cd\u4efb\u52a1\u680f\u542f\u52a8\u7684\u65b9\u6cd5\u3002 \uff082\uff09\u5982\u679c\u4e0d\u4f1a\u91c7\u7528\u8fdc\u7a0b\u6267\u884c\u7684\uff0c\u5efa\u8bae\u91c7\u7528\u7b2c\u4e00\u79cd\u6216\u8005\u6700\u540e\u4e00\u79cd\u65b9\u6848\u3002 \uff083\uff09\u7b2c\u4e09\u79cd\u548c\u7b2c\u56db\u79cd\u542f\u52a8\u65b9\u6cd5\uff0c\u901a\u5e38\u5728\u6d4b\u8bd5\u7528\u4f8b\u4e2d\u4f1a\u6d89\u53ca\u5230\uff0c\u6240\u4ee5\u5076\u5c14\u4f1a\u7528\u3002"},{"location":"RELEASE/","title":"\u7248\u672c\u66f4\u65b0\u8bb0\u5f55","text":""},{"location":"RELEASE/#2122023822","title":"2.1.2\uff082023/8/22\uff09","text":"new \u589e\u52a0 OCR \u8bc6\u522b\u81ea\u52a8\u91cd\u8bd5\u673a\u5236\uff0c\u9ed8\u8ba4\u91cd\u8bd5 2 \u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u91cd\u8bd5\u6b21\u6570\uff1b \u4f7f\u7528\u7a97\u7ba1\u6700\u65b0\u63d0\u4f9b\u7684\u4e8c\u8fdb\u5236\u63a5\u53e3\uff0c\u4f18\u5316\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u5728 Wayland \u4e0b\u83b7\u53d6\u7a97\u53e3\u4fe1\u606f\u7684\u65b9\u6cd5\uff1b\u611f\u8c22\u684c\u9762\u6d4b\u8bd5\u90e8 @\u4f55\u6743 @\u5b59\u7fe0 \u3001\u7a97\u7ba1\u7814\u53d1 @\u9ec4\u6cfd\u94ed \u7684\u5927\u529b\u652f\u6301\u3002 \u6269\u5145 skipif \u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\u51fd\u6570\uff1a skipif_xdg_type \u652f\u6301 x11 \u6216 wayland \u4e0a\u8df3\u8fc7\uff1b skipif_cpu_name \u652f\u6301\u4e0d\u540c cpu \u4e0a\u8df3\u8fc7\uff0c\u6bd4\u5982\uff1askipif_cpu_name-KLVVW5821\uff1b "},{"location":"RELEASE/#2102023818","title":"2.1.0\uff082023/8/18\uff09","text":"fix \u4fee\u590d SW \u67b6\u6784\u73af\u5883\u4f9d\u8d56\u7684\u95ee\u9898\uff0c\u539f\u56e0\u662f\u4e4b\u524d\u6211\u8fd9\u91cc\u672c\u5730\u6ca1\u6709 SW \u7684\u673a\u5668\uff0c\u6ca1\u6709\u505a\u76f8\u5173\u9002\u914d\uff1b \u4fee\u590d\u5b50\u9879\u76ee\u5355\u72ec\u9700\u8981\u4e09\u65b9\u5305 pexpect\uff0c\u7531\u4e8e\u4e4b\u524d\u662f\u9884\u88c5\u5230\u955c\u50cf\u91cc\u9762\u7684\uff0c\u4f46\u57fa\u7840\u6846\u67b6\u4e0d\u9700\u8981\uff0c\u56e0\u6b64\u6ca1\u6709\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u91cc\u9762\uff0c\u5bfc\u81f4\u5b50\u9879\u76ee\u4f9d\u8d56\u62a5\u9519\u3002 \u4fee\u590d\u5b50\u9879\u76ee cv \u5bfc\u5165\u62a5\u9519\u7684\u95ee\u9898\uff1b \u539f\u56e0\u4e3a\uff1ayouqu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u517c\u5bb9\u4e24\u79cd\u60c5\u51b5\uff0c\u4e00\u79cd\u662f\u9762\u5411\u670d\u52a1\uff0c\u5c31\u662f\u672c\u5730\u6d4b\u8bd5\u673a\u4e0d\u9700\u8981\u5b89\u88c5 OpenCV\uff0c\u7528\u4f8b\u4e2d\u7684\u56fe\u50cf\u8bc6\u522b\u4f1a\u901a\u8fc7\u8fdc\u7a0b\u670d\u52a1\u63a5\u53e3\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u548c\u7ed3\u679c\u83b7\u53d6\uff1b\u7b2c\u4e8c\u79cd\u662f\u539f\u751f\uff0c\u5c31\u662f\u672c\u5730\u76f4\u63a5\u5b89\u88c5 OpenCV \u76f4\u63a5\u7528\u3002\u4e24\u4e2a\u60c5\u51b5\u7684\u4f18\u5148\u7ea7\u662f\u4f18\u5148\u5224\u65ad\u672c\u5730\u5b58\u5728\uff0c\u5426\u5219\u8d70\u670d\u52a1\u3002 \u524d\u9762\u6211\u4eec\u5df2\u7ecf\u628a OCR \u529f\u80fd\u505a\u4e86\u670d\u52a1\u5316\uff0c\u57fa\u4e8e 1 \u5e74\u591a\u4ee5\u6765\u7684\u89c2\u5bdf\uff0c\u7528\u8d77\u6765\u5f88\u7a33\u5b9a\uff0c\u518d\u4e00\u4e2a\u5c31\u662f OpenCV \u5b89\u88c5\u5305\u662f\u6bd4\u8f83\u81c3\u80bf\u7684\uff0c\u7c97\u7565\u6570\u4e86\u4e0b\u4f9d\u8d56\u6709 30+ \u4e2a\uff0c\u800c\u4e14\u5728\u5404\u67b6\u6784\u4e0a\u4f9d\u8d56\u5305\u8fd8\u4e0d\u5c3d\u76f8\u540c\uff0c\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u65b9\u6848\u4e2d\u4e0d\u592a\u597d\u5904\u7406\uff0c\u6240\u4ee5\u672c\u6b21 2.0 \u7248\u672c\u6211\u4eec\u5927\u80c6\u7684\u5c06\u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u529f\u80fd\u4fee\u6539\u4e3a\u9762\u5411\u670d\u52a1\u7684\u65b9\u5f0f\uff0c\u524d\u671f\u6d4b\u8bd5\u4e00\u5207\u770b\u8d77\u6765\u90fd\u5f88\u548c\u8c10\u3002 \u4f46\u662f\u6ca1\u6ce8\u610f\u5230\u4e4b\u524d\u7ed9\u6d77\u71d5\u59d0\u90a3\u8fb9\u9879\u76ee\u5355\u72ec\u5b9a\u5236\u505a\u4e86\u4e2a\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\uff08\u4e3a\u4e86\u80fd\u7b80\u5355\u5e73\u6ed1\u7684\u8fc1\u79fb\u5230 youqu\uff09\uff0c\u6b64\u63a5\u53e3\u5e95\u5c42\u6ca1\u6709\u517c\u5bb9\u670d\u52a1\u5316\uff0c\u6240\u4ee5\u5979\u90a3\u8fb9\u7684\u9879\u76ee\u8c03\u7528\u6b64\u5b9a\u5236\u63a5\u53e3\u4f1a\u62a5 cv \u5bfc\u5165\u7684\u95ee\u9898\u3002 \u7531\u4e8e\u5c06\u8fd9\u4e2a\u5b9a\u5236\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\u8fdb\u884c\u670d\u52a1\u5316\u517c\u5bb9\u6539\u9020\u9700\u8981\u4e00\u5b9a\u65f6\u95f4\uff0c\u6539\u5b8c\u8fd8\u9700\u8981\u6d4b\u8bd5\uff0c\u4f46\u672c\u6b21\u65f6\u95f4\u6bd4\u8f83\u7d27\uff0c\u56e0\u6b64\u5148\u628a OpenCV \u88c5\u8fdb\u865a\u62df\u73af\u5883\uff0c\u540e\u7eed\u7248\u672c\u518d\u8003\u8651\u9488\u5bf9\u6b64\u63a5\u53e3\u505a\u4fee\u6539\u3002"},{"location":"RELEASE/#2002023816","title":"2.0.0\uff082023/8/16\uff09","text":"YouQu\uff08\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff09\u5f00\u6e90\u4e86\uff0c\u540c\u65f6\u63a8\u51fa\u4e86 2.0 \u7248\u672c\u3002 \u611f\u8c22\u738b\u6ce2\u603b\u3001\u67b6\u6784\u5e08\u5f90\u5c0f\u4e1c\u3001\u7814\u53d1\u7ecf\u7406\u90d1\u5e7c\u6208\u3001\u5218\u90d1\u7b49\u7814\u53d1\u540c\u4e8b\u7684\u5927\u529b\u652f\u6301\u3002 new 1\u3001\u65b0\u7684\u57fa\u7840\u6846\u67b6\u4ee3\u7801\u83b7\u53d6\u65b9\u5f0f\u53ca\u65b0\u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4 YouQu \u540e\u7eed\u5747\u901a\u8fc7 PyPI \u8fdb\u884c\u5305\u7684\u53d1\u5e03\uff0c\u4e5f\u5c31\u662f\u8bf4\u540e\u7eed\u53ef\u4ee5\u4f7f\u7528 pip \u8fdb\u884c\u5b89\u88c5\uff1a sudo pip3 install youqu==2.0.0\n \u8fd9\u91cc\u6709 2 \u4e2a\u5c0f\u70b9\u8981\u6ce8\u610f\uff1a \u63a8\u8350\u4f7f\u7528 sudo pip3 \uff08\u52a0 sudo\uff09\u8fdb\u884c\u5b89\u88c5\uff1b \u5982\u679c\u4e0d\u52a0 sudo \u6709\u4e9b\u673a\u5668\u53ef\u80fd $HOME/.local/bin \u4e0d\u5728\u7cfb\u7edf PATH \u73af\u5883\u76ee\u5f55\u4e0b\uff0c\u5728\u4e0d\u6dfb\u52a0\u73af\u5883\u53d8\u91cf\u7684\u60c5\u51b5\u4e0b\uff0c\u4f1a\u51fa\u73b0 YouQu \u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4\uff08youqu-startproject\uff09\u65e0\u6cd5\u4f7f\u7528\u7684\u95ee\u9898\uff1b \u5f53\u7136\uff0c\u5c06\u4e0a\u8ff0\u8def\u5f84\u6dfb\u52a0\u5230\u73af\u5883\u53d8\u91cf\u4e4b\u540e\u4e5f\u662f\u53ef\u4ee5\u7528\u7684\uff0c\u6240\u4ee5\u6211\u8fd9\u91cc\u662f\u63a8\u8350\u52a0 sudo\uff0c\u4e0d\u52a0 sudo \u4e5f\u662f\u53ef\u4ee5\u7684\uff0c\u53ea\u662f\u9700\u8981\u5173\u6ce8\u4e0b\u73af\u5883\u53d8\u91cf\u7684\u95ee\u9898\u3002 \u63a8\u8350\u6307\u5b9a\u7248\u672c\u53f7\uff08youqu==2.0.0\uff09\u5b89\u88c5\uff0c\u5982\u679c\u4e0d\u6307\u5b9a\u7248\u672c\u53f7\u9ed8\u8ba4\u662f\u5b89\u88c5\u6700\u65b0\u53d1\u5e03\u7684 YouQu \u7248\u672c\uff0c\u4f60\u53ef\u4ee5\u5728 PyPI \u4e0a\u7684 Release history \u91cc\u9762\u67e5\u770b\u6709\u54ea\u4e9b\u7248\u672c\u3002 \u5b89\u88c5\u4e4b\u540e\u4f1a\u81ea\u52a8\u751f\u6210\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu-startproject\uff0c\u4f7f\u7528\u5b83\u53ef\u4ee5\u521d\u59cb\u5316\u5de5\u7a0b\uff0c\u8fd9\u91cc\u4ee5\u97f3\u4e50\u4e3e\u4f8b\uff1b youqu-startproject autotest_deepin_music\n \u8fd9\u6837\u5c31\u4f1a\u5728\u5f53\u524d\u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a autotest_deepin_music \u76ee\u5f55\uff0c\u91cc\u9762\u5305\u542b\u4e86\u57fa\u7840\u6846\u67b6\u6240\u6709\u7684\u4ee3\u7801\uff1b \u4e4b\u540e\uff0c\u8fd8\u662f\u5728 apps \u76ee\u5f55\u4e0b\uff0c\u653e\u5165\u5b50\u9879\u76ee\u7684AT\u4ee3\u7801\u5373\u53ef\uff0c\u4f7f\u7528\u65b9\u6cd5\u548c\u8fc7\u53bb\u4e00\u6837\uff0c\u8fd9\u91cc\u5c31\u4e0d\u591a\u4ecb\u7ecd\u3002 \u53e6\u5916\uff0c\u9664\u4e86\u901a\u8fc7 pip \u83b7\u53d6\u4ee5\u5916\uff0c\u4ecd\u7136\u53ef\u4ee5\u901a\u8fc7\u6e90\u7801\u83b7\u53d6\uff08\u76f4\u63a5 git clone\uff09\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u4f7f\u7528 pip \u5b89\u88c5 YouQu \u65f6\uff0cYouQu \u5305\u7684\u5927\u5c0f\u624d 600+ k\uff0c\u5b89\u88c5\u901f\u5ea6\u8d77\u98de\u3002 2\u3001\u65b0\u7684AT\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848 \u4e3a\u4e86\u89e3\u51b3\u4ee5\u4e0b\u95ee\u9898\uff1a \u8fc7\u53bb\u4e00\u6bb5\u65f6\u95f4\u54b1\u4eec\u7ecf\u5e38\u51fa\u73b0\u7684\uff0c\u4e0d\u540c\u7684AT\u9879\u76ee\u5728\u540c\u4e00\u53f0\u673a\u5668\u4e0a\u90e8\u7f72\u73af\u5883\u65f6\u4f9d\u8d56\u7248\u672c\u51b2\u7a81\u7684\u95ee\u9898\uff0c\u65b0\u65b9\u6848\u4e0d\u540c\u7684\u9879\u76ee\u4f1a\u52a8\u6001\u751f\u6210\u81ea\u5df1\u7684\u865a\u62df\u73af\u5883\uff0c\u76f8\u4e92\u4e4b\u95f4\u4e0d\u5f71\u54cd\uff1b \u4e1a\u5185\u4e3a\u4e86\u89e3\u51b3\u7248\u672c\u51b2\u7a81\u95ee\u9898\u4e00\u822c\u90fd\u4f1a\u4f7f\u7528Python\u865a\u62df\u73af\u5883\u7684\u5de5\u5177\uff0c\u4f46\u662f\u90fd\u6709\u4e2a\u95ee\u9898\uff0c\u65e0\u6cd5\u7ba1\u7406 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u5305\uff0c\u672c\u6b21\u6211\u4eec\u89e3\u51b3\u4e86\u8fd9\u4e2a\u95ee\u9898\uff0c\u80fd\u591f\u5b8c\u5168\u7ba1\u7406\u5e38\u89c4\u7684Python\u5305\uff0c\u4e5f\u80fd\u7ba1\u7406\u5230 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u4e09\u65b9\u5305\uff1b \u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u4f7f\u7528\u65b9\u6cd5\uff1a bash env.sh\n \u53ef\u4ee5\u770b\u51fa\u6765\u548c\u539f\u6765\u4f7f\u7528\u65b9\u6cd5\u6ca1\u6709\u53d8\u5316\uff0c\u4e5f\u5c31\u662f\u8bf4\u4ece\u4f7f\u7528\u7684\u89d2\u5ea6\u662f\u5b8c\u5168\u6ca1\u6709\u533a\u522b\u7684\uff0c\u53ea\u662f\u5185\u90e8\u505a\u4e86\u4e0d\u540c\u7684\u4e8b\u60c5\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u672c\u673a\u90e8\u7f72\u7684\u529f\u80fd\u4ecd\u7136\u4fdd\u7559 env_dev.sh\uff0c\u53ef\u4ee5\u4f5c\u4e3a\u5f00\u53d1\u65f6\u7684\u73af\u5883\u90e8\u7f72\u3002 3\u3001\u65b0\u7684\u9a71\u52a8\u547d\u4ee4 \u8fc7\u53bb\u54b1\u4eec\u90fd\u662f\u4f7f\u7528\u8fd9\u6837\u7684\u547d\u4ee4\u6765\u9a71\u52a8\u6267\u884c\uff1a python3 manage.py run\n \u7531\u4e8e\u9ed8\u8ba4\u57fa\u4e8e\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848\uff0c\u56e0\u6b64\u6211\u4eec\u589e\u52a0\u4e86\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu\uff1b \u65b0\u7684\u9a71\u52a8\u65b9\u5f0f\uff1a youqu manage.py run\n \u53ea\u9700\u8981\u628a python3 \u66ff\u6362\u6210 youqu \u5c31\u53ef\u4ee5\u4e86\uff0c\u770b\u8d77\u6765\u5f88\u548c\u8c10~ 4\u3001\u65b0\u7684\u6587\u6863\u5730\u5740 \u8fc7\u53bb\u54b1\u4eec YouQu \u7684\u5728\u7ebf\u6587\u6863\u662f\u90e8\u7f72\u5728\u516c\u53f8\u5185\u7f51\u7684\uff0c\u73b0\u5728\u5f00\u6e90\u5230 github \u4e86\uff0c\u5916\u90e8\u5f00\u53d1\u8005\u80af\u5b9a\u8bbf\u95ee\u4e0d\u5230\u5185\u7f51\u7684\u6587\u6863\uff0c\u56e0\u6b64\u9700\u8981\u5c06\u6587\u6863\u90e8\u7f72\u5230\u516c\u7f51\u3010\u516c\u7f51\u6587\u6863\u3011\uff1b \u516c\u7f51\u6587\u6863\u4f7f\u7528\u7684\u662f github pages\uff08\u767d\u5ad6\u602a\u4e00\u987f\u72c2\u559c~~\uff09\uff0c\u4f46\u53ef\u80fd\u4f1a\u51fa\u73b0\u6587\u6863\u901f\u5ea6\u6162\u7684\u95ee\u9898\uff08\u4ee3\u7406\u4e0b\u5c31\u597d\u4e86\uff09\uff0c\u4e0d\u8fc7\u6ca1\u5173\u7cfb\uff0c\u54b1\u4eec\u3010\u5185\u7f51\u6587\u6863\u3011\u4ecd\u7136\u4fdd\u7559\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u3002 5\u3001\u5176\u4ed6\u4e00\u4e9b\u5c0f\u5c0f\u529f\u80fd\u66f4\u65b0\uff1a \uff081\uff09\u65b0\u589e\u5173\u95ed\u5206\u8fa8\u7387\u68c0\u6d4b\u7684\u53c2\u6570\u503c\uff1b youqu manage.py run --resolution no\n \u6216\u8005\u4fee\u6539 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387, \u6bd4\u5982\uff1a1920x1080\n;no: \u8868\u793a\u4e0d\u505a\u5206\u8fa8\u7387\u6821\u9a8c\nRESOLUTION = 1920x1080\n resolution \u8fd9\u4e2a\u53c2\u6570\u4e00\u76f4\u90fd\u6709\u7684\uff0c\u53ea\u4e0d\u8fc7\u4e4b\u524d\u662f\u7528\u4e8e\u6307\u5b9a\u5206\u8fa8\u7387\u5927\u5c0f\uff0c\u6bd4\u5982 --resolution 1920x1080\uff0c\u4f46\u6709\u4e9b\u63a5\u53e3\u7684\u9879\u76ee\u4e0d\u9700\u8981\u8fd9\u4e2a\u68c0\u67e5\uff0c\u53ef\u4ee5\u7ed9\u5b83\u4e2a no \u5c31\u597d\u4e86\uff0c\u5f53\u7136 CICD \u4e0a\u5173\u95ed\uff0c\u9700\u8981\u6d41\u6c34\u7ebf\u4e0a\u628a\u8fd9\u4e2a\u53c2\u6570\u52a0\u4e0a\uff1b \uff082\uff09\u65b0\u589e\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u7684\u547d\u4ee4\u884c\u53c2\u6570 \u4e4b\u524d\u8fd9\u4e2a\u914d\u7f6e\u9879\u53ea\u80fd\u5728 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c 1 \u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff0cRERUN >= RECORD_FAILED_CASE\u3002\n;1.\u5173\u95ed\u5f55\u5c4f\uff1aRECORD_FAILED_CASE > RERUN\n;2.\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1aRECORD_FAILED_CASE = 0\nRECORD_FAILED_CASE = 1\n \u73b0\u5728\u5c06\u5f00\u53d1\u5230\u547d\u4ee4\u884c\u53c2\u6570\u3002 youqu manage.py run --record_failed_case 2\n fix \u4fee\u590d remote \u6267\u884c\u65f6\uff0c\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u65e0\u6cd5\u751f\u6210\u6d4b\u8bd5\u62a5\u544a\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1302023710","title":"1.3.0\uff082023/7/10\uff09","text":"fix \u8fdb\u4e00\u6b65\u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b\u53c2\u8003\uff1a\u914d\u7f6ePython\u6e90\u7684\u51e0\u79cd\u65b9\u6cd5 \u4fee\u590d wayland_autotool \u53d7\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86wayland\u4e0b\u5076\u73b0\u627e\u4e0d\u5230 .Xauthority \u6587\u4ef6\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1292023626","title":"1.2.9\uff082023/6/26\uff09","text":"fix \u4f18\u5316\u8fdc\u7a0b\u6267\u884c remote \u7684\u53c2\u6570\u76f4\u63a5\u4f20\u7ed9\u8fdc\u7a0b\u673a\u5668\u7684 run \u547d\u4ee4\uff0c\u4e0d\u7528\u518d\u5355\u72ec\u5904\u7406\u8fdc\u7a0b\u6267\u884c\u7684\u53c2\u6570\u903b\u8f91\uff0c\u540e\u7eed\u4e13\u6ce8\u4e8e\u672c\u5730\u6267\u884c\u529f\u80fd\u5f00\u53d1\uff0c\u8fdc\u7a0b\u6267\u884c\u81ea\u52a8\u9002\u7528\uff1b env.sh \u79fb\u9664 pyyaml \u5b89\u88c5\uff0c\u7531\u5b50\u9879\u76ee\u5728 requirement.txt \u91cc\u9762\u5b9a\u4e49\uff0c\u6846\u67b6\u81ea\u52a8\u52a0\u8f7d\uff1b \u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b "},{"location":"RELEASE/#128202369","title":"1.2.8\uff082023/6/9\uff09","text":"fix \u4fee\u590d\u4e86 pypi \u5b89\u88c5 numpy \u5b58\u5728\u7cfb\u7edf\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#127202368","title":"1.2.7\uff082023/6/8\uff09","text":"fix env.sh \u4e2d\u5b89\u88c5 Python \u5305\u672a\u6307\u5b9a\u7248\u672c\u65f6\uff0c\u65e5\u5fd7\u8f93\u51fa\u5b89\u88c5\u7684\u7248\u672c\uff1b pdocr-rpc 2.0.1\nallure-custom 1.2.1\nfunnylog 1.1.3\n \u4fee\u590d -f \u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u62a5\u9519\u7684\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#126202367","title":"1.2.6\uff082023/6/7\uff09","text":"fix \u4fee\u590d wayland \u4e0a\u8c03\u7528\u9f20\u6807\u4e2d\u952e\u3001\u53f3\u952e\u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b \u4fee\u590d pubilic/dde_desktop_public_widget \u91cc\u9762\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u5b9a\u4f4d\u684c\u9762\u6587\u4ef6\u7684\u65b9\u6cd5\uff0c\u5750\u6807\u6ca1\u6709\u62c6\u5305\u7684\u95ee\u9898\uff1b \u4f18\u5316\u4e86\u7b49\u5f85\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b pycreeze \u7248\u672c\u5347\u7ea7\u5230 0.1.29\uff0c\u5bfc\u81f4\u4e0e pyautogui 0.9.53 \u4e0d\u517c\u5bb9\uff0cenv.sh \u91cc\u9762\u589e\u52a0\u6307\u5b9a pycreeze \u7248\u672c\u4e3a 0.1.28\uff1b "},{"location":"RELEASE/#1252023516","title":"1.2.5\uff082023/5/16\uff09","text":"new --app \u53c2\u6570\u540e\u9762\u65b0\u589e\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u76ee\u524d\u652f\u6301\u4e09\u79cd\u53c2\u6570\u4f20\u5165\u65b9\u5f0f\uff1a ~$: youqu run -a deepin-music\n~$: youqu run -a autotest_deepin_music\n~$: youqu run -a apps/autotest_deepin_music\n \u200b \u540e\u4e24\u79cd\u5165\u53c2\u65b9\u5f0f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\u3002 remote \u8fdc\u7a0b\u6267\u884c\u65b0\u589e\u4ece\u547d\u4ee4\u884c\u4f20\u5165\u6d4b\u8bd5\u673a\u4fe1\u606f\uff0c\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679c password \u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6 setting/remote.ini \u4e2d CLIENT_PASSWORD \u7684\u503c,\u6bd4\u5982\uff1auos@10.8.13.33:1 \u6216 uos@10.8.13.33 \uff1b python3 manage.py remote -c uos@10.8.13.33/uos@10.8.13.34\npython3 manage.py remote -c uos@10.8.13.33:1/uos@10.8.13.34:2\n fix \u65e5\u5fd7\u6a21\u5757\u4fee\u6539\u4e3a\u51fd\u6570\u6267\u884c\u4e4b\u524d\u6253\u5370\u65e5\u5fd7\uff1b \u65e5\u5fd7\u6a21\u5757\u589e\u52a0\u767d\u540d\u5355\uff0c\u901a\u8fc7\u7c7b\u540d\u5f00\u5934\uff0c\u7ed3\u675f\uff0c\u5305\u542b\u7b49\u5173\u952e\u5b57\u63a7\u5236\u9700\u8981\u6253\u5370\u7684\u51fd\u6570\u65e5\u5fd7\uff1b \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5982\u679c\u4f20\u5165\u4e86 app_name \u53ea\u4f1a\u5c06 apps \u76ee\u5f55\u4e0b app_name \u7684\u76ee\u5f55\u53d1\u9001\u5230\u6d4b\u8bd5\u673a\uff1b env.sh \u79fb\u9664 python3-dev\uff1b \u4fee\u590d Wayland \u4e0b env.sh \u73af\u5883\u5b89\u88c5\u5931\u8d25\u7684\u95ee\u9898\uff0c\u4f18\u5316\u4e86 deb \u4f9d\u8d56\u5b89\u88c5\u7684\u903b\u8f91\uff1b \u5c06 env.sh \u5237\u65b0\u6e90\u7684\u65e5\u5fd7\u5728\u7ec8\u7aef\u663e\u793a\uff0c\u89e3\u51b3\u5728 CI \u73af\u5883\u4e0b\uff0c\u957f\u65f6\u95f4\u4e0d\u8f93\u51fa\u65e5\u5fd7\u8fde\u63a5\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d1060 \u534e\u4e3a\u673a\u578b\u5b89\u88c5\u952e\u9f20\u5de5\u5177\u65f6\u4f9d\u8d56\u4e0d\u517c\u5bb9\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1242023227","title":"1.2.4\uff082023/2/27\uff09","text":"fix \u4fee\u6539 CURRENT \u6587\u4ef6\uff1b "},{"location":"RELEASE/#1232023227","title":"1.2.3\uff082023/2/27\uff09","text":"new pylint.sh \u652f\u6301\u901a\u8fc7\u4f4d\u7f6e\u53c2\u6570\u4f20\u5165\u6587\u4ef6\u8def\u5f84\uff1abash pylint.sh apps/autotest_deepin_music,\u597d\u5904\u662f\u53c2\u6570\u8def\u5f84\u53ef\u4ee5\u5728\u7ec8\u7aef\u8865\u5168\uff1b \u65b0\u589e\u7cfb\u7edf\u547d\u4ee4 youqu-pylint \uff0c\u7528\u4e8e\u9759\u6001\u4ee3\u7801\u626b\u63cf\uff0c\u4f7f\u7528\u65b9\u6cd5: youqu-pylint apps/autotest_deepin_music\uff1b \u7531\u4e8e\u7cfb\u7edf\u4e00\u4e9b dbus \u63a5\u53e3\u6539\u53d8\uff0c\u516c\u5171\u5e93\u4e2d\u7684 dbus \u65b9\u6cd5\u5c06\u4e0d\u518d\u7ef4\u62a4\uff0c\u7531\u5b50\u9879\u76ee\u5728 other_widget.py \u91cc\u9762\u8fdb\u884c\u7ef4\u62a4\uff1b fix \u4fee\u590d ssh \u73af\u5883\u4e0b\u8fd0\u884c\u63d0\u793a \u201c\u65e0\u6cd5\u8fde\u63a5\u201d \u7684\u95ee\u9898\uff1b \u4fee\u590d\u8fd0\u884c\u65f6\u7a0b\u5e8f\u9000\u51fa\uff0c\u4e0d\u8f93\u51fa\u5f02\u5e38\u65e5\u5fd7\u7684\u95ee\u9898\uff1b \u4fee\u590dyouqu remote xxx \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5728\u670d\u52a1\u7aef Ctrl + C \u65e0\u6cd5\u505c\u6b62\u7a0b\u5e8f\u8fd0\u884c\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#122202328","title":"1.2.2\uff082023/2/8\uff09","text":"new \u65b0\u589e\u6c14\u6ce1\u7c7b\u56fe\u50cf\u8bc6\u522b\u65b9\u6848\uff1bimage_utils.py::ImageUtil::get_during\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u533a\u57df\u8bc6\u522b\uff0c\u4f20\u5165 [x, y, w, h]\uff0cx: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u76ee\u6807\u56fe\u7247\uff0c\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\uff1b env.sh \u79fb\u9664 pypinyin; \u4f18\u5316\u6267\u884c env.sh \u65f6\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b manage.py \u79fb\u9664\u4e86\u53c2\u6570 session_timeout \uff0c\u6846\u67b6\u6839\u636e\u5168\u5c40\u7684 timeout \u4ee5\u53ca\u7528\u4f8b\u81ea\u5b9a\u4e49\u7684 timeout \u81ea\u52a8\u8ba1\u7b97\u51fa sessiontimeout \u7684\u503c\uff1b \u65b0\u589e ocr \u670d\u52a1\u5668\u94fe\u63a5\u91cd\u8bd5\uff0c\u9ed8\u8ba4\u91cd\u8bd51\u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u53c2\u6570\uff1b fix \u4fee\u590d\u4e86\u4e00\u4e9b pylint \u626b\u63cf\u7684\u4ee3\u7801\u98ce\u683c\u95ee\u9898\uff1b \u91cd\u65b0\u8bbe\u8ba1\u4e86\u6d4b\u8bd5\u62a5\u544a\u4e3b\u9898\uff1b "},{"location":"RELEASE/#121202316","title":"1.2.1\uff082023/1/6\uff09","text":"new \u652f\u6301\u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6267\u884c\u7528\u4f8b\uff1b\u53ef\u5c06python3 manage.py \u66ff\u6362\u4e3a youqu \uff1a youqu run -a deepin-music -k 001\n RPC \u670d\u52a1 IP \u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u6307\u5b9a\u4e0d\u540c\u7684\u7aef\u53e3\uff1b \u5728\u7ebf\u6587\u6863\u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u539f\u6765\u7684\u5730\u5740 10.8.10.215 \u5c06\u4e0d\u5728\u4f7f\u7528\uff1b fix \u4fee\u590d --count \u53c2\u6570\u53ef\u80fd\u51fa\u73b0\u4e0e\u5176\u4ed6\u6846\u67b6\u7684\u5de5\u7a0b\u4f9d\u8d56\u5b58\u5728\u51b2\u7a81\uff0c\u62a5\u9519\u91cd\u590d\u6ce8\u518c\u7684\u95ee\u9898\uff1b \u4fee\u590d CI \u73af\u5883\u4e0b\u591a\u4e2a\u5de5\u7a0b\u5b58\u5728 Python \u73af\u5883\u53d8\u91cf\u6307\u5411\u9519\u8bef\uff0c\u5bfc\u5305\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u5355\u72ec\u8fd0\u884c\u65b9\u6cd5\u65f6\u65e0\u65e5\u5fd7\u8f93\u51fa\u7684 Bug\uff1b "},{"location":"RELEASE/#12020221230","title":"1.2.0\uff082022/12/30\uff09","text":"1.1.4 \u7248\u672c\u9002\u914d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e14\u65b0\u589e\u4e86\u8f83\u591a\u65b0\u7279\u6027\uff0c\u6211\u4eec\u8ba1\u5212\u4f7f\u7528 1.1.4 \u7248\u672c\u8fd0\u884c\u4e00\u6bb5\u65f6\u95f4\uff0c1.2.0 \u7248\u672c\u5c06\u4fee\u590d\u671f\u95f4\u51fa\u73b0\u7684 Bug\uff0c\u7136\u540e\u4f5c\u4e3a\u7a33\u5b9a\u7248\u672c\u53d1\u5e03\u3002 new \u4fee\u6539\u5de5\u7a0b\u540d\u79f0\u4e3a youqu\uff1b \u5c06 sphinx \u6587\u6863\u5de5\u7a0b\u8fc1\u79fb\u5230\u5355\u72ec\u7684\u4ed3\u5e93\uff1b fix \u4fee\u590d startapp \u521b\u5efa\u5de5\u7a0b\u65f6\u5b58\u5728\u5de5\u7a0b\u540d\u79f0\u65f6\u65e0\u6cd5\u7ee7\u7eed\u521b\u5efa\uff1b \u4fee\u590d\u4e86 OCR \u670d\u52a1\u5728\u5e76\u53d1\u65f6\u53ef\u80fd\u51fa\u73b0\u65e0\u6cd5\u8fd4\u56de\u7ed3\u679c\u7684\u95ee\u9898\uff0c\u63d0\u5347 OCR \u670d\u52a1\u9ad8\u5e76\u53d1\u7a33\u5b9a\u6027\uff1b \u4fee\u590d PMS \u540c\u6b65\u6807\u7b7e\u5230 CSV \u6587\u4ef6\u4e0d\u652f\u6301\u7528\u4f8b\u5e93\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11420221214","title":"1.1.4\uff082022/12/14\uff09","text":"new \u65b0\u589e startapp \u5b50\u547d\u4ee4\u521b\u5efa\u5b50\u9879\u76ee\u5de5\u7a0b\u6a21\u677f: python3 manage.py startapp autotest_deepin_xxx \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u91cd\u590d\u6267\u884c\u6b21\u6570\uff1b \u53bb\u6389\u6279\u91cf\u6267\u884c\u524d\u6536\u96c6\u7528\u4f8b\u7684\u6b65\u9aa4\uff1b \u589e\u52a0\u5f00\u59cb\u6267\u884c\u65f6\u6253\u5370\u4e00\u4e9b\u6267\u884c\u53c2\u6570\uff0c\u5982\uff1a \u7528\u4f8b\u6536\u96c6\u6570\u91cf: 99\n\u5931\u8d25\u91cd\u8dd1\u6b21\u6570: 1\n\u6700\u5927\u5931\u8d25\u6b21\u6570: 49\n\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4: 200.0s (03\u520620\u79d2)\n\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4: 11880s (3\u5c0f\u65f618\u52060\u79d2)\n \u5b9a\u5236\u4fee\u6539allure\u62a5\u544alogo\u3001title\u3001\u9ed8\u8ba4\u8bed\u8a00\uff1b manage.py \u6267\u884c\u5f00\u59cb\u65f6\u6253\u5370 logo \u548c\u5f53\u524d\u7248\u672c\uff1a \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u255a\u2588\u2588\u2557 \u2588\u2588\u2554\u255d \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2584\u2584 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2580\u2580\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u2584\u2588 \u2584\u2588 \u2588 \u2588 \u2588 \u2584 \u2588 \u2584 \u2580\u2580\u2588 \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\uff1b \u88c5\u9970\u5668\u65b9\u6cd5\u6307\u5b9a\u6b21\u6570\uff1b @pytest.mark.count(2)\ndef test_music_001():\npass\n \u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u6b21\u6570\uff1b python3 manage.py run -a deepin-music -k 001 --count 2\n \u200b image_utils \u589e\u52a0\u51fd\u6570 save_temporary_picture\uff0c\u652f\u6301\u6307\u5b9a\u5c4f\u5e55\u533a\u57df\u622a\u56fe\u5e76\u8fd4\u56de\u56fe\u7247\u5b58\u653e\u7684\u672c\u5730\u8def\u5f84\uff0c\u540e\u7eed\u4f7f\u7528 assert_image_exist \u8fdb\u884c\u65ad\u8a00 Python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(x, y, width, height) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) button_center \u65b0\u589e btn_size \u83b7\u53d6\u63a7\u4ef6\u5de6\u4e0a\u89d2\u5750\u6807\u53ca\u957f\u5bbd\uff0c\u7528\u4e8e\u52a8\u6001\u7684\u622a\u53d6\u5143\u7d20\u7684\u56fe\u7247\uff0c\u53ef\u7528\u4e8e\u5b9a\u4f4d\u65ad\u8a00 python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u6240\u6709\u97f3\u4e50\u6309\u94ae\")) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) allure \u62a5\u544a\u4e2d\u5b9a\u4f4d\u95ee\u9898\u9664\u4e86\u65e5\u5fd7\u3001\u622a\u56fe\u3001\u5f55\u5c4f\u5916\uff0c\u8c03\u7528\u7684\u51fd\u6570\u589e\u52a0\u4e86 step \u6b65\u9aa4\u5c55\u793a\uff1b env.sh \u65b0\u589e\u5b89\u88c5\u5b50\u9879\u76ee Python \u4e09\u65b9\u4f9d\u8d56\uff0c\u5728\u5b50\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u5199 requirement.txt \u6587\u4ef6\uff0cenv.sh \u4f1a\u81ea\u52a8\u52a0\u8f7d\uff1b ocr \u8bc6\u522b\u65b0\u589e\u652f\u6301\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\u8fdb\u884c\u6587\u5b57\u8bc6\u522b\uff0c\u51cf\u5c11\u56e0\u5168\u5c4f\u8bc6\u522b\u65f6\uff0c\u5176\u4ed6\u6587\u5b57\u7684\u5e72\u6270 Python # \u65ad\u8a00\u97f3\u4e50\u7684\u5220\u9664\u5f39\u7a97\u4e2d\uff0c\u5305\u542b\u4e86\u201c\u786e\u8ba4\u201d\u7684\u6587\u5b57 self.assert_ocr_exist(\"\u786e\u8ba4\", picture_abspath=DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u5220\u9664\u5f39\u7a97\"))) \u65ad\u8a00\u51fd\u6570\u7684\u8c03\u7528\u4e5f\u4f1a\u81ea\u52a8\u6253\u5370\u65e5\u5fd7; env.sh \u65b0\u589e\u88c1\u526a\u4f9d\u8d56\u7684\u65b9\u6848\uff1b fix \u4fee\u590d Jenkins \u73af\u5883\u4e0b\uff0c apps \u76ee\u5f55\u4e0b\u5b50\u9879\u76ee\u5b58\u5728 auotest_deepin_xxx@tmp \u76ee\u5f55\uff0c\u5728\u4f20\u5165 app_name \u540e\u65e0\u6cd5\u6267\u884c\u7528\u4f8b\u7684\u95ee\u9898\uff1b \u4fee\u590d\u81ea\u52a8\u751f\u6210 case_list.csv \u6587\u4ef6\u65f6\uff0c\u7528\u4f8b\u987a\u5e8f\u88ab\u8c03\u6574\u7684\u95ee\u9898\uff1b env.sh \u73af\u5883\u5b89\u88c5\u79fb\u9664 git \u548c curl\uff1b \u4fee\u590d\u7528\u4f8b\u5728 setup \u9636\u6bb5\u62a5\u9519\u540e\uff0c\u672a\u5199\u5165 ci_result.json \u7684\u95ee\u9898\uff1b \u79fb\u9664 uos_ci.py\uff1b "},{"location":"RELEASE/#11320221028","title":"1.1.3\uff082022/10/28\uff09","text":"new \u65b0\u589e\u56fe\u50cf\u65ad\u8a00\u6210\u529f\u8f93\u51fa\u5339\u914d\u5ea6\uff1b \u65b0\u589e\u73af\u5883\u5b89\u88c5 yaml \u4f9d\u8d56\uff1b \u65b0\u589e\u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6570\u636e\u56de\u586b\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b \u65b0\u589e\u6d4b\u8bd5\u7ed3\u679c\u8868\u60c5\u663e\u793a\uff0c\u5e76\u4f18\u5316\u4e86\u65e5\u5fd7\u7684\u6392\u7248\uff1b \u65b0\u589e --top {number} \u7528\u4e8e\u8bb0\u5f55\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0c\u65e5\u5fd7\u751f\u6210\u5230 report/logs/top.log\uff1b fix \u4fee\u590d\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4f46\u7ec8\u7aef\u6ca1\u6709\u9519\u8bef\u65e5\u5fd7\u8f93\u51fa\u7684\u95ee\u9898\uff1b \u4fee\u6539\u5931\u8d25\u7528\u4f8b\u56de\u6eaf\u65e5\u5fd7\u4e3a\u8be6\u7ec6\u7ea7\u522b\uff1b \u4fee\u590d\u4e86\u6267\u884c\u8fdb\u5ea6\u672a\u8ba1\u7b97\u8df3\u8fc7\u7528\u4f8b\u7684\u95ee\u9898\uff0c\u5e76\u4f18\u5316\u4e86\u8fdb\u5ea6\u83b7\u53d6\u7684\u7b97\u6cd5\uff1b \u4fee\u590d env.sh \u5728 V23 \u73af\u5883\u4e0b\u5b89\u88c5\u65e0\u6cd5\u8bfb\u53d6\u5bc6\u7801\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 pms \u6d4b\u8bd5\u5957\u6267\u884c\u6216\u6d4b\u8bd5\u5355\u6267\u884c\u65f6\uff0c\u7528\u4f8bID\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b env.sh \u91cc\u9762 hub.deepin.com \u66f4\u6362\u6210 it.uniontech.com\uff1b uos_ci.py \u6d4b\u8bd5\u7ed3\u679c\u7edf\u8ba1\u65f6\uff0c\u603b\u6570\u5254\u9664 skip \u7684\u6570\u91cf "},{"location":"RELEASE/#11220220921","title":"1.1.2\uff082022/09/21\uff09","text":"new \u5728\u6ca1\u6709\u5b89\u88c5 dogtail \u7684\u60c5\u51b5\u4e0b\uff0c\u4e5f\u80fd\u4f7f\u7528 sniff \u5de5\u5177\uff1b fix \u4fee\u590d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e2d\u6ca1\u6709\u5b89\u88c5 AT \u73af\u5883\u6267\u884c uos_ci.py \u62a5\u9519\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11120220919","title":"1.1.1\uff082022/09/19\uff09","text":"new \u65b0\u589e\u6267\u884c\u8fdb\u5ea6\u663e\u793a\uff0c\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u65f6\u65e5\u5fd7\u8f93\u51fa\u5f53\u524d\u8fdb\u5ea6\uff1a[\u5f53\u524d\u6307\u5b9a\u7b2c\u51e0\u6761/\u7528\u4f8b\u603b\u6570]\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u7528\u4f8b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\u6240\u6709\u5931\u8d25\u7528\u4f8b\u7684\u5217\u8868\uff1b \u5173\u95ed\u7ec8\u7aef\u8f93\u51fa\u6355\u83b7\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u65e5\u5fd7\u5feb\u7167\uff1b \u4f18\u5316\u7ec8\u7aef\u8f93\u51fa\u5931\u8d25\u4fe1\u606f\u5197\u957f\u4e3a\u7b80\u8981\u4fe1\u606f\u8f93\u51fa\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u663e\u793a 10 \u4e2a\u6267\u884c\u6700\u6162\u7684\u7528\u4f8b\u5217\u8868\uff0c\u5e76\u8be6\u7ec6\u5217\u51fa\u5404\u4e2a\u9636\u6bb5\u7684\u8017\u65f6\uff1b \u5931\u8d25\u91cd\u8dd1\u7528\u4f8b\u91cd\u8dd1\u4e4b\u524d\u5ef6\u8fdf 1 \u79d2\uff1b \u65b0\u589e\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4ecd\u7136\u5f3a\u5236\u6267\u884c\uff1b \u7528\u4f8b\u6536\u96c6\u65f6\u4ec5\u5728 apps \u76ee\u5f55\u4e0b\u8fdb\u884c\uff0c\u5ffd\u7565 src,setting,public \u76ee\u5f55\uff1b \u65b0\u589e allure \u62a5\u544a\u5907\u4efd\u529f\u80fd\uff0c\u9ed8\u8ba4\u5907\u4efd\u81f3 allure_back \u76ee\u5f55\u4e0b\uff1b manage.py\u65b0\u589e\u53c2\u6570 --lastfailed \u7528\u4e8e\u53ea\u8dd1\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\u7684\u529f\u80fd\uff1b fix \u4fee\u590d\u4e86\u5728\u6ca1\u6709\u6307\u5b9a\u5e94\u7528\u540d\u79f0\u6267\u884c\u65f6\uff0cxml \u62a5\u544a\u751f\u6210\u8def\u5f84\u5f02\u5e38\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 uos_ci.py \u4f20\u5165 timeout \u548c session_timeout \u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11020220916","title":"1.1.0\uff082022/09/16\uff09","text":"new \u65b0\u589ePMS\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u652f\u6301\u591a\u79cd\u6570\u636e\u56de\u586b\u6a21\u5f0f\uff1b \u4f18\u5316\u4e86\u901a\u8fc7\u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u65f6PMS \u722c\u866b\u7684\u6027\u80fd\uff1b \u65b0\u589e .gitmodules \u6587\u4ef6\uff0c\u7528\u4e8e\u6807\u8bb0\u6240\u6709\u5b50\u9879\u76ee\uff0c\u65b9\u4fbf\u7edf\u4e00\u62c9\u53d6\u4ee3\u7801\uff1b env.sh \u9002\u914d\u793e\u533a\u7248\u4e0a\u5b89\u88c5\u81ea\u52a8\u5316\u73af\u5883\uff1b \u589e\u52a0\u6267\u884c\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u9519\u8bef\u7684\u529f\u80fd\uff1b README.md \u589e\u52a0 Wayland \u4e0b\u4f7f\u7528\u3001\u6d4b\u8bd5\u62a5\u544a\u67e5\u770b\u3001\u5e38\u89c1\u95ee\u9898\u7b49\u7684\u6587\u6863\u8bf4\u660e\uff1b \u589e\u52a0\u4e86\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u5bf9 setup\u3001call\u3001teardown \u8fdb\u884c\u65e5\u5fd7\u5206\u6bb5\uff1b fix \u4fee\u590d\u4e86 \u786e\u8ba4\u4fee\u590d \u5217\u6ca1\u5199\u8868\u5934\uff0c\u4f46\u5199\u4e86 fixed-xxx \u6807\u7b7e\uff0c\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u540c\u4e00\u5e94\u7528\u5185\u591a\u4e2a csv \u6587\u4ef6\u4e2d \u786e\u8ba4\u4fee\u590d \u5217\u6709\u7684\u5199\u4e86\uff0c\u6709\u7684\u6ca1\u5199\uff0c\u53ef\u80fd\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 INFO \u65e5\u5fd7\uff0c\u663e\u793a\u4e3a DEBUG \u7684\u95ee\u9898\uff1b\u4fee\u590d\u4e86\u90e8\u5206\u673a\u5668\u4e0a INFO \u65e5\u5fd7\u5185\u5bb9\u663e\u793a\u4e3a\u7ea2\u8272\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\u770b\u4e0d\u5230\u8be6\u7ec6\u4fe1\u606f\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10220220822","title":"1.0.2\uff082022/08/22\uff09","text":"new \u79fb\u9664 loguru\uff0c\u66ff\u6362\u4e3a logging\uff0c\u63a5\u53e3\u4fdd\u6301\u4e0d\u53d8\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u53d7\u5f71\u54cd\uff1b \u9ed8\u8ba4\u5f00\u542f coredump\uff1b fix \u4fee\u590d\u4e86\u4e09\u65b9\u5e93 loguru \u5076\u73b0\u5f02\u5e38\uff0c\u5bfc\u81f4\u7a0b\u5e8f\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7b2c\u4e00\u6b21\u5931\u8d25\u4e0d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10120220812","title":"1.0.1\uff082022/08/12\uff09","text":"new \u65b0\u589e RELEASE.md \u6587\u4ef6\uff0c\u7528\u4e8e\u8bb0\u5f55\u5386\u53f2\u53d1\u5e03\u7248\u672c\u7684\u66f4\u65b0\u5185\u5bb9\uff1b \u517c\u5bb9 Wayland \u6a21\u5f0f\u4e0b\u6267\u884c\u7528\u4f8b\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u7528\u7ba1\u5f53\u524d\u6d4b\u8bd5\u673a\u6267\u884c\u73af\u5883\uff0c\u6846\u67b6\u4f1a\u81ea\u52a8\u6839\u636e\u5f53\u524d\u73af\u5883\u8d70\u4e0d\u540c\u7684\u4ee3\u7801\u903b\u8f91\uff1b \u7531\u4e8e\u9700\u8981\u4fee\u6539 dogtail \u6e90\u4ee3\u7801\uff0c\u56e0\u6b64\u5c06\u4fee\u6539\u540e\u7684\u6e90\u7801\u653e\u5165\u5230\u6838\u5fc3\u5e93\u91cc\u9762 src/depends/dogtail \u540e\u7eed\u7248\u672c\u5c06\u4e0d\u9700\u8981\u5728\u7cfb\u7edf\u4e2d\u5b89\u88c5dogtail\uff1b \u5982\u679c\u5e94\u7528\u5e93\u540c\u6837\u4f7f\u7528\u4e86\u7cfb\u7edf\u5b89\u88c5\u7684 dogtail \u53ef\u80fd\u4f1a\u62a5\u9519\uff0c\u89e3\u51b3\u65b9\u6848\u662f\u5c06\u4ee3\u7801\u4e2d\u7684 import dogtail \u4fee\u6539\u4e3a from src.depends import dogtail ; fix \u91cd\u8dd1\u5931\u8d25\u4e4b\u540e\u624d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff0c\u4fee\u6539\u4e3a\u5931\u8d25\u4e4b\u540e\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":"# Attribution \uff1achengdu Test Team\n# Date \uff1a2021/08/20\n \u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d \u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d \u4ed3\u5e93\u5730\u5740\uff1ahttps://gitlabcd.uniontech.com/autotest/cd-desktop-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u65b9\u6848\u6982\u8ff0","text":"\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u667a\u80fd\u8bc6\u522b\u5e94\u7528\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u7528\u4e8e\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u64cd\u4f5c\u8fc7\u7a0b\u4e2d\u7684\u5143\u7d20\u5b9a\u4f4d\u4ee5\u53ca\u5224\u65ad\u7ed3\u679c\u65f6\u7684\u65ad\u8a00\u5904\u7406\uff1b\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\uff0c\u6d4b\u8bd5\u673a\u4e0a\u7684\u753b\u9762\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u5230\u670d\u52a1\u5668\u4e0a\uff0c\u670d\u52a1\u5668\u5bf9\u89c6\u9891\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\u540e\uff0c\u670d\u52a1\u5668\u667a\u80fd\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\u6210\u529f\uff0c\u7136\u540e\u5bf9\u6d4b\u8bd5\u673a\u4e0b\u53d1\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\uff0c\u6d4b\u8bd5\u673a\u63a5\u53d7\u5e76\u6267\u884c\u4e0b\u4e00\u6b65\u64cd\u4f5c\u3002 \u670d\u52a1\u5668\u4e0e\u6d4b\u8bd5\u673a\u4e4b\u95f4\u7684\u94fe\u63a5\uff1a \u670d\u52a1\u5668\u901a\u8fc7 USB \u4e32\u53e3\u8bbe\u5907\uff08USB-HID \u534f\u8bae\uff09\u6a21\u62df\u9f20\u6807\u952e\u76d8\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u64cd\u4f5c\u3002 \u901a\u8fc7\u89c6\u9891\u91c7\u96c6\u8bbe\u5907\u6355\u83b7\u6d4b\u8bd5\u673a\u7684\u5b9e\u65f6\u753b\u9762\u4f20\u8f93\u7ed9\u670d\u52a1\u5668\u3002 \u670d\u52a1\u5668\u5bf9\u91c7\u96c6\u7684\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\uff0c\u8bc6\u522b\u5176\u4e2d\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5e76\u8fd4\u56de\u5143\u7d20\u63a7\u4ef6\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\uff0c\u670d\u52a1\u5668\u901a\u8fc7\u667a\u80fd\u5316\u5206\u6790\uff0c\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e00\u81f4\u5c06\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\u901a\u8fc7\u4e32\u53e3\u6a21\u62df\u952e\u9f20\u4fe1\u53f7\u53d1\u9001\u7ed9\u6d4b\u8bd5\u673a\uff1b\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e0d\u4e00\u81f4\u5c06\u4f1a\u8fdb\u5165\u4e2d\u65ad\u5904\u7406\u53ca\u5f02\u5e38\u7ed3\u679c\u8f93\u51fa\uff0c\u7ee7\u7eed\u6267\u884c\u540e\u7eed\u573a\u666f\uff0c\u76f4\u81f3\u6240\u6709\u7528\u4f8b\u6d4b\u8bd5\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u6df1\u5ea6\u5b66\u4e60\u73af\u5883\u642d\u5efa","text":"\u6a21\u578b\u8bad\u7ec3\u4e3b\u8981\u5bf9 GPU \u6709\u8981\u6c42\uff0c\u8bad\u7ec3\u6a21\u578b\u7684\u673a\u5668\u663e\u5b58\u4e0d\u4f4e\u4e8e 6G\uff0c\u5176\u4ed6\u914d\u7f6e\u65e0\u7279\u6b8a\u8981\u6c42\u3002 \u63a8\u8350\u6027\u4ef7\u6bd4\u8f83\u9ad8\u914d\u7f6e \u64cd\u4f5c\u7cfb\u7edf: UnionTech OS Desktop 20 Professional Linux version 4.19.0-desktop-amd64 (deepin@deepin-PC) (Uos 8.3.0.3-3+rebuild) \u5904\u7406\u5668: Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz (\u516b\u6838 / \u5341\u516d\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460M-HDV(RD)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))/8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: TU116 [GeForce GTX 1660]\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u865a\u62df\u73af\u5883\u5b89\u88c5","text":"cd ~\nwget -c https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh\nbash Miniconda3-latest-Linux-x86_64.sh\n \u4e00\u8def\u56de\u8f66 \u7b2c\u4e00\u6b21\u63d0\u793a\u8f93\u5165 yes/no \uff1a\u8f93\u5165 yes \u7ee7\u7eed\u4e00\u8def\u56de\u8f66 \u7b2c\u4e8c\u6b21\u63d0\u793a\uff1a\u8f93\u5165 no cd ~/miniconda3/bin\nsudo chmod 777 activate\n \u6fc0\u6d3bconda\u73af\u5883 . ./activate\n \u6dfb\u52a0\u516c\u53f8\u5185\u7f51\u6e90 conda config --add channels bioconda\nconda config --add channels conda-forge\n \u5982\u679c\u662f\u5916\u7f51\u6dfb\u52a0\u5916\u7f51\u6e90 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/\n \u5982\u679c\u8981\u5220\u9664\u6e90 conda config --remove-key channels\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"2\u3001\u5b89\u88c5\u4f9d\u8d56","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u521b\u5efa\u865a\u62df\u73af\u5883","text":"conda remove --name mmlab --all # \u79fb\u9664\u6240\u6709\u865a\u62df\u73af\u5883\n conda create -n mmlab python=3.7\n conda activate mmlab\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-pytorch","title":"\uff082\uff09\u5b89\u88c5 Pytorch","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install torch==1.7.0+cu101 torchvision==0.8.1+cu101 torchaudio==0.7.0 -f https://download.pytorch.org/whl/torch_stable.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-mmcv","title":"\uff083\uff09\u5b89\u88c5 MMCV","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install mmcv-full==1.3.3 -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.7.0/index.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"\uff084\uff09\u5b89\u88c5\u663e\u5361\u9a71\u52a8","text":"\u6839\u636e\u4f60\u7684\u663e\u5361\u4e0b\u8f7d\u5bf9\u5e94\u9a71\u52a8\uff0c\u6bd4\u5982\u6211\u7684\u663e\u5361\u4e3a GTX1660\uff0c\u9a71\u52a8\u7248\u672c\u4e3a 430\uff0c\u9a71\u52a8\u4e0b\u8f7d\u5730\u5740\uff1ahttps://www.nvidia.cn/Download/Find.aspx?lang=cn CTRL+ALT+F2 \u8fdb\u5165tty\n \u7981\u7528 nouveau \u9a71\u52a8 sudo vim /etc/modprobe.d/blacklist-nouveau.conf\n \u586b\u5165\uff1a blacklist nouveau options nouveau modeset=0\n \u5237\u65b0\u914d\u7f6e\u6587\u4ef6 sudo update-initramfs -u reboot \u91cd\u542f\u540e\u518d\u8fdb\u5165 tty \u5173\u95ed\u56fe\u50cf\u754c\u9762\uff0c\u8f93\u5165\u547d\u4ee4\u5173\u95ed\u56fe\u50cf\u754c\u9762 sudo service lightdm stop\n \u5b89\u88c5\u9a71\u52a8 sudo chmod a+x NVIDIA-Linux-x86_64-430.run\nsudo ./NVIDIA-Linux-x86_64-430.run\n reboot\u91cd\u542f\uff0cnvidia-smi\u67e5\u770b\u5b89\u88c5\u72b6\u6001\u3002\u6ce8\u610f\u770b\u4e0bcuda\u7248\u672c\uff0c10.1\uff0cdriver\u7248\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u6570\u636e\u6807\u6ce8","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u6570\u636e\u6807\u6ce8","text":"\u6807\u6ce8\u4e4b\u524d\u9700\u8981\u5148\u8f6c\u6362\u56fe\u7247\u5927\u5c0f\uff0c\u5e76\u4e14\u4ee5\u6570\u5b57\u547d\u540d\uff0c\u6bcf\u7ec4\u547d\u540d\u9012\u589e"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"\uff081\uff09\u8f6c\u6362\u5927\u5c0f\u5e76\u91cd\u547d\u540d","text":"rename_pic.py import os\nimport sys\nimport cv2\nimport time\nimport getpass\nusername = getpass.getuser()\nsource_path = f\"/home/{username}/Desktop/right_menu\" # \u56fe\u7247\u8def\u5f84\nsource_dest = os.path.join('/'.join(source_path.split(\"/\")[:-1]), 'tmp')\nif not os.path.exists(source_dest):\nos.mkdir(source_dest)\nstart_name = sys.argv[1]\nfile_name_list = list()\nfor file in os.listdir(source_path):\nif file.endswith('.png'):\nfile_name_list.append(file)\nstart_name = int(start_name)\nfor file in file_name_list:\nos.rename(os.path.join(source_path,file), os.path.join(source_path, f\"{str(start_name)}.png\"))\nstart_name += 1\ntime.sleep(1)\nfor file in os.listdir(source_path):\nimage = os.path.join(source_path, str(file))\nsrc = cv2.imread(image)\nresult = cv2.resize(src, (960, 540))\nresizeImage = os.path.join(source_dest, str(file))\nprint(resizeImage)\ncv2.imwrite(str(resizeImage), result)\ncv2.waitKey(0)\ncv2.destroyAllWindows()\ntime.sleep(1)\nos.system(f'rm -rf {source_path}/*')\nos.system(f'mv {source_dest}/* {source_path}')\nos.system(f'rm -rf {source_dest}')\nprint(\"\u4e0b\u4e00\u4e2a\u5e8f\u53f7\uff1a\", start_name)\n \u6839\u636e\u7ec8\u7aef\u8f93\u51fa\u7684\u4e0b\u4e00\u4e2a\u5e8f\u53f7\u7684\u63d0\u793a\uff0c\u6267\u884c Python \u6587\u4ef6\u7684\u65f6\u5019\u4f20\u53c2\u3002 python rename_pic.py 249\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"\uff082\uff09\u5de5\u5177\u6807\u6ce8","text":"\u4f7f\u7528\u5de5\u5177 labelImg \u6807\u6ce8 sudo pip3 install PyQt5==5.13\nsudo pip3 install labelImg\n \u7ec8\u7aef\u76f4\u63a5\u8f93\u5165 labelImg\uff0c\u56de\u8f66 \u6807\u6ce8\u6a21\u5f0f\u9009\u62e9\uff1aPascalVOC"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u667a\u80fd\u6807\u6ce8","text":"\u6253\u5f00\u5c4f\u5e55\u5f55\u5236\u8f6f\u4ef6\uff0c\u5f55\u5236\u624b\u52a8\u64cd\u4f5c\u4e00\u6b21\u6d4b\u8bd5\u7528\u4f8b\uff0c\u7136\u540e\u5c06\u5f55\u5236\u7684\u89c6\u9891\u8fdb\u884c\u5206\u5e27\uff0c\u7136\u540e\u5bf9\u6bd4\u524d\u4e24\u5e27\u56fe\u6807\u76f8\u4f3c\u5ea6\uff0c\u5254\u9664\u76f8\u4f3c\u5ea6\u8fc7\u9ad8\u7684\u56fe\u7247\uff0c\u5728\u4fdd\u8bc1\u7d20\u6750\u591a\u6837\u6027\u7684\u524d\u63d0\u4e0b\uff0c\u5254\u9664\u91cd\u590d\u591a\u4f59\u7684\u56fe\u7247\u751f\u6210\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u96c6\uff0c\u7136\u540e\u53d6\u51fa\u63a7\u4ef6\u6a21\u677f\u6570\u636e\u96c6\uff0c\u901a\u8fc7 OpenCV \u6a21\u677f\u5339\u914d\u83b7\u53d6\u63a7\u4ef6\u5728\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u56fe\u7247\u4e2d\u6240\u5728\u7684\u5de6\u4e0a\u3001\u5de6\u4e0b\u3001\u53f3\u4e0a\u3001\u53f3\u4e0b\u56db\u5904\u5750\u6807\uff0c\u4ece\u800c\u6839\u636e\u6a21\u677f\u6570\u636e\u96c6\u751f\u6210\u6807\u6ce8\u6570\u636e\u3002\u53c2\u8003\u76ee\u5f55 AnnotationMaterial"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"\uff081\uff09\u6a21\u677f\u6570\u636e\u96c6\u51c6\u5907","text":"1\u3001\u5728\u754c\u9762\u622a\u53d6\u9700\u8981\u6807\u6ce8\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u653e\u5728\u76ee\u5f55\u4e0b AnnotationMaterial/template/img 2\u3001\u7ef4\u62a4\u63a7\u4ef6\u540d\u4e0e\u5143\u7d20\u63a7\u4ef6\u7684\u952e\u5bf9\uff0c\u4e00\u4e2a\u63a7\u4ef6\u540d\u53ef\u5bf9\u5e94\u591a\u4e2a\u5143\u7d20\u63a7\u4ef6 menu:\n- menu.jpg\n- menu1.jpg\n- menu2.jpg\n- menu3.jpg\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"\uff082\uff09\u7d20\u6750\u96c6\u51c6\u5907","text":"\u5f55\u5236\u89c6\u9891\u6216\u6216\u5c4f\u5e55\u622a\u56fe\u653e\u7f6e\u76ee\u5f55 AnnotationMaterial/source"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u5f00\u59cb\u6807\u6ce8","text":"python3 AnnotationMaterial/main.py\n \u751f\u6210\u7684\u6807\u6ce8\u6570\u636e\u5b58\u653e\u5728 AnnotationMaterial/result"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#mmdetection","title":"\u56db\u3001MMDetection","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1-mmdetection","title":"1\u3001 MMDetection \u4ee3\u7801","text":"MMDetection \u662f\u4e00\u4e2a\u6709\u540d\u7684\u6df1\u5ea6\u5b66\u4e60\u76ee\u6807\u68c0\u6d4b\u5f00\u6e90\u9879\u76ee\uff0c\u4e5f\u662f openMMlab \u7684\u62db\u724c\u9879\u76ee\uff0c\u4e3a\u4ec0\u4e48\u9009\u62e9\u5b83\uff0c\u5c0f\u5b69\u513f\u6ca1\u5a18\u8bf4\u6765\u8bdd\u957f\uff0c\u611f\u5174\u8da3\u53ef\u4ee5\u81ea\u884c\u6df1\u5165\u4e86\u89e3\uff1b \u4f60\u53ef\u4ee5\u76f4\u63a5\u5728 GitHub \u4e0a\u514b\u9686\u4ee3\u7801\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u54b1\u4eec\u4ed3\u5e93\u4e0b Train \u76ee\u5f55\u4e2d\u4ee3\u7801\uff0cTrain \u4e2d\u7684\u4ee3\u7801\u4e5f\u662f\u4ece GitHub \u4e0a\u62c9\u53d6\u7684\uff0c\u4e0d\u8fc7\u6211\u4eec\u6839\u636e\u9879\u76ee\u9700\u8981\u505a\u4e86\u4e00\u4e9b\u4e8c\u6b21\u5f00\u53d1\uff0c\u63a8\u8350\u76f4\u63a5\u4f7f\u7528\u5b83\u3002 \u5982\u679c\u4f60\u60f3\u4ece GitHub \u4e0a\u62c9\uff1a git clone https://github.com/open-mmlab/mmdetection.git\n# \u4e0d\u80fd\u76f4\u63a5\u62c9\u53d6\u4e3b\u5206\u652f\uff0c\u5efa\u8bae\u4f7f\u75282.12\u7248\u672c\uff0c\u4e0d\u540c\u7684\u7248\u672c\u5bf9\u5e94\u7684mmcv\u7248\u672c\u662f\u4e0d\u540c\u7684\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-voc2coco","title":"2\u3001\u62c9\u53d6 voc2coco \u4ee3\u7801","text":"git clone https://github.com/Tony607/voc2coco.git\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-coco","title":"3\u3001\u8f6c\u6362 coco \u6570\u636e\u96c6","text":"\u5c06\u6240\u6709\u7684\u56fe\u7247\u548cxml\u6587\u4ef6\u653e\u5165train2017\uff0c\u4ece\u4e2d\u6311\u9009\u51e0\u7ec4\u653e\u5165val2017\uff08\u6d4b\u8bd5\u96c6\uff09 cd mmdetection/data/coco\npython voc2coco.py train2017 annotations/instances_train2017.json\npython voc2coco.py val2017 annotations/instances_val2017.json\n \u751f\u6210json\u6587\u4ef6"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4_1","title":"4\u3001\u4fee\u6539\u914d\u7f6e","text":"\uff081\uff09\u8bfb\u53d6\u6a21\u578b\u540d\u79f0 import json\nmodule_name = []\nwith open('./instances_train2017.json', \"r+\") as f:\njson_file = f.read()\njson_dict = json.loads(json_file)\nmodule_list = json_dict.get('categories')\nfor module_info in module_list:\nname = module_info.get('name')\nmodule_name.append(name)\nprint(module_name)\nprint(\"module_num:\", len(module_name))\n # \u6ce8\u610f\u5bf9\u6bd4instances_train2017.json\u91cc\u9762\u6a21\u578b\u540d\u79f0\u7684\u987a\u5e8f\uff0c\u4e0eCLASSES\u548ccoco_classes\u91cc\u9762\u7684\u987a\u5e8f\u4fdd\u6301\u4e00\u81f4\u3002\n \uff082\uff09\u4fee\u6539 faster_rcnn_r101_2x_coco.py mmdetection/xianjin/faster_rcnn_r101_2x_coco.py \u4fee\u653946\u884c\uff0cnum_clasess\u7684\u503c\uff0c\u65b0\u589e1\u4e2a\uff0c\u5c31 +1\uff1b \uff083\uff09\u4fee\u6539 coco.py mmdetection/mmdet/datasets/coco.py CLASSES = ()\uff0c\u5728\u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b \uff084\uff09\u4fee\u6539 class_names.py mmdetection/mmdet/core/evaluation/class_names.py coco_classes \u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#5","title":"5\u3001\u7f13\u5b58\u6e05\u7406","text":"\u5220\u9664 mmdetection/build \u76ee\u5f55 python setup.py install\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#6","title":"6\u3001\u8bad\u7ec3\u6a21\u578b","text":"\uff081\uff09\u6307\u5b9a\u81ea\u5df1\u914d\u7f6e\u7684\u8bad\u7ec3\u6a21\u578b\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py --gpus 1\n \uff082\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u6d4b\u8bd5\u96c6\u7ed3\u679c\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py xianjin/epoch_24.pth --show\n \uff083\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u51c6\u786e\u5ea6\uff1b python tools/analysis_tools/analyze_logs.py plot_curve xianjin/20210530_011907.log.json --keys acc\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#7","title":"7\u3001\u5feb\u6377\u64cd\u4f5c","text":"python3 run.py\n \u5c06\u4ee5\u4e0a 4 - 7 \u6b65\u64cd\u4f5c\u6574\u5408\u6210 run.py\uff0c\u4e00\u952e\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u4e94\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\uff1b \u670d\u52a1\u7aef\u4e00\u53f0\uff08\u76ee\u524d\u4ec5\u652f\u6301AMD\u67b6\u6784\uff09\uff1b \u91c7\u96c6\u76d2\u4e00\u4e2a \uff08ACASIS hdmi\u89c6\u9891\u91c7\u96c6\u5361\uff0chttps://item.jd.com/10024310742602.html \uff09\uff1b USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\uff1b USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff1b \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5USB\u5ef6\u957f\u7ebf\uff1b \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u63a8\u8350\u914d\u7f6e","text":"\u6267\u884c\u7528\u4f8b\u7684\u670d\u52a1\u7aef\u5bf9\u914d\u7f6e\u6ca1\u6709\u7279\u6b8a\u8981\u6c42\uff0c\u5982\u679c\u6761\u4ef6\u5141\u8bb8\u914d\u7f6e\u8d8a\u9ad8\uff0c\u8bc6\u522b\u901f\u5ea6\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n \u6d4b\u8bd5\u673a\u4e0a\u4e0d\u6267\u884c\u4efb\u4f55\u811a\u672c\uff0c\u5177\u4f53\u914d\u7f6e\u6839\u636e\u6d4b\u8bd5\u9700\u8981\u51b3\u5b9a\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#usb_mk","title":"\u516d\u3001USB_MK\u4e32\u53e3\u9a71\u52a8\u65b9\u6cd5","text":"\u4f4d\u4e8econtrol_method\u76ee\u5f55\u4e0b\u7684usb_mk.py\u6587\u4ef6 \uff081\uff09\u5217\u51fa\u53ef\u901a\u4fe1\u7684\u7aef\u53e3 python3 -m serial.tools.list_ports -v\n \uff082\uff09\u4fee\u6539\u4e32\u53e3\u7684\u6743\u9650 sudo chmod 777 /dev/ttyACM0\n \uff083\uff09\u5b9e\u4f8b\u5316USB_MK import UsbMk\nusb_mk = UsbMk(\"/dev/ttyACM0\", 9600) # \u8bbe\u5907\u9ed8\u8ba49600\u4e3a\u6ce2\u7279\u7387\uff0c\u63a7\u5236\u4f20\u8f93\u901f\u7387\n \uff084\uff09USB\u4e32\u53e3\u8bbe\u5907\u9ed8\u8ba4\u6ce2\u7279\u7387\u4e3a9600\uff08\u7ecf\u6d4b\u8bd5\u6ce2\u7279\u73879600\u51c6\u786e\u6027\u6700\u597d\uff09\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up() # \u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u6c49\u5b57\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e\n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff083\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff084\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff085\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() # \u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2\n \uff086\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff087\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff088\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e03\u3001\u65b9\u6cd5\u8c03\u7528\u5165\u53c2\u89c4\u5219","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_7","title":"1\u3001\u57fa\u7c7b","text":"class Base:\ndef __init__(self):\nself._obj = image\nself._usb = usb_mk\ndef find_element_by_ai(self, element):\nreturn self._obj.find_element(element)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_6","title":"2\u3001\u5165\u53c2\u8bf4\u660e","text":"\u56fe\u50cf\u8bc6\u522b\u65b9\u6cd5\u5165\u53e3\u4e3a Base \u7c7b\u4e0b\u7684 find_element_by_ai \u3002\u4ec5\u63a5\u53d7\u4e00\u4e2a\u53c2\u6570 element\uff0c\u7c7b\u578b\u4e3a string\u3002 \u53ef\u8bc6\u522b\u7684 string \u683c\u5f0f\uff1a \uff081\uff09\u5927\u56fe\u6807\uff08 \u56fe\u6807\u5927\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\uff0c\u4f8b\uff1a Base().find_element_by_ai(\"window\")\n \uff082\uff09\u5927\u56fe\u6807 / \u5c0f\u56fe\u6807\uff08\u56fe\u6807\u5c0f\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5c0f\u56fe\u6807\uff0c\u4f8b\uff1awindow/search_btn Base().find_element_by_ai(\"window/search_btn\")\n \uff083\uff09\u5927\u56fe\u6807 / OCR\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\u5185\u7684\u6587\u5b57\uff0c\u4f8b\uff1amenu/\u5c5e\u6027 Base().find_element_by_ai(\"menu/\u5c5e\u6027\")\n \uff084\uff09OCR\uff1a\u5168\u5c4f\u8bc6\u522b\u6587\u5b57 Base().find_element_by_ai(\"\u641c\u7d22\")\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516b\u3001\u9690\u85cf\u9f20\u6807","text":"\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u8fc7\u6765\u7684\u89c6\u9891\u6d41\uff0c\u5728\u8bc6\u522b\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u53d7\u5230\u9f20\u6807\u5f71\u54cd\uff0c\u56e0\u6b64\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u9690\u85cf\u9f20\u6807\u3002 \u5c4f\u853d\u9f20\u6807\u5149\u6807\u663e\u793a ```shell script /etc/lightdm/lightdm.conf \u5728`[Seat:*]`\u4e0b\u9762\u6dfb\u52a0\u53c2\u6570\n```shell script\nxserver-command=X -bs -core -nocursor\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e5d\u3001\u667a\u80fd\u81ea\u52a8\u5316\u7684\u610f\u4e49","text":"1\u3001\u6539\u5584 Acessibility \u5b9a\u4f4d\u7684\u7a33\u5b9a\u6027\u95ee\u9898 Acessibility \u5c5e\u6027\u5b9a\u4f4d\u5b58\u5728\u5076\u5c14\u5931\u6548\u7684\u60c5\u51b5 \uff081\uff09\u5f00\u53d1\u5728\u505a\u65b0\u9700\u6c42\u5f00\u53d1\u65f6\u53ef\u80fd\u6d89\u53ca\u5230\u5bf9\u5c5e\u6027\u6807\u7b7e\u7684\u4fee\u6539\u6216\u8005\u5c42\u7ea7\u7684\u8c03\u6574\uff0c\u53ef\u80fd\u9020\u6210\u81ea\u52a8\u5316\u7528\u4f8b\u65e0\u6cd5\u5b9a\u4f4d\u5230\u5143\u7d20\u3002 \u6bd4\u59821040\u9636\u6bb5\uff0c\u97f3\u4e50\u91cd\u6784\u7684\u65f6\u5019\uff0c\u5f00\u53d1\u5bf9\u90e8\u5206\u5c5e\u6027\u548c\u5c42\u7ea7\u505a\u4e86\u4fee\u6539\uff0c\u5bfc\u81f4\u81ea\u52a8\u5316\u7528\u4f8b\u5b9a\u4f4d\u65b9\u6cd580%\u9700\u8981\u4fee\u6539\u3002 \u5f00\u53d1\u65b0\u529f\u80fd\u7684\u65f6\u5019\u5076\u5c14\u4e5f\u4f1a\u5bf9\u5c5e\u6027\u505a\u8c03\u6574\uff0c\u9047\u52305\u6b21\u3002 \uff082\uff09\u76ee\u524d\u4e3b\u8981\u4f7f\u7528Dogtail\u8bc6\u522b\u5e94\u7528Acessibility\u5c5e\u6027\u8fdb\u884c\u5b9a\u4f4d\uff0c\u662f\u83b7\u53d6\u5e94\u7528\u5f53\u524d\u754c\u9762\u7684\u5c5e\u6027tree\uff0c\u5728\u5e94\u7528\u8df3\u8f6c\u540e\uff0cDogtail\u5b58\u5728\u65e0\u6cd5\u53ca\u65f6\u83b7\u53d6\u5f53\u524d\u5c5e\u6027\u5217\u8868\u7684\u60c5\u51b5\u3002 \u591a\u5a92\u4f53\u8c03\u7528\u6587\u7ba1\u7a97\u53e3\u7684\u65f6\u5019\uff0c\u51fa\u73b0\u627e\u4e0d\u5230\u6587\u7ba1\u91cc\u9762\u5143\u7d20\u7684\u60c5\u51b5\uff0c\u76ee\u524d\u51fa\u73b010+\u6b21\u3002 \u5e94\u7528\u8bbe\u7f6e\u9875\u9762\u7684\u5c5e\u6027\u5076\u5c14\u5b58\u5728\u627e\u4e0d\u5230\u7684\u60c5\u51b5\uff0c\u9047\u52305\u6b21\u3002 \uff083\uff09Dogtail\u5de5\u5177\u672c\u8eab\u5b58\u5728\u95ee\u9898\uff0c\u6709\u65f6\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u5019\u5f88\u6162\uff0c\u8ba9\u4eba\u65e0\u6cd5\u63a5\u53d7\uff0c\u76ee\u524d\u51fa\u73b0\u8fc7\u5f88\u591a\u6b21\u3002 \u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u95f4\u6bd4\u5e73\u5e38\u61623\u500d\uff0c\u51fa\u73b04\u6b21\u3002 2\u3001\u89e3\u51b3\u4e86\u4f7f\u7528\u7edd\u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898 \u90e8\u5206\u63a7\u4ef6\u65e0\u6cd5\u6dfb\u52a0 Acessibility \u5c5e\u6027\u4ece\u800c\u4f7f\u7528\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u51fa\u73b0\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898\u3002 \uff081\uff09\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u65b9\u6cd5\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u76ee\u6807\u56fe\u7247\u8d44\u6e90\uff0c\u5728 UI \u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u4f1a\u6d89\u53ca\u5230\u76ee\u6807\u8d44\u6e90\u7684\u66ff\u6362\uff0c\u6bd4\u8f83\u8017\u8d39\u4eba\u529b\u3002 \uff082\uff09\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6cd5\u5bf9\u6bd4\u7cbe\u5ea6\u6bd4\u8f83\u641e\uff0c\u5982\u679cUI \u7684\u53d8\u66f4\u4f1a\u9020\u6210\u65e0\u6cd5\u51c6\u786e\u5b9a\u4f4d\u5230\uff0c\u81ea\u52a8\u5316\u811a\u672c\u5065\u58ee\u6027\u4e0d\u8db3\u3002 3\u3001\u4f7f\u7528\u673a\u5668\u5206\u79bb\uff0c\u89e3\u51b3\u4e86\u81ea\u52a8\u5316\u811a\u672c\u5bf9\u5e94\u7528\u7684\u5f71\u54cd\uff0c\u771f\u5b9e\u8fd8\u539f\u7528\u6237\u7684\u4f7f\u7528\u573a\u666f \u673a\u5668\u5206\u79bb\u7684\u67b6\u6784\u8bbe\u8ba1\uff0c\u4fdd\u8bc1\u4e86\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u73af\u5883\u5b8c\u5168\u7b49\u540c\u4e8e\u7528\u6237\uff0c\u6392\u9664\u6d4b\u8bd5\u811a\u672c\u7684\u5f71\u54cd\u3002 \uff081\uff09\u76ee\u524d\u7684\u529f\u80fd\u81ea\u52a8\u5316\u662f\u5728\u6d4b\u8bd5\u673a\u4e0a\u76f4\u63a5\u8fd0\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\uff0c\u52a0\u4e0a\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u6211\u4eec\u6dfb\u52a0\u4e86\u4e00\u4e9b\u8fdb\u7a0b\u76d1\u63a7\u3001\u89c6\u9891\u5f55\u5236\u7b49\u529f\u80fd\uff0c\u81ea\u52a8\u5316\u811a\u672c\u672c\u8eab\u4f1a\u6d88\u8017\u4e00\u4e9b\u7cfb\u7edf\u8d44\u6e90\uff0c\u65e0\u6cd5\u8fd8\u539f\u771f\u662f\u7684\u7528\u6237\u4f7f\u7528\u573a\u666f\u3002 \uff082\uff09\u6027\u80fd\u6d4b\u8bd5\u9700\u8981\u6392\u9664\u5176\u4ed6\u7a0b\u5e8f\u7684\u8d44\u6e90\u6d88\u8017\u5f71\u54cd\uff0c\u6027\u80fd\u81ea\u52a8\u5316\u91c7\u7528\u673a\u5668\u5206\u79bb\uff0c\u4fdd\u8bc1\u4e86\u6027\u80fd\u6570\u636e\u7684\u51c6\u786e\u6027\u3002 \u4ee5\u524d\u7684\u7528\u4f8b\u6267\u884c\u8017\u65f6\u6ca1\u6761\u572830\u79d2\u5de6\u53f3\uff0c\u73b0\u5728\u7528\u4f8b\u8017\u65f6\u572810\u79d2\u3002 4\u3001\u89e3\u51b3\u4e86UI \u8c03\u6574\u5bfc\u81f4\u5b9a\u4f4d\u5931\u8d25\u7684\u4e0d\u7a33\u5b9a\u6027\u95ee\u9898 \uff081\uff09\u89e3\u51b3\u4e86\u56e0 UI \u8c03\u6574\u5bfc\u81f4\u63a7\u4ef6\u4f4d\u7f6e\u53d8\u5316\u6216\u8272\u5dee\u53d8\u5316\u540e\u5b9a\u4f4d\u4e0d\u51c6\u786e\u7684\u95ee\u9898\uff0c\u53ea\u8981\u63a7\u4ef6\u6587\u6848\u548c\u63a7\u4ef6\u5916\u8fb9\u6846\u65e0\u53d8\u5316\u5747\u53ef\u51c6\u786e\u5b9a\u4f4d\uff1b \uff082\uff09\u76ee\u524d\u4e5f\u4f1a\u91c7\u7528\u57fa\u4e8eUI\u7684\u5b9a\u4f4d\u65b9\u6848\uff0c\u5982\u679cUI\u4f4d\u7f6e\u6709\u8c03\u6574\uff0c\u4f1a\u5bfc\u81f4\u5143\u7d20\u65e0\u6cd5\u5b9a\u4f4d\u3002 5\u3001\u7b80\u5316\u4e86\u7528\u4f8b\u7ed3\u6784\uff0c\u63d0\u5347\u7f16\u5199\u53cb\u597d\u5ea6 \uff081\uff09\u667a\u80fd\u81ea\u52a8\u5316\u8bc6\u522b\u5143\u7d20\u7684\u65b9\u6cd5\u53ea\u6709\u4e00\u4e2a\uff0c\u5c31\u662f\u57fa\u4e8e\u6211\u4eec\u8bad\u7ec3\u7684\u6a21\u578b\u8bc6\u522b\u89c6\u9891\u6d41\u4e2d\u7684\u5143\u7d20\uff0c\u7ecf\u8fc7\u811a\u672c\u5c01\u88c5\u4e4b\u540e\uff0c\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u4e2d\u6240\u6709\u5b9a\u4f4d\u7684\u64cd\u4f5c\u90fd\u53ea\u9700\u8981\u8c03\u7528\u8fd9\u4e00\u4e2a\u65b9\u6cd5\u5c31\u884c\u4e86\uff0c\u7f16\u5199\u81ea\u52a8\u5316\u811a\u672c\u7684\u96be\u5ea6\u5927\u5927\u964d\u4f4e\u3002 \uff082\uff09\u4e5f\u662f\u7531\u4e8e\u8c03\u7528\u65b9\u6cd5\u7b80\u5355\uff0c\u5728 UI \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u4e2d\u7684\u5206\u5c42\u7ed3\u6784\u5c06\u4f1a\u51cf\u5c11\uff0c\u591a\u7ee7\u627f\u7684\u60c5\u51b5\u4f1a\u51cf\u5c11\uff0c\u81ea\u52a8\u5316\u4ee3\u7801\u7684\u8c03\u7528\u7ed3\u6784\u4e5f\u4f1a\u53d8\u5f97\u7b80\u5355\uff0c\u800c\u4e14\u529f\u80fd\u6d4b\u8bd5\u540c\u5b66\u7f16\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u66f4\u52a0\u5bb9\u6613\u4e0a\u624b\u3002 \u4ee5\u524d\u5199\u7528\u4f8b\u7531\u4e8e\u9700\u8981\u7ed3\u5408\u4e0d\u540c\u7684\u6a21\u5757\uff0c\u8c03\u7528\u4e0d\u540c\u7684\u65b9\u6cd5\uff0c\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u5e76\u5b8c\u6210\u8c03\u8bd5\u7684\u65f6\u95f4\u5e73\u5747\u572820-30\u5206\u949f\uff0c\u73b0\u5728\u5199\u7528\u4f8b\u811a\u672c\u80fd\u57285\u5206\u949f\u5de6\u53f3\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":"# =============================================\n# Attribution : Application Test Department III\n# Time : 2023/1/3\n# Author : ut003281\n# =============================================\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u7b80\u8ff0","text":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5 \u901a\u8fc7\u81ea\u52a8\u5316\u624b\u6bb5\u5bf9\u5e94\u7528\u8fdb\u884c\u6027\u80fd\u6d4b\u8bd5\uff0c\u63d0\u4f9b\u65b9\u4fbf\u7684\u73af\u5883\u90e8\u7f72\u3001\u8fd0\u884c\u914d\u7f6e\u3001\u7528\u4f8b\u7f16\u5199\u7b49\uff0c\u7528\u4e8e\u684c\u9762\u5e94\u7528\u7684\u51b7\u70ed\u542f\u52a8\u3001\u8d44\u6e90\u62f7\u8d1d\u3001\u9875\u9762\u8df3\u8f6c\u7b49\u6027\u80fd\u573a\u666f\u6d4b\u8bd5\u3002 \u4ed3\u5e93\u5730\u5740\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-perf-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u4ee3\u7801\u7ed3\u6784","text":"autotest-perf-aitest\n\u251c\u2500\u2500 apps # \u5b58\u653e\u6240\u6709\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u811a\u672c\n\u251c\u2500\u2500 conftest.py # pytest hook\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 CURRENT # \u7248\u672c\u5185\u5bb9\n\u251c\u2500\u2500 docs # \u6587\u6863\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u952e\u503c\u5bf9\u7167\u8868.pdf # \u4e32\u53e3\u7ebfcode\u4e0e\u6309\u952e\u7684\u5bf9\u7167\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u6027\u80fd\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\u6267\u884c\u5668\u4f7f\u7528\u6307\u5357.md # \u6267\u884c\u5668\u811a\u672c\u4f7f\u7528\u6307\u5357\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 USB\u4e32\u53e3\u8f6cUSB\u952e\u76d8\u9f20\u6807\u7ebf\u534f\u8bae\u6587\u4ef6V1.0.pdf # \u4e32\u53e3\u534f\u8bae\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput-0.28.2.zip # Linux\u4e0b\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\u7684\u6e90\u7801\uff0c\u53ef\u6839\u636e\u67b6\u6784\u6253\u5305\n\u251c\u2500\u2500 manage.py # \u529f\u80fd\u4e3b\u5165\u53e3\n\u251c\u2500\u2500 pytest.ini # pytst \u914d\u7f6e\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 setting # \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 client.ini # \u6d4b\u8bd5\u673a IP \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5168\u5c40\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dev_env.sh # \u5bbf\u4e3b\u673a\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose_no_relay.yml # \u65e0\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose.yml # \u6709\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker_login.sh # docker \u767b\u9646\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 res\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 black.png # \u5168\u9ed1\u56fe\u7247\uff0c\u7528\u4e8e\u4fee\u6539\u58c1\u7eb8\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_5000.deb # 3A5000 \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_amd64.deb # amd \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_arm64.deb # arm \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_mips64.deb # mips \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_sw_64.deb # sw \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 server.ini # \u670d\u52a1\u5668\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 setup.sh # \u5bb9\u5668\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 template # \u521b\u5efa app \u57fa\u7840\u811a\u672c\u6a21\u677f\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 app_template\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ${app_name}_widget.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 control-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 images\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 test_${app_name}_01_scene.json-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 test_${app_name}_01_scene.py-tpl\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 uos_docker # \u5bb9\u5668\u73af\u5883\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dockerfile\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 requirements.txt\n\u2514\u2500\u2500 src\n \u251c\u2500\u2500 analysis_save.py # \u89e3\u6790\u56fe\u7247\u6d41\u7ed3\u679c\uff0c\u6c47\u603b\u751f\u6210 excel \u62a5\u544a\n\u251c\u2500\u2500 base_widget.py # \u5c01\u88c5\u7684\u57fa\u7840\u64cd\u4f5c\uff0c\u5e94\u7528\u8c03\u7528\u7684\u4e3b\u5165\u53e3\u65b9\u6cd5\n\u251c\u2500\u2500 cmdctl.py # \u8c03\u7528\u547d\u4ee4\u884c\u4f7f\u7528\n\u251c\u2500\u2500 global_value.py # \u5168\u5c40\u53d8\u91cf\n\u251c\u2500\u2500 image_utils.py # \u56fe\u7247\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 __init__.py\n \u251c\u2500\u2500 logger_utils.py # \u65e5\u5fd7\u914d\u7f6e\n\u251c\u2500\u2500 pdocr.py # ocr \u914d\u7f6e\n\u251c\u2500\u2500 public_method.py # \u4e00\u4e9b\u65b9\u4fbf\u7684\u5c01\u4f4f\n\u251c\u2500\u2500 record.py # \u5f55\u5c4f\u76f8\u5173\n\u251c\u2500\u2500 rtk # \u8fd0\u884c\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 _base.py # \u4e00\u4e9b\u679a\u4e3e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 install_env.py # \u5b89\u88c5\u73af\u5883\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 local_runner.py # \u8fd0\u884c\u7528\u4f8b\n\u251c\u2500\u2500 serial_communication # \u4e32\u53e3\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 power_control.py # \u7ee7\u7535\u5668\u64cd\u4f5c\uff0c\u4f7f\u7528\u7ee7\u7535\u5668\u8fde\u63a5\u4e3b\u673a\u7535\u6e90\uff0c\u63a7\u5236\u5f00\u5173\u673a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 serial_common.py # \u4e32\u53e3\u516c\u5171\u65b9\u6cd5\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 usb_mk.py # \u952e\u9f20\u64cd\u4f5c\u57fa\u7840\u5c01\u88c5\n\u251c\u2500\u2500 shortcut_key.py # \u5feb\u6377\u952e\u7684\u5c01\u88c5\n\u251c\u2500\u2500 singleton.py # \u5355\u4f8b\u6a21\u5f0f\n\u251c\u2500\u2500 start_app.py # \u521b\u5efa app\n\u2514\u2500\u2500 write_xlsx.py # \u751f\u6210 excel\n# __init__.py \u6587\u4ef6\u4e3a\u6807\u8bc6\u8be5\u76ee\u5f55\u662f\u4e00\u4e2aPython\u7684\u6a21\u5757\u5305\uff0c\u9879\u76ee\u4e2d\u7684__init__.py\u5747\u4e3a\u7a7a\u6587\u4ef6\u3002\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u73af\u5883\u642d\u5efa","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\u3002 \u670d\u52a1\u7aef\u4e00\u53f0\u3002\uff08\u4ec5\u652f\u6301 AMD \u67b6\u6784\uff0c\u82e5\u9700\u5176\u4ed6\u67b6\u6784\uff0c\u54a8\u8be2\u76f8\u5173\u5f00\u53d1\u4eba\u5458\uff09 \u91c7\u96c6\u76d2\u4e00\u4e2a\u3002 \uff08ACASIS HDMI \u89c6\u9891\u91c7\u96c6\u76d2\uff0chttps://item.jd.com/100013302599.html#crumb-wrap \uff09 USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\u3002\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"\uff082\uff09\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\u3002 USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff08USB3.0 \u63a5\u53e3\u4e0a\uff09\u3002 \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5 USB \u5ef6\u957f\u7ebf\u3002 \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u670d\u52a1\u7aef\u63a8\u8350\u914d\u7f6e","text":"\u914d\u7f6e\u8d8a\u9ad8\uff0c\u89e3\u6790\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"2\u3001\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa","text":" \u6253\u5f00\u63a7\u5236\u4e2d\u5fc3\uff0c\u8d26\u6237\u8bbe\u7f6e\u4e3a\u3010\u81ea\u52a8\u767b\u5f55\u3011\u548c\u3010\u65e0\u5bc6\u7801\u767b\u5f55\u3011\uff0c\u7535\u6e90\u7ba1\u7406\u4e2d\u4f7f\u7528\u7535\u6e90\u5168\u90e8\u8bbe\u7f6e\u4e3a\u3010\u4ece\u4e0d\u3011\uff0c\u5f00\u542f\u5f00\u53d1\u8005\u6a21\u5f0f\u3002 \u6839\u636e\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u8981\u6c42\uff0c\u5bfc\u5165\u76f8\u5173\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\uff1a\u5bfc\u5165\u76f8\u518c\u3001\u5f71\u9662\u3001\u97f3\u4e50\u7684\u6d4b\u8bd5\u8d44\u6e90\u3002 \u5728\u670d\u52a1\u7aef\u6253\u5f00\u76f8\u673a\u5e94\u7528\u540e\uff0c\u5c06\u6d4b\u8bd5\u673a\u684c\u9762\u58c1\u7eb8\u66f4\u6362\u4e3a\u7eaf\u8272\u58c1\u7eb8\uff08\u6ce8\u610f\uff0c\u670d\u52a1\u7aef\u9700\u63d0\u524d\u5f00\u542f\u76f8\u673a\u540e\u518d\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u58c1\u7eb8\uff0c\u5efa\u8bae\u7eaf\u9ed1\u58c1\u7eb8 setting/res/black.png\uff09 \u5728\u6587\u4ef6\u7ba1\u7406\u5668\u4e2d\uff0c\u5c06\u9009\u9879 \u4e3b\u83dc\u5355-\u8bbe\u7f6e-\u9884\u89c8-\u56fe\u7247\u9884\u89c8 \u53d6\u6d88\u52fe\u9009\uff08\u5982\u4e0d\u53d6\u6d88\uff0c\u4f1a\u5f71\u54cd\u622a\u56fe\u5f55\u5c4f\u5e94\u7528\u7684\u6027\u80fd\u6570\u636e\uff09 \u79fb\u52a8\u6216\u5220\u9664\u7cfb\u7edf Logo \uff0c\u6392\u9664\u684c\u9762\u53f3\u4e0b\u89d2 Logo \u7684\u5f71\u54cd\uff08\u91cd\u542f\u751f\u6548\uff09\u3002 sudo mv /usr/share/deepin/uos_logo.svg ~/Pictures/\n \u5b89\u88c5\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\uff08\u5fc5\u987b\u5b89\u88c5\uff01\uff01\uff09 AMD \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_amd64.deb ARM \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_arm64.deb MIPS \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_mips64.deb 3A5000 \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_5000.deb \u5b89\u88c5\u547d\u4ee4 sudo dkpg -i xserver-xorg-input-libinput_0.28.2-2_amd64.deb\n \u5b89\u88c5\u65f6\u4f1a\u63d0\u793a\u5df2\u5b58\u5728\u76f8\u540c\u7248\u672c\uff0c\u8bf7\u5ffd\u7565\uff0c\u76f4\u63a5\u8986\u76d6\u5b89\u88c5\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u4e3b\u673a\u624d\u751f\u6548"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u670d\u52a1\u7aef\u4e00\u952e\u73af\u5883\u90e8\u7f72","text":"\u73af\u5883\u642d\u5efa\u524d\u5fc5\u987b\u5148\u8fde\u63a5\u4e0a USB \u4e32\u53e3\u7ebf\u548c\u91c7\u96c6\u76d2\u3002 \u5bbf\u4e3b\u673a\u73af\u5883\u5b89\u88c5 python3 manage.py install --env host\n \u5bb9\u5668\u73af\u5883\u5b89\u88c5 python3 manage.py install --env docker\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u56db\u3001\u914d\u7f6e\u9879","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u670d\u52a1\u7aef\u914d\u7f6e","text":"setting/config/server.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u914d\u7f6e\u9879\uff0c\u5305\u542b\u4e86\u6240\u6709\u670d\u52a1\u7aef\u6240\u6709\u7684\u53ef\u914d\u7f6e\u9879\u3002 \u672c\u5730\u65e0\u7f51\u7edc\u8fd0\u884c \u5c06\u914d\u7f6e\u9879 network=0 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u672c\u5730\u6709\u7f51\u7edc\u8fd0\u884c \u914d\u7f6e\u9879 network=1 (1)\u914d\u7f6e\u9879 client_alias= \u914d\u7f6e\u4e3a\u4f60\u8981\u6d4b\u8bd5\u7684\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5982 Alias1 \u6d4b\u8bd5\u673a\u522b\u540d\u5728 setting/config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 (2)\u914d\u7f6e\u9879 client_alias= \u4e3a\u7a7a\uff0c\u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager --client_alias Alias1\uff0c\u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002(Alias1 \u4e3a\u4f60\u914d\u7f6e\u7684\u6d4b\u8bd5\u673a\u522b\u540d) (1)\u548c(2)\u53ea\u8981\u4f7f\u7528\u5176\u4e00\u5373\u53ef\u3002 \u6709\u7f51\u7edc\u8fd0\u884c\uff0c\u4e14\u9700\u8981\u901a\u8fc7 Jenkins \u4e0a\u8fd0\u884c\u4e00\u4e2a job \uff0c\u540c\u65f6\u63a7\u5236\u591a\u53f0\u673a\u5668\u3002 \u914d\u7f6e\u9879 network=1 \u914d\u7f6e\u9879 client_alias= \u4e0d\u7528\u914d\u7f6e\uff0c\u5728\u8fd0\u884c run.sh \u7684\u65f6\u5019\u76f4\u63a5\u7a7a\u683c\u52a0\u522b\u540d\u5373\u53ef\uff0c\u6bd4\u5982\uff1a\u6d4b\u8bd5\u673a\u522b\u540d\u4e3a Alias1 \uff0c\u4e14\u5df2\u7ecf\u5728 config/client.ini \u4e2d\u914d\u7f6e\u4e86 Alias1 \u7684user ip password \uff0c\u5219\u8fd0\u884c bash run.sh Alias1 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u5728 Jenkins pipeline \u91cc\u9762\u901a\u8fc7\u5e76\u884c stage \u6216\u5e76\u884c\u8c03\u7528\u4e0b\u5c42\u4efb\u52a1\u7684\u65b9\u5f0f\u53ef\u4ee5\u5b9e\u73b0\u5927\u89c4\u6a21\u7684\u6027\u80fd\u6d4b\u8bd5\u9700\u6c42\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;1\u3001KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2\u3001KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f, e.g. TAGS = L1 or smoke\n[case_conf]\n# \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\uff0cocr\u6587\u6848\u8bc6\u522b\u8f83\u6162\uff0c\u4e0d\u63a8\u8350\u4f7f\u7528\nfind_by = stage\n# \u6700\u540e\u4e00\u4e2a\u7a33\u5b9a\u9636\u6bb5\u7684\u5e27\u6570\u8bc6\u522b\n# \u9996\u5e27\u5b58\u5728\u540e\u7684\u7b2c\u4e00\u4e2a\u5927\u4e8e\u8be5\u914d\u7f6e\u5e27\u6570\u7684\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u5c3e\u5e27\nfinal_stable_num=100\n# \u4ece\u8be5\u5e27\u6570\u5f00\u59cb\u8bc6\u522b\u6587\u6848\u6216\u56fe\u7247\uff0c\u51cf\u5c11\u5206\u6790\u65f6\u95f4\nstart_num = 150\n# \u8bc6\u522b\u7684\u6587\u6848\ntext=\n# \u8bc6\u522b\u56fe\u7247\nmatch=apps/xxx/images/match.png\n# \u8bc6\u522b\u76f8\u4f3c\u5ea6\nmatch_rate=0.9\n# \u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6bd4\u5982\u70ed\u542f\u52a8\u7528\u4f8b\uff0c\u4ece\u70b9\u51fb\u6253\u5f00\u5230\u505c\u6b62\u5f55\u5c4f\uff0c\u4e2d\u95f4\u7b49\u5f855\u79d2\uff1b\nduration = 15\n# \u5355\u6761\u7528\u4f8b\u6267\u884c\u7684\u6b21\u6570\ncount = 5\n# \u7a33\u5b9a\u9636\u6bb5\u5212\u5206\u7684\u76f8\u4f3c\u5ea6\nstable_similarity = 0.9997\n[server]\n# \u8c03\u8bd5\u6a21\u5f0f=1\uff0c\u4e3a\u5f00\u542f\u8c03\u8bd5\u6a21\u5f0f\uff0c0\u4e3a\u5173\u95ed\u3002\n# \u8c03\u8bd5\u6a21\u5f0f\u4e0b\u9ed8\u8ba4\u53ea\u6267\u884c\u4e00\u6b21\u7528\u4f8b\uff0c\u4e0d\u5173\u673a\n# \u7f16\u5199\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u5efa\u8bae\u5f00\u542fmaintain\u3002\nMAINTAIN = 0\n# \u8fd0\u884c\u7684\u73af\u5883docker\u5bb9\u5668\u73af\u5883\uff0chost\u5bbf\u4e3b\u673a\u73af\u5883\nENV = docker\n# \u670d\u52a1\u7aef\u5bc6\u7801\nPASSWORD=1\n# \u6307\u5b9a\u6d4b\u8bd5\u673a\u522b\u540d\n# \u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6bd4\u5982\uff1a\n# [AMD]\n# ip=10.8.15.86\n# user=uos\n# \u5176\u4e2d AMD \u4e3a\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5219client_alias=AMD\nCLIENT_ALIAS = x86\uff08Intel-i7\uff09\n# 1 \u5f00\u542f\u7f51\u7edc, 0 \u5173\u95ed\u7f51\u7edc\n# \uff081\uff09\u670d\u52a1\u7aef\u4e0e\u6d4b\u8bd5\u673a\u987b\u5728\u540c\u4e00\u7f51\u6bb5\u4e0b\uff0c\u4f60\u53ef\u4ee5\u5c1d\u8bd5\u5728\u670d\u52a1\u7aef\u901a\u8fc7ssh\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c\u5982\u679c\u53ef\u4ee5\u8fde\u63a5\uff0c\u8bf4\u660e\u7f51\u7edc\u6b63\u5e38\u3002\n# \uff082\uff09\u5f53input_type=FILE_NAME \u65f6\uff0c\u5fc5\u987b\u5f00\u542f\u7f51\u7edc\u3002\nNETWORK = 1\n# \u6027\u80fd\u7ed3\u679c\u7edf\u8ba1\u5355\u4f4d \u6beb\u79d2\u2014ms, \u79d2\u2014s\nUNIT=ms\n# \u6d4b\u8bd5\u673a\u5f00\u673a\u8fdb\u5165\u684c\u9762\u540e\u7b49\u5f85\u65f6\u95f4,\u5355\u4f4d/\u79d2\nSTARTUP_DELAY = 60\n# 1\u4e3a\u5220\u9664\u7f13\u5b58\uff0c0\u4e3a\u4e0d\u5220\u9664\u7f13\u5b58\n# \u7528\u4f8b\u6267\u884c\u5b8c\u540e\u4f1a\u5728report\u76ee\u5f55\u4e0b\u751f\u6210\u667a\u80fd\u89e3\u6790\u7684\u4e00\u4e9b\u7f13\u5b58\u56fe\u7247\u3002\nCACHE = 0\n# \u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u62a5\u544a\u4f1a\u4fdd\u5b58\u5728\u9879\u76ee\u4e0breport\u76ee\u5f55\u4e2d\uff1b\n# \u6307\u5b9a\u62a5\u544a\u76ee\u5f55\u5219\u5b58\u653e\u5230\u6307\u5b9a\u76ee\u5f55\u3002\nREPORT_PATH = report\n# \u670d\u52a1\u7aef\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684icon\u8d44\u6e90\u4f1a\u7f13\u5b58\u5728\u9879\u76ee\u4e0binput\u76ee\u5f55\u4e2d\nINPUT = input/\n# 1\u4e3a\u6d4b\u8bd5\u5b8c\u5173\u673a\uff0c0\u4e3a\u6d4b\u8bd5\u5b8c\u4e0d\u5173\u673a\nSHUTDOWN = 0\n# \u89e3\u6790\u8fdb\u7a0b\u6570\uff08\u4e0d\u63a8\u8350\u4fee\u6539\uff09\n# 3\u4e2a\u8fdb\u7a0b\u89e3\u6790\u89c6\u9891\u5df2\u7ecf\u80fd\u591f\u6ee1\u8db3\uff0c\u5373\u4f7f\u589e\u52a0\u8fdb\u7a0b\u6570\u4e5f\u4e0d\u80fd\u51cf\u5c11\u6574\u4f53\u8017\u65f6\n# \u53e6\u5916\u8fd8\u8981\u770bCPU\u6838\u6570\u662f\u5426\u652f\u6301\u3002\nPARSING_PROCESS = 3\n# 1\u4e3a\u4f7f\u7528\u7ee7\u7535\u5668\u5f00\u5173\u673a\uff0c0\u4e3a\u4f7f\u7528reboot\u547d\u4ee4\u91cd\u542f\u3002\u4f9d\u8d56\u7ee7\u7535\u5668\u786c\u4ef6\u8bbe\u5907\uff0c\u9700\u8981\u4f7f\u7528\u8054\u7cfb\u5f00\u53d1\u8005\nRELAY = 0\n# \u83b7\u53d6\u6d4b\u8bd5\u5e94\u7528\u7684\u7248\u672c, %s \u5360\u4f4d\u5e94\u7528\u540d\n# \u5982\u679c\u8be5\u914d\u7f6e\u4e3a\u7a7a\uff0c\u5219\u4e0d\u83b7\u53d6\u5e94\u7528\u7684\u7248\u672c\u4fe1\u606f\u3002\nCOMMAND = apt policy %s 2>/dev/null|grep \"\u5df2\u5b89\u88c5\"|awk -F \"\uff1a\" \"{print \\$2}\"\n# \u5173\u673a\u7b49\u5f85\u5f00\u542f\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6839\u636e\u6d4b\u8bd5\u673a\u6027\u80fd\u4e0d\u540c\uff0c\u5f00\u5173\u673a\u8017\u65f6\u53ef\u80fd\u4e0d\u540c\uff0c\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u673a\u60c5\u51b5\u914d\u7f6e\u3002\nSHUTDOWN_DELAY = 30\n# \u53ef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u56fe\u7247\u683c\u5f0f\uff0c\u4ee5\u82f1\u6587\u9017\u53f7\u9694\u5f00\u3002\n# \u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u76ee\u524d\u6211\u4eec\u4ec5\u9a8c\u8bc1\u4e86jpg,jpeg,png\u8fd9\u4e09\u79cd\u5e38\u7528\u7684\u56fe\u7247\u683c\u5f0f\u3002\nINPUT_TYPES = jpg,jpeg,png\n# \u6027\u80fd\u5206\u6790\u8865\u5e27\uff0c\u7b49\u4e8e\u6216\u4f4e\u4e8e\u8be5\u503c\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u9700\u8981\u51cf\u6389\u3002\nUN_STAB_START = 3\n# \u670d\u52a1\u7aef\u83b7\u53d6\u6d4b\u8bd5\u673a\u56fe\u50cf\u7684\u5e27\u7387\uff0c\u5373\u6bcf\u79d2\u83b7\u53d6\u591a\u5c11\u5f20\u6d4b\u8bd5\u673a\u4e0a\u7684\u56fe\u50cf\u3002\n# \u9ed8\u8ba4\u5e27\u7387\u4e3a30\u5e27/\u79d2\uff0c\u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u53ef\u80fd\u4f1a\u5bf9\u89e3\u6790\u7ed3\u679c\u9020\u6210\u504f\u5dee\u3002\nFPS = 30\n# \u4ee5\u4e0b\u573a\u666f\u7c7b\u578b\u4f1a\u91cd\u542f\u6d4b\u8bd5\u673a,\u591a\u79cd\u573a\u666f\u4f7f\u7528\u9017\u53f7\u9694\u5f00\nSCENE = cold\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = http://10.8.13.78:8890\n#\u5c4f\u5e55\u56fe\u7247\u4e34\u65f6\u5b58\u653e\u4f4d\u7f6e\nSCREEN_CACHE = /tmp/screen\n# =======================================\n[log]\n# \u65e5\u5fd7\u7ea7\u522b\uff0cOFF\u3001FATAL\u3001ERROR\u3001WARN\u3001INFO\u3001DEBUG\u3001ALL\n# \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u65e5\u5fd7\u8f93\u51fa\uff0clog_cli=INFO\u8868\u793a \u4ec5\u8f93\u51faINFO\u53ca\u4ee5\u4e0a\u7ea7\u522b\u7684\u65e5\u5fd7\u3002\nLOG_LEVEL = DEBUG\n# \u65e5\u5fd7\u6587\u4ef6\u4fdd\u5b58\u8def\u5f84\nLOG_PATH= logs\n# =======================================\n[dockerhub]\n# \u5bb9\u5668\u767b\u9646\u8d26\u53f7\nDOCKER_USER = user\n# \u5bb9\u5668\u767b\u9646\u5bc6\u7801\nDOCKER_PASSWORD = User1234\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u6d4b\u8bd5\u673a\u914d\u7f6e","text":"setting/config/client.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u4fe1\u606f\u3002 \u6709\u7f51\u7edc\u7684\u60c5\u51b5\u4e0b\uff0c\u670d\u52a1\u7aef\u9700\u8981\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u56e0\u6b64\u4f60\u9700\u8981\u5199\u5165 \u6d4b\u8bd5\u673a\u522b\u540d \u3001 user \u3001ip\u3001 password \u3002 # \u6d4b\u8bd5\u673a\u522b\u540d\n[Alias1] # \u6d4b\u8bd5\u673aip\nip=10.8.15.86 # \u6d4b\u8bd5\u673a\u7528\u6237\u540d\nuser=uos\n \u547d\u540d\u5efa\u8bae\uff1aAliasA1\u3001AliasA2\u3001AliasB1\u3001AliasB2\uff0c\u4e0d\u8981\u91cd\u540d\u3002 \u65e0\u7f51\u7edc\u60c5\u51b5\u4e0b\uff0c\u4ec5\u9700\u8981\u5173\u6ce8\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\u9879 width=\u3001 height= \u5373\u53ef\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a [client]\n# \u9ed8\u8ba4\u6d4b\u8bd5\u673a\u7528\u6237\u540d\uff0c\u5bc6\u7801\uff0cip\nip=\nuser=\n# \u6d4b\u8bd5\u673a\u5bc6\u7801\npassword=1\n# \u6d4b\u8bd5\u673a\u4e3b\u9898\ntheme=bloom\n# \u6d4b\u8bd5\u673aicon\u76ee\u5f55\npath=/usr/share/icons\n# \u7cfb\u7edfdesktop\u6587\u4ef6\u7684\u5b58\u653e\u76ee\u5f55\uff0cUOS\u7cfb\u7edf\u9ed8\u8ba4\u4e3a/usr/share/applications\ndesktop_path=/usr/share/applications\n# \u7528\u4e8e\u5224\u65ad\u6d4b\u8bd5\u673a\u662f\u5426\u5f00\u673a\u8fdb\u5165\u684c\u9762\u7684\u8bc6\u522b\u6807\u8bc6\u3002\n# 1\u3001\u901a\u8fc7\u684c\u9762\u56fe\u6807\u8bc6\u522b\u3002\n# - type=FILE_NAME\u65f6\uff0c\u670d\u52a1\u5668\u548c\u6d4b\u8bd5\u673a\u5fc5\u987b\u5728\u540c\u4e00\u5c40\u57df\u7f51\u5185\u3002\n# - power_on=dde-computer\u8868\u793a\u901a\u8fc7\u684c\u9762\u8ba1\u7b97\u673a\u56fe\u6807\u5224\u65ad\u5f00\u673a\u8fdb\u5165\u684c\u9762\u3002\n# 2\u3001\u901a\u8fc7\u672c\u5730\u56fe\u7247\u4f5c\u4e3a\u5f00\u673a\u8bc6\u522b\u3002\n# - type= \u4f20\u5165\u4e3a\u56fe\u7247\u683c\u5f0f\uff0ctype\u652f\u6301\u7684\u7c7b\u578b\u5305\u542b\u5728server.ini\u5185\u914d\u7f6e\u9879input_type=jpg,jpeg,png\u3002\n# - power_on= \u4f20\u5165\u7684\u662f\u672c\u5730\u56fe\u7247\u7684\u8def\u5f84\u3002\ntype=FILE_NAME\npower_on=dde-computer\n# \u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\uff08\u6d4b\u8bd5\u673a\u8fde\u63a5\u91c7\u96c6\u76d2\uff0c\u91c7\u96c6\u76d2\u7684\u5206\u8fa8\u7387\uff09\nheight=1080\nwidth=1920\n[AliasA1] ip=10.8.15.86\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n[AliasA2]\nip=10.8.15.20\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_2","title":"3\u3001\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e","text":"\u968f\u7740\u6d4b\u8bd5\u573a\u666f\u7684\u4e0d\u65ad\u5f15\u5165\uff0c\u53d1\u73b0\u73b0\u6709\u670d\u52a1\u7aef\u91cc\u7684\u914d\u7f6e\u9879\u5e76\u4e0d\u9002\u7528\u4e8e\u6240\u6709\u7684\u6027\u80fd\u573a\u666f\uff0c\u4e8e\u662f\u5c06\u670d\u52a1\u7aef\u914d\u7f6e\u8fdb\u884c\u4e00\u4e2a\u63d0\u53d6\uff0c\u53ef\u505a\u5355\u4e2a\u573a\u666f\u7684\u4e2a\u6027\u5316\u914d\u7f6e\uff0c\u5f53\u7136\u539f\u6765\u7684\u670d\u52a1\u7aef\u914d\u7f6e\u529f\u80fd\u4fdd\u7559\uff0c\u53ea\u662f\u5f53\u4f60\u914d\u7f6e\u4e86\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e\u540e\uff0c\u4f18\u5148\u4f7f\u7528\u4e2a\u6027\u5316\u914d\u7f6e\u91cc\u9762\u7684\u5185\u5bb9\uff0c\u4ee5\u4e0b\u662f\u5bf9\u4e2a\u6027\u5316\u914d\u7f6e\u7684\u4ecb\u7ecd\u3002 \u76ee\u524d\u6bcf\u4e00\u4e2a py \u6587\u4ef6\u5bf9\u5e94\u4e00\u4e2a\u6027\u80fd\u6d4b\u8bd5\u573a\u666f\uff0c\u4e8e\u662f\u5728\u540c\u7ea7\u76ee\u5f55\u4e0b\u521b\u5efa\u4e00\u4e2a\u4e0e\u4e4b\u540c\u540d\u7684 json \u6587\u4ef6\uff0c\u4f5c\u4e3a\u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6 apps\n\u251c\u2500\u2500 album\n \u251c\u2500\u2500 test_album_01_start.json # \u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6\n\u2514\u2500\u2500 test_album_01_start.py # \u6027\u80fd\u573a\u666f\u6587\u4ef6\n \u4ee5\u4e0b\u662f\u5bf9 json \u6587\u4ef6\u4e2d\u914d\u7f6e\u7684\u89e3\u91ca\uff0c\u82e5\u67d0\u9879\u914d\u7f6e\u4e0d\u9700\u8981\uff0c\u53ef\u4ee5\u7f3a\u5931\uff0c\u4f46\u4e0d\u80fd\u4e3a\u7a7a\uff1b {\n\"title\": \"test_album_start\", # \u6807\u9898\uff1b\u5fc5\u987b\n\"app_name\": \"deepin-album\", # \u573a\u666f\u6240\u5c5e\u7684\u5e94\u7528\uff1b\u5fc5\u987b\n\"scene\": \"hot\", # \u573a\u666f\u522b\u540d\uff1b\u5fc5\u987b\n\"icon\": [\"deepin-album\"], # \u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684icon\u5230\u670d\u52a1\u7aef\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\uff1b\u53ef\u7f3a\u5931\n# \u6ce8\u610f\uff1a\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684desktop\u6587\u4ef6\u540d\u4e3adeepin-album.desktop\uff0c\n# \u53ea\u9700\u8981\u5199deepin-album\u5373\u53ef\uff0c\u201c.desktop\u201d\u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002\n\"size\": { # \u56fe\u7247\u5bf9\u6bd4\u7684\u533a\u57df\u8bbe\u7f6e\u9879\uff0c\u67d0\u4e9b\u5e94\u7528\u5f53\u524d\u5c4f\u5e55\u7684\u90e8\u5206\u533a\u57df\u9700\u8981\u5c06\u5176\u53bb\u6389\uff0c\u53ef\u4ee5\u8bbe\u7f6e\u6b64\u9879\uff0c\u5982\u679c\u6ca1\u6709\u5219\u53ef\u4e0d\u5199\uff1b\u53ef\u786e\u5b9e\n\"x-coordinate\": 0, # \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n\"y-coordinate\": 0, # \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n\"width\": 850, # \u6a2a\u5411\u957f\u5ea6\n\"height\": 1920 # \u7eb5\u5411\u9ad8\u5ea6\n},\n\"count\": 5, # \u573a\u666f\u6267\u884c\u7684\u6b21\u6570\uff1b\u5fc5\u987b\n\"duration\": 5, # \u8be5\u6761\u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff0c\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7279\u5b9a\u573a\u666f\uff0c\u8be5\u914d\u7f6e\u4e3a\u53ef\u9009\u9879\uff0c\u8986\u76d6 server.ini \u4e2d\u7684\u914d\u7f6e\uff1b\u53ef\u7f3a\u5931\n\"stable_similarity\": 0.9997, # \u6027\u80fd\u573a\u666f\u5206\u9636\u6bb5\u65f6\u7684\u56fe\u7247\u76f8\u4f3c\u5ea6\u5bf9\u6bd4\uff0c\u524d\u540e\u56fe\u7247\u4f4e\u4e8e\u8be5\u503c\uff0c\u5219\u5206\u4e3a\u4e0d\u7a33\u5b9a\u9636\u6bb5\uff1b\u53ef\u7f3a\u5931\n\"find_by\": \"stage\", # \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\n\"final_stable_num\": 100, # \u67e5\u627e\u6700\u540e\u4e00\u4e2a\u5927\u4e8e\u8be5\u503c\u7684\u7a33\u5b9a\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u7684\u5c3e\u796f\uff1b\u53ef\u7f3a\u5931\n\"start_num\": 150,\n\"text\": \"\", # ocr\u8bc6\u522b\u7684\u6587\u6848\n\"match\": \"apps/xxx/images/match.png\", # \u56fe\u50cf\u5339\u914d\u7684\u56fe\u7247\u6587\u4ef6\u8def\u5f84\n\"match_rate\": 0.9 # \u5339\u914d\u76f8\u4f3c\u5ea6\n}\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e94\u3001\u6d4b\u8bd5\u6d41\u7a0b","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516d\u3001\u7528\u4f8b\u7f16\u5199\u53ca\u65b9\u6cd5\u53c2\u6570\u6307\u5f15","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"1\u3001\u7528\u4f8b\u5b9e\u4f8b\u8bf4\u660e","text":"# \u6807\u51c6\u5e93\u5bfc\u5165\nfrom time import sleep\n# \u5bfc\u5165\u4e09\u65b9\u5e93pytest\nimport pytest\n# \u5bfc\u5165\u7528\u4f8b\u6267\u884c\u8981\u7528\u5230\u7684Widget\u7c7b\nfrom src.base_widget import BaseWidget\nclass TestStart:\n# class\u7ea7\u522b\u7684fixture\uff0c\u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u6267\u884c\u3002autouse=True \u81ea\u52a8\u5728\u5f53\u524d\u4f5c\u7528\u57df\u4e0b\u4f7f\u7528\u3002\n@pytest.fixture(scope=\"class\", autouse=True)\n# \u6d4b\u8bd5\u70ed\u542f\u52a8\u4e4b\u524d\u9700\u8981\u9884\u542f\u52a8\u3002\ndef application_pre_start(self):\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().right_click_element(\"deepin-album\")\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().click_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\")\nsleep(2)\n# \u5feb\u6377\u952e\u5173\u95ed\u7a97\u53e3\nBaseWidget().hot_key(\"alt\", \"f4\")\nsleep(2)\n# \u9ed8\u8ba4\u4e3afunction\u7ea7\u522b\u7684fixture\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\uff0cclass\u7ea7\u522bfixture\u6267\u884c\u4e4b\u540e\u6267\u884c\u3002\n@pytest.fixture(autouse=True)\ndef setup_start(self):\n# \u53f3\u952e\u70b9\u51fb deepin-album \u56fe\u6807\nBaseWidget().right_click_element(\"deepin-album\")\n# \u79fb\u52a8\u5230\u53f3\u952e\u83dc\u5355\u4e2d\u6253\u5f00\uff08open.png\uff09\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().move_to(*BaseWidget().find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))\n# \u7b49\u5f85\u79fb\u52a8\u5b8c\u6210\nsleep(0.5)\ndef test_album_start(self):\n# \u70b9\u51fb\u201c\u6253\u5f00\u201d\nBaseWidget().click() \n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"2\u3001\u65b9\u6cd5\u53c2\u6570\u8bf4\u660e","text":"2.1\u3001find_element \u65b9\u6cd5 def find_element(element: str, input_type: str = \"FILE_NAME\", fill_color_position: tuple = (-1, -1), size: tuple = (25, 70)):\npass\n \u53c2\u6570 element \u548c input_type \uff081\uff09\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u5143\u7d20 - `input_type` \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a `FIEL_NAME` \uff0c\u8868\u793a\u901a\u8fc7\u5e94\u7528 `icon` \u5bfb\u627e\u5143\u7d20\uff0c\u6b64\u65b9\u6cd5\u4f1a\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u5e94\u7528 `icon` \u56fe\u6807\u3002\n \u4e3e\u4f8b\uff1a\u9ed8\u8ba4\u60c5\u51b5\u4e0b input_type \u53c2\u6570\u4e0d\u9700\u8981\u4f20\u5165\uff0c find_element(\"deepin-album\")\uff0c\u8868\u793a\u901a\u8fc7 deepin-album \u7684\u5e94\u7528 icon \u6765\u83b7\u53d6\u5750\u6807\uff0c\u6ce8\u610f\uff0c\u6b64\u65f6\u4f20\u5165\u7684 deepin-album \u53c2\u6570\u5b9e\u9645\u662f desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u548c2.3\u4e2d\u7684 icon \u53d8\u91cf\u4e00\u81f4\u3002 \u6211\u4eec\u5efa\u8bae\u4f18\u5148\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\uff0c\u4f46\u6b64\u65b9\u6cd5\u4f9d\u8d56\u7f51\u7edc\uff0c\u8bf7\u6839\u636e\u6d4b\u8bd5\u73af\u5883\u5b9e\u9645\u60c5\u51b5\u9009\u62e9\u3002 \uff082\uff09\u901a\u8fc7\u672c\u5730\u56fe\u7247\u8bc6\u522b\u5143\u7d20 - \u53c2\u6570 `input_type` \u4f20\u5165\u56fe\u7247\u683c\u5f0f\uff0c\u6bd4\u5982\u622a\u53d6\u7684\u672c\u5730\u56fe\u7247\u683c\u5f0f\u4e3a `png`\uff0c\u90a3\u4e48 `input_type=\"png\"`\uff0c\u6b64\u65f6\u53c2\u6570 `element ` \u4f20\u5165\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5efa\u8bae\u5b58\u653e\u5728\u5bf9\u5e94\u7684\u4ea7\u54c1 `apps/app/picture/` \u76ee\u5f55\u4e0b\uff0c\u8def\u5f84\u4e3a\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u7684\u76f8\u5bf9\u8def\u5f84\u3002\n- \u4e3e\u4f8b\uff1a`find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))`\uff0c\u8868\u793a\u901a\u8fc7\u672c\u5730\u56fe\u7247 `open.png` \u8bc6\u522b\u5143\u7d20\u3002\n \u53c2\u6570 fill_color_position fill_color_position \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (-1, -1)\uff0c(-1, -1) \u8868\u793a\u53d6\u5c4f\u5e55\u4e2d\u53f3\u4e0b\u89d2\u6700\u540e\u4e00\u4e2a\u50cf\u7d20\u70b9\u4f5c\u4e3a\u586b\u5145\u5750\u6807\uff0c\u5728 1920x1080 \u5c4f\u5e55\u5206\u8fa8\u7387\u4e0b\u5373\u5b9e\u9645\u5750\u6807\u4e3a (1919, 1079) \uff0c\u8fd9\u6837\u7684\u5199\u6cd5\u53ef\u4ee5\u9002\u914d\u4e0d\u540c\u5927\u5c0f\u7684\u5c4f\u5e55\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0d\u540c\u65b9\u4f4d\uff1a \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0b\u65b9\uff0c\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u4e0d\u9700\u8981\u4f20\u5165\u8be5\u53c2\u6570\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u5de6\u8fb9\uff0cfill_color_position=(1, 1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u53f3\u8fb9\uff0cfill_color_position=(-1, -1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0a\u8fb9\uff0cfill_color_position=(1, 1) \u4ece\u684c\u9762\u542f\u52a8\u5e94\u7528\uff0c\u5219\u9700\u8981\u4f20\u5165\u9664\u4efb\u52a1\u680f\u4ee5\u5916\u5176\u4ed6\u4f4d\u7f6e\u7684\u5750\u6807\uff0c\u6bd4\u5982(100, 100)\uff0c\u53ea\u8981\u8fd9\u4e2a\u5750\u6807\u4e3a\u9664\u5e94\u7528\u548c\u4efb\u52a1\u680f\u533a\u57df\u90fd\u53ef\u4ee5\u3002 \u4ece\u542f\u52a8\u5668\u91cc\u9762\u542f\u52a8\u5e94\u7528\uff0c\u9700\u8981\u586b\u5145\u7684\u5750\u6807\u4e3a\u542f\u52a8\u5668\u533a\u57df\u3002 \u6ce8\uff1a\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u65f6\uff0c\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684 icon \u539f\u6587\u4ef6\u4e3a svg \u77e2\u91cf\u56fe\uff0c\u8f6c\u6362\u4e3a png \u4e4b\u540e\u9700\u8981\u586b\u5145\u8fb9\u7f18\u900f\u660e\u90e8\u5206\u3002 \u53c2\u6570 size size \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (25, 70)\uff0c\u8868\u793a\u6d4b\u8bd5\u673a\u4e0a dock \u680f\u4e0a\u5e94\u7528\u56fe\u6807\u7684\u5927\u5c0f\u8303\u56f4\u3002 UOS \u7cfb\u7edf dock \u680f\u662f\u53ef\u4ee5\u4e0a\u4e0b\u62d6\u52a8\u5927\u5c0f\u7684\uff0c\u968f\u7740 dock \u680f\u5927\u5c0f\u6539\u53d8\uff0c\u5e94\u7528\u56fe\u6807\u7684\u8303\u56f4\u4e3a25\u523070\u4e4b\u95f4\u3002 \u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u64cd\u4f5c\u7cfb\u7edf\u4e0a dock \u680f\u5927\u5c0f\u4e0d\u4e00\u6837\uff0c\u53ef\u4ee5\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u4f20\u5165\u5927\u5c0f\u8303\u56f4\u3002 2.2\u3001click_element\u3001 right_click_element\uff0c double_click_element \u8fd9\u51e0\u4e2a\u65b9\u6cd5\u53c2\u6570\u89c4\u5219\u4e0e find_element \u65b9\u6cd5\u4e00\u6837\u3002\u4ed6\u4eec\u5b9e\u9645\u4e0a\u662f\u5728 find_element \u65b9\u6cd5\u57fa\u7840\u4e4b\u4e0a\u505a\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u589e\u52a0\u4e86\u9f20\u6807\u7684\u52a8\u4f5c\uff0c\u5982\u679c\u4f60\u4e0d\u60f3\u4f7f\u7528\u8fd9\u51e0\u4e2a\u65b9\u6cd5\uff0c\u5728\u7528\u4f8b\u4e2d\u4e5f\u53ef\u4ee5\u901a\u8fc7 find_element \u83b7\u53d6\u5230\u5750\u6807\uff0c\u7136\u540e\u5c06\u5750\u6807\u4f20\u5165\u5230\u952e\u9f20\u7684\u65b9\u6cd5\u4e2d\uff0c\u53ef\u4ee5\u5b9e\u73b0\u540c\u6837\u7684\u6548\u679c\u3002 2.3\u3001\u7528\u4f8b\u7c7b\u4e2d\u6709\u4e2a\u7c7b\u53d8\u91cf icon = [\"deepin-album\"] \u9700\u8981\u7279\u6b8a\u8bf4\u660e\uff0c\u5217\u8868\u4e2d\u7684\u5143\u7d20\u4e3a\u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709 icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684 icon \u5230\u670d\u52a1\u7aef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528 desktop \u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684 desktop \u6587\u4ef6\u540d\u4e3a deepin-album.desktop\uff0c\u53ea\u9700\u8981\u5199 deepin-album \u5373\u53ef\uff0c.desktop \u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e03\u3001\u6267\u884c\u5165\u53e3","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"1\u3001\u7528\u4f8b\u7ec4\u7ec7","text":"\u5728 setting/config/server.ini \u6587\u4ef6\u4e2d APP_NAME= \u5b57\u6bb5\u4e3a\u7528\u4f8b\u7684\u6267\u884c\u7684\u76ee\u5f55\uff0c\u9ed8\u8ba4\u4e3a apps \u76ee\u5f55\u4e0b\u6240\u6709\u7528\u4f8b\u3002\u5982\u679c\u4f60\u60f3\u6307\u5b9a\u6267\u884c\u67d0\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4f60\u53ef\u4ee5\u5c06\u8be5\u914d\u7f6e\u9879\u6307\u5b9a\u5230\u5e94\u7528\u7684\u7528\u4f8b\u76ee\u5f55\uff0c\u6bd4\u5982\uff1aAPP_NAME=deepin_album\uff0c \u8868\u793a\u6267\u884c\u76f8\u518c\u76ee\u5f55\u4e0b\u7684\u7528\u4f8b\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a python3 manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music\n -k KEYWORDS, --keywords KEYWORDS\n \u7528\u4f8b\u7684\u5173\u952e\u8bcd\n -t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e\n --log_level LOG_LEVEL \u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n --env {host,docker} \u5728\u5bbf\u4e3b\u673a\u6216\u5bb9\u5668\u73af\u5883\u6267\u884c\n --client_alias \u9009\u62e9\u6d4b\u8bd5\u673a\u522b\u540d, \u53ef\u9009\u9879\u4e3aclient.ini\u4e2d\u5df2\u914d\u7f6e, \u9ed8\u8ba4\u503c\u4e3a zx-x86.\n --count \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a python3 manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\" --env docker\n \u6ce8\uff1a\u5728\u5bb9\u5668\u4e2d\u6267\u884c\u65f6\uff0c\u82e5\u5f3a\u5236\u9000\u51fa\uff0c\u5bb9\u5668\u5e76\u4e0d\u4f1a\u505c\u6b62\u8fd0\u884c\uff01"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_9","title":"\u516b\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1json","title":"1\u3001Json \u62a5\u544a","text":"\u81ea\u7814\u89c6\u9891\u89e3\u6790\u5de5\u5177\u4f1a\u5bf9\u5355\u6761\u7528\u4f8b\u6267\u884c\u4e00\u8f6e\u751f\u6210\u4e00\u4e2a json \u6587\u4ef6\uff0c\u5b58\u653e\u4e8e report/{app_name}/{scene}/{run_num} \u76ee\u5f55\u4e0b\uff0c\u547d\u540d\u683c\u5f0f\u4e3a\uff1a report.json json \u5185\u5bb9\u4e3e\u4f8b\uff1a [\n{\n\"Stab1\": {\n\"images\": [1,2...150,151],\n\"startStub\": 0,\n\"type\": \"Stab\"\n}\n},\n{\n\"Stab2\": {\n\"images\": [152,153...169,170],\n\"startStub\": 1,\n\"type\": \"UnStab\"\n}\n},\n{\n\"Stab3\": {\n\"images\": [171,172...300,301],\n\"startStub\": 0,\n\"type\": \"UnStab\"\n}\n}\n]\n \u8bf4\u660e\uff1a Stab \uff1a\u8868\u793a\u89e3\u6790\u8fc7\u7a0b\u4e2d\u4e0d\u540c\u7684\u9636\u6bb5\u3002 images \uff1a\u8868\u793a\u6bcf\u4e00\u5e27\u7684\u56fe\u7247\u5e8f\u53f7\u3002 startStub\uff1a \u4e3a\u8bc6\u522b\u5c3e\u5e27\u7684\u9636\u6bb5\u8868\u793a\uff0c\u5982\u679c \"startStub\": 1 \uff0c\u8bf4\u660e\u5c3e\u5e27\u51fa\u73b0\u5728\u8be5\u9636\u6bb5\u3002 type\uff1a \u4e3a Stab \u6216 UnStab \uff0c\u8868\u793a\u7a33\u5b9a\u9636\u6bb5\u6216\u4e0d\u7a33\u5b9a\u9636\u6bb5\u3002 \u5404\u9636\u6bb5\u6709\u5e27\u6570\u8865\u507f\uff0c\u9ed8\u8ba4\u8865\u507f\u7684\u5e27\u6570\u4e3a 3 \u5e27\uff08\u53ef\u4ee5\u901a\u8fc7 server.ini \u91cc\u9762 un_stab_start=3 \u8fdb\u884c\u914d\u7f6e\uff09\uff0c\u8868\u793a\u5c0f\u4e8e\u7b49\u4e8e 3 \u5e27\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u524d\u540e\u5747\u9700\u8981\u51cf\u6389\u3002 \u5e94\u7528\u542f\u52a8\u9636\u6bb5\u5c31\u662f\u5728 Stab2 \u9636\u6bb5\uff0c\u542f\u52a8\u65f6\u95f4\u4e3a\uff1a171 \u51cf 151 \u518d\u51cf\u6389\u524d\u540e\u8865\u507f\u5e27\u6570 6 \u5e27\uff0c\u5373 14 \u5e27\uff0c\u89c6\u9891\u5e27\u7387 30 \u5e27/\u79d2\uff0c\u56e0\u6b64\u542f\u52a8\u8017\u65f6\u4e3a\uff1a14 * 33 = 462 ms"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2excel","title":"2\u3001Excel \u62a5\u544a","text":"\u6240\u6709\u7528\u4f8b\u6267\u884c\u5e76\u89e3\u6790\u5b8c\u4e4b\u540e\u4f1a report \u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a\u6c47\u603b\u6570\u636e\u7684 Excel \u6587\u4ef6\uff0c\u6587\u4ef6\u540d\u4e3a\uff1a{time}_perf_time.xlsx\u3002 \u6ce8\u610f\uff0creport \u76ee\u5f55\u4e3a\u53ef\u914d\u7f6e\u9879\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u4f1a\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u751f\u6210\uff0c\u5982\u679c\u4f60\u5c06 report\uff0c\u6307\u5b9a\u5230\u9879\u76ee\u4e0b\u5176\u4ed6\u8def\u5f84\uff0c\u5219\u4f1a\u5728\u5bf9\u5e94\u7684\u8def\u5f84\u4e0b\u751f\u6210 json \u548c Excel \u6587\u4ef6\u3002 \u4f60\u4e5f\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8bfb\u53d6\u6240\u6709 json / excel \u62a5\u544a\u7684\u6570\u636e\uff0c\u751f\u6210\u4f60\u81ea\u5df1\u60f3\u8981\u7684\u4e00\u4e9b\u6d4b\u8bd5\u62a5\u544a\u5f62\u5f0f\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#usb","title":"\u4e5d\u3001USB \u4e32\u53e3\u9a71\u52a8\u952e\u9f20\u65b9\u6cd5","text":"\u4f4d\u4e8e src/utils/control/serial_communication \u76ee\u5f55\u4e0b\u7684 usb_mk.py \u6587\u4ef6 usb_mk = UsbMk()\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up()\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u652f\u6301\u4f20\u5165\u6c49\u5b57\uff0c\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click()\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() \n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() \n \uff084\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() \n \uff085\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() \n \uff086\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() \n \uff087\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff088\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff0810\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_10","title":"\u5341\u3001\u7ee7\u7535\u5668\u63a7\u5236\u4e3b\u673a\u5f00\u673a/\u91cd\u542f","text":"\uff08\u82e5\u4e0d\u4f7f\u7528\u7ee7\u7535\u5668\uff0c\u53ef\u5ffd\u7565\u8be5\u6b65\u9aa4\uff0c\u6267\u884c\u65f6\u4f1a\u901a\u8fc7\u547d\u4ee4 reboot\uff09"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u7ee7\u7535\u5668\u8bbe\u5907","text":"LCUS-2 \u578b \u53cc\u8def USB \u667a\u80fd\u4e32\u53e3\u63a7\u5236\u7ee7\u7535\u5668\u3002 https://item.taobao.com/item.htm?spm=a1z09.2.0.0.41d72e8dUYx2pi&id=582653718178&_u=i25r20ia6a2e "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2usb","title":"2\u3001USB \u5ef6\u957f\u7ebf","text":"\u666e\u901a\u7684 USB \u7ebf\u5373\u53ef\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_3","title":"3\u3001\u675c\u90a6\u7ebf","text":"3.1\u300140P \u6bcd\u5bf9\u516c\u675c\u90a6\u7ebf\u3002 3.2\u3001\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"4\u3001\u5b89\u88c5\u56fe\u6587\u6559\u7a0b","text":"4.1\u3001\u4f7f\u7528 USB \u5ef6\u957f\u7ebf\u8fde\u63a5\u63a7\u5236\u7aef\u548c\u7ee7\u7535\u5668\u3002 4.2\u3001\u5728\u7ee7\u7535\u5668\u5e38\u7aef\u548c\u516c\u5171\u7aef\u5747\u8fde\u63a5\u4e00\u6839\u675c\u90a6\u7ebf\u3002 4.3\u3001\u5728\u4e3b\u677f\u4e0a\u5f00\u673a\u9488\u548c\u91cd\u542f\u9488\u4e0a\u63d2\u4e0a\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 4.4\u3001\u5c06\u5f00\u673a\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76841\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1\u5de6\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 4.5\u3001\u5c06\u91cd\u542f\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76842\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1 \u53f3\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 \u82e5\u60f3\u4fdd\u7559\u539f\u7535\u6e90\u5f00\u5173\u7684\u7535\u6e90\u706f\uff0c\u53ef\u6839\u636e\u5982\u4e0a\u56fe\u6240\u793a\uff0c\u4f7f\u7528\u675c\u90a6\u7ebf\u8fde\u63a5\u4e3b\u677f\u4e0a\u7684\u7535\u6e90\u706f\u548c\u539f\u7535\u6e90\u5f00\u5173"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_11","title":"\u5341\u4e00\u3001\u5e38\u89c1\u95ee\u9898\u8bf4\u660e","text":"1\u3001ERROR: for uos Cannot restart container 2301b1a1395d7959ee6523d61b61c87084649af530786cdb8fb5b3ecbcbd1068: linux runtime spec devices: error gathering device information while adding custom device \"/dev/ttyACM0\": no such file or directory \u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u8fde\u63a5\u72b6\u6001\uff0c\u67e5\u770b /dev/ttyACM0 \u662f\u5426\u5b58\u5728\uff0c\u82e5\u5b58\u5728 /dev/ttyACMn\uff08n\u4e3a\u4efb\u610f\u6570\u5b57\uff09\uff0c\u91cd\u542f\u7535\u8111\u89e3\u51b3\u3002 2\u3001Error response from daemon: Container 5e700fdc769e8c74666d68a7f2bc3de58268b4594cf88706609d59f8dbc7362d is not running \u5bb9\u5668\u542f\u52a8\u5931\u8d25 1\uff09\u68c0\u67e5\u54ea\u4e00\u4e2a\u5bb9\u5668\u672a\u542f\u52a8 sudo docker container ls # \u5217\u51fa\u8fd0\u884c\u4e2d\u7684 Docker \u5bb9\u5668\n 2\uff09\u7f3a\u5c11 uos \u5bb9\u5668\uff0c\u68c0\u67e5 USB \u4e32\u53e3\u8fde\u63a5\u7ebf\u548c\u91c7\u96c6\u76d2\u8fde\u63a5\u7ebf\u662f\u5426\u6b63\u5e38\uff0c\u91cd\u542f\u540e\u6267\u884c bash install/setup.up # \u91cd\u65b0\u5b8c\u6574\u90e8\u7f72\u73af\u5883\n \u6216\u6267\u884c sudo docker-compose up -d --build # \u4ec5\u91cd\u65b0\u6784\u5efa Docker \u955c\u50cf\n 3\u3001\u82e5\u90e8\u7f72\u65f6\u63d0\u793a\u6302\u8f7d ttyACM0\u3001video0 \u5931\u8d25\uff0c\u8bf7\u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u53ca\u91c7\u96c6\u76d2\u662f\u5426\u63a5\u89e6\u826f\u597d\uff0c\u82e5\u63a5\u89e6\u826f\u597d\uff0c\u91cd\u542f\u5373\u53ef\u89e3\u51b3\u3002 4\u3001\u82e5\u51fa\u73b0\u56fe\u7247\u80fd\u8bc6\u522b\uff0c\u4f46\u662f\u9f20\u6807\u672a\u79fb\u52a8\u64cd\u4f5c\u65f6\uff0c\u5b89\u88c5\u7edd\u5bf9\u9f20\u6807\u64cd\u4f5c\u7684\u4f9d\u8d56\u5305\uff0c\u89c1\u7b2c\u4e09\u8282\u7b2c\u4e8c\u5c0f\u8282\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u6d4b\u8bd5\u673a\u3002 5\u3001\u7531\u4e8e\u901a\u8fc7\u91c7\u96c6\u5361\u83b7\u53d6\u7684\u6d4b\u8bd5\u673a\u5b9e\u65f6\u753b\u9762\uff0c\u5305\u542b\u4e86\u9f20\u6807\u7684\u6837\u5f0f\uff0c\u6240\u4ee5\u5bf9\u56fe\u7247\u8bc6\u522b\u65f6\uff0c\u9f20\u6807\u82e5\u505c\u7559\u5728\u56fe\u6807\u4e0a\u5c42\uff0c\u5219\u4f1a\u5bf9\u8bc6\u522b\u7ed3\u679c\u9020\u6210\u5f71\u54cd\uff0c\u9700\u8981\u5c06\u9f20\u6807\u79fb\u52a8\u81f3\u5176\u4ed6\u4f4d\u7f6e\uff0c\u6216\u8005\u9690\u85cf\u9f20\u6807\u89e3\u51b3\u3002 6\u3001Excel \u62a5\u544a\u4e2d\uff0c\u6d4b\u8bd5\u573a\u666f\u5217\u4e0e\u7528\u4f8b\u4e2d\u7684\u4e0d\u4e00\u81f4\uff0c\u5173\u952e\u5b57scene\u3001app_name\u3001\u67b6\u6784\u522b\u540d\uff0c\u4e0d\u80fd\u5305\u542b\u4e0b\u5212\u7ebf\u548c\u82f1\u6587\u7b26\u53f7\u7684\u5706\u62ec\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/","title":"\u6846\u67b6\u529f\u80fd\u4ecb\u7ecd","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2023/1/12\n# Author : Mikigo\n# =============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_2","title":"\u4e00\u3001\u4e00\u53e5\u8bdd\u7b80\u4ecb","text":"\u6b64\u6587\u6863\u4e3b\u8981\u60f3\u5bf9 YouQu \u6846\u67b6\u4e00\u4e9b\u91cd\u70b9\u7684\u529f\u80fd\u505a\u8be6\u7ec6\u7684\u4ecb\u7ecd\uff0c\u5305\u62ec\u5bf9\u4e00\u4e9b\u529f\u80fd\u5f00\u53d1\u7684\u80cc\u666f\u3001\u8981\u89e3\u51b3\u7684\u95ee\u9898\u3001\u5b9e\u73b0\u903b\u8f91\u3001\u4ee3\u7801\u7b49\u65b9\u9762\u7684\u4ecb\u7ecd\uff0c\u4ee5\u6b64\u8ba9\u5927\u5bb6\u80fd\u66f4\u52a0\u6e05\u6670\u7684\u7406\u89e3\u5404\u9879\u529f\u80fd\uff0c\u4ece\u800c\u5728\u4f7f\u7528\u7684\u65f6\u5019\u80fd\u66f4\u52a0\u7684\u5f97\u5fc3\u5e94\u624b\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_3","title":"\u4e8c\u3001\u56fe\u50cf\u8bc6\u522b","text":"\u56fe\u50cf\u8bc6\u522b\u5728 UI \u81ea\u52a8\u5316\u4e2d\u662f\u4e0d\u53ef\u7f3a\u5c11\u7684\uff0c\u5e02\u9762\u4e0a\u751a\u81f3\u6709\u5b8c\u5168\u57fa\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\uff0c\u6bd4\u5982 Airtest\u3001Sikuli \u7b49\uff0c\u5728\u6e38\u620f\u7b49\u7279\u5b9a\u9886\u57df\u4e5f\u6709\u4e0d\u9519\u7684\u6548\u679c\uff0c\u8fd9\u4e9b\u5de5\u5177\u5b9e\u9645\u4e0a\u4e5f\u662f\u7528\u7684 OpenCV \u8fdb\u884c\u4e86\u5c01\u88c5\uff0cYouQu \u6846\u67b6\u57fa\u4e8e OpenCV \u5f00\u53d1\u4e86\u81ea\u5df1\u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\uff0c\u5b83\u53ef\u4ee5\u65b9\u4fbf\u7684\u7528\u4e8e\u754c\u9762\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u65ad\u8a00\uff1b YouQu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u51e0\u4e4e\u6ee1\u8db3\u4e86\u4f60\u7684\u6240\u6709\u8981\u6c42\uff0c\u6211\u4eec\u5728\u957f\u65f6\u95f4\u7684\u601d\u8003\u548c\u6478\u7d22\u4e2d\uff0c\u9488\u5bf9\u5e38\u89c4\u573a\u666f\u53ca\u4e00\u4e9b\u7279\u6b8a\u573a\u666f\u63a2\u7d22\u9664\u4e86\u4e00\u4e9b\u5b9e\u7528\u4e14\u6709\u6548\u7684\u65b9\u6848\uff0c\u4e14\u542c\u6211\u6162\u6162\u9053\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1","title":"1\u3001\u5e38\u89c4\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5e38\u89c4\u8bc6\u522b\u5f88\u597d\u7406\u89e3\uff0c\u4e00\u53e5\u8bdd\u8bb2\u5c31\u662f\uff0c\u8981\u83b7\u53d6\u5230\u76ee\u6807\u5143\u7d20\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u3002 \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u5728\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u9700\u8981\u83b7\u53d6\u7684\u5750\u6807\u662f\u76f8\u5bf9\u4e8e\u6574\u4e2a\u5c4f\u5e55\u7684\u5750\u6807\uff0c\u6211\u4eec\u53ef\u4ee5\u622a\u53d6\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u56fe\u7247\uff08screen\uff09\uff1b \u5728\u5143\u7d20\u8bc6\u522b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u622a\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5c0f\u56fe\u8fdb\u884c\u8bc6\u522b\uff0c\u6bd4\u5982\u622a\u53d6\u64ad\u653e\u6309\u94ae\uff1a \u90a3\u4e48\u5b9e\u9645\u4e0a\uff0c\u5143\u7d20\u5b9a\u4f4d\u7684\u95ee\u9898\u5c31\u8f6c\u6362\u4e3a\uff0c\u5c06\u622a\u56fe\u7684\u5c0f\u56fe\uff08play_btn\uff09\u62ff\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u5927\u56fe\uff08screen\uff09\u4e2d\u53bb\u505a\u5339\u914d\uff0c\u5982\u679c\u5339\u914d\u6210\u529f\uff0c\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff08 x, y \uff09\u5373\u53ef\u3002 \u4e3a\u4e86\u65b9\u4fbf\u63cf\u8ff0\uff0c\u4ee5\u4e0b\u6211\u5c06\u6574\u4e2a\u5c4f\u5e55\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5927\u56fe\uff0c\u67d0\u4e2a\u5143\u7d20\u56fe\u7247\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5c0f\u56fe\u3002 \u57fa\u4e8e OpenCV \u7684\u6a21\u677f\u5339\u914d cv.matchTemplate() \u529f\u80fd\uff0c\u6211\u4eec\u5b9e\u73b0\u4e86\u56fe\u50cf\u5b9a\u4f4d\u7684\u529f\u80fd\uff0c\u6846\u67b6\u63d0\u4f9b\u4e86\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u5e95\u5c42\u63a5\u53e3\uff08\u4e00\u822c\u4e0d\u5bf9\u4e0a\u5c42\u63d0\u4f9b\u8c03\u7528\uff09\uff1a def _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\n# \u8be6\u7ec6\u4ee3\u7801\u592a\u957f\u4e0d\u8d34\u4e86\uff0c\u611f\u5174\u8da3\u8bf7\u67e5\u770b\u6e90\u7801\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001image_path image_path \u662f\u5c0f\u56fe\u7684\u7edd\u5bf9\u8def\u5f84; \u901a\u5e38\u5728 AT \u5de5\u7a0b\u91cc\u9762\uff0c\u6211\u4eec\u7ea6\u5b9a\u5c06\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u5b9e\u9645\u7684\u5143\u7d20\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1aplay_btn.png \uff1b \u7528\u4e8e\u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 case/assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1amusic_001.png \uff1b \u8fd9\u6837\u662f\u4e3a\u4e86\u65b9\u4fbf\u7ba1\u7406\u548c\u7ef4\u62a4\u3002 2\u3001rate \u56fe\u50cf\u8bc6\u522b\u7684\u7684\u5339\u914d\u5ea6\u6216\u8005\u8bf4\u76f8\u4f3c\u5ea6\uff0c\u6846\u67b6\u9ed8\u8ba4\u7684\u914d\u7f6e\u4e3a 0.9\uff0c\u4e5f\u5c31\u662f\u8bf4\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u5b58\u5728\u4e00\u4e2a\u76f8\u4f3c\u5ea6 90% \u7684\u56fe\u6807\u5373\u8fd4\u56de\u5176\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff1b \u5982\u679c\u4f60\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u8c03\u6574\u8bc6\u522b\u5ea6\uff0c\u4f60\u53ef\u4ee5\u5728\u8c03\u7528\u51fd\u6570\u7684\u65f6\u5019\uff0c\u4f20\u5165\u4e0d\u540c\u7684\u8bc6\u522b\u5ea6\u7684\u503c\u3002 3\u3001multiple \u9ed8\u8ba4\u60c5\u51b5\u4e0b multiple=False\uff0c\u8868\u793a\u53ea\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u7b2c\u4e00\u4e2a\uff0c\u5982\u679c multiple=True \u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\uff0c\u56e0\u4e3a\u5927\u56fe\u4e2d\u53ef\u80fd\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u5c0f\u56fe\uff0c\u5728\u67d0\u4e9b\u573a\u666f\u4e0b\u4f60\u53ef\u80fd\u9700\u8981\u5168\u90e8\u83b7\u53d6\u5230\u6240\u6709\u5339\u914d\u5230\u7684\u5750\u6807\u3002 4\u3001picture_abspath \u9ed8\u8ba4\u60c5\u51b5\u4e0b picture_abspath=None \u8868\u793a\u5927\u56fe\u4e3a\u622a\u53d6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u5982\u679c\u4f60\u4e0d\u5e0c\u671b\u5927\u56fe\u662f\u5c4f\u5e55\u7684\u622a\u56fe\uff0c\u800c\u662f\u4f60\u81ea\u5b9a\u4e49\u4f20\u5165\u7684\u67d0\u4e2a\u56fe\u7247\uff0c\u4f60\u53ea\u9700\u8981\u5c06\u4f60\u7684\u56fe\u7247\u8def\u5f84\u4f20\u9012\u7ed9\u8fd9\u4e2a\u53c2\u6570\u5c31\u884c\uff0c\u6bd4\u5982\uff1a picture_abspath=\"~/Desktop/big.png\" \uff1b 5\u3001screen_bbox \u5927\u56fe\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u622a\u53d6\u6574\u4e2a\u5c4f\u5e55\uff0cscreen_bbox = [x, y, w, h] \u53ef\u4ee5\u6307\u5b9a\u622a\u53d6\u5c4f\u5e55\u4e2d\u7684\u56fa\u5b9a\u533a\u57df\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\uff0c\u53ef\u4ee5\u6392\u9664\u90e8\u5206\u533a\u57df\u5bf9\u8bc6\u522b\u7ed3\u679c\u7684\u5f71\u54cd\u3002 \u3010\u9690\u5f0f\u7b49\u5f85\u3011 \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\uff0c\u6709\u65f6\u5019\u9875\u9762\u8df3\u8f6c\u6709\u5ef6\u65f6\uff0c\u6709\u53ef\u80fd\u5b58\u5728\u8bc6\u522b\u7684\u90a3\u4e00\u523b\u9875\u9762\u4e5f\u6ca1\u6709\u8df3\u8f6c\u51fa\u6765\uff0c\u6216\u8005\u6216\u8005\u8bc6\u522b\u7684\u90a3\u4e00\u523b\uff1b \u56e0\u6b64\u6211\u4eec\u9700\u8981\u4e00\u79cd\u7b49\u5f85\u673a\u5236\uff0c\u5373\u5728\u4e00\u5b9a\u7684\u65f6\u95f4\u5185\uff0c\u5982\u679c\u8bc6\u522b\u4e0d\u5230\uff0c\u91cd\u590d\u53bb\u8bc6\u522b\uff1a def find_image(\ncls,\n*widget, rate: [float, int] = None,\nmultiple: bool = False,\nmatch_number: int = None,\npicture_abspath: str = None,\nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u5728\u5c4f\u5e55\u4e2d\u533a\u5bfb\u627e\u5c0f\u56fe\uff0c\u8fd4\u56de\u5750\u6807\uff0c\n \u5982\u679c\u627e\u4e0d\u5230\uff0c\u6839\u636e\u914d\u7f6e\u91cd\u8bd5\u6b21\u6570\uff0c\u6bcf\u6b21\u95f4\u96941\u79d2\n :param widget: \u6a21\u677f\u56fe\u7247\u8def\u5f84\n :param rate: \u76f8\u4f3c\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param match_number: \u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\n :return: \u5750\u6807\u5143\u7ec4\n \"\"\"\nif rate is None:\nrate = float(GlobalConfig.IMAGE_RATE)\ntry:\nfor element in widget:\nfor _ in range((match_number or int(GlobalConfig.IMAGE_MATCH_NUMBER)) + 1):\nlocate = cls._match_image_by_opencv(\nelement,\nrate,\nmultiple=multiple,\npicture_abspath=picture_abspath,\nscreen_bbox=screen_bbox\n)\nif not locate:\nsleep(int(GlobalConfig.IMAGE_MATCH_WAIT_TIME))\nelse:\nreturn locate\nraise TemplateElementNotFound(*widget)\nexcept Exception as e:\nraise e\n \u53c2\u6570 match_number \u7528\u4e8e\u63a7\u5236\u91cd\u590d\u8bc6\u522b\u7684\u6b21\u6570\uff0c\u9ed8\u8ba4\u4e0d\u4f20\u53c2\uff0c\u53d6\u5168\u5c40\u914d\u7f6e setting/globalconfig.ini \u91cc\u9762\u7684 IMAGE_MATCH_NUMBER \u914d\u7f6e\u9879\u7684\u503c\uff0c\u9ed8\u8ba4IMAGE_MATCH_NUMBER = 1\uff0c\u5373\u91cd\u8bd5 1 \u6b21\uff1b find_image \u662f\u6846\u67b6\u63d0\u4f9b\u7684\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u51fd\u6570\u63a5\u53e3\uff0c\u8fd9\u4e2a\u51fd\u6570\u63d0\u4f9b\u4e86\u9690\u5f0f\u7b49\u5f85\u7684\u529f\u80fd\uff0c\u4e14\u5305\u542b\u4e0a\u9762\u4ecb\u7ecd\u7684 _match_image_by_opencv \u51fd\u6570\u7684\u6240\u6709\u529f\u80fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2","title":"2\u3001\u6c14\u6ce1\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u6c14\u6ce1\u8bc6\u522b\u6307\u7684\u662f\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\u8981\u5b9a\u4f4d\u7684\u5143\u7d20\u662f\u4e00\u4e9b\u4f1a\u6d88\u5931\u7684\u5c0f\u5f39\u7a97\uff0c\u8fd9\u7c7b\u573a\u666f\u5728\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\u5c31\u53ef\u80fd\u5b58\u5728\u4e0d\u7a33\u5b9a\u6027\uff0c\u6709\u53ef\u80fd\u56fe\u50cf\u8bc6\u522b\u7684\u65f6\u5019\u6c14\u6ce1\u5df2\u7ecf\u6d88\u5931\u4e86\uff0c\u4e5f\u6709\u53ef\u80fd\u6c14\u6ce1\u51fa\u73b0\u7684\u65f6\u95f4\u592a\u77ed\u4e86\uff0c\u4e0d\u5bb9\u6613\u6355\u6349\u5230\uff0c\u5c31\u50cf\u6c14\u6ce1\u4e00\u6837\uff0c\u51fa\u73b0\u4e00\u4e0b\u5c31\u6d88\u5931\uff0c\u56e0\u6b64\u6211\u4eec\u5f62\u8c61\u7684\u79f0\u4e4b\u4e3a \u201c\u6c14\u6ce1\u8bc6\u522b\u201d\uff1b \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u4e3a\u4e86\u80fd\u7a33\u5b9a\u7684\u8bc6\u522b\u6c14\u6ce1\u7c7b\u573a\u666f\uff0c\u6211\u4eec\u91c7\u7528\u7684\u65b9\u6848\u662f\uff1a \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\uff08\u5305\u542b\u6c14\u6ce1\u4ece\u51fa\u73b0\u5230\u6d88\u5931\uff09\uff0c\u4e0d\u505c\u7684\u622a\u53d6\u8fd9\u6bb5\u65f6\u95f4\u5185\u7684\u5927\u56fe\uff0c\u4ee5\u6b64\u786e\u4fdd\u5728\u622a\u53d6\u7684\u4e00\u5806\u56fe\u7247\u4e2d\uff0c\u80af\u5b9a\u6709\u81f3\u5c11\u4e00\u5f20\u56fe\u7247\u80fd\u6355\u6349\u5230\u6c14\u6ce1\uff0c\u6700\u540e\u518d\u5bf9\u8fd9\u4e00\u5806\u56fe\u7247\u9010\u4e2a\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def get_during(\ncls,\nimage_path: str,\nscreen_time: [float, int],\nrate: float = None,\npause: [int, float] = None,\nmax_range: int = 10000\n):\n\"\"\"\n \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u622a\u56fe\u591a\u5f20\u56fe\u7247\u8fdb\u884c\u8bc6\u522b\uff0c\u5176\u4e2d\u6709\u4e00\u5f20\u56fe\u7247\u8bc6\u522b\u6210\u529f\u5373\u8fd4\u56de\u7ed3\u679c;\n \u9002\u7528\u4e8e\u6c14\u6ce1\u7c7b\u7684\u65ad\u8a00\uff0c\u6bd4\u5982\u6c14\u6ce1\u57281\u79d2\u5185\u6d88\u5931\uff0c\u5982\u679c\u7528\u5e38\u89c4\u7684\u56fe\u50cf\u8bc6\u522b\u5219\u6709\u53ef\u80fd\u65e0\u6cd5\u8bc6\u522b\u5230\uff1b\n :param image_path: \u8981\u8bc6\u522b\u7684\u6a21\u677f\u56fe\u7247\uff1b\n :param screen_time: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff1b\n :param rate: \u8bc6\u522b\u7387\uff1b\n :param pause: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u4e0d\u95f4\u9694\uff1b\n :param max_range: \u622a\u56fe\u7684\u6700\u5927\u6b21\u6570\uff0c\u8fd9\u662f\u4e00\u4e2a\u9884\u8bbe\u503c\uff0c\u4e00\u822c\u60c5\u51b5\u4e0b\u4e0d\u6d89\u53ca\u4fee\u6539\uff1b\n \"\"\"\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001screen_time \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5728\u6b64\u65f6\u95f4\u5185\u4f1a\u4e0d\u65ad\u7684\u8fdb\u884c\u622a\u56fe\u64cd\u4f5c\uff0c\u5c31\u50cf\u5f55\u5236\u89c6\u9891\u4e00\u6837\uff1b 2\u3001pause \u6bcf\u6b21\u622a\u53d6\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u4e00\u523b\u4e0d\u505c\u7684\u622a\u56fe\uff0c\u5982\u679c\u4f60\u60f3\u6bcf\u6b21\u622a\u56fe\u5b58\u5728\u4e00\u4e9b\u95f4\u9694\u65f6\u95f4\u4f20\u5165\u5bf9\u5e94\u7684\u65f6\u95f4\u95f4\u9694\u5373\u53ef\uff0c\u5355\u4f4d\u662f\u79d2\uff0c\u6bd4\u5982\uff1apause = 0.03\uff0c\u8868\u793a 30 ms\uff0c\u76f8\u5f53\u4e8e\u5e27\u7387\u4e3a 30 \u5e27\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-opencv","title":"3\u3001\u4e0d\u4f9d\u8d56 OpenCV \u7684\u56fe\u50cf\u8bc6\u522b\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31","title":"3.1\u3001\u81ea\u7814\u56fe\u50cf\u8bc6\u522b\u6280\u672f","text":"\u3010\u539f\u7406\u3011 \u4e3a\u4e86\u5b9e\u73b0\u8bc6\u522b\u56fe\u50cf\u7684\u76ee\u7684\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u5c06\u56fe\u7247\u7684\u6bcf\u4e2a\u50cf\u7d20\u7684RGB\u503c\uff0c\u4e0e\u6574\u4e2a\u5c4f\u5e55\u4e2d\u7684RGB\u8fdb\u884c\u5bf9\u6bd4\uff0c\u5982\u679c\u5c0f\u56fe\u4e0a\u7684RGB\u503c\u4e0e\u5bf9\u5e94\u5927\u56fe\u4f4d\u7f6e\u7684RGB\u90fd\u76f8\u7b49\uff0c\u5219\u5339\u914d\u6210\u529f\uff0c\u5373\u53ef\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u70b9\u3002 1\u3001\u8bfb\u53d6\u5c0f\u56fe\u548c\u5927\u56fe\u7684RGB\u503c \uff081\uff09\u5c0f\u56fe\u7684RGB\u503c small_data = small_pic.load() # load()\u4f1a\u5c06\u56fe\u7247\u7684RGB\u503c\u83b7\u53d6\u5230\uff0c\u6570\u636e\u683c\u5f0f\u4e3a\u4e00\u4e2a\u4e8c\u7ef4\u5217\u8868\uff0c\u8d4b\u503c\u7ed9\u4e00\u4e2a\u53d8\u91cfsmall_data\u3002\n \uff082\uff09\u5927\u56fe\u7684RGB\u503c big_data = big_pic.load()\n 2\u3001\u5c06\u5c0f\u56fe\u4e0e\u5927\u56fe\u7684RGB\u503c\u8fdb\u884c\u5339\u914d \uff081\uff09\u5339\u914d\u4ece\u5927\u56fe\u7684\u5750\u6807\uff080\uff0c0\uff09\u5f00\u59cb\u5339\u914d\uff0c\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff082\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\uff080\uff0c0\uff09\u5bf9\u5e94\u7684\u6240\u6709\u5c0f\u56fe\u7684RGB\u503c\u4e0d\u76f8\u7b49\uff0c\u5219\u79fb\u52a8\u5230\u4e0b\u4e00\u4e2a\u5750\u6807\u70b9\uff081\uff0c0\uff09\uff0c\u540c\u6837\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff083\uff09\u6309\u7167\u8fd9\u6837\u7684\u89c4\u5f8b\u5c06\u8fd9\u4e00\u884c\u6bcf\u79fb\u52a8\u4e00\u4e2a\u5750\u6807\u70b9\uff0c\u90fd\u5c06\u5c0f\u56fe\u6240\u6709\u7684RGB\u4e0e\u5bf9\u5e94\u5927\u56fe\u7684\u503c\u8fdb\u884c\u5339\u914d\uff1b \uff084\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\u5176\u4e2d\u4e00\u4e2a\u5750\u6807\u70b9\u4e0a\u5339\u914d\u5230\u4e86\u5c0f\u56fe\u7684\u6240\u6709RGB\u503c\uff0c\u5219\u6b64\u65f6\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\u70b9\uff1b \uff085\uff09\u5982\u679c\u5339\u914d\u4e86\u5927\u56fe\u6240\u6709\u7684\u5750\u6807\u70b9\uff0c\u90fd\u6ca1\u6709\u5339\u914d\u5230\uff0c\u5219\u8bf4\u660e\u5927\u56fe\u4e2d\u4e0d\u5b58\u5728\u5c0f\u56fe\uff0c\u5339\u914d\u5931\u8d25\uff1b \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 class ImageRgb:\n@staticmethod\ndef _check_match(_x, _y, small, bdata, sdata, rate):\n\"\"\"\n Matching degree of small graph and large graph matching\n \"\"\"\n@staticmethod\ndef _pre_random_point(small):\n\"\"\"\n Pre matching, take 10-20 points at random each time,\n and take coordinates randomly in the small graph\n \"\"\"\n@staticmethod\ndef _pre_random_match(_x, _y, point_list, bdata, sdata, rate):\n\"\"\"\n In the small graph, several points are randomly\n selected for matching, and the matching degree is\n also set for the random points\n \"\"\"\n@classmethod\ndef match_image_by_rgb(cls, image_name=None, image_path=None, rate=0.9):\n\"\"\"\n By comparing the RGB values of the small image with the large\n image on the screen, the coordinates of the small image on\n the screen are returned.\n \"\"\"\n \u901a\u8fc7 match_image_by_rgb() \u8fd9\u4e2a\u51fd\u6570\uff0c\u4f20\u5165\u76ee\u6807\u5c0f\u56fe\u7684\u6587\u4ef6\u540d\u79f0\uff0c\u5373\u53ef\u8fd4\u56de\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u3002 \u6709\u540c\u5b66\u8981\u95ee\u4e86\uff0c\u6709 OpenCV \u5e72\u561b\u4e0d\u7528\uff0c\u6709\u5fc5\u8981\u81ea\u5df1\u5b9e\u73b0\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u529f\u80fd\u5417\uff0c\u4f60\u4eec\u662f\u4e0d\u662f\u95f2\u7684\u554a\uff1f \u8fd9\u4e48\u95ee\u7684\u8bdd\uff0c\u5c0f\u4e86\uff0c\u683c\u5c40\u5c0f\u4e86\uff1b\u6211\u4eec\u81ea\u5df1\u5b9e\u73b0\u4e3b\u8981\u6709\u51e0\u65b9\u9762\u539f\u56e0\uff1a \u51cf\u5c11\u73af\u5883\u4f9d\u8d56\uff0c\u5373\u4e0d\u7528\u5b89\u88c5 OpenCV\uff0c\u6211\u4eec\u4e5f\u80fd\u5b9e\u73b0\u5176\u529f\u80fd\uff0c\u73af\u5883\u4f9d\u8d56\u8fd9\u5757\u540e\u9762\u4f1a\u5355\u72ec\u8be6\u7ec6\u8bb2\uff0c\u51cf\u5c11\u73af\u5883\u4f9d\u8d56\u5bf9\u4e8e\u4efb\u4f55\u8f6f\u4ef6\u5de5\u7a0b\u90fd\u975e\u5e38\u91cd\u8981\uff1b OpenCV \u5728\u5176\u4ed6\u56fd\u4ea7 CPU \u67b6\u6784\u4e0a\u5b89\u88c5\u5e76\u4e0d\u80fd\u4fdd\u8bc1100%\u6210\u529f\uff0c\u751a\u81f3\u6709\u6ca1\u6709\u53ef\u80fd\u5728\u4e00\u4e9b\u67b6\u6784\u4e0a\u538b\u6839\u513f\u5c31\u4e0d\u80fd\u5b89\u88c5\u4f7f\u7528 OpenCV \uff1f \u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 OpenCV \uff1f\u5c31\u50cf\u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 Windows \u5462\uff1f\u8fd9\u4e9b\u95ee\u9898\u503c\u5f97\u601d\u8003\u3002 \u5f53\u7136\uff0c\u6211\u4eec\u627f\u8ba4\u8fd9\u5957\u65b9\u6848\uff0c\u867d\u7136\u8bc6\u522b\u51c6\u786e\u7387\u6ca1\u95ee\u9898\uff0c\u4f46\u5728\u8bc6\u522b\u6548\u7387\u4e0a\u8fd8\u6ca1\u6709\u8fbe\u5230 OpenCV \u6a21\u677f\u5339\u914d\u7684\u6548\u679c\uff0c\u6211\u4eec\u7684\u65b9\u6848\u6bcf\u6b21\u8bc6\u522b\u5728 1.5s \u5de6\u53f3\uff0c\u800c OpenCV \u5728 1s \u5de6\u53f3\uff1b \u6574\u4f53\u8bc6\u522b\u6548\u679c\u6765\u8bb2\uff0c\u6211\u8ba4\u4e3a\u8fd8\u662f\u53ef\u4ee5\u63a5\u53d7\u7684\uff0c\u4e5f\u5e0c\u671b\u6709\u5fd7\u4e4b\u58eb\u80fd\u4e00\u8d77\u4f18\u5316\u6b64\u65b9\u6848\uff0c\u4e00\u8d77\u6280\u672f\u62a5\u56fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32-rpc","title":"3.2\u3001\u57fa\u4e8e RPC \u670d\u52a1\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b","text":"\u5728\u8fdc\u7a0b\u670d\u52a1\u5668\u4e0a\u90e8\u7f72 OpenCV \u7684\u73af\u5883\uff0c\u5e76\u5c06\u5176\u90e8\u7f72\u4e3a RPC \u670d\u52a1\uff0c\u6d4b\u8bd5\u673a\u4e0a\u4e0d\u7528\u5b89\u88c5 OpenCV \u4f9d\u8d56\uff0c\u800c\u662f\u901a\u8fc7\u8bf7\u6c42 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u3010\u539f\u7406\u3011 \u6d4b\u8bd5\u673a\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u56fe\u7247\u4ee5\u53ca\u6a21\u677f\u56fe\u7247\uff0c\u53d1\u9001\u7ed9 RPC \u670d\u52a1\u7aef\uff0c\u670d\u52a1\u7aef\u62ff\u5230\u4e24\u5f20\u56fe\u7247\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u6700\u540e\u5c06\u8bc6\u522b\u7ed3\u679c\u8fd4\u56de\u7ed9\u6d4b\u8bd5\u673a\uff1b \u8981\u7279\u6b8a\u8bf4\u660e\u7684\u662f\uff1a RPC \u662f\u4e00\u79cd\u534f\u8bae\uff0c\u8bb8\u591a\u8bed\u8a00\u90fd\u662f\u652f\u6301\u7684\uff0c\u6bd4\u5982\u8bf4\u670d\u52a1\u7aef\u4e5f\u53ef\u4ee5\u7528 C++ \u6765\u5b9e\u73b0\uff0c\u5ba2\u6237\u7aef\u4f7f\u7528 Python \u4e5f\u662f\u53ef\u4ee5\u8c03\u7528\u7684\u3002 \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 \u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nimport cv2 as cv\nimport numpy as np\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\nif __name__ == \"__main__\":\nserver = ThreadXMLRPCServer((\"x.x.x.x\", 8889), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(match_image_by_opencv, \"match_image_by_opencv\")\nserver.serve_forever()\n \u8fd9\u6837\uff0c\u6211\u4eec\u57fa\u4e8e Python \u6807\u51c6\u5e93 xmlrpc \u642d\u5efa\u4e86\u4e00\u4e2a RPC \u670d\u52a1\u5668\uff0c\u6ce8\u518c\u4e86 image_put \u548c match_image_by_opencv \u4e24\u4e2a\u529f\u80fd\u63a5\u53e3\uff0c\u5728\u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u901a\u8fc7 IP \u548c\u7aef\u53e3\u8fdb\u884c RPC \u8bf7\u6c42\uff1b \u5ba2\u6237\u7aef\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from xmlrpc.client import Binary\nfrom xmlrpc.client import ServerProxy\nserver = ServerProxy(GlobalConfig.OPENCV_SERVER_HOST, allow_none=True)\nscreen_rb = open(screen, \"rb\")\ntemplate_rb = open(template_path, \"rb\")\ntry:\nscreen_path = server.image_put(Binary(screen_rb.read()))\nscreen_rb.close()\ntpl_path = server.image_put(Binary(template_rb.read()))\ntemplate_rb.close()\nreturn server.match_image_by_opencv(\ntpl_path, screen_path, rate, multiple\n)\nexcept OSError as exc:\nraise EnvironmentError(\nf\"RPC\u670d\u52a1\u5668\u94fe\u63a5\u5931\u8d25. {GlobalConfig.OPENCV_SERVER_HOST}\"\n) from exc\n \u901a\u8fc7\u8fd4\u56de server.match_image_by_opencv \u5c31\u83b7\u53d6\u4e86\u5728\u670d\u52a1\u7aef\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4","title":"4\u3001\u53f3\u952e\u83dc\u5355\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41","title":"4.1\u3001\u53f3\u952e\u83dc\u5355\u5b9a\u4f4d\u7684\u65b9\u6848\u53ca\u95ee\u9898","text":"\u53f3\u952e\u83dc\u5355\u7684\u5143\u7d20\u5b9a\u4f4d\u662f\u4e00\u4e2a\u96be\u70b9\uff0c\u8fc7\u53bb\u6211\u4eec\u8c03\u7814\u548c\u4f7f\u7528\u8fc7\u7684\u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u65b9\u6cd5\u6709 4 \u79cd\uff1a \u7b2c\u4e00\u79cd\uff1a\u6b65\u957f\u64cd\u4f5c\u6cd5 \u5728\u53f3\u952e\u83dc\u5355\u547c\u51fa\u6765\u4e4b\u540e\uff0c\u901a\u8fc7\u952e\u76d8\u7684 up\u3001down \u6309\u952e\uff0c\u8fdb\u884c\u9009\u62e9\u83dc\u5355\u9009\u62e9\uff0c\u9009\u4e2d\u76ee\u6807\u4e4b\u540e enter \u5373\u53ef\uff1b\u6bd4\u5982\uff1a\u5728\u684c\u9762\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\uff0c\u6309 1 \u6b21 down \uff0c\u4f1a\u51fa\u73b0\u4e0b\u56fe\uff1a \u7ee7\u7eed\u518d\u6309 2 \u6b21 down\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u518d\u6309 enter\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u5982\u6b64\uff0c\u201c\u6392\u5e8f\u65b9\u5f0f\u201d\u7684\u6b65\u957f\u4e3a 3\uff1b\u901a\u8fc7\u4f7f\u7528\u952e\u76d8\u4e0a\u4e0b\u952e\uff0c\u5c31\u5b9e\u73b0\u4e86\u5bf9\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\uff1b \u4f46\u662f\uff0c\u8fd9\u79cd\u65b9\u5f0f\u6709\u4e2a\u5f88\u70e6\u4eba\u7684\u95ee\u9898\uff0c\u5c31\u662f\u53f3\u952e\u83dc\u5355\u7684\u9009\u9879\u4f4d\u7f6e\u4e0d\u53ef\u80fd\u4e00\u76f4\u4e0d\u53d8\uff0c\u5728\u9700\u6c42\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\uff0c\u83dc\u5355\u9009\u9879\u7684\u53d8\u5316\u662f\u5f88\u5927\u7684\uff0c\u751a\u81f3\u6709\u4e9b\u5e94\u7528\u652f\u6301\u81ea\u5b9a\u4e49\u83dc\u5355\uff0c\u6bd4\u5982\u6587\u7ba1\u53f3\u952e\u83dc\u5355\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff1b \u4e5f\u5c31\u662f\u8bf4\u4f60\u5f97\u7ecf\u5e38\u53bb\u7ef4\u62a4\u83dc\u5355\u9009\u9879\u7684\u6b65\u957f\uff0c\u4e00\u4e2a\u9009\u9879\u73b0\u5728\u7684\u6b65\u957f\u662f 3\uff0c\u4e0b\u4e2a\u8fed\u4ee3\u53ef\u80fd\u5c31\u662f 4 \u6216\u8005 5\u3002 \u7b2c\u4e8c\u79cd\uff1a\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u6cd5 \u628a\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5355\u72ec\u622a\u56fe\u4fdd\u5b58\uff0c\u56fe\u7247\u4e2d\u4ec5\u5305\u542b\u4e00\u4e2a\u83dc\u5355\u9009\u9879\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u8fd9\u6837\uff0c\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5c31\u53ef\u4ee5\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u65b9\u5f0f\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u8fd9\u79cd\u65b9\u5f0f\u4e0d\u7528\u62c5\u5fc3\u83dc\u5355\u9009\u9879\u7684\u987a\u5e8f\u6216\u4f4d\u7f6e\uff0c\u4f46\u662f\u9700\u8981\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff0c\u4e14\u5bb9\u6613\u53d7\u5230\u5b57\u4f53 UI \u53d8\u66f4\u7c7b\u9700\u6c42\u7684\u5f71\u54cd\uff0c\u6bd4\u5982\uff1a\u5b57\u4f53\u5927\u5c0f\u3001\u5b57\u4f53\u95f4\u8ddd\u7b49\u7b49\u9700\u6c42\u53d8\u66f4\u90fd\u4f1a\u5f71\u54cd\uff0c\u6bcf\u6b21\u53d8\u66f4\u4e4b\u540e\u5c31\u9700\u8981\u8fdb\u884c\u5927\u91cf\u56fe\u7247\u8d44\u6e90\u7684\u91cd\u65b0\u622a\u56fe\u66ff\u6362\uff0c\u662f\u4e2a\u6bd4\u8f83\u9ebb\u70e6\u7684\u4e8b\u60c5\uff1b \u7b2c\u4e09\u79cd\uff1a\u76f8\u5bf9\u4f4d\u79fb\u6cd5 \u9f20\u6807\u70b9\u51fb\u53f3\u952e\u7684\u65f6\u5019\uff0c\u9f20\u6807\u7684\u5f53\u524d\u5750\u6807\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u7684\uff0c\u83dc\u5355\u9009\u9879\u7684\u5bbd\uff08 w \uff09\u4e00\u822c\u662f\u56fa\u5b9a\u7684\uff0c\u53d8\u5316\u7684\u662f\u83dc\u5355\u7684\u957f\u5ea6\uff08 h \uff09\uff0c\u53ef\u4ee5\u901a\u8fc7\u67d0\u4e2a\u9009\u9879\u76f8\u5bf9\u4e8e\u9f20\u6807\u7684\u8ddd\u79bb\u5728\u786e\u5b9a\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u901a\u8fc7\u7ef4\u62a4\u83dc\u5355\u9009\u9879\uff08\u76f8\u5bf9\u4f4d\u7f6e\uff09\u76f8\u5bf9\u4e8e\u9f20\u6807\u4f4d\u7f6e\u7684\u8ddd\u79bb\uff0c\u5373\u53ef\u8f7b\u677e\u8ba1\u7b97\u51fa\u83dc\u5355\u9009\u9879\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\u3002 \u4ece\u7406\u8bba\u4e0a\u6b64\u65b9\u6848\u662f\u53ef\u884c\u7684\uff0c\u4f46\u662f\u8fd9\u91cc\u4ecd\u7136\u5b58\u5728\u4e24\u4e2a\u4e25\u91cd\u7684\u95ee\u9898\uff1a \u83dc\u5355\u987a\u5e8f\u6539\u53d8\uff0c\u5bfc\u81f4\u76f8\u5bf9\u8ddd\u79bb\u6539\u53d8\uff0c\u800c\u4e14\u8ddd\u79bb\u662f\u901a\u8fc7\u50cf\u7d20\uff08px\uff09\u6765\u8868\u793a\u7684\uff0c\u4e0d\u60f3\u6b65\u957f\u90a3\u4e48\u53ea\u7ba1\uff0c\u6bcf\u6b21\u9700\u8981\u53bb\u91cf\u4e00\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u70b9\u9ebb\u70e6\uff1b \u9f20\u6807\u5728\u684c\u9762\u4e0d\u540c\u4f4d\u7f6e\u70b9\u51fb\u53f3\u952e\uff0c\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u4f4d\u7f6e\u662f\u4e0d\u540c\u7684\uff0c\u4e0a\u56fe\u7684\u83dc\u5355\u662f\u5728\u9f20\u6807\u7684\u5de6\u4e0b\u65b9\uff0c\u5982\u679c\u4f60\u79fb\u52a8\u9f20\u6807\u5230\u5c4f\u5e55\u56db\u8fb9\uff0c\u4f60\u4f1a\u53d1\u73b0\uff0c\u53f3\u952e\u83dc\u5355\u53ef\u80fd\u51fa\u73b0\u5728\u9f20\u6807\u7684\u56db\u4e2a\u65b9\u5411\uff0c\u4e5f\u5c31\u662f\u8bf4\u4f60\u9700\u8981\u6839\u636e\u9f20\u6807\u7684\u4e0d\u540c\u4f4d\u7f6e\u6765\u5224\u65ad\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u65b9\u5411\uff0c\u800c\u4e0d\u540c\u7684\u65b9\u5411\u4e0a\u8ba1\u7b97\u65b9\u6cd5\u662f\u4e0d\u540c\u7684\uff0c\u6bd4\u5982\uff1a\u53f3\u952e\u83dc\u5355\u5728\u9f20\u6807\u7684\u5de6\u4e0a\uff0c\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\u8ba1\u7b97\u65b9\u6cd5\u4e3a\uff08x - w / 2\uff0c y - h\uff09\uff0c\u8fd9\u6837\u7ef4\u62a4\u8d77\u6765\u53ef\u4ee5\u8bf4\u975e\u5e38\u590d\u6742\uff1b \u57fa\u4e8e\u4ee5\u4e0a\u4e24\u4e2a\u539f\u56e0\uff0c\u6211\u4eec\u5e76\u4e0d\u63a8\u8350\u8fd9\u79cd\u64cd\u4f5c\u65b9\u6848\u3002 \u7b2c\u56db\u79cd\uff1a\u5c5e\u6027\u5b9a\u4f4d \u6709\u540c\u5b66\u8bf4\u5e72\u561b\u4e0d\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u5462\uff0c\u5176\u5b9e\uff0c\u6211\u4eec\u6700\u5f00\u59cb\u60f3\u5230\u7684\u65b9\u6848\u5c31\u662f\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\uff0c\u4f46\u662f\u5728\u5c5e\u6027\u7684 DOM \u6811\u91cc\u600e\u4e48\u4e5f\u627e\u4e0d\u5230\uff0c\u65e0\u6cd5\u5b9a\u4f4d\u5230\uff0c\u6211\u4eec\u4e5f\u8054\u5408\u7814\u53d1\u540c\u5b66\u4e00\u8d77\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u4f46\u6700\u7ec8\u8fd8\u662f\u6ca1\u80fd\u89e3\u51b3\uff0c\u975e\u5e38\u9057\u61be\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42","title":"4.2\u3001\u6700\u65b0\u7684\u53f3\u952e\u83dc\u5355\u7ec8\u6781\u89e3\u51b3\u65b9\u6848","text":"\u7531\u4e8e\u53f3\u952e\u83dc\u5355\u9009\u9879\u51e0\u4e4e\u90fd\u662f\u6587\u672c\uff0c\u90a3\u4e48\u901a\u8fc7 OCR \u8bc6\u522b\uff0c\u51e0\u4e4e\u662f\u6700\u4f18\u7684\u65b9\u6848\uff1a \u4e0d\u7528\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff1b \u4e0d\u4f1a\u53d7\u5230\u83dc\u5355\u9009\u9879\u987a\u5e8f\u6539\u53d8\u7684\u5f71\u54cd\uff1b \u4e0d\u4f1a\u53d7\u5230\u5b57\u4f53 UI \u53d8\u5316\u7684\u5f71\u54cd\uff1b \u5173\u4e8e OCR \u8bc6\u522b\u6211\u4eec\u5728\u540e\u9762\u4f1a\u8be6\u7ec6\u8bb2\u5230\uff0c\u672c\u7ae0\u8282\u4e3b\u8981\u8bb2\u57fa\u4e8e OCR \u8bc6\u522b\uff0c\u6211\u4eec\u5728\u53f3\u952e\u83dc\u5355\u8bc6\u522b\u4e0a\u7684\u7a81\u7834\u548c\u521b\u65b0\uff1b \u4f7f\u7528 OCR \u8bc6\u522b\u53f3\u952e\u83dc\u5355\u867d\u7136\u5df2\u7ecf\u5f88\u5b8c\u7f8e\u4e86\uff0c\u4f46\u662f\u5728\u4e00\u4e9b\u60c5\u51b5\u4e0b\u4ecd\u7136\u5b58\u5728\u4e00\u70b9\u95ee\u9898\uff0c\u5c31\u662f\u5c4f\u5e55\u4e2d\u51fa\u73b0\u591a\u4e2a\u548c\u83dc\u5355\u9009\u9879\u6587\u5b57\u76f8\u540c\u7684\u6587\u5b57\u65f6\uff0c\u6bd4\u5982\u4e0b\u9762\u8fd9\u79cd\u60c5\u51b5\uff1a \u5c4f\u5e55\u6070\u597d\u51fa\u73b0\u4e86\u4e24\u4e2a\u201c\u590d\u5236\u201d\uff0c\u6b64\u65f6\u8981\u5b9a\u4f4d\u5230\u83dc\u5355\u4e2d\u7684 \u201c\u590d\u5236\u201d\uff0c\u5c31\u9700\u8981\u8fdb\u4e00\u6b65\u505a\u6570\u636e\u5904\u7406\uff0c\u6bd4\u5982\uff1aOCR \u8fd4\u56de 2 \u4e2a\u201c\u590d\u5236\u201d\u7684\u5750\u6807\uff0c\u7528\u4f8b\u91cc\u9762\u6765\u5224\u65ad\u7528\u54ea\u4e2a\uff0c\u4ece\u4e1a\u52a1\u4e0a\u5c06\u5904\u7406\u8d77\u6765\u6bd4\u8f83\u9ebb\u70e6\uff0c\u56e0\u4e3a\u4f60\u5f97\u660e\u786e\u77e5\u9053\u83dc\u5355\u5728\u5de6\u8fb9\u8fd8\u662f\u53f3\u8fb9\uff0c\u7136\u540e\u8fd9\u672c\u8eab\u5c31\u662f\u4e0d\u786e\u5b9a\u7684\uff1b \u600e\u4e48\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u5462\uff0c\u8fd9\u5c31\u8981\u8bf4\u9053\u672c\u7ae0\u7684\u4e3b\u9898\uff1a\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b\u3002 \u3010\u539f\u7406\u3011 \u5728\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u524d\u622a\u4e00\u5f20\u56fe\uff0c\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\u518d\u622a\u53d6\u4e00\u5f20\u56fe\uff0c\u4e24\u5f20\u56fe\u552f\u4e00\u53d8\u5316\u7684\u5c31\u662f\u53f3\u952e\u83dc\u5355\uff0c\u5c06\u5176\u4ed6\u76f8\u540c\u7684\u5730\u65b9\u90fd\u5c4f\u853d\u6389\uff0c\u53ea\u7559\u4e0b\u83dc\u5355\u754c\u9762\uff0c\u5982\u6b64\u5373\u53ef\u6d88\u9664\u5e72\u6270\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u5c06\u4e24\u79cd\u56fe\u505a\u524d\u540e\u5bf9\u6bd4\u63d0\u53d6\u53ef\u4ee5\u5f97\u5230\u8fd9\u6837\u7684\u56fe\uff1a \u4f60\u770b\uff0c\u901a\u8fc7\u524d\u540e\u56fe\u7247\u7684\u5bf9\u6bd4\uff0c\u5c06\u76f8\u540c\u7684\u90e8\u5206\u7ed9\u6d88\u9664\u6389\uff0c\u518d\u8fdb\u884c OCR \u8bc6\u522b\uff0c\u8fd9\u6837\u5c31\u4e0d\u4f1a\u6709\u5e72\u6270\u4e86\uff1b \u4ee3\u7801\u5b9e\u73b0\u8bf7\u67e5\u770b src/filter_image.py \uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def filter_image(action):\n\"\"\"\n \u5bf9\u6bd4\u52a8\u4f5c\u524d\u540e\u4e24\u5f20\u56fe\u7247\uff0c\u63d0\u53d6\u4e0d\u540c\u7684\u90e8\u5206\u751f\u6210\u4e00\u5f20\u65b0\u7684\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u65b0\u56fe\u7247\u7684\u8def\u5f84\n :param action: \u52a8\u4f5c\u51fd\u6570\u7684\u51fd\u6570\u5bf9\u8c61\n :return: \u65b0\u56fe\u7247\u7684\u8def\u5f84\n \"\"\"\n action \u662f\u9f20\u6807\u4e8b\u4ef6\uff0c\u56e0\u4e3a\u6b64\u7c7b\u573a\u666f\u4e0d\u4ec5\u4ec5\u5728\u53f3\u952e\u5b58\u5728\uff0c\u5355\u51fb\u3001\u53cc\u51fb\u7b49\u7b49\uff0c\u53ea\u8981\u64cd\u4f5c\u524d\u540e\u540e\u53d8\u5316\u7684\u90fd\u53ef\u4ee5\uff1a from src.mouse_key import MouseKey\naction = (\nMouseKey.click,\nMouseKey.right_click,\nMouseKey.double_click,\nMouseKey.move_to,\n)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5","title":"5\u3001\u52a8\u6001\u56fe\u50cf\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5728\u684c\u9762\u58c1\u7eb8\u5207\u6362\uff0c\u6216\u770b\u56fe\u3001\u76f8\u518c\u5207\u6362\u56fe\u7247\u7c7b\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u7531\u4e8e\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u662f\u4e0d\u56fa\u5b9a\u7684\uff08\u4e0d\u540c\u7248\u672c\u7684\u7cfb\u7edf\u58c1\u7eb8\u4e0d\u540c\u3001\u58c1\u7eb8\u987a\u5e8f\u4e0d\u540c\uff0c\u770b\u56fe\u76f8\u518c\u5728\u56fe\u7247\u8d44\u6e90\u4e0d\u4e00\u5b9a\u56fa\u5b9a\uff09\uff0c\u90a3\u4e48\u5728\u6d4b\u8bd5\u5207\u6362\u58c1\u7eb8\u6216\u8005\u5207\u6362\u56fe\u7247\u7684\u573a\u666f\u65f6\u5c31\u4f1a\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u4f60\u4e0d\u77e5\u9053\u9884\u671f\u662f\u5565\uff0c\u7528\u4f8b\u64cd\u4f5c\u52a8\u6001\u7684\uff0c\u4e5f\u662f\u6781\u4e0d\u7a33\u5b9a\u3002 \u3010\u539f\u7406\u3011 \u5728\u5207\u6362\u56fe\u7247\u4e4b\u524d\u622a\u56fe\u4fdd\u5b58\u5e76\u8fd4\u56de\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u6b21\u8bc6\u522b\u8fd9\u5f20\u56fe\u7247\uff0c\u5982\u679c\u4e0d\u5b58\u5728\uff0c\u8bf4\u660e\u56fe\u7247\u5df2\u7ecf\u5207\u6362\u4e86\uff1b \u793a\u610f\u56fe\uff1a \u8fd9\u6837\uff0c\u6211\u4eec\u622a\u53d6\u4e86\u5f53\u524d\u56fe\u7247\u4e2d\u6bd4\u8f83\u6709\u4ee3\u8868\u6027\u7684\u4f4d\u7f6e\uff08\u4e00\u53ea\u9e1f\uff09\uff0c\u5728\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u7528\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1a \u6211\u4eec\u518d\u62ff\u7740\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd9\u6837\u5728\u5f53\u524d\u56fe\u7247\u4e2d\uff0c\u5c31\u4e0d\u80fd\u627e\u5230\u8fd9\u53ea\u9e1f\u4e86\uff0c\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u662f False\uff0c\u90a3\u4e48\u4e5f\u5c31\u53ef\u4ee5\u5224\u65ad\u56fe\u7247\u5207\u6362\u662f\u6210\u529f\u7684\u3002 \u4ee3\u7801\u793a\u610f\uff1a def save_temporary_picture(_x: int, _y: int, width: int, height: int):\n\"\"\"\n \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u56fe\u7247\u8def\u5f84\n :param x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n :param y: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n :param width: \u5bbd\u5ea6\n :param height: \u9ad8\u5ea6\n :return: \u56fe\u7247\u8def\u5f84\n \"\"\"\n \u6b64\u51fd\u6570\u7528\u4e8e\u5728\u64cd\u4f5c\u4e4b\u524d\u622a\u56fe\u4e00\u5f20\u4e34\u65f6\u56fe\u7247\uff0c\u8fd4\u56de\u56fe\u7247\u8def\u5f84\uff0c\u6700\u540e\u5728\u65ad\u8a00\u7684\u65f6\u5019\u518d\u5c06\u56fe\u7247\u8def\u5f84\u4f5c\u4e3a\u53c2\u6570\u4f20\u5165\u65ad\u8a00\u8bed\u53e5\u5373\u53ef\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ui","title":"\u4e09\u3001\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_1","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u662f\u6211\u4eec\u81ea\u7814\u7684\u4e00\u79cd\u4f7f\u7528\u7b80\u5355\uff0c\u4e14\u6548\u7387\u6781\u9ad8\u3001\u7a33\u5b9a\u6027\u597d\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u57fa\u4e8e\u5143\u7d20\u6309\u94ae\u5728\u5e94\u7528\u4e2d\u7684\u76f8\u5bf9\u4f4d\u7f6e\uff0c\u52a8\u6001\u83b7\u53d6\u5143\u7d20\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff0c\u9002\u7528\u4e8e\u5404\u79cd\u5c4f\u5e55\u5206\u8fa8\u7387\uff08\u5305\u62ec\u9ad8\u5206\u5c4f\u3001\u5bbd\u5c4f\u3001\u5e26\u9c7c\u5c4f\uff09\uff0c\u5f53\u5143\u7d20\u6309\u94ae\u4f4d\u7f6e\u76f8\u5bf9\u4e8e\u5e94\u7528\u754c\u9762\u4f4d\u7f6e\u53d1\u751f\u4fee\u6539\u4e4b\u540e\uff0c\u53ea\u9700\u8981\u6839\u636e UI \u8bbe\u8ba1\u56fe\u4e0a\u7684\u6e90\u6570\u636e\u4fee\u6539\u5bf9\u5e94\u5750\u6807\u6570\u636e\u5c31\u597d\uff0c\u7ef4\u62a4\u975e\u5e38\u7684\u65b9\u4fbf\u3002 \u6b64\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u9002\u7528\u4e8e\u4e00\u4e9b\u5143\u7d20\u4f4d\u7f6e\u76f8\u5bf9\u4e0e\u5e94\u7528\u754c\u9762\u6bd4\u8f83\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u97f3\u4e50\uff0899% \u7684\u5143\u7d20\u5b9a\u4f4d\u91c7\u7528\u8fd9\u79cd\uff0c\u6548\u679c\u975e\u5e38\u597d\uff09\uff0c\u4e0d\u9002\u7528\u4e8e\u754c\u9762\u4e0d\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u622a\u56fe\u5f55\u5c4f\uff0c\u5f88\u660e\u663e\u4e0d\u9002\u7528\u4e8e\u8fd9\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u3002\u8fd9\u79cd\u5168\u65b0\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u6709\u5b83\u7684\u9002\u7528\u6761\u4ef6\uff0c\u5982\u679c\u4f60\u53d1\u73b0\u4f7f\u7528\u5e38\u89c4\u7684\uff08\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u5b9a\u4f4d\uff09\u4e0d\u597d\u505a\u65f6\uff0c\u4e0d\u59a8\u8003\u8651\u4f7f\u7528\u8fd9\u79cd\uff0c\u5176\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff0c\u5e76\u4e14\u8fc5\u901f\u7231\u4e0a\u4ed6\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_1","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5728 UI \u8bbe\u8ba1\u56fe\u4e2d\u6211\u4eec\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u8fb9\u6846\u7684\u8ddd\u79bb\u7684\uff0c\u7136\u540e\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u6280\u672f\u624b\u6bb5\u83b7\u53d6\u5230\u5e94\u7528\u754c\u9762\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u53ca\u5e94\u7528\u7a97\u53e3\u7684\u5927\u5c0f\uff0c\u793a\u610f\u56fe\u5982\u4e0b\uff1a \uff08x1, y1\uff09\u4e3a\u5e94\u7528\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\uff1b\uff08x2, y2\uff09\u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u5de6\u4e0a\u89d2\uff08x1, y1\uff09\u7684\u5750\u6807\uff0c\u90a3\u4e48\u5b9e\u9645\u4e0a\u3010\u64ad\u653e\u6240\u6709\u3011\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\u4e3a\uff1a\uff08 x1 + x2, y1 + y2 \uff09\uff1b \u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5927\u5c0f\uff08w2, h2\uff09\uff0c\u53ef\u4ee5\u4ece UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\uff1b \u5728 UI \u8bbe\u8ba1\u7a3f\u4e0a\u70b9\u51fb\u3010\u64ad\u653e\u6240\u6709\u3011\u56fe\u6807\uff0c\u7136\u540e\u79fb\u52a8\u9f20\u6807\u5c31\u5c31\u53ef\u4ee5\u770b\u5230\u4e0a\u56fe\u7684\u53c2\u8003\u7ebf\u53ca\u6570\u636e\uff1b \u6240\u4ee5\uff0c\u6211\u4eec\u53ef\u4ee5\u8f7b\u677e\u7684\u83b7\u53d6\u5230\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u4e2d\u5fc3\u5750\u6807\u4e3a\uff1a\uff08 x1 + x2 + (w2 / 2), y1 + y2 + ( h2 / 2) \uff09 \u8be6\u7ec6\u6e90\u4ee3\u7801\u8bf7\u67e5\u770b AT \u57fa\u7840\u6846\u67b6: src/button_center.py \u83b7\u53d6\u5e94\u7528\u7a97\u53e3\u7684\u4fe1\u606f \u4f7f\u7528 xdotool \u548c xwininfo \u83b7\u53d6\u5230\u5e94\u7528\u7a97\u53e3\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u5de6\u4e0a\u89d2\uff09\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a app_id = CmdCtl.run_cmd(f\"xdotool search --classname --onlyvisible {self.app_name}\"\n).split(\"\\n\")\napp_id_list = [int(_id) for _id in app_id if _id]\nreturn CmdCtl.run_cmd(f\"xwininfo -id {app_id_list[self.number]}\")\n \u4f7f\u7528\u6b63\u5219\u83b7\u53d6\u7a97\u53e3\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u83b7\u53d6\u914d\u7f6e \u8bfb ini \u914d\u7f6e\u6587\u4ef6\uff0c\u83b7\u53d6\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e0e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a conf = ConfigParser()\nconf.read(self.config_path)\ndirection = conf.get(btn_name, \"direction\")\nposition = [int(i.strip()) for i in conf.get(btn_name, \"location\").split(\",\")]\n \u8ba1\u7b97\u5143\u7d20\u6309\u94ae\u5750\u6807 \u6839\u636e\u5e94\u7528\u7a97\u53e3\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u5927\u5c0f\u3001\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u5927\u5c0f\uff0c\u4f7f\u7528\u4e00\u5b9a\u7684\u7b97\u6cd5\u5373\u53ef\u8ba1\u7b97\u51fa\u5143\u7d20\u6309\u94ae\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u4e2d\u5fc3\u5750\u6807\uff09\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3","title":"3\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u3010\u914d\u7f6e\u65b9\u6cd5\u3011 \u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u7684\u6570\u636e\u6e90\u662f\u5e94\u7528\u5e93\u4e2d\u7684 ui.ini \u914d\u7f6e\u6587\u4ef6\uff1a ;section\n[\u65b0\u5efa\u6b4c\u5355+] ;key = value\ndirection = left_top\nlocation = 180, 268, 21, 21\n section \u662f\u4f60\u6839\u636e\u5bf9\u5e94\u7684\u5143\u7d20\u6309\u94ae\u547d\u540d\uff0c\u4f60\u53ef\u4ee5\u4efb\u610f\u547d\u540d\uff0c\u4f46\u6700\u597d\u6709\u5177\u4f53\u542b\u4e49\uff0c\u4e14\u80fd\u660e\u786e\u8868\u793a\u8fd9\u4e2a\u5143\u7d20\u6309\u94ae\u7684\u540d\u79f0\uff1b\u7528\u4e2d\u62ec\u53f7\u62ec\u8d77\u6765\u5c31\u884c\uff0c\u6bd4\u5982\uff1a[\u65b0\u5efa\u6b4c\u5355+] \uff1b direction \u662f\u914d\u7f6e\u8be5\u5143\u7d20\u7684\u53c2\u8003\u7cfb\uff0c\u5206\u522b\u4e3a\uff1a left_top \u5de6\u4e0a\uff1b left_bottom \u5de6\u4e0b\uff1b right_top \u53f3\u4e0a\uff1b right_bottom \u53f3\u4e0b\uff1b \u53c2\u8003\u7cfb\u7684\u9009\u53d6\u6807\u51c6\uff1a\u62c9\u52a8\u6539\u53d8\u7a97\u53e3\u5927\u5c0f\u65f6\uff0c\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u53c2\u8003\u7cfb\u4f4d\u7f6e\u662f\u4e0d\u53d8\u7684\uff1b location \u662f\u8be5\u5143\u7d20\u6309\u94ae\u7684\u76f8\u5bf9\u4e0e\u53c2\u8003\u7cfb\u7684 x, y \u7684\u8ddd\u79bb\uff0c\u53ca\u5927\u5c0f(w, h)\uff0c\u8fd9\u56db\u4e2a\u6570\u636e\u53ef\u4ee5\u901a\u8fc7 UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\u6570\u636e\uff0c\u5728\u7f16\u8f91\u6a21\u5f0f\u4e0b\uff0c\u70b9\u51fb UI \u56fe\u4e0a\u7684\u6309\u94ae\uff0c\u53f3\u4fa7\u5c31\u4f1a\u51fa\u73b0\u8be5\u5143\u7d20\u6309\u94ae\u7684 x, y, w, h \u6570\u636e\u3002 \u5982\u679c UI \u56fe\u4e0a\u6ca1\u6709\u63d0\u4f9b\u4f60\u60f3\u8981\u7684\u5143\u7d20\u6570\u636e\uff0c\u4f60\u53ef\u4ee5\u76f4\u63a5\u5728\u7cfb\u7edf\u4e2d\u4f7f\u7528\u622a\u56fe\u5f55\u5c4f\u8fdb\u884c\u5c3a\u91cf\uff0c\u8fd9\u662f\u4e00\u79cd\u4e0d\u63a8\u8350\u4f46\u80fd\u7528\u7684\u65b9\u6cd5\u3002 \u3010\u8c03\u7528\u65b9\u6cd5\u3011 \u5728\u5e94\u7528\u5e93\u65b9\u6cd5\u5c42\u8fd9\u6837\u5199\uff1a def click_add_music_list_btn_in_music_by_ui(self):\n\"\"\"\u70b9\u51fb\u65b0\u5efa\u6b4c\u5355\u6309\u94ae\"\"\"\nself.click(*self.ui.btn_center(\"\u65b0\u5efa\u6b4c\u5355+\"))\n self.ui.btn_center() \u662f\u56fa\u5b9a\u5199\u6cd5\uff0c\u53c2\u6570\u5c31\u662f\u914d\u7f6e\u91cc\u9762\u7684 section \u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ocr","title":"\u56db\u3001OCR \u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_2","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 OCR \u65b9\u6848\u5927\u591a\u91c7\u7528\u8c37\u6b4c OCR\uff08Tesseract\uff09\u65b9\u6848\uff0c\u4f46\u662f\u5b83\u5bf9\u4e8e\u4e2d\u6587\u7684\u8bc6\u522b\u975e\u5e38\u5dee\uff0c\u7ecf\u8fc7\u5927\u91cf\u7684\u8c03\u7814\uff0c\u6211\u4eec\u4f7f\u7528 PaddleOCR\uff0c\u5b83\u662f\u4e00\u4e2a\u5f00\u6e90\u7684\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u8bc6\u522b\u5de5\u5177\uff0c\u4e5f\u662f PaddlePaddle \u6700\u6709\u540d\u7684\u4e00\u4e2a\u5f00\u6e90\u9879\u76ee\uff0c\u611f\u5174\u8da3\u7684\u53ef\u4ee5\u70b9\u8fd9\u91cc\u4e86\u89e3\uff0c\u591a\u7684\u4e0d\u8bf4\u4e86\uff0c\u4f60\u53ea\u9700\u8981\u77e5\u9053\u5b83\u5c31\u662f\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_2","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5b89\u88c5\u4ed6\u662f\u4e2a\u5f88\u9ebb\u70e6\u7684\u4e8b\u60c5\uff0c\u867d\u7136\u64cd\u4f5c\u5f88\u7b80\u5355\uff0c\u4f46\u5176\u5b9e\u5b89\u88c5\u5305\u6709\u70b9\u5927\uff0c\u56e0\u6b64\u6211\u4eec\u4e0d\u5e0c\u671b\u76f4\u63a5\u5728 env.sh \u4e2d\u52a0\u5165\u5b83\uff0c\u8fd9\u4f1a\u8ba9\u6574\u4e2a\u81ea\u52a8\u5316\u73af\u5883\u53d8\u5f97\u975e\u5e38\u81c3\u80bf\uff1b \u56e0\u6b64\uff0c\u6211\u4eec\u60f3\u5230\u5c06\u5b83\u505a\u6210\u4e00\u4e2a RPC \u670d\u52a1\u5728\u5176\u4ed6\u673a\u5668\u4e0a\u90e8\u7f72\uff0c\u6d4b\u8bd5\u673a\u901a\u8fc7\u8fdc\u7a0b\u8c03\u7528 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u4f7f\u7528\u5b83\uff1b RPC \u7684\u8c03\u7528\u903b\u8f91\uff1a \u8fd9\u6837\u6211\u4eec\u53ea\u9700\u8981\u5728\u670d\u52a1\u7aef\u90e8\u7f72\u597d OCR \u8bc6\u522b\u7684\u670d\u52a1\uff0c\u7136\u540e\u901a\u8fc7 RPC \u670d\u52a1\u5c06\u529f\u80fd\u63d0\u4f9b\u51fa\u6765\uff0c\u6846\u67b6\u91cc\u9762\u53ea\u9700\u8981\u8c03\u7528\u5bf9\u5e94\u7684 RPC \u63a5\u53e3\u5c31\u884c\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_1","title":"3\u3001\u4f7f\u7528\u8bf4\u660e","text":"\u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nfrom paddleocr import PaddleOCR\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef paddle_ocr(pic_path, lang):\n\"\"\"\n Paddleocr\u76ee\u524d\u652f\u6301\u7684\u591a\u8bed\u8a00\u8bed\u79cd\u53ef\u4ee5\u901a\u8fc7\u4fee\u6539lang\u53c2\u6570\u8fdb\u884c\u5207\u6362\n \u4f8b\u5982`ch`, `en`, `fr`, `german`, `korean`, `japan`\n :param file_name:\n :param lang:\n :return:\n \"\"\"\nif __name__ == \"__main__\":\nIP = popen(\"hostname -I\").read().split(\" \")[0]\nPORT = 8890\nSCREEN_CACHE = \"/tmp/screen.png\"\nserver = ThreadXMLRPCServer((IP, PORT), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(paddle_ocr, \"paddle_ocr\")\nprint(\"\u76d1\u542c\u5ba2\u6237\u7aef\u8bf7\u6c42\u3002\u3002\")\nserver.serve_forever()\n \u6846\u67b6\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from src import OCR\nOCR.ocr(*target_strings, picture_abspath=None, similarity=0.6, return_default=False, return_first=False, lang=\"ch\"):\n# \u901a\u8fc7 OCR \u8fdb\u884c\u8bc6\u522b\u3002\n# target_strings:\n# \u76ee\u6807\u5b57\u7b26,\u8bc6\u522b\u4e00\u4e2a\u5b57\u7b26\u4e32\u6216\u591a\u4e2a\u5b57\u7b26\u4e32,\u5e76\u8fd4\u56de\u5176\u5728\u56fe\u7247\u4e2d\u7684\u5750\u6807;\n# \u5982\u679c\u4e0d\u4f20\u53c2\uff0c\u8fd4\u56de\u56fe\u7247\u4e2d\u8bc6\u522b\u5230\u7684\u6240\u6709\u5b57\u7b26\u4e32\u3002\n# picture_abspath: \u8981\u8bc6\u522b\u7684\u56fe\u7247\u8def\u5f84\uff0c\u5982\u679c\u4e0d\u4f20\u9ed8\u8ba4\u622a\u53d6\u5168\u5c4f\u8bc6\u522b\u3002\n# similarity: \u5339\u914d\u5ea6\u3002\n# return_default: \u8fd4\u56de\u8bc6\u522b\u7684\u539f\u751f\u6570\u636e\u3002\n# return_first: \u53ea\u8fd4\u56de\u7b2c\u4e00\u4e2a,\u9ed8\u8ba4\u4e3a False,\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u6240\u6709\u6570\u636e\u3002\n# lang: `ch`, `en`, `fr`, `german`, `korean`, `japan`\n \u6b64\u65b9\u6848\u5728\u6846\u67b6\u5185\u6ca1\u6709\u5f15\u5165\u4efb\u4f55\u4e09\u65b9\u4f9d\u8d56\u5b8c\u5168\u91c7\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\uff0c\u800c\u4e14\u4f7f\u7528\u65b9\u6cd5\u975e\u5e38\u7b80\u5355\uff0c\u53ea\u9700\u8981\u901a\u8fc7 OCR.ocr() \u5373\u53ef\uff1b \u5bf9\u4e8e\u4e00\u4e9b\u6587\u6848\u7684\u573a\u666f\u975e\u5e38\u9002\u7528\uff0c\u6b64\u65b9\u6cd5\u76f4\u63a5\u8fd4\u56de\u5750\u6807\uff0c\u53ef\u4ee5\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u3002 \u4e5f\u53ef\u4ee5\u7528\u4e8e\u6587\u5b57\u65ad\u8a00\uff0c\u4ee3\u7801\u793a\u610f\uff1a def assert_ocr_exist(\n*args, picture_abspath=None, similarity=0.6, return_first=False, lang=\"ch\"\n):\n\"\"\"\u65ad\u8a00\u6587\u6848\u5b58\u5728\"\"\"\npic = None\nif picture_abspath is not None:\npic = picture_abspath + \".png\"\nres = OCR.ocr(\n*args,\npicture_abspath=pic,\nsimilarity=similarity,\nreturn_first=return_first,\nlang=lang,\n)\nif res is False:\nraise AssertionError(\n(f\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{args}\", f\"{pic if pic else GlobalConfig.SCREEN_CACHE}\")\n)\nif isinstance(res, tuple):\npass\nelif isinstance(res, dict) and False in res.values():\nres = filter(lambda x: x[1] is False, res.items())\nraise AssertionError(\n(\nf\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{dict(res)}\",\nf\"{pic if pic else GlobalConfig.SCREEN_CACHE}\",\n)\n)\n \u5728\u7528\u4f8b\u4e2d\u4f7f\u7528\u65ad\u8a00\uff0c\u793a\u4f8b\uff1a def test_font_manager_021(self):\n\"\"\"\u53f3\u4fa7\u2665-\u6536\u85cf/\u53d6\u6d88\u6536\u85cf\u5b57\u4f53\"\"\"\n# \u5b57\u4f53\u7ba1\u7406\u5668\u754c\u9762\u53f3\u4fa7\u8be6\u60c5\u5217\u8868\uff0c\u9009\u62e9\u672a\u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e / \u6536\u85cf\u5b57\u4f53\n# \u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e\u83dc\u5355\u663e\u793a\u201c\u53d6\u6d88\u6536\u85cf\u201d\uff1b\n...\nself.assert_ocr_exist(\"\u53d6\u6d88\u6536\u85cf\")\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_1","title":"4\u3001\u670d\u52a1\u7aef\u90e8\u7f72","text":"\u6211\u4eec\u76ee\u524d\u662f\u5c06 OCR \u670d\u52a1\u90e8\u7f72\u5728\u666e\u901a\u7684\u529e\u516c\u673a\u4e0a\u7684\uff0c\u5982\u679c\u4f60\u89c9\u5f97\u73b0\u6709\u7684 OCR \u8bc6\u522b\u6027\u80fd\u4e0d\u591f\u597d\uff0c\u6070\u597d\u4f60\u6709\u66f4\u597d\u7684\u673a\u5668\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u5176\u79c1\u6709\u5316\u90e8\u7f72\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41_1","title":"4.1\u3001\u73af\u5883\u5b89\u88c5","text":"\u63a8\u8350\u4f7f\u7528 pipenv \u8fdb\u884c\u73af\u5883\u642d\u5efa\uff1b \u5b89\u88c5 pipenv \uff1a sudo pip3 install pipenv\n \u65b0\u5efa\u4e00\u4e2a\u76ee\u5f55\u4f5c\u4e3a\u73af\u5883\u5305 ocr_env\uff1a cd ~\nmkdir ocr_env\n \u521b\u5efa python 3.7 \u73af\u5883\uff1a cd ocr_env\npipenv --python 3.7\n \u5b89\u88c5 OCR \u4f9d\u8d56\u5305\uff1a pipenv install paddlepaddle -i https://mirror.baidu.com/pypi/simple\npipenv install \"paddleocr>=2.0.1\" -i https://mirror.baidu.com/pypi/simple\n \u4e0d\u51fa\u610f\u5916\uff0c\u8fd9\u6837\u5c31\u628a\u4f9d\u8d56\u5b89\u88c5\u597d\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42_1","title":"4.2\u3001\u542f\u52a8\u670d\u52a1","text":"\u5c06\u57fa\u7840\u6846\u67b6\u4e2d\u7684 scr/ocr/pdocr_rpc_server.py \u6587\u4ef6\u62f7\u8d1d\u5230 ocr_env \u76ee\u5f55\uff0c\u540e\u53f0\u6267\u884c\u5b83\u5c31\u597d\u4e86\uff1a cd ocr_env\nnohup pipenv run python pdocr_rpc_server.py &\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#43","title":"4.3\u3001\u914d\u7f6e\u5f00\u673a\u81ea\u542f\uff08\u901a\u7528\uff09","text":"\u4f60\u80af\u5b9a\u4e0d\u60f3\u6bcf\u6b21\u673a\u5668\u91cd\u542f\u4e4b\u540e\u90fd\u9700\u8981\u624b\u52a8\u542f\u52a8\u670d\u52a1\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u914d\u7f6e\u5f00\u673a\u81ea\u542f\u3002 \u5199\u5f00\u673a\u81ea\u542f\u670d\u52a1\u6587\u4ef6\uff1a sudo vim /lib/systemd/system/ocr.service\n autoocr \u540d\u79f0\u4f60\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff0c\u5199\u5165\u4ee5\u4e0b\u5185\u5bb9\uff1a [Unit]\nDescription=OCR Service\nAfter=multi-user.target\n\n[Service]\nUser=uos\nGroup=uos\nType=idle\nWorkingDirectory=/home/uos/ocr_env\nExecStart=pipenv run python pdocr_rpc_server.py\n\n[Install]\nWantedBy=multi-user.target\n \u6ce8\u610f\u66ff\u6362\u4f60\u7684${USER} \u4fee\u6539\u914d\u7f6e\u6587\u4ef6\u7684\u6743\u9650\uff1a sudo chmod 644 /lib/systemd/system/ocr.service\n \u81ea\u542f\u670d\u52a1\u751f\u6548\uff1a sudo systemctl daemon-reload\nsudo systemctl enable ocr.service\n \u67e5\u770b\u670d\u52a1\u72b6\u6001\uff1a sudo systemctl status ocr.service\n \u4f60\u53ef\u4ee5\u518d\u91cd\u542f\u4e0b\u7535\u8111\uff0c\u770b\u770b\u670d\u52a1\u662f\u4e0d\u662f\u6b63\u5e38\u542f\u52a8\u4e86\uff0c\u6ca1\u62a5\u9519\u5c31 OK \u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_4","title":"\u4e94\u3001\u5c5e\u6027\u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_3","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 UI \u81ea\u52a8\u5316\u5927\u591a\u90fd\u662f\u57fa\u4e8e\u6d4f\u89c8\u5668\u7684\uff0c\u6838\u5fc3\u662f\u5728\u7f51\u9875\u7684 DOM \u6811\u4e0a\u67e5\u627e\u5143\u7d20\uff0c\u5e76\u5bf9\u5176\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\uff1b Linux \u684c\u9762\u5e94\u7528\u5927\u591a\u662f\u91c7\u7528 Qt \u7f16\u5199\u7684\uff0c\u5728 Qt \u4e2d\u4e5f\u662f\u4ece\u6700\u9876\u5c42\u7684 MainWindow \u5f00\u59cb\u6784\u5efa\u5e94\u7528\uff0c\u6240\u4ee5\u903b\u8f91\u4e5f\u662f\u4e00\u6837\u7684\uff0cQt \u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u540c\u6837\u53ef\u4ee5\u901a\u8fc7 DOM \u6811\uff08\u5c5e\u6027\u6811\uff09\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff0c\u6211\u4eec\u79f0\u4e4b\u4e3a\u5c5e\u6027\u5b9a\u4f4d\u3002 \u501f\u52a9\u5f00\u6e90\u5de5\u5177 dogtail \u6211\u4eec\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u83b7\u53d6\uff0c\u4ece\u800c\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\u3002dogtail \u7684\u9879\u76ee\u4ecb\u7ecd\u53ef\u4ee5\u731b\u6233\u8fd9\u91cc\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_3","title":"2\u3001\u4f7f\u7528\u65b9\u6cd5","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#21sniff","title":"2.1\u3001sniff\uff08\u55c5\u63a2\u5668\uff09\u4f7f\u7528","text":"\u5728\u7ec8\u7aef\u8f93\u5165 sniff \u542f\u52a8 AT-SPI Browser mikigo@mikigo-PC:~$ sniff\n \u67e5\u770b\u5e94\u7528\u7684\u6807\u7b7e \u5728 sniff \u91cc\u9762\u53ef\u4ee5\u770b\u5230\u7cfb\u7edf\u4e2d\u5df2\u542f\u52a8\u7684\u5e94\u7528\uff0c\u70b9\u51fb\u5e94\u7528\u540d\u79f0\u524d\u9762\u7684\u4e09\u89d2\u5f62\u56fe\u6807\uff0c\u53ef\u4ee5\u5c55\u5f00\u5e94\u7528\u7684\u6807\u7b7e\uff0c\u6240\u6709\u6807\u7b7e\u4ee5 tree \u7684\u5f62\u5f0f\u5c55\u793a\uff0c\u5bf9\u5e94\u5e94\u7528\u91cc\u9762\u7684\u7236\u7a97\u53e3\u548c\u5b50\u7a97\u53e3\u3002 \u83b7\u53d6\u5143\u7d20\u63a7\u4ef6\u7684\u6807\u7b7e\u540d\u79f0 \u9996\u5148\uff0c\u4e3a\u4e86\u65b9\u4fbf\u67e5\u770b\u5143\u7d20\u63a7\u4ef6\u5bf9\u5e94\u7684\u4f4d\u7f6e\uff0c\u5efa\u8bae\u73b0\u5728\u4e0a\u65b9\u5de5\u5177\u680f\u70b9\u51fb Actions\uff0c\u7136\u540e\u52fe\u9009 Hightlight Items\uff0c\u8fd9\u6837\u5728 sniff \u4e2d\u9f20\u6807\u9009\u4e2d\u5143\u7d20\u6807\u7b7e\u7684\u65f6\u5019\uff0c\u5e94\u7528\u4e2d\u4f1a\u6709\u76f8\u5e94\u7684\u5149\u6807\u9501\u5b9a\u3002 \u5728 sniff \u91cc\u9762\u70b9\u51fb\u8fdb\u5165\u5e94\u7528\u7684\u6807\u7b7e tree \u4e2d\u540e\uff0c\u70b9\u51fb\u76f8\u5e94\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5728\u5de5\u5177\u4e0b\u65b9\uff0c\u4f1a\u5c55\u793a\u5143\u7d20\u63a7\u4ef6\u7684 Name\uff0c\u8fd9\u4e2a\u5c31\u662f\u6807\u7b7e\u540d\u79f0\u3002 \u5728 tree \u4e2d\u6709\u4e9b\u5730\u65b9\u662f\u7a7a\u767d\u7684\u6216\u8005\u662f Form\uff0c\u662f\u56e0\u4e3a\u5f00\u53d1\u4eba\u5458\u5728\u6dfb\u52a0\u6807\u7b7e\u7684\u65f6\u5019\u6ca1\u6709\u6dfb\u52a0\uff0c\u6216\u8005\u6709\u4e9b\u7236\u7a97\u53e3\u4e0d\u9700\u8981\u6dfb\u52a0\uff0c\u8fd9\u79cd\u5728\u5b9e\u9645\u4e1a\u52a1\u4e2d\u662f\u4e0d\u5f71\u54cd\u7684\uff0c\u6211\u4eec\u53ea\u8981\u4fdd\u8bc1\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\u4e2d\uff0c\u8981\u7528\u5230\u7684\u5143\u7d20\u90fd\u6dfb\u52a0\u4e86\u6807\u7b7e\u5373\u53ef\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#22","title":"2.2\u3001\u5143\u7d20\u64cd\u4f5c","text":"\u83b7\u53d6\u5e94\u7528\u5bf9\u8c61 dogtail \u83b7\u53d6\u5e94\u7528\u5bf9\u8c61\u7684\u65f6\u5019\uff0c\u4f7f\u7528\u7684\u662f tree \u5e93\u91cc\u9762\u7684 application() \u65b9\u6cd5\uff1a from dogtail.tree import root\napp_obj = root.application('deepin-music')\n app_obj\u5c31\u662f\u5e94\u7528\u7684\u5bf9\u8c61\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\uff0c\u662f\u5e94\u7528\u5bf9\u8c61\u4f7f\u7528child()\u65b9\u6cd5\uff1a element = app_obj.child('element_name')\n \u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u4f20\u5165\u5143\u7d20\u7684 Name\uff0c\u83b7\u53d6\u5230\u76f8\u5e94\u5143\u7d20\u7684\u5bf9\u8c61\u3002Name \u53ef\u4ee5\u901a\u8fc7 sniff \u67e5\u770b\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\u5217\u8868: element_list = element.children\n \u83b7\u53d6\u5230\u8fd9\u4e2a\u5143\u7d20\u4e0b\u9762\u6240\u6709\u7684\u5143\u7d20\u5217\u8868\u3002 \u8fd9\u4e2a\u65b9\u6cd5\u9002\u7528\u4e8e\u6709\u4e9b\u6807\u7b7e\u6ca1\u6709\u6dfb\u52a0\uff0c\u4f46\u662f\u4f4d\u7f6e\u662f\u56fa\u5b9a\u7684\uff0c\u6211\u4eec\u901a\u8fc7\u7d22\u5f15\u53ef\u4ee5\u53d6\u5f97\u5143\u7d20\u3002 element_list[0]\n \u5bf9\u5143\u7d20\u7684\u64cd\u4f5c \u5728\u83b7\u53d6\u5230\u5143\u7d20\u4e4b\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u76f8\u5e94\u7684\u64cd\u4f5c\u3002 \u5355\u51fb element.click(button=1)\n button 1 \u2014>\u5de6\u952e\uff0c2 \u2014>\u6eda\u8f6e\uff0c3 \u2014>\u53f3\u952e\uff0c\u9ed8\u8ba4\u4e3a 1 \u53cc\u51fb element.doubleClick(button=1)\n \u9f20\u6807\u60ac\u505c element.point()\n \u9f20\u6807\u79fb\u52a8\u5230\u5143\u7d20\u4e2d\u5fc3\u4f4d\u7f6e \u6587\u672c\u8f93\u5165 element.typeText(string)\n \u5411\u5143\u7d20\u5bf9\u8c61\u8f93\u5165\u5b57\u7b26\u4e32 \uff0c\u6bd4\u5982\u8f93\u5165\u6846 \u7ec4\u5408\u952e element.keyCombo(comboString)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#23","title":"2.3\u3001\u6846\u67b6\u5c01\u88c5","text":"\u4ee3\u7801\u793a\u4f8b\uff1a # \u8be6\u7ec6\u4ee3\u7801\u8bf7\u67e5\u770b src/dogtail_utils.py\nclass DogtailUtils:\ndef __init__(self, name=None, description=None):\nself.name = name\nself.description = description\nself.obj = root.application(self.name, self.description)\ndef app_element(self, *args, **kwargs):\n\"\"\"\n \u83b7\u53d6app\u5143\u7d20\u7684\u5bf9\u8c61\n :return: \u5143\u7d20\u7684\u5bf9\u8c61\n \"\"\"\nreturn self.obj.child(*args, **kwargs, retry=False)\ndef element_center(self, element) -> tuple:\n\"\"\"\n \u83b7\u53d6\u5143\u7d20\u7684\u4e2d\u5fc3\u4f4d\u7f6e\n :param element:\n :return: \u5143\u7d20\u4e2d\u5fc3\u5750\u6807\n \"\"\"\n_x, _y, _w, _h = self.app_element(element).extents\n_x = _x + _w / 2\n_y = _y + _h / 2\nreturn _x, _y\n \u6846\u67b6\u63d0\u4f9b\u7684\u63a5\u53e3\u975e\u5e38\u7b80\u6d01\uff0c\u5728\u8c03\u7528\u65f6\uff1a self.dog.element_center(\"\u64ad\u653e\")\n \u8fd9\u6837\u5c31\u80fd\u83b7\u53d6\u5230\u6b64\u5143\u7d20\u7684\u4e2d\u5fc3\u5750\u6807\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_5","title":"\u516d\u3001\u6807\u7b7e\u5316\u7ba1\u7406","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_4","title":"1\u3001\u6807\u7b7e\u8bf4\u660e","text":"\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u811a\u672c ID\uff1a\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c/\u51fd\u6570 ID\uff1b PMS\u7528\u4f8bID\uff1aPMS \u4e0a\u5bf9\u5e94\u7684\u7528\u4f8b ID\uff08\u7528\u4f8b\u5e93 ID\uff09\uff1b \u9ed8\u8ba4\u4f7f\u7528\u7528\u4f8b\u5e93 ID\uff0c\u5bf9\u4e8e\u6682\u65f6\u6ca1\u6709\u4f7f\u7528\u7528\u4f8b\u5e93\u7ba1\u7406\u7528\u4f8b\u7684\u9879\u76ee\uff0c\u53ef\u4ee5\u4f7f\u7528\u4ea7\u54c1\u5e93\u7528\u4f8b ID\uff1b \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1aFUNC\uff08\u529f\u80fd\uff09\u3001API\uff08\u63a5\u53e3\uff09\u3001BASELINE\uff08\u57fa\u7ebf\uff09\u3001PERF\uff08\u6027\u80fd\uff09\u3001STR\uff08\u538b\u529b\uff09\u3001SEC\uff08\u5b89\u5168\uff09\u3001CTS\uff08\u517c\u5bb9\u6027\uff09 \u4e0a\u7ebf\u5bf9\u8c61\uff1aCICD\uff0c\u8868\u793a\u4e0a\u7ebf\u5230 CICD \u6d41\u6c34\u7ebf\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u53ef\u4e00\u952e\u751f\u6210 case_list.csv \u6587\u4ef6\uff0c\u7528\u4e8e\u5bfc\u5165\u5230\u660e\u9053\u4e91 AT \u7528\u4f8b\u5217\u8868\u4e2d\u63a7\u5236 CICD \u8dd1\u6d4b\u8303\u56f4\uff1b \u6d4b\u8bd5\u7ea7\u522b\uff1aC1 / C2 / C3 / C4\uff0c\u5177\u4f53\u5b9a\u4e49\u53c2\u8003\u6d41\u6c34\u7ebf\u4f7f\u7528\u6307\u5bfc\uff1b \u8df3\u8fc7\u539f\u56e0\uff1askip-XXX\uff0c\u7528\u4e8e\u63a7\u5236\u7528\u4f8b\u662f\u5426\u6267\u884c\uff1b \u786e\u8ba4\u4fee\u590d\uff1afixed-XXX\uff0c\u7528\u4e8e\u6807\u8bb0\u7528\u4f8b\u7684\u4fee\u590d\u72b6\u6001\uff08\u540e\u9762\u8be6\u7ec6\u8bb2\u89e3\u7528\u6cd5\uff09\uff1b \u5e9f\u5f03\u7528\u4f8b\uff1aremoved-\u5df2\u5e9f\u5f03\uff0c\u7528\u4e8e\u6807\u8bb0\u5df2\u7ecf\u5e9f\u5f03\u7684\u7528\u4f8b\uff0c\u6b64\u7528\u4f8b\u6807\u7b7e\u4e0d\u4f1a\u88ab\u6dfb\u52a0\uff0c\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff1b \u793a\u4f8b\uff1a \u811a\u672cID PMS\u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u4e0a\u7ebf\u5bf9\u8c61 \u6d4b\u8bd5\u7ea7\u522b \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b ... 001 679537 L1 FUNC CICD C1 skip-XXX fixed-XXX removed-\u5df2\u5e9f\u5f03 ..."},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_4","title":"2\u3001\u64cd\u4f5c\u6b65\u9aa4","text":"2.1\u3001\u5728\u5b50\u9879\u76ee\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u4ee5\u7528\u4f8b\u7684 py \u6587\u4ef6\u9664\u53bb\u9996\u5b57\u7b26\u4e32 \"test_\" \u548c\u7528\u4f8b\u5e8f\u53f7\u540e\u7684\u5b57\u7b26\u4e32\u4f5c\u4e3a csv \u7684\u6587\u4ef6\u540d\u3002 \u4f8b\u5982: \u76f8\u518c\u7684\u7528\u4f8b\u6587\u4ef6\u4e3a test_album_xxx.py\uff0cxxx \u8868\u793a\u4efb\u610f\u4e09\u4f4d\u6570\u5b57\u4ee3\u8868\u7528\u4f8b\u5e8f\u53f7\uff0c\u6b64\u65f6 csv \u6587\u4ef6\u540d\u5c31\u5e94\u4e3a album.csv\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u6240\u6709 csv \u6587\u4ef6\u5efa\u8bae\u653e\u5728\u4e00\u4e2a tags \u76ee\u5f55\u4e0b\u3002 \u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 2.2\u3001\u7b2c\u4e00\u5217\u4e3a\u811a\u672c ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b\u7528\u4f8b\u6807\u7b7e\u53ef\u4ee5\u65e0\u5e8f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_2","title":"3\u3001\u589e\u52a0\u8bf4\u660e","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_1","title":"3.1\u3001\u8df3\u8fc7\u7528\u4f8b","text":"\u4f20\u7edf\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668(@pytest.mark.skip)\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a; \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#311","title":"3.1.1\u3001\u56fa\u5b9a\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u7b7e\u5f00\u5934\u4e3a \u201cskip-XXX\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\uff0c\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\u5219\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u7b7e\u4e3a SKIPED\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#312","title":"3.1.2\u3001\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skipif_platform-aarch64&mips64 \u67d0\u4e9b\u7528\u4f8b\u4f1a\u56e0\u4e3a\u4e0d\u540c\u7684\u73af\u5883\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\uff0c\u5e38\u89c1\u7684\u573a\u666f\u4e3a\u5728\u4e0d\u540c\u67b6\u6784\u4e0a\u5224\u65ad\u662f\u5426\u6267\u884c\uff0c\u8df3\u8fc7\u7684\u539f\u56e0\u6807\u7b7e\u4e3a \u201cskipif_platform-\u201d \u52a0\u67b6\u6784\u540d\uff0c\u591a\u4e2a\u67b6\u6784\u4e4b\u95f4\u4f7f\u7528 \u201c&\u201d \u62fc\u63a5\uff1b \u4ee5\u4e0a\u4f8b\u5b50\u4e3a\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u5224\u65ad\u5f53\u524d\u67b6\u6784\u662f\u5426\u4e3a arrch64 \u6216\u8005 mips64\uff0c\u82e5\u662f\uff0c\u5219\u8df3\u8fc7\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u82e5\u5426\u5219\u6267\u884c\u7528\u4f8b\uff1b \u76ee\u524d\u6846\u67b6\u9ed8\u8ba4\u4ec5\u652f\u6301\u67b6\u6784\u7684\u6761\u4ef6\u5224\u65ad\uff0c\u4f46\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u903b\u8f91\u652f\u6301\u81ea\u5b9a\u4e49\u6dfb\u52a0\u3002 \u5728\u9879\u76ee\u76ee\u5f55\u8def\u5f84\u4e0b\u5b58\u5728\u6587\u4ef6 setting/skipif.py\uff0c\u6240\u6709\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u7684\u51fd\u6570\u5199\u5728\u6b64\u6587\u4ef6\u4e2d\u3002 \u9ed8\u8ba4\u67b6\u6784\u5224\u65ad\u4f8b\u5b50\uff1a def skipif_platform(args: str):\n\"\"\"\u5e73\u53f0\u8df3\u8fc7\"\"\"\n_skip_key = args.split(\"&\")\nfor key in _skip_key:\nif GlobalConfig.SYS_ARCH == key:\nreturn True\nreturn False\n \u65b9\u6cd5\u7f16\u5199\u89c4\u8303\uff1a \u65b9\u6cd5\u540d\u5fc5\u987b\u4ee5 skipif \u5f00\u5934\uff1b \u65b9\u6cd5\u5fc5\u987b\u6709\u8fd4\u56de\u7ed3\u679c\u5e76\u4e14\u4e3a\u5e03\u5c14\u503c\uff08True \u4ee3\u8868\u8df3\u8fc7\uff0cFalse \u4ee3\u8868\u4e0d\u8df3\u8fc7\uff09\uff1b \u65b9\u6cd5\u53ea\u80fd\u6709\u4e00\u4e2a\u5165\u53c2\uff1b \u5728 csv \u6587\u4ef6\u8df3\u8fc7\u539f\u56e0\u4e00\u680f\u4e2d\u586b\u5199\u4e3a \u201c{\u51fd\u6570\u540d}-{\u53c2\u6570}\u201d\uff0c\u4f8b\u5982\uff1askipif_platform-aarch64\uff1b\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u4f1a\u4ee5\u7b2c\u4e00\u4e2a \u201c-\u201d \u8fdb\u884c\u5206\u5272\uff0c\u622a\u53d6\u7684\u5de6\u4fa7\u5b57\u7b26\u4e32\u4f5c\u4e3a\u51fd\u6570\u540d\uff0c\u5728 skipif.py \u6587\u4ef6\u4e2d\u67e5\u627e\u662f\u5426\u6709\u540c\u540d\u51fd\u6570\uff0c\u5e76\u5c06\u622a\u53d6\u7684\u53f3\u4fa7\u4f5c\u4e3a\u53c2\u6570\u4f20\u9012\u7ed9\u8be5\u51fd\u6570\uff0c\u901a\u8fc7\u83b7\u53d6\u8be5\u51fd\u6570\u8fd4\u56de\u7684\u5e03\u5c14\u503c\uff0c\u8fd4\u56de True\uff0c\u5219\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u8fd4\u56de False\uff0c\u5219\u6267\u884c\u8be5\u7528\u4f8b\u3002 \u82e5\u51fd\u6570\u9700\u8981\u591a\u4e2a\u53c2\u6570\uff0c\u53ef\u81ea\u5b9a\u4e49\u591a\u4e2a\u53c2\u6570\u4e4b\u95f4\u7684\u8fde\u63a5\u7b26\uff0c\u8fde\u63a5\u7b26\u53f7\u4e0d\u53ef\u4f7f\u7528\u4e0b\u5212\u7ebf\u548c\u9017\u53f7\uff0c\u63a8\u8350\u7edf\u4e00\u4f7f\u7528 & \u7b26\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32","title":"3.2\u3001\u786e\u8ba4\u4fee\u590d","text":"\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7528\u4f8b\u4fee\u590d\u540e\uff0c\u4f46\u4e0d\u80fd\u7acb\u5373\u5220\u9664\u8df3\u8fc7\u539f\u56e0\uff08skip-XXX\uff09\u7684\u7528\u4f8b\uff0c\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u786e\u8ba4\u4fee\u590d\u201d\uff0c\u4f5c\u4e3a\u6807\u8bb0\u8be5\u7528\u4f8b\u662f\u5426\u5df2\u7ecf\u4fee\u590d\uff0c\u56fa\u5b9a\u586b\u5165\u5b57\u6bb5\u4e3a \u201cfixed-\u5df2\u4fee\u590d\u201d\u3002\u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u5373\u4f7f\u540c\u65f6\u6807\u8bb0\u4e86 skip-XXX \u4e5f\u4f1a\u6b63\u5e38\u6267\u884c\u3002 \u793a\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d \u3010\u540c\u65f6\u6807\u8bb0\u4e86skip \u548c fixed\uff0c\u4f46\u4ecd\u7136\u60f3\u8981\u8df3\u8fc7\u7528\u4f8b\u3011 \u5f53 \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u540c\u65f6\u586b\u5165\u540e\uff0c\u547d\u4ee4\u884c\u4f20\u9012\u53c2\u6570 --ifixed yes\uff0c\u5219\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\u8be5\u6761\u7528\u4f8b\u3002 python3 manage.py run --ifixed yes\n \u770b\u5230\u8fd9\u91cc\u6709\u4e9b\u540c\u5b66\u53ef\u80fd\u8981\u95ee\u4e86\uff0c\u6211\u60f3\u6062\u590d\u8df3\u8fc7\u6267\u884c\uff0c\u76f4\u63a5\u628a skip-XXX \u8fd9\u4e00\u5217\u6807\u7b7e\u5220\u6389\u4e0d\u5c31\u597d\u4e86\uff0c\u8fd8\u641e\u4ec0\u4e48\u786e\u8ba4\u4fee\u590d\u5e72\u5565\uff1f \u8fd9\u91cc\u7ed9\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u89e3\u91ca\u4e00\u4e0b\uff1a \uff08\u4ee5\u4e0b\u6d41\u6c34\u7ebf\u6307\u7684\u662f\u6bcf\u65e5\u6784\u5efa\u7684\u6d41\u6c34\u7ebf\uff0c\u8dd1 AT \u7684\u5168\u91cf\u7528\u4f8b\uff09 \u9996\u5148\uff0c\u6d41\u6c34\u7ebf\u4e0a\u8dd1\u7684\u662f AT \u5386\u53f2 Tag\uff0c\u8df3\u8fc7\u7528\u4f8b\u7684\u6807\u7b7e(skip-XXX) \u662f\u5728\u6700\u65b0\u7684\u4ee3\u7801\u4e0a\u63d0\u4ea4\u7684\uff0c\u6211\u4eec\u91c7\u7528\u6700\u65b0\u7684 csv \u6587\u4ef6\u8986\u76d6\u5386\u53f2 csv \u6587\u4ef6\u7684\u8bbe\u8ba1\u6765\u5b9e\u73b0\u4e86\u5bf9\u5386\u53f2 Tag \u4e0a\u7528\u4f8b\u7684\u8df3\u8fc7\uff1b \u7136\u540e\uff0c\u5728\u65e5\u5e38\u8df3\u8fc7\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u540c\u65f6\u4e5f\u5728\u4fee\u590d\u4e00\u4e9b\u7528\u4f8b\uff0c\u4fee\u590d\u540e\u7684\u8fd9\u4e9b\u7528\u4f8b\u5728\u672c\u5730\u8c03\u8bd5\u7684\u65f6\u5019\u6211\u4eec\u4e0d\u5e0c\u671b\u7ee7\u7eed\u8df3\u8fc7\uff0c\u4f46\u662f\u6b64\u65f6\uff0c\u4fee\u590d\u7684\u8fd9\u4e9b\u7528\u4f8b\u53ef\u80fd\u8fd8\u4e0d\u7a33\u5b9a\uff0c\u4e0d\u9002\u5408\u9a6c\u4e0a\u653e\u5230\u6d41\u6c34\u7ebf\u53bb\u8dd1\uff0c\u4e5f\u5c31\u662f\u8bf4\u6d41\u6c34\u7ebf\u4e0a\u6211\u4eec\u662f\u5e0c\u671b\u4ed6\u7ee7\u7eed\u8df3\u8fc7\u7684\uff0c\u56e0\u6b64\uff0c\u54b1\u4e0d\u80fd\u76f4\u63a5\u628a skip-XXX \u5e72\u6389\uff1b \u8fd9\u91cc\u5c31\u77db\u76fe\u4e86\uff0c\u4e00\u4e2a\u9700\u6c42\u662f\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u53e6\u4e00\u4e2a\u9700\u6c42\u53c8\u4e0d\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u600e\u4e48\u529e\u5462\uff1f \u6211\u4eec\u4f7f\u7528\u201c\u786e\u8ba4\u4fee\u590d\u201d\u6765\u6807\u8bb0\u8fd9\u6761\u7528\u4f8b\u5df2\u7ecf\u4fee\u590d\u4e86\uff0c\u8fd9\u6837\u4f60\u672c\u5730\u8c03\u8bd5\u7528\u4f8b\u7684\u65f6\u5019\u8fd9\u6761\u5df2\u4fee\u590d\u7684\u7528\u4f8b\u662f\u4f1a\u6267\u884c\u7684\uff0c\u540c\u65f6\u5728\u6d41\u6c34\u7ebf\u4e0a\u5c06 --ifixed yes \u53c2\u6570\u52a0\u4e0a\uff0c\u90a3\u4e48\u6d41\u6c34\u7ebf\u4e0a\u6267\u884c\u65f6\u8fd9\u6761\u7528\u4f8b\u4ecd\u7136\u662f\u8df3\u8fc7\u7684\u72b6\u6001\uff0c\u540e\u7eed\u4f60\u6253 Tag \u7684\u65f6\u5019\uff0c\u628a \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u7684\u6807\u7b7e\u5168\u90e8\u5220\u6389\u5c31\u53ef\u4ee5\u4e86\u3002 \u8fd9\u5c31\u662f\u201c\u786e\u8ba4\u4fee\u590d\u201d\u8fd9\u4e2a\u6807\u7b7e\u7684\u80cc\u666f\uff0c\u9700\u8981\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u54c1\u4e00\u54c1\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#33","title":"3.3\u3001\u5e9f\u5f03\u7528\u4f8b","text":"\u9488\u5bf9\u67d0\u4e9b\u7528\u4f8b\uff0c\u7531\u4e8e\u9700\u6c42\u53d8\u66f4\uff0c\u73af\u5883\u5f71\u54cd\u6216\u8bc4\u4f30\u4e0d\u518d\u9002\u7528\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u65f6\uff0c\u7528\u4f8b\u9700\u8981\u5e9f\u5f03\uff0c\u5219\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u5e9f\u5f03\u7528\u4f8b\u201d\uff0c\u8be5\u5217\u5b58\u5728 \u201cremoved-{\u5e9f\u5f03\u539f\u56e0}\u201d\uff0c\u5219\u7528\u4f8b\u4e0d\u4f1a\u6267\u884c\u3002 \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d removed-\u5df2\u5e9f\u5f03 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_2","title":"4\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u4e0a\u9762\u4ecb\u7ecd Pytest \u6846\u67b6\u63d0\u4f9b\u7684\u6807\u7b7e\u529f\u80fd mark\uff0c\u4f7f\u7528\u65f6\u9700\u8981\u4e3a\u6bcf\u4e00\u4e2a\u7528\u4f8b\u6dfb\u52a0\u6807\u7b7e\u88c5\u9970\u5668\uff0c\u5219\u64cd\u4f5c\u590d\u6742\uff0c\u53ef\u7ef4\u62a4\u6027\u5dee\uff0c\u5176\u6839\u672c\u95ee\u9898\u5c31\u662f\u6807\u7b7e\u5206\u6563\u5728\u6bcf\u4e00\u6761\u7528\u4f8b\u7684\u88c5\u9970\u5668\u4e0a\uff0c\u96be\u4ee5\u96c6\u4e2d\u7ef4\u62a4\uff1b\u4e8e\u662f\u4e4e\u5c06\u6240\u6709\u6807\u7b7e\u4f7f\u7528 csv \u6587\u4ef6\u8fdb\u884c\u96c6\u4e2d\u7ba1\u7406\uff0c\u5e76\u901a\u8fc7 Pytest \u7684\u94a9\u5b50\u51fd\u6570\uff0c\u8bfb\u53d6 csv \u6587\u4ef6\uff0c\u52a8\u6001\u6dfb\u52a0\u6807\u7b7e\u5230\u7528\u4e2d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5csv","title":"5\u3001CSV\u6587\u4ef6\u683c\u5f0f","text":"\u6b64\u914d\u7f6e\u6587\u4ef6\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u6807\u7b7e\u6570\u636e\uff0c\u4e14\u8981\u65b9\u4fbf\u80fd\u4f7f\u7528Excel\u6253\u5f00\u8fdb\u884c\u7f16\u8f91\u67e5\u770b\uff0c\u66f4\u91cd\u8981\u7684\u662f\u6211\u4eec\u4e0d\u60f3\u5f15\u5165\u4e09\u65b9\u4f9d\u8d56\uff0cCSV \u6587\u4ef6\u51e0\u4e4e\u662f\u552f\u4e00\u80fd\u6ee1\u8db3\u6240\u6709\u7684\u8981\u6c42\u7684\u6587\u4ef6\u683c\u5f0f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_6","title":"\u4e03\u3001\u65e5\u5fd7\u7cfb\u7edf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_5","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e YouQu \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u64cd\u4f5c\u65b9\u6cd5\u5c01\u88c5\u5199\u6cd5\uff0c\u901a\u5e38\u662f\u8fd9\u6837\u7684\uff1a\u7c7b\u91cc\u9762\u4e00\u4e2a\u51fd\u6570\u53ea\u5305\u542b\u4e00\u4e2a\u64cd\u4f5c\u6216\u591a\u6b21\u8c03\u7528\u7684\u4e00\u7cfb\u5217\u53ef\u5408\u5e76\u7684\u64cd\u4f5c\uff1b \u4f20\u7edf\u7684\u65e5\u5fd7\u8f93\u51fa\u65b9\u5f0f\uff0c\u9700\u8981\u5728\u6bcf\u4e2a\u51fd\u6570\u91cc\u9762\u4e3b\u52a8\u7f16\u5199\u65e5\u5fd7\u8f93\u51fa\u4ee3\u7801 \uff0c\u4f8b\u5982\uff1a class XXXWidget:\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\nlogger.info(\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\")\n...\n# \u7701\u7565\u4ee3\u7801\u90e8\u5206\n \u4e00\u4e2a\u51fd\u6570\u91cc\u9762\u81f3\u5c11\u5305\u542b\u4e00\u6761\u65e5\u5fd7\u4fe1\u606f\uff0c\u5982\u679c\u6bd4\u8f83\u590d\u6742\u64cd\u4f5c\u6b65\u9aa4\uff0c\u53ef\u80fd\u5305\u542b\u591a\u6761\u65e5\u5fd7\u4fe1\u606f\uff1b \u4e00\u4e2a\u5e94\u7528\u542b\u6709\u5927\u91cf\u7684\u64cd\u4f5c\u51fd\u6570\uff0c\u4e5f\u5c31\u662f\u8bf4\u6211\u4eec\u9700\u8981\u5199\u5927\u91cf\u7684\u65e5\u5fd7\u4ee3\u7801\uff1b \u901a\u8fc7\u7ecf\u9a8c\u89c2\u5bdf\uff0c\u6211\u4eec\u53d1\u73b0\uff0c\u51fd\u6570\u8bf4\u660e\u4ee5\u53ca\u51fd\u6570\u64cd\u4f5c\u65e5\u5fd7\uff0c\u5177\u6709\u8f83\u9ad8\u7684\u91cd\u590d\u5ea6\uff08\u4ece\u4e0a\u9762\u7684\u4f8b\u5b50\u4e5f\u53ef\u4ee5\u770b\u51fa\u6765\uff09\uff0c\u56e0\u6b64\u6211\u4eec\u5927\u80c6\u7684\u8bbe\u60f3\uff0c\u80fd\u4e0d\u80fd\u57fa\u4e8e\u6846\u67b6\u6267\u884c\u65f6\uff0c\u81ea\u52a8\u7684\u5c06\u51fd\u6570\u8bf4\u660e\u4f5c\u4e3a\u65e5\u5fd7\u6253\u5370\u51fa\u6765\uff0c\u4ece\u800c\u51cf\u5c11\u5927\u91cf\u65e5\u5fd7\u4ee3\u7801\u91cf\u548c\u91cd\u590d\u7f16\u5199\uff0c\u90a3\u771f\u662f\u5999\u554a~\u3002 \u57fa\u4e8e\u6b64\u201c\u5929\u771f\u201d\u7684\u60f3\u6cd5\uff0c\u6211\u4eec\u8bbe\u8ba1\u51fa\u4e86 youqu \u7684\u65e5\u5fd7\u7cfb\u7edf\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_5","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u6838\u5fc3\u539f\u7406\uff1a \u901a\u8fc7\u7ed9\u7c7b\u52a0\u4e0a\u4e00\u4e2a\u88c5\u9970\u5668 @log\uff0c\u52a8\u6001\u7ed9\u8be5\u7c7b\u4e0b\u6240\u6709\u7684\u51fd\u6570\u53ca\u7236\u7c7b\u51fd\u6570\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668 @_trace\uff0c\u5728\u6b64\u88c5\u9970\u5668\u4e2d\u6211\u4eec\u80fd\u52a8\u6001\u7684\u6355\u83b7\u6240\u8c03\u7528\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff08func.__doc__\uff09\uff0c\u901a\u8fc7\u65e5\u5fd7\u8f93\u51fa\u5668\u5c06\u5176\u8f93\u51fa\u5373\u53ef\u3002 \u5b9e\u73b0\u6b65\u9aa4\uff1a \u901a\u8fc7 inspect.getmembers \u83b7\u53d6\u88ab\u88c5\u9970\u7684\u7c7b\u4e0b\u6240\u6709\u51fd\u6570\uff0c\u5305\u542b\u9759\u6001\u65b9\u6cd5\uff0c\u7c7b\u65b9\u6cd5\uff0c\u5b9e\u4f8b\u65b9\u6cd5\uff1b \u901a\u8fc7 setattr(\u7c7b, \u65b9\u6cd5, _trace\uff09 \u7684\u65b9\u5f0f\uff0c\u7ed9\u7b26\u5408\u6761\u4ef6\u7684\u51fd\u6570\uff0c\u52a8\u6001\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_3","title":"3\u3001\u65e5\u5fd7\u914d\u7f6e","text":"[log_cli]\n;\u65e5\u5fd7\u76f8\u5173\u914d\u7f6e\uff08\u4e0d\u6253\u5370\u6784\u9020\u51fd\u6570\u548c\u9b54\u6cd5\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff09\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = INFO\n# ============= \u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u914d\u7f6e ================\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u5f00\u5934\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7, \u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_STARTSWITH = Assert\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u7ed3\u5c3e\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_ENDSWITH = Widget\n;\u652f\u6301\u7c7b\u540d\u5305\u542b xxx \u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_CONTAIN = ShortCut\n# ==============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_3","title":"4\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u5728\u5e94\u7528\u5e93 widget \u65b9\u6cd5\u5e93\u91cc\u9762\uff0c\u53ea\u9700\u8981\u5728\u51fa\u53e3\u6587\u4ef6\u52a0\u4e0a\u7c7b\u88c5\u9970\u5668\uff0c\u5c31\u53ef\u4ee5\u5b9e\u73b0\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u4e86\uff1b # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6ce8\u610f\uff0c\u662f\u7c7b\u88c5\u9970\u5668\u3002 \u5b9e\u4f8b\uff1a # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\n@classmethod\ndef find_dfm_image(cls, *elements, multiple=False, rate=0.9):\n\"\"\"\n \u67e5\u627e\u56fe\u7247 {{elements}}.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e {{rate}} \u7684\u5750\u6807\n :param elements:\n :param multiple:\n :return:\n \"\"\"\nelement = tuple(map(lambda x: f\"{Config.PIC_RES_PATH}/{x}\", elements))\nreturn cls.find_image(*element, multiple=multiple)\n \u8c03\u7528\u65b9\u6cd5\u65f6\uff1a DfmWidget.find_dfm_image(\"dfm_001\")\n \u81ea\u52a8\u8f93\u51fa\u7684\u65e5\u5fd7\uff1a >> x86_64-uos-6: 02/28 17:48:47 | INFO | logger_utils: [find_dfm_image]: \u67e5\u627e\u56fe\u7247 dfm_001.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e 0.9 \u7684\u5750\u6807\n \u52a0\u4e0a\u88c5\u9970\u5668 @log \u4e4b\u540e\uff0c\u65b9\u6cd5\u5c42\u6240\u6709\u7684\u51fd\u6570\uff08\u5305\u62ec\u5b9e\u4f8b\u65b9\u6cd5\u3001\u7c7b\u65b9\u6cd5\u3001\u9759\u6001\u65b9\u6cd5\uff09\u90fd\u4e0d\u9700\u8981\u518d\u5199\u65e5\u5fd7\u4ee3\u7801\uff0c\u6267\u884c\u7684\u65f6\u5019\u4f1a\u81ea\u52a8\u8f93\u51fa\uff0c\u5e76\u4e14\u6240\u6709\u8c03\u7528\u7684\u65b9\u6cd5\u4f1a\u4ee5 allure.step \u7684\u65b9\u5f0f\uff0c\u5c55\u793a\u5728 allure \u62a5\u544a\u4e2d\uff0c\u5728\u62a5\u544a\u4e2d\u66f4\u80fd\u4e00\u76ee\u4e86\u7136\u7684\u770b\u5230\u7528\u4f8b\u6267\u884c\u6b65\u9aa4\u3002 \u3010\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\u3011 \u901a\u8fc7\u89c2\u5bdf\u524d\u9762\u7684\u4f8b\u5b50\uff0c\u7ec6\u5fc3\u7684\u540c\u5b66\u53ef\u80fd\u8fd8\u53d1\u73b0\u4e86\u4e00\u4e2a\u5c0f\u7ec6\u8282\uff1a\u51fd\u6570\u529f\u80fd\u8bf4\u660e\u4e2d\uff0c\u4e24\u5bf9\u5927\u62ec\u53f7\u4e2d\u7684\u5185\u5bb9 {{elements}} \u4f5c\u4e3a\u53d8\u91cf\u8f93\u51fa\u51fa\u6765\u4e86\uff1b \u6ca1\u9519\uff0c\u8fd9\u5c31\u662f\u6211\u4eec\u53c2\u8003Django \u548c jinja2 \u7684\u6a21\u677f\u8bed\u6cd5\u8bbe\u8ba1\u51fa\u7684\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\uff0c\u4f7f\u7528\u65b9\u6cd5\u5f88\u7b80\u5355\uff0c\u7528\u4e24\u5bf9\u5927\u62ec\u53f7\u628a\u51fd\u6570\u7684\u53c2\u6570\u62ec\u8d77\u6765\uff0c\u8fd9\u6837\u5728\u65e5\u5fd7\u8f93\u51fa\u7684\u65f6\u5019\u5c31\u80fd\u628a\u8c03\u7528\u51fd\u6570\u65f6\u53c2\u6570\u7684\u503c\u8f93\u51fa\u51fa\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_7","title":"\u516b\u3001\u73af\u5883\u90e8\u7f72","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_6","title":"1\u3001\u539f\u5219","text":"YouQu \u7684\u73af\u5883\u4f9d\u8d56\u4e00\u76f4\u575a\u6301 2 \u4e2a\u539f\u5219\uff1a \u6700\u5c0f\u73af\u5883\u4f9d\u8d56\u539f\u5219 \u6709\u4e9b\u540c\u5b66\u5199\u4e00\u4e9b\u529f\u80fd\uff0c\u9996\u5148\u60f3\u5230\u7684\u5c31\u662f\u53bb\u641c\u7d22\u5f15\u64ce\u641c\u4e00\u4e0b\uff0c\u770b\u6709\u6ca1\u6709\u73b0\u6210\u7684\u5de5\u5177\u6216\u8005\u4ee3\u7801\u76f4\u63a5\u80fd\u7528\uff0c\u7f8e\u5176\u540d\u66f0\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\uff0c\u522b\u4eba\u5df2\u7ecf\u9020\u597d\u4e86\u8f6e\u5b50\u54b1\u4eec\u5c31\u4e0d\u8981\u91cd\u590d\u53bb\u9020\u4e86\uff0c\u7136\u540e\u4e00\u5207\u4f3c\u4e4e\u90fd\u53d8\u5f97\u90a3\u4e48\u7684\u7406\u6240\u5e94\u5f53\u3002 \u5f53\u7136\u8fd9\u6837\u505a\u65e0\u53ef\u539a\u975e\uff0c\u6211\u76f8\u4fe1\u6709\u8fd9\u6837\u60f3\u6cd5\u5e76\u4e14\u4e00\u76f4\u8df5\u884c\u8fd9\u6837\u505a\u6cd5\u7684\u540c\u5b66\u4e0d\u5728\u5c11\u6570\uff0c\u4f46\u8fd9\u6837\u505a\u6709\u4e00\u4e2a\u5f88\u4e25\u91cd\u7684\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f60\u5199\u4e00\u4e2a\u5927\u578b\u9879\u76ee\u65f6\uff0c\u4f60\u4f1a\u5f15\u5165\u975e\u5e38\u975e\u5e38\u975e\u5e38\u591a\u7684\u4f9d\u8d56\uff0c\u6bd4\u5982\u8981\u505a\u4e2a\u63a5\u53e3\u8bf7\u6c42\u8981\u7528 requests\u3001\u8bfb\u5199\u4e2a\u6570\u636e\u7528 pandas\u3001\u5199\u4e2a\u8868\u683c\u7528 pyopenxl\u3001\u89e3\u6790\u4e2a\u6587\u672c\u8981\u7528\u8fd9\u4e2a\u90a3\u4e2a\u4e09\u65b9\u5e93 ... \u3002 \u6211\u8ba4\u4e3a\u8fd9\u662f\u975e\u5e38\u4e0d\u597d\u7684\u4e60\u60ef\uff0c\u5728\u5b9e\u73b0\u4e00\u4e2a\u529f\u80fd\u7684\u65f6\u5019\uff0c\u9996\u5148\u6211\u4eec\u5e94\u8be5\u53bb\u60f3\u81ea\u5df1\u600e\u4e48\u6837\u53bb\u5b9e\u73b0\uff0c\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff1b \u5982\u679c\u4f60\u4e0d\u4f1a\uff0c\u4f60\u53ef\u4ee5\u53bb\u5b66\u4e60\u4e09\u65b9\u5e93\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u522b\u4eba\u4e09\u65b9\u5e93\u4e5f\u662f\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\u7684\uff0c\u4e3a\u4ec0\u4e48\u54b1\u4eec\u4e0d\u884c\u5462\uff1b\u5982\u679c\u522b\u4eba\u7684\u4f60\u5b9e\u5728\u662f\u770b\u4e0d\u61c2\uff0c\u60f3\u5c3d\u4e00\u5207\u529e\u6cd5\u786e\u5b9e\u505a\u4e0d\u51fa\u6765\uff0c\u90a3\u518d\u8003\u8651\u5f15\u5165\u8fd9\u4e2a\u4e09\u65b9\u5e93\uff0c\u6211\u8ba4\u4e3a\u8fd9\u6837\u662f\u6ca1\u95ee\u9898\u7684\uff0c\u6bd5\u7adf\u54b1\u4eec\u6bb5\u4f4d\u8fd8\u4e0d\u591f\uff0c\u4f46\u5e0c\u671b\u5c06\u6765\u6709\u4e00\u5929\u6211\u4eec\u53ef\u4ee5\u3002 \u8fd9\u6837\u7684\u505a\u6cd5\u624d\u5e94\u8be5\u662f\u201c\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\u201d\u6b63\u786e\u7684\u64cd\u4f5c\u3002\u4e0d\u4f1a\u6ca1\u5173\u7cfb\uff0c\u770b\u770b\u522b\u4eba\u662f\u600e\u4e48\u5b9e\u73b0\u7684\uff0c\u81ea\u5df1\u518d\u6478\u7d22\u7740\u5199\u51fa\u6765\uff0c\u8fd9\u6837\u81ea\u5df1\u624d\u80fd\u6709\u6240\u63d0\u9ad8\uff0c\u4e0d\u7136\u4f60\u5c31\u53ea\u4f1a\u7528\u522b\u4eba\u7684\u4e1c\u897f\uff1b\u90a3\u4e9b\u5632\u7b11\u3001\u6279\u8bc4\u6211\u4eec\u91cd\u590d\u9020\u8f6e\u5b50\u7684\u4eba\uff0c\u5148\u60f3\u60f3\u81ea\u5df1\u4f1a\u9020\u8f6e\u5b50\u5417\u3002 \u672c\u7740\u81ea\u5df1\u5b9e\u73b0\u80fd\u5b9e\u73b0\u7684\u4e00\u5207\u7684\u539f\u5219\uff0cYouQu \u6846\u67b6\u505a\u5230\u4e86\u975e\u5e38\u5c11\u7684\u73af\u5883\u4f9d\u8d56\uff0c\u800c\u4e14\u6211\u4eec\u4ecd\u5728\u4e0d\u65ad\u52aa\u529b\uff0c\u51cf\u5c11\u73af\u5883\u90e8\u7f72\u7684\u4f9d\u8d56\u3002 \u6700\u5c0f\u4ed3\u5e93\u4f53\u79ef\u539f\u5219 \u5927\u6587\u4ef6\u4e0d\u80fd\u4e0a\u4f20\u5230\u5de5\u7a0b\u91cc\u9762\uff0c\u4fdd\u6301\u6574\u4e2a\u5de5\u7a0b\u7684\u8f7b\u91cf\u5316\uff0c\u8fd9\u6837\u5728\u514b\u9686\u4ee3\u7801\u7684\u65f6\u5019\u624d\u80fd\u975e\u5e38\u5feb\u901f\u65b9\u4fbf\u4f7f\u7528\uff0c\u6211\u4eec\u89c1\u8fc7\u4e00\u4e2a AT \u5de5\u7a0b clone \u5927\u5c0f\u8fbe\u5230\u597d\u51e0\u4e2a G\uff0c\u7b80\u76f4\u4e0d\u53ef\u601d\u8bae\u3002 \u5176\u5b9e\u4ee3\u7801\u6587\u4ef6\u7684\u5927\u5c0f\u662f\u5f88\u5c0f\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u7eaf\u5199\u4ee3\u7801\u968f\u4fbf\u5199\u5de5\u7a0b\u4e5f\u4e0d\u4f1a\u592a\u5927\uff0c\u800c\u6587\u6863\uff08\u5305\u542b\u63d2\u56fe\uff09\u7b49\u8d44\u6e90\u5374\u662f\u5f88\u5360\u7a7a\u95f4\u3002 \u56e0\u6b64\u6211\u4eec\u9009\u62e9\u5c06 YouQu \u7684\u6587\u6863\u5de5\u7a0b\u5355\u72ec\u8fc1\u51fa\u5230\u72ec\u7acb\u7684\u4ed3\u5e93 youqu-docs \u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_6","title":"2\u3001\u5b89\u88c5","text":"\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u8fd0\u884c env.sh \u5373\u53ef\u3002 bash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_4","title":"3\u3001\u5b9a\u5236\u4f9d\u8d56","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_2","title":"3.1\u3001\u65b0\u589e\u4f9d\u8d56","text":"\u5982\u679c\u5e94\u7528\u5e93\u8fd8\u9700\u8981\u5176\u4ed6 Python \u4f9d\u8d56\u5e93\uff0c\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a requirement.txt \u6587\u4ef6\uff1b autotest_xxx\n\u251c\u2500\u2500 requirement.txt\n\u251c\u2500\u2500 case ...\n \u91cc\u9762\u5199\u5165\u9700\u8981\u5b89\u88c5\u7684\u4e09\u65b9\u4f9d\u8d56\uff0c\u6bd4\u5982\u50cf\u8fd9\u6837\uff1a # requirement.txt\nPyYAML==6.0 # \u6307\u5b9a\u5b89\u88c5\u67d0\u4e2a\u7248\u672c\nrequests # \u672a\u6307\u5b9a\u7248\u672c\u5219\u5b89\u88c5\u6700\u65b0\u7248\n \u5728\u6267\u884c bash env.sh \u65f6\u4f1a\u4e00\u5e76\u5c06\u5176\u5b89\u88c5\u3002 \u5982\u679c\u591a\u4e2a\u5e94\u7528\u5e93\u90fd\u5b58\u5728 requirement.txt \u6587\u4ef6\uff0c\u6267\u884c env.sh \u65f6\u4f1a\u5c06\u591a\u4e2a requirement.txt \u6587\u4ef6\u4e00\u5e76\u52a0\u8f7d\uff1b\u90a3\u4e48\u4e00\u5b9a\u8981\u6ce8\u610f\u591a\u4e2a requirement.txt \u6587\u4ef6\u53ef\u80fd\u5b58\u5728\u76f8\u540c\u7684\u4f9d\u8d56\u88ab\u6307\u5b9a\u5b89\u88c5\u4e0d\u540c\u7248\u672c\u7b49\u7b49\u517c\u5bb9\u6027\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32_1","title":"3.2\u3001\u88c1\u526a\u4f9d\u8d56","text":"\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0c\u53ef\u80fd\u4f60\u53ea\u9700\u8981\u5b89\u88c5\u4e00\u4e9b\u6700\u6700\u57fa\u7840\u7684\u4f9d\u8d56\uff0c\u5176\u4ed6\u7684\u90fd\u4e0d\u9700\u8981\uff0c\u6bd4\u5982\u7eaf\u63a5\u53e3\u81ea\u52a8\u5316\u7684\u9879\u76ee\uff0c\u5b83\u4e0d\u9700\u8981 UI \u81ea\u52a8\u5316\u76f8\u5173\u7684\u4f9d\u8d56\u3002 \u4f60\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\uff0c\u5b58\u653e\u4e00\u4e2a BASICENV \u7684\u666e\u901a\u6587\u4ef6\uff0c\u91cc\u9762\u4e0d\u9700\u8981\u5199\u4efb\u4f55\u5185\u5bb9\uff0c\u8fd9\u6837\u6267\u884c env.sh \u65f6\uff0c\u53ea\u4f1a\u5b89\u88c5\u6700\u57fa\u7840\u7684\u4f9d\u8d56\u3002 autotest_xxx\n\u251c\u2500\u2500 BASICENV # \u53ef\u4ee5\u4f7f\u7528\uff1atouch BASICENV \u521b\u5efa\u6587\u4ef6\n\u251c\u2500\u2500 case ...\n \u57fa\u7840\u4f9d\u8d56\u4ec5\u5b89\u88c5\u4ee5\u4e0b\u51e0\u4e2a\u5305\uff1a pytest # pytest\npytest-rerunfailures # \u5931\u8d25\u91cd\u8dd1\u63d2\u4ef6\npytest-timeout # \u7528\u4f8b\u8d85\u65f6\u63d2\u4ef6\nallure-pytest # \u751f\u6210 allure \u62a5\u544a\u63d2\u4ef6\nallure.deb # allure \u62a5\u544a\u67e5\u770b\u5de5\u5177\n \u88c1\u526a\u4f9d\u8d56 \u548c \u65b0\u589e\u4f9d\u8d56 \u662f\u4e0d\u51b2\u7a81\u7684\uff0c\u53ef\u4ee5\u540c\u65f6\u4f7f\u7528\u3002 \u6b64\u65b9\u6848\u9ed8\u8ba4\u4e3a\u865a\u62df\u73af\u5883\u90e8\u7f72\uff0c\u5982\u679c\u4f60\u60f3\u76f4\u63a5\u90e8\u7f72\u5728\u672c\u673a\u4e0a\uff1a bash env_dev.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_8","title":"\u4e5d\u3001\u5931\u8d25\u5f55\u5c4f","text":"\u5f55\u5c4f\u5176\u5b9e\u662f\u4e00\u79cd\u89c6\u9891\u5f62\u5f0f\u7684\u65e5\u5fd7\uff0c\u56e0\u4e3a\u5f88\u591a\u65f6\u5019\u6211\u4eec\u5728\u67e5\u770b\u65e5\u5fd7\u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u51c6\u786e\u7684\u5b9a\u4f4d\u5230\u7528\u4f8b\u5931\u8d25\u7684\u5177\u4f53\u539f\u56e0\uff0c\u56e0\u6b64\u7528\u4f8b\u7684\u5f55\u5c4f\u80fd\u8ba9\u6211\u4eec\u770b\u5230\u7528\u4f8b\u5728\u6267\u884c\u8fc7\u7a0b\uff1b \u3010\u4f7f\u7528\u65b9\u6cd5\u3011 \u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u5173\u6ce8 2 \u4e2a\u53c2\u6570\uff1b ;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\u3002\n;\u6ce8\u610f\uff0c\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u4e0d\u80fd\u5c0f\u4e8e\u5931\u8d25\u5f55\u5c4f\u6b21\u6570\uff0c\u5373 RERUN >= RECORD_FAILED_CASE\nRECORD_FAILED_CASE = 1\n \u9ed8\u8ba4\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u662f 1 \u6b21\uff1b RECORD_FAILED_CASE = 1 \u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff1b RECORD_FAILED_CASE = 0 \u8868\u793a\u4e0d\u7ba1\u7528\u4f8b\u6210\u529f\u6216\u5931\u8d25\u90fd\u5f55\u5c4f\uff1b \u5f55\u5c4f\u662f\u8981\u5360\u7528\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u7279\u522b\u662f\u5728\u4e00\u4e9b\u914d\u7f6e\u8f83\u4f4e\u7684\u673a\u5668\u4e0a\u4f1a\u5f88\u660e\u663e\uff0c\u6240\u4ee5\u4f60\u9700\u8981\u8003\u8651\u662f\u5426\u6709\u5fc5\u8981\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1b \u4f7f\u7528 manage.py \u6267\u884c\u7528\u4f8b\u9ed8\u8ba4\u8bfb\u53d6\u5230 globalconfig.ini \u91cc\u9762\u7684\u53c2\u6570\uff0c\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report/record \u76ee\u5f55\u4e0b\u4fdd\u5b58\u5931\u8d25\u7528\u4f8b\u7684\u5f55\u5c4f\u548c\u65ad\u8a00\u7684\u90a3\u4e2a\u65f6\u95f4\u70b9\u7684\u622a\u5c4f\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7\u89c6\u9891\u6587\u4ef6\u770b\u5230\u5931\u8d25\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u90fd\u53d1\u751f\u4e86\u4ec0\u4e48\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#wayland","title":"\u5341\u3001Wayland \u9002\u914d","text":"Wayland \u4e0b\u81ea\u52a8\u5316\u4e3b\u8981\u95ee\u9898\u662f X11 \u4e0b\u7684\u952e\u9f20\u64cd\u4f5c\u65b9\u6cd5\u65e0\u6cd5\u4f7f\u7528\uff0c\u6bd4\u5982 Xdotool\u3001 PyAutoGUI\u3001Xwininfo \u7b49\u7b49\uff1b YouQu \u5728 Wayland \u4e0b\u517c\u5bb9\u9002\u914d\uff0cenv.sh \u5728 Wayland \u4e0b\u6267\u884c\u65f6\u4f1a\u5b89\u88c5\u81ea\u7814\u7684\u952e\u9f20\u64cd\u4f5c\u670d\u52a1\uff08\u53ef\u80fd\u5b58\u5728\u4e00\u4e9b\u4f9d\u8d56\u62a5\u9519\uff0c\u6309\u7167\u6ce8\u91ca\u89e3\u51b3\u5373\u53ef\uff09\uff0c\u6846\u67b6\u6838\u5fc3\u5e93\u4e5f\u9488\u5bf9\u6027\u7684\u505a\u4e86\u9002\u914d\uff0c\u4e0a\u5c42\u7528\u4f8b\u5b8c\u5168\u4e0d\u7528\u5173\u5fc3\u673a\u5668\u662fWayland \u8fd8\u662f X11\uff0c\u6846\u67b6\u4f1a\u6839\u636e\u6267\u884c\u65f6\u72b6\u6001\u81ea\u52a8\u5224\u65ad\u8d70\u4e0d\u540c\u7684\u903b\u8f91\uff1b \u7b80\u5355\u8bb2\u5c31\u662f\uff0c\u5e94\u7528\u5e93\u53ea\u9700\u8981\u7ef4\u62a4\u4e00\u5957\u7528\u4f8b\u811a\u672c\u5373\u53ef\u3002 \u3010\u7528\u4f8b\u517c\u5bb9\u3011 \u56e0\u4e3a Wayland \u4e0b\u6709\u4e9b\u5e94\u7528\u7684\u754c\u9762\u663e\u793a\u548c\u529f\u80fd\u672c\u8eab\u5b58\u5728\u4e00\u4e9b\u5dee\u5f02\uff0c\u7528\u4f8b\u5c42\u53ef\u80fd\u9700\u8981\u5bf9\u8fd9\u90e8\u5206\u7528\u4f8b\u505a\u903b\u8f91\u5224\u65ad\uff0c\u4f7f\u7528\u5168\u5c40\u914d\u7f6e\u91cc\u9762\u7684\u5e38\u91cf\u8fdb\u884c\u903b\u8f91\u7f16\u5199\u5373\u53ef\uff1a from setting.globalconfig import GlobalConfig\n# GlobalConfig.IS_WAYLAND \u83b7\u53d6\u5230\u5f53\u524d\u7684\u663e\u793a\u670d\u52a1\u5668\uff08bool\uff09\n# \u5e94\u7528\u5e93 Config \u7ee7\u627f GlobalConfig\nif Config.IS_WAYLAND:\npass\nif Config.IS_X11:\npass\n \u6bd4\u5982\u7528\u4f8b\u91cc\u9762\u5982\u679c\u65ad\u8a00\u7684\u56fe\u7247\u4e0d\u540c\uff1a if Config.IS_WAYLAND:\nself.assert_image_exist(\"wayland_XXX\")\nelse:\nself.assert_image_exist(\"x11_XXX\")\n \u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u811a\u672c\u5728 Wayland \u548c X11 \u4e0b\u90fd\u53ef\u4ee5\u8dd1\uff0cso easy \u662f\u4e0d\u662f\uff1f\u5b8c\u5168\u6ca1\u5fc5\u8981\u4e13\u95e8\u62c9\u65b0\u5206\u652f\u8fdb\u884c Wayland \u9002\u914d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_9","title":"\u5341\u4e00\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_7","title":"1. \u76ee\u5f55\u7ed3\u6784","text":"\u6267\u884c\u65f6\u4f1a\u5728\u6839\u76ee\u5f55\u4e0b\u52a8\u6001\u751f\u6210 report \u76ee\u5f55\uff0c\u6240\u6709\u7684\u62a5\u544a\u76f8\u5173\u7684\u6587\u4ef6\u4f1a\u7edf\u4e00\u5b58\u653e\u5728\u91cc\u9762\uff0c\u793a\u4f8b\uff1a /report\n \u251c\u2500\u2500 allure # allure\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json\n \u251c\u2500\u2500 allure_html # \u751f\u6210\u7684html\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 index.html \u251c\u2500\u2500 allure_back # allure\u62a5\u544a\u5907\u4efd\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 20221108114823\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json\n \u251c\u2500\u2500 json # json\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 result_deepin-music_20221109134736_1081333.json\n \u251c\u2500\u2500 logs # \u65e5\u5fd7\u6587\u4ef6\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 2022-11-10_debug.log \u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-10_error.log\n \u251c\u2500\u2500 record # \u5f55\u5c4f\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-09\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 15\u65f614\u520609\u79d2_test_music_303_2_autotest.mp4\n \u2514\u2500\u2500 xml # xml\u62a5\u544a\n\u2514\u2500\u2500 autotest_deepin_music-20221109134736.xml\n \u9ed8\u8ba4\u60c5\u51b5\u4e0b\u540c\u65f6\u751f\u6210 html\u3001xml\u3001json\u4e09\u79cd\u5f62\u5f0f\u7684\u62a5\u544a\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_7","title":"2. \u5b9a\u5236\u62a5\u544a","text":"\u6211\u4eec\u5bf9 allure \u62a5\u544a\u8fdb\u884c\u4e86\u4e00\u7cfb\u5217\u7684\u5b9a\u5236\uff1a \u5b9a\u5236 logo\u3001title\u3001\u62a5\u544a\u9ed8\u8ba4\u8bed\u8a00\u4e3a\u4e2d\u6587\uff1b \u52a0\u5165\u4e86\u7528\u4f8b\u65ad\u8a00\u5931\u8d25\u65f6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u4ee5\u53ca\u6b64\u65f6\u56fe\u50cf\u5bf9\u6bd4\u7684\u6a21\u677f\u56fe\u7247\uff1b \u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\uff0c\u4f60\u53ef\u4ee5\u5728 html \u62a5\u544a\u4e2d\u76f4\u63a5\u770b\u5f55\u5236\u7684\u89c6\u9891\uff1b \u52a0\u5165\u4e86 IP \u5730\u5740\u3001\u7cfb\u7edf\u4fe1\u606f\u3001\u955c\u50cf\u7248\u672c\u7b49\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_5","title":"3. \u67e5\u770b\u62a5\u544a","text":" \u672c\u5730\u6267\u884c \u5728 report/allure \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u4e00\u5806\u6587\u672c\u6587\u4ef6\uff0c\u8fd9\u4e9b\u662f allure \u63d2\u4ef6\u751f\u6210\u7684\u62a5\u544a\u6e90\u6570\u636e\uff0c\u6211\u4eec\u5728 report/allure_html \u76ee\u5f55\u4e0b\u7ed9\u4f60\u751f\u6210\u4e86 html \u6587\u4ef6\uff0c\u4f46\u662f\u4f60\u4e0d\u80fd\u76f4\u63a5\u901a\u8fc7\u6d4f\u89c8\u5668\u6253\u5f00 index.html \u6587\u4ef6\uff0c\u56e0\u4e3a allure \u7684\u62a5\u544a\u90fd\u662f\u57fa\u4e8e\u5728\u7ebf\u7684\u670d\u52a1\uff0c\u4f60\u5e94\u8be5\u8fd9\u6837\u6253\u5f00\uff1a allure open report/allure_html\n \u4f7f\u7528 manage.py \u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u5728\u7ec8\u7aef\u7684\u6700\u540e\u4e00\u884c\uff0c\u6211\u4eec\u4f1a\u7ed9\u4f60\u8f93\u51fa\u6253\u5f00\u62a5\u544a\u7684\u547d\u4ee4\uff0c\u76f4\u63a5\u590d\u5236\u5b83\u5728\u7ec8\u7aef\u6267\u884c\u5c31\u53ef\u4ee5\u67e5\u770b\u4e86\uff0c\u50cf\u8fd9\u6837\uff1a \u7ec8\u7aef\u6267\u884c\u547d\u4ee4: allure open /tmp/youqu/report/allure_html \u67e5\u770b\u62a5\u544a \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 Pycharm \u91cc\u9762\u627e\u5230 index.html \u6587\u4ef6\uff0c\u7136\u540e\u53f3\u952e\u9009\u62e9\u6d4f\u89c8\u5668\u6253\u5f00\uff0c\u6216\u8005\u4f60\u53ef\u4ee5\u7528\u4e00\u4e2a http \u670d\u52a1\u6253\u5f00\u3002 \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 report/allure \u76ee\u5f55\u4e0b\u67e5\u770b\u62a5\u544a\uff1a allure serve report/allure\n \u8fdc\u7a0b\u6267\u884c \u8fdc\u7a0b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\uff0c\u4f1a\u5c06\u6240\u6709\u8fdc\u7a0b\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u62a5\u544a\u90fd\u6536\u96c6\u5230 report/allure \u76ee\u5f55\u4e0b\uff0c\u5206\u522b\u6309\u7167\u673a\u5668\u7684 IP \u7b49\u5efa\u4e86\u4e0d\u540c\u7684\u76ee\u5f55\uff0c\u4f60\u53ef\u4ee5\u5728\u8fd9\u4e9b\u76ee\u5f55\u91cc\u9762\u53bb\u67e5\u770b\u5bf9\u5e94\u7684\u6d4b\u8bd5\u62a5\u544a\uff0c\u67e5\u770b\u65b9\u6cd5\u548c\u524d\u9762\u672c\u5730\u6267\u884c\u67e5\u770b\u7684\u65b9\u6cd5\u4e00\u6837\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_10","title":"\u5341\u4e8c\u3001\u9759\u6001\u4ee3\u7801\u626b\u63cf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_8","title":"1. \u63d0\u524d\u89e3\u51b3\u4ee3\u7801\u95ee\u9898","text":"\u4e3a\u4e86\u5e2e\u52a9\u5f00\u53d1\u8005\u7edf\u4e00\u4ee3\u7801\u98ce\u683c\uff0cPython \u793e\u533a\u63d0\u51fa\u4e86 PEP8 \u4ee3\u7801\u7f16\u7801\u98ce\u683c\uff0cPython \u5b98\u65b9\u540c\u65f6\u63a8\u51fa\u4e86\u4e00\u4e2a\u68c0\u67e5\u4ee3\u7801\u98ce\u683c\u662f\u5426\u7b26\u5408 PEP8 \u7684\u5de5\u5177\uff0c\u540d\u5b57\u4e5f\u53eb PEP8\u3002 \u4f46\u662f\uff0cPycharm \u91cc\u9762\u7684 PEP8 \u63d2\u4ef6\u5b9e\u9645\u4e0a\u5e76\u4e0d\u80fd\u53d1\u73b0\u5f88\u591a\u4ee3\u7801\u95ee\u9898\uff0c\u8fd9\u4e9b\u95ee\u9898\u5e76\u4e0d\u4f1a\u5728\u8fd0\u884c\u65f6\u62a5\u9519\uff0c\u56e0\u4e3a\u4ece Python \u8bed\u8a00\u89d2\u5ea6\u5e76\u4e0d\u5173\u5fc3\u8fd9\u4e9b\u95ee\u9898\uff0c\u5728 Pycharm \u7f16\u8f91\u5668\u91cc\u9762\u4f7f\u7528\u5feb\u6377\u952e ctrl + alt + L\uff0c\u6709\u4e00\u70b9\u70b9\u683c\u5f0f\u5316\u7684\u6548\u679c\uff0c\u80fd\u89e3\u51b3\u4e00\u4e9b\u7a7a\u683c\u3001\u6362\u884c\u7b49\u5c0f\u95ee\u9898\u3002 \u8fd9\u91cc\u63a8\u8350\u4e00\u4e2a Python \u793e\u533a\u6d41\u884c\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff1a Black\uff0c\u53f7\u79f0\u4e0d\u59a5\u534f\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff0c\u5b83\u68c0\u6d4b\u5230\u4e0d\u7b26\u5408\u89c4\u8303\u7684\u4ee3\u7801\u98ce\u683c\u76f4\u63a5\u5c31\u5e2e\u4f60\u5168\u90e8\u683c\u5f0f\u5316\u597d\uff0c\u5c31\u662f\u8fd9\u4e48\u521a\uff01 \u5b89\u88c5\uff1a sudo pip3 install black \n \u4f7f\u7528\u65b9\u6cd5\uff1a black ${CheckPath}\n \u4f7f\u7528\u8fd9\u4e2a\u5de5\u5177\u683c\u5f0f\u5316\u4e4b\u540e\uff0c\u4ee3\u7801\u4f1a\u88ab\u81ea\u52a8\u8c03\u6574\uff0c\u521a\u5f00\u59cb\u4f60\u53ef\u80fd\u4f1a\u89c9\u5f97\u8c03\u6574\u5f97\u5f88\u5938\u5f20\uff0c\u6ca1\u5173\u7cfb\u575a\u6301\u770b\uff0c\u4e60\u60ef\u4e4b\u540e\uff0c\u4f60\u4f1a\u89c9\u5f97\u5f88\u4f18\u96c5\uff0c\u6ca1\u9519\uff0c\u8fd9\u5c31\u662f Pythonic Code \u7684\u6838\u5fc3\uff0c\u8bf7\u4fdd\u6301\u4f18\u96c5\uff5e\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_8","title":"2. \u4ee3\u7801\u626b\u63cf\u5de5\u5177","text":"\u4f7f\u7528\u6839\u76ee\u5f55\u4e0b pylint.sh \u626b\u63cf\u4ee3\u7801\uff0c\u5728 report \u76ee\u5f55\u4e0b\u67e5\u770b\u4ee3\u7801\u626b\u63cf\u62a5\u544a\uff0c\u5982\u679c\u6709\u4ee3\u7801\u95ee\u9898\u8bf7\u63d0\u524d\u89e3\u51b3\u4e4b\u540e\u518d\u63d0\u4ea4\u3002 \u6b64\u811a\u672c\u5df2\u7ecf\u4f7f\u7528 Python \u793e\u533a\u6700\u6d41\u884c\u7684\u4ee3\u7801\u626b\u63cf\u5de5\u5177 Pylint \u8fdb\u884c\u4ee3\u7801\u626b\u63cf\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a bash pylint.sh\n \u8fd0\u884c\u4e4b\u540e\u4f1a\u63d0\u793a\u4f60\u8981\u626b\u63cf\u7684\u76ee\u5f55\uff0c\u6bd4\u5982\u8f93\u5165 apps \uff0c\u5219\u4f1a\u626b\u63cf apps \u4e0b\u7684\u6240\u6709 Python \u4ee3\u7801\u3002 \u5728 setting/pylintrc.cfg \u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u76f8\u5173\u914d\u7f6e\uff0c\u626b\u63cf\u5b8c\u6210\u4e4b\u540e\u5728 report/pylints \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u626b\u63cf\u62a5\u544a\u3002 \u4ee3\u7801\u63d0\u4ea4\u9700\u901a\u8fc7 git review \u63d0\u4ea4\u5230 gerrit \uff0c\u4eba\u5de5 Code Review \u901a\u8fc7\u4e4b\u540e\u5408\u5165\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_11","title":"\u5341\u4e09\u3001\u63d0\u4ea4\u4ee3\u7801","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_9","title":"1. \u5b89\u88c5\u4f9d\u8d56","text":"sudo apt install git-review\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_9","title":"2. \u63d0\u4ea4\u6a21\u677f","text":"\u5728 ~ \u76ee\u5f55\u4e0b\u65b0\u5efa\u6587\u4ef6\uff0c\u5e76\u547d\u540d\u4e3a gitcommit_template \u5c06\u4ee5\u4e0b\u5185\u5bb9\u5199\u5165\u6587\u4ef6\u5f53\u4e2d\uff1a # commit type :fix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style(\u98ce\u683c\u4fee\u6539)\u3001refactor(\u91cd\u6784)\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test(\u6d4b\u8bd5) + \u7b80\u5355\u63cf\u8ff0. \u9ed8\u8ba4fix,\u6839\u636e\u60c5\u51b5\u4fee\u6539\nfix: \n\n# \u8be6\u7ec6\u8bf4\u660e\u4ee3\u7801\u7684\u6539\u52a8\uff0c\u5305\u542b\u4ee3\u7801\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u4ee5\u53ca\u4e3a\u4ec0\u4e48\u8fd9\u4e48\u505a\uff0c\u53ef\u80fd\u4f1a\u5f71\u54cd\u54ea\u4e9b\u529f\u80fd\u3002\u5bf9\u4e8e\u4ee3\u7801\u7684\u5ba1\u6838\u8005\uff0c\u9700\u8981\u4ece\u8fd9\u6bb5\u63cf\u8ff0\u4e2d\u80fd\u5b8c\u5168\u7406\u89e3\u4ee3\u7801\u4e2d\u6240\u6709\u6539\u52a8\u7684\u5185\u5bb9\nDescription: \n\n# \u5199\u4e00\u6bb5\u9762\u5411\u4e8e\u4ea7\u54c1\u7684\u603b\u7ed3\u6027\u5185\u5bb9\uff0c\u7528\u4e8e\u81ea\u52a8\u751f\u6210crp\u4e0a\u7684changlog\uff0c\u9700\u8981\u6ce8\u610f\u7684\u4e8b\uff0c\u8fd9\u6bb5\u63cf\u8ff0\u5fc5\u987b\u4ece\u4ea7\u54c1\u7684\u89d2\u5ea6\u8003\u8651\u3002\nLog: \n\n# \u5173\u8054pms\u4e0a\u7684bug\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94bug\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4fee\u590dbug\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Bug: \n\n# \u4fee\u590d github issue \n#Issue: \n\n# \u5173\u8054pms\u4e0a\u7684\u4efb\u52a1\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94\u4efb\u52a1\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4efb\u52a1\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Task: \n \u547d\u4ee4\u884c\u6267\u884c: git config --global commit.template ~/gitcommit_template\n \u6b64\u547d\u4ee4\u5c06\u6a21\u677f\u52a0\u5165\u5230 git \u7684\u63d0\u4ea4\u6a21\u677f\u4e2d\u3002 \u540e\u7eed\u63d0\u4ea4\u7684\u65f6\u5019\u9700\u8981\u5173\u6ce8\u4e00\u4e0b\u51e0\u70b9\uff1a commit type \u5bf9\u5e94\u4e0d\u540c\u7684\u4fee\u6539\u7c7b\u578b\uff1afix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style \uff08\u98ce\u683c\u4fee\u6539\uff09\u3001refactor \uff08\u91cd\u6784\uff09\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test \uff08\u6d4b\u8bd5\uff09 commit type \u5192\u53f7\u540e\u9762\u52a0\u7a7a\u683c\u3002 Description \u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u9700\u8981\u8fdb\u884c\u8be6\u7ec6\u8bf4\u660e\uff0c\u6bd4\u5982\u5bf9\u529f\u80fd\u8fdb\u884c\u5927\u6539\u7b49\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_6","title":"3. \u63a8\u9001\u4ee3\u7801","text":"\u9996\u5148\u6dfb\u52a0 commit \u4fe1\u606f git add \u540e\u9762\u52a0\u6587\u4ef6\u540d\u79f0\n git add . # \u8868\u793a\u6dfb\u52a0\u6240\u6709\u6587\u4ef6\n \u4f7f\u7528\u8fd9\u6761\u547d\u4ee4\u6ce8\u610f\u6709\u4e9b\u4e34\u65f6\u6587\u4ef6\u4e0d\u8981\u63d0\u4ea4\u5230\u4ed3\u5e93\u4e86\u3002 git commit -a\n \u4e4b\u540e\u5728 fix: \u540e\u9762\uff08\u6ce8\u610f\u5192\u53f7\u540e\u9762\u5fc5\u987b\u52a0\u7a7a\u683c\uff0c\u4e0d\u7136\u76f4\u63a5-1\uff09\u5199\u672c\u5730\u63d0\u4ea4\u7684 commit \u4fe1\u606f\uff0c\u7136\u540e\u5c31\u53ef\u4ee5\u63d0\u4ea4\u4ee3\u7801\u4e86 git review branch(\u5f53\u524d\u5206\u652f) -r origin\n \u6700\u597d\u4e00\u6b21 commit\uff0c\u4e00\u6b21 git review \uff0c\u7ecf\u5e38\u6709\u540c\u5b66\u5728\u672c\u5730\u75af\u72c2 commit \u6700\u540e git review \u62a5\u9519\u4e0d\u77e5\u9053\u548b\u56de\u4e8b\u513f\u3002 \u82e5\u4e0d\u60f3\u6bcf\u6b21\u63d0\u4ea4\u90fd\u52a0\u4e0a -r \u9009\u9879\uff0c\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a git config --global gitreview.remote origin \u63d0\u4ea4\u4ee3\u7801\uff0c\u76f4\u63a5\u4f7f\u7528 git review branch<\u76ee\u6807\u5206\u652f>\uff0c\u4f8b\u5982 git review master"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git","title":"4. Git\u6807\u7b7e","text":"Git \u6807\u7b7e\u5b9e\u9645\u4e0a\u662f commit \u7684\u4e00\u4e2a\u522b\u540d\uff0c\u4e3b\u8981\u7528\u4e8e\u7ba1\u7406\u5386\u53f2\u7248\u672c\u3002 \u60f3\u8c61\u4e00\u4e0b\u9886\u5bfc\u8ba9\u4f60\u628a\u4e4b\u524d\u7684\u67d0\u4e2a\u7248\u672c\u7684\u4ee3\u7801\u62c9\u51fa\u6765\u8dd1\uff0c\u4f60\u662f\u4e0d\u662f\u4e56\u4e56\u7684\u53bb\u628a\u6240\u6709\u63d0\u4ea4\u8bb0\u5f55\u62c9\u51fa\u6765\u627e\uff0c\u7136\u540e\u627e\u5230\u90a3\u4e2a\u54c8\u5e0c\u503c\uff0c\u901a\u8fc7\u54c8\u5e0c\u503c\u6765\u68c0\u51fa\u4ee3\u7801\u3002 \u8fd9\u4e00\u5957\u64cd\u4f5c\u4e0b\u6765\u662f\u4e0d\u662f\u5f88\u9ebb\u70e6\uff0c\u8d39\u65f6\u95f4\u8fd8\u4e0d\u4e00\u5b9a\u80fd\u627e\u5f97\u5230\uff0c\u6ca1\u4eba\u80fd\u8bb0\u4f4f\u6bcf\u4e2a\u63d0\u4ea4\u54c8\u5e0c\u503c\u4ee5\u53ca\u8fd9\u6b21\u63d0\u4ea4\u90fd\u6539\u4e86\u54ea\u4e9b\u4ee3\u7801\u3002 \u56e0\u6b64\u7ed9\u63d0\u4ea4\u6253\u4e2a\u6807\u7b7e\uff0c\u5c31\u662f\u628a\u54c8\u5e0c\u503c\u8f6c\u6362\u6210\u4eba\u7c7b\u80fd\u7406\u89e3\u7684\u8bed\u8a00\uff0c\u6bd4\u5982 v1.0\uff0c\u5c31\u53ef\u4ee5\u76f4\u63a5\u901a\u8fc7\u6807\u7b7e\u627e\u5230\u5bf9\u5e94\u7684\u63d0\u4ea4\u3002 \u65b0\u5efa\u6807\u7b7e git tag -a <tagname>\n \u56de\u8f66\u4e4b\u540e\uff0cGit \u4f1a\u6253\u5f00\u4f60\u7684\u7f16\u8f91\u5668\uff0c\u8ba9\u4f60\u5199\u4e00\u53e5\u6807\u7b7e\u6ce8\u89e3\uff0c\u5c31\u50cf\u4f60\u7ed9\u63d0\u4ea4\u5199\u6ce8\u89e3\u4e00\u6837\u3002 \u67e5\u770b\u6240\u6709\u6807\u7b7e git tag -l\n# git tag \u4e5f\u884c\n \u5220\u9664\u6807\u7b7e git tag -d <tagname>\n \u63a8\u9001\u6807\u7b7e\u81f3\u8fdc\u7a0b git push \u547d\u4ee4\u5e76\u4e0d\u4f1a\u4f20\u9001\u6807\u7b7e\u5230\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\uff0c\u5fc5\u987b\u663e\u5f0f\u5730\u63a8\u9001\u6807\u7b7e\u3002 git push origin <tagname>\n \u63a8\u9001\u6240\u6709\u4e0d\u5728\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\u7684\u6807\u7b7e git push origin --tag\n \u5220\u9664\u8fdc\u7a0b\u6807\u7b7e git push origin :refs/tag/<tagname>\n \u540e\u671f\u6253\u6807\u7b7e \u5148\u7528 git log --pretty=oneline \u67e5\u8be2\u63d0\u4ea4\u8bb0\u5f55\uff0c\u83b7\u53d6\u6821\u9a8c\u7801\u3002 git tag -a <tagname> 9fceb02(\u6821\u9a8c\u7801)\n \u68c0\u51fa\u6807\u7b7e git checkout <tagname>\n \u6b64\u65f6\uff0c\u4ed3\u5e93\u4f1a\u5904\u4e8e\u201c\u5206\u79bb\u5934\u6307\u9488\uff08detached HEAD\uff09\u201d\u7684\u72b6\u6001\u3002 \u5728\u201c\u5206\u79bb\u5934\u6307\u9488\u201d\u72b6\u6001\u4e0b\uff0c\u5982\u679c\u4f60\u505a\u4e86\u67d0\u4e9b\u66f4\u6539\u7136\u540e\u63d0\u4ea4\u5b83\u4eec\uff0c\u6807\u7b7e\u4e0d\u4f1a\u53d1\u751f\u53d8\u5316\uff0c \u4f46\u4f60\u7684\u65b0\u63d0\u4ea4\u5c06\u4e0d\u5c5e\u4e8e\u4efb\u4f55\u5206\u652f\uff0c\u5e76\u4e14\u5c06\u65e0\u6cd5\u8bbf\u95ee\uff0c\u9664\u975e\u901a\u8fc7\u786e\u5207\u7684\u63d0\u4ea4\u54c8\u5e0c\u624d\u80fd\u8bbf\u95ee\u3002 \u56e0\u6b64\uff0c\u5982\u679c\u4f60\u9700\u8981\u8fdb\u884c\u66f4\u6539\uff0c\u6bd4\u5982\u4f60\u8981\u4fee\u590d\u65e7\u7248\u672c\u4e2d\u7684\u9519\u8bef\uff0c\u90a3\u4e48\u901a\u5e38\u9700\u8981\u521b\u5efa\u4e00\u4e2a\u65b0\u5206\u652f\uff1a git checkout -b <NewBranchName> <tagname>\n \u65b0\u5206\u652f\u4e0a\u53ef\u4ee5\u8fdb\u884c\u63d0\u4ea4\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_12","title":"\u5341\u56db\u3001\u5e38\u89c1\u95ee\u9898","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_10","title":"1. \u63d0\u4ea4\u4ee3\u7801\u65f6\u63d0\u793a\u90ae\u7bb1\u6216\u8005\u540d\u79f0\u4e0d\u5bf9","text":"\u91cd\u65b0\u914d\u7f6e\u90ae\u7bb1\u6216\u8005\u540d\u79f0\uff0c\u7136\u540e\u91cd\u7f6e\u751f\u6548\uff1a git commit --amend --reset-author\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_10","title":"2. \u600e\u4e48\u56de\u6eda\u5230\u4e4b\u524d\u7684\u7248\u672c","text":"(1)\u67e5\u8be2\u5386\u53f2\u63d0\u4ea4\u8bb0\u5f55 git log\n \u627e\u5230\u4f60\u8981\u56de\u6eda\u7684\u7248\u672c\uff0c\u590d\u5236 hash \u503c\u3002 \u6ce8\u610f\uff1a\u662f commit \u7a7a\u683c\u4e4b\u540e\u7684 hash \u503c\uff0c\u4e4b\u524d\u6709\u540c\u5b66\u590d\u5236\u7684 Change-Id: \u8fd9\u6837\u80af\u5b9a\u62a5\u9519\u3002 (2)\u56de\u6eda\u7248\u672c\uff0c\u4e0d\u6e05\u9664\u4ee3\u7801 git reset --soft ${hash}\n (3)\u56de\u6eda\u7248\u672c\uff0c\u6e05\u9664\u4ee3\u7801\uff0c\u614e\u7528\u54c8 git reset --hard ${hash}\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-f-s-e","title":"3. \u6d4b\u8bd5\u62a5\u544a\u91cc\u9762 F S . E \u662f\u4ec0\u4e48\u610f\u601d","text":"F \u8868\u793a\u5931\u8d25\uff0c. \uff08\u70b9\uff09\u8868\u793a\u901a\u8fc7\uff0cS \u8868\u793a\u8df3\u8fc7\uff0cE \u8868\u793a error \u6709\u62a5\u9519"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git-status","title":"4. \u89e3\u51b3 git status \u4e2d\u6587\u663e\u793a\u7684\u95ee\u9898","text":"git config --global core.quotePath false\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5-apps","title":"5. apps \u76ee\u5f55\u4e0b\u989c\u8272\u6709\u4e9b\u662f\u9ec4\u8272\u7684","text":"\u5728 Pycharm \u4e2d apps \u76ee\u5f55\u4e0b\u5e94\u7528\u5e93\u6587\u4ef6\u662f\u9ec4\u8272\u7684\uff0c\u7f16\u8f91\u5668\u8bc6\u522b\u4e0d\u5230\u4ee3\u7801\u65b0\u589e\u548c\u4fee\u6539\uff1b \u7531\u4e8e\u793e\u533a\u7248 Pycharm \u4e0d\u80fd\u52a8\u6001\u8bc6\u522b\u591a\u4ed3\u5e93\uff0c\u9700\u8981\u5728 setting \u91cc\u9762\u624b\u52a8\u6ce8\u518c\uff0c\u64cd\u4f5c\u6b65\u9aa4\uff1a File \u2014> Settings \u2014> Version Control \u2014> \u70b9 + \u53f7 \u2014> Directory \u9009\u4e2d\u5e94\u7528\u5e93\u5de5\u7a0b\u76ee\u5f55 \u2014> VCS \u9009\u4e2d Git \u2014> Apply \u5982\u6b64\u5c31\u53ef\u4ee5\u4e86\u3002 \u4e13\u4e1a\u7248 Pycharm \u4e0d\u5b58\u5728\u8fd9\u4e2a\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#6-envsh-r","title":"6. \u6267\u884c env.sh \u62a5\u9519 $'\\r':\u672a\u627e\u5230\u547d\u4ee4","text":"\u51fa\u73b0\u8fd9\u4e2a\u95ee\u9898\u4f60\u5e94\u8be5\u662f\u5728 windows \u4e0a\u6253\u5f00\u6216\u7f16\u8f91\u8fc7 env.sh \u811a\u672c\uff0cwindows\u4e0b\u7684\u6362\u884c\u662f\u56de\u8f66\u7b26+\u6362\u884c\u7b26\uff0c\u4e5f\u5c31\u662f\\r\\n\uff0c\u800c Linxu \u4e0b\u662f\u6362\u884c\u7b26 \\n\uff0cLinux \u4e0b\u4e0d\u8bc6\u522b \\r\uff0c\u56e0\u6b64\u62a5\u9519\u3002 \u89e3\u51b3\u65b9\u6848\uff1a # \u5c06 \\r \u66ff\u6362\u4e3a\u7a7a\nsudo sed -i 's/\\r//' env.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#7","title":"7.\u600e\u6837\u4e3a\u5355\u72ec\u67d0\u4e00\u6761\u7528\u4f8b\u914d\u7f6e\u6267\u884c\u8d85\u65f6\u65f6\u95f4","text":"\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u5982\u4e0b\uff1a @pytest.mark.timeout(300) # \u5355\u4f4d\u79d2\ndef test_xxx_001():\npass\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#8-youqu","title":"8. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u6240\u6709\u4ee3\u7801\uff0c\u5305\u542b\u5b50\u4ed3\u5e93","text":"\u524d\u7f6e\u6761\u4ef6\uff1a\u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 # \u7b2c\u4e00\u6b21\u5b58\u50a8\u5bc6\u7801\uff0c\u63d0\u4f9b\u540e\u9762\u62c9\u4ee3\u7801(gerrit: ldap\u8d26\u53f7\u548c\u5bc6\u7801\uff0cgit\u62c9\u53d6\u7b2c\u4e00\u6b21\u8f93\u5165\u4fdd\u5b58\uff0c\u540e\u9762\u76f4\u63a5\u4f7f\u7528)\ngit config --global credential.helper store\n\n# \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\uff0c\u5e76\u9012\u5f52\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\" --recursive\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#9-youqu","title":"9. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\u6307\u5b9a\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u524d\u7f6e\u6761\u4ef6\uff1a \u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 \u5df2\u5b58\u50a8\u8bbf\u95ee\u5bc6\u7801 # \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\"\n# \u6307\u5b9a\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ncd youqu\ngit submodule update --init apps/autotest_xxx_xxx\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#10-youqu","title":"10. \u5982\u4f55\u66f4\u65b0 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\uff0c\u6240\u6709\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u66f4\u65b0\u6240\u6709\u5b50\u4ed3\u5e93\u4ee3\u7801 cd youqu\ngit pull & git submodule foreach git pull\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#11-youqu-master-detached-head","title":"11. \u5982\u4f55\u4fee\u590d YouQu \u6240\u6709\u5b50\u4ed3\u5e93 master \u5206\u652f\u6e38\u79bb\u5934\uff08detached head\uff09","text":"\u4fee\u590d\u6240\u6709\u5b50\u4ed3\u5e93\u9ed8\u8ba4master \u5206\u652f\u6e38\u79bb\u5934 cd youqu\ngit submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/","title":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212 \u5206\u7c7b\uff1a/ \u67b6\u6784\u5e08\uff1a/ \u76ee\u6807\uff1a \u5e94\u7528 AT \u67b6\u6784\u5de5\u7a0b\u5316\uff0c\u53c2\u8003\u6027\u80fd\u81ea\u52a8\u5316\u5de5\u7a0b\u5b8c\u6210\u5de5\u7a0b\u5316\u6539\u9020\u3002 \u5e94\u7528\u95f4\u7528\u4f8b\u89e3\u8026\uff0c\u89e3\u9664\u6240\u6709\u4ea4\u53c9\u8c03\u7528\u7684\u65b9\u6cd5\uff0c\u5404\u5e94\u7528\u80fd\u8ddf\u968f\u81ea\u8eab\u8fed\u4ee3\u5468\u671f\u72ec\u7acb\u7ef4\u62a4 AT \u7528\u4f8b\u3002 \u5b8c\u6210\u516c\u5171\u65b9\u6cd5\u7684\u62bd\u53d6\u6574\u5408\uff0c\u5f62\u6210\u4e00\u5957\u72ec\u7acb\u4e8e\u5e94\u7528\u95f4\u7684\u516c\u5171\u65b9\u6cd5\u5e93\uff0c\u5404\u5e94\u7528\u65b9\u6cd5\u91cc\u9762\u4e0d\u5b58\u5728\u88ab\u591a\u4e2a\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\u3002 \u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u4e3a\u5c06\u6765\u9002\u914d\u66f4\u591a\u7684 AT \u8fd0\u7528\u573a\u666f\u63d0\u4f9b\u652f\u6491\uff0c\u539f\u5219\u4e0a\u53ef\u5b9e\u73b0\u65e0\u9650\u6269\u5c55\uff0c\u5728\u6bcf\u65e5\u6784\u5efa\u548c\u6301\u7eed\u96c6\u6210\u6d41\u7a0b\u843d\u5730\u4f7f\u7528\u3002 \u4ee3\u7801\u89c4\u8303\u95ee\u9898\u6e05\u96f6\uff0c\u7b26\u5408 Shell Check\u3001Pylint\u3001\u7cfb\u7edf\u90e8\u76f8\u5173\u7f16\u7801\u89c4\u8303\u8981\u6c42\u3002 \u610f\u4e49\uff1a \u7edf\u4e00\u6210\u7814 AT \u67b6\u6784\u8bbe\u8ba1\u601d\u8def\uff0c\u6d88\u9664 AT \u4ee3\u7801\u5b9e\u73b0\u548c\u7ef4\u62a4\u4e0a\u53ef\u80fd\u51fa\u73b0\u7684\u5206\u6b67\uff0c\u6539\u5584\u5386\u53f2 AT \u65e0\u5de5\u7a0b\u5316\u8bbe\u8ba1\u7684\u7f3a\u9677\uff0c\u63d0\u9ad8\u67b6\u6784\u4e13\u4e1a\u6027\u3002 \u5404\u5e94\u7528 AT \u4ee3\u7801\u76f8\u4e92\u72ec\u7acb\uff0c\u5951\u5408\u5e94\u7528\u72ec\u7acb\u53d1\u5e03\u7279\u6027\uff0c\u53ef\u652f\u6301\u8fed\u4ee3\u671f\u95f4\u72ec\u7acb\u65b0\u589e\u3001\u7ef4\u62a4\u548c\u6267\u884c\u3002 \u65b9\u6cd5\u8c03\u7528\u903b\u8f91\u5f97\u5230\u7b80\u5316\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u66f4\u9ad8\u6548\uff1b\u516c\u5171\u5e93\u62bd\u53d6\uff0c\u51cf\u5c11\u65b9\u6cd5\u91cd\u590d\u7f16\u5199\uff0c\u63d0\u9ad8\u4ee3\u7801\u5229\u7528\u7387\uff1b\u5e73\u5747\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u4ece40\u5206\u949f\u964d\u4f4e\u81f330\u5206\u949f\uff0c\u65e5\u4ea7\u51fa\u7528\u4f8b\u4ece12\u6761/\u5929\u63d0\u5347\u81f316\u6761/\u5929\u3002 \u53ef\u7075\u6d3b\u652f\u6491\u4e0d\u540c\u7684\u81ea\u52a8\u5316\u8fd0\u7528\u573a\u666f\uff0c\u5982 CI\u3001\u5192\u70df\u6d4b\u8bd5\u3001\u96c6\u6210\u6d4b\u8bd5\u3001\u56de\u5f52\u6d4b\u8bd5\u3001\u4e13\u9879\u6d4b\u8bd5\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_2","title":"\u4e00\u3001\u80cc\u666f\u4ecb\u7ecd","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1","title":"1\u3001\u73b0\u6709\u67b6\u6784\u4ecb\u7ecd","text":"\u73b0\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u6574\u4f53\u5206\u4e3a\u4e09\u5c42\uff1a\u7528\u4f8b\u5c42\uff08\u4e1a\u52a1\u903b\u8f91\u5c42\uff09\u3001\u4e2d\u95f4\u5c42\uff08\u5143\u7d20\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff09\u3001\u6838\u5fc3\u5c42\uff08\u5e95\u5c42\u529f\u80fd\u5e93\u5c42\uff09\u3002 \u7528\u4f8b\u5c42\uff1a\u5373\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4e13\u6ce8\u4e8e\u4e1a\u52a1\u529f\u80fd\u903b\u8f91\uff0c\u4e0d\u5173\u5fc3\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\uff1b \u4e2d\u95f4\u5c42\uff1a\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff0c\u6bcf\u4e2a\u65b9\u6cd5\u5747\u5bf9\u5e94\u4e00\u4e2a\u5143\u7d20\u7684\u4e00\u4e2a\u5177\u4f53\u64cd\u4f5c\uff0c\u4e5f\u53ef\u4ee5\u662f\u591a\u4e2a\u64cd\u4f5c\u7684\u7ec4\u5408\u64cd\u4f5c\uff0c\u4e2d\u95f4\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u7528\u4f8b\u5c42\uff0c\u5177\u6709\u53ef\u6269\u5c55\u6027\u548c\u590d\u7528\u6027\uff1b \u6838\u5fc3\u5c42\uff1a\u4e3b\u8981\u5c01\u88c5\u7684\u5e95\u5c42\u529f\u80fd\u5b9e\u73b0\uff0c\u6b64\u5c42\u5728\u6846\u67b6\u4e2d\u63d0\u4f9b\u4e00\u4e9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u529f\u80fd\u6a21\u5757\u76f8\u5bf9\u72ec\u7acb\uff0c\u6838\u5fc3\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u64cd\u4f5c\u5c42\uff0c\u6bd4\u5982\uff1a\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7 UI \u5750\u6807\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u952e\u9f20\u64cd\u4f5c\u7684\u57fa\u7840\u65b9\u64cd\u4f5c\u6a21\u5757\u3001Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757\u3001\u6587\u4ef6\u7684\u589e\u5220\u6539\u67e5\u64cd\u4f5c\u6a21\u5757\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2","title":"2\u3001\u81ea\u52a8\u5316\u7684\u5e94\u7528","text":"2.1\u3001CI \u6d41\u7a0b \u6bcf\u65e5\u6784\u5efa\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u7814\u53d1\u6bcf\u65e5\u63d0\u4ea4\u7684\u4ee3\u7801\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u73ed\u4e4b\u540e\u4f1a\u5c06\u5404\u5e94\u7528\u8fdb\u884c\u6253\u5305\uff0c\u7136\u540e\u5728\u6d4b\u8bd5\u673a\u4e0a\u5b89\u88c5\u66f4\u65b0 deb \u5305\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u5e94\u7528\u63d0\u4ea4\u96c6\u6210\u7684\u7248\u672c\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u8f7d\u6700\u65b0\u7684 ISO \u8fdb\u884c PXE \u90e8\u7f72\uff0c\u7136\u540e\u6d4b\u8bd5\u673a\u5b89\u88c5\u6700\u65b0\u7684\u955c\u50cf\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 2.2\u3001\u9a8c\u6536\u6d4b\u8bd5 \u5728\u5404\u9a8c\u6536\u8282\u70b9\u8fdb\u884c\u81ea\u52a8\u5316\u9a8c\u6536\uff0c\u76ee\u524d\u7684\u7b56\u7565\u662f\u5168\u7528\u4f8b\u8986\u76d6\u5168\u67b6\u6784\u3002 2.3\u3001\u56de\u5f52\u6d4b\u8bd5 \u56de\u5f52\u6d4b\u8bd5\u4eca\u5e74\u89c4\u5212\u5efa\u8bbe\u4e2d\uff0c\u65e8\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u6267\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\uff0c\u51cf\u5c11\u529f\u80fd\u6d4b\u8bd5\u7684\u91cd\u590d\u52b3\u52a8\u529b\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3","title":"3\u3001\u5b58\u5728\u7684\u95ee\u9898","text":" \u5404\u5e94\u7528\u4e4b\u95f4\u5b58\u5728\u8026\u5408 \u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u521d\u671f\uff0c\u6240\u6709\u5e94\u7528\u662f\u6574\u4f53\u53d1\u5e03\uff0c\u6211\u4eec\u662f\u5c06\u6240\u6709\u5e94\u7528\u770b\u6210\u662f\u4e00\u4e2a\u6574\u4f53\uff0c\u5404\u5e94\u7528\u4f5c\u4e3a\u5176\u4e2d\u7684\u4e00\u4e2a\u6a21\u5757\uff0c\u6240\u4ee5\u5b58\u5728\u5e94\u7528\u95f4\u65b9\u6cd5\u4ea4\u53c9\u8c03\u7528\u7684\u95ee\u9898\uff0c\u8fd9\u6837\u4ece\u6700\u521d\u7684\u8bbe\u8ba1\u6765\u8bb2\u786e\u5b9e\u80fd\u591f\u51cf\u5c11\u91cd\u590d\u4ee3\u7801\u7684\u7f16\u5199\u3002\u4f46\u662f\u73b0\u5728\u5e94\u7528\u8d70\u72ec\u7acb\u53d1\u5e03\uff0c\u5404\u5e94\u7528\u90fd\u6709\u81ea\u5df1\u7684\u8fed\u4ee3\u8282\u594f\uff0c\u5728\u65b0\u9700\u6c42\u5feb\u901f\u53d8\u5316\u7684\u8fc7\u7a0b\u4e2d\uff0c\u81ea\u52a8\u5316\u7ef4\u62a4\u53d8\u5f97\u5f02\u5e38\u56f0\u96be\uff0c\u539f\u56e0\u5c31\u662f\u81ea\u52a8\u5316\u9879\u76ee\u91cc\u9762\u5404\u4e2a\u5e94\u7528\u7684\u6709\u6bd4\u8f83\u591a\u7684\u8026\u5408\u5173\u7cfb\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u8fdb\u884c\u89e3\u8026\uff0c\u4ee5\u9002\u5e94\u5e94\u7528\u4e0d\u540c\u7684\u8fed\u4ee3\u5468\u671f\u3002 \u65e0\u6cd5\u7cbe\u51c6\u7684\u5212\u5206\u7528\u4f8b\u8303\u56f4 \u7528\u4f8b\u6267\u884c\u7684\u8303\u56f4\u4e0d\u591f\u7cbe\u51c6\uff0c\u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u4e3b\u8981\u901a\u8fc7\u7528\u4f8b\u7684\u5173\u952e\u8bcd core\uff08\u6838\u5fc3\uff09\u6765\u533a\u5206\u7528\u4f8b\u662f\u5426\u4e3a\u6838\u5fc3\u7528\u4f8b\uff0c\u4f46\u662f\u8fd9\u6837\u7684\u533a\u5206\u592a\u5bbd\u6cdb\u4e86\uff0c\u4e0d\u80fd\u9002\u5e94\u81ea\u52a8\u5316\u6d4b\u8bd5\u5728\u591a\u573a\u666f\u4e0b\u7684\u5e94\u7528\u3002\u5f88\u591a\u573a\u666f\u4e0b\u6211\u4eec\u8fd8\u9700\u8981\u6839\u636e\u7528\u4f8b\u7684\u7b49\u7ea7\u3001\u7528\u4f8b\u7684\u7c7b\u578b\u3001\u7528\u4f8b\u6765\u6e90\u7b49\u7b49\uff0c\u4e0d\u540c\u7684\u7ef4\u5ea6\u6765\u6311\u9009\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u5173\u952e\u5b57\u9700\u8981\u4eba\u5de5\u4e00\u6761\u6761\u7684\u6539\uff0c\u8d39\u65f6\u8d39\u529b\uff0c\u800c\u4e14\u4e0d\u597d\u7ef4\u62a4\u3002 \u53d7\u65b0\u9700\u6c42\u5f71\u54cd\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u597d\u7ef4\u62a4 \u76ee\u524d\u9700\u8981\u8df3\u8fc7\u7684\u7528\u4f8b\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684\u7528\u4f8b\u811a\u672c\u91cc\u9762\uff0c\u6dfb\u52a0\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\uff0c\u540e\u7eed\u89e3\u9664\u8df3\u8fc7\u7684\u65f6\u5019\u53c8\u9700\u8981\u627e\u5230\u8fd9\u6761\u811a\u672c\uff0c\u5220\u6389\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\u3002\u5728\u8df3\u8fc7\u7528\u4f8b\u8f83\u591a\u7684\u60c5\u51b5\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u96be\u5ea6\u3002 \u7f16\u5199\u7528\u4f8b\u65f6\u903b\u8f91\u6bd4\u8f83\u590d\u6742\uff0c\u9700\u8981\u8c03\u7528\u591a\u4e2a\u5e94\u7528\u7684\u65b9\u6cd5\u6a21\u5757\u3002 \u6846\u67b6\u6269\u5c55\u6027\u4e0d\u8db3\uff0c\u65e0\u6cd5\u6574\u5408\u6027\u80fd\u81ea\u52a8\u5316\u3001\u538b\u6d4b\u81ea\u52a8\u5316\u3001\u5b89\u5168\u81ea\u52a8\u5316\u7b49\u4e13\u9879\u6d4b\u8bd5\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_3","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u4e3a\u89e3\u51b3\u73b0\u6709\u95ee\u9898\uff0c\u9002\u5e94\u4e0d\u65ad\u4e30\u5bcc\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u66f4\u597d\u7684\u53d1\u6325\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4f5c\u7528\uff0c\u9700\u8981\u5bf9\u81ea\u52a8\u5316\u67b6\u6784\u53ca\u5404\u529f\u80fd\u6a21\u5757\u8fdb\u884c\u91cd\u65b0\u8bbe\u8ba1\u89c4\u5212\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_1","title":"1\u3001\u67b6\u6784\u8bbe\u8ba1","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_1","title":"2\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u6846\u67b6\u7684\u8fd0\u884c\u903b\u8f91\uff1a\u901a\u8fc7\u6838\u5fc3\u5c42\u63d0\u4f9b\u4e00\u4e2a\u57fa\u7840\u80fd\u529b\uff0c\u4e1a\u52a1\u5c42\u6839\u636e\u5b9e\u9645\u4e1a\u52a1\u9700\u6c42\uff08\u6d4b\u8bd5\u7528\u4f8b\uff09\u52a8\u6001\u52a0\u8f7d\u6838\u5fc3\u5c42\uff0c\u6267\u884c\u5165\u53e3\u52a0\u8f7d\u76f8\u5e94\u7684\u7528\u4f8b\u96c6\u5e76\u63a7\u5236\u6267\u884c\uff0c\u5e94\u7528\u5c42\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u9700\u6c42\uff0c\u901a\u8fc7\u76f8\u5e94\u7684\u914d\u7f6e\u9879\u8fdb\u884c\u914d\u7f6e\uff0c\u4ece\u800c\u89e6\u53d1\u81ea\u52a8\u5316\u6d4b\u8bd5\u4efb\u52a1\u3002 \u6838\u5fc3\u5c42\uff1a\u57fa\u672c\u4fdd\u6301\u4e0d\u53d8\uff0c\u90e8\u5206\u6a21\u5757\u4f1a\u6d89\u53ca\u5230\u65b0\u529f\u80fd\u5f00\u53d1\uff0c\u6838\u5fc3\u5c42\u5404\u529f\u80fd\u6a21\u5757\u4fdd\u6301\u72ec\u7acb\u6027\uff0c\u63d0\u4f9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u4f9b\u4e0a\u5c42\u8c03\u7528\uff1b \u5e95\u5c42\u6838\u5fc3\u6a21\u5757\u5305\u62ec\uff1a \u56fe\u50cf\u8bc6\u522b\u6a21\u5757 UI \u5b9a\u4f4d\u6a21\u5757 Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757 \u5c5e\u6027\u5b9a\u4f4d\u6a21\u5757 \u65e5\u5fd7\u6a21\u5757 \u952e\u9f20\u64cd\u4f5c\u6a21\u5757 \u6587\u4ef6\u64cd\u4f5c\u6a21\u5757 \u5f55\u5c4f\u6a21\u5757 \u81ea\u5b9a\u4e49\u65ad\u8a00\u6a21\u5757 \u7528\u4f8b\u6267\u884c\u6a21\u5757 PXE \u88c5\u673a\u6a21\u5757 \u952e\u9f20\u4fe1\u53f7\u6a21\u62df\u6a21\u5757 OCR \u6a21\u5757 \u4e1a\u52a1\u5c42\uff1a\u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e94\u7528\u5185\u5305\u542b\u591a\u4e2a\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5982\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7b49\uff0c\u540e\u7eed\u53ef\u4ee5\u6839\u636e\u9700\u8981\u5ac1\u63a5\u8fdb\u6765\u3002\u5176\u4e2d\u529f\u80fd\u6d4b\u8bd5\u8bbe\u8ba1\u601d\u8def\uff1a \u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e76\u5c06\u6d4b\u8bd5\u6570\u636e\u548c\u6d4b\u8bd5\u8d44\u6e90\u6574\u5408\u8fdb\u6765\uff0c\u589e\u52a0\u7528\u4f8b\u6807\u7b7e csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ed9\u6bcf\u6761\u7528\u4f8b\u6253\u6807\u7b7e\u3002 \u5404\u6807\u7b7e\u6240\u4f7f\u7528\u5bf9\u5e94\u7684\u5b57\u6bb5\u540d\u79f0\uff0c\u4f7f\u7528 csv \u6587\u4ef6\u7ef4\u62a4\u7528\u4f8b\u4e0e\u6807\u7b7e\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u5bf9\u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u53ef\u4ee5\u7ec4\u5408\u5176\u4e2d\u7684\u6807\u7b7e\u800c\u4ece\u9a71\u52a8\u5bf9\u5e94\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\uff0c\u517c\u5bb9\u73b0\u6709\u7528\u4f8b\u6807\u7b7e\uff0c\u4e14\u652f\u6301\u7528\u4f8b\u6807\u7b7e\u53ef\u6269\u5c55\uff1b \u4f7f\u7528 csv \u683c\u5f0f\u6587\u4ef6\u53ef\u4ee5\u65b9\u4fbf\u7684\u4f7f\u7528 Excel \u8868\u683c\u6253\u5f00\u8fdb\u884c\u7f16\u8f91\uff0c\u540c\u65f6\u7531\u4e8e csv \u6587\u4ef6\u5b9e\u9645\u662f\u4ee5\u90fd\u597d\u5206\u9694\u7684\u6587\u672c\u6587\u4ef6\uff0c\u4ee3\u7801\u4e2d\u53ef\u4ee5\u5728\u4e0d\u4f9d\u8d56\u4e09\u65b9\u5e93\u7684\u60c5\u51b5\u4e0b\u65b9\u4fbf\u5feb\u901f\u7684\u89e3\u6790\u5b83\uff0c\u53ef\u64cd\u4f5c\u6027\u548c\u53ef\u7ef4\u62a4\u6027\u8f83\u9ad8\u3002 \u5404\u4e2a\u5e94\u7528\u4e4b\u95f4\uff0c\u7528\u4f8b\u3001\u65b9\u6cd5\u3001\u6807\u7b7e\u548c\u8d44\u6e90\u90fd\u662f\u76f8\u4e92\u72ec\u7acb\u7684\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u7528\u4f8b\u65f6\u53ea\u9700\u8981\u81ea\u5df1\u5e94\u7528\u4e0b\u7684\u65b9\u6cd5\u548c\u516c\u5171\u5e93\u5373\u53ef\u3002 \u7ed3\u6784\u4e3e\u4f8b\uff1a .\n\u251c\u2500\u2500 apps\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_album # \u5e94\u7528\u540d (\u7528\u4e0b\u5212\u7ebf\u8fde\u63a5\u662f Python \u7f16\u7801\u89c4\u8303)\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_assert # \u65ad\u8a00\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_function_tag.csv # \u7528\u4f8b\u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 asan_cases # \u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases # \u529f\u80fd\u6d4b\u8bd5\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 res # \u6d4b\u8bd5\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config # \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_widget # \u5e94\u7528\u81ea\u5df1\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_widget # \u65b9\u6cd5\u57fa\u7c7b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 other_widget # \u8c03\u7528\u5176\u4ed6\u5e94\u7528\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_camera\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases\n\u2502\u00a0\u00a0 \u2502\u00a0 ...\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 public_widget # \u516c\u5171\u65b9\u6cd5\u5e93\n\u251c\u2500\u2500 config # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n...\n config \u914d\u7f6e\u6a21\u5757\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u76f8\u5e94\u914d\u7f6e\uff0c\u6d4b\u8bd5\u540c\u5b66\u53ef\u4ee5\u6839\u636e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5728 config \u91cc\u9762\u8fdb\u884c\u914d\u7f6e\u3002 \u5168\u5c40\u914d\u7f6e\uff1a \u6267\u884c\u4e00\u4e2a\u6216\u591a\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff1a\u5728 pattern \u91cc\u9762\u5199\u5165\u5e94\u7528\u5305\u540d\uff0c\u591a\u4e2a\u5e94\u7528\u4e4b\u95f4\u7528 or \u8fde\u63a5\uff0c\u5982 deepin-music or deepin-movie\uff1b \u5192\u70df\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a smoke\uff1b \u96c6\u6210\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a core \uff1b \u5168\u91cf\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u4e3a\u7a7a\u5373\u53ef\uff1b \u901a\u8fc7 tags \u7684\u914d\u7f6e\u6bd4\u8f83\u7075\u6d3b\uff0c\u540e\u9762\u6807\u7b7e\u5316\u7ba1\u7406\u7ae0\u8282\u4f1a\u8bb2\u5230\uff0c\u652f\u6301\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u7075\u6d3b\u914d\u7f6e\u3002 \u6307\u5b9a\u67d0\u53f0\u673a\u5668\u5728\u6307\u5b9a\u955c\u50cf\u7248\u672c\u4e0a\u6267\u884c\u7528\u4f8b\uff1a\u5728 IP \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a IP\uff0c\u5e76\u5728 URL \u91cc\u9762\u586b\u5165\u955c\u50cf\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u6846\u67b6\u4f1a\u8c03\u7528 PXE \u8fdb\u884c\u81ea\u52a8\u88c5\u673a\uff0c\u88c5\u673a\u5b8c\u4e4b\u540e\u81ea\u52a8\u5f00\u59cb\u6267\u884c\u914d\u7f6e\u7684\u6d4b\u8bd5\u7528\u4f8b\u3002 \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\uff1a \u6bcf\u4e2a\u5e94\u7528\u5185\u90e8\u4f1a\u6709\u4e00\u4e2a\u5355\u72ec\u7684\u914d\u7f6e\u6a21\u5757\uff0c\u4f1a\u5305\u542b\u4e00\u4e9b\u672c\u5e94\u7528\u7684\u6d4b\u8bd5\u8d44\u6e90\u7684\u8def\u5f84\u3001\u6267\u884c\u7528\u4f8b\u7684\u6807\u7b7e\u914d\u7f6e\u7b49\u7b49\uff0c\u5982\u679c\u5728\u5c40\u90e8\u914d\u7f6e\u91cc\u9762\u914d\u7f6e\u4e86\u7528\u4f8b\u6267\u884c\u6807\u7b7e\uff0c\u800c\u5916\u5c42 runner \u51fa\u6ca1\u6709\u6307\u5b9a\u6267\u884c\u6807\u7b7e\uff0c\u5219\u5728\u6267\u884c\u65f6\u53ea\u4f1a\u6267\u884c\u5c40\u90e8\u914d\u7f6e\u5df2\u914d\u7f6e\u7684\uff0c\u82e5\u5916\u5c42 runner \u4e5f\u914d\u7f6e\u4e86\u6267\u884c\u6807\u7b7e\uff0c\u5219\u4f1a\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u7528\u4f8b\u3002 \u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u914d\u7f6e\u90fd\u5728\u540c\u4e00\u4e2a\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\uff0cpy \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684\u7c7b\uff0cini \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684 option\u3002 \u5168\u5c40\u914d\u7f6e\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u7b56\u7565\u5982\u4e0b\uff1a \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5c40\u90e8\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5e94\u7528\u5c42\uff1arunner \u662f\u6d4b\u8bd5\u6267\u884c\u7684\u5165\u53e3\uff0c\u5b83\u4f1a\u6839\u636e\u914d\u7f6e\u91cc\u9762\u7684\u914d\u7f6e\u9879\uff0c\u8fdb\u884c\u7528\u4f8b\u7684\u52a0\u8f7d\u548c\u6267\u884c\u3002\u5b83\u63d0\u4f9b\u63a5\u53e3\u7ed9\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\uff0c\u5e73\u53f0\u4e0a\u7684\u6307\u4ee4\u5b9e\u9645\u4e0a\u90fd\u662f\u901a\u8fc7\u4e0b\u53d1\u7ed9 runner\uff0c\u7136\u540e\u7531 runner \u6765\u6267\u884c\u76f8\u5e94\u7684\u6d4b\u8bd5\u3002 \u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u662f\u4e00\u4e2a\u524d\u7aef\u7cfb\u7edf\uff0c\u53ef\u4ee5\u8fdb\u884c\u6d4b\u8bd5\u673a\u7ba1\u7406\u3001\u81ea\u52a8\u5b89\u88c5\u955c\u50cf\u3001\u81ea\u52a8\u5b89\u88c5\u6307\u5b9a\u5e94\u7528\u7248\u672c\u3001\u8fdb\u884c\u6d4b\u8bd5\u7528\u4f8b\u8303\u56f4\u9009\u62e9\u3001\u7528\u4f8b\u89e6\u53d1\u6267\u884c\u63a7\u5236\u3001\u7ed3\u679c\u5c55\u793a\u8f93\u51fa\u7b49\u3002 \u4e00\u4e2a\u5e94\u7528\u7684\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\u90fd\u53ef\u4ee5\u5355\u72ec\u89e6\u53d1\u3002 \u517c\u5bb9\u6027\u6d4b\u8bd5\u4e3b\u8981\u901a\u8fc7 PXE \u670d\u52a1\u5668\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u88c5\u673a\uff0c\u7136\u540e\u914d\u5408 AT \u8fdb\u884c\u6d4b\u8bd5\uff0c\u53ef\u4ee5\u5b9e\u73b0\u4e0d\u540c\u7cfb\u7edf\u7248\u672c\u3001\u4e0d\u540c\u5e94\u7528\u7248\u672c\u73af\u5883\u4e0a\u90fd\u53ef\u4ee5\u8fdb\u884c\u81ea\u52a8\u5316\u7684 AT \u6267\u884c\uff0c\u63d0\u9ad8\u517c\u5bb9\u6027\u6d4b\u8bd5\u6548\u7387\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_4","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_2","title":"1\u3001\u7528\u4f8b\u89e3\u8026","text":"\u5b58\u5728\u8026\u5408\u5173\u7cfb\u7684\u65b9\u6cd5\uff1a\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u88ab\u5916\u90e8\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\uff0c\u5219\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u8026\u5408\u5173\u7cfb\u3002 1.1\u3001\u901a\u8fc7\u7f16\u8f91\u5668 Find Usages \u67e5\u770b\u6bcf\u4e2a\u65b9\u6cd5\u88ab\u8c03\u7528\u7684\u8def\u5f84\u548c\u88ab\u8c03\u7528\u6b21\u6570\uff1b 1.2\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 1 \u4e2a\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728\u5916\u90e8\u5e94\u7528\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1b 1.3\u3001\u64cd\u4f5c\u5c42\u6587\u4ef6\u540d\u5747\u4ee5 widget \u7ed3\u5c3e\uff0c\u7c7b\u540d\u4ee5 Widget \u7ed3\u5c3e\uff0c\u5982\uff1a\u6587\u4ef6\u540d music_widget.py \uff1a class MusicWidget:\n\"\"\"\u97f3\u4e50\u7684\u64cd\u4f5c\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_2","title":"2\u3001\u516c\u5171\u5e93\u5efa\u8bbe","text":"2.1\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 2 \u4e2a\u53ca\u4ee5\u4e0a\u7684\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728 public_widget \u76ee\u5f55\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1bpublic_widget \u5373\u4e3a\u516c\u5171\u65b9\u6cd5\u5e93\uff1b 2.2\u3001\u5728\u7528\u4f8b\u5c42\u4fee\u6539\u7528\u4f8b\u4e2d\u7c7b\u7684\u5bfc\u5165\u8def\u5f84\uff0c\u5c5e\u4e8e\u516c\u5171\u65b9\u6cd5\u7684\u5219\u8c03\u7528 public_widget \u4e2d\u7684\u7c7b\uff0c\u5916\u90e8\u5e94\u7528\u7684\u64cd\u4f5c\u65b9\u6cd5\uff0c\u5219\u8c03\u7528\u672c\u5e94\u7528\u76ee\u5f55\u4e0b\u91cd\u5199\u7684\u5916\u90e8\u5e94\u7528\u65b9\u6cd5\u3002 \u6bd4\u5982\uff1a\u51e0\u4e4e\u6240\u6709\u591a\u5a92\u4f53\u5e94\u7528\u90fd\u9700\u8981\u901a\u8fc7\u6587\u7ba1\u52a0\u8f7d\u8d44\u6e90\uff0c\u8c03\u8d77\u7684\u6587\u7ba1\u5bf9\u8bdd\u6846\u5b9e\u9645\u4e3a dde-desktop\uff0c\u56e0\u6b64\u5c06 desktop_widget.py \u653e\u5230 public_widget \u91cc\u9762\uff1a class DdeDesktopPublicWidget:\n\"\"\"\u516c\u5171-\u684c\u9762\u7684\u64cd\u4f5c\u65b9\u6cd5\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3_1","title":"3\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406","text":"3.1\u3001\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1a\u5bf9\u5e94 core\u3001smoke\uff0c\u6216\u4e3a\u7a7a\uff1b \u7528\u4f8b\u6765\u6e90\uff1a\u5bf9\u5e94 PMS \u7528\u4f8b\u6765\u6e90\uff0c\u5206\u522b\u7528 acp1\u3001acp2\u3001acp3\u3001acp4 \u8868\u793a\u3002 acp1 \uff1a\u4e1a\u52a1\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5199\u7684\u7528\u4f8b\uff0c\u88ab\u7528\u4e8e\u9a8c\u6536\u6d4b\u8bd5\u7684\uff1b acp2 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5f15\u5165\u7684\u4ea7\u54c1\u9a8c\u6536\u6d4b\u8bc4\u90e8\u7684\u7528\u4f8b\uff1b acp3 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u6839\u636e\u4ea7\u54c1\u9700\u6c42\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\uff1b acp4 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u901a\u8fc7\u793e\u533a\u3001\u8bba\u575b\u7528\u6237\u53cd\u9988\u95ee\u9898\u603b\u7ed3\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\u3002 \u4e3e\u4f8b\uff1a \u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u7528\u4f8b\u6765\u6e90 001 L1 core acp1 \u6807\u7b7e\u91c7\u7528\u679a\u4e3e\u7684\u65b9\u5f0f\u8fdb\u884c\u4ee3\u53f7\u7ba1\u7406\u65b9\u4fbf\u7ba1\u7406\u4ee5\u53ca\u540e\u7eed\u6269\u5c55\u3002 3.2\u3001\u5728\u6bcf\u4e2a\u5e94\u7528\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u7b2c\u4e00\u5217\u4e3a\u7528\u4f8b\u7684 ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ba1\u7406\u6a21\u5757\u5185\u7684\u7528\u4f8b\u6807\u7b7e\u3002\u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 3.3\u3001\u5bf9\u7167 PMS \u4e0a\u7528\u4f8b\u7b49\u7ea7\u3001\u7528\u4f8b\u7c7b\u578b\u548c\u7528\u4f8b\u6765\u6e90\uff0c\u6807\u8bb0\u6240\u6709\u5df2\u5b9e\u73b0\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u540e\u7eed\u7f16\u5199\u65b0\u589e\u81ea\u52a8\u5316\u7528\u4f8b\u65f6\uff0c\u6bcf\u5199\u4e00\u6761\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684 csv \u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u6b64\u6761\u7528\u4f8b\u7684\u6807\u7b7e\u3002 3.4\u3001\u8df3\u8fc7\u7528\u4f8b\u6807\u7b7e\u5316 \u73b0\u6709\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a\uff1a \u4e3e\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u8bb0\u4e3a \u201cskip-\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u8bb0\uff0c\u5982\u679c\u5df2\u7ecf\u6807\u8bb0\u4e86\u8df3\u8fc7\u539f\u56e0\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u8bb0\u4e3a SKIPED\uff0c\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\u3002 \u6240\u6709\u7684\u6807\u7b7e\u5728 docs \u76ee\u5f55\u4e0b\u4f1a\u6709\u4e00\u4e2a\u6587\u6863\uff0c\u6587\u6863\u6682\u5b9a\u540d\u79f0\u4e3a\uff1atags_info.md\uff0c\u7528\u4e8e\u8bf4\u660e\u73b0\u5728\u5df2\u7ecf\u4f7f\u7528\u5230\u7684\u6807\u7b7e\uff0c\u4ee5\u53ca\u8fd9\u4e9b\u6807\u7b7e\u7684\u89e3\u91ca\u548c\u7528\u6cd5\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#4","title":"4\u3001\u7528\u4f8b\u6267\u884c","text":"4.1\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u7684\u9a71\u52a8\u6267\u884c\u903b\u8f91\u529f\u80fd\u5b9e\u73b0 \u5f00\u53d1\u6839\u636e\u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\u91cc\u9762\u7684\u7528\u4f8b\u6807\u7b7e\u6267\u884c\u5bf9\u5e94\u7528\u4f8b\u7684\u529f\u80fd\uff0c\u80fd\u652f\u6301\u591a\u4e2a\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u6267\u884c\u5165\u53e3\u80fd\u968f\u610f\u901a\u8fc7\u7528\u4f8b\u6807\u7b7e\u6307\u5b9a\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002 \u7528\u4f8b\u6807\u7b7e\u7684\u9a71\u52a8\u65b9\u5f0f\u5fc5\u987b\u80fd\u652f\u6301\u6807\u7b7e\u7684\u6269\u5c55\uff0c\u672a\u6765\u968f\u7740\u4e1a\u52a1\u7684\u53d8\u5316\u53ef\u80fd\u9700\u8981\u589e\u52a0\u5404\u79cd\u5404\u6837\u7684\u6807\u7b7e\u3002 4.2\u3001\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u6267\u884c \u529f\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u3001\u6027\u80fd\u6d4b\u8bd5\u7b49\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u662f\u5206\u5f00\u6267\u884c\u7684\uff0c\u4e5f\u5c31\u662f\u5728\u4e00\u6b21\u6267\u884c\u4e2d\uff0c\u53ea\u80fd\u6267\u884c\u5176\u4e2d\u4e00\u79cd\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5177\u4f53\u8981\u6267\u884c\u54ea\u4e00\u79cd\u540c\u6837\u901a\u8fc7\u53c2\u6570\u6765\u63a7\u5236\u3002 4.3\u3001\u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c \u7531\u4e8e\u6d4b\u8bd5\u673a\u8d44\u6e90\u6709\u9650\uff0c\u968f\u7740\u81ea\u52a8\u5316\u7528\u4f8b\u6570\u91cf\u7684\u589e\u52a0\uff0cCI \u6267\u884c\u65f6\u95f4\u4f1a\u8d8a\u6765\u8d8a\u957f\u3002 \u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c\u7684\u529f\u80fd\uff1a \u540c\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\u5206\u6563\u5230\u4e0d\u540c\u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u4e0a\u6267\u884c\uff0c\u7f29\u77ed\u6267\u884c\u603b\u65f6\u95f4\uff1b \u7b2c\u4e8c\u5929\u8dd1\u7684\u65f6\u5019\u540c\u4e00\u4e2a\u673a\u5668\u4e0a\u4f1a\u6267\u884c\u6628\u5929\u6ca1\u6709\u6267\u884c\u5230\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u6267\u884c\u540c\u7406\uff1b \u53ef\u4ee5\u5b9e\u73b0\u5728\u5168\u67b6\u6784\u6d4b\u8bd5\u673a\u4e0a\u8f6e\u6d41\u6267\u884c\u7528\u4f8b\uff0c\u65e2\u80fd\u4fdd\u8bc1\u6267\u884c\u4e86\u6240\u6709\u7684\u7528\u4f8b\uff0c\u53c8\u80fd\u5728\u8d44\u6e90\u6709\u9650\u7684\u60c5\u51b5\u4e0b\u8986\u76d6\u4e86\u6240\u6709\u7684\u67b6\u6784\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#5","title":"5\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0","text":"5.1\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u4f5c\u4e3a\u524d\u7aef\u754c\u9762\u7cfb\u7edf\uff0c\u901a\u8fc7\u9875\u9762\u4e0a\u7684\u4e00\u4e9b\u529f\u80fd\u9009\u9879\u8fdb\u884c\u5bf9\u5e94\u6d4b\u8bd5\u4efb\u52a1\u7684\u7ba1\u7406\u6216\u89e6\u53d1\uff0c\u4e1a\u5185\u6bd4\u8f83\u6d41\u884c\u7684\u5b9e\u73b0\u65b9\u6848\u662f\u4f7f\u7528 Vue + DRF \u5b9e\u73b0\u4e00\u4e2a\u524d\u540e\u7aef\u5206\u79bb\u7684\u7cfb\u7edf\u3002 \u6d4b\u8bd5\u5e73\u53f0\u53ef\u80fd\u4f1a\u6d89\u53ca\u5230\u7684\u6a21\u5757\u6709\uff1a\u6d4b\u8bd5\u673a\u8d44\u6e90\u7ba1\u7406\u6a21\u5757\u3001\u7528\u4f8b\u6267\u884c\u63a7\u5236\u6a21\u5757\u3001\u7ed3\u679c\u5c55\u793a\u6a21\u5757\u3001PXE \u955c\u50cf\u5b89\u88c5\u6a21\u5757\u7b49\u3002 \u7528\u6237\uff08\u6d4b\u8bd5\u3001\u7814\u53d1\u540c\u5b66\u7b49\uff09\u53ef\u4ee5\u914d\u7f6e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5982\u6267\u884c\u54ea\u4e2a\u5e94\u7528\u3001\u6267\u884c\u7528\u4f8b\u7684\u8303\u56f4\u3001\u5728\u54ea\u53f0\u673a\u5668\u4e0a\u6267\u884c\u3001\u955c\u50cf\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u5e94\u7528\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u6267\u884c\u65f6\u95f4\u3002 5.2\u3001\u6267\u884c\u5165\u53e3 runner \u63d0\u4f9b\u7ed9\u6d4b\u8bd5\u5e73\u53f0\u7684\u63a5\u53e3\u5305\u62ec\uff1a\u7528\u4f8b\u6267\u884c\u63a5\u53e3\u3001\u7ed3\u679c\u8fd4\u56de\u63a5\u53e3\u3001\u955c\u50cf\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u955c\u50cf\u5b89\u88c5\u63a5\u53e3\u3001\u5e94\u7528\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u5e94\u7528\u5b89\u88c5\u66f4\u65b0\u63a5\u53e3\u7b49\u3002 \u524d\u7aef\u5e73\u53f0\u76ee\u524d\u8fd8\u6ca1\u6709\u592a\u591a\u8be6\u7ec6\u7684\u65b9\u6848\uff0c\u672c\u6b21\u8bbe\u8ba1\u4e3b\u8981\u96c6\u4e2d\u5728\u540e\u7aef\u8fd9\u90e8\u5206\u67b6\u6784\u7684\u8bbe\u8ba1\u4e0a\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_5","title":"\u56db\u3001\u5b9e\u65bd\u8ba1\u5212","text":"\u8fd1\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u6587\u7ba1\u4ee3\u7801\u89e3\u8026 2022/3/28 2022/4/8 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u56fe\u5f62\u56fe\u50cf\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u97f3\u89c6\u9891\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5168\u5c40\u641c\u7d22\u4ee3\u7801\u89e3\u8026 2022/4/25 2022/4/26 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u516c\u5171\u5e93\u5efa\u8bbe 2022/4/27 2022/5/5 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5c01\u88c5\u7684\u65b9\u6cd5\u6574\u7406\u6210\u4e00\u4e2a\u8868 2022/5/6 2022/5/10 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7528\u4f8b\u6807\u7b7e\u5206\u7c7b\u8bc4\u4f30 2022/5/11 2022/5/11 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u6807\u7b7e\u5316\u6267\u884c\u9a71\u52a8\u7a0b\u5e8f\u7f16\u5199 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u9700\u5b9e\u73b0\u81ea\u52a8\u89e3\u6790 csv \u8868\u683c\u4e2d\u7684\u7528\u4f8b\u7f16\u53f7 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u722c\u866b\u811a\u672c\uff0c\u722c\u53d6 pms \u4e0a\u7528\u4f8b\u7684\u6807\u7b7e 2022/5/11 2022/5/13 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u5b9a\u65f6\u81ea\u52a8\u7ef4\u62a4\u672c\u5730 csv \u6587\u4ef6\u811a\u672c 2022/5/11 2022/5/20 \u4e2d\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u76ee\u5f55\u7ed3\u6784\u8c03\u6574 2022/5/20 2022/6/2 \u5b8c\u6210\u5168\u5c40\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u5177\u4f53\u65b9\u6848\u548c\u903b\u8f91\u5b9e\u73b0 2022/6/6 2022/6/17 \u9759\u6001\u626b\u63cf\u95ee\u9898\u6e05\u96f6 2022/6/20 2022/7/1 \u5b8c\u6210\u65b0\u6846\u67b6\u4f7f\u7528\u57f9\u8bad 2022/7/4 2022/7/11 \u843d\u5730\u8fd0\u884c 2022/7/12 2022/7/20 \u5e95\u5c42\u5e93\u7528\u9014\u8bf4\u660e\u6587\u6863\u7f16\u5199 2022/7/21 2022/7/28"}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\u200b\\u3000\\-\u3001\u3002\uff0c\uff0e\uff1f\uff01\uff1b]+","pipeline":["stemmer"]},"docs":[{"location":"","title":"\u9996\u9875","text":""},{"location":"#youqu","title":"\u6709\u8da3\uff08YouQu\uff09","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/4/1\n# Author : Mikigo\n# =============================================\n \u672c\u7ad9\u603b\u8bbf\u95ee\u91cf \u6b21 \u6b22\u8fce\u5728\u6d4f\u89c8\u5668\u8bbf\u95ee\u3010\u516c\u7f51\u6587\u6863\u3011 \u7edf\u4fe1\u516c\u53f8\u5185\u7f51\u8fd8\u53ef\u4ee5\u8bbf\u95ee\u3010\u5185\u7f51\u6587\u6863\u3011\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u54e6~~"},{"location":"#_1","title":"\u4e00\u3001\u7b80\u4ecb","text":"\u6709\u8da3\uff08YouQu\uff09\u662f\u6df1\u5ea6\u79d1\u6280\u8bbe\u8ba1\u548c\u5f00\u53d1\u7684\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff0c\u91c7\u7528\u7ed3\u6784\u5206\u5c42\u7684\u8bbe\u8ba1\u7406\u5ff5\uff0c\u652f\u6301\u591a\u5143\u5316\u5143\u7d20\u5b9a\u4f4d\u548c\u65ad\u8a00\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\u3001\u5f3a\u5927\u7684\u65e5\u5fd7\u548c\u62a5\u544a\u8f93\u51fa\u7b49\u7279\u8272\u529f\u80fd\uff0c\u540c\u65f6\u5b8c\u7f8e\u517c\u5bb9X11\u3001Wayland\u663e\u793a\u534f\u8bae\uff0c\u73af\u5883\u90e8\u7f72\u7b80\u5355\uff0c\u64cd\u4f5c\u6613\u4e0a\u624b\u3002"},{"location":"#17","title":"\u7231\u4e0a \u201c\u6709\u8da3\u201d \u7684 17 \u4e2a\u7406\u7531","text":" \u6838\u5fc3\u5e93\u63d0\u4f9b\u4e86\u7edf\u4e00\u7684\u63a5\u53e3\uff0c\u7f16\u5199\u65b9\u6cd5\u65f6\u53ea\u9700\u8981\u5bfc\u5165\u4e00\u4e2a\u5305\u5c31\u53ef\u4ee5\u4f7f\u7528\u5230\u6838\u5fc3\u5e93\u63d0\u4f9b\u7684\u6240\u6709\u529f\u80fd\uff1b \u516c\u5171\u5e93\u5c01\u88c5\u4e86\u5f88\u591a\u5e38\u7528\u6a21\u5757\u7684\u76f8\u5173\u65b9\u6cd5\uff0c\u6bd4\u5982\uff1a\u4efb\u52a1\u680f\u7684\u64cd\u4f5c\u3001\u684c\u9762\u7684\u64cd\u4f5c\u3001\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\u7b49\u7b49\uff1b \u9664\u4e86\u5e38\u7528\u7684\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u8bc6\u522b\u4ee5\u5916\uff0c\u6211\u4eec\u8fd8\u63d0\u4f9b\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u5176\u4f7f\u7528\u7b80\u5355\u4e14\u9ad8\u6548\uff0c\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff1b \u5bf9\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u5c06\u7f16\u5199\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u53d8\u5f97\u7b80\u5355\u800c\u4f18\u96c5\uff1b \u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u6280\u672f\u8fdb\u884c\u529f\u80fd\u5347\u7ea7\uff0c\u9664\u4e86\u652f\u6301\u5355\u4e2a\u5750\u6807\u8fd4\u56de\uff0c\u8fd8\u652f\u6301\u540c\u4e00\u754c\u9762\u4e0b\u591a\u4e2a\u76f8\u540c\u5143\u7d20\u8fd4\u56de\u591a\u4e2a\u5750\u6807\u7684\u529f\u80fd\uff1b \u63d0\u4f9b\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u548c\u6279\u91cf\u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u4e0d\u5230\u4e00\u4e2a csv \u6587\u4ef6\u539f\u6765\u80fd\u5e72\u8fd9\u4e48\u591a\u4e8b\u60c5\uff1b \u63d0\u4f9b\u4e86\u529f\u80fd\u5f3a\u5927\u7684\u6267\u884c\u5668\u5165\u53e3\uff0c\u8ba9\u4f60\u53ef\u4ee5\u65b9\u4fbf\u7684\u5728\u672c\u5730\u6267\u884c\u4efb\u4f55\u7528\u4f8b\u96c6\u7684\u7528\u4f8b\uff0c\u5176\u4e30\u5bcc\u7684\u81ea\u5b9a\u4e49\u914d\u7f6e\u9879\uff0c\u6ee1\u8db3\u4f60\u5bf9\u6267\u884c\u5668\u6240\u6709\u7684\u5e7b\u60f3\uff1b \u63d0\u4f9b\u8fdc\u7a0b\u6267\u884c\u7684\u529f\u80fd\uff0c\u53ef\u4ee5\u63a7\u5236\u591a\u53f0\u673a\u5668\u5e76\u884c\u8dd1\uff0c\u6216\u8005\u5206\u5e03\u5f0f\u8dd1\uff0c\u8fd9\u79cd\u4ed8\u8d39\u529f\u80fd\u73b0\u5728\u514d\u8d39\u7ed9\u4f60\u7528\uff1b \u63d0\u4f9b\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u529f\u80fd\uff0c\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u6bcf\u4e2a\u65b9\u6cd5\u5355\u72ec\u5199\u8f93\u51fa\u65e5\u5fd7\u7684\u4ee3\u7801\uff0c\u4e00\u5207\u6211\u4eec\u7ed9\u4f60\u641e\u5b9a\u4e86\uff0c\u65e5\u5fd7\u8f93\u51fa\u4e0d\u4ec5\u5185\u5bb9\u4e30\u5bcc\uff0c\u989c\u503c\u4e5f\u7edd\u5bf9\u5728\u7ebf\uff0c\u6211\u4eec\u8fd8\u81ea\u5df1\u8bbe\u8ba1\u4e86\u4e00\u6b3e\u7ec8\u7aef\u8f93\u51fa\u4e3b\u9898\u53eb\u300a\u4e94\u5f69\u6591\u6593\u7684\u9ed1\u300b\uff1b \u63d0\u4f9b\u4e86\u4e00\u952e\u90e8\u7f72\u81ea\u52a8\u5316\u6d4b\u8bd5\u73af\u5883\u7684\u529f\u80fd\uff0c\u8fde\u4ee3\u7801\u7f16\u8f91\u5668\u90fd\u7ed9\u4f60\u88c5\u597d\u4e86\uff0c\u8ba9\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u73af\u5883\u90e8\u7f72\u800c\u70e6\u607c\uff1b \u63d0\u4f9b\u4e86\u81ea\u52a8\u751f\u6210\u591a\u79cd\u62a5\u544a\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u8f93\u51fa\u4ec0\u4e48\u62a5\u544a\u5f62\u5f0f\u90fd\u884c\uff0c\u800c\u4e14\u6211\u4eec\u5728\u62a5\u544a\u4e2d\u8fd8\u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\u548c\u5931\u8d25\u622a\u56fe\u7684\u529f\u80fd\uff1b \u5bf9\u65ad\u8a00\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u63d0\u4f9b\u66f4\u53cb\u597d\u5316\u7684\u9519\u8bef\u63d0\u793a\uff0c\u8ba9\u5b9a\u4f4d\u95ee\u9898\u7cbe\u51c6\u9ad8\u6548\uff1b \u4e0d\u4ec5\u652f\u6301\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u63a7\u5236\uff0c\u800c\u4e14\u8fd8\u652f\u6301\u52a8\u6001\u63a7\u5236\u7528\u4f8b\u6279\u91cf\u6267\u884c\u7684\u603b\u65f6\u95f4\uff0c\u786e\u4fdd CI \u73af\u5883\u4e0b\u80fd\u987a\u7545\u8fd0\u884c\uff1b \u652f\u6301\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\u6267\u884c\u3001PMS \u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6807\u7b7e\u5316\u6267\u884c\u65b9\u6848\uff0c\u6ee1\u8db3\u4f60\u5404\u79cd\u573a\u666f\u4e0b\u7684\u6267\u884c\u9700\u6c42\uff1b \u652f\u6301\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u529f\u80fd\uff0c\u53ef\u5b9a\u4f4d\u53ef\u65ad\u8a00\uff0c\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\uff1b \u5b8c\u7f8e\u517c\u5bb9 Wayland \u548c X11\uff0c\u771f\u6b63\u505a\u5230\u4e00\u5957\u4ee3\u7801\uff0c\u968f\u5904\u6267\u884c\uff1b \u652f\u6301\u591a\u79cd\u65b9\u5f0f\u7684\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u5176\u4e2d\u5f02\u6b65\u56de\u586b\u7684\u65b9\u6848\uff0c\u5b8c\u7f8e\u89e3\u51b3\u4e86\u6570\u636e\u56de\u586b\u7684\u8017\u65f6\u95ee\u9898\uff1b \u3010\u89c6\u9891\u4ecb\u7ecd\u3011"},{"location":"#_2","title":"\u4e8c\u3001\u5b89\u88c5\u4f7f\u7528","text":"\u57fa\u7840\u6846\u67b6\uff1ahttps://github.com/linuxdeepin/deepin-autotest-framework \u4ece PyPI \u5b89\u88c5: sudo pip3 install youqu\n \u521b\u5efa\u9879\u76ee: youqu-startproject youqu\n \u5b89\u88c5\u4f9d\u8d56: cd youqu\nbash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002 \u5e94\u7528\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684\u5e94\u7528\u540d\u79f0\u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music cd apps/\n \u5c06\u5e94\u7528\u5e93\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u50cf\u8fd9\u6837\uff1a youqu\n\u251c\u2500\u2500 apps\n\u2502 \u251c\u2500\u2500 autotest_deepin_music # \u5e94\u7528\u5e93\n...\n \u5e94\u7528\u5e93\u7684\u540d\u79f0\u4e0d\u53ef\u4ee5\u4fee\u6539\u3002"},{"location":"#_3","title":"\u4e09\u3001\u8fd0\u884c","text":""},{"location":"#1","title":"1. \u5de5\u4f5c\u7a7a\u95f4","text":"\u57fa\u7840\u6846\u67b6\u5de5\u7a0b\u76ee\u5f55\u5efa\u8bae\u653e\u5728 ~ \u76ee\u5f55\u4e0b\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u4e5f\u53ef\u4ee5\u8fd0\u884c\uff0c\u4f46\u662f\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u9700\u8981\u505a\u73af\u5883\u6e05\u7406\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u5b58\u5728\u4ee3\u7801\u88ab\u5220\u9664\u7684\u98ce\u9669\u3002 \u5982\u679c\u4f60\u7684\u673a\u5668\u4e0a\u4e0d\u540c\u76ee\u5f55\u4e0b\u5b58\u5728\u591a\u4e2a YouQu \u5de5\u7a0b\uff0c\u90a3\u4e48\u5728\u8fd0\u884c\u4e4b\u524d\uff0c\u8bf7\u5148\u6267\u884c env.sh \u6821\u6b63\u76f8\u5173\u73af\u5883\u3002"},{"location":"#2","title":"2. \u6267\u884c\u5668","text":"\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u6709\u4e00\u4e2a manage.py \uff0c\u5b83\u662f\u4e00\u4e2a\u6267\u884c\u5668\u5165\u53e3\uff0c\u63d0\u4f9b\u4e86\u672c\u5730\u6267\u884c\u3001\u8fdc\u7a0b\u6267\u884c\u7b49\u7684\u529f\u80fd\u3002 \u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6765\u6267\u884c\uff1a youqu manage.py run -a deepin-music\n"},{"location":"#21","title":"2.1. \u672c\u5730\u6267\u884c","text":"youqu manage.py run\n"},{"location":"#211","title":"2.1.1. \u914d\u7f6e\u6587\u4ef6","text":"\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u914d\u7f6e\u53c2\u6570 \u5728\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u91cc\u9762\u652f\u6301\u914d\u7f6e\u5bf9\u6267\u884c\u7684\u4e00\u4e9b\u53c2\u6570\u8fdb\u884c\u914d\u7f6e\uff0c\u5e38\u7528\u7684\u5982\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;-----------------------------------------------\n;1.KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2.KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f\n;e.g. TAGS = L1 or smoke\n;-----------------------------------------------\n;\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\uff0c\u5c06\u8981\u6267\u884c\u7684\u7528\u4f8b\u5199\u5165\u6307\u5b9a\u7684 csv \u6587\u4ef6\n;\u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u4ece\u57fa\u7840\u6846\u67b6\u6839\u76ee\u5f55\u5f00\u59cb\uff1ae.g. CASE_FILE = case_list.txt\n;\u5982\u679c\u8fd9\u91cc\u6709\u503c\uff0cAPP_NAME KEYWORDS TAGS \u7684\u914d\u7f6e\u5747\u4e0d\u751f\u6548\nCASE_FILE =\n;=============================== RUNNER CONFIG ===================================\n[runner]\n;\u6700\u5927\u5931\u8d25\u7528\u4f8b\u6570\u91cf\u7684\u5360\u6bd4\n;\u6bd4\u5982\uff1a\u603b\u6267\u884c\u7528\u4f8b\u6570\u4e3a 100, \u82e5 MAX_FAIL = 0.5,\u5219\u5931\u8d25\u7528\u4f8b\u6570\u8fbe\u5230 50 \u5c31\u4f1a\u7ec8\u6b62\u6d4b\u8bd5\u3002\nMAX_FAIL = 1\n;\u5355\u6761\u7528\u4f8b\u7684\u8d85\u65f6\u65f6\u95f4\uff0c\u5982\u679c\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u8d85\u65f6\uff0c\u8fd9\u6761\u7528\u4f8b\u4f1a\u88ab\u505c\u6b62\uff0c\u540e\u7eed\u7528\u4f8b\u7ee7\u7eed\u6267\u884c\u3002\n;\u5355\u4f4d\u4e3a\u79d2\n;\u8fd9\u662f\u4e00\u4e2a\u5168\u5c40\u7edf\u4e00\u914d\u7f6e\uff0c\u5982\u679c\u67d0\u6761\u7528\u4f8b\u9700\u8981\u5355\u72ec\u914d\u7f6e\u8d85\u65f6\u65f6\u95f4\uff0c\u53ef\u4ee5\u5728\u7528\u4f8b\u4e2d\u8fd9\u6837\u5199\uff1a\n;@pytest.mark.timeout(500)\n;def test_xxx_001():\n; ...\n;\u4f1a\u8bdd\u8d85\u65f6\uff08\u6240\u6709\u7528\u4f8b\u6267\u884c\u7684\u8d85\u65f6\u65f6\u95f4\uff09\u662f\u6839\u636e\u5168\u5c40\u8d85\u65f6\u914d\u7f6e\u548c\u7528\u4f8b\u5355\u72ec\u8d85\u65f6\u914d\u7f6e\u81ea\u52a8\u8ba1\u7b97\u7684\u3002\nCASE_TIME_OUT = 200\n;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\n;\u6ce8\u610f\uff0cRERUN = 1 \u8868\u793a\u91cd\u8dd1 1 \u6b21\uff0c\u5373\u7b2c\u4e00\u6b21\u7528\u4f8b\u6267\u884c\u5931\u8d25\u4f1a\u81ea\u52a8\u91cd\u8dd1 1 \u6b21\uff0c\u603b\u5171\u6267\u884c 2 \u6b21\uff1b\n;\u5982\u679c\u7b2c 2 \u6b21\u6267\u884c\u6210\u529f\uff0c\u7ed3\u679c\u6210\u529f\uff0c\u5931\u8d25\u4ea6\u4e3a\u5931\u8d25\u3002\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c 1 \u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff0cRERUN >= RECORD_FAILED_CASE\u3002\n;1.\u5173\u95ed\u5f55\u5c4f\uff1aRECORD_FAILED_CASE > RERUN\n;2.\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1aRECORD_FAILED_CASE = 0\nRECORD_FAILED_CASE = 1\n;yes \u6bcf\u6761\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u8fdb\u884c\u73af\u5883\u6e05\u7406\nCLEAN_ALL = yes\n;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387, \u6bd4\u5982\uff1a1920x1080\n;no: \u8868\u793a\u4e0d\u505a\u5206\u8fa8\u7387\u6821\u9a8c\nRESOLUTION = 1920x1080\n;\u4e0d\u8df3\u8fc7\u7528\u4f8b\uff0ccsv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86 skip-xxx\u7684\u7528\u4f8b\u4e0d\u8df3\u8fc7\nNOSKIP = no\n;ignore fixed\n;no\uff0c\u53ea\u8981\u6807\u8bb0\u4e86fixed\u7684\u7528\u4f8b\uff0c\u5373\u4f7f\u6807\u8bb0\u4e86skip-\uff0c\u4e5f\u4f1a\u6267\u884c\uff1b\n;yes\uff0cfixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\uff1b\nIFIXED = no\n;\u8981\u5b89\u88c5deb\u5305\u7684\u8def\u5f84\n;e.g : ~/Downloads/ \u5b89\u88c5\u4e0b\u8f7d\u76ee\u5f55\u4e0b\u7684deb\u5305\uff0c\u5982\u679c\u662f\u8fdc\u7a0b\u6267\u884c\uff0c\u4f1a\u81ea\u52a8\u62f7\u8d1d\u5230\u8fdc\u7a0b\u5e76\u5b89\u88c5\u3002\nDEB_PATH =\n;DEBUG \u6a21\u5f0f\u6267\u884c\u7528\u4f8b\uff0c\u53ea\u6536\u96c6\u4e0d\u6267\u884c\u7528\u4f8b\uff0c\u4e5f\u4e0d\u505a\u8bbe\u5907\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002\nDEBUG = no\n;\u8bb0\u5f55top\u547d\u4ee4\u67e5\u8be2\u7684\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0cTOP = 3 \u8868\u793a\u8bb0\u5f55\u524d3\u4e2a\u8fdb\u7a0b\u3002\nTOP =\n;\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\nREPEAT =\n;\u9ed8\u8ba4\u5728\u6240\u6709\u6d4b\u8bd5\u5b8c\u6210\u4e4b\u540e\u8f93\u51fa\u62a5\u9519\u4fe1\u606f.\n;yes, \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\nDURING_FAIL = no\n;\u6ce8\u518c\u81ea\u542f\u670d\u52a1\nAUTOSTART = no\n;=============================== REPORT CONFIG ===================================\n[report]\n;\u6d4b\u8bd5\u62a5\u544a\u7684title\nREPORT_TITLE = YouQu Report\n;\u6d4b\u8bd5\u62a5\u544a\u7684name\nREPORT_NAME = YouQu Report\n;\u6d4b\u8bd5\u62a5\u544a\u7684\u9ed8\u8ba4\u8bed\u8a00\n;en:English\n;ru:\u0420\u0443\u0441\u0441\u043a\u0438\u0439\n;zh:\u4e2d\u6587\n;de:Deutsch\n;nl:Nederlands\n;he:Hebrew\n;br:Brazil\n;pl:Polski\n;ja:\u65e5\u672c\u8a9e\n;es:Espa\u00f1ol\n;kr:\ud55c\uad6d\uc5b4\n;fr:Fran\u00e7ais\n;az:Az\u0259rbaycanca\nREPORT_LANGUAGE = zh\n;\u7528\u4f8b\u6267\u884c\u5b8c\u540e\u751f\u6210\u7684\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n;\u76ee\u524d\u652f\u6301 allure, xml, json \uff08\u652f\u6301\u540c\u65f6\u751f\u6210\uff09\nREPORT_FORMAT = allure, xml, json\n;\u6307\u5b9a\u62a5\u544a\u751f\u6210\u7684\u8def\u5f84\uff08\u76f8\u5bf9\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\uff09\nALLURE_REPORT_PATH = report/\nXML_REPORT_PATH = report/\nJSON_REPORT_PATH = report/\n;=============================== GLOBAL CONFIG ===================================\n[globalconfig]\n;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\nPASSWORD = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\nIMAGE_MATCH_NUMBER = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6bcf\u6b21\u95f4\u9694\u7b49\u5f85\u65f6\u95f4\nIMAGE_MATCH_WAIT_TIME = 1\n;\u56fe\u50cf\u8bc6\u522b\u5339\u914d\u5ea6\nIMAGE_RATE = 0.9\n;\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u5b9e\u65f6\u56fe\u50cf\u4fdd\u5b58\u8def\u5f84\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u5750\u6807\nSCREEN_CACHE = /tmp/screen.png\n;\u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\u7684\u8def\u5f84\nTMPDIR = /tmp/tmpdir\n;\u7cfb\u7edf\u4e3b\u9898\nSYS_THEME = deepin\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = youqu-dev.uniontech.com\n;OpenCV\u670d\u52a1\u7aef\u5730\u5740\nOPENCV_SERVER_HOST = youqu-dev.uniontech.com\n;=============================== PMS CONFIG ===================================\n;PMS\u76f8\u5173\u914d\u7f6e\uff0c\u5305\u542b\u4ee5\u4e0b\u51e0\u4e2a\u65b9\u9762\uff1a\n;1.PMS\u6d4b\u8bd5\u5957\u6267\u884c\n;2.\u81ea\u52a8\u4ecePMS\u722c\u53d6\u6570\u636e\u5e76\u540c\u6b65\u672c\u5730CSV\u6587\u4ef6\n;3.PMS\u6570\u636e\u56de\u586b\n[pms]\n;PMS\u7684\u7528\u6237\u540d,\u5982: ut001234\nPMS_USER =\n;PMS\u7684\u5bc6\u7801\nPMS_PASSWORD =\n;PMS\u6d4b\u8bd5\u5957\u7684ID\n;\u5728PMS\u4e0a\u67e5\u770b\u7528\u4f8b\u201c\u5957\u4ef6\u201d\u94fe\u63a5: https://pms.uniontech.com/testsuite-view-495.html\n;\u6d4b\u8bd5\u5957ID\u4e3a: 495\nSUITE_ID =\n;\u6570\u636e\u56de\u586b\u5fc5\u987b\u5173\u8054PMS\u6d4b\u8bd5\u5355\n;\u5728PMS\u4e0a\u67e5\u770b\u6d4b\u8bd5\u5355\u94fe\u63a5: https://pms.uniontech.com/testtask-cases-20747.html\n;\u6d4b\u8bd5\u5355ID\u4e3a: 20747\nTASK_ID =\n;\u5c06\u6d4b\u8bd5\u7ed3\u679c\u6570\u636e\u56de\u586b\u5230PMS\n;\u4e3a\u7a7a: \u8868\u793a\u4e0d\u56de\u586b,\u4e0d\u4f1a\u5728\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u751f\u6210json\u7ed3\u679c\u6587\u4ef6;\n;async: \u8868\u793a\u9010\u6761\u5f02\u6b65\u56de\u586b,\u540e\u9762\u4e00\u6761\u6267\u884c\u5f00\u59cb\u65f6\u901a\u8fc7\u5b50\u7ebf\u7a0b\u5bf9\u524d\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u8fdb\u884c\u56de\u586b\uff0c\u5982\u6b64\u5b9e\u73b0\u65f6\u95f4\u6548\u7387\u6700\u5927\u5316;\n;finish: \u8868\u793a\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u6210\u4e4b\u540e\u9010\u4e2a\u56de\u586b(PMS\u4e0d\u652f\u6301\u5e76\u53d1);\nSEND_PMS =\n;\u6570\u636e\u56de\u586b\u7684\u89e6\u53d1\u8005\n;auto: \u6846\u67b6\u81ea\u52a8\u56de\u586b,\u914d\u5408SEND_PMS\u914d\u7f6e\u4f7f\u7528,\u4f60\u53ef\u4ee5\u9009\u62e9\u5728\u4e0d\u540c\u7684\u9636\u6bb5\u8fdb\u884c\u6570\u636e\u56de\u586b;\n;hand: \u624b\u52a8\u56de\u586b,\u6bcf\u6761\u7528\u4f8b\u4ecd\u7136\u4f1a\u751f\u6210json\u6587\u4ef6,\u4f46\u6846\u67b6\u4e0d\u4f1a\u8fdb\u884c\u6570\u636e\u56de\u586b,\u9700\u8981\u4f60\u53ef\u4ee5\u5728\u4f60\u60f3\u8981\u53d1\u9001\u7684\u65f6\u95f4\u70b9\u624b\u52a8\u89e6\u53d1\u56de\u586b;\nTRIGGER = auto\n;PMS\u56de\u586b\u7684\u91cd\u8bd5\u6b21\u6570\n;\u5982\u679c\u63a5\u53e3\u8bf7\u6c42\u5931\u8d25,\u4f1a\u8fdb\u884c\u91cd\u8bd5\nSEND_PMS_RETRY_NUMBER = 2\n[csv_link_pms_lib]\n;caselib: \u7528\u4f8b\u5e93\n;testcase: \u4ea7\u54c1\u5e93\u7528\u4f8b\nCASE_FROM = caselib\n[csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/caselib-browse-81.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 81\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic =\n[export_csv]\n;\u5bfc\u51fa\u7684csv\u6587\u4ef6\u540d\u79f0\uff0c\u9ed8\u8ba4 case_list.csv\nCSV_FILE = case_list.csv\n;exportcsv \u547d\u4ee4\u5bfc\u51fa case_list.csv \u6587\u4ef6\u65f6\u914d\u7f6e\u7684\u5b57\u6bb5\u540d\uff0c\u7528\u4f8b\u540d\u79f0\u9ed8\u8ba4\u5b58\u5728\u7b2c\u4e00\u5217\uff0c\u65e0\u9700\u6dfb\u52a0\nCSV_HEARD = \u7528\u4f8b\u7ea7\u522b,\u7528\u4f8b\u7c7b\u578b,\u6d4b\u8bd5\u7ea7\u522b,\u662f\u5426\u8df3\u8fc7\n[log_cli]\n;\u65e5\u5fd7\u76f8\u5173\u914d\u7f6e\uff08\u4e0d\u6253\u5370\u6784\u9020\u51fd\u6570\u548c\u9b54\u6cd5\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff09\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = DEBUG\n# ============= \u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u914d\u7f6e ================\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u5f00\u5934\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7, \u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_STARTSWITH = Assert\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u7ed3\u5c3e\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_ENDSWITH = Widget\n;\u652f\u6301\u7c7b\u540d\u5305\u542b xxx \u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_CONTAIN = ShortCut\n# ==============================================\n \u914d\u7f6e\u5b8c\u6210\u4e4b\u540e\uff0c\u76f4\u63a5\u5728\u547d\u4ee4\u884c\u6267\u884c manage.py \u5c31\u597d\u4e86\u3002 youqu manage.py run\n"},{"location":"#212","title":"2.1.2. \u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a youqu manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -h, --help show this help message and exit\n-a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--record_failed_case RECORD_FAILED_CASE\n\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--max_fail MAX_FAIL \u6700\u5927\u5931\u8d25\u7387\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--resolution RESOLUTION\n\u68c0\u67e5\u5206\u8fa8\u7387\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms {,async,finish}\n\u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--trigger {,auto,hand}\n\u89e6\u53d1\u8005\n-f CASE_FILE, --case_file CASE_FILE\n\u6839\u636e\u6587\u4ef6\u6267\u884c\u7528\u4f8b\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n--pms_user PMS_USER pms \u7528\u6237\u540d\n--pms_password PMS_PASSWORD\npms \u5bc6\u7801\n--suite_id SUITE_ID pms \u6d4b\u8bd5\u5957ID\n--pms_info_file PMS_INFO_FILE\npms \u4fe1\u606f\u6587\u4ef6\n--top TOP \u8fc7\u7a0b\u4e2d\u8bb0\u5f55top\u547d\u4ee4\u4e2d\u7684\u503c\n--lastfailed \u4ec5\u6267\u884c\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\n--duringfail \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\n--repeat REPEAT \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n--project_name PROJECT_NAME\n\u5de5\u7a0b\u540d\u79f0\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--build_location BUILD_LOCATION\n\u6784\u5efa\u5730\u533a\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--line LINE \u6267\u884c\u7684\u4e1a\u52a1\u7ebf\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--autostart AUTOSTART \u7528\u4f8b\u6267\u884c\u7a0b\u5e8f\u6ce8\u518c\u5230\u5f00\u673a\u81ea\u542f\u670d\u52a1\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a youqu manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\"\n \u547d\u4ee4\u884c\u53c2\u6570\u4f18\u5148\u7ea7\u662f\u9ad8\u4e8e\u914d\u7f6e\u6587\u4ef6\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u4e86\u5bf9\u5e94\u7684\u53c2\u6570\uff0c\u914d\u7f6e\u6587\u4ef6\u4e2d\u4e0d\u7ba1\u662f\u5426\u914d\u7f6e\u5747\u4e0d\u751f\u6548\u3002 --app \u5165\u53c2\u8fd8\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\uff0c\u4e0b\u9762\u7684\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u540c\u6837\u652f\u6301\u3002"},{"location":"#22","title":"2.2. \u8fdc\u7a0b\u6267\u884c","text":"\u8fdc\u7a0b\u6267\u884c\u5c31\u662f\u7528\u672c\u5730\u4f5c\u4e3a\u670d\u52a1\u7aef\u63a7\u5236\u8fdc\u7a0b\u673a\u5668\u6267\u884c\uff0c\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u76f8\u540c\uff1b \u4f7f\u7528 remote \u547d\u4ee4\uff1a youqu manage.py remote\n"},{"location":"#221","title":"2.2.1. \u8fdc\u7a0b\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u6267\u884c","text":"\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u6267\u884c\u5c31\u662f\u7531\u672c\u5730 YouQu \u4f5c\u4e3a\u670d\u52a1\u7aef\uff0c\u63a7\u5236\u8fdc\u7a0b N \u53f0\u673a\u5668\u6267\u884c\u76f8\u540c\u7684\u7528\u4f8b\uff0c\u6267\u884c\u5b8c\u4e4b\u540e\u6240\u6709\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u7ed3\u679c\u4f1a\u8fd4\u56de\u7ed9\u670d\u52a1\u7aef report \u76ee\u5f55\u4e0b\uff1b \u8fdc\u7a0b\u6267\u884c\u540c\u6837\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u8fdb\u884c\u7528\u4f8b\u76f8\u5173\u914d\u7f6e\uff1b \u9700\u8981\u91cd\u70b9\u8bf4\u4e00\u4e0b\u8fdc\u7a0b\u6267\u884c\u65f6\u7684\u6d4b\u8bd5\u673a\u4fe1\u606f\u914d\u7f6e\uff0c\u5728\u914d\u7f6e\u6587\u4ef6 setting/remote.ini \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\u3001IP\u3001\u5bc6\u7801\u3002 ;=============================== CLIENT LIST =====================================\n; \u6d4b\u8bd5\u673a\u914d\u7f6e\u5217\u8868\n;[client{number}] ;\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u6709\u591a\u5c11\u53f0\u6d4b\u8bd5\u673a\u5c31\u5199\u591a\u5c11\u4e2a client\uff0c\u522b\u540d\u5fc5\u987b\u5305\u542b client \u5b57\u7b26\uff0c\u4e14\u4e0d\u80fd\u91cd\u590d\u3002\n;user = ;\u6d4b\u8bd5\u673a user\n;ip = ;\u6d4b\u8bd5\u673a ip\n;password = 1 ;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801, \u53ef\u4ee5\u4e0d\u914d\u7f6e\u6b64\u9879\uff0c\u9ed8\u8ba4\u53d6 CLIENT_PASSWORD \u7684\u503c\uff1b\n;\u5982\u679c\u4f60\u6240\u6709\u6d4b\u8bd5\u673a\u5bc6\u7801\u90fd\u76f8\u540c\uff0c\u90a3\u4e48\u53ea\u9700\u8981\u914d\u7f6e CLIENT_PASSWORD \u5c31\u53ef\u4ee5\u4e86\n;=================================================================================\n[client1]\nuser = uos\nip = 10.8.15.xx\n[client2]\nuser = uos\nip = 10.8.15.xx\n[client3]\nuser = uos\nip = 10.8.11.xx\n \u6709\u591a\u5c11\u53f0\u673a\u5668\u5c31\u50cf\u8fd9\u6837\u53c2\u8003\u4e0a\u9762\u7684\u683c\u5f0f\u5199\u5c31\u884c\u4e86\u3002 \u7136\u540e\u5728\u547d\u4ee4\u884c\uff1a youqu manage.py remote\n \u8fd9\u6837\u8fd0\u884c\u662f\u4ece\u914d\u7f6e\u6587\u4ef6\u53bb\u8bfb\u53d6\u76f8\u5173\u914d\u7f6e\u3002 \u5982\u679c\u4f60\u4e0d\u60f3\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\uff0c\u4f60\u4ecd\u7136\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u8fdb\u884c\u4f20\u53c2\uff0c \u4ee5\u4e0b\u4e3a python3 manage.py remote \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -h, --help show this help message and exit\n-c CLIENTS, --clients CLIENTS\n\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679cpassword\u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6sett\ning/remote.ini\u4e2dCLIENT_PASSWORD\u7684\u503c,\u6bd4\u5982: uos@10.8.13.33:1\n\u6216 uos@10.8.13.33\n-s, --send_code \u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a\uff08\u4e0d\u542breport\u76ee\u5f55\uff09\n-e, --build_env \u642d\u5efa\u6d4b\u8bd5\u73af\u5883,\u5982\u679c\u4e3ayes\uff0c\u4e0d\u7ba1send_code\u662f\u5426\u4e3ayes\u90fd\u4f1a\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a.\n-p CLIENT_PASSWORD, --client_password CLIENT_PASSWORD\n\u6d4b\u8bd5\u673a\u5bc6\u7801\uff08\u5168\u5c40\uff09\n-y PARALLEL, --parallel PARALLEL\nyes:\u8868\u793a\u6240\u6709\u6d4b\u8bd5\u673a\u5e76\u884c\u8dd1\uff0c\u6267\u884c\u76f8\u540c\u7684\u6d4b\u8bd5\u7528\u4f8b;no:\u8868\u793a\u6d4b\u8bd5\u673a\u5206\u5e03\u5f0f\u6267\u884c\uff0c\u670d\u52a1\u7aef\u4f1a\u6839\u636e\u6536\u96c6\u5230\u7684\u6d4b\u8bd5\u7528\u4f8b\u81ea\n\u52a8\u5206\u914d\u7ed9\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u3002\n \u9664\u4e86\u8fd9\u4e9b\u7279\u6709\u53c2\u6570\u4ee5\u5916\uff0c\u5b83\u540c\u6837\u652f\u6301\u672c\u5730\u6267\u884c\u7684\u6240\u6709\u53c2\u6570\uff1b \u5728\u547d\u4ee4\u884c\u8fd9\u6837\u8fd0\u884c\uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\"\n \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report \u76ee\u5f55\u4e0b\u56de\u6536\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u7684\u6d4b\u8bd5\u62a5\u544a\u3002 \u6ce8\u610f\uff0c\u5982\u679c\u8fdc\u7a0b\u673a\u5668\u6ca1\u6709\u642d\u5efa\u81ea\u52a8\u5316\u6d4b\u8bd5\u73af\u5883\uff0c\u8bb0\u5f97\u52a0\u4e0a\u53c2\u6570 -e \uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\" -e\n \u6267\u884c\u524d\u786e\u4fdd\u8fdc\u7a0b\u673a\u5668\u5df2\u7ecf\u5f00\u542f\u4e86 ssh \u670d\u52a1\uff0c\u5426\u5219\u4f1a\u63d0\u793a\u65e0\u6cd5\u8fde\u63a5\uff0c\u5982\u679c\u6ca1\u6709\u5f00\u542f\uff0c\u8bf7\u624b\u52a8\u5f00\u542f\uff1a sudo systemctl restart ssh\nsudo systemctl enable ssh\n \u914d\u7f6e\u6587\u4ef6\u5176\u4ed6\u76f8\u5173\u914d\u7f6e\u9879\u8be6\u7ec6\u8bf4\u660e\uff0c\u8bf7\u67e5\u770b\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u6ce8\u91ca\u5185\u5bb9\u3002"},{"location":"#222","title":"2.2.2. \u8fdc\u7a0b\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u8d1f\u8f7d\u5747\u8861\u6267\u884c","text":"\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u8d1f\u8f7d\u5747\u8861\u6267\u884c\u4e5f\u662f\u7528\u672c\u5730\u4f5c\u4e3a\u670d\u52a1\u7aef\u63a7\u5236\u8fdc\u7a0b\u673a\u5668\u6267\u884c\uff0c\u4f46\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u4e0d\u540c\uff0c\u800c\u662f\u6240\u6709\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u4e4b\u548c\uff0c\u4e3a\u4f60\u60f3\u8981\u6267\u884c\u7684\u7528\u4f8b\u96c6\uff1b \u4f3c\u4e4e\u6709\u70b9\u96be\u4ee5\u7406\u89e3\uff0c\u6211\u7528\u5927\u767d\u8bdd\u4e3e\u4f8b\u63cf\u8ff0\u4e0b\u5c31\u662f\uff0c\u670d\u52a1\u7aef\u60f3\u8981\u6267\u884c 10 \u6761\u7528\u4f8b\uff0c\u73b0\u5728\u8fdc\u7a0b\u673a\u5668\u6709 5 \u53f0\uff1b \u7136\u540e\u670d\u52a1\u7aef\u5c31\u5148\u62ff\u7740\u7b2c 1 \u6761\u7528\u4f8b\u7ed9\u8fdc\u7a0b 1 \u53f7\u673a\u6267\u884c\uff0c\u62ff\u7b2c 2 \u6761\u7528\u4f8b\u7ed9\u8fdc\u7a0b 2 \u53f7\u673a\u6267\u884c...\uff0c\u5982\u6b64\u5faa\u73af\u76f4\u5230\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\uff0c\u8fd9\u5c31\u662f\u8d1f\u8f7d\u5747\u8861\u6267\u884c\u3002 \u4f7f\u7528\u65b9\u6cd5\u548c\u524d\u9762\u4e00\u6837\uff0c\u53ea\u662f\u9700\u8981\u589e\u52a0\u4e00\u4e2a\u53c2\u6570\uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\" --parallel no\n"},{"location":"#23-pms","title":"2.3. PMS \u6570\u636e\u56de\u586b","text":"\u6d4b\u8bd5\u5355\u5173\u8054\u7684\u7528\u4f8b\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u5bf9\u5e94\u7684\u53bb\u8dd1\u8fd9\u4e9b\u5173\u8054\u7684\u7528\u4f8b\uff0c\u5e76\u4e14\u5c06\u6267\u884c\u7684\u7ed3\u679c\u56de\u586b\u7684\u6d4b\u8bd5\u7528\u4f8b\u7684\u72b6\u6001\u91cc\u9762\u3002 PMS \u6570\u636e\u56de\u586b\u4e3b\u8981\u6709\u4e09\u79cd\u65b9\u5f0f\uff1a \uff081\uff09\u5f02\u6b65\u56de\u586b \u5728\u7528\u4f8b\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\uff0c\u91c7\u7528\u5f02\u6b65\u7684\u65b9\u5f0f\u53bb\u8fdb\u884c\u6570\u636e\u56de\u586b\uff0c\u76f4\u767d\u7684\u8bb2\u5c31\u662f\uff0c\u7b2c\u4e8c\u6761\u7528\u4f8b\u5f00\u59cb\u8dd1\u7684\u65f6\u5019\uff0c\u901a\u8fc7\u5b50\u7ebf\u7a0b\u53bb\u505a\u7b2c\u4e00\u6761\u7528\u4f8b\u7684\u6570\u636e\u56de\u586b\uff0c\u5982\u6b64\u5faa\u73af\uff0c\u76f4\u5230\u6240\u6709\u7528\u4f8b\u6267\u884c\u7ed3\u675f\uff1b \u8fd9\u79cd\u65b9\u6848\u7684\u65f6\u95f4\u6548\u7387\u6700\u9ad8\u7684\uff0c\u56e0\u4e3a\u7406\u8bba\u4e0a\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u662f\u5927\u4e8e\u6570\u636e\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\u65f6\u95f4\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u5f53\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u6570\u636e\u56de\u586b\u4e5f\u5b8c\u6210\u4e86\u3002 \u4f7f\u7528\u65b9\u6cd5\uff0c\u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u4ee5\u4e0b\u53c2\u6570\uff1a\uff08\u4ee5\u4e0b\u6d89\u53ca\u5230\u7684\u53c2\u6570\u914d\u7f6e\u90fd\u662f\u5728\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u914d\u7f6e\uff09 PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = async\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \u8fd9\u4e2a\u53c2\u6570\u53ef\u586b\u53ef\u4e0d\u586b\uff0c\u4f46\u662f\u586b\u4e86\u53ef\u4ee5\u63d0\u9ad8\u7528\u4f8b\u7684\u6267\u884c\u901f\u5ea6\uff0c\u56e0\u4e3a\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u53ef\u4ee5\u6307\u5b9a\u5230\u5177\u4f53\u7684\u5e94\u7528\u5e93\u3002\uff08\u4e0b\u540c\uff09\n \uff082\uff09\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u56de\u586b \u7b49\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u518d\u9010\u4e2a\u8fdb\u884c\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u6b64\u65b9\u6848\u65f6\u95f4\u6548\u7387\u6bd4\u8f83\u4f4e\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \uff083\uff09\u624b\u52a8\u56de\u586b \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4e0d\u505a\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u540e\u7eed\u624b\u52a8\u5c06\u7ed3\u679c\u8fdb\u884c\u56de\u586b\u8bf7\u6c42\u3002 \u7528\u4f8b\u6267\u884c\u65f6\u914d\u7f6e\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = hand\nAPP_NAME = \u540e\u7eed\u624b\u52a8\u56de\u586b\u65b9\u6cd5\uff1a youqu manage.py pms --send2task yes\n"},{"location":"#_4","title":"\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898","text":"\u7531\u540c\u5b66\u53ef\u80fd\u4f1a\u53d1\u73b0\uff0c\u600e\u4e48\u56de\u586b\u4e00\u6b21\u4e4b\u540e\uff0c\u540e\u9762\u60f3\u518d\u6b21\u56de\u586b\u5c31\u4e0d\u751f\u6548\u4e86\uff1b \u8fd9\u662f\u56e0\u4e3a\u4e3a\u4e86\u5e94\u5bf9\u524d\u9762\u63d0\u5230\u7684\u591a\u79cd\u6570\u636e\u56de\u586b\u7684\u65b9\u5f0f\uff0c\u5728 report \u76ee\u5f55\u4e0b\u4f1a\u7531 pms_xxx \u5f00\u5934\u7684\u76ee\u5f55\uff0c\u8bb0\u5f55\u4e86\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u548c\u56de\u586b\u60c5\u51b5\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u4e4b\u524d\u5df2\u7ecf\u56de\u586b\u8fc7\u4e86\uff0c\u540e\u7eed\u5c31\u4e0d\u4f1a\u518d\u6b64\u89e6\u53d1\u56de\u586b\u4e86\uff1b \u5982\u679c\u4f60\u60f3\u91cd\u65b0\u505a\u56de\u586b\uff0c\u4f60\u53ef\u4ee5\u628a report/pms_xxx \u76ee\u5f55\u5220\u6389\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u91cd\u65b0\u505a\u6570\u636e\u56de\u586b\u4e86\uff1b"},{"location":"#24-csv","title":"2.4. \u5bfc\u51fa CSV \u6587\u4ef6","text":"\u6846\u67b6\u63d0\u4f9b\u5bfc\u51fa\u6307\u5b9a\u6807\u7b7e\u7528\u4f8b\u7684\u529f\u80fd\uff1a youqu manage.py exportcsv -a deepin-album -t CICD\n \u8868\u793a\u5bfc\u51fa deepin-album \u7684\u7528\u4f8b\u4e2d\u6807\u8bb0\u4e86 CICD \u6807\u7b7e\u7684\u7528\u4f8b\uff0c\u5bfc\u51fa CSV \u6587\u4ef6\u7684\u5b57\u6bb5\u683c\u5f0f\u5df2\u7ecf\u9002\u914d\u4e86 CICD \u7684\u8981\u6c42\u3002"},{"location":"#25-app","title":"2.5. \u811a\u624b\u67b6\u65b0\u5efa APP \u5de5\u7a0b","text":"\u65b0\u5efa\u4e00\u4e2a APP \u5de5\u7a0b\uff1a youqu manage.py startapp autotest_deepin_some \u8fd9\u6837\u5728 apps \u76ee\u5f55\u4e0b\u4f1a\u521b\u5efa\u4e00\u4e2a\u5b50\u9879\u76ee\u5de5\u7a0b autotest_deepin_some\uff0c\u540c\u65f6\u65b0\u5efa\u597d\u5de5\u7a0b\u6a21\u677f\u76ee\u5f55\u548c\u6a21\u677f\u6587\u4ef6\uff1a apps\n\u2514\u2500\u2500 autotest_deepin_some\n \u00a0\u00a0 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_case.py\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 config.ini\n \u00a0\u00a0 \u251c\u2500\u2500 config.py\n \u00a0\u00a0 \u251c\u2500\u2500 conftest.py\n \u00a0\u00a0 \u251c\u2500\u2500 control\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_assert.py\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some.csv\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u2514\u2500\u2500 widget\n \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 case_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 other.ini\n \u00a0\u00a0 \u251c\u2500\u2500 other_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 pic_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2514\u2500\u2500 ui.ini\n autotest_deepin_some \u662f\u4f60\u7684\u5de5\u7a0b\u540d\u79f0\uff0c\u6bd4\u5982\uff1aautotest_deepin_music \uff1b \u5728\u6b64\u57fa\u7840\u4e0a\uff0c\u4f60\u53ef\u4ee5\u5feb\u901f\u7684\u5f00\u59cb\u4f60\u7684 AT \u9879\u76ee\u3002"},{"location":"#26","title":"2.6. \u7528\u4f8b\u6807\u7b7e\u81ea\u52a8\u540c\u6b65","text":"\u7528\u4e8e\u81ea\u52a8\u540c\u6b65 PMS \u7528\u4f8b\u6807\u7b7e\u6570\u636e\u81f3\u672c\u5730 CSV \u6587\u4ef6\uff0c\u4e3b\u8981\u901a\u8fc7\u4ee5\u4e0b\u51e0\u4e2a\u914d\u7f6e\u6765\u63a7\u5236\uff1a APP_NAME = # \u6307\u5b9a\u8981\u540c\u6b65\u7684\u5e94\u7528\u540d\u79f0\nPMS_USER = # PMS\u7684\u7528\u6237\u540d\nPMS_PASSWORD = # PMS\u7684\u5bc6\u7801\n \u5728 [csv_link_pms_id] \u8282\u70b9\u4e0b\u6307\u5b9a csv \u6587\u4ef6\u540d\u4e0e PMS \u7528\u4f8b\u6a21\u5757\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u6bd4\u5982\uff1a [csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/testcase-browse-53.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 53\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic = 53\n \u5c06\u4ee5\u4e0a\u4fe1\u606f\u914d\u7f6e\u597d\u4e4b\u540e\uff0c\u5728\u547d\u4ee4\u884c\u6267\u884c\uff1a youqu manage.py pms --pms2csv yes\n \u6bcf\u6b21\u6267\u884c\u65f6\u539f csv \u6587\u4ef6\u4f1a\u81ea\u52a8\u5907\u4efd\u5728 report/csv_back \u76ee\u5f55\u4e0b\uff0c\u56e0\u6b64\u4f60\u4e0d\u7528\u62c5\u5fc3\u811a\u672c\u6267\u884c\u5bfc\u81f4\u4f60\u7684\u6570\u636e\u4e22\u5931\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u57fa\u7840\u6846\u67b6\u8bbe\u8ba1\u65b9\u6848","text":"# ====================================\n# Author : Mikigo\n# Time : 2022/3/18\n# version \uff1a1.0\n# ====================================\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"\u505a\u4e00\u4e2a\u7b80\u5355\u3001\u597d\u7528\u3001\u529f\u80fd\u5f3a\u5927\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u3002 \u4f5c\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4e00\u4e2a\u57fa\u7840\u6846\u67b6\uff0c\u4efb\u4f55\u5e94\u7528\u90fd\u80fd\u5f88\u65b9\u4fbf\u7684\u63a5\u5165\u8fdb\u6765\uff1b \u63d0\u4f9b\u6240\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u9700\u8981\u7684\u5e95\u5c42\u529f\u80fd\uff0c\u5e76\u5bf9\u5916\u63d0\u4f9b\u552f\u4e00\u7684\u63a5\u53e3\uff0c\u65b9\u4fbf\u5e94\u7528\u5e93\u4f7f\u7528\uff1b \u6574\u5408\u516c\u5171\u5e93\uff0c\u51cf\u5c11\u5e94\u7528\u5e93\u4ee3\u7801\u91cf\u548c\u65b9\u6cd5\u7ef4\u62a4\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u8bbe\u8ba1\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u7edf\u4e00\u6982\u5ff5","text":" \u57fa\u7840\u6846\u67b6 \u672c\u9879\u76ee\u662f\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\uff08AutoTest Basic Frame\uff09\uff0c\u5168\u79f0\u4e3a\u201c\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff08AT \u57fa\u7840\u6846\u67b6\uff09\u201d\u3002 AT \u57fa\u7840\u6846\u67b6\u662f\u505a\u4e3a\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\u6765\u8bbe\u8ba1\u7684\uff0c\u5b83\u63d0\u4f9b\u4e86\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u57fa\u7840\u529f\u80fd\uff0c\u4efb\u4f55\u5e94\u7528\u63a5\u5165\u8fdb\u6765\u90fd\u80fd\u5feb\u901f\u65b9\u4fbf\u7684\u8fdb\u884c\u65b9\u6cd5\u548c\u7528\u4f8b\u7f16\u5199\uff0c\u540c\u65f6\u5728\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u3001\u6807\u7b7e\u5316\u6267\u884c\u3001\u5206\u5e03\u5f0f\u6267\u884c\u3001\u591a\u79cd\u62a5\u544a\u8f93\u51fa\u3001\u4f18\u7f8e\u7684\u6267\u884c\u65e5\u5fd7\u3001\u5931\u8d25\u81ea\u52a8\u5f55\u5c4f\u548c\u622a\u56fe\u3001\u81ea\u52a8\u73af\u5883\u6e05\u7406\u7b49\u7b49\uff0c\u5b83\u90fd\u63d0\u4f9b\u4e86\u5b8c\u5584\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u66f4\u91cd\u8981\u7684\u662f\u8fd9\u4e00\u5207\u4f7f\u7528\u8d77\u6765\u90fd\u975e\u5e38\u7b80\u5355\u3002 \u57fa\u7840\u6846\u67b6\u4e2d\u5305\u542b\u5e94\u7528\u5e93\uff08apps\uff09\u3001\u6838\u5fc3\u5e93\uff08src\uff09\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09\u3002 \u5e94\u7528\u5e93\uff08apps\uff09 \u5404\u4e2a\u5e94\u7528\u81ea\u5df1\u7684\u4ed3\u5e93\uff0c\u91cc\u9762\u4e3b\u8981\u5305\u542b\u7684\u662f\u7528\u4f8b\u3001\u65b9\u6cd5\u53ca\u4e00\u4e9b\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u53eb autotest-dde-file-manager \u3002 \u6838\u5fc3\u5e93\uff08src\uff09 \u6838\u5fc3\u5e93\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u5230\u6240\u6709\u5e95\u5c42\u6838\u5fc3\u529f\u80fd\uff0c\u8fd9\u662f\u6700\u91cd\u8981\u7684\u4e00\u4e2a\u90e8\u5206\uff0c\u7075\u9b42\u3002\u5177\u4f53\u529f\u80fd\u6a21\u5757\u53ca\u8bf4\u660e\u4f1a\u5728\u4e0b\u9762\u7b2c\u56db\u4e2a\u7ae0\u8282\u8be6\u7ec6\u63cf\u8ff0\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09 \u591a\u4e2a\u5e94\u7528\u90fd\u8981\u7528\u5230\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\uff0c\u6309\u7167\u5e94\u7528\u5212\u5206\u5b58\u653e\uff0c\u4e3b\u8981\u662f\u4e3a\u4e86\u51cf\u5c11\u4ee3\u7801\u91cf\uff0c\u6d88\u9664\u5e94\u7528\u95f4\u7684\u8026\u5408\u5173\u7cfb\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u67b6\u6784\u56fe","text":"\u6574\u4f53\u7684\u6846\u67b6\u8bbe\u8ba1\u5728\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u300b\u6587\u6863\u91cc\u9762\u5df2\u7ecf\u6709\u8be6\u7ec6\u63cf\u8ff0\u4e86\uff0c\u8fd9\u91cc\u8d34\u4e00\u4e0b\u6574\u4f53\u7684\u67b6\u6784\u56fe\uff1a \u4e3a\u4e86\u7a81\u663e\u672c\u6587\u7684\u91cd\u70b9\uff0c\u62bd\u53d6\u5176\u4e2d\u91cd\u8981\u529f\u80fd\u6a21\u5757\uff0c\u5982\u4e0b\u56fe\uff1a "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-basic-frame # \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\n\u251c\u2500\u2500 apps # \u5e94\u7528\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-dde-file-manager # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\uff08\u5e94\u7528\u5e93\u8be6\u7ec6\u76ee\u5f55\u7ed3\u6784\u8bf7\u770b\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\uff09\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 tag # \u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u2514\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u2502 \u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 xxx.png\n\u2502 \u2502 ...\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-deepin-music # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 public # \u516c\u5171\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget # dde_dock \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget # dde_desktop \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 src # \u6838\u5fc3\u5e93\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 button_center.py\n\u2502 \u251c\u2500\u2500 cmdtrl.py\n\u2502 \u251c\u2500\u2500 dogtails.py\n\u2502 \u251c\u2500\u2500 find_image.py\n\u2502 \u251c\u2500\u2500 global_config.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 setting # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 config.py\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 global_config.ini\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\u6a21\u5757\uff08Hook\uff09\n\u251c\u2500\u2500 pytest.ini # Pytest \u9ed8\u8ba4\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 docs # \u6587\u6863\u76ee\u5f55\n\u2514\u2500\u2500 manage.py # \u6267\u884c\u5668\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1apps","title":"1\u3001\u5e94\u7528\u5e93\uff08apps\uff09","text":"\u6240\u6709\u5e94\u7528\u5e93\u5747\u653e\u7f6e\u5728\u57fa\u7840\u6846\u67b6\u4e0b\u7684 apps \u76ee\u5f55\u4e0b\uff08\u89c1\u7b2c\u4e8c\u7ae0\u8282\u7b2c3\u6bb5\u76ee\u5f55\u7ed3\u6784\u5185\u5bb9\uff09\u3002\u5e94\u7528\u5e93\u7684\u67b6\u6784\u8bbe\u8ba1\u53ef\u4ee5\u53c2\u8003\u300aAT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b\u6587\u6863\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2src","title":"2\u3001\u6838\u5fc3\u5e93\uff08src\uff09","text":"\u5728 src \u76ee\u5f55\u4e0b\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u5e95\u5c42\u6838\u5fc3\u7ec4\u4ef6\uff0c\u901a\u5e38\u6765\u8bb2\u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5230\u5176\u4e2d\u67d0\u4e00\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4e48\u4f60\u9700\u8981\u663e\u793a\u7684\u5bfc\u5165\u8fd9\u4e2a\u6a21\u5757\uff0c\u7136\u540e\u624d\u80fd\u4f7f\u7528\u8be5\u6a21\u5757\u4e0b\u7684\u529f\u80fd\uff0c\u5982\u679c\u4f60\u7528\u5230\u4e86\u5341\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4f60\u5c31\u9700\u8981\u5bfc\u5165\u5341\u4e2a\u3002\u4f46\u662f\u6211\u4eec\u60f3\u8ba9\u4e8b\u60c5\u53d8\u5f97\u7b80\u5355\uff0c\u4e00\u6b21\u5bfc\u5165\uff0c\u4f7f\u7528\u6240\u6709\u3002 \u5c06\u6240\u6709\u7684\u529f\u80fd\u6a21\u5757\u90fd\u8fdb\u5165\u5230 src \u7684\u540d\u79f0\u7a7a\u95f4\uff0c\u5728 src/__init__.py \u91cc\u9762\u6211\u4eec\u8bbe\u8ba1\u6210\u8fd9\u6837\uff1a # src/__init__.py\nfrom .cmdctl import CmdCtl\nfrom .dogtails import Dogtail\nfrom .find_image import FindImage\nfrom .button_center import ButtonCenter\nclass Src(CmdCtl, FindImage):\ndef __init__(self, **kwargs):\n\"\"\"dogtail or button center param\n :param kwargs: app_name, desc, number\n \"\"\"\nif kwargs:\napp_name = kwargs.get(\"APP_NAME\")\ndesc = kwargs.get(\"DESC\")\nif app_name is None or desc is None:\nraise ValueError\nnumber = kwargs.get(\"number\")\nnumber = number if isinstance(number, int) else -1\n# \u5bf9\u8c61\u7ec4\u5408\nself.dog = Dogtail(app_name, desc, number)\nself.ui = ButtonCenter(app_name, number)\n \u9700\u8981\u4f20\u9012\u53c2\u6570\u7684\u91c7\u7528\u5bf9\u8c61\u7ec4\u5408\uff0c\u6ca1\u6709\u53c2\u6570\u7684\u4f7f\u7528\u7ee7\u627f\uff0c\u7ee7\u627f\u7684\u7c7b\u7b26\u5408 Mixin \u8bbe\u8ba1\u6a21\u5f0f\u3002 \u5e94\u7528\u5e93\u91cc\u9762\u4f7f\u7528\u7684\u65f6\u5019\u5728 widget/base_widget.py \u91cc\u9762\u53ea\u9700\u8981\u552f\u4e00\u7ee7\u627f Src \uff1a # \u5e94\u7528\u5e93\u91cc\u9762\u65b9\u6cd5\u57fa\u7c7b\n# widget/base_widget.py\nfrom src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n \u8981\u4f7f\u7528\u6838\u5fc3\u5e93\u7684\u529f\u80fd\uff0c\u53ea\u9700\u8981\u5199\u4e00\u4e2a\u5bfc\u5165 from src import Src \u5373\u53ef\u3002 \u5199 __init__ \u6784\u9020\u51fd\u6570\u7684\u539f\u56e0\u662f\u901a\u8fc7\u53c2\u6570\u6784\u9020\u5e94\u7528\uff0c\u5e76\u4e14\u4f20\u9012 number \u8fdb\u6765\uff0c\u53ef\u4ee5\u5b9e\u73b0\u591a\u7a97\u53e3\u7684\u63a7\u5236\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3public","title":"3\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09","text":"\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6bcf\u4e2a\u5e94\u7528\u90fd\u662f\u4e00\u4e2a\u5355\u72ec\u7684 py \u6587\u4ef6\uff0c\u76f8\u4e92\u4e4b\u95f4\u662f\u72ec\u7acb\u7684\uff0c\u6bcf\u4e2a py \u6587\u4ef6\u91cc\u9762\u662f\u8be5\u5e94\u7528\u7684\u65b9\u6cd5\u7c7b\uff0c\u6bd4\u5982\uff1a\u6700\u5e38\u7528\u7684\u65b9\u6cd5\u7c7b dde_desktop_public_widget.py # dde_desktop_widget.py\nfrom src import Src\nclass _DdeDesktopPublicBaseWidget(Src):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-desktop\"\nDESC = \"/usr/bin/dde-desktop\"\ndef __init__(self):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC)\nclass DdeDesktopPublicWidget(_DdeDesktopPublicBaseWidget):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u7c7b\"\"\"\ndef click_music_dir_by_ui(self):\n\"\"\"\u5728\u6587\u4ef6\u9009\u62e9\u6846\u70b9\u51fb\u97f3\u4e50\u76ee\u5f55\"\"\"\nself.click(*self.ui.btn_center(\"\u4fa7\u8fb9\u680f-\u97f3\u4e50\")) \ndef click_xxx_by_attr(self):\npass\n \u516c\u5171\u65b9\u6cd5\u5e93\u610f\u4e49\uff1a \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6240\u5c01\u88c5\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\u90fd\u662f\u81f3\u5c11\u88ab2\u4e2a\u5e94\u7528\u90fd\u7528\u5230\u7684\uff0c\u8fd9\u6837\u505a\u53ef\u4ee5\u51cf\u5c11\u6574\u4f53\u4ee3\u7801\u91cf\uff0c\u4ece\u800c\u51cf\u8f7b\u5e94\u7528\u5e93\u4ee3\u7801\u7684\u7ef4\u62a4\u5de5\u4f5c\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u7f16\u5199\u5f62\u5f0f\uff08\u547d\u540d\u89c4\u5219\u3001\u5b9a\u4f4d\u7684\u65b9\u6848\u5199\u6cd5\u3001\u6ce8\u91ca\u7684\u5199\u6cd5\u7b49\u7b49\uff09\u5177\u6709\u4e00\u5b9a\u7684\u6a21\u677f\u4f5c\u7528\uff0c\u8fd9\u6837\u5373\u4f7f\u662f\u5404\u4e2a\u5e94\u7528\u5e93\u90fd\u72ec\u7acb\u7ef4\u62a4\uff0c\u6240\u6709\u7684\u7f16\u7801\u98ce\u683c\u90fd\u662f\u8d8b\u4e8e\u76f8\u540c\u7684\uff0c\u56e0\u4e3a\u5927\u5bb6\u90fd\u5e94\u8be5\u53c2\u7167\u516c\u5171\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u5199\u6cd5\u6765\u5199\u81ea\u5df1\u5e94\u7528\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\u7c7b\uff0c\u8fd9\u6837\u4f7f\u5f97\u4ece\u516c\u53f8\u7684\u89d2\u5ea6\u53bb\u770b\u6240\u6709\u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u90fd\u662f\u7edf\u4e00\u7684\u3002 \u53ef\u4ee5\u901a\u8fc7\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\uff0c\u4e86\u89e3\u5230\u5176\u4ed6\u5e94\u7528\u7684\u529f\u80fd\uff0c\u5bf9\u4e8e\u6211\u4eec\u9700\u6c42\u7406\u89e3\uff0c\u4e86\u89e3\u7cfb\u7edf\u7684\u65b9\u65b9\u9762\u9762\u4e5f\u6709\u597d\u5904\u3002 \u5f53\u7136\uff0c\u5982\u679c\u4f60\u7684\u5e94\u7528\u672c\u8eab\u662f\u5c5e\u4e8e\u6839\u672c\u5c31\u4e0d\u9700\u8981\u548c\u5176\u4ed6\u5e94\u7528\u4ea4\u4e92\u7684\uff0c\u90a3\u4e48\u4f60\u53ef\u80fd\u4e0d\u4f1a\u7528\u5230\u8fd9\u91cc\u9762\u7684\u529f\u80fd\uff0c\u6ca1\u5173\u7cfb\uff0c\u4f60\u6240\u6709\u7684\u65b9\u6cd5\u90fd\u53ef\u4ee5\u76f4\u63a5\u5199\u5728\u5e94\u7528\u5e93\u7684\u4e1a\u52a1\u5c42\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4conftestpy","title":"4\u3001conftest.py","text":"conftest.py \u4ece\u529f\u80fd\u4e0a\u5c06\u662f\u5c5e\u4e8e\u6838\u5fc3\u5e93\uff08src\uff09\u7684\u5185\u5bb9\uff0c\u4f46\u662f\u7531\u4e8e\u5b83\u7684\u7279\u6b8a\u6027\uff0c\u5373\u5b83\u662f\u5bf9\u5e94\u7528\u5e93\u4e2d\u7684\u7528\u4f8b\u751f\u6548\u7684\uff0c\u800c\u4e14\u5b83\u7684\u4f5c\u7528\u57df\u662f\u5f53\u524d\u76ee\u5f55\u53ca\u4ee5\u4e0b\uff0c\u56e0\u6b64\u6211\u4eec\u5c06\u5b83\u653e\u5230\u9879\u76ee\u6839\u76ee\u5f55\u3002\u6211\u4eec\u6846\u67b6\u4e2d\u6709\u4e0d\u5c11\u6838\u5fc3\u529f\u80fd\u90fd\u662f\u5728\u8fd9\u91cc\u9762\u8fdb\u884c\u5f00\u53d1\u7684\uff0c\u540e\u9762\u7b2c\u56db\u7ae0\u4f1a\u8bb2\u5230\u7ec6\u8282\u3002 pytest.ini \u4f5c\u7528\u548c conftest.py \u7c7b\u4f3c\uff0c\u662f Pytest \u6846\u67b6\u7684\u56fa\u5b9a\u914d\u7f6e\u6587\u4ef6\uff0c\u76ee\u524d\u914d\u7f6e\u4e86\u4e00\u4e9b\u901a\u7528\u7684\u547d\u4ee4\u884c\u6267\u884c\u53c2\u6570\uff0c\u4e5f\u653e\u5728\u9879\u76ee\u6839\u76ee\u5f55\u3002 \u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 Hook \u51fd\u6570\uff0capps \u76ee\u5f55\u4e0b\u7684 \u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 fixture \u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5setting","title":"5\u3001setting","text":"\u5168\u5c40\u914d\u7f6e\u6a21\u5757\uff0c\u5305\u542b\u4e86\u4ee5\u4e0b\u914d\u7f6e\u6587\u4ef6\uff1a \uff081\uff09ini \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u914d\u7f6e\u4e00\u4e9b\u5168\u5c40\u7684\u914d\u7f6e\u9879\uff0c\u8b6c\u5982\uff1a\u5931\u8d25\u91cd\u8dd1\u6b21\u6570\u3001\u662f\u5426\u5931\u8d25\u5f55\u5c4f\u3001\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\u3001\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4\u3001\u6267\u884c\u65f6\u65e5\u5fd7\u7ea7\u522b\u3001\u751f\u6210\u7684\u62a5\u544a\u7c7b\u578b\u3001\u4ee5\u53ca\u5206\u5e03\u5f0f\u6267\u884c\u7684\u4e00\u4e9b\u7b56\u7565\u914d\u7f6e\u9879\u7b49\u7b49\u3002 \uff082\uff09config.py \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u63d0\u4f9b\u914d\u7f6e\u6587\u4ef6\u8bfb\u53d6\u3001\u52a8\u6001\u83b7\u53d6\u4e00\u4e9b\u5e38\u91cf\uff08\u5982\u9879\u76ee\u6839\u76ee\u5f55\u7edd\u5bf9\u8def\u5f84 (BASE_DIR)\u3001\u7cfb\u7edf\u67b6\u6784\uff08SYS_FRAME\uff09\u3001\u65f6\u95f4\u5b57\u7b26\u4e32\uff08strftime\uff09\u3001\u672c\u673a USERNAME IP \u7b49\u7b49\uff09\u3001\u516c\u5171 URL \u7b49\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u89c4\u8303","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u7248\u672c\u53ca\u4f9d\u8d56","text":"\u57fa\u7840\u6846\u67b6\u4f1a\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u8fdb\u884c\u7248\u672c\u53d1\u5e03\uff0c\u4e0d\u4e0e\u67d0\u4e2a\u5e94\u7528\u7248\u672c\u7ed1\u5b9a\uff0c\u4f46\u662f\uff0c\u5e94\u7528\u5e93\u4f1a\u4f9d\u8d56\u4e8e\u57fa\u7840\u6846\u67b6\u7684\u7248\u672c\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u5efa\u8bae\u5728\u5e94\u7528\u5e93\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a\u6587\u672c\u6587\u4ef6\u7528\u4e8e\u8bb0\u5f55\u6240\u4f9d\u8d56\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\uff0c\u7c7b\u4f3c\u4e8e\u5f00\u53d1\u5e94\u7528\u7684 debian/control \u6587\u4ef6\u7684\u529f\u80fd\uff0c\u4e3a\u4e86\u4fdd\u6301\u7edf\u4e00\uff0c\u8fd9\u4e2a\u6587\u4ef6\u5c31\u547d\u540d\u4e3a control\uff0c\u653e\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u6838\u5fc3\u5e93\u72ec\u7acb\u6027","text":"\u6838\u5fc3\u5e93\u4e0d\u5efa\u8bae\u9488\u5bf9\u67d0\u4e00\u4e2a\u5e94\u7528\u5355\u72ec\u505a\u4ee3\u7801\u4e0a\u7279\u6b8a\u5904\u7406\uff0c\u901a\u5e38\u8003\u8651\u9488\u5bf9\u67d0\u4e00\u79cd\u573a\u666f\u8fdb\u884c\u5904\u7406\uff0c\u8fd9\u4e9b\u573a\u666f\u901a\u5e38\u662f\u5b58\u5728\u4e00\u4e9b\u5171\u6027\u7684\u3002\u6bd4\u5982\u8bf4\uff1a\u684c\u9762\u7684ID\u5206\u914d\u5b58\u5728\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u903b\u8f91\u5904\u7406\u89e3\u51b3ID\u5206\u914d\u9519\u8bef\u7684\u95ee\u9898\uff0c\u4f46\u662f\u8fd9\u90e8\u5206\u903b\u8f91\u6211\u4eec\u4f1a\u5728\u684c\u9762\u7684\u65b9\u6cd5\u5c42\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u517c\u5bb9\u6027","text":"\u4e3a\u4e86\u4fdd\u6301\u517c\u5bb9\u6027\uff0c\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u539f\u5219\u4e0a\u4e0d\u5bf9\u8001\u65b9\u6cd5\u8fdb\u884c\u4fee\u6539\u6216\u5220\u9664\uff0c\u53ea\u8fdb\u884c\u65b0\u589e\u3002\u6d89\u53ca\u5230\u8001\u65b9\u6cd5\u4fee\u6539\u6216\u5220\u9664\u7684\uff0c\u4f1a\u8fdb\u884c\u63d0\u524d\u9884\u544a\uff0c\u5e76\u5728\u7b2c\u4e8c\u4e2a\u7248\u672c\u4e4b\u540e\uff08\u4e2d\u95f4\u4f1a\u9694\u4e00\u4e2a\u7248\u672c\u8fc7\u5ea6\uff09\u6b63\u5f0f\u5b9e\u65bd\u4fee\u6539\u6216\u5220\u9664\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u547d\u540d\u89c4\u8303","text":" \u7528\u4f8b ID \u6bcf\u4e2a\u5e94\u7528\u81ea\u5df1\u7ef4\u62a4\u4e00\u5957 ID\uff0c\u5728PMS\u4e0a\u7528\u4f8b\u6807\u9898\u4e0a\u5c06\u81ea\u52a8\u5316ID\u4ee5\u6807\u7b7e\u7684\u5f62\u5f0f\u5199\u5165\uff0c\u6bd4\u5982\uff1a[101]\u6253\u5f00-\u542f\u52a8\u5e94\u7528\u540edock\u53f3\u952e\u83dc\u5355 \u4e00\u4e2a\u7528\u4f8b\u7c7b\u91cc\u9762\u6709\u591a\u4e2a\u7528\u4f8b\u65f6\uff0c\u5728\u7528\u4f8b\u540d\u79f0\u540e\u9762\u52a0\u5e8f\u53f7\u3002 class TestFileManager(BaseCase):\n\"\"\"\u6587\u7ba1\u7528\u4f8b\"\"\"\ndef test_xxx_015_1(self):\npass\ndef test_xxx_015_2(self):\npass\n \u6ce8\u610f 015_1\uff0c\u4e0d\u8981\u5199015_01\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 PMS \u4e0a\u7684\u7528\u4f8bID\uff1a PMS \u4e0a\u662f6\u4f4d\u6570\uff0c\u4e0d\u591f\u76f4\u89c2\uff0c\u4e5f\u4e0d\u597d\u7ef4\u62a4\uff0c\u5728\u81ea\u52a8\u5316\u4e0b\u9762\u53bb\u627e\u4e00\u4e2a\u5e26\u6709 6 \u4f4d\u6570\u7684\u6587\u4ef6\u662f\u4e00\u4e2a\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 PMS \u4e0a\u7684 ID \u53ef\u80fd\u4f1a\u53d1\u751f\u53d8\u5316\uff0c\u6bd4\u5982\u5bfc\u51fa\u6765\u5bfc\u8fdb\u53bb\u7684\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u5b58\u5728\u95ee\u9898\uff0c\u5982\u679c\u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u8981\u60f3\u627e\u51fa\u6765\u5bf9\u5e94\u4fee\u6539\u81ea\u52a8\u5316\u7528\u4f8b ID\uff0c\u5c06\u4f1a\u662f\u4ef6\u975e\u5e38\u75db\u82e6\u7684\u4e8b\u60c5\u3002 \u51fd\u6570\u547d\u540d\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5de6\u952e\u70b9\u51fb click \u53f3\u952e\u70b9\u51fb right_click \u53cc\u51fb double_click \u79fb\u52a8 move_to \u62d6\u52a8 drag \u65b0\u5efa new \u62d6\u52a8\u5230 drag_to \u4ece\u54ea\u91cc\u62d6\u52a8\u5230\u54ea\u91cc drag_something_from_xxx_to_xxx \u83b7\u53d6 get \u83b7\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5750\u6807 get_location \u975e\u7279\u6b8a\u6587\u4ef6 file word\u6587\u4ef6 doc text\u6587\u4ef6 text \u6587\u4ef6\u5939 dir \u5173\u952e\u8bcd\u6301\u7eed\u589e\u52a0 \u5e38\u91cf\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5e94\u7528\u540d\u79f0 APP_NAME \u5e94\u7528\u63cf\u8ff0 DESC \u672c\u5e94\u7528\u4ee5\u5916\u7684\u5176\u4ed6\u5e94\u7528\uff0c\u6bd4\u5982\u5e2e\u52a9 HELP \u5176\u4ed6\u540d\u79f0\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u65b9\u6cd5\u5305\u540d widget \u65b9\u6cd5\u6587\u4ef6\u540d\uff08\u6587\u7ba1\u4e3e\u4f8b\uff09 dfm_widget.pytitle_widget.pyright_view_widget.pyleft_view_widget.pypop_widget.pybase_widget.pydfm_assert.py \u65ad\u8a00\u8bed\u53e5\u547d\u540d\u89c4\u8303 \u65ad\u8a00\u8bed\u53e5\u90fd\u662f\u4ee5 assert \u5f00\u5934 \u65ad\u8a00 \u8bed\u53e5 \u5224\u65ad\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_existsassert_file_not_exists \u5224\u65ad\u684c\u9762\u76ee\u5f55\u4e0b\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_exists_in_desktopassert_file_not_exists_in_desktop \u5224\u65ad\u56fe\u7247\u5b58\u5728 assert_image_existsassert_image_not_exists \u5224\u65ad\u5f71\u9662\u4e2d\u662f\u5426\u5b58\u5728\u56fe\u7247 assert_image_exists_in_movieassert_image_not_exists_in_movie \u5224\u65ad\u5143\u7d20\u662f\u5426\u5b58\u5728 assert_element_existassert_element_not_exist \u5224\u65ad\u662f\u5426\u76f8\u7b49 assert_equalassert_not_equal \u5224\u65ad\u662f\u5426\u4e3a\u771f assert_trueassert_false"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5fixture","title":"5\u3001fixture \u89c4\u8303","text":"\u7531\u4e8e Pytest \u6846\u67b6\u4e2d\u652f\u6301 fixture \u7684\u5199\u6cd5\u548c Xunit \u5199\u6cd5\u7684\uff0c\u6240\u4ee5\u5e94\u7528\u5e93\u4e2d\u53ef\u80fd\u5b58\u5728\u6df7\u7528\u7684\u60c5\u51b5\uff0c\u4e3a\u7edf\u4e00\u7f16\u7801\u98ce\u683c\u65b9\u4fbf\u540e\u7eed\u7528\u4f8b\u4ee3\u7801\u7ef4\u62a4\uff0c\u73b0\u505a\u4ee5\u4e0b\u89c4\u8303\u8bf4\u660e\uff1a \u629b\u5f03 Xunit \u7684\u5199\u6cd5\uff0c\u7edf\u4e00\u91c7\u7528 Pytest fixture \u7684\u5199\u6cd5\u3002 \u5e94\u7528\u5185 fixture \u8c28\u614e\u4f7f\u7528 autouse=True \uff0c\u975e\u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u975e\u5e38\u4e0d\u5efa\u8bae\u4f7f\u7528\u8fd9\u4e2a\u53c2\u6570\u3002 \u8c03\u7528 fixture \u4e0d\u80fd\u4f7f\u7528 @pytest.mark.usefixture()\uff0c\u4f7f\u7528\u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u4f20\u5165\u51fd\u6570\u5bf9\u8c61\u3002 \u5efa\u8bae\u5728\u4e00\u4e2a conftest.py \u91cc\u9762\u53bb\u5199\uff0c\u4e00\u4e2a\u5e94\u7528\u4e5f\u5c3d\u91cf\u7ef4\u62a4\u4e00\u4e2a conftest.py\u6587\u4ef6\u3002 fixture \u4e5f\u9700\u8981\u5199\u529f\u80fd\u8bf4\u660e\uff0c\u51fd\u6570\u540d\u79f0\u8981\u6709\u5177\u4f53\u542b\u4e49\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#6","title":"6\u3001\u65b9\u6cd5\u7f16\u5199\u89c4\u8303","text":" \u65b9\u6cd5\u7c7b\u578b\uff1a if \u6ca1\u6709\u7528\u5230\u5b9e\u4f8b\u5bf9\u8c61\uff1a\nif \u6ca1\u6709\u7528\u5230\u7c7b\u5bf9\u8c61\uff1a\n\u5199\u9759\u6001\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @staticmethod\nelse\uff1a\n\u5199\u7c7b\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @classmethod\nelse:\n\u76f4\u63a5\u5199\u5b9e\u4f8b\u65b9\u6cd5\n \u4e3e\u4f8b: class TitleWidget:\ndef click_xxx_by_ui(self):\npass\n@staticmethod\ndef click_xxx_by_ui():\npass\n@classmethod\ndef click_xxx_by_ui(cls):\npass\n \u51fd\u6570\u540d\u79f0\u4e0d\u51fa\u73b0\u6570\u5b57\uff0c\u9700\u8981\u8868\u793a\u6570\u91cf\u7684\u7528\u5355\u8bcd\u8868\u793a\u3002 \u51fd\u6570\u529f\u80fd\u6ce8\u91ca\u3002 \u6ca1\u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg2:xxx\n\"\"\"\n \u6709\u53c2\u6570\uff0c\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg1:xxx\nreturn: xxx\n\"\"\"\n \u200b \u7528 Pycharm \u7684\u6ce8\u91ca\u6a21\u677f\u4e5f\u53ef\u4ee5\uff0c\u53ea\u8981\u4f53\u73b0\u4e86\u53c2\u6570\u7684\u7c7b\u578b\u548c\u8fd4\u56de\u5c31\u884c\u4e86\u3002 \u6682\u4e0d\u8981\u6c42\u5199\u7c7b\u578b\u6ce8\u89e3\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#7case","title":"7\u3001\u7528\u4f8b\uff08case\uff09\u89c4\u8303","text":" \u4ee5\u7c7b\u7684\u5f62\u5f0f\u5199\u7528\u4f8b\uff0c\u7528\u4f8b\u7c7b\u96c6\u6210\u7528\u4f8b\u57fa\u7c7b\u3002 \u7528\u4f8b\u7c7b\u9700\u8981\u5199\u6ce8\u91ca\u3002 \u6d4b\u8bd5\u7528\u4f8b\u51fd\u6570\u8bf4\u660e\uff08\u5efa\u8bae\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u540d\u79f0\uff09 \"\"\"\u53f3\u4fa7\u9884\u89c8-\u56fe\u7247\u7c7b\u578b\u4fe1\u606f\u680f\u57fa\u672c\u4fe1\u606f\"\"\"\n \u4e0d\u5199\u8c03\u8bd5\u4ee3\u7801 if __name__ == '__main__':\npytest.main()\n \u6240\u6709\u7528\u4f8b\u90fd\u7ee7\u627f BaseCase\u3002 BaseCase \u91cc\u9762\u653e\u4e00\u4e9b\u6d4b\u8bd5\u6570\u636e\u7684\u5e38\u91cf\uff0c\u6bd4\u5982\u6587\u4ef6\u540d\u79f0\uff0c\u5e94\u7528\u540d\u79f0\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u4e00\u4e9b\u901a\u7528\u7684\u5b57\u7b26\u4e32\u3002 \u8fd9\u7c7b\u662f\u5c5e\u4e8e\u6d4b\u8bd5\u6570\u636e\u3002 class BaseCase(DfmAssert):\n\"\"\"\u7528\u4f8b\u57fa\u7c7b\"\"\"\nNEW_FILE = \"\u65b0\u5efa\u6587\u672c.txt\"\nTEST_FILE = \"test.txt\"\nNEW_DIR = \"\u65b0\u5efa\u6587\u4ef6\u5939\"\nNEW_WORD = \"\u65b0\u5efaWord\u6587\u6863.doc\"\nAPP_HELP = \"damn\"\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\n\"\"\"\u7528\u4f8b\u6807\u9898\uff08\u590d\u5236PMS\u4e0a\u7528\u4f8b\u6807\u9898\uff09\"\"\"\ndfm = DfmWidget()\ndfm.click_xxx_by_attr(self.NEW_FILE)\ndfm.new_file_in_desktop_by_cmd(self.NEW_FILE)\nself.assert_true(dfm.get_process_status(self.APP_NAME))\n \u7528\u4f8b\u91cc\u9762\u5c3d\u91cf\u51cf\u5c11\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\uff0c\u66f4\u8981\u51cf\u5c11\u76f8\u540c\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\u3002 \u7edf\u4e00\u6587\u4ef6\u6ce8\u91ca\u5934\u3002 #!/usr/bin/env python3\n# _*_ coding:utf-8 _*_\n\"\"\"\n:Author:email@uniontech.com\n:Date :${DATE} ${TIME}\n\"\"\"\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#8","title":"8\u3001\u5176\u4ed6\u89c4\u8303","text":" \u65e5\u5fd7\u6253\u5370\u8981\u5728\u65b9\u6cd5\u6700\u524d\u9762\uff0c\u5426\u5219\u4ee3\u7801\u62a5\u9519\u6ca1\u6709\u65e5\u5fd7\u8f93\u51fa\uff0c\u4e0d\u597d\u5b9a\u4f4d\u95ee\u9898\u3002\uff08\u6211\u4eec\u4f1a\u8003\u8651\u7ee7\u7eed\u4f7f\u7528\u62e6\u622a\u5668\u6253\u5370\u65e5\u5fd7\uff09 \u6240\u6709\u7684\u64cd\u4f5c\u90fd\u9700\u8981\u6709\u65e5\u5fd7\uff0c\u5305\u62ec sleep()\uff0c\u6211\u4eec\u4f1a\u91cd\u5199\u4e00\u4e2a\u6709\u65e5\u5fd7\u8f93\u5165\u7684 sleep\u3002 \u4e1a\u52a1\u5c42\u65e5\u5fd7\u7ea7\u522b\u4e3a INFO\u3002 hook \u51fd\u6570\u53ea\u80fd\u5199\u5230\u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u91cc\u9762\u3002 apps \u76ee\u5f55\u4e0b\u7684 conftest.py \u539f\u5219\u4e0a\u4e0d\u4f1a\u65b0\u589e fixture\u3002 \u56fa\u5b9a\u76ee\u5f55\u6216\u5143\u7d20\u63a7\u4ef6\u7684\u64cd\u4f5c\uff0c\u5c06\u64cd\u4f5c\u65b9\u6cd5\u5199\u6b7b\uff0c\u6587\u4ef6\u7c7b\u64cd\u4f5c\u5c06\u6587\u4ef6\u540d\u7559\u53c2\u6570\u3002 \u8def\u5f84\u62fc\u63a5\u89c4\u8303\uff1a \u7cfb\u7edf\u4e2d\u56fa\u5b9a\u76ee\u5f55\uff0c\u8def\u5f84\u62fc\u63a5\u65f6\u4f7f\u7528\u6ce2\u6d6a\u7b26\u53f7\uff0c\u6bd4\u5982\uff1a~/Desktop/\uff0c\u4e0b\u5c42\u4f7f\u7528 os.path.expanduser()\uff0c\u5b83\u53ef\u4ee5\u81ea\u52a8\u8bc6\u522b\u6ce2\u6d6a\u7b26\u53f7\u3002 \u9879\u76ee\u4e0b\u8def\u5f84\u4f7f\u7528\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u8def\u5f84\uff0c\u6bd4\u5982\uff1aConfig.BASE_PATH\uff0c\u56e0\u4e3a\u9879\u76ee\u662f\u53ef\u4ee5\u5728\u4efb\u610f\u8def\u5f84\u8fd0\u884c\u7684\uff0c\u9700\u8981\u52a8\u6001\u62fc\u63a5\u8def\u5f84\u3002 "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848","text":"# =================================================\n# Author : Mikigo\n# Time : 2022/3/16\n# version \uff1a1.0\n# =================================================\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"AT \u5e94\u7528\u5e93\u6539\u9020\u662f\u57fa\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u8fdb\u884c\u7528\u4f8b\u65b9\u6cd5\u548c\u4e1a\u52a1\u903b\u8f91\u7684\u91cd\u65b0\u8bbe\u8ba1\uff0c\u4ee5\u5b9e\u73b0\u5e94\u7528\u5e93\u9ad8\u6548\u7684\u7f16\u5199\u3001\u7ef4\u62a4\u7528\u4f8b\u53ca\u5176\u65b9\u6cd5\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u6587\u4ef6\u7ba1\u7406\u5668\u4ece\u4e1a\u52a1\u590d\u6742\u5ea6\u548c\u7528\u4f8b\u91cf\u6765\u8bb2\uff0c\u5728\u7cfb\u7edf\u6240\u6709\u5e94\u7528\u4e2d\uff0c\u662f\u5f88\u6709\u4ee3\u8868\u6027\u7684\uff0c\u96be\u5ea6\u4e5f\u662f\u6700\u5927\u7684\uff0c\u56e0\u6b64\u6211\u4eec\u9009\u53d6\u6587\u4ef6\u7ba1\u7406\u5668\u4f5c\u4e3a\u5e94\u7528\u5e93\u6539\u9020\u7684\u5b9e\u9a8c\u5e94\u7528\uff0c\u7ed9\u540e\u7eed\u5176\u4ed6\u5e94\u7528\u6539\u9020\u63d0\u4f9b\u5207\u5b9e\u53ef\u884c\u7684\u601d\u8def\u548c\u65b9\u6848\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u5206\u5c42\u8bbe\u8ba1\u56fe","text":"\u6574\u4f53\u4ecd\u7136\u9075\u5faa PO \u8bbe\u8ba1\u7406\u5ff5\uff0c\u6839\u636e\u4e1a\u52a1\u9700\u8981\uff0c\u5c06\u6587\u7ba1\u4e1a\u52a1\u5c42\u8fdb\u884c 3 \u5c42\u5212\u5206\uff1a "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-dde-file-manager # \u5e94\u7528\u4ed3\u5e93\n\u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 test_xxx_001.py\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u00a0\u251c\u2500\u2500 __init__.py\n\u2502 \u00a0\u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u00a0\u251c\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u00a0\u251c\u2500\u2500 base_widget.py # \u65b9\u6cd5\u57fa\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 title_widget.py # title \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 right_view_widget.py # right view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 left_view_widget.py # left view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 pop_widget.py # pop \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 dfm_widget.py # \u65b9\u6cd5\u7684\u7edf\u4e00\u51fa\u53e3\n\u2502 \u00a0\u2514\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 tag # \u7528\u4f8b\u6807\u7b7e\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 xxx.csv # \u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2514\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u57fa\u7c7b","text":" \u7ee7\u627f\u6838\u5fc3\u5c42\u7684\u5404\u4e2a\u6a21\u5757\u7c7b\u3002 \u62bd\u53d6\u64cd\u4f5c\u5c42\u7684\u4e00\u4e9b\u57fa\u7840\u65b9\u6cd5\u3002 \u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u7684\u4e00\u4e9b\u516c\u5171\u65b9\u6cd5\u3002 \u8def\u5f84\u7ec4\u88c5\u65b9\u6cd5\u3002 \u4e00\u4e9b\u4e1a\u52a1\u5c42\u76f8\u5173\u7684\u53d8\u91cf\u3001\u5e38\u91cf\u3001shell\u547d\u4ee4\u3001\u5750\u6807\u3002 \u65b9\u6cd5\u57fa\u7c7b\u7684\u5199\u6cd5\uff1a from src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u64cd\u4f5c\u5c42","text":" \u6a21\u5757\u5212\u5206 \u6309\u7167\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u6587\u7ba1\u4e3b\u754c\u9762\u5206\u4e3a\u4e09\u4e2a\u533a\u57df\uff1a\u6807\u9898\u680f\u3001\u53f3\u8fb9\u89c6\u56fe\u533a\u57df\u3001\u5de6\u8fb9\u89c6\u56fe\u533a\u57df \u5f39\u7a97\uff1a\u8bbe\u7f6e\u754c\u9762\u5f39\u7a97\u3001\u4fdd\u9669\u7bb1\u5f39\u7a97\u3001\u5220\u9664\u786e\u8ba4\u5f39\u7a97\u3001\u53ca\u5404\u79cd\u7f51\u7edc\u5f39\u7a97 \u53f3\u952e\u83dc\u5355\uff1a\u6682\u65f6\u4e0d\u8003\u8651\u4e3a\u5355\u72ec\u7684\u6a21\u5757\uff0c\u8003\u8651\u4ee5\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6848\u505a\u6210\u516c\u5171\u5e93\u3002 \u5404\u4e2a\u6a21\u5757\u53ea\u7ee7\u627f\u57fa\u7c7b from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u6784\u9020\u51fd\u6570\u91cc\u9762\u4e0d\u6784\u9020\u5bf9\u8c61\uff0c\u53ef\u4ee5\u521d\u59cb\u5316\u4e00\u4e9b\u53d8\u91cf\u3002 \u4e0d\u540c\u7684\u5b9a\u4f4d\u65b9\u6848\u8c03\u7528\u4e0d\u540c\u7684\u5b9a\u4f4d\u5de5\u5177\u5bf9\u8c61\u3002 self.dog\nself.ui\nself.d_bus\n \u65b9\u6cd5\u7f16\u5199 \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u5e94\u7528\u5c42","text":" \u7ee7\u627f\u64cd\u4f5c\u5c42\u7684\u6240\u6709\u7c7b\u3002 \u4ec5\u4ec5\u7528\u4e8e\u7528\u4f8b\u4e2d\u5bfc\u5165\u65b9\u4fbf\uff0c\u4e0d\u505a\u5176\u4ed6\u4e8b\u60c5\u3002 class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n DfmAssert \u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u7ee7\u627f\uff0c\u65b9\u4fbf\u4f7f\u7528\u65ad\u8a00\u8bed\u53e5\u3002 from apps.dde_file_manager.widget.dfm_widget import DfmWidget\nfrom public.assert import Assert\nclass DfmAssert(Assert):\ndef assert_file_exists_in_desktop(self, file_name):\nself.assert_file_exists(f\"~/Desktop{file_name}\")\n...\nDfmWidget().get_file_in_desktop()\n \u7528\u4f8b\u91cc\u9762\u76f4\u63a5\u7ee7\u627f\uff0c\u65b9\u4fbf\u5728\u7528\u4f8b\u91cc\u9762\u4f7f\u7528 self \u8fdb\u884c\u65ad\u8a00\uff0c\u66f4\u7b26\u5408\u65ad\u8a00\u7684\u4f7f\u7528\u4e60\u60ef\uff0c\u7528\u4f8b\u903b\u8f91\u4e0a\u66f4\u6e05\u695a\u3002 class BaseCase(DfmAssert):\npass\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\nself.assert_file_exists_in_desktop(\"xxx\")\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u903b\u8f91\u4e3e\u4f8b","text":"\u7528\u4f8b\u4ee3\u7801\u8c03\u7528\u903b\u8f91\u4e3e\u4f8b\uff1a # BaseWidget\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n# =============================================\n# TitleWidget\nclass TitleWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_title_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# RightViewWidget\nclass RightViewWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_right_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# =============================================\n# \u51fa\u53e3 DfmWidget\nclass DfmWidget(TitleWidget, RightViewWidget):\npass\n# =============================================\n# in case\nfrom apps.dde_file_manager.widget.dfm_widget import DfmWidget\ndfm = DfmWidget()\ndfm.click_xxx_title_by_ui()\ndfm.click_xxx_right_by_ui()\ndfm.dog.print_desc()\ndfm.ui.print_number()\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u5de5\u7a0b\u6539\u9020\u5b9e\u65bd\u6b65\u9aa4","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_2","title":"1\u3001\u5de5\u7a0b\u4ee3\u7801\u62c9\u53d6","text":"1.1. \u5c06\u81ea\u52a8\u5316\u57fa\u7840\u6846\u67b6\u7684\u529f\u80fd\u62c9\u5230\u672c\u5730 Autotest Basic Frame \uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame 1.2. \u5c06\u5e94\u7528\u5e93\u4ee3\u7801\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u5e94\u7528\u5e93\u7684\u4ed3\u5e93\u547d\u540d\u5e94\u8be5\u662f\u957f\u8fd9\u6837\u7684 autotest_deepin_xxx\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_2","title":"2\u3001\u8c03\u6574\u5de5\u7a0b\u76ee\u5f55","text":"\u6309\u7167 \u65b9\u6848\u8bbe\u8ba1-\u76ee\u5f55\u7ed3\u6784 \u8fdb\u884c\u76ee\u5f55\u8c03\u6574\uff0c\u5c3d\u91cf\u4f7f\u7528\u7f16\u8f91\u5668\u8fdb\u884c\u76f8\u5e94\u7684\u8c03\u6574\uff0c\u7f16\u8f91\u5668\u63a8\u8350\u4f7f\u7528 Pycharm \uff0c\u4ee5\u4e0b\u64cd\u4f5c\u5747\u5728 Pycharm \u91cc\u9762\u53ef\u5b9e\u73b0\u3002 2.1. \u9700\u8981\u79fb\u52a8 py \u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u76f4\u63a5\u5728\u7f16\u8f91\u5668\u91cc\u9762\uff0c\u4f7f\u7528\u9f20\u6807\u9009\u4e2d\u5e76\u6309\u4f4f\uff0c\u4e4b\u540e\u62d6\u52a8\u5230\u76ee\u6807\u4f4d\u7f6e\u5373\u53ef\uff0cPycharm \u4f1a\u5c3d\u53ef\u80fd\u7684\u81ea\u52a8\u89e3\u51b3\u79fb\u52a8\u5bfc\u81f4\u7684\u8def\u5f84\u95ee\u9898\u3002\u6ce8\u610f\uff0c\u6211\u8bf4\u7684\u662f\u201c\u5c3d\u53ef\u80fd\u201d\uff0c\u6709\u4e9b\u9a9a\u64cd\u4f5c\u7f16\u8f91\u5668\u662f\u65e0\u6cd5\u81ea\u52a8\u5904\u7406\u7684\u3002\u5982\u679c\u6ca1\u6709\u88ab\u7f16\u8f91\u5668\u81ea\u52a8\u5904\u7406\u7684\u8def\u5f84\u95ee\u9898\uff0c\u540e\u7eed\u53ea\u80fd\u624b\u52a8\u89e3\u51b3\u3002 2.2. \u9700\u8981\u91cd\u547d\u540d\u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u5728\u7f16\u8f91\u5668\u91cc\u9762\u9009\u4e2d\u6587\u4ef6\uff0c\u7136\u540e\u4f7f\u7528\u5feb\u6377\u952e Shift + F6 \uff08\u5982\u679c\u5feb\u6377\u952e\u6ca1\u53cd\u5e94\uff0c\u6587\u4ef6\u53f3\u952e\u83dc\u5355 Refactor \u2014\u2014 Rename\uff09\uff0c\u7136\u540e\u5728\u8f93\u5165\u6846\u4e2d\u8f93\u5165\u8981\u91cd\u547d\u540d\u7684\u540d\u79f0\uff0c\u540c\u65f6\uff0c\u786e\u8ba4\u52fe\u9009 Search for references \u548c Search in comments and strings \u8fd9\u4e24\u4e2a\u9009\u9879\uff0c\u6700\u540e\u6309\u56de\u8f66\u6216\u8005\u9f20\u6807\u70b9 Refactor \u3002 \u6ce8\u610f\uff0c\u6b64\u65f6\u7f16\u8f91\u5668\u53ef\u80fd\u4f1a\u63d0\u793a\u4f60\uff0c\u4f60\u8fd9\u4e2a\u91cd\u547d\u540d\u7684\u64cd\u4f5c\u5173\u8054\u4e86\u591a\u4e2a\u6a21\u5757\uff0c\u5b83\u88ab\u591a\u4e2a\u5730\u65b9\u90fd\u4f7f\u7528\u5230\u4e86\uff0c\u76f8\u5173\u7684\u6a21\u5757\u662f\u5426\u4e5f\u4e00\u8d77\u6539\u540d\u4e86\uff0c\u8fd9\u4e0d\u5e9f\u8bdd\u5417\uff0c\u7528\u8fd9\u4e2a\u529f\u80fd\u5c31\u662f\u60f3\u628a\u5173\u8054\u5230\u7684\u90fd\u4fee\u6539\uff0c\u4e0d\u7136\u6211\u4e3a\u4ec0\u4e48\u4e0d\u7528\u6587\u7ba1\u7684\u91cd\u547d\u540d\u529f\u80fd\u5462\uff0c\u522b\u60f3\u4e86\uff0c\u76f4\u63a5\u70b9\u5de6\u4e0b\u89d2\u7684 Refactor \u6309\u94ae\uff0c\u5c31\u662f\u5e72\u3002 \u7c7b\u540d\u3001\u51fd\u6570\u540d\u7684\u91cd\u547d\u540d\u90fd\u5c3d\u91cf\u91c7\u7528\u8fd9\u79cd\u65b9\u6848\uff0c\u56e0\u4e3a\u7f16\u8f91\u5668\u4f1a\u81ea\u52a8\u7ed9\u6211\u4eec\u627e\u5230\u5173\u8054\u7684\u5730\u65b9\uff0c\u7136\u540e\u540c\u6b65\u4fee\u6539\u6389\u3002\u4f60\u53ef\u5343\u4e07\u522b\u76f4\u63a5\u5220\u4e86\u4fee\u6539\u540d\u79f0\uff0c\u4e0d\u7136\u4f60\u53ef\u80fd\u4f1a\u82b1\u4e0a\u4e00\u5929\u7684\u65f6\u95f4\u6765\u89e3\u51b3\u91cd\u547d\u540d\u7684\u95ee\u9898\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u5b9e\u73b0\u6838\u5fc3\u5e93\u63a5\u53e3","text":"3.1. BaseWidget \u5728 BaseWidget \u91cc\u9762\u628a\u8be5\u5199\u7684\u90fd\u5199\u597d\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u4e0a\u9762\u7684\u8bbe\u8ba1\u7406\u5ff5\u6765\u5199\u3002 \u5982\u679c\u4f60\u5acc\u9ebb\u70e6\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u6587\u7ba1\u7684\u5b9e\u9645\u5de5\u7a0b\u4ee3\u7801 autotest_dde_file_manager : https://gerrit.uniontech.com/admin/repos/autotest_dde_file_manager \u3002 3.2. \u64cd\u4f5c\u5c42 \u5982\u679c\u4f60\u662f\u65b0\u5199\u9879\u76ee\uff0c\u4f60\u4f1a\u53d1\u73b0\u4e00\u5207\u90fd\u662f\u90a3\u4e48\u7684\u7b80\u5355\u3001\u76f4\u63a5\uff0c\u6309\u7167\u6211\u4eec\u63d0\u4f9b\u7ed9\u4f60\u7684\u63a5\u53e3\u5199\u7528\u4f8b\u7684\u64cd\u4f5c\u65b9\u6cd5\u5c31\u597d\u4e86\u3002 \u5982\u679c\u4f60\u662f\u60f3\u5bf9\u539f\u6765\u7684\u5de5\u7a0b\u8fdb\u884c\u6539\u9020\uff0c\u4f60\u9700\u8981\u6309\u7167\u6838\u5fc3\u5e93\u65b9\u6cd5\u7684\u8c03\u7528\uff0c\u5c06\u4f60\u4e4b\u524d\u5199\u7684\u6bcf\u4e2a\u65b9\u6848\u8fdb\u884c\u5bf9\u5e94\u7684\u4fee\u6539\uff0c\u5305\u62ec\u7c7b\u548c\u65b9\u6cd5\u7684\u547d\u540d\u3001\u65b9\u6cd5\u5185\u6240\u8981\u7528\u5230\u4e0d\u540c\u5b9a\u4f4d\u65b9\u6cd5\u7684\u5199\u6cd5\u4fee\u6539\u3002 \u8fd9\u65f6\u5019\u4f60\u53ef\u80fd\u4f60\u7684\u4ee3\u7801\u4e2d\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u62a5\u9519\uff0c\u4e0d\u7528\u62c5\u5fc3\uff0c\u4f60\u53ef\u4ee5\u4ece\u4e1a\u52a1\u903b\u8f91\u51fa\u53d1\uff0c\u60f3\u6e05\u695a\u8fd9\u4e2a\u65b9\u6cd5\u662f\u5e72\u4ec0\u4e48\u7684\u3001\u64cd\u4f5c\u7684\u5bf9\u8c61\u662f\u4ec0\u4e48\u3001\u53c2\u6570\u662f\u4ec0\u4e48\uff0c\u6ce8\u610f\u8fd9\u4e9b\u4fee\u6539\u662f\u4f1a\u5f71\u54cd\u5230\u7528\u4f8b\u4ee3\u7801\u91cc\u9762\u7684\uff0c\u6ca1\u5173\u7cfb\uff0c\u7528\u4f8b\u91cc\u9762\u672c\u6765\u4e5f\u5e94\u8be5\u88ab\u5173\u8054\u4fee\u6539\u3002 3.3. \u628a\u914d\u7f6e\u6a21\u5757\u5199\u597d\uff0c\u8fd9\u90e8\u5206\u57fa\u672c\u53ef\u4ee5\u590d\u5236\u6587\u7ba1\u7684\u4ee3\u7801\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4_1","title":"4\u3001\u8def\u5f84\u5904\u7406","text":"4.1. \u5bfc\u5165\u8def\u5f84 \u65b9\u6cd5\u548c\u7528\u4f8b\u4e2d\u90fd\u4f1a\u6d89\u53ca\u5230\u5bfc\u5165\u8def\u5f84\u7684\u4fee\u6539\uff0c\u5728\u4fee\u6539\u8def\u5f84\u65f6\uff0c\u5efa\u8bae\u4f60\u4f7f\u7528 Ctrl + Shift + R \u5168\u5c40\u66ff\u6362\uff0c\u4f1a\u5c06\u6574\u4e2a\u9879\u76ee\u4e0b\u7684\u76f8\u540c\u5730\u65b9\u90fd\u4fee\u6539\u5230\uff0c\u5f53\u7136\uff0c\u4f60\u4e5f\u53ef\u4ee5\u5728\u5c0f\u5f39\u7a97\u4e2d\u4fee\u6539\u5168\u5c40\u66ff\u6362\u4e3a\u5c40\u90e8\u76ee\u5f55\u4e0b\u66ff\u6362\u3002\u5904\u7406\u90a3\u79cd\u6ca1\u6709\u5173\u8054\u5173\u7cfb\uff0c\u4f46\u662f\u53c8\u662f\u76f8\u540c\u540d\u79f0\u7684\u91cd\u547d\u540d\uff0c\u6211\u4e5f\u63a8\u8350\u4f7f\u7528\u8fd9\u79cd\u65b9\u5f0f\u8fdb\u884c\u91cd\u547d\u540d\u3002 \u6ce8\u610f\uff0c\u5168\u5c40\u66ff\u6362\u7684\u65b9\u5f0f\u4efb\u7136\u65e0\u6cd5\u4fdd\u8bc1\u771f\u7684\u5168\u5c40\u88ab\u66ff\u6362\u4e86\uff08\u53ef\u80fd\u662f\u7f16\u8f91\u5668\u7684 Bug \u5427\uff09\uff0c\u6240\u4ee5\u4f60\u4ecd\u7136\u9700\u8981\u624b\u52a8\u770b\u4e0b\u5404\u5904\u662f\u5426\u4fee\u6539\u5230\u4f4d\u3002 4.2. \u8d44\u6e90\u8def\u5f84 \u4e00\u4e9b\u7528\u4f8b\u8d44\u6e90\u9700\u8981\u6839\u636e config.py \u91cc\u9762\u7684\u8def\u5f84\u914d\u7f6e\u8fdb\u884c\u8d44\u6e90\u8def\u5f84\u7684\u62fc\u63a5\uff0c\u5982\u679c\u4f60\u539f\u6765\u672c\u6765\u5c31\u6709\u4e00\u4e2a\u51fd\u6570\u4e13\u95e8\u7528\u4e8e\u7ec4\u88c5\u8def\u5f84\u7684\uff0c\u90a3\u4f60\u53ea\u9700\u8981\u4fee\u6539\u8fd9\u4e00\u4e2a\u5730\u65b9\u5c31\u597d\u4e86\uff0c\u5982\u679c\u4f60\u4e4b\u524d\u5e76\u6ca1\u6709\u8fd9\u6837\u7684\u8bbe\u8ba1\uff0c\u90a3\u53ef\u80fd\u9700\u8981\u4fee\u6539\u5927\u91cf\u6d89\u53ca\u5230\u8d44\u6e90\u8def\u5f84\u7684\u5730\u65b9\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5","title":"5\u3001\u8c03\u8bd5\u548c\u7f16\u5199\u7528\u4f8b","text":"\u4ee5\u4e0a\u51e0\u4e2a\u6b65\u9aa4\u505a\u5b8c\uff0c\u57fa\u672c\u5c31\u53ef\u4ee5\u8fdb\u884c\u7528\u4f8b\u4ee3\u7801\u7684\u8c03\u8bd5\u4e86\uff0c\u8fd9\u90e8\u5206\u5de5\u4f5c\u4e3b\u8981\u89e3\u51b3\u4f60\u4e4b\u524d\u51e0\u4e2a\u6b65\u9aa4\u9057\u6f0f\u7684\u95ee\u9898\uff0c\u5982\u679c\u6240\u6709\u7528\u4f8b\u90fd\u8c03\u8bd5\u901a\u8fc7\u4e86\uff0c\u90a3\u4e48\u5de5\u7a0b\u6539\u9020\u5c31\u5168\u90e8\u5b8c\u6210\u4e86\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/","title":"AT \u5f00\u53d1\u89c4\u8303","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u5f00\u53d1\u89c4\u8303\u662f\u6839\u636e\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fd0\u884c\u4e24\u5e74\u591a\u6765\uff0c\u9047\u5230\u95ee\u9898\u89e3\u51b3\u95ee\u9898\u800c\u5f62\u6210\u7684\u4e00\u4e9b\u89e3\u51b3\u65b9\u6848\uff0c\u6216\u8005\u8bf4\u7ecf\u9a8c\u603b\u7ed3\uff1b\u8fd9\u4e9b\u7ecf\u9a8c\u7b26\u5408\u6211\u4eec\u73b0\u9636\u6bb5 AT \u6240\u5e94\u7528\u7684\u573a\u666f\u9700\u8981\uff0c\u4e5f\u662f\u6211\u4eec\u7ecf\u8fc7\u957f\u671f\u601d\u8003\uff0c\u4e0d\u65ad\u8bd5\u9519\u4e0d\u65ad\u4fee\u6b63\uff0c\u5e76\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u5b9e\u8df5\u4e2d\u68c0\u9a8c\u8fc7\u53ef\u884c\u7684\u3002\u4ee5\u6b64\uff0c\u5e0c\u671b\u80fd\u5e2e\u52a9\u53c2\u4e0e\u5230\u81ea\u52a8\u5316\u7684\u76f8\u5173\u4eba\u5458\u51cf\u5c11\u8bd5\u9519\u6210\u672c\uff0c\u66f4\u597d\u3001\u66f4\u5feb\u7684\u7f16\u5199\u7528\u4f8b\u53ca\u7ef4\u62a4\u7528\u4f8b\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_1","title":"\u4e00\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u89c4\u8303","text":"\u6807\u7b7e\u5316\u7ba1\u7406\u6587\u6863\u8bf7\u53c2\u8003\uff1a \u300a\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u64cd\u4f5c\u6307\u5f15\u300b \u4ee5\u4e0b\u8bf4\u51e0\u4e2a\u5bb9\u6613\u51fa\u73b0\u7684\u95ee\u9898\uff1a"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1","title":"1. \u5bf9\u5e94\u5173\u7cfb","text":" \u5199\u5b8c\u81ea\u52a8\u5316\u7528\u4f8b\u4e4b\u540e\uff0c\u8bf7\u5728 CSV \u6587\u4ef6\u4e2d\u6807\u8bb0\u7528\u4f8b\u7684 ID\u3001\u7b49\u7ea7\u3002\u4e3a\u4e86\u63d0\u9192\u6807\u8bb0\uff0c\u6267\u884c\u7528\u4f8b\u65f6\u5728\u9996\u884c\u4f1a\u8f93\u51fa ERROR \u65e5\u5fd7\uff1a CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94\u7684 ID\uff1b \u5728\u6700\u7ec8\u63d0\u4ea4\u4ee3\u7801\u4e4b\u524d\uff0c\u4f60\u9700\u8981\u5728 CSV \u6587\u4ef6\u91cc\u9762\u5c06ID\u3001\u7528\u4f8b\u7b49\u7ea7\u7b49\u6807\u7b7e\u8865\u5168\uff0c\u5982\u679c CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94 ID\uff0c\u540e\u7eed\u5728\u6279\u91cf\u6267\u884c\u7684\u65f6\u5019\uff0c\u8fd9\u4e9b\u7528\u4f8b\u662f\u4e0d\u4f1a\u6267\u884c\u7684\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2","title":"2. \u540d\u79f0\u4e00\u81f4","text":" CSV \u6587\u4ef6\u7684\u6587\u4ef6\u540d\u3001\u7528\u4f8b\u51fd\u6570\u4e2d\u95f4\u7684\u540d\u79f0\u4e00\u81f4\u3001\u7528\u4f8b py \u6587\u4ef6\u4e2d\u95f4\u7684\u540d\u79f0\uff0c\u8fd9\u4e09\u4e2a\u540d\u79f0\u4e00\u81f4\u3002 \u4e3e\u4f8b\uff1a # test_music_001.py\ndef test_music_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u90a3\u4e48 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e3a music.csv\u3002 AT \u6846\u67b6\u5e95\u5c42\u4ee3\u7801\u5b9e\u73b0\u662f\u5c06 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e0e\u7528\u4f8b\u51fd\u6570\u540d\u79f0\u540d\u79f0\uff08item.name\uff09\u8fdb\u884c\u5bf9\u5e94\uff0c\u56e0\u6b64\uff0c\u6ce8\u610f CSV \u6587\u4ef6\u540d\u79f0\u5bf9\u5e94\u7684\u662f\u7528\u4f8b\u51fd\u6570\u540d\u79f0\uff0c\u5373 def test_music_001 \u91cc\u9762\u7684 music \uff0c\u800c\u4e0d\u662f test_music_001.py \u91cc\u9762\u7684 music \u3002 \u8fd9\u91cc\u7ec6\u7ec6\u54c1\u4e00\u4e0b\u54c8~ \u5982\u679c\u4f60\u5c06\u4e0a\u4f8b\u5199\u6210\u4e86\u8fd9\u6837: # test_music_001.py\ndef test_movie_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u7528\u4f8b\u6267\u884c\u6ca1\u95ee\u9898\uff0c\u4f46\u662f\u6807\u7b7e\u5316\u7ba1\u7406\u662f\u4e0d\u751f\u6548\u7684\uff0c\u6846\u67b6\u65e0\u6cd5\u5c06 music.csv\u6587\u4ef6\u91cc\u9762\u6807\u7b7e\uff0c\u6dfb\u52a0\u5230 test_movie_001\u8fd9\u4e2a\u7528\u4f8b\u4e2d\uff0c\u56e0\u4e3a\u4ed6\u4eec\u6ca1\u6709\u5bf9\u5e94\u5173\u7cfb\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#tag","title":"\u4e8c\u3001\u5206\u652f\u53ca tag \u7ba1\u7406\u89c4\u8303","text":"\u53c2\u8003\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u4ee3\u7801\u7ba1\u7406\u89c4\u8303\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2-tag","title":"2. \u5e94\u7528\u5e93 tag","text":" \u5e94\u7528\u5e93 tag \u6839\u636e\u5e94\u7528\u4ea4\u4ed8\u8282\u70b9\u751f\u6210\uff0c\u6bcf\u6b21\u6253 tag \u4e4b\u524d\uff0c\u76f8\u5173\u6d4b\u8bd5\u4eba\u5458\u9700\u8981\u8fdb\u884c\u7528\u4f8b\u8c03\u8bd5\uff1b \u8c03\u8bd5\u7528\u4f8b\u662f\u6307\u7684\u5728\u5168\u67b6\u6784\uff08x86\u3001arm\u3001mips\uff09\u4e0a\u8c03\u8bd5\u901a\u8fc7\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\u8fbe\u5230 90% \u4ee5\u4e0a\u624d\u80fd\u6253 tag\uff0c\u901a\u8fc7 Jenkins \u6267\u884c\u5668\u6267\u884c\u7528\u4f8b\uff0c\u4fdd\u7559\u901a\u8fc7\u7387\u7ed3\u679c\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\uff1a\u901a\u8fc7\u7528\u4f8b\u6570 / (\u603b\u7528\u4f8b\u6570 - \u5df2\u5e9f\u5f03\u7528\u4f8b) \u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u7b97\u901a\u8fc7 Jenkins \u6267\u884c\u5668 \u4f60\u53ef\u80fd\u4f1a\u5728\u4e00\u4e2a\u4ea4\u4ed8\u5468\u671f\u5185\u6301\u7eed\u7684\u8fdb\u884cAT\u7528\u4f8b\u8c03\u8bd5\uff0c\u4f46\u662f\u6700\u7ec8 AT \u7528\u4f8b\u6253 tag \u7684\u5e94\u7528\u7248\u672c\uff0c\u9700\u8981\u4f7f\u7528\u5e94\u7528\u96c6\u6210\u4ea4\u4ed8\u7684\u6700\u65b0\u5e94\u7528\u7248\u672c\uff0c\u53ef\u4ee5\u4f7f\u7528\u5e94\u7528\u7684\u63d0\u6d4b\u7248\u672c\uff1b\u4e00\u5b9a\u8981\u786e\u4fdd\u8c03\u8bd5\u7528\u4f8b\u7684\u5e94\u7528\u7248\u672c\u662f\u6700\u65b0\u7684\uff0c\u4e0d\u7136\u96c6\u6210\u8fdb\u53bb\u4e4b\u540e\uff0c\u6301\u7eed\u96c6\u6210\u5c31\u4f1a\u51fa\u95ee\u9898\uff1b tag \u53f7\u600e\u4e48\u6253\uff1f \u6839\u636e\u6301\u7eed\u96c6\u6210\u7684\u8981\u6c42\u751f\u6210\uff0c\u5176\u4e2d\u5e94\u7528\u7248\u672c\u53f7\u9700\u8981\u4e0e\u9879\u76ee\u7ecf\u7406\u786e\u8ba4\u672c\u6b21\u5373\u5c06\u96c6\u6210\u7684\u5e94\u7528\u7248\u672c\u53f7\u662f\u591a\u5c11\uff1b tag \u7684 commit \u4fe1\u606f\u683c\u5f0f\uff1a # commit msg\nversion:5.6.5\n \u5176\u4e2d 5.6.5 \u5199\u5e94\u7528\u7684\u96c6\u6210\u7248\u672c\u53f7\u3002 \u751f\u6210 tag \u7684\u547d\u4ee4\u53c2\u8003\uff1a\u300aGit \u6807\u7b7e\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3-tag","title":"3. \u57fa\u7840\u6846\u67b6 tag","text":"\u57fa\u7840\u6846\u67b6 tag \u4e0d\u4e0e\u4e1a\u52a1\u6302\u94a9\uff0c\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u6309\u9700\u53d1\u5e03\u7248\u672c\uff0c\u5728\u6839\u76ee\u5f55\u4e0b CURRENT \u6587\u4ef6\u4e2d\u8bb0\u5f55\u7684\u5f53\u524d\u7248\u672c\u53f7\u548c\u5386\u53f2\u7248\u672c\u53f7\uff0c\u53ca\u5176\u5bf9\u5e94\u65b0\u589e\u4e86\u54ea\u4e9b\u529f\u80fd\uff0c\u6709\u52a9\u4e8e\u5e94\u7528\u9009\u62e9\u5408\u9002\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\u3002 # CURRENT\n[current]\ntag = 0.9.5\n \u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u7684 control \u6587\u4ef6\u8bb0\u5f55\u5f53\u524d\u5e94\u7528\u5e93\u4f9d\u8d56\u7684\u57fa\u7840\u5e93\u7248\u672c\u3002 # control\n[Depends]\nautotest-basic-frame = 0.9.5\n \u7528\u4f8b\u5728\u6267\u884c\u65f6\u4f1a\u6821\u9a8c\u4e24\u4e2a\u6587\u4ef6\u7684\u7248\u672c\u53f7\u662f\u5426\u4e00\u81f4\uff0c\u5982\u679c\u4e0d\u4e00\u81f4\uff0c\u4f1a\u6253\u5370 error \u65e5\u5fd7\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_2","title":"\u4e09\u3001\u4ed3\u5e93\u6743\u9650\u7ba1\u7406","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_1","title":"1. \u57fa\u7840\u6846\u67b6","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u4ed3\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame \u57fa\u7840\u6846\u67b6\u4e0d\u5141\u8bb8\u533f\u540d\u8bbf\u95ee\uff0c\u5982\u679c\u4f60\u767b\u5f55 gerrit \u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u8bbf\u95ee\u4ee5\u4e0a\u94fe\u63a5\uff0c\u5219\u9700\u8981\u7533\u8bf7\u8bbf\u95ee\u6743\u9650\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_1","title":"2. \u5e94\u7528\u4ed3\u5e93","text":" \u81ea\u52a8\u5316\u5e94\u7528\u4ed3\u5e93\uff1a https://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684 app_name \u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_3","title":"\u56db\u3001\u65b9\u6cd5\u7f16\u5199&\u8c03\u7528\u89c4\u8303","text":"\u65b9\u6cd5\u7f16\u5199\u6574\u4f53\u8bbe\u8ba1\u601d\u8def\u53c2\u8003\uff1a[\u300aAT\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b]"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_2","title":"1. \u65b9\u6cd5\u7f16\u5199","text":"\u5199\u65b9\u6cd5\u7684\u65f6\u5019\u6ce8\u610f\u65b9\u6cd5\u5f52\u5c5e\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget\uff0c\u65b9\u6cd5\u662f\u5728\u54ea\u4e2a\u533a\u57df\u64cd\u4f5c\u7684\uff0c\u5c31\u5199\u5728\u54ea\u4e2a\u7c7b\u91cc\u9762\u3002 \u4e3e\u4f8b\uff1a from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n\"\"\"\u70b9\u51fb\u6807\u9898\u680fxxx\"\"\"\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_2","title":"2. \u65b9\u6cd5\u8c03\u7528","text":" \u5728\u7528\u4f8b\u4e2d\u8c03\u7528\u65b9\u6cd5\uff0c\u901a\u8fc7\u8be5\u5e94\u7528\u552f\u4e00\u7684\u51fa\u53e3\u8fdb\u884c\u8c03\u7528\uff0c\u6bd4\u5982\u6587\u7ba1\uff1a class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n \u4e0d\u8981\u5728\u7528\u4f8b\u4e2d\u5355\u72ec\u53bb\u8c03\u7528 TitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u8fd9\u4e9b\u7c7b\uff0c\u5426\u5219\u540e\u671f\u7528\u4f8b\u4f1a\u53d8\u5f97\u4e0d\u597d\u7ef4\u62a4\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_4","title":"\u4e94\u3001\u7528\u4f8b\u7f16\u5199\u89c4\u8303","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_3","title":"1. \u57fa\u4e8e\u7c7b\u5199\u7528\u4f8b","text":"\u6240\u6709\u7528\u4f8b\u90fd\u5e94\u8be5\u57fa\u4e8e\u7c7b\u53bb\u5199\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001(self):\n\"\"\"\u97f3\u4e50\u542f\u52a8\"\"\"\n \u6ce8\u610f\u4ee5\u4e0b\u51e0\u70b9\uff1a \u7c7b\u540d\u4e0d\u8981\u968f\u4fbf\u53d6\uff0c\u540c\u4e00\u4e2a\u5e94\u7528\u5e94\u8be5\u4f7f\u7528\u540c\u4e00\u4e2a\u7c7b\u540d\uff0c\u7528\u4f8b\u7c7b\u540d\u79f0\u5fc5\u987b\u4ee5 Test \u5f00\u5934\uff0c\u9075\u5faa\u5927\u9a7c\u5cf0\u547d\u540d\u89c4\u8303\uff1b \u7528\u4f8b\u7c7b\u7ee7\u627f BaseCase\uff0c\u4e00\u4e2a\u5e94\u7528\u53ea\u6709\u4e00\u4e2a BaseCase \u4e00\u4e2a py \u6587\u4ef6\u91cc\u9762\u53ea\u6709\u4e00\u4e2a\u7c7b\uff0c\u6211\u4eec\u79f0\u4e3a\u4e00\u4e2a\u6d4b\u8bd5\u7c7b\uff1b \u4e00\u4e2a\u7c7b\u91cc\u9762\u53ef\u4ee5\u6709\u591a\u4e2a\u7528\u4f8b\u51fd\u6570\uff0c\u8fd9\u53d6\u51b3\u8fd9\u6761\u7528\u4f8b\u6709\u591a\u5c11\u4e2a\u6d4b\u8bd5\u70b9\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001_1(self):\n\"\"\"\u4efb\u52a1\u680f\u542f\u52a8\u97f3\u4e50\"\"\"\ndef test_music_001_2(self):\n\"\"\"\u542f\u52a8\u5668\u542f\u52a8\u97f3\u4e50\"\"\" \ndef test_music_001_3(self):\n\"\"\"\u684c\u9762\u542f\u52a8\u97f3\u4e50\"\"\"\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_3","title":"2. \u7528\u4f8b\u51fd\u6570\u89c4\u8303","text":" \u7528\u4f8b\u51fd\u6570\u4ee5 test \u5f00\u5934\uff0c\u9075\u5faa\u86c7\u5f62\u547d\u540d\u89c4\u8303\uff0c\u4e2d\u95f4\u4e3a\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0\uff0c\u540e\u9762\u52a0\u7528\u4f8b ID\uff0c\u6700\u540e\u52a0\u6d4b\u8bd5\u70b9\u5e8f\u53f7\uff0c\u5373 test_${module}_${case_id}[_${index}] \uff1b \u6bd4\u5982\uff1atest_music_001_1\uff0cindex \u4ece 1 \u5f00\u59cb\u3002 \u51fd\u6570\u529f\u80fd\u8bf4\u660e\u91cc\u9762\u5199\u7528\u4f8b\u6807\u9898\uff0c\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u6807\u9898\u5373\u53ef\uff0c\u6ce8\u610f\u7528\u4e09\u5bf9\u53cc\u5f15\u53f7\uff0c\u4e0d\u8981\u7528\u5176\u4ed6\u6ce8\u91ca\uff0c\u66f4\u4e0d\u8981\u7528\u4e95\u53f7\u6ce8\u91ca\u5199\u7528\u4f8b\u6807\u9898\uff1b \u76f4\u63a5\u590d\u5236 PMS \u7528\u4f8b \u7528\u4f8b\u6b65\u9aa4\u76f4\u63a5\u5c06 PMS \u4e0a\u7528\u4f8b\u6b65\u9aa4\u548c\u9884\u671f\u590d\u5236\u8fdb\u6765\uff0c\u7136\u540e\u8fdb\u884c\u6279\u91cf\u6ce8\u91ca\uff08ctrl + /\uff09\uff0c\u5728\u6ce8\u91ca\u7684\u57fa\u7840\u4e0a\u53bb\u5199\u7528\u4f8b\u811a\u672c\u4f1a\u66f4\u52a0\u65b9\u4fbf\u5168\u9762\uff0c\u4e5f\u6bd4\u4f60\u81ea\u5df1\u5199\u6ce8\u91ca\u66f4\u8282\u7ea6\u65f6\u95f4\uff1a \u4e3e\u4f8b\uff0cPMS \u7528\u4f8b\uff1a \u76f4\u63a5\u9009\u4e2d\u7528\u4f8b\u5185\u5bb9\uff0c\u590d\u5236\u4e0b\u6765\uff0c\u7136\u540e\u7c98\u8d34\u5230\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c\u4e2d\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\n \u4e0a\u4f8b\u4e2d\u4e95\u53f7\u6ce8\u91ca\u90e8\u5206\u5c31\u662f\u76f4\u63a5\u4ece PMS \u4e0a\u590d\u5236\u8fc7\u6765\u7684\uff0c\u5728\u6b64\u57fa\u7840\u4e0a\u5199\u7528\u4f8b\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\nmusic = DeepinMusicWidget()\nmusic.click_singer_btn_in_music_by_ui()\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\nmusic.click_icon_mode_in_music_by_ui()\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\nmusic.double_click_first_singer_in_singer_icon_view_by_ui()\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\nself.assert_xxx\n \u4f60\u770b\uff0c\u975e\u5e38\u6e05\u695a\u6bcf\u4e00\u6b65\u5728\u505a\u4ec0\u4e48\uff0c\u91cd\u70b9\u662f\u7701\u53bb\u4e86\u5199\u6ce8\u91ca\u7684\u65f6\u95f4\uff0c\u771f\u7684\u7092\u9e21\u65b9\u4fbf\u3002 \u4e0d\u5199 if __name__ == '__main__':\uff0c\u4e0d\u5199\u591a\u4f59\u7684\u4ee3\u7801\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3","title":"3. \u6570\u636e\u9a71\u52a8","text":" \u5982\u679c\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u662f\u76f8\u540c\u7684\uff0c\u53ea\u662f\u4e00\u4e9b\u53c2\u6570\u53d8\u5316\uff0c\u5c3d\u91cf\u4f7f\u7528\u6570\u636e\u9a71\u52a8\u6765\u5b9e\u73b0\u7528\u4f8b\uff1b \u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u6570\u636e\u9a71\u52a8\u7684\u6570\u636e\uff0c\u4e0d\u80fd\u56e0\u6b64\u5f15\u5165\u4f9d\u8d56\uff0c\u5c3d\u91cf\u4f7f\u7528\u4e00\u4e9b\u6807\u51c6\u5e93\u80fd\u8bfb\u53d6\u7684\u6587\u4ef6\u683c\u5f0f\uff0c\u6bd4\u5982 json\u3001ini\u3001CSV\u3001xml\u3001txt \u7b49\u6587\u4ef6\u683c\u5f0f\uff1b\u4e0d\u5efa\u8bae\u4f7f\u7528 Yaml\u3001Excel\u3001MySQL \u7b49\u6570\u636e\u683c\u5f0f\uff1b \u8bfb\u53d6\u6570\u636e\u65f6\u4e5f\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff0c\u5982\u4f7f\u7528 pandas \u5904\u7406 CSV \u5c31\u5c5e\u4e8e\u5927\u6750\u5c0f\u7528\u4e86\uff0c\u6b63\u5e38\u7684\u6570\u636e\u9a71\u52a8\u8fd8\u6ca1\u5230\u9700\u8981\u5927\u6570\u636e\u5206\u6790\u6765\u5904\u7406\u7684\u5730\u6b65\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u5728 widget/ddt/ \u76ee\u5f55\u4e0b\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5199\u6cd5\uff1a @pytest.mark.parametrize(\"value\", data)\ndef test_smb_049(self, value):\n \u4ee5\u4e0a\u8fd9\u79cd\u53c2\u6570\u5316\u7684\u5199\u6cd5\u672c\u8eab\u6ca1\u4ec0\u4e48\u95ee\u9898\uff0c\u4f46\u662f\uff0c\u8fd9\u91cc\u5fc5\u987b\u8981\u8865\u5145\u4e00\u4e2a\u6ca1\u6709\u7528\u7684\u5c0f\u77e5\u8bc6\uff1a \u5982\u679c\u53c2\u6570\u5316\u6570\u636e\u91cc\u9762\u7684\u5b57\u7b26\u4f1a\u539f\u5c01\u4e0d\u52a8\u7684\u8f93\u51fa\u5230 item.name \u91cc\u9762\uff0c\u663e\u793a\u975e\u5e38\u4e0d\u4f18\u96c5\uff0c\u800c\u4e14\u53ef\u4ee5\u4f1a\u5f15\u5165\u4e00\u4e9b\u610f\u60f3\u4e0d\u5230\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u611f\u53d7\u4e00\u4e0b\uff1a \u53c2\u6570\uff1a data = [\n\"\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\", \"qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678\",\n]\n \u73b0\u8c61\u662f\u8fd9\u6837\u8272\u513f\u7684\uff1a test_smb_049.py::TestFileManager::test_smb_049[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09]\ntest_smb_049.py::TestFileManager::test_smb_049[qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui]\ntest_smb_049.py::TestFileManager::test_smb_049[12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678]\n \u8bf4\u5b9e\u8bdd\uff0c\u770b\u7740\u5fc3\u91cc\u5835\u5f97\u614c\uff0c\u5982\u679c\u8fd9\u91cc\u9762\u5305\u542b\u4e00\u4e9b\u7279\u6b8a\u5b57\u7b26\u6216\u8005\u662f\u8d85\u957f\uff0c\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u5f88\u5947\u5999\u7684\u4e8b\u60c5\u53d1\u751f\u3002 parametrize \u91cc\u9762\u6709\u4e2a\u53c2\u6570\uff1aids\uff0c\u53ef\u4ee5\u89e3\u51b3\u6b64\u7c7b\u95ee\u9898\uff0c\u5c31\u50cf\u8fd9\u6837\uff1a @pytest.mark.parametrize(\"value\", data, ids=[1, 2, 3])\ndef test_smb_049(self, value):\n \u518d\u6765\u611f\u53d7\u4e00\u4e0b\uff1a test_smb_049.py::TestFileManager::test_smb_049[1]\ntest_smb_049.py::TestFileManager::test_smb_049[2]\ntest_smb_049.py::TestFileManager::test_smb_049[3]\n \u660e\u663e\u597d\u591a\u4e86\uff0c\u6240\u4ee5\u5c3d\u91cf\u4f7f\u7528 ids \u8fd9\u4e2a\u53c2\u6570\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 fixture \u7684\u6570\u636e\u9a71\u52a8\u65b9\u5f0f\uff0c\u6846\u67b6\u867d\u7136\u652f\u6301\uff0c\u4f46\u53ef\u8bfb\u6027\u6bd4\u8f83\u5dee\uff1b\u5982\u679c\u4f60\u4e0d\u77e5\u9053\u8fd9\u53e5\u8bdd\u5728\u8bf4\u5565\uff0c\u90a3\u4f60\u53ef\u4ee5\u5ffd\u7565\uff0c\u6211\u4e5f\u4e0d\u6253\u7b97\u8be6\u7ec6\u8bf4\u8fd9\u79cd\u5b9e\u73b0\u65b9\u5f0f\uff0c\u64cd\u4f5c\u6bd4\u8f83\u9a9a\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4","title":"4. \u65ad\u8a00\u8d44\u6e90","text":" \u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u76f4\u63a5\u653e\u5728\u7528\u4f8b\u6a21\u5757\u7684\u540c\u7ea7\u76ee\u5f55\u4e0b\u7684 assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0 + \u7528\u4f8b ID \u547d\u540d\uff1b \u56fe\u50cf\u8bc6\u522b\u65ad\u8a00\uff0c\u4e0d\u8981\u622a\u53d6\u4e00\u5f20\u5f88\u5927\u7684\u56fe\uff0c\u56fe\u7247\u8d44\u6e90\u5305\u542b\u7684\u5143\u7d20\u592a\u591a\u4e86\uff0c\u975e\u5e38\u5bb9\u6613\u53d7\u5230\u9700\u6c42\u5f71\u54cd\uff0c\u5efa\u8bae\u662f\u8fdb\u884c\u5c40\u90e8\u7684\u65ad\u8a00\uff1b \u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u5339\u914d\u5ea6\u662f 0.9\uff0c\u5982\u679c\u65ad\u8a00\u7684\u573a\u666f\u5bf9\u4e8e\u7cbe\u786e\u5ea6\u8981\u6c42\u6ca1\u90a3\u4e48\u9ad8\uff0c\u53ef\u4ee5\u5728\u65ad\u8a00\u8bed\u53e5\u91cc\u9762\u4f20\u5165\u5c0f\u4e8e 0.9 \u7684\u53c2\u6570\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5","title":"5. \u5143\u7d20\u5b9a\u4f4d","text":" \u7528\u4e8e\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u4e2d\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u547d\u540d\u4e3a\u8be5\u5143\u7d20\u7684\u540d\u79f0\uff1b \u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u622a\u53d6\u65f6\u5c3d\u91cf\u7cbe\u786e\u5230\u8fd9\u4e2a\u5177\u4f53\u7684\u6309\u94ae\uff0c\u56fe\u7247\u4e5f\u4e0d\u8981\u592a\u5927\uff1b \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u64cd\u4f5c\u8f83\u5feb\uff0c\u5408\u7406\u52a0\u5165\u7b49\u5f85\u65f6\u95f4\u80fd\u63d0\u9ad8\u7528\u4f8b\u7684\u7a33\u5b9a\u6027\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6","title":"6. \u7528\u4f8b\u8d44\u6e90","text":" \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u4f7f\u7528\u5230\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u6bd4\u5982\u97f3\u4e50\u53ef\u80fd\u9700\u8981\u4e00\u4e9b mp3 \u7684\u8d44\u6e90\u7528\u4e8e\u6d4b\u8bd5\uff0c\u5b58\u653e\u5728 widget/case_res \u76ee\u5f55\u4e0b\uff0c\u524d\u63d0\u662f\u8fd9\u4e9b\u8d44\u6e90\u4e0d\u8d85\u8fc7 10M\uff1b \u5982\u679c\u662f\u4e00\u4e9b\u6bd4\u8f83\u5927\u7684\u8d44\u6e90\uff0c\u5efa\u8bae\u653e\u5230\u7edf\u4e00\u7684 ftp \u670d\u52a1\u5668 \uff08ftp://10.8.10.245\uff09\uff0c\u9700\u8981\u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\u518d\u4e0b\u8f7d\u4e0b\u6765\uff1b f\"wget ftp://{Config.FTP_IP}/uploads/\u591a\u5a92\u4f53/\u5f71\u9662/auto/{file_name};unzip {file_name};rm -rf {file_name};\"\n \u6d4b\u8bd5\u8d44\u6e90\u4e0b\u8f7d\u5230\u5e94\u7528 widget/case_res \u76ee\u5f55\u4e0b\uff1b \u7981\u6b62\u5c06\u6d4b\u8bd5\u8d44\u6e90\u5b58\u653e\u5728\u4e2a\u4eba\u7684\u673a\u5668\u4e0a\uff1b \u5e94\u8be5\u5c3d\u91cf\u4fdd\u8bc1\uff0c\u4e00\u4e2a\u8d44\u6e90\u5728\u4e00\u6b21\u7528\u4f8b\u6267\u884c\u4e2d\u53ea\u9700\u8981\u4e0b\u8f7d\u4e00\u6b21\uff0c\u6240\u4ee5\u4f60\u4e0d\u80fd\u6bcf\u6b21\u4f7f\u7528\u7684\u65f6\u5019\u90fd\u53bb\u4e0b\u8f7d\uff0c\u8fd9\u6837\u53ef\u80fd\u4f1a\u8017\u8d39\u5927\u91cf\u7684\u7f51\u7edc\u8d44\u6e90\uff0c\u800c\u56e0\u4e3a\u5148\u5224\u65ad\u672c\u5730\u662f\u5426\u5b58\u5728\u6b64\u8d44\u6e90\uff0c\u5982\u679c\u4e0d\u5b58\u5728\u518d\u53bb\u4e0b\u8f7d\uff1b \u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u5c06\u8d44\u6e90\u62f7\u8d1d\u5230\u5bf9\u5e94\u7684\u6d4b\u8bd5\u76ee\u5f55\u4e0b\uff0c\u6bd4\u5982\u5c06 mp3 \u6587\u4ef6\u62f7\u8d1d\u5230 ~/Music \u76ee\u5f55\u4e0b\uff0c\u4f46\u662f\u6211\u4eec\u66f4\u5efa\u8bae\u4f60\u4f7f\u7528\u53d1\u9001\u5feb\u6377\u94fe\u63a5\u7684\u65b9\u5f0f\u66ff\u4ee3\u62f7\u8d1d\u7684\u64cd\u4f5c\uff0c\u56e0\u4e3a\u5728\u62f7\u8d1d\u5927\u6587\u4ef6\u65f6\u662f\u5f88\u6d88\u8017\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u800c\u521b\u5efa\u94fe\u63a5\u5219\u4e0d\u4f1a\uff1b @classmethod\ndef recovery_many_movies_in_movie_by_cmd(cls):\n\"\"\"\u6062\u590d\u591a\u4e2a\u89c6\u9891\u6587\u4ef6\u81f3\u89c6\u9891\u76ee\u5f55\u4e2d\"\"\"\nwork_path = f\"/home/{Config.USERNAME}/Videos/auto\"\ncode_path = f\"{Config.CASE_RES_PATH}/auto\"\ncls.run_cmd(f\"rm -rf {work_path};mkdir {work_path}\")\nsleep(1)\nflag = False\nif not exists(code_path):\ncls.run_cmd(f\"mkdir -p {code_path}\")\nflag = True\nlogger.info(f\"ln -s {code_path}/* {work_path}/\")\ncls.run_cmd(\nf\"cd {code_path}/;\"\nf\"{cls.wget_file('auto.zip') if flag else ''}\"\nf\"ln -s {code_path}/* {work_path}/ > /dev/null 2>&1\"\n)\n \u8d44\u6e90\u4e0b\u8f7d\u8fc7\u7a0b\u4e2d\u6ce8\u610f\u8d85\u65f6\u7684\u95ee\u9898\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u5f88\u5927\uff0c\u8981\u7279\u522b\u6ce8\u610f\u8fd9\u95ee\u9898\uff0c\u5982\u679c\u4f60\u4f7f\u7528\u5f3a\u5236\u7b49\u5f85\u4e0b\u8f7d\u7ed3\u675f( os.system )\uff0c\u53ef\u80fd\u4f1a\u9020\u6210\u7528\u4f8b\u6267\u884c\u65f6\u957f\u53d8\u5f97\u4e0d\u53ef\u63a5\u53d7\uff0c\u76ee\u524d\u6211\u4eec\u53d1\u73b0\u5728\u6301\u7eed\u96c6\u6210\u73af\u5883\u6267\u884c\u65f6\u7f51\u7edc\u4e0b\u8f7d\u901f\u5ea6\u5f88\u6162\uff0c\u6240\u4ee5\u8d85\u65f6\u673a\u5236\u662f\u5f88\u6709\u5fc5\u8981\u7684\uff1brun_cmd \u65b9\u6cd5\u6709\u4e00\u4e2a\u9ed8\u8ba4\u8d85\u65f6\u7684\u65f6\u95f4\uff0c\u4f60\u53ef\u4ee5\u6839\u636e\u8d44\u6e90\u5927\u5c0f\u5bf9\u8d85\u65f6\u65f6\u95f4\u8fdb\u884c\u8c03\u6574\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_5","title":"\u516d\u3001\u7528\u4f8b\u8c03\u8bd5\u6280\u5de7","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_4","title":"1. \u65e5\u5fd7","text":" \u4e00\u5b9a\u8981\u5148\u770b\u62a5\u9519\uff0c\u770b error \u65e5\u5fd7\uff0c\u901a\u5e38\u80fd\u660e\u786e\u7684\u544a\u8bc9\u4f60\u5177\u4f53\u54ea\u91cc\u4ee3\u7801\u62a5\u9519\uff1b \u7ed3\u5408\u62a5\u9519\u70b9\u524d\u9762\u7684error\u3001 info \u548c debug \u65e5\u5fd7\u770b\u5426\u662f\u6b63\u5e38\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_4","title":"2. \u65ad\u70b9\u8c03\u8bd5","text":" \u65b9\u6cd5\u62a5\u9519\uff1a \u5728\u65b9\u6cd5\u5e93\u4e2d\u627e\u5230\u5bf9\u5e94\u7684\u65b9\u6cd5\uff0c\u5355\u72ec\u8c03\u7528\uff0c\u770b\u662f\u5426\u80fd\u6b63\u5e38\u6267\u884c\uff1b \u901a\u5e38\u5355\u4e2a\u65b9\u6cd5\u7684\u6267\u884c\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u62a5\u9519\uff0c\u5f88\u5feb\u5c31\u80fd\u6392\u67e5\u51fa\u95ee\u9898\uff1b\u5728\u65b9\u6cd5\u5185\u90e8\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u65b9\u6cd5\u5185\u90e8\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u8c03\u7528\u6ca1\u95ee\u9898\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u62a5\u9519\u7684\u65b9\u6cd5\u524d\u9762\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u7528\u4f8b\u7684\u4e1a\u52a1\u903b\u8f91\u548c\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u65ad\u8a00\u62a5\u9519\uff1a \u65ad\u8a00\u4e3a\u6570\u636e\u65ad\u8a00\uff0c\u6839\u636e\u8868\u8fbe\u5f0f\u8fdb\u884c\u65ad\u8a00\u8bed\u53e5\u8fdb\u884c\u4fee\u6539\uff1b \u6587\u4ef6\u751f\u6210\u7c7b\u65ad\u8a00\uff0c\u67e5\u770b\u662f\u5426\u9700\u8981\u52a0\u7b49\u5f85\u65f6\u95f4\uff1b \u56fe\u50cf\u65ad\u8a00\uff0c\u5728\u65ad\u8a00\u8bed\u53e5\u5904\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u7528\u4f8b\u8fd0\u884c\u5230\u65ad\u8a00\u5904\u4f1a\u505c\u6b62\uff0c\u67e5\u770b\u6b64\u65f6\u65ad\u8a00\u7684\u56fe\u7247\u4e0e\u7528\u4f8b\u6267\u884c\u7684\u73b0\u573a\u5b58\u5728\u4ec0\u4e48\u5dee\u5f02\uff0c\u6b64\u65f6\u4e5f\u53ef\u4ee5\u8fdb\u884c\u91cd\u65b0\u622a\u56fe\uff0c\u4ece\u800c\u66ff\u6362\u65b0\u7684\u56fe\u7247\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3_1","title":"3. \u8fdc\u7a0b\u6267\u884c","text":" \u8fdc\u7a0b\u6267\u884c\u6307\u7684\u662f\u7f16\u8f91\u5668\u901a\u8fc7\u6307\u5b9a\u8fdc\u7a0b\u89e3\u91ca\u5668\u6267\u884c\u81ea\u52a8\u5316\u4ee3\u7801\uff1b \u8fdc\u7a0b\u6267\u884c\u7684\u597d\u5904\u662f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u7684 Debug \u8fd0\u884c\uff0c\u4e0d\u7528\u5728\u6d4b\u8bd5\u673a\u4e0a\u6253\u5f00\u7f16\u8f91\u5668\uff0c\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u66f4\u5feb\uff1b \u652f\u6301\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u7684\u7f16\u8f91\u5668\uff1a \u4e13\u4e1a\u7248 Pycharm VScode \uff0c\u9700\u8981\u4f7f\u7528\u63d2\u4ef6 Remote-SSH \u8fdc\u7a0b\u6267\u884c\u914d\u7f6e \u4ee5 Pycharm \u4e3a\u4f8b\uff1a File \u2014> Settings \u2014> Project \u2014> Python Interpreter \u2014> \u53f3\u8fb9\u8bbe\u7f6e\u6309\u94ae \u2014> Add... \u2014> SSH Interpreter \u2014> New server configuration(\u586b\u5165host\u548cusername) \u2014> Next \u2014> password\uff08\u6d4b\u8bd5\u673a\u5bc6\u7801\uff09 \u2014> Interpreter(\u9009\u62e9\u8fdc\u7a0b\u89e3\u91ca\u5668) \u2014> Finish "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4_1","title":"4. \u73af\u5883\u6e05\u7406","text":" \u5982\u679c\u7528\u4f8b\u91cc\u9762\u7684 teardown \u6ca1\u6709\u6267\u884c\uff0c\u5927\u6982\u7387\u662f\u56e0\u4e3a setup \u91cc\u9762\u4ee3\u7801\u62a5\u9519\uff0c\u8fd9\u4e24\u4e2a\u662f\u4e00\u5bf9\u7684\uff0csetup \u91cc\u9762\u62a5\u9519\uff0cteardown \u91cc\u9762\u7684\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\uff1b \u76ee\u524d\u6211\u4eec\u5df2\u7ecf\u5c06\u5404\u5e94\u7528\u7684 clean_all \u8fd9\u4e2a fixture \u6539\u6210\u4e86\u7ec8\u7ed3\u5668\uff0c\u786e\u4fdd\u59cb\u7ec8\u80fd\u6267\u884c\u5230\u8fd9\u6b65\uff0c\u4f46\u662f\u7528\u4f8b\u91cc\u9762\u7684 fixture\uff0c\u8fd8\u662f\u9700\u8981\u6211\u4eec\u5c0f\u5fc3\u5904\u7406\uff1b \u8981\u6267\u884c clean_all \u9700\u8981\u5728\u7f16\u8f91\u5668\u8fd0\u884c\u53c2\u6570\u52a0 --clean yes\uff0c\u5199\u7528\u4f8b\u7684\u65f6\u5019\u8bf7\u52a0\u4e0a\uff0c\u4e0d\u7136\u4f60\u4e0d\u786e\u5b9a\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u7684\u73af\u5883\u662f\u5426\u6062\u590d\uff1b setup \u53ef\u4ee5\u4e0d\u8981\uff0c\u5c06 setup \u653e\u5230\u7528\u4f8b\u91cc\u9762\u662f\u4e00\u79cd\u7a33\u59a5\u7684\u505a\u6cd5\uff0cteardown \u4e00\u5b9a\u8981\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5_1","title":"5. \u5143\u7d20\u5b9a\u4f4d\u4e0d\u51c6\uff08\u5750\u6807\u8fd4\u56de\u4e0d\u5bf9\uff09","text":" \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u53ef\u80fd\u53d7\u5230\u7a97\u53e3 ID \u7684\u53d8\u5316\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u9ed8\u8ba4\u53d6\u6700\u65b0\u7684\u4e00\u4e2a\u7a97\u53e3\u7528\u4e8e\u5b9a\u4f4d\uff0c\u4f46\u5982\u679c\u5b9e\u9645\u9700\u8981\u5b9a\u4f4d\u7684\u4e0d\u662f\u6700\u65b0\u7684\u7a97\u53e3\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u91cd\u65b0\u5b9e\u4f8b\u5316\u65b9\u6cd5\u7c7b\u5bf9\u8c61\uff0c\u5e76\u5728\u7c7b\u4e2d\u4f20\u5165\u5bf9\u5e94\u7684\u7a97\u53e3\u5e8f\u53f7\uff1b \u57fa\u4e8e\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u76ee\u524d\u9047\u5230\u7684\u7b14\u8bb0\u672c\u4e0a\uff0c\u7531\u4e8e\u5c4f\u5e55\u7f29\u653e\u6bd4\u4f8b\u4e3a 1.25\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u6211\u4eec\u9ed8\u8ba4\u4f7f\u7528\u7f29\u653e\u6bd4\u4f8b\u4e3a 1\uff1b \u57fa\u4e8e\u56fe\u50cf\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u76ee\u6807\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b \u57fa\u4e8e OCR \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u6587\u5b57\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u540c\u6837\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6_1","title":"6. \u952e\u9f20\u64cd\u4f5c\u4e0d\u51c6","text":" \u9f20\u6807\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6bd4\u5982\u53f3\u952e\u3001\u53cc\u51fb\u65e0\u54cd\u5e94\uff1b \u952e\u76d8\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6216\u8005\u5ef6\u8fdf\u8f93\u5165\uff0c\u6bd4\u5982\u7528\u4f8b\u9700\u8981\u8f93\u5165\u201c\u6211\u662f\u4e2d\u56fd\u4eba\u201d\uff0c\u5b9e\u9645\u53ea\u8f93\u5165\u4e86\u201c\u6211\u56fd\u4eba\u201d\uff1b \u4ee5\u4e0a\u95ee\u9898\u6392\u9664\u5e94\u7528\u5361\u987f\u7b49\u95ee\u9898\uff0c\u5927\u6982\u7387\u662f\u7531\u4e8e\u5de5\u5177\u7684\u95ee\u9898\uff0c\u76ee\u524d\u952e\u9f20\u64cd\u4f5c\u6211\u4eec\u4f7f\u7528\u4e09\u4e2a\u5de5\u5177\uff1aDogtail \u63d0\u4f9b\u7684\u952e\u9f20\u5de5\u5177\u3001PyAutoGUI\u3001Xdotool \uff1b \u6709\u540c\u5b66\u53ef\u80fd\u8981\u8bf4\u4e3a\u5565\u8981\u7528\u4e09\u4e2a\u554a\uff0c\u7528\u4e00\u4e2a\u4e0d\u5c31\u597d\u4e86\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u5404\u6709\u4f18\u70b9\u5404\u6709\u7f3a\u70b9\u3002 \u5982\u679c\u4f60\u9047\u5230\u952e\u9f20\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u8bd5\u8bd5\u901a\u8fc7\u4e0d\u540c\u7684\u5de5\u5177\u64cd\u4f5c\uff1b\u952e\u76d8\u8f93\u5165\u5ef6\u8fdf\u7684\u95ee\u9898\uff0c\u4e00\u822c\u662f\u56e0\u4e3a\u8f93\u5165\u901f\u5ea6\u592a\u5feb\u4e86\uff0c\u7cfb\u7edf\u6ca1\u53cd\u5e94\u8fc7\u6765\uff0c\u5e38\u89c1\u4e8e ARM \u548c MIPS \u4e0a\uff0c\u4fee\u6539\u53c2\u6570 delay_time \u7684\u503c\uff0c\u5355\u4f4d\u4e3a\u6beb\u79d2\uff1b # mouse_key.py\n@classmethod\ndef input_message(cls, message, delay_time=300, interval=0.2):\n\"\"\"\n \u8f93\u5165\u5b57\u7b26\u4e32\n :param message: \u8f93\u5165\u7684\u5185\u5bb9\n :param delay_time: \u5ef6\u8fdf\u65f6\u95f4\n :param interval:\n :return:\n \"\"\"\n \u5982\u679c\u4e0d\u662f\u65b9\u6cd5\u7684\u95ee\u9898\uff0c\u5219\u9700\u8981\u7ee7\u7eed\u548c\u5f00\u53d1\u4e00\u8d77\u6392\u9664\uff0c\u662f\u5426\u4e3a\u5e94\u7528\u63a5\u53d7\u952e\u9f20\u4fe1\u53f7\u5904\u7406\u7684\u95ee\u9898\uff0c\u8fd9\u7c7b\u60c5\u51b5\u6211\u4eec\u4e5f\u662f\u9047\u5230\u8fc7\u7684\uff0c\u5177\u4f53\u95ee\u9898\u5177\u4f53\u5206\u6790\u3002 \u6bd4\u5982\u5f71\u9662\u5c31\u91cd\u5199\u4e86\u4e00\u4e2a\u53f3\u952e\u7684\u65b9\u6cd5\uff1a # base_widget.py\n@classmethod\ndef right_click(cls, _x=None, _y=None):\n\"\"\"\n \u91cd\u5199\u5e95\u5c42\u5355\u51fb\u9f20\u6807\u53f3\u952e\n \u89e3\u51b3\u5f71\u9662\u53f3\u952e\u89e6\u53d1release\u4e8b\u4ef6\u7684\u95ee\u9898\uff08\u53f3\u952e\u4e3b\u7a97\u53e3\u4f1a\u64ad\u653e\u89c6\u9891\uff09\n \"\"\"\ncls.mouse_down(_x, _y, button=3)\nsleep(0.1)\ncls.mouse_up(button=3)\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_6","title":"\u4e03\u3001\u5176\u4ed6\u4e0d\u4e3a\u4eba\u77e5\u7684\u7ec6\u8282","text":" \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u5c3d\u91cf\u7f16\u5199\u540c\u4e00\u4e2a\u5e94\u7528\u6216\u6a21\u5757\u7684\u7528\u4f8b\uff0c\u80fd\u5bf9\u8be5\u7528\u4f8b\u5df2\u6709\u65b9\u6cd5\u719f\u6089\uff0c\u907f\u514d\u8fc7\u591a\u91cd\u590d\u4e1a\u52a1\u4ee3\u7801\u7684\u5c01\u88c5\uff1b \u76f8\u540c\u7684\u573a\u666f\u4e0b\uff0c\u5404\u67b6\u6784\u7b49\u5f85\u65f6\u95f4\u4e0d\u540c\uff0c\u5efa\u8bae\u4f7f\u7528\u6846\u67b6\u63d0\u4f9b\u7684 sleep\uff0c\u6211\u4eec\u505a\u4e86\u4e0d\u540c\u67b6\u6784\u7684\u500d\u6570\u653e\u5927\uff1b \u7f16\u5199\u7528\u4f8b\u65f6\uff0c\u5c3d\u91cf\u8003\u8651\u5230\u6bcf\u4e00\u6b65\u5f02\u5e38\u540e\u7684\u73af\u5883\u6062\u590d\uff0c\u9700\u8981\u5efa\u8bae\u8fd9\u79cd\u610f\u8bc6\uff0c\u968f\u65f6\u8981\u8003\u8651\u5230\uff0c\u8fd9\u6b65\u64cd\u4f5c\u6709\u6ca1\u6709\u53ef\u80fd\u51fa\u9519\uff0c\u51fa\u9519\u4e86\u6539\u600e\u4e48\u529e\uff1b \u63d0\u4ea4\u4ee3\u7801\u7684\u65f6\u5019\u6ce8\u610f\u4e0d\u8981\u628a\u4e00\u4e9b\u4e34\u65f6\u7684\u6d4b\u8bd5\u8d44\u6e90\u63d0\u4ea4\u8fdb\u53bb\u4e86\uff0c\u6bd4\u5982\u6d4b\u8bd5\u4e86\u4e00\u4e2a\u5f71\u7247\uff0c\u6709\u4e9b\u540c\u5b66\u4e60\u60ef\u4f7f\u7528 git add . \uff0c\u7136\u540e\u5c31\u5168\u90e8\u63d0\u4ea4\u5230\u4ee3\u7801\u4ed3\u5e93\u4e86\uff0c\u8fd9\u6837\u5373\u4f7f\u540e\u671f\u628a\u5927\u6587\u4ef6\u5220\u4e86\uff0c.git \u6587\u4ef6\u91cc\u9762\u4e5f\u4f1a\u5f88\u5927\uff0c\u9020\u6210\u4ee3\u7801\u4ed3\u5e93\u53d8\u5f97\u5341\u5206\u81c3\u80bf\u3002 \u66f4\u591a\u7ec6\u8282\u67e5\u770b\uff1a\u300aAT\u7ecf\u9a8c\u603b\u7ed3\u300b"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/","title":"AT \u6267\u884c\u5668\u4f7f\u7528\u6307\u5317","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/5/25\n# Author : litao\n# =============================================\n Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1","title":"1\u3001\u529f\u80fd\u4ecb\u7ecd","text":" \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7cfb\u7edf\u8bed\u8a00\u8bbe\u7f6e\uff0c\u5206\u8fa8\u7387\u8bbe\u7f6e\u53ca\u7528\u4f8b\u6267\u884c\u73af\u5883\u642d\u5efa\uff1b \u652f\u6301 IP \u4e3a 15 \u7f51\u6bb5\u7684 AMD \u67b6\u6784\u6d4b\u8bd5\u673a\u955c\u50cf\u88c5\u673a\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u6307\u5b9a\u5e94\u7528\uff0c\u6307\u5b9a\u8303\u56f4\u6807\u7b7e\u7684\u7528\u4f8b\u6267\u884c\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u72b6\u6001\u68c0\u67e5\uff0c\u662f\u5426\u6709\u6b63\u5728\u8fd0\u884c\u7684\u6d4b\u8bd5\uff1b \u652f\u6301\u914d\u7f6e\u7528\u4f8b\u6267\u884c\u65f6\u957f\uff0c\u9632\u6b62\u4efb\u52a1\u963b\u585e\uff1b \u652f\u6301\u6839\u636e\u5e94\u7528\u7248\u672c\u81ea\u52a8\u67e5\u627e\u5bf9\u5e94\u7684\u7528\u4f8b tag\uff1b \u652f\u6301\u5f02\u5e38\u5904\u7406\u548c\u6d4b\u8bd5\u5b8c\u6210\u7684\u5b9e\u65f6\u6d88\u606f\u901a\u77e5\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2job","title":"2\u3001Job \u4ecb\u7ecd","text":"\u4ee5\u4e0b\u6309\u6267\u884c\u6d41\u7a0b\u7684\u987a\u5e8f\u4ecb\u7ecd\uff0c\u6bcf\u4e00\u6b65\u90fd\u53ef\u4ee5\u5355\u72ec\u6267\u884c\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1_1","title":"1\u3001\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/AT_test/ \u6574\u4e2a\u6d41\u7a0b\u7684\u4e3b\u5165\u53e3\uff0c\u901a\u8fc7\u8fd9\u4e2a\u5165\u53e3\uff0c\u8fde\u540c\u6574\u4e2a\u6d4b\u8bd5\u6d41\u7a0b\uff0c\u955c\u50cf\u88c5\u673a\uff0c\u73af\u5883\u90e8\u7f72\uff0c\u6d4b\u8bd5\u5e94\u7528\u53ca\u751f\u6210\u62a5\u544a\u3002 \u53c2\u6570\u4ecb\u7ecd\uff1a \u6d4b\u8bd5\u673a\uff1a\u6240\u6709\u89c4\u6574\u5230\u56fa\u5b9a\u533a\u57df\u7684\u6d4b\u8bd5\u673a\uff0c\u901a\u8fc7\u6d4b\u8bd5\u540c\u5b66\u5bf9\u6d4b\u8bd5\u673a\u7684\u4e60\u60ef\u547d\u540d\uff0c\u5728\u540e\u53f0\u6620\u5c04\u6d4b\u8bd5\u673a\u7684\u8be6\u7ec6\u4fe1\u606f\uff0c\u62ec\u53f7\u4e2d\u4e3a\u6d4b\u8bd5\u673a IP \u7684\u6700\u540e\u4e00\u4f4d\uff1b \u6d4b\u8bd5\u5e94\u7528\uff1a\u6307\u5b9a\u7684\u6d4b\u8bd5\u5e94\u7528\u7684\u5305\u540d\uff0c\u7cfb\u7edf\u6839\u636e\u540d\u79f0\u81ea\u52a8\u62c9\u53d6\u5bf9\u5e94\u7684\u4ed3\u5e93\u4ee3\u7801\uff1b deb\u5305\u4e0b\u8f7d\u5730\u5740\uff1a\u6d4b\u8bd5\u4e0a\u8ff0\u5e94\u7528\u65f6\uff0c\u9700\u8981\u5b89\u88c5\u7684deb\u5305\u4e0b\u8f7d\u5730\u5740\uff0c\u591a\u4e2a\u5730\u5740\u7528\u201c,\u201d\u9694\u5f00\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff1b \u8303\u56f4\u6807\u7b7e\uff1a\u6267\u884c\u6d4b\u8bd5\u7528\u4f8b\u7684\u6807\u7b7e\u8303\u56f4\uff0c\u5bf9\u5e94\u7528\u4f8b\u4ee3\u7801 csv \u6587\u4ef6\u4e2d\u7684\u6807\u7b7e\u4fe1\u606f\uff0c\u4ee5 pytest \u7684mark\u8bed\u6cd5\u7f16\u5199\uff1b \u7cfb\u7edf\u8bed\u8a00\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u8bed\u8a00\u73af\u5883\uff1b \u5206\u8fa8\u7387\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u5206\u8fa8\u7387\u73af\u5883\uff1b \u955c\u50cf\u5730\u5740\uff1a\u955c\u50cf\u4ed3\u5e93\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u901a\u8fc7 PXE \u88c5\u673a\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u88c5\u673a\u73af\u8282\uff08\u76ee\u524d\u4ec5\u652f\u6301\u90e8\u5206 AMD \u67b6\u6784\u7684\u88c5\u673a\uff09\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2pxe","title":"2\u3001PXE \u88c5\u673a","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/IOS_install/ \u8f93\u5165\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\uff0cIP\uff0c\u5bc6\u7801\uff0c\u955c\u50cf\u5730\u5740\u540e\uff0c\u81ea\u52a8\u88c5\u673a\uff0c\u76ee\u524d\u4ec5\u652f\u6301\u56fa\u5b9a 15 \u7f51\u6bb5\u7684\u90e8\u5206 AMD \u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#3","title":"3\u3001\u6b21\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/all_client_test/ \u8be5\u5165\u53e3\u4e0e\u4e3b\u5165\u53e3\u529f\u80fd\u57fa\u672c\u4e00\u81f4\uff0c\u53ea\u662f\u5265\u79bb\u4e86PXE\u88c5\u673a\u6d41\u7a0b\uff0c\u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7684\u6267\u884c\u6d41\u7a0b\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#4","title":"4\u3001\u73af\u5883\u90e8\u7f72","text":"Jenkins url\uff1ahttps://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/env/build?delay=0sec \u8bbe\u7f6e\u6d4b\u8bd5\u673a\u7684\u7cfb\u7edf\u8bed\u8a00\uff0c\u5206\u8fa8\u7387\u53ca\u5b89\u88c5\u6d4b\u8bd5\u6240\u9700\u7684\u4f9d\u8d56\u5305\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#5","title":"5\u3001\u53d1\u9001\u4ee3\u7801","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/send_code/ \u6839\u636e\u6d4b\u8bd5\u5e94\u7528\u540d\u79f0\uff0c\u62c9\u53d6\u5bf9\u5e94\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u5e76\u6839\u636e\u6d4b\u8bd5\u673a\u4e0a\u5e94\u7528\u7248\u672c\u5207\u6362\u5230\u5bf9\u5e94\u7684tag\u7248\u672c\uff0c\u82e5\u672a\u627e\u5230tag\u7248\u672c\uff0c\u5219\u4f7f\u7528\u6700\u65b0\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u518d\u6839\u636e\u5e94\u7528\u5e93\u4ee3\u7801\u4e2d\u914d\u7f6e\u7684\u57fa\u7840\u5e93\u7248\u672c\uff0c\u62c9\u53d6\u57fa\u7840\u5e93\u4ee3\u7801\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#6","title":"6\u3001\u7528\u4f8b\u6267\u884c","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/run_test/ \u8fd0\u884c\u6d4b\u8bd5\u673a\u4e0a\u7684\u7528\u4f8b"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/","title":"AT \u7528\u4f8b\u7b5b\u9009\u6307\u5317","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u7528\u4f8b\u7b5b\u9009\u6807\u51c6\uff0c\u662f\u6311\u9009\u5408\u9002\u7684\u6587\u672c\u7528\u4f8b\u8fdb\u884c\u81ea\u52a8\u5316\u7528\u4f8b\u8f6c\u5316\u7684\u4e00\u4e9b\u901a\u7528\u6807\u51c6\u3002 \u8fc7\u53bb\u6211\u4eec\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u5b9e\u8df5\u8fc7\u7a0b\u4e2d\uff0c\u5199\u4e86\u4e0d\u5c11\u81ea\u52a8\u5316\u7528\u4f8b\uff0c\u968f\u7740\u9700\u6c42\u7684\u8fed\u4ee3\uff0c\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u81ea\u7136\u8150\u5316\uff0c\u56e0\u800c\u9700\u8981\u5728\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\u5bf9\u81ea\u52a8\u5316\u7528\u4f8b\u8fdb\u884c\u7ef4\u62a4\uff0c\u5728\u7ef4\u62a4\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u6211\u4eec\u53d1\u73b0\uff0c\u6709\u4e9b\u7528\u4f8b\u7ef4\u62a4\u8d77\u6765\u592a\u96be\u4e86\uff0c\u8c03\u8bd5\u7528\u4f8b\u8017\u8d39\u5927\u91cf\u65f6\u95f4\uff0c\u6210\u672c\u5f88\u9ad8\u3002 \u56e0\u6b64\uff0c\u6211\u4eec\u603b\u7ed3\u4e00\u4e9b\u81ea\u52a8\u5316\u7528\u4f8b\u9009\u578b\u7684\u6807\u51c6\uff0c\u4ee5\u4f18\u5316\u540e\u7eed\u81ea\u52a8\u5316\u7528\u4f8b\u7ed3\u6784\uff0c\u671f\u5f85\u6211\u4eec\u80fd\u7f16\u5199\u51fa\u9ad8\u6548\u3001\u7a33\u5b9a\u3001\u6613\u4e8e\u7ef4\u62a4\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_1","title":"\u4e00\u3001\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u53ef\u4ee5\u5206\u4e3a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u548c\u4e13\u9879\u81ea\u52a8\u5316\u6d4b\u8bd5\uff0c\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e00\u822c\u53ea\u9488\u5bf9\u4e00\u4e9b\u5e38\u89c4\u7684\u529f\u80fd\u6d4b\u8bd5\uff0c\u5176\u4ed6\u975e\u5e38\u89c4\u529f\u80fd\u7684\u7528\u4f8b\uff0c\u5e94\u8be5\u91c7\u7528\u4e13\u9879\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u6848\uff1b \u4ee5\u4e0b\u662f\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1","title":"1. \u7a33\u5b9a\u6027\u3001\u538b\u6d4b\u7528\u4f8b","text":"\u7a33\u5b9a\u6027\u6d4b\u8bd5\u3001\u538b\u6d4b\u7528\u4f8b\u5e94\u8be5\u662f\u5c5e\u4e8e\u6027\u80fd\u76f8\u5173\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u5982\uff1a\u53cd\u590d\u591a\u6b21\u70b9\u51fb\u6309\u94ae\uff0c\u68c0\u9a8c\u5176\u529f\u80fd\u7a33\u5b9a\u6027\u3002\u56e0\u4e3a\u8fd9\u4e9b\u7528\u4f8b\u65ad\u8a00\u7684\u9884\u671f\u53ef\u80fd\u4e0d\u662f\u5f88\u660e\u786e\uff0c\u66f4\u6709\u751a\u8005\u4e0d\u9700\u8981\u65ad\u8a00\uff0c\u7528\u4f8b\u65f6\u957f\u6bd4\u8f83\u957f\uff0c\u800c\u4e14\u4e0d\u53ef\u63a7\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u76ee\u524d\u6211\u4eec\u6709\u6027\u80fd\u81ea\u52a8\u5316\u7684\u4e13\u9879\u65b9\u6848\uff0c\u4ee5\u53ca\u4e00\u4e9b\u7a33\u5b9a\u6027\u6d4b\u8bd5\u7684\u4e13\u9879\u65b9\u6848\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u6b64\u7c7b\u7528\u4f8b\u653e\u5230\u4e13\u9879\u81ea\u52a8\u5316\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2","title":"2. \u6d89\u53ca\u591a\u4e2a\u7528\u6237\u64cd\u4f5c","text":"\u5e38\u89c1\u4e0e\u6587\u7ba1\u7684\u7528\u4f8b\u4e2d\uff0c\u591a\u7528\u6237\u64cd\u4f5c\u7684\u7528\u4f8b\u4e00\u822c\u90fd\u4f1a\u6d89\u53ca\u5230\u5728\u7cfb\u7edf\u4e2d\u8fdb\u884c\u591a\u4e2a\u7528\u6237\u95f4\u7684\u5207\u6362\uff0c\u81ea\u52a8\u5316\u811a\u672c\u4e00\u822c\u662f\u8fd0\u884c\u5728\u4e00\u4e2a\u7528\u6237\u7a7a\u95f4\u4e0b\u7684\uff0c\u6240\u4ee5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u591a\u7528\u6237\u95f4\u7684\u5207\u6362\u3002 \u6b64\u7c7b\u4e0d\u5efa\u8bae\u91c7\u7528\u81ea\u52a8\u5316\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3","title":"3. \u4e0e\u5f00\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4ea4\u4e92","text":"\u6b64\u7c7b\u573a\u666f\u591a\u4e3a\u5e94\u7528\u7684\u5f02\u5e38\u573a\u666f\u6d4b\u8bd5\uff0c\u6bd4\u5982\uff1a\u590d\u5236\u5927\u6587\u4ef6\u8fc7\u7a0b\u4e2d\u6ce8\u9500\u673a\u5668\u3002 \u81ea\u52a8\u5316\u811a\u672c\u5728\u7cfb\u7edf\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4e4b\u540e\u662f\u4f1a\u505c\u6b62\u8fd0\u884c\u7684\uff1b\u6b64\u7c7b\u7528\u4f8b\u53ef\u4ee5\u505a\u81ea\u52a8\u5316\uff0c\u4f46\u662f\u540c\u6837\u9700\u8981\u505a\u4e13\u9879\u65b9\u6848\uff0c\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u7684\u5904\u7406\u903b\u8f91\u5b8c\u5168\u4e0d\u540c\u3002 \u540e\u7eed\u81ea\u52a8\u5316\u9700\u8981\u516c\u5173\u7684\u70b9\uff1a \u81ea\u52a8\u5316\u811a\u672c\u5728\u672c\u673a\u8fd0\u884c\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u81f3\u5c11\u9700\u8981\u63d0\u4f9b\u4ee5\u4e0b\u529f\u80fd\uff1a \u91cd\u542f\u4e4b\u540e\u7528\u4f8b\u80fd\u81ea\u52a8\u8fd0\u884c\uff1b\u53ef\u4ee5\u8003\u8651\u5c06\u6267\u884c\u7528\u4f8b\u5199\u6210\u4e00\u4e2a\u5f00\u673a\u81ea\u542f\u7684\u670d\u52a1\uff1b \u80fd\u8bb0\u5f55\u5173\u673a\u4e4b\u524d\u7528\u4f8b\u6267\u884c\u7684\u4f4d\u7f6e\uff0c\u91cd\u542f\u4e4b\u540e\u80fd\u4ece\u6b64\u4f4d\u7f6e\u5f00\u59cb\u6267\u884c\uff1b \u50cf\u6027\u80fd\u81ea\u52a8\u5316\u4e00\u6837\uff0c\u7531\u670d\u52a1\u7aef\u63a7\u5236\uff1b \u5b8c\u5168\u57fa\u4e8e\u56fe\u5f62\u8bc6\u522b\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u4e32\u53e3\u7ebf\u63a7\u5236\u952e\u9f20\u7a33\u5b9a\u6027\uff1b "},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4","title":"4. \u6d4b\u8bd5\u6267\u884c\u65f6\u95f4\u957f","text":"\u7528\u4f8b\u6267\u884c\u65f6\u95f4\u63a7\u5236\u57282\u5206\u949f\u4ee5\u5185\uff0c\u6781\u7aef\u60c5\u51b5\u4e0d\u8981\u8d85\u8fc75\u5206\u949f\uff0c\u6240\u6709\u7528\u4f8b\u7684\u5e73\u5747\u65f6\u957f\u5e94\u8be5\u57281\u5206\u949f\u5de6\u53f3\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u95f4\u592a\u957f\uff0c\u7f16\u5199\u7528\u4f8b\u3001\u8c03\u8bd5\u7528\u4f8b\u3001\u6267\u884c\u7528\u4f8b\u3001\u7ef4\u62a4\u7528\u4f8b\u90fd\u975e\u5e38\u7684\u8017\u65f6\uff0c\u4eba\u529b\u6210\u672c\u65f6\u95f4\u6210\u672c\u6295\u5165\u592a\u9ad8\u3002 \u4f60\u60f3\uff0c\u8fd9\u6761\u7528\u4f8b\u6267\u884c\u9700\u89815\u5206\u949f\uff0c\u90a3\u4f60\u5199\u8fd9\u6761\u7528\u4f8b\u7684\u65f6\u95f4\u4e0d\u53ef\u80fd\u4e00\u904d\u8fc7\uff0c\u5199\u7684\u8fc7\u7a0b\u4e2d\u8dd1\u4e0d\u901a\u8fd8\u5f97\u91cd\u8dd1\u81f3\u5c1115\u5206\u949f\u4e0d\u8fc7\u5206\uff0c\u5199\u5b8c\u4e86\u8fd8\u5f97\u5728\u5176\u4ed6\u67b6\u6784\u4e0a\u8c03\u8bd5\uff0c\u534a\u4e2a\u5c0f\u65f6\u8fc7\u53bb\u4e86\uff0c\u8fd9\u8fd8\u53ea\u662f\u7b2c\u4e00\u6b21\u5199\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u540e\u7eed\u5982\u679c\u7528\u4f8b\u7ef4\u62a4\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u7ecf\u5e38\u6295\u5165\u76f8\u5f53\u957f\u65f6\u95f4\uff0c\u8fd9\u6837\u5176\u5b9e\u662f\u5931\u53bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u7684\u3002\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u5c31\u5e94\u8be5\u662f\u5feb\u51c6\u72e0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5","title":"5. \u8fb9\u7f18\u6027\u6d4b\u8bd5","text":"\u6709\u4e9b\u529f\u80fd\u6a21\u5757\u672c\u8eab\u662f\u5c5e\u4e8e\u6bd4\u8f83\u8fb9\u7f18\u6027\u7684\uff0c\u5373\u6781\u5c11\u7528\u6237\u4f1a\u4f7f\u7528\u5230\u7684\u529f\u80fd\uff0c\u8fd9\u7c7b\u529f\u80fd\u6a21\u5757\u4e0d\u9700\u8981\u5927\u89c4\u6a21\u5b9e\u73b0\u81ea\u52a8\u5316\uff0c\u4e00\u4e24\u4e2a\u573a\u666f\u8986\u76d6\u57fa\u672c\u529f\u80fd\u5c31\u884c\u4e86\uff0c\u56e0\u6b64\u6211\u4eec\u5728\u6311\u9009\u6b64\u7c7b\u7528\u4f8b\u7684\u65f6\u5019\u53ef\u4ee5\u7ed3\u5408\u6574\u4e2a\u529f\u80fd\u6a21\u5757\u7684\u8986\u76d6\u60c5\u51b5\u6765\u51b3\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6","title":"6. \u9700\u8981\u4f9d\u8d56\u4eba\u5de5\u4ecb\u5165\u7684","text":"\u81ea\u52a8\u5316\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\u662f\u6ca1\u6709\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bd4\u5982\u8981\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u90a3\u4e48\u5c31\u80cc\u79bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u3002 \u6bd4\u5982\u5149\u9a71\u6a21\u5757\uff0c\u5149\u9a71\u523b\u5f55\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u4f46\u662f\u5149\u9a71\u523b\u5f55\u4e4b\u540e\u5149\u76d8\u4f1a\u5f39\u51fa\u6765\uff0c\u9700\u8981\u4eba\u5de5\u66f4\u6362\u5149\u76d8\uff0c\u518d\u624b\u52a8\u63a8\u8fdb\u5149\u9a71\u4e2d\u3002 \u8fd9\u79cd\u529f\u80fd\u6a21\u5757\u5373\u4f7f\u505a\u81ea\u52a8\u5316\uff0c\u80fd\u6d89\u53ca\u5230\u7684\u529f\u80fd\u975e\u5e38\u6709\u9650\uff0c\u800c\u4e14\u4e0d\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u6240\u4ee5\u660e\u663e\u5c31\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7","title":"7. \u96be\u4ee5\u5b9e\u73b0\u7684","text":"\u7528\u4f8b\u6240\u6d89\u53ca\u5230\u7684\u65b9\u6cd5\u5b9e\u73b0\u8d77\u6765\u53ef\u80fd\u6709\u96be\u5ea6\uff0c\u751a\u81f3\u73b0\u9636\u6bb5\u65e0\u6cd5\u5b9e\u73b0\u7684\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002 \u6bd4\u5982\u5f71\u9662\u6d4b\u8bd5\u753b\u9762\u6e05\u6670\u5ea6\u3001\u6d41\u7545\u5ea6\u3001\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u4e4b\u540e\u7684\u89c6\u9891\u662f\u5426\u5b58\u5728\u5361\u987f\u7b49\u7528\u4f8b\uff0c\u73b0\u9636\u6bb5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#8","title":"8. \u529f\u80fd\u4e0d\u7a33\u5b9a","text":"\u8fd9\u4e2a\u4e0d\u662f\u8bf4\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\uff0c\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\u4e0d\u7a33\u5b9a\u662f\u6b63\u5e38\u7684\uff0c\u8fd9\u79cd\u6211\u4eec\u53ef\u4ee5\u7b49\u5f00\u53d1\u63d0\u6d4b\u4e4b\u540e\u518d\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u3002 \u529f\u80fd\u4e0d\u7a33\u5b9a\u6307\u7684\u662f\u7528\u4f8b\u6240\u6d89\u53ca\u7684\u529f\u80fd\uff0c\u53ef\u80fd\u5b58\u5728\u591a\u79cd\u53d8\u5316\uff0c\u6bcf\u6b21\u6267\u884c\u7528\u4f8b\u53ef\u80fd\u65ad\u8a00\u7684\u9884\u671f\u90fd\u4e0d\u540c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#9","title":"9. \u52a8\u6001\u65ad\u8a00","text":"\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u76f4\u5230\u7528\u4f8b\u7ed3\u675f\uff0c\u4e00\u76f4\u662f\u4e00\u4e2a\u52a8\u6001\u53d8\u5316\u7684\u8fc7\u7a0b\uff0c\u800c\u4e14\u65e0\u6cd5\u901a\u8fc7\u5176\u4ed6\u624b\u6bb5\u505c\u4e0b\u6765\uff1b \u6bd4\u5982\uff1a\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u65f6\uff0c\u53f3\u4e0b\u89d2\u7684\u5f55\u5236\u65f6\u95f4\u662f\u4e00\u76f4\u5728\u53d8\u5316\u7684\uff0c\u7528\u4f8b\u9700\u8981\u6d4b\u8bd5\u5f55\u52361\u5206\u949f\u4e4b\u540e\uff0c\u5f55\u5236\u65f6\u95f4\u662f\u521a\u597d\u505c\u572860\u79d2\uff1b \u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fd8\u505a\u4e0d\u5230\u65f6\u95f4\u7cbe\u51c6\u63a7\u5236\uff0c\u7a0b\u5e8f\u6267\u884c\u65f6\u95f4\u662f\u6709\u6ce2\u52a8\u7684\uff0c\u800c\u4e14\u8981\u9002\u914d\u591a\u4e2a\u5e73\u53f0\uff0c\u6240\u4ee5\u6b64\u7c7b\u7528\u4f8b\u5927\u6982\u7387\u4f1a\u6267\u884c\u5931\u8d25\u3002\u7279\u522b\u662f\u5728\u6027\u80fd\u8f83\u5dee\u7684\u56fd\u4ea7\u5316\u67b6\u6784\u4e0a\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u592a\u53ef\u80fd\u7a33\u5b9a\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#10","title":"10. \u63a2\u7d22\u6027\u6d4b\u8bd5","text":"\u63a2\u7d22\u6027\u6d4b\u8bd5\u901a\u5e38\u662f\u4e00\u4e9b\u4e0d\u786e\u5b9a\u7684\u64cd\u4f5c\uff0c\u591a\u53d8\u5207\u590d\u6742\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u9884\u671f\u4e5f\u53ef\u80fd\u662f\u4e0d\u786e\u5b9a\u7684\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u9a9a\u64cd\u4f5c\u592a\u591a\u4e86\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6b64\u7c7b\u7528\u4f8b\u9002\u5408\u91c7\u7528\u624b\u5de5\u6d4b\u8bd5\uff0c\u662f\u624b\u5de5\u6d4b\u8bd5\u771f\u6b63\u7684\u4ef7\u503c\u4f53\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#11","title":"11. \u6613\u7528\u6027\u6d4b\u8bd5","text":"\u5bf9\u4e8e\u6613\u7528\u6027\u7684\u5224\u65ad\u901a\u5e38\u662f\u4e3b\u89c2\u7684\uff0c\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\u5f88\u96be\u53bb\u5b9a\u4e49\u4ec0\u4e48\u6837\u7684\u60c5\u51b5\u5bf9\u7528\u6237\u662f\u6613\u7528\u7684\uff0c\u81ea\u52a8\u5316\u9700\u8981\u6709\u660e\u786e\u7684\u53ef\u5b9e\u73b0\u7684\u9884\u671f\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_2","title":"\u4e8c\u3001\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u524d\u9762\u8bb2\u4e86\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u4e00\u4e9b\u7528\u4f8b\u60c5\u51b5\uff0c\u6709\u540c\u5b66\u5c31\u8bf4\u4e86\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\u4e0d\u7528\u8bb2\u4e86\uff0c\u5c31\u662f\u4e0d\u9002\u5408\u7684\u53cd\u9762\u3002\u6ca1\u6bdb\u75c5\u54c8\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\uff0c\u6211\u4eec\u5927\u4f53\u8fd8\u53ef\u4ee5\u5206\u4e3a\u4e24\u7c7b\uff1a \u7b2c\u4e00\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u597d\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u7b2c\u4e8c\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u4e00\u822c\uff0c\u9700\u8981\u6295\u5165\u66f4\u591a\u7cbe\u529b\u624d\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u4ee5\u4e0b\u4ecb\u7ecd\u4e00\u4e9b\u6211\u4eec\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1_1","title":"1. \u64cd\u4f5c\u76f8\u5bf9\u7b80\u5355","text":"\u7528\u4f8b\u6b65\u9aa4\u76f8\u5bf9\u8f83\u5c11\uff0c\u8fd9\u79cd\u7528\u4f8b\u901a\u5e38\u662f\u4e00\u4e9b\u8def\u5f84\u5f88\u6d45\u7684\u7528\u4f8b\uff0c\u4e00\u822c\u4e5f\u662f\u4e00\u4e9b\u57fa\u7840\u7528\u4f8b\u3002\u7528\u4f8b\u7f16\u5199\u3001\u7ef4\u62a4\u90fd\u53ef\u4ee5\u8f7b\u677e\u641e\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2_1","title":"2. \u5bb9\u6613\u5b9e\u73b0","text":"\u73b0\u6709\u6280\u672f\u662f\u53ef\u5b9e\u73b0\u7684\uff0c\u6ca1\u6709\u96be\u5ea6\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3_1","title":"3. \u7ecf\u5e38\u7528\u4e8e\u56de\u5f52\u6d4b\u8bd5","text":"\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bcf\u6b21\u56de\u5f52\u6d4b\u8bd5\u5fc5\u987b\u8981\u6267\u884c\u7684\u7528\u4f8b\uff0c\u90a3\u4e48\u8fd9\u6761\u7528\u4f8b\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u3002 \u56de\u5f52\u6d4b\u8bd5\u65f6\u6211\u4eec\u9996\u5148\u5e94\u8be5\u4fdd\u8bc1\u5e94\u7528\u5386\u53f2\u57fa\u672c\u529f\u80fd\u6b63\u5e38\uff0c\u6240\u4ee5\u90a3\u4e9b\u6bcf\u6b21\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u90fd\u8981\u6267\u884c\u7684\u7528\u4f8b\u9002\u5408\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4_1","title":"4. \u529f\u80fd\u7a33\u5b9a\u7684\u6838\u5fc3\u529f\u80fd","text":"\u6d89\u53ca\u6838\u5fc3\u529f\u80fd\u7684\u7528\u4f8b\u662f\u6700\u6700\u91cd\u8981\u7684\u7528\u4f8b\uff0c\u4e5f\u662f\u6211\u4eec\u4ea4\u4ed8\u65f6\u5fc5\u987b\u8981\u4fdd\u8bc1\u8d28\u91cf\u7684\u76f8\u5173\u529f\u80fd\uff0c\u56e0\u6b64\u5e94\u8be5\u5c3d\u53ef\u80fd\u7684\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5_1","title":"5. \u8f93\u5165\u6570\u636e\u6d4b\u8bd5","text":"\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u901a\u5e38\u662f\u68c0\u9a8c\u88ab\u6d4b\u5e94\u7528\u63a5\u53d7\u6709\u6548\u6570\u636e\u3001\u62d2\u7edd\u65e0\u6548\u6570\u636e\u7684\u80fd\u529b\u3002\u5982\uff1a\u63d0\u4ea4\u8d85\u957f\u5b57\u7b26\u4e32\u3001\u7279\u6b8a\u5b57\u7b26\u4e32\u7b49\u7b49\u3002 \u6b64\u7c7b\u7528\u4f8b\u624b\u5de5\u6d4b\u8bd5\u5f88\u96be\u6bd4\u8f83\u5168\u9762\u7684\u8986\u76d6\u5230\u6240\u6709\u7684\u8f93\u5165\u60c5\u51b5\uff0c\u4f46\u662f\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\uff0c\u6b64\u7c7b\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u90fd\u662f\u4e00\u6837\u7684\uff0c\u53d8\u5316\u7684\u4ec5\u662f\u8f93\u5165\u53c2\u6570\u548c\u65ad\u8a00\u7ed3\u679c\uff0c\u91c7\u7528\u6570\u636e\u9a71\u52a8\uff0c\u53ef\u4ee5\u8f7b\u677e\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6_1","title":"6. \u683c\u5f0f\u8986\u76d6","text":"\u539f\u56e0\u540c\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u7c7b\u7528\u4f8b\u4e00\u6837\uff0c\u591a\u79cd\u683c\u5f0f\u7684\u8986\u76d6\u4e5f\u662f\u4e00\u4e2a\u5f88\u7e41\u7410\u7684\u4e8b\u60c5\uff0c\u4ea4\u7ed9\u81ea\u52a8\u5316\u6765\u505a\u518d\u5408\u9002\u4e0d\u8fc7\u4e86\u3002 \u6bd4\u5982\u5f71\u9662\u5bf9\u5f71\u7247\u683c\u5f0f\u7684\u68c0\u67e5\u3001\u622a\u56fe\u5f55\u5c4f\u5bf9\u4fdd\u5b58\u683c\u5f0f\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7_1","title":"7. \u68c0\u67e5\u5143\u7d20\u72b6\u6001","text":"\u67e5\u770b\u88ab\u6d4b\u5e94\u7528\u7684\u5143\u7d20\u5c5e\u6027\u3002\u5982\uff1a\u56fe\u7247\u7684\u5927\u5c0f\u548c\u6392\u5217\uff1b\u6309\u94ae\u7684\u53ef\u7528\u548c\u4e0d\u53ef\u7528\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/","title":"AT \u7ecf\u9a8c\u603b\u7ed3","text":"\u6b22\u8fce\u6240\u6709\u4eba\u63d0\u4ea4\u4f60\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u9762\u7684\u4f18\u79c0\u5b9e\u8df5\u7ecf\u9a8c\uff0c\u4ee5\u5e2e\u52a9\u5927\u5bb6\u89e3\u51b3\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#1","title":"1\u3001\u7ec8\u7ed3\u5668","text":"# litaoa@uniontech.com\n \u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4 pytest \u5b9e\u73b0\u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4\u7684\u65b9\u5f0f\u6709\u4e24\u79cd\uff0cyield \u548c\u7ec8\u7ed3\u51fd\u6570\uff1b yield \u5b9e\u73b0\uff0cyield\u524d\u9762\u4e3a\u7528\u4f8b\u7684\u524d\u7f6e\u6b65\u9aa4\uff0cyield \u540e\u9762\u4e3a\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4\u3002 @pytest.fixture\ndef clean_env():\nprint(\"setup\")\nyield\nprint(\"teardown\")\n \u7ec8\u7ed3\u51fd\u6570\u5b9e\u73b0\uff0c\u4f7f\u7528 request.addfinalizer \u6ce8\u518c\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4 @pytest.fixture\ndef clean_env(request):\ndef clean():\nprint(\"teardown\")\nrequest.addfinalizer(clean)\nprint(\"setup\")\n yield\u7684\u4f18\u7f3a\u70b9\uff1a \u4f18\u70b9\uff1a\u4ee3\u7801\u7b80\u6d01\uff0c\u76f4\u89c2\uff0c\u53ef\u4f7f\u7528yield\u5728\u7528\u4f8b\u4e2d\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c \u7f3a\u70b9\uff1a\u82e5\u524d\u7f6e\u6b65\u9aa4\u4e2d\u51fa\u73b0\u9519\u8bef\uff0c\u5219\u540e\u7f6e\u6b65\u9aa4\u4e0d\u4f1a\u6267\u884c \u7ec8\u7ed3\u51fd\u6570\uff1a \u4f18\u70b9\uff1a\u524d\u7f6e\u6b65\u9aa4\u5931\u8d25\u7684\u8bdd\uff0c\u540e\u7f6e\u6b65\u9aa4\u4ecd\u4f1a\u6267\u884c\u4e14\u53ef\u4ee5\u6ce8\u518c\u591a\u4e2a\u540e\u7f6e\u6b65\u9aa4\uff08\u524d\u63d0\uff1a\u9700\u8981\u5728\u4ee3\u7801\u62a5\u9519\u4e4b\u524d\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff09\uff0c\u652f\u6301\u7075\u6d3b\u4f7f\u7528\u540e\u7f6e\u6761\u4ef6 \u7f3a\u70b9\uff1a\u4ee3\u7801\u8f83\u4e3a\u590d\u6742\uff0c\u65e0\u6cd5\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c\uff08\u672c\u4eba\u76ee\u524d\u672a\u5b9e\u73b0\uff09 \u603b\u7ed3\uff1a\u5728\u524d\u7f6e\u6b65\u9aa4\u4fdd\u8bc1\u7edd\u5bf9\u4e0d\u4f1a\u51fa\u9519\u65f6\uff0c\u4f7f\u7528yield\u66f4\u4f73\u7b80\u4fbf\uff0c\u5f53\u524d\u7f6e\u6b65\u9aa4\u6613\u51fa\u73b0\u95ee\u9898\u65f6\uff0c\u63a8\u8350\u4f7f\u7528\u7ec8\u7ed3\u51fd\u6570\u3002 \u573a\u666f\uff1a\u4fdd\u9669\u7bb1\u7528\u4f8b\uff0c\u524d\u7f6e\u6b65\u9aa4\u4e2d\u5f00\u542f\u4fdd\u9669\u7bb1\uff0c\u540e\u7f6e\u6b65\u9aa4\u5220\u9664\u4fdd\u9669\u7bb1\u3002 @pytest.fixture(scope=\"session\", autouse=True)\ndef vault_fixture(request):\nDfmWidget.reset_vault_by_cmd() # 1\u3001\u91cd\u7f6e\u4fdd\u9669\u7bb1\nDdeDockPublicWidget().close_file_manager_by_cmd() # 2\u3001\u5173\u95ed\u6587\u7ba1\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 3\u3001\u5f00\u542f\u6587\u7ba1\nvault = DfmWidget()\nvault.create_file_vault() # 4\u3001\u521b\u5efa\u4fdd\u9669\u7bb1\ndef delete_vault(): # 8\u3001\u5220\u9664\u4fdd\u9669\u7bb1\u7684\u540e\u7f6e\u6b65\u9aa4\nsleep(2)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr()\nvault = DfmWidget()\nvault.delete_file_vault()\nDfmWidget.reset_vault_by_cmd()\nDdeDockPublicWidget().close_file_manager_by_cmd()\nrequest.addfinalizer(delete_vault) # 5\u3001\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\nDdeDockPublicWidget().close_file_manager_by_cmd() # 6\u3001\u5173\u95ed\u6587\u7ba1\nsleep(1)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 7\u3001\u5f00\u542f\u6587\u7ba1\n \u4ee3\u7801\u6309\u6ce8\u91ca\u4e2d\u7684\u5e8f\u53f7\u6267\u884c\u6b65\u9aa4 \u4ee3\u7801\u5728\u6b65\u9aa41-4\u4efb\u610f\u4f4d\u7f6e\u62a5\u9519\uff0c\u5219\u4e0d\u4f1a\u6267\u884c\u6b65\u9aa48\uff0c\u56e0\u4e3a\u672a\u6267\u884c\u5230\u6b65\u9aa45\uff0c\u6b65\u9aa48\u8fd8\u672a\u6ce8\u518c \u4ee3\u7801\u5728\u6b65\u9aa46-7\u62a5\u9519\uff0c\u4ecd\u4f1a\u6267\u884c\u6b65\u9aa47\uff0c\u56e0\u4e3a\u5728\u6b65\u9aa45\u4e2d\u5df2\u7ecf\u5c06\u6b65\u9aa47\u6ce8\u518c \u53ef\u4ee5\u7075\u6d3b\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff0c\u80fd\u5b9e\u73b0\u67d0\u4e2a\u524d\u7f6e\u6b65\u9aa4\u6267\u884c\u4e4b\u540e\uff0c\u624d\u4f1a\u6267\u884c\u540e\u7f6e\u6b65\u9aa4\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#2","title":"2\u3001\u542f\u52a8\u5e94\u7528\u7684\u65b9\u5f0f","text":"# huangmingqiang@uniontech.com\n \uff081\uff09\u547d\u4ee4\u884c\u542f\u52a8 \u5728 AT \u4ee3\u7801\u4e2d\u4f7f\u7528\u547d\u4ee4\u884c\u542f\u52a8\u5e94\u7528\uff0c\u4e3e\u4f8b\uff1a os.popen(\"deepin-music\")\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f7f\u7528 ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6\uff0cdogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u3002 \uff082\uff09\u901a\u8fc7 UI \u64cd\u4f5c\u542f\u52a8 \u901a\u8fc7\u4efb\u52a1\u680f\u3001\u542f\u52a8\u5668\u3001\u684c\u9762\u7b49UI\u65b9\u5f0f\u542f\u52a8\uff0c\u6bd4\u5982\u53cc\u51fb\u6253\u5f00\u3001\u53f3\u952e\u6253\u5f00\u7b49\uff0c\u8fd9\u79cd\u64cd\u4f5c\u65b9\u5f0f\u4e0d\u5b58\u5728ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6dogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u7684\u95ee\u9898\uff0c\u4e5f\u66f4\u52a0\u7b26\u5408\u7528\u6237\u7684\u64cd\u4f5c\u884c\u4e3a\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#3","title":"3\u3001\u6587\u4ef6\u9009\u62e9\u6846\u5c5e\u6027\u5b9a\u4f4d\u5076\u73b0\u65e0\u6cd5\u627e\u5230","text":"\u6587\u4ef6\u9009\u62e9\u6846\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5728\u8c03\u7528\u6587\u4ef6\u9009\u62e9\u6846\u65f6\uff0c\u6709\u4e00\u5b9a\u7684\u6982\u7387\u51fa\u73b0\uff0c\u754c\u9762\u5df2\u7ecf\u6e32\u67d3\u51fa\u6765\u4e86\uff0c\u4f46\u662f\u5c5e\u6027\u6811\u5e76\u6ca1\u6709\u5199\u5165\uff0c\u5bfc\u81f4\u901a\u8fc7\u5c5e\u6027\u65e0\u6cd5\u627e\u5230\u5143\u7d20\uff0c\u76ee\u524d\u4e5f\u6ca1\u6709\u5f88\u597d\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u4e3a\u4e86\u7528\u4f8b\u7a33\u5b9a\u6027\uff0c\u6587\u4ef6\u9009\u62e9\u6846\u7684\u64cd\u4f5c\u5efa\u8bae\u4f7f\u7528UI\u6216\u8005\u56fe\u7247\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u53ef\u4ee5\u901a\u8fc7\u641c\u7d22\u5185\u5bb9\u56fa\u5b9a\u6587\u4ef6\u4f4d\u7f6e\u3002 # litaoa@uniontech.com\n desk = DdeDesktopPublicWidget()\n# \u9009\u62e9\u89c6\u9891\u76ee\u5f55\ndesk.click_videos_dir_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.ctrl_f()\nsleep(1)\ndesk.input_message(\"\u5143\u7d20\u540d\u79f0\")\nsleep(0.5)\ndesk.enter()\nsleep(1)\n# \u9009\u62e9\u7b2c\u4e00\u4e2a\u6587\u4ef6\ndesk.click_list_view_btn_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.click_first_file_in_desktop_plugs_by_ui()\nsleep(1)\n# \u6587\u7ba1\u63d2\u4ef6\u4e2d\u70b9\u51fb\u6253\u5f00\ndesk.click_open_btn_in_desktop_plugs_by_ui()\n"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#4","title":"4\u3001\u5e94\u7528\u542f\u52a8","text":"# mikigo\n \u5728UI\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u4e00\u5207\u64cd\u4f5c\u7684\u90fd\u662f\u4ece\u5e94\u7528\u542f\u52a8\u5f00\u59cb\u7684\uff0c\u800c\u5728Linux\u684c\u9762\u5e94\u7528\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u6211\u4eec\u542f\u52a8\u5e94\u7528\u7684\u65b9\u6cd5\u6709\u591a\u79cd\uff0c\u4e0b\u9762\u505a\u4e00\u4e2a\u7b80\u5355\u7684\u4ecb\u7ecd\uff1a \u3010\u4f7f\u7528dogtail\u542f\u52a8\u3011 dogtail\u63d0\u4f9b\u4e86\u5e94\u7528\u542f\u52a8\u7684\u65b9\u6cd5\uff0c\u5728utils\u5e93\u4e2d\uff0c\u4f7f\u7528run\u65b9\u6cd5\u542f\u52a8\uff1a \u9996\u5148\u5bfc\u5165\u65b9\u6cd5\uff1a from dogtail.utils import *\n \u8c03\u7528run\u65b9\u6cd5 run('deepin-music')\n \u5373\u53ef\u542f\u52a8\u97f3\u4e50 \u8fd9\u79cd\u65b9\u6cd5\u7684\u4f18\u70b9\u662f\u91c7\u7528\u8fdb\u7a0b\u7684\u65b9\u5f0f\u76f4\u63a5\u542f\u52a8\uff0c\u4e0d\u4f9d\u8d56\u4e0eUI\uff0c\u65e0\u8bba\u684c\u9762\u6216\u4efb\u52a1\u680f\u4e0a\u662f\u5426\u5b58\u5728\u5e94\u7528\u56fe\u6807\uff0c\u90fd\u53ef\u4ee5\u6b63\u5e38\u542f\u52a8\u3002 \u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c \u5982\u679c\u4f7f\u7528ssh\u8fdc\u7a0b\u8c03\u7528\uff0c\u6216\u8005Jenkins\u4e2d\u6267\u884c\u6d4b\u8bd5\u811a\u672c\u7684\u65f6\u5019\uff0c\u5728sniff\u4e2d\u4f1a\u51fa\u73b0\u627e\u4e0d\u5230\u5e94\u7528\uff0c\u7ecf\u8fc7\u5206\u6790\uff0c\u53ef\u80fd\u662f\u56e0\u4e3a\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\u542f\u52a8\u7684\u65f6\u5019\uff0c\u5b9e\u9645\u662f\u91c7\u7528\u4e00\u4e2a\u5b50\u8fdb\u7a0b\u542f\u52a8\u4e86\u5e94\u7528\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u5230\u3002 \u3010\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u3011 \u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807 \u901a\u5e38\u6709\u4e24\u79cd\u65b9\u6cd5\uff1a \uff081\uff09\u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807\u3002 \uff082\uff09\u5df2\u77e5\u5e94\u7528\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u7684\u4f4d\u7f6e\uff0c\u7136\u540e\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u5bf9\u5e94\u5750\u6807\u3002 \u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u7f3a\u70b9\u662f\u4f4d\u7f6e\u5fc5\u987b\u56fa\u5b9a\uff0c\u5982\u679c\u79fb\u52a8\u4f4d\u7f6e\u5c31\u4e0d\u884c\u4e86\uff0c\u800c\u4f7f\u7528\u7b2c\u4e00\u79cd\u65b9\u6cd5\uff0c\u65e0\u8bba\u4f4d\u7f6e\u5728\u54ea\u91cc\uff0c\u53ea\u8981\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u5b58\u5728\u5373\u53ef\u3002 \u3010\u70b9\u51fb\u684c\u9762\u56fe\u6807\u542f\u52a8\u3011 \u684c\u9762\u56fe\u6807\u76ee\u524d\u662f\u91c7\u7528\u56fe\u50cf\u8bc6\u522b\u6280\u672f\uff0c\u5b9a\u4f4d\u5230\u5e94\u7528\u56fe\u6807\u7684\u5750\u6807\uff0c\u7136\u540e\u901a\u8fc7pyauogui\u8fdb\u884c\u70b9\u51fb\u64cd\u4f5c\u3002 \u8be6\u7ec6\u6280\u672f\u65b9\u6848\u53ef\u4ee5\u53c2\u8003\u6211\u7684\u53e6\u5916\u4e24\u7bc7\u535a\u5ba2: \u57fa\u4e8eopencv\u7684\u6a21\u677f\u5339\u914d\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd4\u56de\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 Python\u4e09\u65b9\u5e93PyAutoGui\u7684\u4f7f\u7528\u65b9\u6cd5 \u3010\u4ece\u542f\u52a8\u5668\u542f\u52a8\uff08\u4fd7\u79f0\u5f00\u59cb\u83dc\u5355\uff09\u3011 \u542f\u52a8\u4e2d\u542f\u52a8\u7684\u5b9e\u73b0\u903b\u8f91\u5b9e\u9645\u548c\u4efb\u52a1\u680f\u4e0a\u542f\u52a8\u5dee\u4e0d\u591a\u3002 \u9996\u5148\uff0c\u9700\u8981\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u542f\u52a8\u5668\u56fe\u6807\uff0c\u6216\u8005\u952e\u76d8super\u952e\uff0c\u5c06\u542f\u52a8\u5668\u547c\u51fa\u6765\uff0c \u7136\u540e\uff0c\u5728\u542f\u52a8\u5668\u4e2d\u70b9\u51fb\u5bf9\u5e94\u7684\u56fe\u6807\uff0c \u4f46\u662f\u8fd9\u91cc\u6709\u4e2a\u95ee\u9898\uff0c\u542f\u52a8\u5668\u4e2d\u7684\u5e94\u7528\u5217\u8868\uff0c\u4e00\u9875\u5c55\u793a\u4e0d\u5b8c\uff0c\u6240\u4ee5\u5982\u679c\u6211\u4eec\u8981\u70b9\u51fb\u7684\u5e94\u7528\u56fe\u6807\u4e0d\u5728\u7b2c\u4e00\u9875\u600e\u4e48\u529e\uff0c\u901a\u5e38\u89e3\u51b3\u65b9\u6848\u6709\u4e24\u79cd\uff1a \uff081\uff09\u9700\u8981\u8fdb\u884c\u5411\u4e0b\u6ed1\u52a8\uff0c\u8fd9\u91cc\u5c31\u6d89\u53ca\u5230\u76f8\u5e94\u7684\u8bc6\u522b\u65b9\u6848\uff0c\u5224\u65ad\u5982\u679c\u4e0d\u5728\u7b2c\u4e00\u9875\u5c31\u5f80\u4e0b\u6ed1\u52a8\u7ffb\u9875\u3002 \uff082\uff09\u542f\u52a8\u5668\u63d0\u4f9b\u641c\u7d22\u7684\u529f\u80fd\uff0c\u8f93\u5165\u5e94\u7528\u540d\u79f0\u641c\u7d22\uff0c\u7136\u540e\u8fdb\u884c\u70b9\u51fb\u3002 \u4ece\u5b9e\u9645\u64cd\u4f5c\u4e2d\u6765\u770b\uff0c\u91c7\u7528\u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u6548\u7387\u4f1a\u9ad8\u4e00\u70b9\u3002 \u3010\u7ec8\u7aef\u547d\u4ee4\u542f\u52a8\u3011 \u5728python\u4e2d\uff0c\u4f7f\u7528os.popen()\u6216os.system()\u6216\u8005subprocess.Popen()\uff0c\u5b9e\u73b0\u547d\u4ee4\u884c\u542f\u52a8\uff0c\u6bd4\u5982\uff1a import os\nos.popen('deepin-music')\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u8fdc\u7a0b\u6267\u884c\u811a\u672c\u7684\u65f6\u5019\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u7684\u95ee\u9898\u3002 \u3010\u603b\u7ed3\u3011 \u4ee5\u4e0a\u51e0\u79cd\u65b9\u6cd5\uff0c\u5404\u6709\u4f18\u7f3a\u70b9\uff0c\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff1a \uff081\uff09\u5982\u679c\u9700\u8981\u5728Jenkins\u4e2d\u505a\u6301\u7eed\u96c6\u6210\uff0c\u5efa\u8bae\u4f7f\u7528\u7b2c\u4e8c\u79cd\u4efb\u52a1\u680f\u542f\u52a8\u7684\u65b9\u6cd5\u3002 \uff082\uff09\u5982\u679c\u4e0d\u4f1a\u91c7\u7528\u8fdc\u7a0b\u6267\u884c\u7684\uff0c\u5efa\u8bae\u91c7\u7528\u7b2c\u4e00\u79cd\u6216\u8005\u6700\u540e\u4e00\u79cd\u65b9\u6848\u3002 \uff083\uff09\u7b2c\u4e09\u79cd\u548c\u7b2c\u56db\u79cd\u542f\u52a8\u65b9\u6cd5\uff0c\u901a\u5e38\u5728\u6d4b\u8bd5\u7528\u4f8b\u4e2d\u4f1a\u6d89\u53ca\u5230\uff0c\u6240\u4ee5\u5076\u5c14\u4f1a\u7528\u3002"},{"location":"RELEASE/","title":"\u7248\u672c\u66f4\u65b0\u8bb0\u5f55","text":""},{"location":"RELEASE/#220202395","title":"2.2.0\uff082023/9/5\uff09","text":"new \u6b63\u5f0f\u542f\u7528 letmego \u6280\u672f\u65b9\u6848\uff1b fix \u5bf9 docs \u91cc\u9762\u7ec6\u5316\u4e86\u8fdc\u7a0b\u6267\u884c\u7ae0\u8282\u7684\u63cf\u8ff0\uff1b "},{"location":"RELEASE/#2152023831","title":"2.1.5\uff082023/8/31\uff09","text":"new \u5c06\u6709\u8da3\u7684\u6587\u6863\u7cfb\u7edf\u8fc1\u79fb\u5230 linuxdeepin \uff0c\u5265\u79bb\u6587\u6863\u4e2d\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u91c7\u7528 CDN \u52a0\u901f\u65b9\u5f0f\u52a0\u8f7d\uff1b \u5c1d\u8bd5\u5408\u5165\u4e00\u4e2a\u6709\u8da3\u7684\u529f\u80fd\uff1b fix \u4fee\u590d\u4e86 Wayland \u952e\u9f20\u5de5\u5177\u6ca1\u6709\u9f20\u6807\u76f8\u5bf9\u79fb\u52a8\u65b9\u6cd5 moveRel \u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 Wayland \u4e0b\u83b7\u53d6\u7a97\u53e3\u4fe1\u606f\u529f\u80fd\u6a21\u5757\u4e2d\u73af\u5883\u53d8\u91cf\u7684\u95ee\u9898\uff1b \u4f18\u5316\u4e86 startproject \u529f\u80fd\u7684\u4e00\u4e9b\u4fe1\u606f\u8f93\u51fa\uff1b \u4fee\u590d\u4e86\u7279\u6b8a\u573a\u666f\u4e0b env_dev.sh \u5f00\u53d1\u73af\u5883\u90e8\u7f72\u662f\u53ef\u80fd\u5f71\u54cd\u5230\u6b63\u5f0f\u73af\u5883 env.sh \u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#2122023822","title":"2.1.2\uff082023/8/22\uff09","text":"new \u589e\u52a0 OCR \u8bc6\u522b\u81ea\u52a8\u91cd\u8bd5\u673a\u5236\uff0c\u9ed8\u8ba4\u91cd\u8bd5 2 \u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u91cd\u8bd5\u6b21\u6570\uff1b \u4f7f\u7528\u7a97\u7ba1\u6700\u65b0\u63d0\u4f9b\u7684\u4e8c\u8fdb\u5236\u63a5\u53e3\uff0c\u4f18\u5316\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u5728 Wayland \u4e0b\u83b7\u53d6\u7a97\u53e3\u4fe1\u606f\u7684\u65b9\u6cd5\uff1b\u611f\u8c22\u684c\u9762\u6d4b\u8bd5\u90e8 @\u4f55\u6743 @\u5b59\u7fe0 \u3001\u7a97\u7ba1\u7814\u53d1 @\u9ec4\u6cfd\u94ed \u7684\u5927\u529b\u652f\u6301\u3002 \u6269\u5145 skipif \u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\u51fd\u6570\uff1a skipif_xdg_type \u652f\u6301 x11 \u6216 wayland \u4e0a\u8df3\u8fc7\uff1b skipif_cpu_name \u652f\u6301\u4e0d\u540c cpu \u4e0a\u8df3\u8fc7\uff0c\u6bd4\u5982\uff1askipif_cpu_name-KLVVW5821\uff1b "},{"location":"RELEASE/#2102023818","title":"2.1.0\uff082023/8/18\uff09","text":"fix \u4fee\u590d SW \u67b6\u6784\u73af\u5883\u4f9d\u8d56\u7684\u95ee\u9898\uff0c\u539f\u56e0\u662f\u4e4b\u524d\u6211\u8fd9\u91cc\u672c\u5730\u6ca1\u6709 SW \u7684\u673a\u5668\uff0c\u6ca1\u6709\u505a\u76f8\u5173\u9002\u914d\uff1b \u4fee\u590d\u5b50\u9879\u76ee\u5355\u72ec\u9700\u8981\u4e09\u65b9\u5305 pexpect\uff0c\u7531\u4e8e\u4e4b\u524d\u662f\u9884\u88c5\u5230\u955c\u50cf\u91cc\u9762\u7684\uff0c\u4f46\u57fa\u7840\u6846\u67b6\u4e0d\u9700\u8981\uff0c\u56e0\u6b64\u6ca1\u6709\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u91cc\u9762\uff0c\u5bfc\u81f4\u5b50\u9879\u76ee\u4f9d\u8d56\u62a5\u9519\u3002 \u4fee\u590d\u5b50\u9879\u76ee cv \u5bfc\u5165\u62a5\u9519\u7684\u95ee\u9898\uff1b \u539f\u56e0\u4e3a\uff1ayouqu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u517c\u5bb9\u4e24\u79cd\u60c5\u51b5\uff0c\u4e00\u79cd\u662f\u9762\u5411\u670d\u52a1\uff0c\u5c31\u662f\u672c\u5730\u6d4b\u8bd5\u673a\u4e0d\u9700\u8981\u5b89\u88c5 OpenCV\uff0c\u7528\u4f8b\u4e2d\u7684\u56fe\u50cf\u8bc6\u522b\u4f1a\u901a\u8fc7\u8fdc\u7a0b\u670d\u52a1\u63a5\u53e3\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u548c\u7ed3\u679c\u83b7\u53d6\uff1b\u7b2c\u4e8c\u79cd\u662f\u539f\u751f\uff0c\u5c31\u662f\u672c\u5730\u76f4\u63a5\u5b89\u88c5 OpenCV \u76f4\u63a5\u7528\u3002\u4e24\u4e2a\u60c5\u51b5\u7684\u4f18\u5148\u7ea7\u662f\u4f18\u5148\u5224\u65ad\u672c\u5730\u5b58\u5728\uff0c\u5426\u5219\u8d70\u670d\u52a1\u3002 \u524d\u9762\u6211\u4eec\u5df2\u7ecf\u628a OCR \u529f\u80fd\u505a\u4e86\u670d\u52a1\u5316\uff0c\u57fa\u4e8e 1 \u5e74\u591a\u4ee5\u6765\u7684\u89c2\u5bdf\uff0c\u7528\u8d77\u6765\u5f88\u7a33\u5b9a\uff0c\u518d\u4e00\u4e2a\u5c31\u662f OpenCV \u5b89\u88c5\u5305\u662f\u6bd4\u8f83\u81c3\u80bf\u7684\uff0c\u7c97\u7565\u6570\u4e86\u4e0b\u4f9d\u8d56\u6709 30+ \u4e2a\uff0c\u800c\u4e14\u5728\u5404\u67b6\u6784\u4e0a\u4f9d\u8d56\u5305\u8fd8\u4e0d\u5c3d\u76f8\u540c\uff0c\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u65b9\u6848\u4e2d\u4e0d\u592a\u597d\u5904\u7406\uff0c\u6240\u4ee5\u672c\u6b21 2.0 \u7248\u672c\u6211\u4eec\u5927\u80c6\u7684\u5c06\u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u529f\u80fd\u4fee\u6539\u4e3a\u9762\u5411\u670d\u52a1\u7684\u65b9\u5f0f\uff0c\u524d\u671f\u6d4b\u8bd5\u4e00\u5207\u770b\u8d77\u6765\u90fd\u5f88\u548c\u8c10\u3002 \u4f46\u662f\u6ca1\u6ce8\u610f\u5230\u4e4b\u524d\u7ed9\u6d77\u71d5\u59d0\u90a3\u8fb9\u9879\u76ee\u5355\u72ec\u5b9a\u5236\u505a\u4e86\u4e2a\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\uff08\u4e3a\u4e86\u80fd\u7b80\u5355\u5e73\u6ed1\u7684\u8fc1\u79fb\u5230 youqu\uff09\uff0c\u6b64\u63a5\u53e3\u5e95\u5c42\u6ca1\u6709\u517c\u5bb9\u670d\u52a1\u5316\uff0c\u6240\u4ee5\u5979\u90a3\u8fb9\u7684\u9879\u76ee\u8c03\u7528\u6b64\u5b9a\u5236\u63a5\u53e3\u4f1a\u62a5 cv \u5bfc\u5165\u7684\u95ee\u9898\u3002 \u7531\u4e8e\u5c06\u8fd9\u4e2a\u5b9a\u5236\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\u8fdb\u884c\u670d\u52a1\u5316\u517c\u5bb9\u6539\u9020\u9700\u8981\u4e00\u5b9a\u65f6\u95f4\uff0c\u6539\u5b8c\u8fd8\u9700\u8981\u6d4b\u8bd5\uff0c\u4f46\u672c\u6b21\u65f6\u95f4\u6bd4\u8f83\u7d27\uff0c\u56e0\u6b64\u5148\u628a OpenCV \u88c5\u8fdb\u865a\u62df\u73af\u5883\uff0c\u540e\u7eed\u7248\u672c\u518d\u8003\u8651\u9488\u5bf9\u6b64\u63a5\u53e3\u505a\u4fee\u6539\u3002"},{"location":"RELEASE/#2002023816","title":"2.0.0\uff082023/8/16\uff09","text":"YouQu\uff08\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff09\u5f00\u6e90\u4e86\uff0c\u540c\u65f6\u63a8\u51fa\u4e86 2.0 \u7248\u672c\u3002 \u611f\u8c22\u738b\u6ce2\u603b\u3001\u67b6\u6784\u5e08\u5f90\u5c0f\u4e1c\u3001\u7814\u53d1\u7ecf\u7406\u90d1\u5e7c\u6208\u3001\u5218\u90d1\u7b49\u7814\u53d1\u540c\u4e8b\u7684\u5927\u529b\u652f\u6301\u3002 new 1\u3001\u65b0\u7684\u57fa\u7840\u6846\u67b6\u4ee3\u7801\u83b7\u53d6\u65b9\u5f0f\u53ca\u65b0\u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4 YouQu \u540e\u7eed\u5747\u901a\u8fc7 PyPI \u8fdb\u884c\u5305\u7684\u53d1\u5e03\uff0c\u4e5f\u5c31\u662f\u8bf4\u540e\u7eed\u53ef\u4ee5\u4f7f\u7528 pip \u8fdb\u884c\u5b89\u88c5\uff1a sudo pip3 install youqu==2.0.0\n \u8fd9\u91cc\u6709 2 \u4e2a\u5c0f\u70b9\u8981\u6ce8\u610f\uff1a \u63a8\u8350\u4f7f\u7528 sudo pip3 \uff08\u52a0 sudo\uff09\u8fdb\u884c\u5b89\u88c5\uff1b \u5982\u679c\u4e0d\u52a0 sudo \u6709\u4e9b\u673a\u5668\u53ef\u80fd $HOME/.local/bin \u4e0d\u5728\u7cfb\u7edf PATH \u73af\u5883\u76ee\u5f55\u4e0b\uff0c\u5728\u4e0d\u6dfb\u52a0\u73af\u5883\u53d8\u91cf\u7684\u60c5\u51b5\u4e0b\uff0c\u4f1a\u51fa\u73b0 YouQu \u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4\uff08youqu-startproject\uff09\u65e0\u6cd5\u4f7f\u7528\u7684\u95ee\u9898\uff1b \u5f53\u7136\uff0c\u5c06\u4e0a\u8ff0\u8def\u5f84\u6dfb\u52a0\u5230\u73af\u5883\u53d8\u91cf\u4e4b\u540e\u4e5f\u662f\u53ef\u4ee5\u7528\u7684\uff0c\u6240\u4ee5\u6211\u8fd9\u91cc\u662f\u63a8\u8350\u52a0 sudo\uff0c\u4e0d\u52a0 sudo \u4e5f\u662f\u53ef\u4ee5\u7684\uff0c\u53ea\u662f\u9700\u8981\u5173\u6ce8\u4e0b\u73af\u5883\u53d8\u91cf\u7684\u95ee\u9898\u3002 \u63a8\u8350\u6307\u5b9a\u7248\u672c\u53f7\uff08youqu==2.0.0\uff09\u5b89\u88c5\uff0c\u5982\u679c\u4e0d\u6307\u5b9a\u7248\u672c\u53f7\u9ed8\u8ba4\u662f\u5b89\u88c5\u6700\u65b0\u53d1\u5e03\u7684 YouQu \u7248\u672c\uff0c\u4f60\u53ef\u4ee5\u5728 PyPI \u4e0a\u7684 Release history \u91cc\u9762\u67e5\u770b\u6709\u54ea\u4e9b\u7248\u672c\u3002 \u5b89\u88c5\u4e4b\u540e\u4f1a\u81ea\u52a8\u751f\u6210\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu-startproject\uff0c\u4f7f\u7528\u5b83\u53ef\u4ee5\u521d\u59cb\u5316\u5de5\u7a0b\uff0c\u8fd9\u91cc\u4ee5\u97f3\u4e50\u4e3e\u4f8b\uff1b youqu-startproject autotest_deepin_music\n \u8fd9\u6837\u5c31\u4f1a\u5728\u5f53\u524d\u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a autotest_deepin_music \u76ee\u5f55\uff0c\u91cc\u9762\u5305\u542b\u4e86\u57fa\u7840\u6846\u67b6\u6240\u6709\u7684\u4ee3\u7801\uff1b \u4e4b\u540e\uff0c\u8fd8\u662f\u5728 apps \u76ee\u5f55\u4e0b\uff0c\u653e\u5165\u5b50\u9879\u76ee\u7684AT\u4ee3\u7801\u5373\u53ef\uff0c\u4f7f\u7528\u65b9\u6cd5\u548c\u8fc7\u53bb\u4e00\u6837\uff0c\u8fd9\u91cc\u5c31\u4e0d\u591a\u4ecb\u7ecd\u3002 \u53e6\u5916\uff0c\u9664\u4e86\u901a\u8fc7 pip \u83b7\u53d6\u4ee5\u5916\uff0c\u4ecd\u7136\u53ef\u4ee5\u901a\u8fc7\u6e90\u7801\u83b7\u53d6\uff08\u76f4\u63a5 git clone\uff09\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u4f7f\u7528 pip \u5b89\u88c5 YouQu \u65f6\uff0cYouQu \u5305\u7684\u5927\u5c0f\u624d 600+ k\uff0c\u5b89\u88c5\u901f\u5ea6\u8d77\u98de\u3002 2\u3001\u65b0\u7684AT\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848 \u4e3a\u4e86\u89e3\u51b3\u4ee5\u4e0b\u95ee\u9898\uff1a \u8fc7\u53bb\u4e00\u6bb5\u65f6\u95f4\u54b1\u4eec\u7ecf\u5e38\u51fa\u73b0\u7684\uff0c\u4e0d\u540c\u7684AT\u9879\u76ee\u5728\u540c\u4e00\u53f0\u673a\u5668\u4e0a\u90e8\u7f72\u73af\u5883\u65f6\u4f9d\u8d56\u7248\u672c\u51b2\u7a81\u7684\u95ee\u9898\uff0c\u65b0\u65b9\u6848\u4e0d\u540c\u7684\u9879\u76ee\u4f1a\u52a8\u6001\u751f\u6210\u81ea\u5df1\u7684\u865a\u62df\u73af\u5883\uff0c\u76f8\u4e92\u4e4b\u95f4\u4e0d\u5f71\u54cd\uff1b \u4e1a\u5185\u4e3a\u4e86\u89e3\u51b3\u7248\u672c\u51b2\u7a81\u95ee\u9898\u4e00\u822c\u90fd\u4f1a\u4f7f\u7528Python\u865a\u62df\u73af\u5883\u7684\u5de5\u5177\uff0c\u4f46\u662f\u90fd\u6709\u4e2a\u95ee\u9898\uff0c\u65e0\u6cd5\u7ba1\u7406 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u5305\uff0c\u672c\u6b21\u6211\u4eec\u89e3\u51b3\u4e86\u8fd9\u4e2a\u95ee\u9898\uff0c\u80fd\u591f\u5b8c\u5168\u7ba1\u7406\u5e38\u89c4\u7684Python\u5305\uff0c\u4e5f\u80fd\u7ba1\u7406\u5230 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u4e09\u65b9\u5305\uff1b \u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u4f7f\u7528\u65b9\u6cd5\uff1a bash env.sh\n \u53ef\u4ee5\u770b\u51fa\u6765\u548c\u539f\u6765\u4f7f\u7528\u65b9\u6cd5\u6ca1\u6709\u53d8\u5316\uff0c\u4e5f\u5c31\u662f\u8bf4\u4ece\u4f7f\u7528\u7684\u89d2\u5ea6\u662f\u5b8c\u5168\u6ca1\u6709\u533a\u522b\u7684\uff0c\u53ea\u662f\u5185\u90e8\u505a\u4e86\u4e0d\u540c\u7684\u4e8b\u60c5\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u672c\u673a\u90e8\u7f72\u7684\u529f\u80fd\u4ecd\u7136\u4fdd\u7559 env_dev.sh\uff0c\u53ef\u4ee5\u4f5c\u4e3a\u5f00\u53d1\u65f6\u7684\u73af\u5883\u90e8\u7f72\u3002 3\u3001\u65b0\u7684\u9a71\u52a8\u547d\u4ee4 \u8fc7\u53bb\u54b1\u4eec\u90fd\u662f\u4f7f\u7528\u8fd9\u6837\u7684\u547d\u4ee4\u6765\u9a71\u52a8\u6267\u884c\uff1a python3 manage.py run\n \u7531\u4e8e\u9ed8\u8ba4\u57fa\u4e8e\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848\uff0c\u56e0\u6b64\u6211\u4eec\u589e\u52a0\u4e86\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu\uff1b \u65b0\u7684\u9a71\u52a8\u65b9\u5f0f\uff1a youqu manage.py run\n \u53ea\u9700\u8981\u628a python3 \u66ff\u6362\u6210 youqu \u5c31\u53ef\u4ee5\u4e86\uff0c\u770b\u8d77\u6765\u5f88\u548c\u8c10~ 4\u3001\u65b0\u7684\u6587\u6863\u5730\u5740 \u8fc7\u53bb\u54b1\u4eec YouQu \u7684\u5728\u7ebf\u6587\u6863\u662f\u90e8\u7f72\u5728\u516c\u53f8\u5185\u7f51\u7684\uff0c\u73b0\u5728\u5f00\u6e90\u5230 github \u4e86\uff0c\u5916\u90e8\u5f00\u53d1\u8005\u80af\u5b9a\u8bbf\u95ee\u4e0d\u5230\u5185\u7f51\u7684\u6587\u6863\uff0c\u56e0\u6b64\u9700\u8981\u5c06\u6587\u6863\u90e8\u7f72\u5230\u516c\u7f51\u3010\u516c\u7f51\u6587\u6863\u3011\uff1b \u516c\u7f51\u6587\u6863\u4f7f\u7528\u7684\u662f github pages\uff08\u767d\u5ad6\u602a\u4e00\u987f\u72c2\u559c~~\uff09\uff0c\u4f46\u53ef\u80fd\u4f1a\u51fa\u73b0\u6587\u6863\u901f\u5ea6\u6162\u7684\u95ee\u9898\uff08\u4ee3\u7406\u4e0b\u5c31\u597d\u4e86\uff09\uff0c\u4e0d\u8fc7\u6ca1\u5173\u7cfb\uff0c\u54b1\u4eec\u3010\u5185\u7f51\u6587\u6863\u3011\u4ecd\u7136\u4fdd\u7559\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u3002 5\u3001\u5176\u4ed6\u4e00\u4e9b\u5c0f\u5c0f\u529f\u80fd\u66f4\u65b0\uff1a \uff081\uff09\u65b0\u589e\u5173\u95ed\u5206\u8fa8\u7387\u68c0\u6d4b\u7684\u53c2\u6570\u503c\uff1b youqu manage.py run --resolution no\n \u6216\u8005\u4fee\u6539 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387, \u6bd4\u5982\uff1a1920x1080\n;no: \u8868\u793a\u4e0d\u505a\u5206\u8fa8\u7387\u6821\u9a8c\nRESOLUTION = 1920x1080\n resolution \u8fd9\u4e2a\u53c2\u6570\u4e00\u76f4\u90fd\u6709\u7684\uff0c\u53ea\u4e0d\u8fc7\u4e4b\u524d\u662f\u7528\u4e8e\u6307\u5b9a\u5206\u8fa8\u7387\u5927\u5c0f\uff0c\u6bd4\u5982 --resolution 1920x1080\uff0c\u4f46\u6709\u4e9b\u63a5\u53e3\u7684\u9879\u76ee\u4e0d\u9700\u8981\u8fd9\u4e2a\u68c0\u67e5\uff0c\u53ef\u4ee5\u7ed9\u5b83\u4e2a no \u5c31\u597d\u4e86\uff0c\u5f53\u7136 CICD \u4e0a\u5173\u95ed\uff0c\u9700\u8981\u6d41\u6c34\u7ebf\u4e0a\u628a\u8fd9\u4e2a\u53c2\u6570\u52a0\u4e0a\uff1b \uff082\uff09\u65b0\u589e\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u7684\u547d\u4ee4\u884c\u53c2\u6570 \u4e4b\u524d\u8fd9\u4e2a\u914d\u7f6e\u9879\u53ea\u80fd\u5728 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c 1 \u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff0cRERUN >= RECORD_FAILED_CASE\u3002\n;1.\u5173\u95ed\u5f55\u5c4f\uff1aRECORD_FAILED_CASE > RERUN\n;2.\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1aRECORD_FAILED_CASE = 0\nRECORD_FAILED_CASE = 1\n \u73b0\u5728\u5c06\u5f00\u53d1\u5230\u547d\u4ee4\u884c\u53c2\u6570\u3002 youqu manage.py run --record_failed_case 2\n fix \u4fee\u590d remote \u6267\u884c\u65f6\uff0c\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u65e0\u6cd5\u751f\u6210\u6d4b\u8bd5\u62a5\u544a\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1302023710","title":"1.3.0\uff082023/7/10\uff09","text":"fix \u8fdb\u4e00\u6b65\u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b\u53c2\u8003\uff1a\u914d\u7f6ePython\u6e90\u7684\u51e0\u79cd\u65b9\u6cd5 \u4fee\u590d wayland_autotool \u53d7\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86wayland\u4e0b\u5076\u73b0\u627e\u4e0d\u5230 .Xauthority \u6587\u4ef6\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1292023626","title":"1.2.9\uff082023/6/26\uff09","text":"fix \u4f18\u5316\u8fdc\u7a0b\u6267\u884c remote \u7684\u53c2\u6570\u76f4\u63a5\u4f20\u7ed9\u8fdc\u7a0b\u673a\u5668\u7684 run \u547d\u4ee4\uff0c\u4e0d\u7528\u518d\u5355\u72ec\u5904\u7406\u8fdc\u7a0b\u6267\u884c\u7684\u53c2\u6570\u903b\u8f91\uff0c\u540e\u7eed\u4e13\u6ce8\u4e8e\u672c\u5730\u6267\u884c\u529f\u80fd\u5f00\u53d1\uff0c\u8fdc\u7a0b\u6267\u884c\u81ea\u52a8\u9002\u7528\uff1b env.sh \u79fb\u9664 pyyaml \u5b89\u88c5\uff0c\u7531\u5b50\u9879\u76ee\u5728 requirement.txt \u91cc\u9762\u5b9a\u4e49\uff0c\u6846\u67b6\u81ea\u52a8\u52a0\u8f7d\uff1b \u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b "},{"location":"RELEASE/#128202369","title":"1.2.8\uff082023/6/9\uff09","text":"fix \u4fee\u590d\u4e86 pypi \u5b89\u88c5 numpy \u5b58\u5728\u7cfb\u7edf\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#127202368","title":"1.2.7\uff082023/6/8\uff09","text":"fix env.sh \u4e2d\u5b89\u88c5 Python \u5305\u672a\u6307\u5b9a\u7248\u672c\u65f6\uff0c\u65e5\u5fd7\u8f93\u51fa\u5b89\u88c5\u7684\u7248\u672c\uff1b pdocr-rpc 2.0.1\nallure-custom 1.2.1\nfunnylog 1.1.3\n \u4fee\u590d -f \u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u62a5\u9519\u7684\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#126202367","title":"1.2.6\uff082023/6/7\uff09","text":"fix \u4fee\u590d wayland \u4e0a\u8c03\u7528\u9f20\u6807\u4e2d\u952e\u3001\u53f3\u952e\u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b \u4fee\u590d pubilic/dde_desktop_public_widget \u91cc\u9762\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u5b9a\u4f4d\u684c\u9762\u6587\u4ef6\u7684\u65b9\u6cd5\uff0c\u5750\u6807\u6ca1\u6709\u62c6\u5305\u7684\u95ee\u9898\uff1b \u4f18\u5316\u4e86\u7b49\u5f85\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b pycreeze \u7248\u672c\u5347\u7ea7\u5230 0.1.29\uff0c\u5bfc\u81f4\u4e0e pyautogui 0.9.53 \u4e0d\u517c\u5bb9\uff0cenv.sh \u91cc\u9762\u589e\u52a0\u6307\u5b9a pycreeze \u7248\u672c\u4e3a 0.1.28\uff1b "},{"location":"RELEASE/#1252023516","title":"1.2.5\uff082023/5/16\uff09","text":"new --app \u53c2\u6570\u540e\u9762\u65b0\u589e\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u76ee\u524d\u652f\u6301\u4e09\u79cd\u53c2\u6570\u4f20\u5165\u65b9\u5f0f\uff1a ~$: youqu run -a deepin-music\n~$: youqu run -a autotest_deepin_music\n~$: youqu run -a apps/autotest_deepin_music\n \u200b \u540e\u4e24\u79cd\u5165\u53c2\u65b9\u5f0f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\u3002 remote \u8fdc\u7a0b\u6267\u884c\u65b0\u589e\u4ece\u547d\u4ee4\u884c\u4f20\u5165\u6d4b\u8bd5\u673a\u4fe1\u606f\uff0c\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679c password \u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6 setting/remote.ini \u4e2d CLIENT_PASSWORD \u7684\u503c,\u6bd4\u5982\uff1auos@10.8.13.33:1 \u6216 uos@10.8.13.33 \uff1b python3 manage.py remote -c uos@10.8.13.33/uos@10.8.13.34\npython3 manage.py remote -c uos@10.8.13.33:1/uos@10.8.13.34:2\n fix \u65e5\u5fd7\u6a21\u5757\u4fee\u6539\u4e3a\u51fd\u6570\u6267\u884c\u4e4b\u524d\u6253\u5370\u65e5\u5fd7\uff1b \u65e5\u5fd7\u6a21\u5757\u589e\u52a0\u767d\u540d\u5355\uff0c\u901a\u8fc7\u7c7b\u540d\u5f00\u5934\uff0c\u7ed3\u675f\uff0c\u5305\u542b\u7b49\u5173\u952e\u5b57\u63a7\u5236\u9700\u8981\u6253\u5370\u7684\u51fd\u6570\u65e5\u5fd7\uff1b \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5982\u679c\u4f20\u5165\u4e86 app_name \u53ea\u4f1a\u5c06 apps \u76ee\u5f55\u4e0b app_name \u7684\u76ee\u5f55\u53d1\u9001\u5230\u6d4b\u8bd5\u673a\uff1b env.sh \u79fb\u9664 python3-dev\uff1b \u4fee\u590d Wayland \u4e0b env.sh \u73af\u5883\u5b89\u88c5\u5931\u8d25\u7684\u95ee\u9898\uff0c\u4f18\u5316\u4e86 deb \u4f9d\u8d56\u5b89\u88c5\u7684\u903b\u8f91\uff1b \u5c06 env.sh \u5237\u65b0\u6e90\u7684\u65e5\u5fd7\u5728\u7ec8\u7aef\u663e\u793a\uff0c\u89e3\u51b3\u5728 CI \u73af\u5883\u4e0b\uff0c\u957f\u65f6\u95f4\u4e0d\u8f93\u51fa\u65e5\u5fd7\u8fde\u63a5\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d1060 \u534e\u4e3a\u673a\u578b\u5b89\u88c5\u952e\u9f20\u5de5\u5177\u65f6\u4f9d\u8d56\u4e0d\u517c\u5bb9\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1242023227","title":"1.2.4\uff082023/2/27\uff09","text":"fix \u4fee\u6539 CURRENT \u6587\u4ef6\uff1b "},{"location":"RELEASE/#1232023227","title":"1.2.3\uff082023/2/27\uff09","text":"new pylint.sh \u652f\u6301\u901a\u8fc7\u4f4d\u7f6e\u53c2\u6570\u4f20\u5165\u6587\u4ef6\u8def\u5f84\uff1abash pylint.sh apps/autotest_deepin_music,\u597d\u5904\u662f\u53c2\u6570\u8def\u5f84\u53ef\u4ee5\u5728\u7ec8\u7aef\u8865\u5168\uff1b \u65b0\u589e\u7cfb\u7edf\u547d\u4ee4 youqu-pylint \uff0c\u7528\u4e8e\u9759\u6001\u4ee3\u7801\u626b\u63cf\uff0c\u4f7f\u7528\u65b9\u6cd5: youqu-pylint apps/autotest_deepin_music\uff1b \u7531\u4e8e\u7cfb\u7edf\u4e00\u4e9b dbus \u63a5\u53e3\u6539\u53d8\uff0c\u516c\u5171\u5e93\u4e2d\u7684 dbus \u65b9\u6cd5\u5c06\u4e0d\u518d\u7ef4\u62a4\uff0c\u7531\u5b50\u9879\u76ee\u5728 other_widget.py \u91cc\u9762\u8fdb\u884c\u7ef4\u62a4\uff1b fix \u4fee\u590d ssh \u73af\u5883\u4e0b\u8fd0\u884c\u63d0\u793a \u201c\u65e0\u6cd5\u8fde\u63a5\u201d \u7684\u95ee\u9898\uff1b \u4fee\u590d\u8fd0\u884c\u65f6\u7a0b\u5e8f\u9000\u51fa\uff0c\u4e0d\u8f93\u51fa\u5f02\u5e38\u65e5\u5fd7\u7684\u95ee\u9898\uff1b \u4fee\u590dyouqu remote xxx \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5728\u670d\u52a1\u7aef Ctrl + C \u65e0\u6cd5\u505c\u6b62\u7a0b\u5e8f\u8fd0\u884c\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#122202328","title":"1.2.2\uff082023/2/8\uff09","text":"new \u65b0\u589e\u6c14\u6ce1\u7c7b\u56fe\u50cf\u8bc6\u522b\u65b9\u6848\uff1bimage_utils.py::ImageUtil::get_during\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u533a\u57df\u8bc6\u522b\uff0c\u4f20\u5165 [x, y, w, h]\uff0cx: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u76ee\u6807\u56fe\u7247\uff0c\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\uff1b env.sh \u79fb\u9664 pypinyin; \u4f18\u5316\u6267\u884c env.sh \u65f6\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b manage.py \u79fb\u9664\u4e86\u53c2\u6570 session_timeout \uff0c\u6846\u67b6\u6839\u636e\u5168\u5c40\u7684 timeout \u4ee5\u53ca\u7528\u4f8b\u81ea\u5b9a\u4e49\u7684 timeout \u81ea\u52a8\u8ba1\u7b97\u51fa sessiontimeout \u7684\u503c\uff1b \u65b0\u589e ocr \u670d\u52a1\u5668\u94fe\u63a5\u91cd\u8bd5\uff0c\u9ed8\u8ba4\u91cd\u8bd51\u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u53c2\u6570\uff1b fix \u4fee\u590d\u4e86\u4e00\u4e9b pylint \u626b\u63cf\u7684\u4ee3\u7801\u98ce\u683c\u95ee\u9898\uff1b \u91cd\u65b0\u8bbe\u8ba1\u4e86\u6d4b\u8bd5\u62a5\u544a\u4e3b\u9898\uff1b "},{"location":"RELEASE/#121202316","title":"1.2.1\uff082023/1/6\uff09","text":"new \u652f\u6301\u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6267\u884c\u7528\u4f8b\uff1b\u53ef\u5c06python3 manage.py \u66ff\u6362\u4e3a youqu \uff1a youqu run -a deepin-music -k 001\n RPC \u670d\u52a1 IP \u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u6307\u5b9a\u4e0d\u540c\u7684\u7aef\u53e3\uff1b \u5728\u7ebf\u6587\u6863\u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u539f\u6765\u7684\u5730\u5740 10.8.10.215 \u5c06\u4e0d\u5728\u4f7f\u7528\uff1b fix \u4fee\u590d --count \u53c2\u6570\u53ef\u80fd\u51fa\u73b0\u4e0e\u5176\u4ed6\u6846\u67b6\u7684\u5de5\u7a0b\u4f9d\u8d56\u5b58\u5728\u51b2\u7a81\uff0c\u62a5\u9519\u91cd\u590d\u6ce8\u518c\u7684\u95ee\u9898\uff1b \u4fee\u590d CI \u73af\u5883\u4e0b\u591a\u4e2a\u5de5\u7a0b\u5b58\u5728 Python \u73af\u5883\u53d8\u91cf\u6307\u5411\u9519\u8bef\uff0c\u5bfc\u5305\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u5355\u72ec\u8fd0\u884c\u65b9\u6cd5\u65f6\u65e0\u65e5\u5fd7\u8f93\u51fa\u7684 Bug\uff1b "},{"location":"RELEASE/#12020221230","title":"1.2.0\uff082022/12/30\uff09","text":"1.1.4 \u7248\u672c\u9002\u914d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e14\u65b0\u589e\u4e86\u8f83\u591a\u65b0\u7279\u6027\uff0c\u6211\u4eec\u8ba1\u5212\u4f7f\u7528 1.1.4 \u7248\u672c\u8fd0\u884c\u4e00\u6bb5\u65f6\u95f4\uff0c1.2.0 \u7248\u672c\u5c06\u4fee\u590d\u671f\u95f4\u51fa\u73b0\u7684 Bug\uff0c\u7136\u540e\u4f5c\u4e3a\u7a33\u5b9a\u7248\u672c\u53d1\u5e03\u3002 new \u4fee\u6539\u5de5\u7a0b\u540d\u79f0\u4e3a youqu\uff1b \u5c06 sphinx \u6587\u6863\u5de5\u7a0b\u8fc1\u79fb\u5230\u5355\u72ec\u7684\u4ed3\u5e93\uff1b fix \u4fee\u590d startapp \u521b\u5efa\u5de5\u7a0b\u65f6\u5b58\u5728\u5de5\u7a0b\u540d\u79f0\u65f6\u65e0\u6cd5\u7ee7\u7eed\u521b\u5efa\uff1b \u4fee\u590d\u4e86 OCR \u670d\u52a1\u5728\u5e76\u53d1\u65f6\u53ef\u80fd\u51fa\u73b0\u65e0\u6cd5\u8fd4\u56de\u7ed3\u679c\u7684\u95ee\u9898\uff0c\u63d0\u5347 OCR \u670d\u52a1\u9ad8\u5e76\u53d1\u7a33\u5b9a\u6027\uff1b \u4fee\u590d PMS \u540c\u6b65\u6807\u7b7e\u5230 CSV \u6587\u4ef6\u4e0d\u652f\u6301\u7528\u4f8b\u5e93\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11420221214","title":"1.1.4\uff082022/12/14\uff09","text":"new \u65b0\u589e startapp \u5b50\u547d\u4ee4\u521b\u5efa\u5b50\u9879\u76ee\u5de5\u7a0b\u6a21\u677f: python3 manage.py startapp autotest_deepin_xxx \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u91cd\u590d\u6267\u884c\u6b21\u6570\uff1b \u53bb\u6389\u6279\u91cf\u6267\u884c\u524d\u6536\u96c6\u7528\u4f8b\u7684\u6b65\u9aa4\uff1b \u589e\u52a0\u5f00\u59cb\u6267\u884c\u65f6\u6253\u5370\u4e00\u4e9b\u6267\u884c\u53c2\u6570\uff0c\u5982\uff1a \u7528\u4f8b\u6536\u96c6\u6570\u91cf: 99\n\u5931\u8d25\u91cd\u8dd1\u6b21\u6570: 1\n\u6700\u5927\u5931\u8d25\u6b21\u6570: 49\n\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4: 200.0s (03\u520620\u79d2)\n\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4: 11880s (3\u5c0f\u65f618\u52060\u79d2)\n \u5b9a\u5236\u4fee\u6539allure\u62a5\u544alogo\u3001title\u3001\u9ed8\u8ba4\u8bed\u8a00\uff1b manage.py \u6267\u884c\u5f00\u59cb\u65f6\u6253\u5370 logo \u548c\u5f53\u524d\u7248\u672c\uff1a \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u255a\u2588\u2588\u2557 \u2588\u2588\u2554\u255d \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2584\u2584 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2580\u2580\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u2584\u2588 \u2584\u2588 \u2588 \u2588 \u2588 \u2584 \u2588 \u2584 \u2580\u2580\u2588 \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\uff1b \u88c5\u9970\u5668\u65b9\u6cd5\u6307\u5b9a\u6b21\u6570\uff1b @pytest.mark.count(2)\ndef test_music_001():\npass\n \u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u6b21\u6570\uff1b python3 manage.py run -a deepin-music -k 001 --count 2\n \u200b image_utils \u589e\u52a0\u51fd\u6570 save_temporary_picture\uff0c\u652f\u6301\u6307\u5b9a\u5c4f\u5e55\u533a\u57df\u622a\u56fe\u5e76\u8fd4\u56de\u56fe\u7247\u5b58\u653e\u7684\u672c\u5730\u8def\u5f84\uff0c\u540e\u7eed\u4f7f\u7528 assert_image_exist \u8fdb\u884c\u65ad\u8a00 Python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(x, y, width, height) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) button_center \u65b0\u589e btn_size \u83b7\u53d6\u63a7\u4ef6\u5de6\u4e0a\u89d2\u5750\u6807\u53ca\u957f\u5bbd\uff0c\u7528\u4e8e\u52a8\u6001\u7684\u622a\u53d6\u5143\u7d20\u7684\u56fe\u7247\uff0c\u53ef\u7528\u4e8e\u5b9a\u4f4d\u65ad\u8a00 python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u6240\u6709\u97f3\u4e50\u6309\u94ae\")) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) allure \u62a5\u544a\u4e2d\u5b9a\u4f4d\u95ee\u9898\u9664\u4e86\u65e5\u5fd7\u3001\u622a\u56fe\u3001\u5f55\u5c4f\u5916\uff0c\u8c03\u7528\u7684\u51fd\u6570\u589e\u52a0\u4e86 step \u6b65\u9aa4\u5c55\u793a\uff1b env.sh \u65b0\u589e\u5b89\u88c5\u5b50\u9879\u76ee Python \u4e09\u65b9\u4f9d\u8d56\uff0c\u5728\u5b50\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u5199 requirement.txt \u6587\u4ef6\uff0cenv.sh \u4f1a\u81ea\u52a8\u52a0\u8f7d\uff1b ocr \u8bc6\u522b\u65b0\u589e\u652f\u6301\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\u8fdb\u884c\u6587\u5b57\u8bc6\u522b\uff0c\u51cf\u5c11\u56e0\u5168\u5c4f\u8bc6\u522b\u65f6\uff0c\u5176\u4ed6\u6587\u5b57\u7684\u5e72\u6270 Python # \u65ad\u8a00\u97f3\u4e50\u7684\u5220\u9664\u5f39\u7a97\u4e2d\uff0c\u5305\u542b\u4e86\u201c\u786e\u8ba4\u201d\u7684\u6587\u5b57 self.assert_ocr_exist(\"\u786e\u8ba4\", picture_abspath=DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u5220\u9664\u5f39\u7a97\"))) \u65ad\u8a00\u51fd\u6570\u7684\u8c03\u7528\u4e5f\u4f1a\u81ea\u52a8\u6253\u5370\u65e5\u5fd7; env.sh \u65b0\u589e\u88c1\u526a\u4f9d\u8d56\u7684\u65b9\u6848\uff1b fix \u4fee\u590d Jenkins \u73af\u5883\u4e0b\uff0c apps \u76ee\u5f55\u4e0b\u5b50\u9879\u76ee\u5b58\u5728 auotest_deepin_xxx@tmp \u76ee\u5f55\uff0c\u5728\u4f20\u5165 app_name \u540e\u65e0\u6cd5\u6267\u884c\u7528\u4f8b\u7684\u95ee\u9898\uff1b \u4fee\u590d\u81ea\u52a8\u751f\u6210 case_list.csv \u6587\u4ef6\u65f6\uff0c\u7528\u4f8b\u987a\u5e8f\u88ab\u8c03\u6574\u7684\u95ee\u9898\uff1b env.sh \u73af\u5883\u5b89\u88c5\u79fb\u9664 git \u548c curl\uff1b \u4fee\u590d\u7528\u4f8b\u5728 setup \u9636\u6bb5\u62a5\u9519\u540e\uff0c\u672a\u5199\u5165 ci_result.json \u7684\u95ee\u9898\uff1b \u79fb\u9664 uos_ci.py\uff1b "},{"location":"RELEASE/#11320221028","title":"1.1.3\uff082022/10/28\uff09","text":"new \u65b0\u589e\u56fe\u50cf\u65ad\u8a00\u6210\u529f\u8f93\u51fa\u5339\u914d\u5ea6\uff1b \u65b0\u589e\u73af\u5883\u5b89\u88c5 yaml \u4f9d\u8d56\uff1b \u65b0\u589e\u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6570\u636e\u56de\u586b\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b \u65b0\u589e\u6d4b\u8bd5\u7ed3\u679c\u8868\u60c5\u663e\u793a\uff0c\u5e76\u4f18\u5316\u4e86\u65e5\u5fd7\u7684\u6392\u7248\uff1b \u65b0\u589e --top {number} \u7528\u4e8e\u8bb0\u5f55\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0c\u65e5\u5fd7\u751f\u6210\u5230 report/logs/top.log\uff1b fix \u4fee\u590d\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4f46\u7ec8\u7aef\u6ca1\u6709\u9519\u8bef\u65e5\u5fd7\u8f93\u51fa\u7684\u95ee\u9898\uff1b \u4fee\u6539\u5931\u8d25\u7528\u4f8b\u56de\u6eaf\u65e5\u5fd7\u4e3a\u8be6\u7ec6\u7ea7\u522b\uff1b \u4fee\u590d\u4e86\u6267\u884c\u8fdb\u5ea6\u672a\u8ba1\u7b97\u8df3\u8fc7\u7528\u4f8b\u7684\u95ee\u9898\uff0c\u5e76\u4f18\u5316\u4e86\u8fdb\u5ea6\u83b7\u53d6\u7684\u7b97\u6cd5\uff1b \u4fee\u590d env.sh \u5728 V23 \u73af\u5883\u4e0b\u5b89\u88c5\u65e0\u6cd5\u8bfb\u53d6\u5bc6\u7801\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 pms \u6d4b\u8bd5\u5957\u6267\u884c\u6216\u6d4b\u8bd5\u5355\u6267\u884c\u65f6\uff0c\u7528\u4f8bID\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b env.sh \u91cc\u9762 hub.deepin.com \u66f4\u6362\u6210 it.uniontech.com\uff1b uos_ci.py \u6d4b\u8bd5\u7ed3\u679c\u7edf\u8ba1\u65f6\uff0c\u603b\u6570\u5254\u9664 skip \u7684\u6570\u91cf "},{"location":"RELEASE/#11220220921","title":"1.1.2\uff082022/09/21\uff09","text":"new \u5728\u6ca1\u6709\u5b89\u88c5 dogtail \u7684\u60c5\u51b5\u4e0b\uff0c\u4e5f\u80fd\u4f7f\u7528 sniff \u5de5\u5177\uff1b fix \u4fee\u590d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e2d\u6ca1\u6709\u5b89\u88c5 AT \u73af\u5883\u6267\u884c uos_ci.py \u62a5\u9519\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11120220919","title":"1.1.1\uff082022/09/19\uff09","text":"new \u65b0\u589e\u6267\u884c\u8fdb\u5ea6\u663e\u793a\uff0c\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u65f6\u65e5\u5fd7\u8f93\u51fa\u5f53\u524d\u8fdb\u5ea6\uff1a[\u5f53\u524d\u6307\u5b9a\u7b2c\u51e0\u6761/\u7528\u4f8b\u603b\u6570]\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u7528\u4f8b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\u6240\u6709\u5931\u8d25\u7528\u4f8b\u7684\u5217\u8868\uff1b \u5173\u95ed\u7ec8\u7aef\u8f93\u51fa\u6355\u83b7\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u65e5\u5fd7\u5feb\u7167\uff1b \u4f18\u5316\u7ec8\u7aef\u8f93\u51fa\u5931\u8d25\u4fe1\u606f\u5197\u957f\u4e3a\u7b80\u8981\u4fe1\u606f\u8f93\u51fa\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u663e\u793a 10 \u4e2a\u6267\u884c\u6700\u6162\u7684\u7528\u4f8b\u5217\u8868\uff0c\u5e76\u8be6\u7ec6\u5217\u51fa\u5404\u4e2a\u9636\u6bb5\u7684\u8017\u65f6\uff1b \u5931\u8d25\u91cd\u8dd1\u7528\u4f8b\u91cd\u8dd1\u4e4b\u524d\u5ef6\u8fdf 1 \u79d2\uff1b \u65b0\u589e\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4ecd\u7136\u5f3a\u5236\u6267\u884c\uff1b \u7528\u4f8b\u6536\u96c6\u65f6\u4ec5\u5728 apps \u76ee\u5f55\u4e0b\u8fdb\u884c\uff0c\u5ffd\u7565 src,setting,public \u76ee\u5f55\uff1b \u65b0\u589e allure \u62a5\u544a\u5907\u4efd\u529f\u80fd\uff0c\u9ed8\u8ba4\u5907\u4efd\u81f3 allure_back \u76ee\u5f55\u4e0b\uff1b manage.py\u65b0\u589e\u53c2\u6570 --lastfailed \u7528\u4e8e\u53ea\u8dd1\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\u7684\u529f\u80fd\uff1b fix \u4fee\u590d\u4e86\u5728\u6ca1\u6709\u6307\u5b9a\u5e94\u7528\u540d\u79f0\u6267\u884c\u65f6\uff0cxml \u62a5\u544a\u751f\u6210\u8def\u5f84\u5f02\u5e38\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 uos_ci.py \u4f20\u5165 timeout \u548c session_timeout \u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11020220916","title":"1.1.0\uff082022/09/16\uff09","text":"new \u65b0\u589ePMS\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u652f\u6301\u591a\u79cd\u6570\u636e\u56de\u586b\u6a21\u5f0f\uff1b \u4f18\u5316\u4e86\u901a\u8fc7\u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u65f6PMS \u722c\u866b\u7684\u6027\u80fd\uff1b \u65b0\u589e .gitmodules \u6587\u4ef6\uff0c\u7528\u4e8e\u6807\u8bb0\u6240\u6709\u5b50\u9879\u76ee\uff0c\u65b9\u4fbf\u7edf\u4e00\u62c9\u53d6\u4ee3\u7801\uff1b env.sh \u9002\u914d\u793e\u533a\u7248\u4e0a\u5b89\u88c5\u81ea\u52a8\u5316\u73af\u5883\uff1b \u589e\u52a0\u6267\u884c\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u9519\u8bef\u7684\u529f\u80fd\uff1b README.md \u589e\u52a0 Wayland \u4e0b\u4f7f\u7528\u3001\u6d4b\u8bd5\u62a5\u544a\u67e5\u770b\u3001\u5e38\u89c1\u95ee\u9898\u7b49\u7684\u6587\u6863\u8bf4\u660e\uff1b \u589e\u52a0\u4e86\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u5bf9 setup\u3001call\u3001teardown \u8fdb\u884c\u65e5\u5fd7\u5206\u6bb5\uff1b fix \u4fee\u590d\u4e86 \u786e\u8ba4\u4fee\u590d \u5217\u6ca1\u5199\u8868\u5934\uff0c\u4f46\u5199\u4e86 fixed-xxx \u6807\u7b7e\uff0c\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u540c\u4e00\u5e94\u7528\u5185\u591a\u4e2a csv \u6587\u4ef6\u4e2d \u786e\u8ba4\u4fee\u590d \u5217\u6709\u7684\u5199\u4e86\uff0c\u6709\u7684\u6ca1\u5199\uff0c\u53ef\u80fd\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 INFO \u65e5\u5fd7\uff0c\u663e\u793a\u4e3a DEBUG \u7684\u95ee\u9898\uff1b\u4fee\u590d\u4e86\u90e8\u5206\u673a\u5668\u4e0a INFO \u65e5\u5fd7\u5185\u5bb9\u663e\u793a\u4e3a\u7ea2\u8272\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\u770b\u4e0d\u5230\u8be6\u7ec6\u4fe1\u606f\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10220220822","title":"1.0.2\uff082022/08/22\uff09","text":"new \u79fb\u9664 loguru\uff0c\u66ff\u6362\u4e3a logging\uff0c\u63a5\u53e3\u4fdd\u6301\u4e0d\u53d8\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u53d7\u5f71\u54cd\uff1b \u9ed8\u8ba4\u5f00\u542f coredump\uff1b fix \u4fee\u590d\u4e86\u4e09\u65b9\u5e93 loguru \u5076\u73b0\u5f02\u5e38\uff0c\u5bfc\u81f4\u7a0b\u5e8f\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7b2c\u4e00\u6b21\u5931\u8d25\u4e0d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10120220812","title":"1.0.1\uff082022/08/12\uff09","text":"new \u65b0\u589e RELEASE.md \u6587\u4ef6\uff0c\u7528\u4e8e\u8bb0\u5f55\u5386\u53f2\u53d1\u5e03\u7248\u672c\u7684\u66f4\u65b0\u5185\u5bb9\uff1b \u517c\u5bb9 Wayland \u6a21\u5f0f\u4e0b\u6267\u884c\u7528\u4f8b\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u7528\u7ba1\u5f53\u524d\u6d4b\u8bd5\u673a\u6267\u884c\u73af\u5883\uff0c\u6846\u67b6\u4f1a\u81ea\u52a8\u6839\u636e\u5f53\u524d\u73af\u5883\u8d70\u4e0d\u540c\u7684\u4ee3\u7801\u903b\u8f91\uff1b \u7531\u4e8e\u9700\u8981\u4fee\u6539 dogtail \u6e90\u4ee3\u7801\uff0c\u56e0\u6b64\u5c06\u4fee\u6539\u540e\u7684\u6e90\u7801\u653e\u5165\u5230\u6838\u5fc3\u5e93\u91cc\u9762 src/depends/dogtail \u540e\u7eed\u7248\u672c\u5c06\u4e0d\u9700\u8981\u5728\u7cfb\u7edf\u4e2d\u5b89\u88c5dogtail\uff1b \u5982\u679c\u5e94\u7528\u5e93\u540c\u6837\u4f7f\u7528\u4e86\u7cfb\u7edf\u5b89\u88c5\u7684 dogtail \u53ef\u80fd\u4f1a\u62a5\u9519\uff0c\u89e3\u51b3\u65b9\u6848\u662f\u5c06\u4ee3\u7801\u4e2d\u7684 import dogtail \u4fee\u6539\u4e3a from src.depends import dogtail ; fix \u91cd\u8dd1\u5931\u8d25\u4e4b\u540e\u624d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff0c\u4fee\u6539\u4e3a\u5931\u8d25\u4e4b\u540e\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":"# Attribution \uff1achengdu Test Team\n# Date \uff1a2021/08/20\n \u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d \u4ed3\u5e93\u5730\u5740\uff1ahttps://gitlabcd.uniontech.com/autotest/cd-desktop-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u65b9\u6848\u6982\u8ff0","text":"\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u667a\u80fd\u8bc6\u522b\u5e94\u7528\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u7528\u4e8e\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u64cd\u4f5c\u8fc7\u7a0b\u4e2d\u7684\u5143\u7d20\u5b9a\u4f4d\u4ee5\u53ca\u5224\u65ad\u7ed3\u679c\u65f6\u7684\u65ad\u8a00\u5904\u7406\uff1b\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\uff0c\u6d4b\u8bd5\u673a\u4e0a\u7684\u753b\u9762\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u5230\u670d\u52a1\u5668\u4e0a\uff0c\u670d\u52a1\u5668\u5bf9\u89c6\u9891\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\u540e\uff0c\u670d\u52a1\u5668\u667a\u80fd\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\u6210\u529f\uff0c\u7136\u540e\u5bf9\u6d4b\u8bd5\u673a\u4e0b\u53d1\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\uff0c\u6d4b\u8bd5\u673a\u63a5\u53d7\u5e76\u6267\u884c\u4e0b\u4e00\u6b65\u64cd\u4f5c\u3002 \u670d\u52a1\u5668\u4e0e\u6d4b\u8bd5\u673a\u4e4b\u95f4\u7684\u94fe\u63a5\uff1a \u670d\u52a1\u5668\u901a\u8fc7 USB \u4e32\u53e3\u8bbe\u5907\uff08USB-HID \u534f\u8bae\uff09\u6a21\u62df\u9f20\u6807\u952e\u76d8\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u64cd\u4f5c\u3002 \u901a\u8fc7\u89c6\u9891\u91c7\u96c6\u8bbe\u5907\u6355\u83b7\u6d4b\u8bd5\u673a\u7684\u5b9e\u65f6\u753b\u9762\u4f20\u8f93\u7ed9\u670d\u52a1\u5668\u3002 \u670d\u52a1\u5668\u5bf9\u91c7\u96c6\u7684\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\uff0c\u8bc6\u522b\u5176\u4e2d\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5e76\u8fd4\u56de\u5143\u7d20\u63a7\u4ef6\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\uff0c\u670d\u52a1\u5668\u901a\u8fc7\u667a\u80fd\u5316\u5206\u6790\uff0c\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e00\u81f4\u5c06\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\u901a\u8fc7\u4e32\u53e3\u6a21\u62df\u952e\u9f20\u4fe1\u53f7\u53d1\u9001\u7ed9\u6d4b\u8bd5\u673a\uff1b\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e0d\u4e00\u81f4\u5c06\u4f1a\u8fdb\u5165\u4e2d\u65ad\u5904\u7406\u53ca\u5f02\u5e38\u7ed3\u679c\u8f93\u51fa\uff0c\u7ee7\u7eed\u6267\u884c\u540e\u7eed\u573a\u666f\uff0c\u76f4\u81f3\u6240\u6709\u7528\u4f8b\u6d4b\u8bd5\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u6df1\u5ea6\u5b66\u4e60\u73af\u5883\u642d\u5efa","text":"\u6a21\u578b\u8bad\u7ec3\u4e3b\u8981\u5bf9 GPU \u6709\u8981\u6c42\uff0c\u8bad\u7ec3\u6a21\u578b\u7684\u673a\u5668\u663e\u5b58\u4e0d\u4f4e\u4e8e 6G\uff0c\u5176\u4ed6\u914d\u7f6e\u65e0\u7279\u6b8a\u8981\u6c42\u3002 \u63a8\u8350\u6027\u4ef7\u6bd4\u8f83\u9ad8\u914d\u7f6e \u64cd\u4f5c\u7cfb\u7edf: UnionTech OS Desktop 20 Professional Linux version 4.19.0-desktop-amd64 (deepin@deepin-PC) (Uos 8.3.0.3-3+rebuild) \u5904\u7406\u5668: Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz (\u516b\u6838 / \u5341\u516d\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460M-HDV(RD)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))/8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: TU116 [GeForce GTX 1660]\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u865a\u62df\u73af\u5883\u5b89\u88c5","text":"cd ~\nwget -c https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh\nbash Miniconda3-latest-Linux-x86_64.sh\n \u4e00\u8def\u56de\u8f66 \u7b2c\u4e00\u6b21\u63d0\u793a\u8f93\u5165 yes/no \uff1a\u8f93\u5165 yes \u7ee7\u7eed\u4e00\u8def\u56de\u8f66 \u7b2c\u4e8c\u6b21\u63d0\u793a\uff1a\u8f93\u5165 no cd ~/miniconda3/bin\nsudo chmod 777 activate\n \u6fc0\u6d3bconda\u73af\u5883 . ./activate\n \u6dfb\u52a0\u516c\u53f8\u5185\u7f51\u6e90 conda config --add channels bioconda\nconda config --add channels conda-forge\n \u5982\u679c\u662f\u5916\u7f51\u6dfb\u52a0\u5916\u7f51\u6e90 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/\n \u5982\u679c\u8981\u5220\u9664\u6e90 conda config --remove-key channels\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"2\u3001\u5b89\u88c5\u4f9d\u8d56","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u521b\u5efa\u865a\u62df\u73af\u5883","text":"conda remove --name mmlab --all # \u79fb\u9664\u6240\u6709\u865a\u62df\u73af\u5883\n conda create -n mmlab python=3.7\n conda activate mmlab\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-pytorch","title":"\uff082\uff09\u5b89\u88c5 Pytorch","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install torch==1.7.0+cu101 torchvision==0.8.1+cu101 torchaudio==0.7.0 -f https://download.pytorch.org/whl/torch_stable.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-mmcv","title":"\uff083\uff09\u5b89\u88c5 MMCV","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install mmcv-full==1.3.3 -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.7.0/index.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"\uff084\uff09\u5b89\u88c5\u663e\u5361\u9a71\u52a8","text":"\u6839\u636e\u4f60\u7684\u663e\u5361\u4e0b\u8f7d\u5bf9\u5e94\u9a71\u52a8\uff0c\u6bd4\u5982\u6211\u7684\u663e\u5361\u4e3a GTX1660\uff0c\u9a71\u52a8\u7248\u672c\u4e3a 430\uff0c\u9a71\u52a8\u4e0b\u8f7d\u5730\u5740\uff1ahttps://www.nvidia.cn/Download/Find.aspx?lang=cn CTRL+ALT+F2 \u8fdb\u5165tty\n \u7981\u7528 nouveau \u9a71\u52a8 sudo vim /etc/modprobe.d/blacklist-nouveau.conf\n \u586b\u5165\uff1a blacklist nouveau options nouveau modeset=0\n \u5237\u65b0\u914d\u7f6e\u6587\u4ef6 sudo update-initramfs -u reboot \u91cd\u542f\u540e\u518d\u8fdb\u5165 tty \u5173\u95ed\u56fe\u50cf\u754c\u9762\uff0c\u8f93\u5165\u547d\u4ee4\u5173\u95ed\u56fe\u50cf\u754c\u9762 sudo service lightdm stop\n \u5b89\u88c5\u9a71\u52a8 sudo chmod a+x NVIDIA-Linux-x86_64-430.run\nsudo ./NVIDIA-Linux-x86_64-430.run\n reboot\u91cd\u542f\uff0cnvidia-smi\u67e5\u770b\u5b89\u88c5\u72b6\u6001\u3002\u6ce8\u610f\u770b\u4e0bcuda\u7248\u672c\uff0c10.1\uff0cdriver\u7248\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u6570\u636e\u6807\u6ce8","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u6570\u636e\u6807\u6ce8","text":"\u6807\u6ce8\u4e4b\u524d\u9700\u8981\u5148\u8f6c\u6362\u56fe\u7247\u5927\u5c0f\uff0c\u5e76\u4e14\u4ee5\u6570\u5b57\u547d\u540d\uff0c\u6bcf\u7ec4\u547d\u540d\u9012\u589e"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"\uff081\uff09\u8f6c\u6362\u5927\u5c0f\u5e76\u91cd\u547d\u540d","text":"rename_pic.py import os\nimport sys\nimport cv2\nimport time\nimport getpass\nusername = getpass.getuser()\nsource_path = f\"/home/{username}/Desktop/right_menu\" # \u56fe\u7247\u8def\u5f84\nsource_dest = os.path.join('/'.join(source_path.split(\"/\")[:-1]), 'tmp')\nif not os.path.exists(source_dest):\nos.mkdir(source_dest)\nstart_name = sys.argv[1]\nfile_name_list = list()\nfor file in os.listdir(source_path):\nif file.endswith('.png'):\nfile_name_list.append(file)\nstart_name = int(start_name)\nfor file in file_name_list:\nos.rename(os.path.join(source_path,file), os.path.join(source_path, f\"{str(start_name)}.png\"))\nstart_name += 1\ntime.sleep(1)\nfor file in os.listdir(source_path):\nimage = os.path.join(source_path, str(file))\nsrc = cv2.imread(image)\nresult = cv2.resize(src, (960, 540))\nresizeImage = os.path.join(source_dest, str(file))\nprint(resizeImage)\ncv2.imwrite(str(resizeImage), result)\ncv2.waitKey(0)\ncv2.destroyAllWindows()\ntime.sleep(1)\nos.system(f'rm -rf {source_path}/*')\nos.system(f'mv {source_dest}/* {source_path}')\nos.system(f'rm -rf {source_dest}')\nprint(\"\u4e0b\u4e00\u4e2a\u5e8f\u53f7\uff1a\", start_name)\n \u6839\u636e\u7ec8\u7aef\u8f93\u51fa\u7684\u4e0b\u4e00\u4e2a\u5e8f\u53f7\u7684\u63d0\u793a\uff0c\u6267\u884c Python \u6587\u4ef6\u7684\u65f6\u5019\u4f20\u53c2\u3002 python rename_pic.py 249\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"\uff082\uff09\u5de5\u5177\u6807\u6ce8","text":"\u4f7f\u7528\u5de5\u5177 labelImg \u6807\u6ce8 sudo pip3 install PyQt5==5.13\nsudo pip3 install labelImg\n \u7ec8\u7aef\u76f4\u63a5\u8f93\u5165 labelImg\uff0c\u56de\u8f66 \u6807\u6ce8\u6a21\u5f0f\u9009\u62e9\uff1aPascalVOC"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u667a\u80fd\u6807\u6ce8","text":"\u6253\u5f00\u5c4f\u5e55\u5f55\u5236\u8f6f\u4ef6\uff0c\u5f55\u5236\u624b\u52a8\u64cd\u4f5c\u4e00\u6b21\u6d4b\u8bd5\u7528\u4f8b\uff0c\u7136\u540e\u5c06\u5f55\u5236\u7684\u89c6\u9891\u8fdb\u884c\u5206\u5e27\uff0c\u7136\u540e\u5bf9\u6bd4\u524d\u4e24\u5e27\u56fe\u6807\u76f8\u4f3c\u5ea6\uff0c\u5254\u9664\u76f8\u4f3c\u5ea6\u8fc7\u9ad8\u7684\u56fe\u7247\uff0c\u5728\u4fdd\u8bc1\u7d20\u6750\u591a\u6837\u6027\u7684\u524d\u63d0\u4e0b\uff0c\u5254\u9664\u91cd\u590d\u591a\u4f59\u7684\u56fe\u7247\u751f\u6210\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u96c6\uff0c\u7136\u540e\u53d6\u51fa\u63a7\u4ef6\u6a21\u677f\u6570\u636e\u96c6\uff0c\u901a\u8fc7 OpenCV \u6a21\u677f\u5339\u914d\u83b7\u53d6\u63a7\u4ef6\u5728\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u56fe\u7247\u4e2d\u6240\u5728\u7684\u5de6\u4e0a\u3001\u5de6\u4e0b\u3001\u53f3\u4e0a\u3001\u53f3\u4e0b\u56db\u5904\u5750\u6807\uff0c\u4ece\u800c\u6839\u636e\u6a21\u677f\u6570\u636e\u96c6\u751f\u6210\u6807\u6ce8\u6570\u636e\u3002\u53c2\u8003\u76ee\u5f55 AnnotationMaterial"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"\uff081\uff09\u6a21\u677f\u6570\u636e\u96c6\u51c6\u5907","text":"1\u3001\u5728\u754c\u9762\u622a\u53d6\u9700\u8981\u6807\u6ce8\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u653e\u5728\u76ee\u5f55\u4e0b AnnotationMaterial/template/img 2\u3001\u7ef4\u62a4\u63a7\u4ef6\u540d\u4e0e\u5143\u7d20\u63a7\u4ef6\u7684\u952e\u5bf9\uff0c\u4e00\u4e2a\u63a7\u4ef6\u540d\u53ef\u5bf9\u5e94\u591a\u4e2a\u5143\u7d20\u63a7\u4ef6 menu:\n- menu.jpg\n- menu1.jpg\n- menu2.jpg\n- menu3.jpg\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"\uff082\uff09\u7d20\u6750\u96c6\u51c6\u5907","text":"\u5f55\u5236\u89c6\u9891\u6216\u6216\u5c4f\u5e55\u622a\u56fe\u653e\u7f6e\u76ee\u5f55 AnnotationMaterial/source"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u5f00\u59cb\u6807\u6ce8","text":"python3 AnnotationMaterial/main.py\n \u751f\u6210\u7684\u6807\u6ce8\u6570\u636e\u5b58\u653e\u5728 AnnotationMaterial/result"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#mmdetection","title":"\u56db\u3001MMDetection","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1-mmdetection","title":"1\u3001 MMDetection \u4ee3\u7801","text":"MMDetection \u662f\u4e00\u4e2a\u6709\u540d\u7684\u6df1\u5ea6\u5b66\u4e60\u76ee\u6807\u68c0\u6d4b\u5f00\u6e90\u9879\u76ee\uff0c\u4e5f\u662f openMMlab \u7684\u62db\u724c\u9879\u76ee\uff0c\u4e3a\u4ec0\u4e48\u9009\u62e9\u5b83\uff0c\u5c0f\u5b69\u513f\u6ca1\u5a18\u8bf4\u6765\u8bdd\u957f\uff0c\u611f\u5174\u8da3\u53ef\u4ee5\u81ea\u884c\u6df1\u5165\u4e86\u89e3\uff1b \u4f60\u53ef\u4ee5\u76f4\u63a5\u5728 GitHub \u4e0a\u514b\u9686\u4ee3\u7801\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u54b1\u4eec\u4ed3\u5e93\u4e0b Train \u76ee\u5f55\u4e2d\u4ee3\u7801\uff0cTrain \u4e2d\u7684\u4ee3\u7801\u4e5f\u662f\u4ece GitHub \u4e0a\u62c9\u53d6\u7684\uff0c\u4e0d\u8fc7\u6211\u4eec\u6839\u636e\u9879\u76ee\u9700\u8981\u505a\u4e86\u4e00\u4e9b\u4e8c\u6b21\u5f00\u53d1\uff0c\u63a8\u8350\u76f4\u63a5\u4f7f\u7528\u5b83\u3002 \u5982\u679c\u4f60\u60f3\u4ece GitHub \u4e0a\u62c9\uff1a git clone https://github.com/open-mmlab/mmdetection.git\n# \u4e0d\u80fd\u76f4\u63a5\u62c9\u53d6\u4e3b\u5206\u652f\uff0c\u5efa\u8bae\u4f7f\u75282.12\u7248\u672c\uff0c\u4e0d\u540c\u7684\u7248\u672c\u5bf9\u5e94\u7684mmcv\u7248\u672c\u662f\u4e0d\u540c\u7684\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-voc2coco","title":"2\u3001\u62c9\u53d6 voc2coco \u4ee3\u7801","text":"git clone https://github.com/Tony607/voc2coco.git\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-coco","title":"3\u3001\u8f6c\u6362 coco \u6570\u636e\u96c6","text":"\u5c06\u6240\u6709\u7684\u56fe\u7247\u548cxml\u6587\u4ef6\u653e\u5165train2017\uff0c\u4ece\u4e2d\u6311\u9009\u51e0\u7ec4\u653e\u5165val2017\uff08\u6d4b\u8bd5\u96c6\uff09 cd mmdetection/data/coco\npython voc2coco.py train2017 annotations/instances_train2017.json\npython voc2coco.py val2017 annotations/instances_val2017.json\n \u751f\u6210json\u6587\u4ef6"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4_1","title":"4\u3001\u4fee\u6539\u914d\u7f6e","text":"\uff081\uff09\u8bfb\u53d6\u6a21\u578b\u540d\u79f0 import json\nmodule_name = []\nwith open('./instances_train2017.json', \"r+\") as f:\njson_file = f.read()\njson_dict = json.loads(json_file)\nmodule_list = json_dict.get('categories')\nfor module_info in module_list:\nname = module_info.get('name')\nmodule_name.append(name)\nprint(module_name)\nprint(\"module_num:\", len(module_name))\n # \u6ce8\u610f\u5bf9\u6bd4instances_train2017.json\u91cc\u9762\u6a21\u578b\u540d\u79f0\u7684\u987a\u5e8f\uff0c\u4e0eCLASSES\u548ccoco_classes\u91cc\u9762\u7684\u987a\u5e8f\u4fdd\u6301\u4e00\u81f4\u3002\n \uff082\uff09\u4fee\u6539 faster_rcnn_r101_2x_coco.py mmdetection/xianjin/faster_rcnn_r101_2x_coco.py \u4fee\u653946\u884c\uff0cnum_clasess\u7684\u503c\uff0c\u65b0\u589e1\u4e2a\uff0c\u5c31 +1\uff1b \uff083\uff09\u4fee\u6539 coco.py mmdetection/mmdet/datasets/coco.py CLASSES = ()\uff0c\u5728\u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b \uff084\uff09\u4fee\u6539 class_names.py mmdetection/mmdet/core/evaluation/class_names.py coco_classes \u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#5","title":"5\u3001\u7f13\u5b58\u6e05\u7406","text":"\u5220\u9664 mmdetection/build \u76ee\u5f55 python setup.py install\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#6","title":"6\u3001\u8bad\u7ec3\u6a21\u578b","text":"\uff081\uff09\u6307\u5b9a\u81ea\u5df1\u914d\u7f6e\u7684\u8bad\u7ec3\u6a21\u578b\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py --gpus 1\n \uff082\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u6d4b\u8bd5\u96c6\u7ed3\u679c\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py xianjin/epoch_24.pth --show\n \uff083\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u51c6\u786e\u5ea6\uff1b python tools/analysis_tools/analyze_logs.py plot_curve xianjin/20210530_011907.log.json --keys acc\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#7","title":"7\u3001\u5feb\u6377\u64cd\u4f5c","text":"python3 run.py\n \u5c06\u4ee5\u4e0a 4 - 7 \u6b65\u64cd\u4f5c\u6574\u5408\u6210 run.py\uff0c\u4e00\u952e\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u4e94\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\uff1b \u670d\u52a1\u7aef\u4e00\u53f0\uff08\u76ee\u524d\u4ec5\u652f\u6301AMD\u67b6\u6784\uff09\uff1b \u91c7\u96c6\u76d2\u4e00\u4e2a \uff08ACASIS hdmi\u89c6\u9891\u91c7\u96c6\u5361\uff0chttps://item.jd.com/10024310742602.html \uff09\uff1b USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\uff1b USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff1b \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5USB\u5ef6\u957f\u7ebf\uff1b \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u63a8\u8350\u914d\u7f6e","text":"\u6267\u884c\u7528\u4f8b\u7684\u670d\u52a1\u7aef\u5bf9\u914d\u7f6e\u6ca1\u6709\u7279\u6b8a\u8981\u6c42\uff0c\u5982\u679c\u6761\u4ef6\u5141\u8bb8\u914d\u7f6e\u8d8a\u9ad8\uff0c\u8bc6\u522b\u901f\u5ea6\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n \u6d4b\u8bd5\u673a\u4e0a\u4e0d\u6267\u884c\u4efb\u4f55\u811a\u672c\uff0c\u5177\u4f53\u914d\u7f6e\u6839\u636e\u6d4b\u8bd5\u9700\u8981\u51b3\u5b9a\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#usb_mk","title":"\u516d\u3001USB_MK\u4e32\u53e3\u9a71\u52a8\u65b9\u6cd5","text":"\u4f4d\u4e8econtrol_method\u76ee\u5f55\u4e0b\u7684usb_mk.py\u6587\u4ef6 \uff081\uff09\u5217\u51fa\u53ef\u901a\u4fe1\u7684\u7aef\u53e3 python3 -m serial.tools.list_ports -v\n \uff082\uff09\u4fee\u6539\u4e32\u53e3\u7684\u6743\u9650 sudo chmod 777 /dev/ttyACM0\n \uff083\uff09\u5b9e\u4f8b\u5316USB_MK import UsbMk\nusb_mk = UsbMk(\"/dev/ttyACM0\", 9600) # \u8bbe\u5907\u9ed8\u8ba49600\u4e3a\u6ce2\u7279\u7387\uff0c\u63a7\u5236\u4f20\u8f93\u901f\u7387\n \uff084\uff09USB\u4e32\u53e3\u8bbe\u5907\u9ed8\u8ba4\u6ce2\u7279\u7387\u4e3a9600\uff08\u7ecf\u6d4b\u8bd5\u6ce2\u7279\u73879600\u51c6\u786e\u6027\u6700\u597d\uff09\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up() # \u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u6c49\u5b57\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e\n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff083\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff084\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff085\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() # \u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2\n \uff086\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff087\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff088\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e03\u3001\u65b9\u6cd5\u8c03\u7528\u5165\u53c2\u89c4\u5219","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_7","title":"1\u3001\u57fa\u7c7b","text":"class Base:\ndef __init__(self):\nself._obj = image\nself._usb = usb_mk\ndef find_element_by_ai(self, element):\nreturn self._obj.find_element(element)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_6","title":"2\u3001\u5165\u53c2\u8bf4\u660e","text":"\u56fe\u50cf\u8bc6\u522b\u65b9\u6cd5\u5165\u53e3\u4e3a Base \u7c7b\u4e0b\u7684 find_element_by_ai \u3002\u4ec5\u63a5\u53d7\u4e00\u4e2a\u53c2\u6570 element\uff0c\u7c7b\u578b\u4e3a string\u3002 \u53ef\u8bc6\u522b\u7684 string \u683c\u5f0f\uff1a \uff081\uff09\u5927\u56fe\u6807\uff08 \u56fe\u6807\u5927\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\uff0c\u4f8b\uff1a Base().find_element_by_ai(\"window\")\n \uff082\uff09\u5927\u56fe\u6807 / \u5c0f\u56fe\u6807\uff08\u56fe\u6807\u5c0f\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5c0f\u56fe\u6807\uff0c\u4f8b\uff1awindow/search_btn Base().find_element_by_ai(\"window/search_btn\")\n \uff083\uff09\u5927\u56fe\u6807 / OCR\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\u5185\u7684\u6587\u5b57\uff0c\u4f8b\uff1amenu/\u5c5e\u6027 Base().find_element_by_ai(\"menu/\u5c5e\u6027\")\n \uff084\uff09OCR\uff1a\u5168\u5c4f\u8bc6\u522b\u6587\u5b57 Base().find_element_by_ai(\"\u641c\u7d22\")\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516b\u3001\u9690\u85cf\u9f20\u6807","text":"\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u8fc7\u6765\u7684\u89c6\u9891\u6d41\uff0c\u5728\u8bc6\u522b\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u53d7\u5230\u9f20\u6807\u5f71\u54cd\uff0c\u56e0\u6b64\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u9690\u85cf\u9f20\u6807\u3002 \u5c4f\u853d\u9f20\u6807\u5149\u6807\u663e\u793a ```shell script /etc/lightdm/lightdm.conf \u5728`[Seat:*]`\u4e0b\u9762\u6dfb\u52a0\u53c2\u6570\n```shell script\nxserver-command=X -bs -core -nocursor\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e5d\u3001\u667a\u80fd\u81ea\u52a8\u5316\u7684\u610f\u4e49","text":"1\u3001\u6539\u5584 Acessibility \u5b9a\u4f4d\u7684\u7a33\u5b9a\u6027\u95ee\u9898 Acessibility \u5c5e\u6027\u5b9a\u4f4d\u5b58\u5728\u5076\u5c14\u5931\u6548\u7684\u60c5\u51b5 \uff081\uff09\u5f00\u53d1\u5728\u505a\u65b0\u9700\u6c42\u5f00\u53d1\u65f6\u53ef\u80fd\u6d89\u53ca\u5230\u5bf9\u5c5e\u6027\u6807\u7b7e\u7684\u4fee\u6539\u6216\u8005\u5c42\u7ea7\u7684\u8c03\u6574\uff0c\u53ef\u80fd\u9020\u6210\u81ea\u52a8\u5316\u7528\u4f8b\u65e0\u6cd5\u5b9a\u4f4d\u5230\u5143\u7d20\u3002 \u6bd4\u59821040\u9636\u6bb5\uff0c\u97f3\u4e50\u91cd\u6784\u7684\u65f6\u5019\uff0c\u5f00\u53d1\u5bf9\u90e8\u5206\u5c5e\u6027\u548c\u5c42\u7ea7\u505a\u4e86\u4fee\u6539\uff0c\u5bfc\u81f4\u81ea\u52a8\u5316\u7528\u4f8b\u5b9a\u4f4d\u65b9\u6cd580%\u9700\u8981\u4fee\u6539\u3002 \u5f00\u53d1\u65b0\u529f\u80fd\u7684\u65f6\u5019\u5076\u5c14\u4e5f\u4f1a\u5bf9\u5c5e\u6027\u505a\u8c03\u6574\uff0c\u9047\u52305\u6b21\u3002 \uff082\uff09\u76ee\u524d\u4e3b\u8981\u4f7f\u7528Dogtail\u8bc6\u522b\u5e94\u7528Acessibility\u5c5e\u6027\u8fdb\u884c\u5b9a\u4f4d\uff0c\u662f\u83b7\u53d6\u5e94\u7528\u5f53\u524d\u754c\u9762\u7684\u5c5e\u6027tree\uff0c\u5728\u5e94\u7528\u8df3\u8f6c\u540e\uff0cDogtail\u5b58\u5728\u65e0\u6cd5\u53ca\u65f6\u83b7\u53d6\u5f53\u524d\u5c5e\u6027\u5217\u8868\u7684\u60c5\u51b5\u3002 \u591a\u5a92\u4f53\u8c03\u7528\u6587\u7ba1\u7a97\u53e3\u7684\u65f6\u5019\uff0c\u51fa\u73b0\u627e\u4e0d\u5230\u6587\u7ba1\u91cc\u9762\u5143\u7d20\u7684\u60c5\u51b5\uff0c\u76ee\u524d\u51fa\u73b010+\u6b21\u3002 \u5e94\u7528\u8bbe\u7f6e\u9875\u9762\u7684\u5c5e\u6027\u5076\u5c14\u5b58\u5728\u627e\u4e0d\u5230\u7684\u60c5\u51b5\uff0c\u9047\u52305\u6b21\u3002 \uff083\uff09Dogtail\u5de5\u5177\u672c\u8eab\u5b58\u5728\u95ee\u9898\uff0c\u6709\u65f6\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u5019\u5f88\u6162\uff0c\u8ba9\u4eba\u65e0\u6cd5\u63a5\u53d7\uff0c\u76ee\u524d\u51fa\u73b0\u8fc7\u5f88\u591a\u6b21\u3002 \u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u95f4\u6bd4\u5e73\u5e38\u61623\u500d\uff0c\u51fa\u73b04\u6b21\u3002 2\u3001\u89e3\u51b3\u4e86\u4f7f\u7528\u7edd\u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898 \u90e8\u5206\u63a7\u4ef6\u65e0\u6cd5\u6dfb\u52a0 Acessibility \u5c5e\u6027\u4ece\u800c\u4f7f\u7528\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u51fa\u73b0\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898\u3002 \uff081\uff09\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u65b9\u6cd5\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u76ee\u6807\u56fe\u7247\u8d44\u6e90\uff0c\u5728 UI \u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u4f1a\u6d89\u53ca\u5230\u76ee\u6807\u8d44\u6e90\u7684\u66ff\u6362\uff0c\u6bd4\u8f83\u8017\u8d39\u4eba\u529b\u3002 \uff082\uff09\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6cd5\u5bf9\u6bd4\u7cbe\u5ea6\u6bd4\u8f83\u641e\uff0c\u5982\u679cUI \u7684\u53d8\u66f4\u4f1a\u9020\u6210\u65e0\u6cd5\u51c6\u786e\u5b9a\u4f4d\u5230\uff0c\u81ea\u52a8\u5316\u811a\u672c\u5065\u58ee\u6027\u4e0d\u8db3\u3002 3\u3001\u4f7f\u7528\u673a\u5668\u5206\u79bb\uff0c\u89e3\u51b3\u4e86\u81ea\u52a8\u5316\u811a\u672c\u5bf9\u5e94\u7528\u7684\u5f71\u54cd\uff0c\u771f\u5b9e\u8fd8\u539f\u7528\u6237\u7684\u4f7f\u7528\u573a\u666f \u673a\u5668\u5206\u79bb\u7684\u67b6\u6784\u8bbe\u8ba1\uff0c\u4fdd\u8bc1\u4e86\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u73af\u5883\u5b8c\u5168\u7b49\u540c\u4e8e\u7528\u6237\uff0c\u6392\u9664\u6d4b\u8bd5\u811a\u672c\u7684\u5f71\u54cd\u3002 \uff081\uff09\u76ee\u524d\u7684\u529f\u80fd\u81ea\u52a8\u5316\u662f\u5728\u6d4b\u8bd5\u673a\u4e0a\u76f4\u63a5\u8fd0\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\uff0c\u52a0\u4e0a\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u6211\u4eec\u6dfb\u52a0\u4e86\u4e00\u4e9b\u8fdb\u7a0b\u76d1\u63a7\u3001\u89c6\u9891\u5f55\u5236\u7b49\u529f\u80fd\uff0c\u81ea\u52a8\u5316\u811a\u672c\u672c\u8eab\u4f1a\u6d88\u8017\u4e00\u4e9b\u7cfb\u7edf\u8d44\u6e90\uff0c\u65e0\u6cd5\u8fd8\u539f\u771f\u662f\u7684\u7528\u6237\u4f7f\u7528\u573a\u666f\u3002 \uff082\uff09\u6027\u80fd\u6d4b\u8bd5\u9700\u8981\u6392\u9664\u5176\u4ed6\u7a0b\u5e8f\u7684\u8d44\u6e90\u6d88\u8017\u5f71\u54cd\uff0c\u6027\u80fd\u81ea\u52a8\u5316\u91c7\u7528\u673a\u5668\u5206\u79bb\uff0c\u4fdd\u8bc1\u4e86\u6027\u80fd\u6570\u636e\u7684\u51c6\u786e\u6027\u3002 \u4ee5\u524d\u7684\u7528\u4f8b\u6267\u884c\u8017\u65f6\u6ca1\u6761\u572830\u79d2\u5de6\u53f3\uff0c\u73b0\u5728\u7528\u4f8b\u8017\u65f6\u572810\u79d2\u3002 4\u3001\u89e3\u51b3\u4e86UI \u8c03\u6574\u5bfc\u81f4\u5b9a\u4f4d\u5931\u8d25\u7684\u4e0d\u7a33\u5b9a\u6027\u95ee\u9898 \uff081\uff09\u89e3\u51b3\u4e86\u56e0 UI \u8c03\u6574\u5bfc\u81f4\u63a7\u4ef6\u4f4d\u7f6e\u53d8\u5316\u6216\u8272\u5dee\u53d8\u5316\u540e\u5b9a\u4f4d\u4e0d\u51c6\u786e\u7684\u95ee\u9898\uff0c\u53ea\u8981\u63a7\u4ef6\u6587\u6848\u548c\u63a7\u4ef6\u5916\u8fb9\u6846\u65e0\u53d8\u5316\u5747\u53ef\u51c6\u786e\u5b9a\u4f4d\uff1b \uff082\uff09\u76ee\u524d\u4e5f\u4f1a\u91c7\u7528\u57fa\u4e8eUI\u7684\u5b9a\u4f4d\u65b9\u6848\uff0c\u5982\u679cUI\u4f4d\u7f6e\u6709\u8c03\u6574\uff0c\u4f1a\u5bfc\u81f4\u5143\u7d20\u65e0\u6cd5\u5b9a\u4f4d\u3002 5\u3001\u7b80\u5316\u4e86\u7528\u4f8b\u7ed3\u6784\uff0c\u63d0\u5347\u7f16\u5199\u53cb\u597d\u5ea6 \uff081\uff09\u667a\u80fd\u81ea\u52a8\u5316\u8bc6\u522b\u5143\u7d20\u7684\u65b9\u6cd5\u53ea\u6709\u4e00\u4e2a\uff0c\u5c31\u662f\u57fa\u4e8e\u6211\u4eec\u8bad\u7ec3\u7684\u6a21\u578b\u8bc6\u522b\u89c6\u9891\u6d41\u4e2d\u7684\u5143\u7d20\uff0c\u7ecf\u8fc7\u811a\u672c\u5c01\u88c5\u4e4b\u540e\uff0c\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u4e2d\u6240\u6709\u5b9a\u4f4d\u7684\u64cd\u4f5c\u90fd\u53ea\u9700\u8981\u8c03\u7528\u8fd9\u4e00\u4e2a\u65b9\u6cd5\u5c31\u884c\u4e86\uff0c\u7f16\u5199\u81ea\u52a8\u5316\u811a\u672c\u7684\u96be\u5ea6\u5927\u5927\u964d\u4f4e\u3002 \uff082\uff09\u4e5f\u662f\u7531\u4e8e\u8c03\u7528\u65b9\u6cd5\u7b80\u5355\uff0c\u5728 UI \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u4e2d\u7684\u5206\u5c42\u7ed3\u6784\u5c06\u4f1a\u51cf\u5c11\uff0c\u591a\u7ee7\u627f\u7684\u60c5\u51b5\u4f1a\u51cf\u5c11\uff0c\u81ea\u52a8\u5316\u4ee3\u7801\u7684\u8c03\u7528\u7ed3\u6784\u4e5f\u4f1a\u53d8\u5f97\u7b80\u5355\uff0c\u800c\u4e14\u529f\u80fd\u6d4b\u8bd5\u540c\u5b66\u7f16\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u66f4\u52a0\u5bb9\u6613\u4e0a\u624b\u3002 \u4ee5\u524d\u5199\u7528\u4f8b\u7531\u4e8e\u9700\u8981\u7ed3\u5408\u4e0d\u540c\u7684\u6a21\u5757\uff0c\u8c03\u7528\u4e0d\u540c\u7684\u65b9\u6cd5\uff0c\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u5e76\u5b8c\u6210\u8c03\u8bd5\u7684\u65f6\u95f4\u5e73\u5747\u572820-30\u5206\u949f\uff0c\u73b0\u5728\u5199\u7528\u4f8b\u811a\u672c\u80fd\u57285\u5206\u949f\u5de6\u53f3\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":"# =============================================\n# Attribution : Application Test Department III\n# Time : 2023/1/3\n# Author : ut003281\n# =============================================\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u7b80\u8ff0","text":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5 \u901a\u8fc7\u81ea\u52a8\u5316\u624b\u6bb5\u5bf9\u5e94\u7528\u8fdb\u884c\u6027\u80fd\u6d4b\u8bd5\uff0c\u63d0\u4f9b\u65b9\u4fbf\u7684\u73af\u5883\u90e8\u7f72\u3001\u8fd0\u884c\u914d\u7f6e\u3001\u7528\u4f8b\u7f16\u5199\u7b49\uff0c\u7528\u4e8e\u684c\u9762\u5e94\u7528\u7684\u51b7\u70ed\u542f\u52a8\u3001\u8d44\u6e90\u62f7\u8d1d\u3001\u9875\u9762\u8df3\u8f6c\u7b49\u6027\u80fd\u573a\u666f\u6d4b\u8bd5\u3002 \u4ed3\u5e93\u5730\u5740\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-perf-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u4ee3\u7801\u7ed3\u6784","text":"autotest-perf-aitest\n\u251c\u2500\u2500 apps # \u5b58\u653e\u6240\u6709\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u811a\u672c\n\u251c\u2500\u2500 conftest.py # pytest hook\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 CURRENT # \u7248\u672c\u5185\u5bb9\n\u251c\u2500\u2500 docs # \u6587\u6863\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u952e\u503c\u5bf9\u7167\u8868.pdf # \u4e32\u53e3\u7ebfcode\u4e0e\u6309\u952e\u7684\u5bf9\u7167\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u6027\u80fd\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\u6267\u884c\u5668\u4f7f\u7528\u6307\u5357.md # \u6267\u884c\u5668\u811a\u672c\u4f7f\u7528\u6307\u5357\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 USB\u4e32\u53e3\u8f6cUSB\u952e\u76d8\u9f20\u6807\u7ebf\u534f\u8bae\u6587\u4ef6V1.0.pdf # \u4e32\u53e3\u534f\u8bae\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput-0.28.2.zip # Linux\u4e0b\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\u7684\u6e90\u7801\uff0c\u53ef\u6839\u636e\u67b6\u6784\u6253\u5305\n\u251c\u2500\u2500 manage.py # \u529f\u80fd\u4e3b\u5165\u53e3\n\u251c\u2500\u2500 pytest.ini # pytst \u914d\u7f6e\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 setting # \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 client.ini # \u6d4b\u8bd5\u673a IP \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5168\u5c40\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dev_env.sh # \u5bbf\u4e3b\u673a\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose_no_relay.yml # \u65e0\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose.yml # \u6709\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker_login.sh # docker \u767b\u9646\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 res\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 black.png # \u5168\u9ed1\u56fe\u7247\uff0c\u7528\u4e8e\u4fee\u6539\u58c1\u7eb8\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_5000.deb # 3A5000 \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_amd64.deb # amd \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_arm64.deb # arm \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_mips64.deb # mips \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_sw_64.deb # sw \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 server.ini # \u670d\u52a1\u5668\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 setup.sh # \u5bb9\u5668\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 template # \u521b\u5efa app \u57fa\u7840\u811a\u672c\u6a21\u677f\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 app_template\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ${app_name}_widget.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 control-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 images\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 test_${app_name}_01_scene.json-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 test_${app_name}_01_scene.py-tpl\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 uos_docker # \u5bb9\u5668\u73af\u5883\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dockerfile\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 requirements.txt\n\u2514\u2500\u2500 src\n \u251c\u2500\u2500 analysis_save.py # \u89e3\u6790\u56fe\u7247\u6d41\u7ed3\u679c\uff0c\u6c47\u603b\u751f\u6210 excel \u62a5\u544a\n\u251c\u2500\u2500 base_widget.py # \u5c01\u88c5\u7684\u57fa\u7840\u64cd\u4f5c\uff0c\u5e94\u7528\u8c03\u7528\u7684\u4e3b\u5165\u53e3\u65b9\u6cd5\n\u251c\u2500\u2500 cmdctl.py # \u8c03\u7528\u547d\u4ee4\u884c\u4f7f\u7528\n\u251c\u2500\u2500 global_value.py # \u5168\u5c40\u53d8\u91cf\n\u251c\u2500\u2500 image_utils.py # \u56fe\u7247\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 __init__.py\n \u251c\u2500\u2500 logger_utils.py # \u65e5\u5fd7\u914d\u7f6e\n\u251c\u2500\u2500 pdocr.py # ocr \u914d\u7f6e\n\u251c\u2500\u2500 public_method.py # \u4e00\u4e9b\u65b9\u4fbf\u7684\u5c01\u4f4f\n\u251c\u2500\u2500 record.py # \u5f55\u5c4f\u76f8\u5173\n\u251c\u2500\u2500 rtk # \u8fd0\u884c\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 _base.py # \u4e00\u4e9b\u679a\u4e3e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 install_env.py # \u5b89\u88c5\u73af\u5883\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 local_runner.py # \u8fd0\u884c\u7528\u4f8b\n\u251c\u2500\u2500 serial_communication # \u4e32\u53e3\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 power_control.py # \u7ee7\u7535\u5668\u64cd\u4f5c\uff0c\u4f7f\u7528\u7ee7\u7535\u5668\u8fde\u63a5\u4e3b\u673a\u7535\u6e90\uff0c\u63a7\u5236\u5f00\u5173\u673a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 serial_common.py # \u4e32\u53e3\u516c\u5171\u65b9\u6cd5\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 usb_mk.py # \u952e\u9f20\u64cd\u4f5c\u57fa\u7840\u5c01\u88c5\n\u251c\u2500\u2500 shortcut_key.py # \u5feb\u6377\u952e\u7684\u5c01\u88c5\n\u251c\u2500\u2500 singleton.py # \u5355\u4f8b\u6a21\u5f0f\n\u251c\u2500\u2500 start_app.py # \u521b\u5efa app\n\u2514\u2500\u2500 write_xlsx.py # \u751f\u6210 excel\n# __init__.py \u6587\u4ef6\u4e3a\u6807\u8bc6\u8be5\u76ee\u5f55\u662f\u4e00\u4e2aPython\u7684\u6a21\u5757\u5305\uff0c\u9879\u76ee\u4e2d\u7684__init__.py\u5747\u4e3a\u7a7a\u6587\u4ef6\u3002\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u73af\u5883\u642d\u5efa","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\u3002 \u670d\u52a1\u7aef\u4e00\u53f0\u3002\uff08\u4ec5\u652f\u6301 AMD \u67b6\u6784\uff0c\u82e5\u9700\u5176\u4ed6\u67b6\u6784\uff0c\u54a8\u8be2\u76f8\u5173\u5f00\u53d1\u4eba\u5458\uff09 \u91c7\u96c6\u76d2\u4e00\u4e2a\u3002 \uff08ACASIS HDMI \u89c6\u9891\u91c7\u96c6\u76d2\uff0chttps://item.jd.com/100013302599.html#crumb-wrap \uff09 USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\u3002\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"\uff082\uff09\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\u3002 USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff08USB3.0 \u63a5\u53e3\u4e0a\uff09\u3002 \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5 USB \u5ef6\u957f\u7ebf\u3002 \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u670d\u52a1\u7aef\u63a8\u8350\u914d\u7f6e","text":"\u914d\u7f6e\u8d8a\u9ad8\uff0c\u89e3\u6790\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"2\u3001\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa","text":" \u6253\u5f00\u63a7\u5236\u4e2d\u5fc3\uff0c\u8d26\u6237\u8bbe\u7f6e\u4e3a\u3010\u81ea\u52a8\u767b\u5f55\u3011\u548c\u3010\u65e0\u5bc6\u7801\u767b\u5f55\u3011\uff0c\u7535\u6e90\u7ba1\u7406\u4e2d\u4f7f\u7528\u7535\u6e90\u5168\u90e8\u8bbe\u7f6e\u4e3a\u3010\u4ece\u4e0d\u3011\uff0c\u5f00\u542f\u5f00\u53d1\u8005\u6a21\u5f0f\u3002 \u6839\u636e\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u8981\u6c42\uff0c\u5bfc\u5165\u76f8\u5173\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\uff1a\u5bfc\u5165\u76f8\u518c\u3001\u5f71\u9662\u3001\u97f3\u4e50\u7684\u6d4b\u8bd5\u8d44\u6e90\u3002 \u5728\u670d\u52a1\u7aef\u6253\u5f00\u76f8\u673a\u5e94\u7528\u540e\uff0c\u5c06\u6d4b\u8bd5\u673a\u684c\u9762\u58c1\u7eb8\u66f4\u6362\u4e3a\u7eaf\u8272\u58c1\u7eb8\uff08\u6ce8\u610f\uff0c\u670d\u52a1\u7aef\u9700\u63d0\u524d\u5f00\u542f\u76f8\u673a\u540e\u518d\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u58c1\u7eb8\uff0c\u5efa\u8bae\u7eaf\u9ed1\u58c1\u7eb8 setting/res/black.png\uff09 \u5728\u6587\u4ef6\u7ba1\u7406\u5668\u4e2d\uff0c\u5c06\u9009\u9879 \u4e3b\u83dc\u5355-\u8bbe\u7f6e-\u9884\u89c8-\u56fe\u7247\u9884\u89c8 \u53d6\u6d88\u52fe\u9009\uff08\u5982\u4e0d\u53d6\u6d88\uff0c\u4f1a\u5f71\u54cd\u622a\u56fe\u5f55\u5c4f\u5e94\u7528\u7684\u6027\u80fd\u6570\u636e\uff09 \u79fb\u52a8\u6216\u5220\u9664\u7cfb\u7edf Logo \uff0c\u6392\u9664\u684c\u9762\u53f3\u4e0b\u89d2 Logo \u7684\u5f71\u54cd\uff08\u91cd\u542f\u751f\u6548\uff09\u3002 sudo mv /usr/share/deepin/uos_logo.svg ~/Pictures/\n \u5b89\u88c5\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\uff08\u5fc5\u987b\u5b89\u88c5\uff01\uff01\uff09 AMD \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_amd64.deb ARM \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_arm64.deb MIPS \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_mips64.deb 3A5000 \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_5000.deb \u5b89\u88c5\u547d\u4ee4 sudo dkpg -i xserver-xorg-input-libinput_0.28.2-2_amd64.deb\n \u5b89\u88c5\u65f6\u4f1a\u63d0\u793a\u5df2\u5b58\u5728\u76f8\u540c\u7248\u672c\uff0c\u8bf7\u5ffd\u7565\uff0c\u76f4\u63a5\u8986\u76d6\u5b89\u88c5\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u4e3b\u673a\u624d\u751f\u6548"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u670d\u52a1\u7aef\u4e00\u952e\u73af\u5883\u90e8\u7f72","text":"\u73af\u5883\u642d\u5efa\u524d\u5fc5\u987b\u5148\u8fde\u63a5\u4e0a USB \u4e32\u53e3\u7ebf\u548c\u91c7\u96c6\u76d2\u3002 \u5bbf\u4e3b\u673a\u73af\u5883\u5b89\u88c5 python3 manage.py install --env host\n \u5bb9\u5668\u73af\u5883\u5b89\u88c5 python3 manage.py install --env docker\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u56db\u3001\u914d\u7f6e\u9879","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u670d\u52a1\u7aef\u914d\u7f6e","text":"setting/config/server.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u914d\u7f6e\u9879\uff0c\u5305\u542b\u4e86\u6240\u6709\u670d\u52a1\u7aef\u6240\u6709\u7684\u53ef\u914d\u7f6e\u9879\u3002 \u672c\u5730\u65e0\u7f51\u7edc\u8fd0\u884c \u5c06\u914d\u7f6e\u9879 network=0 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u672c\u5730\u6709\u7f51\u7edc\u8fd0\u884c \u914d\u7f6e\u9879 network=1 (1)\u914d\u7f6e\u9879 client_alias= \u914d\u7f6e\u4e3a\u4f60\u8981\u6d4b\u8bd5\u7684\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5982 Alias1 \u6d4b\u8bd5\u673a\u522b\u540d\u5728 setting/config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 (2)\u914d\u7f6e\u9879 client_alias= \u4e3a\u7a7a\uff0c\u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager --client_alias Alias1\uff0c\u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002(Alias1 \u4e3a\u4f60\u914d\u7f6e\u7684\u6d4b\u8bd5\u673a\u522b\u540d) (1)\u548c(2)\u53ea\u8981\u4f7f\u7528\u5176\u4e00\u5373\u53ef\u3002 \u6709\u7f51\u7edc\u8fd0\u884c\uff0c\u4e14\u9700\u8981\u901a\u8fc7 Jenkins \u4e0a\u8fd0\u884c\u4e00\u4e2a job \uff0c\u540c\u65f6\u63a7\u5236\u591a\u53f0\u673a\u5668\u3002 \u914d\u7f6e\u9879 network=1 \u914d\u7f6e\u9879 client_alias= \u4e0d\u7528\u914d\u7f6e\uff0c\u5728\u8fd0\u884c run.sh \u7684\u65f6\u5019\u76f4\u63a5\u7a7a\u683c\u52a0\u522b\u540d\u5373\u53ef\uff0c\u6bd4\u5982\uff1a\u6d4b\u8bd5\u673a\u522b\u540d\u4e3a Alias1 \uff0c\u4e14\u5df2\u7ecf\u5728 config/client.ini \u4e2d\u914d\u7f6e\u4e86 Alias1 \u7684user ip password \uff0c\u5219\u8fd0\u884c bash run.sh Alias1 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u5728 Jenkins pipeline \u91cc\u9762\u901a\u8fc7\u5e76\u884c stage \u6216\u5e76\u884c\u8c03\u7528\u4e0b\u5c42\u4efb\u52a1\u7684\u65b9\u5f0f\u53ef\u4ee5\u5b9e\u73b0\u5927\u89c4\u6a21\u7684\u6027\u80fd\u6d4b\u8bd5\u9700\u6c42\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;1\u3001KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2\u3001KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f, e.g. TAGS = L1 or smoke\n[case_conf]\n# \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\uff0cocr\u6587\u6848\u8bc6\u522b\u8f83\u6162\uff0c\u4e0d\u63a8\u8350\u4f7f\u7528\nfind_by = stage\n# \u6700\u540e\u4e00\u4e2a\u7a33\u5b9a\u9636\u6bb5\u7684\u5e27\u6570\u8bc6\u522b\n# \u9996\u5e27\u5b58\u5728\u540e\u7684\u7b2c\u4e00\u4e2a\u5927\u4e8e\u8be5\u914d\u7f6e\u5e27\u6570\u7684\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u5c3e\u5e27\nfinal_stable_num=100\n# \u4ece\u8be5\u5e27\u6570\u5f00\u59cb\u8bc6\u522b\u6587\u6848\u6216\u56fe\u7247\uff0c\u51cf\u5c11\u5206\u6790\u65f6\u95f4\nstart_num = 150\n# \u8bc6\u522b\u7684\u6587\u6848\ntext=\n# \u8bc6\u522b\u56fe\u7247\nmatch=apps/xxx/images/match.png\n# \u8bc6\u522b\u76f8\u4f3c\u5ea6\nmatch_rate=0.9\n# \u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6bd4\u5982\u70ed\u542f\u52a8\u7528\u4f8b\uff0c\u4ece\u70b9\u51fb\u6253\u5f00\u5230\u505c\u6b62\u5f55\u5c4f\uff0c\u4e2d\u95f4\u7b49\u5f855\u79d2\uff1b\nduration = 15\n# \u5355\u6761\u7528\u4f8b\u6267\u884c\u7684\u6b21\u6570\ncount = 5\n# \u7a33\u5b9a\u9636\u6bb5\u5212\u5206\u7684\u76f8\u4f3c\u5ea6\nstable_similarity = 0.9997\n[server]\n# \u8c03\u8bd5\u6a21\u5f0f=1\uff0c\u4e3a\u5f00\u542f\u8c03\u8bd5\u6a21\u5f0f\uff0c0\u4e3a\u5173\u95ed\u3002\n# \u8c03\u8bd5\u6a21\u5f0f\u4e0b\u9ed8\u8ba4\u53ea\u6267\u884c\u4e00\u6b21\u7528\u4f8b\uff0c\u4e0d\u5173\u673a\n# \u7f16\u5199\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u5efa\u8bae\u5f00\u542fmaintain\u3002\nMAINTAIN = 0\n# \u8fd0\u884c\u7684\u73af\u5883docker\u5bb9\u5668\u73af\u5883\uff0chost\u5bbf\u4e3b\u673a\u73af\u5883\nENV = docker\n# \u670d\u52a1\u7aef\u5bc6\u7801\nPASSWORD=1\n# \u6307\u5b9a\u6d4b\u8bd5\u673a\u522b\u540d\n# \u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6bd4\u5982\uff1a\n# [AMD]\n# ip=10.8.15.86\n# user=uos\n# \u5176\u4e2d AMD \u4e3a\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5219client_alias=AMD\nCLIENT_ALIAS = x86\uff08Intel-i7\uff09\n# 1 \u5f00\u542f\u7f51\u7edc, 0 \u5173\u95ed\u7f51\u7edc\n# \uff081\uff09\u670d\u52a1\u7aef\u4e0e\u6d4b\u8bd5\u673a\u987b\u5728\u540c\u4e00\u7f51\u6bb5\u4e0b\uff0c\u4f60\u53ef\u4ee5\u5c1d\u8bd5\u5728\u670d\u52a1\u7aef\u901a\u8fc7ssh\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c\u5982\u679c\u53ef\u4ee5\u8fde\u63a5\uff0c\u8bf4\u660e\u7f51\u7edc\u6b63\u5e38\u3002\n# \uff082\uff09\u5f53input_type=FILE_NAME \u65f6\uff0c\u5fc5\u987b\u5f00\u542f\u7f51\u7edc\u3002\nNETWORK = 1\n# \u6027\u80fd\u7ed3\u679c\u7edf\u8ba1\u5355\u4f4d \u6beb\u79d2\u2014ms, \u79d2\u2014s\nUNIT=ms\n# \u6d4b\u8bd5\u673a\u5f00\u673a\u8fdb\u5165\u684c\u9762\u540e\u7b49\u5f85\u65f6\u95f4,\u5355\u4f4d/\u79d2\nSTARTUP_DELAY = 60\n# 1\u4e3a\u5220\u9664\u7f13\u5b58\uff0c0\u4e3a\u4e0d\u5220\u9664\u7f13\u5b58\n# \u7528\u4f8b\u6267\u884c\u5b8c\u540e\u4f1a\u5728report\u76ee\u5f55\u4e0b\u751f\u6210\u667a\u80fd\u89e3\u6790\u7684\u4e00\u4e9b\u7f13\u5b58\u56fe\u7247\u3002\nCACHE = 0\n# \u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u62a5\u544a\u4f1a\u4fdd\u5b58\u5728\u9879\u76ee\u4e0breport\u76ee\u5f55\u4e2d\uff1b\n# \u6307\u5b9a\u62a5\u544a\u76ee\u5f55\u5219\u5b58\u653e\u5230\u6307\u5b9a\u76ee\u5f55\u3002\nREPORT_PATH = report\n# \u670d\u52a1\u7aef\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684icon\u8d44\u6e90\u4f1a\u7f13\u5b58\u5728\u9879\u76ee\u4e0binput\u76ee\u5f55\u4e2d\nINPUT = input/\n# 1\u4e3a\u6d4b\u8bd5\u5b8c\u5173\u673a\uff0c0\u4e3a\u6d4b\u8bd5\u5b8c\u4e0d\u5173\u673a\nSHUTDOWN = 0\n# \u89e3\u6790\u8fdb\u7a0b\u6570\uff08\u4e0d\u63a8\u8350\u4fee\u6539\uff09\n# 3\u4e2a\u8fdb\u7a0b\u89e3\u6790\u89c6\u9891\u5df2\u7ecf\u80fd\u591f\u6ee1\u8db3\uff0c\u5373\u4f7f\u589e\u52a0\u8fdb\u7a0b\u6570\u4e5f\u4e0d\u80fd\u51cf\u5c11\u6574\u4f53\u8017\u65f6\n# \u53e6\u5916\u8fd8\u8981\u770bCPU\u6838\u6570\u662f\u5426\u652f\u6301\u3002\nPARSING_PROCESS = 3\n# 1\u4e3a\u4f7f\u7528\u7ee7\u7535\u5668\u5f00\u5173\u673a\uff0c0\u4e3a\u4f7f\u7528reboot\u547d\u4ee4\u91cd\u542f\u3002\u4f9d\u8d56\u7ee7\u7535\u5668\u786c\u4ef6\u8bbe\u5907\uff0c\u9700\u8981\u4f7f\u7528\u8054\u7cfb\u5f00\u53d1\u8005\nRELAY = 0\n# \u83b7\u53d6\u6d4b\u8bd5\u5e94\u7528\u7684\u7248\u672c, %s \u5360\u4f4d\u5e94\u7528\u540d\n# \u5982\u679c\u8be5\u914d\u7f6e\u4e3a\u7a7a\uff0c\u5219\u4e0d\u83b7\u53d6\u5e94\u7528\u7684\u7248\u672c\u4fe1\u606f\u3002\nCOMMAND = apt policy %s 2>/dev/null|grep \"\u5df2\u5b89\u88c5\"|awk -F \"\uff1a\" \"{print \\$2}\"\n# \u5173\u673a\u7b49\u5f85\u5f00\u542f\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6839\u636e\u6d4b\u8bd5\u673a\u6027\u80fd\u4e0d\u540c\uff0c\u5f00\u5173\u673a\u8017\u65f6\u53ef\u80fd\u4e0d\u540c\uff0c\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u673a\u60c5\u51b5\u914d\u7f6e\u3002\nSHUTDOWN_DELAY = 30\n# \u53ef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u56fe\u7247\u683c\u5f0f\uff0c\u4ee5\u82f1\u6587\u9017\u53f7\u9694\u5f00\u3002\n# \u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u76ee\u524d\u6211\u4eec\u4ec5\u9a8c\u8bc1\u4e86jpg,jpeg,png\u8fd9\u4e09\u79cd\u5e38\u7528\u7684\u56fe\u7247\u683c\u5f0f\u3002\nINPUT_TYPES = jpg,jpeg,png\n# \u6027\u80fd\u5206\u6790\u8865\u5e27\uff0c\u7b49\u4e8e\u6216\u4f4e\u4e8e\u8be5\u503c\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u9700\u8981\u51cf\u6389\u3002\nUN_STAB_START = 3\n# \u670d\u52a1\u7aef\u83b7\u53d6\u6d4b\u8bd5\u673a\u56fe\u50cf\u7684\u5e27\u7387\uff0c\u5373\u6bcf\u79d2\u83b7\u53d6\u591a\u5c11\u5f20\u6d4b\u8bd5\u673a\u4e0a\u7684\u56fe\u50cf\u3002\n# \u9ed8\u8ba4\u5e27\u7387\u4e3a30\u5e27/\u79d2\uff0c\u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u53ef\u80fd\u4f1a\u5bf9\u89e3\u6790\u7ed3\u679c\u9020\u6210\u504f\u5dee\u3002\nFPS = 30\n# \u4ee5\u4e0b\u573a\u666f\u7c7b\u578b\u4f1a\u91cd\u542f\u6d4b\u8bd5\u673a,\u591a\u79cd\u573a\u666f\u4f7f\u7528\u9017\u53f7\u9694\u5f00\nSCENE = cold\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = http://10.8.13.78:8890\n#\u5c4f\u5e55\u56fe\u7247\u4e34\u65f6\u5b58\u653e\u4f4d\u7f6e\nSCREEN_CACHE = /tmp/screen\n# =======================================\n[log]\n# \u65e5\u5fd7\u7ea7\u522b\uff0cOFF\u3001FATAL\u3001ERROR\u3001WARN\u3001INFO\u3001DEBUG\u3001ALL\n# \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u65e5\u5fd7\u8f93\u51fa\uff0clog_cli=INFO\u8868\u793a \u4ec5\u8f93\u51faINFO\u53ca\u4ee5\u4e0a\u7ea7\u522b\u7684\u65e5\u5fd7\u3002\nLOG_LEVEL = DEBUG\n# \u65e5\u5fd7\u6587\u4ef6\u4fdd\u5b58\u8def\u5f84\nLOG_PATH= logs\n# =======================================\n[dockerhub]\n# \u5bb9\u5668\u767b\u9646\u8d26\u53f7\nDOCKER_USER = user\n# \u5bb9\u5668\u767b\u9646\u5bc6\u7801\nDOCKER_PASSWORD = User1234\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u6d4b\u8bd5\u673a\u914d\u7f6e","text":"setting/config/client.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u4fe1\u606f\u3002 \u6709\u7f51\u7edc\u7684\u60c5\u51b5\u4e0b\uff0c\u670d\u52a1\u7aef\u9700\u8981\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u56e0\u6b64\u4f60\u9700\u8981\u5199\u5165 \u6d4b\u8bd5\u673a\u522b\u540d \u3001 user \u3001ip\u3001 password \u3002 # \u6d4b\u8bd5\u673a\u522b\u540d\n[Alias1] # \u6d4b\u8bd5\u673aip\nip=10.8.15.86 # \u6d4b\u8bd5\u673a\u7528\u6237\u540d\nuser=uos\n \u547d\u540d\u5efa\u8bae\uff1aAliasA1\u3001AliasA2\u3001AliasB1\u3001AliasB2\uff0c\u4e0d\u8981\u91cd\u540d\u3002 \u65e0\u7f51\u7edc\u60c5\u51b5\u4e0b\uff0c\u4ec5\u9700\u8981\u5173\u6ce8\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\u9879 width=\u3001 height= \u5373\u53ef\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a [client]\n# \u9ed8\u8ba4\u6d4b\u8bd5\u673a\u7528\u6237\u540d\uff0c\u5bc6\u7801\uff0cip\nip=\nuser=\n# \u6d4b\u8bd5\u673a\u5bc6\u7801\npassword=1\n# \u6d4b\u8bd5\u673a\u4e3b\u9898\ntheme=bloom\n# \u6d4b\u8bd5\u673aicon\u76ee\u5f55\npath=/usr/share/icons\n# \u7cfb\u7edfdesktop\u6587\u4ef6\u7684\u5b58\u653e\u76ee\u5f55\uff0cUOS\u7cfb\u7edf\u9ed8\u8ba4\u4e3a/usr/share/applications\ndesktop_path=/usr/share/applications\n# \u7528\u4e8e\u5224\u65ad\u6d4b\u8bd5\u673a\u662f\u5426\u5f00\u673a\u8fdb\u5165\u684c\u9762\u7684\u8bc6\u522b\u6807\u8bc6\u3002\n# 1\u3001\u901a\u8fc7\u684c\u9762\u56fe\u6807\u8bc6\u522b\u3002\n# - type=FILE_NAME\u65f6\uff0c\u670d\u52a1\u5668\u548c\u6d4b\u8bd5\u673a\u5fc5\u987b\u5728\u540c\u4e00\u5c40\u57df\u7f51\u5185\u3002\n# - power_on=dde-computer\u8868\u793a\u901a\u8fc7\u684c\u9762\u8ba1\u7b97\u673a\u56fe\u6807\u5224\u65ad\u5f00\u673a\u8fdb\u5165\u684c\u9762\u3002\n# 2\u3001\u901a\u8fc7\u672c\u5730\u56fe\u7247\u4f5c\u4e3a\u5f00\u673a\u8bc6\u522b\u3002\n# - type= \u4f20\u5165\u4e3a\u56fe\u7247\u683c\u5f0f\uff0ctype\u652f\u6301\u7684\u7c7b\u578b\u5305\u542b\u5728server.ini\u5185\u914d\u7f6e\u9879input_type=jpg,jpeg,png\u3002\n# - power_on= \u4f20\u5165\u7684\u662f\u672c\u5730\u56fe\u7247\u7684\u8def\u5f84\u3002\ntype=FILE_NAME\npower_on=dde-computer\n# \u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\uff08\u6d4b\u8bd5\u673a\u8fde\u63a5\u91c7\u96c6\u76d2\uff0c\u91c7\u96c6\u76d2\u7684\u5206\u8fa8\u7387\uff09\nheight=1080\nwidth=1920\n[AliasA1] ip=10.8.15.86\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n[AliasA2]\nip=10.8.15.20\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_2","title":"3\u3001\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e","text":"\u968f\u7740\u6d4b\u8bd5\u573a\u666f\u7684\u4e0d\u65ad\u5f15\u5165\uff0c\u53d1\u73b0\u73b0\u6709\u670d\u52a1\u7aef\u91cc\u7684\u914d\u7f6e\u9879\u5e76\u4e0d\u9002\u7528\u4e8e\u6240\u6709\u7684\u6027\u80fd\u573a\u666f\uff0c\u4e8e\u662f\u5c06\u670d\u52a1\u7aef\u914d\u7f6e\u8fdb\u884c\u4e00\u4e2a\u63d0\u53d6\uff0c\u53ef\u505a\u5355\u4e2a\u573a\u666f\u7684\u4e2a\u6027\u5316\u914d\u7f6e\uff0c\u5f53\u7136\u539f\u6765\u7684\u670d\u52a1\u7aef\u914d\u7f6e\u529f\u80fd\u4fdd\u7559\uff0c\u53ea\u662f\u5f53\u4f60\u914d\u7f6e\u4e86\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e\u540e\uff0c\u4f18\u5148\u4f7f\u7528\u4e2a\u6027\u5316\u914d\u7f6e\u91cc\u9762\u7684\u5185\u5bb9\uff0c\u4ee5\u4e0b\u662f\u5bf9\u4e2a\u6027\u5316\u914d\u7f6e\u7684\u4ecb\u7ecd\u3002 \u76ee\u524d\u6bcf\u4e00\u4e2a py \u6587\u4ef6\u5bf9\u5e94\u4e00\u4e2a\u6027\u80fd\u6d4b\u8bd5\u573a\u666f\uff0c\u4e8e\u662f\u5728\u540c\u7ea7\u76ee\u5f55\u4e0b\u521b\u5efa\u4e00\u4e2a\u4e0e\u4e4b\u540c\u540d\u7684 json \u6587\u4ef6\uff0c\u4f5c\u4e3a\u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6 apps\n\u251c\u2500\u2500 album\n \u251c\u2500\u2500 test_album_01_start.json # \u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6\n\u2514\u2500\u2500 test_album_01_start.py # \u6027\u80fd\u573a\u666f\u6587\u4ef6\n \u4ee5\u4e0b\u662f\u5bf9 json \u6587\u4ef6\u4e2d\u914d\u7f6e\u7684\u89e3\u91ca\uff0c\u82e5\u67d0\u9879\u914d\u7f6e\u4e0d\u9700\u8981\uff0c\u53ef\u4ee5\u7f3a\u5931\uff0c\u4f46\u4e0d\u80fd\u4e3a\u7a7a\uff1b {\n\"title\": \"test_album_start\", # \u6807\u9898\uff1b\u5fc5\u987b\n\"app_name\": \"deepin-album\", # \u573a\u666f\u6240\u5c5e\u7684\u5e94\u7528\uff1b\u5fc5\u987b\n\"scene\": \"hot\", # \u573a\u666f\u522b\u540d\uff1b\u5fc5\u987b\n\"icon\": [\"deepin-album\"], # \u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684icon\u5230\u670d\u52a1\u7aef\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\uff1b\u53ef\u7f3a\u5931\n# \u6ce8\u610f\uff1a\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684desktop\u6587\u4ef6\u540d\u4e3adeepin-album.desktop\uff0c\n# \u53ea\u9700\u8981\u5199deepin-album\u5373\u53ef\uff0c\u201c.desktop\u201d\u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002\n\"size\": { # \u56fe\u7247\u5bf9\u6bd4\u7684\u533a\u57df\u8bbe\u7f6e\u9879\uff0c\u67d0\u4e9b\u5e94\u7528\u5f53\u524d\u5c4f\u5e55\u7684\u90e8\u5206\u533a\u57df\u9700\u8981\u5c06\u5176\u53bb\u6389\uff0c\u53ef\u4ee5\u8bbe\u7f6e\u6b64\u9879\uff0c\u5982\u679c\u6ca1\u6709\u5219\u53ef\u4e0d\u5199\uff1b\u53ef\u786e\u5b9e\n\"x-coordinate\": 0, # \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n\"y-coordinate\": 0, # \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n\"width\": 850, # \u6a2a\u5411\u957f\u5ea6\n\"height\": 1920 # \u7eb5\u5411\u9ad8\u5ea6\n},\n\"count\": 5, # \u573a\u666f\u6267\u884c\u7684\u6b21\u6570\uff1b\u5fc5\u987b\n\"duration\": 5, # \u8be5\u6761\u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff0c\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7279\u5b9a\u573a\u666f\uff0c\u8be5\u914d\u7f6e\u4e3a\u53ef\u9009\u9879\uff0c\u8986\u76d6 server.ini \u4e2d\u7684\u914d\u7f6e\uff1b\u53ef\u7f3a\u5931\n\"stable_similarity\": 0.9997, # \u6027\u80fd\u573a\u666f\u5206\u9636\u6bb5\u65f6\u7684\u56fe\u7247\u76f8\u4f3c\u5ea6\u5bf9\u6bd4\uff0c\u524d\u540e\u56fe\u7247\u4f4e\u4e8e\u8be5\u503c\uff0c\u5219\u5206\u4e3a\u4e0d\u7a33\u5b9a\u9636\u6bb5\uff1b\u53ef\u7f3a\u5931\n\"find_by\": \"stage\", # \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\n\"final_stable_num\": 100, # \u67e5\u627e\u6700\u540e\u4e00\u4e2a\u5927\u4e8e\u8be5\u503c\u7684\u7a33\u5b9a\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u7684\u5c3e\u796f\uff1b\u53ef\u7f3a\u5931\n\"start_num\": 150,\n\"text\": \"\", # ocr\u8bc6\u522b\u7684\u6587\u6848\n\"match\": \"apps/xxx/images/match.png\", # \u56fe\u50cf\u5339\u914d\u7684\u56fe\u7247\u6587\u4ef6\u8def\u5f84\n\"match_rate\": 0.9 # \u5339\u914d\u76f8\u4f3c\u5ea6\n}\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e94\u3001\u6d4b\u8bd5\u6d41\u7a0b","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516d\u3001\u7528\u4f8b\u7f16\u5199\u53ca\u65b9\u6cd5\u53c2\u6570\u6307\u5f15","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"1\u3001\u7528\u4f8b\u5b9e\u4f8b\u8bf4\u660e","text":"# \u6807\u51c6\u5e93\u5bfc\u5165\nfrom time import sleep\n# \u5bfc\u5165\u4e09\u65b9\u5e93pytest\nimport pytest\n# \u5bfc\u5165\u7528\u4f8b\u6267\u884c\u8981\u7528\u5230\u7684Widget\u7c7b\nfrom src.base_widget import BaseWidget\nclass TestStart:\n# class\u7ea7\u522b\u7684fixture\uff0c\u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u6267\u884c\u3002autouse=True \u81ea\u52a8\u5728\u5f53\u524d\u4f5c\u7528\u57df\u4e0b\u4f7f\u7528\u3002\n@pytest.fixture(scope=\"class\", autouse=True)\n# \u6d4b\u8bd5\u70ed\u542f\u52a8\u4e4b\u524d\u9700\u8981\u9884\u542f\u52a8\u3002\ndef application_pre_start(self):\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().right_click_element(\"deepin-album\")\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().click_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\")\nsleep(2)\n# \u5feb\u6377\u952e\u5173\u95ed\u7a97\u53e3\nBaseWidget().hot_key(\"alt\", \"f4\")\nsleep(2)\n# \u9ed8\u8ba4\u4e3afunction\u7ea7\u522b\u7684fixture\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\uff0cclass\u7ea7\u522bfixture\u6267\u884c\u4e4b\u540e\u6267\u884c\u3002\n@pytest.fixture(autouse=True)\ndef setup_start(self):\n# \u53f3\u952e\u70b9\u51fb deepin-album \u56fe\u6807\nBaseWidget().right_click_element(\"deepin-album\")\n# \u79fb\u52a8\u5230\u53f3\u952e\u83dc\u5355\u4e2d\u6253\u5f00\uff08open.png\uff09\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().move_to(*BaseWidget().find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))\n# \u7b49\u5f85\u79fb\u52a8\u5b8c\u6210\nsleep(0.5)\ndef test_album_start(self):\n# \u70b9\u51fb\u201c\u6253\u5f00\u201d\nBaseWidget().click() \n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"2\u3001\u65b9\u6cd5\u53c2\u6570\u8bf4\u660e","text":"2.1\u3001find_element \u65b9\u6cd5 def find_element(element: str, input_type: str = \"FILE_NAME\", fill_color_position: tuple = (-1, -1), size: tuple = (25, 70)):\npass\n \u53c2\u6570 element \u548c input_type \uff081\uff09\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u5143\u7d20 - `input_type` \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a `FIEL_NAME` \uff0c\u8868\u793a\u901a\u8fc7\u5e94\u7528 `icon` \u5bfb\u627e\u5143\u7d20\uff0c\u6b64\u65b9\u6cd5\u4f1a\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u5e94\u7528 `icon` \u56fe\u6807\u3002\n \u4e3e\u4f8b\uff1a\u9ed8\u8ba4\u60c5\u51b5\u4e0b input_type \u53c2\u6570\u4e0d\u9700\u8981\u4f20\u5165\uff0c find_element(\"deepin-album\")\uff0c\u8868\u793a\u901a\u8fc7 deepin-album \u7684\u5e94\u7528 icon \u6765\u83b7\u53d6\u5750\u6807\uff0c\u6ce8\u610f\uff0c\u6b64\u65f6\u4f20\u5165\u7684 deepin-album \u53c2\u6570\u5b9e\u9645\u662f desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u548c2.3\u4e2d\u7684 icon \u53d8\u91cf\u4e00\u81f4\u3002 \u6211\u4eec\u5efa\u8bae\u4f18\u5148\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\uff0c\u4f46\u6b64\u65b9\u6cd5\u4f9d\u8d56\u7f51\u7edc\uff0c\u8bf7\u6839\u636e\u6d4b\u8bd5\u73af\u5883\u5b9e\u9645\u60c5\u51b5\u9009\u62e9\u3002 \uff082\uff09\u901a\u8fc7\u672c\u5730\u56fe\u7247\u8bc6\u522b\u5143\u7d20 - \u53c2\u6570 `input_type` \u4f20\u5165\u56fe\u7247\u683c\u5f0f\uff0c\u6bd4\u5982\u622a\u53d6\u7684\u672c\u5730\u56fe\u7247\u683c\u5f0f\u4e3a `png`\uff0c\u90a3\u4e48 `input_type=\"png\"`\uff0c\u6b64\u65f6\u53c2\u6570 `element ` \u4f20\u5165\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5efa\u8bae\u5b58\u653e\u5728\u5bf9\u5e94\u7684\u4ea7\u54c1 `apps/app/picture/` \u76ee\u5f55\u4e0b\uff0c\u8def\u5f84\u4e3a\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u7684\u76f8\u5bf9\u8def\u5f84\u3002\n- \u4e3e\u4f8b\uff1a`find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))`\uff0c\u8868\u793a\u901a\u8fc7\u672c\u5730\u56fe\u7247 `open.png` \u8bc6\u522b\u5143\u7d20\u3002\n \u53c2\u6570 fill_color_position fill_color_position \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (-1, -1)\uff0c(-1, -1) \u8868\u793a\u53d6\u5c4f\u5e55\u4e2d\u53f3\u4e0b\u89d2\u6700\u540e\u4e00\u4e2a\u50cf\u7d20\u70b9\u4f5c\u4e3a\u586b\u5145\u5750\u6807\uff0c\u5728 1920x1080 \u5c4f\u5e55\u5206\u8fa8\u7387\u4e0b\u5373\u5b9e\u9645\u5750\u6807\u4e3a (1919, 1079) \uff0c\u8fd9\u6837\u7684\u5199\u6cd5\u53ef\u4ee5\u9002\u914d\u4e0d\u540c\u5927\u5c0f\u7684\u5c4f\u5e55\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0d\u540c\u65b9\u4f4d\uff1a \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0b\u65b9\uff0c\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u4e0d\u9700\u8981\u4f20\u5165\u8be5\u53c2\u6570\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u5de6\u8fb9\uff0cfill_color_position=(1, 1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u53f3\u8fb9\uff0cfill_color_position=(-1, -1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0a\u8fb9\uff0cfill_color_position=(1, 1) \u4ece\u684c\u9762\u542f\u52a8\u5e94\u7528\uff0c\u5219\u9700\u8981\u4f20\u5165\u9664\u4efb\u52a1\u680f\u4ee5\u5916\u5176\u4ed6\u4f4d\u7f6e\u7684\u5750\u6807\uff0c\u6bd4\u5982(100, 100)\uff0c\u53ea\u8981\u8fd9\u4e2a\u5750\u6807\u4e3a\u9664\u5e94\u7528\u548c\u4efb\u52a1\u680f\u533a\u57df\u90fd\u53ef\u4ee5\u3002 \u4ece\u542f\u52a8\u5668\u91cc\u9762\u542f\u52a8\u5e94\u7528\uff0c\u9700\u8981\u586b\u5145\u7684\u5750\u6807\u4e3a\u542f\u52a8\u5668\u533a\u57df\u3002 \u6ce8\uff1a\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u65f6\uff0c\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684 icon \u539f\u6587\u4ef6\u4e3a svg \u77e2\u91cf\u56fe\uff0c\u8f6c\u6362\u4e3a png \u4e4b\u540e\u9700\u8981\u586b\u5145\u8fb9\u7f18\u900f\u660e\u90e8\u5206\u3002 \u53c2\u6570 size size \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (25, 70)\uff0c\u8868\u793a\u6d4b\u8bd5\u673a\u4e0a dock \u680f\u4e0a\u5e94\u7528\u56fe\u6807\u7684\u5927\u5c0f\u8303\u56f4\u3002 UOS \u7cfb\u7edf dock \u680f\u662f\u53ef\u4ee5\u4e0a\u4e0b\u62d6\u52a8\u5927\u5c0f\u7684\uff0c\u968f\u7740 dock \u680f\u5927\u5c0f\u6539\u53d8\uff0c\u5e94\u7528\u56fe\u6807\u7684\u8303\u56f4\u4e3a25\u523070\u4e4b\u95f4\u3002 \u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u64cd\u4f5c\u7cfb\u7edf\u4e0a dock \u680f\u5927\u5c0f\u4e0d\u4e00\u6837\uff0c\u53ef\u4ee5\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u4f20\u5165\u5927\u5c0f\u8303\u56f4\u3002 2.2\u3001click_element\u3001 right_click_element\uff0c double_click_element \u8fd9\u51e0\u4e2a\u65b9\u6cd5\u53c2\u6570\u89c4\u5219\u4e0e find_element \u65b9\u6cd5\u4e00\u6837\u3002\u4ed6\u4eec\u5b9e\u9645\u4e0a\u662f\u5728 find_element \u65b9\u6cd5\u57fa\u7840\u4e4b\u4e0a\u505a\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u589e\u52a0\u4e86\u9f20\u6807\u7684\u52a8\u4f5c\uff0c\u5982\u679c\u4f60\u4e0d\u60f3\u4f7f\u7528\u8fd9\u51e0\u4e2a\u65b9\u6cd5\uff0c\u5728\u7528\u4f8b\u4e2d\u4e5f\u53ef\u4ee5\u901a\u8fc7 find_element \u83b7\u53d6\u5230\u5750\u6807\uff0c\u7136\u540e\u5c06\u5750\u6807\u4f20\u5165\u5230\u952e\u9f20\u7684\u65b9\u6cd5\u4e2d\uff0c\u53ef\u4ee5\u5b9e\u73b0\u540c\u6837\u7684\u6548\u679c\u3002 2.3\u3001\u7528\u4f8b\u7c7b\u4e2d\u6709\u4e2a\u7c7b\u53d8\u91cf icon = [\"deepin-album\"] \u9700\u8981\u7279\u6b8a\u8bf4\u660e\uff0c\u5217\u8868\u4e2d\u7684\u5143\u7d20\u4e3a\u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709 icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684 icon \u5230\u670d\u52a1\u7aef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528 desktop \u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684 desktop \u6587\u4ef6\u540d\u4e3a deepin-album.desktop\uff0c\u53ea\u9700\u8981\u5199 deepin-album \u5373\u53ef\uff0c.desktop \u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e03\u3001\u6267\u884c\u5165\u53e3","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"1\u3001\u7528\u4f8b\u7ec4\u7ec7","text":"\u5728 setting/config/server.ini \u6587\u4ef6\u4e2d APP_NAME= \u5b57\u6bb5\u4e3a\u7528\u4f8b\u7684\u6267\u884c\u7684\u76ee\u5f55\uff0c\u9ed8\u8ba4\u4e3a apps \u76ee\u5f55\u4e0b\u6240\u6709\u7528\u4f8b\u3002\u5982\u679c\u4f60\u60f3\u6307\u5b9a\u6267\u884c\u67d0\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4f60\u53ef\u4ee5\u5c06\u8be5\u914d\u7f6e\u9879\u6307\u5b9a\u5230\u5e94\u7528\u7684\u7528\u4f8b\u76ee\u5f55\uff0c\u6bd4\u5982\uff1aAPP_NAME=deepin_album\uff0c \u8868\u793a\u6267\u884c\u76f8\u518c\u76ee\u5f55\u4e0b\u7684\u7528\u4f8b\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a python3 manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music\n -k KEYWORDS, --keywords KEYWORDS\n \u7528\u4f8b\u7684\u5173\u952e\u8bcd\n -t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e\n --log_level LOG_LEVEL \u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n --env {host,docker} \u5728\u5bbf\u4e3b\u673a\u6216\u5bb9\u5668\u73af\u5883\u6267\u884c\n --client_alias \u9009\u62e9\u6d4b\u8bd5\u673a\u522b\u540d, \u53ef\u9009\u9879\u4e3aclient.ini\u4e2d\u5df2\u914d\u7f6e, \u9ed8\u8ba4\u503c\u4e3a zx-x86.\n --count \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a python3 manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\" --env docker\n \u6ce8\uff1a\u5728\u5bb9\u5668\u4e2d\u6267\u884c\u65f6\uff0c\u82e5\u5f3a\u5236\u9000\u51fa\uff0c\u5bb9\u5668\u5e76\u4e0d\u4f1a\u505c\u6b62\u8fd0\u884c\uff01"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_9","title":"\u516b\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1json","title":"1\u3001Json \u62a5\u544a","text":"\u81ea\u7814\u89c6\u9891\u89e3\u6790\u5de5\u5177\u4f1a\u5bf9\u5355\u6761\u7528\u4f8b\u6267\u884c\u4e00\u8f6e\u751f\u6210\u4e00\u4e2a json \u6587\u4ef6\uff0c\u5b58\u653e\u4e8e report/{app_name}/{scene}/{run_num} \u76ee\u5f55\u4e0b\uff0c\u547d\u540d\u683c\u5f0f\u4e3a\uff1a report.json json \u5185\u5bb9\u4e3e\u4f8b\uff1a [\n{\n\"Stab1\": {\n\"images\": [1,2...150,151],\n\"startStub\": 0,\n\"type\": \"Stab\"\n}\n},\n{\n\"Stab2\": {\n\"images\": [152,153...169,170],\n\"startStub\": 1,\n\"type\": \"UnStab\"\n}\n},\n{\n\"Stab3\": {\n\"images\": [171,172...300,301],\n\"startStub\": 0,\n\"type\": \"UnStab\"\n}\n}\n]\n \u8bf4\u660e\uff1a Stab \uff1a\u8868\u793a\u89e3\u6790\u8fc7\u7a0b\u4e2d\u4e0d\u540c\u7684\u9636\u6bb5\u3002 images \uff1a\u8868\u793a\u6bcf\u4e00\u5e27\u7684\u56fe\u7247\u5e8f\u53f7\u3002 startStub\uff1a \u4e3a\u8bc6\u522b\u5c3e\u5e27\u7684\u9636\u6bb5\u8868\u793a\uff0c\u5982\u679c \"startStub\": 1 \uff0c\u8bf4\u660e\u5c3e\u5e27\u51fa\u73b0\u5728\u8be5\u9636\u6bb5\u3002 type\uff1a \u4e3a Stab \u6216 UnStab \uff0c\u8868\u793a\u7a33\u5b9a\u9636\u6bb5\u6216\u4e0d\u7a33\u5b9a\u9636\u6bb5\u3002 \u5404\u9636\u6bb5\u6709\u5e27\u6570\u8865\u507f\uff0c\u9ed8\u8ba4\u8865\u507f\u7684\u5e27\u6570\u4e3a 3 \u5e27\uff08\u53ef\u4ee5\u901a\u8fc7 server.ini \u91cc\u9762 un_stab_start=3 \u8fdb\u884c\u914d\u7f6e\uff09\uff0c\u8868\u793a\u5c0f\u4e8e\u7b49\u4e8e 3 \u5e27\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u524d\u540e\u5747\u9700\u8981\u51cf\u6389\u3002 \u5e94\u7528\u542f\u52a8\u9636\u6bb5\u5c31\u662f\u5728 Stab2 \u9636\u6bb5\uff0c\u542f\u52a8\u65f6\u95f4\u4e3a\uff1a171 \u51cf 151 \u518d\u51cf\u6389\u524d\u540e\u8865\u507f\u5e27\u6570 6 \u5e27\uff0c\u5373 14 \u5e27\uff0c\u89c6\u9891\u5e27\u7387 30 \u5e27/\u79d2\uff0c\u56e0\u6b64\u542f\u52a8\u8017\u65f6\u4e3a\uff1a14 * 33 = 462 ms"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2excel","title":"2\u3001Excel \u62a5\u544a","text":"\u6240\u6709\u7528\u4f8b\u6267\u884c\u5e76\u89e3\u6790\u5b8c\u4e4b\u540e\u4f1a report \u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a\u6c47\u603b\u6570\u636e\u7684 Excel \u6587\u4ef6\uff0c\u6587\u4ef6\u540d\u4e3a\uff1a{time}_perf_time.xlsx\u3002 \u6ce8\u610f\uff0creport \u76ee\u5f55\u4e3a\u53ef\u914d\u7f6e\u9879\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u4f1a\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u751f\u6210\uff0c\u5982\u679c\u4f60\u5c06 report\uff0c\u6307\u5b9a\u5230\u9879\u76ee\u4e0b\u5176\u4ed6\u8def\u5f84\uff0c\u5219\u4f1a\u5728\u5bf9\u5e94\u7684\u8def\u5f84\u4e0b\u751f\u6210 json \u548c Excel \u6587\u4ef6\u3002 \u4f60\u4e5f\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8bfb\u53d6\u6240\u6709 json / excel \u62a5\u544a\u7684\u6570\u636e\uff0c\u751f\u6210\u4f60\u81ea\u5df1\u60f3\u8981\u7684\u4e00\u4e9b\u6d4b\u8bd5\u62a5\u544a\u5f62\u5f0f\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#usb","title":"\u4e5d\u3001USB \u4e32\u53e3\u9a71\u52a8\u952e\u9f20\u65b9\u6cd5","text":"\u4f4d\u4e8e src/utils/control/serial_communication \u76ee\u5f55\u4e0b\u7684 usb_mk.py \u6587\u4ef6 usb_mk = UsbMk()\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up()\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u652f\u6301\u4f20\u5165\u6c49\u5b57\uff0c\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click()\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() \n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() \n \uff084\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() \n \uff085\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() \n \uff086\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() \n \uff087\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff088\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff0810\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_10","title":"\u5341\u3001\u7ee7\u7535\u5668\u63a7\u5236\u4e3b\u673a\u5f00\u673a/\u91cd\u542f","text":"\uff08\u82e5\u4e0d\u4f7f\u7528\u7ee7\u7535\u5668\uff0c\u53ef\u5ffd\u7565\u8be5\u6b65\u9aa4\uff0c\u6267\u884c\u65f6\u4f1a\u901a\u8fc7\u547d\u4ee4 reboot\uff09"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u7ee7\u7535\u5668\u8bbe\u5907","text":"LCUS-2 \u578b \u53cc\u8def USB \u667a\u80fd\u4e32\u53e3\u63a7\u5236\u7ee7\u7535\u5668\u3002 https://item.taobao.com/item.htm?spm=a1z09.2.0.0.41d72e8dUYx2pi&id=582653718178&_u=i25r20ia6a2e "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2usb","title":"2\u3001USB \u5ef6\u957f\u7ebf","text":"\u666e\u901a\u7684 USB \u7ebf\u5373\u53ef\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_3","title":"3\u3001\u675c\u90a6\u7ebf","text":"3.1\u300140P \u6bcd\u5bf9\u516c\u675c\u90a6\u7ebf\u3002 3.2\u3001\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"4\u3001\u5b89\u88c5\u56fe\u6587\u6559\u7a0b","text":"4.1\u3001\u4f7f\u7528 USB \u5ef6\u957f\u7ebf\u8fde\u63a5\u63a7\u5236\u7aef\u548c\u7ee7\u7535\u5668\u3002 4.2\u3001\u5728\u7ee7\u7535\u5668\u5e38\u7aef\u548c\u516c\u5171\u7aef\u5747\u8fde\u63a5\u4e00\u6839\u675c\u90a6\u7ebf\u3002 4.3\u3001\u5728\u4e3b\u677f\u4e0a\u5f00\u673a\u9488\u548c\u91cd\u542f\u9488\u4e0a\u63d2\u4e0a\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 4.4\u3001\u5c06\u5f00\u673a\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76841\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1\u5de6\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 4.5\u3001\u5c06\u91cd\u542f\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76842\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1 \u53f3\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 \u82e5\u60f3\u4fdd\u7559\u539f\u7535\u6e90\u5f00\u5173\u7684\u7535\u6e90\u706f\uff0c\u53ef\u6839\u636e\u5982\u4e0a\u56fe\u6240\u793a\uff0c\u4f7f\u7528\u675c\u90a6\u7ebf\u8fde\u63a5\u4e3b\u677f\u4e0a\u7684\u7535\u6e90\u706f\u548c\u539f\u7535\u6e90\u5f00\u5173"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_11","title":"\u5341\u4e00\u3001\u5e38\u89c1\u95ee\u9898\u8bf4\u660e","text":"1\u3001ERROR: for uos Cannot restart container 2301b1a1395d7959ee6523d61b61c87084649af530786cdb8fb5b3ecbcbd1068: linux runtime spec devices: error gathering device information while adding custom device \"/dev/ttyACM0\": no such file or directory \u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u8fde\u63a5\u72b6\u6001\uff0c\u67e5\u770b /dev/ttyACM0 \u662f\u5426\u5b58\u5728\uff0c\u82e5\u5b58\u5728 /dev/ttyACMn\uff08n\u4e3a\u4efb\u610f\u6570\u5b57\uff09\uff0c\u91cd\u542f\u7535\u8111\u89e3\u51b3\u3002 2\u3001Error response from daemon: Container 5e700fdc769e8c74666d68a7f2bc3de58268b4594cf88706609d59f8dbc7362d is not running \u5bb9\u5668\u542f\u52a8\u5931\u8d25 1\uff09\u68c0\u67e5\u54ea\u4e00\u4e2a\u5bb9\u5668\u672a\u542f\u52a8 sudo docker container ls # \u5217\u51fa\u8fd0\u884c\u4e2d\u7684 Docker \u5bb9\u5668\n 2\uff09\u7f3a\u5c11 uos \u5bb9\u5668\uff0c\u68c0\u67e5 USB \u4e32\u53e3\u8fde\u63a5\u7ebf\u548c\u91c7\u96c6\u76d2\u8fde\u63a5\u7ebf\u662f\u5426\u6b63\u5e38\uff0c\u91cd\u542f\u540e\u6267\u884c bash install/setup.up # \u91cd\u65b0\u5b8c\u6574\u90e8\u7f72\u73af\u5883\n \u6216\u6267\u884c sudo docker-compose up -d --build # \u4ec5\u91cd\u65b0\u6784\u5efa Docker \u955c\u50cf\n 3\u3001\u82e5\u90e8\u7f72\u65f6\u63d0\u793a\u6302\u8f7d ttyACM0\u3001video0 \u5931\u8d25\uff0c\u8bf7\u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u53ca\u91c7\u96c6\u76d2\u662f\u5426\u63a5\u89e6\u826f\u597d\uff0c\u82e5\u63a5\u89e6\u826f\u597d\uff0c\u91cd\u542f\u5373\u53ef\u89e3\u51b3\u3002 4\u3001\u82e5\u51fa\u73b0\u56fe\u7247\u80fd\u8bc6\u522b\uff0c\u4f46\u662f\u9f20\u6807\u672a\u79fb\u52a8\u64cd\u4f5c\u65f6\uff0c\u5b89\u88c5\u7edd\u5bf9\u9f20\u6807\u64cd\u4f5c\u7684\u4f9d\u8d56\u5305\uff0c\u89c1\u7b2c\u4e09\u8282\u7b2c\u4e8c\u5c0f\u8282\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u6d4b\u8bd5\u673a\u3002 5\u3001\u7531\u4e8e\u901a\u8fc7\u91c7\u96c6\u5361\u83b7\u53d6\u7684\u6d4b\u8bd5\u673a\u5b9e\u65f6\u753b\u9762\uff0c\u5305\u542b\u4e86\u9f20\u6807\u7684\u6837\u5f0f\uff0c\u6240\u4ee5\u5bf9\u56fe\u7247\u8bc6\u522b\u65f6\uff0c\u9f20\u6807\u82e5\u505c\u7559\u5728\u56fe\u6807\u4e0a\u5c42\uff0c\u5219\u4f1a\u5bf9\u8bc6\u522b\u7ed3\u679c\u9020\u6210\u5f71\u54cd\uff0c\u9700\u8981\u5c06\u9f20\u6807\u79fb\u52a8\u81f3\u5176\u4ed6\u4f4d\u7f6e\uff0c\u6216\u8005\u9690\u85cf\u9f20\u6807\u89e3\u51b3\u3002 6\u3001Excel \u62a5\u544a\u4e2d\uff0c\u6d4b\u8bd5\u573a\u666f\u5217\u4e0e\u7528\u4f8b\u4e2d\u7684\u4e0d\u4e00\u81f4\uff0c\u5173\u952e\u5b57scene\u3001app_name\u3001\u67b6\u6784\u522b\u540d\uff0c\u4e0d\u80fd\u5305\u542b\u4e0b\u5212\u7ebf\u548c\u82f1\u6587\u7b26\u53f7\u7684\u5706\u62ec\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/","title":"\u6846\u67b6\u529f\u80fd\u4ecb\u7ecd","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2023/1/12\n# Author : Mikigo\n# =============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_2","title":"\u4e00\u3001\u4e00\u53e5\u8bdd\u7b80\u4ecb","text":"\u6b64\u6587\u6863\u4e3b\u8981\u60f3\u5bf9 YouQu \u6846\u67b6\u4e00\u4e9b\u91cd\u70b9\u7684\u529f\u80fd\u505a\u8be6\u7ec6\u7684\u4ecb\u7ecd\uff0c\u5305\u62ec\u5bf9\u4e00\u4e9b\u529f\u80fd\u5f00\u53d1\u7684\u80cc\u666f\u3001\u8981\u89e3\u51b3\u7684\u95ee\u9898\u3001\u5b9e\u73b0\u903b\u8f91\u3001\u4ee3\u7801\u7b49\u65b9\u9762\u7684\u4ecb\u7ecd\uff0c\u4ee5\u6b64\u8ba9\u5927\u5bb6\u80fd\u66f4\u52a0\u6e05\u6670\u7684\u7406\u89e3\u5404\u9879\u529f\u80fd\uff0c\u4ece\u800c\u5728\u4f7f\u7528\u7684\u65f6\u5019\u80fd\u66f4\u52a0\u7684\u5f97\u5fc3\u5e94\u624b\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_3","title":"\u4e8c\u3001\u56fe\u50cf\u8bc6\u522b","text":"\u56fe\u50cf\u8bc6\u522b\u5728 UI \u81ea\u52a8\u5316\u4e2d\u662f\u4e0d\u53ef\u7f3a\u5c11\u7684\uff0c\u5e02\u9762\u4e0a\u751a\u81f3\u6709\u5b8c\u5168\u57fa\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\uff0c\u6bd4\u5982 Airtest\u3001Sikuli \u7b49\uff0c\u5728\u6e38\u620f\u7b49\u7279\u5b9a\u9886\u57df\u4e5f\u6709\u4e0d\u9519\u7684\u6548\u679c\uff0c\u8fd9\u4e9b\u5de5\u5177\u5b9e\u9645\u4e0a\u4e5f\u662f\u7528\u7684 OpenCV \u8fdb\u884c\u4e86\u5c01\u88c5\uff0cYouQu \u6846\u67b6\u57fa\u4e8e OpenCV \u5f00\u53d1\u4e86\u81ea\u5df1\u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\uff0c\u5b83\u53ef\u4ee5\u65b9\u4fbf\u7684\u7528\u4e8e\u754c\u9762\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u65ad\u8a00\uff1b YouQu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u51e0\u4e4e\u6ee1\u8db3\u4e86\u4f60\u7684\u6240\u6709\u8981\u6c42\uff0c\u6211\u4eec\u5728\u957f\u65f6\u95f4\u7684\u601d\u8003\u548c\u6478\u7d22\u4e2d\uff0c\u9488\u5bf9\u5e38\u89c4\u573a\u666f\u53ca\u4e00\u4e9b\u7279\u6b8a\u573a\u666f\u63a2\u7d22\u9664\u4e86\u4e00\u4e9b\u5b9e\u7528\u4e14\u6709\u6548\u7684\u65b9\u6848\uff0c\u4e14\u542c\u6211\u6162\u6162\u9053\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1","title":"1\u3001\u5e38\u89c4\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5e38\u89c4\u8bc6\u522b\u5f88\u597d\u7406\u89e3\uff0c\u4e00\u53e5\u8bdd\u8bb2\u5c31\u662f\uff0c\u8981\u83b7\u53d6\u5230\u76ee\u6807\u5143\u7d20\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u3002 \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u5728\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u9700\u8981\u83b7\u53d6\u7684\u5750\u6807\u662f\u76f8\u5bf9\u4e8e\u6574\u4e2a\u5c4f\u5e55\u7684\u5750\u6807\uff0c\u6211\u4eec\u53ef\u4ee5\u622a\u53d6\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u56fe\u7247\uff08screen\uff09\uff1b \u5728\u5143\u7d20\u8bc6\u522b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u622a\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5c0f\u56fe\u8fdb\u884c\u8bc6\u522b\uff0c\u6bd4\u5982\u622a\u53d6\u64ad\u653e\u6309\u94ae\uff1a \u90a3\u4e48\u5b9e\u9645\u4e0a\uff0c\u5143\u7d20\u5b9a\u4f4d\u7684\u95ee\u9898\u5c31\u8f6c\u6362\u4e3a\uff0c\u5c06\u622a\u56fe\u7684\u5c0f\u56fe\uff08play_btn\uff09\u62ff\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u5927\u56fe\uff08screen\uff09\u4e2d\u53bb\u505a\u5339\u914d\uff0c\u5982\u679c\u5339\u914d\u6210\u529f\uff0c\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff08 x, y \uff09\u5373\u53ef\u3002 \u4e3a\u4e86\u65b9\u4fbf\u63cf\u8ff0\uff0c\u4ee5\u4e0b\u6211\u5c06\u6574\u4e2a\u5c4f\u5e55\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5927\u56fe\uff0c\u67d0\u4e2a\u5143\u7d20\u56fe\u7247\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5c0f\u56fe\u3002 \u57fa\u4e8e OpenCV \u7684\u6a21\u677f\u5339\u914d cv.matchTemplate() \u529f\u80fd\uff0c\u6211\u4eec\u5b9e\u73b0\u4e86\u56fe\u50cf\u5b9a\u4f4d\u7684\u529f\u80fd\uff0c\u6846\u67b6\u63d0\u4f9b\u4e86\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u5e95\u5c42\u63a5\u53e3\uff08\u4e00\u822c\u4e0d\u5bf9\u4e0a\u5c42\u63d0\u4f9b\u8c03\u7528\uff09\uff1a def _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\n# \u8be6\u7ec6\u4ee3\u7801\u592a\u957f\u4e0d\u8d34\u4e86\uff0c\u611f\u5174\u8da3\u8bf7\u67e5\u770b\u6e90\u7801\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001image_path image_path \u662f\u5c0f\u56fe\u7684\u7edd\u5bf9\u8def\u5f84; \u901a\u5e38\u5728 AT \u5de5\u7a0b\u91cc\u9762\uff0c\u6211\u4eec\u7ea6\u5b9a\u5c06\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u5b9e\u9645\u7684\u5143\u7d20\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1aplay_btn.png \uff1b \u7528\u4e8e\u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 case/assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1amusic_001.png \uff1b \u8fd9\u6837\u662f\u4e3a\u4e86\u65b9\u4fbf\u7ba1\u7406\u548c\u7ef4\u62a4\u3002 2\u3001rate \u56fe\u50cf\u8bc6\u522b\u7684\u7684\u5339\u914d\u5ea6\u6216\u8005\u8bf4\u76f8\u4f3c\u5ea6\uff0c\u6846\u67b6\u9ed8\u8ba4\u7684\u914d\u7f6e\u4e3a 0.9\uff0c\u4e5f\u5c31\u662f\u8bf4\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u5b58\u5728\u4e00\u4e2a\u76f8\u4f3c\u5ea6 90% \u7684\u56fe\u6807\u5373\u8fd4\u56de\u5176\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff1b \u5982\u679c\u4f60\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u8c03\u6574\u8bc6\u522b\u5ea6\uff0c\u4f60\u53ef\u4ee5\u5728\u8c03\u7528\u51fd\u6570\u7684\u65f6\u5019\uff0c\u4f20\u5165\u4e0d\u540c\u7684\u8bc6\u522b\u5ea6\u7684\u503c\u3002 3\u3001multiple \u9ed8\u8ba4\u60c5\u51b5\u4e0b multiple=False\uff0c\u8868\u793a\u53ea\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u7b2c\u4e00\u4e2a\uff0c\u5982\u679c multiple=True \u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\uff0c\u56e0\u4e3a\u5927\u56fe\u4e2d\u53ef\u80fd\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u5c0f\u56fe\uff0c\u5728\u67d0\u4e9b\u573a\u666f\u4e0b\u4f60\u53ef\u80fd\u9700\u8981\u5168\u90e8\u83b7\u53d6\u5230\u6240\u6709\u5339\u914d\u5230\u7684\u5750\u6807\u3002 4\u3001picture_abspath \u9ed8\u8ba4\u60c5\u51b5\u4e0b picture_abspath=None \u8868\u793a\u5927\u56fe\u4e3a\u622a\u53d6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u5982\u679c\u4f60\u4e0d\u5e0c\u671b\u5927\u56fe\u662f\u5c4f\u5e55\u7684\u622a\u56fe\uff0c\u800c\u662f\u4f60\u81ea\u5b9a\u4e49\u4f20\u5165\u7684\u67d0\u4e2a\u56fe\u7247\uff0c\u4f60\u53ea\u9700\u8981\u5c06\u4f60\u7684\u56fe\u7247\u8def\u5f84\u4f20\u9012\u7ed9\u8fd9\u4e2a\u53c2\u6570\u5c31\u884c\uff0c\u6bd4\u5982\uff1a picture_abspath=\"~/Desktop/big.png\" \uff1b 5\u3001screen_bbox \u5927\u56fe\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u622a\u53d6\u6574\u4e2a\u5c4f\u5e55\uff0cscreen_bbox = [x, y, w, h] \u53ef\u4ee5\u6307\u5b9a\u622a\u53d6\u5c4f\u5e55\u4e2d\u7684\u56fa\u5b9a\u533a\u57df\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\uff0c\u53ef\u4ee5\u6392\u9664\u90e8\u5206\u533a\u57df\u5bf9\u8bc6\u522b\u7ed3\u679c\u7684\u5f71\u54cd\u3002 \u3010\u9690\u5f0f\u7b49\u5f85\u3011 \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\uff0c\u6709\u65f6\u5019\u9875\u9762\u8df3\u8f6c\u6709\u5ef6\u65f6\uff0c\u6709\u53ef\u80fd\u5b58\u5728\u8bc6\u522b\u7684\u90a3\u4e00\u523b\u9875\u9762\u4e5f\u6ca1\u6709\u8df3\u8f6c\u51fa\u6765\uff0c\u6216\u8005\u6216\u8005\u8bc6\u522b\u7684\u90a3\u4e00\u523b\uff1b \u56e0\u6b64\u6211\u4eec\u9700\u8981\u4e00\u79cd\u7b49\u5f85\u673a\u5236\uff0c\u5373\u5728\u4e00\u5b9a\u7684\u65f6\u95f4\u5185\uff0c\u5982\u679c\u8bc6\u522b\u4e0d\u5230\uff0c\u91cd\u590d\u53bb\u8bc6\u522b\uff1a def find_image(\ncls,\n*widget, rate: [float, int] = None,\nmultiple: bool = False,\nmatch_number: int = None,\npicture_abspath: str = None,\nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u5728\u5c4f\u5e55\u4e2d\u533a\u5bfb\u627e\u5c0f\u56fe\uff0c\u8fd4\u56de\u5750\u6807\uff0c\n \u5982\u679c\u627e\u4e0d\u5230\uff0c\u6839\u636e\u914d\u7f6e\u91cd\u8bd5\u6b21\u6570\uff0c\u6bcf\u6b21\u95f4\u96941\u79d2\n :param widget: \u6a21\u677f\u56fe\u7247\u8def\u5f84\n :param rate: \u76f8\u4f3c\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param match_number: \u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\n :return: \u5750\u6807\u5143\u7ec4\n \"\"\"\nif rate is None:\nrate = float(GlobalConfig.IMAGE_RATE)\ntry:\nfor element in widget:\nfor _ in range((match_number or int(GlobalConfig.IMAGE_MATCH_NUMBER)) + 1):\nlocate = cls._match_image_by_opencv(\nelement,\nrate,\nmultiple=multiple,\npicture_abspath=picture_abspath,\nscreen_bbox=screen_bbox\n)\nif not locate:\nsleep(int(GlobalConfig.IMAGE_MATCH_WAIT_TIME))\nelse:\nreturn locate\nraise TemplateElementNotFound(*widget)\nexcept Exception as e:\nraise e\n \u53c2\u6570 match_number \u7528\u4e8e\u63a7\u5236\u91cd\u590d\u8bc6\u522b\u7684\u6b21\u6570\uff0c\u9ed8\u8ba4\u4e0d\u4f20\u53c2\uff0c\u53d6\u5168\u5c40\u914d\u7f6e setting/globalconfig.ini \u91cc\u9762\u7684 IMAGE_MATCH_NUMBER \u914d\u7f6e\u9879\u7684\u503c\uff0c\u9ed8\u8ba4IMAGE_MATCH_NUMBER = 1\uff0c\u5373\u91cd\u8bd5 1 \u6b21\uff1b find_image \u662f\u6846\u67b6\u63d0\u4f9b\u7684\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u51fd\u6570\u63a5\u53e3\uff0c\u8fd9\u4e2a\u51fd\u6570\u63d0\u4f9b\u4e86\u9690\u5f0f\u7b49\u5f85\u7684\u529f\u80fd\uff0c\u4e14\u5305\u542b\u4e0a\u9762\u4ecb\u7ecd\u7684 _match_image_by_opencv \u51fd\u6570\u7684\u6240\u6709\u529f\u80fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2","title":"2\u3001\u6c14\u6ce1\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u6c14\u6ce1\u8bc6\u522b\u6307\u7684\u662f\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\u8981\u5b9a\u4f4d\u7684\u5143\u7d20\u662f\u4e00\u4e9b\u4f1a\u6d88\u5931\u7684\u5c0f\u5f39\u7a97\uff0c\u8fd9\u7c7b\u573a\u666f\u5728\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\u5c31\u53ef\u80fd\u5b58\u5728\u4e0d\u7a33\u5b9a\u6027\uff0c\u6709\u53ef\u80fd\u56fe\u50cf\u8bc6\u522b\u7684\u65f6\u5019\u6c14\u6ce1\u5df2\u7ecf\u6d88\u5931\u4e86\uff0c\u4e5f\u6709\u53ef\u80fd\u6c14\u6ce1\u51fa\u73b0\u7684\u65f6\u95f4\u592a\u77ed\u4e86\uff0c\u4e0d\u5bb9\u6613\u6355\u6349\u5230\uff0c\u5c31\u50cf\u6c14\u6ce1\u4e00\u6837\uff0c\u51fa\u73b0\u4e00\u4e0b\u5c31\u6d88\u5931\uff0c\u56e0\u6b64\u6211\u4eec\u5f62\u8c61\u7684\u79f0\u4e4b\u4e3a \u201c\u6c14\u6ce1\u8bc6\u522b\u201d\uff1b \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u4e3a\u4e86\u80fd\u7a33\u5b9a\u7684\u8bc6\u522b\u6c14\u6ce1\u7c7b\u573a\u666f\uff0c\u6211\u4eec\u91c7\u7528\u7684\u65b9\u6848\u662f\uff1a \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\uff08\u5305\u542b\u6c14\u6ce1\u4ece\u51fa\u73b0\u5230\u6d88\u5931\uff09\uff0c\u4e0d\u505c\u7684\u622a\u53d6\u8fd9\u6bb5\u65f6\u95f4\u5185\u7684\u5927\u56fe\uff0c\u4ee5\u6b64\u786e\u4fdd\u5728\u622a\u53d6\u7684\u4e00\u5806\u56fe\u7247\u4e2d\uff0c\u80af\u5b9a\u6709\u81f3\u5c11\u4e00\u5f20\u56fe\u7247\u80fd\u6355\u6349\u5230\u6c14\u6ce1\uff0c\u6700\u540e\u518d\u5bf9\u8fd9\u4e00\u5806\u56fe\u7247\u9010\u4e2a\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def get_during(\ncls,\nimage_path: str,\nscreen_time: [float, int],\nrate: float = None,\npause: [int, float] = None,\nmax_range: int = 10000\n):\n\"\"\"\n \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u622a\u56fe\u591a\u5f20\u56fe\u7247\u8fdb\u884c\u8bc6\u522b\uff0c\u5176\u4e2d\u6709\u4e00\u5f20\u56fe\u7247\u8bc6\u522b\u6210\u529f\u5373\u8fd4\u56de\u7ed3\u679c;\n \u9002\u7528\u4e8e\u6c14\u6ce1\u7c7b\u7684\u65ad\u8a00\uff0c\u6bd4\u5982\u6c14\u6ce1\u57281\u79d2\u5185\u6d88\u5931\uff0c\u5982\u679c\u7528\u5e38\u89c4\u7684\u56fe\u50cf\u8bc6\u522b\u5219\u6709\u53ef\u80fd\u65e0\u6cd5\u8bc6\u522b\u5230\uff1b\n :param image_path: \u8981\u8bc6\u522b\u7684\u6a21\u677f\u56fe\u7247\uff1b\n :param screen_time: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff1b\n :param rate: \u8bc6\u522b\u7387\uff1b\n :param pause: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u4e0d\u95f4\u9694\uff1b\n :param max_range: \u622a\u56fe\u7684\u6700\u5927\u6b21\u6570\uff0c\u8fd9\u662f\u4e00\u4e2a\u9884\u8bbe\u503c\uff0c\u4e00\u822c\u60c5\u51b5\u4e0b\u4e0d\u6d89\u53ca\u4fee\u6539\uff1b\n \"\"\"\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001screen_time \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5728\u6b64\u65f6\u95f4\u5185\u4f1a\u4e0d\u65ad\u7684\u8fdb\u884c\u622a\u56fe\u64cd\u4f5c\uff0c\u5c31\u50cf\u5f55\u5236\u89c6\u9891\u4e00\u6837\uff1b 2\u3001pause \u6bcf\u6b21\u622a\u53d6\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u4e00\u523b\u4e0d\u505c\u7684\u622a\u56fe\uff0c\u5982\u679c\u4f60\u60f3\u6bcf\u6b21\u622a\u56fe\u5b58\u5728\u4e00\u4e9b\u95f4\u9694\u65f6\u95f4\u4f20\u5165\u5bf9\u5e94\u7684\u65f6\u95f4\u95f4\u9694\u5373\u53ef\uff0c\u5355\u4f4d\u662f\u79d2\uff0c\u6bd4\u5982\uff1apause = 0.03\uff0c\u8868\u793a 30 ms\uff0c\u76f8\u5f53\u4e8e\u5e27\u7387\u4e3a 30 \u5e27\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-opencv","title":"3\u3001\u4e0d\u4f9d\u8d56 OpenCV \u7684\u56fe\u50cf\u8bc6\u522b\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31","title":"3.1\u3001\u81ea\u7814\u56fe\u50cf\u8bc6\u522b\u6280\u672f","text":"\u3010\u539f\u7406\u3011 \u4e3a\u4e86\u5b9e\u73b0\u8bc6\u522b\u56fe\u50cf\u7684\u76ee\u7684\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u5c06\u56fe\u7247\u7684\u6bcf\u4e2a\u50cf\u7d20\u7684RGB\u503c\uff0c\u4e0e\u6574\u4e2a\u5c4f\u5e55\u4e2d\u7684RGB\u8fdb\u884c\u5bf9\u6bd4\uff0c\u5982\u679c\u5c0f\u56fe\u4e0a\u7684RGB\u503c\u4e0e\u5bf9\u5e94\u5927\u56fe\u4f4d\u7f6e\u7684RGB\u90fd\u76f8\u7b49\uff0c\u5219\u5339\u914d\u6210\u529f\uff0c\u5373\u53ef\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u70b9\u3002 1\u3001\u8bfb\u53d6\u5c0f\u56fe\u548c\u5927\u56fe\u7684RGB\u503c \uff081\uff09\u5c0f\u56fe\u7684RGB\u503c small_data = small_pic.load() # load()\u4f1a\u5c06\u56fe\u7247\u7684RGB\u503c\u83b7\u53d6\u5230\uff0c\u6570\u636e\u683c\u5f0f\u4e3a\u4e00\u4e2a\u4e8c\u7ef4\u5217\u8868\uff0c\u8d4b\u503c\u7ed9\u4e00\u4e2a\u53d8\u91cfsmall_data\u3002\n \uff082\uff09\u5927\u56fe\u7684RGB\u503c big_data = big_pic.load()\n 2\u3001\u5c06\u5c0f\u56fe\u4e0e\u5927\u56fe\u7684RGB\u503c\u8fdb\u884c\u5339\u914d \uff081\uff09\u5339\u914d\u4ece\u5927\u56fe\u7684\u5750\u6807\uff080\uff0c0\uff09\u5f00\u59cb\u5339\u914d\uff0c\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff082\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\uff080\uff0c0\uff09\u5bf9\u5e94\u7684\u6240\u6709\u5c0f\u56fe\u7684RGB\u503c\u4e0d\u76f8\u7b49\uff0c\u5219\u79fb\u52a8\u5230\u4e0b\u4e00\u4e2a\u5750\u6807\u70b9\uff081\uff0c0\uff09\uff0c\u540c\u6837\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff083\uff09\u6309\u7167\u8fd9\u6837\u7684\u89c4\u5f8b\u5c06\u8fd9\u4e00\u884c\u6bcf\u79fb\u52a8\u4e00\u4e2a\u5750\u6807\u70b9\uff0c\u90fd\u5c06\u5c0f\u56fe\u6240\u6709\u7684RGB\u4e0e\u5bf9\u5e94\u5927\u56fe\u7684\u503c\u8fdb\u884c\u5339\u914d\uff1b \uff084\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\u5176\u4e2d\u4e00\u4e2a\u5750\u6807\u70b9\u4e0a\u5339\u914d\u5230\u4e86\u5c0f\u56fe\u7684\u6240\u6709RGB\u503c\uff0c\u5219\u6b64\u65f6\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\u70b9\uff1b \uff085\uff09\u5982\u679c\u5339\u914d\u4e86\u5927\u56fe\u6240\u6709\u7684\u5750\u6807\u70b9\uff0c\u90fd\u6ca1\u6709\u5339\u914d\u5230\uff0c\u5219\u8bf4\u660e\u5927\u56fe\u4e2d\u4e0d\u5b58\u5728\u5c0f\u56fe\uff0c\u5339\u914d\u5931\u8d25\uff1b \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 class ImageRgb:\n@staticmethod\ndef _check_match(_x, _y, small, bdata, sdata, rate):\n\"\"\"\n Matching degree of small graph and large graph matching\n \"\"\"\n@staticmethod\ndef _pre_random_point(small):\n\"\"\"\n Pre matching, take 10-20 points at random each time,\n and take coordinates randomly in the small graph\n \"\"\"\n@staticmethod\ndef _pre_random_match(_x, _y, point_list, bdata, sdata, rate):\n\"\"\"\n In the small graph, several points are randomly\n selected for matching, and the matching degree is\n also set for the random points\n \"\"\"\n@classmethod\ndef match_image_by_rgb(cls, image_name=None, image_path=None, rate=0.9):\n\"\"\"\n By comparing the RGB values of the small image with the large\n image on the screen, the coordinates of the small image on\n the screen are returned.\n \"\"\"\n \u901a\u8fc7 match_image_by_rgb() \u8fd9\u4e2a\u51fd\u6570\uff0c\u4f20\u5165\u76ee\u6807\u5c0f\u56fe\u7684\u6587\u4ef6\u540d\u79f0\uff0c\u5373\u53ef\u8fd4\u56de\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u3002 \u6709\u540c\u5b66\u8981\u95ee\u4e86\uff0c\u6709 OpenCV \u5e72\u561b\u4e0d\u7528\uff0c\u6709\u5fc5\u8981\u81ea\u5df1\u5b9e\u73b0\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u529f\u80fd\u5417\uff0c\u4f60\u4eec\u662f\u4e0d\u662f\u95f2\u7684\u554a\uff1f \u8fd9\u4e48\u95ee\u7684\u8bdd\uff0c\u5c0f\u4e86\uff0c\u683c\u5c40\u5c0f\u4e86\uff1b\u6211\u4eec\u81ea\u5df1\u5b9e\u73b0\u4e3b\u8981\u6709\u51e0\u65b9\u9762\u539f\u56e0\uff1a \u51cf\u5c11\u73af\u5883\u4f9d\u8d56\uff0c\u5373\u4e0d\u7528\u5b89\u88c5 OpenCV\uff0c\u6211\u4eec\u4e5f\u80fd\u5b9e\u73b0\u5176\u529f\u80fd\uff0c\u73af\u5883\u4f9d\u8d56\u8fd9\u5757\u540e\u9762\u4f1a\u5355\u72ec\u8be6\u7ec6\u8bb2\uff0c\u51cf\u5c11\u73af\u5883\u4f9d\u8d56\u5bf9\u4e8e\u4efb\u4f55\u8f6f\u4ef6\u5de5\u7a0b\u90fd\u975e\u5e38\u91cd\u8981\uff1b OpenCV \u5728\u5176\u4ed6\u56fd\u4ea7 CPU \u67b6\u6784\u4e0a\u5b89\u88c5\u5e76\u4e0d\u80fd\u4fdd\u8bc1100%\u6210\u529f\uff0c\u751a\u81f3\u6709\u6ca1\u6709\u53ef\u80fd\u5728\u4e00\u4e9b\u67b6\u6784\u4e0a\u538b\u6839\u513f\u5c31\u4e0d\u80fd\u5b89\u88c5\u4f7f\u7528 OpenCV \uff1f \u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 OpenCV \uff1f\u5c31\u50cf\u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 Windows \u5462\uff1f\u8fd9\u4e9b\u95ee\u9898\u503c\u5f97\u601d\u8003\u3002 \u5f53\u7136\uff0c\u6211\u4eec\u627f\u8ba4\u8fd9\u5957\u65b9\u6848\uff0c\u867d\u7136\u8bc6\u522b\u51c6\u786e\u7387\u6ca1\u95ee\u9898\uff0c\u4f46\u5728\u8bc6\u522b\u6548\u7387\u4e0a\u8fd8\u6ca1\u6709\u8fbe\u5230 OpenCV \u6a21\u677f\u5339\u914d\u7684\u6548\u679c\uff0c\u6211\u4eec\u7684\u65b9\u6848\u6bcf\u6b21\u8bc6\u522b\u5728 1.5s \u5de6\u53f3\uff0c\u800c OpenCV \u5728 1s \u5de6\u53f3\uff1b \u6574\u4f53\u8bc6\u522b\u6548\u679c\u6765\u8bb2\uff0c\u6211\u8ba4\u4e3a\u8fd8\u662f\u53ef\u4ee5\u63a5\u53d7\u7684\uff0c\u4e5f\u5e0c\u671b\u6709\u5fd7\u4e4b\u58eb\u80fd\u4e00\u8d77\u4f18\u5316\u6b64\u65b9\u6848\uff0c\u4e00\u8d77\u6280\u672f\u62a5\u56fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32-rpc","title":"3.2\u3001\u57fa\u4e8e RPC \u670d\u52a1\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b","text":"\u5728\u8fdc\u7a0b\u670d\u52a1\u5668\u4e0a\u90e8\u7f72 OpenCV \u7684\u73af\u5883\uff0c\u5e76\u5c06\u5176\u90e8\u7f72\u4e3a RPC \u670d\u52a1\uff0c\u6d4b\u8bd5\u673a\u4e0a\u4e0d\u7528\u5b89\u88c5 OpenCV \u4f9d\u8d56\uff0c\u800c\u662f\u901a\u8fc7\u8bf7\u6c42 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u3010\u539f\u7406\u3011 \u6d4b\u8bd5\u673a\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u56fe\u7247\u4ee5\u53ca\u6a21\u677f\u56fe\u7247\uff0c\u53d1\u9001\u7ed9 RPC \u670d\u52a1\u7aef\uff0c\u670d\u52a1\u7aef\u62ff\u5230\u4e24\u5f20\u56fe\u7247\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u6700\u540e\u5c06\u8bc6\u522b\u7ed3\u679c\u8fd4\u56de\u7ed9\u6d4b\u8bd5\u673a\uff1b \u8981\u7279\u6b8a\u8bf4\u660e\u7684\u662f\uff1a RPC \u662f\u4e00\u79cd\u534f\u8bae\uff0c\u8bb8\u591a\u8bed\u8a00\u90fd\u662f\u652f\u6301\u7684\uff0c\u6bd4\u5982\u8bf4\u670d\u52a1\u7aef\u4e5f\u53ef\u4ee5\u7528 C++ \u6765\u5b9e\u73b0\uff0c\u5ba2\u6237\u7aef\u4f7f\u7528 Python \u4e5f\u662f\u53ef\u4ee5\u8c03\u7528\u7684\u3002 \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 \u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nimport cv2 as cv\nimport numpy as np\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\nif __name__ == \"__main__\":\nserver = ThreadXMLRPCServer((\"x.x.x.x\", 8889), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(match_image_by_opencv, \"match_image_by_opencv\")\nserver.serve_forever()\n \u8fd9\u6837\uff0c\u6211\u4eec\u57fa\u4e8e Python \u6807\u51c6\u5e93 xmlrpc \u642d\u5efa\u4e86\u4e00\u4e2a RPC \u670d\u52a1\u5668\uff0c\u6ce8\u518c\u4e86 image_put \u548c match_image_by_opencv \u4e24\u4e2a\u529f\u80fd\u63a5\u53e3\uff0c\u5728\u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u901a\u8fc7 IP \u548c\u7aef\u53e3\u8fdb\u884c RPC \u8bf7\u6c42\uff1b \u5ba2\u6237\u7aef\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from xmlrpc.client import Binary\nfrom xmlrpc.client import ServerProxy\nserver = ServerProxy(GlobalConfig.OPENCV_SERVER_HOST, allow_none=True)\nscreen_rb = open(screen, \"rb\")\ntemplate_rb = open(template_path, \"rb\")\ntry:\nscreen_path = server.image_put(Binary(screen_rb.read()))\nscreen_rb.close()\ntpl_path = server.image_put(Binary(template_rb.read()))\ntemplate_rb.close()\nreturn server.match_image_by_opencv(\ntpl_path, screen_path, rate, multiple\n)\nexcept OSError as exc:\nraise EnvironmentError(\nf\"RPC\u670d\u52a1\u5668\u94fe\u63a5\u5931\u8d25. {GlobalConfig.OPENCV_SERVER_HOST}\"\n) from exc\n \u901a\u8fc7\u8fd4\u56de server.match_image_by_opencv \u5c31\u83b7\u53d6\u4e86\u5728\u670d\u52a1\u7aef\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4","title":"4\u3001\u53f3\u952e\u83dc\u5355\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41","title":"4.1\u3001\u53f3\u952e\u83dc\u5355\u5b9a\u4f4d\u7684\u65b9\u6848\u53ca\u95ee\u9898","text":"\u53f3\u952e\u83dc\u5355\u7684\u5143\u7d20\u5b9a\u4f4d\u662f\u4e00\u4e2a\u96be\u70b9\uff0c\u8fc7\u53bb\u6211\u4eec\u8c03\u7814\u548c\u4f7f\u7528\u8fc7\u7684\u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u65b9\u6cd5\u6709 4 \u79cd\uff1a \u7b2c\u4e00\u79cd\uff1a\u6b65\u957f\u64cd\u4f5c\u6cd5 \u5728\u53f3\u952e\u83dc\u5355\u547c\u51fa\u6765\u4e4b\u540e\uff0c\u901a\u8fc7\u952e\u76d8\u7684 up\u3001down \u6309\u952e\uff0c\u8fdb\u884c\u9009\u62e9\u83dc\u5355\u9009\u62e9\uff0c\u9009\u4e2d\u76ee\u6807\u4e4b\u540e enter \u5373\u53ef\uff1b\u6bd4\u5982\uff1a\u5728\u684c\u9762\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\uff0c\u6309 1 \u6b21 down \uff0c\u4f1a\u51fa\u73b0\u4e0b\u56fe\uff1a \u7ee7\u7eed\u518d\u6309 2 \u6b21 down\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u518d\u6309 enter\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u5982\u6b64\uff0c\u201c\u6392\u5e8f\u65b9\u5f0f\u201d\u7684\u6b65\u957f\u4e3a 3\uff1b\u901a\u8fc7\u4f7f\u7528\u952e\u76d8\u4e0a\u4e0b\u952e\uff0c\u5c31\u5b9e\u73b0\u4e86\u5bf9\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\uff1b \u4f46\u662f\uff0c\u8fd9\u79cd\u65b9\u5f0f\u6709\u4e2a\u5f88\u70e6\u4eba\u7684\u95ee\u9898\uff0c\u5c31\u662f\u53f3\u952e\u83dc\u5355\u7684\u9009\u9879\u4f4d\u7f6e\u4e0d\u53ef\u80fd\u4e00\u76f4\u4e0d\u53d8\uff0c\u5728\u9700\u6c42\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\uff0c\u83dc\u5355\u9009\u9879\u7684\u53d8\u5316\u662f\u5f88\u5927\u7684\uff0c\u751a\u81f3\u6709\u4e9b\u5e94\u7528\u652f\u6301\u81ea\u5b9a\u4e49\u83dc\u5355\uff0c\u6bd4\u5982\u6587\u7ba1\u53f3\u952e\u83dc\u5355\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff1b \u4e5f\u5c31\u662f\u8bf4\u4f60\u5f97\u7ecf\u5e38\u53bb\u7ef4\u62a4\u83dc\u5355\u9009\u9879\u7684\u6b65\u957f\uff0c\u4e00\u4e2a\u9009\u9879\u73b0\u5728\u7684\u6b65\u957f\u662f 3\uff0c\u4e0b\u4e2a\u8fed\u4ee3\u53ef\u80fd\u5c31\u662f 4 \u6216\u8005 5\u3002 \u7b2c\u4e8c\u79cd\uff1a\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u6cd5 \u628a\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5355\u72ec\u622a\u56fe\u4fdd\u5b58\uff0c\u56fe\u7247\u4e2d\u4ec5\u5305\u542b\u4e00\u4e2a\u83dc\u5355\u9009\u9879\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u8fd9\u6837\uff0c\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5c31\u53ef\u4ee5\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u65b9\u5f0f\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u8fd9\u79cd\u65b9\u5f0f\u4e0d\u7528\u62c5\u5fc3\u83dc\u5355\u9009\u9879\u7684\u987a\u5e8f\u6216\u4f4d\u7f6e\uff0c\u4f46\u662f\u9700\u8981\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff0c\u4e14\u5bb9\u6613\u53d7\u5230\u5b57\u4f53 UI \u53d8\u66f4\u7c7b\u9700\u6c42\u7684\u5f71\u54cd\uff0c\u6bd4\u5982\uff1a\u5b57\u4f53\u5927\u5c0f\u3001\u5b57\u4f53\u95f4\u8ddd\u7b49\u7b49\u9700\u6c42\u53d8\u66f4\u90fd\u4f1a\u5f71\u54cd\uff0c\u6bcf\u6b21\u53d8\u66f4\u4e4b\u540e\u5c31\u9700\u8981\u8fdb\u884c\u5927\u91cf\u56fe\u7247\u8d44\u6e90\u7684\u91cd\u65b0\u622a\u56fe\u66ff\u6362\uff0c\u662f\u4e2a\u6bd4\u8f83\u9ebb\u70e6\u7684\u4e8b\u60c5\uff1b \u7b2c\u4e09\u79cd\uff1a\u76f8\u5bf9\u4f4d\u79fb\u6cd5 \u9f20\u6807\u70b9\u51fb\u53f3\u952e\u7684\u65f6\u5019\uff0c\u9f20\u6807\u7684\u5f53\u524d\u5750\u6807\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u7684\uff0c\u83dc\u5355\u9009\u9879\u7684\u5bbd\uff08 w \uff09\u4e00\u822c\u662f\u56fa\u5b9a\u7684\uff0c\u53d8\u5316\u7684\u662f\u83dc\u5355\u7684\u957f\u5ea6\uff08 h \uff09\uff0c\u53ef\u4ee5\u901a\u8fc7\u67d0\u4e2a\u9009\u9879\u76f8\u5bf9\u4e8e\u9f20\u6807\u7684\u8ddd\u79bb\u5728\u786e\u5b9a\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u901a\u8fc7\u7ef4\u62a4\u83dc\u5355\u9009\u9879\uff08\u76f8\u5bf9\u4f4d\u7f6e\uff09\u76f8\u5bf9\u4e8e\u9f20\u6807\u4f4d\u7f6e\u7684\u8ddd\u79bb\uff0c\u5373\u53ef\u8f7b\u677e\u8ba1\u7b97\u51fa\u83dc\u5355\u9009\u9879\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\u3002 \u4ece\u7406\u8bba\u4e0a\u6b64\u65b9\u6848\u662f\u53ef\u884c\u7684\uff0c\u4f46\u662f\u8fd9\u91cc\u4ecd\u7136\u5b58\u5728\u4e24\u4e2a\u4e25\u91cd\u7684\u95ee\u9898\uff1a \u83dc\u5355\u987a\u5e8f\u6539\u53d8\uff0c\u5bfc\u81f4\u76f8\u5bf9\u8ddd\u79bb\u6539\u53d8\uff0c\u800c\u4e14\u8ddd\u79bb\u662f\u901a\u8fc7\u50cf\u7d20\uff08px\uff09\u6765\u8868\u793a\u7684\uff0c\u4e0d\u60f3\u6b65\u957f\u90a3\u4e48\u53ea\u7ba1\uff0c\u6bcf\u6b21\u9700\u8981\u53bb\u91cf\u4e00\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u70b9\u9ebb\u70e6\uff1b \u9f20\u6807\u5728\u684c\u9762\u4e0d\u540c\u4f4d\u7f6e\u70b9\u51fb\u53f3\u952e\uff0c\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u4f4d\u7f6e\u662f\u4e0d\u540c\u7684\uff0c\u4e0a\u56fe\u7684\u83dc\u5355\u662f\u5728\u9f20\u6807\u7684\u5de6\u4e0b\u65b9\uff0c\u5982\u679c\u4f60\u79fb\u52a8\u9f20\u6807\u5230\u5c4f\u5e55\u56db\u8fb9\uff0c\u4f60\u4f1a\u53d1\u73b0\uff0c\u53f3\u952e\u83dc\u5355\u53ef\u80fd\u51fa\u73b0\u5728\u9f20\u6807\u7684\u56db\u4e2a\u65b9\u5411\uff0c\u4e5f\u5c31\u662f\u8bf4\u4f60\u9700\u8981\u6839\u636e\u9f20\u6807\u7684\u4e0d\u540c\u4f4d\u7f6e\u6765\u5224\u65ad\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u65b9\u5411\uff0c\u800c\u4e0d\u540c\u7684\u65b9\u5411\u4e0a\u8ba1\u7b97\u65b9\u6cd5\u662f\u4e0d\u540c\u7684\uff0c\u6bd4\u5982\uff1a\u53f3\u952e\u83dc\u5355\u5728\u9f20\u6807\u7684\u5de6\u4e0a\uff0c\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\u8ba1\u7b97\u65b9\u6cd5\u4e3a\uff08x - w / 2\uff0c y - h\uff09\uff0c\u8fd9\u6837\u7ef4\u62a4\u8d77\u6765\u53ef\u4ee5\u8bf4\u975e\u5e38\u590d\u6742\uff1b \u57fa\u4e8e\u4ee5\u4e0a\u4e24\u4e2a\u539f\u56e0\uff0c\u6211\u4eec\u5e76\u4e0d\u63a8\u8350\u8fd9\u79cd\u64cd\u4f5c\u65b9\u6848\u3002 \u7b2c\u56db\u79cd\uff1a\u5c5e\u6027\u5b9a\u4f4d \u6709\u540c\u5b66\u8bf4\u5e72\u561b\u4e0d\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u5462\uff0c\u5176\u5b9e\uff0c\u6211\u4eec\u6700\u5f00\u59cb\u60f3\u5230\u7684\u65b9\u6848\u5c31\u662f\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\uff0c\u4f46\u662f\u5728\u5c5e\u6027\u7684 DOM \u6811\u91cc\u600e\u4e48\u4e5f\u627e\u4e0d\u5230\uff0c\u65e0\u6cd5\u5b9a\u4f4d\u5230\uff0c\u6211\u4eec\u4e5f\u8054\u5408\u7814\u53d1\u540c\u5b66\u4e00\u8d77\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u4f46\u6700\u7ec8\u8fd8\u662f\u6ca1\u80fd\u89e3\u51b3\uff0c\u975e\u5e38\u9057\u61be\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42","title":"4.2\u3001\u6700\u65b0\u7684\u53f3\u952e\u83dc\u5355\u7ec8\u6781\u89e3\u51b3\u65b9\u6848","text":"\u7531\u4e8e\u53f3\u952e\u83dc\u5355\u9009\u9879\u51e0\u4e4e\u90fd\u662f\u6587\u672c\uff0c\u90a3\u4e48\u901a\u8fc7 OCR \u8bc6\u522b\uff0c\u51e0\u4e4e\u662f\u6700\u4f18\u7684\u65b9\u6848\uff1a \u4e0d\u7528\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff1b \u4e0d\u4f1a\u53d7\u5230\u83dc\u5355\u9009\u9879\u987a\u5e8f\u6539\u53d8\u7684\u5f71\u54cd\uff1b \u4e0d\u4f1a\u53d7\u5230\u5b57\u4f53 UI \u53d8\u5316\u7684\u5f71\u54cd\uff1b \u5173\u4e8e OCR \u8bc6\u522b\u6211\u4eec\u5728\u540e\u9762\u4f1a\u8be6\u7ec6\u8bb2\u5230\uff0c\u672c\u7ae0\u8282\u4e3b\u8981\u8bb2\u57fa\u4e8e OCR \u8bc6\u522b\uff0c\u6211\u4eec\u5728\u53f3\u952e\u83dc\u5355\u8bc6\u522b\u4e0a\u7684\u7a81\u7834\u548c\u521b\u65b0\uff1b \u4f7f\u7528 OCR \u8bc6\u522b\u53f3\u952e\u83dc\u5355\u867d\u7136\u5df2\u7ecf\u5f88\u5b8c\u7f8e\u4e86\uff0c\u4f46\u662f\u5728\u4e00\u4e9b\u60c5\u51b5\u4e0b\u4ecd\u7136\u5b58\u5728\u4e00\u70b9\u95ee\u9898\uff0c\u5c31\u662f\u5c4f\u5e55\u4e2d\u51fa\u73b0\u591a\u4e2a\u548c\u83dc\u5355\u9009\u9879\u6587\u5b57\u76f8\u540c\u7684\u6587\u5b57\u65f6\uff0c\u6bd4\u5982\u4e0b\u9762\u8fd9\u79cd\u60c5\u51b5\uff1a \u5c4f\u5e55\u6070\u597d\u51fa\u73b0\u4e86\u4e24\u4e2a\u201c\u590d\u5236\u201d\uff0c\u6b64\u65f6\u8981\u5b9a\u4f4d\u5230\u83dc\u5355\u4e2d\u7684 \u201c\u590d\u5236\u201d\uff0c\u5c31\u9700\u8981\u8fdb\u4e00\u6b65\u505a\u6570\u636e\u5904\u7406\uff0c\u6bd4\u5982\uff1aOCR \u8fd4\u56de 2 \u4e2a\u201c\u590d\u5236\u201d\u7684\u5750\u6807\uff0c\u7528\u4f8b\u91cc\u9762\u6765\u5224\u65ad\u7528\u54ea\u4e2a\uff0c\u4ece\u4e1a\u52a1\u4e0a\u5c06\u5904\u7406\u8d77\u6765\u6bd4\u8f83\u9ebb\u70e6\uff0c\u56e0\u4e3a\u4f60\u5f97\u660e\u786e\u77e5\u9053\u83dc\u5355\u5728\u5de6\u8fb9\u8fd8\u662f\u53f3\u8fb9\uff0c\u7136\u540e\u8fd9\u672c\u8eab\u5c31\u662f\u4e0d\u786e\u5b9a\u7684\uff1b \u600e\u4e48\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u5462\uff0c\u8fd9\u5c31\u8981\u8bf4\u9053\u672c\u7ae0\u7684\u4e3b\u9898\uff1a\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b\u3002 \u3010\u539f\u7406\u3011 \u5728\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u524d\u622a\u4e00\u5f20\u56fe\uff0c\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\u518d\u622a\u53d6\u4e00\u5f20\u56fe\uff0c\u4e24\u5f20\u56fe\u552f\u4e00\u53d8\u5316\u7684\u5c31\u662f\u53f3\u952e\u83dc\u5355\uff0c\u5c06\u5176\u4ed6\u76f8\u540c\u7684\u5730\u65b9\u90fd\u5c4f\u853d\u6389\uff0c\u53ea\u7559\u4e0b\u83dc\u5355\u754c\u9762\uff0c\u5982\u6b64\u5373\u53ef\u6d88\u9664\u5e72\u6270\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u5c06\u4e24\u79cd\u56fe\u505a\u524d\u540e\u5bf9\u6bd4\u63d0\u53d6\u53ef\u4ee5\u5f97\u5230\u8fd9\u6837\u7684\u56fe\uff1a \u4f60\u770b\uff0c\u901a\u8fc7\u524d\u540e\u56fe\u7247\u7684\u5bf9\u6bd4\uff0c\u5c06\u76f8\u540c\u7684\u90e8\u5206\u7ed9\u6d88\u9664\u6389\uff0c\u518d\u8fdb\u884c OCR \u8bc6\u522b\uff0c\u8fd9\u6837\u5c31\u4e0d\u4f1a\u6709\u5e72\u6270\u4e86\uff1b \u4ee3\u7801\u5b9e\u73b0\u8bf7\u67e5\u770b src/filter_image.py \uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def filter_image(action):\n\"\"\"\n \u5bf9\u6bd4\u52a8\u4f5c\u524d\u540e\u4e24\u5f20\u56fe\u7247\uff0c\u63d0\u53d6\u4e0d\u540c\u7684\u90e8\u5206\u751f\u6210\u4e00\u5f20\u65b0\u7684\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u65b0\u56fe\u7247\u7684\u8def\u5f84\n :param action: \u52a8\u4f5c\u51fd\u6570\u7684\u51fd\u6570\u5bf9\u8c61\n :return: \u65b0\u56fe\u7247\u7684\u8def\u5f84\n \"\"\"\n action \u662f\u9f20\u6807\u4e8b\u4ef6\uff0c\u56e0\u4e3a\u6b64\u7c7b\u573a\u666f\u4e0d\u4ec5\u4ec5\u5728\u53f3\u952e\u5b58\u5728\uff0c\u5355\u51fb\u3001\u53cc\u51fb\u7b49\u7b49\uff0c\u53ea\u8981\u64cd\u4f5c\u524d\u540e\u540e\u53d8\u5316\u7684\u90fd\u53ef\u4ee5\uff1a from src.mouse_key import MouseKey\naction = (\nMouseKey.click,\nMouseKey.right_click,\nMouseKey.double_click,\nMouseKey.move_to,\n)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5","title":"5\u3001\u52a8\u6001\u56fe\u50cf\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5728\u684c\u9762\u58c1\u7eb8\u5207\u6362\uff0c\u6216\u770b\u56fe\u3001\u76f8\u518c\u5207\u6362\u56fe\u7247\u7c7b\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u7531\u4e8e\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u662f\u4e0d\u56fa\u5b9a\u7684\uff08\u4e0d\u540c\u7248\u672c\u7684\u7cfb\u7edf\u58c1\u7eb8\u4e0d\u540c\u3001\u58c1\u7eb8\u987a\u5e8f\u4e0d\u540c\uff0c\u770b\u56fe\u76f8\u518c\u5728\u56fe\u7247\u8d44\u6e90\u4e0d\u4e00\u5b9a\u56fa\u5b9a\uff09\uff0c\u90a3\u4e48\u5728\u6d4b\u8bd5\u5207\u6362\u58c1\u7eb8\u6216\u8005\u5207\u6362\u56fe\u7247\u7684\u573a\u666f\u65f6\u5c31\u4f1a\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u4f60\u4e0d\u77e5\u9053\u9884\u671f\u662f\u5565\uff0c\u7528\u4f8b\u64cd\u4f5c\u52a8\u6001\u7684\uff0c\u4e5f\u662f\u6781\u4e0d\u7a33\u5b9a\u3002 \u3010\u539f\u7406\u3011 \u5728\u5207\u6362\u56fe\u7247\u4e4b\u524d\u622a\u56fe\u4fdd\u5b58\u5e76\u8fd4\u56de\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u6b21\u8bc6\u522b\u8fd9\u5f20\u56fe\u7247\uff0c\u5982\u679c\u4e0d\u5b58\u5728\uff0c\u8bf4\u660e\u56fe\u7247\u5df2\u7ecf\u5207\u6362\u4e86\uff1b \u793a\u610f\u56fe\uff1a \u8fd9\u6837\uff0c\u6211\u4eec\u622a\u53d6\u4e86\u5f53\u524d\u56fe\u7247\u4e2d\u6bd4\u8f83\u6709\u4ee3\u8868\u6027\u7684\u4f4d\u7f6e\uff08\u4e00\u53ea\u9e1f\uff09\uff0c\u5728\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u7528\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1a \u6211\u4eec\u518d\u62ff\u7740\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd9\u6837\u5728\u5f53\u524d\u56fe\u7247\u4e2d\uff0c\u5c31\u4e0d\u80fd\u627e\u5230\u8fd9\u53ea\u9e1f\u4e86\uff0c\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u662f False\uff0c\u90a3\u4e48\u4e5f\u5c31\u53ef\u4ee5\u5224\u65ad\u56fe\u7247\u5207\u6362\u662f\u6210\u529f\u7684\u3002 \u4ee3\u7801\u793a\u610f\uff1a def save_temporary_picture(_x: int, _y: int, width: int, height: int):\n\"\"\"\n \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u56fe\u7247\u8def\u5f84\n :param x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n :param y: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n :param width: \u5bbd\u5ea6\n :param height: \u9ad8\u5ea6\n :return: \u56fe\u7247\u8def\u5f84\n \"\"\"\n \u6b64\u51fd\u6570\u7528\u4e8e\u5728\u64cd\u4f5c\u4e4b\u524d\u622a\u56fe\u4e00\u5f20\u4e34\u65f6\u56fe\u7247\uff0c\u8fd4\u56de\u56fe\u7247\u8def\u5f84\uff0c\u6700\u540e\u5728\u65ad\u8a00\u7684\u65f6\u5019\u518d\u5c06\u56fe\u7247\u8def\u5f84\u4f5c\u4e3a\u53c2\u6570\u4f20\u5165\u65ad\u8a00\u8bed\u53e5\u5373\u53ef\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ui","title":"\u4e09\u3001\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_1","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u662f\u6211\u4eec\u81ea\u7814\u7684\u4e00\u79cd\u4f7f\u7528\u7b80\u5355\uff0c\u4e14\u6548\u7387\u6781\u9ad8\u3001\u7a33\u5b9a\u6027\u597d\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u57fa\u4e8e\u5143\u7d20\u6309\u94ae\u5728\u5e94\u7528\u4e2d\u7684\u76f8\u5bf9\u4f4d\u7f6e\uff0c\u52a8\u6001\u83b7\u53d6\u5143\u7d20\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff0c\u9002\u7528\u4e8e\u5404\u79cd\u5c4f\u5e55\u5206\u8fa8\u7387\uff08\u5305\u62ec\u9ad8\u5206\u5c4f\u3001\u5bbd\u5c4f\u3001\u5e26\u9c7c\u5c4f\uff09\uff0c\u5f53\u5143\u7d20\u6309\u94ae\u4f4d\u7f6e\u76f8\u5bf9\u4e8e\u5e94\u7528\u754c\u9762\u4f4d\u7f6e\u53d1\u751f\u4fee\u6539\u4e4b\u540e\uff0c\u53ea\u9700\u8981\u6839\u636e UI \u8bbe\u8ba1\u56fe\u4e0a\u7684\u6e90\u6570\u636e\u4fee\u6539\u5bf9\u5e94\u5750\u6807\u6570\u636e\u5c31\u597d\uff0c\u7ef4\u62a4\u975e\u5e38\u7684\u65b9\u4fbf\u3002 \u6b64\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u9002\u7528\u4e8e\u4e00\u4e9b\u5143\u7d20\u4f4d\u7f6e\u76f8\u5bf9\u4e0e\u5e94\u7528\u754c\u9762\u6bd4\u8f83\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u97f3\u4e50\uff0899% \u7684\u5143\u7d20\u5b9a\u4f4d\u91c7\u7528\u8fd9\u79cd\uff0c\u6548\u679c\u975e\u5e38\u597d\uff09\uff0c\u4e0d\u9002\u7528\u4e8e\u754c\u9762\u4e0d\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u622a\u56fe\u5f55\u5c4f\uff0c\u5f88\u660e\u663e\u4e0d\u9002\u7528\u4e8e\u8fd9\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u3002\u8fd9\u79cd\u5168\u65b0\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u6709\u5b83\u7684\u9002\u7528\u6761\u4ef6\uff0c\u5982\u679c\u4f60\u53d1\u73b0\u4f7f\u7528\u5e38\u89c4\u7684\uff08\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u5b9a\u4f4d\uff09\u4e0d\u597d\u505a\u65f6\uff0c\u4e0d\u59a8\u8003\u8651\u4f7f\u7528\u8fd9\u79cd\uff0c\u5176\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff0c\u5e76\u4e14\u8fc5\u901f\u7231\u4e0a\u4ed6\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_1","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5728 UI \u8bbe\u8ba1\u56fe\u4e2d\u6211\u4eec\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u8fb9\u6846\u7684\u8ddd\u79bb\u7684\uff0c\u7136\u540e\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u6280\u672f\u624b\u6bb5\u83b7\u53d6\u5230\u5e94\u7528\u754c\u9762\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u53ca\u5e94\u7528\u7a97\u53e3\u7684\u5927\u5c0f\uff0c\u793a\u610f\u56fe\u5982\u4e0b\uff1a \uff08x1, y1\uff09\u4e3a\u5e94\u7528\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\uff1b\uff08x2, y2\uff09\u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u5de6\u4e0a\u89d2\uff08x1, y1\uff09\u7684\u5750\u6807\uff0c\u90a3\u4e48\u5b9e\u9645\u4e0a\u3010\u64ad\u653e\u6240\u6709\u3011\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\u4e3a\uff1a\uff08 x1 + x2, y1 + y2 \uff09\uff1b \u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5927\u5c0f\uff08w2, h2\uff09\uff0c\u53ef\u4ee5\u4ece UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\uff1b \u5728 UI \u8bbe\u8ba1\u7a3f\u4e0a\u70b9\u51fb\u3010\u64ad\u653e\u6240\u6709\u3011\u56fe\u6807\uff0c\u7136\u540e\u79fb\u52a8\u9f20\u6807\u5c31\u5c31\u53ef\u4ee5\u770b\u5230\u4e0a\u56fe\u7684\u53c2\u8003\u7ebf\u53ca\u6570\u636e\uff1b \u6240\u4ee5\uff0c\u6211\u4eec\u53ef\u4ee5\u8f7b\u677e\u7684\u83b7\u53d6\u5230\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u4e2d\u5fc3\u5750\u6807\u4e3a\uff1a\uff08 x1 + x2 + (w2 / 2), y1 + y2 + ( h2 / 2) \uff09 \u8be6\u7ec6\u6e90\u4ee3\u7801\u8bf7\u67e5\u770b AT \u57fa\u7840\u6846\u67b6: src/button_center.py \u83b7\u53d6\u5e94\u7528\u7a97\u53e3\u7684\u4fe1\u606f \u4f7f\u7528 xdotool \u548c xwininfo \u83b7\u53d6\u5230\u5e94\u7528\u7a97\u53e3\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u5de6\u4e0a\u89d2\uff09\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a app_id = CmdCtl.run_cmd(f\"xdotool search --classname --onlyvisible {self.app_name}\"\n).split(\"\\n\")\napp_id_list = [int(_id) for _id in app_id if _id]\nreturn CmdCtl.run_cmd(f\"xwininfo -id {app_id_list[self.number]}\")\n \u4f7f\u7528\u6b63\u5219\u83b7\u53d6\u7a97\u53e3\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u83b7\u53d6\u914d\u7f6e \u8bfb ini \u914d\u7f6e\u6587\u4ef6\uff0c\u83b7\u53d6\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e0e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a conf = ConfigParser()\nconf.read(self.config_path)\ndirection = conf.get(btn_name, \"direction\")\nposition = [int(i.strip()) for i in conf.get(btn_name, \"location\").split(\",\")]\n \u8ba1\u7b97\u5143\u7d20\u6309\u94ae\u5750\u6807 \u6839\u636e\u5e94\u7528\u7a97\u53e3\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u5927\u5c0f\u3001\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u5927\u5c0f\uff0c\u4f7f\u7528\u4e00\u5b9a\u7684\u7b97\u6cd5\u5373\u53ef\u8ba1\u7b97\u51fa\u5143\u7d20\u6309\u94ae\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u4e2d\u5fc3\u5750\u6807\uff09\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3","title":"3\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u3010\u914d\u7f6e\u65b9\u6cd5\u3011 \u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u7684\u6570\u636e\u6e90\u662f\u5e94\u7528\u5e93\u4e2d\u7684 ui.ini \u914d\u7f6e\u6587\u4ef6\uff1a ;section\n[\u65b0\u5efa\u6b4c\u5355+] ;key = value\ndirection = left_top\nlocation = 180, 268, 21, 21\n section \u662f\u4f60\u6839\u636e\u5bf9\u5e94\u7684\u5143\u7d20\u6309\u94ae\u547d\u540d\uff0c\u4f60\u53ef\u4ee5\u4efb\u610f\u547d\u540d\uff0c\u4f46\u6700\u597d\u6709\u5177\u4f53\u542b\u4e49\uff0c\u4e14\u80fd\u660e\u786e\u8868\u793a\u8fd9\u4e2a\u5143\u7d20\u6309\u94ae\u7684\u540d\u79f0\uff1b\u7528\u4e2d\u62ec\u53f7\u62ec\u8d77\u6765\u5c31\u884c\uff0c\u6bd4\u5982\uff1a[\u65b0\u5efa\u6b4c\u5355+] \uff1b direction \u662f\u914d\u7f6e\u8be5\u5143\u7d20\u7684\u53c2\u8003\u7cfb\uff0c\u5206\u522b\u4e3a\uff1a left_top \u5de6\u4e0a\uff1b left_bottom \u5de6\u4e0b\uff1b right_top \u53f3\u4e0a\uff1b right_bottom \u53f3\u4e0b\uff1b \u53c2\u8003\u7cfb\u7684\u9009\u53d6\u6807\u51c6\uff1a\u62c9\u52a8\u6539\u53d8\u7a97\u53e3\u5927\u5c0f\u65f6\uff0c\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u53c2\u8003\u7cfb\u4f4d\u7f6e\u662f\u4e0d\u53d8\u7684\uff1b location \u662f\u8be5\u5143\u7d20\u6309\u94ae\u7684\u76f8\u5bf9\u4e0e\u53c2\u8003\u7cfb\u7684 x, y \u7684\u8ddd\u79bb\uff0c\u53ca\u5927\u5c0f(w, h)\uff0c\u8fd9\u56db\u4e2a\u6570\u636e\u53ef\u4ee5\u901a\u8fc7 UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\u6570\u636e\uff0c\u5728\u7f16\u8f91\u6a21\u5f0f\u4e0b\uff0c\u70b9\u51fb UI \u56fe\u4e0a\u7684\u6309\u94ae\uff0c\u53f3\u4fa7\u5c31\u4f1a\u51fa\u73b0\u8be5\u5143\u7d20\u6309\u94ae\u7684 x, y, w, h \u6570\u636e\u3002 \u5982\u679c UI \u56fe\u4e0a\u6ca1\u6709\u63d0\u4f9b\u4f60\u60f3\u8981\u7684\u5143\u7d20\u6570\u636e\uff0c\u4f60\u53ef\u4ee5\u76f4\u63a5\u5728\u7cfb\u7edf\u4e2d\u4f7f\u7528\u622a\u56fe\u5f55\u5c4f\u8fdb\u884c\u5c3a\u91cf\uff0c\u8fd9\u662f\u4e00\u79cd\u4e0d\u63a8\u8350\u4f46\u80fd\u7528\u7684\u65b9\u6cd5\u3002 \u3010\u8c03\u7528\u65b9\u6cd5\u3011 \u5728\u5e94\u7528\u5e93\u65b9\u6cd5\u5c42\u8fd9\u6837\u5199\uff1a def click_add_music_list_btn_in_music_by_ui(self):\n\"\"\"\u70b9\u51fb\u65b0\u5efa\u6b4c\u5355\u6309\u94ae\"\"\"\nself.click(*self.ui.btn_center(\"\u65b0\u5efa\u6b4c\u5355+\"))\n self.ui.btn_center() \u662f\u56fa\u5b9a\u5199\u6cd5\uff0c\u53c2\u6570\u5c31\u662f\u914d\u7f6e\u91cc\u9762\u7684 section \u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ocr","title":"\u56db\u3001OCR \u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_2","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 OCR \u65b9\u6848\u5927\u591a\u91c7\u7528\u8c37\u6b4c OCR\uff08Tesseract\uff09\u65b9\u6848\uff0c\u4f46\u662f\u5b83\u5bf9\u4e8e\u4e2d\u6587\u7684\u8bc6\u522b\u975e\u5e38\u5dee\uff0c\u7ecf\u8fc7\u5927\u91cf\u7684\u8c03\u7814\uff0c\u6211\u4eec\u4f7f\u7528 PaddleOCR\uff0c\u5b83\u662f\u4e00\u4e2a\u5f00\u6e90\u7684\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u8bc6\u522b\u5de5\u5177\uff0c\u4e5f\u662f PaddlePaddle \u6700\u6709\u540d\u7684\u4e00\u4e2a\u5f00\u6e90\u9879\u76ee\uff0c\u611f\u5174\u8da3\u7684\u53ef\u4ee5\u70b9\u8fd9\u91cc\u4e86\u89e3\uff0c\u591a\u7684\u4e0d\u8bf4\u4e86\uff0c\u4f60\u53ea\u9700\u8981\u77e5\u9053\u5b83\u5c31\u662f\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_2","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5b89\u88c5\u4ed6\u662f\u4e2a\u5f88\u9ebb\u70e6\u7684\u4e8b\u60c5\uff0c\u867d\u7136\u64cd\u4f5c\u5f88\u7b80\u5355\uff0c\u4f46\u5176\u5b9e\u5b89\u88c5\u5305\u6709\u70b9\u5927\uff0c\u56e0\u6b64\u6211\u4eec\u4e0d\u5e0c\u671b\u76f4\u63a5\u5728 env.sh \u4e2d\u52a0\u5165\u5b83\uff0c\u8fd9\u4f1a\u8ba9\u6574\u4e2a\u81ea\u52a8\u5316\u73af\u5883\u53d8\u5f97\u975e\u5e38\u81c3\u80bf\uff1b \u56e0\u6b64\uff0c\u6211\u4eec\u60f3\u5230\u5c06\u5b83\u505a\u6210\u4e00\u4e2a RPC \u670d\u52a1\u5728\u5176\u4ed6\u673a\u5668\u4e0a\u90e8\u7f72\uff0c\u6d4b\u8bd5\u673a\u901a\u8fc7\u8fdc\u7a0b\u8c03\u7528 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u4f7f\u7528\u5b83\uff1b RPC \u7684\u8c03\u7528\u903b\u8f91\uff1a \u8fd9\u6837\u6211\u4eec\u53ea\u9700\u8981\u5728\u670d\u52a1\u7aef\u90e8\u7f72\u597d OCR \u8bc6\u522b\u7684\u670d\u52a1\uff0c\u7136\u540e\u901a\u8fc7 RPC \u670d\u52a1\u5c06\u529f\u80fd\u63d0\u4f9b\u51fa\u6765\uff0c\u6846\u67b6\u91cc\u9762\u53ea\u9700\u8981\u8c03\u7528\u5bf9\u5e94\u7684 RPC \u63a5\u53e3\u5c31\u884c\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_1","title":"3\u3001\u4f7f\u7528\u8bf4\u660e","text":"\u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nfrom paddleocr import PaddleOCR\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef paddle_ocr(pic_path, lang):\n\"\"\"\n Paddleocr\u76ee\u524d\u652f\u6301\u7684\u591a\u8bed\u8a00\u8bed\u79cd\u53ef\u4ee5\u901a\u8fc7\u4fee\u6539lang\u53c2\u6570\u8fdb\u884c\u5207\u6362\n \u4f8b\u5982`ch`, `en`, `fr`, `german`, `korean`, `japan`\n :param file_name:\n :param lang:\n :return:\n \"\"\"\nif __name__ == \"__main__\":\nIP = popen(\"hostname -I\").read().split(\" \")[0]\nPORT = 8890\nSCREEN_CACHE = \"/tmp/screen.png\"\nserver = ThreadXMLRPCServer((IP, PORT), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(paddle_ocr, \"paddle_ocr\")\nprint(\"\u76d1\u542c\u5ba2\u6237\u7aef\u8bf7\u6c42\u3002\u3002\")\nserver.serve_forever()\n \u6846\u67b6\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from src import OCR\nOCR.ocr(*target_strings, picture_abspath=None, similarity=0.6, return_default=False, return_first=False, lang=\"ch\"):\n# \u901a\u8fc7 OCR \u8fdb\u884c\u8bc6\u522b\u3002\n# target_strings:\n# \u76ee\u6807\u5b57\u7b26,\u8bc6\u522b\u4e00\u4e2a\u5b57\u7b26\u4e32\u6216\u591a\u4e2a\u5b57\u7b26\u4e32,\u5e76\u8fd4\u56de\u5176\u5728\u56fe\u7247\u4e2d\u7684\u5750\u6807;\n# \u5982\u679c\u4e0d\u4f20\u53c2\uff0c\u8fd4\u56de\u56fe\u7247\u4e2d\u8bc6\u522b\u5230\u7684\u6240\u6709\u5b57\u7b26\u4e32\u3002\n# picture_abspath: \u8981\u8bc6\u522b\u7684\u56fe\u7247\u8def\u5f84\uff0c\u5982\u679c\u4e0d\u4f20\u9ed8\u8ba4\u622a\u53d6\u5168\u5c4f\u8bc6\u522b\u3002\n# similarity: \u5339\u914d\u5ea6\u3002\n# return_default: \u8fd4\u56de\u8bc6\u522b\u7684\u539f\u751f\u6570\u636e\u3002\n# return_first: \u53ea\u8fd4\u56de\u7b2c\u4e00\u4e2a,\u9ed8\u8ba4\u4e3a False,\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u6240\u6709\u6570\u636e\u3002\n# lang: `ch`, `en`, `fr`, `german`, `korean`, `japan`\n \u6b64\u65b9\u6848\u5728\u6846\u67b6\u5185\u6ca1\u6709\u5f15\u5165\u4efb\u4f55\u4e09\u65b9\u4f9d\u8d56\u5b8c\u5168\u91c7\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\uff0c\u800c\u4e14\u4f7f\u7528\u65b9\u6cd5\u975e\u5e38\u7b80\u5355\uff0c\u53ea\u9700\u8981\u901a\u8fc7 OCR.ocr() \u5373\u53ef\uff1b \u5bf9\u4e8e\u4e00\u4e9b\u6587\u6848\u7684\u573a\u666f\u975e\u5e38\u9002\u7528\uff0c\u6b64\u65b9\u6cd5\u76f4\u63a5\u8fd4\u56de\u5750\u6807\uff0c\u53ef\u4ee5\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u3002 \u4e5f\u53ef\u4ee5\u7528\u4e8e\u6587\u5b57\u65ad\u8a00\uff0c\u4ee3\u7801\u793a\u610f\uff1a def assert_ocr_exist(\n*args, picture_abspath=None, similarity=0.6, return_first=False, lang=\"ch\"\n):\n\"\"\"\u65ad\u8a00\u6587\u6848\u5b58\u5728\"\"\"\npic = None\nif picture_abspath is not None:\npic = picture_abspath + \".png\"\nres = OCR.ocr(\n*args,\npicture_abspath=pic,\nsimilarity=similarity,\nreturn_first=return_first,\nlang=lang,\n)\nif res is False:\nraise AssertionError(\n(f\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{args}\", f\"{pic if pic else GlobalConfig.SCREEN_CACHE}\")\n)\nif isinstance(res, tuple):\npass\nelif isinstance(res, dict) and False in res.values():\nres = filter(lambda x: x[1] is False, res.items())\nraise AssertionError(\n(\nf\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{dict(res)}\",\nf\"{pic if pic else GlobalConfig.SCREEN_CACHE}\",\n)\n)\n \u5728\u7528\u4f8b\u4e2d\u4f7f\u7528\u65ad\u8a00\uff0c\u793a\u4f8b\uff1a def test_font_manager_021(self):\n\"\"\"\u53f3\u4fa7\u2665-\u6536\u85cf/\u53d6\u6d88\u6536\u85cf\u5b57\u4f53\"\"\"\n# \u5b57\u4f53\u7ba1\u7406\u5668\u754c\u9762\u53f3\u4fa7\u8be6\u60c5\u5217\u8868\uff0c\u9009\u62e9\u672a\u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e / \u6536\u85cf\u5b57\u4f53\n# \u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e\u83dc\u5355\u663e\u793a\u201c\u53d6\u6d88\u6536\u85cf\u201d\uff1b\n...\nself.assert_ocr_exist(\"\u53d6\u6d88\u6536\u85cf\")\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_1","title":"4\u3001\u670d\u52a1\u7aef\u90e8\u7f72","text":"\u6211\u4eec\u76ee\u524d\u662f\u5c06 OCR \u670d\u52a1\u90e8\u7f72\u5728\u666e\u901a\u7684\u529e\u516c\u673a\u4e0a\u7684\uff0c\u5982\u679c\u4f60\u89c9\u5f97\u73b0\u6709\u7684 OCR \u8bc6\u522b\u6027\u80fd\u4e0d\u591f\u597d\uff0c\u6070\u597d\u4f60\u6709\u66f4\u597d\u7684\u673a\u5668\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u5176\u79c1\u6709\u5316\u90e8\u7f72\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41_1","title":"4.1\u3001\u73af\u5883\u5b89\u88c5","text":"\u63a8\u8350\u4f7f\u7528 pipenv \u8fdb\u884c\u73af\u5883\u642d\u5efa\uff1b \u5b89\u88c5 pipenv \uff1a sudo pip3 install pipenv\n \u65b0\u5efa\u4e00\u4e2a\u76ee\u5f55\u4f5c\u4e3a\u73af\u5883\u5305 ocr_env\uff1a cd ~\nmkdir ocr_env\n \u521b\u5efa python 3.7 \u73af\u5883\uff1a cd ocr_env\npipenv --python 3.7\n \u5b89\u88c5 OCR \u4f9d\u8d56\u5305\uff1a pipenv install paddlepaddle -i https://mirror.baidu.com/pypi/simple\npipenv install \"paddleocr>=2.0.1\" -i https://mirror.baidu.com/pypi/simple\n \u4e0d\u51fa\u610f\u5916\uff0c\u8fd9\u6837\u5c31\u628a\u4f9d\u8d56\u5b89\u88c5\u597d\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42_1","title":"4.2\u3001\u542f\u52a8\u670d\u52a1","text":"\u5c06\u57fa\u7840\u6846\u67b6\u4e2d\u7684 scr/ocr/pdocr_rpc_server.py \u6587\u4ef6\u62f7\u8d1d\u5230 ocr_env \u76ee\u5f55\uff0c\u540e\u53f0\u6267\u884c\u5b83\u5c31\u597d\u4e86\uff1a cd ocr_env\nnohup pipenv run python pdocr_rpc_server.py &\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#43","title":"4.3\u3001\u914d\u7f6e\u5f00\u673a\u81ea\u542f\uff08\u901a\u7528\uff09","text":"\u4f60\u80af\u5b9a\u4e0d\u60f3\u6bcf\u6b21\u673a\u5668\u91cd\u542f\u4e4b\u540e\u90fd\u9700\u8981\u624b\u52a8\u542f\u52a8\u670d\u52a1\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u914d\u7f6e\u5f00\u673a\u81ea\u542f\u3002 \u5199\u5f00\u673a\u81ea\u542f\u670d\u52a1\u6587\u4ef6\uff1a sudo vim /lib/systemd/system/ocr.service\n autoocr \u540d\u79f0\u4f60\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff0c\u5199\u5165\u4ee5\u4e0b\u5185\u5bb9\uff1a [Unit]\nDescription=OCR Service\nAfter=multi-user.target\n\n[Service]\nUser=uos\nGroup=uos\nType=idle\nWorkingDirectory=/home/uos/ocr_env\nExecStart=pipenv run python pdocr_rpc_server.py\n\n[Install]\nWantedBy=multi-user.target\n \u6ce8\u610f\u66ff\u6362\u4f60\u7684${USER} \u4fee\u6539\u914d\u7f6e\u6587\u4ef6\u7684\u6743\u9650\uff1a sudo chmod 644 /lib/systemd/system/ocr.service\n \u81ea\u542f\u670d\u52a1\u751f\u6548\uff1a sudo systemctl daemon-reload\nsudo systemctl enable ocr.service\n \u67e5\u770b\u670d\u52a1\u72b6\u6001\uff1a sudo systemctl status ocr.service\n \u4f60\u53ef\u4ee5\u518d\u91cd\u542f\u4e0b\u7535\u8111\uff0c\u770b\u770b\u670d\u52a1\u662f\u4e0d\u662f\u6b63\u5e38\u542f\u52a8\u4e86\uff0c\u6ca1\u62a5\u9519\u5c31 OK \u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_4","title":"\u4e94\u3001\u5c5e\u6027\u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_3","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 UI \u81ea\u52a8\u5316\u5927\u591a\u90fd\u662f\u57fa\u4e8e\u6d4f\u89c8\u5668\u7684\uff0c\u6838\u5fc3\u662f\u5728\u7f51\u9875\u7684 DOM \u6811\u4e0a\u67e5\u627e\u5143\u7d20\uff0c\u5e76\u5bf9\u5176\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\uff1b Linux \u684c\u9762\u5e94\u7528\u5927\u591a\u662f\u91c7\u7528 Qt \u7f16\u5199\u7684\uff0c\u5728 Qt \u4e2d\u4e5f\u662f\u4ece\u6700\u9876\u5c42\u7684 MainWindow \u5f00\u59cb\u6784\u5efa\u5e94\u7528\uff0c\u6240\u4ee5\u903b\u8f91\u4e5f\u662f\u4e00\u6837\u7684\uff0cQt \u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u540c\u6837\u53ef\u4ee5\u901a\u8fc7 DOM \u6811\uff08\u5c5e\u6027\u6811\uff09\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff0c\u6211\u4eec\u79f0\u4e4b\u4e3a\u5c5e\u6027\u5b9a\u4f4d\u3002 \u501f\u52a9\u5f00\u6e90\u5de5\u5177 dogtail \u6211\u4eec\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u83b7\u53d6\uff0c\u4ece\u800c\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\u3002dogtail \u7684\u9879\u76ee\u4ecb\u7ecd\u53ef\u4ee5\u731b\u6233\u8fd9\u91cc\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_3","title":"2\u3001\u4f7f\u7528\u65b9\u6cd5","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#21sniff","title":"2.1\u3001sniff\uff08\u55c5\u63a2\u5668\uff09\u4f7f\u7528","text":"\u5728\u7ec8\u7aef\u8f93\u5165 sniff \u542f\u52a8 AT-SPI Browser mikigo@mikigo-PC:~$ sniff\n \u67e5\u770b\u5e94\u7528\u7684\u6807\u7b7e \u5728 sniff \u91cc\u9762\u53ef\u4ee5\u770b\u5230\u7cfb\u7edf\u4e2d\u5df2\u542f\u52a8\u7684\u5e94\u7528\uff0c\u70b9\u51fb\u5e94\u7528\u540d\u79f0\u524d\u9762\u7684\u4e09\u89d2\u5f62\u56fe\u6807\uff0c\u53ef\u4ee5\u5c55\u5f00\u5e94\u7528\u7684\u6807\u7b7e\uff0c\u6240\u6709\u6807\u7b7e\u4ee5 tree \u7684\u5f62\u5f0f\u5c55\u793a\uff0c\u5bf9\u5e94\u5e94\u7528\u91cc\u9762\u7684\u7236\u7a97\u53e3\u548c\u5b50\u7a97\u53e3\u3002 \u83b7\u53d6\u5143\u7d20\u63a7\u4ef6\u7684\u6807\u7b7e\u540d\u79f0 \u9996\u5148\uff0c\u4e3a\u4e86\u65b9\u4fbf\u67e5\u770b\u5143\u7d20\u63a7\u4ef6\u5bf9\u5e94\u7684\u4f4d\u7f6e\uff0c\u5efa\u8bae\u73b0\u5728\u4e0a\u65b9\u5de5\u5177\u680f\u70b9\u51fb Actions\uff0c\u7136\u540e\u52fe\u9009 Hightlight Items\uff0c\u8fd9\u6837\u5728 sniff \u4e2d\u9f20\u6807\u9009\u4e2d\u5143\u7d20\u6807\u7b7e\u7684\u65f6\u5019\uff0c\u5e94\u7528\u4e2d\u4f1a\u6709\u76f8\u5e94\u7684\u5149\u6807\u9501\u5b9a\u3002 \u5728 sniff \u91cc\u9762\u70b9\u51fb\u8fdb\u5165\u5e94\u7528\u7684\u6807\u7b7e tree \u4e2d\u540e\uff0c\u70b9\u51fb\u76f8\u5e94\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5728\u5de5\u5177\u4e0b\u65b9\uff0c\u4f1a\u5c55\u793a\u5143\u7d20\u63a7\u4ef6\u7684 Name\uff0c\u8fd9\u4e2a\u5c31\u662f\u6807\u7b7e\u540d\u79f0\u3002 \u5728 tree \u4e2d\u6709\u4e9b\u5730\u65b9\u662f\u7a7a\u767d\u7684\u6216\u8005\u662f Form\uff0c\u662f\u56e0\u4e3a\u5f00\u53d1\u4eba\u5458\u5728\u6dfb\u52a0\u6807\u7b7e\u7684\u65f6\u5019\u6ca1\u6709\u6dfb\u52a0\uff0c\u6216\u8005\u6709\u4e9b\u7236\u7a97\u53e3\u4e0d\u9700\u8981\u6dfb\u52a0\uff0c\u8fd9\u79cd\u5728\u5b9e\u9645\u4e1a\u52a1\u4e2d\u662f\u4e0d\u5f71\u54cd\u7684\uff0c\u6211\u4eec\u53ea\u8981\u4fdd\u8bc1\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\u4e2d\uff0c\u8981\u7528\u5230\u7684\u5143\u7d20\u90fd\u6dfb\u52a0\u4e86\u6807\u7b7e\u5373\u53ef\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#22","title":"2.2\u3001\u5143\u7d20\u64cd\u4f5c","text":"\u83b7\u53d6\u5e94\u7528\u5bf9\u8c61 dogtail \u83b7\u53d6\u5e94\u7528\u5bf9\u8c61\u7684\u65f6\u5019\uff0c\u4f7f\u7528\u7684\u662f tree \u5e93\u91cc\u9762\u7684 application() \u65b9\u6cd5\uff1a from dogtail.tree import root\napp_obj = root.application('deepin-music')\n app_obj\u5c31\u662f\u5e94\u7528\u7684\u5bf9\u8c61\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\uff0c\u662f\u5e94\u7528\u5bf9\u8c61\u4f7f\u7528child()\u65b9\u6cd5\uff1a element = app_obj.child('element_name')\n \u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u4f20\u5165\u5143\u7d20\u7684 Name\uff0c\u83b7\u53d6\u5230\u76f8\u5e94\u5143\u7d20\u7684\u5bf9\u8c61\u3002Name \u53ef\u4ee5\u901a\u8fc7 sniff \u67e5\u770b\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\u5217\u8868: element_list = element.children\n \u83b7\u53d6\u5230\u8fd9\u4e2a\u5143\u7d20\u4e0b\u9762\u6240\u6709\u7684\u5143\u7d20\u5217\u8868\u3002 \u8fd9\u4e2a\u65b9\u6cd5\u9002\u7528\u4e8e\u6709\u4e9b\u6807\u7b7e\u6ca1\u6709\u6dfb\u52a0\uff0c\u4f46\u662f\u4f4d\u7f6e\u662f\u56fa\u5b9a\u7684\uff0c\u6211\u4eec\u901a\u8fc7\u7d22\u5f15\u53ef\u4ee5\u53d6\u5f97\u5143\u7d20\u3002 element_list[0]\n \u5bf9\u5143\u7d20\u7684\u64cd\u4f5c \u5728\u83b7\u53d6\u5230\u5143\u7d20\u4e4b\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u76f8\u5e94\u7684\u64cd\u4f5c\u3002 \u5355\u51fb element.click(button=1)\n button 1 \u2014>\u5de6\u952e\uff0c2 \u2014>\u6eda\u8f6e\uff0c3 \u2014>\u53f3\u952e\uff0c\u9ed8\u8ba4\u4e3a 1 \u53cc\u51fb element.doubleClick(button=1)\n \u9f20\u6807\u60ac\u505c element.point()\n \u9f20\u6807\u79fb\u52a8\u5230\u5143\u7d20\u4e2d\u5fc3\u4f4d\u7f6e \u6587\u672c\u8f93\u5165 element.typeText(string)\n \u5411\u5143\u7d20\u5bf9\u8c61\u8f93\u5165\u5b57\u7b26\u4e32 \uff0c\u6bd4\u5982\u8f93\u5165\u6846 \u7ec4\u5408\u952e element.keyCombo(comboString)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#23","title":"2.3\u3001\u6846\u67b6\u5c01\u88c5","text":"\u4ee3\u7801\u793a\u4f8b\uff1a # \u8be6\u7ec6\u4ee3\u7801\u8bf7\u67e5\u770b src/dogtail_utils.py\nclass DogtailUtils:\ndef __init__(self, name=None, description=None):\nself.name = name\nself.description = description\nself.obj = root.application(self.name, self.description)\ndef app_element(self, *args, **kwargs):\n\"\"\"\n \u83b7\u53d6app\u5143\u7d20\u7684\u5bf9\u8c61\n :return: \u5143\u7d20\u7684\u5bf9\u8c61\n \"\"\"\nreturn self.obj.child(*args, **kwargs, retry=False)\ndef element_center(self, element) -> tuple:\n\"\"\"\n \u83b7\u53d6\u5143\u7d20\u7684\u4e2d\u5fc3\u4f4d\u7f6e\n :param element:\n :return: \u5143\u7d20\u4e2d\u5fc3\u5750\u6807\n \"\"\"\n_x, _y, _w, _h = self.app_element(element).extents\n_x = _x + _w / 2\n_y = _y + _h / 2\nreturn _x, _y\n \u6846\u67b6\u63d0\u4f9b\u7684\u63a5\u53e3\u975e\u5e38\u7b80\u6d01\uff0c\u5728\u8c03\u7528\u65f6\uff1a self.dog.element_center(\"\u64ad\u653e\")\n \u8fd9\u6837\u5c31\u80fd\u83b7\u53d6\u5230\u6b64\u5143\u7d20\u7684\u4e2d\u5fc3\u5750\u6807\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_5","title":"\u516d\u3001\u6807\u7b7e\u5316\u7ba1\u7406","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_4","title":"1\u3001\u6807\u7b7e\u8bf4\u660e","text":"\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u811a\u672c ID\uff1a\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c/\u51fd\u6570 ID\uff1b PMS\u7528\u4f8bID\uff1aPMS \u4e0a\u5bf9\u5e94\u7684\u7528\u4f8b ID\uff08\u7528\u4f8b\u5e93 ID\uff09\uff1b \u9ed8\u8ba4\u4f7f\u7528\u7528\u4f8b\u5e93 ID\uff0c\u5bf9\u4e8e\u6682\u65f6\u6ca1\u6709\u4f7f\u7528\u7528\u4f8b\u5e93\u7ba1\u7406\u7528\u4f8b\u7684\u9879\u76ee\uff0c\u53ef\u4ee5\u4f7f\u7528\u4ea7\u54c1\u5e93\u7528\u4f8b ID\uff1b \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1aFUNC\uff08\u529f\u80fd\uff09\u3001PERF\uff08\u6027\u80fd\uff09\u3001STR\uff08\u538b\u529b\uff09\u3001SEC\uff08\u5b89\u5168\uff09\u3001CTS\uff08\u517c\u5bb9\u6027\uff09\u3001API\uff08\u63a5\u53e3\uff09\u3001BASELINE\uff08\u57fa\u7ebf-\u9884\u7559\uff09 \u8bbe\u5907\u7c7b\u578b\uff1aPPL\uff08\u4f9d\u8d56\u5916\u8bbe\u7684\u7528\u4f8b\uff09\u3001COL\uff08\u4f9d\u8d56\u4e3b\u63a7\u673a\u7684\u7528\u4f8b\uff09 \u7528\u4f8b\u6765\u6e90\uff1aBUG\uff08\u7531 Bug \u8f6c\u7684\u7528\u4f8b\uff09 \u4e0a\u7ebf\u5bf9\u8c61\uff1aCICD\uff0c\u8868\u793a\u4e0a\u7ebf\u5230 CICD \u6d41\u6c34\u7ebf\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u53ef\u4e00\u952e\u751f\u6210 case_list.csv \u6587\u4ef6\uff0c\u7528\u4e8e\u5bfc\u5165\u5230\u660e\u9053\u4e91 AT \u7528\u4f8b\u5217\u8868\u4e2d\u63a7\u5236 CICD \u8dd1\u6d4b\u8303\u56f4\uff1b \u6d4b\u8bd5\u7ea7\u522b\uff1aC1 / C2 / C3 / C4\uff0c\u5177\u4f53\u5b9a\u4e49\u53c2\u8003\u6d41\u6c34\u7ebf\u4f7f\u7528\u6307\u5bfc\uff1b \u8df3\u8fc7\u539f\u56e0\uff1askip-XXX\uff0c\u7528\u4e8e\u63a7\u5236\u7528\u4f8b\u662f\u5426\u6267\u884c\uff1b \u786e\u8ba4\u4fee\u590d\uff1afixed-XXX\uff0c\u7528\u4e8e\u6807\u8bb0\u7528\u4f8b\u7684\u4fee\u590d\u72b6\u6001\uff08\u540e\u9762\u8be6\u7ec6\u8bb2\u89e3\u7528\u6cd5\uff09\uff1b \u5e9f\u5f03\u7528\u4f8b\uff1aremoved-\u5df2\u5e9f\u5f03\uff0c\u7528\u4e8e\u6807\u8bb0\u5df2\u7ecf\u5e9f\u5f03\u7684\u7528\u4f8b\uff0c\u6b64\u7528\u4f8b\u6807\u7b7e\u4e0d\u4f1a\u88ab\u6dfb\u52a0\uff0c\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff1b \u793a\u4f8b\uff1a \u811a\u672cID PMS\u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u8bbe\u5907\u7c7b\u578b \u7528\u4f8b\u6765\u6e90 \u4e0a\u7ebf\u5bf9\u8c61 \u6d4b\u8bd5\u7ea7\u522b \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b ... 679537 679537 L1 FUNC PPL CICD C1 skip-XXX fixed-XXX removed-\u5df2\u5e9f\u5f03 ..."},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_4","title":"2\u3001\u64cd\u4f5c\u6b65\u9aa4","text":"2.1\u3001\u5728\u5b50\u9879\u76ee\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u4ee5\u7528\u4f8b\u7684 py \u6587\u4ef6\u9664\u53bb\u9996\u5b57\u7b26\u4e32 \"test_\" \u548c\u7528\u4f8b\u5e8f\u53f7\u540e\u7684\u5b57\u7b26\u4e32\u4f5c\u4e3a csv \u7684\u6587\u4ef6\u540d\u3002 \u4f8b\u5982: \u76f8\u518c\u7684\u7528\u4f8b\u6587\u4ef6\u4e3a test_album_xxx.py\uff0cxxx \u8868\u793a\u7528\u4f8b\u7684ID\uff08\u4e5f\u53ef\u4ee5\u662f\u81ea\u5b9a\u4e49\u7684\u6570\u5b57\u4ee3\u8868\u7528\u4f8b\u5e8f\u53f7\uff09\uff0c\u6b64\u65f6 csv \u6587\u4ef6\u540d\u5c31\u5e94\u4e3a album.csv\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u6240\u6709 csv \u6587\u4ef6\u5efa\u8bae\u653e\u5728\u4e00\u4e2a tags \u76ee\u5f55\u4e0b\u3002 \u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 2.2\u3001\u7b2c\u4e00\u5217\u4e3a\u811a\u672c ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b\u7528\u4f8b\u6807\u7b7e\u53ef\u4ee5\u65e0\u5e8f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_2","title":"3\u3001\u589e\u52a0\u8bf4\u660e","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_1","title":"3.1\u3001\u8df3\u8fc7\u7528\u4f8b","text":"\u4f20\u7edf\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668(@pytest.mark.skip)\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a; \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#311","title":"3.1.1\u3001\u56fa\u5b9a\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 679537 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u7b7e\u5f00\u5934\u4e3a \u201cskip-XXX\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\uff0c\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\u5219\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u7b7e\u4e3a SKIPED\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#312","title":"3.1.2\u3001\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skipif_platform-aarch64&mips64 \u67d0\u4e9b\u7528\u4f8b\u4f1a\u56e0\u4e3a\u4e0d\u540c\u7684\u73af\u5883\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\uff0c\u5e38\u89c1\u7684\u573a\u666f\u4e3a\u5728\u4e0d\u540c\u67b6\u6784\u4e0a\u5224\u65ad\u662f\u5426\u6267\u884c\uff0c\u8df3\u8fc7\u7684\u539f\u56e0\u6807\u7b7e\u4e3a \u201cskipif_platform-\u201d \u52a0\u67b6\u6784\u540d\uff0c\u591a\u4e2a\u67b6\u6784\u4e4b\u95f4\u4f7f\u7528 \u201c&\u201d \u62fc\u63a5\uff1b \u4ee5\u4e0a\u4f8b\u5b50\u4e3a\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u5224\u65ad\u5f53\u524d\u67b6\u6784\u662f\u5426\u4e3a arrch64 \u6216\u8005 mips64\uff0c\u82e5\u662f\uff0c\u5219\u8df3\u8fc7\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u82e5\u5426\u5219\u6267\u884c\u7528\u4f8b\uff1b \u76ee\u524d\u6846\u67b6\u9ed8\u8ba4\u4ec5\u652f\u6301\u67b6\u6784\u7684\u6761\u4ef6\u5224\u65ad\uff0c\u4f46\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u903b\u8f91\u652f\u6301\u81ea\u5b9a\u4e49\u6dfb\u52a0\u3002 \u5728\u9879\u76ee\u76ee\u5f55\u8def\u5f84\u4e0b\u5b58\u5728\u6587\u4ef6 setting/skipif.py\uff0c\u6240\u6709\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u7684\u51fd\u6570\u5199\u5728\u6b64\u6587\u4ef6\u4e2d\u3002 \u9ed8\u8ba4\u67b6\u6784\u5224\u65ad\u4f8b\u5b50\uff1a def skipif_platform(args: str):\n\"\"\"\u5e73\u53f0\u8df3\u8fc7\"\"\"\n_skip_key = args.split(\"&\")\nfor key in _skip_key:\nif GlobalConfig.SYS_ARCH == key:\nreturn True\nreturn False\n \u65b9\u6cd5\u7f16\u5199\u89c4\u8303\uff1a \u65b9\u6cd5\u540d\u5fc5\u987b\u4ee5 skipif \u5f00\u5934\uff1b \u65b9\u6cd5\u5fc5\u987b\u6709\u8fd4\u56de\u7ed3\u679c\u5e76\u4e14\u4e3a\u5e03\u5c14\u503c\uff08True \u4ee3\u8868\u8df3\u8fc7\uff0cFalse \u4ee3\u8868\u4e0d\u8df3\u8fc7\uff09\uff1b \u65b9\u6cd5\u53ea\u80fd\u6709\u4e00\u4e2a\u5165\u53c2\uff1b \u5728 csv \u6587\u4ef6\u8df3\u8fc7\u539f\u56e0\u4e00\u680f\u4e2d\u586b\u5199\u4e3a \u201c{\u51fd\u6570\u540d}-{\u53c2\u6570}\u201d\uff0c\u4f8b\u5982\uff1askipif_platform-aarch64\uff1b\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u4f1a\u4ee5\u7b2c\u4e00\u4e2a \u201c-\u201d \u8fdb\u884c\u5206\u5272\uff0c\u622a\u53d6\u7684\u5de6\u4fa7\u5b57\u7b26\u4e32\u4f5c\u4e3a\u51fd\u6570\u540d\uff0c\u5728 skipif.py \u6587\u4ef6\u4e2d\u67e5\u627e\u662f\u5426\u6709\u540c\u540d\u51fd\u6570\uff0c\u5e76\u5c06\u622a\u53d6\u7684\u53f3\u4fa7\u4f5c\u4e3a\u53c2\u6570\u4f20\u9012\u7ed9\u8be5\u51fd\u6570\uff0c\u901a\u8fc7\u83b7\u53d6\u8be5\u51fd\u6570\u8fd4\u56de\u7684\u5e03\u5c14\u503c\uff0c\u8fd4\u56de True\uff0c\u5219\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u8fd4\u56de False\uff0c\u5219\u6267\u884c\u8be5\u7528\u4f8b\u3002 \u82e5\u51fd\u6570\u9700\u8981\u591a\u4e2a\u53c2\u6570\uff0c\u53ef\u81ea\u5b9a\u4e49\u591a\u4e2a\u53c2\u6570\u4e4b\u95f4\u7684\u8fde\u63a5\u7b26\uff0c\u8fde\u63a5\u7b26\u53f7\u4e0d\u53ef\u4f7f\u7528\u4e0b\u5212\u7ebf\u548c\u9017\u53f7\uff0c\u63a8\u8350\u7edf\u4e00\u4f7f\u7528 & \u7b26\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32","title":"3.2\u3001\u786e\u8ba4\u4fee\u590d","text":"\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7528\u4f8b\u4fee\u590d\u540e\uff0c\u4f46\u4e0d\u80fd\u7acb\u5373\u5220\u9664\u8df3\u8fc7\u539f\u56e0\uff08skip-XXX\uff09\u7684\u7528\u4f8b\uff0c\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u786e\u8ba4\u4fee\u590d\u201d\uff0c\u4f5c\u4e3a\u6807\u8bb0\u8be5\u7528\u4f8b\u662f\u5426\u5df2\u7ecf\u4fee\u590d\uff0c\u56fa\u5b9a\u586b\u5165\u5b57\u6bb5\u4e3a \u201cfixed-\u5df2\u4fee\u590d\u201d\u3002\u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u5373\u4f7f\u540c\u65f6\u6807\u8bb0\u4e86 skip-XXX \u4e5f\u4f1a\u6b63\u5e38\u6267\u884c\u3002 \u793a\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d 679537 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d \u3010\u540c\u65f6\u6807\u8bb0\u4e86skip \u548c fixed\uff0c\u4f46\u4ecd\u7136\u60f3\u8981\u8df3\u8fc7\u7528\u4f8b\u3011 \u5f53 \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u540c\u65f6\u586b\u5165\u540e\uff0c\u547d\u4ee4\u884c\u4f20\u9012\u53c2\u6570 --ifixed yes\uff0c\u5219\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\u8be5\u6761\u7528\u4f8b\u3002 python3 manage.py run --ifixed yes\n \u770b\u5230\u8fd9\u91cc\u6709\u4e9b\u540c\u5b66\u53ef\u80fd\u8981\u95ee\u4e86\uff0c\u6211\u60f3\u6062\u590d\u8df3\u8fc7\u6267\u884c\uff0c\u76f4\u63a5\u628a skip-XXX \u8fd9\u4e00\u5217\u6807\u7b7e\u5220\u6389\u4e0d\u5c31\u597d\u4e86\uff0c\u8fd8\u641e\u4ec0\u4e48\u786e\u8ba4\u4fee\u590d\u5e72\u5565\uff1f \u8fd9\u91cc\u7ed9\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u89e3\u91ca\u4e00\u4e0b\uff1a \uff08\u4ee5\u4e0b\u6d41\u6c34\u7ebf\u6307\u7684\u662f\u6bcf\u65e5\u6784\u5efa\u7684\u6d41\u6c34\u7ebf\uff0c\u8dd1 AT \u7684\u5168\u91cf\u7528\u4f8b\uff09 \u9996\u5148\uff0c\u6d41\u6c34\u7ebf\u4e0a\u8dd1\u7684\u662f AT \u5386\u53f2 Tag\uff0c\u8df3\u8fc7\u7528\u4f8b\u7684\u6807\u7b7e(skip-XXX) \u662f\u5728\u6700\u65b0\u7684\u4ee3\u7801\u4e0a\u63d0\u4ea4\u7684\uff0c\u6211\u4eec\u91c7\u7528\u6700\u65b0\u7684 csv \u6587\u4ef6\u8986\u76d6\u5386\u53f2 csv \u6587\u4ef6\u7684\u8bbe\u8ba1\u6765\u5b9e\u73b0\u4e86\u5bf9\u5386\u53f2 Tag \u4e0a\u7528\u4f8b\u7684\u8df3\u8fc7\uff1b \u7136\u540e\uff0c\u5728\u65e5\u5e38\u8df3\u8fc7\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u540c\u65f6\u4e5f\u5728\u4fee\u590d\u4e00\u4e9b\u7528\u4f8b\uff0c\u4fee\u590d\u540e\u7684\u8fd9\u4e9b\u7528\u4f8b\u5728\u672c\u5730\u8c03\u8bd5\u7684\u65f6\u5019\u6211\u4eec\u4e0d\u5e0c\u671b\u7ee7\u7eed\u8df3\u8fc7\uff0c\u4f46\u662f\u6b64\u65f6\uff0c\u4fee\u590d\u7684\u8fd9\u4e9b\u7528\u4f8b\u53ef\u80fd\u8fd8\u4e0d\u7a33\u5b9a\uff0c\u4e0d\u9002\u5408\u9a6c\u4e0a\u653e\u5230\u6d41\u6c34\u7ebf\u53bb\u8dd1\uff0c\u4e5f\u5c31\u662f\u8bf4\u6d41\u6c34\u7ebf\u4e0a\u6211\u4eec\u662f\u5e0c\u671b\u4ed6\u7ee7\u7eed\u8df3\u8fc7\u7684\uff0c\u56e0\u6b64\uff0c\u54b1\u4e0d\u80fd\u76f4\u63a5\u628a skip-XXX \u5e72\u6389\uff1b \u8fd9\u91cc\u5c31\u77db\u76fe\u4e86\uff0c\u4e00\u4e2a\u9700\u6c42\u662f\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u53e6\u4e00\u4e2a\u9700\u6c42\u53c8\u4e0d\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u600e\u4e48\u529e\u5462\uff1f \u6211\u4eec\u4f7f\u7528\u201c\u786e\u8ba4\u4fee\u590d\u201d\u6765\u6807\u8bb0\u8fd9\u6761\u7528\u4f8b\u5df2\u7ecf\u4fee\u590d\u4e86\uff0c\u8fd9\u6837\u4f60\u672c\u5730\u8c03\u8bd5\u7528\u4f8b\u7684\u65f6\u5019\u8fd9\u6761\u5df2\u4fee\u590d\u7684\u7528\u4f8b\u662f\u4f1a\u6267\u884c\u7684\uff0c\u540c\u65f6\u5728\u6d41\u6c34\u7ebf\u4e0a\u5c06 --ifixed yes \u53c2\u6570\u52a0\u4e0a\uff0c\u90a3\u4e48\u6d41\u6c34\u7ebf\u4e0a\u6267\u884c\u65f6\u8fd9\u6761\u7528\u4f8b\u4ecd\u7136\u662f\u8df3\u8fc7\u7684\u72b6\u6001\uff0c\u540e\u7eed\u4f60\u6253 Tag \u7684\u65f6\u5019\uff0c\u628a \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u7684\u6807\u7b7e\u5168\u90e8\u5220\u6389\u5c31\u53ef\u4ee5\u4e86\u3002 \u8fd9\u5c31\u662f\u201c\u786e\u8ba4\u4fee\u590d\u201d\u8fd9\u4e2a\u6807\u7b7e\u7684\u80cc\u666f\uff0c\u9700\u8981\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u54c1\u4e00\u54c1\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#33","title":"3.3\u3001\u5e9f\u5f03\u7528\u4f8b","text":"\u9488\u5bf9\u67d0\u4e9b\u7528\u4f8b\uff0c\u7531\u4e8e\u9700\u6c42\u53d8\u66f4\uff0c\u73af\u5883\u5f71\u54cd\u6216\u8bc4\u4f30\u4e0d\u518d\u9002\u7528\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u65f6\uff0c\u7528\u4f8b\u9700\u8981\u5e9f\u5f03\uff0c\u5219\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u5e9f\u5f03\u7528\u4f8b\u201d\uff0c\u8be5\u5217\u5b58\u5728 \u201cremoved-{\u5e9f\u5f03\u539f\u56e0}\u201d\uff0c\u5219\u7528\u4f8b\u4e0d\u4f1a\u6267\u884c\u3002 \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d removed-\u5df2\u5e9f\u5f03 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_2","title":"4\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u4e0a\u9762\u4ecb\u7ecd Pytest \u6846\u67b6\u63d0\u4f9b\u7684\u6807\u7b7e\u529f\u80fd mark\uff0c\u4f7f\u7528\u65f6\u9700\u8981\u4e3a\u6bcf\u4e00\u4e2a\u7528\u4f8b\u6dfb\u52a0\u6807\u7b7e\u88c5\u9970\u5668\uff0c\u5219\u64cd\u4f5c\u590d\u6742\uff0c\u53ef\u7ef4\u62a4\u6027\u5dee\uff0c\u5176\u6839\u672c\u95ee\u9898\u5c31\u662f\u6807\u7b7e\u5206\u6563\u5728\u6bcf\u4e00\u6761\u7528\u4f8b\u7684\u88c5\u9970\u5668\u4e0a\uff0c\u96be\u4ee5\u96c6\u4e2d\u7ef4\u62a4\uff1b\u4e8e\u662f\u4e4e\u5c06\u6240\u6709\u6807\u7b7e\u4f7f\u7528 csv \u6587\u4ef6\u8fdb\u884c\u96c6\u4e2d\u7ba1\u7406\uff0c\u5e76\u901a\u8fc7 Pytest \u7684\u94a9\u5b50\u51fd\u6570\uff0c\u8bfb\u53d6 csv \u6587\u4ef6\uff0c\u52a8\u6001\u6dfb\u52a0\u6807\u7b7e\u5230\u7528\u4e2d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5csv","title":"5\u3001CSV\u6587\u4ef6\u683c\u5f0f","text":"\u6b64\u914d\u7f6e\u6587\u4ef6\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u6807\u7b7e\u6570\u636e\uff0c\u4e14\u8981\u65b9\u4fbf\u80fd\u4f7f\u7528 Excel \u6253\u5f00\u8fdb\u884c\u7f16\u8f91\u67e5\u770b\uff0c\u66f4\u91cd\u8981\u7684\u662f\u6211\u4eec\u4e0d\u60f3\u5f15\u5165\u4e09\u65b9\u4f9d\u8d56\uff0cCSV \u6587\u4ef6\u51e0\u4e4e\u662f\u552f\u4e00\u80fd\u6ee1\u8db3\u6240\u6709\u7684\u8981\u6c42\u7684\u6587\u4ef6\u683c\u5f0f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_6","title":"\u4e03\u3001\u65e5\u5fd7\u7cfb\u7edf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_5","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e YouQu \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u64cd\u4f5c\u65b9\u6cd5\u5c01\u88c5\u5199\u6cd5\uff0c\u901a\u5e38\u662f\u8fd9\u6837\u7684\uff1a\u7c7b\u91cc\u9762\u4e00\u4e2a\u51fd\u6570\u53ea\u5305\u542b\u4e00\u4e2a\u64cd\u4f5c\u6216\u591a\u6b21\u8c03\u7528\u7684\u4e00\u7cfb\u5217\u53ef\u5408\u5e76\u7684\u64cd\u4f5c\uff1b \u4f20\u7edf\u7684\u65e5\u5fd7\u8f93\u51fa\u65b9\u5f0f\uff0c\u9700\u8981\u5728\u6bcf\u4e2a\u51fd\u6570\u91cc\u9762\u4e3b\u52a8\u7f16\u5199\u65e5\u5fd7\u8f93\u51fa\u4ee3\u7801 \uff0c\u4f8b\u5982\uff1a class XXXWidget:\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\nlogger.info(\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\")\n...\n# \u7701\u7565\u4ee3\u7801\u90e8\u5206\n \u4e00\u4e2a\u51fd\u6570\u91cc\u9762\u81f3\u5c11\u5305\u542b\u4e00\u6761\u65e5\u5fd7\u4fe1\u606f\uff0c\u5982\u679c\u6bd4\u8f83\u590d\u6742\u64cd\u4f5c\u6b65\u9aa4\uff0c\u53ef\u80fd\u5305\u542b\u591a\u6761\u65e5\u5fd7\u4fe1\u606f\uff1b \u4e00\u4e2a\u5e94\u7528\u542b\u6709\u5927\u91cf\u7684\u64cd\u4f5c\u51fd\u6570\uff0c\u4e5f\u5c31\u662f\u8bf4\u6211\u4eec\u9700\u8981\u5199\u5927\u91cf\u7684\u65e5\u5fd7\u4ee3\u7801\uff1b \u901a\u8fc7\u7ecf\u9a8c\u89c2\u5bdf\uff0c\u6211\u4eec\u53d1\u73b0\uff0c\u51fd\u6570\u8bf4\u660e\u4ee5\u53ca\u51fd\u6570\u64cd\u4f5c\u65e5\u5fd7\uff0c\u5177\u6709\u8f83\u9ad8\u7684\u91cd\u590d\u5ea6\uff08\u4ece\u4e0a\u9762\u7684\u4f8b\u5b50\u4e5f\u53ef\u4ee5\u770b\u51fa\u6765\uff09\uff0c\u56e0\u6b64\u6211\u4eec\u5927\u80c6\u7684\u8bbe\u60f3\uff0c\u80fd\u4e0d\u80fd\u57fa\u4e8e\u6846\u67b6\u6267\u884c\u65f6\uff0c\u81ea\u52a8\u7684\u5c06\u51fd\u6570\u8bf4\u660e\u4f5c\u4e3a\u65e5\u5fd7\u6253\u5370\u51fa\u6765\uff0c\u4ece\u800c\u51cf\u5c11\u5927\u91cf\u65e5\u5fd7\u4ee3\u7801\u91cf\u548c\u91cd\u590d\u7f16\u5199\uff0c\u90a3\u771f\u662f\u5999\u554a~\u3002 \u57fa\u4e8e\u6b64\u201c\u5929\u771f\u201d\u7684\u60f3\u6cd5\uff0c\u6211\u4eec\u8bbe\u8ba1\u51fa\u4e86 youqu \u7684\u65e5\u5fd7\u7cfb\u7edf\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_5","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u6838\u5fc3\u539f\u7406\uff1a \u901a\u8fc7\u7ed9\u7c7b\u52a0\u4e0a\u4e00\u4e2a\u88c5\u9970\u5668 @log\uff0c\u52a8\u6001\u7ed9\u8be5\u7c7b\u4e0b\u6240\u6709\u7684\u51fd\u6570\u53ca\u7236\u7c7b\u51fd\u6570\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668 @_trace\uff0c\u5728\u6b64\u88c5\u9970\u5668\u4e2d\u6211\u4eec\u80fd\u52a8\u6001\u7684\u6355\u83b7\u6240\u8c03\u7528\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff08func.__doc__\uff09\uff0c\u901a\u8fc7\u65e5\u5fd7\u8f93\u51fa\u5668\u5c06\u5176\u8f93\u51fa\u5373\u53ef\u3002 \u5b9e\u73b0\u6b65\u9aa4\uff1a \u901a\u8fc7 inspect.getmembers \u83b7\u53d6\u88ab\u88c5\u9970\u7684\u7c7b\u4e0b\u6240\u6709\u51fd\u6570\uff0c\u5305\u542b\u9759\u6001\u65b9\u6cd5\uff0c\u7c7b\u65b9\u6cd5\uff0c\u5b9e\u4f8b\u65b9\u6cd5\uff1b \u901a\u8fc7 setattr(\u7c7b, \u65b9\u6cd5, _trace\uff09 \u7684\u65b9\u5f0f\uff0c\u7ed9\u7b26\u5408\u6761\u4ef6\u7684\u51fd\u6570\uff0c\u52a8\u6001\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_3","title":"3\u3001\u65e5\u5fd7\u914d\u7f6e","text":"[log_cli]\n;\u65e5\u5fd7\u76f8\u5173\u914d\u7f6e\uff08\u4e0d\u6253\u5370\u6784\u9020\u51fd\u6570\u548c\u9b54\u6cd5\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff09\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = INFO\n# ============= \u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u914d\u7f6e ================\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u5f00\u5934\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7, \u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_STARTSWITH = Assert\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u7ed3\u5c3e\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_ENDSWITH = Widget\n;\u652f\u6301\u7c7b\u540d\u5305\u542b xxx \u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_CONTAIN = ShortCut\n# ==============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_3","title":"4\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u5728\u5e94\u7528\u5e93 widget \u65b9\u6cd5\u5e93\u91cc\u9762\uff0c\u53ea\u9700\u8981\u5728\u51fa\u53e3\u6587\u4ef6\u52a0\u4e0a\u7c7b\u88c5\u9970\u5668\uff0c\u5c31\u53ef\u4ee5\u5b9e\u73b0\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u4e86\uff1b # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6ce8\u610f\uff0c\u662f\u7c7b\u88c5\u9970\u5668\u3002 \u5b9e\u4f8b\uff1a # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\n@classmethod\ndef find_dfm_image(cls, *elements, multiple=False, rate=0.9):\n\"\"\"\n \u67e5\u627e\u56fe\u7247 {{elements}}.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e {{rate}} \u7684\u5750\u6807\n :param elements:\n :param multiple:\n :return:\n \"\"\"\nelement = tuple(map(lambda x: f\"{Config.PIC_RES_PATH}/{x}\", elements))\nreturn cls.find_image(*element, multiple=multiple)\n \u8c03\u7528\u65b9\u6cd5\u65f6\uff1a DfmWidget.find_dfm_image(\"dfm_001\")\n \u81ea\u52a8\u8f93\u51fa\u7684\u65e5\u5fd7\uff1a >> x86_64-uos-6: 02/28 17:48:47 | INFO | logger_utils: [find_dfm_image]: \u67e5\u627e\u56fe\u7247 dfm_001.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e 0.9 \u7684\u5750\u6807\n \u52a0\u4e0a\u88c5\u9970\u5668 @log \u4e4b\u540e\uff0c\u65b9\u6cd5\u5c42\u6240\u6709\u7684\u51fd\u6570\uff08\u5305\u62ec\u5b9e\u4f8b\u65b9\u6cd5\u3001\u7c7b\u65b9\u6cd5\u3001\u9759\u6001\u65b9\u6cd5\uff09\u90fd\u4e0d\u9700\u8981\u518d\u5199\u65e5\u5fd7\u4ee3\u7801\uff0c\u6267\u884c\u7684\u65f6\u5019\u4f1a\u81ea\u52a8\u8f93\u51fa\uff0c\u5e76\u4e14\u6240\u6709\u8c03\u7528\u7684\u65b9\u6cd5\u4f1a\u4ee5 allure.step \u7684\u65b9\u5f0f\uff0c\u5c55\u793a\u5728 allure \u62a5\u544a\u4e2d\uff0c\u5728\u62a5\u544a\u4e2d\u66f4\u80fd\u4e00\u76ee\u4e86\u7136\u7684\u770b\u5230\u7528\u4f8b\u6267\u884c\u6b65\u9aa4\u3002 \u3010\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\u3011 \u901a\u8fc7\u89c2\u5bdf\u524d\u9762\u7684\u4f8b\u5b50\uff0c\u7ec6\u5fc3\u7684\u540c\u5b66\u53ef\u80fd\u8fd8\u53d1\u73b0\u4e86\u4e00\u4e2a\u5c0f\u7ec6\u8282\uff1a\u51fd\u6570\u529f\u80fd\u8bf4\u660e\u4e2d\uff0c\u4e24\u5bf9\u5927\u62ec\u53f7\u4e2d\u7684\u5185\u5bb9 {{elements}} \u4f5c\u4e3a\u53d8\u91cf\u8f93\u51fa\u51fa\u6765\u4e86\uff1b \u6ca1\u9519\uff0c\u8fd9\u5c31\u662f\u6211\u4eec\u53c2\u8003Django \u548c jinja2 \u7684\u6a21\u677f\u8bed\u6cd5\u8bbe\u8ba1\u51fa\u7684\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\uff0c\u4f7f\u7528\u65b9\u6cd5\u5f88\u7b80\u5355\uff0c\u7528\u4e24\u5bf9\u5927\u62ec\u53f7\u628a\u51fd\u6570\u7684\u53c2\u6570\u62ec\u8d77\u6765\uff0c\u8fd9\u6837\u5728\u65e5\u5fd7\u8f93\u51fa\u7684\u65f6\u5019\u5c31\u80fd\u628a\u8c03\u7528\u51fd\u6570\u65f6\u53c2\u6570\u7684\u503c\u8f93\u51fa\u51fa\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_7","title":"\u516b\u3001\u73af\u5883\u90e8\u7f72","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_6","title":"1\u3001\u539f\u5219","text":"YouQu \u7684\u73af\u5883\u4f9d\u8d56\u4e00\u76f4\u575a\u6301 2 \u4e2a\u539f\u5219\uff1a \u6700\u5c0f\u73af\u5883\u4f9d\u8d56\u539f\u5219 \u6709\u4e9b\u540c\u5b66\u5199\u4e00\u4e9b\u529f\u80fd\uff0c\u9996\u5148\u60f3\u5230\u7684\u5c31\u662f\u53bb\u641c\u7d22\u5f15\u64ce\u641c\u4e00\u4e0b\uff0c\u770b\u6709\u6ca1\u6709\u73b0\u6210\u7684\u5de5\u5177\u6216\u8005\u4ee3\u7801\u76f4\u63a5\u80fd\u7528\uff0c\u7f8e\u5176\u540d\u66f0\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\uff0c\u522b\u4eba\u5df2\u7ecf\u9020\u597d\u4e86\u8f6e\u5b50\u54b1\u4eec\u5c31\u4e0d\u8981\u91cd\u590d\u53bb\u9020\u4e86\uff0c\u7136\u540e\u4e00\u5207\u4f3c\u4e4e\u90fd\u53d8\u5f97\u90a3\u4e48\u7684\u7406\u6240\u5e94\u5f53\u3002 \u5f53\u7136\u8fd9\u6837\u505a\u65e0\u53ef\u539a\u975e\uff0c\u6211\u76f8\u4fe1\u6709\u8fd9\u6837\u60f3\u6cd5\u5e76\u4e14\u4e00\u76f4\u8df5\u884c\u8fd9\u6837\u505a\u6cd5\u7684\u540c\u5b66\u4e0d\u5728\u5c11\u6570\uff0c\u4f46\u8fd9\u6837\u505a\u6709\u4e00\u4e2a\u5f88\u4e25\u91cd\u7684\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f60\u5199\u4e00\u4e2a\u5927\u578b\u9879\u76ee\u65f6\uff0c\u4f60\u4f1a\u5f15\u5165\u975e\u5e38\u975e\u5e38\u975e\u5e38\u591a\u7684\u4f9d\u8d56\uff0c\u6bd4\u5982\u8981\u505a\u4e2a\u63a5\u53e3\u8bf7\u6c42\u8981\u7528 requests\u3001\u8bfb\u5199\u4e2a\u6570\u636e\u7528 pandas\u3001\u5199\u4e2a\u8868\u683c\u7528 pyopenxl\u3001\u89e3\u6790\u4e2a\u6587\u672c\u8981\u7528\u8fd9\u4e2a\u90a3\u4e2a\u4e09\u65b9\u5e93 ... \u3002 \u6211\u8ba4\u4e3a\u8fd9\u662f\u975e\u5e38\u4e0d\u597d\u7684\u4e60\u60ef\uff0c\u5728\u5b9e\u73b0\u4e00\u4e2a\u529f\u80fd\u7684\u65f6\u5019\uff0c\u9996\u5148\u6211\u4eec\u5e94\u8be5\u53bb\u60f3\u81ea\u5df1\u600e\u4e48\u6837\u53bb\u5b9e\u73b0\uff0c\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff1b \u5982\u679c\u4f60\u4e0d\u4f1a\uff0c\u4f60\u53ef\u4ee5\u53bb\u5b66\u4e60\u4e09\u65b9\u5e93\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u522b\u4eba\u4e09\u65b9\u5e93\u4e5f\u662f\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\u7684\uff0c\u4e3a\u4ec0\u4e48\u54b1\u4eec\u4e0d\u884c\u5462\uff1b\u5982\u679c\u522b\u4eba\u7684\u4f60\u5b9e\u5728\u662f\u770b\u4e0d\u61c2\uff0c\u60f3\u5c3d\u4e00\u5207\u529e\u6cd5\u786e\u5b9e\u505a\u4e0d\u51fa\u6765\uff0c\u90a3\u518d\u8003\u8651\u5f15\u5165\u8fd9\u4e2a\u4e09\u65b9\u5e93\uff0c\u6211\u8ba4\u4e3a\u8fd9\u6837\u662f\u6ca1\u95ee\u9898\u7684\uff0c\u6bd5\u7adf\u54b1\u4eec\u6bb5\u4f4d\u8fd8\u4e0d\u591f\uff0c\u4f46\u5e0c\u671b\u5c06\u6765\u6709\u4e00\u5929\u6211\u4eec\u53ef\u4ee5\u3002 \u8fd9\u6837\u7684\u505a\u6cd5\u624d\u5e94\u8be5\u662f\u201c\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\u201d\u6b63\u786e\u7684\u64cd\u4f5c\u3002\u4e0d\u4f1a\u6ca1\u5173\u7cfb\uff0c\u770b\u770b\u522b\u4eba\u662f\u600e\u4e48\u5b9e\u73b0\u7684\uff0c\u81ea\u5df1\u518d\u6478\u7d22\u7740\u5199\u51fa\u6765\uff0c\u8fd9\u6837\u81ea\u5df1\u624d\u80fd\u6709\u6240\u63d0\u9ad8\uff0c\u4e0d\u7136\u4f60\u5c31\u53ea\u4f1a\u7528\u522b\u4eba\u7684\u4e1c\u897f\uff1b\u90a3\u4e9b\u5632\u7b11\u3001\u6279\u8bc4\u6211\u4eec\u91cd\u590d\u9020\u8f6e\u5b50\u7684\u4eba\uff0c\u5148\u60f3\u60f3\u81ea\u5df1\u4f1a\u9020\u8f6e\u5b50\u5417\u3002 \u672c\u7740\u81ea\u5df1\u5b9e\u73b0\u80fd\u5b9e\u73b0\u7684\u4e00\u5207\u7684\u539f\u5219\uff0cYouQu \u6846\u67b6\u505a\u5230\u4e86\u975e\u5e38\u5c11\u7684\u73af\u5883\u4f9d\u8d56\uff0c\u800c\u4e14\u6211\u4eec\u4ecd\u5728\u4e0d\u65ad\u52aa\u529b\uff0c\u51cf\u5c11\u73af\u5883\u90e8\u7f72\u7684\u4f9d\u8d56\u3002 \u6700\u5c0f\u4ed3\u5e93\u4f53\u79ef\u539f\u5219 \u5927\u6587\u4ef6\u4e0d\u80fd\u4e0a\u4f20\u5230\u5de5\u7a0b\u91cc\u9762\uff0c\u4fdd\u6301\u6574\u4e2a\u5de5\u7a0b\u7684\u8f7b\u91cf\u5316\uff0c\u8fd9\u6837\u5728\u514b\u9686\u4ee3\u7801\u7684\u65f6\u5019\u624d\u80fd\u975e\u5e38\u5feb\u901f\u65b9\u4fbf\u4f7f\u7528\uff0c\u6211\u4eec\u89c1\u8fc7\u4e00\u4e2a AT \u5de5\u7a0b clone \u5927\u5c0f\u8fbe\u5230\u597d\u51e0\u4e2a G\uff0c\u7b80\u76f4\u4e0d\u53ef\u601d\u8bae\u3002 \u5176\u5b9e\u4ee3\u7801\u6587\u4ef6\u7684\u5927\u5c0f\u662f\u5f88\u5c0f\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u7eaf\u5199\u4ee3\u7801\u968f\u4fbf\u5199\u5de5\u7a0b\u4e5f\u4e0d\u4f1a\u592a\u5927\uff0c\u800c\u6587\u6863\uff08\u5305\u542b\u63d2\u56fe\uff09\u7b49\u8d44\u6e90\u5374\u662f\u5f88\u5360\u7a7a\u95f4\u3002 \u56e0\u6b64\u6211\u4eec\u9009\u62e9\u5c06 YouQu \u7684\u6587\u6863\u5de5\u7a0b\u6d89\u53ca\u5230\u7684\u56fe\u7247\u8d44\u6e90\u90fd\u91c7\u7528\u5916\u94fe\u52a0\u8f7d\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_6","title":"2\u3001\u5b89\u88c5","text":"\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u8fd0\u884c env.sh \u5373\u53ef\u3002 bash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_4","title":"3\u3001\u5b9a\u5236\u4f9d\u8d56","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_2","title":"3.1\u3001\u65b0\u589e\u4f9d\u8d56","text":"\u5982\u679c\u5e94\u7528\u5e93\u8fd8\u9700\u8981\u5176\u4ed6 Python \u4f9d\u8d56\u5e93\uff0c\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a requirement.txt \u6587\u4ef6\uff1b autotest_xxx\n\u251c\u2500\u2500 requirement.txt\n\u251c\u2500\u2500 case ...\n \u91cc\u9762\u5199\u5165\u9700\u8981\u5b89\u88c5\u7684\u4e09\u65b9\u4f9d\u8d56\uff0c\u6bd4\u5982\u50cf\u8fd9\u6837\uff1a # requirement.txt\nPyYAML==6.0 # \u6307\u5b9a\u5b89\u88c5\u67d0\u4e2a\u7248\u672c\nrequests # \u672a\u6307\u5b9a\u7248\u672c\u5219\u5b89\u88c5\u6700\u65b0\u7248\n \u5728\u6267\u884c bash env.sh \u65f6\u4f1a\u4e00\u5e76\u5c06\u5176\u5b89\u88c5\u3002 \u5982\u679c\u591a\u4e2a\u5e94\u7528\u5e93\u90fd\u5b58\u5728 requirement.txt \u6587\u4ef6\uff0c\u6267\u884c env.sh \u65f6\u4f1a\u5c06\u591a\u4e2a requirement.txt \u6587\u4ef6\u4e00\u5e76\u52a0\u8f7d\uff1b\u90a3\u4e48\u4e00\u5b9a\u8981\u6ce8\u610f\u591a\u4e2a requirement.txt \u6587\u4ef6\u53ef\u80fd\u5b58\u5728\u76f8\u540c\u7684\u4f9d\u8d56\u88ab\u6307\u5b9a\u5b89\u88c5\u4e0d\u540c\u7248\u672c\u7b49\u7b49\u517c\u5bb9\u6027\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32_1","title":"3.2\u3001\u88c1\u526a\u4f9d\u8d56","text":"\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0c\u53ef\u80fd\u4f60\u53ea\u9700\u8981\u5b89\u88c5\u4e00\u4e9b\u6700\u6700\u57fa\u7840\u7684\u4f9d\u8d56\uff0c\u5176\u4ed6\u7684\u90fd\u4e0d\u9700\u8981\uff0c\u6bd4\u5982\u7eaf\u63a5\u53e3\u81ea\u52a8\u5316\u7684\u9879\u76ee\uff0c\u5b83\u4e0d\u9700\u8981 UI \u81ea\u52a8\u5316\u76f8\u5173\u7684\u4f9d\u8d56\u3002 \u4f60\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\uff0c\u5b58\u653e\u4e00\u4e2a BASICENV \u7684\u666e\u901a\u6587\u4ef6\uff0c\u91cc\u9762\u4e0d\u9700\u8981\u5199\u4efb\u4f55\u5185\u5bb9\uff0c\u8fd9\u6837\u6267\u884c env.sh \u65f6\uff0c\u53ea\u4f1a\u5b89\u88c5\u6700\u57fa\u7840\u7684\u4f9d\u8d56\u3002 autotest_xxx\n\u251c\u2500\u2500 BASICENV # \u53ef\u4ee5\u4f7f\u7528\uff1atouch BASICENV \u521b\u5efa\u6587\u4ef6\n\u251c\u2500\u2500 case ...\n \u57fa\u7840\u4f9d\u8d56\u4ec5\u5b89\u88c5\u4ee5\u4e0b\u51e0\u4e2a\u5305\uff1a pytest # pytest\npytest-rerunfailures # \u5931\u8d25\u91cd\u8dd1\u63d2\u4ef6\npytest-timeout # \u7528\u4f8b\u8d85\u65f6\u63d2\u4ef6\nallure-pytest # \u751f\u6210 allure \u62a5\u544a\u63d2\u4ef6\nallure.deb # allure \u62a5\u544a\u67e5\u770b\u5de5\u5177\n \u88c1\u526a\u4f9d\u8d56 \u548c \u65b0\u589e\u4f9d\u8d56 \u662f\u4e0d\u51b2\u7a81\u7684\uff0c\u53ef\u4ee5\u540c\u65f6\u4f7f\u7528\u3002 \u6b64\u65b9\u6848\u9ed8\u8ba4\u4e3a\u865a\u62df\u73af\u5883\u90e8\u7f72\uff0c\u5982\u679c\u4f60\u60f3\u76f4\u63a5\u90e8\u7f72\u5728\u672c\u673a\u4e0a\uff1a bash env_dev.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_4","title":"4\u3001\u865a\u62df\u5316\u90e8\u7f72","text":"YouQu\u9ed8\u8ba4\u91c7\u7528\u865a\u62df\u5316\u90e8\u5206\uff0c\u865a\u62df\u5316\u73af\u5883\u5b9e\u9645\u5b89\u88c5\u7684\u4f4d\u7f6e\u662f\u5728 $HOME/.local/share/virtualenvs/youqu-oHTM7l7G \u76ee\u5f55\u4e0b youqu-oHTM7l7G \u6b64\u76ee\u5f55\u540d\u79f0\u524d\u9762\u90e8\u5206\u662f\u4f60\u7684\u4ee3\u7801\u6839\u76ee\u5f55\u7684\u540d\u79f0\uff0c\u540e\u9762\u90e8\u5206\u662f\u751f\u6210\u7684\u968f\u673a\u5b57\u7b26\u4e32\uff1b \u540c\u5b66\u4eec\u5728\u8fdc\u7a0b\u673a\u5668\u4e0a\u5b9a\u4f4d\u95ee\u9898\u7684\u65f6\u5019\uff0c\u5982\u679c\u4f7f\u7528 Pycharm \u8c03\u8bd5\uff0c\u5c31\u5c06\u89e3\u91ca\u5668\u6307\u5b9a\u5230\u8fd9\u4e2a\u76ee\u5f55\u7684\u5c31\u884c\u4e86\uff1b \u5f53\u7136\uff0c\u6211\u4eec\u4e5f\u63d0\u4f9b\u4e86\u672c\u673a\u5f00\u53d1\u73af\u5883\u90e8\u7f72\uff1a bash env_dev.sh\n \u5982\u679c\u4f60\u662f\u672c\u5730\u5f00\u53d1\u73af\u5883\u53ef\u4ee5\u7528\u5b83\uff0c\u533a\u522b\u5c31\u662f\u9a71\u52a8\u6267\u884c\u7684\u65f6\u5019\u4f7f\u7528\uff1apython3 manage.py xxx"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_8","title":"\u4e5d\u3001\u5931\u8d25\u5f55\u5c4f","text":"\u5f55\u5c4f\u5176\u5b9e\u662f\u4e00\u79cd\u89c6\u9891\u5f62\u5f0f\u7684\u65e5\u5fd7\uff0c\u56e0\u4e3a\u5f88\u591a\u65f6\u5019\u6211\u4eec\u5728\u67e5\u770b\u65e5\u5fd7\u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u51c6\u786e\u7684\u5b9a\u4f4d\u5230\u7528\u4f8b\u5931\u8d25\u7684\u5177\u4f53\u539f\u56e0\uff0c\u56e0\u6b64\u7528\u4f8b\u7684\u5f55\u5c4f\u80fd\u8ba9\u6211\u4eec\u770b\u5230\u7528\u4f8b\u5728\u6267\u884c\u8fc7\u7a0b\uff1b \u3010\u4f7f\u7528\u65b9\u6cd5\u3011 \u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u5173\u6ce8 2 \u4e2a\u53c2\u6570\uff1b ;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\u3002\n;\u6ce8\u610f\uff0c\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u4e0d\u80fd\u5c0f\u4e8e\u5931\u8d25\u5f55\u5c4f\u6b21\u6570\uff0c\u5373 RERUN >= RECORD_FAILED_CASE\nRECORD_FAILED_CASE = 1\n \u9ed8\u8ba4\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u662f 1 \u6b21\uff1b RECORD_FAILED_CASE = 1 \u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff1b RECORD_FAILED_CASE = 0 \u8868\u793a\u4e0d\u7ba1\u7528\u4f8b\u6210\u529f\u6216\u5931\u8d25\u90fd\u5f55\u5c4f\uff1b \u5f55\u5c4f\u662f\u8981\u5360\u7528\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u7279\u522b\u662f\u5728\u4e00\u4e9b\u914d\u7f6e\u8f83\u4f4e\u7684\u673a\u5668\u4e0a\u4f1a\u5f88\u660e\u663e\uff0c\u6240\u4ee5\u4f60\u9700\u8981\u8003\u8651\u662f\u5426\u6709\u5fc5\u8981\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1b \u4f7f\u7528 manage.py \u6267\u884c\u7528\u4f8b\u9ed8\u8ba4\u8bfb\u53d6\u5230 globalconfig.ini \u91cc\u9762\u7684\u53c2\u6570\uff0c\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report/record \u76ee\u5f55\u4e0b\u4fdd\u5b58\u5931\u8d25\u7528\u4f8b\u7684\u5f55\u5c4f\u548c\u65ad\u8a00\u7684\u90a3\u4e2a\u65f6\u95f4\u70b9\u7684\u622a\u5c4f\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7\u89c6\u9891\u6587\u4ef6\u770b\u5230\u5931\u8d25\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u90fd\u53d1\u751f\u4e86\u4ec0\u4e48\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#wayland","title":"\u5341\u3001Wayland \u9002\u914d","text":"Wayland \u4e0b\u81ea\u52a8\u5316\u4e3b\u8981\u95ee\u9898\u662f X11 \u4e0b\u7684\u952e\u9f20\u64cd\u4f5c\u65b9\u6cd5\u65e0\u6cd5\u4f7f\u7528\uff0c\u6bd4\u5982 Xdotool\u3001 PyAutoGUI\u3001Xwininfo \u7b49\u7b49\uff1b YouQu \u5728 Wayland \u4e0b\u517c\u5bb9\u9002\u914d\uff0cenv.sh \u5728 Wayland \u4e0b\u6267\u884c\u65f6\u4f1a\u5b89\u88c5\u81ea\u7814\u7684\u952e\u9f20\u64cd\u4f5c\u670d\u52a1\uff08\u53ef\u80fd\u5b58\u5728\u4e00\u4e9b\u4f9d\u8d56\u62a5\u9519\uff0c\u6309\u7167\u6ce8\u91ca\u89e3\u51b3\u5373\u53ef\uff09\uff0c\u6846\u67b6\u6838\u5fc3\u5e93\u4e5f\u9488\u5bf9\u6027\u7684\u505a\u4e86\u9002\u914d\uff0c\u4e0a\u5c42\u7528\u4f8b\u5b8c\u5168\u4e0d\u7528\u5173\u5fc3\u673a\u5668\u662fWayland \u8fd8\u662f X11\uff0c\u6846\u67b6\u4f1a\u6839\u636e\u6267\u884c\u65f6\u72b6\u6001\u81ea\u52a8\u5224\u65ad\u8d70\u4e0d\u540c\u7684\u903b\u8f91\uff1b \u7b80\u5355\u8bb2\u5c31\u662f\uff0c\u5e94\u7528\u5e93\u53ea\u9700\u8981\u7ef4\u62a4\u4e00\u5957\u7528\u4f8b\u811a\u672c\u5373\u53ef\u3002 \u3010\u7528\u4f8b\u517c\u5bb9\u3011 \u56e0\u4e3a Wayland \u4e0b\u6709\u4e9b\u5e94\u7528\u7684\u754c\u9762\u663e\u793a\u548c\u529f\u80fd\u672c\u8eab\u5b58\u5728\u4e00\u4e9b\u5dee\u5f02\uff0c\u7528\u4f8b\u5c42\u53ef\u80fd\u9700\u8981\u5bf9\u8fd9\u90e8\u5206\u7528\u4f8b\u505a\u903b\u8f91\u5224\u65ad\uff0c\u4f7f\u7528\u5168\u5c40\u914d\u7f6e\u91cc\u9762\u7684\u5e38\u91cf\u8fdb\u884c\u903b\u8f91\u7f16\u5199\u5373\u53ef\uff1a from setting.globalconfig import GlobalConfig\n# GlobalConfig.IS_WAYLAND \u83b7\u53d6\u5230\u5f53\u524d\u7684\u663e\u793a\u670d\u52a1\u5668\uff08bool\uff09\n# \u5e94\u7528\u5e93 Config \u7ee7\u627f GlobalConfig\nif Config.IS_WAYLAND:\npass\nif Config.IS_X11:\npass\n \u6bd4\u5982\u7528\u4f8b\u91cc\u9762\u5982\u679c\u65ad\u8a00\u7684\u56fe\u7247\u4e0d\u540c\uff1a if Config.IS_WAYLAND:\nself.assert_image_exist(\"wayland_XXX\")\nelse:\nself.assert_image_exist(\"x11_XXX\")\n \u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u811a\u672c\u5728 Wayland \u548c X11 \u4e0b\u90fd\u53ef\u4ee5\u8dd1\uff0cso easy \u662f\u4e0d\u662f\uff1f\u5b8c\u5168\u6ca1\u5fc5\u8981\u4e13\u95e8\u62c9\u65b0\u5206\u652f\u8fdb\u884c Wayland \u9002\u914d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_9","title":"\u5341\u4e00\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_7","title":"1. \u76ee\u5f55\u7ed3\u6784","text":"\u6267\u884c\u65f6\u4f1a\u5728\u6839\u76ee\u5f55\u4e0b\u52a8\u6001\u751f\u6210 report \u76ee\u5f55\uff0c\u6240\u6709\u7684\u62a5\u544a\u76f8\u5173\u7684\u6587\u4ef6\u4f1a\u7edf\u4e00\u5b58\u653e\u5728\u91cc\u9762\uff0c\u793a\u4f8b\uff1a /report\n \u251c\u2500\u2500 allure # allure\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json\n \u251c\u2500\u2500 allure_html # \u751f\u6210\u7684html\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 index.html \u251c\u2500\u2500 allure_back # allure\u62a5\u544a\u5907\u4efd\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 20221108114823\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json\n \u251c\u2500\u2500 json # json\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 result_deepin-music_20221109134736_1081333.json\n \u251c\u2500\u2500 logs # \u65e5\u5fd7\u6587\u4ef6\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 2022-11-10_debug.log \u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-10_error.log\n \u251c\u2500\u2500 record # \u5f55\u5c4f\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-09\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 15\u65f614\u520609\u79d2_test_music_303_2_autotest.mp4\n \u2514\u2500\u2500 xml # xml\u62a5\u544a\n\u2514\u2500\u2500 autotest_deepin_music-20221109134736.xml\n \u9ed8\u8ba4\u60c5\u51b5\u4e0b\u540c\u65f6\u751f\u6210 html\u3001xml\u3001json\u4e09\u79cd\u5f62\u5f0f\u7684\u62a5\u544a\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_7","title":"2. \u5b9a\u5236\u62a5\u544a","text":"\u6211\u4eec\u5bf9 allure \u62a5\u544a\u8fdb\u884c\u4e86\u4e00\u7cfb\u5217\u7684\u5b9a\u5236\uff1a \u5b9a\u5236 logo\u3001title\u3001\u62a5\u544a\u9ed8\u8ba4\u8bed\u8a00\u4e3a\u4e2d\u6587\uff1b \u52a0\u5165\u4e86\u7528\u4f8b\u65ad\u8a00\u5931\u8d25\u65f6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u4ee5\u53ca\u6b64\u65f6\u56fe\u50cf\u5bf9\u6bd4\u7684\u6a21\u677f\u56fe\u7247\uff1b \u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\uff0c\u4f60\u53ef\u4ee5\u5728 html \u62a5\u544a\u4e2d\u76f4\u63a5\u770b\u5f55\u5236\u7684\u89c6\u9891\uff1b \u52a0\u5165\u4e86 IP \u5730\u5740\u3001\u7cfb\u7edf\u4fe1\u606f\u3001\u955c\u50cf\u7248\u672c\u7b49\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_5","title":"3. \u67e5\u770b\u62a5\u544a","text":" \u672c\u5730\u6267\u884c \u5728 report/allure \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u4e00\u5806\u6587\u672c\u6587\u4ef6\uff0c\u8fd9\u4e9b\u662f allure \u63d2\u4ef6\u751f\u6210\u7684\u62a5\u544a\u6e90\u6570\u636e\uff0c\u6211\u4eec\u5728 report/allure_html \u76ee\u5f55\u4e0b\u7ed9\u4f60\u751f\u6210\u4e86 html \u6587\u4ef6\uff0c\u4f46\u662f\u4f60\u4e0d\u80fd\u76f4\u63a5\u901a\u8fc7\u6d4f\u89c8\u5668\u6253\u5f00 index.html \u6587\u4ef6\uff0c\u56e0\u4e3a allure \u7684\u62a5\u544a\u90fd\u662f\u57fa\u4e8e\u5728\u7ebf\u7684\u670d\u52a1\uff0c\u4f60\u5e94\u8be5\u8fd9\u6837\u6253\u5f00\uff1a allure open report/allure_html\n \u4f7f\u7528 manage.py \u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u5728\u7ec8\u7aef\u7684\u6700\u540e\u4e00\u884c\uff0c\u6211\u4eec\u4f1a\u7ed9\u4f60\u8f93\u51fa\u6253\u5f00\u62a5\u544a\u7684\u547d\u4ee4\uff0c\u76f4\u63a5\u590d\u5236\u5b83\u5728\u7ec8\u7aef\u6267\u884c\u5c31\u53ef\u4ee5\u67e5\u770b\u4e86\uff0c\u50cf\u8fd9\u6837\uff1a \u7ec8\u7aef\u6267\u884c\u547d\u4ee4: allure open /tmp/youqu/report/allure_html \u67e5\u770b\u62a5\u544a \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 Pycharm \u91cc\u9762\u627e\u5230 index.html \u6587\u4ef6\uff0c\u7136\u540e\u53f3\u952e\u9009\u62e9\u6d4f\u89c8\u5668\u6253\u5f00\uff0c\u6216\u8005\u4f60\u53ef\u4ee5\u7528\u4e00\u4e2a http \u670d\u52a1\u6253\u5f00\u3002 \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 report/allure \u76ee\u5f55\u4e0b\u67e5\u770b\u62a5\u544a\uff1a allure serve report/allure\n \u8fdc\u7a0b\u6267\u884c \u8fdc\u7a0b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\uff0c\u4f1a\u5c06\u6240\u6709\u8fdc\u7a0b\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u62a5\u544a\u90fd\u6536\u96c6\u5230 report/allure \u76ee\u5f55\u4e0b\uff0c\u5206\u522b\u6309\u7167\u673a\u5668\u7684 IP \u7b49\u5efa\u4e86\u4e0d\u540c\u7684\u76ee\u5f55\uff0c\u4f60\u53ef\u4ee5\u5728\u8fd9\u4e9b\u76ee\u5f55\u91cc\u9762\u53bb\u67e5\u770b\u5bf9\u5e94\u7684\u6d4b\u8bd5\u62a5\u544a\uff0c\u67e5\u770b\u65b9\u6cd5\u548c\u524d\u9762\u672c\u5730\u6267\u884c\u67e5\u770b\u7684\u65b9\u6cd5\u4e00\u6837\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_10","title":"\u5341\u4e8c\u3001\u9759\u6001\u4ee3\u7801\u626b\u63cf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_8","title":"1. \u63d0\u524d\u89e3\u51b3\u4ee3\u7801\u95ee\u9898","text":"\u4e3a\u4e86\u5e2e\u52a9\u5f00\u53d1\u8005\u7edf\u4e00\u4ee3\u7801\u98ce\u683c\uff0cPython \u793e\u533a\u63d0\u51fa\u4e86 PEP8 \u4ee3\u7801\u7f16\u7801\u98ce\u683c\uff0cPython \u5b98\u65b9\u540c\u65f6\u63a8\u51fa\u4e86\u4e00\u4e2a\u68c0\u67e5\u4ee3\u7801\u98ce\u683c\u662f\u5426\u7b26\u5408 PEP8 \u7684\u5de5\u5177\uff0c\u540d\u5b57\u4e5f\u53eb PEP8\u3002 \u4f46\u662f\uff0cPycharm \u91cc\u9762\u7684 PEP8 \u63d2\u4ef6\u5b9e\u9645\u4e0a\u5e76\u4e0d\u80fd\u53d1\u73b0\u5f88\u591a\u4ee3\u7801\u95ee\u9898\uff0c\u8fd9\u4e9b\u95ee\u9898\u5e76\u4e0d\u4f1a\u5728\u8fd0\u884c\u65f6\u62a5\u9519\uff0c\u56e0\u4e3a\u4ece Python \u8bed\u8a00\u89d2\u5ea6\u5e76\u4e0d\u5173\u5fc3\u8fd9\u4e9b\u95ee\u9898\uff0c\u5728 Pycharm \u7f16\u8f91\u5668\u91cc\u9762\u4f7f\u7528\u5feb\u6377\u952e ctrl + alt + L\uff0c\u6709\u4e00\u70b9\u70b9\u683c\u5f0f\u5316\u7684\u6548\u679c\uff0c\u80fd\u89e3\u51b3\u4e00\u4e9b\u7a7a\u683c\u3001\u6362\u884c\u7b49\u5c0f\u95ee\u9898\u3002 \u8fd9\u91cc\u63a8\u8350\u4e00\u4e2a Python \u793e\u533a\u6d41\u884c\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff1a Black\uff0c\u53f7\u79f0\u4e0d\u59a5\u534f\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff0c\u5b83\u68c0\u6d4b\u5230\u4e0d\u7b26\u5408\u89c4\u8303\u7684\u4ee3\u7801\u98ce\u683c\u76f4\u63a5\u5c31\u5e2e\u4f60\u5168\u90e8\u683c\u5f0f\u5316\u597d\uff0c\u5c31\u662f\u8fd9\u4e48\u521a\uff01 \u5b89\u88c5\uff1a sudo pip3 install black \n \u4f7f\u7528\u65b9\u6cd5\uff1a black ${CheckPath}\n \u4f7f\u7528\u8fd9\u4e2a\u5de5\u5177\u683c\u5f0f\u5316\u4e4b\u540e\uff0c\u4ee3\u7801\u4f1a\u88ab\u81ea\u52a8\u8c03\u6574\uff0c\u521a\u5f00\u59cb\u4f60\u53ef\u80fd\u4f1a\u89c9\u5f97\u8c03\u6574\u5f97\u5f88\u5938\u5f20\uff0c\u6ca1\u5173\u7cfb\u575a\u6301\u770b\uff0c\u4e60\u60ef\u4e4b\u540e\uff0c\u4f60\u4f1a\u89c9\u5f97\u5f88\u4f18\u96c5\uff0c\u6ca1\u9519\uff0c\u8fd9\u5c31\u662f Pythonic Code \u7684\u6838\u5fc3\uff0c\u8bf7\u4fdd\u6301\u4f18\u96c5\uff5e\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_8","title":"2. \u4ee3\u7801\u626b\u63cf\u5de5\u5177","text":"\u4f7f\u7528\u6839\u76ee\u5f55\u4e0b pylint.sh \u626b\u63cf\u4ee3\u7801\uff0c\u5728 report \u76ee\u5f55\u4e0b\u67e5\u770b\u4ee3\u7801\u626b\u63cf\u62a5\u544a\uff0c\u5982\u679c\u6709\u4ee3\u7801\u95ee\u9898\u8bf7\u63d0\u524d\u89e3\u51b3\u4e4b\u540e\u518d\u63d0\u4ea4\u3002 \u6b64\u811a\u672c\u5df2\u7ecf\u4f7f\u7528 Python \u793e\u533a\u6700\u6d41\u884c\u7684\u4ee3\u7801\u626b\u63cf\u5de5\u5177 Pylint \u8fdb\u884c\u4ee3\u7801\u626b\u63cf\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a bash pylint.sh\n \u8fd0\u884c\u4e4b\u540e\u4f1a\u63d0\u793a\u4f60\u8981\u626b\u63cf\u7684\u76ee\u5f55\uff0c\u6bd4\u5982\u8f93\u5165 apps \uff0c\u5219\u4f1a\u626b\u63cf apps \u4e0b\u7684\u6240\u6709 Python \u4ee3\u7801\u3002 \u5728 setting/pylintrc.cfg \u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u76f8\u5173\u914d\u7f6e\uff0c\u626b\u63cf\u5b8c\u6210\u4e4b\u540e\u5728 report/pylints \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u626b\u63cf\u62a5\u544a\u3002 \u4ee3\u7801\u63d0\u4ea4\u9700\u901a\u8fc7 git review \u63d0\u4ea4\u5230 gerrit \uff0c\u4eba\u5de5 Code Review \u901a\u8fc7\u4e4b\u540e\u5408\u5165\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_11","title":"\u5341\u4e09\u3001\u63d0\u4ea4\u4ee3\u7801","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_9","title":"1. \u5b89\u88c5\u4f9d\u8d56","text":"sudo apt install git-review\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_9","title":"2. \u63d0\u4ea4\u6a21\u677f","text":"\u5728 ~ \u76ee\u5f55\u4e0b\u65b0\u5efa\u6587\u4ef6\uff0c\u5e76\u547d\u540d\u4e3a gitcommit_template \u5c06\u4ee5\u4e0b\u5185\u5bb9\u5199\u5165\u6587\u4ef6\u5f53\u4e2d\uff1a # commit type :fix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style(\u98ce\u683c\u4fee\u6539)\u3001refactor(\u91cd\u6784)\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test(\u6d4b\u8bd5) + \u7b80\u5355\u63cf\u8ff0. \u9ed8\u8ba4fix,\u6839\u636e\u60c5\u51b5\u4fee\u6539\nfix: \n\n# \u8be6\u7ec6\u8bf4\u660e\u4ee3\u7801\u7684\u6539\u52a8\uff0c\u5305\u542b\u4ee3\u7801\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u4ee5\u53ca\u4e3a\u4ec0\u4e48\u8fd9\u4e48\u505a\uff0c\u53ef\u80fd\u4f1a\u5f71\u54cd\u54ea\u4e9b\u529f\u80fd\u3002\u5bf9\u4e8e\u4ee3\u7801\u7684\u5ba1\u6838\u8005\uff0c\u9700\u8981\u4ece\u8fd9\u6bb5\u63cf\u8ff0\u4e2d\u80fd\u5b8c\u5168\u7406\u89e3\u4ee3\u7801\u4e2d\u6240\u6709\u6539\u52a8\u7684\u5185\u5bb9\nDescription: \n\n# \u5199\u4e00\u6bb5\u9762\u5411\u4e8e\u4ea7\u54c1\u7684\u603b\u7ed3\u6027\u5185\u5bb9\uff0c\u7528\u4e8e\u81ea\u52a8\u751f\u6210crp\u4e0a\u7684changlog\uff0c\u9700\u8981\u6ce8\u610f\u7684\u4e8b\uff0c\u8fd9\u6bb5\u63cf\u8ff0\u5fc5\u987b\u4ece\u4ea7\u54c1\u7684\u89d2\u5ea6\u8003\u8651\u3002\nLog: \n\n# \u5173\u8054pms\u4e0a\u7684bug\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94bug\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4fee\u590dbug\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Bug: \n\n# \u4fee\u590d github issue \n#Issue: \n\n# \u5173\u8054pms\u4e0a\u7684\u4efb\u52a1\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94\u4efb\u52a1\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4efb\u52a1\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Task: \n \u547d\u4ee4\u884c\u6267\u884c: git config --global commit.template ~/gitcommit_template\n \u6b64\u547d\u4ee4\u5c06\u6a21\u677f\u52a0\u5165\u5230 git \u7684\u63d0\u4ea4\u6a21\u677f\u4e2d\u3002 \u540e\u7eed\u63d0\u4ea4\u7684\u65f6\u5019\u9700\u8981\u5173\u6ce8\u4e00\u4e0b\u51e0\u70b9\uff1a commit type \u5bf9\u5e94\u4e0d\u540c\u7684\u4fee\u6539\u7c7b\u578b\uff1afix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style \uff08\u98ce\u683c\u4fee\u6539\uff09\u3001refactor \uff08\u91cd\u6784\uff09\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test \uff08\u6d4b\u8bd5\uff09 commit type \u5192\u53f7\u540e\u9762\u52a0\u7a7a\u683c\u3002 Description \u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u9700\u8981\u8fdb\u884c\u8be6\u7ec6\u8bf4\u660e\uff0c\u6bd4\u5982\u5bf9\u529f\u80fd\u8fdb\u884c\u5927\u6539\u7b49\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_6","title":"3. \u63a8\u9001\u4ee3\u7801","text":"\u9996\u5148\u6dfb\u52a0 commit \u4fe1\u606f git add \u540e\u9762\u52a0\u6587\u4ef6\u540d\u79f0\n git add . # \u8868\u793a\u6dfb\u52a0\u6240\u6709\u6587\u4ef6\n \u4f7f\u7528\u8fd9\u6761\u547d\u4ee4\u6ce8\u610f\u6709\u4e9b\u4e34\u65f6\u6587\u4ef6\u4e0d\u8981\u63d0\u4ea4\u5230\u4ed3\u5e93\u4e86\u3002 git commit -a\n \u4e4b\u540e\u5728 fix: \u540e\u9762\uff08\u6ce8\u610f\u5192\u53f7\u540e\u9762\u5fc5\u987b\u52a0\u7a7a\u683c\uff0c\u4e0d\u7136\u76f4\u63a5-1\uff09\u5199\u672c\u5730\u63d0\u4ea4\u7684 commit \u4fe1\u606f\uff0c\u7136\u540e\u5c31\u53ef\u4ee5\u63d0\u4ea4\u4ee3\u7801\u4e86 git review branch(\u5f53\u524d\u5206\u652f) -r origin\n \u6700\u597d\u4e00\u6b21 commit\uff0c\u4e00\u6b21 git review \uff0c\u7ecf\u5e38\u6709\u540c\u5b66\u5728\u672c\u5730\u75af\u72c2 commit \u6700\u540e git review \u62a5\u9519\u4e0d\u77e5\u9053\u548b\u56de\u4e8b\u513f\u3002 \u82e5\u4e0d\u60f3\u6bcf\u6b21\u63d0\u4ea4\u90fd\u52a0\u4e0a -r \u9009\u9879\uff0c\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a git config --global gitreview.remote origin \u63d0\u4ea4\u4ee3\u7801\uff0c\u76f4\u63a5\u4f7f\u7528 git review branch<\u76ee\u6807\u5206\u652f>\uff0c\u4f8b\u5982 git review master"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git","title":"4. Git\u6807\u7b7e","text":"Git \u6807\u7b7e\u5b9e\u9645\u4e0a\u662f commit \u7684\u4e00\u4e2a\u522b\u540d\uff0c\u4e3b\u8981\u7528\u4e8e\u7ba1\u7406\u5386\u53f2\u7248\u672c\u3002 \u60f3\u8c61\u4e00\u4e0b\u9886\u5bfc\u8ba9\u4f60\u628a\u4e4b\u524d\u7684\u67d0\u4e2a\u7248\u672c\u7684\u4ee3\u7801\u62c9\u51fa\u6765\u8dd1\uff0c\u4f60\u662f\u4e0d\u662f\u4e56\u4e56\u7684\u53bb\u628a\u6240\u6709\u63d0\u4ea4\u8bb0\u5f55\u62c9\u51fa\u6765\u627e\uff0c\u7136\u540e\u627e\u5230\u90a3\u4e2a\u54c8\u5e0c\u503c\uff0c\u901a\u8fc7\u54c8\u5e0c\u503c\u6765\u68c0\u51fa\u4ee3\u7801\u3002 \u8fd9\u4e00\u5957\u64cd\u4f5c\u4e0b\u6765\u662f\u4e0d\u662f\u5f88\u9ebb\u70e6\uff0c\u8d39\u65f6\u95f4\u8fd8\u4e0d\u4e00\u5b9a\u80fd\u627e\u5f97\u5230\uff0c\u6ca1\u4eba\u80fd\u8bb0\u4f4f\u6bcf\u4e2a\u63d0\u4ea4\u54c8\u5e0c\u503c\u4ee5\u53ca\u8fd9\u6b21\u63d0\u4ea4\u90fd\u6539\u4e86\u54ea\u4e9b\u4ee3\u7801\u3002 \u56e0\u6b64\u7ed9\u63d0\u4ea4\u6253\u4e2a\u6807\u7b7e\uff0c\u5c31\u662f\u628a\u54c8\u5e0c\u503c\u8f6c\u6362\u6210\u4eba\u7c7b\u80fd\u7406\u89e3\u7684\u8bed\u8a00\uff0c\u6bd4\u5982 v1.0\uff0c\u5c31\u53ef\u4ee5\u76f4\u63a5\u901a\u8fc7\u6807\u7b7e\u627e\u5230\u5bf9\u5e94\u7684\u63d0\u4ea4\u3002 \u65b0\u5efa\u6807\u7b7e git tag -a <tagname>\n \u56de\u8f66\u4e4b\u540e\uff0cGit \u4f1a\u6253\u5f00\u4f60\u7684\u7f16\u8f91\u5668\uff0c\u8ba9\u4f60\u5199\u4e00\u53e5\u6807\u7b7e\u6ce8\u89e3\uff0c\u5c31\u50cf\u4f60\u7ed9\u63d0\u4ea4\u5199\u6ce8\u89e3\u4e00\u6837\u3002 \u67e5\u770b\u6240\u6709\u6807\u7b7e git tag -l\n# git tag \u4e5f\u884c\n \u5220\u9664\u6807\u7b7e git tag -d <tagname>\n \u63a8\u9001\u6807\u7b7e\u81f3\u8fdc\u7a0b git push \u547d\u4ee4\u5e76\u4e0d\u4f1a\u4f20\u9001\u6807\u7b7e\u5230\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\uff0c\u5fc5\u987b\u663e\u5f0f\u5730\u63a8\u9001\u6807\u7b7e\u3002 git push origin <tagname>\n \u63a8\u9001\u6240\u6709\u4e0d\u5728\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\u7684\u6807\u7b7e git push origin --tag\n \u5220\u9664\u8fdc\u7a0b\u6807\u7b7e git push origin :refs/tag/<tagname>\n \u540e\u671f\u6253\u6807\u7b7e \u5148\u7528 git log --pretty=oneline \u67e5\u8be2\u63d0\u4ea4\u8bb0\u5f55\uff0c\u83b7\u53d6\u6821\u9a8c\u7801\u3002 git tag -a <tagname> 9fceb02(\u6821\u9a8c\u7801)\n \u68c0\u51fa\u6807\u7b7e git checkout <tagname>\n \u6b64\u65f6\uff0c\u4ed3\u5e93\u4f1a\u5904\u4e8e\u201c\u5206\u79bb\u5934\u6307\u9488\uff08detached HEAD\uff09\u201d\u7684\u72b6\u6001\u3002 \u5728\u201c\u5206\u79bb\u5934\u6307\u9488\u201d\u72b6\u6001\u4e0b\uff0c\u5982\u679c\u4f60\u505a\u4e86\u67d0\u4e9b\u66f4\u6539\u7136\u540e\u63d0\u4ea4\u5b83\u4eec\uff0c\u6807\u7b7e\u4e0d\u4f1a\u53d1\u751f\u53d8\u5316\uff0c \u4f46\u4f60\u7684\u65b0\u63d0\u4ea4\u5c06\u4e0d\u5c5e\u4e8e\u4efb\u4f55\u5206\u652f\uff0c\u5e76\u4e14\u5c06\u65e0\u6cd5\u8bbf\u95ee\uff0c\u9664\u975e\u901a\u8fc7\u786e\u5207\u7684\u63d0\u4ea4\u54c8\u5e0c\u624d\u80fd\u8bbf\u95ee\u3002 \u56e0\u6b64\uff0c\u5982\u679c\u4f60\u9700\u8981\u8fdb\u884c\u66f4\u6539\uff0c\u6bd4\u5982\u4f60\u8981\u4fee\u590d\u65e7\u7248\u672c\u4e2d\u7684\u9519\u8bef\uff0c\u90a3\u4e48\u901a\u5e38\u9700\u8981\u521b\u5efa\u4e00\u4e2a\u65b0\u5206\u652f\uff1a git checkout -b <NewBranchName> <tagname>\n \u65b0\u5206\u652f\u4e0a\u53ef\u4ee5\u8fdb\u884c\u63d0\u4ea4\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_12","title":"\u5341\u56db\u3001\u5e38\u89c1\u95ee\u9898","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_10","title":"1. \u63d0\u4ea4\u4ee3\u7801\u65f6\u63d0\u793a\u90ae\u7bb1\u6216\u8005\u540d\u79f0\u4e0d\u5bf9","text":"\u91cd\u65b0\u914d\u7f6e\u90ae\u7bb1\u6216\u8005\u540d\u79f0\uff0c\u7136\u540e\u91cd\u7f6e\u751f\u6548\uff1a git commit --amend --reset-author\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_10","title":"2. \u600e\u4e48\u56de\u6eda\u5230\u4e4b\u524d\u7684\u7248\u672c","text":"(1)\u67e5\u8be2\u5386\u53f2\u63d0\u4ea4\u8bb0\u5f55 git log\n \u627e\u5230\u4f60\u8981\u56de\u6eda\u7684\u7248\u672c\uff0c\u590d\u5236 hash \u503c\u3002 \u6ce8\u610f\uff1a\u662f commit \u7a7a\u683c\u4e4b\u540e\u7684 hash \u503c\uff0c\u4e4b\u524d\u6709\u540c\u5b66\u590d\u5236\u7684 Change-Id: \u8fd9\u6837\u80af\u5b9a\u62a5\u9519\u3002 (2)\u56de\u6eda\u7248\u672c\uff0c\u4e0d\u6e05\u9664\u4ee3\u7801 git reset --soft ${hash}\n (3)\u56de\u6eda\u7248\u672c\uff0c\u6e05\u9664\u4ee3\u7801\uff0c\u614e\u7528\u54c8 git reset --hard ${hash}\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-f-s-e","title":"3. \u6d4b\u8bd5\u62a5\u544a\u91cc\u9762 F S . E \u662f\u4ec0\u4e48\u610f\u601d","text":"F \u8868\u793a\u5931\u8d25\uff0c. \uff08\u70b9\uff09\u8868\u793a\u901a\u8fc7\uff0cS \u8868\u793a\u8df3\u8fc7\uff0cE \u8868\u793a error \u6709\u62a5\u9519"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git-status","title":"4. \u89e3\u51b3 git status \u4e2d\u6587\u663e\u793a\u7684\u95ee\u9898","text":"git config --global core.quotePath false\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5-apps","title":"5. apps \u76ee\u5f55\u4e0b\u989c\u8272\u6709\u4e9b\u662f\u9ec4\u8272\u7684","text":"\u5728 Pycharm \u4e2d apps \u76ee\u5f55\u4e0b\u5e94\u7528\u5e93\u6587\u4ef6\u662f\u9ec4\u8272\u7684\uff0c\u7f16\u8f91\u5668\u8bc6\u522b\u4e0d\u5230\u4ee3\u7801\u65b0\u589e\u548c\u4fee\u6539\uff1b \u7531\u4e8e\u793e\u533a\u7248 Pycharm \u4e0d\u80fd\u52a8\u6001\u8bc6\u522b\u591a\u4ed3\u5e93\uff0c\u9700\u8981\u5728 setting \u91cc\u9762\u624b\u52a8\u6ce8\u518c\uff0c\u64cd\u4f5c\u6b65\u9aa4\uff1a File \u2014> Settings \u2014> Version Control \u2014> \u70b9 + \u53f7 \u2014> Directory \u9009\u4e2d\u5e94\u7528\u5e93\u5de5\u7a0b\u76ee\u5f55 \u2014> VCS \u9009\u4e2d Git \u2014> Apply \u5982\u6b64\u5c31\u53ef\u4ee5\u4e86\u3002 \u4e13\u4e1a\u7248 Pycharm \u4e0d\u5b58\u5728\u8fd9\u4e2a\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#6-envsh-r","title":"6. \u6267\u884c env.sh \u62a5\u9519 $'\\r':\u672a\u627e\u5230\u547d\u4ee4","text":"\u51fa\u73b0\u8fd9\u4e2a\u95ee\u9898\u4f60\u5e94\u8be5\u662f\u5728 windows \u4e0a\u6253\u5f00\u6216\u7f16\u8f91\u8fc7 env.sh \u811a\u672c\uff0cwindows\u4e0b\u7684\u6362\u884c\u662f\u56de\u8f66\u7b26+\u6362\u884c\u7b26\uff0c\u4e5f\u5c31\u662f\\r\\n\uff0c\u800c Linxu \u4e0b\u662f\u6362\u884c\u7b26 \\n\uff0cLinux \u4e0b\u4e0d\u8bc6\u522b \\r\uff0c\u56e0\u6b64\u62a5\u9519\u3002 \u89e3\u51b3\u65b9\u6848\uff1a # \u5c06 \\r \u66ff\u6362\u4e3a\u7a7a\nsudo sed -i 's/\\r//' env.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#7","title":"7.\u600e\u6837\u4e3a\u5355\u72ec\u67d0\u4e00\u6761\u7528\u4f8b\u914d\u7f6e\u6267\u884c\u8d85\u65f6\u65f6\u95f4","text":"\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u5982\u4e0b\uff1a @pytest.mark.timeout(300) # \u5355\u4f4d\u79d2\ndef test_xxx_001():\npass\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#8-youqu","title":"8. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u6240\u6709\u4ee3\u7801\uff0c\u5305\u542b\u5b50\u4ed3\u5e93","text":"\u524d\u7f6e\u6761\u4ef6\uff1a\u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 # \u7b2c\u4e00\u6b21\u5b58\u50a8\u5bc6\u7801\uff0c\u63d0\u4f9b\u540e\u9762\u62c9\u4ee3\u7801(gerrit: ldap\u8d26\u53f7\u548c\u5bc6\u7801\uff0cgit\u62c9\u53d6\u7b2c\u4e00\u6b21\u8f93\u5165\u4fdd\u5b58\uff0c\u540e\u9762\u76f4\u63a5\u4f7f\u7528)\ngit config --global credential.helper store\n\n# \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\uff0c\u5e76\u9012\u5f52\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\" --recursive\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#9-youqu","title":"9. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\u6307\u5b9a\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u524d\u7f6e\u6761\u4ef6\uff1a \u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 \u5df2\u5b58\u50a8\u8bbf\u95ee\u5bc6\u7801 # \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\"\n# \u6307\u5b9a\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ncd youqu\ngit submodule update --init apps/autotest_xxx_xxx\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#10-youqu","title":"10. \u5982\u4f55\u66f4\u65b0 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\uff0c\u6240\u6709\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u66f4\u65b0\u6240\u6709\u5b50\u4ed3\u5e93\u4ee3\u7801 cd youqu\ngit pull & git submodule foreach git pull\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#11-youqu-master-detached-head","title":"11. \u5982\u4f55\u4fee\u590d YouQu \u6240\u6709\u5b50\u4ed3\u5e93 master \u5206\u652f\u6e38\u79bb\u5934\uff08detached head\uff09","text":"\u4fee\u590d\u6240\u6709\u5b50\u4ed3\u5e93\u9ed8\u8ba4master \u5206\u652f\u6e38\u79bb\u5934 cd youqu\ngit submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/","title":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212 \u5206\u7c7b\uff1a/ \u67b6\u6784\u5e08\uff1a/ \u76ee\u6807\uff1a \u5e94\u7528 AT \u67b6\u6784\u5de5\u7a0b\u5316\uff0c\u53c2\u8003\u6027\u80fd\u81ea\u52a8\u5316\u5de5\u7a0b\u5b8c\u6210\u5de5\u7a0b\u5316\u6539\u9020\u3002 \u5e94\u7528\u95f4\u7528\u4f8b\u89e3\u8026\uff0c\u89e3\u9664\u6240\u6709\u4ea4\u53c9\u8c03\u7528\u7684\u65b9\u6cd5\uff0c\u5404\u5e94\u7528\u80fd\u8ddf\u968f\u81ea\u8eab\u8fed\u4ee3\u5468\u671f\u72ec\u7acb\u7ef4\u62a4 AT \u7528\u4f8b\u3002 \u5b8c\u6210\u516c\u5171\u65b9\u6cd5\u7684\u62bd\u53d6\u6574\u5408\uff0c\u5f62\u6210\u4e00\u5957\u72ec\u7acb\u4e8e\u5e94\u7528\u95f4\u7684\u516c\u5171\u65b9\u6cd5\u5e93\uff0c\u5404\u5e94\u7528\u65b9\u6cd5\u91cc\u9762\u4e0d\u5b58\u5728\u88ab\u591a\u4e2a\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\u3002 \u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u4e3a\u5c06\u6765\u9002\u914d\u66f4\u591a\u7684 AT \u8fd0\u7528\u573a\u666f\u63d0\u4f9b\u652f\u6491\uff0c\u539f\u5219\u4e0a\u53ef\u5b9e\u73b0\u65e0\u9650\u6269\u5c55\uff0c\u5728\u6bcf\u65e5\u6784\u5efa\u548c\u6301\u7eed\u96c6\u6210\u6d41\u7a0b\u843d\u5730\u4f7f\u7528\u3002 \u4ee3\u7801\u89c4\u8303\u95ee\u9898\u6e05\u96f6\uff0c\u7b26\u5408 Shell Check\u3001Pylint\u3001\u7cfb\u7edf\u90e8\u76f8\u5173\u7f16\u7801\u89c4\u8303\u8981\u6c42\u3002 \u610f\u4e49\uff1a \u7edf\u4e00\u6210\u7814 AT \u67b6\u6784\u8bbe\u8ba1\u601d\u8def\uff0c\u6d88\u9664 AT \u4ee3\u7801\u5b9e\u73b0\u548c\u7ef4\u62a4\u4e0a\u53ef\u80fd\u51fa\u73b0\u7684\u5206\u6b67\uff0c\u6539\u5584\u5386\u53f2 AT \u65e0\u5de5\u7a0b\u5316\u8bbe\u8ba1\u7684\u7f3a\u9677\uff0c\u63d0\u9ad8\u67b6\u6784\u4e13\u4e1a\u6027\u3002 \u5404\u5e94\u7528 AT \u4ee3\u7801\u76f8\u4e92\u72ec\u7acb\uff0c\u5951\u5408\u5e94\u7528\u72ec\u7acb\u53d1\u5e03\u7279\u6027\uff0c\u53ef\u652f\u6301\u8fed\u4ee3\u671f\u95f4\u72ec\u7acb\u65b0\u589e\u3001\u7ef4\u62a4\u548c\u6267\u884c\u3002 \u65b9\u6cd5\u8c03\u7528\u903b\u8f91\u5f97\u5230\u7b80\u5316\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u66f4\u9ad8\u6548\uff1b\u516c\u5171\u5e93\u62bd\u53d6\uff0c\u51cf\u5c11\u65b9\u6cd5\u91cd\u590d\u7f16\u5199\uff0c\u63d0\u9ad8\u4ee3\u7801\u5229\u7528\u7387\uff1b\u5e73\u5747\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u4ece40\u5206\u949f\u964d\u4f4e\u81f330\u5206\u949f\uff0c\u65e5\u4ea7\u51fa\u7528\u4f8b\u4ece12\u6761/\u5929\u63d0\u5347\u81f316\u6761/\u5929\u3002 \u53ef\u7075\u6d3b\u652f\u6491\u4e0d\u540c\u7684\u81ea\u52a8\u5316\u8fd0\u7528\u573a\u666f\uff0c\u5982 CI\u3001\u5192\u70df\u6d4b\u8bd5\u3001\u96c6\u6210\u6d4b\u8bd5\u3001\u56de\u5f52\u6d4b\u8bd5\u3001\u4e13\u9879\u6d4b\u8bd5\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_2","title":"\u4e00\u3001\u80cc\u666f\u4ecb\u7ecd","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1","title":"1\u3001\u73b0\u6709\u67b6\u6784\u4ecb\u7ecd","text":"\u73b0\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u6574\u4f53\u5206\u4e3a\u4e09\u5c42\uff1a\u7528\u4f8b\u5c42\uff08\u4e1a\u52a1\u903b\u8f91\u5c42\uff09\u3001\u4e2d\u95f4\u5c42\uff08\u5143\u7d20\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff09\u3001\u6838\u5fc3\u5c42\uff08\u5e95\u5c42\u529f\u80fd\u5e93\u5c42\uff09\u3002 \u7528\u4f8b\u5c42\uff1a\u5373\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4e13\u6ce8\u4e8e\u4e1a\u52a1\u529f\u80fd\u903b\u8f91\uff0c\u4e0d\u5173\u5fc3\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\uff1b \u4e2d\u95f4\u5c42\uff1a\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff0c\u6bcf\u4e2a\u65b9\u6cd5\u5747\u5bf9\u5e94\u4e00\u4e2a\u5143\u7d20\u7684\u4e00\u4e2a\u5177\u4f53\u64cd\u4f5c\uff0c\u4e5f\u53ef\u4ee5\u662f\u591a\u4e2a\u64cd\u4f5c\u7684\u7ec4\u5408\u64cd\u4f5c\uff0c\u4e2d\u95f4\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u7528\u4f8b\u5c42\uff0c\u5177\u6709\u53ef\u6269\u5c55\u6027\u548c\u590d\u7528\u6027\uff1b \u6838\u5fc3\u5c42\uff1a\u4e3b\u8981\u5c01\u88c5\u7684\u5e95\u5c42\u529f\u80fd\u5b9e\u73b0\uff0c\u6b64\u5c42\u5728\u6846\u67b6\u4e2d\u63d0\u4f9b\u4e00\u4e9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u529f\u80fd\u6a21\u5757\u76f8\u5bf9\u72ec\u7acb\uff0c\u6838\u5fc3\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u64cd\u4f5c\u5c42\uff0c\u6bd4\u5982\uff1a\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7 UI \u5750\u6807\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u952e\u9f20\u64cd\u4f5c\u7684\u57fa\u7840\u65b9\u64cd\u4f5c\u6a21\u5757\u3001Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757\u3001\u6587\u4ef6\u7684\u589e\u5220\u6539\u67e5\u64cd\u4f5c\u6a21\u5757\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2","title":"2\u3001\u81ea\u52a8\u5316\u7684\u5e94\u7528","text":"2.1\u3001CI \u6d41\u7a0b \u6bcf\u65e5\u6784\u5efa\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u7814\u53d1\u6bcf\u65e5\u63d0\u4ea4\u7684\u4ee3\u7801\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u73ed\u4e4b\u540e\u4f1a\u5c06\u5404\u5e94\u7528\u8fdb\u884c\u6253\u5305\uff0c\u7136\u540e\u5728\u6d4b\u8bd5\u673a\u4e0a\u5b89\u88c5\u66f4\u65b0 deb \u5305\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u5e94\u7528\u63d0\u4ea4\u96c6\u6210\u7684\u7248\u672c\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u8f7d\u6700\u65b0\u7684 ISO \u8fdb\u884c PXE \u90e8\u7f72\uff0c\u7136\u540e\u6d4b\u8bd5\u673a\u5b89\u88c5\u6700\u65b0\u7684\u955c\u50cf\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 2.2\u3001\u9a8c\u6536\u6d4b\u8bd5 \u5728\u5404\u9a8c\u6536\u8282\u70b9\u8fdb\u884c\u81ea\u52a8\u5316\u9a8c\u6536\uff0c\u76ee\u524d\u7684\u7b56\u7565\u662f\u5168\u7528\u4f8b\u8986\u76d6\u5168\u67b6\u6784\u3002 2.3\u3001\u56de\u5f52\u6d4b\u8bd5 \u56de\u5f52\u6d4b\u8bd5\u4eca\u5e74\u89c4\u5212\u5efa\u8bbe\u4e2d\uff0c\u65e8\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u6267\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\uff0c\u51cf\u5c11\u529f\u80fd\u6d4b\u8bd5\u7684\u91cd\u590d\u52b3\u52a8\u529b\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3","title":"3\u3001\u5b58\u5728\u7684\u95ee\u9898","text":" \u5404\u5e94\u7528\u4e4b\u95f4\u5b58\u5728\u8026\u5408 \u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u521d\u671f\uff0c\u6240\u6709\u5e94\u7528\u662f\u6574\u4f53\u53d1\u5e03\uff0c\u6211\u4eec\u662f\u5c06\u6240\u6709\u5e94\u7528\u770b\u6210\u662f\u4e00\u4e2a\u6574\u4f53\uff0c\u5404\u5e94\u7528\u4f5c\u4e3a\u5176\u4e2d\u7684\u4e00\u4e2a\u6a21\u5757\uff0c\u6240\u4ee5\u5b58\u5728\u5e94\u7528\u95f4\u65b9\u6cd5\u4ea4\u53c9\u8c03\u7528\u7684\u95ee\u9898\uff0c\u8fd9\u6837\u4ece\u6700\u521d\u7684\u8bbe\u8ba1\u6765\u8bb2\u786e\u5b9e\u80fd\u591f\u51cf\u5c11\u91cd\u590d\u4ee3\u7801\u7684\u7f16\u5199\u3002\u4f46\u662f\u73b0\u5728\u5e94\u7528\u8d70\u72ec\u7acb\u53d1\u5e03\uff0c\u5404\u5e94\u7528\u90fd\u6709\u81ea\u5df1\u7684\u8fed\u4ee3\u8282\u594f\uff0c\u5728\u65b0\u9700\u6c42\u5feb\u901f\u53d8\u5316\u7684\u8fc7\u7a0b\u4e2d\uff0c\u81ea\u52a8\u5316\u7ef4\u62a4\u53d8\u5f97\u5f02\u5e38\u56f0\u96be\uff0c\u539f\u56e0\u5c31\u662f\u81ea\u52a8\u5316\u9879\u76ee\u91cc\u9762\u5404\u4e2a\u5e94\u7528\u7684\u6709\u6bd4\u8f83\u591a\u7684\u8026\u5408\u5173\u7cfb\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u8fdb\u884c\u89e3\u8026\uff0c\u4ee5\u9002\u5e94\u5e94\u7528\u4e0d\u540c\u7684\u8fed\u4ee3\u5468\u671f\u3002 \u65e0\u6cd5\u7cbe\u51c6\u7684\u5212\u5206\u7528\u4f8b\u8303\u56f4 \u7528\u4f8b\u6267\u884c\u7684\u8303\u56f4\u4e0d\u591f\u7cbe\u51c6\uff0c\u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u4e3b\u8981\u901a\u8fc7\u7528\u4f8b\u7684\u5173\u952e\u8bcd core\uff08\u6838\u5fc3\uff09\u6765\u533a\u5206\u7528\u4f8b\u662f\u5426\u4e3a\u6838\u5fc3\u7528\u4f8b\uff0c\u4f46\u662f\u8fd9\u6837\u7684\u533a\u5206\u592a\u5bbd\u6cdb\u4e86\uff0c\u4e0d\u80fd\u9002\u5e94\u81ea\u52a8\u5316\u6d4b\u8bd5\u5728\u591a\u573a\u666f\u4e0b\u7684\u5e94\u7528\u3002\u5f88\u591a\u573a\u666f\u4e0b\u6211\u4eec\u8fd8\u9700\u8981\u6839\u636e\u7528\u4f8b\u7684\u7b49\u7ea7\u3001\u7528\u4f8b\u7684\u7c7b\u578b\u3001\u7528\u4f8b\u6765\u6e90\u7b49\u7b49\uff0c\u4e0d\u540c\u7684\u7ef4\u5ea6\u6765\u6311\u9009\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u5173\u952e\u5b57\u9700\u8981\u4eba\u5de5\u4e00\u6761\u6761\u7684\u6539\uff0c\u8d39\u65f6\u8d39\u529b\uff0c\u800c\u4e14\u4e0d\u597d\u7ef4\u62a4\u3002 \u53d7\u65b0\u9700\u6c42\u5f71\u54cd\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u597d\u7ef4\u62a4 \u76ee\u524d\u9700\u8981\u8df3\u8fc7\u7684\u7528\u4f8b\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684\u7528\u4f8b\u811a\u672c\u91cc\u9762\uff0c\u6dfb\u52a0\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\uff0c\u540e\u7eed\u89e3\u9664\u8df3\u8fc7\u7684\u65f6\u5019\u53c8\u9700\u8981\u627e\u5230\u8fd9\u6761\u811a\u672c\uff0c\u5220\u6389\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\u3002\u5728\u8df3\u8fc7\u7528\u4f8b\u8f83\u591a\u7684\u60c5\u51b5\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u96be\u5ea6\u3002 \u7f16\u5199\u7528\u4f8b\u65f6\u903b\u8f91\u6bd4\u8f83\u590d\u6742\uff0c\u9700\u8981\u8c03\u7528\u591a\u4e2a\u5e94\u7528\u7684\u65b9\u6cd5\u6a21\u5757\u3002 \u6846\u67b6\u6269\u5c55\u6027\u4e0d\u8db3\uff0c\u65e0\u6cd5\u6574\u5408\u6027\u80fd\u81ea\u52a8\u5316\u3001\u538b\u6d4b\u81ea\u52a8\u5316\u3001\u5b89\u5168\u81ea\u52a8\u5316\u7b49\u4e13\u9879\u6d4b\u8bd5\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_3","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u4e3a\u89e3\u51b3\u73b0\u6709\u95ee\u9898\uff0c\u9002\u5e94\u4e0d\u65ad\u4e30\u5bcc\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u66f4\u597d\u7684\u53d1\u6325\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4f5c\u7528\uff0c\u9700\u8981\u5bf9\u81ea\u52a8\u5316\u67b6\u6784\u53ca\u5404\u529f\u80fd\u6a21\u5757\u8fdb\u884c\u91cd\u65b0\u8bbe\u8ba1\u89c4\u5212\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_1","title":"1\u3001\u67b6\u6784\u8bbe\u8ba1","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_1","title":"2\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u6846\u67b6\u7684\u8fd0\u884c\u903b\u8f91\uff1a\u901a\u8fc7\u6838\u5fc3\u5c42\u63d0\u4f9b\u4e00\u4e2a\u57fa\u7840\u80fd\u529b\uff0c\u4e1a\u52a1\u5c42\u6839\u636e\u5b9e\u9645\u4e1a\u52a1\u9700\u6c42\uff08\u6d4b\u8bd5\u7528\u4f8b\uff09\u52a8\u6001\u52a0\u8f7d\u6838\u5fc3\u5c42\uff0c\u6267\u884c\u5165\u53e3\u52a0\u8f7d\u76f8\u5e94\u7684\u7528\u4f8b\u96c6\u5e76\u63a7\u5236\u6267\u884c\uff0c\u5e94\u7528\u5c42\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u9700\u6c42\uff0c\u901a\u8fc7\u76f8\u5e94\u7684\u914d\u7f6e\u9879\u8fdb\u884c\u914d\u7f6e\uff0c\u4ece\u800c\u89e6\u53d1\u81ea\u52a8\u5316\u6d4b\u8bd5\u4efb\u52a1\u3002 \u6838\u5fc3\u5c42\uff1a\u57fa\u672c\u4fdd\u6301\u4e0d\u53d8\uff0c\u90e8\u5206\u6a21\u5757\u4f1a\u6d89\u53ca\u5230\u65b0\u529f\u80fd\u5f00\u53d1\uff0c\u6838\u5fc3\u5c42\u5404\u529f\u80fd\u6a21\u5757\u4fdd\u6301\u72ec\u7acb\u6027\uff0c\u63d0\u4f9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u4f9b\u4e0a\u5c42\u8c03\u7528\uff1b \u5e95\u5c42\u6838\u5fc3\u6a21\u5757\u5305\u62ec\uff1a \u56fe\u50cf\u8bc6\u522b\u6a21\u5757 UI \u5b9a\u4f4d\u6a21\u5757 Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757 \u5c5e\u6027\u5b9a\u4f4d\u6a21\u5757 \u65e5\u5fd7\u6a21\u5757 \u952e\u9f20\u64cd\u4f5c\u6a21\u5757 \u6587\u4ef6\u64cd\u4f5c\u6a21\u5757 \u5f55\u5c4f\u6a21\u5757 \u81ea\u5b9a\u4e49\u65ad\u8a00\u6a21\u5757 \u7528\u4f8b\u6267\u884c\u6a21\u5757 PXE \u88c5\u673a\u6a21\u5757 \u952e\u9f20\u4fe1\u53f7\u6a21\u62df\u6a21\u5757 OCR \u6a21\u5757 \u4e1a\u52a1\u5c42\uff1a\u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e94\u7528\u5185\u5305\u542b\u591a\u4e2a\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5982\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7b49\uff0c\u540e\u7eed\u53ef\u4ee5\u6839\u636e\u9700\u8981\u5ac1\u63a5\u8fdb\u6765\u3002\u5176\u4e2d\u529f\u80fd\u6d4b\u8bd5\u8bbe\u8ba1\u601d\u8def\uff1a \u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e76\u5c06\u6d4b\u8bd5\u6570\u636e\u548c\u6d4b\u8bd5\u8d44\u6e90\u6574\u5408\u8fdb\u6765\uff0c\u589e\u52a0\u7528\u4f8b\u6807\u7b7e csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ed9\u6bcf\u6761\u7528\u4f8b\u6253\u6807\u7b7e\u3002 \u5404\u6807\u7b7e\u6240\u4f7f\u7528\u5bf9\u5e94\u7684\u5b57\u6bb5\u540d\u79f0\uff0c\u4f7f\u7528 csv \u6587\u4ef6\u7ef4\u62a4\u7528\u4f8b\u4e0e\u6807\u7b7e\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u5bf9\u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u53ef\u4ee5\u7ec4\u5408\u5176\u4e2d\u7684\u6807\u7b7e\u800c\u4ece\u9a71\u52a8\u5bf9\u5e94\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\uff0c\u517c\u5bb9\u73b0\u6709\u7528\u4f8b\u6807\u7b7e\uff0c\u4e14\u652f\u6301\u7528\u4f8b\u6807\u7b7e\u53ef\u6269\u5c55\uff1b \u4f7f\u7528 csv \u683c\u5f0f\u6587\u4ef6\u53ef\u4ee5\u65b9\u4fbf\u7684\u4f7f\u7528 Excel \u8868\u683c\u6253\u5f00\u8fdb\u884c\u7f16\u8f91\uff0c\u540c\u65f6\u7531\u4e8e csv \u6587\u4ef6\u5b9e\u9645\u662f\u4ee5\u90fd\u597d\u5206\u9694\u7684\u6587\u672c\u6587\u4ef6\uff0c\u4ee3\u7801\u4e2d\u53ef\u4ee5\u5728\u4e0d\u4f9d\u8d56\u4e09\u65b9\u5e93\u7684\u60c5\u51b5\u4e0b\u65b9\u4fbf\u5feb\u901f\u7684\u89e3\u6790\u5b83\uff0c\u53ef\u64cd\u4f5c\u6027\u548c\u53ef\u7ef4\u62a4\u6027\u8f83\u9ad8\u3002 \u5404\u4e2a\u5e94\u7528\u4e4b\u95f4\uff0c\u7528\u4f8b\u3001\u65b9\u6cd5\u3001\u6807\u7b7e\u548c\u8d44\u6e90\u90fd\u662f\u76f8\u4e92\u72ec\u7acb\u7684\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u7528\u4f8b\u65f6\u53ea\u9700\u8981\u81ea\u5df1\u5e94\u7528\u4e0b\u7684\u65b9\u6cd5\u548c\u516c\u5171\u5e93\u5373\u53ef\u3002 \u7ed3\u6784\u4e3e\u4f8b\uff1a .\n\u251c\u2500\u2500 apps\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_album # \u5e94\u7528\u540d (\u7528\u4e0b\u5212\u7ebf\u8fde\u63a5\u662f Python \u7f16\u7801\u89c4\u8303)\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_assert # \u65ad\u8a00\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_function_tag.csv # \u7528\u4f8b\u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 asan_cases # \u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases # \u529f\u80fd\u6d4b\u8bd5\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 res # \u6d4b\u8bd5\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config # \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_widget # \u5e94\u7528\u81ea\u5df1\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_widget # \u65b9\u6cd5\u57fa\u7c7b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 other_widget # \u8c03\u7528\u5176\u4ed6\u5e94\u7528\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_camera\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases\n\u2502\u00a0\u00a0 \u2502\u00a0 ...\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 public_widget # \u516c\u5171\u65b9\u6cd5\u5e93\n\u251c\u2500\u2500 config # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n...\n config \u914d\u7f6e\u6a21\u5757\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u76f8\u5e94\u914d\u7f6e\uff0c\u6d4b\u8bd5\u540c\u5b66\u53ef\u4ee5\u6839\u636e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5728 config \u91cc\u9762\u8fdb\u884c\u914d\u7f6e\u3002 \u5168\u5c40\u914d\u7f6e\uff1a \u6267\u884c\u4e00\u4e2a\u6216\u591a\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff1a\u5728 pattern \u91cc\u9762\u5199\u5165\u5e94\u7528\u5305\u540d\uff0c\u591a\u4e2a\u5e94\u7528\u4e4b\u95f4\u7528 or \u8fde\u63a5\uff0c\u5982 deepin-music or deepin-movie\uff1b \u5192\u70df\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a smoke\uff1b \u96c6\u6210\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a core \uff1b \u5168\u91cf\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u4e3a\u7a7a\u5373\u53ef\uff1b \u901a\u8fc7 tags \u7684\u914d\u7f6e\u6bd4\u8f83\u7075\u6d3b\uff0c\u540e\u9762\u6807\u7b7e\u5316\u7ba1\u7406\u7ae0\u8282\u4f1a\u8bb2\u5230\uff0c\u652f\u6301\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u7075\u6d3b\u914d\u7f6e\u3002 \u6307\u5b9a\u67d0\u53f0\u673a\u5668\u5728\u6307\u5b9a\u955c\u50cf\u7248\u672c\u4e0a\u6267\u884c\u7528\u4f8b\uff1a\u5728 IP \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a IP\uff0c\u5e76\u5728 URL \u91cc\u9762\u586b\u5165\u955c\u50cf\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u6846\u67b6\u4f1a\u8c03\u7528 PXE \u8fdb\u884c\u81ea\u52a8\u88c5\u673a\uff0c\u88c5\u673a\u5b8c\u4e4b\u540e\u81ea\u52a8\u5f00\u59cb\u6267\u884c\u914d\u7f6e\u7684\u6d4b\u8bd5\u7528\u4f8b\u3002 \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\uff1a \u6bcf\u4e2a\u5e94\u7528\u5185\u90e8\u4f1a\u6709\u4e00\u4e2a\u5355\u72ec\u7684\u914d\u7f6e\u6a21\u5757\uff0c\u4f1a\u5305\u542b\u4e00\u4e9b\u672c\u5e94\u7528\u7684\u6d4b\u8bd5\u8d44\u6e90\u7684\u8def\u5f84\u3001\u6267\u884c\u7528\u4f8b\u7684\u6807\u7b7e\u914d\u7f6e\u7b49\u7b49\uff0c\u5982\u679c\u5728\u5c40\u90e8\u914d\u7f6e\u91cc\u9762\u914d\u7f6e\u4e86\u7528\u4f8b\u6267\u884c\u6807\u7b7e\uff0c\u800c\u5916\u5c42 runner \u51fa\u6ca1\u6709\u6307\u5b9a\u6267\u884c\u6807\u7b7e\uff0c\u5219\u5728\u6267\u884c\u65f6\u53ea\u4f1a\u6267\u884c\u5c40\u90e8\u914d\u7f6e\u5df2\u914d\u7f6e\u7684\uff0c\u82e5\u5916\u5c42 runner \u4e5f\u914d\u7f6e\u4e86\u6267\u884c\u6807\u7b7e\uff0c\u5219\u4f1a\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u7528\u4f8b\u3002 \u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u914d\u7f6e\u90fd\u5728\u540c\u4e00\u4e2a\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\uff0cpy \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684\u7c7b\uff0cini \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684 option\u3002 \u5168\u5c40\u914d\u7f6e\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u7b56\u7565\u5982\u4e0b\uff1a \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5c40\u90e8\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5e94\u7528\u5c42\uff1arunner \u662f\u6d4b\u8bd5\u6267\u884c\u7684\u5165\u53e3\uff0c\u5b83\u4f1a\u6839\u636e\u914d\u7f6e\u91cc\u9762\u7684\u914d\u7f6e\u9879\uff0c\u8fdb\u884c\u7528\u4f8b\u7684\u52a0\u8f7d\u548c\u6267\u884c\u3002\u5b83\u63d0\u4f9b\u63a5\u53e3\u7ed9\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\uff0c\u5e73\u53f0\u4e0a\u7684\u6307\u4ee4\u5b9e\u9645\u4e0a\u90fd\u662f\u901a\u8fc7\u4e0b\u53d1\u7ed9 runner\uff0c\u7136\u540e\u7531 runner \u6765\u6267\u884c\u76f8\u5e94\u7684\u6d4b\u8bd5\u3002 \u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u662f\u4e00\u4e2a\u524d\u7aef\u7cfb\u7edf\uff0c\u53ef\u4ee5\u8fdb\u884c\u6d4b\u8bd5\u673a\u7ba1\u7406\u3001\u81ea\u52a8\u5b89\u88c5\u955c\u50cf\u3001\u81ea\u52a8\u5b89\u88c5\u6307\u5b9a\u5e94\u7528\u7248\u672c\u3001\u8fdb\u884c\u6d4b\u8bd5\u7528\u4f8b\u8303\u56f4\u9009\u62e9\u3001\u7528\u4f8b\u89e6\u53d1\u6267\u884c\u63a7\u5236\u3001\u7ed3\u679c\u5c55\u793a\u8f93\u51fa\u7b49\u3002 \u4e00\u4e2a\u5e94\u7528\u7684\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\u90fd\u53ef\u4ee5\u5355\u72ec\u89e6\u53d1\u3002 \u517c\u5bb9\u6027\u6d4b\u8bd5\u4e3b\u8981\u901a\u8fc7 PXE \u670d\u52a1\u5668\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u88c5\u673a\uff0c\u7136\u540e\u914d\u5408 AT \u8fdb\u884c\u6d4b\u8bd5\uff0c\u53ef\u4ee5\u5b9e\u73b0\u4e0d\u540c\u7cfb\u7edf\u7248\u672c\u3001\u4e0d\u540c\u5e94\u7528\u7248\u672c\u73af\u5883\u4e0a\u90fd\u53ef\u4ee5\u8fdb\u884c\u81ea\u52a8\u5316\u7684 AT \u6267\u884c\uff0c\u63d0\u9ad8\u517c\u5bb9\u6027\u6d4b\u8bd5\u6548\u7387\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_4","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_2","title":"1\u3001\u7528\u4f8b\u89e3\u8026","text":"\u5b58\u5728\u8026\u5408\u5173\u7cfb\u7684\u65b9\u6cd5\uff1a\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u88ab\u5916\u90e8\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\uff0c\u5219\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u8026\u5408\u5173\u7cfb\u3002 1.1\u3001\u901a\u8fc7\u7f16\u8f91\u5668 Find Usages \u67e5\u770b\u6bcf\u4e2a\u65b9\u6cd5\u88ab\u8c03\u7528\u7684\u8def\u5f84\u548c\u88ab\u8c03\u7528\u6b21\u6570\uff1b 1.2\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 1 \u4e2a\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728\u5916\u90e8\u5e94\u7528\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1b 1.3\u3001\u64cd\u4f5c\u5c42\u6587\u4ef6\u540d\u5747\u4ee5 widget \u7ed3\u5c3e\uff0c\u7c7b\u540d\u4ee5 Widget \u7ed3\u5c3e\uff0c\u5982\uff1a\u6587\u4ef6\u540d music_widget.py \uff1a class MusicWidget:\n\"\"\"\u97f3\u4e50\u7684\u64cd\u4f5c\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_2","title":"2\u3001\u516c\u5171\u5e93\u5efa\u8bbe","text":"2.1\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 2 \u4e2a\u53ca\u4ee5\u4e0a\u7684\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728 public_widget \u76ee\u5f55\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1bpublic_widget \u5373\u4e3a\u516c\u5171\u65b9\u6cd5\u5e93\uff1b 2.2\u3001\u5728\u7528\u4f8b\u5c42\u4fee\u6539\u7528\u4f8b\u4e2d\u7c7b\u7684\u5bfc\u5165\u8def\u5f84\uff0c\u5c5e\u4e8e\u516c\u5171\u65b9\u6cd5\u7684\u5219\u8c03\u7528 public_widget \u4e2d\u7684\u7c7b\uff0c\u5916\u90e8\u5e94\u7528\u7684\u64cd\u4f5c\u65b9\u6cd5\uff0c\u5219\u8c03\u7528\u672c\u5e94\u7528\u76ee\u5f55\u4e0b\u91cd\u5199\u7684\u5916\u90e8\u5e94\u7528\u65b9\u6cd5\u3002 \u6bd4\u5982\uff1a\u51e0\u4e4e\u6240\u6709\u591a\u5a92\u4f53\u5e94\u7528\u90fd\u9700\u8981\u901a\u8fc7\u6587\u7ba1\u52a0\u8f7d\u8d44\u6e90\uff0c\u8c03\u8d77\u7684\u6587\u7ba1\u5bf9\u8bdd\u6846\u5b9e\u9645\u4e3a dde-desktop\uff0c\u56e0\u6b64\u5c06 desktop_widget.py \u653e\u5230 public_widget \u91cc\u9762\uff1a class DdeDesktopPublicWidget:\n\"\"\"\u516c\u5171-\u684c\u9762\u7684\u64cd\u4f5c\u65b9\u6cd5\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3_1","title":"3\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406","text":"3.1\u3001\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1a\u5bf9\u5e94 core\u3001smoke\uff0c\u6216\u4e3a\u7a7a\uff1b \u7528\u4f8b\u6765\u6e90\uff1a\u5bf9\u5e94 PMS \u7528\u4f8b\u6765\u6e90\uff0c\u5206\u522b\u7528 acp1\u3001acp2\u3001acp3\u3001acp4 \u8868\u793a\u3002 acp1 \uff1a\u4e1a\u52a1\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5199\u7684\u7528\u4f8b\uff0c\u88ab\u7528\u4e8e\u9a8c\u6536\u6d4b\u8bd5\u7684\uff1b acp2 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5f15\u5165\u7684\u4ea7\u54c1\u9a8c\u6536\u6d4b\u8bc4\u90e8\u7684\u7528\u4f8b\uff1b acp3 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u6839\u636e\u4ea7\u54c1\u9700\u6c42\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\uff1b acp4 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u901a\u8fc7\u793e\u533a\u3001\u8bba\u575b\u7528\u6237\u53cd\u9988\u95ee\u9898\u603b\u7ed3\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\u3002 \u4e3e\u4f8b\uff1a \u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u7528\u4f8b\u6765\u6e90 001 L1 core acp1 \u6807\u7b7e\u91c7\u7528\u679a\u4e3e\u7684\u65b9\u5f0f\u8fdb\u884c\u4ee3\u53f7\u7ba1\u7406\u65b9\u4fbf\u7ba1\u7406\u4ee5\u53ca\u540e\u7eed\u6269\u5c55\u3002 3.2\u3001\u5728\u6bcf\u4e2a\u5e94\u7528\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u7b2c\u4e00\u5217\u4e3a\u7528\u4f8b\u7684 ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ba1\u7406\u6a21\u5757\u5185\u7684\u7528\u4f8b\u6807\u7b7e\u3002\u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 3.3\u3001\u5bf9\u7167 PMS \u4e0a\u7528\u4f8b\u7b49\u7ea7\u3001\u7528\u4f8b\u7c7b\u578b\u548c\u7528\u4f8b\u6765\u6e90\uff0c\u6807\u8bb0\u6240\u6709\u5df2\u5b9e\u73b0\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u540e\u7eed\u7f16\u5199\u65b0\u589e\u81ea\u52a8\u5316\u7528\u4f8b\u65f6\uff0c\u6bcf\u5199\u4e00\u6761\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684 csv \u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u6b64\u6761\u7528\u4f8b\u7684\u6807\u7b7e\u3002 3.4\u3001\u8df3\u8fc7\u7528\u4f8b\u6807\u7b7e\u5316 \u73b0\u6709\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a\uff1a \u4e3e\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u8bb0\u4e3a \u201cskip-\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u8bb0\uff0c\u5982\u679c\u5df2\u7ecf\u6807\u8bb0\u4e86\u8df3\u8fc7\u539f\u56e0\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u8bb0\u4e3a SKIPED\uff0c\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\u3002 \u6240\u6709\u7684\u6807\u7b7e\u5728 docs \u76ee\u5f55\u4e0b\u4f1a\u6709\u4e00\u4e2a\u6587\u6863\uff0c\u6587\u6863\u6682\u5b9a\u540d\u79f0\u4e3a\uff1atags_info.md\uff0c\u7528\u4e8e\u8bf4\u660e\u73b0\u5728\u5df2\u7ecf\u4f7f\u7528\u5230\u7684\u6807\u7b7e\uff0c\u4ee5\u53ca\u8fd9\u4e9b\u6807\u7b7e\u7684\u89e3\u91ca\u548c\u7528\u6cd5\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#4","title":"4\u3001\u7528\u4f8b\u6267\u884c","text":"4.1\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u7684\u9a71\u52a8\u6267\u884c\u903b\u8f91\u529f\u80fd\u5b9e\u73b0 \u5f00\u53d1\u6839\u636e\u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\u91cc\u9762\u7684\u7528\u4f8b\u6807\u7b7e\u6267\u884c\u5bf9\u5e94\u7528\u4f8b\u7684\u529f\u80fd\uff0c\u80fd\u652f\u6301\u591a\u4e2a\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u6267\u884c\u5165\u53e3\u80fd\u968f\u610f\u901a\u8fc7\u7528\u4f8b\u6807\u7b7e\u6307\u5b9a\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002 \u7528\u4f8b\u6807\u7b7e\u7684\u9a71\u52a8\u65b9\u5f0f\u5fc5\u987b\u80fd\u652f\u6301\u6807\u7b7e\u7684\u6269\u5c55\uff0c\u672a\u6765\u968f\u7740\u4e1a\u52a1\u7684\u53d8\u5316\u53ef\u80fd\u9700\u8981\u589e\u52a0\u5404\u79cd\u5404\u6837\u7684\u6807\u7b7e\u3002 4.2\u3001\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u6267\u884c \u529f\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u3001\u6027\u80fd\u6d4b\u8bd5\u7b49\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u662f\u5206\u5f00\u6267\u884c\u7684\uff0c\u4e5f\u5c31\u662f\u5728\u4e00\u6b21\u6267\u884c\u4e2d\uff0c\u53ea\u80fd\u6267\u884c\u5176\u4e2d\u4e00\u79cd\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5177\u4f53\u8981\u6267\u884c\u54ea\u4e00\u79cd\u540c\u6837\u901a\u8fc7\u53c2\u6570\u6765\u63a7\u5236\u3002 4.3\u3001\u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c \u7531\u4e8e\u6d4b\u8bd5\u673a\u8d44\u6e90\u6709\u9650\uff0c\u968f\u7740\u81ea\u52a8\u5316\u7528\u4f8b\u6570\u91cf\u7684\u589e\u52a0\uff0cCI \u6267\u884c\u65f6\u95f4\u4f1a\u8d8a\u6765\u8d8a\u957f\u3002 \u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c\u7684\u529f\u80fd\uff1a \u540c\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\u5206\u6563\u5230\u4e0d\u540c\u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u4e0a\u6267\u884c\uff0c\u7f29\u77ed\u6267\u884c\u603b\u65f6\u95f4\uff1b \u7b2c\u4e8c\u5929\u8dd1\u7684\u65f6\u5019\u540c\u4e00\u4e2a\u673a\u5668\u4e0a\u4f1a\u6267\u884c\u6628\u5929\u6ca1\u6709\u6267\u884c\u5230\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u6267\u884c\u540c\u7406\uff1b \u53ef\u4ee5\u5b9e\u73b0\u5728\u5168\u67b6\u6784\u6d4b\u8bd5\u673a\u4e0a\u8f6e\u6d41\u6267\u884c\u7528\u4f8b\uff0c\u65e2\u80fd\u4fdd\u8bc1\u6267\u884c\u4e86\u6240\u6709\u7684\u7528\u4f8b\uff0c\u53c8\u80fd\u5728\u8d44\u6e90\u6709\u9650\u7684\u60c5\u51b5\u4e0b\u8986\u76d6\u4e86\u6240\u6709\u7684\u67b6\u6784\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#5","title":"5\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0","text":"5.1\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u4f5c\u4e3a\u524d\u7aef\u754c\u9762\u7cfb\u7edf\uff0c\u901a\u8fc7\u9875\u9762\u4e0a\u7684\u4e00\u4e9b\u529f\u80fd\u9009\u9879\u8fdb\u884c\u5bf9\u5e94\u6d4b\u8bd5\u4efb\u52a1\u7684\u7ba1\u7406\u6216\u89e6\u53d1\uff0c\u4e1a\u5185\u6bd4\u8f83\u6d41\u884c\u7684\u5b9e\u73b0\u65b9\u6848\u662f\u4f7f\u7528 Vue + DRF \u5b9e\u73b0\u4e00\u4e2a\u524d\u540e\u7aef\u5206\u79bb\u7684\u7cfb\u7edf\u3002 \u6d4b\u8bd5\u5e73\u53f0\u53ef\u80fd\u4f1a\u6d89\u53ca\u5230\u7684\u6a21\u5757\u6709\uff1a\u6d4b\u8bd5\u673a\u8d44\u6e90\u7ba1\u7406\u6a21\u5757\u3001\u7528\u4f8b\u6267\u884c\u63a7\u5236\u6a21\u5757\u3001\u7ed3\u679c\u5c55\u793a\u6a21\u5757\u3001PXE \u955c\u50cf\u5b89\u88c5\u6a21\u5757\u7b49\u3002 \u7528\u6237\uff08\u6d4b\u8bd5\u3001\u7814\u53d1\u540c\u5b66\u7b49\uff09\u53ef\u4ee5\u914d\u7f6e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5982\u6267\u884c\u54ea\u4e2a\u5e94\u7528\u3001\u6267\u884c\u7528\u4f8b\u7684\u8303\u56f4\u3001\u5728\u54ea\u53f0\u673a\u5668\u4e0a\u6267\u884c\u3001\u955c\u50cf\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u5e94\u7528\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u6267\u884c\u65f6\u95f4\u3002 5.2\u3001\u6267\u884c\u5165\u53e3 runner \u63d0\u4f9b\u7ed9\u6d4b\u8bd5\u5e73\u53f0\u7684\u63a5\u53e3\u5305\u62ec\uff1a\u7528\u4f8b\u6267\u884c\u63a5\u53e3\u3001\u7ed3\u679c\u8fd4\u56de\u63a5\u53e3\u3001\u955c\u50cf\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u955c\u50cf\u5b89\u88c5\u63a5\u53e3\u3001\u5e94\u7528\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u5e94\u7528\u5b89\u88c5\u66f4\u65b0\u63a5\u53e3\u7b49\u3002 \u524d\u7aef\u5e73\u53f0\u76ee\u524d\u8fd8\u6ca1\u6709\u592a\u591a\u8be6\u7ec6\u7684\u65b9\u6848\uff0c\u672c\u6b21\u8bbe\u8ba1\u4e3b\u8981\u96c6\u4e2d\u5728\u540e\u7aef\u8fd9\u90e8\u5206\u67b6\u6784\u7684\u8bbe\u8ba1\u4e0a\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_5","title":"\u56db\u3001\u5b9e\u65bd\u8ba1\u5212","text":"\u8fd1\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u6587\u7ba1\u4ee3\u7801\u89e3\u8026 2022/3/28 2022/4/8 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u56fe\u5f62\u56fe\u50cf\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u97f3\u89c6\u9891\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5168\u5c40\u641c\u7d22\u4ee3\u7801\u89e3\u8026 2022/4/25 2022/4/26 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u516c\u5171\u5e93\u5efa\u8bbe 2022/4/27 2022/5/5 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5c01\u88c5\u7684\u65b9\u6cd5\u6574\u7406\u6210\u4e00\u4e2a\u8868 2022/5/6 2022/5/10 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7528\u4f8b\u6807\u7b7e\u5206\u7c7b\u8bc4\u4f30 2022/5/11 2022/5/11 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u6807\u7b7e\u5316\u6267\u884c\u9a71\u52a8\u7a0b\u5e8f\u7f16\u5199 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u9700\u5b9e\u73b0\u81ea\u52a8\u89e3\u6790 csv \u8868\u683c\u4e2d\u7684\u7528\u4f8b\u7f16\u53f7 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u722c\u866b\u811a\u672c\uff0c\u722c\u53d6 pms \u4e0a\u7528\u4f8b\u7684\u6807\u7b7e 2022/5/11 2022/5/13 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u5b9a\u65f6\u81ea\u52a8\u7ef4\u62a4\u672c\u5730 csv \u6587\u4ef6\u811a\u672c 2022/5/11 2022/5/20 \u4e2d\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u76ee\u5f55\u7ed3\u6784\u8c03\u6574 2022/5/20 2022/6/2 \u5b8c\u6210\u5168\u5c40\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u5177\u4f53\u65b9\u6848\u548c\u903b\u8f91\u5b9e\u73b0 2022/6/6 2022/6/17 \u9759\u6001\u626b\u63cf\u95ee\u9898\u6e05\u96f6 2022/6/20 2022/7/1 \u5b8c\u6210\u65b0\u6846\u67b6\u4f7f\u7528\u57f9\u8bad 2022/7/4 2022/7/11 \u843d\u5730\u8fd0\u884c 2022/7/12 2022/7/20 \u5e95\u5c42\u5e93\u7528\u9014\u8bf4\u660e\u6587\u6863\u7f16\u5199 2022/7/21 2022/7/28"}]} \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz index 8ffaebc1..e0b7bbfc 100644 Binary files a/sitemap.xml.gz and b/sitemap.xml.gz differ diff --git "a/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" "b/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" index 25f669d5..97100667 100644 --- "a/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" +++ "b/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs @@ -1215,8 +1215,7 @@ 智能化功能测试# Attribution :chengdu Test Team # Date :2021/08/20 -此方案仍在演进中 -此方案仍在演进中 +此方案仍在演进中 仓库地址:https://gitlabcd.uniontech.com/autotest/cd-desktop-aitest 一、方案概述¶ 基于深度学习智能识别应用的元素控件,用于在自动化测试操作过程中的元素定位以及判断结果时的断言处理;自动化测试过程中,测试机上的画面通过采集盒传输到服务器上,服务器对视频画面进行智能识别后,服务器智能判断用例是否执行成功,然后对测试机下发下一步操作指令,测试机接受并执行下一步操作。 diff --git "a/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" "b/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" index cdf9ccde..06c9e9a5 100644 --- "a/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" +++ "b/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" @@ -95,7 +95,7 @@ - + @@ -226,7 +226,7 @@ - + YouQu Docs diff --git "a/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" "b/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" index 121b4507..72123668 100644 --- "a/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" +++ "b/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs @@ -752,6 +752,13 @@ + + + + + 4、虚拟化部署 + + @@ -1661,6 +1668,13 @@ + + + + + 4、虚拟化部署 + + @@ -2604,18 +2618,12 @@ 1、标签说明流水线使用指导; 跳过原因:skip-XXX,用于控制用例是否执行; 确认修复:fixed-XXX,用于标记用例的修复状态(后面详细讲解用法); @@ -2629,26 +2637,30 @@ 1、标签说明PMS用例ID 用例级别 用例类型 +设备类型 +用例来源 上线对象 测试级别 跳过原因 确认修复 -废弃用例 -... +废弃用例 +... -001 +679537 679537 L1 FUNC +PPL + CICD C1 skip-XXX fixed-XXX -removed-已废弃 -... +removed-已废弃 +... @@ -2656,7 +2668,7 @@ 2、操作步骤csv 的文件名。 例如: -相册的用例文件为 test_album_xxx.py,xxx 表示任意三位数字代表用例序号,此时 csv 文件名就应为 album.csv; +相册的用例文件为 test_album_xxx.py,xxx 表示用例的ID(也可以是自定义的数字代表用例序号),此时 csv 文件名就应为 album.csv; 对于用例规模比较大的应用,比如文件管理器,建议分模块,每个模块建立一个 csv 文件,所有 csv 文件建议放在一个 tags 目录下。 是否分模块维护 csv 取决于应用的用例复杂度,同时我们应该充分考虑后期的可维护性,csv 文件太多了也是一个很糟糕的事情。 @@ -2677,7 +2689,7 @@ 3.1.1、固定跳过001 +679537 ... skip-受到某新需求影响 @@ -2742,7 +2754,7 @@ 3.2、确认修复001 +679537 ... skip-受到某新需求影响 fixed-已修复 @@ -2787,7 +2799,7 @@ 3.3、废弃用例4、设计思路¶ 上面介绍 Pytest 框架提供的标签功能 mark,使用时需要为每一个用例添加标签装饰器,则操作复杂,可维护性差,其根本问题就是标签分散在每一条用例的装饰器上,难以集中维护;于是乎将所有标签使用 csv 文件进行集中管理,并通过 Pytest 的钩子函数,读取 csv 文件,动态添加标签到用中。 5、CSV文件格式¶ -此配置文件需要维护大量的标签数据,且要方便能使用Excel打开进行编辑查看,更重要的是我们不想引入三方依赖,CSV 文件几乎是唯一能满足所有的要求的文件格式。 +此配置文件需要维护大量的标签数据,且要方便能使用 Excel 打开进行编辑查看,更重要的是我们不想引入三方依赖,CSV 文件几乎是唯一能满足所有的要求的文件格式。 七、日志系统¶ 1、背景¶ 基于 YouQu 自动化测试框架操作方法封装写法,通常是这样的:类里面一个函数只包含一个操作或多次调用的一系列可合并的操作; @@ -2888,7 +2900,7 @@ 1、原则 大文件不能上传到工程里面,保持整个工程的轻量化,这样在克隆代码的时候才能非常快速方便使用,我们见过一个 AT 工程 clone 大小达到好几个 G,简直不可思议。 其实代码文件的大小是很小的,也就是说,纯写代码随便写工程也不会太大,而文档(包含插图)等资源却是很占空间。 -因此我们选择将 YouQu 的文档工程单独迁出到独立的仓库 youqu-docs 。 +因此我们选择将 YouQu 的文档工程涉及到的图片资源都采用外链加载; 2、安装¶ 项目根目录下运行 env.sh 即可。 bash env.sh @@ -2930,17 +2942,25 @@ 3.2、裁剪依赖bash env_dev.sh +4、虚拟化部署¶ +YouQu默认采用虚拟化部分,虚拟化环境实际安装的位置是在 $HOME/.local/share/virtualenvs/youqu-oHTM7l7G 目录下 +youqu-oHTM7l7G 此目录名称前面部分是你的代码根目录的名称,后面部分是生成的随机字符串; +同学们在远程机器上定位问题的时候,如果使用 Pycharm 调试,就将解释器指定到这个目录的就行了; +当然,我们也提供了本机开发环境部署: +bash env_dev.sh + +如果你是本地开发环境可以用它,区别就是驱动执行的时候使用:python3 manage.py xxx 九、失败录屏¶ 录屏其实是一种视频形式的日志,因为很多时候我们在查看日志之后仍然无法准确的定位到用例失败的具体原因,因此用例的录屏能让我们看到用例在执行过程; 【使用方法】 在 globalconfig.ini 里面配置关注 2 个参数; -;失败用例重跑次数 -RERUN = 1 - -;失败录屏从第几次开始录制视频。 -;比如 RECORD_FAILED_CASE = 1 ,表示用例第1次执行失败之后开始录屏。 -;注意,用例失败重跑的次数不能小于失败录屏次数,即 RERUN >= RECORD_FAILED_CASE -RECORD_FAILED_CASE = 1 +;失败用例重跑次数 +RERUN = 1 + +;失败录屏从第几次开始录制视频。 +;比如 RECORD_FAILED_CASE = 1 ,表示用例第1次执行失败之后开始录屏。 +;注意,用例失败重跑的次数不能小于失败录屏次数,即 RERUN >= RECORD_FAILED_CASE +RECORD_FAILED_CASE = 1 默认失败重跑的次数是 1 次; RECORD_FAILED_CASE = 1 表示用例第1次执行失败之后开始录屏; @@ -2953,48 +2973,48 @@ 十、Wayland 适配简单讲就是,应用库只需要维护一套用例脚本即可。 【用例兼容】 因为 Wayland 下有些应用的界面显示和功能本身存在一些差异,用例层可能需要对这部分用例做逻辑判断,使用全局配置里面的常量进行逻辑编写即可: -from setting.globalconfig import GlobalConfig - -# GlobalConfig.IS_WAYLAND 获取到当前的显示服务器(bool) -# 应用库 Config 继承 GlobalConfig -if Config.IS_WAYLAND: - pass -if Config.IS_X11: - pass +from setting.globalconfig import GlobalConfig + +# GlobalConfig.IS_WAYLAND 获取到当前的显示服务器(bool) +# 应用库 Config 继承 GlobalConfig +if Config.IS_WAYLAND: + pass +if Config.IS_X11: + pass 比如用例里面如果断言的图片不同: -if Config.IS_WAYLAND: - self.assert_image_exist("wayland_XXX") -else: - self.assert_image_exist("x11_XXX") +if Config.IS_WAYLAND: + self.assert_image_exist("wayland_XXX") +else: + self.assert_image_exist("x11_XXX") 这样这条用例脚本在 Wayland 和 X11 下都可以跑,so easy 是不是?完全没必要专门拉新分支进行 Wayland 适配。 十一、测试报告¶ 1. 目录结构¶ 执行时会在根目录下动态生成 report 目录,所有的报告相关的文件会统一存放在里面,示例: -/report - ├── allure # allure报告 - │ ├── ... - │ └── ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json - ├── allure_html # 生成的html报告 - │ ├── ... - │ └── index.html - ├── allure_back # allure报告备份 - │ └── 20221108114823 - │ ├── ... - │ └── f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json - ├── json # json报告 - │ ├── ... - │ └── result_deepin-music_20221109134736_1081333.json - ├── logs # 日志文件 - │ ├── 2022-11-10_debug.log - │ └── 2022-11-10_error.log - ├── record # 录屏 - │ └── 2022-11-09 - │ ├── ... - │ └── 15时14分09秒_test_music_303_2_autotest.mp4 - └── xml # xml报告 - └── autotest_deepin_music-20221109134736.xml +/report + ├── allure # allure报告 + │ ├── ... + │ └── ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json + ├── allure_html # 生成的html报告 + │ ├── ... + │ └── index.html + ├── allure_back # allure报告备份 + │ └── 20221108114823 + │ ├── ... + │ └── f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json + ├── json # json报告 + │ ├── ... + │ └── result_deepin-music_20221109134736_1081333.json + ├── logs # 日志文件 + │ ├── 2022-11-10_debug.log + │ └── 2022-11-10_error.log + ├── record # 录屏 + │ └── 2022-11-09 + │ ├── ... + │ └── 15时14分09秒_test_music_303_2_autotest.mp4 + └── xml # xml报告 + └── autotest_deepin_music-20221109134736.xml 默认情况下同时生成 html、xml、json三种形式的报告。 2. 定制报告¶ @@ -3011,14 +3031,14 @@ 3. 查看报告allure open report/allure_html +allure open report/allure_html 使用 manage.py 执行完之后,在终端的最后一行,我们会给你输出打开报告的命令,直接复制它在终端执行就可以查看了,像这样: - 终端执行命令: allure open /tmp/youqu/report/allure_html 查看报告 + 终端执行命令: allure open /tmp/youqu/report/allure_html 查看报告 你也可以直接在 Pycharm 里面找到 index.html 文件,然后右键选择浏览器打开,或者你可以用一个 http 服务打开。 你也可以直接在 report/allure 目录下查看报告: - allure serve report/allure + allure serve report/allure 远程执行 @@ -3031,48 +3051,48 @@ 1. 提前解决代码问题这里推荐一个 Python 社区流行的代码格式化工具: Black,号称不妥协的代码格式化工具,它检测到不符合规范的代码风格直接就帮你全部格式化好,就是这么刚! 安装: -sudo pip3 install black +sudo pip3 install black 使用方法: -black ${CheckPath} +black ${CheckPath} 使用这个工具格式化之后,代码会被自动调整,刚开始你可能会觉得调整得很夸张,没关系坚持看,习惯之后,你会觉得很优雅,没错,这就是 Pythonic Code 的核心,请保持优雅~。 2. 代码扫描工具¶ 使用根目录下 pylint.sh 扫描代码,在 report 目录下查看代码扫描报告,如果有代码问题请提前解决之后再提交。 此脚本已经使用 Python 社区最流行的代码扫描工具 Pylint 进行代码扫描。 使用方法: -bash pylint.sh +bash pylint.sh 运行之后会提示你要扫描的目录,比如输入 apps ,则会扫描 apps 下的所有 Python 代码。 在 setting/pylintrc.cfg 配置文件里面进行相关配置,扫描完成之后在 report/pylints 目录下会生成扫描报告。 代码提交需通过 git review 提交到 gerrit ,人工 Code Review 通过之后合入代码。 十三、提交代码¶ 1. 安装依赖¶ -sudo apt install git-review +sudo apt install git-review 2. 提交模板¶ 在 ~ 目录下新建文件,并命名为 gitcommit_template 将以下内容写入文件当中: -# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 -fix: - -# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 -Description: - -# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 -Log: - -# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 -#Bug: - -# 修复 github issue -#Issue: - -# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 -#Task: +# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 +fix: + +# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 +Description: + +# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 +Log: + +# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 +#Bug: + +# 修复 github issue +#Issue: + +# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 +#Task: 命令行执行: -git config --global commit.template ~/gitcommit_template +git config --global commit.template ~/gitcommit_template 此命令将模板加入到 git 的提交模板中。 后续提交的时候需要关注一下几点: @@ -3083,19 +3103,19 @@ 2. 提交模板3. 推送代码¶ 首先添加 commit 信息 -git add 后面加文件名称 +git add 后面加文件名称 -git add . # 表示添加所有文件 +git add . # 表示添加所有文件 使用这条命令注意有些临时文件不要提交到仓库了。 -git commit -a +git commit -a 之后在 fix: 后面(注意冒号后面必须加空格,不然直接-1)写本地提交的 commit 信息,然后就可以提交代码了 -git review branch(当前分支) -r origin +git review branch(当前分支) -r origin 最好一次 commit,一次 git review ,经常有同学在本地疯狂 commit 最后 git review 报错不知道咋回事儿。 若不想每次提交都加上 -r 选项,执行以下命令: -git config --global gitreview.remote origin +git config --global gitreview.remote origin 提交代码,直接使用 git review branch<目标分支>,例如 git review master 4. Git标签¶ @@ -3106,74 +3126,74 @@ 4. Git标签git tag -a <tagname> +git tag -a <tagname> 回车之后,Git 会打开你的编辑器,让你写一句标签注解,就像你给提交写注解一样。 查看所有标签 -git tag -l -# git tag 也行 +git tag -l +# git tag 也行 删除标签 -git tag -d <tagname> +git tag -d <tagname> 推送标签至远程 git push 命令并不会传送标签到远程仓库服务器上,必须显式地推送标签。 -git push origin <tagname> +git push origin <tagname> 推送所有不在远程仓库服务器上的标签 -git push origin --tag +git push origin --tag 删除远程标签 -git push origin :refs/tag/<tagname> +git push origin :refs/tag/<tagname> 后期打标签 先用 git log --pretty=oneline 查询提交记录,获取校验码。 -git tag -a <tagname> 9fceb02(校验码) +git tag -a <tagname> 9fceb02(校验码) 检出标签 -git checkout <tagname> +git checkout <tagname> 此时,仓库会处于“分离头指针(detached HEAD)”的状态。 在“分离头指针”状态下,如果你做了某些更改然后提交它们,标签不会发生变化, 但你的新提交将不属于任何分支,并且将无法访问,除非通过确切的提交哈希才能访问。 因此,如果你需要进行更改,比如你要修复旧版本中的错误,那么通常需要创建一个新分支: -git checkout -b <NewBranchName> <tagname> +git checkout -b <NewBranchName> <tagname> 新分支上可以进行提交代码。 十四、常见问题¶ 1. 提交代码时提示邮箱或者名称不对¶ 重新配置邮箱或者名称,然后重置生效: -git commit --amend --reset-author +git commit --amend --reset-author 2. 怎么回滚到之前的版本¶ (1)查询历史提交记录 -git log +git log 找到你要回滚的版本,复制 hash 值。 注意:是 commit 空格之后的 hash 值,之前有同学复制的 Change-Id: 这样肯定报错。 (2)回滚版本,不清除代码 -git reset --soft ${hash} +git reset --soft ${hash} (3)回滚版本,清除代码,慎用哈 -git reset --hard ${hash} +git reset --hard ${hash} 3. 测试报告里面 F S . E 是什么意思¶ F 表示失败,. (点)表示通过,S 表示跳过,E 表示 error 有报错 4. 解决 git status 中文显示的问题¶ -git config --global core.quotePath false +git config --global core.quotePath false 5. apps 目录下颜色有些是黄色的¶ 在 Pycharm 中 apps 目录下应用库文件是黄色的,编辑器识别不到代码新增和修改; @@ -3184,22 +3204,22 @@ 5. apps 目录下颜色有些是黄色的6. 执行 env.sh 报错 $'\r':未找到命令¶ 出现这个问题你应该是在 windows 上打开或编辑过 env.sh 脚本,windows下的换行是回车符+换行符,也就是\r\n,而 Linxu 下是换行符 \n,Linux 下不识别 \r,因此报错。 解决方案: -# 将 \r 替换为空 -sudo sed -i 's/\r//' env.sh +# 将 \r 替换为空 +sudo sed -i 's/\r//' env.sh 7.怎样为单独某一条用例配置执行超时时间¶ 在用例脚本中添加装饰器,如下: -@pytest.mark.timeout(300) # 单位秒 -def test_xxx_001(): - pass +@pytest.mark.timeout(300) # 单位秒 +def test_xxx_001(): + pass 8. 如何拉取 YouQu 自动化项目所有代码,包含子仓库¶ 前置条件:已申请访问 YouQu 权限群组 -# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) -git config --global credential.helper store - -# 拉取YouQu框架代码,并递归拉取子仓库代码 -git clone "http://gerrit.uniontech.com/youqu" --recursive +# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) +git config --global credential.helper store + +# 拉取YouQu框架代码,并递归拉取子仓库代码 +git clone "http://gerrit.uniontech.com/youqu" --recursive 9. 如何拉取 YouQu 自动化项目中指定子仓库的代码¶ 前置条件: @@ -3207,22 +3227,22 @@ 9. 如何拉取 YouQu 自动化项目中指定子仓库的代 已申请访问 YouQu 权限群组 已存储访问密码 -# 拉取YouQu框架代码 -git clone "http://gerrit.uniontech.com/youqu" - -# 指定拉取子仓库代码 -cd youqu -git submodule update --init apps/autotest_xxx_xxx +# 拉取YouQu框架代码 +git clone "http://gerrit.uniontech.com/youqu" + +# 指定拉取子仓库代码 +cd youqu +git submodule update --init apps/autotest_xxx_xxx 10. 如何更新 YouQu 自动化项目中,所有子仓库的代码¶ 更新所有子仓库代码 -cd youqu -git pull & git submodule foreach git pull +cd youqu +git pull & git submodule foreach git pull 11. 如何修复 YouQu 所有子仓库 master 分支游离头(detached head)¶ 修复所有子仓库默认master 分支游离头 -cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
apps +└── autotest_deepin_some + ├── case + │ ├── assert_res + │ │ └── readme + │ ├── base_case.py + │ └── __init__.py + ├── config.ini + ├── config.py + ├── conftest.py + ├── control + ├── deepin_some_assert.py + ├── deepin_some.csv + ├── __init__.py + └── widget + ├── base_widget.py + ├── case_res + │ └── readme + ├── deepin_some_widget.py + ├── __init__.py + ├── other.ini + ├── other_widget.py + ├── pic_res + │ └── readme + └── ui.ini
autotest_deepin_some 是你的工程名称,比如:autotest_deepin_music ;
autotest_deepin_music
在此基础上,你可以快速的开始你的 AT 项目。
用于自动同步 PMS 用例标签数据至本地 CSV 文件,主要通过以下几个配置来控制:
PMS
APP_NAME = # 指定要同步的应用名称 -PMS_USER = # PMS的用户名 -PMS_PASSWORD = # PMS的密码 +APP_NAME = # 指定要同步的应用名称 +PMS_USER = # PMS的用户名 +PMS_PASSWORD = # PMS的密码 在 [csv_link_pms_id] 节点下指定 csv 文件名与 PMS 用例模块的对应关系,比如: -[csv_link_pms_id] -;同步PMS数据到本地CSV文件,必须要配置的配置项 -;key是本地CSV文件的文件名称; -;value是对应PMS上的模块ID; -;比如要同步音乐的数据, 首先需要将配置 APP_NAME = deepin-music, -;CSV文件名称为music.csv,其在PMS上的用例为: https://pms.uniontech.com/testcase-browse-53.html -;因此应该配置为: music = 53 -;这样才能将PMS与本地CSV文件建立联系。 -;如果你的应用分了很多模块,只需要将对应的信息依次配置好就行了。 -music = 53 +[csv_link_pms_id] +;同步PMS数据到本地CSV文件,必须要配置的配置项 +;key是本地CSV文件的文件名称; +;value是对应PMS上的模块ID; +;比如要同步音乐的数据, 首先需要将配置 APP_NAME = deepin-music, +;CSV文件名称为music.csv,其在PMS上的用例为: https://pms.uniontech.com/testcase-browse-53.html +;因此应该配置为: music = 53 +;这样才能将PMS与本地CSV文件建立联系。 +;如果你的应用分了很多模块,只需要将对应的信息依次配置好就行了。 +music = 53 将以上信息配置好之后,在命令行执行: -youqu manage.py pms --pms2csv yes +youqu manage.py pms --pms2csv yes 每次执行时原 csv 文件会自动备份在 report/csv_back 目录下,因此你不用担心脚本执行导致你的数据丢失。 diff --git a/search/search_index.json b/search/search_index.json index 91ebe84c..c7cfc7a2 100644 --- a/search/search_index.json +++ b/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\u200b\\u3000\\-\u3001\u3002\uff0c\uff0e\uff1f\uff01\uff1b]+","pipeline":["stemmer"]},"docs":[{"location":"","title":"\u9996\u9875","text":""},{"location":"#youqu","title":"\u6709\u8da3\uff08YouQu\uff09","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/4/1\n# Author : Mikigo\n# =============================================\n \u672c\u7ad9\u603b\u8bbf\u95ee\u91cf \u6b21 \u6b22\u8fce\u5728\u6d4f\u89c8\u5668\u8bbf\u95ee\u3010\u516c\u7f51\u6587\u6863\u3011 \u7edf\u4fe1\u516c\u53f8\u5185\u7f51\u8fd8\u53ef\u4ee5\u8bbf\u95ee\u3010\u5185\u7f51\u6587\u6863\u3011\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u54e6~~"},{"location":"#_1","title":"\u4e00\u3001\u7b80\u4ecb","text":"\u6709\u8da3\uff08YouQu\uff09\u662f\u6df1\u5ea6\u79d1\u6280\u8bbe\u8ba1\u548c\u5f00\u53d1\u7684\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff0c\u91c7\u7528\u7ed3\u6784\u5206\u5c42\u7684\u8bbe\u8ba1\u7406\u5ff5\uff0c\u652f\u6301\u591a\u5143\u5316\u5143\u7d20\u5b9a\u4f4d\u548c\u65ad\u8a00\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\u3001\u5f3a\u5927\u7684\u65e5\u5fd7\u548c\u62a5\u544a\u8f93\u51fa\u7b49\u7279\u8272\u529f\u80fd\uff0c\u540c\u65f6\u5b8c\u7f8e\u517c\u5bb9X11\u3001Wayland\u663e\u793a\u534f\u8bae\uff0c\u73af\u5883\u90e8\u7f72\u7b80\u5355\uff0c\u64cd\u4f5c\u6613\u4e0a\u624b\u3002"},{"location":"#17","title":"\u7231\u4e0a \u201c\u6709\u8da3\u201d \u7684 17 \u4e2a\u7406\u7531","text":" \u6838\u5fc3\u5e93\u63d0\u4f9b\u4e86\u7edf\u4e00\u7684\u63a5\u53e3\uff0c\u7f16\u5199\u65b9\u6cd5\u65f6\u53ea\u9700\u8981\u5bfc\u5165\u4e00\u4e2a\u5305\u5c31\u53ef\u4ee5\u4f7f\u7528\u5230\u6838\u5fc3\u5e93\u63d0\u4f9b\u7684\u6240\u6709\u529f\u80fd\uff1b \u516c\u5171\u5e93\u5c01\u88c5\u4e86\u5f88\u591a\u5e38\u7528\u6a21\u5757\u7684\u76f8\u5173\u65b9\u6cd5\uff0c\u6bd4\u5982\uff1a\u4efb\u52a1\u680f\u7684\u64cd\u4f5c\u3001\u684c\u9762\u7684\u64cd\u4f5c\u3001\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\u7b49\u7b49\uff1b \u9664\u4e86\u5e38\u7528\u7684\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u8bc6\u522b\u4ee5\u5916\uff0c\u6211\u4eec\u8fd8\u63d0\u4f9b\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u5176\u4f7f\u7528\u7b80\u5355\u4e14\u9ad8\u6548\uff0c\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff1b \u5bf9\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u5c06\u7f16\u5199\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u53d8\u5f97\u7b80\u5355\u800c\u4f18\u96c5\uff1b \u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u6280\u672f\u8fdb\u884c\u529f\u80fd\u5347\u7ea7\uff0c\u9664\u4e86\u652f\u6301\u5355\u4e2a\u5750\u6807\u8fd4\u56de\uff0c\u8fd8\u652f\u6301\u540c\u4e00\u754c\u9762\u4e0b\u591a\u4e2a\u76f8\u540c\u5143\u7d20\u8fd4\u56de\u591a\u4e2a\u5750\u6807\u7684\u529f\u80fd\uff1b \u63d0\u4f9b\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u548c\u6279\u91cf\u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u4e0d\u5230\u4e00\u4e2a csv \u6587\u4ef6\u539f\u6765\u80fd\u5e72\u8fd9\u4e48\u591a\u4e8b\u60c5\uff1b \u63d0\u4f9b\u4e86\u529f\u80fd\u5f3a\u5927\u7684\u6267\u884c\u5668\u5165\u53e3\uff0c\u8ba9\u4f60\u53ef\u4ee5\u65b9\u4fbf\u7684\u5728\u672c\u5730\u6267\u884c\u4efb\u4f55\u7528\u4f8b\u96c6\u7684\u7528\u4f8b\uff0c\u5176\u4e30\u5bcc\u7684\u81ea\u5b9a\u4e49\u914d\u7f6e\u9879\uff0c\u6ee1\u8db3\u4f60\u5bf9\u6267\u884c\u5668\u6240\u6709\u7684\u5e7b\u60f3\uff1b \u63d0\u4f9b\u8fdc\u7a0b\u6267\u884c\u7684\u529f\u80fd\uff0c\u53ef\u4ee5\u63a7\u5236\u591a\u53f0\u673a\u5668\u5e76\u884c\u8dd1\uff0c\u6216\u8005\u5206\u5e03\u5f0f\u8dd1\uff0c\u8fd9\u79cd\u4ed8\u8d39\u529f\u80fd\u73b0\u5728\u514d\u8d39\u7ed9\u4f60\u7528\uff1b \u63d0\u4f9b\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u529f\u80fd\uff0c\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u6bcf\u4e2a\u65b9\u6cd5\u5355\u72ec\u5199\u8f93\u51fa\u65e5\u5fd7\u7684\u4ee3\u7801\uff0c\u4e00\u5207\u6211\u4eec\u7ed9\u4f60\u641e\u5b9a\u4e86\uff0c\u65e5\u5fd7\u8f93\u51fa\u4e0d\u4ec5\u5185\u5bb9\u4e30\u5bcc\uff0c\u989c\u503c\u4e5f\u7edd\u5bf9\u5728\u7ebf\uff0c\u6211\u4eec\u8fd8\u81ea\u5df1\u8bbe\u8ba1\u4e86\u4e00\u6b3e\u7ec8\u7aef\u8f93\u51fa\u4e3b\u9898\u53eb\u300a\u4e94\u5f69\u6591\u6593\u7684\u9ed1\u300b\uff1b \u63d0\u4f9b\u4e86\u4e00\u952e\u90e8\u7f72\u81ea\u52a8\u5316\u6d4b\u8bd5\u73af\u5883\u7684\u529f\u80fd\uff0c\u8fde\u4ee3\u7801\u7f16\u8f91\u5668\u90fd\u7ed9\u4f60\u88c5\u597d\u4e86\uff0c\u8ba9\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u73af\u5883\u90e8\u7f72\u800c\u70e6\u607c\uff1b \u63d0\u4f9b\u4e86\u81ea\u52a8\u751f\u6210\u591a\u79cd\u62a5\u544a\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u8f93\u51fa\u4ec0\u4e48\u62a5\u544a\u5f62\u5f0f\u90fd\u884c\uff0c\u800c\u4e14\u6211\u4eec\u5728\u62a5\u544a\u4e2d\u8fd8\u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\u548c\u5931\u8d25\u622a\u56fe\u7684\u529f\u80fd\uff1b \u5bf9\u65ad\u8a00\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u63d0\u4f9b\u66f4\u53cb\u597d\u5316\u7684\u9519\u8bef\u63d0\u793a\uff0c\u8ba9\u5b9a\u4f4d\u95ee\u9898\u7cbe\u51c6\u9ad8\u6548\uff1b \u4e0d\u4ec5\u652f\u6301\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u63a7\u5236\uff0c\u800c\u4e14\u8fd8\u652f\u6301\u52a8\u6001\u63a7\u5236\u7528\u4f8b\u6279\u91cf\u6267\u884c\u7684\u603b\u65f6\u95f4\uff0c\u786e\u4fdd CI \u73af\u5883\u4e0b\u80fd\u987a\u7545\u8fd0\u884c\uff1b \u652f\u6301\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\u6267\u884c\u3001PMS \u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6807\u7b7e\u5316\u6267\u884c\u65b9\u6848\uff0c\u6ee1\u8db3\u4f60\u5404\u79cd\u573a\u666f\u4e0b\u7684\u6267\u884c\u9700\u6c42\uff1b \u652f\u6301\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u529f\u80fd\uff0c\u53ef\u5b9a\u4f4d\u53ef\u65ad\u8a00\uff0c\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\uff1b \u5b8c\u7f8e\u517c\u5bb9 Wayland \u548c X11\uff0c\u771f\u6b63\u505a\u5230\u4e00\u5957\u4ee3\u7801\uff0c\u968f\u5904\u6267\u884c\uff1b \u652f\u6301\u591a\u79cd\u65b9\u5f0f\u7684\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u5176\u4e2d\u5f02\u6b65\u56de\u586b\u7684\u65b9\u6848\uff0c\u5b8c\u7f8e\u89e3\u51b3\u4e86\u6570\u636e\u56de\u586b\u7684\u8017\u65f6\u95ee\u9898\uff1b \u3010\u89c6\u9891\u4ecb\u7ecd\u3011"},{"location":"#_2","title":"\u4e8c\u3001\u5b89\u88c5\u4f7f\u7528","text":"\u57fa\u7840\u6846\u67b6\uff1ahttps://github.com/linuxdeepin/deepin-autotest-framework \u4ece PyPI \u5b89\u88c5: sudo pip3 install youqu\n \u521b\u5efa\u9879\u76ee: youqu-startproject youqu\n \u5b89\u88c5\u4f9d\u8d56: cd youqu\nbash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002 \u5e94\u7528\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684\u5e94\u7528\u540d\u79f0\u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music cd apps/\n \u5c06\u5e94\u7528\u5e93\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u50cf\u8fd9\u6837\uff1a youqu\n\u251c\u2500\u2500 apps\n\u2502 \u251c\u2500\u2500 autotest_deepin_music # \u5e94\u7528\u5e93\n...\n \u5e94\u7528\u5e93\u7684\u540d\u79f0\u4e0d\u53ef\u4ee5\u4fee\u6539\u3002"},{"location":"#_3","title":"\u4e09\u3001\u8fd0\u884c","text":""},{"location":"#1","title":"1. \u5de5\u4f5c\u7a7a\u95f4","text":"\u57fa\u7840\u6846\u67b6\u5de5\u7a0b\u76ee\u5f55\u5efa\u8bae\u653e\u5728 ~ \u76ee\u5f55\u4e0b\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u4e5f\u53ef\u4ee5\u8fd0\u884c\uff0c\u4f46\u662f\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u9700\u8981\u505a\u73af\u5883\u6e05\u7406\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u5b58\u5728\u4ee3\u7801\u88ab\u5220\u9664\u7684\u98ce\u9669\u3002 \u5982\u679c\u4f60\u7684\u673a\u5668\u4e0a\u4e0d\u540c\u76ee\u5f55\u4e0b\u5b58\u5728\u591a\u4e2a YouQu \u5de5\u7a0b\uff0c\u90a3\u4e48\u5728\u8fd0\u884c\u4e4b\u524d\uff0c\u8bf7\u5148\u6267\u884c env.sh \u6821\u6b63\u76f8\u5173\u73af\u5883\u3002"},{"location":"#2","title":"2. \u6267\u884c\u5668","text":"\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u6709\u4e00\u4e2a manage.py \uff0c\u5b83\u662f\u4e00\u4e2a\u6267\u884c\u5668\u5165\u53e3\uff0c\u63d0\u4f9b\u4e86\u672c\u5730\u6267\u884c\u3001\u8fdc\u7a0b\u6267\u884c\u7b49\u7684\u529f\u80fd\u3002 \u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6765\u6267\u884c\uff1a youqu manage.py run -a deepin-music\n"},{"location":"#21","title":"2.1. \u672c\u5730\u6267\u884c","text":"youqu manage.py run\n"},{"location":"#211","title":"2.1.1. \u914d\u7f6e\u6587\u4ef6","text":"\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u914d\u7f6e\u53c2\u6570 \u5728\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u91cc\u9762\u652f\u6301\u914d\u7f6e\u5bf9\u6267\u884c\u7684\u4e00\u4e9b\u53c2\u6570\u8fdb\u884c\u914d\u7f6e\uff0c\u5e38\u7528\u7684\u5982\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;1\u3001KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2\u3001KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f, e.g. TAGS = L1 or smoke\n;\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\uff0c\u5c06\u8981\u6267\u884c\u7684\u7528\u4f8b\u5199\u5165\u6307\u5b9a\u7684 csv \u6587\u4ef6\n;\u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u4ece\u57fa\u7840\u6846\u67b6\u6839\u76ee\u5f55\u5f00\u59cb\uff1ae.g. CASE_FILE = case_list.txt\n;\u5982\u679c\u8fd9\u91cc\u6709\u503c\uff0cAPP_NAME KEYWORDS TAGS \u7684\u914d\u7f6e\u5747\u4e0d\u751f\u6548\nCASE_FILE =\n;=============================== RUNNER CONFIG ===================================\n[runner]\n;\u6700\u5927\u5931\u8d25\u7528\u4f8b\u6570\u91cf\u7684\u5360\u6bd4\n;\u6bd4\u5982\uff1a\u603b\u6267\u884c\u7528\u4f8b\u6570\u4e3a100, \u82e5 MAX_FAIL = 0.5,\u5219\u5931\u8d25\u7528\u4f8b\u6570\u8fbe\u523050\u5c31\u4f1a\u7ec8\u6b62\u6d4b\u8bd5\u3002\nMAX_FAIL = 0.5\n;\u5355\u6761\u7528\u4f8b\u7684\u8d85\u65f6\u65f6\u95f4\uff0c\u5982\u679c\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u8d85\u65f6\uff0c\u8fd9\u6761\u7528\u4f8b\u4f1a\u88ab\u505c\u6b62\uff0c\u540e\u7eed\u7528\u4f8b\u7ee7\u7eed\u6267\u884c\u3002\n;\u5355\u4f4d\u4e3a\u79d2\n; \u8fd9\u662f\u4e00\u4e2a\u5168\u5c40\u7edf\u4e00\u914d\u7f6e\uff0c\u5982\u679c\u67d0\u6761\u7528\u4f8b\u9700\u8981\u5355\u72ec\u914d\u7f6e\u8d85\u65f6\u65f6\u95f4\uff0c\u53ef\u4ee5\u5728\u7528\u4f8b\u4e2d\u8fd9\u6837\u5199\uff1a\n;@pytest.mark.timeout(500)\n;def test_xxx_001():\n; ...\n;\u4f1a\u8bdd\uff08\u6240\u6709\u7528\u4f8b\u6267\u884c\u7684\uff09\u8d85\u65f6\u662f\u6839\u636e\u5168\u5c40\u8d85\u65f6\u914d\u7f6e\u548c\u7528\u4f8b\u5355\u72ec\u8d85\u65f6\u914d\u7f6e\u81ea\u52a8\u8ba1\u7b97\u7684\uff1b\nCASE_TIME_OUT = 200\n;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\u3002\n;\u6ce8\u610f\uff0c\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u4e0d\u80fd\u5c0f\u4e8e\u5931\u8d25\u5f55\u5c4f\u6b21\u6570\uff0c\u5373 RERUN >= RECORD_FAILED_CASE\nRECORD_FAILED_CASE = 1\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = INFO\n;yes \u6bcf\u6761\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u8fdb\u884c\u73af\u5883\u6e05\u7406\nCLEAN_ALL = yes\n;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\nRESOLUTION = 1920x1080\n;\u4e0d\u8df3\u8fc7\u7528\u4f8b\uff0ccsv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86 skip-xxx\u7684\u7528\u4f8b\u4e0d\u8df3\u8fc7\nNOSKIP = no\n;ignore fixed\n;no\uff0c\u53ea\u8981\u6807\u8bb0\u4e86fixed\u7684\u7528\u4f8b\uff0c\u5373\u4f7f\u6807\u8bb0\u4e86skip-\uff0c\u4e5f\u4f1a\u6267\u884c\uff1b\n;yes\uff0cfixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\uff1b\nIFIXED = no\n;\u8981\u5b89\u88c5deb\u5305\u7684\u8def\u5f84\n;e.g : ~/Downloads/ \u5b89\u88c5\u4e0b\u8f7d\u76ee\u5f55\u4e0b\u7684deb\u5305\uff0c\u5982\u679c\u662f\u8fdc\u7a0b\u6267\u884c\uff0c\u4f1a\u81ea\u52a8\u62f7\u8d1d\u5230\u8fdc\u7a0b\u5e76\u5b89\u88c5\u3002\nDEB_PATH =\n;DEBUG \u6a21\u5f0f\u6267\u884c\u7528\u4f8b\uff0c\u53ea\u6536\u96c6\u4e0d\u6267\u884c\u7528\u4f8b\uff0c\u4e5f\u4e0d\u505a\u8bbe\u5907\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002\nDEBUG = no\n;\u8bb0\u5f55top\u547d\u4ee4\u67e5\u8be2\u7684\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0cTOP = 3 \u8868\u793a\u8bb0\u5f55\u524d3\u4e2a\u8fdb\u7a0b\u3002\nTOP =\n;\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\nREPEAT =\n;\u9ed8\u8ba4\u5728\u6240\u6709\u6d4b\u8bd5\u5b8c\u6210\u4e4b\u540e\u8f93\u51fa\u62a5\u9519\u4fe1\u606f.\n;yes, \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\nDURING_FAIL = no\n;=============================== REPORT CONFIG ===================================\n[report]\n;\u7528\u4f8b\u6267\u884c\u5b8c\u540e\u751f\u6210\u7684\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n;\u76ee\u524d\u652f\u6301 allure, xml, json \uff08\u652f\u6301\u540c\u65f6\u751f\u6210\uff09\nREPORT_FORMAT = allure, xml, json\n;\u6307\u5b9a\u62a5\u544a\u751f\u6210\u7684\u8def\u5f84\uff08\u76f8\u5bf9\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\uff09\nALLURE_REPORT_PATH = report/\nXML_REPORT_PATH = report/\nJSON_REPORT_PATH = report/\n;=============================== GLOBAL CONFIG ===================================\n[globalconfig]\n;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\nPASSWORD = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\nIMAGE_MATCH_NUMBER = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6bcf\u6b21\u95f4\u9694\u7b49\u5f85\u65f6\u95f4\nIMAGE_MATCH_WAIT_TIME = 1\n;\u56fe\u50cf\u8bc6\u522b\u5339\u914d\u5ea6\nIMAGE_RATE = 0.9\n;\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u5b9e\u65f6\u56fe\u50cf\u4fdd\u5b58\u8def\u5f84\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u5750\u6807\nSCREEN_CACHE = /tmp/screen.png\n;\u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\u7684\u8def\u5f84\nTMPDIR = /tmp/tmpdir\n;\u7cfb\u7edf\u4e3b\u9898\nSYS_THEME = deepin\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = http://youqu-dev.uniontech.com:8890\n;OpenCV\u670d\u52a1\u7aef\u5730\u5740\nOPENCV_SERVER_HOST = http://youqu-dev.uniontech.com:8889\n;=============================== PMS CONFIG ===================================\n;PMS\u76f8\u5173\u914d\u7f6e\uff0c\u5305\u542b\u4ee5\u4e0b\u51e0\u4e2a\u65b9\u9762\uff1a\n;1.PMS\u6d4b\u8bd5\u5957\u6267\u884c\n;2.\u81ea\u52a8\u4ecePMS\u722c\u53d6\u6570\u636e\u5e76\u540c\u6b65\u672c\u5730CSV\u6587\u4ef6\n;3.PMS\u6570\u636e\u56de\u586b\n[pms]\n;PMS\u7684\u7528\u6237\u540d: ut001234\nPMS_USER =\n;PMS\u7684\u5bc6\u7801\nPMS_PASSWORD =\n;PMS\u6d4b\u8bd5\u5957\u7684ID\n;\u5728PMS\u4e0a\u67e5\u770b\u7528\u4f8b\u201c\u5957\u4ef6\u201d\u94fe\u63a5: https://pms.uniontech.com/testsuite-view-495.html\n;\u6d4b\u8bd5\u5957ID\u4e3a: 495\nSUITE_ID =\n;\u6570\u636e\u56de\u586b\u5fc5\u987b\u5173\u8054PMS\u6d4b\u8bd5\u5355\n;\u5728PMS\u4e0a\u67e5\u770b\u6d4b\u8bd5\u5355\u94fe\u63a5: https://pms.uniontech.com/testtask-cases-20747.html\n;\u6d4b\u8bd5\u5355ID\u4e3a: 20747\nTASK_ID =\n;\u5c06\u6d4b\u8bd5\u7ed3\u679c\u6570\u636e\u56de\u586b\u5230PMS\n;\u4e3a\u7a7a: \u8868\u793a\u4e0d\u56de\u586b,\u4e0d\u4f1a\u5728\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u751f\u6210json\u7ed3\u679c\u6587\u4ef6;\n;async: \u8868\u793a\u9010\u6761\u5f02\u6b65\u56de\u586b,\u540e\u9762\u4e00\u6761\u6267\u884c\u5f00\u59cb\u65f6\u901a\u8fc7\u5b50\u7ebf\u7a0b\u5bf9\u524d\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u8fdb\u884c\u56de\u586b\uff0c\u5982\u6b64\u5b9e\u73b0\u65f6\u95f4\u6548\u7387\u6700\u5927\u5316;\n;finish: \u8868\u793a\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u6210\u4e4b\u540e\u9010\u4e2a\u56de\u586b(PMS\u4e0d\u652f\u6301\u5e76\u53d1);\nSEND_PMS =\n;\u6570\u636e\u56de\u586b\u7684\u89e6\u53d1\u8005\n;auto: \u6846\u67b6\u81ea\u52a8\u56de\u586b,\u914d\u5408SEND_PMS\u914d\u7f6e\u4f7f\u7528,\u4f60\u53ef\u4ee5\u9009\u62e9\u5728\u4e0d\u540c\u7684\u9636\u6bb5\u8fdb\u884c\u6570\u636e\u56de\u586b;\n;hand: \u624b\u52a8\u56de\u586b,\u6bcf\u6761\u7528\u4f8b\u4ecd\u7136\u4f1a\u751f\u6210json\u6587\u4ef6,\u4f46\u6846\u67b6\u4e0d\u4f1a\u8fdb\u884c\u6570\u636e\u56de\u586b,\u9700\u8981\u4f60\u53ef\u4ee5\u5728\u4f60\u60f3\u8981\u53d1\u9001\u7684\u65f6\u95f4\u70b9\u624b\u52a8\u89e6\u53d1\u56de\u586b;\nTRIGGER = auto\n;PMS\u56de\u586b\u7684\u91cd\u8bd5\u6b21\u6570\n;\u5982\u679c\u63a5\u53e3\u8bf7\u6c42\u5931\u8d25,\u4f1a\u8fdb\u884c\u91cd\u8bd5\nSEND_PMS_RETRY_NUMBER = 2\n[csv_link_pms_lib]\n;caselib: \u7528\u4f8b\u5e93\n;testcase: \u4ea7\u54c1\u5e93\u7528\u4f8b\nCASE_FROM = caselib\n[csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/caselib-browse-81.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 81\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic =\n[export_csv]\n;\u5bfc\u51fa\u7684csv\u6587\u4ef6\u540d\u79f0\uff0c\u9ed8\u8ba4 case_list.csv\nCSV_FILE = case_list.csv\n;exportcsv \u547d\u4ee4\u5bfc\u51fa case_list.csv \u6587\u4ef6\u65f6\u914d\u7f6e\u7684\u5b57\u6bb5\u540d\uff0c\u7528\u4f8b\u540d\u79f0\u9ed8\u8ba4\u5b58\u5728\u7b2c\u4e00\u5217\uff0c\u65e0\u9700\u6dfb\u52a0\nCSV_HEARD = \u7528\u4f8b\u7ea7\u522b,\u7528\u4f8b\u7c7b\u578b,\u6d4b\u8bd5\u7ea7\u522b,\u662f\u5426\u8df3\u8fc7\n \u914d\u7f6e\u5b8c\u6210\u4e4b\u540e\uff0c\u76f4\u63a5\u5728\u547d\u4ee4\u884c\u6267\u884c manage.py \u5c31\u597d\u4e86\u3002 youqu manage.py run\n"},{"location":"#212","title":"2.1.2. \u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a youqu manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--max_fail MAX_FAIL \u6700\u5927\u5931\u8d25\u7387\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--resolution RESOLUTION\n\u68c0\u67e5\u5206\u8fa8\u7387\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms {,async,finish}\n\u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--trigger {,auto,hand}\n\u89e6\u53d1\u8005\n-f CASE_FILE, --case_file CASE_FILE\n\u6839\u636e\u6587\u4ef6\u6267\u884c\u7528\u4f8b\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n--pms_user PMS_USER pms \u7528\u6237\u540d\n--pms_password PMS_PASSWORD\npms \u5bc6\u7801\n--suite_id SUITE_ID pms \u6d4b\u8bd5\u5957ID\n--pms_info_file PMS_INFO_FILE\npms \u4fe1\u606f\u6587\u4ef6\n--top TOP \u8fc7\u7a0b\u4e2d\u8bb0\u5f55top\u547d\u4ee4\u4e2d\u7684\u503c\n--lastfailed \u4ec5\u6267\u884c\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\n--duringfail \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\n--repeat REPEAT \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n--project_name PROJECT_NAME\n\u5de5\u7a0b\u540d\u79f0\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--build_location BUILD_LOCATION\n\u6784\u5efa\u5730\u533a\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--line LINE \u6267\u884c\u7684\u4e1a\u52a1\u7ebf\uff08\u5199\u5165json\u6587\u4ef6\uff09\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a youqu manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\"\n \u547d\u4ee4\u884c\u53c2\u6570\u4f18\u5148\u7ea7\u662f\u9ad8\u4e8e\u914d\u7f6e\u6587\u4ef6\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u4e86\u5bf9\u5e94\u7684\u53c2\u6570\uff0c\u914d\u7f6e\u6587\u4ef6\u4e2d\u4e0d\u7ba1\u662f\u5426\u914d\u7f6e\u5747\u4e0d\u751f\u6548\u3002 --app \u5165\u53c2\u8fd8\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\uff0c\u4e0b\u9762\u7684\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u540c\u6837\u652f\u6301\u3002"},{"location":"#22","title":"2.2. \u8fdc\u7a0b\u6267\u884c","text":"youqu manage.py remote\n \u8fdc\u7a0b\u6267\u884c\u540c\u6837\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u8fdb\u884c\u7528\u4f8b\u76f8\u5173\u914d\u7f6e\uff1b \u9700\u8981\u91cd\u70b9\u8bf4\u4e00\u4e0b\u8fdc\u7a0b\u6267\u884c\u65f6\u7684\u6d4b\u8bd5\u673a\u4fe1\u606f\u914d\u7f6e\uff0c\u5728\u914d\u7f6e\u6587\u4ef6 setting/remote.ini \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\u3001IP\u3001\u5bc6\u7801\u3002 ;=============================== CLIENT LIST =====================================\n; \u6d4b\u8bd5\u673a\u914d\u7f6e\u5217\u8868\n;[client{number}] ;\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u6709\u591a\u5c11\u53f0\u6d4b\u8bd5\u673a\u5c31\u5199\u591a\u5c11\u4e2a client\uff0c\u522b\u540d\u5fc5\u987b\u5305\u542b client \u5b57\u7b26\uff0c\u4e14\u4e0d\u80fd\u91cd\u590d\u3002\n;user = ;\u6d4b\u8bd5\u673a user\n;ip = ;\u6d4b\u8bd5\u673a ip\n;password = 1 ;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801, \u53ef\u4ee5\u4e0d\u914d\u7f6e\u6b64\u9879\uff0c\u9ed8\u8ba4\u53d6 CLIENT_PASSWORD \u7684\u503c\uff1b\n;\u5982\u679c\u4f60\u6240\u6709\u6d4b\u8bd5\u673a\u5bc6\u7801\u90fd\u76f8\u540c\uff0c\u90a3\u4e48\u53ea\u9700\u8981\u914d\u7f6e CLIENT_PASSWORD \u5c31\u53ef\u4ee5\u4e86\n;=================================================================================\n[client1]\nuser = uos\nip = 10.8.15.xx\n[client2]\nuser = uos\nip = 10.8.15.xx\n[client3]\nuser = uos\nip = 10.8.11.xx\n \u6709\u591a\u5c11\u53f0\u673a\u5668\u5c31\u50cf\u8fd9\u6837\u6328\u7740\u5199\u5c31\u884c\u4e86\u3002 \u7136\u540e\u5728\u547d\u4ee4\u884c\uff1a youqu manage.py remote\n \u8fd9\u6837\u8fd0\u884c\u662f\u4ece\u914d\u7f6e\u6587\u4ef6\u53bb\u8bfb\u53d6\u76f8\u5173\u914d\u7f6e\u3002 \u5982\u679c\u4f60\u4e0d\u60f3\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\uff0c\u4f60\u4ecd\u7136\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u8fdb\u884c\u4f20\u53c2\uff0c \u4ee5\u4e0b\u4e3a python3 manage.py remote \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-c CLIENTS, --clients CLIENTS\n\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679cpassword\u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6\nsetting/remote.ini \u4e2d CLIENT_PASSWORD\n\u7684\u503c,\u6bd4\u5982\uff1auos@10.8.13.33:1 \u6216 uos@10.8.13.33\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-s {yes,no,}, --send_code {yes,no,}\n\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a\uff08\u4e0d\u542breport\u76ee\u5f55\uff09\n-e, --build_env \u642d\u5efa\u6d4b\u8bd5\u73af\u5883,\u5982\u679c\u4e3ayes\uff0c\u4e0d\u7ba1send_code\u662f\u5426\u4e3ayes\u90fd\u4f1a\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a.\n-p CLIENT_PASSWORD, --client_password CLIENT_PASSWORD\n\u6d4b\u8bd5\u673a\u5bc6\u7801\uff08\u5168\u5c40\uff09\n-y PARALLEL, --parallel PARALLEL\nyes:\u8868\u793a\u6240\u6709\u6d4b\u8bd5\u673a\u5e76\u884c\u8dd1\uff0c\u6267\u884c\u76f8\u540c\u7684\u6d4b\u8bd5\u7528\u4f8b\uff0cno\n:\u8868\u793a\u6d4b\u8bd5\u673a\u5206\u5e03\u5f0f\u6267\u884c\uff0c\u670d\u52a1\u7aef\u4f1a\u6839\u636e\u6536\u96c6\u5230\u7684\u6d4b\u8bd5\u7528\u4f8b\u81ea\u52a8\u5206\u914d\u7ed9\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u3002\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms SEND_PMS \u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n \u5728\u547d\u4ee4\u884c\u8fd9\u6837\u8fd0\u884c\uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\"\n \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report \u76ee\u5f55\u4e0b\u56de\u6536\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u7684\u6d4b\u8bd5\u62a5\u544a\u3002 \u914d\u7f6e\u6587\u4ef6\u5176\u4ed6\u76f8\u5173\u914d\u7f6e\u9879\u8be6\u7ec6\u8bf4\u660e\uff0c\u8bf7\u67e5\u770b\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u6ce8\u91ca\u5185\u5bb9\u3002"},{"location":"#23-pms","title":"2.3. PMS \u6570\u636e\u56de\u586b","text":"\u6d4b\u8bd5\u5355\u5173\u8054\u7684\u7528\u4f8b\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u5bf9\u5e94\u7684\u53bb\u8dd1\u8fd9\u4e9b\u5173\u8054\u7684\u7528\u4f8b\uff0c\u5e76\u4e14\u5c06\u6267\u884c\u7684\u7ed3\u679c\u56de\u586b\u7684\u6d4b\u8bd5\u7528\u4f8b\u7684\u72b6\u6001\u91cc\u9762\u3002 PMS \u6570\u636e\u56de\u586b\u4e3b\u8981\u6709\u4e09\u79cd\u65b9\u5f0f\uff1a \uff081\uff09\u5f02\u6b65\u56de\u586b \u5728\u7528\u4f8b\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\uff0c\u91c7\u7528\u5f02\u6b65\u7684\u65b9\u5f0f\u53bb\u8fdb\u884c\u6570\u636e\u56de\u586b\uff0c\u76f4\u767d\u7684\u8bb2\u5c31\u662f\uff0c\u7b2c\u4e8c\u6761\u7528\u4f8b\u5f00\u59cb\u8dd1\u7684\u65f6\u5019\uff0c\u901a\u8fc7\u5b50\u7ebf\u7a0b\u53bb\u505a\u7b2c\u4e00\u6761\u7528\u4f8b\u7684\u6570\u636e\u56de\u586b\uff0c\u5982\u6b64\u5faa\u73af\uff0c\u76f4\u5230\u6240\u6709\u7528\u4f8b\u6267\u884c\u7ed3\u675f\uff1b \u8fd9\u79cd\u65b9\u6848\u7684\u65f6\u95f4\u6548\u7387\u6700\u9ad8\u7684\uff0c\u56e0\u4e3a\u7406\u8bba\u4e0a\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u662f\u5927\u4e8e\u6570\u636e\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\u65f6\u95f4\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u5f53\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u6570\u636e\u56de\u586b\u4e5f\u5b8c\u6210\u4e86\u3002 \u4f7f\u7528\u65b9\u6cd5\uff0c\u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u4ee5\u4e0b\u53c2\u6570\uff1a\uff08\u4ee5\u4e0b\u6d89\u53ca\u5230\u7684\u53c2\u6570\u914d\u7f6e\u90fd\u662f\u5728\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u914d\u7f6e\uff09 PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = async\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \u8fd9\u4e2a\u53c2\u6570\u53ef\u586b\u53ef\u4e0d\u586b\uff0c\u4f46\u662f\u586b\u4e86\u53ef\u4ee5\u63d0\u9ad8\u7528\u4f8b\u7684\u6267\u884c\u901f\u5ea6\uff0c\u56e0\u4e3a\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u53ef\u4ee5\u6307\u5b9a\u5230\u5177\u4f53\u7684\u5e94\u7528\u5e93\u3002\uff08\u4e0b\u540c\uff09\n \uff082\uff09\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u56de\u586b \u7b49\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u518d\u9010\u4e2a\u8fdb\u884c\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u6b64\u65b9\u6848\u65f6\u95f4\u6548\u7387\u6bd4\u8f83\u4f4e\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \uff083\uff09\u624b\u52a8\u56de\u586b \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4e0d\u505a\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u540e\u7eed\u624b\u52a8\u5c06\u7ed3\u679c\u8fdb\u884c\u56de\u586b\u8bf7\u6c42\u3002 \u7528\u4f8b\u6267\u884c\u65f6\u914d\u7f6e\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = hand\nAPP_NAME = \u540e\u7eed\u624b\u52a8\u56de\u586b\u65b9\u6cd5\uff1a youqu manage.py pms --send2task yes\n"},{"location":"#_4","title":"\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898","text":"\u7531\u540c\u5b66\u53ef\u80fd\u4f1a\u53d1\u73b0\uff0c\u600e\u4e48\u56de\u586b\u4e00\u6b21\u4e4b\u540e\uff0c\u540e\u9762\u60f3\u518d\u6b21\u56de\u586b\u5c31\u4e0d\u751f\u6548\u4e86\uff1b \u8fd9\u662f\u56e0\u4e3a\u4e3a\u4e86\u5e94\u5bf9\u524d\u9762\u63d0\u5230\u7684\u591a\u79cd\u6570\u636e\u56de\u586b\u7684\u65b9\u5f0f\uff0c\u5728 report \u76ee\u5f55\u4e0b\u4f1a\u7531 pms_xxx \u5f00\u5934\u7684\u76ee\u5f55\uff0c\u8bb0\u5f55\u4e86\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u548c\u56de\u586b\u60c5\u51b5\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u4e4b\u524d\u5df2\u7ecf\u56de\u586b\u8fc7\u4e86\uff0c\u540e\u7eed\u5c31\u4e0d\u4f1a\u518d\u6b64\u89e6\u53d1\u56de\u586b\u4e86\uff1b \u5982\u679c\u4f60\u60f3\u91cd\u65b0\u505a\u56de\u586b\uff0c\u4f60\u53ef\u4ee5\u628a report/pms_xxx \u76ee\u5f55\u5220\u6389\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u91cd\u65b0\u505a\u6570\u636e\u56de\u586b\u4e86\uff1b"},{"location":"#24-csv","title":"2.4. \u5bfc\u51fa CSV \u6587\u4ef6","text":"\u6846\u67b6\u63d0\u4f9b\u5bfc\u51fa\u6307\u5b9a\u6807\u7b7e\u7528\u4f8b\u7684\u529f\u80fd\uff1a youqu manage.py exportcsv -a deepin-album -t CICD\n \u8868\u793a\u5bfc\u51fa deepin-album \u7684\u7528\u4f8b\u4e2d\u6807\u8bb0\u4e86 CICD \u6807\u7b7e\u7684\u7528\u4f8b\uff0c\u5bfc\u51fa CSV \u6587\u4ef6\u7684\u5b57\u6bb5\u683c\u5f0f\u5df2\u7ecf\u9002\u914d\u4e86 CICD \u7684\u8981\u6c42\u3002"},{"location":"#25-app","title":"2.5. \u811a\u624b\u67b6\u65b0\u5efa APP \u5de5\u7a0b","text":"\u65b0\u5efa\u4e00\u4e2a APP \u5de5\u7a0b\uff1a youqu manage.py startapp autotest_deepin_some \u8fd9\u6837\u5728 apps \u76ee\u5f55\u4e0b\u4f1a\u521b\u5efa\u4e00\u4e2a\u5b50\u9879\u76ee\u5de5\u7a0b autotest_deepin_some\uff0c\u540c\u65f6\u65b0\u5efa\u597d\u5de5\u7a0b\u6a21\u677f\u76ee\u5f55\u548c\u6a21\u677f\u6587\u4ef6\uff1a apps\n\u2514\u2500\u2500 autotest_deepin_some\n \u00a0\u00a0 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_case.py\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 config.ini\n \u00a0\u00a0 \u251c\u2500\u2500 config.py\n \u00a0\u00a0 \u251c\u2500\u2500 conftest.py\n \u00a0\u00a0 \u251c\u2500\u2500 control\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_assert.py\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some.csv\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u2514\u2500\u2500 widget\n \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 case_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 other.ini\n \u00a0\u00a0 \u251c\u2500\u2500 other_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 pic_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2514\u2500\u2500 ui.ini\n autotest_deepin_some \u662f\u4f60\u7684\u5de5\u7a0b\u540d\u79f0\uff0c\u6bd4\u5982\uff1aautotest_deepin_music \uff1b \u5728\u6b64\u57fa\u7840\u4e0a\uff0c\u4f60\u53ef\u4ee5\u5feb\u901f\u7684\u5f00\u59cb\u4f60\u7684 AT \u9879\u76ee\u3002"},{"location":"#26","title":"2.6. \u7528\u4f8b\u6807\u7b7e\u81ea\u52a8\u540c\u6b65","text":"\u7528\u4e8e\u81ea\u52a8\u540c\u6b65 PMS \u7528\u4f8b\u6807\u7b7e\u6570\u636e\u81f3\u672c\u5730 CSV \u6587\u4ef6\uff0c\u4e3b\u8981\u901a\u8fc7\u4ee5\u4e0b\u51e0\u4e2a\u914d\u7f6e\u6765\u63a7\u5236\uff1a APP_NAME = # \u6307\u5b9a\u8981\u540c\u6b65\u7684\u5e94\u7528\u540d\u79f0\nPMS_USER = # PMS\u7684\u7528\u6237\u540d\nPMS_PASSWORD = # PMS\u7684\u5bc6\u7801\n \u5728 [csv_link_pms_id] \u8282\u70b9\u4e0b\u6307\u5b9a csv \u6587\u4ef6\u540d\u4e0e PMS \u7528\u4f8b\u6a21\u5757\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u6bd4\u5982\uff1a [csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/testcase-browse-53.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 53\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic = 53\n \u5c06\u4ee5\u4e0a\u4fe1\u606f\u914d\u7f6e\u597d\u4e4b\u540e\uff0c\u5728\u547d\u4ee4\u884c\u6267\u884c\uff1a youqu manage.py pms --pms2csv yes\n \u6bcf\u6b21\u6267\u884c\u65f6\u539f csv \u6587\u4ef6\u4f1a\u81ea\u52a8\u5907\u4efd\u5728 report/csv_back \u76ee\u5f55\u4e0b\uff0c\u56e0\u6b64\u4f60\u4e0d\u7528\u62c5\u5fc3\u811a\u672c\u6267\u884c\u5bfc\u81f4\u4f60\u7684\u6570\u636e\u4e22\u5931\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u57fa\u7840\u6846\u67b6\u8bbe\u8ba1\u65b9\u6848","text":"# ====================================\n# Author : Mikigo\n# Time : 2022/3/18\n# version \uff1a1.0\n# ====================================\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"\u505a\u4e00\u4e2a\u7b80\u5355\u3001\u597d\u7528\u3001\u529f\u80fd\u5f3a\u5927\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u3002 \u4f5c\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4e00\u4e2a\u57fa\u7840\u6846\u67b6\uff0c\u4efb\u4f55\u5e94\u7528\u90fd\u80fd\u5f88\u65b9\u4fbf\u7684\u63a5\u5165\u8fdb\u6765\uff1b \u63d0\u4f9b\u6240\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u9700\u8981\u7684\u5e95\u5c42\u529f\u80fd\uff0c\u5e76\u5bf9\u5916\u63d0\u4f9b\u552f\u4e00\u7684\u63a5\u53e3\uff0c\u65b9\u4fbf\u5e94\u7528\u5e93\u4f7f\u7528\uff1b \u6574\u5408\u516c\u5171\u5e93\uff0c\u51cf\u5c11\u5e94\u7528\u5e93\u4ee3\u7801\u91cf\u548c\u65b9\u6cd5\u7ef4\u62a4\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u8bbe\u8ba1\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u7edf\u4e00\u6982\u5ff5","text":" \u57fa\u7840\u6846\u67b6 \u672c\u9879\u76ee\u662f\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\uff08AutoTest Basic Frame\uff09\uff0c\u5168\u79f0\u4e3a\u201c\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff08AT \u57fa\u7840\u6846\u67b6\uff09\u201d\u3002 AT \u57fa\u7840\u6846\u67b6\u662f\u505a\u4e3a\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\u6765\u8bbe\u8ba1\u7684\uff0c\u5b83\u63d0\u4f9b\u4e86\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u57fa\u7840\u529f\u80fd\uff0c\u4efb\u4f55\u5e94\u7528\u63a5\u5165\u8fdb\u6765\u90fd\u80fd\u5feb\u901f\u65b9\u4fbf\u7684\u8fdb\u884c\u65b9\u6cd5\u548c\u7528\u4f8b\u7f16\u5199\uff0c\u540c\u65f6\u5728\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u3001\u6807\u7b7e\u5316\u6267\u884c\u3001\u5206\u5e03\u5f0f\u6267\u884c\u3001\u591a\u79cd\u62a5\u544a\u8f93\u51fa\u3001\u4f18\u7f8e\u7684\u6267\u884c\u65e5\u5fd7\u3001\u5931\u8d25\u81ea\u52a8\u5f55\u5c4f\u548c\u622a\u56fe\u3001\u81ea\u52a8\u73af\u5883\u6e05\u7406\u7b49\u7b49\uff0c\u5b83\u90fd\u63d0\u4f9b\u4e86\u5b8c\u5584\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u66f4\u91cd\u8981\u7684\u662f\u8fd9\u4e00\u5207\u4f7f\u7528\u8d77\u6765\u90fd\u975e\u5e38\u7b80\u5355\u3002 \u57fa\u7840\u6846\u67b6\u4e2d\u5305\u542b\u5e94\u7528\u5e93\uff08apps\uff09\u3001\u6838\u5fc3\u5e93\uff08src\uff09\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09\u3002 \u5e94\u7528\u5e93\uff08apps\uff09 \u5404\u4e2a\u5e94\u7528\u81ea\u5df1\u7684\u4ed3\u5e93\uff0c\u91cc\u9762\u4e3b\u8981\u5305\u542b\u7684\u662f\u7528\u4f8b\u3001\u65b9\u6cd5\u53ca\u4e00\u4e9b\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u53eb autotest-dde-file-manager \u3002 \u6838\u5fc3\u5e93\uff08src\uff09 \u6838\u5fc3\u5e93\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u5230\u6240\u6709\u5e95\u5c42\u6838\u5fc3\u529f\u80fd\uff0c\u8fd9\u662f\u6700\u91cd\u8981\u7684\u4e00\u4e2a\u90e8\u5206\uff0c\u7075\u9b42\u3002\u5177\u4f53\u529f\u80fd\u6a21\u5757\u53ca\u8bf4\u660e\u4f1a\u5728\u4e0b\u9762\u7b2c\u56db\u4e2a\u7ae0\u8282\u8be6\u7ec6\u63cf\u8ff0\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09 \u591a\u4e2a\u5e94\u7528\u90fd\u8981\u7528\u5230\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\uff0c\u6309\u7167\u5e94\u7528\u5212\u5206\u5b58\u653e\uff0c\u4e3b\u8981\u662f\u4e3a\u4e86\u51cf\u5c11\u4ee3\u7801\u91cf\uff0c\u6d88\u9664\u5e94\u7528\u95f4\u7684\u8026\u5408\u5173\u7cfb\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u67b6\u6784\u56fe","text":"\u6574\u4f53\u7684\u6846\u67b6\u8bbe\u8ba1\u5728\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u300b\u6587\u6863\u91cc\u9762\u5df2\u7ecf\u6709\u8be6\u7ec6\u63cf\u8ff0\u4e86\uff0c\u8fd9\u91cc\u8d34\u4e00\u4e0b\u6574\u4f53\u7684\u67b6\u6784\u56fe\uff1a \u4e3a\u4e86\u7a81\u663e\u672c\u6587\u7684\u91cd\u70b9\uff0c\u62bd\u53d6\u5176\u4e2d\u91cd\u8981\u529f\u80fd\u6a21\u5757\uff0c\u5982\u4e0b\u56fe\uff1a "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-basic-frame # \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\n\u251c\u2500\u2500 apps # \u5e94\u7528\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-dde-file-manager # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\uff08\u5e94\u7528\u5e93\u8be6\u7ec6\u76ee\u5f55\u7ed3\u6784\u8bf7\u770b\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\uff09\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 tag # \u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u2514\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u2502 \u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 xxx.png\n\u2502 \u2502 ...\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-deepin-music # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 public # \u516c\u5171\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget # dde_dock \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget # dde_desktop \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 src # \u6838\u5fc3\u5e93\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 button_center.py\n\u2502 \u251c\u2500\u2500 cmdtrl.py\n\u2502 \u251c\u2500\u2500 dogtails.py\n\u2502 \u251c\u2500\u2500 find_image.py\n\u2502 \u251c\u2500\u2500 global_config.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 setting # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 config.py\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 global_config.ini\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\u6a21\u5757\uff08Hook\uff09\n\u251c\u2500\u2500 pytest.ini # Pytest \u9ed8\u8ba4\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 docs # \u6587\u6863\u76ee\u5f55\n\u2514\u2500\u2500 manage.py # \u6267\u884c\u5668\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1apps","title":"1\u3001\u5e94\u7528\u5e93\uff08apps\uff09","text":"\u6240\u6709\u5e94\u7528\u5e93\u5747\u653e\u7f6e\u5728\u57fa\u7840\u6846\u67b6\u4e0b\u7684 apps \u76ee\u5f55\u4e0b\uff08\u89c1\u7b2c\u4e8c\u7ae0\u8282\u7b2c3\u6bb5\u76ee\u5f55\u7ed3\u6784\u5185\u5bb9\uff09\u3002\u5e94\u7528\u5e93\u7684\u67b6\u6784\u8bbe\u8ba1\u53ef\u4ee5\u53c2\u8003\u300aAT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b\u6587\u6863\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2src","title":"2\u3001\u6838\u5fc3\u5e93\uff08src\uff09","text":"\u5728 src \u76ee\u5f55\u4e0b\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u5e95\u5c42\u6838\u5fc3\u7ec4\u4ef6\uff0c\u901a\u5e38\u6765\u8bb2\u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5230\u5176\u4e2d\u67d0\u4e00\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4e48\u4f60\u9700\u8981\u663e\u793a\u7684\u5bfc\u5165\u8fd9\u4e2a\u6a21\u5757\uff0c\u7136\u540e\u624d\u80fd\u4f7f\u7528\u8be5\u6a21\u5757\u4e0b\u7684\u529f\u80fd\uff0c\u5982\u679c\u4f60\u7528\u5230\u4e86\u5341\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4f60\u5c31\u9700\u8981\u5bfc\u5165\u5341\u4e2a\u3002\u4f46\u662f\u6211\u4eec\u60f3\u8ba9\u4e8b\u60c5\u53d8\u5f97\u7b80\u5355\uff0c\u4e00\u6b21\u5bfc\u5165\uff0c\u4f7f\u7528\u6240\u6709\u3002 \u5c06\u6240\u6709\u7684\u529f\u80fd\u6a21\u5757\u90fd\u8fdb\u5165\u5230 src \u7684\u540d\u79f0\u7a7a\u95f4\uff0c\u5728 src/__init__.py \u91cc\u9762\u6211\u4eec\u8bbe\u8ba1\u6210\u8fd9\u6837\uff1a # src/__init__.py\nfrom .cmdctl import CmdCtl\nfrom .dogtails import Dogtail\nfrom .find_image import FindImage\nfrom .button_center import ButtonCenter\nclass Src(CmdCtl, FindImage):\ndef __init__(self, **kwargs):\n\"\"\"dogtail or button center param\n :param kwargs: app_name, desc, number\n \"\"\"\nif kwargs:\napp_name = kwargs.get(\"APP_NAME\")\ndesc = kwargs.get(\"DESC\")\nif app_name is None or desc is None:\nraise ValueError\nnumber = kwargs.get(\"number\")\nnumber = number if isinstance(number, int) else -1\n# \u5bf9\u8c61\u7ec4\u5408\nself.dog = Dogtail(app_name, desc, number)\nself.ui = ButtonCenter(app_name, number)\n \u9700\u8981\u4f20\u9012\u53c2\u6570\u7684\u91c7\u7528\u5bf9\u8c61\u7ec4\u5408\uff0c\u6ca1\u6709\u53c2\u6570\u7684\u4f7f\u7528\u7ee7\u627f\uff0c\u7ee7\u627f\u7684\u7c7b\u7b26\u5408 Mixin \u8bbe\u8ba1\u6a21\u5f0f\u3002 \u5e94\u7528\u5e93\u91cc\u9762\u4f7f\u7528\u7684\u65f6\u5019\u5728 widget/base_widget.py \u91cc\u9762\u53ea\u9700\u8981\u552f\u4e00\u7ee7\u627f Src \uff1a # \u5e94\u7528\u5e93\u91cc\u9762\u65b9\u6cd5\u57fa\u7c7b\n# widget/base_widget.py\nfrom src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n \u8981\u4f7f\u7528\u6838\u5fc3\u5e93\u7684\u529f\u80fd\uff0c\u53ea\u9700\u8981\u5199\u4e00\u4e2a\u5bfc\u5165 from src import Src \u5373\u53ef\u3002 \u5199 __init__ \u6784\u9020\u51fd\u6570\u7684\u539f\u56e0\u662f\u901a\u8fc7\u53c2\u6570\u6784\u9020\u5e94\u7528\uff0c\u5e76\u4e14\u4f20\u9012 number \u8fdb\u6765\uff0c\u53ef\u4ee5\u5b9e\u73b0\u591a\u7a97\u53e3\u7684\u63a7\u5236\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3public","title":"3\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09","text":"\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6bcf\u4e2a\u5e94\u7528\u90fd\u662f\u4e00\u4e2a\u5355\u72ec\u7684 py \u6587\u4ef6\uff0c\u76f8\u4e92\u4e4b\u95f4\u662f\u72ec\u7acb\u7684\uff0c\u6bcf\u4e2a py \u6587\u4ef6\u91cc\u9762\u662f\u8be5\u5e94\u7528\u7684\u65b9\u6cd5\u7c7b\uff0c\u6bd4\u5982\uff1a\u6700\u5e38\u7528\u7684\u65b9\u6cd5\u7c7b dde_desktop_public_widget.py # dde_desktop_widget.py\nfrom src import Src\nclass _DdeDesktopPublicBaseWidget(Src):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-desktop\"\nDESC = \"/usr/bin/dde-desktop\"\ndef __init__(self):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC)\nclass DdeDesktopPublicWidget(_DdeDesktopPublicBaseWidget):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u7c7b\"\"\"\ndef click_music_dir_by_ui(self):\n\"\"\"\u5728\u6587\u4ef6\u9009\u62e9\u6846\u70b9\u51fb\u97f3\u4e50\u76ee\u5f55\"\"\"\nself.click(*self.ui.btn_center(\"\u4fa7\u8fb9\u680f-\u97f3\u4e50\")) \ndef click_xxx_by_attr(self):\npass\n \u516c\u5171\u65b9\u6cd5\u5e93\u610f\u4e49\uff1a \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6240\u5c01\u88c5\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\u90fd\u662f\u81f3\u5c11\u88ab2\u4e2a\u5e94\u7528\u90fd\u7528\u5230\u7684\uff0c\u8fd9\u6837\u505a\u53ef\u4ee5\u51cf\u5c11\u6574\u4f53\u4ee3\u7801\u91cf\uff0c\u4ece\u800c\u51cf\u8f7b\u5e94\u7528\u5e93\u4ee3\u7801\u7684\u7ef4\u62a4\u5de5\u4f5c\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u7f16\u5199\u5f62\u5f0f\uff08\u547d\u540d\u89c4\u5219\u3001\u5b9a\u4f4d\u7684\u65b9\u6848\u5199\u6cd5\u3001\u6ce8\u91ca\u7684\u5199\u6cd5\u7b49\u7b49\uff09\u5177\u6709\u4e00\u5b9a\u7684\u6a21\u677f\u4f5c\u7528\uff0c\u8fd9\u6837\u5373\u4f7f\u662f\u5404\u4e2a\u5e94\u7528\u5e93\u90fd\u72ec\u7acb\u7ef4\u62a4\uff0c\u6240\u6709\u7684\u7f16\u7801\u98ce\u683c\u90fd\u662f\u8d8b\u4e8e\u76f8\u540c\u7684\uff0c\u56e0\u4e3a\u5927\u5bb6\u90fd\u5e94\u8be5\u53c2\u7167\u516c\u5171\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u5199\u6cd5\u6765\u5199\u81ea\u5df1\u5e94\u7528\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\u7c7b\uff0c\u8fd9\u6837\u4f7f\u5f97\u4ece\u516c\u53f8\u7684\u89d2\u5ea6\u53bb\u770b\u6240\u6709\u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u90fd\u662f\u7edf\u4e00\u7684\u3002 \u53ef\u4ee5\u901a\u8fc7\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\uff0c\u4e86\u89e3\u5230\u5176\u4ed6\u5e94\u7528\u7684\u529f\u80fd\uff0c\u5bf9\u4e8e\u6211\u4eec\u9700\u6c42\u7406\u89e3\uff0c\u4e86\u89e3\u7cfb\u7edf\u7684\u65b9\u65b9\u9762\u9762\u4e5f\u6709\u597d\u5904\u3002 \u5f53\u7136\uff0c\u5982\u679c\u4f60\u7684\u5e94\u7528\u672c\u8eab\u662f\u5c5e\u4e8e\u6839\u672c\u5c31\u4e0d\u9700\u8981\u548c\u5176\u4ed6\u5e94\u7528\u4ea4\u4e92\u7684\uff0c\u90a3\u4e48\u4f60\u53ef\u80fd\u4e0d\u4f1a\u7528\u5230\u8fd9\u91cc\u9762\u7684\u529f\u80fd\uff0c\u6ca1\u5173\u7cfb\uff0c\u4f60\u6240\u6709\u7684\u65b9\u6cd5\u90fd\u53ef\u4ee5\u76f4\u63a5\u5199\u5728\u5e94\u7528\u5e93\u7684\u4e1a\u52a1\u5c42\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4conftestpy","title":"4\u3001conftest.py","text":"conftest.py \u4ece\u529f\u80fd\u4e0a\u5c06\u662f\u5c5e\u4e8e\u6838\u5fc3\u5e93\uff08src\uff09\u7684\u5185\u5bb9\uff0c\u4f46\u662f\u7531\u4e8e\u5b83\u7684\u7279\u6b8a\u6027\uff0c\u5373\u5b83\u662f\u5bf9\u5e94\u7528\u5e93\u4e2d\u7684\u7528\u4f8b\u751f\u6548\u7684\uff0c\u800c\u4e14\u5b83\u7684\u4f5c\u7528\u57df\u662f\u5f53\u524d\u76ee\u5f55\u53ca\u4ee5\u4e0b\uff0c\u56e0\u6b64\u6211\u4eec\u5c06\u5b83\u653e\u5230\u9879\u76ee\u6839\u76ee\u5f55\u3002\u6211\u4eec\u6846\u67b6\u4e2d\u6709\u4e0d\u5c11\u6838\u5fc3\u529f\u80fd\u90fd\u662f\u5728\u8fd9\u91cc\u9762\u8fdb\u884c\u5f00\u53d1\u7684\uff0c\u540e\u9762\u7b2c\u56db\u7ae0\u4f1a\u8bb2\u5230\u7ec6\u8282\u3002 pytest.ini \u4f5c\u7528\u548c conftest.py \u7c7b\u4f3c\uff0c\u662f Pytest \u6846\u67b6\u7684\u56fa\u5b9a\u914d\u7f6e\u6587\u4ef6\uff0c\u76ee\u524d\u914d\u7f6e\u4e86\u4e00\u4e9b\u901a\u7528\u7684\u547d\u4ee4\u884c\u6267\u884c\u53c2\u6570\uff0c\u4e5f\u653e\u5728\u9879\u76ee\u6839\u76ee\u5f55\u3002 \u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 Hook \u51fd\u6570\uff0capps \u76ee\u5f55\u4e0b\u7684 \u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 fixture \u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5setting","title":"5\u3001setting","text":"\u5168\u5c40\u914d\u7f6e\u6a21\u5757\uff0c\u5305\u542b\u4e86\u4ee5\u4e0b\u914d\u7f6e\u6587\u4ef6\uff1a \uff081\uff09ini \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u914d\u7f6e\u4e00\u4e9b\u5168\u5c40\u7684\u914d\u7f6e\u9879\uff0c\u8b6c\u5982\uff1a\u5931\u8d25\u91cd\u8dd1\u6b21\u6570\u3001\u662f\u5426\u5931\u8d25\u5f55\u5c4f\u3001\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\u3001\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4\u3001\u6267\u884c\u65f6\u65e5\u5fd7\u7ea7\u522b\u3001\u751f\u6210\u7684\u62a5\u544a\u7c7b\u578b\u3001\u4ee5\u53ca\u5206\u5e03\u5f0f\u6267\u884c\u7684\u4e00\u4e9b\u7b56\u7565\u914d\u7f6e\u9879\u7b49\u7b49\u3002 \uff082\uff09config.py \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u63d0\u4f9b\u914d\u7f6e\u6587\u4ef6\u8bfb\u53d6\u3001\u52a8\u6001\u83b7\u53d6\u4e00\u4e9b\u5e38\u91cf\uff08\u5982\u9879\u76ee\u6839\u76ee\u5f55\u7edd\u5bf9\u8def\u5f84 (BASE_DIR)\u3001\u7cfb\u7edf\u67b6\u6784\uff08SYS_FRAME\uff09\u3001\u65f6\u95f4\u5b57\u7b26\u4e32\uff08strftime\uff09\u3001\u672c\u673a USERNAME IP \u7b49\u7b49\uff09\u3001\u516c\u5171 URL \u7b49\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u89c4\u8303","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u7248\u672c\u53ca\u4f9d\u8d56","text":"\u57fa\u7840\u6846\u67b6\u4f1a\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u8fdb\u884c\u7248\u672c\u53d1\u5e03\uff0c\u4e0d\u4e0e\u67d0\u4e2a\u5e94\u7528\u7248\u672c\u7ed1\u5b9a\uff0c\u4f46\u662f\uff0c\u5e94\u7528\u5e93\u4f1a\u4f9d\u8d56\u4e8e\u57fa\u7840\u6846\u67b6\u7684\u7248\u672c\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u5efa\u8bae\u5728\u5e94\u7528\u5e93\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a\u6587\u672c\u6587\u4ef6\u7528\u4e8e\u8bb0\u5f55\u6240\u4f9d\u8d56\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\uff0c\u7c7b\u4f3c\u4e8e\u5f00\u53d1\u5e94\u7528\u7684 debian/control \u6587\u4ef6\u7684\u529f\u80fd\uff0c\u4e3a\u4e86\u4fdd\u6301\u7edf\u4e00\uff0c\u8fd9\u4e2a\u6587\u4ef6\u5c31\u547d\u540d\u4e3a control\uff0c\u653e\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u6838\u5fc3\u5e93\u72ec\u7acb\u6027","text":"\u6838\u5fc3\u5e93\u4e0d\u5efa\u8bae\u9488\u5bf9\u67d0\u4e00\u4e2a\u5e94\u7528\u5355\u72ec\u505a\u4ee3\u7801\u4e0a\u7279\u6b8a\u5904\u7406\uff0c\u901a\u5e38\u8003\u8651\u9488\u5bf9\u67d0\u4e00\u79cd\u573a\u666f\u8fdb\u884c\u5904\u7406\uff0c\u8fd9\u4e9b\u573a\u666f\u901a\u5e38\u662f\u5b58\u5728\u4e00\u4e9b\u5171\u6027\u7684\u3002\u6bd4\u5982\u8bf4\uff1a\u684c\u9762\u7684ID\u5206\u914d\u5b58\u5728\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u903b\u8f91\u5904\u7406\u89e3\u51b3ID\u5206\u914d\u9519\u8bef\u7684\u95ee\u9898\uff0c\u4f46\u662f\u8fd9\u90e8\u5206\u903b\u8f91\u6211\u4eec\u4f1a\u5728\u684c\u9762\u7684\u65b9\u6cd5\u5c42\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u517c\u5bb9\u6027","text":"\u4e3a\u4e86\u4fdd\u6301\u517c\u5bb9\u6027\uff0c\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u539f\u5219\u4e0a\u4e0d\u5bf9\u8001\u65b9\u6cd5\u8fdb\u884c\u4fee\u6539\u6216\u5220\u9664\uff0c\u53ea\u8fdb\u884c\u65b0\u589e\u3002\u6d89\u53ca\u5230\u8001\u65b9\u6cd5\u4fee\u6539\u6216\u5220\u9664\u7684\uff0c\u4f1a\u8fdb\u884c\u63d0\u524d\u9884\u544a\uff0c\u5e76\u5728\u7b2c\u4e8c\u4e2a\u7248\u672c\u4e4b\u540e\uff08\u4e2d\u95f4\u4f1a\u9694\u4e00\u4e2a\u7248\u672c\u8fc7\u5ea6\uff09\u6b63\u5f0f\u5b9e\u65bd\u4fee\u6539\u6216\u5220\u9664\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u547d\u540d\u89c4\u8303","text":" \u7528\u4f8b ID \u6bcf\u4e2a\u5e94\u7528\u81ea\u5df1\u7ef4\u62a4\u4e00\u5957 ID\uff0c\u5728PMS\u4e0a\u7528\u4f8b\u6807\u9898\u4e0a\u5c06\u81ea\u52a8\u5316ID\u4ee5\u6807\u7b7e\u7684\u5f62\u5f0f\u5199\u5165\uff0c\u6bd4\u5982\uff1a[101]\u6253\u5f00-\u542f\u52a8\u5e94\u7528\u540edock\u53f3\u952e\u83dc\u5355 \u4e00\u4e2a\u7528\u4f8b\u7c7b\u91cc\u9762\u6709\u591a\u4e2a\u7528\u4f8b\u65f6\uff0c\u5728\u7528\u4f8b\u540d\u79f0\u540e\u9762\u52a0\u5e8f\u53f7\u3002 class TestFileManager(BaseCase):\n\"\"\"\u6587\u7ba1\u7528\u4f8b\"\"\"\ndef test_xxx_015_1(self):\npass\ndef test_xxx_015_2(self):\npass\n \u6ce8\u610f 015_1\uff0c\u4e0d\u8981\u5199015_01\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 PMS \u4e0a\u7684\u7528\u4f8bID\uff1a PMS \u4e0a\u662f6\u4f4d\u6570\uff0c\u4e0d\u591f\u76f4\u89c2\uff0c\u4e5f\u4e0d\u597d\u7ef4\u62a4\uff0c\u5728\u81ea\u52a8\u5316\u4e0b\u9762\u53bb\u627e\u4e00\u4e2a\u5e26\u6709 6 \u4f4d\u6570\u7684\u6587\u4ef6\u662f\u4e00\u4e2a\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 PMS \u4e0a\u7684 ID \u53ef\u80fd\u4f1a\u53d1\u751f\u53d8\u5316\uff0c\u6bd4\u5982\u5bfc\u51fa\u6765\u5bfc\u8fdb\u53bb\u7684\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u5b58\u5728\u95ee\u9898\uff0c\u5982\u679c\u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u8981\u60f3\u627e\u51fa\u6765\u5bf9\u5e94\u4fee\u6539\u81ea\u52a8\u5316\u7528\u4f8b ID\uff0c\u5c06\u4f1a\u662f\u4ef6\u975e\u5e38\u75db\u82e6\u7684\u4e8b\u60c5\u3002 \u51fd\u6570\u547d\u540d\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5de6\u952e\u70b9\u51fb click \u53f3\u952e\u70b9\u51fb right_click \u53cc\u51fb double_click \u79fb\u52a8 move_to \u62d6\u52a8 drag \u65b0\u5efa new \u62d6\u52a8\u5230 drag_to \u4ece\u54ea\u91cc\u62d6\u52a8\u5230\u54ea\u91cc drag_something_from_xxx_to_xxx \u83b7\u53d6 get \u83b7\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5750\u6807 get_location \u975e\u7279\u6b8a\u6587\u4ef6 file word\u6587\u4ef6 doc text\u6587\u4ef6 text \u6587\u4ef6\u5939 dir \u5173\u952e\u8bcd\u6301\u7eed\u589e\u52a0 \u5e38\u91cf\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5e94\u7528\u540d\u79f0 APP_NAME \u5e94\u7528\u63cf\u8ff0 DESC \u672c\u5e94\u7528\u4ee5\u5916\u7684\u5176\u4ed6\u5e94\u7528\uff0c\u6bd4\u5982\u5e2e\u52a9 HELP \u5176\u4ed6\u540d\u79f0\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u65b9\u6cd5\u5305\u540d widget \u65b9\u6cd5\u6587\u4ef6\u540d\uff08\u6587\u7ba1\u4e3e\u4f8b\uff09 dfm_widget.pytitle_widget.pyright_view_widget.pyleft_view_widget.pypop_widget.pybase_widget.pydfm_assert.py \u65ad\u8a00\u8bed\u53e5\u547d\u540d\u89c4\u8303 \u65ad\u8a00\u8bed\u53e5\u90fd\u662f\u4ee5 assert \u5f00\u5934 \u65ad\u8a00 \u8bed\u53e5 \u5224\u65ad\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_existsassert_file_not_exists \u5224\u65ad\u684c\u9762\u76ee\u5f55\u4e0b\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_exists_in_desktopassert_file_not_exists_in_desktop \u5224\u65ad\u56fe\u7247\u5b58\u5728 assert_image_existsassert_image_not_exists \u5224\u65ad\u5f71\u9662\u4e2d\u662f\u5426\u5b58\u5728\u56fe\u7247 assert_image_exists_in_movieassert_image_not_exists_in_movie \u5224\u65ad\u5143\u7d20\u662f\u5426\u5b58\u5728 assert_element_existassert_element_not_exist \u5224\u65ad\u662f\u5426\u76f8\u7b49 assert_equalassert_not_equal \u5224\u65ad\u662f\u5426\u4e3a\u771f assert_trueassert_false"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5fixture","title":"5\u3001fixture \u89c4\u8303","text":"\u7531\u4e8e Pytest \u6846\u67b6\u4e2d\u652f\u6301 fixture \u7684\u5199\u6cd5\u548c Xunit \u5199\u6cd5\u7684\uff0c\u6240\u4ee5\u5e94\u7528\u5e93\u4e2d\u53ef\u80fd\u5b58\u5728\u6df7\u7528\u7684\u60c5\u51b5\uff0c\u4e3a\u7edf\u4e00\u7f16\u7801\u98ce\u683c\u65b9\u4fbf\u540e\u7eed\u7528\u4f8b\u4ee3\u7801\u7ef4\u62a4\uff0c\u73b0\u505a\u4ee5\u4e0b\u89c4\u8303\u8bf4\u660e\uff1a \u629b\u5f03 Xunit \u7684\u5199\u6cd5\uff0c\u7edf\u4e00\u91c7\u7528 Pytest fixture \u7684\u5199\u6cd5\u3002 \u5e94\u7528\u5185 fixture \u8c28\u614e\u4f7f\u7528 autouse=True \uff0c\u975e\u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u975e\u5e38\u4e0d\u5efa\u8bae\u4f7f\u7528\u8fd9\u4e2a\u53c2\u6570\u3002 \u8c03\u7528 fixture \u4e0d\u80fd\u4f7f\u7528 @pytest.mark.usefixture()\uff0c\u4f7f\u7528\u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u4f20\u5165\u51fd\u6570\u5bf9\u8c61\u3002 \u5efa\u8bae\u5728\u4e00\u4e2a conftest.py \u91cc\u9762\u53bb\u5199\uff0c\u4e00\u4e2a\u5e94\u7528\u4e5f\u5c3d\u91cf\u7ef4\u62a4\u4e00\u4e2a conftest.py\u6587\u4ef6\u3002 fixture \u4e5f\u9700\u8981\u5199\u529f\u80fd\u8bf4\u660e\uff0c\u51fd\u6570\u540d\u79f0\u8981\u6709\u5177\u4f53\u542b\u4e49\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#6","title":"6\u3001\u65b9\u6cd5\u7f16\u5199\u89c4\u8303","text":" \u65b9\u6cd5\u7c7b\u578b\uff1a if \u6ca1\u6709\u7528\u5230\u5b9e\u4f8b\u5bf9\u8c61\uff1a\nif \u6ca1\u6709\u7528\u5230\u7c7b\u5bf9\u8c61\uff1a\n\u5199\u9759\u6001\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @staticmethod\nelse\uff1a\n\u5199\u7c7b\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @classmethod\nelse:\n\u76f4\u63a5\u5199\u5b9e\u4f8b\u65b9\u6cd5\n \u4e3e\u4f8b: class TitleWidget:\ndef click_xxx_by_ui(self):\npass\n@staticmethod\ndef click_xxx_by_ui():\npass\n@classmethod\ndef click_xxx_by_ui(cls):\npass\n \u51fd\u6570\u540d\u79f0\u4e0d\u51fa\u73b0\u6570\u5b57\uff0c\u9700\u8981\u8868\u793a\u6570\u91cf\u7684\u7528\u5355\u8bcd\u8868\u793a\u3002 \u51fd\u6570\u529f\u80fd\u6ce8\u91ca\u3002 \u6ca1\u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg2:xxx\n\"\"\"\n \u6709\u53c2\u6570\uff0c\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg1:xxx\nreturn: xxx\n\"\"\"\n \u200b \u7528 Pycharm \u7684\u6ce8\u91ca\u6a21\u677f\u4e5f\u53ef\u4ee5\uff0c\u53ea\u8981\u4f53\u73b0\u4e86\u53c2\u6570\u7684\u7c7b\u578b\u548c\u8fd4\u56de\u5c31\u884c\u4e86\u3002 \u6682\u4e0d\u8981\u6c42\u5199\u7c7b\u578b\u6ce8\u89e3\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#7case","title":"7\u3001\u7528\u4f8b\uff08case\uff09\u89c4\u8303","text":" \u4ee5\u7c7b\u7684\u5f62\u5f0f\u5199\u7528\u4f8b\uff0c\u7528\u4f8b\u7c7b\u96c6\u6210\u7528\u4f8b\u57fa\u7c7b\u3002 \u7528\u4f8b\u7c7b\u9700\u8981\u5199\u6ce8\u91ca\u3002 \u6d4b\u8bd5\u7528\u4f8b\u51fd\u6570\u8bf4\u660e\uff08\u5efa\u8bae\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u540d\u79f0\uff09 \"\"\"\u53f3\u4fa7\u9884\u89c8-\u56fe\u7247\u7c7b\u578b\u4fe1\u606f\u680f\u57fa\u672c\u4fe1\u606f\"\"\"\n \u4e0d\u5199\u8c03\u8bd5\u4ee3\u7801 if __name__ == '__main__':\npytest.main()\n \u6240\u6709\u7528\u4f8b\u90fd\u7ee7\u627f BaseCase\u3002 BaseCase \u91cc\u9762\u653e\u4e00\u4e9b\u6d4b\u8bd5\u6570\u636e\u7684\u5e38\u91cf\uff0c\u6bd4\u5982\u6587\u4ef6\u540d\u79f0\uff0c\u5e94\u7528\u540d\u79f0\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u4e00\u4e9b\u901a\u7528\u7684\u5b57\u7b26\u4e32\u3002 \u8fd9\u7c7b\u662f\u5c5e\u4e8e\u6d4b\u8bd5\u6570\u636e\u3002 class BaseCase(DfmAssert):\n\"\"\"\u7528\u4f8b\u57fa\u7c7b\"\"\"\nNEW_FILE = \"\u65b0\u5efa\u6587\u672c.txt\"\nTEST_FILE = \"test.txt\"\nNEW_DIR = \"\u65b0\u5efa\u6587\u4ef6\u5939\"\nNEW_WORD = \"\u65b0\u5efaWord\u6587\u6863.doc\"\nAPP_HELP = \"damn\"\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\n\"\"\"\u7528\u4f8b\u6807\u9898\uff08\u590d\u5236PMS\u4e0a\u7528\u4f8b\u6807\u9898\uff09\"\"\"\ndfm = DfmWidget()\ndfm.click_xxx_by_attr(self.NEW_FILE)\ndfm.new_file_in_desktop_by_cmd(self.NEW_FILE)\nself.assert_true(dfm.get_process_status(self.APP_NAME))\n \u7528\u4f8b\u91cc\u9762\u5c3d\u91cf\u51cf\u5c11\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\uff0c\u66f4\u8981\u51cf\u5c11\u76f8\u540c\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\u3002 \u7edf\u4e00\u6587\u4ef6\u6ce8\u91ca\u5934\u3002 #!/usr/bin/env python3\n# _*_ coding:utf-8 _*_\n\"\"\"\n:Author:email@uniontech.com\n:Date :${DATE} ${TIME}\n\"\"\"\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#8","title":"8\u3001\u5176\u4ed6\u89c4\u8303","text":" \u65e5\u5fd7\u6253\u5370\u8981\u5728\u65b9\u6cd5\u6700\u524d\u9762\uff0c\u5426\u5219\u4ee3\u7801\u62a5\u9519\u6ca1\u6709\u65e5\u5fd7\u8f93\u51fa\uff0c\u4e0d\u597d\u5b9a\u4f4d\u95ee\u9898\u3002\uff08\u6211\u4eec\u4f1a\u8003\u8651\u7ee7\u7eed\u4f7f\u7528\u62e6\u622a\u5668\u6253\u5370\u65e5\u5fd7\uff09 \u6240\u6709\u7684\u64cd\u4f5c\u90fd\u9700\u8981\u6709\u65e5\u5fd7\uff0c\u5305\u62ec sleep()\uff0c\u6211\u4eec\u4f1a\u91cd\u5199\u4e00\u4e2a\u6709\u65e5\u5fd7\u8f93\u5165\u7684 sleep\u3002 \u4e1a\u52a1\u5c42\u65e5\u5fd7\u7ea7\u522b\u4e3a INFO\u3002 hook \u51fd\u6570\u53ea\u80fd\u5199\u5230\u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u91cc\u9762\u3002 apps \u76ee\u5f55\u4e0b\u7684 conftest.py \u539f\u5219\u4e0a\u4e0d\u4f1a\u65b0\u589e fixture\u3002 \u56fa\u5b9a\u76ee\u5f55\u6216\u5143\u7d20\u63a7\u4ef6\u7684\u64cd\u4f5c\uff0c\u5c06\u64cd\u4f5c\u65b9\u6cd5\u5199\u6b7b\uff0c\u6587\u4ef6\u7c7b\u64cd\u4f5c\u5c06\u6587\u4ef6\u540d\u7559\u53c2\u6570\u3002 \u8def\u5f84\u62fc\u63a5\u89c4\u8303\uff1a \u7cfb\u7edf\u4e2d\u56fa\u5b9a\u76ee\u5f55\uff0c\u8def\u5f84\u62fc\u63a5\u65f6\u4f7f\u7528\u6ce2\u6d6a\u7b26\u53f7\uff0c\u6bd4\u5982\uff1a~/Desktop/\uff0c\u4e0b\u5c42\u4f7f\u7528 os.path.expanduser()\uff0c\u5b83\u53ef\u4ee5\u81ea\u52a8\u8bc6\u522b\u6ce2\u6d6a\u7b26\u53f7\u3002 \u9879\u76ee\u4e0b\u8def\u5f84\u4f7f\u7528\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u8def\u5f84\uff0c\u6bd4\u5982\uff1aConfig.BASE_PATH\uff0c\u56e0\u4e3a\u9879\u76ee\u662f\u53ef\u4ee5\u5728\u4efb\u610f\u8def\u5f84\u8fd0\u884c\u7684\uff0c\u9700\u8981\u52a8\u6001\u62fc\u63a5\u8def\u5f84\u3002 "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848","text":"# =================================================\n# Author : Mikigo\n# Time : 2022/3/16\n# version \uff1a1.0\n# =================================================\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"AT \u5e94\u7528\u5e93\u6539\u9020\u662f\u57fa\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u8fdb\u884c\u7528\u4f8b\u65b9\u6cd5\u548c\u4e1a\u52a1\u903b\u8f91\u7684\u91cd\u65b0\u8bbe\u8ba1\uff0c\u4ee5\u5b9e\u73b0\u5e94\u7528\u5e93\u9ad8\u6548\u7684\u7f16\u5199\u3001\u7ef4\u62a4\u7528\u4f8b\u53ca\u5176\u65b9\u6cd5\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u6587\u4ef6\u7ba1\u7406\u5668\u4ece\u4e1a\u52a1\u590d\u6742\u5ea6\u548c\u7528\u4f8b\u91cf\u6765\u8bb2\uff0c\u5728\u7cfb\u7edf\u6240\u6709\u5e94\u7528\u4e2d\uff0c\u662f\u5f88\u6709\u4ee3\u8868\u6027\u7684\uff0c\u96be\u5ea6\u4e5f\u662f\u6700\u5927\u7684\uff0c\u56e0\u6b64\u6211\u4eec\u9009\u53d6\u6587\u4ef6\u7ba1\u7406\u5668\u4f5c\u4e3a\u5e94\u7528\u5e93\u6539\u9020\u7684\u5b9e\u9a8c\u5e94\u7528\uff0c\u7ed9\u540e\u7eed\u5176\u4ed6\u5e94\u7528\u6539\u9020\u63d0\u4f9b\u5207\u5b9e\u53ef\u884c\u7684\u601d\u8def\u548c\u65b9\u6848\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u5206\u5c42\u8bbe\u8ba1\u56fe","text":"\u6574\u4f53\u4ecd\u7136\u9075\u5faa PO \u8bbe\u8ba1\u7406\u5ff5\uff0c\u6839\u636e\u4e1a\u52a1\u9700\u8981\uff0c\u5c06\u6587\u7ba1\u4e1a\u52a1\u5c42\u8fdb\u884c 3 \u5c42\u5212\u5206\uff1a "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-dde-file-manager # \u5e94\u7528\u4ed3\u5e93\n\u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 test_xxx_001.py\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u00a0\u251c\u2500\u2500 __init__.py\n\u2502 \u00a0\u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u00a0\u251c\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u00a0\u251c\u2500\u2500 base_widget.py # \u65b9\u6cd5\u57fa\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 title_widget.py # title \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 right_view_widget.py # right view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 left_view_widget.py # left view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 pop_widget.py # pop \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 dfm_widget.py # \u65b9\u6cd5\u7684\u7edf\u4e00\u51fa\u53e3\n\u2502 \u00a0\u2514\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 tag # \u7528\u4f8b\u6807\u7b7e\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 xxx.csv # \u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2514\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u57fa\u7c7b","text":" \u7ee7\u627f\u6838\u5fc3\u5c42\u7684\u5404\u4e2a\u6a21\u5757\u7c7b\u3002 \u62bd\u53d6\u64cd\u4f5c\u5c42\u7684\u4e00\u4e9b\u57fa\u7840\u65b9\u6cd5\u3002 \u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u7684\u4e00\u4e9b\u516c\u5171\u65b9\u6cd5\u3002 \u8def\u5f84\u7ec4\u88c5\u65b9\u6cd5\u3002 \u4e00\u4e9b\u4e1a\u52a1\u5c42\u76f8\u5173\u7684\u53d8\u91cf\u3001\u5e38\u91cf\u3001shell\u547d\u4ee4\u3001\u5750\u6807\u3002 \u65b9\u6cd5\u57fa\u7c7b\u7684\u5199\u6cd5\uff1a from src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u64cd\u4f5c\u5c42","text":" \u6a21\u5757\u5212\u5206 \u6309\u7167\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u6587\u7ba1\u4e3b\u754c\u9762\u5206\u4e3a\u4e09\u4e2a\u533a\u57df\uff1a\u6807\u9898\u680f\u3001\u53f3\u8fb9\u89c6\u56fe\u533a\u57df\u3001\u5de6\u8fb9\u89c6\u56fe\u533a\u57df \u5f39\u7a97\uff1a\u8bbe\u7f6e\u754c\u9762\u5f39\u7a97\u3001\u4fdd\u9669\u7bb1\u5f39\u7a97\u3001\u5220\u9664\u786e\u8ba4\u5f39\u7a97\u3001\u53ca\u5404\u79cd\u7f51\u7edc\u5f39\u7a97 \u53f3\u952e\u83dc\u5355\uff1a\u6682\u65f6\u4e0d\u8003\u8651\u4e3a\u5355\u72ec\u7684\u6a21\u5757\uff0c\u8003\u8651\u4ee5\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6848\u505a\u6210\u516c\u5171\u5e93\u3002 \u5404\u4e2a\u6a21\u5757\u53ea\u7ee7\u627f\u57fa\u7c7b from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u6784\u9020\u51fd\u6570\u91cc\u9762\u4e0d\u6784\u9020\u5bf9\u8c61\uff0c\u53ef\u4ee5\u521d\u59cb\u5316\u4e00\u4e9b\u53d8\u91cf\u3002 \u4e0d\u540c\u7684\u5b9a\u4f4d\u65b9\u6848\u8c03\u7528\u4e0d\u540c\u7684\u5b9a\u4f4d\u5de5\u5177\u5bf9\u8c61\u3002 self.dog\nself.ui\nself.d_bus\n \u65b9\u6cd5\u7f16\u5199 \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u5e94\u7528\u5c42","text":" \u7ee7\u627f\u64cd\u4f5c\u5c42\u7684\u6240\u6709\u7c7b\u3002 \u4ec5\u4ec5\u7528\u4e8e\u7528\u4f8b\u4e2d\u5bfc\u5165\u65b9\u4fbf\uff0c\u4e0d\u505a\u5176\u4ed6\u4e8b\u60c5\u3002 class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n DfmAssert \u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u7ee7\u627f\uff0c\u65b9\u4fbf\u4f7f\u7528\u65ad\u8a00\u8bed\u53e5\u3002 from apps.dde_file_manager.widget.dfm_widget import DfmWidget\nfrom public.assert import Assert\nclass DfmAssert(Assert):\ndef assert_file_exists_in_desktop(self, file_name):\nself.assert_file_exists(f\"~/Desktop{file_name}\")\n...\nDfmWidget().get_file_in_desktop()\n \u7528\u4f8b\u91cc\u9762\u76f4\u63a5\u7ee7\u627f\uff0c\u65b9\u4fbf\u5728\u7528\u4f8b\u91cc\u9762\u4f7f\u7528 self \u8fdb\u884c\u65ad\u8a00\uff0c\u66f4\u7b26\u5408\u65ad\u8a00\u7684\u4f7f\u7528\u4e60\u60ef\uff0c\u7528\u4f8b\u903b\u8f91\u4e0a\u66f4\u6e05\u695a\u3002 class BaseCase(DfmAssert):\npass\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\nself.assert_file_exists_in_desktop(\"xxx\")\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u903b\u8f91\u4e3e\u4f8b","text":"\u7528\u4f8b\u4ee3\u7801\u8c03\u7528\u903b\u8f91\u4e3e\u4f8b\uff1a # BaseWidget\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n# =============================================\n# TitleWidget\nclass TitleWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_title_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# RightViewWidget\nclass RightViewWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_right_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# =============================================\n# \u51fa\u53e3 DfmWidget\nclass DfmWidget(TitleWidget, RightViewWidget):\npass\n# =============================================\n# in case\nfrom apps.dde_file_manager.widget.dfm_widget import DfmWidget\ndfm = DfmWidget()\ndfm.click_xxx_title_by_ui()\ndfm.click_xxx_right_by_ui()\ndfm.dog.print_desc()\ndfm.ui.print_number()\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u5de5\u7a0b\u6539\u9020\u5b9e\u65bd\u6b65\u9aa4","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_2","title":"1\u3001\u5de5\u7a0b\u4ee3\u7801\u62c9\u53d6","text":"1.1. \u5c06\u81ea\u52a8\u5316\u57fa\u7840\u6846\u67b6\u7684\u529f\u80fd\u62c9\u5230\u672c\u5730 Autotest Basic Frame \uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame 1.2. \u5c06\u5e94\u7528\u5e93\u4ee3\u7801\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u5e94\u7528\u5e93\u7684\u4ed3\u5e93\u547d\u540d\u5e94\u8be5\u662f\u957f\u8fd9\u6837\u7684 autotest_deepin_xxx\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_2","title":"2\u3001\u8c03\u6574\u5de5\u7a0b\u76ee\u5f55","text":"\u6309\u7167 \u65b9\u6848\u8bbe\u8ba1-\u76ee\u5f55\u7ed3\u6784 \u8fdb\u884c\u76ee\u5f55\u8c03\u6574\uff0c\u5c3d\u91cf\u4f7f\u7528\u7f16\u8f91\u5668\u8fdb\u884c\u76f8\u5e94\u7684\u8c03\u6574\uff0c\u7f16\u8f91\u5668\u63a8\u8350\u4f7f\u7528 Pycharm \uff0c\u4ee5\u4e0b\u64cd\u4f5c\u5747\u5728 Pycharm \u91cc\u9762\u53ef\u5b9e\u73b0\u3002 2.1. \u9700\u8981\u79fb\u52a8 py \u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u76f4\u63a5\u5728\u7f16\u8f91\u5668\u91cc\u9762\uff0c\u4f7f\u7528\u9f20\u6807\u9009\u4e2d\u5e76\u6309\u4f4f\uff0c\u4e4b\u540e\u62d6\u52a8\u5230\u76ee\u6807\u4f4d\u7f6e\u5373\u53ef\uff0cPycharm \u4f1a\u5c3d\u53ef\u80fd\u7684\u81ea\u52a8\u89e3\u51b3\u79fb\u52a8\u5bfc\u81f4\u7684\u8def\u5f84\u95ee\u9898\u3002\u6ce8\u610f\uff0c\u6211\u8bf4\u7684\u662f\u201c\u5c3d\u53ef\u80fd\u201d\uff0c\u6709\u4e9b\u9a9a\u64cd\u4f5c\u7f16\u8f91\u5668\u662f\u65e0\u6cd5\u81ea\u52a8\u5904\u7406\u7684\u3002\u5982\u679c\u6ca1\u6709\u88ab\u7f16\u8f91\u5668\u81ea\u52a8\u5904\u7406\u7684\u8def\u5f84\u95ee\u9898\uff0c\u540e\u7eed\u53ea\u80fd\u624b\u52a8\u89e3\u51b3\u3002 2.2. \u9700\u8981\u91cd\u547d\u540d\u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u5728\u7f16\u8f91\u5668\u91cc\u9762\u9009\u4e2d\u6587\u4ef6\uff0c\u7136\u540e\u4f7f\u7528\u5feb\u6377\u952e Shift + F6 \uff08\u5982\u679c\u5feb\u6377\u952e\u6ca1\u53cd\u5e94\uff0c\u6587\u4ef6\u53f3\u952e\u83dc\u5355 Refactor \u2014\u2014 Rename\uff09\uff0c\u7136\u540e\u5728\u8f93\u5165\u6846\u4e2d\u8f93\u5165\u8981\u91cd\u547d\u540d\u7684\u540d\u79f0\uff0c\u540c\u65f6\uff0c\u786e\u8ba4\u52fe\u9009 Search for references \u548c Search in comments and strings \u8fd9\u4e24\u4e2a\u9009\u9879\uff0c\u6700\u540e\u6309\u56de\u8f66\u6216\u8005\u9f20\u6807\u70b9 Refactor \u3002 \u6ce8\u610f\uff0c\u6b64\u65f6\u7f16\u8f91\u5668\u53ef\u80fd\u4f1a\u63d0\u793a\u4f60\uff0c\u4f60\u8fd9\u4e2a\u91cd\u547d\u540d\u7684\u64cd\u4f5c\u5173\u8054\u4e86\u591a\u4e2a\u6a21\u5757\uff0c\u5b83\u88ab\u591a\u4e2a\u5730\u65b9\u90fd\u4f7f\u7528\u5230\u4e86\uff0c\u76f8\u5173\u7684\u6a21\u5757\u662f\u5426\u4e5f\u4e00\u8d77\u6539\u540d\u4e86\uff0c\u8fd9\u4e0d\u5e9f\u8bdd\u5417\uff0c\u7528\u8fd9\u4e2a\u529f\u80fd\u5c31\u662f\u60f3\u628a\u5173\u8054\u5230\u7684\u90fd\u4fee\u6539\uff0c\u4e0d\u7136\u6211\u4e3a\u4ec0\u4e48\u4e0d\u7528\u6587\u7ba1\u7684\u91cd\u547d\u540d\u529f\u80fd\u5462\uff0c\u522b\u60f3\u4e86\uff0c\u76f4\u63a5\u70b9\u5de6\u4e0b\u89d2\u7684 Refactor \u6309\u94ae\uff0c\u5c31\u662f\u5e72\u3002 \u7c7b\u540d\u3001\u51fd\u6570\u540d\u7684\u91cd\u547d\u540d\u90fd\u5c3d\u91cf\u91c7\u7528\u8fd9\u79cd\u65b9\u6848\uff0c\u56e0\u4e3a\u7f16\u8f91\u5668\u4f1a\u81ea\u52a8\u7ed9\u6211\u4eec\u627e\u5230\u5173\u8054\u7684\u5730\u65b9\uff0c\u7136\u540e\u540c\u6b65\u4fee\u6539\u6389\u3002\u4f60\u53ef\u5343\u4e07\u522b\u76f4\u63a5\u5220\u4e86\u4fee\u6539\u540d\u79f0\uff0c\u4e0d\u7136\u4f60\u53ef\u80fd\u4f1a\u82b1\u4e0a\u4e00\u5929\u7684\u65f6\u95f4\u6765\u89e3\u51b3\u91cd\u547d\u540d\u7684\u95ee\u9898\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u5b9e\u73b0\u6838\u5fc3\u5e93\u63a5\u53e3","text":"3.1. BaseWidget \u5728 BaseWidget \u91cc\u9762\u628a\u8be5\u5199\u7684\u90fd\u5199\u597d\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u4e0a\u9762\u7684\u8bbe\u8ba1\u7406\u5ff5\u6765\u5199\u3002 \u5982\u679c\u4f60\u5acc\u9ebb\u70e6\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u6587\u7ba1\u7684\u5b9e\u9645\u5de5\u7a0b\u4ee3\u7801 autotest_dde_file_manager : https://gerrit.uniontech.com/admin/repos/autotest_dde_file_manager \u3002 3.2. \u64cd\u4f5c\u5c42 \u5982\u679c\u4f60\u662f\u65b0\u5199\u9879\u76ee\uff0c\u4f60\u4f1a\u53d1\u73b0\u4e00\u5207\u90fd\u662f\u90a3\u4e48\u7684\u7b80\u5355\u3001\u76f4\u63a5\uff0c\u6309\u7167\u6211\u4eec\u63d0\u4f9b\u7ed9\u4f60\u7684\u63a5\u53e3\u5199\u7528\u4f8b\u7684\u64cd\u4f5c\u65b9\u6cd5\u5c31\u597d\u4e86\u3002 \u5982\u679c\u4f60\u662f\u60f3\u5bf9\u539f\u6765\u7684\u5de5\u7a0b\u8fdb\u884c\u6539\u9020\uff0c\u4f60\u9700\u8981\u6309\u7167\u6838\u5fc3\u5e93\u65b9\u6cd5\u7684\u8c03\u7528\uff0c\u5c06\u4f60\u4e4b\u524d\u5199\u7684\u6bcf\u4e2a\u65b9\u6848\u8fdb\u884c\u5bf9\u5e94\u7684\u4fee\u6539\uff0c\u5305\u62ec\u7c7b\u548c\u65b9\u6cd5\u7684\u547d\u540d\u3001\u65b9\u6cd5\u5185\u6240\u8981\u7528\u5230\u4e0d\u540c\u5b9a\u4f4d\u65b9\u6cd5\u7684\u5199\u6cd5\u4fee\u6539\u3002 \u8fd9\u65f6\u5019\u4f60\u53ef\u80fd\u4f60\u7684\u4ee3\u7801\u4e2d\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u62a5\u9519\uff0c\u4e0d\u7528\u62c5\u5fc3\uff0c\u4f60\u53ef\u4ee5\u4ece\u4e1a\u52a1\u903b\u8f91\u51fa\u53d1\uff0c\u60f3\u6e05\u695a\u8fd9\u4e2a\u65b9\u6cd5\u662f\u5e72\u4ec0\u4e48\u7684\u3001\u64cd\u4f5c\u7684\u5bf9\u8c61\u662f\u4ec0\u4e48\u3001\u53c2\u6570\u662f\u4ec0\u4e48\uff0c\u6ce8\u610f\u8fd9\u4e9b\u4fee\u6539\u662f\u4f1a\u5f71\u54cd\u5230\u7528\u4f8b\u4ee3\u7801\u91cc\u9762\u7684\uff0c\u6ca1\u5173\u7cfb\uff0c\u7528\u4f8b\u91cc\u9762\u672c\u6765\u4e5f\u5e94\u8be5\u88ab\u5173\u8054\u4fee\u6539\u3002 3.3. \u628a\u914d\u7f6e\u6a21\u5757\u5199\u597d\uff0c\u8fd9\u90e8\u5206\u57fa\u672c\u53ef\u4ee5\u590d\u5236\u6587\u7ba1\u7684\u4ee3\u7801\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4_1","title":"4\u3001\u8def\u5f84\u5904\u7406","text":"4.1. \u5bfc\u5165\u8def\u5f84 \u65b9\u6cd5\u548c\u7528\u4f8b\u4e2d\u90fd\u4f1a\u6d89\u53ca\u5230\u5bfc\u5165\u8def\u5f84\u7684\u4fee\u6539\uff0c\u5728\u4fee\u6539\u8def\u5f84\u65f6\uff0c\u5efa\u8bae\u4f60\u4f7f\u7528 Ctrl + Shift + R \u5168\u5c40\u66ff\u6362\uff0c\u4f1a\u5c06\u6574\u4e2a\u9879\u76ee\u4e0b\u7684\u76f8\u540c\u5730\u65b9\u90fd\u4fee\u6539\u5230\uff0c\u5f53\u7136\uff0c\u4f60\u4e5f\u53ef\u4ee5\u5728\u5c0f\u5f39\u7a97\u4e2d\u4fee\u6539\u5168\u5c40\u66ff\u6362\u4e3a\u5c40\u90e8\u76ee\u5f55\u4e0b\u66ff\u6362\u3002\u5904\u7406\u90a3\u79cd\u6ca1\u6709\u5173\u8054\u5173\u7cfb\uff0c\u4f46\u662f\u53c8\u662f\u76f8\u540c\u540d\u79f0\u7684\u91cd\u547d\u540d\uff0c\u6211\u4e5f\u63a8\u8350\u4f7f\u7528\u8fd9\u79cd\u65b9\u5f0f\u8fdb\u884c\u91cd\u547d\u540d\u3002 \u6ce8\u610f\uff0c\u5168\u5c40\u66ff\u6362\u7684\u65b9\u5f0f\u4efb\u7136\u65e0\u6cd5\u4fdd\u8bc1\u771f\u7684\u5168\u5c40\u88ab\u66ff\u6362\u4e86\uff08\u53ef\u80fd\u662f\u7f16\u8f91\u5668\u7684 Bug \u5427\uff09\uff0c\u6240\u4ee5\u4f60\u4ecd\u7136\u9700\u8981\u624b\u52a8\u770b\u4e0b\u5404\u5904\u662f\u5426\u4fee\u6539\u5230\u4f4d\u3002 4.2. \u8d44\u6e90\u8def\u5f84 \u4e00\u4e9b\u7528\u4f8b\u8d44\u6e90\u9700\u8981\u6839\u636e config.py \u91cc\u9762\u7684\u8def\u5f84\u914d\u7f6e\u8fdb\u884c\u8d44\u6e90\u8def\u5f84\u7684\u62fc\u63a5\uff0c\u5982\u679c\u4f60\u539f\u6765\u672c\u6765\u5c31\u6709\u4e00\u4e2a\u51fd\u6570\u4e13\u95e8\u7528\u4e8e\u7ec4\u88c5\u8def\u5f84\u7684\uff0c\u90a3\u4f60\u53ea\u9700\u8981\u4fee\u6539\u8fd9\u4e00\u4e2a\u5730\u65b9\u5c31\u597d\u4e86\uff0c\u5982\u679c\u4f60\u4e4b\u524d\u5e76\u6ca1\u6709\u8fd9\u6837\u7684\u8bbe\u8ba1\uff0c\u90a3\u53ef\u80fd\u9700\u8981\u4fee\u6539\u5927\u91cf\u6d89\u53ca\u5230\u8d44\u6e90\u8def\u5f84\u7684\u5730\u65b9\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5","title":"5\u3001\u8c03\u8bd5\u548c\u7f16\u5199\u7528\u4f8b","text":"\u4ee5\u4e0a\u51e0\u4e2a\u6b65\u9aa4\u505a\u5b8c\uff0c\u57fa\u672c\u5c31\u53ef\u4ee5\u8fdb\u884c\u7528\u4f8b\u4ee3\u7801\u7684\u8c03\u8bd5\u4e86\uff0c\u8fd9\u90e8\u5206\u5de5\u4f5c\u4e3b\u8981\u89e3\u51b3\u4f60\u4e4b\u524d\u51e0\u4e2a\u6b65\u9aa4\u9057\u6f0f\u7684\u95ee\u9898\uff0c\u5982\u679c\u6240\u6709\u7528\u4f8b\u90fd\u8c03\u8bd5\u901a\u8fc7\u4e86\uff0c\u90a3\u4e48\u5de5\u7a0b\u6539\u9020\u5c31\u5168\u90e8\u5b8c\u6210\u4e86\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/","title":"AT \u5f00\u53d1\u89c4\u8303","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u5f00\u53d1\u89c4\u8303\u662f\u6839\u636e\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fd0\u884c\u4e24\u5e74\u591a\u6765\uff0c\u9047\u5230\u95ee\u9898\u89e3\u51b3\u95ee\u9898\u800c\u5f62\u6210\u7684\u4e00\u4e9b\u89e3\u51b3\u65b9\u6848\uff0c\u6216\u8005\u8bf4\u7ecf\u9a8c\u603b\u7ed3\uff1b\u8fd9\u4e9b\u7ecf\u9a8c\u7b26\u5408\u6211\u4eec\u73b0\u9636\u6bb5 AT \u6240\u5e94\u7528\u7684\u573a\u666f\u9700\u8981\uff0c\u4e5f\u662f\u6211\u4eec\u7ecf\u8fc7\u957f\u671f\u601d\u8003\uff0c\u4e0d\u65ad\u8bd5\u9519\u4e0d\u65ad\u4fee\u6b63\uff0c\u5e76\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u5b9e\u8df5\u4e2d\u68c0\u9a8c\u8fc7\u53ef\u884c\u7684\u3002\u4ee5\u6b64\uff0c\u5e0c\u671b\u80fd\u5e2e\u52a9\u53c2\u4e0e\u5230\u81ea\u52a8\u5316\u7684\u76f8\u5173\u4eba\u5458\u51cf\u5c11\u8bd5\u9519\u6210\u672c\uff0c\u66f4\u597d\u3001\u66f4\u5feb\u7684\u7f16\u5199\u7528\u4f8b\u53ca\u7ef4\u62a4\u7528\u4f8b\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_1","title":"\u4e00\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u89c4\u8303","text":"\u6807\u7b7e\u5316\u7ba1\u7406\u6587\u6863\u8bf7\u53c2\u8003\uff1a \u300a\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u64cd\u4f5c\u6307\u5f15\u300b \u4ee5\u4e0b\u8bf4\u51e0\u4e2a\u5bb9\u6613\u51fa\u73b0\u7684\u95ee\u9898\uff1a"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1","title":"1. \u5bf9\u5e94\u5173\u7cfb","text":" \u5199\u5b8c\u81ea\u52a8\u5316\u7528\u4f8b\u4e4b\u540e\uff0c\u8bf7\u5728 CSV \u6587\u4ef6\u4e2d\u6807\u8bb0\u7528\u4f8b\u7684 ID\u3001\u7b49\u7ea7\u3002\u4e3a\u4e86\u63d0\u9192\u6807\u8bb0\uff0c\u6267\u884c\u7528\u4f8b\u65f6\u5728\u9996\u884c\u4f1a\u8f93\u51fa ERROR \u65e5\u5fd7\uff1a CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94\u7684 ID\uff1b \u5728\u6700\u7ec8\u63d0\u4ea4\u4ee3\u7801\u4e4b\u524d\uff0c\u4f60\u9700\u8981\u5728 CSV \u6587\u4ef6\u91cc\u9762\u5c06ID\u3001\u7528\u4f8b\u7b49\u7ea7\u7b49\u6807\u7b7e\u8865\u5168\uff0c\u5982\u679c CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94 ID\uff0c\u540e\u7eed\u5728\u6279\u91cf\u6267\u884c\u7684\u65f6\u5019\uff0c\u8fd9\u4e9b\u7528\u4f8b\u662f\u4e0d\u4f1a\u6267\u884c\u7684\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2","title":"2. \u540d\u79f0\u4e00\u81f4","text":" CSV \u6587\u4ef6\u7684\u6587\u4ef6\u540d\u3001\u7528\u4f8b\u51fd\u6570\u4e2d\u95f4\u7684\u540d\u79f0\u4e00\u81f4\u3001\u7528\u4f8b py \u6587\u4ef6\u4e2d\u95f4\u7684\u540d\u79f0\uff0c\u8fd9\u4e09\u4e2a\u540d\u79f0\u4e00\u81f4\u3002 \u4e3e\u4f8b\uff1a # test_music_001.py\ndef test_music_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u90a3\u4e48 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e3a music.csv\u3002 AT \u6846\u67b6\u5e95\u5c42\u4ee3\u7801\u5b9e\u73b0\u662f\u5c06 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e0e\u7528\u4f8b\u51fd\u6570\u540d\u79f0\u540d\u79f0\uff08item.name\uff09\u8fdb\u884c\u5bf9\u5e94\uff0c\u56e0\u6b64\uff0c\u6ce8\u610f CSV \u6587\u4ef6\u540d\u79f0\u5bf9\u5e94\u7684\u662f\u7528\u4f8b\u51fd\u6570\u540d\u79f0\uff0c\u5373 def test_music_001 \u91cc\u9762\u7684 music \uff0c\u800c\u4e0d\u662f test_music_001.py \u91cc\u9762\u7684 music \u3002 \u8fd9\u91cc\u7ec6\u7ec6\u54c1\u4e00\u4e0b\u54c8~ \u5982\u679c\u4f60\u5c06\u4e0a\u4f8b\u5199\u6210\u4e86\u8fd9\u6837: # test_music_001.py\ndef test_movie_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u7528\u4f8b\u6267\u884c\u6ca1\u95ee\u9898\uff0c\u4f46\u662f\u6807\u7b7e\u5316\u7ba1\u7406\u662f\u4e0d\u751f\u6548\u7684\uff0c\u6846\u67b6\u65e0\u6cd5\u5c06 music.csv\u6587\u4ef6\u91cc\u9762\u6807\u7b7e\uff0c\u6dfb\u52a0\u5230 test_movie_001\u8fd9\u4e2a\u7528\u4f8b\u4e2d\uff0c\u56e0\u4e3a\u4ed6\u4eec\u6ca1\u6709\u5bf9\u5e94\u5173\u7cfb\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#tag","title":"\u4e8c\u3001\u5206\u652f\u53ca tag \u7ba1\u7406\u89c4\u8303","text":"\u53c2\u8003\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u4ee3\u7801\u7ba1\u7406\u89c4\u8303\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2-tag","title":"2. \u5e94\u7528\u5e93 tag","text":" \u5e94\u7528\u5e93 tag \u6839\u636e\u5e94\u7528\u4ea4\u4ed8\u8282\u70b9\u751f\u6210\uff0c\u6bcf\u6b21\u6253 tag \u4e4b\u524d\uff0c\u76f8\u5173\u6d4b\u8bd5\u4eba\u5458\u9700\u8981\u8fdb\u884c\u7528\u4f8b\u8c03\u8bd5\uff1b \u8c03\u8bd5\u7528\u4f8b\u662f\u6307\u7684\u5728\u5168\u67b6\u6784\uff08x86\u3001arm\u3001mips\uff09\u4e0a\u8c03\u8bd5\u901a\u8fc7\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\u8fbe\u5230 90% \u4ee5\u4e0a\u624d\u80fd\u6253 tag\uff0c\u901a\u8fc7 Jenkins \u6267\u884c\u5668\u6267\u884c\u7528\u4f8b\uff0c\u4fdd\u7559\u901a\u8fc7\u7387\u7ed3\u679c\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\uff1a\u901a\u8fc7\u7528\u4f8b\u6570 / (\u603b\u7528\u4f8b\u6570 - \u5df2\u5e9f\u5f03\u7528\u4f8b) \u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u7b97\u901a\u8fc7 Jenkins \u6267\u884c\u5668 \u4f60\u53ef\u80fd\u4f1a\u5728\u4e00\u4e2a\u4ea4\u4ed8\u5468\u671f\u5185\u6301\u7eed\u7684\u8fdb\u884cAT\u7528\u4f8b\u8c03\u8bd5\uff0c\u4f46\u662f\u6700\u7ec8 AT \u7528\u4f8b\u6253 tag \u7684\u5e94\u7528\u7248\u672c\uff0c\u9700\u8981\u4f7f\u7528\u5e94\u7528\u96c6\u6210\u4ea4\u4ed8\u7684\u6700\u65b0\u5e94\u7528\u7248\u672c\uff0c\u53ef\u4ee5\u4f7f\u7528\u5e94\u7528\u7684\u63d0\u6d4b\u7248\u672c\uff1b\u4e00\u5b9a\u8981\u786e\u4fdd\u8c03\u8bd5\u7528\u4f8b\u7684\u5e94\u7528\u7248\u672c\u662f\u6700\u65b0\u7684\uff0c\u4e0d\u7136\u96c6\u6210\u8fdb\u53bb\u4e4b\u540e\uff0c\u6301\u7eed\u96c6\u6210\u5c31\u4f1a\u51fa\u95ee\u9898\uff1b tag \u53f7\u600e\u4e48\u6253\uff1f \u6839\u636e\u6301\u7eed\u96c6\u6210\u7684\u8981\u6c42\u751f\u6210\uff0c\u5176\u4e2d\u5e94\u7528\u7248\u672c\u53f7\u9700\u8981\u4e0e\u9879\u76ee\u7ecf\u7406\u786e\u8ba4\u672c\u6b21\u5373\u5c06\u96c6\u6210\u7684\u5e94\u7528\u7248\u672c\u53f7\u662f\u591a\u5c11\uff1b tag \u7684 commit \u4fe1\u606f\u683c\u5f0f\uff1a # commit msg\nversion:5.6.5\n \u5176\u4e2d 5.6.5 \u5199\u5e94\u7528\u7684\u96c6\u6210\u7248\u672c\u53f7\u3002 \u751f\u6210 tag \u7684\u547d\u4ee4\u53c2\u8003\uff1a\u300aGit \u6807\u7b7e\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3-tag","title":"3. \u57fa\u7840\u6846\u67b6 tag","text":"\u57fa\u7840\u6846\u67b6 tag \u4e0d\u4e0e\u4e1a\u52a1\u6302\u94a9\uff0c\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u6309\u9700\u53d1\u5e03\u7248\u672c\uff0c\u5728\u6839\u76ee\u5f55\u4e0b CURRENT \u6587\u4ef6\u4e2d\u8bb0\u5f55\u7684\u5f53\u524d\u7248\u672c\u53f7\u548c\u5386\u53f2\u7248\u672c\u53f7\uff0c\u53ca\u5176\u5bf9\u5e94\u65b0\u589e\u4e86\u54ea\u4e9b\u529f\u80fd\uff0c\u6709\u52a9\u4e8e\u5e94\u7528\u9009\u62e9\u5408\u9002\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\u3002 # CURRENT\n[current]\ntag = 0.9.5\n \u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u7684 control \u6587\u4ef6\u8bb0\u5f55\u5f53\u524d\u5e94\u7528\u5e93\u4f9d\u8d56\u7684\u57fa\u7840\u5e93\u7248\u672c\u3002 # control\n[Depends]\nautotest-basic-frame = 0.9.5\n \u7528\u4f8b\u5728\u6267\u884c\u65f6\u4f1a\u6821\u9a8c\u4e24\u4e2a\u6587\u4ef6\u7684\u7248\u672c\u53f7\u662f\u5426\u4e00\u81f4\uff0c\u5982\u679c\u4e0d\u4e00\u81f4\uff0c\u4f1a\u6253\u5370 error \u65e5\u5fd7\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_2","title":"\u4e09\u3001\u4ed3\u5e93\u6743\u9650\u7ba1\u7406","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_1","title":"1. \u57fa\u7840\u6846\u67b6","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u4ed3\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame \u57fa\u7840\u6846\u67b6\u4e0d\u5141\u8bb8\u533f\u540d\u8bbf\u95ee\uff0c\u5982\u679c\u4f60\u767b\u5f55 gerrit \u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u8bbf\u95ee\u4ee5\u4e0a\u94fe\u63a5\uff0c\u5219\u9700\u8981\u7533\u8bf7\u8bbf\u95ee\u6743\u9650\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_1","title":"2. \u5e94\u7528\u4ed3\u5e93","text":" \u81ea\u52a8\u5316\u5e94\u7528\u4ed3\u5e93\uff1a https://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684 app_name \u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_3","title":"\u56db\u3001\u65b9\u6cd5\u7f16\u5199&\u8c03\u7528\u89c4\u8303","text":"\u65b9\u6cd5\u7f16\u5199\u6574\u4f53\u8bbe\u8ba1\u601d\u8def\u53c2\u8003\uff1a[\u300aAT\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b]"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_2","title":"1. \u65b9\u6cd5\u7f16\u5199","text":"\u5199\u65b9\u6cd5\u7684\u65f6\u5019\u6ce8\u610f\u65b9\u6cd5\u5f52\u5c5e\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget\uff0c\u65b9\u6cd5\u662f\u5728\u54ea\u4e2a\u533a\u57df\u64cd\u4f5c\u7684\uff0c\u5c31\u5199\u5728\u54ea\u4e2a\u7c7b\u91cc\u9762\u3002 \u4e3e\u4f8b\uff1a from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n\"\"\"\u70b9\u51fb\u6807\u9898\u680fxxx\"\"\"\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_2","title":"2. \u65b9\u6cd5\u8c03\u7528","text":" \u5728\u7528\u4f8b\u4e2d\u8c03\u7528\u65b9\u6cd5\uff0c\u901a\u8fc7\u8be5\u5e94\u7528\u552f\u4e00\u7684\u51fa\u53e3\u8fdb\u884c\u8c03\u7528\uff0c\u6bd4\u5982\u6587\u7ba1\uff1a class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n \u4e0d\u8981\u5728\u7528\u4f8b\u4e2d\u5355\u72ec\u53bb\u8c03\u7528 TitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u8fd9\u4e9b\u7c7b\uff0c\u5426\u5219\u540e\u671f\u7528\u4f8b\u4f1a\u53d8\u5f97\u4e0d\u597d\u7ef4\u62a4\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_4","title":"\u4e94\u3001\u7528\u4f8b\u7f16\u5199\u89c4\u8303","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_3","title":"1. \u57fa\u4e8e\u7c7b\u5199\u7528\u4f8b","text":"\u6240\u6709\u7528\u4f8b\u90fd\u5e94\u8be5\u57fa\u4e8e\u7c7b\u53bb\u5199\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001(self):\n\"\"\"\u97f3\u4e50\u542f\u52a8\"\"\"\n \u6ce8\u610f\u4ee5\u4e0b\u51e0\u70b9\uff1a \u7c7b\u540d\u4e0d\u8981\u968f\u4fbf\u53d6\uff0c\u540c\u4e00\u4e2a\u5e94\u7528\u5e94\u8be5\u4f7f\u7528\u540c\u4e00\u4e2a\u7c7b\u540d\uff0c\u7528\u4f8b\u7c7b\u540d\u79f0\u5fc5\u987b\u4ee5 Test \u5f00\u5934\uff0c\u9075\u5faa\u5927\u9a7c\u5cf0\u547d\u540d\u89c4\u8303\uff1b \u7528\u4f8b\u7c7b\u7ee7\u627f BaseCase\uff0c\u4e00\u4e2a\u5e94\u7528\u53ea\u6709\u4e00\u4e2a BaseCase \u4e00\u4e2a py \u6587\u4ef6\u91cc\u9762\u53ea\u6709\u4e00\u4e2a\u7c7b\uff0c\u6211\u4eec\u79f0\u4e3a\u4e00\u4e2a\u6d4b\u8bd5\u7c7b\uff1b \u4e00\u4e2a\u7c7b\u91cc\u9762\u53ef\u4ee5\u6709\u591a\u4e2a\u7528\u4f8b\u51fd\u6570\uff0c\u8fd9\u53d6\u51b3\u8fd9\u6761\u7528\u4f8b\u6709\u591a\u5c11\u4e2a\u6d4b\u8bd5\u70b9\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001_1(self):\n\"\"\"\u4efb\u52a1\u680f\u542f\u52a8\u97f3\u4e50\"\"\"\ndef test_music_001_2(self):\n\"\"\"\u542f\u52a8\u5668\u542f\u52a8\u97f3\u4e50\"\"\" \ndef test_music_001_3(self):\n\"\"\"\u684c\u9762\u542f\u52a8\u97f3\u4e50\"\"\"\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_3","title":"2. \u7528\u4f8b\u51fd\u6570\u89c4\u8303","text":" \u7528\u4f8b\u51fd\u6570\u4ee5 test \u5f00\u5934\uff0c\u9075\u5faa\u86c7\u5f62\u547d\u540d\u89c4\u8303\uff0c\u4e2d\u95f4\u4e3a\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0\uff0c\u540e\u9762\u52a0\u7528\u4f8b ID\uff0c\u6700\u540e\u52a0\u6d4b\u8bd5\u70b9\u5e8f\u53f7\uff0c\u5373 test_${module}_${case_id}[_${index}] \uff1b \u6bd4\u5982\uff1atest_music_001_1\uff0cindex \u4ece 1 \u5f00\u59cb\u3002 \u51fd\u6570\u529f\u80fd\u8bf4\u660e\u91cc\u9762\u5199\u7528\u4f8b\u6807\u9898\uff0c\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u6807\u9898\u5373\u53ef\uff0c\u6ce8\u610f\u7528\u4e09\u5bf9\u53cc\u5f15\u53f7\uff0c\u4e0d\u8981\u7528\u5176\u4ed6\u6ce8\u91ca\uff0c\u66f4\u4e0d\u8981\u7528\u4e95\u53f7\u6ce8\u91ca\u5199\u7528\u4f8b\u6807\u9898\uff1b \u76f4\u63a5\u590d\u5236 PMS \u7528\u4f8b \u7528\u4f8b\u6b65\u9aa4\u76f4\u63a5\u5c06 PMS \u4e0a\u7528\u4f8b\u6b65\u9aa4\u548c\u9884\u671f\u590d\u5236\u8fdb\u6765\uff0c\u7136\u540e\u8fdb\u884c\u6279\u91cf\u6ce8\u91ca\uff08ctrl + /\uff09\uff0c\u5728\u6ce8\u91ca\u7684\u57fa\u7840\u4e0a\u53bb\u5199\u7528\u4f8b\u811a\u672c\u4f1a\u66f4\u52a0\u65b9\u4fbf\u5168\u9762\uff0c\u4e5f\u6bd4\u4f60\u81ea\u5df1\u5199\u6ce8\u91ca\u66f4\u8282\u7ea6\u65f6\u95f4\uff1a \u4e3e\u4f8b\uff0cPMS \u7528\u4f8b\uff1a \u76f4\u63a5\u9009\u4e2d\u7528\u4f8b\u5185\u5bb9\uff0c\u590d\u5236\u4e0b\u6765\uff0c\u7136\u540e\u7c98\u8d34\u5230\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c\u4e2d\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\n \u4e0a\u4f8b\u4e2d\u4e95\u53f7\u6ce8\u91ca\u90e8\u5206\u5c31\u662f\u76f4\u63a5\u4ece PMS \u4e0a\u590d\u5236\u8fc7\u6765\u7684\uff0c\u5728\u6b64\u57fa\u7840\u4e0a\u5199\u7528\u4f8b\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\nmusic = DeepinMusicWidget()\nmusic.click_singer_btn_in_music_by_ui()\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\nmusic.click_icon_mode_in_music_by_ui()\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\nmusic.double_click_first_singer_in_singer_icon_view_by_ui()\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\nself.assert_xxx\n \u4f60\u770b\uff0c\u975e\u5e38\u6e05\u695a\u6bcf\u4e00\u6b65\u5728\u505a\u4ec0\u4e48\uff0c\u91cd\u70b9\u662f\u7701\u53bb\u4e86\u5199\u6ce8\u91ca\u7684\u65f6\u95f4\uff0c\u771f\u7684\u7092\u9e21\u65b9\u4fbf\u3002 \u4e0d\u5199 if __name__ == '__main__':\uff0c\u4e0d\u5199\u591a\u4f59\u7684\u4ee3\u7801\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3","title":"3. \u6570\u636e\u9a71\u52a8","text":" \u5982\u679c\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u662f\u76f8\u540c\u7684\uff0c\u53ea\u662f\u4e00\u4e9b\u53c2\u6570\u53d8\u5316\uff0c\u5c3d\u91cf\u4f7f\u7528\u6570\u636e\u9a71\u52a8\u6765\u5b9e\u73b0\u7528\u4f8b\uff1b \u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u6570\u636e\u9a71\u52a8\u7684\u6570\u636e\uff0c\u4e0d\u80fd\u56e0\u6b64\u5f15\u5165\u4f9d\u8d56\uff0c\u5c3d\u91cf\u4f7f\u7528\u4e00\u4e9b\u6807\u51c6\u5e93\u80fd\u8bfb\u53d6\u7684\u6587\u4ef6\u683c\u5f0f\uff0c\u6bd4\u5982 json\u3001ini\u3001CSV\u3001xml\u3001txt \u7b49\u6587\u4ef6\u683c\u5f0f\uff1b\u4e0d\u5efa\u8bae\u4f7f\u7528 Yaml\u3001Excel\u3001MySQL \u7b49\u6570\u636e\u683c\u5f0f\uff1b \u8bfb\u53d6\u6570\u636e\u65f6\u4e5f\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff0c\u5982\u4f7f\u7528 pandas \u5904\u7406 CSV \u5c31\u5c5e\u4e8e\u5927\u6750\u5c0f\u7528\u4e86\uff0c\u6b63\u5e38\u7684\u6570\u636e\u9a71\u52a8\u8fd8\u6ca1\u5230\u9700\u8981\u5927\u6570\u636e\u5206\u6790\u6765\u5904\u7406\u7684\u5730\u6b65\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u5728 widget/ddt/ \u76ee\u5f55\u4e0b\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5199\u6cd5\uff1a @pytest.mark.parametrize(\"value\", data)\ndef test_smb_049(self, value):\n \u4ee5\u4e0a\u8fd9\u79cd\u53c2\u6570\u5316\u7684\u5199\u6cd5\u672c\u8eab\u6ca1\u4ec0\u4e48\u95ee\u9898\uff0c\u4f46\u662f\uff0c\u8fd9\u91cc\u5fc5\u987b\u8981\u8865\u5145\u4e00\u4e2a\u6ca1\u6709\u7528\u7684\u5c0f\u77e5\u8bc6\uff1a \u5982\u679c\u53c2\u6570\u5316\u6570\u636e\u91cc\u9762\u7684\u5b57\u7b26\u4f1a\u539f\u5c01\u4e0d\u52a8\u7684\u8f93\u51fa\u5230 item.name \u91cc\u9762\uff0c\u663e\u793a\u975e\u5e38\u4e0d\u4f18\u96c5\uff0c\u800c\u4e14\u53ef\u4ee5\u4f1a\u5f15\u5165\u4e00\u4e9b\u610f\u60f3\u4e0d\u5230\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u611f\u53d7\u4e00\u4e0b\uff1a \u53c2\u6570\uff1a data = [\n\"\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\", \"qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678\",\n]\n \u73b0\u8c61\u662f\u8fd9\u6837\u8272\u513f\u7684\uff1a test_smb_049.py::TestFileManager::test_smb_049[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09]\ntest_smb_049.py::TestFileManager::test_smb_049[qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui]\ntest_smb_049.py::TestFileManager::test_smb_049[12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678]\n \u8bf4\u5b9e\u8bdd\uff0c\u770b\u7740\u5fc3\u91cc\u5835\u5f97\u614c\uff0c\u5982\u679c\u8fd9\u91cc\u9762\u5305\u542b\u4e00\u4e9b\u7279\u6b8a\u5b57\u7b26\u6216\u8005\u662f\u8d85\u957f\uff0c\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u5f88\u5947\u5999\u7684\u4e8b\u60c5\u53d1\u751f\u3002 parametrize \u91cc\u9762\u6709\u4e2a\u53c2\u6570\uff1aids\uff0c\u53ef\u4ee5\u89e3\u51b3\u6b64\u7c7b\u95ee\u9898\uff0c\u5c31\u50cf\u8fd9\u6837\uff1a @pytest.mark.parametrize(\"value\", data, ids=[1, 2, 3])\ndef test_smb_049(self, value):\n \u518d\u6765\u611f\u53d7\u4e00\u4e0b\uff1a test_smb_049.py::TestFileManager::test_smb_049[1]\ntest_smb_049.py::TestFileManager::test_smb_049[2]\ntest_smb_049.py::TestFileManager::test_smb_049[3]\n \u660e\u663e\u597d\u591a\u4e86\uff0c\u6240\u4ee5\u5c3d\u91cf\u4f7f\u7528 ids \u8fd9\u4e2a\u53c2\u6570\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 fixture \u7684\u6570\u636e\u9a71\u52a8\u65b9\u5f0f\uff0c\u6846\u67b6\u867d\u7136\u652f\u6301\uff0c\u4f46\u53ef\u8bfb\u6027\u6bd4\u8f83\u5dee\uff1b\u5982\u679c\u4f60\u4e0d\u77e5\u9053\u8fd9\u53e5\u8bdd\u5728\u8bf4\u5565\uff0c\u90a3\u4f60\u53ef\u4ee5\u5ffd\u7565\uff0c\u6211\u4e5f\u4e0d\u6253\u7b97\u8be6\u7ec6\u8bf4\u8fd9\u79cd\u5b9e\u73b0\u65b9\u5f0f\uff0c\u64cd\u4f5c\u6bd4\u8f83\u9a9a\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4","title":"4. \u65ad\u8a00\u8d44\u6e90","text":" \u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u76f4\u63a5\u653e\u5728\u7528\u4f8b\u6a21\u5757\u7684\u540c\u7ea7\u76ee\u5f55\u4e0b\u7684 assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0 + \u7528\u4f8b ID \u547d\u540d\uff1b \u56fe\u50cf\u8bc6\u522b\u65ad\u8a00\uff0c\u4e0d\u8981\u622a\u53d6\u4e00\u5f20\u5f88\u5927\u7684\u56fe\uff0c\u56fe\u7247\u8d44\u6e90\u5305\u542b\u7684\u5143\u7d20\u592a\u591a\u4e86\uff0c\u975e\u5e38\u5bb9\u6613\u53d7\u5230\u9700\u6c42\u5f71\u54cd\uff0c\u5efa\u8bae\u662f\u8fdb\u884c\u5c40\u90e8\u7684\u65ad\u8a00\uff1b \u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u5339\u914d\u5ea6\u662f 0.9\uff0c\u5982\u679c\u65ad\u8a00\u7684\u573a\u666f\u5bf9\u4e8e\u7cbe\u786e\u5ea6\u8981\u6c42\u6ca1\u90a3\u4e48\u9ad8\uff0c\u53ef\u4ee5\u5728\u65ad\u8a00\u8bed\u53e5\u91cc\u9762\u4f20\u5165\u5c0f\u4e8e 0.9 \u7684\u53c2\u6570\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5","title":"5. \u5143\u7d20\u5b9a\u4f4d","text":" \u7528\u4e8e\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u4e2d\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u547d\u540d\u4e3a\u8be5\u5143\u7d20\u7684\u540d\u79f0\uff1b \u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u622a\u53d6\u65f6\u5c3d\u91cf\u7cbe\u786e\u5230\u8fd9\u4e2a\u5177\u4f53\u7684\u6309\u94ae\uff0c\u56fe\u7247\u4e5f\u4e0d\u8981\u592a\u5927\uff1b \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u64cd\u4f5c\u8f83\u5feb\uff0c\u5408\u7406\u52a0\u5165\u7b49\u5f85\u65f6\u95f4\u80fd\u63d0\u9ad8\u7528\u4f8b\u7684\u7a33\u5b9a\u6027\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6","title":"6. \u7528\u4f8b\u8d44\u6e90","text":" \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u4f7f\u7528\u5230\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u6bd4\u5982\u97f3\u4e50\u53ef\u80fd\u9700\u8981\u4e00\u4e9b mp3 \u7684\u8d44\u6e90\u7528\u4e8e\u6d4b\u8bd5\uff0c\u5b58\u653e\u5728 widget/case_res \u76ee\u5f55\u4e0b\uff0c\u524d\u63d0\u662f\u8fd9\u4e9b\u8d44\u6e90\u4e0d\u8d85\u8fc7 10M\uff1b \u5982\u679c\u662f\u4e00\u4e9b\u6bd4\u8f83\u5927\u7684\u8d44\u6e90\uff0c\u5efa\u8bae\u653e\u5230\u7edf\u4e00\u7684 ftp \u670d\u52a1\u5668 \uff08ftp://10.8.10.245\uff09\uff0c\u9700\u8981\u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\u518d\u4e0b\u8f7d\u4e0b\u6765\uff1b f\"wget ftp://{Config.FTP_IP}/uploads/\u591a\u5a92\u4f53/\u5f71\u9662/auto/{file_name};unzip {file_name};rm -rf {file_name};\"\n \u6d4b\u8bd5\u8d44\u6e90\u4e0b\u8f7d\u5230\u5e94\u7528 widget/case_res \u76ee\u5f55\u4e0b\uff1b \u7981\u6b62\u5c06\u6d4b\u8bd5\u8d44\u6e90\u5b58\u653e\u5728\u4e2a\u4eba\u7684\u673a\u5668\u4e0a\uff1b \u5e94\u8be5\u5c3d\u91cf\u4fdd\u8bc1\uff0c\u4e00\u4e2a\u8d44\u6e90\u5728\u4e00\u6b21\u7528\u4f8b\u6267\u884c\u4e2d\u53ea\u9700\u8981\u4e0b\u8f7d\u4e00\u6b21\uff0c\u6240\u4ee5\u4f60\u4e0d\u80fd\u6bcf\u6b21\u4f7f\u7528\u7684\u65f6\u5019\u90fd\u53bb\u4e0b\u8f7d\uff0c\u8fd9\u6837\u53ef\u80fd\u4f1a\u8017\u8d39\u5927\u91cf\u7684\u7f51\u7edc\u8d44\u6e90\uff0c\u800c\u56e0\u4e3a\u5148\u5224\u65ad\u672c\u5730\u662f\u5426\u5b58\u5728\u6b64\u8d44\u6e90\uff0c\u5982\u679c\u4e0d\u5b58\u5728\u518d\u53bb\u4e0b\u8f7d\uff1b \u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u5c06\u8d44\u6e90\u62f7\u8d1d\u5230\u5bf9\u5e94\u7684\u6d4b\u8bd5\u76ee\u5f55\u4e0b\uff0c\u6bd4\u5982\u5c06 mp3 \u6587\u4ef6\u62f7\u8d1d\u5230 ~/Music \u76ee\u5f55\u4e0b\uff0c\u4f46\u662f\u6211\u4eec\u66f4\u5efa\u8bae\u4f60\u4f7f\u7528\u53d1\u9001\u5feb\u6377\u94fe\u63a5\u7684\u65b9\u5f0f\u66ff\u4ee3\u62f7\u8d1d\u7684\u64cd\u4f5c\uff0c\u56e0\u4e3a\u5728\u62f7\u8d1d\u5927\u6587\u4ef6\u65f6\u662f\u5f88\u6d88\u8017\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u800c\u521b\u5efa\u94fe\u63a5\u5219\u4e0d\u4f1a\uff1b @classmethod\ndef recovery_many_movies_in_movie_by_cmd(cls):\n\"\"\"\u6062\u590d\u591a\u4e2a\u89c6\u9891\u6587\u4ef6\u81f3\u89c6\u9891\u76ee\u5f55\u4e2d\"\"\"\nwork_path = f\"/home/{Config.USERNAME}/Videos/auto\"\ncode_path = f\"{Config.CASE_RES_PATH}/auto\"\ncls.run_cmd(f\"rm -rf {work_path};mkdir {work_path}\")\nsleep(1)\nflag = False\nif not exists(code_path):\ncls.run_cmd(f\"mkdir -p {code_path}\")\nflag = True\nlogger.info(f\"ln -s {code_path}/* {work_path}/\")\ncls.run_cmd(\nf\"cd {code_path}/;\"\nf\"{cls.wget_file('auto.zip') if flag else ''}\"\nf\"ln -s {code_path}/* {work_path}/ > /dev/null 2>&1\"\n)\n \u8d44\u6e90\u4e0b\u8f7d\u8fc7\u7a0b\u4e2d\u6ce8\u610f\u8d85\u65f6\u7684\u95ee\u9898\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u5f88\u5927\uff0c\u8981\u7279\u522b\u6ce8\u610f\u8fd9\u95ee\u9898\uff0c\u5982\u679c\u4f60\u4f7f\u7528\u5f3a\u5236\u7b49\u5f85\u4e0b\u8f7d\u7ed3\u675f( os.system )\uff0c\u53ef\u80fd\u4f1a\u9020\u6210\u7528\u4f8b\u6267\u884c\u65f6\u957f\u53d8\u5f97\u4e0d\u53ef\u63a5\u53d7\uff0c\u76ee\u524d\u6211\u4eec\u53d1\u73b0\u5728\u6301\u7eed\u96c6\u6210\u73af\u5883\u6267\u884c\u65f6\u7f51\u7edc\u4e0b\u8f7d\u901f\u5ea6\u5f88\u6162\uff0c\u6240\u4ee5\u8d85\u65f6\u673a\u5236\u662f\u5f88\u6709\u5fc5\u8981\u7684\uff1brun_cmd \u65b9\u6cd5\u6709\u4e00\u4e2a\u9ed8\u8ba4\u8d85\u65f6\u7684\u65f6\u95f4\uff0c\u4f60\u53ef\u4ee5\u6839\u636e\u8d44\u6e90\u5927\u5c0f\u5bf9\u8d85\u65f6\u65f6\u95f4\u8fdb\u884c\u8c03\u6574\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_5","title":"\u516d\u3001\u7528\u4f8b\u8c03\u8bd5\u6280\u5de7","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_4","title":"1. \u65e5\u5fd7","text":" \u4e00\u5b9a\u8981\u5148\u770b\u62a5\u9519\uff0c\u770b error \u65e5\u5fd7\uff0c\u901a\u5e38\u80fd\u660e\u786e\u7684\u544a\u8bc9\u4f60\u5177\u4f53\u54ea\u91cc\u4ee3\u7801\u62a5\u9519\uff1b \u7ed3\u5408\u62a5\u9519\u70b9\u524d\u9762\u7684error\u3001 info \u548c debug \u65e5\u5fd7\u770b\u5426\u662f\u6b63\u5e38\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_4","title":"2. \u65ad\u70b9\u8c03\u8bd5","text":" \u65b9\u6cd5\u62a5\u9519\uff1a \u5728\u65b9\u6cd5\u5e93\u4e2d\u627e\u5230\u5bf9\u5e94\u7684\u65b9\u6cd5\uff0c\u5355\u72ec\u8c03\u7528\uff0c\u770b\u662f\u5426\u80fd\u6b63\u5e38\u6267\u884c\uff1b \u901a\u5e38\u5355\u4e2a\u65b9\u6cd5\u7684\u6267\u884c\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u62a5\u9519\uff0c\u5f88\u5feb\u5c31\u80fd\u6392\u67e5\u51fa\u95ee\u9898\uff1b\u5728\u65b9\u6cd5\u5185\u90e8\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u65b9\u6cd5\u5185\u90e8\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u8c03\u7528\u6ca1\u95ee\u9898\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u62a5\u9519\u7684\u65b9\u6cd5\u524d\u9762\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u7528\u4f8b\u7684\u4e1a\u52a1\u903b\u8f91\u548c\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u65ad\u8a00\u62a5\u9519\uff1a \u65ad\u8a00\u4e3a\u6570\u636e\u65ad\u8a00\uff0c\u6839\u636e\u8868\u8fbe\u5f0f\u8fdb\u884c\u65ad\u8a00\u8bed\u53e5\u8fdb\u884c\u4fee\u6539\uff1b \u6587\u4ef6\u751f\u6210\u7c7b\u65ad\u8a00\uff0c\u67e5\u770b\u662f\u5426\u9700\u8981\u52a0\u7b49\u5f85\u65f6\u95f4\uff1b \u56fe\u50cf\u65ad\u8a00\uff0c\u5728\u65ad\u8a00\u8bed\u53e5\u5904\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u7528\u4f8b\u8fd0\u884c\u5230\u65ad\u8a00\u5904\u4f1a\u505c\u6b62\uff0c\u67e5\u770b\u6b64\u65f6\u65ad\u8a00\u7684\u56fe\u7247\u4e0e\u7528\u4f8b\u6267\u884c\u7684\u73b0\u573a\u5b58\u5728\u4ec0\u4e48\u5dee\u5f02\uff0c\u6b64\u65f6\u4e5f\u53ef\u4ee5\u8fdb\u884c\u91cd\u65b0\u622a\u56fe\uff0c\u4ece\u800c\u66ff\u6362\u65b0\u7684\u56fe\u7247\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3_1","title":"3. \u8fdc\u7a0b\u6267\u884c","text":" \u8fdc\u7a0b\u6267\u884c\u6307\u7684\u662f\u7f16\u8f91\u5668\u901a\u8fc7\u6307\u5b9a\u8fdc\u7a0b\u89e3\u91ca\u5668\u6267\u884c\u81ea\u52a8\u5316\u4ee3\u7801\uff1b \u8fdc\u7a0b\u6267\u884c\u7684\u597d\u5904\u662f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u7684 Debug \u8fd0\u884c\uff0c\u4e0d\u7528\u5728\u6d4b\u8bd5\u673a\u4e0a\u6253\u5f00\u7f16\u8f91\u5668\uff0c\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u66f4\u5feb\uff1b \u652f\u6301\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u7684\u7f16\u8f91\u5668\uff1a \u4e13\u4e1a\u7248 Pycharm VScode \uff0c\u9700\u8981\u4f7f\u7528\u63d2\u4ef6 Remote-SSH \u8fdc\u7a0b\u6267\u884c\u914d\u7f6e \u4ee5 Pycharm \u4e3a\u4f8b\uff1a File \u2014> Settings \u2014> Project \u2014> Python Interpreter \u2014> \u53f3\u8fb9\u8bbe\u7f6e\u6309\u94ae \u2014> Add... \u2014> SSH Interpreter \u2014> New server configuration(\u586b\u5165host\u548cusername) \u2014> Next \u2014> password\uff08\u6d4b\u8bd5\u673a\u5bc6\u7801\uff09 \u2014> Interpreter(\u9009\u62e9\u8fdc\u7a0b\u89e3\u91ca\u5668) \u2014> Finish "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4_1","title":"4. \u73af\u5883\u6e05\u7406","text":" \u5982\u679c\u7528\u4f8b\u91cc\u9762\u7684 teardown \u6ca1\u6709\u6267\u884c\uff0c\u5927\u6982\u7387\u662f\u56e0\u4e3a setup \u91cc\u9762\u4ee3\u7801\u62a5\u9519\uff0c\u8fd9\u4e24\u4e2a\u662f\u4e00\u5bf9\u7684\uff0csetup \u91cc\u9762\u62a5\u9519\uff0cteardown \u91cc\u9762\u7684\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\uff1b \u76ee\u524d\u6211\u4eec\u5df2\u7ecf\u5c06\u5404\u5e94\u7528\u7684 clean_all \u8fd9\u4e2a fixture \u6539\u6210\u4e86\u7ec8\u7ed3\u5668\uff0c\u786e\u4fdd\u59cb\u7ec8\u80fd\u6267\u884c\u5230\u8fd9\u6b65\uff0c\u4f46\u662f\u7528\u4f8b\u91cc\u9762\u7684 fixture\uff0c\u8fd8\u662f\u9700\u8981\u6211\u4eec\u5c0f\u5fc3\u5904\u7406\uff1b \u8981\u6267\u884c clean_all \u9700\u8981\u5728\u7f16\u8f91\u5668\u8fd0\u884c\u53c2\u6570\u52a0 --clean yes\uff0c\u5199\u7528\u4f8b\u7684\u65f6\u5019\u8bf7\u52a0\u4e0a\uff0c\u4e0d\u7136\u4f60\u4e0d\u786e\u5b9a\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u7684\u73af\u5883\u662f\u5426\u6062\u590d\uff1b setup \u53ef\u4ee5\u4e0d\u8981\uff0c\u5c06 setup \u653e\u5230\u7528\u4f8b\u91cc\u9762\u662f\u4e00\u79cd\u7a33\u59a5\u7684\u505a\u6cd5\uff0cteardown \u4e00\u5b9a\u8981\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5_1","title":"5. \u5143\u7d20\u5b9a\u4f4d\u4e0d\u51c6\uff08\u5750\u6807\u8fd4\u56de\u4e0d\u5bf9\uff09","text":" \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u53ef\u80fd\u53d7\u5230\u7a97\u53e3 ID \u7684\u53d8\u5316\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u9ed8\u8ba4\u53d6\u6700\u65b0\u7684\u4e00\u4e2a\u7a97\u53e3\u7528\u4e8e\u5b9a\u4f4d\uff0c\u4f46\u5982\u679c\u5b9e\u9645\u9700\u8981\u5b9a\u4f4d\u7684\u4e0d\u662f\u6700\u65b0\u7684\u7a97\u53e3\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u91cd\u65b0\u5b9e\u4f8b\u5316\u65b9\u6cd5\u7c7b\u5bf9\u8c61\uff0c\u5e76\u5728\u7c7b\u4e2d\u4f20\u5165\u5bf9\u5e94\u7684\u7a97\u53e3\u5e8f\u53f7\uff1b \u57fa\u4e8e\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u76ee\u524d\u9047\u5230\u7684\u7b14\u8bb0\u672c\u4e0a\uff0c\u7531\u4e8e\u5c4f\u5e55\u7f29\u653e\u6bd4\u4f8b\u4e3a 1.25\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u6211\u4eec\u9ed8\u8ba4\u4f7f\u7528\u7f29\u653e\u6bd4\u4f8b\u4e3a 1\uff1b \u57fa\u4e8e\u56fe\u50cf\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u76ee\u6807\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b \u57fa\u4e8e OCR \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u6587\u5b57\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u540c\u6837\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6_1","title":"6. \u952e\u9f20\u64cd\u4f5c\u4e0d\u51c6","text":" \u9f20\u6807\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6bd4\u5982\u53f3\u952e\u3001\u53cc\u51fb\u65e0\u54cd\u5e94\uff1b \u952e\u76d8\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6216\u8005\u5ef6\u8fdf\u8f93\u5165\uff0c\u6bd4\u5982\u7528\u4f8b\u9700\u8981\u8f93\u5165\u201c\u6211\u662f\u4e2d\u56fd\u4eba\u201d\uff0c\u5b9e\u9645\u53ea\u8f93\u5165\u4e86\u201c\u6211\u56fd\u4eba\u201d\uff1b \u4ee5\u4e0a\u95ee\u9898\u6392\u9664\u5e94\u7528\u5361\u987f\u7b49\u95ee\u9898\uff0c\u5927\u6982\u7387\u662f\u7531\u4e8e\u5de5\u5177\u7684\u95ee\u9898\uff0c\u76ee\u524d\u952e\u9f20\u64cd\u4f5c\u6211\u4eec\u4f7f\u7528\u4e09\u4e2a\u5de5\u5177\uff1aDogtail \u63d0\u4f9b\u7684\u952e\u9f20\u5de5\u5177\u3001PyAutoGUI\u3001Xdotool \uff1b \u6709\u540c\u5b66\u53ef\u80fd\u8981\u8bf4\u4e3a\u5565\u8981\u7528\u4e09\u4e2a\u554a\uff0c\u7528\u4e00\u4e2a\u4e0d\u5c31\u597d\u4e86\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u5404\u6709\u4f18\u70b9\u5404\u6709\u7f3a\u70b9\u3002 \u5982\u679c\u4f60\u9047\u5230\u952e\u9f20\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u8bd5\u8bd5\u901a\u8fc7\u4e0d\u540c\u7684\u5de5\u5177\u64cd\u4f5c\uff1b\u952e\u76d8\u8f93\u5165\u5ef6\u8fdf\u7684\u95ee\u9898\uff0c\u4e00\u822c\u662f\u56e0\u4e3a\u8f93\u5165\u901f\u5ea6\u592a\u5feb\u4e86\uff0c\u7cfb\u7edf\u6ca1\u53cd\u5e94\u8fc7\u6765\uff0c\u5e38\u89c1\u4e8e ARM \u548c MIPS \u4e0a\uff0c\u4fee\u6539\u53c2\u6570 delay_time \u7684\u503c\uff0c\u5355\u4f4d\u4e3a\u6beb\u79d2\uff1b # mouse_key.py\n@classmethod\ndef input_message(cls, message, delay_time=300, interval=0.2):\n\"\"\"\n \u8f93\u5165\u5b57\u7b26\u4e32\n :param message: \u8f93\u5165\u7684\u5185\u5bb9\n :param delay_time: \u5ef6\u8fdf\u65f6\u95f4\n :param interval:\n :return:\n \"\"\"\n \u5982\u679c\u4e0d\u662f\u65b9\u6cd5\u7684\u95ee\u9898\uff0c\u5219\u9700\u8981\u7ee7\u7eed\u548c\u5f00\u53d1\u4e00\u8d77\u6392\u9664\uff0c\u662f\u5426\u4e3a\u5e94\u7528\u63a5\u53d7\u952e\u9f20\u4fe1\u53f7\u5904\u7406\u7684\u95ee\u9898\uff0c\u8fd9\u7c7b\u60c5\u51b5\u6211\u4eec\u4e5f\u662f\u9047\u5230\u8fc7\u7684\uff0c\u5177\u4f53\u95ee\u9898\u5177\u4f53\u5206\u6790\u3002 \u6bd4\u5982\u5f71\u9662\u5c31\u91cd\u5199\u4e86\u4e00\u4e2a\u53f3\u952e\u7684\u65b9\u6cd5\uff1a # base_widget.py\n@classmethod\ndef right_click(cls, _x=None, _y=None):\n\"\"\"\n \u91cd\u5199\u5e95\u5c42\u5355\u51fb\u9f20\u6807\u53f3\u952e\n \u89e3\u51b3\u5f71\u9662\u53f3\u952e\u89e6\u53d1release\u4e8b\u4ef6\u7684\u95ee\u9898\uff08\u53f3\u952e\u4e3b\u7a97\u53e3\u4f1a\u64ad\u653e\u89c6\u9891\uff09\n \"\"\"\ncls.mouse_down(_x, _y, button=3)\nsleep(0.1)\ncls.mouse_up(button=3)\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_6","title":"\u4e03\u3001\u5176\u4ed6\u4e0d\u4e3a\u4eba\u77e5\u7684\u7ec6\u8282","text":" \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u5c3d\u91cf\u7f16\u5199\u540c\u4e00\u4e2a\u5e94\u7528\u6216\u6a21\u5757\u7684\u7528\u4f8b\uff0c\u80fd\u5bf9\u8be5\u7528\u4f8b\u5df2\u6709\u65b9\u6cd5\u719f\u6089\uff0c\u907f\u514d\u8fc7\u591a\u91cd\u590d\u4e1a\u52a1\u4ee3\u7801\u7684\u5c01\u88c5\uff1b \u76f8\u540c\u7684\u573a\u666f\u4e0b\uff0c\u5404\u67b6\u6784\u7b49\u5f85\u65f6\u95f4\u4e0d\u540c\uff0c\u5efa\u8bae\u4f7f\u7528\u6846\u67b6\u63d0\u4f9b\u7684 sleep\uff0c\u6211\u4eec\u505a\u4e86\u4e0d\u540c\u67b6\u6784\u7684\u500d\u6570\u653e\u5927\uff1b \u7f16\u5199\u7528\u4f8b\u65f6\uff0c\u5c3d\u91cf\u8003\u8651\u5230\u6bcf\u4e00\u6b65\u5f02\u5e38\u540e\u7684\u73af\u5883\u6062\u590d\uff0c\u9700\u8981\u5efa\u8bae\u8fd9\u79cd\u610f\u8bc6\uff0c\u968f\u65f6\u8981\u8003\u8651\u5230\uff0c\u8fd9\u6b65\u64cd\u4f5c\u6709\u6ca1\u6709\u53ef\u80fd\u51fa\u9519\uff0c\u51fa\u9519\u4e86\u6539\u600e\u4e48\u529e\uff1b \u63d0\u4ea4\u4ee3\u7801\u7684\u65f6\u5019\u6ce8\u610f\u4e0d\u8981\u628a\u4e00\u4e9b\u4e34\u65f6\u7684\u6d4b\u8bd5\u8d44\u6e90\u63d0\u4ea4\u8fdb\u53bb\u4e86\uff0c\u6bd4\u5982\u6d4b\u8bd5\u4e86\u4e00\u4e2a\u5f71\u7247\uff0c\u6709\u4e9b\u540c\u5b66\u4e60\u60ef\u4f7f\u7528 git add . \uff0c\u7136\u540e\u5c31\u5168\u90e8\u63d0\u4ea4\u5230\u4ee3\u7801\u4ed3\u5e93\u4e86\uff0c\u8fd9\u6837\u5373\u4f7f\u540e\u671f\u628a\u5927\u6587\u4ef6\u5220\u4e86\uff0c.git \u6587\u4ef6\u91cc\u9762\u4e5f\u4f1a\u5f88\u5927\uff0c\u9020\u6210\u4ee3\u7801\u4ed3\u5e93\u53d8\u5f97\u5341\u5206\u81c3\u80bf\u3002 \u66f4\u591a\u7ec6\u8282\u67e5\u770b\uff1a\u300aAT\u7ecf\u9a8c\u603b\u7ed3\u300b"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/","title":"AT \u6267\u884c\u5668\u4f7f\u7528\u6307\u5317","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/5/25\n# Author : litao\n# =============================================\n Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1","title":"1\u3001\u529f\u80fd\u4ecb\u7ecd","text":" \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7cfb\u7edf\u8bed\u8a00\u8bbe\u7f6e\uff0c\u5206\u8fa8\u7387\u8bbe\u7f6e\u53ca\u7528\u4f8b\u6267\u884c\u73af\u5883\u642d\u5efa\uff1b \u652f\u6301 IP \u4e3a 15 \u7f51\u6bb5\u7684 AMD \u67b6\u6784\u6d4b\u8bd5\u673a\u955c\u50cf\u88c5\u673a\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u6307\u5b9a\u5e94\u7528\uff0c\u6307\u5b9a\u8303\u56f4\u6807\u7b7e\u7684\u7528\u4f8b\u6267\u884c\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u72b6\u6001\u68c0\u67e5\uff0c\u662f\u5426\u6709\u6b63\u5728\u8fd0\u884c\u7684\u6d4b\u8bd5\uff1b \u652f\u6301\u914d\u7f6e\u7528\u4f8b\u6267\u884c\u65f6\u957f\uff0c\u9632\u6b62\u4efb\u52a1\u963b\u585e\uff1b \u652f\u6301\u6839\u636e\u5e94\u7528\u7248\u672c\u81ea\u52a8\u67e5\u627e\u5bf9\u5e94\u7684\u7528\u4f8b tag\uff1b \u652f\u6301\u5f02\u5e38\u5904\u7406\u548c\u6d4b\u8bd5\u5b8c\u6210\u7684\u5b9e\u65f6\u6d88\u606f\u901a\u77e5\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2job","title":"2\u3001Job \u4ecb\u7ecd","text":"\u4ee5\u4e0b\u6309\u6267\u884c\u6d41\u7a0b\u7684\u987a\u5e8f\u4ecb\u7ecd\uff0c\u6bcf\u4e00\u6b65\u90fd\u53ef\u4ee5\u5355\u72ec\u6267\u884c\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1_1","title":"1\u3001\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/AT_test/ \u6574\u4e2a\u6d41\u7a0b\u7684\u4e3b\u5165\u53e3\uff0c\u901a\u8fc7\u8fd9\u4e2a\u5165\u53e3\uff0c\u8fde\u540c\u6574\u4e2a\u6d4b\u8bd5\u6d41\u7a0b\uff0c\u955c\u50cf\u88c5\u673a\uff0c\u73af\u5883\u90e8\u7f72\uff0c\u6d4b\u8bd5\u5e94\u7528\u53ca\u751f\u6210\u62a5\u544a\u3002 \u53c2\u6570\u4ecb\u7ecd\uff1a \u6d4b\u8bd5\u673a\uff1a\u6240\u6709\u89c4\u6574\u5230\u56fa\u5b9a\u533a\u57df\u7684\u6d4b\u8bd5\u673a\uff0c\u901a\u8fc7\u6d4b\u8bd5\u540c\u5b66\u5bf9\u6d4b\u8bd5\u673a\u7684\u4e60\u60ef\u547d\u540d\uff0c\u5728\u540e\u53f0\u6620\u5c04\u6d4b\u8bd5\u673a\u7684\u8be6\u7ec6\u4fe1\u606f\uff0c\u62ec\u53f7\u4e2d\u4e3a\u6d4b\u8bd5\u673a IP \u7684\u6700\u540e\u4e00\u4f4d\uff1b \u6d4b\u8bd5\u5e94\u7528\uff1a\u6307\u5b9a\u7684\u6d4b\u8bd5\u5e94\u7528\u7684\u5305\u540d\uff0c\u7cfb\u7edf\u6839\u636e\u540d\u79f0\u81ea\u52a8\u62c9\u53d6\u5bf9\u5e94\u7684\u4ed3\u5e93\u4ee3\u7801\uff1b deb\u5305\u4e0b\u8f7d\u5730\u5740\uff1a\u6d4b\u8bd5\u4e0a\u8ff0\u5e94\u7528\u65f6\uff0c\u9700\u8981\u5b89\u88c5\u7684deb\u5305\u4e0b\u8f7d\u5730\u5740\uff0c\u591a\u4e2a\u5730\u5740\u7528\u201c,\u201d\u9694\u5f00\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff1b \u8303\u56f4\u6807\u7b7e\uff1a\u6267\u884c\u6d4b\u8bd5\u7528\u4f8b\u7684\u6807\u7b7e\u8303\u56f4\uff0c\u5bf9\u5e94\u7528\u4f8b\u4ee3\u7801 csv \u6587\u4ef6\u4e2d\u7684\u6807\u7b7e\u4fe1\u606f\uff0c\u4ee5 pytest \u7684mark\u8bed\u6cd5\u7f16\u5199\uff1b \u7cfb\u7edf\u8bed\u8a00\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u8bed\u8a00\u73af\u5883\uff1b \u5206\u8fa8\u7387\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u5206\u8fa8\u7387\u73af\u5883\uff1b \u955c\u50cf\u5730\u5740\uff1a\u955c\u50cf\u4ed3\u5e93\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u901a\u8fc7 PXE \u88c5\u673a\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u88c5\u673a\u73af\u8282\uff08\u76ee\u524d\u4ec5\u652f\u6301\u90e8\u5206 AMD \u67b6\u6784\u7684\u88c5\u673a\uff09\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2pxe","title":"2\u3001PXE \u88c5\u673a","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/IOS_install/ \u8f93\u5165\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\uff0cIP\uff0c\u5bc6\u7801\uff0c\u955c\u50cf\u5730\u5740\u540e\uff0c\u81ea\u52a8\u88c5\u673a\uff0c\u76ee\u524d\u4ec5\u652f\u6301\u56fa\u5b9a 15 \u7f51\u6bb5\u7684\u90e8\u5206 AMD \u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#3","title":"3\u3001\u6b21\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/all_client_test/ \u8be5\u5165\u53e3\u4e0e\u4e3b\u5165\u53e3\u529f\u80fd\u57fa\u672c\u4e00\u81f4\uff0c\u53ea\u662f\u5265\u79bb\u4e86PXE\u88c5\u673a\u6d41\u7a0b\uff0c\u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7684\u6267\u884c\u6d41\u7a0b\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#4","title":"4\u3001\u73af\u5883\u90e8\u7f72","text":"Jenkins url\uff1ahttps://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/env/build?delay=0sec \u8bbe\u7f6e\u6d4b\u8bd5\u673a\u7684\u7cfb\u7edf\u8bed\u8a00\uff0c\u5206\u8fa8\u7387\u53ca\u5b89\u88c5\u6d4b\u8bd5\u6240\u9700\u7684\u4f9d\u8d56\u5305\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#5","title":"5\u3001\u53d1\u9001\u4ee3\u7801","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/send_code/ \u6839\u636e\u6d4b\u8bd5\u5e94\u7528\u540d\u79f0\uff0c\u62c9\u53d6\u5bf9\u5e94\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u5e76\u6839\u636e\u6d4b\u8bd5\u673a\u4e0a\u5e94\u7528\u7248\u672c\u5207\u6362\u5230\u5bf9\u5e94\u7684tag\u7248\u672c\uff0c\u82e5\u672a\u627e\u5230tag\u7248\u672c\uff0c\u5219\u4f7f\u7528\u6700\u65b0\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u518d\u6839\u636e\u5e94\u7528\u5e93\u4ee3\u7801\u4e2d\u914d\u7f6e\u7684\u57fa\u7840\u5e93\u7248\u672c\uff0c\u62c9\u53d6\u57fa\u7840\u5e93\u4ee3\u7801\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#6","title":"6\u3001\u7528\u4f8b\u6267\u884c","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/run_test/ \u8fd0\u884c\u6d4b\u8bd5\u673a\u4e0a\u7684\u7528\u4f8b"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/","title":"AT \u7528\u4f8b\u7b5b\u9009\u6307\u5317","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u7528\u4f8b\u7b5b\u9009\u6807\u51c6\uff0c\u662f\u6311\u9009\u5408\u9002\u7684\u6587\u672c\u7528\u4f8b\u8fdb\u884c\u81ea\u52a8\u5316\u7528\u4f8b\u8f6c\u5316\u7684\u4e00\u4e9b\u901a\u7528\u6807\u51c6\u3002 \u8fc7\u53bb\u6211\u4eec\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u5b9e\u8df5\u8fc7\u7a0b\u4e2d\uff0c\u5199\u4e86\u4e0d\u5c11\u81ea\u52a8\u5316\u7528\u4f8b\uff0c\u968f\u7740\u9700\u6c42\u7684\u8fed\u4ee3\uff0c\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u81ea\u7136\u8150\u5316\uff0c\u56e0\u800c\u9700\u8981\u5728\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\u5bf9\u81ea\u52a8\u5316\u7528\u4f8b\u8fdb\u884c\u7ef4\u62a4\uff0c\u5728\u7ef4\u62a4\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u6211\u4eec\u53d1\u73b0\uff0c\u6709\u4e9b\u7528\u4f8b\u7ef4\u62a4\u8d77\u6765\u592a\u96be\u4e86\uff0c\u8c03\u8bd5\u7528\u4f8b\u8017\u8d39\u5927\u91cf\u65f6\u95f4\uff0c\u6210\u672c\u5f88\u9ad8\u3002 \u56e0\u6b64\uff0c\u6211\u4eec\u603b\u7ed3\u4e00\u4e9b\u81ea\u52a8\u5316\u7528\u4f8b\u9009\u578b\u7684\u6807\u51c6\uff0c\u4ee5\u4f18\u5316\u540e\u7eed\u81ea\u52a8\u5316\u7528\u4f8b\u7ed3\u6784\uff0c\u671f\u5f85\u6211\u4eec\u80fd\u7f16\u5199\u51fa\u9ad8\u6548\u3001\u7a33\u5b9a\u3001\u6613\u4e8e\u7ef4\u62a4\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_1","title":"\u4e00\u3001\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u53ef\u4ee5\u5206\u4e3a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u548c\u4e13\u9879\u81ea\u52a8\u5316\u6d4b\u8bd5\uff0c\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e00\u822c\u53ea\u9488\u5bf9\u4e00\u4e9b\u5e38\u89c4\u7684\u529f\u80fd\u6d4b\u8bd5\uff0c\u5176\u4ed6\u975e\u5e38\u89c4\u529f\u80fd\u7684\u7528\u4f8b\uff0c\u5e94\u8be5\u91c7\u7528\u4e13\u9879\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u6848\uff1b \u4ee5\u4e0b\u662f\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1","title":"1. \u7a33\u5b9a\u6027\u3001\u538b\u6d4b\u7528\u4f8b","text":"\u7a33\u5b9a\u6027\u6d4b\u8bd5\u3001\u538b\u6d4b\u7528\u4f8b\u5e94\u8be5\u662f\u5c5e\u4e8e\u6027\u80fd\u76f8\u5173\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u5982\uff1a\u53cd\u590d\u591a\u6b21\u70b9\u51fb\u6309\u94ae\uff0c\u68c0\u9a8c\u5176\u529f\u80fd\u7a33\u5b9a\u6027\u3002\u56e0\u4e3a\u8fd9\u4e9b\u7528\u4f8b\u65ad\u8a00\u7684\u9884\u671f\u53ef\u80fd\u4e0d\u662f\u5f88\u660e\u786e\uff0c\u66f4\u6709\u751a\u8005\u4e0d\u9700\u8981\u65ad\u8a00\uff0c\u7528\u4f8b\u65f6\u957f\u6bd4\u8f83\u957f\uff0c\u800c\u4e14\u4e0d\u53ef\u63a7\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u76ee\u524d\u6211\u4eec\u6709\u6027\u80fd\u81ea\u52a8\u5316\u7684\u4e13\u9879\u65b9\u6848\uff0c\u4ee5\u53ca\u4e00\u4e9b\u7a33\u5b9a\u6027\u6d4b\u8bd5\u7684\u4e13\u9879\u65b9\u6848\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u6b64\u7c7b\u7528\u4f8b\u653e\u5230\u4e13\u9879\u81ea\u52a8\u5316\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2","title":"2. \u6d89\u53ca\u591a\u4e2a\u7528\u6237\u64cd\u4f5c","text":"\u5e38\u89c1\u4e0e\u6587\u7ba1\u7684\u7528\u4f8b\u4e2d\uff0c\u591a\u7528\u6237\u64cd\u4f5c\u7684\u7528\u4f8b\u4e00\u822c\u90fd\u4f1a\u6d89\u53ca\u5230\u5728\u7cfb\u7edf\u4e2d\u8fdb\u884c\u591a\u4e2a\u7528\u6237\u95f4\u7684\u5207\u6362\uff0c\u81ea\u52a8\u5316\u811a\u672c\u4e00\u822c\u662f\u8fd0\u884c\u5728\u4e00\u4e2a\u7528\u6237\u7a7a\u95f4\u4e0b\u7684\uff0c\u6240\u4ee5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u591a\u7528\u6237\u95f4\u7684\u5207\u6362\u3002 \u6b64\u7c7b\u4e0d\u5efa\u8bae\u91c7\u7528\u81ea\u52a8\u5316\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3","title":"3. \u4e0e\u5f00\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4ea4\u4e92","text":"\u6b64\u7c7b\u573a\u666f\u591a\u4e3a\u5e94\u7528\u7684\u5f02\u5e38\u573a\u666f\u6d4b\u8bd5\uff0c\u6bd4\u5982\uff1a\u590d\u5236\u5927\u6587\u4ef6\u8fc7\u7a0b\u4e2d\u6ce8\u9500\u673a\u5668\u3002 \u81ea\u52a8\u5316\u811a\u672c\u5728\u7cfb\u7edf\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4e4b\u540e\u662f\u4f1a\u505c\u6b62\u8fd0\u884c\u7684\uff1b\u6b64\u7c7b\u7528\u4f8b\u53ef\u4ee5\u505a\u81ea\u52a8\u5316\uff0c\u4f46\u662f\u540c\u6837\u9700\u8981\u505a\u4e13\u9879\u65b9\u6848\uff0c\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u7684\u5904\u7406\u903b\u8f91\u5b8c\u5168\u4e0d\u540c\u3002 \u540e\u7eed\u81ea\u52a8\u5316\u9700\u8981\u516c\u5173\u7684\u70b9\uff1a \u81ea\u52a8\u5316\u811a\u672c\u5728\u672c\u673a\u8fd0\u884c\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u81f3\u5c11\u9700\u8981\u63d0\u4f9b\u4ee5\u4e0b\u529f\u80fd\uff1a \u91cd\u542f\u4e4b\u540e\u7528\u4f8b\u80fd\u81ea\u52a8\u8fd0\u884c\uff1b\u53ef\u4ee5\u8003\u8651\u5c06\u6267\u884c\u7528\u4f8b\u5199\u6210\u4e00\u4e2a\u5f00\u673a\u81ea\u542f\u7684\u670d\u52a1\uff1b \u80fd\u8bb0\u5f55\u5173\u673a\u4e4b\u524d\u7528\u4f8b\u6267\u884c\u7684\u4f4d\u7f6e\uff0c\u91cd\u542f\u4e4b\u540e\u80fd\u4ece\u6b64\u4f4d\u7f6e\u5f00\u59cb\u6267\u884c\uff1b \u50cf\u6027\u80fd\u81ea\u52a8\u5316\u4e00\u6837\uff0c\u7531\u670d\u52a1\u7aef\u63a7\u5236\uff1b \u5b8c\u5168\u57fa\u4e8e\u56fe\u5f62\u8bc6\u522b\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u4e32\u53e3\u7ebf\u63a7\u5236\u952e\u9f20\u7a33\u5b9a\u6027\uff1b "},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4","title":"4. \u6d4b\u8bd5\u6267\u884c\u65f6\u95f4\u957f","text":"\u7528\u4f8b\u6267\u884c\u65f6\u95f4\u63a7\u5236\u57282\u5206\u949f\u4ee5\u5185\uff0c\u6781\u7aef\u60c5\u51b5\u4e0d\u8981\u8d85\u8fc75\u5206\u949f\uff0c\u6240\u6709\u7528\u4f8b\u7684\u5e73\u5747\u65f6\u957f\u5e94\u8be5\u57281\u5206\u949f\u5de6\u53f3\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u95f4\u592a\u957f\uff0c\u7f16\u5199\u7528\u4f8b\u3001\u8c03\u8bd5\u7528\u4f8b\u3001\u6267\u884c\u7528\u4f8b\u3001\u7ef4\u62a4\u7528\u4f8b\u90fd\u975e\u5e38\u7684\u8017\u65f6\uff0c\u4eba\u529b\u6210\u672c\u65f6\u95f4\u6210\u672c\u6295\u5165\u592a\u9ad8\u3002 \u4f60\u60f3\uff0c\u8fd9\u6761\u7528\u4f8b\u6267\u884c\u9700\u89815\u5206\u949f\uff0c\u90a3\u4f60\u5199\u8fd9\u6761\u7528\u4f8b\u7684\u65f6\u95f4\u4e0d\u53ef\u80fd\u4e00\u904d\u8fc7\uff0c\u5199\u7684\u8fc7\u7a0b\u4e2d\u8dd1\u4e0d\u901a\u8fd8\u5f97\u91cd\u8dd1\u81f3\u5c1115\u5206\u949f\u4e0d\u8fc7\u5206\uff0c\u5199\u5b8c\u4e86\u8fd8\u5f97\u5728\u5176\u4ed6\u67b6\u6784\u4e0a\u8c03\u8bd5\uff0c\u534a\u4e2a\u5c0f\u65f6\u8fc7\u53bb\u4e86\uff0c\u8fd9\u8fd8\u53ea\u662f\u7b2c\u4e00\u6b21\u5199\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u540e\u7eed\u5982\u679c\u7528\u4f8b\u7ef4\u62a4\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u7ecf\u5e38\u6295\u5165\u76f8\u5f53\u957f\u65f6\u95f4\uff0c\u8fd9\u6837\u5176\u5b9e\u662f\u5931\u53bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u7684\u3002\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u5c31\u5e94\u8be5\u662f\u5feb\u51c6\u72e0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5","title":"5. \u8fb9\u7f18\u6027\u6d4b\u8bd5","text":"\u6709\u4e9b\u529f\u80fd\u6a21\u5757\u672c\u8eab\u662f\u5c5e\u4e8e\u6bd4\u8f83\u8fb9\u7f18\u6027\u7684\uff0c\u5373\u6781\u5c11\u7528\u6237\u4f1a\u4f7f\u7528\u5230\u7684\u529f\u80fd\uff0c\u8fd9\u7c7b\u529f\u80fd\u6a21\u5757\u4e0d\u9700\u8981\u5927\u89c4\u6a21\u5b9e\u73b0\u81ea\u52a8\u5316\uff0c\u4e00\u4e24\u4e2a\u573a\u666f\u8986\u76d6\u57fa\u672c\u529f\u80fd\u5c31\u884c\u4e86\uff0c\u56e0\u6b64\u6211\u4eec\u5728\u6311\u9009\u6b64\u7c7b\u7528\u4f8b\u7684\u65f6\u5019\u53ef\u4ee5\u7ed3\u5408\u6574\u4e2a\u529f\u80fd\u6a21\u5757\u7684\u8986\u76d6\u60c5\u51b5\u6765\u51b3\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6","title":"6. \u9700\u8981\u4f9d\u8d56\u4eba\u5de5\u4ecb\u5165\u7684","text":"\u81ea\u52a8\u5316\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\u662f\u6ca1\u6709\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bd4\u5982\u8981\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u90a3\u4e48\u5c31\u80cc\u79bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u3002 \u6bd4\u5982\u5149\u9a71\u6a21\u5757\uff0c\u5149\u9a71\u523b\u5f55\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u4f46\u662f\u5149\u9a71\u523b\u5f55\u4e4b\u540e\u5149\u76d8\u4f1a\u5f39\u51fa\u6765\uff0c\u9700\u8981\u4eba\u5de5\u66f4\u6362\u5149\u76d8\uff0c\u518d\u624b\u52a8\u63a8\u8fdb\u5149\u9a71\u4e2d\u3002 \u8fd9\u79cd\u529f\u80fd\u6a21\u5757\u5373\u4f7f\u505a\u81ea\u52a8\u5316\uff0c\u80fd\u6d89\u53ca\u5230\u7684\u529f\u80fd\u975e\u5e38\u6709\u9650\uff0c\u800c\u4e14\u4e0d\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u6240\u4ee5\u660e\u663e\u5c31\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7","title":"7. \u96be\u4ee5\u5b9e\u73b0\u7684","text":"\u7528\u4f8b\u6240\u6d89\u53ca\u5230\u7684\u65b9\u6cd5\u5b9e\u73b0\u8d77\u6765\u53ef\u80fd\u6709\u96be\u5ea6\uff0c\u751a\u81f3\u73b0\u9636\u6bb5\u65e0\u6cd5\u5b9e\u73b0\u7684\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002 \u6bd4\u5982\u5f71\u9662\u6d4b\u8bd5\u753b\u9762\u6e05\u6670\u5ea6\u3001\u6d41\u7545\u5ea6\u3001\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u4e4b\u540e\u7684\u89c6\u9891\u662f\u5426\u5b58\u5728\u5361\u987f\u7b49\u7528\u4f8b\uff0c\u73b0\u9636\u6bb5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#8","title":"8. \u529f\u80fd\u4e0d\u7a33\u5b9a","text":"\u8fd9\u4e2a\u4e0d\u662f\u8bf4\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\uff0c\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\u4e0d\u7a33\u5b9a\u662f\u6b63\u5e38\u7684\uff0c\u8fd9\u79cd\u6211\u4eec\u53ef\u4ee5\u7b49\u5f00\u53d1\u63d0\u6d4b\u4e4b\u540e\u518d\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u3002 \u529f\u80fd\u4e0d\u7a33\u5b9a\u6307\u7684\u662f\u7528\u4f8b\u6240\u6d89\u53ca\u7684\u529f\u80fd\uff0c\u53ef\u80fd\u5b58\u5728\u591a\u79cd\u53d8\u5316\uff0c\u6bcf\u6b21\u6267\u884c\u7528\u4f8b\u53ef\u80fd\u65ad\u8a00\u7684\u9884\u671f\u90fd\u4e0d\u540c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#9","title":"9. \u52a8\u6001\u65ad\u8a00","text":"\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u76f4\u5230\u7528\u4f8b\u7ed3\u675f\uff0c\u4e00\u76f4\u662f\u4e00\u4e2a\u52a8\u6001\u53d8\u5316\u7684\u8fc7\u7a0b\uff0c\u800c\u4e14\u65e0\u6cd5\u901a\u8fc7\u5176\u4ed6\u624b\u6bb5\u505c\u4e0b\u6765\uff1b \u6bd4\u5982\uff1a\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u65f6\uff0c\u53f3\u4e0b\u89d2\u7684\u5f55\u5236\u65f6\u95f4\u662f\u4e00\u76f4\u5728\u53d8\u5316\u7684\uff0c\u7528\u4f8b\u9700\u8981\u6d4b\u8bd5\u5f55\u52361\u5206\u949f\u4e4b\u540e\uff0c\u5f55\u5236\u65f6\u95f4\u662f\u521a\u597d\u505c\u572860\u79d2\uff1b \u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fd8\u505a\u4e0d\u5230\u65f6\u95f4\u7cbe\u51c6\u63a7\u5236\uff0c\u7a0b\u5e8f\u6267\u884c\u65f6\u95f4\u662f\u6709\u6ce2\u52a8\u7684\uff0c\u800c\u4e14\u8981\u9002\u914d\u591a\u4e2a\u5e73\u53f0\uff0c\u6240\u4ee5\u6b64\u7c7b\u7528\u4f8b\u5927\u6982\u7387\u4f1a\u6267\u884c\u5931\u8d25\u3002\u7279\u522b\u662f\u5728\u6027\u80fd\u8f83\u5dee\u7684\u56fd\u4ea7\u5316\u67b6\u6784\u4e0a\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u592a\u53ef\u80fd\u7a33\u5b9a\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#10","title":"10. \u63a2\u7d22\u6027\u6d4b\u8bd5","text":"\u63a2\u7d22\u6027\u6d4b\u8bd5\u901a\u5e38\u662f\u4e00\u4e9b\u4e0d\u786e\u5b9a\u7684\u64cd\u4f5c\uff0c\u591a\u53d8\u5207\u590d\u6742\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u9884\u671f\u4e5f\u53ef\u80fd\u662f\u4e0d\u786e\u5b9a\u7684\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u9a9a\u64cd\u4f5c\u592a\u591a\u4e86\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6b64\u7c7b\u7528\u4f8b\u9002\u5408\u91c7\u7528\u624b\u5de5\u6d4b\u8bd5\uff0c\u662f\u624b\u5de5\u6d4b\u8bd5\u771f\u6b63\u7684\u4ef7\u503c\u4f53\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#11","title":"11. \u6613\u7528\u6027\u6d4b\u8bd5","text":"\u5bf9\u4e8e\u6613\u7528\u6027\u7684\u5224\u65ad\u901a\u5e38\u662f\u4e3b\u89c2\u7684\uff0c\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\u5f88\u96be\u53bb\u5b9a\u4e49\u4ec0\u4e48\u6837\u7684\u60c5\u51b5\u5bf9\u7528\u6237\u662f\u6613\u7528\u7684\uff0c\u81ea\u52a8\u5316\u9700\u8981\u6709\u660e\u786e\u7684\u53ef\u5b9e\u73b0\u7684\u9884\u671f\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_2","title":"\u4e8c\u3001\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u524d\u9762\u8bb2\u4e86\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u4e00\u4e9b\u7528\u4f8b\u60c5\u51b5\uff0c\u6709\u540c\u5b66\u5c31\u8bf4\u4e86\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\u4e0d\u7528\u8bb2\u4e86\uff0c\u5c31\u662f\u4e0d\u9002\u5408\u7684\u53cd\u9762\u3002\u6ca1\u6bdb\u75c5\u54c8\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\uff0c\u6211\u4eec\u5927\u4f53\u8fd8\u53ef\u4ee5\u5206\u4e3a\u4e24\u7c7b\uff1a \u7b2c\u4e00\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u597d\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u7b2c\u4e8c\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u4e00\u822c\uff0c\u9700\u8981\u6295\u5165\u66f4\u591a\u7cbe\u529b\u624d\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u4ee5\u4e0b\u4ecb\u7ecd\u4e00\u4e9b\u6211\u4eec\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1_1","title":"1. \u64cd\u4f5c\u76f8\u5bf9\u7b80\u5355","text":"\u7528\u4f8b\u6b65\u9aa4\u76f8\u5bf9\u8f83\u5c11\uff0c\u8fd9\u79cd\u7528\u4f8b\u901a\u5e38\u662f\u4e00\u4e9b\u8def\u5f84\u5f88\u6d45\u7684\u7528\u4f8b\uff0c\u4e00\u822c\u4e5f\u662f\u4e00\u4e9b\u57fa\u7840\u7528\u4f8b\u3002\u7528\u4f8b\u7f16\u5199\u3001\u7ef4\u62a4\u90fd\u53ef\u4ee5\u8f7b\u677e\u641e\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2_1","title":"2. \u5bb9\u6613\u5b9e\u73b0","text":"\u73b0\u6709\u6280\u672f\u662f\u53ef\u5b9e\u73b0\u7684\uff0c\u6ca1\u6709\u96be\u5ea6\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3_1","title":"3. \u7ecf\u5e38\u7528\u4e8e\u56de\u5f52\u6d4b\u8bd5","text":"\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bcf\u6b21\u56de\u5f52\u6d4b\u8bd5\u5fc5\u987b\u8981\u6267\u884c\u7684\u7528\u4f8b\uff0c\u90a3\u4e48\u8fd9\u6761\u7528\u4f8b\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u3002 \u56de\u5f52\u6d4b\u8bd5\u65f6\u6211\u4eec\u9996\u5148\u5e94\u8be5\u4fdd\u8bc1\u5e94\u7528\u5386\u53f2\u57fa\u672c\u529f\u80fd\u6b63\u5e38\uff0c\u6240\u4ee5\u90a3\u4e9b\u6bcf\u6b21\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u90fd\u8981\u6267\u884c\u7684\u7528\u4f8b\u9002\u5408\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4_1","title":"4. \u529f\u80fd\u7a33\u5b9a\u7684\u6838\u5fc3\u529f\u80fd","text":"\u6d89\u53ca\u6838\u5fc3\u529f\u80fd\u7684\u7528\u4f8b\u662f\u6700\u6700\u91cd\u8981\u7684\u7528\u4f8b\uff0c\u4e5f\u662f\u6211\u4eec\u4ea4\u4ed8\u65f6\u5fc5\u987b\u8981\u4fdd\u8bc1\u8d28\u91cf\u7684\u76f8\u5173\u529f\u80fd\uff0c\u56e0\u6b64\u5e94\u8be5\u5c3d\u53ef\u80fd\u7684\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5_1","title":"5. \u8f93\u5165\u6570\u636e\u6d4b\u8bd5","text":"\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u901a\u5e38\u662f\u68c0\u9a8c\u88ab\u6d4b\u5e94\u7528\u63a5\u53d7\u6709\u6548\u6570\u636e\u3001\u62d2\u7edd\u65e0\u6548\u6570\u636e\u7684\u80fd\u529b\u3002\u5982\uff1a\u63d0\u4ea4\u8d85\u957f\u5b57\u7b26\u4e32\u3001\u7279\u6b8a\u5b57\u7b26\u4e32\u7b49\u7b49\u3002 \u6b64\u7c7b\u7528\u4f8b\u624b\u5de5\u6d4b\u8bd5\u5f88\u96be\u6bd4\u8f83\u5168\u9762\u7684\u8986\u76d6\u5230\u6240\u6709\u7684\u8f93\u5165\u60c5\u51b5\uff0c\u4f46\u662f\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\uff0c\u6b64\u7c7b\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u90fd\u662f\u4e00\u6837\u7684\uff0c\u53d8\u5316\u7684\u4ec5\u662f\u8f93\u5165\u53c2\u6570\u548c\u65ad\u8a00\u7ed3\u679c\uff0c\u91c7\u7528\u6570\u636e\u9a71\u52a8\uff0c\u53ef\u4ee5\u8f7b\u677e\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6_1","title":"6. \u683c\u5f0f\u8986\u76d6","text":"\u539f\u56e0\u540c\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u7c7b\u7528\u4f8b\u4e00\u6837\uff0c\u591a\u79cd\u683c\u5f0f\u7684\u8986\u76d6\u4e5f\u662f\u4e00\u4e2a\u5f88\u7e41\u7410\u7684\u4e8b\u60c5\uff0c\u4ea4\u7ed9\u81ea\u52a8\u5316\u6765\u505a\u518d\u5408\u9002\u4e0d\u8fc7\u4e86\u3002 \u6bd4\u5982\u5f71\u9662\u5bf9\u5f71\u7247\u683c\u5f0f\u7684\u68c0\u67e5\u3001\u622a\u56fe\u5f55\u5c4f\u5bf9\u4fdd\u5b58\u683c\u5f0f\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7_1","title":"7. \u68c0\u67e5\u5143\u7d20\u72b6\u6001","text":"\u67e5\u770b\u88ab\u6d4b\u5e94\u7528\u7684\u5143\u7d20\u5c5e\u6027\u3002\u5982\uff1a\u56fe\u7247\u7684\u5927\u5c0f\u548c\u6392\u5217\uff1b\u6309\u94ae\u7684\u53ef\u7528\u548c\u4e0d\u53ef\u7528\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/","title":"AT \u7ecf\u9a8c\u603b\u7ed3","text":"\u6b22\u8fce\u6240\u6709\u4eba\u63d0\u4ea4\u4f60\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u9762\u7684\u4f18\u79c0\u5b9e\u8df5\u7ecf\u9a8c\uff0c\u4ee5\u5e2e\u52a9\u5927\u5bb6\u89e3\u51b3\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#1","title":"1\u3001\u7ec8\u7ed3\u5668","text":"# litaoa@uniontech.com\n \u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4 pytest \u5b9e\u73b0\u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4\u7684\u65b9\u5f0f\u6709\u4e24\u79cd\uff0cyield \u548c\u7ec8\u7ed3\u51fd\u6570\uff1b yield \u5b9e\u73b0\uff0cyield\u524d\u9762\u4e3a\u7528\u4f8b\u7684\u524d\u7f6e\u6b65\u9aa4\uff0cyield \u540e\u9762\u4e3a\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4\u3002 @pytest.fixture\ndef clean_env():\nprint(\"setup\")\nyield\nprint(\"teardown\")\n \u7ec8\u7ed3\u51fd\u6570\u5b9e\u73b0\uff0c\u4f7f\u7528 request.addfinalizer \u6ce8\u518c\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4 @pytest.fixture\ndef clean_env(request):\ndef clean():\nprint(\"teardown\")\nrequest.addfinalizer(clean)\nprint(\"setup\")\n yield\u7684\u4f18\u7f3a\u70b9\uff1a \u4f18\u70b9\uff1a\u4ee3\u7801\u7b80\u6d01\uff0c\u76f4\u89c2\uff0c\u53ef\u4f7f\u7528yield\u5728\u7528\u4f8b\u4e2d\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c \u7f3a\u70b9\uff1a\u82e5\u524d\u7f6e\u6b65\u9aa4\u4e2d\u51fa\u73b0\u9519\u8bef\uff0c\u5219\u540e\u7f6e\u6b65\u9aa4\u4e0d\u4f1a\u6267\u884c \u7ec8\u7ed3\u51fd\u6570\uff1a \u4f18\u70b9\uff1a\u524d\u7f6e\u6b65\u9aa4\u5931\u8d25\u7684\u8bdd\uff0c\u540e\u7f6e\u6b65\u9aa4\u4ecd\u4f1a\u6267\u884c\u4e14\u53ef\u4ee5\u6ce8\u518c\u591a\u4e2a\u540e\u7f6e\u6b65\u9aa4\uff08\u524d\u63d0\uff1a\u9700\u8981\u5728\u4ee3\u7801\u62a5\u9519\u4e4b\u524d\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff09\uff0c\u652f\u6301\u7075\u6d3b\u4f7f\u7528\u540e\u7f6e\u6761\u4ef6 \u7f3a\u70b9\uff1a\u4ee3\u7801\u8f83\u4e3a\u590d\u6742\uff0c\u65e0\u6cd5\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c\uff08\u672c\u4eba\u76ee\u524d\u672a\u5b9e\u73b0\uff09 \u603b\u7ed3\uff1a\u5728\u524d\u7f6e\u6b65\u9aa4\u4fdd\u8bc1\u7edd\u5bf9\u4e0d\u4f1a\u51fa\u9519\u65f6\uff0c\u4f7f\u7528yield\u66f4\u4f73\u7b80\u4fbf\uff0c\u5f53\u524d\u7f6e\u6b65\u9aa4\u6613\u51fa\u73b0\u95ee\u9898\u65f6\uff0c\u63a8\u8350\u4f7f\u7528\u7ec8\u7ed3\u51fd\u6570\u3002 \u573a\u666f\uff1a\u4fdd\u9669\u7bb1\u7528\u4f8b\uff0c\u524d\u7f6e\u6b65\u9aa4\u4e2d\u5f00\u542f\u4fdd\u9669\u7bb1\uff0c\u540e\u7f6e\u6b65\u9aa4\u5220\u9664\u4fdd\u9669\u7bb1\u3002 @pytest.fixture(scope=\"session\", autouse=True)\ndef vault_fixture(request):\nDfmWidget.reset_vault_by_cmd() # 1\u3001\u91cd\u7f6e\u4fdd\u9669\u7bb1\nDdeDockPublicWidget().close_file_manager_by_cmd() # 2\u3001\u5173\u95ed\u6587\u7ba1\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 3\u3001\u5f00\u542f\u6587\u7ba1\nvault = DfmWidget()\nvault.create_file_vault() # 4\u3001\u521b\u5efa\u4fdd\u9669\u7bb1\ndef delete_vault(): # 8\u3001\u5220\u9664\u4fdd\u9669\u7bb1\u7684\u540e\u7f6e\u6b65\u9aa4\nsleep(2)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr()\nvault = DfmWidget()\nvault.delete_file_vault()\nDfmWidget.reset_vault_by_cmd()\nDdeDockPublicWidget().close_file_manager_by_cmd()\nrequest.addfinalizer(delete_vault) # 5\u3001\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\nDdeDockPublicWidget().close_file_manager_by_cmd() # 6\u3001\u5173\u95ed\u6587\u7ba1\nsleep(1)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 7\u3001\u5f00\u542f\u6587\u7ba1\n \u4ee3\u7801\u6309\u6ce8\u91ca\u4e2d\u7684\u5e8f\u53f7\u6267\u884c\u6b65\u9aa4 \u4ee3\u7801\u5728\u6b65\u9aa41-4\u4efb\u610f\u4f4d\u7f6e\u62a5\u9519\uff0c\u5219\u4e0d\u4f1a\u6267\u884c\u6b65\u9aa48\uff0c\u56e0\u4e3a\u672a\u6267\u884c\u5230\u6b65\u9aa45\uff0c\u6b65\u9aa48\u8fd8\u672a\u6ce8\u518c \u4ee3\u7801\u5728\u6b65\u9aa46-7\u62a5\u9519\uff0c\u4ecd\u4f1a\u6267\u884c\u6b65\u9aa47\uff0c\u56e0\u4e3a\u5728\u6b65\u9aa45\u4e2d\u5df2\u7ecf\u5c06\u6b65\u9aa47\u6ce8\u518c \u53ef\u4ee5\u7075\u6d3b\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff0c\u80fd\u5b9e\u73b0\u67d0\u4e2a\u524d\u7f6e\u6b65\u9aa4\u6267\u884c\u4e4b\u540e\uff0c\u624d\u4f1a\u6267\u884c\u540e\u7f6e\u6b65\u9aa4\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#2","title":"2\u3001\u542f\u52a8\u5e94\u7528\u7684\u65b9\u5f0f","text":"# huangmingqiang@uniontech.com\n \uff081\uff09\u547d\u4ee4\u884c\u542f\u52a8 \u5728 AT \u4ee3\u7801\u4e2d\u4f7f\u7528\u547d\u4ee4\u884c\u542f\u52a8\u5e94\u7528\uff0c\u4e3e\u4f8b\uff1a os.popen(\"deepin-music\")\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f7f\u7528 ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6\uff0cdogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u3002 \uff082\uff09\u901a\u8fc7 UI \u64cd\u4f5c\u542f\u52a8 \u901a\u8fc7\u4efb\u52a1\u680f\u3001\u542f\u52a8\u5668\u3001\u684c\u9762\u7b49UI\u65b9\u5f0f\u542f\u52a8\uff0c\u6bd4\u5982\u53cc\u51fb\u6253\u5f00\u3001\u53f3\u952e\u6253\u5f00\u7b49\uff0c\u8fd9\u79cd\u64cd\u4f5c\u65b9\u5f0f\u4e0d\u5b58\u5728ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6dogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u7684\u95ee\u9898\uff0c\u4e5f\u66f4\u52a0\u7b26\u5408\u7528\u6237\u7684\u64cd\u4f5c\u884c\u4e3a\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#3","title":"3\u3001\u6587\u4ef6\u9009\u62e9\u6846\u5c5e\u6027\u5b9a\u4f4d\u5076\u73b0\u65e0\u6cd5\u627e\u5230","text":"\u6587\u4ef6\u9009\u62e9\u6846\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5728\u8c03\u7528\u6587\u4ef6\u9009\u62e9\u6846\u65f6\uff0c\u6709\u4e00\u5b9a\u7684\u6982\u7387\u51fa\u73b0\uff0c\u754c\u9762\u5df2\u7ecf\u6e32\u67d3\u51fa\u6765\u4e86\uff0c\u4f46\u662f\u5c5e\u6027\u6811\u5e76\u6ca1\u6709\u5199\u5165\uff0c\u5bfc\u81f4\u901a\u8fc7\u5c5e\u6027\u65e0\u6cd5\u627e\u5230\u5143\u7d20\uff0c\u76ee\u524d\u4e5f\u6ca1\u6709\u5f88\u597d\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u4e3a\u4e86\u7528\u4f8b\u7a33\u5b9a\u6027\uff0c\u6587\u4ef6\u9009\u62e9\u6846\u7684\u64cd\u4f5c\u5efa\u8bae\u4f7f\u7528UI\u6216\u8005\u56fe\u7247\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u53ef\u4ee5\u901a\u8fc7\u641c\u7d22\u5185\u5bb9\u56fa\u5b9a\u6587\u4ef6\u4f4d\u7f6e\u3002 # litaoa@uniontech.com\n desk = DdeDesktopPublicWidget()\n# \u9009\u62e9\u89c6\u9891\u76ee\u5f55\ndesk.click_videos_dir_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.ctrl_f()\nsleep(1)\ndesk.input_message(\"\u5143\u7d20\u540d\u79f0\")\nsleep(0.5)\ndesk.enter()\nsleep(1)\n# \u9009\u62e9\u7b2c\u4e00\u4e2a\u6587\u4ef6\ndesk.click_list_view_btn_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.click_first_file_in_desktop_plugs_by_ui()\nsleep(1)\n# \u6587\u7ba1\u63d2\u4ef6\u4e2d\u70b9\u51fb\u6253\u5f00\ndesk.click_open_btn_in_desktop_plugs_by_ui()\n"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#4","title":"4\u3001\u5e94\u7528\u542f\u52a8","text":"# mikigo\n \u5728UI\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u4e00\u5207\u64cd\u4f5c\u7684\u90fd\u662f\u4ece\u5e94\u7528\u542f\u52a8\u5f00\u59cb\u7684\uff0c\u800c\u5728Linux\u684c\u9762\u5e94\u7528\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u6211\u4eec\u542f\u52a8\u5e94\u7528\u7684\u65b9\u6cd5\u6709\u591a\u79cd\uff0c\u4e0b\u9762\u505a\u4e00\u4e2a\u7b80\u5355\u7684\u4ecb\u7ecd\uff1a \u3010\u4f7f\u7528dogtail\u542f\u52a8\u3011 dogtail\u63d0\u4f9b\u4e86\u5e94\u7528\u542f\u52a8\u7684\u65b9\u6cd5\uff0c\u5728utils\u5e93\u4e2d\uff0c\u4f7f\u7528run\u65b9\u6cd5\u542f\u52a8\uff1a \u9996\u5148\u5bfc\u5165\u65b9\u6cd5\uff1a from dogtail.utils import *\n \u8c03\u7528run\u65b9\u6cd5 run('deepin-music')\n \u5373\u53ef\u542f\u52a8\u97f3\u4e50 \u8fd9\u79cd\u65b9\u6cd5\u7684\u4f18\u70b9\u662f\u91c7\u7528\u8fdb\u7a0b\u7684\u65b9\u5f0f\u76f4\u63a5\u542f\u52a8\uff0c\u4e0d\u4f9d\u8d56\u4e0eUI\uff0c\u65e0\u8bba\u684c\u9762\u6216\u4efb\u52a1\u680f\u4e0a\u662f\u5426\u5b58\u5728\u5e94\u7528\u56fe\u6807\uff0c\u90fd\u53ef\u4ee5\u6b63\u5e38\u542f\u52a8\u3002 \u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c \u5982\u679c\u4f7f\u7528ssh\u8fdc\u7a0b\u8c03\u7528\uff0c\u6216\u8005Jenkins\u4e2d\u6267\u884c\u6d4b\u8bd5\u811a\u672c\u7684\u65f6\u5019\uff0c\u5728sniff\u4e2d\u4f1a\u51fa\u73b0\u627e\u4e0d\u5230\u5e94\u7528\uff0c\u7ecf\u8fc7\u5206\u6790\uff0c\u53ef\u80fd\u662f\u56e0\u4e3a\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\u542f\u52a8\u7684\u65f6\u5019\uff0c\u5b9e\u9645\u662f\u91c7\u7528\u4e00\u4e2a\u5b50\u8fdb\u7a0b\u542f\u52a8\u4e86\u5e94\u7528\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u5230\u3002 \u3010\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u3011 \u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807 \u901a\u5e38\u6709\u4e24\u79cd\u65b9\u6cd5\uff1a \uff081\uff09\u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807\u3002 \uff082\uff09\u5df2\u77e5\u5e94\u7528\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u7684\u4f4d\u7f6e\uff0c\u7136\u540e\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u5bf9\u5e94\u5750\u6807\u3002 \u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u7f3a\u70b9\u662f\u4f4d\u7f6e\u5fc5\u987b\u56fa\u5b9a\uff0c\u5982\u679c\u79fb\u52a8\u4f4d\u7f6e\u5c31\u4e0d\u884c\u4e86\uff0c\u800c\u4f7f\u7528\u7b2c\u4e00\u79cd\u65b9\u6cd5\uff0c\u65e0\u8bba\u4f4d\u7f6e\u5728\u54ea\u91cc\uff0c\u53ea\u8981\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u5b58\u5728\u5373\u53ef\u3002 \u3010\u70b9\u51fb\u684c\u9762\u56fe\u6807\u542f\u52a8\u3011 \u684c\u9762\u56fe\u6807\u76ee\u524d\u662f\u91c7\u7528\u56fe\u50cf\u8bc6\u522b\u6280\u672f\uff0c\u5b9a\u4f4d\u5230\u5e94\u7528\u56fe\u6807\u7684\u5750\u6807\uff0c\u7136\u540e\u901a\u8fc7pyauogui\u8fdb\u884c\u70b9\u51fb\u64cd\u4f5c\u3002 \u8be6\u7ec6\u6280\u672f\u65b9\u6848\u53ef\u4ee5\u53c2\u8003\u6211\u7684\u53e6\u5916\u4e24\u7bc7\u535a\u5ba2: \u57fa\u4e8eopencv\u7684\u6a21\u677f\u5339\u914d\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd4\u56de\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 Python\u4e09\u65b9\u5e93PyAutoGui\u7684\u4f7f\u7528\u65b9\u6cd5 \u3010\u4ece\u542f\u52a8\u5668\u542f\u52a8\uff08\u4fd7\u79f0\u5f00\u59cb\u83dc\u5355\uff09\u3011 \u542f\u52a8\u4e2d\u542f\u52a8\u7684\u5b9e\u73b0\u903b\u8f91\u5b9e\u9645\u548c\u4efb\u52a1\u680f\u4e0a\u542f\u52a8\u5dee\u4e0d\u591a\u3002 \u9996\u5148\uff0c\u9700\u8981\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u542f\u52a8\u5668\u56fe\u6807\uff0c\u6216\u8005\u952e\u76d8super\u952e\uff0c\u5c06\u542f\u52a8\u5668\u547c\u51fa\u6765\uff0c \u7136\u540e\uff0c\u5728\u542f\u52a8\u5668\u4e2d\u70b9\u51fb\u5bf9\u5e94\u7684\u56fe\u6807\uff0c \u4f46\u662f\u8fd9\u91cc\u6709\u4e2a\u95ee\u9898\uff0c\u542f\u52a8\u5668\u4e2d\u7684\u5e94\u7528\u5217\u8868\uff0c\u4e00\u9875\u5c55\u793a\u4e0d\u5b8c\uff0c\u6240\u4ee5\u5982\u679c\u6211\u4eec\u8981\u70b9\u51fb\u7684\u5e94\u7528\u56fe\u6807\u4e0d\u5728\u7b2c\u4e00\u9875\u600e\u4e48\u529e\uff0c\u901a\u5e38\u89e3\u51b3\u65b9\u6848\u6709\u4e24\u79cd\uff1a \uff081\uff09\u9700\u8981\u8fdb\u884c\u5411\u4e0b\u6ed1\u52a8\uff0c\u8fd9\u91cc\u5c31\u6d89\u53ca\u5230\u76f8\u5e94\u7684\u8bc6\u522b\u65b9\u6848\uff0c\u5224\u65ad\u5982\u679c\u4e0d\u5728\u7b2c\u4e00\u9875\u5c31\u5f80\u4e0b\u6ed1\u52a8\u7ffb\u9875\u3002 \uff082\uff09\u542f\u52a8\u5668\u63d0\u4f9b\u641c\u7d22\u7684\u529f\u80fd\uff0c\u8f93\u5165\u5e94\u7528\u540d\u79f0\u641c\u7d22\uff0c\u7136\u540e\u8fdb\u884c\u70b9\u51fb\u3002 \u4ece\u5b9e\u9645\u64cd\u4f5c\u4e2d\u6765\u770b\uff0c\u91c7\u7528\u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u6548\u7387\u4f1a\u9ad8\u4e00\u70b9\u3002 \u3010\u7ec8\u7aef\u547d\u4ee4\u542f\u52a8\u3011 \u5728python\u4e2d\uff0c\u4f7f\u7528os.popen()\u6216os.system()\u6216\u8005subprocess.Popen()\uff0c\u5b9e\u73b0\u547d\u4ee4\u884c\u542f\u52a8\uff0c\u6bd4\u5982\uff1a import os\nos.popen('deepin-music')\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u8fdc\u7a0b\u6267\u884c\u811a\u672c\u7684\u65f6\u5019\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u7684\u95ee\u9898\u3002 \u3010\u603b\u7ed3\u3011 \u4ee5\u4e0a\u51e0\u79cd\u65b9\u6cd5\uff0c\u5404\u6709\u4f18\u7f3a\u70b9\uff0c\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff1a \uff081\uff09\u5982\u679c\u9700\u8981\u5728Jenkins\u4e2d\u505a\u6301\u7eed\u96c6\u6210\uff0c\u5efa\u8bae\u4f7f\u7528\u7b2c\u4e8c\u79cd\u4efb\u52a1\u680f\u542f\u52a8\u7684\u65b9\u6cd5\u3002 \uff082\uff09\u5982\u679c\u4e0d\u4f1a\u91c7\u7528\u8fdc\u7a0b\u6267\u884c\u7684\uff0c\u5efa\u8bae\u91c7\u7528\u7b2c\u4e00\u79cd\u6216\u8005\u6700\u540e\u4e00\u79cd\u65b9\u6848\u3002 \uff083\uff09\u7b2c\u4e09\u79cd\u548c\u7b2c\u56db\u79cd\u542f\u52a8\u65b9\u6cd5\uff0c\u901a\u5e38\u5728\u6d4b\u8bd5\u7528\u4f8b\u4e2d\u4f1a\u6d89\u53ca\u5230\uff0c\u6240\u4ee5\u5076\u5c14\u4f1a\u7528\u3002"},{"location":"RELEASE/","title":"\u7248\u672c\u66f4\u65b0\u8bb0\u5f55","text":""},{"location":"RELEASE/#2122023822","title":"2.1.2\uff082023/8/22\uff09","text":"new \u589e\u52a0 OCR \u8bc6\u522b\u81ea\u52a8\u91cd\u8bd5\u673a\u5236\uff0c\u9ed8\u8ba4\u91cd\u8bd5 2 \u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u91cd\u8bd5\u6b21\u6570\uff1b \u4f7f\u7528\u7a97\u7ba1\u6700\u65b0\u63d0\u4f9b\u7684\u4e8c\u8fdb\u5236\u63a5\u53e3\uff0c\u4f18\u5316\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u5728 Wayland \u4e0b\u83b7\u53d6\u7a97\u53e3\u4fe1\u606f\u7684\u65b9\u6cd5\uff1b\u611f\u8c22\u684c\u9762\u6d4b\u8bd5\u90e8 @\u4f55\u6743 @\u5b59\u7fe0 \u3001\u7a97\u7ba1\u7814\u53d1 @\u9ec4\u6cfd\u94ed \u7684\u5927\u529b\u652f\u6301\u3002 \u6269\u5145 skipif \u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\u51fd\u6570\uff1a skipif_xdg_type \u652f\u6301 x11 \u6216 wayland \u4e0a\u8df3\u8fc7\uff1b skipif_cpu_name \u652f\u6301\u4e0d\u540c cpu \u4e0a\u8df3\u8fc7\uff0c\u6bd4\u5982\uff1askipif_cpu_name-KLVVW5821\uff1b "},{"location":"RELEASE/#2102023818","title":"2.1.0\uff082023/8/18\uff09","text":"fix \u4fee\u590d SW \u67b6\u6784\u73af\u5883\u4f9d\u8d56\u7684\u95ee\u9898\uff0c\u539f\u56e0\u662f\u4e4b\u524d\u6211\u8fd9\u91cc\u672c\u5730\u6ca1\u6709 SW \u7684\u673a\u5668\uff0c\u6ca1\u6709\u505a\u76f8\u5173\u9002\u914d\uff1b \u4fee\u590d\u5b50\u9879\u76ee\u5355\u72ec\u9700\u8981\u4e09\u65b9\u5305 pexpect\uff0c\u7531\u4e8e\u4e4b\u524d\u662f\u9884\u88c5\u5230\u955c\u50cf\u91cc\u9762\u7684\uff0c\u4f46\u57fa\u7840\u6846\u67b6\u4e0d\u9700\u8981\uff0c\u56e0\u6b64\u6ca1\u6709\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u91cc\u9762\uff0c\u5bfc\u81f4\u5b50\u9879\u76ee\u4f9d\u8d56\u62a5\u9519\u3002 \u4fee\u590d\u5b50\u9879\u76ee cv \u5bfc\u5165\u62a5\u9519\u7684\u95ee\u9898\uff1b \u539f\u56e0\u4e3a\uff1ayouqu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u517c\u5bb9\u4e24\u79cd\u60c5\u51b5\uff0c\u4e00\u79cd\u662f\u9762\u5411\u670d\u52a1\uff0c\u5c31\u662f\u672c\u5730\u6d4b\u8bd5\u673a\u4e0d\u9700\u8981\u5b89\u88c5 OpenCV\uff0c\u7528\u4f8b\u4e2d\u7684\u56fe\u50cf\u8bc6\u522b\u4f1a\u901a\u8fc7\u8fdc\u7a0b\u670d\u52a1\u63a5\u53e3\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u548c\u7ed3\u679c\u83b7\u53d6\uff1b\u7b2c\u4e8c\u79cd\u662f\u539f\u751f\uff0c\u5c31\u662f\u672c\u5730\u76f4\u63a5\u5b89\u88c5 OpenCV \u76f4\u63a5\u7528\u3002\u4e24\u4e2a\u60c5\u51b5\u7684\u4f18\u5148\u7ea7\u662f\u4f18\u5148\u5224\u65ad\u672c\u5730\u5b58\u5728\uff0c\u5426\u5219\u8d70\u670d\u52a1\u3002 \u524d\u9762\u6211\u4eec\u5df2\u7ecf\u628a OCR \u529f\u80fd\u505a\u4e86\u670d\u52a1\u5316\uff0c\u57fa\u4e8e 1 \u5e74\u591a\u4ee5\u6765\u7684\u89c2\u5bdf\uff0c\u7528\u8d77\u6765\u5f88\u7a33\u5b9a\uff0c\u518d\u4e00\u4e2a\u5c31\u662f OpenCV \u5b89\u88c5\u5305\u662f\u6bd4\u8f83\u81c3\u80bf\u7684\uff0c\u7c97\u7565\u6570\u4e86\u4e0b\u4f9d\u8d56\u6709 30+ \u4e2a\uff0c\u800c\u4e14\u5728\u5404\u67b6\u6784\u4e0a\u4f9d\u8d56\u5305\u8fd8\u4e0d\u5c3d\u76f8\u540c\uff0c\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u65b9\u6848\u4e2d\u4e0d\u592a\u597d\u5904\u7406\uff0c\u6240\u4ee5\u672c\u6b21 2.0 \u7248\u672c\u6211\u4eec\u5927\u80c6\u7684\u5c06\u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u529f\u80fd\u4fee\u6539\u4e3a\u9762\u5411\u670d\u52a1\u7684\u65b9\u5f0f\uff0c\u524d\u671f\u6d4b\u8bd5\u4e00\u5207\u770b\u8d77\u6765\u90fd\u5f88\u548c\u8c10\u3002 \u4f46\u662f\u6ca1\u6ce8\u610f\u5230\u4e4b\u524d\u7ed9\u6d77\u71d5\u59d0\u90a3\u8fb9\u9879\u76ee\u5355\u72ec\u5b9a\u5236\u505a\u4e86\u4e2a\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\uff08\u4e3a\u4e86\u80fd\u7b80\u5355\u5e73\u6ed1\u7684\u8fc1\u79fb\u5230 youqu\uff09\uff0c\u6b64\u63a5\u53e3\u5e95\u5c42\u6ca1\u6709\u517c\u5bb9\u670d\u52a1\u5316\uff0c\u6240\u4ee5\u5979\u90a3\u8fb9\u7684\u9879\u76ee\u8c03\u7528\u6b64\u5b9a\u5236\u63a5\u53e3\u4f1a\u62a5 cv \u5bfc\u5165\u7684\u95ee\u9898\u3002 \u7531\u4e8e\u5c06\u8fd9\u4e2a\u5b9a\u5236\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\u8fdb\u884c\u670d\u52a1\u5316\u517c\u5bb9\u6539\u9020\u9700\u8981\u4e00\u5b9a\u65f6\u95f4\uff0c\u6539\u5b8c\u8fd8\u9700\u8981\u6d4b\u8bd5\uff0c\u4f46\u672c\u6b21\u65f6\u95f4\u6bd4\u8f83\u7d27\uff0c\u56e0\u6b64\u5148\u628a OpenCV \u88c5\u8fdb\u865a\u62df\u73af\u5883\uff0c\u540e\u7eed\u7248\u672c\u518d\u8003\u8651\u9488\u5bf9\u6b64\u63a5\u53e3\u505a\u4fee\u6539\u3002"},{"location":"RELEASE/#2002023816","title":"2.0.0\uff082023/8/16\uff09","text":"YouQu\uff08\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff09\u5f00\u6e90\u4e86\uff0c\u540c\u65f6\u63a8\u51fa\u4e86 2.0 \u7248\u672c\u3002 \u611f\u8c22\u738b\u6ce2\u603b\u3001\u67b6\u6784\u5e08\u5f90\u5c0f\u4e1c\u3001\u7814\u53d1\u7ecf\u7406\u90d1\u5e7c\u6208\u3001\u5218\u90d1\u7b49\u7814\u53d1\u540c\u4e8b\u7684\u5927\u529b\u652f\u6301\u3002 new 1\u3001\u65b0\u7684\u57fa\u7840\u6846\u67b6\u4ee3\u7801\u83b7\u53d6\u65b9\u5f0f\u53ca\u65b0\u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4 YouQu \u540e\u7eed\u5747\u901a\u8fc7 PyPI \u8fdb\u884c\u5305\u7684\u53d1\u5e03\uff0c\u4e5f\u5c31\u662f\u8bf4\u540e\u7eed\u53ef\u4ee5\u4f7f\u7528 pip \u8fdb\u884c\u5b89\u88c5\uff1a sudo pip3 install youqu==2.0.0\n \u8fd9\u91cc\u6709 2 \u4e2a\u5c0f\u70b9\u8981\u6ce8\u610f\uff1a \u63a8\u8350\u4f7f\u7528 sudo pip3 \uff08\u52a0 sudo\uff09\u8fdb\u884c\u5b89\u88c5\uff1b \u5982\u679c\u4e0d\u52a0 sudo \u6709\u4e9b\u673a\u5668\u53ef\u80fd $HOME/.local/bin \u4e0d\u5728\u7cfb\u7edf PATH \u73af\u5883\u76ee\u5f55\u4e0b\uff0c\u5728\u4e0d\u6dfb\u52a0\u73af\u5883\u53d8\u91cf\u7684\u60c5\u51b5\u4e0b\uff0c\u4f1a\u51fa\u73b0 YouQu \u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4\uff08youqu-startproject\uff09\u65e0\u6cd5\u4f7f\u7528\u7684\u95ee\u9898\uff1b \u5f53\u7136\uff0c\u5c06\u4e0a\u8ff0\u8def\u5f84\u6dfb\u52a0\u5230\u73af\u5883\u53d8\u91cf\u4e4b\u540e\u4e5f\u662f\u53ef\u4ee5\u7528\u7684\uff0c\u6240\u4ee5\u6211\u8fd9\u91cc\u662f\u63a8\u8350\u52a0 sudo\uff0c\u4e0d\u52a0 sudo \u4e5f\u662f\u53ef\u4ee5\u7684\uff0c\u53ea\u662f\u9700\u8981\u5173\u6ce8\u4e0b\u73af\u5883\u53d8\u91cf\u7684\u95ee\u9898\u3002 \u63a8\u8350\u6307\u5b9a\u7248\u672c\u53f7\uff08youqu==2.0.0\uff09\u5b89\u88c5\uff0c\u5982\u679c\u4e0d\u6307\u5b9a\u7248\u672c\u53f7\u9ed8\u8ba4\u662f\u5b89\u88c5\u6700\u65b0\u53d1\u5e03\u7684 YouQu \u7248\u672c\uff0c\u4f60\u53ef\u4ee5\u5728 PyPI \u4e0a\u7684 Release history \u91cc\u9762\u67e5\u770b\u6709\u54ea\u4e9b\u7248\u672c\u3002 \u5b89\u88c5\u4e4b\u540e\u4f1a\u81ea\u52a8\u751f\u6210\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu-startproject\uff0c\u4f7f\u7528\u5b83\u53ef\u4ee5\u521d\u59cb\u5316\u5de5\u7a0b\uff0c\u8fd9\u91cc\u4ee5\u97f3\u4e50\u4e3e\u4f8b\uff1b youqu-startproject autotest_deepin_music\n \u8fd9\u6837\u5c31\u4f1a\u5728\u5f53\u524d\u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a autotest_deepin_music \u76ee\u5f55\uff0c\u91cc\u9762\u5305\u542b\u4e86\u57fa\u7840\u6846\u67b6\u6240\u6709\u7684\u4ee3\u7801\uff1b \u4e4b\u540e\uff0c\u8fd8\u662f\u5728 apps \u76ee\u5f55\u4e0b\uff0c\u653e\u5165\u5b50\u9879\u76ee\u7684AT\u4ee3\u7801\u5373\u53ef\uff0c\u4f7f\u7528\u65b9\u6cd5\u548c\u8fc7\u53bb\u4e00\u6837\uff0c\u8fd9\u91cc\u5c31\u4e0d\u591a\u4ecb\u7ecd\u3002 \u53e6\u5916\uff0c\u9664\u4e86\u901a\u8fc7 pip \u83b7\u53d6\u4ee5\u5916\uff0c\u4ecd\u7136\u53ef\u4ee5\u901a\u8fc7\u6e90\u7801\u83b7\u53d6\uff08\u76f4\u63a5 git clone\uff09\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u4f7f\u7528 pip \u5b89\u88c5 YouQu \u65f6\uff0cYouQu \u5305\u7684\u5927\u5c0f\u624d 600+ k\uff0c\u5b89\u88c5\u901f\u5ea6\u8d77\u98de\u3002 2\u3001\u65b0\u7684AT\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848 \u4e3a\u4e86\u89e3\u51b3\u4ee5\u4e0b\u95ee\u9898\uff1a \u8fc7\u53bb\u4e00\u6bb5\u65f6\u95f4\u54b1\u4eec\u7ecf\u5e38\u51fa\u73b0\u7684\uff0c\u4e0d\u540c\u7684AT\u9879\u76ee\u5728\u540c\u4e00\u53f0\u673a\u5668\u4e0a\u90e8\u7f72\u73af\u5883\u65f6\u4f9d\u8d56\u7248\u672c\u51b2\u7a81\u7684\u95ee\u9898\uff0c\u65b0\u65b9\u6848\u4e0d\u540c\u7684\u9879\u76ee\u4f1a\u52a8\u6001\u751f\u6210\u81ea\u5df1\u7684\u865a\u62df\u73af\u5883\uff0c\u76f8\u4e92\u4e4b\u95f4\u4e0d\u5f71\u54cd\uff1b \u4e1a\u5185\u4e3a\u4e86\u89e3\u51b3\u7248\u672c\u51b2\u7a81\u95ee\u9898\u4e00\u822c\u90fd\u4f1a\u4f7f\u7528Python\u865a\u62df\u73af\u5883\u7684\u5de5\u5177\uff0c\u4f46\u662f\u90fd\u6709\u4e2a\u95ee\u9898\uff0c\u65e0\u6cd5\u7ba1\u7406 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u5305\uff0c\u672c\u6b21\u6211\u4eec\u89e3\u51b3\u4e86\u8fd9\u4e2a\u95ee\u9898\uff0c\u80fd\u591f\u5b8c\u5168\u7ba1\u7406\u5e38\u89c4\u7684Python\u5305\uff0c\u4e5f\u80fd\u7ba1\u7406\u5230 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u4e09\u65b9\u5305\uff1b \u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u4f7f\u7528\u65b9\u6cd5\uff1a bash env.sh\n \u53ef\u4ee5\u770b\u51fa\u6765\u548c\u539f\u6765\u4f7f\u7528\u65b9\u6cd5\u6ca1\u6709\u53d8\u5316\uff0c\u4e5f\u5c31\u662f\u8bf4\u4ece\u4f7f\u7528\u7684\u89d2\u5ea6\u662f\u5b8c\u5168\u6ca1\u6709\u533a\u522b\u7684\uff0c\u53ea\u662f\u5185\u90e8\u505a\u4e86\u4e0d\u540c\u7684\u4e8b\u60c5\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u672c\u673a\u90e8\u7f72\u7684\u529f\u80fd\u4ecd\u7136\u4fdd\u7559 env_dev.sh\uff0c\u53ef\u4ee5\u4f5c\u4e3a\u5f00\u53d1\u65f6\u7684\u73af\u5883\u90e8\u7f72\u3002 3\u3001\u65b0\u7684\u9a71\u52a8\u547d\u4ee4 \u8fc7\u53bb\u54b1\u4eec\u90fd\u662f\u4f7f\u7528\u8fd9\u6837\u7684\u547d\u4ee4\u6765\u9a71\u52a8\u6267\u884c\uff1a python3 manage.py run\n \u7531\u4e8e\u9ed8\u8ba4\u57fa\u4e8e\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848\uff0c\u56e0\u6b64\u6211\u4eec\u589e\u52a0\u4e86\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu\uff1b \u65b0\u7684\u9a71\u52a8\u65b9\u5f0f\uff1a youqu manage.py run\n \u53ea\u9700\u8981\u628a python3 \u66ff\u6362\u6210 youqu \u5c31\u53ef\u4ee5\u4e86\uff0c\u770b\u8d77\u6765\u5f88\u548c\u8c10~ 4\u3001\u65b0\u7684\u6587\u6863\u5730\u5740 \u8fc7\u53bb\u54b1\u4eec YouQu \u7684\u5728\u7ebf\u6587\u6863\u662f\u90e8\u7f72\u5728\u516c\u53f8\u5185\u7f51\u7684\uff0c\u73b0\u5728\u5f00\u6e90\u5230 github \u4e86\uff0c\u5916\u90e8\u5f00\u53d1\u8005\u80af\u5b9a\u8bbf\u95ee\u4e0d\u5230\u5185\u7f51\u7684\u6587\u6863\uff0c\u56e0\u6b64\u9700\u8981\u5c06\u6587\u6863\u90e8\u7f72\u5230\u516c\u7f51\u3010\u516c\u7f51\u6587\u6863\u3011\uff1b \u516c\u7f51\u6587\u6863\u4f7f\u7528\u7684\u662f github pages\uff08\u767d\u5ad6\u602a\u4e00\u987f\u72c2\u559c~~\uff09\uff0c\u4f46\u53ef\u80fd\u4f1a\u51fa\u73b0\u6587\u6863\u901f\u5ea6\u6162\u7684\u95ee\u9898\uff08\u4ee3\u7406\u4e0b\u5c31\u597d\u4e86\uff09\uff0c\u4e0d\u8fc7\u6ca1\u5173\u7cfb\uff0c\u54b1\u4eec\u3010\u5185\u7f51\u6587\u6863\u3011\u4ecd\u7136\u4fdd\u7559\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u3002 5\u3001\u5176\u4ed6\u4e00\u4e9b\u5c0f\u5c0f\u529f\u80fd\u66f4\u65b0\uff1a \uff081\uff09\u65b0\u589e\u5173\u95ed\u5206\u8fa8\u7387\u68c0\u6d4b\u7684\u53c2\u6570\u503c\uff1b youqu manage.py run --resolution no\n \u6216\u8005\u4fee\u6539 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387, \u6bd4\u5982\uff1a1920x1080\n;no: \u8868\u793a\u4e0d\u505a\u5206\u8fa8\u7387\u6821\u9a8c\nRESOLUTION = 1920x1080\n resolution \u8fd9\u4e2a\u53c2\u6570\u4e00\u76f4\u90fd\u6709\u7684\uff0c\u53ea\u4e0d\u8fc7\u4e4b\u524d\u662f\u7528\u4e8e\u6307\u5b9a\u5206\u8fa8\u7387\u5927\u5c0f\uff0c\u6bd4\u5982 --resolution 1920x1080\uff0c\u4f46\u6709\u4e9b\u63a5\u53e3\u7684\u9879\u76ee\u4e0d\u9700\u8981\u8fd9\u4e2a\u68c0\u67e5\uff0c\u53ef\u4ee5\u7ed9\u5b83\u4e2a no \u5c31\u597d\u4e86\uff0c\u5f53\u7136 CICD \u4e0a\u5173\u95ed\uff0c\u9700\u8981\u6d41\u6c34\u7ebf\u4e0a\u628a\u8fd9\u4e2a\u53c2\u6570\u52a0\u4e0a\uff1b \uff082\uff09\u65b0\u589e\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u7684\u547d\u4ee4\u884c\u53c2\u6570 \u4e4b\u524d\u8fd9\u4e2a\u914d\u7f6e\u9879\u53ea\u80fd\u5728 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c 1 \u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff0cRERUN >= RECORD_FAILED_CASE\u3002\n;1.\u5173\u95ed\u5f55\u5c4f\uff1aRECORD_FAILED_CASE > RERUN\n;2.\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1aRECORD_FAILED_CASE = 0\nRECORD_FAILED_CASE = 1\n \u73b0\u5728\u5c06\u5f00\u53d1\u5230\u547d\u4ee4\u884c\u53c2\u6570\u3002 youqu manage.py run --record_failed_case 2\n fix \u4fee\u590d remote \u6267\u884c\u65f6\uff0c\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u65e0\u6cd5\u751f\u6210\u6d4b\u8bd5\u62a5\u544a\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1302023710","title":"1.3.0\uff082023/7/10\uff09","text":"fix \u8fdb\u4e00\u6b65\u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b\u53c2\u8003\uff1a\u914d\u7f6ePython\u6e90\u7684\u51e0\u79cd\u65b9\u6cd5 \u4fee\u590d wayland_autotool \u53d7\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86wayland\u4e0b\u5076\u73b0\u627e\u4e0d\u5230 .Xauthority \u6587\u4ef6\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1292023626","title":"1.2.9\uff082023/6/26\uff09","text":"fix \u4f18\u5316\u8fdc\u7a0b\u6267\u884c remote \u7684\u53c2\u6570\u76f4\u63a5\u4f20\u7ed9\u8fdc\u7a0b\u673a\u5668\u7684 run \u547d\u4ee4\uff0c\u4e0d\u7528\u518d\u5355\u72ec\u5904\u7406\u8fdc\u7a0b\u6267\u884c\u7684\u53c2\u6570\u903b\u8f91\uff0c\u540e\u7eed\u4e13\u6ce8\u4e8e\u672c\u5730\u6267\u884c\u529f\u80fd\u5f00\u53d1\uff0c\u8fdc\u7a0b\u6267\u884c\u81ea\u52a8\u9002\u7528\uff1b env.sh \u79fb\u9664 pyyaml \u5b89\u88c5\uff0c\u7531\u5b50\u9879\u76ee\u5728 requirement.txt \u91cc\u9762\u5b9a\u4e49\uff0c\u6846\u67b6\u81ea\u52a8\u52a0\u8f7d\uff1b \u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b "},{"location":"RELEASE/#128202369","title":"1.2.8\uff082023/6/9\uff09","text":"fix \u4fee\u590d\u4e86 pypi \u5b89\u88c5 numpy \u5b58\u5728\u7cfb\u7edf\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#127202368","title":"1.2.7\uff082023/6/8\uff09","text":"fix env.sh \u4e2d\u5b89\u88c5 Python \u5305\u672a\u6307\u5b9a\u7248\u672c\u65f6\uff0c\u65e5\u5fd7\u8f93\u51fa\u5b89\u88c5\u7684\u7248\u672c\uff1b pdocr-rpc 2.0.1\nallure-custom 1.2.1\nfunnylog 1.1.3\n \u4fee\u590d -f \u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u62a5\u9519\u7684\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#126202367","title":"1.2.6\uff082023/6/7\uff09","text":"fix \u4fee\u590d wayland \u4e0a\u8c03\u7528\u9f20\u6807\u4e2d\u952e\u3001\u53f3\u952e\u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b \u4fee\u590d pubilic/dde_desktop_public_widget \u91cc\u9762\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u5b9a\u4f4d\u684c\u9762\u6587\u4ef6\u7684\u65b9\u6cd5\uff0c\u5750\u6807\u6ca1\u6709\u62c6\u5305\u7684\u95ee\u9898\uff1b \u4f18\u5316\u4e86\u7b49\u5f85\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b pycreeze \u7248\u672c\u5347\u7ea7\u5230 0.1.29\uff0c\u5bfc\u81f4\u4e0e pyautogui 0.9.53 \u4e0d\u517c\u5bb9\uff0cenv.sh \u91cc\u9762\u589e\u52a0\u6307\u5b9a pycreeze \u7248\u672c\u4e3a 0.1.28\uff1b "},{"location":"RELEASE/#1252023516","title":"1.2.5\uff082023/5/16\uff09","text":"new --app \u53c2\u6570\u540e\u9762\u65b0\u589e\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u76ee\u524d\u652f\u6301\u4e09\u79cd\u53c2\u6570\u4f20\u5165\u65b9\u5f0f\uff1a ~$: youqu run -a deepin-music\n~$: youqu run -a autotest_deepin_music\n~$: youqu run -a apps/autotest_deepin_music\n \u200b \u540e\u4e24\u79cd\u5165\u53c2\u65b9\u5f0f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\u3002 remote \u8fdc\u7a0b\u6267\u884c\u65b0\u589e\u4ece\u547d\u4ee4\u884c\u4f20\u5165\u6d4b\u8bd5\u673a\u4fe1\u606f\uff0c\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679c password \u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6 setting/remote.ini \u4e2d CLIENT_PASSWORD \u7684\u503c,\u6bd4\u5982\uff1auos@10.8.13.33:1 \u6216 uos@10.8.13.33 \uff1b python3 manage.py remote -c uos@10.8.13.33/uos@10.8.13.34\npython3 manage.py remote -c uos@10.8.13.33:1/uos@10.8.13.34:2\n fix \u65e5\u5fd7\u6a21\u5757\u4fee\u6539\u4e3a\u51fd\u6570\u6267\u884c\u4e4b\u524d\u6253\u5370\u65e5\u5fd7\uff1b \u65e5\u5fd7\u6a21\u5757\u589e\u52a0\u767d\u540d\u5355\uff0c\u901a\u8fc7\u7c7b\u540d\u5f00\u5934\uff0c\u7ed3\u675f\uff0c\u5305\u542b\u7b49\u5173\u952e\u5b57\u63a7\u5236\u9700\u8981\u6253\u5370\u7684\u51fd\u6570\u65e5\u5fd7\uff1b \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5982\u679c\u4f20\u5165\u4e86 app_name \u53ea\u4f1a\u5c06 apps \u76ee\u5f55\u4e0b app_name \u7684\u76ee\u5f55\u53d1\u9001\u5230\u6d4b\u8bd5\u673a\uff1b env.sh \u79fb\u9664 python3-dev\uff1b \u4fee\u590d Wayland \u4e0b env.sh \u73af\u5883\u5b89\u88c5\u5931\u8d25\u7684\u95ee\u9898\uff0c\u4f18\u5316\u4e86 deb \u4f9d\u8d56\u5b89\u88c5\u7684\u903b\u8f91\uff1b \u5c06 env.sh \u5237\u65b0\u6e90\u7684\u65e5\u5fd7\u5728\u7ec8\u7aef\u663e\u793a\uff0c\u89e3\u51b3\u5728 CI \u73af\u5883\u4e0b\uff0c\u957f\u65f6\u95f4\u4e0d\u8f93\u51fa\u65e5\u5fd7\u8fde\u63a5\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d1060 \u534e\u4e3a\u673a\u578b\u5b89\u88c5\u952e\u9f20\u5de5\u5177\u65f6\u4f9d\u8d56\u4e0d\u517c\u5bb9\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1242023227","title":"1.2.4\uff082023/2/27\uff09","text":"fix \u4fee\u6539 CURRENT \u6587\u4ef6\uff1b "},{"location":"RELEASE/#1232023227","title":"1.2.3\uff082023/2/27\uff09","text":"new pylint.sh \u652f\u6301\u901a\u8fc7\u4f4d\u7f6e\u53c2\u6570\u4f20\u5165\u6587\u4ef6\u8def\u5f84\uff1abash pylint.sh apps/autotest_deepin_music,\u597d\u5904\u662f\u53c2\u6570\u8def\u5f84\u53ef\u4ee5\u5728\u7ec8\u7aef\u8865\u5168\uff1b \u65b0\u589e\u7cfb\u7edf\u547d\u4ee4 youqu-pylint \uff0c\u7528\u4e8e\u9759\u6001\u4ee3\u7801\u626b\u63cf\uff0c\u4f7f\u7528\u65b9\u6cd5: youqu-pylint apps/autotest_deepin_music\uff1b \u7531\u4e8e\u7cfb\u7edf\u4e00\u4e9b dbus \u63a5\u53e3\u6539\u53d8\uff0c\u516c\u5171\u5e93\u4e2d\u7684 dbus \u65b9\u6cd5\u5c06\u4e0d\u518d\u7ef4\u62a4\uff0c\u7531\u5b50\u9879\u76ee\u5728 other_widget.py \u91cc\u9762\u8fdb\u884c\u7ef4\u62a4\uff1b fix \u4fee\u590d ssh \u73af\u5883\u4e0b\u8fd0\u884c\u63d0\u793a \u201c\u65e0\u6cd5\u8fde\u63a5\u201d \u7684\u95ee\u9898\uff1b \u4fee\u590d\u8fd0\u884c\u65f6\u7a0b\u5e8f\u9000\u51fa\uff0c\u4e0d\u8f93\u51fa\u5f02\u5e38\u65e5\u5fd7\u7684\u95ee\u9898\uff1b \u4fee\u590dyouqu remote xxx \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5728\u670d\u52a1\u7aef Ctrl + C \u65e0\u6cd5\u505c\u6b62\u7a0b\u5e8f\u8fd0\u884c\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#122202328","title":"1.2.2\uff082023/2/8\uff09","text":"new \u65b0\u589e\u6c14\u6ce1\u7c7b\u56fe\u50cf\u8bc6\u522b\u65b9\u6848\uff1bimage_utils.py::ImageUtil::get_during\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u533a\u57df\u8bc6\u522b\uff0c\u4f20\u5165 [x, y, w, h]\uff0cx: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u76ee\u6807\u56fe\u7247\uff0c\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\uff1b env.sh \u79fb\u9664 pypinyin; \u4f18\u5316\u6267\u884c env.sh \u65f6\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b manage.py \u79fb\u9664\u4e86\u53c2\u6570 session_timeout \uff0c\u6846\u67b6\u6839\u636e\u5168\u5c40\u7684 timeout \u4ee5\u53ca\u7528\u4f8b\u81ea\u5b9a\u4e49\u7684 timeout \u81ea\u52a8\u8ba1\u7b97\u51fa sessiontimeout \u7684\u503c\uff1b \u65b0\u589e ocr \u670d\u52a1\u5668\u94fe\u63a5\u91cd\u8bd5\uff0c\u9ed8\u8ba4\u91cd\u8bd51\u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u53c2\u6570\uff1b fix \u4fee\u590d\u4e86\u4e00\u4e9b pylint \u626b\u63cf\u7684\u4ee3\u7801\u98ce\u683c\u95ee\u9898\uff1b \u91cd\u65b0\u8bbe\u8ba1\u4e86\u6d4b\u8bd5\u62a5\u544a\u4e3b\u9898\uff1b "},{"location":"RELEASE/#121202316","title":"1.2.1\uff082023/1/6\uff09","text":"new \u652f\u6301\u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6267\u884c\u7528\u4f8b\uff1b\u53ef\u5c06python3 manage.py \u66ff\u6362\u4e3a youqu \uff1a youqu run -a deepin-music -k 001\n RPC \u670d\u52a1 IP \u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u6307\u5b9a\u4e0d\u540c\u7684\u7aef\u53e3\uff1b \u5728\u7ebf\u6587\u6863\u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u539f\u6765\u7684\u5730\u5740 10.8.10.215 \u5c06\u4e0d\u5728\u4f7f\u7528\uff1b fix \u4fee\u590d --count \u53c2\u6570\u53ef\u80fd\u51fa\u73b0\u4e0e\u5176\u4ed6\u6846\u67b6\u7684\u5de5\u7a0b\u4f9d\u8d56\u5b58\u5728\u51b2\u7a81\uff0c\u62a5\u9519\u91cd\u590d\u6ce8\u518c\u7684\u95ee\u9898\uff1b \u4fee\u590d CI \u73af\u5883\u4e0b\u591a\u4e2a\u5de5\u7a0b\u5b58\u5728 Python \u73af\u5883\u53d8\u91cf\u6307\u5411\u9519\u8bef\uff0c\u5bfc\u5305\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u5355\u72ec\u8fd0\u884c\u65b9\u6cd5\u65f6\u65e0\u65e5\u5fd7\u8f93\u51fa\u7684 Bug\uff1b "},{"location":"RELEASE/#12020221230","title":"1.2.0\uff082022/12/30\uff09","text":"1.1.4 \u7248\u672c\u9002\u914d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e14\u65b0\u589e\u4e86\u8f83\u591a\u65b0\u7279\u6027\uff0c\u6211\u4eec\u8ba1\u5212\u4f7f\u7528 1.1.4 \u7248\u672c\u8fd0\u884c\u4e00\u6bb5\u65f6\u95f4\uff0c1.2.0 \u7248\u672c\u5c06\u4fee\u590d\u671f\u95f4\u51fa\u73b0\u7684 Bug\uff0c\u7136\u540e\u4f5c\u4e3a\u7a33\u5b9a\u7248\u672c\u53d1\u5e03\u3002 new \u4fee\u6539\u5de5\u7a0b\u540d\u79f0\u4e3a youqu\uff1b \u5c06 sphinx \u6587\u6863\u5de5\u7a0b\u8fc1\u79fb\u5230\u5355\u72ec\u7684\u4ed3\u5e93\uff1b fix \u4fee\u590d startapp \u521b\u5efa\u5de5\u7a0b\u65f6\u5b58\u5728\u5de5\u7a0b\u540d\u79f0\u65f6\u65e0\u6cd5\u7ee7\u7eed\u521b\u5efa\uff1b \u4fee\u590d\u4e86 OCR \u670d\u52a1\u5728\u5e76\u53d1\u65f6\u53ef\u80fd\u51fa\u73b0\u65e0\u6cd5\u8fd4\u56de\u7ed3\u679c\u7684\u95ee\u9898\uff0c\u63d0\u5347 OCR \u670d\u52a1\u9ad8\u5e76\u53d1\u7a33\u5b9a\u6027\uff1b \u4fee\u590d PMS \u540c\u6b65\u6807\u7b7e\u5230 CSV \u6587\u4ef6\u4e0d\u652f\u6301\u7528\u4f8b\u5e93\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11420221214","title":"1.1.4\uff082022/12/14\uff09","text":"new \u65b0\u589e startapp \u5b50\u547d\u4ee4\u521b\u5efa\u5b50\u9879\u76ee\u5de5\u7a0b\u6a21\u677f: python3 manage.py startapp autotest_deepin_xxx \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u91cd\u590d\u6267\u884c\u6b21\u6570\uff1b \u53bb\u6389\u6279\u91cf\u6267\u884c\u524d\u6536\u96c6\u7528\u4f8b\u7684\u6b65\u9aa4\uff1b \u589e\u52a0\u5f00\u59cb\u6267\u884c\u65f6\u6253\u5370\u4e00\u4e9b\u6267\u884c\u53c2\u6570\uff0c\u5982\uff1a \u7528\u4f8b\u6536\u96c6\u6570\u91cf: 99\n\u5931\u8d25\u91cd\u8dd1\u6b21\u6570: 1\n\u6700\u5927\u5931\u8d25\u6b21\u6570: 49\n\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4: 200.0s (03\u520620\u79d2)\n\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4: 11880s (3\u5c0f\u65f618\u52060\u79d2)\n \u5b9a\u5236\u4fee\u6539allure\u62a5\u544alogo\u3001title\u3001\u9ed8\u8ba4\u8bed\u8a00\uff1b manage.py \u6267\u884c\u5f00\u59cb\u65f6\u6253\u5370 logo \u548c\u5f53\u524d\u7248\u672c\uff1a \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u255a\u2588\u2588\u2557 \u2588\u2588\u2554\u255d \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2584\u2584 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2580\u2580\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u2584\u2588 \u2584\u2588 \u2588 \u2588 \u2588 \u2584 \u2588 \u2584 \u2580\u2580\u2588 \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\uff1b \u88c5\u9970\u5668\u65b9\u6cd5\u6307\u5b9a\u6b21\u6570\uff1b @pytest.mark.count(2)\ndef test_music_001():\npass\n \u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u6b21\u6570\uff1b python3 manage.py run -a deepin-music -k 001 --count 2\n \u200b image_utils \u589e\u52a0\u51fd\u6570 save_temporary_picture\uff0c\u652f\u6301\u6307\u5b9a\u5c4f\u5e55\u533a\u57df\u622a\u56fe\u5e76\u8fd4\u56de\u56fe\u7247\u5b58\u653e\u7684\u672c\u5730\u8def\u5f84\uff0c\u540e\u7eed\u4f7f\u7528 assert_image_exist \u8fdb\u884c\u65ad\u8a00 Python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(x, y, width, height) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) button_center \u65b0\u589e btn_size \u83b7\u53d6\u63a7\u4ef6\u5de6\u4e0a\u89d2\u5750\u6807\u53ca\u957f\u5bbd\uff0c\u7528\u4e8e\u52a8\u6001\u7684\u622a\u53d6\u5143\u7d20\u7684\u56fe\u7247\uff0c\u53ef\u7528\u4e8e\u5b9a\u4f4d\u65ad\u8a00 python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u6240\u6709\u97f3\u4e50\u6309\u94ae\")) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) allure \u62a5\u544a\u4e2d\u5b9a\u4f4d\u95ee\u9898\u9664\u4e86\u65e5\u5fd7\u3001\u622a\u56fe\u3001\u5f55\u5c4f\u5916\uff0c\u8c03\u7528\u7684\u51fd\u6570\u589e\u52a0\u4e86 step \u6b65\u9aa4\u5c55\u793a\uff1b env.sh \u65b0\u589e\u5b89\u88c5\u5b50\u9879\u76ee Python \u4e09\u65b9\u4f9d\u8d56\uff0c\u5728\u5b50\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u5199 requirement.txt \u6587\u4ef6\uff0cenv.sh \u4f1a\u81ea\u52a8\u52a0\u8f7d\uff1b ocr \u8bc6\u522b\u65b0\u589e\u652f\u6301\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\u8fdb\u884c\u6587\u5b57\u8bc6\u522b\uff0c\u51cf\u5c11\u56e0\u5168\u5c4f\u8bc6\u522b\u65f6\uff0c\u5176\u4ed6\u6587\u5b57\u7684\u5e72\u6270 Python # \u65ad\u8a00\u97f3\u4e50\u7684\u5220\u9664\u5f39\u7a97\u4e2d\uff0c\u5305\u542b\u4e86\u201c\u786e\u8ba4\u201d\u7684\u6587\u5b57 self.assert_ocr_exist(\"\u786e\u8ba4\", picture_abspath=DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u5220\u9664\u5f39\u7a97\"))) \u65ad\u8a00\u51fd\u6570\u7684\u8c03\u7528\u4e5f\u4f1a\u81ea\u52a8\u6253\u5370\u65e5\u5fd7; env.sh \u65b0\u589e\u88c1\u526a\u4f9d\u8d56\u7684\u65b9\u6848\uff1b fix \u4fee\u590d Jenkins \u73af\u5883\u4e0b\uff0c apps \u76ee\u5f55\u4e0b\u5b50\u9879\u76ee\u5b58\u5728 auotest_deepin_xxx@tmp \u76ee\u5f55\uff0c\u5728\u4f20\u5165 app_name \u540e\u65e0\u6cd5\u6267\u884c\u7528\u4f8b\u7684\u95ee\u9898\uff1b \u4fee\u590d\u81ea\u52a8\u751f\u6210 case_list.csv \u6587\u4ef6\u65f6\uff0c\u7528\u4f8b\u987a\u5e8f\u88ab\u8c03\u6574\u7684\u95ee\u9898\uff1b env.sh \u73af\u5883\u5b89\u88c5\u79fb\u9664 git \u548c curl\uff1b \u4fee\u590d\u7528\u4f8b\u5728 setup \u9636\u6bb5\u62a5\u9519\u540e\uff0c\u672a\u5199\u5165 ci_result.json \u7684\u95ee\u9898\uff1b \u79fb\u9664 uos_ci.py\uff1b "},{"location":"RELEASE/#11320221028","title":"1.1.3\uff082022/10/28\uff09","text":"new \u65b0\u589e\u56fe\u50cf\u65ad\u8a00\u6210\u529f\u8f93\u51fa\u5339\u914d\u5ea6\uff1b \u65b0\u589e\u73af\u5883\u5b89\u88c5 yaml \u4f9d\u8d56\uff1b \u65b0\u589e\u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6570\u636e\u56de\u586b\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b \u65b0\u589e\u6d4b\u8bd5\u7ed3\u679c\u8868\u60c5\u663e\u793a\uff0c\u5e76\u4f18\u5316\u4e86\u65e5\u5fd7\u7684\u6392\u7248\uff1b \u65b0\u589e --top {number} \u7528\u4e8e\u8bb0\u5f55\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0c\u65e5\u5fd7\u751f\u6210\u5230 report/logs/top.log\uff1b fix \u4fee\u590d\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4f46\u7ec8\u7aef\u6ca1\u6709\u9519\u8bef\u65e5\u5fd7\u8f93\u51fa\u7684\u95ee\u9898\uff1b \u4fee\u6539\u5931\u8d25\u7528\u4f8b\u56de\u6eaf\u65e5\u5fd7\u4e3a\u8be6\u7ec6\u7ea7\u522b\uff1b \u4fee\u590d\u4e86\u6267\u884c\u8fdb\u5ea6\u672a\u8ba1\u7b97\u8df3\u8fc7\u7528\u4f8b\u7684\u95ee\u9898\uff0c\u5e76\u4f18\u5316\u4e86\u8fdb\u5ea6\u83b7\u53d6\u7684\u7b97\u6cd5\uff1b \u4fee\u590d env.sh \u5728 V23 \u73af\u5883\u4e0b\u5b89\u88c5\u65e0\u6cd5\u8bfb\u53d6\u5bc6\u7801\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 pms \u6d4b\u8bd5\u5957\u6267\u884c\u6216\u6d4b\u8bd5\u5355\u6267\u884c\u65f6\uff0c\u7528\u4f8bID\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b env.sh \u91cc\u9762 hub.deepin.com \u66f4\u6362\u6210 it.uniontech.com\uff1b uos_ci.py \u6d4b\u8bd5\u7ed3\u679c\u7edf\u8ba1\u65f6\uff0c\u603b\u6570\u5254\u9664 skip \u7684\u6570\u91cf "},{"location":"RELEASE/#11220220921","title":"1.1.2\uff082022/09/21\uff09","text":"new \u5728\u6ca1\u6709\u5b89\u88c5 dogtail \u7684\u60c5\u51b5\u4e0b\uff0c\u4e5f\u80fd\u4f7f\u7528 sniff \u5de5\u5177\uff1b fix \u4fee\u590d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e2d\u6ca1\u6709\u5b89\u88c5 AT \u73af\u5883\u6267\u884c uos_ci.py \u62a5\u9519\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11120220919","title":"1.1.1\uff082022/09/19\uff09","text":"new \u65b0\u589e\u6267\u884c\u8fdb\u5ea6\u663e\u793a\uff0c\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u65f6\u65e5\u5fd7\u8f93\u51fa\u5f53\u524d\u8fdb\u5ea6\uff1a[\u5f53\u524d\u6307\u5b9a\u7b2c\u51e0\u6761/\u7528\u4f8b\u603b\u6570]\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u7528\u4f8b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\u6240\u6709\u5931\u8d25\u7528\u4f8b\u7684\u5217\u8868\uff1b \u5173\u95ed\u7ec8\u7aef\u8f93\u51fa\u6355\u83b7\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u65e5\u5fd7\u5feb\u7167\uff1b \u4f18\u5316\u7ec8\u7aef\u8f93\u51fa\u5931\u8d25\u4fe1\u606f\u5197\u957f\u4e3a\u7b80\u8981\u4fe1\u606f\u8f93\u51fa\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u663e\u793a 10 \u4e2a\u6267\u884c\u6700\u6162\u7684\u7528\u4f8b\u5217\u8868\uff0c\u5e76\u8be6\u7ec6\u5217\u51fa\u5404\u4e2a\u9636\u6bb5\u7684\u8017\u65f6\uff1b \u5931\u8d25\u91cd\u8dd1\u7528\u4f8b\u91cd\u8dd1\u4e4b\u524d\u5ef6\u8fdf 1 \u79d2\uff1b \u65b0\u589e\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4ecd\u7136\u5f3a\u5236\u6267\u884c\uff1b \u7528\u4f8b\u6536\u96c6\u65f6\u4ec5\u5728 apps \u76ee\u5f55\u4e0b\u8fdb\u884c\uff0c\u5ffd\u7565 src,setting,public \u76ee\u5f55\uff1b \u65b0\u589e allure \u62a5\u544a\u5907\u4efd\u529f\u80fd\uff0c\u9ed8\u8ba4\u5907\u4efd\u81f3 allure_back \u76ee\u5f55\u4e0b\uff1b manage.py\u65b0\u589e\u53c2\u6570 --lastfailed \u7528\u4e8e\u53ea\u8dd1\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\u7684\u529f\u80fd\uff1b fix \u4fee\u590d\u4e86\u5728\u6ca1\u6709\u6307\u5b9a\u5e94\u7528\u540d\u79f0\u6267\u884c\u65f6\uff0cxml \u62a5\u544a\u751f\u6210\u8def\u5f84\u5f02\u5e38\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 uos_ci.py \u4f20\u5165 timeout \u548c session_timeout \u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11020220916","title":"1.1.0\uff082022/09/16\uff09","text":"new \u65b0\u589ePMS\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u652f\u6301\u591a\u79cd\u6570\u636e\u56de\u586b\u6a21\u5f0f\uff1b \u4f18\u5316\u4e86\u901a\u8fc7\u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u65f6PMS \u722c\u866b\u7684\u6027\u80fd\uff1b \u65b0\u589e .gitmodules \u6587\u4ef6\uff0c\u7528\u4e8e\u6807\u8bb0\u6240\u6709\u5b50\u9879\u76ee\uff0c\u65b9\u4fbf\u7edf\u4e00\u62c9\u53d6\u4ee3\u7801\uff1b env.sh \u9002\u914d\u793e\u533a\u7248\u4e0a\u5b89\u88c5\u81ea\u52a8\u5316\u73af\u5883\uff1b \u589e\u52a0\u6267\u884c\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u9519\u8bef\u7684\u529f\u80fd\uff1b README.md \u589e\u52a0 Wayland \u4e0b\u4f7f\u7528\u3001\u6d4b\u8bd5\u62a5\u544a\u67e5\u770b\u3001\u5e38\u89c1\u95ee\u9898\u7b49\u7684\u6587\u6863\u8bf4\u660e\uff1b \u589e\u52a0\u4e86\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u5bf9 setup\u3001call\u3001teardown \u8fdb\u884c\u65e5\u5fd7\u5206\u6bb5\uff1b fix \u4fee\u590d\u4e86 \u786e\u8ba4\u4fee\u590d \u5217\u6ca1\u5199\u8868\u5934\uff0c\u4f46\u5199\u4e86 fixed-xxx \u6807\u7b7e\uff0c\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u540c\u4e00\u5e94\u7528\u5185\u591a\u4e2a csv \u6587\u4ef6\u4e2d \u786e\u8ba4\u4fee\u590d \u5217\u6709\u7684\u5199\u4e86\uff0c\u6709\u7684\u6ca1\u5199\uff0c\u53ef\u80fd\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 INFO \u65e5\u5fd7\uff0c\u663e\u793a\u4e3a DEBUG \u7684\u95ee\u9898\uff1b\u4fee\u590d\u4e86\u90e8\u5206\u673a\u5668\u4e0a INFO \u65e5\u5fd7\u5185\u5bb9\u663e\u793a\u4e3a\u7ea2\u8272\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\u770b\u4e0d\u5230\u8be6\u7ec6\u4fe1\u606f\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10220220822","title":"1.0.2\uff082022/08/22\uff09","text":"new \u79fb\u9664 loguru\uff0c\u66ff\u6362\u4e3a logging\uff0c\u63a5\u53e3\u4fdd\u6301\u4e0d\u53d8\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u53d7\u5f71\u54cd\uff1b \u9ed8\u8ba4\u5f00\u542f coredump\uff1b fix \u4fee\u590d\u4e86\u4e09\u65b9\u5e93 loguru \u5076\u73b0\u5f02\u5e38\uff0c\u5bfc\u81f4\u7a0b\u5e8f\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7b2c\u4e00\u6b21\u5931\u8d25\u4e0d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10120220812","title":"1.0.1\uff082022/08/12\uff09","text":"new \u65b0\u589e RELEASE.md \u6587\u4ef6\uff0c\u7528\u4e8e\u8bb0\u5f55\u5386\u53f2\u53d1\u5e03\u7248\u672c\u7684\u66f4\u65b0\u5185\u5bb9\uff1b \u517c\u5bb9 Wayland \u6a21\u5f0f\u4e0b\u6267\u884c\u7528\u4f8b\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u7528\u7ba1\u5f53\u524d\u6d4b\u8bd5\u673a\u6267\u884c\u73af\u5883\uff0c\u6846\u67b6\u4f1a\u81ea\u52a8\u6839\u636e\u5f53\u524d\u73af\u5883\u8d70\u4e0d\u540c\u7684\u4ee3\u7801\u903b\u8f91\uff1b \u7531\u4e8e\u9700\u8981\u4fee\u6539 dogtail \u6e90\u4ee3\u7801\uff0c\u56e0\u6b64\u5c06\u4fee\u6539\u540e\u7684\u6e90\u7801\u653e\u5165\u5230\u6838\u5fc3\u5e93\u91cc\u9762 src/depends/dogtail \u540e\u7eed\u7248\u672c\u5c06\u4e0d\u9700\u8981\u5728\u7cfb\u7edf\u4e2d\u5b89\u88c5dogtail\uff1b \u5982\u679c\u5e94\u7528\u5e93\u540c\u6837\u4f7f\u7528\u4e86\u7cfb\u7edf\u5b89\u88c5\u7684 dogtail \u53ef\u80fd\u4f1a\u62a5\u9519\uff0c\u89e3\u51b3\u65b9\u6848\u662f\u5c06\u4ee3\u7801\u4e2d\u7684 import dogtail \u4fee\u6539\u4e3a from src.depends import dogtail ; fix \u91cd\u8dd1\u5931\u8d25\u4e4b\u540e\u624d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff0c\u4fee\u6539\u4e3a\u5931\u8d25\u4e4b\u540e\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":"# Attribution \uff1achengdu Test Team\n# Date \uff1a2021/08/20\n \u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d \u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d \u4ed3\u5e93\u5730\u5740\uff1ahttps://gitlabcd.uniontech.com/autotest/cd-desktop-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u65b9\u6848\u6982\u8ff0","text":"\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u667a\u80fd\u8bc6\u522b\u5e94\u7528\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u7528\u4e8e\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u64cd\u4f5c\u8fc7\u7a0b\u4e2d\u7684\u5143\u7d20\u5b9a\u4f4d\u4ee5\u53ca\u5224\u65ad\u7ed3\u679c\u65f6\u7684\u65ad\u8a00\u5904\u7406\uff1b\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\uff0c\u6d4b\u8bd5\u673a\u4e0a\u7684\u753b\u9762\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u5230\u670d\u52a1\u5668\u4e0a\uff0c\u670d\u52a1\u5668\u5bf9\u89c6\u9891\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\u540e\uff0c\u670d\u52a1\u5668\u667a\u80fd\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\u6210\u529f\uff0c\u7136\u540e\u5bf9\u6d4b\u8bd5\u673a\u4e0b\u53d1\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\uff0c\u6d4b\u8bd5\u673a\u63a5\u53d7\u5e76\u6267\u884c\u4e0b\u4e00\u6b65\u64cd\u4f5c\u3002 \u670d\u52a1\u5668\u4e0e\u6d4b\u8bd5\u673a\u4e4b\u95f4\u7684\u94fe\u63a5\uff1a \u670d\u52a1\u5668\u901a\u8fc7 USB \u4e32\u53e3\u8bbe\u5907\uff08USB-HID \u534f\u8bae\uff09\u6a21\u62df\u9f20\u6807\u952e\u76d8\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u64cd\u4f5c\u3002 \u901a\u8fc7\u89c6\u9891\u91c7\u96c6\u8bbe\u5907\u6355\u83b7\u6d4b\u8bd5\u673a\u7684\u5b9e\u65f6\u753b\u9762\u4f20\u8f93\u7ed9\u670d\u52a1\u5668\u3002 \u670d\u52a1\u5668\u5bf9\u91c7\u96c6\u7684\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\uff0c\u8bc6\u522b\u5176\u4e2d\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5e76\u8fd4\u56de\u5143\u7d20\u63a7\u4ef6\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\uff0c\u670d\u52a1\u5668\u901a\u8fc7\u667a\u80fd\u5316\u5206\u6790\uff0c\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e00\u81f4\u5c06\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\u901a\u8fc7\u4e32\u53e3\u6a21\u62df\u952e\u9f20\u4fe1\u53f7\u53d1\u9001\u7ed9\u6d4b\u8bd5\u673a\uff1b\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e0d\u4e00\u81f4\u5c06\u4f1a\u8fdb\u5165\u4e2d\u65ad\u5904\u7406\u53ca\u5f02\u5e38\u7ed3\u679c\u8f93\u51fa\uff0c\u7ee7\u7eed\u6267\u884c\u540e\u7eed\u573a\u666f\uff0c\u76f4\u81f3\u6240\u6709\u7528\u4f8b\u6d4b\u8bd5\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u6df1\u5ea6\u5b66\u4e60\u73af\u5883\u642d\u5efa","text":"\u6a21\u578b\u8bad\u7ec3\u4e3b\u8981\u5bf9 GPU \u6709\u8981\u6c42\uff0c\u8bad\u7ec3\u6a21\u578b\u7684\u673a\u5668\u663e\u5b58\u4e0d\u4f4e\u4e8e 6G\uff0c\u5176\u4ed6\u914d\u7f6e\u65e0\u7279\u6b8a\u8981\u6c42\u3002 \u63a8\u8350\u6027\u4ef7\u6bd4\u8f83\u9ad8\u914d\u7f6e \u64cd\u4f5c\u7cfb\u7edf: UnionTech OS Desktop 20 Professional Linux version 4.19.0-desktop-amd64 (deepin@deepin-PC) (Uos 8.3.0.3-3+rebuild) \u5904\u7406\u5668: Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz (\u516b\u6838 / \u5341\u516d\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460M-HDV(RD)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))/8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: TU116 [GeForce GTX 1660]\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u865a\u62df\u73af\u5883\u5b89\u88c5","text":"cd ~\nwget -c https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh\nbash Miniconda3-latest-Linux-x86_64.sh\n \u4e00\u8def\u56de\u8f66 \u7b2c\u4e00\u6b21\u63d0\u793a\u8f93\u5165 yes/no \uff1a\u8f93\u5165 yes \u7ee7\u7eed\u4e00\u8def\u56de\u8f66 \u7b2c\u4e8c\u6b21\u63d0\u793a\uff1a\u8f93\u5165 no cd ~/miniconda3/bin\nsudo chmod 777 activate\n \u6fc0\u6d3bconda\u73af\u5883 . ./activate\n \u6dfb\u52a0\u516c\u53f8\u5185\u7f51\u6e90 conda config --add channels bioconda\nconda config --add channels conda-forge\n \u5982\u679c\u662f\u5916\u7f51\u6dfb\u52a0\u5916\u7f51\u6e90 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/\n \u5982\u679c\u8981\u5220\u9664\u6e90 conda config --remove-key channels\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"2\u3001\u5b89\u88c5\u4f9d\u8d56","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u521b\u5efa\u865a\u62df\u73af\u5883","text":"conda remove --name mmlab --all # \u79fb\u9664\u6240\u6709\u865a\u62df\u73af\u5883\n conda create -n mmlab python=3.7\n conda activate mmlab\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-pytorch","title":"\uff082\uff09\u5b89\u88c5 Pytorch","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install torch==1.7.0+cu101 torchvision==0.8.1+cu101 torchaudio==0.7.0 -f https://download.pytorch.org/whl/torch_stable.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-mmcv","title":"\uff083\uff09\u5b89\u88c5 MMCV","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install mmcv-full==1.3.3 -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.7.0/index.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"\uff084\uff09\u5b89\u88c5\u663e\u5361\u9a71\u52a8","text":"\u6839\u636e\u4f60\u7684\u663e\u5361\u4e0b\u8f7d\u5bf9\u5e94\u9a71\u52a8\uff0c\u6bd4\u5982\u6211\u7684\u663e\u5361\u4e3a GTX1660\uff0c\u9a71\u52a8\u7248\u672c\u4e3a 430\uff0c\u9a71\u52a8\u4e0b\u8f7d\u5730\u5740\uff1ahttps://www.nvidia.cn/Download/Find.aspx?lang=cn CTRL+ALT+F2 \u8fdb\u5165tty\n \u7981\u7528 nouveau \u9a71\u52a8 sudo vim /etc/modprobe.d/blacklist-nouveau.conf\n \u586b\u5165\uff1a blacklist nouveau options nouveau modeset=0\n \u5237\u65b0\u914d\u7f6e\u6587\u4ef6 sudo update-initramfs -u reboot \u91cd\u542f\u540e\u518d\u8fdb\u5165 tty \u5173\u95ed\u56fe\u50cf\u754c\u9762\uff0c\u8f93\u5165\u547d\u4ee4\u5173\u95ed\u56fe\u50cf\u754c\u9762 sudo service lightdm stop\n \u5b89\u88c5\u9a71\u52a8 sudo chmod a+x NVIDIA-Linux-x86_64-430.run\nsudo ./NVIDIA-Linux-x86_64-430.run\n reboot\u91cd\u542f\uff0cnvidia-smi\u67e5\u770b\u5b89\u88c5\u72b6\u6001\u3002\u6ce8\u610f\u770b\u4e0bcuda\u7248\u672c\uff0c10.1\uff0cdriver\u7248\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u6570\u636e\u6807\u6ce8","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u6570\u636e\u6807\u6ce8","text":"\u6807\u6ce8\u4e4b\u524d\u9700\u8981\u5148\u8f6c\u6362\u56fe\u7247\u5927\u5c0f\uff0c\u5e76\u4e14\u4ee5\u6570\u5b57\u547d\u540d\uff0c\u6bcf\u7ec4\u547d\u540d\u9012\u589e"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"\uff081\uff09\u8f6c\u6362\u5927\u5c0f\u5e76\u91cd\u547d\u540d","text":"rename_pic.py import os\nimport sys\nimport cv2\nimport time\nimport getpass\nusername = getpass.getuser()\nsource_path = f\"/home/{username}/Desktop/right_menu\" # \u56fe\u7247\u8def\u5f84\nsource_dest = os.path.join('/'.join(source_path.split(\"/\")[:-1]), 'tmp')\nif not os.path.exists(source_dest):\nos.mkdir(source_dest)\nstart_name = sys.argv[1]\nfile_name_list = list()\nfor file in os.listdir(source_path):\nif file.endswith('.png'):\nfile_name_list.append(file)\nstart_name = int(start_name)\nfor file in file_name_list:\nos.rename(os.path.join(source_path,file), os.path.join(source_path, f\"{str(start_name)}.png\"))\nstart_name += 1\ntime.sleep(1)\nfor file in os.listdir(source_path):\nimage = os.path.join(source_path, str(file))\nsrc = cv2.imread(image)\nresult = cv2.resize(src, (960, 540))\nresizeImage = os.path.join(source_dest, str(file))\nprint(resizeImage)\ncv2.imwrite(str(resizeImage), result)\ncv2.waitKey(0)\ncv2.destroyAllWindows()\ntime.sleep(1)\nos.system(f'rm -rf {source_path}/*')\nos.system(f'mv {source_dest}/* {source_path}')\nos.system(f'rm -rf {source_dest}')\nprint(\"\u4e0b\u4e00\u4e2a\u5e8f\u53f7\uff1a\", start_name)\n \u6839\u636e\u7ec8\u7aef\u8f93\u51fa\u7684\u4e0b\u4e00\u4e2a\u5e8f\u53f7\u7684\u63d0\u793a\uff0c\u6267\u884c Python \u6587\u4ef6\u7684\u65f6\u5019\u4f20\u53c2\u3002 python rename_pic.py 249\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"\uff082\uff09\u5de5\u5177\u6807\u6ce8","text":"\u4f7f\u7528\u5de5\u5177 labelImg \u6807\u6ce8 sudo pip3 install PyQt5==5.13\nsudo pip3 install labelImg\n \u7ec8\u7aef\u76f4\u63a5\u8f93\u5165 labelImg\uff0c\u56de\u8f66 \u6807\u6ce8\u6a21\u5f0f\u9009\u62e9\uff1aPascalVOC"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u667a\u80fd\u6807\u6ce8","text":"\u6253\u5f00\u5c4f\u5e55\u5f55\u5236\u8f6f\u4ef6\uff0c\u5f55\u5236\u624b\u52a8\u64cd\u4f5c\u4e00\u6b21\u6d4b\u8bd5\u7528\u4f8b\uff0c\u7136\u540e\u5c06\u5f55\u5236\u7684\u89c6\u9891\u8fdb\u884c\u5206\u5e27\uff0c\u7136\u540e\u5bf9\u6bd4\u524d\u4e24\u5e27\u56fe\u6807\u76f8\u4f3c\u5ea6\uff0c\u5254\u9664\u76f8\u4f3c\u5ea6\u8fc7\u9ad8\u7684\u56fe\u7247\uff0c\u5728\u4fdd\u8bc1\u7d20\u6750\u591a\u6837\u6027\u7684\u524d\u63d0\u4e0b\uff0c\u5254\u9664\u91cd\u590d\u591a\u4f59\u7684\u56fe\u7247\u751f\u6210\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u96c6\uff0c\u7136\u540e\u53d6\u51fa\u63a7\u4ef6\u6a21\u677f\u6570\u636e\u96c6\uff0c\u901a\u8fc7 OpenCV \u6a21\u677f\u5339\u914d\u83b7\u53d6\u63a7\u4ef6\u5728\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u56fe\u7247\u4e2d\u6240\u5728\u7684\u5de6\u4e0a\u3001\u5de6\u4e0b\u3001\u53f3\u4e0a\u3001\u53f3\u4e0b\u56db\u5904\u5750\u6807\uff0c\u4ece\u800c\u6839\u636e\u6a21\u677f\u6570\u636e\u96c6\u751f\u6210\u6807\u6ce8\u6570\u636e\u3002\u53c2\u8003\u76ee\u5f55 AnnotationMaterial"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"\uff081\uff09\u6a21\u677f\u6570\u636e\u96c6\u51c6\u5907","text":"1\u3001\u5728\u754c\u9762\u622a\u53d6\u9700\u8981\u6807\u6ce8\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u653e\u5728\u76ee\u5f55\u4e0b AnnotationMaterial/template/img 2\u3001\u7ef4\u62a4\u63a7\u4ef6\u540d\u4e0e\u5143\u7d20\u63a7\u4ef6\u7684\u952e\u5bf9\uff0c\u4e00\u4e2a\u63a7\u4ef6\u540d\u53ef\u5bf9\u5e94\u591a\u4e2a\u5143\u7d20\u63a7\u4ef6 menu:\n- menu.jpg\n- menu1.jpg\n- menu2.jpg\n- menu3.jpg\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"\uff082\uff09\u7d20\u6750\u96c6\u51c6\u5907","text":"\u5f55\u5236\u89c6\u9891\u6216\u6216\u5c4f\u5e55\u622a\u56fe\u653e\u7f6e\u76ee\u5f55 AnnotationMaterial/source"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u5f00\u59cb\u6807\u6ce8","text":"python3 AnnotationMaterial/main.py\n \u751f\u6210\u7684\u6807\u6ce8\u6570\u636e\u5b58\u653e\u5728 AnnotationMaterial/result"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#mmdetection","title":"\u56db\u3001MMDetection","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1-mmdetection","title":"1\u3001 MMDetection \u4ee3\u7801","text":"MMDetection \u662f\u4e00\u4e2a\u6709\u540d\u7684\u6df1\u5ea6\u5b66\u4e60\u76ee\u6807\u68c0\u6d4b\u5f00\u6e90\u9879\u76ee\uff0c\u4e5f\u662f openMMlab \u7684\u62db\u724c\u9879\u76ee\uff0c\u4e3a\u4ec0\u4e48\u9009\u62e9\u5b83\uff0c\u5c0f\u5b69\u513f\u6ca1\u5a18\u8bf4\u6765\u8bdd\u957f\uff0c\u611f\u5174\u8da3\u53ef\u4ee5\u81ea\u884c\u6df1\u5165\u4e86\u89e3\uff1b \u4f60\u53ef\u4ee5\u76f4\u63a5\u5728 GitHub \u4e0a\u514b\u9686\u4ee3\u7801\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u54b1\u4eec\u4ed3\u5e93\u4e0b Train \u76ee\u5f55\u4e2d\u4ee3\u7801\uff0cTrain \u4e2d\u7684\u4ee3\u7801\u4e5f\u662f\u4ece GitHub \u4e0a\u62c9\u53d6\u7684\uff0c\u4e0d\u8fc7\u6211\u4eec\u6839\u636e\u9879\u76ee\u9700\u8981\u505a\u4e86\u4e00\u4e9b\u4e8c\u6b21\u5f00\u53d1\uff0c\u63a8\u8350\u76f4\u63a5\u4f7f\u7528\u5b83\u3002 \u5982\u679c\u4f60\u60f3\u4ece GitHub \u4e0a\u62c9\uff1a git clone https://github.com/open-mmlab/mmdetection.git\n# \u4e0d\u80fd\u76f4\u63a5\u62c9\u53d6\u4e3b\u5206\u652f\uff0c\u5efa\u8bae\u4f7f\u75282.12\u7248\u672c\uff0c\u4e0d\u540c\u7684\u7248\u672c\u5bf9\u5e94\u7684mmcv\u7248\u672c\u662f\u4e0d\u540c\u7684\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-voc2coco","title":"2\u3001\u62c9\u53d6 voc2coco \u4ee3\u7801","text":"git clone https://github.com/Tony607/voc2coco.git\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-coco","title":"3\u3001\u8f6c\u6362 coco \u6570\u636e\u96c6","text":"\u5c06\u6240\u6709\u7684\u56fe\u7247\u548cxml\u6587\u4ef6\u653e\u5165train2017\uff0c\u4ece\u4e2d\u6311\u9009\u51e0\u7ec4\u653e\u5165val2017\uff08\u6d4b\u8bd5\u96c6\uff09 cd mmdetection/data/coco\npython voc2coco.py train2017 annotations/instances_train2017.json\npython voc2coco.py val2017 annotations/instances_val2017.json\n \u751f\u6210json\u6587\u4ef6"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4_1","title":"4\u3001\u4fee\u6539\u914d\u7f6e","text":"\uff081\uff09\u8bfb\u53d6\u6a21\u578b\u540d\u79f0 import json\nmodule_name = []\nwith open('./instances_train2017.json', \"r+\") as f:\njson_file = f.read()\njson_dict = json.loads(json_file)\nmodule_list = json_dict.get('categories')\nfor module_info in module_list:\nname = module_info.get('name')\nmodule_name.append(name)\nprint(module_name)\nprint(\"module_num:\", len(module_name))\n # \u6ce8\u610f\u5bf9\u6bd4instances_train2017.json\u91cc\u9762\u6a21\u578b\u540d\u79f0\u7684\u987a\u5e8f\uff0c\u4e0eCLASSES\u548ccoco_classes\u91cc\u9762\u7684\u987a\u5e8f\u4fdd\u6301\u4e00\u81f4\u3002\n \uff082\uff09\u4fee\u6539 faster_rcnn_r101_2x_coco.py mmdetection/xianjin/faster_rcnn_r101_2x_coco.py \u4fee\u653946\u884c\uff0cnum_clasess\u7684\u503c\uff0c\u65b0\u589e1\u4e2a\uff0c\u5c31 +1\uff1b \uff083\uff09\u4fee\u6539 coco.py mmdetection/mmdet/datasets/coco.py CLASSES = ()\uff0c\u5728\u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b \uff084\uff09\u4fee\u6539 class_names.py mmdetection/mmdet/core/evaluation/class_names.py coco_classes \u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#5","title":"5\u3001\u7f13\u5b58\u6e05\u7406","text":"\u5220\u9664 mmdetection/build \u76ee\u5f55 python setup.py install\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#6","title":"6\u3001\u8bad\u7ec3\u6a21\u578b","text":"\uff081\uff09\u6307\u5b9a\u81ea\u5df1\u914d\u7f6e\u7684\u8bad\u7ec3\u6a21\u578b\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py --gpus 1\n \uff082\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u6d4b\u8bd5\u96c6\u7ed3\u679c\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py xianjin/epoch_24.pth --show\n \uff083\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u51c6\u786e\u5ea6\uff1b python tools/analysis_tools/analyze_logs.py plot_curve xianjin/20210530_011907.log.json --keys acc\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#7","title":"7\u3001\u5feb\u6377\u64cd\u4f5c","text":"python3 run.py\n \u5c06\u4ee5\u4e0a 4 - 7 \u6b65\u64cd\u4f5c\u6574\u5408\u6210 run.py\uff0c\u4e00\u952e\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u4e94\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\uff1b \u670d\u52a1\u7aef\u4e00\u53f0\uff08\u76ee\u524d\u4ec5\u652f\u6301AMD\u67b6\u6784\uff09\uff1b \u91c7\u96c6\u76d2\u4e00\u4e2a \uff08ACASIS hdmi\u89c6\u9891\u91c7\u96c6\u5361\uff0chttps://item.jd.com/10024310742602.html \uff09\uff1b USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\uff1b USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff1b \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5USB\u5ef6\u957f\u7ebf\uff1b \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u63a8\u8350\u914d\u7f6e","text":"\u6267\u884c\u7528\u4f8b\u7684\u670d\u52a1\u7aef\u5bf9\u914d\u7f6e\u6ca1\u6709\u7279\u6b8a\u8981\u6c42\uff0c\u5982\u679c\u6761\u4ef6\u5141\u8bb8\u914d\u7f6e\u8d8a\u9ad8\uff0c\u8bc6\u522b\u901f\u5ea6\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n \u6d4b\u8bd5\u673a\u4e0a\u4e0d\u6267\u884c\u4efb\u4f55\u811a\u672c\uff0c\u5177\u4f53\u914d\u7f6e\u6839\u636e\u6d4b\u8bd5\u9700\u8981\u51b3\u5b9a\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#usb_mk","title":"\u516d\u3001USB_MK\u4e32\u53e3\u9a71\u52a8\u65b9\u6cd5","text":"\u4f4d\u4e8econtrol_method\u76ee\u5f55\u4e0b\u7684usb_mk.py\u6587\u4ef6 \uff081\uff09\u5217\u51fa\u53ef\u901a\u4fe1\u7684\u7aef\u53e3 python3 -m serial.tools.list_ports -v\n \uff082\uff09\u4fee\u6539\u4e32\u53e3\u7684\u6743\u9650 sudo chmod 777 /dev/ttyACM0\n \uff083\uff09\u5b9e\u4f8b\u5316USB_MK import UsbMk\nusb_mk = UsbMk(\"/dev/ttyACM0\", 9600) # \u8bbe\u5907\u9ed8\u8ba49600\u4e3a\u6ce2\u7279\u7387\uff0c\u63a7\u5236\u4f20\u8f93\u901f\u7387\n \uff084\uff09USB\u4e32\u53e3\u8bbe\u5907\u9ed8\u8ba4\u6ce2\u7279\u7387\u4e3a9600\uff08\u7ecf\u6d4b\u8bd5\u6ce2\u7279\u73879600\u51c6\u786e\u6027\u6700\u597d\uff09\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up() # \u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u6c49\u5b57\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e\n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff083\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff084\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff085\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() # \u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2\n \uff086\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff087\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff088\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e03\u3001\u65b9\u6cd5\u8c03\u7528\u5165\u53c2\u89c4\u5219","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_7","title":"1\u3001\u57fa\u7c7b","text":"class Base:\ndef __init__(self):\nself._obj = image\nself._usb = usb_mk\ndef find_element_by_ai(self, element):\nreturn self._obj.find_element(element)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_6","title":"2\u3001\u5165\u53c2\u8bf4\u660e","text":"\u56fe\u50cf\u8bc6\u522b\u65b9\u6cd5\u5165\u53e3\u4e3a Base \u7c7b\u4e0b\u7684 find_element_by_ai \u3002\u4ec5\u63a5\u53d7\u4e00\u4e2a\u53c2\u6570 element\uff0c\u7c7b\u578b\u4e3a string\u3002 \u53ef\u8bc6\u522b\u7684 string \u683c\u5f0f\uff1a \uff081\uff09\u5927\u56fe\u6807\uff08 \u56fe\u6807\u5927\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\uff0c\u4f8b\uff1a Base().find_element_by_ai(\"window\")\n \uff082\uff09\u5927\u56fe\u6807 / \u5c0f\u56fe\u6807\uff08\u56fe\u6807\u5c0f\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5c0f\u56fe\u6807\uff0c\u4f8b\uff1awindow/search_btn Base().find_element_by_ai(\"window/search_btn\")\n \uff083\uff09\u5927\u56fe\u6807 / OCR\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\u5185\u7684\u6587\u5b57\uff0c\u4f8b\uff1amenu/\u5c5e\u6027 Base().find_element_by_ai(\"menu/\u5c5e\u6027\")\n \uff084\uff09OCR\uff1a\u5168\u5c4f\u8bc6\u522b\u6587\u5b57 Base().find_element_by_ai(\"\u641c\u7d22\")\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516b\u3001\u9690\u85cf\u9f20\u6807","text":"\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u8fc7\u6765\u7684\u89c6\u9891\u6d41\uff0c\u5728\u8bc6\u522b\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u53d7\u5230\u9f20\u6807\u5f71\u54cd\uff0c\u56e0\u6b64\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u9690\u85cf\u9f20\u6807\u3002 \u5c4f\u853d\u9f20\u6807\u5149\u6807\u663e\u793a ```shell script /etc/lightdm/lightdm.conf \u5728`[Seat:*]`\u4e0b\u9762\u6dfb\u52a0\u53c2\u6570\n```shell script\nxserver-command=X -bs -core -nocursor\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e5d\u3001\u667a\u80fd\u81ea\u52a8\u5316\u7684\u610f\u4e49","text":"1\u3001\u6539\u5584 Acessibility \u5b9a\u4f4d\u7684\u7a33\u5b9a\u6027\u95ee\u9898 Acessibility \u5c5e\u6027\u5b9a\u4f4d\u5b58\u5728\u5076\u5c14\u5931\u6548\u7684\u60c5\u51b5 \uff081\uff09\u5f00\u53d1\u5728\u505a\u65b0\u9700\u6c42\u5f00\u53d1\u65f6\u53ef\u80fd\u6d89\u53ca\u5230\u5bf9\u5c5e\u6027\u6807\u7b7e\u7684\u4fee\u6539\u6216\u8005\u5c42\u7ea7\u7684\u8c03\u6574\uff0c\u53ef\u80fd\u9020\u6210\u81ea\u52a8\u5316\u7528\u4f8b\u65e0\u6cd5\u5b9a\u4f4d\u5230\u5143\u7d20\u3002 \u6bd4\u59821040\u9636\u6bb5\uff0c\u97f3\u4e50\u91cd\u6784\u7684\u65f6\u5019\uff0c\u5f00\u53d1\u5bf9\u90e8\u5206\u5c5e\u6027\u548c\u5c42\u7ea7\u505a\u4e86\u4fee\u6539\uff0c\u5bfc\u81f4\u81ea\u52a8\u5316\u7528\u4f8b\u5b9a\u4f4d\u65b9\u6cd580%\u9700\u8981\u4fee\u6539\u3002 \u5f00\u53d1\u65b0\u529f\u80fd\u7684\u65f6\u5019\u5076\u5c14\u4e5f\u4f1a\u5bf9\u5c5e\u6027\u505a\u8c03\u6574\uff0c\u9047\u52305\u6b21\u3002 \uff082\uff09\u76ee\u524d\u4e3b\u8981\u4f7f\u7528Dogtail\u8bc6\u522b\u5e94\u7528Acessibility\u5c5e\u6027\u8fdb\u884c\u5b9a\u4f4d\uff0c\u662f\u83b7\u53d6\u5e94\u7528\u5f53\u524d\u754c\u9762\u7684\u5c5e\u6027tree\uff0c\u5728\u5e94\u7528\u8df3\u8f6c\u540e\uff0cDogtail\u5b58\u5728\u65e0\u6cd5\u53ca\u65f6\u83b7\u53d6\u5f53\u524d\u5c5e\u6027\u5217\u8868\u7684\u60c5\u51b5\u3002 \u591a\u5a92\u4f53\u8c03\u7528\u6587\u7ba1\u7a97\u53e3\u7684\u65f6\u5019\uff0c\u51fa\u73b0\u627e\u4e0d\u5230\u6587\u7ba1\u91cc\u9762\u5143\u7d20\u7684\u60c5\u51b5\uff0c\u76ee\u524d\u51fa\u73b010+\u6b21\u3002 \u5e94\u7528\u8bbe\u7f6e\u9875\u9762\u7684\u5c5e\u6027\u5076\u5c14\u5b58\u5728\u627e\u4e0d\u5230\u7684\u60c5\u51b5\uff0c\u9047\u52305\u6b21\u3002 \uff083\uff09Dogtail\u5de5\u5177\u672c\u8eab\u5b58\u5728\u95ee\u9898\uff0c\u6709\u65f6\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u5019\u5f88\u6162\uff0c\u8ba9\u4eba\u65e0\u6cd5\u63a5\u53d7\uff0c\u76ee\u524d\u51fa\u73b0\u8fc7\u5f88\u591a\u6b21\u3002 \u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u95f4\u6bd4\u5e73\u5e38\u61623\u500d\uff0c\u51fa\u73b04\u6b21\u3002 2\u3001\u89e3\u51b3\u4e86\u4f7f\u7528\u7edd\u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898 \u90e8\u5206\u63a7\u4ef6\u65e0\u6cd5\u6dfb\u52a0 Acessibility \u5c5e\u6027\u4ece\u800c\u4f7f\u7528\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u51fa\u73b0\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898\u3002 \uff081\uff09\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u65b9\u6cd5\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u76ee\u6807\u56fe\u7247\u8d44\u6e90\uff0c\u5728 UI \u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u4f1a\u6d89\u53ca\u5230\u76ee\u6807\u8d44\u6e90\u7684\u66ff\u6362\uff0c\u6bd4\u8f83\u8017\u8d39\u4eba\u529b\u3002 \uff082\uff09\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6cd5\u5bf9\u6bd4\u7cbe\u5ea6\u6bd4\u8f83\u641e\uff0c\u5982\u679cUI \u7684\u53d8\u66f4\u4f1a\u9020\u6210\u65e0\u6cd5\u51c6\u786e\u5b9a\u4f4d\u5230\uff0c\u81ea\u52a8\u5316\u811a\u672c\u5065\u58ee\u6027\u4e0d\u8db3\u3002 3\u3001\u4f7f\u7528\u673a\u5668\u5206\u79bb\uff0c\u89e3\u51b3\u4e86\u81ea\u52a8\u5316\u811a\u672c\u5bf9\u5e94\u7528\u7684\u5f71\u54cd\uff0c\u771f\u5b9e\u8fd8\u539f\u7528\u6237\u7684\u4f7f\u7528\u573a\u666f \u673a\u5668\u5206\u79bb\u7684\u67b6\u6784\u8bbe\u8ba1\uff0c\u4fdd\u8bc1\u4e86\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u73af\u5883\u5b8c\u5168\u7b49\u540c\u4e8e\u7528\u6237\uff0c\u6392\u9664\u6d4b\u8bd5\u811a\u672c\u7684\u5f71\u54cd\u3002 \uff081\uff09\u76ee\u524d\u7684\u529f\u80fd\u81ea\u52a8\u5316\u662f\u5728\u6d4b\u8bd5\u673a\u4e0a\u76f4\u63a5\u8fd0\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\uff0c\u52a0\u4e0a\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u6211\u4eec\u6dfb\u52a0\u4e86\u4e00\u4e9b\u8fdb\u7a0b\u76d1\u63a7\u3001\u89c6\u9891\u5f55\u5236\u7b49\u529f\u80fd\uff0c\u81ea\u52a8\u5316\u811a\u672c\u672c\u8eab\u4f1a\u6d88\u8017\u4e00\u4e9b\u7cfb\u7edf\u8d44\u6e90\uff0c\u65e0\u6cd5\u8fd8\u539f\u771f\u662f\u7684\u7528\u6237\u4f7f\u7528\u573a\u666f\u3002 \uff082\uff09\u6027\u80fd\u6d4b\u8bd5\u9700\u8981\u6392\u9664\u5176\u4ed6\u7a0b\u5e8f\u7684\u8d44\u6e90\u6d88\u8017\u5f71\u54cd\uff0c\u6027\u80fd\u81ea\u52a8\u5316\u91c7\u7528\u673a\u5668\u5206\u79bb\uff0c\u4fdd\u8bc1\u4e86\u6027\u80fd\u6570\u636e\u7684\u51c6\u786e\u6027\u3002 \u4ee5\u524d\u7684\u7528\u4f8b\u6267\u884c\u8017\u65f6\u6ca1\u6761\u572830\u79d2\u5de6\u53f3\uff0c\u73b0\u5728\u7528\u4f8b\u8017\u65f6\u572810\u79d2\u3002 4\u3001\u89e3\u51b3\u4e86UI \u8c03\u6574\u5bfc\u81f4\u5b9a\u4f4d\u5931\u8d25\u7684\u4e0d\u7a33\u5b9a\u6027\u95ee\u9898 \uff081\uff09\u89e3\u51b3\u4e86\u56e0 UI \u8c03\u6574\u5bfc\u81f4\u63a7\u4ef6\u4f4d\u7f6e\u53d8\u5316\u6216\u8272\u5dee\u53d8\u5316\u540e\u5b9a\u4f4d\u4e0d\u51c6\u786e\u7684\u95ee\u9898\uff0c\u53ea\u8981\u63a7\u4ef6\u6587\u6848\u548c\u63a7\u4ef6\u5916\u8fb9\u6846\u65e0\u53d8\u5316\u5747\u53ef\u51c6\u786e\u5b9a\u4f4d\uff1b \uff082\uff09\u76ee\u524d\u4e5f\u4f1a\u91c7\u7528\u57fa\u4e8eUI\u7684\u5b9a\u4f4d\u65b9\u6848\uff0c\u5982\u679cUI\u4f4d\u7f6e\u6709\u8c03\u6574\uff0c\u4f1a\u5bfc\u81f4\u5143\u7d20\u65e0\u6cd5\u5b9a\u4f4d\u3002 5\u3001\u7b80\u5316\u4e86\u7528\u4f8b\u7ed3\u6784\uff0c\u63d0\u5347\u7f16\u5199\u53cb\u597d\u5ea6 \uff081\uff09\u667a\u80fd\u81ea\u52a8\u5316\u8bc6\u522b\u5143\u7d20\u7684\u65b9\u6cd5\u53ea\u6709\u4e00\u4e2a\uff0c\u5c31\u662f\u57fa\u4e8e\u6211\u4eec\u8bad\u7ec3\u7684\u6a21\u578b\u8bc6\u522b\u89c6\u9891\u6d41\u4e2d\u7684\u5143\u7d20\uff0c\u7ecf\u8fc7\u811a\u672c\u5c01\u88c5\u4e4b\u540e\uff0c\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u4e2d\u6240\u6709\u5b9a\u4f4d\u7684\u64cd\u4f5c\u90fd\u53ea\u9700\u8981\u8c03\u7528\u8fd9\u4e00\u4e2a\u65b9\u6cd5\u5c31\u884c\u4e86\uff0c\u7f16\u5199\u81ea\u52a8\u5316\u811a\u672c\u7684\u96be\u5ea6\u5927\u5927\u964d\u4f4e\u3002 \uff082\uff09\u4e5f\u662f\u7531\u4e8e\u8c03\u7528\u65b9\u6cd5\u7b80\u5355\uff0c\u5728 UI \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u4e2d\u7684\u5206\u5c42\u7ed3\u6784\u5c06\u4f1a\u51cf\u5c11\uff0c\u591a\u7ee7\u627f\u7684\u60c5\u51b5\u4f1a\u51cf\u5c11\uff0c\u81ea\u52a8\u5316\u4ee3\u7801\u7684\u8c03\u7528\u7ed3\u6784\u4e5f\u4f1a\u53d8\u5f97\u7b80\u5355\uff0c\u800c\u4e14\u529f\u80fd\u6d4b\u8bd5\u540c\u5b66\u7f16\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u66f4\u52a0\u5bb9\u6613\u4e0a\u624b\u3002 \u4ee5\u524d\u5199\u7528\u4f8b\u7531\u4e8e\u9700\u8981\u7ed3\u5408\u4e0d\u540c\u7684\u6a21\u5757\uff0c\u8c03\u7528\u4e0d\u540c\u7684\u65b9\u6cd5\uff0c\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u5e76\u5b8c\u6210\u8c03\u8bd5\u7684\u65f6\u95f4\u5e73\u5747\u572820-30\u5206\u949f\uff0c\u73b0\u5728\u5199\u7528\u4f8b\u811a\u672c\u80fd\u57285\u5206\u949f\u5de6\u53f3\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":"# =============================================\n# Attribution : Application Test Department III\n# Time : 2023/1/3\n# Author : ut003281\n# =============================================\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u7b80\u8ff0","text":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5 \u901a\u8fc7\u81ea\u52a8\u5316\u624b\u6bb5\u5bf9\u5e94\u7528\u8fdb\u884c\u6027\u80fd\u6d4b\u8bd5\uff0c\u63d0\u4f9b\u65b9\u4fbf\u7684\u73af\u5883\u90e8\u7f72\u3001\u8fd0\u884c\u914d\u7f6e\u3001\u7528\u4f8b\u7f16\u5199\u7b49\uff0c\u7528\u4e8e\u684c\u9762\u5e94\u7528\u7684\u51b7\u70ed\u542f\u52a8\u3001\u8d44\u6e90\u62f7\u8d1d\u3001\u9875\u9762\u8df3\u8f6c\u7b49\u6027\u80fd\u573a\u666f\u6d4b\u8bd5\u3002 \u4ed3\u5e93\u5730\u5740\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-perf-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u4ee3\u7801\u7ed3\u6784","text":"autotest-perf-aitest\n\u251c\u2500\u2500 apps # \u5b58\u653e\u6240\u6709\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u811a\u672c\n\u251c\u2500\u2500 conftest.py # pytest hook\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 CURRENT # \u7248\u672c\u5185\u5bb9\n\u251c\u2500\u2500 docs # \u6587\u6863\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u952e\u503c\u5bf9\u7167\u8868.pdf # \u4e32\u53e3\u7ebfcode\u4e0e\u6309\u952e\u7684\u5bf9\u7167\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u6027\u80fd\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\u6267\u884c\u5668\u4f7f\u7528\u6307\u5357.md # \u6267\u884c\u5668\u811a\u672c\u4f7f\u7528\u6307\u5357\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 USB\u4e32\u53e3\u8f6cUSB\u952e\u76d8\u9f20\u6807\u7ebf\u534f\u8bae\u6587\u4ef6V1.0.pdf # \u4e32\u53e3\u534f\u8bae\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput-0.28.2.zip # Linux\u4e0b\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\u7684\u6e90\u7801\uff0c\u53ef\u6839\u636e\u67b6\u6784\u6253\u5305\n\u251c\u2500\u2500 manage.py # \u529f\u80fd\u4e3b\u5165\u53e3\n\u251c\u2500\u2500 pytest.ini # pytst \u914d\u7f6e\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 setting # \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 client.ini # \u6d4b\u8bd5\u673a IP \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5168\u5c40\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dev_env.sh # \u5bbf\u4e3b\u673a\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose_no_relay.yml # \u65e0\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose.yml # \u6709\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker_login.sh # docker \u767b\u9646\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 res\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 black.png # \u5168\u9ed1\u56fe\u7247\uff0c\u7528\u4e8e\u4fee\u6539\u58c1\u7eb8\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_5000.deb # 3A5000 \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_amd64.deb # amd \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_arm64.deb # arm \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_mips64.deb # mips \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_sw_64.deb # sw \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 server.ini # \u670d\u52a1\u5668\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 setup.sh # \u5bb9\u5668\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 template # \u521b\u5efa app \u57fa\u7840\u811a\u672c\u6a21\u677f\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 app_template\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ${app_name}_widget.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 control-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 images\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 test_${app_name}_01_scene.json-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 test_${app_name}_01_scene.py-tpl\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 uos_docker # \u5bb9\u5668\u73af\u5883\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dockerfile\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 requirements.txt\n\u2514\u2500\u2500 src\n \u251c\u2500\u2500 analysis_save.py # \u89e3\u6790\u56fe\u7247\u6d41\u7ed3\u679c\uff0c\u6c47\u603b\u751f\u6210 excel \u62a5\u544a\n\u251c\u2500\u2500 base_widget.py # \u5c01\u88c5\u7684\u57fa\u7840\u64cd\u4f5c\uff0c\u5e94\u7528\u8c03\u7528\u7684\u4e3b\u5165\u53e3\u65b9\u6cd5\n\u251c\u2500\u2500 cmdctl.py # \u8c03\u7528\u547d\u4ee4\u884c\u4f7f\u7528\n\u251c\u2500\u2500 global_value.py # \u5168\u5c40\u53d8\u91cf\n\u251c\u2500\u2500 image_utils.py # \u56fe\u7247\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 __init__.py\n \u251c\u2500\u2500 logger_utils.py # \u65e5\u5fd7\u914d\u7f6e\n\u251c\u2500\u2500 pdocr.py # ocr \u914d\u7f6e\n\u251c\u2500\u2500 public_method.py # \u4e00\u4e9b\u65b9\u4fbf\u7684\u5c01\u4f4f\n\u251c\u2500\u2500 record.py # \u5f55\u5c4f\u76f8\u5173\n\u251c\u2500\u2500 rtk # \u8fd0\u884c\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 _base.py # \u4e00\u4e9b\u679a\u4e3e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 install_env.py # \u5b89\u88c5\u73af\u5883\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 local_runner.py # \u8fd0\u884c\u7528\u4f8b\n\u251c\u2500\u2500 serial_communication # \u4e32\u53e3\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 power_control.py # \u7ee7\u7535\u5668\u64cd\u4f5c\uff0c\u4f7f\u7528\u7ee7\u7535\u5668\u8fde\u63a5\u4e3b\u673a\u7535\u6e90\uff0c\u63a7\u5236\u5f00\u5173\u673a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 serial_common.py # \u4e32\u53e3\u516c\u5171\u65b9\u6cd5\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 usb_mk.py # \u952e\u9f20\u64cd\u4f5c\u57fa\u7840\u5c01\u88c5\n\u251c\u2500\u2500 shortcut_key.py # \u5feb\u6377\u952e\u7684\u5c01\u88c5\n\u251c\u2500\u2500 singleton.py # \u5355\u4f8b\u6a21\u5f0f\n\u251c\u2500\u2500 start_app.py # \u521b\u5efa app\n\u2514\u2500\u2500 write_xlsx.py # \u751f\u6210 excel\n# __init__.py \u6587\u4ef6\u4e3a\u6807\u8bc6\u8be5\u76ee\u5f55\u662f\u4e00\u4e2aPython\u7684\u6a21\u5757\u5305\uff0c\u9879\u76ee\u4e2d\u7684__init__.py\u5747\u4e3a\u7a7a\u6587\u4ef6\u3002\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u73af\u5883\u642d\u5efa","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\u3002 \u670d\u52a1\u7aef\u4e00\u53f0\u3002\uff08\u4ec5\u652f\u6301 AMD \u67b6\u6784\uff0c\u82e5\u9700\u5176\u4ed6\u67b6\u6784\uff0c\u54a8\u8be2\u76f8\u5173\u5f00\u53d1\u4eba\u5458\uff09 \u91c7\u96c6\u76d2\u4e00\u4e2a\u3002 \uff08ACASIS HDMI \u89c6\u9891\u91c7\u96c6\u76d2\uff0chttps://item.jd.com/100013302599.html#crumb-wrap \uff09 USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\u3002\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"\uff082\uff09\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\u3002 USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff08USB3.0 \u63a5\u53e3\u4e0a\uff09\u3002 \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5 USB \u5ef6\u957f\u7ebf\u3002 \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u670d\u52a1\u7aef\u63a8\u8350\u914d\u7f6e","text":"\u914d\u7f6e\u8d8a\u9ad8\uff0c\u89e3\u6790\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"2\u3001\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa","text":" \u6253\u5f00\u63a7\u5236\u4e2d\u5fc3\uff0c\u8d26\u6237\u8bbe\u7f6e\u4e3a\u3010\u81ea\u52a8\u767b\u5f55\u3011\u548c\u3010\u65e0\u5bc6\u7801\u767b\u5f55\u3011\uff0c\u7535\u6e90\u7ba1\u7406\u4e2d\u4f7f\u7528\u7535\u6e90\u5168\u90e8\u8bbe\u7f6e\u4e3a\u3010\u4ece\u4e0d\u3011\uff0c\u5f00\u542f\u5f00\u53d1\u8005\u6a21\u5f0f\u3002 \u6839\u636e\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u8981\u6c42\uff0c\u5bfc\u5165\u76f8\u5173\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\uff1a\u5bfc\u5165\u76f8\u518c\u3001\u5f71\u9662\u3001\u97f3\u4e50\u7684\u6d4b\u8bd5\u8d44\u6e90\u3002 \u5728\u670d\u52a1\u7aef\u6253\u5f00\u76f8\u673a\u5e94\u7528\u540e\uff0c\u5c06\u6d4b\u8bd5\u673a\u684c\u9762\u58c1\u7eb8\u66f4\u6362\u4e3a\u7eaf\u8272\u58c1\u7eb8\uff08\u6ce8\u610f\uff0c\u670d\u52a1\u7aef\u9700\u63d0\u524d\u5f00\u542f\u76f8\u673a\u540e\u518d\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u58c1\u7eb8\uff0c\u5efa\u8bae\u7eaf\u9ed1\u58c1\u7eb8 setting/res/black.png\uff09 \u5728\u6587\u4ef6\u7ba1\u7406\u5668\u4e2d\uff0c\u5c06\u9009\u9879 \u4e3b\u83dc\u5355-\u8bbe\u7f6e-\u9884\u89c8-\u56fe\u7247\u9884\u89c8 \u53d6\u6d88\u52fe\u9009\uff08\u5982\u4e0d\u53d6\u6d88\uff0c\u4f1a\u5f71\u54cd\u622a\u56fe\u5f55\u5c4f\u5e94\u7528\u7684\u6027\u80fd\u6570\u636e\uff09 \u79fb\u52a8\u6216\u5220\u9664\u7cfb\u7edf Logo \uff0c\u6392\u9664\u684c\u9762\u53f3\u4e0b\u89d2 Logo \u7684\u5f71\u54cd\uff08\u91cd\u542f\u751f\u6548\uff09\u3002 sudo mv /usr/share/deepin/uos_logo.svg ~/Pictures/\n \u5b89\u88c5\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\uff08\u5fc5\u987b\u5b89\u88c5\uff01\uff01\uff09 AMD \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_amd64.deb ARM \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_arm64.deb MIPS \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_mips64.deb 3A5000 \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_5000.deb \u5b89\u88c5\u547d\u4ee4 sudo dkpg -i xserver-xorg-input-libinput_0.28.2-2_amd64.deb\n \u5b89\u88c5\u65f6\u4f1a\u63d0\u793a\u5df2\u5b58\u5728\u76f8\u540c\u7248\u672c\uff0c\u8bf7\u5ffd\u7565\uff0c\u76f4\u63a5\u8986\u76d6\u5b89\u88c5\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u4e3b\u673a\u624d\u751f\u6548"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u670d\u52a1\u7aef\u4e00\u952e\u73af\u5883\u90e8\u7f72","text":"\u73af\u5883\u642d\u5efa\u524d\u5fc5\u987b\u5148\u8fde\u63a5\u4e0a USB \u4e32\u53e3\u7ebf\u548c\u91c7\u96c6\u76d2\u3002 \u5bbf\u4e3b\u673a\u73af\u5883\u5b89\u88c5 python3 manage.py install --env host\n \u5bb9\u5668\u73af\u5883\u5b89\u88c5 python3 manage.py install --env docker\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u56db\u3001\u914d\u7f6e\u9879","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u670d\u52a1\u7aef\u914d\u7f6e","text":"setting/config/server.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u914d\u7f6e\u9879\uff0c\u5305\u542b\u4e86\u6240\u6709\u670d\u52a1\u7aef\u6240\u6709\u7684\u53ef\u914d\u7f6e\u9879\u3002 \u672c\u5730\u65e0\u7f51\u7edc\u8fd0\u884c \u5c06\u914d\u7f6e\u9879 network=0 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u672c\u5730\u6709\u7f51\u7edc\u8fd0\u884c \u914d\u7f6e\u9879 network=1 (1)\u914d\u7f6e\u9879 client_alias= \u914d\u7f6e\u4e3a\u4f60\u8981\u6d4b\u8bd5\u7684\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5982 Alias1 \u6d4b\u8bd5\u673a\u522b\u540d\u5728 setting/config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 (2)\u914d\u7f6e\u9879 client_alias= \u4e3a\u7a7a\uff0c\u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager --client_alias Alias1\uff0c\u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002(Alias1 \u4e3a\u4f60\u914d\u7f6e\u7684\u6d4b\u8bd5\u673a\u522b\u540d) (1)\u548c(2)\u53ea\u8981\u4f7f\u7528\u5176\u4e00\u5373\u53ef\u3002 \u6709\u7f51\u7edc\u8fd0\u884c\uff0c\u4e14\u9700\u8981\u901a\u8fc7 Jenkins \u4e0a\u8fd0\u884c\u4e00\u4e2a job \uff0c\u540c\u65f6\u63a7\u5236\u591a\u53f0\u673a\u5668\u3002 \u914d\u7f6e\u9879 network=1 \u914d\u7f6e\u9879 client_alias= \u4e0d\u7528\u914d\u7f6e\uff0c\u5728\u8fd0\u884c run.sh \u7684\u65f6\u5019\u76f4\u63a5\u7a7a\u683c\u52a0\u522b\u540d\u5373\u53ef\uff0c\u6bd4\u5982\uff1a\u6d4b\u8bd5\u673a\u522b\u540d\u4e3a Alias1 \uff0c\u4e14\u5df2\u7ecf\u5728 config/client.ini \u4e2d\u914d\u7f6e\u4e86 Alias1 \u7684user ip password \uff0c\u5219\u8fd0\u884c bash run.sh Alias1 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u5728 Jenkins pipeline \u91cc\u9762\u901a\u8fc7\u5e76\u884c stage \u6216\u5e76\u884c\u8c03\u7528\u4e0b\u5c42\u4efb\u52a1\u7684\u65b9\u5f0f\u53ef\u4ee5\u5b9e\u73b0\u5927\u89c4\u6a21\u7684\u6027\u80fd\u6d4b\u8bd5\u9700\u6c42\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;1\u3001KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2\u3001KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f, e.g. TAGS = L1 or smoke\n[case_conf]\n# \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\uff0cocr\u6587\u6848\u8bc6\u522b\u8f83\u6162\uff0c\u4e0d\u63a8\u8350\u4f7f\u7528\nfind_by = stage\n# \u6700\u540e\u4e00\u4e2a\u7a33\u5b9a\u9636\u6bb5\u7684\u5e27\u6570\u8bc6\u522b\n# \u9996\u5e27\u5b58\u5728\u540e\u7684\u7b2c\u4e00\u4e2a\u5927\u4e8e\u8be5\u914d\u7f6e\u5e27\u6570\u7684\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u5c3e\u5e27\nfinal_stable_num=100\n# \u4ece\u8be5\u5e27\u6570\u5f00\u59cb\u8bc6\u522b\u6587\u6848\u6216\u56fe\u7247\uff0c\u51cf\u5c11\u5206\u6790\u65f6\u95f4\nstart_num = 150\n# \u8bc6\u522b\u7684\u6587\u6848\ntext=\n# \u8bc6\u522b\u56fe\u7247\nmatch=apps/xxx/images/match.png\n# \u8bc6\u522b\u76f8\u4f3c\u5ea6\nmatch_rate=0.9\n# \u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6bd4\u5982\u70ed\u542f\u52a8\u7528\u4f8b\uff0c\u4ece\u70b9\u51fb\u6253\u5f00\u5230\u505c\u6b62\u5f55\u5c4f\uff0c\u4e2d\u95f4\u7b49\u5f855\u79d2\uff1b\nduration = 15\n# \u5355\u6761\u7528\u4f8b\u6267\u884c\u7684\u6b21\u6570\ncount = 5\n# \u7a33\u5b9a\u9636\u6bb5\u5212\u5206\u7684\u76f8\u4f3c\u5ea6\nstable_similarity = 0.9997\n[server]\n# \u8c03\u8bd5\u6a21\u5f0f=1\uff0c\u4e3a\u5f00\u542f\u8c03\u8bd5\u6a21\u5f0f\uff0c0\u4e3a\u5173\u95ed\u3002\n# \u8c03\u8bd5\u6a21\u5f0f\u4e0b\u9ed8\u8ba4\u53ea\u6267\u884c\u4e00\u6b21\u7528\u4f8b\uff0c\u4e0d\u5173\u673a\n# \u7f16\u5199\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u5efa\u8bae\u5f00\u542fmaintain\u3002\nMAINTAIN = 0\n# \u8fd0\u884c\u7684\u73af\u5883docker\u5bb9\u5668\u73af\u5883\uff0chost\u5bbf\u4e3b\u673a\u73af\u5883\nENV = docker\n# \u670d\u52a1\u7aef\u5bc6\u7801\nPASSWORD=1\n# \u6307\u5b9a\u6d4b\u8bd5\u673a\u522b\u540d\n# \u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6bd4\u5982\uff1a\n# [AMD]\n# ip=10.8.15.86\n# user=uos\n# \u5176\u4e2d AMD \u4e3a\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5219client_alias=AMD\nCLIENT_ALIAS = x86\uff08Intel-i7\uff09\n# 1 \u5f00\u542f\u7f51\u7edc, 0 \u5173\u95ed\u7f51\u7edc\n# \uff081\uff09\u670d\u52a1\u7aef\u4e0e\u6d4b\u8bd5\u673a\u987b\u5728\u540c\u4e00\u7f51\u6bb5\u4e0b\uff0c\u4f60\u53ef\u4ee5\u5c1d\u8bd5\u5728\u670d\u52a1\u7aef\u901a\u8fc7ssh\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c\u5982\u679c\u53ef\u4ee5\u8fde\u63a5\uff0c\u8bf4\u660e\u7f51\u7edc\u6b63\u5e38\u3002\n# \uff082\uff09\u5f53input_type=FILE_NAME \u65f6\uff0c\u5fc5\u987b\u5f00\u542f\u7f51\u7edc\u3002\nNETWORK = 1\n# \u6027\u80fd\u7ed3\u679c\u7edf\u8ba1\u5355\u4f4d \u6beb\u79d2\u2014ms, \u79d2\u2014s\nUNIT=ms\n# \u6d4b\u8bd5\u673a\u5f00\u673a\u8fdb\u5165\u684c\u9762\u540e\u7b49\u5f85\u65f6\u95f4,\u5355\u4f4d/\u79d2\nSTARTUP_DELAY = 60\n# 1\u4e3a\u5220\u9664\u7f13\u5b58\uff0c0\u4e3a\u4e0d\u5220\u9664\u7f13\u5b58\n# \u7528\u4f8b\u6267\u884c\u5b8c\u540e\u4f1a\u5728report\u76ee\u5f55\u4e0b\u751f\u6210\u667a\u80fd\u89e3\u6790\u7684\u4e00\u4e9b\u7f13\u5b58\u56fe\u7247\u3002\nCACHE = 0\n# \u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u62a5\u544a\u4f1a\u4fdd\u5b58\u5728\u9879\u76ee\u4e0breport\u76ee\u5f55\u4e2d\uff1b\n# \u6307\u5b9a\u62a5\u544a\u76ee\u5f55\u5219\u5b58\u653e\u5230\u6307\u5b9a\u76ee\u5f55\u3002\nREPORT_PATH = report\n# \u670d\u52a1\u7aef\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684icon\u8d44\u6e90\u4f1a\u7f13\u5b58\u5728\u9879\u76ee\u4e0binput\u76ee\u5f55\u4e2d\nINPUT = input/\n# 1\u4e3a\u6d4b\u8bd5\u5b8c\u5173\u673a\uff0c0\u4e3a\u6d4b\u8bd5\u5b8c\u4e0d\u5173\u673a\nSHUTDOWN = 0\n# \u89e3\u6790\u8fdb\u7a0b\u6570\uff08\u4e0d\u63a8\u8350\u4fee\u6539\uff09\n# 3\u4e2a\u8fdb\u7a0b\u89e3\u6790\u89c6\u9891\u5df2\u7ecf\u80fd\u591f\u6ee1\u8db3\uff0c\u5373\u4f7f\u589e\u52a0\u8fdb\u7a0b\u6570\u4e5f\u4e0d\u80fd\u51cf\u5c11\u6574\u4f53\u8017\u65f6\n# \u53e6\u5916\u8fd8\u8981\u770bCPU\u6838\u6570\u662f\u5426\u652f\u6301\u3002\nPARSING_PROCESS = 3\n# 1\u4e3a\u4f7f\u7528\u7ee7\u7535\u5668\u5f00\u5173\u673a\uff0c0\u4e3a\u4f7f\u7528reboot\u547d\u4ee4\u91cd\u542f\u3002\u4f9d\u8d56\u7ee7\u7535\u5668\u786c\u4ef6\u8bbe\u5907\uff0c\u9700\u8981\u4f7f\u7528\u8054\u7cfb\u5f00\u53d1\u8005\nRELAY = 0\n# \u83b7\u53d6\u6d4b\u8bd5\u5e94\u7528\u7684\u7248\u672c, %s \u5360\u4f4d\u5e94\u7528\u540d\n# \u5982\u679c\u8be5\u914d\u7f6e\u4e3a\u7a7a\uff0c\u5219\u4e0d\u83b7\u53d6\u5e94\u7528\u7684\u7248\u672c\u4fe1\u606f\u3002\nCOMMAND = apt policy %s 2>/dev/null|grep \"\u5df2\u5b89\u88c5\"|awk -F \"\uff1a\" \"{print \\$2}\"\n# \u5173\u673a\u7b49\u5f85\u5f00\u542f\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6839\u636e\u6d4b\u8bd5\u673a\u6027\u80fd\u4e0d\u540c\uff0c\u5f00\u5173\u673a\u8017\u65f6\u53ef\u80fd\u4e0d\u540c\uff0c\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u673a\u60c5\u51b5\u914d\u7f6e\u3002\nSHUTDOWN_DELAY = 30\n# \u53ef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u56fe\u7247\u683c\u5f0f\uff0c\u4ee5\u82f1\u6587\u9017\u53f7\u9694\u5f00\u3002\n# \u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u76ee\u524d\u6211\u4eec\u4ec5\u9a8c\u8bc1\u4e86jpg,jpeg,png\u8fd9\u4e09\u79cd\u5e38\u7528\u7684\u56fe\u7247\u683c\u5f0f\u3002\nINPUT_TYPES = jpg,jpeg,png\n# \u6027\u80fd\u5206\u6790\u8865\u5e27\uff0c\u7b49\u4e8e\u6216\u4f4e\u4e8e\u8be5\u503c\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u9700\u8981\u51cf\u6389\u3002\nUN_STAB_START = 3\n# \u670d\u52a1\u7aef\u83b7\u53d6\u6d4b\u8bd5\u673a\u56fe\u50cf\u7684\u5e27\u7387\uff0c\u5373\u6bcf\u79d2\u83b7\u53d6\u591a\u5c11\u5f20\u6d4b\u8bd5\u673a\u4e0a\u7684\u56fe\u50cf\u3002\n# \u9ed8\u8ba4\u5e27\u7387\u4e3a30\u5e27/\u79d2\uff0c\u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u53ef\u80fd\u4f1a\u5bf9\u89e3\u6790\u7ed3\u679c\u9020\u6210\u504f\u5dee\u3002\nFPS = 30\n# \u4ee5\u4e0b\u573a\u666f\u7c7b\u578b\u4f1a\u91cd\u542f\u6d4b\u8bd5\u673a,\u591a\u79cd\u573a\u666f\u4f7f\u7528\u9017\u53f7\u9694\u5f00\nSCENE = cold\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = http://10.8.13.78:8890\n#\u5c4f\u5e55\u56fe\u7247\u4e34\u65f6\u5b58\u653e\u4f4d\u7f6e\nSCREEN_CACHE = /tmp/screen\n# =======================================\n[log]\n# \u65e5\u5fd7\u7ea7\u522b\uff0cOFF\u3001FATAL\u3001ERROR\u3001WARN\u3001INFO\u3001DEBUG\u3001ALL\n# \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u65e5\u5fd7\u8f93\u51fa\uff0clog_cli=INFO\u8868\u793a \u4ec5\u8f93\u51faINFO\u53ca\u4ee5\u4e0a\u7ea7\u522b\u7684\u65e5\u5fd7\u3002\nLOG_LEVEL = DEBUG\n# \u65e5\u5fd7\u6587\u4ef6\u4fdd\u5b58\u8def\u5f84\nLOG_PATH= logs\n# =======================================\n[dockerhub]\n# \u5bb9\u5668\u767b\u9646\u8d26\u53f7\nDOCKER_USER = user\n# \u5bb9\u5668\u767b\u9646\u5bc6\u7801\nDOCKER_PASSWORD = User1234\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u6d4b\u8bd5\u673a\u914d\u7f6e","text":"setting/config/client.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u4fe1\u606f\u3002 \u6709\u7f51\u7edc\u7684\u60c5\u51b5\u4e0b\uff0c\u670d\u52a1\u7aef\u9700\u8981\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u56e0\u6b64\u4f60\u9700\u8981\u5199\u5165 \u6d4b\u8bd5\u673a\u522b\u540d \u3001 user \u3001ip\u3001 password \u3002 # \u6d4b\u8bd5\u673a\u522b\u540d\n[Alias1] # \u6d4b\u8bd5\u673aip\nip=10.8.15.86 # \u6d4b\u8bd5\u673a\u7528\u6237\u540d\nuser=uos\n \u547d\u540d\u5efa\u8bae\uff1aAliasA1\u3001AliasA2\u3001AliasB1\u3001AliasB2\uff0c\u4e0d\u8981\u91cd\u540d\u3002 \u65e0\u7f51\u7edc\u60c5\u51b5\u4e0b\uff0c\u4ec5\u9700\u8981\u5173\u6ce8\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\u9879 width=\u3001 height= \u5373\u53ef\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a [client]\n# \u9ed8\u8ba4\u6d4b\u8bd5\u673a\u7528\u6237\u540d\uff0c\u5bc6\u7801\uff0cip\nip=\nuser=\n# \u6d4b\u8bd5\u673a\u5bc6\u7801\npassword=1\n# \u6d4b\u8bd5\u673a\u4e3b\u9898\ntheme=bloom\n# \u6d4b\u8bd5\u673aicon\u76ee\u5f55\npath=/usr/share/icons\n# \u7cfb\u7edfdesktop\u6587\u4ef6\u7684\u5b58\u653e\u76ee\u5f55\uff0cUOS\u7cfb\u7edf\u9ed8\u8ba4\u4e3a/usr/share/applications\ndesktop_path=/usr/share/applications\n# \u7528\u4e8e\u5224\u65ad\u6d4b\u8bd5\u673a\u662f\u5426\u5f00\u673a\u8fdb\u5165\u684c\u9762\u7684\u8bc6\u522b\u6807\u8bc6\u3002\n# 1\u3001\u901a\u8fc7\u684c\u9762\u56fe\u6807\u8bc6\u522b\u3002\n# - type=FILE_NAME\u65f6\uff0c\u670d\u52a1\u5668\u548c\u6d4b\u8bd5\u673a\u5fc5\u987b\u5728\u540c\u4e00\u5c40\u57df\u7f51\u5185\u3002\n# - power_on=dde-computer\u8868\u793a\u901a\u8fc7\u684c\u9762\u8ba1\u7b97\u673a\u56fe\u6807\u5224\u65ad\u5f00\u673a\u8fdb\u5165\u684c\u9762\u3002\n# 2\u3001\u901a\u8fc7\u672c\u5730\u56fe\u7247\u4f5c\u4e3a\u5f00\u673a\u8bc6\u522b\u3002\n# - type= \u4f20\u5165\u4e3a\u56fe\u7247\u683c\u5f0f\uff0ctype\u652f\u6301\u7684\u7c7b\u578b\u5305\u542b\u5728server.ini\u5185\u914d\u7f6e\u9879input_type=jpg,jpeg,png\u3002\n# - power_on= \u4f20\u5165\u7684\u662f\u672c\u5730\u56fe\u7247\u7684\u8def\u5f84\u3002\ntype=FILE_NAME\npower_on=dde-computer\n# \u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\uff08\u6d4b\u8bd5\u673a\u8fde\u63a5\u91c7\u96c6\u76d2\uff0c\u91c7\u96c6\u76d2\u7684\u5206\u8fa8\u7387\uff09\nheight=1080\nwidth=1920\n[AliasA1] ip=10.8.15.86\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n[AliasA2]\nip=10.8.15.20\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_2","title":"3\u3001\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e","text":"\u968f\u7740\u6d4b\u8bd5\u573a\u666f\u7684\u4e0d\u65ad\u5f15\u5165\uff0c\u53d1\u73b0\u73b0\u6709\u670d\u52a1\u7aef\u91cc\u7684\u914d\u7f6e\u9879\u5e76\u4e0d\u9002\u7528\u4e8e\u6240\u6709\u7684\u6027\u80fd\u573a\u666f\uff0c\u4e8e\u662f\u5c06\u670d\u52a1\u7aef\u914d\u7f6e\u8fdb\u884c\u4e00\u4e2a\u63d0\u53d6\uff0c\u53ef\u505a\u5355\u4e2a\u573a\u666f\u7684\u4e2a\u6027\u5316\u914d\u7f6e\uff0c\u5f53\u7136\u539f\u6765\u7684\u670d\u52a1\u7aef\u914d\u7f6e\u529f\u80fd\u4fdd\u7559\uff0c\u53ea\u662f\u5f53\u4f60\u914d\u7f6e\u4e86\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e\u540e\uff0c\u4f18\u5148\u4f7f\u7528\u4e2a\u6027\u5316\u914d\u7f6e\u91cc\u9762\u7684\u5185\u5bb9\uff0c\u4ee5\u4e0b\u662f\u5bf9\u4e2a\u6027\u5316\u914d\u7f6e\u7684\u4ecb\u7ecd\u3002 \u76ee\u524d\u6bcf\u4e00\u4e2a py \u6587\u4ef6\u5bf9\u5e94\u4e00\u4e2a\u6027\u80fd\u6d4b\u8bd5\u573a\u666f\uff0c\u4e8e\u662f\u5728\u540c\u7ea7\u76ee\u5f55\u4e0b\u521b\u5efa\u4e00\u4e2a\u4e0e\u4e4b\u540c\u540d\u7684 json \u6587\u4ef6\uff0c\u4f5c\u4e3a\u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6 apps\n\u251c\u2500\u2500 album\n \u251c\u2500\u2500 test_album_01_start.json # \u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6\n\u2514\u2500\u2500 test_album_01_start.py # \u6027\u80fd\u573a\u666f\u6587\u4ef6\n \u4ee5\u4e0b\u662f\u5bf9 json \u6587\u4ef6\u4e2d\u914d\u7f6e\u7684\u89e3\u91ca\uff0c\u82e5\u67d0\u9879\u914d\u7f6e\u4e0d\u9700\u8981\uff0c\u53ef\u4ee5\u7f3a\u5931\uff0c\u4f46\u4e0d\u80fd\u4e3a\u7a7a\uff1b {\n\"title\": \"test_album_start\", # \u6807\u9898\uff1b\u5fc5\u987b\n\"app_name\": \"deepin-album\", # \u573a\u666f\u6240\u5c5e\u7684\u5e94\u7528\uff1b\u5fc5\u987b\n\"scene\": \"hot\", # \u573a\u666f\u522b\u540d\uff1b\u5fc5\u987b\n\"icon\": [\"deepin-album\"], # \u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684icon\u5230\u670d\u52a1\u7aef\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\uff1b\u53ef\u7f3a\u5931\n# \u6ce8\u610f\uff1a\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684desktop\u6587\u4ef6\u540d\u4e3adeepin-album.desktop\uff0c\n# \u53ea\u9700\u8981\u5199deepin-album\u5373\u53ef\uff0c\u201c.desktop\u201d\u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002\n\"size\": { # \u56fe\u7247\u5bf9\u6bd4\u7684\u533a\u57df\u8bbe\u7f6e\u9879\uff0c\u67d0\u4e9b\u5e94\u7528\u5f53\u524d\u5c4f\u5e55\u7684\u90e8\u5206\u533a\u57df\u9700\u8981\u5c06\u5176\u53bb\u6389\uff0c\u53ef\u4ee5\u8bbe\u7f6e\u6b64\u9879\uff0c\u5982\u679c\u6ca1\u6709\u5219\u53ef\u4e0d\u5199\uff1b\u53ef\u786e\u5b9e\n\"x-coordinate\": 0, # \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n\"y-coordinate\": 0, # \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n\"width\": 850, # \u6a2a\u5411\u957f\u5ea6\n\"height\": 1920 # \u7eb5\u5411\u9ad8\u5ea6\n},\n\"count\": 5, # \u573a\u666f\u6267\u884c\u7684\u6b21\u6570\uff1b\u5fc5\u987b\n\"duration\": 5, # \u8be5\u6761\u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff0c\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7279\u5b9a\u573a\u666f\uff0c\u8be5\u914d\u7f6e\u4e3a\u53ef\u9009\u9879\uff0c\u8986\u76d6 server.ini \u4e2d\u7684\u914d\u7f6e\uff1b\u53ef\u7f3a\u5931\n\"stable_similarity\": 0.9997, # \u6027\u80fd\u573a\u666f\u5206\u9636\u6bb5\u65f6\u7684\u56fe\u7247\u76f8\u4f3c\u5ea6\u5bf9\u6bd4\uff0c\u524d\u540e\u56fe\u7247\u4f4e\u4e8e\u8be5\u503c\uff0c\u5219\u5206\u4e3a\u4e0d\u7a33\u5b9a\u9636\u6bb5\uff1b\u53ef\u7f3a\u5931\n\"find_by\": \"stage\", # \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\n\"final_stable_num\": 100, # \u67e5\u627e\u6700\u540e\u4e00\u4e2a\u5927\u4e8e\u8be5\u503c\u7684\u7a33\u5b9a\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u7684\u5c3e\u796f\uff1b\u53ef\u7f3a\u5931\n\"start_num\": 150,\n\"text\": \"\", # ocr\u8bc6\u522b\u7684\u6587\u6848\n\"match\": \"apps/xxx/images/match.png\", # \u56fe\u50cf\u5339\u914d\u7684\u56fe\u7247\u6587\u4ef6\u8def\u5f84\n\"match_rate\": 0.9 # \u5339\u914d\u76f8\u4f3c\u5ea6\n}\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e94\u3001\u6d4b\u8bd5\u6d41\u7a0b","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516d\u3001\u7528\u4f8b\u7f16\u5199\u53ca\u65b9\u6cd5\u53c2\u6570\u6307\u5f15","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"1\u3001\u7528\u4f8b\u5b9e\u4f8b\u8bf4\u660e","text":"# \u6807\u51c6\u5e93\u5bfc\u5165\nfrom time import sleep\n# \u5bfc\u5165\u4e09\u65b9\u5e93pytest\nimport pytest\n# \u5bfc\u5165\u7528\u4f8b\u6267\u884c\u8981\u7528\u5230\u7684Widget\u7c7b\nfrom src.base_widget import BaseWidget\nclass TestStart:\n# class\u7ea7\u522b\u7684fixture\uff0c\u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u6267\u884c\u3002autouse=True \u81ea\u52a8\u5728\u5f53\u524d\u4f5c\u7528\u57df\u4e0b\u4f7f\u7528\u3002\n@pytest.fixture(scope=\"class\", autouse=True)\n# \u6d4b\u8bd5\u70ed\u542f\u52a8\u4e4b\u524d\u9700\u8981\u9884\u542f\u52a8\u3002\ndef application_pre_start(self):\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().right_click_element(\"deepin-album\")\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().click_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\")\nsleep(2)\n# \u5feb\u6377\u952e\u5173\u95ed\u7a97\u53e3\nBaseWidget().hot_key(\"alt\", \"f4\")\nsleep(2)\n# \u9ed8\u8ba4\u4e3afunction\u7ea7\u522b\u7684fixture\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\uff0cclass\u7ea7\u522bfixture\u6267\u884c\u4e4b\u540e\u6267\u884c\u3002\n@pytest.fixture(autouse=True)\ndef setup_start(self):\n# \u53f3\u952e\u70b9\u51fb deepin-album \u56fe\u6807\nBaseWidget().right_click_element(\"deepin-album\")\n# \u79fb\u52a8\u5230\u53f3\u952e\u83dc\u5355\u4e2d\u6253\u5f00\uff08open.png\uff09\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().move_to(*BaseWidget().find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))\n# \u7b49\u5f85\u79fb\u52a8\u5b8c\u6210\nsleep(0.5)\ndef test_album_start(self):\n# \u70b9\u51fb\u201c\u6253\u5f00\u201d\nBaseWidget().click() \n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"2\u3001\u65b9\u6cd5\u53c2\u6570\u8bf4\u660e","text":"2.1\u3001find_element \u65b9\u6cd5 def find_element(element: str, input_type: str = \"FILE_NAME\", fill_color_position: tuple = (-1, -1), size: tuple = (25, 70)):\npass\n \u53c2\u6570 element \u548c input_type \uff081\uff09\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u5143\u7d20 - `input_type` \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a `FIEL_NAME` \uff0c\u8868\u793a\u901a\u8fc7\u5e94\u7528 `icon` \u5bfb\u627e\u5143\u7d20\uff0c\u6b64\u65b9\u6cd5\u4f1a\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u5e94\u7528 `icon` \u56fe\u6807\u3002\n \u4e3e\u4f8b\uff1a\u9ed8\u8ba4\u60c5\u51b5\u4e0b input_type \u53c2\u6570\u4e0d\u9700\u8981\u4f20\u5165\uff0c find_element(\"deepin-album\")\uff0c\u8868\u793a\u901a\u8fc7 deepin-album \u7684\u5e94\u7528 icon \u6765\u83b7\u53d6\u5750\u6807\uff0c\u6ce8\u610f\uff0c\u6b64\u65f6\u4f20\u5165\u7684 deepin-album \u53c2\u6570\u5b9e\u9645\u662f desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u548c2.3\u4e2d\u7684 icon \u53d8\u91cf\u4e00\u81f4\u3002 \u6211\u4eec\u5efa\u8bae\u4f18\u5148\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\uff0c\u4f46\u6b64\u65b9\u6cd5\u4f9d\u8d56\u7f51\u7edc\uff0c\u8bf7\u6839\u636e\u6d4b\u8bd5\u73af\u5883\u5b9e\u9645\u60c5\u51b5\u9009\u62e9\u3002 \uff082\uff09\u901a\u8fc7\u672c\u5730\u56fe\u7247\u8bc6\u522b\u5143\u7d20 - \u53c2\u6570 `input_type` \u4f20\u5165\u56fe\u7247\u683c\u5f0f\uff0c\u6bd4\u5982\u622a\u53d6\u7684\u672c\u5730\u56fe\u7247\u683c\u5f0f\u4e3a `png`\uff0c\u90a3\u4e48 `input_type=\"png\"`\uff0c\u6b64\u65f6\u53c2\u6570 `element ` \u4f20\u5165\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5efa\u8bae\u5b58\u653e\u5728\u5bf9\u5e94\u7684\u4ea7\u54c1 `apps/app/picture/` \u76ee\u5f55\u4e0b\uff0c\u8def\u5f84\u4e3a\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u7684\u76f8\u5bf9\u8def\u5f84\u3002\n- \u4e3e\u4f8b\uff1a`find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))`\uff0c\u8868\u793a\u901a\u8fc7\u672c\u5730\u56fe\u7247 `open.png` \u8bc6\u522b\u5143\u7d20\u3002\n \u53c2\u6570 fill_color_position fill_color_position \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (-1, -1)\uff0c(-1, -1) \u8868\u793a\u53d6\u5c4f\u5e55\u4e2d\u53f3\u4e0b\u89d2\u6700\u540e\u4e00\u4e2a\u50cf\u7d20\u70b9\u4f5c\u4e3a\u586b\u5145\u5750\u6807\uff0c\u5728 1920x1080 \u5c4f\u5e55\u5206\u8fa8\u7387\u4e0b\u5373\u5b9e\u9645\u5750\u6807\u4e3a (1919, 1079) \uff0c\u8fd9\u6837\u7684\u5199\u6cd5\u53ef\u4ee5\u9002\u914d\u4e0d\u540c\u5927\u5c0f\u7684\u5c4f\u5e55\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0d\u540c\u65b9\u4f4d\uff1a \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0b\u65b9\uff0c\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u4e0d\u9700\u8981\u4f20\u5165\u8be5\u53c2\u6570\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u5de6\u8fb9\uff0cfill_color_position=(1, 1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u53f3\u8fb9\uff0cfill_color_position=(-1, -1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0a\u8fb9\uff0cfill_color_position=(1, 1) \u4ece\u684c\u9762\u542f\u52a8\u5e94\u7528\uff0c\u5219\u9700\u8981\u4f20\u5165\u9664\u4efb\u52a1\u680f\u4ee5\u5916\u5176\u4ed6\u4f4d\u7f6e\u7684\u5750\u6807\uff0c\u6bd4\u5982(100, 100)\uff0c\u53ea\u8981\u8fd9\u4e2a\u5750\u6807\u4e3a\u9664\u5e94\u7528\u548c\u4efb\u52a1\u680f\u533a\u57df\u90fd\u53ef\u4ee5\u3002 \u4ece\u542f\u52a8\u5668\u91cc\u9762\u542f\u52a8\u5e94\u7528\uff0c\u9700\u8981\u586b\u5145\u7684\u5750\u6807\u4e3a\u542f\u52a8\u5668\u533a\u57df\u3002 \u6ce8\uff1a\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u65f6\uff0c\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684 icon \u539f\u6587\u4ef6\u4e3a svg \u77e2\u91cf\u56fe\uff0c\u8f6c\u6362\u4e3a png \u4e4b\u540e\u9700\u8981\u586b\u5145\u8fb9\u7f18\u900f\u660e\u90e8\u5206\u3002 \u53c2\u6570 size size \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (25, 70)\uff0c\u8868\u793a\u6d4b\u8bd5\u673a\u4e0a dock \u680f\u4e0a\u5e94\u7528\u56fe\u6807\u7684\u5927\u5c0f\u8303\u56f4\u3002 UOS \u7cfb\u7edf dock \u680f\u662f\u53ef\u4ee5\u4e0a\u4e0b\u62d6\u52a8\u5927\u5c0f\u7684\uff0c\u968f\u7740 dock \u680f\u5927\u5c0f\u6539\u53d8\uff0c\u5e94\u7528\u56fe\u6807\u7684\u8303\u56f4\u4e3a25\u523070\u4e4b\u95f4\u3002 \u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u64cd\u4f5c\u7cfb\u7edf\u4e0a dock \u680f\u5927\u5c0f\u4e0d\u4e00\u6837\uff0c\u53ef\u4ee5\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u4f20\u5165\u5927\u5c0f\u8303\u56f4\u3002 2.2\u3001click_element\u3001 right_click_element\uff0c double_click_element \u8fd9\u51e0\u4e2a\u65b9\u6cd5\u53c2\u6570\u89c4\u5219\u4e0e find_element \u65b9\u6cd5\u4e00\u6837\u3002\u4ed6\u4eec\u5b9e\u9645\u4e0a\u662f\u5728 find_element \u65b9\u6cd5\u57fa\u7840\u4e4b\u4e0a\u505a\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u589e\u52a0\u4e86\u9f20\u6807\u7684\u52a8\u4f5c\uff0c\u5982\u679c\u4f60\u4e0d\u60f3\u4f7f\u7528\u8fd9\u51e0\u4e2a\u65b9\u6cd5\uff0c\u5728\u7528\u4f8b\u4e2d\u4e5f\u53ef\u4ee5\u901a\u8fc7 find_element \u83b7\u53d6\u5230\u5750\u6807\uff0c\u7136\u540e\u5c06\u5750\u6807\u4f20\u5165\u5230\u952e\u9f20\u7684\u65b9\u6cd5\u4e2d\uff0c\u53ef\u4ee5\u5b9e\u73b0\u540c\u6837\u7684\u6548\u679c\u3002 2.3\u3001\u7528\u4f8b\u7c7b\u4e2d\u6709\u4e2a\u7c7b\u53d8\u91cf icon = [\"deepin-album\"] \u9700\u8981\u7279\u6b8a\u8bf4\u660e\uff0c\u5217\u8868\u4e2d\u7684\u5143\u7d20\u4e3a\u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709 icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684 icon \u5230\u670d\u52a1\u7aef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528 desktop \u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684 desktop \u6587\u4ef6\u540d\u4e3a deepin-album.desktop\uff0c\u53ea\u9700\u8981\u5199 deepin-album \u5373\u53ef\uff0c.desktop \u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e03\u3001\u6267\u884c\u5165\u53e3","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"1\u3001\u7528\u4f8b\u7ec4\u7ec7","text":"\u5728 setting/config/server.ini \u6587\u4ef6\u4e2d APP_NAME= \u5b57\u6bb5\u4e3a\u7528\u4f8b\u7684\u6267\u884c\u7684\u76ee\u5f55\uff0c\u9ed8\u8ba4\u4e3a apps \u76ee\u5f55\u4e0b\u6240\u6709\u7528\u4f8b\u3002\u5982\u679c\u4f60\u60f3\u6307\u5b9a\u6267\u884c\u67d0\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4f60\u53ef\u4ee5\u5c06\u8be5\u914d\u7f6e\u9879\u6307\u5b9a\u5230\u5e94\u7528\u7684\u7528\u4f8b\u76ee\u5f55\uff0c\u6bd4\u5982\uff1aAPP_NAME=deepin_album\uff0c \u8868\u793a\u6267\u884c\u76f8\u518c\u76ee\u5f55\u4e0b\u7684\u7528\u4f8b\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a python3 manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music\n -k KEYWORDS, --keywords KEYWORDS\n \u7528\u4f8b\u7684\u5173\u952e\u8bcd\n -t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e\n --log_level LOG_LEVEL \u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n --env {host,docker} \u5728\u5bbf\u4e3b\u673a\u6216\u5bb9\u5668\u73af\u5883\u6267\u884c\n --client_alias \u9009\u62e9\u6d4b\u8bd5\u673a\u522b\u540d, \u53ef\u9009\u9879\u4e3aclient.ini\u4e2d\u5df2\u914d\u7f6e, \u9ed8\u8ba4\u503c\u4e3a zx-x86.\n --count \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a python3 manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\" --env docker\n \u6ce8\uff1a\u5728\u5bb9\u5668\u4e2d\u6267\u884c\u65f6\uff0c\u82e5\u5f3a\u5236\u9000\u51fa\uff0c\u5bb9\u5668\u5e76\u4e0d\u4f1a\u505c\u6b62\u8fd0\u884c\uff01"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_9","title":"\u516b\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1json","title":"1\u3001Json \u62a5\u544a","text":"\u81ea\u7814\u89c6\u9891\u89e3\u6790\u5de5\u5177\u4f1a\u5bf9\u5355\u6761\u7528\u4f8b\u6267\u884c\u4e00\u8f6e\u751f\u6210\u4e00\u4e2a json \u6587\u4ef6\uff0c\u5b58\u653e\u4e8e report/{app_name}/{scene}/{run_num} \u76ee\u5f55\u4e0b\uff0c\u547d\u540d\u683c\u5f0f\u4e3a\uff1a report.json json \u5185\u5bb9\u4e3e\u4f8b\uff1a [\n{\n\"Stab1\": {\n\"images\": [1,2...150,151],\n\"startStub\": 0,\n\"type\": \"Stab\"\n}\n},\n{\n\"Stab2\": {\n\"images\": [152,153...169,170],\n\"startStub\": 1,\n\"type\": \"UnStab\"\n}\n},\n{\n\"Stab3\": {\n\"images\": [171,172...300,301],\n\"startStub\": 0,\n\"type\": \"UnStab\"\n}\n}\n]\n \u8bf4\u660e\uff1a Stab \uff1a\u8868\u793a\u89e3\u6790\u8fc7\u7a0b\u4e2d\u4e0d\u540c\u7684\u9636\u6bb5\u3002 images \uff1a\u8868\u793a\u6bcf\u4e00\u5e27\u7684\u56fe\u7247\u5e8f\u53f7\u3002 startStub\uff1a \u4e3a\u8bc6\u522b\u5c3e\u5e27\u7684\u9636\u6bb5\u8868\u793a\uff0c\u5982\u679c \"startStub\": 1 \uff0c\u8bf4\u660e\u5c3e\u5e27\u51fa\u73b0\u5728\u8be5\u9636\u6bb5\u3002 type\uff1a \u4e3a Stab \u6216 UnStab \uff0c\u8868\u793a\u7a33\u5b9a\u9636\u6bb5\u6216\u4e0d\u7a33\u5b9a\u9636\u6bb5\u3002 \u5404\u9636\u6bb5\u6709\u5e27\u6570\u8865\u507f\uff0c\u9ed8\u8ba4\u8865\u507f\u7684\u5e27\u6570\u4e3a 3 \u5e27\uff08\u53ef\u4ee5\u901a\u8fc7 server.ini \u91cc\u9762 un_stab_start=3 \u8fdb\u884c\u914d\u7f6e\uff09\uff0c\u8868\u793a\u5c0f\u4e8e\u7b49\u4e8e 3 \u5e27\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u524d\u540e\u5747\u9700\u8981\u51cf\u6389\u3002 \u5e94\u7528\u542f\u52a8\u9636\u6bb5\u5c31\u662f\u5728 Stab2 \u9636\u6bb5\uff0c\u542f\u52a8\u65f6\u95f4\u4e3a\uff1a171 \u51cf 151 \u518d\u51cf\u6389\u524d\u540e\u8865\u507f\u5e27\u6570 6 \u5e27\uff0c\u5373 14 \u5e27\uff0c\u89c6\u9891\u5e27\u7387 30 \u5e27/\u79d2\uff0c\u56e0\u6b64\u542f\u52a8\u8017\u65f6\u4e3a\uff1a14 * 33 = 462 ms"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2excel","title":"2\u3001Excel \u62a5\u544a","text":"\u6240\u6709\u7528\u4f8b\u6267\u884c\u5e76\u89e3\u6790\u5b8c\u4e4b\u540e\u4f1a report \u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a\u6c47\u603b\u6570\u636e\u7684 Excel \u6587\u4ef6\uff0c\u6587\u4ef6\u540d\u4e3a\uff1a{time}_perf_time.xlsx\u3002 \u6ce8\u610f\uff0creport \u76ee\u5f55\u4e3a\u53ef\u914d\u7f6e\u9879\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u4f1a\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u751f\u6210\uff0c\u5982\u679c\u4f60\u5c06 report\uff0c\u6307\u5b9a\u5230\u9879\u76ee\u4e0b\u5176\u4ed6\u8def\u5f84\uff0c\u5219\u4f1a\u5728\u5bf9\u5e94\u7684\u8def\u5f84\u4e0b\u751f\u6210 json \u548c Excel \u6587\u4ef6\u3002 \u4f60\u4e5f\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8bfb\u53d6\u6240\u6709 json / excel \u62a5\u544a\u7684\u6570\u636e\uff0c\u751f\u6210\u4f60\u81ea\u5df1\u60f3\u8981\u7684\u4e00\u4e9b\u6d4b\u8bd5\u62a5\u544a\u5f62\u5f0f\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#usb","title":"\u4e5d\u3001USB \u4e32\u53e3\u9a71\u52a8\u952e\u9f20\u65b9\u6cd5","text":"\u4f4d\u4e8e src/utils/control/serial_communication \u76ee\u5f55\u4e0b\u7684 usb_mk.py \u6587\u4ef6 usb_mk = UsbMk()\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up()\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u652f\u6301\u4f20\u5165\u6c49\u5b57\uff0c\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click()\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() \n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() \n \uff084\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() \n \uff085\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() \n \uff086\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() \n \uff087\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff088\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff0810\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_10","title":"\u5341\u3001\u7ee7\u7535\u5668\u63a7\u5236\u4e3b\u673a\u5f00\u673a/\u91cd\u542f","text":"\uff08\u82e5\u4e0d\u4f7f\u7528\u7ee7\u7535\u5668\uff0c\u53ef\u5ffd\u7565\u8be5\u6b65\u9aa4\uff0c\u6267\u884c\u65f6\u4f1a\u901a\u8fc7\u547d\u4ee4 reboot\uff09"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u7ee7\u7535\u5668\u8bbe\u5907","text":"LCUS-2 \u578b \u53cc\u8def USB \u667a\u80fd\u4e32\u53e3\u63a7\u5236\u7ee7\u7535\u5668\u3002 https://item.taobao.com/item.htm?spm=a1z09.2.0.0.41d72e8dUYx2pi&id=582653718178&_u=i25r20ia6a2e "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2usb","title":"2\u3001USB \u5ef6\u957f\u7ebf","text":"\u666e\u901a\u7684 USB \u7ebf\u5373\u53ef\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_3","title":"3\u3001\u675c\u90a6\u7ebf","text":"3.1\u300140P \u6bcd\u5bf9\u516c\u675c\u90a6\u7ebf\u3002 3.2\u3001\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"4\u3001\u5b89\u88c5\u56fe\u6587\u6559\u7a0b","text":"4.1\u3001\u4f7f\u7528 USB \u5ef6\u957f\u7ebf\u8fde\u63a5\u63a7\u5236\u7aef\u548c\u7ee7\u7535\u5668\u3002 4.2\u3001\u5728\u7ee7\u7535\u5668\u5e38\u7aef\u548c\u516c\u5171\u7aef\u5747\u8fde\u63a5\u4e00\u6839\u675c\u90a6\u7ebf\u3002 4.3\u3001\u5728\u4e3b\u677f\u4e0a\u5f00\u673a\u9488\u548c\u91cd\u542f\u9488\u4e0a\u63d2\u4e0a\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 4.4\u3001\u5c06\u5f00\u673a\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76841\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1\u5de6\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 4.5\u3001\u5c06\u91cd\u542f\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76842\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1 \u53f3\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 \u82e5\u60f3\u4fdd\u7559\u539f\u7535\u6e90\u5f00\u5173\u7684\u7535\u6e90\u706f\uff0c\u53ef\u6839\u636e\u5982\u4e0a\u56fe\u6240\u793a\uff0c\u4f7f\u7528\u675c\u90a6\u7ebf\u8fde\u63a5\u4e3b\u677f\u4e0a\u7684\u7535\u6e90\u706f\u548c\u539f\u7535\u6e90\u5f00\u5173"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_11","title":"\u5341\u4e00\u3001\u5e38\u89c1\u95ee\u9898\u8bf4\u660e","text":"1\u3001ERROR: for uos Cannot restart container 2301b1a1395d7959ee6523d61b61c87084649af530786cdb8fb5b3ecbcbd1068: linux runtime spec devices: error gathering device information while adding custom device \"/dev/ttyACM0\": no such file or directory \u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u8fde\u63a5\u72b6\u6001\uff0c\u67e5\u770b /dev/ttyACM0 \u662f\u5426\u5b58\u5728\uff0c\u82e5\u5b58\u5728 /dev/ttyACMn\uff08n\u4e3a\u4efb\u610f\u6570\u5b57\uff09\uff0c\u91cd\u542f\u7535\u8111\u89e3\u51b3\u3002 2\u3001Error response from daemon: Container 5e700fdc769e8c74666d68a7f2bc3de58268b4594cf88706609d59f8dbc7362d is not running \u5bb9\u5668\u542f\u52a8\u5931\u8d25 1\uff09\u68c0\u67e5\u54ea\u4e00\u4e2a\u5bb9\u5668\u672a\u542f\u52a8 sudo docker container ls # \u5217\u51fa\u8fd0\u884c\u4e2d\u7684 Docker \u5bb9\u5668\n 2\uff09\u7f3a\u5c11 uos \u5bb9\u5668\uff0c\u68c0\u67e5 USB \u4e32\u53e3\u8fde\u63a5\u7ebf\u548c\u91c7\u96c6\u76d2\u8fde\u63a5\u7ebf\u662f\u5426\u6b63\u5e38\uff0c\u91cd\u542f\u540e\u6267\u884c bash install/setup.up # \u91cd\u65b0\u5b8c\u6574\u90e8\u7f72\u73af\u5883\n \u6216\u6267\u884c sudo docker-compose up -d --build # \u4ec5\u91cd\u65b0\u6784\u5efa Docker \u955c\u50cf\n 3\u3001\u82e5\u90e8\u7f72\u65f6\u63d0\u793a\u6302\u8f7d ttyACM0\u3001video0 \u5931\u8d25\uff0c\u8bf7\u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u53ca\u91c7\u96c6\u76d2\u662f\u5426\u63a5\u89e6\u826f\u597d\uff0c\u82e5\u63a5\u89e6\u826f\u597d\uff0c\u91cd\u542f\u5373\u53ef\u89e3\u51b3\u3002 4\u3001\u82e5\u51fa\u73b0\u56fe\u7247\u80fd\u8bc6\u522b\uff0c\u4f46\u662f\u9f20\u6807\u672a\u79fb\u52a8\u64cd\u4f5c\u65f6\uff0c\u5b89\u88c5\u7edd\u5bf9\u9f20\u6807\u64cd\u4f5c\u7684\u4f9d\u8d56\u5305\uff0c\u89c1\u7b2c\u4e09\u8282\u7b2c\u4e8c\u5c0f\u8282\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u6d4b\u8bd5\u673a\u3002 5\u3001\u7531\u4e8e\u901a\u8fc7\u91c7\u96c6\u5361\u83b7\u53d6\u7684\u6d4b\u8bd5\u673a\u5b9e\u65f6\u753b\u9762\uff0c\u5305\u542b\u4e86\u9f20\u6807\u7684\u6837\u5f0f\uff0c\u6240\u4ee5\u5bf9\u56fe\u7247\u8bc6\u522b\u65f6\uff0c\u9f20\u6807\u82e5\u505c\u7559\u5728\u56fe\u6807\u4e0a\u5c42\uff0c\u5219\u4f1a\u5bf9\u8bc6\u522b\u7ed3\u679c\u9020\u6210\u5f71\u54cd\uff0c\u9700\u8981\u5c06\u9f20\u6807\u79fb\u52a8\u81f3\u5176\u4ed6\u4f4d\u7f6e\uff0c\u6216\u8005\u9690\u85cf\u9f20\u6807\u89e3\u51b3\u3002 6\u3001Excel \u62a5\u544a\u4e2d\uff0c\u6d4b\u8bd5\u573a\u666f\u5217\u4e0e\u7528\u4f8b\u4e2d\u7684\u4e0d\u4e00\u81f4\uff0c\u5173\u952e\u5b57scene\u3001app_name\u3001\u67b6\u6784\u522b\u540d\uff0c\u4e0d\u80fd\u5305\u542b\u4e0b\u5212\u7ebf\u548c\u82f1\u6587\u7b26\u53f7\u7684\u5706\u62ec\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/","title":"\u6846\u67b6\u529f\u80fd\u4ecb\u7ecd","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2023/1/12\n# Author : Mikigo\n# =============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_2","title":"\u4e00\u3001\u4e00\u53e5\u8bdd\u7b80\u4ecb","text":"\u6b64\u6587\u6863\u4e3b\u8981\u60f3\u5bf9 YouQu \u6846\u67b6\u4e00\u4e9b\u91cd\u70b9\u7684\u529f\u80fd\u505a\u8be6\u7ec6\u7684\u4ecb\u7ecd\uff0c\u5305\u62ec\u5bf9\u4e00\u4e9b\u529f\u80fd\u5f00\u53d1\u7684\u80cc\u666f\u3001\u8981\u89e3\u51b3\u7684\u95ee\u9898\u3001\u5b9e\u73b0\u903b\u8f91\u3001\u4ee3\u7801\u7b49\u65b9\u9762\u7684\u4ecb\u7ecd\uff0c\u4ee5\u6b64\u8ba9\u5927\u5bb6\u80fd\u66f4\u52a0\u6e05\u6670\u7684\u7406\u89e3\u5404\u9879\u529f\u80fd\uff0c\u4ece\u800c\u5728\u4f7f\u7528\u7684\u65f6\u5019\u80fd\u66f4\u52a0\u7684\u5f97\u5fc3\u5e94\u624b\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_3","title":"\u4e8c\u3001\u56fe\u50cf\u8bc6\u522b","text":"\u56fe\u50cf\u8bc6\u522b\u5728 UI \u81ea\u52a8\u5316\u4e2d\u662f\u4e0d\u53ef\u7f3a\u5c11\u7684\uff0c\u5e02\u9762\u4e0a\u751a\u81f3\u6709\u5b8c\u5168\u57fa\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\uff0c\u6bd4\u5982 Airtest\u3001Sikuli \u7b49\uff0c\u5728\u6e38\u620f\u7b49\u7279\u5b9a\u9886\u57df\u4e5f\u6709\u4e0d\u9519\u7684\u6548\u679c\uff0c\u8fd9\u4e9b\u5de5\u5177\u5b9e\u9645\u4e0a\u4e5f\u662f\u7528\u7684 OpenCV \u8fdb\u884c\u4e86\u5c01\u88c5\uff0cYouQu \u6846\u67b6\u57fa\u4e8e OpenCV \u5f00\u53d1\u4e86\u81ea\u5df1\u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\uff0c\u5b83\u53ef\u4ee5\u65b9\u4fbf\u7684\u7528\u4e8e\u754c\u9762\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u65ad\u8a00\uff1b YouQu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u51e0\u4e4e\u6ee1\u8db3\u4e86\u4f60\u7684\u6240\u6709\u8981\u6c42\uff0c\u6211\u4eec\u5728\u957f\u65f6\u95f4\u7684\u601d\u8003\u548c\u6478\u7d22\u4e2d\uff0c\u9488\u5bf9\u5e38\u89c4\u573a\u666f\u53ca\u4e00\u4e9b\u7279\u6b8a\u573a\u666f\u63a2\u7d22\u9664\u4e86\u4e00\u4e9b\u5b9e\u7528\u4e14\u6709\u6548\u7684\u65b9\u6848\uff0c\u4e14\u542c\u6211\u6162\u6162\u9053\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1","title":"1\u3001\u5e38\u89c4\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5e38\u89c4\u8bc6\u522b\u5f88\u597d\u7406\u89e3\uff0c\u4e00\u53e5\u8bdd\u8bb2\u5c31\u662f\uff0c\u8981\u83b7\u53d6\u5230\u76ee\u6807\u5143\u7d20\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u3002 \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u5728\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u9700\u8981\u83b7\u53d6\u7684\u5750\u6807\u662f\u76f8\u5bf9\u4e8e\u6574\u4e2a\u5c4f\u5e55\u7684\u5750\u6807\uff0c\u6211\u4eec\u53ef\u4ee5\u622a\u53d6\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u56fe\u7247\uff08screen\uff09\uff1b \u5728\u5143\u7d20\u8bc6\u522b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u622a\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5c0f\u56fe\u8fdb\u884c\u8bc6\u522b\uff0c\u6bd4\u5982\u622a\u53d6\u64ad\u653e\u6309\u94ae\uff1a \u90a3\u4e48\u5b9e\u9645\u4e0a\uff0c\u5143\u7d20\u5b9a\u4f4d\u7684\u95ee\u9898\u5c31\u8f6c\u6362\u4e3a\uff0c\u5c06\u622a\u56fe\u7684\u5c0f\u56fe\uff08play_btn\uff09\u62ff\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u5927\u56fe\uff08screen\uff09\u4e2d\u53bb\u505a\u5339\u914d\uff0c\u5982\u679c\u5339\u914d\u6210\u529f\uff0c\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff08 x, y \uff09\u5373\u53ef\u3002 \u4e3a\u4e86\u65b9\u4fbf\u63cf\u8ff0\uff0c\u4ee5\u4e0b\u6211\u5c06\u6574\u4e2a\u5c4f\u5e55\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5927\u56fe\uff0c\u67d0\u4e2a\u5143\u7d20\u56fe\u7247\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5c0f\u56fe\u3002 \u57fa\u4e8e OpenCV \u7684\u6a21\u677f\u5339\u914d cv.matchTemplate() \u529f\u80fd\uff0c\u6211\u4eec\u5b9e\u73b0\u4e86\u56fe\u50cf\u5b9a\u4f4d\u7684\u529f\u80fd\uff0c\u6846\u67b6\u63d0\u4f9b\u4e86\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u5e95\u5c42\u63a5\u53e3\uff08\u4e00\u822c\u4e0d\u5bf9\u4e0a\u5c42\u63d0\u4f9b\u8c03\u7528\uff09\uff1a def _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\n# \u8be6\u7ec6\u4ee3\u7801\u592a\u957f\u4e0d\u8d34\u4e86\uff0c\u611f\u5174\u8da3\u8bf7\u67e5\u770b\u6e90\u7801\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001image_path image_path \u662f\u5c0f\u56fe\u7684\u7edd\u5bf9\u8def\u5f84; \u901a\u5e38\u5728 AT \u5de5\u7a0b\u91cc\u9762\uff0c\u6211\u4eec\u7ea6\u5b9a\u5c06\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u5b9e\u9645\u7684\u5143\u7d20\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1aplay_btn.png \uff1b \u7528\u4e8e\u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 case/assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1amusic_001.png \uff1b \u8fd9\u6837\u662f\u4e3a\u4e86\u65b9\u4fbf\u7ba1\u7406\u548c\u7ef4\u62a4\u3002 2\u3001rate \u56fe\u50cf\u8bc6\u522b\u7684\u7684\u5339\u914d\u5ea6\u6216\u8005\u8bf4\u76f8\u4f3c\u5ea6\uff0c\u6846\u67b6\u9ed8\u8ba4\u7684\u914d\u7f6e\u4e3a 0.9\uff0c\u4e5f\u5c31\u662f\u8bf4\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u5b58\u5728\u4e00\u4e2a\u76f8\u4f3c\u5ea6 90% \u7684\u56fe\u6807\u5373\u8fd4\u56de\u5176\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff1b \u5982\u679c\u4f60\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u8c03\u6574\u8bc6\u522b\u5ea6\uff0c\u4f60\u53ef\u4ee5\u5728\u8c03\u7528\u51fd\u6570\u7684\u65f6\u5019\uff0c\u4f20\u5165\u4e0d\u540c\u7684\u8bc6\u522b\u5ea6\u7684\u503c\u3002 3\u3001multiple \u9ed8\u8ba4\u60c5\u51b5\u4e0b multiple=False\uff0c\u8868\u793a\u53ea\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u7b2c\u4e00\u4e2a\uff0c\u5982\u679c multiple=True \u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\uff0c\u56e0\u4e3a\u5927\u56fe\u4e2d\u53ef\u80fd\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u5c0f\u56fe\uff0c\u5728\u67d0\u4e9b\u573a\u666f\u4e0b\u4f60\u53ef\u80fd\u9700\u8981\u5168\u90e8\u83b7\u53d6\u5230\u6240\u6709\u5339\u914d\u5230\u7684\u5750\u6807\u3002 4\u3001picture_abspath \u9ed8\u8ba4\u60c5\u51b5\u4e0b picture_abspath=None \u8868\u793a\u5927\u56fe\u4e3a\u622a\u53d6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u5982\u679c\u4f60\u4e0d\u5e0c\u671b\u5927\u56fe\u662f\u5c4f\u5e55\u7684\u622a\u56fe\uff0c\u800c\u662f\u4f60\u81ea\u5b9a\u4e49\u4f20\u5165\u7684\u67d0\u4e2a\u56fe\u7247\uff0c\u4f60\u53ea\u9700\u8981\u5c06\u4f60\u7684\u56fe\u7247\u8def\u5f84\u4f20\u9012\u7ed9\u8fd9\u4e2a\u53c2\u6570\u5c31\u884c\uff0c\u6bd4\u5982\uff1a picture_abspath=\"~/Desktop/big.png\" \uff1b 5\u3001screen_bbox \u5927\u56fe\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u622a\u53d6\u6574\u4e2a\u5c4f\u5e55\uff0cscreen_bbox = [x, y, w, h] \u53ef\u4ee5\u6307\u5b9a\u622a\u53d6\u5c4f\u5e55\u4e2d\u7684\u56fa\u5b9a\u533a\u57df\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\uff0c\u53ef\u4ee5\u6392\u9664\u90e8\u5206\u533a\u57df\u5bf9\u8bc6\u522b\u7ed3\u679c\u7684\u5f71\u54cd\u3002 \u3010\u9690\u5f0f\u7b49\u5f85\u3011 \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\uff0c\u6709\u65f6\u5019\u9875\u9762\u8df3\u8f6c\u6709\u5ef6\u65f6\uff0c\u6709\u53ef\u80fd\u5b58\u5728\u8bc6\u522b\u7684\u90a3\u4e00\u523b\u9875\u9762\u4e5f\u6ca1\u6709\u8df3\u8f6c\u51fa\u6765\uff0c\u6216\u8005\u6216\u8005\u8bc6\u522b\u7684\u90a3\u4e00\u523b\uff1b \u56e0\u6b64\u6211\u4eec\u9700\u8981\u4e00\u79cd\u7b49\u5f85\u673a\u5236\uff0c\u5373\u5728\u4e00\u5b9a\u7684\u65f6\u95f4\u5185\uff0c\u5982\u679c\u8bc6\u522b\u4e0d\u5230\uff0c\u91cd\u590d\u53bb\u8bc6\u522b\uff1a def find_image(\ncls,\n*widget, rate: [float, int] = None,\nmultiple: bool = False,\nmatch_number: int = None,\npicture_abspath: str = None,\nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u5728\u5c4f\u5e55\u4e2d\u533a\u5bfb\u627e\u5c0f\u56fe\uff0c\u8fd4\u56de\u5750\u6807\uff0c\n \u5982\u679c\u627e\u4e0d\u5230\uff0c\u6839\u636e\u914d\u7f6e\u91cd\u8bd5\u6b21\u6570\uff0c\u6bcf\u6b21\u95f4\u96941\u79d2\n :param widget: \u6a21\u677f\u56fe\u7247\u8def\u5f84\n :param rate: \u76f8\u4f3c\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param match_number: \u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\n :return: \u5750\u6807\u5143\u7ec4\n \"\"\"\nif rate is None:\nrate = float(GlobalConfig.IMAGE_RATE)\ntry:\nfor element in widget:\nfor _ in range((match_number or int(GlobalConfig.IMAGE_MATCH_NUMBER)) + 1):\nlocate = cls._match_image_by_opencv(\nelement,\nrate,\nmultiple=multiple,\npicture_abspath=picture_abspath,\nscreen_bbox=screen_bbox\n)\nif not locate:\nsleep(int(GlobalConfig.IMAGE_MATCH_WAIT_TIME))\nelse:\nreturn locate\nraise TemplateElementNotFound(*widget)\nexcept Exception as e:\nraise e\n \u53c2\u6570 match_number \u7528\u4e8e\u63a7\u5236\u91cd\u590d\u8bc6\u522b\u7684\u6b21\u6570\uff0c\u9ed8\u8ba4\u4e0d\u4f20\u53c2\uff0c\u53d6\u5168\u5c40\u914d\u7f6e setting/globalconfig.ini \u91cc\u9762\u7684 IMAGE_MATCH_NUMBER \u914d\u7f6e\u9879\u7684\u503c\uff0c\u9ed8\u8ba4IMAGE_MATCH_NUMBER = 1\uff0c\u5373\u91cd\u8bd5 1 \u6b21\uff1b find_image \u662f\u6846\u67b6\u63d0\u4f9b\u7684\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u51fd\u6570\u63a5\u53e3\uff0c\u8fd9\u4e2a\u51fd\u6570\u63d0\u4f9b\u4e86\u9690\u5f0f\u7b49\u5f85\u7684\u529f\u80fd\uff0c\u4e14\u5305\u542b\u4e0a\u9762\u4ecb\u7ecd\u7684 _match_image_by_opencv \u51fd\u6570\u7684\u6240\u6709\u529f\u80fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2","title":"2\u3001\u6c14\u6ce1\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u6c14\u6ce1\u8bc6\u522b\u6307\u7684\u662f\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\u8981\u5b9a\u4f4d\u7684\u5143\u7d20\u662f\u4e00\u4e9b\u4f1a\u6d88\u5931\u7684\u5c0f\u5f39\u7a97\uff0c\u8fd9\u7c7b\u573a\u666f\u5728\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\u5c31\u53ef\u80fd\u5b58\u5728\u4e0d\u7a33\u5b9a\u6027\uff0c\u6709\u53ef\u80fd\u56fe\u50cf\u8bc6\u522b\u7684\u65f6\u5019\u6c14\u6ce1\u5df2\u7ecf\u6d88\u5931\u4e86\uff0c\u4e5f\u6709\u53ef\u80fd\u6c14\u6ce1\u51fa\u73b0\u7684\u65f6\u95f4\u592a\u77ed\u4e86\uff0c\u4e0d\u5bb9\u6613\u6355\u6349\u5230\uff0c\u5c31\u50cf\u6c14\u6ce1\u4e00\u6837\uff0c\u51fa\u73b0\u4e00\u4e0b\u5c31\u6d88\u5931\uff0c\u56e0\u6b64\u6211\u4eec\u5f62\u8c61\u7684\u79f0\u4e4b\u4e3a \u201c\u6c14\u6ce1\u8bc6\u522b\u201d\uff1b \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u4e3a\u4e86\u80fd\u7a33\u5b9a\u7684\u8bc6\u522b\u6c14\u6ce1\u7c7b\u573a\u666f\uff0c\u6211\u4eec\u91c7\u7528\u7684\u65b9\u6848\u662f\uff1a \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\uff08\u5305\u542b\u6c14\u6ce1\u4ece\u51fa\u73b0\u5230\u6d88\u5931\uff09\uff0c\u4e0d\u505c\u7684\u622a\u53d6\u8fd9\u6bb5\u65f6\u95f4\u5185\u7684\u5927\u56fe\uff0c\u4ee5\u6b64\u786e\u4fdd\u5728\u622a\u53d6\u7684\u4e00\u5806\u56fe\u7247\u4e2d\uff0c\u80af\u5b9a\u6709\u81f3\u5c11\u4e00\u5f20\u56fe\u7247\u80fd\u6355\u6349\u5230\u6c14\u6ce1\uff0c\u6700\u540e\u518d\u5bf9\u8fd9\u4e00\u5806\u56fe\u7247\u9010\u4e2a\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def get_during(\ncls,\nimage_path: str,\nscreen_time: [float, int],\nrate: float = None,\npause: [int, float] = None,\nmax_range: int = 10000\n):\n\"\"\"\n \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u622a\u56fe\u591a\u5f20\u56fe\u7247\u8fdb\u884c\u8bc6\u522b\uff0c\u5176\u4e2d\u6709\u4e00\u5f20\u56fe\u7247\u8bc6\u522b\u6210\u529f\u5373\u8fd4\u56de\u7ed3\u679c;\n \u9002\u7528\u4e8e\u6c14\u6ce1\u7c7b\u7684\u65ad\u8a00\uff0c\u6bd4\u5982\u6c14\u6ce1\u57281\u79d2\u5185\u6d88\u5931\uff0c\u5982\u679c\u7528\u5e38\u89c4\u7684\u56fe\u50cf\u8bc6\u522b\u5219\u6709\u53ef\u80fd\u65e0\u6cd5\u8bc6\u522b\u5230\uff1b\n :param image_path: \u8981\u8bc6\u522b\u7684\u6a21\u677f\u56fe\u7247\uff1b\n :param screen_time: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff1b\n :param rate: \u8bc6\u522b\u7387\uff1b\n :param pause: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u4e0d\u95f4\u9694\uff1b\n :param max_range: \u622a\u56fe\u7684\u6700\u5927\u6b21\u6570\uff0c\u8fd9\u662f\u4e00\u4e2a\u9884\u8bbe\u503c\uff0c\u4e00\u822c\u60c5\u51b5\u4e0b\u4e0d\u6d89\u53ca\u4fee\u6539\uff1b\n \"\"\"\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001screen_time \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5728\u6b64\u65f6\u95f4\u5185\u4f1a\u4e0d\u65ad\u7684\u8fdb\u884c\u622a\u56fe\u64cd\u4f5c\uff0c\u5c31\u50cf\u5f55\u5236\u89c6\u9891\u4e00\u6837\uff1b 2\u3001pause \u6bcf\u6b21\u622a\u53d6\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u4e00\u523b\u4e0d\u505c\u7684\u622a\u56fe\uff0c\u5982\u679c\u4f60\u60f3\u6bcf\u6b21\u622a\u56fe\u5b58\u5728\u4e00\u4e9b\u95f4\u9694\u65f6\u95f4\u4f20\u5165\u5bf9\u5e94\u7684\u65f6\u95f4\u95f4\u9694\u5373\u53ef\uff0c\u5355\u4f4d\u662f\u79d2\uff0c\u6bd4\u5982\uff1apause = 0.03\uff0c\u8868\u793a 30 ms\uff0c\u76f8\u5f53\u4e8e\u5e27\u7387\u4e3a 30 \u5e27\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-opencv","title":"3\u3001\u4e0d\u4f9d\u8d56 OpenCV \u7684\u56fe\u50cf\u8bc6\u522b\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31","title":"3.1\u3001\u81ea\u7814\u56fe\u50cf\u8bc6\u522b\u6280\u672f","text":"\u3010\u539f\u7406\u3011 \u4e3a\u4e86\u5b9e\u73b0\u8bc6\u522b\u56fe\u50cf\u7684\u76ee\u7684\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u5c06\u56fe\u7247\u7684\u6bcf\u4e2a\u50cf\u7d20\u7684RGB\u503c\uff0c\u4e0e\u6574\u4e2a\u5c4f\u5e55\u4e2d\u7684RGB\u8fdb\u884c\u5bf9\u6bd4\uff0c\u5982\u679c\u5c0f\u56fe\u4e0a\u7684RGB\u503c\u4e0e\u5bf9\u5e94\u5927\u56fe\u4f4d\u7f6e\u7684RGB\u90fd\u76f8\u7b49\uff0c\u5219\u5339\u914d\u6210\u529f\uff0c\u5373\u53ef\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u70b9\u3002 1\u3001\u8bfb\u53d6\u5c0f\u56fe\u548c\u5927\u56fe\u7684RGB\u503c \uff081\uff09\u5c0f\u56fe\u7684RGB\u503c small_data = small_pic.load() # load()\u4f1a\u5c06\u56fe\u7247\u7684RGB\u503c\u83b7\u53d6\u5230\uff0c\u6570\u636e\u683c\u5f0f\u4e3a\u4e00\u4e2a\u4e8c\u7ef4\u5217\u8868\uff0c\u8d4b\u503c\u7ed9\u4e00\u4e2a\u53d8\u91cfsmall_data\u3002\n \uff082\uff09\u5927\u56fe\u7684RGB\u503c big_data = big_pic.load()\n 2\u3001\u5c06\u5c0f\u56fe\u4e0e\u5927\u56fe\u7684RGB\u503c\u8fdb\u884c\u5339\u914d \uff081\uff09\u5339\u914d\u4ece\u5927\u56fe\u7684\u5750\u6807\uff080\uff0c0\uff09\u5f00\u59cb\u5339\u914d\uff0c\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff082\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\uff080\uff0c0\uff09\u5bf9\u5e94\u7684\u6240\u6709\u5c0f\u56fe\u7684RGB\u503c\u4e0d\u76f8\u7b49\uff0c\u5219\u79fb\u52a8\u5230\u4e0b\u4e00\u4e2a\u5750\u6807\u70b9\uff081\uff0c0\uff09\uff0c\u540c\u6837\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff083\uff09\u6309\u7167\u8fd9\u6837\u7684\u89c4\u5f8b\u5c06\u8fd9\u4e00\u884c\u6bcf\u79fb\u52a8\u4e00\u4e2a\u5750\u6807\u70b9\uff0c\u90fd\u5c06\u5c0f\u56fe\u6240\u6709\u7684RGB\u4e0e\u5bf9\u5e94\u5927\u56fe\u7684\u503c\u8fdb\u884c\u5339\u914d\uff1b \uff084\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\u5176\u4e2d\u4e00\u4e2a\u5750\u6807\u70b9\u4e0a\u5339\u914d\u5230\u4e86\u5c0f\u56fe\u7684\u6240\u6709RGB\u503c\uff0c\u5219\u6b64\u65f6\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\u70b9\uff1b \uff085\uff09\u5982\u679c\u5339\u914d\u4e86\u5927\u56fe\u6240\u6709\u7684\u5750\u6807\u70b9\uff0c\u90fd\u6ca1\u6709\u5339\u914d\u5230\uff0c\u5219\u8bf4\u660e\u5927\u56fe\u4e2d\u4e0d\u5b58\u5728\u5c0f\u56fe\uff0c\u5339\u914d\u5931\u8d25\uff1b \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 class ImageRgb:\n@staticmethod\ndef _check_match(_x, _y, small, bdata, sdata, rate):\n\"\"\"\n Matching degree of small graph and large graph matching\n \"\"\"\n@staticmethod\ndef _pre_random_point(small):\n\"\"\"\n Pre matching, take 10-20 points at random each time,\n and take coordinates randomly in the small graph\n \"\"\"\n@staticmethod\ndef _pre_random_match(_x, _y, point_list, bdata, sdata, rate):\n\"\"\"\n In the small graph, several points are randomly\n selected for matching, and the matching degree is\n also set for the random points\n \"\"\"\n@classmethod\ndef match_image_by_rgb(cls, image_name=None, image_path=None, rate=0.9):\n\"\"\"\n By comparing the RGB values of the small image with the large\n image on the screen, the coordinates of the small image on\n the screen are returned.\n \"\"\"\n \u901a\u8fc7 match_image_by_rgb() \u8fd9\u4e2a\u51fd\u6570\uff0c\u4f20\u5165\u76ee\u6807\u5c0f\u56fe\u7684\u6587\u4ef6\u540d\u79f0\uff0c\u5373\u53ef\u8fd4\u56de\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u3002 \u6709\u540c\u5b66\u8981\u95ee\u4e86\uff0c\u6709 OpenCV \u5e72\u561b\u4e0d\u7528\uff0c\u6709\u5fc5\u8981\u81ea\u5df1\u5b9e\u73b0\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u529f\u80fd\u5417\uff0c\u4f60\u4eec\u662f\u4e0d\u662f\u95f2\u7684\u554a\uff1f \u8fd9\u4e48\u95ee\u7684\u8bdd\uff0c\u5c0f\u4e86\uff0c\u683c\u5c40\u5c0f\u4e86\uff1b\u6211\u4eec\u81ea\u5df1\u5b9e\u73b0\u4e3b\u8981\u6709\u51e0\u65b9\u9762\u539f\u56e0\uff1a \u51cf\u5c11\u73af\u5883\u4f9d\u8d56\uff0c\u5373\u4e0d\u7528\u5b89\u88c5 OpenCV\uff0c\u6211\u4eec\u4e5f\u80fd\u5b9e\u73b0\u5176\u529f\u80fd\uff0c\u73af\u5883\u4f9d\u8d56\u8fd9\u5757\u540e\u9762\u4f1a\u5355\u72ec\u8be6\u7ec6\u8bb2\uff0c\u51cf\u5c11\u73af\u5883\u4f9d\u8d56\u5bf9\u4e8e\u4efb\u4f55\u8f6f\u4ef6\u5de5\u7a0b\u90fd\u975e\u5e38\u91cd\u8981\uff1b OpenCV \u5728\u5176\u4ed6\u56fd\u4ea7 CPU \u67b6\u6784\u4e0a\u5b89\u88c5\u5e76\u4e0d\u80fd\u4fdd\u8bc1100%\u6210\u529f\uff0c\u751a\u81f3\u6709\u6ca1\u6709\u53ef\u80fd\u5728\u4e00\u4e9b\u67b6\u6784\u4e0a\u538b\u6839\u513f\u5c31\u4e0d\u80fd\u5b89\u88c5\u4f7f\u7528 OpenCV \uff1f \u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 OpenCV \uff1f\u5c31\u50cf\u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 Windows \u5462\uff1f\u8fd9\u4e9b\u95ee\u9898\u503c\u5f97\u601d\u8003\u3002 \u5f53\u7136\uff0c\u6211\u4eec\u627f\u8ba4\u8fd9\u5957\u65b9\u6848\uff0c\u867d\u7136\u8bc6\u522b\u51c6\u786e\u7387\u6ca1\u95ee\u9898\uff0c\u4f46\u5728\u8bc6\u522b\u6548\u7387\u4e0a\u8fd8\u6ca1\u6709\u8fbe\u5230 OpenCV \u6a21\u677f\u5339\u914d\u7684\u6548\u679c\uff0c\u6211\u4eec\u7684\u65b9\u6848\u6bcf\u6b21\u8bc6\u522b\u5728 1.5s \u5de6\u53f3\uff0c\u800c OpenCV \u5728 1s \u5de6\u53f3\uff1b \u6574\u4f53\u8bc6\u522b\u6548\u679c\u6765\u8bb2\uff0c\u6211\u8ba4\u4e3a\u8fd8\u662f\u53ef\u4ee5\u63a5\u53d7\u7684\uff0c\u4e5f\u5e0c\u671b\u6709\u5fd7\u4e4b\u58eb\u80fd\u4e00\u8d77\u4f18\u5316\u6b64\u65b9\u6848\uff0c\u4e00\u8d77\u6280\u672f\u62a5\u56fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32-rpc","title":"3.2\u3001\u57fa\u4e8e RPC \u670d\u52a1\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b","text":"\u5728\u8fdc\u7a0b\u670d\u52a1\u5668\u4e0a\u90e8\u7f72 OpenCV \u7684\u73af\u5883\uff0c\u5e76\u5c06\u5176\u90e8\u7f72\u4e3a RPC \u670d\u52a1\uff0c\u6d4b\u8bd5\u673a\u4e0a\u4e0d\u7528\u5b89\u88c5 OpenCV \u4f9d\u8d56\uff0c\u800c\u662f\u901a\u8fc7\u8bf7\u6c42 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u3010\u539f\u7406\u3011 \u6d4b\u8bd5\u673a\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u56fe\u7247\u4ee5\u53ca\u6a21\u677f\u56fe\u7247\uff0c\u53d1\u9001\u7ed9 RPC \u670d\u52a1\u7aef\uff0c\u670d\u52a1\u7aef\u62ff\u5230\u4e24\u5f20\u56fe\u7247\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u6700\u540e\u5c06\u8bc6\u522b\u7ed3\u679c\u8fd4\u56de\u7ed9\u6d4b\u8bd5\u673a\uff1b \u8981\u7279\u6b8a\u8bf4\u660e\u7684\u662f\uff1a RPC \u662f\u4e00\u79cd\u534f\u8bae\uff0c\u8bb8\u591a\u8bed\u8a00\u90fd\u662f\u652f\u6301\u7684\uff0c\u6bd4\u5982\u8bf4\u670d\u52a1\u7aef\u4e5f\u53ef\u4ee5\u7528 C++ \u6765\u5b9e\u73b0\uff0c\u5ba2\u6237\u7aef\u4f7f\u7528 Python \u4e5f\u662f\u53ef\u4ee5\u8c03\u7528\u7684\u3002 \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 \u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nimport cv2 as cv\nimport numpy as np\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\nif __name__ == \"__main__\":\nserver = ThreadXMLRPCServer((\"x.x.x.x\", 8889), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(match_image_by_opencv, \"match_image_by_opencv\")\nserver.serve_forever()\n \u8fd9\u6837\uff0c\u6211\u4eec\u57fa\u4e8e Python \u6807\u51c6\u5e93 xmlrpc \u642d\u5efa\u4e86\u4e00\u4e2a RPC \u670d\u52a1\u5668\uff0c\u6ce8\u518c\u4e86 image_put \u548c match_image_by_opencv \u4e24\u4e2a\u529f\u80fd\u63a5\u53e3\uff0c\u5728\u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u901a\u8fc7 IP \u548c\u7aef\u53e3\u8fdb\u884c RPC \u8bf7\u6c42\uff1b \u5ba2\u6237\u7aef\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from xmlrpc.client import Binary\nfrom xmlrpc.client import ServerProxy\nserver = ServerProxy(GlobalConfig.OPENCV_SERVER_HOST, allow_none=True)\nscreen_rb = open(screen, \"rb\")\ntemplate_rb = open(template_path, \"rb\")\ntry:\nscreen_path = server.image_put(Binary(screen_rb.read()))\nscreen_rb.close()\ntpl_path = server.image_put(Binary(template_rb.read()))\ntemplate_rb.close()\nreturn server.match_image_by_opencv(\ntpl_path, screen_path, rate, multiple\n)\nexcept OSError as exc:\nraise EnvironmentError(\nf\"RPC\u670d\u52a1\u5668\u94fe\u63a5\u5931\u8d25. {GlobalConfig.OPENCV_SERVER_HOST}\"\n) from exc\n \u901a\u8fc7\u8fd4\u56de server.match_image_by_opencv \u5c31\u83b7\u53d6\u4e86\u5728\u670d\u52a1\u7aef\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4","title":"4\u3001\u53f3\u952e\u83dc\u5355\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41","title":"4.1\u3001\u53f3\u952e\u83dc\u5355\u5b9a\u4f4d\u7684\u65b9\u6848\u53ca\u95ee\u9898","text":"\u53f3\u952e\u83dc\u5355\u7684\u5143\u7d20\u5b9a\u4f4d\u662f\u4e00\u4e2a\u96be\u70b9\uff0c\u8fc7\u53bb\u6211\u4eec\u8c03\u7814\u548c\u4f7f\u7528\u8fc7\u7684\u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u65b9\u6cd5\u6709 4 \u79cd\uff1a \u7b2c\u4e00\u79cd\uff1a\u6b65\u957f\u64cd\u4f5c\u6cd5 \u5728\u53f3\u952e\u83dc\u5355\u547c\u51fa\u6765\u4e4b\u540e\uff0c\u901a\u8fc7\u952e\u76d8\u7684 up\u3001down \u6309\u952e\uff0c\u8fdb\u884c\u9009\u62e9\u83dc\u5355\u9009\u62e9\uff0c\u9009\u4e2d\u76ee\u6807\u4e4b\u540e enter \u5373\u53ef\uff1b\u6bd4\u5982\uff1a\u5728\u684c\u9762\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\uff0c\u6309 1 \u6b21 down \uff0c\u4f1a\u51fa\u73b0\u4e0b\u56fe\uff1a \u7ee7\u7eed\u518d\u6309 2 \u6b21 down\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u518d\u6309 enter\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u5982\u6b64\uff0c\u201c\u6392\u5e8f\u65b9\u5f0f\u201d\u7684\u6b65\u957f\u4e3a 3\uff1b\u901a\u8fc7\u4f7f\u7528\u952e\u76d8\u4e0a\u4e0b\u952e\uff0c\u5c31\u5b9e\u73b0\u4e86\u5bf9\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\uff1b \u4f46\u662f\uff0c\u8fd9\u79cd\u65b9\u5f0f\u6709\u4e2a\u5f88\u70e6\u4eba\u7684\u95ee\u9898\uff0c\u5c31\u662f\u53f3\u952e\u83dc\u5355\u7684\u9009\u9879\u4f4d\u7f6e\u4e0d\u53ef\u80fd\u4e00\u76f4\u4e0d\u53d8\uff0c\u5728\u9700\u6c42\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\uff0c\u83dc\u5355\u9009\u9879\u7684\u53d8\u5316\u662f\u5f88\u5927\u7684\uff0c\u751a\u81f3\u6709\u4e9b\u5e94\u7528\u652f\u6301\u81ea\u5b9a\u4e49\u83dc\u5355\uff0c\u6bd4\u5982\u6587\u7ba1\u53f3\u952e\u83dc\u5355\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff1b \u4e5f\u5c31\u662f\u8bf4\u4f60\u5f97\u7ecf\u5e38\u53bb\u7ef4\u62a4\u83dc\u5355\u9009\u9879\u7684\u6b65\u957f\uff0c\u4e00\u4e2a\u9009\u9879\u73b0\u5728\u7684\u6b65\u957f\u662f 3\uff0c\u4e0b\u4e2a\u8fed\u4ee3\u53ef\u80fd\u5c31\u662f 4 \u6216\u8005 5\u3002 \u7b2c\u4e8c\u79cd\uff1a\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u6cd5 \u628a\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5355\u72ec\u622a\u56fe\u4fdd\u5b58\uff0c\u56fe\u7247\u4e2d\u4ec5\u5305\u542b\u4e00\u4e2a\u83dc\u5355\u9009\u9879\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u8fd9\u6837\uff0c\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5c31\u53ef\u4ee5\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u65b9\u5f0f\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u8fd9\u79cd\u65b9\u5f0f\u4e0d\u7528\u62c5\u5fc3\u83dc\u5355\u9009\u9879\u7684\u987a\u5e8f\u6216\u4f4d\u7f6e\uff0c\u4f46\u662f\u9700\u8981\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff0c\u4e14\u5bb9\u6613\u53d7\u5230\u5b57\u4f53 UI \u53d8\u66f4\u7c7b\u9700\u6c42\u7684\u5f71\u54cd\uff0c\u6bd4\u5982\uff1a\u5b57\u4f53\u5927\u5c0f\u3001\u5b57\u4f53\u95f4\u8ddd\u7b49\u7b49\u9700\u6c42\u53d8\u66f4\u90fd\u4f1a\u5f71\u54cd\uff0c\u6bcf\u6b21\u53d8\u66f4\u4e4b\u540e\u5c31\u9700\u8981\u8fdb\u884c\u5927\u91cf\u56fe\u7247\u8d44\u6e90\u7684\u91cd\u65b0\u622a\u56fe\u66ff\u6362\uff0c\u662f\u4e2a\u6bd4\u8f83\u9ebb\u70e6\u7684\u4e8b\u60c5\uff1b \u7b2c\u4e09\u79cd\uff1a\u76f8\u5bf9\u4f4d\u79fb\u6cd5 \u9f20\u6807\u70b9\u51fb\u53f3\u952e\u7684\u65f6\u5019\uff0c\u9f20\u6807\u7684\u5f53\u524d\u5750\u6807\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u7684\uff0c\u83dc\u5355\u9009\u9879\u7684\u5bbd\uff08 w \uff09\u4e00\u822c\u662f\u56fa\u5b9a\u7684\uff0c\u53d8\u5316\u7684\u662f\u83dc\u5355\u7684\u957f\u5ea6\uff08 h \uff09\uff0c\u53ef\u4ee5\u901a\u8fc7\u67d0\u4e2a\u9009\u9879\u76f8\u5bf9\u4e8e\u9f20\u6807\u7684\u8ddd\u79bb\u5728\u786e\u5b9a\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u901a\u8fc7\u7ef4\u62a4\u83dc\u5355\u9009\u9879\uff08\u76f8\u5bf9\u4f4d\u7f6e\uff09\u76f8\u5bf9\u4e8e\u9f20\u6807\u4f4d\u7f6e\u7684\u8ddd\u79bb\uff0c\u5373\u53ef\u8f7b\u677e\u8ba1\u7b97\u51fa\u83dc\u5355\u9009\u9879\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\u3002 \u4ece\u7406\u8bba\u4e0a\u6b64\u65b9\u6848\u662f\u53ef\u884c\u7684\uff0c\u4f46\u662f\u8fd9\u91cc\u4ecd\u7136\u5b58\u5728\u4e24\u4e2a\u4e25\u91cd\u7684\u95ee\u9898\uff1a \u83dc\u5355\u987a\u5e8f\u6539\u53d8\uff0c\u5bfc\u81f4\u76f8\u5bf9\u8ddd\u79bb\u6539\u53d8\uff0c\u800c\u4e14\u8ddd\u79bb\u662f\u901a\u8fc7\u50cf\u7d20\uff08px\uff09\u6765\u8868\u793a\u7684\uff0c\u4e0d\u60f3\u6b65\u957f\u90a3\u4e48\u53ea\u7ba1\uff0c\u6bcf\u6b21\u9700\u8981\u53bb\u91cf\u4e00\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u70b9\u9ebb\u70e6\uff1b \u9f20\u6807\u5728\u684c\u9762\u4e0d\u540c\u4f4d\u7f6e\u70b9\u51fb\u53f3\u952e\uff0c\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u4f4d\u7f6e\u662f\u4e0d\u540c\u7684\uff0c\u4e0a\u56fe\u7684\u83dc\u5355\u662f\u5728\u9f20\u6807\u7684\u5de6\u4e0b\u65b9\uff0c\u5982\u679c\u4f60\u79fb\u52a8\u9f20\u6807\u5230\u5c4f\u5e55\u56db\u8fb9\uff0c\u4f60\u4f1a\u53d1\u73b0\uff0c\u53f3\u952e\u83dc\u5355\u53ef\u80fd\u51fa\u73b0\u5728\u9f20\u6807\u7684\u56db\u4e2a\u65b9\u5411\uff0c\u4e5f\u5c31\u662f\u8bf4\u4f60\u9700\u8981\u6839\u636e\u9f20\u6807\u7684\u4e0d\u540c\u4f4d\u7f6e\u6765\u5224\u65ad\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u65b9\u5411\uff0c\u800c\u4e0d\u540c\u7684\u65b9\u5411\u4e0a\u8ba1\u7b97\u65b9\u6cd5\u662f\u4e0d\u540c\u7684\uff0c\u6bd4\u5982\uff1a\u53f3\u952e\u83dc\u5355\u5728\u9f20\u6807\u7684\u5de6\u4e0a\uff0c\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\u8ba1\u7b97\u65b9\u6cd5\u4e3a\uff08x - w / 2\uff0c y - h\uff09\uff0c\u8fd9\u6837\u7ef4\u62a4\u8d77\u6765\u53ef\u4ee5\u8bf4\u975e\u5e38\u590d\u6742\uff1b \u57fa\u4e8e\u4ee5\u4e0a\u4e24\u4e2a\u539f\u56e0\uff0c\u6211\u4eec\u5e76\u4e0d\u63a8\u8350\u8fd9\u79cd\u64cd\u4f5c\u65b9\u6848\u3002 \u7b2c\u56db\u79cd\uff1a\u5c5e\u6027\u5b9a\u4f4d \u6709\u540c\u5b66\u8bf4\u5e72\u561b\u4e0d\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u5462\uff0c\u5176\u5b9e\uff0c\u6211\u4eec\u6700\u5f00\u59cb\u60f3\u5230\u7684\u65b9\u6848\u5c31\u662f\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\uff0c\u4f46\u662f\u5728\u5c5e\u6027\u7684 DOM \u6811\u91cc\u600e\u4e48\u4e5f\u627e\u4e0d\u5230\uff0c\u65e0\u6cd5\u5b9a\u4f4d\u5230\uff0c\u6211\u4eec\u4e5f\u8054\u5408\u7814\u53d1\u540c\u5b66\u4e00\u8d77\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u4f46\u6700\u7ec8\u8fd8\u662f\u6ca1\u80fd\u89e3\u51b3\uff0c\u975e\u5e38\u9057\u61be\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42","title":"4.2\u3001\u6700\u65b0\u7684\u53f3\u952e\u83dc\u5355\u7ec8\u6781\u89e3\u51b3\u65b9\u6848","text":"\u7531\u4e8e\u53f3\u952e\u83dc\u5355\u9009\u9879\u51e0\u4e4e\u90fd\u662f\u6587\u672c\uff0c\u90a3\u4e48\u901a\u8fc7 OCR \u8bc6\u522b\uff0c\u51e0\u4e4e\u662f\u6700\u4f18\u7684\u65b9\u6848\uff1a \u4e0d\u7528\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff1b \u4e0d\u4f1a\u53d7\u5230\u83dc\u5355\u9009\u9879\u987a\u5e8f\u6539\u53d8\u7684\u5f71\u54cd\uff1b \u4e0d\u4f1a\u53d7\u5230\u5b57\u4f53 UI \u53d8\u5316\u7684\u5f71\u54cd\uff1b \u5173\u4e8e OCR \u8bc6\u522b\u6211\u4eec\u5728\u540e\u9762\u4f1a\u8be6\u7ec6\u8bb2\u5230\uff0c\u672c\u7ae0\u8282\u4e3b\u8981\u8bb2\u57fa\u4e8e OCR \u8bc6\u522b\uff0c\u6211\u4eec\u5728\u53f3\u952e\u83dc\u5355\u8bc6\u522b\u4e0a\u7684\u7a81\u7834\u548c\u521b\u65b0\uff1b \u4f7f\u7528 OCR \u8bc6\u522b\u53f3\u952e\u83dc\u5355\u867d\u7136\u5df2\u7ecf\u5f88\u5b8c\u7f8e\u4e86\uff0c\u4f46\u662f\u5728\u4e00\u4e9b\u60c5\u51b5\u4e0b\u4ecd\u7136\u5b58\u5728\u4e00\u70b9\u95ee\u9898\uff0c\u5c31\u662f\u5c4f\u5e55\u4e2d\u51fa\u73b0\u591a\u4e2a\u548c\u83dc\u5355\u9009\u9879\u6587\u5b57\u76f8\u540c\u7684\u6587\u5b57\u65f6\uff0c\u6bd4\u5982\u4e0b\u9762\u8fd9\u79cd\u60c5\u51b5\uff1a \u5c4f\u5e55\u6070\u597d\u51fa\u73b0\u4e86\u4e24\u4e2a\u201c\u590d\u5236\u201d\uff0c\u6b64\u65f6\u8981\u5b9a\u4f4d\u5230\u83dc\u5355\u4e2d\u7684 \u201c\u590d\u5236\u201d\uff0c\u5c31\u9700\u8981\u8fdb\u4e00\u6b65\u505a\u6570\u636e\u5904\u7406\uff0c\u6bd4\u5982\uff1aOCR \u8fd4\u56de 2 \u4e2a\u201c\u590d\u5236\u201d\u7684\u5750\u6807\uff0c\u7528\u4f8b\u91cc\u9762\u6765\u5224\u65ad\u7528\u54ea\u4e2a\uff0c\u4ece\u4e1a\u52a1\u4e0a\u5c06\u5904\u7406\u8d77\u6765\u6bd4\u8f83\u9ebb\u70e6\uff0c\u56e0\u4e3a\u4f60\u5f97\u660e\u786e\u77e5\u9053\u83dc\u5355\u5728\u5de6\u8fb9\u8fd8\u662f\u53f3\u8fb9\uff0c\u7136\u540e\u8fd9\u672c\u8eab\u5c31\u662f\u4e0d\u786e\u5b9a\u7684\uff1b \u600e\u4e48\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u5462\uff0c\u8fd9\u5c31\u8981\u8bf4\u9053\u672c\u7ae0\u7684\u4e3b\u9898\uff1a\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b\u3002 \u3010\u539f\u7406\u3011 \u5728\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u524d\u622a\u4e00\u5f20\u56fe\uff0c\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\u518d\u622a\u53d6\u4e00\u5f20\u56fe\uff0c\u4e24\u5f20\u56fe\u552f\u4e00\u53d8\u5316\u7684\u5c31\u662f\u53f3\u952e\u83dc\u5355\uff0c\u5c06\u5176\u4ed6\u76f8\u540c\u7684\u5730\u65b9\u90fd\u5c4f\u853d\u6389\uff0c\u53ea\u7559\u4e0b\u83dc\u5355\u754c\u9762\uff0c\u5982\u6b64\u5373\u53ef\u6d88\u9664\u5e72\u6270\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u5c06\u4e24\u79cd\u56fe\u505a\u524d\u540e\u5bf9\u6bd4\u63d0\u53d6\u53ef\u4ee5\u5f97\u5230\u8fd9\u6837\u7684\u56fe\uff1a \u4f60\u770b\uff0c\u901a\u8fc7\u524d\u540e\u56fe\u7247\u7684\u5bf9\u6bd4\uff0c\u5c06\u76f8\u540c\u7684\u90e8\u5206\u7ed9\u6d88\u9664\u6389\uff0c\u518d\u8fdb\u884c OCR \u8bc6\u522b\uff0c\u8fd9\u6837\u5c31\u4e0d\u4f1a\u6709\u5e72\u6270\u4e86\uff1b \u4ee3\u7801\u5b9e\u73b0\u8bf7\u67e5\u770b src/filter_image.py \uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def filter_image(action):\n\"\"\"\n \u5bf9\u6bd4\u52a8\u4f5c\u524d\u540e\u4e24\u5f20\u56fe\u7247\uff0c\u63d0\u53d6\u4e0d\u540c\u7684\u90e8\u5206\u751f\u6210\u4e00\u5f20\u65b0\u7684\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u65b0\u56fe\u7247\u7684\u8def\u5f84\n :param action: \u52a8\u4f5c\u51fd\u6570\u7684\u51fd\u6570\u5bf9\u8c61\n :return: \u65b0\u56fe\u7247\u7684\u8def\u5f84\n \"\"\"\n action \u662f\u9f20\u6807\u4e8b\u4ef6\uff0c\u56e0\u4e3a\u6b64\u7c7b\u573a\u666f\u4e0d\u4ec5\u4ec5\u5728\u53f3\u952e\u5b58\u5728\uff0c\u5355\u51fb\u3001\u53cc\u51fb\u7b49\u7b49\uff0c\u53ea\u8981\u64cd\u4f5c\u524d\u540e\u540e\u53d8\u5316\u7684\u90fd\u53ef\u4ee5\uff1a from src.mouse_key import MouseKey\naction = (\nMouseKey.click,\nMouseKey.right_click,\nMouseKey.double_click,\nMouseKey.move_to,\n)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5","title":"5\u3001\u52a8\u6001\u56fe\u50cf\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5728\u684c\u9762\u58c1\u7eb8\u5207\u6362\uff0c\u6216\u770b\u56fe\u3001\u76f8\u518c\u5207\u6362\u56fe\u7247\u7c7b\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u7531\u4e8e\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u662f\u4e0d\u56fa\u5b9a\u7684\uff08\u4e0d\u540c\u7248\u672c\u7684\u7cfb\u7edf\u58c1\u7eb8\u4e0d\u540c\u3001\u58c1\u7eb8\u987a\u5e8f\u4e0d\u540c\uff0c\u770b\u56fe\u76f8\u518c\u5728\u56fe\u7247\u8d44\u6e90\u4e0d\u4e00\u5b9a\u56fa\u5b9a\uff09\uff0c\u90a3\u4e48\u5728\u6d4b\u8bd5\u5207\u6362\u58c1\u7eb8\u6216\u8005\u5207\u6362\u56fe\u7247\u7684\u573a\u666f\u65f6\u5c31\u4f1a\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u4f60\u4e0d\u77e5\u9053\u9884\u671f\u662f\u5565\uff0c\u7528\u4f8b\u64cd\u4f5c\u52a8\u6001\u7684\uff0c\u4e5f\u662f\u6781\u4e0d\u7a33\u5b9a\u3002 \u3010\u539f\u7406\u3011 \u5728\u5207\u6362\u56fe\u7247\u4e4b\u524d\u622a\u56fe\u4fdd\u5b58\u5e76\u8fd4\u56de\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u6b21\u8bc6\u522b\u8fd9\u5f20\u56fe\u7247\uff0c\u5982\u679c\u4e0d\u5b58\u5728\uff0c\u8bf4\u660e\u56fe\u7247\u5df2\u7ecf\u5207\u6362\u4e86\uff1b \u793a\u610f\u56fe\uff1a \u8fd9\u6837\uff0c\u6211\u4eec\u622a\u53d6\u4e86\u5f53\u524d\u56fe\u7247\u4e2d\u6bd4\u8f83\u6709\u4ee3\u8868\u6027\u7684\u4f4d\u7f6e\uff08\u4e00\u53ea\u9e1f\uff09\uff0c\u5728\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u7528\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1a \u6211\u4eec\u518d\u62ff\u7740\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd9\u6837\u5728\u5f53\u524d\u56fe\u7247\u4e2d\uff0c\u5c31\u4e0d\u80fd\u627e\u5230\u8fd9\u53ea\u9e1f\u4e86\uff0c\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u662f False\uff0c\u90a3\u4e48\u4e5f\u5c31\u53ef\u4ee5\u5224\u65ad\u56fe\u7247\u5207\u6362\u662f\u6210\u529f\u7684\u3002 \u4ee3\u7801\u793a\u610f\uff1a def save_temporary_picture(_x: int, _y: int, width: int, height: int):\n\"\"\"\n \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u56fe\u7247\u8def\u5f84\n :param x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n :param y: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n :param width: \u5bbd\u5ea6\n :param height: \u9ad8\u5ea6\n :return: \u56fe\u7247\u8def\u5f84\n \"\"\"\n \u6b64\u51fd\u6570\u7528\u4e8e\u5728\u64cd\u4f5c\u4e4b\u524d\u622a\u56fe\u4e00\u5f20\u4e34\u65f6\u56fe\u7247\uff0c\u8fd4\u56de\u56fe\u7247\u8def\u5f84\uff0c\u6700\u540e\u5728\u65ad\u8a00\u7684\u65f6\u5019\u518d\u5c06\u56fe\u7247\u8def\u5f84\u4f5c\u4e3a\u53c2\u6570\u4f20\u5165\u65ad\u8a00\u8bed\u53e5\u5373\u53ef\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ui","title":"\u4e09\u3001\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_1","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u662f\u6211\u4eec\u81ea\u7814\u7684\u4e00\u79cd\u4f7f\u7528\u7b80\u5355\uff0c\u4e14\u6548\u7387\u6781\u9ad8\u3001\u7a33\u5b9a\u6027\u597d\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u57fa\u4e8e\u5143\u7d20\u6309\u94ae\u5728\u5e94\u7528\u4e2d\u7684\u76f8\u5bf9\u4f4d\u7f6e\uff0c\u52a8\u6001\u83b7\u53d6\u5143\u7d20\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff0c\u9002\u7528\u4e8e\u5404\u79cd\u5c4f\u5e55\u5206\u8fa8\u7387\uff08\u5305\u62ec\u9ad8\u5206\u5c4f\u3001\u5bbd\u5c4f\u3001\u5e26\u9c7c\u5c4f\uff09\uff0c\u5f53\u5143\u7d20\u6309\u94ae\u4f4d\u7f6e\u76f8\u5bf9\u4e8e\u5e94\u7528\u754c\u9762\u4f4d\u7f6e\u53d1\u751f\u4fee\u6539\u4e4b\u540e\uff0c\u53ea\u9700\u8981\u6839\u636e UI \u8bbe\u8ba1\u56fe\u4e0a\u7684\u6e90\u6570\u636e\u4fee\u6539\u5bf9\u5e94\u5750\u6807\u6570\u636e\u5c31\u597d\uff0c\u7ef4\u62a4\u975e\u5e38\u7684\u65b9\u4fbf\u3002 \u6b64\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u9002\u7528\u4e8e\u4e00\u4e9b\u5143\u7d20\u4f4d\u7f6e\u76f8\u5bf9\u4e0e\u5e94\u7528\u754c\u9762\u6bd4\u8f83\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u97f3\u4e50\uff0899% \u7684\u5143\u7d20\u5b9a\u4f4d\u91c7\u7528\u8fd9\u79cd\uff0c\u6548\u679c\u975e\u5e38\u597d\uff09\uff0c\u4e0d\u9002\u7528\u4e8e\u754c\u9762\u4e0d\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u622a\u56fe\u5f55\u5c4f\uff0c\u5f88\u660e\u663e\u4e0d\u9002\u7528\u4e8e\u8fd9\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u3002\u8fd9\u79cd\u5168\u65b0\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u6709\u5b83\u7684\u9002\u7528\u6761\u4ef6\uff0c\u5982\u679c\u4f60\u53d1\u73b0\u4f7f\u7528\u5e38\u89c4\u7684\uff08\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u5b9a\u4f4d\uff09\u4e0d\u597d\u505a\u65f6\uff0c\u4e0d\u59a8\u8003\u8651\u4f7f\u7528\u8fd9\u79cd\uff0c\u5176\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff0c\u5e76\u4e14\u8fc5\u901f\u7231\u4e0a\u4ed6\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_1","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5728 UI \u8bbe\u8ba1\u56fe\u4e2d\u6211\u4eec\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u8fb9\u6846\u7684\u8ddd\u79bb\u7684\uff0c\u7136\u540e\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u6280\u672f\u624b\u6bb5\u83b7\u53d6\u5230\u5e94\u7528\u754c\u9762\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u53ca\u5e94\u7528\u7a97\u53e3\u7684\u5927\u5c0f\uff0c\u793a\u610f\u56fe\u5982\u4e0b\uff1a \uff08x1, y1\uff09\u4e3a\u5e94\u7528\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\uff1b\uff08x2, y2\uff09\u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u5de6\u4e0a\u89d2\uff08x1, y1\uff09\u7684\u5750\u6807\uff0c\u90a3\u4e48\u5b9e\u9645\u4e0a\u3010\u64ad\u653e\u6240\u6709\u3011\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\u4e3a\uff1a\uff08 x1 + x2, y1 + y2 \uff09\uff1b \u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5927\u5c0f\uff08w2, h2\uff09\uff0c\u53ef\u4ee5\u4ece UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\uff1b \u5728 UI \u8bbe\u8ba1\u7a3f\u4e0a\u70b9\u51fb\u3010\u64ad\u653e\u6240\u6709\u3011\u56fe\u6807\uff0c\u7136\u540e\u79fb\u52a8\u9f20\u6807\u5c31\u5c31\u53ef\u4ee5\u770b\u5230\u4e0a\u56fe\u7684\u53c2\u8003\u7ebf\u53ca\u6570\u636e\uff1b \u6240\u4ee5\uff0c\u6211\u4eec\u53ef\u4ee5\u8f7b\u677e\u7684\u83b7\u53d6\u5230\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u4e2d\u5fc3\u5750\u6807\u4e3a\uff1a\uff08 x1 + x2 + (w2 / 2), y1 + y2 + ( h2 / 2) \uff09 \u8be6\u7ec6\u6e90\u4ee3\u7801\u8bf7\u67e5\u770b AT \u57fa\u7840\u6846\u67b6: src/button_center.py \u83b7\u53d6\u5e94\u7528\u7a97\u53e3\u7684\u4fe1\u606f \u4f7f\u7528 xdotool \u548c xwininfo \u83b7\u53d6\u5230\u5e94\u7528\u7a97\u53e3\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u5de6\u4e0a\u89d2\uff09\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a app_id = CmdCtl.run_cmd(f\"xdotool search --classname --onlyvisible {self.app_name}\"\n).split(\"\\n\")\napp_id_list = [int(_id) for _id in app_id if _id]\nreturn CmdCtl.run_cmd(f\"xwininfo -id {app_id_list[self.number]}\")\n \u4f7f\u7528\u6b63\u5219\u83b7\u53d6\u7a97\u53e3\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u83b7\u53d6\u914d\u7f6e \u8bfb ini \u914d\u7f6e\u6587\u4ef6\uff0c\u83b7\u53d6\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e0e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a conf = ConfigParser()\nconf.read(self.config_path)\ndirection = conf.get(btn_name, \"direction\")\nposition = [int(i.strip()) for i in conf.get(btn_name, \"location\").split(\",\")]\n \u8ba1\u7b97\u5143\u7d20\u6309\u94ae\u5750\u6807 \u6839\u636e\u5e94\u7528\u7a97\u53e3\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u5927\u5c0f\u3001\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u5927\u5c0f\uff0c\u4f7f\u7528\u4e00\u5b9a\u7684\u7b97\u6cd5\u5373\u53ef\u8ba1\u7b97\u51fa\u5143\u7d20\u6309\u94ae\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u4e2d\u5fc3\u5750\u6807\uff09\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3","title":"3\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u3010\u914d\u7f6e\u65b9\u6cd5\u3011 \u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u7684\u6570\u636e\u6e90\u662f\u5e94\u7528\u5e93\u4e2d\u7684 ui.ini \u914d\u7f6e\u6587\u4ef6\uff1a ;section\n[\u65b0\u5efa\u6b4c\u5355+] ;key = value\ndirection = left_top\nlocation = 180, 268, 21, 21\n section \u662f\u4f60\u6839\u636e\u5bf9\u5e94\u7684\u5143\u7d20\u6309\u94ae\u547d\u540d\uff0c\u4f60\u53ef\u4ee5\u4efb\u610f\u547d\u540d\uff0c\u4f46\u6700\u597d\u6709\u5177\u4f53\u542b\u4e49\uff0c\u4e14\u80fd\u660e\u786e\u8868\u793a\u8fd9\u4e2a\u5143\u7d20\u6309\u94ae\u7684\u540d\u79f0\uff1b\u7528\u4e2d\u62ec\u53f7\u62ec\u8d77\u6765\u5c31\u884c\uff0c\u6bd4\u5982\uff1a[\u65b0\u5efa\u6b4c\u5355+] \uff1b direction \u662f\u914d\u7f6e\u8be5\u5143\u7d20\u7684\u53c2\u8003\u7cfb\uff0c\u5206\u522b\u4e3a\uff1a left_top \u5de6\u4e0a\uff1b left_bottom \u5de6\u4e0b\uff1b right_top \u53f3\u4e0a\uff1b right_bottom \u53f3\u4e0b\uff1b \u53c2\u8003\u7cfb\u7684\u9009\u53d6\u6807\u51c6\uff1a\u62c9\u52a8\u6539\u53d8\u7a97\u53e3\u5927\u5c0f\u65f6\uff0c\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u53c2\u8003\u7cfb\u4f4d\u7f6e\u662f\u4e0d\u53d8\u7684\uff1b location \u662f\u8be5\u5143\u7d20\u6309\u94ae\u7684\u76f8\u5bf9\u4e0e\u53c2\u8003\u7cfb\u7684 x, y \u7684\u8ddd\u79bb\uff0c\u53ca\u5927\u5c0f(w, h)\uff0c\u8fd9\u56db\u4e2a\u6570\u636e\u53ef\u4ee5\u901a\u8fc7 UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\u6570\u636e\uff0c\u5728\u7f16\u8f91\u6a21\u5f0f\u4e0b\uff0c\u70b9\u51fb UI \u56fe\u4e0a\u7684\u6309\u94ae\uff0c\u53f3\u4fa7\u5c31\u4f1a\u51fa\u73b0\u8be5\u5143\u7d20\u6309\u94ae\u7684 x, y, w, h \u6570\u636e\u3002 \u5982\u679c UI \u56fe\u4e0a\u6ca1\u6709\u63d0\u4f9b\u4f60\u60f3\u8981\u7684\u5143\u7d20\u6570\u636e\uff0c\u4f60\u53ef\u4ee5\u76f4\u63a5\u5728\u7cfb\u7edf\u4e2d\u4f7f\u7528\u622a\u56fe\u5f55\u5c4f\u8fdb\u884c\u5c3a\u91cf\uff0c\u8fd9\u662f\u4e00\u79cd\u4e0d\u63a8\u8350\u4f46\u80fd\u7528\u7684\u65b9\u6cd5\u3002 \u3010\u8c03\u7528\u65b9\u6cd5\u3011 \u5728\u5e94\u7528\u5e93\u65b9\u6cd5\u5c42\u8fd9\u6837\u5199\uff1a def click_add_music_list_btn_in_music_by_ui(self):\n\"\"\"\u70b9\u51fb\u65b0\u5efa\u6b4c\u5355\u6309\u94ae\"\"\"\nself.click(*self.ui.btn_center(\"\u65b0\u5efa\u6b4c\u5355+\"))\n self.ui.btn_center() \u662f\u56fa\u5b9a\u5199\u6cd5\uff0c\u53c2\u6570\u5c31\u662f\u914d\u7f6e\u91cc\u9762\u7684 section \u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ocr","title":"\u56db\u3001OCR \u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_2","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 OCR \u65b9\u6848\u5927\u591a\u91c7\u7528\u8c37\u6b4c OCR\uff08Tesseract\uff09\u65b9\u6848\uff0c\u4f46\u662f\u5b83\u5bf9\u4e8e\u4e2d\u6587\u7684\u8bc6\u522b\u975e\u5e38\u5dee\uff0c\u7ecf\u8fc7\u5927\u91cf\u7684\u8c03\u7814\uff0c\u6211\u4eec\u4f7f\u7528 PaddleOCR\uff0c\u5b83\u662f\u4e00\u4e2a\u5f00\u6e90\u7684\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u8bc6\u522b\u5de5\u5177\uff0c\u4e5f\u662f PaddlePaddle \u6700\u6709\u540d\u7684\u4e00\u4e2a\u5f00\u6e90\u9879\u76ee\uff0c\u611f\u5174\u8da3\u7684\u53ef\u4ee5\u70b9\u8fd9\u91cc\u4e86\u89e3\uff0c\u591a\u7684\u4e0d\u8bf4\u4e86\uff0c\u4f60\u53ea\u9700\u8981\u77e5\u9053\u5b83\u5c31\u662f\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_2","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5b89\u88c5\u4ed6\u662f\u4e2a\u5f88\u9ebb\u70e6\u7684\u4e8b\u60c5\uff0c\u867d\u7136\u64cd\u4f5c\u5f88\u7b80\u5355\uff0c\u4f46\u5176\u5b9e\u5b89\u88c5\u5305\u6709\u70b9\u5927\uff0c\u56e0\u6b64\u6211\u4eec\u4e0d\u5e0c\u671b\u76f4\u63a5\u5728 env.sh \u4e2d\u52a0\u5165\u5b83\uff0c\u8fd9\u4f1a\u8ba9\u6574\u4e2a\u81ea\u52a8\u5316\u73af\u5883\u53d8\u5f97\u975e\u5e38\u81c3\u80bf\uff1b \u56e0\u6b64\uff0c\u6211\u4eec\u60f3\u5230\u5c06\u5b83\u505a\u6210\u4e00\u4e2a RPC \u670d\u52a1\u5728\u5176\u4ed6\u673a\u5668\u4e0a\u90e8\u7f72\uff0c\u6d4b\u8bd5\u673a\u901a\u8fc7\u8fdc\u7a0b\u8c03\u7528 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u4f7f\u7528\u5b83\uff1b RPC \u7684\u8c03\u7528\u903b\u8f91\uff1a \u8fd9\u6837\u6211\u4eec\u53ea\u9700\u8981\u5728\u670d\u52a1\u7aef\u90e8\u7f72\u597d OCR \u8bc6\u522b\u7684\u670d\u52a1\uff0c\u7136\u540e\u901a\u8fc7 RPC \u670d\u52a1\u5c06\u529f\u80fd\u63d0\u4f9b\u51fa\u6765\uff0c\u6846\u67b6\u91cc\u9762\u53ea\u9700\u8981\u8c03\u7528\u5bf9\u5e94\u7684 RPC \u63a5\u53e3\u5c31\u884c\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_1","title":"3\u3001\u4f7f\u7528\u8bf4\u660e","text":"\u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nfrom paddleocr import PaddleOCR\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef paddle_ocr(pic_path, lang):\n\"\"\"\n Paddleocr\u76ee\u524d\u652f\u6301\u7684\u591a\u8bed\u8a00\u8bed\u79cd\u53ef\u4ee5\u901a\u8fc7\u4fee\u6539lang\u53c2\u6570\u8fdb\u884c\u5207\u6362\n \u4f8b\u5982`ch`, `en`, `fr`, `german`, `korean`, `japan`\n :param file_name:\n :param lang:\n :return:\n \"\"\"\nif __name__ == \"__main__\":\nIP = popen(\"hostname -I\").read().split(\" \")[0]\nPORT = 8890\nSCREEN_CACHE = \"/tmp/screen.png\"\nserver = ThreadXMLRPCServer((IP, PORT), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(paddle_ocr, \"paddle_ocr\")\nprint(\"\u76d1\u542c\u5ba2\u6237\u7aef\u8bf7\u6c42\u3002\u3002\")\nserver.serve_forever()\n \u6846\u67b6\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from src import OCR\nOCR.ocr(*target_strings, picture_abspath=None, similarity=0.6, return_default=False, return_first=False, lang=\"ch\"):\n# \u901a\u8fc7 OCR \u8fdb\u884c\u8bc6\u522b\u3002\n# target_strings:\n# \u76ee\u6807\u5b57\u7b26,\u8bc6\u522b\u4e00\u4e2a\u5b57\u7b26\u4e32\u6216\u591a\u4e2a\u5b57\u7b26\u4e32,\u5e76\u8fd4\u56de\u5176\u5728\u56fe\u7247\u4e2d\u7684\u5750\u6807;\n# \u5982\u679c\u4e0d\u4f20\u53c2\uff0c\u8fd4\u56de\u56fe\u7247\u4e2d\u8bc6\u522b\u5230\u7684\u6240\u6709\u5b57\u7b26\u4e32\u3002\n# picture_abspath: \u8981\u8bc6\u522b\u7684\u56fe\u7247\u8def\u5f84\uff0c\u5982\u679c\u4e0d\u4f20\u9ed8\u8ba4\u622a\u53d6\u5168\u5c4f\u8bc6\u522b\u3002\n# similarity: \u5339\u914d\u5ea6\u3002\n# return_default: \u8fd4\u56de\u8bc6\u522b\u7684\u539f\u751f\u6570\u636e\u3002\n# return_first: \u53ea\u8fd4\u56de\u7b2c\u4e00\u4e2a,\u9ed8\u8ba4\u4e3a False,\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u6240\u6709\u6570\u636e\u3002\n# lang: `ch`, `en`, `fr`, `german`, `korean`, `japan`\n \u6b64\u65b9\u6848\u5728\u6846\u67b6\u5185\u6ca1\u6709\u5f15\u5165\u4efb\u4f55\u4e09\u65b9\u4f9d\u8d56\u5b8c\u5168\u91c7\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\uff0c\u800c\u4e14\u4f7f\u7528\u65b9\u6cd5\u975e\u5e38\u7b80\u5355\uff0c\u53ea\u9700\u8981\u901a\u8fc7 OCR.ocr() \u5373\u53ef\uff1b \u5bf9\u4e8e\u4e00\u4e9b\u6587\u6848\u7684\u573a\u666f\u975e\u5e38\u9002\u7528\uff0c\u6b64\u65b9\u6cd5\u76f4\u63a5\u8fd4\u56de\u5750\u6807\uff0c\u53ef\u4ee5\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u3002 \u4e5f\u53ef\u4ee5\u7528\u4e8e\u6587\u5b57\u65ad\u8a00\uff0c\u4ee3\u7801\u793a\u610f\uff1a def assert_ocr_exist(\n*args, picture_abspath=None, similarity=0.6, return_first=False, lang=\"ch\"\n):\n\"\"\"\u65ad\u8a00\u6587\u6848\u5b58\u5728\"\"\"\npic = None\nif picture_abspath is not None:\npic = picture_abspath + \".png\"\nres = OCR.ocr(\n*args,\npicture_abspath=pic,\nsimilarity=similarity,\nreturn_first=return_first,\nlang=lang,\n)\nif res is False:\nraise AssertionError(\n(f\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{args}\", f\"{pic if pic else GlobalConfig.SCREEN_CACHE}\")\n)\nif isinstance(res, tuple):\npass\nelif isinstance(res, dict) and False in res.values():\nres = filter(lambda x: x[1] is False, res.items())\nraise AssertionError(\n(\nf\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{dict(res)}\",\nf\"{pic if pic else GlobalConfig.SCREEN_CACHE}\",\n)\n)\n \u5728\u7528\u4f8b\u4e2d\u4f7f\u7528\u65ad\u8a00\uff0c\u793a\u4f8b\uff1a def test_font_manager_021(self):\n\"\"\"\u53f3\u4fa7\u2665-\u6536\u85cf/\u53d6\u6d88\u6536\u85cf\u5b57\u4f53\"\"\"\n# \u5b57\u4f53\u7ba1\u7406\u5668\u754c\u9762\u53f3\u4fa7\u8be6\u60c5\u5217\u8868\uff0c\u9009\u62e9\u672a\u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e / \u6536\u85cf\u5b57\u4f53\n# \u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e\u83dc\u5355\u663e\u793a\u201c\u53d6\u6d88\u6536\u85cf\u201d\uff1b\n...\nself.assert_ocr_exist(\"\u53d6\u6d88\u6536\u85cf\")\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_1","title":"4\u3001\u670d\u52a1\u7aef\u90e8\u7f72","text":"\u6211\u4eec\u76ee\u524d\u662f\u5c06 OCR \u670d\u52a1\u90e8\u7f72\u5728\u666e\u901a\u7684\u529e\u516c\u673a\u4e0a\u7684\uff0c\u5982\u679c\u4f60\u89c9\u5f97\u73b0\u6709\u7684 OCR \u8bc6\u522b\u6027\u80fd\u4e0d\u591f\u597d\uff0c\u6070\u597d\u4f60\u6709\u66f4\u597d\u7684\u673a\u5668\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u5176\u79c1\u6709\u5316\u90e8\u7f72\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41_1","title":"4.1\u3001\u73af\u5883\u5b89\u88c5","text":"\u63a8\u8350\u4f7f\u7528 pipenv \u8fdb\u884c\u73af\u5883\u642d\u5efa\uff1b \u5b89\u88c5 pipenv \uff1a sudo pip3 install pipenv\n \u65b0\u5efa\u4e00\u4e2a\u76ee\u5f55\u4f5c\u4e3a\u73af\u5883\u5305 ocr_env\uff1a cd ~\nmkdir ocr_env\n \u521b\u5efa python 3.7 \u73af\u5883\uff1a cd ocr_env\npipenv --python 3.7\n \u5b89\u88c5 OCR \u4f9d\u8d56\u5305\uff1a pipenv install paddlepaddle -i https://mirror.baidu.com/pypi/simple\npipenv install \"paddleocr>=2.0.1\" -i https://mirror.baidu.com/pypi/simple\n \u4e0d\u51fa\u610f\u5916\uff0c\u8fd9\u6837\u5c31\u628a\u4f9d\u8d56\u5b89\u88c5\u597d\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42_1","title":"4.2\u3001\u542f\u52a8\u670d\u52a1","text":"\u5c06\u57fa\u7840\u6846\u67b6\u4e2d\u7684 scr/ocr/pdocr_rpc_server.py \u6587\u4ef6\u62f7\u8d1d\u5230 ocr_env \u76ee\u5f55\uff0c\u540e\u53f0\u6267\u884c\u5b83\u5c31\u597d\u4e86\uff1a cd ocr_env\nnohup pipenv run python pdocr_rpc_server.py &\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#43","title":"4.3\u3001\u914d\u7f6e\u5f00\u673a\u81ea\u542f\uff08\u901a\u7528\uff09","text":"\u4f60\u80af\u5b9a\u4e0d\u60f3\u6bcf\u6b21\u673a\u5668\u91cd\u542f\u4e4b\u540e\u90fd\u9700\u8981\u624b\u52a8\u542f\u52a8\u670d\u52a1\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u914d\u7f6e\u5f00\u673a\u81ea\u542f\u3002 \u5199\u5f00\u673a\u81ea\u542f\u670d\u52a1\u6587\u4ef6\uff1a sudo vim /lib/systemd/system/ocr.service\n autoocr \u540d\u79f0\u4f60\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff0c\u5199\u5165\u4ee5\u4e0b\u5185\u5bb9\uff1a [Unit]\nDescription=OCR Service\nAfter=multi-user.target\n\n[Service]\nUser=uos\nGroup=uos\nType=idle\nWorkingDirectory=/home/uos/ocr_env\nExecStart=pipenv run python pdocr_rpc_server.py\n\n[Install]\nWantedBy=multi-user.target\n \u6ce8\u610f\u66ff\u6362\u4f60\u7684${USER} \u4fee\u6539\u914d\u7f6e\u6587\u4ef6\u7684\u6743\u9650\uff1a sudo chmod 644 /lib/systemd/system/ocr.service\n \u81ea\u542f\u670d\u52a1\u751f\u6548\uff1a sudo systemctl daemon-reload\nsudo systemctl enable ocr.service\n \u67e5\u770b\u670d\u52a1\u72b6\u6001\uff1a sudo systemctl status ocr.service\n \u4f60\u53ef\u4ee5\u518d\u91cd\u542f\u4e0b\u7535\u8111\uff0c\u770b\u770b\u670d\u52a1\u662f\u4e0d\u662f\u6b63\u5e38\u542f\u52a8\u4e86\uff0c\u6ca1\u62a5\u9519\u5c31 OK \u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_4","title":"\u4e94\u3001\u5c5e\u6027\u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_3","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 UI \u81ea\u52a8\u5316\u5927\u591a\u90fd\u662f\u57fa\u4e8e\u6d4f\u89c8\u5668\u7684\uff0c\u6838\u5fc3\u662f\u5728\u7f51\u9875\u7684 DOM \u6811\u4e0a\u67e5\u627e\u5143\u7d20\uff0c\u5e76\u5bf9\u5176\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\uff1b Linux \u684c\u9762\u5e94\u7528\u5927\u591a\u662f\u91c7\u7528 Qt \u7f16\u5199\u7684\uff0c\u5728 Qt \u4e2d\u4e5f\u662f\u4ece\u6700\u9876\u5c42\u7684 MainWindow \u5f00\u59cb\u6784\u5efa\u5e94\u7528\uff0c\u6240\u4ee5\u903b\u8f91\u4e5f\u662f\u4e00\u6837\u7684\uff0cQt \u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u540c\u6837\u53ef\u4ee5\u901a\u8fc7 DOM \u6811\uff08\u5c5e\u6027\u6811\uff09\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff0c\u6211\u4eec\u79f0\u4e4b\u4e3a\u5c5e\u6027\u5b9a\u4f4d\u3002 \u501f\u52a9\u5f00\u6e90\u5de5\u5177 dogtail \u6211\u4eec\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u83b7\u53d6\uff0c\u4ece\u800c\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\u3002dogtail \u7684\u9879\u76ee\u4ecb\u7ecd\u53ef\u4ee5\u731b\u6233\u8fd9\u91cc\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_3","title":"2\u3001\u4f7f\u7528\u65b9\u6cd5","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#21sniff","title":"2.1\u3001sniff\uff08\u55c5\u63a2\u5668\uff09\u4f7f\u7528","text":"\u5728\u7ec8\u7aef\u8f93\u5165 sniff \u542f\u52a8 AT-SPI Browser mikigo@mikigo-PC:~$ sniff\n \u67e5\u770b\u5e94\u7528\u7684\u6807\u7b7e \u5728 sniff \u91cc\u9762\u53ef\u4ee5\u770b\u5230\u7cfb\u7edf\u4e2d\u5df2\u542f\u52a8\u7684\u5e94\u7528\uff0c\u70b9\u51fb\u5e94\u7528\u540d\u79f0\u524d\u9762\u7684\u4e09\u89d2\u5f62\u56fe\u6807\uff0c\u53ef\u4ee5\u5c55\u5f00\u5e94\u7528\u7684\u6807\u7b7e\uff0c\u6240\u6709\u6807\u7b7e\u4ee5 tree \u7684\u5f62\u5f0f\u5c55\u793a\uff0c\u5bf9\u5e94\u5e94\u7528\u91cc\u9762\u7684\u7236\u7a97\u53e3\u548c\u5b50\u7a97\u53e3\u3002 \u83b7\u53d6\u5143\u7d20\u63a7\u4ef6\u7684\u6807\u7b7e\u540d\u79f0 \u9996\u5148\uff0c\u4e3a\u4e86\u65b9\u4fbf\u67e5\u770b\u5143\u7d20\u63a7\u4ef6\u5bf9\u5e94\u7684\u4f4d\u7f6e\uff0c\u5efa\u8bae\u73b0\u5728\u4e0a\u65b9\u5de5\u5177\u680f\u70b9\u51fb Actions\uff0c\u7136\u540e\u52fe\u9009 Hightlight Items\uff0c\u8fd9\u6837\u5728 sniff \u4e2d\u9f20\u6807\u9009\u4e2d\u5143\u7d20\u6807\u7b7e\u7684\u65f6\u5019\uff0c\u5e94\u7528\u4e2d\u4f1a\u6709\u76f8\u5e94\u7684\u5149\u6807\u9501\u5b9a\u3002 \u5728 sniff \u91cc\u9762\u70b9\u51fb\u8fdb\u5165\u5e94\u7528\u7684\u6807\u7b7e tree \u4e2d\u540e\uff0c\u70b9\u51fb\u76f8\u5e94\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5728\u5de5\u5177\u4e0b\u65b9\uff0c\u4f1a\u5c55\u793a\u5143\u7d20\u63a7\u4ef6\u7684 Name\uff0c\u8fd9\u4e2a\u5c31\u662f\u6807\u7b7e\u540d\u79f0\u3002 \u5728 tree \u4e2d\u6709\u4e9b\u5730\u65b9\u662f\u7a7a\u767d\u7684\u6216\u8005\u662f Form\uff0c\u662f\u56e0\u4e3a\u5f00\u53d1\u4eba\u5458\u5728\u6dfb\u52a0\u6807\u7b7e\u7684\u65f6\u5019\u6ca1\u6709\u6dfb\u52a0\uff0c\u6216\u8005\u6709\u4e9b\u7236\u7a97\u53e3\u4e0d\u9700\u8981\u6dfb\u52a0\uff0c\u8fd9\u79cd\u5728\u5b9e\u9645\u4e1a\u52a1\u4e2d\u662f\u4e0d\u5f71\u54cd\u7684\uff0c\u6211\u4eec\u53ea\u8981\u4fdd\u8bc1\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\u4e2d\uff0c\u8981\u7528\u5230\u7684\u5143\u7d20\u90fd\u6dfb\u52a0\u4e86\u6807\u7b7e\u5373\u53ef\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#22","title":"2.2\u3001\u5143\u7d20\u64cd\u4f5c","text":"\u83b7\u53d6\u5e94\u7528\u5bf9\u8c61 dogtail \u83b7\u53d6\u5e94\u7528\u5bf9\u8c61\u7684\u65f6\u5019\uff0c\u4f7f\u7528\u7684\u662f tree \u5e93\u91cc\u9762\u7684 application() \u65b9\u6cd5\uff1a from dogtail.tree import root\napp_obj = root.application('deepin-music')\n app_obj\u5c31\u662f\u5e94\u7528\u7684\u5bf9\u8c61\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\uff0c\u662f\u5e94\u7528\u5bf9\u8c61\u4f7f\u7528child()\u65b9\u6cd5\uff1a element = app_obj.child('element_name')\n \u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u4f20\u5165\u5143\u7d20\u7684 Name\uff0c\u83b7\u53d6\u5230\u76f8\u5e94\u5143\u7d20\u7684\u5bf9\u8c61\u3002Name \u53ef\u4ee5\u901a\u8fc7 sniff \u67e5\u770b\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\u5217\u8868: element_list = element.children\n \u83b7\u53d6\u5230\u8fd9\u4e2a\u5143\u7d20\u4e0b\u9762\u6240\u6709\u7684\u5143\u7d20\u5217\u8868\u3002 \u8fd9\u4e2a\u65b9\u6cd5\u9002\u7528\u4e8e\u6709\u4e9b\u6807\u7b7e\u6ca1\u6709\u6dfb\u52a0\uff0c\u4f46\u662f\u4f4d\u7f6e\u662f\u56fa\u5b9a\u7684\uff0c\u6211\u4eec\u901a\u8fc7\u7d22\u5f15\u53ef\u4ee5\u53d6\u5f97\u5143\u7d20\u3002 element_list[0]\n \u5bf9\u5143\u7d20\u7684\u64cd\u4f5c \u5728\u83b7\u53d6\u5230\u5143\u7d20\u4e4b\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u76f8\u5e94\u7684\u64cd\u4f5c\u3002 \u5355\u51fb element.click(button=1)\n button 1 \u2014>\u5de6\u952e\uff0c2 \u2014>\u6eda\u8f6e\uff0c3 \u2014>\u53f3\u952e\uff0c\u9ed8\u8ba4\u4e3a 1 \u53cc\u51fb element.doubleClick(button=1)\n \u9f20\u6807\u60ac\u505c element.point()\n \u9f20\u6807\u79fb\u52a8\u5230\u5143\u7d20\u4e2d\u5fc3\u4f4d\u7f6e \u6587\u672c\u8f93\u5165 element.typeText(string)\n \u5411\u5143\u7d20\u5bf9\u8c61\u8f93\u5165\u5b57\u7b26\u4e32 \uff0c\u6bd4\u5982\u8f93\u5165\u6846 \u7ec4\u5408\u952e element.keyCombo(comboString)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#23","title":"2.3\u3001\u6846\u67b6\u5c01\u88c5","text":"\u4ee3\u7801\u793a\u4f8b\uff1a # \u8be6\u7ec6\u4ee3\u7801\u8bf7\u67e5\u770b src/dogtail_utils.py\nclass DogtailUtils:\ndef __init__(self, name=None, description=None):\nself.name = name\nself.description = description\nself.obj = root.application(self.name, self.description)\ndef app_element(self, *args, **kwargs):\n\"\"\"\n \u83b7\u53d6app\u5143\u7d20\u7684\u5bf9\u8c61\n :return: \u5143\u7d20\u7684\u5bf9\u8c61\n \"\"\"\nreturn self.obj.child(*args, **kwargs, retry=False)\ndef element_center(self, element) -> tuple:\n\"\"\"\n \u83b7\u53d6\u5143\u7d20\u7684\u4e2d\u5fc3\u4f4d\u7f6e\n :param element:\n :return: \u5143\u7d20\u4e2d\u5fc3\u5750\u6807\n \"\"\"\n_x, _y, _w, _h = self.app_element(element).extents\n_x = _x + _w / 2\n_y = _y + _h / 2\nreturn _x, _y\n \u6846\u67b6\u63d0\u4f9b\u7684\u63a5\u53e3\u975e\u5e38\u7b80\u6d01\uff0c\u5728\u8c03\u7528\u65f6\uff1a self.dog.element_center(\"\u64ad\u653e\")\n \u8fd9\u6837\u5c31\u80fd\u83b7\u53d6\u5230\u6b64\u5143\u7d20\u7684\u4e2d\u5fc3\u5750\u6807\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_5","title":"\u516d\u3001\u6807\u7b7e\u5316\u7ba1\u7406","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_4","title":"1\u3001\u6807\u7b7e\u8bf4\u660e","text":"\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u811a\u672c ID\uff1a\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c/\u51fd\u6570 ID\uff1b PMS\u7528\u4f8bID\uff1aPMS \u4e0a\u5bf9\u5e94\u7684\u7528\u4f8b ID\uff08\u7528\u4f8b\u5e93 ID\uff09\uff1b \u9ed8\u8ba4\u4f7f\u7528\u7528\u4f8b\u5e93 ID\uff0c\u5bf9\u4e8e\u6682\u65f6\u6ca1\u6709\u4f7f\u7528\u7528\u4f8b\u5e93\u7ba1\u7406\u7528\u4f8b\u7684\u9879\u76ee\uff0c\u53ef\u4ee5\u4f7f\u7528\u4ea7\u54c1\u5e93\u7528\u4f8b ID\uff1b \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1aFUNC\uff08\u529f\u80fd\uff09\u3001API\uff08\u63a5\u53e3\uff09\u3001BASELINE\uff08\u57fa\u7ebf\uff09\u3001PERF\uff08\u6027\u80fd\uff09\u3001STR\uff08\u538b\u529b\uff09\u3001SEC\uff08\u5b89\u5168\uff09\u3001CTS\uff08\u517c\u5bb9\u6027\uff09 \u4e0a\u7ebf\u5bf9\u8c61\uff1aCICD\uff0c\u8868\u793a\u4e0a\u7ebf\u5230 CICD \u6d41\u6c34\u7ebf\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u53ef\u4e00\u952e\u751f\u6210 case_list.csv \u6587\u4ef6\uff0c\u7528\u4e8e\u5bfc\u5165\u5230\u660e\u9053\u4e91 AT \u7528\u4f8b\u5217\u8868\u4e2d\u63a7\u5236 CICD \u8dd1\u6d4b\u8303\u56f4\uff1b \u6d4b\u8bd5\u7ea7\u522b\uff1aC1 / C2 / C3 / C4\uff0c\u5177\u4f53\u5b9a\u4e49\u53c2\u8003\u6d41\u6c34\u7ebf\u4f7f\u7528\u6307\u5bfc\uff1b \u8df3\u8fc7\u539f\u56e0\uff1askip-XXX\uff0c\u7528\u4e8e\u63a7\u5236\u7528\u4f8b\u662f\u5426\u6267\u884c\uff1b \u786e\u8ba4\u4fee\u590d\uff1afixed-XXX\uff0c\u7528\u4e8e\u6807\u8bb0\u7528\u4f8b\u7684\u4fee\u590d\u72b6\u6001\uff08\u540e\u9762\u8be6\u7ec6\u8bb2\u89e3\u7528\u6cd5\uff09\uff1b \u5e9f\u5f03\u7528\u4f8b\uff1aremoved-\u5df2\u5e9f\u5f03\uff0c\u7528\u4e8e\u6807\u8bb0\u5df2\u7ecf\u5e9f\u5f03\u7684\u7528\u4f8b\uff0c\u6b64\u7528\u4f8b\u6807\u7b7e\u4e0d\u4f1a\u88ab\u6dfb\u52a0\uff0c\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff1b \u793a\u4f8b\uff1a \u811a\u672cID PMS\u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u4e0a\u7ebf\u5bf9\u8c61 \u6d4b\u8bd5\u7ea7\u522b \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b ... 001 679537 L1 FUNC CICD C1 skip-XXX fixed-XXX removed-\u5df2\u5e9f\u5f03 ..."},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_4","title":"2\u3001\u64cd\u4f5c\u6b65\u9aa4","text":"2.1\u3001\u5728\u5b50\u9879\u76ee\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u4ee5\u7528\u4f8b\u7684 py \u6587\u4ef6\u9664\u53bb\u9996\u5b57\u7b26\u4e32 \"test_\" \u548c\u7528\u4f8b\u5e8f\u53f7\u540e\u7684\u5b57\u7b26\u4e32\u4f5c\u4e3a csv \u7684\u6587\u4ef6\u540d\u3002 \u4f8b\u5982: \u76f8\u518c\u7684\u7528\u4f8b\u6587\u4ef6\u4e3a test_album_xxx.py\uff0cxxx \u8868\u793a\u4efb\u610f\u4e09\u4f4d\u6570\u5b57\u4ee3\u8868\u7528\u4f8b\u5e8f\u53f7\uff0c\u6b64\u65f6 csv \u6587\u4ef6\u540d\u5c31\u5e94\u4e3a album.csv\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u6240\u6709 csv \u6587\u4ef6\u5efa\u8bae\u653e\u5728\u4e00\u4e2a tags \u76ee\u5f55\u4e0b\u3002 \u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 2.2\u3001\u7b2c\u4e00\u5217\u4e3a\u811a\u672c ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b\u7528\u4f8b\u6807\u7b7e\u53ef\u4ee5\u65e0\u5e8f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_2","title":"3\u3001\u589e\u52a0\u8bf4\u660e","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_1","title":"3.1\u3001\u8df3\u8fc7\u7528\u4f8b","text":"\u4f20\u7edf\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668(@pytest.mark.skip)\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a; \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#311","title":"3.1.1\u3001\u56fa\u5b9a\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u7b7e\u5f00\u5934\u4e3a \u201cskip-XXX\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\uff0c\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\u5219\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u7b7e\u4e3a SKIPED\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#312","title":"3.1.2\u3001\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skipif_platform-aarch64&mips64 \u67d0\u4e9b\u7528\u4f8b\u4f1a\u56e0\u4e3a\u4e0d\u540c\u7684\u73af\u5883\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\uff0c\u5e38\u89c1\u7684\u573a\u666f\u4e3a\u5728\u4e0d\u540c\u67b6\u6784\u4e0a\u5224\u65ad\u662f\u5426\u6267\u884c\uff0c\u8df3\u8fc7\u7684\u539f\u56e0\u6807\u7b7e\u4e3a \u201cskipif_platform-\u201d \u52a0\u67b6\u6784\u540d\uff0c\u591a\u4e2a\u67b6\u6784\u4e4b\u95f4\u4f7f\u7528 \u201c&\u201d \u62fc\u63a5\uff1b \u4ee5\u4e0a\u4f8b\u5b50\u4e3a\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u5224\u65ad\u5f53\u524d\u67b6\u6784\u662f\u5426\u4e3a arrch64 \u6216\u8005 mips64\uff0c\u82e5\u662f\uff0c\u5219\u8df3\u8fc7\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u82e5\u5426\u5219\u6267\u884c\u7528\u4f8b\uff1b \u76ee\u524d\u6846\u67b6\u9ed8\u8ba4\u4ec5\u652f\u6301\u67b6\u6784\u7684\u6761\u4ef6\u5224\u65ad\uff0c\u4f46\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u903b\u8f91\u652f\u6301\u81ea\u5b9a\u4e49\u6dfb\u52a0\u3002 \u5728\u9879\u76ee\u76ee\u5f55\u8def\u5f84\u4e0b\u5b58\u5728\u6587\u4ef6 setting/skipif.py\uff0c\u6240\u6709\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u7684\u51fd\u6570\u5199\u5728\u6b64\u6587\u4ef6\u4e2d\u3002 \u9ed8\u8ba4\u67b6\u6784\u5224\u65ad\u4f8b\u5b50\uff1a def skipif_platform(args: str):\n\"\"\"\u5e73\u53f0\u8df3\u8fc7\"\"\"\n_skip_key = args.split(\"&\")\nfor key in _skip_key:\nif GlobalConfig.SYS_ARCH == key:\nreturn True\nreturn False\n \u65b9\u6cd5\u7f16\u5199\u89c4\u8303\uff1a \u65b9\u6cd5\u540d\u5fc5\u987b\u4ee5 skipif \u5f00\u5934\uff1b \u65b9\u6cd5\u5fc5\u987b\u6709\u8fd4\u56de\u7ed3\u679c\u5e76\u4e14\u4e3a\u5e03\u5c14\u503c\uff08True \u4ee3\u8868\u8df3\u8fc7\uff0cFalse \u4ee3\u8868\u4e0d\u8df3\u8fc7\uff09\uff1b \u65b9\u6cd5\u53ea\u80fd\u6709\u4e00\u4e2a\u5165\u53c2\uff1b \u5728 csv \u6587\u4ef6\u8df3\u8fc7\u539f\u56e0\u4e00\u680f\u4e2d\u586b\u5199\u4e3a \u201c{\u51fd\u6570\u540d}-{\u53c2\u6570}\u201d\uff0c\u4f8b\u5982\uff1askipif_platform-aarch64\uff1b\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u4f1a\u4ee5\u7b2c\u4e00\u4e2a \u201c-\u201d \u8fdb\u884c\u5206\u5272\uff0c\u622a\u53d6\u7684\u5de6\u4fa7\u5b57\u7b26\u4e32\u4f5c\u4e3a\u51fd\u6570\u540d\uff0c\u5728 skipif.py \u6587\u4ef6\u4e2d\u67e5\u627e\u662f\u5426\u6709\u540c\u540d\u51fd\u6570\uff0c\u5e76\u5c06\u622a\u53d6\u7684\u53f3\u4fa7\u4f5c\u4e3a\u53c2\u6570\u4f20\u9012\u7ed9\u8be5\u51fd\u6570\uff0c\u901a\u8fc7\u83b7\u53d6\u8be5\u51fd\u6570\u8fd4\u56de\u7684\u5e03\u5c14\u503c\uff0c\u8fd4\u56de True\uff0c\u5219\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u8fd4\u56de False\uff0c\u5219\u6267\u884c\u8be5\u7528\u4f8b\u3002 \u82e5\u51fd\u6570\u9700\u8981\u591a\u4e2a\u53c2\u6570\uff0c\u53ef\u81ea\u5b9a\u4e49\u591a\u4e2a\u53c2\u6570\u4e4b\u95f4\u7684\u8fde\u63a5\u7b26\uff0c\u8fde\u63a5\u7b26\u53f7\u4e0d\u53ef\u4f7f\u7528\u4e0b\u5212\u7ebf\u548c\u9017\u53f7\uff0c\u63a8\u8350\u7edf\u4e00\u4f7f\u7528 & \u7b26\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32","title":"3.2\u3001\u786e\u8ba4\u4fee\u590d","text":"\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7528\u4f8b\u4fee\u590d\u540e\uff0c\u4f46\u4e0d\u80fd\u7acb\u5373\u5220\u9664\u8df3\u8fc7\u539f\u56e0\uff08skip-XXX\uff09\u7684\u7528\u4f8b\uff0c\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u786e\u8ba4\u4fee\u590d\u201d\uff0c\u4f5c\u4e3a\u6807\u8bb0\u8be5\u7528\u4f8b\u662f\u5426\u5df2\u7ecf\u4fee\u590d\uff0c\u56fa\u5b9a\u586b\u5165\u5b57\u6bb5\u4e3a \u201cfixed-\u5df2\u4fee\u590d\u201d\u3002\u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u5373\u4f7f\u540c\u65f6\u6807\u8bb0\u4e86 skip-XXX \u4e5f\u4f1a\u6b63\u5e38\u6267\u884c\u3002 \u793a\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d \u3010\u540c\u65f6\u6807\u8bb0\u4e86skip \u548c fixed\uff0c\u4f46\u4ecd\u7136\u60f3\u8981\u8df3\u8fc7\u7528\u4f8b\u3011 \u5f53 \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u540c\u65f6\u586b\u5165\u540e\uff0c\u547d\u4ee4\u884c\u4f20\u9012\u53c2\u6570 --ifixed yes\uff0c\u5219\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\u8be5\u6761\u7528\u4f8b\u3002 python3 manage.py run --ifixed yes\n \u770b\u5230\u8fd9\u91cc\u6709\u4e9b\u540c\u5b66\u53ef\u80fd\u8981\u95ee\u4e86\uff0c\u6211\u60f3\u6062\u590d\u8df3\u8fc7\u6267\u884c\uff0c\u76f4\u63a5\u628a skip-XXX \u8fd9\u4e00\u5217\u6807\u7b7e\u5220\u6389\u4e0d\u5c31\u597d\u4e86\uff0c\u8fd8\u641e\u4ec0\u4e48\u786e\u8ba4\u4fee\u590d\u5e72\u5565\uff1f \u8fd9\u91cc\u7ed9\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u89e3\u91ca\u4e00\u4e0b\uff1a \uff08\u4ee5\u4e0b\u6d41\u6c34\u7ebf\u6307\u7684\u662f\u6bcf\u65e5\u6784\u5efa\u7684\u6d41\u6c34\u7ebf\uff0c\u8dd1 AT \u7684\u5168\u91cf\u7528\u4f8b\uff09 \u9996\u5148\uff0c\u6d41\u6c34\u7ebf\u4e0a\u8dd1\u7684\u662f AT \u5386\u53f2 Tag\uff0c\u8df3\u8fc7\u7528\u4f8b\u7684\u6807\u7b7e(skip-XXX) \u662f\u5728\u6700\u65b0\u7684\u4ee3\u7801\u4e0a\u63d0\u4ea4\u7684\uff0c\u6211\u4eec\u91c7\u7528\u6700\u65b0\u7684 csv \u6587\u4ef6\u8986\u76d6\u5386\u53f2 csv \u6587\u4ef6\u7684\u8bbe\u8ba1\u6765\u5b9e\u73b0\u4e86\u5bf9\u5386\u53f2 Tag \u4e0a\u7528\u4f8b\u7684\u8df3\u8fc7\uff1b \u7136\u540e\uff0c\u5728\u65e5\u5e38\u8df3\u8fc7\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u540c\u65f6\u4e5f\u5728\u4fee\u590d\u4e00\u4e9b\u7528\u4f8b\uff0c\u4fee\u590d\u540e\u7684\u8fd9\u4e9b\u7528\u4f8b\u5728\u672c\u5730\u8c03\u8bd5\u7684\u65f6\u5019\u6211\u4eec\u4e0d\u5e0c\u671b\u7ee7\u7eed\u8df3\u8fc7\uff0c\u4f46\u662f\u6b64\u65f6\uff0c\u4fee\u590d\u7684\u8fd9\u4e9b\u7528\u4f8b\u53ef\u80fd\u8fd8\u4e0d\u7a33\u5b9a\uff0c\u4e0d\u9002\u5408\u9a6c\u4e0a\u653e\u5230\u6d41\u6c34\u7ebf\u53bb\u8dd1\uff0c\u4e5f\u5c31\u662f\u8bf4\u6d41\u6c34\u7ebf\u4e0a\u6211\u4eec\u662f\u5e0c\u671b\u4ed6\u7ee7\u7eed\u8df3\u8fc7\u7684\uff0c\u56e0\u6b64\uff0c\u54b1\u4e0d\u80fd\u76f4\u63a5\u628a skip-XXX \u5e72\u6389\uff1b \u8fd9\u91cc\u5c31\u77db\u76fe\u4e86\uff0c\u4e00\u4e2a\u9700\u6c42\u662f\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u53e6\u4e00\u4e2a\u9700\u6c42\u53c8\u4e0d\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u600e\u4e48\u529e\u5462\uff1f \u6211\u4eec\u4f7f\u7528\u201c\u786e\u8ba4\u4fee\u590d\u201d\u6765\u6807\u8bb0\u8fd9\u6761\u7528\u4f8b\u5df2\u7ecf\u4fee\u590d\u4e86\uff0c\u8fd9\u6837\u4f60\u672c\u5730\u8c03\u8bd5\u7528\u4f8b\u7684\u65f6\u5019\u8fd9\u6761\u5df2\u4fee\u590d\u7684\u7528\u4f8b\u662f\u4f1a\u6267\u884c\u7684\uff0c\u540c\u65f6\u5728\u6d41\u6c34\u7ebf\u4e0a\u5c06 --ifixed yes \u53c2\u6570\u52a0\u4e0a\uff0c\u90a3\u4e48\u6d41\u6c34\u7ebf\u4e0a\u6267\u884c\u65f6\u8fd9\u6761\u7528\u4f8b\u4ecd\u7136\u662f\u8df3\u8fc7\u7684\u72b6\u6001\uff0c\u540e\u7eed\u4f60\u6253 Tag \u7684\u65f6\u5019\uff0c\u628a \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u7684\u6807\u7b7e\u5168\u90e8\u5220\u6389\u5c31\u53ef\u4ee5\u4e86\u3002 \u8fd9\u5c31\u662f\u201c\u786e\u8ba4\u4fee\u590d\u201d\u8fd9\u4e2a\u6807\u7b7e\u7684\u80cc\u666f\uff0c\u9700\u8981\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u54c1\u4e00\u54c1\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#33","title":"3.3\u3001\u5e9f\u5f03\u7528\u4f8b","text":"\u9488\u5bf9\u67d0\u4e9b\u7528\u4f8b\uff0c\u7531\u4e8e\u9700\u6c42\u53d8\u66f4\uff0c\u73af\u5883\u5f71\u54cd\u6216\u8bc4\u4f30\u4e0d\u518d\u9002\u7528\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u65f6\uff0c\u7528\u4f8b\u9700\u8981\u5e9f\u5f03\uff0c\u5219\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u5e9f\u5f03\u7528\u4f8b\u201d\uff0c\u8be5\u5217\u5b58\u5728 \u201cremoved-{\u5e9f\u5f03\u539f\u56e0}\u201d\uff0c\u5219\u7528\u4f8b\u4e0d\u4f1a\u6267\u884c\u3002 \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d removed-\u5df2\u5e9f\u5f03 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_2","title":"4\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u4e0a\u9762\u4ecb\u7ecd Pytest \u6846\u67b6\u63d0\u4f9b\u7684\u6807\u7b7e\u529f\u80fd mark\uff0c\u4f7f\u7528\u65f6\u9700\u8981\u4e3a\u6bcf\u4e00\u4e2a\u7528\u4f8b\u6dfb\u52a0\u6807\u7b7e\u88c5\u9970\u5668\uff0c\u5219\u64cd\u4f5c\u590d\u6742\uff0c\u53ef\u7ef4\u62a4\u6027\u5dee\uff0c\u5176\u6839\u672c\u95ee\u9898\u5c31\u662f\u6807\u7b7e\u5206\u6563\u5728\u6bcf\u4e00\u6761\u7528\u4f8b\u7684\u88c5\u9970\u5668\u4e0a\uff0c\u96be\u4ee5\u96c6\u4e2d\u7ef4\u62a4\uff1b\u4e8e\u662f\u4e4e\u5c06\u6240\u6709\u6807\u7b7e\u4f7f\u7528 csv \u6587\u4ef6\u8fdb\u884c\u96c6\u4e2d\u7ba1\u7406\uff0c\u5e76\u901a\u8fc7 Pytest \u7684\u94a9\u5b50\u51fd\u6570\uff0c\u8bfb\u53d6 csv \u6587\u4ef6\uff0c\u52a8\u6001\u6dfb\u52a0\u6807\u7b7e\u5230\u7528\u4e2d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5csv","title":"5\u3001CSV\u6587\u4ef6\u683c\u5f0f","text":"\u6b64\u914d\u7f6e\u6587\u4ef6\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u6807\u7b7e\u6570\u636e\uff0c\u4e14\u8981\u65b9\u4fbf\u80fd\u4f7f\u7528Excel\u6253\u5f00\u8fdb\u884c\u7f16\u8f91\u67e5\u770b\uff0c\u66f4\u91cd\u8981\u7684\u662f\u6211\u4eec\u4e0d\u60f3\u5f15\u5165\u4e09\u65b9\u4f9d\u8d56\uff0cCSV \u6587\u4ef6\u51e0\u4e4e\u662f\u552f\u4e00\u80fd\u6ee1\u8db3\u6240\u6709\u7684\u8981\u6c42\u7684\u6587\u4ef6\u683c\u5f0f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_6","title":"\u4e03\u3001\u65e5\u5fd7\u7cfb\u7edf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_5","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e YouQu \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u64cd\u4f5c\u65b9\u6cd5\u5c01\u88c5\u5199\u6cd5\uff0c\u901a\u5e38\u662f\u8fd9\u6837\u7684\uff1a\u7c7b\u91cc\u9762\u4e00\u4e2a\u51fd\u6570\u53ea\u5305\u542b\u4e00\u4e2a\u64cd\u4f5c\u6216\u591a\u6b21\u8c03\u7528\u7684\u4e00\u7cfb\u5217\u53ef\u5408\u5e76\u7684\u64cd\u4f5c\uff1b \u4f20\u7edf\u7684\u65e5\u5fd7\u8f93\u51fa\u65b9\u5f0f\uff0c\u9700\u8981\u5728\u6bcf\u4e2a\u51fd\u6570\u91cc\u9762\u4e3b\u52a8\u7f16\u5199\u65e5\u5fd7\u8f93\u51fa\u4ee3\u7801 \uff0c\u4f8b\u5982\uff1a class XXXWidget:\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\nlogger.info(\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\")\n...\n# \u7701\u7565\u4ee3\u7801\u90e8\u5206\n \u4e00\u4e2a\u51fd\u6570\u91cc\u9762\u81f3\u5c11\u5305\u542b\u4e00\u6761\u65e5\u5fd7\u4fe1\u606f\uff0c\u5982\u679c\u6bd4\u8f83\u590d\u6742\u64cd\u4f5c\u6b65\u9aa4\uff0c\u53ef\u80fd\u5305\u542b\u591a\u6761\u65e5\u5fd7\u4fe1\u606f\uff1b \u4e00\u4e2a\u5e94\u7528\u542b\u6709\u5927\u91cf\u7684\u64cd\u4f5c\u51fd\u6570\uff0c\u4e5f\u5c31\u662f\u8bf4\u6211\u4eec\u9700\u8981\u5199\u5927\u91cf\u7684\u65e5\u5fd7\u4ee3\u7801\uff1b \u901a\u8fc7\u7ecf\u9a8c\u89c2\u5bdf\uff0c\u6211\u4eec\u53d1\u73b0\uff0c\u51fd\u6570\u8bf4\u660e\u4ee5\u53ca\u51fd\u6570\u64cd\u4f5c\u65e5\u5fd7\uff0c\u5177\u6709\u8f83\u9ad8\u7684\u91cd\u590d\u5ea6\uff08\u4ece\u4e0a\u9762\u7684\u4f8b\u5b50\u4e5f\u53ef\u4ee5\u770b\u51fa\u6765\uff09\uff0c\u56e0\u6b64\u6211\u4eec\u5927\u80c6\u7684\u8bbe\u60f3\uff0c\u80fd\u4e0d\u80fd\u57fa\u4e8e\u6846\u67b6\u6267\u884c\u65f6\uff0c\u81ea\u52a8\u7684\u5c06\u51fd\u6570\u8bf4\u660e\u4f5c\u4e3a\u65e5\u5fd7\u6253\u5370\u51fa\u6765\uff0c\u4ece\u800c\u51cf\u5c11\u5927\u91cf\u65e5\u5fd7\u4ee3\u7801\u91cf\u548c\u91cd\u590d\u7f16\u5199\uff0c\u90a3\u771f\u662f\u5999\u554a~\u3002 \u57fa\u4e8e\u6b64\u201c\u5929\u771f\u201d\u7684\u60f3\u6cd5\uff0c\u6211\u4eec\u8bbe\u8ba1\u51fa\u4e86 youqu \u7684\u65e5\u5fd7\u7cfb\u7edf\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_5","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u6838\u5fc3\u539f\u7406\uff1a \u901a\u8fc7\u7ed9\u7c7b\u52a0\u4e0a\u4e00\u4e2a\u88c5\u9970\u5668 @log\uff0c\u52a8\u6001\u7ed9\u8be5\u7c7b\u4e0b\u6240\u6709\u7684\u51fd\u6570\u53ca\u7236\u7c7b\u51fd\u6570\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668 @_trace\uff0c\u5728\u6b64\u88c5\u9970\u5668\u4e2d\u6211\u4eec\u80fd\u52a8\u6001\u7684\u6355\u83b7\u6240\u8c03\u7528\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff08func.__doc__\uff09\uff0c\u901a\u8fc7\u65e5\u5fd7\u8f93\u51fa\u5668\u5c06\u5176\u8f93\u51fa\u5373\u53ef\u3002 \u5b9e\u73b0\u6b65\u9aa4\uff1a \u901a\u8fc7 inspect.getmembers \u83b7\u53d6\u88ab\u88c5\u9970\u7684\u7c7b\u4e0b\u6240\u6709\u51fd\u6570\uff0c\u5305\u542b\u9759\u6001\u65b9\u6cd5\uff0c\u7c7b\u65b9\u6cd5\uff0c\u5b9e\u4f8b\u65b9\u6cd5\uff1b \u901a\u8fc7 setattr(\u7c7b, \u65b9\u6cd5, _trace\uff09 \u7684\u65b9\u5f0f\uff0c\u7ed9\u7b26\u5408\u6761\u4ef6\u7684\u51fd\u6570\uff0c\u52a8\u6001\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_3","title":"3\u3001\u65e5\u5fd7\u914d\u7f6e","text":"[log_cli]\n;\u65e5\u5fd7\u76f8\u5173\u914d\u7f6e\uff08\u4e0d\u6253\u5370\u6784\u9020\u51fd\u6570\u548c\u9b54\u6cd5\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff09\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = INFO\n# ============= \u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u914d\u7f6e ================\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u5f00\u5934\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7, \u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_STARTSWITH = Assert\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u7ed3\u5c3e\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_ENDSWITH = Widget\n;\u652f\u6301\u7c7b\u540d\u5305\u542b xxx \u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_CONTAIN = ShortCut\n# ==============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_3","title":"4\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u5728\u5e94\u7528\u5e93 widget \u65b9\u6cd5\u5e93\u91cc\u9762\uff0c\u53ea\u9700\u8981\u5728\u51fa\u53e3\u6587\u4ef6\u52a0\u4e0a\u7c7b\u88c5\u9970\u5668\uff0c\u5c31\u53ef\u4ee5\u5b9e\u73b0\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u4e86\uff1b # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6ce8\u610f\uff0c\u662f\u7c7b\u88c5\u9970\u5668\u3002 \u5b9e\u4f8b\uff1a # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\n@classmethod\ndef find_dfm_image(cls, *elements, multiple=False, rate=0.9):\n\"\"\"\n \u67e5\u627e\u56fe\u7247 {{elements}}.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e {{rate}} \u7684\u5750\u6807\n :param elements:\n :param multiple:\n :return:\n \"\"\"\nelement = tuple(map(lambda x: f\"{Config.PIC_RES_PATH}/{x}\", elements))\nreturn cls.find_image(*element, multiple=multiple)\n \u8c03\u7528\u65b9\u6cd5\u65f6\uff1a DfmWidget.find_dfm_image(\"dfm_001\")\n \u81ea\u52a8\u8f93\u51fa\u7684\u65e5\u5fd7\uff1a >> x86_64-uos-6: 02/28 17:48:47 | INFO | logger_utils: [find_dfm_image]: \u67e5\u627e\u56fe\u7247 dfm_001.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e 0.9 \u7684\u5750\u6807\n \u52a0\u4e0a\u88c5\u9970\u5668 @log \u4e4b\u540e\uff0c\u65b9\u6cd5\u5c42\u6240\u6709\u7684\u51fd\u6570\uff08\u5305\u62ec\u5b9e\u4f8b\u65b9\u6cd5\u3001\u7c7b\u65b9\u6cd5\u3001\u9759\u6001\u65b9\u6cd5\uff09\u90fd\u4e0d\u9700\u8981\u518d\u5199\u65e5\u5fd7\u4ee3\u7801\uff0c\u6267\u884c\u7684\u65f6\u5019\u4f1a\u81ea\u52a8\u8f93\u51fa\uff0c\u5e76\u4e14\u6240\u6709\u8c03\u7528\u7684\u65b9\u6cd5\u4f1a\u4ee5 allure.step \u7684\u65b9\u5f0f\uff0c\u5c55\u793a\u5728 allure \u62a5\u544a\u4e2d\uff0c\u5728\u62a5\u544a\u4e2d\u66f4\u80fd\u4e00\u76ee\u4e86\u7136\u7684\u770b\u5230\u7528\u4f8b\u6267\u884c\u6b65\u9aa4\u3002 \u3010\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\u3011 \u901a\u8fc7\u89c2\u5bdf\u524d\u9762\u7684\u4f8b\u5b50\uff0c\u7ec6\u5fc3\u7684\u540c\u5b66\u53ef\u80fd\u8fd8\u53d1\u73b0\u4e86\u4e00\u4e2a\u5c0f\u7ec6\u8282\uff1a\u51fd\u6570\u529f\u80fd\u8bf4\u660e\u4e2d\uff0c\u4e24\u5bf9\u5927\u62ec\u53f7\u4e2d\u7684\u5185\u5bb9 {{elements}} \u4f5c\u4e3a\u53d8\u91cf\u8f93\u51fa\u51fa\u6765\u4e86\uff1b \u6ca1\u9519\uff0c\u8fd9\u5c31\u662f\u6211\u4eec\u53c2\u8003Django \u548c jinja2 \u7684\u6a21\u677f\u8bed\u6cd5\u8bbe\u8ba1\u51fa\u7684\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\uff0c\u4f7f\u7528\u65b9\u6cd5\u5f88\u7b80\u5355\uff0c\u7528\u4e24\u5bf9\u5927\u62ec\u53f7\u628a\u51fd\u6570\u7684\u53c2\u6570\u62ec\u8d77\u6765\uff0c\u8fd9\u6837\u5728\u65e5\u5fd7\u8f93\u51fa\u7684\u65f6\u5019\u5c31\u80fd\u628a\u8c03\u7528\u51fd\u6570\u65f6\u53c2\u6570\u7684\u503c\u8f93\u51fa\u51fa\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_7","title":"\u516b\u3001\u73af\u5883\u90e8\u7f72","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_6","title":"1\u3001\u539f\u5219","text":"YouQu \u7684\u73af\u5883\u4f9d\u8d56\u4e00\u76f4\u575a\u6301 2 \u4e2a\u539f\u5219\uff1a \u6700\u5c0f\u73af\u5883\u4f9d\u8d56\u539f\u5219 \u6709\u4e9b\u540c\u5b66\u5199\u4e00\u4e9b\u529f\u80fd\uff0c\u9996\u5148\u60f3\u5230\u7684\u5c31\u662f\u53bb\u641c\u7d22\u5f15\u64ce\u641c\u4e00\u4e0b\uff0c\u770b\u6709\u6ca1\u6709\u73b0\u6210\u7684\u5de5\u5177\u6216\u8005\u4ee3\u7801\u76f4\u63a5\u80fd\u7528\uff0c\u7f8e\u5176\u540d\u66f0\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\uff0c\u522b\u4eba\u5df2\u7ecf\u9020\u597d\u4e86\u8f6e\u5b50\u54b1\u4eec\u5c31\u4e0d\u8981\u91cd\u590d\u53bb\u9020\u4e86\uff0c\u7136\u540e\u4e00\u5207\u4f3c\u4e4e\u90fd\u53d8\u5f97\u90a3\u4e48\u7684\u7406\u6240\u5e94\u5f53\u3002 \u5f53\u7136\u8fd9\u6837\u505a\u65e0\u53ef\u539a\u975e\uff0c\u6211\u76f8\u4fe1\u6709\u8fd9\u6837\u60f3\u6cd5\u5e76\u4e14\u4e00\u76f4\u8df5\u884c\u8fd9\u6837\u505a\u6cd5\u7684\u540c\u5b66\u4e0d\u5728\u5c11\u6570\uff0c\u4f46\u8fd9\u6837\u505a\u6709\u4e00\u4e2a\u5f88\u4e25\u91cd\u7684\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f60\u5199\u4e00\u4e2a\u5927\u578b\u9879\u76ee\u65f6\uff0c\u4f60\u4f1a\u5f15\u5165\u975e\u5e38\u975e\u5e38\u975e\u5e38\u591a\u7684\u4f9d\u8d56\uff0c\u6bd4\u5982\u8981\u505a\u4e2a\u63a5\u53e3\u8bf7\u6c42\u8981\u7528 requests\u3001\u8bfb\u5199\u4e2a\u6570\u636e\u7528 pandas\u3001\u5199\u4e2a\u8868\u683c\u7528 pyopenxl\u3001\u89e3\u6790\u4e2a\u6587\u672c\u8981\u7528\u8fd9\u4e2a\u90a3\u4e2a\u4e09\u65b9\u5e93 ... \u3002 \u6211\u8ba4\u4e3a\u8fd9\u662f\u975e\u5e38\u4e0d\u597d\u7684\u4e60\u60ef\uff0c\u5728\u5b9e\u73b0\u4e00\u4e2a\u529f\u80fd\u7684\u65f6\u5019\uff0c\u9996\u5148\u6211\u4eec\u5e94\u8be5\u53bb\u60f3\u81ea\u5df1\u600e\u4e48\u6837\u53bb\u5b9e\u73b0\uff0c\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff1b \u5982\u679c\u4f60\u4e0d\u4f1a\uff0c\u4f60\u53ef\u4ee5\u53bb\u5b66\u4e60\u4e09\u65b9\u5e93\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u522b\u4eba\u4e09\u65b9\u5e93\u4e5f\u662f\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\u7684\uff0c\u4e3a\u4ec0\u4e48\u54b1\u4eec\u4e0d\u884c\u5462\uff1b\u5982\u679c\u522b\u4eba\u7684\u4f60\u5b9e\u5728\u662f\u770b\u4e0d\u61c2\uff0c\u60f3\u5c3d\u4e00\u5207\u529e\u6cd5\u786e\u5b9e\u505a\u4e0d\u51fa\u6765\uff0c\u90a3\u518d\u8003\u8651\u5f15\u5165\u8fd9\u4e2a\u4e09\u65b9\u5e93\uff0c\u6211\u8ba4\u4e3a\u8fd9\u6837\u662f\u6ca1\u95ee\u9898\u7684\uff0c\u6bd5\u7adf\u54b1\u4eec\u6bb5\u4f4d\u8fd8\u4e0d\u591f\uff0c\u4f46\u5e0c\u671b\u5c06\u6765\u6709\u4e00\u5929\u6211\u4eec\u53ef\u4ee5\u3002 \u8fd9\u6837\u7684\u505a\u6cd5\u624d\u5e94\u8be5\u662f\u201c\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\u201d\u6b63\u786e\u7684\u64cd\u4f5c\u3002\u4e0d\u4f1a\u6ca1\u5173\u7cfb\uff0c\u770b\u770b\u522b\u4eba\u662f\u600e\u4e48\u5b9e\u73b0\u7684\uff0c\u81ea\u5df1\u518d\u6478\u7d22\u7740\u5199\u51fa\u6765\uff0c\u8fd9\u6837\u81ea\u5df1\u624d\u80fd\u6709\u6240\u63d0\u9ad8\uff0c\u4e0d\u7136\u4f60\u5c31\u53ea\u4f1a\u7528\u522b\u4eba\u7684\u4e1c\u897f\uff1b\u90a3\u4e9b\u5632\u7b11\u3001\u6279\u8bc4\u6211\u4eec\u91cd\u590d\u9020\u8f6e\u5b50\u7684\u4eba\uff0c\u5148\u60f3\u60f3\u81ea\u5df1\u4f1a\u9020\u8f6e\u5b50\u5417\u3002 \u672c\u7740\u81ea\u5df1\u5b9e\u73b0\u80fd\u5b9e\u73b0\u7684\u4e00\u5207\u7684\u539f\u5219\uff0cYouQu \u6846\u67b6\u505a\u5230\u4e86\u975e\u5e38\u5c11\u7684\u73af\u5883\u4f9d\u8d56\uff0c\u800c\u4e14\u6211\u4eec\u4ecd\u5728\u4e0d\u65ad\u52aa\u529b\uff0c\u51cf\u5c11\u73af\u5883\u90e8\u7f72\u7684\u4f9d\u8d56\u3002 \u6700\u5c0f\u4ed3\u5e93\u4f53\u79ef\u539f\u5219 \u5927\u6587\u4ef6\u4e0d\u80fd\u4e0a\u4f20\u5230\u5de5\u7a0b\u91cc\u9762\uff0c\u4fdd\u6301\u6574\u4e2a\u5de5\u7a0b\u7684\u8f7b\u91cf\u5316\uff0c\u8fd9\u6837\u5728\u514b\u9686\u4ee3\u7801\u7684\u65f6\u5019\u624d\u80fd\u975e\u5e38\u5feb\u901f\u65b9\u4fbf\u4f7f\u7528\uff0c\u6211\u4eec\u89c1\u8fc7\u4e00\u4e2a AT \u5de5\u7a0b clone \u5927\u5c0f\u8fbe\u5230\u597d\u51e0\u4e2a G\uff0c\u7b80\u76f4\u4e0d\u53ef\u601d\u8bae\u3002 \u5176\u5b9e\u4ee3\u7801\u6587\u4ef6\u7684\u5927\u5c0f\u662f\u5f88\u5c0f\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u7eaf\u5199\u4ee3\u7801\u968f\u4fbf\u5199\u5de5\u7a0b\u4e5f\u4e0d\u4f1a\u592a\u5927\uff0c\u800c\u6587\u6863\uff08\u5305\u542b\u63d2\u56fe\uff09\u7b49\u8d44\u6e90\u5374\u662f\u5f88\u5360\u7a7a\u95f4\u3002 \u56e0\u6b64\u6211\u4eec\u9009\u62e9\u5c06 YouQu \u7684\u6587\u6863\u5de5\u7a0b\u5355\u72ec\u8fc1\u51fa\u5230\u72ec\u7acb\u7684\u4ed3\u5e93 youqu-docs \u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_6","title":"2\u3001\u5b89\u88c5","text":"\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u8fd0\u884c env.sh \u5373\u53ef\u3002 bash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_4","title":"3\u3001\u5b9a\u5236\u4f9d\u8d56","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_2","title":"3.1\u3001\u65b0\u589e\u4f9d\u8d56","text":"\u5982\u679c\u5e94\u7528\u5e93\u8fd8\u9700\u8981\u5176\u4ed6 Python \u4f9d\u8d56\u5e93\uff0c\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a requirement.txt \u6587\u4ef6\uff1b autotest_xxx\n\u251c\u2500\u2500 requirement.txt\n\u251c\u2500\u2500 case ...\n \u91cc\u9762\u5199\u5165\u9700\u8981\u5b89\u88c5\u7684\u4e09\u65b9\u4f9d\u8d56\uff0c\u6bd4\u5982\u50cf\u8fd9\u6837\uff1a # requirement.txt\nPyYAML==6.0 # \u6307\u5b9a\u5b89\u88c5\u67d0\u4e2a\u7248\u672c\nrequests # \u672a\u6307\u5b9a\u7248\u672c\u5219\u5b89\u88c5\u6700\u65b0\u7248\n \u5728\u6267\u884c bash env.sh \u65f6\u4f1a\u4e00\u5e76\u5c06\u5176\u5b89\u88c5\u3002 \u5982\u679c\u591a\u4e2a\u5e94\u7528\u5e93\u90fd\u5b58\u5728 requirement.txt \u6587\u4ef6\uff0c\u6267\u884c env.sh \u65f6\u4f1a\u5c06\u591a\u4e2a requirement.txt \u6587\u4ef6\u4e00\u5e76\u52a0\u8f7d\uff1b\u90a3\u4e48\u4e00\u5b9a\u8981\u6ce8\u610f\u591a\u4e2a requirement.txt \u6587\u4ef6\u53ef\u80fd\u5b58\u5728\u76f8\u540c\u7684\u4f9d\u8d56\u88ab\u6307\u5b9a\u5b89\u88c5\u4e0d\u540c\u7248\u672c\u7b49\u7b49\u517c\u5bb9\u6027\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32_1","title":"3.2\u3001\u88c1\u526a\u4f9d\u8d56","text":"\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0c\u53ef\u80fd\u4f60\u53ea\u9700\u8981\u5b89\u88c5\u4e00\u4e9b\u6700\u6700\u57fa\u7840\u7684\u4f9d\u8d56\uff0c\u5176\u4ed6\u7684\u90fd\u4e0d\u9700\u8981\uff0c\u6bd4\u5982\u7eaf\u63a5\u53e3\u81ea\u52a8\u5316\u7684\u9879\u76ee\uff0c\u5b83\u4e0d\u9700\u8981 UI \u81ea\u52a8\u5316\u76f8\u5173\u7684\u4f9d\u8d56\u3002 \u4f60\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\uff0c\u5b58\u653e\u4e00\u4e2a BASICENV \u7684\u666e\u901a\u6587\u4ef6\uff0c\u91cc\u9762\u4e0d\u9700\u8981\u5199\u4efb\u4f55\u5185\u5bb9\uff0c\u8fd9\u6837\u6267\u884c env.sh \u65f6\uff0c\u53ea\u4f1a\u5b89\u88c5\u6700\u57fa\u7840\u7684\u4f9d\u8d56\u3002 autotest_xxx\n\u251c\u2500\u2500 BASICENV # \u53ef\u4ee5\u4f7f\u7528\uff1atouch BASICENV \u521b\u5efa\u6587\u4ef6\n\u251c\u2500\u2500 case ...\n \u57fa\u7840\u4f9d\u8d56\u4ec5\u5b89\u88c5\u4ee5\u4e0b\u51e0\u4e2a\u5305\uff1a pytest # pytest\npytest-rerunfailures # \u5931\u8d25\u91cd\u8dd1\u63d2\u4ef6\npytest-timeout # \u7528\u4f8b\u8d85\u65f6\u63d2\u4ef6\nallure-pytest # \u751f\u6210 allure \u62a5\u544a\u63d2\u4ef6\nallure.deb # allure \u62a5\u544a\u67e5\u770b\u5de5\u5177\n \u88c1\u526a\u4f9d\u8d56 \u548c \u65b0\u589e\u4f9d\u8d56 \u662f\u4e0d\u51b2\u7a81\u7684\uff0c\u53ef\u4ee5\u540c\u65f6\u4f7f\u7528\u3002 \u6b64\u65b9\u6848\u9ed8\u8ba4\u4e3a\u865a\u62df\u73af\u5883\u90e8\u7f72\uff0c\u5982\u679c\u4f60\u60f3\u76f4\u63a5\u90e8\u7f72\u5728\u672c\u673a\u4e0a\uff1a bash env_dev.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_8","title":"\u4e5d\u3001\u5931\u8d25\u5f55\u5c4f","text":"\u5f55\u5c4f\u5176\u5b9e\u662f\u4e00\u79cd\u89c6\u9891\u5f62\u5f0f\u7684\u65e5\u5fd7\uff0c\u56e0\u4e3a\u5f88\u591a\u65f6\u5019\u6211\u4eec\u5728\u67e5\u770b\u65e5\u5fd7\u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u51c6\u786e\u7684\u5b9a\u4f4d\u5230\u7528\u4f8b\u5931\u8d25\u7684\u5177\u4f53\u539f\u56e0\uff0c\u56e0\u6b64\u7528\u4f8b\u7684\u5f55\u5c4f\u80fd\u8ba9\u6211\u4eec\u770b\u5230\u7528\u4f8b\u5728\u6267\u884c\u8fc7\u7a0b\uff1b \u3010\u4f7f\u7528\u65b9\u6cd5\u3011 \u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u5173\u6ce8 2 \u4e2a\u53c2\u6570\uff1b ;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\u3002\n;\u6ce8\u610f\uff0c\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u4e0d\u80fd\u5c0f\u4e8e\u5931\u8d25\u5f55\u5c4f\u6b21\u6570\uff0c\u5373 RERUN >= RECORD_FAILED_CASE\nRECORD_FAILED_CASE = 1\n \u9ed8\u8ba4\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u662f 1 \u6b21\uff1b RECORD_FAILED_CASE = 1 \u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff1b RECORD_FAILED_CASE = 0 \u8868\u793a\u4e0d\u7ba1\u7528\u4f8b\u6210\u529f\u6216\u5931\u8d25\u90fd\u5f55\u5c4f\uff1b \u5f55\u5c4f\u662f\u8981\u5360\u7528\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u7279\u522b\u662f\u5728\u4e00\u4e9b\u914d\u7f6e\u8f83\u4f4e\u7684\u673a\u5668\u4e0a\u4f1a\u5f88\u660e\u663e\uff0c\u6240\u4ee5\u4f60\u9700\u8981\u8003\u8651\u662f\u5426\u6709\u5fc5\u8981\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1b \u4f7f\u7528 manage.py \u6267\u884c\u7528\u4f8b\u9ed8\u8ba4\u8bfb\u53d6\u5230 globalconfig.ini \u91cc\u9762\u7684\u53c2\u6570\uff0c\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report/record \u76ee\u5f55\u4e0b\u4fdd\u5b58\u5931\u8d25\u7528\u4f8b\u7684\u5f55\u5c4f\u548c\u65ad\u8a00\u7684\u90a3\u4e2a\u65f6\u95f4\u70b9\u7684\u622a\u5c4f\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7\u89c6\u9891\u6587\u4ef6\u770b\u5230\u5931\u8d25\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u90fd\u53d1\u751f\u4e86\u4ec0\u4e48\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#wayland","title":"\u5341\u3001Wayland \u9002\u914d","text":"Wayland \u4e0b\u81ea\u52a8\u5316\u4e3b\u8981\u95ee\u9898\u662f X11 \u4e0b\u7684\u952e\u9f20\u64cd\u4f5c\u65b9\u6cd5\u65e0\u6cd5\u4f7f\u7528\uff0c\u6bd4\u5982 Xdotool\u3001 PyAutoGUI\u3001Xwininfo \u7b49\u7b49\uff1b YouQu \u5728 Wayland \u4e0b\u517c\u5bb9\u9002\u914d\uff0cenv.sh \u5728 Wayland \u4e0b\u6267\u884c\u65f6\u4f1a\u5b89\u88c5\u81ea\u7814\u7684\u952e\u9f20\u64cd\u4f5c\u670d\u52a1\uff08\u53ef\u80fd\u5b58\u5728\u4e00\u4e9b\u4f9d\u8d56\u62a5\u9519\uff0c\u6309\u7167\u6ce8\u91ca\u89e3\u51b3\u5373\u53ef\uff09\uff0c\u6846\u67b6\u6838\u5fc3\u5e93\u4e5f\u9488\u5bf9\u6027\u7684\u505a\u4e86\u9002\u914d\uff0c\u4e0a\u5c42\u7528\u4f8b\u5b8c\u5168\u4e0d\u7528\u5173\u5fc3\u673a\u5668\u662fWayland \u8fd8\u662f X11\uff0c\u6846\u67b6\u4f1a\u6839\u636e\u6267\u884c\u65f6\u72b6\u6001\u81ea\u52a8\u5224\u65ad\u8d70\u4e0d\u540c\u7684\u903b\u8f91\uff1b \u7b80\u5355\u8bb2\u5c31\u662f\uff0c\u5e94\u7528\u5e93\u53ea\u9700\u8981\u7ef4\u62a4\u4e00\u5957\u7528\u4f8b\u811a\u672c\u5373\u53ef\u3002 \u3010\u7528\u4f8b\u517c\u5bb9\u3011 \u56e0\u4e3a Wayland \u4e0b\u6709\u4e9b\u5e94\u7528\u7684\u754c\u9762\u663e\u793a\u548c\u529f\u80fd\u672c\u8eab\u5b58\u5728\u4e00\u4e9b\u5dee\u5f02\uff0c\u7528\u4f8b\u5c42\u53ef\u80fd\u9700\u8981\u5bf9\u8fd9\u90e8\u5206\u7528\u4f8b\u505a\u903b\u8f91\u5224\u65ad\uff0c\u4f7f\u7528\u5168\u5c40\u914d\u7f6e\u91cc\u9762\u7684\u5e38\u91cf\u8fdb\u884c\u903b\u8f91\u7f16\u5199\u5373\u53ef\uff1a from setting.globalconfig import GlobalConfig\n# GlobalConfig.IS_WAYLAND \u83b7\u53d6\u5230\u5f53\u524d\u7684\u663e\u793a\u670d\u52a1\u5668\uff08bool\uff09\n# \u5e94\u7528\u5e93 Config \u7ee7\u627f GlobalConfig\nif Config.IS_WAYLAND:\npass\nif Config.IS_X11:\npass\n \u6bd4\u5982\u7528\u4f8b\u91cc\u9762\u5982\u679c\u65ad\u8a00\u7684\u56fe\u7247\u4e0d\u540c\uff1a if Config.IS_WAYLAND:\nself.assert_image_exist(\"wayland_XXX\")\nelse:\nself.assert_image_exist(\"x11_XXX\")\n \u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u811a\u672c\u5728 Wayland \u548c X11 \u4e0b\u90fd\u53ef\u4ee5\u8dd1\uff0cso easy \u662f\u4e0d\u662f\uff1f\u5b8c\u5168\u6ca1\u5fc5\u8981\u4e13\u95e8\u62c9\u65b0\u5206\u652f\u8fdb\u884c Wayland \u9002\u914d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_9","title":"\u5341\u4e00\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_7","title":"1. \u76ee\u5f55\u7ed3\u6784","text":"\u6267\u884c\u65f6\u4f1a\u5728\u6839\u76ee\u5f55\u4e0b\u52a8\u6001\u751f\u6210 report \u76ee\u5f55\uff0c\u6240\u6709\u7684\u62a5\u544a\u76f8\u5173\u7684\u6587\u4ef6\u4f1a\u7edf\u4e00\u5b58\u653e\u5728\u91cc\u9762\uff0c\u793a\u4f8b\uff1a /report\n \u251c\u2500\u2500 allure # allure\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json\n \u251c\u2500\u2500 allure_html # \u751f\u6210\u7684html\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 index.html \u251c\u2500\u2500 allure_back # allure\u62a5\u544a\u5907\u4efd\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 20221108114823\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json\n \u251c\u2500\u2500 json # json\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 result_deepin-music_20221109134736_1081333.json\n \u251c\u2500\u2500 logs # \u65e5\u5fd7\u6587\u4ef6\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 2022-11-10_debug.log \u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-10_error.log\n \u251c\u2500\u2500 record # \u5f55\u5c4f\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-09\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 15\u65f614\u520609\u79d2_test_music_303_2_autotest.mp4\n \u2514\u2500\u2500 xml # xml\u62a5\u544a\n\u2514\u2500\u2500 autotest_deepin_music-20221109134736.xml\n \u9ed8\u8ba4\u60c5\u51b5\u4e0b\u540c\u65f6\u751f\u6210 html\u3001xml\u3001json\u4e09\u79cd\u5f62\u5f0f\u7684\u62a5\u544a\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_7","title":"2. \u5b9a\u5236\u62a5\u544a","text":"\u6211\u4eec\u5bf9 allure \u62a5\u544a\u8fdb\u884c\u4e86\u4e00\u7cfb\u5217\u7684\u5b9a\u5236\uff1a \u5b9a\u5236 logo\u3001title\u3001\u62a5\u544a\u9ed8\u8ba4\u8bed\u8a00\u4e3a\u4e2d\u6587\uff1b \u52a0\u5165\u4e86\u7528\u4f8b\u65ad\u8a00\u5931\u8d25\u65f6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u4ee5\u53ca\u6b64\u65f6\u56fe\u50cf\u5bf9\u6bd4\u7684\u6a21\u677f\u56fe\u7247\uff1b \u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\uff0c\u4f60\u53ef\u4ee5\u5728 html \u62a5\u544a\u4e2d\u76f4\u63a5\u770b\u5f55\u5236\u7684\u89c6\u9891\uff1b \u52a0\u5165\u4e86 IP \u5730\u5740\u3001\u7cfb\u7edf\u4fe1\u606f\u3001\u955c\u50cf\u7248\u672c\u7b49\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_5","title":"3. \u67e5\u770b\u62a5\u544a","text":" \u672c\u5730\u6267\u884c \u5728 report/allure \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u4e00\u5806\u6587\u672c\u6587\u4ef6\uff0c\u8fd9\u4e9b\u662f allure \u63d2\u4ef6\u751f\u6210\u7684\u62a5\u544a\u6e90\u6570\u636e\uff0c\u6211\u4eec\u5728 report/allure_html \u76ee\u5f55\u4e0b\u7ed9\u4f60\u751f\u6210\u4e86 html \u6587\u4ef6\uff0c\u4f46\u662f\u4f60\u4e0d\u80fd\u76f4\u63a5\u901a\u8fc7\u6d4f\u89c8\u5668\u6253\u5f00 index.html \u6587\u4ef6\uff0c\u56e0\u4e3a allure \u7684\u62a5\u544a\u90fd\u662f\u57fa\u4e8e\u5728\u7ebf\u7684\u670d\u52a1\uff0c\u4f60\u5e94\u8be5\u8fd9\u6837\u6253\u5f00\uff1a allure open report/allure_html\n \u4f7f\u7528 manage.py \u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u5728\u7ec8\u7aef\u7684\u6700\u540e\u4e00\u884c\uff0c\u6211\u4eec\u4f1a\u7ed9\u4f60\u8f93\u51fa\u6253\u5f00\u62a5\u544a\u7684\u547d\u4ee4\uff0c\u76f4\u63a5\u590d\u5236\u5b83\u5728\u7ec8\u7aef\u6267\u884c\u5c31\u53ef\u4ee5\u67e5\u770b\u4e86\uff0c\u50cf\u8fd9\u6837\uff1a \u7ec8\u7aef\u6267\u884c\u547d\u4ee4: allure open /tmp/youqu/report/allure_html \u67e5\u770b\u62a5\u544a \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 Pycharm \u91cc\u9762\u627e\u5230 index.html \u6587\u4ef6\uff0c\u7136\u540e\u53f3\u952e\u9009\u62e9\u6d4f\u89c8\u5668\u6253\u5f00\uff0c\u6216\u8005\u4f60\u53ef\u4ee5\u7528\u4e00\u4e2a http \u670d\u52a1\u6253\u5f00\u3002 \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 report/allure \u76ee\u5f55\u4e0b\u67e5\u770b\u62a5\u544a\uff1a allure serve report/allure\n \u8fdc\u7a0b\u6267\u884c \u8fdc\u7a0b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\uff0c\u4f1a\u5c06\u6240\u6709\u8fdc\u7a0b\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u62a5\u544a\u90fd\u6536\u96c6\u5230 report/allure \u76ee\u5f55\u4e0b\uff0c\u5206\u522b\u6309\u7167\u673a\u5668\u7684 IP \u7b49\u5efa\u4e86\u4e0d\u540c\u7684\u76ee\u5f55\uff0c\u4f60\u53ef\u4ee5\u5728\u8fd9\u4e9b\u76ee\u5f55\u91cc\u9762\u53bb\u67e5\u770b\u5bf9\u5e94\u7684\u6d4b\u8bd5\u62a5\u544a\uff0c\u67e5\u770b\u65b9\u6cd5\u548c\u524d\u9762\u672c\u5730\u6267\u884c\u67e5\u770b\u7684\u65b9\u6cd5\u4e00\u6837\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_10","title":"\u5341\u4e8c\u3001\u9759\u6001\u4ee3\u7801\u626b\u63cf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_8","title":"1. \u63d0\u524d\u89e3\u51b3\u4ee3\u7801\u95ee\u9898","text":"\u4e3a\u4e86\u5e2e\u52a9\u5f00\u53d1\u8005\u7edf\u4e00\u4ee3\u7801\u98ce\u683c\uff0cPython \u793e\u533a\u63d0\u51fa\u4e86 PEP8 \u4ee3\u7801\u7f16\u7801\u98ce\u683c\uff0cPython \u5b98\u65b9\u540c\u65f6\u63a8\u51fa\u4e86\u4e00\u4e2a\u68c0\u67e5\u4ee3\u7801\u98ce\u683c\u662f\u5426\u7b26\u5408 PEP8 \u7684\u5de5\u5177\uff0c\u540d\u5b57\u4e5f\u53eb PEP8\u3002 \u4f46\u662f\uff0cPycharm \u91cc\u9762\u7684 PEP8 \u63d2\u4ef6\u5b9e\u9645\u4e0a\u5e76\u4e0d\u80fd\u53d1\u73b0\u5f88\u591a\u4ee3\u7801\u95ee\u9898\uff0c\u8fd9\u4e9b\u95ee\u9898\u5e76\u4e0d\u4f1a\u5728\u8fd0\u884c\u65f6\u62a5\u9519\uff0c\u56e0\u4e3a\u4ece Python \u8bed\u8a00\u89d2\u5ea6\u5e76\u4e0d\u5173\u5fc3\u8fd9\u4e9b\u95ee\u9898\uff0c\u5728 Pycharm \u7f16\u8f91\u5668\u91cc\u9762\u4f7f\u7528\u5feb\u6377\u952e ctrl + alt + L\uff0c\u6709\u4e00\u70b9\u70b9\u683c\u5f0f\u5316\u7684\u6548\u679c\uff0c\u80fd\u89e3\u51b3\u4e00\u4e9b\u7a7a\u683c\u3001\u6362\u884c\u7b49\u5c0f\u95ee\u9898\u3002 \u8fd9\u91cc\u63a8\u8350\u4e00\u4e2a Python \u793e\u533a\u6d41\u884c\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff1a Black\uff0c\u53f7\u79f0\u4e0d\u59a5\u534f\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff0c\u5b83\u68c0\u6d4b\u5230\u4e0d\u7b26\u5408\u89c4\u8303\u7684\u4ee3\u7801\u98ce\u683c\u76f4\u63a5\u5c31\u5e2e\u4f60\u5168\u90e8\u683c\u5f0f\u5316\u597d\uff0c\u5c31\u662f\u8fd9\u4e48\u521a\uff01 \u5b89\u88c5\uff1a sudo pip3 install black \n \u4f7f\u7528\u65b9\u6cd5\uff1a black ${CheckPath}\n \u4f7f\u7528\u8fd9\u4e2a\u5de5\u5177\u683c\u5f0f\u5316\u4e4b\u540e\uff0c\u4ee3\u7801\u4f1a\u88ab\u81ea\u52a8\u8c03\u6574\uff0c\u521a\u5f00\u59cb\u4f60\u53ef\u80fd\u4f1a\u89c9\u5f97\u8c03\u6574\u5f97\u5f88\u5938\u5f20\uff0c\u6ca1\u5173\u7cfb\u575a\u6301\u770b\uff0c\u4e60\u60ef\u4e4b\u540e\uff0c\u4f60\u4f1a\u89c9\u5f97\u5f88\u4f18\u96c5\uff0c\u6ca1\u9519\uff0c\u8fd9\u5c31\u662f Pythonic Code \u7684\u6838\u5fc3\uff0c\u8bf7\u4fdd\u6301\u4f18\u96c5\uff5e\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_8","title":"2. \u4ee3\u7801\u626b\u63cf\u5de5\u5177","text":"\u4f7f\u7528\u6839\u76ee\u5f55\u4e0b pylint.sh \u626b\u63cf\u4ee3\u7801\uff0c\u5728 report \u76ee\u5f55\u4e0b\u67e5\u770b\u4ee3\u7801\u626b\u63cf\u62a5\u544a\uff0c\u5982\u679c\u6709\u4ee3\u7801\u95ee\u9898\u8bf7\u63d0\u524d\u89e3\u51b3\u4e4b\u540e\u518d\u63d0\u4ea4\u3002 \u6b64\u811a\u672c\u5df2\u7ecf\u4f7f\u7528 Python \u793e\u533a\u6700\u6d41\u884c\u7684\u4ee3\u7801\u626b\u63cf\u5de5\u5177 Pylint \u8fdb\u884c\u4ee3\u7801\u626b\u63cf\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a bash pylint.sh\n \u8fd0\u884c\u4e4b\u540e\u4f1a\u63d0\u793a\u4f60\u8981\u626b\u63cf\u7684\u76ee\u5f55\uff0c\u6bd4\u5982\u8f93\u5165 apps \uff0c\u5219\u4f1a\u626b\u63cf apps \u4e0b\u7684\u6240\u6709 Python \u4ee3\u7801\u3002 \u5728 setting/pylintrc.cfg \u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u76f8\u5173\u914d\u7f6e\uff0c\u626b\u63cf\u5b8c\u6210\u4e4b\u540e\u5728 report/pylints \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u626b\u63cf\u62a5\u544a\u3002 \u4ee3\u7801\u63d0\u4ea4\u9700\u901a\u8fc7 git review \u63d0\u4ea4\u5230 gerrit \uff0c\u4eba\u5de5 Code Review \u901a\u8fc7\u4e4b\u540e\u5408\u5165\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_11","title":"\u5341\u4e09\u3001\u63d0\u4ea4\u4ee3\u7801","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_9","title":"1. \u5b89\u88c5\u4f9d\u8d56","text":"sudo apt install git-review\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_9","title":"2. \u63d0\u4ea4\u6a21\u677f","text":"\u5728 ~ \u76ee\u5f55\u4e0b\u65b0\u5efa\u6587\u4ef6\uff0c\u5e76\u547d\u540d\u4e3a gitcommit_template \u5c06\u4ee5\u4e0b\u5185\u5bb9\u5199\u5165\u6587\u4ef6\u5f53\u4e2d\uff1a # commit type :fix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style(\u98ce\u683c\u4fee\u6539)\u3001refactor(\u91cd\u6784)\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test(\u6d4b\u8bd5) + \u7b80\u5355\u63cf\u8ff0. \u9ed8\u8ba4fix,\u6839\u636e\u60c5\u51b5\u4fee\u6539\nfix: \n\n# \u8be6\u7ec6\u8bf4\u660e\u4ee3\u7801\u7684\u6539\u52a8\uff0c\u5305\u542b\u4ee3\u7801\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u4ee5\u53ca\u4e3a\u4ec0\u4e48\u8fd9\u4e48\u505a\uff0c\u53ef\u80fd\u4f1a\u5f71\u54cd\u54ea\u4e9b\u529f\u80fd\u3002\u5bf9\u4e8e\u4ee3\u7801\u7684\u5ba1\u6838\u8005\uff0c\u9700\u8981\u4ece\u8fd9\u6bb5\u63cf\u8ff0\u4e2d\u80fd\u5b8c\u5168\u7406\u89e3\u4ee3\u7801\u4e2d\u6240\u6709\u6539\u52a8\u7684\u5185\u5bb9\nDescription: \n\n# \u5199\u4e00\u6bb5\u9762\u5411\u4e8e\u4ea7\u54c1\u7684\u603b\u7ed3\u6027\u5185\u5bb9\uff0c\u7528\u4e8e\u81ea\u52a8\u751f\u6210crp\u4e0a\u7684changlog\uff0c\u9700\u8981\u6ce8\u610f\u7684\u4e8b\uff0c\u8fd9\u6bb5\u63cf\u8ff0\u5fc5\u987b\u4ece\u4ea7\u54c1\u7684\u89d2\u5ea6\u8003\u8651\u3002\nLog: \n\n# \u5173\u8054pms\u4e0a\u7684bug\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94bug\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4fee\u590dbug\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Bug: \n\n# \u4fee\u590d github issue \n#Issue: \n\n# \u5173\u8054pms\u4e0a\u7684\u4efb\u52a1\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94\u4efb\u52a1\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4efb\u52a1\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Task: \n \u547d\u4ee4\u884c\u6267\u884c: git config --global commit.template ~/gitcommit_template\n \u6b64\u547d\u4ee4\u5c06\u6a21\u677f\u52a0\u5165\u5230 git \u7684\u63d0\u4ea4\u6a21\u677f\u4e2d\u3002 \u540e\u7eed\u63d0\u4ea4\u7684\u65f6\u5019\u9700\u8981\u5173\u6ce8\u4e00\u4e0b\u51e0\u70b9\uff1a commit type \u5bf9\u5e94\u4e0d\u540c\u7684\u4fee\u6539\u7c7b\u578b\uff1afix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style \uff08\u98ce\u683c\u4fee\u6539\uff09\u3001refactor \uff08\u91cd\u6784\uff09\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test \uff08\u6d4b\u8bd5\uff09 commit type \u5192\u53f7\u540e\u9762\u52a0\u7a7a\u683c\u3002 Description \u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u9700\u8981\u8fdb\u884c\u8be6\u7ec6\u8bf4\u660e\uff0c\u6bd4\u5982\u5bf9\u529f\u80fd\u8fdb\u884c\u5927\u6539\u7b49\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_6","title":"3. \u63a8\u9001\u4ee3\u7801","text":"\u9996\u5148\u6dfb\u52a0 commit \u4fe1\u606f git add \u540e\u9762\u52a0\u6587\u4ef6\u540d\u79f0\n git add . # \u8868\u793a\u6dfb\u52a0\u6240\u6709\u6587\u4ef6\n \u4f7f\u7528\u8fd9\u6761\u547d\u4ee4\u6ce8\u610f\u6709\u4e9b\u4e34\u65f6\u6587\u4ef6\u4e0d\u8981\u63d0\u4ea4\u5230\u4ed3\u5e93\u4e86\u3002 git commit -a\n \u4e4b\u540e\u5728 fix: \u540e\u9762\uff08\u6ce8\u610f\u5192\u53f7\u540e\u9762\u5fc5\u987b\u52a0\u7a7a\u683c\uff0c\u4e0d\u7136\u76f4\u63a5-1\uff09\u5199\u672c\u5730\u63d0\u4ea4\u7684 commit \u4fe1\u606f\uff0c\u7136\u540e\u5c31\u53ef\u4ee5\u63d0\u4ea4\u4ee3\u7801\u4e86 git review branch(\u5f53\u524d\u5206\u652f) -r origin\n \u6700\u597d\u4e00\u6b21 commit\uff0c\u4e00\u6b21 git review \uff0c\u7ecf\u5e38\u6709\u540c\u5b66\u5728\u672c\u5730\u75af\u72c2 commit \u6700\u540e git review \u62a5\u9519\u4e0d\u77e5\u9053\u548b\u56de\u4e8b\u513f\u3002 \u82e5\u4e0d\u60f3\u6bcf\u6b21\u63d0\u4ea4\u90fd\u52a0\u4e0a -r \u9009\u9879\uff0c\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a git config --global gitreview.remote origin \u63d0\u4ea4\u4ee3\u7801\uff0c\u76f4\u63a5\u4f7f\u7528 git review branch<\u76ee\u6807\u5206\u652f>\uff0c\u4f8b\u5982 git review master"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git","title":"4. Git\u6807\u7b7e","text":"Git \u6807\u7b7e\u5b9e\u9645\u4e0a\u662f commit \u7684\u4e00\u4e2a\u522b\u540d\uff0c\u4e3b\u8981\u7528\u4e8e\u7ba1\u7406\u5386\u53f2\u7248\u672c\u3002 \u60f3\u8c61\u4e00\u4e0b\u9886\u5bfc\u8ba9\u4f60\u628a\u4e4b\u524d\u7684\u67d0\u4e2a\u7248\u672c\u7684\u4ee3\u7801\u62c9\u51fa\u6765\u8dd1\uff0c\u4f60\u662f\u4e0d\u662f\u4e56\u4e56\u7684\u53bb\u628a\u6240\u6709\u63d0\u4ea4\u8bb0\u5f55\u62c9\u51fa\u6765\u627e\uff0c\u7136\u540e\u627e\u5230\u90a3\u4e2a\u54c8\u5e0c\u503c\uff0c\u901a\u8fc7\u54c8\u5e0c\u503c\u6765\u68c0\u51fa\u4ee3\u7801\u3002 \u8fd9\u4e00\u5957\u64cd\u4f5c\u4e0b\u6765\u662f\u4e0d\u662f\u5f88\u9ebb\u70e6\uff0c\u8d39\u65f6\u95f4\u8fd8\u4e0d\u4e00\u5b9a\u80fd\u627e\u5f97\u5230\uff0c\u6ca1\u4eba\u80fd\u8bb0\u4f4f\u6bcf\u4e2a\u63d0\u4ea4\u54c8\u5e0c\u503c\u4ee5\u53ca\u8fd9\u6b21\u63d0\u4ea4\u90fd\u6539\u4e86\u54ea\u4e9b\u4ee3\u7801\u3002 \u56e0\u6b64\u7ed9\u63d0\u4ea4\u6253\u4e2a\u6807\u7b7e\uff0c\u5c31\u662f\u628a\u54c8\u5e0c\u503c\u8f6c\u6362\u6210\u4eba\u7c7b\u80fd\u7406\u89e3\u7684\u8bed\u8a00\uff0c\u6bd4\u5982 v1.0\uff0c\u5c31\u53ef\u4ee5\u76f4\u63a5\u901a\u8fc7\u6807\u7b7e\u627e\u5230\u5bf9\u5e94\u7684\u63d0\u4ea4\u3002 \u65b0\u5efa\u6807\u7b7e git tag -a <tagname>\n \u56de\u8f66\u4e4b\u540e\uff0cGit \u4f1a\u6253\u5f00\u4f60\u7684\u7f16\u8f91\u5668\uff0c\u8ba9\u4f60\u5199\u4e00\u53e5\u6807\u7b7e\u6ce8\u89e3\uff0c\u5c31\u50cf\u4f60\u7ed9\u63d0\u4ea4\u5199\u6ce8\u89e3\u4e00\u6837\u3002 \u67e5\u770b\u6240\u6709\u6807\u7b7e git tag -l\n# git tag \u4e5f\u884c\n \u5220\u9664\u6807\u7b7e git tag -d <tagname>\n \u63a8\u9001\u6807\u7b7e\u81f3\u8fdc\u7a0b git push \u547d\u4ee4\u5e76\u4e0d\u4f1a\u4f20\u9001\u6807\u7b7e\u5230\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\uff0c\u5fc5\u987b\u663e\u5f0f\u5730\u63a8\u9001\u6807\u7b7e\u3002 git push origin <tagname>\n \u63a8\u9001\u6240\u6709\u4e0d\u5728\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\u7684\u6807\u7b7e git push origin --tag\n \u5220\u9664\u8fdc\u7a0b\u6807\u7b7e git push origin :refs/tag/<tagname>\n \u540e\u671f\u6253\u6807\u7b7e \u5148\u7528 git log --pretty=oneline \u67e5\u8be2\u63d0\u4ea4\u8bb0\u5f55\uff0c\u83b7\u53d6\u6821\u9a8c\u7801\u3002 git tag -a <tagname> 9fceb02(\u6821\u9a8c\u7801)\n \u68c0\u51fa\u6807\u7b7e git checkout <tagname>\n \u6b64\u65f6\uff0c\u4ed3\u5e93\u4f1a\u5904\u4e8e\u201c\u5206\u79bb\u5934\u6307\u9488\uff08detached HEAD\uff09\u201d\u7684\u72b6\u6001\u3002 \u5728\u201c\u5206\u79bb\u5934\u6307\u9488\u201d\u72b6\u6001\u4e0b\uff0c\u5982\u679c\u4f60\u505a\u4e86\u67d0\u4e9b\u66f4\u6539\u7136\u540e\u63d0\u4ea4\u5b83\u4eec\uff0c\u6807\u7b7e\u4e0d\u4f1a\u53d1\u751f\u53d8\u5316\uff0c \u4f46\u4f60\u7684\u65b0\u63d0\u4ea4\u5c06\u4e0d\u5c5e\u4e8e\u4efb\u4f55\u5206\u652f\uff0c\u5e76\u4e14\u5c06\u65e0\u6cd5\u8bbf\u95ee\uff0c\u9664\u975e\u901a\u8fc7\u786e\u5207\u7684\u63d0\u4ea4\u54c8\u5e0c\u624d\u80fd\u8bbf\u95ee\u3002 \u56e0\u6b64\uff0c\u5982\u679c\u4f60\u9700\u8981\u8fdb\u884c\u66f4\u6539\uff0c\u6bd4\u5982\u4f60\u8981\u4fee\u590d\u65e7\u7248\u672c\u4e2d\u7684\u9519\u8bef\uff0c\u90a3\u4e48\u901a\u5e38\u9700\u8981\u521b\u5efa\u4e00\u4e2a\u65b0\u5206\u652f\uff1a git checkout -b <NewBranchName> <tagname>\n \u65b0\u5206\u652f\u4e0a\u53ef\u4ee5\u8fdb\u884c\u63d0\u4ea4\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_12","title":"\u5341\u56db\u3001\u5e38\u89c1\u95ee\u9898","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_10","title":"1. \u63d0\u4ea4\u4ee3\u7801\u65f6\u63d0\u793a\u90ae\u7bb1\u6216\u8005\u540d\u79f0\u4e0d\u5bf9","text":"\u91cd\u65b0\u914d\u7f6e\u90ae\u7bb1\u6216\u8005\u540d\u79f0\uff0c\u7136\u540e\u91cd\u7f6e\u751f\u6548\uff1a git commit --amend --reset-author\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_10","title":"2. \u600e\u4e48\u56de\u6eda\u5230\u4e4b\u524d\u7684\u7248\u672c","text":"(1)\u67e5\u8be2\u5386\u53f2\u63d0\u4ea4\u8bb0\u5f55 git log\n \u627e\u5230\u4f60\u8981\u56de\u6eda\u7684\u7248\u672c\uff0c\u590d\u5236 hash \u503c\u3002 \u6ce8\u610f\uff1a\u662f commit \u7a7a\u683c\u4e4b\u540e\u7684 hash \u503c\uff0c\u4e4b\u524d\u6709\u540c\u5b66\u590d\u5236\u7684 Change-Id: \u8fd9\u6837\u80af\u5b9a\u62a5\u9519\u3002 (2)\u56de\u6eda\u7248\u672c\uff0c\u4e0d\u6e05\u9664\u4ee3\u7801 git reset --soft ${hash}\n (3)\u56de\u6eda\u7248\u672c\uff0c\u6e05\u9664\u4ee3\u7801\uff0c\u614e\u7528\u54c8 git reset --hard ${hash}\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-f-s-e","title":"3. \u6d4b\u8bd5\u62a5\u544a\u91cc\u9762 F S . E \u662f\u4ec0\u4e48\u610f\u601d","text":"F \u8868\u793a\u5931\u8d25\uff0c. \uff08\u70b9\uff09\u8868\u793a\u901a\u8fc7\uff0cS \u8868\u793a\u8df3\u8fc7\uff0cE \u8868\u793a error \u6709\u62a5\u9519"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git-status","title":"4. \u89e3\u51b3 git status \u4e2d\u6587\u663e\u793a\u7684\u95ee\u9898","text":"git config --global core.quotePath false\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5-apps","title":"5. apps \u76ee\u5f55\u4e0b\u989c\u8272\u6709\u4e9b\u662f\u9ec4\u8272\u7684","text":"\u5728 Pycharm \u4e2d apps \u76ee\u5f55\u4e0b\u5e94\u7528\u5e93\u6587\u4ef6\u662f\u9ec4\u8272\u7684\uff0c\u7f16\u8f91\u5668\u8bc6\u522b\u4e0d\u5230\u4ee3\u7801\u65b0\u589e\u548c\u4fee\u6539\uff1b \u7531\u4e8e\u793e\u533a\u7248 Pycharm \u4e0d\u80fd\u52a8\u6001\u8bc6\u522b\u591a\u4ed3\u5e93\uff0c\u9700\u8981\u5728 setting \u91cc\u9762\u624b\u52a8\u6ce8\u518c\uff0c\u64cd\u4f5c\u6b65\u9aa4\uff1a File \u2014> Settings \u2014> Version Control \u2014> \u70b9 + \u53f7 \u2014> Directory \u9009\u4e2d\u5e94\u7528\u5e93\u5de5\u7a0b\u76ee\u5f55 \u2014> VCS \u9009\u4e2d Git \u2014> Apply \u5982\u6b64\u5c31\u53ef\u4ee5\u4e86\u3002 \u4e13\u4e1a\u7248 Pycharm \u4e0d\u5b58\u5728\u8fd9\u4e2a\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#6-envsh-r","title":"6. \u6267\u884c env.sh \u62a5\u9519 $'\\r':\u672a\u627e\u5230\u547d\u4ee4","text":"\u51fa\u73b0\u8fd9\u4e2a\u95ee\u9898\u4f60\u5e94\u8be5\u662f\u5728 windows \u4e0a\u6253\u5f00\u6216\u7f16\u8f91\u8fc7 env.sh \u811a\u672c\uff0cwindows\u4e0b\u7684\u6362\u884c\u662f\u56de\u8f66\u7b26+\u6362\u884c\u7b26\uff0c\u4e5f\u5c31\u662f\\r\\n\uff0c\u800c Linxu \u4e0b\u662f\u6362\u884c\u7b26 \\n\uff0cLinux \u4e0b\u4e0d\u8bc6\u522b \\r\uff0c\u56e0\u6b64\u62a5\u9519\u3002 \u89e3\u51b3\u65b9\u6848\uff1a # \u5c06 \\r \u66ff\u6362\u4e3a\u7a7a\nsudo sed -i 's/\\r//' env.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#7","title":"7.\u600e\u6837\u4e3a\u5355\u72ec\u67d0\u4e00\u6761\u7528\u4f8b\u914d\u7f6e\u6267\u884c\u8d85\u65f6\u65f6\u95f4","text":"\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u5982\u4e0b\uff1a @pytest.mark.timeout(300) # \u5355\u4f4d\u79d2\ndef test_xxx_001():\npass\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#8-youqu","title":"8. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u6240\u6709\u4ee3\u7801\uff0c\u5305\u542b\u5b50\u4ed3\u5e93","text":"\u524d\u7f6e\u6761\u4ef6\uff1a\u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 # \u7b2c\u4e00\u6b21\u5b58\u50a8\u5bc6\u7801\uff0c\u63d0\u4f9b\u540e\u9762\u62c9\u4ee3\u7801(gerrit: ldap\u8d26\u53f7\u548c\u5bc6\u7801\uff0cgit\u62c9\u53d6\u7b2c\u4e00\u6b21\u8f93\u5165\u4fdd\u5b58\uff0c\u540e\u9762\u76f4\u63a5\u4f7f\u7528)\ngit config --global credential.helper store\n\n# \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\uff0c\u5e76\u9012\u5f52\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\" --recursive\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#9-youqu","title":"9. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\u6307\u5b9a\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u524d\u7f6e\u6761\u4ef6\uff1a \u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 \u5df2\u5b58\u50a8\u8bbf\u95ee\u5bc6\u7801 # \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\"\n# \u6307\u5b9a\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ncd youqu\ngit submodule update --init apps/autotest_xxx_xxx\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#10-youqu","title":"10. \u5982\u4f55\u66f4\u65b0 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\uff0c\u6240\u6709\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u66f4\u65b0\u6240\u6709\u5b50\u4ed3\u5e93\u4ee3\u7801 cd youqu\ngit pull & git submodule foreach git pull\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#11-youqu-master-detached-head","title":"11. \u5982\u4f55\u4fee\u590d YouQu \u6240\u6709\u5b50\u4ed3\u5e93 master \u5206\u652f\u6e38\u79bb\u5934\uff08detached head\uff09","text":"\u4fee\u590d\u6240\u6709\u5b50\u4ed3\u5e93\u9ed8\u8ba4master \u5206\u652f\u6e38\u79bb\u5934 cd youqu\ngit submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/","title":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212 \u5206\u7c7b\uff1a/ \u67b6\u6784\u5e08\uff1a/ \u76ee\u6807\uff1a \u5e94\u7528 AT \u67b6\u6784\u5de5\u7a0b\u5316\uff0c\u53c2\u8003\u6027\u80fd\u81ea\u52a8\u5316\u5de5\u7a0b\u5b8c\u6210\u5de5\u7a0b\u5316\u6539\u9020\u3002 \u5e94\u7528\u95f4\u7528\u4f8b\u89e3\u8026\uff0c\u89e3\u9664\u6240\u6709\u4ea4\u53c9\u8c03\u7528\u7684\u65b9\u6cd5\uff0c\u5404\u5e94\u7528\u80fd\u8ddf\u968f\u81ea\u8eab\u8fed\u4ee3\u5468\u671f\u72ec\u7acb\u7ef4\u62a4 AT \u7528\u4f8b\u3002 \u5b8c\u6210\u516c\u5171\u65b9\u6cd5\u7684\u62bd\u53d6\u6574\u5408\uff0c\u5f62\u6210\u4e00\u5957\u72ec\u7acb\u4e8e\u5e94\u7528\u95f4\u7684\u516c\u5171\u65b9\u6cd5\u5e93\uff0c\u5404\u5e94\u7528\u65b9\u6cd5\u91cc\u9762\u4e0d\u5b58\u5728\u88ab\u591a\u4e2a\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\u3002 \u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u4e3a\u5c06\u6765\u9002\u914d\u66f4\u591a\u7684 AT \u8fd0\u7528\u573a\u666f\u63d0\u4f9b\u652f\u6491\uff0c\u539f\u5219\u4e0a\u53ef\u5b9e\u73b0\u65e0\u9650\u6269\u5c55\uff0c\u5728\u6bcf\u65e5\u6784\u5efa\u548c\u6301\u7eed\u96c6\u6210\u6d41\u7a0b\u843d\u5730\u4f7f\u7528\u3002 \u4ee3\u7801\u89c4\u8303\u95ee\u9898\u6e05\u96f6\uff0c\u7b26\u5408 Shell Check\u3001Pylint\u3001\u7cfb\u7edf\u90e8\u76f8\u5173\u7f16\u7801\u89c4\u8303\u8981\u6c42\u3002 \u610f\u4e49\uff1a \u7edf\u4e00\u6210\u7814 AT \u67b6\u6784\u8bbe\u8ba1\u601d\u8def\uff0c\u6d88\u9664 AT \u4ee3\u7801\u5b9e\u73b0\u548c\u7ef4\u62a4\u4e0a\u53ef\u80fd\u51fa\u73b0\u7684\u5206\u6b67\uff0c\u6539\u5584\u5386\u53f2 AT \u65e0\u5de5\u7a0b\u5316\u8bbe\u8ba1\u7684\u7f3a\u9677\uff0c\u63d0\u9ad8\u67b6\u6784\u4e13\u4e1a\u6027\u3002 \u5404\u5e94\u7528 AT \u4ee3\u7801\u76f8\u4e92\u72ec\u7acb\uff0c\u5951\u5408\u5e94\u7528\u72ec\u7acb\u53d1\u5e03\u7279\u6027\uff0c\u53ef\u652f\u6301\u8fed\u4ee3\u671f\u95f4\u72ec\u7acb\u65b0\u589e\u3001\u7ef4\u62a4\u548c\u6267\u884c\u3002 \u65b9\u6cd5\u8c03\u7528\u903b\u8f91\u5f97\u5230\u7b80\u5316\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u66f4\u9ad8\u6548\uff1b\u516c\u5171\u5e93\u62bd\u53d6\uff0c\u51cf\u5c11\u65b9\u6cd5\u91cd\u590d\u7f16\u5199\uff0c\u63d0\u9ad8\u4ee3\u7801\u5229\u7528\u7387\uff1b\u5e73\u5747\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u4ece40\u5206\u949f\u964d\u4f4e\u81f330\u5206\u949f\uff0c\u65e5\u4ea7\u51fa\u7528\u4f8b\u4ece12\u6761/\u5929\u63d0\u5347\u81f316\u6761/\u5929\u3002 \u53ef\u7075\u6d3b\u652f\u6491\u4e0d\u540c\u7684\u81ea\u52a8\u5316\u8fd0\u7528\u573a\u666f\uff0c\u5982 CI\u3001\u5192\u70df\u6d4b\u8bd5\u3001\u96c6\u6210\u6d4b\u8bd5\u3001\u56de\u5f52\u6d4b\u8bd5\u3001\u4e13\u9879\u6d4b\u8bd5\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_2","title":"\u4e00\u3001\u80cc\u666f\u4ecb\u7ecd","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1","title":"1\u3001\u73b0\u6709\u67b6\u6784\u4ecb\u7ecd","text":"\u73b0\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u6574\u4f53\u5206\u4e3a\u4e09\u5c42\uff1a\u7528\u4f8b\u5c42\uff08\u4e1a\u52a1\u903b\u8f91\u5c42\uff09\u3001\u4e2d\u95f4\u5c42\uff08\u5143\u7d20\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff09\u3001\u6838\u5fc3\u5c42\uff08\u5e95\u5c42\u529f\u80fd\u5e93\u5c42\uff09\u3002 \u7528\u4f8b\u5c42\uff1a\u5373\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4e13\u6ce8\u4e8e\u4e1a\u52a1\u529f\u80fd\u903b\u8f91\uff0c\u4e0d\u5173\u5fc3\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\uff1b \u4e2d\u95f4\u5c42\uff1a\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff0c\u6bcf\u4e2a\u65b9\u6cd5\u5747\u5bf9\u5e94\u4e00\u4e2a\u5143\u7d20\u7684\u4e00\u4e2a\u5177\u4f53\u64cd\u4f5c\uff0c\u4e5f\u53ef\u4ee5\u662f\u591a\u4e2a\u64cd\u4f5c\u7684\u7ec4\u5408\u64cd\u4f5c\uff0c\u4e2d\u95f4\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u7528\u4f8b\u5c42\uff0c\u5177\u6709\u53ef\u6269\u5c55\u6027\u548c\u590d\u7528\u6027\uff1b \u6838\u5fc3\u5c42\uff1a\u4e3b\u8981\u5c01\u88c5\u7684\u5e95\u5c42\u529f\u80fd\u5b9e\u73b0\uff0c\u6b64\u5c42\u5728\u6846\u67b6\u4e2d\u63d0\u4f9b\u4e00\u4e9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u529f\u80fd\u6a21\u5757\u76f8\u5bf9\u72ec\u7acb\uff0c\u6838\u5fc3\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u64cd\u4f5c\u5c42\uff0c\u6bd4\u5982\uff1a\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7 UI \u5750\u6807\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u952e\u9f20\u64cd\u4f5c\u7684\u57fa\u7840\u65b9\u64cd\u4f5c\u6a21\u5757\u3001Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757\u3001\u6587\u4ef6\u7684\u589e\u5220\u6539\u67e5\u64cd\u4f5c\u6a21\u5757\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2","title":"2\u3001\u81ea\u52a8\u5316\u7684\u5e94\u7528","text":"2.1\u3001CI \u6d41\u7a0b \u6bcf\u65e5\u6784\u5efa\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u7814\u53d1\u6bcf\u65e5\u63d0\u4ea4\u7684\u4ee3\u7801\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u73ed\u4e4b\u540e\u4f1a\u5c06\u5404\u5e94\u7528\u8fdb\u884c\u6253\u5305\uff0c\u7136\u540e\u5728\u6d4b\u8bd5\u673a\u4e0a\u5b89\u88c5\u66f4\u65b0 deb \u5305\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u5e94\u7528\u63d0\u4ea4\u96c6\u6210\u7684\u7248\u672c\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u8f7d\u6700\u65b0\u7684 ISO \u8fdb\u884c PXE \u90e8\u7f72\uff0c\u7136\u540e\u6d4b\u8bd5\u673a\u5b89\u88c5\u6700\u65b0\u7684\u955c\u50cf\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 2.2\u3001\u9a8c\u6536\u6d4b\u8bd5 \u5728\u5404\u9a8c\u6536\u8282\u70b9\u8fdb\u884c\u81ea\u52a8\u5316\u9a8c\u6536\uff0c\u76ee\u524d\u7684\u7b56\u7565\u662f\u5168\u7528\u4f8b\u8986\u76d6\u5168\u67b6\u6784\u3002 2.3\u3001\u56de\u5f52\u6d4b\u8bd5 \u56de\u5f52\u6d4b\u8bd5\u4eca\u5e74\u89c4\u5212\u5efa\u8bbe\u4e2d\uff0c\u65e8\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u6267\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\uff0c\u51cf\u5c11\u529f\u80fd\u6d4b\u8bd5\u7684\u91cd\u590d\u52b3\u52a8\u529b\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3","title":"3\u3001\u5b58\u5728\u7684\u95ee\u9898","text":" \u5404\u5e94\u7528\u4e4b\u95f4\u5b58\u5728\u8026\u5408 \u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u521d\u671f\uff0c\u6240\u6709\u5e94\u7528\u662f\u6574\u4f53\u53d1\u5e03\uff0c\u6211\u4eec\u662f\u5c06\u6240\u6709\u5e94\u7528\u770b\u6210\u662f\u4e00\u4e2a\u6574\u4f53\uff0c\u5404\u5e94\u7528\u4f5c\u4e3a\u5176\u4e2d\u7684\u4e00\u4e2a\u6a21\u5757\uff0c\u6240\u4ee5\u5b58\u5728\u5e94\u7528\u95f4\u65b9\u6cd5\u4ea4\u53c9\u8c03\u7528\u7684\u95ee\u9898\uff0c\u8fd9\u6837\u4ece\u6700\u521d\u7684\u8bbe\u8ba1\u6765\u8bb2\u786e\u5b9e\u80fd\u591f\u51cf\u5c11\u91cd\u590d\u4ee3\u7801\u7684\u7f16\u5199\u3002\u4f46\u662f\u73b0\u5728\u5e94\u7528\u8d70\u72ec\u7acb\u53d1\u5e03\uff0c\u5404\u5e94\u7528\u90fd\u6709\u81ea\u5df1\u7684\u8fed\u4ee3\u8282\u594f\uff0c\u5728\u65b0\u9700\u6c42\u5feb\u901f\u53d8\u5316\u7684\u8fc7\u7a0b\u4e2d\uff0c\u81ea\u52a8\u5316\u7ef4\u62a4\u53d8\u5f97\u5f02\u5e38\u56f0\u96be\uff0c\u539f\u56e0\u5c31\u662f\u81ea\u52a8\u5316\u9879\u76ee\u91cc\u9762\u5404\u4e2a\u5e94\u7528\u7684\u6709\u6bd4\u8f83\u591a\u7684\u8026\u5408\u5173\u7cfb\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u8fdb\u884c\u89e3\u8026\uff0c\u4ee5\u9002\u5e94\u5e94\u7528\u4e0d\u540c\u7684\u8fed\u4ee3\u5468\u671f\u3002 \u65e0\u6cd5\u7cbe\u51c6\u7684\u5212\u5206\u7528\u4f8b\u8303\u56f4 \u7528\u4f8b\u6267\u884c\u7684\u8303\u56f4\u4e0d\u591f\u7cbe\u51c6\uff0c\u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u4e3b\u8981\u901a\u8fc7\u7528\u4f8b\u7684\u5173\u952e\u8bcd core\uff08\u6838\u5fc3\uff09\u6765\u533a\u5206\u7528\u4f8b\u662f\u5426\u4e3a\u6838\u5fc3\u7528\u4f8b\uff0c\u4f46\u662f\u8fd9\u6837\u7684\u533a\u5206\u592a\u5bbd\u6cdb\u4e86\uff0c\u4e0d\u80fd\u9002\u5e94\u81ea\u52a8\u5316\u6d4b\u8bd5\u5728\u591a\u573a\u666f\u4e0b\u7684\u5e94\u7528\u3002\u5f88\u591a\u573a\u666f\u4e0b\u6211\u4eec\u8fd8\u9700\u8981\u6839\u636e\u7528\u4f8b\u7684\u7b49\u7ea7\u3001\u7528\u4f8b\u7684\u7c7b\u578b\u3001\u7528\u4f8b\u6765\u6e90\u7b49\u7b49\uff0c\u4e0d\u540c\u7684\u7ef4\u5ea6\u6765\u6311\u9009\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u5173\u952e\u5b57\u9700\u8981\u4eba\u5de5\u4e00\u6761\u6761\u7684\u6539\uff0c\u8d39\u65f6\u8d39\u529b\uff0c\u800c\u4e14\u4e0d\u597d\u7ef4\u62a4\u3002 \u53d7\u65b0\u9700\u6c42\u5f71\u54cd\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u597d\u7ef4\u62a4 \u76ee\u524d\u9700\u8981\u8df3\u8fc7\u7684\u7528\u4f8b\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684\u7528\u4f8b\u811a\u672c\u91cc\u9762\uff0c\u6dfb\u52a0\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\uff0c\u540e\u7eed\u89e3\u9664\u8df3\u8fc7\u7684\u65f6\u5019\u53c8\u9700\u8981\u627e\u5230\u8fd9\u6761\u811a\u672c\uff0c\u5220\u6389\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\u3002\u5728\u8df3\u8fc7\u7528\u4f8b\u8f83\u591a\u7684\u60c5\u51b5\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u96be\u5ea6\u3002 \u7f16\u5199\u7528\u4f8b\u65f6\u903b\u8f91\u6bd4\u8f83\u590d\u6742\uff0c\u9700\u8981\u8c03\u7528\u591a\u4e2a\u5e94\u7528\u7684\u65b9\u6cd5\u6a21\u5757\u3002 \u6846\u67b6\u6269\u5c55\u6027\u4e0d\u8db3\uff0c\u65e0\u6cd5\u6574\u5408\u6027\u80fd\u81ea\u52a8\u5316\u3001\u538b\u6d4b\u81ea\u52a8\u5316\u3001\u5b89\u5168\u81ea\u52a8\u5316\u7b49\u4e13\u9879\u6d4b\u8bd5\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_3","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u4e3a\u89e3\u51b3\u73b0\u6709\u95ee\u9898\uff0c\u9002\u5e94\u4e0d\u65ad\u4e30\u5bcc\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u66f4\u597d\u7684\u53d1\u6325\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4f5c\u7528\uff0c\u9700\u8981\u5bf9\u81ea\u52a8\u5316\u67b6\u6784\u53ca\u5404\u529f\u80fd\u6a21\u5757\u8fdb\u884c\u91cd\u65b0\u8bbe\u8ba1\u89c4\u5212\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_1","title":"1\u3001\u67b6\u6784\u8bbe\u8ba1","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_1","title":"2\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u6846\u67b6\u7684\u8fd0\u884c\u903b\u8f91\uff1a\u901a\u8fc7\u6838\u5fc3\u5c42\u63d0\u4f9b\u4e00\u4e2a\u57fa\u7840\u80fd\u529b\uff0c\u4e1a\u52a1\u5c42\u6839\u636e\u5b9e\u9645\u4e1a\u52a1\u9700\u6c42\uff08\u6d4b\u8bd5\u7528\u4f8b\uff09\u52a8\u6001\u52a0\u8f7d\u6838\u5fc3\u5c42\uff0c\u6267\u884c\u5165\u53e3\u52a0\u8f7d\u76f8\u5e94\u7684\u7528\u4f8b\u96c6\u5e76\u63a7\u5236\u6267\u884c\uff0c\u5e94\u7528\u5c42\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u9700\u6c42\uff0c\u901a\u8fc7\u76f8\u5e94\u7684\u914d\u7f6e\u9879\u8fdb\u884c\u914d\u7f6e\uff0c\u4ece\u800c\u89e6\u53d1\u81ea\u52a8\u5316\u6d4b\u8bd5\u4efb\u52a1\u3002 \u6838\u5fc3\u5c42\uff1a\u57fa\u672c\u4fdd\u6301\u4e0d\u53d8\uff0c\u90e8\u5206\u6a21\u5757\u4f1a\u6d89\u53ca\u5230\u65b0\u529f\u80fd\u5f00\u53d1\uff0c\u6838\u5fc3\u5c42\u5404\u529f\u80fd\u6a21\u5757\u4fdd\u6301\u72ec\u7acb\u6027\uff0c\u63d0\u4f9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u4f9b\u4e0a\u5c42\u8c03\u7528\uff1b \u5e95\u5c42\u6838\u5fc3\u6a21\u5757\u5305\u62ec\uff1a \u56fe\u50cf\u8bc6\u522b\u6a21\u5757 UI \u5b9a\u4f4d\u6a21\u5757 Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757 \u5c5e\u6027\u5b9a\u4f4d\u6a21\u5757 \u65e5\u5fd7\u6a21\u5757 \u952e\u9f20\u64cd\u4f5c\u6a21\u5757 \u6587\u4ef6\u64cd\u4f5c\u6a21\u5757 \u5f55\u5c4f\u6a21\u5757 \u81ea\u5b9a\u4e49\u65ad\u8a00\u6a21\u5757 \u7528\u4f8b\u6267\u884c\u6a21\u5757 PXE \u88c5\u673a\u6a21\u5757 \u952e\u9f20\u4fe1\u53f7\u6a21\u62df\u6a21\u5757 OCR \u6a21\u5757 \u4e1a\u52a1\u5c42\uff1a\u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e94\u7528\u5185\u5305\u542b\u591a\u4e2a\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5982\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7b49\uff0c\u540e\u7eed\u53ef\u4ee5\u6839\u636e\u9700\u8981\u5ac1\u63a5\u8fdb\u6765\u3002\u5176\u4e2d\u529f\u80fd\u6d4b\u8bd5\u8bbe\u8ba1\u601d\u8def\uff1a \u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e76\u5c06\u6d4b\u8bd5\u6570\u636e\u548c\u6d4b\u8bd5\u8d44\u6e90\u6574\u5408\u8fdb\u6765\uff0c\u589e\u52a0\u7528\u4f8b\u6807\u7b7e csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ed9\u6bcf\u6761\u7528\u4f8b\u6253\u6807\u7b7e\u3002 \u5404\u6807\u7b7e\u6240\u4f7f\u7528\u5bf9\u5e94\u7684\u5b57\u6bb5\u540d\u79f0\uff0c\u4f7f\u7528 csv \u6587\u4ef6\u7ef4\u62a4\u7528\u4f8b\u4e0e\u6807\u7b7e\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u5bf9\u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u53ef\u4ee5\u7ec4\u5408\u5176\u4e2d\u7684\u6807\u7b7e\u800c\u4ece\u9a71\u52a8\u5bf9\u5e94\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\uff0c\u517c\u5bb9\u73b0\u6709\u7528\u4f8b\u6807\u7b7e\uff0c\u4e14\u652f\u6301\u7528\u4f8b\u6807\u7b7e\u53ef\u6269\u5c55\uff1b \u4f7f\u7528 csv \u683c\u5f0f\u6587\u4ef6\u53ef\u4ee5\u65b9\u4fbf\u7684\u4f7f\u7528 Excel \u8868\u683c\u6253\u5f00\u8fdb\u884c\u7f16\u8f91\uff0c\u540c\u65f6\u7531\u4e8e csv \u6587\u4ef6\u5b9e\u9645\u662f\u4ee5\u90fd\u597d\u5206\u9694\u7684\u6587\u672c\u6587\u4ef6\uff0c\u4ee3\u7801\u4e2d\u53ef\u4ee5\u5728\u4e0d\u4f9d\u8d56\u4e09\u65b9\u5e93\u7684\u60c5\u51b5\u4e0b\u65b9\u4fbf\u5feb\u901f\u7684\u89e3\u6790\u5b83\uff0c\u53ef\u64cd\u4f5c\u6027\u548c\u53ef\u7ef4\u62a4\u6027\u8f83\u9ad8\u3002 \u5404\u4e2a\u5e94\u7528\u4e4b\u95f4\uff0c\u7528\u4f8b\u3001\u65b9\u6cd5\u3001\u6807\u7b7e\u548c\u8d44\u6e90\u90fd\u662f\u76f8\u4e92\u72ec\u7acb\u7684\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u7528\u4f8b\u65f6\u53ea\u9700\u8981\u81ea\u5df1\u5e94\u7528\u4e0b\u7684\u65b9\u6cd5\u548c\u516c\u5171\u5e93\u5373\u53ef\u3002 \u7ed3\u6784\u4e3e\u4f8b\uff1a .\n\u251c\u2500\u2500 apps\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_album # \u5e94\u7528\u540d (\u7528\u4e0b\u5212\u7ebf\u8fde\u63a5\u662f Python \u7f16\u7801\u89c4\u8303)\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_assert # \u65ad\u8a00\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_function_tag.csv # \u7528\u4f8b\u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 asan_cases # \u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases # \u529f\u80fd\u6d4b\u8bd5\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 res # \u6d4b\u8bd5\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config # \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_widget # \u5e94\u7528\u81ea\u5df1\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_widget # \u65b9\u6cd5\u57fa\u7c7b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 other_widget # \u8c03\u7528\u5176\u4ed6\u5e94\u7528\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_camera\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases\n\u2502\u00a0\u00a0 \u2502\u00a0 ...\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 public_widget # \u516c\u5171\u65b9\u6cd5\u5e93\n\u251c\u2500\u2500 config # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n...\n config \u914d\u7f6e\u6a21\u5757\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u76f8\u5e94\u914d\u7f6e\uff0c\u6d4b\u8bd5\u540c\u5b66\u53ef\u4ee5\u6839\u636e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5728 config \u91cc\u9762\u8fdb\u884c\u914d\u7f6e\u3002 \u5168\u5c40\u914d\u7f6e\uff1a \u6267\u884c\u4e00\u4e2a\u6216\u591a\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff1a\u5728 pattern \u91cc\u9762\u5199\u5165\u5e94\u7528\u5305\u540d\uff0c\u591a\u4e2a\u5e94\u7528\u4e4b\u95f4\u7528 or \u8fde\u63a5\uff0c\u5982 deepin-music or deepin-movie\uff1b \u5192\u70df\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a smoke\uff1b \u96c6\u6210\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a core \uff1b \u5168\u91cf\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u4e3a\u7a7a\u5373\u53ef\uff1b \u901a\u8fc7 tags \u7684\u914d\u7f6e\u6bd4\u8f83\u7075\u6d3b\uff0c\u540e\u9762\u6807\u7b7e\u5316\u7ba1\u7406\u7ae0\u8282\u4f1a\u8bb2\u5230\uff0c\u652f\u6301\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u7075\u6d3b\u914d\u7f6e\u3002 \u6307\u5b9a\u67d0\u53f0\u673a\u5668\u5728\u6307\u5b9a\u955c\u50cf\u7248\u672c\u4e0a\u6267\u884c\u7528\u4f8b\uff1a\u5728 IP \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a IP\uff0c\u5e76\u5728 URL \u91cc\u9762\u586b\u5165\u955c\u50cf\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u6846\u67b6\u4f1a\u8c03\u7528 PXE \u8fdb\u884c\u81ea\u52a8\u88c5\u673a\uff0c\u88c5\u673a\u5b8c\u4e4b\u540e\u81ea\u52a8\u5f00\u59cb\u6267\u884c\u914d\u7f6e\u7684\u6d4b\u8bd5\u7528\u4f8b\u3002 \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\uff1a \u6bcf\u4e2a\u5e94\u7528\u5185\u90e8\u4f1a\u6709\u4e00\u4e2a\u5355\u72ec\u7684\u914d\u7f6e\u6a21\u5757\uff0c\u4f1a\u5305\u542b\u4e00\u4e9b\u672c\u5e94\u7528\u7684\u6d4b\u8bd5\u8d44\u6e90\u7684\u8def\u5f84\u3001\u6267\u884c\u7528\u4f8b\u7684\u6807\u7b7e\u914d\u7f6e\u7b49\u7b49\uff0c\u5982\u679c\u5728\u5c40\u90e8\u914d\u7f6e\u91cc\u9762\u914d\u7f6e\u4e86\u7528\u4f8b\u6267\u884c\u6807\u7b7e\uff0c\u800c\u5916\u5c42 runner \u51fa\u6ca1\u6709\u6307\u5b9a\u6267\u884c\u6807\u7b7e\uff0c\u5219\u5728\u6267\u884c\u65f6\u53ea\u4f1a\u6267\u884c\u5c40\u90e8\u914d\u7f6e\u5df2\u914d\u7f6e\u7684\uff0c\u82e5\u5916\u5c42 runner \u4e5f\u914d\u7f6e\u4e86\u6267\u884c\u6807\u7b7e\uff0c\u5219\u4f1a\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u7528\u4f8b\u3002 \u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u914d\u7f6e\u90fd\u5728\u540c\u4e00\u4e2a\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\uff0cpy \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684\u7c7b\uff0cini \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684 option\u3002 \u5168\u5c40\u914d\u7f6e\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u7b56\u7565\u5982\u4e0b\uff1a \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5c40\u90e8\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5e94\u7528\u5c42\uff1arunner \u662f\u6d4b\u8bd5\u6267\u884c\u7684\u5165\u53e3\uff0c\u5b83\u4f1a\u6839\u636e\u914d\u7f6e\u91cc\u9762\u7684\u914d\u7f6e\u9879\uff0c\u8fdb\u884c\u7528\u4f8b\u7684\u52a0\u8f7d\u548c\u6267\u884c\u3002\u5b83\u63d0\u4f9b\u63a5\u53e3\u7ed9\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\uff0c\u5e73\u53f0\u4e0a\u7684\u6307\u4ee4\u5b9e\u9645\u4e0a\u90fd\u662f\u901a\u8fc7\u4e0b\u53d1\u7ed9 runner\uff0c\u7136\u540e\u7531 runner \u6765\u6267\u884c\u76f8\u5e94\u7684\u6d4b\u8bd5\u3002 \u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u662f\u4e00\u4e2a\u524d\u7aef\u7cfb\u7edf\uff0c\u53ef\u4ee5\u8fdb\u884c\u6d4b\u8bd5\u673a\u7ba1\u7406\u3001\u81ea\u52a8\u5b89\u88c5\u955c\u50cf\u3001\u81ea\u52a8\u5b89\u88c5\u6307\u5b9a\u5e94\u7528\u7248\u672c\u3001\u8fdb\u884c\u6d4b\u8bd5\u7528\u4f8b\u8303\u56f4\u9009\u62e9\u3001\u7528\u4f8b\u89e6\u53d1\u6267\u884c\u63a7\u5236\u3001\u7ed3\u679c\u5c55\u793a\u8f93\u51fa\u7b49\u3002 \u4e00\u4e2a\u5e94\u7528\u7684\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\u90fd\u53ef\u4ee5\u5355\u72ec\u89e6\u53d1\u3002 \u517c\u5bb9\u6027\u6d4b\u8bd5\u4e3b\u8981\u901a\u8fc7 PXE \u670d\u52a1\u5668\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u88c5\u673a\uff0c\u7136\u540e\u914d\u5408 AT \u8fdb\u884c\u6d4b\u8bd5\uff0c\u53ef\u4ee5\u5b9e\u73b0\u4e0d\u540c\u7cfb\u7edf\u7248\u672c\u3001\u4e0d\u540c\u5e94\u7528\u7248\u672c\u73af\u5883\u4e0a\u90fd\u53ef\u4ee5\u8fdb\u884c\u81ea\u52a8\u5316\u7684 AT \u6267\u884c\uff0c\u63d0\u9ad8\u517c\u5bb9\u6027\u6d4b\u8bd5\u6548\u7387\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_4","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_2","title":"1\u3001\u7528\u4f8b\u89e3\u8026","text":"\u5b58\u5728\u8026\u5408\u5173\u7cfb\u7684\u65b9\u6cd5\uff1a\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u88ab\u5916\u90e8\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\uff0c\u5219\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u8026\u5408\u5173\u7cfb\u3002 1.1\u3001\u901a\u8fc7\u7f16\u8f91\u5668 Find Usages \u67e5\u770b\u6bcf\u4e2a\u65b9\u6cd5\u88ab\u8c03\u7528\u7684\u8def\u5f84\u548c\u88ab\u8c03\u7528\u6b21\u6570\uff1b 1.2\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 1 \u4e2a\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728\u5916\u90e8\u5e94\u7528\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1b 1.3\u3001\u64cd\u4f5c\u5c42\u6587\u4ef6\u540d\u5747\u4ee5 widget \u7ed3\u5c3e\uff0c\u7c7b\u540d\u4ee5 Widget \u7ed3\u5c3e\uff0c\u5982\uff1a\u6587\u4ef6\u540d music_widget.py \uff1a class MusicWidget:\n\"\"\"\u97f3\u4e50\u7684\u64cd\u4f5c\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_2","title":"2\u3001\u516c\u5171\u5e93\u5efa\u8bbe","text":"2.1\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 2 \u4e2a\u53ca\u4ee5\u4e0a\u7684\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728 public_widget \u76ee\u5f55\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1bpublic_widget \u5373\u4e3a\u516c\u5171\u65b9\u6cd5\u5e93\uff1b 2.2\u3001\u5728\u7528\u4f8b\u5c42\u4fee\u6539\u7528\u4f8b\u4e2d\u7c7b\u7684\u5bfc\u5165\u8def\u5f84\uff0c\u5c5e\u4e8e\u516c\u5171\u65b9\u6cd5\u7684\u5219\u8c03\u7528 public_widget \u4e2d\u7684\u7c7b\uff0c\u5916\u90e8\u5e94\u7528\u7684\u64cd\u4f5c\u65b9\u6cd5\uff0c\u5219\u8c03\u7528\u672c\u5e94\u7528\u76ee\u5f55\u4e0b\u91cd\u5199\u7684\u5916\u90e8\u5e94\u7528\u65b9\u6cd5\u3002 \u6bd4\u5982\uff1a\u51e0\u4e4e\u6240\u6709\u591a\u5a92\u4f53\u5e94\u7528\u90fd\u9700\u8981\u901a\u8fc7\u6587\u7ba1\u52a0\u8f7d\u8d44\u6e90\uff0c\u8c03\u8d77\u7684\u6587\u7ba1\u5bf9\u8bdd\u6846\u5b9e\u9645\u4e3a dde-desktop\uff0c\u56e0\u6b64\u5c06 desktop_widget.py \u653e\u5230 public_widget \u91cc\u9762\uff1a class DdeDesktopPublicWidget:\n\"\"\"\u516c\u5171-\u684c\u9762\u7684\u64cd\u4f5c\u65b9\u6cd5\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3_1","title":"3\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406","text":"3.1\u3001\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1a\u5bf9\u5e94 core\u3001smoke\uff0c\u6216\u4e3a\u7a7a\uff1b \u7528\u4f8b\u6765\u6e90\uff1a\u5bf9\u5e94 PMS \u7528\u4f8b\u6765\u6e90\uff0c\u5206\u522b\u7528 acp1\u3001acp2\u3001acp3\u3001acp4 \u8868\u793a\u3002 acp1 \uff1a\u4e1a\u52a1\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5199\u7684\u7528\u4f8b\uff0c\u88ab\u7528\u4e8e\u9a8c\u6536\u6d4b\u8bd5\u7684\uff1b acp2 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5f15\u5165\u7684\u4ea7\u54c1\u9a8c\u6536\u6d4b\u8bc4\u90e8\u7684\u7528\u4f8b\uff1b acp3 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u6839\u636e\u4ea7\u54c1\u9700\u6c42\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\uff1b acp4 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u901a\u8fc7\u793e\u533a\u3001\u8bba\u575b\u7528\u6237\u53cd\u9988\u95ee\u9898\u603b\u7ed3\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\u3002 \u4e3e\u4f8b\uff1a \u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u7528\u4f8b\u6765\u6e90 001 L1 core acp1 \u6807\u7b7e\u91c7\u7528\u679a\u4e3e\u7684\u65b9\u5f0f\u8fdb\u884c\u4ee3\u53f7\u7ba1\u7406\u65b9\u4fbf\u7ba1\u7406\u4ee5\u53ca\u540e\u7eed\u6269\u5c55\u3002 3.2\u3001\u5728\u6bcf\u4e2a\u5e94\u7528\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u7b2c\u4e00\u5217\u4e3a\u7528\u4f8b\u7684 ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ba1\u7406\u6a21\u5757\u5185\u7684\u7528\u4f8b\u6807\u7b7e\u3002\u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 3.3\u3001\u5bf9\u7167 PMS \u4e0a\u7528\u4f8b\u7b49\u7ea7\u3001\u7528\u4f8b\u7c7b\u578b\u548c\u7528\u4f8b\u6765\u6e90\uff0c\u6807\u8bb0\u6240\u6709\u5df2\u5b9e\u73b0\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u540e\u7eed\u7f16\u5199\u65b0\u589e\u81ea\u52a8\u5316\u7528\u4f8b\u65f6\uff0c\u6bcf\u5199\u4e00\u6761\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684 csv \u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u6b64\u6761\u7528\u4f8b\u7684\u6807\u7b7e\u3002 3.4\u3001\u8df3\u8fc7\u7528\u4f8b\u6807\u7b7e\u5316 \u73b0\u6709\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a\uff1a \u4e3e\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u8bb0\u4e3a \u201cskip-\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u8bb0\uff0c\u5982\u679c\u5df2\u7ecf\u6807\u8bb0\u4e86\u8df3\u8fc7\u539f\u56e0\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u8bb0\u4e3a SKIPED\uff0c\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\u3002 \u6240\u6709\u7684\u6807\u7b7e\u5728 docs \u76ee\u5f55\u4e0b\u4f1a\u6709\u4e00\u4e2a\u6587\u6863\uff0c\u6587\u6863\u6682\u5b9a\u540d\u79f0\u4e3a\uff1atags_info.md\uff0c\u7528\u4e8e\u8bf4\u660e\u73b0\u5728\u5df2\u7ecf\u4f7f\u7528\u5230\u7684\u6807\u7b7e\uff0c\u4ee5\u53ca\u8fd9\u4e9b\u6807\u7b7e\u7684\u89e3\u91ca\u548c\u7528\u6cd5\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#4","title":"4\u3001\u7528\u4f8b\u6267\u884c","text":"4.1\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u7684\u9a71\u52a8\u6267\u884c\u903b\u8f91\u529f\u80fd\u5b9e\u73b0 \u5f00\u53d1\u6839\u636e\u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\u91cc\u9762\u7684\u7528\u4f8b\u6807\u7b7e\u6267\u884c\u5bf9\u5e94\u7528\u4f8b\u7684\u529f\u80fd\uff0c\u80fd\u652f\u6301\u591a\u4e2a\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u6267\u884c\u5165\u53e3\u80fd\u968f\u610f\u901a\u8fc7\u7528\u4f8b\u6807\u7b7e\u6307\u5b9a\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002 \u7528\u4f8b\u6807\u7b7e\u7684\u9a71\u52a8\u65b9\u5f0f\u5fc5\u987b\u80fd\u652f\u6301\u6807\u7b7e\u7684\u6269\u5c55\uff0c\u672a\u6765\u968f\u7740\u4e1a\u52a1\u7684\u53d8\u5316\u53ef\u80fd\u9700\u8981\u589e\u52a0\u5404\u79cd\u5404\u6837\u7684\u6807\u7b7e\u3002 4.2\u3001\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u6267\u884c \u529f\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u3001\u6027\u80fd\u6d4b\u8bd5\u7b49\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u662f\u5206\u5f00\u6267\u884c\u7684\uff0c\u4e5f\u5c31\u662f\u5728\u4e00\u6b21\u6267\u884c\u4e2d\uff0c\u53ea\u80fd\u6267\u884c\u5176\u4e2d\u4e00\u79cd\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5177\u4f53\u8981\u6267\u884c\u54ea\u4e00\u79cd\u540c\u6837\u901a\u8fc7\u53c2\u6570\u6765\u63a7\u5236\u3002 4.3\u3001\u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c \u7531\u4e8e\u6d4b\u8bd5\u673a\u8d44\u6e90\u6709\u9650\uff0c\u968f\u7740\u81ea\u52a8\u5316\u7528\u4f8b\u6570\u91cf\u7684\u589e\u52a0\uff0cCI \u6267\u884c\u65f6\u95f4\u4f1a\u8d8a\u6765\u8d8a\u957f\u3002 \u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c\u7684\u529f\u80fd\uff1a \u540c\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\u5206\u6563\u5230\u4e0d\u540c\u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u4e0a\u6267\u884c\uff0c\u7f29\u77ed\u6267\u884c\u603b\u65f6\u95f4\uff1b \u7b2c\u4e8c\u5929\u8dd1\u7684\u65f6\u5019\u540c\u4e00\u4e2a\u673a\u5668\u4e0a\u4f1a\u6267\u884c\u6628\u5929\u6ca1\u6709\u6267\u884c\u5230\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u6267\u884c\u540c\u7406\uff1b \u53ef\u4ee5\u5b9e\u73b0\u5728\u5168\u67b6\u6784\u6d4b\u8bd5\u673a\u4e0a\u8f6e\u6d41\u6267\u884c\u7528\u4f8b\uff0c\u65e2\u80fd\u4fdd\u8bc1\u6267\u884c\u4e86\u6240\u6709\u7684\u7528\u4f8b\uff0c\u53c8\u80fd\u5728\u8d44\u6e90\u6709\u9650\u7684\u60c5\u51b5\u4e0b\u8986\u76d6\u4e86\u6240\u6709\u7684\u67b6\u6784\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#5","title":"5\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0","text":"5.1\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u4f5c\u4e3a\u524d\u7aef\u754c\u9762\u7cfb\u7edf\uff0c\u901a\u8fc7\u9875\u9762\u4e0a\u7684\u4e00\u4e9b\u529f\u80fd\u9009\u9879\u8fdb\u884c\u5bf9\u5e94\u6d4b\u8bd5\u4efb\u52a1\u7684\u7ba1\u7406\u6216\u89e6\u53d1\uff0c\u4e1a\u5185\u6bd4\u8f83\u6d41\u884c\u7684\u5b9e\u73b0\u65b9\u6848\u662f\u4f7f\u7528 Vue + DRF \u5b9e\u73b0\u4e00\u4e2a\u524d\u540e\u7aef\u5206\u79bb\u7684\u7cfb\u7edf\u3002 \u6d4b\u8bd5\u5e73\u53f0\u53ef\u80fd\u4f1a\u6d89\u53ca\u5230\u7684\u6a21\u5757\u6709\uff1a\u6d4b\u8bd5\u673a\u8d44\u6e90\u7ba1\u7406\u6a21\u5757\u3001\u7528\u4f8b\u6267\u884c\u63a7\u5236\u6a21\u5757\u3001\u7ed3\u679c\u5c55\u793a\u6a21\u5757\u3001PXE \u955c\u50cf\u5b89\u88c5\u6a21\u5757\u7b49\u3002 \u7528\u6237\uff08\u6d4b\u8bd5\u3001\u7814\u53d1\u540c\u5b66\u7b49\uff09\u53ef\u4ee5\u914d\u7f6e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5982\u6267\u884c\u54ea\u4e2a\u5e94\u7528\u3001\u6267\u884c\u7528\u4f8b\u7684\u8303\u56f4\u3001\u5728\u54ea\u53f0\u673a\u5668\u4e0a\u6267\u884c\u3001\u955c\u50cf\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u5e94\u7528\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u6267\u884c\u65f6\u95f4\u3002 5.2\u3001\u6267\u884c\u5165\u53e3 runner \u63d0\u4f9b\u7ed9\u6d4b\u8bd5\u5e73\u53f0\u7684\u63a5\u53e3\u5305\u62ec\uff1a\u7528\u4f8b\u6267\u884c\u63a5\u53e3\u3001\u7ed3\u679c\u8fd4\u56de\u63a5\u53e3\u3001\u955c\u50cf\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u955c\u50cf\u5b89\u88c5\u63a5\u53e3\u3001\u5e94\u7528\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u5e94\u7528\u5b89\u88c5\u66f4\u65b0\u63a5\u53e3\u7b49\u3002 \u524d\u7aef\u5e73\u53f0\u76ee\u524d\u8fd8\u6ca1\u6709\u592a\u591a\u8be6\u7ec6\u7684\u65b9\u6848\uff0c\u672c\u6b21\u8bbe\u8ba1\u4e3b\u8981\u96c6\u4e2d\u5728\u540e\u7aef\u8fd9\u90e8\u5206\u67b6\u6784\u7684\u8bbe\u8ba1\u4e0a\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_5","title":"\u56db\u3001\u5b9e\u65bd\u8ba1\u5212","text":"\u8fd1\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u6587\u7ba1\u4ee3\u7801\u89e3\u8026 2022/3/28 2022/4/8 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u56fe\u5f62\u56fe\u50cf\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u97f3\u89c6\u9891\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5168\u5c40\u641c\u7d22\u4ee3\u7801\u89e3\u8026 2022/4/25 2022/4/26 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u516c\u5171\u5e93\u5efa\u8bbe 2022/4/27 2022/5/5 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5c01\u88c5\u7684\u65b9\u6cd5\u6574\u7406\u6210\u4e00\u4e2a\u8868 2022/5/6 2022/5/10 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7528\u4f8b\u6807\u7b7e\u5206\u7c7b\u8bc4\u4f30 2022/5/11 2022/5/11 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u6807\u7b7e\u5316\u6267\u884c\u9a71\u52a8\u7a0b\u5e8f\u7f16\u5199 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u9700\u5b9e\u73b0\u81ea\u52a8\u89e3\u6790 csv \u8868\u683c\u4e2d\u7684\u7528\u4f8b\u7f16\u53f7 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u722c\u866b\u811a\u672c\uff0c\u722c\u53d6 pms \u4e0a\u7528\u4f8b\u7684\u6807\u7b7e 2022/5/11 2022/5/13 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u5b9a\u65f6\u81ea\u52a8\u7ef4\u62a4\u672c\u5730 csv \u6587\u4ef6\u811a\u672c 2022/5/11 2022/5/20 \u4e2d\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u76ee\u5f55\u7ed3\u6784\u8c03\u6574 2022/5/20 2022/6/2 \u5b8c\u6210\u5168\u5c40\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u5177\u4f53\u65b9\u6848\u548c\u903b\u8f91\u5b9e\u73b0 2022/6/6 2022/6/17 \u9759\u6001\u626b\u63cf\u95ee\u9898\u6e05\u96f6 2022/6/20 2022/7/1 \u5b8c\u6210\u65b0\u6846\u67b6\u4f7f\u7528\u57f9\u8bad 2022/7/4 2022/7/11 \u843d\u5730\u8fd0\u884c 2022/7/12 2022/7/20 \u5e95\u5c42\u5e93\u7528\u9014\u8bf4\u660e\u6587\u6863\u7f16\u5199 2022/7/21 2022/7/28"}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\u200b\\u3000\\-\u3001\u3002\uff0c\uff0e\uff1f\uff01\uff1b]+","pipeline":["stemmer"]},"docs":[{"location":"","title":"\u9996\u9875","text":""},{"location":"#youqu","title":"\u6709\u8da3\uff08YouQu\uff09","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/4/1\n# Author : Mikigo\n# =============================================\n \u672c\u7ad9\u603b\u8bbf\u95ee\u91cf \u6b21 \u6b22\u8fce\u5728\u6d4f\u89c8\u5668\u8bbf\u95ee\u3010\u516c\u7f51\u6587\u6863\u3011 \u7edf\u4fe1\u516c\u53f8\u5185\u7f51\u8fd8\u53ef\u4ee5\u8bbf\u95ee\u3010\u5185\u7f51\u6587\u6863\u3011\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u54e6~~"},{"location":"#_1","title":"\u4e00\u3001\u7b80\u4ecb","text":"\u6709\u8da3\uff08YouQu\uff09\u662f\u6df1\u5ea6\u79d1\u6280\u8bbe\u8ba1\u548c\u5f00\u53d1\u7684\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff0c\u91c7\u7528\u7ed3\u6784\u5206\u5c42\u7684\u8bbe\u8ba1\u7406\u5ff5\uff0c\u652f\u6301\u591a\u5143\u5316\u5143\u7d20\u5b9a\u4f4d\u548c\u65ad\u8a00\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\u3001\u5f3a\u5927\u7684\u65e5\u5fd7\u548c\u62a5\u544a\u8f93\u51fa\u7b49\u7279\u8272\u529f\u80fd\uff0c\u540c\u65f6\u5b8c\u7f8e\u517c\u5bb9X11\u3001Wayland\u663e\u793a\u534f\u8bae\uff0c\u73af\u5883\u90e8\u7f72\u7b80\u5355\uff0c\u64cd\u4f5c\u6613\u4e0a\u624b\u3002"},{"location":"#17","title":"\u7231\u4e0a \u201c\u6709\u8da3\u201d \u7684 17 \u4e2a\u7406\u7531","text":" \u6838\u5fc3\u5e93\u63d0\u4f9b\u4e86\u7edf\u4e00\u7684\u63a5\u53e3\uff0c\u7f16\u5199\u65b9\u6cd5\u65f6\u53ea\u9700\u8981\u5bfc\u5165\u4e00\u4e2a\u5305\u5c31\u53ef\u4ee5\u4f7f\u7528\u5230\u6838\u5fc3\u5e93\u63d0\u4f9b\u7684\u6240\u6709\u529f\u80fd\uff1b \u516c\u5171\u5e93\u5c01\u88c5\u4e86\u5f88\u591a\u5e38\u7528\u6a21\u5757\u7684\u76f8\u5173\u65b9\u6cd5\uff0c\u6bd4\u5982\uff1a\u4efb\u52a1\u680f\u7684\u64cd\u4f5c\u3001\u684c\u9762\u7684\u64cd\u4f5c\u3001\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\u7b49\u7b49\uff1b \u9664\u4e86\u5e38\u7528\u7684\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u8bc6\u522b\u4ee5\u5916\uff0c\u6211\u4eec\u8fd8\u63d0\u4f9b\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u5176\u4f7f\u7528\u7b80\u5355\u4e14\u9ad8\u6548\uff0c\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff1b \u5bf9\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u5c06\u7f16\u5199\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u53d8\u5f97\u7b80\u5355\u800c\u4f18\u96c5\uff1b \u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u6280\u672f\u8fdb\u884c\u529f\u80fd\u5347\u7ea7\uff0c\u9664\u4e86\u652f\u6301\u5355\u4e2a\u5750\u6807\u8fd4\u56de\uff0c\u8fd8\u652f\u6301\u540c\u4e00\u754c\u9762\u4e0b\u591a\u4e2a\u76f8\u540c\u5143\u7d20\u8fd4\u56de\u591a\u4e2a\u5750\u6807\u7684\u529f\u80fd\uff1b \u63d0\u4f9b\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u548c\u6279\u91cf\u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u4e0d\u5230\u4e00\u4e2a csv \u6587\u4ef6\u539f\u6765\u80fd\u5e72\u8fd9\u4e48\u591a\u4e8b\u60c5\uff1b \u63d0\u4f9b\u4e86\u529f\u80fd\u5f3a\u5927\u7684\u6267\u884c\u5668\u5165\u53e3\uff0c\u8ba9\u4f60\u53ef\u4ee5\u65b9\u4fbf\u7684\u5728\u672c\u5730\u6267\u884c\u4efb\u4f55\u7528\u4f8b\u96c6\u7684\u7528\u4f8b\uff0c\u5176\u4e30\u5bcc\u7684\u81ea\u5b9a\u4e49\u914d\u7f6e\u9879\uff0c\u6ee1\u8db3\u4f60\u5bf9\u6267\u884c\u5668\u6240\u6709\u7684\u5e7b\u60f3\uff1b \u63d0\u4f9b\u8fdc\u7a0b\u6267\u884c\u7684\u529f\u80fd\uff0c\u53ef\u4ee5\u63a7\u5236\u591a\u53f0\u673a\u5668\u5e76\u884c\u8dd1\uff0c\u6216\u8005\u5206\u5e03\u5f0f\u8dd1\uff0c\u8fd9\u79cd\u4ed8\u8d39\u529f\u80fd\u73b0\u5728\u514d\u8d39\u7ed9\u4f60\u7528\uff1b \u63d0\u4f9b\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u529f\u80fd\uff0c\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u6bcf\u4e2a\u65b9\u6cd5\u5355\u72ec\u5199\u8f93\u51fa\u65e5\u5fd7\u7684\u4ee3\u7801\uff0c\u4e00\u5207\u6211\u4eec\u7ed9\u4f60\u641e\u5b9a\u4e86\uff0c\u65e5\u5fd7\u8f93\u51fa\u4e0d\u4ec5\u5185\u5bb9\u4e30\u5bcc\uff0c\u989c\u503c\u4e5f\u7edd\u5bf9\u5728\u7ebf\uff0c\u6211\u4eec\u8fd8\u81ea\u5df1\u8bbe\u8ba1\u4e86\u4e00\u6b3e\u7ec8\u7aef\u8f93\u51fa\u4e3b\u9898\u53eb\u300a\u4e94\u5f69\u6591\u6593\u7684\u9ed1\u300b\uff1b \u63d0\u4f9b\u4e86\u4e00\u952e\u90e8\u7f72\u81ea\u52a8\u5316\u6d4b\u8bd5\u73af\u5883\u7684\u529f\u80fd\uff0c\u8fde\u4ee3\u7801\u7f16\u8f91\u5668\u90fd\u7ed9\u4f60\u88c5\u597d\u4e86\uff0c\u8ba9\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u73af\u5883\u90e8\u7f72\u800c\u70e6\u607c\uff1b \u63d0\u4f9b\u4e86\u81ea\u52a8\u751f\u6210\u591a\u79cd\u62a5\u544a\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u8f93\u51fa\u4ec0\u4e48\u62a5\u544a\u5f62\u5f0f\u90fd\u884c\uff0c\u800c\u4e14\u6211\u4eec\u5728\u62a5\u544a\u4e2d\u8fd8\u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\u548c\u5931\u8d25\u622a\u56fe\u7684\u529f\u80fd\uff1b \u5bf9\u65ad\u8a00\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u63d0\u4f9b\u66f4\u53cb\u597d\u5316\u7684\u9519\u8bef\u63d0\u793a\uff0c\u8ba9\u5b9a\u4f4d\u95ee\u9898\u7cbe\u51c6\u9ad8\u6548\uff1b \u4e0d\u4ec5\u652f\u6301\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u63a7\u5236\uff0c\u800c\u4e14\u8fd8\u652f\u6301\u52a8\u6001\u63a7\u5236\u7528\u4f8b\u6279\u91cf\u6267\u884c\u7684\u603b\u65f6\u95f4\uff0c\u786e\u4fdd CI \u73af\u5883\u4e0b\u80fd\u987a\u7545\u8fd0\u884c\uff1b \u652f\u6301\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\u6267\u884c\u3001PMS \u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6807\u7b7e\u5316\u6267\u884c\u65b9\u6848\uff0c\u6ee1\u8db3\u4f60\u5404\u79cd\u573a\u666f\u4e0b\u7684\u6267\u884c\u9700\u6c42\uff1b \u652f\u6301\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u529f\u80fd\uff0c\u53ef\u5b9a\u4f4d\u53ef\u65ad\u8a00\uff0c\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\uff1b \u5b8c\u7f8e\u517c\u5bb9 Wayland \u548c X11\uff0c\u771f\u6b63\u505a\u5230\u4e00\u5957\u4ee3\u7801\uff0c\u968f\u5904\u6267\u884c\uff1b \u652f\u6301\u591a\u79cd\u65b9\u5f0f\u7684\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u5176\u4e2d\u5f02\u6b65\u56de\u586b\u7684\u65b9\u6848\uff0c\u5b8c\u7f8e\u89e3\u51b3\u4e86\u6570\u636e\u56de\u586b\u7684\u8017\u65f6\u95ee\u9898\uff1b \u3010\u89c6\u9891\u4ecb\u7ecd\u3011"},{"location":"#_2","title":"\u4e8c\u3001\u5b89\u88c5\u4f7f\u7528","text":"\u57fa\u7840\u6846\u67b6\uff1ahttps://github.com/linuxdeepin/deepin-autotest-framework \u4ece PyPI \u5b89\u88c5: sudo pip3 install youqu\n \u521b\u5efa\u9879\u76ee: youqu-startproject youqu\n \u5b89\u88c5\u4f9d\u8d56: cd youqu\nbash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002 \u5e94\u7528\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684\u5e94\u7528\u540d\u79f0\u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music cd apps/\n \u5c06\u5e94\u7528\u5e93\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u50cf\u8fd9\u6837\uff1a youqu\n\u251c\u2500\u2500 apps\n\u2502 \u251c\u2500\u2500 autotest_deepin_music # \u5e94\u7528\u5e93\n...\n \u5e94\u7528\u5e93\u7684\u540d\u79f0\u4e0d\u53ef\u4ee5\u4fee\u6539\u3002"},{"location":"#_3","title":"\u4e09\u3001\u8fd0\u884c","text":""},{"location":"#1","title":"1. \u5de5\u4f5c\u7a7a\u95f4","text":"\u57fa\u7840\u6846\u67b6\u5de5\u7a0b\u76ee\u5f55\u5efa\u8bae\u653e\u5728 ~ \u76ee\u5f55\u4e0b\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u4e5f\u53ef\u4ee5\u8fd0\u884c\uff0c\u4f46\u662f\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u9700\u8981\u505a\u73af\u5883\u6e05\u7406\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u5b58\u5728\u4ee3\u7801\u88ab\u5220\u9664\u7684\u98ce\u9669\u3002 \u5982\u679c\u4f60\u7684\u673a\u5668\u4e0a\u4e0d\u540c\u76ee\u5f55\u4e0b\u5b58\u5728\u591a\u4e2a YouQu \u5de5\u7a0b\uff0c\u90a3\u4e48\u5728\u8fd0\u884c\u4e4b\u524d\uff0c\u8bf7\u5148\u6267\u884c env.sh \u6821\u6b63\u76f8\u5173\u73af\u5883\u3002"},{"location":"#2","title":"2. \u6267\u884c\u5668","text":"\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u6709\u4e00\u4e2a manage.py \uff0c\u5b83\u662f\u4e00\u4e2a\u6267\u884c\u5668\u5165\u53e3\uff0c\u63d0\u4f9b\u4e86\u672c\u5730\u6267\u884c\u3001\u8fdc\u7a0b\u6267\u884c\u7b49\u7684\u529f\u80fd\u3002 \u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6765\u6267\u884c\uff1a youqu manage.py run -a deepin-music\n"},{"location":"#21","title":"2.1. \u672c\u5730\u6267\u884c","text":"youqu manage.py run\n"},{"location":"#211","title":"2.1.1. \u914d\u7f6e\u6587\u4ef6","text":"\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u914d\u7f6e\u53c2\u6570 \u5728\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u91cc\u9762\u652f\u6301\u914d\u7f6e\u5bf9\u6267\u884c\u7684\u4e00\u4e9b\u53c2\u6570\u8fdb\u884c\u914d\u7f6e\uff0c\u5e38\u7528\u7684\u5982\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;-----------------------------------------------\n;1.KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2.KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f\n;e.g. TAGS = L1 or smoke\n;-----------------------------------------------\n;\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\uff0c\u5c06\u8981\u6267\u884c\u7684\u7528\u4f8b\u5199\u5165\u6307\u5b9a\u7684 csv \u6587\u4ef6\n;\u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u4ece\u57fa\u7840\u6846\u67b6\u6839\u76ee\u5f55\u5f00\u59cb\uff1ae.g. CASE_FILE = case_list.txt\n;\u5982\u679c\u8fd9\u91cc\u6709\u503c\uff0cAPP_NAME KEYWORDS TAGS \u7684\u914d\u7f6e\u5747\u4e0d\u751f\u6548\nCASE_FILE =\n;=============================== RUNNER CONFIG ===================================\n[runner]\n;\u6700\u5927\u5931\u8d25\u7528\u4f8b\u6570\u91cf\u7684\u5360\u6bd4\n;\u6bd4\u5982\uff1a\u603b\u6267\u884c\u7528\u4f8b\u6570\u4e3a 100, \u82e5 MAX_FAIL = 0.5,\u5219\u5931\u8d25\u7528\u4f8b\u6570\u8fbe\u5230 50 \u5c31\u4f1a\u7ec8\u6b62\u6d4b\u8bd5\u3002\nMAX_FAIL = 1\n;\u5355\u6761\u7528\u4f8b\u7684\u8d85\u65f6\u65f6\u95f4\uff0c\u5982\u679c\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u8d85\u65f6\uff0c\u8fd9\u6761\u7528\u4f8b\u4f1a\u88ab\u505c\u6b62\uff0c\u540e\u7eed\u7528\u4f8b\u7ee7\u7eed\u6267\u884c\u3002\n;\u5355\u4f4d\u4e3a\u79d2\n;\u8fd9\u662f\u4e00\u4e2a\u5168\u5c40\u7edf\u4e00\u914d\u7f6e\uff0c\u5982\u679c\u67d0\u6761\u7528\u4f8b\u9700\u8981\u5355\u72ec\u914d\u7f6e\u8d85\u65f6\u65f6\u95f4\uff0c\u53ef\u4ee5\u5728\u7528\u4f8b\u4e2d\u8fd9\u6837\u5199\uff1a\n;@pytest.mark.timeout(500)\n;def test_xxx_001():\n; ...\n;\u4f1a\u8bdd\u8d85\u65f6\uff08\u6240\u6709\u7528\u4f8b\u6267\u884c\u7684\u8d85\u65f6\u65f6\u95f4\uff09\u662f\u6839\u636e\u5168\u5c40\u8d85\u65f6\u914d\u7f6e\u548c\u7528\u4f8b\u5355\u72ec\u8d85\u65f6\u914d\u7f6e\u81ea\u52a8\u8ba1\u7b97\u7684\u3002\nCASE_TIME_OUT = 200\n;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\n;\u6ce8\u610f\uff0cRERUN = 1 \u8868\u793a\u91cd\u8dd1 1 \u6b21\uff0c\u5373\u7b2c\u4e00\u6b21\u7528\u4f8b\u6267\u884c\u5931\u8d25\u4f1a\u81ea\u52a8\u91cd\u8dd1 1 \u6b21\uff0c\u603b\u5171\u6267\u884c 2 \u6b21\uff1b\n;\u5982\u679c\u7b2c 2 \u6b21\u6267\u884c\u6210\u529f\uff0c\u7ed3\u679c\u6210\u529f\uff0c\u5931\u8d25\u4ea6\u4e3a\u5931\u8d25\u3002\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c 1 \u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff0cRERUN >= RECORD_FAILED_CASE\u3002\n;1.\u5173\u95ed\u5f55\u5c4f\uff1aRECORD_FAILED_CASE > RERUN\n;2.\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1aRECORD_FAILED_CASE = 0\nRECORD_FAILED_CASE = 1\n;yes \u6bcf\u6761\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u8fdb\u884c\u73af\u5883\u6e05\u7406\nCLEAN_ALL = yes\n;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387, \u6bd4\u5982\uff1a1920x1080\n;no: \u8868\u793a\u4e0d\u505a\u5206\u8fa8\u7387\u6821\u9a8c\nRESOLUTION = 1920x1080\n;\u4e0d\u8df3\u8fc7\u7528\u4f8b\uff0ccsv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86 skip-xxx\u7684\u7528\u4f8b\u4e0d\u8df3\u8fc7\nNOSKIP = no\n;ignore fixed\n;no\uff0c\u53ea\u8981\u6807\u8bb0\u4e86fixed\u7684\u7528\u4f8b\uff0c\u5373\u4f7f\u6807\u8bb0\u4e86skip-\uff0c\u4e5f\u4f1a\u6267\u884c\uff1b\n;yes\uff0cfixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\uff1b\nIFIXED = no\n;\u8981\u5b89\u88c5deb\u5305\u7684\u8def\u5f84\n;e.g : ~/Downloads/ \u5b89\u88c5\u4e0b\u8f7d\u76ee\u5f55\u4e0b\u7684deb\u5305\uff0c\u5982\u679c\u662f\u8fdc\u7a0b\u6267\u884c\uff0c\u4f1a\u81ea\u52a8\u62f7\u8d1d\u5230\u8fdc\u7a0b\u5e76\u5b89\u88c5\u3002\nDEB_PATH =\n;DEBUG \u6a21\u5f0f\u6267\u884c\u7528\u4f8b\uff0c\u53ea\u6536\u96c6\u4e0d\u6267\u884c\u7528\u4f8b\uff0c\u4e5f\u4e0d\u505a\u8bbe\u5907\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002\nDEBUG = no\n;\u8bb0\u5f55top\u547d\u4ee4\u67e5\u8be2\u7684\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0cTOP = 3 \u8868\u793a\u8bb0\u5f55\u524d3\u4e2a\u8fdb\u7a0b\u3002\nTOP =\n;\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\nREPEAT =\n;\u9ed8\u8ba4\u5728\u6240\u6709\u6d4b\u8bd5\u5b8c\u6210\u4e4b\u540e\u8f93\u51fa\u62a5\u9519\u4fe1\u606f.\n;yes, \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\nDURING_FAIL = no\n;\u6ce8\u518c\u81ea\u542f\u670d\u52a1\nAUTOSTART = no\n;=============================== REPORT CONFIG ===================================\n[report]\n;\u6d4b\u8bd5\u62a5\u544a\u7684title\nREPORT_TITLE = YouQu Report\n;\u6d4b\u8bd5\u62a5\u544a\u7684name\nREPORT_NAME = YouQu Report\n;\u6d4b\u8bd5\u62a5\u544a\u7684\u9ed8\u8ba4\u8bed\u8a00\n;en:English\n;ru:\u0420\u0443\u0441\u0441\u043a\u0438\u0439\n;zh:\u4e2d\u6587\n;de:Deutsch\n;nl:Nederlands\n;he:Hebrew\n;br:Brazil\n;pl:Polski\n;ja:\u65e5\u672c\u8a9e\n;es:Espa\u00f1ol\n;kr:\ud55c\uad6d\uc5b4\n;fr:Fran\u00e7ais\n;az:Az\u0259rbaycanca\nREPORT_LANGUAGE = zh\n;\u7528\u4f8b\u6267\u884c\u5b8c\u540e\u751f\u6210\u7684\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n;\u76ee\u524d\u652f\u6301 allure, xml, json \uff08\u652f\u6301\u540c\u65f6\u751f\u6210\uff09\nREPORT_FORMAT = allure, xml, json\n;\u6307\u5b9a\u62a5\u544a\u751f\u6210\u7684\u8def\u5f84\uff08\u76f8\u5bf9\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\uff09\nALLURE_REPORT_PATH = report/\nXML_REPORT_PATH = report/\nJSON_REPORT_PATH = report/\n;=============================== GLOBAL CONFIG ===================================\n[globalconfig]\n;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\nPASSWORD = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\nIMAGE_MATCH_NUMBER = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6bcf\u6b21\u95f4\u9694\u7b49\u5f85\u65f6\u95f4\nIMAGE_MATCH_WAIT_TIME = 1\n;\u56fe\u50cf\u8bc6\u522b\u5339\u914d\u5ea6\nIMAGE_RATE = 0.9\n;\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u5b9e\u65f6\u56fe\u50cf\u4fdd\u5b58\u8def\u5f84\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u5750\u6807\nSCREEN_CACHE = /tmp/screen.png\n;\u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\u7684\u8def\u5f84\nTMPDIR = /tmp/tmpdir\n;\u7cfb\u7edf\u4e3b\u9898\nSYS_THEME = deepin\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = youqu-dev.uniontech.com\n;OpenCV\u670d\u52a1\u7aef\u5730\u5740\nOPENCV_SERVER_HOST = youqu-dev.uniontech.com\n;=============================== PMS CONFIG ===================================\n;PMS\u76f8\u5173\u914d\u7f6e\uff0c\u5305\u542b\u4ee5\u4e0b\u51e0\u4e2a\u65b9\u9762\uff1a\n;1.PMS\u6d4b\u8bd5\u5957\u6267\u884c\n;2.\u81ea\u52a8\u4ecePMS\u722c\u53d6\u6570\u636e\u5e76\u540c\u6b65\u672c\u5730CSV\u6587\u4ef6\n;3.PMS\u6570\u636e\u56de\u586b\n[pms]\n;PMS\u7684\u7528\u6237\u540d,\u5982: ut001234\nPMS_USER =\n;PMS\u7684\u5bc6\u7801\nPMS_PASSWORD =\n;PMS\u6d4b\u8bd5\u5957\u7684ID\n;\u5728PMS\u4e0a\u67e5\u770b\u7528\u4f8b\u201c\u5957\u4ef6\u201d\u94fe\u63a5: https://pms.uniontech.com/testsuite-view-495.html\n;\u6d4b\u8bd5\u5957ID\u4e3a: 495\nSUITE_ID =\n;\u6570\u636e\u56de\u586b\u5fc5\u987b\u5173\u8054PMS\u6d4b\u8bd5\u5355\n;\u5728PMS\u4e0a\u67e5\u770b\u6d4b\u8bd5\u5355\u94fe\u63a5: https://pms.uniontech.com/testtask-cases-20747.html\n;\u6d4b\u8bd5\u5355ID\u4e3a: 20747\nTASK_ID =\n;\u5c06\u6d4b\u8bd5\u7ed3\u679c\u6570\u636e\u56de\u586b\u5230PMS\n;\u4e3a\u7a7a: \u8868\u793a\u4e0d\u56de\u586b,\u4e0d\u4f1a\u5728\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u751f\u6210json\u7ed3\u679c\u6587\u4ef6;\n;async: \u8868\u793a\u9010\u6761\u5f02\u6b65\u56de\u586b,\u540e\u9762\u4e00\u6761\u6267\u884c\u5f00\u59cb\u65f6\u901a\u8fc7\u5b50\u7ebf\u7a0b\u5bf9\u524d\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u8fdb\u884c\u56de\u586b\uff0c\u5982\u6b64\u5b9e\u73b0\u65f6\u95f4\u6548\u7387\u6700\u5927\u5316;\n;finish: \u8868\u793a\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u6210\u4e4b\u540e\u9010\u4e2a\u56de\u586b(PMS\u4e0d\u652f\u6301\u5e76\u53d1);\nSEND_PMS =\n;\u6570\u636e\u56de\u586b\u7684\u89e6\u53d1\u8005\n;auto: \u6846\u67b6\u81ea\u52a8\u56de\u586b,\u914d\u5408SEND_PMS\u914d\u7f6e\u4f7f\u7528,\u4f60\u53ef\u4ee5\u9009\u62e9\u5728\u4e0d\u540c\u7684\u9636\u6bb5\u8fdb\u884c\u6570\u636e\u56de\u586b;\n;hand: \u624b\u52a8\u56de\u586b,\u6bcf\u6761\u7528\u4f8b\u4ecd\u7136\u4f1a\u751f\u6210json\u6587\u4ef6,\u4f46\u6846\u67b6\u4e0d\u4f1a\u8fdb\u884c\u6570\u636e\u56de\u586b,\u9700\u8981\u4f60\u53ef\u4ee5\u5728\u4f60\u60f3\u8981\u53d1\u9001\u7684\u65f6\u95f4\u70b9\u624b\u52a8\u89e6\u53d1\u56de\u586b;\nTRIGGER = auto\n;PMS\u56de\u586b\u7684\u91cd\u8bd5\u6b21\u6570\n;\u5982\u679c\u63a5\u53e3\u8bf7\u6c42\u5931\u8d25,\u4f1a\u8fdb\u884c\u91cd\u8bd5\nSEND_PMS_RETRY_NUMBER = 2\n[csv_link_pms_lib]\n;caselib: \u7528\u4f8b\u5e93\n;testcase: \u4ea7\u54c1\u5e93\u7528\u4f8b\nCASE_FROM = caselib\n[csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/caselib-browse-81.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 81\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic =\n[export_csv]\n;\u5bfc\u51fa\u7684csv\u6587\u4ef6\u540d\u79f0\uff0c\u9ed8\u8ba4 case_list.csv\nCSV_FILE = case_list.csv\n;exportcsv \u547d\u4ee4\u5bfc\u51fa case_list.csv \u6587\u4ef6\u65f6\u914d\u7f6e\u7684\u5b57\u6bb5\u540d\uff0c\u7528\u4f8b\u540d\u79f0\u9ed8\u8ba4\u5b58\u5728\u7b2c\u4e00\u5217\uff0c\u65e0\u9700\u6dfb\u52a0\nCSV_HEARD = \u7528\u4f8b\u7ea7\u522b,\u7528\u4f8b\u7c7b\u578b,\u6d4b\u8bd5\u7ea7\u522b,\u662f\u5426\u8df3\u8fc7\n[log_cli]\n;\u65e5\u5fd7\u76f8\u5173\u914d\u7f6e\uff08\u4e0d\u6253\u5370\u6784\u9020\u51fd\u6570\u548c\u9b54\u6cd5\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff09\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = DEBUG\n# ============= \u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u914d\u7f6e ================\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u5f00\u5934\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7, \u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_STARTSWITH = Assert\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u7ed3\u5c3e\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_ENDSWITH = Widget\n;\u652f\u6301\u7c7b\u540d\u5305\u542b xxx \u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_CONTAIN = ShortCut\n# ==============================================\n \u914d\u7f6e\u5b8c\u6210\u4e4b\u540e\uff0c\u76f4\u63a5\u5728\u547d\u4ee4\u884c\u6267\u884c manage.py \u5c31\u597d\u4e86\u3002 youqu manage.py run\n"},{"location":"#212","title":"2.1.2. \u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a youqu manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -h, --help show this help message and exit\n-a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--record_failed_case RECORD_FAILED_CASE\n\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--max_fail MAX_FAIL \u6700\u5927\u5931\u8d25\u7387\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--resolution RESOLUTION\n\u68c0\u67e5\u5206\u8fa8\u7387\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms {,async,finish}\n\u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--trigger {,auto,hand}\n\u89e6\u53d1\u8005\n-f CASE_FILE, --case_file CASE_FILE\n\u6839\u636e\u6587\u4ef6\u6267\u884c\u7528\u4f8b\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n--pms_user PMS_USER pms \u7528\u6237\u540d\n--pms_password PMS_PASSWORD\npms \u5bc6\u7801\n--suite_id SUITE_ID pms \u6d4b\u8bd5\u5957ID\n--pms_info_file PMS_INFO_FILE\npms \u4fe1\u606f\u6587\u4ef6\n--top TOP \u8fc7\u7a0b\u4e2d\u8bb0\u5f55top\u547d\u4ee4\u4e2d\u7684\u503c\n--lastfailed \u4ec5\u6267\u884c\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\n--duringfail \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\n--repeat REPEAT \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n--project_name PROJECT_NAME\n\u5de5\u7a0b\u540d\u79f0\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--build_location BUILD_LOCATION\n\u6784\u5efa\u5730\u533a\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--line LINE \u6267\u884c\u7684\u4e1a\u52a1\u7ebf\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--autostart AUTOSTART \u7528\u4f8b\u6267\u884c\u7a0b\u5e8f\u6ce8\u518c\u5230\u5f00\u673a\u81ea\u542f\u670d\u52a1\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a youqu manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\"\n \u547d\u4ee4\u884c\u53c2\u6570\u4f18\u5148\u7ea7\u662f\u9ad8\u4e8e\u914d\u7f6e\u6587\u4ef6\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u4e86\u5bf9\u5e94\u7684\u53c2\u6570\uff0c\u914d\u7f6e\u6587\u4ef6\u4e2d\u4e0d\u7ba1\u662f\u5426\u914d\u7f6e\u5747\u4e0d\u751f\u6548\u3002 --app \u5165\u53c2\u8fd8\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\uff0c\u4e0b\u9762\u7684\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u540c\u6837\u652f\u6301\u3002"},{"location":"#22","title":"2.2. \u8fdc\u7a0b\u6267\u884c","text":"\u8fdc\u7a0b\u6267\u884c\u5c31\u662f\u7528\u672c\u5730\u4f5c\u4e3a\u670d\u52a1\u7aef\u63a7\u5236\u8fdc\u7a0b\u673a\u5668\u6267\u884c\uff0c\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u76f8\u540c\uff1b \u4f7f\u7528 remote \u547d\u4ee4\uff1a youqu manage.py remote\n"},{"location":"#221","title":"2.2.1. \u8fdc\u7a0b\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u6267\u884c","text":"\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u6267\u884c\u5c31\u662f\u7531\u672c\u5730 YouQu \u4f5c\u4e3a\u670d\u52a1\u7aef\uff0c\u63a7\u5236\u8fdc\u7a0b N \u53f0\u673a\u5668\u6267\u884c\u76f8\u540c\u7684\u7528\u4f8b\uff0c\u6267\u884c\u5b8c\u4e4b\u540e\u6240\u6709\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u7ed3\u679c\u4f1a\u8fd4\u56de\u7ed9\u670d\u52a1\u7aef report \u76ee\u5f55\u4e0b\uff1b \u8fdc\u7a0b\u6267\u884c\u540c\u6837\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u8fdb\u884c\u7528\u4f8b\u76f8\u5173\u914d\u7f6e\uff1b \u9700\u8981\u91cd\u70b9\u8bf4\u4e00\u4e0b\u8fdc\u7a0b\u6267\u884c\u65f6\u7684\u6d4b\u8bd5\u673a\u4fe1\u606f\u914d\u7f6e\uff0c\u5728\u914d\u7f6e\u6587\u4ef6 setting/remote.ini \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\u3001IP\u3001\u5bc6\u7801\u3002 ;=============================== CLIENT LIST =====================================\n; \u6d4b\u8bd5\u673a\u914d\u7f6e\u5217\u8868\n;[client{number}] ;\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u6709\u591a\u5c11\u53f0\u6d4b\u8bd5\u673a\u5c31\u5199\u591a\u5c11\u4e2a client\uff0c\u522b\u540d\u5fc5\u987b\u5305\u542b client \u5b57\u7b26\uff0c\u4e14\u4e0d\u80fd\u91cd\u590d\u3002\n;user = ;\u6d4b\u8bd5\u673a user\n;ip = ;\u6d4b\u8bd5\u673a ip\n;password = 1 ;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801, \u53ef\u4ee5\u4e0d\u914d\u7f6e\u6b64\u9879\uff0c\u9ed8\u8ba4\u53d6 CLIENT_PASSWORD \u7684\u503c\uff1b\n;\u5982\u679c\u4f60\u6240\u6709\u6d4b\u8bd5\u673a\u5bc6\u7801\u90fd\u76f8\u540c\uff0c\u90a3\u4e48\u53ea\u9700\u8981\u914d\u7f6e CLIENT_PASSWORD \u5c31\u53ef\u4ee5\u4e86\n;=================================================================================\n[client1]\nuser = uos\nip = 10.8.15.xx\n[client2]\nuser = uos\nip = 10.8.15.xx\n[client3]\nuser = uos\nip = 10.8.11.xx\n \u6709\u591a\u5c11\u53f0\u673a\u5668\u5c31\u50cf\u8fd9\u6837\u53c2\u8003\u4e0a\u9762\u7684\u683c\u5f0f\u5199\u5c31\u884c\u4e86\u3002 \u7136\u540e\u5728\u547d\u4ee4\u884c\uff1a youqu manage.py remote\n \u8fd9\u6837\u8fd0\u884c\u662f\u4ece\u914d\u7f6e\u6587\u4ef6\u53bb\u8bfb\u53d6\u76f8\u5173\u914d\u7f6e\u3002 \u5982\u679c\u4f60\u4e0d\u60f3\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\uff0c\u4f60\u4ecd\u7136\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u8fdb\u884c\u4f20\u53c2\uff0c \u4ee5\u4e0b\u4e3a python3 manage.py remote \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -h, --help show this help message and exit\n-c CLIENTS, --clients CLIENTS\n\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679cpassword\u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6sett\ning/remote.ini\u4e2dCLIENT_PASSWORD\u7684\u503c,\u6bd4\u5982: uos@10.8.13.33:1\n\u6216 uos@10.8.13.33\n-s, --send_code \u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a\uff08\u4e0d\u542breport\u76ee\u5f55\uff09\n-e, --build_env \u642d\u5efa\u6d4b\u8bd5\u73af\u5883,\u5982\u679c\u4e3ayes\uff0c\u4e0d\u7ba1send_code\u662f\u5426\u4e3ayes\u90fd\u4f1a\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a.\n-p CLIENT_PASSWORD, --client_password CLIENT_PASSWORD\n\u6d4b\u8bd5\u673a\u5bc6\u7801\uff08\u5168\u5c40\uff09\n-y PARALLEL, --parallel PARALLEL\nyes:\u8868\u793a\u6240\u6709\u6d4b\u8bd5\u673a\u5e76\u884c\u8dd1\uff0c\u6267\u884c\u76f8\u540c\u7684\u6d4b\u8bd5\u7528\u4f8b;no:\u8868\u793a\u6d4b\u8bd5\u673a\u5206\u5e03\u5f0f\u6267\u884c\uff0c\u670d\u52a1\u7aef\u4f1a\u6839\u636e\u6536\u96c6\u5230\u7684\u6d4b\u8bd5\u7528\u4f8b\u81ea\n\u52a8\u5206\u914d\u7ed9\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u3002\n \u9664\u4e86\u8fd9\u4e9b\u7279\u6709\u53c2\u6570\u4ee5\u5916\uff0c\u5b83\u540c\u6837\u652f\u6301\u672c\u5730\u6267\u884c\u7684\u6240\u6709\u53c2\u6570\uff1b \u5728\u547d\u4ee4\u884c\u8fd9\u6837\u8fd0\u884c\uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\"\n \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report \u76ee\u5f55\u4e0b\u56de\u6536\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u7684\u6d4b\u8bd5\u62a5\u544a\u3002 \u6ce8\u610f\uff0c\u5982\u679c\u8fdc\u7a0b\u673a\u5668\u6ca1\u6709\u642d\u5efa\u81ea\u52a8\u5316\u6d4b\u8bd5\u73af\u5883\uff0c\u8bb0\u5f97\u52a0\u4e0a\u53c2\u6570 -e \uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\" -e\n \u6267\u884c\u524d\u786e\u4fdd\u8fdc\u7a0b\u673a\u5668\u5df2\u7ecf\u5f00\u542f\u4e86 ssh \u670d\u52a1\uff0c\u5426\u5219\u4f1a\u63d0\u793a\u65e0\u6cd5\u8fde\u63a5\uff0c\u5982\u679c\u6ca1\u6709\u5f00\u542f\uff0c\u8bf7\u624b\u52a8\u5f00\u542f\uff1a sudo systemctl restart ssh\nsudo systemctl enable ssh\n \u914d\u7f6e\u6587\u4ef6\u5176\u4ed6\u76f8\u5173\u914d\u7f6e\u9879\u8be6\u7ec6\u8bf4\u660e\uff0c\u8bf7\u67e5\u770b\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u6ce8\u91ca\u5185\u5bb9\u3002"},{"location":"#222","title":"2.2.2. \u8fdc\u7a0b\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u8d1f\u8f7d\u5747\u8861\u6267\u884c","text":"\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u8d1f\u8f7d\u5747\u8861\u6267\u884c\u4e5f\u662f\u7528\u672c\u5730\u4f5c\u4e3a\u670d\u52a1\u7aef\u63a7\u5236\u8fdc\u7a0b\u673a\u5668\u6267\u884c\uff0c\u4f46\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u4e0d\u540c\uff0c\u800c\u662f\u6240\u6709\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u4e4b\u548c\uff0c\u4e3a\u4f60\u60f3\u8981\u6267\u884c\u7684\u7528\u4f8b\u96c6\uff1b \u4f3c\u4e4e\u6709\u70b9\u96be\u4ee5\u7406\u89e3\uff0c\u6211\u7528\u5927\u767d\u8bdd\u4e3e\u4f8b\u63cf\u8ff0\u4e0b\u5c31\u662f\uff0c\u670d\u52a1\u7aef\u60f3\u8981\u6267\u884c 10 \u6761\u7528\u4f8b\uff0c\u73b0\u5728\u8fdc\u7a0b\u673a\u5668\u6709 5 \u53f0\uff1b \u7136\u540e\u670d\u52a1\u7aef\u5c31\u5148\u62ff\u7740\u7b2c 1 \u6761\u7528\u4f8b\u7ed9\u8fdc\u7a0b 1 \u53f7\u673a\u6267\u884c\uff0c\u62ff\u7b2c 2 \u6761\u7528\u4f8b\u7ed9\u8fdc\u7a0b 2 \u53f7\u673a\u6267\u884c...\uff0c\u5982\u6b64\u5faa\u73af\u76f4\u5230\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\uff0c\u8fd9\u5c31\u662f\u8d1f\u8f7d\u5747\u8861\u6267\u884c\u3002 \u4f7f\u7528\u65b9\u6cd5\u548c\u524d\u9762\u4e00\u6837\uff0c\u53ea\u662f\u9700\u8981\u589e\u52a0\u4e00\u4e2a\u53c2\u6570\uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\" --parallel no\n"},{"location":"#23-pms","title":"2.3. PMS \u6570\u636e\u56de\u586b","text":"\u6d4b\u8bd5\u5355\u5173\u8054\u7684\u7528\u4f8b\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u5bf9\u5e94\u7684\u53bb\u8dd1\u8fd9\u4e9b\u5173\u8054\u7684\u7528\u4f8b\uff0c\u5e76\u4e14\u5c06\u6267\u884c\u7684\u7ed3\u679c\u56de\u586b\u7684\u6d4b\u8bd5\u7528\u4f8b\u7684\u72b6\u6001\u91cc\u9762\u3002 PMS \u6570\u636e\u56de\u586b\u4e3b\u8981\u6709\u4e09\u79cd\u65b9\u5f0f\uff1a \uff081\uff09\u5f02\u6b65\u56de\u586b \u5728\u7528\u4f8b\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\uff0c\u91c7\u7528\u5f02\u6b65\u7684\u65b9\u5f0f\u53bb\u8fdb\u884c\u6570\u636e\u56de\u586b\uff0c\u76f4\u767d\u7684\u8bb2\u5c31\u662f\uff0c\u7b2c\u4e8c\u6761\u7528\u4f8b\u5f00\u59cb\u8dd1\u7684\u65f6\u5019\uff0c\u901a\u8fc7\u5b50\u7ebf\u7a0b\u53bb\u505a\u7b2c\u4e00\u6761\u7528\u4f8b\u7684\u6570\u636e\u56de\u586b\uff0c\u5982\u6b64\u5faa\u73af\uff0c\u76f4\u5230\u6240\u6709\u7528\u4f8b\u6267\u884c\u7ed3\u675f\uff1b \u8fd9\u79cd\u65b9\u6848\u7684\u65f6\u95f4\u6548\u7387\u6700\u9ad8\u7684\uff0c\u56e0\u4e3a\u7406\u8bba\u4e0a\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u662f\u5927\u4e8e\u6570\u636e\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\u65f6\u95f4\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u5f53\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u6570\u636e\u56de\u586b\u4e5f\u5b8c\u6210\u4e86\u3002 \u4f7f\u7528\u65b9\u6cd5\uff0c\u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u4ee5\u4e0b\u53c2\u6570\uff1a\uff08\u4ee5\u4e0b\u6d89\u53ca\u5230\u7684\u53c2\u6570\u914d\u7f6e\u90fd\u662f\u5728\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u914d\u7f6e\uff09 PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = async\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \u8fd9\u4e2a\u53c2\u6570\u53ef\u586b\u53ef\u4e0d\u586b\uff0c\u4f46\u662f\u586b\u4e86\u53ef\u4ee5\u63d0\u9ad8\u7528\u4f8b\u7684\u6267\u884c\u901f\u5ea6\uff0c\u56e0\u4e3a\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u53ef\u4ee5\u6307\u5b9a\u5230\u5177\u4f53\u7684\u5e94\u7528\u5e93\u3002\uff08\u4e0b\u540c\uff09\n \uff082\uff09\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u56de\u586b \u7b49\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u518d\u9010\u4e2a\u8fdb\u884c\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u6b64\u65b9\u6848\u65f6\u95f4\u6548\u7387\u6bd4\u8f83\u4f4e\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \uff083\uff09\u624b\u52a8\u56de\u586b \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4e0d\u505a\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u540e\u7eed\u624b\u52a8\u5c06\u7ed3\u679c\u8fdb\u884c\u56de\u586b\u8bf7\u6c42\u3002 \u7528\u4f8b\u6267\u884c\u65f6\u914d\u7f6e\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = hand\nAPP_NAME = \u540e\u7eed\u624b\u52a8\u56de\u586b\u65b9\u6cd5\uff1a youqu manage.py pms --send2task yes\n"},{"location":"#_4","title":"\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898","text":"\u7531\u540c\u5b66\u53ef\u80fd\u4f1a\u53d1\u73b0\uff0c\u600e\u4e48\u56de\u586b\u4e00\u6b21\u4e4b\u540e\uff0c\u540e\u9762\u60f3\u518d\u6b21\u56de\u586b\u5c31\u4e0d\u751f\u6548\u4e86\uff1b \u8fd9\u662f\u56e0\u4e3a\u4e3a\u4e86\u5e94\u5bf9\u524d\u9762\u63d0\u5230\u7684\u591a\u79cd\u6570\u636e\u56de\u586b\u7684\u65b9\u5f0f\uff0c\u5728 report \u76ee\u5f55\u4e0b\u4f1a\u7531 pms_xxx \u5f00\u5934\u7684\u76ee\u5f55\uff0c\u8bb0\u5f55\u4e86\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u548c\u56de\u586b\u60c5\u51b5\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u4e4b\u524d\u5df2\u7ecf\u56de\u586b\u8fc7\u4e86\uff0c\u540e\u7eed\u5c31\u4e0d\u4f1a\u518d\u6b64\u89e6\u53d1\u56de\u586b\u4e86\uff1b \u5982\u679c\u4f60\u60f3\u91cd\u65b0\u505a\u56de\u586b\uff0c\u4f60\u53ef\u4ee5\u628a report/pms_xxx \u76ee\u5f55\u5220\u6389\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u91cd\u65b0\u505a\u6570\u636e\u56de\u586b\u4e86\uff1b"},{"location":"#24-csv","title":"2.4. \u5bfc\u51fa CSV \u6587\u4ef6","text":"\u6846\u67b6\u63d0\u4f9b\u5bfc\u51fa\u6307\u5b9a\u6807\u7b7e\u7528\u4f8b\u7684\u529f\u80fd\uff1a youqu manage.py exportcsv -a deepin-album -t CICD\n \u8868\u793a\u5bfc\u51fa deepin-album \u7684\u7528\u4f8b\u4e2d\u6807\u8bb0\u4e86 CICD \u6807\u7b7e\u7684\u7528\u4f8b\uff0c\u5bfc\u51fa CSV \u6587\u4ef6\u7684\u5b57\u6bb5\u683c\u5f0f\u5df2\u7ecf\u9002\u914d\u4e86 CICD \u7684\u8981\u6c42\u3002"},{"location":"#25-app","title":"2.5. \u811a\u624b\u67b6\u65b0\u5efa APP \u5de5\u7a0b","text":"\u65b0\u5efa\u4e00\u4e2a APP \u5de5\u7a0b\uff1a youqu manage.py startapp autotest_deepin_some \u8fd9\u6837\u5728 apps \u76ee\u5f55\u4e0b\u4f1a\u521b\u5efa\u4e00\u4e2a\u5b50\u9879\u76ee\u5de5\u7a0b autotest_deepin_some\uff0c\u540c\u65f6\u65b0\u5efa\u597d\u5de5\u7a0b\u6a21\u677f\u76ee\u5f55\u548c\u6a21\u677f\u6587\u4ef6\uff1a apps\n\u2514\u2500\u2500 autotest_deepin_some\n \u00a0\u00a0 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_case.py\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 config.ini\n \u00a0\u00a0 \u251c\u2500\u2500 config.py\n \u00a0\u00a0 \u251c\u2500\u2500 conftest.py\n \u00a0\u00a0 \u251c\u2500\u2500 control\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_assert.py\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some.csv\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u2514\u2500\u2500 widget\n \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 case_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 other.ini\n \u00a0\u00a0 \u251c\u2500\u2500 other_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 pic_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2514\u2500\u2500 ui.ini\n autotest_deepin_some \u662f\u4f60\u7684\u5de5\u7a0b\u540d\u79f0\uff0c\u6bd4\u5982\uff1aautotest_deepin_music \uff1b \u5728\u6b64\u57fa\u7840\u4e0a\uff0c\u4f60\u53ef\u4ee5\u5feb\u901f\u7684\u5f00\u59cb\u4f60\u7684 AT \u9879\u76ee\u3002"},{"location":"#26","title":"2.6. \u7528\u4f8b\u6807\u7b7e\u81ea\u52a8\u540c\u6b65","text":"\u7528\u4e8e\u81ea\u52a8\u540c\u6b65 PMS \u7528\u4f8b\u6807\u7b7e\u6570\u636e\u81f3\u672c\u5730 CSV \u6587\u4ef6\uff0c\u4e3b\u8981\u901a\u8fc7\u4ee5\u4e0b\u51e0\u4e2a\u914d\u7f6e\u6765\u63a7\u5236\uff1a APP_NAME = # \u6307\u5b9a\u8981\u540c\u6b65\u7684\u5e94\u7528\u540d\u79f0\nPMS_USER = # PMS\u7684\u7528\u6237\u540d\nPMS_PASSWORD = # PMS\u7684\u5bc6\u7801\n \u5728 [csv_link_pms_id] \u8282\u70b9\u4e0b\u6307\u5b9a csv \u6587\u4ef6\u540d\u4e0e PMS \u7528\u4f8b\u6a21\u5757\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u6bd4\u5982\uff1a [csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/testcase-browse-53.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 53\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic = 53\n \u5c06\u4ee5\u4e0a\u4fe1\u606f\u914d\u7f6e\u597d\u4e4b\u540e\uff0c\u5728\u547d\u4ee4\u884c\u6267\u884c\uff1a youqu manage.py pms --pms2csv yes\n \u6bcf\u6b21\u6267\u884c\u65f6\u539f csv \u6587\u4ef6\u4f1a\u81ea\u52a8\u5907\u4efd\u5728 report/csv_back \u76ee\u5f55\u4e0b\uff0c\u56e0\u6b64\u4f60\u4e0d\u7528\u62c5\u5fc3\u811a\u672c\u6267\u884c\u5bfc\u81f4\u4f60\u7684\u6570\u636e\u4e22\u5931\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u57fa\u7840\u6846\u67b6\u8bbe\u8ba1\u65b9\u6848","text":"# ====================================\n# Author : Mikigo\n# Time : 2022/3/18\n# version \uff1a1.0\n# ====================================\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"\u505a\u4e00\u4e2a\u7b80\u5355\u3001\u597d\u7528\u3001\u529f\u80fd\u5f3a\u5927\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u3002 \u4f5c\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4e00\u4e2a\u57fa\u7840\u6846\u67b6\uff0c\u4efb\u4f55\u5e94\u7528\u90fd\u80fd\u5f88\u65b9\u4fbf\u7684\u63a5\u5165\u8fdb\u6765\uff1b \u63d0\u4f9b\u6240\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u9700\u8981\u7684\u5e95\u5c42\u529f\u80fd\uff0c\u5e76\u5bf9\u5916\u63d0\u4f9b\u552f\u4e00\u7684\u63a5\u53e3\uff0c\u65b9\u4fbf\u5e94\u7528\u5e93\u4f7f\u7528\uff1b \u6574\u5408\u516c\u5171\u5e93\uff0c\u51cf\u5c11\u5e94\u7528\u5e93\u4ee3\u7801\u91cf\u548c\u65b9\u6cd5\u7ef4\u62a4\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u8bbe\u8ba1\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u7edf\u4e00\u6982\u5ff5","text":" \u57fa\u7840\u6846\u67b6 \u672c\u9879\u76ee\u662f\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\uff08AutoTest Basic Frame\uff09\uff0c\u5168\u79f0\u4e3a\u201c\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff08AT \u57fa\u7840\u6846\u67b6\uff09\u201d\u3002 AT \u57fa\u7840\u6846\u67b6\u662f\u505a\u4e3a\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\u6765\u8bbe\u8ba1\u7684\uff0c\u5b83\u63d0\u4f9b\u4e86\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u57fa\u7840\u529f\u80fd\uff0c\u4efb\u4f55\u5e94\u7528\u63a5\u5165\u8fdb\u6765\u90fd\u80fd\u5feb\u901f\u65b9\u4fbf\u7684\u8fdb\u884c\u65b9\u6cd5\u548c\u7528\u4f8b\u7f16\u5199\uff0c\u540c\u65f6\u5728\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u3001\u6807\u7b7e\u5316\u6267\u884c\u3001\u5206\u5e03\u5f0f\u6267\u884c\u3001\u591a\u79cd\u62a5\u544a\u8f93\u51fa\u3001\u4f18\u7f8e\u7684\u6267\u884c\u65e5\u5fd7\u3001\u5931\u8d25\u81ea\u52a8\u5f55\u5c4f\u548c\u622a\u56fe\u3001\u81ea\u52a8\u73af\u5883\u6e05\u7406\u7b49\u7b49\uff0c\u5b83\u90fd\u63d0\u4f9b\u4e86\u5b8c\u5584\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u66f4\u91cd\u8981\u7684\u662f\u8fd9\u4e00\u5207\u4f7f\u7528\u8d77\u6765\u90fd\u975e\u5e38\u7b80\u5355\u3002 \u57fa\u7840\u6846\u67b6\u4e2d\u5305\u542b\u5e94\u7528\u5e93\uff08apps\uff09\u3001\u6838\u5fc3\u5e93\uff08src\uff09\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09\u3002 \u5e94\u7528\u5e93\uff08apps\uff09 \u5404\u4e2a\u5e94\u7528\u81ea\u5df1\u7684\u4ed3\u5e93\uff0c\u91cc\u9762\u4e3b\u8981\u5305\u542b\u7684\u662f\u7528\u4f8b\u3001\u65b9\u6cd5\u53ca\u4e00\u4e9b\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u53eb autotest-dde-file-manager \u3002 \u6838\u5fc3\u5e93\uff08src\uff09 \u6838\u5fc3\u5e93\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u5230\u6240\u6709\u5e95\u5c42\u6838\u5fc3\u529f\u80fd\uff0c\u8fd9\u662f\u6700\u91cd\u8981\u7684\u4e00\u4e2a\u90e8\u5206\uff0c\u7075\u9b42\u3002\u5177\u4f53\u529f\u80fd\u6a21\u5757\u53ca\u8bf4\u660e\u4f1a\u5728\u4e0b\u9762\u7b2c\u56db\u4e2a\u7ae0\u8282\u8be6\u7ec6\u63cf\u8ff0\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09 \u591a\u4e2a\u5e94\u7528\u90fd\u8981\u7528\u5230\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\uff0c\u6309\u7167\u5e94\u7528\u5212\u5206\u5b58\u653e\uff0c\u4e3b\u8981\u662f\u4e3a\u4e86\u51cf\u5c11\u4ee3\u7801\u91cf\uff0c\u6d88\u9664\u5e94\u7528\u95f4\u7684\u8026\u5408\u5173\u7cfb\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u67b6\u6784\u56fe","text":"\u6574\u4f53\u7684\u6846\u67b6\u8bbe\u8ba1\u5728\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u300b\u6587\u6863\u91cc\u9762\u5df2\u7ecf\u6709\u8be6\u7ec6\u63cf\u8ff0\u4e86\uff0c\u8fd9\u91cc\u8d34\u4e00\u4e0b\u6574\u4f53\u7684\u67b6\u6784\u56fe\uff1a \u4e3a\u4e86\u7a81\u663e\u672c\u6587\u7684\u91cd\u70b9\uff0c\u62bd\u53d6\u5176\u4e2d\u91cd\u8981\u529f\u80fd\u6a21\u5757\uff0c\u5982\u4e0b\u56fe\uff1a "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-basic-frame # \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\n\u251c\u2500\u2500 apps # \u5e94\u7528\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-dde-file-manager # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\uff08\u5e94\u7528\u5e93\u8be6\u7ec6\u76ee\u5f55\u7ed3\u6784\u8bf7\u770b\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\uff09\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 tag # \u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u2514\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u2502 \u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 xxx.png\n\u2502 \u2502 ...\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-deepin-music # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 public # \u516c\u5171\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget # dde_dock \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget # dde_desktop \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 src # \u6838\u5fc3\u5e93\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 button_center.py\n\u2502 \u251c\u2500\u2500 cmdtrl.py\n\u2502 \u251c\u2500\u2500 dogtails.py\n\u2502 \u251c\u2500\u2500 find_image.py\n\u2502 \u251c\u2500\u2500 global_config.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 setting # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 config.py\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 global_config.ini\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\u6a21\u5757\uff08Hook\uff09\n\u251c\u2500\u2500 pytest.ini # Pytest \u9ed8\u8ba4\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 docs # \u6587\u6863\u76ee\u5f55\n\u2514\u2500\u2500 manage.py # \u6267\u884c\u5668\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1apps","title":"1\u3001\u5e94\u7528\u5e93\uff08apps\uff09","text":"\u6240\u6709\u5e94\u7528\u5e93\u5747\u653e\u7f6e\u5728\u57fa\u7840\u6846\u67b6\u4e0b\u7684 apps \u76ee\u5f55\u4e0b\uff08\u89c1\u7b2c\u4e8c\u7ae0\u8282\u7b2c3\u6bb5\u76ee\u5f55\u7ed3\u6784\u5185\u5bb9\uff09\u3002\u5e94\u7528\u5e93\u7684\u67b6\u6784\u8bbe\u8ba1\u53ef\u4ee5\u53c2\u8003\u300aAT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b\u6587\u6863\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2src","title":"2\u3001\u6838\u5fc3\u5e93\uff08src\uff09","text":"\u5728 src \u76ee\u5f55\u4e0b\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u5e95\u5c42\u6838\u5fc3\u7ec4\u4ef6\uff0c\u901a\u5e38\u6765\u8bb2\u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5230\u5176\u4e2d\u67d0\u4e00\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4e48\u4f60\u9700\u8981\u663e\u793a\u7684\u5bfc\u5165\u8fd9\u4e2a\u6a21\u5757\uff0c\u7136\u540e\u624d\u80fd\u4f7f\u7528\u8be5\u6a21\u5757\u4e0b\u7684\u529f\u80fd\uff0c\u5982\u679c\u4f60\u7528\u5230\u4e86\u5341\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4f60\u5c31\u9700\u8981\u5bfc\u5165\u5341\u4e2a\u3002\u4f46\u662f\u6211\u4eec\u60f3\u8ba9\u4e8b\u60c5\u53d8\u5f97\u7b80\u5355\uff0c\u4e00\u6b21\u5bfc\u5165\uff0c\u4f7f\u7528\u6240\u6709\u3002 \u5c06\u6240\u6709\u7684\u529f\u80fd\u6a21\u5757\u90fd\u8fdb\u5165\u5230 src \u7684\u540d\u79f0\u7a7a\u95f4\uff0c\u5728 src/__init__.py \u91cc\u9762\u6211\u4eec\u8bbe\u8ba1\u6210\u8fd9\u6837\uff1a # src/__init__.py\nfrom .cmdctl import CmdCtl\nfrom .dogtails import Dogtail\nfrom .find_image import FindImage\nfrom .button_center import ButtonCenter\nclass Src(CmdCtl, FindImage):\ndef __init__(self, **kwargs):\n\"\"\"dogtail or button center param\n :param kwargs: app_name, desc, number\n \"\"\"\nif kwargs:\napp_name = kwargs.get(\"APP_NAME\")\ndesc = kwargs.get(\"DESC\")\nif app_name is None or desc is None:\nraise ValueError\nnumber = kwargs.get(\"number\")\nnumber = number if isinstance(number, int) else -1\n# \u5bf9\u8c61\u7ec4\u5408\nself.dog = Dogtail(app_name, desc, number)\nself.ui = ButtonCenter(app_name, number)\n \u9700\u8981\u4f20\u9012\u53c2\u6570\u7684\u91c7\u7528\u5bf9\u8c61\u7ec4\u5408\uff0c\u6ca1\u6709\u53c2\u6570\u7684\u4f7f\u7528\u7ee7\u627f\uff0c\u7ee7\u627f\u7684\u7c7b\u7b26\u5408 Mixin \u8bbe\u8ba1\u6a21\u5f0f\u3002 \u5e94\u7528\u5e93\u91cc\u9762\u4f7f\u7528\u7684\u65f6\u5019\u5728 widget/base_widget.py \u91cc\u9762\u53ea\u9700\u8981\u552f\u4e00\u7ee7\u627f Src \uff1a # \u5e94\u7528\u5e93\u91cc\u9762\u65b9\u6cd5\u57fa\u7c7b\n# widget/base_widget.py\nfrom src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n \u8981\u4f7f\u7528\u6838\u5fc3\u5e93\u7684\u529f\u80fd\uff0c\u53ea\u9700\u8981\u5199\u4e00\u4e2a\u5bfc\u5165 from src import Src \u5373\u53ef\u3002 \u5199 __init__ \u6784\u9020\u51fd\u6570\u7684\u539f\u56e0\u662f\u901a\u8fc7\u53c2\u6570\u6784\u9020\u5e94\u7528\uff0c\u5e76\u4e14\u4f20\u9012 number \u8fdb\u6765\uff0c\u53ef\u4ee5\u5b9e\u73b0\u591a\u7a97\u53e3\u7684\u63a7\u5236\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3public","title":"3\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09","text":"\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6bcf\u4e2a\u5e94\u7528\u90fd\u662f\u4e00\u4e2a\u5355\u72ec\u7684 py \u6587\u4ef6\uff0c\u76f8\u4e92\u4e4b\u95f4\u662f\u72ec\u7acb\u7684\uff0c\u6bcf\u4e2a py \u6587\u4ef6\u91cc\u9762\u662f\u8be5\u5e94\u7528\u7684\u65b9\u6cd5\u7c7b\uff0c\u6bd4\u5982\uff1a\u6700\u5e38\u7528\u7684\u65b9\u6cd5\u7c7b dde_desktop_public_widget.py # dde_desktop_widget.py\nfrom src import Src\nclass _DdeDesktopPublicBaseWidget(Src):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-desktop\"\nDESC = \"/usr/bin/dde-desktop\"\ndef __init__(self):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC)\nclass DdeDesktopPublicWidget(_DdeDesktopPublicBaseWidget):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u7c7b\"\"\"\ndef click_music_dir_by_ui(self):\n\"\"\"\u5728\u6587\u4ef6\u9009\u62e9\u6846\u70b9\u51fb\u97f3\u4e50\u76ee\u5f55\"\"\"\nself.click(*self.ui.btn_center(\"\u4fa7\u8fb9\u680f-\u97f3\u4e50\")) \ndef click_xxx_by_attr(self):\npass\n \u516c\u5171\u65b9\u6cd5\u5e93\u610f\u4e49\uff1a \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6240\u5c01\u88c5\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\u90fd\u662f\u81f3\u5c11\u88ab2\u4e2a\u5e94\u7528\u90fd\u7528\u5230\u7684\uff0c\u8fd9\u6837\u505a\u53ef\u4ee5\u51cf\u5c11\u6574\u4f53\u4ee3\u7801\u91cf\uff0c\u4ece\u800c\u51cf\u8f7b\u5e94\u7528\u5e93\u4ee3\u7801\u7684\u7ef4\u62a4\u5de5\u4f5c\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u7f16\u5199\u5f62\u5f0f\uff08\u547d\u540d\u89c4\u5219\u3001\u5b9a\u4f4d\u7684\u65b9\u6848\u5199\u6cd5\u3001\u6ce8\u91ca\u7684\u5199\u6cd5\u7b49\u7b49\uff09\u5177\u6709\u4e00\u5b9a\u7684\u6a21\u677f\u4f5c\u7528\uff0c\u8fd9\u6837\u5373\u4f7f\u662f\u5404\u4e2a\u5e94\u7528\u5e93\u90fd\u72ec\u7acb\u7ef4\u62a4\uff0c\u6240\u6709\u7684\u7f16\u7801\u98ce\u683c\u90fd\u662f\u8d8b\u4e8e\u76f8\u540c\u7684\uff0c\u56e0\u4e3a\u5927\u5bb6\u90fd\u5e94\u8be5\u53c2\u7167\u516c\u5171\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u5199\u6cd5\u6765\u5199\u81ea\u5df1\u5e94\u7528\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\u7c7b\uff0c\u8fd9\u6837\u4f7f\u5f97\u4ece\u516c\u53f8\u7684\u89d2\u5ea6\u53bb\u770b\u6240\u6709\u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u90fd\u662f\u7edf\u4e00\u7684\u3002 \u53ef\u4ee5\u901a\u8fc7\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\uff0c\u4e86\u89e3\u5230\u5176\u4ed6\u5e94\u7528\u7684\u529f\u80fd\uff0c\u5bf9\u4e8e\u6211\u4eec\u9700\u6c42\u7406\u89e3\uff0c\u4e86\u89e3\u7cfb\u7edf\u7684\u65b9\u65b9\u9762\u9762\u4e5f\u6709\u597d\u5904\u3002 \u5f53\u7136\uff0c\u5982\u679c\u4f60\u7684\u5e94\u7528\u672c\u8eab\u662f\u5c5e\u4e8e\u6839\u672c\u5c31\u4e0d\u9700\u8981\u548c\u5176\u4ed6\u5e94\u7528\u4ea4\u4e92\u7684\uff0c\u90a3\u4e48\u4f60\u53ef\u80fd\u4e0d\u4f1a\u7528\u5230\u8fd9\u91cc\u9762\u7684\u529f\u80fd\uff0c\u6ca1\u5173\u7cfb\uff0c\u4f60\u6240\u6709\u7684\u65b9\u6cd5\u90fd\u53ef\u4ee5\u76f4\u63a5\u5199\u5728\u5e94\u7528\u5e93\u7684\u4e1a\u52a1\u5c42\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4conftestpy","title":"4\u3001conftest.py","text":"conftest.py \u4ece\u529f\u80fd\u4e0a\u5c06\u662f\u5c5e\u4e8e\u6838\u5fc3\u5e93\uff08src\uff09\u7684\u5185\u5bb9\uff0c\u4f46\u662f\u7531\u4e8e\u5b83\u7684\u7279\u6b8a\u6027\uff0c\u5373\u5b83\u662f\u5bf9\u5e94\u7528\u5e93\u4e2d\u7684\u7528\u4f8b\u751f\u6548\u7684\uff0c\u800c\u4e14\u5b83\u7684\u4f5c\u7528\u57df\u662f\u5f53\u524d\u76ee\u5f55\u53ca\u4ee5\u4e0b\uff0c\u56e0\u6b64\u6211\u4eec\u5c06\u5b83\u653e\u5230\u9879\u76ee\u6839\u76ee\u5f55\u3002\u6211\u4eec\u6846\u67b6\u4e2d\u6709\u4e0d\u5c11\u6838\u5fc3\u529f\u80fd\u90fd\u662f\u5728\u8fd9\u91cc\u9762\u8fdb\u884c\u5f00\u53d1\u7684\uff0c\u540e\u9762\u7b2c\u56db\u7ae0\u4f1a\u8bb2\u5230\u7ec6\u8282\u3002 pytest.ini \u4f5c\u7528\u548c conftest.py \u7c7b\u4f3c\uff0c\u662f Pytest \u6846\u67b6\u7684\u56fa\u5b9a\u914d\u7f6e\u6587\u4ef6\uff0c\u76ee\u524d\u914d\u7f6e\u4e86\u4e00\u4e9b\u901a\u7528\u7684\u547d\u4ee4\u884c\u6267\u884c\u53c2\u6570\uff0c\u4e5f\u653e\u5728\u9879\u76ee\u6839\u76ee\u5f55\u3002 \u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 Hook \u51fd\u6570\uff0capps \u76ee\u5f55\u4e0b\u7684 \u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 fixture \u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5setting","title":"5\u3001setting","text":"\u5168\u5c40\u914d\u7f6e\u6a21\u5757\uff0c\u5305\u542b\u4e86\u4ee5\u4e0b\u914d\u7f6e\u6587\u4ef6\uff1a \uff081\uff09ini \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u914d\u7f6e\u4e00\u4e9b\u5168\u5c40\u7684\u914d\u7f6e\u9879\uff0c\u8b6c\u5982\uff1a\u5931\u8d25\u91cd\u8dd1\u6b21\u6570\u3001\u662f\u5426\u5931\u8d25\u5f55\u5c4f\u3001\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\u3001\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4\u3001\u6267\u884c\u65f6\u65e5\u5fd7\u7ea7\u522b\u3001\u751f\u6210\u7684\u62a5\u544a\u7c7b\u578b\u3001\u4ee5\u53ca\u5206\u5e03\u5f0f\u6267\u884c\u7684\u4e00\u4e9b\u7b56\u7565\u914d\u7f6e\u9879\u7b49\u7b49\u3002 \uff082\uff09config.py \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u63d0\u4f9b\u914d\u7f6e\u6587\u4ef6\u8bfb\u53d6\u3001\u52a8\u6001\u83b7\u53d6\u4e00\u4e9b\u5e38\u91cf\uff08\u5982\u9879\u76ee\u6839\u76ee\u5f55\u7edd\u5bf9\u8def\u5f84 (BASE_DIR)\u3001\u7cfb\u7edf\u67b6\u6784\uff08SYS_FRAME\uff09\u3001\u65f6\u95f4\u5b57\u7b26\u4e32\uff08strftime\uff09\u3001\u672c\u673a USERNAME IP \u7b49\u7b49\uff09\u3001\u516c\u5171 URL \u7b49\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u89c4\u8303","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u7248\u672c\u53ca\u4f9d\u8d56","text":"\u57fa\u7840\u6846\u67b6\u4f1a\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u8fdb\u884c\u7248\u672c\u53d1\u5e03\uff0c\u4e0d\u4e0e\u67d0\u4e2a\u5e94\u7528\u7248\u672c\u7ed1\u5b9a\uff0c\u4f46\u662f\uff0c\u5e94\u7528\u5e93\u4f1a\u4f9d\u8d56\u4e8e\u57fa\u7840\u6846\u67b6\u7684\u7248\u672c\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u5efa\u8bae\u5728\u5e94\u7528\u5e93\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a\u6587\u672c\u6587\u4ef6\u7528\u4e8e\u8bb0\u5f55\u6240\u4f9d\u8d56\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\uff0c\u7c7b\u4f3c\u4e8e\u5f00\u53d1\u5e94\u7528\u7684 debian/control \u6587\u4ef6\u7684\u529f\u80fd\uff0c\u4e3a\u4e86\u4fdd\u6301\u7edf\u4e00\uff0c\u8fd9\u4e2a\u6587\u4ef6\u5c31\u547d\u540d\u4e3a control\uff0c\u653e\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u6838\u5fc3\u5e93\u72ec\u7acb\u6027","text":"\u6838\u5fc3\u5e93\u4e0d\u5efa\u8bae\u9488\u5bf9\u67d0\u4e00\u4e2a\u5e94\u7528\u5355\u72ec\u505a\u4ee3\u7801\u4e0a\u7279\u6b8a\u5904\u7406\uff0c\u901a\u5e38\u8003\u8651\u9488\u5bf9\u67d0\u4e00\u79cd\u573a\u666f\u8fdb\u884c\u5904\u7406\uff0c\u8fd9\u4e9b\u573a\u666f\u901a\u5e38\u662f\u5b58\u5728\u4e00\u4e9b\u5171\u6027\u7684\u3002\u6bd4\u5982\u8bf4\uff1a\u684c\u9762\u7684ID\u5206\u914d\u5b58\u5728\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u903b\u8f91\u5904\u7406\u89e3\u51b3ID\u5206\u914d\u9519\u8bef\u7684\u95ee\u9898\uff0c\u4f46\u662f\u8fd9\u90e8\u5206\u903b\u8f91\u6211\u4eec\u4f1a\u5728\u684c\u9762\u7684\u65b9\u6cd5\u5c42\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u517c\u5bb9\u6027","text":"\u4e3a\u4e86\u4fdd\u6301\u517c\u5bb9\u6027\uff0c\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u539f\u5219\u4e0a\u4e0d\u5bf9\u8001\u65b9\u6cd5\u8fdb\u884c\u4fee\u6539\u6216\u5220\u9664\uff0c\u53ea\u8fdb\u884c\u65b0\u589e\u3002\u6d89\u53ca\u5230\u8001\u65b9\u6cd5\u4fee\u6539\u6216\u5220\u9664\u7684\uff0c\u4f1a\u8fdb\u884c\u63d0\u524d\u9884\u544a\uff0c\u5e76\u5728\u7b2c\u4e8c\u4e2a\u7248\u672c\u4e4b\u540e\uff08\u4e2d\u95f4\u4f1a\u9694\u4e00\u4e2a\u7248\u672c\u8fc7\u5ea6\uff09\u6b63\u5f0f\u5b9e\u65bd\u4fee\u6539\u6216\u5220\u9664\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u547d\u540d\u89c4\u8303","text":" \u7528\u4f8b ID \u6bcf\u4e2a\u5e94\u7528\u81ea\u5df1\u7ef4\u62a4\u4e00\u5957 ID\uff0c\u5728PMS\u4e0a\u7528\u4f8b\u6807\u9898\u4e0a\u5c06\u81ea\u52a8\u5316ID\u4ee5\u6807\u7b7e\u7684\u5f62\u5f0f\u5199\u5165\uff0c\u6bd4\u5982\uff1a[101]\u6253\u5f00-\u542f\u52a8\u5e94\u7528\u540edock\u53f3\u952e\u83dc\u5355 \u4e00\u4e2a\u7528\u4f8b\u7c7b\u91cc\u9762\u6709\u591a\u4e2a\u7528\u4f8b\u65f6\uff0c\u5728\u7528\u4f8b\u540d\u79f0\u540e\u9762\u52a0\u5e8f\u53f7\u3002 class TestFileManager(BaseCase):\n\"\"\"\u6587\u7ba1\u7528\u4f8b\"\"\"\ndef test_xxx_015_1(self):\npass\ndef test_xxx_015_2(self):\npass\n \u6ce8\u610f 015_1\uff0c\u4e0d\u8981\u5199015_01\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 PMS \u4e0a\u7684\u7528\u4f8bID\uff1a PMS \u4e0a\u662f6\u4f4d\u6570\uff0c\u4e0d\u591f\u76f4\u89c2\uff0c\u4e5f\u4e0d\u597d\u7ef4\u62a4\uff0c\u5728\u81ea\u52a8\u5316\u4e0b\u9762\u53bb\u627e\u4e00\u4e2a\u5e26\u6709 6 \u4f4d\u6570\u7684\u6587\u4ef6\u662f\u4e00\u4e2a\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 PMS \u4e0a\u7684 ID \u53ef\u80fd\u4f1a\u53d1\u751f\u53d8\u5316\uff0c\u6bd4\u5982\u5bfc\u51fa\u6765\u5bfc\u8fdb\u53bb\u7684\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u5b58\u5728\u95ee\u9898\uff0c\u5982\u679c\u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u8981\u60f3\u627e\u51fa\u6765\u5bf9\u5e94\u4fee\u6539\u81ea\u52a8\u5316\u7528\u4f8b ID\uff0c\u5c06\u4f1a\u662f\u4ef6\u975e\u5e38\u75db\u82e6\u7684\u4e8b\u60c5\u3002 \u51fd\u6570\u547d\u540d\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5de6\u952e\u70b9\u51fb click \u53f3\u952e\u70b9\u51fb right_click \u53cc\u51fb double_click \u79fb\u52a8 move_to \u62d6\u52a8 drag \u65b0\u5efa new \u62d6\u52a8\u5230 drag_to \u4ece\u54ea\u91cc\u62d6\u52a8\u5230\u54ea\u91cc drag_something_from_xxx_to_xxx \u83b7\u53d6 get \u83b7\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5750\u6807 get_location \u975e\u7279\u6b8a\u6587\u4ef6 file word\u6587\u4ef6 doc text\u6587\u4ef6 text \u6587\u4ef6\u5939 dir \u5173\u952e\u8bcd\u6301\u7eed\u589e\u52a0 \u5e38\u91cf\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5e94\u7528\u540d\u79f0 APP_NAME \u5e94\u7528\u63cf\u8ff0 DESC \u672c\u5e94\u7528\u4ee5\u5916\u7684\u5176\u4ed6\u5e94\u7528\uff0c\u6bd4\u5982\u5e2e\u52a9 HELP \u5176\u4ed6\u540d\u79f0\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u65b9\u6cd5\u5305\u540d widget \u65b9\u6cd5\u6587\u4ef6\u540d\uff08\u6587\u7ba1\u4e3e\u4f8b\uff09 dfm_widget.pytitle_widget.pyright_view_widget.pyleft_view_widget.pypop_widget.pybase_widget.pydfm_assert.py \u65ad\u8a00\u8bed\u53e5\u547d\u540d\u89c4\u8303 \u65ad\u8a00\u8bed\u53e5\u90fd\u662f\u4ee5 assert \u5f00\u5934 \u65ad\u8a00 \u8bed\u53e5 \u5224\u65ad\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_existsassert_file_not_exists \u5224\u65ad\u684c\u9762\u76ee\u5f55\u4e0b\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_exists_in_desktopassert_file_not_exists_in_desktop \u5224\u65ad\u56fe\u7247\u5b58\u5728 assert_image_existsassert_image_not_exists \u5224\u65ad\u5f71\u9662\u4e2d\u662f\u5426\u5b58\u5728\u56fe\u7247 assert_image_exists_in_movieassert_image_not_exists_in_movie \u5224\u65ad\u5143\u7d20\u662f\u5426\u5b58\u5728 assert_element_existassert_element_not_exist \u5224\u65ad\u662f\u5426\u76f8\u7b49 assert_equalassert_not_equal \u5224\u65ad\u662f\u5426\u4e3a\u771f assert_trueassert_false"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5fixture","title":"5\u3001fixture \u89c4\u8303","text":"\u7531\u4e8e Pytest \u6846\u67b6\u4e2d\u652f\u6301 fixture \u7684\u5199\u6cd5\u548c Xunit \u5199\u6cd5\u7684\uff0c\u6240\u4ee5\u5e94\u7528\u5e93\u4e2d\u53ef\u80fd\u5b58\u5728\u6df7\u7528\u7684\u60c5\u51b5\uff0c\u4e3a\u7edf\u4e00\u7f16\u7801\u98ce\u683c\u65b9\u4fbf\u540e\u7eed\u7528\u4f8b\u4ee3\u7801\u7ef4\u62a4\uff0c\u73b0\u505a\u4ee5\u4e0b\u89c4\u8303\u8bf4\u660e\uff1a \u629b\u5f03 Xunit \u7684\u5199\u6cd5\uff0c\u7edf\u4e00\u91c7\u7528 Pytest fixture \u7684\u5199\u6cd5\u3002 \u5e94\u7528\u5185 fixture \u8c28\u614e\u4f7f\u7528 autouse=True \uff0c\u975e\u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u975e\u5e38\u4e0d\u5efa\u8bae\u4f7f\u7528\u8fd9\u4e2a\u53c2\u6570\u3002 \u8c03\u7528 fixture \u4e0d\u80fd\u4f7f\u7528 @pytest.mark.usefixture()\uff0c\u4f7f\u7528\u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u4f20\u5165\u51fd\u6570\u5bf9\u8c61\u3002 \u5efa\u8bae\u5728\u4e00\u4e2a conftest.py \u91cc\u9762\u53bb\u5199\uff0c\u4e00\u4e2a\u5e94\u7528\u4e5f\u5c3d\u91cf\u7ef4\u62a4\u4e00\u4e2a conftest.py\u6587\u4ef6\u3002 fixture \u4e5f\u9700\u8981\u5199\u529f\u80fd\u8bf4\u660e\uff0c\u51fd\u6570\u540d\u79f0\u8981\u6709\u5177\u4f53\u542b\u4e49\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#6","title":"6\u3001\u65b9\u6cd5\u7f16\u5199\u89c4\u8303","text":" \u65b9\u6cd5\u7c7b\u578b\uff1a if \u6ca1\u6709\u7528\u5230\u5b9e\u4f8b\u5bf9\u8c61\uff1a\nif \u6ca1\u6709\u7528\u5230\u7c7b\u5bf9\u8c61\uff1a\n\u5199\u9759\u6001\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @staticmethod\nelse\uff1a\n\u5199\u7c7b\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @classmethod\nelse:\n\u76f4\u63a5\u5199\u5b9e\u4f8b\u65b9\u6cd5\n \u4e3e\u4f8b: class TitleWidget:\ndef click_xxx_by_ui(self):\npass\n@staticmethod\ndef click_xxx_by_ui():\npass\n@classmethod\ndef click_xxx_by_ui(cls):\npass\n \u51fd\u6570\u540d\u79f0\u4e0d\u51fa\u73b0\u6570\u5b57\uff0c\u9700\u8981\u8868\u793a\u6570\u91cf\u7684\u7528\u5355\u8bcd\u8868\u793a\u3002 \u51fd\u6570\u529f\u80fd\u6ce8\u91ca\u3002 \u6ca1\u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg2:xxx\n\"\"\"\n \u6709\u53c2\u6570\uff0c\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg1:xxx\nreturn: xxx\n\"\"\"\n \u200b \u7528 Pycharm \u7684\u6ce8\u91ca\u6a21\u677f\u4e5f\u53ef\u4ee5\uff0c\u53ea\u8981\u4f53\u73b0\u4e86\u53c2\u6570\u7684\u7c7b\u578b\u548c\u8fd4\u56de\u5c31\u884c\u4e86\u3002 \u6682\u4e0d\u8981\u6c42\u5199\u7c7b\u578b\u6ce8\u89e3\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#7case","title":"7\u3001\u7528\u4f8b\uff08case\uff09\u89c4\u8303","text":" \u4ee5\u7c7b\u7684\u5f62\u5f0f\u5199\u7528\u4f8b\uff0c\u7528\u4f8b\u7c7b\u96c6\u6210\u7528\u4f8b\u57fa\u7c7b\u3002 \u7528\u4f8b\u7c7b\u9700\u8981\u5199\u6ce8\u91ca\u3002 \u6d4b\u8bd5\u7528\u4f8b\u51fd\u6570\u8bf4\u660e\uff08\u5efa\u8bae\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u540d\u79f0\uff09 \"\"\"\u53f3\u4fa7\u9884\u89c8-\u56fe\u7247\u7c7b\u578b\u4fe1\u606f\u680f\u57fa\u672c\u4fe1\u606f\"\"\"\n \u4e0d\u5199\u8c03\u8bd5\u4ee3\u7801 if __name__ == '__main__':\npytest.main()\n \u6240\u6709\u7528\u4f8b\u90fd\u7ee7\u627f BaseCase\u3002 BaseCase \u91cc\u9762\u653e\u4e00\u4e9b\u6d4b\u8bd5\u6570\u636e\u7684\u5e38\u91cf\uff0c\u6bd4\u5982\u6587\u4ef6\u540d\u79f0\uff0c\u5e94\u7528\u540d\u79f0\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u4e00\u4e9b\u901a\u7528\u7684\u5b57\u7b26\u4e32\u3002 \u8fd9\u7c7b\u662f\u5c5e\u4e8e\u6d4b\u8bd5\u6570\u636e\u3002 class BaseCase(DfmAssert):\n\"\"\"\u7528\u4f8b\u57fa\u7c7b\"\"\"\nNEW_FILE = \"\u65b0\u5efa\u6587\u672c.txt\"\nTEST_FILE = \"test.txt\"\nNEW_DIR = \"\u65b0\u5efa\u6587\u4ef6\u5939\"\nNEW_WORD = \"\u65b0\u5efaWord\u6587\u6863.doc\"\nAPP_HELP = \"damn\"\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\n\"\"\"\u7528\u4f8b\u6807\u9898\uff08\u590d\u5236PMS\u4e0a\u7528\u4f8b\u6807\u9898\uff09\"\"\"\ndfm = DfmWidget()\ndfm.click_xxx_by_attr(self.NEW_FILE)\ndfm.new_file_in_desktop_by_cmd(self.NEW_FILE)\nself.assert_true(dfm.get_process_status(self.APP_NAME))\n \u7528\u4f8b\u91cc\u9762\u5c3d\u91cf\u51cf\u5c11\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\uff0c\u66f4\u8981\u51cf\u5c11\u76f8\u540c\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\u3002 \u7edf\u4e00\u6587\u4ef6\u6ce8\u91ca\u5934\u3002 #!/usr/bin/env python3\n# _*_ coding:utf-8 _*_\n\"\"\"\n:Author:email@uniontech.com\n:Date :${DATE} ${TIME}\n\"\"\"\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#8","title":"8\u3001\u5176\u4ed6\u89c4\u8303","text":" \u65e5\u5fd7\u6253\u5370\u8981\u5728\u65b9\u6cd5\u6700\u524d\u9762\uff0c\u5426\u5219\u4ee3\u7801\u62a5\u9519\u6ca1\u6709\u65e5\u5fd7\u8f93\u51fa\uff0c\u4e0d\u597d\u5b9a\u4f4d\u95ee\u9898\u3002\uff08\u6211\u4eec\u4f1a\u8003\u8651\u7ee7\u7eed\u4f7f\u7528\u62e6\u622a\u5668\u6253\u5370\u65e5\u5fd7\uff09 \u6240\u6709\u7684\u64cd\u4f5c\u90fd\u9700\u8981\u6709\u65e5\u5fd7\uff0c\u5305\u62ec sleep()\uff0c\u6211\u4eec\u4f1a\u91cd\u5199\u4e00\u4e2a\u6709\u65e5\u5fd7\u8f93\u5165\u7684 sleep\u3002 \u4e1a\u52a1\u5c42\u65e5\u5fd7\u7ea7\u522b\u4e3a INFO\u3002 hook \u51fd\u6570\u53ea\u80fd\u5199\u5230\u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u91cc\u9762\u3002 apps \u76ee\u5f55\u4e0b\u7684 conftest.py \u539f\u5219\u4e0a\u4e0d\u4f1a\u65b0\u589e fixture\u3002 \u56fa\u5b9a\u76ee\u5f55\u6216\u5143\u7d20\u63a7\u4ef6\u7684\u64cd\u4f5c\uff0c\u5c06\u64cd\u4f5c\u65b9\u6cd5\u5199\u6b7b\uff0c\u6587\u4ef6\u7c7b\u64cd\u4f5c\u5c06\u6587\u4ef6\u540d\u7559\u53c2\u6570\u3002 \u8def\u5f84\u62fc\u63a5\u89c4\u8303\uff1a \u7cfb\u7edf\u4e2d\u56fa\u5b9a\u76ee\u5f55\uff0c\u8def\u5f84\u62fc\u63a5\u65f6\u4f7f\u7528\u6ce2\u6d6a\u7b26\u53f7\uff0c\u6bd4\u5982\uff1a~/Desktop/\uff0c\u4e0b\u5c42\u4f7f\u7528 os.path.expanduser()\uff0c\u5b83\u53ef\u4ee5\u81ea\u52a8\u8bc6\u522b\u6ce2\u6d6a\u7b26\u53f7\u3002 \u9879\u76ee\u4e0b\u8def\u5f84\u4f7f\u7528\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u8def\u5f84\uff0c\u6bd4\u5982\uff1aConfig.BASE_PATH\uff0c\u56e0\u4e3a\u9879\u76ee\u662f\u53ef\u4ee5\u5728\u4efb\u610f\u8def\u5f84\u8fd0\u884c\u7684\uff0c\u9700\u8981\u52a8\u6001\u62fc\u63a5\u8def\u5f84\u3002 "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848","text":"# =================================================\n# Author : Mikigo\n# Time : 2022/3/16\n# version \uff1a1.0\n# =================================================\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"AT \u5e94\u7528\u5e93\u6539\u9020\u662f\u57fa\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u8fdb\u884c\u7528\u4f8b\u65b9\u6cd5\u548c\u4e1a\u52a1\u903b\u8f91\u7684\u91cd\u65b0\u8bbe\u8ba1\uff0c\u4ee5\u5b9e\u73b0\u5e94\u7528\u5e93\u9ad8\u6548\u7684\u7f16\u5199\u3001\u7ef4\u62a4\u7528\u4f8b\u53ca\u5176\u65b9\u6cd5\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u6587\u4ef6\u7ba1\u7406\u5668\u4ece\u4e1a\u52a1\u590d\u6742\u5ea6\u548c\u7528\u4f8b\u91cf\u6765\u8bb2\uff0c\u5728\u7cfb\u7edf\u6240\u6709\u5e94\u7528\u4e2d\uff0c\u662f\u5f88\u6709\u4ee3\u8868\u6027\u7684\uff0c\u96be\u5ea6\u4e5f\u662f\u6700\u5927\u7684\uff0c\u56e0\u6b64\u6211\u4eec\u9009\u53d6\u6587\u4ef6\u7ba1\u7406\u5668\u4f5c\u4e3a\u5e94\u7528\u5e93\u6539\u9020\u7684\u5b9e\u9a8c\u5e94\u7528\uff0c\u7ed9\u540e\u7eed\u5176\u4ed6\u5e94\u7528\u6539\u9020\u63d0\u4f9b\u5207\u5b9e\u53ef\u884c\u7684\u601d\u8def\u548c\u65b9\u6848\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u5206\u5c42\u8bbe\u8ba1\u56fe","text":"\u6574\u4f53\u4ecd\u7136\u9075\u5faa PO \u8bbe\u8ba1\u7406\u5ff5\uff0c\u6839\u636e\u4e1a\u52a1\u9700\u8981\uff0c\u5c06\u6587\u7ba1\u4e1a\u52a1\u5c42\u8fdb\u884c 3 \u5c42\u5212\u5206\uff1a "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-dde-file-manager # \u5e94\u7528\u4ed3\u5e93\n\u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 test_xxx_001.py\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u00a0\u251c\u2500\u2500 __init__.py\n\u2502 \u00a0\u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u00a0\u251c\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u00a0\u251c\u2500\u2500 base_widget.py # \u65b9\u6cd5\u57fa\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 title_widget.py # title \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 right_view_widget.py # right view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 left_view_widget.py # left view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 pop_widget.py # pop \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 dfm_widget.py # \u65b9\u6cd5\u7684\u7edf\u4e00\u51fa\u53e3\n\u2502 \u00a0\u2514\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 tag # \u7528\u4f8b\u6807\u7b7e\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 xxx.csv # \u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2514\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u57fa\u7c7b","text":" \u7ee7\u627f\u6838\u5fc3\u5c42\u7684\u5404\u4e2a\u6a21\u5757\u7c7b\u3002 \u62bd\u53d6\u64cd\u4f5c\u5c42\u7684\u4e00\u4e9b\u57fa\u7840\u65b9\u6cd5\u3002 \u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u7684\u4e00\u4e9b\u516c\u5171\u65b9\u6cd5\u3002 \u8def\u5f84\u7ec4\u88c5\u65b9\u6cd5\u3002 \u4e00\u4e9b\u4e1a\u52a1\u5c42\u76f8\u5173\u7684\u53d8\u91cf\u3001\u5e38\u91cf\u3001shell\u547d\u4ee4\u3001\u5750\u6807\u3002 \u65b9\u6cd5\u57fa\u7c7b\u7684\u5199\u6cd5\uff1a from src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u64cd\u4f5c\u5c42","text":" \u6a21\u5757\u5212\u5206 \u6309\u7167\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u6587\u7ba1\u4e3b\u754c\u9762\u5206\u4e3a\u4e09\u4e2a\u533a\u57df\uff1a\u6807\u9898\u680f\u3001\u53f3\u8fb9\u89c6\u56fe\u533a\u57df\u3001\u5de6\u8fb9\u89c6\u56fe\u533a\u57df \u5f39\u7a97\uff1a\u8bbe\u7f6e\u754c\u9762\u5f39\u7a97\u3001\u4fdd\u9669\u7bb1\u5f39\u7a97\u3001\u5220\u9664\u786e\u8ba4\u5f39\u7a97\u3001\u53ca\u5404\u79cd\u7f51\u7edc\u5f39\u7a97 \u53f3\u952e\u83dc\u5355\uff1a\u6682\u65f6\u4e0d\u8003\u8651\u4e3a\u5355\u72ec\u7684\u6a21\u5757\uff0c\u8003\u8651\u4ee5\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6848\u505a\u6210\u516c\u5171\u5e93\u3002 \u5404\u4e2a\u6a21\u5757\u53ea\u7ee7\u627f\u57fa\u7c7b from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u6784\u9020\u51fd\u6570\u91cc\u9762\u4e0d\u6784\u9020\u5bf9\u8c61\uff0c\u53ef\u4ee5\u521d\u59cb\u5316\u4e00\u4e9b\u53d8\u91cf\u3002 \u4e0d\u540c\u7684\u5b9a\u4f4d\u65b9\u6848\u8c03\u7528\u4e0d\u540c\u7684\u5b9a\u4f4d\u5de5\u5177\u5bf9\u8c61\u3002 self.dog\nself.ui\nself.d_bus\n \u65b9\u6cd5\u7f16\u5199 \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u5e94\u7528\u5c42","text":" \u7ee7\u627f\u64cd\u4f5c\u5c42\u7684\u6240\u6709\u7c7b\u3002 \u4ec5\u4ec5\u7528\u4e8e\u7528\u4f8b\u4e2d\u5bfc\u5165\u65b9\u4fbf\uff0c\u4e0d\u505a\u5176\u4ed6\u4e8b\u60c5\u3002 class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n DfmAssert \u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u7ee7\u627f\uff0c\u65b9\u4fbf\u4f7f\u7528\u65ad\u8a00\u8bed\u53e5\u3002 from apps.dde_file_manager.widget.dfm_widget import DfmWidget\nfrom public.assert import Assert\nclass DfmAssert(Assert):\ndef assert_file_exists_in_desktop(self, file_name):\nself.assert_file_exists(f\"~/Desktop{file_name}\")\n...\nDfmWidget().get_file_in_desktop()\n \u7528\u4f8b\u91cc\u9762\u76f4\u63a5\u7ee7\u627f\uff0c\u65b9\u4fbf\u5728\u7528\u4f8b\u91cc\u9762\u4f7f\u7528 self \u8fdb\u884c\u65ad\u8a00\uff0c\u66f4\u7b26\u5408\u65ad\u8a00\u7684\u4f7f\u7528\u4e60\u60ef\uff0c\u7528\u4f8b\u903b\u8f91\u4e0a\u66f4\u6e05\u695a\u3002 class BaseCase(DfmAssert):\npass\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\nself.assert_file_exists_in_desktop(\"xxx\")\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u903b\u8f91\u4e3e\u4f8b","text":"\u7528\u4f8b\u4ee3\u7801\u8c03\u7528\u903b\u8f91\u4e3e\u4f8b\uff1a # BaseWidget\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n# =============================================\n# TitleWidget\nclass TitleWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_title_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# RightViewWidget\nclass RightViewWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_right_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# =============================================\n# \u51fa\u53e3 DfmWidget\nclass DfmWidget(TitleWidget, RightViewWidget):\npass\n# =============================================\n# in case\nfrom apps.dde_file_manager.widget.dfm_widget import DfmWidget\ndfm = DfmWidget()\ndfm.click_xxx_title_by_ui()\ndfm.click_xxx_right_by_ui()\ndfm.dog.print_desc()\ndfm.ui.print_number()\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u5de5\u7a0b\u6539\u9020\u5b9e\u65bd\u6b65\u9aa4","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_2","title":"1\u3001\u5de5\u7a0b\u4ee3\u7801\u62c9\u53d6","text":"1.1. \u5c06\u81ea\u52a8\u5316\u57fa\u7840\u6846\u67b6\u7684\u529f\u80fd\u62c9\u5230\u672c\u5730 Autotest Basic Frame \uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame 1.2. \u5c06\u5e94\u7528\u5e93\u4ee3\u7801\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u5e94\u7528\u5e93\u7684\u4ed3\u5e93\u547d\u540d\u5e94\u8be5\u662f\u957f\u8fd9\u6837\u7684 autotest_deepin_xxx\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_2","title":"2\u3001\u8c03\u6574\u5de5\u7a0b\u76ee\u5f55","text":"\u6309\u7167 \u65b9\u6848\u8bbe\u8ba1-\u76ee\u5f55\u7ed3\u6784 \u8fdb\u884c\u76ee\u5f55\u8c03\u6574\uff0c\u5c3d\u91cf\u4f7f\u7528\u7f16\u8f91\u5668\u8fdb\u884c\u76f8\u5e94\u7684\u8c03\u6574\uff0c\u7f16\u8f91\u5668\u63a8\u8350\u4f7f\u7528 Pycharm \uff0c\u4ee5\u4e0b\u64cd\u4f5c\u5747\u5728 Pycharm \u91cc\u9762\u53ef\u5b9e\u73b0\u3002 2.1. \u9700\u8981\u79fb\u52a8 py \u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u76f4\u63a5\u5728\u7f16\u8f91\u5668\u91cc\u9762\uff0c\u4f7f\u7528\u9f20\u6807\u9009\u4e2d\u5e76\u6309\u4f4f\uff0c\u4e4b\u540e\u62d6\u52a8\u5230\u76ee\u6807\u4f4d\u7f6e\u5373\u53ef\uff0cPycharm \u4f1a\u5c3d\u53ef\u80fd\u7684\u81ea\u52a8\u89e3\u51b3\u79fb\u52a8\u5bfc\u81f4\u7684\u8def\u5f84\u95ee\u9898\u3002\u6ce8\u610f\uff0c\u6211\u8bf4\u7684\u662f\u201c\u5c3d\u53ef\u80fd\u201d\uff0c\u6709\u4e9b\u9a9a\u64cd\u4f5c\u7f16\u8f91\u5668\u662f\u65e0\u6cd5\u81ea\u52a8\u5904\u7406\u7684\u3002\u5982\u679c\u6ca1\u6709\u88ab\u7f16\u8f91\u5668\u81ea\u52a8\u5904\u7406\u7684\u8def\u5f84\u95ee\u9898\uff0c\u540e\u7eed\u53ea\u80fd\u624b\u52a8\u89e3\u51b3\u3002 2.2. \u9700\u8981\u91cd\u547d\u540d\u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u5728\u7f16\u8f91\u5668\u91cc\u9762\u9009\u4e2d\u6587\u4ef6\uff0c\u7136\u540e\u4f7f\u7528\u5feb\u6377\u952e Shift + F6 \uff08\u5982\u679c\u5feb\u6377\u952e\u6ca1\u53cd\u5e94\uff0c\u6587\u4ef6\u53f3\u952e\u83dc\u5355 Refactor \u2014\u2014 Rename\uff09\uff0c\u7136\u540e\u5728\u8f93\u5165\u6846\u4e2d\u8f93\u5165\u8981\u91cd\u547d\u540d\u7684\u540d\u79f0\uff0c\u540c\u65f6\uff0c\u786e\u8ba4\u52fe\u9009 Search for references \u548c Search in comments and strings \u8fd9\u4e24\u4e2a\u9009\u9879\uff0c\u6700\u540e\u6309\u56de\u8f66\u6216\u8005\u9f20\u6807\u70b9 Refactor \u3002 \u6ce8\u610f\uff0c\u6b64\u65f6\u7f16\u8f91\u5668\u53ef\u80fd\u4f1a\u63d0\u793a\u4f60\uff0c\u4f60\u8fd9\u4e2a\u91cd\u547d\u540d\u7684\u64cd\u4f5c\u5173\u8054\u4e86\u591a\u4e2a\u6a21\u5757\uff0c\u5b83\u88ab\u591a\u4e2a\u5730\u65b9\u90fd\u4f7f\u7528\u5230\u4e86\uff0c\u76f8\u5173\u7684\u6a21\u5757\u662f\u5426\u4e5f\u4e00\u8d77\u6539\u540d\u4e86\uff0c\u8fd9\u4e0d\u5e9f\u8bdd\u5417\uff0c\u7528\u8fd9\u4e2a\u529f\u80fd\u5c31\u662f\u60f3\u628a\u5173\u8054\u5230\u7684\u90fd\u4fee\u6539\uff0c\u4e0d\u7136\u6211\u4e3a\u4ec0\u4e48\u4e0d\u7528\u6587\u7ba1\u7684\u91cd\u547d\u540d\u529f\u80fd\u5462\uff0c\u522b\u60f3\u4e86\uff0c\u76f4\u63a5\u70b9\u5de6\u4e0b\u89d2\u7684 Refactor \u6309\u94ae\uff0c\u5c31\u662f\u5e72\u3002 \u7c7b\u540d\u3001\u51fd\u6570\u540d\u7684\u91cd\u547d\u540d\u90fd\u5c3d\u91cf\u91c7\u7528\u8fd9\u79cd\u65b9\u6848\uff0c\u56e0\u4e3a\u7f16\u8f91\u5668\u4f1a\u81ea\u52a8\u7ed9\u6211\u4eec\u627e\u5230\u5173\u8054\u7684\u5730\u65b9\uff0c\u7136\u540e\u540c\u6b65\u4fee\u6539\u6389\u3002\u4f60\u53ef\u5343\u4e07\u522b\u76f4\u63a5\u5220\u4e86\u4fee\u6539\u540d\u79f0\uff0c\u4e0d\u7136\u4f60\u53ef\u80fd\u4f1a\u82b1\u4e0a\u4e00\u5929\u7684\u65f6\u95f4\u6765\u89e3\u51b3\u91cd\u547d\u540d\u7684\u95ee\u9898\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u5b9e\u73b0\u6838\u5fc3\u5e93\u63a5\u53e3","text":"3.1. BaseWidget \u5728 BaseWidget \u91cc\u9762\u628a\u8be5\u5199\u7684\u90fd\u5199\u597d\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u4e0a\u9762\u7684\u8bbe\u8ba1\u7406\u5ff5\u6765\u5199\u3002 \u5982\u679c\u4f60\u5acc\u9ebb\u70e6\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u6587\u7ba1\u7684\u5b9e\u9645\u5de5\u7a0b\u4ee3\u7801 autotest_dde_file_manager : https://gerrit.uniontech.com/admin/repos/autotest_dde_file_manager \u3002 3.2. \u64cd\u4f5c\u5c42 \u5982\u679c\u4f60\u662f\u65b0\u5199\u9879\u76ee\uff0c\u4f60\u4f1a\u53d1\u73b0\u4e00\u5207\u90fd\u662f\u90a3\u4e48\u7684\u7b80\u5355\u3001\u76f4\u63a5\uff0c\u6309\u7167\u6211\u4eec\u63d0\u4f9b\u7ed9\u4f60\u7684\u63a5\u53e3\u5199\u7528\u4f8b\u7684\u64cd\u4f5c\u65b9\u6cd5\u5c31\u597d\u4e86\u3002 \u5982\u679c\u4f60\u662f\u60f3\u5bf9\u539f\u6765\u7684\u5de5\u7a0b\u8fdb\u884c\u6539\u9020\uff0c\u4f60\u9700\u8981\u6309\u7167\u6838\u5fc3\u5e93\u65b9\u6cd5\u7684\u8c03\u7528\uff0c\u5c06\u4f60\u4e4b\u524d\u5199\u7684\u6bcf\u4e2a\u65b9\u6848\u8fdb\u884c\u5bf9\u5e94\u7684\u4fee\u6539\uff0c\u5305\u62ec\u7c7b\u548c\u65b9\u6cd5\u7684\u547d\u540d\u3001\u65b9\u6cd5\u5185\u6240\u8981\u7528\u5230\u4e0d\u540c\u5b9a\u4f4d\u65b9\u6cd5\u7684\u5199\u6cd5\u4fee\u6539\u3002 \u8fd9\u65f6\u5019\u4f60\u53ef\u80fd\u4f60\u7684\u4ee3\u7801\u4e2d\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u62a5\u9519\uff0c\u4e0d\u7528\u62c5\u5fc3\uff0c\u4f60\u53ef\u4ee5\u4ece\u4e1a\u52a1\u903b\u8f91\u51fa\u53d1\uff0c\u60f3\u6e05\u695a\u8fd9\u4e2a\u65b9\u6cd5\u662f\u5e72\u4ec0\u4e48\u7684\u3001\u64cd\u4f5c\u7684\u5bf9\u8c61\u662f\u4ec0\u4e48\u3001\u53c2\u6570\u662f\u4ec0\u4e48\uff0c\u6ce8\u610f\u8fd9\u4e9b\u4fee\u6539\u662f\u4f1a\u5f71\u54cd\u5230\u7528\u4f8b\u4ee3\u7801\u91cc\u9762\u7684\uff0c\u6ca1\u5173\u7cfb\uff0c\u7528\u4f8b\u91cc\u9762\u672c\u6765\u4e5f\u5e94\u8be5\u88ab\u5173\u8054\u4fee\u6539\u3002 3.3. \u628a\u914d\u7f6e\u6a21\u5757\u5199\u597d\uff0c\u8fd9\u90e8\u5206\u57fa\u672c\u53ef\u4ee5\u590d\u5236\u6587\u7ba1\u7684\u4ee3\u7801\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4_1","title":"4\u3001\u8def\u5f84\u5904\u7406","text":"4.1. \u5bfc\u5165\u8def\u5f84 \u65b9\u6cd5\u548c\u7528\u4f8b\u4e2d\u90fd\u4f1a\u6d89\u53ca\u5230\u5bfc\u5165\u8def\u5f84\u7684\u4fee\u6539\uff0c\u5728\u4fee\u6539\u8def\u5f84\u65f6\uff0c\u5efa\u8bae\u4f60\u4f7f\u7528 Ctrl + Shift + R \u5168\u5c40\u66ff\u6362\uff0c\u4f1a\u5c06\u6574\u4e2a\u9879\u76ee\u4e0b\u7684\u76f8\u540c\u5730\u65b9\u90fd\u4fee\u6539\u5230\uff0c\u5f53\u7136\uff0c\u4f60\u4e5f\u53ef\u4ee5\u5728\u5c0f\u5f39\u7a97\u4e2d\u4fee\u6539\u5168\u5c40\u66ff\u6362\u4e3a\u5c40\u90e8\u76ee\u5f55\u4e0b\u66ff\u6362\u3002\u5904\u7406\u90a3\u79cd\u6ca1\u6709\u5173\u8054\u5173\u7cfb\uff0c\u4f46\u662f\u53c8\u662f\u76f8\u540c\u540d\u79f0\u7684\u91cd\u547d\u540d\uff0c\u6211\u4e5f\u63a8\u8350\u4f7f\u7528\u8fd9\u79cd\u65b9\u5f0f\u8fdb\u884c\u91cd\u547d\u540d\u3002 \u6ce8\u610f\uff0c\u5168\u5c40\u66ff\u6362\u7684\u65b9\u5f0f\u4efb\u7136\u65e0\u6cd5\u4fdd\u8bc1\u771f\u7684\u5168\u5c40\u88ab\u66ff\u6362\u4e86\uff08\u53ef\u80fd\u662f\u7f16\u8f91\u5668\u7684 Bug \u5427\uff09\uff0c\u6240\u4ee5\u4f60\u4ecd\u7136\u9700\u8981\u624b\u52a8\u770b\u4e0b\u5404\u5904\u662f\u5426\u4fee\u6539\u5230\u4f4d\u3002 4.2. \u8d44\u6e90\u8def\u5f84 \u4e00\u4e9b\u7528\u4f8b\u8d44\u6e90\u9700\u8981\u6839\u636e config.py \u91cc\u9762\u7684\u8def\u5f84\u914d\u7f6e\u8fdb\u884c\u8d44\u6e90\u8def\u5f84\u7684\u62fc\u63a5\uff0c\u5982\u679c\u4f60\u539f\u6765\u672c\u6765\u5c31\u6709\u4e00\u4e2a\u51fd\u6570\u4e13\u95e8\u7528\u4e8e\u7ec4\u88c5\u8def\u5f84\u7684\uff0c\u90a3\u4f60\u53ea\u9700\u8981\u4fee\u6539\u8fd9\u4e00\u4e2a\u5730\u65b9\u5c31\u597d\u4e86\uff0c\u5982\u679c\u4f60\u4e4b\u524d\u5e76\u6ca1\u6709\u8fd9\u6837\u7684\u8bbe\u8ba1\uff0c\u90a3\u53ef\u80fd\u9700\u8981\u4fee\u6539\u5927\u91cf\u6d89\u53ca\u5230\u8d44\u6e90\u8def\u5f84\u7684\u5730\u65b9\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5","title":"5\u3001\u8c03\u8bd5\u548c\u7f16\u5199\u7528\u4f8b","text":"\u4ee5\u4e0a\u51e0\u4e2a\u6b65\u9aa4\u505a\u5b8c\uff0c\u57fa\u672c\u5c31\u53ef\u4ee5\u8fdb\u884c\u7528\u4f8b\u4ee3\u7801\u7684\u8c03\u8bd5\u4e86\uff0c\u8fd9\u90e8\u5206\u5de5\u4f5c\u4e3b\u8981\u89e3\u51b3\u4f60\u4e4b\u524d\u51e0\u4e2a\u6b65\u9aa4\u9057\u6f0f\u7684\u95ee\u9898\uff0c\u5982\u679c\u6240\u6709\u7528\u4f8b\u90fd\u8c03\u8bd5\u901a\u8fc7\u4e86\uff0c\u90a3\u4e48\u5de5\u7a0b\u6539\u9020\u5c31\u5168\u90e8\u5b8c\u6210\u4e86\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/","title":"AT \u5f00\u53d1\u89c4\u8303","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u5f00\u53d1\u89c4\u8303\u662f\u6839\u636e\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fd0\u884c\u4e24\u5e74\u591a\u6765\uff0c\u9047\u5230\u95ee\u9898\u89e3\u51b3\u95ee\u9898\u800c\u5f62\u6210\u7684\u4e00\u4e9b\u89e3\u51b3\u65b9\u6848\uff0c\u6216\u8005\u8bf4\u7ecf\u9a8c\u603b\u7ed3\uff1b\u8fd9\u4e9b\u7ecf\u9a8c\u7b26\u5408\u6211\u4eec\u73b0\u9636\u6bb5 AT \u6240\u5e94\u7528\u7684\u573a\u666f\u9700\u8981\uff0c\u4e5f\u662f\u6211\u4eec\u7ecf\u8fc7\u957f\u671f\u601d\u8003\uff0c\u4e0d\u65ad\u8bd5\u9519\u4e0d\u65ad\u4fee\u6b63\uff0c\u5e76\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u5b9e\u8df5\u4e2d\u68c0\u9a8c\u8fc7\u53ef\u884c\u7684\u3002\u4ee5\u6b64\uff0c\u5e0c\u671b\u80fd\u5e2e\u52a9\u53c2\u4e0e\u5230\u81ea\u52a8\u5316\u7684\u76f8\u5173\u4eba\u5458\u51cf\u5c11\u8bd5\u9519\u6210\u672c\uff0c\u66f4\u597d\u3001\u66f4\u5feb\u7684\u7f16\u5199\u7528\u4f8b\u53ca\u7ef4\u62a4\u7528\u4f8b\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_1","title":"\u4e00\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u89c4\u8303","text":"\u6807\u7b7e\u5316\u7ba1\u7406\u6587\u6863\u8bf7\u53c2\u8003\uff1a \u300a\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u64cd\u4f5c\u6307\u5f15\u300b \u4ee5\u4e0b\u8bf4\u51e0\u4e2a\u5bb9\u6613\u51fa\u73b0\u7684\u95ee\u9898\uff1a"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1","title":"1. \u5bf9\u5e94\u5173\u7cfb","text":" \u5199\u5b8c\u81ea\u52a8\u5316\u7528\u4f8b\u4e4b\u540e\uff0c\u8bf7\u5728 CSV \u6587\u4ef6\u4e2d\u6807\u8bb0\u7528\u4f8b\u7684 ID\u3001\u7b49\u7ea7\u3002\u4e3a\u4e86\u63d0\u9192\u6807\u8bb0\uff0c\u6267\u884c\u7528\u4f8b\u65f6\u5728\u9996\u884c\u4f1a\u8f93\u51fa ERROR \u65e5\u5fd7\uff1a CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94\u7684 ID\uff1b \u5728\u6700\u7ec8\u63d0\u4ea4\u4ee3\u7801\u4e4b\u524d\uff0c\u4f60\u9700\u8981\u5728 CSV \u6587\u4ef6\u91cc\u9762\u5c06ID\u3001\u7528\u4f8b\u7b49\u7ea7\u7b49\u6807\u7b7e\u8865\u5168\uff0c\u5982\u679c CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94 ID\uff0c\u540e\u7eed\u5728\u6279\u91cf\u6267\u884c\u7684\u65f6\u5019\uff0c\u8fd9\u4e9b\u7528\u4f8b\u662f\u4e0d\u4f1a\u6267\u884c\u7684\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2","title":"2. \u540d\u79f0\u4e00\u81f4","text":" CSV \u6587\u4ef6\u7684\u6587\u4ef6\u540d\u3001\u7528\u4f8b\u51fd\u6570\u4e2d\u95f4\u7684\u540d\u79f0\u4e00\u81f4\u3001\u7528\u4f8b py \u6587\u4ef6\u4e2d\u95f4\u7684\u540d\u79f0\uff0c\u8fd9\u4e09\u4e2a\u540d\u79f0\u4e00\u81f4\u3002 \u4e3e\u4f8b\uff1a # test_music_001.py\ndef test_music_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u90a3\u4e48 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e3a music.csv\u3002 AT \u6846\u67b6\u5e95\u5c42\u4ee3\u7801\u5b9e\u73b0\u662f\u5c06 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e0e\u7528\u4f8b\u51fd\u6570\u540d\u79f0\u540d\u79f0\uff08item.name\uff09\u8fdb\u884c\u5bf9\u5e94\uff0c\u56e0\u6b64\uff0c\u6ce8\u610f CSV \u6587\u4ef6\u540d\u79f0\u5bf9\u5e94\u7684\u662f\u7528\u4f8b\u51fd\u6570\u540d\u79f0\uff0c\u5373 def test_music_001 \u91cc\u9762\u7684 music \uff0c\u800c\u4e0d\u662f test_music_001.py \u91cc\u9762\u7684 music \u3002 \u8fd9\u91cc\u7ec6\u7ec6\u54c1\u4e00\u4e0b\u54c8~ \u5982\u679c\u4f60\u5c06\u4e0a\u4f8b\u5199\u6210\u4e86\u8fd9\u6837: # test_music_001.py\ndef test_movie_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u7528\u4f8b\u6267\u884c\u6ca1\u95ee\u9898\uff0c\u4f46\u662f\u6807\u7b7e\u5316\u7ba1\u7406\u662f\u4e0d\u751f\u6548\u7684\uff0c\u6846\u67b6\u65e0\u6cd5\u5c06 music.csv\u6587\u4ef6\u91cc\u9762\u6807\u7b7e\uff0c\u6dfb\u52a0\u5230 test_movie_001\u8fd9\u4e2a\u7528\u4f8b\u4e2d\uff0c\u56e0\u4e3a\u4ed6\u4eec\u6ca1\u6709\u5bf9\u5e94\u5173\u7cfb\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#tag","title":"\u4e8c\u3001\u5206\u652f\u53ca tag \u7ba1\u7406\u89c4\u8303","text":"\u53c2\u8003\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u4ee3\u7801\u7ba1\u7406\u89c4\u8303\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2-tag","title":"2. \u5e94\u7528\u5e93 tag","text":" \u5e94\u7528\u5e93 tag \u6839\u636e\u5e94\u7528\u4ea4\u4ed8\u8282\u70b9\u751f\u6210\uff0c\u6bcf\u6b21\u6253 tag \u4e4b\u524d\uff0c\u76f8\u5173\u6d4b\u8bd5\u4eba\u5458\u9700\u8981\u8fdb\u884c\u7528\u4f8b\u8c03\u8bd5\uff1b \u8c03\u8bd5\u7528\u4f8b\u662f\u6307\u7684\u5728\u5168\u67b6\u6784\uff08x86\u3001arm\u3001mips\uff09\u4e0a\u8c03\u8bd5\u901a\u8fc7\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\u8fbe\u5230 90% \u4ee5\u4e0a\u624d\u80fd\u6253 tag\uff0c\u901a\u8fc7 Jenkins \u6267\u884c\u5668\u6267\u884c\u7528\u4f8b\uff0c\u4fdd\u7559\u901a\u8fc7\u7387\u7ed3\u679c\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\uff1a\u901a\u8fc7\u7528\u4f8b\u6570 / (\u603b\u7528\u4f8b\u6570 - \u5df2\u5e9f\u5f03\u7528\u4f8b) \u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u7b97\u901a\u8fc7 Jenkins \u6267\u884c\u5668 \u4f60\u53ef\u80fd\u4f1a\u5728\u4e00\u4e2a\u4ea4\u4ed8\u5468\u671f\u5185\u6301\u7eed\u7684\u8fdb\u884cAT\u7528\u4f8b\u8c03\u8bd5\uff0c\u4f46\u662f\u6700\u7ec8 AT \u7528\u4f8b\u6253 tag \u7684\u5e94\u7528\u7248\u672c\uff0c\u9700\u8981\u4f7f\u7528\u5e94\u7528\u96c6\u6210\u4ea4\u4ed8\u7684\u6700\u65b0\u5e94\u7528\u7248\u672c\uff0c\u53ef\u4ee5\u4f7f\u7528\u5e94\u7528\u7684\u63d0\u6d4b\u7248\u672c\uff1b\u4e00\u5b9a\u8981\u786e\u4fdd\u8c03\u8bd5\u7528\u4f8b\u7684\u5e94\u7528\u7248\u672c\u662f\u6700\u65b0\u7684\uff0c\u4e0d\u7136\u96c6\u6210\u8fdb\u53bb\u4e4b\u540e\uff0c\u6301\u7eed\u96c6\u6210\u5c31\u4f1a\u51fa\u95ee\u9898\uff1b tag \u53f7\u600e\u4e48\u6253\uff1f \u6839\u636e\u6301\u7eed\u96c6\u6210\u7684\u8981\u6c42\u751f\u6210\uff0c\u5176\u4e2d\u5e94\u7528\u7248\u672c\u53f7\u9700\u8981\u4e0e\u9879\u76ee\u7ecf\u7406\u786e\u8ba4\u672c\u6b21\u5373\u5c06\u96c6\u6210\u7684\u5e94\u7528\u7248\u672c\u53f7\u662f\u591a\u5c11\uff1b tag \u7684 commit \u4fe1\u606f\u683c\u5f0f\uff1a # commit msg\nversion:5.6.5\n \u5176\u4e2d 5.6.5 \u5199\u5e94\u7528\u7684\u96c6\u6210\u7248\u672c\u53f7\u3002 \u751f\u6210 tag \u7684\u547d\u4ee4\u53c2\u8003\uff1a\u300aGit \u6807\u7b7e\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3-tag","title":"3. \u57fa\u7840\u6846\u67b6 tag","text":"\u57fa\u7840\u6846\u67b6 tag \u4e0d\u4e0e\u4e1a\u52a1\u6302\u94a9\uff0c\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u6309\u9700\u53d1\u5e03\u7248\u672c\uff0c\u5728\u6839\u76ee\u5f55\u4e0b CURRENT \u6587\u4ef6\u4e2d\u8bb0\u5f55\u7684\u5f53\u524d\u7248\u672c\u53f7\u548c\u5386\u53f2\u7248\u672c\u53f7\uff0c\u53ca\u5176\u5bf9\u5e94\u65b0\u589e\u4e86\u54ea\u4e9b\u529f\u80fd\uff0c\u6709\u52a9\u4e8e\u5e94\u7528\u9009\u62e9\u5408\u9002\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\u3002 # CURRENT\n[current]\ntag = 0.9.5\n \u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u7684 control \u6587\u4ef6\u8bb0\u5f55\u5f53\u524d\u5e94\u7528\u5e93\u4f9d\u8d56\u7684\u57fa\u7840\u5e93\u7248\u672c\u3002 # control\n[Depends]\nautotest-basic-frame = 0.9.5\n \u7528\u4f8b\u5728\u6267\u884c\u65f6\u4f1a\u6821\u9a8c\u4e24\u4e2a\u6587\u4ef6\u7684\u7248\u672c\u53f7\u662f\u5426\u4e00\u81f4\uff0c\u5982\u679c\u4e0d\u4e00\u81f4\uff0c\u4f1a\u6253\u5370 error \u65e5\u5fd7\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_2","title":"\u4e09\u3001\u4ed3\u5e93\u6743\u9650\u7ba1\u7406","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_1","title":"1. \u57fa\u7840\u6846\u67b6","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u4ed3\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame \u57fa\u7840\u6846\u67b6\u4e0d\u5141\u8bb8\u533f\u540d\u8bbf\u95ee\uff0c\u5982\u679c\u4f60\u767b\u5f55 gerrit \u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u8bbf\u95ee\u4ee5\u4e0a\u94fe\u63a5\uff0c\u5219\u9700\u8981\u7533\u8bf7\u8bbf\u95ee\u6743\u9650\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_1","title":"2. \u5e94\u7528\u4ed3\u5e93","text":" \u81ea\u52a8\u5316\u5e94\u7528\u4ed3\u5e93\uff1a https://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684 app_name \u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_3","title":"\u56db\u3001\u65b9\u6cd5\u7f16\u5199&\u8c03\u7528\u89c4\u8303","text":"\u65b9\u6cd5\u7f16\u5199\u6574\u4f53\u8bbe\u8ba1\u601d\u8def\u53c2\u8003\uff1a[\u300aAT\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b]"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_2","title":"1. \u65b9\u6cd5\u7f16\u5199","text":"\u5199\u65b9\u6cd5\u7684\u65f6\u5019\u6ce8\u610f\u65b9\u6cd5\u5f52\u5c5e\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget\uff0c\u65b9\u6cd5\u662f\u5728\u54ea\u4e2a\u533a\u57df\u64cd\u4f5c\u7684\uff0c\u5c31\u5199\u5728\u54ea\u4e2a\u7c7b\u91cc\u9762\u3002 \u4e3e\u4f8b\uff1a from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n\"\"\"\u70b9\u51fb\u6807\u9898\u680fxxx\"\"\"\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_2","title":"2. \u65b9\u6cd5\u8c03\u7528","text":" \u5728\u7528\u4f8b\u4e2d\u8c03\u7528\u65b9\u6cd5\uff0c\u901a\u8fc7\u8be5\u5e94\u7528\u552f\u4e00\u7684\u51fa\u53e3\u8fdb\u884c\u8c03\u7528\uff0c\u6bd4\u5982\u6587\u7ba1\uff1a class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n \u4e0d\u8981\u5728\u7528\u4f8b\u4e2d\u5355\u72ec\u53bb\u8c03\u7528 TitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u8fd9\u4e9b\u7c7b\uff0c\u5426\u5219\u540e\u671f\u7528\u4f8b\u4f1a\u53d8\u5f97\u4e0d\u597d\u7ef4\u62a4\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_4","title":"\u4e94\u3001\u7528\u4f8b\u7f16\u5199\u89c4\u8303","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_3","title":"1. \u57fa\u4e8e\u7c7b\u5199\u7528\u4f8b","text":"\u6240\u6709\u7528\u4f8b\u90fd\u5e94\u8be5\u57fa\u4e8e\u7c7b\u53bb\u5199\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001(self):\n\"\"\"\u97f3\u4e50\u542f\u52a8\"\"\"\n \u6ce8\u610f\u4ee5\u4e0b\u51e0\u70b9\uff1a \u7c7b\u540d\u4e0d\u8981\u968f\u4fbf\u53d6\uff0c\u540c\u4e00\u4e2a\u5e94\u7528\u5e94\u8be5\u4f7f\u7528\u540c\u4e00\u4e2a\u7c7b\u540d\uff0c\u7528\u4f8b\u7c7b\u540d\u79f0\u5fc5\u987b\u4ee5 Test \u5f00\u5934\uff0c\u9075\u5faa\u5927\u9a7c\u5cf0\u547d\u540d\u89c4\u8303\uff1b \u7528\u4f8b\u7c7b\u7ee7\u627f BaseCase\uff0c\u4e00\u4e2a\u5e94\u7528\u53ea\u6709\u4e00\u4e2a BaseCase \u4e00\u4e2a py \u6587\u4ef6\u91cc\u9762\u53ea\u6709\u4e00\u4e2a\u7c7b\uff0c\u6211\u4eec\u79f0\u4e3a\u4e00\u4e2a\u6d4b\u8bd5\u7c7b\uff1b \u4e00\u4e2a\u7c7b\u91cc\u9762\u53ef\u4ee5\u6709\u591a\u4e2a\u7528\u4f8b\u51fd\u6570\uff0c\u8fd9\u53d6\u51b3\u8fd9\u6761\u7528\u4f8b\u6709\u591a\u5c11\u4e2a\u6d4b\u8bd5\u70b9\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001_1(self):\n\"\"\"\u4efb\u52a1\u680f\u542f\u52a8\u97f3\u4e50\"\"\"\ndef test_music_001_2(self):\n\"\"\"\u542f\u52a8\u5668\u542f\u52a8\u97f3\u4e50\"\"\" \ndef test_music_001_3(self):\n\"\"\"\u684c\u9762\u542f\u52a8\u97f3\u4e50\"\"\"\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_3","title":"2. \u7528\u4f8b\u51fd\u6570\u89c4\u8303","text":" \u7528\u4f8b\u51fd\u6570\u4ee5 test \u5f00\u5934\uff0c\u9075\u5faa\u86c7\u5f62\u547d\u540d\u89c4\u8303\uff0c\u4e2d\u95f4\u4e3a\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0\uff0c\u540e\u9762\u52a0\u7528\u4f8b ID\uff0c\u6700\u540e\u52a0\u6d4b\u8bd5\u70b9\u5e8f\u53f7\uff0c\u5373 test_${module}_${case_id}[_${index}] \uff1b \u6bd4\u5982\uff1atest_music_001_1\uff0cindex \u4ece 1 \u5f00\u59cb\u3002 \u51fd\u6570\u529f\u80fd\u8bf4\u660e\u91cc\u9762\u5199\u7528\u4f8b\u6807\u9898\uff0c\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u6807\u9898\u5373\u53ef\uff0c\u6ce8\u610f\u7528\u4e09\u5bf9\u53cc\u5f15\u53f7\uff0c\u4e0d\u8981\u7528\u5176\u4ed6\u6ce8\u91ca\uff0c\u66f4\u4e0d\u8981\u7528\u4e95\u53f7\u6ce8\u91ca\u5199\u7528\u4f8b\u6807\u9898\uff1b \u76f4\u63a5\u590d\u5236 PMS \u7528\u4f8b \u7528\u4f8b\u6b65\u9aa4\u76f4\u63a5\u5c06 PMS \u4e0a\u7528\u4f8b\u6b65\u9aa4\u548c\u9884\u671f\u590d\u5236\u8fdb\u6765\uff0c\u7136\u540e\u8fdb\u884c\u6279\u91cf\u6ce8\u91ca\uff08ctrl + /\uff09\uff0c\u5728\u6ce8\u91ca\u7684\u57fa\u7840\u4e0a\u53bb\u5199\u7528\u4f8b\u811a\u672c\u4f1a\u66f4\u52a0\u65b9\u4fbf\u5168\u9762\uff0c\u4e5f\u6bd4\u4f60\u81ea\u5df1\u5199\u6ce8\u91ca\u66f4\u8282\u7ea6\u65f6\u95f4\uff1a \u4e3e\u4f8b\uff0cPMS \u7528\u4f8b\uff1a \u76f4\u63a5\u9009\u4e2d\u7528\u4f8b\u5185\u5bb9\uff0c\u590d\u5236\u4e0b\u6765\uff0c\u7136\u540e\u7c98\u8d34\u5230\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c\u4e2d\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\n \u4e0a\u4f8b\u4e2d\u4e95\u53f7\u6ce8\u91ca\u90e8\u5206\u5c31\u662f\u76f4\u63a5\u4ece PMS \u4e0a\u590d\u5236\u8fc7\u6765\u7684\uff0c\u5728\u6b64\u57fa\u7840\u4e0a\u5199\u7528\u4f8b\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\nmusic = DeepinMusicWidget()\nmusic.click_singer_btn_in_music_by_ui()\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\nmusic.click_icon_mode_in_music_by_ui()\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\nmusic.double_click_first_singer_in_singer_icon_view_by_ui()\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\nself.assert_xxx\n \u4f60\u770b\uff0c\u975e\u5e38\u6e05\u695a\u6bcf\u4e00\u6b65\u5728\u505a\u4ec0\u4e48\uff0c\u91cd\u70b9\u662f\u7701\u53bb\u4e86\u5199\u6ce8\u91ca\u7684\u65f6\u95f4\uff0c\u771f\u7684\u7092\u9e21\u65b9\u4fbf\u3002 \u4e0d\u5199 if __name__ == '__main__':\uff0c\u4e0d\u5199\u591a\u4f59\u7684\u4ee3\u7801\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3","title":"3. \u6570\u636e\u9a71\u52a8","text":" \u5982\u679c\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u662f\u76f8\u540c\u7684\uff0c\u53ea\u662f\u4e00\u4e9b\u53c2\u6570\u53d8\u5316\uff0c\u5c3d\u91cf\u4f7f\u7528\u6570\u636e\u9a71\u52a8\u6765\u5b9e\u73b0\u7528\u4f8b\uff1b \u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u6570\u636e\u9a71\u52a8\u7684\u6570\u636e\uff0c\u4e0d\u80fd\u56e0\u6b64\u5f15\u5165\u4f9d\u8d56\uff0c\u5c3d\u91cf\u4f7f\u7528\u4e00\u4e9b\u6807\u51c6\u5e93\u80fd\u8bfb\u53d6\u7684\u6587\u4ef6\u683c\u5f0f\uff0c\u6bd4\u5982 json\u3001ini\u3001CSV\u3001xml\u3001txt \u7b49\u6587\u4ef6\u683c\u5f0f\uff1b\u4e0d\u5efa\u8bae\u4f7f\u7528 Yaml\u3001Excel\u3001MySQL \u7b49\u6570\u636e\u683c\u5f0f\uff1b \u8bfb\u53d6\u6570\u636e\u65f6\u4e5f\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff0c\u5982\u4f7f\u7528 pandas \u5904\u7406 CSV \u5c31\u5c5e\u4e8e\u5927\u6750\u5c0f\u7528\u4e86\uff0c\u6b63\u5e38\u7684\u6570\u636e\u9a71\u52a8\u8fd8\u6ca1\u5230\u9700\u8981\u5927\u6570\u636e\u5206\u6790\u6765\u5904\u7406\u7684\u5730\u6b65\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u5728 widget/ddt/ \u76ee\u5f55\u4e0b\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5199\u6cd5\uff1a @pytest.mark.parametrize(\"value\", data)\ndef test_smb_049(self, value):\n \u4ee5\u4e0a\u8fd9\u79cd\u53c2\u6570\u5316\u7684\u5199\u6cd5\u672c\u8eab\u6ca1\u4ec0\u4e48\u95ee\u9898\uff0c\u4f46\u662f\uff0c\u8fd9\u91cc\u5fc5\u987b\u8981\u8865\u5145\u4e00\u4e2a\u6ca1\u6709\u7528\u7684\u5c0f\u77e5\u8bc6\uff1a \u5982\u679c\u53c2\u6570\u5316\u6570\u636e\u91cc\u9762\u7684\u5b57\u7b26\u4f1a\u539f\u5c01\u4e0d\u52a8\u7684\u8f93\u51fa\u5230 item.name \u91cc\u9762\uff0c\u663e\u793a\u975e\u5e38\u4e0d\u4f18\u96c5\uff0c\u800c\u4e14\u53ef\u4ee5\u4f1a\u5f15\u5165\u4e00\u4e9b\u610f\u60f3\u4e0d\u5230\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u611f\u53d7\u4e00\u4e0b\uff1a \u53c2\u6570\uff1a data = [\n\"\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\", \"qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678\",\n]\n \u73b0\u8c61\u662f\u8fd9\u6837\u8272\u513f\u7684\uff1a test_smb_049.py::TestFileManager::test_smb_049[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09]\ntest_smb_049.py::TestFileManager::test_smb_049[qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui]\ntest_smb_049.py::TestFileManager::test_smb_049[12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678]\n \u8bf4\u5b9e\u8bdd\uff0c\u770b\u7740\u5fc3\u91cc\u5835\u5f97\u614c\uff0c\u5982\u679c\u8fd9\u91cc\u9762\u5305\u542b\u4e00\u4e9b\u7279\u6b8a\u5b57\u7b26\u6216\u8005\u662f\u8d85\u957f\uff0c\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u5f88\u5947\u5999\u7684\u4e8b\u60c5\u53d1\u751f\u3002 parametrize \u91cc\u9762\u6709\u4e2a\u53c2\u6570\uff1aids\uff0c\u53ef\u4ee5\u89e3\u51b3\u6b64\u7c7b\u95ee\u9898\uff0c\u5c31\u50cf\u8fd9\u6837\uff1a @pytest.mark.parametrize(\"value\", data, ids=[1, 2, 3])\ndef test_smb_049(self, value):\n \u518d\u6765\u611f\u53d7\u4e00\u4e0b\uff1a test_smb_049.py::TestFileManager::test_smb_049[1]\ntest_smb_049.py::TestFileManager::test_smb_049[2]\ntest_smb_049.py::TestFileManager::test_smb_049[3]\n \u660e\u663e\u597d\u591a\u4e86\uff0c\u6240\u4ee5\u5c3d\u91cf\u4f7f\u7528 ids \u8fd9\u4e2a\u53c2\u6570\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 fixture \u7684\u6570\u636e\u9a71\u52a8\u65b9\u5f0f\uff0c\u6846\u67b6\u867d\u7136\u652f\u6301\uff0c\u4f46\u53ef\u8bfb\u6027\u6bd4\u8f83\u5dee\uff1b\u5982\u679c\u4f60\u4e0d\u77e5\u9053\u8fd9\u53e5\u8bdd\u5728\u8bf4\u5565\uff0c\u90a3\u4f60\u53ef\u4ee5\u5ffd\u7565\uff0c\u6211\u4e5f\u4e0d\u6253\u7b97\u8be6\u7ec6\u8bf4\u8fd9\u79cd\u5b9e\u73b0\u65b9\u5f0f\uff0c\u64cd\u4f5c\u6bd4\u8f83\u9a9a\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4","title":"4. \u65ad\u8a00\u8d44\u6e90","text":" \u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u76f4\u63a5\u653e\u5728\u7528\u4f8b\u6a21\u5757\u7684\u540c\u7ea7\u76ee\u5f55\u4e0b\u7684 assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0 + \u7528\u4f8b ID \u547d\u540d\uff1b \u56fe\u50cf\u8bc6\u522b\u65ad\u8a00\uff0c\u4e0d\u8981\u622a\u53d6\u4e00\u5f20\u5f88\u5927\u7684\u56fe\uff0c\u56fe\u7247\u8d44\u6e90\u5305\u542b\u7684\u5143\u7d20\u592a\u591a\u4e86\uff0c\u975e\u5e38\u5bb9\u6613\u53d7\u5230\u9700\u6c42\u5f71\u54cd\uff0c\u5efa\u8bae\u662f\u8fdb\u884c\u5c40\u90e8\u7684\u65ad\u8a00\uff1b \u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u5339\u914d\u5ea6\u662f 0.9\uff0c\u5982\u679c\u65ad\u8a00\u7684\u573a\u666f\u5bf9\u4e8e\u7cbe\u786e\u5ea6\u8981\u6c42\u6ca1\u90a3\u4e48\u9ad8\uff0c\u53ef\u4ee5\u5728\u65ad\u8a00\u8bed\u53e5\u91cc\u9762\u4f20\u5165\u5c0f\u4e8e 0.9 \u7684\u53c2\u6570\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5","title":"5. \u5143\u7d20\u5b9a\u4f4d","text":" \u7528\u4e8e\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u4e2d\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u547d\u540d\u4e3a\u8be5\u5143\u7d20\u7684\u540d\u79f0\uff1b \u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u622a\u53d6\u65f6\u5c3d\u91cf\u7cbe\u786e\u5230\u8fd9\u4e2a\u5177\u4f53\u7684\u6309\u94ae\uff0c\u56fe\u7247\u4e5f\u4e0d\u8981\u592a\u5927\uff1b \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u64cd\u4f5c\u8f83\u5feb\uff0c\u5408\u7406\u52a0\u5165\u7b49\u5f85\u65f6\u95f4\u80fd\u63d0\u9ad8\u7528\u4f8b\u7684\u7a33\u5b9a\u6027\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6","title":"6. \u7528\u4f8b\u8d44\u6e90","text":" \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u4f7f\u7528\u5230\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u6bd4\u5982\u97f3\u4e50\u53ef\u80fd\u9700\u8981\u4e00\u4e9b mp3 \u7684\u8d44\u6e90\u7528\u4e8e\u6d4b\u8bd5\uff0c\u5b58\u653e\u5728 widget/case_res \u76ee\u5f55\u4e0b\uff0c\u524d\u63d0\u662f\u8fd9\u4e9b\u8d44\u6e90\u4e0d\u8d85\u8fc7 10M\uff1b \u5982\u679c\u662f\u4e00\u4e9b\u6bd4\u8f83\u5927\u7684\u8d44\u6e90\uff0c\u5efa\u8bae\u653e\u5230\u7edf\u4e00\u7684 ftp \u670d\u52a1\u5668 \uff08ftp://10.8.10.245\uff09\uff0c\u9700\u8981\u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\u518d\u4e0b\u8f7d\u4e0b\u6765\uff1b f\"wget ftp://{Config.FTP_IP}/uploads/\u591a\u5a92\u4f53/\u5f71\u9662/auto/{file_name};unzip {file_name};rm -rf {file_name};\"\n \u6d4b\u8bd5\u8d44\u6e90\u4e0b\u8f7d\u5230\u5e94\u7528 widget/case_res \u76ee\u5f55\u4e0b\uff1b \u7981\u6b62\u5c06\u6d4b\u8bd5\u8d44\u6e90\u5b58\u653e\u5728\u4e2a\u4eba\u7684\u673a\u5668\u4e0a\uff1b \u5e94\u8be5\u5c3d\u91cf\u4fdd\u8bc1\uff0c\u4e00\u4e2a\u8d44\u6e90\u5728\u4e00\u6b21\u7528\u4f8b\u6267\u884c\u4e2d\u53ea\u9700\u8981\u4e0b\u8f7d\u4e00\u6b21\uff0c\u6240\u4ee5\u4f60\u4e0d\u80fd\u6bcf\u6b21\u4f7f\u7528\u7684\u65f6\u5019\u90fd\u53bb\u4e0b\u8f7d\uff0c\u8fd9\u6837\u53ef\u80fd\u4f1a\u8017\u8d39\u5927\u91cf\u7684\u7f51\u7edc\u8d44\u6e90\uff0c\u800c\u56e0\u4e3a\u5148\u5224\u65ad\u672c\u5730\u662f\u5426\u5b58\u5728\u6b64\u8d44\u6e90\uff0c\u5982\u679c\u4e0d\u5b58\u5728\u518d\u53bb\u4e0b\u8f7d\uff1b \u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u5c06\u8d44\u6e90\u62f7\u8d1d\u5230\u5bf9\u5e94\u7684\u6d4b\u8bd5\u76ee\u5f55\u4e0b\uff0c\u6bd4\u5982\u5c06 mp3 \u6587\u4ef6\u62f7\u8d1d\u5230 ~/Music \u76ee\u5f55\u4e0b\uff0c\u4f46\u662f\u6211\u4eec\u66f4\u5efa\u8bae\u4f60\u4f7f\u7528\u53d1\u9001\u5feb\u6377\u94fe\u63a5\u7684\u65b9\u5f0f\u66ff\u4ee3\u62f7\u8d1d\u7684\u64cd\u4f5c\uff0c\u56e0\u4e3a\u5728\u62f7\u8d1d\u5927\u6587\u4ef6\u65f6\u662f\u5f88\u6d88\u8017\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u800c\u521b\u5efa\u94fe\u63a5\u5219\u4e0d\u4f1a\uff1b @classmethod\ndef recovery_many_movies_in_movie_by_cmd(cls):\n\"\"\"\u6062\u590d\u591a\u4e2a\u89c6\u9891\u6587\u4ef6\u81f3\u89c6\u9891\u76ee\u5f55\u4e2d\"\"\"\nwork_path = f\"/home/{Config.USERNAME}/Videos/auto\"\ncode_path = f\"{Config.CASE_RES_PATH}/auto\"\ncls.run_cmd(f\"rm -rf {work_path};mkdir {work_path}\")\nsleep(1)\nflag = False\nif not exists(code_path):\ncls.run_cmd(f\"mkdir -p {code_path}\")\nflag = True\nlogger.info(f\"ln -s {code_path}/* {work_path}/\")\ncls.run_cmd(\nf\"cd {code_path}/;\"\nf\"{cls.wget_file('auto.zip') if flag else ''}\"\nf\"ln -s {code_path}/* {work_path}/ > /dev/null 2>&1\"\n)\n \u8d44\u6e90\u4e0b\u8f7d\u8fc7\u7a0b\u4e2d\u6ce8\u610f\u8d85\u65f6\u7684\u95ee\u9898\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u5f88\u5927\uff0c\u8981\u7279\u522b\u6ce8\u610f\u8fd9\u95ee\u9898\uff0c\u5982\u679c\u4f60\u4f7f\u7528\u5f3a\u5236\u7b49\u5f85\u4e0b\u8f7d\u7ed3\u675f( os.system )\uff0c\u53ef\u80fd\u4f1a\u9020\u6210\u7528\u4f8b\u6267\u884c\u65f6\u957f\u53d8\u5f97\u4e0d\u53ef\u63a5\u53d7\uff0c\u76ee\u524d\u6211\u4eec\u53d1\u73b0\u5728\u6301\u7eed\u96c6\u6210\u73af\u5883\u6267\u884c\u65f6\u7f51\u7edc\u4e0b\u8f7d\u901f\u5ea6\u5f88\u6162\uff0c\u6240\u4ee5\u8d85\u65f6\u673a\u5236\u662f\u5f88\u6709\u5fc5\u8981\u7684\uff1brun_cmd \u65b9\u6cd5\u6709\u4e00\u4e2a\u9ed8\u8ba4\u8d85\u65f6\u7684\u65f6\u95f4\uff0c\u4f60\u53ef\u4ee5\u6839\u636e\u8d44\u6e90\u5927\u5c0f\u5bf9\u8d85\u65f6\u65f6\u95f4\u8fdb\u884c\u8c03\u6574\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_5","title":"\u516d\u3001\u7528\u4f8b\u8c03\u8bd5\u6280\u5de7","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_4","title":"1. \u65e5\u5fd7","text":" \u4e00\u5b9a\u8981\u5148\u770b\u62a5\u9519\uff0c\u770b error \u65e5\u5fd7\uff0c\u901a\u5e38\u80fd\u660e\u786e\u7684\u544a\u8bc9\u4f60\u5177\u4f53\u54ea\u91cc\u4ee3\u7801\u62a5\u9519\uff1b \u7ed3\u5408\u62a5\u9519\u70b9\u524d\u9762\u7684error\u3001 info \u548c debug \u65e5\u5fd7\u770b\u5426\u662f\u6b63\u5e38\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_4","title":"2. \u65ad\u70b9\u8c03\u8bd5","text":" \u65b9\u6cd5\u62a5\u9519\uff1a \u5728\u65b9\u6cd5\u5e93\u4e2d\u627e\u5230\u5bf9\u5e94\u7684\u65b9\u6cd5\uff0c\u5355\u72ec\u8c03\u7528\uff0c\u770b\u662f\u5426\u80fd\u6b63\u5e38\u6267\u884c\uff1b \u901a\u5e38\u5355\u4e2a\u65b9\u6cd5\u7684\u6267\u884c\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u62a5\u9519\uff0c\u5f88\u5feb\u5c31\u80fd\u6392\u67e5\u51fa\u95ee\u9898\uff1b\u5728\u65b9\u6cd5\u5185\u90e8\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u65b9\u6cd5\u5185\u90e8\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u8c03\u7528\u6ca1\u95ee\u9898\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u62a5\u9519\u7684\u65b9\u6cd5\u524d\u9762\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u7528\u4f8b\u7684\u4e1a\u52a1\u903b\u8f91\u548c\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u65ad\u8a00\u62a5\u9519\uff1a \u65ad\u8a00\u4e3a\u6570\u636e\u65ad\u8a00\uff0c\u6839\u636e\u8868\u8fbe\u5f0f\u8fdb\u884c\u65ad\u8a00\u8bed\u53e5\u8fdb\u884c\u4fee\u6539\uff1b \u6587\u4ef6\u751f\u6210\u7c7b\u65ad\u8a00\uff0c\u67e5\u770b\u662f\u5426\u9700\u8981\u52a0\u7b49\u5f85\u65f6\u95f4\uff1b \u56fe\u50cf\u65ad\u8a00\uff0c\u5728\u65ad\u8a00\u8bed\u53e5\u5904\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u7528\u4f8b\u8fd0\u884c\u5230\u65ad\u8a00\u5904\u4f1a\u505c\u6b62\uff0c\u67e5\u770b\u6b64\u65f6\u65ad\u8a00\u7684\u56fe\u7247\u4e0e\u7528\u4f8b\u6267\u884c\u7684\u73b0\u573a\u5b58\u5728\u4ec0\u4e48\u5dee\u5f02\uff0c\u6b64\u65f6\u4e5f\u53ef\u4ee5\u8fdb\u884c\u91cd\u65b0\u622a\u56fe\uff0c\u4ece\u800c\u66ff\u6362\u65b0\u7684\u56fe\u7247\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3_1","title":"3. \u8fdc\u7a0b\u6267\u884c","text":" \u8fdc\u7a0b\u6267\u884c\u6307\u7684\u662f\u7f16\u8f91\u5668\u901a\u8fc7\u6307\u5b9a\u8fdc\u7a0b\u89e3\u91ca\u5668\u6267\u884c\u81ea\u52a8\u5316\u4ee3\u7801\uff1b \u8fdc\u7a0b\u6267\u884c\u7684\u597d\u5904\u662f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u7684 Debug \u8fd0\u884c\uff0c\u4e0d\u7528\u5728\u6d4b\u8bd5\u673a\u4e0a\u6253\u5f00\u7f16\u8f91\u5668\uff0c\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u66f4\u5feb\uff1b \u652f\u6301\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u7684\u7f16\u8f91\u5668\uff1a \u4e13\u4e1a\u7248 Pycharm VScode \uff0c\u9700\u8981\u4f7f\u7528\u63d2\u4ef6 Remote-SSH \u8fdc\u7a0b\u6267\u884c\u914d\u7f6e \u4ee5 Pycharm \u4e3a\u4f8b\uff1a File \u2014> Settings \u2014> Project \u2014> Python Interpreter \u2014> \u53f3\u8fb9\u8bbe\u7f6e\u6309\u94ae \u2014> Add... \u2014> SSH Interpreter \u2014> New server configuration(\u586b\u5165host\u548cusername) \u2014> Next \u2014> password\uff08\u6d4b\u8bd5\u673a\u5bc6\u7801\uff09 \u2014> Interpreter(\u9009\u62e9\u8fdc\u7a0b\u89e3\u91ca\u5668) \u2014> Finish "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4_1","title":"4. \u73af\u5883\u6e05\u7406","text":" \u5982\u679c\u7528\u4f8b\u91cc\u9762\u7684 teardown \u6ca1\u6709\u6267\u884c\uff0c\u5927\u6982\u7387\u662f\u56e0\u4e3a setup \u91cc\u9762\u4ee3\u7801\u62a5\u9519\uff0c\u8fd9\u4e24\u4e2a\u662f\u4e00\u5bf9\u7684\uff0csetup \u91cc\u9762\u62a5\u9519\uff0cteardown \u91cc\u9762\u7684\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\uff1b \u76ee\u524d\u6211\u4eec\u5df2\u7ecf\u5c06\u5404\u5e94\u7528\u7684 clean_all \u8fd9\u4e2a fixture \u6539\u6210\u4e86\u7ec8\u7ed3\u5668\uff0c\u786e\u4fdd\u59cb\u7ec8\u80fd\u6267\u884c\u5230\u8fd9\u6b65\uff0c\u4f46\u662f\u7528\u4f8b\u91cc\u9762\u7684 fixture\uff0c\u8fd8\u662f\u9700\u8981\u6211\u4eec\u5c0f\u5fc3\u5904\u7406\uff1b \u8981\u6267\u884c clean_all \u9700\u8981\u5728\u7f16\u8f91\u5668\u8fd0\u884c\u53c2\u6570\u52a0 --clean yes\uff0c\u5199\u7528\u4f8b\u7684\u65f6\u5019\u8bf7\u52a0\u4e0a\uff0c\u4e0d\u7136\u4f60\u4e0d\u786e\u5b9a\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u7684\u73af\u5883\u662f\u5426\u6062\u590d\uff1b setup \u53ef\u4ee5\u4e0d\u8981\uff0c\u5c06 setup \u653e\u5230\u7528\u4f8b\u91cc\u9762\u662f\u4e00\u79cd\u7a33\u59a5\u7684\u505a\u6cd5\uff0cteardown \u4e00\u5b9a\u8981\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5_1","title":"5. \u5143\u7d20\u5b9a\u4f4d\u4e0d\u51c6\uff08\u5750\u6807\u8fd4\u56de\u4e0d\u5bf9\uff09","text":" \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u53ef\u80fd\u53d7\u5230\u7a97\u53e3 ID \u7684\u53d8\u5316\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u9ed8\u8ba4\u53d6\u6700\u65b0\u7684\u4e00\u4e2a\u7a97\u53e3\u7528\u4e8e\u5b9a\u4f4d\uff0c\u4f46\u5982\u679c\u5b9e\u9645\u9700\u8981\u5b9a\u4f4d\u7684\u4e0d\u662f\u6700\u65b0\u7684\u7a97\u53e3\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u91cd\u65b0\u5b9e\u4f8b\u5316\u65b9\u6cd5\u7c7b\u5bf9\u8c61\uff0c\u5e76\u5728\u7c7b\u4e2d\u4f20\u5165\u5bf9\u5e94\u7684\u7a97\u53e3\u5e8f\u53f7\uff1b \u57fa\u4e8e\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u76ee\u524d\u9047\u5230\u7684\u7b14\u8bb0\u672c\u4e0a\uff0c\u7531\u4e8e\u5c4f\u5e55\u7f29\u653e\u6bd4\u4f8b\u4e3a 1.25\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u6211\u4eec\u9ed8\u8ba4\u4f7f\u7528\u7f29\u653e\u6bd4\u4f8b\u4e3a 1\uff1b \u57fa\u4e8e\u56fe\u50cf\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u76ee\u6807\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b \u57fa\u4e8e OCR \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u6587\u5b57\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u540c\u6837\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6_1","title":"6. \u952e\u9f20\u64cd\u4f5c\u4e0d\u51c6","text":" \u9f20\u6807\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6bd4\u5982\u53f3\u952e\u3001\u53cc\u51fb\u65e0\u54cd\u5e94\uff1b \u952e\u76d8\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6216\u8005\u5ef6\u8fdf\u8f93\u5165\uff0c\u6bd4\u5982\u7528\u4f8b\u9700\u8981\u8f93\u5165\u201c\u6211\u662f\u4e2d\u56fd\u4eba\u201d\uff0c\u5b9e\u9645\u53ea\u8f93\u5165\u4e86\u201c\u6211\u56fd\u4eba\u201d\uff1b \u4ee5\u4e0a\u95ee\u9898\u6392\u9664\u5e94\u7528\u5361\u987f\u7b49\u95ee\u9898\uff0c\u5927\u6982\u7387\u662f\u7531\u4e8e\u5de5\u5177\u7684\u95ee\u9898\uff0c\u76ee\u524d\u952e\u9f20\u64cd\u4f5c\u6211\u4eec\u4f7f\u7528\u4e09\u4e2a\u5de5\u5177\uff1aDogtail \u63d0\u4f9b\u7684\u952e\u9f20\u5de5\u5177\u3001PyAutoGUI\u3001Xdotool \uff1b \u6709\u540c\u5b66\u53ef\u80fd\u8981\u8bf4\u4e3a\u5565\u8981\u7528\u4e09\u4e2a\u554a\uff0c\u7528\u4e00\u4e2a\u4e0d\u5c31\u597d\u4e86\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u5404\u6709\u4f18\u70b9\u5404\u6709\u7f3a\u70b9\u3002 \u5982\u679c\u4f60\u9047\u5230\u952e\u9f20\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u8bd5\u8bd5\u901a\u8fc7\u4e0d\u540c\u7684\u5de5\u5177\u64cd\u4f5c\uff1b\u952e\u76d8\u8f93\u5165\u5ef6\u8fdf\u7684\u95ee\u9898\uff0c\u4e00\u822c\u662f\u56e0\u4e3a\u8f93\u5165\u901f\u5ea6\u592a\u5feb\u4e86\uff0c\u7cfb\u7edf\u6ca1\u53cd\u5e94\u8fc7\u6765\uff0c\u5e38\u89c1\u4e8e ARM \u548c MIPS \u4e0a\uff0c\u4fee\u6539\u53c2\u6570 delay_time \u7684\u503c\uff0c\u5355\u4f4d\u4e3a\u6beb\u79d2\uff1b # mouse_key.py\n@classmethod\ndef input_message(cls, message, delay_time=300, interval=0.2):\n\"\"\"\n \u8f93\u5165\u5b57\u7b26\u4e32\n :param message: \u8f93\u5165\u7684\u5185\u5bb9\n :param delay_time: \u5ef6\u8fdf\u65f6\u95f4\n :param interval:\n :return:\n \"\"\"\n \u5982\u679c\u4e0d\u662f\u65b9\u6cd5\u7684\u95ee\u9898\uff0c\u5219\u9700\u8981\u7ee7\u7eed\u548c\u5f00\u53d1\u4e00\u8d77\u6392\u9664\uff0c\u662f\u5426\u4e3a\u5e94\u7528\u63a5\u53d7\u952e\u9f20\u4fe1\u53f7\u5904\u7406\u7684\u95ee\u9898\uff0c\u8fd9\u7c7b\u60c5\u51b5\u6211\u4eec\u4e5f\u662f\u9047\u5230\u8fc7\u7684\uff0c\u5177\u4f53\u95ee\u9898\u5177\u4f53\u5206\u6790\u3002 \u6bd4\u5982\u5f71\u9662\u5c31\u91cd\u5199\u4e86\u4e00\u4e2a\u53f3\u952e\u7684\u65b9\u6cd5\uff1a # base_widget.py\n@classmethod\ndef right_click(cls, _x=None, _y=None):\n\"\"\"\n \u91cd\u5199\u5e95\u5c42\u5355\u51fb\u9f20\u6807\u53f3\u952e\n \u89e3\u51b3\u5f71\u9662\u53f3\u952e\u89e6\u53d1release\u4e8b\u4ef6\u7684\u95ee\u9898\uff08\u53f3\u952e\u4e3b\u7a97\u53e3\u4f1a\u64ad\u653e\u89c6\u9891\uff09\n \"\"\"\ncls.mouse_down(_x, _y, button=3)\nsleep(0.1)\ncls.mouse_up(button=3)\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_6","title":"\u4e03\u3001\u5176\u4ed6\u4e0d\u4e3a\u4eba\u77e5\u7684\u7ec6\u8282","text":" \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u5c3d\u91cf\u7f16\u5199\u540c\u4e00\u4e2a\u5e94\u7528\u6216\u6a21\u5757\u7684\u7528\u4f8b\uff0c\u80fd\u5bf9\u8be5\u7528\u4f8b\u5df2\u6709\u65b9\u6cd5\u719f\u6089\uff0c\u907f\u514d\u8fc7\u591a\u91cd\u590d\u4e1a\u52a1\u4ee3\u7801\u7684\u5c01\u88c5\uff1b \u76f8\u540c\u7684\u573a\u666f\u4e0b\uff0c\u5404\u67b6\u6784\u7b49\u5f85\u65f6\u95f4\u4e0d\u540c\uff0c\u5efa\u8bae\u4f7f\u7528\u6846\u67b6\u63d0\u4f9b\u7684 sleep\uff0c\u6211\u4eec\u505a\u4e86\u4e0d\u540c\u67b6\u6784\u7684\u500d\u6570\u653e\u5927\uff1b \u7f16\u5199\u7528\u4f8b\u65f6\uff0c\u5c3d\u91cf\u8003\u8651\u5230\u6bcf\u4e00\u6b65\u5f02\u5e38\u540e\u7684\u73af\u5883\u6062\u590d\uff0c\u9700\u8981\u5efa\u8bae\u8fd9\u79cd\u610f\u8bc6\uff0c\u968f\u65f6\u8981\u8003\u8651\u5230\uff0c\u8fd9\u6b65\u64cd\u4f5c\u6709\u6ca1\u6709\u53ef\u80fd\u51fa\u9519\uff0c\u51fa\u9519\u4e86\u6539\u600e\u4e48\u529e\uff1b \u63d0\u4ea4\u4ee3\u7801\u7684\u65f6\u5019\u6ce8\u610f\u4e0d\u8981\u628a\u4e00\u4e9b\u4e34\u65f6\u7684\u6d4b\u8bd5\u8d44\u6e90\u63d0\u4ea4\u8fdb\u53bb\u4e86\uff0c\u6bd4\u5982\u6d4b\u8bd5\u4e86\u4e00\u4e2a\u5f71\u7247\uff0c\u6709\u4e9b\u540c\u5b66\u4e60\u60ef\u4f7f\u7528 git add . \uff0c\u7136\u540e\u5c31\u5168\u90e8\u63d0\u4ea4\u5230\u4ee3\u7801\u4ed3\u5e93\u4e86\uff0c\u8fd9\u6837\u5373\u4f7f\u540e\u671f\u628a\u5927\u6587\u4ef6\u5220\u4e86\uff0c.git \u6587\u4ef6\u91cc\u9762\u4e5f\u4f1a\u5f88\u5927\uff0c\u9020\u6210\u4ee3\u7801\u4ed3\u5e93\u53d8\u5f97\u5341\u5206\u81c3\u80bf\u3002 \u66f4\u591a\u7ec6\u8282\u67e5\u770b\uff1a\u300aAT\u7ecf\u9a8c\u603b\u7ed3\u300b"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/","title":"AT \u6267\u884c\u5668\u4f7f\u7528\u6307\u5317","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/5/25\n# Author : litao\n# =============================================\n Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1","title":"1\u3001\u529f\u80fd\u4ecb\u7ecd","text":" \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7cfb\u7edf\u8bed\u8a00\u8bbe\u7f6e\uff0c\u5206\u8fa8\u7387\u8bbe\u7f6e\u53ca\u7528\u4f8b\u6267\u884c\u73af\u5883\u642d\u5efa\uff1b \u652f\u6301 IP \u4e3a 15 \u7f51\u6bb5\u7684 AMD \u67b6\u6784\u6d4b\u8bd5\u673a\u955c\u50cf\u88c5\u673a\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u6307\u5b9a\u5e94\u7528\uff0c\u6307\u5b9a\u8303\u56f4\u6807\u7b7e\u7684\u7528\u4f8b\u6267\u884c\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u72b6\u6001\u68c0\u67e5\uff0c\u662f\u5426\u6709\u6b63\u5728\u8fd0\u884c\u7684\u6d4b\u8bd5\uff1b \u652f\u6301\u914d\u7f6e\u7528\u4f8b\u6267\u884c\u65f6\u957f\uff0c\u9632\u6b62\u4efb\u52a1\u963b\u585e\uff1b \u652f\u6301\u6839\u636e\u5e94\u7528\u7248\u672c\u81ea\u52a8\u67e5\u627e\u5bf9\u5e94\u7684\u7528\u4f8b tag\uff1b \u652f\u6301\u5f02\u5e38\u5904\u7406\u548c\u6d4b\u8bd5\u5b8c\u6210\u7684\u5b9e\u65f6\u6d88\u606f\u901a\u77e5\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2job","title":"2\u3001Job \u4ecb\u7ecd","text":"\u4ee5\u4e0b\u6309\u6267\u884c\u6d41\u7a0b\u7684\u987a\u5e8f\u4ecb\u7ecd\uff0c\u6bcf\u4e00\u6b65\u90fd\u53ef\u4ee5\u5355\u72ec\u6267\u884c\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1_1","title":"1\u3001\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/AT_test/ \u6574\u4e2a\u6d41\u7a0b\u7684\u4e3b\u5165\u53e3\uff0c\u901a\u8fc7\u8fd9\u4e2a\u5165\u53e3\uff0c\u8fde\u540c\u6574\u4e2a\u6d4b\u8bd5\u6d41\u7a0b\uff0c\u955c\u50cf\u88c5\u673a\uff0c\u73af\u5883\u90e8\u7f72\uff0c\u6d4b\u8bd5\u5e94\u7528\u53ca\u751f\u6210\u62a5\u544a\u3002 \u53c2\u6570\u4ecb\u7ecd\uff1a \u6d4b\u8bd5\u673a\uff1a\u6240\u6709\u89c4\u6574\u5230\u56fa\u5b9a\u533a\u57df\u7684\u6d4b\u8bd5\u673a\uff0c\u901a\u8fc7\u6d4b\u8bd5\u540c\u5b66\u5bf9\u6d4b\u8bd5\u673a\u7684\u4e60\u60ef\u547d\u540d\uff0c\u5728\u540e\u53f0\u6620\u5c04\u6d4b\u8bd5\u673a\u7684\u8be6\u7ec6\u4fe1\u606f\uff0c\u62ec\u53f7\u4e2d\u4e3a\u6d4b\u8bd5\u673a IP \u7684\u6700\u540e\u4e00\u4f4d\uff1b \u6d4b\u8bd5\u5e94\u7528\uff1a\u6307\u5b9a\u7684\u6d4b\u8bd5\u5e94\u7528\u7684\u5305\u540d\uff0c\u7cfb\u7edf\u6839\u636e\u540d\u79f0\u81ea\u52a8\u62c9\u53d6\u5bf9\u5e94\u7684\u4ed3\u5e93\u4ee3\u7801\uff1b deb\u5305\u4e0b\u8f7d\u5730\u5740\uff1a\u6d4b\u8bd5\u4e0a\u8ff0\u5e94\u7528\u65f6\uff0c\u9700\u8981\u5b89\u88c5\u7684deb\u5305\u4e0b\u8f7d\u5730\u5740\uff0c\u591a\u4e2a\u5730\u5740\u7528\u201c,\u201d\u9694\u5f00\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff1b \u8303\u56f4\u6807\u7b7e\uff1a\u6267\u884c\u6d4b\u8bd5\u7528\u4f8b\u7684\u6807\u7b7e\u8303\u56f4\uff0c\u5bf9\u5e94\u7528\u4f8b\u4ee3\u7801 csv \u6587\u4ef6\u4e2d\u7684\u6807\u7b7e\u4fe1\u606f\uff0c\u4ee5 pytest \u7684mark\u8bed\u6cd5\u7f16\u5199\uff1b \u7cfb\u7edf\u8bed\u8a00\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u8bed\u8a00\u73af\u5883\uff1b \u5206\u8fa8\u7387\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u5206\u8fa8\u7387\u73af\u5883\uff1b \u955c\u50cf\u5730\u5740\uff1a\u955c\u50cf\u4ed3\u5e93\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u901a\u8fc7 PXE \u88c5\u673a\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u88c5\u673a\u73af\u8282\uff08\u76ee\u524d\u4ec5\u652f\u6301\u90e8\u5206 AMD \u67b6\u6784\u7684\u88c5\u673a\uff09\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2pxe","title":"2\u3001PXE \u88c5\u673a","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/IOS_install/ \u8f93\u5165\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\uff0cIP\uff0c\u5bc6\u7801\uff0c\u955c\u50cf\u5730\u5740\u540e\uff0c\u81ea\u52a8\u88c5\u673a\uff0c\u76ee\u524d\u4ec5\u652f\u6301\u56fa\u5b9a 15 \u7f51\u6bb5\u7684\u90e8\u5206 AMD \u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#3","title":"3\u3001\u6b21\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/all_client_test/ \u8be5\u5165\u53e3\u4e0e\u4e3b\u5165\u53e3\u529f\u80fd\u57fa\u672c\u4e00\u81f4\uff0c\u53ea\u662f\u5265\u79bb\u4e86PXE\u88c5\u673a\u6d41\u7a0b\uff0c\u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7684\u6267\u884c\u6d41\u7a0b\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#4","title":"4\u3001\u73af\u5883\u90e8\u7f72","text":"Jenkins url\uff1ahttps://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/env/build?delay=0sec \u8bbe\u7f6e\u6d4b\u8bd5\u673a\u7684\u7cfb\u7edf\u8bed\u8a00\uff0c\u5206\u8fa8\u7387\u53ca\u5b89\u88c5\u6d4b\u8bd5\u6240\u9700\u7684\u4f9d\u8d56\u5305\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#5","title":"5\u3001\u53d1\u9001\u4ee3\u7801","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/send_code/ \u6839\u636e\u6d4b\u8bd5\u5e94\u7528\u540d\u79f0\uff0c\u62c9\u53d6\u5bf9\u5e94\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u5e76\u6839\u636e\u6d4b\u8bd5\u673a\u4e0a\u5e94\u7528\u7248\u672c\u5207\u6362\u5230\u5bf9\u5e94\u7684tag\u7248\u672c\uff0c\u82e5\u672a\u627e\u5230tag\u7248\u672c\uff0c\u5219\u4f7f\u7528\u6700\u65b0\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u518d\u6839\u636e\u5e94\u7528\u5e93\u4ee3\u7801\u4e2d\u914d\u7f6e\u7684\u57fa\u7840\u5e93\u7248\u672c\uff0c\u62c9\u53d6\u57fa\u7840\u5e93\u4ee3\u7801\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#6","title":"6\u3001\u7528\u4f8b\u6267\u884c","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/run_test/ \u8fd0\u884c\u6d4b\u8bd5\u673a\u4e0a\u7684\u7528\u4f8b"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/","title":"AT \u7528\u4f8b\u7b5b\u9009\u6307\u5317","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u7528\u4f8b\u7b5b\u9009\u6807\u51c6\uff0c\u662f\u6311\u9009\u5408\u9002\u7684\u6587\u672c\u7528\u4f8b\u8fdb\u884c\u81ea\u52a8\u5316\u7528\u4f8b\u8f6c\u5316\u7684\u4e00\u4e9b\u901a\u7528\u6807\u51c6\u3002 \u8fc7\u53bb\u6211\u4eec\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u5b9e\u8df5\u8fc7\u7a0b\u4e2d\uff0c\u5199\u4e86\u4e0d\u5c11\u81ea\u52a8\u5316\u7528\u4f8b\uff0c\u968f\u7740\u9700\u6c42\u7684\u8fed\u4ee3\uff0c\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u81ea\u7136\u8150\u5316\uff0c\u56e0\u800c\u9700\u8981\u5728\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\u5bf9\u81ea\u52a8\u5316\u7528\u4f8b\u8fdb\u884c\u7ef4\u62a4\uff0c\u5728\u7ef4\u62a4\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u6211\u4eec\u53d1\u73b0\uff0c\u6709\u4e9b\u7528\u4f8b\u7ef4\u62a4\u8d77\u6765\u592a\u96be\u4e86\uff0c\u8c03\u8bd5\u7528\u4f8b\u8017\u8d39\u5927\u91cf\u65f6\u95f4\uff0c\u6210\u672c\u5f88\u9ad8\u3002 \u56e0\u6b64\uff0c\u6211\u4eec\u603b\u7ed3\u4e00\u4e9b\u81ea\u52a8\u5316\u7528\u4f8b\u9009\u578b\u7684\u6807\u51c6\uff0c\u4ee5\u4f18\u5316\u540e\u7eed\u81ea\u52a8\u5316\u7528\u4f8b\u7ed3\u6784\uff0c\u671f\u5f85\u6211\u4eec\u80fd\u7f16\u5199\u51fa\u9ad8\u6548\u3001\u7a33\u5b9a\u3001\u6613\u4e8e\u7ef4\u62a4\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_1","title":"\u4e00\u3001\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u53ef\u4ee5\u5206\u4e3a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u548c\u4e13\u9879\u81ea\u52a8\u5316\u6d4b\u8bd5\uff0c\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e00\u822c\u53ea\u9488\u5bf9\u4e00\u4e9b\u5e38\u89c4\u7684\u529f\u80fd\u6d4b\u8bd5\uff0c\u5176\u4ed6\u975e\u5e38\u89c4\u529f\u80fd\u7684\u7528\u4f8b\uff0c\u5e94\u8be5\u91c7\u7528\u4e13\u9879\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u6848\uff1b \u4ee5\u4e0b\u662f\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1","title":"1. \u7a33\u5b9a\u6027\u3001\u538b\u6d4b\u7528\u4f8b","text":"\u7a33\u5b9a\u6027\u6d4b\u8bd5\u3001\u538b\u6d4b\u7528\u4f8b\u5e94\u8be5\u662f\u5c5e\u4e8e\u6027\u80fd\u76f8\u5173\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u5982\uff1a\u53cd\u590d\u591a\u6b21\u70b9\u51fb\u6309\u94ae\uff0c\u68c0\u9a8c\u5176\u529f\u80fd\u7a33\u5b9a\u6027\u3002\u56e0\u4e3a\u8fd9\u4e9b\u7528\u4f8b\u65ad\u8a00\u7684\u9884\u671f\u53ef\u80fd\u4e0d\u662f\u5f88\u660e\u786e\uff0c\u66f4\u6709\u751a\u8005\u4e0d\u9700\u8981\u65ad\u8a00\uff0c\u7528\u4f8b\u65f6\u957f\u6bd4\u8f83\u957f\uff0c\u800c\u4e14\u4e0d\u53ef\u63a7\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u76ee\u524d\u6211\u4eec\u6709\u6027\u80fd\u81ea\u52a8\u5316\u7684\u4e13\u9879\u65b9\u6848\uff0c\u4ee5\u53ca\u4e00\u4e9b\u7a33\u5b9a\u6027\u6d4b\u8bd5\u7684\u4e13\u9879\u65b9\u6848\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u6b64\u7c7b\u7528\u4f8b\u653e\u5230\u4e13\u9879\u81ea\u52a8\u5316\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2","title":"2. \u6d89\u53ca\u591a\u4e2a\u7528\u6237\u64cd\u4f5c","text":"\u5e38\u89c1\u4e0e\u6587\u7ba1\u7684\u7528\u4f8b\u4e2d\uff0c\u591a\u7528\u6237\u64cd\u4f5c\u7684\u7528\u4f8b\u4e00\u822c\u90fd\u4f1a\u6d89\u53ca\u5230\u5728\u7cfb\u7edf\u4e2d\u8fdb\u884c\u591a\u4e2a\u7528\u6237\u95f4\u7684\u5207\u6362\uff0c\u81ea\u52a8\u5316\u811a\u672c\u4e00\u822c\u662f\u8fd0\u884c\u5728\u4e00\u4e2a\u7528\u6237\u7a7a\u95f4\u4e0b\u7684\uff0c\u6240\u4ee5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u591a\u7528\u6237\u95f4\u7684\u5207\u6362\u3002 \u6b64\u7c7b\u4e0d\u5efa\u8bae\u91c7\u7528\u81ea\u52a8\u5316\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3","title":"3. \u4e0e\u5f00\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4ea4\u4e92","text":"\u6b64\u7c7b\u573a\u666f\u591a\u4e3a\u5e94\u7528\u7684\u5f02\u5e38\u573a\u666f\u6d4b\u8bd5\uff0c\u6bd4\u5982\uff1a\u590d\u5236\u5927\u6587\u4ef6\u8fc7\u7a0b\u4e2d\u6ce8\u9500\u673a\u5668\u3002 \u81ea\u52a8\u5316\u811a\u672c\u5728\u7cfb\u7edf\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4e4b\u540e\u662f\u4f1a\u505c\u6b62\u8fd0\u884c\u7684\uff1b\u6b64\u7c7b\u7528\u4f8b\u53ef\u4ee5\u505a\u81ea\u52a8\u5316\uff0c\u4f46\u662f\u540c\u6837\u9700\u8981\u505a\u4e13\u9879\u65b9\u6848\uff0c\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u7684\u5904\u7406\u903b\u8f91\u5b8c\u5168\u4e0d\u540c\u3002 \u540e\u7eed\u81ea\u52a8\u5316\u9700\u8981\u516c\u5173\u7684\u70b9\uff1a \u81ea\u52a8\u5316\u811a\u672c\u5728\u672c\u673a\u8fd0\u884c\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u81f3\u5c11\u9700\u8981\u63d0\u4f9b\u4ee5\u4e0b\u529f\u80fd\uff1a \u91cd\u542f\u4e4b\u540e\u7528\u4f8b\u80fd\u81ea\u52a8\u8fd0\u884c\uff1b\u53ef\u4ee5\u8003\u8651\u5c06\u6267\u884c\u7528\u4f8b\u5199\u6210\u4e00\u4e2a\u5f00\u673a\u81ea\u542f\u7684\u670d\u52a1\uff1b \u80fd\u8bb0\u5f55\u5173\u673a\u4e4b\u524d\u7528\u4f8b\u6267\u884c\u7684\u4f4d\u7f6e\uff0c\u91cd\u542f\u4e4b\u540e\u80fd\u4ece\u6b64\u4f4d\u7f6e\u5f00\u59cb\u6267\u884c\uff1b \u50cf\u6027\u80fd\u81ea\u52a8\u5316\u4e00\u6837\uff0c\u7531\u670d\u52a1\u7aef\u63a7\u5236\uff1b \u5b8c\u5168\u57fa\u4e8e\u56fe\u5f62\u8bc6\u522b\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u4e32\u53e3\u7ebf\u63a7\u5236\u952e\u9f20\u7a33\u5b9a\u6027\uff1b "},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4","title":"4. \u6d4b\u8bd5\u6267\u884c\u65f6\u95f4\u957f","text":"\u7528\u4f8b\u6267\u884c\u65f6\u95f4\u63a7\u5236\u57282\u5206\u949f\u4ee5\u5185\uff0c\u6781\u7aef\u60c5\u51b5\u4e0d\u8981\u8d85\u8fc75\u5206\u949f\uff0c\u6240\u6709\u7528\u4f8b\u7684\u5e73\u5747\u65f6\u957f\u5e94\u8be5\u57281\u5206\u949f\u5de6\u53f3\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u95f4\u592a\u957f\uff0c\u7f16\u5199\u7528\u4f8b\u3001\u8c03\u8bd5\u7528\u4f8b\u3001\u6267\u884c\u7528\u4f8b\u3001\u7ef4\u62a4\u7528\u4f8b\u90fd\u975e\u5e38\u7684\u8017\u65f6\uff0c\u4eba\u529b\u6210\u672c\u65f6\u95f4\u6210\u672c\u6295\u5165\u592a\u9ad8\u3002 \u4f60\u60f3\uff0c\u8fd9\u6761\u7528\u4f8b\u6267\u884c\u9700\u89815\u5206\u949f\uff0c\u90a3\u4f60\u5199\u8fd9\u6761\u7528\u4f8b\u7684\u65f6\u95f4\u4e0d\u53ef\u80fd\u4e00\u904d\u8fc7\uff0c\u5199\u7684\u8fc7\u7a0b\u4e2d\u8dd1\u4e0d\u901a\u8fd8\u5f97\u91cd\u8dd1\u81f3\u5c1115\u5206\u949f\u4e0d\u8fc7\u5206\uff0c\u5199\u5b8c\u4e86\u8fd8\u5f97\u5728\u5176\u4ed6\u67b6\u6784\u4e0a\u8c03\u8bd5\uff0c\u534a\u4e2a\u5c0f\u65f6\u8fc7\u53bb\u4e86\uff0c\u8fd9\u8fd8\u53ea\u662f\u7b2c\u4e00\u6b21\u5199\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u540e\u7eed\u5982\u679c\u7528\u4f8b\u7ef4\u62a4\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u7ecf\u5e38\u6295\u5165\u76f8\u5f53\u957f\u65f6\u95f4\uff0c\u8fd9\u6837\u5176\u5b9e\u662f\u5931\u53bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u7684\u3002\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u5c31\u5e94\u8be5\u662f\u5feb\u51c6\u72e0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5","title":"5. \u8fb9\u7f18\u6027\u6d4b\u8bd5","text":"\u6709\u4e9b\u529f\u80fd\u6a21\u5757\u672c\u8eab\u662f\u5c5e\u4e8e\u6bd4\u8f83\u8fb9\u7f18\u6027\u7684\uff0c\u5373\u6781\u5c11\u7528\u6237\u4f1a\u4f7f\u7528\u5230\u7684\u529f\u80fd\uff0c\u8fd9\u7c7b\u529f\u80fd\u6a21\u5757\u4e0d\u9700\u8981\u5927\u89c4\u6a21\u5b9e\u73b0\u81ea\u52a8\u5316\uff0c\u4e00\u4e24\u4e2a\u573a\u666f\u8986\u76d6\u57fa\u672c\u529f\u80fd\u5c31\u884c\u4e86\uff0c\u56e0\u6b64\u6211\u4eec\u5728\u6311\u9009\u6b64\u7c7b\u7528\u4f8b\u7684\u65f6\u5019\u53ef\u4ee5\u7ed3\u5408\u6574\u4e2a\u529f\u80fd\u6a21\u5757\u7684\u8986\u76d6\u60c5\u51b5\u6765\u51b3\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6","title":"6. \u9700\u8981\u4f9d\u8d56\u4eba\u5de5\u4ecb\u5165\u7684","text":"\u81ea\u52a8\u5316\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\u662f\u6ca1\u6709\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bd4\u5982\u8981\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u90a3\u4e48\u5c31\u80cc\u79bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u3002 \u6bd4\u5982\u5149\u9a71\u6a21\u5757\uff0c\u5149\u9a71\u523b\u5f55\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u4f46\u662f\u5149\u9a71\u523b\u5f55\u4e4b\u540e\u5149\u76d8\u4f1a\u5f39\u51fa\u6765\uff0c\u9700\u8981\u4eba\u5de5\u66f4\u6362\u5149\u76d8\uff0c\u518d\u624b\u52a8\u63a8\u8fdb\u5149\u9a71\u4e2d\u3002 \u8fd9\u79cd\u529f\u80fd\u6a21\u5757\u5373\u4f7f\u505a\u81ea\u52a8\u5316\uff0c\u80fd\u6d89\u53ca\u5230\u7684\u529f\u80fd\u975e\u5e38\u6709\u9650\uff0c\u800c\u4e14\u4e0d\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u6240\u4ee5\u660e\u663e\u5c31\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7","title":"7. \u96be\u4ee5\u5b9e\u73b0\u7684","text":"\u7528\u4f8b\u6240\u6d89\u53ca\u5230\u7684\u65b9\u6cd5\u5b9e\u73b0\u8d77\u6765\u53ef\u80fd\u6709\u96be\u5ea6\uff0c\u751a\u81f3\u73b0\u9636\u6bb5\u65e0\u6cd5\u5b9e\u73b0\u7684\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002 \u6bd4\u5982\u5f71\u9662\u6d4b\u8bd5\u753b\u9762\u6e05\u6670\u5ea6\u3001\u6d41\u7545\u5ea6\u3001\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u4e4b\u540e\u7684\u89c6\u9891\u662f\u5426\u5b58\u5728\u5361\u987f\u7b49\u7528\u4f8b\uff0c\u73b0\u9636\u6bb5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#8","title":"8. \u529f\u80fd\u4e0d\u7a33\u5b9a","text":"\u8fd9\u4e2a\u4e0d\u662f\u8bf4\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\uff0c\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\u4e0d\u7a33\u5b9a\u662f\u6b63\u5e38\u7684\uff0c\u8fd9\u79cd\u6211\u4eec\u53ef\u4ee5\u7b49\u5f00\u53d1\u63d0\u6d4b\u4e4b\u540e\u518d\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u3002 \u529f\u80fd\u4e0d\u7a33\u5b9a\u6307\u7684\u662f\u7528\u4f8b\u6240\u6d89\u53ca\u7684\u529f\u80fd\uff0c\u53ef\u80fd\u5b58\u5728\u591a\u79cd\u53d8\u5316\uff0c\u6bcf\u6b21\u6267\u884c\u7528\u4f8b\u53ef\u80fd\u65ad\u8a00\u7684\u9884\u671f\u90fd\u4e0d\u540c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#9","title":"9. \u52a8\u6001\u65ad\u8a00","text":"\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u76f4\u5230\u7528\u4f8b\u7ed3\u675f\uff0c\u4e00\u76f4\u662f\u4e00\u4e2a\u52a8\u6001\u53d8\u5316\u7684\u8fc7\u7a0b\uff0c\u800c\u4e14\u65e0\u6cd5\u901a\u8fc7\u5176\u4ed6\u624b\u6bb5\u505c\u4e0b\u6765\uff1b \u6bd4\u5982\uff1a\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u65f6\uff0c\u53f3\u4e0b\u89d2\u7684\u5f55\u5236\u65f6\u95f4\u662f\u4e00\u76f4\u5728\u53d8\u5316\u7684\uff0c\u7528\u4f8b\u9700\u8981\u6d4b\u8bd5\u5f55\u52361\u5206\u949f\u4e4b\u540e\uff0c\u5f55\u5236\u65f6\u95f4\u662f\u521a\u597d\u505c\u572860\u79d2\uff1b \u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fd8\u505a\u4e0d\u5230\u65f6\u95f4\u7cbe\u51c6\u63a7\u5236\uff0c\u7a0b\u5e8f\u6267\u884c\u65f6\u95f4\u662f\u6709\u6ce2\u52a8\u7684\uff0c\u800c\u4e14\u8981\u9002\u914d\u591a\u4e2a\u5e73\u53f0\uff0c\u6240\u4ee5\u6b64\u7c7b\u7528\u4f8b\u5927\u6982\u7387\u4f1a\u6267\u884c\u5931\u8d25\u3002\u7279\u522b\u662f\u5728\u6027\u80fd\u8f83\u5dee\u7684\u56fd\u4ea7\u5316\u67b6\u6784\u4e0a\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u592a\u53ef\u80fd\u7a33\u5b9a\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#10","title":"10. \u63a2\u7d22\u6027\u6d4b\u8bd5","text":"\u63a2\u7d22\u6027\u6d4b\u8bd5\u901a\u5e38\u662f\u4e00\u4e9b\u4e0d\u786e\u5b9a\u7684\u64cd\u4f5c\uff0c\u591a\u53d8\u5207\u590d\u6742\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u9884\u671f\u4e5f\u53ef\u80fd\u662f\u4e0d\u786e\u5b9a\u7684\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u9a9a\u64cd\u4f5c\u592a\u591a\u4e86\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6b64\u7c7b\u7528\u4f8b\u9002\u5408\u91c7\u7528\u624b\u5de5\u6d4b\u8bd5\uff0c\u662f\u624b\u5de5\u6d4b\u8bd5\u771f\u6b63\u7684\u4ef7\u503c\u4f53\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#11","title":"11. \u6613\u7528\u6027\u6d4b\u8bd5","text":"\u5bf9\u4e8e\u6613\u7528\u6027\u7684\u5224\u65ad\u901a\u5e38\u662f\u4e3b\u89c2\u7684\uff0c\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\u5f88\u96be\u53bb\u5b9a\u4e49\u4ec0\u4e48\u6837\u7684\u60c5\u51b5\u5bf9\u7528\u6237\u662f\u6613\u7528\u7684\uff0c\u81ea\u52a8\u5316\u9700\u8981\u6709\u660e\u786e\u7684\u53ef\u5b9e\u73b0\u7684\u9884\u671f\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_2","title":"\u4e8c\u3001\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u524d\u9762\u8bb2\u4e86\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u4e00\u4e9b\u7528\u4f8b\u60c5\u51b5\uff0c\u6709\u540c\u5b66\u5c31\u8bf4\u4e86\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\u4e0d\u7528\u8bb2\u4e86\uff0c\u5c31\u662f\u4e0d\u9002\u5408\u7684\u53cd\u9762\u3002\u6ca1\u6bdb\u75c5\u54c8\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\uff0c\u6211\u4eec\u5927\u4f53\u8fd8\u53ef\u4ee5\u5206\u4e3a\u4e24\u7c7b\uff1a \u7b2c\u4e00\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u597d\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u7b2c\u4e8c\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u4e00\u822c\uff0c\u9700\u8981\u6295\u5165\u66f4\u591a\u7cbe\u529b\u624d\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u4ee5\u4e0b\u4ecb\u7ecd\u4e00\u4e9b\u6211\u4eec\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1_1","title":"1. \u64cd\u4f5c\u76f8\u5bf9\u7b80\u5355","text":"\u7528\u4f8b\u6b65\u9aa4\u76f8\u5bf9\u8f83\u5c11\uff0c\u8fd9\u79cd\u7528\u4f8b\u901a\u5e38\u662f\u4e00\u4e9b\u8def\u5f84\u5f88\u6d45\u7684\u7528\u4f8b\uff0c\u4e00\u822c\u4e5f\u662f\u4e00\u4e9b\u57fa\u7840\u7528\u4f8b\u3002\u7528\u4f8b\u7f16\u5199\u3001\u7ef4\u62a4\u90fd\u53ef\u4ee5\u8f7b\u677e\u641e\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2_1","title":"2. \u5bb9\u6613\u5b9e\u73b0","text":"\u73b0\u6709\u6280\u672f\u662f\u53ef\u5b9e\u73b0\u7684\uff0c\u6ca1\u6709\u96be\u5ea6\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3_1","title":"3. \u7ecf\u5e38\u7528\u4e8e\u56de\u5f52\u6d4b\u8bd5","text":"\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bcf\u6b21\u56de\u5f52\u6d4b\u8bd5\u5fc5\u987b\u8981\u6267\u884c\u7684\u7528\u4f8b\uff0c\u90a3\u4e48\u8fd9\u6761\u7528\u4f8b\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u3002 \u56de\u5f52\u6d4b\u8bd5\u65f6\u6211\u4eec\u9996\u5148\u5e94\u8be5\u4fdd\u8bc1\u5e94\u7528\u5386\u53f2\u57fa\u672c\u529f\u80fd\u6b63\u5e38\uff0c\u6240\u4ee5\u90a3\u4e9b\u6bcf\u6b21\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u90fd\u8981\u6267\u884c\u7684\u7528\u4f8b\u9002\u5408\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4_1","title":"4. \u529f\u80fd\u7a33\u5b9a\u7684\u6838\u5fc3\u529f\u80fd","text":"\u6d89\u53ca\u6838\u5fc3\u529f\u80fd\u7684\u7528\u4f8b\u662f\u6700\u6700\u91cd\u8981\u7684\u7528\u4f8b\uff0c\u4e5f\u662f\u6211\u4eec\u4ea4\u4ed8\u65f6\u5fc5\u987b\u8981\u4fdd\u8bc1\u8d28\u91cf\u7684\u76f8\u5173\u529f\u80fd\uff0c\u56e0\u6b64\u5e94\u8be5\u5c3d\u53ef\u80fd\u7684\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5_1","title":"5. \u8f93\u5165\u6570\u636e\u6d4b\u8bd5","text":"\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u901a\u5e38\u662f\u68c0\u9a8c\u88ab\u6d4b\u5e94\u7528\u63a5\u53d7\u6709\u6548\u6570\u636e\u3001\u62d2\u7edd\u65e0\u6548\u6570\u636e\u7684\u80fd\u529b\u3002\u5982\uff1a\u63d0\u4ea4\u8d85\u957f\u5b57\u7b26\u4e32\u3001\u7279\u6b8a\u5b57\u7b26\u4e32\u7b49\u7b49\u3002 \u6b64\u7c7b\u7528\u4f8b\u624b\u5de5\u6d4b\u8bd5\u5f88\u96be\u6bd4\u8f83\u5168\u9762\u7684\u8986\u76d6\u5230\u6240\u6709\u7684\u8f93\u5165\u60c5\u51b5\uff0c\u4f46\u662f\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\uff0c\u6b64\u7c7b\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u90fd\u662f\u4e00\u6837\u7684\uff0c\u53d8\u5316\u7684\u4ec5\u662f\u8f93\u5165\u53c2\u6570\u548c\u65ad\u8a00\u7ed3\u679c\uff0c\u91c7\u7528\u6570\u636e\u9a71\u52a8\uff0c\u53ef\u4ee5\u8f7b\u677e\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6_1","title":"6. \u683c\u5f0f\u8986\u76d6","text":"\u539f\u56e0\u540c\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u7c7b\u7528\u4f8b\u4e00\u6837\uff0c\u591a\u79cd\u683c\u5f0f\u7684\u8986\u76d6\u4e5f\u662f\u4e00\u4e2a\u5f88\u7e41\u7410\u7684\u4e8b\u60c5\uff0c\u4ea4\u7ed9\u81ea\u52a8\u5316\u6765\u505a\u518d\u5408\u9002\u4e0d\u8fc7\u4e86\u3002 \u6bd4\u5982\u5f71\u9662\u5bf9\u5f71\u7247\u683c\u5f0f\u7684\u68c0\u67e5\u3001\u622a\u56fe\u5f55\u5c4f\u5bf9\u4fdd\u5b58\u683c\u5f0f\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7_1","title":"7. \u68c0\u67e5\u5143\u7d20\u72b6\u6001","text":"\u67e5\u770b\u88ab\u6d4b\u5e94\u7528\u7684\u5143\u7d20\u5c5e\u6027\u3002\u5982\uff1a\u56fe\u7247\u7684\u5927\u5c0f\u548c\u6392\u5217\uff1b\u6309\u94ae\u7684\u53ef\u7528\u548c\u4e0d\u53ef\u7528\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/","title":"AT \u7ecf\u9a8c\u603b\u7ed3","text":"\u6b22\u8fce\u6240\u6709\u4eba\u63d0\u4ea4\u4f60\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u9762\u7684\u4f18\u79c0\u5b9e\u8df5\u7ecf\u9a8c\uff0c\u4ee5\u5e2e\u52a9\u5927\u5bb6\u89e3\u51b3\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#1","title":"1\u3001\u7ec8\u7ed3\u5668","text":"# litaoa@uniontech.com\n \u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4 pytest \u5b9e\u73b0\u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4\u7684\u65b9\u5f0f\u6709\u4e24\u79cd\uff0cyield \u548c\u7ec8\u7ed3\u51fd\u6570\uff1b yield \u5b9e\u73b0\uff0cyield\u524d\u9762\u4e3a\u7528\u4f8b\u7684\u524d\u7f6e\u6b65\u9aa4\uff0cyield \u540e\u9762\u4e3a\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4\u3002 @pytest.fixture\ndef clean_env():\nprint(\"setup\")\nyield\nprint(\"teardown\")\n \u7ec8\u7ed3\u51fd\u6570\u5b9e\u73b0\uff0c\u4f7f\u7528 request.addfinalizer \u6ce8\u518c\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4 @pytest.fixture\ndef clean_env(request):\ndef clean():\nprint(\"teardown\")\nrequest.addfinalizer(clean)\nprint(\"setup\")\n yield\u7684\u4f18\u7f3a\u70b9\uff1a \u4f18\u70b9\uff1a\u4ee3\u7801\u7b80\u6d01\uff0c\u76f4\u89c2\uff0c\u53ef\u4f7f\u7528yield\u5728\u7528\u4f8b\u4e2d\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c \u7f3a\u70b9\uff1a\u82e5\u524d\u7f6e\u6b65\u9aa4\u4e2d\u51fa\u73b0\u9519\u8bef\uff0c\u5219\u540e\u7f6e\u6b65\u9aa4\u4e0d\u4f1a\u6267\u884c \u7ec8\u7ed3\u51fd\u6570\uff1a \u4f18\u70b9\uff1a\u524d\u7f6e\u6b65\u9aa4\u5931\u8d25\u7684\u8bdd\uff0c\u540e\u7f6e\u6b65\u9aa4\u4ecd\u4f1a\u6267\u884c\u4e14\u53ef\u4ee5\u6ce8\u518c\u591a\u4e2a\u540e\u7f6e\u6b65\u9aa4\uff08\u524d\u63d0\uff1a\u9700\u8981\u5728\u4ee3\u7801\u62a5\u9519\u4e4b\u524d\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff09\uff0c\u652f\u6301\u7075\u6d3b\u4f7f\u7528\u540e\u7f6e\u6761\u4ef6 \u7f3a\u70b9\uff1a\u4ee3\u7801\u8f83\u4e3a\u590d\u6742\uff0c\u65e0\u6cd5\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c\uff08\u672c\u4eba\u76ee\u524d\u672a\u5b9e\u73b0\uff09 \u603b\u7ed3\uff1a\u5728\u524d\u7f6e\u6b65\u9aa4\u4fdd\u8bc1\u7edd\u5bf9\u4e0d\u4f1a\u51fa\u9519\u65f6\uff0c\u4f7f\u7528yield\u66f4\u4f73\u7b80\u4fbf\uff0c\u5f53\u524d\u7f6e\u6b65\u9aa4\u6613\u51fa\u73b0\u95ee\u9898\u65f6\uff0c\u63a8\u8350\u4f7f\u7528\u7ec8\u7ed3\u51fd\u6570\u3002 \u573a\u666f\uff1a\u4fdd\u9669\u7bb1\u7528\u4f8b\uff0c\u524d\u7f6e\u6b65\u9aa4\u4e2d\u5f00\u542f\u4fdd\u9669\u7bb1\uff0c\u540e\u7f6e\u6b65\u9aa4\u5220\u9664\u4fdd\u9669\u7bb1\u3002 @pytest.fixture(scope=\"session\", autouse=True)\ndef vault_fixture(request):\nDfmWidget.reset_vault_by_cmd() # 1\u3001\u91cd\u7f6e\u4fdd\u9669\u7bb1\nDdeDockPublicWidget().close_file_manager_by_cmd() # 2\u3001\u5173\u95ed\u6587\u7ba1\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 3\u3001\u5f00\u542f\u6587\u7ba1\nvault = DfmWidget()\nvault.create_file_vault() # 4\u3001\u521b\u5efa\u4fdd\u9669\u7bb1\ndef delete_vault(): # 8\u3001\u5220\u9664\u4fdd\u9669\u7bb1\u7684\u540e\u7f6e\u6b65\u9aa4\nsleep(2)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr()\nvault = DfmWidget()\nvault.delete_file_vault()\nDfmWidget.reset_vault_by_cmd()\nDdeDockPublicWidget().close_file_manager_by_cmd()\nrequest.addfinalizer(delete_vault) # 5\u3001\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\nDdeDockPublicWidget().close_file_manager_by_cmd() # 6\u3001\u5173\u95ed\u6587\u7ba1\nsleep(1)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 7\u3001\u5f00\u542f\u6587\u7ba1\n \u4ee3\u7801\u6309\u6ce8\u91ca\u4e2d\u7684\u5e8f\u53f7\u6267\u884c\u6b65\u9aa4 \u4ee3\u7801\u5728\u6b65\u9aa41-4\u4efb\u610f\u4f4d\u7f6e\u62a5\u9519\uff0c\u5219\u4e0d\u4f1a\u6267\u884c\u6b65\u9aa48\uff0c\u56e0\u4e3a\u672a\u6267\u884c\u5230\u6b65\u9aa45\uff0c\u6b65\u9aa48\u8fd8\u672a\u6ce8\u518c \u4ee3\u7801\u5728\u6b65\u9aa46-7\u62a5\u9519\uff0c\u4ecd\u4f1a\u6267\u884c\u6b65\u9aa47\uff0c\u56e0\u4e3a\u5728\u6b65\u9aa45\u4e2d\u5df2\u7ecf\u5c06\u6b65\u9aa47\u6ce8\u518c \u53ef\u4ee5\u7075\u6d3b\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff0c\u80fd\u5b9e\u73b0\u67d0\u4e2a\u524d\u7f6e\u6b65\u9aa4\u6267\u884c\u4e4b\u540e\uff0c\u624d\u4f1a\u6267\u884c\u540e\u7f6e\u6b65\u9aa4\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#2","title":"2\u3001\u542f\u52a8\u5e94\u7528\u7684\u65b9\u5f0f","text":"# huangmingqiang@uniontech.com\n \uff081\uff09\u547d\u4ee4\u884c\u542f\u52a8 \u5728 AT \u4ee3\u7801\u4e2d\u4f7f\u7528\u547d\u4ee4\u884c\u542f\u52a8\u5e94\u7528\uff0c\u4e3e\u4f8b\uff1a os.popen(\"deepin-music\")\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f7f\u7528 ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6\uff0cdogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u3002 \uff082\uff09\u901a\u8fc7 UI \u64cd\u4f5c\u542f\u52a8 \u901a\u8fc7\u4efb\u52a1\u680f\u3001\u542f\u52a8\u5668\u3001\u684c\u9762\u7b49UI\u65b9\u5f0f\u542f\u52a8\uff0c\u6bd4\u5982\u53cc\u51fb\u6253\u5f00\u3001\u53f3\u952e\u6253\u5f00\u7b49\uff0c\u8fd9\u79cd\u64cd\u4f5c\u65b9\u5f0f\u4e0d\u5b58\u5728ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6dogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u7684\u95ee\u9898\uff0c\u4e5f\u66f4\u52a0\u7b26\u5408\u7528\u6237\u7684\u64cd\u4f5c\u884c\u4e3a\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#3","title":"3\u3001\u6587\u4ef6\u9009\u62e9\u6846\u5c5e\u6027\u5b9a\u4f4d\u5076\u73b0\u65e0\u6cd5\u627e\u5230","text":"\u6587\u4ef6\u9009\u62e9\u6846\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5728\u8c03\u7528\u6587\u4ef6\u9009\u62e9\u6846\u65f6\uff0c\u6709\u4e00\u5b9a\u7684\u6982\u7387\u51fa\u73b0\uff0c\u754c\u9762\u5df2\u7ecf\u6e32\u67d3\u51fa\u6765\u4e86\uff0c\u4f46\u662f\u5c5e\u6027\u6811\u5e76\u6ca1\u6709\u5199\u5165\uff0c\u5bfc\u81f4\u901a\u8fc7\u5c5e\u6027\u65e0\u6cd5\u627e\u5230\u5143\u7d20\uff0c\u76ee\u524d\u4e5f\u6ca1\u6709\u5f88\u597d\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u4e3a\u4e86\u7528\u4f8b\u7a33\u5b9a\u6027\uff0c\u6587\u4ef6\u9009\u62e9\u6846\u7684\u64cd\u4f5c\u5efa\u8bae\u4f7f\u7528UI\u6216\u8005\u56fe\u7247\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u53ef\u4ee5\u901a\u8fc7\u641c\u7d22\u5185\u5bb9\u56fa\u5b9a\u6587\u4ef6\u4f4d\u7f6e\u3002 # litaoa@uniontech.com\n desk = DdeDesktopPublicWidget()\n# \u9009\u62e9\u89c6\u9891\u76ee\u5f55\ndesk.click_videos_dir_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.ctrl_f()\nsleep(1)\ndesk.input_message(\"\u5143\u7d20\u540d\u79f0\")\nsleep(0.5)\ndesk.enter()\nsleep(1)\n# \u9009\u62e9\u7b2c\u4e00\u4e2a\u6587\u4ef6\ndesk.click_list_view_btn_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.click_first_file_in_desktop_plugs_by_ui()\nsleep(1)\n# \u6587\u7ba1\u63d2\u4ef6\u4e2d\u70b9\u51fb\u6253\u5f00\ndesk.click_open_btn_in_desktop_plugs_by_ui()\n"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#4","title":"4\u3001\u5e94\u7528\u542f\u52a8","text":"# mikigo\n \u5728UI\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u4e00\u5207\u64cd\u4f5c\u7684\u90fd\u662f\u4ece\u5e94\u7528\u542f\u52a8\u5f00\u59cb\u7684\uff0c\u800c\u5728Linux\u684c\u9762\u5e94\u7528\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u6211\u4eec\u542f\u52a8\u5e94\u7528\u7684\u65b9\u6cd5\u6709\u591a\u79cd\uff0c\u4e0b\u9762\u505a\u4e00\u4e2a\u7b80\u5355\u7684\u4ecb\u7ecd\uff1a \u3010\u4f7f\u7528dogtail\u542f\u52a8\u3011 dogtail\u63d0\u4f9b\u4e86\u5e94\u7528\u542f\u52a8\u7684\u65b9\u6cd5\uff0c\u5728utils\u5e93\u4e2d\uff0c\u4f7f\u7528run\u65b9\u6cd5\u542f\u52a8\uff1a \u9996\u5148\u5bfc\u5165\u65b9\u6cd5\uff1a from dogtail.utils import *\n \u8c03\u7528run\u65b9\u6cd5 run('deepin-music')\n \u5373\u53ef\u542f\u52a8\u97f3\u4e50 \u8fd9\u79cd\u65b9\u6cd5\u7684\u4f18\u70b9\u662f\u91c7\u7528\u8fdb\u7a0b\u7684\u65b9\u5f0f\u76f4\u63a5\u542f\u52a8\uff0c\u4e0d\u4f9d\u8d56\u4e0eUI\uff0c\u65e0\u8bba\u684c\u9762\u6216\u4efb\u52a1\u680f\u4e0a\u662f\u5426\u5b58\u5728\u5e94\u7528\u56fe\u6807\uff0c\u90fd\u53ef\u4ee5\u6b63\u5e38\u542f\u52a8\u3002 \u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c \u5982\u679c\u4f7f\u7528ssh\u8fdc\u7a0b\u8c03\u7528\uff0c\u6216\u8005Jenkins\u4e2d\u6267\u884c\u6d4b\u8bd5\u811a\u672c\u7684\u65f6\u5019\uff0c\u5728sniff\u4e2d\u4f1a\u51fa\u73b0\u627e\u4e0d\u5230\u5e94\u7528\uff0c\u7ecf\u8fc7\u5206\u6790\uff0c\u53ef\u80fd\u662f\u56e0\u4e3a\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\u542f\u52a8\u7684\u65f6\u5019\uff0c\u5b9e\u9645\u662f\u91c7\u7528\u4e00\u4e2a\u5b50\u8fdb\u7a0b\u542f\u52a8\u4e86\u5e94\u7528\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u5230\u3002 \u3010\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u3011 \u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807 \u901a\u5e38\u6709\u4e24\u79cd\u65b9\u6cd5\uff1a \uff081\uff09\u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807\u3002 \uff082\uff09\u5df2\u77e5\u5e94\u7528\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u7684\u4f4d\u7f6e\uff0c\u7136\u540e\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u5bf9\u5e94\u5750\u6807\u3002 \u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u7f3a\u70b9\u662f\u4f4d\u7f6e\u5fc5\u987b\u56fa\u5b9a\uff0c\u5982\u679c\u79fb\u52a8\u4f4d\u7f6e\u5c31\u4e0d\u884c\u4e86\uff0c\u800c\u4f7f\u7528\u7b2c\u4e00\u79cd\u65b9\u6cd5\uff0c\u65e0\u8bba\u4f4d\u7f6e\u5728\u54ea\u91cc\uff0c\u53ea\u8981\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u5b58\u5728\u5373\u53ef\u3002 \u3010\u70b9\u51fb\u684c\u9762\u56fe\u6807\u542f\u52a8\u3011 \u684c\u9762\u56fe\u6807\u76ee\u524d\u662f\u91c7\u7528\u56fe\u50cf\u8bc6\u522b\u6280\u672f\uff0c\u5b9a\u4f4d\u5230\u5e94\u7528\u56fe\u6807\u7684\u5750\u6807\uff0c\u7136\u540e\u901a\u8fc7pyauogui\u8fdb\u884c\u70b9\u51fb\u64cd\u4f5c\u3002 \u8be6\u7ec6\u6280\u672f\u65b9\u6848\u53ef\u4ee5\u53c2\u8003\u6211\u7684\u53e6\u5916\u4e24\u7bc7\u535a\u5ba2: \u57fa\u4e8eopencv\u7684\u6a21\u677f\u5339\u914d\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd4\u56de\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 Python\u4e09\u65b9\u5e93PyAutoGui\u7684\u4f7f\u7528\u65b9\u6cd5 \u3010\u4ece\u542f\u52a8\u5668\u542f\u52a8\uff08\u4fd7\u79f0\u5f00\u59cb\u83dc\u5355\uff09\u3011 \u542f\u52a8\u4e2d\u542f\u52a8\u7684\u5b9e\u73b0\u903b\u8f91\u5b9e\u9645\u548c\u4efb\u52a1\u680f\u4e0a\u542f\u52a8\u5dee\u4e0d\u591a\u3002 \u9996\u5148\uff0c\u9700\u8981\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u542f\u52a8\u5668\u56fe\u6807\uff0c\u6216\u8005\u952e\u76d8super\u952e\uff0c\u5c06\u542f\u52a8\u5668\u547c\u51fa\u6765\uff0c \u7136\u540e\uff0c\u5728\u542f\u52a8\u5668\u4e2d\u70b9\u51fb\u5bf9\u5e94\u7684\u56fe\u6807\uff0c \u4f46\u662f\u8fd9\u91cc\u6709\u4e2a\u95ee\u9898\uff0c\u542f\u52a8\u5668\u4e2d\u7684\u5e94\u7528\u5217\u8868\uff0c\u4e00\u9875\u5c55\u793a\u4e0d\u5b8c\uff0c\u6240\u4ee5\u5982\u679c\u6211\u4eec\u8981\u70b9\u51fb\u7684\u5e94\u7528\u56fe\u6807\u4e0d\u5728\u7b2c\u4e00\u9875\u600e\u4e48\u529e\uff0c\u901a\u5e38\u89e3\u51b3\u65b9\u6848\u6709\u4e24\u79cd\uff1a \uff081\uff09\u9700\u8981\u8fdb\u884c\u5411\u4e0b\u6ed1\u52a8\uff0c\u8fd9\u91cc\u5c31\u6d89\u53ca\u5230\u76f8\u5e94\u7684\u8bc6\u522b\u65b9\u6848\uff0c\u5224\u65ad\u5982\u679c\u4e0d\u5728\u7b2c\u4e00\u9875\u5c31\u5f80\u4e0b\u6ed1\u52a8\u7ffb\u9875\u3002 \uff082\uff09\u542f\u52a8\u5668\u63d0\u4f9b\u641c\u7d22\u7684\u529f\u80fd\uff0c\u8f93\u5165\u5e94\u7528\u540d\u79f0\u641c\u7d22\uff0c\u7136\u540e\u8fdb\u884c\u70b9\u51fb\u3002 \u4ece\u5b9e\u9645\u64cd\u4f5c\u4e2d\u6765\u770b\uff0c\u91c7\u7528\u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u6548\u7387\u4f1a\u9ad8\u4e00\u70b9\u3002 \u3010\u7ec8\u7aef\u547d\u4ee4\u542f\u52a8\u3011 \u5728python\u4e2d\uff0c\u4f7f\u7528os.popen()\u6216os.system()\u6216\u8005subprocess.Popen()\uff0c\u5b9e\u73b0\u547d\u4ee4\u884c\u542f\u52a8\uff0c\u6bd4\u5982\uff1a import os\nos.popen('deepin-music')\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u8fdc\u7a0b\u6267\u884c\u811a\u672c\u7684\u65f6\u5019\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u7684\u95ee\u9898\u3002 \u3010\u603b\u7ed3\u3011 \u4ee5\u4e0a\u51e0\u79cd\u65b9\u6cd5\uff0c\u5404\u6709\u4f18\u7f3a\u70b9\uff0c\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff1a \uff081\uff09\u5982\u679c\u9700\u8981\u5728Jenkins\u4e2d\u505a\u6301\u7eed\u96c6\u6210\uff0c\u5efa\u8bae\u4f7f\u7528\u7b2c\u4e8c\u79cd\u4efb\u52a1\u680f\u542f\u52a8\u7684\u65b9\u6cd5\u3002 \uff082\uff09\u5982\u679c\u4e0d\u4f1a\u91c7\u7528\u8fdc\u7a0b\u6267\u884c\u7684\uff0c\u5efa\u8bae\u91c7\u7528\u7b2c\u4e00\u79cd\u6216\u8005\u6700\u540e\u4e00\u79cd\u65b9\u6848\u3002 \uff083\uff09\u7b2c\u4e09\u79cd\u548c\u7b2c\u56db\u79cd\u542f\u52a8\u65b9\u6cd5\uff0c\u901a\u5e38\u5728\u6d4b\u8bd5\u7528\u4f8b\u4e2d\u4f1a\u6d89\u53ca\u5230\uff0c\u6240\u4ee5\u5076\u5c14\u4f1a\u7528\u3002"},{"location":"RELEASE/","title":"\u7248\u672c\u66f4\u65b0\u8bb0\u5f55","text":""},{"location":"RELEASE/#220202395","title":"2.2.0\uff082023/9/5\uff09","text":"new \u6b63\u5f0f\u542f\u7528 letmego \u6280\u672f\u65b9\u6848\uff1b fix \u5bf9 docs \u91cc\u9762\u7ec6\u5316\u4e86\u8fdc\u7a0b\u6267\u884c\u7ae0\u8282\u7684\u63cf\u8ff0\uff1b "},{"location":"RELEASE/#2152023831","title":"2.1.5\uff082023/8/31\uff09","text":"new \u5c06\u6709\u8da3\u7684\u6587\u6863\u7cfb\u7edf\u8fc1\u79fb\u5230 linuxdeepin \uff0c\u5265\u79bb\u6587\u6863\u4e2d\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u91c7\u7528 CDN \u52a0\u901f\u65b9\u5f0f\u52a0\u8f7d\uff1b \u5c1d\u8bd5\u5408\u5165\u4e00\u4e2a\u6709\u8da3\u7684\u529f\u80fd\uff1b fix \u4fee\u590d\u4e86 Wayland \u952e\u9f20\u5de5\u5177\u6ca1\u6709\u9f20\u6807\u76f8\u5bf9\u79fb\u52a8\u65b9\u6cd5 moveRel \u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 Wayland \u4e0b\u83b7\u53d6\u7a97\u53e3\u4fe1\u606f\u529f\u80fd\u6a21\u5757\u4e2d\u73af\u5883\u53d8\u91cf\u7684\u95ee\u9898\uff1b \u4f18\u5316\u4e86 startproject \u529f\u80fd\u7684\u4e00\u4e9b\u4fe1\u606f\u8f93\u51fa\uff1b \u4fee\u590d\u4e86\u7279\u6b8a\u573a\u666f\u4e0b env_dev.sh \u5f00\u53d1\u73af\u5883\u90e8\u7f72\u662f\u53ef\u80fd\u5f71\u54cd\u5230\u6b63\u5f0f\u73af\u5883 env.sh \u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#2122023822","title":"2.1.2\uff082023/8/22\uff09","text":"new \u589e\u52a0 OCR \u8bc6\u522b\u81ea\u52a8\u91cd\u8bd5\u673a\u5236\uff0c\u9ed8\u8ba4\u91cd\u8bd5 2 \u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u91cd\u8bd5\u6b21\u6570\uff1b \u4f7f\u7528\u7a97\u7ba1\u6700\u65b0\u63d0\u4f9b\u7684\u4e8c\u8fdb\u5236\u63a5\u53e3\uff0c\u4f18\u5316\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u5728 Wayland \u4e0b\u83b7\u53d6\u7a97\u53e3\u4fe1\u606f\u7684\u65b9\u6cd5\uff1b\u611f\u8c22\u684c\u9762\u6d4b\u8bd5\u90e8 @\u4f55\u6743 @\u5b59\u7fe0 \u3001\u7a97\u7ba1\u7814\u53d1 @\u9ec4\u6cfd\u94ed \u7684\u5927\u529b\u652f\u6301\u3002 \u6269\u5145 skipif \u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\u51fd\u6570\uff1a skipif_xdg_type \u652f\u6301 x11 \u6216 wayland \u4e0a\u8df3\u8fc7\uff1b skipif_cpu_name \u652f\u6301\u4e0d\u540c cpu \u4e0a\u8df3\u8fc7\uff0c\u6bd4\u5982\uff1askipif_cpu_name-KLVVW5821\uff1b "},{"location":"RELEASE/#2102023818","title":"2.1.0\uff082023/8/18\uff09","text":"fix \u4fee\u590d SW \u67b6\u6784\u73af\u5883\u4f9d\u8d56\u7684\u95ee\u9898\uff0c\u539f\u56e0\u662f\u4e4b\u524d\u6211\u8fd9\u91cc\u672c\u5730\u6ca1\u6709 SW \u7684\u673a\u5668\uff0c\u6ca1\u6709\u505a\u76f8\u5173\u9002\u914d\uff1b \u4fee\u590d\u5b50\u9879\u76ee\u5355\u72ec\u9700\u8981\u4e09\u65b9\u5305 pexpect\uff0c\u7531\u4e8e\u4e4b\u524d\u662f\u9884\u88c5\u5230\u955c\u50cf\u91cc\u9762\u7684\uff0c\u4f46\u57fa\u7840\u6846\u67b6\u4e0d\u9700\u8981\uff0c\u56e0\u6b64\u6ca1\u6709\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u91cc\u9762\uff0c\u5bfc\u81f4\u5b50\u9879\u76ee\u4f9d\u8d56\u62a5\u9519\u3002 \u4fee\u590d\u5b50\u9879\u76ee cv \u5bfc\u5165\u62a5\u9519\u7684\u95ee\u9898\uff1b \u539f\u56e0\u4e3a\uff1ayouqu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u517c\u5bb9\u4e24\u79cd\u60c5\u51b5\uff0c\u4e00\u79cd\u662f\u9762\u5411\u670d\u52a1\uff0c\u5c31\u662f\u672c\u5730\u6d4b\u8bd5\u673a\u4e0d\u9700\u8981\u5b89\u88c5 OpenCV\uff0c\u7528\u4f8b\u4e2d\u7684\u56fe\u50cf\u8bc6\u522b\u4f1a\u901a\u8fc7\u8fdc\u7a0b\u670d\u52a1\u63a5\u53e3\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u548c\u7ed3\u679c\u83b7\u53d6\uff1b\u7b2c\u4e8c\u79cd\u662f\u539f\u751f\uff0c\u5c31\u662f\u672c\u5730\u76f4\u63a5\u5b89\u88c5 OpenCV \u76f4\u63a5\u7528\u3002\u4e24\u4e2a\u60c5\u51b5\u7684\u4f18\u5148\u7ea7\u662f\u4f18\u5148\u5224\u65ad\u672c\u5730\u5b58\u5728\uff0c\u5426\u5219\u8d70\u670d\u52a1\u3002 \u524d\u9762\u6211\u4eec\u5df2\u7ecf\u628a OCR \u529f\u80fd\u505a\u4e86\u670d\u52a1\u5316\uff0c\u57fa\u4e8e 1 \u5e74\u591a\u4ee5\u6765\u7684\u89c2\u5bdf\uff0c\u7528\u8d77\u6765\u5f88\u7a33\u5b9a\uff0c\u518d\u4e00\u4e2a\u5c31\u662f OpenCV \u5b89\u88c5\u5305\u662f\u6bd4\u8f83\u81c3\u80bf\u7684\uff0c\u7c97\u7565\u6570\u4e86\u4e0b\u4f9d\u8d56\u6709 30+ \u4e2a\uff0c\u800c\u4e14\u5728\u5404\u67b6\u6784\u4e0a\u4f9d\u8d56\u5305\u8fd8\u4e0d\u5c3d\u76f8\u540c\uff0c\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u65b9\u6848\u4e2d\u4e0d\u592a\u597d\u5904\u7406\uff0c\u6240\u4ee5\u672c\u6b21 2.0 \u7248\u672c\u6211\u4eec\u5927\u80c6\u7684\u5c06\u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u529f\u80fd\u4fee\u6539\u4e3a\u9762\u5411\u670d\u52a1\u7684\u65b9\u5f0f\uff0c\u524d\u671f\u6d4b\u8bd5\u4e00\u5207\u770b\u8d77\u6765\u90fd\u5f88\u548c\u8c10\u3002 \u4f46\u662f\u6ca1\u6ce8\u610f\u5230\u4e4b\u524d\u7ed9\u6d77\u71d5\u59d0\u90a3\u8fb9\u9879\u76ee\u5355\u72ec\u5b9a\u5236\u505a\u4e86\u4e2a\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\uff08\u4e3a\u4e86\u80fd\u7b80\u5355\u5e73\u6ed1\u7684\u8fc1\u79fb\u5230 youqu\uff09\uff0c\u6b64\u63a5\u53e3\u5e95\u5c42\u6ca1\u6709\u517c\u5bb9\u670d\u52a1\u5316\uff0c\u6240\u4ee5\u5979\u90a3\u8fb9\u7684\u9879\u76ee\u8c03\u7528\u6b64\u5b9a\u5236\u63a5\u53e3\u4f1a\u62a5 cv \u5bfc\u5165\u7684\u95ee\u9898\u3002 \u7531\u4e8e\u5c06\u8fd9\u4e2a\u5b9a\u5236\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\u8fdb\u884c\u670d\u52a1\u5316\u517c\u5bb9\u6539\u9020\u9700\u8981\u4e00\u5b9a\u65f6\u95f4\uff0c\u6539\u5b8c\u8fd8\u9700\u8981\u6d4b\u8bd5\uff0c\u4f46\u672c\u6b21\u65f6\u95f4\u6bd4\u8f83\u7d27\uff0c\u56e0\u6b64\u5148\u628a OpenCV \u88c5\u8fdb\u865a\u62df\u73af\u5883\uff0c\u540e\u7eed\u7248\u672c\u518d\u8003\u8651\u9488\u5bf9\u6b64\u63a5\u53e3\u505a\u4fee\u6539\u3002"},{"location":"RELEASE/#2002023816","title":"2.0.0\uff082023/8/16\uff09","text":"YouQu\uff08\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff09\u5f00\u6e90\u4e86\uff0c\u540c\u65f6\u63a8\u51fa\u4e86 2.0 \u7248\u672c\u3002 \u611f\u8c22\u738b\u6ce2\u603b\u3001\u67b6\u6784\u5e08\u5f90\u5c0f\u4e1c\u3001\u7814\u53d1\u7ecf\u7406\u90d1\u5e7c\u6208\u3001\u5218\u90d1\u7b49\u7814\u53d1\u540c\u4e8b\u7684\u5927\u529b\u652f\u6301\u3002 new 1\u3001\u65b0\u7684\u57fa\u7840\u6846\u67b6\u4ee3\u7801\u83b7\u53d6\u65b9\u5f0f\u53ca\u65b0\u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4 YouQu \u540e\u7eed\u5747\u901a\u8fc7 PyPI \u8fdb\u884c\u5305\u7684\u53d1\u5e03\uff0c\u4e5f\u5c31\u662f\u8bf4\u540e\u7eed\u53ef\u4ee5\u4f7f\u7528 pip \u8fdb\u884c\u5b89\u88c5\uff1a sudo pip3 install youqu==2.0.0\n \u8fd9\u91cc\u6709 2 \u4e2a\u5c0f\u70b9\u8981\u6ce8\u610f\uff1a \u63a8\u8350\u4f7f\u7528 sudo pip3 \uff08\u52a0 sudo\uff09\u8fdb\u884c\u5b89\u88c5\uff1b \u5982\u679c\u4e0d\u52a0 sudo \u6709\u4e9b\u673a\u5668\u53ef\u80fd $HOME/.local/bin \u4e0d\u5728\u7cfb\u7edf PATH \u73af\u5883\u76ee\u5f55\u4e0b\uff0c\u5728\u4e0d\u6dfb\u52a0\u73af\u5883\u53d8\u91cf\u7684\u60c5\u51b5\u4e0b\uff0c\u4f1a\u51fa\u73b0 YouQu \u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4\uff08youqu-startproject\uff09\u65e0\u6cd5\u4f7f\u7528\u7684\u95ee\u9898\uff1b \u5f53\u7136\uff0c\u5c06\u4e0a\u8ff0\u8def\u5f84\u6dfb\u52a0\u5230\u73af\u5883\u53d8\u91cf\u4e4b\u540e\u4e5f\u662f\u53ef\u4ee5\u7528\u7684\uff0c\u6240\u4ee5\u6211\u8fd9\u91cc\u662f\u63a8\u8350\u52a0 sudo\uff0c\u4e0d\u52a0 sudo \u4e5f\u662f\u53ef\u4ee5\u7684\uff0c\u53ea\u662f\u9700\u8981\u5173\u6ce8\u4e0b\u73af\u5883\u53d8\u91cf\u7684\u95ee\u9898\u3002 \u63a8\u8350\u6307\u5b9a\u7248\u672c\u53f7\uff08youqu==2.0.0\uff09\u5b89\u88c5\uff0c\u5982\u679c\u4e0d\u6307\u5b9a\u7248\u672c\u53f7\u9ed8\u8ba4\u662f\u5b89\u88c5\u6700\u65b0\u53d1\u5e03\u7684 YouQu \u7248\u672c\uff0c\u4f60\u53ef\u4ee5\u5728 PyPI \u4e0a\u7684 Release history \u91cc\u9762\u67e5\u770b\u6709\u54ea\u4e9b\u7248\u672c\u3002 \u5b89\u88c5\u4e4b\u540e\u4f1a\u81ea\u52a8\u751f\u6210\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu-startproject\uff0c\u4f7f\u7528\u5b83\u53ef\u4ee5\u521d\u59cb\u5316\u5de5\u7a0b\uff0c\u8fd9\u91cc\u4ee5\u97f3\u4e50\u4e3e\u4f8b\uff1b youqu-startproject autotest_deepin_music\n \u8fd9\u6837\u5c31\u4f1a\u5728\u5f53\u524d\u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a autotest_deepin_music \u76ee\u5f55\uff0c\u91cc\u9762\u5305\u542b\u4e86\u57fa\u7840\u6846\u67b6\u6240\u6709\u7684\u4ee3\u7801\uff1b \u4e4b\u540e\uff0c\u8fd8\u662f\u5728 apps \u76ee\u5f55\u4e0b\uff0c\u653e\u5165\u5b50\u9879\u76ee\u7684AT\u4ee3\u7801\u5373\u53ef\uff0c\u4f7f\u7528\u65b9\u6cd5\u548c\u8fc7\u53bb\u4e00\u6837\uff0c\u8fd9\u91cc\u5c31\u4e0d\u591a\u4ecb\u7ecd\u3002 \u53e6\u5916\uff0c\u9664\u4e86\u901a\u8fc7 pip \u83b7\u53d6\u4ee5\u5916\uff0c\u4ecd\u7136\u53ef\u4ee5\u901a\u8fc7\u6e90\u7801\u83b7\u53d6\uff08\u76f4\u63a5 git clone\uff09\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u4f7f\u7528 pip \u5b89\u88c5 YouQu \u65f6\uff0cYouQu \u5305\u7684\u5927\u5c0f\u624d 600+ k\uff0c\u5b89\u88c5\u901f\u5ea6\u8d77\u98de\u3002 2\u3001\u65b0\u7684AT\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848 \u4e3a\u4e86\u89e3\u51b3\u4ee5\u4e0b\u95ee\u9898\uff1a \u8fc7\u53bb\u4e00\u6bb5\u65f6\u95f4\u54b1\u4eec\u7ecf\u5e38\u51fa\u73b0\u7684\uff0c\u4e0d\u540c\u7684AT\u9879\u76ee\u5728\u540c\u4e00\u53f0\u673a\u5668\u4e0a\u90e8\u7f72\u73af\u5883\u65f6\u4f9d\u8d56\u7248\u672c\u51b2\u7a81\u7684\u95ee\u9898\uff0c\u65b0\u65b9\u6848\u4e0d\u540c\u7684\u9879\u76ee\u4f1a\u52a8\u6001\u751f\u6210\u81ea\u5df1\u7684\u865a\u62df\u73af\u5883\uff0c\u76f8\u4e92\u4e4b\u95f4\u4e0d\u5f71\u54cd\uff1b \u4e1a\u5185\u4e3a\u4e86\u89e3\u51b3\u7248\u672c\u51b2\u7a81\u95ee\u9898\u4e00\u822c\u90fd\u4f1a\u4f7f\u7528Python\u865a\u62df\u73af\u5883\u7684\u5de5\u5177\uff0c\u4f46\u662f\u90fd\u6709\u4e2a\u95ee\u9898\uff0c\u65e0\u6cd5\u7ba1\u7406 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u5305\uff0c\u672c\u6b21\u6211\u4eec\u89e3\u51b3\u4e86\u8fd9\u4e2a\u95ee\u9898\uff0c\u80fd\u591f\u5b8c\u5168\u7ba1\u7406\u5e38\u89c4\u7684Python\u5305\uff0c\u4e5f\u80fd\u7ba1\u7406\u5230 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u4e09\u65b9\u5305\uff1b \u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u4f7f\u7528\u65b9\u6cd5\uff1a bash env.sh\n \u53ef\u4ee5\u770b\u51fa\u6765\u548c\u539f\u6765\u4f7f\u7528\u65b9\u6cd5\u6ca1\u6709\u53d8\u5316\uff0c\u4e5f\u5c31\u662f\u8bf4\u4ece\u4f7f\u7528\u7684\u89d2\u5ea6\u662f\u5b8c\u5168\u6ca1\u6709\u533a\u522b\u7684\uff0c\u53ea\u662f\u5185\u90e8\u505a\u4e86\u4e0d\u540c\u7684\u4e8b\u60c5\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u672c\u673a\u90e8\u7f72\u7684\u529f\u80fd\u4ecd\u7136\u4fdd\u7559 env_dev.sh\uff0c\u53ef\u4ee5\u4f5c\u4e3a\u5f00\u53d1\u65f6\u7684\u73af\u5883\u90e8\u7f72\u3002 3\u3001\u65b0\u7684\u9a71\u52a8\u547d\u4ee4 \u8fc7\u53bb\u54b1\u4eec\u90fd\u662f\u4f7f\u7528\u8fd9\u6837\u7684\u547d\u4ee4\u6765\u9a71\u52a8\u6267\u884c\uff1a python3 manage.py run\n \u7531\u4e8e\u9ed8\u8ba4\u57fa\u4e8e\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848\uff0c\u56e0\u6b64\u6211\u4eec\u589e\u52a0\u4e86\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu\uff1b \u65b0\u7684\u9a71\u52a8\u65b9\u5f0f\uff1a youqu manage.py run\n \u53ea\u9700\u8981\u628a python3 \u66ff\u6362\u6210 youqu \u5c31\u53ef\u4ee5\u4e86\uff0c\u770b\u8d77\u6765\u5f88\u548c\u8c10~ 4\u3001\u65b0\u7684\u6587\u6863\u5730\u5740 \u8fc7\u53bb\u54b1\u4eec YouQu \u7684\u5728\u7ebf\u6587\u6863\u662f\u90e8\u7f72\u5728\u516c\u53f8\u5185\u7f51\u7684\uff0c\u73b0\u5728\u5f00\u6e90\u5230 github \u4e86\uff0c\u5916\u90e8\u5f00\u53d1\u8005\u80af\u5b9a\u8bbf\u95ee\u4e0d\u5230\u5185\u7f51\u7684\u6587\u6863\uff0c\u56e0\u6b64\u9700\u8981\u5c06\u6587\u6863\u90e8\u7f72\u5230\u516c\u7f51\u3010\u516c\u7f51\u6587\u6863\u3011\uff1b \u516c\u7f51\u6587\u6863\u4f7f\u7528\u7684\u662f github pages\uff08\u767d\u5ad6\u602a\u4e00\u987f\u72c2\u559c~~\uff09\uff0c\u4f46\u53ef\u80fd\u4f1a\u51fa\u73b0\u6587\u6863\u901f\u5ea6\u6162\u7684\u95ee\u9898\uff08\u4ee3\u7406\u4e0b\u5c31\u597d\u4e86\uff09\uff0c\u4e0d\u8fc7\u6ca1\u5173\u7cfb\uff0c\u54b1\u4eec\u3010\u5185\u7f51\u6587\u6863\u3011\u4ecd\u7136\u4fdd\u7559\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u3002 5\u3001\u5176\u4ed6\u4e00\u4e9b\u5c0f\u5c0f\u529f\u80fd\u66f4\u65b0\uff1a \uff081\uff09\u65b0\u589e\u5173\u95ed\u5206\u8fa8\u7387\u68c0\u6d4b\u7684\u53c2\u6570\u503c\uff1b youqu manage.py run --resolution no\n \u6216\u8005\u4fee\u6539 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387, \u6bd4\u5982\uff1a1920x1080\n;no: \u8868\u793a\u4e0d\u505a\u5206\u8fa8\u7387\u6821\u9a8c\nRESOLUTION = 1920x1080\n resolution \u8fd9\u4e2a\u53c2\u6570\u4e00\u76f4\u90fd\u6709\u7684\uff0c\u53ea\u4e0d\u8fc7\u4e4b\u524d\u662f\u7528\u4e8e\u6307\u5b9a\u5206\u8fa8\u7387\u5927\u5c0f\uff0c\u6bd4\u5982 --resolution 1920x1080\uff0c\u4f46\u6709\u4e9b\u63a5\u53e3\u7684\u9879\u76ee\u4e0d\u9700\u8981\u8fd9\u4e2a\u68c0\u67e5\uff0c\u53ef\u4ee5\u7ed9\u5b83\u4e2a no \u5c31\u597d\u4e86\uff0c\u5f53\u7136 CICD \u4e0a\u5173\u95ed\uff0c\u9700\u8981\u6d41\u6c34\u7ebf\u4e0a\u628a\u8fd9\u4e2a\u53c2\u6570\u52a0\u4e0a\uff1b \uff082\uff09\u65b0\u589e\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u7684\u547d\u4ee4\u884c\u53c2\u6570 \u4e4b\u524d\u8fd9\u4e2a\u914d\u7f6e\u9879\u53ea\u80fd\u5728 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c 1 \u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff0cRERUN >= RECORD_FAILED_CASE\u3002\n;1.\u5173\u95ed\u5f55\u5c4f\uff1aRECORD_FAILED_CASE > RERUN\n;2.\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1aRECORD_FAILED_CASE = 0\nRECORD_FAILED_CASE = 1\n \u73b0\u5728\u5c06\u5f00\u53d1\u5230\u547d\u4ee4\u884c\u53c2\u6570\u3002 youqu manage.py run --record_failed_case 2\n fix \u4fee\u590d remote \u6267\u884c\u65f6\uff0c\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u65e0\u6cd5\u751f\u6210\u6d4b\u8bd5\u62a5\u544a\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1302023710","title":"1.3.0\uff082023/7/10\uff09","text":"fix \u8fdb\u4e00\u6b65\u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b\u53c2\u8003\uff1a\u914d\u7f6ePython\u6e90\u7684\u51e0\u79cd\u65b9\u6cd5 \u4fee\u590d wayland_autotool \u53d7\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86wayland\u4e0b\u5076\u73b0\u627e\u4e0d\u5230 .Xauthority \u6587\u4ef6\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1292023626","title":"1.2.9\uff082023/6/26\uff09","text":"fix \u4f18\u5316\u8fdc\u7a0b\u6267\u884c remote \u7684\u53c2\u6570\u76f4\u63a5\u4f20\u7ed9\u8fdc\u7a0b\u673a\u5668\u7684 run \u547d\u4ee4\uff0c\u4e0d\u7528\u518d\u5355\u72ec\u5904\u7406\u8fdc\u7a0b\u6267\u884c\u7684\u53c2\u6570\u903b\u8f91\uff0c\u540e\u7eed\u4e13\u6ce8\u4e8e\u672c\u5730\u6267\u884c\u529f\u80fd\u5f00\u53d1\uff0c\u8fdc\u7a0b\u6267\u884c\u81ea\u52a8\u9002\u7528\uff1b env.sh \u79fb\u9664 pyyaml \u5b89\u88c5\uff0c\u7531\u5b50\u9879\u76ee\u5728 requirement.txt \u91cc\u9762\u5b9a\u4e49\uff0c\u6846\u67b6\u81ea\u52a8\u52a0\u8f7d\uff1b \u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b "},{"location":"RELEASE/#128202369","title":"1.2.8\uff082023/6/9\uff09","text":"fix \u4fee\u590d\u4e86 pypi \u5b89\u88c5 numpy \u5b58\u5728\u7cfb\u7edf\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#127202368","title":"1.2.7\uff082023/6/8\uff09","text":"fix env.sh \u4e2d\u5b89\u88c5 Python \u5305\u672a\u6307\u5b9a\u7248\u672c\u65f6\uff0c\u65e5\u5fd7\u8f93\u51fa\u5b89\u88c5\u7684\u7248\u672c\uff1b pdocr-rpc 2.0.1\nallure-custom 1.2.1\nfunnylog 1.1.3\n \u4fee\u590d -f \u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u62a5\u9519\u7684\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#126202367","title":"1.2.6\uff082023/6/7\uff09","text":"fix \u4fee\u590d wayland \u4e0a\u8c03\u7528\u9f20\u6807\u4e2d\u952e\u3001\u53f3\u952e\u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b \u4fee\u590d pubilic/dde_desktop_public_widget \u91cc\u9762\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u5b9a\u4f4d\u684c\u9762\u6587\u4ef6\u7684\u65b9\u6cd5\uff0c\u5750\u6807\u6ca1\u6709\u62c6\u5305\u7684\u95ee\u9898\uff1b \u4f18\u5316\u4e86\u7b49\u5f85\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b pycreeze \u7248\u672c\u5347\u7ea7\u5230 0.1.29\uff0c\u5bfc\u81f4\u4e0e pyautogui 0.9.53 \u4e0d\u517c\u5bb9\uff0cenv.sh \u91cc\u9762\u589e\u52a0\u6307\u5b9a pycreeze \u7248\u672c\u4e3a 0.1.28\uff1b "},{"location":"RELEASE/#1252023516","title":"1.2.5\uff082023/5/16\uff09","text":"new --app \u53c2\u6570\u540e\u9762\u65b0\u589e\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u76ee\u524d\u652f\u6301\u4e09\u79cd\u53c2\u6570\u4f20\u5165\u65b9\u5f0f\uff1a ~$: youqu run -a deepin-music\n~$: youqu run -a autotest_deepin_music\n~$: youqu run -a apps/autotest_deepin_music\n \u200b \u540e\u4e24\u79cd\u5165\u53c2\u65b9\u5f0f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\u3002 remote \u8fdc\u7a0b\u6267\u884c\u65b0\u589e\u4ece\u547d\u4ee4\u884c\u4f20\u5165\u6d4b\u8bd5\u673a\u4fe1\u606f\uff0c\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679c password \u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6 setting/remote.ini \u4e2d CLIENT_PASSWORD \u7684\u503c,\u6bd4\u5982\uff1auos@10.8.13.33:1 \u6216 uos@10.8.13.33 \uff1b python3 manage.py remote -c uos@10.8.13.33/uos@10.8.13.34\npython3 manage.py remote -c uos@10.8.13.33:1/uos@10.8.13.34:2\n fix \u65e5\u5fd7\u6a21\u5757\u4fee\u6539\u4e3a\u51fd\u6570\u6267\u884c\u4e4b\u524d\u6253\u5370\u65e5\u5fd7\uff1b \u65e5\u5fd7\u6a21\u5757\u589e\u52a0\u767d\u540d\u5355\uff0c\u901a\u8fc7\u7c7b\u540d\u5f00\u5934\uff0c\u7ed3\u675f\uff0c\u5305\u542b\u7b49\u5173\u952e\u5b57\u63a7\u5236\u9700\u8981\u6253\u5370\u7684\u51fd\u6570\u65e5\u5fd7\uff1b \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5982\u679c\u4f20\u5165\u4e86 app_name \u53ea\u4f1a\u5c06 apps \u76ee\u5f55\u4e0b app_name \u7684\u76ee\u5f55\u53d1\u9001\u5230\u6d4b\u8bd5\u673a\uff1b env.sh \u79fb\u9664 python3-dev\uff1b \u4fee\u590d Wayland \u4e0b env.sh \u73af\u5883\u5b89\u88c5\u5931\u8d25\u7684\u95ee\u9898\uff0c\u4f18\u5316\u4e86 deb \u4f9d\u8d56\u5b89\u88c5\u7684\u903b\u8f91\uff1b \u5c06 env.sh \u5237\u65b0\u6e90\u7684\u65e5\u5fd7\u5728\u7ec8\u7aef\u663e\u793a\uff0c\u89e3\u51b3\u5728 CI \u73af\u5883\u4e0b\uff0c\u957f\u65f6\u95f4\u4e0d\u8f93\u51fa\u65e5\u5fd7\u8fde\u63a5\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d1060 \u534e\u4e3a\u673a\u578b\u5b89\u88c5\u952e\u9f20\u5de5\u5177\u65f6\u4f9d\u8d56\u4e0d\u517c\u5bb9\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1242023227","title":"1.2.4\uff082023/2/27\uff09","text":"fix \u4fee\u6539 CURRENT \u6587\u4ef6\uff1b "},{"location":"RELEASE/#1232023227","title":"1.2.3\uff082023/2/27\uff09","text":"new pylint.sh \u652f\u6301\u901a\u8fc7\u4f4d\u7f6e\u53c2\u6570\u4f20\u5165\u6587\u4ef6\u8def\u5f84\uff1abash pylint.sh apps/autotest_deepin_music,\u597d\u5904\u662f\u53c2\u6570\u8def\u5f84\u53ef\u4ee5\u5728\u7ec8\u7aef\u8865\u5168\uff1b \u65b0\u589e\u7cfb\u7edf\u547d\u4ee4 youqu-pylint \uff0c\u7528\u4e8e\u9759\u6001\u4ee3\u7801\u626b\u63cf\uff0c\u4f7f\u7528\u65b9\u6cd5: youqu-pylint apps/autotest_deepin_music\uff1b \u7531\u4e8e\u7cfb\u7edf\u4e00\u4e9b dbus \u63a5\u53e3\u6539\u53d8\uff0c\u516c\u5171\u5e93\u4e2d\u7684 dbus \u65b9\u6cd5\u5c06\u4e0d\u518d\u7ef4\u62a4\uff0c\u7531\u5b50\u9879\u76ee\u5728 other_widget.py \u91cc\u9762\u8fdb\u884c\u7ef4\u62a4\uff1b fix \u4fee\u590d ssh \u73af\u5883\u4e0b\u8fd0\u884c\u63d0\u793a \u201c\u65e0\u6cd5\u8fde\u63a5\u201d \u7684\u95ee\u9898\uff1b \u4fee\u590d\u8fd0\u884c\u65f6\u7a0b\u5e8f\u9000\u51fa\uff0c\u4e0d\u8f93\u51fa\u5f02\u5e38\u65e5\u5fd7\u7684\u95ee\u9898\uff1b \u4fee\u590dyouqu remote xxx \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5728\u670d\u52a1\u7aef Ctrl + C \u65e0\u6cd5\u505c\u6b62\u7a0b\u5e8f\u8fd0\u884c\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#122202328","title":"1.2.2\uff082023/2/8\uff09","text":"new \u65b0\u589e\u6c14\u6ce1\u7c7b\u56fe\u50cf\u8bc6\u522b\u65b9\u6848\uff1bimage_utils.py::ImageUtil::get_during\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u533a\u57df\u8bc6\u522b\uff0c\u4f20\u5165 [x, y, w, h]\uff0cx: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u76ee\u6807\u56fe\u7247\uff0c\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\uff1b env.sh \u79fb\u9664 pypinyin; \u4f18\u5316\u6267\u884c env.sh \u65f6\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b manage.py \u79fb\u9664\u4e86\u53c2\u6570 session_timeout \uff0c\u6846\u67b6\u6839\u636e\u5168\u5c40\u7684 timeout \u4ee5\u53ca\u7528\u4f8b\u81ea\u5b9a\u4e49\u7684 timeout \u81ea\u52a8\u8ba1\u7b97\u51fa sessiontimeout \u7684\u503c\uff1b \u65b0\u589e ocr \u670d\u52a1\u5668\u94fe\u63a5\u91cd\u8bd5\uff0c\u9ed8\u8ba4\u91cd\u8bd51\u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u53c2\u6570\uff1b fix \u4fee\u590d\u4e86\u4e00\u4e9b pylint \u626b\u63cf\u7684\u4ee3\u7801\u98ce\u683c\u95ee\u9898\uff1b \u91cd\u65b0\u8bbe\u8ba1\u4e86\u6d4b\u8bd5\u62a5\u544a\u4e3b\u9898\uff1b "},{"location":"RELEASE/#121202316","title":"1.2.1\uff082023/1/6\uff09","text":"new \u652f\u6301\u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6267\u884c\u7528\u4f8b\uff1b\u53ef\u5c06python3 manage.py \u66ff\u6362\u4e3a youqu \uff1a youqu run -a deepin-music -k 001\n RPC \u670d\u52a1 IP \u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u6307\u5b9a\u4e0d\u540c\u7684\u7aef\u53e3\uff1b \u5728\u7ebf\u6587\u6863\u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u539f\u6765\u7684\u5730\u5740 10.8.10.215 \u5c06\u4e0d\u5728\u4f7f\u7528\uff1b fix \u4fee\u590d --count \u53c2\u6570\u53ef\u80fd\u51fa\u73b0\u4e0e\u5176\u4ed6\u6846\u67b6\u7684\u5de5\u7a0b\u4f9d\u8d56\u5b58\u5728\u51b2\u7a81\uff0c\u62a5\u9519\u91cd\u590d\u6ce8\u518c\u7684\u95ee\u9898\uff1b \u4fee\u590d CI \u73af\u5883\u4e0b\u591a\u4e2a\u5de5\u7a0b\u5b58\u5728 Python \u73af\u5883\u53d8\u91cf\u6307\u5411\u9519\u8bef\uff0c\u5bfc\u5305\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u5355\u72ec\u8fd0\u884c\u65b9\u6cd5\u65f6\u65e0\u65e5\u5fd7\u8f93\u51fa\u7684 Bug\uff1b "},{"location":"RELEASE/#12020221230","title":"1.2.0\uff082022/12/30\uff09","text":"1.1.4 \u7248\u672c\u9002\u914d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e14\u65b0\u589e\u4e86\u8f83\u591a\u65b0\u7279\u6027\uff0c\u6211\u4eec\u8ba1\u5212\u4f7f\u7528 1.1.4 \u7248\u672c\u8fd0\u884c\u4e00\u6bb5\u65f6\u95f4\uff0c1.2.0 \u7248\u672c\u5c06\u4fee\u590d\u671f\u95f4\u51fa\u73b0\u7684 Bug\uff0c\u7136\u540e\u4f5c\u4e3a\u7a33\u5b9a\u7248\u672c\u53d1\u5e03\u3002 new \u4fee\u6539\u5de5\u7a0b\u540d\u79f0\u4e3a youqu\uff1b \u5c06 sphinx \u6587\u6863\u5de5\u7a0b\u8fc1\u79fb\u5230\u5355\u72ec\u7684\u4ed3\u5e93\uff1b fix \u4fee\u590d startapp \u521b\u5efa\u5de5\u7a0b\u65f6\u5b58\u5728\u5de5\u7a0b\u540d\u79f0\u65f6\u65e0\u6cd5\u7ee7\u7eed\u521b\u5efa\uff1b \u4fee\u590d\u4e86 OCR \u670d\u52a1\u5728\u5e76\u53d1\u65f6\u53ef\u80fd\u51fa\u73b0\u65e0\u6cd5\u8fd4\u56de\u7ed3\u679c\u7684\u95ee\u9898\uff0c\u63d0\u5347 OCR \u670d\u52a1\u9ad8\u5e76\u53d1\u7a33\u5b9a\u6027\uff1b \u4fee\u590d PMS \u540c\u6b65\u6807\u7b7e\u5230 CSV \u6587\u4ef6\u4e0d\u652f\u6301\u7528\u4f8b\u5e93\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11420221214","title":"1.1.4\uff082022/12/14\uff09","text":"new \u65b0\u589e startapp \u5b50\u547d\u4ee4\u521b\u5efa\u5b50\u9879\u76ee\u5de5\u7a0b\u6a21\u677f: python3 manage.py startapp autotest_deepin_xxx \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u91cd\u590d\u6267\u884c\u6b21\u6570\uff1b \u53bb\u6389\u6279\u91cf\u6267\u884c\u524d\u6536\u96c6\u7528\u4f8b\u7684\u6b65\u9aa4\uff1b \u589e\u52a0\u5f00\u59cb\u6267\u884c\u65f6\u6253\u5370\u4e00\u4e9b\u6267\u884c\u53c2\u6570\uff0c\u5982\uff1a \u7528\u4f8b\u6536\u96c6\u6570\u91cf: 99\n\u5931\u8d25\u91cd\u8dd1\u6b21\u6570: 1\n\u6700\u5927\u5931\u8d25\u6b21\u6570: 49\n\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4: 200.0s (03\u520620\u79d2)\n\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4: 11880s (3\u5c0f\u65f618\u52060\u79d2)\n \u5b9a\u5236\u4fee\u6539allure\u62a5\u544alogo\u3001title\u3001\u9ed8\u8ba4\u8bed\u8a00\uff1b manage.py \u6267\u884c\u5f00\u59cb\u65f6\u6253\u5370 logo \u548c\u5f53\u524d\u7248\u672c\uff1a \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u255a\u2588\u2588\u2557 \u2588\u2588\u2554\u255d \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2584\u2584 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2580\u2580\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u2584\u2588 \u2584\u2588 \u2588 \u2588 \u2588 \u2584 \u2588 \u2584 \u2580\u2580\u2588 \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\uff1b \u88c5\u9970\u5668\u65b9\u6cd5\u6307\u5b9a\u6b21\u6570\uff1b @pytest.mark.count(2)\ndef test_music_001():\npass\n \u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u6b21\u6570\uff1b python3 manage.py run -a deepin-music -k 001 --count 2\n \u200b image_utils \u589e\u52a0\u51fd\u6570 save_temporary_picture\uff0c\u652f\u6301\u6307\u5b9a\u5c4f\u5e55\u533a\u57df\u622a\u56fe\u5e76\u8fd4\u56de\u56fe\u7247\u5b58\u653e\u7684\u672c\u5730\u8def\u5f84\uff0c\u540e\u7eed\u4f7f\u7528 assert_image_exist \u8fdb\u884c\u65ad\u8a00 Python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(x, y, width, height) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) button_center \u65b0\u589e btn_size \u83b7\u53d6\u63a7\u4ef6\u5de6\u4e0a\u89d2\u5750\u6807\u53ca\u957f\u5bbd\uff0c\u7528\u4e8e\u52a8\u6001\u7684\u622a\u53d6\u5143\u7d20\u7684\u56fe\u7247\uff0c\u53ef\u7528\u4e8e\u5b9a\u4f4d\u65ad\u8a00 python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u6240\u6709\u97f3\u4e50\u6309\u94ae\")) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) allure \u62a5\u544a\u4e2d\u5b9a\u4f4d\u95ee\u9898\u9664\u4e86\u65e5\u5fd7\u3001\u622a\u56fe\u3001\u5f55\u5c4f\u5916\uff0c\u8c03\u7528\u7684\u51fd\u6570\u589e\u52a0\u4e86 step \u6b65\u9aa4\u5c55\u793a\uff1b env.sh \u65b0\u589e\u5b89\u88c5\u5b50\u9879\u76ee Python \u4e09\u65b9\u4f9d\u8d56\uff0c\u5728\u5b50\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u5199 requirement.txt \u6587\u4ef6\uff0cenv.sh \u4f1a\u81ea\u52a8\u52a0\u8f7d\uff1b ocr \u8bc6\u522b\u65b0\u589e\u652f\u6301\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\u8fdb\u884c\u6587\u5b57\u8bc6\u522b\uff0c\u51cf\u5c11\u56e0\u5168\u5c4f\u8bc6\u522b\u65f6\uff0c\u5176\u4ed6\u6587\u5b57\u7684\u5e72\u6270 Python # \u65ad\u8a00\u97f3\u4e50\u7684\u5220\u9664\u5f39\u7a97\u4e2d\uff0c\u5305\u542b\u4e86\u201c\u786e\u8ba4\u201d\u7684\u6587\u5b57 self.assert_ocr_exist(\"\u786e\u8ba4\", picture_abspath=DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u5220\u9664\u5f39\u7a97\"))) \u65ad\u8a00\u51fd\u6570\u7684\u8c03\u7528\u4e5f\u4f1a\u81ea\u52a8\u6253\u5370\u65e5\u5fd7; env.sh \u65b0\u589e\u88c1\u526a\u4f9d\u8d56\u7684\u65b9\u6848\uff1b fix \u4fee\u590d Jenkins \u73af\u5883\u4e0b\uff0c apps \u76ee\u5f55\u4e0b\u5b50\u9879\u76ee\u5b58\u5728 auotest_deepin_xxx@tmp \u76ee\u5f55\uff0c\u5728\u4f20\u5165 app_name \u540e\u65e0\u6cd5\u6267\u884c\u7528\u4f8b\u7684\u95ee\u9898\uff1b \u4fee\u590d\u81ea\u52a8\u751f\u6210 case_list.csv \u6587\u4ef6\u65f6\uff0c\u7528\u4f8b\u987a\u5e8f\u88ab\u8c03\u6574\u7684\u95ee\u9898\uff1b env.sh \u73af\u5883\u5b89\u88c5\u79fb\u9664 git \u548c curl\uff1b \u4fee\u590d\u7528\u4f8b\u5728 setup \u9636\u6bb5\u62a5\u9519\u540e\uff0c\u672a\u5199\u5165 ci_result.json \u7684\u95ee\u9898\uff1b \u79fb\u9664 uos_ci.py\uff1b "},{"location":"RELEASE/#11320221028","title":"1.1.3\uff082022/10/28\uff09","text":"new \u65b0\u589e\u56fe\u50cf\u65ad\u8a00\u6210\u529f\u8f93\u51fa\u5339\u914d\u5ea6\uff1b \u65b0\u589e\u73af\u5883\u5b89\u88c5 yaml \u4f9d\u8d56\uff1b \u65b0\u589e\u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6570\u636e\u56de\u586b\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b \u65b0\u589e\u6d4b\u8bd5\u7ed3\u679c\u8868\u60c5\u663e\u793a\uff0c\u5e76\u4f18\u5316\u4e86\u65e5\u5fd7\u7684\u6392\u7248\uff1b \u65b0\u589e --top {number} \u7528\u4e8e\u8bb0\u5f55\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0c\u65e5\u5fd7\u751f\u6210\u5230 report/logs/top.log\uff1b fix \u4fee\u590d\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4f46\u7ec8\u7aef\u6ca1\u6709\u9519\u8bef\u65e5\u5fd7\u8f93\u51fa\u7684\u95ee\u9898\uff1b \u4fee\u6539\u5931\u8d25\u7528\u4f8b\u56de\u6eaf\u65e5\u5fd7\u4e3a\u8be6\u7ec6\u7ea7\u522b\uff1b \u4fee\u590d\u4e86\u6267\u884c\u8fdb\u5ea6\u672a\u8ba1\u7b97\u8df3\u8fc7\u7528\u4f8b\u7684\u95ee\u9898\uff0c\u5e76\u4f18\u5316\u4e86\u8fdb\u5ea6\u83b7\u53d6\u7684\u7b97\u6cd5\uff1b \u4fee\u590d env.sh \u5728 V23 \u73af\u5883\u4e0b\u5b89\u88c5\u65e0\u6cd5\u8bfb\u53d6\u5bc6\u7801\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 pms \u6d4b\u8bd5\u5957\u6267\u884c\u6216\u6d4b\u8bd5\u5355\u6267\u884c\u65f6\uff0c\u7528\u4f8bID\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b env.sh \u91cc\u9762 hub.deepin.com \u66f4\u6362\u6210 it.uniontech.com\uff1b uos_ci.py \u6d4b\u8bd5\u7ed3\u679c\u7edf\u8ba1\u65f6\uff0c\u603b\u6570\u5254\u9664 skip \u7684\u6570\u91cf "},{"location":"RELEASE/#11220220921","title":"1.1.2\uff082022/09/21\uff09","text":"new \u5728\u6ca1\u6709\u5b89\u88c5 dogtail \u7684\u60c5\u51b5\u4e0b\uff0c\u4e5f\u80fd\u4f7f\u7528 sniff \u5de5\u5177\uff1b fix \u4fee\u590d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e2d\u6ca1\u6709\u5b89\u88c5 AT \u73af\u5883\u6267\u884c uos_ci.py \u62a5\u9519\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11120220919","title":"1.1.1\uff082022/09/19\uff09","text":"new \u65b0\u589e\u6267\u884c\u8fdb\u5ea6\u663e\u793a\uff0c\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u65f6\u65e5\u5fd7\u8f93\u51fa\u5f53\u524d\u8fdb\u5ea6\uff1a[\u5f53\u524d\u6307\u5b9a\u7b2c\u51e0\u6761/\u7528\u4f8b\u603b\u6570]\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u7528\u4f8b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\u6240\u6709\u5931\u8d25\u7528\u4f8b\u7684\u5217\u8868\uff1b \u5173\u95ed\u7ec8\u7aef\u8f93\u51fa\u6355\u83b7\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u65e5\u5fd7\u5feb\u7167\uff1b \u4f18\u5316\u7ec8\u7aef\u8f93\u51fa\u5931\u8d25\u4fe1\u606f\u5197\u957f\u4e3a\u7b80\u8981\u4fe1\u606f\u8f93\u51fa\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u663e\u793a 10 \u4e2a\u6267\u884c\u6700\u6162\u7684\u7528\u4f8b\u5217\u8868\uff0c\u5e76\u8be6\u7ec6\u5217\u51fa\u5404\u4e2a\u9636\u6bb5\u7684\u8017\u65f6\uff1b \u5931\u8d25\u91cd\u8dd1\u7528\u4f8b\u91cd\u8dd1\u4e4b\u524d\u5ef6\u8fdf 1 \u79d2\uff1b \u65b0\u589e\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4ecd\u7136\u5f3a\u5236\u6267\u884c\uff1b \u7528\u4f8b\u6536\u96c6\u65f6\u4ec5\u5728 apps \u76ee\u5f55\u4e0b\u8fdb\u884c\uff0c\u5ffd\u7565 src,setting,public \u76ee\u5f55\uff1b \u65b0\u589e allure \u62a5\u544a\u5907\u4efd\u529f\u80fd\uff0c\u9ed8\u8ba4\u5907\u4efd\u81f3 allure_back \u76ee\u5f55\u4e0b\uff1b manage.py\u65b0\u589e\u53c2\u6570 --lastfailed \u7528\u4e8e\u53ea\u8dd1\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\u7684\u529f\u80fd\uff1b fix \u4fee\u590d\u4e86\u5728\u6ca1\u6709\u6307\u5b9a\u5e94\u7528\u540d\u79f0\u6267\u884c\u65f6\uff0cxml \u62a5\u544a\u751f\u6210\u8def\u5f84\u5f02\u5e38\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 uos_ci.py \u4f20\u5165 timeout \u548c session_timeout \u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11020220916","title":"1.1.0\uff082022/09/16\uff09","text":"new \u65b0\u589ePMS\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u652f\u6301\u591a\u79cd\u6570\u636e\u56de\u586b\u6a21\u5f0f\uff1b \u4f18\u5316\u4e86\u901a\u8fc7\u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u65f6PMS \u722c\u866b\u7684\u6027\u80fd\uff1b \u65b0\u589e .gitmodules \u6587\u4ef6\uff0c\u7528\u4e8e\u6807\u8bb0\u6240\u6709\u5b50\u9879\u76ee\uff0c\u65b9\u4fbf\u7edf\u4e00\u62c9\u53d6\u4ee3\u7801\uff1b env.sh \u9002\u914d\u793e\u533a\u7248\u4e0a\u5b89\u88c5\u81ea\u52a8\u5316\u73af\u5883\uff1b \u589e\u52a0\u6267\u884c\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u9519\u8bef\u7684\u529f\u80fd\uff1b README.md \u589e\u52a0 Wayland \u4e0b\u4f7f\u7528\u3001\u6d4b\u8bd5\u62a5\u544a\u67e5\u770b\u3001\u5e38\u89c1\u95ee\u9898\u7b49\u7684\u6587\u6863\u8bf4\u660e\uff1b \u589e\u52a0\u4e86\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u5bf9 setup\u3001call\u3001teardown \u8fdb\u884c\u65e5\u5fd7\u5206\u6bb5\uff1b fix \u4fee\u590d\u4e86 \u786e\u8ba4\u4fee\u590d \u5217\u6ca1\u5199\u8868\u5934\uff0c\u4f46\u5199\u4e86 fixed-xxx \u6807\u7b7e\uff0c\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u540c\u4e00\u5e94\u7528\u5185\u591a\u4e2a csv \u6587\u4ef6\u4e2d \u786e\u8ba4\u4fee\u590d \u5217\u6709\u7684\u5199\u4e86\uff0c\u6709\u7684\u6ca1\u5199\uff0c\u53ef\u80fd\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 INFO \u65e5\u5fd7\uff0c\u663e\u793a\u4e3a DEBUG \u7684\u95ee\u9898\uff1b\u4fee\u590d\u4e86\u90e8\u5206\u673a\u5668\u4e0a INFO \u65e5\u5fd7\u5185\u5bb9\u663e\u793a\u4e3a\u7ea2\u8272\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\u770b\u4e0d\u5230\u8be6\u7ec6\u4fe1\u606f\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10220220822","title":"1.0.2\uff082022/08/22\uff09","text":"new \u79fb\u9664 loguru\uff0c\u66ff\u6362\u4e3a logging\uff0c\u63a5\u53e3\u4fdd\u6301\u4e0d\u53d8\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u53d7\u5f71\u54cd\uff1b \u9ed8\u8ba4\u5f00\u542f coredump\uff1b fix \u4fee\u590d\u4e86\u4e09\u65b9\u5e93 loguru \u5076\u73b0\u5f02\u5e38\uff0c\u5bfc\u81f4\u7a0b\u5e8f\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7b2c\u4e00\u6b21\u5931\u8d25\u4e0d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10120220812","title":"1.0.1\uff082022/08/12\uff09","text":"new \u65b0\u589e RELEASE.md \u6587\u4ef6\uff0c\u7528\u4e8e\u8bb0\u5f55\u5386\u53f2\u53d1\u5e03\u7248\u672c\u7684\u66f4\u65b0\u5185\u5bb9\uff1b \u517c\u5bb9 Wayland \u6a21\u5f0f\u4e0b\u6267\u884c\u7528\u4f8b\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u7528\u7ba1\u5f53\u524d\u6d4b\u8bd5\u673a\u6267\u884c\u73af\u5883\uff0c\u6846\u67b6\u4f1a\u81ea\u52a8\u6839\u636e\u5f53\u524d\u73af\u5883\u8d70\u4e0d\u540c\u7684\u4ee3\u7801\u903b\u8f91\uff1b \u7531\u4e8e\u9700\u8981\u4fee\u6539 dogtail \u6e90\u4ee3\u7801\uff0c\u56e0\u6b64\u5c06\u4fee\u6539\u540e\u7684\u6e90\u7801\u653e\u5165\u5230\u6838\u5fc3\u5e93\u91cc\u9762 src/depends/dogtail \u540e\u7eed\u7248\u672c\u5c06\u4e0d\u9700\u8981\u5728\u7cfb\u7edf\u4e2d\u5b89\u88c5dogtail\uff1b \u5982\u679c\u5e94\u7528\u5e93\u540c\u6837\u4f7f\u7528\u4e86\u7cfb\u7edf\u5b89\u88c5\u7684 dogtail \u53ef\u80fd\u4f1a\u62a5\u9519\uff0c\u89e3\u51b3\u65b9\u6848\u662f\u5c06\u4ee3\u7801\u4e2d\u7684 import dogtail \u4fee\u6539\u4e3a from src.depends import dogtail ; fix \u91cd\u8dd1\u5931\u8d25\u4e4b\u540e\u624d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff0c\u4fee\u6539\u4e3a\u5931\u8d25\u4e4b\u540e\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":"# Attribution \uff1achengdu Test Team\n# Date \uff1a2021/08/20\n \u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d \u4ed3\u5e93\u5730\u5740\uff1ahttps://gitlabcd.uniontech.com/autotest/cd-desktop-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u65b9\u6848\u6982\u8ff0","text":"\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u667a\u80fd\u8bc6\u522b\u5e94\u7528\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u7528\u4e8e\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u64cd\u4f5c\u8fc7\u7a0b\u4e2d\u7684\u5143\u7d20\u5b9a\u4f4d\u4ee5\u53ca\u5224\u65ad\u7ed3\u679c\u65f6\u7684\u65ad\u8a00\u5904\u7406\uff1b\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\uff0c\u6d4b\u8bd5\u673a\u4e0a\u7684\u753b\u9762\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u5230\u670d\u52a1\u5668\u4e0a\uff0c\u670d\u52a1\u5668\u5bf9\u89c6\u9891\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\u540e\uff0c\u670d\u52a1\u5668\u667a\u80fd\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\u6210\u529f\uff0c\u7136\u540e\u5bf9\u6d4b\u8bd5\u673a\u4e0b\u53d1\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\uff0c\u6d4b\u8bd5\u673a\u63a5\u53d7\u5e76\u6267\u884c\u4e0b\u4e00\u6b65\u64cd\u4f5c\u3002 \u670d\u52a1\u5668\u4e0e\u6d4b\u8bd5\u673a\u4e4b\u95f4\u7684\u94fe\u63a5\uff1a \u670d\u52a1\u5668\u901a\u8fc7 USB \u4e32\u53e3\u8bbe\u5907\uff08USB-HID \u534f\u8bae\uff09\u6a21\u62df\u9f20\u6807\u952e\u76d8\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u64cd\u4f5c\u3002 \u901a\u8fc7\u89c6\u9891\u91c7\u96c6\u8bbe\u5907\u6355\u83b7\u6d4b\u8bd5\u673a\u7684\u5b9e\u65f6\u753b\u9762\u4f20\u8f93\u7ed9\u670d\u52a1\u5668\u3002 \u670d\u52a1\u5668\u5bf9\u91c7\u96c6\u7684\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\uff0c\u8bc6\u522b\u5176\u4e2d\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5e76\u8fd4\u56de\u5143\u7d20\u63a7\u4ef6\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\uff0c\u670d\u52a1\u5668\u901a\u8fc7\u667a\u80fd\u5316\u5206\u6790\uff0c\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e00\u81f4\u5c06\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\u901a\u8fc7\u4e32\u53e3\u6a21\u62df\u952e\u9f20\u4fe1\u53f7\u53d1\u9001\u7ed9\u6d4b\u8bd5\u673a\uff1b\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e0d\u4e00\u81f4\u5c06\u4f1a\u8fdb\u5165\u4e2d\u65ad\u5904\u7406\u53ca\u5f02\u5e38\u7ed3\u679c\u8f93\u51fa\uff0c\u7ee7\u7eed\u6267\u884c\u540e\u7eed\u573a\u666f\uff0c\u76f4\u81f3\u6240\u6709\u7528\u4f8b\u6d4b\u8bd5\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u6df1\u5ea6\u5b66\u4e60\u73af\u5883\u642d\u5efa","text":"\u6a21\u578b\u8bad\u7ec3\u4e3b\u8981\u5bf9 GPU \u6709\u8981\u6c42\uff0c\u8bad\u7ec3\u6a21\u578b\u7684\u673a\u5668\u663e\u5b58\u4e0d\u4f4e\u4e8e 6G\uff0c\u5176\u4ed6\u914d\u7f6e\u65e0\u7279\u6b8a\u8981\u6c42\u3002 \u63a8\u8350\u6027\u4ef7\u6bd4\u8f83\u9ad8\u914d\u7f6e \u64cd\u4f5c\u7cfb\u7edf: UnionTech OS Desktop 20 Professional Linux version 4.19.0-desktop-amd64 (deepin@deepin-PC) (Uos 8.3.0.3-3+rebuild) \u5904\u7406\u5668: Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz (\u516b\u6838 / \u5341\u516d\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460M-HDV(RD)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))/8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: TU116 [GeForce GTX 1660]\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u865a\u62df\u73af\u5883\u5b89\u88c5","text":"cd ~\nwget -c https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh\nbash Miniconda3-latest-Linux-x86_64.sh\n \u4e00\u8def\u56de\u8f66 \u7b2c\u4e00\u6b21\u63d0\u793a\u8f93\u5165 yes/no \uff1a\u8f93\u5165 yes \u7ee7\u7eed\u4e00\u8def\u56de\u8f66 \u7b2c\u4e8c\u6b21\u63d0\u793a\uff1a\u8f93\u5165 no cd ~/miniconda3/bin\nsudo chmod 777 activate\n \u6fc0\u6d3bconda\u73af\u5883 . ./activate\n \u6dfb\u52a0\u516c\u53f8\u5185\u7f51\u6e90 conda config --add channels bioconda\nconda config --add channels conda-forge\n \u5982\u679c\u662f\u5916\u7f51\u6dfb\u52a0\u5916\u7f51\u6e90 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/\n \u5982\u679c\u8981\u5220\u9664\u6e90 conda config --remove-key channels\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"2\u3001\u5b89\u88c5\u4f9d\u8d56","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u521b\u5efa\u865a\u62df\u73af\u5883","text":"conda remove --name mmlab --all # \u79fb\u9664\u6240\u6709\u865a\u62df\u73af\u5883\n conda create -n mmlab python=3.7\n conda activate mmlab\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-pytorch","title":"\uff082\uff09\u5b89\u88c5 Pytorch","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install torch==1.7.0+cu101 torchvision==0.8.1+cu101 torchaudio==0.7.0 -f https://download.pytorch.org/whl/torch_stable.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-mmcv","title":"\uff083\uff09\u5b89\u88c5 MMCV","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install mmcv-full==1.3.3 -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.7.0/index.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"\uff084\uff09\u5b89\u88c5\u663e\u5361\u9a71\u52a8","text":"\u6839\u636e\u4f60\u7684\u663e\u5361\u4e0b\u8f7d\u5bf9\u5e94\u9a71\u52a8\uff0c\u6bd4\u5982\u6211\u7684\u663e\u5361\u4e3a GTX1660\uff0c\u9a71\u52a8\u7248\u672c\u4e3a 430\uff0c\u9a71\u52a8\u4e0b\u8f7d\u5730\u5740\uff1ahttps://www.nvidia.cn/Download/Find.aspx?lang=cn CTRL+ALT+F2 \u8fdb\u5165tty\n \u7981\u7528 nouveau \u9a71\u52a8 sudo vim /etc/modprobe.d/blacklist-nouveau.conf\n \u586b\u5165\uff1a blacklist nouveau options nouveau modeset=0\n \u5237\u65b0\u914d\u7f6e\u6587\u4ef6 sudo update-initramfs -u reboot \u91cd\u542f\u540e\u518d\u8fdb\u5165 tty \u5173\u95ed\u56fe\u50cf\u754c\u9762\uff0c\u8f93\u5165\u547d\u4ee4\u5173\u95ed\u56fe\u50cf\u754c\u9762 sudo service lightdm stop\n \u5b89\u88c5\u9a71\u52a8 sudo chmod a+x NVIDIA-Linux-x86_64-430.run\nsudo ./NVIDIA-Linux-x86_64-430.run\n reboot\u91cd\u542f\uff0cnvidia-smi\u67e5\u770b\u5b89\u88c5\u72b6\u6001\u3002\u6ce8\u610f\u770b\u4e0bcuda\u7248\u672c\uff0c10.1\uff0cdriver\u7248\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u6570\u636e\u6807\u6ce8","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u6570\u636e\u6807\u6ce8","text":"\u6807\u6ce8\u4e4b\u524d\u9700\u8981\u5148\u8f6c\u6362\u56fe\u7247\u5927\u5c0f\uff0c\u5e76\u4e14\u4ee5\u6570\u5b57\u547d\u540d\uff0c\u6bcf\u7ec4\u547d\u540d\u9012\u589e"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"\uff081\uff09\u8f6c\u6362\u5927\u5c0f\u5e76\u91cd\u547d\u540d","text":"rename_pic.py import os\nimport sys\nimport cv2\nimport time\nimport getpass\nusername = getpass.getuser()\nsource_path = f\"/home/{username}/Desktop/right_menu\" # \u56fe\u7247\u8def\u5f84\nsource_dest = os.path.join('/'.join(source_path.split(\"/\")[:-1]), 'tmp')\nif not os.path.exists(source_dest):\nos.mkdir(source_dest)\nstart_name = sys.argv[1]\nfile_name_list = list()\nfor file in os.listdir(source_path):\nif file.endswith('.png'):\nfile_name_list.append(file)\nstart_name = int(start_name)\nfor file in file_name_list:\nos.rename(os.path.join(source_path,file), os.path.join(source_path, f\"{str(start_name)}.png\"))\nstart_name += 1\ntime.sleep(1)\nfor file in os.listdir(source_path):\nimage = os.path.join(source_path, str(file))\nsrc = cv2.imread(image)\nresult = cv2.resize(src, (960, 540))\nresizeImage = os.path.join(source_dest, str(file))\nprint(resizeImage)\ncv2.imwrite(str(resizeImage), result)\ncv2.waitKey(0)\ncv2.destroyAllWindows()\ntime.sleep(1)\nos.system(f'rm -rf {source_path}/*')\nos.system(f'mv {source_dest}/* {source_path}')\nos.system(f'rm -rf {source_dest}')\nprint(\"\u4e0b\u4e00\u4e2a\u5e8f\u53f7\uff1a\", start_name)\n \u6839\u636e\u7ec8\u7aef\u8f93\u51fa\u7684\u4e0b\u4e00\u4e2a\u5e8f\u53f7\u7684\u63d0\u793a\uff0c\u6267\u884c Python \u6587\u4ef6\u7684\u65f6\u5019\u4f20\u53c2\u3002 python rename_pic.py 249\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"\uff082\uff09\u5de5\u5177\u6807\u6ce8","text":"\u4f7f\u7528\u5de5\u5177 labelImg \u6807\u6ce8 sudo pip3 install PyQt5==5.13\nsudo pip3 install labelImg\n \u7ec8\u7aef\u76f4\u63a5\u8f93\u5165 labelImg\uff0c\u56de\u8f66 \u6807\u6ce8\u6a21\u5f0f\u9009\u62e9\uff1aPascalVOC"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u667a\u80fd\u6807\u6ce8","text":"\u6253\u5f00\u5c4f\u5e55\u5f55\u5236\u8f6f\u4ef6\uff0c\u5f55\u5236\u624b\u52a8\u64cd\u4f5c\u4e00\u6b21\u6d4b\u8bd5\u7528\u4f8b\uff0c\u7136\u540e\u5c06\u5f55\u5236\u7684\u89c6\u9891\u8fdb\u884c\u5206\u5e27\uff0c\u7136\u540e\u5bf9\u6bd4\u524d\u4e24\u5e27\u56fe\u6807\u76f8\u4f3c\u5ea6\uff0c\u5254\u9664\u76f8\u4f3c\u5ea6\u8fc7\u9ad8\u7684\u56fe\u7247\uff0c\u5728\u4fdd\u8bc1\u7d20\u6750\u591a\u6837\u6027\u7684\u524d\u63d0\u4e0b\uff0c\u5254\u9664\u91cd\u590d\u591a\u4f59\u7684\u56fe\u7247\u751f\u6210\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u96c6\uff0c\u7136\u540e\u53d6\u51fa\u63a7\u4ef6\u6a21\u677f\u6570\u636e\u96c6\uff0c\u901a\u8fc7 OpenCV \u6a21\u677f\u5339\u914d\u83b7\u53d6\u63a7\u4ef6\u5728\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u56fe\u7247\u4e2d\u6240\u5728\u7684\u5de6\u4e0a\u3001\u5de6\u4e0b\u3001\u53f3\u4e0a\u3001\u53f3\u4e0b\u56db\u5904\u5750\u6807\uff0c\u4ece\u800c\u6839\u636e\u6a21\u677f\u6570\u636e\u96c6\u751f\u6210\u6807\u6ce8\u6570\u636e\u3002\u53c2\u8003\u76ee\u5f55 AnnotationMaterial"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"\uff081\uff09\u6a21\u677f\u6570\u636e\u96c6\u51c6\u5907","text":"1\u3001\u5728\u754c\u9762\u622a\u53d6\u9700\u8981\u6807\u6ce8\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u653e\u5728\u76ee\u5f55\u4e0b AnnotationMaterial/template/img 2\u3001\u7ef4\u62a4\u63a7\u4ef6\u540d\u4e0e\u5143\u7d20\u63a7\u4ef6\u7684\u952e\u5bf9\uff0c\u4e00\u4e2a\u63a7\u4ef6\u540d\u53ef\u5bf9\u5e94\u591a\u4e2a\u5143\u7d20\u63a7\u4ef6 menu:\n- menu.jpg\n- menu1.jpg\n- menu2.jpg\n- menu3.jpg\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"\uff082\uff09\u7d20\u6750\u96c6\u51c6\u5907","text":"\u5f55\u5236\u89c6\u9891\u6216\u6216\u5c4f\u5e55\u622a\u56fe\u653e\u7f6e\u76ee\u5f55 AnnotationMaterial/source"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u5f00\u59cb\u6807\u6ce8","text":"python3 AnnotationMaterial/main.py\n \u751f\u6210\u7684\u6807\u6ce8\u6570\u636e\u5b58\u653e\u5728 AnnotationMaterial/result"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#mmdetection","title":"\u56db\u3001MMDetection","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1-mmdetection","title":"1\u3001 MMDetection \u4ee3\u7801","text":"MMDetection \u662f\u4e00\u4e2a\u6709\u540d\u7684\u6df1\u5ea6\u5b66\u4e60\u76ee\u6807\u68c0\u6d4b\u5f00\u6e90\u9879\u76ee\uff0c\u4e5f\u662f openMMlab \u7684\u62db\u724c\u9879\u76ee\uff0c\u4e3a\u4ec0\u4e48\u9009\u62e9\u5b83\uff0c\u5c0f\u5b69\u513f\u6ca1\u5a18\u8bf4\u6765\u8bdd\u957f\uff0c\u611f\u5174\u8da3\u53ef\u4ee5\u81ea\u884c\u6df1\u5165\u4e86\u89e3\uff1b \u4f60\u53ef\u4ee5\u76f4\u63a5\u5728 GitHub \u4e0a\u514b\u9686\u4ee3\u7801\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u54b1\u4eec\u4ed3\u5e93\u4e0b Train \u76ee\u5f55\u4e2d\u4ee3\u7801\uff0cTrain \u4e2d\u7684\u4ee3\u7801\u4e5f\u662f\u4ece GitHub \u4e0a\u62c9\u53d6\u7684\uff0c\u4e0d\u8fc7\u6211\u4eec\u6839\u636e\u9879\u76ee\u9700\u8981\u505a\u4e86\u4e00\u4e9b\u4e8c\u6b21\u5f00\u53d1\uff0c\u63a8\u8350\u76f4\u63a5\u4f7f\u7528\u5b83\u3002 \u5982\u679c\u4f60\u60f3\u4ece GitHub \u4e0a\u62c9\uff1a git clone https://github.com/open-mmlab/mmdetection.git\n# \u4e0d\u80fd\u76f4\u63a5\u62c9\u53d6\u4e3b\u5206\u652f\uff0c\u5efa\u8bae\u4f7f\u75282.12\u7248\u672c\uff0c\u4e0d\u540c\u7684\u7248\u672c\u5bf9\u5e94\u7684mmcv\u7248\u672c\u662f\u4e0d\u540c\u7684\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-voc2coco","title":"2\u3001\u62c9\u53d6 voc2coco \u4ee3\u7801","text":"git clone https://github.com/Tony607/voc2coco.git\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-coco","title":"3\u3001\u8f6c\u6362 coco \u6570\u636e\u96c6","text":"\u5c06\u6240\u6709\u7684\u56fe\u7247\u548cxml\u6587\u4ef6\u653e\u5165train2017\uff0c\u4ece\u4e2d\u6311\u9009\u51e0\u7ec4\u653e\u5165val2017\uff08\u6d4b\u8bd5\u96c6\uff09 cd mmdetection/data/coco\npython voc2coco.py train2017 annotations/instances_train2017.json\npython voc2coco.py val2017 annotations/instances_val2017.json\n \u751f\u6210json\u6587\u4ef6"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4_1","title":"4\u3001\u4fee\u6539\u914d\u7f6e","text":"\uff081\uff09\u8bfb\u53d6\u6a21\u578b\u540d\u79f0 import json\nmodule_name = []\nwith open('./instances_train2017.json', \"r+\") as f:\njson_file = f.read()\njson_dict = json.loads(json_file)\nmodule_list = json_dict.get('categories')\nfor module_info in module_list:\nname = module_info.get('name')\nmodule_name.append(name)\nprint(module_name)\nprint(\"module_num:\", len(module_name))\n # \u6ce8\u610f\u5bf9\u6bd4instances_train2017.json\u91cc\u9762\u6a21\u578b\u540d\u79f0\u7684\u987a\u5e8f\uff0c\u4e0eCLASSES\u548ccoco_classes\u91cc\u9762\u7684\u987a\u5e8f\u4fdd\u6301\u4e00\u81f4\u3002\n \uff082\uff09\u4fee\u6539 faster_rcnn_r101_2x_coco.py mmdetection/xianjin/faster_rcnn_r101_2x_coco.py \u4fee\u653946\u884c\uff0cnum_clasess\u7684\u503c\uff0c\u65b0\u589e1\u4e2a\uff0c\u5c31 +1\uff1b \uff083\uff09\u4fee\u6539 coco.py mmdetection/mmdet/datasets/coco.py CLASSES = ()\uff0c\u5728\u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b \uff084\uff09\u4fee\u6539 class_names.py mmdetection/mmdet/core/evaluation/class_names.py coco_classes \u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#5","title":"5\u3001\u7f13\u5b58\u6e05\u7406","text":"\u5220\u9664 mmdetection/build \u76ee\u5f55 python setup.py install\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#6","title":"6\u3001\u8bad\u7ec3\u6a21\u578b","text":"\uff081\uff09\u6307\u5b9a\u81ea\u5df1\u914d\u7f6e\u7684\u8bad\u7ec3\u6a21\u578b\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py --gpus 1\n \uff082\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u6d4b\u8bd5\u96c6\u7ed3\u679c\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py xianjin/epoch_24.pth --show\n \uff083\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u51c6\u786e\u5ea6\uff1b python tools/analysis_tools/analyze_logs.py plot_curve xianjin/20210530_011907.log.json --keys acc\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#7","title":"7\u3001\u5feb\u6377\u64cd\u4f5c","text":"python3 run.py\n \u5c06\u4ee5\u4e0a 4 - 7 \u6b65\u64cd\u4f5c\u6574\u5408\u6210 run.py\uff0c\u4e00\u952e\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u4e94\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\uff1b \u670d\u52a1\u7aef\u4e00\u53f0\uff08\u76ee\u524d\u4ec5\u652f\u6301AMD\u67b6\u6784\uff09\uff1b \u91c7\u96c6\u76d2\u4e00\u4e2a \uff08ACASIS hdmi\u89c6\u9891\u91c7\u96c6\u5361\uff0chttps://item.jd.com/10024310742602.html \uff09\uff1b USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\uff1b USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff1b \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5USB\u5ef6\u957f\u7ebf\uff1b \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u63a8\u8350\u914d\u7f6e","text":"\u6267\u884c\u7528\u4f8b\u7684\u670d\u52a1\u7aef\u5bf9\u914d\u7f6e\u6ca1\u6709\u7279\u6b8a\u8981\u6c42\uff0c\u5982\u679c\u6761\u4ef6\u5141\u8bb8\u914d\u7f6e\u8d8a\u9ad8\uff0c\u8bc6\u522b\u901f\u5ea6\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n \u6d4b\u8bd5\u673a\u4e0a\u4e0d\u6267\u884c\u4efb\u4f55\u811a\u672c\uff0c\u5177\u4f53\u914d\u7f6e\u6839\u636e\u6d4b\u8bd5\u9700\u8981\u51b3\u5b9a\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#usb_mk","title":"\u516d\u3001USB_MK\u4e32\u53e3\u9a71\u52a8\u65b9\u6cd5","text":"\u4f4d\u4e8econtrol_method\u76ee\u5f55\u4e0b\u7684usb_mk.py\u6587\u4ef6 \uff081\uff09\u5217\u51fa\u53ef\u901a\u4fe1\u7684\u7aef\u53e3 python3 -m serial.tools.list_ports -v\n \uff082\uff09\u4fee\u6539\u4e32\u53e3\u7684\u6743\u9650 sudo chmod 777 /dev/ttyACM0\n \uff083\uff09\u5b9e\u4f8b\u5316USB_MK import UsbMk\nusb_mk = UsbMk(\"/dev/ttyACM0\", 9600) # \u8bbe\u5907\u9ed8\u8ba49600\u4e3a\u6ce2\u7279\u7387\uff0c\u63a7\u5236\u4f20\u8f93\u901f\u7387\n \uff084\uff09USB\u4e32\u53e3\u8bbe\u5907\u9ed8\u8ba4\u6ce2\u7279\u7387\u4e3a9600\uff08\u7ecf\u6d4b\u8bd5\u6ce2\u7279\u73879600\u51c6\u786e\u6027\u6700\u597d\uff09\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up() # \u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u6c49\u5b57\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e\n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff083\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff084\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff085\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() # \u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2\n \uff086\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff087\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff088\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e03\u3001\u65b9\u6cd5\u8c03\u7528\u5165\u53c2\u89c4\u5219","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_7","title":"1\u3001\u57fa\u7c7b","text":"class Base:\ndef __init__(self):\nself._obj = image\nself._usb = usb_mk\ndef find_element_by_ai(self, element):\nreturn self._obj.find_element(element)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_6","title":"2\u3001\u5165\u53c2\u8bf4\u660e","text":"\u56fe\u50cf\u8bc6\u522b\u65b9\u6cd5\u5165\u53e3\u4e3a Base \u7c7b\u4e0b\u7684 find_element_by_ai \u3002\u4ec5\u63a5\u53d7\u4e00\u4e2a\u53c2\u6570 element\uff0c\u7c7b\u578b\u4e3a string\u3002 \u53ef\u8bc6\u522b\u7684 string \u683c\u5f0f\uff1a \uff081\uff09\u5927\u56fe\u6807\uff08 \u56fe\u6807\u5927\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\uff0c\u4f8b\uff1a Base().find_element_by_ai(\"window\")\n \uff082\uff09\u5927\u56fe\u6807 / \u5c0f\u56fe\u6807\uff08\u56fe\u6807\u5c0f\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5c0f\u56fe\u6807\uff0c\u4f8b\uff1awindow/search_btn Base().find_element_by_ai(\"window/search_btn\")\n \uff083\uff09\u5927\u56fe\u6807 / OCR\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\u5185\u7684\u6587\u5b57\uff0c\u4f8b\uff1amenu/\u5c5e\u6027 Base().find_element_by_ai(\"menu/\u5c5e\u6027\")\n \uff084\uff09OCR\uff1a\u5168\u5c4f\u8bc6\u522b\u6587\u5b57 Base().find_element_by_ai(\"\u641c\u7d22\")\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516b\u3001\u9690\u85cf\u9f20\u6807","text":"\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u8fc7\u6765\u7684\u89c6\u9891\u6d41\uff0c\u5728\u8bc6\u522b\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u53d7\u5230\u9f20\u6807\u5f71\u54cd\uff0c\u56e0\u6b64\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u9690\u85cf\u9f20\u6807\u3002 \u5c4f\u853d\u9f20\u6807\u5149\u6807\u663e\u793a ```shell script /etc/lightdm/lightdm.conf \u5728`[Seat:*]`\u4e0b\u9762\u6dfb\u52a0\u53c2\u6570\n```shell script\nxserver-command=X -bs -core -nocursor\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e5d\u3001\u667a\u80fd\u81ea\u52a8\u5316\u7684\u610f\u4e49","text":"1\u3001\u6539\u5584 Acessibility \u5b9a\u4f4d\u7684\u7a33\u5b9a\u6027\u95ee\u9898 Acessibility \u5c5e\u6027\u5b9a\u4f4d\u5b58\u5728\u5076\u5c14\u5931\u6548\u7684\u60c5\u51b5 \uff081\uff09\u5f00\u53d1\u5728\u505a\u65b0\u9700\u6c42\u5f00\u53d1\u65f6\u53ef\u80fd\u6d89\u53ca\u5230\u5bf9\u5c5e\u6027\u6807\u7b7e\u7684\u4fee\u6539\u6216\u8005\u5c42\u7ea7\u7684\u8c03\u6574\uff0c\u53ef\u80fd\u9020\u6210\u81ea\u52a8\u5316\u7528\u4f8b\u65e0\u6cd5\u5b9a\u4f4d\u5230\u5143\u7d20\u3002 \u6bd4\u59821040\u9636\u6bb5\uff0c\u97f3\u4e50\u91cd\u6784\u7684\u65f6\u5019\uff0c\u5f00\u53d1\u5bf9\u90e8\u5206\u5c5e\u6027\u548c\u5c42\u7ea7\u505a\u4e86\u4fee\u6539\uff0c\u5bfc\u81f4\u81ea\u52a8\u5316\u7528\u4f8b\u5b9a\u4f4d\u65b9\u6cd580%\u9700\u8981\u4fee\u6539\u3002 \u5f00\u53d1\u65b0\u529f\u80fd\u7684\u65f6\u5019\u5076\u5c14\u4e5f\u4f1a\u5bf9\u5c5e\u6027\u505a\u8c03\u6574\uff0c\u9047\u52305\u6b21\u3002 \uff082\uff09\u76ee\u524d\u4e3b\u8981\u4f7f\u7528Dogtail\u8bc6\u522b\u5e94\u7528Acessibility\u5c5e\u6027\u8fdb\u884c\u5b9a\u4f4d\uff0c\u662f\u83b7\u53d6\u5e94\u7528\u5f53\u524d\u754c\u9762\u7684\u5c5e\u6027tree\uff0c\u5728\u5e94\u7528\u8df3\u8f6c\u540e\uff0cDogtail\u5b58\u5728\u65e0\u6cd5\u53ca\u65f6\u83b7\u53d6\u5f53\u524d\u5c5e\u6027\u5217\u8868\u7684\u60c5\u51b5\u3002 \u591a\u5a92\u4f53\u8c03\u7528\u6587\u7ba1\u7a97\u53e3\u7684\u65f6\u5019\uff0c\u51fa\u73b0\u627e\u4e0d\u5230\u6587\u7ba1\u91cc\u9762\u5143\u7d20\u7684\u60c5\u51b5\uff0c\u76ee\u524d\u51fa\u73b010+\u6b21\u3002 \u5e94\u7528\u8bbe\u7f6e\u9875\u9762\u7684\u5c5e\u6027\u5076\u5c14\u5b58\u5728\u627e\u4e0d\u5230\u7684\u60c5\u51b5\uff0c\u9047\u52305\u6b21\u3002 \uff083\uff09Dogtail\u5de5\u5177\u672c\u8eab\u5b58\u5728\u95ee\u9898\uff0c\u6709\u65f6\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u5019\u5f88\u6162\uff0c\u8ba9\u4eba\u65e0\u6cd5\u63a5\u53d7\uff0c\u76ee\u524d\u51fa\u73b0\u8fc7\u5f88\u591a\u6b21\u3002 \u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u95f4\u6bd4\u5e73\u5e38\u61623\u500d\uff0c\u51fa\u73b04\u6b21\u3002 2\u3001\u89e3\u51b3\u4e86\u4f7f\u7528\u7edd\u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898 \u90e8\u5206\u63a7\u4ef6\u65e0\u6cd5\u6dfb\u52a0 Acessibility \u5c5e\u6027\u4ece\u800c\u4f7f\u7528\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u51fa\u73b0\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898\u3002 \uff081\uff09\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u65b9\u6cd5\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u76ee\u6807\u56fe\u7247\u8d44\u6e90\uff0c\u5728 UI \u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u4f1a\u6d89\u53ca\u5230\u76ee\u6807\u8d44\u6e90\u7684\u66ff\u6362\uff0c\u6bd4\u8f83\u8017\u8d39\u4eba\u529b\u3002 \uff082\uff09\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6cd5\u5bf9\u6bd4\u7cbe\u5ea6\u6bd4\u8f83\u641e\uff0c\u5982\u679cUI \u7684\u53d8\u66f4\u4f1a\u9020\u6210\u65e0\u6cd5\u51c6\u786e\u5b9a\u4f4d\u5230\uff0c\u81ea\u52a8\u5316\u811a\u672c\u5065\u58ee\u6027\u4e0d\u8db3\u3002 3\u3001\u4f7f\u7528\u673a\u5668\u5206\u79bb\uff0c\u89e3\u51b3\u4e86\u81ea\u52a8\u5316\u811a\u672c\u5bf9\u5e94\u7528\u7684\u5f71\u54cd\uff0c\u771f\u5b9e\u8fd8\u539f\u7528\u6237\u7684\u4f7f\u7528\u573a\u666f \u673a\u5668\u5206\u79bb\u7684\u67b6\u6784\u8bbe\u8ba1\uff0c\u4fdd\u8bc1\u4e86\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u73af\u5883\u5b8c\u5168\u7b49\u540c\u4e8e\u7528\u6237\uff0c\u6392\u9664\u6d4b\u8bd5\u811a\u672c\u7684\u5f71\u54cd\u3002 \uff081\uff09\u76ee\u524d\u7684\u529f\u80fd\u81ea\u52a8\u5316\u662f\u5728\u6d4b\u8bd5\u673a\u4e0a\u76f4\u63a5\u8fd0\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\uff0c\u52a0\u4e0a\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u6211\u4eec\u6dfb\u52a0\u4e86\u4e00\u4e9b\u8fdb\u7a0b\u76d1\u63a7\u3001\u89c6\u9891\u5f55\u5236\u7b49\u529f\u80fd\uff0c\u81ea\u52a8\u5316\u811a\u672c\u672c\u8eab\u4f1a\u6d88\u8017\u4e00\u4e9b\u7cfb\u7edf\u8d44\u6e90\uff0c\u65e0\u6cd5\u8fd8\u539f\u771f\u662f\u7684\u7528\u6237\u4f7f\u7528\u573a\u666f\u3002 \uff082\uff09\u6027\u80fd\u6d4b\u8bd5\u9700\u8981\u6392\u9664\u5176\u4ed6\u7a0b\u5e8f\u7684\u8d44\u6e90\u6d88\u8017\u5f71\u54cd\uff0c\u6027\u80fd\u81ea\u52a8\u5316\u91c7\u7528\u673a\u5668\u5206\u79bb\uff0c\u4fdd\u8bc1\u4e86\u6027\u80fd\u6570\u636e\u7684\u51c6\u786e\u6027\u3002 \u4ee5\u524d\u7684\u7528\u4f8b\u6267\u884c\u8017\u65f6\u6ca1\u6761\u572830\u79d2\u5de6\u53f3\uff0c\u73b0\u5728\u7528\u4f8b\u8017\u65f6\u572810\u79d2\u3002 4\u3001\u89e3\u51b3\u4e86UI \u8c03\u6574\u5bfc\u81f4\u5b9a\u4f4d\u5931\u8d25\u7684\u4e0d\u7a33\u5b9a\u6027\u95ee\u9898 \uff081\uff09\u89e3\u51b3\u4e86\u56e0 UI \u8c03\u6574\u5bfc\u81f4\u63a7\u4ef6\u4f4d\u7f6e\u53d8\u5316\u6216\u8272\u5dee\u53d8\u5316\u540e\u5b9a\u4f4d\u4e0d\u51c6\u786e\u7684\u95ee\u9898\uff0c\u53ea\u8981\u63a7\u4ef6\u6587\u6848\u548c\u63a7\u4ef6\u5916\u8fb9\u6846\u65e0\u53d8\u5316\u5747\u53ef\u51c6\u786e\u5b9a\u4f4d\uff1b \uff082\uff09\u76ee\u524d\u4e5f\u4f1a\u91c7\u7528\u57fa\u4e8eUI\u7684\u5b9a\u4f4d\u65b9\u6848\uff0c\u5982\u679cUI\u4f4d\u7f6e\u6709\u8c03\u6574\uff0c\u4f1a\u5bfc\u81f4\u5143\u7d20\u65e0\u6cd5\u5b9a\u4f4d\u3002 5\u3001\u7b80\u5316\u4e86\u7528\u4f8b\u7ed3\u6784\uff0c\u63d0\u5347\u7f16\u5199\u53cb\u597d\u5ea6 \uff081\uff09\u667a\u80fd\u81ea\u52a8\u5316\u8bc6\u522b\u5143\u7d20\u7684\u65b9\u6cd5\u53ea\u6709\u4e00\u4e2a\uff0c\u5c31\u662f\u57fa\u4e8e\u6211\u4eec\u8bad\u7ec3\u7684\u6a21\u578b\u8bc6\u522b\u89c6\u9891\u6d41\u4e2d\u7684\u5143\u7d20\uff0c\u7ecf\u8fc7\u811a\u672c\u5c01\u88c5\u4e4b\u540e\uff0c\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u4e2d\u6240\u6709\u5b9a\u4f4d\u7684\u64cd\u4f5c\u90fd\u53ea\u9700\u8981\u8c03\u7528\u8fd9\u4e00\u4e2a\u65b9\u6cd5\u5c31\u884c\u4e86\uff0c\u7f16\u5199\u81ea\u52a8\u5316\u811a\u672c\u7684\u96be\u5ea6\u5927\u5927\u964d\u4f4e\u3002 \uff082\uff09\u4e5f\u662f\u7531\u4e8e\u8c03\u7528\u65b9\u6cd5\u7b80\u5355\uff0c\u5728 UI \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u4e2d\u7684\u5206\u5c42\u7ed3\u6784\u5c06\u4f1a\u51cf\u5c11\uff0c\u591a\u7ee7\u627f\u7684\u60c5\u51b5\u4f1a\u51cf\u5c11\uff0c\u81ea\u52a8\u5316\u4ee3\u7801\u7684\u8c03\u7528\u7ed3\u6784\u4e5f\u4f1a\u53d8\u5f97\u7b80\u5355\uff0c\u800c\u4e14\u529f\u80fd\u6d4b\u8bd5\u540c\u5b66\u7f16\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u66f4\u52a0\u5bb9\u6613\u4e0a\u624b\u3002 \u4ee5\u524d\u5199\u7528\u4f8b\u7531\u4e8e\u9700\u8981\u7ed3\u5408\u4e0d\u540c\u7684\u6a21\u5757\uff0c\u8c03\u7528\u4e0d\u540c\u7684\u65b9\u6cd5\uff0c\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u5e76\u5b8c\u6210\u8c03\u8bd5\u7684\u65f6\u95f4\u5e73\u5747\u572820-30\u5206\u949f\uff0c\u73b0\u5728\u5199\u7528\u4f8b\u811a\u672c\u80fd\u57285\u5206\u949f\u5de6\u53f3\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":"# =============================================\n# Attribution : Application Test Department III\n# Time : 2023/1/3\n# Author : ut003281\n# =============================================\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u7b80\u8ff0","text":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5 \u901a\u8fc7\u81ea\u52a8\u5316\u624b\u6bb5\u5bf9\u5e94\u7528\u8fdb\u884c\u6027\u80fd\u6d4b\u8bd5\uff0c\u63d0\u4f9b\u65b9\u4fbf\u7684\u73af\u5883\u90e8\u7f72\u3001\u8fd0\u884c\u914d\u7f6e\u3001\u7528\u4f8b\u7f16\u5199\u7b49\uff0c\u7528\u4e8e\u684c\u9762\u5e94\u7528\u7684\u51b7\u70ed\u542f\u52a8\u3001\u8d44\u6e90\u62f7\u8d1d\u3001\u9875\u9762\u8df3\u8f6c\u7b49\u6027\u80fd\u573a\u666f\u6d4b\u8bd5\u3002 \u4ed3\u5e93\u5730\u5740\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-perf-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u4ee3\u7801\u7ed3\u6784","text":"autotest-perf-aitest\n\u251c\u2500\u2500 apps # \u5b58\u653e\u6240\u6709\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u811a\u672c\n\u251c\u2500\u2500 conftest.py # pytest hook\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 CURRENT # \u7248\u672c\u5185\u5bb9\n\u251c\u2500\u2500 docs # \u6587\u6863\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u952e\u503c\u5bf9\u7167\u8868.pdf # \u4e32\u53e3\u7ebfcode\u4e0e\u6309\u952e\u7684\u5bf9\u7167\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u6027\u80fd\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\u6267\u884c\u5668\u4f7f\u7528\u6307\u5357.md # \u6267\u884c\u5668\u811a\u672c\u4f7f\u7528\u6307\u5357\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 USB\u4e32\u53e3\u8f6cUSB\u952e\u76d8\u9f20\u6807\u7ebf\u534f\u8bae\u6587\u4ef6V1.0.pdf # \u4e32\u53e3\u534f\u8bae\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput-0.28.2.zip # Linux\u4e0b\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\u7684\u6e90\u7801\uff0c\u53ef\u6839\u636e\u67b6\u6784\u6253\u5305\n\u251c\u2500\u2500 manage.py # \u529f\u80fd\u4e3b\u5165\u53e3\n\u251c\u2500\u2500 pytest.ini # pytst \u914d\u7f6e\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 setting # \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 client.ini # \u6d4b\u8bd5\u673a IP \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5168\u5c40\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dev_env.sh # \u5bbf\u4e3b\u673a\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose_no_relay.yml # \u65e0\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose.yml # \u6709\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker_login.sh # docker \u767b\u9646\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 res\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 black.png # \u5168\u9ed1\u56fe\u7247\uff0c\u7528\u4e8e\u4fee\u6539\u58c1\u7eb8\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_5000.deb # 3A5000 \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_amd64.deb # amd \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_arm64.deb # arm \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_mips64.deb # mips \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_sw_64.deb # sw \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 server.ini # \u670d\u52a1\u5668\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 setup.sh # \u5bb9\u5668\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 template # \u521b\u5efa app \u57fa\u7840\u811a\u672c\u6a21\u677f\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 app_template\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ${app_name}_widget.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 control-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 images\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 test_${app_name}_01_scene.json-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 test_${app_name}_01_scene.py-tpl\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 uos_docker # \u5bb9\u5668\u73af\u5883\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dockerfile\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 requirements.txt\n\u2514\u2500\u2500 src\n \u251c\u2500\u2500 analysis_save.py # \u89e3\u6790\u56fe\u7247\u6d41\u7ed3\u679c\uff0c\u6c47\u603b\u751f\u6210 excel \u62a5\u544a\n\u251c\u2500\u2500 base_widget.py # \u5c01\u88c5\u7684\u57fa\u7840\u64cd\u4f5c\uff0c\u5e94\u7528\u8c03\u7528\u7684\u4e3b\u5165\u53e3\u65b9\u6cd5\n\u251c\u2500\u2500 cmdctl.py # \u8c03\u7528\u547d\u4ee4\u884c\u4f7f\u7528\n\u251c\u2500\u2500 global_value.py # \u5168\u5c40\u53d8\u91cf\n\u251c\u2500\u2500 image_utils.py # \u56fe\u7247\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 __init__.py\n \u251c\u2500\u2500 logger_utils.py # \u65e5\u5fd7\u914d\u7f6e\n\u251c\u2500\u2500 pdocr.py # ocr \u914d\u7f6e\n\u251c\u2500\u2500 public_method.py # \u4e00\u4e9b\u65b9\u4fbf\u7684\u5c01\u4f4f\n\u251c\u2500\u2500 record.py # \u5f55\u5c4f\u76f8\u5173\n\u251c\u2500\u2500 rtk # \u8fd0\u884c\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 _base.py # \u4e00\u4e9b\u679a\u4e3e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 install_env.py # \u5b89\u88c5\u73af\u5883\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 local_runner.py # \u8fd0\u884c\u7528\u4f8b\n\u251c\u2500\u2500 serial_communication # \u4e32\u53e3\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 power_control.py # \u7ee7\u7535\u5668\u64cd\u4f5c\uff0c\u4f7f\u7528\u7ee7\u7535\u5668\u8fde\u63a5\u4e3b\u673a\u7535\u6e90\uff0c\u63a7\u5236\u5f00\u5173\u673a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 serial_common.py # \u4e32\u53e3\u516c\u5171\u65b9\u6cd5\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 usb_mk.py # \u952e\u9f20\u64cd\u4f5c\u57fa\u7840\u5c01\u88c5\n\u251c\u2500\u2500 shortcut_key.py # \u5feb\u6377\u952e\u7684\u5c01\u88c5\n\u251c\u2500\u2500 singleton.py # \u5355\u4f8b\u6a21\u5f0f\n\u251c\u2500\u2500 start_app.py # \u521b\u5efa app\n\u2514\u2500\u2500 write_xlsx.py # \u751f\u6210 excel\n# __init__.py \u6587\u4ef6\u4e3a\u6807\u8bc6\u8be5\u76ee\u5f55\u662f\u4e00\u4e2aPython\u7684\u6a21\u5757\u5305\uff0c\u9879\u76ee\u4e2d\u7684__init__.py\u5747\u4e3a\u7a7a\u6587\u4ef6\u3002\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u73af\u5883\u642d\u5efa","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\u3002 \u670d\u52a1\u7aef\u4e00\u53f0\u3002\uff08\u4ec5\u652f\u6301 AMD \u67b6\u6784\uff0c\u82e5\u9700\u5176\u4ed6\u67b6\u6784\uff0c\u54a8\u8be2\u76f8\u5173\u5f00\u53d1\u4eba\u5458\uff09 \u91c7\u96c6\u76d2\u4e00\u4e2a\u3002 \uff08ACASIS HDMI \u89c6\u9891\u91c7\u96c6\u76d2\uff0chttps://item.jd.com/100013302599.html#crumb-wrap \uff09 USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\u3002\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"\uff082\uff09\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\u3002 USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff08USB3.0 \u63a5\u53e3\u4e0a\uff09\u3002 \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5 USB \u5ef6\u957f\u7ebf\u3002 \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u670d\u52a1\u7aef\u63a8\u8350\u914d\u7f6e","text":"\u914d\u7f6e\u8d8a\u9ad8\uff0c\u89e3\u6790\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"2\u3001\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa","text":" \u6253\u5f00\u63a7\u5236\u4e2d\u5fc3\uff0c\u8d26\u6237\u8bbe\u7f6e\u4e3a\u3010\u81ea\u52a8\u767b\u5f55\u3011\u548c\u3010\u65e0\u5bc6\u7801\u767b\u5f55\u3011\uff0c\u7535\u6e90\u7ba1\u7406\u4e2d\u4f7f\u7528\u7535\u6e90\u5168\u90e8\u8bbe\u7f6e\u4e3a\u3010\u4ece\u4e0d\u3011\uff0c\u5f00\u542f\u5f00\u53d1\u8005\u6a21\u5f0f\u3002 \u6839\u636e\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u8981\u6c42\uff0c\u5bfc\u5165\u76f8\u5173\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\uff1a\u5bfc\u5165\u76f8\u518c\u3001\u5f71\u9662\u3001\u97f3\u4e50\u7684\u6d4b\u8bd5\u8d44\u6e90\u3002 \u5728\u670d\u52a1\u7aef\u6253\u5f00\u76f8\u673a\u5e94\u7528\u540e\uff0c\u5c06\u6d4b\u8bd5\u673a\u684c\u9762\u58c1\u7eb8\u66f4\u6362\u4e3a\u7eaf\u8272\u58c1\u7eb8\uff08\u6ce8\u610f\uff0c\u670d\u52a1\u7aef\u9700\u63d0\u524d\u5f00\u542f\u76f8\u673a\u540e\u518d\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u58c1\u7eb8\uff0c\u5efa\u8bae\u7eaf\u9ed1\u58c1\u7eb8 setting/res/black.png\uff09 \u5728\u6587\u4ef6\u7ba1\u7406\u5668\u4e2d\uff0c\u5c06\u9009\u9879 \u4e3b\u83dc\u5355-\u8bbe\u7f6e-\u9884\u89c8-\u56fe\u7247\u9884\u89c8 \u53d6\u6d88\u52fe\u9009\uff08\u5982\u4e0d\u53d6\u6d88\uff0c\u4f1a\u5f71\u54cd\u622a\u56fe\u5f55\u5c4f\u5e94\u7528\u7684\u6027\u80fd\u6570\u636e\uff09 \u79fb\u52a8\u6216\u5220\u9664\u7cfb\u7edf Logo \uff0c\u6392\u9664\u684c\u9762\u53f3\u4e0b\u89d2 Logo \u7684\u5f71\u54cd\uff08\u91cd\u542f\u751f\u6548\uff09\u3002 sudo mv /usr/share/deepin/uos_logo.svg ~/Pictures/\n \u5b89\u88c5\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\uff08\u5fc5\u987b\u5b89\u88c5\uff01\uff01\uff09 AMD \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_amd64.deb ARM \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_arm64.deb MIPS \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_mips64.deb 3A5000 \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_5000.deb \u5b89\u88c5\u547d\u4ee4 sudo dkpg -i xserver-xorg-input-libinput_0.28.2-2_amd64.deb\n \u5b89\u88c5\u65f6\u4f1a\u63d0\u793a\u5df2\u5b58\u5728\u76f8\u540c\u7248\u672c\uff0c\u8bf7\u5ffd\u7565\uff0c\u76f4\u63a5\u8986\u76d6\u5b89\u88c5\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u4e3b\u673a\u624d\u751f\u6548"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u670d\u52a1\u7aef\u4e00\u952e\u73af\u5883\u90e8\u7f72","text":"\u73af\u5883\u642d\u5efa\u524d\u5fc5\u987b\u5148\u8fde\u63a5\u4e0a USB \u4e32\u53e3\u7ebf\u548c\u91c7\u96c6\u76d2\u3002 \u5bbf\u4e3b\u673a\u73af\u5883\u5b89\u88c5 python3 manage.py install --env host\n \u5bb9\u5668\u73af\u5883\u5b89\u88c5 python3 manage.py install --env docker\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u56db\u3001\u914d\u7f6e\u9879","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u670d\u52a1\u7aef\u914d\u7f6e","text":"setting/config/server.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u914d\u7f6e\u9879\uff0c\u5305\u542b\u4e86\u6240\u6709\u670d\u52a1\u7aef\u6240\u6709\u7684\u53ef\u914d\u7f6e\u9879\u3002 \u672c\u5730\u65e0\u7f51\u7edc\u8fd0\u884c \u5c06\u914d\u7f6e\u9879 network=0 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u672c\u5730\u6709\u7f51\u7edc\u8fd0\u884c \u914d\u7f6e\u9879 network=1 (1)\u914d\u7f6e\u9879 client_alias= \u914d\u7f6e\u4e3a\u4f60\u8981\u6d4b\u8bd5\u7684\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5982 Alias1 \u6d4b\u8bd5\u673a\u522b\u540d\u5728 setting/config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 (2)\u914d\u7f6e\u9879 client_alias= \u4e3a\u7a7a\uff0c\u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager --client_alias Alias1\uff0c\u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002(Alias1 \u4e3a\u4f60\u914d\u7f6e\u7684\u6d4b\u8bd5\u673a\u522b\u540d) (1)\u548c(2)\u53ea\u8981\u4f7f\u7528\u5176\u4e00\u5373\u53ef\u3002 \u6709\u7f51\u7edc\u8fd0\u884c\uff0c\u4e14\u9700\u8981\u901a\u8fc7 Jenkins \u4e0a\u8fd0\u884c\u4e00\u4e2a job \uff0c\u540c\u65f6\u63a7\u5236\u591a\u53f0\u673a\u5668\u3002 \u914d\u7f6e\u9879 network=1 \u914d\u7f6e\u9879 client_alias= \u4e0d\u7528\u914d\u7f6e\uff0c\u5728\u8fd0\u884c run.sh \u7684\u65f6\u5019\u76f4\u63a5\u7a7a\u683c\u52a0\u522b\u540d\u5373\u53ef\uff0c\u6bd4\u5982\uff1a\u6d4b\u8bd5\u673a\u522b\u540d\u4e3a Alias1 \uff0c\u4e14\u5df2\u7ecf\u5728 config/client.ini \u4e2d\u914d\u7f6e\u4e86 Alias1 \u7684user ip password \uff0c\u5219\u8fd0\u884c bash run.sh Alias1 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u5728 Jenkins pipeline \u91cc\u9762\u901a\u8fc7\u5e76\u884c stage \u6216\u5e76\u884c\u8c03\u7528\u4e0b\u5c42\u4efb\u52a1\u7684\u65b9\u5f0f\u53ef\u4ee5\u5b9e\u73b0\u5927\u89c4\u6a21\u7684\u6027\u80fd\u6d4b\u8bd5\u9700\u6c42\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;1\u3001KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2\u3001KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f, e.g. TAGS = L1 or smoke\n[case_conf]\n# \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\uff0cocr\u6587\u6848\u8bc6\u522b\u8f83\u6162\uff0c\u4e0d\u63a8\u8350\u4f7f\u7528\nfind_by = stage\n# \u6700\u540e\u4e00\u4e2a\u7a33\u5b9a\u9636\u6bb5\u7684\u5e27\u6570\u8bc6\u522b\n# \u9996\u5e27\u5b58\u5728\u540e\u7684\u7b2c\u4e00\u4e2a\u5927\u4e8e\u8be5\u914d\u7f6e\u5e27\u6570\u7684\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u5c3e\u5e27\nfinal_stable_num=100\n# \u4ece\u8be5\u5e27\u6570\u5f00\u59cb\u8bc6\u522b\u6587\u6848\u6216\u56fe\u7247\uff0c\u51cf\u5c11\u5206\u6790\u65f6\u95f4\nstart_num = 150\n# \u8bc6\u522b\u7684\u6587\u6848\ntext=\n# \u8bc6\u522b\u56fe\u7247\nmatch=apps/xxx/images/match.png\n# \u8bc6\u522b\u76f8\u4f3c\u5ea6\nmatch_rate=0.9\n# \u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6bd4\u5982\u70ed\u542f\u52a8\u7528\u4f8b\uff0c\u4ece\u70b9\u51fb\u6253\u5f00\u5230\u505c\u6b62\u5f55\u5c4f\uff0c\u4e2d\u95f4\u7b49\u5f855\u79d2\uff1b\nduration = 15\n# \u5355\u6761\u7528\u4f8b\u6267\u884c\u7684\u6b21\u6570\ncount = 5\n# \u7a33\u5b9a\u9636\u6bb5\u5212\u5206\u7684\u76f8\u4f3c\u5ea6\nstable_similarity = 0.9997\n[server]\n# \u8c03\u8bd5\u6a21\u5f0f=1\uff0c\u4e3a\u5f00\u542f\u8c03\u8bd5\u6a21\u5f0f\uff0c0\u4e3a\u5173\u95ed\u3002\n# \u8c03\u8bd5\u6a21\u5f0f\u4e0b\u9ed8\u8ba4\u53ea\u6267\u884c\u4e00\u6b21\u7528\u4f8b\uff0c\u4e0d\u5173\u673a\n# \u7f16\u5199\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u5efa\u8bae\u5f00\u542fmaintain\u3002\nMAINTAIN = 0\n# \u8fd0\u884c\u7684\u73af\u5883docker\u5bb9\u5668\u73af\u5883\uff0chost\u5bbf\u4e3b\u673a\u73af\u5883\nENV = docker\n# \u670d\u52a1\u7aef\u5bc6\u7801\nPASSWORD=1\n# \u6307\u5b9a\u6d4b\u8bd5\u673a\u522b\u540d\n# \u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6bd4\u5982\uff1a\n# [AMD]\n# ip=10.8.15.86\n# user=uos\n# \u5176\u4e2d AMD \u4e3a\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5219client_alias=AMD\nCLIENT_ALIAS = x86\uff08Intel-i7\uff09\n# 1 \u5f00\u542f\u7f51\u7edc, 0 \u5173\u95ed\u7f51\u7edc\n# \uff081\uff09\u670d\u52a1\u7aef\u4e0e\u6d4b\u8bd5\u673a\u987b\u5728\u540c\u4e00\u7f51\u6bb5\u4e0b\uff0c\u4f60\u53ef\u4ee5\u5c1d\u8bd5\u5728\u670d\u52a1\u7aef\u901a\u8fc7ssh\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c\u5982\u679c\u53ef\u4ee5\u8fde\u63a5\uff0c\u8bf4\u660e\u7f51\u7edc\u6b63\u5e38\u3002\n# \uff082\uff09\u5f53input_type=FILE_NAME \u65f6\uff0c\u5fc5\u987b\u5f00\u542f\u7f51\u7edc\u3002\nNETWORK = 1\n# \u6027\u80fd\u7ed3\u679c\u7edf\u8ba1\u5355\u4f4d \u6beb\u79d2\u2014ms, \u79d2\u2014s\nUNIT=ms\n# \u6d4b\u8bd5\u673a\u5f00\u673a\u8fdb\u5165\u684c\u9762\u540e\u7b49\u5f85\u65f6\u95f4,\u5355\u4f4d/\u79d2\nSTARTUP_DELAY = 60\n# 1\u4e3a\u5220\u9664\u7f13\u5b58\uff0c0\u4e3a\u4e0d\u5220\u9664\u7f13\u5b58\n# \u7528\u4f8b\u6267\u884c\u5b8c\u540e\u4f1a\u5728report\u76ee\u5f55\u4e0b\u751f\u6210\u667a\u80fd\u89e3\u6790\u7684\u4e00\u4e9b\u7f13\u5b58\u56fe\u7247\u3002\nCACHE = 0\n# \u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u62a5\u544a\u4f1a\u4fdd\u5b58\u5728\u9879\u76ee\u4e0breport\u76ee\u5f55\u4e2d\uff1b\n# \u6307\u5b9a\u62a5\u544a\u76ee\u5f55\u5219\u5b58\u653e\u5230\u6307\u5b9a\u76ee\u5f55\u3002\nREPORT_PATH = report\n# \u670d\u52a1\u7aef\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684icon\u8d44\u6e90\u4f1a\u7f13\u5b58\u5728\u9879\u76ee\u4e0binput\u76ee\u5f55\u4e2d\nINPUT = input/\n# 1\u4e3a\u6d4b\u8bd5\u5b8c\u5173\u673a\uff0c0\u4e3a\u6d4b\u8bd5\u5b8c\u4e0d\u5173\u673a\nSHUTDOWN = 0\n# \u89e3\u6790\u8fdb\u7a0b\u6570\uff08\u4e0d\u63a8\u8350\u4fee\u6539\uff09\n# 3\u4e2a\u8fdb\u7a0b\u89e3\u6790\u89c6\u9891\u5df2\u7ecf\u80fd\u591f\u6ee1\u8db3\uff0c\u5373\u4f7f\u589e\u52a0\u8fdb\u7a0b\u6570\u4e5f\u4e0d\u80fd\u51cf\u5c11\u6574\u4f53\u8017\u65f6\n# \u53e6\u5916\u8fd8\u8981\u770bCPU\u6838\u6570\u662f\u5426\u652f\u6301\u3002\nPARSING_PROCESS = 3\n# 1\u4e3a\u4f7f\u7528\u7ee7\u7535\u5668\u5f00\u5173\u673a\uff0c0\u4e3a\u4f7f\u7528reboot\u547d\u4ee4\u91cd\u542f\u3002\u4f9d\u8d56\u7ee7\u7535\u5668\u786c\u4ef6\u8bbe\u5907\uff0c\u9700\u8981\u4f7f\u7528\u8054\u7cfb\u5f00\u53d1\u8005\nRELAY = 0\n# \u83b7\u53d6\u6d4b\u8bd5\u5e94\u7528\u7684\u7248\u672c, %s \u5360\u4f4d\u5e94\u7528\u540d\n# \u5982\u679c\u8be5\u914d\u7f6e\u4e3a\u7a7a\uff0c\u5219\u4e0d\u83b7\u53d6\u5e94\u7528\u7684\u7248\u672c\u4fe1\u606f\u3002\nCOMMAND = apt policy %s 2>/dev/null|grep \"\u5df2\u5b89\u88c5\"|awk -F \"\uff1a\" \"{print \\$2}\"\n# \u5173\u673a\u7b49\u5f85\u5f00\u542f\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6839\u636e\u6d4b\u8bd5\u673a\u6027\u80fd\u4e0d\u540c\uff0c\u5f00\u5173\u673a\u8017\u65f6\u53ef\u80fd\u4e0d\u540c\uff0c\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u673a\u60c5\u51b5\u914d\u7f6e\u3002\nSHUTDOWN_DELAY = 30\n# \u53ef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u56fe\u7247\u683c\u5f0f\uff0c\u4ee5\u82f1\u6587\u9017\u53f7\u9694\u5f00\u3002\n# \u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u76ee\u524d\u6211\u4eec\u4ec5\u9a8c\u8bc1\u4e86jpg,jpeg,png\u8fd9\u4e09\u79cd\u5e38\u7528\u7684\u56fe\u7247\u683c\u5f0f\u3002\nINPUT_TYPES = jpg,jpeg,png\n# \u6027\u80fd\u5206\u6790\u8865\u5e27\uff0c\u7b49\u4e8e\u6216\u4f4e\u4e8e\u8be5\u503c\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u9700\u8981\u51cf\u6389\u3002\nUN_STAB_START = 3\n# \u670d\u52a1\u7aef\u83b7\u53d6\u6d4b\u8bd5\u673a\u56fe\u50cf\u7684\u5e27\u7387\uff0c\u5373\u6bcf\u79d2\u83b7\u53d6\u591a\u5c11\u5f20\u6d4b\u8bd5\u673a\u4e0a\u7684\u56fe\u50cf\u3002\n# \u9ed8\u8ba4\u5e27\u7387\u4e3a30\u5e27/\u79d2\uff0c\u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u53ef\u80fd\u4f1a\u5bf9\u89e3\u6790\u7ed3\u679c\u9020\u6210\u504f\u5dee\u3002\nFPS = 30\n# \u4ee5\u4e0b\u573a\u666f\u7c7b\u578b\u4f1a\u91cd\u542f\u6d4b\u8bd5\u673a,\u591a\u79cd\u573a\u666f\u4f7f\u7528\u9017\u53f7\u9694\u5f00\nSCENE = cold\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = http://10.8.13.78:8890\n#\u5c4f\u5e55\u56fe\u7247\u4e34\u65f6\u5b58\u653e\u4f4d\u7f6e\nSCREEN_CACHE = /tmp/screen\n# =======================================\n[log]\n# \u65e5\u5fd7\u7ea7\u522b\uff0cOFF\u3001FATAL\u3001ERROR\u3001WARN\u3001INFO\u3001DEBUG\u3001ALL\n# \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u65e5\u5fd7\u8f93\u51fa\uff0clog_cli=INFO\u8868\u793a \u4ec5\u8f93\u51faINFO\u53ca\u4ee5\u4e0a\u7ea7\u522b\u7684\u65e5\u5fd7\u3002\nLOG_LEVEL = DEBUG\n# \u65e5\u5fd7\u6587\u4ef6\u4fdd\u5b58\u8def\u5f84\nLOG_PATH= logs\n# =======================================\n[dockerhub]\n# \u5bb9\u5668\u767b\u9646\u8d26\u53f7\nDOCKER_USER = user\n# \u5bb9\u5668\u767b\u9646\u5bc6\u7801\nDOCKER_PASSWORD = User1234\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u6d4b\u8bd5\u673a\u914d\u7f6e","text":"setting/config/client.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u4fe1\u606f\u3002 \u6709\u7f51\u7edc\u7684\u60c5\u51b5\u4e0b\uff0c\u670d\u52a1\u7aef\u9700\u8981\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u56e0\u6b64\u4f60\u9700\u8981\u5199\u5165 \u6d4b\u8bd5\u673a\u522b\u540d \u3001 user \u3001ip\u3001 password \u3002 # \u6d4b\u8bd5\u673a\u522b\u540d\n[Alias1] # \u6d4b\u8bd5\u673aip\nip=10.8.15.86 # \u6d4b\u8bd5\u673a\u7528\u6237\u540d\nuser=uos\n \u547d\u540d\u5efa\u8bae\uff1aAliasA1\u3001AliasA2\u3001AliasB1\u3001AliasB2\uff0c\u4e0d\u8981\u91cd\u540d\u3002 \u65e0\u7f51\u7edc\u60c5\u51b5\u4e0b\uff0c\u4ec5\u9700\u8981\u5173\u6ce8\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\u9879 width=\u3001 height= \u5373\u53ef\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a [client]\n# \u9ed8\u8ba4\u6d4b\u8bd5\u673a\u7528\u6237\u540d\uff0c\u5bc6\u7801\uff0cip\nip=\nuser=\n# \u6d4b\u8bd5\u673a\u5bc6\u7801\npassword=1\n# \u6d4b\u8bd5\u673a\u4e3b\u9898\ntheme=bloom\n# \u6d4b\u8bd5\u673aicon\u76ee\u5f55\npath=/usr/share/icons\n# \u7cfb\u7edfdesktop\u6587\u4ef6\u7684\u5b58\u653e\u76ee\u5f55\uff0cUOS\u7cfb\u7edf\u9ed8\u8ba4\u4e3a/usr/share/applications\ndesktop_path=/usr/share/applications\n# \u7528\u4e8e\u5224\u65ad\u6d4b\u8bd5\u673a\u662f\u5426\u5f00\u673a\u8fdb\u5165\u684c\u9762\u7684\u8bc6\u522b\u6807\u8bc6\u3002\n# 1\u3001\u901a\u8fc7\u684c\u9762\u56fe\u6807\u8bc6\u522b\u3002\n# - type=FILE_NAME\u65f6\uff0c\u670d\u52a1\u5668\u548c\u6d4b\u8bd5\u673a\u5fc5\u987b\u5728\u540c\u4e00\u5c40\u57df\u7f51\u5185\u3002\n# - power_on=dde-computer\u8868\u793a\u901a\u8fc7\u684c\u9762\u8ba1\u7b97\u673a\u56fe\u6807\u5224\u65ad\u5f00\u673a\u8fdb\u5165\u684c\u9762\u3002\n# 2\u3001\u901a\u8fc7\u672c\u5730\u56fe\u7247\u4f5c\u4e3a\u5f00\u673a\u8bc6\u522b\u3002\n# - type= \u4f20\u5165\u4e3a\u56fe\u7247\u683c\u5f0f\uff0ctype\u652f\u6301\u7684\u7c7b\u578b\u5305\u542b\u5728server.ini\u5185\u914d\u7f6e\u9879input_type=jpg,jpeg,png\u3002\n# - power_on= \u4f20\u5165\u7684\u662f\u672c\u5730\u56fe\u7247\u7684\u8def\u5f84\u3002\ntype=FILE_NAME\npower_on=dde-computer\n# \u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\uff08\u6d4b\u8bd5\u673a\u8fde\u63a5\u91c7\u96c6\u76d2\uff0c\u91c7\u96c6\u76d2\u7684\u5206\u8fa8\u7387\uff09\nheight=1080\nwidth=1920\n[AliasA1] ip=10.8.15.86\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n[AliasA2]\nip=10.8.15.20\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_2","title":"3\u3001\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e","text":"\u968f\u7740\u6d4b\u8bd5\u573a\u666f\u7684\u4e0d\u65ad\u5f15\u5165\uff0c\u53d1\u73b0\u73b0\u6709\u670d\u52a1\u7aef\u91cc\u7684\u914d\u7f6e\u9879\u5e76\u4e0d\u9002\u7528\u4e8e\u6240\u6709\u7684\u6027\u80fd\u573a\u666f\uff0c\u4e8e\u662f\u5c06\u670d\u52a1\u7aef\u914d\u7f6e\u8fdb\u884c\u4e00\u4e2a\u63d0\u53d6\uff0c\u53ef\u505a\u5355\u4e2a\u573a\u666f\u7684\u4e2a\u6027\u5316\u914d\u7f6e\uff0c\u5f53\u7136\u539f\u6765\u7684\u670d\u52a1\u7aef\u914d\u7f6e\u529f\u80fd\u4fdd\u7559\uff0c\u53ea\u662f\u5f53\u4f60\u914d\u7f6e\u4e86\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e\u540e\uff0c\u4f18\u5148\u4f7f\u7528\u4e2a\u6027\u5316\u914d\u7f6e\u91cc\u9762\u7684\u5185\u5bb9\uff0c\u4ee5\u4e0b\u662f\u5bf9\u4e2a\u6027\u5316\u914d\u7f6e\u7684\u4ecb\u7ecd\u3002 \u76ee\u524d\u6bcf\u4e00\u4e2a py \u6587\u4ef6\u5bf9\u5e94\u4e00\u4e2a\u6027\u80fd\u6d4b\u8bd5\u573a\u666f\uff0c\u4e8e\u662f\u5728\u540c\u7ea7\u76ee\u5f55\u4e0b\u521b\u5efa\u4e00\u4e2a\u4e0e\u4e4b\u540c\u540d\u7684 json \u6587\u4ef6\uff0c\u4f5c\u4e3a\u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6 apps\n\u251c\u2500\u2500 album\n \u251c\u2500\u2500 test_album_01_start.json # \u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6\n\u2514\u2500\u2500 test_album_01_start.py # \u6027\u80fd\u573a\u666f\u6587\u4ef6\n \u4ee5\u4e0b\u662f\u5bf9 json \u6587\u4ef6\u4e2d\u914d\u7f6e\u7684\u89e3\u91ca\uff0c\u82e5\u67d0\u9879\u914d\u7f6e\u4e0d\u9700\u8981\uff0c\u53ef\u4ee5\u7f3a\u5931\uff0c\u4f46\u4e0d\u80fd\u4e3a\u7a7a\uff1b {\n\"title\": \"test_album_start\", # \u6807\u9898\uff1b\u5fc5\u987b\n\"app_name\": \"deepin-album\", # \u573a\u666f\u6240\u5c5e\u7684\u5e94\u7528\uff1b\u5fc5\u987b\n\"scene\": \"hot\", # \u573a\u666f\u522b\u540d\uff1b\u5fc5\u987b\n\"icon\": [\"deepin-album\"], # \u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684icon\u5230\u670d\u52a1\u7aef\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\uff1b\u53ef\u7f3a\u5931\n# \u6ce8\u610f\uff1a\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684desktop\u6587\u4ef6\u540d\u4e3adeepin-album.desktop\uff0c\n# \u53ea\u9700\u8981\u5199deepin-album\u5373\u53ef\uff0c\u201c.desktop\u201d\u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002\n\"size\": { # \u56fe\u7247\u5bf9\u6bd4\u7684\u533a\u57df\u8bbe\u7f6e\u9879\uff0c\u67d0\u4e9b\u5e94\u7528\u5f53\u524d\u5c4f\u5e55\u7684\u90e8\u5206\u533a\u57df\u9700\u8981\u5c06\u5176\u53bb\u6389\uff0c\u53ef\u4ee5\u8bbe\u7f6e\u6b64\u9879\uff0c\u5982\u679c\u6ca1\u6709\u5219\u53ef\u4e0d\u5199\uff1b\u53ef\u786e\u5b9e\n\"x-coordinate\": 0, # \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n\"y-coordinate\": 0, # \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n\"width\": 850, # \u6a2a\u5411\u957f\u5ea6\n\"height\": 1920 # \u7eb5\u5411\u9ad8\u5ea6\n},\n\"count\": 5, # \u573a\u666f\u6267\u884c\u7684\u6b21\u6570\uff1b\u5fc5\u987b\n\"duration\": 5, # \u8be5\u6761\u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff0c\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7279\u5b9a\u573a\u666f\uff0c\u8be5\u914d\u7f6e\u4e3a\u53ef\u9009\u9879\uff0c\u8986\u76d6 server.ini \u4e2d\u7684\u914d\u7f6e\uff1b\u53ef\u7f3a\u5931\n\"stable_similarity\": 0.9997, # \u6027\u80fd\u573a\u666f\u5206\u9636\u6bb5\u65f6\u7684\u56fe\u7247\u76f8\u4f3c\u5ea6\u5bf9\u6bd4\uff0c\u524d\u540e\u56fe\u7247\u4f4e\u4e8e\u8be5\u503c\uff0c\u5219\u5206\u4e3a\u4e0d\u7a33\u5b9a\u9636\u6bb5\uff1b\u53ef\u7f3a\u5931\n\"find_by\": \"stage\", # \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\n\"final_stable_num\": 100, # \u67e5\u627e\u6700\u540e\u4e00\u4e2a\u5927\u4e8e\u8be5\u503c\u7684\u7a33\u5b9a\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u7684\u5c3e\u796f\uff1b\u53ef\u7f3a\u5931\n\"start_num\": 150,\n\"text\": \"\", # ocr\u8bc6\u522b\u7684\u6587\u6848\n\"match\": \"apps/xxx/images/match.png\", # \u56fe\u50cf\u5339\u914d\u7684\u56fe\u7247\u6587\u4ef6\u8def\u5f84\n\"match_rate\": 0.9 # \u5339\u914d\u76f8\u4f3c\u5ea6\n}\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e94\u3001\u6d4b\u8bd5\u6d41\u7a0b","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516d\u3001\u7528\u4f8b\u7f16\u5199\u53ca\u65b9\u6cd5\u53c2\u6570\u6307\u5f15","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"1\u3001\u7528\u4f8b\u5b9e\u4f8b\u8bf4\u660e","text":"# \u6807\u51c6\u5e93\u5bfc\u5165\nfrom time import sleep\n# \u5bfc\u5165\u4e09\u65b9\u5e93pytest\nimport pytest\n# \u5bfc\u5165\u7528\u4f8b\u6267\u884c\u8981\u7528\u5230\u7684Widget\u7c7b\nfrom src.base_widget import BaseWidget\nclass TestStart:\n# class\u7ea7\u522b\u7684fixture\uff0c\u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u6267\u884c\u3002autouse=True \u81ea\u52a8\u5728\u5f53\u524d\u4f5c\u7528\u57df\u4e0b\u4f7f\u7528\u3002\n@pytest.fixture(scope=\"class\", autouse=True)\n# \u6d4b\u8bd5\u70ed\u542f\u52a8\u4e4b\u524d\u9700\u8981\u9884\u542f\u52a8\u3002\ndef application_pre_start(self):\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().right_click_element(\"deepin-album\")\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().click_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\")\nsleep(2)\n# \u5feb\u6377\u952e\u5173\u95ed\u7a97\u53e3\nBaseWidget().hot_key(\"alt\", \"f4\")\nsleep(2)\n# \u9ed8\u8ba4\u4e3afunction\u7ea7\u522b\u7684fixture\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\uff0cclass\u7ea7\u522bfixture\u6267\u884c\u4e4b\u540e\u6267\u884c\u3002\n@pytest.fixture(autouse=True)\ndef setup_start(self):\n# \u53f3\u952e\u70b9\u51fb deepin-album \u56fe\u6807\nBaseWidget().right_click_element(\"deepin-album\")\n# \u79fb\u52a8\u5230\u53f3\u952e\u83dc\u5355\u4e2d\u6253\u5f00\uff08open.png\uff09\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().move_to(*BaseWidget().find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))\n# \u7b49\u5f85\u79fb\u52a8\u5b8c\u6210\nsleep(0.5)\ndef test_album_start(self):\n# \u70b9\u51fb\u201c\u6253\u5f00\u201d\nBaseWidget().click() \n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"2\u3001\u65b9\u6cd5\u53c2\u6570\u8bf4\u660e","text":"2.1\u3001find_element \u65b9\u6cd5 def find_element(element: str, input_type: str = \"FILE_NAME\", fill_color_position: tuple = (-1, -1), size: tuple = (25, 70)):\npass\n \u53c2\u6570 element \u548c input_type \uff081\uff09\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u5143\u7d20 - `input_type` \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a `FIEL_NAME` \uff0c\u8868\u793a\u901a\u8fc7\u5e94\u7528 `icon` \u5bfb\u627e\u5143\u7d20\uff0c\u6b64\u65b9\u6cd5\u4f1a\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u5e94\u7528 `icon` \u56fe\u6807\u3002\n \u4e3e\u4f8b\uff1a\u9ed8\u8ba4\u60c5\u51b5\u4e0b input_type \u53c2\u6570\u4e0d\u9700\u8981\u4f20\u5165\uff0c find_element(\"deepin-album\")\uff0c\u8868\u793a\u901a\u8fc7 deepin-album \u7684\u5e94\u7528 icon \u6765\u83b7\u53d6\u5750\u6807\uff0c\u6ce8\u610f\uff0c\u6b64\u65f6\u4f20\u5165\u7684 deepin-album \u53c2\u6570\u5b9e\u9645\u662f desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u548c2.3\u4e2d\u7684 icon \u53d8\u91cf\u4e00\u81f4\u3002 \u6211\u4eec\u5efa\u8bae\u4f18\u5148\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\uff0c\u4f46\u6b64\u65b9\u6cd5\u4f9d\u8d56\u7f51\u7edc\uff0c\u8bf7\u6839\u636e\u6d4b\u8bd5\u73af\u5883\u5b9e\u9645\u60c5\u51b5\u9009\u62e9\u3002 \uff082\uff09\u901a\u8fc7\u672c\u5730\u56fe\u7247\u8bc6\u522b\u5143\u7d20 - \u53c2\u6570 `input_type` \u4f20\u5165\u56fe\u7247\u683c\u5f0f\uff0c\u6bd4\u5982\u622a\u53d6\u7684\u672c\u5730\u56fe\u7247\u683c\u5f0f\u4e3a `png`\uff0c\u90a3\u4e48 `input_type=\"png\"`\uff0c\u6b64\u65f6\u53c2\u6570 `element ` \u4f20\u5165\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5efa\u8bae\u5b58\u653e\u5728\u5bf9\u5e94\u7684\u4ea7\u54c1 `apps/app/picture/` \u76ee\u5f55\u4e0b\uff0c\u8def\u5f84\u4e3a\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u7684\u76f8\u5bf9\u8def\u5f84\u3002\n- \u4e3e\u4f8b\uff1a`find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))`\uff0c\u8868\u793a\u901a\u8fc7\u672c\u5730\u56fe\u7247 `open.png` \u8bc6\u522b\u5143\u7d20\u3002\n \u53c2\u6570 fill_color_position fill_color_position \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (-1, -1)\uff0c(-1, -1) \u8868\u793a\u53d6\u5c4f\u5e55\u4e2d\u53f3\u4e0b\u89d2\u6700\u540e\u4e00\u4e2a\u50cf\u7d20\u70b9\u4f5c\u4e3a\u586b\u5145\u5750\u6807\uff0c\u5728 1920x1080 \u5c4f\u5e55\u5206\u8fa8\u7387\u4e0b\u5373\u5b9e\u9645\u5750\u6807\u4e3a (1919, 1079) \uff0c\u8fd9\u6837\u7684\u5199\u6cd5\u53ef\u4ee5\u9002\u914d\u4e0d\u540c\u5927\u5c0f\u7684\u5c4f\u5e55\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0d\u540c\u65b9\u4f4d\uff1a \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0b\u65b9\uff0c\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u4e0d\u9700\u8981\u4f20\u5165\u8be5\u53c2\u6570\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u5de6\u8fb9\uff0cfill_color_position=(1, 1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u53f3\u8fb9\uff0cfill_color_position=(-1, -1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0a\u8fb9\uff0cfill_color_position=(1, 1) \u4ece\u684c\u9762\u542f\u52a8\u5e94\u7528\uff0c\u5219\u9700\u8981\u4f20\u5165\u9664\u4efb\u52a1\u680f\u4ee5\u5916\u5176\u4ed6\u4f4d\u7f6e\u7684\u5750\u6807\uff0c\u6bd4\u5982(100, 100)\uff0c\u53ea\u8981\u8fd9\u4e2a\u5750\u6807\u4e3a\u9664\u5e94\u7528\u548c\u4efb\u52a1\u680f\u533a\u57df\u90fd\u53ef\u4ee5\u3002 \u4ece\u542f\u52a8\u5668\u91cc\u9762\u542f\u52a8\u5e94\u7528\uff0c\u9700\u8981\u586b\u5145\u7684\u5750\u6807\u4e3a\u542f\u52a8\u5668\u533a\u57df\u3002 \u6ce8\uff1a\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u65f6\uff0c\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684 icon \u539f\u6587\u4ef6\u4e3a svg \u77e2\u91cf\u56fe\uff0c\u8f6c\u6362\u4e3a png \u4e4b\u540e\u9700\u8981\u586b\u5145\u8fb9\u7f18\u900f\u660e\u90e8\u5206\u3002 \u53c2\u6570 size size \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (25, 70)\uff0c\u8868\u793a\u6d4b\u8bd5\u673a\u4e0a dock \u680f\u4e0a\u5e94\u7528\u56fe\u6807\u7684\u5927\u5c0f\u8303\u56f4\u3002 UOS \u7cfb\u7edf dock \u680f\u662f\u53ef\u4ee5\u4e0a\u4e0b\u62d6\u52a8\u5927\u5c0f\u7684\uff0c\u968f\u7740 dock \u680f\u5927\u5c0f\u6539\u53d8\uff0c\u5e94\u7528\u56fe\u6807\u7684\u8303\u56f4\u4e3a25\u523070\u4e4b\u95f4\u3002 \u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u64cd\u4f5c\u7cfb\u7edf\u4e0a dock \u680f\u5927\u5c0f\u4e0d\u4e00\u6837\uff0c\u53ef\u4ee5\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u4f20\u5165\u5927\u5c0f\u8303\u56f4\u3002 2.2\u3001click_element\u3001 right_click_element\uff0c double_click_element \u8fd9\u51e0\u4e2a\u65b9\u6cd5\u53c2\u6570\u89c4\u5219\u4e0e find_element \u65b9\u6cd5\u4e00\u6837\u3002\u4ed6\u4eec\u5b9e\u9645\u4e0a\u662f\u5728 find_element \u65b9\u6cd5\u57fa\u7840\u4e4b\u4e0a\u505a\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u589e\u52a0\u4e86\u9f20\u6807\u7684\u52a8\u4f5c\uff0c\u5982\u679c\u4f60\u4e0d\u60f3\u4f7f\u7528\u8fd9\u51e0\u4e2a\u65b9\u6cd5\uff0c\u5728\u7528\u4f8b\u4e2d\u4e5f\u53ef\u4ee5\u901a\u8fc7 find_element \u83b7\u53d6\u5230\u5750\u6807\uff0c\u7136\u540e\u5c06\u5750\u6807\u4f20\u5165\u5230\u952e\u9f20\u7684\u65b9\u6cd5\u4e2d\uff0c\u53ef\u4ee5\u5b9e\u73b0\u540c\u6837\u7684\u6548\u679c\u3002 2.3\u3001\u7528\u4f8b\u7c7b\u4e2d\u6709\u4e2a\u7c7b\u53d8\u91cf icon = [\"deepin-album\"] \u9700\u8981\u7279\u6b8a\u8bf4\u660e\uff0c\u5217\u8868\u4e2d\u7684\u5143\u7d20\u4e3a\u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709 icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684 icon \u5230\u670d\u52a1\u7aef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528 desktop \u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684 desktop \u6587\u4ef6\u540d\u4e3a deepin-album.desktop\uff0c\u53ea\u9700\u8981\u5199 deepin-album \u5373\u53ef\uff0c.desktop \u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e03\u3001\u6267\u884c\u5165\u53e3","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"1\u3001\u7528\u4f8b\u7ec4\u7ec7","text":"\u5728 setting/config/server.ini \u6587\u4ef6\u4e2d APP_NAME= \u5b57\u6bb5\u4e3a\u7528\u4f8b\u7684\u6267\u884c\u7684\u76ee\u5f55\uff0c\u9ed8\u8ba4\u4e3a apps \u76ee\u5f55\u4e0b\u6240\u6709\u7528\u4f8b\u3002\u5982\u679c\u4f60\u60f3\u6307\u5b9a\u6267\u884c\u67d0\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4f60\u53ef\u4ee5\u5c06\u8be5\u914d\u7f6e\u9879\u6307\u5b9a\u5230\u5e94\u7528\u7684\u7528\u4f8b\u76ee\u5f55\uff0c\u6bd4\u5982\uff1aAPP_NAME=deepin_album\uff0c \u8868\u793a\u6267\u884c\u76f8\u518c\u76ee\u5f55\u4e0b\u7684\u7528\u4f8b\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a python3 manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music\n -k KEYWORDS, --keywords KEYWORDS\n \u7528\u4f8b\u7684\u5173\u952e\u8bcd\n -t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e\n --log_level LOG_LEVEL \u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n --env {host,docker} \u5728\u5bbf\u4e3b\u673a\u6216\u5bb9\u5668\u73af\u5883\u6267\u884c\n --client_alias \u9009\u62e9\u6d4b\u8bd5\u673a\u522b\u540d, \u53ef\u9009\u9879\u4e3aclient.ini\u4e2d\u5df2\u914d\u7f6e, \u9ed8\u8ba4\u503c\u4e3a zx-x86.\n --count \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a python3 manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\" --env docker\n \u6ce8\uff1a\u5728\u5bb9\u5668\u4e2d\u6267\u884c\u65f6\uff0c\u82e5\u5f3a\u5236\u9000\u51fa\uff0c\u5bb9\u5668\u5e76\u4e0d\u4f1a\u505c\u6b62\u8fd0\u884c\uff01"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_9","title":"\u516b\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1json","title":"1\u3001Json \u62a5\u544a","text":"\u81ea\u7814\u89c6\u9891\u89e3\u6790\u5de5\u5177\u4f1a\u5bf9\u5355\u6761\u7528\u4f8b\u6267\u884c\u4e00\u8f6e\u751f\u6210\u4e00\u4e2a json \u6587\u4ef6\uff0c\u5b58\u653e\u4e8e report/{app_name}/{scene}/{run_num} \u76ee\u5f55\u4e0b\uff0c\u547d\u540d\u683c\u5f0f\u4e3a\uff1a report.json json \u5185\u5bb9\u4e3e\u4f8b\uff1a [\n{\n\"Stab1\": {\n\"images\": [1,2...150,151],\n\"startStub\": 0,\n\"type\": \"Stab\"\n}\n},\n{\n\"Stab2\": {\n\"images\": [152,153...169,170],\n\"startStub\": 1,\n\"type\": \"UnStab\"\n}\n},\n{\n\"Stab3\": {\n\"images\": [171,172...300,301],\n\"startStub\": 0,\n\"type\": \"UnStab\"\n}\n}\n]\n \u8bf4\u660e\uff1a Stab \uff1a\u8868\u793a\u89e3\u6790\u8fc7\u7a0b\u4e2d\u4e0d\u540c\u7684\u9636\u6bb5\u3002 images \uff1a\u8868\u793a\u6bcf\u4e00\u5e27\u7684\u56fe\u7247\u5e8f\u53f7\u3002 startStub\uff1a \u4e3a\u8bc6\u522b\u5c3e\u5e27\u7684\u9636\u6bb5\u8868\u793a\uff0c\u5982\u679c \"startStub\": 1 \uff0c\u8bf4\u660e\u5c3e\u5e27\u51fa\u73b0\u5728\u8be5\u9636\u6bb5\u3002 type\uff1a \u4e3a Stab \u6216 UnStab \uff0c\u8868\u793a\u7a33\u5b9a\u9636\u6bb5\u6216\u4e0d\u7a33\u5b9a\u9636\u6bb5\u3002 \u5404\u9636\u6bb5\u6709\u5e27\u6570\u8865\u507f\uff0c\u9ed8\u8ba4\u8865\u507f\u7684\u5e27\u6570\u4e3a 3 \u5e27\uff08\u53ef\u4ee5\u901a\u8fc7 server.ini \u91cc\u9762 un_stab_start=3 \u8fdb\u884c\u914d\u7f6e\uff09\uff0c\u8868\u793a\u5c0f\u4e8e\u7b49\u4e8e 3 \u5e27\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u524d\u540e\u5747\u9700\u8981\u51cf\u6389\u3002 \u5e94\u7528\u542f\u52a8\u9636\u6bb5\u5c31\u662f\u5728 Stab2 \u9636\u6bb5\uff0c\u542f\u52a8\u65f6\u95f4\u4e3a\uff1a171 \u51cf 151 \u518d\u51cf\u6389\u524d\u540e\u8865\u507f\u5e27\u6570 6 \u5e27\uff0c\u5373 14 \u5e27\uff0c\u89c6\u9891\u5e27\u7387 30 \u5e27/\u79d2\uff0c\u56e0\u6b64\u542f\u52a8\u8017\u65f6\u4e3a\uff1a14 * 33 = 462 ms"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2excel","title":"2\u3001Excel \u62a5\u544a","text":"\u6240\u6709\u7528\u4f8b\u6267\u884c\u5e76\u89e3\u6790\u5b8c\u4e4b\u540e\u4f1a report \u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a\u6c47\u603b\u6570\u636e\u7684 Excel \u6587\u4ef6\uff0c\u6587\u4ef6\u540d\u4e3a\uff1a{time}_perf_time.xlsx\u3002 \u6ce8\u610f\uff0creport \u76ee\u5f55\u4e3a\u53ef\u914d\u7f6e\u9879\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u4f1a\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u751f\u6210\uff0c\u5982\u679c\u4f60\u5c06 report\uff0c\u6307\u5b9a\u5230\u9879\u76ee\u4e0b\u5176\u4ed6\u8def\u5f84\uff0c\u5219\u4f1a\u5728\u5bf9\u5e94\u7684\u8def\u5f84\u4e0b\u751f\u6210 json \u548c Excel \u6587\u4ef6\u3002 \u4f60\u4e5f\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8bfb\u53d6\u6240\u6709 json / excel \u62a5\u544a\u7684\u6570\u636e\uff0c\u751f\u6210\u4f60\u81ea\u5df1\u60f3\u8981\u7684\u4e00\u4e9b\u6d4b\u8bd5\u62a5\u544a\u5f62\u5f0f\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#usb","title":"\u4e5d\u3001USB \u4e32\u53e3\u9a71\u52a8\u952e\u9f20\u65b9\u6cd5","text":"\u4f4d\u4e8e src/utils/control/serial_communication \u76ee\u5f55\u4e0b\u7684 usb_mk.py \u6587\u4ef6 usb_mk = UsbMk()\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up()\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u652f\u6301\u4f20\u5165\u6c49\u5b57\uff0c\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click()\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() \n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() \n \uff084\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() \n \uff085\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() \n \uff086\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() \n \uff087\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff088\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff0810\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_10","title":"\u5341\u3001\u7ee7\u7535\u5668\u63a7\u5236\u4e3b\u673a\u5f00\u673a/\u91cd\u542f","text":"\uff08\u82e5\u4e0d\u4f7f\u7528\u7ee7\u7535\u5668\uff0c\u53ef\u5ffd\u7565\u8be5\u6b65\u9aa4\uff0c\u6267\u884c\u65f6\u4f1a\u901a\u8fc7\u547d\u4ee4 reboot\uff09"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u7ee7\u7535\u5668\u8bbe\u5907","text":"LCUS-2 \u578b \u53cc\u8def USB \u667a\u80fd\u4e32\u53e3\u63a7\u5236\u7ee7\u7535\u5668\u3002 https://item.taobao.com/item.htm?spm=a1z09.2.0.0.41d72e8dUYx2pi&id=582653718178&_u=i25r20ia6a2e "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2usb","title":"2\u3001USB \u5ef6\u957f\u7ebf","text":"\u666e\u901a\u7684 USB \u7ebf\u5373\u53ef\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_3","title":"3\u3001\u675c\u90a6\u7ebf","text":"3.1\u300140P \u6bcd\u5bf9\u516c\u675c\u90a6\u7ebf\u3002 3.2\u3001\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"4\u3001\u5b89\u88c5\u56fe\u6587\u6559\u7a0b","text":"4.1\u3001\u4f7f\u7528 USB \u5ef6\u957f\u7ebf\u8fde\u63a5\u63a7\u5236\u7aef\u548c\u7ee7\u7535\u5668\u3002 4.2\u3001\u5728\u7ee7\u7535\u5668\u5e38\u7aef\u548c\u516c\u5171\u7aef\u5747\u8fde\u63a5\u4e00\u6839\u675c\u90a6\u7ebf\u3002 4.3\u3001\u5728\u4e3b\u677f\u4e0a\u5f00\u673a\u9488\u548c\u91cd\u542f\u9488\u4e0a\u63d2\u4e0a\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 4.4\u3001\u5c06\u5f00\u673a\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76841\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1\u5de6\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 4.5\u3001\u5c06\u91cd\u542f\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76842\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1 \u53f3\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 \u82e5\u60f3\u4fdd\u7559\u539f\u7535\u6e90\u5f00\u5173\u7684\u7535\u6e90\u706f\uff0c\u53ef\u6839\u636e\u5982\u4e0a\u56fe\u6240\u793a\uff0c\u4f7f\u7528\u675c\u90a6\u7ebf\u8fde\u63a5\u4e3b\u677f\u4e0a\u7684\u7535\u6e90\u706f\u548c\u539f\u7535\u6e90\u5f00\u5173"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_11","title":"\u5341\u4e00\u3001\u5e38\u89c1\u95ee\u9898\u8bf4\u660e","text":"1\u3001ERROR: for uos Cannot restart container 2301b1a1395d7959ee6523d61b61c87084649af530786cdb8fb5b3ecbcbd1068: linux runtime spec devices: error gathering device information while adding custom device \"/dev/ttyACM0\": no such file or directory \u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u8fde\u63a5\u72b6\u6001\uff0c\u67e5\u770b /dev/ttyACM0 \u662f\u5426\u5b58\u5728\uff0c\u82e5\u5b58\u5728 /dev/ttyACMn\uff08n\u4e3a\u4efb\u610f\u6570\u5b57\uff09\uff0c\u91cd\u542f\u7535\u8111\u89e3\u51b3\u3002 2\u3001Error response from daemon: Container 5e700fdc769e8c74666d68a7f2bc3de58268b4594cf88706609d59f8dbc7362d is not running \u5bb9\u5668\u542f\u52a8\u5931\u8d25 1\uff09\u68c0\u67e5\u54ea\u4e00\u4e2a\u5bb9\u5668\u672a\u542f\u52a8 sudo docker container ls # \u5217\u51fa\u8fd0\u884c\u4e2d\u7684 Docker \u5bb9\u5668\n 2\uff09\u7f3a\u5c11 uos \u5bb9\u5668\uff0c\u68c0\u67e5 USB \u4e32\u53e3\u8fde\u63a5\u7ebf\u548c\u91c7\u96c6\u76d2\u8fde\u63a5\u7ebf\u662f\u5426\u6b63\u5e38\uff0c\u91cd\u542f\u540e\u6267\u884c bash install/setup.up # \u91cd\u65b0\u5b8c\u6574\u90e8\u7f72\u73af\u5883\n \u6216\u6267\u884c sudo docker-compose up -d --build # \u4ec5\u91cd\u65b0\u6784\u5efa Docker \u955c\u50cf\n 3\u3001\u82e5\u90e8\u7f72\u65f6\u63d0\u793a\u6302\u8f7d ttyACM0\u3001video0 \u5931\u8d25\uff0c\u8bf7\u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u53ca\u91c7\u96c6\u76d2\u662f\u5426\u63a5\u89e6\u826f\u597d\uff0c\u82e5\u63a5\u89e6\u826f\u597d\uff0c\u91cd\u542f\u5373\u53ef\u89e3\u51b3\u3002 4\u3001\u82e5\u51fa\u73b0\u56fe\u7247\u80fd\u8bc6\u522b\uff0c\u4f46\u662f\u9f20\u6807\u672a\u79fb\u52a8\u64cd\u4f5c\u65f6\uff0c\u5b89\u88c5\u7edd\u5bf9\u9f20\u6807\u64cd\u4f5c\u7684\u4f9d\u8d56\u5305\uff0c\u89c1\u7b2c\u4e09\u8282\u7b2c\u4e8c\u5c0f\u8282\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u6d4b\u8bd5\u673a\u3002 5\u3001\u7531\u4e8e\u901a\u8fc7\u91c7\u96c6\u5361\u83b7\u53d6\u7684\u6d4b\u8bd5\u673a\u5b9e\u65f6\u753b\u9762\uff0c\u5305\u542b\u4e86\u9f20\u6807\u7684\u6837\u5f0f\uff0c\u6240\u4ee5\u5bf9\u56fe\u7247\u8bc6\u522b\u65f6\uff0c\u9f20\u6807\u82e5\u505c\u7559\u5728\u56fe\u6807\u4e0a\u5c42\uff0c\u5219\u4f1a\u5bf9\u8bc6\u522b\u7ed3\u679c\u9020\u6210\u5f71\u54cd\uff0c\u9700\u8981\u5c06\u9f20\u6807\u79fb\u52a8\u81f3\u5176\u4ed6\u4f4d\u7f6e\uff0c\u6216\u8005\u9690\u85cf\u9f20\u6807\u89e3\u51b3\u3002 6\u3001Excel \u62a5\u544a\u4e2d\uff0c\u6d4b\u8bd5\u573a\u666f\u5217\u4e0e\u7528\u4f8b\u4e2d\u7684\u4e0d\u4e00\u81f4\uff0c\u5173\u952e\u5b57scene\u3001app_name\u3001\u67b6\u6784\u522b\u540d\uff0c\u4e0d\u80fd\u5305\u542b\u4e0b\u5212\u7ebf\u548c\u82f1\u6587\u7b26\u53f7\u7684\u5706\u62ec\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/","title":"\u6846\u67b6\u529f\u80fd\u4ecb\u7ecd","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2023/1/12\n# Author : Mikigo\n# =============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_2","title":"\u4e00\u3001\u4e00\u53e5\u8bdd\u7b80\u4ecb","text":"\u6b64\u6587\u6863\u4e3b\u8981\u60f3\u5bf9 YouQu \u6846\u67b6\u4e00\u4e9b\u91cd\u70b9\u7684\u529f\u80fd\u505a\u8be6\u7ec6\u7684\u4ecb\u7ecd\uff0c\u5305\u62ec\u5bf9\u4e00\u4e9b\u529f\u80fd\u5f00\u53d1\u7684\u80cc\u666f\u3001\u8981\u89e3\u51b3\u7684\u95ee\u9898\u3001\u5b9e\u73b0\u903b\u8f91\u3001\u4ee3\u7801\u7b49\u65b9\u9762\u7684\u4ecb\u7ecd\uff0c\u4ee5\u6b64\u8ba9\u5927\u5bb6\u80fd\u66f4\u52a0\u6e05\u6670\u7684\u7406\u89e3\u5404\u9879\u529f\u80fd\uff0c\u4ece\u800c\u5728\u4f7f\u7528\u7684\u65f6\u5019\u80fd\u66f4\u52a0\u7684\u5f97\u5fc3\u5e94\u624b\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_3","title":"\u4e8c\u3001\u56fe\u50cf\u8bc6\u522b","text":"\u56fe\u50cf\u8bc6\u522b\u5728 UI \u81ea\u52a8\u5316\u4e2d\u662f\u4e0d\u53ef\u7f3a\u5c11\u7684\uff0c\u5e02\u9762\u4e0a\u751a\u81f3\u6709\u5b8c\u5168\u57fa\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\uff0c\u6bd4\u5982 Airtest\u3001Sikuli \u7b49\uff0c\u5728\u6e38\u620f\u7b49\u7279\u5b9a\u9886\u57df\u4e5f\u6709\u4e0d\u9519\u7684\u6548\u679c\uff0c\u8fd9\u4e9b\u5de5\u5177\u5b9e\u9645\u4e0a\u4e5f\u662f\u7528\u7684 OpenCV \u8fdb\u884c\u4e86\u5c01\u88c5\uff0cYouQu \u6846\u67b6\u57fa\u4e8e OpenCV \u5f00\u53d1\u4e86\u81ea\u5df1\u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\uff0c\u5b83\u53ef\u4ee5\u65b9\u4fbf\u7684\u7528\u4e8e\u754c\u9762\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u65ad\u8a00\uff1b YouQu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u51e0\u4e4e\u6ee1\u8db3\u4e86\u4f60\u7684\u6240\u6709\u8981\u6c42\uff0c\u6211\u4eec\u5728\u957f\u65f6\u95f4\u7684\u601d\u8003\u548c\u6478\u7d22\u4e2d\uff0c\u9488\u5bf9\u5e38\u89c4\u573a\u666f\u53ca\u4e00\u4e9b\u7279\u6b8a\u573a\u666f\u63a2\u7d22\u9664\u4e86\u4e00\u4e9b\u5b9e\u7528\u4e14\u6709\u6548\u7684\u65b9\u6848\uff0c\u4e14\u542c\u6211\u6162\u6162\u9053\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1","title":"1\u3001\u5e38\u89c4\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5e38\u89c4\u8bc6\u522b\u5f88\u597d\u7406\u89e3\uff0c\u4e00\u53e5\u8bdd\u8bb2\u5c31\u662f\uff0c\u8981\u83b7\u53d6\u5230\u76ee\u6807\u5143\u7d20\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u3002 \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u5728\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u9700\u8981\u83b7\u53d6\u7684\u5750\u6807\u662f\u76f8\u5bf9\u4e8e\u6574\u4e2a\u5c4f\u5e55\u7684\u5750\u6807\uff0c\u6211\u4eec\u53ef\u4ee5\u622a\u53d6\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u56fe\u7247\uff08screen\uff09\uff1b \u5728\u5143\u7d20\u8bc6\u522b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u622a\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5c0f\u56fe\u8fdb\u884c\u8bc6\u522b\uff0c\u6bd4\u5982\u622a\u53d6\u64ad\u653e\u6309\u94ae\uff1a \u90a3\u4e48\u5b9e\u9645\u4e0a\uff0c\u5143\u7d20\u5b9a\u4f4d\u7684\u95ee\u9898\u5c31\u8f6c\u6362\u4e3a\uff0c\u5c06\u622a\u56fe\u7684\u5c0f\u56fe\uff08play_btn\uff09\u62ff\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u5927\u56fe\uff08screen\uff09\u4e2d\u53bb\u505a\u5339\u914d\uff0c\u5982\u679c\u5339\u914d\u6210\u529f\uff0c\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff08 x, y \uff09\u5373\u53ef\u3002 \u4e3a\u4e86\u65b9\u4fbf\u63cf\u8ff0\uff0c\u4ee5\u4e0b\u6211\u5c06\u6574\u4e2a\u5c4f\u5e55\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5927\u56fe\uff0c\u67d0\u4e2a\u5143\u7d20\u56fe\u7247\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5c0f\u56fe\u3002 \u57fa\u4e8e OpenCV \u7684\u6a21\u677f\u5339\u914d cv.matchTemplate() \u529f\u80fd\uff0c\u6211\u4eec\u5b9e\u73b0\u4e86\u56fe\u50cf\u5b9a\u4f4d\u7684\u529f\u80fd\uff0c\u6846\u67b6\u63d0\u4f9b\u4e86\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u5e95\u5c42\u63a5\u53e3\uff08\u4e00\u822c\u4e0d\u5bf9\u4e0a\u5c42\u63d0\u4f9b\u8c03\u7528\uff09\uff1a def _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\n# \u8be6\u7ec6\u4ee3\u7801\u592a\u957f\u4e0d\u8d34\u4e86\uff0c\u611f\u5174\u8da3\u8bf7\u67e5\u770b\u6e90\u7801\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001image_path image_path \u662f\u5c0f\u56fe\u7684\u7edd\u5bf9\u8def\u5f84; \u901a\u5e38\u5728 AT \u5de5\u7a0b\u91cc\u9762\uff0c\u6211\u4eec\u7ea6\u5b9a\u5c06\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u5b9e\u9645\u7684\u5143\u7d20\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1aplay_btn.png \uff1b \u7528\u4e8e\u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 case/assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1amusic_001.png \uff1b \u8fd9\u6837\u662f\u4e3a\u4e86\u65b9\u4fbf\u7ba1\u7406\u548c\u7ef4\u62a4\u3002 2\u3001rate \u56fe\u50cf\u8bc6\u522b\u7684\u7684\u5339\u914d\u5ea6\u6216\u8005\u8bf4\u76f8\u4f3c\u5ea6\uff0c\u6846\u67b6\u9ed8\u8ba4\u7684\u914d\u7f6e\u4e3a 0.9\uff0c\u4e5f\u5c31\u662f\u8bf4\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u5b58\u5728\u4e00\u4e2a\u76f8\u4f3c\u5ea6 90% \u7684\u56fe\u6807\u5373\u8fd4\u56de\u5176\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff1b \u5982\u679c\u4f60\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u8c03\u6574\u8bc6\u522b\u5ea6\uff0c\u4f60\u53ef\u4ee5\u5728\u8c03\u7528\u51fd\u6570\u7684\u65f6\u5019\uff0c\u4f20\u5165\u4e0d\u540c\u7684\u8bc6\u522b\u5ea6\u7684\u503c\u3002 3\u3001multiple \u9ed8\u8ba4\u60c5\u51b5\u4e0b multiple=False\uff0c\u8868\u793a\u53ea\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u7b2c\u4e00\u4e2a\uff0c\u5982\u679c multiple=True \u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\uff0c\u56e0\u4e3a\u5927\u56fe\u4e2d\u53ef\u80fd\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u5c0f\u56fe\uff0c\u5728\u67d0\u4e9b\u573a\u666f\u4e0b\u4f60\u53ef\u80fd\u9700\u8981\u5168\u90e8\u83b7\u53d6\u5230\u6240\u6709\u5339\u914d\u5230\u7684\u5750\u6807\u3002 4\u3001picture_abspath \u9ed8\u8ba4\u60c5\u51b5\u4e0b picture_abspath=None \u8868\u793a\u5927\u56fe\u4e3a\u622a\u53d6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u5982\u679c\u4f60\u4e0d\u5e0c\u671b\u5927\u56fe\u662f\u5c4f\u5e55\u7684\u622a\u56fe\uff0c\u800c\u662f\u4f60\u81ea\u5b9a\u4e49\u4f20\u5165\u7684\u67d0\u4e2a\u56fe\u7247\uff0c\u4f60\u53ea\u9700\u8981\u5c06\u4f60\u7684\u56fe\u7247\u8def\u5f84\u4f20\u9012\u7ed9\u8fd9\u4e2a\u53c2\u6570\u5c31\u884c\uff0c\u6bd4\u5982\uff1a picture_abspath=\"~/Desktop/big.png\" \uff1b 5\u3001screen_bbox \u5927\u56fe\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u622a\u53d6\u6574\u4e2a\u5c4f\u5e55\uff0cscreen_bbox = [x, y, w, h] \u53ef\u4ee5\u6307\u5b9a\u622a\u53d6\u5c4f\u5e55\u4e2d\u7684\u56fa\u5b9a\u533a\u57df\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\uff0c\u53ef\u4ee5\u6392\u9664\u90e8\u5206\u533a\u57df\u5bf9\u8bc6\u522b\u7ed3\u679c\u7684\u5f71\u54cd\u3002 \u3010\u9690\u5f0f\u7b49\u5f85\u3011 \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\uff0c\u6709\u65f6\u5019\u9875\u9762\u8df3\u8f6c\u6709\u5ef6\u65f6\uff0c\u6709\u53ef\u80fd\u5b58\u5728\u8bc6\u522b\u7684\u90a3\u4e00\u523b\u9875\u9762\u4e5f\u6ca1\u6709\u8df3\u8f6c\u51fa\u6765\uff0c\u6216\u8005\u6216\u8005\u8bc6\u522b\u7684\u90a3\u4e00\u523b\uff1b \u56e0\u6b64\u6211\u4eec\u9700\u8981\u4e00\u79cd\u7b49\u5f85\u673a\u5236\uff0c\u5373\u5728\u4e00\u5b9a\u7684\u65f6\u95f4\u5185\uff0c\u5982\u679c\u8bc6\u522b\u4e0d\u5230\uff0c\u91cd\u590d\u53bb\u8bc6\u522b\uff1a def find_image(\ncls,\n*widget, rate: [float, int] = None,\nmultiple: bool = False,\nmatch_number: int = None,\npicture_abspath: str = None,\nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u5728\u5c4f\u5e55\u4e2d\u533a\u5bfb\u627e\u5c0f\u56fe\uff0c\u8fd4\u56de\u5750\u6807\uff0c\n \u5982\u679c\u627e\u4e0d\u5230\uff0c\u6839\u636e\u914d\u7f6e\u91cd\u8bd5\u6b21\u6570\uff0c\u6bcf\u6b21\u95f4\u96941\u79d2\n :param widget: \u6a21\u677f\u56fe\u7247\u8def\u5f84\n :param rate: \u76f8\u4f3c\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param match_number: \u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\n :return: \u5750\u6807\u5143\u7ec4\n \"\"\"\nif rate is None:\nrate = float(GlobalConfig.IMAGE_RATE)\ntry:\nfor element in widget:\nfor _ in range((match_number or int(GlobalConfig.IMAGE_MATCH_NUMBER)) + 1):\nlocate = cls._match_image_by_opencv(\nelement,\nrate,\nmultiple=multiple,\npicture_abspath=picture_abspath,\nscreen_bbox=screen_bbox\n)\nif not locate:\nsleep(int(GlobalConfig.IMAGE_MATCH_WAIT_TIME))\nelse:\nreturn locate\nraise TemplateElementNotFound(*widget)\nexcept Exception as e:\nraise e\n \u53c2\u6570 match_number \u7528\u4e8e\u63a7\u5236\u91cd\u590d\u8bc6\u522b\u7684\u6b21\u6570\uff0c\u9ed8\u8ba4\u4e0d\u4f20\u53c2\uff0c\u53d6\u5168\u5c40\u914d\u7f6e setting/globalconfig.ini \u91cc\u9762\u7684 IMAGE_MATCH_NUMBER \u914d\u7f6e\u9879\u7684\u503c\uff0c\u9ed8\u8ba4IMAGE_MATCH_NUMBER = 1\uff0c\u5373\u91cd\u8bd5 1 \u6b21\uff1b find_image \u662f\u6846\u67b6\u63d0\u4f9b\u7684\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u51fd\u6570\u63a5\u53e3\uff0c\u8fd9\u4e2a\u51fd\u6570\u63d0\u4f9b\u4e86\u9690\u5f0f\u7b49\u5f85\u7684\u529f\u80fd\uff0c\u4e14\u5305\u542b\u4e0a\u9762\u4ecb\u7ecd\u7684 _match_image_by_opencv \u51fd\u6570\u7684\u6240\u6709\u529f\u80fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2","title":"2\u3001\u6c14\u6ce1\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u6c14\u6ce1\u8bc6\u522b\u6307\u7684\u662f\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\u8981\u5b9a\u4f4d\u7684\u5143\u7d20\u662f\u4e00\u4e9b\u4f1a\u6d88\u5931\u7684\u5c0f\u5f39\u7a97\uff0c\u8fd9\u7c7b\u573a\u666f\u5728\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\u5c31\u53ef\u80fd\u5b58\u5728\u4e0d\u7a33\u5b9a\u6027\uff0c\u6709\u53ef\u80fd\u56fe\u50cf\u8bc6\u522b\u7684\u65f6\u5019\u6c14\u6ce1\u5df2\u7ecf\u6d88\u5931\u4e86\uff0c\u4e5f\u6709\u53ef\u80fd\u6c14\u6ce1\u51fa\u73b0\u7684\u65f6\u95f4\u592a\u77ed\u4e86\uff0c\u4e0d\u5bb9\u6613\u6355\u6349\u5230\uff0c\u5c31\u50cf\u6c14\u6ce1\u4e00\u6837\uff0c\u51fa\u73b0\u4e00\u4e0b\u5c31\u6d88\u5931\uff0c\u56e0\u6b64\u6211\u4eec\u5f62\u8c61\u7684\u79f0\u4e4b\u4e3a \u201c\u6c14\u6ce1\u8bc6\u522b\u201d\uff1b \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u4e3a\u4e86\u80fd\u7a33\u5b9a\u7684\u8bc6\u522b\u6c14\u6ce1\u7c7b\u573a\u666f\uff0c\u6211\u4eec\u91c7\u7528\u7684\u65b9\u6848\u662f\uff1a \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\uff08\u5305\u542b\u6c14\u6ce1\u4ece\u51fa\u73b0\u5230\u6d88\u5931\uff09\uff0c\u4e0d\u505c\u7684\u622a\u53d6\u8fd9\u6bb5\u65f6\u95f4\u5185\u7684\u5927\u56fe\uff0c\u4ee5\u6b64\u786e\u4fdd\u5728\u622a\u53d6\u7684\u4e00\u5806\u56fe\u7247\u4e2d\uff0c\u80af\u5b9a\u6709\u81f3\u5c11\u4e00\u5f20\u56fe\u7247\u80fd\u6355\u6349\u5230\u6c14\u6ce1\uff0c\u6700\u540e\u518d\u5bf9\u8fd9\u4e00\u5806\u56fe\u7247\u9010\u4e2a\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def get_during(\ncls,\nimage_path: str,\nscreen_time: [float, int],\nrate: float = None,\npause: [int, float] = None,\nmax_range: int = 10000\n):\n\"\"\"\n \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u622a\u56fe\u591a\u5f20\u56fe\u7247\u8fdb\u884c\u8bc6\u522b\uff0c\u5176\u4e2d\u6709\u4e00\u5f20\u56fe\u7247\u8bc6\u522b\u6210\u529f\u5373\u8fd4\u56de\u7ed3\u679c;\n \u9002\u7528\u4e8e\u6c14\u6ce1\u7c7b\u7684\u65ad\u8a00\uff0c\u6bd4\u5982\u6c14\u6ce1\u57281\u79d2\u5185\u6d88\u5931\uff0c\u5982\u679c\u7528\u5e38\u89c4\u7684\u56fe\u50cf\u8bc6\u522b\u5219\u6709\u53ef\u80fd\u65e0\u6cd5\u8bc6\u522b\u5230\uff1b\n :param image_path: \u8981\u8bc6\u522b\u7684\u6a21\u677f\u56fe\u7247\uff1b\n :param screen_time: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff1b\n :param rate: \u8bc6\u522b\u7387\uff1b\n :param pause: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u4e0d\u95f4\u9694\uff1b\n :param max_range: \u622a\u56fe\u7684\u6700\u5927\u6b21\u6570\uff0c\u8fd9\u662f\u4e00\u4e2a\u9884\u8bbe\u503c\uff0c\u4e00\u822c\u60c5\u51b5\u4e0b\u4e0d\u6d89\u53ca\u4fee\u6539\uff1b\n \"\"\"\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001screen_time \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5728\u6b64\u65f6\u95f4\u5185\u4f1a\u4e0d\u65ad\u7684\u8fdb\u884c\u622a\u56fe\u64cd\u4f5c\uff0c\u5c31\u50cf\u5f55\u5236\u89c6\u9891\u4e00\u6837\uff1b 2\u3001pause \u6bcf\u6b21\u622a\u53d6\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u4e00\u523b\u4e0d\u505c\u7684\u622a\u56fe\uff0c\u5982\u679c\u4f60\u60f3\u6bcf\u6b21\u622a\u56fe\u5b58\u5728\u4e00\u4e9b\u95f4\u9694\u65f6\u95f4\u4f20\u5165\u5bf9\u5e94\u7684\u65f6\u95f4\u95f4\u9694\u5373\u53ef\uff0c\u5355\u4f4d\u662f\u79d2\uff0c\u6bd4\u5982\uff1apause = 0.03\uff0c\u8868\u793a 30 ms\uff0c\u76f8\u5f53\u4e8e\u5e27\u7387\u4e3a 30 \u5e27\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-opencv","title":"3\u3001\u4e0d\u4f9d\u8d56 OpenCV \u7684\u56fe\u50cf\u8bc6\u522b\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31","title":"3.1\u3001\u81ea\u7814\u56fe\u50cf\u8bc6\u522b\u6280\u672f","text":"\u3010\u539f\u7406\u3011 \u4e3a\u4e86\u5b9e\u73b0\u8bc6\u522b\u56fe\u50cf\u7684\u76ee\u7684\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u5c06\u56fe\u7247\u7684\u6bcf\u4e2a\u50cf\u7d20\u7684RGB\u503c\uff0c\u4e0e\u6574\u4e2a\u5c4f\u5e55\u4e2d\u7684RGB\u8fdb\u884c\u5bf9\u6bd4\uff0c\u5982\u679c\u5c0f\u56fe\u4e0a\u7684RGB\u503c\u4e0e\u5bf9\u5e94\u5927\u56fe\u4f4d\u7f6e\u7684RGB\u90fd\u76f8\u7b49\uff0c\u5219\u5339\u914d\u6210\u529f\uff0c\u5373\u53ef\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u70b9\u3002 1\u3001\u8bfb\u53d6\u5c0f\u56fe\u548c\u5927\u56fe\u7684RGB\u503c \uff081\uff09\u5c0f\u56fe\u7684RGB\u503c small_data = small_pic.load() # load()\u4f1a\u5c06\u56fe\u7247\u7684RGB\u503c\u83b7\u53d6\u5230\uff0c\u6570\u636e\u683c\u5f0f\u4e3a\u4e00\u4e2a\u4e8c\u7ef4\u5217\u8868\uff0c\u8d4b\u503c\u7ed9\u4e00\u4e2a\u53d8\u91cfsmall_data\u3002\n \uff082\uff09\u5927\u56fe\u7684RGB\u503c big_data = big_pic.load()\n 2\u3001\u5c06\u5c0f\u56fe\u4e0e\u5927\u56fe\u7684RGB\u503c\u8fdb\u884c\u5339\u914d \uff081\uff09\u5339\u914d\u4ece\u5927\u56fe\u7684\u5750\u6807\uff080\uff0c0\uff09\u5f00\u59cb\u5339\u914d\uff0c\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff082\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\uff080\uff0c0\uff09\u5bf9\u5e94\u7684\u6240\u6709\u5c0f\u56fe\u7684RGB\u503c\u4e0d\u76f8\u7b49\uff0c\u5219\u79fb\u52a8\u5230\u4e0b\u4e00\u4e2a\u5750\u6807\u70b9\uff081\uff0c0\uff09\uff0c\u540c\u6837\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff083\uff09\u6309\u7167\u8fd9\u6837\u7684\u89c4\u5f8b\u5c06\u8fd9\u4e00\u884c\u6bcf\u79fb\u52a8\u4e00\u4e2a\u5750\u6807\u70b9\uff0c\u90fd\u5c06\u5c0f\u56fe\u6240\u6709\u7684RGB\u4e0e\u5bf9\u5e94\u5927\u56fe\u7684\u503c\u8fdb\u884c\u5339\u914d\uff1b \uff084\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\u5176\u4e2d\u4e00\u4e2a\u5750\u6807\u70b9\u4e0a\u5339\u914d\u5230\u4e86\u5c0f\u56fe\u7684\u6240\u6709RGB\u503c\uff0c\u5219\u6b64\u65f6\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\u70b9\uff1b \uff085\uff09\u5982\u679c\u5339\u914d\u4e86\u5927\u56fe\u6240\u6709\u7684\u5750\u6807\u70b9\uff0c\u90fd\u6ca1\u6709\u5339\u914d\u5230\uff0c\u5219\u8bf4\u660e\u5927\u56fe\u4e2d\u4e0d\u5b58\u5728\u5c0f\u56fe\uff0c\u5339\u914d\u5931\u8d25\uff1b \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 class ImageRgb:\n@staticmethod\ndef _check_match(_x, _y, small, bdata, sdata, rate):\n\"\"\"\n Matching degree of small graph and large graph matching\n \"\"\"\n@staticmethod\ndef _pre_random_point(small):\n\"\"\"\n Pre matching, take 10-20 points at random each time,\n and take coordinates randomly in the small graph\n \"\"\"\n@staticmethod\ndef _pre_random_match(_x, _y, point_list, bdata, sdata, rate):\n\"\"\"\n In the small graph, several points are randomly\n selected for matching, and the matching degree is\n also set for the random points\n \"\"\"\n@classmethod\ndef match_image_by_rgb(cls, image_name=None, image_path=None, rate=0.9):\n\"\"\"\n By comparing the RGB values of the small image with the large\n image on the screen, the coordinates of the small image on\n the screen are returned.\n \"\"\"\n \u901a\u8fc7 match_image_by_rgb() \u8fd9\u4e2a\u51fd\u6570\uff0c\u4f20\u5165\u76ee\u6807\u5c0f\u56fe\u7684\u6587\u4ef6\u540d\u79f0\uff0c\u5373\u53ef\u8fd4\u56de\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u3002 \u6709\u540c\u5b66\u8981\u95ee\u4e86\uff0c\u6709 OpenCV \u5e72\u561b\u4e0d\u7528\uff0c\u6709\u5fc5\u8981\u81ea\u5df1\u5b9e\u73b0\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u529f\u80fd\u5417\uff0c\u4f60\u4eec\u662f\u4e0d\u662f\u95f2\u7684\u554a\uff1f \u8fd9\u4e48\u95ee\u7684\u8bdd\uff0c\u5c0f\u4e86\uff0c\u683c\u5c40\u5c0f\u4e86\uff1b\u6211\u4eec\u81ea\u5df1\u5b9e\u73b0\u4e3b\u8981\u6709\u51e0\u65b9\u9762\u539f\u56e0\uff1a \u51cf\u5c11\u73af\u5883\u4f9d\u8d56\uff0c\u5373\u4e0d\u7528\u5b89\u88c5 OpenCV\uff0c\u6211\u4eec\u4e5f\u80fd\u5b9e\u73b0\u5176\u529f\u80fd\uff0c\u73af\u5883\u4f9d\u8d56\u8fd9\u5757\u540e\u9762\u4f1a\u5355\u72ec\u8be6\u7ec6\u8bb2\uff0c\u51cf\u5c11\u73af\u5883\u4f9d\u8d56\u5bf9\u4e8e\u4efb\u4f55\u8f6f\u4ef6\u5de5\u7a0b\u90fd\u975e\u5e38\u91cd\u8981\uff1b OpenCV \u5728\u5176\u4ed6\u56fd\u4ea7 CPU \u67b6\u6784\u4e0a\u5b89\u88c5\u5e76\u4e0d\u80fd\u4fdd\u8bc1100%\u6210\u529f\uff0c\u751a\u81f3\u6709\u6ca1\u6709\u53ef\u80fd\u5728\u4e00\u4e9b\u67b6\u6784\u4e0a\u538b\u6839\u513f\u5c31\u4e0d\u80fd\u5b89\u88c5\u4f7f\u7528 OpenCV \uff1f \u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 OpenCV \uff1f\u5c31\u50cf\u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 Windows \u5462\uff1f\u8fd9\u4e9b\u95ee\u9898\u503c\u5f97\u601d\u8003\u3002 \u5f53\u7136\uff0c\u6211\u4eec\u627f\u8ba4\u8fd9\u5957\u65b9\u6848\uff0c\u867d\u7136\u8bc6\u522b\u51c6\u786e\u7387\u6ca1\u95ee\u9898\uff0c\u4f46\u5728\u8bc6\u522b\u6548\u7387\u4e0a\u8fd8\u6ca1\u6709\u8fbe\u5230 OpenCV \u6a21\u677f\u5339\u914d\u7684\u6548\u679c\uff0c\u6211\u4eec\u7684\u65b9\u6848\u6bcf\u6b21\u8bc6\u522b\u5728 1.5s \u5de6\u53f3\uff0c\u800c OpenCV \u5728 1s \u5de6\u53f3\uff1b \u6574\u4f53\u8bc6\u522b\u6548\u679c\u6765\u8bb2\uff0c\u6211\u8ba4\u4e3a\u8fd8\u662f\u53ef\u4ee5\u63a5\u53d7\u7684\uff0c\u4e5f\u5e0c\u671b\u6709\u5fd7\u4e4b\u58eb\u80fd\u4e00\u8d77\u4f18\u5316\u6b64\u65b9\u6848\uff0c\u4e00\u8d77\u6280\u672f\u62a5\u56fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32-rpc","title":"3.2\u3001\u57fa\u4e8e RPC \u670d\u52a1\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b","text":"\u5728\u8fdc\u7a0b\u670d\u52a1\u5668\u4e0a\u90e8\u7f72 OpenCV \u7684\u73af\u5883\uff0c\u5e76\u5c06\u5176\u90e8\u7f72\u4e3a RPC \u670d\u52a1\uff0c\u6d4b\u8bd5\u673a\u4e0a\u4e0d\u7528\u5b89\u88c5 OpenCV \u4f9d\u8d56\uff0c\u800c\u662f\u901a\u8fc7\u8bf7\u6c42 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u3010\u539f\u7406\u3011 \u6d4b\u8bd5\u673a\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u56fe\u7247\u4ee5\u53ca\u6a21\u677f\u56fe\u7247\uff0c\u53d1\u9001\u7ed9 RPC \u670d\u52a1\u7aef\uff0c\u670d\u52a1\u7aef\u62ff\u5230\u4e24\u5f20\u56fe\u7247\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u6700\u540e\u5c06\u8bc6\u522b\u7ed3\u679c\u8fd4\u56de\u7ed9\u6d4b\u8bd5\u673a\uff1b \u8981\u7279\u6b8a\u8bf4\u660e\u7684\u662f\uff1a RPC \u662f\u4e00\u79cd\u534f\u8bae\uff0c\u8bb8\u591a\u8bed\u8a00\u90fd\u662f\u652f\u6301\u7684\uff0c\u6bd4\u5982\u8bf4\u670d\u52a1\u7aef\u4e5f\u53ef\u4ee5\u7528 C++ \u6765\u5b9e\u73b0\uff0c\u5ba2\u6237\u7aef\u4f7f\u7528 Python \u4e5f\u662f\u53ef\u4ee5\u8c03\u7528\u7684\u3002 \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 \u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nimport cv2 as cv\nimport numpy as np\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\nif __name__ == \"__main__\":\nserver = ThreadXMLRPCServer((\"x.x.x.x\", 8889), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(match_image_by_opencv, \"match_image_by_opencv\")\nserver.serve_forever()\n \u8fd9\u6837\uff0c\u6211\u4eec\u57fa\u4e8e Python \u6807\u51c6\u5e93 xmlrpc \u642d\u5efa\u4e86\u4e00\u4e2a RPC \u670d\u52a1\u5668\uff0c\u6ce8\u518c\u4e86 image_put \u548c match_image_by_opencv \u4e24\u4e2a\u529f\u80fd\u63a5\u53e3\uff0c\u5728\u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u901a\u8fc7 IP \u548c\u7aef\u53e3\u8fdb\u884c RPC \u8bf7\u6c42\uff1b \u5ba2\u6237\u7aef\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from xmlrpc.client import Binary\nfrom xmlrpc.client import ServerProxy\nserver = ServerProxy(GlobalConfig.OPENCV_SERVER_HOST, allow_none=True)\nscreen_rb = open(screen, \"rb\")\ntemplate_rb = open(template_path, \"rb\")\ntry:\nscreen_path = server.image_put(Binary(screen_rb.read()))\nscreen_rb.close()\ntpl_path = server.image_put(Binary(template_rb.read()))\ntemplate_rb.close()\nreturn server.match_image_by_opencv(\ntpl_path, screen_path, rate, multiple\n)\nexcept OSError as exc:\nraise EnvironmentError(\nf\"RPC\u670d\u52a1\u5668\u94fe\u63a5\u5931\u8d25. {GlobalConfig.OPENCV_SERVER_HOST}\"\n) from exc\n \u901a\u8fc7\u8fd4\u56de server.match_image_by_opencv \u5c31\u83b7\u53d6\u4e86\u5728\u670d\u52a1\u7aef\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4","title":"4\u3001\u53f3\u952e\u83dc\u5355\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41","title":"4.1\u3001\u53f3\u952e\u83dc\u5355\u5b9a\u4f4d\u7684\u65b9\u6848\u53ca\u95ee\u9898","text":"\u53f3\u952e\u83dc\u5355\u7684\u5143\u7d20\u5b9a\u4f4d\u662f\u4e00\u4e2a\u96be\u70b9\uff0c\u8fc7\u53bb\u6211\u4eec\u8c03\u7814\u548c\u4f7f\u7528\u8fc7\u7684\u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u65b9\u6cd5\u6709 4 \u79cd\uff1a \u7b2c\u4e00\u79cd\uff1a\u6b65\u957f\u64cd\u4f5c\u6cd5 \u5728\u53f3\u952e\u83dc\u5355\u547c\u51fa\u6765\u4e4b\u540e\uff0c\u901a\u8fc7\u952e\u76d8\u7684 up\u3001down \u6309\u952e\uff0c\u8fdb\u884c\u9009\u62e9\u83dc\u5355\u9009\u62e9\uff0c\u9009\u4e2d\u76ee\u6807\u4e4b\u540e enter \u5373\u53ef\uff1b\u6bd4\u5982\uff1a\u5728\u684c\u9762\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\uff0c\u6309 1 \u6b21 down \uff0c\u4f1a\u51fa\u73b0\u4e0b\u56fe\uff1a \u7ee7\u7eed\u518d\u6309 2 \u6b21 down\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u518d\u6309 enter\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u5982\u6b64\uff0c\u201c\u6392\u5e8f\u65b9\u5f0f\u201d\u7684\u6b65\u957f\u4e3a 3\uff1b\u901a\u8fc7\u4f7f\u7528\u952e\u76d8\u4e0a\u4e0b\u952e\uff0c\u5c31\u5b9e\u73b0\u4e86\u5bf9\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\uff1b \u4f46\u662f\uff0c\u8fd9\u79cd\u65b9\u5f0f\u6709\u4e2a\u5f88\u70e6\u4eba\u7684\u95ee\u9898\uff0c\u5c31\u662f\u53f3\u952e\u83dc\u5355\u7684\u9009\u9879\u4f4d\u7f6e\u4e0d\u53ef\u80fd\u4e00\u76f4\u4e0d\u53d8\uff0c\u5728\u9700\u6c42\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\uff0c\u83dc\u5355\u9009\u9879\u7684\u53d8\u5316\u662f\u5f88\u5927\u7684\uff0c\u751a\u81f3\u6709\u4e9b\u5e94\u7528\u652f\u6301\u81ea\u5b9a\u4e49\u83dc\u5355\uff0c\u6bd4\u5982\u6587\u7ba1\u53f3\u952e\u83dc\u5355\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff1b \u4e5f\u5c31\u662f\u8bf4\u4f60\u5f97\u7ecf\u5e38\u53bb\u7ef4\u62a4\u83dc\u5355\u9009\u9879\u7684\u6b65\u957f\uff0c\u4e00\u4e2a\u9009\u9879\u73b0\u5728\u7684\u6b65\u957f\u662f 3\uff0c\u4e0b\u4e2a\u8fed\u4ee3\u53ef\u80fd\u5c31\u662f 4 \u6216\u8005 5\u3002 \u7b2c\u4e8c\u79cd\uff1a\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u6cd5 \u628a\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5355\u72ec\u622a\u56fe\u4fdd\u5b58\uff0c\u56fe\u7247\u4e2d\u4ec5\u5305\u542b\u4e00\u4e2a\u83dc\u5355\u9009\u9879\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u8fd9\u6837\uff0c\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5c31\u53ef\u4ee5\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u65b9\u5f0f\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u8fd9\u79cd\u65b9\u5f0f\u4e0d\u7528\u62c5\u5fc3\u83dc\u5355\u9009\u9879\u7684\u987a\u5e8f\u6216\u4f4d\u7f6e\uff0c\u4f46\u662f\u9700\u8981\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff0c\u4e14\u5bb9\u6613\u53d7\u5230\u5b57\u4f53 UI \u53d8\u66f4\u7c7b\u9700\u6c42\u7684\u5f71\u54cd\uff0c\u6bd4\u5982\uff1a\u5b57\u4f53\u5927\u5c0f\u3001\u5b57\u4f53\u95f4\u8ddd\u7b49\u7b49\u9700\u6c42\u53d8\u66f4\u90fd\u4f1a\u5f71\u54cd\uff0c\u6bcf\u6b21\u53d8\u66f4\u4e4b\u540e\u5c31\u9700\u8981\u8fdb\u884c\u5927\u91cf\u56fe\u7247\u8d44\u6e90\u7684\u91cd\u65b0\u622a\u56fe\u66ff\u6362\uff0c\u662f\u4e2a\u6bd4\u8f83\u9ebb\u70e6\u7684\u4e8b\u60c5\uff1b \u7b2c\u4e09\u79cd\uff1a\u76f8\u5bf9\u4f4d\u79fb\u6cd5 \u9f20\u6807\u70b9\u51fb\u53f3\u952e\u7684\u65f6\u5019\uff0c\u9f20\u6807\u7684\u5f53\u524d\u5750\u6807\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u7684\uff0c\u83dc\u5355\u9009\u9879\u7684\u5bbd\uff08 w \uff09\u4e00\u822c\u662f\u56fa\u5b9a\u7684\uff0c\u53d8\u5316\u7684\u662f\u83dc\u5355\u7684\u957f\u5ea6\uff08 h \uff09\uff0c\u53ef\u4ee5\u901a\u8fc7\u67d0\u4e2a\u9009\u9879\u76f8\u5bf9\u4e8e\u9f20\u6807\u7684\u8ddd\u79bb\u5728\u786e\u5b9a\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u901a\u8fc7\u7ef4\u62a4\u83dc\u5355\u9009\u9879\uff08\u76f8\u5bf9\u4f4d\u7f6e\uff09\u76f8\u5bf9\u4e8e\u9f20\u6807\u4f4d\u7f6e\u7684\u8ddd\u79bb\uff0c\u5373\u53ef\u8f7b\u677e\u8ba1\u7b97\u51fa\u83dc\u5355\u9009\u9879\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\u3002 \u4ece\u7406\u8bba\u4e0a\u6b64\u65b9\u6848\u662f\u53ef\u884c\u7684\uff0c\u4f46\u662f\u8fd9\u91cc\u4ecd\u7136\u5b58\u5728\u4e24\u4e2a\u4e25\u91cd\u7684\u95ee\u9898\uff1a \u83dc\u5355\u987a\u5e8f\u6539\u53d8\uff0c\u5bfc\u81f4\u76f8\u5bf9\u8ddd\u79bb\u6539\u53d8\uff0c\u800c\u4e14\u8ddd\u79bb\u662f\u901a\u8fc7\u50cf\u7d20\uff08px\uff09\u6765\u8868\u793a\u7684\uff0c\u4e0d\u60f3\u6b65\u957f\u90a3\u4e48\u53ea\u7ba1\uff0c\u6bcf\u6b21\u9700\u8981\u53bb\u91cf\u4e00\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u70b9\u9ebb\u70e6\uff1b \u9f20\u6807\u5728\u684c\u9762\u4e0d\u540c\u4f4d\u7f6e\u70b9\u51fb\u53f3\u952e\uff0c\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u4f4d\u7f6e\u662f\u4e0d\u540c\u7684\uff0c\u4e0a\u56fe\u7684\u83dc\u5355\u662f\u5728\u9f20\u6807\u7684\u5de6\u4e0b\u65b9\uff0c\u5982\u679c\u4f60\u79fb\u52a8\u9f20\u6807\u5230\u5c4f\u5e55\u56db\u8fb9\uff0c\u4f60\u4f1a\u53d1\u73b0\uff0c\u53f3\u952e\u83dc\u5355\u53ef\u80fd\u51fa\u73b0\u5728\u9f20\u6807\u7684\u56db\u4e2a\u65b9\u5411\uff0c\u4e5f\u5c31\u662f\u8bf4\u4f60\u9700\u8981\u6839\u636e\u9f20\u6807\u7684\u4e0d\u540c\u4f4d\u7f6e\u6765\u5224\u65ad\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u65b9\u5411\uff0c\u800c\u4e0d\u540c\u7684\u65b9\u5411\u4e0a\u8ba1\u7b97\u65b9\u6cd5\u662f\u4e0d\u540c\u7684\uff0c\u6bd4\u5982\uff1a\u53f3\u952e\u83dc\u5355\u5728\u9f20\u6807\u7684\u5de6\u4e0a\uff0c\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\u8ba1\u7b97\u65b9\u6cd5\u4e3a\uff08x - w / 2\uff0c y - h\uff09\uff0c\u8fd9\u6837\u7ef4\u62a4\u8d77\u6765\u53ef\u4ee5\u8bf4\u975e\u5e38\u590d\u6742\uff1b \u57fa\u4e8e\u4ee5\u4e0a\u4e24\u4e2a\u539f\u56e0\uff0c\u6211\u4eec\u5e76\u4e0d\u63a8\u8350\u8fd9\u79cd\u64cd\u4f5c\u65b9\u6848\u3002 \u7b2c\u56db\u79cd\uff1a\u5c5e\u6027\u5b9a\u4f4d \u6709\u540c\u5b66\u8bf4\u5e72\u561b\u4e0d\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u5462\uff0c\u5176\u5b9e\uff0c\u6211\u4eec\u6700\u5f00\u59cb\u60f3\u5230\u7684\u65b9\u6848\u5c31\u662f\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\uff0c\u4f46\u662f\u5728\u5c5e\u6027\u7684 DOM \u6811\u91cc\u600e\u4e48\u4e5f\u627e\u4e0d\u5230\uff0c\u65e0\u6cd5\u5b9a\u4f4d\u5230\uff0c\u6211\u4eec\u4e5f\u8054\u5408\u7814\u53d1\u540c\u5b66\u4e00\u8d77\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u4f46\u6700\u7ec8\u8fd8\u662f\u6ca1\u80fd\u89e3\u51b3\uff0c\u975e\u5e38\u9057\u61be\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42","title":"4.2\u3001\u6700\u65b0\u7684\u53f3\u952e\u83dc\u5355\u7ec8\u6781\u89e3\u51b3\u65b9\u6848","text":"\u7531\u4e8e\u53f3\u952e\u83dc\u5355\u9009\u9879\u51e0\u4e4e\u90fd\u662f\u6587\u672c\uff0c\u90a3\u4e48\u901a\u8fc7 OCR \u8bc6\u522b\uff0c\u51e0\u4e4e\u662f\u6700\u4f18\u7684\u65b9\u6848\uff1a \u4e0d\u7528\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff1b \u4e0d\u4f1a\u53d7\u5230\u83dc\u5355\u9009\u9879\u987a\u5e8f\u6539\u53d8\u7684\u5f71\u54cd\uff1b \u4e0d\u4f1a\u53d7\u5230\u5b57\u4f53 UI \u53d8\u5316\u7684\u5f71\u54cd\uff1b \u5173\u4e8e OCR \u8bc6\u522b\u6211\u4eec\u5728\u540e\u9762\u4f1a\u8be6\u7ec6\u8bb2\u5230\uff0c\u672c\u7ae0\u8282\u4e3b\u8981\u8bb2\u57fa\u4e8e OCR \u8bc6\u522b\uff0c\u6211\u4eec\u5728\u53f3\u952e\u83dc\u5355\u8bc6\u522b\u4e0a\u7684\u7a81\u7834\u548c\u521b\u65b0\uff1b \u4f7f\u7528 OCR \u8bc6\u522b\u53f3\u952e\u83dc\u5355\u867d\u7136\u5df2\u7ecf\u5f88\u5b8c\u7f8e\u4e86\uff0c\u4f46\u662f\u5728\u4e00\u4e9b\u60c5\u51b5\u4e0b\u4ecd\u7136\u5b58\u5728\u4e00\u70b9\u95ee\u9898\uff0c\u5c31\u662f\u5c4f\u5e55\u4e2d\u51fa\u73b0\u591a\u4e2a\u548c\u83dc\u5355\u9009\u9879\u6587\u5b57\u76f8\u540c\u7684\u6587\u5b57\u65f6\uff0c\u6bd4\u5982\u4e0b\u9762\u8fd9\u79cd\u60c5\u51b5\uff1a \u5c4f\u5e55\u6070\u597d\u51fa\u73b0\u4e86\u4e24\u4e2a\u201c\u590d\u5236\u201d\uff0c\u6b64\u65f6\u8981\u5b9a\u4f4d\u5230\u83dc\u5355\u4e2d\u7684 \u201c\u590d\u5236\u201d\uff0c\u5c31\u9700\u8981\u8fdb\u4e00\u6b65\u505a\u6570\u636e\u5904\u7406\uff0c\u6bd4\u5982\uff1aOCR \u8fd4\u56de 2 \u4e2a\u201c\u590d\u5236\u201d\u7684\u5750\u6807\uff0c\u7528\u4f8b\u91cc\u9762\u6765\u5224\u65ad\u7528\u54ea\u4e2a\uff0c\u4ece\u4e1a\u52a1\u4e0a\u5c06\u5904\u7406\u8d77\u6765\u6bd4\u8f83\u9ebb\u70e6\uff0c\u56e0\u4e3a\u4f60\u5f97\u660e\u786e\u77e5\u9053\u83dc\u5355\u5728\u5de6\u8fb9\u8fd8\u662f\u53f3\u8fb9\uff0c\u7136\u540e\u8fd9\u672c\u8eab\u5c31\u662f\u4e0d\u786e\u5b9a\u7684\uff1b \u600e\u4e48\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u5462\uff0c\u8fd9\u5c31\u8981\u8bf4\u9053\u672c\u7ae0\u7684\u4e3b\u9898\uff1a\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b\u3002 \u3010\u539f\u7406\u3011 \u5728\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u524d\u622a\u4e00\u5f20\u56fe\uff0c\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\u518d\u622a\u53d6\u4e00\u5f20\u56fe\uff0c\u4e24\u5f20\u56fe\u552f\u4e00\u53d8\u5316\u7684\u5c31\u662f\u53f3\u952e\u83dc\u5355\uff0c\u5c06\u5176\u4ed6\u76f8\u540c\u7684\u5730\u65b9\u90fd\u5c4f\u853d\u6389\uff0c\u53ea\u7559\u4e0b\u83dc\u5355\u754c\u9762\uff0c\u5982\u6b64\u5373\u53ef\u6d88\u9664\u5e72\u6270\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u5c06\u4e24\u79cd\u56fe\u505a\u524d\u540e\u5bf9\u6bd4\u63d0\u53d6\u53ef\u4ee5\u5f97\u5230\u8fd9\u6837\u7684\u56fe\uff1a \u4f60\u770b\uff0c\u901a\u8fc7\u524d\u540e\u56fe\u7247\u7684\u5bf9\u6bd4\uff0c\u5c06\u76f8\u540c\u7684\u90e8\u5206\u7ed9\u6d88\u9664\u6389\uff0c\u518d\u8fdb\u884c OCR \u8bc6\u522b\uff0c\u8fd9\u6837\u5c31\u4e0d\u4f1a\u6709\u5e72\u6270\u4e86\uff1b \u4ee3\u7801\u5b9e\u73b0\u8bf7\u67e5\u770b src/filter_image.py \uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def filter_image(action):\n\"\"\"\n \u5bf9\u6bd4\u52a8\u4f5c\u524d\u540e\u4e24\u5f20\u56fe\u7247\uff0c\u63d0\u53d6\u4e0d\u540c\u7684\u90e8\u5206\u751f\u6210\u4e00\u5f20\u65b0\u7684\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u65b0\u56fe\u7247\u7684\u8def\u5f84\n :param action: \u52a8\u4f5c\u51fd\u6570\u7684\u51fd\u6570\u5bf9\u8c61\n :return: \u65b0\u56fe\u7247\u7684\u8def\u5f84\n \"\"\"\n action \u662f\u9f20\u6807\u4e8b\u4ef6\uff0c\u56e0\u4e3a\u6b64\u7c7b\u573a\u666f\u4e0d\u4ec5\u4ec5\u5728\u53f3\u952e\u5b58\u5728\uff0c\u5355\u51fb\u3001\u53cc\u51fb\u7b49\u7b49\uff0c\u53ea\u8981\u64cd\u4f5c\u524d\u540e\u540e\u53d8\u5316\u7684\u90fd\u53ef\u4ee5\uff1a from src.mouse_key import MouseKey\naction = (\nMouseKey.click,\nMouseKey.right_click,\nMouseKey.double_click,\nMouseKey.move_to,\n)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5","title":"5\u3001\u52a8\u6001\u56fe\u50cf\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5728\u684c\u9762\u58c1\u7eb8\u5207\u6362\uff0c\u6216\u770b\u56fe\u3001\u76f8\u518c\u5207\u6362\u56fe\u7247\u7c7b\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u7531\u4e8e\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u662f\u4e0d\u56fa\u5b9a\u7684\uff08\u4e0d\u540c\u7248\u672c\u7684\u7cfb\u7edf\u58c1\u7eb8\u4e0d\u540c\u3001\u58c1\u7eb8\u987a\u5e8f\u4e0d\u540c\uff0c\u770b\u56fe\u76f8\u518c\u5728\u56fe\u7247\u8d44\u6e90\u4e0d\u4e00\u5b9a\u56fa\u5b9a\uff09\uff0c\u90a3\u4e48\u5728\u6d4b\u8bd5\u5207\u6362\u58c1\u7eb8\u6216\u8005\u5207\u6362\u56fe\u7247\u7684\u573a\u666f\u65f6\u5c31\u4f1a\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u4f60\u4e0d\u77e5\u9053\u9884\u671f\u662f\u5565\uff0c\u7528\u4f8b\u64cd\u4f5c\u52a8\u6001\u7684\uff0c\u4e5f\u662f\u6781\u4e0d\u7a33\u5b9a\u3002 \u3010\u539f\u7406\u3011 \u5728\u5207\u6362\u56fe\u7247\u4e4b\u524d\u622a\u56fe\u4fdd\u5b58\u5e76\u8fd4\u56de\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u6b21\u8bc6\u522b\u8fd9\u5f20\u56fe\u7247\uff0c\u5982\u679c\u4e0d\u5b58\u5728\uff0c\u8bf4\u660e\u56fe\u7247\u5df2\u7ecf\u5207\u6362\u4e86\uff1b \u793a\u610f\u56fe\uff1a \u8fd9\u6837\uff0c\u6211\u4eec\u622a\u53d6\u4e86\u5f53\u524d\u56fe\u7247\u4e2d\u6bd4\u8f83\u6709\u4ee3\u8868\u6027\u7684\u4f4d\u7f6e\uff08\u4e00\u53ea\u9e1f\uff09\uff0c\u5728\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u7528\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1a \u6211\u4eec\u518d\u62ff\u7740\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd9\u6837\u5728\u5f53\u524d\u56fe\u7247\u4e2d\uff0c\u5c31\u4e0d\u80fd\u627e\u5230\u8fd9\u53ea\u9e1f\u4e86\uff0c\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u662f False\uff0c\u90a3\u4e48\u4e5f\u5c31\u53ef\u4ee5\u5224\u65ad\u56fe\u7247\u5207\u6362\u662f\u6210\u529f\u7684\u3002 \u4ee3\u7801\u793a\u610f\uff1a def save_temporary_picture(_x: int, _y: int, width: int, height: int):\n\"\"\"\n \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u56fe\u7247\u8def\u5f84\n :param x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n :param y: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n :param width: \u5bbd\u5ea6\n :param height: \u9ad8\u5ea6\n :return: \u56fe\u7247\u8def\u5f84\n \"\"\"\n \u6b64\u51fd\u6570\u7528\u4e8e\u5728\u64cd\u4f5c\u4e4b\u524d\u622a\u56fe\u4e00\u5f20\u4e34\u65f6\u56fe\u7247\uff0c\u8fd4\u56de\u56fe\u7247\u8def\u5f84\uff0c\u6700\u540e\u5728\u65ad\u8a00\u7684\u65f6\u5019\u518d\u5c06\u56fe\u7247\u8def\u5f84\u4f5c\u4e3a\u53c2\u6570\u4f20\u5165\u65ad\u8a00\u8bed\u53e5\u5373\u53ef\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ui","title":"\u4e09\u3001\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_1","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u662f\u6211\u4eec\u81ea\u7814\u7684\u4e00\u79cd\u4f7f\u7528\u7b80\u5355\uff0c\u4e14\u6548\u7387\u6781\u9ad8\u3001\u7a33\u5b9a\u6027\u597d\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u57fa\u4e8e\u5143\u7d20\u6309\u94ae\u5728\u5e94\u7528\u4e2d\u7684\u76f8\u5bf9\u4f4d\u7f6e\uff0c\u52a8\u6001\u83b7\u53d6\u5143\u7d20\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff0c\u9002\u7528\u4e8e\u5404\u79cd\u5c4f\u5e55\u5206\u8fa8\u7387\uff08\u5305\u62ec\u9ad8\u5206\u5c4f\u3001\u5bbd\u5c4f\u3001\u5e26\u9c7c\u5c4f\uff09\uff0c\u5f53\u5143\u7d20\u6309\u94ae\u4f4d\u7f6e\u76f8\u5bf9\u4e8e\u5e94\u7528\u754c\u9762\u4f4d\u7f6e\u53d1\u751f\u4fee\u6539\u4e4b\u540e\uff0c\u53ea\u9700\u8981\u6839\u636e UI \u8bbe\u8ba1\u56fe\u4e0a\u7684\u6e90\u6570\u636e\u4fee\u6539\u5bf9\u5e94\u5750\u6807\u6570\u636e\u5c31\u597d\uff0c\u7ef4\u62a4\u975e\u5e38\u7684\u65b9\u4fbf\u3002 \u6b64\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u9002\u7528\u4e8e\u4e00\u4e9b\u5143\u7d20\u4f4d\u7f6e\u76f8\u5bf9\u4e0e\u5e94\u7528\u754c\u9762\u6bd4\u8f83\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u97f3\u4e50\uff0899% \u7684\u5143\u7d20\u5b9a\u4f4d\u91c7\u7528\u8fd9\u79cd\uff0c\u6548\u679c\u975e\u5e38\u597d\uff09\uff0c\u4e0d\u9002\u7528\u4e8e\u754c\u9762\u4e0d\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u622a\u56fe\u5f55\u5c4f\uff0c\u5f88\u660e\u663e\u4e0d\u9002\u7528\u4e8e\u8fd9\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u3002\u8fd9\u79cd\u5168\u65b0\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u6709\u5b83\u7684\u9002\u7528\u6761\u4ef6\uff0c\u5982\u679c\u4f60\u53d1\u73b0\u4f7f\u7528\u5e38\u89c4\u7684\uff08\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u5b9a\u4f4d\uff09\u4e0d\u597d\u505a\u65f6\uff0c\u4e0d\u59a8\u8003\u8651\u4f7f\u7528\u8fd9\u79cd\uff0c\u5176\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff0c\u5e76\u4e14\u8fc5\u901f\u7231\u4e0a\u4ed6\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_1","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5728 UI \u8bbe\u8ba1\u56fe\u4e2d\u6211\u4eec\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u8fb9\u6846\u7684\u8ddd\u79bb\u7684\uff0c\u7136\u540e\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u6280\u672f\u624b\u6bb5\u83b7\u53d6\u5230\u5e94\u7528\u754c\u9762\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u53ca\u5e94\u7528\u7a97\u53e3\u7684\u5927\u5c0f\uff0c\u793a\u610f\u56fe\u5982\u4e0b\uff1a \uff08x1, y1\uff09\u4e3a\u5e94\u7528\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\uff1b\uff08x2, y2\uff09\u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u5de6\u4e0a\u89d2\uff08x1, y1\uff09\u7684\u5750\u6807\uff0c\u90a3\u4e48\u5b9e\u9645\u4e0a\u3010\u64ad\u653e\u6240\u6709\u3011\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\u4e3a\uff1a\uff08 x1 + x2, y1 + y2 \uff09\uff1b \u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5927\u5c0f\uff08w2, h2\uff09\uff0c\u53ef\u4ee5\u4ece UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\uff1b \u5728 UI \u8bbe\u8ba1\u7a3f\u4e0a\u70b9\u51fb\u3010\u64ad\u653e\u6240\u6709\u3011\u56fe\u6807\uff0c\u7136\u540e\u79fb\u52a8\u9f20\u6807\u5c31\u5c31\u53ef\u4ee5\u770b\u5230\u4e0a\u56fe\u7684\u53c2\u8003\u7ebf\u53ca\u6570\u636e\uff1b \u6240\u4ee5\uff0c\u6211\u4eec\u53ef\u4ee5\u8f7b\u677e\u7684\u83b7\u53d6\u5230\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u4e2d\u5fc3\u5750\u6807\u4e3a\uff1a\uff08 x1 + x2 + (w2 / 2), y1 + y2 + ( h2 / 2) \uff09 \u8be6\u7ec6\u6e90\u4ee3\u7801\u8bf7\u67e5\u770b AT \u57fa\u7840\u6846\u67b6: src/button_center.py \u83b7\u53d6\u5e94\u7528\u7a97\u53e3\u7684\u4fe1\u606f \u4f7f\u7528 xdotool \u548c xwininfo \u83b7\u53d6\u5230\u5e94\u7528\u7a97\u53e3\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u5de6\u4e0a\u89d2\uff09\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a app_id = CmdCtl.run_cmd(f\"xdotool search --classname --onlyvisible {self.app_name}\"\n).split(\"\\n\")\napp_id_list = [int(_id) for _id in app_id if _id]\nreturn CmdCtl.run_cmd(f\"xwininfo -id {app_id_list[self.number]}\")\n \u4f7f\u7528\u6b63\u5219\u83b7\u53d6\u7a97\u53e3\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u83b7\u53d6\u914d\u7f6e \u8bfb ini \u914d\u7f6e\u6587\u4ef6\uff0c\u83b7\u53d6\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e0e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a conf = ConfigParser()\nconf.read(self.config_path)\ndirection = conf.get(btn_name, \"direction\")\nposition = [int(i.strip()) for i in conf.get(btn_name, \"location\").split(\",\")]\n \u8ba1\u7b97\u5143\u7d20\u6309\u94ae\u5750\u6807 \u6839\u636e\u5e94\u7528\u7a97\u53e3\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u5927\u5c0f\u3001\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u5927\u5c0f\uff0c\u4f7f\u7528\u4e00\u5b9a\u7684\u7b97\u6cd5\u5373\u53ef\u8ba1\u7b97\u51fa\u5143\u7d20\u6309\u94ae\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u4e2d\u5fc3\u5750\u6807\uff09\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3","title":"3\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u3010\u914d\u7f6e\u65b9\u6cd5\u3011 \u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u7684\u6570\u636e\u6e90\u662f\u5e94\u7528\u5e93\u4e2d\u7684 ui.ini \u914d\u7f6e\u6587\u4ef6\uff1a ;section\n[\u65b0\u5efa\u6b4c\u5355+] ;key = value\ndirection = left_top\nlocation = 180, 268, 21, 21\n section \u662f\u4f60\u6839\u636e\u5bf9\u5e94\u7684\u5143\u7d20\u6309\u94ae\u547d\u540d\uff0c\u4f60\u53ef\u4ee5\u4efb\u610f\u547d\u540d\uff0c\u4f46\u6700\u597d\u6709\u5177\u4f53\u542b\u4e49\uff0c\u4e14\u80fd\u660e\u786e\u8868\u793a\u8fd9\u4e2a\u5143\u7d20\u6309\u94ae\u7684\u540d\u79f0\uff1b\u7528\u4e2d\u62ec\u53f7\u62ec\u8d77\u6765\u5c31\u884c\uff0c\u6bd4\u5982\uff1a[\u65b0\u5efa\u6b4c\u5355+] \uff1b direction \u662f\u914d\u7f6e\u8be5\u5143\u7d20\u7684\u53c2\u8003\u7cfb\uff0c\u5206\u522b\u4e3a\uff1a left_top \u5de6\u4e0a\uff1b left_bottom \u5de6\u4e0b\uff1b right_top \u53f3\u4e0a\uff1b right_bottom \u53f3\u4e0b\uff1b \u53c2\u8003\u7cfb\u7684\u9009\u53d6\u6807\u51c6\uff1a\u62c9\u52a8\u6539\u53d8\u7a97\u53e3\u5927\u5c0f\u65f6\uff0c\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u53c2\u8003\u7cfb\u4f4d\u7f6e\u662f\u4e0d\u53d8\u7684\uff1b location \u662f\u8be5\u5143\u7d20\u6309\u94ae\u7684\u76f8\u5bf9\u4e0e\u53c2\u8003\u7cfb\u7684 x, y \u7684\u8ddd\u79bb\uff0c\u53ca\u5927\u5c0f(w, h)\uff0c\u8fd9\u56db\u4e2a\u6570\u636e\u53ef\u4ee5\u901a\u8fc7 UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\u6570\u636e\uff0c\u5728\u7f16\u8f91\u6a21\u5f0f\u4e0b\uff0c\u70b9\u51fb UI \u56fe\u4e0a\u7684\u6309\u94ae\uff0c\u53f3\u4fa7\u5c31\u4f1a\u51fa\u73b0\u8be5\u5143\u7d20\u6309\u94ae\u7684 x, y, w, h \u6570\u636e\u3002 \u5982\u679c UI \u56fe\u4e0a\u6ca1\u6709\u63d0\u4f9b\u4f60\u60f3\u8981\u7684\u5143\u7d20\u6570\u636e\uff0c\u4f60\u53ef\u4ee5\u76f4\u63a5\u5728\u7cfb\u7edf\u4e2d\u4f7f\u7528\u622a\u56fe\u5f55\u5c4f\u8fdb\u884c\u5c3a\u91cf\uff0c\u8fd9\u662f\u4e00\u79cd\u4e0d\u63a8\u8350\u4f46\u80fd\u7528\u7684\u65b9\u6cd5\u3002 \u3010\u8c03\u7528\u65b9\u6cd5\u3011 \u5728\u5e94\u7528\u5e93\u65b9\u6cd5\u5c42\u8fd9\u6837\u5199\uff1a def click_add_music_list_btn_in_music_by_ui(self):\n\"\"\"\u70b9\u51fb\u65b0\u5efa\u6b4c\u5355\u6309\u94ae\"\"\"\nself.click(*self.ui.btn_center(\"\u65b0\u5efa\u6b4c\u5355+\"))\n self.ui.btn_center() \u662f\u56fa\u5b9a\u5199\u6cd5\uff0c\u53c2\u6570\u5c31\u662f\u914d\u7f6e\u91cc\u9762\u7684 section \u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ocr","title":"\u56db\u3001OCR \u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_2","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 OCR \u65b9\u6848\u5927\u591a\u91c7\u7528\u8c37\u6b4c OCR\uff08Tesseract\uff09\u65b9\u6848\uff0c\u4f46\u662f\u5b83\u5bf9\u4e8e\u4e2d\u6587\u7684\u8bc6\u522b\u975e\u5e38\u5dee\uff0c\u7ecf\u8fc7\u5927\u91cf\u7684\u8c03\u7814\uff0c\u6211\u4eec\u4f7f\u7528 PaddleOCR\uff0c\u5b83\u662f\u4e00\u4e2a\u5f00\u6e90\u7684\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u8bc6\u522b\u5de5\u5177\uff0c\u4e5f\u662f PaddlePaddle \u6700\u6709\u540d\u7684\u4e00\u4e2a\u5f00\u6e90\u9879\u76ee\uff0c\u611f\u5174\u8da3\u7684\u53ef\u4ee5\u70b9\u8fd9\u91cc\u4e86\u89e3\uff0c\u591a\u7684\u4e0d\u8bf4\u4e86\uff0c\u4f60\u53ea\u9700\u8981\u77e5\u9053\u5b83\u5c31\u662f\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_2","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5b89\u88c5\u4ed6\u662f\u4e2a\u5f88\u9ebb\u70e6\u7684\u4e8b\u60c5\uff0c\u867d\u7136\u64cd\u4f5c\u5f88\u7b80\u5355\uff0c\u4f46\u5176\u5b9e\u5b89\u88c5\u5305\u6709\u70b9\u5927\uff0c\u56e0\u6b64\u6211\u4eec\u4e0d\u5e0c\u671b\u76f4\u63a5\u5728 env.sh \u4e2d\u52a0\u5165\u5b83\uff0c\u8fd9\u4f1a\u8ba9\u6574\u4e2a\u81ea\u52a8\u5316\u73af\u5883\u53d8\u5f97\u975e\u5e38\u81c3\u80bf\uff1b \u56e0\u6b64\uff0c\u6211\u4eec\u60f3\u5230\u5c06\u5b83\u505a\u6210\u4e00\u4e2a RPC \u670d\u52a1\u5728\u5176\u4ed6\u673a\u5668\u4e0a\u90e8\u7f72\uff0c\u6d4b\u8bd5\u673a\u901a\u8fc7\u8fdc\u7a0b\u8c03\u7528 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u4f7f\u7528\u5b83\uff1b RPC \u7684\u8c03\u7528\u903b\u8f91\uff1a \u8fd9\u6837\u6211\u4eec\u53ea\u9700\u8981\u5728\u670d\u52a1\u7aef\u90e8\u7f72\u597d OCR \u8bc6\u522b\u7684\u670d\u52a1\uff0c\u7136\u540e\u901a\u8fc7 RPC \u670d\u52a1\u5c06\u529f\u80fd\u63d0\u4f9b\u51fa\u6765\uff0c\u6846\u67b6\u91cc\u9762\u53ea\u9700\u8981\u8c03\u7528\u5bf9\u5e94\u7684 RPC \u63a5\u53e3\u5c31\u884c\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_1","title":"3\u3001\u4f7f\u7528\u8bf4\u660e","text":"\u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nfrom paddleocr import PaddleOCR\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef paddle_ocr(pic_path, lang):\n\"\"\"\n Paddleocr\u76ee\u524d\u652f\u6301\u7684\u591a\u8bed\u8a00\u8bed\u79cd\u53ef\u4ee5\u901a\u8fc7\u4fee\u6539lang\u53c2\u6570\u8fdb\u884c\u5207\u6362\n \u4f8b\u5982`ch`, `en`, `fr`, `german`, `korean`, `japan`\n :param file_name:\n :param lang:\n :return:\n \"\"\"\nif __name__ == \"__main__\":\nIP = popen(\"hostname -I\").read().split(\" \")[0]\nPORT = 8890\nSCREEN_CACHE = \"/tmp/screen.png\"\nserver = ThreadXMLRPCServer((IP, PORT), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(paddle_ocr, \"paddle_ocr\")\nprint(\"\u76d1\u542c\u5ba2\u6237\u7aef\u8bf7\u6c42\u3002\u3002\")\nserver.serve_forever()\n \u6846\u67b6\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from src import OCR\nOCR.ocr(*target_strings, picture_abspath=None, similarity=0.6, return_default=False, return_first=False, lang=\"ch\"):\n# \u901a\u8fc7 OCR \u8fdb\u884c\u8bc6\u522b\u3002\n# target_strings:\n# \u76ee\u6807\u5b57\u7b26,\u8bc6\u522b\u4e00\u4e2a\u5b57\u7b26\u4e32\u6216\u591a\u4e2a\u5b57\u7b26\u4e32,\u5e76\u8fd4\u56de\u5176\u5728\u56fe\u7247\u4e2d\u7684\u5750\u6807;\n# \u5982\u679c\u4e0d\u4f20\u53c2\uff0c\u8fd4\u56de\u56fe\u7247\u4e2d\u8bc6\u522b\u5230\u7684\u6240\u6709\u5b57\u7b26\u4e32\u3002\n# picture_abspath: \u8981\u8bc6\u522b\u7684\u56fe\u7247\u8def\u5f84\uff0c\u5982\u679c\u4e0d\u4f20\u9ed8\u8ba4\u622a\u53d6\u5168\u5c4f\u8bc6\u522b\u3002\n# similarity: \u5339\u914d\u5ea6\u3002\n# return_default: \u8fd4\u56de\u8bc6\u522b\u7684\u539f\u751f\u6570\u636e\u3002\n# return_first: \u53ea\u8fd4\u56de\u7b2c\u4e00\u4e2a,\u9ed8\u8ba4\u4e3a False,\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u6240\u6709\u6570\u636e\u3002\n# lang: `ch`, `en`, `fr`, `german`, `korean`, `japan`\n \u6b64\u65b9\u6848\u5728\u6846\u67b6\u5185\u6ca1\u6709\u5f15\u5165\u4efb\u4f55\u4e09\u65b9\u4f9d\u8d56\u5b8c\u5168\u91c7\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\uff0c\u800c\u4e14\u4f7f\u7528\u65b9\u6cd5\u975e\u5e38\u7b80\u5355\uff0c\u53ea\u9700\u8981\u901a\u8fc7 OCR.ocr() \u5373\u53ef\uff1b \u5bf9\u4e8e\u4e00\u4e9b\u6587\u6848\u7684\u573a\u666f\u975e\u5e38\u9002\u7528\uff0c\u6b64\u65b9\u6cd5\u76f4\u63a5\u8fd4\u56de\u5750\u6807\uff0c\u53ef\u4ee5\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u3002 \u4e5f\u53ef\u4ee5\u7528\u4e8e\u6587\u5b57\u65ad\u8a00\uff0c\u4ee3\u7801\u793a\u610f\uff1a def assert_ocr_exist(\n*args, picture_abspath=None, similarity=0.6, return_first=False, lang=\"ch\"\n):\n\"\"\"\u65ad\u8a00\u6587\u6848\u5b58\u5728\"\"\"\npic = None\nif picture_abspath is not None:\npic = picture_abspath + \".png\"\nres = OCR.ocr(\n*args,\npicture_abspath=pic,\nsimilarity=similarity,\nreturn_first=return_first,\nlang=lang,\n)\nif res is False:\nraise AssertionError(\n(f\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{args}\", f\"{pic if pic else GlobalConfig.SCREEN_CACHE}\")\n)\nif isinstance(res, tuple):\npass\nelif isinstance(res, dict) and False in res.values():\nres = filter(lambda x: x[1] is False, res.items())\nraise AssertionError(\n(\nf\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{dict(res)}\",\nf\"{pic if pic else GlobalConfig.SCREEN_CACHE}\",\n)\n)\n \u5728\u7528\u4f8b\u4e2d\u4f7f\u7528\u65ad\u8a00\uff0c\u793a\u4f8b\uff1a def test_font_manager_021(self):\n\"\"\"\u53f3\u4fa7\u2665-\u6536\u85cf/\u53d6\u6d88\u6536\u85cf\u5b57\u4f53\"\"\"\n# \u5b57\u4f53\u7ba1\u7406\u5668\u754c\u9762\u53f3\u4fa7\u8be6\u60c5\u5217\u8868\uff0c\u9009\u62e9\u672a\u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e / \u6536\u85cf\u5b57\u4f53\n# \u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e\u83dc\u5355\u663e\u793a\u201c\u53d6\u6d88\u6536\u85cf\u201d\uff1b\n...\nself.assert_ocr_exist(\"\u53d6\u6d88\u6536\u85cf\")\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_1","title":"4\u3001\u670d\u52a1\u7aef\u90e8\u7f72","text":"\u6211\u4eec\u76ee\u524d\u662f\u5c06 OCR \u670d\u52a1\u90e8\u7f72\u5728\u666e\u901a\u7684\u529e\u516c\u673a\u4e0a\u7684\uff0c\u5982\u679c\u4f60\u89c9\u5f97\u73b0\u6709\u7684 OCR \u8bc6\u522b\u6027\u80fd\u4e0d\u591f\u597d\uff0c\u6070\u597d\u4f60\u6709\u66f4\u597d\u7684\u673a\u5668\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u5176\u79c1\u6709\u5316\u90e8\u7f72\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41_1","title":"4.1\u3001\u73af\u5883\u5b89\u88c5","text":"\u63a8\u8350\u4f7f\u7528 pipenv \u8fdb\u884c\u73af\u5883\u642d\u5efa\uff1b \u5b89\u88c5 pipenv \uff1a sudo pip3 install pipenv\n \u65b0\u5efa\u4e00\u4e2a\u76ee\u5f55\u4f5c\u4e3a\u73af\u5883\u5305 ocr_env\uff1a cd ~\nmkdir ocr_env\n \u521b\u5efa python 3.7 \u73af\u5883\uff1a cd ocr_env\npipenv --python 3.7\n \u5b89\u88c5 OCR \u4f9d\u8d56\u5305\uff1a pipenv install paddlepaddle -i https://mirror.baidu.com/pypi/simple\npipenv install \"paddleocr>=2.0.1\" -i https://mirror.baidu.com/pypi/simple\n \u4e0d\u51fa\u610f\u5916\uff0c\u8fd9\u6837\u5c31\u628a\u4f9d\u8d56\u5b89\u88c5\u597d\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42_1","title":"4.2\u3001\u542f\u52a8\u670d\u52a1","text":"\u5c06\u57fa\u7840\u6846\u67b6\u4e2d\u7684 scr/ocr/pdocr_rpc_server.py \u6587\u4ef6\u62f7\u8d1d\u5230 ocr_env \u76ee\u5f55\uff0c\u540e\u53f0\u6267\u884c\u5b83\u5c31\u597d\u4e86\uff1a cd ocr_env\nnohup pipenv run python pdocr_rpc_server.py &\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#43","title":"4.3\u3001\u914d\u7f6e\u5f00\u673a\u81ea\u542f\uff08\u901a\u7528\uff09","text":"\u4f60\u80af\u5b9a\u4e0d\u60f3\u6bcf\u6b21\u673a\u5668\u91cd\u542f\u4e4b\u540e\u90fd\u9700\u8981\u624b\u52a8\u542f\u52a8\u670d\u52a1\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u914d\u7f6e\u5f00\u673a\u81ea\u542f\u3002 \u5199\u5f00\u673a\u81ea\u542f\u670d\u52a1\u6587\u4ef6\uff1a sudo vim /lib/systemd/system/ocr.service\n autoocr \u540d\u79f0\u4f60\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff0c\u5199\u5165\u4ee5\u4e0b\u5185\u5bb9\uff1a [Unit]\nDescription=OCR Service\nAfter=multi-user.target\n\n[Service]\nUser=uos\nGroup=uos\nType=idle\nWorkingDirectory=/home/uos/ocr_env\nExecStart=pipenv run python pdocr_rpc_server.py\n\n[Install]\nWantedBy=multi-user.target\n \u6ce8\u610f\u66ff\u6362\u4f60\u7684${USER} \u4fee\u6539\u914d\u7f6e\u6587\u4ef6\u7684\u6743\u9650\uff1a sudo chmod 644 /lib/systemd/system/ocr.service\n \u81ea\u542f\u670d\u52a1\u751f\u6548\uff1a sudo systemctl daemon-reload\nsudo systemctl enable ocr.service\n \u67e5\u770b\u670d\u52a1\u72b6\u6001\uff1a sudo systemctl status ocr.service\n \u4f60\u53ef\u4ee5\u518d\u91cd\u542f\u4e0b\u7535\u8111\uff0c\u770b\u770b\u670d\u52a1\u662f\u4e0d\u662f\u6b63\u5e38\u542f\u52a8\u4e86\uff0c\u6ca1\u62a5\u9519\u5c31 OK \u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_4","title":"\u4e94\u3001\u5c5e\u6027\u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_3","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 UI \u81ea\u52a8\u5316\u5927\u591a\u90fd\u662f\u57fa\u4e8e\u6d4f\u89c8\u5668\u7684\uff0c\u6838\u5fc3\u662f\u5728\u7f51\u9875\u7684 DOM \u6811\u4e0a\u67e5\u627e\u5143\u7d20\uff0c\u5e76\u5bf9\u5176\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\uff1b Linux \u684c\u9762\u5e94\u7528\u5927\u591a\u662f\u91c7\u7528 Qt \u7f16\u5199\u7684\uff0c\u5728 Qt \u4e2d\u4e5f\u662f\u4ece\u6700\u9876\u5c42\u7684 MainWindow \u5f00\u59cb\u6784\u5efa\u5e94\u7528\uff0c\u6240\u4ee5\u903b\u8f91\u4e5f\u662f\u4e00\u6837\u7684\uff0cQt \u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u540c\u6837\u53ef\u4ee5\u901a\u8fc7 DOM \u6811\uff08\u5c5e\u6027\u6811\uff09\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff0c\u6211\u4eec\u79f0\u4e4b\u4e3a\u5c5e\u6027\u5b9a\u4f4d\u3002 \u501f\u52a9\u5f00\u6e90\u5de5\u5177 dogtail \u6211\u4eec\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u83b7\u53d6\uff0c\u4ece\u800c\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\u3002dogtail \u7684\u9879\u76ee\u4ecb\u7ecd\u53ef\u4ee5\u731b\u6233\u8fd9\u91cc\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_3","title":"2\u3001\u4f7f\u7528\u65b9\u6cd5","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#21sniff","title":"2.1\u3001sniff\uff08\u55c5\u63a2\u5668\uff09\u4f7f\u7528","text":"\u5728\u7ec8\u7aef\u8f93\u5165 sniff \u542f\u52a8 AT-SPI Browser mikigo@mikigo-PC:~$ sniff\n \u67e5\u770b\u5e94\u7528\u7684\u6807\u7b7e \u5728 sniff \u91cc\u9762\u53ef\u4ee5\u770b\u5230\u7cfb\u7edf\u4e2d\u5df2\u542f\u52a8\u7684\u5e94\u7528\uff0c\u70b9\u51fb\u5e94\u7528\u540d\u79f0\u524d\u9762\u7684\u4e09\u89d2\u5f62\u56fe\u6807\uff0c\u53ef\u4ee5\u5c55\u5f00\u5e94\u7528\u7684\u6807\u7b7e\uff0c\u6240\u6709\u6807\u7b7e\u4ee5 tree \u7684\u5f62\u5f0f\u5c55\u793a\uff0c\u5bf9\u5e94\u5e94\u7528\u91cc\u9762\u7684\u7236\u7a97\u53e3\u548c\u5b50\u7a97\u53e3\u3002 \u83b7\u53d6\u5143\u7d20\u63a7\u4ef6\u7684\u6807\u7b7e\u540d\u79f0 \u9996\u5148\uff0c\u4e3a\u4e86\u65b9\u4fbf\u67e5\u770b\u5143\u7d20\u63a7\u4ef6\u5bf9\u5e94\u7684\u4f4d\u7f6e\uff0c\u5efa\u8bae\u73b0\u5728\u4e0a\u65b9\u5de5\u5177\u680f\u70b9\u51fb Actions\uff0c\u7136\u540e\u52fe\u9009 Hightlight Items\uff0c\u8fd9\u6837\u5728 sniff \u4e2d\u9f20\u6807\u9009\u4e2d\u5143\u7d20\u6807\u7b7e\u7684\u65f6\u5019\uff0c\u5e94\u7528\u4e2d\u4f1a\u6709\u76f8\u5e94\u7684\u5149\u6807\u9501\u5b9a\u3002 \u5728 sniff \u91cc\u9762\u70b9\u51fb\u8fdb\u5165\u5e94\u7528\u7684\u6807\u7b7e tree \u4e2d\u540e\uff0c\u70b9\u51fb\u76f8\u5e94\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5728\u5de5\u5177\u4e0b\u65b9\uff0c\u4f1a\u5c55\u793a\u5143\u7d20\u63a7\u4ef6\u7684 Name\uff0c\u8fd9\u4e2a\u5c31\u662f\u6807\u7b7e\u540d\u79f0\u3002 \u5728 tree \u4e2d\u6709\u4e9b\u5730\u65b9\u662f\u7a7a\u767d\u7684\u6216\u8005\u662f Form\uff0c\u662f\u56e0\u4e3a\u5f00\u53d1\u4eba\u5458\u5728\u6dfb\u52a0\u6807\u7b7e\u7684\u65f6\u5019\u6ca1\u6709\u6dfb\u52a0\uff0c\u6216\u8005\u6709\u4e9b\u7236\u7a97\u53e3\u4e0d\u9700\u8981\u6dfb\u52a0\uff0c\u8fd9\u79cd\u5728\u5b9e\u9645\u4e1a\u52a1\u4e2d\u662f\u4e0d\u5f71\u54cd\u7684\uff0c\u6211\u4eec\u53ea\u8981\u4fdd\u8bc1\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\u4e2d\uff0c\u8981\u7528\u5230\u7684\u5143\u7d20\u90fd\u6dfb\u52a0\u4e86\u6807\u7b7e\u5373\u53ef\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#22","title":"2.2\u3001\u5143\u7d20\u64cd\u4f5c","text":"\u83b7\u53d6\u5e94\u7528\u5bf9\u8c61 dogtail \u83b7\u53d6\u5e94\u7528\u5bf9\u8c61\u7684\u65f6\u5019\uff0c\u4f7f\u7528\u7684\u662f tree \u5e93\u91cc\u9762\u7684 application() \u65b9\u6cd5\uff1a from dogtail.tree import root\napp_obj = root.application('deepin-music')\n app_obj\u5c31\u662f\u5e94\u7528\u7684\u5bf9\u8c61\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\uff0c\u662f\u5e94\u7528\u5bf9\u8c61\u4f7f\u7528child()\u65b9\u6cd5\uff1a element = app_obj.child('element_name')\n \u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u4f20\u5165\u5143\u7d20\u7684 Name\uff0c\u83b7\u53d6\u5230\u76f8\u5e94\u5143\u7d20\u7684\u5bf9\u8c61\u3002Name \u53ef\u4ee5\u901a\u8fc7 sniff \u67e5\u770b\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\u5217\u8868: element_list = element.children\n \u83b7\u53d6\u5230\u8fd9\u4e2a\u5143\u7d20\u4e0b\u9762\u6240\u6709\u7684\u5143\u7d20\u5217\u8868\u3002 \u8fd9\u4e2a\u65b9\u6cd5\u9002\u7528\u4e8e\u6709\u4e9b\u6807\u7b7e\u6ca1\u6709\u6dfb\u52a0\uff0c\u4f46\u662f\u4f4d\u7f6e\u662f\u56fa\u5b9a\u7684\uff0c\u6211\u4eec\u901a\u8fc7\u7d22\u5f15\u53ef\u4ee5\u53d6\u5f97\u5143\u7d20\u3002 element_list[0]\n \u5bf9\u5143\u7d20\u7684\u64cd\u4f5c \u5728\u83b7\u53d6\u5230\u5143\u7d20\u4e4b\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u76f8\u5e94\u7684\u64cd\u4f5c\u3002 \u5355\u51fb element.click(button=1)\n button 1 \u2014>\u5de6\u952e\uff0c2 \u2014>\u6eda\u8f6e\uff0c3 \u2014>\u53f3\u952e\uff0c\u9ed8\u8ba4\u4e3a 1 \u53cc\u51fb element.doubleClick(button=1)\n \u9f20\u6807\u60ac\u505c element.point()\n \u9f20\u6807\u79fb\u52a8\u5230\u5143\u7d20\u4e2d\u5fc3\u4f4d\u7f6e \u6587\u672c\u8f93\u5165 element.typeText(string)\n \u5411\u5143\u7d20\u5bf9\u8c61\u8f93\u5165\u5b57\u7b26\u4e32 \uff0c\u6bd4\u5982\u8f93\u5165\u6846 \u7ec4\u5408\u952e element.keyCombo(comboString)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#23","title":"2.3\u3001\u6846\u67b6\u5c01\u88c5","text":"\u4ee3\u7801\u793a\u4f8b\uff1a # \u8be6\u7ec6\u4ee3\u7801\u8bf7\u67e5\u770b src/dogtail_utils.py\nclass DogtailUtils:\ndef __init__(self, name=None, description=None):\nself.name = name\nself.description = description\nself.obj = root.application(self.name, self.description)\ndef app_element(self, *args, **kwargs):\n\"\"\"\n \u83b7\u53d6app\u5143\u7d20\u7684\u5bf9\u8c61\n :return: \u5143\u7d20\u7684\u5bf9\u8c61\n \"\"\"\nreturn self.obj.child(*args, **kwargs, retry=False)\ndef element_center(self, element) -> tuple:\n\"\"\"\n \u83b7\u53d6\u5143\u7d20\u7684\u4e2d\u5fc3\u4f4d\u7f6e\n :param element:\n :return: \u5143\u7d20\u4e2d\u5fc3\u5750\u6807\n \"\"\"\n_x, _y, _w, _h = self.app_element(element).extents\n_x = _x + _w / 2\n_y = _y + _h / 2\nreturn _x, _y\n \u6846\u67b6\u63d0\u4f9b\u7684\u63a5\u53e3\u975e\u5e38\u7b80\u6d01\uff0c\u5728\u8c03\u7528\u65f6\uff1a self.dog.element_center(\"\u64ad\u653e\")\n \u8fd9\u6837\u5c31\u80fd\u83b7\u53d6\u5230\u6b64\u5143\u7d20\u7684\u4e2d\u5fc3\u5750\u6807\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_5","title":"\u516d\u3001\u6807\u7b7e\u5316\u7ba1\u7406","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_4","title":"1\u3001\u6807\u7b7e\u8bf4\u660e","text":"\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u811a\u672c ID\uff1a\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c/\u51fd\u6570 ID\uff1b PMS\u7528\u4f8bID\uff1aPMS \u4e0a\u5bf9\u5e94\u7684\u7528\u4f8b ID\uff08\u7528\u4f8b\u5e93 ID\uff09\uff1b \u9ed8\u8ba4\u4f7f\u7528\u7528\u4f8b\u5e93 ID\uff0c\u5bf9\u4e8e\u6682\u65f6\u6ca1\u6709\u4f7f\u7528\u7528\u4f8b\u5e93\u7ba1\u7406\u7528\u4f8b\u7684\u9879\u76ee\uff0c\u53ef\u4ee5\u4f7f\u7528\u4ea7\u54c1\u5e93\u7528\u4f8b ID\uff1b \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1aFUNC\uff08\u529f\u80fd\uff09\u3001PERF\uff08\u6027\u80fd\uff09\u3001STR\uff08\u538b\u529b\uff09\u3001SEC\uff08\u5b89\u5168\uff09\u3001CTS\uff08\u517c\u5bb9\u6027\uff09\u3001API\uff08\u63a5\u53e3\uff09\u3001BASELINE\uff08\u57fa\u7ebf-\u9884\u7559\uff09 \u8bbe\u5907\u7c7b\u578b\uff1aPPL\uff08\u4f9d\u8d56\u5916\u8bbe\u7684\u7528\u4f8b\uff09\u3001COL\uff08\u4f9d\u8d56\u4e3b\u63a7\u673a\u7684\u7528\u4f8b\uff09 \u7528\u4f8b\u6765\u6e90\uff1aBUG\uff08\u7531 Bug \u8f6c\u7684\u7528\u4f8b\uff09 \u4e0a\u7ebf\u5bf9\u8c61\uff1aCICD\uff0c\u8868\u793a\u4e0a\u7ebf\u5230 CICD \u6d41\u6c34\u7ebf\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u53ef\u4e00\u952e\u751f\u6210 case_list.csv \u6587\u4ef6\uff0c\u7528\u4e8e\u5bfc\u5165\u5230\u660e\u9053\u4e91 AT \u7528\u4f8b\u5217\u8868\u4e2d\u63a7\u5236 CICD \u8dd1\u6d4b\u8303\u56f4\uff1b \u6d4b\u8bd5\u7ea7\u522b\uff1aC1 / C2 / C3 / C4\uff0c\u5177\u4f53\u5b9a\u4e49\u53c2\u8003\u6d41\u6c34\u7ebf\u4f7f\u7528\u6307\u5bfc\uff1b \u8df3\u8fc7\u539f\u56e0\uff1askip-XXX\uff0c\u7528\u4e8e\u63a7\u5236\u7528\u4f8b\u662f\u5426\u6267\u884c\uff1b \u786e\u8ba4\u4fee\u590d\uff1afixed-XXX\uff0c\u7528\u4e8e\u6807\u8bb0\u7528\u4f8b\u7684\u4fee\u590d\u72b6\u6001\uff08\u540e\u9762\u8be6\u7ec6\u8bb2\u89e3\u7528\u6cd5\uff09\uff1b \u5e9f\u5f03\u7528\u4f8b\uff1aremoved-\u5df2\u5e9f\u5f03\uff0c\u7528\u4e8e\u6807\u8bb0\u5df2\u7ecf\u5e9f\u5f03\u7684\u7528\u4f8b\uff0c\u6b64\u7528\u4f8b\u6807\u7b7e\u4e0d\u4f1a\u88ab\u6dfb\u52a0\uff0c\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff1b \u793a\u4f8b\uff1a \u811a\u672cID PMS\u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u8bbe\u5907\u7c7b\u578b \u7528\u4f8b\u6765\u6e90 \u4e0a\u7ebf\u5bf9\u8c61 \u6d4b\u8bd5\u7ea7\u522b \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b ... 679537 679537 L1 FUNC PPL CICD C1 skip-XXX fixed-XXX removed-\u5df2\u5e9f\u5f03 ..."},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_4","title":"2\u3001\u64cd\u4f5c\u6b65\u9aa4","text":"2.1\u3001\u5728\u5b50\u9879\u76ee\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u4ee5\u7528\u4f8b\u7684 py \u6587\u4ef6\u9664\u53bb\u9996\u5b57\u7b26\u4e32 \"test_\" \u548c\u7528\u4f8b\u5e8f\u53f7\u540e\u7684\u5b57\u7b26\u4e32\u4f5c\u4e3a csv \u7684\u6587\u4ef6\u540d\u3002 \u4f8b\u5982: \u76f8\u518c\u7684\u7528\u4f8b\u6587\u4ef6\u4e3a test_album_xxx.py\uff0cxxx \u8868\u793a\u7528\u4f8b\u7684ID\uff08\u4e5f\u53ef\u4ee5\u662f\u81ea\u5b9a\u4e49\u7684\u6570\u5b57\u4ee3\u8868\u7528\u4f8b\u5e8f\u53f7\uff09\uff0c\u6b64\u65f6 csv \u6587\u4ef6\u540d\u5c31\u5e94\u4e3a album.csv\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u6240\u6709 csv \u6587\u4ef6\u5efa\u8bae\u653e\u5728\u4e00\u4e2a tags \u76ee\u5f55\u4e0b\u3002 \u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 2.2\u3001\u7b2c\u4e00\u5217\u4e3a\u811a\u672c ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b\u7528\u4f8b\u6807\u7b7e\u53ef\u4ee5\u65e0\u5e8f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_2","title":"3\u3001\u589e\u52a0\u8bf4\u660e","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_1","title":"3.1\u3001\u8df3\u8fc7\u7528\u4f8b","text":"\u4f20\u7edf\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668(@pytest.mark.skip)\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a; \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#311","title":"3.1.1\u3001\u56fa\u5b9a\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 679537 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u7b7e\u5f00\u5934\u4e3a \u201cskip-XXX\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\uff0c\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\u5219\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u7b7e\u4e3a SKIPED\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#312","title":"3.1.2\u3001\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skipif_platform-aarch64&mips64 \u67d0\u4e9b\u7528\u4f8b\u4f1a\u56e0\u4e3a\u4e0d\u540c\u7684\u73af\u5883\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\uff0c\u5e38\u89c1\u7684\u573a\u666f\u4e3a\u5728\u4e0d\u540c\u67b6\u6784\u4e0a\u5224\u65ad\u662f\u5426\u6267\u884c\uff0c\u8df3\u8fc7\u7684\u539f\u56e0\u6807\u7b7e\u4e3a \u201cskipif_platform-\u201d \u52a0\u67b6\u6784\u540d\uff0c\u591a\u4e2a\u67b6\u6784\u4e4b\u95f4\u4f7f\u7528 \u201c&\u201d \u62fc\u63a5\uff1b \u4ee5\u4e0a\u4f8b\u5b50\u4e3a\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u5224\u65ad\u5f53\u524d\u67b6\u6784\u662f\u5426\u4e3a arrch64 \u6216\u8005 mips64\uff0c\u82e5\u662f\uff0c\u5219\u8df3\u8fc7\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u82e5\u5426\u5219\u6267\u884c\u7528\u4f8b\uff1b \u76ee\u524d\u6846\u67b6\u9ed8\u8ba4\u4ec5\u652f\u6301\u67b6\u6784\u7684\u6761\u4ef6\u5224\u65ad\uff0c\u4f46\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u903b\u8f91\u652f\u6301\u81ea\u5b9a\u4e49\u6dfb\u52a0\u3002 \u5728\u9879\u76ee\u76ee\u5f55\u8def\u5f84\u4e0b\u5b58\u5728\u6587\u4ef6 setting/skipif.py\uff0c\u6240\u6709\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u7684\u51fd\u6570\u5199\u5728\u6b64\u6587\u4ef6\u4e2d\u3002 \u9ed8\u8ba4\u67b6\u6784\u5224\u65ad\u4f8b\u5b50\uff1a def skipif_platform(args: str):\n\"\"\"\u5e73\u53f0\u8df3\u8fc7\"\"\"\n_skip_key = args.split(\"&\")\nfor key in _skip_key:\nif GlobalConfig.SYS_ARCH == key:\nreturn True\nreturn False\n \u65b9\u6cd5\u7f16\u5199\u89c4\u8303\uff1a \u65b9\u6cd5\u540d\u5fc5\u987b\u4ee5 skipif \u5f00\u5934\uff1b \u65b9\u6cd5\u5fc5\u987b\u6709\u8fd4\u56de\u7ed3\u679c\u5e76\u4e14\u4e3a\u5e03\u5c14\u503c\uff08True \u4ee3\u8868\u8df3\u8fc7\uff0cFalse \u4ee3\u8868\u4e0d\u8df3\u8fc7\uff09\uff1b \u65b9\u6cd5\u53ea\u80fd\u6709\u4e00\u4e2a\u5165\u53c2\uff1b \u5728 csv \u6587\u4ef6\u8df3\u8fc7\u539f\u56e0\u4e00\u680f\u4e2d\u586b\u5199\u4e3a \u201c{\u51fd\u6570\u540d}-{\u53c2\u6570}\u201d\uff0c\u4f8b\u5982\uff1askipif_platform-aarch64\uff1b\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u4f1a\u4ee5\u7b2c\u4e00\u4e2a \u201c-\u201d \u8fdb\u884c\u5206\u5272\uff0c\u622a\u53d6\u7684\u5de6\u4fa7\u5b57\u7b26\u4e32\u4f5c\u4e3a\u51fd\u6570\u540d\uff0c\u5728 skipif.py \u6587\u4ef6\u4e2d\u67e5\u627e\u662f\u5426\u6709\u540c\u540d\u51fd\u6570\uff0c\u5e76\u5c06\u622a\u53d6\u7684\u53f3\u4fa7\u4f5c\u4e3a\u53c2\u6570\u4f20\u9012\u7ed9\u8be5\u51fd\u6570\uff0c\u901a\u8fc7\u83b7\u53d6\u8be5\u51fd\u6570\u8fd4\u56de\u7684\u5e03\u5c14\u503c\uff0c\u8fd4\u56de True\uff0c\u5219\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u8fd4\u56de False\uff0c\u5219\u6267\u884c\u8be5\u7528\u4f8b\u3002 \u82e5\u51fd\u6570\u9700\u8981\u591a\u4e2a\u53c2\u6570\uff0c\u53ef\u81ea\u5b9a\u4e49\u591a\u4e2a\u53c2\u6570\u4e4b\u95f4\u7684\u8fde\u63a5\u7b26\uff0c\u8fde\u63a5\u7b26\u53f7\u4e0d\u53ef\u4f7f\u7528\u4e0b\u5212\u7ebf\u548c\u9017\u53f7\uff0c\u63a8\u8350\u7edf\u4e00\u4f7f\u7528 & \u7b26\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32","title":"3.2\u3001\u786e\u8ba4\u4fee\u590d","text":"\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7528\u4f8b\u4fee\u590d\u540e\uff0c\u4f46\u4e0d\u80fd\u7acb\u5373\u5220\u9664\u8df3\u8fc7\u539f\u56e0\uff08skip-XXX\uff09\u7684\u7528\u4f8b\uff0c\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u786e\u8ba4\u4fee\u590d\u201d\uff0c\u4f5c\u4e3a\u6807\u8bb0\u8be5\u7528\u4f8b\u662f\u5426\u5df2\u7ecf\u4fee\u590d\uff0c\u56fa\u5b9a\u586b\u5165\u5b57\u6bb5\u4e3a \u201cfixed-\u5df2\u4fee\u590d\u201d\u3002\u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u5373\u4f7f\u540c\u65f6\u6807\u8bb0\u4e86 skip-XXX \u4e5f\u4f1a\u6b63\u5e38\u6267\u884c\u3002 \u793a\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d 679537 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d \u3010\u540c\u65f6\u6807\u8bb0\u4e86skip \u548c fixed\uff0c\u4f46\u4ecd\u7136\u60f3\u8981\u8df3\u8fc7\u7528\u4f8b\u3011 \u5f53 \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u540c\u65f6\u586b\u5165\u540e\uff0c\u547d\u4ee4\u884c\u4f20\u9012\u53c2\u6570 --ifixed yes\uff0c\u5219\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\u8be5\u6761\u7528\u4f8b\u3002 python3 manage.py run --ifixed yes\n \u770b\u5230\u8fd9\u91cc\u6709\u4e9b\u540c\u5b66\u53ef\u80fd\u8981\u95ee\u4e86\uff0c\u6211\u60f3\u6062\u590d\u8df3\u8fc7\u6267\u884c\uff0c\u76f4\u63a5\u628a skip-XXX \u8fd9\u4e00\u5217\u6807\u7b7e\u5220\u6389\u4e0d\u5c31\u597d\u4e86\uff0c\u8fd8\u641e\u4ec0\u4e48\u786e\u8ba4\u4fee\u590d\u5e72\u5565\uff1f \u8fd9\u91cc\u7ed9\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u89e3\u91ca\u4e00\u4e0b\uff1a \uff08\u4ee5\u4e0b\u6d41\u6c34\u7ebf\u6307\u7684\u662f\u6bcf\u65e5\u6784\u5efa\u7684\u6d41\u6c34\u7ebf\uff0c\u8dd1 AT \u7684\u5168\u91cf\u7528\u4f8b\uff09 \u9996\u5148\uff0c\u6d41\u6c34\u7ebf\u4e0a\u8dd1\u7684\u662f AT \u5386\u53f2 Tag\uff0c\u8df3\u8fc7\u7528\u4f8b\u7684\u6807\u7b7e(skip-XXX) \u662f\u5728\u6700\u65b0\u7684\u4ee3\u7801\u4e0a\u63d0\u4ea4\u7684\uff0c\u6211\u4eec\u91c7\u7528\u6700\u65b0\u7684 csv \u6587\u4ef6\u8986\u76d6\u5386\u53f2 csv \u6587\u4ef6\u7684\u8bbe\u8ba1\u6765\u5b9e\u73b0\u4e86\u5bf9\u5386\u53f2 Tag \u4e0a\u7528\u4f8b\u7684\u8df3\u8fc7\uff1b \u7136\u540e\uff0c\u5728\u65e5\u5e38\u8df3\u8fc7\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u540c\u65f6\u4e5f\u5728\u4fee\u590d\u4e00\u4e9b\u7528\u4f8b\uff0c\u4fee\u590d\u540e\u7684\u8fd9\u4e9b\u7528\u4f8b\u5728\u672c\u5730\u8c03\u8bd5\u7684\u65f6\u5019\u6211\u4eec\u4e0d\u5e0c\u671b\u7ee7\u7eed\u8df3\u8fc7\uff0c\u4f46\u662f\u6b64\u65f6\uff0c\u4fee\u590d\u7684\u8fd9\u4e9b\u7528\u4f8b\u53ef\u80fd\u8fd8\u4e0d\u7a33\u5b9a\uff0c\u4e0d\u9002\u5408\u9a6c\u4e0a\u653e\u5230\u6d41\u6c34\u7ebf\u53bb\u8dd1\uff0c\u4e5f\u5c31\u662f\u8bf4\u6d41\u6c34\u7ebf\u4e0a\u6211\u4eec\u662f\u5e0c\u671b\u4ed6\u7ee7\u7eed\u8df3\u8fc7\u7684\uff0c\u56e0\u6b64\uff0c\u54b1\u4e0d\u80fd\u76f4\u63a5\u628a skip-XXX \u5e72\u6389\uff1b \u8fd9\u91cc\u5c31\u77db\u76fe\u4e86\uff0c\u4e00\u4e2a\u9700\u6c42\u662f\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u53e6\u4e00\u4e2a\u9700\u6c42\u53c8\u4e0d\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u600e\u4e48\u529e\u5462\uff1f \u6211\u4eec\u4f7f\u7528\u201c\u786e\u8ba4\u4fee\u590d\u201d\u6765\u6807\u8bb0\u8fd9\u6761\u7528\u4f8b\u5df2\u7ecf\u4fee\u590d\u4e86\uff0c\u8fd9\u6837\u4f60\u672c\u5730\u8c03\u8bd5\u7528\u4f8b\u7684\u65f6\u5019\u8fd9\u6761\u5df2\u4fee\u590d\u7684\u7528\u4f8b\u662f\u4f1a\u6267\u884c\u7684\uff0c\u540c\u65f6\u5728\u6d41\u6c34\u7ebf\u4e0a\u5c06 --ifixed yes \u53c2\u6570\u52a0\u4e0a\uff0c\u90a3\u4e48\u6d41\u6c34\u7ebf\u4e0a\u6267\u884c\u65f6\u8fd9\u6761\u7528\u4f8b\u4ecd\u7136\u662f\u8df3\u8fc7\u7684\u72b6\u6001\uff0c\u540e\u7eed\u4f60\u6253 Tag \u7684\u65f6\u5019\uff0c\u628a \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u7684\u6807\u7b7e\u5168\u90e8\u5220\u6389\u5c31\u53ef\u4ee5\u4e86\u3002 \u8fd9\u5c31\u662f\u201c\u786e\u8ba4\u4fee\u590d\u201d\u8fd9\u4e2a\u6807\u7b7e\u7684\u80cc\u666f\uff0c\u9700\u8981\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u54c1\u4e00\u54c1\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#33","title":"3.3\u3001\u5e9f\u5f03\u7528\u4f8b","text":"\u9488\u5bf9\u67d0\u4e9b\u7528\u4f8b\uff0c\u7531\u4e8e\u9700\u6c42\u53d8\u66f4\uff0c\u73af\u5883\u5f71\u54cd\u6216\u8bc4\u4f30\u4e0d\u518d\u9002\u7528\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u65f6\uff0c\u7528\u4f8b\u9700\u8981\u5e9f\u5f03\uff0c\u5219\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u5e9f\u5f03\u7528\u4f8b\u201d\uff0c\u8be5\u5217\u5b58\u5728 \u201cremoved-{\u5e9f\u5f03\u539f\u56e0}\u201d\uff0c\u5219\u7528\u4f8b\u4e0d\u4f1a\u6267\u884c\u3002 \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d removed-\u5df2\u5e9f\u5f03 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_2","title":"4\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u4e0a\u9762\u4ecb\u7ecd Pytest \u6846\u67b6\u63d0\u4f9b\u7684\u6807\u7b7e\u529f\u80fd mark\uff0c\u4f7f\u7528\u65f6\u9700\u8981\u4e3a\u6bcf\u4e00\u4e2a\u7528\u4f8b\u6dfb\u52a0\u6807\u7b7e\u88c5\u9970\u5668\uff0c\u5219\u64cd\u4f5c\u590d\u6742\uff0c\u53ef\u7ef4\u62a4\u6027\u5dee\uff0c\u5176\u6839\u672c\u95ee\u9898\u5c31\u662f\u6807\u7b7e\u5206\u6563\u5728\u6bcf\u4e00\u6761\u7528\u4f8b\u7684\u88c5\u9970\u5668\u4e0a\uff0c\u96be\u4ee5\u96c6\u4e2d\u7ef4\u62a4\uff1b\u4e8e\u662f\u4e4e\u5c06\u6240\u6709\u6807\u7b7e\u4f7f\u7528 csv \u6587\u4ef6\u8fdb\u884c\u96c6\u4e2d\u7ba1\u7406\uff0c\u5e76\u901a\u8fc7 Pytest \u7684\u94a9\u5b50\u51fd\u6570\uff0c\u8bfb\u53d6 csv \u6587\u4ef6\uff0c\u52a8\u6001\u6dfb\u52a0\u6807\u7b7e\u5230\u7528\u4e2d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5csv","title":"5\u3001CSV\u6587\u4ef6\u683c\u5f0f","text":"\u6b64\u914d\u7f6e\u6587\u4ef6\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u6807\u7b7e\u6570\u636e\uff0c\u4e14\u8981\u65b9\u4fbf\u80fd\u4f7f\u7528 Excel \u6253\u5f00\u8fdb\u884c\u7f16\u8f91\u67e5\u770b\uff0c\u66f4\u91cd\u8981\u7684\u662f\u6211\u4eec\u4e0d\u60f3\u5f15\u5165\u4e09\u65b9\u4f9d\u8d56\uff0cCSV \u6587\u4ef6\u51e0\u4e4e\u662f\u552f\u4e00\u80fd\u6ee1\u8db3\u6240\u6709\u7684\u8981\u6c42\u7684\u6587\u4ef6\u683c\u5f0f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_6","title":"\u4e03\u3001\u65e5\u5fd7\u7cfb\u7edf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_5","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e YouQu \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u64cd\u4f5c\u65b9\u6cd5\u5c01\u88c5\u5199\u6cd5\uff0c\u901a\u5e38\u662f\u8fd9\u6837\u7684\uff1a\u7c7b\u91cc\u9762\u4e00\u4e2a\u51fd\u6570\u53ea\u5305\u542b\u4e00\u4e2a\u64cd\u4f5c\u6216\u591a\u6b21\u8c03\u7528\u7684\u4e00\u7cfb\u5217\u53ef\u5408\u5e76\u7684\u64cd\u4f5c\uff1b \u4f20\u7edf\u7684\u65e5\u5fd7\u8f93\u51fa\u65b9\u5f0f\uff0c\u9700\u8981\u5728\u6bcf\u4e2a\u51fd\u6570\u91cc\u9762\u4e3b\u52a8\u7f16\u5199\u65e5\u5fd7\u8f93\u51fa\u4ee3\u7801 \uff0c\u4f8b\u5982\uff1a class XXXWidget:\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\nlogger.info(\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\")\n...\n# \u7701\u7565\u4ee3\u7801\u90e8\u5206\n \u4e00\u4e2a\u51fd\u6570\u91cc\u9762\u81f3\u5c11\u5305\u542b\u4e00\u6761\u65e5\u5fd7\u4fe1\u606f\uff0c\u5982\u679c\u6bd4\u8f83\u590d\u6742\u64cd\u4f5c\u6b65\u9aa4\uff0c\u53ef\u80fd\u5305\u542b\u591a\u6761\u65e5\u5fd7\u4fe1\u606f\uff1b \u4e00\u4e2a\u5e94\u7528\u542b\u6709\u5927\u91cf\u7684\u64cd\u4f5c\u51fd\u6570\uff0c\u4e5f\u5c31\u662f\u8bf4\u6211\u4eec\u9700\u8981\u5199\u5927\u91cf\u7684\u65e5\u5fd7\u4ee3\u7801\uff1b \u901a\u8fc7\u7ecf\u9a8c\u89c2\u5bdf\uff0c\u6211\u4eec\u53d1\u73b0\uff0c\u51fd\u6570\u8bf4\u660e\u4ee5\u53ca\u51fd\u6570\u64cd\u4f5c\u65e5\u5fd7\uff0c\u5177\u6709\u8f83\u9ad8\u7684\u91cd\u590d\u5ea6\uff08\u4ece\u4e0a\u9762\u7684\u4f8b\u5b50\u4e5f\u53ef\u4ee5\u770b\u51fa\u6765\uff09\uff0c\u56e0\u6b64\u6211\u4eec\u5927\u80c6\u7684\u8bbe\u60f3\uff0c\u80fd\u4e0d\u80fd\u57fa\u4e8e\u6846\u67b6\u6267\u884c\u65f6\uff0c\u81ea\u52a8\u7684\u5c06\u51fd\u6570\u8bf4\u660e\u4f5c\u4e3a\u65e5\u5fd7\u6253\u5370\u51fa\u6765\uff0c\u4ece\u800c\u51cf\u5c11\u5927\u91cf\u65e5\u5fd7\u4ee3\u7801\u91cf\u548c\u91cd\u590d\u7f16\u5199\uff0c\u90a3\u771f\u662f\u5999\u554a~\u3002 \u57fa\u4e8e\u6b64\u201c\u5929\u771f\u201d\u7684\u60f3\u6cd5\uff0c\u6211\u4eec\u8bbe\u8ba1\u51fa\u4e86 youqu \u7684\u65e5\u5fd7\u7cfb\u7edf\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_5","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u6838\u5fc3\u539f\u7406\uff1a \u901a\u8fc7\u7ed9\u7c7b\u52a0\u4e0a\u4e00\u4e2a\u88c5\u9970\u5668 @log\uff0c\u52a8\u6001\u7ed9\u8be5\u7c7b\u4e0b\u6240\u6709\u7684\u51fd\u6570\u53ca\u7236\u7c7b\u51fd\u6570\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668 @_trace\uff0c\u5728\u6b64\u88c5\u9970\u5668\u4e2d\u6211\u4eec\u80fd\u52a8\u6001\u7684\u6355\u83b7\u6240\u8c03\u7528\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff08func.__doc__\uff09\uff0c\u901a\u8fc7\u65e5\u5fd7\u8f93\u51fa\u5668\u5c06\u5176\u8f93\u51fa\u5373\u53ef\u3002 \u5b9e\u73b0\u6b65\u9aa4\uff1a \u901a\u8fc7 inspect.getmembers \u83b7\u53d6\u88ab\u88c5\u9970\u7684\u7c7b\u4e0b\u6240\u6709\u51fd\u6570\uff0c\u5305\u542b\u9759\u6001\u65b9\u6cd5\uff0c\u7c7b\u65b9\u6cd5\uff0c\u5b9e\u4f8b\u65b9\u6cd5\uff1b \u901a\u8fc7 setattr(\u7c7b, \u65b9\u6cd5, _trace\uff09 \u7684\u65b9\u5f0f\uff0c\u7ed9\u7b26\u5408\u6761\u4ef6\u7684\u51fd\u6570\uff0c\u52a8\u6001\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_3","title":"3\u3001\u65e5\u5fd7\u914d\u7f6e","text":"[log_cli]\n;\u65e5\u5fd7\u76f8\u5173\u914d\u7f6e\uff08\u4e0d\u6253\u5370\u6784\u9020\u51fd\u6570\u548c\u9b54\u6cd5\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff09\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = INFO\n# ============= \u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u914d\u7f6e ================\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u5f00\u5934\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7, \u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_STARTSWITH = Assert\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u7ed3\u5c3e\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_ENDSWITH = Widget\n;\u652f\u6301\u7c7b\u540d\u5305\u542b xxx \u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_CONTAIN = ShortCut\n# ==============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_3","title":"4\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u5728\u5e94\u7528\u5e93 widget \u65b9\u6cd5\u5e93\u91cc\u9762\uff0c\u53ea\u9700\u8981\u5728\u51fa\u53e3\u6587\u4ef6\u52a0\u4e0a\u7c7b\u88c5\u9970\u5668\uff0c\u5c31\u53ef\u4ee5\u5b9e\u73b0\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u4e86\uff1b # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6ce8\u610f\uff0c\u662f\u7c7b\u88c5\u9970\u5668\u3002 \u5b9e\u4f8b\uff1a # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\n@classmethod\ndef find_dfm_image(cls, *elements, multiple=False, rate=0.9):\n\"\"\"\n \u67e5\u627e\u56fe\u7247 {{elements}}.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e {{rate}} \u7684\u5750\u6807\n :param elements:\n :param multiple:\n :return:\n \"\"\"\nelement = tuple(map(lambda x: f\"{Config.PIC_RES_PATH}/{x}\", elements))\nreturn cls.find_image(*element, multiple=multiple)\n \u8c03\u7528\u65b9\u6cd5\u65f6\uff1a DfmWidget.find_dfm_image(\"dfm_001\")\n \u81ea\u52a8\u8f93\u51fa\u7684\u65e5\u5fd7\uff1a >> x86_64-uos-6: 02/28 17:48:47 | INFO | logger_utils: [find_dfm_image]: \u67e5\u627e\u56fe\u7247 dfm_001.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e 0.9 \u7684\u5750\u6807\n \u52a0\u4e0a\u88c5\u9970\u5668 @log \u4e4b\u540e\uff0c\u65b9\u6cd5\u5c42\u6240\u6709\u7684\u51fd\u6570\uff08\u5305\u62ec\u5b9e\u4f8b\u65b9\u6cd5\u3001\u7c7b\u65b9\u6cd5\u3001\u9759\u6001\u65b9\u6cd5\uff09\u90fd\u4e0d\u9700\u8981\u518d\u5199\u65e5\u5fd7\u4ee3\u7801\uff0c\u6267\u884c\u7684\u65f6\u5019\u4f1a\u81ea\u52a8\u8f93\u51fa\uff0c\u5e76\u4e14\u6240\u6709\u8c03\u7528\u7684\u65b9\u6cd5\u4f1a\u4ee5 allure.step \u7684\u65b9\u5f0f\uff0c\u5c55\u793a\u5728 allure \u62a5\u544a\u4e2d\uff0c\u5728\u62a5\u544a\u4e2d\u66f4\u80fd\u4e00\u76ee\u4e86\u7136\u7684\u770b\u5230\u7528\u4f8b\u6267\u884c\u6b65\u9aa4\u3002 \u3010\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\u3011 \u901a\u8fc7\u89c2\u5bdf\u524d\u9762\u7684\u4f8b\u5b50\uff0c\u7ec6\u5fc3\u7684\u540c\u5b66\u53ef\u80fd\u8fd8\u53d1\u73b0\u4e86\u4e00\u4e2a\u5c0f\u7ec6\u8282\uff1a\u51fd\u6570\u529f\u80fd\u8bf4\u660e\u4e2d\uff0c\u4e24\u5bf9\u5927\u62ec\u53f7\u4e2d\u7684\u5185\u5bb9 {{elements}} \u4f5c\u4e3a\u53d8\u91cf\u8f93\u51fa\u51fa\u6765\u4e86\uff1b \u6ca1\u9519\uff0c\u8fd9\u5c31\u662f\u6211\u4eec\u53c2\u8003Django \u548c jinja2 \u7684\u6a21\u677f\u8bed\u6cd5\u8bbe\u8ba1\u51fa\u7684\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\uff0c\u4f7f\u7528\u65b9\u6cd5\u5f88\u7b80\u5355\uff0c\u7528\u4e24\u5bf9\u5927\u62ec\u53f7\u628a\u51fd\u6570\u7684\u53c2\u6570\u62ec\u8d77\u6765\uff0c\u8fd9\u6837\u5728\u65e5\u5fd7\u8f93\u51fa\u7684\u65f6\u5019\u5c31\u80fd\u628a\u8c03\u7528\u51fd\u6570\u65f6\u53c2\u6570\u7684\u503c\u8f93\u51fa\u51fa\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_7","title":"\u516b\u3001\u73af\u5883\u90e8\u7f72","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_6","title":"1\u3001\u539f\u5219","text":"YouQu \u7684\u73af\u5883\u4f9d\u8d56\u4e00\u76f4\u575a\u6301 2 \u4e2a\u539f\u5219\uff1a \u6700\u5c0f\u73af\u5883\u4f9d\u8d56\u539f\u5219 \u6709\u4e9b\u540c\u5b66\u5199\u4e00\u4e9b\u529f\u80fd\uff0c\u9996\u5148\u60f3\u5230\u7684\u5c31\u662f\u53bb\u641c\u7d22\u5f15\u64ce\u641c\u4e00\u4e0b\uff0c\u770b\u6709\u6ca1\u6709\u73b0\u6210\u7684\u5de5\u5177\u6216\u8005\u4ee3\u7801\u76f4\u63a5\u80fd\u7528\uff0c\u7f8e\u5176\u540d\u66f0\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\uff0c\u522b\u4eba\u5df2\u7ecf\u9020\u597d\u4e86\u8f6e\u5b50\u54b1\u4eec\u5c31\u4e0d\u8981\u91cd\u590d\u53bb\u9020\u4e86\uff0c\u7136\u540e\u4e00\u5207\u4f3c\u4e4e\u90fd\u53d8\u5f97\u90a3\u4e48\u7684\u7406\u6240\u5e94\u5f53\u3002 \u5f53\u7136\u8fd9\u6837\u505a\u65e0\u53ef\u539a\u975e\uff0c\u6211\u76f8\u4fe1\u6709\u8fd9\u6837\u60f3\u6cd5\u5e76\u4e14\u4e00\u76f4\u8df5\u884c\u8fd9\u6837\u505a\u6cd5\u7684\u540c\u5b66\u4e0d\u5728\u5c11\u6570\uff0c\u4f46\u8fd9\u6837\u505a\u6709\u4e00\u4e2a\u5f88\u4e25\u91cd\u7684\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f60\u5199\u4e00\u4e2a\u5927\u578b\u9879\u76ee\u65f6\uff0c\u4f60\u4f1a\u5f15\u5165\u975e\u5e38\u975e\u5e38\u975e\u5e38\u591a\u7684\u4f9d\u8d56\uff0c\u6bd4\u5982\u8981\u505a\u4e2a\u63a5\u53e3\u8bf7\u6c42\u8981\u7528 requests\u3001\u8bfb\u5199\u4e2a\u6570\u636e\u7528 pandas\u3001\u5199\u4e2a\u8868\u683c\u7528 pyopenxl\u3001\u89e3\u6790\u4e2a\u6587\u672c\u8981\u7528\u8fd9\u4e2a\u90a3\u4e2a\u4e09\u65b9\u5e93 ... \u3002 \u6211\u8ba4\u4e3a\u8fd9\u662f\u975e\u5e38\u4e0d\u597d\u7684\u4e60\u60ef\uff0c\u5728\u5b9e\u73b0\u4e00\u4e2a\u529f\u80fd\u7684\u65f6\u5019\uff0c\u9996\u5148\u6211\u4eec\u5e94\u8be5\u53bb\u60f3\u81ea\u5df1\u600e\u4e48\u6837\u53bb\u5b9e\u73b0\uff0c\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff1b \u5982\u679c\u4f60\u4e0d\u4f1a\uff0c\u4f60\u53ef\u4ee5\u53bb\u5b66\u4e60\u4e09\u65b9\u5e93\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u522b\u4eba\u4e09\u65b9\u5e93\u4e5f\u662f\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\u7684\uff0c\u4e3a\u4ec0\u4e48\u54b1\u4eec\u4e0d\u884c\u5462\uff1b\u5982\u679c\u522b\u4eba\u7684\u4f60\u5b9e\u5728\u662f\u770b\u4e0d\u61c2\uff0c\u60f3\u5c3d\u4e00\u5207\u529e\u6cd5\u786e\u5b9e\u505a\u4e0d\u51fa\u6765\uff0c\u90a3\u518d\u8003\u8651\u5f15\u5165\u8fd9\u4e2a\u4e09\u65b9\u5e93\uff0c\u6211\u8ba4\u4e3a\u8fd9\u6837\u662f\u6ca1\u95ee\u9898\u7684\uff0c\u6bd5\u7adf\u54b1\u4eec\u6bb5\u4f4d\u8fd8\u4e0d\u591f\uff0c\u4f46\u5e0c\u671b\u5c06\u6765\u6709\u4e00\u5929\u6211\u4eec\u53ef\u4ee5\u3002 \u8fd9\u6837\u7684\u505a\u6cd5\u624d\u5e94\u8be5\u662f\u201c\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\u201d\u6b63\u786e\u7684\u64cd\u4f5c\u3002\u4e0d\u4f1a\u6ca1\u5173\u7cfb\uff0c\u770b\u770b\u522b\u4eba\u662f\u600e\u4e48\u5b9e\u73b0\u7684\uff0c\u81ea\u5df1\u518d\u6478\u7d22\u7740\u5199\u51fa\u6765\uff0c\u8fd9\u6837\u81ea\u5df1\u624d\u80fd\u6709\u6240\u63d0\u9ad8\uff0c\u4e0d\u7136\u4f60\u5c31\u53ea\u4f1a\u7528\u522b\u4eba\u7684\u4e1c\u897f\uff1b\u90a3\u4e9b\u5632\u7b11\u3001\u6279\u8bc4\u6211\u4eec\u91cd\u590d\u9020\u8f6e\u5b50\u7684\u4eba\uff0c\u5148\u60f3\u60f3\u81ea\u5df1\u4f1a\u9020\u8f6e\u5b50\u5417\u3002 \u672c\u7740\u81ea\u5df1\u5b9e\u73b0\u80fd\u5b9e\u73b0\u7684\u4e00\u5207\u7684\u539f\u5219\uff0cYouQu \u6846\u67b6\u505a\u5230\u4e86\u975e\u5e38\u5c11\u7684\u73af\u5883\u4f9d\u8d56\uff0c\u800c\u4e14\u6211\u4eec\u4ecd\u5728\u4e0d\u65ad\u52aa\u529b\uff0c\u51cf\u5c11\u73af\u5883\u90e8\u7f72\u7684\u4f9d\u8d56\u3002 \u6700\u5c0f\u4ed3\u5e93\u4f53\u79ef\u539f\u5219 \u5927\u6587\u4ef6\u4e0d\u80fd\u4e0a\u4f20\u5230\u5de5\u7a0b\u91cc\u9762\uff0c\u4fdd\u6301\u6574\u4e2a\u5de5\u7a0b\u7684\u8f7b\u91cf\u5316\uff0c\u8fd9\u6837\u5728\u514b\u9686\u4ee3\u7801\u7684\u65f6\u5019\u624d\u80fd\u975e\u5e38\u5feb\u901f\u65b9\u4fbf\u4f7f\u7528\uff0c\u6211\u4eec\u89c1\u8fc7\u4e00\u4e2a AT \u5de5\u7a0b clone \u5927\u5c0f\u8fbe\u5230\u597d\u51e0\u4e2a G\uff0c\u7b80\u76f4\u4e0d\u53ef\u601d\u8bae\u3002 \u5176\u5b9e\u4ee3\u7801\u6587\u4ef6\u7684\u5927\u5c0f\u662f\u5f88\u5c0f\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u7eaf\u5199\u4ee3\u7801\u968f\u4fbf\u5199\u5de5\u7a0b\u4e5f\u4e0d\u4f1a\u592a\u5927\uff0c\u800c\u6587\u6863\uff08\u5305\u542b\u63d2\u56fe\uff09\u7b49\u8d44\u6e90\u5374\u662f\u5f88\u5360\u7a7a\u95f4\u3002 \u56e0\u6b64\u6211\u4eec\u9009\u62e9\u5c06 YouQu \u7684\u6587\u6863\u5de5\u7a0b\u6d89\u53ca\u5230\u7684\u56fe\u7247\u8d44\u6e90\u90fd\u91c7\u7528\u5916\u94fe\u52a0\u8f7d\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_6","title":"2\u3001\u5b89\u88c5","text":"\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u8fd0\u884c env.sh \u5373\u53ef\u3002 bash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_4","title":"3\u3001\u5b9a\u5236\u4f9d\u8d56","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_2","title":"3.1\u3001\u65b0\u589e\u4f9d\u8d56","text":"\u5982\u679c\u5e94\u7528\u5e93\u8fd8\u9700\u8981\u5176\u4ed6 Python \u4f9d\u8d56\u5e93\uff0c\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a requirement.txt \u6587\u4ef6\uff1b autotest_xxx\n\u251c\u2500\u2500 requirement.txt\n\u251c\u2500\u2500 case ...\n \u91cc\u9762\u5199\u5165\u9700\u8981\u5b89\u88c5\u7684\u4e09\u65b9\u4f9d\u8d56\uff0c\u6bd4\u5982\u50cf\u8fd9\u6837\uff1a # requirement.txt\nPyYAML==6.0 # \u6307\u5b9a\u5b89\u88c5\u67d0\u4e2a\u7248\u672c\nrequests # \u672a\u6307\u5b9a\u7248\u672c\u5219\u5b89\u88c5\u6700\u65b0\u7248\n \u5728\u6267\u884c bash env.sh \u65f6\u4f1a\u4e00\u5e76\u5c06\u5176\u5b89\u88c5\u3002 \u5982\u679c\u591a\u4e2a\u5e94\u7528\u5e93\u90fd\u5b58\u5728 requirement.txt \u6587\u4ef6\uff0c\u6267\u884c env.sh \u65f6\u4f1a\u5c06\u591a\u4e2a requirement.txt \u6587\u4ef6\u4e00\u5e76\u52a0\u8f7d\uff1b\u90a3\u4e48\u4e00\u5b9a\u8981\u6ce8\u610f\u591a\u4e2a requirement.txt \u6587\u4ef6\u53ef\u80fd\u5b58\u5728\u76f8\u540c\u7684\u4f9d\u8d56\u88ab\u6307\u5b9a\u5b89\u88c5\u4e0d\u540c\u7248\u672c\u7b49\u7b49\u517c\u5bb9\u6027\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32_1","title":"3.2\u3001\u88c1\u526a\u4f9d\u8d56","text":"\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0c\u53ef\u80fd\u4f60\u53ea\u9700\u8981\u5b89\u88c5\u4e00\u4e9b\u6700\u6700\u57fa\u7840\u7684\u4f9d\u8d56\uff0c\u5176\u4ed6\u7684\u90fd\u4e0d\u9700\u8981\uff0c\u6bd4\u5982\u7eaf\u63a5\u53e3\u81ea\u52a8\u5316\u7684\u9879\u76ee\uff0c\u5b83\u4e0d\u9700\u8981 UI \u81ea\u52a8\u5316\u76f8\u5173\u7684\u4f9d\u8d56\u3002 \u4f60\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\uff0c\u5b58\u653e\u4e00\u4e2a BASICENV \u7684\u666e\u901a\u6587\u4ef6\uff0c\u91cc\u9762\u4e0d\u9700\u8981\u5199\u4efb\u4f55\u5185\u5bb9\uff0c\u8fd9\u6837\u6267\u884c env.sh \u65f6\uff0c\u53ea\u4f1a\u5b89\u88c5\u6700\u57fa\u7840\u7684\u4f9d\u8d56\u3002 autotest_xxx\n\u251c\u2500\u2500 BASICENV # \u53ef\u4ee5\u4f7f\u7528\uff1atouch BASICENV \u521b\u5efa\u6587\u4ef6\n\u251c\u2500\u2500 case ...\n \u57fa\u7840\u4f9d\u8d56\u4ec5\u5b89\u88c5\u4ee5\u4e0b\u51e0\u4e2a\u5305\uff1a pytest # pytest\npytest-rerunfailures # \u5931\u8d25\u91cd\u8dd1\u63d2\u4ef6\npytest-timeout # \u7528\u4f8b\u8d85\u65f6\u63d2\u4ef6\nallure-pytest # \u751f\u6210 allure \u62a5\u544a\u63d2\u4ef6\nallure.deb # allure \u62a5\u544a\u67e5\u770b\u5de5\u5177\n \u88c1\u526a\u4f9d\u8d56 \u548c \u65b0\u589e\u4f9d\u8d56 \u662f\u4e0d\u51b2\u7a81\u7684\uff0c\u53ef\u4ee5\u540c\u65f6\u4f7f\u7528\u3002 \u6b64\u65b9\u6848\u9ed8\u8ba4\u4e3a\u865a\u62df\u73af\u5883\u90e8\u7f72\uff0c\u5982\u679c\u4f60\u60f3\u76f4\u63a5\u90e8\u7f72\u5728\u672c\u673a\u4e0a\uff1a bash env_dev.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_4","title":"4\u3001\u865a\u62df\u5316\u90e8\u7f72","text":"YouQu\u9ed8\u8ba4\u91c7\u7528\u865a\u62df\u5316\u90e8\u5206\uff0c\u865a\u62df\u5316\u73af\u5883\u5b9e\u9645\u5b89\u88c5\u7684\u4f4d\u7f6e\u662f\u5728 $HOME/.local/share/virtualenvs/youqu-oHTM7l7G \u76ee\u5f55\u4e0b youqu-oHTM7l7G \u6b64\u76ee\u5f55\u540d\u79f0\u524d\u9762\u90e8\u5206\u662f\u4f60\u7684\u4ee3\u7801\u6839\u76ee\u5f55\u7684\u540d\u79f0\uff0c\u540e\u9762\u90e8\u5206\u662f\u751f\u6210\u7684\u968f\u673a\u5b57\u7b26\u4e32\uff1b \u540c\u5b66\u4eec\u5728\u8fdc\u7a0b\u673a\u5668\u4e0a\u5b9a\u4f4d\u95ee\u9898\u7684\u65f6\u5019\uff0c\u5982\u679c\u4f7f\u7528 Pycharm \u8c03\u8bd5\uff0c\u5c31\u5c06\u89e3\u91ca\u5668\u6307\u5b9a\u5230\u8fd9\u4e2a\u76ee\u5f55\u7684\u5c31\u884c\u4e86\uff1b \u5f53\u7136\uff0c\u6211\u4eec\u4e5f\u63d0\u4f9b\u4e86\u672c\u673a\u5f00\u53d1\u73af\u5883\u90e8\u7f72\uff1a bash env_dev.sh\n \u5982\u679c\u4f60\u662f\u672c\u5730\u5f00\u53d1\u73af\u5883\u53ef\u4ee5\u7528\u5b83\uff0c\u533a\u522b\u5c31\u662f\u9a71\u52a8\u6267\u884c\u7684\u65f6\u5019\u4f7f\u7528\uff1apython3 manage.py xxx"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_8","title":"\u4e5d\u3001\u5931\u8d25\u5f55\u5c4f","text":"\u5f55\u5c4f\u5176\u5b9e\u662f\u4e00\u79cd\u89c6\u9891\u5f62\u5f0f\u7684\u65e5\u5fd7\uff0c\u56e0\u4e3a\u5f88\u591a\u65f6\u5019\u6211\u4eec\u5728\u67e5\u770b\u65e5\u5fd7\u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u51c6\u786e\u7684\u5b9a\u4f4d\u5230\u7528\u4f8b\u5931\u8d25\u7684\u5177\u4f53\u539f\u56e0\uff0c\u56e0\u6b64\u7528\u4f8b\u7684\u5f55\u5c4f\u80fd\u8ba9\u6211\u4eec\u770b\u5230\u7528\u4f8b\u5728\u6267\u884c\u8fc7\u7a0b\uff1b \u3010\u4f7f\u7528\u65b9\u6cd5\u3011 \u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u5173\u6ce8 2 \u4e2a\u53c2\u6570\uff1b ;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\u3002\n;\u6ce8\u610f\uff0c\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u4e0d\u80fd\u5c0f\u4e8e\u5931\u8d25\u5f55\u5c4f\u6b21\u6570\uff0c\u5373 RERUN >= RECORD_FAILED_CASE\nRECORD_FAILED_CASE = 1\n \u9ed8\u8ba4\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u662f 1 \u6b21\uff1b RECORD_FAILED_CASE = 1 \u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff1b RECORD_FAILED_CASE = 0 \u8868\u793a\u4e0d\u7ba1\u7528\u4f8b\u6210\u529f\u6216\u5931\u8d25\u90fd\u5f55\u5c4f\uff1b \u5f55\u5c4f\u662f\u8981\u5360\u7528\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u7279\u522b\u662f\u5728\u4e00\u4e9b\u914d\u7f6e\u8f83\u4f4e\u7684\u673a\u5668\u4e0a\u4f1a\u5f88\u660e\u663e\uff0c\u6240\u4ee5\u4f60\u9700\u8981\u8003\u8651\u662f\u5426\u6709\u5fc5\u8981\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1b \u4f7f\u7528 manage.py \u6267\u884c\u7528\u4f8b\u9ed8\u8ba4\u8bfb\u53d6\u5230 globalconfig.ini \u91cc\u9762\u7684\u53c2\u6570\uff0c\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report/record \u76ee\u5f55\u4e0b\u4fdd\u5b58\u5931\u8d25\u7528\u4f8b\u7684\u5f55\u5c4f\u548c\u65ad\u8a00\u7684\u90a3\u4e2a\u65f6\u95f4\u70b9\u7684\u622a\u5c4f\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7\u89c6\u9891\u6587\u4ef6\u770b\u5230\u5931\u8d25\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u90fd\u53d1\u751f\u4e86\u4ec0\u4e48\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#wayland","title":"\u5341\u3001Wayland \u9002\u914d","text":"Wayland \u4e0b\u81ea\u52a8\u5316\u4e3b\u8981\u95ee\u9898\u662f X11 \u4e0b\u7684\u952e\u9f20\u64cd\u4f5c\u65b9\u6cd5\u65e0\u6cd5\u4f7f\u7528\uff0c\u6bd4\u5982 Xdotool\u3001 PyAutoGUI\u3001Xwininfo \u7b49\u7b49\uff1b YouQu \u5728 Wayland \u4e0b\u517c\u5bb9\u9002\u914d\uff0cenv.sh \u5728 Wayland \u4e0b\u6267\u884c\u65f6\u4f1a\u5b89\u88c5\u81ea\u7814\u7684\u952e\u9f20\u64cd\u4f5c\u670d\u52a1\uff08\u53ef\u80fd\u5b58\u5728\u4e00\u4e9b\u4f9d\u8d56\u62a5\u9519\uff0c\u6309\u7167\u6ce8\u91ca\u89e3\u51b3\u5373\u53ef\uff09\uff0c\u6846\u67b6\u6838\u5fc3\u5e93\u4e5f\u9488\u5bf9\u6027\u7684\u505a\u4e86\u9002\u914d\uff0c\u4e0a\u5c42\u7528\u4f8b\u5b8c\u5168\u4e0d\u7528\u5173\u5fc3\u673a\u5668\u662fWayland \u8fd8\u662f X11\uff0c\u6846\u67b6\u4f1a\u6839\u636e\u6267\u884c\u65f6\u72b6\u6001\u81ea\u52a8\u5224\u65ad\u8d70\u4e0d\u540c\u7684\u903b\u8f91\uff1b \u7b80\u5355\u8bb2\u5c31\u662f\uff0c\u5e94\u7528\u5e93\u53ea\u9700\u8981\u7ef4\u62a4\u4e00\u5957\u7528\u4f8b\u811a\u672c\u5373\u53ef\u3002 \u3010\u7528\u4f8b\u517c\u5bb9\u3011 \u56e0\u4e3a Wayland \u4e0b\u6709\u4e9b\u5e94\u7528\u7684\u754c\u9762\u663e\u793a\u548c\u529f\u80fd\u672c\u8eab\u5b58\u5728\u4e00\u4e9b\u5dee\u5f02\uff0c\u7528\u4f8b\u5c42\u53ef\u80fd\u9700\u8981\u5bf9\u8fd9\u90e8\u5206\u7528\u4f8b\u505a\u903b\u8f91\u5224\u65ad\uff0c\u4f7f\u7528\u5168\u5c40\u914d\u7f6e\u91cc\u9762\u7684\u5e38\u91cf\u8fdb\u884c\u903b\u8f91\u7f16\u5199\u5373\u53ef\uff1a from setting.globalconfig import GlobalConfig\n# GlobalConfig.IS_WAYLAND \u83b7\u53d6\u5230\u5f53\u524d\u7684\u663e\u793a\u670d\u52a1\u5668\uff08bool\uff09\n# \u5e94\u7528\u5e93 Config \u7ee7\u627f GlobalConfig\nif Config.IS_WAYLAND:\npass\nif Config.IS_X11:\npass\n \u6bd4\u5982\u7528\u4f8b\u91cc\u9762\u5982\u679c\u65ad\u8a00\u7684\u56fe\u7247\u4e0d\u540c\uff1a if Config.IS_WAYLAND:\nself.assert_image_exist(\"wayland_XXX\")\nelse:\nself.assert_image_exist(\"x11_XXX\")\n \u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u811a\u672c\u5728 Wayland \u548c X11 \u4e0b\u90fd\u53ef\u4ee5\u8dd1\uff0cso easy \u662f\u4e0d\u662f\uff1f\u5b8c\u5168\u6ca1\u5fc5\u8981\u4e13\u95e8\u62c9\u65b0\u5206\u652f\u8fdb\u884c Wayland \u9002\u914d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_9","title":"\u5341\u4e00\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_7","title":"1. \u76ee\u5f55\u7ed3\u6784","text":"\u6267\u884c\u65f6\u4f1a\u5728\u6839\u76ee\u5f55\u4e0b\u52a8\u6001\u751f\u6210 report \u76ee\u5f55\uff0c\u6240\u6709\u7684\u62a5\u544a\u76f8\u5173\u7684\u6587\u4ef6\u4f1a\u7edf\u4e00\u5b58\u653e\u5728\u91cc\u9762\uff0c\u793a\u4f8b\uff1a /report\n \u251c\u2500\u2500 allure # allure\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json\n \u251c\u2500\u2500 allure_html # \u751f\u6210\u7684html\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 index.html \u251c\u2500\u2500 allure_back # allure\u62a5\u544a\u5907\u4efd\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 20221108114823\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json\n \u251c\u2500\u2500 json # json\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 result_deepin-music_20221109134736_1081333.json\n \u251c\u2500\u2500 logs # \u65e5\u5fd7\u6587\u4ef6\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 2022-11-10_debug.log \u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-10_error.log\n \u251c\u2500\u2500 record # \u5f55\u5c4f\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-09\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 15\u65f614\u520609\u79d2_test_music_303_2_autotest.mp4\n \u2514\u2500\u2500 xml # xml\u62a5\u544a\n\u2514\u2500\u2500 autotest_deepin_music-20221109134736.xml\n \u9ed8\u8ba4\u60c5\u51b5\u4e0b\u540c\u65f6\u751f\u6210 html\u3001xml\u3001json\u4e09\u79cd\u5f62\u5f0f\u7684\u62a5\u544a\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_7","title":"2. \u5b9a\u5236\u62a5\u544a","text":"\u6211\u4eec\u5bf9 allure \u62a5\u544a\u8fdb\u884c\u4e86\u4e00\u7cfb\u5217\u7684\u5b9a\u5236\uff1a \u5b9a\u5236 logo\u3001title\u3001\u62a5\u544a\u9ed8\u8ba4\u8bed\u8a00\u4e3a\u4e2d\u6587\uff1b \u52a0\u5165\u4e86\u7528\u4f8b\u65ad\u8a00\u5931\u8d25\u65f6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u4ee5\u53ca\u6b64\u65f6\u56fe\u50cf\u5bf9\u6bd4\u7684\u6a21\u677f\u56fe\u7247\uff1b \u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\uff0c\u4f60\u53ef\u4ee5\u5728 html \u62a5\u544a\u4e2d\u76f4\u63a5\u770b\u5f55\u5236\u7684\u89c6\u9891\uff1b \u52a0\u5165\u4e86 IP \u5730\u5740\u3001\u7cfb\u7edf\u4fe1\u606f\u3001\u955c\u50cf\u7248\u672c\u7b49\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_5","title":"3. \u67e5\u770b\u62a5\u544a","text":" \u672c\u5730\u6267\u884c \u5728 report/allure \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u4e00\u5806\u6587\u672c\u6587\u4ef6\uff0c\u8fd9\u4e9b\u662f allure \u63d2\u4ef6\u751f\u6210\u7684\u62a5\u544a\u6e90\u6570\u636e\uff0c\u6211\u4eec\u5728 report/allure_html \u76ee\u5f55\u4e0b\u7ed9\u4f60\u751f\u6210\u4e86 html \u6587\u4ef6\uff0c\u4f46\u662f\u4f60\u4e0d\u80fd\u76f4\u63a5\u901a\u8fc7\u6d4f\u89c8\u5668\u6253\u5f00 index.html \u6587\u4ef6\uff0c\u56e0\u4e3a allure \u7684\u62a5\u544a\u90fd\u662f\u57fa\u4e8e\u5728\u7ebf\u7684\u670d\u52a1\uff0c\u4f60\u5e94\u8be5\u8fd9\u6837\u6253\u5f00\uff1a allure open report/allure_html\n \u4f7f\u7528 manage.py \u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u5728\u7ec8\u7aef\u7684\u6700\u540e\u4e00\u884c\uff0c\u6211\u4eec\u4f1a\u7ed9\u4f60\u8f93\u51fa\u6253\u5f00\u62a5\u544a\u7684\u547d\u4ee4\uff0c\u76f4\u63a5\u590d\u5236\u5b83\u5728\u7ec8\u7aef\u6267\u884c\u5c31\u53ef\u4ee5\u67e5\u770b\u4e86\uff0c\u50cf\u8fd9\u6837\uff1a \u7ec8\u7aef\u6267\u884c\u547d\u4ee4: allure open /tmp/youqu/report/allure_html \u67e5\u770b\u62a5\u544a \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 Pycharm \u91cc\u9762\u627e\u5230 index.html \u6587\u4ef6\uff0c\u7136\u540e\u53f3\u952e\u9009\u62e9\u6d4f\u89c8\u5668\u6253\u5f00\uff0c\u6216\u8005\u4f60\u53ef\u4ee5\u7528\u4e00\u4e2a http \u670d\u52a1\u6253\u5f00\u3002 \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 report/allure \u76ee\u5f55\u4e0b\u67e5\u770b\u62a5\u544a\uff1a allure serve report/allure\n \u8fdc\u7a0b\u6267\u884c \u8fdc\u7a0b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\uff0c\u4f1a\u5c06\u6240\u6709\u8fdc\u7a0b\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u62a5\u544a\u90fd\u6536\u96c6\u5230 report/allure \u76ee\u5f55\u4e0b\uff0c\u5206\u522b\u6309\u7167\u673a\u5668\u7684 IP \u7b49\u5efa\u4e86\u4e0d\u540c\u7684\u76ee\u5f55\uff0c\u4f60\u53ef\u4ee5\u5728\u8fd9\u4e9b\u76ee\u5f55\u91cc\u9762\u53bb\u67e5\u770b\u5bf9\u5e94\u7684\u6d4b\u8bd5\u62a5\u544a\uff0c\u67e5\u770b\u65b9\u6cd5\u548c\u524d\u9762\u672c\u5730\u6267\u884c\u67e5\u770b\u7684\u65b9\u6cd5\u4e00\u6837\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_10","title":"\u5341\u4e8c\u3001\u9759\u6001\u4ee3\u7801\u626b\u63cf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_8","title":"1. \u63d0\u524d\u89e3\u51b3\u4ee3\u7801\u95ee\u9898","text":"\u4e3a\u4e86\u5e2e\u52a9\u5f00\u53d1\u8005\u7edf\u4e00\u4ee3\u7801\u98ce\u683c\uff0cPython \u793e\u533a\u63d0\u51fa\u4e86 PEP8 \u4ee3\u7801\u7f16\u7801\u98ce\u683c\uff0cPython \u5b98\u65b9\u540c\u65f6\u63a8\u51fa\u4e86\u4e00\u4e2a\u68c0\u67e5\u4ee3\u7801\u98ce\u683c\u662f\u5426\u7b26\u5408 PEP8 \u7684\u5de5\u5177\uff0c\u540d\u5b57\u4e5f\u53eb PEP8\u3002 \u4f46\u662f\uff0cPycharm \u91cc\u9762\u7684 PEP8 \u63d2\u4ef6\u5b9e\u9645\u4e0a\u5e76\u4e0d\u80fd\u53d1\u73b0\u5f88\u591a\u4ee3\u7801\u95ee\u9898\uff0c\u8fd9\u4e9b\u95ee\u9898\u5e76\u4e0d\u4f1a\u5728\u8fd0\u884c\u65f6\u62a5\u9519\uff0c\u56e0\u4e3a\u4ece Python \u8bed\u8a00\u89d2\u5ea6\u5e76\u4e0d\u5173\u5fc3\u8fd9\u4e9b\u95ee\u9898\uff0c\u5728 Pycharm \u7f16\u8f91\u5668\u91cc\u9762\u4f7f\u7528\u5feb\u6377\u952e ctrl + alt + L\uff0c\u6709\u4e00\u70b9\u70b9\u683c\u5f0f\u5316\u7684\u6548\u679c\uff0c\u80fd\u89e3\u51b3\u4e00\u4e9b\u7a7a\u683c\u3001\u6362\u884c\u7b49\u5c0f\u95ee\u9898\u3002 \u8fd9\u91cc\u63a8\u8350\u4e00\u4e2a Python \u793e\u533a\u6d41\u884c\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff1a Black\uff0c\u53f7\u79f0\u4e0d\u59a5\u534f\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff0c\u5b83\u68c0\u6d4b\u5230\u4e0d\u7b26\u5408\u89c4\u8303\u7684\u4ee3\u7801\u98ce\u683c\u76f4\u63a5\u5c31\u5e2e\u4f60\u5168\u90e8\u683c\u5f0f\u5316\u597d\uff0c\u5c31\u662f\u8fd9\u4e48\u521a\uff01 \u5b89\u88c5\uff1a sudo pip3 install black \n \u4f7f\u7528\u65b9\u6cd5\uff1a black ${CheckPath}\n \u4f7f\u7528\u8fd9\u4e2a\u5de5\u5177\u683c\u5f0f\u5316\u4e4b\u540e\uff0c\u4ee3\u7801\u4f1a\u88ab\u81ea\u52a8\u8c03\u6574\uff0c\u521a\u5f00\u59cb\u4f60\u53ef\u80fd\u4f1a\u89c9\u5f97\u8c03\u6574\u5f97\u5f88\u5938\u5f20\uff0c\u6ca1\u5173\u7cfb\u575a\u6301\u770b\uff0c\u4e60\u60ef\u4e4b\u540e\uff0c\u4f60\u4f1a\u89c9\u5f97\u5f88\u4f18\u96c5\uff0c\u6ca1\u9519\uff0c\u8fd9\u5c31\u662f Pythonic Code \u7684\u6838\u5fc3\uff0c\u8bf7\u4fdd\u6301\u4f18\u96c5\uff5e\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_8","title":"2. \u4ee3\u7801\u626b\u63cf\u5de5\u5177","text":"\u4f7f\u7528\u6839\u76ee\u5f55\u4e0b pylint.sh \u626b\u63cf\u4ee3\u7801\uff0c\u5728 report \u76ee\u5f55\u4e0b\u67e5\u770b\u4ee3\u7801\u626b\u63cf\u62a5\u544a\uff0c\u5982\u679c\u6709\u4ee3\u7801\u95ee\u9898\u8bf7\u63d0\u524d\u89e3\u51b3\u4e4b\u540e\u518d\u63d0\u4ea4\u3002 \u6b64\u811a\u672c\u5df2\u7ecf\u4f7f\u7528 Python \u793e\u533a\u6700\u6d41\u884c\u7684\u4ee3\u7801\u626b\u63cf\u5de5\u5177 Pylint \u8fdb\u884c\u4ee3\u7801\u626b\u63cf\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a bash pylint.sh\n \u8fd0\u884c\u4e4b\u540e\u4f1a\u63d0\u793a\u4f60\u8981\u626b\u63cf\u7684\u76ee\u5f55\uff0c\u6bd4\u5982\u8f93\u5165 apps \uff0c\u5219\u4f1a\u626b\u63cf apps \u4e0b\u7684\u6240\u6709 Python \u4ee3\u7801\u3002 \u5728 setting/pylintrc.cfg \u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u76f8\u5173\u914d\u7f6e\uff0c\u626b\u63cf\u5b8c\u6210\u4e4b\u540e\u5728 report/pylints \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u626b\u63cf\u62a5\u544a\u3002 \u4ee3\u7801\u63d0\u4ea4\u9700\u901a\u8fc7 git review \u63d0\u4ea4\u5230 gerrit \uff0c\u4eba\u5de5 Code Review \u901a\u8fc7\u4e4b\u540e\u5408\u5165\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_11","title":"\u5341\u4e09\u3001\u63d0\u4ea4\u4ee3\u7801","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_9","title":"1. \u5b89\u88c5\u4f9d\u8d56","text":"sudo apt install git-review\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_9","title":"2. \u63d0\u4ea4\u6a21\u677f","text":"\u5728 ~ \u76ee\u5f55\u4e0b\u65b0\u5efa\u6587\u4ef6\uff0c\u5e76\u547d\u540d\u4e3a gitcommit_template \u5c06\u4ee5\u4e0b\u5185\u5bb9\u5199\u5165\u6587\u4ef6\u5f53\u4e2d\uff1a # commit type :fix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style(\u98ce\u683c\u4fee\u6539)\u3001refactor(\u91cd\u6784)\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test(\u6d4b\u8bd5) + \u7b80\u5355\u63cf\u8ff0. \u9ed8\u8ba4fix,\u6839\u636e\u60c5\u51b5\u4fee\u6539\nfix: \n\n# \u8be6\u7ec6\u8bf4\u660e\u4ee3\u7801\u7684\u6539\u52a8\uff0c\u5305\u542b\u4ee3\u7801\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u4ee5\u53ca\u4e3a\u4ec0\u4e48\u8fd9\u4e48\u505a\uff0c\u53ef\u80fd\u4f1a\u5f71\u54cd\u54ea\u4e9b\u529f\u80fd\u3002\u5bf9\u4e8e\u4ee3\u7801\u7684\u5ba1\u6838\u8005\uff0c\u9700\u8981\u4ece\u8fd9\u6bb5\u63cf\u8ff0\u4e2d\u80fd\u5b8c\u5168\u7406\u89e3\u4ee3\u7801\u4e2d\u6240\u6709\u6539\u52a8\u7684\u5185\u5bb9\nDescription: \n\n# \u5199\u4e00\u6bb5\u9762\u5411\u4e8e\u4ea7\u54c1\u7684\u603b\u7ed3\u6027\u5185\u5bb9\uff0c\u7528\u4e8e\u81ea\u52a8\u751f\u6210crp\u4e0a\u7684changlog\uff0c\u9700\u8981\u6ce8\u610f\u7684\u4e8b\uff0c\u8fd9\u6bb5\u63cf\u8ff0\u5fc5\u987b\u4ece\u4ea7\u54c1\u7684\u89d2\u5ea6\u8003\u8651\u3002\nLog: \n\n# \u5173\u8054pms\u4e0a\u7684bug\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94bug\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4fee\u590dbug\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Bug: \n\n# \u4fee\u590d github issue \n#Issue: \n\n# \u5173\u8054pms\u4e0a\u7684\u4efb\u52a1\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94\u4efb\u52a1\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4efb\u52a1\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Task: \n \u547d\u4ee4\u884c\u6267\u884c: git config --global commit.template ~/gitcommit_template\n \u6b64\u547d\u4ee4\u5c06\u6a21\u677f\u52a0\u5165\u5230 git \u7684\u63d0\u4ea4\u6a21\u677f\u4e2d\u3002 \u540e\u7eed\u63d0\u4ea4\u7684\u65f6\u5019\u9700\u8981\u5173\u6ce8\u4e00\u4e0b\u51e0\u70b9\uff1a commit type \u5bf9\u5e94\u4e0d\u540c\u7684\u4fee\u6539\u7c7b\u578b\uff1afix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style \uff08\u98ce\u683c\u4fee\u6539\uff09\u3001refactor \uff08\u91cd\u6784\uff09\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test \uff08\u6d4b\u8bd5\uff09 commit type \u5192\u53f7\u540e\u9762\u52a0\u7a7a\u683c\u3002 Description \u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u9700\u8981\u8fdb\u884c\u8be6\u7ec6\u8bf4\u660e\uff0c\u6bd4\u5982\u5bf9\u529f\u80fd\u8fdb\u884c\u5927\u6539\u7b49\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_6","title":"3. \u63a8\u9001\u4ee3\u7801","text":"\u9996\u5148\u6dfb\u52a0 commit \u4fe1\u606f git add \u540e\u9762\u52a0\u6587\u4ef6\u540d\u79f0\n git add . # \u8868\u793a\u6dfb\u52a0\u6240\u6709\u6587\u4ef6\n \u4f7f\u7528\u8fd9\u6761\u547d\u4ee4\u6ce8\u610f\u6709\u4e9b\u4e34\u65f6\u6587\u4ef6\u4e0d\u8981\u63d0\u4ea4\u5230\u4ed3\u5e93\u4e86\u3002 git commit -a\n \u4e4b\u540e\u5728 fix: \u540e\u9762\uff08\u6ce8\u610f\u5192\u53f7\u540e\u9762\u5fc5\u987b\u52a0\u7a7a\u683c\uff0c\u4e0d\u7136\u76f4\u63a5-1\uff09\u5199\u672c\u5730\u63d0\u4ea4\u7684 commit \u4fe1\u606f\uff0c\u7136\u540e\u5c31\u53ef\u4ee5\u63d0\u4ea4\u4ee3\u7801\u4e86 git review branch(\u5f53\u524d\u5206\u652f) -r origin\n \u6700\u597d\u4e00\u6b21 commit\uff0c\u4e00\u6b21 git review \uff0c\u7ecf\u5e38\u6709\u540c\u5b66\u5728\u672c\u5730\u75af\u72c2 commit \u6700\u540e git review \u62a5\u9519\u4e0d\u77e5\u9053\u548b\u56de\u4e8b\u513f\u3002 \u82e5\u4e0d\u60f3\u6bcf\u6b21\u63d0\u4ea4\u90fd\u52a0\u4e0a -r \u9009\u9879\uff0c\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a git config --global gitreview.remote origin \u63d0\u4ea4\u4ee3\u7801\uff0c\u76f4\u63a5\u4f7f\u7528 git review branch<\u76ee\u6807\u5206\u652f>\uff0c\u4f8b\u5982 git review master"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git","title":"4. Git\u6807\u7b7e","text":"Git \u6807\u7b7e\u5b9e\u9645\u4e0a\u662f commit \u7684\u4e00\u4e2a\u522b\u540d\uff0c\u4e3b\u8981\u7528\u4e8e\u7ba1\u7406\u5386\u53f2\u7248\u672c\u3002 \u60f3\u8c61\u4e00\u4e0b\u9886\u5bfc\u8ba9\u4f60\u628a\u4e4b\u524d\u7684\u67d0\u4e2a\u7248\u672c\u7684\u4ee3\u7801\u62c9\u51fa\u6765\u8dd1\uff0c\u4f60\u662f\u4e0d\u662f\u4e56\u4e56\u7684\u53bb\u628a\u6240\u6709\u63d0\u4ea4\u8bb0\u5f55\u62c9\u51fa\u6765\u627e\uff0c\u7136\u540e\u627e\u5230\u90a3\u4e2a\u54c8\u5e0c\u503c\uff0c\u901a\u8fc7\u54c8\u5e0c\u503c\u6765\u68c0\u51fa\u4ee3\u7801\u3002 \u8fd9\u4e00\u5957\u64cd\u4f5c\u4e0b\u6765\u662f\u4e0d\u662f\u5f88\u9ebb\u70e6\uff0c\u8d39\u65f6\u95f4\u8fd8\u4e0d\u4e00\u5b9a\u80fd\u627e\u5f97\u5230\uff0c\u6ca1\u4eba\u80fd\u8bb0\u4f4f\u6bcf\u4e2a\u63d0\u4ea4\u54c8\u5e0c\u503c\u4ee5\u53ca\u8fd9\u6b21\u63d0\u4ea4\u90fd\u6539\u4e86\u54ea\u4e9b\u4ee3\u7801\u3002 \u56e0\u6b64\u7ed9\u63d0\u4ea4\u6253\u4e2a\u6807\u7b7e\uff0c\u5c31\u662f\u628a\u54c8\u5e0c\u503c\u8f6c\u6362\u6210\u4eba\u7c7b\u80fd\u7406\u89e3\u7684\u8bed\u8a00\uff0c\u6bd4\u5982 v1.0\uff0c\u5c31\u53ef\u4ee5\u76f4\u63a5\u901a\u8fc7\u6807\u7b7e\u627e\u5230\u5bf9\u5e94\u7684\u63d0\u4ea4\u3002 \u65b0\u5efa\u6807\u7b7e git tag -a <tagname>\n \u56de\u8f66\u4e4b\u540e\uff0cGit \u4f1a\u6253\u5f00\u4f60\u7684\u7f16\u8f91\u5668\uff0c\u8ba9\u4f60\u5199\u4e00\u53e5\u6807\u7b7e\u6ce8\u89e3\uff0c\u5c31\u50cf\u4f60\u7ed9\u63d0\u4ea4\u5199\u6ce8\u89e3\u4e00\u6837\u3002 \u67e5\u770b\u6240\u6709\u6807\u7b7e git tag -l\n# git tag \u4e5f\u884c\n \u5220\u9664\u6807\u7b7e git tag -d <tagname>\n \u63a8\u9001\u6807\u7b7e\u81f3\u8fdc\u7a0b git push \u547d\u4ee4\u5e76\u4e0d\u4f1a\u4f20\u9001\u6807\u7b7e\u5230\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\uff0c\u5fc5\u987b\u663e\u5f0f\u5730\u63a8\u9001\u6807\u7b7e\u3002 git push origin <tagname>\n \u63a8\u9001\u6240\u6709\u4e0d\u5728\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\u7684\u6807\u7b7e git push origin --tag\n \u5220\u9664\u8fdc\u7a0b\u6807\u7b7e git push origin :refs/tag/<tagname>\n \u540e\u671f\u6253\u6807\u7b7e \u5148\u7528 git log --pretty=oneline \u67e5\u8be2\u63d0\u4ea4\u8bb0\u5f55\uff0c\u83b7\u53d6\u6821\u9a8c\u7801\u3002 git tag -a <tagname> 9fceb02(\u6821\u9a8c\u7801)\n \u68c0\u51fa\u6807\u7b7e git checkout <tagname>\n \u6b64\u65f6\uff0c\u4ed3\u5e93\u4f1a\u5904\u4e8e\u201c\u5206\u79bb\u5934\u6307\u9488\uff08detached HEAD\uff09\u201d\u7684\u72b6\u6001\u3002 \u5728\u201c\u5206\u79bb\u5934\u6307\u9488\u201d\u72b6\u6001\u4e0b\uff0c\u5982\u679c\u4f60\u505a\u4e86\u67d0\u4e9b\u66f4\u6539\u7136\u540e\u63d0\u4ea4\u5b83\u4eec\uff0c\u6807\u7b7e\u4e0d\u4f1a\u53d1\u751f\u53d8\u5316\uff0c \u4f46\u4f60\u7684\u65b0\u63d0\u4ea4\u5c06\u4e0d\u5c5e\u4e8e\u4efb\u4f55\u5206\u652f\uff0c\u5e76\u4e14\u5c06\u65e0\u6cd5\u8bbf\u95ee\uff0c\u9664\u975e\u901a\u8fc7\u786e\u5207\u7684\u63d0\u4ea4\u54c8\u5e0c\u624d\u80fd\u8bbf\u95ee\u3002 \u56e0\u6b64\uff0c\u5982\u679c\u4f60\u9700\u8981\u8fdb\u884c\u66f4\u6539\uff0c\u6bd4\u5982\u4f60\u8981\u4fee\u590d\u65e7\u7248\u672c\u4e2d\u7684\u9519\u8bef\uff0c\u90a3\u4e48\u901a\u5e38\u9700\u8981\u521b\u5efa\u4e00\u4e2a\u65b0\u5206\u652f\uff1a git checkout -b <NewBranchName> <tagname>\n \u65b0\u5206\u652f\u4e0a\u53ef\u4ee5\u8fdb\u884c\u63d0\u4ea4\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_12","title":"\u5341\u56db\u3001\u5e38\u89c1\u95ee\u9898","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_10","title":"1. \u63d0\u4ea4\u4ee3\u7801\u65f6\u63d0\u793a\u90ae\u7bb1\u6216\u8005\u540d\u79f0\u4e0d\u5bf9","text":"\u91cd\u65b0\u914d\u7f6e\u90ae\u7bb1\u6216\u8005\u540d\u79f0\uff0c\u7136\u540e\u91cd\u7f6e\u751f\u6548\uff1a git commit --amend --reset-author\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_10","title":"2. \u600e\u4e48\u56de\u6eda\u5230\u4e4b\u524d\u7684\u7248\u672c","text":"(1)\u67e5\u8be2\u5386\u53f2\u63d0\u4ea4\u8bb0\u5f55 git log\n \u627e\u5230\u4f60\u8981\u56de\u6eda\u7684\u7248\u672c\uff0c\u590d\u5236 hash \u503c\u3002 \u6ce8\u610f\uff1a\u662f commit \u7a7a\u683c\u4e4b\u540e\u7684 hash \u503c\uff0c\u4e4b\u524d\u6709\u540c\u5b66\u590d\u5236\u7684 Change-Id: \u8fd9\u6837\u80af\u5b9a\u62a5\u9519\u3002 (2)\u56de\u6eda\u7248\u672c\uff0c\u4e0d\u6e05\u9664\u4ee3\u7801 git reset --soft ${hash}\n (3)\u56de\u6eda\u7248\u672c\uff0c\u6e05\u9664\u4ee3\u7801\uff0c\u614e\u7528\u54c8 git reset --hard ${hash}\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-f-s-e","title":"3. \u6d4b\u8bd5\u62a5\u544a\u91cc\u9762 F S . E \u662f\u4ec0\u4e48\u610f\u601d","text":"F \u8868\u793a\u5931\u8d25\uff0c. \uff08\u70b9\uff09\u8868\u793a\u901a\u8fc7\uff0cS \u8868\u793a\u8df3\u8fc7\uff0cE \u8868\u793a error \u6709\u62a5\u9519"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git-status","title":"4. \u89e3\u51b3 git status \u4e2d\u6587\u663e\u793a\u7684\u95ee\u9898","text":"git config --global core.quotePath false\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5-apps","title":"5. apps \u76ee\u5f55\u4e0b\u989c\u8272\u6709\u4e9b\u662f\u9ec4\u8272\u7684","text":"\u5728 Pycharm \u4e2d apps \u76ee\u5f55\u4e0b\u5e94\u7528\u5e93\u6587\u4ef6\u662f\u9ec4\u8272\u7684\uff0c\u7f16\u8f91\u5668\u8bc6\u522b\u4e0d\u5230\u4ee3\u7801\u65b0\u589e\u548c\u4fee\u6539\uff1b \u7531\u4e8e\u793e\u533a\u7248 Pycharm \u4e0d\u80fd\u52a8\u6001\u8bc6\u522b\u591a\u4ed3\u5e93\uff0c\u9700\u8981\u5728 setting \u91cc\u9762\u624b\u52a8\u6ce8\u518c\uff0c\u64cd\u4f5c\u6b65\u9aa4\uff1a File \u2014> Settings \u2014> Version Control \u2014> \u70b9 + \u53f7 \u2014> Directory \u9009\u4e2d\u5e94\u7528\u5e93\u5de5\u7a0b\u76ee\u5f55 \u2014> VCS \u9009\u4e2d Git \u2014> Apply \u5982\u6b64\u5c31\u53ef\u4ee5\u4e86\u3002 \u4e13\u4e1a\u7248 Pycharm \u4e0d\u5b58\u5728\u8fd9\u4e2a\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#6-envsh-r","title":"6. \u6267\u884c env.sh \u62a5\u9519 $'\\r':\u672a\u627e\u5230\u547d\u4ee4","text":"\u51fa\u73b0\u8fd9\u4e2a\u95ee\u9898\u4f60\u5e94\u8be5\u662f\u5728 windows \u4e0a\u6253\u5f00\u6216\u7f16\u8f91\u8fc7 env.sh \u811a\u672c\uff0cwindows\u4e0b\u7684\u6362\u884c\u662f\u56de\u8f66\u7b26+\u6362\u884c\u7b26\uff0c\u4e5f\u5c31\u662f\\r\\n\uff0c\u800c Linxu \u4e0b\u662f\u6362\u884c\u7b26 \\n\uff0cLinux \u4e0b\u4e0d\u8bc6\u522b \\r\uff0c\u56e0\u6b64\u62a5\u9519\u3002 \u89e3\u51b3\u65b9\u6848\uff1a # \u5c06 \\r \u66ff\u6362\u4e3a\u7a7a\nsudo sed -i 's/\\r//' env.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#7","title":"7.\u600e\u6837\u4e3a\u5355\u72ec\u67d0\u4e00\u6761\u7528\u4f8b\u914d\u7f6e\u6267\u884c\u8d85\u65f6\u65f6\u95f4","text":"\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u5982\u4e0b\uff1a @pytest.mark.timeout(300) # \u5355\u4f4d\u79d2\ndef test_xxx_001():\npass\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#8-youqu","title":"8. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u6240\u6709\u4ee3\u7801\uff0c\u5305\u542b\u5b50\u4ed3\u5e93","text":"\u524d\u7f6e\u6761\u4ef6\uff1a\u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 # \u7b2c\u4e00\u6b21\u5b58\u50a8\u5bc6\u7801\uff0c\u63d0\u4f9b\u540e\u9762\u62c9\u4ee3\u7801(gerrit: ldap\u8d26\u53f7\u548c\u5bc6\u7801\uff0cgit\u62c9\u53d6\u7b2c\u4e00\u6b21\u8f93\u5165\u4fdd\u5b58\uff0c\u540e\u9762\u76f4\u63a5\u4f7f\u7528)\ngit config --global credential.helper store\n\n# \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\uff0c\u5e76\u9012\u5f52\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\" --recursive\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#9-youqu","title":"9. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\u6307\u5b9a\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u524d\u7f6e\u6761\u4ef6\uff1a \u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 \u5df2\u5b58\u50a8\u8bbf\u95ee\u5bc6\u7801 # \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\"\n# \u6307\u5b9a\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ncd youqu\ngit submodule update --init apps/autotest_xxx_xxx\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#10-youqu","title":"10. \u5982\u4f55\u66f4\u65b0 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\uff0c\u6240\u6709\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u66f4\u65b0\u6240\u6709\u5b50\u4ed3\u5e93\u4ee3\u7801 cd youqu\ngit pull & git submodule foreach git pull\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#11-youqu-master-detached-head","title":"11. \u5982\u4f55\u4fee\u590d YouQu \u6240\u6709\u5b50\u4ed3\u5e93 master \u5206\u652f\u6e38\u79bb\u5934\uff08detached head\uff09","text":"\u4fee\u590d\u6240\u6709\u5b50\u4ed3\u5e93\u9ed8\u8ba4master \u5206\u652f\u6e38\u79bb\u5934 cd youqu\ngit submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/","title":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212 \u5206\u7c7b\uff1a/ \u67b6\u6784\u5e08\uff1a/ \u76ee\u6807\uff1a \u5e94\u7528 AT \u67b6\u6784\u5de5\u7a0b\u5316\uff0c\u53c2\u8003\u6027\u80fd\u81ea\u52a8\u5316\u5de5\u7a0b\u5b8c\u6210\u5de5\u7a0b\u5316\u6539\u9020\u3002 \u5e94\u7528\u95f4\u7528\u4f8b\u89e3\u8026\uff0c\u89e3\u9664\u6240\u6709\u4ea4\u53c9\u8c03\u7528\u7684\u65b9\u6cd5\uff0c\u5404\u5e94\u7528\u80fd\u8ddf\u968f\u81ea\u8eab\u8fed\u4ee3\u5468\u671f\u72ec\u7acb\u7ef4\u62a4 AT \u7528\u4f8b\u3002 \u5b8c\u6210\u516c\u5171\u65b9\u6cd5\u7684\u62bd\u53d6\u6574\u5408\uff0c\u5f62\u6210\u4e00\u5957\u72ec\u7acb\u4e8e\u5e94\u7528\u95f4\u7684\u516c\u5171\u65b9\u6cd5\u5e93\uff0c\u5404\u5e94\u7528\u65b9\u6cd5\u91cc\u9762\u4e0d\u5b58\u5728\u88ab\u591a\u4e2a\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\u3002 \u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u4e3a\u5c06\u6765\u9002\u914d\u66f4\u591a\u7684 AT \u8fd0\u7528\u573a\u666f\u63d0\u4f9b\u652f\u6491\uff0c\u539f\u5219\u4e0a\u53ef\u5b9e\u73b0\u65e0\u9650\u6269\u5c55\uff0c\u5728\u6bcf\u65e5\u6784\u5efa\u548c\u6301\u7eed\u96c6\u6210\u6d41\u7a0b\u843d\u5730\u4f7f\u7528\u3002 \u4ee3\u7801\u89c4\u8303\u95ee\u9898\u6e05\u96f6\uff0c\u7b26\u5408 Shell Check\u3001Pylint\u3001\u7cfb\u7edf\u90e8\u76f8\u5173\u7f16\u7801\u89c4\u8303\u8981\u6c42\u3002 \u610f\u4e49\uff1a \u7edf\u4e00\u6210\u7814 AT \u67b6\u6784\u8bbe\u8ba1\u601d\u8def\uff0c\u6d88\u9664 AT \u4ee3\u7801\u5b9e\u73b0\u548c\u7ef4\u62a4\u4e0a\u53ef\u80fd\u51fa\u73b0\u7684\u5206\u6b67\uff0c\u6539\u5584\u5386\u53f2 AT \u65e0\u5de5\u7a0b\u5316\u8bbe\u8ba1\u7684\u7f3a\u9677\uff0c\u63d0\u9ad8\u67b6\u6784\u4e13\u4e1a\u6027\u3002 \u5404\u5e94\u7528 AT \u4ee3\u7801\u76f8\u4e92\u72ec\u7acb\uff0c\u5951\u5408\u5e94\u7528\u72ec\u7acb\u53d1\u5e03\u7279\u6027\uff0c\u53ef\u652f\u6301\u8fed\u4ee3\u671f\u95f4\u72ec\u7acb\u65b0\u589e\u3001\u7ef4\u62a4\u548c\u6267\u884c\u3002 \u65b9\u6cd5\u8c03\u7528\u903b\u8f91\u5f97\u5230\u7b80\u5316\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u66f4\u9ad8\u6548\uff1b\u516c\u5171\u5e93\u62bd\u53d6\uff0c\u51cf\u5c11\u65b9\u6cd5\u91cd\u590d\u7f16\u5199\uff0c\u63d0\u9ad8\u4ee3\u7801\u5229\u7528\u7387\uff1b\u5e73\u5747\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u4ece40\u5206\u949f\u964d\u4f4e\u81f330\u5206\u949f\uff0c\u65e5\u4ea7\u51fa\u7528\u4f8b\u4ece12\u6761/\u5929\u63d0\u5347\u81f316\u6761/\u5929\u3002 \u53ef\u7075\u6d3b\u652f\u6491\u4e0d\u540c\u7684\u81ea\u52a8\u5316\u8fd0\u7528\u573a\u666f\uff0c\u5982 CI\u3001\u5192\u70df\u6d4b\u8bd5\u3001\u96c6\u6210\u6d4b\u8bd5\u3001\u56de\u5f52\u6d4b\u8bd5\u3001\u4e13\u9879\u6d4b\u8bd5\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_2","title":"\u4e00\u3001\u80cc\u666f\u4ecb\u7ecd","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1","title":"1\u3001\u73b0\u6709\u67b6\u6784\u4ecb\u7ecd","text":"\u73b0\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u6574\u4f53\u5206\u4e3a\u4e09\u5c42\uff1a\u7528\u4f8b\u5c42\uff08\u4e1a\u52a1\u903b\u8f91\u5c42\uff09\u3001\u4e2d\u95f4\u5c42\uff08\u5143\u7d20\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff09\u3001\u6838\u5fc3\u5c42\uff08\u5e95\u5c42\u529f\u80fd\u5e93\u5c42\uff09\u3002 \u7528\u4f8b\u5c42\uff1a\u5373\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4e13\u6ce8\u4e8e\u4e1a\u52a1\u529f\u80fd\u903b\u8f91\uff0c\u4e0d\u5173\u5fc3\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\uff1b \u4e2d\u95f4\u5c42\uff1a\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff0c\u6bcf\u4e2a\u65b9\u6cd5\u5747\u5bf9\u5e94\u4e00\u4e2a\u5143\u7d20\u7684\u4e00\u4e2a\u5177\u4f53\u64cd\u4f5c\uff0c\u4e5f\u53ef\u4ee5\u662f\u591a\u4e2a\u64cd\u4f5c\u7684\u7ec4\u5408\u64cd\u4f5c\uff0c\u4e2d\u95f4\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u7528\u4f8b\u5c42\uff0c\u5177\u6709\u53ef\u6269\u5c55\u6027\u548c\u590d\u7528\u6027\uff1b \u6838\u5fc3\u5c42\uff1a\u4e3b\u8981\u5c01\u88c5\u7684\u5e95\u5c42\u529f\u80fd\u5b9e\u73b0\uff0c\u6b64\u5c42\u5728\u6846\u67b6\u4e2d\u63d0\u4f9b\u4e00\u4e9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u529f\u80fd\u6a21\u5757\u76f8\u5bf9\u72ec\u7acb\uff0c\u6838\u5fc3\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u64cd\u4f5c\u5c42\uff0c\u6bd4\u5982\uff1a\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7 UI \u5750\u6807\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u952e\u9f20\u64cd\u4f5c\u7684\u57fa\u7840\u65b9\u64cd\u4f5c\u6a21\u5757\u3001Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757\u3001\u6587\u4ef6\u7684\u589e\u5220\u6539\u67e5\u64cd\u4f5c\u6a21\u5757\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2","title":"2\u3001\u81ea\u52a8\u5316\u7684\u5e94\u7528","text":"2.1\u3001CI \u6d41\u7a0b \u6bcf\u65e5\u6784\u5efa\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u7814\u53d1\u6bcf\u65e5\u63d0\u4ea4\u7684\u4ee3\u7801\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u73ed\u4e4b\u540e\u4f1a\u5c06\u5404\u5e94\u7528\u8fdb\u884c\u6253\u5305\uff0c\u7136\u540e\u5728\u6d4b\u8bd5\u673a\u4e0a\u5b89\u88c5\u66f4\u65b0 deb \u5305\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u5e94\u7528\u63d0\u4ea4\u96c6\u6210\u7684\u7248\u672c\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u8f7d\u6700\u65b0\u7684 ISO \u8fdb\u884c PXE \u90e8\u7f72\uff0c\u7136\u540e\u6d4b\u8bd5\u673a\u5b89\u88c5\u6700\u65b0\u7684\u955c\u50cf\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 2.2\u3001\u9a8c\u6536\u6d4b\u8bd5 \u5728\u5404\u9a8c\u6536\u8282\u70b9\u8fdb\u884c\u81ea\u52a8\u5316\u9a8c\u6536\uff0c\u76ee\u524d\u7684\u7b56\u7565\u662f\u5168\u7528\u4f8b\u8986\u76d6\u5168\u67b6\u6784\u3002 2.3\u3001\u56de\u5f52\u6d4b\u8bd5 \u56de\u5f52\u6d4b\u8bd5\u4eca\u5e74\u89c4\u5212\u5efa\u8bbe\u4e2d\uff0c\u65e8\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u6267\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\uff0c\u51cf\u5c11\u529f\u80fd\u6d4b\u8bd5\u7684\u91cd\u590d\u52b3\u52a8\u529b\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3","title":"3\u3001\u5b58\u5728\u7684\u95ee\u9898","text":" \u5404\u5e94\u7528\u4e4b\u95f4\u5b58\u5728\u8026\u5408 \u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u521d\u671f\uff0c\u6240\u6709\u5e94\u7528\u662f\u6574\u4f53\u53d1\u5e03\uff0c\u6211\u4eec\u662f\u5c06\u6240\u6709\u5e94\u7528\u770b\u6210\u662f\u4e00\u4e2a\u6574\u4f53\uff0c\u5404\u5e94\u7528\u4f5c\u4e3a\u5176\u4e2d\u7684\u4e00\u4e2a\u6a21\u5757\uff0c\u6240\u4ee5\u5b58\u5728\u5e94\u7528\u95f4\u65b9\u6cd5\u4ea4\u53c9\u8c03\u7528\u7684\u95ee\u9898\uff0c\u8fd9\u6837\u4ece\u6700\u521d\u7684\u8bbe\u8ba1\u6765\u8bb2\u786e\u5b9e\u80fd\u591f\u51cf\u5c11\u91cd\u590d\u4ee3\u7801\u7684\u7f16\u5199\u3002\u4f46\u662f\u73b0\u5728\u5e94\u7528\u8d70\u72ec\u7acb\u53d1\u5e03\uff0c\u5404\u5e94\u7528\u90fd\u6709\u81ea\u5df1\u7684\u8fed\u4ee3\u8282\u594f\uff0c\u5728\u65b0\u9700\u6c42\u5feb\u901f\u53d8\u5316\u7684\u8fc7\u7a0b\u4e2d\uff0c\u81ea\u52a8\u5316\u7ef4\u62a4\u53d8\u5f97\u5f02\u5e38\u56f0\u96be\uff0c\u539f\u56e0\u5c31\u662f\u81ea\u52a8\u5316\u9879\u76ee\u91cc\u9762\u5404\u4e2a\u5e94\u7528\u7684\u6709\u6bd4\u8f83\u591a\u7684\u8026\u5408\u5173\u7cfb\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u8fdb\u884c\u89e3\u8026\uff0c\u4ee5\u9002\u5e94\u5e94\u7528\u4e0d\u540c\u7684\u8fed\u4ee3\u5468\u671f\u3002 \u65e0\u6cd5\u7cbe\u51c6\u7684\u5212\u5206\u7528\u4f8b\u8303\u56f4 \u7528\u4f8b\u6267\u884c\u7684\u8303\u56f4\u4e0d\u591f\u7cbe\u51c6\uff0c\u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u4e3b\u8981\u901a\u8fc7\u7528\u4f8b\u7684\u5173\u952e\u8bcd core\uff08\u6838\u5fc3\uff09\u6765\u533a\u5206\u7528\u4f8b\u662f\u5426\u4e3a\u6838\u5fc3\u7528\u4f8b\uff0c\u4f46\u662f\u8fd9\u6837\u7684\u533a\u5206\u592a\u5bbd\u6cdb\u4e86\uff0c\u4e0d\u80fd\u9002\u5e94\u81ea\u52a8\u5316\u6d4b\u8bd5\u5728\u591a\u573a\u666f\u4e0b\u7684\u5e94\u7528\u3002\u5f88\u591a\u573a\u666f\u4e0b\u6211\u4eec\u8fd8\u9700\u8981\u6839\u636e\u7528\u4f8b\u7684\u7b49\u7ea7\u3001\u7528\u4f8b\u7684\u7c7b\u578b\u3001\u7528\u4f8b\u6765\u6e90\u7b49\u7b49\uff0c\u4e0d\u540c\u7684\u7ef4\u5ea6\u6765\u6311\u9009\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u5173\u952e\u5b57\u9700\u8981\u4eba\u5de5\u4e00\u6761\u6761\u7684\u6539\uff0c\u8d39\u65f6\u8d39\u529b\uff0c\u800c\u4e14\u4e0d\u597d\u7ef4\u62a4\u3002 \u53d7\u65b0\u9700\u6c42\u5f71\u54cd\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u597d\u7ef4\u62a4 \u76ee\u524d\u9700\u8981\u8df3\u8fc7\u7684\u7528\u4f8b\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684\u7528\u4f8b\u811a\u672c\u91cc\u9762\uff0c\u6dfb\u52a0\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\uff0c\u540e\u7eed\u89e3\u9664\u8df3\u8fc7\u7684\u65f6\u5019\u53c8\u9700\u8981\u627e\u5230\u8fd9\u6761\u811a\u672c\uff0c\u5220\u6389\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\u3002\u5728\u8df3\u8fc7\u7528\u4f8b\u8f83\u591a\u7684\u60c5\u51b5\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u96be\u5ea6\u3002 \u7f16\u5199\u7528\u4f8b\u65f6\u903b\u8f91\u6bd4\u8f83\u590d\u6742\uff0c\u9700\u8981\u8c03\u7528\u591a\u4e2a\u5e94\u7528\u7684\u65b9\u6cd5\u6a21\u5757\u3002 \u6846\u67b6\u6269\u5c55\u6027\u4e0d\u8db3\uff0c\u65e0\u6cd5\u6574\u5408\u6027\u80fd\u81ea\u52a8\u5316\u3001\u538b\u6d4b\u81ea\u52a8\u5316\u3001\u5b89\u5168\u81ea\u52a8\u5316\u7b49\u4e13\u9879\u6d4b\u8bd5\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_3","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u4e3a\u89e3\u51b3\u73b0\u6709\u95ee\u9898\uff0c\u9002\u5e94\u4e0d\u65ad\u4e30\u5bcc\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u66f4\u597d\u7684\u53d1\u6325\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4f5c\u7528\uff0c\u9700\u8981\u5bf9\u81ea\u52a8\u5316\u67b6\u6784\u53ca\u5404\u529f\u80fd\u6a21\u5757\u8fdb\u884c\u91cd\u65b0\u8bbe\u8ba1\u89c4\u5212\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_1","title":"1\u3001\u67b6\u6784\u8bbe\u8ba1","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_1","title":"2\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u6846\u67b6\u7684\u8fd0\u884c\u903b\u8f91\uff1a\u901a\u8fc7\u6838\u5fc3\u5c42\u63d0\u4f9b\u4e00\u4e2a\u57fa\u7840\u80fd\u529b\uff0c\u4e1a\u52a1\u5c42\u6839\u636e\u5b9e\u9645\u4e1a\u52a1\u9700\u6c42\uff08\u6d4b\u8bd5\u7528\u4f8b\uff09\u52a8\u6001\u52a0\u8f7d\u6838\u5fc3\u5c42\uff0c\u6267\u884c\u5165\u53e3\u52a0\u8f7d\u76f8\u5e94\u7684\u7528\u4f8b\u96c6\u5e76\u63a7\u5236\u6267\u884c\uff0c\u5e94\u7528\u5c42\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u9700\u6c42\uff0c\u901a\u8fc7\u76f8\u5e94\u7684\u914d\u7f6e\u9879\u8fdb\u884c\u914d\u7f6e\uff0c\u4ece\u800c\u89e6\u53d1\u81ea\u52a8\u5316\u6d4b\u8bd5\u4efb\u52a1\u3002 \u6838\u5fc3\u5c42\uff1a\u57fa\u672c\u4fdd\u6301\u4e0d\u53d8\uff0c\u90e8\u5206\u6a21\u5757\u4f1a\u6d89\u53ca\u5230\u65b0\u529f\u80fd\u5f00\u53d1\uff0c\u6838\u5fc3\u5c42\u5404\u529f\u80fd\u6a21\u5757\u4fdd\u6301\u72ec\u7acb\u6027\uff0c\u63d0\u4f9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u4f9b\u4e0a\u5c42\u8c03\u7528\uff1b \u5e95\u5c42\u6838\u5fc3\u6a21\u5757\u5305\u62ec\uff1a \u56fe\u50cf\u8bc6\u522b\u6a21\u5757 UI \u5b9a\u4f4d\u6a21\u5757 Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757 \u5c5e\u6027\u5b9a\u4f4d\u6a21\u5757 \u65e5\u5fd7\u6a21\u5757 \u952e\u9f20\u64cd\u4f5c\u6a21\u5757 \u6587\u4ef6\u64cd\u4f5c\u6a21\u5757 \u5f55\u5c4f\u6a21\u5757 \u81ea\u5b9a\u4e49\u65ad\u8a00\u6a21\u5757 \u7528\u4f8b\u6267\u884c\u6a21\u5757 PXE \u88c5\u673a\u6a21\u5757 \u952e\u9f20\u4fe1\u53f7\u6a21\u62df\u6a21\u5757 OCR \u6a21\u5757 \u4e1a\u52a1\u5c42\uff1a\u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e94\u7528\u5185\u5305\u542b\u591a\u4e2a\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5982\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7b49\uff0c\u540e\u7eed\u53ef\u4ee5\u6839\u636e\u9700\u8981\u5ac1\u63a5\u8fdb\u6765\u3002\u5176\u4e2d\u529f\u80fd\u6d4b\u8bd5\u8bbe\u8ba1\u601d\u8def\uff1a \u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e76\u5c06\u6d4b\u8bd5\u6570\u636e\u548c\u6d4b\u8bd5\u8d44\u6e90\u6574\u5408\u8fdb\u6765\uff0c\u589e\u52a0\u7528\u4f8b\u6807\u7b7e csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ed9\u6bcf\u6761\u7528\u4f8b\u6253\u6807\u7b7e\u3002 \u5404\u6807\u7b7e\u6240\u4f7f\u7528\u5bf9\u5e94\u7684\u5b57\u6bb5\u540d\u79f0\uff0c\u4f7f\u7528 csv \u6587\u4ef6\u7ef4\u62a4\u7528\u4f8b\u4e0e\u6807\u7b7e\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u5bf9\u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u53ef\u4ee5\u7ec4\u5408\u5176\u4e2d\u7684\u6807\u7b7e\u800c\u4ece\u9a71\u52a8\u5bf9\u5e94\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\uff0c\u517c\u5bb9\u73b0\u6709\u7528\u4f8b\u6807\u7b7e\uff0c\u4e14\u652f\u6301\u7528\u4f8b\u6807\u7b7e\u53ef\u6269\u5c55\uff1b \u4f7f\u7528 csv \u683c\u5f0f\u6587\u4ef6\u53ef\u4ee5\u65b9\u4fbf\u7684\u4f7f\u7528 Excel \u8868\u683c\u6253\u5f00\u8fdb\u884c\u7f16\u8f91\uff0c\u540c\u65f6\u7531\u4e8e csv \u6587\u4ef6\u5b9e\u9645\u662f\u4ee5\u90fd\u597d\u5206\u9694\u7684\u6587\u672c\u6587\u4ef6\uff0c\u4ee3\u7801\u4e2d\u53ef\u4ee5\u5728\u4e0d\u4f9d\u8d56\u4e09\u65b9\u5e93\u7684\u60c5\u51b5\u4e0b\u65b9\u4fbf\u5feb\u901f\u7684\u89e3\u6790\u5b83\uff0c\u53ef\u64cd\u4f5c\u6027\u548c\u53ef\u7ef4\u62a4\u6027\u8f83\u9ad8\u3002 \u5404\u4e2a\u5e94\u7528\u4e4b\u95f4\uff0c\u7528\u4f8b\u3001\u65b9\u6cd5\u3001\u6807\u7b7e\u548c\u8d44\u6e90\u90fd\u662f\u76f8\u4e92\u72ec\u7acb\u7684\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u7528\u4f8b\u65f6\u53ea\u9700\u8981\u81ea\u5df1\u5e94\u7528\u4e0b\u7684\u65b9\u6cd5\u548c\u516c\u5171\u5e93\u5373\u53ef\u3002 \u7ed3\u6784\u4e3e\u4f8b\uff1a .\n\u251c\u2500\u2500 apps\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_album # \u5e94\u7528\u540d (\u7528\u4e0b\u5212\u7ebf\u8fde\u63a5\u662f Python \u7f16\u7801\u89c4\u8303)\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_assert # \u65ad\u8a00\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_function_tag.csv # \u7528\u4f8b\u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 asan_cases # \u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases # \u529f\u80fd\u6d4b\u8bd5\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 res # \u6d4b\u8bd5\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config # \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_widget # \u5e94\u7528\u81ea\u5df1\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_widget # \u65b9\u6cd5\u57fa\u7c7b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 other_widget # \u8c03\u7528\u5176\u4ed6\u5e94\u7528\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_camera\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases\n\u2502\u00a0\u00a0 \u2502\u00a0 ...\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 public_widget # \u516c\u5171\u65b9\u6cd5\u5e93\n\u251c\u2500\u2500 config # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n...\n config \u914d\u7f6e\u6a21\u5757\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u76f8\u5e94\u914d\u7f6e\uff0c\u6d4b\u8bd5\u540c\u5b66\u53ef\u4ee5\u6839\u636e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5728 config \u91cc\u9762\u8fdb\u884c\u914d\u7f6e\u3002 \u5168\u5c40\u914d\u7f6e\uff1a \u6267\u884c\u4e00\u4e2a\u6216\u591a\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff1a\u5728 pattern \u91cc\u9762\u5199\u5165\u5e94\u7528\u5305\u540d\uff0c\u591a\u4e2a\u5e94\u7528\u4e4b\u95f4\u7528 or \u8fde\u63a5\uff0c\u5982 deepin-music or deepin-movie\uff1b \u5192\u70df\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a smoke\uff1b \u96c6\u6210\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a core \uff1b \u5168\u91cf\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u4e3a\u7a7a\u5373\u53ef\uff1b \u901a\u8fc7 tags \u7684\u914d\u7f6e\u6bd4\u8f83\u7075\u6d3b\uff0c\u540e\u9762\u6807\u7b7e\u5316\u7ba1\u7406\u7ae0\u8282\u4f1a\u8bb2\u5230\uff0c\u652f\u6301\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u7075\u6d3b\u914d\u7f6e\u3002 \u6307\u5b9a\u67d0\u53f0\u673a\u5668\u5728\u6307\u5b9a\u955c\u50cf\u7248\u672c\u4e0a\u6267\u884c\u7528\u4f8b\uff1a\u5728 IP \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a IP\uff0c\u5e76\u5728 URL \u91cc\u9762\u586b\u5165\u955c\u50cf\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u6846\u67b6\u4f1a\u8c03\u7528 PXE \u8fdb\u884c\u81ea\u52a8\u88c5\u673a\uff0c\u88c5\u673a\u5b8c\u4e4b\u540e\u81ea\u52a8\u5f00\u59cb\u6267\u884c\u914d\u7f6e\u7684\u6d4b\u8bd5\u7528\u4f8b\u3002 \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\uff1a \u6bcf\u4e2a\u5e94\u7528\u5185\u90e8\u4f1a\u6709\u4e00\u4e2a\u5355\u72ec\u7684\u914d\u7f6e\u6a21\u5757\uff0c\u4f1a\u5305\u542b\u4e00\u4e9b\u672c\u5e94\u7528\u7684\u6d4b\u8bd5\u8d44\u6e90\u7684\u8def\u5f84\u3001\u6267\u884c\u7528\u4f8b\u7684\u6807\u7b7e\u914d\u7f6e\u7b49\u7b49\uff0c\u5982\u679c\u5728\u5c40\u90e8\u914d\u7f6e\u91cc\u9762\u914d\u7f6e\u4e86\u7528\u4f8b\u6267\u884c\u6807\u7b7e\uff0c\u800c\u5916\u5c42 runner \u51fa\u6ca1\u6709\u6307\u5b9a\u6267\u884c\u6807\u7b7e\uff0c\u5219\u5728\u6267\u884c\u65f6\u53ea\u4f1a\u6267\u884c\u5c40\u90e8\u914d\u7f6e\u5df2\u914d\u7f6e\u7684\uff0c\u82e5\u5916\u5c42 runner \u4e5f\u914d\u7f6e\u4e86\u6267\u884c\u6807\u7b7e\uff0c\u5219\u4f1a\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u7528\u4f8b\u3002 \u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u914d\u7f6e\u90fd\u5728\u540c\u4e00\u4e2a\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\uff0cpy \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684\u7c7b\uff0cini \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684 option\u3002 \u5168\u5c40\u914d\u7f6e\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u7b56\u7565\u5982\u4e0b\uff1a \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5c40\u90e8\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5e94\u7528\u5c42\uff1arunner \u662f\u6d4b\u8bd5\u6267\u884c\u7684\u5165\u53e3\uff0c\u5b83\u4f1a\u6839\u636e\u914d\u7f6e\u91cc\u9762\u7684\u914d\u7f6e\u9879\uff0c\u8fdb\u884c\u7528\u4f8b\u7684\u52a0\u8f7d\u548c\u6267\u884c\u3002\u5b83\u63d0\u4f9b\u63a5\u53e3\u7ed9\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\uff0c\u5e73\u53f0\u4e0a\u7684\u6307\u4ee4\u5b9e\u9645\u4e0a\u90fd\u662f\u901a\u8fc7\u4e0b\u53d1\u7ed9 runner\uff0c\u7136\u540e\u7531 runner \u6765\u6267\u884c\u76f8\u5e94\u7684\u6d4b\u8bd5\u3002 \u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u662f\u4e00\u4e2a\u524d\u7aef\u7cfb\u7edf\uff0c\u53ef\u4ee5\u8fdb\u884c\u6d4b\u8bd5\u673a\u7ba1\u7406\u3001\u81ea\u52a8\u5b89\u88c5\u955c\u50cf\u3001\u81ea\u52a8\u5b89\u88c5\u6307\u5b9a\u5e94\u7528\u7248\u672c\u3001\u8fdb\u884c\u6d4b\u8bd5\u7528\u4f8b\u8303\u56f4\u9009\u62e9\u3001\u7528\u4f8b\u89e6\u53d1\u6267\u884c\u63a7\u5236\u3001\u7ed3\u679c\u5c55\u793a\u8f93\u51fa\u7b49\u3002 \u4e00\u4e2a\u5e94\u7528\u7684\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\u90fd\u53ef\u4ee5\u5355\u72ec\u89e6\u53d1\u3002 \u517c\u5bb9\u6027\u6d4b\u8bd5\u4e3b\u8981\u901a\u8fc7 PXE \u670d\u52a1\u5668\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u88c5\u673a\uff0c\u7136\u540e\u914d\u5408 AT \u8fdb\u884c\u6d4b\u8bd5\uff0c\u53ef\u4ee5\u5b9e\u73b0\u4e0d\u540c\u7cfb\u7edf\u7248\u672c\u3001\u4e0d\u540c\u5e94\u7528\u7248\u672c\u73af\u5883\u4e0a\u90fd\u53ef\u4ee5\u8fdb\u884c\u81ea\u52a8\u5316\u7684 AT \u6267\u884c\uff0c\u63d0\u9ad8\u517c\u5bb9\u6027\u6d4b\u8bd5\u6548\u7387\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_4","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_2","title":"1\u3001\u7528\u4f8b\u89e3\u8026","text":"\u5b58\u5728\u8026\u5408\u5173\u7cfb\u7684\u65b9\u6cd5\uff1a\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u88ab\u5916\u90e8\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\uff0c\u5219\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u8026\u5408\u5173\u7cfb\u3002 1.1\u3001\u901a\u8fc7\u7f16\u8f91\u5668 Find Usages \u67e5\u770b\u6bcf\u4e2a\u65b9\u6cd5\u88ab\u8c03\u7528\u7684\u8def\u5f84\u548c\u88ab\u8c03\u7528\u6b21\u6570\uff1b 1.2\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 1 \u4e2a\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728\u5916\u90e8\u5e94\u7528\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1b 1.3\u3001\u64cd\u4f5c\u5c42\u6587\u4ef6\u540d\u5747\u4ee5 widget \u7ed3\u5c3e\uff0c\u7c7b\u540d\u4ee5 Widget \u7ed3\u5c3e\uff0c\u5982\uff1a\u6587\u4ef6\u540d music_widget.py \uff1a class MusicWidget:\n\"\"\"\u97f3\u4e50\u7684\u64cd\u4f5c\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_2","title":"2\u3001\u516c\u5171\u5e93\u5efa\u8bbe","text":"2.1\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 2 \u4e2a\u53ca\u4ee5\u4e0a\u7684\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728 public_widget \u76ee\u5f55\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1bpublic_widget \u5373\u4e3a\u516c\u5171\u65b9\u6cd5\u5e93\uff1b 2.2\u3001\u5728\u7528\u4f8b\u5c42\u4fee\u6539\u7528\u4f8b\u4e2d\u7c7b\u7684\u5bfc\u5165\u8def\u5f84\uff0c\u5c5e\u4e8e\u516c\u5171\u65b9\u6cd5\u7684\u5219\u8c03\u7528 public_widget \u4e2d\u7684\u7c7b\uff0c\u5916\u90e8\u5e94\u7528\u7684\u64cd\u4f5c\u65b9\u6cd5\uff0c\u5219\u8c03\u7528\u672c\u5e94\u7528\u76ee\u5f55\u4e0b\u91cd\u5199\u7684\u5916\u90e8\u5e94\u7528\u65b9\u6cd5\u3002 \u6bd4\u5982\uff1a\u51e0\u4e4e\u6240\u6709\u591a\u5a92\u4f53\u5e94\u7528\u90fd\u9700\u8981\u901a\u8fc7\u6587\u7ba1\u52a0\u8f7d\u8d44\u6e90\uff0c\u8c03\u8d77\u7684\u6587\u7ba1\u5bf9\u8bdd\u6846\u5b9e\u9645\u4e3a dde-desktop\uff0c\u56e0\u6b64\u5c06 desktop_widget.py \u653e\u5230 public_widget \u91cc\u9762\uff1a class DdeDesktopPublicWidget:\n\"\"\"\u516c\u5171-\u684c\u9762\u7684\u64cd\u4f5c\u65b9\u6cd5\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3_1","title":"3\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406","text":"3.1\u3001\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1a\u5bf9\u5e94 core\u3001smoke\uff0c\u6216\u4e3a\u7a7a\uff1b \u7528\u4f8b\u6765\u6e90\uff1a\u5bf9\u5e94 PMS \u7528\u4f8b\u6765\u6e90\uff0c\u5206\u522b\u7528 acp1\u3001acp2\u3001acp3\u3001acp4 \u8868\u793a\u3002 acp1 \uff1a\u4e1a\u52a1\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5199\u7684\u7528\u4f8b\uff0c\u88ab\u7528\u4e8e\u9a8c\u6536\u6d4b\u8bd5\u7684\uff1b acp2 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5f15\u5165\u7684\u4ea7\u54c1\u9a8c\u6536\u6d4b\u8bc4\u90e8\u7684\u7528\u4f8b\uff1b acp3 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u6839\u636e\u4ea7\u54c1\u9700\u6c42\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\uff1b acp4 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u901a\u8fc7\u793e\u533a\u3001\u8bba\u575b\u7528\u6237\u53cd\u9988\u95ee\u9898\u603b\u7ed3\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\u3002 \u4e3e\u4f8b\uff1a \u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u7528\u4f8b\u6765\u6e90 001 L1 core acp1 \u6807\u7b7e\u91c7\u7528\u679a\u4e3e\u7684\u65b9\u5f0f\u8fdb\u884c\u4ee3\u53f7\u7ba1\u7406\u65b9\u4fbf\u7ba1\u7406\u4ee5\u53ca\u540e\u7eed\u6269\u5c55\u3002 3.2\u3001\u5728\u6bcf\u4e2a\u5e94\u7528\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u7b2c\u4e00\u5217\u4e3a\u7528\u4f8b\u7684 ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ba1\u7406\u6a21\u5757\u5185\u7684\u7528\u4f8b\u6807\u7b7e\u3002\u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 3.3\u3001\u5bf9\u7167 PMS \u4e0a\u7528\u4f8b\u7b49\u7ea7\u3001\u7528\u4f8b\u7c7b\u578b\u548c\u7528\u4f8b\u6765\u6e90\uff0c\u6807\u8bb0\u6240\u6709\u5df2\u5b9e\u73b0\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u540e\u7eed\u7f16\u5199\u65b0\u589e\u81ea\u52a8\u5316\u7528\u4f8b\u65f6\uff0c\u6bcf\u5199\u4e00\u6761\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684 csv \u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u6b64\u6761\u7528\u4f8b\u7684\u6807\u7b7e\u3002 3.4\u3001\u8df3\u8fc7\u7528\u4f8b\u6807\u7b7e\u5316 \u73b0\u6709\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a\uff1a \u4e3e\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u8bb0\u4e3a \u201cskip-\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u8bb0\uff0c\u5982\u679c\u5df2\u7ecf\u6807\u8bb0\u4e86\u8df3\u8fc7\u539f\u56e0\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u8bb0\u4e3a SKIPED\uff0c\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\u3002 \u6240\u6709\u7684\u6807\u7b7e\u5728 docs \u76ee\u5f55\u4e0b\u4f1a\u6709\u4e00\u4e2a\u6587\u6863\uff0c\u6587\u6863\u6682\u5b9a\u540d\u79f0\u4e3a\uff1atags_info.md\uff0c\u7528\u4e8e\u8bf4\u660e\u73b0\u5728\u5df2\u7ecf\u4f7f\u7528\u5230\u7684\u6807\u7b7e\uff0c\u4ee5\u53ca\u8fd9\u4e9b\u6807\u7b7e\u7684\u89e3\u91ca\u548c\u7528\u6cd5\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#4","title":"4\u3001\u7528\u4f8b\u6267\u884c","text":"4.1\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u7684\u9a71\u52a8\u6267\u884c\u903b\u8f91\u529f\u80fd\u5b9e\u73b0 \u5f00\u53d1\u6839\u636e\u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\u91cc\u9762\u7684\u7528\u4f8b\u6807\u7b7e\u6267\u884c\u5bf9\u5e94\u7528\u4f8b\u7684\u529f\u80fd\uff0c\u80fd\u652f\u6301\u591a\u4e2a\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u6267\u884c\u5165\u53e3\u80fd\u968f\u610f\u901a\u8fc7\u7528\u4f8b\u6807\u7b7e\u6307\u5b9a\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002 \u7528\u4f8b\u6807\u7b7e\u7684\u9a71\u52a8\u65b9\u5f0f\u5fc5\u987b\u80fd\u652f\u6301\u6807\u7b7e\u7684\u6269\u5c55\uff0c\u672a\u6765\u968f\u7740\u4e1a\u52a1\u7684\u53d8\u5316\u53ef\u80fd\u9700\u8981\u589e\u52a0\u5404\u79cd\u5404\u6837\u7684\u6807\u7b7e\u3002 4.2\u3001\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u6267\u884c \u529f\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u3001\u6027\u80fd\u6d4b\u8bd5\u7b49\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u662f\u5206\u5f00\u6267\u884c\u7684\uff0c\u4e5f\u5c31\u662f\u5728\u4e00\u6b21\u6267\u884c\u4e2d\uff0c\u53ea\u80fd\u6267\u884c\u5176\u4e2d\u4e00\u79cd\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5177\u4f53\u8981\u6267\u884c\u54ea\u4e00\u79cd\u540c\u6837\u901a\u8fc7\u53c2\u6570\u6765\u63a7\u5236\u3002 4.3\u3001\u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c \u7531\u4e8e\u6d4b\u8bd5\u673a\u8d44\u6e90\u6709\u9650\uff0c\u968f\u7740\u81ea\u52a8\u5316\u7528\u4f8b\u6570\u91cf\u7684\u589e\u52a0\uff0cCI \u6267\u884c\u65f6\u95f4\u4f1a\u8d8a\u6765\u8d8a\u957f\u3002 \u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c\u7684\u529f\u80fd\uff1a \u540c\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\u5206\u6563\u5230\u4e0d\u540c\u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u4e0a\u6267\u884c\uff0c\u7f29\u77ed\u6267\u884c\u603b\u65f6\u95f4\uff1b \u7b2c\u4e8c\u5929\u8dd1\u7684\u65f6\u5019\u540c\u4e00\u4e2a\u673a\u5668\u4e0a\u4f1a\u6267\u884c\u6628\u5929\u6ca1\u6709\u6267\u884c\u5230\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u6267\u884c\u540c\u7406\uff1b \u53ef\u4ee5\u5b9e\u73b0\u5728\u5168\u67b6\u6784\u6d4b\u8bd5\u673a\u4e0a\u8f6e\u6d41\u6267\u884c\u7528\u4f8b\uff0c\u65e2\u80fd\u4fdd\u8bc1\u6267\u884c\u4e86\u6240\u6709\u7684\u7528\u4f8b\uff0c\u53c8\u80fd\u5728\u8d44\u6e90\u6709\u9650\u7684\u60c5\u51b5\u4e0b\u8986\u76d6\u4e86\u6240\u6709\u7684\u67b6\u6784\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#5","title":"5\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0","text":"5.1\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u4f5c\u4e3a\u524d\u7aef\u754c\u9762\u7cfb\u7edf\uff0c\u901a\u8fc7\u9875\u9762\u4e0a\u7684\u4e00\u4e9b\u529f\u80fd\u9009\u9879\u8fdb\u884c\u5bf9\u5e94\u6d4b\u8bd5\u4efb\u52a1\u7684\u7ba1\u7406\u6216\u89e6\u53d1\uff0c\u4e1a\u5185\u6bd4\u8f83\u6d41\u884c\u7684\u5b9e\u73b0\u65b9\u6848\u662f\u4f7f\u7528 Vue + DRF \u5b9e\u73b0\u4e00\u4e2a\u524d\u540e\u7aef\u5206\u79bb\u7684\u7cfb\u7edf\u3002 \u6d4b\u8bd5\u5e73\u53f0\u53ef\u80fd\u4f1a\u6d89\u53ca\u5230\u7684\u6a21\u5757\u6709\uff1a\u6d4b\u8bd5\u673a\u8d44\u6e90\u7ba1\u7406\u6a21\u5757\u3001\u7528\u4f8b\u6267\u884c\u63a7\u5236\u6a21\u5757\u3001\u7ed3\u679c\u5c55\u793a\u6a21\u5757\u3001PXE \u955c\u50cf\u5b89\u88c5\u6a21\u5757\u7b49\u3002 \u7528\u6237\uff08\u6d4b\u8bd5\u3001\u7814\u53d1\u540c\u5b66\u7b49\uff09\u53ef\u4ee5\u914d\u7f6e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5982\u6267\u884c\u54ea\u4e2a\u5e94\u7528\u3001\u6267\u884c\u7528\u4f8b\u7684\u8303\u56f4\u3001\u5728\u54ea\u53f0\u673a\u5668\u4e0a\u6267\u884c\u3001\u955c\u50cf\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u5e94\u7528\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u6267\u884c\u65f6\u95f4\u3002 5.2\u3001\u6267\u884c\u5165\u53e3 runner \u63d0\u4f9b\u7ed9\u6d4b\u8bd5\u5e73\u53f0\u7684\u63a5\u53e3\u5305\u62ec\uff1a\u7528\u4f8b\u6267\u884c\u63a5\u53e3\u3001\u7ed3\u679c\u8fd4\u56de\u63a5\u53e3\u3001\u955c\u50cf\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u955c\u50cf\u5b89\u88c5\u63a5\u53e3\u3001\u5e94\u7528\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u5e94\u7528\u5b89\u88c5\u66f4\u65b0\u63a5\u53e3\u7b49\u3002 \u524d\u7aef\u5e73\u53f0\u76ee\u524d\u8fd8\u6ca1\u6709\u592a\u591a\u8be6\u7ec6\u7684\u65b9\u6848\uff0c\u672c\u6b21\u8bbe\u8ba1\u4e3b\u8981\u96c6\u4e2d\u5728\u540e\u7aef\u8fd9\u90e8\u5206\u67b6\u6784\u7684\u8bbe\u8ba1\u4e0a\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_5","title":"\u56db\u3001\u5b9e\u65bd\u8ba1\u5212","text":"\u8fd1\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u6587\u7ba1\u4ee3\u7801\u89e3\u8026 2022/3/28 2022/4/8 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u56fe\u5f62\u56fe\u50cf\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u97f3\u89c6\u9891\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5168\u5c40\u641c\u7d22\u4ee3\u7801\u89e3\u8026 2022/4/25 2022/4/26 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u516c\u5171\u5e93\u5efa\u8bbe 2022/4/27 2022/5/5 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5c01\u88c5\u7684\u65b9\u6cd5\u6574\u7406\u6210\u4e00\u4e2a\u8868 2022/5/6 2022/5/10 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7528\u4f8b\u6807\u7b7e\u5206\u7c7b\u8bc4\u4f30 2022/5/11 2022/5/11 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u6807\u7b7e\u5316\u6267\u884c\u9a71\u52a8\u7a0b\u5e8f\u7f16\u5199 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u9700\u5b9e\u73b0\u81ea\u52a8\u89e3\u6790 csv \u8868\u683c\u4e2d\u7684\u7528\u4f8b\u7f16\u53f7 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u722c\u866b\u811a\u672c\uff0c\u722c\u53d6 pms \u4e0a\u7528\u4f8b\u7684\u6807\u7b7e 2022/5/11 2022/5/13 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u5b9a\u65f6\u81ea\u52a8\u7ef4\u62a4\u672c\u5730 csv \u6587\u4ef6\u811a\u672c 2022/5/11 2022/5/20 \u4e2d\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u76ee\u5f55\u7ed3\u6784\u8c03\u6574 2022/5/20 2022/6/2 \u5b8c\u6210\u5168\u5c40\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u5177\u4f53\u65b9\u6848\u548c\u903b\u8f91\u5b9e\u73b0 2022/6/6 2022/6/17 \u9759\u6001\u626b\u63cf\u95ee\u9898\u6e05\u96f6 2022/6/20 2022/7/1 \u5b8c\u6210\u65b0\u6846\u67b6\u4f7f\u7528\u57f9\u8bad 2022/7/4 2022/7/11 \u843d\u5730\u8fd0\u884c 2022/7/12 2022/7/20 \u5e95\u5c42\u5e93\u7528\u9014\u8bf4\u660e\u6587\u6863\u7f16\u5199 2022/7/21 2022/7/28"}]} \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz index 8ffaebc1..e0b7bbfc 100644 Binary files a/sitemap.xml.gz and b/sitemap.xml.gz differ diff --git "a/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" "b/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" index 25f669d5..97100667 100644 --- "a/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" +++ "b/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs @@ -1215,8 +1215,7 @@ 智能化功能测试# Attribution :chengdu Test Team # Date :2021/08/20 -此方案仍在演进中 -此方案仍在演进中 +此方案仍在演进中 仓库地址:https://gitlabcd.uniontech.com/autotest/cd-desktop-aitest 一、方案概述¶ 基于深度学习智能识别应用的元素控件,用于在自动化测试操作过程中的元素定位以及判断结果时的断言处理;自动化测试过程中,测试机上的画面通过采集盒传输到服务器上,服务器对视频画面进行智能识别后,服务器智能判断用例是否执行成功,然后对测试机下发下一步操作指令,测试机接受并执行下一步操作。 diff --git "a/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" "b/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" index cdf9ccde..06c9e9a5 100644 --- "a/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" +++ "b/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" @@ -95,7 +95,7 @@ - + @@ -226,7 +226,7 @@ - + YouQu Docs diff --git "a/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" "b/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" index 121b4507..72123668 100644 --- "a/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" +++ "b/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs @@ -752,6 +752,13 @@ + + + + + 4、虚拟化部署 + + @@ -1661,6 +1668,13 @@ + + + + + 4、虚拟化部署 + + @@ -2604,18 +2618,12 @@ 1、标签说明流水线使用指导; 跳过原因:skip-XXX,用于控制用例是否执行; 确认修复:fixed-XXX,用于标记用例的修复状态(后面详细讲解用法); @@ -2629,26 +2637,30 @@ 1、标签说明PMS用例ID 用例级别 用例类型 +设备类型 +用例来源 上线对象 测试级别 跳过原因 确认修复 -废弃用例 -... +废弃用例 +... -001 +679537 679537 L1 FUNC +PPL + CICD C1 skip-XXX fixed-XXX -removed-已废弃 -... +removed-已废弃 +... @@ -2656,7 +2668,7 @@ 2、操作步骤csv 的文件名。 例如: -相册的用例文件为 test_album_xxx.py,xxx 表示任意三位数字代表用例序号,此时 csv 文件名就应为 album.csv; +相册的用例文件为 test_album_xxx.py,xxx 表示用例的ID(也可以是自定义的数字代表用例序号),此时 csv 文件名就应为 album.csv; 对于用例规模比较大的应用,比如文件管理器,建议分模块,每个模块建立一个 csv 文件,所有 csv 文件建议放在一个 tags 目录下。 是否分模块维护 csv 取决于应用的用例复杂度,同时我们应该充分考虑后期的可维护性,csv 文件太多了也是一个很糟糕的事情。 @@ -2677,7 +2689,7 @@ 3.1.1、固定跳过001 +679537 ... skip-受到某新需求影响 @@ -2742,7 +2754,7 @@ 3.2、确认修复001 +679537 ... skip-受到某新需求影响 fixed-已修复 @@ -2787,7 +2799,7 @@ 3.3、废弃用例4、设计思路¶ 上面介绍 Pytest 框架提供的标签功能 mark,使用时需要为每一个用例添加标签装饰器,则操作复杂,可维护性差,其根本问题就是标签分散在每一条用例的装饰器上,难以集中维护;于是乎将所有标签使用 csv 文件进行集中管理,并通过 Pytest 的钩子函数,读取 csv 文件,动态添加标签到用中。 5、CSV文件格式¶ -此配置文件需要维护大量的标签数据,且要方便能使用Excel打开进行编辑查看,更重要的是我们不想引入三方依赖,CSV 文件几乎是唯一能满足所有的要求的文件格式。 +此配置文件需要维护大量的标签数据,且要方便能使用 Excel 打开进行编辑查看,更重要的是我们不想引入三方依赖,CSV 文件几乎是唯一能满足所有的要求的文件格式。 七、日志系统¶ 1、背景¶ 基于 YouQu 自动化测试框架操作方法封装写法,通常是这样的:类里面一个函数只包含一个操作或多次调用的一系列可合并的操作; @@ -2888,7 +2900,7 @@ 1、原则 大文件不能上传到工程里面,保持整个工程的轻量化,这样在克隆代码的时候才能非常快速方便使用,我们见过一个 AT 工程 clone 大小达到好几个 G,简直不可思议。 其实代码文件的大小是很小的,也就是说,纯写代码随便写工程也不会太大,而文档(包含插图)等资源却是很占空间。 -因此我们选择将 YouQu 的文档工程单独迁出到独立的仓库 youqu-docs 。 +因此我们选择将 YouQu 的文档工程涉及到的图片资源都采用外链加载; 2、安装¶ 项目根目录下运行 env.sh 即可。 bash env.sh @@ -2930,17 +2942,25 @@ 3.2、裁剪依赖bash env_dev.sh +4、虚拟化部署¶ +YouQu默认采用虚拟化部分,虚拟化环境实际安装的位置是在 $HOME/.local/share/virtualenvs/youqu-oHTM7l7G 目录下 +youqu-oHTM7l7G 此目录名称前面部分是你的代码根目录的名称,后面部分是生成的随机字符串; +同学们在远程机器上定位问题的时候,如果使用 Pycharm 调试,就将解释器指定到这个目录的就行了; +当然,我们也提供了本机开发环境部署: +bash env_dev.sh + +如果你是本地开发环境可以用它,区别就是驱动执行的时候使用:python3 manage.py xxx 九、失败录屏¶ 录屏其实是一种视频形式的日志,因为很多时候我们在查看日志之后仍然无法准确的定位到用例失败的具体原因,因此用例的录屏能让我们看到用例在执行过程; 【使用方法】 在 globalconfig.ini 里面配置关注 2 个参数; -;失败用例重跑次数 -RERUN = 1 - -;失败录屏从第几次开始录制视频。 -;比如 RECORD_FAILED_CASE = 1 ,表示用例第1次执行失败之后开始录屏。 -;注意,用例失败重跑的次数不能小于失败录屏次数,即 RERUN >= RECORD_FAILED_CASE -RECORD_FAILED_CASE = 1 +;失败用例重跑次数 +RERUN = 1 + +;失败录屏从第几次开始录制视频。 +;比如 RECORD_FAILED_CASE = 1 ,表示用例第1次执行失败之后开始录屏。 +;注意,用例失败重跑的次数不能小于失败录屏次数,即 RERUN >= RECORD_FAILED_CASE +RECORD_FAILED_CASE = 1 默认失败重跑的次数是 1 次; RECORD_FAILED_CASE = 1 表示用例第1次执行失败之后开始录屏; @@ -2953,48 +2973,48 @@ 十、Wayland 适配简单讲就是,应用库只需要维护一套用例脚本即可。 【用例兼容】 因为 Wayland 下有些应用的界面显示和功能本身存在一些差异,用例层可能需要对这部分用例做逻辑判断,使用全局配置里面的常量进行逻辑编写即可: -from setting.globalconfig import GlobalConfig - -# GlobalConfig.IS_WAYLAND 获取到当前的显示服务器(bool) -# 应用库 Config 继承 GlobalConfig -if Config.IS_WAYLAND: - pass -if Config.IS_X11: - pass +from setting.globalconfig import GlobalConfig + +# GlobalConfig.IS_WAYLAND 获取到当前的显示服务器(bool) +# 应用库 Config 继承 GlobalConfig +if Config.IS_WAYLAND: + pass +if Config.IS_X11: + pass 比如用例里面如果断言的图片不同: -if Config.IS_WAYLAND: - self.assert_image_exist("wayland_XXX") -else: - self.assert_image_exist("x11_XXX") +if Config.IS_WAYLAND: + self.assert_image_exist("wayland_XXX") +else: + self.assert_image_exist("x11_XXX") 这样这条用例脚本在 Wayland 和 X11 下都可以跑,so easy 是不是?完全没必要专门拉新分支进行 Wayland 适配。 十一、测试报告¶ 1. 目录结构¶ 执行时会在根目录下动态生成 report 目录,所有的报告相关的文件会统一存放在里面,示例: -/report - ├── allure # allure报告 - │ ├── ... - │ └── ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json - ├── allure_html # 生成的html报告 - │ ├── ... - │ └── index.html - ├── allure_back # allure报告备份 - │ └── 20221108114823 - │ ├── ... - │ └── f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json - ├── json # json报告 - │ ├── ... - │ └── result_deepin-music_20221109134736_1081333.json - ├── logs # 日志文件 - │ ├── 2022-11-10_debug.log - │ └── 2022-11-10_error.log - ├── record # 录屏 - │ └── 2022-11-09 - │ ├── ... - │ └── 15时14分09秒_test_music_303_2_autotest.mp4 - └── xml # xml报告 - └── autotest_deepin_music-20221109134736.xml +/report + ├── allure # allure报告 + │ ├── ... + │ └── ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json + ├── allure_html # 生成的html报告 + │ ├── ... + │ └── index.html + ├── allure_back # allure报告备份 + │ └── 20221108114823 + │ ├── ... + │ └── f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json + ├── json # json报告 + │ ├── ... + │ └── result_deepin-music_20221109134736_1081333.json + ├── logs # 日志文件 + │ ├── 2022-11-10_debug.log + │ └── 2022-11-10_error.log + ├── record # 录屏 + │ └── 2022-11-09 + │ ├── ... + │ └── 15时14分09秒_test_music_303_2_autotest.mp4 + └── xml # xml报告 + └── autotest_deepin_music-20221109134736.xml 默认情况下同时生成 html、xml、json三种形式的报告。 2. 定制报告¶ @@ -3011,14 +3031,14 @@ 3. 查看报告allure open report/allure_html +allure open report/allure_html 使用 manage.py 执行完之后,在终端的最后一行,我们会给你输出打开报告的命令,直接复制它在终端执行就可以查看了,像这样: - 终端执行命令: allure open /tmp/youqu/report/allure_html 查看报告 + 终端执行命令: allure open /tmp/youqu/report/allure_html 查看报告 你也可以直接在 Pycharm 里面找到 index.html 文件,然后右键选择浏览器打开,或者你可以用一个 http 服务打开。 你也可以直接在 report/allure 目录下查看报告: - allure serve report/allure + allure serve report/allure 远程执行 @@ -3031,48 +3051,48 @@ 1. 提前解决代码问题这里推荐一个 Python 社区流行的代码格式化工具: Black,号称不妥协的代码格式化工具,它检测到不符合规范的代码风格直接就帮你全部格式化好,就是这么刚! 安装: -sudo pip3 install black +sudo pip3 install black 使用方法: -black ${CheckPath} +black ${CheckPath} 使用这个工具格式化之后,代码会被自动调整,刚开始你可能会觉得调整得很夸张,没关系坚持看,习惯之后,你会觉得很优雅,没错,这就是 Pythonic Code 的核心,请保持优雅~。 2. 代码扫描工具¶ 使用根目录下 pylint.sh 扫描代码,在 report 目录下查看代码扫描报告,如果有代码问题请提前解决之后再提交。 此脚本已经使用 Python 社区最流行的代码扫描工具 Pylint 进行代码扫描。 使用方法: -bash pylint.sh +bash pylint.sh 运行之后会提示你要扫描的目录,比如输入 apps ,则会扫描 apps 下的所有 Python 代码。 在 setting/pylintrc.cfg 配置文件里面进行相关配置,扫描完成之后在 report/pylints 目录下会生成扫描报告。 代码提交需通过 git review 提交到 gerrit ,人工 Code Review 通过之后合入代码。 十三、提交代码¶ 1. 安装依赖¶ -sudo apt install git-review +sudo apt install git-review 2. 提交模板¶ 在 ~ 目录下新建文件,并命名为 gitcommit_template 将以下内容写入文件当中: -# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 -fix: - -# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 -Description: - -# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 -Log: - -# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 -#Bug: - -# 修复 github issue -#Issue: - -# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 -#Task: +# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 +fix: + +# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 +Description: + +# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 +Log: + +# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 +#Bug: + +# 修复 github issue +#Issue: + +# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 +#Task: 命令行执行: -git config --global commit.template ~/gitcommit_template +git config --global commit.template ~/gitcommit_template 此命令将模板加入到 git 的提交模板中。 后续提交的时候需要关注一下几点: @@ -3083,19 +3103,19 @@ 2. 提交模板3. 推送代码¶ 首先添加 commit 信息 -git add 后面加文件名称 +git add 后面加文件名称 -git add . # 表示添加所有文件 +git add . # 表示添加所有文件 使用这条命令注意有些临时文件不要提交到仓库了。 -git commit -a +git commit -a 之后在 fix: 后面(注意冒号后面必须加空格,不然直接-1)写本地提交的 commit 信息,然后就可以提交代码了 -git review branch(当前分支) -r origin +git review branch(当前分支) -r origin 最好一次 commit,一次 git review ,经常有同学在本地疯狂 commit 最后 git review 报错不知道咋回事儿。 若不想每次提交都加上 -r 选项,执行以下命令: -git config --global gitreview.remote origin +git config --global gitreview.remote origin 提交代码,直接使用 git review branch<目标分支>,例如 git review master 4. Git标签¶ @@ -3106,74 +3126,74 @@ 4. Git标签git tag -a <tagname> +git tag -a <tagname> 回车之后,Git 会打开你的编辑器,让你写一句标签注解,就像你给提交写注解一样。 查看所有标签 -git tag -l -# git tag 也行 +git tag -l +# git tag 也行 删除标签 -git tag -d <tagname> +git tag -d <tagname> 推送标签至远程 git push 命令并不会传送标签到远程仓库服务器上,必须显式地推送标签。 -git push origin <tagname> +git push origin <tagname> 推送所有不在远程仓库服务器上的标签 -git push origin --tag +git push origin --tag 删除远程标签 -git push origin :refs/tag/<tagname> +git push origin :refs/tag/<tagname> 后期打标签 先用 git log --pretty=oneline 查询提交记录,获取校验码。 -git tag -a <tagname> 9fceb02(校验码) +git tag -a <tagname> 9fceb02(校验码) 检出标签 -git checkout <tagname> +git checkout <tagname> 此时,仓库会处于“分离头指针(detached HEAD)”的状态。 在“分离头指针”状态下,如果你做了某些更改然后提交它们,标签不会发生变化, 但你的新提交将不属于任何分支,并且将无法访问,除非通过确切的提交哈希才能访问。 因此,如果你需要进行更改,比如你要修复旧版本中的错误,那么通常需要创建一个新分支: -git checkout -b <NewBranchName> <tagname> +git checkout -b <NewBranchName> <tagname> 新分支上可以进行提交代码。 十四、常见问题¶ 1. 提交代码时提示邮箱或者名称不对¶ 重新配置邮箱或者名称,然后重置生效: -git commit --amend --reset-author +git commit --amend --reset-author 2. 怎么回滚到之前的版本¶ (1)查询历史提交记录 -git log +git log 找到你要回滚的版本,复制 hash 值。 注意:是 commit 空格之后的 hash 值,之前有同学复制的 Change-Id: 这样肯定报错。 (2)回滚版本,不清除代码 -git reset --soft ${hash} +git reset --soft ${hash} (3)回滚版本,清除代码,慎用哈 -git reset --hard ${hash} +git reset --hard ${hash} 3. 测试报告里面 F S . E 是什么意思¶ F 表示失败,. (点)表示通过,S 表示跳过,E 表示 error 有报错 4. 解决 git status 中文显示的问题¶ -git config --global core.quotePath false +git config --global core.quotePath false 5. apps 目录下颜色有些是黄色的¶ 在 Pycharm 中 apps 目录下应用库文件是黄色的,编辑器识别不到代码新增和修改; @@ -3184,22 +3204,22 @@ 5. apps 目录下颜色有些是黄色的6. 执行 env.sh 报错 $'\r':未找到命令¶ 出现这个问题你应该是在 windows 上打开或编辑过 env.sh 脚本,windows下的换行是回车符+换行符,也就是\r\n,而 Linxu 下是换行符 \n,Linux 下不识别 \r,因此报错。 解决方案: -# 将 \r 替换为空 -sudo sed -i 's/\r//' env.sh +# 将 \r 替换为空 +sudo sed -i 's/\r//' env.sh 7.怎样为单独某一条用例配置执行超时时间¶ 在用例脚本中添加装饰器,如下: -@pytest.mark.timeout(300) # 单位秒 -def test_xxx_001(): - pass +@pytest.mark.timeout(300) # 单位秒 +def test_xxx_001(): + pass 8. 如何拉取 YouQu 自动化项目所有代码,包含子仓库¶ 前置条件:已申请访问 YouQu 权限群组 -# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) -git config --global credential.helper store - -# 拉取YouQu框架代码,并递归拉取子仓库代码 -git clone "http://gerrit.uniontech.com/youqu" --recursive +# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) +git config --global credential.helper store + +# 拉取YouQu框架代码,并递归拉取子仓库代码 +git clone "http://gerrit.uniontech.com/youqu" --recursive 9. 如何拉取 YouQu 自动化项目中指定子仓库的代码¶ 前置条件: @@ -3207,22 +3227,22 @@ 9. 如何拉取 YouQu 自动化项目中指定子仓库的代 已申请访问 YouQu 权限群组 已存储访问密码 -# 拉取YouQu框架代码 -git clone "http://gerrit.uniontech.com/youqu" - -# 指定拉取子仓库代码 -cd youqu -git submodule update --init apps/autotest_xxx_xxx +# 拉取YouQu框架代码 +git clone "http://gerrit.uniontech.com/youqu" + +# 指定拉取子仓库代码 +cd youqu +git submodule update --init apps/autotest_xxx_xxx 10. 如何更新 YouQu 自动化项目中,所有子仓库的代码¶ 更新所有子仓库代码 -cd youqu -git pull & git submodule foreach git pull +cd youqu +git pull & git submodule foreach git pull 11. 如何修复 YouQu 所有子仓库 master 分支游离头(detached head)¶ 修复所有子仓库默认master 分支游离头 -cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
APP_NAME = # 指定要同步的应用名称 +PMS_USER = # PMS的用户名 +PMS_PASSWORD = # PMS的密码
在 [csv_link_pms_id] 节点下指定 csv 文件名与 PMS 用例模块的对应关系,比如:
[csv_link_pms_id]
csv
[csv_link_pms_id] -;同步PMS数据到本地CSV文件,必须要配置的配置项 -;key是本地CSV文件的文件名称; -;value是对应PMS上的模块ID; -;比如要同步音乐的数据, 首先需要将配置 APP_NAME = deepin-music, -;CSV文件名称为music.csv,其在PMS上的用例为: https://pms.uniontech.com/testcase-browse-53.html -;因此应该配置为: music = 53 -;这样才能将PMS与本地CSV文件建立联系。 -;如果你的应用分了很多模块,只需要将对应的信息依次配置好就行了。 -music = 53 +[csv_link_pms_id] +;同步PMS数据到本地CSV文件,必须要配置的配置项 +;key是本地CSV文件的文件名称; +;value是对应PMS上的模块ID; +;比如要同步音乐的数据, 首先需要将配置 APP_NAME = deepin-music, +;CSV文件名称为music.csv,其在PMS上的用例为: https://pms.uniontech.com/testcase-browse-53.html +;因此应该配置为: music = 53 +;这样才能将PMS与本地CSV文件建立联系。 +;如果你的应用分了很多模块,只需要将对应的信息依次配置好就行了。 +music = 53 将以上信息配置好之后,在命令行执行: -youqu manage.py pms --pms2csv yes +youqu manage.py pms --pms2csv yes 每次执行时原 csv 文件会自动备份在 report/csv_back 目录下,因此你不用担心脚本执行导致你的数据丢失。 diff --git a/search/search_index.json b/search/search_index.json index 91ebe84c..c7cfc7a2 100644 --- a/search/search_index.json +++ b/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\u200b\\u3000\\-\u3001\u3002\uff0c\uff0e\uff1f\uff01\uff1b]+","pipeline":["stemmer"]},"docs":[{"location":"","title":"\u9996\u9875","text":""},{"location":"#youqu","title":"\u6709\u8da3\uff08YouQu\uff09","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/4/1\n# Author : Mikigo\n# =============================================\n \u672c\u7ad9\u603b\u8bbf\u95ee\u91cf \u6b21 \u6b22\u8fce\u5728\u6d4f\u89c8\u5668\u8bbf\u95ee\u3010\u516c\u7f51\u6587\u6863\u3011 \u7edf\u4fe1\u516c\u53f8\u5185\u7f51\u8fd8\u53ef\u4ee5\u8bbf\u95ee\u3010\u5185\u7f51\u6587\u6863\u3011\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u54e6~~"},{"location":"#_1","title":"\u4e00\u3001\u7b80\u4ecb","text":"\u6709\u8da3\uff08YouQu\uff09\u662f\u6df1\u5ea6\u79d1\u6280\u8bbe\u8ba1\u548c\u5f00\u53d1\u7684\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff0c\u91c7\u7528\u7ed3\u6784\u5206\u5c42\u7684\u8bbe\u8ba1\u7406\u5ff5\uff0c\u652f\u6301\u591a\u5143\u5316\u5143\u7d20\u5b9a\u4f4d\u548c\u65ad\u8a00\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\u3001\u5f3a\u5927\u7684\u65e5\u5fd7\u548c\u62a5\u544a\u8f93\u51fa\u7b49\u7279\u8272\u529f\u80fd\uff0c\u540c\u65f6\u5b8c\u7f8e\u517c\u5bb9X11\u3001Wayland\u663e\u793a\u534f\u8bae\uff0c\u73af\u5883\u90e8\u7f72\u7b80\u5355\uff0c\u64cd\u4f5c\u6613\u4e0a\u624b\u3002"},{"location":"#17","title":"\u7231\u4e0a \u201c\u6709\u8da3\u201d \u7684 17 \u4e2a\u7406\u7531","text":" \u6838\u5fc3\u5e93\u63d0\u4f9b\u4e86\u7edf\u4e00\u7684\u63a5\u53e3\uff0c\u7f16\u5199\u65b9\u6cd5\u65f6\u53ea\u9700\u8981\u5bfc\u5165\u4e00\u4e2a\u5305\u5c31\u53ef\u4ee5\u4f7f\u7528\u5230\u6838\u5fc3\u5e93\u63d0\u4f9b\u7684\u6240\u6709\u529f\u80fd\uff1b \u516c\u5171\u5e93\u5c01\u88c5\u4e86\u5f88\u591a\u5e38\u7528\u6a21\u5757\u7684\u76f8\u5173\u65b9\u6cd5\uff0c\u6bd4\u5982\uff1a\u4efb\u52a1\u680f\u7684\u64cd\u4f5c\u3001\u684c\u9762\u7684\u64cd\u4f5c\u3001\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\u7b49\u7b49\uff1b \u9664\u4e86\u5e38\u7528\u7684\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u8bc6\u522b\u4ee5\u5916\uff0c\u6211\u4eec\u8fd8\u63d0\u4f9b\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u5176\u4f7f\u7528\u7b80\u5355\u4e14\u9ad8\u6548\uff0c\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff1b \u5bf9\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u5c06\u7f16\u5199\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u53d8\u5f97\u7b80\u5355\u800c\u4f18\u96c5\uff1b \u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u6280\u672f\u8fdb\u884c\u529f\u80fd\u5347\u7ea7\uff0c\u9664\u4e86\u652f\u6301\u5355\u4e2a\u5750\u6807\u8fd4\u56de\uff0c\u8fd8\u652f\u6301\u540c\u4e00\u754c\u9762\u4e0b\u591a\u4e2a\u76f8\u540c\u5143\u7d20\u8fd4\u56de\u591a\u4e2a\u5750\u6807\u7684\u529f\u80fd\uff1b \u63d0\u4f9b\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u548c\u6279\u91cf\u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u4e0d\u5230\u4e00\u4e2a csv \u6587\u4ef6\u539f\u6765\u80fd\u5e72\u8fd9\u4e48\u591a\u4e8b\u60c5\uff1b \u63d0\u4f9b\u4e86\u529f\u80fd\u5f3a\u5927\u7684\u6267\u884c\u5668\u5165\u53e3\uff0c\u8ba9\u4f60\u53ef\u4ee5\u65b9\u4fbf\u7684\u5728\u672c\u5730\u6267\u884c\u4efb\u4f55\u7528\u4f8b\u96c6\u7684\u7528\u4f8b\uff0c\u5176\u4e30\u5bcc\u7684\u81ea\u5b9a\u4e49\u914d\u7f6e\u9879\uff0c\u6ee1\u8db3\u4f60\u5bf9\u6267\u884c\u5668\u6240\u6709\u7684\u5e7b\u60f3\uff1b \u63d0\u4f9b\u8fdc\u7a0b\u6267\u884c\u7684\u529f\u80fd\uff0c\u53ef\u4ee5\u63a7\u5236\u591a\u53f0\u673a\u5668\u5e76\u884c\u8dd1\uff0c\u6216\u8005\u5206\u5e03\u5f0f\u8dd1\uff0c\u8fd9\u79cd\u4ed8\u8d39\u529f\u80fd\u73b0\u5728\u514d\u8d39\u7ed9\u4f60\u7528\uff1b \u63d0\u4f9b\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u529f\u80fd\uff0c\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u6bcf\u4e2a\u65b9\u6cd5\u5355\u72ec\u5199\u8f93\u51fa\u65e5\u5fd7\u7684\u4ee3\u7801\uff0c\u4e00\u5207\u6211\u4eec\u7ed9\u4f60\u641e\u5b9a\u4e86\uff0c\u65e5\u5fd7\u8f93\u51fa\u4e0d\u4ec5\u5185\u5bb9\u4e30\u5bcc\uff0c\u989c\u503c\u4e5f\u7edd\u5bf9\u5728\u7ebf\uff0c\u6211\u4eec\u8fd8\u81ea\u5df1\u8bbe\u8ba1\u4e86\u4e00\u6b3e\u7ec8\u7aef\u8f93\u51fa\u4e3b\u9898\u53eb\u300a\u4e94\u5f69\u6591\u6593\u7684\u9ed1\u300b\uff1b \u63d0\u4f9b\u4e86\u4e00\u952e\u90e8\u7f72\u81ea\u52a8\u5316\u6d4b\u8bd5\u73af\u5883\u7684\u529f\u80fd\uff0c\u8fde\u4ee3\u7801\u7f16\u8f91\u5668\u90fd\u7ed9\u4f60\u88c5\u597d\u4e86\uff0c\u8ba9\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u73af\u5883\u90e8\u7f72\u800c\u70e6\u607c\uff1b \u63d0\u4f9b\u4e86\u81ea\u52a8\u751f\u6210\u591a\u79cd\u62a5\u544a\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u8f93\u51fa\u4ec0\u4e48\u62a5\u544a\u5f62\u5f0f\u90fd\u884c\uff0c\u800c\u4e14\u6211\u4eec\u5728\u62a5\u544a\u4e2d\u8fd8\u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\u548c\u5931\u8d25\u622a\u56fe\u7684\u529f\u80fd\uff1b \u5bf9\u65ad\u8a00\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u63d0\u4f9b\u66f4\u53cb\u597d\u5316\u7684\u9519\u8bef\u63d0\u793a\uff0c\u8ba9\u5b9a\u4f4d\u95ee\u9898\u7cbe\u51c6\u9ad8\u6548\uff1b \u4e0d\u4ec5\u652f\u6301\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u63a7\u5236\uff0c\u800c\u4e14\u8fd8\u652f\u6301\u52a8\u6001\u63a7\u5236\u7528\u4f8b\u6279\u91cf\u6267\u884c\u7684\u603b\u65f6\u95f4\uff0c\u786e\u4fdd CI \u73af\u5883\u4e0b\u80fd\u987a\u7545\u8fd0\u884c\uff1b \u652f\u6301\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\u6267\u884c\u3001PMS \u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6807\u7b7e\u5316\u6267\u884c\u65b9\u6848\uff0c\u6ee1\u8db3\u4f60\u5404\u79cd\u573a\u666f\u4e0b\u7684\u6267\u884c\u9700\u6c42\uff1b \u652f\u6301\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u529f\u80fd\uff0c\u53ef\u5b9a\u4f4d\u53ef\u65ad\u8a00\uff0c\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\uff1b \u5b8c\u7f8e\u517c\u5bb9 Wayland \u548c X11\uff0c\u771f\u6b63\u505a\u5230\u4e00\u5957\u4ee3\u7801\uff0c\u968f\u5904\u6267\u884c\uff1b \u652f\u6301\u591a\u79cd\u65b9\u5f0f\u7684\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u5176\u4e2d\u5f02\u6b65\u56de\u586b\u7684\u65b9\u6848\uff0c\u5b8c\u7f8e\u89e3\u51b3\u4e86\u6570\u636e\u56de\u586b\u7684\u8017\u65f6\u95ee\u9898\uff1b \u3010\u89c6\u9891\u4ecb\u7ecd\u3011"},{"location":"#_2","title":"\u4e8c\u3001\u5b89\u88c5\u4f7f\u7528","text":"\u57fa\u7840\u6846\u67b6\uff1ahttps://github.com/linuxdeepin/deepin-autotest-framework \u4ece PyPI \u5b89\u88c5: sudo pip3 install youqu\n \u521b\u5efa\u9879\u76ee: youqu-startproject youqu\n \u5b89\u88c5\u4f9d\u8d56: cd youqu\nbash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002 \u5e94\u7528\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684\u5e94\u7528\u540d\u79f0\u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music cd apps/\n \u5c06\u5e94\u7528\u5e93\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u50cf\u8fd9\u6837\uff1a youqu\n\u251c\u2500\u2500 apps\n\u2502 \u251c\u2500\u2500 autotest_deepin_music # \u5e94\u7528\u5e93\n...\n \u5e94\u7528\u5e93\u7684\u540d\u79f0\u4e0d\u53ef\u4ee5\u4fee\u6539\u3002"},{"location":"#_3","title":"\u4e09\u3001\u8fd0\u884c","text":""},{"location":"#1","title":"1. \u5de5\u4f5c\u7a7a\u95f4","text":"\u57fa\u7840\u6846\u67b6\u5de5\u7a0b\u76ee\u5f55\u5efa\u8bae\u653e\u5728 ~ \u76ee\u5f55\u4e0b\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u4e5f\u53ef\u4ee5\u8fd0\u884c\uff0c\u4f46\u662f\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u9700\u8981\u505a\u73af\u5883\u6e05\u7406\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u5b58\u5728\u4ee3\u7801\u88ab\u5220\u9664\u7684\u98ce\u9669\u3002 \u5982\u679c\u4f60\u7684\u673a\u5668\u4e0a\u4e0d\u540c\u76ee\u5f55\u4e0b\u5b58\u5728\u591a\u4e2a YouQu \u5de5\u7a0b\uff0c\u90a3\u4e48\u5728\u8fd0\u884c\u4e4b\u524d\uff0c\u8bf7\u5148\u6267\u884c env.sh \u6821\u6b63\u76f8\u5173\u73af\u5883\u3002"},{"location":"#2","title":"2. \u6267\u884c\u5668","text":"\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u6709\u4e00\u4e2a manage.py \uff0c\u5b83\u662f\u4e00\u4e2a\u6267\u884c\u5668\u5165\u53e3\uff0c\u63d0\u4f9b\u4e86\u672c\u5730\u6267\u884c\u3001\u8fdc\u7a0b\u6267\u884c\u7b49\u7684\u529f\u80fd\u3002 \u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6765\u6267\u884c\uff1a youqu manage.py run -a deepin-music\n"},{"location":"#21","title":"2.1. \u672c\u5730\u6267\u884c","text":"youqu manage.py run\n"},{"location":"#211","title":"2.1.1. \u914d\u7f6e\u6587\u4ef6","text":"\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u914d\u7f6e\u53c2\u6570 \u5728\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u91cc\u9762\u652f\u6301\u914d\u7f6e\u5bf9\u6267\u884c\u7684\u4e00\u4e9b\u53c2\u6570\u8fdb\u884c\u914d\u7f6e\uff0c\u5e38\u7528\u7684\u5982\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;1\u3001KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2\u3001KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f, e.g. TAGS = L1 or smoke\n;\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\uff0c\u5c06\u8981\u6267\u884c\u7684\u7528\u4f8b\u5199\u5165\u6307\u5b9a\u7684 csv \u6587\u4ef6\n;\u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u4ece\u57fa\u7840\u6846\u67b6\u6839\u76ee\u5f55\u5f00\u59cb\uff1ae.g. CASE_FILE = case_list.txt\n;\u5982\u679c\u8fd9\u91cc\u6709\u503c\uff0cAPP_NAME KEYWORDS TAGS \u7684\u914d\u7f6e\u5747\u4e0d\u751f\u6548\nCASE_FILE =\n;=============================== RUNNER CONFIG ===================================\n[runner]\n;\u6700\u5927\u5931\u8d25\u7528\u4f8b\u6570\u91cf\u7684\u5360\u6bd4\n;\u6bd4\u5982\uff1a\u603b\u6267\u884c\u7528\u4f8b\u6570\u4e3a100, \u82e5 MAX_FAIL = 0.5,\u5219\u5931\u8d25\u7528\u4f8b\u6570\u8fbe\u523050\u5c31\u4f1a\u7ec8\u6b62\u6d4b\u8bd5\u3002\nMAX_FAIL = 0.5\n;\u5355\u6761\u7528\u4f8b\u7684\u8d85\u65f6\u65f6\u95f4\uff0c\u5982\u679c\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u8d85\u65f6\uff0c\u8fd9\u6761\u7528\u4f8b\u4f1a\u88ab\u505c\u6b62\uff0c\u540e\u7eed\u7528\u4f8b\u7ee7\u7eed\u6267\u884c\u3002\n;\u5355\u4f4d\u4e3a\u79d2\n; \u8fd9\u662f\u4e00\u4e2a\u5168\u5c40\u7edf\u4e00\u914d\u7f6e\uff0c\u5982\u679c\u67d0\u6761\u7528\u4f8b\u9700\u8981\u5355\u72ec\u914d\u7f6e\u8d85\u65f6\u65f6\u95f4\uff0c\u53ef\u4ee5\u5728\u7528\u4f8b\u4e2d\u8fd9\u6837\u5199\uff1a\n;@pytest.mark.timeout(500)\n;def test_xxx_001():\n; ...\n;\u4f1a\u8bdd\uff08\u6240\u6709\u7528\u4f8b\u6267\u884c\u7684\uff09\u8d85\u65f6\u662f\u6839\u636e\u5168\u5c40\u8d85\u65f6\u914d\u7f6e\u548c\u7528\u4f8b\u5355\u72ec\u8d85\u65f6\u914d\u7f6e\u81ea\u52a8\u8ba1\u7b97\u7684\uff1b\nCASE_TIME_OUT = 200\n;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\u3002\n;\u6ce8\u610f\uff0c\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u4e0d\u80fd\u5c0f\u4e8e\u5931\u8d25\u5f55\u5c4f\u6b21\u6570\uff0c\u5373 RERUN >= RECORD_FAILED_CASE\nRECORD_FAILED_CASE = 1\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = INFO\n;yes \u6bcf\u6761\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u8fdb\u884c\u73af\u5883\u6e05\u7406\nCLEAN_ALL = yes\n;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\nRESOLUTION = 1920x1080\n;\u4e0d\u8df3\u8fc7\u7528\u4f8b\uff0ccsv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86 skip-xxx\u7684\u7528\u4f8b\u4e0d\u8df3\u8fc7\nNOSKIP = no\n;ignore fixed\n;no\uff0c\u53ea\u8981\u6807\u8bb0\u4e86fixed\u7684\u7528\u4f8b\uff0c\u5373\u4f7f\u6807\u8bb0\u4e86skip-\uff0c\u4e5f\u4f1a\u6267\u884c\uff1b\n;yes\uff0cfixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\uff1b\nIFIXED = no\n;\u8981\u5b89\u88c5deb\u5305\u7684\u8def\u5f84\n;e.g : ~/Downloads/ \u5b89\u88c5\u4e0b\u8f7d\u76ee\u5f55\u4e0b\u7684deb\u5305\uff0c\u5982\u679c\u662f\u8fdc\u7a0b\u6267\u884c\uff0c\u4f1a\u81ea\u52a8\u62f7\u8d1d\u5230\u8fdc\u7a0b\u5e76\u5b89\u88c5\u3002\nDEB_PATH =\n;DEBUG \u6a21\u5f0f\u6267\u884c\u7528\u4f8b\uff0c\u53ea\u6536\u96c6\u4e0d\u6267\u884c\u7528\u4f8b\uff0c\u4e5f\u4e0d\u505a\u8bbe\u5907\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002\nDEBUG = no\n;\u8bb0\u5f55top\u547d\u4ee4\u67e5\u8be2\u7684\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0cTOP = 3 \u8868\u793a\u8bb0\u5f55\u524d3\u4e2a\u8fdb\u7a0b\u3002\nTOP =\n;\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\nREPEAT =\n;\u9ed8\u8ba4\u5728\u6240\u6709\u6d4b\u8bd5\u5b8c\u6210\u4e4b\u540e\u8f93\u51fa\u62a5\u9519\u4fe1\u606f.\n;yes, \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\nDURING_FAIL = no\n;=============================== REPORT CONFIG ===================================\n[report]\n;\u7528\u4f8b\u6267\u884c\u5b8c\u540e\u751f\u6210\u7684\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n;\u76ee\u524d\u652f\u6301 allure, xml, json \uff08\u652f\u6301\u540c\u65f6\u751f\u6210\uff09\nREPORT_FORMAT = allure, xml, json\n;\u6307\u5b9a\u62a5\u544a\u751f\u6210\u7684\u8def\u5f84\uff08\u76f8\u5bf9\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\uff09\nALLURE_REPORT_PATH = report/\nXML_REPORT_PATH = report/\nJSON_REPORT_PATH = report/\n;=============================== GLOBAL CONFIG ===================================\n[globalconfig]\n;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\nPASSWORD = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\nIMAGE_MATCH_NUMBER = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6bcf\u6b21\u95f4\u9694\u7b49\u5f85\u65f6\u95f4\nIMAGE_MATCH_WAIT_TIME = 1\n;\u56fe\u50cf\u8bc6\u522b\u5339\u914d\u5ea6\nIMAGE_RATE = 0.9\n;\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u5b9e\u65f6\u56fe\u50cf\u4fdd\u5b58\u8def\u5f84\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u5750\u6807\nSCREEN_CACHE = /tmp/screen.png\n;\u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\u7684\u8def\u5f84\nTMPDIR = /tmp/tmpdir\n;\u7cfb\u7edf\u4e3b\u9898\nSYS_THEME = deepin\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = http://youqu-dev.uniontech.com:8890\n;OpenCV\u670d\u52a1\u7aef\u5730\u5740\nOPENCV_SERVER_HOST = http://youqu-dev.uniontech.com:8889\n;=============================== PMS CONFIG ===================================\n;PMS\u76f8\u5173\u914d\u7f6e\uff0c\u5305\u542b\u4ee5\u4e0b\u51e0\u4e2a\u65b9\u9762\uff1a\n;1.PMS\u6d4b\u8bd5\u5957\u6267\u884c\n;2.\u81ea\u52a8\u4ecePMS\u722c\u53d6\u6570\u636e\u5e76\u540c\u6b65\u672c\u5730CSV\u6587\u4ef6\n;3.PMS\u6570\u636e\u56de\u586b\n[pms]\n;PMS\u7684\u7528\u6237\u540d: ut001234\nPMS_USER =\n;PMS\u7684\u5bc6\u7801\nPMS_PASSWORD =\n;PMS\u6d4b\u8bd5\u5957\u7684ID\n;\u5728PMS\u4e0a\u67e5\u770b\u7528\u4f8b\u201c\u5957\u4ef6\u201d\u94fe\u63a5: https://pms.uniontech.com/testsuite-view-495.html\n;\u6d4b\u8bd5\u5957ID\u4e3a: 495\nSUITE_ID =\n;\u6570\u636e\u56de\u586b\u5fc5\u987b\u5173\u8054PMS\u6d4b\u8bd5\u5355\n;\u5728PMS\u4e0a\u67e5\u770b\u6d4b\u8bd5\u5355\u94fe\u63a5: https://pms.uniontech.com/testtask-cases-20747.html\n;\u6d4b\u8bd5\u5355ID\u4e3a: 20747\nTASK_ID =\n;\u5c06\u6d4b\u8bd5\u7ed3\u679c\u6570\u636e\u56de\u586b\u5230PMS\n;\u4e3a\u7a7a: \u8868\u793a\u4e0d\u56de\u586b,\u4e0d\u4f1a\u5728\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u751f\u6210json\u7ed3\u679c\u6587\u4ef6;\n;async: \u8868\u793a\u9010\u6761\u5f02\u6b65\u56de\u586b,\u540e\u9762\u4e00\u6761\u6267\u884c\u5f00\u59cb\u65f6\u901a\u8fc7\u5b50\u7ebf\u7a0b\u5bf9\u524d\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u8fdb\u884c\u56de\u586b\uff0c\u5982\u6b64\u5b9e\u73b0\u65f6\u95f4\u6548\u7387\u6700\u5927\u5316;\n;finish: \u8868\u793a\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u6210\u4e4b\u540e\u9010\u4e2a\u56de\u586b(PMS\u4e0d\u652f\u6301\u5e76\u53d1);\nSEND_PMS =\n;\u6570\u636e\u56de\u586b\u7684\u89e6\u53d1\u8005\n;auto: \u6846\u67b6\u81ea\u52a8\u56de\u586b,\u914d\u5408SEND_PMS\u914d\u7f6e\u4f7f\u7528,\u4f60\u53ef\u4ee5\u9009\u62e9\u5728\u4e0d\u540c\u7684\u9636\u6bb5\u8fdb\u884c\u6570\u636e\u56de\u586b;\n;hand: \u624b\u52a8\u56de\u586b,\u6bcf\u6761\u7528\u4f8b\u4ecd\u7136\u4f1a\u751f\u6210json\u6587\u4ef6,\u4f46\u6846\u67b6\u4e0d\u4f1a\u8fdb\u884c\u6570\u636e\u56de\u586b,\u9700\u8981\u4f60\u53ef\u4ee5\u5728\u4f60\u60f3\u8981\u53d1\u9001\u7684\u65f6\u95f4\u70b9\u624b\u52a8\u89e6\u53d1\u56de\u586b;\nTRIGGER = auto\n;PMS\u56de\u586b\u7684\u91cd\u8bd5\u6b21\u6570\n;\u5982\u679c\u63a5\u53e3\u8bf7\u6c42\u5931\u8d25,\u4f1a\u8fdb\u884c\u91cd\u8bd5\nSEND_PMS_RETRY_NUMBER = 2\n[csv_link_pms_lib]\n;caselib: \u7528\u4f8b\u5e93\n;testcase: \u4ea7\u54c1\u5e93\u7528\u4f8b\nCASE_FROM = caselib\n[csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/caselib-browse-81.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 81\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic =\n[export_csv]\n;\u5bfc\u51fa\u7684csv\u6587\u4ef6\u540d\u79f0\uff0c\u9ed8\u8ba4 case_list.csv\nCSV_FILE = case_list.csv\n;exportcsv \u547d\u4ee4\u5bfc\u51fa case_list.csv \u6587\u4ef6\u65f6\u914d\u7f6e\u7684\u5b57\u6bb5\u540d\uff0c\u7528\u4f8b\u540d\u79f0\u9ed8\u8ba4\u5b58\u5728\u7b2c\u4e00\u5217\uff0c\u65e0\u9700\u6dfb\u52a0\nCSV_HEARD = \u7528\u4f8b\u7ea7\u522b,\u7528\u4f8b\u7c7b\u578b,\u6d4b\u8bd5\u7ea7\u522b,\u662f\u5426\u8df3\u8fc7\n \u914d\u7f6e\u5b8c\u6210\u4e4b\u540e\uff0c\u76f4\u63a5\u5728\u547d\u4ee4\u884c\u6267\u884c manage.py \u5c31\u597d\u4e86\u3002 youqu manage.py run\n"},{"location":"#212","title":"2.1.2. \u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a youqu manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--max_fail MAX_FAIL \u6700\u5927\u5931\u8d25\u7387\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--resolution RESOLUTION\n\u68c0\u67e5\u5206\u8fa8\u7387\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms {,async,finish}\n\u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--trigger {,auto,hand}\n\u89e6\u53d1\u8005\n-f CASE_FILE, --case_file CASE_FILE\n\u6839\u636e\u6587\u4ef6\u6267\u884c\u7528\u4f8b\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n--pms_user PMS_USER pms \u7528\u6237\u540d\n--pms_password PMS_PASSWORD\npms \u5bc6\u7801\n--suite_id SUITE_ID pms \u6d4b\u8bd5\u5957ID\n--pms_info_file PMS_INFO_FILE\npms \u4fe1\u606f\u6587\u4ef6\n--top TOP \u8fc7\u7a0b\u4e2d\u8bb0\u5f55top\u547d\u4ee4\u4e2d\u7684\u503c\n--lastfailed \u4ec5\u6267\u884c\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\n--duringfail \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\n--repeat REPEAT \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n--project_name PROJECT_NAME\n\u5de5\u7a0b\u540d\u79f0\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--build_location BUILD_LOCATION\n\u6784\u5efa\u5730\u533a\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--line LINE \u6267\u884c\u7684\u4e1a\u52a1\u7ebf\uff08\u5199\u5165json\u6587\u4ef6\uff09\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a youqu manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\"\n \u547d\u4ee4\u884c\u53c2\u6570\u4f18\u5148\u7ea7\u662f\u9ad8\u4e8e\u914d\u7f6e\u6587\u4ef6\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u4e86\u5bf9\u5e94\u7684\u53c2\u6570\uff0c\u914d\u7f6e\u6587\u4ef6\u4e2d\u4e0d\u7ba1\u662f\u5426\u914d\u7f6e\u5747\u4e0d\u751f\u6548\u3002 --app \u5165\u53c2\u8fd8\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\uff0c\u4e0b\u9762\u7684\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u540c\u6837\u652f\u6301\u3002"},{"location":"#22","title":"2.2. \u8fdc\u7a0b\u6267\u884c","text":"youqu manage.py remote\n \u8fdc\u7a0b\u6267\u884c\u540c\u6837\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u8fdb\u884c\u7528\u4f8b\u76f8\u5173\u914d\u7f6e\uff1b \u9700\u8981\u91cd\u70b9\u8bf4\u4e00\u4e0b\u8fdc\u7a0b\u6267\u884c\u65f6\u7684\u6d4b\u8bd5\u673a\u4fe1\u606f\u914d\u7f6e\uff0c\u5728\u914d\u7f6e\u6587\u4ef6 setting/remote.ini \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\u3001IP\u3001\u5bc6\u7801\u3002 ;=============================== CLIENT LIST =====================================\n; \u6d4b\u8bd5\u673a\u914d\u7f6e\u5217\u8868\n;[client{number}] ;\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u6709\u591a\u5c11\u53f0\u6d4b\u8bd5\u673a\u5c31\u5199\u591a\u5c11\u4e2a client\uff0c\u522b\u540d\u5fc5\u987b\u5305\u542b client \u5b57\u7b26\uff0c\u4e14\u4e0d\u80fd\u91cd\u590d\u3002\n;user = ;\u6d4b\u8bd5\u673a user\n;ip = ;\u6d4b\u8bd5\u673a ip\n;password = 1 ;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801, \u53ef\u4ee5\u4e0d\u914d\u7f6e\u6b64\u9879\uff0c\u9ed8\u8ba4\u53d6 CLIENT_PASSWORD \u7684\u503c\uff1b\n;\u5982\u679c\u4f60\u6240\u6709\u6d4b\u8bd5\u673a\u5bc6\u7801\u90fd\u76f8\u540c\uff0c\u90a3\u4e48\u53ea\u9700\u8981\u914d\u7f6e CLIENT_PASSWORD \u5c31\u53ef\u4ee5\u4e86\n;=================================================================================\n[client1]\nuser = uos\nip = 10.8.15.xx\n[client2]\nuser = uos\nip = 10.8.15.xx\n[client3]\nuser = uos\nip = 10.8.11.xx\n \u6709\u591a\u5c11\u53f0\u673a\u5668\u5c31\u50cf\u8fd9\u6837\u6328\u7740\u5199\u5c31\u884c\u4e86\u3002 \u7136\u540e\u5728\u547d\u4ee4\u884c\uff1a youqu manage.py remote\n \u8fd9\u6837\u8fd0\u884c\u662f\u4ece\u914d\u7f6e\u6587\u4ef6\u53bb\u8bfb\u53d6\u76f8\u5173\u914d\u7f6e\u3002 \u5982\u679c\u4f60\u4e0d\u60f3\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\uff0c\u4f60\u4ecd\u7136\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u8fdb\u884c\u4f20\u53c2\uff0c \u4ee5\u4e0b\u4e3a python3 manage.py remote \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-c CLIENTS, --clients CLIENTS\n\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679cpassword\u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6\nsetting/remote.ini \u4e2d CLIENT_PASSWORD\n\u7684\u503c,\u6bd4\u5982\uff1auos@10.8.13.33:1 \u6216 uos@10.8.13.33\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-s {yes,no,}, --send_code {yes,no,}\n\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a\uff08\u4e0d\u542breport\u76ee\u5f55\uff09\n-e, --build_env \u642d\u5efa\u6d4b\u8bd5\u73af\u5883,\u5982\u679c\u4e3ayes\uff0c\u4e0d\u7ba1send_code\u662f\u5426\u4e3ayes\u90fd\u4f1a\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a.\n-p CLIENT_PASSWORD, --client_password CLIENT_PASSWORD\n\u6d4b\u8bd5\u673a\u5bc6\u7801\uff08\u5168\u5c40\uff09\n-y PARALLEL, --parallel PARALLEL\nyes:\u8868\u793a\u6240\u6709\u6d4b\u8bd5\u673a\u5e76\u884c\u8dd1\uff0c\u6267\u884c\u76f8\u540c\u7684\u6d4b\u8bd5\u7528\u4f8b\uff0cno\n:\u8868\u793a\u6d4b\u8bd5\u673a\u5206\u5e03\u5f0f\u6267\u884c\uff0c\u670d\u52a1\u7aef\u4f1a\u6839\u636e\u6536\u96c6\u5230\u7684\u6d4b\u8bd5\u7528\u4f8b\u81ea\u52a8\u5206\u914d\u7ed9\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u3002\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms SEND_PMS \u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n \u5728\u547d\u4ee4\u884c\u8fd9\u6837\u8fd0\u884c\uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\"\n \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report \u76ee\u5f55\u4e0b\u56de\u6536\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u7684\u6d4b\u8bd5\u62a5\u544a\u3002 \u914d\u7f6e\u6587\u4ef6\u5176\u4ed6\u76f8\u5173\u914d\u7f6e\u9879\u8be6\u7ec6\u8bf4\u660e\uff0c\u8bf7\u67e5\u770b\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u6ce8\u91ca\u5185\u5bb9\u3002"},{"location":"#23-pms","title":"2.3. PMS \u6570\u636e\u56de\u586b","text":"\u6d4b\u8bd5\u5355\u5173\u8054\u7684\u7528\u4f8b\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u5bf9\u5e94\u7684\u53bb\u8dd1\u8fd9\u4e9b\u5173\u8054\u7684\u7528\u4f8b\uff0c\u5e76\u4e14\u5c06\u6267\u884c\u7684\u7ed3\u679c\u56de\u586b\u7684\u6d4b\u8bd5\u7528\u4f8b\u7684\u72b6\u6001\u91cc\u9762\u3002 PMS \u6570\u636e\u56de\u586b\u4e3b\u8981\u6709\u4e09\u79cd\u65b9\u5f0f\uff1a \uff081\uff09\u5f02\u6b65\u56de\u586b \u5728\u7528\u4f8b\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\uff0c\u91c7\u7528\u5f02\u6b65\u7684\u65b9\u5f0f\u53bb\u8fdb\u884c\u6570\u636e\u56de\u586b\uff0c\u76f4\u767d\u7684\u8bb2\u5c31\u662f\uff0c\u7b2c\u4e8c\u6761\u7528\u4f8b\u5f00\u59cb\u8dd1\u7684\u65f6\u5019\uff0c\u901a\u8fc7\u5b50\u7ebf\u7a0b\u53bb\u505a\u7b2c\u4e00\u6761\u7528\u4f8b\u7684\u6570\u636e\u56de\u586b\uff0c\u5982\u6b64\u5faa\u73af\uff0c\u76f4\u5230\u6240\u6709\u7528\u4f8b\u6267\u884c\u7ed3\u675f\uff1b \u8fd9\u79cd\u65b9\u6848\u7684\u65f6\u95f4\u6548\u7387\u6700\u9ad8\u7684\uff0c\u56e0\u4e3a\u7406\u8bba\u4e0a\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u662f\u5927\u4e8e\u6570\u636e\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\u65f6\u95f4\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u5f53\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u6570\u636e\u56de\u586b\u4e5f\u5b8c\u6210\u4e86\u3002 \u4f7f\u7528\u65b9\u6cd5\uff0c\u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u4ee5\u4e0b\u53c2\u6570\uff1a\uff08\u4ee5\u4e0b\u6d89\u53ca\u5230\u7684\u53c2\u6570\u914d\u7f6e\u90fd\u662f\u5728\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u914d\u7f6e\uff09 PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = async\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \u8fd9\u4e2a\u53c2\u6570\u53ef\u586b\u53ef\u4e0d\u586b\uff0c\u4f46\u662f\u586b\u4e86\u53ef\u4ee5\u63d0\u9ad8\u7528\u4f8b\u7684\u6267\u884c\u901f\u5ea6\uff0c\u56e0\u4e3a\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u53ef\u4ee5\u6307\u5b9a\u5230\u5177\u4f53\u7684\u5e94\u7528\u5e93\u3002\uff08\u4e0b\u540c\uff09\n \uff082\uff09\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u56de\u586b \u7b49\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u518d\u9010\u4e2a\u8fdb\u884c\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u6b64\u65b9\u6848\u65f6\u95f4\u6548\u7387\u6bd4\u8f83\u4f4e\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \uff083\uff09\u624b\u52a8\u56de\u586b \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4e0d\u505a\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u540e\u7eed\u624b\u52a8\u5c06\u7ed3\u679c\u8fdb\u884c\u56de\u586b\u8bf7\u6c42\u3002 \u7528\u4f8b\u6267\u884c\u65f6\u914d\u7f6e\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = hand\nAPP_NAME = \u540e\u7eed\u624b\u52a8\u56de\u586b\u65b9\u6cd5\uff1a youqu manage.py pms --send2task yes\n"},{"location":"#_4","title":"\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898","text":"\u7531\u540c\u5b66\u53ef\u80fd\u4f1a\u53d1\u73b0\uff0c\u600e\u4e48\u56de\u586b\u4e00\u6b21\u4e4b\u540e\uff0c\u540e\u9762\u60f3\u518d\u6b21\u56de\u586b\u5c31\u4e0d\u751f\u6548\u4e86\uff1b \u8fd9\u662f\u56e0\u4e3a\u4e3a\u4e86\u5e94\u5bf9\u524d\u9762\u63d0\u5230\u7684\u591a\u79cd\u6570\u636e\u56de\u586b\u7684\u65b9\u5f0f\uff0c\u5728 report \u76ee\u5f55\u4e0b\u4f1a\u7531 pms_xxx \u5f00\u5934\u7684\u76ee\u5f55\uff0c\u8bb0\u5f55\u4e86\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u548c\u56de\u586b\u60c5\u51b5\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u4e4b\u524d\u5df2\u7ecf\u56de\u586b\u8fc7\u4e86\uff0c\u540e\u7eed\u5c31\u4e0d\u4f1a\u518d\u6b64\u89e6\u53d1\u56de\u586b\u4e86\uff1b \u5982\u679c\u4f60\u60f3\u91cd\u65b0\u505a\u56de\u586b\uff0c\u4f60\u53ef\u4ee5\u628a report/pms_xxx \u76ee\u5f55\u5220\u6389\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u91cd\u65b0\u505a\u6570\u636e\u56de\u586b\u4e86\uff1b"},{"location":"#24-csv","title":"2.4. \u5bfc\u51fa CSV \u6587\u4ef6","text":"\u6846\u67b6\u63d0\u4f9b\u5bfc\u51fa\u6307\u5b9a\u6807\u7b7e\u7528\u4f8b\u7684\u529f\u80fd\uff1a youqu manage.py exportcsv -a deepin-album -t CICD\n \u8868\u793a\u5bfc\u51fa deepin-album \u7684\u7528\u4f8b\u4e2d\u6807\u8bb0\u4e86 CICD \u6807\u7b7e\u7684\u7528\u4f8b\uff0c\u5bfc\u51fa CSV \u6587\u4ef6\u7684\u5b57\u6bb5\u683c\u5f0f\u5df2\u7ecf\u9002\u914d\u4e86 CICD \u7684\u8981\u6c42\u3002"},{"location":"#25-app","title":"2.5. \u811a\u624b\u67b6\u65b0\u5efa APP \u5de5\u7a0b","text":"\u65b0\u5efa\u4e00\u4e2a APP \u5de5\u7a0b\uff1a youqu manage.py startapp autotest_deepin_some \u8fd9\u6837\u5728 apps \u76ee\u5f55\u4e0b\u4f1a\u521b\u5efa\u4e00\u4e2a\u5b50\u9879\u76ee\u5de5\u7a0b autotest_deepin_some\uff0c\u540c\u65f6\u65b0\u5efa\u597d\u5de5\u7a0b\u6a21\u677f\u76ee\u5f55\u548c\u6a21\u677f\u6587\u4ef6\uff1a apps\n\u2514\u2500\u2500 autotest_deepin_some\n \u00a0\u00a0 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_case.py\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 config.ini\n \u00a0\u00a0 \u251c\u2500\u2500 config.py\n \u00a0\u00a0 \u251c\u2500\u2500 conftest.py\n \u00a0\u00a0 \u251c\u2500\u2500 control\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_assert.py\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some.csv\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u2514\u2500\u2500 widget\n \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 case_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 other.ini\n \u00a0\u00a0 \u251c\u2500\u2500 other_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 pic_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2514\u2500\u2500 ui.ini\n autotest_deepin_some \u662f\u4f60\u7684\u5de5\u7a0b\u540d\u79f0\uff0c\u6bd4\u5982\uff1aautotest_deepin_music \uff1b \u5728\u6b64\u57fa\u7840\u4e0a\uff0c\u4f60\u53ef\u4ee5\u5feb\u901f\u7684\u5f00\u59cb\u4f60\u7684 AT \u9879\u76ee\u3002"},{"location":"#26","title":"2.6. \u7528\u4f8b\u6807\u7b7e\u81ea\u52a8\u540c\u6b65","text":"\u7528\u4e8e\u81ea\u52a8\u540c\u6b65 PMS \u7528\u4f8b\u6807\u7b7e\u6570\u636e\u81f3\u672c\u5730 CSV \u6587\u4ef6\uff0c\u4e3b\u8981\u901a\u8fc7\u4ee5\u4e0b\u51e0\u4e2a\u914d\u7f6e\u6765\u63a7\u5236\uff1a APP_NAME = # \u6307\u5b9a\u8981\u540c\u6b65\u7684\u5e94\u7528\u540d\u79f0\nPMS_USER = # PMS\u7684\u7528\u6237\u540d\nPMS_PASSWORD = # PMS\u7684\u5bc6\u7801\n \u5728 [csv_link_pms_id] \u8282\u70b9\u4e0b\u6307\u5b9a csv \u6587\u4ef6\u540d\u4e0e PMS \u7528\u4f8b\u6a21\u5757\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u6bd4\u5982\uff1a [csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/testcase-browse-53.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 53\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic = 53\n \u5c06\u4ee5\u4e0a\u4fe1\u606f\u914d\u7f6e\u597d\u4e4b\u540e\uff0c\u5728\u547d\u4ee4\u884c\u6267\u884c\uff1a youqu manage.py pms --pms2csv yes\n \u6bcf\u6b21\u6267\u884c\u65f6\u539f csv \u6587\u4ef6\u4f1a\u81ea\u52a8\u5907\u4efd\u5728 report/csv_back \u76ee\u5f55\u4e0b\uff0c\u56e0\u6b64\u4f60\u4e0d\u7528\u62c5\u5fc3\u811a\u672c\u6267\u884c\u5bfc\u81f4\u4f60\u7684\u6570\u636e\u4e22\u5931\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u57fa\u7840\u6846\u67b6\u8bbe\u8ba1\u65b9\u6848","text":"# ====================================\n# Author : Mikigo\n# Time : 2022/3/18\n# version \uff1a1.0\n# ====================================\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"\u505a\u4e00\u4e2a\u7b80\u5355\u3001\u597d\u7528\u3001\u529f\u80fd\u5f3a\u5927\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u3002 \u4f5c\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4e00\u4e2a\u57fa\u7840\u6846\u67b6\uff0c\u4efb\u4f55\u5e94\u7528\u90fd\u80fd\u5f88\u65b9\u4fbf\u7684\u63a5\u5165\u8fdb\u6765\uff1b \u63d0\u4f9b\u6240\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u9700\u8981\u7684\u5e95\u5c42\u529f\u80fd\uff0c\u5e76\u5bf9\u5916\u63d0\u4f9b\u552f\u4e00\u7684\u63a5\u53e3\uff0c\u65b9\u4fbf\u5e94\u7528\u5e93\u4f7f\u7528\uff1b \u6574\u5408\u516c\u5171\u5e93\uff0c\u51cf\u5c11\u5e94\u7528\u5e93\u4ee3\u7801\u91cf\u548c\u65b9\u6cd5\u7ef4\u62a4\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u8bbe\u8ba1\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u7edf\u4e00\u6982\u5ff5","text":" \u57fa\u7840\u6846\u67b6 \u672c\u9879\u76ee\u662f\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\uff08AutoTest Basic Frame\uff09\uff0c\u5168\u79f0\u4e3a\u201c\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff08AT \u57fa\u7840\u6846\u67b6\uff09\u201d\u3002 AT \u57fa\u7840\u6846\u67b6\u662f\u505a\u4e3a\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\u6765\u8bbe\u8ba1\u7684\uff0c\u5b83\u63d0\u4f9b\u4e86\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u57fa\u7840\u529f\u80fd\uff0c\u4efb\u4f55\u5e94\u7528\u63a5\u5165\u8fdb\u6765\u90fd\u80fd\u5feb\u901f\u65b9\u4fbf\u7684\u8fdb\u884c\u65b9\u6cd5\u548c\u7528\u4f8b\u7f16\u5199\uff0c\u540c\u65f6\u5728\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u3001\u6807\u7b7e\u5316\u6267\u884c\u3001\u5206\u5e03\u5f0f\u6267\u884c\u3001\u591a\u79cd\u62a5\u544a\u8f93\u51fa\u3001\u4f18\u7f8e\u7684\u6267\u884c\u65e5\u5fd7\u3001\u5931\u8d25\u81ea\u52a8\u5f55\u5c4f\u548c\u622a\u56fe\u3001\u81ea\u52a8\u73af\u5883\u6e05\u7406\u7b49\u7b49\uff0c\u5b83\u90fd\u63d0\u4f9b\u4e86\u5b8c\u5584\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u66f4\u91cd\u8981\u7684\u662f\u8fd9\u4e00\u5207\u4f7f\u7528\u8d77\u6765\u90fd\u975e\u5e38\u7b80\u5355\u3002 \u57fa\u7840\u6846\u67b6\u4e2d\u5305\u542b\u5e94\u7528\u5e93\uff08apps\uff09\u3001\u6838\u5fc3\u5e93\uff08src\uff09\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09\u3002 \u5e94\u7528\u5e93\uff08apps\uff09 \u5404\u4e2a\u5e94\u7528\u81ea\u5df1\u7684\u4ed3\u5e93\uff0c\u91cc\u9762\u4e3b\u8981\u5305\u542b\u7684\u662f\u7528\u4f8b\u3001\u65b9\u6cd5\u53ca\u4e00\u4e9b\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u53eb autotest-dde-file-manager \u3002 \u6838\u5fc3\u5e93\uff08src\uff09 \u6838\u5fc3\u5e93\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u5230\u6240\u6709\u5e95\u5c42\u6838\u5fc3\u529f\u80fd\uff0c\u8fd9\u662f\u6700\u91cd\u8981\u7684\u4e00\u4e2a\u90e8\u5206\uff0c\u7075\u9b42\u3002\u5177\u4f53\u529f\u80fd\u6a21\u5757\u53ca\u8bf4\u660e\u4f1a\u5728\u4e0b\u9762\u7b2c\u56db\u4e2a\u7ae0\u8282\u8be6\u7ec6\u63cf\u8ff0\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09 \u591a\u4e2a\u5e94\u7528\u90fd\u8981\u7528\u5230\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\uff0c\u6309\u7167\u5e94\u7528\u5212\u5206\u5b58\u653e\uff0c\u4e3b\u8981\u662f\u4e3a\u4e86\u51cf\u5c11\u4ee3\u7801\u91cf\uff0c\u6d88\u9664\u5e94\u7528\u95f4\u7684\u8026\u5408\u5173\u7cfb\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u67b6\u6784\u56fe","text":"\u6574\u4f53\u7684\u6846\u67b6\u8bbe\u8ba1\u5728\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u300b\u6587\u6863\u91cc\u9762\u5df2\u7ecf\u6709\u8be6\u7ec6\u63cf\u8ff0\u4e86\uff0c\u8fd9\u91cc\u8d34\u4e00\u4e0b\u6574\u4f53\u7684\u67b6\u6784\u56fe\uff1a \u4e3a\u4e86\u7a81\u663e\u672c\u6587\u7684\u91cd\u70b9\uff0c\u62bd\u53d6\u5176\u4e2d\u91cd\u8981\u529f\u80fd\u6a21\u5757\uff0c\u5982\u4e0b\u56fe\uff1a "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-basic-frame # \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\n\u251c\u2500\u2500 apps # \u5e94\u7528\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-dde-file-manager # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\uff08\u5e94\u7528\u5e93\u8be6\u7ec6\u76ee\u5f55\u7ed3\u6784\u8bf7\u770b\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\uff09\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 tag # \u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u2514\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u2502 \u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 xxx.png\n\u2502 \u2502 ...\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-deepin-music # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 public # \u516c\u5171\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget # dde_dock \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget # dde_desktop \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 src # \u6838\u5fc3\u5e93\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 button_center.py\n\u2502 \u251c\u2500\u2500 cmdtrl.py\n\u2502 \u251c\u2500\u2500 dogtails.py\n\u2502 \u251c\u2500\u2500 find_image.py\n\u2502 \u251c\u2500\u2500 global_config.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 setting # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 config.py\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 global_config.ini\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\u6a21\u5757\uff08Hook\uff09\n\u251c\u2500\u2500 pytest.ini # Pytest \u9ed8\u8ba4\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 docs # \u6587\u6863\u76ee\u5f55\n\u2514\u2500\u2500 manage.py # \u6267\u884c\u5668\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1apps","title":"1\u3001\u5e94\u7528\u5e93\uff08apps\uff09","text":"\u6240\u6709\u5e94\u7528\u5e93\u5747\u653e\u7f6e\u5728\u57fa\u7840\u6846\u67b6\u4e0b\u7684 apps \u76ee\u5f55\u4e0b\uff08\u89c1\u7b2c\u4e8c\u7ae0\u8282\u7b2c3\u6bb5\u76ee\u5f55\u7ed3\u6784\u5185\u5bb9\uff09\u3002\u5e94\u7528\u5e93\u7684\u67b6\u6784\u8bbe\u8ba1\u53ef\u4ee5\u53c2\u8003\u300aAT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b\u6587\u6863\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2src","title":"2\u3001\u6838\u5fc3\u5e93\uff08src\uff09","text":"\u5728 src \u76ee\u5f55\u4e0b\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u5e95\u5c42\u6838\u5fc3\u7ec4\u4ef6\uff0c\u901a\u5e38\u6765\u8bb2\u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5230\u5176\u4e2d\u67d0\u4e00\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4e48\u4f60\u9700\u8981\u663e\u793a\u7684\u5bfc\u5165\u8fd9\u4e2a\u6a21\u5757\uff0c\u7136\u540e\u624d\u80fd\u4f7f\u7528\u8be5\u6a21\u5757\u4e0b\u7684\u529f\u80fd\uff0c\u5982\u679c\u4f60\u7528\u5230\u4e86\u5341\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4f60\u5c31\u9700\u8981\u5bfc\u5165\u5341\u4e2a\u3002\u4f46\u662f\u6211\u4eec\u60f3\u8ba9\u4e8b\u60c5\u53d8\u5f97\u7b80\u5355\uff0c\u4e00\u6b21\u5bfc\u5165\uff0c\u4f7f\u7528\u6240\u6709\u3002 \u5c06\u6240\u6709\u7684\u529f\u80fd\u6a21\u5757\u90fd\u8fdb\u5165\u5230 src \u7684\u540d\u79f0\u7a7a\u95f4\uff0c\u5728 src/__init__.py \u91cc\u9762\u6211\u4eec\u8bbe\u8ba1\u6210\u8fd9\u6837\uff1a # src/__init__.py\nfrom .cmdctl import CmdCtl\nfrom .dogtails import Dogtail\nfrom .find_image import FindImage\nfrom .button_center import ButtonCenter\nclass Src(CmdCtl, FindImage):\ndef __init__(self, **kwargs):\n\"\"\"dogtail or button center param\n :param kwargs: app_name, desc, number\n \"\"\"\nif kwargs:\napp_name = kwargs.get(\"APP_NAME\")\ndesc = kwargs.get(\"DESC\")\nif app_name is None or desc is None:\nraise ValueError\nnumber = kwargs.get(\"number\")\nnumber = number if isinstance(number, int) else -1\n# \u5bf9\u8c61\u7ec4\u5408\nself.dog = Dogtail(app_name, desc, number)\nself.ui = ButtonCenter(app_name, number)\n \u9700\u8981\u4f20\u9012\u53c2\u6570\u7684\u91c7\u7528\u5bf9\u8c61\u7ec4\u5408\uff0c\u6ca1\u6709\u53c2\u6570\u7684\u4f7f\u7528\u7ee7\u627f\uff0c\u7ee7\u627f\u7684\u7c7b\u7b26\u5408 Mixin \u8bbe\u8ba1\u6a21\u5f0f\u3002 \u5e94\u7528\u5e93\u91cc\u9762\u4f7f\u7528\u7684\u65f6\u5019\u5728 widget/base_widget.py \u91cc\u9762\u53ea\u9700\u8981\u552f\u4e00\u7ee7\u627f Src \uff1a # \u5e94\u7528\u5e93\u91cc\u9762\u65b9\u6cd5\u57fa\u7c7b\n# widget/base_widget.py\nfrom src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n \u8981\u4f7f\u7528\u6838\u5fc3\u5e93\u7684\u529f\u80fd\uff0c\u53ea\u9700\u8981\u5199\u4e00\u4e2a\u5bfc\u5165 from src import Src \u5373\u53ef\u3002 \u5199 __init__ \u6784\u9020\u51fd\u6570\u7684\u539f\u56e0\u662f\u901a\u8fc7\u53c2\u6570\u6784\u9020\u5e94\u7528\uff0c\u5e76\u4e14\u4f20\u9012 number \u8fdb\u6765\uff0c\u53ef\u4ee5\u5b9e\u73b0\u591a\u7a97\u53e3\u7684\u63a7\u5236\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3public","title":"3\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09","text":"\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6bcf\u4e2a\u5e94\u7528\u90fd\u662f\u4e00\u4e2a\u5355\u72ec\u7684 py \u6587\u4ef6\uff0c\u76f8\u4e92\u4e4b\u95f4\u662f\u72ec\u7acb\u7684\uff0c\u6bcf\u4e2a py \u6587\u4ef6\u91cc\u9762\u662f\u8be5\u5e94\u7528\u7684\u65b9\u6cd5\u7c7b\uff0c\u6bd4\u5982\uff1a\u6700\u5e38\u7528\u7684\u65b9\u6cd5\u7c7b dde_desktop_public_widget.py # dde_desktop_widget.py\nfrom src import Src\nclass _DdeDesktopPublicBaseWidget(Src):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-desktop\"\nDESC = \"/usr/bin/dde-desktop\"\ndef __init__(self):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC)\nclass DdeDesktopPublicWidget(_DdeDesktopPublicBaseWidget):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u7c7b\"\"\"\ndef click_music_dir_by_ui(self):\n\"\"\"\u5728\u6587\u4ef6\u9009\u62e9\u6846\u70b9\u51fb\u97f3\u4e50\u76ee\u5f55\"\"\"\nself.click(*self.ui.btn_center(\"\u4fa7\u8fb9\u680f-\u97f3\u4e50\")) \ndef click_xxx_by_attr(self):\npass\n \u516c\u5171\u65b9\u6cd5\u5e93\u610f\u4e49\uff1a \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6240\u5c01\u88c5\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\u90fd\u662f\u81f3\u5c11\u88ab2\u4e2a\u5e94\u7528\u90fd\u7528\u5230\u7684\uff0c\u8fd9\u6837\u505a\u53ef\u4ee5\u51cf\u5c11\u6574\u4f53\u4ee3\u7801\u91cf\uff0c\u4ece\u800c\u51cf\u8f7b\u5e94\u7528\u5e93\u4ee3\u7801\u7684\u7ef4\u62a4\u5de5\u4f5c\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u7f16\u5199\u5f62\u5f0f\uff08\u547d\u540d\u89c4\u5219\u3001\u5b9a\u4f4d\u7684\u65b9\u6848\u5199\u6cd5\u3001\u6ce8\u91ca\u7684\u5199\u6cd5\u7b49\u7b49\uff09\u5177\u6709\u4e00\u5b9a\u7684\u6a21\u677f\u4f5c\u7528\uff0c\u8fd9\u6837\u5373\u4f7f\u662f\u5404\u4e2a\u5e94\u7528\u5e93\u90fd\u72ec\u7acb\u7ef4\u62a4\uff0c\u6240\u6709\u7684\u7f16\u7801\u98ce\u683c\u90fd\u662f\u8d8b\u4e8e\u76f8\u540c\u7684\uff0c\u56e0\u4e3a\u5927\u5bb6\u90fd\u5e94\u8be5\u53c2\u7167\u516c\u5171\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u5199\u6cd5\u6765\u5199\u81ea\u5df1\u5e94\u7528\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\u7c7b\uff0c\u8fd9\u6837\u4f7f\u5f97\u4ece\u516c\u53f8\u7684\u89d2\u5ea6\u53bb\u770b\u6240\u6709\u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u90fd\u662f\u7edf\u4e00\u7684\u3002 \u53ef\u4ee5\u901a\u8fc7\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\uff0c\u4e86\u89e3\u5230\u5176\u4ed6\u5e94\u7528\u7684\u529f\u80fd\uff0c\u5bf9\u4e8e\u6211\u4eec\u9700\u6c42\u7406\u89e3\uff0c\u4e86\u89e3\u7cfb\u7edf\u7684\u65b9\u65b9\u9762\u9762\u4e5f\u6709\u597d\u5904\u3002 \u5f53\u7136\uff0c\u5982\u679c\u4f60\u7684\u5e94\u7528\u672c\u8eab\u662f\u5c5e\u4e8e\u6839\u672c\u5c31\u4e0d\u9700\u8981\u548c\u5176\u4ed6\u5e94\u7528\u4ea4\u4e92\u7684\uff0c\u90a3\u4e48\u4f60\u53ef\u80fd\u4e0d\u4f1a\u7528\u5230\u8fd9\u91cc\u9762\u7684\u529f\u80fd\uff0c\u6ca1\u5173\u7cfb\uff0c\u4f60\u6240\u6709\u7684\u65b9\u6cd5\u90fd\u53ef\u4ee5\u76f4\u63a5\u5199\u5728\u5e94\u7528\u5e93\u7684\u4e1a\u52a1\u5c42\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4conftestpy","title":"4\u3001conftest.py","text":"conftest.py \u4ece\u529f\u80fd\u4e0a\u5c06\u662f\u5c5e\u4e8e\u6838\u5fc3\u5e93\uff08src\uff09\u7684\u5185\u5bb9\uff0c\u4f46\u662f\u7531\u4e8e\u5b83\u7684\u7279\u6b8a\u6027\uff0c\u5373\u5b83\u662f\u5bf9\u5e94\u7528\u5e93\u4e2d\u7684\u7528\u4f8b\u751f\u6548\u7684\uff0c\u800c\u4e14\u5b83\u7684\u4f5c\u7528\u57df\u662f\u5f53\u524d\u76ee\u5f55\u53ca\u4ee5\u4e0b\uff0c\u56e0\u6b64\u6211\u4eec\u5c06\u5b83\u653e\u5230\u9879\u76ee\u6839\u76ee\u5f55\u3002\u6211\u4eec\u6846\u67b6\u4e2d\u6709\u4e0d\u5c11\u6838\u5fc3\u529f\u80fd\u90fd\u662f\u5728\u8fd9\u91cc\u9762\u8fdb\u884c\u5f00\u53d1\u7684\uff0c\u540e\u9762\u7b2c\u56db\u7ae0\u4f1a\u8bb2\u5230\u7ec6\u8282\u3002 pytest.ini \u4f5c\u7528\u548c conftest.py \u7c7b\u4f3c\uff0c\u662f Pytest \u6846\u67b6\u7684\u56fa\u5b9a\u914d\u7f6e\u6587\u4ef6\uff0c\u76ee\u524d\u914d\u7f6e\u4e86\u4e00\u4e9b\u901a\u7528\u7684\u547d\u4ee4\u884c\u6267\u884c\u53c2\u6570\uff0c\u4e5f\u653e\u5728\u9879\u76ee\u6839\u76ee\u5f55\u3002 \u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 Hook \u51fd\u6570\uff0capps \u76ee\u5f55\u4e0b\u7684 \u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 fixture \u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5setting","title":"5\u3001setting","text":"\u5168\u5c40\u914d\u7f6e\u6a21\u5757\uff0c\u5305\u542b\u4e86\u4ee5\u4e0b\u914d\u7f6e\u6587\u4ef6\uff1a \uff081\uff09ini \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u914d\u7f6e\u4e00\u4e9b\u5168\u5c40\u7684\u914d\u7f6e\u9879\uff0c\u8b6c\u5982\uff1a\u5931\u8d25\u91cd\u8dd1\u6b21\u6570\u3001\u662f\u5426\u5931\u8d25\u5f55\u5c4f\u3001\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\u3001\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4\u3001\u6267\u884c\u65f6\u65e5\u5fd7\u7ea7\u522b\u3001\u751f\u6210\u7684\u62a5\u544a\u7c7b\u578b\u3001\u4ee5\u53ca\u5206\u5e03\u5f0f\u6267\u884c\u7684\u4e00\u4e9b\u7b56\u7565\u914d\u7f6e\u9879\u7b49\u7b49\u3002 \uff082\uff09config.py \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u63d0\u4f9b\u914d\u7f6e\u6587\u4ef6\u8bfb\u53d6\u3001\u52a8\u6001\u83b7\u53d6\u4e00\u4e9b\u5e38\u91cf\uff08\u5982\u9879\u76ee\u6839\u76ee\u5f55\u7edd\u5bf9\u8def\u5f84 (BASE_DIR)\u3001\u7cfb\u7edf\u67b6\u6784\uff08SYS_FRAME\uff09\u3001\u65f6\u95f4\u5b57\u7b26\u4e32\uff08strftime\uff09\u3001\u672c\u673a USERNAME IP \u7b49\u7b49\uff09\u3001\u516c\u5171 URL \u7b49\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u89c4\u8303","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u7248\u672c\u53ca\u4f9d\u8d56","text":"\u57fa\u7840\u6846\u67b6\u4f1a\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u8fdb\u884c\u7248\u672c\u53d1\u5e03\uff0c\u4e0d\u4e0e\u67d0\u4e2a\u5e94\u7528\u7248\u672c\u7ed1\u5b9a\uff0c\u4f46\u662f\uff0c\u5e94\u7528\u5e93\u4f1a\u4f9d\u8d56\u4e8e\u57fa\u7840\u6846\u67b6\u7684\u7248\u672c\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u5efa\u8bae\u5728\u5e94\u7528\u5e93\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a\u6587\u672c\u6587\u4ef6\u7528\u4e8e\u8bb0\u5f55\u6240\u4f9d\u8d56\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\uff0c\u7c7b\u4f3c\u4e8e\u5f00\u53d1\u5e94\u7528\u7684 debian/control \u6587\u4ef6\u7684\u529f\u80fd\uff0c\u4e3a\u4e86\u4fdd\u6301\u7edf\u4e00\uff0c\u8fd9\u4e2a\u6587\u4ef6\u5c31\u547d\u540d\u4e3a control\uff0c\u653e\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u6838\u5fc3\u5e93\u72ec\u7acb\u6027","text":"\u6838\u5fc3\u5e93\u4e0d\u5efa\u8bae\u9488\u5bf9\u67d0\u4e00\u4e2a\u5e94\u7528\u5355\u72ec\u505a\u4ee3\u7801\u4e0a\u7279\u6b8a\u5904\u7406\uff0c\u901a\u5e38\u8003\u8651\u9488\u5bf9\u67d0\u4e00\u79cd\u573a\u666f\u8fdb\u884c\u5904\u7406\uff0c\u8fd9\u4e9b\u573a\u666f\u901a\u5e38\u662f\u5b58\u5728\u4e00\u4e9b\u5171\u6027\u7684\u3002\u6bd4\u5982\u8bf4\uff1a\u684c\u9762\u7684ID\u5206\u914d\u5b58\u5728\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u903b\u8f91\u5904\u7406\u89e3\u51b3ID\u5206\u914d\u9519\u8bef\u7684\u95ee\u9898\uff0c\u4f46\u662f\u8fd9\u90e8\u5206\u903b\u8f91\u6211\u4eec\u4f1a\u5728\u684c\u9762\u7684\u65b9\u6cd5\u5c42\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u517c\u5bb9\u6027","text":"\u4e3a\u4e86\u4fdd\u6301\u517c\u5bb9\u6027\uff0c\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u539f\u5219\u4e0a\u4e0d\u5bf9\u8001\u65b9\u6cd5\u8fdb\u884c\u4fee\u6539\u6216\u5220\u9664\uff0c\u53ea\u8fdb\u884c\u65b0\u589e\u3002\u6d89\u53ca\u5230\u8001\u65b9\u6cd5\u4fee\u6539\u6216\u5220\u9664\u7684\uff0c\u4f1a\u8fdb\u884c\u63d0\u524d\u9884\u544a\uff0c\u5e76\u5728\u7b2c\u4e8c\u4e2a\u7248\u672c\u4e4b\u540e\uff08\u4e2d\u95f4\u4f1a\u9694\u4e00\u4e2a\u7248\u672c\u8fc7\u5ea6\uff09\u6b63\u5f0f\u5b9e\u65bd\u4fee\u6539\u6216\u5220\u9664\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u547d\u540d\u89c4\u8303","text":" \u7528\u4f8b ID \u6bcf\u4e2a\u5e94\u7528\u81ea\u5df1\u7ef4\u62a4\u4e00\u5957 ID\uff0c\u5728PMS\u4e0a\u7528\u4f8b\u6807\u9898\u4e0a\u5c06\u81ea\u52a8\u5316ID\u4ee5\u6807\u7b7e\u7684\u5f62\u5f0f\u5199\u5165\uff0c\u6bd4\u5982\uff1a[101]\u6253\u5f00-\u542f\u52a8\u5e94\u7528\u540edock\u53f3\u952e\u83dc\u5355 \u4e00\u4e2a\u7528\u4f8b\u7c7b\u91cc\u9762\u6709\u591a\u4e2a\u7528\u4f8b\u65f6\uff0c\u5728\u7528\u4f8b\u540d\u79f0\u540e\u9762\u52a0\u5e8f\u53f7\u3002 class TestFileManager(BaseCase):\n\"\"\"\u6587\u7ba1\u7528\u4f8b\"\"\"\ndef test_xxx_015_1(self):\npass\ndef test_xxx_015_2(self):\npass\n \u6ce8\u610f 015_1\uff0c\u4e0d\u8981\u5199015_01\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 PMS \u4e0a\u7684\u7528\u4f8bID\uff1a PMS \u4e0a\u662f6\u4f4d\u6570\uff0c\u4e0d\u591f\u76f4\u89c2\uff0c\u4e5f\u4e0d\u597d\u7ef4\u62a4\uff0c\u5728\u81ea\u52a8\u5316\u4e0b\u9762\u53bb\u627e\u4e00\u4e2a\u5e26\u6709 6 \u4f4d\u6570\u7684\u6587\u4ef6\u662f\u4e00\u4e2a\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 PMS \u4e0a\u7684 ID \u53ef\u80fd\u4f1a\u53d1\u751f\u53d8\u5316\uff0c\u6bd4\u5982\u5bfc\u51fa\u6765\u5bfc\u8fdb\u53bb\u7684\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u5b58\u5728\u95ee\u9898\uff0c\u5982\u679c\u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u8981\u60f3\u627e\u51fa\u6765\u5bf9\u5e94\u4fee\u6539\u81ea\u52a8\u5316\u7528\u4f8b ID\uff0c\u5c06\u4f1a\u662f\u4ef6\u975e\u5e38\u75db\u82e6\u7684\u4e8b\u60c5\u3002 \u51fd\u6570\u547d\u540d\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5de6\u952e\u70b9\u51fb click \u53f3\u952e\u70b9\u51fb right_click \u53cc\u51fb double_click \u79fb\u52a8 move_to \u62d6\u52a8 drag \u65b0\u5efa new \u62d6\u52a8\u5230 drag_to \u4ece\u54ea\u91cc\u62d6\u52a8\u5230\u54ea\u91cc drag_something_from_xxx_to_xxx \u83b7\u53d6 get \u83b7\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5750\u6807 get_location \u975e\u7279\u6b8a\u6587\u4ef6 file word\u6587\u4ef6 doc text\u6587\u4ef6 text \u6587\u4ef6\u5939 dir \u5173\u952e\u8bcd\u6301\u7eed\u589e\u52a0 \u5e38\u91cf\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5e94\u7528\u540d\u79f0 APP_NAME \u5e94\u7528\u63cf\u8ff0 DESC \u672c\u5e94\u7528\u4ee5\u5916\u7684\u5176\u4ed6\u5e94\u7528\uff0c\u6bd4\u5982\u5e2e\u52a9 HELP \u5176\u4ed6\u540d\u79f0\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u65b9\u6cd5\u5305\u540d widget \u65b9\u6cd5\u6587\u4ef6\u540d\uff08\u6587\u7ba1\u4e3e\u4f8b\uff09 dfm_widget.pytitle_widget.pyright_view_widget.pyleft_view_widget.pypop_widget.pybase_widget.pydfm_assert.py \u65ad\u8a00\u8bed\u53e5\u547d\u540d\u89c4\u8303 \u65ad\u8a00\u8bed\u53e5\u90fd\u662f\u4ee5 assert \u5f00\u5934 \u65ad\u8a00 \u8bed\u53e5 \u5224\u65ad\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_existsassert_file_not_exists \u5224\u65ad\u684c\u9762\u76ee\u5f55\u4e0b\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_exists_in_desktopassert_file_not_exists_in_desktop \u5224\u65ad\u56fe\u7247\u5b58\u5728 assert_image_existsassert_image_not_exists \u5224\u65ad\u5f71\u9662\u4e2d\u662f\u5426\u5b58\u5728\u56fe\u7247 assert_image_exists_in_movieassert_image_not_exists_in_movie \u5224\u65ad\u5143\u7d20\u662f\u5426\u5b58\u5728 assert_element_existassert_element_not_exist \u5224\u65ad\u662f\u5426\u76f8\u7b49 assert_equalassert_not_equal \u5224\u65ad\u662f\u5426\u4e3a\u771f assert_trueassert_false"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5fixture","title":"5\u3001fixture \u89c4\u8303","text":"\u7531\u4e8e Pytest \u6846\u67b6\u4e2d\u652f\u6301 fixture \u7684\u5199\u6cd5\u548c Xunit \u5199\u6cd5\u7684\uff0c\u6240\u4ee5\u5e94\u7528\u5e93\u4e2d\u53ef\u80fd\u5b58\u5728\u6df7\u7528\u7684\u60c5\u51b5\uff0c\u4e3a\u7edf\u4e00\u7f16\u7801\u98ce\u683c\u65b9\u4fbf\u540e\u7eed\u7528\u4f8b\u4ee3\u7801\u7ef4\u62a4\uff0c\u73b0\u505a\u4ee5\u4e0b\u89c4\u8303\u8bf4\u660e\uff1a \u629b\u5f03 Xunit \u7684\u5199\u6cd5\uff0c\u7edf\u4e00\u91c7\u7528 Pytest fixture \u7684\u5199\u6cd5\u3002 \u5e94\u7528\u5185 fixture \u8c28\u614e\u4f7f\u7528 autouse=True \uff0c\u975e\u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u975e\u5e38\u4e0d\u5efa\u8bae\u4f7f\u7528\u8fd9\u4e2a\u53c2\u6570\u3002 \u8c03\u7528 fixture \u4e0d\u80fd\u4f7f\u7528 @pytest.mark.usefixture()\uff0c\u4f7f\u7528\u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u4f20\u5165\u51fd\u6570\u5bf9\u8c61\u3002 \u5efa\u8bae\u5728\u4e00\u4e2a conftest.py \u91cc\u9762\u53bb\u5199\uff0c\u4e00\u4e2a\u5e94\u7528\u4e5f\u5c3d\u91cf\u7ef4\u62a4\u4e00\u4e2a conftest.py\u6587\u4ef6\u3002 fixture \u4e5f\u9700\u8981\u5199\u529f\u80fd\u8bf4\u660e\uff0c\u51fd\u6570\u540d\u79f0\u8981\u6709\u5177\u4f53\u542b\u4e49\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#6","title":"6\u3001\u65b9\u6cd5\u7f16\u5199\u89c4\u8303","text":" \u65b9\u6cd5\u7c7b\u578b\uff1a if \u6ca1\u6709\u7528\u5230\u5b9e\u4f8b\u5bf9\u8c61\uff1a\nif \u6ca1\u6709\u7528\u5230\u7c7b\u5bf9\u8c61\uff1a\n\u5199\u9759\u6001\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @staticmethod\nelse\uff1a\n\u5199\u7c7b\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @classmethod\nelse:\n\u76f4\u63a5\u5199\u5b9e\u4f8b\u65b9\u6cd5\n \u4e3e\u4f8b: class TitleWidget:\ndef click_xxx_by_ui(self):\npass\n@staticmethod\ndef click_xxx_by_ui():\npass\n@classmethod\ndef click_xxx_by_ui(cls):\npass\n \u51fd\u6570\u540d\u79f0\u4e0d\u51fa\u73b0\u6570\u5b57\uff0c\u9700\u8981\u8868\u793a\u6570\u91cf\u7684\u7528\u5355\u8bcd\u8868\u793a\u3002 \u51fd\u6570\u529f\u80fd\u6ce8\u91ca\u3002 \u6ca1\u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg2:xxx\n\"\"\"\n \u6709\u53c2\u6570\uff0c\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg1:xxx\nreturn: xxx\n\"\"\"\n \u200b \u7528 Pycharm \u7684\u6ce8\u91ca\u6a21\u677f\u4e5f\u53ef\u4ee5\uff0c\u53ea\u8981\u4f53\u73b0\u4e86\u53c2\u6570\u7684\u7c7b\u578b\u548c\u8fd4\u56de\u5c31\u884c\u4e86\u3002 \u6682\u4e0d\u8981\u6c42\u5199\u7c7b\u578b\u6ce8\u89e3\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#7case","title":"7\u3001\u7528\u4f8b\uff08case\uff09\u89c4\u8303","text":" \u4ee5\u7c7b\u7684\u5f62\u5f0f\u5199\u7528\u4f8b\uff0c\u7528\u4f8b\u7c7b\u96c6\u6210\u7528\u4f8b\u57fa\u7c7b\u3002 \u7528\u4f8b\u7c7b\u9700\u8981\u5199\u6ce8\u91ca\u3002 \u6d4b\u8bd5\u7528\u4f8b\u51fd\u6570\u8bf4\u660e\uff08\u5efa\u8bae\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u540d\u79f0\uff09 \"\"\"\u53f3\u4fa7\u9884\u89c8-\u56fe\u7247\u7c7b\u578b\u4fe1\u606f\u680f\u57fa\u672c\u4fe1\u606f\"\"\"\n \u4e0d\u5199\u8c03\u8bd5\u4ee3\u7801 if __name__ == '__main__':\npytest.main()\n \u6240\u6709\u7528\u4f8b\u90fd\u7ee7\u627f BaseCase\u3002 BaseCase \u91cc\u9762\u653e\u4e00\u4e9b\u6d4b\u8bd5\u6570\u636e\u7684\u5e38\u91cf\uff0c\u6bd4\u5982\u6587\u4ef6\u540d\u79f0\uff0c\u5e94\u7528\u540d\u79f0\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u4e00\u4e9b\u901a\u7528\u7684\u5b57\u7b26\u4e32\u3002 \u8fd9\u7c7b\u662f\u5c5e\u4e8e\u6d4b\u8bd5\u6570\u636e\u3002 class BaseCase(DfmAssert):\n\"\"\"\u7528\u4f8b\u57fa\u7c7b\"\"\"\nNEW_FILE = \"\u65b0\u5efa\u6587\u672c.txt\"\nTEST_FILE = \"test.txt\"\nNEW_DIR = \"\u65b0\u5efa\u6587\u4ef6\u5939\"\nNEW_WORD = \"\u65b0\u5efaWord\u6587\u6863.doc\"\nAPP_HELP = \"damn\"\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\n\"\"\"\u7528\u4f8b\u6807\u9898\uff08\u590d\u5236PMS\u4e0a\u7528\u4f8b\u6807\u9898\uff09\"\"\"\ndfm = DfmWidget()\ndfm.click_xxx_by_attr(self.NEW_FILE)\ndfm.new_file_in_desktop_by_cmd(self.NEW_FILE)\nself.assert_true(dfm.get_process_status(self.APP_NAME))\n \u7528\u4f8b\u91cc\u9762\u5c3d\u91cf\u51cf\u5c11\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\uff0c\u66f4\u8981\u51cf\u5c11\u76f8\u540c\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\u3002 \u7edf\u4e00\u6587\u4ef6\u6ce8\u91ca\u5934\u3002 #!/usr/bin/env python3\n# _*_ coding:utf-8 _*_\n\"\"\"\n:Author:email@uniontech.com\n:Date :${DATE} ${TIME}\n\"\"\"\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#8","title":"8\u3001\u5176\u4ed6\u89c4\u8303","text":" \u65e5\u5fd7\u6253\u5370\u8981\u5728\u65b9\u6cd5\u6700\u524d\u9762\uff0c\u5426\u5219\u4ee3\u7801\u62a5\u9519\u6ca1\u6709\u65e5\u5fd7\u8f93\u51fa\uff0c\u4e0d\u597d\u5b9a\u4f4d\u95ee\u9898\u3002\uff08\u6211\u4eec\u4f1a\u8003\u8651\u7ee7\u7eed\u4f7f\u7528\u62e6\u622a\u5668\u6253\u5370\u65e5\u5fd7\uff09 \u6240\u6709\u7684\u64cd\u4f5c\u90fd\u9700\u8981\u6709\u65e5\u5fd7\uff0c\u5305\u62ec sleep()\uff0c\u6211\u4eec\u4f1a\u91cd\u5199\u4e00\u4e2a\u6709\u65e5\u5fd7\u8f93\u5165\u7684 sleep\u3002 \u4e1a\u52a1\u5c42\u65e5\u5fd7\u7ea7\u522b\u4e3a INFO\u3002 hook \u51fd\u6570\u53ea\u80fd\u5199\u5230\u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u91cc\u9762\u3002 apps \u76ee\u5f55\u4e0b\u7684 conftest.py \u539f\u5219\u4e0a\u4e0d\u4f1a\u65b0\u589e fixture\u3002 \u56fa\u5b9a\u76ee\u5f55\u6216\u5143\u7d20\u63a7\u4ef6\u7684\u64cd\u4f5c\uff0c\u5c06\u64cd\u4f5c\u65b9\u6cd5\u5199\u6b7b\uff0c\u6587\u4ef6\u7c7b\u64cd\u4f5c\u5c06\u6587\u4ef6\u540d\u7559\u53c2\u6570\u3002 \u8def\u5f84\u62fc\u63a5\u89c4\u8303\uff1a \u7cfb\u7edf\u4e2d\u56fa\u5b9a\u76ee\u5f55\uff0c\u8def\u5f84\u62fc\u63a5\u65f6\u4f7f\u7528\u6ce2\u6d6a\u7b26\u53f7\uff0c\u6bd4\u5982\uff1a~/Desktop/\uff0c\u4e0b\u5c42\u4f7f\u7528 os.path.expanduser()\uff0c\u5b83\u53ef\u4ee5\u81ea\u52a8\u8bc6\u522b\u6ce2\u6d6a\u7b26\u53f7\u3002 \u9879\u76ee\u4e0b\u8def\u5f84\u4f7f\u7528\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u8def\u5f84\uff0c\u6bd4\u5982\uff1aConfig.BASE_PATH\uff0c\u56e0\u4e3a\u9879\u76ee\u662f\u53ef\u4ee5\u5728\u4efb\u610f\u8def\u5f84\u8fd0\u884c\u7684\uff0c\u9700\u8981\u52a8\u6001\u62fc\u63a5\u8def\u5f84\u3002 "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848","text":"# =================================================\n# Author : Mikigo\n# Time : 2022/3/16\n# version \uff1a1.0\n# =================================================\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"AT \u5e94\u7528\u5e93\u6539\u9020\u662f\u57fa\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u8fdb\u884c\u7528\u4f8b\u65b9\u6cd5\u548c\u4e1a\u52a1\u903b\u8f91\u7684\u91cd\u65b0\u8bbe\u8ba1\uff0c\u4ee5\u5b9e\u73b0\u5e94\u7528\u5e93\u9ad8\u6548\u7684\u7f16\u5199\u3001\u7ef4\u62a4\u7528\u4f8b\u53ca\u5176\u65b9\u6cd5\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u6587\u4ef6\u7ba1\u7406\u5668\u4ece\u4e1a\u52a1\u590d\u6742\u5ea6\u548c\u7528\u4f8b\u91cf\u6765\u8bb2\uff0c\u5728\u7cfb\u7edf\u6240\u6709\u5e94\u7528\u4e2d\uff0c\u662f\u5f88\u6709\u4ee3\u8868\u6027\u7684\uff0c\u96be\u5ea6\u4e5f\u662f\u6700\u5927\u7684\uff0c\u56e0\u6b64\u6211\u4eec\u9009\u53d6\u6587\u4ef6\u7ba1\u7406\u5668\u4f5c\u4e3a\u5e94\u7528\u5e93\u6539\u9020\u7684\u5b9e\u9a8c\u5e94\u7528\uff0c\u7ed9\u540e\u7eed\u5176\u4ed6\u5e94\u7528\u6539\u9020\u63d0\u4f9b\u5207\u5b9e\u53ef\u884c\u7684\u601d\u8def\u548c\u65b9\u6848\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u5206\u5c42\u8bbe\u8ba1\u56fe","text":"\u6574\u4f53\u4ecd\u7136\u9075\u5faa PO \u8bbe\u8ba1\u7406\u5ff5\uff0c\u6839\u636e\u4e1a\u52a1\u9700\u8981\uff0c\u5c06\u6587\u7ba1\u4e1a\u52a1\u5c42\u8fdb\u884c 3 \u5c42\u5212\u5206\uff1a "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-dde-file-manager # \u5e94\u7528\u4ed3\u5e93\n\u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 test_xxx_001.py\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u00a0\u251c\u2500\u2500 __init__.py\n\u2502 \u00a0\u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u00a0\u251c\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u00a0\u251c\u2500\u2500 base_widget.py # \u65b9\u6cd5\u57fa\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 title_widget.py # title \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 right_view_widget.py # right view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 left_view_widget.py # left view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 pop_widget.py # pop \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 dfm_widget.py # \u65b9\u6cd5\u7684\u7edf\u4e00\u51fa\u53e3\n\u2502 \u00a0\u2514\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 tag # \u7528\u4f8b\u6807\u7b7e\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 xxx.csv # \u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2514\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u57fa\u7c7b","text":" \u7ee7\u627f\u6838\u5fc3\u5c42\u7684\u5404\u4e2a\u6a21\u5757\u7c7b\u3002 \u62bd\u53d6\u64cd\u4f5c\u5c42\u7684\u4e00\u4e9b\u57fa\u7840\u65b9\u6cd5\u3002 \u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u7684\u4e00\u4e9b\u516c\u5171\u65b9\u6cd5\u3002 \u8def\u5f84\u7ec4\u88c5\u65b9\u6cd5\u3002 \u4e00\u4e9b\u4e1a\u52a1\u5c42\u76f8\u5173\u7684\u53d8\u91cf\u3001\u5e38\u91cf\u3001shell\u547d\u4ee4\u3001\u5750\u6807\u3002 \u65b9\u6cd5\u57fa\u7c7b\u7684\u5199\u6cd5\uff1a from src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u64cd\u4f5c\u5c42","text":" \u6a21\u5757\u5212\u5206 \u6309\u7167\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u6587\u7ba1\u4e3b\u754c\u9762\u5206\u4e3a\u4e09\u4e2a\u533a\u57df\uff1a\u6807\u9898\u680f\u3001\u53f3\u8fb9\u89c6\u56fe\u533a\u57df\u3001\u5de6\u8fb9\u89c6\u56fe\u533a\u57df \u5f39\u7a97\uff1a\u8bbe\u7f6e\u754c\u9762\u5f39\u7a97\u3001\u4fdd\u9669\u7bb1\u5f39\u7a97\u3001\u5220\u9664\u786e\u8ba4\u5f39\u7a97\u3001\u53ca\u5404\u79cd\u7f51\u7edc\u5f39\u7a97 \u53f3\u952e\u83dc\u5355\uff1a\u6682\u65f6\u4e0d\u8003\u8651\u4e3a\u5355\u72ec\u7684\u6a21\u5757\uff0c\u8003\u8651\u4ee5\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6848\u505a\u6210\u516c\u5171\u5e93\u3002 \u5404\u4e2a\u6a21\u5757\u53ea\u7ee7\u627f\u57fa\u7c7b from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u6784\u9020\u51fd\u6570\u91cc\u9762\u4e0d\u6784\u9020\u5bf9\u8c61\uff0c\u53ef\u4ee5\u521d\u59cb\u5316\u4e00\u4e9b\u53d8\u91cf\u3002 \u4e0d\u540c\u7684\u5b9a\u4f4d\u65b9\u6848\u8c03\u7528\u4e0d\u540c\u7684\u5b9a\u4f4d\u5de5\u5177\u5bf9\u8c61\u3002 self.dog\nself.ui\nself.d_bus\n \u65b9\u6cd5\u7f16\u5199 \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u5e94\u7528\u5c42","text":" \u7ee7\u627f\u64cd\u4f5c\u5c42\u7684\u6240\u6709\u7c7b\u3002 \u4ec5\u4ec5\u7528\u4e8e\u7528\u4f8b\u4e2d\u5bfc\u5165\u65b9\u4fbf\uff0c\u4e0d\u505a\u5176\u4ed6\u4e8b\u60c5\u3002 class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n DfmAssert \u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u7ee7\u627f\uff0c\u65b9\u4fbf\u4f7f\u7528\u65ad\u8a00\u8bed\u53e5\u3002 from apps.dde_file_manager.widget.dfm_widget import DfmWidget\nfrom public.assert import Assert\nclass DfmAssert(Assert):\ndef assert_file_exists_in_desktop(self, file_name):\nself.assert_file_exists(f\"~/Desktop{file_name}\")\n...\nDfmWidget().get_file_in_desktop()\n \u7528\u4f8b\u91cc\u9762\u76f4\u63a5\u7ee7\u627f\uff0c\u65b9\u4fbf\u5728\u7528\u4f8b\u91cc\u9762\u4f7f\u7528 self \u8fdb\u884c\u65ad\u8a00\uff0c\u66f4\u7b26\u5408\u65ad\u8a00\u7684\u4f7f\u7528\u4e60\u60ef\uff0c\u7528\u4f8b\u903b\u8f91\u4e0a\u66f4\u6e05\u695a\u3002 class BaseCase(DfmAssert):\npass\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\nself.assert_file_exists_in_desktop(\"xxx\")\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u903b\u8f91\u4e3e\u4f8b","text":"\u7528\u4f8b\u4ee3\u7801\u8c03\u7528\u903b\u8f91\u4e3e\u4f8b\uff1a # BaseWidget\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n# =============================================\n# TitleWidget\nclass TitleWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_title_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# RightViewWidget\nclass RightViewWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_right_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# =============================================\n# \u51fa\u53e3 DfmWidget\nclass DfmWidget(TitleWidget, RightViewWidget):\npass\n# =============================================\n# in case\nfrom apps.dde_file_manager.widget.dfm_widget import DfmWidget\ndfm = DfmWidget()\ndfm.click_xxx_title_by_ui()\ndfm.click_xxx_right_by_ui()\ndfm.dog.print_desc()\ndfm.ui.print_number()\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u5de5\u7a0b\u6539\u9020\u5b9e\u65bd\u6b65\u9aa4","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_2","title":"1\u3001\u5de5\u7a0b\u4ee3\u7801\u62c9\u53d6","text":"1.1. \u5c06\u81ea\u52a8\u5316\u57fa\u7840\u6846\u67b6\u7684\u529f\u80fd\u62c9\u5230\u672c\u5730 Autotest Basic Frame \uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame 1.2. \u5c06\u5e94\u7528\u5e93\u4ee3\u7801\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u5e94\u7528\u5e93\u7684\u4ed3\u5e93\u547d\u540d\u5e94\u8be5\u662f\u957f\u8fd9\u6837\u7684 autotest_deepin_xxx\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_2","title":"2\u3001\u8c03\u6574\u5de5\u7a0b\u76ee\u5f55","text":"\u6309\u7167 \u65b9\u6848\u8bbe\u8ba1-\u76ee\u5f55\u7ed3\u6784 \u8fdb\u884c\u76ee\u5f55\u8c03\u6574\uff0c\u5c3d\u91cf\u4f7f\u7528\u7f16\u8f91\u5668\u8fdb\u884c\u76f8\u5e94\u7684\u8c03\u6574\uff0c\u7f16\u8f91\u5668\u63a8\u8350\u4f7f\u7528 Pycharm \uff0c\u4ee5\u4e0b\u64cd\u4f5c\u5747\u5728 Pycharm \u91cc\u9762\u53ef\u5b9e\u73b0\u3002 2.1. \u9700\u8981\u79fb\u52a8 py \u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u76f4\u63a5\u5728\u7f16\u8f91\u5668\u91cc\u9762\uff0c\u4f7f\u7528\u9f20\u6807\u9009\u4e2d\u5e76\u6309\u4f4f\uff0c\u4e4b\u540e\u62d6\u52a8\u5230\u76ee\u6807\u4f4d\u7f6e\u5373\u53ef\uff0cPycharm \u4f1a\u5c3d\u53ef\u80fd\u7684\u81ea\u52a8\u89e3\u51b3\u79fb\u52a8\u5bfc\u81f4\u7684\u8def\u5f84\u95ee\u9898\u3002\u6ce8\u610f\uff0c\u6211\u8bf4\u7684\u662f\u201c\u5c3d\u53ef\u80fd\u201d\uff0c\u6709\u4e9b\u9a9a\u64cd\u4f5c\u7f16\u8f91\u5668\u662f\u65e0\u6cd5\u81ea\u52a8\u5904\u7406\u7684\u3002\u5982\u679c\u6ca1\u6709\u88ab\u7f16\u8f91\u5668\u81ea\u52a8\u5904\u7406\u7684\u8def\u5f84\u95ee\u9898\uff0c\u540e\u7eed\u53ea\u80fd\u624b\u52a8\u89e3\u51b3\u3002 2.2. \u9700\u8981\u91cd\u547d\u540d\u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u5728\u7f16\u8f91\u5668\u91cc\u9762\u9009\u4e2d\u6587\u4ef6\uff0c\u7136\u540e\u4f7f\u7528\u5feb\u6377\u952e Shift + F6 \uff08\u5982\u679c\u5feb\u6377\u952e\u6ca1\u53cd\u5e94\uff0c\u6587\u4ef6\u53f3\u952e\u83dc\u5355 Refactor \u2014\u2014 Rename\uff09\uff0c\u7136\u540e\u5728\u8f93\u5165\u6846\u4e2d\u8f93\u5165\u8981\u91cd\u547d\u540d\u7684\u540d\u79f0\uff0c\u540c\u65f6\uff0c\u786e\u8ba4\u52fe\u9009 Search for references \u548c Search in comments and strings \u8fd9\u4e24\u4e2a\u9009\u9879\uff0c\u6700\u540e\u6309\u56de\u8f66\u6216\u8005\u9f20\u6807\u70b9 Refactor \u3002 \u6ce8\u610f\uff0c\u6b64\u65f6\u7f16\u8f91\u5668\u53ef\u80fd\u4f1a\u63d0\u793a\u4f60\uff0c\u4f60\u8fd9\u4e2a\u91cd\u547d\u540d\u7684\u64cd\u4f5c\u5173\u8054\u4e86\u591a\u4e2a\u6a21\u5757\uff0c\u5b83\u88ab\u591a\u4e2a\u5730\u65b9\u90fd\u4f7f\u7528\u5230\u4e86\uff0c\u76f8\u5173\u7684\u6a21\u5757\u662f\u5426\u4e5f\u4e00\u8d77\u6539\u540d\u4e86\uff0c\u8fd9\u4e0d\u5e9f\u8bdd\u5417\uff0c\u7528\u8fd9\u4e2a\u529f\u80fd\u5c31\u662f\u60f3\u628a\u5173\u8054\u5230\u7684\u90fd\u4fee\u6539\uff0c\u4e0d\u7136\u6211\u4e3a\u4ec0\u4e48\u4e0d\u7528\u6587\u7ba1\u7684\u91cd\u547d\u540d\u529f\u80fd\u5462\uff0c\u522b\u60f3\u4e86\uff0c\u76f4\u63a5\u70b9\u5de6\u4e0b\u89d2\u7684 Refactor \u6309\u94ae\uff0c\u5c31\u662f\u5e72\u3002 \u7c7b\u540d\u3001\u51fd\u6570\u540d\u7684\u91cd\u547d\u540d\u90fd\u5c3d\u91cf\u91c7\u7528\u8fd9\u79cd\u65b9\u6848\uff0c\u56e0\u4e3a\u7f16\u8f91\u5668\u4f1a\u81ea\u52a8\u7ed9\u6211\u4eec\u627e\u5230\u5173\u8054\u7684\u5730\u65b9\uff0c\u7136\u540e\u540c\u6b65\u4fee\u6539\u6389\u3002\u4f60\u53ef\u5343\u4e07\u522b\u76f4\u63a5\u5220\u4e86\u4fee\u6539\u540d\u79f0\uff0c\u4e0d\u7136\u4f60\u53ef\u80fd\u4f1a\u82b1\u4e0a\u4e00\u5929\u7684\u65f6\u95f4\u6765\u89e3\u51b3\u91cd\u547d\u540d\u7684\u95ee\u9898\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u5b9e\u73b0\u6838\u5fc3\u5e93\u63a5\u53e3","text":"3.1. BaseWidget \u5728 BaseWidget \u91cc\u9762\u628a\u8be5\u5199\u7684\u90fd\u5199\u597d\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u4e0a\u9762\u7684\u8bbe\u8ba1\u7406\u5ff5\u6765\u5199\u3002 \u5982\u679c\u4f60\u5acc\u9ebb\u70e6\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u6587\u7ba1\u7684\u5b9e\u9645\u5de5\u7a0b\u4ee3\u7801 autotest_dde_file_manager : https://gerrit.uniontech.com/admin/repos/autotest_dde_file_manager \u3002 3.2. \u64cd\u4f5c\u5c42 \u5982\u679c\u4f60\u662f\u65b0\u5199\u9879\u76ee\uff0c\u4f60\u4f1a\u53d1\u73b0\u4e00\u5207\u90fd\u662f\u90a3\u4e48\u7684\u7b80\u5355\u3001\u76f4\u63a5\uff0c\u6309\u7167\u6211\u4eec\u63d0\u4f9b\u7ed9\u4f60\u7684\u63a5\u53e3\u5199\u7528\u4f8b\u7684\u64cd\u4f5c\u65b9\u6cd5\u5c31\u597d\u4e86\u3002 \u5982\u679c\u4f60\u662f\u60f3\u5bf9\u539f\u6765\u7684\u5de5\u7a0b\u8fdb\u884c\u6539\u9020\uff0c\u4f60\u9700\u8981\u6309\u7167\u6838\u5fc3\u5e93\u65b9\u6cd5\u7684\u8c03\u7528\uff0c\u5c06\u4f60\u4e4b\u524d\u5199\u7684\u6bcf\u4e2a\u65b9\u6848\u8fdb\u884c\u5bf9\u5e94\u7684\u4fee\u6539\uff0c\u5305\u62ec\u7c7b\u548c\u65b9\u6cd5\u7684\u547d\u540d\u3001\u65b9\u6cd5\u5185\u6240\u8981\u7528\u5230\u4e0d\u540c\u5b9a\u4f4d\u65b9\u6cd5\u7684\u5199\u6cd5\u4fee\u6539\u3002 \u8fd9\u65f6\u5019\u4f60\u53ef\u80fd\u4f60\u7684\u4ee3\u7801\u4e2d\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u62a5\u9519\uff0c\u4e0d\u7528\u62c5\u5fc3\uff0c\u4f60\u53ef\u4ee5\u4ece\u4e1a\u52a1\u903b\u8f91\u51fa\u53d1\uff0c\u60f3\u6e05\u695a\u8fd9\u4e2a\u65b9\u6cd5\u662f\u5e72\u4ec0\u4e48\u7684\u3001\u64cd\u4f5c\u7684\u5bf9\u8c61\u662f\u4ec0\u4e48\u3001\u53c2\u6570\u662f\u4ec0\u4e48\uff0c\u6ce8\u610f\u8fd9\u4e9b\u4fee\u6539\u662f\u4f1a\u5f71\u54cd\u5230\u7528\u4f8b\u4ee3\u7801\u91cc\u9762\u7684\uff0c\u6ca1\u5173\u7cfb\uff0c\u7528\u4f8b\u91cc\u9762\u672c\u6765\u4e5f\u5e94\u8be5\u88ab\u5173\u8054\u4fee\u6539\u3002 3.3. \u628a\u914d\u7f6e\u6a21\u5757\u5199\u597d\uff0c\u8fd9\u90e8\u5206\u57fa\u672c\u53ef\u4ee5\u590d\u5236\u6587\u7ba1\u7684\u4ee3\u7801\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4_1","title":"4\u3001\u8def\u5f84\u5904\u7406","text":"4.1. \u5bfc\u5165\u8def\u5f84 \u65b9\u6cd5\u548c\u7528\u4f8b\u4e2d\u90fd\u4f1a\u6d89\u53ca\u5230\u5bfc\u5165\u8def\u5f84\u7684\u4fee\u6539\uff0c\u5728\u4fee\u6539\u8def\u5f84\u65f6\uff0c\u5efa\u8bae\u4f60\u4f7f\u7528 Ctrl + Shift + R \u5168\u5c40\u66ff\u6362\uff0c\u4f1a\u5c06\u6574\u4e2a\u9879\u76ee\u4e0b\u7684\u76f8\u540c\u5730\u65b9\u90fd\u4fee\u6539\u5230\uff0c\u5f53\u7136\uff0c\u4f60\u4e5f\u53ef\u4ee5\u5728\u5c0f\u5f39\u7a97\u4e2d\u4fee\u6539\u5168\u5c40\u66ff\u6362\u4e3a\u5c40\u90e8\u76ee\u5f55\u4e0b\u66ff\u6362\u3002\u5904\u7406\u90a3\u79cd\u6ca1\u6709\u5173\u8054\u5173\u7cfb\uff0c\u4f46\u662f\u53c8\u662f\u76f8\u540c\u540d\u79f0\u7684\u91cd\u547d\u540d\uff0c\u6211\u4e5f\u63a8\u8350\u4f7f\u7528\u8fd9\u79cd\u65b9\u5f0f\u8fdb\u884c\u91cd\u547d\u540d\u3002 \u6ce8\u610f\uff0c\u5168\u5c40\u66ff\u6362\u7684\u65b9\u5f0f\u4efb\u7136\u65e0\u6cd5\u4fdd\u8bc1\u771f\u7684\u5168\u5c40\u88ab\u66ff\u6362\u4e86\uff08\u53ef\u80fd\u662f\u7f16\u8f91\u5668\u7684 Bug \u5427\uff09\uff0c\u6240\u4ee5\u4f60\u4ecd\u7136\u9700\u8981\u624b\u52a8\u770b\u4e0b\u5404\u5904\u662f\u5426\u4fee\u6539\u5230\u4f4d\u3002 4.2. \u8d44\u6e90\u8def\u5f84 \u4e00\u4e9b\u7528\u4f8b\u8d44\u6e90\u9700\u8981\u6839\u636e config.py \u91cc\u9762\u7684\u8def\u5f84\u914d\u7f6e\u8fdb\u884c\u8d44\u6e90\u8def\u5f84\u7684\u62fc\u63a5\uff0c\u5982\u679c\u4f60\u539f\u6765\u672c\u6765\u5c31\u6709\u4e00\u4e2a\u51fd\u6570\u4e13\u95e8\u7528\u4e8e\u7ec4\u88c5\u8def\u5f84\u7684\uff0c\u90a3\u4f60\u53ea\u9700\u8981\u4fee\u6539\u8fd9\u4e00\u4e2a\u5730\u65b9\u5c31\u597d\u4e86\uff0c\u5982\u679c\u4f60\u4e4b\u524d\u5e76\u6ca1\u6709\u8fd9\u6837\u7684\u8bbe\u8ba1\uff0c\u90a3\u53ef\u80fd\u9700\u8981\u4fee\u6539\u5927\u91cf\u6d89\u53ca\u5230\u8d44\u6e90\u8def\u5f84\u7684\u5730\u65b9\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5","title":"5\u3001\u8c03\u8bd5\u548c\u7f16\u5199\u7528\u4f8b","text":"\u4ee5\u4e0a\u51e0\u4e2a\u6b65\u9aa4\u505a\u5b8c\uff0c\u57fa\u672c\u5c31\u53ef\u4ee5\u8fdb\u884c\u7528\u4f8b\u4ee3\u7801\u7684\u8c03\u8bd5\u4e86\uff0c\u8fd9\u90e8\u5206\u5de5\u4f5c\u4e3b\u8981\u89e3\u51b3\u4f60\u4e4b\u524d\u51e0\u4e2a\u6b65\u9aa4\u9057\u6f0f\u7684\u95ee\u9898\uff0c\u5982\u679c\u6240\u6709\u7528\u4f8b\u90fd\u8c03\u8bd5\u901a\u8fc7\u4e86\uff0c\u90a3\u4e48\u5de5\u7a0b\u6539\u9020\u5c31\u5168\u90e8\u5b8c\u6210\u4e86\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/","title":"AT \u5f00\u53d1\u89c4\u8303","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u5f00\u53d1\u89c4\u8303\u662f\u6839\u636e\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fd0\u884c\u4e24\u5e74\u591a\u6765\uff0c\u9047\u5230\u95ee\u9898\u89e3\u51b3\u95ee\u9898\u800c\u5f62\u6210\u7684\u4e00\u4e9b\u89e3\u51b3\u65b9\u6848\uff0c\u6216\u8005\u8bf4\u7ecf\u9a8c\u603b\u7ed3\uff1b\u8fd9\u4e9b\u7ecf\u9a8c\u7b26\u5408\u6211\u4eec\u73b0\u9636\u6bb5 AT \u6240\u5e94\u7528\u7684\u573a\u666f\u9700\u8981\uff0c\u4e5f\u662f\u6211\u4eec\u7ecf\u8fc7\u957f\u671f\u601d\u8003\uff0c\u4e0d\u65ad\u8bd5\u9519\u4e0d\u65ad\u4fee\u6b63\uff0c\u5e76\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u5b9e\u8df5\u4e2d\u68c0\u9a8c\u8fc7\u53ef\u884c\u7684\u3002\u4ee5\u6b64\uff0c\u5e0c\u671b\u80fd\u5e2e\u52a9\u53c2\u4e0e\u5230\u81ea\u52a8\u5316\u7684\u76f8\u5173\u4eba\u5458\u51cf\u5c11\u8bd5\u9519\u6210\u672c\uff0c\u66f4\u597d\u3001\u66f4\u5feb\u7684\u7f16\u5199\u7528\u4f8b\u53ca\u7ef4\u62a4\u7528\u4f8b\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_1","title":"\u4e00\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u89c4\u8303","text":"\u6807\u7b7e\u5316\u7ba1\u7406\u6587\u6863\u8bf7\u53c2\u8003\uff1a \u300a\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u64cd\u4f5c\u6307\u5f15\u300b \u4ee5\u4e0b\u8bf4\u51e0\u4e2a\u5bb9\u6613\u51fa\u73b0\u7684\u95ee\u9898\uff1a"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1","title":"1. \u5bf9\u5e94\u5173\u7cfb","text":" \u5199\u5b8c\u81ea\u52a8\u5316\u7528\u4f8b\u4e4b\u540e\uff0c\u8bf7\u5728 CSV \u6587\u4ef6\u4e2d\u6807\u8bb0\u7528\u4f8b\u7684 ID\u3001\u7b49\u7ea7\u3002\u4e3a\u4e86\u63d0\u9192\u6807\u8bb0\uff0c\u6267\u884c\u7528\u4f8b\u65f6\u5728\u9996\u884c\u4f1a\u8f93\u51fa ERROR \u65e5\u5fd7\uff1a CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94\u7684 ID\uff1b \u5728\u6700\u7ec8\u63d0\u4ea4\u4ee3\u7801\u4e4b\u524d\uff0c\u4f60\u9700\u8981\u5728 CSV \u6587\u4ef6\u91cc\u9762\u5c06ID\u3001\u7528\u4f8b\u7b49\u7ea7\u7b49\u6807\u7b7e\u8865\u5168\uff0c\u5982\u679c CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94 ID\uff0c\u540e\u7eed\u5728\u6279\u91cf\u6267\u884c\u7684\u65f6\u5019\uff0c\u8fd9\u4e9b\u7528\u4f8b\u662f\u4e0d\u4f1a\u6267\u884c\u7684\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2","title":"2. \u540d\u79f0\u4e00\u81f4","text":" CSV \u6587\u4ef6\u7684\u6587\u4ef6\u540d\u3001\u7528\u4f8b\u51fd\u6570\u4e2d\u95f4\u7684\u540d\u79f0\u4e00\u81f4\u3001\u7528\u4f8b py \u6587\u4ef6\u4e2d\u95f4\u7684\u540d\u79f0\uff0c\u8fd9\u4e09\u4e2a\u540d\u79f0\u4e00\u81f4\u3002 \u4e3e\u4f8b\uff1a # test_music_001.py\ndef test_music_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u90a3\u4e48 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e3a music.csv\u3002 AT \u6846\u67b6\u5e95\u5c42\u4ee3\u7801\u5b9e\u73b0\u662f\u5c06 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e0e\u7528\u4f8b\u51fd\u6570\u540d\u79f0\u540d\u79f0\uff08item.name\uff09\u8fdb\u884c\u5bf9\u5e94\uff0c\u56e0\u6b64\uff0c\u6ce8\u610f CSV \u6587\u4ef6\u540d\u79f0\u5bf9\u5e94\u7684\u662f\u7528\u4f8b\u51fd\u6570\u540d\u79f0\uff0c\u5373 def test_music_001 \u91cc\u9762\u7684 music \uff0c\u800c\u4e0d\u662f test_music_001.py \u91cc\u9762\u7684 music \u3002 \u8fd9\u91cc\u7ec6\u7ec6\u54c1\u4e00\u4e0b\u54c8~ \u5982\u679c\u4f60\u5c06\u4e0a\u4f8b\u5199\u6210\u4e86\u8fd9\u6837: # test_music_001.py\ndef test_movie_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u7528\u4f8b\u6267\u884c\u6ca1\u95ee\u9898\uff0c\u4f46\u662f\u6807\u7b7e\u5316\u7ba1\u7406\u662f\u4e0d\u751f\u6548\u7684\uff0c\u6846\u67b6\u65e0\u6cd5\u5c06 music.csv\u6587\u4ef6\u91cc\u9762\u6807\u7b7e\uff0c\u6dfb\u52a0\u5230 test_movie_001\u8fd9\u4e2a\u7528\u4f8b\u4e2d\uff0c\u56e0\u4e3a\u4ed6\u4eec\u6ca1\u6709\u5bf9\u5e94\u5173\u7cfb\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#tag","title":"\u4e8c\u3001\u5206\u652f\u53ca tag \u7ba1\u7406\u89c4\u8303","text":"\u53c2\u8003\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u4ee3\u7801\u7ba1\u7406\u89c4\u8303\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2-tag","title":"2. \u5e94\u7528\u5e93 tag","text":" \u5e94\u7528\u5e93 tag \u6839\u636e\u5e94\u7528\u4ea4\u4ed8\u8282\u70b9\u751f\u6210\uff0c\u6bcf\u6b21\u6253 tag \u4e4b\u524d\uff0c\u76f8\u5173\u6d4b\u8bd5\u4eba\u5458\u9700\u8981\u8fdb\u884c\u7528\u4f8b\u8c03\u8bd5\uff1b \u8c03\u8bd5\u7528\u4f8b\u662f\u6307\u7684\u5728\u5168\u67b6\u6784\uff08x86\u3001arm\u3001mips\uff09\u4e0a\u8c03\u8bd5\u901a\u8fc7\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\u8fbe\u5230 90% \u4ee5\u4e0a\u624d\u80fd\u6253 tag\uff0c\u901a\u8fc7 Jenkins \u6267\u884c\u5668\u6267\u884c\u7528\u4f8b\uff0c\u4fdd\u7559\u901a\u8fc7\u7387\u7ed3\u679c\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\uff1a\u901a\u8fc7\u7528\u4f8b\u6570 / (\u603b\u7528\u4f8b\u6570 - \u5df2\u5e9f\u5f03\u7528\u4f8b) \u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u7b97\u901a\u8fc7 Jenkins \u6267\u884c\u5668 \u4f60\u53ef\u80fd\u4f1a\u5728\u4e00\u4e2a\u4ea4\u4ed8\u5468\u671f\u5185\u6301\u7eed\u7684\u8fdb\u884cAT\u7528\u4f8b\u8c03\u8bd5\uff0c\u4f46\u662f\u6700\u7ec8 AT \u7528\u4f8b\u6253 tag \u7684\u5e94\u7528\u7248\u672c\uff0c\u9700\u8981\u4f7f\u7528\u5e94\u7528\u96c6\u6210\u4ea4\u4ed8\u7684\u6700\u65b0\u5e94\u7528\u7248\u672c\uff0c\u53ef\u4ee5\u4f7f\u7528\u5e94\u7528\u7684\u63d0\u6d4b\u7248\u672c\uff1b\u4e00\u5b9a\u8981\u786e\u4fdd\u8c03\u8bd5\u7528\u4f8b\u7684\u5e94\u7528\u7248\u672c\u662f\u6700\u65b0\u7684\uff0c\u4e0d\u7136\u96c6\u6210\u8fdb\u53bb\u4e4b\u540e\uff0c\u6301\u7eed\u96c6\u6210\u5c31\u4f1a\u51fa\u95ee\u9898\uff1b tag \u53f7\u600e\u4e48\u6253\uff1f \u6839\u636e\u6301\u7eed\u96c6\u6210\u7684\u8981\u6c42\u751f\u6210\uff0c\u5176\u4e2d\u5e94\u7528\u7248\u672c\u53f7\u9700\u8981\u4e0e\u9879\u76ee\u7ecf\u7406\u786e\u8ba4\u672c\u6b21\u5373\u5c06\u96c6\u6210\u7684\u5e94\u7528\u7248\u672c\u53f7\u662f\u591a\u5c11\uff1b tag \u7684 commit \u4fe1\u606f\u683c\u5f0f\uff1a # commit msg\nversion:5.6.5\n \u5176\u4e2d 5.6.5 \u5199\u5e94\u7528\u7684\u96c6\u6210\u7248\u672c\u53f7\u3002 \u751f\u6210 tag \u7684\u547d\u4ee4\u53c2\u8003\uff1a\u300aGit \u6807\u7b7e\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3-tag","title":"3. \u57fa\u7840\u6846\u67b6 tag","text":"\u57fa\u7840\u6846\u67b6 tag \u4e0d\u4e0e\u4e1a\u52a1\u6302\u94a9\uff0c\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u6309\u9700\u53d1\u5e03\u7248\u672c\uff0c\u5728\u6839\u76ee\u5f55\u4e0b CURRENT \u6587\u4ef6\u4e2d\u8bb0\u5f55\u7684\u5f53\u524d\u7248\u672c\u53f7\u548c\u5386\u53f2\u7248\u672c\u53f7\uff0c\u53ca\u5176\u5bf9\u5e94\u65b0\u589e\u4e86\u54ea\u4e9b\u529f\u80fd\uff0c\u6709\u52a9\u4e8e\u5e94\u7528\u9009\u62e9\u5408\u9002\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\u3002 # CURRENT\n[current]\ntag = 0.9.5\n \u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u7684 control \u6587\u4ef6\u8bb0\u5f55\u5f53\u524d\u5e94\u7528\u5e93\u4f9d\u8d56\u7684\u57fa\u7840\u5e93\u7248\u672c\u3002 # control\n[Depends]\nautotest-basic-frame = 0.9.5\n \u7528\u4f8b\u5728\u6267\u884c\u65f6\u4f1a\u6821\u9a8c\u4e24\u4e2a\u6587\u4ef6\u7684\u7248\u672c\u53f7\u662f\u5426\u4e00\u81f4\uff0c\u5982\u679c\u4e0d\u4e00\u81f4\uff0c\u4f1a\u6253\u5370 error \u65e5\u5fd7\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_2","title":"\u4e09\u3001\u4ed3\u5e93\u6743\u9650\u7ba1\u7406","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_1","title":"1. \u57fa\u7840\u6846\u67b6","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u4ed3\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame \u57fa\u7840\u6846\u67b6\u4e0d\u5141\u8bb8\u533f\u540d\u8bbf\u95ee\uff0c\u5982\u679c\u4f60\u767b\u5f55 gerrit \u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u8bbf\u95ee\u4ee5\u4e0a\u94fe\u63a5\uff0c\u5219\u9700\u8981\u7533\u8bf7\u8bbf\u95ee\u6743\u9650\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_1","title":"2. \u5e94\u7528\u4ed3\u5e93","text":" \u81ea\u52a8\u5316\u5e94\u7528\u4ed3\u5e93\uff1a https://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684 app_name \u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_3","title":"\u56db\u3001\u65b9\u6cd5\u7f16\u5199&\u8c03\u7528\u89c4\u8303","text":"\u65b9\u6cd5\u7f16\u5199\u6574\u4f53\u8bbe\u8ba1\u601d\u8def\u53c2\u8003\uff1a[\u300aAT\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b]"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_2","title":"1. \u65b9\u6cd5\u7f16\u5199","text":"\u5199\u65b9\u6cd5\u7684\u65f6\u5019\u6ce8\u610f\u65b9\u6cd5\u5f52\u5c5e\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget\uff0c\u65b9\u6cd5\u662f\u5728\u54ea\u4e2a\u533a\u57df\u64cd\u4f5c\u7684\uff0c\u5c31\u5199\u5728\u54ea\u4e2a\u7c7b\u91cc\u9762\u3002 \u4e3e\u4f8b\uff1a from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n\"\"\"\u70b9\u51fb\u6807\u9898\u680fxxx\"\"\"\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_2","title":"2. \u65b9\u6cd5\u8c03\u7528","text":" \u5728\u7528\u4f8b\u4e2d\u8c03\u7528\u65b9\u6cd5\uff0c\u901a\u8fc7\u8be5\u5e94\u7528\u552f\u4e00\u7684\u51fa\u53e3\u8fdb\u884c\u8c03\u7528\uff0c\u6bd4\u5982\u6587\u7ba1\uff1a class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n \u4e0d\u8981\u5728\u7528\u4f8b\u4e2d\u5355\u72ec\u53bb\u8c03\u7528 TitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u8fd9\u4e9b\u7c7b\uff0c\u5426\u5219\u540e\u671f\u7528\u4f8b\u4f1a\u53d8\u5f97\u4e0d\u597d\u7ef4\u62a4\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_4","title":"\u4e94\u3001\u7528\u4f8b\u7f16\u5199\u89c4\u8303","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_3","title":"1. \u57fa\u4e8e\u7c7b\u5199\u7528\u4f8b","text":"\u6240\u6709\u7528\u4f8b\u90fd\u5e94\u8be5\u57fa\u4e8e\u7c7b\u53bb\u5199\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001(self):\n\"\"\"\u97f3\u4e50\u542f\u52a8\"\"\"\n \u6ce8\u610f\u4ee5\u4e0b\u51e0\u70b9\uff1a \u7c7b\u540d\u4e0d\u8981\u968f\u4fbf\u53d6\uff0c\u540c\u4e00\u4e2a\u5e94\u7528\u5e94\u8be5\u4f7f\u7528\u540c\u4e00\u4e2a\u7c7b\u540d\uff0c\u7528\u4f8b\u7c7b\u540d\u79f0\u5fc5\u987b\u4ee5 Test \u5f00\u5934\uff0c\u9075\u5faa\u5927\u9a7c\u5cf0\u547d\u540d\u89c4\u8303\uff1b \u7528\u4f8b\u7c7b\u7ee7\u627f BaseCase\uff0c\u4e00\u4e2a\u5e94\u7528\u53ea\u6709\u4e00\u4e2a BaseCase \u4e00\u4e2a py \u6587\u4ef6\u91cc\u9762\u53ea\u6709\u4e00\u4e2a\u7c7b\uff0c\u6211\u4eec\u79f0\u4e3a\u4e00\u4e2a\u6d4b\u8bd5\u7c7b\uff1b \u4e00\u4e2a\u7c7b\u91cc\u9762\u53ef\u4ee5\u6709\u591a\u4e2a\u7528\u4f8b\u51fd\u6570\uff0c\u8fd9\u53d6\u51b3\u8fd9\u6761\u7528\u4f8b\u6709\u591a\u5c11\u4e2a\u6d4b\u8bd5\u70b9\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001_1(self):\n\"\"\"\u4efb\u52a1\u680f\u542f\u52a8\u97f3\u4e50\"\"\"\ndef test_music_001_2(self):\n\"\"\"\u542f\u52a8\u5668\u542f\u52a8\u97f3\u4e50\"\"\" \ndef test_music_001_3(self):\n\"\"\"\u684c\u9762\u542f\u52a8\u97f3\u4e50\"\"\"\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_3","title":"2. \u7528\u4f8b\u51fd\u6570\u89c4\u8303","text":" \u7528\u4f8b\u51fd\u6570\u4ee5 test \u5f00\u5934\uff0c\u9075\u5faa\u86c7\u5f62\u547d\u540d\u89c4\u8303\uff0c\u4e2d\u95f4\u4e3a\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0\uff0c\u540e\u9762\u52a0\u7528\u4f8b ID\uff0c\u6700\u540e\u52a0\u6d4b\u8bd5\u70b9\u5e8f\u53f7\uff0c\u5373 test_${module}_${case_id}[_${index}] \uff1b \u6bd4\u5982\uff1atest_music_001_1\uff0cindex \u4ece 1 \u5f00\u59cb\u3002 \u51fd\u6570\u529f\u80fd\u8bf4\u660e\u91cc\u9762\u5199\u7528\u4f8b\u6807\u9898\uff0c\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u6807\u9898\u5373\u53ef\uff0c\u6ce8\u610f\u7528\u4e09\u5bf9\u53cc\u5f15\u53f7\uff0c\u4e0d\u8981\u7528\u5176\u4ed6\u6ce8\u91ca\uff0c\u66f4\u4e0d\u8981\u7528\u4e95\u53f7\u6ce8\u91ca\u5199\u7528\u4f8b\u6807\u9898\uff1b \u76f4\u63a5\u590d\u5236 PMS \u7528\u4f8b \u7528\u4f8b\u6b65\u9aa4\u76f4\u63a5\u5c06 PMS \u4e0a\u7528\u4f8b\u6b65\u9aa4\u548c\u9884\u671f\u590d\u5236\u8fdb\u6765\uff0c\u7136\u540e\u8fdb\u884c\u6279\u91cf\u6ce8\u91ca\uff08ctrl + /\uff09\uff0c\u5728\u6ce8\u91ca\u7684\u57fa\u7840\u4e0a\u53bb\u5199\u7528\u4f8b\u811a\u672c\u4f1a\u66f4\u52a0\u65b9\u4fbf\u5168\u9762\uff0c\u4e5f\u6bd4\u4f60\u81ea\u5df1\u5199\u6ce8\u91ca\u66f4\u8282\u7ea6\u65f6\u95f4\uff1a \u4e3e\u4f8b\uff0cPMS \u7528\u4f8b\uff1a \u76f4\u63a5\u9009\u4e2d\u7528\u4f8b\u5185\u5bb9\uff0c\u590d\u5236\u4e0b\u6765\uff0c\u7136\u540e\u7c98\u8d34\u5230\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c\u4e2d\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\n \u4e0a\u4f8b\u4e2d\u4e95\u53f7\u6ce8\u91ca\u90e8\u5206\u5c31\u662f\u76f4\u63a5\u4ece PMS \u4e0a\u590d\u5236\u8fc7\u6765\u7684\uff0c\u5728\u6b64\u57fa\u7840\u4e0a\u5199\u7528\u4f8b\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\nmusic = DeepinMusicWidget()\nmusic.click_singer_btn_in_music_by_ui()\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\nmusic.click_icon_mode_in_music_by_ui()\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\nmusic.double_click_first_singer_in_singer_icon_view_by_ui()\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\nself.assert_xxx\n \u4f60\u770b\uff0c\u975e\u5e38\u6e05\u695a\u6bcf\u4e00\u6b65\u5728\u505a\u4ec0\u4e48\uff0c\u91cd\u70b9\u662f\u7701\u53bb\u4e86\u5199\u6ce8\u91ca\u7684\u65f6\u95f4\uff0c\u771f\u7684\u7092\u9e21\u65b9\u4fbf\u3002 \u4e0d\u5199 if __name__ == '__main__':\uff0c\u4e0d\u5199\u591a\u4f59\u7684\u4ee3\u7801\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3","title":"3. \u6570\u636e\u9a71\u52a8","text":" \u5982\u679c\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u662f\u76f8\u540c\u7684\uff0c\u53ea\u662f\u4e00\u4e9b\u53c2\u6570\u53d8\u5316\uff0c\u5c3d\u91cf\u4f7f\u7528\u6570\u636e\u9a71\u52a8\u6765\u5b9e\u73b0\u7528\u4f8b\uff1b \u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u6570\u636e\u9a71\u52a8\u7684\u6570\u636e\uff0c\u4e0d\u80fd\u56e0\u6b64\u5f15\u5165\u4f9d\u8d56\uff0c\u5c3d\u91cf\u4f7f\u7528\u4e00\u4e9b\u6807\u51c6\u5e93\u80fd\u8bfb\u53d6\u7684\u6587\u4ef6\u683c\u5f0f\uff0c\u6bd4\u5982 json\u3001ini\u3001CSV\u3001xml\u3001txt \u7b49\u6587\u4ef6\u683c\u5f0f\uff1b\u4e0d\u5efa\u8bae\u4f7f\u7528 Yaml\u3001Excel\u3001MySQL \u7b49\u6570\u636e\u683c\u5f0f\uff1b \u8bfb\u53d6\u6570\u636e\u65f6\u4e5f\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff0c\u5982\u4f7f\u7528 pandas \u5904\u7406 CSV \u5c31\u5c5e\u4e8e\u5927\u6750\u5c0f\u7528\u4e86\uff0c\u6b63\u5e38\u7684\u6570\u636e\u9a71\u52a8\u8fd8\u6ca1\u5230\u9700\u8981\u5927\u6570\u636e\u5206\u6790\u6765\u5904\u7406\u7684\u5730\u6b65\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u5728 widget/ddt/ \u76ee\u5f55\u4e0b\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5199\u6cd5\uff1a @pytest.mark.parametrize(\"value\", data)\ndef test_smb_049(self, value):\n \u4ee5\u4e0a\u8fd9\u79cd\u53c2\u6570\u5316\u7684\u5199\u6cd5\u672c\u8eab\u6ca1\u4ec0\u4e48\u95ee\u9898\uff0c\u4f46\u662f\uff0c\u8fd9\u91cc\u5fc5\u987b\u8981\u8865\u5145\u4e00\u4e2a\u6ca1\u6709\u7528\u7684\u5c0f\u77e5\u8bc6\uff1a \u5982\u679c\u53c2\u6570\u5316\u6570\u636e\u91cc\u9762\u7684\u5b57\u7b26\u4f1a\u539f\u5c01\u4e0d\u52a8\u7684\u8f93\u51fa\u5230 item.name \u91cc\u9762\uff0c\u663e\u793a\u975e\u5e38\u4e0d\u4f18\u96c5\uff0c\u800c\u4e14\u53ef\u4ee5\u4f1a\u5f15\u5165\u4e00\u4e9b\u610f\u60f3\u4e0d\u5230\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u611f\u53d7\u4e00\u4e0b\uff1a \u53c2\u6570\uff1a data = [\n\"\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\", \"qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678\",\n]\n \u73b0\u8c61\u662f\u8fd9\u6837\u8272\u513f\u7684\uff1a test_smb_049.py::TestFileManager::test_smb_049[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09]\ntest_smb_049.py::TestFileManager::test_smb_049[qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui]\ntest_smb_049.py::TestFileManager::test_smb_049[12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678]\n \u8bf4\u5b9e\u8bdd\uff0c\u770b\u7740\u5fc3\u91cc\u5835\u5f97\u614c\uff0c\u5982\u679c\u8fd9\u91cc\u9762\u5305\u542b\u4e00\u4e9b\u7279\u6b8a\u5b57\u7b26\u6216\u8005\u662f\u8d85\u957f\uff0c\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u5f88\u5947\u5999\u7684\u4e8b\u60c5\u53d1\u751f\u3002 parametrize \u91cc\u9762\u6709\u4e2a\u53c2\u6570\uff1aids\uff0c\u53ef\u4ee5\u89e3\u51b3\u6b64\u7c7b\u95ee\u9898\uff0c\u5c31\u50cf\u8fd9\u6837\uff1a @pytest.mark.parametrize(\"value\", data, ids=[1, 2, 3])\ndef test_smb_049(self, value):\n \u518d\u6765\u611f\u53d7\u4e00\u4e0b\uff1a test_smb_049.py::TestFileManager::test_smb_049[1]\ntest_smb_049.py::TestFileManager::test_smb_049[2]\ntest_smb_049.py::TestFileManager::test_smb_049[3]\n \u660e\u663e\u597d\u591a\u4e86\uff0c\u6240\u4ee5\u5c3d\u91cf\u4f7f\u7528 ids \u8fd9\u4e2a\u53c2\u6570\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 fixture \u7684\u6570\u636e\u9a71\u52a8\u65b9\u5f0f\uff0c\u6846\u67b6\u867d\u7136\u652f\u6301\uff0c\u4f46\u53ef\u8bfb\u6027\u6bd4\u8f83\u5dee\uff1b\u5982\u679c\u4f60\u4e0d\u77e5\u9053\u8fd9\u53e5\u8bdd\u5728\u8bf4\u5565\uff0c\u90a3\u4f60\u53ef\u4ee5\u5ffd\u7565\uff0c\u6211\u4e5f\u4e0d\u6253\u7b97\u8be6\u7ec6\u8bf4\u8fd9\u79cd\u5b9e\u73b0\u65b9\u5f0f\uff0c\u64cd\u4f5c\u6bd4\u8f83\u9a9a\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4","title":"4. \u65ad\u8a00\u8d44\u6e90","text":" \u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u76f4\u63a5\u653e\u5728\u7528\u4f8b\u6a21\u5757\u7684\u540c\u7ea7\u76ee\u5f55\u4e0b\u7684 assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0 + \u7528\u4f8b ID \u547d\u540d\uff1b \u56fe\u50cf\u8bc6\u522b\u65ad\u8a00\uff0c\u4e0d\u8981\u622a\u53d6\u4e00\u5f20\u5f88\u5927\u7684\u56fe\uff0c\u56fe\u7247\u8d44\u6e90\u5305\u542b\u7684\u5143\u7d20\u592a\u591a\u4e86\uff0c\u975e\u5e38\u5bb9\u6613\u53d7\u5230\u9700\u6c42\u5f71\u54cd\uff0c\u5efa\u8bae\u662f\u8fdb\u884c\u5c40\u90e8\u7684\u65ad\u8a00\uff1b \u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u5339\u914d\u5ea6\u662f 0.9\uff0c\u5982\u679c\u65ad\u8a00\u7684\u573a\u666f\u5bf9\u4e8e\u7cbe\u786e\u5ea6\u8981\u6c42\u6ca1\u90a3\u4e48\u9ad8\uff0c\u53ef\u4ee5\u5728\u65ad\u8a00\u8bed\u53e5\u91cc\u9762\u4f20\u5165\u5c0f\u4e8e 0.9 \u7684\u53c2\u6570\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5","title":"5. \u5143\u7d20\u5b9a\u4f4d","text":" \u7528\u4e8e\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u4e2d\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u547d\u540d\u4e3a\u8be5\u5143\u7d20\u7684\u540d\u79f0\uff1b \u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u622a\u53d6\u65f6\u5c3d\u91cf\u7cbe\u786e\u5230\u8fd9\u4e2a\u5177\u4f53\u7684\u6309\u94ae\uff0c\u56fe\u7247\u4e5f\u4e0d\u8981\u592a\u5927\uff1b \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u64cd\u4f5c\u8f83\u5feb\uff0c\u5408\u7406\u52a0\u5165\u7b49\u5f85\u65f6\u95f4\u80fd\u63d0\u9ad8\u7528\u4f8b\u7684\u7a33\u5b9a\u6027\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6","title":"6. \u7528\u4f8b\u8d44\u6e90","text":" \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u4f7f\u7528\u5230\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u6bd4\u5982\u97f3\u4e50\u53ef\u80fd\u9700\u8981\u4e00\u4e9b mp3 \u7684\u8d44\u6e90\u7528\u4e8e\u6d4b\u8bd5\uff0c\u5b58\u653e\u5728 widget/case_res \u76ee\u5f55\u4e0b\uff0c\u524d\u63d0\u662f\u8fd9\u4e9b\u8d44\u6e90\u4e0d\u8d85\u8fc7 10M\uff1b \u5982\u679c\u662f\u4e00\u4e9b\u6bd4\u8f83\u5927\u7684\u8d44\u6e90\uff0c\u5efa\u8bae\u653e\u5230\u7edf\u4e00\u7684 ftp \u670d\u52a1\u5668 \uff08ftp://10.8.10.245\uff09\uff0c\u9700\u8981\u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\u518d\u4e0b\u8f7d\u4e0b\u6765\uff1b f\"wget ftp://{Config.FTP_IP}/uploads/\u591a\u5a92\u4f53/\u5f71\u9662/auto/{file_name};unzip {file_name};rm -rf {file_name};\"\n \u6d4b\u8bd5\u8d44\u6e90\u4e0b\u8f7d\u5230\u5e94\u7528 widget/case_res \u76ee\u5f55\u4e0b\uff1b \u7981\u6b62\u5c06\u6d4b\u8bd5\u8d44\u6e90\u5b58\u653e\u5728\u4e2a\u4eba\u7684\u673a\u5668\u4e0a\uff1b \u5e94\u8be5\u5c3d\u91cf\u4fdd\u8bc1\uff0c\u4e00\u4e2a\u8d44\u6e90\u5728\u4e00\u6b21\u7528\u4f8b\u6267\u884c\u4e2d\u53ea\u9700\u8981\u4e0b\u8f7d\u4e00\u6b21\uff0c\u6240\u4ee5\u4f60\u4e0d\u80fd\u6bcf\u6b21\u4f7f\u7528\u7684\u65f6\u5019\u90fd\u53bb\u4e0b\u8f7d\uff0c\u8fd9\u6837\u53ef\u80fd\u4f1a\u8017\u8d39\u5927\u91cf\u7684\u7f51\u7edc\u8d44\u6e90\uff0c\u800c\u56e0\u4e3a\u5148\u5224\u65ad\u672c\u5730\u662f\u5426\u5b58\u5728\u6b64\u8d44\u6e90\uff0c\u5982\u679c\u4e0d\u5b58\u5728\u518d\u53bb\u4e0b\u8f7d\uff1b \u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u5c06\u8d44\u6e90\u62f7\u8d1d\u5230\u5bf9\u5e94\u7684\u6d4b\u8bd5\u76ee\u5f55\u4e0b\uff0c\u6bd4\u5982\u5c06 mp3 \u6587\u4ef6\u62f7\u8d1d\u5230 ~/Music \u76ee\u5f55\u4e0b\uff0c\u4f46\u662f\u6211\u4eec\u66f4\u5efa\u8bae\u4f60\u4f7f\u7528\u53d1\u9001\u5feb\u6377\u94fe\u63a5\u7684\u65b9\u5f0f\u66ff\u4ee3\u62f7\u8d1d\u7684\u64cd\u4f5c\uff0c\u56e0\u4e3a\u5728\u62f7\u8d1d\u5927\u6587\u4ef6\u65f6\u662f\u5f88\u6d88\u8017\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u800c\u521b\u5efa\u94fe\u63a5\u5219\u4e0d\u4f1a\uff1b @classmethod\ndef recovery_many_movies_in_movie_by_cmd(cls):\n\"\"\"\u6062\u590d\u591a\u4e2a\u89c6\u9891\u6587\u4ef6\u81f3\u89c6\u9891\u76ee\u5f55\u4e2d\"\"\"\nwork_path = f\"/home/{Config.USERNAME}/Videos/auto\"\ncode_path = f\"{Config.CASE_RES_PATH}/auto\"\ncls.run_cmd(f\"rm -rf {work_path};mkdir {work_path}\")\nsleep(1)\nflag = False\nif not exists(code_path):\ncls.run_cmd(f\"mkdir -p {code_path}\")\nflag = True\nlogger.info(f\"ln -s {code_path}/* {work_path}/\")\ncls.run_cmd(\nf\"cd {code_path}/;\"\nf\"{cls.wget_file('auto.zip') if flag else ''}\"\nf\"ln -s {code_path}/* {work_path}/ > /dev/null 2>&1\"\n)\n \u8d44\u6e90\u4e0b\u8f7d\u8fc7\u7a0b\u4e2d\u6ce8\u610f\u8d85\u65f6\u7684\u95ee\u9898\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u5f88\u5927\uff0c\u8981\u7279\u522b\u6ce8\u610f\u8fd9\u95ee\u9898\uff0c\u5982\u679c\u4f60\u4f7f\u7528\u5f3a\u5236\u7b49\u5f85\u4e0b\u8f7d\u7ed3\u675f( os.system )\uff0c\u53ef\u80fd\u4f1a\u9020\u6210\u7528\u4f8b\u6267\u884c\u65f6\u957f\u53d8\u5f97\u4e0d\u53ef\u63a5\u53d7\uff0c\u76ee\u524d\u6211\u4eec\u53d1\u73b0\u5728\u6301\u7eed\u96c6\u6210\u73af\u5883\u6267\u884c\u65f6\u7f51\u7edc\u4e0b\u8f7d\u901f\u5ea6\u5f88\u6162\uff0c\u6240\u4ee5\u8d85\u65f6\u673a\u5236\u662f\u5f88\u6709\u5fc5\u8981\u7684\uff1brun_cmd \u65b9\u6cd5\u6709\u4e00\u4e2a\u9ed8\u8ba4\u8d85\u65f6\u7684\u65f6\u95f4\uff0c\u4f60\u53ef\u4ee5\u6839\u636e\u8d44\u6e90\u5927\u5c0f\u5bf9\u8d85\u65f6\u65f6\u95f4\u8fdb\u884c\u8c03\u6574\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_5","title":"\u516d\u3001\u7528\u4f8b\u8c03\u8bd5\u6280\u5de7","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_4","title":"1. \u65e5\u5fd7","text":" \u4e00\u5b9a\u8981\u5148\u770b\u62a5\u9519\uff0c\u770b error \u65e5\u5fd7\uff0c\u901a\u5e38\u80fd\u660e\u786e\u7684\u544a\u8bc9\u4f60\u5177\u4f53\u54ea\u91cc\u4ee3\u7801\u62a5\u9519\uff1b \u7ed3\u5408\u62a5\u9519\u70b9\u524d\u9762\u7684error\u3001 info \u548c debug \u65e5\u5fd7\u770b\u5426\u662f\u6b63\u5e38\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_4","title":"2. \u65ad\u70b9\u8c03\u8bd5","text":" \u65b9\u6cd5\u62a5\u9519\uff1a \u5728\u65b9\u6cd5\u5e93\u4e2d\u627e\u5230\u5bf9\u5e94\u7684\u65b9\u6cd5\uff0c\u5355\u72ec\u8c03\u7528\uff0c\u770b\u662f\u5426\u80fd\u6b63\u5e38\u6267\u884c\uff1b \u901a\u5e38\u5355\u4e2a\u65b9\u6cd5\u7684\u6267\u884c\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u62a5\u9519\uff0c\u5f88\u5feb\u5c31\u80fd\u6392\u67e5\u51fa\u95ee\u9898\uff1b\u5728\u65b9\u6cd5\u5185\u90e8\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u65b9\u6cd5\u5185\u90e8\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u8c03\u7528\u6ca1\u95ee\u9898\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u62a5\u9519\u7684\u65b9\u6cd5\u524d\u9762\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u7528\u4f8b\u7684\u4e1a\u52a1\u903b\u8f91\u548c\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u65ad\u8a00\u62a5\u9519\uff1a \u65ad\u8a00\u4e3a\u6570\u636e\u65ad\u8a00\uff0c\u6839\u636e\u8868\u8fbe\u5f0f\u8fdb\u884c\u65ad\u8a00\u8bed\u53e5\u8fdb\u884c\u4fee\u6539\uff1b \u6587\u4ef6\u751f\u6210\u7c7b\u65ad\u8a00\uff0c\u67e5\u770b\u662f\u5426\u9700\u8981\u52a0\u7b49\u5f85\u65f6\u95f4\uff1b \u56fe\u50cf\u65ad\u8a00\uff0c\u5728\u65ad\u8a00\u8bed\u53e5\u5904\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u7528\u4f8b\u8fd0\u884c\u5230\u65ad\u8a00\u5904\u4f1a\u505c\u6b62\uff0c\u67e5\u770b\u6b64\u65f6\u65ad\u8a00\u7684\u56fe\u7247\u4e0e\u7528\u4f8b\u6267\u884c\u7684\u73b0\u573a\u5b58\u5728\u4ec0\u4e48\u5dee\u5f02\uff0c\u6b64\u65f6\u4e5f\u53ef\u4ee5\u8fdb\u884c\u91cd\u65b0\u622a\u56fe\uff0c\u4ece\u800c\u66ff\u6362\u65b0\u7684\u56fe\u7247\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3_1","title":"3. \u8fdc\u7a0b\u6267\u884c","text":" \u8fdc\u7a0b\u6267\u884c\u6307\u7684\u662f\u7f16\u8f91\u5668\u901a\u8fc7\u6307\u5b9a\u8fdc\u7a0b\u89e3\u91ca\u5668\u6267\u884c\u81ea\u52a8\u5316\u4ee3\u7801\uff1b \u8fdc\u7a0b\u6267\u884c\u7684\u597d\u5904\u662f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u7684 Debug \u8fd0\u884c\uff0c\u4e0d\u7528\u5728\u6d4b\u8bd5\u673a\u4e0a\u6253\u5f00\u7f16\u8f91\u5668\uff0c\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u66f4\u5feb\uff1b \u652f\u6301\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u7684\u7f16\u8f91\u5668\uff1a \u4e13\u4e1a\u7248 Pycharm VScode \uff0c\u9700\u8981\u4f7f\u7528\u63d2\u4ef6 Remote-SSH \u8fdc\u7a0b\u6267\u884c\u914d\u7f6e \u4ee5 Pycharm \u4e3a\u4f8b\uff1a File \u2014> Settings \u2014> Project \u2014> Python Interpreter \u2014> \u53f3\u8fb9\u8bbe\u7f6e\u6309\u94ae \u2014> Add... \u2014> SSH Interpreter \u2014> New server configuration(\u586b\u5165host\u548cusername) \u2014> Next \u2014> password\uff08\u6d4b\u8bd5\u673a\u5bc6\u7801\uff09 \u2014> Interpreter(\u9009\u62e9\u8fdc\u7a0b\u89e3\u91ca\u5668) \u2014> Finish "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4_1","title":"4. \u73af\u5883\u6e05\u7406","text":" \u5982\u679c\u7528\u4f8b\u91cc\u9762\u7684 teardown \u6ca1\u6709\u6267\u884c\uff0c\u5927\u6982\u7387\u662f\u56e0\u4e3a setup \u91cc\u9762\u4ee3\u7801\u62a5\u9519\uff0c\u8fd9\u4e24\u4e2a\u662f\u4e00\u5bf9\u7684\uff0csetup \u91cc\u9762\u62a5\u9519\uff0cteardown \u91cc\u9762\u7684\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\uff1b \u76ee\u524d\u6211\u4eec\u5df2\u7ecf\u5c06\u5404\u5e94\u7528\u7684 clean_all \u8fd9\u4e2a fixture \u6539\u6210\u4e86\u7ec8\u7ed3\u5668\uff0c\u786e\u4fdd\u59cb\u7ec8\u80fd\u6267\u884c\u5230\u8fd9\u6b65\uff0c\u4f46\u662f\u7528\u4f8b\u91cc\u9762\u7684 fixture\uff0c\u8fd8\u662f\u9700\u8981\u6211\u4eec\u5c0f\u5fc3\u5904\u7406\uff1b \u8981\u6267\u884c clean_all \u9700\u8981\u5728\u7f16\u8f91\u5668\u8fd0\u884c\u53c2\u6570\u52a0 --clean yes\uff0c\u5199\u7528\u4f8b\u7684\u65f6\u5019\u8bf7\u52a0\u4e0a\uff0c\u4e0d\u7136\u4f60\u4e0d\u786e\u5b9a\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u7684\u73af\u5883\u662f\u5426\u6062\u590d\uff1b setup \u53ef\u4ee5\u4e0d\u8981\uff0c\u5c06 setup \u653e\u5230\u7528\u4f8b\u91cc\u9762\u662f\u4e00\u79cd\u7a33\u59a5\u7684\u505a\u6cd5\uff0cteardown \u4e00\u5b9a\u8981\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5_1","title":"5. \u5143\u7d20\u5b9a\u4f4d\u4e0d\u51c6\uff08\u5750\u6807\u8fd4\u56de\u4e0d\u5bf9\uff09","text":" \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u53ef\u80fd\u53d7\u5230\u7a97\u53e3 ID \u7684\u53d8\u5316\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u9ed8\u8ba4\u53d6\u6700\u65b0\u7684\u4e00\u4e2a\u7a97\u53e3\u7528\u4e8e\u5b9a\u4f4d\uff0c\u4f46\u5982\u679c\u5b9e\u9645\u9700\u8981\u5b9a\u4f4d\u7684\u4e0d\u662f\u6700\u65b0\u7684\u7a97\u53e3\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u91cd\u65b0\u5b9e\u4f8b\u5316\u65b9\u6cd5\u7c7b\u5bf9\u8c61\uff0c\u5e76\u5728\u7c7b\u4e2d\u4f20\u5165\u5bf9\u5e94\u7684\u7a97\u53e3\u5e8f\u53f7\uff1b \u57fa\u4e8e\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u76ee\u524d\u9047\u5230\u7684\u7b14\u8bb0\u672c\u4e0a\uff0c\u7531\u4e8e\u5c4f\u5e55\u7f29\u653e\u6bd4\u4f8b\u4e3a 1.25\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u6211\u4eec\u9ed8\u8ba4\u4f7f\u7528\u7f29\u653e\u6bd4\u4f8b\u4e3a 1\uff1b \u57fa\u4e8e\u56fe\u50cf\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u76ee\u6807\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b \u57fa\u4e8e OCR \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u6587\u5b57\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u540c\u6837\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6_1","title":"6. \u952e\u9f20\u64cd\u4f5c\u4e0d\u51c6","text":" \u9f20\u6807\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6bd4\u5982\u53f3\u952e\u3001\u53cc\u51fb\u65e0\u54cd\u5e94\uff1b \u952e\u76d8\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6216\u8005\u5ef6\u8fdf\u8f93\u5165\uff0c\u6bd4\u5982\u7528\u4f8b\u9700\u8981\u8f93\u5165\u201c\u6211\u662f\u4e2d\u56fd\u4eba\u201d\uff0c\u5b9e\u9645\u53ea\u8f93\u5165\u4e86\u201c\u6211\u56fd\u4eba\u201d\uff1b \u4ee5\u4e0a\u95ee\u9898\u6392\u9664\u5e94\u7528\u5361\u987f\u7b49\u95ee\u9898\uff0c\u5927\u6982\u7387\u662f\u7531\u4e8e\u5de5\u5177\u7684\u95ee\u9898\uff0c\u76ee\u524d\u952e\u9f20\u64cd\u4f5c\u6211\u4eec\u4f7f\u7528\u4e09\u4e2a\u5de5\u5177\uff1aDogtail \u63d0\u4f9b\u7684\u952e\u9f20\u5de5\u5177\u3001PyAutoGUI\u3001Xdotool \uff1b \u6709\u540c\u5b66\u53ef\u80fd\u8981\u8bf4\u4e3a\u5565\u8981\u7528\u4e09\u4e2a\u554a\uff0c\u7528\u4e00\u4e2a\u4e0d\u5c31\u597d\u4e86\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u5404\u6709\u4f18\u70b9\u5404\u6709\u7f3a\u70b9\u3002 \u5982\u679c\u4f60\u9047\u5230\u952e\u9f20\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u8bd5\u8bd5\u901a\u8fc7\u4e0d\u540c\u7684\u5de5\u5177\u64cd\u4f5c\uff1b\u952e\u76d8\u8f93\u5165\u5ef6\u8fdf\u7684\u95ee\u9898\uff0c\u4e00\u822c\u662f\u56e0\u4e3a\u8f93\u5165\u901f\u5ea6\u592a\u5feb\u4e86\uff0c\u7cfb\u7edf\u6ca1\u53cd\u5e94\u8fc7\u6765\uff0c\u5e38\u89c1\u4e8e ARM \u548c MIPS \u4e0a\uff0c\u4fee\u6539\u53c2\u6570 delay_time \u7684\u503c\uff0c\u5355\u4f4d\u4e3a\u6beb\u79d2\uff1b # mouse_key.py\n@classmethod\ndef input_message(cls, message, delay_time=300, interval=0.2):\n\"\"\"\n \u8f93\u5165\u5b57\u7b26\u4e32\n :param message: \u8f93\u5165\u7684\u5185\u5bb9\n :param delay_time: \u5ef6\u8fdf\u65f6\u95f4\n :param interval:\n :return:\n \"\"\"\n \u5982\u679c\u4e0d\u662f\u65b9\u6cd5\u7684\u95ee\u9898\uff0c\u5219\u9700\u8981\u7ee7\u7eed\u548c\u5f00\u53d1\u4e00\u8d77\u6392\u9664\uff0c\u662f\u5426\u4e3a\u5e94\u7528\u63a5\u53d7\u952e\u9f20\u4fe1\u53f7\u5904\u7406\u7684\u95ee\u9898\uff0c\u8fd9\u7c7b\u60c5\u51b5\u6211\u4eec\u4e5f\u662f\u9047\u5230\u8fc7\u7684\uff0c\u5177\u4f53\u95ee\u9898\u5177\u4f53\u5206\u6790\u3002 \u6bd4\u5982\u5f71\u9662\u5c31\u91cd\u5199\u4e86\u4e00\u4e2a\u53f3\u952e\u7684\u65b9\u6cd5\uff1a # base_widget.py\n@classmethod\ndef right_click(cls, _x=None, _y=None):\n\"\"\"\n \u91cd\u5199\u5e95\u5c42\u5355\u51fb\u9f20\u6807\u53f3\u952e\n \u89e3\u51b3\u5f71\u9662\u53f3\u952e\u89e6\u53d1release\u4e8b\u4ef6\u7684\u95ee\u9898\uff08\u53f3\u952e\u4e3b\u7a97\u53e3\u4f1a\u64ad\u653e\u89c6\u9891\uff09\n \"\"\"\ncls.mouse_down(_x, _y, button=3)\nsleep(0.1)\ncls.mouse_up(button=3)\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_6","title":"\u4e03\u3001\u5176\u4ed6\u4e0d\u4e3a\u4eba\u77e5\u7684\u7ec6\u8282","text":" \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u5c3d\u91cf\u7f16\u5199\u540c\u4e00\u4e2a\u5e94\u7528\u6216\u6a21\u5757\u7684\u7528\u4f8b\uff0c\u80fd\u5bf9\u8be5\u7528\u4f8b\u5df2\u6709\u65b9\u6cd5\u719f\u6089\uff0c\u907f\u514d\u8fc7\u591a\u91cd\u590d\u4e1a\u52a1\u4ee3\u7801\u7684\u5c01\u88c5\uff1b \u76f8\u540c\u7684\u573a\u666f\u4e0b\uff0c\u5404\u67b6\u6784\u7b49\u5f85\u65f6\u95f4\u4e0d\u540c\uff0c\u5efa\u8bae\u4f7f\u7528\u6846\u67b6\u63d0\u4f9b\u7684 sleep\uff0c\u6211\u4eec\u505a\u4e86\u4e0d\u540c\u67b6\u6784\u7684\u500d\u6570\u653e\u5927\uff1b \u7f16\u5199\u7528\u4f8b\u65f6\uff0c\u5c3d\u91cf\u8003\u8651\u5230\u6bcf\u4e00\u6b65\u5f02\u5e38\u540e\u7684\u73af\u5883\u6062\u590d\uff0c\u9700\u8981\u5efa\u8bae\u8fd9\u79cd\u610f\u8bc6\uff0c\u968f\u65f6\u8981\u8003\u8651\u5230\uff0c\u8fd9\u6b65\u64cd\u4f5c\u6709\u6ca1\u6709\u53ef\u80fd\u51fa\u9519\uff0c\u51fa\u9519\u4e86\u6539\u600e\u4e48\u529e\uff1b \u63d0\u4ea4\u4ee3\u7801\u7684\u65f6\u5019\u6ce8\u610f\u4e0d\u8981\u628a\u4e00\u4e9b\u4e34\u65f6\u7684\u6d4b\u8bd5\u8d44\u6e90\u63d0\u4ea4\u8fdb\u53bb\u4e86\uff0c\u6bd4\u5982\u6d4b\u8bd5\u4e86\u4e00\u4e2a\u5f71\u7247\uff0c\u6709\u4e9b\u540c\u5b66\u4e60\u60ef\u4f7f\u7528 git add . \uff0c\u7136\u540e\u5c31\u5168\u90e8\u63d0\u4ea4\u5230\u4ee3\u7801\u4ed3\u5e93\u4e86\uff0c\u8fd9\u6837\u5373\u4f7f\u540e\u671f\u628a\u5927\u6587\u4ef6\u5220\u4e86\uff0c.git \u6587\u4ef6\u91cc\u9762\u4e5f\u4f1a\u5f88\u5927\uff0c\u9020\u6210\u4ee3\u7801\u4ed3\u5e93\u53d8\u5f97\u5341\u5206\u81c3\u80bf\u3002 \u66f4\u591a\u7ec6\u8282\u67e5\u770b\uff1a\u300aAT\u7ecf\u9a8c\u603b\u7ed3\u300b"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/","title":"AT \u6267\u884c\u5668\u4f7f\u7528\u6307\u5317","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/5/25\n# Author : litao\n# =============================================\n Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1","title":"1\u3001\u529f\u80fd\u4ecb\u7ecd","text":" \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7cfb\u7edf\u8bed\u8a00\u8bbe\u7f6e\uff0c\u5206\u8fa8\u7387\u8bbe\u7f6e\u53ca\u7528\u4f8b\u6267\u884c\u73af\u5883\u642d\u5efa\uff1b \u652f\u6301 IP \u4e3a 15 \u7f51\u6bb5\u7684 AMD \u67b6\u6784\u6d4b\u8bd5\u673a\u955c\u50cf\u88c5\u673a\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u6307\u5b9a\u5e94\u7528\uff0c\u6307\u5b9a\u8303\u56f4\u6807\u7b7e\u7684\u7528\u4f8b\u6267\u884c\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u72b6\u6001\u68c0\u67e5\uff0c\u662f\u5426\u6709\u6b63\u5728\u8fd0\u884c\u7684\u6d4b\u8bd5\uff1b \u652f\u6301\u914d\u7f6e\u7528\u4f8b\u6267\u884c\u65f6\u957f\uff0c\u9632\u6b62\u4efb\u52a1\u963b\u585e\uff1b \u652f\u6301\u6839\u636e\u5e94\u7528\u7248\u672c\u81ea\u52a8\u67e5\u627e\u5bf9\u5e94\u7684\u7528\u4f8b tag\uff1b \u652f\u6301\u5f02\u5e38\u5904\u7406\u548c\u6d4b\u8bd5\u5b8c\u6210\u7684\u5b9e\u65f6\u6d88\u606f\u901a\u77e5\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2job","title":"2\u3001Job \u4ecb\u7ecd","text":"\u4ee5\u4e0b\u6309\u6267\u884c\u6d41\u7a0b\u7684\u987a\u5e8f\u4ecb\u7ecd\uff0c\u6bcf\u4e00\u6b65\u90fd\u53ef\u4ee5\u5355\u72ec\u6267\u884c\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1_1","title":"1\u3001\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/AT_test/ \u6574\u4e2a\u6d41\u7a0b\u7684\u4e3b\u5165\u53e3\uff0c\u901a\u8fc7\u8fd9\u4e2a\u5165\u53e3\uff0c\u8fde\u540c\u6574\u4e2a\u6d4b\u8bd5\u6d41\u7a0b\uff0c\u955c\u50cf\u88c5\u673a\uff0c\u73af\u5883\u90e8\u7f72\uff0c\u6d4b\u8bd5\u5e94\u7528\u53ca\u751f\u6210\u62a5\u544a\u3002 \u53c2\u6570\u4ecb\u7ecd\uff1a \u6d4b\u8bd5\u673a\uff1a\u6240\u6709\u89c4\u6574\u5230\u56fa\u5b9a\u533a\u57df\u7684\u6d4b\u8bd5\u673a\uff0c\u901a\u8fc7\u6d4b\u8bd5\u540c\u5b66\u5bf9\u6d4b\u8bd5\u673a\u7684\u4e60\u60ef\u547d\u540d\uff0c\u5728\u540e\u53f0\u6620\u5c04\u6d4b\u8bd5\u673a\u7684\u8be6\u7ec6\u4fe1\u606f\uff0c\u62ec\u53f7\u4e2d\u4e3a\u6d4b\u8bd5\u673a IP \u7684\u6700\u540e\u4e00\u4f4d\uff1b \u6d4b\u8bd5\u5e94\u7528\uff1a\u6307\u5b9a\u7684\u6d4b\u8bd5\u5e94\u7528\u7684\u5305\u540d\uff0c\u7cfb\u7edf\u6839\u636e\u540d\u79f0\u81ea\u52a8\u62c9\u53d6\u5bf9\u5e94\u7684\u4ed3\u5e93\u4ee3\u7801\uff1b deb\u5305\u4e0b\u8f7d\u5730\u5740\uff1a\u6d4b\u8bd5\u4e0a\u8ff0\u5e94\u7528\u65f6\uff0c\u9700\u8981\u5b89\u88c5\u7684deb\u5305\u4e0b\u8f7d\u5730\u5740\uff0c\u591a\u4e2a\u5730\u5740\u7528\u201c,\u201d\u9694\u5f00\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff1b \u8303\u56f4\u6807\u7b7e\uff1a\u6267\u884c\u6d4b\u8bd5\u7528\u4f8b\u7684\u6807\u7b7e\u8303\u56f4\uff0c\u5bf9\u5e94\u7528\u4f8b\u4ee3\u7801 csv \u6587\u4ef6\u4e2d\u7684\u6807\u7b7e\u4fe1\u606f\uff0c\u4ee5 pytest \u7684mark\u8bed\u6cd5\u7f16\u5199\uff1b \u7cfb\u7edf\u8bed\u8a00\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u8bed\u8a00\u73af\u5883\uff1b \u5206\u8fa8\u7387\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u5206\u8fa8\u7387\u73af\u5883\uff1b \u955c\u50cf\u5730\u5740\uff1a\u955c\u50cf\u4ed3\u5e93\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u901a\u8fc7 PXE \u88c5\u673a\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u88c5\u673a\u73af\u8282\uff08\u76ee\u524d\u4ec5\u652f\u6301\u90e8\u5206 AMD \u67b6\u6784\u7684\u88c5\u673a\uff09\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2pxe","title":"2\u3001PXE \u88c5\u673a","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/IOS_install/ \u8f93\u5165\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\uff0cIP\uff0c\u5bc6\u7801\uff0c\u955c\u50cf\u5730\u5740\u540e\uff0c\u81ea\u52a8\u88c5\u673a\uff0c\u76ee\u524d\u4ec5\u652f\u6301\u56fa\u5b9a 15 \u7f51\u6bb5\u7684\u90e8\u5206 AMD \u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#3","title":"3\u3001\u6b21\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/all_client_test/ \u8be5\u5165\u53e3\u4e0e\u4e3b\u5165\u53e3\u529f\u80fd\u57fa\u672c\u4e00\u81f4\uff0c\u53ea\u662f\u5265\u79bb\u4e86PXE\u88c5\u673a\u6d41\u7a0b\uff0c\u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7684\u6267\u884c\u6d41\u7a0b\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#4","title":"4\u3001\u73af\u5883\u90e8\u7f72","text":"Jenkins url\uff1ahttps://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/env/build?delay=0sec \u8bbe\u7f6e\u6d4b\u8bd5\u673a\u7684\u7cfb\u7edf\u8bed\u8a00\uff0c\u5206\u8fa8\u7387\u53ca\u5b89\u88c5\u6d4b\u8bd5\u6240\u9700\u7684\u4f9d\u8d56\u5305\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#5","title":"5\u3001\u53d1\u9001\u4ee3\u7801","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/send_code/ \u6839\u636e\u6d4b\u8bd5\u5e94\u7528\u540d\u79f0\uff0c\u62c9\u53d6\u5bf9\u5e94\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u5e76\u6839\u636e\u6d4b\u8bd5\u673a\u4e0a\u5e94\u7528\u7248\u672c\u5207\u6362\u5230\u5bf9\u5e94\u7684tag\u7248\u672c\uff0c\u82e5\u672a\u627e\u5230tag\u7248\u672c\uff0c\u5219\u4f7f\u7528\u6700\u65b0\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u518d\u6839\u636e\u5e94\u7528\u5e93\u4ee3\u7801\u4e2d\u914d\u7f6e\u7684\u57fa\u7840\u5e93\u7248\u672c\uff0c\u62c9\u53d6\u57fa\u7840\u5e93\u4ee3\u7801\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#6","title":"6\u3001\u7528\u4f8b\u6267\u884c","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/run_test/ \u8fd0\u884c\u6d4b\u8bd5\u673a\u4e0a\u7684\u7528\u4f8b"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/","title":"AT \u7528\u4f8b\u7b5b\u9009\u6307\u5317","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u7528\u4f8b\u7b5b\u9009\u6807\u51c6\uff0c\u662f\u6311\u9009\u5408\u9002\u7684\u6587\u672c\u7528\u4f8b\u8fdb\u884c\u81ea\u52a8\u5316\u7528\u4f8b\u8f6c\u5316\u7684\u4e00\u4e9b\u901a\u7528\u6807\u51c6\u3002 \u8fc7\u53bb\u6211\u4eec\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u5b9e\u8df5\u8fc7\u7a0b\u4e2d\uff0c\u5199\u4e86\u4e0d\u5c11\u81ea\u52a8\u5316\u7528\u4f8b\uff0c\u968f\u7740\u9700\u6c42\u7684\u8fed\u4ee3\uff0c\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u81ea\u7136\u8150\u5316\uff0c\u56e0\u800c\u9700\u8981\u5728\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\u5bf9\u81ea\u52a8\u5316\u7528\u4f8b\u8fdb\u884c\u7ef4\u62a4\uff0c\u5728\u7ef4\u62a4\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u6211\u4eec\u53d1\u73b0\uff0c\u6709\u4e9b\u7528\u4f8b\u7ef4\u62a4\u8d77\u6765\u592a\u96be\u4e86\uff0c\u8c03\u8bd5\u7528\u4f8b\u8017\u8d39\u5927\u91cf\u65f6\u95f4\uff0c\u6210\u672c\u5f88\u9ad8\u3002 \u56e0\u6b64\uff0c\u6211\u4eec\u603b\u7ed3\u4e00\u4e9b\u81ea\u52a8\u5316\u7528\u4f8b\u9009\u578b\u7684\u6807\u51c6\uff0c\u4ee5\u4f18\u5316\u540e\u7eed\u81ea\u52a8\u5316\u7528\u4f8b\u7ed3\u6784\uff0c\u671f\u5f85\u6211\u4eec\u80fd\u7f16\u5199\u51fa\u9ad8\u6548\u3001\u7a33\u5b9a\u3001\u6613\u4e8e\u7ef4\u62a4\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_1","title":"\u4e00\u3001\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u53ef\u4ee5\u5206\u4e3a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u548c\u4e13\u9879\u81ea\u52a8\u5316\u6d4b\u8bd5\uff0c\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e00\u822c\u53ea\u9488\u5bf9\u4e00\u4e9b\u5e38\u89c4\u7684\u529f\u80fd\u6d4b\u8bd5\uff0c\u5176\u4ed6\u975e\u5e38\u89c4\u529f\u80fd\u7684\u7528\u4f8b\uff0c\u5e94\u8be5\u91c7\u7528\u4e13\u9879\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u6848\uff1b \u4ee5\u4e0b\u662f\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1","title":"1. \u7a33\u5b9a\u6027\u3001\u538b\u6d4b\u7528\u4f8b","text":"\u7a33\u5b9a\u6027\u6d4b\u8bd5\u3001\u538b\u6d4b\u7528\u4f8b\u5e94\u8be5\u662f\u5c5e\u4e8e\u6027\u80fd\u76f8\u5173\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u5982\uff1a\u53cd\u590d\u591a\u6b21\u70b9\u51fb\u6309\u94ae\uff0c\u68c0\u9a8c\u5176\u529f\u80fd\u7a33\u5b9a\u6027\u3002\u56e0\u4e3a\u8fd9\u4e9b\u7528\u4f8b\u65ad\u8a00\u7684\u9884\u671f\u53ef\u80fd\u4e0d\u662f\u5f88\u660e\u786e\uff0c\u66f4\u6709\u751a\u8005\u4e0d\u9700\u8981\u65ad\u8a00\uff0c\u7528\u4f8b\u65f6\u957f\u6bd4\u8f83\u957f\uff0c\u800c\u4e14\u4e0d\u53ef\u63a7\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u76ee\u524d\u6211\u4eec\u6709\u6027\u80fd\u81ea\u52a8\u5316\u7684\u4e13\u9879\u65b9\u6848\uff0c\u4ee5\u53ca\u4e00\u4e9b\u7a33\u5b9a\u6027\u6d4b\u8bd5\u7684\u4e13\u9879\u65b9\u6848\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u6b64\u7c7b\u7528\u4f8b\u653e\u5230\u4e13\u9879\u81ea\u52a8\u5316\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2","title":"2. \u6d89\u53ca\u591a\u4e2a\u7528\u6237\u64cd\u4f5c","text":"\u5e38\u89c1\u4e0e\u6587\u7ba1\u7684\u7528\u4f8b\u4e2d\uff0c\u591a\u7528\u6237\u64cd\u4f5c\u7684\u7528\u4f8b\u4e00\u822c\u90fd\u4f1a\u6d89\u53ca\u5230\u5728\u7cfb\u7edf\u4e2d\u8fdb\u884c\u591a\u4e2a\u7528\u6237\u95f4\u7684\u5207\u6362\uff0c\u81ea\u52a8\u5316\u811a\u672c\u4e00\u822c\u662f\u8fd0\u884c\u5728\u4e00\u4e2a\u7528\u6237\u7a7a\u95f4\u4e0b\u7684\uff0c\u6240\u4ee5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u591a\u7528\u6237\u95f4\u7684\u5207\u6362\u3002 \u6b64\u7c7b\u4e0d\u5efa\u8bae\u91c7\u7528\u81ea\u52a8\u5316\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3","title":"3. \u4e0e\u5f00\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4ea4\u4e92","text":"\u6b64\u7c7b\u573a\u666f\u591a\u4e3a\u5e94\u7528\u7684\u5f02\u5e38\u573a\u666f\u6d4b\u8bd5\uff0c\u6bd4\u5982\uff1a\u590d\u5236\u5927\u6587\u4ef6\u8fc7\u7a0b\u4e2d\u6ce8\u9500\u673a\u5668\u3002 \u81ea\u52a8\u5316\u811a\u672c\u5728\u7cfb\u7edf\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4e4b\u540e\u662f\u4f1a\u505c\u6b62\u8fd0\u884c\u7684\uff1b\u6b64\u7c7b\u7528\u4f8b\u53ef\u4ee5\u505a\u81ea\u52a8\u5316\uff0c\u4f46\u662f\u540c\u6837\u9700\u8981\u505a\u4e13\u9879\u65b9\u6848\uff0c\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u7684\u5904\u7406\u903b\u8f91\u5b8c\u5168\u4e0d\u540c\u3002 \u540e\u7eed\u81ea\u52a8\u5316\u9700\u8981\u516c\u5173\u7684\u70b9\uff1a \u81ea\u52a8\u5316\u811a\u672c\u5728\u672c\u673a\u8fd0\u884c\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u81f3\u5c11\u9700\u8981\u63d0\u4f9b\u4ee5\u4e0b\u529f\u80fd\uff1a \u91cd\u542f\u4e4b\u540e\u7528\u4f8b\u80fd\u81ea\u52a8\u8fd0\u884c\uff1b\u53ef\u4ee5\u8003\u8651\u5c06\u6267\u884c\u7528\u4f8b\u5199\u6210\u4e00\u4e2a\u5f00\u673a\u81ea\u542f\u7684\u670d\u52a1\uff1b \u80fd\u8bb0\u5f55\u5173\u673a\u4e4b\u524d\u7528\u4f8b\u6267\u884c\u7684\u4f4d\u7f6e\uff0c\u91cd\u542f\u4e4b\u540e\u80fd\u4ece\u6b64\u4f4d\u7f6e\u5f00\u59cb\u6267\u884c\uff1b \u50cf\u6027\u80fd\u81ea\u52a8\u5316\u4e00\u6837\uff0c\u7531\u670d\u52a1\u7aef\u63a7\u5236\uff1b \u5b8c\u5168\u57fa\u4e8e\u56fe\u5f62\u8bc6\u522b\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u4e32\u53e3\u7ebf\u63a7\u5236\u952e\u9f20\u7a33\u5b9a\u6027\uff1b "},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4","title":"4. \u6d4b\u8bd5\u6267\u884c\u65f6\u95f4\u957f","text":"\u7528\u4f8b\u6267\u884c\u65f6\u95f4\u63a7\u5236\u57282\u5206\u949f\u4ee5\u5185\uff0c\u6781\u7aef\u60c5\u51b5\u4e0d\u8981\u8d85\u8fc75\u5206\u949f\uff0c\u6240\u6709\u7528\u4f8b\u7684\u5e73\u5747\u65f6\u957f\u5e94\u8be5\u57281\u5206\u949f\u5de6\u53f3\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u95f4\u592a\u957f\uff0c\u7f16\u5199\u7528\u4f8b\u3001\u8c03\u8bd5\u7528\u4f8b\u3001\u6267\u884c\u7528\u4f8b\u3001\u7ef4\u62a4\u7528\u4f8b\u90fd\u975e\u5e38\u7684\u8017\u65f6\uff0c\u4eba\u529b\u6210\u672c\u65f6\u95f4\u6210\u672c\u6295\u5165\u592a\u9ad8\u3002 \u4f60\u60f3\uff0c\u8fd9\u6761\u7528\u4f8b\u6267\u884c\u9700\u89815\u5206\u949f\uff0c\u90a3\u4f60\u5199\u8fd9\u6761\u7528\u4f8b\u7684\u65f6\u95f4\u4e0d\u53ef\u80fd\u4e00\u904d\u8fc7\uff0c\u5199\u7684\u8fc7\u7a0b\u4e2d\u8dd1\u4e0d\u901a\u8fd8\u5f97\u91cd\u8dd1\u81f3\u5c1115\u5206\u949f\u4e0d\u8fc7\u5206\uff0c\u5199\u5b8c\u4e86\u8fd8\u5f97\u5728\u5176\u4ed6\u67b6\u6784\u4e0a\u8c03\u8bd5\uff0c\u534a\u4e2a\u5c0f\u65f6\u8fc7\u53bb\u4e86\uff0c\u8fd9\u8fd8\u53ea\u662f\u7b2c\u4e00\u6b21\u5199\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u540e\u7eed\u5982\u679c\u7528\u4f8b\u7ef4\u62a4\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u7ecf\u5e38\u6295\u5165\u76f8\u5f53\u957f\u65f6\u95f4\uff0c\u8fd9\u6837\u5176\u5b9e\u662f\u5931\u53bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u7684\u3002\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u5c31\u5e94\u8be5\u662f\u5feb\u51c6\u72e0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5","title":"5. \u8fb9\u7f18\u6027\u6d4b\u8bd5","text":"\u6709\u4e9b\u529f\u80fd\u6a21\u5757\u672c\u8eab\u662f\u5c5e\u4e8e\u6bd4\u8f83\u8fb9\u7f18\u6027\u7684\uff0c\u5373\u6781\u5c11\u7528\u6237\u4f1a\u4f7f\u7528\u5230\u7684\u529f\u80fd\uff0c\u8fd9\u7c7b\u529f\u80fd\u6a21\u5757\u4e0d\u9700\u8981\u5927\u89c4\u6a21\u5b9e\u73b0\u81ea\u52a8\u5316\uff0c\u4e00\u4e24\u4e2a\u573a\u666f\u8986\u76d6\u57fa\u672c\u529f\u80fd\u5c31\u884c\u4e86\uff0c\u56e0\u6b64\u6211\u4eec\u5728\u6311\u9009\u6b64\u7c7b\u7528\u4f8b\u7684\u65f6\u5019\u53ef\u4ee5\u7ed3\u5408\u6574\u4e2a\u529f\u80fd\u6a21\u5757\u7684\u8986\u76d6\u60c5\u51b5\u6765\u51b3\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6","title":"6. \u9700\u8981\u4f9d\u8d56\u4eba\u5de5\u4ecb\u5165\u7684","text":"\u81ea\u52a8\u5316\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\u662f\u6ca1\u6709\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bd4\u5982\u8981\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u90a3\u4e48\u5c31\u80cc\u79bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u3002 \u6bd4\u5982\u5149\u9a71\u6a21\u5757\uff0c\u5149\u9a71\u523b\u5f55\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u4f46\u662f\u5149\u9a71\u523b\u5f55\u4e4b\u540e\u5149\u76d8\u4f1a\u5f39\u51fa\u6765\uff0c\u9700\u8981\u4eba\u5de5\u66f4\u6362\u5149\u76d8\uff0c\u518d\u624b\u52a8\u63a8\u8fdb\u5149\u9a71\u4e2d\u3002 \u8fd9\u79cd\u529f\u80fd\u6a21\u5757\u5373\u4f7f\u505a\u81ea\u52a8\u5316\uff0c\u80fd\u6d89\u53ca\u5230\u7684\u529f\u80fd\u975e\u5e38\u6709\u9650\uff0c\u800c\u4e14\u4e0d\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u6240\u4ee5\u660e\u663e\u5c31\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7","title":"7. \u96be\u4ee5\u5b9e\u73b0\u7684","text":"\u7528\u4f8b\u6240\u6d89\u53ca\u5230\u7684\u65b9\u6cd5\u5b9e\u73b0\u8d77\u6765\u53ef\u80fd\u6709\u96be\u5ea6\uff0c\u751a\u81f3\u73b0\u9636\u6bb5\u65e0\u6cd5\u5b9e\u73b0\u7684\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002 \u6bd4\u5982\u5f71\u9662\u6d4b\u8bd5\u753b\u9762\u6e05\u6670\u5ea6\u3001\u6d41\u7545\u5ea6\u3001\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u4e4b\u540e\u7684\u89c6\u9891\u662f\u5426\u5b58\u5728\u5361\u987f\u7b49\u7528\u4f8b\uff0c\u73b0\u9636\u6bb5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#8","title":"8. \u529f\u80fd\u4e0d\u7a33\u5b9a","text":"\u8fd9\u4e2a\u4e0d\u662f\u8bf4\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\uff0c\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\u4e0d\u7a33\u5b9a\u662f\u6b63\u5e38\u7684\uff0c\u8fd9\u79cd\u6211\u4eec\u53ef\u4ee5\u7b49\u5f00\u53d1\u63d0\u6d4b\u4e4b\u540e\u518d\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u3002 \u529f\u80fd\u4e0d\u7a33\u5b9a\u6307\u7684\u662f\u7528\u4f8b\u6240\u6d89\u53ca\u7684\u529f\u80fd\uff0c\u53ef\u80fd\u5b58\u5728\u591a\u79cd\u53d8\u5316\uff0c\u6bcf\u6b21\u6267\u884c\u7528\u4f8b\u53ef\u80fd\u65ad\u8a00\u7684\u9884\u671f\u90fd\u4e0d\u540c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#9","title":"9. \u52a8\u6001\u65ad\u8a00","text":"\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u76f4\u5230\u7528\u4f8b\u7ed3\u675f\uff0c\u4e00\u76f4\u662f\u4e00\u4e2a\u52a8\u6001\u53d8\u5316\u7684\u8fc7\u7a0b\uff0c\u800c\u4e14\u65e0\u6cd5\u901a\u8fc7\u5176\u4ed6\u624b\u6bb5\u505c\u4e0b\u6765\uff1b \u6bd4\u5982\uff1a\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u65f6\uff0c\u53f3\u4e0b\u89d2\u7684\u5f55\u5236\u65f6\u95f4\u662f\u4e00\u76f4\u5728\u53d8\u5316\u7684\uff0c\u7528\u4f8b\u9700\u8981\u6d4b\u8bd5\u5f55\u52361\u5206\u949f\u4e4b\u540e\uff0c\u5f55\u5236\u65f6\u95f4\u662f\u521a\u597d\u505c\u572860\u79d2\uff1b \u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fd8\u505a\u4e0d\u5230\u65f6\u95f4\u7cbe\u51c6\u63a7\u5236\uff0c\u7a0b\u5e8f\u6267\u884c\u65f6\u95f4\u662f\u6709\u6ce2\u52a8\u7684\uff0c\u800c\u4e14\u8981\u9002\u914d\u591a\u4e2a\u5e73\u53f0\uff0c\u6240\u4ee5\u6b64\u7c7b\u7528\u4f8b\u5927\u6982\u7387\u4f1a\u6267\u884c\u5931\u8d25\u3002\u7279\u522b\u662f\u5728\u6027\u80fd\u8f83\u5dee\u7684\u56fd\u4ea7\u5316\u67b6\u6784\u4e0a\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u592a\u53ef\u80fd\u7a33\u5b9a\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#10","title":"10. \u63a2\u7d22\u6027\u6d4b\u8bd5","text":"\u63a2\u7d22\u6027\u6d4b\u8bd5\u901a\u5e38\u662f\u4e00\u4e9b\u4e0d\u786e\u5b9a\u7684\u64cd\u4f5c\uff0c\u591a\u53d8\u5207\u590d\u6742\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u9884\u671f\u4e5f\u53ef\u80fd\u662f\u4e0d\u786e\u5b9a\u7684\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u9a9a\u64cd\u4f5c\u592a\u591a\u4e86\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6b64\u7c7b\u7528\u4f8b\u9002\u5408\u91c7\u7528\u624b\u5de5\u6d4b\u8bd5\uff0c\u662f\u624b\u5de5\u6d4b\u8bd5\u771f\u6b63\u7684\u4ef7\u503c\u4f53\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#11","title":"11. \u6613\u7528\u6027\u6d4b\u8bd5","text":"\u5bf9\u4e8e\u6613\u7528\u6027\u7684\u5224\u65ad\u901a\u5e38\u662f\u4e3b\u89c2\u7684\uff0c\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\u5f88\u96be\u53bb\u5b9a\u4e49\u4ec0\u4e48\u6837\u7684\u60c5\u51b5\u5bf9\u7528\u6237\u662f\u6613\u7528\u7684\uff0c\u81ea\u52a8\u5316\u9700\u8981\u6709\u660e\u786e\u7684\u53ef\u5b9e\u73b0\u7684\u9884\u671f\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_2","title":"\u4e8c\u3001\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u524d\u9762\u8bb2\u4e86\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u4e00\u4e9b\u7528\u4f8b\u60c5\u51b5\uff0c\u6709\u540c\u5b66\u5c31\u8bf4\u4e86\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\u4e0d\u7528\u8bb2\u4e86\uff0c\u5c31\u662f\u4e0d\u9002\u5408\u7684\u53cd\u9762\u3002\u6ca1\u6bdb\u75c5\u54c8\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\uff0c\u6211\u4eec\u5927\u4f53\u8fd8\u53ef\u4ee5\u5206\u4e3a\u4e24\u7c7b\uff1a \u7b2c\u4e00\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u597d\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u7b2c\u4e8c\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u4e00\u822c\uff0c\u9700\u8981\u6295\u5165\u66f4\u591a\u7cbe\u529b\u624d\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u4ee5\u4e0b\u4ecb\u7ecd\u4e00\u4e9b\u6211\u4eec\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1_1","title":"1. \u64cd\u4f5c\u76f8\u5bf9\u7b80\u5355","text":"\u7528\u4f8b\u6b65\u9aa4\u76f8\u5bf9\u8f83\u5c11\uff0c\u8fd9\u79cd\u7528\u4f8b\u901a\u5e38\u662f\u4e00\u4e9b\u8def\u5f84\u5f88\u6d45\u7684\u7528\u4f8b\uff0c\u4e00\u822c\u4e5f\u662f\u4e00\u4e9b\u57fa\u7840\u7528\u4f8b\u3002\u7528\u4f8b\u7f16\u5199\u3001\u7ef4\u62a4\u90fd\u53ef\u4ee5\u8f7b\u677e\u641e\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2_1","title":"2. \u5bb9\u6613\u5b9e\u73b0","text":"\u73b0\u6709\u6280\u672f\u662f\u53ef\u5b9e\u73b0\u7684\uff0c\u6ca1\u6709\u96be\u5ea6\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3_1","title":"3. \u7ecf\u5e38\u7528\u4e8e\u56de\u5f52\u6d4b\u8bd5","text":"\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bcf\u6b21\u56de\u5f52\u6d4b\u8bd5\u5fc5\u987b\u8981\u6267\u884c\u7684\u7528\u4f8b\uff0c\u90a3\u4e48\u8fd9\u6761\u7528\u4f8b\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u3002 \u56de\u5f52\u6d4b\u8bd5\u65f6\u6211\u4eec\u9996\u5148\u5e94\u8be5\u4fdd\u8bc1\u5e94\u7528\u5386\u53f2\u57fa\u672c\u529f\u80fd\u6b63\u5e38\uff0c\u6240\u4ee5\u90a3\u4e9b\u6bcf\u6b21\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u90fd\u8981\u6267\u884c\u7684\u7528\u4f8b\u9002\u5408\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4_1","title":"4. \u529f\u80fd\u7a33\u5b9a\u7684\u6838\u5fc3\u529f\u80fd","text":"\u6d89\u53ca\u6838\u5fc3\u529f\u80fd\u7684\u7528\u4f8b\u662f\u6700\u6700\u91cd\u8981\u7684\u7528\u4f8b\uff0c\u4e5f\u662f\u6211\u4eec\u4ea4\u4ed8\u65f6\u5fc5\u987b\u8981\u4fdd\u8bc1\u8d28\u91cf\u7684\u76f8\u5173\u529f\u80fd\uff0c\u56e0\u6b64\u5e94\u8be5\u5c3d\u53ef\u80fd\u7684\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5_1","title":"5. \u8f93\u5165\u6570\u636e\u6d4b\u8bd5","text":"\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u901a\u5e38\u662f\u68c0\u9a8c\u88ab\u6d4b\u5e94\u7528\u63a5\u53d7\u6709\u6548\u6570\u636e\u3001\u62d2\u7edd\u65e0\u6548\u6570\u636e\u7684\u80fd\u529b\u3002\u5982\uff1a\u63d0\u4ea4\u8d85\u957f\u5b57\u7b26\u4e32\u3001\u7279\u6b8a\u5b57\u7b26\u4e32\u7b49\u7b49\u3002 \u6b64\u7c7b\u7528\u4f8b\u624b\u5de5\u6d4b\u8bd5\u5f88\u96be\u6bd4\u8f83\u5168\u9762\u7684\u8986\u76d6\u5230\u6240\u6709\u7684\u8f93\u5165\u60c5\u51b5\uff0c\u4f46\u662f\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\uff0c\u6b64\u7c7b\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u90fd\u662f\u4e00\u6837\u7684\uff0c\u53d8\u5316\u7684\u4ec5\u662f\u8f93\u5165\u53c2\u6570\u548c\u65ad\u8a00\u7ed3\u679c\uff0c\u91c7\u7528\u6570\u636e\u9a71\u52a8\uff0c\u53ef\u4ee5\u8f7b\u677e\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6_1","title":"6. \u683c\u5f0f\u8986\u76d6","text":"\u539f\u56e0\u540c\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u7c7b\u7528\u4f8b\u4e00\u6837\uff0c\u591a\u79cd\u683c\u5f0f\u7684\u8986\u76d6\u4e5f\u662f\u4e00\u4e2a\u5f88\u7e41\u7410\u7684\u4e8b\u60c5\uff0c\u4ea4\u7ed9\u81ea\u52a8\u5316\u6765\u505a\u518d\u5408\u9002\u4e0d\u8fc7\u4e86\u3002 \u6bd4\u5982\u5f71\u9662\u5bf9\u5f71\u7247\u683c\u5f0f\u7684\u68c0\u67e5\u3001\u622a\u56fe\u5f55\u5c4f\u5bf9\u4fdd\u5b58\u683c\u5f0f\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7_1","title":"7. \u68c0\u67e5\u5143\u7d20\u72b6\u6001","text":"\u67e5\u770b\u88ab\u6d4b\u5e94\u7528\u7684\u5143\u7d20\u5c5e\u6027\u3002\u5982\uff1a\u56fe\u7247\u7684\u5927\u5c0f\u548c\u6392\u5217\uff1b\u6309\u94ae\u7684\u53ef\u7528\u548c\u4e0d\u53ef\u7528\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/","title":"AT \u7ecf\u9a8c\u603b\u7ed3","text":"\u6b22\u8fce\u6240\u6709\u4eba\u63d0\u4ea4\u4f60\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u9762\u7684\u4f18\u79c0\u5b9e\u8df5\u7ecf\u9a8c\uff0c\u4ee5\u5e2e\u52a9\u5927\u5bb6\u89e3\u51b3\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#1","title":"1\u3001\u7ec8\u7ed3\u5668","text":"# litaoa@uniontech.com\n \u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4 pytest \u5b9e\u73b0\u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4\u7684\u65b9\u5f0f\u6709\u4e24\u79cd\uff0cyield \u548c\u7ec8\u7ed3\u51fd\u6570\uff1b yield \u5b9e\u73b0\uff0cyield\u524d\u9762\u4e3a\u7528\u4f8b\u7684\u524d\u7f6e\u6b65\u9aa4\uff0cyield \u540e\u9762\u4e3a\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4\u3002 @pytest.fixture\ndef clean_env():\nprint(\"setup\")\nyield\nprint(\"teardown\")\n \u7ec8\u7ed3\u51fd\u6570\u5b9e\u73b0\uff0c\u4f7f\u7528 request.addfinalizer \u6ce8\u518c\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4 @pytest.fixture\ndef clean_env(request):\ndef clean():\nprint(\"teardown\")\nrequest.addfinalizer(clean)\nprint(\"setup\")\n yield\u7684\u4f18\u7f3a\u70b9\uff1a \u4f18\u70b9\uff1a\u4ee3\u7801\u7b80\u6d01\uff0c\u76f4\u89c2\uff0c\u53ef\u4f7f\u7528yield\u5728\u7528\u4f8b\u4e2d\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c \u7f3a\u70b9\uff1a\u82e5\u524d\u7f6e\u6b65\u9aa4\u4e2d\u51fa\u73b0\u9519\u8bef\uff0c\u5219\u540e\u7f6e\u6b65\u9aa4\u4e0d\u4f1a\u6267\u884c \u7ec8\u7ed3\u51fd\u6570\uff1a \u4f18\u70b9\uff1a\u524d\u7f6e\u6b65\u9aa4\u5931\u8d25\u7684\u8bdd\uff0c\u540e\u7f6e\u6b65\u9aa4\u4ecd\u4f1a\u6267\u884c\u4e14\u53ef\u4ee5\u6ce8\u518c\u591a\u4e2a\u540e\u7f6e\u6b65\u9aa4\uff08\u524d\u63d0\uff1a\u9700\u8981\u5728\u4ee3\u7801\u62a5\u9519\u4e4b\u524d\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff09\uff0c\u652f\u6301\u7075\u6d3b\u4f7f\u7528\u540e\u7f6e\u6761\u4ef6 \u7f3a\u70b9\uff1a\u4ee3\u7801\u8f83\u4e3a\u590d\u6742\uff0c\u65e0\u6cd5\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c\uff08\u672c\u4eba\u76ee\u524d\u672a\u5b9e\u73b0\uff09 \u603b\u7ed3\uff1a\u5728\u524d\u7f6e\u6b65\u9aa4\u4fdd\u8bc1\u7edd\u5bf9\u4e0d\u4f1a\u51fa\u9519\u65f6\uff0c\u4f7f\u7528yield\u66f4\u4f73\u7b80\u4fbf\uff0c\u5f53\u524d\u7f6e\u6b65\u9aa4\u6613\u51fa\u73b0\u95ee\u9898\u65f6\uff0c\u63a8\u8350\u4f7f\u7528\u7ec8\u7ed3\u51fd\u6570\u3002 \u573a\u666f\uff1a\u4fdd\u9669\u7bb1\u7528\u4f8b\uff0c\u524d\u7f6e\u6b65\u9aa4\u4e2d\u5f00\u542f\u4fdd\u9669\u7bb1\uff0c\u540e\u7f6e\u6b65\u9aa4\u5220\u9664\u4fdd\u9669\u7bb1\u3002 @pytest.fixture(scope=\"session\", autouse=True)\ndef vault_fixture(request):\nDfmWidget.reset_vault_by_cmd() # 1\u3001\u91cd\u7f6e\u4fdd\u9669\u7bb1\nDdeDockPublicWidget().close_file_manager_by_cmd() # 2\u3001\u5173\u95ed\u6587\u7ba1\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 3\u3001\u5f00\u542f\u6587\u7ba1\nvault = DfmWidget()\nvault.create_file_vault() # 4\u3001\u521b\u5efa\u4fdd\u9669\u7bb1\ndef delete_vault(): # 8\u3001\u5220\u9664\u4fdd\u9669\u7bb1\u7684\u540e\u7f6e\u6b65\u9aa4\nsleep(2)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr()\nvault = DfmWidget()\nvault.delete_file_vault()\nDfmWidget.reset_vault_by_cmd()\nDdeDockPublicWidget().close_file_manager_by_cmd()\nrequest.addfinalizer(delete_vault) # 5\u3001\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\nDdeDockPublicWidget().close_file_manager_by_cmd() # 6\u3001\u5173\u95ed\u6587\u7ba1\nsleep(1)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 7\u3001\u5f00\u542f\u6587\u7ba1\n \u4ee3\u7801\u6309\u6ce8\u91ca\u4e2d\u7684\u5e8f\u53f7\u6267\u884c\u6b65\u9aa4 \u4ee3\u7801\u5728\u6b65\u9aa41-4\u4efb\u610f\u4f4d\u7f6e\u62a5\u9519\uff0c\u5219\u4e0d\u4f1a\u6267\u884c\u6b65\u9aa48\uff0c\u56e0\u4e3a\u672a\u6267\u884c\u5230\u6b65\u9aa45\uff0c\u6b65\u9aa48\u8fd8\u672a\u6ce8\u518c \u4ee3\u7801\u5728\u6b65\u9aa46-7\u62a5\u9519\uff0c\u4ecd\u4f1a\u6267\u884c\u6b65\u9aa47\uff0c\u56e0\u4e3a\u5728\u6b65\u9aa45\u4e2d\u5df2\u7ecf\u5c06\u6b65\u9aa47\u6ce8\u518c \u53ef\u4ee5\u7075\u6d3b\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff0c\u80fd\u5b9e\u73b0\u67d0\u4e2a\u524d\u7f6e\u6b65\u9aa4\u6267\u884c\u4e4b\u540e\uff0c\u624d\u4f1a\u6267\u884c\u540e\u7f6e\u6b65\u9aa4\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#2","title":"2\u3001\u542f\u52a8\u5e94\u7528\u7684\u65b9\u5f0f","text":"# huangmingqiang@uniontech.com\n \uff081\uff09\u547d\u4ee4\u884c\u542f\u52a8 \u5728 AT \u4ee3\u7801\u4e2d\u4f7f\u7528\u547d\u4ee4\u884c\u542f\u52a8\u5e94\u7528\uff0c\u4e3e\u4f8b\uff1a os.popen(\"deepin-music\")\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f7f\u7528 ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6\uff0cdogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u3002 \uff082\uff09\u901a\u8fc7 UI \u64cd\u4f5c\u542f\u52a8 \u901a\u8fc7\u4efb\u52a1\u680f\u3001\u542f\u52a8\u5668\u3001\u684c\u9762\u7b49UI\u65b9\u5f0f\u542f\u52a8\uff0c\u6bd4\u5982\u53cc\u51fb\u6253\u5f00\u3001\u53f3\u952e\u6253\u5f00\u7b49\uff0c\u8fd9\u79cd\u64cd\u4f5c\u65b9\u5f0f\u4e0d\u5b58\u5728ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6dogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u7684\u95ee\u9898\uff0c\u4e5f\u66f4\u52a0\u7b26\u5408\u7528\u6237\u7684\u64cd\u4f5c\u884c\u4e3a\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#3","title":"3\u3001\u6587\u4ef6\u9009\u62e9\u6846\u5c5e\u6027\u5b9a\u4f4d\u5076\u73b0\u65e0\u6cd5\u627e\u5230","text":"\u6587\u4ef6\u9009\u62e9\u6846\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5728\u8c03\u7528\u6587\u4ef6\u9009\u62e9\u6846\u65f6\uff0c\u6709\u4e00\u5b9a\u7684\u6982\u7387\u51fa\u73b0\uff0c\u754c\u9762\u5df2\u7ecf\u6e32\u67d3\u51fa\u6765\u4e86\uff0c\u4f46\u662f\u5c5e\u6027\u6811\u5e76\u6ca1\u6709\u5199\u5165\uff0c\u5bfc\u81f4\u901a\u8fc7\u5c5e\u6027\u65e0\u6cd5\u627e\u5230\u5143\u7d20\uff0c\u76ee\u524d\u4e5f\u6ca1\u6709\u5f88\u597d\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u4e3a\u4e86\u7528\u4f8b\u7a33\u5b9a\u6027\uff0c\u6587\u4ef6\u9009\u62e9\u6846\u7684\u64cd\u4f5c\u5efa\u8bae\u4f7f\u7528UI\u6216\u8005\u56fe\u7247\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u53ef\u4ee5\u901a\u8fc7\u641c\u7d22\u5185\u5bb9\u56fa\u5b9a\u6587\u4ef6\u4f4d\u7f6e\u3002 # litaoa@uniontech.com\n desk = DdeDesktopPublicWidget()\n# \u9009\u62e9\u89c6\u9891\u76ee\u5f55\ndesk.click_videos_dir_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.ctrl_f()\nsleep(1)\ndesk.input_message(\"\u5143\u7d20\u540d\u79f0\")\nsleep(0.5)\ndesk.enter()\nsleep(1)\n# \u9009\u62e9\u7b2c\u4e00\u4e2a\u6587\u4ef6\ndesk.click_list_view_btn_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.click_first_file_in_desktop_plugs_by_ui()\nsleep(1)\n# \u6587\u7ba1\u63d2\u4ef6\u4e2d\u70b9\u51fb\u6253\u5f00\ndesk.click_open_btn_in_desktop_plugs_by_ui()\n"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#4","title":"4\u3001\u5e94\u7528\u542f\u52a8","text":"# mikigo\n \u5728UI\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u4e00\u5207\u64cd\u4f5c\u7684\u90fd\u662f\u4ece\u5e94\u7528\u542f\u52a8\u5f00\u59cb\u7684\uff0c\u800c\u5728Linux\u684c\u9762\u5e94\u7528\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u6211\u4eec\u542f\u52a8\u5e94\u7528\u7684\u65b9\u6cd5\u6709\u591a\u79cd\uff0c\u4e0b\u9762\u505a\u4e00\u4e2a\u7b80\u5355\u7684\u4ecb\u7ecd\uff1a \u3010\u4f7f\u7528dogtail\u542f\u52a8\u3011 dogtail\u63d0\u4f9b\u4e86\u5e94\u7528\u542f\u52a8\u7684\u65b9\u6cd5\uff0c\u5728utils\u5e93\u4e2d\uff0c\u4f7f\u7528run\u65b9\u6cd5\u542f\u52a8\uff1a \u9996\u5148\u5bfc\u5165\u65b9\u6cd5\uff1a from dogtail.utils import *\n \u8c03\u7528run\u65b9\u6cd5 run('deepin-music')\n \u5373\u53ef\u542f\u52a8\u97f3\u4e50 \u8fd9\u79cd\u65b9\u6cd5\u7684\u4f18\u70b9\u662f\u91c7\u7528\u8fdb\u7a0b\u7684\u65b9\u5f0f\u76f4\u63a5\u542f\u52a8\uff0c\u4e0d\u4f9d\u8d56\u4e0eUI\uff0c\u65e0\u8bba\u684c\u9762\u6216\u4efb\u52a1\u680f\u4e0a\u662f\u5426\u5b58\u5728\u5e94\u7528\u56fe\u6807\uff0c\u90fd\u53ef\u4ee5\u6b63\u5e38\u542f\u52a8\u3002 \u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c \u5982\u679c\u4f7f\u7528ssh\u8fdc\u7a0b\u8c03\u7528\uff0c\u6216\u8005Jenkins\u4e2d\u6267\u884c\u6d4b\u8bd5\u811a\u672c\u7684\u65f6\u5019\uff0c\u5728sniff\u4e2d\u4f1a\u51fa\u73b0\u627e\u4e0d\u5230\u5e94\u7528\uff0c\u7ecf\u8fc7\u5206\u6790\uff0c\u53ef\u80fd\u662f\u56e0\u4e3a\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\u542f\u52a8\u7684\u65f6\u5019\uff0c\u5b9e\u9645\u662f\u91c7\u7528\u4e00\u4e2a\u5b50\u8fdb\u7a0b\u542f\u52a8\u4e86\u5e94\u7528\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u5230\u3002 \u3010\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u3011 \u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807 \u901a\u5e38\u6709\u4e24\u79cd\u65b9\u6cd5\uff1a \uff081\uff09\u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807\u3002 \uff082\uff09\u5df2\u77e5\u5e94\u7528\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u7684\u4f4d\u7f6e\uff0c\u7136\u540e\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u5bf9\u5e94\u5750\u6807\u3002 \u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u7f3a\u70b9\u662f\u4f4d\u7f6e\u5fc5\u987b\u56fa\u5b9a\uff0c\u5982\u679c\u79fb\u52a8\u4f4d\u7f6e\u5c31\u4e0d\u884c\u4e86\uff0c\u800c\u4f7f\u7528\u7b2c\u4e00\u79cd\u65b9\u6cd5\uff0c\u65e0\u8bba\u4f4d\u7f6e\u5728\u54ea\u91cc\uff0c\u53ea\u8981\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u5b58\u5728\u5373\u53ef\u3002 \u3010\u70b9\u51fb\u684c\u9762\u56fe\u6807\u542f\u52a8\u3011 \u684c\u9762\u56fe\u6807\u76ee\u524d\u662f\u91c7\u7528\u56fe\u50cf\u8bc6\u522b\u6280\u672f\uff0c\u5b9a\u4f4d\u5230\u5e94\u7528\u56fe\u6807\u7684\u5750\u6807\uff0c\u7136\u540e\u901a\u8fc7pyauogui\u8fdb\u884c\u70b9\u51fb\u64cd\u4f5c\u3002 \u8be6\u7ec6\u6280\u672f\u65b9\u6848\u53ef\u4ee5\u53c2\u8003\u6211\u7684\u53e6\u5916\u4e24\u7bc7\u535a\u5ba2: \u57fa\u4e8eopencv\u7684\u6a21\u677f\u5339\u914d\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd4\u56de\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 Python\u4e09\u65b9\u5e93PyAutoGui\u7684\u4f7f\u7528\u65b9\u6cd5 \u3010\u4ece\u542f\u52a8\u5668\u542f\u52a8\uff08\u4fd7\u79f0\u5f00\u59cb\u83dc\u5355\uff09\u3011 \u542f\u52a8\u4e2d\u542f\u52a8\u7684\u5b9e\u73b0\u903b\u8f91\u5b9e\u9645\u548c\u4efb\u52a1\u680f\u4e0a\u542f\u52a8\u5dee\u4e0d\u591a\u3002 \u9996\u5148\uff0c\u9700\u8981\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u542f\u52a8\u5668\u56fe\u6807\uff0c\u6216\u8005\u952e\u76d8super\u952e\uff0c\u5c06\u542f\u52a8\u5668\u547c\u51fa\u6765\uff0c \u7136\u540e\uff0c\u5728\u542f\u52a8\u5668\u4e2d\u70b9\u51fb\u5bf9\u5e94\u7684\u56fe\u6807\uff0c \u4f46\u662f\u8fd9\u91cc\u6709\u4e2a\u95ee\u9898\uff0c\u542f\u52a8\u5668\u4e2d\u7684\u5e94\u7528\u5217\u8868\uff0c\u4e00\u9875\u5c55\u793a\u4e0d\u5b8c\uff0c\u6240\u4ee5\u5982\u679c\u6211\u4eec\u8981\u70b9\u51fb\u7684\u5e94\u7528\u56fe\u6807\u4e0d\u5728\u7b2c\u4e00\u9875\u600e\u4e48\u529e\uff0c\u901a\u5e38\u89e3\u51b3\u65b9\u6848\u6709\u4e24\u79cd\uff1a \uff081\uff09\u9700\u8981\u8fdb\u884c\u5411\u4e0b\u6ed1\u52a8\uff0c\u8fd9\u91cc\u5c31\u6d89\u53ca\u5230\u76f8\u5e94\u7684\u8bc6\u522b\u65b9\u6848\uff0c\u5224\u65ad\u5982\u679c\u4e0d\u5728\u7b2c\u4e00\u9875\u5c31\u5f80\u4e0b\u6ed1\u52a8\u7ffb\u9875\u3002 \uff082\uff09\u542f\u52a8\u5668\u63d0\u4f9b\u641c\u7d22\u7684\u529f\u80fd\uff0c\u8f93\u5165\u5e94\u7528\u540d\u79f0\u641c\u7d22\uff0c\u7136\u540e\u8fdb\u884c\u70b9\u51fb\u3002 \u4ece\u5b9e\u9645\u64cd\u4f5c\u4e2d\u6765\u770b\uff0c\u91c7\u7528\u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u6548\u7387\u4f1a\u9ad8\u4e00\u70b9\u3002 \u3010\u7ec8\u7aef\u547d\u4ee4\u542f\u52a8\u3011 \u5728python\u4e2d\uff0c\u4f7f\u7528os.popen()\u6216os.system()\u6216\u8005subprocess.Popen()\uff0c\u5b9e\u73b0\u547d\u4ee4\u884c\u542f\u52a8\uff0c\u6bd4\u5982\uff1a import os\nos.popen('deepin-music')\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u8fdc\u7a0b\u6267\u884c\u811a\u672c\u7684\u65f6\u5019\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u7684\u95ee\u9898\u3002 \u3010\u603b\u7ed3\u3011 \u4ee5\u4e0a\u51e0\u79cd\u65b9\u6cd5\uff0c\u5404\u6709\u4f18\u7f3a\u70b9\uff0c\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff1a \uff081\uff09\u5982\u679c\u9700\u8981\u5728Jenkins\u4e2d\u505a\u6301\u7eed\u96c6\u6210\uff0c\u5efa\u8bae\u4f7f\u7528\u7b2c\u4e8c\u79cd\u4efb\u52a1\u680f\u542f\u52a8\u7684\u65b9\u6cd5\u3002 \uff082\uff09\u5982\u679c\u4e0d\u4f1a\u91c7\u7528\u8fdc\u7a0b\u6267\u884c\u7684\uff0c\u5efa\u8bae\u91c7\u7528\u7b2c\u4e00\u79cd\u6216\u8005\u6700\u540e\u4e00\u79cd\u65b9\u6848\u3002 \uff083\uff09\u7b2c\u4e09\u79cd\u548c\u7b2c\u56db\u79cd\u542f\u52a8\u65b9\u6cd5\uff0c\u901a\u5e38\u5728\u6d4b\u8bd5\u7528\u4f8b\u4e2d\u4f1a\u6d89\u53ca\u5230\uff0c\u6240\u4ee5\u5076\u5c14\u4f1a\u7528\u3002"},{"location":"RELEASE/","title":"\u7248\u672c\u66f4\u65b0\u8bb0\u5f55","text":""},{"location":"RELEASE/#2122023822","title":"2.1.2\uff082023/8/22\uff09","text":"new \u589e\u52a0 OCR \u8bc6\u522b\u81ea\u52a8\u91cd\u8bd5\u673a\u5236\uff0c\u9ed8\u8ba4\u91cd\u8bd5 2 \u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u91cd\u8bd5\u6b21\u6570\uff1b \u4f7f\u7528\u7a97\u7ba1\u6700\u65b0\u63d0\u4f9b\u7684\u4e8c\u8fdb\u5236\u63a5\u53e3\uff0c\u4f18\u5316\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u5728 Wayland \u4e0b\u83b7\u53d6\u7a97\u53e3\u4fe1\u606f\u7684\u65b9\u6cd5\uff1b\u611f\u8c22\u684c\u9762\u6d4b\u8bd5\u90e8 @\u4f55\u6743 @\u5b59\u7fe0 \u3001\u7a97\u7ba1\u7814\u53d1 @\u9ec4\u6cfd\u94ed \u7684\u5927\u529b\u652f\u6301\u3002 \u6269\u5145 skipif \u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\u51fd\u6570\uff1a skipif_xdg_type \u652f\u6301 x11 \u6216 wayland \u4e0a\u8df3\u8fc7\uff1b skipif_cpu_name \u652f\u6301\u4e0d\u540c cpu \u4e0a\u8df3\u8fc7\uff0c\u6bd4\u5982\uff1askipif_cpu_name-KLVVW5821\uff1b "},{"location":"RELEASE/#2102023818","title":"2.1.0\uff082023/8/18\uff09","text":"fix \u4fee\u590d SW \u67b6\u6784\u73af\u5883\u4f9d\u8d56\u7684\u95ee\u9898\uff0c\u539f\u56e0\u662f\u4e4b\u524d\u6211\u8fd9\u91cc\u672c\u5730\u6ca1\u6709 SW \u7684\u673a\u5668\uff0c\u6ca1\u6709\u505a\u76f8\u5173\u9002\u914d\uff1b \u4fee\u590d\u5b50\u9879\u76ee\u5355\u72ec\u9700\u8981\u4e09\u65b9\u5305 pexpect\uff0c\u7531\u4e8e\u4e4b\u524d\u662f\u9884\u88c5\u5230\u955c\u50cf\u91cc\u9762\u7684\uff0c\u4f46\u57fa\u7840\u6846\u67b6\u4e0d\u9700\u8981\uff0c\u56e0\u6b64\u6ca1\u6709\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u91cc\u9762\uff0c\u5bfc\u81f4\u5b50\u9879\u76ee\u4f9d\u8d56\u62a5\u9519\u3002 \u4fee\u590d\u5b50\u9879\u76ee cv \u5bfc\u5165\u62a5\u9519\u7684\u95ee\u9898\uff1b \u539f\u56e0\u4e3a\uff1ayouqu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u517c\u5bb9\u4e24\u79cd\u60c5\u51b5\uff0c\u4e00\u79cd\u662f\u9762\u5411\u670d\u52a1\uff0c\u5c31\u662f\u672c\u5730\u6d4b\u8bd5\u673a\u4e0d\u9700\u8981\u5b89\u88c5 OpenCV\uff0c\u7528\u4f8b\u4e2d\u7684\u56fe\u50cf\u8bc6\u522b\u4f1a\u901a\u8fc7\u8fdc\u7a0b\u670d\u52a1\u63a5\u53e3\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u548c\u7ed3\u679c\u83b7\u53d6\uff1b\u7b2c\u4e8c\u79cd\u662f\u539f\u751f\uff0c\u5c31\u662f\u672c\u5730\u76f4\u63a5\u5b89\u88c5 OpenCV \u76f4\u63a5\u7528\u3002\u4e24\u4e2a\u60c5\u51b5\u7684\u4f18\u5148\u7ea7\u662f\u4f18\u5148\u5224\u65ad\u672c\u5730\u5b58\u5728\uff0c\u5426\u5219\u8d70\u670d\u52a1\u3002 \u524d\u9762\u6211\u4eec\u5df2\u7ecf\u628a OCR \u529f\u80fd\u505a\u4e86\u670d\u52a1\u5316\uff0c\u57fa\u4e8e 1 \u5e74\u591a\u4ee5\u6765\u7684\u89c2\u5bdf\uff0c\u7528\u8d77\u6765\u5f88\u7a33\u5b9a\uff0c\u518d\u4e00\u4e2a\u5c31\u662f OpenCV \u5b89\u88c5\u5305\u662f\u6bd4\u8f83\u81c3\u80bf\u7684\uff0c\u7c97\u7565\u6570\u4e86\u4e0b\u4f9d\u8d56\u6709 30+ \u4e2a\uff0c\u800c\u4e14\u5728\u5404\u67b6\u6784\u4e0a\u4f9d\u8d56\u5305\u8fd8\u4e0d\u5c3d\u76f8\u540c\uff0c\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u65b9\u6848\u4e2d\u4e0d\u592a\u597d\u5904\u7406\uff0c\u6240\u4ee5\u672c\u6b21 2.0 \u7248\u672c\u6211\u4eec\u5927\u80c6\u7684\u5c06\u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u529f\u80fd\u4fee\u6539\u4e3a\u9762\u5411\u670d\u52a1\u7684\u65b9\u5f0f\uff0c\u524d\u671f\u6d4b\u8bd5\u4e00\u5207\u770b\u8d77\u6765\u90fd\u5f88\u548c\u8c10\u3002 \u4f46\u662f\u6ca1\u6ce8\u610f\u5230\u4e4b\u524d\u7ed9\u6d77\u71d5\u59d0\u90a3\u8fb9\u9879\u76ee\u5355\u72ec\u5b9a\u5236\u505a\u4e86\u4e2a\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\uff08\u4e3a\u4e86\u80fd\u7b80\u5355\u5e73\u6ed1\u7684\u8fc1\u79fb\u5230 youqu\uff09\uff0c\u6b64\u63a5\u53e3\u5e95\u5c42\u6ca1\u6709\u517c\u5bb9\u670d\u52a1\u5316\uff0c\u6240\u4ee5\u5979\u90a3\u8fb9\u7684\u9879\u76ee\u8c03\u7528\u6b64\u5b9a\u5236\u63a5\u53e3\u4f1a\u62a5 cv \u5bfc\u5165\u7684\u95ee\u9898\u3002 \u7531\u4e8e\u5c06\u8fd9\u4e2a\u5b9a\u5236\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\u8fdb\u884c\u670d\u52a1\u5316\u517c\u5bb9\u6539\u9020\u9700\u8981\u4e00\u5b9a\u65f6\u95f4\uff0c\u6539\u5b8c\u8fd8\u9700\u8981\u6d4b\u8bd5\uff0c\u4f46\u672c\u6b21\u65f6\u95f4\u6bd4\u8f83\u7d27\uff0c\u56e0\u6b64\u5148\u628a OpenCV \u88c5\u8fdb\u865a\u62df\u73af\u5883\uff0c\u540e\u7eed\u7248\u672c\u518d\u8003\u8651\u9488\u5bf9\u6b64\u63a5\u53e3\u505a\u4fee\u6539\u3002"},{"location":"RELEASE/#2002023816","title":"2.0.0\uff082023/8/16\uff09","text":"YouQu\uff08\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff09\u5f00\u6e90\u4e86\uff0c\u540c\u65f6\u63a8\u51fa\u4e86 2.0 \u7248\u672c\u3002 \u611f\u8c22\u738b\u6ce2\u603b\u3001\u67b6\u6784\u5e08\u5f90\u5c0f\u4e1c\u3001\u7814\u53d1\u7ecf\u7406\u90d1\u5e7c\u6208\u3001\u5218\u90d1\u7b49\u7814\u53d1\u540c\u4e8b\u7684\u5927\u529b\u652f\u6301\u3002 new 1\u3001\u65b0\u7684\u57fa\u7840\u6846\u67b6\u4ee3\u7801\u83b7\u53d6\u65b9\u5f0f\u53ca\u65b0\u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4 YouQu \u540e\u7eed\u5747\u901a\u8fc7 PyPI \u8fdb\u884c\u5305\u7684\u53d1\u5e03\uff0c\u4e5f\u5c31\u662f\u8bf4\u540e\u7eed\u53ef\u4ee5\u4f7f\u7528 pip \u8fdb\u884c\u5b89\u88c5\uff1a sudo pip3 install youqu==2.0.0\n \u8fd9\u91cc\u6709 2 \u4e2a\u5c0f\u70b9\u8981\u6ce8\u610f\uff1a \u63a8\u8350\u4f7f\u7528 sudo pip3 \uff08\u52a0 sudo\uff09\u8fdb\u884c\u5b89\u88c5\uff1b \u5982\u679c\u4e0d\u52a0 sudo \u6709\u4e9b\u673a\u5668\u53ef\u80fd $HOME/.local/bin \u4e0d\u5728\u7cfb\u7edf PATH \u73af\u5883\u76ee\u5f55\u4e0b\uff0c\u5728\u4e0d\u6dfb\u52a0\u73af\u5883\u53d8\u91cf\u7684\u60c5\u51b5\u4e0b\uff0c\u4f1a\u51fa\u73b0 YouQu \u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4\uff08youqu-startproject\uff09\u65e0\u6cd5\u4f7f\u7528\u7684\u95ee\u9898\uff1b \u5f53\u7136\uff0c\u5c06\u4e0a\u8ff0\u8def\u5f84\u6dfb\u52a0\u5230\u73af\u5883\u53d8\u91cf\u4e4b\u540e\u4e5f\u662f\u53ef\u4ee5\u7528\u7684\uff0c\u6240\u4ee5\u6211\u8fd9\u91cc\u662f\u63a8\u8350\u52a0 sudo\uff0c\u4e0d\u52a0 sudo \u4e5f\u662f\u53ef\u4ee5\u7684\uff0c\u53ea\u662f\u9700\u8981\u5173\u6ce8\u4e0b\u73af\u5883\u53d8\u91cf\u7684\u95ee\u9898\u3002 \u63a8\u8350\u6307\u5b9a\u7248\u672c\u53f7\uff08youqu==2.0.0\uff09\u5b89\u88c5\uff0c\u5982\u679c\u4e0d\u6307\u5b9a\u7248\u672c\u53f7\u9ed8\u8ba4\u662f\u5b89\u88c5\u6700\u65b0\u53d1\u5e03\u7684 YouQu \u7248\u672c\uff0c\u4f60\u53ef\u4ee5\u5728 PyPI \u4e0a\u7684 Release history \u91cc\u9762\u67e5\u770b\u6709\u54ea\u4e9b\u7248\u672c\u3002 \u5b89\u88c5\u4e4b\u540e\u4f1a\u81ea\u52a8\u751f\u6210\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu-startproject\uff0c\u4f7f\u7528\u5b83\u53ef\u4ee5\u521d\u59cb\u5316\u5de5\u7a0b\uff0c\u8fd9\u91cc\u4ee5\u97f3\u4e50\u4e3e\u4f8b\uff1b youqu-startproject autotest_deepin_music\n \u8fd9\u6837\u5c31\u4f1a\u5728\u5f53\u524d\u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a autotest_deepin_music \u76ee\u5f55\uff0c\u91cc\u9762\u5305\u542b\u4e86\u57fa\u7840\u6846\u67b6\u6240\u6709\u7684\u4ee3\u7801\uff1b \u4e4b\u540e\uff0c\u8fd8\u662f\u5728 apps \u76ee\u5f55\u4e0b\uff0c\u653e\u5165\u5b50\u9879\u76ee\u7684AT\u4ee3\u7801\u5373\u53ef\uff0c\u4f7f\u7528\u65b9\u6cd5\u548c\u8fc7\u53bb\u4e00\u6837\uff0c\u8fd9\u91cc\u5c31\u4e0d\u591a\u4ecb\u7ecd\u3002 \u53e6\u5916\uff0c\u9664\u4e86\u901a\u8fc7 pip \u83b7\u53d6\u4ee5\u5916\uff0c\u4ecd\u7136\u53ef\u4ee5\u901a\u8fc7\u6e90\u7801\u83b7\u53d6\uff08\u76f4\u63a5 git clone\uff09\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u4f7f\u7528 pip \u5b89\u88c5 YouQu \u65f6\uff0cYouQu \u5305\u7684\u5927\u5c0f\u624d 600+ k\uff0c\u5b89\u88c5\u901f\u5ea6\u8d77\u98de\u3002 2\u3001\u65b0\u7684AT\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848 \u4e3a\u4e86\u89e3\u51b3\u4ee5\u4e0b\u95ee\u9898\uff1a \u8fc7\u53bb\u4e00\u6bb5\u65f6\u95f4\u54b1\u4eec\u7ecf\u5e38\u51fa\u73b0\u7684\uff0c\u4e0d\u540c\u7684AT\u9879\u76ee\u5728\u540c\u4e00\u53f0\u673a\u5668\u4e0a\u90e8\u7f72\u73af\u5883\u65f6\u4f9d\u8d56\u7248\u672c\u51b2\u7a81\u7684\u95ee\u9898\uff0c\u65b0\u65b9\u6848\u4e0d\u540c\u7684\u9879\u76ee\u4f1a\u52a8\u6001\u751f\u6210\u81ea\u5df1\u7684\u865a\u62df\u73af\u5883\uff0c\u76f8\u4e92\u4e4b\u95f4\u4e0d\u5f71\u54cd\uff1b \u4e1a\u5185\u4e3a\u4e86\u89e3\u51b3\u7248\u672c\u51b2\u7a81\u95ee\u9898\u4e00\u822c\u90fd\u4f1a\u4f7f\u7528Python\u865a\u62df\u73af\u5883\u7684\u5de5\u5177\uff0c\u4f46\u662f\u90fd\u6709\u4e2a\u95ee\u9898\uff0c\u65e0\u6cd5\u7ba1\u7406 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u5305\uff0c\u672c\u6b21\u6211\u4eec\u89e3\u51b3\u4e86\u8fd9\u4e2a\u95ee\u9898\uff0c\u80fd\u591f\u5b8c\u5168\u7ba1\u7406\u5e38\u89c4\u7684Python\u5305\uff0c\u4e5f\u80fd\u7ba1\u7406\u5230 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u4e09\u65b9\u5305\uff1b \u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u4f7f\u7528\u65b9\u6cd5\uff1a bash env.sh\n \u53ef\u4ee5\u770b\u51fa\u6765\u548c\u539f\u6765\u4f7f\u7528\u65b9\u6cd5\u6ca1\u6709\u53d8\u5316\uff0c\u4e5f\u5c31\u662f\u8bf4\u4ece\u4f7f\u7528\u7684\u89d2\u5ea6\u662f\u5b8c\u5168\u6ca1\u6709\u533a\u522b\u7684\uff0c\u53ea\u662f\u5185\u90e8\u505a\u4e86\u4e0d\u540c\u7684\u4e8b\u60c5\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u672c\u673a\u90e8\u7f72\u7684\u529f\u80fd\u4ecd\u7136\u4fdd\u7559 env_dev.sh\uff0c\u53ef\u4ee5\u4f5c\u4e3a\u5f00\u53d1\u65f6\u7684\u73af\u5883\u90e8\u7f72\u3002 3\u3001\u65b0\u7684\u9a71\u52a8\u547d\u4ee4 \u8fc7\u53bb\u54b1\u4eec\u90fd\u662f\u4f7f\u7528\u8fd9\u6837\u7684\u547d\u4ee4\u6765\u9a71\u52a8\u6267\u884c\uff1a python3 manage.py run\n \u7531\u4e8e\u9ed8\u8ba4\u57fa\u4e8e\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848\uff0c\u56e0\u6b64\u6211\u4eec\u589e\u52a0\u4e86\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu\uff1b \u65b0\u7684\u9a71\u52a8\u65b9\u5f0f\uff1a youqu manage.py run\n \u53ea\u9700\u8981\u628a python3 \u66ff\u6362\u6210 youqu \u5c31\u53ef\u4ee5\u4e86\uff0c\u770b\u8d77\u6765\u5f88\u548c\u8c10~ 4\u3001\u65b0\u7684\u6587\u6863\u5730\u5740 \u8fc7\u53bb\u54b1\u4eec YouQu \u7684\u5728\u7ebf\u6587\u6863\u662f\u90e8\u7f72\u5728\u516c\u53f8\u5185\u7f51\u7684\uff0c\u73b0\u5728\u5f00\u6e90\u5230 github \u4e86\uff0c\u5916\u90e8\u5f00\u53d1\u8005\u80af\u5b9a\u8bbf\u95ee\u4e0d\u5230\u5185\u7f51\u7684\u6587\u6863\uff0c\u56e0\u6b64\u9700\u8981\u5c06\u6587\u6863\u90e8\u7f72\u5230\u516c\u7f51\u3010\u516c\u7f51\u6587\u6863\u3011\uff1b \u516c\u7f51\u6587\u6863\u4f7f\u7528\u7684\u662f github pages\uff08\u767d\u5ad6\u602a\u4e00\u987f\u72c2\u559c~~\uff09\uff0c\u4f46\u53ef\u80fd\u4f1a\u51fa\u73b0\u6587\u6863\u901f\u5ea6\u6162\u7684\u95ee\u9898\uff08\u4ee3\u7406\u4e0b\u5c31\u597d\u4e86\uff09\uff0c\u4e0d\u8fc7\u6ca1\u5173\u7cfb\uff0c\u54b1\u4eec\u3010\u5185\u7f51\u6587\u6863\u3011\u4ecd\u7136\u4fdd\u7559\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u3002 5\u3001\u5176\u4ed6\u4e00\u4e9b\u5c0f\u5c0f\u529f\u80fd\u66f4\u65b0\uff1a \uff081\uff09\u65b0\u589e\u5173\u95ed\u5206\u8fa8\u7387\u68c0\u6d4b\u7684\u53c2\u6570\u503c\uff1b youqu manage.py run --resolution no\n \u6216\u8005\u4fee\u6539 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387, \u6bd4\u5982\uff1a1920x1080\n;no: \u8868\u793a\u4e0d\u505a\u5206\u8fa8\u7387\u6821\u9a8c\nRESOLUTION = 1920x1080\n resolution \u8fd9\u4e2a\u53c2\u6570\u4e00\u76f4\u90fd\u6709\u7684\uff0c\u53ea\u4e0d\u8fc7\u4e4b\u524d\u662f\u7528\u4e8e\u6307\u5b9a\u5206\u8fa8\u7387\u5927\u5c0f\uff0c\u6bd4\u5982 --resolution 1920x1080\uff0c\u4f46\u6709\u4e9b\u63a5\u53e3\u7684\u9879\u76ee\u4e0d\u9700\u8981\u8fd9\u4e2a\u68c0\u67e5\uff0c\u53ef\u4ee5\u7ed9\u5b83\u4e2a no \u5c31\u597d\u4e86\uff0c\u5f53\u7136 CICD \u4e0a\u5173\u95ed\uff0c\u9700\u8981\u6d41\u6c34\u7ebf\u4e0a\u628a\u8fd9\u4e2a\u53c2\u6570\u52a0\u4e0a\uff1b \uff082\uff09\u65b0\u589e\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u7684\u547d\u4ee4\u884c\u53c2\u6570 \u4e4b\u524d\u8fd9\u4e2a\u914d\u7f6e\u9879\u53ea\u80fd\u5728 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c 1 \u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff0cRERUN >= RECORD_FAILED_CASE\u3002\n;1.\u5173\u95ed\u5f55\u5c4f\uff1aRECORD_FAILED_CASE > RERUN\n;2.\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1aRECORD_FAILED_CASE = 0\nRECORD_FAILED_CASE = 1\n \u73b0\u5728\u5c06\u5f00\u53d1\u5230\u547d\u4ee4\u884c\u53c2\u6570\u3002 youqu manage.py run --record_failed_case 2\n fix \u4fee\u590d remote \u6267\u884c\u65f6\uff0c\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u65e0\u6cd5\u751f\u6210\u6d4b\u8bd5\u62a5\u544a\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1302023710","title":"1.3.0\uff082023/7/10\uff09","text":"fix \u8fdb\u4e00\u6b65\u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b\u53c2\u8003\uff1a\u914d\u7f6ePython\u6e90\u7684\u51e0\u79cd\u65b9\u6cd5 \u4fee\u590d wayland_autotool \u53d7\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86wayland\u4e0b\u5076\u73b0\u627e\u4e0d\u5230 .Xauthority \u6587\u4ef6\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1292023626","title":"1.2.9\uff082023/6/26\uff09","text":"fix \u4f18\u5316\u8fdc\u7a0b\u6267\u884c remote \u7684\u53c2\u6570\u76f4\u63a5\u4f20\u7ed9\u8fdc\u7a0b\u673a\u5668\u7684 run \u547d\u4ee4\uff0c\u4e0d\u7528\u518d\u5355\u72ec\u5904\u7406\u8fdc\u7a0b\u6267\u884c\u7684\u53c2\u6570\u903b\u8f91\uff0c\u540e\u7eed\u4e13\u6ce8\u4e8e\u672c\u5730\u6267\u884c\u529f\u80fd\u5f00\u53d1\uff0c\u8fdc\u7a0b\u6267\u884c\u81ea\u52a8\u9002\u7528\uff1b env.sh \u79fb\u9664 pyyaml \u5b89\u88c5\uff0c\u7531\u5b50\u9879\u76ee\u5728 requirement.txt \u91cc\u9762\u5b9a\u4e49\uff0c\u6846\u67b6\u81ea\u52a8\u52a0\u8f7d\uff1b \u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b "},{"location":"RELEASE/#128202369","title":"1.2.8\uff082023/6/9\uff09","text":"fix \u4fee\u590d\u4e86 pypi \u5b89\u88c5 numpy \u5b58\u5728\u7cfb\u7edf\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#127202368","title":"1.2.7\uff082023/6/8\uff09","text":"fix env.sh \u4e2d\u5b89\u88c5 Python \u5305\u672a\u6307\u5b9a\u7248\u672c\u65f6\uff0c\u65e5\u5fd7\u8f93\u51fa\u5b89\u88c5\u7684\u7248\u672c\uff1b pdocr-rpc 2.0.1\nallure-custom 1.2.1\nfunnylog 1.1.3\n \u4fee\u590d -f \u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u62a5\u9519\u7684\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#126202367","title":"1.2.6\uff082023/6/7\uff09","text":"fix \u4fee\u590d wayland \u4e0a\u8c03\u7528\u9f20\u6807\u4e2d\u952e\u3001\u53f3\u952e\u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b \u4fee\u590d pubilic/dde_desktop_public_widget \u91cc\u9762\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u5b9a\u4f4d\u684c\u9762\u6587\u4ef6\u7684\u65b9\u6cd5\uff0c\u5750\u6807\u6ca1\u6709\u62c6\u5305\u7684\u95ee\u9898\uff1b \u4f18\u5316\u4e86\u7b49\u5f85\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b pycreeze \u7248\u672c\u5347\u7ea7\u5230 0.1.29\uff0c\u5bfc\u81f4\u4e0e pyautogui 0.9.53 \u4e0d\u517c\u5bb9\uff0cenv.sh \u91cc\u9762\u589e\u52a0\u6307\u5b9a pycreeze \u7248\u672c\u4e3a 0.1.28\uff1b "},{"location":"RELEASE/#1252023516","title":"1.2.5\uff082023/5/16\uff09","text":"new --app \u53c2\u6570\u540e\u9762\u65b0\u589e\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u76ee\u524d\u652f\u6301\u4e09\u79cd\u53c2\u6570\u4f20\u5165\u65b9\u5f0f\uff1a ~$: youqu run -a deepin-music\n~$: youqu run -a autotest_deepin_music\n~$: youqu run -a apps/autotest_deepin_music\n \u200b \u540e\u4e24\u79cd\u5165\u53c2\u65b9\u5f0f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\u3002 remote \u8fdc\u7a0b\u6267\u884c\u65b0\u589e\u4ece\u547d\u4ee4\u884c\u4f20\u5165\u6d4b\u8bd5\u673a\u4fe1\u606f\uff0c\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679c password \u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6 setting/remote.ini \u4e2d CLIENT_PASSWORD \u7684\u503c,\u6bd4\u5982\uff1auos@10.8.13.33:1 \u6216 uos@10.8.13.33 \uff1b python3 manage.py remote -c uos@10.8.13.33/uos@10.8.13.34\npython3 manage.py remote -c uos@10.8.13.33:1/uos@10.8.13.34:2\n fix \u65e5\u5fd7\u6a21\u5757\u4fee\u6539\u4e3a\u51fd\u6570\u6267\u884c\u4e4b\u524d\u6253\u5370\u65e5\u5fd7\uff1b \u65e5\u5fd7\u6a21\u5757\u589e\u52a0\u767d\u540d\u5355\uff0c\u901a\u8fc7\u7c7b\u540d\u5f00\u5934\uff0c\u7ed3\u675f\uff0c\u5305\u542b\u7b49\u5173\u952e\u5b57\u63a7\u5236\u9700\u8981\u6253\u5370\u7684\u51fd\u6570\u65e5\u5fd7\uff1b \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5982\u679c\u4f20\u5165\u4e86 app_name \u53ea\u4f1a\u5c06 apps \u76ee\u5f55\u4e0b app_name \u7684\u76ee\u5f55\u53d1\u9001\u5230\u6d4b\u8bd5\u673a\uff1b env.sh \u79fb\u9664 python3-dev\uff1b \u4fee\u590d Wayland \u4e0b env.sh \u73af\u5883\u5b89\u88c5\u5931\u8d25\u7684\u95ee\u9898\uff0c\u4f18\u5316\u4e86 deb \u4f9d\u8d56\u5b89\u88c5\u7684\u903b\u8f91\uff1b \u5c06 env.sh \u5237\u65b0\u6e90\u7684\u65e5\u5fd7\u5728\u7ec8\u7aef\u663e\u793a\uff0c\u89e3\u51b3\u5728 CI \u73af\u5883\u4e0b\uff0c\u957f\u65f6\u95f4\u4e0d\u8f93\u51fa\u65e5\u5fd7\u8fde\u63a5\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d1060 \u534e\u4e3a\u673a\u578b\u5b89\u88c5\u952e\u9f20\u5de5\u5177\u65f6\u4f9d\u8d56\u4e0d\u517c\u5bb9\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1242023227","title":"1.2.4\uff082023/2/27\uff09","text":"fix \u4fee\u6539 CURRENT \u6587\u4ef6\uff1b "},{"location":"RELEASE/#1232023227","title":"1.2.3\uff082023/2/27\uff09","text":"new pylint.sh \u652f\u6301\u901a\u8fc7\u4f4d\u7f6e\u53c2\u6570\u4f20\u5165\u6587\u4ef6\u8def\u5f84\uff1abash pylint.sh apps/autotest_deepin_music,\u597d\u5904\u662f\u53c2\u6570\u8def\u5f84\u53ef\u4ee5\u5728\u7ec8\u7aef\u8865\u5168\uff1b \u65b0\u589e\u7cfb\u7edf\u547d\u4ee4 youqu-pylint \uff0c\u7528\u4e8e\u9759\u6001\u4ee3\u7801\u626b\u63cf\uff0c\u4f7f\u7528\u65b9\u6cd5: youqu-pylint apps/autotest_deepin_music\uff1b \u7531\u4e8e\u7cfb\u7edf\u4e00\u4e9b dbus \u63a5\u53e3\u6539\u53d8\uff0c\u516c\u5171\u5e93\u4e2d\u7684 dbus \u65b9\u6cd5\u5c06\u4e0d\u518d\u7ef4\u62a4\uff0c\u7531\u5b50\u9879\u76ee\u5728 other_widget.py \u91cc\u9762\u8fdb\u884c\u7ef4\u62a4\uff1b fix \u4fee\u590d ssh \u73af\u5883\u4e0b\u8fd0\u884c\u63d0\u793a \u201c\u65e0\u6cd5\u8fde\u63a5\u201d \u7684\u95ee\u9898\uff1b \u4fee\u590d\u8fd0\u884c\u65f6\u7a0b\u5e8f\u9000\u51fa\uff0c\u4e0d\u8f93\u51fa\u5f02\u5e38\u65e5\u5fd7\u7684\u95ee\u9898\uff1b \u4fee\u590dyouqu remote xxx \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5728\u670d\u52a1\u7aef Ctrl + C \u65e0\u6cd5\u505c\u6b62\u7a0b\u5e8f\u8fd0\u884c\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#122202328","title":"1.2.2\uff082023/2/8\uff09","text":"new \u65b0\u589e\u6c14\u6ce1\u7c7b\u56fe\u50cf\u8bc6\u522b\u65b9\u6848\uff1bimage_utils.py::ImageUtil::get_during\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u533a\u57df\u8bc6\u522b\uff0c\u4f20\u5165 [x, y, w, h]\uff0cx: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u76ee\u6807\u56fe\u7247\uff0c\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\uff1b env.sh \u79fb\u9664 pypinyin; \u4f18\u5316\u6267\u884c env.sh \u65f6\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b manage.py \u79fb\u9664\u4e86\u53c2\u6570 session_timeout \uff0c\u6846\u67b6\u6839\u636e\u5168\u5c40\u7684 timeout \u4ee5\u53ca\u7528\u4f8b\u81ea\u5b9a\u4e49\u7684 timeout \u81ea\u52a8\u8ba1\u7b97\u51fa sessiontimeout \u7684\u503c\uff1b \u65b0\u589e ocr \u670d\u52a1\u5668\u94fe\u63a5\u91cd\u8bd5\uff0c\u9ed8\u8ba4\u91cd\u8bd51\u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u53c2\u6570\uff1b fix \u4fee\u590d\u4e86\u4e00\u4e9b pylint \u626b\u63cf\u7684\u4ee3\u7801\u98ce\u683c\u95ee\u9898\uff1b \u91cd\u65b0\u8bbe\u8ba1\u4e86\u6d4b\u8bd5\u62a5\u544a\u4e3b\u9898\uff1b "},{"location":"RELEASE/#121202316","title":"1.2.1\uff082023/1/6\uff09","text":"new \u652f\u6301\u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6267\u884c\u7528\u4f8b\uff1b\u53ef\u5c06python3 manage.py \u66ff\u6362\u4e3a youqu \uff1a youqu run -a deepin-music -k 001\n RPC \u670d\u52a1 IP \u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u6307\u5b9a\u4e0d\u540c\u7684\u7aef\u53e3\uff1b \u5728\u7ebf\u6587\u6863\u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u539f\u6765\u7684\u5730\u5740 10.8.10.215 \u5c06\u4e0d\u5728\u4f7f\u7528\uff1b fix \u4fee\u590d --count \u53c2\u6570\u53ef\u80fd\u51fa\u73b0\u4e0e\u5176\u4ed6\u6846\u67b6\u7684\u5de5\u7a0b\u4f9d\u8d56\u5b58\u5728\u51b2\u7a81\uff0c\u62a5\u9519\u91cd\u590d\u6ce8\u518c\u7684\u95ee\u9898\uff1b \u4fee\u590d CI \u73af\u5883\u4e0b\u591a\u4e2a\u5de5\u7a0b\u5b58\u5728 Python \u73af\u5883\u53d8\u91cf\u6307\u5411\u9519\u8bef\uff0c\u5bfc\u5305\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u5355\u72ec\u8fd0\u884c\u65b9\u6cd5\u65f6\u65e0\u65e5\u5fd7\u8f93\u51fa\u7684 Bug\uff1b "},{"location":"RELEASE/#12020221230","title":"1.2.0\uff082022/12/30\uff09","text":"1.1.4 \u7248\u672c\u9002\u914d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e14\u65b0\u589e\u4e86\u8f83\u591a\u65b0\u7279\u6027\uff0c\u6211\u4eec\u8ba1\u5212\u4f7f\u7528 1.1.4 \u7248\u672c\u8fd0\u884c\u4e00\u6bb5\u65f6\u95f4\uff0c1.2.0 \u7248\u672c\u5c06\u4fee\u590d\u671f\u95f4\u51fa\u73b0\u7684 Bug\uff0c\u7136\u540e\u4f5c\u4e3a\u7a33\u5b9a\u7248\u672c\u53d1\u5e03\u3002 new \u4fee\u6539\u5de5\u7a0b\u540d\u79f0\u4e3a youqu\uff1b \u5c06 sphinx \u6587\u6863\u5de5\u7a0b\u8fc1\u79fb\u5230\u5355\u72ec\u7684\u4ed3\u5e93\uff1b fix \u4fee\u590d startapp \u521b\u5efa\u5de5\u7a0b\u65f6\u5b58\u5728\u5de5\u7a0b\u540d\u79f0\u65f6\u65e0\u6cd5\u7ee7\u7eed\u521b\u5efa\uff1b \u4fee\u590d\u4e86 OCR \u670d\u52a1\u5728\u5e76\u53d1\u65f6\u53ef\u80fd\u51fa\u73b0\u65e0\u6cd5\u8fd4\u56de\u7ed3\u679c\u7684\u95ee\u9898\uff0c\u63d0\u5347 OCR \u670d\u52a1\u9ad8\u5e76\u53d1\u7a33\u5b9a\u6027\uff1b \u4fee\u590d PMS \u540c\u6b65\u6807\u7b7e\u5230 CSV \u6587\u4ef6\u4e0d\u652f\u6301\u7528\u4f8b\u5e93\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11420221214","title":"1.1.4\uff082022/12/14\uff09","text":"new \u65b0\u589e startapp \u5b50\u547d\u4ee4\u521b\u5efa\u5b50\u9879\u76ee\u5de5\u7a0b\u6a21\u677f: python3 manage.py startapp autotest_deepin_xxx \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u91cd\u590d\u6267\u884c\u6b21\u6570\uff1b \u53bb\u6389\u6279\u91cf\u6267\u884c\u524d\u6536\u96c6\u7528\u4f8b\u7684\u6b65\u9aa4\uff1b \u589e\u52a0\u5f00\u59cb\u6267\u884c\u65f6\u6253\u5370\u4e00\u4e9b\u6267\u884c\u53c2\u6570\uff0c\u5982\uff1a \u7528\u4f8b\u6536\u96c6\u6570\u91cf: 99\n\u5931\u8d25\u91cd\u8dd1\u6b21\u6570: 1\n\u6700\u5927\u5931\u8d25\u6b21\u6570: 49\n\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4: 200.0s (03\u520620\u79d2)\n\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4: 11880s (3\u5c0f\u65f618\u52060\u79d2)\n \u5b9a\u5236\u4fee\u6539allure\u62a5\u544alogo\u3001title\u3001\u9ed8\u8ba4\u8bed\u8a00\uff1b manage.py \u6267\u884c\u5f00\u59cb\u65f6\u6253\u5370 logo \u548c\u5f53\u524d\u7248\u672c\uff1a \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u255a\u2588\u2588\u2557 \u2588\u2588\u2554\u255d \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2584\u2584 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2580\u2580\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u2584\u2588 \u2584\u2588 \u2588 \u2588 \u2588 \u2584 \u2588 \u2584 \u2580\u2580\u2588 \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\uff1b \u88c5\u9970\u5668\u65b9\u6cd5\u6307\u5b9a\u6b21\u6570\uff1b @pytest.mark.count(2)\ndef test_music_001():\npass\n \u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u6b21\u6570\uff1b python3 manage.py run -a deepin-music -k 001 --count 2\n \u200b image_utils \u589e\u52a0\u51fd\u6570 save_temporary_picture\uff0c\u652f\u6301\u6307\u5b9a\u5c4f\u5e55\u533a\u57df\u622a\u56fe\u5e76\u8fd4\u56de\u56fe\u7247\u5b58\u653e\u7684\u672c\u5730\u8def\u5f84\uff0c\u540e\u7eed\u4f7f\u7528 assert_image_exist \u8fdb\u884c\u65ad\u8a00 Python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(x, y, width, height) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) button_center \u65b0\u589e btn_size \u83b7\u53d6\u63a7\u4ef6\u5de6\u4e0a\u89d2\u5750\u6807\u53ca\u957f\u5bbd\uff0c\u7528\u4e8e\u52a8\u6001\u7684\u622a\u53d6\u5143\u7d20\u7684\u56fe\u7247\uff0c\u53ef\u7528\u4e8e\u5b9a\u4f4d\u65ad\u8a00 python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u6240\u6709\u97f3\u4e50\u6309\u94ae\")) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) allure \u62a5\u544a\u4e2d\u5b9a\u4f4d\u95ee\u9898\u9664\u4e86\u65e5\u5fd7\u3001\u622a\u56fe\u3001\u5f55\u5c4f\u5916\uff0c\u8c03\u7528\u7684\u51fd\u6570\u589e\u52a0\u4e86 step \u6b65\u9aa4\u5c55\u793a\uff1b env.sh \u65b0\u589e\u5b89\u88c5\u5b50\u9879\u76ee Python \u4e09\u65b9\u4f9d\u8d56\uff0c\u5728\u5b50\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u5199 requirement.txt \u6587\u4ef6\uff0cenv.sh \u4f1a\u81ea\u52a8\u52a0\u8f7d\uff1b ocr \u8bc6\u522b\u65b0\u589e\u652f\u6301\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\u8fdb\u884c\u6587\u5b57\u8bc6\u522b\uff0c\u51cf\u5c11\u56e0\u5168\u5c4f\u8bc6\u522b\u65f6\uff0c\u5176\u4ed6\u6587\u5b57\u7684\u5e72\u6270 Python # \u65ad\u8a00\u97f3\u4e50\u7684\u5220\u9664\u5f39\u7a97\u4e2d\uff0c\u5305\u542b\u4e86\u201c\u786e\u8ba4\u201d\u7684\u6587\u5b57 self.assert_ocr_exist(\"\u786e\u8ba4\", picture_abspath=DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u5220\u9664\u5f39\u7a97\"))) \u65ad\u8a00\u51fd\u6570\u7684\u8c03\u7528\u4e5f\u4f1a\u81ea\u52a8\u6253\u5370\u65e5\u5fd7; env.sh \u65b0\u589e\u88c1\u526a\u4f9d\u8d56\u7684\u65b9\u6848\uff1b fix \u4fee\u590d Jenkins \u73af\u5883\u4e0b\uff0c apps \u76ee\u5f55\u4e0b\u5b50\u9879\u76ee\u5b58\u5728 auotest_deepin_xxx@tmp \u76ee\u5f55\uff0c\u5728\u4f20\u5165 app_name \u540e\u65e0\u6cd5\u6267\u884c\u7528\u4f8b\u7684\u95ee\u9898\uff1b \u4fee\u590d\u81ea\u52a8\u751f\u6210 case_list.csv \u6587\u4ef6\u65f6\uff0c\u7528\u4f8b\u987a\u5e8f\u88ab\u8c03\u6574\u7684\u95ee\u9898\uff1b env.sh \u73af\u5883\u5b89\u88c5\u79fb\u9664 git \u548c curl\uff1b \u4fee\u590d\u7528\u4f8b\u5728 setup \u9636\u6bb5\u62a5\u9519\u540e\uff0c\u672a\u5199\u5165 ci_result.json \u7684\u95ee\u9898\uff1b \u79fb\u9664 uos_ci.py\uff1b "},{"location":"RELEASE/#11320221028","title":"1.1.3\uff082022/10/28\uff09","text":"new \u65b0\u589e\u56fe\u50cf\u65ad\u8a00\u6210\u529f\u8f93\u51fa\u5339\u914d\u5ea6\uff1b \u65b0\u589e\u73af\u5883\u5b89\u88c5 yaml \u4f9d\u8d56\uff1b \u65b0\u589e\u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6570\u636e\u56de\u586b\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b \u65b0\u589e\u6d4b\u8bd5\u7ed3\u679c\u8868\u60c5\u663e\u793a\uff0c\u5e76\u4f18\u5316\u4e86\u65e5\u5fd7\u7684\u6392\u7248\uff1b \u65b0\u589e --top {number} \u7528\u4e8e\u8bb0\u5f55\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0c\u65e5\u5fd7\u751f\u6210\u5230 report/logs/top.log\uff1b fix \u4fee\u590d\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4f46\u7ec8\u7aef\u6ca1\u6709\u9519\u8bef\u65e5\u5fd7\u8f93\u51fa\u7684\u95ee\u9898\uff1b \u4fee\u6539\u5931\u8d25\u7528\u4f8b\u56de\u6eaf\u65e5\u5fd7\u4e3a\u8be6\u7ec6\u7ea7\u522b\uff1b \u4fee\u590d\u4e86\u6267\u884c\u8fdb\u5ea6\u672a\u8ba1\u7b97\u8df3\u8fc7\u7528\u4f8b\u7684\u95ee\u9898\uff0c\u5e76\u4f18\u5316\u4e86\u8fdb\u5ea6\u83b7\u53d6\u7684\u7b97\u6cd5\uff1b \u4fee\u590d env.sh \u5728 V23 \u73af\u5883\u4e0b\u5b89\u88c5\u65e0\u6cd5\u8bfb\u53d6\u5bc6\u7801\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 pms \u6d4b\u8bd5\u5957\u6267\u884c\u6216\u6d4b\u8bd5\u5355\u6267\u884c\u65f6\uff0c\u7528\u4f8bID\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b env.sh \u91cc\u9762 hub.deepin.com \u66f4\u6362\u6210 it.uniontech.com\uff1b uos_ci.py \u6d4b\u8bd5\u7ed3\u679c\u7edf\u8ba1\u65f6\uff0c\u603b\u6570\u5254\u9664 skip \u7684\u6570\u91cf "},{"location":"RELEASE/#11220220921","title":"1.1.2\uff082022/09/21\uff09","text":"new \u5728\u6ca1\u6709\u5b89\u88c5 dogtail \u7684\u60c5\u51b5\u4e0b\uff0c\u4e5f\u80fd\u4f7f\u7528 sniff \u5de5\u5177\uff1b fix \u4fee\u590d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e2d\u6ca1\u6709\u5b89\u88c5 AT \u73af\u5883\u6267\u884c uos_ci.py \u62a5\u9519\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11120220919","title":"1.1.1\uff082022/09/19\uff09","text":"new \u65b0\u589e\u6267\u884c\u8fdb\u5ea6\u663e\u793a\uff0c\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u65f6\u65e5\u5fd7\u8f93\u51fa\u5f53\u524d\u8fdb\u5ea6\uff1a[\u5f53\u524d\u6307\u5b9a\u7b2c\u51e0\u6761/\u7528\u4f8b\u603b\u6570]\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u7528\u4f8b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\u6240\u6709\u5931\u8d25\u7528\u4f8b\u7684\u5217\u8868\uff1b \u5173\u95ed\u7ec8\u7aef\u8f93\u51fa\u6355\u83b7\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u65e5\u5fd7\u5feb\u7167\uff1b \u4f18\u5316\u7ec8\u7aef\u8f93\u51fa\u5931\u8d25\u4fe1\u606f\u5197\u957f\u4e3a\u7b80\u8981\u4fe1\u606f\u8f93\u51fa\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u663e\u793a 10 \u4e2a\u6267\u884c\u6700\u6162\u7684\u7528\u4f8b\u5217\u8868\uff0c\u5e76\u8be6\u7ec6\u5217\u51fa\u5404\u4e2a\u9636\u6bb5\u7684\u8017\u65f6\uff1b \u5931\u8d25\u91cd\u8dd1\u7528\u4f8b\u91cd\u8dd1\u4e4b\u524d\u5ef6\u8fdf 1 \u79d2\uff1b \u65b0\u589e\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4ecd\u7136\u5f3a\u5236\u6267\u884c\uff1b \u7528\u4f8b\u6536\u96c6\u65f6\u4ec5\u5728 apps \u76ee\u5f55\u4e0b\u8fdb\u884c\uff0c\u5ffd\u7565 src,setting,public \u76ee\u5f55\uff1b \u65b0\u589e allure \u62a5\u544a\u5907\u4efd\u529f\u80fd\uff0c\u9ed8\u8ba4\u5907\u4efd\u81f3 allure_back \u76ee\u5f55\u4e0b\uff1b manage.py\u65b0\u589e\u53c2\u6570 --lastfailed \u7528\u4e8e\u53ea\u8dd1\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\u7684\u529f\u80fd\uff1b fix \u4fee\u590d\u4e86\u5728\u6ca1\u6709\u6307\u5b9a\u5e94\u7528\u540d\u79f0\u6267\u884c\u65f6\uff0cxml \u62a5\u544a\u751f\u6210\u8def\u5f84\u5f02\u5e38\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 uos_ci.py \u4f20\u5165 timeout \u548c session_timeout \u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11020220916","title":"1.1.0\uff082022/09/16\uff09","text":"new \u65b0\u589ePMS\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u652f\u6301\u591a\u79cd\u6570\u636e\u56de\u586b\u6a21\u5f0f\uff1b \u4f18\u5316\u4e86\u901a\u8fc7\u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u65f6PMS \u722c\u866b\u7684\u6027\u80fd\uff1b \u65b0\u589e .gitmodules \u6587\u4ef6\uff0c\u7528\u4e8e\u6807\u8bb0\u6240\u6709\u5b50\u9879\u76ee\uff0c\u65b9\u4fbf\u7edf\u4e00\u62c9\u53d6\u4ee3\u7801\uff1b env.sh \u9002\u914d\u793e\u533a\u7248\u4e0a\u5b89\u88c5\u81ea\u52a8\u5316\u73af\u5883\uff1b \u589e\u52a0\u6267\u884c\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u9519\u8bef\u7684\u529f\u80fd\uff1b README.md \u589e\u52a0 Wayland \u4e0b\u4f7f\u7528\u3001\u6d4b\u8bd5\u62a5\u544a\u67e5\u770b\u3001\u5e38\u89c1\u95ee\u9898\u7b49\u7684\u6587\u6863\u8bf4\u660e\uff1b \u589e\u52a0\u4e86\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u5bf9 setup\u3001call\u3001teardown \u8fdb\u884c\u65e5\u5fd7\u5206\u6bb5\uff1b fix \u4fee\u590d\u4e86 \u786e\u8ba4\u4fee\u590d \u5217\u6ca1\u5199\u8868\u5934\uff0c\u4f46\u5199\u4e86 fixed-xxx \u6807\u7b7e\uff0c\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u540c\u4e00\u5e94\u7528\u5185\u591a\u4e2a csv \u6587\u4ef6\u4e2d \u786e\u8ba4\u4fee\u590d \u5217\u6709\u7684\u5199\u4e86\uff0c\u6709\u7684\u6ca1\u5199\uff0c\u53ef\u80fd\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 INFO \u65e5\u5fd7\uff0c\u663e\u793a\u4e3a DEBUG \u7684\u95ee\u9898\uff1b\u4fee\u590d\u4e86\u90e8\u5206\u673a\u5668\u4e0a INFO \u65e5\u5fd7\u5185\u5bb9\u663e\u793a\u4e3a\u7ea2\u8272\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\u770b\u4e0d\u5230\u8be6\u7ec6\u4fe1\u606f\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10220220822","title":"1.0.2\uff082022/08/22\uff09","text":"new \u79fb\u9664 loguru\uff0c\u66ff\u6362\u4e3a logging\uff0c\u63a5\u53e3\u4fdd\u6301\u4e0d\u53d8\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u53d7\u5f71\u54cd\uff1b \u9ed8\u8ba4\u5f00\u542f coredump\uff1b fix \u4fee\u590d\u4e86\u4e09\u65b9\u5e93 loguru \u5076\u73b0\u5f02\u5e38\uff0c\u5bfc\u81f4\u7a0b\u5e8f\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7b2c\u4e00\u6b21\u5931\u8d25\u4e0d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10120220812","title":"1.0.1\uff082022/08/12\uff09","text":"new \u65b0\u589e RELEASE.md \u6587\u4ef6\uff0c\u7528\u4e8e\u8bb0\u5f55\u5386\u53f2\u53d1\u5e03\u7248\u672c\u7684\u66f4\u65b0\u5185\u5bb9\uff1b \u517c\u5bb9 Wayland \u6a21\u5f0f\u4e0b\u6267\u884c\u7528\u4f8b\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u7528\u7ba1\u5f53\u524d\u6d4b\u8bd5\u673a\u6267\u884c\u73af\u5883\uff0c\u6846\u67b6\u4f1a\u81ea\u52a8\u6839\u636e\u5f53\u524d\u73af\u5883\u8d70\u4e0d\u540c\u7684\u4ee3\u7801\u903b\u8f91\uff1b \u7531\u4e8e\u9700\u8981\u4fee\u6539 dogtail \u6e90\u4ee3\u7801\uff0c\u56e0\u6b64\u5c06\u4fee\u6539\u540e\u7684\u6e90\u7801\u653e\u5165\u5230\u6838\u5fc3\u5e93\u91cc\u9762 src/depends/dogtail \u540e\u7eed\u7248\u672c\u5c06\u4e0d\u9700\u8981\u5728\u7cfb\u7edf\u4e2d\u5b89\u88c5dogtail\uff1b \u5982\u679c\u5e94\u7528\u5e93\u540c\u6837\u4f7f\u7528\u4e86\u7cfb\u7edf\u5b89\u88c5\u7684 dogtail \u53ef\u80fd\u4f1a\u62a5\u9519\uff0c\u89e3\u51b3\u65b9\u6848\u662f\u5c06\u4ee3\u7801\u4e2d\u7684 import dogtail \u4fee\u6539\u4e3a from src.depends import dogtail ; fix \u91cd\u8dd1\u5931\u8d25\u4e4b\u540e\u624d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff0c\u4fee\u6539\u4e3a\u5931\u8d25\u4e4b\u540e\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":"# Attribution \uff1achengdu Test Team\n# Date \uff1a2021/08/20\n \u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d \u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d \u4ed3\u5e93\u5730\u5740\uff1ahttps://gitlabcd.uniontech.com/autotest/cd-desktop-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u65b9\u6848\u6982\u8ff0","text":"\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u667a\u80fd\u8bc6\u522b\u5e94\u7528\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u7528\u4e8e\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u64cd\u4f5c\u8fc7\u7a0b\u4e2d\u7684\u5143\u7d20\u5b9a\u4f4d\u4ee5\u53ca\u5224\u65ad\u7ed3\u679c\u65f6\u7684\u65ad\u8a00\u5904\u7406\uff1b\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\uff0c\u6d4b\u8bd5\u673a\u4e0a\u7684\u753b\u9762\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u5230\u670d\u52a1\u5668\u4e0a\uff0c\u670d\u52a1\u5668\u5bf9\u89c6\u9891\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\u540e\uff0c\u670d\u52a1\u5668\u667a\u80fd\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\u6210\u529f\uff0c\u7136\u540e\u5bf9\u6d4b\u8bd5\u673a\u4e0b\u53d1\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\uff0c\u6d4b\u8bd5\u673a\u63a5\u53d7\u5e76\u6267\u884c\u4e0b\u4e00\u6b65\u64cd\u4f5c\u3002 \u670d\u52a1\u5668\u4e0e\u6d4b\u8bd5\u673a\u4e4b\u95f4\u7684\u94fe\u63a5\uff1a \u670d\u52a1\u5668\u901a\u8fc7 USB \u4e32\u53e3\u8bbe\u5907\uff08USB-HID \u534f\u8bae\uff09\u6a21\u62df\u9f20\u6807\u952e\u76d8\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u64cd\u4f5c\u3002 \u901a\u8fc7\u89c6\u9891\u91c7\u96c6\u8bbe\u5907\u6355\u83b7\u6d4b\u8bd5\u673a\u7684\u5b9e\u65f6\u753b\u9762\u4f20\u8f93\u7ed9\u670d\u52a1\u5668\u3002 \u670d\u52a1\u5668\u5bf9\u91c7\u96c6\u7684\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\uff0c\u8bc6\u522b\u5176\u4e2d\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5e76\u8fd4\u56de\u5143\u7d20\u63a7\u4ef6\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\uff0c\u670d\u52a1\u5668\u901a\u8fc7\u667a\u80fd\u5316\u5206\u6790\uff0c\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e00\u81f4\u5c06\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\u901a\u8fc7\u4e32\u53e3\u6a21\u62df\u952e\u9f20\u4fe1\u53f7\u53d1\u9001\u7ed9\u6d4b\u8bd5\u673a\uff1b\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e0d\u4e00\u81f4\u5c06\u4f1a\u8fdb\u5165\u4e2d\u65ad\u5904\u7406\u53ca\u5f02\u5e38\u7ed3\u679c\u8f93\u51fa\uff0c\u7ee7\u7eed\u6267\u884c\u540e\u7eed\u573a\u666f\uff0c\u76f4\u81f3\u6240\u6709\u7528\u4f8b\u6d4b\u8bd5\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u6df1\u5ea6\u5b66\u4e60\u73af\u5883\u642d\u5efa","text":"\u6a21\u578b\u8bad\u7ec3\u4e3b\u8981\u5bf9 GPU \u6709\u8981\u6c42\uff0c\u8bad\u7ec3\u6a21\u578b\u7684\u673a\u5668\u663e\u5b58\u4e0d\u4f4e\u4e8e 6G\uff0c\u5176\u4ed6\u914d\u7f6e\u65e0\u7279\u6b8a\u8981\u6c42\u3002 \u63a8\u8350\u6027\u4ef7\u6bd4\u8f83\u9ad8\u914d\u7f6e \u64cd\u4f5c\u7cfb\u7edf: UnionTech OS Desktop 20 Professional Linux version 4.19.0-desktop-amd64 (deepin@deepin-PC) (Uos 8.3.0.3-3+rebuild) \u5904\u7406\u5668: Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz (\u516b\u6838 / \u5341\u516d\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460M-HDV(RD)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))/8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: TU116 [GeForce GTX 1660]\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u865a\u62df\u73af\u5883\u5b89\u88c5","text":"cd ~\nwget -c https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh\nbash Miniconda3-latest-Linux-x86_64.sh\n \u4e00\u8def\u56de\u8f66 \u7b2c\u4e00\u6b21\u63d0\u793a\u8f93\u5165 yes/no \uff1a\u8f93\u5165 yes \u7ee7\u7eed\u4e00\u8def\u56de\u8f66 \u7b2c\u4e8c\u6b21\u63d0\u793a\uff1a\u8f93\u5165 no cd ~/miniconda3/bin\nsudo chmod 777 activate\n \u6fc0\u6d3bconda\u73af\u5883 . ./activate\n \u6dfb\u52a0\u516c\u53f8\u5185\u7f51\u6e90 conda config --add channels bioconda\nconda config --add channels conda-forge\n \u5982\u679c\u662f\u5916\u7f51\u6dfb\u52a0\u5916\u7f51\u6e90 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/\n \u5982\u679c\u8981\u5220\u9664\u6e90 conda config --remove-key channels\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"2\u3001\u5b89\u88c5\u4f9d\u8d56","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u521b\u5efa\u865a\u62df\u73af\u5883","text":"conda remove --name mmlab --all # \u79fb\u9664\u6240\u6709\u865a\u62df\u73af\u5883\n conda create -n mmlab python=3.7\n conda activate mmlab\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-pytorch","title":"\uff082\uff09\u5b89\u88c5 Pytorch","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install torch==1.7.0+cu101 torchvision==0.8.1+cu101 torchaudio==0.7.0 -f https://download.pytorch.org/whl/torch_stable.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-mmcv","title":"\uff083\uff09\u5b89\u88c5 MMCV","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install mmcv-full==1.3.3 -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.7.0/index.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"\uff084\uff09\u5b89\u88c5\u663e\u5361\u9a71\u52a8","text":"\u6839\u636e\u4f60\u7684\u663e\u5361\u4e0b\u8f7d\u5bf9\u5e94\u9a71\u52a8\uff0c\u6bd4\u5982\u6211\u7684\u663e\u5361\u4e3a GTX1660\uff0c\u9a71\u52a8\u7248\u672c\u4e3a 430\uff0c\u9a71\u52a8\u4e0b\u8f7d\u5730\u5740\uff1ahttps://www.nvidia.cn/Download/Find.aspx?lang=cn CTRL+ALT+F2 \u8fdb\u5165tty\n \u7981\u7528 nouveau \u9a71\u52a8 sudo vim /etc/modprobe.d/blacklist-nouveau.conf\n \u586b\u5165\uff1a blacklist nouveau options nouveau modeset=0\n \u5237\u65b0\u914d\u7f6e\u6587\u4ef6 sudo update-initramfs -u reboot \u91cd\u542f\u540e\u518d\u8fdb\u5165 tty \u5173\u95ed\u56fe\u50cf\u754c\u9762\uff0c\u8f93\u5165\u547d\u4ee4\u5173\u95ed\u56fe\u50cf\u754c\u9762 sudo service lightdm stop\n \u5b89\u88c5\u9a71\u52a8 sudo chmod a+x NVIDIA-Linux-x86_64-430.run\nsudo ./NVIDIA-Linux-x86_64-430.run\n reboot\u91cd\u542f\uff0cnvidia-smi\u67e5\u770b\u5b89\u88c5\u72b6\u6001\u3002\u6ce8\u610f\u770b\u4e0bcuda\u7248\u672c\uff0c10.1\uff0cdriver\u7248\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u6570\u636e\u6807\u6ce8","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u6570\u636e\u6807\u6ce8","text":"\u6807\u6ce8\u4e4b\u524d\u9700\u8981\u5148\u8f6c\u6362\u56fe\u7247\u5927\u5c0f\uff0c\u5e76\u4e14\u4ee5\u6570\u5b57\u547d\u540d\uff0c\u6bcf\u7ec4\u547d\u540d\u9012\u589e"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"\uff081\uff09\u8f6c\u6362\u5927\u5c0f\u5e76\u91cd\u547d\u540d","text":"rename_pic.py import os\nimport sys\nimport cv2\nimport time\nimport getpass\nusername = getpass.getuser()\nsource_path = f\"/home/{username}/Desktop/right_menu\" # \u56fe\u7247\u8def\u5f84\nsource_dest = os.path.join('/'.join(source_path.split(\"/\")[:-1]), 'tmp')\nif not os.path.exists(source_dest):\nos.mkdir(source_dest)\nstart_name = sys.argv[1]\nfile_name_list = list()\nfor file in os.listdir(source_path):\nif file.endswith('.png'):\nfile_name_list.append(file)\nstart_name = int(start_name)\nfor file in file_name_list:\nos.rename(os.path.join(source_path,file), os.path.join(source_path, f\"{str(start_name)}.png\"))\nstart_name += 1\ntime.sleep(1)\nfor file in os.listdir(source_path):\nimage = os.path.join(source_path, str(file))\nsrc = cv2.imread(image)\nresult = cv2.resize(src, (960, 540))\nresizeImage = os.path.join(source_dest, str(file))\nprint(resizeImage)\ncv2.imwrite(str(resizeImage), result)\ncv2.waitKey(0)\ncv2.destroyAllWindows()\ntime.sleep(1)\nos.system(f'rm -rf {source_path}/*')\nos.system(f'mv {source_dest}/* {source_path}')\nos.system(f'rm -rf {source_dest}')\nprint(\"\u4e0b\u4e00\u4e2a\u5e8f\u53f7\uff1a\", start_name)\n \u6839\u636e\u7ec8\u7aef\u8f93\u51fa\u7684\u4e0b\u4e00\u4e2a\u5e8f\u53f7\u7684\u63d0\u793a\uff0c\u6267\u884c Python \u6587\u4ef6\u7684\u65f6\u5019\u4f20\u53c2\u3002 python rename_pic.py 249\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"\uff082\uff09\u5de5\u5177\u6807\u6ce8","text":"\u4f7f\u7528\u5de5\u5177 labelImg \u6807\u6ce8 sudo pip3 install PyQt5==5.13\nsudo pip3 install labelImg\n \u7ec8\u7aef\u76f4\u63a5\u8f93\u5165 labelImg\uff0c\u56de\u8f66 \u6807\u6ce8\u6a21\u5f0f\u9009\u62e9\uff1aPascalVOC"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u667a\u80fd\u6807\u6ce8","text":"\u6253\u5f00\u5c4f\u5e55\u5f55\u5236\u8f6f\u4ef6\uff0c\u5f55\u5236\u624b\u52a8\u64cd\u4f5c\u4e00\u6b21\u6d4b\u8bd5\u7528\u4f8b\uff0c\u7136\u540e\u5c06\u5f55\u5236\u7684\u89c6\u9891\u8fdb\u884c\u5206\u5e27\uff0c\u7136\u540e\u5bf9\u6bd4\u524d\u4e24\u5e27\u56fe\u6807\u76f8\u4f3c\u5ea6\uff0c\u5254\u9664\u76f8\u4f3c\u5ea6\u8fc7\u9ad8\u7684\u56fe\u7247\uff0c\u5728\u4fdd\u8bc1\u7d20\u6750\u591a\u6837\u6027\u7684\u524d\u63d0\u4e0b\uff0c\u5254\u9664\u91cd\u590d\u591a\u4f59\u7684\u56fe\u7247\u751f\u6210\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u96c6\uff0c\u7136\u540e\u53d6\u51fa\u63a7\u4ef6\u6a21\u677f\u6570\u636e\u96c6\uff0c\u901a\u8fc7 OpenCV \u6a21\u677f\u5339\u914d\u83b7\u53d6\u63a7\u4ef6\u5728\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u56fe\u7247\u4e2d\u6240\u5728\u7684\u5de6\u4e0a\u3001\u5de6\u4e0b\u3001\u53f3\u4e0a\u3001\u53f3\u4e0b\u56db\u5904\u5750\u6807\uff0c\u4ece\u800c\u6839\u636e\u6a21\u677f\u6570\u636e\u96c6\u751f\u6210\u6807\u6ce8\u6570\u636e\u3002\u53c2\u8003\u76ee\u5f55 AnnotationMaterial"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"\uff081\uff09\u6a21\u677f\u6570\u636e\u96c6\u51c6\u5907","text":"1\u3001\u5728\u754c\u9762\u622a\u53d6\u9700\u8981\u6807\u6ce8\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u653e\u5728\u76ee\u5f55\u4e0b AnnotationMaterial/template/img 2\u3001\u7ef4\u62a4\u63a7\u4ef6\u540d\u4e0e\u5143\u7d20\u63a7\u4ef6\u7684\u952e\u5bf9\uff0c\u4e00\u4e2a\u63a7\u4ef6\u540d\u53ef\u5bf9\u5e94\u591a\u4e2a\u5143\u7d20\u63a7\u4ef6 menu:\n- menu.jpg\n- menu1.jpg\n- menu2.jpg\n- menu3.jpg\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"\uff082\uff09\u7d20\u6750\u96c6\u51c6\u5907","text":"\u5f55\u5236\u89c6\u9891\u6216\u6216\u5c4f\u5e55\u622a\u56fe\u653e\u7f6e\u76ee\u5f55 AnnotationMaterial/source"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u5f00\u59cb\u6807\u6ce8","text":"python3 AnnotationMaterial/main.py\n \u751f\u6210\u7684\u6807\u6ce8\u6570\u636e\u5b58\u653e\u5728 AnnotationMaterial/result"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#mmdetection","title":"\u56db\u3001MMDetection","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1-mmdetection","title":"1\u3001 MMDetection \u4ee3\u7801","text":"MMDetection \u662f\u4e00\u4e2a\u6709\u540d\u7684\u6df1\u5ea6\u5b66\u4e60\u76ee\u6807\u68c0\u6d4b\u5f00\u6e90\u9879\u76ee\uff0c\u4e5f\u662f openMMlab \u7684\u62db\u724c\u9879\u76ee\uff0c\u4e3a\u4ec0\u4e48\u9009\u62e9\u5b83\uff0c\u5c0f\u5b69\u513f\u6ca1\u5a18\u8bf4\u6765\u8bdd\u957f\uff0c\u611f\u5174\u8da3\u53ef\u4ee5\u81ea\u884c\u6df1\u5165\u4e86\u89e3\uff1b \u4f60\u53ef\u4ee5\u76f4\u63a5\u5728 GitHub \u4e0a\u514b\u9686\u4ee3\u7801\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u54b1\u4eec\u4ed3\u5e93\u4e0b Train \u76ee\u5f55\u4e2d\u4ee3\u7801\uff0cTrain \u4e2d\u7684\u4ee3\u7801\u4e5f\u662f\u4ece GitHub \u4e0a\u62c9\u53d6\u7684\uff0c\u4e0d\u8fc7\u6211\u4eec\u6839\u636e\u9879\u76ee\u9700\u8981\u505a\u4e86\u4e00\u4e9b\u4e8c\u6b21\u5f00\u53d1\uff0c\u63a8\u8350\u76f4\u63a5\u4f7f\u7528\u5b83\u3002 \u5982\u679c\u4f60\u60f3\u4ece GitHub \u4e0a\u62c9\uff1a git clone https://github.com/open-mmlab/mmdetection.git\n# \u4e0d\u80fd\u76f4\u63a5\u62c9\u53d6\u4e3b\u5206\u652f\uff0c\u5efa\u8bae\u4f7f\u75282.12\u7248\u672c\uff0c\u4e0d\u540c\u7684\u7248\u672c\u5bf9\u5e94\u7684mmcv\u7248\u672c\u662f\u4e0d\u540c\u7684\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-voc2coco","title":"2\u3001\u62c9\u53d6 voc2coco \u4ee3\u7801","text":"git clone https://github.com/Tony607/voc2coco.git\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-coco","title":"3\u3001\u8f6c\u6362 coco \u6570\u636e\u96c6","text":"\u5c06\u6240\u6709\u7684\u56fe\u7247\u548cxml\u6587\u4ef6\u653e\u5165train2017\uff0c\u4ece\u4e2d\u6311\u9009\u51e0\u7ec4\u653e\u5165val2017\uff08\u6d4b\u8bd5\u96c6\uff09 cd mmdetection/data/coco\npython voc2coco.py train2017 annotations/instances_train2017.json\npython voc2coco.py val2017 annotations/instances_val2017.json\n \u751f\u6210json\u6587\u4ef6"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4_1","title":"4\u3001\u4fee\u6539\u914d\u7f6e","text":"\uff081\uff09\u8bfb\u53d6\u6a21\u578b\u540d\u79f0 import json\nmodule_name = []\nwith open('./instances_train2017.json', \"r+\") as f:\njson_file = f.read()\njson_dict = json.loads(json_file)\nmodule_list = json_dict.get('categories')\nfor module_info in module_list:\nname = module_info.get('name')\nmodule_name.append(name)\nprint(module_name)\nprint(\"module_num:\", len(module_name))\n # \u6ce8\u610f\u5bf9\u6bd4instances_train2017.json\u91cc\u9762\u6a21\u578b\u540d\u79f0\u7684\u987a\u5e8f\uff0c\u4e0eCLASSES\u548ccoco_classes\u91cc\u9762\u7684\u987a\u5e8f\u4fdd\u6301\u4e00\u81f4\u3002\n \uff082\uff09\u4fee\u6539 faster_rcnn_r101_2x_coco.py mmdetection/xianjin/faster_rcnn_r101_2x_coco.py \u4fee\u653946\u884c\uff0cnum_clasess\u7684\u503c\uff0c\u65b0\u589e1\u4e2a\uff0c\u5c31 +1\uff1b \uff083\uff09\u4fee\u6539 coco.py mmdetection/mmdet/datasets/coco.py CLASSES = ()\uff0c\u5728\u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b \uff084\uff09\u4fee\u6539 class_names.py mmdetection/mmdet/core/evaluation/class_names.py coco_classes \u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#5","title":"5\u3001\u7f13\u5b58\u6e05\u7406","text":"\u5220\u9664 mmdetection/build \u76ee\u5f55 python setup.py install\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#6","title":"6\u3001\u8bad\u7ec3\u6a21\u578b","text":"\uff081\uff09\u6307\u5b9a\u81ea\u5df1\u914d\u7f6e\u7684\u8bad\u7ec3\u6a21\u578b\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py --gpus 1\n \uff082\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u6d4b\u8bd5\u96c6\u7ed3\u679c\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py xianjin/epoch_24.pth --show\n \uff083\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u51c6\u786e\u5ea6\uff1b python tools/analysis_tools/analyze_logs.py plot_curve xianjin/20210530_011907.log.json --keys acc\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#7","title":"7\u3001\u5feb\u6377\u64cd\u4f5c","text":"python3 run.py\n \u5c06\u4ee5\u4e0a 4 - 7 \u6b65\u64cd\u4f5c\u6574\u5408\u6210 run.py\uff0c\u4e00\u952e\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u4e94\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\uff1b \u670d\u52a1\u7aef\u4e00\u53f0\uff08\u76ee\u524d\u4ec5\u652f\u6301AMD\u67b6\u6784\uff09\uff1b \u91c7\u96c6\u76d2\u4e00\u4e2a \uff08ACASIS hdmi\u89c6\u9891\u91c7\u96c6\u5361\uff0chttps://item.jd.com/10024310742602.html \uff09\uff1b USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\uff1b USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff1b \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5USB\u5ef6\u957f\u7ebf\uff1b \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u63a8\u8350\u914d\u7f6e","text":"\u6267\u884c\u7528\u4f8b\u7684\u670d\u52a1\u7aef\u5bf9\u914d\u7f6e\u6ca1\u6709\u7279\u6b8a\u8981\u6c42\uff0c\u5982\u679c\u6761\u4ef6\u5141\u8bb8\u914d\u7f6e\u8d8a\u9ad8\uff0c\u8bc6\u522b\u901f\u5ea6\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n \u6d4b\u8bd5\u673a\u4e0a\u4e0d\u6267\u884c\u4efb\u4f55\u811a\u672c\uff0c\u5177\u4f53\u914d\u7f6e\u6839\u636e\u6d4b\u8bd5\u9700\u8981\u51b3\u5b9a\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#usb_mk","title":"\u516d\u3001USB_MK\u4e32\u53e3\u9a71\u52a8\u65b9\u6cd5","text":"\u4f4d\u4e8econtrol_method\u76ee\u5f55\u4e0b\u7684usb_mk.py\u6587\u4ef6 \uff081\uff09\u5217\u51fa\u53ef\u901a\u4fe1\u7684\u7aef\u53e3 python3 -m serial.tools.list_ports -v\n \uff082\uff09\u4fee\u6539\u4e32\u53e3\u7684\u6743\u9650 sudo chmod 777 /dev/ttyACM0\n \uff083\uff09\u5b9e\u4f8b\u5316USB_MK import UsbMk\nusb_mk = UsbMk(\"/dev/ttyACM0\", 9600) # \u8bbe\u5907\u9ed8\u8ba49600\u4e3a\u6ce2\u7279\u7387\uff0c\u63a7\u5236\u4f20\u8f93\u901f\u7387\n \uff084\uff09USB\u4e32\u53e3\u8bbe\u5907\u9ed8\u8ba4\u6ce2\u7279\u7387\u4e3a9600\uff08\u7ecf\u6d4b\u8bd5\u6ce2\u7279\u73879600\u51c6\u786e\u6027\u6700\u597d\uff09\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up() # \u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u6c49\u5b57\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e\n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff083\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff084\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff085\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() # \u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2\n \uff086\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff087\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff088\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e03\u3001\u65b9\u6cd5\u8c03\u7528\u5165\u53c2\u89c4\u5219","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_7","title":"1\u3001\u57fa\u7c7b","text":"class Base:\ndef __init__(self):\nself._obj = image\nself._usb = usb_mk\ndef find_element_by_ai(self, element):\nreturn self._obj.find_element(element)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_6","title":"2\u3001\u5165\u53c2\u8bf4\u660e","text":"\u56fe\u50cf\u8bc6\u522b\u65b9\u6cd5\u5165\u53e3\u4e3a Base \u7c7b\u4e0b\u7684 find_element_by_ai \u3002\u4ec5\u63a5\u53d7\u4e00\u4e2a\u53c2\u6570 element\uff0c\u7c7b\u578b\u4e3a string\u3002 \u53ef\u8bc6\u522b\u7684 string \u683c\u5f0f\uff1a \uff081\uff09\u5927\u56fe\u6807\uff08 \u56fe\u6807\u5927\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\uff0c\u4f8b\uff1a Base().find_element_by_ai(\"window\")\n \uff082\uff09\u5927\u56fe\u6807 / \u5c0f\u56fe\u6807\uff08\u56fe\u6807\u5c0f\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5c0f\u56fe\u6807\uff0c\u4f8b\uff1awindow/search_btn Base().find_element_by_ai(\"window/search_btn\")\n \uff083\uff09\u5927\u56fe\u6807 / OCR\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\u5185\u7684\u6587\u5b57\uff0c\u4f8b\uff1amenu/\u5c5e\u6027 Base().find_element_by_ai(\"menu/\u5c5e\u6027\")\n \uff084\uff09OCR\uff1a\u5168\u5c4f\u8bc6\u522b\u6587\u5b57 Base().find_element_by_ai(\"\u641c\u7d22\")\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516b\u3001\u9690\u85cf\u9f20\u6807","text":"\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u8fc7\u6765\u7684\u89c6\u9891\u6d41\uff0c\u5728\u8bc6\u522b\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u53d7\u5230\u9f20\u6807\u5f71\u54cd\uff0c\u56e0\u6b64\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u9690\u85cf\u9f20\u6807\u3002 \u5c4f\u853d\u9f20\u6807\u5149\u6807\u663e\u793a ```shell script /etc/lightdm/lightdm.conf \u5728`[Seat:*]`\u4e0b\u9762\u6dfb\u52a0\u53c2\u6570\n```shell script\nxserver-command=X -bs -core -nocursor\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e5d\u3001\u667a\u80fd\u81ea\u52a8\u5316\u7684\u610f\u4e49","text":"1\u3001\u6539\u5584 Acessibility \u5b9a\u4f4d\u7684\u7a33\u5b9a\u6027\u95ee\u9898 Acessibility \u5c5e\u6027\u5b9a\u4f4d\u5b58\u5728\u5076\u5c14\u5931\u6548\u7684\u60c5\u51b5 \uff081\uff09\u5f00\u53d1\u5728\u505a\u65b0\u9700\u6c42\u5f00\u53d1\u65f6\u53ef\u80fd\u6d89\u53ca\u5230\u5bf9\u5c5e\u6027\u6807\u7b7e\u7684\u4fee\u6539\u6216\u8005\u5c42\u7ea7\u7684\u8c03\u6574\uff0c\u53ef\u80fd\u9020\u6210\u81ea\u52a8\u5316\u7528\u4f8b\u65e0\u6cd5\u5b9a\u4f4d\u5230\u5143\u7d20\u3002 \u6bd4\u59821040\u9636\u6bb5\uff0c\u97f3\u4e50\u91cd\u6784\u7684\u65f6\u5019\uff0c\u5f00\u53d1\u5bf9\u90e8\u5206\u5c5e\u6027\u548c\u5c42\u7ea7\u505a\u4e86\u4fee\u6539\uff0c\u5bfc\u81f4\u81ea\u52a8\u5316\u7528\u4f8b\u5b9a\u4f4d\u65b9\u6cd580%\u9700\u8981\u4fee\u6539\u3002 \u5f00\u53d1\u65b0\u529f\u80fd\u7684\u65f6\u5019\u5076\u5c14\u4e5f\u4f1a\u5bf9\u5c5e\u6027\u505a\u8c03\u6574\uff0c\u9047\u52305\u6b21\u3002 \uff082\uff09\u76ee\u524d\u4e3b\u8981\u4f7f\u7528Dogtail\u8bc6\u522b\u5e94\u7528Acessibility\u5c5e\u6027\u8fdb\u884c\u5b9a\u4f4d\uff0c\u662f\u83b7\u53d6\u5e94\u7528\u5f53\u524d\u754c\u9762\u7684\u5c5e\u6027tree\uff0c\u5728\u5e94\u7528\u8df3\u8f6c\u540e\uff0cDogtail\u5b58\u5728\u65e0\u6cd5\u53ca\u65f6\u83b7\u53d6\u5f53\u524d\u5c5e\u6027\u5217\u8868\u7684\u60c5\u51b5\u3002 \u591a\u5a92\u4f53\u8c03\u7528\u6587\u7ba1\u7a97\u53e3\u7684\u65f6\u5019\uff0c\u51fa\u73b0\u627e\u4e0d\u5230\u6587\u7ba1\u91cc\u9762\u5143\u7d20\u7684\u60c5\u51b5\uff0c\u76ee\u524d\u51fa\u73b010+\u6b21\u3002 \u5e94\u7528\u8bbe\u7f6e\u9875\u9762\u7684\u5c5e\u6027\u5076\u5c14\u5b58\u5728\u627e\u4e0d\u5230\u7684\u60c5\u51b5\uff0c\u9047\u52305\u6b21\u3002 \uff083\uff09Dogtail\u5de5\u5177\u672c\u8eab\u5b58\u5728\u95ee\u9898\uff0c\u6709\u65f6\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u5019\u5f88\u6162\uff0c\u8ba9\u4eba\u65e0\u6cd5\u63a5\u53d7\uff0c\u76ee\u524d\u51fa\u73b0\u8fc7\u5f88\u591a\u6b21\u3002 \u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u95f4\u6bd4\u5e73\u5e38\u61623\u500d\uff0c\u51fa\u73b04\u6b21\u3002 2\u3001\u89e3\u51b3\u4e86\u4f7f\u7528\u7edd\u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898 \u90e8\u5206\u63a7\u4ef6\u65e0\u6cd5\u6dfb\u52a0 Acessibility \u5c5e\u6027\u4ece\u800c\u4f7f\u7528\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u51fa\u73b0\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898\u3002 \uff081\uff09\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u65b9\u6cd5\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u76ee\u6807\u56fe\u7247\u8d44\u6e90\uff0c\u5728 UI \u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u4f1a\u6d89\u53ca\u5230\u76ee\u6807\u8d44\u6e90\u7684\u66ff\u6362\uff0c\u6bd4\u8f83\u8017\u8d39\u4eba\u529b\u3002 \uff082\uff09\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6cd5\u5bf9\u6bd4\u7cbe\u5ea6\u6bd4\u8f83\u641e\uff0c\u5982\u679cUI \u7684\u53d8\u66f4\u4f1a\u9020\u6210\u65e0\u6cd5\u51c6\u786e\u5b9a\u4f4d\u5230\uff0c\u81ea\u52a8\u5316\u811a\u672c\u5065\u58ee\u6027\u4e0d\u8db3\u3002 3\u3001\u4f7f\u7528\u673a\u5668\u5206\u79bb\uff0c\u89e3\u51b3\u4e86\u81ea\u52a8\u5316\u811a\u672c\u5bf9\u5e94\u7528\u7684\u5f71\u54cd\uff0c\u771f\u5b9e\u8fd8\u539f\u7528\u6237\u7684\u4f7f\u7528\u573a\u666f \u673a\u5668\u5206\u79bb\u7684\u67b6\u6784\u8bbe\u8ba1\uff0c\u4fdd\u8bc1\u4e86\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u73af\u5883\u5b8c\u5168\u7b49\u540c\u4e8e\u7528\u6237\uff0c\u6392\u9664\u6d4b\u8bd5\u811a\u672c\u7684\u5f71\u54cd\u3002 \uff081\uff09\u76ee\u524d\u7684\u529f\u80fd\u81ea\u52a8\u5316\u662f\u5728\u6d4b\u8bd5\u673a\u4e0a\u76f4\u63a5\u8fd0\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\uff0c\u52a0\u4e0a\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u6211\u4eec\u6dfb\u52a0\u4e86\u4e00\u4e9b\u8fdb\u7a0b\u76d1\u63a7\u3001\u89c6\u9891\u5f55\u5236\u7b49\u529f\u80fd\uff0c\u81ea\u52a8\u5316\u811a\u672c\u672c\u8eab\u4f1a\u6d88\u8017\u4e00\u4e9b\u7cfb\u7edf\u8d44\u6e90\uff0c\u65e0\u6cd5\u8fd8\u539f\u771f\u662f\u7684\u7528\u6237\u4f7f\u7528\u573a\u666f\u3002 \uff082\uff09\u6027\u80fd\u6d4b\u8bd5\u9700\u8981\u6392\u9664\u5176\u4ed6\u7a0b\u5e8f\u7684\u8d44\u6e90\u6d88\u8017\u5f71\u54cd\uff0c\u6027\u80fd\u81ea\u52a8\u5316\u91c7\u7528\u673a\u5668\u5206\u79bb\uff0c\u4fdd\u8bc1\u4e86\u6027\u80fd\u6570\u636e\u7684\u51c6\u786e\u6027\u3002 \u4ee5\u524d\u7684\u7528\u4f8b\u6267\u884c\u8017\u65f6\u6ca1\u6761\u572830\u79d2\u5de6\u53f3\uff0c\u73b0\u5728\u7528\u4f8b\u8017\u65f6\u572810\u79d2\u3002 4\u3001\u89e3\u51b3\u4e86UI \u8c03\u6574\u5bfc\u81f4\u5b9a\u4f4d\u5931\u8d25\u7684\u4e0d\u7a33\u5b9a\u6027\u95ee\u9898 \uff081\uff09\u89e3\u51b3\u4e86\u56e0 UI \u8c03\u6574\u5bfc\u81f4\u63a7\u4ef6\u4f4d\u7f6e\u53d8\u5316\u6216\u8272\u5dee\u53d8\u5316\u540e\u5b9a\u4f4d\u4e0d\u51c6\u786e\u7684\u95ee\u9898\uff0c\u53ea\u8981\u63a7\u4ef6\u6587\u6848\u548c\u63a7\u4ef6\u5916\u8fb9\u6846\u65e0\u53d8\u5316\u5747\u53ef\u51c6\u786e\u5b9a\u4f4d\uff1b \uff082\uff09\u76ee\u524d\u4e5f\u4f1a\u91c7\u7528\u57fa\u4e8eUI\u7684\u5b9a\u4f4d\u65b9\u6848\uff0c\u5982\u679cUI\u4f4d\u7f6e\u6709\u8c03\u6574\uff0c\u4f1a\u5bfc\u81f4\u5143\u7d20\u65e0\u6cd5\u5b9a\u4f4d\u3002 5\u3001\u7b80\u5316\u4e86\u7528\u4f8b\u7ed3\u6784\uff0c\u63d0\u5347\u7f16\u5199\u53cb\u597d\u5ea6 \uff081\uff09\u667a\u80fd\u81ea\u52a8\u5316\u8bc6\u522b\u5143\u7d20\u7684\u65b9\u6cd5\u53ea\u6709\u4e00\u4e2a\uff0c\u5c31\u662f\u57fa\u4e8e\u6211\u4eec\u8bad\u7ec3\u7684\u6a21\u578b\u8bc6\u522b\u89c6\u9891\u6d41\u4e2d\u7684\u5143\u7d20\uff0c\u7ecf\u8fc7\u811a\u672c\u5c01\u88c5\u4e4b\u540e\uff0c\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u4e2d\u6240\u6709\u5b9a\u4f4d\u7684\u64cd\u4f5c\u90fd\u53ea\u9700\u8981\u8c03\u7528\u8fd9\u4e00\u4e2a\u65b9\u6cd5\u5c31\u884c\u4e86\uff0c\u7f16\u5199\u81ea\u52a8\u5316\u811a\u672c\u7684\u96be\u5ea6\u5927\u5927\u964d\u4f4e\u3002 \uff082\uff09\u4e5f\u662f\u7531\u4e8e\u8c03\u7528\u65b9\u6cd5\u7b80\u5355\uff0c\u5728 UI \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u4e2d\u7684\u5206\u5c42\u7ed3\u6784\u5c06\u4f1a\u51cf\u5c11\uff0c\u591a\u7ee7\u627f\u7684\u60c5\u51b5\u4f1a\u51cf\u5c11\uff0c\u81ea\u52a8\u5316\u4ee3\u7801\u7684\u8c03\u7528\u7ed3\u6784\u4e5f\u4f1a\u53d8\u5f97\u7b80\u5355\uff0c\u800c\u4e14\u529f\u80fd\u6d4b\u8bd5\u540c\u5b66\u7f16\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u66f4\u52a0\u5bb9\u6613\u4e0a\u624b\u3002 \u4ee5\u524d\u5199\u7528\u4f8b\u7531\u4e8e\u9700\u8981\u7ed3\u5408\u4e0d\u540c\u7684\u6a21\u5757\uff0c\u8c03\u7528\u4e0d\u540c\u7684\u65b9\u6cd5\uff0c\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u5e76\u5b8c\u6210\u8c03\u8bd5\u7684\u65f6\u95f4\u5e73\u5747\u572820-30\u5206\u949f\uff0c\u73b0\u5728\u5199\u7528\u4f8b\u811a\u672c\u80fd\u57285\u5206\u949f\u5de6\u53f3\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":"# =============================================\n# Attribution : Application Test Department III\n# Time : 2023/1/3\n# Author : ut003281\n# =============================================\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u7b80\u8ff0","text":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5 \u901a\u8fc7\u81ea\u52a8\u5316\u624b\u6bb5\u5bf9\u5e94\u7528\u8fdb\u884c\u6027\u80fd\u6d4b\u8bd5\uff0c\u63d0\u4f9b\u65b9\u4fbf\u7684\u73af\u5883\u90e8\u7f72\u3001\u8fd0\u884c\u914d\u7f6e\u3001\u7528\u4f8b\u7f16\u5199\u7b49\uff0c\u7528\u4e8e\u684c\u9762\u5e94\u7528\u7684\u51b7\u70ed\u542f\u52a8\u3001\u8d44\u6e90\u62f7\u8d1d\u3001\u9875\u9762\u8df3\u8f6c\u7b49\u6027\u80fd\u573a\u666f\u6d4b\u8bd5\u3002 \u4ed3\u5e93\u5730\u5740\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-perf-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u4ee3\u7801\u7ed3\u6784","text":"autotest-perf-aitest\n\u251c\u2500\u2500 apps # \u5b58\u653e\u6240\u6709\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u811a\u672c\n\u251c\u2500\u2500 conftest.py # pytest hook\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 CURRENT # \u7248\u672c\u5185\u5bb9\n\u251c\u2500\u2500 docs # \u6587\u6863\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u952e\u503c\u5bf9\u7167\u8868.pdf # \u4e32\u53e3\u7ebfcode\u4e0e\u6309\u952e\u7684\u5bf9\u7167\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u6027\u80fd\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\u6267\u884c\u5668\u4f7f\u7528\u6307\u5357.md # \u6267\u884c\u5668\u811a\u672c\u4f7f\u7528\u6307\u5357\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 USB\u4e32\u53e3\u8f6cUSB\u952e\u76d8\u9f20\u6807\u7ebf\u534f\u8bae\u6587\u4ef6V1.0.pdf # \u4e32\u53e3\u534f\u8bae\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput-0.28.2.zip # Linux\u4e0b\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\u7684\u6e90\u7801\uff0c\u53ef\u6839\u636e\u67b6\u6784\u6253\u5305\n\u251c\u2500\u2500 manage.py # \u529f\u80fd\u4e3b\u5165\u53e3\n\u251c\u2500\u2500 pytest.ini # pytst \u914d\u7f6e\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 setting # \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 client.ini # \u6d4b\u8bd5\u673a IP \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5168\u5c40\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dev_env.sh # \u5bbf\u4e3b\u673a\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose_no_relay.yml # \u65e0\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose.yml # \u6709\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker_login.sh # docker \u767b\u9646\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 res\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 black.png # \u5168\u9ed1\u56fe\u7247\uff0c\u7528\u4e8e\u4fee\u6539\u58c1\u7eb8\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_5000.deb # 3A5000 \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_amd64.deb # amd \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_arm64.deb # arm \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_mips64.deb # mips \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_sw_64.deb # sw \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 server.ini # \u670d\u52a1\u5668\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 setup.sh # \u5bb9\u5668\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 template # \u521b\u5efa app \u57fa\u7840\u811a\u672c\u6a21\u677f\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 app_template\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ${app_name}_widget.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 control-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 images\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 test_${app_name}_01_scene.json-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 test_${app_name}_01_scene.py-tpl\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 uos_docker # \u5bb9\u5668\u73af\u5883\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dockerfile\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 requirements.txt\n\u2514\u2500\u2500 src\n \u251c\u2500\u2500 analysis_save.py # \u89e3\u6790\u56fe\u7247\u6d41\u7ed3\u679c\uff0c\u6c47\u603b\u751f\u6210 excel \u62a5\u544a\n\u251c\u2500\u2500 base_widget.py # \u5c01\u88c5\u7684\u57fa\u7840\u64cd\u4f5c\uff0c\u5e94\u7528\u8c03\u7528\u7684\u4e3b\u5165\u53e3\u65b9\u6cd5\n\u251c\u2500\u2500 cmdctl.py # \u8c03\u7528\u547d\u4ee4\u884c\u4f7f\u7528\n\u251c\u2500\u2500 global_value.py # \u5168\u5c40\u53d8\u91cf\n\u251c\u2500\u2500 image_utils.py # \u56fe\u7247\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 __init__.py\n \u251c\u2500\u2500 logger_utils.py # \u65e5\u5fd7\u914d\u7f6e\n\u251c\u2500\u2500 pdocr.py # ocr \u914d\u7f6e\n\u251c\u2500\u2500 public_method.py # \u4e00\u4e9b\u65b9\u4fbf\u7684\u5c01\u4f4f\n\u251c\u2500\u2500 record.py # \u5f55\u5c4f\u76f8\u5173\n\u251c\u2500\u2500 rtk # \u8fd0\u884c\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 _base.py # \u4e00\u4e9b\u679a\u4e3e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 install_env.py # \u5b89\u88c5\u73af\u5883\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 local_runner.py # \u8fd0\u884c\u7528\u4f8b\n\u251c\u2500\u2500 serial_communication # \u4e32\u53e3\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 power_control.py # \u7ee7\u7535\u5668\u64cd\u4f5c\uff0c\u4f7f\u7528\u7ee7\u7535\u5668\u8fde\u63a5\u4e3b\u673a\u7535\u6e90\uff0c\u63a7\u5236\u5f00\u5173\u673a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 serial_common.py # \u4e32\u53e3\u516c\u5171\u65b9\u6cd5\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 usb_mk.py # \u952e\u9f20\u64cd\u4f5c\u57fa\u7840\u5c01\u88c5\n\u251c\u2500\u2500 shortcut_key.py # \u5feb\u6377\u952e\u7684\u5c01\u88c5\n\u251c\u2500\u2500 singleton.py # \u5355\u4f8b\u6a21\u5f0f\n\u251c\u2500\u2500 start_app.py # \u521b\u5efa app\n\u2514\u2500\u2500 write_xlsx.py # \u751f\u6210 excel\n# __init__.py \u6587\u4ef6\u4e3a\u6807\u8bc6\u8be5\u76ee\u5f55\u662f\u4e00\u4e2aPython\u7684\u6a21\u5757\u5305\uff0c\u9879\u76ee\u4e2d\u7684__init__.py\u5747\u4e3a\u7a7a\u6587\u4ef6\u3002\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u73af\u5883\u642d\u5efa","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\u3002 \u670d\u52a1\u7aef\u4e00\u53f0\u3002\uff08\u4ec5\u652f\u6301 AMD \u67b6\u6784\uff0c\u82e5\u9700\u5176\u4ed6\u67b6\u6784\uff0c\u54a8\u8be2\u76f8\u5173\u5f00\u53d1\u4eba\u5458\uff09 \u91c7\u96c6\u76d2\u4e00\u4e2a\u3002 \uff08ACASIS HDMI \u89c6\u9891\u91c7\u96c6\u76d2\uff0chttps://item.jd.com/100013302599.html#crumb-wrap \uff09 USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\u3002\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"\uff082\uff09\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\u3002 USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff08USB3.0 \u63a5\u53e3\u4e0a\uff09\u3002 \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5 USB \u5ef6\u957f\u7ebf\u3002 \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u670d\u52a1\u7aef\u63a8\u8350\u914d\u7f6e","text":"\u914d\u7f6e\u8d8a\u9ad8\uff0c\u89e3\u6790\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"2\u3001\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa","text":" \u6253\u5f00\u63a7\u5236\u4e2d\u5fc3\uff0c\u8d26\u6237\u8bbe\u7f6e\u4e3a\u3010\u81ea\u52a8\u767b\u5f55\u3011\u548c\u3010\u65e0\u5bc6\u7801\u767b\u5f55\u3011\uff0c\u7535\u6e90\u7ba1\u7406\u4e2d\u4f7f\u7528\u7535\u6e90\u5168\u90e8\u8bbe\u7f6e\u4e3a\u3010\u4ece\u4e0d\u3011\uff0c\u5f00\u542f\u5f00\u53d1\u8005\u6a21\u5f0f\u3002 \u6839\u636e\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u8981\u6c42\uff0c\u5bfc\u5165\u76f8\u5173\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\uff1a\u5bfc\u5165\u76f8\u518c\u3001\u5f71\u9662\u3001\u97f3\u4e50\u7684\u6d4b\u8bd5\u8d44\u6e90\u3002 \u5728\u670d\u52a1\u7aef\u6253\u5f00\u76f8\u673a\u5e94\u7528\u540e\uff0c\u5c06\u6d4b\u8bd5\u673a\u684c\u9762\u58c1\u7eb8\u66f4\u6362\u4e3a\u7eaf\u8272\u58c1\u7eb8\uff08\u6ce8\u610f\uff0c\u670d\u52a1\u7aef\u9700\u63d0\u524d\u5f00\u542f\u76f8\u673a\u540e\u518d\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u58c1\u7eb8\uff0c\u5efa\u8bae\u7eaf\u9ed1\u58c1\u7eb8 setting/res/black.png\uff09 \u5728\u6587\u4ef6\u7ba1\u7406\u5668\u4e2d\uff0c\u5c06\u9009\u9879 \u4e3b\u83dc\u5355-\u8bbe\u7f6e-\u9884\u89c8-\u56fe\u7247\u9884\u89c8 \u53d6\u6d88\u52fe\u9009\uff08\u5982\u4e0d\u53d6\u6d88\uff0c\u4f1a\u5f71\u54cd\u622a\u56fe\u5f55\u5c4f\u5e94\u7528\u7684\u6027\u80fd\u6570\u636e\uff09 \u79fb\u52a8\u6216\u5220\u9664\u7cfb\u7edf Logo \uff0c\u6392\u9664\u684c\u9762\u53f3\u4e0b\u89d2 Logo \u7684\u5f71\u54cd\uff08\u91cd\u542f\u751f\u6548\uff09\u3002 sudo mv /usr/share/deepin/uos_logo.svg ~/Pictures/\n \u5b89\u88c5\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\uff08\u5fc5\u987b\u5b89\u88c5\uff01\uff01\uff09 AMD \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_amd64.deb ARM \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_arm64.deb MIPS \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_mips64.deb 3A5000 \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_5000.deb \u5b89\u88c5\u547d\u4ee4 sudo dkpg -i xserver-xorg-input-libinput_0.28.2-2_amd64.deb\n \u5b89\u88c5\u65f6\u4f1a\u63d0\u793a\u5df2\u5b58\u5728\u76f8\u540c\u7248\u672c\uff0c\u8bf7\u5ffd\u7565\uff0c\u76f4\u63a5\u8986\u76d6\u5b89\u88c5\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u4e3b\u673a\u624d\u751f\u6548"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u670d\u52a1\u7aef\u4e00\u952e\u73af\u5883\u90e8\u7f72","text":"\u73af\u5883\u642d\u5efa\u524d\u5fc5\u987b\u5148\u8fde\u63a5\u4e0a USB \u4e32\u53e3\u7ebf\u548c\u91c7\u96c6\u76d2\u3002 \u5bbf\u4e3b\u673a\u73af\u5883\u5b89\u88c5 python3 manage.py install --env host\n \u5bb9\u5668\u73af\u5883\u5b89\u88c5 python3 manage.py install --env docker\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u56db\u3001\u914d\u7f6e\u9879","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u670d\u52a1\u7aef\u914d\u7f6e","text":"setting/config/server.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u914d\u7f6e\u9879\uff0c\u5305\u542b\u4e86\u6240\u6709\u670d\u52a1\u7aef\u6240\u6709\u7684\u53ef\u914d\u7f6e\u9879\u3002 \u672c\u5730\u65e0\u7f51\u7edc\u8fd0\u884c \u5c06\u914d\u7f6e\u9879 network=0 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u672c\u5730\u6709\u7f51\u7edc\u8fd0\u884c \u914d\u7f6e\u9879 network=1 (1)\u914d\u7f6e\u9879 client_alias= \u914d\u7f6e\u4e3a\u4f60\u8981\u6d4b\u8bd5\u7684\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5982 Alias1 \u6d4b\u8bd5\u673a\u522b\u540d\u5728 setting/config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 (2)\u914d\u7f6e\u9879 client_alias= \u4e3a\u7a7a\uff0c\u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager --client_alias Alias1\uff0c\u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002(Alias1 \u4e3a\u4f60\u914d\u7f6e\u7684\u6d4b\u8bd5\u673a\u522b\u540d) (1)\u548c(2)\u53ea\u8981\u4f7f\u7528\u5176\u4e00\u5373\u53ef\u3002 \u6709\u7f51\u7edc\u8fd0\u884c\uff0c\u4e14\u9700\u8981\u901a\u8fc7 Jenkins \u4e0a\u8fd0\u884c\u4e00\u4e2a job \uff0c\u540c\u65f6\u63a7\u5236\u591a\u53f0\u673a\u5668\u3002 \u914d\u7f6e\u9879 network=1 \u914d\u7f6e\u9879 client_alias= \u4e0d\u7528\u914d\u7f6e\uff0c\u5728\u8fd0\u884c run.sh \u7684\u65f6\u5019\u76f4\u63a5\u7a7a\u683c\u52a0\u522b\u540d\u5373\u53ef\uff0c\u6bd4\u5982\uff1a\u6d4b\u8bd5\u673a\u522b\u540d\u4e3a Alias1 \uff0c\u4e14\u5df2\u7ecf\u5728 config/client.ini \u4e2d\u914d\u7f6e\u4e86 Alias1 \u7684user ip password \uff0c\u5219\u8fd0\u884c bash run.sh Alias1 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u5728 Jenkins pipeline \u91cc\u9762\u901a\u8fc7\u5e76\u884c stage \u6216\u5e76\u884c\u8c03\u7528\u4e0b\u5c42\u4efb\u52a1\u7684\u65b9\u5f0f\u53ef\u4ee5\u5b9e\u73b0\u5927\u89c4\u6a21\u7684\u6027\u80fd\u6d4b\u8bd5\u9700\u6c42\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;1\u3001KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2\u3001KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f, e.g. TAGS = L1 or smoke\n[case_conf]\n# \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\uff0cocr\u6587\u6848\u8bc6\u522b\u8f83\u6162\uff0c\u4e0d\u63a8\u8350\u4f7f\u7528\nfind_by = stage\n# \u6700\u540e\u4e00\u4e2a\u7a33\u5b9a\u9636\u6bb5\u7684\u5e27\u6570\u8bc6\u522b\n# \u9996\u5e27\u5b58\u5728\u540e\u7684\u7b2c\u4e00\u4e2a\u5927\u4e8e\u8be5\u914d\u7f6e\u5e27\u6570\u7684\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u5c3e\u5e27\nfinal_stable_num=100\n# \u4ece\u8be5\u5e27\u6570\u5f00\u59cb\u8bc6\u522b\u6587\u6848\u6216\u56fe\u7247\uff0c\u51cf\u5c11\u5206\u6790\u65f6\u95f4\nstart_num = 150\n# \u8bc6\u522b\u7684\u6587\u6848\ntext=\n# \u8bc6\u522b\u56fe\u7247\nmatch=apps/xxx/images/match.png\n# \u8bc6\u522b\u76f8\u4f3c\u5ea6\nmatch_rate=0.9\n# \u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6bd4\u5982\u70ed\u542f\u52a8\u7528\u4f8b\uff0c\u4ece\u70b9\u51fb\u6253\u5f00\u5230\u505c\u6b62\u5f55\u5c4f\uff0c\u4e2d\u95f4\u7b49\u5f855\u79d2\uff1b\nduration = 15\n# \u5355\u6761\u7528\u4f8b\u6267\u884c\u7684\u6b21\u6570\ncount = 5\n# \u7a33\u5b9a\u9636\u6bb5\u5212\u5206\u7684\u76f8\u4f3c\u5ea6\nstable_similarity = 0.9997\n[server]\n# \u8c03\u8bd5\u6a21\u5f0f=1\uff0c\u4e3a\u5f00\u542f\u8c03\u8bd5\u6a21\u5f0f\uff0c0\u4e3a\u5173\u95ed\u3002\n# \u8c03\u8bd5\u6a21\u5f0f\u4e0b\u9ed8\u8ba4\u53ea\u6267\u884c\u4e00\u6b21\u7528\u4f8b\uff0c\u4e0d\u5173\u673a\n# \u7f16\u5199\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u5efa\u8bae\u5f00\u542fmaintain\u3002\nMAINTAIN = 0\n# \u8fd0\u884c\u7684\u73af\u5883docker\u5bb9\u5668\u73af\u5883\uff0chost\u5bbf\u4e3b\u673a\u73af\u5883\nENV = docker\n# \u670d\u52a1\u7aef\u5bc6\u7801\nPASSWORD=1\n# \u6307\u5b9a\u6d4b\u8bd5\u673a\u522b\u540d\n# \u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6bd4\u5982\uff1a\n# [AMD]\n# ip=10.8.15.86\n# user=uos\n# \u5176\u4e2d AMD \u4e3a\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5219client_alias=AMD\nCLIENT_ALIAS = x86\uff08Intel-i7\uff09\n# 1 \u5f00\u542f\u7f51\u7edc, 0 \u5173\u95ed\u7f51\u7edc\n# \uff081\uff09\u670d\u52a1\u7aef\u4e0e\u6d4b\u8bd5\u673a\u987b\u5728\u540c\u4e00\u7f51\u6bb5\u4e0b\uff0c\u4f60\u53ef\u4ee5\u5c1d\u8bd5\u5728\u670d\u52a1\u7aef\u901a\u8fc7ssh\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c\u5982\u679c\u53ef\u4ee5\u8fde\u63a5\uff0c\u8bf4\u660e\u7f51\u7edc\u6b63\u5e38\u3002\n# \uff082\uff09\u5f53input_type=FILE_NAME \u65f6\uff0c\u5fc5\u987b\u5f00\u542f\u7f51\u7edc\u3002\nNETWORK = 1\n# \u6027\u80fd\u7ed3\u679c\u7edf\u8ba1\u5355\u4f4d \u6beb\u79d2\u2014ms, \u79d2\u2014s\nUNIT=ms\n# \u6d4b\u8bd5\u673a\u5f00\u673a\u8fdb\u5165\u684c\u9762\u540e\u7b49\u5f85\u65f6\u95f4,\u5355\u4f4d/\u79d2\nSTARTUP_DELAY = 60\n# 1\u4e3a\u5220\u9664\u7f13\u5b58\uff0c0\u4e3a\u4e0d\u5220\u9664\u7f13\u5b58\n# \u7528\u4f8b\u6267\u884c\u5b8c\u540e\u4f1a\u5728report\u76ee\u5f55\u4e0b\u751f\u6210\u667a\u80fd\u89e3\u6790\u7684\u4e00\u4e9b\u7f13\u5b58\u56fe\u7247\u3002\nCACHE = 0\n# \u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u62a5\u544a\u4f1a\u4fdd\u5b58\u5728\u9879\u76ee\u4e0breport\u76ee\u5f55\u4e2d\uff1b\n# \u6307\u5b9a\u62a5\u544a\u76ee\u5f55\u5219\u5b58\u653e\u5230\u6307\u5b9a\u76ee\u5f55\u3002\nREPORT_PATH = report\n# \u670d\u52a1\u7aef\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684icon\u8d44\u6e90\u4f1a\u7f13\u5b58\u5728\u9879\u76ee\u4e0binput\u76ee\u5f55\u4e2d\nINPUT = input/\n# 1\u4e3a\u6d4b\u8bd5\u5b8c\u5173\u673a\uff0c0\u4e3a\u6d4b\u8bd5\u5b8c\u4e0d\u5173\u673a\nSHUTDOWN = 0\n# \u89e3\u6790\u8fdb\u7a0b\u6570\uff08\u4e0d\u63a8\u8350\u4fee\u6539\uff09\n# 3\u4e2a\u8fdb\u7a0b\u89e3\u6790\u89c6\u9891\u5df2\u7ecf\u80fd\u591f\u6ee1\u8db3\uff0c\u5373\u4f7f\u589e\u52a0\u8fdb\u7a0b\u6570\u4e5f\u4e0d\u80fd\u51cf\u5c11\u6574\u4f53\u8017\u65f6\n# \u53e6\u5916\u8fd8\u8981\u770bCPU\u6838\u6570\u662f\u5426\u652f\u6301\u3002\nPARSING_PROCESS = 3\n# 1\u4e3a\u4f7f\u7528\u7ee7\u7535\u5668\u5f00\u5173\u673a\uff0c0\u4e3a\u4f7f\u7528reboot\u547d\u4ee4\u91cd\u542f\u3002\u4f9d\u8d56\u7ee7\u7535\u5668\u786c\u4ef6\u8bbe\u5907\uff0c\u9700\u8981\u4f7f\u7528\u8054\u7cfb\u5f00\u53d1\u8005\nRELAY = 0\n# \u83b7\u53d6\u6d4b\u8bd5\u5e94\u7528\u7684\u7248\u672c, %s \u5360\u4f4d\u5e94\u7528\u540d\n# \u5982\u679c\u8be5\u914d\u7f6e\u4e3a\u7a7a\uff0c\u5219\u4e0d\u83b7\u53d6\u5e94\u7528\u7684\u7248\u672c\u4fe1\u606f\u3002\nCOMMAND = apt policy %s 2>/dev/null|grep \"\u5df2\u5b89\u88c5\"|awk -F \"\uff1a\" \"{print \\$2}\"\n# \u5173\u673a\u7b49\u5f85\u5f00\u542f\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6839\u636e\u6d4b\u8bd5\u673a\u6027\u80fd\u4e0d\u540c\uff0c\u5f00\u5173\u673a\u8017\u65f6\u53ef\u80fd\u4e0d\u540c\uff0c\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u673a\u60c5\u51b5\u914d\u7f6e\u3002\nSHUTDOWN_DELAY = 30\n# \u53ef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u56fe\u7247\u683c\u5f0f\uff0c\u4ee5\u82f1\u6587\u9017\u53f7\u9694\u5f00\u3002\n# \u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u76ee\u524d\u6211\u4eec\u4ec5\u9a8c\u8bc1\u4e86jpg,jpeg,png\u8fd9\u4e09\u79cd\u5e38\u7528\u7684\u56fe\u7247\u683c\u5f0f\u3002\nINPUT_TYPES = jpg,jpeg,png\n# \u6027\u80fd\u5206\u6790\u8865\u5e27\uff0c\u7b49\u4e8e\u6216\u4f4e\u4e8e\u8be5\u503c\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u9700\u8981\u51cf\u6389\u3002\nUN_STAB_START = 3\n# \u670d\u52a1\u7aef\u83b7\u53d6\u6d4b\u8bd5\u673a\u56fe\u50cf\u7684\u5e27\u7387\uff0c\u5373\u6bcf\u79d2\u83b7\u53d6\u591a\u5c11\u5f20\u6d4b\u8bd5\u673a\u4e0a\u7684\u56fe\u50cf\u3002\n# \u9ed8\u8ba4\u5e27\u7387\u4e3a30\u5e27/\u79d2\uff0c\u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u53ef\u80fd\u4f1a\u5bf9\u89e3\u6790\u7ed3\u679c\u9020\u6210\u504f\u5dee\u3002\nFPS = 30\n# \u4ee5\u4e0b\u573a\u666f\u7c7b\u578b\u4f1a\u91cd\u542f\u6d4b\u8bd5\u673a,\u591a\u79cd\u573a\u666f\u4f7f\u7528\u9017\u53f7\u9694\u5f00\nSCENE = cold\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = http://10.8.13.78:8890\n#\u5c4f\u5e55\u56fe\u7247\u4e34\u65f6\u5b58\u653e\u4f4d\u7f6e\nSCREEN_CACHE = /tmp/screen\n# =======================================\n[log]\n# \u65e5\u5fd7\u7ea7\u522b\uff0cOFF\u3001FATAL\u3001ERROR\u3001WARN\u3001INFO\u3001DEBUG\u3001ALL\n# \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u65e5\u5fd7\u8f93\u51fa\uff0clog_cli=INFO\u8868\u793a \u4ec5\u8f93\u51faINFO\u53ca\u4ee5\u4e0a\u7ea7\u522b\u7684\u65e5\u5fd7\u3002\nLOG_LEVEL = DEBUG\n# \u65e5\u5fd7\u6587\u4ef6\u4fdd\u5b58\u8def\u5f84\nLOG_PATH= logs\n# =======================================\n[dockerhub]\n# \u5bb9\u5668\u767b\u9646\u8d26\u53f7\nDOCKER_USER = user\n# \u5bb9\u5668\u767b\u9646\u5bc6\u7801\nDOCKER_PASSWORD = User1234\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u6d4b\u8bd5\u673a\u914d\u7f6e","text":"setting/config/client.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u4fe1\u606f\u3002 \u6709\u7f51\u7edc\u7684\u60c5\u51b5\u4e0b\uff0c\u670d\u52a1\u7aef\u9700\u8981\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u56e0\u6b64\u4f60\u9700\u8981\u5199\u5165 \u6d4b\u8bd5\u673a\u522b\u540d \u3001 user \u3001ip\u3001 password \u3002 # \u6d4b\u8bd5\u673a\u522b\u540d\n[Alias1] # \u6d4b\u8bd5\u673aip\nip=10.8.15.86 # \u6d4b\u8bd5\u673a\u7528\u6237\u540d\nuser=uos\n \u547d\u540d\u5efa\u8bae\uff1aAliasA1\u3001AliasA2\u3001AliasB1\u3001AliasB2\uff0c\u4e0d\u8981\u91cd\u540d\u3002 \u65e0\u7f51\u7edc\u60c5\u51b5\u4e0b\uff0c\u4ec5\u9700\u8981\u5173\u6ce8\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\u9879 width=\u3001 height= \u5373\u53ef\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a [client]\n# \u9ed8\u8ba4\u6d4b\u8bd5\u673a\u7528\u6237\u540d\uff0c\u5bc6\u7801\uff0cip\nip=\nuser=\n# \u6d4b\u8bd5\u673a\u5bc6\u7801\npassword=1\n# \u6d4b\u8bd5\u673a\u4e3b\u9898\ntheme=bloom\n# \u6d4b\u8bd5\u673aicon\u76ee\u5f55\npath=/usr/share/icons\n# \u7cfb\u7edfdesktop\u6587\u4ef6\u7684\u5b58\u653e\u76ee\u5f55\uff0cUOS\u7cfb\u7edf\u9ed8\u8ba4\u4e3a/usr/share/applications\ndesktop_path=/usr/share/applications\n# \u7528\u4e8e\u5224\u65ad\u6d4b\u8bd5\u673a\u662f\u5426\u5f00\u673a\u8fdb\u5165\u684c\u9762\u7684\u8bc6\u522b\u6807\u8bc6\u3002\n# 1\u3001\u901a\u8fc7\u684c\u9762\u56fe\u6807\u8bc6\u522b\u3002\n# - type=FILE_NAME\u65f6\uff0c\u670d\u52a1\u5668\u548c\u6d4b\u8bd5\u673a\u5fc5\u987b\u5728\u540c\u4e00\u5c40\u57df\u7f51\u5185\u3002\n# - power_on=dde-computer\u8868\u793a\u901a\u8fc7\u684c\u9762\u8ba1\u7b97\u673a\u56fe\u6807\u5224\u65ad\u5f00\u673a\u8fdb\u5165\u684c\u9762\u3002\n# 2\u3001\u901a\u8fc7\u672c\u5730\u56fe\u7247\u4f5c\u4e3a\u5f00\u673a\u8bc6\u522b\u3002\n# - type= \u4f20\u5165\u4e3a\u56fe\u7247\u683c\u5f0f\uff0ctype\u652f\u6301\u7684\u7c7b\u578b\u5305\u542b\u5728server.ini\u5185\u914d\u7f6e\u9879input_type=jpg,jpeg,png\u3002\n# - power_on= \u4f20\u5165\u7684\u662f\u672c\u5730\u56fe\u7247\u7684\u8def\u5f84\u3002\ntype=FILE_NAME\npower_on=dde-computer\n# \u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\uff08\u6d4b\u8bd5\u673a\u8fde\u63a5\u91c7\u96c6\u76d2\uff0c\u91c7\u96c6\u76d2\u7684\u5206\u8fa8\u7387\uff09\nheight=1080\nwidth=1920\n[AliasA1] ip=10.8.15.86\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n[AliasA2]\nip=10.8.15.20\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_2","title":"3\u3001\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e","text":"\u968f\u7740\u6d4b\u8bd5\u573a\u666f\u7684\u4e0d\u65ad\u5f15\u5165\uff0c\u53d1\u73b0\u73b0\u6709\u670d\u52a1\u7aef\u91cc\u7684\u914d\u7f6e\u9879\u5e76\u4e0d\u9002\u7528\u4e8e\u6240\u6709\u7684\u6027\u80fd\u573a\u666f\uff0c\u4e8e\u662f\u5c06\u670d\u52a1\u7aef\u914d\u7f6e\u8fdb\u884c\u4e00\u4e2a\u63d0\u53d6\uff0c\u53ef\u505a\u5355\u4e2a\u573a\u666f\u7684\u4e2a\u6027\u5316\u914d\u7f6e\uff0c\u5f53\u7136\u539f\u6765\u7684\u670d\u52a1\u7aef\u914d\u7f6e\u529f\u80fd\u4fdd\u7559\uff0c\u53ea\u662f\u5f53\u4f60\u914d\u7f6e\u4e86\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e\u540e\uff0c\u4f18\u5148\u4f7f\u7528\u4e2a\u6027\u5316\u914d\u7f6e\u91cc\u9762\u7684\u5185\u5bb9\uff0c\u4ee5\u4e0b\u662f\u5bf9\u4e2a\u6027\u5316\u914d\u7f6e\u7684\u4ecb\u7ecd\u3002 \u76ee\u524d\u6bcf\u4e00\u4e2a py \u6587\u4ef6\u5bf9\u5e94\u4e00\u4e2a\u6027\u80fd\u6d4b\u8bd5\u573a\u666f\uff0c\u4e8e\u662f\u5728\u540c\u7ea7\u76ee\u5f55\u4e0b\u521b\u5efa\u4e00\u4e2a\u4e0e\u4e4b\u540c\u540d\u7684 json \u6587\u4ef6\uff0c\u4f5c\u4e3a\u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6 apps\n\u251c\u2500\u2500 album\n \u251c\u2500\u2500 test_album_01_start.json # \u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6\n\u2514\u2500\u2500 test_album_01_start.py # \u6027\u80fd\u573a\u666f\u6587\u4ef6\n \u4ee5\u4e0b\u662f\u5bf9 json \u6587\u4ef6\u4e2d\u914d\u7f6e\u7684\u89e3\u91ca\uff0c\u82e5\u67d0\u9879\u914d\u7f6e\u4e0d\u9700\u8981\uff0c\u53ef\u4ee5\u7f3a\u5931\uff0c\u4f46\u4e0d\u80fd\u4e3a\u7a7a\uff1b {\n\"title\": \"test_album_start\", # \u6807\u9898\uff1b\u5fc5\u987b\n\"app_name\": \"deepin-album\", # \u573a\u666f\u6240\u5c5e\u7684\u5e94\u7528\uff1b\u5fc5\u987b\n\"scene\": \"hot\", # \u573a\u666f\u522b\u540d\uff1b\u5fc5\u987b\n\"icon\": [\"deepin-album\"], # \u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684icon\u5230\u670d\u52a1\u7aef\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\uff1b\u53ef\u7f3a\u5931\n# \u6ce8\u610f\uff1a\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684desktop\u6587\u4ef6\u540d\u4e3adeepin-album.desktop\uff0c\n# \u53ea\u9700\u8981\u5199deepin-album\u5373\u53ef\uff0c\u201c.desktop\u201d\u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002\n\"size\": { # \u56fe\u7247\u5bf9\u6bd4\u7684\u533a\u57df\u8bbe\u7f6e\u9879\uff0c\u67d0\u4e9b\u5e94\u7528\u5f53\u524d\u5c4f\u5e55\u7684\u90e8\u5206\u533a\u57df\u9700\u8981\u5c06\u5176\u53bb\u6389\uff0c\u53ef\u4ee5\u8bbe\u7f6e\u6b64\u9879\uff0c\u5982\u679c\u6ca1\u6709\u5219\u53ef\u4e0d\u5199\uff1b\u53ef\u786e\u5b9e\n\"x-coordinate\": 0, # \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n\"y-coordinate\": 0, # \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n\"width\": 850, # \u6a2a\u5411\u957f\u5ea6\n\"height\": 1920 # \u7eb5\u5411\u9ad8\u5ea6\n},\n\"count\": 5, # \u573a\u666f\u6267\u884c\u7684\u6b21\u6570\uff1b\u5fc5\u987b\n\"duration\": 5, # \u8be5\u6761\u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff0c\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7279\u5b9a\u573a\u666f\uff0c\u8be5\u914d\u7f6e\u4e3a\u53ef\u9009\u9879\uff0c\u8986\u76d6 server.ini \u4e2d\u7684\u914d\u7f6e\uff1b\u53ef\u7f3a\u5931\n\"stable_similarity\": 0.9997, # \u6027\u80fd\u573a\u666f\u5206\u9636\u6bb5\u65f6\u7684\u56fe\u7247\u76f8\u4f3c\u5ea6\u5bf9\u6bd4\uff0c\u524d\u540e\u56fe\u7247\u4f4e\u4e8e\u8be5\u503c\uff0c\u5219\u5206\u4e3a\u4e0d\u7a33\u5b9a\u9636\u6bb5\uff1b\u53ef\u7f3a\u5931\n\"find_by\": \"stage\", # \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\n\"final_stable_num\": 100, # \u67e5\u627e\u6700\u540e\u4e00\u4e2a\u5927\u4e8e\u8be5\u503c\u7684\u7a33\u5b9a\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u7684\u5c3e\u796f\uff1b\u53ef\u7f3a\u5931\n\"start_num\": 150,\n\"text\": \"\", # ocr\u8bc6\u522b\u7684\u6587\u6848\n\"match\": \"apps/xxx/images/match.png\", # \u56fe\u50cf\u5339\u914d\u7684\u56fe\u7247\u6587\u4ef6\u8def\u5f84\n\"match_rate\": 0.9 # \u5339\u914d\u76f8\u4f3c\u5ea6\n}\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e94\u3001\u6d4b\u8bd5\u6d41\u7a0b","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516d\u3001\u7528\u4f8b\u7f16\u5199\u53ca\u65b9\u6cd5\u53c2\u6570\u6307\u5f15","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"1\u3001\u7528\u4f8b\u5b9e\u4f8b\u8bf4\u660e","text":"# \u6807\u51c6\u5e93\u5bfc\u5165\nfrom time import sleep\n# \u5bfc\u5165\u4e09\u65b9\u5e93pytest\nimport pytest\n# \u5bfc\u5165\u7528\u4f8b\u6267\u884c\u8981\u7528\u5230\u7684Widget\u7c7b\nfrom src.base_widget import BaseWidget\nclass TestStart:\n# class\u7ea7\u522b\u7684fixture\uff0c\u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u6267\u884c\u3002autouse=True \u81ea\u52a8\u5728\u5f53\u524d\u4f5c\u7528\u57df\u4e0b\u4f7f\u7528\u3002\n@pytest.fixture(scope=\"class\", autouse=True)\n# \u6d4b\u8bd5\u70ed\u542f\u52a8\u4e4b\u524d\u9700\u8981\u9884\u542f\u52a8\u3002\ndef application_pre_start(self):\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().right_click_element(\"deepin-album\")\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().click_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\")\nsleep(2)\n# \u5feb\u6377\u952e\u5173\u95ed\u7a97\u53e3\nBaseWidget().hot_key(\"alt\", \"f4\")\nsleep(2)\n# \u9ed8\u8ba4\u4e3afunction\u7ea7\u522b\u7684fixture\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\uff0cclass\u7ea7\u522bfixture\u6267\u884c\u4e4b\u540e\u6267\u884c\u3002\n@pytest.fixture(autouse=True)\ndef setup_start(self):\n# \u53f3\u952e\u70b9\u51fb deepin-album \u56fe\u6807\nBaseWidget().right_click_element(\"deepin-album\")\n# \u79fb\u52a8\u5230\u53f3\u952e\u83dc\u5355\u4e2d\u6253\u5f00\uff08open.png\uff09\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().move_to(*BaseWidget().find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))\n# \u7b49\u5f85\u79fb\u52a8\u5b8c\u6210\nsleep(0.5)\ndef test_album_start(self):\n# \u70b9\u51fb\u201c\u6253\u5f00\u201d\nBaseWidget().click() \n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"2\u3001\u65b9\u6cd5\u53c2\u6570\u8bf4\u660e","text":"2.1\u3001find_element \u65b9\u6cd5 def find_element(element: str, input_type: str = \"FILE_NAME\", fill_color_position: tuple = (-1, -1), size: tuple = (25, 70)):\npass\n \u53c2\u6570 element \u548c input_type \uff081\uff09\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u5143\u7d20 - `input_type` \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a `FIEL_NAME` \uff0c\u8868\u793a\u901a\u8fc7\u5e94\u7528 `icon` \u5bfb\u627e\u5143\u7d20\uff0c\u6b64\u65b9\u6cd5\u4f1a\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u5e94\u7528 `icon` \u56fe\u6807\u3002\n \u4e3e\u4f8b\uff1a\u9ed8\u8ba4\u60c5\u51b5\u4e0b input_type \u53c2\u6570\u4e0d\u9700\u8981\u4f20\u5165\uff0c find_element(\"deepin-album\")\uff0c\u8868\u793a\u901a\u8fc7 deepin-album \u7684\u5e94\u7528 icon \u6765\u83b7\u53d6\u5750\u6807\uff0c\u6ce8\u610f\uff0c\u6b64\u65f6\u4f20\u5165\u7684 deepin-album \u53c2\u6570\u5b9e\u9645\u662f desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u548c2.3\u4e2d\u7684 icon \u53d8\u91cf\u4e00\u81f4\u3002 \u6211\u4eec\u5efa\u8bae\u4f18\u5148\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\uff0c\u4f46\u6b64\u65b9\u6cd5\u4f9d\u8d56\u7f51\u7edc\uff0c\u8bf7\u6839\u636e\u6d4b\u8bd5\u73af\u5883\u5b9e\u9645\u60c5\u51b5\u9009\u62e9\u3002 \uff082\uff09\u901a\u8fc7\u672c\u5730\u56fe\u7247\u8bc6\u522b\u5143\u7d20 - \u53c2\u6570 `input_type` \u4f20\u5165\u56fe\u7247\u683c\u5f0f\uff0c\u6bd4\u5982\u622a\u53d6\u7684\u672c\u5730\u56fe\u7247\u683c\u5f0f\u4e3a `png`\uff0c\u90a3\u4e48 `input_type=\"png\"`\uff0c\u6b64\u65f6\u53c2\u6570 `element ` \u4f20\u5165\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5efa\u8bae\u5b58\u653e\u5728\u5bf9\u5e94\u7684\u4ea7\u54c1 `apps/app/picture/` \u76ee\u5f55\u4e0b\uff0c\u8def\u5f84\u4e3a\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u7684\u76f8\u5bf9\u8def\u5f84\u3002\n- \u4e3e\u4f8b\uff1a`find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))`\uff0c\u8868\u793a\u901a\u8fc7\u672c\u5730\u56fe\u7247 `open.png` \u8bc6\u522b\u5143\u7d20\u3002\n \u53c2\u6570 fill_color_position fill_color_position \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (-1, -1)\uff0c(-1, -1) \u8868\u793a\u53d6\u5c4f\u5e55\u4e2d\u53f3\u4e0b\u89d2\u6700\u540e\u4e00\u4e2a\u50cf\u7d20\u70b9\u4f5c\u4e3a\u586b\u5145\u5750\u6807\uff0c\u5728 1920x1080 \u5c4f\u5e55\u5206\u8fa8\u7387\u4e0b\u5373\u5b9e\u9645\u5750\u6807\u4e3a (1919, 1079) \uff0c\u8fd9\u6837\u7684\u5199\u6cd5\u53ef\u4ee5\u9002\u914d\u4e0d\u540c\u5927\u5c0f\u7684\u5c4f\u5e55\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0d\u540c\u65b9\u4f4d\uff1a \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0b\u65b9\uff0c\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u4e0d\u9700\u8981\u4f20\u5165\u8be5\u53c2\u6570\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u5de6\u8fb9\uff0cfill_color_position=(1, 1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u53f3\u8fb9\uff0cfill_color_position=(-1, -1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0a\u8fb9\uff0cfill_color_position=(1, 1) \u4ece\u684c\u9762\u542f\u52a8\u5e94\u7528\uff0c\u5219\u9700\u8981\u4f20\u5165\u9664\u4efb\u52a1\u680f\u4ee5\u5916\u5176\u4ed6\u4f4d\u7f6e\u7684\u5750\u6807\uff0c\u6bd4\u5982(100, 100)\uff0c\u53ea\u8981\u8fd9\u4e2a\u5750\u6807\u4e3a\u9664\u5e94\u7528\u548c\u4efb\u52a1\u680f\u533a\u57df\u90fd\u53ef\u4ee5\u3002 \u4ece\u542f\u52a8\u5668\u91cc\u9762\u542f\u52a8\u5e94\u7528\uff0c\u9700\u8981\u586b\u5145\u7684\u5750\u6807\u4e3a\u542f\u52a8\u5668\u533a\u57df\u3002 \u6ce8\uff1a\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u65f6\uff0c\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684 icon \u539f\u6587\u4ef6\u4e3a svg \u77e2\u91cf\u56fe\uff0c\u8f6c\u6362\u4e3a png \u4e4b\u540e\u9700\u8981\u586b\u5145\u8fb9\u7f18\u900f\u660e\u90e8\u5206\u3002 \u53c2\u6570 size size \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (25, 70)\uff0c\u8868\u793a\u6d4b\u8bd5\u673a\u4e0a dock \u680f\u4e0a\u5e94\u7528\u56fe\u6807\u7684\u5927\u5c0f\u8303\u56f4\u3002 UOS \u7cfb\u7edf dock \u680f\u662f\u53ef\u4ee5\u4e0a\u4e0b\u62d6\u52a8\u5927\u5c0f\u7684\uff0c\u968f\u7740 dock \u680f\u5927\u5c0f\u6539\u53d8\uff0c\u5e94\u7528\u56fe\u6807\u7684\u8303\u56f4\u4e3a25\u523070\u4e4b\u95f4\u3002 \u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u64cd\u4f5c\u7cfb\u7edf\u4e0a dock \u680f\u5927\u5c0f\u4e0d\u4e00\u6837\uff0c\u53ef\u4ee5\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u4f20\u5165\u5927\u5c0f\u8303\u56f4\u3002 2.2\u3001click_element\u3001 right_click_element\uff0c double_click_element \u8fd9\u51e0\u4e2a\u65b9\u6cd5\u53c2\u6570\u89c4\u5219\u4e0e find_element \u65b9\u6cd5\u4e00\u6837\u3002\u4ed6\u4eec\u5b9e\u9645\u4e0a\u662f\u5728 find_element \u65b9\u6cd5\u57fa\u7840\u4e4b\u4e0a\u505a\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u589e\u52a0\u4e86\u9f20\u6807\u7684\u52a8\u4f5c\uff0c\u5982\u679c\u4f60\u4e0d\u60f3\u4f7f\u7528\u8fd9\u51e0\u4e2a\u65b9\u6cd5\uff0c\u5728\u7528\u4f8b\u4e2d\u4e5f\u53ef\u4ee5\u901a\u8fc7 find_element \u83b7\u53d6\u5230\u5750\u6807\uff0c\u7136\u540e\u5c06\u5750\u6807\u4f20\u5165\u5230\u952e\u9f20\u7684\u65b9\u6cd5\u4e2d\uff0c\u53ef\u4ee5\u5b9e\u73b0\u540c\u6837\u7684\u6548\u679c\u3002 2.3\u3001\u7528\u4f8b\u7c7b\u4e2d\u6709\u4e2a\u7c7b\u53d8\u91cf icon = [\"deepin-album\"] \u9700\u8981\u7279\u6b8a\u8bf4\u660e\uff0c\u5217\u8868\u4e2d\u7684\u5143\u7d20\u4e3a\u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709 icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684 icon \u5230\u670d\u52a1\u7aef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528 desktop \u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684 desktop \u6587\u4ef6\u540d\u4e3a deepin-album.desktop\uff0c\u53ea\u9700\u8981\u5199 deepin-album \u5373\u53ef\uff0c.desktop \u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e03\u3001\u6267\u884c\u5165\u53e3","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"1\u3001\u7528\u4f8b\u7ec4\u7ec7","text":"\u5728 setting/config/server.ini \u6587\u4ef6\u4e2d APP_NAME= \u5b57\u6bb5\u4e3a\u7528\u4f8b\u7684\u6267\u884c\u7684\u76ee\u5f55\uff0c\u9ed8\u8ba4\u4e3a apps \u76ee\u5f55\u4e0b\u6240\u6709\u7528\u4f8b\u3002\u5982\u679c\u4f60\u60f3\u6307\u5b9a\u6267\u884c\u67d0\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4f60\u53ef\u4ee5\u5c06\u8be5\u914d\u7f6e\u9879\u6307\u5b9a\u5230\u5e94\u7528\u7684\u7528\u4f8b\u76ee\u5f55\uff0c\u6bd4\u5982\uff1aAPP_NAME=deepin_album\uff0c \u8868\u793a\u6267\u884c\u76f8\u518c\u76ee\u5f55\u4e0b\u7684\u7528\u4f8b\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a python3 manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music\n -k KEYWORDS, --keywords KEYWORDS\n \u7528\u4f8b\u7684\u5173\u952e\u8bcd\n -t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e\n --log_level LOG_LEVEL \u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n --env {host,docker} \u5728\u5bbf\u4e3b\u673a\u6216\u5bb9\u5668\u73af\u5883\u6267\u884c\n --client_alias \u9009\u62e9\u6d4b\u8bd5\u673a\u522b\u540d, \u53ef\u9009\u9879\u4e3aclient.ini\u4e2d\u5df2\u914d\u7f6e, \u9ed8\u8ba4\u503c\u4e3a zx-x86.\n --count \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a python3 manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\" --env docker\n \u6ce8\uff1a\u5728\u5bb9\u5668\u4e2d\u6267\u884c\u65f6\uff0c\u82e5\u5f3a\u5236\u9000\u51fa\uff0c\u5bb9\u5668\u5e76\u4e0d\u4f1a\u505c\u6b62\u8fd0\u884c\uff01"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_9","title":"\u516b\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1json","title":"1\u3001Json \u62a5\u544a","text":"\u81ea\u7814\u89c6\u9891\u89e3\u6790\u5de5\u5177\u4f1a\u5bf9\u5355\u6761\u7528\u4f8b\u6267\u884c\u4e00\u8f6e\u751f\u6210\u4e00\u4e2a json \u6587\u4ef6\uff0c\u5b58\u653e\u4e8e report/{app_name}/{scene}/{run_num} \u76ee\u5f55\u4e0b\uff0c\u547d\u540d\u683c\u5f0f\u4e3a\uff1a report.json json \u5185\u5bb9\u4e3e\u4f8b\uff1a [\n{\n\"Stab1\": {\n\"images\": [1,2...150,151],\n\"startStub\": 0,\n\"type\": \"Stab\"\n}\n},\n{\n\"Stab2\": {\n\"images\": [152,153...169,170],\n\"startStub\": 1,\n\"type\": \"UnStab\"\n}\n},\n{\n\"Stab3\": {\n\"images\": [171,172...300,301],\n\"startStub\": 0,\n\"type\": \"UnStab\"\n}\n}\n]\n \u8bf4\u660e\uff1a Stab \uff1a\u8868\u793a\u89e3\u6790\u8fc7\u7a0b\u4e2d\u4e0d\u540c\u7684\u9636\u6bb5\u3002 images \uff1a\u8868\u793a\u6bcf\u4e00\u5e27\u7684\u56fe\u7247\u5e8f\u53f7\u3002 startStub\uff1a \u4e3a\u8bc6\u522b\u5c3e\u5e27\u7684\u9636\u6bb5\u8868\u793a\uff0c\u5982\u679c \"startStub\": 1 \uff0c\u8bf4\u660e\u5c3e\u5e27\u51fa\u73b0\u5728\u8be5\u9636\u6bb5\u3002 type\uff1a \u4e3a Stab \u6216 UnStab \uff0c\u8868\u793a\u7a33\u5b9a\u9636\u6bb5\u6216\u4e0d\u7a33\u5b9a\u9636\u6bb5\u3002 \u5404\u9636\u6bb5\u6709\u5e27\u6570\u8865\u507f\uff0c\u9ed8\u8ba4\u8865\u507f\u7684\u5e27\u6570\u4e3a 3 \u5e27\uff08\u53ef\u4ee5\u901a\u8fc7 server.ini \u91cc\u9762 un_stab_start=3 \u8fdb\u884c\u914d\u7f6e\uff09\uff0c\u8868\u793a\u5c0f\u4e8e\u7b49\u4e8e 3 \u5e27\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u524d\u540e\u5747\u9700\u8981\u51cf\u6389\u3002 \u5e94\u7528\u542f\u52a8\u9636\u6bb5\u5c31\u662f\u5728 Stab2 \u9636\u6bb5\uff0c\u542f\u52a8\u65f6\u95f4\u4e3a\uff1a171 \u51cf 151 \u518d\u51cf\u6389\u524d\u540e\u8865\u507f\u5e27\u6570 6 \u5e27\uff0c\u5373 14 \u5e27\uff0c\u89c6\u9891\u5e27\u7387 30 \u5e27/\u79d2\uff0c\u56e0\u6b64\u542f\u52a8\u8017\u65f6\u4e3a\uff1a14 * 33 = 462 ms"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2excel","title":"2\u3001Excel \u62a5\u544a","text":"\u6240\u6709\u7528\u4f8b\u6267\u884c\u5e76\u89e3\u6790\u5b8c\u4e4b\u540e\u4f1a report \u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a\u6c47\u603b\u6570\u636e\u7684 Excel \u6587\u4ef6\uff0c\u6587\u4ef6\u540d\u4e3a\uff1a{time}_perf_time.xlsx\u3002 \u6ce8\u610f\uff0creport \u76ee\u5f55\u4e3a\u53ef\u914d\u7f6e\u9879\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u4f1a\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u751f\u6210\uff0c\u5982\u679c\u4f60\u5c06 report\uff0c\u6307\u5b9a\u5230\u9879\u76ee\u4e0b\u5176\u4ed6\u8def\u5f84\uff0c\u5219\u4f1a\u5728\u5bf9\u5e94\u7684\u8def\u5f84\u4e0b\u751f\u6210 json \u548c Excel \u6587\u4ef6\u3002 \u4f60\u4e5f\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8bfb\u53d6\u6240\u6709 json / excel \u62a5\u544a\u7684\u6570\u636e\uff0c\u751f\u6210\u4f60\u81ea\u5df1\u60f3\u8981\u7684\u4e00\u4e9b\u6d4b\u8bd5\u62a5\u544a\u5f62\u5f0f\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#usb","title":"\u4e5d\u3001USB \u4e32\u53e3\u9a71\u52a8\u952e\u9f20\u65b9\u6cd5","text":"\u4f4d\u4e8e src/utils/control/serial_communication \u76ee\u5f55\u4e0b\u7684 usb_mk.py \u6587\u4ef6 usb_mk = UsbMk()\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up()\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u652f\u6301\u4f20\u5165\u6c49\u5b57\uff0c\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click()\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() \n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() \n \uff084\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() \n \uff085\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() \n \uff086\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() \n \uff087\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff088\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff0810\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_10","title":"\u5341\u3001\u7ee7\u7535\u5668\u63a7\u5236\u4e3b\u673a\u5f00\u673a/\u91cd\u542f","text":"\uff08\u82e5\u4e0d\u4f7f\u7528\u7ee7\u7535\u5668\uff0c\u53ef\u5ffd\u7565\u8be5\u6b65\u9aa4\uff0c\u6267\u884c\u65f6\u4f1a\u901a\u8fc7\u547d\u4ee4 reboot\uff09"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u7ee7\u7535\u5668\u8bbe\u5907","text":"LCUS-2 \u578b \u53cc\u8def USB \u667a\u80fd\u4e32\u53e3\u63a7\u5236\u7ee7\u7535\u5668\u3002 https://item.taobao.com/item.htm?spm=a1z09.2.0.0.41d72e8dUYx2pi&id=582653718178&_u=i25r20ia6a2e "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2usb","title":"2\u3001USB \u5ef6\u957f\u7ebf","text":"\u666e\u901a\u7684 USB \u7ebf\u5373\u53ef\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_3","title":"3\u3001\u675c\u90a6\u7ebf","text":"3.1\u300140P \u6bcd\u5bf9\u516c\u675c\u90a6\u7ebf\u3002 3.2\u3001\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"4\u3001\u5b89\u88c5\u56fe\u6587\u6559\u7a0b","text":"4.1\u3001\u4f7f\u7528 USB \u5ef6\u957f\u7ebf\u8fde\u63a5\u63a7\u5236\u7aef\u548c\u7ee7\u7535\u5668\u3002 4.2\u3001\u5728\u7ee7\u7535\u5668\u5e38\u7aef\u548c\u516c\u5171\u7aef\u5747\u8fde\u63a5\u4e00\u6839\u675c\u90a6\u7ebf\u3002 4.3\u3001\u5728\u4e3b\u677f\u4e0a\u5f00\u673a\u9488\u548c\u91cd\u542f\u9488\u4e0a\u63d2\u4e0a\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 4.4\u3001\u5c06\u5f00\u673a\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76841\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1\u5de6\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 4.5\u3001\u5c06\u91cd\u542f\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76842\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1 \u53f3\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 \u82e5\u60f3\u4fdd\u7559\u539f\u7535\u6e90\u5f00\u5173\u7684\u7535\u6e90\u706f\uff0c\u53ef\u6839\u636e\u5982\u4e0a\u56fe\u6240\u793a\uff0c\u4f7f\u7528\u675c\u90a6\u7ebf\u8fde\u63a5\u4e3b\u677f\u4e0a\u7684\u7535\u6e90\u706f\u548c\u539f\u7535\u6e90\u5f00\u5173"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_11","title":"\u5341\u4e00\u3001\u5e38\u89c1\u95ee\u9898\u8bf4\u660e","text":"1\u3001ERROR: for uos Cannot restart container 2301b1a1395d7959ee6523d61b61c87084649af530786cdb8fb5b3ecbcbd1068: linux runtime spec devices: error gathering device information while adding custom device \"/dev/ttyACM0\": no such file or directory \u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u8fde\u63a5\u72b6\u6001\uff0c\u67e5\u770b /dev/ttyACM0 \u662f\u5426\u5b58\u5728\uff0c\u82e5\u5b58\u5728 /dev/ttyACMn\uff08n\u4e3a\u4efb\u610f\u6570\u5b57\uff09\uff0c\u91cd\u542f\u7535\u8111\u89e3\u51b3\u3002 2\u3001Error response from daemon: Container 5e700fdc769e8c74666d68a7f2bc3de58268b4594cf88706609d59f8dbc7362d is not running \u5bb9\u5668\u542f\u52a8\u5931\u8d25 1\uff09\u68c0\u67e5\u54ea\u4e00\u4e2a\u5bb9\u5668\u672a\u542f\u52a8 sudo docker container ls # \u5217\u51fa\u8fd0\u884c\u4e2d\u7684 Docker \u5bb9\u5668\n 2\uff09\u7f3a\u5c11 uos \u5bb9\u5668\uff0c\u68c0\u67e5 USB \u4e32\u53e3\u8fde\u63a5\u7ebf\u548c\u91c7\u96c6\u76d2\u8fde\u63a5\u7ebf\u662f\u5426\u6b63\u5e38\uff0c\u91cd\u542f\u540e\u6267\u884c bash install/setup.up # \u91cd\u65b0\u5b8c\u6574\u90e8\u7f72\u73af\u5883\n \u6216\u6267\u884c sudo docker-compose up -d --build # \u4ec5\u91cd\u65b0\u6784\u5efa Docker \u955c\u50cf\n 3\u3001\u82e5\u90e8\u7f72\u65f6\u63d0\u793a\u6302\u8f7d ttyACM0\u3001video0 \u5931\u8d25\uff0c\u8bf7\u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u53ca\u91c7\u96c6\u76d2\u662f\u5426\u63a5\u89e6\u826f\u597d\uff0c\u82e5\u63a5\u89e6\u826f\u597d\uff0c\u91cd\u542f\u5373\u53ef\u89e3\u51b3\u3002 4\u3001\u82e5\u51fa\u73b0\u56fe\u7247\u80fd\u8bc6\u522b\uff0c\u4f46\u662f\u9f20\u6807\u672a\u79fb\u52a8\u64cd\u4f5c\u65f6\uff0c\u5b89\u88c5\u7edd\u5bf9\u9f20\u6807\u64cd\u4f5c\u7684\u4f9d\u8d56\u5305\uff0c\u89c1\u7b2c\u4e09\u8282\u7b2c\u4e8c\u5c0f\u8282\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u6d4b\u8bd5\u673a\u3002 5\u3001\u7531\u4e8e\u901a\u8fc7\u91c7\u96c6\u5361\u83b7\u53d6\u7684\u6d4b\u8bd5\u673a\u5b9e\u65f6\u753b\u9762\uff0c\u5305\u542b\u4e86\u9f20\u6807\u7684\u6837\u5f0f\uff0c\u6240\u4ee5\u5bf9\u56fe\u7247\u8bc6\u522b\u65f6\uff0c\u9f20\u6807\u82e5\u505c\u7559\u5728\u56fe\u6807\u4e0a\u5c42\uff0c\u5219\u4f1a\u5bf9\u8bc6\u522b\u7ed3\u679c\u9020\u6210\u5f71\u54cd\uff0c\u9700\u8981\u5c06\u9f20\u6807\u79fb\u52a8\u81f3\u5176\u4ed6\u4f4d\u7f6e\uff0c\u6216\u8005\u9690\u85cf\u9f20\u6807\u89e3\u51b3\u3002 6\u3001Excel \u62a5\u544a\u4e2d\uff0c\u6d4b\u8bd5\u573a\u666f\u5217\u4e0e\u7528\u4f8b\u4e2d\u7684\u4e0d\u4e00\u81f4\uff0c\u5173\u952e\u5b57scene\u3001app_name\u3001\u67b6\u6784\u522b\u540d\uff0c\u4e0d\u80fd\u5305\u542b\u4e0b\u5212\u7ebf\u548c\u82f1\u6587\u7b26\u53f7\u7684\u5706\u62ec\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/","title":"\u6846\u67b6\u529f\u80fd\u4ecb\u7ecd","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2023/1/12\n# Author : Mikigo\n# =============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_2","title":"\u4e00\u3001\u4e00\u53e5\u8bdd\u7b80\u4ecb","text":"\u6b64\u6587\u6863\u4e3b\u8981\u60f3\u5bf9 YouQu \u6846\u67b6\u4e00\u4e9b\u91cd\u70b9\u7684\u529f\u80fd\u505a\u8be6\u7ec6\u7684\u4ecb\u7ecd\uff0c\u5305\u62ec\u5bf9\u4e00\u4e9b\u529f\u80fd\u5f00\u53d1\u7684\u80cc\u666f\u3001\u8981\u89e3\u51b3\u7684\u95ee\u9898\u3001\u5b9e\u73b0\u903b\u8f91\u3001\u4ee3\u7801\u7b49\u65b9\u9762\u7684\u4ecb\u7ecd\uff0c\u4ee5\u6b64\u8ba9\u5927\u5bb6\u80fd\u66f4\u52a0\u6e05\u6670\u7684\u7406\u89e3\u5404\u9879\u529f\u80fd\uff0c\u4ece\u800c\u5728\u4f7f\u7528\u7684\u65f6\u5019\u80fd\u66f4\u52a0\u7684\u5f97\u5fc3\u5e94\u624b\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_3","title":"\u4e8c\u3001\u56fe\u50cf\u8bc6\u522b","text":"\u56fe\u50cf\u8bc6\u522b\u5728 UI \u81ea\u52a8\u5316\u4e2d\u662f\u4e0d\u53ef\u7f3a\u5c11\u7684\uff0c\u5e02\u9762\u4e0a\u751a\u81f3\u6709\u5b8c\u5168\u57fa\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\uff0c\u6bd4\u5982 Airtest\u3001Sikuli \u7b49\uff0c\u5728\u6e38\u620f\u7b49\u7279\u5b9a\u9886\u57df\u4e5f\u6709\u4e0d\u9519\u7684\u6548\u679c\uff0c\u8fd9\u4e9b\u5de5\u5177\u5b9e\u9645\u4e0a\u4e5f\u662f\u7528\u7684 OpenCV \u8fdb\u884c\u4e86\u5c01\u88c5\uff0cYouQu \u6846\u67b6\u57fa\u4e8e OpenCV \u5f00\u53d1\u4e86\u81ea\u5df1\u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\uff0c\u5b83\u53ef\u4ee5\u65b9\u4fbf\u7684\u7528\u4e8e\u754c\u9762\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u65ad\u8a00\uff1b YouQu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u51e0\u4e4e\u6ee1\u8db3\u4e86\u4f60\u7684\u6240\u6709\u8981\u6c42\uff0c\u6211\u4eec\u5728\u957f\u65f6\u95f4\u7684\u601d\u8003\u548c\u6478\u7d22\u4e2d\uff0c\u9488\u5bf9\u5e38\u89c4\u573a\u666f\u53ca\u4e00\u4e9b\u7279\u6b8a\u573a\u666f\u63a2\u7d22\u9664\u4e86\u4e00\u4e9b\u5b9e\u7528\u4e14\u6709\u6548\u7684\u65b9\u6848\uff0c\u4e14\u542c\u6211\u6162\u6162\u9053\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1","title":"1\u3001\u5e38\u89c4\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5e38\u89c4\u8bc6\u522b\u5f88\u597d\u7406\u89e3\uff0c\u4e00\u53e5\u8bdd\u8bb2\u5c31\u662f\uff0c\u8981\u83b7\u53d6\u5230\u76ee\u6807\u5143\u7d20\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u3002 \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u5728\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u9700\u8981\u83b7\u53d6\u7684\u5750\u6807\u662f\u76f8\u5bf9\u4e8e\u6574\u4e2a\u5c4f\u5e55\u7684\u5750\u6807\uff0c\u6211\u4eec\u53ef\u4ee5\u622a\u53d6\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u56fe\u7247\uff08screen\uff09\uff1b \u5728\u5143\u7d20\u8bc6\u522b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u622a\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5c0f\u56fe\u8fdb\u884c\u8bc6\u522b\uff0c\u6bd4\u5982\u622a\u53d6\u64ad\u653e\u6309\u94ae\uff1a \u90a3\u4e48\u5b9e\u9645\u4e0a\uff0c\u5143\u7d20\u5b9a\u4f4d\u7684\u95ee\u9898\u5c31\u8f6c\u6362\u4e3a\uff0c\u5c06\u622a\u56fe\u7684\u5c0f\u56fe\uff08play_btn\uff09\u62ff\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u5927\u56fe\uff08screen\uff09\u4e2d\u53bb\u505a\u5339\u914d\uff0c\u5982\u679c\u5339\u914d\u6210\u529f\uff0c\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff08 x, y \uff09\u5373\u53ef\u3002 \u4e3a\u4e86\u65b9\u4fbf\u63cf\u8ff0\uff0c\u4ee5\u4e0b\u6211\u5c06\u6574\u4e2a\u5c4f\u5e55\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5927\u56fe\uff0c\u67d0\u4e2a\u5143\u7d20\u56fe\u7247\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5c0f\u56fe\u3002 \u57fa\u4e8e OpenCV \u7684\u6a21\u677f\u5339\u914d cv.matchTemplate() \u529f\u80fd\uff0c\u6211\u4eec\u5b9e\u73b0\u4e86\u56fe\u50cf\u5b9a\u4f4d\u7684\u529f\u80fd\uff0c\u6846\u67b6\u63d0\u4f9b\u4e86\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u5e95\u5c42\u63a5\u53e3\uff08\u4e00\u822c\u4e0d\u5bf9\u4e0a\u5c42\u63d0\u4f9b\u8c03\u7528\uff09\uff1a def _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\n# \u8be6\u7ec6\u4ee3\u7801\u592a\u957f\u4e0d\u8d34\u4e86\uff0c\u611f\u5174\u8da3\u8bf7\u67e5\u770b\u6e90\u7801\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001image_path image_path \u662f\u5c0f\u56fe\u7684\u7edd\u5bf9\u8def\u5f84; \u901a\u5e38\u5728 AT \u5de5\u7a0b\u91cc\u9762\uff0c\u6211\u4eec\u7ea6\u5b9a\u5c06\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u5b9e\u9645\u7684\u5143\u7d20\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1aplay_btn.png \uff1b \u7528\u4e8e\u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 case/assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1amusic_001.png \uff1b \u8fd9\u6837\u662f\u4e3a\u4e86\u65b9\u4fbf\u7ba1\u7406\u548c\u7ef4\u62a4\u3002 2\u3001rate \u56fe\u50cf\u8bc6\u522b\u7684\u7684\u5339\u914d\u5ea6\u6216\u8005\u8bf4\u76f8\u4f3c\u5ea6\uff0c\u6846\u67b6\u9ed8\u8ba4\u7684\u914d\u7f6e\u4e3a 0.9\uff0c\u4e5f\u5c31\u662f\u8bf4\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u5b58\u5728\u4e00\u4e2a\u76f8\u4f3c\u5ea6 90% \u7684\u56fe\u6807\u5373\u8fd4\u56de\u5176\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff1b \u5982\u679c\u4f60\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u8c03\u6574\u8bc6\u522b\u5ea6\uff0c\u4f60\u53ef\u4ee5\u5728\u8c03\u7528\u51fd\u6570\u7684\u65f6\u5019\uff0c\u4f20\u5165\u4e0d\u540c\u7684\u8bc6\u522b\u5ea6\u7684\u503c\u3002 3\u3001multiple \u9ed8\u8ba4\u60c5\u51b5\u4e0b multiple=False\uff0c\u8868\u793a\u53ea\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u7b2c\u4e00\u4e2a\uff0c\u5982\u679c multiple=True \u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\uff0c\u56e0\u4e3a\u5927\u56fe\u4e2d\u53ef\u80fd\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u5c0f\u56fe\uff0c\u5728\u67d0\u4e9b\u573a\u666f\u4e0b\u4f60\u53ef\u80fd\u9700\u8981\u5168\u90e8\u83b7\u53d6\u5230\u6240\u6709\u5339\u914d\u5230\u7684\u5750\u6807\u3002 4\u3001picture_abspath \u9ed8\u8ba4\u60c5\u51b5\u4e0b picture_abspath=None \u8868\u793a\u5927\u56fe\u4e3a\u622a\u53d6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u5982\u679c\u4f60\u4e0d\u5e0c\u671b\u5927\u56fe\u662f\u5c4f\u5e55\u7684\u622a\u56fe\uff0c\u800c\u662f\u4f60\u81ea\u5b9a\u4e49\u4f20\u5165\u7684\u67d0\u4e2a\u56fe\u7247\uff0c\u4f60\u53ea\u9700\u8981\u5c06\u4f60\u7684\u56fe\u7247\u8def\u5f84\u4f20\u9012\u7ed9\u8fd9\u4e2a\u53c2\u6570\u5c31\u884c\uff0c\u6bd4\u5982\uff1a picture_abspath=\"~/Desktop/big.png\" \uff1b 5\u3001screen_bbox \u5927\u56fe\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u622a\u53d6\u6574\u4e2a\u5c4f\u5e55\uff0cscreen_bbox = [x, y, w, h] \u53ef\u4ee5\u6307\u5b9a\u622a\u53d6\u5c4f\u5e55\u4e2d\u7684\u56fa\u5b9a\u533a\u57df\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\uff0c\u53ef\u4ee5\u6392\u9664\u90e8\u5206\u533a\u57df\u5bf9\u8bc6\u522b\u7ed3\u679c\u7684\u5f71\u54cd\u3002 \u3010\u9690\u5f0f\u7b49\u5f85\u3011 \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\uff0c\u6709\u65f6\u5019\u9875\u9762\u8df3\u8f6c\u6709\u5ef6\u65f6\uff0c\u6709\u53ef\u80fd\u5b58\u5728\u8bc6\u522b\u7684\u90a3\u4e00\u523b\u9875\u9762\u4e5f\u6ca1\u6709\u8df3\u8f6c\u51fa\u6765\uff0c\u6216\u8005\u6216\u8005\u8bc6\u522b\u7684\u90a3\u4e00\u523b\uff1b \u56e0\u6b64\u6211\u4eec\u9700\u8981\u4e00\u79cd\u7b49\u5f85\u673a\u5236\uff0c\u5373\u5728\u4e00\u5b9a\u7684\u65f6\u95f4\u5185\uff0c\u5982\u679c\u8bc6\u522b\u4e0d\u5230\uff0c\u91cd\u590d\u53bb\u8bc6\u522b\uff1a def find_image(\ncls,\n*widget, rate: [float, int] = None,\nmultiple: bool = False,\nmatch_number: int = None,\npicture_abspath: str = None,\nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u5728\u5c4f\u5e55\u4e2d\u533a\u5bfb\u627e\u5c0f\u56fe\uff0c\u8fd4\u56de\u5750\u6807\uff0c\n \u5982\u679c\u627e\u4e0d\u5230\uff0c\u6839\u636e\u914d\u7f6e\u91cd\u8bd5\u6b21\u6570\uff0c\u6bcf\u6b21\u95f4\u96941\u79d2\n :param widget: \u6a21\u677f\u56fe\u7247\u8def\u5f84\n :param rate: \u76f8\u4f3c\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param match_number: \u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\n :return: \u5750\u6807\u5143\u7ec4\n \"\"\"\nif rate is None:\nrate = float(GlobalConfig.IMAGE_RATE)\ntry:\nfor element in widget:\nfor _ in range((match_number or int(GlobalConfig.IMAGE_MATCH_NUMBER)) + 1):\nlocate = cls._match_image_by_opencv(\nelement,\nrate,\nmultiple=multiple,\npicture_abspath=picture_abspath,\nscreen_bbox=screen_bbox\n)\nif not locate:\nsleep(int(GlobalConfig.IMAGE_MATCH_WAIT_TIME))\nelse:\nreturn locate\nraise TemplateElementNotFound(*widget)\nexcept Exception as e:\nraise e\n \u53c2\u6570 match_number \u7528\u4e8e\u63a7\u5236\u91cd\u590d\u8bc6\u522b\u7684\u6b21\u6570\uff0c\u9ed8\u8ba4\u4e0d\u4f20\u53c2\uff0c\u53d6\u5168\u5c40\u914d\u7f6e setting/globalconfig.ini \u91cc\u9762\u7684 IMAGE_MATCH_NUMBER \u914d\u7f6e\u9879\u7684\u503c\uff0c\u9ed8\u8ba4IMAGE_MATCH_NUMBER = 1\uff0c\u5373\u91cd\u8bd5 1 \u6b21\uff1b find_image \u662f\u6846\u67b6\u63d0\u4f9b\u7684\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u51fd\u6570\u63a5\u53e3\uff0c\u8fd9\u4e2a\u51fd\u6570\u63d0\u4f9b\u4e86\u9690\u5f0f\u7b49\u5f85\u7684\u529f\u80fd\uff0c\u4e14\u5305\u542b\u4e0a\u9762\u4ecb\u7ecd\u7684 _match_image_by_opencv \u51fd\u6570\u7684\u6240\u6709\u529f\u80fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2","title":"2\u3001\u6c14\u6ce1\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u6c14\u6ce1\u8bc6\u522b\u6307\u7684\u662f\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\u8981\u5b9a\u4f4d\u7684\u5143\u7d20\u662f\u4e00\u4e9b\u4f1a\u6d88\u5931\u7684\u5c0f\u5f39\u7a97\uff0c\u8fd9\u7c7b\u573a\u666f\u5728\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\u5c31\u53ef\u80fd\u5b58\u5728\u4e0d\u7a33\u5b9a\u6027\uff0c\u6709\u53ef\u80fd\u56fe\u50cf\u8bc6\u522b\u7684\u65f6\u5019\u6c14\u6ce1\u5df2\u7ecf\u6d88\u5931\u4e86\uff0c\u4e5f\u6709\u53ef\u80fd\u6c14\u6ce1\u51fa\u73b0\u7684\u65f6\u95f4\u592a\u77ed\u4e86\uff0c\u4e0d\u5bb9\u6613\u6355\u6349\u5230\uff0c\u5c31\u50cf\u6c14\u6ce1\u4e00\u6837\uff0c\u51fa\u73b0\u4e00\u4e0b\u5c31\u6d88\u5931\uff0c\u56e0\u6b64\u6211\u4eec\u5f62\u8c61\u7684\u79f0\u4e4b\u4e3a \u201c\u6c14\u6ce1\u8bc6\u522b\u201d\uff1b \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u4e3a\u4e86\u80fd\u7a33\u5b9a\u7684\u8bc6\u522b\u6c14\u6ce1\u7c7b\u573a\u666f\uff0c\u6211\u4eec\u91c7\u7528\u7684\u65b9\u6848\u662f\uff1a \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\uff08\u5305\u542b\u6c14\u6ce1\u4ece\u51fa\u73b0\u5230\u6d88\u5931\uff09\uff0c\u4e0d\u505c\u7684\u622a\u53d6\u8fd9\u6bb5\u65f6\u95f4\u5185\u7684\u5927\u56fe\uff0c\u4ee5\u6b64\u786e\u4fdd\u5728\u622a\u53d6\u7684\u4e00\u5806\u56fe\u7247\u4e2d\uff0c\u80af\u5b9a\u6709\u81f3\u5c11\u4e00\u5f20\u56fe\u7247\u80fd\u6355\u6349\u5230\u6c14\u6ce1\uff0c\u6700\u540e\u518d\u5bf9\u8fd9\u4e00\u5806\u56fe\u7247\u9010\u4e2a\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def get_during(\ncls,\nimage_path: str,\nscreen_time: [float, int],\nrate: float = None,\npause: [int, float] = None,\nmax_range: int = 10000\n):\n\"\"\"\n \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u622a\u56fe\u591a\u5f20\u56fe\u7247\u8fdb\u884c\u8bc6\u522b\uff0c\u5176\u4e2d\u6709\u4e00\u5f20\u56fe\u7247\u8bc6\u522b\u6210\u529f\u5373\u8fd4\u56de\u7ed3\u679c;\n \u9002\u7528\u4e8e\u6c14\u6ce1\u7c7b\u7684\u65ad\u8a00\uff0c\u6bd4\u5982\u6c14\u6ce1\u57281\u79d2\u5185\u6d88\u5931\uff0c\u5982\u679c\u7528\u5e38\u89c4\u7684\u56fe\u50cf\u8bc6\u522b\u5219\u6709\u53ef\u80fd\u65e0\u6cd5\u8bc6\u522b\u5230\uff1b\n :param image_path: \u8981\u8bc6\u522b\u7684\u6a21\u677f\u56fe\u7247\uff1b\n :param screen_time: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff1b\n :param rate: \u8bc6\u522b\u7387\uff1b\n :param pause: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u4e0d\u95f4\u9694\uff1b\n :param max_range: \u622a\u56fe\u7684\u6700\u5927\u6b21\u6570\uff0c\u8fd9\u662f\u4e00\u4e2a\u9884\u8bbe\u503c\uff0c\u4e00\u822c\u60c5\u51b5\u4e0b\u4e0d\u6d89\u53ca\u4fee\u6539\uff1b\n \"\"\"\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001screen_time \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5728\u6b64\u65f6\u95f4\u5185\u4f1a\u4e0d\u65ad\u7684\u8fdb\u884c\u622a\u56fe\u64cd\u4f5c\uff0c\u5c31\u50cf\u5f55\u5236\u89c6\u9891\u4e00\u6837\uff1b 2\u3001pause \u6bcf\u6b21\u622a\u53d6\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u4e00\u523b\u4e0d\u505c\u7684\u622a\u56fe\uff0c\u5982\u679c\u4f60\u60f3\u6bcf\u6b21\u622a\u56fe\u5b58\u5728\u4e00\u4e9b\u95f4\u9694\u65f6\u95f4\u4f20\u5165\u5bf9\u5e94\u7684\u65f6\u95f4\u95f4\u9694\u5373\u53ef\uff0c\u5355\u4f4d\u662f\u79d2\uff0c\u6bd4\u5982\uff1apause = 0.03\uff0c\u8868\u793a 30 ms\uff0c\u76f8\u5f53\u4e8e\u5e27\u7387\u4e3a 30 \u5e27\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-opencv","title":"3\u3001\u4e0d\u4f9d\u8d56 OpenCV \u7684\u56fe\u50cf\u8bc6\u522b\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31","title":"3.1\u3001\u81ea\u7814\u56fe\u50cf\u8bc6\u522b\u6280\u672f","text":"\u3010\u539f\u7406\u3011 \u4e3a\u4e86\u5b9e\u73b0\u8bc6\u522b\u56fe\u50cf\u7684\u76ee\u7684\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u5c06\u56fe\u7247\u7684\u6bcf\u4e2a\u50cf\u7d20\u7684RGB\u503c\uff0c\u4e0e\u6574\u4e2a\u5c4f\u5e55\u4e2d\u7684RGB\u8fdb\u884c\u5bf9\u6bd4\uff0c\u5982\u679c\u5c0f\u56fe\u4e0a\u7684RGB\u503c\u4e0e\u5bf9\u5e94\u5927\u56fe\u4f4d\u7f6e\u7684RGB\u90fd\u76f8\u7b49\uff0c\u5219\u5339\u914d\u6210\u529f\uff0c\u5373\u53ef\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u70b9\u3002 1\u3001\u8bfb\u53d6\u5c0f\u56fe\u548c\u5927\u56fe\u7684RGB\u503c \uff081\uff09\u5c0f\u56fe\u7684RGB\u503c small_data = small_pic.load() # load()\u4f1a\u5c06\u56fe\u7247\u7684RGB\u503c\u83b7\u53d6\u5230\uff0c\u6570\u636e\u683c\u5f0f\u4e3a\u4e00\u4e2a\u4e8c\u7ef4\u5217\u8868\uff0c\u8d4b\u503c\u7ed9\u4e00\u4e2a\u53d8\u91cfsmall_data\u3002\n \uff082\uff09\u5927\u56fe\u7684RGB\u503c big_data = big_pic.load()\n 2\u3001\u5c06\u5c0f\u56fe\u4e0e\u5927\u56fe\u7684RGB\u503c\u8fdb\u884c\u5339\u914d \uff081\uff09\u5339\u914d\u4ece\u5927\u56fe\u7684\u5750\u6807\uff080\uff0c0\uff09\u5f00\u59cb\u5339\u914d\uff0c\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff082\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\uff080\uff0c0\uff09\u5bf9\u5e94\u7684\u6240\u6709\u5c0f\u56fe\u7684RGB\u503c\u4e0d\u76f8\u7b49\uff0c\u5219\u79fb\u52a8\u5230\u4e0b\u4e00\u4e2a\u5750\u6807\u70b9\uff081\uff0c0\uff09\uff0c\u540c\u6837\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff083\uff09\u6309\u7167\u8fd9\u6837\u7684\u89c4\u5f8b\u5c06\u8fd9\u4e00\u884c\u6bcf\u79fb\u52a8\u4e00\u4e2a\u5750\u6807\u70b9\uff0c\u90fd\u5c06\u5c0f\u56fe\u6240\u6709\u7684RGB\u4e0e\u5bf9\u5e94\u5927\u56fe\u7684\u503c\u8fdb\u884c\u5339\u914d\uff1b \uff084\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\u5176\u4e2d\u4e00\u4e2a\u5750\u6807\u70b9\u4e0a\u5339\u914d\u5230\u4e86\u5c0f\u56fe\u7684\u6240\u6709RGB\u503c\uff0c\u5219\u6b64\u65f6\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\u70b9\uff1b \uff085\uff09\u5982\u679c\u5339\u914d\u4e86\u5927\u56fe\u6240\u6709\u7684\u5750\u6807\u70b9\uff0c\u90fd\u6ca1\u6709\u5339\u914d\u5230\uff0c\u5219\u8bf4\u660e\u5927\u56fe\u4e2d\u4e0d\u5b58\u5728\u5c0f\u56fe\uff0c\u5339\u914d\u5931\u8d25\uff1b \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 class ImageRgb:\n@staticmethod\ndef _check_match(_x, _y, small, bdata, sdata, rate):\n\"\"\"\n Matching degree of small graph and large graph matching\n \"\"\"\n@staticmethod\ndef _pre_random_point(small):\n\"\"\"\n Pre matching, take 10-20 points at random each time,\n and take coordinates randomly in the small graph\n \"\"\"\n@staticmethod\ndef _pre_random_match(_x, _y, point_list, bdata, sdata, rate):\n\"\"\"\n In the small graph, several points are randomly\n selected for matching, and the matching degree is\n also set for the random points\n \"\"\"\n@classmethod\ndef match_image_by_rgb(cls, image_name=None, image_path=None, rate=0.9):\n\"\"\"\n By comparing the RGB values of the small image with the large\n image on the screen, the coordinates of the small image on\n the screen are returned.\n \"\"\"\n \u901a\u8fc7 match_image_by_rgb() \u8fd9\u4e2a\u51fd\u6570\uff0c\u4f20\u5165\u76ee\u6807\u5c0f\u56fe\u7684\u6587\u4ef6\u540d\u79f0\uff0c\u5373\u53ef\u8fd4\u56de\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u3002 \u6709\u540c\u5b66\u8981\u95ee\u4e86\uff0c\u6709 OpenCV \u5e72\u561b\u4e0d\u7528\uff0c\u6709\u5fc5\u8981\u81ea\u5df1\u5b9e\u73b0\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u529f\u80fd\u5417\uff0c\u4f60\u4eec\u662f\u4e0d\u662f\u95f2\u7684\u554a\uff1f \u8fd9\u4e48\u95ee\u7684\u8bdd\uff0c\u5c0f\u4e86\uff0c\u683c\u5c40\u5c0f\u4e86\uff1b\u6211\u4eec\u81ea\u5df1\u5b9e\u73b0\u4e3b\u8981\u6709\u51e0\u65b9\u9762\u539f\u56e0\uff1a \u51cf\u5c11\u73af\u5883\u4f9d\u8d56\uff0c\u5373\u4e0d\u7528\u5b89\u88c5 OpenCV\uff0c\u6211\u4eec\u4e5f\u80fd\u5b9e\u73b0\u5176\u529f\u80fd\uff0c\u73af\u5883\u4f9d\u8d56\u8fd9\u5757\u540e\u9762\u4f1a\u5355\u72ec\u8be6\u7ec6\u8bb2\uff0c\u51cf\u5c11\u73af\u5883\u4f9d\u8d56\u5bf9\u4e8e\u4efb\u4f55\u8f6f\u4ef6\u5de5\u7a0b\u90fd\u975e\u5e38\u91cd\u8981\uff1b OpenCV \u5728\u5176\u4ed6\u56fd\u4ea7 CPU \u67b6\u6784\u4e0a\u5b89\u88c5\u5e76\u4e0d\u80fd\u4fdd\u8bc1100%\u6210\u529f\uff0c\u751a\u81f3\u6709\u6ca1\u6709\u53ef\u80fd\u5728\u4e00\u4e9b\u67b6\u6784\u4e0a\u538b\u6839\u513f\u5c31\u4e0d\u80fd\u5b89\u88c5\u4f7f\u7528 OpenCV \uff1f \u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 OpenCV \uff1f\u5c31\u50cf\u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 Windows \u5462\uff1f\u8fd9\u4e9b\u95ee\u9898\u503c\u5f97\u601d\u8003\u3002 \u5f53\u7136\uff0c\u6211\u4eec\u627f\u8ba4\u8fd9\u5957\u65b9\u6848\uff0c\u867d\u7136\u8bc6\u522b\u51c6\u786e\u7387\u6ca1\u95ee\u9898\uff0c\u4f46\u5728\u8bc6\u522b\u6548\u7387\u4e0a\u8fd8\u6ca1\u6709\u8fbe\u5230 OpenCV \u6a21\u677f\u5339\u914d\u7684\u6548\u679c\uff0c\u6211\u4eec\u7684\u65b9\u6848\u6bcf\u6b21\u8bc6\u522b\u5728 1.5s \u5de6\u53f3\uff0c\u800c OpenCV \u5728 1s \u5de6\u53f3\uff1b \u6574\u4f53\u8bc6\u522b\u6548\u679c\u6765\u8bb2\uff0c\u6211\u8ba4\u4e3a\u8fd8\u662f\u53ef\u4ee5\u63a5\u53d7\u7684\uff0c\u4e5f\u5e0c\u671b\u6709\u5fd7\u4e4b\u58eb\u80fd\u4e00\u8d77\u4f18\u5316\u6b64\u65b9\u6848\uff0c\u4e00\u8d77\u6280\u672f\u62a5\u56fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32-rpc","title":"3.2\u3001\u57fa\u4e8e RPC \u670d\u52a1\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b","text":"\u5728\u8fdc\u7a0b\u670d\u52a1\u5668\u4e0a\u90e8\u7f72 OpenCV \u7684\u73af\u5883\uff0c\u5e76\u5c06\u5176\u90e8\u7f72\u4e3a RPC \u670d\u52a1\uff0c\u6d4b\u8bd5\u673a\u4e0a\u4e0d\u7528\u5b89\u88c5 OpenCV \u4f9d\u8d56\uff0c\u800c\u662f\u901a\u8fc7\u8bf7\u6c42 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u3010\u539f\u7406\u3011 \u6d4b\u8bd5\u673a\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u56fe\u7247\u4ee5\u53ca\u6a21\u677f\u56fe\u7247\uff0c\u53d1\u9001\u7ed9 RPC \u670d\u52a1\u7aef\uff0c\u670d\u52a1\u7aef\u62ff\u5230\u4e24\u5f20\u56fe\u7247\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u6700\u540e\u5c06\u8bc6\u522b\u7ed3\u679c\u8fd4\u56de\u7ed9\u6d4b\u8bd5\u673a\uff1b \u8981\u7279\u6b8a\u8bf4\u660e\u7684\u662f\uff1a RPC \u662f\u4e00\u79cd\u534f\u8bae\uff0c\u8bb8\u591a\u8bed\u8a00\u90fd\u662f\u652f\u6301\u7684\uff0c\u6bd4\u5982\u8bf4\u670d\u52a1\u7aef\u4e5f\u53ef\u4ee5\u7528 C++ \u6765\u5b9e\u73b0\uff0c\u5ba2\u6237\u7aef\u4f7f\u7528 Python \u4e5f\u662f\u53ef\u4ee5\u8c03\u7528\u7684\u3002 \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 \u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nimport cv2 as cv\nimport numpy as np\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\nif __name__ == \"__main__\":\nserver = ThreadXMLRPCServer((\"x.x.x.x\", 8889), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(match_image_by_opencv, \"match_image_by_opencv\")\nserver.serve_forever()\n \u8fd9\u6837\uff0c\u6211\u4eec\u57fa\u4e8e Python \u6807\u51c6\u5e93 xmlrpc \u642d\u5efa\u4e86\u4e00\u4e2a RPC \u670d\u52a1\u5668\uff0c\u6ce8\u518c\u4e86 image_put \u548c match_image_by_opencv \u4e24\u4e2a\u529f\u80fd\u63a5\u53e3\uff0c\u5728\u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u901a\u8fc7 IP \u548c\u7aef\u53e3\u8fdb\u884c RPC \u8bf7\u6c42\uff1b \u5ba2\u6237\u7aef\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from xmlrpc.client import Binary\nfrom xmlrpc.client import ServerProxy\nserver = ServerProxy(GlobalConfig.OPENCV_SERVER_HOST, allow_none=True)\nscreen_rb = open(screen, \"rb\")\ntemplate_rb = open(template_path, \"rb\")\ntry:\nscreen_path = server.image_put(Binary(screen_rb.read()))\nscreen_rb.close()\ntpl_path = server.image_put(Binary(template_rb.read()))\ntemplate_rb.close()\nreturn server.match_image_by_opencv(\ntpl_path, screen_path, rate, multiple\n)\nexcept OSError as exc:\nraise EnvironmentError(\nf\"RPC\u670d\u52a1\u5668\u94fe\u63a5\u5931\u8d25. {GlobalConfig.OPENCV_SERVER_HOST}\"\n) from exc\n \u901a\u8fc7\u8fd4\u56de server.match_image_by_opencv \u5c31\u83b7\u53d6\u4e86\u5728\u670d\u52a1\u7aef\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4","title":"4\u3001\u53f3\u952e\u83dc\u5355\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41","title":"4.1\u3001\u53f3\u952e\u83dc\u5355\u5b9a\u4f4d\u7684\u65b9\u6848\u53ca\u95ee\u9898","text":"\u53f3\u952e\u83dc\u5355\u7684\u5143\u7d20\u5b9a\u4f4d\u662f\u4e00\u4e2a\u96be\u70b9\uff0c\u8fc7\u53bb\u6211\u4eec\u8c03\u7814\u548c\u4f7f\u7528\u8fc7\u7684\u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u65b9\u6cd5\u6709 4 \u79cd\uff1a \u7b2c\u4e00\u79cd\uff1a\u6b65\u957f\u64cd\u4f5c\u6cd5 \u5728\u53f3\u952e\u83dc\u5355\u547c\u51fa\u6765\u4e4b\u540e\uff0c\u901a\u8fc7\u952e\u76d8\u7684 up\u3001down \u6309\u952e\uff0c\u8fdb\u884c\u9009\u62e9\u83dc\u5355\u9009\u62e9\uff0c\u9009\u4e2d\u76ee\u6807\u4e4b\u540e enter \u5373\u53ef\uff1b\u6bd4\u5982\uff1a\u5728\u684c\u9762\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\uff0c\u6309 1 \u6b21 down \uff0c\u4f1a\u51fa\u73b0\u4e0b\u56fe\uff1a \u7ee7\u7eed\u518d\u6309 2 \u6b21 down\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u518d\u6309 enter\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u5982\u6b64\uff0c\u201c\u6392\u5e8f\u65b9\u5f0f\u201d\u7684\u6b65\u957f\u4e3a 3\uff1b\u901a\u8fc7\u4f7f\u7528\u952e\u76d8\u4e0a\u4e0b\u952e\uff0c\u5c31\u5b9e\u73b0\u4e86\u5bf9\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\uff1b \u4f46\u662f\uff0c\u8fd9\u79cd\u65b9\u5f0f\u6709\u4e2a\u5f88\u70e6\u4eba\u7684\u95ee\u9898\uff0c\u5c31\u662f\u53f3\u952e\u83dc\u5355\u7684\u9009\u9879\u4f4d\u7f6e\u4e0d\u53ef\u80fd\u4e00\u76f4\u4e0d\u53d8\uff0c\u5728\u9700\u6c42\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\uff0c\u83dc\u5355\u9009\u9879\u7684\u53d8\u5316\u662f\u5f88\u5927\u7684\uff0c\u751a\u81f3\u6709\u4e9b\u5e94\u7528\u652f\u6301\u81ea\u5b9a\u4e49\u83dc\u5355\uff0c\u6bd4\u5982\u6587\u7ba1\u53f3\u952e\u83dc\u5355\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff1b \u4e5f\u5c31\u662f\u8bf4\u4f60\u5f97\u7ecf\u5e38\u53bb\u7ef4\u62a4\u83dc\u5355\u9009\u9879\u7684\u6b65\u957f\uff0c\u4e00\u4e2a\u9009\u9879\u73b0\u5728\u7684\u6b65\u957f\u662f 3\uff0c\u4e0b\u4e2a\u8fed\u4ee3\u53ef\u80fd\u5c31\u662f 4 \u6216\u8005 5\u3002 \u7b2c\u4e8c\u79cd\uff1a\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u6cd5 \u628a\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5355\u72ec\u622a\u56fe\u4fdd\u5b58\uff0c\u56fe\u7247\u4e2d\u4ec5\u5305\u542b\u4e00\u4e2a\u83dc\u5355\u9009\u9879\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u8fd9\u6837\uff0c\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5c31\u53ef\u4ee5\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u65b9\u5f0f\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u8fd9\u79cd\u65b9\u5f0f\u4e0d\u7528\u62c5\u5fc3\u83dc\u5355\u9009\u9879\u7684\u987a\u5e8f\u6216\u4f4d\u7f6e\uff0c\u4f46\u662f\u9700\u8981\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff0c\u4e14\u5bb9\u6613\u53d7\u5230\u5b57\u4f53 UI \u53d8\u66f4\u7c7b\u9700\u6c42\u7684\u5f71\u54cd\uff0c\u6bd4\u5982\uff1a\u5b57\u4f53\u5927\u5c0f\u3001\u5b57\u4f53\u95f4\u8ddd\u7b49\u7b49\u9700\u6c42\u53d8\u66f4\u90fd\u4f1a\u5f71\u54cd\uff0c\u6bcf\u6b21\u53d8\u66f4\u4e4b\u540e\u5c31\u9700\u8981\u8fdb\u884c\u5927\u91cf\u56fe\u7247\u8d44\u6e90\u7684\u91cd\u65b0\u622a\u56fe\u66ff\u6362\uff0c\u662f\u4e2a\u6bd4\u8f83\u9ebb\u70e6\u7684\u4e8b\u60c5\uff1b \u7b2c\u4e09\u79cd\uff1a\u76f8\u5bf9\u4f4d\u79fb\u6cd5 \u9f20\u6807\u70b9\u51fb\u53f3\u952e\u7684\u65f6\u5019\uff0c\u9f20\u6807\u7684\u5f53\u524d\u5750\u6807\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u7684\uff0c\u83dc\u5355\u9009\u9879\u7684\u5bbd\uff08 w \uff09\u4e00\u822c\u662f\u56fa\u5b9a\u7684\uff0c\u53d8\u5316\u7684\u662f\u83dc\u5355\u7684\u957f\u5ea6\uff08 h \uff09\uff0c\u53ef\u4ee5\u901a\u8fc7\u67d0\u4e2a\u9009\u9879\u76f8\u5bf9\u4e8e\u9f20\u6807\u7684\u8ddd\u79bb\u5728\u786e\u5b9a\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u901a\u8fc7\u7ef4\u62a4\u83dc\u5355\u9009\u9879\uff08\u76f8\u5bf9\u4f4d\u7f6e\uff09\u76f8\u5bf9\u4e8e\u9f20\u6807\u4f4d\u7f6e\u7684\u8ddd\u79bb\uff0c\u5373\u53ef\u8f7b\u677e\u8ba1\u7b97\u51fa\u83dc\u5355\u9009\u9879\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\u3002 \u4ece\u7406\u8bba\u4e0a\u6b64\u65b9\u6848\u662f\u53ef\u884c\u7684\uff0c\u4f46\u662f\u8fd9\u91cc\u4ecd\u7136\u5b58\u5728\u4e24\u4e2a\u4e25\u91cd\u7684\u95ee\u9898\uff1a \u83dc\u5355\u987a\u5e8f\u6539\u53d8\uff0c\u5bfc\u81f4\u76f8\u5bf9\u8ddd\u79bb\u6539\u53d8\uff0c\u800c\u4e14\u8ddd\u79bb\u662f\u901a\u8fc7\u50cf\u7d20\uff08px\uff09\u6765\u8868\u793a\u7684\uff0c\u4e0d\u60f3\u6b65\u957f\u90a3\u4e48\u53ea\u7ba1\uff0c\u6bcf\u6b21\u9700\u8981\u53bb\u91cf\u4e00\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u70b9\u9ebb\u70e6\uff1b \u9f20\u6807\u5728\u684c\u9762\u4e0d\u540c\u4f4d\u7f6e\u70b9\u51fb\u53f3\u952e\uff0c\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u4f4d\u7f6e\u662f\u4e0d\u540c\u7684\uff0c\u4e0a\u56fe\u7684\u83dc\u5355\u662f\u5728\u9f20\u6807\u7684\u5de6\u4e0b\u65b9\uff0c\u5982\u679c\u4f60\u79fb\u52a8\u9f20\u6807\u5230\u5c4f\u5e55\u56db\u8fb9\uff0c\u4f60\u4f1a\u53d1\u73b0\uff0c\u53f3\u952e\u83dc\u5355\u53ef\u80fd\u51fa\u73b0\u5728\u9f20\u6807\u7684\u56db\u4e2a\u65b9\u5411\uff0c\u4e5f\u5c31\u662f\u8bf4\u4f60\u9700\u8981\u6839\u636e\u9f20\u6807\u7684\u4e0d\u540c\u4f4d\u7f6e\u6765\u5224\u65ad\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u65b9\u5411\uff0c\u800c\u4e0d\u540c\u7684\u65b9\u5411\u4e0a\u8ba1\u7b97\u65b9\u6cd5\u662f\u4e0d\u540c\u7684\uff0c\u6bd4\u5982\uff1a\u53f3\u952e\u83dc\u5355\u5728\u9f20\u6807\u7684\u5de6\u4e0a\uff0c\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\u8ba1\u7b97\u65b9\u6cd5\u4e3a\uff08x - w / 2\uff0c y - h\uff09\uff0c\u8fd9\u6837\u7ef4\u62a4\u8d77\u6765\u53ef\u4ee5\u8bf4\u975e\u5e38\u590d\u6742\uff1b \u57fa\u4e8e\u4ee5\u4e0a\u4e24\u4e2a\u539f\u56e0\uff0c\u6211\u4eec\u5e76\u4e0d\u63a8\u8350\u8fd9\u79cd\u64cd\u4f5c\u65b9\u6848\u3002 \u7b2c\u56db\u79cd\uff1a\u5c5e\u6027\u5b9a\u4f4d \u6709\u540c\u5b66\u8bf4\u5e72\u561b\u4e0d\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u5462\uff0c\u5176\u5b9e\uff0c\u6211\u4eec\u6700\u5f00\u59cb\u60f3\u5230\u7684\u65b9\u6848\u5c31\u662f\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\uff0c\u4f46\u662f\u5728\u5c5e\u6027\u7684 DOM \u6811\u91cc\u600e\u4e48\u4e5f\u627e\u4e0d\u5230\uff0c\u65e0\u6cd5\u5b9a\u4f4d\u5230\uff0c\u6211\u4eec\u4e5f\u8054\u5408\u7814\u53d1\u540c\u5b66\u4e00\u8d77\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u4f46\u6700\u7ec8\u8fd8\u662f\u6ca1\u80fd\u89e3\u51b3\uff0c\u975e\u5e38\u9057\u61be\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42","title":"4.2\u3001\u6700\u65b0\u7684\u53f3\u952e\u83dc\u5355\u7ec8\u6781\u89e3\u51b3\u65b9\u6848","text":"\u7531\u4e8e\u53f3\u952e\u83dc\u5355\u9009\u9879\u51e0\u4e4e\u90fd\u662f\u6587\u672c\uff0c\u90a3\u4e48\u901a\u8fc7 OCR \u8bc6\u522b\uff0c\u51e0\u4e4e\u662f\u6700\u4f18\u7684\u65b9\u6848\uff1a \u4e0d\u7528\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff1b \u4e0d\u4f1a\u53d7\u5230\u83dc\u5355\u9009\u9879\u987a\u5e8f\u6539\u53d8\u7684\u5f71\u54cd\uff1b \u4e0d\u4f1a\u53d7\u5230\u5b57\u4f53 UI \u53d8\u5316\u7684\u5f71\u54cd\uff1b \u5173\u4e8e OCR \u8bc6\u522b\u6211\u4eec\u5728\u540e\u9762\u4f1a\u8be6\u7ec6\u8bb2\u5230\uff0c\u672c\u7ae0\u8282\u4e3b\u8981\u8bb2\u57fa\u4e8e OCR \u8bc6\u522b\uff0c\u6211\u4eec\u5728\u53f3\u952e\u83dc\u5355\u8bc6\u522b\u4e0a\u7684\u7a81\u7834\u548c\u521b\u65b0\uff1b \u4f7f\u7528 OCR \u8bc6\u522b\u53f3\u952e\u83dc\u5355\u867d\u7136\u5df2\u7ecf\u5f88\u5b8c\u7f8e\u4e86\uff0c\u4f46\u662f\u5728\u4e00\u4e9b\u60c5\u51b5\u4e0b\u4ecd\u7136\u5b58\u5728\u4e00\u70b9\u95ee\u9898\uff0c\u5c31\u662f\u5c4f\u5e55\u4e2d\u51fa\u73b0\u591a\u4e2a\u548c\u83dc\u5355\u9009\u9879\u6587\u5b57\u76f8\u540c\u7684\u6587\u5b57\u65f6\uff0c\u6bd4\u5982\u4e0b\u9762\u8fd9\u79cd\u60c5\u51b5\uff1a \u5c4f\u5e55\u6070\u597d\u51fa\u73b0\u4e86\u4e24\u4e2a\u201c\u590d\u5236\u201d\uff0c\u6b64\u65f6\u8981\u5b9a\u4f4d\u5230\u83dc\u5355\u4e2d\u7684 \u201c\u590d\u5236\u201d\uff0c\u5c31\u9700\u8981\u8fdb\u4e00\u6b65\u505a\u6570\u636e\u5904\u7406\uff0c\u6bd4\u5982\uff1aOCR \u8fd4\u56de 2 \u4e2a\u201c\u590d\u5236\u201d\u7684\u5750\u6807\uff0c\u7528\u4f8b\u91cc\u9762\u6765\u5224\u65ad\u7528\u54ea\u4e2a\uff0c\u4ece\u4e1a\u52a1\u4e0a\u5c06\u5904\u7406\u8d77\u6765\u6bd4\u8f83\u9ebb\u70e6\uff0c\u56e0\u4e3a\u4f60\u5f97\u660e\u786e\u77e5\u9053\u83dc\u5355\u5728\u5de6\u8fb9\u8fd8\u662f\u53f3\u8fb9\uff0c\u7136\u540e\u8fd9\u672c\u8eab\u5c31\u662f\u4e0d\u786e\u5b9a\u7684\uff1b \u600e\u4e48\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u5462\uff0c\u8fd9\u5c31\u8981\u8bf4\u9053\u672c\u7ae0\u7684\u4e3b\u9898\uff1a\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b\u3002 \u3010\u539f\u7406\u3011 \u5728\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u524d\u622a\u4e00\u5f20\u56fe\uff0c\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\u518d\u622a\u53d6\u4e00\u5f20\u56fe\uff0c\u4e24\u5f20\u56fe\u552f\u4e00\u53d8\u5316\u7684\u5c31\u662f\u53f3\u952e\u83dc\u5355\uff0c\u5c06\u5176\u4ed6\u76f8\u540c\u7684\u5730\u65b9\u90fd\u5c4f\u853d\u6389\uff0c\u53ea\u7559\u4e0b\u83dc\u5355\u754c\u9762\uff0c\u5982\u6b64\u5373\u53ef\u6d88\u9664\u5e72\u6270\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u5c06\u4e24\u79cd\u56fe\u505a\u524d\u540e\u5bf9\u6bd4\u63d0\u53d6\u53ef\u4ee5\u5f97\u5230\u8fd9\u6837\u7684\u56fe\uff1a \u4f60\u770b\uff0c\u901a\u8fc7\u524d\u540e\u56fe\u7247\u7684\u5bf9\u6bd4\uff0c\u5c06\u76f8\u540c\u7684\u90e8\u5206\u7ed9\u6d88\u9664\u6389\uff0c\u518d\u8fdb\u884c OCR \u8bc6\u522b\uff0c\u8fd9\u6837\u5c31\u4e0d\u4f1a\u6709\u5e72\u6270\u4e86\uff1b \u4ee3\u7801\u5b9e\u73b0\u8bf7\u67e5\u770b src/filter_image.py \uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def filter_image(action):\n\"\"\"\n \u5bf9\u6bd4\u52a8\u4f5c\u524d\u540e\u4e24\u5f20\u56fe\u7247\uff0c\u63d0\u53d6\u4e0d\u540c\u7684\u90e8\u5206\u751f\u6210\u4e00\u5f20\u65b0\u7684\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u65b0\u56fe\u7247\u7684\u8def\u5f84\n :param action: \u52a8\u4f5c\u51fd\u6570\u7684\u51fd\u6570\u5bf9\u8c61\n :return: \u65b0\u56fe\u7247\u7684\u8def\u5f84\n \"\"\"\n action \u662f\u9f20\u6807\u4e8b\u4ef6\uff0c\u56e0\u4e3a\u6b64\u7c7b\u573a\u666f\u4e0d\u4ec5\u4ec5\u5728\u53f3\u952e\u5b58\u5728\uff0c\u5355\u51fb\u3001\u53cc\u51fb\u7b49\u7b49\uff0c\u53ea\u8981\u64cd\u4f5c\u524d\u540e\u540e\u53d8\u5316\u7684\u90fd\u53ef\u4ee5\uff1a from src.mouse_key import MouseKey\naction = (\nMouseKey.click,\nMouseKey.right_click,\nMouseKey.double_click,\nMouseKey.move_to,\n)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5","title":"5\u3001\u52a8\u6001\u56fe\u50cf\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5728\u684c\u9762\u58c1\u7eb8\u5207\u6362\uff0c\u6216\u770b\u56fe\u3001\u76f8\u518c\u5207\u6362\u56fe\u7247\u7c7b\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u7531\u4e8e\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u662f\u4e0d\u56fa\u5b9a\u7684\uff08\u4e0d\u540c\u7248\u672c\u7684\u7cfb\u7edf\u58c1\u7eb8\u4e0d\u540c\u3001\u58c1\u7eb8\u987a\u5e8f\u4e0d\u540c\uff0c\u770b\u56fe\u76f8\u518c\u5728\u56fe\u7247\u8d44\u6e90\u4e0d\u4e00\u5b9a\u56fa\u5b9a\uff09\uff0c\u90a3\u4e48\u5728\u6d4b\u8bd5\u5207\u6362\u58c1\u7eb8\u6216\u8005\u5207\u6362\u56fe\u7247\u7684\u573a\u666f\u65f6\u5c31\u4f1a\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u4f60\u4e0d\u77e5\u9053\u9884\u671f\u662f\u5565\uff0c\u7528\u4f8b\u64cd\u4f5c\u52a8\u6001\u7684\uff0c\u4e5f\u662f\u6781\u4e0d\u7a33\u5b9a\u3002 \u3010\u539f\u7406\u3011 \u5728\u5207\u6362\u56fe\u7247\u4e4b\u524d\u622a\u56fe\u4fdd\u5b58\u5e76\u8fd4\u56de\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u6b21\u8bc6\u522b\u8fd9\u5f20\u56fe\u7247\uff0c\u5982\u679c\u4e0d\u5b58\u5728\uff0c\u8bf4\u660e\u56fe\u7247\u5df2\u7ecf\u5207\u6362\u4e86\uff1b \u793a\u610f\u56fe\uff1a \u8fd9\u6837\uff0c\u6211\u4eec\u622a\u53d6\u4e86\u5f53\u524d\u56fe\u7247\u4e2d\u6bd4\u8f83\u6709\u4ee3\u8868\u6027\u7684\u4f4d\u7f6e\uff08\u4e00\u53ea\u9e1f\uff09\uff0c\u5728\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u7528\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1a \u6211\u4eec\u518d\u62ff\u7740\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd9\u6837\u5728\u5f53\u524d\u56fe\u7247\u4e2d\uff0c\u5c31\u4e0d\u80fd\u627e\u5230\u8fd9\u53ea\u9e1f\u4e86\uff0c\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u662f False\uff0c\u90a3\u4e48\u4e5f\u5c31\u53ef\u4ee5\u5224\u65ad\u56fe\u7247\u5207\u6362\u662f\u6210\u529f\u7684\u3002 \u4ee3\u7801\u793a\u610f\uff1a def save_temporary_picture(_x: int, _y: int, width: int, height: int):\n\"\"\"\n \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u56fe\u7247\u8def\u5f84\n :param x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n :param y: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n :param width: \u5bbd\u5ea6\n :param height: \u9ad8\u5ea6\n :return: \u56fe\u7247\u8def\u5f84\n \"\"\"\n \u6b64\u51fd\u6570\u7528\u4e8e\u5728\u64cd\u4f5c\u4e4b\u524d\u622a\u56fe\u4e00\u5f20\u4e34\u65f6\u56fe\u7247\uff0c\u8fd4\u56de\u56fe\u7247\u8def\u5f84\uff0c\u6700\u540e\u5728\u65ad\u8a00\u7684\u65f6\u5019\u518d\u5c06\u56fe\u7247\u8def\u5f84\u4f5c\u4e3a\u53c2\u6570\u4f20\u5165\u65ad\u8a00\u8bed\u53e5\u5373\u53ef\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ui","title":"\u4e09\u3001\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_1","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u662f\u6211\u4eec\u81ea\u7814\u7684\u4e00\u79cd\u4f7f\u7528\u7b80\u5355\uff0c\u4e14\u6548\u7387\u6781\u9ad8\u3001\u7a33\u5b9a\u6027\u597d\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u57fa\u4e8e\u5143\u7d20\u6309\u94ae\u5728\u5e94\u7528\u4e2d\u7684\u76f8\u5bf9\u4f4d\u7f6e\uff0c\u52a8\u6001\u83b7\u53d6\u5143\u7d20\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff0c\u9002\u7528\u4e8e\u5404\u79cd\u5c4f\u5e55\u5206\u8fa8\u7387\uff08\u5305\u62ec\u9ad8\u5206\u5c4f\u3001\u5bbd\u5c4f\u3001\u5e26\u9c7c\u5c4f\uff09\uff0c\u5f53\u5143\u7d20\u6309\u94ae\u4f4d\u7f6e\u76f8\u5bf9\u4e8e\u5e94\u7528\u754c\u9762\u4f4d\u7f6e\u53d1\u751f\u4fee\u6539\u4e4b\u540e\uff0c\u53ea\u9700\u8981\u6839\u636e UI \u8bbe\u8ba1\u56fe\u4e0a\u7684\u6e90\u6570\u636e\u4fee\u6539\u5bf9\u5e94\u5750\u6807\u6570\u636e\u5c31\u597d\uff0c\u7ef4\u62a4\u975e\u5e38\u7684\u65b9\u4fbf\u3002 \u6b64\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u9002\u7528\u4e8e\u4e00\u4e9b\u5143\u7d20\u4f4d\u7f6e\u76f8\u5bf9\u4e0e\u5e94\u7528\u754c\u9762\u6bd4\u8f83\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u97f3\u4e50\uff0899% \u7684\u5143\u7d20\u5b9a\u4f4d\u91c7\u7528\u8fd9\u79cd\uff0c\u6548\u679c\u975e\u5e38\u597d\uff09\uff0c\u4e0d\u9002\u7528\u4e8e\u754c\u9762\u4e0d\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u622a\u56fe\u5f55\u5c4f\uff0c\u5f88\u660e\u663e\u4e0d\u9002\u7528\u4e8e\u8fd9\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u3002\u8fd9\u79cd\u5168\u65b0\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u6709\u5b83\u7684\u9002\u7528\u6761\u4ef6\uff0c\u5982\u679c\u4f60\u53d1\u73b0\u4f7f\u7528\u5e38\u89c4\u7684\uff08\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u5b9a\u4f4d\uff09\u4e0d\u597d\u505a\u65f6\uff0c\u4e0d\u59a8\u8003\u8651\u4f7f\u7528\u8fd9\u79cd\uff0c\u5176\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff0c\u5e76\u4e14\u8fc5\u901f\u7231\u4e0a\u4ed6\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_1","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5728 UI \u8bbe\u8ba1\u56fe\u4e2d\u6211\u4eec\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u8fb9\u6846\u7684\u8ddd\u79bb\u7684\uff0c\u7136\u540e\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u6280\u672f\u624b\u6bb5\u83b7\u53d6\u5230\u5e94\u7528\u754c\u9762\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u53ca\u5e94\u7528\u7a97\u53e3\u7684\u5927\u5c0f\uff0c\u793a\u610f\u56fe\u5982\u4e0b\uff1a \uff08x1, y1\uff09\u4e3a\u5e94\u7528\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\uff1b\uff08x2, y2\uff09\u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u5de6\u4e0a\u89d2\uff08x1, y1\uff09\u7684\u5750\u6807\uff0c\u90a3\u4e48\u5b9e\u9645\u4e0a\u3010\u64ad\u653e\u6240\u6709\u3011\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\u4e3a\uff1a\uff08 x1 + x2, y1 + y2 \uff09\uff1b \u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5927\u5c0f\uff08w2, h2\uff09\uff0c\u53ef\u4ee5\u4ece UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\uff1b \u5728 UI \u8bbe\u8ba1\u7a3f\u4e0a\u70b9\u51fb\u3010\u64ad\u653e\u6240\u6709\u3011\u56fe\u6807\uff0c\u7136\u540e\u79fb\u52a8\u9f20\u6807\u5c31\u5c31\u53ef\u4ee5\u770b\u5230\u4e0a\u56fe\u7684\u53c2\u8003\u7ebf\u53ca\u6570\u636e\uff1b \u6240\u4ee5\uff0c\u6211\u4eec\u53ef\u4ee5\u8f7b\u677e\u7684\u83b7\u53d6\u5230\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u4e2d\u5fc3\u5750\u6807\u4e3a\uff1a\uff08 x1 + x2 + (w2 / 2), y1 + y2 + ( h2 / 2) \uff09 \u8be6\u7ec6\u6e90\u4ee3\u7801\u8bf7\u67e5\u770b AT \u57fa\u7840\u6846\u67b6: src/button_center.py \u83b7\u53d6\u5e94\u7528\u7a97\u53e3\u7684\u4fe1\u606f \u4f7f\u7528 xdotool \u548c xwininfo \u83b7\u53d6\u5230\u5e94\u7528\u7a97\u53e3\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u5de6\u4e0a\u89d2\uff09\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a app_id = CmdCtl.run_cmd(f\"xdotool search --classname --onlyvisible {self.app_name}\"\n).split(\"\\n\")\napp_id_list = [int(_id) for _id in app_id if _id]\nreturn CmdCtl.run_cmd(f\"xwininfo -id {app_id_list[self.number]}\")\n \u4f7f\u7528\u6b63\u5219\u83b7\u53d6\u7a97\u53e3\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u83b7\u53d6\u914d\u7f6e \u8bfb ini \u914d\u7f6e\u6587\u4ef6\uff0c\u83b7\u53d6\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e0e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a conf = ConfigParser()\nconf.read(self.config_path)\ndirection = conf.get(btn_name, \"direction\")\nposition = [int(i.strip()) for i in conf.get(btn_name, \"location\").split(\",\")]\n \u8ba1\u7b97\u5143\u7d20\u6309\u94ae\u5750\u6807 \u6839\u636e\u5e94\u7528\u7a97\u53e3\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u5927\u5c0f\u3001\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u5927\u5c0f\uff0c\u4f7f\u7528\u4e00\u5b9a\u7684\u7b97\u6cd5\u5373\u53ef\u8ba1\u7b97\u51fa\u5143\u7d20\u6309\u94ae\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u4e2d\u5fc3\u5750\u6807\uff09\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3","title":"3\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u3010\u914d\u7f6e\u65b9\u6cd5\u3011 \u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u7684\u6570\u636e\u6e90\u662f\u5e94\u7528\u5e93\u4e2d\u7684 ui.ini \u914d\u7f6e\u6587\u4ef6\uff1a ;section\n[\u65b0\u5efa\u6b4c\u5355+] ;key = value\ndirection = left_top\nlocation = 180, 268, 21, 21\n section \u662f\u4f60\u6839\u636e\u5bf9\u5e94\u7684\u5143\u7d20\u6309\u94ae\u547d\u540d\uff0c\u4f60\u53ef\u4ee5\u4efb\u610f\u547d\u540d\uff0c\u4f46\u6700\u597d\u6709\u5177\u4f53\u542b\u4e49\uff0c\u4e14\u80fd\u660e\u786e\u8868\u793a\u8fd9\u4e2a\u5143\u7d20\u6309\u94ae\u7684\u540d\u79f0\uff1b\u7528\u4e2d\u62ec\u53f7\u62ec\u8d77\u6765\u5c31\u884c\uff0c\u6bd4\u5982\uff1a[\u65b0\u5efa\u6b4c\u5355+] \uff1b direction \u662f\u914d\u7f6e\u8be5\u5143\u7d20\u7684\u53c2\u8003\u7cfb\uff0c\u5206\u522b\u4e3a\uff1a left_top \u5de6\u4e0a\uff1b left_bottom \u5de6\u4e0b\uff1b right_top \u53f3\u4e0a\uff1b right_bottom \u53f3\u4e0b\uff1b \u53c2\u8003\u7cfb\u7684\u9009\u53d6\u6807\u51c6\uff1a\u62c9\u52a8\u6539\u53d8\u7a97\u53e3\u5927\u5c0f\u65f6\uff0c\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u53c2\u8003\u7cfb\u4f4d\u7f6e\u662f\u4e0d\u53d8\u7684\uff1b location \u662f\u8be5\u5143\u7d20\u6309\u94ae\u7684\u76f8\u5bf9\u4e0e\u53c2\u8003\u7cfb\u7684 x, y \u7684\u8ddd\u79bb\uff0c\u53ca\u5927\u5c0f(w, h)\uff0c\u8fd9\u56db\u4e2a\u6570\u636e\u53ef\u4ee5\u901a\u8fc7 UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\u6570\u636e\uff0c\u5728\u7f16\u8f91\u6a21\u5f0f\u4e0b\uff0c\u70b9\u51fb UI \u56fe\u4e0a\u7684\u6309\u94ae\uff0c\u53f3\u4fa7\u5c31\u4f1a\u51fa\u73b0\u8be5\u5143\u7d20\u6309\u94ae\u7684 x, y, w, h \u6570\u636e\u3002 \u5982\u679c UI \u56fe\u4e0a\u6ca1\u6709\u63d0\u4f9b\u4f60\u60f3\u8981\u7684\u5143\u7d20\u6570\u636e\uff0c\u4f60\u53ef\u4ee5\u76f4\u63a5\u5728\u7cfb\u7edf\u4e2d\u4f7f\u7528\u622a\u56fe\u5f55\u5c4f\u8fdb\u884c\u5c3a\u91cf\uff0c\u8fd9\u662f\u4e00\u79cd\u4e0d\u63a8\u8350\u4f46\u80fd\u7528\u7684\u65b9\u6cd5\u3002 \u3010\u8c03\u7528\u65b9\u6cd5\u3011 \u5728\u5e94\u7528\u5e93\u65b9\u6cd5\u5c42\u8fd9\u6837\u5199\uff1a def click_add_music_list_btn_in_music_by_ui(self):\n\"\"\"\u70b9\u51fb\u65b0\u5efa\u6b4c\u5355\u6309\u94ae\"\"\"\nself.click(*self.ui.btn_center(\"\u65b0\u5efa\u6b4c\u5355+\"))\n self.ui.btn_center() \u662f\u56fa\u5b9a\u5199\u6cd5\uff0c\u53c2\u6570\u5c31\u662f\u914d\u7f6e\u91cc\u9762\u7684 section \u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ocr","title":"\u56db\u3001OCR \u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_2","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 OCR \u65b9\u6848\u5927\u591a\u91c7\u7528\u8c37\u6b4c OCR\uff08Tesseract\uff09\u65b9\u6848\uff0c\u4f46\u662f\u5b83\u5bf9\u4e8e\u4e2d\u6587\u7684\u8bc6\u522b\u975e\u5e38\u5dee\uff0c\u7ecf\u8fc7\u5927\u91cf\u7684\u8c03\u7814\uff0c\u6211\u4eec\u4f7f\u7528 PaddleOCR\uff0c\u5b83\u662f\u4e00\u4e2a\u5f00\u6e90\u7684\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u8bc6\u522b\u5de5\u5177\uff0c\u4e5f\u662f PaddlePaddle \u6700\u6709\u540d\u7684\u4e00\u4e2a\u5f00\u6e90\u9879\u76ee\uff0c\u611f\u5174\u8da3\u7684\u53ef\u4ee5\u70b9\u8fd9\u91cc\u4e86\u89e3\uff0c\u591a\u7684\u4e0d\u8bf4\u4e86\uff0c\u4f60\u53ea\u9700\u8981\u77e5\u9053\u5b83\u5c31\u662f\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_2","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5b89\u88c5\u4ed6\u662f\u4e2a\u5f88\u9ebb\u70e6\u7684\u4e8b\u60c5\uff0c\u867d\u7136\u64cd\u4f5c\u5f88\u7b80\u5355\uff0c\u4f46\u5176\u5b9e\u5b89\u88c5\u5305\u6709\u70b9\u5927\uff0c\u56e0\u6b64\u6211\u4eec\u4e0d\u5e0c\u671b\u76f4\u63a5\u5728 env.sh \u4e2d\u52a0\u5165\u5b83\uff0c\u8fd9\u4f1a\u8ba9\u6574\u4e2a\u81ea\u52a8\u5316\u73af\u5883\u53d8\u5f97\u975e\u5e38\u81c3\u80bf\uff1b \u56e0\u6b64\uff0c\u6211\u4eec\u60f3\u5230\u5c06\u5b83\u505a\u6210\u4e00\u4e2a RPC \u670d\u52a1\u5728\u5176\u4ed6\u673a\u5668\u4e0a\u90e8\u7f72\uff0c\u6d4b\u8bd5\u673a\u901a\u8fc7\u8fdc\u7a0b\u8c03\u7528 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u4f7f\u7528\u5b83\uff1b RPC \u7684\u8c03\u7528\u903b\u8f91\uff1a \u8fd9\u6837\u6211\u4eec\u53ea\u9700\u8981\u5728\u670d\u52a1\u7aef\u90e8\u7f72\u597d OCR \u8bc6\u522b\u7684\u670d\u52a1\uff0c\u7136\u540e\u901a\u8fc7 RPC \u670d\u52a1\u5c06\u529f\u80fd\u63d0\u4f9b\u51fa\u6765\uff0c\u6846\u67b6\u91cc\u9762\u53ea\u9700\u8981\u8c03\u7528\u5bf9\u5e94\u7684 RPC \u63a5\u53e3\u5c31\u884c\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_1","title":"3\u3001\u4f7f\u7528\u8bf4\u660e","text":"\u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nfrom paddleocr import PaddleOCR\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef paddle_ocr(pic_path, lang):\n\"\"\"\n Paddleocr\u76ee\u524d\u652f\u6301\u7684\u591a\u8bed\u8a00\u8bed\u79cd\u53ef\u4ee5\u901a\u8fc7\u4fee\u6539lang\u53c2\u6570\u8fdb\u884c\u5207\u6362\n \u4f8b\u5982`ch`, `en`, `fr`, `german`, `korean`, `japan`\n :param file_name:\n :param lang:\n :return:\n \"\"\"\nif __name__ == \"__main__\":\nIP = popen(\"hostname -I\").read().split(\" \")[0]\nPORT = 8890\nSCREEN_CACHE = \"/tmp/screen.png\"\nserver = ThreadXMLRPCServer((IP, PORT), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(paddle_ocr, \"paddle_ocr\")\nprint(\"\u76d1\u542c\u5ba2\u6237\u7aef\u8bf7\u6c42\u3002\u3002\")\nserver.serve_forever()\n \u6846\u67b6\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from src import OCR\nOCR.ocr(*target_strings, picture_abspath=None, similarity=0.6, return_default=False, return_first=False, lang=\"ch\"):\n# \u901a\u8fc7 OCR \u8fdb\u884c\u8bc6\u522b\u3002\n# target_strings:\n# \u76ee\u6807\u5b57\u7b26,\u8bc6\u522b\u4e00\u4e2a\u5b57\u7b26\u4e32\u6216\u591a\u4e2a\u5b57\u7b26\u4e32,\u5e76\u8fd4\u56de\u5176\u5728\u56fe\u7247\u4e2d\u7684\u5750\u6807;\n# \u5982\u679c\u4e0d\u4f20\u53c2\uff0c\u8fd4\u56de\u56fe\u7247\u4e2d\u8bc6\u522b\u5230\u7684\u6240\u6709\u5b57\u7b26\u4e32\u3002\n# picture_abspath: \u8981\u8bc6\u522b\u7684\u56fe\u7247\u8def\u5f84\uff0c\u5982\u679c\u4e0d\u4f20\u9ed8\u8ba4\u622a\u53d6\u5168\u5c4f\u8bc6\u522b\u3002\n# similarity: \u5339\u914d\u5ea6\u3002\n# return_default: \u8fd4\u56de\u8bc6\u522b\u7684\u539f\u751f\u6570\u636e\u3002\n# return_first: \u53ea\u8fd4\u56de\u7b2c\u4e00\u4e2a,\u9ed8\u8ba4\u4e3a False,\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u6240\u6709\u6570\u636e\u3002\n# lang: `ch`, `en`, `fr`, `german`, `korean`, `japan`\n \u6b64\u65b9\u6848\u5728\u6846\u67b6\u5185\u6ca1\u6709\u5f15\u5165\u4efb\u4f55\u4e09\u65b9\u4f9d\u8d56\u5b8c\u5168\u91c7\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\uff0c\u800c\u4e14\u4f7f\u7528\u65b9\u6cd5\u975e\u5e38\u7b80\u5355\uff0c\u53ea\u9700\u8981\u901a\u8fc7 OCR.ocr() \u5373\u53ef\uff1b \u5bf9\u4e8e\u4e00\u4e9b\u6587\u6848\u7684\u573a\u666f\u975e\u5e38\u9002\u7528\uff0c\u6b64\u65b9\u6cd5\u76f4\u63a5\u8fd4\u56de\u5750\u6807\uff0c\u53ef\u4ee5\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u3002 \u4e5f\u53ef\u4ee5\u7528\u4e8e\u6587\u5b57\u65ad\u8a00\uff0c\u4ee3\u7801\u793a\u610f\uff1a def assert_ocr_exist(\n*args, picture_abspath=None, similarity=0.6, return_first=False, lang=\"ch\"\n):\n\"\"\"\u65ad\u8a00\u6587\u6848\u5b58\u5728\"\"\"\npic = None\nif picture_abspath is not None:\npic = picture_abspath + \".png\"\nres = OCR.ocr(\n*args,\npicture_abspath=pic,\nsimilarity=similarity,\nreturn_first=return_first,\nlang=lang,\n)\nif res is False:\nraise AssertionError(\n(f\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{args}\", f\"{pic if pic else GlobalConfig.SCREEN_CACHE}\")\n)\nif isinstance(res, tuple):\npass\nelif isinstance(res, dict) and False in res.values():\nres = filter(lambda x: x[1] is False, res.items())\nraise AssertionError(\n(\nf\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{dict(res)}\",\nf\"{pic if pic else GlobalConfig.SCREEN_CACHE}\",\n)\n)\n \u5728\u7528\u4f8b\u4e2d\u4f7f\u7528\u65ad\u8a00\uff0c\u793a\u4f8b\uff1a def test_font_manager_021(self):\n\"\"\"\u53f3\u4fa7\u2665-\u6536\u85cf/\u53d6\u6d88\u6536\u85cf\u5b57\u4f53\"\"\"\n# \u5b57\u4f53\u7ba1\u7406\u5668\u754c\u9762\u53f3\u4fa7\u8be6\u60c5\u5217\u8868\uff0c\u9009\u62e9\u672a\u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e / \u6536\u85cf\u5b57\u4f53\n# \u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e\u83dc\u5355\u663e\u793a\u201c\u53d6\u6d88\u6536\u85cf\u201d\uff1b\n...\nself.assert_ocr_exist(\"\u53d6\u6d88\u6536\u85cf\")\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_1","title":"4\u3001\u670d\u52a1\u7aef\u90e8\u7f72","text":"\u6211\u4eec\u76ee\u524d\u662f\u5c06 OCR \u670d\u52a1\u90e8\u7f72\u5728\u666e\u901a\u7684\u529e\u516c\u673a\u4e0a\u7684\uff0c\u5982\u679c\u4f60\u89c9\u5f97\u73b0\u6709\u7684 OCR \u8bc6\u522b\u6027\u80fd\u4e0d\u591f\u597d\uff0c\u6070\u597d\u4f60\u6709\u66f4\u597d\u7684\u673a\u5668\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u5176\u79c1\u6709\u5316\u90e8\u7f72\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41_1","title":"4.1\u3001\u73af\u5883\u5b89\u88c5","text":"\u63a8\u8350\u4f7f\u7528 pipenv \u8fdb\u884c\u73af\u5883\u642d\u5efa\uff1b \u5b89\u88c5 pipenv \uff1a sudo pip3 install pipenv\n \u65b0\u5efa\u4e00\u4e2a\u76ee\u5f55\u4f5c\u4e3a\u73af\u5883\u5305 ocr_env\uff1a cd ~\nmkdir ocr_env\n \u521b\u5efa python 3.7 \u73af\u5883\uff1a cd ocr_env\npipenv --python 3.7\n \u5b89\u88c5 OCR \u4f9d\u8d56\u5305\uff1a pipenv install paddlepaddle -i https://mirror.baidu.com/pypi/simple\npipenv install \"paddleocr>=2.0.1\" -i https://mirror.baidu.com/pypi/simple\n \u4e0d\u51fa\u610f\u5916\uff0c\u8fd9\u6837\u5c31\u628a\u4f9d\u8d56\u5b89\u88c5\u597d\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42_1","title":"4.2\u3001\u542f\u52a8\u670d\u52a1","text":"\u5c06\u57fa\u7840\u6846\u67b6\u4e2d\u7684 scr/ocr/pdocr_rpc_server.py \u6587\u4ef6\u62f7\u8d1d\u5230 ocr_env \u76ee\u5f55\uff0c\u540e\u53f0\u6267\u884c\u5b83\u5c31\u597d\u4e86\uff1a cd ocr_env\nnohup pipenv run python pdocr_rpc_server.py &\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#43","title":"4.3\u3001\u914d\u7f6e\u5f00\u673a\u81ea\u542f\uff08\u901a\u7528\uff09","text":"\u4f60\u80af\u5b9a\u4e0d\u60f3\u6bcf\u6b21\u673a\u5668\u91cd\u542f\u4e4b\u540e\u90fd\u9700\u8981\u624b\u52a8\u542f\u52a8\u670d\u52a1\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u914d\u7f6e\u5f00\u673a\u81ea\u542f\u3002 \u5199\u5f00\u673a\u81ea\u542f\u670d\u52a1\u6587\u4ef6\uff1a sudo vim /lib/systemd/system/ocr.service\n autoocr \u540d\u79f0\u4f60\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff0c\u5199\u5165\u4ee5\u4e0b\u5185\u5bb9\uff1a [Unit]\nDescription=OCR Service\nAfter=multi-user.target\n\n[Service]\nUser=uos\nGroup=uos\nType=idle\nWorkingDirectory=/home/uos/ocr_env\nExecStart=pipenv run python pdocr_rpc_server.py\n\n[Install]\nWantedBy=multi-user.target\n \u6ce8\u610f\u66ff\u6362\u4f60\u7684${USER} \u4fee\u6539\u914d\u7f6e\u6587\u4ef6\u7684\u6743\u9650\uff1a sudo chmod 644 /lib/systemd/system/ocr.service\n \u81ea\u542f\u670d\u52a1\u751f\u6548\uff1a sudo systemctl daemon-reload\nsudo systemctl enable ocr.service\n \u67e5\u770b\u670d\u52a1\u72b6\u6001\uff1a sudo systemctl status ocr.service\n \u4f60\u53ef\u4ee5\u518d\u91cd\u542f\u4e0b\u7535\u8111\uff0c\u770b\u770b\u670d\u52a1\u662f\u4e0d\u662f\u6b63\u5e38\u542f\u52a8\u4e86\uff0c\u6ca1\u62a5\u9519\u5c31 OK \u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_4","title":"\u4e94\u3001\u5c5e\u6027\u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_3","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 UI \u81ea\u52a8\u5316\u5927\u591a\u90fd\u662f\u57fa\u4e8e\u6d4f\u89c8\u5668\u7684\uff0c\u6838\u5fc3\u662f\u5728\u7f51\u9875\u7684 DOM \u6811\u4e0a\u67e5\u627e\u5143\u7d20\uff0c\u5e76\u5bf9\u5176\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\uff1b Linux \u684c\u9762\u5e94\u7528\u5927\u591a\u662f\u91c7\u7528 Qt \u7f16\u5199\u7684\uff0c\u5728 Qt \u4e2d\u4e5f\u662f\u4ece\u6700\u9876\u5c42\u7684 MainWindow \u5f00\u59cb\u6784\u5efa\u5e94\u7528\uff0c\u6240\u4ee5\u903b\u8f91\u4e5f\u662f\u4e00\u6837\u7684\uff0cQt \u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u540c\u6837\u53ef\u4ee5\u901a\u8fc7 DOM \u6811\uff08\u5c5e\u6027\u6811\uff09\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff0c\u6211\u4eec\u79f0\u4e4b\u4e3a\u5c5e\u6027\u5b9a\u4f4d\u3002 \u501f\u52a9\u5f00\u6e90\u5de5\u5177 dogtail \u6211\u4eec\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u83b7\u53d6\uff0c\u4ece\u800c\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\u3002dogtail \u7684\u9879\u76ee\u4ecb\u7ecd\u53ef\u4ee5\u731b\u6233\u8fd9\u91cc\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_3","title":"2\u3001\u4f7f\u7528\u65b9\u6cd5","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#21sniff","title":"2.1\u3001sniff\uff08\u55c5\u63a2\u5668\uff09\u4f7f\u7528","text":"\u5728\u7ec8\u7aef\u8f93\u5165 sniff \u542f\u52a8 AT-SPI Browser mikigo@mikigo-PC:~$ sniff\n \u67e5\u770b\u5e94\u7528\u7684\u6807\u7b7e \u5728 sniff \u91cc\u9762\u53ef\u4ee5\u770b\u5230\u7cfb\u7edf\u4e2d\u5df2\u542f\u52a8\u7684\u5e94\u7528\uff0c\u70b9\u51fb\u5e94\u7528\u540d\u79f0\u524d\u9762\u7684\u4e09\u89d2\u5f62\u56fe\u6807\uff0c\u53ef\u4ee5\u5c55\u5f00\u5e94\u7528\u7684\u6807\u7b7e\uff0c\u6240\u6709\u6807\u7b7e\u4ee5 tree \u7684\u5f62\u5f0f\u5c55\u793a\uff0c\u5bf9\u5e94\u5e94\u7528\u91cc\u9762\u7684\u7236\u7a97\u53e3\u548c\u5b50\u7a97\u53e3\u3002 \u83b7\u53d6\u5143\u7d20\u63a7\u4ef6\u7684\u6807\u7b7e\u540d\u79f0 \u9996\u5148\uff0c\u4e3a\u4e86\u65b9\u4fbf\u67e5\u770b\u5143\u7d20\u63a7\u4ef6\u5bf9\u5e94\u7684\u4f4d\u7f6e\uff0c\u5efa\u8bae\u73b0\u5728\u4e0a\u65b9\u5de5\u5177\u680f\u70b9\u51fb Actions\uff0c\u7136\u540e\u52fe\u9009 Hightlight Items\uff0c\u8fd9\u6837\u5728 sniff \u4e2d\u9f20\u6807\u9009\u4e2d\u5143\u7d20\u6807\u7b7e\u7684\u65f6\u5019\uff0c\u5e94\u7528\u4e2d\u4f1a\u6709\u76f8\u5e94\u7684\u5149\u6807\u9501\u5b9a\u3002 \u5728 sniff \u91cc\u9762\u70b9\u51fb\u8fdb\u5165\u5e94\u7528\u7684\u6807\u7b7e tree \u4e2d\u540e\uff0c\u70b9\u51fb\u76f8\u5e94\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5728\u5de5\u5177\u4e0b\u65b9\uff0c\u4f1a\u5c55\u793a\u5143\u7d20\u63a7\u4ef6\u7684 Name\uff0c\u8fd9\u4e2a\u5c31\u662f\u6807\u7b7e\u540d\u79f0\u3002 \u5728 tree \u4e2d\u6709\u4e9b\u5730\u65b9\u662f\u7a7a\u767d\u7684\u6216\u8005\u662f Form\uff0c\u662f\u56e0\u4e3a\u5f00\u53d1\u4eba\u5458\u5728\u6dfb\u52a0\u6807\u7b7e\u7684\u65f6\u5019\u6ca1\u6709\u6dfb\u52a0\uff0c\u6216\u8005\u6709\u4e9b\u7236\u7a97\u53e3\u4e0d\u9700\u8981\u6dfb\u52a0\uff0c\u8fd9\u79cd\u5728\u5b9e\u9645\u4e1a\u52a1\u4e2d\u662f\u4e0d\u5f71\u54cd\u7684\uff0c\u6211\u4eec\u53ea\u8981\u4fdd\u8bc1\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\u4e2d\uff0c\u8981\u7528\u5230\u7684\u5143\u7d20\u90fd\u6dfb\u52a0\u4e86\u6807\u7b7e\u5373\u53ef\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#22","title":"2.2\u3001\u5143\u7d20\u64cd\u4f5c","text":"\u83b7\u53d6\u5e94\u7528\u5bf9\u8c61 dogtail \u83b7\u53d6\u5e94\u7528\u5bf9\u8c61\u7684\u65f6\u5019\uff0c\u4f7f\u7528\u7684\u662f tree \u5e93\u91cc\u9762\u7684 application() \u65b9\u6cd5\uff1a from dogtail.tree import root\napp_obj = root.application('deepin-music')\n app_obj\u5c31\u662f\u5e94\u7528\u7684\u5bf9\u8c61\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\uff0c\u662f\u5e94\u7528\u5bf9\u8c61\u4f7f\u7528child()\u65b9\u6cd5\uff1a element = app_obj.child('element_name')\n \u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u4f20\u5165\u5143\u7d20\u7684 Name\uff0c\u83b7\u53d6\u5230\u76f8\u5e94\u5143\u7d20\u7684\u5bf9\u8c61\u3002Name \u53ef\u4ee5\u901a\u8fc7 sniff \u67e5\u770b\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\u5217\u8868: element_list = element.children\n \u83b7\u53d6\u5230\u8fd9\u4e2a\u5143\u7d20\u4e0b\u9762\u6240\u6709\u7684\u5143\u7d20\u5217\u8868\u3002 \u8fd9\u4e2a\u65b9\u6cd5\u9002\u7528\u4e8e\u6709\u4e9b\u6807\u7b7e\u6ca1\u6709\u6dfb\u52a0\uff0c\u4f46\u662f\u4f4d\u7f6e\u662f\u56fa\u5b9a\u7684\uff0c\u6211\u4eec\u901a\u8fc7\u7d22\u5f15\u53ef\u4ee5\u53d6\u5f97\u5143\u7d20\u3002 element_list[0]\n \u5bf9\u5143\u7d20\u7684\u64cd\u4f5c \u5728\u83b7\u53d6\u5230\u5143\u7d20\u4e4b\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u76f8\u5e94\u7684\u64cd\u4f5c\u3002 \u5355\u51fb element.click(button=1)\n button 1 \u2014>\u5de6\u952e\uff0c2 \u2014>\u6eda\u8f6e\uff0c3 \u2014>\u53f3\u952e\uff0c\u9ed8\u8ba4\u4e3a 1 \u53cc\u51fb element.doubleClick(button=1)\n \u9f20\u6807\u60ac\u505c element.point()\n \u9f20\u6807\u79fb\u52a8\u5230\u5143\u7d20\u4e2d\u5fc3\u4f4d\u7f6e \u6587\u672c\u8f93\u5165 element.typeText(string)\n \u5411\u5143\u7d20\u5bf9\u8c61\u8f93\u5165\u5b57\u7b26\u4e32 \uff0c\u6bd4\u5982\u8f93\u5165\u6846 \u7ec4\u5408\u952e element.keyCombo(comboString)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#23","title":"2.3\u3001\u6846\u67b6\u5c01\u88c5","text":"\u4ee3\u7801\u793a\u4f8b\uff1a # \u8be6\u7ec6\u4ee3\u7801\u8bf7\u67e5\u770b src/dogtail_utils.py\nclass DogtailUtils:\ndef __init__(self, name=None, description=None):\nself.name = name\nself.description = description\nself.obj = root.application(self.name, self.description)\ndef app_element(self, *args, **kwargs):\n\"\"\"\n \u83b7\u53d6app\u5143\u7d20\u7684\u5bf9\u8c61\n :return: \u5143\u7d20\u7684\u5bf9\u8c61\n \"\"\"\nreturn self.obj.child(*args, **kwargs, retry=False)\ndef element_center(self, element) -> tuple:\n\"\"\"\n \u83b7\u53d6\u5143\u7d20\u7684\u4e2d\u5fc3\u4f4d\u7f6e\n :param element:\n :return: \u5143\u7d20\u4e2d\u5fc3\u5750\u6807\n \"\"\"\n_x, _y, _w, _h = self.app_element(element).extents\n_x = _x + _w / 2\n_y = _y + _h / 2\nreturn _x, _y\n \u6846\u67b6\u63d0\u4f9b\u7684\u63a5\u53e3\u975e\u5e38\u7b80\u6d01\uff0c\u5728\u8c03\u7528\u65f6\uff1a self.dog.element_center(\"\u64ad\u653e\")\n \u8fd9\u6837\u5c31\u80fd\u83b7\u53d6\u5230\u6b64\u5143\u7d20\u7684\u4e2d\u5fc3\u5750\u6807\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_5","title":"\u516d\u3001\u6807\u7b7e\u5316\u7ba1\u7406","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_4","title":"1\u3001\u6807\u7b7e\u8bf4\u660e","text":"\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u811a\u672c ID\uff1a\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c/\u51fd\u6570 ID\uff1b PMS\u7528\u4f8bID\uff1aPMS \u4e0a\u5bf9\u5e94\u7684\u7528\u4f8b ID\uff08\u7528\u4f8b\u5e93 ID\uff09\uff1b \u9ed8\u8ba4\u4f7f\u7528\u7528\u4f8b\u5e93 ID\uff0c\u5bf9\u4e8e\u6682\u65f6\u6ca1\u6709\u4f7f\u7528\u7528\u4f8b\u5e93\u7ba1\u7406\u7528\u4f8b\u7684\u9879\u76ee\uff0c\u53ef\u4ee5\u4f7f\u7528\u4ea7\u54c1\u5e93\u7528\u4f8b ID\uff1b \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1aFUNC\uff08\u529f\u80fd\uff09\u3001API\uff08\u63a5\u53e3\uff09\u3001BASELINE\uff08\u57fa\u7ebf\uff09\u3001PERF\uff08\u6027\u80fd\uff09\u3001STR\uff08\u538b\u529b\uff09\u3001SEC\uff08\u5b89\u5168\uff09\u3001CTS\uff08\u517c\u5bb9\u6027\uff09 \u4e0a\u7ebf\u5bf9\u8c61\uff1aCICD\uff0c\u8868\u793a\u4e0a\u7ebf\u5230 CICD \u6d41\u6c34\u7ebf\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u53ef\u4e00\u952e\u751f\u6210 case_list.csv \u6587\u4ef6\uff0c\u7528\u4e8e\u5bfc\u5165\u5230\u660e\u9053\u4e91 AT \u7528\u4f8b\u5217\u8868\u4e2d\u63a7\u5236 CICD \u8dd1\u6d4b\u8303\u56f4\uff1b \u6d4b\u8bd5\u7ea7\u522b\uff1aC1 / C2 / C3 / C4\uff0c\u5177\u4f53\u5b9a\u4e49\u53c2\u8003\u6d41\u6c34\u7ebf\u4f7f\u7528\u6307\u5bfc\uff1b \u8df3\u8fc7\u539f\u56e0\uff1askip-XXX\uff0c\u7528\u4e8e\u63a7\u5236\u7528\u4f8b\u662f\u5426\u6267\u884c\uff1b \u786e\u8ba4\u4fee\u590d\uff1afixed-XXX\uff0c\u7528\u4e8e\u6807\u8bb0\u7528\u4f8b\u7684\u4fee\u590d\u72b6\u6001\uff08\u540e\u9762\u8be6\u7ec6\u8bb2\u89e3\u7528\u6cd5\uff09\uff1b \u5e9f\u5f03\u7528\u4f8b\uff1aremoved-\u5df2\u5e9f\u5f03\uff0c\u7528\u4e8e\u6807\u8bb0\u5df2\u7ecf\u5e9f\u5f03\u7684\u7528\u4f8b\uff0c\u6b64\u7528\u4f8b\u6807\u7b7e\u4e0d\u4f1a\u88ab\u6dfb\u52a0\uff0c\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff1b \u793a\u4f8b\uff1a \u811a\u672cID PMS\u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u4e0a\u7ebf\u5bf9\u8c61 \u6d4b\u8bd5\u7ea7\u522b \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b ... 001 679537 L1 FUNC CICD C1 skip-XXX fixed-XXX removed-\u5df2\u5e9f\u5f03 ..."},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_4","title":"2\u3001\u64cd\u4f5c\u6b65\u9aa4","text":"2.1\u3001\u5728\u5b50\u9879\u76ee\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u4ee5\u7528\u4f8b\u7684 py \u6587\u4ef6\u9664\u53bb\u9996\u5b57\u7b26\u4e32 \"test_\" \u548c\u7528\u4f8b\u5e8f\u53f7\u540e\u7684\u5b57\u7b26\u4e32\u4f5c\u4e3a csv \u7684\u6587\u4ef6\u540d\u3002 \u4f8b\u5982: \u76f8\u518c\u7684\u7528\u4f8b\u6587\u4ef6\u4e3a test_album_xxx.py\uff0cxxx \u8868\u793a\u4efb\u610f\u4e09\u4f4d\u6570\u5b57\u4ee3\u8868\u7528\u4f8b\u5e8f\u53f7\uff0c\u6b64\u65f6 csv \u6587\u4ef6\u540d\u5c31\u5e94\u4e3a album.csv\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u6240\u6709 csv \u6587\u4ef6\u5efa\u8bae\u653e\u5728\u4e00\u4e2a tags \u76ee\u5f55\u4e0b\u3002 \u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 2.2\u3001\u7b2c\u4e00\u5217\u4e3a\u811a\u672c ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b\u7528\u4f8b\u6807\u7b7e\u53ef\u4ee5\u65e0\u5e8f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_2","title":"3\u3001\u589e\u52a0\u8bf4\u660e","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_1","title":"3.1\u3001\u8df3\u8fc7\u7528\u4f8b","text":"\u4f20\u7edf\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668(@pytest.mark.skip)\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a; \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#311","title":"3.1.1\u3001\u56fa\u5b9a\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u7b7e\u5f00\u5934\u4e3a \u201cskip-XXX\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\uff0c\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\u5219\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u7b7e\u4e3a SKIPED\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#312","title":"3.1.2\u3001\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skipif_platform-aarch64&mips64 \u67d0\u4e9b\u7528\u4f8b\u4f1a\u56e0\u4e3a\u4e0d\u540c\u7684\u73af\u5883\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\uff0c\u5e38\u89c1\u7684\u573a\u666f\u4e3a\u5728\u4e0d\u540c\u67b6\u6784\u4e0a\u5224\u65ad\u662f\u5426\u6267\u884c\uff0c\u8df3\u8fc7\u7684\u539f\u56e0\u6807\u7b7e\u4e3a \u201cskipif_platform-\u201d \u52a0\u67b6\u6784\u540d\uff0c\u591a\u4e2a\u67b6\u6784\u4e4b\u95f4\u4f7f\u7528 \u201c&\u201d \u62fc\u63a5\uff1b \u4ee5\u4e0a\u4f8b\u5b50\u4e3a\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u5224\u65ad\u5f53\u524d\u67b6\u6784\u662f\u5426\u4e3a arrch64 \u6216\u8005 mips64\uff0c\u82e5\u662f\uff0c\u5219\u8df3\u8fc7\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u82e5\u5426\u5219\u6267\u884c\u7528\u4f8b\uff1b \u76ee\u524d\u6846\u67b6\u9ed8\u8ba4\u4ec5\u652f\u6301\u67b6\u6784\u7684\u6761\u4ef6\u5224\u65ad\uff0c\u4f46\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u903b\u8f91\u652f\u6301\u81ea\u5b9a\u4e49\u6dfb\u52a0\u3002 \u5728\u9879\u76ee\u76ee\u5f55\u8def\u5f84\u4e0b\u5b58\u5728\u6587\u4ef6 setting/skipif.py\uff0c\u6240\u6709\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u7684\u51fd\u6570\u5199\u5728\u6b64\u6587\u4ef6\u4e2d\u3002 \u9ed8\u8ba4\u67b6\u6784\u5224\u65ad\u4f8b\u5b50\uff1a def skipif_platform(args: str):\n\"\"\"\u5e73\u53f0\u8df3\u8fc7\"\"\"\n_skip_key = args.split(\"&\")\nfor key in _skip_key:\nif GlobalConfig.SYS_ARCH == key:\nreturn True\nreturn False\n \u65b9\u6cd5\u7f16\u5199\u89c4\u8303\uff1a \u65b9\u6cd5\u540d\u5fc5\u987b\u4ee5 skipif \u5f00\u5934\uff1b \u65b9\u6cd5\u5fc5\u987b\u6709\u8fd4\u56de\u7ed3\u679c\u5e76\u4e14\u4e3a\u5e03\u5c14\u503c\uff08True \u4ee3\u8868\u8df3\u8fc7\uff0cFalse \u4ee3\u8868\u4e0d\u8df3\u8fc7\uff09\uff1b \u65b9\u6cd5\u53ea\u80fd\u6709\u4e00\u4e2a\u5165\u53c2\uff1b \u5728 csv \u6587\u4ef6\u8df3\u8fc7\u539f\u56e0\u4e00\u680f\u4e2d\u586b\u5199\u4e3a \u201c{\u51fd\u6570\u540d}-{\u53c2\u6570}\u201d\uff0c\u4f8b\u5982\uff1askipif_platform-aarch64\uff1b\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u4f1a\u4ee5\u7b2c\u4e00\u4e2a \u201c-\u201d \u8fdb\u884c\u5206\u5272\uff0c\u622a\u53d6\u7684\u5de6\u4fa7\u5b57\u7b26\u4e32\u4f5c\u4e3a\u51fd\u6570\u540d\uff0c\u5728 skipif.py \u6587\u4ef6\u4e2d\u67e5\u627e\u662f\u5426\u6709\u540c\u540d\u51fd\u6570\uff0c\u5e76\u5c06\u622a\u53d6\u7684\u53f3\u4fa7\u4f5c\u4e3a\u53c2\u6570\u4f20\u9012\u7ed9\u8be5\u51fd\u6570\uff0c\u901a\u8fc7\u83b7\u53d6\u8be5\u51fd\u6570\u8fd4\u56de\u7684\u5e03\u5c14\u503c\uff0c\u8fd4\u56de True\uff0c\u5219\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u8fd4\u56de False\uff0c\u5219\u6267\u884c\u8be5\u7528\u4f8b\u3002 \u82e5\u51fd\u6570\u9700\u8981\u591a\u4e2a\u53c2\u6570\uff0c\u53ef\u81ea\u5b9a\u4e49\u591a\u4e2a\u53c2\u6570\u4e4b\u95f4\u7684\u8fde\u63a5\u7b26\uff0c\u8fde\u63a5\u7b26\u53f7\u4e0d\u53ef\u4f7f\u7528\u4e0b\u5212\u7ebf\u548c\u9017\u53f7\uff0c\u63a8\u8350\u7edf\u4e00\u4f7f\u7528 & \u7b26\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32","title":"3.2\u3001\u786e\u8ba4\u4fee\u590d","text":"\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7528\u4f8b\u4fee\u590d\u540e\uff0c\u4f46\u4e0d\u80fd\u7acb\u5373\u5220\u9664\u8df3\u8fc7\u539f\u56e0\uff08skip-XXX\uff09\u7684\u7528\u4f8b\uff0c\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u786e\u8ba4\u4fee\u590d\u201d\uff0c\u4f5c\u4e3a\u6807\u8bb0\u8be5\u7528\u4f8b\u662f\u5426\u5df2\u7ecf\u4fee\u590d\uff0c\u56fa\u5b9a\u586b\u5165\u5b57\u6bb5\u4e3a \u201cfixed-\u5df2\u4fee\u590d\u201d\u3002\u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u5373\u4f7f\u540c\u65f6\u6807\u8bb0\u4e86 skip-XXX \u4e5f\u4f1a\u6b63\u5e38\u6267\u884c\u3002 \u793a\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d \u3010\u540c\u65f6\u6807\u8bb0\u4e86skip \u548c fixed\uff0c\u4f46\u4ecd\u7136\u60f3\u8981\u8df3\u8fc7\u7528\u4f8b\u3011 \u5f53 \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u540c\u65f6\u586b\u5165\u540e\uff0c\u547d\u4ee4\u884c\u4f20\u9012\u53c2\u6570 --ifixed yes\uff0c\u5219\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\u8be5\u6761\u7528\u4f8b\u3002 python3 manage.py run --ifixed yes\n \u770b\u5230\u8fd9\u91cc\u6709\u4e9b\u540c\u5b66\u53ef\u80fd\u8981\u95ee\u4e86\uff0c\u6211\u60f3\u6062\u590d\u8df3\u8fc7\u6267\u884c\uff0c\u76f4\u63a5\u628a skip-XXX \u8fd9\u4e00\u5217\u6807\u7b7e\u5220\u6389\u4e0d\u5c31\u597d\u4e86\uff0c\u8fd8\u641e\u4ec0\u4e48\u786e\u8ba4\u4fee\u590d\u5e72\u5565\uff1f \u8fd9\u91cc\u7ed9\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u89e3\u91ca\u4e00\u4e0b\uff1a \uff08\u4ee5\u4e0b\u6d41\u6c34\u7ebf\u6307\u7684\u662f\u6bcf\u65e5\u6784\u5efa\u7684\u6d41\u6c34\u7ebf\uff0c\u8dd1 AT \u7684\u5168\u91cf\u7528\u4f8b\uff09 \u9996\u5148\uff0c\u6d41\u6c34\u7ebf\u4e0a\u8dd1\u7684\u662f AT \u5386\u53f2 Tag\uff0c\u8df3\u8fc7\u7528\u4f8b\u7684\u6807\u7b7e(skip-XXX) \u662f\u5728\u6700\u65b0\u7684\u4ee3\u7801\u4e0a\u63d0\u4ea4\u7684\uff0c\u6211\u4eec\u91c7\u7528\u6700\u65b0\u7684 csv \u6587\u4ef6\u8986\u76d6\u5386\u53f2 csv \u6587\u4ef6\u7684\u8bbe\u8ba1\u6765\u5b9e\u73b0\u4e86\u5bf9\u5386\u53f2 Tag \u4e0a\u7528\u4f8b\u7684\u8df3\u8fc7\uff1b \u7136\u540e\uff0c\u5728\u65e5\u5e38\u8df3\u8fc7\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u540c\u65f6\u4e5f\u5728\u4fee\u590d\u4e00\u4e9b\u7528\u4f8b\uff0c\u4fee\u590d\u540e\u7684\u8fd9\u4e9b\u7528\u4f8b\u5728\u672c\u5730\u8c03\u8bd5\u7684\u65f6\u5019\u6211\u4eec\u4e0d\u5e0c\u671b\u7ee7\u7eed\u8df3\u8fc7\uff0c\u4f46\u662f\u6b64\u65f6\uff0c\u4fee\u590d\u7684\u8fd9\u4e9b\u7528\u4f8b\u53ef\u80fd\u8fd8\u4e0d\u7a33\u5b9a\uff0c\u4e0d\u9002\u5408\u9a6c\u4e0a\u653e\u5230\u6d41\u6c34\u7ebf\u53bb\u8dd1\uff0c\u4e5f\u5c31\u662f\u8bf4\u6d41\u6c34\u7ebf\u4e0a\u6211\u4eec\u662f\u5e0c\u671b\u4ed6\u7ee7\u7eed\u8df3\u8fc7\u7684\uff0c\u56e0\u6b64\uff0c\u54b1\u4e0d\u80fd\u76f4\u63a5\u628a skip-XXX \u5e72\u6389\uff1b \u8fd9\u91cc\u5c31\u77db\u76fe\u4e86\uff0c\u4e00\u4e2a\u9700\u6c42\u662f\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u53e6\u4e00\u4e2a\u9700\u6c42\u53c8\u4e0d\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u600e\u4e48\u529e\u5462\uff1f \u6211\u4eec\u4f7f\u7528\u201c\u786e\u8ba4\u4fee\u590d\u201d\u6765\u6807\u8bb0\u8fd9\u6761\u7528\u4f8b\u5df2\u7ecf\u4fee\u590d\u4e86\uff0c\u8fd9\u6837\u4f60\u672c\u5730\u8c03\u8bd5\u7528\u4f8b\u7684\u65f6\u5019\u8fd9\u6761\u5df2\u4fee\u590d\u7684\u7528\u4f8b\u662f\u4f1a\u6267\u884c\u7684\uff0c\u540c\u65f6\u5728\u6d41\u6c34\u7ebf\u4e0a\u5c06 --ifixed yes \u53c2\u6570\u52a0\u4e0a\uff0c\u90a3\u4e48\u6d41\u6c34\u7ebf\u4e0a\u6267\u884c\u65f6\u8fd9\u6761\u7528\u4f8b\u4ecd\u7136\u662f\u8df3\u8fc7\u7684\u72b6\u6001\uff0c\u540e\u7eed\u4f60\u6253 Tag \u7684\u65f6\u5019\uff0c\u628a \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u7684\u6807\u7b7e\u5168\u90e8\u5220\u6389\u5c31\u53ef\u4ee5\u4e86\u3002 \u8fd9\u5c31\u662f\u201c\u786e\u8ba4\u4fee\u590d\u201d\u8fd9\u4e2a\u6807\u7b7e\u7684\u80cc\u666f\uff0c\u9700\u8981\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u54c1\u4e00\u54c1\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#33","title":"3.3\u3001\u5e9f\u5f03\u7528\u4f8b","text":"\u9488\u5bf9\u67d0\u4e9b\u7528\u4f8b\uff0c\u7531\u4e8e\u9700\u6c42\u53d8\u66f4\uff0c\u73af\u5883\u5f71\u54cd\u6216\u8bc4\u4f30\u4e0d\u518d\u9002\u7528\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u65f6\uff0c\u7528\u4f8b\u9700\u8981\u5e9f\u5f03\uff0c\u5219\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u5e9f\u5f03\u7528\u4f8b\u201d\uff0c\u8be5\u5217\u5b58\u5728 \u201cremoved-{\u5e9f\u5f03\u539f\u56e0}\u201d\uff0c\u5219\u7528\u4f8b\u4e0d\u4f1a\u6267\u884c\u3002 \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d removed-\u5df2\u5e9f\u5f03 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_2","title":"4\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u4e0a\u9762\u4ecb\u7ecd Pytest \u6846\u67b6\u63d0\u4f9b\u7684\u6807\u7b7e\u529f\u80fd mark\uff0c\u4f7f\u7528\u65f6\u9700\u8981\u4e3a\u6bcf\u4e00\u4e2a\u7528\u4f8b\u6dfb\u52a0\u6807\u7b7e\u88c5\u9970\u5668\uff0c\u5219\u64cd\u4f5c\u590d\u6742\uff0c\u53ef\u7ef4\u62a4\u6027\u5dee\uff0c\u5176\u6839\u672c\u95ee\u9898\u5c31\u662f\u6807\u7b7e\u5206\u6563\u5728\u6bcf\u4e00\u6761\u7528\u4f8b\u7684\u88c5\u9970\u5668\u4e0a\uff0c\u96be\u4ee5\u96c6\u4e2d\u7ef4\u62a4\uff1b\u4e8e\u662f\u4e4e\u5c06\u6240\u6709\u6807\u7b7e\u4f7f\u7528 csv \u6587\u4ef6\u8fdb\u884c\u96c6\u4e2d\u7ba1\u7406\uff0c\u5e76\u901a\u8fc7 Pytest \u7684\u94a9\u5b50\u51fd\u6570\uff0c\u8bfb\u53d6 csv \u6587\u4ef6\uff0c\u52a8\u6001\u6dfb\u52a0\u6807\u7b7e\u5230\u7528\u4e2d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5csv","title":"5\u3001CSV\u6587\u4ef6\u683c\u5f0f","text":"\u6b64\u914d\u7f6e\u6587\u4ef6\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u6807\u7b7e\u6570\u636e\uff0c\u4e14\u8981\u65b9\u4fbf\u80fd\u4f7f\u7528Excel\u6253\u5f00\u8fdb\u884c\u7f16\u8f91\u67e5\u770b\uff0c\u66f4\u91cd\u8981\u7684\u662f\u6211\u4eec\u4e0d\u60f3\u5f15\u5165\u4e09\u65b9\u4f9d\u8d56\uff0cCSV \u6587\u4ef6\u51e0\u4e4e\u662f\u552f\u4e00\u80fd\u6ee1\u8db3\u6240\u6709\u7684\u8981\u6c42\u7684\u6587\u4ef6\u683c\u5f0f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_6","title":"\u4e03\u3001\u65e5\u5fd7\u7cfb\u7edf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_5","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e YouQu \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u64cd\u4f5c\u65b9\u6cd5\u5c01\u88c5\u5199\u6cd5\uff0c\u901a\u5e38\u662f\u8fd9\u6837\u7684\uff1a\u7c7b\u91cc\u9762\u4e00\u4e2a\u51fd\u6570\u53ea\u5305\u542b\u4e00\u4e2a\u64cd\u4f5c\u6216\u591a\u6b21\u8c03\u7528\u7684\u4e00\u7cfb\u5217\u53ef\u5408\u5e76\u7684\u64cd\u4f5c\uff1b \u4f20\u7edf\u7684\u65e5\u5fd7\u8f93\u51fa\u65b9\u5f0f\uff0c\u9700\u8981\u5728\u6bcf\u4e2a\u51fd\u6570\u91cc\u9762\u4e3b\u52a8\u7f16\u5199\u65e5\u5fd7\u8f93\u51fa\u4ee3\u7801 \uff0c\u4f8b\u5982\uff1a class XXXWidget:\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\nlogger.info(\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\")\n...\n# \u7701\u7565\u4ee3\u7801\u90e8\u5206\n \u4e00\u4e2a\u51fd\u6570\u91cc\u9762\u81f3\u5c11\u5305\u542b\u4e00\u6761\u65e5\u5fd7\u4fe1\u606f\uff0c\u5982\u679c\u6bd4\u8f83\u590d\u6742\u64cd\u4f5c\u6b65\u9aa4\uff0c\u53ef\u80fd\u5305\u542b\u591a\u6761\u65e5\u5fd7\u4fe1\u606f\uff1b \u4e00\u4e2a\u5e94\u7528\u542b\u6709\u5927\u91cf\u7684\u64cd\u4f5c\u51fd\u6570\uff0c\u4e5f\u5c31\u662f\u8bf4\u6211\u4eec\u9700\u8981\u5199\u5927\u91cf\u7684\u65e5\u5fd7\u4ee3\u7801\uff1b \u901a\u8fc7\u7ecf\u9a8c\u89c2\u5bdf\uff0c\u6211\u4eec\u53d1\u73b0\uff0c\u51fd\u6570\u8bf4\u660e\u4ee5\u53ca\u51fd\u6570\u64cd\u4f5c\u65e5\u5fd7\uff0c\u5177\u6709\u8f83\u9ad8\u7684\u91cd\u590d\u5ea6\uff08\u4ece\u4e0a\u9762\u7684\u4f8b\u5b50\u4e5f\u53ef\u4ee5\u770b\u51fa\u6765\uff09\uff0c\u56e0\u6b64\u6211\u4eec\u5927\u80c6\u7684\u8bbe\u60f3\uff0c\u80fd\u4e0d\u80fd\u57fa\u4e8e\u6846\u67b6\u6267\u884c\u65f6\uff0c\u81ea\u52a8\u7684\u5c06\u51fd\u6570\u8bf4\u660e\u4f5c\u4e3a\u65e5\u5fd7\u6253\u5370\u51fa\u6765\uff0c\u4ece\u800c\u51cf\u5c11\u5927\u91cf\u65e5\u5fd7\u4ee3\u7801\u91cf\u548c\u91cd\u590d\u7f16\u5199\uff0c\u90a3\u771f\u662f\u5999\u554a~\u3002 \u57fa\u4e8e\u6b64\u201c\u5929\u771f\u201d\u7684\u60f3\u6cd5\uff0c\u6211\u4eec\u8bbe\u8ba1\u51fa\u4e86 youqu \u7684\u65e5\u5fd7\u7cfb\u7edf\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_5","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u6838\u5fc3\u539f\u7406\uff1a \u901a\u8fc7\u7ed9\u7c7b\u52a0\u4e0a\u4e00\u4e2a\u88c5\u9970\u5668 @log\uff0c\u52a8\u6001\u7ed9\u8be5\u7c7b\u4e0b\u6240\u6709\u7684\u51fd\u6570\u53ca\u7236\u7c7b\u51fd\u6570\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668 @_trace\uff0c\u5728\u6b64\u88c5\u9970\u5668\u4e2d\u6211\u4eec\u80fd\u52a8\u6001\u7684\u6355\u83b7\u6240\u8c03\u7528\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff08func.__doc__\uff09\uff0c\u901a\u8fc7\u65e5\u5fd7\u8f93\u51fa\u5668\u5c06\u5176\u8f93\u51fa\u5373\u53ef\u3002 \u5b9e\u73b0\u6b65\u9aa4\uff1a \u901a\u8fc7 inspect.getmembers \u83b7\u53d6\u88ab\u88c5\u9970\u7684\u7c7b\u4e0b\u6240\u6709\u51fd\u6570\uff0c\u5305\u542b\u9759\u6001\u65b9\u6cd5\uff0c\u7c7b\u65b9\u6cd5\uff0c\u5b9e\u4f8b\u65b9\u6cd5\uff1b \u901a\u8fc7 setattr(\u7c7b, \u65b9\u6cd5, _trace\uff09 \u7684\u65b9\u5f0f\uff0c\u7ed9\u7b26\u5408\u6761\u4ef6\u7684\u51fd\u6570\uff0c\u52a8\u6001\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_3","title":"3\u3001\u65e5\u5fd7\u914d\u7f6e","text":"[log_cli]\n;\u65e5\u5fd7\u76f8\u5173\u914d\u7f6e\uff08\u4e0d\u6253\u5370\u6784\u9020\u51fd\u6570\u548c\u9b54\u6cd5\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff09\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = INFO\n# ============= \u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u914d\u7f6e ================\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u5f00\u5934\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7, \u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_STARTSWITH = Assert\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u7ed3\u5c3e\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_ENDSWITH = Widget\n;\u652f\u6301\u7c7b\u540d\u5305\u542b xxx \u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_CONTAIN = ShortCut\n# ==============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_3","title":"4\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u5728\u5e94\u7528\u5e93 widget \u65b9\u6cd5\u5e93\u91cc\u9762\uff0c\u53ea\u9700\u8981\u5728\u51fa\u53e3\u6587\u4ef6\u52a0\u4e0a\u7c7b\u88c5\u9970\u5668\uff0c\u5c31\u53ef\u4ee5\u5b9e\u73b0\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u4e86\uff1b # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6ce8\u610f\uff0c\u662f\u7c7b\u88c5\u9970\u5668\u3002 \u5b9e\u4f8b\uff1a # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\n@classmethod\ndef find_dfm_image(cls, *elements, multiple=False, rate=0.9):\n\"\"\"\n \u67e5\u627e\u56fe\u7247 {{elements}}.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e {{rate}} \u7684\u5750\u6807\n :param elements:\n :param multiple:\n :return:\n \"\"\"\nelement = tuple(map(lambda x: f\"{Config.PIC_RES_PATH}/{x}\", elements))\nreturn cls.find_image(*element, multiple=multiple)\n \u8c03\u7528\u65b9\u6cd5\u65f6\uff1a DfmWidget.find_dfm_image(\"dfm_001\")\n \u81ea\u52a8\u8f93\u51fa\u7684\u65e5\u5fd7\uff1a >> x86_64-uos-6: 02/28 17:48:47 | INFO | logger_utils: [find_dfm_image]: \u67e5\u627e\u56fe\u7247 dfm_001.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e 0.9 \u7684\u5750\u6807\n \u52a0\u4e0a\u88c5\u9970\u5668 @log \u4e4b\u540e\uff0c\u65b9\u6cd5\u5c42\u6240\u6709\u7684\u51fd\u6570\uff08\u5305\u62ec\u5b9e\u4f8b\u65b9\u6cd5\u3001\u7c7b\u65b9\u6cd5\u3001\u9759\u6001\u65b9\u6cd5\uff09\u90fd\u4e0d\u9700\u8981\u518d\u5199\u65e5\u5fd7\u4ee3\u7801\uff0c\u6267\u884c\u7684\u65f6\u5019\u4f1a\u81ea\u52a8\u8f93\u51fa\uff0c\u5e76\u4e14\u6240\u6709\u8c03\u7528\u7684\u65b9\u6cd5\u4f1a\u4ee5 allure.step \u7684\u65b9\u5f0f\uff0c\u5c55\u793a\u5728 allure \u62a5\u544a\u4e2d\uff0c\u5728\u62a5\u544a\u4e2d\u66f4\u80fd\u4e00\u76ee\u4e86\u7136\u7684\u770b\u5230\u7528\u4f8b\u6267\u884c\u6b65\u9aa4\u3002 \u3010\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\u3011 \u901a\u8fc7\u89c2\u5bdf\u524d\u9762\u7684\u4f8b\u5b50\uff0c\u7ec6\u5fc3\u7684\u540c\u5b66\u53ef\u80fd\u8fd8\u53d1\u73b0\u4e86\u4e00\u4e2a\u5c0f\u7ec6\u8282\uff1a\u51fd\u6570\u529f\u80fd\u8bf4\u660e\u4e2d\uff0c\u4e24\u5bf9\u5927\u62ec\u53f7\u4e2d\u7684\u5185\u5bb9 {{elements}} \u4f5c\u4e3a\u53d8\u91cf\u8f93\u51fa\u51fa\u6765\u4e86\uff1b \u6ca1\u9519\uff0c\u8fd9\u5c31\u662f\u6211\u4eec\u53c2\u8003Django \u548c jinja2 \u7684\u6a21\u677f\u8bed\u6cd5\u8bbe\u8ba1\u51fa\u7684\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\uff0c\u4f7f\u7528\u65b9\u6cd5\u5f88\u7b80\u5355\uff0c\u7528\u4e24\u5bf9\u5927\u62ec\u53f7\u628a\u51fd\u6570\u7684\u53c2\u6570\u62ec\u8d77\u6765\uff0c\u8fd9\u6837\u5728\u65e5\u5fd7\u8f93\u51fa\u7684\u65f6\u5019\u5c31\u80fd\u628a\u8c03\u7528\u51fd\u6570\u65f6\u53c2\u6570\u7684\u503c\u8f93\u51fa\u51fa\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_7","title":"\u516b\u3001\u73af\u5883\u90e8\u7f72","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_6","title":"1\u3001\u539f\u5219","text":"YouQu \u7684\u73af\u5883\u4f9d\u8d56\u4e00\u76f4\u575a\u6301 2 \u4e2a\u539f\u5219\uff1a \u6700\u5c0f\u73af\u5883\u4f9d\u8d56\u539f\u5219 \u6709\u4e9b\u540c\u5b66\u5199\u4e00\u4e9b\u529f\u80fd\uff0c\u9996\u5148\u60f3\u5230\u7684\u5c31\u662f\u53bb\u641c\u7d22\u5f15\u64ce\u641c\u4e00\u4e0b\uff0c\u770b\u6709\u6ca1\u6709\u73b0\u6210\u7684\u5de5\u5177\u6216\u8005\u4ee3\u7801\u76f4\u63a5\u80fd\u7528\uff0c\u7f8e\u5176\u540d\u66f0\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\uff0c\u522b\u4eba\u5df2\u7ecf\u9020\u597d\u4e86\u8f6e\u5b50\u54b1\u4eec\u5c31\u4e0d\u8981\u91cd\u590d\u53bb\u9020\u4e86\uff0c\u7136\u540e\u4e00\u5207\u4f3c\u4e4e\u90fd\u53d8\u5f97\u90a3\u4e48\u7684\u7406\u6240\u5e94\u5f53\u3002 \u5f53\u7136\u8fd9\u6837\u505a\u65e0\u53ef\u539a\u975e\uff0c\u6211\u76f8\u4fe1\u6709\u8fd9\u6837\u60f3\u6cd5\u5e76\u4e14\u4e00\u76f4\u8df5\u884c\u8fd9\u6837\u505a\u6cd5\u7684\u540c\u5b66\u4e0d\u5728\u5c11\u6570\uff0c\u4f46\u8fd9\u6837\u505a\u6709\u4e00\u4e2a\u5f88\u4e25\u91cd\u7684\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f60\u5199\u4e00\u4e2a\u5927\u578b\u9879\u76ee\u65f6\uff0c\u4f60\u4f1a\u5f15\u5165\u975e\u5e38\u975e\u5e38\u975e\u5e38\u591a\u7684\u4f9d\u8d56\uff0c\u6bd4\u5982\u8981\u505a\u4e2a\u63a5\u53e3\u8bf7\u6c42\u8981\u7528 requests\u3001\u8bfb\u5199\u4e2a\u6570\u636e\u7528 pandas\u3001\u5199\u4e2a\u8868\u683c\u7528 pyopenxl\u3001\u89e3\u6790\u4e2a\u6587\u672c\u8981\u7528\u8fd9\u4e2a\u90a3\u4e2a\u4e09\u65b9\u5e93 ... \u3002 \u6211\u8ba4\u4e3a\u8fd9\u662f\u975e\u5e38\u4e0d\u597d\u7684\u4e60\u60ef\uff0c\u5728\u5b9e\u73b0\u4e00\u4e2a\u529f\u80fd\u7684\u65f6\u5019\uff0c\u9996\u5148\u6211\u4eec\u5e94\u8be5\u53bb\u60f3\u81ea\u5df1\u600e\u4e48\u6837\u53bb\u5b9e\u73b0\uff0c\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff1b \u5982\u679c\u4f60\u4e0d\u4f1a\uff0c\u4f60\u53ef\u4ee5\u53bb\u5b66\u4e60\u4e09\u65b9\u5e93\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u522b\u4eba\u4e09\u65b9\u5e93\u4e5f\u662f\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\u7684\uff0c\u4e3a\u4ec0\u4e48\u54b1\u4eec\u4e0d\u884c\u5462\uff1b\u5982\u679c\u522b\u4eba\u7684\u4f60\u5b9e\u5728\u662f\u770b\u4e0d\u61c2\uff0c\u60f3\u5c3d\u4e00\u5207\u529e\u6cd5\u786e\u5b9e\u505a\u4e0d\u51fa\u6765\uff0c\u90a3\u518d\u8003\u8651\u5f15\u5165\u8fd9\u4e2a\u4e09\u65b9\u5e93\uff0c\u6211\u8ba4\u4e3a\u8fd9\u6837\u662f\u6ca1\u95ee\u9898\u7684\uff0c\u6bd5\u7adf\u54b1\u4eec\u6bb5\u4f4d\u8fd8\u4e0d\u591f\uff0c\u4f46\u5e0c\u671b\u5c06\u6765\u6709\u4e00\u5929\u6211\u4eec\u53ef\u4ee5\u3002 \u8fd9\u6837\u7684\u505a\u6cd5\u624d\u5e94\u8be5\u662f\u201c\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\u201d\u6b63\u786e\u7684\u64cd\u4f5c\u3002\u4e0d\u4f1a\u6ca1\u5173\u7cfb\uff0c\u770b\u770b\u522b\u4eba\u662f\u600e\u4e48\u5b9e\u73b0\u7684\uff0c\u81ea\u5df1\u518d\u6478\u7d22\u7740\u5199\u51fa\u6765\uff0c\u8fd9\u6837\u81ea\u5df1\u624d\u80fd\u6709\u6240\u63d0\u9ad8\uff0c\u4e0d\u7136\u4f60\u5c31\u53ea\u4f1a\u7528\u522b\u4eba\u7684\u4e1c\u897f\uff1b\u90a3\u4e9b\u5632\u7b11\u3001\u6279\u8bc4\u6211\u4eec\u91cd\u590d\u9020\u8f6e\u5b50\u7684\u4eba\uff0c\u5148\u60f3\u60f3\u81ea\u5df1\u4f1a\u9020\u8f6e\u5b50\u5417\u3002 \u672c\u7740\u81ea\u5df1\u5b9e\u73b0\u80fd\u5b9e\u73b0\u7684\u4e00\u5207\u7684\u539f\u5219\uff0cYouQu \u6846\u67b6\u505a\u5230\u4e86\u975e\u5e38\u5c11\u7684\u73af\u5883\u4f9d\u8d56\uff0c\u800c\u4e14\u6211\u4eec\u4ecd\u5728\u4e0d\u65ad\u52aa\u529b\uff0c\u51cf\u5c11\u73af\u5883\u90e8\u7f72\u7684\u4f9d\u8d56\u3002 \u6700\u5c0f\u4ed3\u5e93\u4f53\u79ef\u539f\u5219 \u5927\u6587\u4ef6\u4e0d\u80fd\u4e0a\u4f20\u5230\u5de5\u7a0b\u91cc\u9762\uff0c\u4fdd\u6301\u6574\u4e2a\u5de5\u7a0b\u7684\u8f7b\u91cf\u5316\uff0c\u8fd9\u6837\u5728\u514b\u9686\u4ee3\u7801\u7684\u65f6\u5019\u624d\u80fd\u975e\u5e38\u5feb\u901f\u65b9\u4fbf\u4f7f\u7528\uff0c\u6211\u4eec\u89c1\u8fc7\u4e00\u4e2a AT \u5de5\u7a0b clone \u5927\u5c0f\u8fbe\u5230\u597d\u51e0\u4e2a G\uff0c\u7b80\u76f4\u4e0d\u53ef\u601d\u8bae\u3002 \u5176\u5b9e\u4ee3\u7801\u6587\u4ef6\u7684\u5927\u5c0f\u662f\u5f88\u5c0f\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u7eaf\u5199\u4ee3\u7801\u968f\u4fbf\u5199\u5de5\u7a0b\u4e5f\u4e0d\u4f1a\u592a\u5927\uff0c\u800c\u6587\u6863\uff08\u5305\u542b\u63d2\u56fe\uff09\u7b49\u8d44\u6e90\u5374\u662f\u5f88\u5360\u7a7a\u95f4\u3002 \u56e0\u6b64\u6211\u4eec\u9009\u62e9\u5c06 YouQu \u7684\u6587\u6863\u5de5\u7a0b\u5355\u72ec\u8fc1\u51fa\u5230\u72ec\u7acb\u7684\u4ed3\u5e93 youqu-docs \u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_6","title":"2\u3001\u5b89\u88c5","text":"\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u8fd0\u884c env.sh \u5373\u53ef\u3002 bash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_4","title":"3\u3001\u5b9a\u5236\u4f9d\u8d56","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_2","title":"3.1\u3001\u65b0\u589e\u4f9d\u8d56","text":"\u5982\u679c\u5e94\u7528\u5e93\u8fd8\u9700\u8981\u5176\u4ed6 Python \u4f9d\u8d56\u5e93\uff0c\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a requirement.txt \u6587\u4ef6\uff1b autotest_xxx\n\u251c\u2500\u2500 requirement.txt\n\u251c\u2500\u2500 case ...\n \u91cc\u9762\u5199\u5165\u9700\u8981\u5b89\u88c5\u7684\u4e09\u65b9\u4f9d\u8d56\uff0c\u6bd4\u5982\u50cf\u8fd9\u6837\uff1a # requirement.txt\nPyYAML==6.0 # \u6307\u5b9a\u5b89\u88c5\u67d0\u4e2a\u7248\u672c\nrequests # \u672a\u6307\u5b9a\u7248\u672c\u5219\u5b89\u88c5\u6700\u65b0\u7248\n \u5728\u6267\u884c bash env.sh \u65f6\u4f1a\u4e00\u5e76\u5c06\u5176\u5b89\u88c5\u3002 \u5982\u679c\u591a\u4e2a\u5e94\u7528\u5e93\u90fd\u5b58\u5728 requirement.txt \u6587\u4ef6\uff0c\u6267\u884c env.sh \u65f6\u4f1a\u5c06\u591a\u4e2a requirement.txt \u6587\u4ef6\u4e00\u5e76\u52a0\u8f7d\uff1b\u90a3\u4e48\u4e00\u5b9a\u8981\u6ce8\u610f\u591a\u4e2a requirement.txt \u6587\u4ef6\u53ef\u80fd\u5b58\u5728\u76f8\u540c\u7684\u4f9d\u8d56\u88ab\u6307\u5b9a\u5b89\u88c5\u4e0d\u540c\u7248\u672c\u7b49\u7b49\u517c\u5bb9\u6027\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32_1","title":"3.2\u3001\u88c1\u526a\u4f9d\u8d56","text":"\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0c\u53ef\u80fd\u4f60\u53ea\u9700\u8981\u5b89\u88c5\u4e00\u4e9b\u6700\u6700\u57fa\u7840\u7684\u4f9d\u8d56\uff0c\u5176\u4ed6\u7684\u90fd\u4e0d\u9700\u8981\uff0c\u6bd4\u5982\u7eaf\u63a5\u53e3\u81ea\u52a8\u5316\u7684\u9879\u76ee\uff0c\u5b83\u4e0d\u9700\u8981 UI \u81ea\u52a8\u5316\u76f8\u5173\u7684\u4f9d\u8d56\u3002 \u4f60\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\uff0c\u5b58\u653e\u4e00\u4e2a BASICENV \u7684\u666e\u901a\u6587\u4ef6\uff0c\u91cc\u9762\u4e0d\u9700\u8981\u5199\u4efb\u4f55\u5185\u5bb9\uff0c\u8fd9\u6837\u6267\u884c env.sh \u65f6\uff0c\u53ea\u4f1a\u5b89\u88c5\u6700\u57fa\u7840\u7684\u4f9d\u8d56\u3002 autotest_xxx\n\u251c\u2500\u2500 BASICENV # \u53ef\u4ee5\u4f7f\u7528\uff1atouch BASICENV \u521b\u5efa\u6587\u4ef6\n\u251c\u2500\u2500 case ...\n \u57fa\u7840\u4f9d\u8d56\u4ec5\u5b89\u88c5\u4ee5\u4e0b\u51e0\u4e2a\u5305\uff1a pytest # pytest\npytest-rerunfailures # \u5931\u8d25\u91cd\u8dd1\u63d2\u4ef6\npytest-timeout # \u7528\u4f8b\u8d85\u65f6\u63d2\u4ef6\nallure-pytest # \u751f\u6210 allure \u62a5\u544a\u63d2\u4ef6\nallure.deb # allure \u62a5\u544a\u67e5\u770b\u5de5\u5177\n \u88c1\u526a\u4f9d\u8d56 \u548c \u65b0\u589e\u4f9d\u8d56 \u662f\u4e0d\u51b2\u7a81\u7684\uff0c\u53ef\u4ee5\u540c\u65f6\u4f7f\u7528\u3002 \u6b64\u65b9\u6848\u9ed8\u8ba4\u4e3a\u865a\u62df\u73af\u5883\u90e8\u7f72\uff0c\u5982\u679c\u4f60\u60f3\u76f4\u63a5\u90e8\u7f72\u5728\u672c\u673a\u4e0a\uff1a bash env_dev.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_8","title":"\u4e5d\u3001\u5931\u8d25\u5f55\u5c4f","text":"\u5f55\u5c4f\u5176\u5b9e\u662f\u4e00\u79cd\u89c6\u9891\u5f62\u5f0f\u7684\u65e5\u5fd7\uff0c\u56e0\u4e3a\u5f88\u591a\u65f6\u5019\u6211\u4eec\u5728\u67e5\u770b\u65e5\u5fd7\u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u51c6\u786e\u7684\u5b9a\u4f4d\u5230\u7528\u4f8b\u5931\u8d25\u7684\u5177\u4f53\u539f\u56e0\uff0c\u56e0\u6b64\u7528\u4f8b\u7684\u5f55\u5c4f\u80fd\u8ba9\u6211\u4eec\u770b\u5230\u7528\u4f8b\u5728\u6267\u884c\u8fc7\u7a0b\uff1b \u3010\u4f7f\u7528\u65b9\u6cd5\u3011 \u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u5173\u6ce8 2 \u4e2a\u53c2\u6570\uff1b ;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\u3002\n;\u6ce8\u610f\uff0c\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u4e0d\u80fd\u5c0f\u4e8e\u5931\u8d25\u5f55\u5c4f\u6b21\u6570\uff0c\u5373 RERUN >= RECORD_FAILED_CASE\nRECORD_FAILED_CASE = 1\n \u9ed8\u8ba4\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u662f 1 \u6b21\uff1b RECORD_FAILED_CASE = 1 \u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff1b RECORD_FAILED_CASE = 0 \u8868\u793a\u4e0d\u7ba1\u7528\u4f8b\u6210\u529f\u6216\u5931\u8d25\u90fd\u5f55\u5c4f\uff1b \u5f55\u5c4f\u662f\u8981\u5360\u7528\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u7279\u522b\u662f\u5728\u4e00\u4e9b\u914d\u7f6e\u8f83\u4f4e\u7684\u673a\u5668\u4e0a\u4f1a\u5f88\u660e\u663e\uff0c\u6240\u4ee5\u4f60\u9700\u8981\u8003\u8651\u662f\u5426\u6709\u5fc5\u8981\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1b \u4f7f\u7528 manage.py \u6267\u884c\u7528\u4f8b\u9ed8\u8ba4\u8bfb\u53d6\u5230 globalconfig.ini \u91cc\u9762\u7684\u53c2\u6570\uff0c\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report/record \u76ee\u5f55\u4e0b\u4fdd\u5b58\u5931\u8d25\u7528\u4f8b\u7684\u5f55\u5c4f\u548c\u65ad\u8a00\u7684\u90a3\u4e2a\u65f6\u95f4\u70b9\u7684\u622a\u5c4f\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7\u89c6\u9891\u6587\u4ef6\u770b\u5230\u5931\u8d25\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u90fd\u53d1\u751f\u4e86\u4ec0\u4e48\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#wayland","title":"\u5341\u3001Wayland \u9002\u914d","text":"Wayland \u4e0b\u81ea\u52a8\u5316\u4e3b\u8981\u95ee\u9898\u662f X11 \u4e0b\u7684\u952e\u9f20\u64cd\u4f5c\u65b9\u6cd5\u65e0\u6cd5\u4f7f\u7528\uff0c\u6bd4\u5982 Xdotool\u3001 PyAutoGUI\u3001Xwininfo \u7b49\u7b49\uff1b YouQu \u5728 Wayland \u4e0b\u517c\u5bb9\u9002\u914d\uff0cenv.sh \u5728 Wayland \u4e0b\u6267\u884c\u65f6\u4f1a\u5b89\u88c5\u81ea\u7814\u7684\u952e\u9f20\u64cd\u4f5c\u670d\u52a1\uff08\u53ef\u80fd\u5b58\u5728\u4e00\u4e9b\u4f9d\u8d56\u62a5\u9519\uff0c\u6309\u7167\u6ce8\u91ca\u89e3\u51b3\u5373\u53ef\uff09\uff0c\u6846\u67b6\u6838\u5fc3\u5e93\u4e5f\u9488\u5bf9\u6027\u7684\u505a\u4e86\u9002\u914d\uff0c\u4e0a\u5c42\u7528\u4f8b\u5b8c\u5168\u4e0d\u7528\u5173\u5fc3\u673a\u5668\u662fWayland \u8fd8\u662f X11\uff0c\u6846\u67b6\u4f1a\u6839\u636e\u6267\u884c\u65f6\u72b6\u6001\u81ea\u52a8\u5224\u65ad\u8d70\u4e0d\u540c\u7684\u903b\u8f91\uff1b \u7b80\u5355\u8bb2\u5c31\u662f\uff0c\u5e94\u7528\u5e93\u53ea\u9700\u8981\u7ef4\u62a4\u4e00\u5957\u7528\u4f8b\u811a\u672c\u5373\u53ef\u3002 \u3010\u7528\u4f8b\u517c\u5bb9\u3011 \u56e0\u4e3a Wayland \u4e0b\u6709\u4e9b\u5e94\u7528\u7684\u754c\u9762\u663e\u793a\u548c\u529f\u80fd\u672c\u8eab\u5b58\u5728\u4e00\u4e9b\u5dee\u5f02\uff0c\u7528\u4f8b\u5c42\u53ef\u80fd\u9700\u8981\u5bf9\u8fd9\u90e8\u5206\u7528\u4f8b\u505a\u903b\u8f91\u5224\u65ad\uff0c\u4f7f\u7528\u5168\u5c40\u914d\u7f6e\u91cc\u9762\u7684\u5e38\u91cf\u8fdb\u884c\u903b\u8f91\u7f16\u5199\u5373\u53ef\uff1a from setting.globalconfig import GlobalConfig\n# GlobalConfig.IS_WAYLAND \u83b7\u53d6\u5230\u5f53\u524d\u7684\u663e\u793a\u670d\u52a1\u5668\uff08bool\uff09\n# \u5e94\u7528\u5e93 Config \u7ee7\u627f GlobalConfig\nif Config.IS_WAYLAND:\npass\nif Config.IS_X11:\npass\n \u6bd4\u5982\u7528\u4f8b\u91cc\u9762\u5982\u679c\u65ad\u8a00\u7684\u56fe\u7247\u4e0d\u540c\uff1a if Config.IS_WAYLAND:\nself.assert_image_exist(\"wayland_XXX\")\nelse:\nself.assert_image_exist(\"x11_XXX\")\n \u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u811a\u672c\u5728 Wayland \u548c X11 \u4e0b\u90fd\u53ef\u4ee5\u8dd1\uff0cso easy \u662f\u4e0d\u662f\uff1f\u5b8c\u5168\u6ca1\u5fc5\u8981\u4e13\u95e8\u62c9\u65b0\u5206\u652f\u8fdb\u884c Wayland \u9002\u914d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_9","title":"\u5341\u4e00\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_7","title":"1. \u76ee\u5f55\u7ed3\u6784","text":"\u6267\u884c\u65f6\u4f1a\u5728\u6839\u76ee\u5f55\u4e0b\u52a8\u6001\u751f\u6210 report \u76ee\u5f55\uff0c\u6240\u6709\u7684\u62a5\u544a\u76f8\u5173\u7684\u6587\u4ef6\u4f1a\u7edf\u4e00\u5b58\u653e\u5728\u91cc\u9762\uff0c\u793a\u4f8b\uff1a /report\n \u251c\u2500\u2500 allure # allure\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json\n \u251c\u2500\u2500 allure_html # \u751f\u6210\u7684html\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 index.html \u251c\u2500\u2500 allure_back # allure\u62a5\u544a\u5907\u4efd\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 20221108114823\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json\n \u251c\u2500\u2500 json # json\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 result_deepin-music_20221109134736_1081333.json\n \u251c\u2500\u2500 logs # \u65e5\u5fd7\u6587\u4ef6\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 2022-11-10_debug.log \u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-10_error.log\n \u251c\u2500\u2500 record # \u5f55\u5c4f\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-09\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 15\u65f614\u520609\u79d2_test_music_303_2_autotest.mp4\n \u2514\u2500\u2500 xml # xml\u62a5\u544a\n\u2514\u2500\u2500 autotest_deepin_music-20221109134736.xml\n \u9ed8\u8ba4\u60c5\u51b5\u4e0b\u540c\u65f6\u751f\u6210 html\u3001xml\u3001json\u4e09\u79cd\u5f62\u5f0f\u7684\u62a5\u544a\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_7","title":"2. \u5b9a\u5236\u62a5\u544a","text":"\u6211\u4eec\u5bf9 allure \u62a5\u544a\u8fdb\u884c\u4e86\u4e00\u7cfb\u5217\u7684\u5b9a\u5236\uff1a \u5b9a\u5236 logo\u3001title\u3001\u62a5\u544a\u9ed8\u8ba4\u8bed\u8a00\u4e3a\u4e2d\u6587\uff1b \u52a0\u5165\u4e86\u7528\u4f8b\u65ad\u8a00\u5931\u8d25\u65f6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u4ee5\u53ca\u6b64\u65f6\u56fe\u50cf\u5bf9\u6bd4\u7684\u6a21\u677f\u56fe\u7247\uff1b \u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\uff0c\u4f60\u53ef\u4ee5\u5728 html \u62a5\u544a\u4e2d\u76f4\u63a5\u770b\u5f55\u5236\u7684\u89c6\u9891\uff1b \u52a0\u5165\u4e86 IP \u5730\u5740\u3001\u7cfb\u7edf\u4fe1\u606f\u3001\u955c\u50cf\u7248\u672c\u7b49\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_5","title":"3. \u67e5\u770b\u62a5\u544a","text":" \u672c\u5730\u6267\u884c \u5728 report/allure \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u4e00\u5806\u6587\u672c\u6587\u4ef6\uff0c\u8fd9\u4e9b\u662f allure \u63d2\u4ef6\u751f\u6210\u7684\u62a5\u544a\u6e90\u6570\u636e\uff0c\u6211\u4eec\u5728 report/allure_html \u76ee\u5f55\u4e0b\u7ed9\u4f60\u751f\u6210\u4e86 html \u6587\u4ef6\uff0c\u4f46\u662f\u4f60\u4e0d\u80fd\u76f4\u63a5\u901a\u8fc7\u6d4f\u89c8\u5668\u6253\u5f00 index.html \u6587\u4ef6\uff0c\u56e0\u4e3a allure \u7684\u62a5\u544a\u90fd\u662f\u57fa\u4e8e\u5728\u7ebf\u7684\u670d\u52a1\uff0c\u4f60\u5e94\u8be5\u8fd9\u6837\u6253\u5f00\uff1a allure open report/allure_html\n \u4f7f\u7528 manage.py \u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u5728\u7ec8\u7aef\u7684\u6700\u540e\u4e00\u884c\uff0c\u6211\u4eec\u4f1a\u7ed9\u4f60\u8f93\u51fa\u6253\u5f00\u62a5\u544a\u7684\u547d\u4ee4\uff0c\u76f4\u63a5\u590d\u5236\u5b83\u5728\u7ec8\u7aef\u6267\u884c\u5c31\u53ef\u4ee5\u67e5\u770b\u4e86\uff0c\u50cf\u8fd9\u6837\uff1a \u7ec8\u7aef\u6267\u884c\u547d\u4ee4: allure open /tmp/youqu/report/allure_html \u67e5\u770b\u62a5\u544a \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 Pycharm \u91cc\u9762\u627e\u5230 index.html \u6587\u4ef6\uff0c\u7136\u540e\u53f3\u952e\u9009\u62e9\u6d4f\u89c8\u5668\u6253\u5f00\uff0c\u6216\u8005\u4f60\u53ef\u4ee5\u7528\u4e00\u4e2a http \u670d\u52a1\u6253\u5f00\u3002 \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 report/allure \u76ee\u5f55\u4e0b\u67e5\u770b\u62a5\u544a\uff1a allure serve report/allure\n \u8fdc\u7a0b\u6267\u884c \u8fdc\u7a0b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\uff0c\u4f1a\u5c06\u6240\u6709\u8fdc\u7a0b\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u62a5\u544a\u90fd\u6536\u96c6\u5230 report/allure \u76ee\u5f55\u4e0b\uff0c\u5206\u522b\u6309\u7167\u673a\u5668\u7684 IP \u7b49\u5efa\u4e86\u4e0d\u540c\u7684\u76ee\u5f55\uff0c\u4f60\u53ef\u4ee5\u5728\u8fd9\u4e9b\u76ee\u5f55\u91cc\u9762\u53bb\u67e5\u770b\u5bf9\u5e94\u7684\u6d4b\u8bd5\u62a5\u544a\uff0c\u67e5\u770b\u65b9\u6cd5\u548c\u524d\u9762\u672c\u5730\u6267\u884c\u67e5\u770b\u7684\u65b9\u6cd5\u4e00\u6837\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_10","title":"\u5341\u4e8c\u3001\u9759\u6001\u4ee3\u7801\u626b\u63cf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_8","title":"1. \u63d0\u524d\u89e3\u51b3\u4ee3\u7801\u95ee\u9898","text":"\u4e3a\u4e86\u5e2e\u52a9\u5f00\u53d1\u8005\u7edf\u4e00\u4ee3\u7801\u98ce\u683c\uff0cPython \u793e\u533a\u63d0\u51fa\u4e86 PEP8 \u4ee3\u7801\u7f16\u7801\u98ce\u683c\uff0cPython \u5b98\u65b9\u540c\u65f6\u63a8\u51fa\u4e86\u4e00\u4e2a\u68c0\u67e5\u4ee3\u7801\u98ce\u683c\u662f\u5426\u7b26\u5408 PEP8 \u7684\u5de5\u5177\uff0c\u540d\u5b57\u4e5f\u53eb PEP8\u3002 \u4f46\u662f\uff0cPycharm \u91cc\u9762\u7684 PEP8 \u63d2\u4ef6\u5b9e\u9645\u4e0a\u5e76\u4e0d\u80fd\u53d1\u73b0\u5f88\u591a\u4ee3\u7801\u95ee\u9898\uff0c\u8fd9\u4e9b\u95ee\u9898\u5e76\u4e0d\u4f1a\u5728\u8fd0\u884c\u65f6\u62a5\u9519\uff0c\u56e0\u4e3a\u4ece Python \u8bed\u8a00\u89d2\u5ea6\u5e76\u4e0d\u5173\u5fc3\u8fd9\u4e9b\u95ee\u9898\uff0c\u5728 Pycharm \u7f16\u8f91\u5668\u91cc\u9762\u4f7f\u7528\u5feb\u6377\u952e ctrl + alt + L\uff0c\u6709\u4e00\u70b9\u70b9\u683c\u5f0f\u5316\u7684\u6548\u679c\uff0c\u80fd\u89e3\u51b3\u4e00\u4e9b\u7a7a\u683c\u3001\u6362\u884c\u7b49\u5c0f\u95ee\u9898\u3002 \u8fd9\u91cc\u63a8\u8350\u4e00\u4e2a Python \u793e\u533a\u6d41\u884c\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff1a Black\uff0c\u53f7\u79f0\u4e0d\u59a5\u534f\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff0c\u5b83\u68c0\u6d4b\u5230\u4e0d\u7b26\u5408\u89c4\u8303\u7684\u4ee3\u7801\u98ce\u683c\u76f4\u63a5\u5c31\u5e2e\u4f60\u5168\u90e8\u683c\u5f0f\u5316\u597d\uff0c\u5c31\u662f\u8fd9\u4e48\u521a\uff01 \u5b89\u88c5\uff1a sudo pip3 install black \n \u4f7f\u7528\u65b9\u6cd5\uff1a black ${CheckPath}\n \u4f7f\u7528\u8fd9\u4e2a\u5de5\u5177\u683c\u5f0f\u5316\u4e4b\u540e\uff0c\u4ee3\u7801\u4f1a\u88ab\u81ea\u52a8\u8c03\u6574\uff0c\u521a\u5f00\u59cb\u4f60\u53ef\u80fd\u4f1a\u89c9\u5f97\u8c03\u6574\u5f97\u5f88\u5938\u5f20\uff0c\u6ca1\u5173\u7cfb\u575a\u6301\u770b\uff0c\u4e60\u60ef\u4e4b\u540e\uff0c\u4f60\u4f1a\u89c9\u5f97\u5f88\u4f18\u96c5\uff0c\u6ca1\u9519\uff0c\u8fd9\u5c31\u662f Pythonic Code \u7684\u6838\u5fc3\uff0c\u8bf7\u4fdd\u6301\u4f18\u96c5\uff5e\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_8","title":"2. \u4ee3\u7801\u626b\u63cf\u5de5\u5177","text":"\u4f7f\u7528\u6839\u76ee\u5f55\u4e0b pylint.sh \u626b\u63cf\u4ee3\u7801\uff0c\u5728 report \u76ee\u5f55\u4e0b\u67e5\u770b\u4ee3\u7801\u626b\u63cf\u62a5\u544a\uff0c\u5982\u679c\u6709\u4ee3\u7801\u95ee\u9898\u8bf7\u63d0\u524d\u89e3\u51b3\u4e4b\u540e\u518d\u63d0\u4ea4\u3002 \u6b64\u811a\u672c\u5df2\u7ecf\u4f7f\u7528 Python \u793e\u533a\u6700\u6d41\u884c\u7684\u4ee3\u7801\u626b\u63cf\u5de5\u5177 Pylint \u8fdb\u884c\u4ee3\u7801\u626b\u63cf\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a bash pylint.sh\n \u8fd0\u884c\u4e4b\u540e\u4f1a\u63d0\u793a\u4f60\u8981\u626b\u63cf\u7684\u76ee\u5f55\uff0c\u6bd4\u5982\u8f93\u5165 apps \uff0c\u5219\u4f1a\u626b\u63cf apps \u4e0b\u7684\u6240\u6709 Python \u4ee3\u7801\u3002 \u5728 setting/pylintrc.cfg \u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u76f8\u5173\u914d\u7f6e\uff0c\u626b\u63cf\u5b8c\u6210\u4e4b\u540e\u5728 report/pylints \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u626b\u63cf\u62a5\u544a\u3002 \u4ee3\u7801\u63d0\u4ea4\u9700\u901a\u8fc7 git review \u63d0\u4ea4\u5230 gerrit \uff0c\u4eba\u5de5 Code Review \u901a\u8fc7\u4e4b\u540e\u5408\u5165\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_11","title":"\u5341\u4e09\u3001\u63d0\u4ea4\u4ee3\u7801","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_9","title":"1. \u5b89\u88c5\u4f9d\u8d56","text":"sudo apt install git-review\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_9","title":"2. \u63d0\u4ea4\u6a21\u677f","text":"\u5728 ~ \u76ee\u5f55\u4e0b\u65b0\u5efa\u6587\u4ef6\uff0c\u5e76\u547d\u540d\u4e3a gitcommit_template \u5c06\u4ee5\u4e0b\u5185\u5bb9\u5199\u5165\u6587\u4ef6\u5f53\u4e2d\uff1a # commit type :fix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style(\u98ce\u683c\u4fee\u6539)\u3001refactor(\u91cd\u6784)\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test(\u6d4b\u8bd5) + \u7b80\u5355\u63cf\u8ff0. \u9ed8\u8ba4fix,\u6839\u636e\u60c5\u51b5\u4fee\u6539\nfix: \n\n# \u8be6\u7ec6\u8bf4\u660e\u4ee3\u7801\u7684\u6539\u52a8\uff0c\u5305\u542b\u4ee3\u7801\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u4ee5\u53ca\u4e3a\u4ec0\u4e48\u8fd9\u4e48\u505a\uff0c\u53ef\u80fd\u4f1a\u5f71\u54cd\u54ea\u4e9b\u529f\u80fd\u3002\u5bf9\u4e8e\u4ee3\u7801\u7684\u5ba1\u6838\u8005\uff0c\u9700\u8981\u4ece\u8fd9\u6bb5\u63cf\u8ff0\u4e2d\u80fd\u5b8c\u5168\u7406\u89e3\u4ee3\u7801\u4e2d\u6240\u6709\u6539\u52a8\u7684\u5185\u5bb9\nDescription: \n\n# \u5199\u4e00\u6bb5\u9762\u5411\u4e8e\u4ea7\u54c1\u7684\u603b\u7ed3\u6027\u5185\u5bb9\uff0c\u7528\u4e8e\u81ea\u52a8\u751f\u6210crp\u4e0a\u7684changlog\uff0c\u9700\u8981\u6ce8\u610f\u7684\u4e8b\uff0c\u8fd9\u6bb5\u63cf\u8ff0\u5fc5\u987b\u4ece\u4ea7\u54c1\u7684\u89d2\u5ea6\u8003\u8651\u3002\nLog: \n\n# \u5173\u8054pms\u4e0a\u7684bug\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94bug\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4fee\u590dbug\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Bug: \n\n# \u4fee\u590d github issue \n#Issue: \n\n# \u5173\u8054pms\u4e0a\u7684\u4efb\u52a1\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94\u4efb\u52a1\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4efb\u52a1\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Task: \n \u547d\u4ee4\u884c\u6267\u884c: git config --global commit.template ~/gitcommit_template\n \u6b64\u547d\u4ee4\u5c06\u6a21\u677f\u52a0\u5165\u5230 git \u7684\u63d0\u4ea4\u6a21\u677f\u4e2d\u3002 \u540e\u7eed\u63d0\u4ea4\u7684\u65f6\u5019\u9700\u8981\u5173\u6ce8\u4e00\u4e0b\u51e0\u70b9\uff1a commit type \u5bf9\u5e94\u4e0d\u540c\u7684\u4fee\u6539\u7c7b\u578b\uff1afix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style \uff08\u98ce\u683c\u4fee\u6539\uff09\u3001refactor \uff08\u91cd\u6784\uff09\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test \uff08\u6d4b\u8bd5\uff09 commit type \u5192\u53f7\u540e\u9762\u52a0\u7a7a\u683c\u3002 Description \u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u9700\u8981\u8fdb\u884c\u8be6\u7ec6\u8bf4\u660e\uff0c\u6bd4\u5982\u5bf9\u529f\u80fd\u8fdb\u884c\u5927\u6539\u7b49\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_6","title":"3. \u63a8\u9001\u4ee3\u7801","text":"\u9996\u5148\u6dfb\u52a0 commit \u4fe1\u606f git add \u540e\u9762\u52a0\u6587\u4ef6\u540d\u79f0\n git add . # \u8868\u793a\u6dfb\u52a0\u6240\u6709\u6587\u4ef6\n \u4f7f\u7528\u8fd9\u6761\u547d\u4ee4\u6ce8\u610f\u6709\u4e9b\u4e34\u65f6\u6587\u4ef6\u4e0d\u8981\u63d0\u4ea4\u5230\u4ed3\u5e93\u4e86\u3002 git commit -a\n \u4e4b\u540e\u5728 fix: \u540e\u9762\uff08\u6ce8\u610f\u5192\u53f7\u540e\u9762\u5fc5\u987b\u52a0\u7a7a\u683c\uff0c\u4e0d\u7136\u76f4\u63a5-1\uff09\u5199\u672c\u5730\u63d0\u4ea4\u7684 commit \u4fe1\u606f\uff0c\u7136\u540e\u5c31\u53ef\u4ee5\u63d0\u4ea4\u4ee3\u7801\u4e86 git review branch(\u5f53\u524d\u5206\u652f) -r origin\n \u6700\u597d\u4e00\u6b21 commit\uff0c\u4e00\u6b21 git review \uff0c\u7ecf\u5e38\u6709\u540c\u5b66\u5728\u672c\u5730\u75af\u72c2 commit \u6700\u540e git review \u62a5\u9519\u4e0d\u77e5\u9053\u548b\u56de\u4e8b\u513f\u3002 \u82e5\u4e0d\u60f3\u6bcf\u6b21\u63d0\u4ea4\u90fd\u52a0\u4e0a -r \u9009\u9879\uff0c\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a git config --global gitreview.remote origin \u63d0\u4ea4\u4ee3\u7801\uff0c\u76f4\u63a5\u4f7f\u7528 git review branch<\u76ee\u6807\u5206\u652f>\uff0c\u4f8b\u5982 git review master"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git","title":"4. Git\u6807\u7b7e","text":"Git \u6807\u7b7e\u5b9e\u9645\u4e0a\u662f commit \u7684\u4e00\u4e2a\u522b\u540d\uff0c\u4e3b\u8981\u7528\u4e8e\u7ba1\u7406\u5386\u53f2\u7248\u672c\u3002 \u60f3\u8c61\u4e00\u4e0b\u9886\u5bfc\u8ba9\u4f60\u628a\u4e4b\u524d\u7684\u67d0\u4e2a\u7248\u672c\u7684\u4ee3\u7801\u62c9\u51fa\u6765\u8dd1\uff0c\u4f60\u662f\u4e0d\u662f\u4e56\u4e56\u7684\u53bb\u628a\u6240\u6709\u63d0\u4ea4\u8bb0\u5f55\u62c9\u51fa\u6765\u627e\uff0c\u7136\u540e\u627e\u5230\u90a3\u4e2a\u54c8\u5e0c\u503c\uff0c\u901a\u8fc7\u54c8\u5e0c\u503c\u6765\u68c0\u51fa\u4ee3\u7801\u3002 \u8fd9\u4e00\u5957\u64cd\u4f5c\u4e0b\u6765\u662f\u4e0d\u662f\u5f88\u9ebb\u70e6\uff0c\u8d39\u65f6\u95f4\u8fd8\u4e0d\u4e00\u5b9a\u80fd\u627e\u5f97\u5230\uff0c\u6ca1\u4eba\u80fd\u8bb0\u4f4f\u6bcf\u4e2a\u63d0\u4ea4\u54c8\u5e0c\u503c\u4ee5\u53ca\u8fd9\u6b21\u63d0\u4ea4\u90fd\u6539\u4e86\u54ea\u4e9b\u4ee3\u7801\u3002 \u56e0\u6b64\u7ed9\u63d0\u4ea4\u6253\u4e2a\u6807\u7b7e\uff0c\u5c31\u662f\u628a\u54c8\u5e0c\u503c\u8f6c\u6362\u6210\u4eba\u7c7b\u80fd\u7406\u89e3\u7684\u8bed\u8a00\uff0c\u6bd4\u5982 v1.0\uff0c\u5c31\u53ef\u4ee5\u76f4\u63a5\u901a\u8fc7\u6807\u7b7e\u627e\u5230\u5bf9\u5e94\u7684\u63d0\u4ea4\u3002 \u65b0\u5efa\u6807\u7b7e git tag -a <tagname>\n \u56de\u8f66\u4e4b\u540e\uff0cGit \u4f1a\u6253\u5f00\u4f60\u7684\u7f16\u8f91\u5668\uff0c\u8ba9\u4f60\u5199\u4e00\u53e5\u6807\u7b7e\u6ce8\u89e3\uff0c\u5c31\u50cf\u4f60\u7ed9\u63d0\u4ea4\u5199\u6ce8\u89e3\u4e00\u6837\u3002 \u67e5\u770b\u6240\u6709\u6807\u7b7e git tag -l\n# git tag \u4e5f\u884c\n \u5220\u9664\u6807\u7b7e git tag -d <tagname>\n \u63a8\u9001\u6807\u7b7e\u81f3\u8fdc\u7a0b git push \u547d\u4ee4\u5e76\u4e0d\u4f1a\u4f20\u9001\u6807\u7b7e\u5230\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\uff0c\u5fc5\u987b\u663e\u5f0f\u5730\u63a8\u9001\u6807\u7b7e\u3002 git push origin <tagname>\n \u63a8\u9001\u6240\u6709\u4e0d\u5728\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\u7684\u6807\u7b7e git push origin --tag\n \u5220\u9664\u8fdc\u7a0b\u6807\u7b7e git push origin :refs/tag/<tagname>\n \u540e\u671f\u6253\u6807\u7b7e \u5148\u7528 git log --pretty=oneline \u67e5\u8be2\u63d0\u4ea4\u8bb0\u5f55\uff0c\u83b7\u53d6\u6821\u9a8c\u7801\u3002 git tag -a <tagname> 9fceb02(\u6821\u9a8c\u7801)\n \u68c0\u51fa\u6807\u7b7e git checkout <tagname>\n \u6b64\u65f6\uff0c\u4ed3\u5e93\u4f1a\u5904\u4e8e\u201c\u5206\u79bb\u5934\u6307\u9488\uff08detached HEAD\uff09\u201d\u7684\u72b6\u6001\u3002 \u5728\u201c\u5206\u79bb\u5934\u6307\u9488\u201d\u72b6\u6001\u4e0b\uff0c\u5982\u679c\u4f60\u505a\u4e86\u67d0\u4e9b\u66f4\u6539\u7136\u540e\u63d0\u4ea4\u5b83\u4eec\uff0c\u6807\u7b7e\u4e0d\u4f1a\u53d1\u751f\u53d8\u5316\uff0c \u4f46\u4f60\u7684\u65b0\u63d0\u4ea4\u5c06\u4e0d\u5c5e\u4e8e\u4efb\u4f55\u5206\u652f\uff0c\u5e76\u4e14\u5c06\u65e0\u6cd5\u8bbf\u95ee\uff0c\u9664\u975e\u901a\u8fc7\u786e\u5207\u7684\u63d0\u4ea4\u54c8\u5e0c\u624d\u80fd\u8bbf\u95ee\u3002 \u56e0\u6b64\uff0c\u5982\u679c\u4f60\u9700\u8981\u8fdb\u884c\u66f4\u6539\uff0c\u6bd4\u5982\u4f60\u8981\u4fee\u590d\u65e7\u7248\u672c\u4e2d\u7684\u9519\u8bef\uff0c\u90a3\u4e48\u901a\u5e38\u9700\u8981\u521b\u5efa\u4e00\u4e2a\u65b0\u5206\u652f\uff1a git checkout -b <NewBranchName> <tagname>\n \u65b0\u5206\u652f\u4e0a\u53ef\u4ee5\u8fdb\u884c\u63d0\u4ea4\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_12","title":"\u5341\u56db\u3001\u5e38\u89c1\u95ee\u9898","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_10","title":"1. \u63d0\u4ea4\u4ee3\u7801\u65f6\u63d0\u793a\u90ae\u7bb1\u6216\u8005\u540d\u79f0\u4e0d\u5bf9","text":"\u91cd\u65b0\u914d\u7f6e\u90ae\u7bb1\u6216\u8005\u540d\u79f0\uff0c\u7136\u540e\u91cd\u7f6e\u751f\u6548\uff1a git commit --amend --reset-author\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_10","title":"2. \u600e\u4e48\u56de\u6eda\u5230\u4e4b\u524d\u7684\u7248\u672c","text":"(1)\u67e5\u8be2\u5386\u53f2\u63d0\u4ea4\u8bb0\u5f55 git log\n \u627e\u5230\u4f60\u8981\u56de\u6eda\u7684\u7248\u672c\uff0c\u590d\u5236 hash \u503c\u3002 \u6ce8\u610f\uff1a\u662f commit \u7a7a\u683c\u4e4b\u540e\u7684 hash \u503c\uff0c\u4e4b\u524d\u6709\u540c\u5b66\u590d\u5236\u7684 Change-Id: \u8fd9\u6837\u80af\u5b9a\u62a5\u9519\u3002 (2)\u56de\u6eda\u7248\u672c\uff0c\u4e0d\u6e05\u9664\u4ee3\u7801 git reset --soft ${hash}\n (3)\u56de\u6eda\u7248\u672c\uff0c\u6e05\u9664\u4ee3\u7801\uff0c\u614e\u7528\u54c8 git reset --hard ${hash}\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-f-s-e","title":"3. \u6d4b\u8bd5\u62a5\u544a\u91cc\u9762 F S . E \u662f\u4ec0\u4e48\u610f\u601d","text":"F \u8868\u793a\u5931\u8d25\uff0c. \uff08\u70b9\uff09\u8868\u793a\u901a\u8fc7\uff0cS \u8868\u793a\u8df3\u8fc7\uff0cE \u8868\u793a error \u6709\u62a5\u9519"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git-status","title":"4. \u89e3\u51b3 git status \u4e2d\u6587\u663e\u793a\u7684\u95ee\u9898","text":"git config --global core.quotePath false\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5-apps","title":"5. apps \u76ee\u5f55\u4e0b\u989c\u8272\u6709\u4e9b\u662f\u9ec4\u8272\u7684","text":"\u5728 Pycharm \u4e2d apps \u76ee\u5f55\u4e0b\u5e94\u7528\u5e93\u6587\u4ef6\u662f\u9ec4\u8272\u7684\uff0c\u7f16\u8f91\u5668\u8bc6\u522b\u4e0d\u5230\u4ee3\u7801\u65b0\u589e\u548c\u4fee\u6539\uff1b \u7531\u4e8e\u793e\u533a\u7248 Pycharm \u4e0d\u80fd\u52a8\u6001\u8bc6\u522b\u591a\u4ed3\u5e93\uff0c\u9700\u8981\u5728 setting \u91cc\u9762\u624b\u52a8\u6ce8\u518c\uff0c\u64cd\u4f5c\u6b65\u9aa4\uff1a File \u2014> Settings \u2014> Version Control \u2014> \u70b9 + \u53f7 \u2014> Directory \u9009\u4e2d\u5e94\u7528\u5e93\u5de5\u7a0b\u76ee\u5f55 \u2014> VCS \u9009\u4e2d Git \u2014> Apply \u5982\u6b64\u5c31\u53ef\u4ee5\u4e86\u3002 \u4e13\u4e1a\u7248 Pycharm \u4e0d\u5b58\u5728\u8fd9\u4e2a\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#6-envsh-r","title":"6. \u6267\u884c env.sh \u62a5\u9519 $'\\r':\u672a\u627e\u5230\u547d\u4ee4","text":"\u51fa\u73b0\u8fd9\u4e2a\u95ee\u9898\u4f60\u5e94\u8be5\u662f\u5728 windows \u4e0a\u6253\u5f00\u6216\u7f16\u8f91\u8fc7 env.sh \u811a\u672c\uff0cwindows\u4e0b\u7684\u6362\u884c\u662f\u56de\u8f66\u7b26+\u6362\u884c\u7b26\uff0c\u4e5f\u5c31\u662f\\r\\n\uff0c\u800c Linxu \u4e0b\u662f\u6362\u884c\u7b26 \\n\uff0cLinux \u4e0b\u4e0d\u8bc6\u522b \\r\uff0c\u56e0\u6b64\u62a5\u9519\u3002 \u89e3\u51b3\u65b9\u6848\uff1a # \u5c06 \\r \u66ff\u6362\u4e3a\u7a7a\nsudo sed -i 's/\\r//' env.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#7","title":"7.\u600e\u6837\u4e3a\u5355\u72ec\u67d0\u4e00\u6761\u7528\u4f8b\u914d\u7f6e\u6267\u884c\u8d85\u65f6\u65f6\u95f4","text":"\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u5982\u4e0b\uff1a @pytest.mark.timeout(300) # \u5355\u4f4d\u79d2\ndef test_xxx_001():\npass\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#8-youqu","title":"8. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u6240\u6709\u4ee3\u7801\uff0c\u5305\u542b\u5b50\u4ed3\u5e93","text":"\u524d\u7f6e\u6761\u4ef6\uff1a\u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 # \u7b2c\u4e00\u6b21\u5b58\u50a8\u5bc6\u7801\uff0c\u63d0\u4f9b\u540e\u9762\u62c9\u4ee3\u7801(gerrit: ldap\u8d26\u53f7\u548c\u5bc6\u7801\uff0cgit\u62c9\u53d6\u7b2c\u4e00\u6b21\u8f93\u5165\u4fdd\u5b58\uff0c\u540e\u9762\u76f4\u63a5\u4f7f\u7528)\ngit config --global credential.helper store\n\n# \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\uff0c\u5e76\u9012\u5f52\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\" --recursive\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#9-youqu","title":"9. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\u6307\u5b9a\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u524d\u7f6e\u6761\u4ef6\uff1a \u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 \u5df2\u5b58\u50a8\u8bbf\u95ee\u5bc6\u7801 # \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\"\n# \u6307\u5b9a\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ncd youqu\ngit submodule update --init apps/autotest_xxx_xxx\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#10-youqu","title":"10. \u5982\u4f55\u66f4\u65b0 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\uff0c\u6240\u6709\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u66f4\u65b0\u6240\u6709\u5b50\u4ed3\u5e93\u4ee3\u7801 cd youqu\ngit pull & git submodule foreach git pull\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#11-youqu-master-detached-head","title":"11. \u5982\u4f55\u4fee\u590d YouQu \u6240\u6709\u5b50\u4ed3\u5e93 master \u5206\u652f\u6e38\u79bb\u5934\uff08detached head\uff09","text":"\u4fee\u590d\u6240\u6709\u5b50\u4ed3\u5e93\u9ed8\u8ba4master \u5206\u652f\u6e38\u79bb\u5934 cd youqu\ngit submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/","title":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212 \u5206\u7c7b\uff1a/ \u67b6\u6784\u5e08\uff1a/ \u76ee\u6807\uff1a \u5e94\u7528 AT \u67b6\u6784\u5de5\u7a0b\u5316\uff0c\u53c2\u8003\u6027\u80fd\u81ea\u52a8\u5316\u5de5\u7a0b\u5b8c\u6210\u5de5\u7a0b\u5316\u6539\u9020\u3002 \u5e94\u7528\u95f4\u7528\u4f8b\u89e3\u8026\uff0c\u89e3\u9664\u6240\u6709\u4ea4\u53c9\u8c03\u7528\u7684\u65b9\u6cd5\uff0c\u5404\u5e94\u7528\u80fd\u8ddf\u968f\u81ea\u8eab\u8fed\u4ee3\u5468\u671f\u72ec\u7acb\u7ef4\u62a4 AT \u7528\u4f8b\u3002 \u5b8c\u6210\u516c\u5171\u65b9\u6cd5\u7684\u62bd\u53d6\u6574\u5408\uff0c\u5f62\u6210\u4e00\u5957\u72ec\u7acb\u4e8e\u5e94\u7528\u95f4\u7684\u516c\u5171\u65b9\u6cd5\u5e93\uff0c\u5404\u5e94\u7528\u65b9\u6cd5\u91cc\u9762\u4e0d\u5b58\u5728\u88ab\u591a\u4e2a\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\u3002 \u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u4e3a\u5c06\u6765\u9002\u914d\u66f4\u591a\u7684 AT \u8fd0\u7528\u573a\u666f\u63d0\u4f9b\u652f\u6491\uff0c\u539f\u5219\u4e0a\u53ef\u5b9e\u73b0\u65e0\u9650\u6269\u5c55\uff0c\u5728\u6bcf\u65e5\u6784\u5efa\u548c\u6301\u7eed\u96c6\u6210\u6d41\u7a0b\u843d\u5730\u4f7f\u7528\u3002 \u4ee3\u7801\u89c4\u8303\u95ee\u9898\u6e05\u96f6\uff0c\u7b26\u5408 Shell Check\u3001Pylint\u3001\u7cfb\u7edf\u90e8\u76f8\u5173\u7f16\u7801\u89c4\u8303\u8981\u6c42\u3002 \u610f\u4e49\uff1a \u7edf\u4e00\u6210\u7814 AT \u67b6\u6784\u8bbe\u8ba1\u601d\u8def\uff0c\u6d88\u9664 AT \u4ee3\u7801\u5b9e\u73b0\u548c\u7ef4\u62a4\u4e0a\u53ef\u80fd\u51fa\u73b0\u7684\u5206\u6b67\uff0c\u6539\u5584\u5386\u53f2 AT \u65e0\u5de5\u7a0b\u5316\u8bbe\u8ba1\u7684\u7f3a\u9677\uff0c\u63d0\u9ad8\u67b6\u6784\u4e13\u4e1a\u6027\u3002 \u5404\u5e94\u7528 AT \u4ee3\u7801\u76f8\u4e92\u72ec\u7acb\uff0c\u5951\u5408\u5e94\u7528\u72ec\u7acb\u53d1\u5e03\u7279\u6027\uff0c\u53ef\u652f\u6301\u8fed\u4ee3\u671f\u95f4\u72ec\u7acb\u65b0\u589e\u3001\u7ef4\u62a4\u548c\u6267\u884c\u3002 \u65b9\u6cd5\u8c03\u7528\u903b\u8f91\u5f97\u5230\u7b80\u5316\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u66f4\u9ad8\u6548\uff1b\u516c\u5171\u5e93\u62bd\u53d6\uff0c\u51cf\u5c11\u65b9\u6cd5\u91cd\u590d\u7f16\u5199\uff0c\u63d0\u9ad8\u4ee3\u7801\u5229\u7528\u7387\uff1b\u5e73\u5747\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u4ece40\u5206\u949f\u964d\u4f4e\u81f330\u5206\u949f\uff0c\u65e5\u4ea7\u51fa\u7528\u4f8b\u4ece12\u6761/\u5929\u63d0\u5347\u81f316\u6761/\u5929\u3002 \u53ef\u7075\u6d3b\u652f\u6491\u4e0d\u540c\u7684\u81ea\u52a8\u5316\u8fd0\u7528\u573a\u666f\uff0c\u5982 CI\u3001\u5192\u70df\u6d4b\u8bd5\u3001\u96c6\u6210\u6d4b\u8bd5\u3001\u56de\u5f52\u6d4b\u8bd5\u3001\u4e13\u9879\u6d4b\u8bd5\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_2","title":"\u4e00\u3001\u80cc\u666f\u4ecb\u7ecd","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1","title":"1\u3001\u73b0\u6709\u67b6\u6784\u4ecb\u7ecd","text":"\u73b0\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u6574\u4f53\u5206\u4e3a\u4e09\u5c42\uff1a\u7528\u4f8b\u5c42\uff08\u4e1a\u52a1\u903b\u8f91\u5c42\uff09\u3001\u4e2d\u95f4\u5c42\uff08\u5143\u7d20\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff09\u3001\u6838\u5fc3\u5c42\uff08\u5e95\u5c42\u529f\u80fd\u5e93\u5c42\uff09\u3002 \u7528\u4f8b\u5c42\uff1a\u5373\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4e13\u6ce8\u4e8e\u4e1a\u52a1\u529f\u80fd\u903b\u8f91\uff0c\u4e0d\u5173\u5fc3\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\uff1b \u4e2d\u95f4\u5c42\uff1a\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff0c\u6bcf\u4e2a\u65b9\u6cd5\u5747\u5bf9\u5e94\u4e00\u4e2a\u5143\u7d20\u7684\u4e00\u4e2a\u5177\u4f53\u64cd\u4f5c\uff0c\u4e5f\u53ef\u4ee5\u662f\u591a\u4e2a\u64cd\u4f5c\u7684\u7ec4\u5408\u64cd\u4f5c\uff0c\u4e2d\u95f4\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u7528\u4f8b\u5c42\uff0c\u5177\u6709\u53ef\u6269\u5c55\u6027\u548c\u590d\u7528\u6027\uff1b \u6838\u5fc3\u5c42\uff1a\u4e3b\u8981\u5c01\u88c5\u7684\u5e95\u5c42\u529f\u80fd\u5b9e\u73b0\uff0c\u6b64\u5c42\u5728\u6846\u67b6\u4e2d\u63d0\u4f9b\u4e00\u4e9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u529f\u80fd\u6a21\u5757\u76f8\u5bf9\u72ec\u7acb\uff0c\u6838\u5fc3\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u64cd\u4f5c\u5c42\uff0c\u6bd4\u5982\uff1a\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7 UI \u5750\u6807\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u952e\u9f20\u64cd\u4f5c\u7684\u57fa\u7840\u65b9\u64cd\u4f5c\u6a21\u5757\u3001Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757\u3001\u6587\u4ef6\u7684\u589e\u5220\u6539\u67e5\u64cd\u4f5c\u6a21\u5757\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2","title":"2\u3001\u81ea\u52a8\u5316\u7684\u5e94\u7528","text":"2.1\u3001CI \u6d41\u7a0b \u6bcf\u65e5\u6784\u5efa\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u7814\u53d1\u6bcf\u65e5\u63d0\u4ea4\u7684\u4ee3\u7801\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u73ed\u4e4b\u540e\u4f1a\u5c06\u5404\u5e94\u7528\u8fdb\u884c\u6253\u5305\uff0c\u7136\u540e\u5728\u6d4b\u8bd5\u673a\u4e0a\u5b89\u88c5\u66f4\u65b0 deb \u5305\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u5e94\u7528\u63d0\u4ea4\u96c6\u6210\u7684\u7248\u672c\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u8f7d\u6700\u65b0\u7684 ISO \u8fdb\u884c PXE \u90e8\u7f72\uff0c\u7136\u540e\u6d4b\u8bd5\u673a\u5b89\u88c5\u6700\u65b0\u7684\u955c\u50cf\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 2.2\u3001\u9a8c\u6536\u6d4b\u8bd5 \u5728\u5404\u9a8c\u6536\u8282\u70b9\u8fdb\u884c\u81ea\u52a8\u5316\u9a8c\u6536\uff0c\u76ee\u524d\u7684\u7b56\u7565\u662f\u5168\u7528\u4f8b\u8986\u76d6\u5168\u67b6\u6784\u3002 2.3\u3001\u56de\u5f52\u6d4b\u8bd5 \u56de\u5f52\u6d4b\u8bd5\u4eca\u5e74\u89c4\u5212\u5efa\u8bbe\u4e2d\uff0c\u65e8\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u6267\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\uff0c\u51cf\u5c11\u529f\u80fd\u6d4b\u8bd5\u7684\u91cd\u590d\u52b3\u52a8\u529b\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3","title":"3\u3001\u5b58\u5728\u7684\u95ee\u9898","text":" \u5404\u5e94\u7528\u4e4b\u95f4\u5b58\u5728\u8026\u5408 \u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u521d\u671f\uff0c\u6240\u6709\u5e94\u7528\u662f\u6574\u4f53\u53d1\u5e03\uff0c\u6211\u4eec\u662f\u5c06\u6240\u6709\u5e94\u7528\u770b\u6210\u662f\u4e00\u4e2a\u6574\u4f53\uff0c\u5404\u5e94\u7528\u4f5c\u4e3a\u5176\u4e2d\u7684\u4e00\u4e2a\u6a21\u5757\uff0c\u6240\u4ee5\u5b58\u5728\u5e94\u7528\u95f4\u65b9\u6cd5\u4ea4\u53c9\u8c03\u7528\u7684\u95ee\u9898\uff0c\u8fd9\u6837\u4ece\u6700\u521d\u7684\u8bbe\u8ba1\u6765\u8bb2\u786e\u5b9e\u80fd\u591f\u51cf\u5c11\u91cd\u590d\u4ee3\u7801\u7684\u7f16\u5199\u3002\u4f46\u662f\u73b0\u5728\u5e94\u7528\u8d70\u72ec\u7acb\u53d1\u5e03\uff0c\u5404\u5e94\u7528\u90fd\u6709\u81ea\u5df1\u7684\u8fed\u4ee3\u8282\u594f\uff0c\u5728\u65b0\u9700\u6c42\u5feb\u901f\u53d8\u5316\u7684\u8fc7\u7a0b\u4e2d\uff0c\u81ea\u52a8\u5316\u7ef4\u62a4\u53d8\u5f97\u5f02\u5e38\u56f0\u96be\uff0c\u539f\u56e0\u5c31\u662f\u81ea\u52a8\u5316\u9879\u76ee\u91cc\u9762\u5404\u4e2a\u5e94\u7528\u7684\u6709\u6bd4\u8f83\u591a\u7684\u8026\u5408\u5173\u7cfb\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u8fdb\u884c\u89e3\u8026\uff0c\u4ee5\u9002\u5e94\u5e94\u7528\u4e0d\u540c\u7684\u8fed\u4ee3\u5468\u671f\u3002 \u65e0\u6cd5\u7cbe\u51c6\u7684\u5212\u5206\u7528\u4f8b\u8303\u56f4 \u7528\u4f8b\u6267\u884c\u7684\u8303\u56f4\u4e0d\u591f\u7cbe\u51c6\uff0c\u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u4e3b\u8981\u901a\u8fc7\u7528\u4f8b\u7684\u5173\u952e\u8bcd core\uff08\u6838\u5fc3\uff09\u6765\u533a\u5206\u7528\u4f8b\u662f\u5426\u4e3a\u6838\u5fc3\u7528\u4f8b\uff0c\u4f46\u662f\u8fd9\u6837\u7684\u533a\u5206\u592a\u5bbd\u6cdb\u4e86\uff0c\u4e0d\u80fd\u9002\u5e94\u81ea\u52a8\u5316\u6d4b\u8bd5\u5728\u591a\u573a\u666f\u4e0b\u7684\u5e94\u7528\u3002\u5f88\u591a\u573a\u666f\u4e0b\u6211\u4eec\u8fd8\u9700\u8981\u6839\u636e\u7528\u4f8b\u7684\u7b49\u7ea7\u3001\u7528\u4f8b\u7684\u7c7b\u578b\u3001\u7528\u4f8b\u6765\u6e90\u7b49\u7b49\uff0c\u4e0d\u540c\u7684\u7ef4\u5ea6\u6765\u6311\u9009\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u5173\u952e\u5b57\u9700\u8981\u4eba\u5de5\u4e00\u6761\u6761\u7684\u6539\uff0c\u8d39\u65f6\u8d39\u529b\uff0c\u800c\u4e14\u4e0d\u597d\u7ef4\u62a4\u3002 \u53d7\u65b0\u9700\u6c42\u5f71\u54cd\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u597d\u7ef4\u62a4 \u76ee\u524d\u9700\u8981\u8df3\u8fc7\u7684\u7528\u4f8b\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684\u7528\u4f8b\u811a\u672c\u91cc\u9762\uff0c\u6dfb\u52a0\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\uff0c\u540e\u7eed\u89e3\u9664\u8df3\u8fc7\u7684\u65f6\u5019\u53c8\u9700\u8981\u627e\u5230\u8fd9\u6761\u811a\u672c\uff0c\u5220\u6389\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\u3002\u5728\u8df3\u8fc7\u7528\u4f8b\u8f83\u591a\u7684\u60c5\u51b5\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u96be\u5ea6\u3002 \u7f16\u5199\u7528\u4f8b\u65f6\u903b\u8f91\u6bd4\u8f83\u590d\u6742\uff0c\u9700\u8981\u8c03\u7528\u591a\u4e2a\u5e94\u7528\u7684\u65b9\u6cd5\u6a21\u5757\u3002 \u6846\u67b6\u6269\u5c55\u6027\u4e0d\u8db3\uff0c\u65e0\u6cd5\u6574\u5408\u6027\u80fd\u81ea\u52a8\u5316\u3001\u538b\u6d4b\u81ea\u52a8\u5316\u3001\u5b89\u5168\u81ea\u52a8\u5316\u7b49\u4e13\u9879\u6d4b\u8bd5\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_3","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u4e3a\u89e3\u51b3\u73b0\u6709\u95ee\u9898\uff0c\u9002\u5e94\u4e0d\u65ad\u4e30\u5bcc\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u66f4\u597d\u7684\u53d1\u6325\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4f5c\u7528\uff0c\u9700\u8981\u5bf9\u81ea\u52a8\u5316\u67b6\u6784\u53ca\u5404\u529f\u80fd\u6a21\u5757\u8fdb\u884c\u91cd\u65b0\u8bbe\u8ba1\u89c4\u5212\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_1","title":"1\u3001\u67b6\u6784\u8bbe\u8ba1","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_1","title":"2\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u6846\u67b6\u7684\u8fd0\u884c\u903b\u8f91\uff1a\u901a\u8fc7\u6838\u5fc3\u5c42\u63d0\u4f9b\u4e00\u4e2a\u57fa\u7840\u80fd\u529b\uff0c\u4e1a\u52a1\u5c42\u6839\u636e\u5b9e\u9645\u4e1a\u52a1\u9700\u6c42\uff08\u6d4b\u8bd5\u7528\u4f8b\uff09\u52a8\u6001\u52a0\u8f7d\u6838\u5fc3\u5c42\uff0c\u6267\u884c\u5165\u53e3\u52a0\u8f7d\u76f8\u5e94\u7684\u7528\u4f8b\u96c6\u5e76\u63a7\u5236\u6267\u884c\uff0c\u5e94\u7528\u5c42\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u9700\u6c42\uff0c\u901a\u8fc7\u76f8\u5e94\u7684\u914d\u7f6e\u9879\u8fdb\u884c\u914d\u7f6e\uff0c\u4ece\u800c\u89e6\u53d1\u81ea\u52a8\u5316\u6d4b\u8bd5\u4efb\u52a1\u3002 \u6838\u5fc3\u5c42\uff1a\u57fa\u672c\u4fdd\u6301\u4e0d\u53d8\uff0c\u90e8\u5206\u6a21\u5757\u4f1a\u6d89\u53ca\u5230\u65b0\u529f\u80fd\u5f00\u53d1\uff0c\u6838\u5fc3\u5c42\u5404\u529f\u80fd\u6a21\u5757\u4fdd\u6301\u72ec\u7acb\u6027\uff0c\u63d0\u4f9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u4f9b\u4e0a\u5c42\u8c03\u7528\uff1b \u5e95\u5c42\u6838\u5fc3\u6a21\u5757\u5305\u62ec\uff1a \u56fe\u50cf\u8bc6\u522b\u6a21\u5757 UI \u5b9a\u4f4d\u6a21\u5757 Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757 \u5c5e\u6027\u5b9a\u4f4d\u6a21\u5757 \u65e5\u5fd7\u6a21\u5757 \u952e\u9f20\u64cd\u4f5c\u6a21\u5757 \u6587\u4ef6\u64cd\u4f5c\u6a21\u5757 \u5f55\u5c4f\u6a21\u5757 \u81ea\u5b9a\u4e49\u65ad\u8a00\u6a21\u5757 \u7528\u4f8b\u6267\u884c\u6a21\u5757 PXE \u88c5\u673a\u6a21\u5757 \u952e\u9f20\u4fe1\u53f7\u6a21\u62df\u6a21\u5757 OCR \u6a21\u5757 \u4e1a\u52a1\u5c42\uff1a\u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e94\u7528\u5185\u5305\u542b\u591a\u4e2a\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5982\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7b49\uff0c\u540e\u7eed\u53ef\u4ee5\u6839\u636e\u9700\u8981\u5ac1\u63a5\u8fdb\u6765\u3002\u5176\u4e2d\u529f\u80fd\u6d4b\u8bd5\u8bbe\u8ba1\u601d\u8def\uff1a \u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e76\u5c06\u6d4b\u8bd5\u6570\u636e\u548c\u6d4b\u8bd5\u8d44\u6e90\u6574\u5408\u8fdb\u6765\uff0c\u589e\u52a0\u7528\u4f8b\u6807\u7b7e csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ed9\u6bcf\u6761\u7528\u4f8b\u6253\u6807\u7b7e\u3002 \u5404\u6807\u7b7e\u6240\u4f7f\u7528\u5bf9\u5e94\u7684\u5b57\u6bb5\u540d\u79f0\uff0c\u4f7f\u7528 csv \u6587\u4ef6\u7ef4\u62a4\u7528\u4f8b\u4e0e\u6807\u7b7e\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u5bf9\u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u53ef\u4ee5\u7ec4\u5408\u5176\u4e2d\u7684\u6807\u7b7e\u800c\u4ece\u9a71\u52a8\u5bf9\u5e94\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\uff0c\u517c\u5bb9\u73b0\u6709\u7528\u4f8b\u6807\u7b7e\uff0c\u4e14\u652f\u6301\u7528\u4f8b\u6807\u7b7e\u53ef\u6269\u5c55\uff1b \u4f7f\u7528 csv \u683c\u5f0f\u6587\u4ef6\u53ef\u4ee5\u65b9\u4fbf\u7684\u4f7f\u7528 Excel \u8868\u683c\u6253\u5f00\u8fdb\u884c\u7f16\u8f91\uff0c\u540c\u65f6\u7531\u4e8e csv \u6587\u4ef6\u5b9e\u9645\u662f\u4ee5\u90fd\u597d\u5206\u9694\u7684\u6587\u672c\u6587\u4ef6\uff0c\u4ee3\u7801\u4e2d\u53ef\u4ee5\u5728\u4e0d\u4f9d\u8d56\u4e09\u65b9\u5e93\u7684\u60c5\u51b5\u4e0b\u65b9\u4fbf\u5feb\u901f\u7684\u89e3\u6790\u5b83\uff0c\u53ef\u64cd\u4f5c\u6027\u548c\u53ef\u7ef4\u62a4\u6027\u8f83\u9ad8\u3002 \u5404\u4e2a\u5e94\u7528\u4e4b\u95f4\uff0c\u7528\u4f8b\u3001\u65b9\u6cd5\u3001\u6807\u7b7e\u548c\u8d44\u6e90\u90fd\u662f\u76f8\u4e92\u72ec\u7acb\u7684\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u7528\u4f8b\u65f6\u53ea\u9700\u8981\u81ea\u5df1\u5e94\u7528\u4e0b\u7684\u65b9\u6cd5\u548c\u516c\u5171\u5e93\u5373\u53ef\u3002 \u7ed3\u6784\u4e3e\u4f8b\uff1a .\n\u251c\u2500\u2500 apps\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_album # \u5e94\u7528\u540d (\u7528\u4e0b\u5212\u7ebf\u8fde\u63a5\u662f Python \u7f16\u7801\u89c4\u8303)\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_assert # \u65ad\u8a00\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_function_tag.csv # \u7528\u4f8b\u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 asan_cases # \u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases # \u529f\u80fd\u6d4b\u8bd5\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 res # \u6d4b\u8bd5\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config # \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_widget # \u5e94\u7528\u81ea\u5df1\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_widget # \u65b9\u6cd5\u57fa\u7c7b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 other_widget # \u8c03\u7528\u5176\u4ed6\u5e94\u7528\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_camera\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases\n\u2502\u00a0\u00a0 \u2502\u00a0 ...\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 public_widget # \u516c\u5171\u65b9\u6cd5\u5e93\n\u251c\u2500\u2500 config # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n...\n config \u914d\u7f6e\u6a21\u5757\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u76f8\u5e94\u914d\u7f6e\uff0c\u6d4b\u8bd5\u540c\u5b66\u53ef\u4ee5\u6839\u636e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5728 config \u91cc\u9762\u8fdb\u884c\u914d\u7f6e\u3002 \u5168\u5c40\u914d\u7f6e\uff1a \u6267\u884c\u4e00\u4e2a\u6216\u591a\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff1a\u5728 pattern \u91cc\u9762\u5199\u5165\u5e94\u7528\u5305\u540d\uff0c\u591a\u4e2a\u5e94\u7528\u4e4b\u95f4\u7528 or \u8fde\u63a5\uff0c\u5982 deepin-music or deepin-movie\uff1b \u5192\u70df\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a smoke\uff1b \u96c6\u6210\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a core \uff1b \u5168\u91cf\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u4e3a\u7a7a\u5373\u53ef\uff1b \u901a\u8fc7 tags \u7684\u914d\u7f6e\u6bd4\u8f83\u7075\u6d3b\uff0c\u540e\u9762\u6807\u7b7e\u5316\u7ba1\u7406\u7ae0\u8282\u4f1a\u8bb2\u5230\uff0c\u652f\u6301\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u7075\u6d3b\u914d\u7f6e\u3002 \u6307\u5b9a\u67d0\u53f0\u673a\u5668\u5728\u6307\u5b9a\u955c\u50cf\u7248\u672c\u4e0a\u6267\u884c\u7528\u4f8b\uff1a\u5728 IP \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a IP\uff0c\u5e76\u5728 URL \u91cc\u9762\u586b\u5165\u955c\u50cf\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u6846\u67b6\u4f1a\u8c03\u7528 PXE \u8fdb\u884c\u81ea\u52a8\u88c5\u673a\uff0c\u88c5\u673a\u5b8c\u4e4b\u540e\u81ea\u52a8\u5f00\u59cb\u6267\u884c\u914d\u7f6e\u7684\u6d4b\u8bd5\u7528\u4f8b\u3002 \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\uff1a \u6bcf\u4e2a\u5e94\u7528\u5185\u90e8\u4f1a\u6709\u4e00\u4e2a\u5355\u72ec\u7684\u914d\u7f6e\u6a21\u5757\uff0c\u4f1a\u5305\u542b\u4e00\u4e9b\u672c\u5e94\u7528\u7684\u6d4b\u8bd5\u8d44\u6e90\u7684\u8def\u5f84\u3001\u6267\u884c\u7528\u4f8b\u7684\u6807\u7b7e\u914d\u7f6e\u7b49\u7b49\uff0c\u5982\u679c\u5728\u5c40\u90e8\u914d\u7f6e\u91cc\u9762\u914d\u7f6e\u4e86\u7528\u4f8b\u6267\u884c\u6807\u7b7e\uff0c\u800c\u5916\u5c42 runner \u51fa\u6ca1\u6709\u6307\u5b9a\u6267\u884c\u6807\u7b7e\uff0c\u5219\u5728\u6267\u884c\u65f6\u53ea\u4f1a\u6267\u884c\u5c40\u90e8\u914d\u7f6e\u5df2\u914d\u7f6e\u7684\uff0c\u82e5\u5916\u5c42 runner \u4e5f\u914d\u7f6e\u4e86\u6267\u884c\u6807\u7b7e\uff0c\u5219\u4f1a\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u7528\u4f8b\u3002 \u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u914d\u7f6e\u90fd\u5728\u540c\u4e00\u4e2a\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\uff0cpy \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684\u7c7b\uff0cini \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684 option\u3002 \u5168\u5c40\u914d\u7f6e\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u7b56\u7565\u5982\u4e0b\uff1a \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5c40\u90e8\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5e94\u7528\u5c42\uff1arunner \u662f\u6d4b\u8bd5\u6267\u884c\u7684\u5165\u53e3\uff0c\u5b83\u4f1a\u6839\u636e\u914d\u7f6e\u91cc\u9762\u7684\u914d\u7f6e\u9879\uff0c\u8fdb\u884c\u7528\u4f8b\u7684\u52a0\u8f7d\u548c\u6267\u884c\u3002\u5b83\u63d0\u4f9b\u63a5\u53e3\u7ed9\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\uff0c\u5e73\u53f0\u4e0a\u7684\u6307\u4ee4\u5b9e\u9645\u4e0a\u90fd\u662f\u901a\u8fc7\u4e0b\u53d1\u7ed9 runner\uff0c\u7136\u540e\u7531 runner \u6765\u6267\u884c\u76f8\u5e94\u7684\u6d4b\u8bd5\u3002 \u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u662f\u4e00\u4e2a\u524d\u7aef\u7cfb\u7edf\uff0c\u53ef\u4ee5\u8fdb\u884c\u6d4b\u8bd5\u673a\u7ba1\u7406\u3001\u81ea\u52a8\u5b89\u88c5\u955c\u50cf\u3001\u81ea\u52a8\u5b89\u88c5\u6307\u5b9a\u5e94\u7528\u7248\u672c\u3001\u8fdb\u884c\u6d4b\u8bd5\u7528\u4f8b\u8303\u56f4\u9009\u62e9\u3001\u7528\u4f8b\u89e6\u53d1\u6267\u884c\u63a7\u5236\u3001\u7ed3\u679c\u5c55\u793a\u8f93\u51fa\u7b49\u3002 \u4e00\u4e2a\u5e94\u7528\u7684\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\u90fd\u53ef\u4ee5\u5355\u72ec\u89e6\u53d1\u3002 \u517c\u5bb9\u6027\u6d4b\u8bd5\u4e3b\u8981\u901a\u8fc7 PXE \u670d\u52a1\u5668\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u88c5\u673a\uff0c\u7136\u540e\u914d\u5408 AT \u8fdb\u884c\u6d4b\u8bd5\uff0c\u53ef\u4ee5\u5b9e\u73b0\u4e0d\u540c\u7cfb\u7edf\u7248\u672c\u3001\u4e0d\u540c\u5e94\u7528\u7248\u672c\u73af\u5883\u4e0a\u90fd\u53ef\u4ee5\u8fdb\u884c\u81ea\u52a8\u5316\u7684 AT \u6267\u884c\uff0c\u63d0\u9ad8\u517c\u5bb9\u6027\u6d4b\u8bd5\u6548\u7387\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_4","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_2","title":"1\u3001\u7528\u4f8b\u89e3\u8026","text":"\u5b58\u5728\u8026\u5408\u5173\u7cfb\u7684\u65b9\u6cd5\uff1a\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u88ab\u5916\u90e8\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\uff0c\u5219\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u8026\u5408\u5173\u7cfb\u3002 1.1\u3001\u901a\u8fc7\u7f16\u8f91\u5668 Find Usages \u67e5\u770b\u6bcf\u4e2a\u65b9\u6cd5\u88ab\u8c03\u7528\u7684\u8def\u5f84\u548c\u88ab\u8c03\u7528\u6b21\u6570\uff1b 1.2\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 1 \u4e2a\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728\u5916\u90e8\u5e94\u7528\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1b 1.3\u3001\u64cd\u4f5c\u5c42\u6587\u4ef6\u540d\u5747\u4ee5 widget \u7ed3\u5c3e\uff0c\u7c7b\u540d\u4ee5 Widget \u7ed3\u5c3e\uff0c\u5982\uff1a\u6587\u4ef6\u540d music_widget.py \uff1a class MusicWidget:\n\"\"\"\u97f3\u4e50\u7684\u64cd\u4f5c\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_2","title":"2\u3001\u516c\u5171\u5e93\u5efa\u8bbe","text":"2.1\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 2 \u4e2a\u53ca\u4ee5\u4e0a\u7684\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728 public_widget \u76ee\u5f55\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1bpublic_widget \u5373\u4e3a\u516c\u5171\u65b9\u6cd5\u5e93\uff1b 2.2\u3001\u5728\u7528\u4f8b\u5c42\u4fee\u6539\u7528\u4f8b\u4e2d\u7c7b\u7684\u5bfc\u5165\u8def\u5f84\uff0c\u5c5e\u4e8e\u516c\u5171\u65b9\u6cd5\u7684\u5219\u8c03\u7528 public_widget \u4e2d\u7684\u7c7b\uff0c\u5916\u90e8\u5e94\u7528\u7684\u64cd\u4f5c\u65b9\u6cd5\uff0c\u5219\u8c03\u7528\u672c\u5e94\u7528\u76ee\u5f55\u4e0b\u91cd\u5199\u7684\u5916\u90e8\u5e94\u7528\u65b9\u6cd5\u3002 \u6bd4\u5982\uff1a\u51e0\u4e4e\u6240\u6709\u591a\u5a92\u4f53\u5e94\u7528\u90fd\u9700\u8981\u901a\u8fc7\u6587\u7ba1\u52a0\u8f7d\u8d44\u6e90\uff0c\u8c03\u8d77\u7684\u6587\u7ba1\u5bf9\u8bdd\u6846\u5b9e\u9645\u4e3a dde-desktop\uff0c\u56e0\u6b64\u5c06 desktop_widget.py \u653e\u5230 public_widget \u91cc\u9762\uff1a class DdeDesktopPublicWidget:\n\"\"\"\u516c\u5171-\u684c\u9762\u7684\u64cd\u4f5c\u65b9\u6cd5\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3_1","title":"3\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406","text":"3.1\u3001\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1a\u5bf9\u5e94 core\u3001smoke\uff0c\u6216\u4e3a\u7a7a\uff1b \u7528\u4f8b\u6765\u6e90\uff1a\u5bf9\u5e94 PMS \u7528\u4f8b\u6765\u6e90\uff0c\u5206\u522b\u7528 acp1\u3001acp2\u3001acp3\u3001acp4 \u8868\u793a\u3002 acp1 \uff1a\u4e1a\u52a1\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5199\u7684\u7528\u4f8b\uff0c\u88ab\u7528\u4e8e\u9a8c\u6536\u6d4b\u8bd5\u7684\uff1b acp2 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5f15\u5165\u7684\u4ea7\u54c1\u9a8c\u6536\u6d4b\u8bc4\u90e8\u7684\u7528\u4f8b\uff1b acp3 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u6839\u636e\u4ea7\u54c1\u9700\u6c42\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\uff1b acp4 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u901a\u8fc7\u793e\u533a\u3001\u8bba\u575b\u7528\u6237\u53cd\u9988\u95ee\u9898\u603b\u7ed3\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\u3002 \u4e3e\u4f8b\uff1a \u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u7528\u4f8b\u6765\u6e90 001 L1 core acp1 \u6807\u7b7e\u91c7\u7528\u679a\u4e3e\u7684\u65b9\u5f0f\u8fdb\u884c\u4ee3\u53f7\u7ba1\u7406\u65b9\u4fbf\u7ba1\u7406\u4ee5\u53ca\u540e\u7eed\u6269\u5c55\u3002 3.2\u3001\u5728\u6bcf\u4e2a\u5e94\u7528\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u7b2c\u4e00\u5217\u4e3a\u7528\u4f8b\u7684 ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ba1\u7406\u6a21\u5757\u5185\u7684\u7528\u4f8b\u6807\u7b7e\u3002\u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 3.3\u3001\u5bf9\u7167 PMS \u4e0a\u7528\u4f8b\u7b49\u7ea7\u3001\u7528\u4f8b\u7c7b\u578b\u548c\u7528\u4f8b\u6765\u6e90\uff0c\u6807\u8bb0\u6240\u6709\u5df2\u5b9e\u73b0\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u540e\u7eed\u7f16\u5199\u65b0\u589e\u81ea\u52a8\u5316\u7528\u4f8b\u65f6\uff0c\u6bcf\u5199\u4e00\u6761\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684 csv \u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u6b64\u6761\u7528\u4f8b\u7684\u6807\u7b7e\u3002 3.4\u3001\u8df3\u8fc7\u7528\u4f8b\u6807\u7b7e\u5316 \u73b0\u6709\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a\uff1a \u4e3e\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u8bb0\u4e3a \u201cskip-\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u8bb0\uff0c\u5982\u679c\u5df2\u7ecf\u6807\u8bb0\u4e86\u8df3\u8fc7\u539f\u56e0\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u8bb0\u4e3a SKIPED\uff0c\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\u3002 \u6240\u6709\u7684\u6807\u7b7e\u5728 docs \u76ee\u5f55\u4e0b\u4f1a\u6709\u4e00\u4e2a\u6587\u6863\uff0c\u6587\u6863\u6682\u5b9a\u540d\u79f0\u4e3a\uff1atags_info.md\uff0c\u7528\u4e8e\u8bf4\u660e\u73b0\u5728\u5df2\u7ecf\u4f7f\u7528\u5230\u7684\u6807\u7b7e\uff0c\u4ee5\u53ca\u8fd9\u4e9b\u6807\u7b7e\u7684\u89e3\u91ca\u548c\u7528\u6cd5\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#4","title":"4\u3001\u7528\u4f8b\u6267\u884c","text":"4.1\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u7684\u9a71\u52a8\u6267\u884c\u903b\u8f91\u529f\u80fd\u5b9e\u73b0 \u5f00\u53d1\u6839\u636e\u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\u91cc\u9762\u7684\u7528\u4f8b\u6807\u7b7e\u6267\u884c\u5bf9\u5e94\u7528\u4f8b\u7684\u529f\u80fd\uff0c\u80fd\u652f\u6301\u591a\u4e2a\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u6267\u884c\u5165\u53e3\u80fd\u968f\u610f\u901a\u8fc7\u7528\u4f8b\u6807\u7b7e\u6307\u5b9a\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002 \u7528\u4f8b\u6807\u7b7e\u7684\u9a71\u52a8\u65b9\u5f0f\u5fc5\u987b\u80fd\u652f\u6301\u6807\u7b7e\u7684\u6269\u5c55\uff0c\u672a\u6765\u968f\u7740\u4e1a\u52a1\u7684\u53d8\u5316\u53ef\u80fd\u9700\u8981\u589e\u52a0\u5404\u79cd\u5404\u6837\u7684\u6807\u7b7e\u3002 4.2\u3001\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u6267\u884c \u529f\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u3001\u6027\u80fd\u6d4b\u8bd5\u7b49\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u662f\u5206\u5f00\u6267\u884c\u7684\uff0c\u4e5f\u5c31\u662f\u5728\u4e00\u6b21\u6267\u884c\u4e2d\uff0c\u53ea\u80fd\u6267\u884c\u5176\u4e2d\u4e00\u79cd\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5177\u4f53\u8981\u6267\u884c\u54ea\u4e00\u79cd\u540c\u6837\u901a\u8fc7\u53c2\u6570\u6765\u63a7\u5236\u3002 4.3\u3001\u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c \u7531\u4e8e\u6d4b\u8bd5\u673a\u8d44\u6e90\u6709\u9650\uff0c\u968f\u7740\u81ea\u52a8\u5316\u7528\u4f8b\u6570\u91cf\u7684\u589e\u52a0\uff0cCI \u6267\u884c\u65f6\u95f4\u4f1a\u8d8a\u6765\u8d8a\u957f\u3002 \u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c\u7684\u529f\u80fd\uff1a \u540c\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\u5206\u6563\u5230\u4e0d\u540c\u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u4e0a\u6267\u884c\uff0c\u7f29\u77ed\u6267\u884c\u603b\u65f6\u95f4\uff1b \u7b2c\u4e8c\u5929\u8dd1\u7684\u65f6\u5019\u540c\u4e00\u4e2a\u673a\u5668\u4e0a\u4f1a\u6267\u884c\u6628\u5929\u6ca1\u6709\u6267\u884c\u5230\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u6267\u884c\u540c\u7406\uff1b \u53ef\u4ee5\u5b9e\u73b0\u5728\u5168\u67b6\u6784\u6d4b\u8bd5\u673a\u4e0a\u8f6e\u6d41\u6267\u884c\u7528\u4f8b\uff0c\u65e2\u80fd\u4fdd\u8bc1\u6267\u884c\u4e86\u6240\u6709\u7684\u7528\u4f8b\uff0c\u53c8\u80fd\u5728\u8d44\u6e90\u6709\u9650\u7684\u60c5\u51b5\u4e0b\u8986\u76d6\u4e86\u6240\u6709\u7684\u67b6\u6784\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#5","title":"5\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0","text":"5.1\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u4f5c\u4e3a\u524d\u7aef\u754c\u9762\u7cfb\u7edf\uff0c\u901a\u8fc7\u9875\u9762\u4e0a\u7684\u4e00\u4e9b\u529f\u80fd\u9009\u9879\u8fdb\u884c\u5bf9\u5e94\u6d4b\u8bd5\u4efb\u52a1\u7684\u7ba1\u7406\u6216\u89e6\u53d1\uff0c\u4e1a\u5185\u6bd4\u8f83\u6d41\u884c\u7684\u5b9e\u73b0\u65b9\u6848\u662f\u4f7f\u7528 Vue + DRF \u5b9e\u73b0\u4e00\u4e2a\u524d\u540e\u7aef\u5206\u79bb\u7684\u7cfb\u7edf\u3002 \u6d4b\u8bd5\u5e73\u53f0\u53ef\u80fd\u4f1a\u6d89\u53ca\u5230\u7684\u6a21\u5757\u6709\uff1a\u6d4b\u8bd5\u673a\u8d44\u6e90\u7ba1\u7406\u6a21\u5757\u3001\u7528\u4f8b\u6267\u884c\u63a7\u5236\u6a21\u5757\u3001\u7ed3\u679c\u5c55\u793a\u6a21\u5757\u3001PXE \u955c\u50cf\u5b89\u88c5\u6a21\u5757\u7b49\u3002 \u7528\u6237\uff08\u6d4b\u8bd5\u3001\u7814\u53d1\u540c\u5b66\u7b49\uff09\u53ef\u4ee5\u914d\u7f6e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5982\u6267\u884c\u54ea\u4e2a\u5e94\u7528\u3001\u6267\u884c\u7528\u4f8b\u7684\u8303\u56f4\u3001\u5728\u54ea\u53f0\u673a\u5668\u4e0a\u6267\u884c\u3001\u955c\u50cf\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u5e94\u7528\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u6267\u884c\u65f6\u95f4\u3002 5.2\u3001\u6267\u884c\u5165\u53e3 runner \u63d0\u4f9b\u7ed9\u6d4b\u8bd5\u5e73\u53f0\u7684\u63a5\u53e3\u5305\u62ec\uff1a\u7528\u4f8b\u6267\u884c\u63a5\u53e3\u3001\u7ed3\u679c\u8fd4\u56de\u63a5\u53e3\u3001\u955c\u50cf\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u955c\u50cf\u5b89\u88c5\u63a5\u53e3\u3001\u5e94\u7528\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u5e94\u7528\u5b89\u88c5\u66f4\u65b0\u63a5\u53e3\u7b49\u3002 \u524d\u7aef\u5e73\u53f0\u76ee\u524d\u8fd8\u6ca1\u6709\u592a\u591a\u8be6\u7ec6\u7684\u65b9\u6848\uff0c\u672c\u6b21\u8bbe\u8ba1\u4e3b\u8981\u96c6\u4e2d\u5728\u540e\u7aef\u8fd9\u90e8\u5206\u67b6\u6784\u7684\u8bbe\u8ba1\u4e0a\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_5","title":"\u56db\u3001\u5b9e\u65bd\u8ba1\u5212","text":"\u8fd1\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u6587\u7ba1\u4ee3\u7801\u89e3\u8026 2022/3/28 2022/4/8 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u56fe\u5f62\u56fe\u50cf\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u97f3\u89c6\u9891\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5168\u5c40\u641c\u7d22\u4ee3\u7801\u89e3\u8026 2022/4/25 2022/4/26 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u516c\u5171\u5e93\u5efa\u8bbe 2022/4/27 2022/5/5 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5c01\u88c5\u7684\u65b9\u6cd5\u6574\u7406\u6210\u4e00\u4e2a\u8868 2022/5/6 2022/5/10 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7528\u4f8b\u6807\u7b7e\u5206\u7c7b\u8bc4\u4f30 2022/5/11 2022/5/11 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u6807\u7b7e\u5316\u6267\u884c\u9a71\u52a8\u7a0b\u5e8f\u7f16\u5199 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u9700\u5b9e\u73b0\u81ea\u52a8\u89e3\u6790 csv \u8868\u683c\u4e2d\u7684\u7528\u4f8b\u7f16\u53f7 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u722c\u866b\u811a\u672c\uff0c\u722c\u53d6 pms \u4e0a\u7528\u4f8b\u7684\u6807\u7b7e 2022/5/11 2022/5/13 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u5b9a\u65f6\u81ea\u52a8\u7ef4\u62a4\u672c\u5730 csv \u6587\u4ef6\u811a\u672c 2022/5/11 2022/5/20 \u4e2d\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u76ee\u5f55\u7ed3\u6784\u8c03\u6574 2022/5/20 2022/6/2 \u5b8c\u6210\u5168\u5c40\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u5177\u4f53\u65b9\u6848\u548c\u903b\u8f91\u5b9e\u73b0 2022/6/6 2022/6/17 \u9759\u6001\u626b\u63cf\u95ee\u9898\u6e05\u96f6 2022/6/20 2022/7/1 \u5b8c\u6210\u65b0\u6846\u67b6\u4f7f\u7528\u57f9\u8bad 2022/7/4 2022/7/11 \u843d\u5730\u8fd0\u884c 2022/7/12 2022/7/20 \u5e95\u5c42\u5e93\u7528\u9014\u8bf4\u660e\u6587\u6863\u7f16\u5199 2022/7/21 2022/7/28"}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\u200b\\u3000\\-\u3001\u3002\uff0c\uff0e\uff1f\uff01\uff1b]+","pipeline":["stemmer"]},"docs":[{"location":"","title":"\u9996\u9875","text":""},{"location":"#youqu","title":"\u6709\u8da3\uff08YouQu\uff09","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/4/1\n# Author : Mikigo\n# =============================================\n \u672c\u7ad9\u603b\u8bbf\u95ee\u91cf \u6b21 \u6b22\u8fce\u5728\u6d4f\u89c8\u5668\u8bbf\u95ee\u3010\u516c\u7f51\u6587\u6863\u3011 \u7edf\u4fe1\u516c\u53f8\u5185\u7f51\u8fd8\u53ef\u4ee5\u8bbf\u95ee\u3010\u5185\u7f51\u6587\u6863\u3011\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u54e6~~"},{"location":"#_1","title":"\u4e00\u3001\u7b80\u4ecb","text":"\u6709\u8da3\uff08YouQu\uff09\u662f\u6df1\u5ea6\u79d1\u6280\u8bbe\u8ba1\u548c\u5f00\u53d1\u7684\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff0c\u91c7\u7528\u7ed3\u6784\u5206\u5c42\u7684\u8bbe\u8ba1\u7406\u5ff5\uff0c\u652f\u6301\u591a\u5143\u5316\u5143\u7d20\u5b9a\u4f4d\u548c\u65ad\u8a00\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\u3001\u5f3a\u5927\u7684\u65e5\u5fd7\u548c\u62a5\u544a\u8f93\u51fa\u7b49\u7279\u8272\u529f\u80fd\uff0c\u540c\u65f6\u5b8c\u7f8e\u517c\u5bb9X11\u3001Wayland\u663e\u793a\u534f\u8bae\uff0c\u73af\u5883\u90e8\u7f72\u7b80\u5355\uff0c\u64cd\u4f5c\u6613\u4e0a\u624b\u3002"},{"location":"#17","title":"\u7231\u4e0a \u201c\u6709\u8da3\u201d \u7684 17 \u4e2a\u7406\u7531","text":" \u6838\u5fc3\u5e93\u63d0\u4f9b\u4e86\u7edf\u4e00\u7684\u63a5\u53e3\uff0c\u7f16\u5199\u65b9\u6cd5\u65f6\u53ea\u9700\u8981\u5bfc\u5165\u4e00\u4e2a\u5305\u5c31\u53ef\u4ee5\u4f7f\u7528\u5230\u6838\u5fc3\u5e93\u63d0\u4f9b\u7684\u6240\u6709\u529f\u80fd\uff1b \u516c\u5171\u5e93\u5c01\u88c5\u4e86\u5f88\u591a\u5e38\u7528\u6a21\u5757\u7684\u76f8\u5173\u65b9\u6cd5\uff0c\u6bd4\u5982\uff1a\u4efb\u52a1\u680f\u7684\u64cd\u4f5c\u3001\u684c\u9762\u7684\u64cd\u4f5c\u3001\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\u7b49\u7b49\uff1b \u9664\u4e86\u5e38\u7528\u7684\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u8bc6\u522b\u4ee5\u5916\uff0c\u6211\u4eec\u8fd8\u63d0\u4f9b\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u5176\u4f7f\u7528\u7b80\u5355\u4e14\u9ad8\u6548\uff0c\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff1b \u5bf9\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u5c06\u7f16\u5199\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u53d8\u5f97\u7b80\u5355\u800c\u4f18\u96c5\uff1b \u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u6280\u672f\u8fdb\u884c\u529f\u80fd\u5347\u7ea7\uff0c\u9664\u4e86\u652f\u6301\u5355\u4e2a\u5750\u6807\u8fd4\u56de\uff0c\u8fd8\u652f\u6301\u540c\u4e00\u754c\u9762\u4e0b\u591a\u4e2a\u76f8\u540c\u5143\u7d20\u8fd4\u56de\u591a\u4e2a\u5750\u6807\u7684\u529f\u80fd\uff1b \u63d0\u4f9b\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u548c\u6279\u91cf\u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u4e0d\u5230\u4e00\u4e2a csv \u6587\u4ef6\u539f\u6765\u80fd\u5e72\u8fd9\u4e48\u591a\u4e8b\u60c5\uff1b \u63d0\u4f9b\u4e86\u529f\u80fd\u5f3a\u5927\u7684\u6267\u884c\u5668\u5165\u53e3\uff0c\u8ba9\u4f60\u53ef\u4ee5\u65b9\u4fbf\u7684\u5728\u672c\u5730\u6267\u884c\u4efb\u4f55\u7528\u4f8b\u96c6\u7684\u7528\u4f8b\uff0c\u5176\u4e30\u5bcc\u7684\u81ea\u5b9a\u4e49\u914d\u7f6e\u9879\uff0c\u6ee1\u8db3\u4f60\u5bf9\u6267\u884c\u5668\u6240\u6709\u7684\u5e7b\u60f3\uff1b \u63d0\u4f9b\u8fdc\u7a0b\u6267\u884c\u7684\u529f\u80fd\uff0c\u53ef\u4ee5\u63a7\u5236\u591a\u53f0\u673a\u5668\u5e76\u884c\u8dd1\uff0c\u6216\u8005\u5206\u5e03\u5f0f\u8dd1\uff0c\u8fd9\u79cd\u4ed8\u8d39\u529f\u80fd\u73b0\u5728\u514d\u8d39\u7ed9\u4f60\u7528\uff1b \u63d0\u4f9b\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u529f\u80fd\uff0c\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u6bcf\u4e2a\u65b9\u6cd5\u5355\u72ec\u5199\u8f93\u51fa\u65e5\u5fd7\u7684\u4ee3\u7801\uff0c\u4e00\u5207\u6211\u4eec\u7ed9\u4f60\u641e\u5b9a\u4e86\uff0c\u65e5\u5fd7\u8f93\u51fa\u4e0d\u4ec5\u5185\u5bb9\u4e30\u5bcc\uff0c\u989c\u503c\u4e5f\u7edd\u5bf9\u5728\u7ebf\uff0c\u6211\u4eec\u8fd8\u81ea\u5df1\u8bbe\u8ba1\u4e86\u4e00\u6b3e\u7ec8\u7aef\u8f93\u51fa\u4e3b\u9898\u53eb\u300a\u4e94\u5f69\u6591\u6593\u7684\u9ed1\u300b\uff1b \u63d0\u4f9b\u4e86\u4e00\u952e\u90e8\u7f72\u81ea\u52a8\u5316\u6d4b\u8bd5\u73af\u5883\u7684\u529f\u80fd\uff0c\u8fde\u4ee3\u7801\u7f16\u8f91\u5668\u90fd\u7ed9\u4f60\u88c5\u597d\u4e86\uff0c\u8ba9\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u73af\u5883\u90e8\u7f72\u800c\u70e6\u607c\uff1b \u63d0\u4f9b\u4e86\u81ea\u52a8\u751f\u6210\u591a\u79cd\u62a5\u544a\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u8f93\u51fa\u4ec0\u4e48\u62a5\u544a\u5f62\u5f0f\u90fd\u884c\uff0c\u800c\u4e14\u6211\u4eec\u5728\u62a5\u544a\u4e2d\u8fd8\u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\u548c\u5931\u8d25\u622a\u56fe\u7684\u529f\u80fd\uff1b \u5bf9\u65ad\u8a00\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u63d0\u4f9b\u66f4\u53cb\u597d\u5316\u7684\u9519\u8bef\u63d0\u793a\uff0c\u8ba9\u5b9a\u4f4d\u95ee\u9898\u7cbe\u51c6\u9ad8\u6548\uff1b \u4e0d\u4ec5\u652f\u6301\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u63a7\u5236\uff0c\u800c\u4e14\u8fd8\u652f\u6301\u52a8\u6001\u63a7\u5236\u7528\u4f8b\u6279\u91cf\u6267\u884c\u7684\u603b\u65f6\u95f4\uff0c\u786e\u4fdd CI \u73af\u5883\u4e0b\u80fd\u987a\u7545\u8fd0\u884c\uff1b \u652f\u6301\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\u6267\u884c\u3001PMS \u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6807\u7b7e\u5316\u6267\u884c\u65b9\u6848\uff0c\u6ee1\u8db3\u4f60\u5404\u79cd\u573a\u666f\u4e0b\u7684\u6267\u884c\u9700\u6c42\uff1b \u652f\u6301\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u529f\u80fd\uff0c\u53ef\u5b9a\u4f4d\u53ef\u65ad\u8a00\uff0c\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\uff1b \u5b8c\u7f8e\u517c\u5bb9 Wayland \u548c X11\uff0c\u771f\u6b63\u505a\u5230\u4e00\u5957\u4ee3\u7801\uff0c\u968f\u5904\u6267\u884c\uff1b \u652f\u6301\u591a\u79cd\u65b9\u5f0f\u7684\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u5176\u4e2d\u5f02\u6b65\u56de\u586b\u7684\u65b9\u6848\uff0c\u5b8c\u7f8e\u89e3\u51b3\u4e86\u6570\u636e\u56de\u586b\u7684\u8017\u65f6\u95ee\u9898\uff1b \u3010\u89c6\u9891\u4ecb\u7ecd\u3011"},{"location":"#_2","title":"\u4e8c\u3001\u5b89\u88c5\u4f7f\u7528","text":"\u57fa\u7840\u6846\u67b6\uff1ahttps://github.com/linuxdeepin/deepin-autotest-framework \u4ece PyPI \u5b89\u88c5: sudo pip3 install youqu\n \u521b\u5efa\u9879\u76ee: youqu-startproject youqu\n \u5b89\u88c5\u4f9d\u8d56: cd youqu\nbash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002 \u5e94\u7528\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684\u5e94\u7528\u540d\u79f0\u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music cd apps/\n \u5c06\u5e94\u7528\u5e93\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u50cf\u8fd9\u6837\uff1a youqu\n\u251c\u2500\u2500 apps\n\u2502 \u251c\u2500\u2500 autotest_deepin_music # \u5e94\u7528\u5e93\n...\n \u5e94\u7528\u5e93\u7684\u540d\u79f0\u4e0d\u53ef\u4ee5\u4fee\u6539\u3002"},{"location":"#_3","title":"\u4e09\u3001\u8fd0\u884c","text":""},{"location":"#1","title":"1. \u5de5\u4f5c\u7a7a\u95f4","text":"\u57fa\u7840\u6846\u67b6\u5de5\u7a0b\u76ee\u5f55\u5efa\u8bae\u653e\u5728 ~ \u76ee\u5f55\u4e0b\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u4e5f\u53ef\u4ee5\u8fd0\u884c\uff0c\u4f46\u662f\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u9700\u8981\u505a\u73af\u5883\u6e05\u7406\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u5b58\u5728\u4ee3\u7801\u88ab\u5220\u9664\u7684\u98ce\u9669\u3002 \u5982\u679c\u4f60\u7684\u673a\u5668\u4e0a\u4e0d\u540c\u76ee\u5f55\u4e0b\u5b58\u5728\u591a\u4e2a YouQu \u5de5\u7a0b\uff0c\u90a3\u4e48\u5728\u8fd0\u884c\u4e4b\u524d\uff0c\u8bf7\u5148\u6267\u884c env.sh \u6821\u6b63\u76f8\u5173\u73af\u5883\u3002"},{"location":"#2","title":"2. \u6267\u884c\u5668","text":"\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u6709\u4e00\u4e2a manage.py \uff0c\u5b83\u662f\u4e00\u4e2a\u6267\u884c\u5668\u5165\u53e3\uff0c\u63d0\u4f9b\u4e86\u672c\u5730\u6267\u884c\u3001\u8fdc\u7a0b\u6267\u884c\u7b49\u7684\u529f\u80fd\u3002 \u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6765\u6267\u884c\uff1a youqu manage.py run -a deepin-music\n"},{"location":"#21","title":"2.1. \u672c\u5730\u6267\u884c","text":"youqu manage.py run\n"},{"location":"#211","title":"2.1.1. \u914d\u7f6e\u6587\u4ef6","text":"\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u914d\u7f6e\u53c2\u6570 \u5728\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u91cc\u9762\u652f\u6301\u914d\u7f6e\u5bf9\u6267\u884c\u7684\u4e00\u4e9b\u53c2\u6570\u8fdb\u884c\u914d\u7f6e\uff0c\u5e38\u7528\u7684\u5982\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;-----------------------------------------------\n;1.KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2.KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f\n;e.g. TAGS = L1 or smoke\n;-----------------------------------------------\n;\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\uff0c\u5c06\u8981\u6267\u884c\u7684\u7528\u4f8b\u5199\u5165\u6307\u5b9a\u7684 csv \u6587\u4ef6\n;\u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u4ece\u57fa\u7840\u6846\u67b6\u6839\u76ee\u5f55\u5f00\u59cb\uff1ae.g. CASE_FILE = case_list.txt\n;\u5982\u679c\u8fd9\u91cc\u6709\u503c\uff0cAPP_NAME KEYWORDS TAGS \u7684\u914d\u7f6e\u5747\u4e0d\u751f\u6548\nCASE_FILE =\n;=============================== RUNNER CONFIG ===================================\n[runner]\n;\u6700\u5927\u5931\u8d25\u7528\u4f8b\u6570\u91cf\u7684\u5360\u6bd4\n;\u6bd4\u5982\uff1a\u603b\u6267\u884c\u7528\u4f8b\u6570\u4e3a 100, \u82e5 MAX_FAIL = 0.5,\u5219\u5931\u8d25\u7528\u4f8b\u6570\u8fbe\u5230 50 \u5c31\u4f1a\u7ec8\u6b62\u6d4b\u8bd5\u3002\nMAX_FAIL = 1\n;\u5355\u6761\u7528\u4f8b\u7684\u8d85\u65f6\u65f6\u95f4\uff0c\u5982\u679c\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u8d85\u65f6\uff0c\u8fd9\u6761\u7528\u4f8b\u4f1a\u88ab\u505c\u6b62\uff0c\u540e\u7eed\u7528\u4f8b\u7ee7\u7eed\u6267\u884c\u3002\n;\u5355\u4f4d\u4e3a\u79d2\n;\u8fd9\u662f\u4e00\u4e2a\u5168\u5c40\u7edf\u4e00\u914d\u7f6e\uff0c\u5982\u679c\u67d0\u6761\u7528\u4f8b\u9700\u8981\u5355\u72ec\u914d\u7f6e\u8d85\u65f6\u65f6\u95f4\uff0c\u53ef\u4ee5\u5728\u7528\u4f8b\u4e2d\u8fd9\u6837\u5199\uff1a\n;@pytest.mark.timeout(500)\n;def test_xxx_001():\n; ...\n;\u4f1a\u8bdd\u8d85\u65f6\uff08\u6240\u6709\u7528\u4f8b\u6267\u884c\u7684\u8d85\u65f6\u65f6\u95f4\uff09\u662f\u6839\u636e\u5168\u5c40\u8d85\u65f6\u914d\u7f6e\u548c\u7528\u4f8b\u5355\u72ec\u8d85\u65f6\u914d\u7f6e\u81ea\u52a8\u8ba1\u7b97\u7684\u3002\nCASE_TIME_OUT = 200\n;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\n;\u6ce8\u610f\uff0cRERUN = 1 \u8868\u793a\u91cd\u8dd1 1 \u6b21\uff0c\u5373\u7b2c\u4e00\u6b21\u7528\u4f8b\u6267\u884c\u5931\u8d25\u4f1a\u81ea\u52a8\u91cd\u8dd1 1 \u6b21\uff0c\u603b\u5171\u6267\u884c 2 \u6b21\uff1b\n;\u5982\u679c\u7b2c 2 \u6b21\u6267\u884c\u6210\u529f\uff0c\u7ed3\u679c\u6210\u529f\uff0c\u5931\u8d25\u4ea6\u4e3a\u5931\u8d25\u3002\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c 1 \u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff0cRERUN >= RECORD_FAILED_CASE\u3002\n;1.\u5173\u95ed\u5f55\u5c4f\uff1aRECORD_FAILED_CASE > RERUN\n;2.\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1aRECORD_FAILED_CASE = 0\nRECORD_FAILED_CASE = 1\n;yes \u6bcf\u6761\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u8fdb\u884c\u73af\u5883\u6e05\u7406\nCLEAN_ALL = yes\n;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387, \u6bd4\u5982\uff1a1920x1080\n;no: \u8868\u793a\u4e0d\u505a\u5206\u8fa8\u7387\u6821\u9a8c\nRESOLUTION = 1920x1080\n;\u4e0d\u8df3\u8fc7\u7528\u4f8b\uff0ccsv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86 skip-xxx\u7684\u7528\u4f8b\u4e0d\u8df3\u8fc7\nNOSKIP = no\n;ignore fixed\n;no\uff0c\u53ea\u8981\u6807\u8bb0\u4e86fixed\u7684\u7528\u4f8b\uff0c\u5373\u4f7f\u6807\u8bb0\u4e86skip-\uff0c\u4e5f\u4f1a\u6267\u884c\uff1b\n;yes\uff0cfixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\uff1b\nIFIXED = no\n;\u8981\u5b89\u88c5deb\u5305\u7684\u8def\u5f84\n;e.g : ~/Downloads/ \u5b89\u88c5\u4e0b\u8f7d\u76ee\u5f55\u4e0b\u7684deb\u5305\uff0c\u5982\u679c\u662f\u8fdc\u7a0b\u6267\u884c\uff0c\u4f1a\u81ea\u52a8\u62f7\u8d1d\u5230\u8fdc\u7a0b\u5e76\u5b89\u88c5\u3002\nDEB_PATH =\n;DEBUG \u6a21\u5f0f\u6267\u884c\u7528\u4f8b\uff0c\u53ea\u6536\u96c6\u4e0d\u6267\u884c\u7528\u4f8b\uff0c\u4e5f\u4e0d\u505a\u8bbe\u5907\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002\nDEBUG = no\n;\u8bb0\u5f55top\u547d\u4ee4\u67e5\u8be2\u7684\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0cTOP = 3 \u8868\u793a\u8bb0\u5f55\u524d3\u4e2a\u8fdb\u7a0b\u3002\nTOP =\n;\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\nREPEAT =\n;\u9ed8\u8ba4\u5728\u6240\u6709\u6d4b\u8bd5\u5b8c\u6210\u4e4b\u540e\u8f93\u51fa\u62a5\u9519\u4fe1\u606f.\n;yes, \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\nDURING_FAIL = no\n;\u6ce8\u518c\u81ea\u542f\u670d\u52a1\nAUTOSTART = no\n;=============================== REPORT CONFIG ===================================\n[report]\n;\u6d4b\u8bd5\u62a5\u544a\u7684title\nREPORT_TITLE = YouQu Report\n;\u6d4b\u8bd5\u62a5\u544a\u7684name\nREPORT_NAME = YouQu Report\n;\u6d4b\u8bd5\u62a5\u544a\u7684\u9ed8\u8ba4\u8bed\u8a00\n;en:English\n;ru:\u0420\u0443\u0441\u0441\u043a\u0438\u0439\n;zh:\u4e2d\u6587\n;de:Deutsch\n;nl:Nederlands\n;he:Hebrew\n;br:Brazil\n;pl:Polski\n;ja:\u65e5\u672c\u8a9e\n;es:Espa\u00f1ol\n;kr:\ud55c\uad6d\uc5b4\n;fr:Fran\u00e7ais\n;az:Az\u0259rbaycanca\nREPORT_LANGUAGE = zh\n;\u7528\u4f8b\u6267\u884c\u5b8c\u540e\u751f\u6210\u7684\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n;\u76ee\u524d\u652f\u6301 allure, xml, json \uff08\u652f\u6301\u540c\u65f6\u751f\u6210\uff09\nREPORT_FORMAT = allure, xml, json\n;\u6307\u5b9a\u62a5\u544a\u751f\u6210\u7684\u8def\u5f84\uff08\u76f8\u5bf9\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\uff09\nALLURE_REPORT_PATH = report/\nXML_REPORT_PATH = report/\nJSON_REPORT_PATH = report/\n;=============================== GLOBAL CONFIG ===================================\n[globalconfig]\n;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\nPASSWORD = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\nIMAGE_MATCH_NUMBER = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6bcf\u6b21\u95f4\u9694\u7b49\u5f85\u65f6\u95f4\nIMAGE_MATCH_WAIT_TIME = 1\n;\u56fe\u50cf\u8bc6\u522b\u5339\u914d\u5ea6\nIMAGE_RATE = 0.9\n;\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u5b9e\u65f6\u56fe\u50cf\u4fdd\u5b58\u8def\u5f84\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u5750\u6807\nSCREEN_CACHE = /tmp/screen.png\n;\u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\u7684\u8def\u5f84\nTMPDIR = /tmp/tmpdir\n;\u7cfb\u7edf\u4e3b\u9898\nSYS_THEME = deepin\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = youqu-dev.uniontech.com\n;OpenCV\u670d\u52a1\u7aef\u5730\u5740\nOPENCV_SERVER_HOST = youqu-dev.uniontech.com\n;=============================== PMS CONFIG ===================================\n;PMS\u76f8\u5173\u914d\u7f6e\uff0c\u5305\u542b\u4ee5\u4e0b\u51e0\u4e2a\u65b9\u9762\uff1a\n;1.PMS\u6d4b\u8bd5\u5957\u6267\u884c\n;2.\u81ea\u52a8\u4ecePMS\u722c\u53d6\u6570\u636e\u5e76\u540c\u6b65\u672c\u5730CSV\u6587\u4ef6\n;3.PMS\u6570\u636e\u56de\u586b\n[pms]\n;PMS\u7684\u7528\u6237\u540d,\u5982: ut001234\nPMS_USER =\n;PMS\u7684\u5bc6\u7801\nPMS_PASSWORD =\n;PMS\u6d4b\u8bd5\u5957\u7684ID\n;\u5728PMS\u4e0a\u67e5\u770b\u7528\u4f8b\u201c\u5957\u4ef6\u201d\u94fe\u63a5: https://pms.uniontech.com/testsuite-view-495.html\n;\u6d4b\u8bd5\u5957ID\u4e3a: 495\nSUITE_ID =\n;\u6570\u636e\u56de\u586b\u5fc5\u987b\u5173\u8054PMS\u6d4b\u8bd5\u5355\n;\u5728PMS\u4e0a\u67e5\u770b\u6d4b\u8bd5\u5355\u94fe\u63a5: https://pms.uniontech.com/testtask-cases-20747.html\n;\u6d4b\u8bd5\u5355ID\u4e3a: 20747\nTASK_ID =\n;\u5c06\u6d4b\u8bd5\u7ed3\u679c\u6570\u636e\u56de\u586b\u5230PMS\n;\u4e3a\u7a7a: \u8868\u793a\u4e0d\u56de\u586b,\u4e0d\u4f1a\u5728\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u751f\u6210json\u7ed3\u679c\u6587\u4ef6;\n;async: \u8868\u793a\u9010\u6761\u5f02\u6b65\u56de\u586b,\u540e\u9762\u4e00\u6761\u6267\u884c\u5f00\u59cb\u65f6\u901a\u8fc7\u5b50\u7ebf\u7a0b\u5bf9\u524d\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u8fdb\u884c\u56de\u586b\uff0c\u5982\u6b64\u5b9e\u73b0\u65f6\u95f4\u6548\u7387\u6700\u5927\u5316;\n;finish: \u8868\u793a\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u6210\u4e4b\u540e\u9010\u4e2a\u56de\u586b(PMS\u4e0d\u652f\u6301\u5e76\u53d1);\nSEND_PMS =\n;\u6570\u636e\u56de\u586b\u7684\u89e6\u53d1\u8005\n;auto: \u6846\u67b6\u81ea\u52a8\u56de\u586b,\u914d\u5408SEND_PMS\u914d\u7f6e\u4f7f\u7528,\u4f60\u53ef\u4ee5\u9009\u62e9\u5728\u4e0d\u540c\u7684\u9636\u6bb5\u8fdb\u884c\u6570\u636e\u56de\u586b;\n;hand: \u624b\u52a8\u56de\u586b,\u6bcf\u6761\u7528\u4f8b\u4ecd\u7136\u4f1a\u751f\u6210json\u6587\u4ef6,\u4f46\u6846\u67b6\u4e0d\u4f1a\u8fdb\u884c\u6570\u636e\u56de\u586b,\u9700\u8981\u4f60\u53ef\u4ee5\u5728\u4f60\u60f3\u8981\u53d1\u9001\u7684\u65f6\u95f4\u70b9\u624b\u52a8\u89e6\u53d1\u56de\u586b;\nTRIGGER = auto\n;PMS\u56de\u586b\u7684\u91cd\u8bd5\u6b21\u6570\n;\u5982\u679c\u63a5\u53e3\u8bf7\u6c42\u5931\u8d25,\u4f1a\u8fdb\u884c\u91cd\u8bd5\nSEND_PMS_RETRY_NUMBER = 2\n[csv_link_pms_lib]\n;caselib: \u7528\u4f8b\u5e93\n;testcase: \u4ea7\u54c1\u5e93\u7528\u4f8b\nCASE_FROM = caselib\n[csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/caselib-browse-81.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 81\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic =\n[export_csv]\n;\u5bfc\u51fa\u7684csv\u6587\u4ef6\u540d\u79f0\uff0c\u9ed8\u8ba4 case_list.csv\nCSV_FILE = case_list.csv\n;exportcsv \u547d\u4ee4\u5bfc\u51fa case_list.csv \u6587\u4ef6\u65f6\u914d\u7f6e\u7684\u5b57\u6bb5\u540d\uff0c\u7528\u4f8b\u540d\u79f0\u9ed8\u8ba4\u5b58\u5728\u7b2c\u4e00\u5217\uff0c\u65e0\u9700\u6dfb\u52a0\nCSV_HEARD = \u7528\u4f8b\u7ea7\u522b,\u7528\u4f8b\u7c7b\u578b,\u6d4b\u8bd5\u7ea7\u522b,\u662f\u5426\u8df3\u8fc7\n[log_cli]\n;\u65e5\u5fd7\u76f8\u5173\u914d\u7f6e\uff08\u4e0d\u6253\u5370\u6784\u9020\u51fd\u6570\u548c\u9b54\u6cd5\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff09\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = DEBUG\n# ============= \u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u914d\u7f6e ================\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u5f00\u5934\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7, \u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_STARTSWITH = Assert\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u7ed3\u5c3e\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_ENDSWITH = Widget\n;\u652f\u6301\u7c7b\u540d\u5305\u542b xxx \u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_CONTAIN = ShortCut\n# ==============================================\n \u914d\u7f6e\u5b8c\u6210\u4e4b\u540e\uff0c\u76f4\u63a5\u5728\u547d\u4ee4\u884c\u6267\u884c manage.py \u5c31\u597d\u4e86\u3002 youqu manage.py run\n"},{"location":"#212","title":"2.1.2. \u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a youqu manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -h, --help show this help message and exit\n-a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--record_failed_case RECORD_FAILED_CASE\n\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--max_fail MAX_FAIL \u6700\u5927\u5931\u8d25\u7387\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--resolution RESOLUTION\n\u68c0\u67e5\u5206\u8fa8\u7387\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms {,async,finish}\n\u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--trigger {,auto,hand}\n\u89e6\u53d1\u8005\n-f CASE_FILE, --case_file CASE_FILE\n\u6839\u636e\u6587\u4ef6\u6267\u884c\u7528\u4f8b\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n--pms_user PMS_USER pms \u7528\u6237\u540d\n--pms_password PMS_PASSWORD\npms \u5bc6\u7801\n--suite_id SUITE_ID pms \u6d4b\u8bd5\u5957ID\n--pms_info_file PMS_INFO_FILE\npms \u4fe1\u606f\u6587\u4ef6\n--top TOP \u8fc7\u7a0b\u4e2d\u8bb0\u5f55top\u547d\u4ee4\u4e2d\u7684\u503c\n--lastfailed \u4ec5\u6267\u884c\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\n--duringfail \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\n--repeat REPEAT \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n--project_name PROJECT_NAME\n\u5de5\u7a0b\u540d\u79f0\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--build_location BUILD_LOCATION\n\u6784\u5efa\u5730\u533a\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--line LINE \u6267\u884c\u7684\u4e1a\u52a1\u7ebf\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--autostart AUTOSTART \u7528\u4f8b\u6267\u884c\u7a0b\u5e8f\u6ce8\u518c\u5230\u5f00\u673a\u81ea\u542f\u670d\u52a1\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a youqu manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\"\n \u547d\u4ee4\u884c\u53c2\u6570\u4f18\u5148\u7ea7\u662f\u9ad8\u4e8e\u914d\u7f6e\u6587\u4ef6\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u4e86\u5bf9\u5e94\u7684\u53c2\u6570\uff0c\u914d\u7f6e\u6587\u4ef6\u4e2d\u4e0d\u7ba1\u662f\u5426\u914d\u7f6e\u5747\u4e0d\u751f\u6548\u3002 --app \u5165\u53c2\u8fd8\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\uff0c\u4e0b\u9762\u7684\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u540c\u6837\u652f\u6301\u3002"},{"location":"#22","title":"2.2. \u8fdc\u7a0b\u6267\u884c","text":"\u8fdc\u7a0b\u6267\u884c\u5c31\u662f\u7528\u672c\u5730\u4f5c\u4e3a\u670d\u52a1\u7aef\u63a7\u5236\u8fdc\u7a0b\u673a\u5668\u6267\u884c\uff0c\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u76f8\u540c\uff1b \u4f7f\u7528 remote \u547d\u4ee4\uff1a youqu manage.py remote\n"},{"location":"#221","title":"2.2.1. \u8fdc\u7a0b\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u6267\u884c","text":"\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u6267\u884c\u5c31\u662f\u7531\u672c\u5730 YouQu \u4f5c\u4e3a\u670d\u52a1\u7aef\uff0c\u63a7\u5236\u8fdc\u7a0b N \u53f0\u673a\u5668\u6267\u884c\u76f8\u540c\u7684\u7528\u4f8b\uff0c\u6267\u884c\u5b8c\u4e4b\u540e\u6240\u6709\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u7ed3\u679c\u4f1a\u8fd4\u56de\u7ed9\u670d\u52a1\u7aef report \u76ee\u5f55\u4e0b\uff1b \u8fdc\u7a0b\u6267\u884c\u540c\u6837\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u8fdb\u884c\u7528\u4f8b\u76f8\u5173\u914d\u7f6e\uff1b \u9700\u8981\u91cd\u70b9\u8bf4\u4e00\u4e0b\u8fdc\u7a0b\u6267\u884c\u65f6\u7684\u6d4b\u8bd5\u673a\u4fe1\u606f\u914d\u7f6e\uff0c\u5728\u914d\u7f6e\u6587\u4ef6 setting/remote.ini \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\u3001IP\u3001\u5bc6\u7801\u3002 ;=============================== CLIENT LIST =====================================\n; \u6d4b\u8bd5\u673a\u914d\u7f6e\u5217\u8868\n;[client{number}] ;\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u6709\u591a\u5c11\u53f0\u6d4b\u8bd5\u673a\u5c31\u5199\u591a\u5c11\u4e2a client\uff0c\u522b\u540d\u5fc5\u987b\u5305\u542b client \u5b57\u7b26\uff0c\u4e14\u4e0d\u80fd\u91cd\u590d\u3002\n;user = ;\u6d4b\u8bd5\u673a user\n;ip = ;\u6d4b\u8bd5\u673a ip\n;password = 1 ;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801, \u53ef\u4ee5\u4e0d\u914d\u7f6e\u6b64\u9879\uff0c\u9ed8\u8ba4\u53d6 CLIENT_PASSWORD \u7684\u503c\uff1b\n;\u5982\u679c\u4f60\u6240\u6709\u6d4b\u8bd5\u673a\u5bc6\u7801\u90fd\u76f8\u540c\uff0c\u90a3\u4e48\u53ea\u9700\u8981\u914d\u7f6e CLIENT_PASSWORD \u5c31\u53ef\u4ee5\u4e86\n;=================================================================================\n[client1]\nuser = uos\nip = 10.8.15.xx\n[client2]\nuser = uos\nip = 10.8.15.xx\n[client3]\nuser = uos\nip = 10.8.11.xx\n \u6709\u591a\u5c11\u53f0\u673a\u5668\u5c31\u50cf\u8fd9\u6837\u53c2\u8003\u4e0a\u9762\u7684\u683c\u5f0f\u5199\u5c31\u884c\u4e86\u3002 \u7136\u540e\u5728\u547d\u4ee4\u884c\uff1a youqu manage.py remote\n \u8fd9\u6837\u8fd0\u884c\u662f\u4ece\u914d\u7f6e\u6587\u4ef6\u53bb\u8bfb\u53d6\u76f8\u5173\u914d\u7f6e\u3002 \u5982\u679c\u4f60\u4e0d\u60f3\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\uff0c\u4f60\u4ecd\u7136\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u8fdb\u884c\u4f20\u53c2\uff0c \u4ee5\u4e0b\u4e3a python3 manage.py remote \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -h, --help show this help message and exit\n-c CLIENTS, --clients CLIENTS\n\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679cpassword\u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6sett\ning/remote.ini\u4e2dCLIENT_PASSWORD\u7684\u503c,\u6bd4\u5982: uos@10.8.13.33:1\n\u6216 uos@10.8.13.33\n-s, --send_code \u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a\uff08\u4e0d\u542breport\u76ee\u5f55\uff09\n-e, --build_env \u642d\u5efa\u6d4b\u8bd5\u73af\u5883,\u5982\u679c\u4e3ayes\uff0c\u4e0d\u7ba1send_code\u662f\u5426\u4e3ayes\u90fd\u4f1a\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a.\n-p CLIENT_PASSWORD, --client_password CLIENT_PASSWORD\n\u6d4b\u8bd5\u673a\u5bc6\u7801\uff08\u5168\u5c40\uff09\n-y PARALLEL, --parallel PARALLEL\nyes:\u8868\u793a\u6240\u6709\u6d4b\u8bd5\u673a\u5e76\u884c\u8dd1\uff0c\u6267\u884c\u76f8\u540c\u7684\u6d4b\u8bd5\u7528\u4f8b;no:\u8868\u793a\u6d4b\u8bd5\u673a\u5206\u5e03\u5f0f\u6267\u884c\uff0c\u670d\u52a1\u7aef\u4f1a\u6839\u636e\u6536\u96c6\u5230\u7684\u6d4b\u8bd5\u7528\u4f8b\u81ea\n\u52a8\u5206\u914d\u7ed9\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u3002\n \u9664\u4e86\u8fd9\u4e9b\u7279\u6709\u53c2\u6570\u4ee5\u5916\uff0c\u5b83\u540c\u6837\u652f\u6301\u672c\u5730\u6267\u884c\u7684\u6240\u6709\u53c2\u6570\uff1b \u5728\u547d\u4ee4\u884c\u8fd9\u6837\u8fd0\u884c\uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\"\n \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report \u76ee\u5f55\u4e0b\u56de\u6536\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u7684\u6d4b\u8bd5\u62a5\u544a\u3002 \u6ce8\u610f\uff0c\u5982\u679c\u8fdc\u7a0b\u673a\u5668\u6ca1\u6709\u642d\u5efa\u81ea\u52a8\u5316\u6d4b\u8bd5\u73af\u5883\uff0c\u8bb0\u5f97\u52a0\u4e0a\u53c2\u6570 -e \uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\" -e\n \u6267\u884c\u524d\u786e\u4fdd\u8fdc\u7a0b\u673a\u5668\u5df2\u7ecf\u5f00\u542f\u4e86 ssh \u670d\u52a1\uff0c\u5426\u5219\u4f1a\u63d0\u793a\u65e0\u6cd5\u8fde\u63a5\uff0c\u5982\u679c\u6ca1\u6709\u5f00\u542f\uff0c\u8bf7\u624b\u52a8\u5f00\u542f\uff1a sudo systemctl restart ssh\nsudo systemctl enable ssh\n \u914d\u7f6e\u6587\u4ef6\u5176\u4ed6\u76f8\u5173\u914d\u7f6e\u9879\u8be6\u7ec6\u8bf4\u660e\uff0c\u8bf7\u67e5\u770b\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u6ce8\u91ca\u5185\u5bb9\u3002"},{"location":"#222","title":"2.2.2. \u8fdc\u7a0b\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u8d1f\u8f7d\u5747\u8861\u6267\u884c","text":"\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u8d1f\u8f7d\u5747\u8861\u6267\u884c\u4e5f\u662f\u7528\u672c\u5730\u4f5c\u4e3a\u670d\u52a1\u7aef\u63a7\u5236\u8fdc\u7a0b\u673a\u5668\u6267\u884c\uff0c\u4f46\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u4e0d\u540c\uff0c\u800c\u662f\u6240\u6709\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u4e4b\u548c\uff0c\u4e3a\u4f60\u60f3\u8981\u6267\u884c\u7684\u7528\u4f8b\u96c6\uff1b \u4f3c\u4e4e\u6709\u70b9\u96be\u4ee5\u7406\u89e3\uff0c\u6211\u7528\u5927\u767d\u8bdd\u4e3e\u4f8b\u63cf\u8ff0\u4e0b\u5c31\u662f\uff0c\u670d\u52a1\u7aef\u60f3\u8981\u6267\u884c 10 \u6761\u7528\u4f8b\uff0c\u73b0\u5728\u8fdc\u7a0b\u673a\u5668\u6709 5 \u53f0\uff1b \u7136\u540e\u670d\u52a1\u7aef\u5c31\u5148\u62ff\u7740\u7b2c 1 \u6761\u7528\u4f8b\u7ed9\u8fdc\u7a0b 1 \u53f7\u673a\u6267\u884c\uff0c\u62ff\u7b2c 2 \u6761\u7528\u4f8b\u7ed9\u8fdc\u7a0b 2 \u53f7\u673a\u6267\u884c...\uff0c\u5982\u6b64\u5faa\u73af\u76f4\u5230\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\uff0c\u8fd9\u5c31\u662f\u8d1f\u8f7d\u5747\u8861\u6267\u884c\u3002 \u4f7f\u7528\u65b9\u6cd5\u548c\u524d\u9762\u4e00\u6837\uff0c\u53ea\u662f\u9700\u8981\u589e\u52a0\u4e00\u4e2a\u53c2\u6570\uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\" --parallel no\n"},{"location":"#23-pms","title":"2.3. PMS \u6570\u636e\u56de\u586b","text":"\u6d4b\u8bd5\u5355\u5173\u8054\u7684\u7528\u4f8b\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u5bf9\u5e94\u7684\u53bb\u8dd1\u8fd9\u4e9b\u5173\u8054\u7684\u7528\u4f8b\uff0c\u5e76\u4e14\u5c06\u6267\u884c\u7684\u7ed3\u679c\u56de\u586b\u7684\u6d4b\u8bd5\u7528\u4f8b\u7684\u72b6\u6001\u91cc\u9762\u3002 PMS \u6570\u636e\u56de\u586b\u4e3b\u8981\u6709\u4e09\u79cd\u65b9\u5f0f\uff1a \uff081\uff09\u5f02\u6b65\u56de\u586b \u5728\u7528\u4f8b\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\uff0c\u91c7\u7528\u5f02\u6b65\u7684\u65b9\u5f0f\u53bb\u8fdb\u884c\u6570\u636e\u56de\u586b\uff0c\u76f4\u767d\u7684\u8bb2\u5c31\u662f\uff0c\u7b2c\u4e8c\u6761\u7528\u4f8b\u5f00\u59cb\u8dd1\u7684\u65f6\u5019\uff0c\u901a\u8fc7\u5b50\u7ebf\u7a0b\u53bb\u505a\u7b2c\u4e00\u6761\u7528\u4f8b\u7684\u6570\u636e\u56de\u586b\uff0c\u5982\u6b64\u5faa\u73af\uff0c\u76f4\u5230\u6240\u6709\u7528\u4f8b\u6267\u884c\u7ed3\u675f\uff1b \u8fd9\u79cd\u65b9\u6848\u7684\u65f6\u95f4\u6548\u7387\u6700\u9ad8\u7684\uff0c\u56e0\u4e3a\u7406\u8bba\u4e0a\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u662f\u5927\u4e8e\u6570\u636e\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\u65f6\u95f4\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u5f53\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u6570\u636e\u56de\u586b\u4e5f\u5b8c\u6210\u4e86\u3002 \u4f7f\u7528\u65b9\u6cd5\uff0c\u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u4ee5\u4e0b\u53c2\u6570\uff1a\uff08\u4ee5\u4e0b\u6d89\u53ca\u5230\u7684\u53c2\u6570\u914d\u7f6e\u90fd\u662f\u5728\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u914d\u7f6e\uff09 PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = async\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \u8fd9\u4e2a\u53c2\u6570\u53ef\u586b\u53ef\u4e0d\u586b\uff0c\u4f46\u662f\u586b\u4e86\u53ef\u4ee5\u63d0\u9ad8\u7528\u4f8b\u7684\u6267\u884c\u901f\u5ea6\uff0c\u56e0\u4e3a\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u53ef\u4ee5\u6307\u5b9a\u5230\u5177\u4f53\u7684\u5e94\u7528\u5e93\u3002\uff08\u4e0b\u540c\uff09\n \uff082\uff09\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u56de\u586b \u7b49\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u518d\u9010\u4e2a\u8fdb\u884c\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u6b64\u65b9\u6848\u65f6\u95f4\u6548\u7387\u6bd4\u8f83\u4f4e\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \uff083\uff09\u624b\u52a8\u56de\u586b \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4e0d\u505a\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u540e\u7eed\u624b\u52a8\u5c06\u7ed3\u679c\u8fdb\u884c\u56de\u586b\u8bf7\u6c42\u3002 \u7528\u4f8b\u6267\u884c\u65f6\u914d\u7f6e\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = hand\nAPP_NAME = \u540e\u7eed\u624b\u52a8\u56de\u586b\u65b9\u6cd5\uff1a youqu manage.py pms --send2task yes\n"},{"location":"#_4","title":"\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898","text":"\u7531\u540c\u5b66\u53ef\u80fd\u4f1a\u53d1\u73b0\uff0c\u600e\u4e48\u56de\u586b\u4e00\u6b21\u4e4b\u540e\uff0c\u540e\u9762\u60f3\u518d\u6b21\u56de\u586b\u5c31\u4e0d\u751f\u6548\u4e86\uff1b \u8fd9\u662f\u56e0\u4e3a\u4e3a\u4e86\u5e94\u5bf9\u524d\u9762\u63d0\u5230\u7684\u591a\u79cd\u6570\u636e\u56de\u586b\u7684\u65b9\u5f0f\uff0c\u5728 report \u76ee\u5f55\u4e0b\u4f1a\u7531 pms_xxx \u5f00\u5934\u7684\u76ee\u5f55\uff0c\u8bb0\u5f55\u4e86\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u548c\u56de\u586b\u60c5\u51b5\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u4e4b\u524d\u5df2\u7ecf\u56de\u586b\u8fc7\u4e86\uff0c\u540e\u7eed\u5c31\u4e0d\u4f1a\u518d\u6b64\u89e6\u53d1\u56de\u586b\u4e86\uff1b \u5982\u679c\u4f60\u60f3\u91cd\u65b0\u505a\u56de\u586b\uff0c\u4f60\u53ef\u4ee5\u628a report/pms_xxx \u76ee\u5f55\u5220\u6389\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u91cd\u65b0\u505a\u6570\u636e\u56de\u586b\u4e86\uff1b"},{"location":"#24-csv","title":"2.4. \u5bfc\u51fa CSV \u6587\u4ef6","text":"\u6846\u67b6\u63d0\u4f9b\u5bfc\u51fa\u6307\u5b9a\u6807\u7b7e\u7528\u4f8b\u7684\u529f\u80fd\uff1a youqu manage.py exportcsv -a deepin-album -t CICD\n \u8868\u793a\u5bfc\u51fa deepin-album \u7684\u7528\u4f8b\u4e2d\u6807\u8bb0\u4e86 CICD \u6807\u7b7e\u7684\u7528\u4f8b\uff0c\u5bfc\u51fa CSV \u6587\u4ef6\u7684\u5b57\u6bb5\u683c\u5f0f\u5df2\u7ecf\u9002\u914d\u4e86 CICD \u7684\u8981\u6c42\u3002"},{"location":"#25-app","title":"2.5. \u811a\u624b\u67b6\u65b0\u5efa APP \u5de5\u7a0b","text":"\u65b0\u5efa\u4e00\u4e2a APP \u5de5\u7a0b\uff1a youqu manage.py startapp autotest_deepin_some \u8fd9\u6837\u5728 apps \u76ee\u5f55\u4e0b\u4f1a\u521b\u5efa\u4e00\u4e2a\u5b50\u9879\u76ee\u5de5\u7a0b autotest_deepin_some\uff0c\u540c\u65f6\u65b0\u5efa\u597d\u5de5\u7a0b\u6a21\u677f\u76ee\u5f55\u548c\u6a21\u677f\u6587\u4ef6\uff1a apps\n\u2514\u2500\u2500 autotest_deepin_some\n \u00a0\u00a0 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_case.py\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 config.ini\n \u00a0\u00a0 \u251c\u2500\u2500 config.py\n \u00a0\u00a0 \u251c\u2500\u2500 conftest.py\n \u00a0\u00a0 \u251c\u2500\u2500 control\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_assert.py\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some.csv\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u2514\u2500\u2500 widget\n \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 case_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 other.ini\n \u00a0\u00a0 \u251c\u2500\u2500 other_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 pic_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2514\u2500\u2500 ui.ini\n autotest_deepin_some \u662f\u4f60\u7684\u5de5\u7a0b\u540d\u79f0\uff0c\u6bd4\u5982\uff1aautotest_deepin_music \uff1b \u5728\u6b64\u57fa\u7840\u4e0a\uff0c\u4f60\u53ef\u4ee5\u5feb\u901f\u7684\u5f00\u59cb\u4f60\u7684 AT \u9879\u76ee\u3002"},{"location":"#26","title":"2.6. \u7528\u4f8b\u6807\u7b7e\u81ea\u52a8\u540c\u6b65","text":"\u7528\u4e8e\u81ea\u52a8\u540c\u6b65 PMS \u7528\u4f8b\u6807\u7b7e\u6570\u636e\u81f3\u672c\u5730 CSV \u6587\u4ef6\uff0c\u4e3b\u8981\u901a\u8fc7\u4ee5\u4e0b\u51e0\u4e2a\u914d\u7f6e\u6765\u63a7\u5236\uff1a APP_NAME = # \u6307\u5b9a\u8981\u540c\u6b65\u7684\u5e94\u7528\u540d\u79f0\nPMS_USER = # PMS\u7684\u7528\u6237\u540d\nPMS_PASSWORD = # PMS\u7684\u5bc6\u7801\n \u5728 [csv_link_pms_id] \u8282\u70b9\u4e0b\u6307\u5b9a csv \u6587\u4ef6\u540d\u4e0e PMS \u7528\u4f8b\u6a21\u5757\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u6bd4\u5982\uff1a [csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/testcase-browse-53.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 53\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic = 53\n \u5c06\u4ee5\u4e0a\u4fe1\u606f\u914d\u7f6e\u597d\u4e4b\u540e\uff0c\u5728\u547d\u4ee4\u884c\u6267\u884c\uff1a youqu manage.py pms --pms2csv yes\n \u6bcf\u6b21\u6267\u884c\u65f6\u539f csv \u6587\u4ef6\u4f1a\u81ea\u52a8\u5907\u4efd\u5728 report/csv_back \u76ee\u5f55\u4e0b\uff0c\u56e0\u6b64\u4f60\u4e0d\u7528\u62c5\u5fc3\u811a\u672c\u6267\u884c\u5bfc\u81f4\u4f60\u7684\u6570\u636e\u4e22\u5931\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u57fa\u7840\u6846\u67b6\u8bbe\u8ba1\u65b9\u6848","text":"# ====================================\n# Author : Mikigo\n# Time : 2022/3/18\n# version \uff1a1.0\n# ====================================\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"\u505a\u4e00\u4e2a\u7b80\u5355\u3001\u597d\u7528\u3001\u529f\u80fd\u5f3a\u5927\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u3002 \u4f5c\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4e00\u4e2a\u57fa\u7840\u6846\u67b6\uff0c\u4efb\u4f55\u5e94\u7528\u90fd\u80fd\u5f88\u65b9\u4fbf\u7684\u63a5\u5165\u8fdb\u6765\uff1b \u63d0\u4f9b\u6240\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u9700\u8981\u7684\u5e95\u5c42\u529f\u80fd\uff0c\u5e76\u5bf9\u5916\u63d0\u4f9b\u552f\u4e00\u7684\u63a5\u53e3\uff0c\u65b9\u4fbf\u5e94\u7528\u5e93\u4f7f\u7528\uff1b \u6574\u5408\u516c\u5171\u5e93\uff0c\u51cf\u5c11\u5e94\u7528\u5e93\u4ee3\u7801\u91cf\u548c\u65b9\u6cd5\u7ef4\u62a4\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u8bbe\u8ba1\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u7edf\u4e00\u6982\u5ff5","text":" \u57fa\u7840\u6846\u67b6 \u672c\u9879\u76ee\u662f\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\uff08AutoTest Basic Frame\uff09\uff0c\u5168\u79f0\u4e3a\u201c\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff08AT \u57fa\u7840\u6846\u67b6\uff09\u201d\u3002 AT \u57fa\u7840\u6846\u67b6\u662f\u505a\u4e3a\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\u6765\u8bbe\u8ba1\u7684\uff0c\u5b83\u63d0\u4f9b\u4e86\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u57fa\u7840\u529f\u80fd\uff0c\u4efb\u4f55\u5e94\u7528\u63a5\u5165\u8fdb\u6765\u90fd\u80fd\u5feb\u901f\u65b9\u4fbf\u7684\u8fdb\u884c\u65b9\u6cd5\u548c\u7528\u4f8b\u7f16\u5199\uff0c\u540c\u65f6\u5728\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u3001\u6807\u7b7e\u5316\u6267\u884c\u3001\u5206\u5e03\u5f0f\u6267\u884c\u3001\u591a\u79cd\u62a5\u544a\u8f93\u51fa\u3001\u4f18\u7f8e\u7684\u6267\u884c\u65e5\u5fd7\u3001\u5931\u8d25\u81ea\u52a8\u5f55\u5c4f\u548c\u622a\u56fe\u3001\u81ea\u52a8\u73af\u5883\u6e05\u7406\u7b49\u7b49\uff0c\u5b83\u90fd\u63d0\u4f9b\u4e86\u5b8c\u5584\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u66f4\u91cd\u8981\u7684\u662f\u8fd9\u4e00\u5207\u4f7f\u7528\u8d77\u6765\u90fd\u975e\u5e38\u7b80\u5355\u3002 \u57fa\u7840\u6846\u67b6\u4e2d\u5305\u542b\u5e94\u7528\u5e93\uff08apps\uff09\u3001\u6838\u5fc3\u5e93\uff08src\uff09\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09\u3002 \u5e94\u7528\u5e93\uff08apps\uff09 \u5404\u4e2a\u5e94\u7528\u81ea\u5df1\u7684\u4ed3\u5e93\uff0c\u91cc\u9762\u4e3b\u8981\u5305\u542b\u7684\u662f\u7528\u4f8b\u3001\u65b9\u6cd5\u53ca\u4e00\u4e9b\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u53eb autotest-dde-file-manager \u3002 \u6838\u5fc3\u5e93\uff08src\uff09 \u6838\u5fc3\u5e93\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u5230\u6240\u6709\u5e95\u5c42\u6838\u5fc3\u529f\u80fd\uff0c\u8fd9\u662f\u6700\u91cd\u8981\u7684\u4e00\u4e2a\u90e8\u5206\uff0c\u7075\u9b42\u3002\u5177\u4f53\u529f\u80fd\u6a21\u5757\u53ca\u8bf4\u660e\u4f1a\u5728\u4e0b\u9762\u7b2c\u56db\u4e2a\u7ae0\u8282\u8be6\u7ec6\u63cf\u8ff0\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09 \u591a\u4e2a\u5e94\u7528\u90fd\u8981\u7528\u5230\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\uff0c\u6309\u7167\u5e94\u7528\u5212\u5206\u5b58\u653e\uff0c\u4e3b\u8981\u662f\u4e3a\u4e86\u51cf\u5c11\u4ee3\u7801\u91cf\uff0c\u6d88\u9664\u5e94\u7528\u95f4\u7684\u8026\u5408\u5173\u7cfb\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u67b6\u6784\u56fe","text":"\u6574\u4f53\u7684\u6846\u67b6\u8bbe\u8ba1\u5728\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u300b\u6587\u6863\u91cc\u9762\u5df2\u7ecf\u6709\u8be6\u7ec6\u63cf\u8ff0\u4e86\uff0c\u8fd9\u91cc\u8d34\u4e00\u4e0b\u6574\u4f53\u7684\u67b6\u6784\u56fe\uff1a \u4e3a\u4e86\u7a81\u663e\u672c\u6587\u7684\u91cd\u70b9\uff0c\u62bd\u53d6\u5176\u4e2d\u91cd\u8981\u529f\u80fd\u6a21\u5757\uff0c\u5982\u4e0b\u56fe\uff1a "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-basic-frame # \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\n\u251c\u2500\u2500 apps # \u5e94\u7528\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-dde-file-manager # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\uff08\u5e94\u7528\u5e93\u8be6\u7ec6\u76ee\u5f55\u7ed3\u6784\u8bf7\u770b\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\uff09\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 tag # \u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u2514\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u2502 \u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 xxx.png\n\u2502 \u2502 ...\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-deepin-music # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 public # \u516c\u5171\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget # dde_dock \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget # dde_desktop \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 src # \u6838\u5fc3\u5e93\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 button_center.py\n\u2502 \u251c\u2500\u2500 cmdtrl.py\n\u2502 \u251c\u2500\u2500 dogtails.py\n\u2502 \u251c\u2500\u2500 find_image.py\n\u2502 \u251c\u2500\u2500 global_config.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 setting # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 config.py\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 global_config.ini\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\u6a21\u5757\uff08Hook\uff09\n\u251c\u2500\u2500 pytest.ini # Pytest \u9ed8\u8ba4\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 docs # \u6587\u6863\u76ee\u5f55\n\u2514\u2500\u2500 manage.py # \u6267\u884c\u5668\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1apps","title":"1\u3001\u5e94\u7528\u5e93\uff08apps\uff09","text":"\u6240\u6709\u5e94\u7528\u5e93\u5747\u653e\u7f6e\u5728\u57fa\u7840\u6846\u67b6\u4e0b\u7684 apps \u76ee\u5f55\u4e0b\uff08\u89c1\u7b2c\u4e8c\u7ae0\u8282\u7b2c3\u6bb5\u76ee\u5f55\u7ed3\u6784\u5185\u5bb9\uff09\u3002\u5e94\u7528\u5e93\u7684\u67b6\u6784\u8bbe\u8ba1\u53ef\u4ee5\u53c2\u8003\u300aAT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b\u6587\u6863\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2src","title":"2\u3001\u6838\u5fc3\u5e93\uff08src\uff09","text":"\u5728 src \u76ee\u5f55\u4e0b\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u5e95\u5c42\u6838\u5fc3\u7ec4\u4ef6\uff0c\u901a\u5e38\u6765\u8bb2\u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5230\u5176\u4e2d\u67d0\u4e00\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4e48\u4f60\u9700\u8981\u663e\u793a\u7684\u5bfc\u5165\u8fd9\u4e2a\u6a21\u5757\uff0c\u7136\u540e\u624d\u80fd\u4f7f\u7528\u8be5\u6a21\u5757\u4e0b\u7684\u529f\u80fd\uff0c\u5982\u679c\u4f60\u7528\u5230\u4e86\u5341\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4f60\u5c31\u9700\u8981\u5bfc\u5165\u5341\u4e2a\u3002\u4f46\u662f\u6211\u4eec\u60f3\u8ba9\u4e8b\u60c5\u53d8\u5f97\u7b80\u5355\uff0c\u4e00\u6b21\u5bfc\u5165\uff0c\u4f7f\u7528\u6240\u6709\u3002 \u5c06\u6240\u6709\u7684\u529f\u80fd\u6a21\u5757\u90fd\u8fdb\u5165\u5230 src \u7684\u540d\u79f0\u7a7a\u95f4\uff0c\u5728 src/__init__.py \u91cc\u9762\u6211\u4eec\u8bbe\u8ba1\u6210\u8fd9\u6837\uff1a # src/__init__.py\nfrom .cmdctl import CmdCtl\nfrom .dogtails import Dogtail\nfrom .find_image import FindImage\nfrom .button_center import ButtonCenter\nclass Src(CmdCtl, FindImage):\ndef __init__(self, **kwargs):\n\"\"\"dogtail or button center param\n :param kwargs: app_name, desc, number\n \"\"\"\nif kwargs:\napp_name = kwargs.get(\"APP_NAME\")\ndesc = kwargs.get(\"DESC\")\nif app_name is None or desc is None:\nraise ValueError\nnumber = kwargs.get(\"number\")\nnumber = number if isinstance(number, int) else -1\n# \u5bf9\u8c61\u7ec4\u5408\nself.dog = Dogtail(app_name, desc, number)\nself.ui = ButtonCenter(app_name, number)\n \u9700\u8981\u4f20\u9012\u53c2\u6570\u7684\u91c7\u7528\u5bf9\u8c61\u7ec4\u5408\uff0c\u6ca1\u6709\u53c2\u6570\u7684\u4f7f\u7528\u7ee7\u627f\uff0c\u7ee7\u627f\u7684\u7c7b\u7b26\u5408 Mixin \u8bbe\u8ba1\u6a21\u5f0f\u3002 \u5e94\u7528\u5e93\u91cc\u9762\u4f7f\u7528\u7684\u65f6\u5019\u5728 widget/base_widget.py \u91cc\u9762\u53ea\u9700\u8981\u552f\u4e00\u7ee7\u627f Src \uff1a # \u5e94\u7528\u5e93\u91cc\u9762\u65b9\u6cd5\u57fa\u7c7b\n# widget/base_widget.py\nfrom src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n \u8981\u4f7f\u7528\u6838\u5fc3\u5e93\u7684\u529f\u80fd\uff0c\u53ea\u9700\u8981\u5199\u4e00\u4e2a\u5bfc\u5165 from src import Src \u5373\u53ef\u3002 \u5199 __init__ \u6784\u9020\u51fd\u6570\u7684\u539f\u56e0\u662f\u901a\u8fc7\u53c2\u6570\u6784\u9020\u5e94\u7528\uff0c\u5e76\u4e14\u4f20\u9012 number \u8fdb\u6765\uff0c\u53ef\u4ee5\u5b9e\u73b0\u591a\u7a97\u53e3\u7684\u63a7\u5236\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3public","title":"3\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09","text":"\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6bcf\u4e2a\u5e94\u7528\u90fd\u662f\u4e00\u4e2a\u5355\u72ec\u7684 py \u6587\u4ef6\uff0c\u76f8\u4e92\u4e4b\u95f4\u662f\u72ec\u7acb\u7684\uff0c\u6bcf\u4e2a py \u6587\u4ef6\u91cc\u9762\u662f\u8be5\u5e94\u7528\u7684\u65b9\u6cd5\u7c7b\uff0c\u6bd4\u5982\uff1a\u6700\u5e38\u7528\u7684\u65b9\u6cd5\u7c7b dde_desktop_public_widget.py # dde_desktop_widget.py\nfrom src import Src\nclass _DdeDesktopPublicBaseWidget(Src):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-desktop\"\nDESC = \"/usr/bin/dde-desktop\"\ndef __init__(self):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC)\nclass DdeDesktopPublicWidget(_DdeDesktopPublicBaseWidget):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u7c7b\"\"\"\ndef click_music_dir_by_ui(self):\n\"\"\"\u5728\u6587\u4ef6\u9009\u62e9\u6846\u70b9\u51fb\u97f3\u4e50\u76ee\u5f55\"\"\"\nself.click(*self.ui.btn_center(\"\u4fa7\u8fb9\u680f-\u97f3\u4e50\")) \ndef click_xxx_by_attr(self):\npass\n \u516c\u5171\u65b9\u6cd5\u5e93\u610f\u4e49\uff1a \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6240\u5c01\u88c5\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\u90fd\u662f\u81f3\u5c11\u88ab2\u4e2a\u5e94\u7528\u90fd\u7528\u5230\u7684\uff0c\u8fd9\u6837\u505a\u53ef\u4ee5\u51cf\u5c11\u6574\u4f53\u4ee3\u7801\u91cf\uff0c\u4ece\u800c\u51cf\u8f7b\u5e94\u7528\u5e93\u4ee3\u7801\u7684\u7ef4\u62a4\u5de5\u4f5c\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u7f16\u5199\u5f62\u5f0f\uff08\u547d\u540d\u89c4\u5219\u3001\u5b9a\u4f4d\u7684\u65b9\u6848\u5199\u6cd5\u3001\u6ce8\u91ca\u7684\u5199\u6cd5\u7b49\u7b49\uff09\u5177\u6709\u4e00\u5b9a\u7684\u6a21\u677f\u4f5c\u7528\uff0c\u8fd9\u6837\u5373\u4f7f\u662f\u5404\u4e2a\u5e94\u7528\u5e93\u90fd\u72ec\u7acb\u7ef4\u62a4\uff0c\u6240\u6709\u7684\u7f16\u7801\u98ce\u683c\u90fd\u662f\u8d8b\u4e8e\u76f8\u540c\u7684\uff0c\u56e0\u4e3a\u5927\u5bb6\u90fd\u5e94\u8be5\u53c2\u7167\u516c\u5171\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u5199\u6cd5\u6765\u5199\u81ea\u5df1\u5e94\u7528\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\u7c7b\uff0c\u8fd9\u6837\u4f7f\u5f97\u4ece\u516c\u53f8\u7684\u89d2\u5ea6\u53bb\u770b\u6240\u6709\u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u90fd\u662f\u7edf\u4e00\u7684\u3002 \u53ef\u4ee5\u901a\u8fc7\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\uff0c\u4e86\u89e3\u5230\u5176\u4ed6\u5e94\u7528\u7684\u529f\u80fd\uff0c\u5bf9\u4e8e\u6211\u4eec\u9700\u6c42\u7406\u89e3\uff0c\u4e86\u89e3\u7cfb\u7edf\u7684\u65b9\u65b9\u9762\u9762\u4e5f\u6709\u597d\u5904\u3002 \u5f53\u7136\uff0c\u5982\u679c\u4f60\u7684\u5e94\u7528\u672c\u8eab\u662f\u5c5e\u4e8e\u6839\u672c\u5c31\u4e0d\u9700\u8981\u548c\u5176\u4ed6\u5e94\u7528\u4ea4\u4e92\u7684\uff0c\u90a3\u4e48\u4f60\u53ef\u80fd\u4e0d\u4f1a\u7528\u5230\u8fd9\u91cc\u9762\u7684\u529f\u80fd\uff0c\u6ca1\u5173\u7cfb\uff0c\u4f60\u6240\u6709\u7684\u65b9\u6cd5\u90fd\u53ef\u4ee5\u76f4\u63a5\u5199\u5728\u5e94\u7528\u5e93\u7684\u4e1a\u52a1\u5c42\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4conftestpy","title":"4\u3001conftest.py","text":"conftest.py \u4ece\u529f\u80fd\u4e0a\u5c06\u662f\u5c5e\u4e8e\u6838\u5fc3\u5e93\uff08src\uff09\u7684\u5185\u5bb9\uff0c\u4f46\u662f\u7531\u4e8e\u5b83\u7684\u7279\u6b8a\u6027\uff0c\u5373\u5b83\u662f\u5bf9\u5e94\u7528\u5e93\u4e2d\u7684\u7528\u4f8b\u751f\u6548\u7684\uff0c\u800c\u4e14\u5b83\u7684\u4f5c\u7528\u57df\u662f\u5f53\u524d\u76ee\u5f55\u53ca\u4ee5\u4e0b\uff0c\u56e0\u6b64\u6211\u4eec\u5c06\u5b83\u653e\u5230\u9879\u76ee\u6839\u76ee\u5f55\u3002\u6211\u4eec\u6846\u67b6\u4e2d\u6709\u4e0d\u5c11\u6838\u5fc3\u529f\u80fd\u90fd\u662f\u5728\u8fd9\u91cc\u9762\u8fdb\u884c\u5f00\u53d1\u7684\uff0c\u540e\u9762\u7b2c\u56db\u7ae0\u4f1a\u8bb2\u5230\u7ec6\u8282\u3002 pytest.ini \u4f5c\u7528\u548c conftest.py \u7c7b\u4f3c\uff0c\u662f Pytest \u6846\u67b6\u7684\u56fa\u5b9a\u914d\u7f6e\u6587\u4ef6\uff0c\u76ee\u524d\u914d\u7f6e\u4e86\u4e00\u4e9b\u901a\u7528\u7684\u547d\u4ee4\u884c\u6267\u884c\u53c2\u6570\uff0c\u4e5f\u653e\u5728\u9879\u76ee\u6839\u76ee\u5f55\u3002 \u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 Hook \u51fd\u6570\uff0capps \u76ee\u5f55\u4e0b\u7684 \u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 fixture \u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5setting","title":"5\u3001setting","text":"\u5168\u5c40\u914d\u7f6e\u6a21\u5757\uff0c\u5305\u542b\u4e86\u4ee5\u4e0b\u914d\u7f6e\u6587\u4ef6\uff1a \uff081\uff09ini \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u914d\u7f6e\u4e00\u4e9b\u5168\u5c40\u7684\u914d\u7f6e\u9879\uff0c\u8b6c\u5982\uff1a\u5931\u8d25\u91cd\u8dd1\u6b21\u6570\u3001\u662f\u5426\u5931\u8d25\u5f55\u5c4f\u3001\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\u3001\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4\u3001\u6267\u884c\u65f6\u65e5\u5fd7\u7ea7\u522b\u3001\u751f\u6210\u7684\u62a5\u544a\u7c7b\u578b\u3001\u4ee5\u53ca\u5206\u5e03\u5f0f\u6267\u884c\u7684\u4e00\u4e9b\u7b56\u7565\u914d\u7f6e\u9879\u7b49\u7b49\u3002 \uff082\uff09config.py \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u63d0\u4f9b\u914d\u7f6e\u6587\u4ef6\u8bfb\u53d6\u3001\u52a8\u6001\u83b7\u53d6\u4e00\u4e9b\u5e38\u91cf\uff08\u5982\u9879\u76ee\u6839\u76ee\u5f55\u7edd\u5bf9\u8def\u5f84 (BASE_DIR)\u3001\u7cfb\u7edf\u67b6\u6784\uff08SYS_FRAME\uff09\u3001\u65f6\u95f4\u5b57\u7b26\u4e32\uff08strftime\uff09\u3001\u672c\u673a USERNAME IP \u7b49\u7b49\uff09\u3001\u516c\u5171 URL \u7b49\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u89c4\u8303","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u7248\u672c\u53ca\u4f9d\u8d56","text":"\u57fa\u7840\u6846\u67b6\u4f1a\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u8fdb\u884c\u7248\u672c\u53d1\u5e03\uff0c\u4e0d\u4e0e\u67d0\u4e2a\u5e94\u7528\u7248\u672c\u7ed1\u5b9a\uff0c\u4f46\u662f\uff0c\u5e94\u7528\u5e93\u4f1a\u4f9d\u8d56\u4e8e\u57fa\u7840\u6846\u67b6\u7684\u7248\u672c\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u5efa\u8bae\u5728\u5e94\u7528\u5e93\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a\u6587\u672c\u6587\u4ef6\u7528\u4e8e\u8bb0\u5f55\u6240\u4f9d\u8d56\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\uff0c\u7c7b\u4f3c\u4e8e\u5f00\u53d1\u5e94\u7528\u7684 debian/control \u6587\u4ef6\u7684\u529f\u80fd\uff0c\u4e3a\u4e86\u4fdd\u6301\u7edf\u4e00\uff0c\u8fd9\u4e2a\u6587\u4ef6\u5c31\u547d\u540d\u4e3a control\uff0c\u653e\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u6838\u5fc3\u5e93\u72ec\u7acb\u6027","text":"\u6838\u5fc3\u5e93\u4e0d\u5efa\u8bae\u9488\u5bf9\u67d0\u4e00\u4e2a\u5e94\u7528\u5355\u72ec\u505a\u4ee3\u7801\u4e0a\u7279\u6b8a\u5904\u7406\uff0c\u901a\u5e38\u8003\u8651\u9488\u5bf9\u67d0\u4e00\u79cd\u573a\u666f\u8fdb\u884c\u5904\u7406\uff0c\u8fd9\u4e9b\u573a\u666f\u901a\u5e38\u662f\u5b58\u5728\u4e00\u4e9b\u5171\u6027\u7684\u3002\u6bd4\u5982\u8bf4\uff1a\u684c\u9762\u7684ID\u5206\u914d\u5b58\u5728\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u903b\u8f91\u5904\u7406\u89e3\u51b3ID\u5206\u914d\u9519\u8bef\u7684\u95ee\u9898\uff0c\u4f46\u662f\u8fd9\u90e8\u5206\u903b\u8f91\u6211\u4eec\u4f1a\u5728\u684c\u9762\u7684\u65b9\u6cd5\u5c42\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u517c\u5bb9\u6027","text":"\u4e3a\u4e86\u4fdd\u6301\u517c\u5bb9\u6027\uff0c\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u539f\u5219\u4e0a\u4e0d\u5bf9\u8001\u65b9\u6cd5\u8fdb\u884c\u4fee\u6539\u6216\u5220\u9664\uff0c\u53ea\u8fdb\u884c\u65b0\u589e\u3002\u6d89\u53ca\u5230\u8001\u65b9\u6cd5\u4fee\u6539\u6216\u5220\u9664\u7684\uff0c\u4f1a\u8fdb\u884c\u63d0\u524d\u9884\u544a\uff0c\u5e76\u5728\u7b2c\u4e8c\u4e2a\u7248\u672c\u4e4b\u540e\uff08\u4e2d\u95f4\u4f1a\u9694\u4e00\u4e2a\u7248\u672c\u8fc7\u5ea6\uff09\u6b63\u5f0f\u5b9e\u65bd\u4fee\u6539\u6216\u5220\u9664\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u547d\u540d\u89c4\u8303","text":" \u7528\u4f8b ID \u6bcf\u4e2a\u5e94\u7528\u81ea\u5df1\u7ef4\u62a4\u4e00\u5957 ID\uff0c\u5728PMS\u4e0a\u7528\u4f8b\u6807\u9898\u4e0a\u5c06\u81ea\u52a8\u5316ID\u4ee5\u6807\u7b7e\u7684\u5f62\u5f0f\u5199\u5165\uff0c\u6bd4\u5982\uff1a[101]\u6253\u5f00-\u542f\u52a8\u5e94\u7528\u540edock\u53f3\u952e\u83dc\u5355 \u4e00\u4e2a\u7528\u4f8b\u7c7b\u91cc\u9762\u6709\u591a\u4e2a\u7528\u4f8b\u65f6\uff0c\u5728\u7528\u4f8b\u540d\u79f0\u540e\u9762\u52a0\u5e8f\u53f7\u3002 class TestFileManager(BaseCase):\n\"\"\"\u6587\u7ba1\u7528\u4f8b\"\"\"\ndef test_xxx_015_1(self):\npass\ndef test_xxx_015_2(self):\npass\n \u6ce8\u610f 015_1\uff0c\u4e0d\u8981\u5199015_01\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 PMS \u4e0a\u7684\u7528\u4f8bID\uff1a PMS \u4e0a\u662f6\u4f4d\u6570\uff0c\u4e0d\u591f\u76f4\u89c2\uff0c\u4e5f\u4e0d\u597d\u7ef4\u62a4\uff0c\u5728\u81ea\u52a8\u5316\u4e0b\u9762\u53bb\u627e\u4e00\u4e2a\u5e26\u6709 6 \u4f4d\u6570\u7684\u6587\u4ef6\u662f\u4e00\u4e2a\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 PMS \u4e0a\u7684 ID \u53ef\u80fd\u4f1a\u53d1\u751f\u53d8\u5316\uff0c\u6bd4\u5982\u5bfc\u51fa\u6765\u5bfc\u8fdb\u53bb\u7684\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u5b58\u5728\u95ee\u9898\uff0c\u5982\u679c\u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u8981\u60f3\u627e\u51fa\u6765\u5bf9\u5e94\u4fee\u6539\u81ea\u52a8\u5316\u7528\u4f8b ID\uff0c\u5c06\u4f1a\u662f\u4ef6\u975e\u5e38\u75db\u82e6\u7684\u4e8b\u60c5\u3002 \u51fd\u6570\u547d\u540d\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5de6\u952e\u70b9\u51fb click \u53f3\u952e\u70b9\u51fb right_click \u53cc\u51fb double_click \u79fb\u52a8 move_to \u62d6\u52a8 drag \u65b0\u5efa new \u62d6\u52a8\u5230 drag_to \u4ece\u54ea\u91cc\u62d6\u52a8\u5230\u54ea\u91cc drag_something_from_xxx_to_xxx \u83b7\u53d6 get \u83b7\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5750\u6807 get_location \u975e\u7279\u6b8a\u6587\u4ef6 file word\u6587\u4ef6 doc text\u6587\u4ef6 text \u6587\u4ef6\u5939 dir \u5173\u952e\u8bcd\u6301\u7eed\u589e\u52a0 \u5e38\u91cf\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5e94\u7528\u540d\u79f0 APP_NAME \u5e94\u7528\u63cf\u8ff0 DESC \u672c\u5e94\u7528\u4ee5\u5916\u7684\u5176\u4ed6\u5e94\u7528\uff0c\u6bd4\u5982\u5e2e\u52a9 HELP \u5176\u4ed6\u540d\u79f0\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u65b9\u6cd5\u5305\u540d widget \u65b9\u6cd5\u6587\u4ef6\u540d\uff08\u6587\u7ba1\u4e3e\u4f8b\uff09 dfm_widget.pytitle_widget.pyright_view_widget.pyleft_view_widget.pypop_widget.pybase_widget.pydfm_assert.py \u65ad\u8a00\u8bed\u53e5\u547d\u540d\u89c4\u8303 \u65ad\u8a00\u8bed\u53e5\u90fd\u662f\u4ee5 assert \u5f00\u5934 \u65ad\u8a00 \u8bed\u53e5 \u5224\u65ad\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_existsassert_file_not_exists \u5224\u65ad\u684c\u9762\u76ee\u5f55\u4e0b\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_exists_in_desktopassert_file_not_exists_in_desktop \u5224\u65ad\u56fe\u7247\u5b58\u5728 assert_image_existsassert_image_not_exists \u5224\u65ad\u5f71\u9662\u4e2d\u662f\u5426\u5b58\u5728\u56fe\u7247 assert_image_exists_in_movieassert_image_not_exists_in_movie \u5224\u65ad\u5143\u7d20\u662f\u5426\u5b58\u5728 assert_element_existassert_element_not_exist \u5224\u65ad\u662f\u5426\u76f8\u7b49 assert_equalassert_not_equal \u5224\u65ad\u662f\u5426\u4e3a\u771f assert_trueassert_false"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5fixture","title":"5\u3001fixture \u89c4\u8303","text":"\u7531\u4e8e Pytest \u6846\u67b6\u4e2d\u652f\u6301 fixture \u7684\u5199\u6cd5\u548c Xunit \u5199\u6cd5\u7684\uff0c\u6240\u4ee5\u5e94\u7528\u5e93\u4e2d\u53ef\u80fd\u5b58\u5728\u6df7\u7528\u7684\u60c5\u51b5\uff0c\u4e3a\u7edf\u4e00\u7f16\u7801\u98ce\u683c\u65b9\u4fbf\u540e\u7eed\u7528\u4f8b\u4ee3\u7801\u7ef4\u62a4\uff0c\u73b0\u505a\u4ee5\u4e0b\u89c4\u8303\u8bf4\u660e\uff1a \u629b\u5f03 Xunit \u7684\u5199\u6cd5\uff0c\u7edf\u4e00\u91c7\u7528 Pytest fixture \u7684\u5199\u6cd5\u3002 \u5e94\u7528\u5185 fixture \u8c28\u614e\u4f7f\u7528 autouse=True \uff0c\u975e\u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u975e\u5e38\u4e0d\u5efa\u8bae\u4f7f\u7528\u8fd9\u4e2a\u53c2\u6570\u3002 \u8c03\u7528 fixture \u4e0d\u80fd\u4f7f\u7528 @pytest.mark.usefixture()\uff0c\u4f7f\u7528\u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u4f20\u5165\u51fd\u6570\u5bf9\u8c61\u3002 \u5efa\u8bae\u5728\u4e00\u4e2a conftest.py \u91cc\u9762\u53bb\u5199\uff0c\u4e00\u4e2a\u5e94\u7528\u4e5f\u5c3d\u91cf\u7ef4\u62a4\u4e00\u4e2a conftest.py\u6587\u4ef6\u3002 fixture \u4e5f\u9700\u8981\u5199\u529f\u80fd\u8bf4\u660e\uff0c\u51fd\u6570\u540d\u79f0\u8981\u6709\u5177\u4f53\u542b\u4e49\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#6","title":"6\u3001\u65b9\u6cd5\u7f16\u5199\u89c4\u8303","text":" \u65b9\u6cd5\u7c7b\u578b\uff1a if \u6ca1\u6709\u7528\u5230\u5b9e\u4f8b\u5bf9\u8c61\uff1a\nif \u6ca1\u6709\u7528\u5230\u7c7b\u5bf9\u8c61\uff1a\n\u5199\u9759\u6001\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @staticmethod\nelse\uff1a\n\u5199\u7c7b\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @classmethod\nelse:\n\u76f4\u63a5\u5199\u5b9e\u4f8b\u65b9\u6cd5\n \u4e3e\u4f8b: class TitleWidget:\ndef click_xxx_by_ui(self):\npass\n@staticmethod\ndef click_xxx_by_ui():\npass\n@classmethod\ndef click_xxx_by_ui(cls):\npass\n \u51fd\u6570\u540d\u79f0\u4e0d\u51fa\u73b0\u6570\u5b57\uff0c\u9700\u8981\u8868\u793a\u6570\u91cf\u7684\u7528\u5355\u8bcd\u8868\u793a\u3002 \u51fd\u6570\u529f\u80fd\u6ce8\u91ca\u3002 \u6ca1\u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg2:xxx\n\"\"\"\n \u6709\u53c2\u6570\uff0c\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg1:xxx\nreturn: xxx\n\"\"\"\n \u200b \u7528 Pycharm \u7684\u6ce8\u91ca\u6a21\u677f\u4e5f\u53ef\u4ee5\uff0c\u53ea\u8981\u4f53\u73b0\u4e86\u53c2\u6570\u7684\u7c7b\u578b\u548c\u8fd4\u56de\u5c31\u884c\u4e86\u3002 \u6682\u4e0d\u8981\u6c42\u5199\u7c7b\u578b\u6ce8\u89e3\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#7case","title":"7\u3001\u7528\u4f8b\uff08case\uff09\u89c4\u8303","text":" \u4ee5\u7c7b\u7684\u5f62\u5f0f\u5199\u7528\u4f8b\uff0c\u7528\u4f8b\u7c7b\u96c6\u6210\u7528\u4f8b\u57fa\u7c7b\u3002 \u7528\u4f8b\u7c7b\u9700\u8981\u5199\u6ce8\u91ca\u3002 \u6d4b\u8bd5\u7528\u4f8b\u51fd\u6570\u8bf4\u660e\uff08\u5efa\u8bae\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u540d\u79f0\uff09 \"\"\"\u53f3\u4fa7\u9884\u89c8-\u56fe\u7247\u7c7b\u578b\u4fe1\u606f\u680f\u57fa\u672c\u4fe1\u606f\"\"\"\n \u4e0d\u5199\u8c03\u8bd5\u4ee3\u7801 if __name__ == '__main__':\npytest.main()\n \u6240\u6709\u7528\u4f8b\u90fd\u7ee7\u627f BaseCase\u3002 BaseCase \u91cc\u9762\u653e\u4e00\u4e9b\u6d4b\u8bd5\u6570\u636e\u7684\u5e38\u91cf\uff0c\u6bd4\u5982\u6587\u4ef6\u540d\u79f0\uff0c\u5e94\u7528\u540d\u79f0\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u4e00\u4e9b\u901a\u7528\u7684\u5b57\u7b26\u4e32\u3002 \u8fd9\u7c7b\u662f\u5c5e\u4e8e\u6d4b\u8bd5\u6570\u636e\u3002 class BaseCase(DfmAssert):\n\"\"\"\u7528\u4f8b\u57fa\u7c7b\"\"\"\nNEW_FILE = \"\u65b0\u5efa\u6587\u672c.txt\"\nTEST_FILE = \"test.txt\"\nNEW_DIR = \"\u65b0\u5efa\u6587\u4ef6\u5939\"\nNEW_WORD = \"\u65b0\u5efaWord\u6587\u6863.doc\"\nAPP_HELP = \"damn\"\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\n\"\"\"\u7528\u4f8b\u6807\u9898\uff08\u590d\u5236PMS\u4e0a\u7528\u4f8b\u6807\u9898\uff09\"\"\"\ndfm = DfmWidget()\ndfm.click_xxx_by_attr(self.NEW_FILE)\ndfm.new_file_in_desktop_by_cmd(self.NEW_FILE)\nself.assert_true(dfm.get_process_status(self.APP_NAME))\n \u7528\u4f8b\u91cc\u9762\u5c3d\u91cf\u51cf\u5c11\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\uff0c\u66f4\u8981\u51cf\u5c11\u76f8\u540c\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\u3002 \u7edf\u4e00\u6587\u4ef6\u6ce8\u91ca\u5934\u3002 #!/usr/bin/env python3\n# _*_ coding:utf-8 _*_\n\"\"\"\n:Author:email@uniontech.com\n:Date :${DATE} ${TIME}\n\"\"\"\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#8","title":"8\u3001\u5176\u4ed6\u89c4\u8303","text":" \u65e5\u5fd7\u6253\u5370\u8981\u5728\u65b9\u6cd5\u6700\u524d\u9762\uff0c\u5426\u5219\u4ee3\u7801\u62a5\u9519\u6ca1\u6709\u65e5\u5fd7\u8f93\u51fa\uff0c\u4e0d\u597d\u5b9a\u4f4d\u95ee\u9898\u3002\uff08\u6211\u4eec\u4f1a\u8003\u8651\u7ee7\u7eed\u4f7f\u7528\u62e6\u622a\u5668\u6253\u5370\u65e5\u5fd7\uff09 \u6240\u6709\u7684\u64cd\u4f5c\u90fd\u9700\u8981\u6709\u65e5\u5fd7\uff0c\u5305\u62ec sleep()\uff0c\u6211\u4eec\u4f1a\u91cd\u5199\u4e00\u4e2a\u6709\u65e5\u5fd7\u8f93\u5165\u7684 sleep\u3002 \u4e1a\u52a1\u5c42\u65e5\u5fd7\u7ea7\u522b\u4e3a INFO\u3002 hook \u51fd\u6570\u53ea\u80fd\u5199\u5230\u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u91cc\u9762\u3002 apps \u76ee\u5f55\u4e0b\u7684 conftest.py \u539f\u5219\u4e0a\u4e0d\u4f1a\u65b0\u589e fixture\u3002 \u56fa\u5b9a\u76ee\u5f55\u6216\u5143\u7d20\u63a7\u4ef6\u7684\u64cd\u4f5c\uff0c\u5c06\u64cd\u4f5c\u65b9\u6cd5\u5199\u6b7b\uff0c\u6587\u4ef6\u7c7b\u64cd\u4f5c\u5c06\u6587\u4ef6\u540d\u7559\u53c2\u6570\u3002 \u8def\u5f84\u62fc\u63a5\u89c4\u8303\uff1a \u7cfb\u7edf\u4e2d\u56fa\u5b9a\u76ee\u5f55\uff0c\u8def\u5f84\u62fc\u63a5\u65f6\u4f7f\u7528\u6ce2\u6d6a\u7b26\u53f7\uff0c\u6bd4\u5982\uff1a~/Desktop/\uff0c\u4e0b\u5c42\u4f7f\u7528 os.path.expanduser()\uff0c\u5b83\u53ef\u4ee5\u81ea\u52a8\u8bc6\u522b\u6ce2\u6d6a\u7b26\u53f7\u3002 \u9879\u76ee\u4e0b\u8def\u5f84\u4f7f\u7528\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u8def\u5f84\uff0c\u6bd4\u5982\uff1aConfig.BASE_PATH\uff0c\u56e0\u4e3a\u9879\u76ee\u662f\u53ef\u4ee5\u5728\u4efb\u610f\u8def\u5f84\u8fd0\u884c\u7684\uff0c\u9700\u8981\u52a8\u6001\u62fc\u63a5\u8def\u5f84\u3002 "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848","text":"# =================================================\n# Author : Mikigo\n# Time : 2022/3/16\n# version \uff1a1.0\n# =================================================\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"AT \u5e94\u7528\u5e93\u6539\u9020\u662f\u57fa\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u8fdb\u884c\u7528\u4f8b\u65b9\u6cd5\u548c\u4e1a\u52a1\u903b\u8f91\u7684\u91cd\u65b0\u8bbe\u8ba1\uff0c\u4ee5\u5b9e\u73b0\u5e94\u7528\u5e93\u9ad8\u6548\u7684\u7f16\u5199\u3001\u7ef4\u62a4\u7528\u4f8b\u53ca\u5176\u65b9\u6cd5\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u6587\u4ef6\u7ba1\u7406\u5668\u4ece\u4e1a\u52a1\u590d\u6742\u5ea6\u548c\u7528\u4f8b\u91cf\u6765\u8bb2\uff0c\u5728\u7cfb\u7edf\u6240\u6709\u5e94\u7528\u4e2d\uff0c\u662f\u5f88\u6709\u4ee3\u8868\u6027\u7684\uff0c\u96be\u5ea6\u4e5f\u662f\u6700\u5927\u7684\uff0c\u56e0\u6b64\u6211\u4eec\u9009\u53d6\u6587\u4ef6\u7ba1\u7406\u5668\u4f5c\u4e3a\u5e94\u7528\u5e93\u6539\u9020\u7684\u5b9e\u9a8c\u5e94\u7528\uff0c\u7ed9\u540e\u7eed\u5176\u4ed6\u5e94\u7528\u6539\u9020\u63d0\u4f9b\u5207\u5b9e\u53ef\u884c\u7684\u601d\u8def\u548c\u65b9\u6848\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u5206\u5c42\u8bbe\u8ba1\u56fe","text":"\u6574\u4f53\u4ecd\u7136\u9075\u5faa PO \u8bbe\u8ba1\u7406\u5ff5\uff0c\u6839\u636e\u4e1a\u52a1\u9700\u8981\uff0c\u5c06\u6587\u7ba1\u4e1a\u52a1\u5c42\u8fdb\u884c 3 \u5c42\u5212\u5206\uff1a "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-dde-file-manager # \u5e94\u7528\u4ed3\u5e93\n\u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 test_xxx_001.py\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u00a0\u251c\u2500\u2500 __init__.py\n\u2502 \u00a0\u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u00a0\u251c\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u00a0\u251c\u2500\u2500 base_widget.py # \u65b9\u6cd5\u57fa\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 title_widget.py # title \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 right_view_widget.py # right view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 left_view_widget.py # left view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 pop_widget.py # pop \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 dfm_widget.py # \u65b9\u6cd5\u7684\u7edf\u4e00\u51fa\u53e3\n\u2502 \u00a0\u2514\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 tag # \u7528\u4f8b\u6807\u7b7e\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 xxx.csv # \u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2514\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u57fa\u7c7b","text":" \u7ee7\u627f\u6838\u5fc3\u5c42\u7684\u5404\u4e2a\u6a21\u5757\u7c7b\u3002 \u62bd\u53d6\u64cd\u4f5c\u5c42\u7684\u4e00\u4e9b\u57fa\u7840\u65b9\u6cd5\u3002 \u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u7684\u4e00\u4e9b\u516c\u5171\u65b9\u6cd5\u3002 \u8def\u5f84\u7ec4\u88c5\u65b9\u6cd5\u3002 \u4e00\u4e9b\u4e1a\u52a1\u5c42\u76f8\u5173\u7684\u53d8\u91cf\u3001\u5e38\u91cf\u3001shell\u547d\u4ee4\u3001\u5750\u6807\u3002 \u65b9\u6cd5\u57fa\u7c7b\u7684\u5199\u6cd5\uff1a from src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u64cd\u4f5c\u5c42","text":" \u6a21\u5757\u5212\u5206 \u6309\u7167\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u6587\u7ba1\u4e3b\u754c\u9762\u5206\u4e3a\u4e09\u4e2a\u533a\u57df\uff1a\u6807\u9898\u680f\u3001\u53f3\u8fb9\u89c6\u56fe\u533a\u57df\u3001\u5de6\u8fb9\u89c6\u56fe\u533a\u57df \u5f39\u7a97\uff1a\u8bbe\u7f6e\u754c\u9762\u5f39\u7a97\u3001\u4fdd\u9669\u7bb1\u5f39\u7a97\u3001\u5220\u9664\u786e\u8ba4\u5f39\u7a97\u3001\u53ca\u5404\u79cd\u7f51\u7edc\u5f39\u7a97 \u53f3\u952e\u83dc\u5355\uff1a\u6682\u65f6\u4e0d\u8003\u8651\u4e3a\u5355\u72ec\u7684\u6a21\u5757\uff0c\u8003\u8651\u4ee5\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6848\u505a\u6210\u516c\u5171\u5e93\u3002 \u5404\u4e2a\u6a21\u5757\u53ea\u7ee7\u627f\u57fa\u7c7b from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u6784\u9020\u51fd\u6570\u91cc\u9762\u4e0d\u6784\u9020\u5bf9\u8c61\uff0c\u53ef\u4ee5\u521d\u59cb\u5316\u4e00\u4e9b\u53d8\u91cf\u3002 \u4e0d\u540c\u7684\u5b9a\u4f4d\u65b9\u6848\u8c03\u7528\u4e0d\u540c\u7684\u5b9a\u4f4d\u5de5\u5177\u5bf9\u8c61\u3002 self.dog\nself.ui\nself.d_bus\n \u65b9\u6cd5\u7f16\u5199 \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u5e94\u7528\u5c42","text":" \u7ee7\u627f\u64cd\u4f5c\u5c42\u7684\u6240\u6709\u7c7b\u3002 \u4ec5\u4ec5\u7528\u4e8e\u7528\u4f8b\u4e2d\u5bfc\u5165\u65b9\u4fbf\uff0c\u4e0d\u505a\u5176\u4ed6\u4e8b\u60c5\u3002 class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n DfmAssert \u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u7ee7\u627f\uff0c\u65b9\u4fbf\u4f7f\u7528\u65ad\u8a00\u8bed\u53e5\u3002 from apps.dde_file_manager.widget.dfm_widget import DfmWidget\nfrom public.assert import Assert\nclass DfmAssert(Assert):\ndef assert_file_exists_in_desktop(self, file_name):\nself.assert_file_exists(f\"~/Desktop{file_name}\")\n...\nDfmWidget().get_file_in_desktop()\n \u7528\u4f8b\u91cc\u9762\u76f4\u63a5\u7ee7\u627f\uff0c\u65b9\u4fbf\u5728\u7528\u4f8b\u91cc\u9762\u4f7f\u7528 self \u8fdb\u884c\u65ad\u8a00\uff0c\u66f4\u7b26\u5408\u65ad\u8a00\u7684\u4f7f\u7528\u4e60\u60ef\uff0c\u7528\u4f8b\u903b\u8f91\u4e0a\u66f4\u6e05\u695a\u3002 class BaseCase(DfmAssert):\npass\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\nself.assert_file_exists_in_desktop(\"xxx\")\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u903b\u8f91\u4e3e\u4f8b","text":"\u7528\u4f8b\u4ee3\u7801\u8c03\u7528\u903b\u8f91\u4e3e\u4f8b\uff1a # BaseWidget\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n# =============================================\n# TitleWidget\nclass TitleWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_title_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# RightViewWidget\nclass RightViewWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_right_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# =============================================\n# \u51fa\u53e3 DfmWidget\nclass DfmWidget(TitleWidget, RightViewWidget):\npass\n# =============================================\n# in case\nfrom apps.dde_file_manager.widget.dfm_widget import DfmWidget\ndfm = DfmWidget()\ndfm.click_xxx_title_by_ui()\ndfm.click_xxx_right_by_ui()\ndfm.dog.print_desc()\ndfm.ui.print_number()\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u5de5\u7a0b\u6539\u9020\u5b9e\u65bd\u6b65\u9aa4","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_2","title":"1\u3001\u5de5\u7a0b\u4ee3\u7801\u62c9\u53d6","text":"1.1. \u5c06\u81ea\u52a8\u5316\u57fa\u7840\u6846\u67b6\u7684\u529f\u80fd\u62c9\u5230\u672c\u5730 Autotest Basic Frame \uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame 1.2. \u5c06\u5e94\u7528\u5e93\u4ee3\u7801\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u5e94\u7528\u5e93\u7684\u4ed3\u5e93\u547d\u540d\u5e94\u8be5\u662f\u957f\u8fd9\u6837\u7684 autotest_deepin_xxx\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_2","title":"2\u3001\u8c03\u6574\u5de5\u7a0b\u76ee\u5f55","text":"\u6309\u7167 \u65b9\u6848\u8bbe\u8ba1-\u76ee\u5f55\u7ed3\u6784 \u8fdb\u884c\u76ee\u5f55\u8c03\u6574\uff0c\u5c3d\u91cf\u4f7f\u7528\u7f16\u8f91\u5668\u8fdb\u884c\u76f8\u5e94\u7684\u8c03\u6574\uff0c\u7f16\u8f91\u5668\u63a8\u8350\u4f7f\u7528 Pycharm \uff0c\u4ee5\u4e0b\u64cd\u4f5c\u5747\u5728 Pycharm \u91cc\u9762\u53ef\u5b9e\u73b0\u3002 2.1. \u9700\u8981\u79fb\u52a8 py \u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u76f4\u63a5\u5728\u7f16\u8f91\u5668\u91cc\u9762\uff0c\u4f7f\u7528\u9f20\u6807\u9009\u4e2d\u5e76\u6309\u4f4f\uff0c\u4e4b\u540e\u62d6\u52a8\u5230\u76ee\u6807\u4f4d\u7f6e\u5373\u53ef\uff0cPycharm \u4f1a\u5c3d\u53ef\u80fd\u7684\u81ea\u52a8\u89e3\u51b3\u79fb\u52a8\u5bfc\u81f4\u7684\u8def\u5f84\u95ee\u9898\u3002\u6ce8\u610f\uff0c\u6211\u8bf4\u7684\u662f\u201c\u5c3d\u53ef\u80fd\u201d\uff0c\u6709\u4e9b\u9a9a\u64cd\u4f5c\u7f16\u8f91\u5668\u662f\u65e0\u6cd5\u81ea\u52a8\u5904\u7406\u7684\u3002\u5982\u679c\u6ca1\u6709\u88ab\u7f16\u8f91\u5668\u81ea\u52a8\u5904\u7406\u7684\u8def\u5f84\u95ee\u9898\uff0c\u540e\u7eed\u53ea\u80fd\u624b\u52a8\u89e3\u51b3\u3002 2.2. \u9700\u8981\u91cd\u547d\u540d\u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u5728\u7f16\u8f91\u5668\u91cc\u9762\u9009\u4e2d\u6587\u4ef6\uff0c\u7136\u540e\u4f7f\u7528\u5feb\u6377\u952e Shift + F6 \uff08\u5982\u679c\u5feb\u6377\u952e\u6ca1\u53cd\u5e94\uff0c\u6587\u4ef6\u53f3\u952e\u83dc\u5355 Refactor \u2014\u2014 Rename\uff09\uff0c\u7136\u540e\u5728\u8f93\u5165\u6846\u4e2d\u8f93\u5165\u8981\u91cd\u547d\u540d\u7684\u540d\u79f0\uff0c\u540c\u65f6\uff0c\u786e\u8ba4\u52fe\u9009 Search for references \u548c Search in comments and strings \u8fd9\u4e24\u4e2a\u9009\u9879\uff0c\u6700\u540e\u6309\u56de\u8f66\u6216\u8005\u9f20\u6807\u70b9 Refactor \u3002 \u6ce8\u610f\uff0c\u6b64\u65f6\u7f16\u8f91\u5668\u53ef\u80fd\u4f1a\u63d0\u793a\u4f60\uff0c\u4f60\u8fd9\u4e2a\u91cd\u547d\u540d\u7684\u64cd\u4f5c\u5173\u8054\u4e86\u591a\u4e2a\u6a21\u5757\uff0c\u5b83\u88ab\u591a\u4e2a\u5730\u65b9\u90fd\u4f7f\u7528\u5230\u4e86\uff0c\u76f8\u5173\u7684\u6a21\u5757\u662f\u5426\u4e5f\u4e00\u8d77\u6539\u540d\u4e86\uff0c\u8fd9\u4e0d\u5e9f\u8bdd\u5417\uff0c\u7528\u8fd9\u4e2a\u529f\u80fd\u5c31\u662f\u60f3\u628a\u5173\u8054\u5230\u7684\u90fd\u4fee\u6539\uff0c\u4e0d\u7136\u6211\u4e3a\u4ec0\u4e48\u4e0d\u7528\u6587\u7ba1\u7684\u91cd\u547d\u540d\u529f\u80fd\u5462\uff0c\u522b\u60f3\u4e86\uff0c\u76f4\u63a5\u70b9\u5de6\u4e0b\u89d2\u7684 Refactor \u6309\u94ae\uff0c\u5c31\u662f\u5e72\u3002 \u7c7b\u540d\u3001\u51fd\u6570\u540d\u7684\u91cd\u547d\u540d\u90fd\u5c3d\u91cf\u91c7\u7528\u8fd9\u79cd\u65b9\u6848\uff0c\u56e0\u4e3a\u7f16\u8f91\u5668\u4f1a\u81ea\u52a8\u7ed9\u6211\u4eec\u627e\u5230\u5173\u8054\u7684\u5730\u65b9\uff0c\u7136\u540e\u540c\u6b65\u4fee\u6539\u6389\u3002\u4f60\u53ef\u5343\u4e07\u522b\u76f4\u63a5\u5220\u4e86\u4fee\u6539\u540d\u79f0\uff0c\u4e0d\u7136\u4f60\u53ef\u80fd\u4f1a\u82b1\u4e0a\u4e00\u5929\u7684\u65f6\u95f4\u6765\u89e3\u51b3\u91cd\u547d\u540d\u7684\u95ee\u9898\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u5b9e\u73b0\u6838\u5fc3\u5e93\u63a5\u53e3","text":"3.1. BaseWidget \u5728 BaseWidget \u91cc\u9762\u628a\u8be5\u5199\u7684\u90fd\u5199\u597d\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u4e0a\u9762\u7684\u8bbe\u8ba1\u7406\u5ff5\u6765\u5199\u3002 \u5982\u679c\u4f60\u5acc\u9ebb\u70e6\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u6587\u7ba1\u7684\u5b9e\u9645\u5de5\u7a0b\u4ee3\u7801 autotest_dde_file_manager : https://gerrit.uniontech.com/admin/repos/autotest_dde_file_manager \u3002 3.2. \u64cd\u4f5c\u5c42 \u5982\u679c\u4f60\u662f\u65b0\u5199\u9879\u76ee\uff0c\u4f60\u4f1a\u53d1\u73b0\u4e00\u5207\u90fd\u662f\u90a3\u4e48\u7684\u7b80\u5355\u3001\u76f4\u63a5\uff0c\u6309\u7167\u6211\u4eec\u63d0\u4f9b\u7ed9\u4f60\u7684\u63a5\u53e3\u5199\u7528\u4f8b\u7684\u64cd\u4f5c\u65b9\u6cd5\u5c31\u597d\u4e86\u3002 \u5982\u679c\u4f60\u662f\u60f3\u5bf9\u539f\u6765\u7684\u5de5\u7a0b\u8fdb\u884c\u6539\u9020\uff0c\u4f60\u9700\u8981\u6309\u7167\u6838\u5fc3\u5e93\u65b9\u6cd5\u7684\u8c03\u7528\uff0c\u5c06\u4f60\u4e4b\u524d\u5199\u7684\u6bcf\u4e2a\u65b9\u6848\u8fdb\u884c\u5bf9\u5e94\u7684\u4fee\u6539\uff0c\u5305\u62ec\u7c7b\u548c\u65b9\u6cd5\u7684\u547d\u540d\u3001\u65b9\u6cd5\u5185\u6240\u8981\u7528\u5230\u4e0d\u540c\u5b9a\u4f4d\u65b9\u6cd5\u7684\u5199\u6cd5\u4fee\u6539\u3002 \u8fd9\u65f6\u5019\u4f60\u53ef\u80fd\u4f60\u7684\u4ee3\u7801\u4e2d\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u62a5\u9519\uff0c\u4e0d\u7528\u62c5\u5fc3\uff0c\u4f60\u53ef\u4ee5\u4ece\u4e1a\u52a1\u903b\u8f91\u51fa\u53d1\uff0c\u60f3\u6e05\u695a\u8fd9\u4e2a\u65b9\u6cd5\u662f\u5e72\u4ec0\u4e48\u7684\u3001\u64cd\u4f5c\u7684\u5bf9\u8c61\u662f\u4ec0\u4e48\u3001\u53c2\u6570\u662f\u4ec0\u4e48\uff0c\u6ce8\u610f\u8fd9\u4e9b\u4fee\u6539\u662f\u4f1a\u5f71\u54cd\u5230\u7528\u4f8b\u4ee3\u7801\u91cc\u9762\u7684\uff0c\u6ca1\u5173\u7cfb\uff0c\u7528\u4f8b\u91cc\u9762\u672c\u6765\u4e5f\u5e94\u8be5\u88ab\u5173\u8054\u4fee\u6539\u3002 3.3. \u628a\u914d\u7f6e\u6a21\u5757\u5199\u597d\uff0c\u8fd9\u90e8\u5206\u57fa\u672c\u53ef\u4ee5\u590d\u5236\u6587\u7ba1\u7684\u4ee3\u7801\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4_1","title":"4\u3001\u8def\u5f84\u5904\u7406","text":"4.1. \u5bfc\u5165\u8def\u5f84 \u65b9\u6cd5\u548c\u7528\u4f8b\u4e2d\u90fd\u4f1a\u6d89\u53ca\u5230\u5bfc\u5165\u8def\u5f84\u7684\u4fee\u6539\uff0c\u5728\u4fee\u6539\u8def\u5f84\u65f6\uff0c\u5efa\u8bae\u4f60\u4f7f\u7528 Ctrl + Shift + R \u5168\u5c40\u66ff\u6362\uff0c\u4f1a\u5c06\u6574\u4e2a\u9879\u76ee\u4e0b\u7684\u76f8\u540c\u5730\u65b9\u90fd\u4fee\u6539\u5230\uff0c\u5f53\u7136\uff0c\u4f60\u4e5f\u53ef\u4ee5\u5728\u5c0f\u5f39\u7a97\u4e2d\u4fee\u6539\u5168\u5c40\u66ff\u6362\u4e3a\u5c40\u90e8\u76ee\u5f55\u4e0b\u66ff\u6362\u3002\u5904\u7406\u90a3\u79cd\u6ca1\u6709\u5173\u8054\u5173\u7cfb\uff0c\u4f46\u662f\u53c8\u662f\u76f8\u540c\u540d\u79f0\u7684\u91cd\u547d\u540d\uff0c\u6211\u4e5f\u63a8\u8350\u4f7f\u7528\u8fd9\u79cd\u65b9\u5f0f\u8fdb\u884c\u91cd\u547d\u540d\u3002 \u6ce8\u610f\uff0c\u5168\u5c40\u66ff\u6362\u7684\u65b9\u5f0f\u4efb\u7136\u65e0\u6cd5\u4fdd\u8bc1\u771f\u7684\u5168\u5c40\u88ab\u66ff\u6362\u4e86\uff08\u53ef\u80fd\u662f\u7f16\u8f91\u5668\u7684 Bug \u5427\uff09\uff0c\u6240\u4ee5\u4f60\u4ecd\u7136\u9700\u8981\u624b\u52a8\u770b\u4e0b\u5404\u5904\u662f\u5426\u4fee\u6539\u5230\u4f4d\u3002 4.2. \u8d44\u6e90\u8def\u5f84 \u4e00\u4e9b\u7528\u4f8b\u8d44\u6e90\u9700\u8981\u6839\u636e config.py \u91cc\u9762\u7684\u8def\u5f84\u914d\u7f6e\u8fdb\u884c\u8d44\u6e90\u8def\u5f84\u7684\u62fc\u63a5\uff0c\u5982\u679c\u4f60\u539f\u6765\u672c\u6765\u5c31\u6709\u4e00\u4e2a\u51fd\u6570\u4e13\u95e8\u7528\u4e8e\u7ec4\u88c5\u8def\u5f84\u7684\uff0c\u90a3\u4f60\u53ea\u9700\u8981\u4fee\u6539\u8fd9\u4e00\u4e2a\u5730\u65b9\u5c31\u597d\u4e86\uff0c\u5982\u679c\u4f60\u4e4b\u524d\u5e76\u6ca1\u6709\u8fd9\u6837\u7684\u8bbe\u8ba1\uff0c\u90a3\u53ef\u80fd\u9700\u8981\u4fee\u6539\u5927\u91cf\u6d89\u53ca\u5230\u8d44\u6e90\u8def\u5f84\u7684\u5730\u65b9\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5","title":"5\u3001\u8c03\u8bd5\u548c\u7f16\u5199\u7528\u4f8b","text":"\u4ee5\u4e0a\u51e0\u4e2a\u6b65\u9aa4\u505a\u5b8c\uff0c\u57fa\u672c\u5c31\u53ef\u4ee5\u8fdb\u884c\u7528\u4f8b\u4ee3\u7801\u7684\u8c03\u8bd5\u4e86\uff0c\u8fd9\u90e8\u5206\u5de5\u4f5c\u4e3b\u8981\u89e3\u51b3\u4f60\u4e4b\u524d\u51e0\u4e2a\u6b65\u9aa4\u9057\u6f0f\u7684\u95ee\u9898\uff0c\u5982\u679c\u6240\u6709\u7528\u4f8b\u90fd\u8c03\u8bd5\u901a\u8fc7\u4e86\uff0c\u90a3\u4e48\u5de5\u7a0b\u6539\u9020\u5c31\u5168\u90e8\u5b8c\u6210\u4e86\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/","title":"AT \u5f00\u53d1\u89c4\u8303","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u5f00\u53d1\u89c4\u8303\u662f\u6839\u636e\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fd0\u884c\u4e24\u5e74\u591a\u6765\uff0c\u9047\u5230\u95ee\u9898\u89e3\u51b3\u95ee\u9898\u800c\u5f62\u6210\u7684\u4e00\u4e9b\u89e3\u51b3\u65b9\u6848\uff0c\u6216\u8005\u8bf4\u7ecf\u9a8c\u603b\u7ed3\uff1b\u8fd9\u4e9b\u7ecf\u9a8c\u7b26\u5408\u6211\u4eec\u73b0\u9636\u6bb5 AT \u6240\u5e94\u7528\u7684\u573a\u666f\u9700\u8981\uff0c\u4e5f\u662f\u6211\u4eec\u7ecf\u8fc7\u957f\u671f\u601d\u8003\uff0c\u4e0d\u65ad\u8bd5\u9519\u4e0d\u65ad\u4fee\u6b63\uff0c\u5e76\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u5b9e\u8df5\u4e2d\u68c0\u9a8c\u8fc7\u53ef\u884c\u7684\u3002\u4ee5\u6b64\uff0c\u5e0c\u671b\u80fd\u5e2e\u52a9\u53c2\u4e0e\u5230\u81ea\u52a8\u5316\u7684\u76f8\u5173\u4eba\u5458\u51cf\u5c11\u8bd5\u9519\u6210\u672c\uff0c\u66f4\u597d\u3001\u66f4\u5feb\u7684\u7f16\u5199\u7528\u4f8b\u53ca\u7ef4\u62a4\u7528\u4f8b\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_1","title":"\u4e00\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u89c4\u8303","text":"\u6807\u7b7e\u5316\u7ba1\u7406\u6587\u6863\u8bf7\u53c2\u8003\uff1a \u300a\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u64cd\u4f5c\u6307\u5f15\u300b \u4ee5\u4e0b\u8bf4\u51e0\u4e2a\u5bb9\u6613\u51fa\u73b0\u7684\u95ee\u9898\uff1a"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1","title":"1. \u5bf9\u5e94\u5173\u7cfb","text":" \u5199\u5b8c\u81ea\u52a8\u5316\u7528\u4f8b\u4e4b\u540e\uff0c\u8bf7\u5728 CSV \u6587\u4ef6\u4e2d\u6807\u8bb0\u7528\u4f8b\u7684 ID\u3001\u7b49\u7ea7\u3002\u4e3a\u4e86\u63d0\u9192\u6807\u8bb0\uff0c\u6267\u884c\u7528\u4f8b\u65f6\u5728\u9996\u884c\u4f1a\u8f93\u51fa ERROR \u65e5\u5fd7\uff1a CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94\u7684 ID\uff1b \u5728\u6700\u7ec8\u63d0\u4ea4\u4ee3\u7801\u4e4b\u524d\uff0c\u4f60\u9700\u8981\u5728 CSV \u6587\u4ef6\u91cc\u9762\u5c06ID\u3001\u7528\u4f8b\u7b49\u7ea7\u7b49\u6807\u7b7e\u8865\u5168\uff0c\u5982\u679c CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94 ID\uff0c\u540e\u7eed\u5728\u6279\u91cf\u6267\u884c\u7684\u65f6\u5019\uff0c\u8fd9\u4e9b\u7528\u4f8b\u662f\u4e0d\u4f1a\u6267\u884c\u7684\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2","title":"2. \u540d\u79f0\u4e00\u81f4","text":" CSV \u6587\u4ef6\u7684\u6587\u4ef6\u540d\u3001\u7528\u4f8b\u51fd\u6570\u4e2d\u95f4\u7684\u540d\u79f0\u4e00\u81f4\u3001\u7528\u4f8b py \u6587\u4ef6\u4e2d\u95f4\u7684\u540d\u79f0\uff0c\u8fd9\u4e09\u4e2a\u540d\u79f0\u4e00\u81f4\u3002 \u4e3e\u4f8b\uff1a # test_music_001.py\ndef test_music_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u90a3\u4e48 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e3a music.csv\u3002 AT \u6846\u67b6\u5e95\u5c42\u4ee3\u7801\u5b9e\u73b0\u662f\u5c06 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e0e\u7528\u4f8b\u51fd\u6570\u540d\u79f0\u540d\u79f0\uff08item.name\uff09\u8fdb\u884c\u5bf9\u5e94\uff0c\u56e0\u6b64\uff0c\u6ce8\u610f CSV \u6587\u4ef6\u540d\u79f0\u5bf9\u5e94\u7684\u662f\u7528\u4f8b\u51fd\u6570\u540d\u79f0\uff0c\u5373 def test_music_001 \u91cc\u9762\u7684 music \uff0c\u800c\u4e0d\u662f test_music_001.py \u91cc\u9762\u7684 music \u3002 \u8fd9\u91cc\u7ec6\u7ec6\u54c1\u4e00\u4e0b\u54c8~ \u5982\u679c\u4f60\u5c06\u4e0a\u4f8b\u5199\u6210\u4e86\u8fd9\u6837: # test_music_001.py\ndef test_movie_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u7528\u4f8b\u6267\u884c\u6ca1\u95ee\u9898\uff0c\u4f46\u662f\u6807\u7b7e\u5316\u7ba1\u7406\u662f\u4e0d\u751f\u6548\u7684\uff0c\u6846\u67b6\u65e0\u6cd5\u5c06 music.csv\u6587\u4ef6\u91cc\u9762\u6807\u7b7e\uff0c\u6dfb\u52a0\u5230 test_movie_001\u8fd9\u4e2a\u7528\u4f8b\u4e2d\uff0c\u56e0\u4e3a\u4ed6\u4eec\u6ca1\u6709\u5bf9\u5e94\u5173\u7cfb\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#tag","title":"\u4e8c\u3001\u5206\u652f\u53ca tag \u7ba1\u7406\u89c4\u8303","text":"\u53c2\u8003\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u4ee3\u7801\u7ba1\u7406\u89c4\u8303\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2-tag","title":"2. \u5e94\u7528\u5e93 tag","text":" \u5e94\u7528\u5e93 tag \u6839\u636e\u5e94\u7528\u4ea4\u4ed8\u8282\u70b9\u751f\u6210\uff0c\u6bcf\u6b21\u6253 tag \u4e4b\u524d\uff0c\u76f8\u5173\u6d4b\u8bd5\u4eba\u5458\u9700\u8981\u8fdb\u884c\u7528\u4f8b\u8c03\u8bd5\uff1b \u8c03\u8bd5\u7528\u4f8b\u662f\u6307\u7684\u5728\u5168\u67b6\u6784\uff08x86\u3001arm\u3001mips\uff09\u4e0a\u8c03\u8bd5\u901a\u8fc7\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\u8fbe\u5230 90% \u4ee5\u4e0a\u624d\u80fd\u6253 tag\uff0c\u901a\u8fc7 Jenkins \u6267\u884c\u5668\u6267\u884c\u7528\u4f8b\uff0c\u4fdd\u7559\u901a\u8fc7\u7387\u7ed3\u679c\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\uff1a\u901a\u8fc7\u7528\u4f8b\u6570 / (\u603b\u7528\u4f8b\u6570 - \u5df2\u5e9f\u5f03\u7528\u4f8b) \u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u7b97\u901a\u8fc7 Jenkins \u6267\u884c\u5668 \u4f60\u53ef\u80fd\u4f1a\u5728\u4e00\u4e2a\u4ea4\u4ed8\u5468\u671f\u5185\u6301\u7eed\u7684\u8fdb\u884cAT\u7528\u4f8b\u8c03\u8bd5\uff0c\u4f46\u662f\u6700\u7ec8 AT \u7528\u4f8b\u6253 tag \u7684\u5e94\u7528\u7248\u672c\uff0c\u9700\u8981\u4f7f\u7528\u5e94\u7528\u96c6\u6210\u4ea4\u4ed8\u7684\u6700\u65b0\u5e94\u7528\u7248\u672c\uff0c\u53ef\u4ee5\u4f7f\u7528\u5e94\u7528\u7684\u63d0\u6d4b\u7248\u672c\uff1b\u4e00\u5b9a\u8981\u786e\u4fdd\u8c03\u8bd5\u7528\u4f8b\u7684\u5e94\u7528\u7248\u672c\u662f\u6700\u65b0\u7684\uff0c\u4e0d\u7136\u96c6\u6210\u8fdb\u53bb\u4e4b\u540e\uff0c\u6301\u7eed\u96c6\u6210\u5c31\u4f1a\u51fa\u95ee\u9898\uff1b tag \u53f7\u600e\u4e48\u6253\uff1f \u6839\u636e\u6301\u7eed\u96c6\u6210\u7684\u8981\u6c42\u751f\u6210\uff0c\u5176\u4e2d\u5e94\u7528\u7248\u672c\u53f7\u9700\u8981\u4e0e\u9879\u76ee\u7ecf\u7406\u786e\u8ba4\u672c\u6b21\u5373\u5c06\u96c6\u6210\u7684\u5e94\u7528\u7248\u672c\u53f7\u662f\u591a\u5c11\uff1b tag \u7684 commit \u4fe1\u606f\u683c\u5f0f\uff1a # commit msg\nversion:5.6.5\n \u5176\u4e2d 5.6.5 \u5199\u5e94\u7528\u7684\u96c6\u6210\u7248\u672c\u53f7\u3002 \u751f\u6210 tag \u7684\u547d\u4ee4\u53c2\u8003\uff1a\u300aGit \u6807\u7b7e\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3-tag","title":"3. \u57fa\u7840\u6846\u67b6 tag","text":"\u57fa\u7840\u6846\u67b6 tag \u4e0d\u4e0e\u4e1a\u52a1\u6302\u94a9\uff0c\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u6309\u9700\u53d1\u5e03\u7248\u672c\uff0c\u5728\u6839\u76ee\u5f55\u4e0b CURRENT \u6587\u4ef6\u4e2d\u8bb0\u5f55\u7684\u5f53\u524d\u7248\u672c\u53f7\u548c\u5386\u53f2\u7248\u672c\u53f7\uff0c\u53ca\u5176\u5bf9\u5e94\u65b0\u589e\u4e86\u54ea\u4e9b\u529f\u80fd\uff0c\u6709\u52a9\u4e8e\u5e94\u7528\u9009\u62e9\u5408\u9002\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\u3002 # CURRENT\n[current]\ntag = 0.9.5\n \u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u7684 control \u6587\u4ef6\u8bb0\u5f55\u5f53\u524d\u5e94\u7528\u5e93\u4f9d\u8d56\u7684\u57fa\u7840\u5e93\u7248\u672c\u3002 # control\n[Depends]\nautotest-basic-frame = 0.9.5\n \u7528\u4f8b\u5728\u6267\u884c\u65f6\u4f1a\u6821\u9a8c\u4e24\u4e2a\u6587\u4ef6\u7684\u7248\u672c\u53f7\u662f\u5426\u4e00\u81f4\uff0c\u5982\u679c\u4e0d\u4e00\u81f4\uff0c\u4f1a\u6253\u5370 error \u65e5\u5fd7\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_2","title":"\u4e09\u3001\u4ed3\u5e93\u6743\u9650\u7ba1\u7406","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_1","title":"1. \u57fa\u7840\u6846\u67b6","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u4ed3\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame \u57fa\u7840\u6846\u67b6\u4e0d\u5141\u8bb8\u533f\u540d\u8bbf\u95ee\uff0c\u5982\u679c\u4f60\u767b\u5f55 gerrit \u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u8bbf\u95ee\u4ee5\u4e0a\u94fe\u63a5\uff0c\u5219\u9700\u8981\u7533\u8bf7\u8bbf\u95ee\u6743\u9650\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_1","title":"2. \u5e94\u7528\u4ed3\u5e93","text":" \u81ea\u52a8\u5316\u5e94\u7528\u4ed3\u5e93\uff1a https://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684 app_name \u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_3","title":"\u56db\u3001\u65b9\u6cd5\u7f16\u5199&\u8c03\u7528\u89c4\u8303","text":"\u65b9\u6cd5\u7f16\u5199\u6574\u4f53\u8bbe\u8ba1\u601d\u8def\u53c2\u8003\uff1a[\u300aAT\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b]"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_2","title":"1. \u65b9\u6cd5\u7f16\u5199","text":"\u5199\u65b9\u6cd5\u7684\u65f6\u5019\u6ce8\u610f\u65b9\u6cd5\u5f52\u5c5e\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget\uff0c\u65b9\u6cd5\u662f\u5728\u54ea\u4e2a\u533a\u57df\u64cd\u4f5c\u7684\uff0c\u5c31\u5199\u5728\u54ea\u4e2a\u7c7b\u91cc\u9762\u3002 \u4e3e\u4f8b\uff1a from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n\"\"\"\u70b9\u51fb\u6807\u9898\u680fxxx\"\"\"\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_2","title":"2. \u65b9\u6cd5\u8c03\u7528","text":" \u5728\u7528\u4f8b\u4e2d\u8c03\u7528\u65b9\u6cd5\uff0c\u901a\u8fc7\u8be5\u5e94\u7528\u552f\u4e00\u7684\u51fa\u53e3\u8fdb\u884c\u8c03\u7528\uff0c\u6bd4\u5982\u6587\u7ba1\uff1a class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n \u4e0d\u8981\u5728\u7528\u4f8b\u4e2d\u5355\u72ec\u53bb\u8c03\u7528 TitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u8fd9\u4e9b\u7c7b\uff0c\u5426\u5219\u540e\u671f\u7528\u4f8b\u4f1a\u53d8\u5f97\u4e0d\u597d\u7ef4\u62a4\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_4","title":"\u4e94\u3001\u7528\u4f8b\u7f16\u5199\u89c4\u8303","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_3","title":"1. \u57fa\u4e8e\u7c7b\u5199\u7528\u4f8b","text":"\u6240\u6709\u7528\u4f8b\u90fd\u5e94\u8be5\u57fa\u4e8e\u7c7b\u53bb\u5199\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001(self):\n\"\"\"\u97f3\u4e50\u542f\u52a8\"\"\"\n \u6ce8\u610f\u4ee5\u4e0b\u51e0\u70b9\uff1a \u7c7b\u540d\u4e0d\u8981\u968f\u4fbf\u53d6\uff0c\u540c\u4e00\u4e2a\u5e94\u7528\u5e94\u8be5\u4f7f\u7528\u540c\u4e00\u4e2a\u7c7b\u540d\uff0c\u7528\u4f8b\u7c7b\u540d\u79f0\u5fc5\u987b\u4ee5 Test \u5f00\u5934\uff0c\u9075\u5faa\u5927\u9a7c\u5cf0\u547d\u540d\u89c4\u8303\uff1b \u7528\u4f8b\u7c7b\u7ee7\u627f BaseCase\uff0c\u4e00\u4e2a\u5e94\u7528\u53ea\u6709\u4e00\u4e2a BaseCase \u4e00\u4e2a py \u6587\u4ef6\u91cc\u9762\u53ea\u6709\u4e00\u4e2a\u7c7b\uff0c\u6211\u4eec\u79f0\u4e3a\u4e00\u4e2a\u6d4b\u8bd5\u7c7b\uff1b \u4e00\u4e2a\u7c7b\u91cc\u9762\u53ef\u4ee5\u6709\u591a\u4e2a\u7528\u4f8b\u51fd\u6570\uff0c\u8fd9\u53d6\u51b3\u8fd9\u6761\u7528\u4f8b\u6709\u591a\u5c11\u4e2a\u6d4b\u8bd5\u70b9\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001_1(self):\n\"\"\"\u4efb\u52a1\u680f\u542f\u52a8\u97f3\u4e50\"\"\"\ndef test_music_001_2(self):\n\"\"\"\u542f\u52a8\u5668\u542f\u52a8\u97f3\u4e50\"\"\" \ndef test_music_001_3(self):\n\"\"\"\u684c\u9762\u542f\u52a8\u97f3\u4e50\"\"\"\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_3","title":"2. \u7528\u4f8b\u51fd\u6570\u89c4\u8303","text":" \u7528\u4f8b\u51fd\u6570\u4ee5 test \u5f00\u5934\uff0c\u9075\u5faa\u86c7\u5f62\u547d\u540d\u89c4\u8303\uff0c\u4e2d\u95f4\u4e3a\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0\uff0c\u540e\u9762\u52a0\u7528\u4f8b ID\uff0c\u6700\u540e\u52a0\u6d4b\u8bd5\u70b9\u5e8f\u53f7\uff0c\u5373 test_${module}_${case_id}[_${index}] \uff1b \u6bd4\u5982\uff1atest_music_001_1\uff0cindex \u4ece 1 \u5f00\u59cb\u3002 \u51fd\u6570\u529f\u80fd\u8bf4\u660e\u91cc\u9762\u5199\u7528\u4f8b\u6807\u9898\uff0c\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u6807\u9898\u5373\u53ef\uff0c\u6ce8\u610f\u7528\u4e09\u5bf9\u53cc\u5f15\u53f7\uff0c\u4e0d\u8981\u7528\u5176\u4ed6\u6ce8\u91ca\uff0c\u66f4\u4e0d\u8981\u7528\u4e95\u53f7\u6ce8\u91ca\u5199\u7528\u4f8b\u6807\u9898\uff1b \u76f4\u63a5\u590d\u5236 PMS \u7528\u4f8b \u7528\u4f8b\u6b65\u9aa4\u76f4\u63a5\u5c06 PMS \u4e0a\u7528\u4f8b\u6b65\u9aa4\u548c\u9884\u671f\u590d\u5236\u8fdb\u6765\uff0c\u7136\u540e\u8fdb\u884c\u6279\u91cf\u6ce8\u91ca\uff08ctrl + /\uff09\uff0c\u5728\u6ce8\u91ca\u7684\u57fa\u7840\u4e0a\u53bb\u5199\u7528\u4f8b\u811a\u672c\u4f1a\u66f4\u52a0\u65b9\u4fbf\u5168\u9762\uff0c\u4e5f\u6bd4\u4f60\u81ea\u5df1\u5199\u6ce8\u91ca\u66f4\u8282\u7ea6\u65f6\u95f4\uff1a \u4e3e\u4f8b\uff0cPMS \u7528\u4f8b\uff1a \u76f4\u63a5\u9009\u4e2d\u7528\u4f8b\u5185\u5bb9\uff0c\u590d\u5236\u4e0b\u6765\uff0c\u7136\u540e\u7c98\u8d34\u5230\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c\u4e2d\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\n \u4e0a\u4f8b\u4e2d\u4e95\u53f7\u6ce8\u91ca\u90e8\u5206\u5c31\u662f\u76f4\u63a5\u4ece PMS \u4e0a\u590d\u5236\u8fc7\u6765\u7684\uff0c\u5728\u6b64\u57fa\u7840\u4e0a\u5199\u7528\u4f8b\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\nmusic = DeepinMusicWidget()\nmusic.click_singer_btn_in_music_by_ui()\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\nmusic.click_icon_mode_in_music_by_ui()\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\nmusic.double_click_first_singer_in_singer_icon_view_by_ui()\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\nself.assert_xxx\n \u4f60\u770b\uff0c\u975e\u5e38\u6e05\u695a\u6bcf\u4e00\u6b65\u5728\u505a\u4ec0\u4e48\uff0c\u91cd\u70b9\u662f\u7701\u53bb\u4e86\u5199\u6ce8\u91ca\u7684\u65f6\u95f4\uff0c\u771f\u7684\u7092\u9e21\u65b9\u4fbf\u3002 \u4e0d\u5199 if __name__ == '__main__':\uff0c\u4e0d\u5199\u591a\u4f59\u7684\u4ee3\u7801\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3","title":"3. \u6570\u636e\u9a71\u52a8","text":" \u5982\u679c\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u662f\u76f8\u540c\u7684\uff0c\u53ea\u662f\u4e00\u4e9b\u53c2\u6570\u53d8\u5316\uff0c\u5c3d\u91cf\u4f7f\u7528\u6570\u636e\u9a71\u52a8\u6765\u5b9e\u73b0\u7528\u4f8b\uff1b \u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u6570\u636e\u9a71\u52a8\u7684\u6570\u636e\uff0c\u4e0d\u80fd\u56e0\u6b64\u5f15\u5165\u4f9d\u8d56\uff0c\u5c3d\u91cf\u4f7f\u7528\u4e00\u4e9b\u6807\u51c6\u5e93\u80fd\u8bfb\u53d6\u7684\u6587\u4ef6\u683c\u5f0f\uff0c\u6bd4\u5982 json\u3001ini\u3001CSV\u3001xml\u3001txt \u7b49\u6587\u4ef6\u683c\u5f0f\uff1b\u4e0d\u5efa\u8bae\u4f7f\u7528 Yaml\u3001Excel\u3001MySQL \u7b49\u6570\u636e\u683c\u5f0f\uff1b \u8bfb\u53d6\u6570\u636e\u65f6\u4e5f\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff0c\u5982\u4f7f\u7528 pandas \u5904\u7406 CSV \u5c31\u5c5e\u4e8e\u5927\u6750\u5c0f\u7528\u4e86\uff0c\u6b63\u5e38\u7684\u6570\u636e\u9a71\u52a8\u8fd8\u6ca1\u5230\u9700\u8981\u5927\u6570\u636e\u5206\u6790\u6765\u5904\u7406\u7684\u5730\u6b65\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u5728 widget/ddt/ \u76ee\u5f55\u4e0b\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5199\u6cd5\uff1a @pytest.mark.parametrize(\"value\", data)\ndef test_smb_049(self, value):\n \u4ee5\u4e0a\u8fd9\u79cd\u53c2\u6570\u5316\u7684\u5199\u6cd5\u672c\u8eab\u6ca1\u4ec0\u4e48\u95ee\u9898\uff0c\u4f46\u662f\uff0c\u8fd9\u91cc\u5fc5\u987b\u8981\u8865\u5145\u4e00\u4e2a\u6ca1\u6709\u7528\u7684\u5c0f\u77e5\u8bc6\uff1a \u5982\u679c\u53c2\u6570\u5316\u6570\u636e\u91cc\u9762\u7684\u5b57\u7b26\u4f1a\u539f\u5c01\u4e0d\u52a8\u7684\u8f93\u51fa\u5230 item.name \u91cc\u9762\uff0c\u663e\u793a\u975e\u5e38\u4e0d\u4f18\u96c5\uff0c\u800c\u4e14\u53ef\u4ee5\u4f1a\u5f15\u5165\u4e00\u4e9b\u610f\u60f3\u4e0d\u5230\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u611f\u53d7\u4e00\u4e0b\uff1a \u53c2\u6570\uff1a data = [\n\"\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\", \"qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678\",\n]\n \u73b0\u8c61\u662f\u8fd9\u6837\u8272\u513f\u7684\uff1a test_smb_049.py::TestFileManager::test_smb_049[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09]\ntest_smb_049.py::TestFileManager::test_smb_049[qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui]\ntest_smb_049.py::TestFileManager::test_smb_049[12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678]\n \u8bf4\u5b9e\u8bdd\uff0c\u770b\u7740\u5fc3\u91cc\u5835\u5f97\u614c\uff0c\u5982\u679c\u8fd9\u91cc\u9762\u5305\u542b\u4e00\u4e9b\u7279\u6b8a\u5b57\u7b26\u6216\u8005\u662f\u8d85\u957f\uff0c\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u5f88\u5947\u5999\u7684\u4e8b\u60c5\u53d1\u751f\u3002 parametrize \u91cc\u9762\u6709\u4e2a\u53c2\u6570\uff1aids\uff0c\u53ef\u4ee5\u89e3\u51b3\u6b64\u7c7b\u95ee\u9898\uff0c\u5c31\u50cf\u8fd9\u6837\uff1a @pytest.mark.parametrize(\"value\", data, ids=[1, 2, 3])\ndef test_smb_049(self, value):\n \u518d\u6765\u611f\u53d7\u4e00\u4e0b\uff1a test_smb_049.py::TestFileManager::test_smb_049[1]\ntest_smb_049.py::TestFileManager::test_smb_049[2]\ntest_smb_049.py::TestFileManager::test_smb_049[3]\n \u660e\u663e\u597d\u591a\u4e86\uff0c\u6240\u4ee5\u5c3d\u91cf\u4f7f\u7528 ids \u8fd9\u4e2a\u53c2\u6570\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 fixture \u7684\u6570\u636e\u9a71\u52a8\u65b9\u5f0f\uff0c\u6846\u67b6\u867d\u7136\u652f\u6301\uff0c\u4f46\u53ef\u8bfb\u6027\u6bd4\u8f83\u5dee\uff1b\u5982\u679c\u4f60\u4e0d\u77e5\u9053\u8fd9\u53e5\u8bdd\u5728\u8bf4\u5565\uff0c\u90a3\u4f60\u53ef\u4ee5\u5ffd\u7565\uff0c\u6211\u4e5f\u4e0d\u6253\u7b97\u8be6\u7ec6\u8bf4\u8fd9\u79cd\u5b9e\u73b0\u65b9\u5f0f\uff0c\u64cd\u4f5c\u6bd4\u8f83\u9a9a\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4","title":"4. \u65ad\u8a00\u8d44\u6e90","text":" \u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u76f4\u63a5\u653e\u5728\u7528\u4f8b\u6a21\u5757\u7684\u540c\u7ea7\u76ee\u5f55\u4e0b\u7684 assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0 + \u7528\u4f8b ID \u547d\u540d\uff1b \u56fe\u50cf\u8bc6\u522b\u65ad\u8a00\uff0c\u4e0d\u8981\u622a\u53d6\u4e00\u5f20\u5f88\u5927\u7684\u56fe\uff0c\u56fe\u7247\u8d44\u6e90\u5305\u542b\u7684\u5143\u7d20\u592a\u591a\u4e86\uff0c\u975e\u5e38\u5bb9\u6613\u53d7\u5230\u9700\u6c42\u5f71\u54cd\uff0c\u5efa\u8bae\u662f\u8fdb\u884c\u5c40\u90e8\u7684\u65ad\u8a00\uff1b \u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u5339\u914d\u5ea6\u662f 0.9\uff0c\u5982\u679c\u65ad\u8a00\u7684\u573a\u666f\u5bf9\u4e8e\u7cbe\u786e\u5ea6\u8981\u6c42\u6ca1\u90a3\u4e48\u9ad8\uff0c\u53ef\u4ee5\u5728\u65ad\u8a00\u8bed\u53e5\u91cc\u9762\u4f20\u5165\u5c0f\u4e8e 0.9 \u7684\u53c2\u6570\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5","title":"5. \u5143\u7d20\u5b9a\u4f4d","text":" \u7528\u4e8e\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u4e2d\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u547d\u540d\u4e3a\u8be5\u5143\u7d20\u7684\u540d\u79f0\uff1b \u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u622a\u53d6\u65f6\u5c3d\u91cf\u7cbe\u786e\u5230\u8fd9\u4e2a\u5177\u4f53\u7684\u6309\u94ae\uff0c\u56fe\u7247\u4e5f\u4e0d\u8981\u592a\u5927\uff1b \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u64cd\u4f5c\u8f83\u5feb\uff0c\u5408\u7406\u52a0\u5165\u7b49\u5f85\u65f6\u95f4\u80fd\u63d0\u9ad8\u7528\u4f8b\u7684\u7a33\u5b9a\u6027\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6","title":"6. \u7528\u4f8b\u8d44\u6e90","text":" \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u4f7f\u7528\u5230\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u6bd4\u5982\u97f3\u4e50\u53ef\u80fd\u9700\u8981\u4e00\u4e9b mp3 \u7684\u8d44\u6e90\u7528\u4e8e\u6d4b\u8bd5\uff0c\u5b58\u653e\u5728 widget/case_res \u76ee\u5f55\u4e0b\uff0c\u524d\u63d0\u662f\u8fd9\u4e9b\u8d44\u6e90\u4e0d\u8d85\u8fc7 10M\uff1b \u5982\u679c\u662f\u4e00\u4e9b\u6bd4\u8f83\u5927\u7684\u8d44\u6e90\uff0c\u5efa\u8bae\u653e\u5230\u7edf\u4e00\u7684 ftp \u670d\u52a1\u5668 \uff08ftp://10.8.10.245\uff09\uff0c\u9700\u8981\u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\u518d\u4e0b\u8f7d\u4e0b\u6765\uff1b f\"wget ftp://{Config.FTP_IP}/uploads/\u591a\u5a92\u4f53/\u5f71\u9662/auto/{file_name};unzip {file_name};rm -rf {file_name};\"\n \u6d4b\u8bd5\u8d44\u6e90\u4e0b\u8f7d\u5230\u5e94\u7528 widget/case_res \u76ee\u5f55\u4e0b\uff1b \u7981\u6b62\u5c06\u6d4b\u8bd5\u8d44\u6e90\u5b58\u653e\u5728\u4e2a\u4eba\u7684\u673a\u5668\u4e0a\uff1b \u5e94\u8be5\u5c3d\u91cf\u4fdd\u8bc1\uff0c\u4e00\u4e2a\u8d44\u6e90\u5728\u4e00\u6b21\u7528\u4f8b\u6267\u884c\u4e2d\u53ea\u9700\u8981\u4e0b\u8f7d\u4e00\u6b21\uff0c\u6240\u4ee5\u4f60\u4e0d\u80fd\u6bcf\u6b21\u4f7f\u7528\u7684\u65f6\u5019\u90fd\u53bb\u4e0b\u8f7d\uff0c\u8fd9\u6837\u53ef\u80fd\u4f1a\u8017\u8d39\u5927\u91cf\u7684\u7f51\u7edc\u8d44\u6e90\uff0c\u800c\u56e0\u4e3a\u5148\u5224\u65ad\u672c\u5730\u662f\u5426\u5b58\u5728\u6b64\u8d44\u6e90\uff0c\u5982\u679c\u4e0d\u5b58\u5728\u518d\u53bb\u4e0b\u8f7d\uff1b \u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u5c06\u8d44\u6e90\u62f7\u8d1d\u5230\u5bf9\u5e94\u7684\u6d4b\u8bd5\u76ee\u5f55\u4e0b\uff0c\u6bd4\u5982\u5c06 mp3 \u6587\u4ef6\u62f7\u8d1d\u5230 ~/Music \u76ee\u5f55\u4e0b\uff0c\u4f46\u662f\u6211\u4eec\u66f4\u5efa\u8bae\u4f60\u4f7f\u7528\u53d1\u9001\u5feb\u6377\u94fe\u63a5\u7684\u65b9\u5f0f\u66ff\u4ee3\u62f7\u8d1d\u7684\u64cd\u4f5c\uff0c\u56e0\u4e3a\u5728\u62f7\u8d1d\u5927\u6587\u4ef6\u65f6\u662f\u5f88\u6d88\u8017\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u800c\u521b\u5efa\u94fe\u63a5\u5219\u4e0d\u4f1a\uff1b @classmethod\ndef recovery_many_movies_in_movie_by_cmd(cls):\n\"\"\"\u6062\u590d\u591a\u4e2a\u89c6\u9891\u6587\u4ef6\u81f3\u89c6\u9891\u76ee\u5f55\u4e2d\"\"\"\nwork_path = f\"/home/{Config.USERNAME}/Videos/auto\"\ncode_path = f\"{Config.CASE_RES_PATH}/auto\"\ncls.run_cmd(f\"rm -rf {work_path};mkdir {work_path}\")\nsleep(1)\nflag = False\nif not exists(code_path):\ncls.run_cmd(f\"mkdir -p {code_path}\")\nflag = True\nlogger.info(f\"ln -s {code_path}/* {work_path}/\")\ncls.run_cmd(\nf\"cd {code_path}/;\"\nf\"{cls.wget_file('auto.zip') if flag else ''}\"\nf\"ln -s {code_path}/* {work_path}/ > /dev/null 2>&1\"\n)\n \u8d44\u6e90\u4e0b\u8f7d\u8fc7\u7a0b\u4e2d\u6ce8\u610f\u8d85\u65f6\u7684\u95ee\u9898\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u5f88\u5927\uff0c\u8981\u7279\u522b\u6ce8\u610f\u8fd9\u95ee\u9898\uff0c\u5982\u679c\u4f60\u4f7f\u7528\u5f3a\u5236\u7b49\u5f85\u4e0b\u8f7d\u7ed3\u675f( os.system )\uff0c\u53ef\u80fd\u4f1a\u9020\u6210\u7528\u4f8b\u6267\u884c\u65f6\u957f\u53d8\u5f97\u4e0d\u53ef\u63a5\u53d7\uff0c\u76ee\u524d\u6211\u4eec\u53d1\u73b0\u5728\u6301\u7eed\u96c6\u6210\u73af\u5883\u6267\u884c\u65f6\u7f51\u7edc\u4e0b\u8f7d\u901f\u5ea6\u5f88\u6162\uff0c\u6240\u4ee5\u8d85\u65f6\u673a\u5236\u662f\u5f88\u6709\u5fc5\u8981\u7684\uff1brun_cmd \u65b9\u6cd5\u6709\u4e00\u4e2a\u9ed8\u8ba4\u8d85\u65f6\u7684\u65f6\u95f4\uff0c\u4f60\u53ef\u4ee5\u6839\u636e\u8d44\u6e90\u5927\u5c0f\u5bf9\u8d85\u65f6\u65f6\u95f4\u8fdb\u884c\u8c03\u6574\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_5","title":"\u516d\u3001\u7528\u4f8b\u8c03\u8bd5\u6280\u5de7","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_4","title":"1. \u65e5\u5fd7","text":" \u4e00\u5b9a\u8981\u5148\u770b\u62a5\u9519\uff0c\u770b error \u65e5\u5fd7\uff0c\u901a\u5e38\u80fd\u660e\u786e\u7684\u544a\u8bc9\u4f60\u5177\u4f53\u54ea\u91cc\u4ee3\u7801\u62a5\u9519\uff1b \u7ed3\u5408\u62a5\u9519\u70b9\u524d\u9762\u7684error\u3001 info \u548c debug \u65e5\u5fd7\u770b\u5426\u662f\u6b63\u5e38\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_4","title":"2. \u65ad\u70b9\u8c03\u8bd5","text":" \u65b9\u6cd5\u62a5\u9519\uff1a \u5728\u65b9\u6cd5\u5e93\u4e2d\u627e\u5230\u5bf9\u5e94\u7684\u65b9\u6cd5\uff0c\u5355\u72ec\u8c03\u7528\uff0c\u770b\u662f\u5426\u80fd\u6b63\u5e38\u6267\u884c\uff1b \u901a\u5e38\u5355\u4e2a\u65b9\u6cd5\u7684\u6267\u884c\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u62a5\u9519\uff0c\u5f88\u5feb\u5c31\u80fd\u6392\u67e5\u51fa\u95ee\u9898\uff1b\u5728\u65b9\u6cd5\u5185\u90e8\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u65b9\u6cd5\u5185\u90e8\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u8c03\u7528\u6ca1\u95ee\u9898\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u62a5\u9519\u7684\u65b9\u6cd5\u524d\u9762\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u7528\u4f8b\u7684\u4e1a\u52a1\u903b\u8f91\u548c\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u65ad\u8a00\u62a5\u9519\uff1a \u65ad\u8a00\u4e3a\u6570\u636e\u65ad\u8a00\uff0c\u6839\u636e\u8868\u8fbe\u5f0f\u8fdb\u884c\u65ad\u8a00\u8bed\u53e5\u8fdb\u884c\u4fee\u6539\uff1b \u6587\u4ef6\u751f\u6210\u7c7b\u65ad\u8a00\uff0c\u67e5\u770b\u662f\u5426\u9700\u8981\u52a0\u7b49\u5f85\u65f6\u95f4\uff1b \u56fe\u50cf\u65ad\u8a00\uff0c\u5728\u65ad\u8a00\u8bed\u53e5\u5904\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u7528\u4f8b\u8fd0\u884c\u5230\u65ad\u8a00\u5904\u4f1a\u505c\u6b62\uff0c\u67e5\u770b\u6b64\u65f6\u65ad\u8a00\u7684\u56fe\u7247\u4e0e\u7528\u4f8b\u6267\u884c\u7684\u73b0\u573a\u5b58\u5728\u4ec0\u4e48\u5dee\u5f02\uff0c\u6b64\u65f6\u4e5f\u53ef\u4ee5\u8fdb\u884c\u91cd\u65b0\u622a\u56fe\uff0c\u4ece\u800c\u66ff\u6362\u65b0\u7684\u56fe\u7247\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3_1","title":"3. \u8fdc\u7a0b\u6267\u884c","text":" \u8fdc\u7a0b\u6267\u884c\u6307\u7684\u662f\u7f16\u8f91\u5668\u901a\u8fc7\u6307\u5b9a\u8fdc\u7a0b\u89e3\u91ca\u5668\u6267\u884c\u81ea\u52a8\u5316\u4ee3\u7801\uff1b \u8fdc\u7a0b\u6267\u884c\u7684\u597d\u5904\u662f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u7684 Debug \u8fd0\u884c\uff0c\u4e0d\u7528\u5728\u6d4b\u8bd5\u673a\u4e0a\u6253\u5f00\u7f16\u8f91\u5668\uff0c\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u66f4\u5feb\uff1b \u652f\u6301\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u7684\u7f16\u8f91\u5668\uff1a \u4e13\u4e1a\u7248 Pycharm VScode \uff0c\u9700\u8981\u4f7f\u7528\u63d2\u4ef6 Remote-SSH \u8fdc\u7a0b\u6267\u884c\u914d\u7f6e \u4ee5 Pycharm \u4e3a\u4f8b\uff1a File \u2014> Settings \u2014> Project \u2014> Python Interpreter \u2014> \u53f3\u8fb9\u8bbe\u7f6e\u6309\u94ae \u2014> Add... \u2014> SSH Interpreter \u2014> New server configuration(\u586b\u5165host\u548cusername) \u2014> Next \u2014> password\uff08\u6d4b\u8bd5\u673a\u5bc6\u7801\uff09 \u2014> Interpreter(\u9009\u62e9\u8fdc\u7a0b\u89e3\u91ca\u5668) \u2014> Finish "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4_1","title":"4. \u73af\u5883\u6e05\u7406","text":" \u5982\u679c\u7528\u4f8b\u91cc\u9762\u7684 teardown \u6ca1\u6709\u6267\u884c\uff0c\u5927\u6982\u7387\u662f\u56e0\u4e3a setup \u91cc\u9762\u4ee3\u7801\u62a5\u9519\uff0c\u8fd9\u4e24\u4e2a\u662f\u4e00\u5bf9\u7684\uff0csetup \u91cc\u9762\u62a5\u9519\uff0cteardown \u91cc\u9762\u7684\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\uff1b \u76ee\u524d\u6211\u4eec\u5df2\u7ecf\u5c06\u5404\u5e94\u7528\u7684 clean_all \u8fd9\u4e2a fixture \u6539\u6210\u4e86\u7ec8\u7ed3\u5668\uff0c\u786e\u4fdd\u59cb\u7ec8\u80fd\u6267\u884c\u5230\u8fd9\u6b65\uff0c\u4f46\u662f\u7528\u4f8b\u91cc\u9762\u7684 fixture\uff0c\u8fd8\u662f\u9700\u8981\u6211\u4eec\u5c0f\u5fc3\u5904\u7406\uff1b \u8981\u6267\u884c clean_all \u9700\u8981\u5728\u7f16\u8f91\u5668\u8fd0\u884c\u53c2\u6570\u52a0 --clean yes\uff0c\u5199\u7528\u4f8b\u7684\u65f6\u5019\u8bf7\u52a0\u4e0a\uff0c\u4e0d\u7136\u4f60\u4e0d\u786e\u5b9a\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u7684\u73af\u5883\u662f\u5426\u6062\u590d\uff1b setup \u53ef\u4ee5\u4e0d\u8981\uff0c\u5c06 setup \u653e\u5230\u7528\u4f8b\u91cc\u9762\u662f\u4e00\u79cd\u7a33\u59a5\u7684\u505a\u6cd5\uff0cteardown \u4e00\u5b9a\u8981\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5_1","title":"5. \u5143\u7d20\u5b9a\u4f4d\u4e0d\u51c6\uff08\u5750\u6807\u8fd4\u56de\u4e0d\u5bf9\uff09","text":" \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u53ef\u80fd\u53d7\u5230\u7a97\u53e3 ID \u7684\u53d8\u5316\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u9ed8\u8ba4\u53d6\u6700\u65b0\u7684\u4e00\u4e2a\u7a97\u53e3\u7528\u4e8e\u5b9a\u4f4d\uff0c\u4f46\u5982\u679c\u5b9e\u9645\u9700\u8981\u5b9a\u4f4d\u7684\u4e0d\u662f\u6700\u65b0\u7684\u7a97\u53e3\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u91cd\u65b0\u5b9e\u4f8b\u5316\u65b9\u6cd5\u7c7b\u5bf9\u8c61\uff0c\u5e76\u5728\u7c7b\u4e2d\u4f20\u5165\u5bf9\u5e94\u7684\u7a97\u53e3\u5e8f\u53f7\uff1b \u57fa\u4e8e\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u76ee\u524d\u9047\u5230\u7684\u7b14\u8bb0\u672c\u4e0a\uff0c\u7531\u4e8e\u5c4f\u5e55\u7f29\u653e\u6bd4\u4f8b\u4e3a 1.25\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u6211\u4eec\u9ed8\u8ba4\u4f7f\u7528\u7f29\u653e\u6bd4\u4f8b\u4e3a 1\uff1b \u57fa\u4e8e\u56fe\u50cf\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u76ee\u6807\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b \u57fa\u4e8e OCR \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u6587\u5b57\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u540c\u6837\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6_1","title":"6. \u952e\u9f20\u64cd\u4f5c\u4e0d\u51c6","text":" \u9f20\u6807\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6bd4\u5982\u53f3\u952e\u3001\u53cc\u51fb\u65e0\u54cd\u5e94\uff1b \u952e\u76d8\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6216\u8005\u5ef6\u8fdf\u8f93\u5165\uff0c\u6bd4\u5982\u7528\u4f8b\u9700\u8981\u8f93\u5165\u201c\u6211\u662f\u4e2d\u56fd\u4eba\u201d\uff0c\u5b9e\u9645\u53ea\u8f93\u5165\u4e86\u201c\u6211\u56fd\u4eba\u201d\uff1b \u4ee5\u4e0a\u95ee\u9898\u6392\u9664\u5e94\u7528\u5361\u987f\u7b49\u95ee\u9898\uff0c\u5927\u6982\u7387\u662f\u7531\u4e8e\u5de5\u5177\u7684\u95ee\u9898\uff0c\u76ee\u524d\u952e\u9f20\u64cd\u4f5c\u6211\u4eec\u4f7f\u7528\u4e09\u4e2a\u5de5\u5177\uff1aDogtail \u63d0\u4f9b\u7684\u952e\u9f20\u5de5\u5177\u3001PyAutoGUI\u3001Xdotool \uff1b \u6709\u540c\u5b66\u53ef\u80fd\u8981\u8bf4\u4e3a\u5565\u8981\u7528\u4e09\u4e2a\u554a\uff0c\u7528\u4e00\u4e2a\u4e0d\u5c31\u597d\u4e86\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u5404\u6709\u4f18\u70b9\u5404\u6709\u7f3a\u70b9\u3002 \u5982\u679c\u4f60\u9047\u5230\u952e\u9f20\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u8bd5\u8bd5\u901a\u8fc7\u4e0d\u540c\u7684\u5de5\u5177\u64cd\u4f5c\uff1b\u952e\u76d8\u8f93\u5165\u5ef6\u8fdf\u7684\u95ee\u9898\uff0c\u4e00\u822c\u662f\u56e0\u4e3a\u8f93\u5165\u901f\u5ea6\u592a\u5feb\u4e86\uff0c\u7cfb\u7edf\u6ca1\u53cd\u5e94\u8fc7\u6765\uff0c\u5e38\u89c1\u4e8e ARM \u548c MIPS \u4e0a\uff0c\u4fee\u6539\u53c2\u6570 delay_time \u7684\u503c\uff0c\u5355\u4f4d\u4e3a\u6beb\u79d2\uff1b # mouse_key.py\n@classmethod\ndef input_message(cls, message, delay_time=300, interval=0.2):\n\"\"\"\n \u8f93\u5165\u5b57\u7b26\u4e32\n :param message: \u8f93\u5165\u7684\u5185\u5bb9\n :param delay_time: \u5ef6\u8fdf\u65f6\u95f4\n :param interval:\n :return:\n \"\"\"\n \u5982\u679c\u4e0d\u662f\u65b9\u6cd5\u7684\u95ee\u9898\uff0c\u5219\u9700\u8981\u7ee7\u7eed\u548c\u5f00\u53d1\u4e00\u8d77\u6392\u9664\uff0c\u662f\u5426\u4e3a\u5e94\u7528\u63a5\u53d7\u952e\u9f20\u4fe1\u53f7\u5904\u7406\u7684\u95ee\u9898\uff0c\u8fd9\u7c7b\u60c5\u51b5\u6211\u4eec\u4e5f\u662f\u9047\u5230\u8fc7\u7684\uff0c\u5177\u4f53\u95ee\u9898\u5177\u4f53\u5206\u6790\u3002 \u6bd4\u5982\u5f71\u9662\u5c31\u91cd\u5199\u4e86\u4e00\u4e2a\u53f3\u952e\u7684\u65b9\u6cd5\uff1a # base_widget.py\n@classmethod\ndef right_click(cls, _x=None, _y=None):\n\"\"\"\n \u91cd\u5199\u5e95\u5c42\u5355\u51fb\u9f20\u6807\u53f3\u952e\n \u89e3\u51b3\u5f71\u9662\u53f3\u952e\u89e6\u53d1release\u4e8b\u4ef6\u7684\u95ee\u9898\uff08\u53f3\u952e\u4e3b\u7a97\u53e3\u4f1a\u64ad\u653e\u89c6\u9891\uff09\n \"\"\"\ncls.mouse_down(_x, _y, button=3)\nsleep(0.1)\ncls.mouse_up(button=3)\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_6","title":"\u4e03\u3001\u5176\u4ed6\u4e0d\u4e3a\u4eba\u77e5\u7684\u7ec6\u8282","text":" \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u5c3d\u91cf\u7f16\u5199\u540c\u4e00\u4e2a\u5e94\u7528\u6216\u6a21\u5757\u7684\u7528\u4f8b\uff0c\u80fd\u5bf9\u8be5\u7528\u4f8b\u5df2\u6709\u65b9\u6cd5\u719f\u6089\uff0c\u907f\u514d\u8fc7\u591a\u91cd\u590d\u4e1a\u52a1\u4ee3\u7801\u7684\u5c01\u88c5\uff1b \u76f8\u540c\u7684\u573a\u666f\u4e0b\uff0c\u5404\u67b6\u6784\u7b49\u5f85\u65f6\u95f4\u4e0d\u540c\uff0c\u5efa\u8bae\u4f7f\u7528\u6846\u67b6\u63d0\u4f9b\u7684 sleep\uff0c\u6211\u4eec\u505a\u4e86\u4e0d\u540c\u67b6\u6784\u7684\u500d\u6570\u653e\u5927\uff1b \u7f16\u5199\u7528\u4f8b\u65f6\uff0c\u5c3d\u91cf\u8003\u8651\u5230\u6bcf\u4e00\u6b65\u5f02\u5e38\u540e\u7684\u73af\u5883\u6062\u590d\uff0c\u9700\u8981\u5efa\u8bae\u8fd9\u79cd\u610f\u8bc6\uff0c\u968f\u65f6\u8981\u8003\u8651\u5230\uff0c\u8fd9\u6b65\u64cd\u4f5c\u6709\u6ca1\u6709\u53ef\u80fd\u51fa\u9519\uff0c\u51fa\u9519\u4e86\u6539\u600e\u4e48\u529e\uff1b \u63d0\u4ea4\u4ee3\u7801\u7684\u65f6\u5019\u6ce8\u610f\u4e0d\u8981\u628a\u4e00\u4e9b\u4e34\u65f6\u7684\u6d4b\u8bd5\u8d44\u6e90\u63d0\u4ea4\u8fdb\u53bb\u4e86\uff0c\u6bd4\u5982\u6d4b\u8bd5\u4e86\u4e00\u4e2a\u5f71\u7247\uff0c\u6709\u4e9b\u540c\u5b66\u4e60\u60ef\u4f7f\u7528 git add . \uff0c\u7136\u540e\u5c31\u5168\u90e8\u63d0\u4ea4\u5230\u4ee3\u7801\u4ed3\u5e93\u4e86\uff0c\u8fd9\u6837\u5373\u4f7f\u540e\u671f\u628a\u5927\u6587\u4ef6\u5220\u4e86\uff0c.git \u6587\u4ef6\u91cc\u9762\u4e5f\u4f1a\u5f88\u5927\uff0c\u9020\u6210\u4ee3\u7801\u4ed3\u5e93\u53d8\u5f97\u5341\u5206\u81c3\u80bf\u3002 \u66f4\u591a\u7ec6\u8282\u67e5\u770b\uff1a\u300aAT\u7ecf\u9a8c\u603b\u7ed3\u300b"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/","title":"AT \u6267\u884c\u5668\u4f7f\u7528\u6307\u5317","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/5/25\n# Author : litao\n# =============================================\n Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1","title":"1\u3001\u529f\u80fd\u4ecb\u7ecd","text":" \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7cfb\u7edf\u8bed\u8a00\u8bbe\u7f6e\uff0c\u5206\u8fa8\u7387\u8bbe\u7f6e\u53ca\u7528\u4f8b\u6267\u884c\u73af\u5883\u642d\u5efa\uff1b \u652f\u6301 IP \u4e3a 15 \u7f51\u6bb5\u7684 AMD \u67b6\u6784\u6d4b\u8bd5\u673a\u955c\u50cf\u88c5\u673a\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u6307\u5b9a\u5e94\u7528\uff0c\u6307\u5b9a\u8303\u56f4\u6807\u7b7e\u7684\u7528\u4f8b\u6267\u884c\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u72b6\u6001\u68c0\u67e5\uff0c\u662f\u5426\u6709\u6b63\u5728\u8fd0\u884c\u7684\u6d4b\u8bd5\uff1b \u652f\u6301\u914d\u7f6e\u7528\u4f8b\u6267\u884c\u65f6\u957f\uff0c\u9632\u6b62\u4efb\u52a1\u963b\u585e\uff1b \u652f\u6301\u6839\u636e\u5e94\u7528\u7248\u672c\u81ea\u52a8\u67e5\u627e\u5bf9\u5e94\u7684\u7528\u4f8b tag\uff1b \u652f\u6301\u5f02\u5e38\u5904\u7406\u548c\u6d4b\u8bd5\u5b8c\u6210\u7684\u5b9e\u65f6\u6d88\u606f\u901a\u77e5\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2job","title":"2\u3001Job \u4ecb\u7ecd","text":"\u4ee5\u4e0b\u6309\u6267\u884c\u6d41\u7a0b\u7684\u987a\u5e8f\u4ecb\u7ecd\uff0c\u6bcf\u4e00\u6b65\u90fd\u53ef\u4ee5\u5355\u72ec\u6267\u884c\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1_1","title":"1\u3001\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/AT_test/ \u6574\u4e2a\u6d41\u7a0b\u7684\u4e3b\u5165\u53e3\uff0c\u901a\u8fc7\u8fd9\u4e2a\u5165\u53e3\uff0c\u8fde\u540c\u6574\u4e2a\u6d4b\u8bd5\u6d41\u7a0b\uff0c\u955c\u50cf\u88c5\u673a\uff0c\u73af\u5883\u90e8\u7f72\uff0c\u6d4b\u8bd5\u5e94\u7528\u53ca\u751f\u6210\u62a5\u544a\u3002 \u53c2\u6570\u4ecb\u7ecd\uff1a \u6d4b\u8bd5\u673a\uff1a\u6240\u6709\u89c4\u6574\u5230\u56fa\u5b9a\u533a\u57df\u7684\u6d4b\u8bd5\u673a\uff0c\u901a\u8fc7\u6d4b\u8bd5\u540c\u5b66\u5bf9\u6d4b\u8bd5\u673a\u7684\u4e60\u60ef\u547d\u540d\uff0c\u5728\u540e\u53f0\u6620\u5c04\u6d4b\u8bd5\u673a\u7684\u8be6\u7ec6\u4fe1\u606f\uff0c\u62ec\u53f7\u4e2d\u4e3a\u6d4b\u8bd5\u673a IP \u7684\u6700\u540e\u4e00\u4f4d\uff1b \u6d4b\u8bd5\u5e94\u7528\uff1a\u6307\u5b9a\u7684\u6d4b\u8bd5\u5e94\u7528\u7684\u5305\u540d\uff0c\u7cfb\u7edf\u6839\u636e\u540d\u79f0\u81ea\u52a8\u62c9\u53d6\u5bf9\u5e94\u7684\u4ed3\u5e93\u4ee3\u7801\uff1b deb\u5305\u4e0b\u8f7d\u5730\u5740\uff1a\u6d4b\u8bd5\u4e0a\u8ff0\u5e94\u7528\u65f6\uff0c\u9700\u8981\u5b89\u88c5\u7684deb\u5305\u4e0b\u8f7d\u5730\u5740\uff0c\u591a\u4e2a\u5730\u5740\u7528\u201c,\u201d\u9694\u5f00\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff1b \u8303\u56f4\u6807\u7b7e\uff1a\u6267\u884c\u6d4b\u8bd5\u7528\u4f8b\u7684\u6807\u7b7e\u8303\u56f4\uff0c\u5bf9\u5e94\u7528\u4f8b\u4ee3\u7801 csv \u6587\u4ef6\u4e2d\u7684\u6807\u7b7e\u4fe1\u606f\uff0c\u4ee5 pytest \u7684mark\u8bed\u6cd5\u7f16\u5199\uff1b \u7cfb\u7edf\u8bed\u8a00\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u8bed\u8a00\u73af\u5883\uff1b \u5206\u8fa8\u7387\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u5206\u8fa8\u7387\u73af\u5883\uff1b \u955c\u50cf\u5730\u5740\uff1a\u955c\u50cf\u4ed3\u5e93\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u901a\u8fc7 PXE \u88c5\u673a\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u88c5\u673a\u73af\u8282\uff08\u76ee\u524d\u4ec5\u652f\u6301\u90e8\u5206 AMD \u67b6\u6784\u7684\u88c5\u673a\uff09\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2pxe","title":"2\u3001PXE \u88c5\u673a","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/IOS_install/ \u8f93\u5165\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\uff0cIP\uff0c\u5bc6\u7801\uff0c\u955c\u50cf\u5730\u5740\u540e\uff0c\u81ea\u52a8\u88c5\u673a\uff0c\u76ee\u524d\u4ec5\u652f\u6301\u56fa\u5b9a 15 \u7f51\u6bb5\u7684\u90e8\u5206 AMD \u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#3","title":"3\u3001\u6b21\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/all_client_test/ \u8be5\u5165\u53e3\u4e0e\u4e3b\u5165\u53e3\u529f\u80fd\u57fa\u672c\u4e00\u81f4\uff0c\u53ea\u662f\u5265\u79bb\u4e86PXE\u88c5\u673a\u6d41\u7a0b\uff0c\u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7684\u6267\u884c\u6d41\u7a0b\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#4","title":"4\u3001\u73af\u5883\u90e8\u7f72","text":"Jenkins url\uff1ahttps://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/env/build?delay=0sec \u8bbe\u7f6e\u6d4b\u8bd5\u673a\u7684\u7cfb\u7edf\u8bed\u8a00\uff0c\u5206\u8fa8\u7387\u53ca\u5b89\u88c5\u6d4b\u8bd5\u6240\u9700\u7684\u4f9d\u8d56\u5305\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#5","title":"5\u3001\u53d1\u9001\u4ee3\u7801","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/send_code/ \u6839\u636e\u6d4b\u8bd5\u5e94\u7528\u540d\u79f0\uff0c\u62c9\u53d6\u5bf9\u5e94\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u5e76\u6839\u636e\u6d4b\u8bd5\u673a\u4e0a\u5e94\u7528\u7248\u672c\u5207\u6362\u5230\u5bf9\u5e94\u7684tag\u7248\u672c\uff0c\u82e5\u672a\u627e\u5230tag\u7248\u672c\uff0c\u5219\u4f7f\u7528\u6700\u65b0\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u518d\u6839\u636e\u5e94\u7528\u5e93\u4ee3\u7801\u4e2d\u914d\u7f6e\u7684\u57fa\u7840\u5e93\u7248\u672c\uff0c\u62c9\u53d6\u57fa\u7840\u5e93\u4ee3\u7801\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#6","title":"6\u3001\u7528\u4f8b\u6267\u884c","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/run_test/ \u8fd0\u884c\u6d4b\u8bd5\u673a\u4e0a\u7684\u7528\u4f8b"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/","title":"AT \u7528\u4f8b\u7b5b\u9009\u6307\u5317","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u7528\u4f8b\u7b5b\u9009\u6807\u51c6\uff0c\u662f\u6311\u9009\u5408\u9002\u7684\u6587\u672c\u7528\u4f8b\u8fdb\u884c\u81ea\u52a8\u5316\u7528\u4f8b\u8f6c\u5316\u7684\u4e00\u4e9b\u901a\u7528\u6807\u51c6\u3002 \u8fc7\u53bb\u6211\u4eec\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u5b9e\u8df5\u8fc7\u7a0b\u4e2d\uff0c\u5199\u4e86\u4e0d\u5c11\u81ea\u52a8\u5316\u7528\u4f8b\uff0c\u968f\u7740\u9700\u6c42\u7684\u8fed\u4ee3\uff0c\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u81ea\u7136\u8150\u5316\uff0c\u56e0\u800c\u9700\u8981\u5728\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\u5bf9\u81ea\u52a8\u5316\u7528\u4f8b\u8fdb\u884c\u7ef4\u62a4\uff0c\u5728\u7ef4\u62a4\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u6211\u4eec\u53d1\u73b0\uff0c\u6709\u4e9b\u7528\u4f8b\u7ef4\u62a4\u8d77\u6765\u592a\u96be\u4e86\uff0c\u8c03\u8bd5\u7528\u4f8b\u8017\u8d39\u5927\u91cf\u65f6\u95f4\uff0c\u6210\u672c\u5f88\u9ad8\u3002 \u56e0\u6b64\uff0c\u6211\u4eec\u603b\u7ed3\u4e00\u4e9b\u81ea\u52a8\u5316\u7528\u4f8b\u9009\u578b\u7684\u6807\u51c6\uff0c\u4ee5\u4f18\u5316\u540e\u7eed\u81ea\u52a8\u5316\u7528\u4f8b\u7ed3\u6784\uff0c\u671f\u5f85\u6211\u4eec\u80fd\u7f16\u5199\u51fa\u9ad8\u6548\u3001\u7a33\u5b9a\u3001\u6613\u4e8e\u7ef4\u62a4\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_1","title":"\u4e00\u3001\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u53ef\u4ee5\u5206\u4e3a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u548c\u4e13\u9879\u81ea\u52a8\u5316\u6d4b\u8bd5\uff0c\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e00\u822c\u53ea\u9488\u5bf9\u4e00\u4e9b\u5e38\u89c4\u7684\u529f\u80fd\u6d4b\u8bd5\uff0c\u5176\u4ed6\u975e\u5e38\u89c4\u529f\u80fd\u7684\u7528\u4f8b\uff0c\u5e94\u8be5\u91c7\u7528\u4e13\u9879\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u6848\uff1b \u4ee5\u4e0b\u662f\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1","title":"1. \u7a33\u5b9a\u6027\u3001\u538b\u6d4b\u7528\u4f8b","text":"\u7a33\u5b9a\u6027\u6d4b\u8bd5\u3001\u538b\u6d4b\u7528\u4f8b\u5e94\u8be5\u662f\u5c5e\u4e8e\u6027\u80fd\u76f8\u5173\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u5982\uff1a\u53cd\u590d\u591a\u6b21\u70b9\u51fb\u6309\u94ae\uff0c\u68c0\u9a8c\u5176\u529f\u80fd\u7a33\u5b9a\u6027\u3002\u56e0\u4e3a\u8fd9\u4e9b\u7528\u4f8b\u65ad\u8a00\u7684\u9884\u671f\u53ef\u80fd\u4e0d\u662f\u5f88\u660e\u786e\uff0c\u66f4\u6709\u751a\u8005\u4e0d\u9700\u8981\u65ad\u8a00\uff0c\u7528\u4f8b\u65f6\u957f\u6bd4\u8f83\u957f\uff0c\u800c\u4e14\u4e0d\u53ef\u63a7\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u76ee\u524d\u6211\u4eec\u6709\u6027\u80fd\u81ea\u52a8\u5316\u7684\u4e13\u9879\u65b9\u6848\uff0c\u4ee5\u53ca\u4e00\u4e9b\u7a33\u5b9a\u6027\u6d4b\u8bd5\u7684\u4e13\u9879\u65b9\u6848\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u6b64\u7c7b\u7528\u4f8b\u653e\u5230\u4e13\u9879\u81ea\u52a8\u5316\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2","title":"2. \u6d89\u53ca\u591a\u4e2a\u7528\u6237\u64cd\u4f5c","text":"\u5e38\u89c1\u4e0e\u6587\u7ba1\u7684\u7528\u4f8b\u4e2d\uff0c\u591a\u7528\u6237\u64cd\u4f5c\u7684\u7528\u4f8b\u4e00\u822c\u90fd\u4f1a\u6d89\u53ca\u5230\u5728\u7cfb\u7edf\u4e2d\u8fdb\u884c\u591a\u4e2a\u7528\u6237\u95f4\u7684\u5207\u6362\uff0c\u81ea\u52a8\u5316\u811a\u672c\u4e00\u822c\u662f\u8fd0\u884c\u5728\u4e00\u4e2a\u7528\u6237\u7a7a\u95f4\u4e0b\u7684\uff0c\u6240\u4ee5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u591a\u7528\u6237\u95f4\u7684\u5207\u6362\u3002 \u6b64\u7c7b\u4e0d\u5efa\u8bae\u91c7\u7528\u81ea\u52a8\u5316\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3","title":"3. \u4e0e\u5f00\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4ea4\u4e92","text":"\u6b64\u7c7b\u573a\u666f\u591a\u4e3a\u5e94\u7528\u7684\u5f02\u5e38\u573a\u666f\u6d4b\u8bd5\uff0c\u6bd4\u5982\uff1a\u590d\u5236\u5927\u6587\u4ef6\u8fc7\u7a0b\u4e2d\u6ce8\u9500\u673a\u5668\u3002 \u81ea\u52a8\u5316\u811a\u672c\u5728\u7cfb\u7edf\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4e4b\u540e\u662f\u4f1a\u505c\u6b62\u8fd0\u884c\u7684\uff1b\u6b64\u7c7b\u7528\u4f8b\u53ef\u4ee5\u505a\u81ea\u52a8\u5316\uff0c\u4f46\u662f\u540c\u6837\u9700\u8981\u505a\u4e13\u9879\u65b9\u6848\uff0c\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u7684\u5904\u7406\u903b\u8f91\u5b8c\u5168\u4e0d\u540c\u3002 \u540e\u7eed\u81ea\u52a8\u5316\u9700\u8981\u516c\u5173\u7684\u70b9\uff1a \u81ea\u52a8\u5316\u811a\u672c\u5728\u672c\u673a\u8fd0\u884c\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u81f3\u5c11\u9700\u8981\u63d0\u4f9b\u4ee5\u4e0b\u529f\u80fd\uff1a \u91cd\u542f\u4e4b\u540e\u7528\u4f8b\u80fd\u81ea\u52a8\u8fd0\u884c\uff1b\u53ef\u4ee5\u8003\u8651\u5c06\u6267\u884c\u7528\u4f8b\u5199\u6210\u4e00\u4e2a\u5f00\u673a\u81ea\u542f\u7684\u670d\u52a1\uff1b \u80fd\u8bb0\u5f55\u5173\u673a\u4e4b\u524d\u7528\u4f8b\u6267\u884c\u7684\u4f4d\u7f6e\uff0c\u91cd\u542f\u4e4b\u540e\u80fd\u4ece\u6b64\u4f4d\u7f6e\u5f00\u59cb\u6267\u884c\uff1b \u50cf\u6027\u80fd\u81ea\u52a8\u5316\u4e00\u6837\uff0c\u7531\u670d\u52a1\u7aef\u63a7\u5236\uff1b \u5b8c\u5168\u57fa\u4e8e\u56fe\u5f62\u8bc6\u522b\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u4e32\u53e3\u7ebf\u63a7\u5236\u952e\u9f20\u7a33\u5b9a\u6027\uff1b "},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4","title":"4. \u6d4b\u8bd5\u6267\u884c\u65f6\u95f4\u957f","text":"\u7528\u4f8b\u6267\u884c\u65f6\u95f4\u63a7\u5236\u57282\u5206\u949f\u4ee5\u5185\uff0c\u6781\u7aef\u60c5\u51b5\u4e0d\u8981\u8d85\u8fc75\u5206\u949f\uff0c\u6240\u6709\u7528\u4f8b\u7684\u5e73\u5747\u65f6\u957f\u5e94\u8be5\u57281\u5206\u949f\u5de6\u53f3\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u95f4\u592a\u957f\uff0c\u7f16\u5199\u7528\u4f8b\u3001\u8c03\u8bd5\u7528\u4f8b\u3001\u6267\u884c\u7528\u4f8b\u3001\u7ef4\u62a4\u7528\u4f8b\u90fd\u975e\u5e38\u7684\u8017\u65f6\uff0c\u4eba\u529b\u6210\u672c\u65f6\u95f4\u6210\u672c\u6295\u5165\u592a\u9ad8\u3002 \u4f60\u60f3\uff0c\u8fd9\u6761\u7528\u4f8b\u6267\u884c\u9700\u89815\u5206\u949f\uff0c\u90a3\u4f60\u5199\u8fd9\u6761\u7528\u4f8b\u7684\u65f6\u95f4\u4e0d\u53ef\u80fd\u4e00\u904d\u8fc7\uff0c\u5199\u7684\u8fc7\u7a0b\u4e2d\u8dd1\u4e0d\u901a\u8fd8\u5f97\u91cd\u8dd1\u81f3\u5c1115\u5206\u949f\u4e0d\u8fc7\u5206\uff0c\u5199\u5b8c\u4e86\u8fd8\u5f97\u5728\u5176\u4ed6\u67b6\u6784\u4e0a\u8c03\u8bd5\uff0c\u534a\u4e2a\u5c0f\u65f6\u8fc7\u53bb\u4e86\uff0c\u8fd9\u8fd8\u53ea\u662f\u7b2c\u4e00\u6b21\u5199\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u540e\u7eed\u5982\u679c\u7528\u4f8b\u7ef4\u62a4\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u7ecf\u5e38\u6295\u5165\u76f8\u5f53\u957f\u65f6\u95f4\uff0c\u8fd9\u6837\u5176\u5b9e\u662f\u5931\u53bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u7684\u3002\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u5c31\u5e94\u8be5\u662f\u5feb\u51c6\u72e0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5","title":"5. \u8fb9\u7f18\u6027\u6d4b\u8bd5","text":"\u6709\u4e9b\u529f\u80fd\u6a21\u5757\u672c\u8eab\u662f\u5c5e\u4e8e\u6bd4\u8f83\u8fb9\u7f18\u6027\u7684\uff0c\u5373\u6781\u5c11\u7528\u6237\u4f1a\u4f7f\u7528\u5230\u7684\u529f\u80fd\uff0c\u8fd9\u7c7b\u529f\u80fd\u6a21\u5757\u4e0d\u9700\u8981\u5927\u89c4\u6a21\u5b9e\u73b0\u81ea\u52a8\u5316\uff0c\u4e00\u4e24\u4e2a\u573a\u666f\u8986\u76d6\u57fa\u672c\u529f\u80fd\u5c31\u884c\u4e86\uff0c\u56e0\u6b64\u6211\u4eec\u5728\u6311\u9009\u6b64\u7c7b\u7528\u4f8b\u7684\u65f6\u5019\u53ef\u4ee5\u7ed3\u5408\u6574\u4e2a\u529f\u80fd\u6a21\u5757\u7684\u8986\u76d6\u60c5\u51b5\u6765\u51b3\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6","title":"6. \u9700\u8981\u4f9d\u8d56\u4eba\u5de5\u4ecb\u5165\u7684","text":"\u81ea\u52a8\u5316\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\u662f\u6ca1\u6709\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bd4\u5982\u8981\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u90a3\u4e48\u5c31\u80cc\u79bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u3002 \u6bd4\u5982\u5149\u9a71\u6a21\u5757\uff0c\u5149\u9a71\u523b\u5f55\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u4f46\u662f\u5149\u9a71\u523b\u5f55\u4e4b\u540e\u5149\u76d8\u4f1a\u5f39\u51fa\u6765\uff0c\u9700\u8981\u4eba\u5de5\u66f4\u6362\u5149\u76d8\uff0c\u518d\u624b\u52a8\u63a8\u8fdb\u5149\u9a71\u4e2d\u3002 \u8fd9\u79cd\u529f\u80fd\u6a21\u5757\u5373\u4f7f\u505a\u81ea\u52a8\u5316\uff0c\u80fd\u6d89\u53ca\u5230\u7684\u529f\u80fd\u975e\u5e38\u6709\u9650\uff0c\u800c\u4e14\u4e0d\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u6240\u4ee5\u660e\u663e\u5c31\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7","title":"7. \u96be\u4ee5\u5b9e\u73b0\u7684","text":"\u7528\u4f8b\u6240\u6d89\u53ca\u5230\u7684\u65b9\u6cd5\u5b9e\u73b0\u8d77\u6765\u53ef\u80fd\u6709\u96be\u5ea6\uff0c\u751a\u81f3\u73b0\u9636\u6bb5\u65e0\u6cd5\u5b9e\u73b0\u7684\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002 \u6bd4\u5982\u5f71\u9662\u6d4b\u8bd5\u753b\u9762\u6e05\u6670\u5ea6\u3001\u6d41\u7545\u5ea6\u3001\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u4e4b\u540e\u7684\u89c6\u9891\u662f\u5426\u5b58\u5728\u5361\u987f\u7b49\u7528\u4f8b\uff0c\u73b0\u9636\u6bb5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#8","title":"8. \u529f\u80fd\u4e0d\u7a33\u5b9a","text":"\u8fd9\u4e2a\u4e0d\u662f\u8bf4\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\uff0c\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\u4e0d\u7a33\u5b9a\u662f\u6b63\u5e38\u7684\uff0c\u8fd9\u79cd\u6211\u4eec\u53ef\u4ee5\u7b49\u5f00\u53d1\u63d0\u6d4b\u4e4b\u540e\u518d\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u3002 \u529f\u80fd\u4e0d\u7a33\u5b9a\u6307\u7684\u662f\u7528\u4f8b\u6240\u6d89\u53ca\u7684\u529f\u80fd\uff0c\u53ef\u80fd\u5b58\u5728\u591a\u79cd\u53d8\u5316\uff0c\u6bcf\u6b21\u6267\u884c\u7528\u4f8b\u53ef\u80fd\u65ad\u8a00\u7684\u9884\u671f\u90fd\u4e0d\u540c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#9","title":"9. \u52a8\u6001\u65ad\u8a00","text":"\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u76f4\u5230\u7528\u4f8b\u7ed3\u675f\uff0c\u4e00\u76f4\u662f\u4e00\u4e2a\u52a8\u6001\u53d8\u5316\u7684\u8fc7\u7a0b\uff0c\u800c\u4e14\u65e0\u6cd5\u901a\u8fc7\u5176\u4ed6\u624b\u6bb5\u505c\u4e0b\u6765\uff1b \u6bd4\u5982\uff1a\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u65f6\uff0c\u53f3\u4e0b\u89d2\u7684\u5f55\u5236\u65f6\u95f4\u662f\u4e00\u76f4\u5728\u53d8\u5316\u7684\uff0c\u7528\u4f8b\u9700\u8981\u6d4b\u8bd5\u5f55\u52361\u5206\u949f\u4e4b\u540e\uff0c\u5f55\u5236\u65f6\u95f4\u662f\u521a\u597d\u505c\u572860\u79d2\uff1b \u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fd8\u505a\u4e0d\u5230\u65f6\u95f4\u7cbe\u51c6\u63a7\u5236\uff0c\u7a0b\u5e8f\u6267\u884c\u65f6\u95f4\u662f\u6709\u6ce2\u52a8\u7684\uff0c\u800c\u4e14\u8981\u9002\u914d\u591a\u4e2a\u5e73\u53f0\uff0c\u6240\u4ee5\u6b64\u7c7b\u7528\u4f8b\u5927\u6982\u7387\u4f1a\u6267\u884c\u5931\u8d25\u3002\u7279\u522b\u662f\u5728\u6027\u80fd\u8f83\u5dee\u7684\u56fd\u4ea7\u5316\u67b6\u6784\u4e0a\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u592a\u53ef\u80fd\u7a33\u5b9a\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#10","title":"10. \u63a2\u7d22\u6027\u6d4b\u8bd5","text":"\u63a2\u7d22\u6027\u6d4b\u8bd5\u901a\u5e38\u662f\u4e00\u4e9b\u4e0d\u786e\u5b9a\u7684\u64cd\u4f5c\uff0c\u591a\u53d8\u5207\u590d\u6742\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u9884\u671f\u4e5f\u53ef\u80fd\u662f\u4e0d\u786e\u5b9a\u7684\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u9a9a\u64cd\u4f5c\u592a\u591a\u4e86\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6b64\u7c7b\u7528\u4f8b\u9002\u5408\u91c7\u7528\u624b\u5de5\u6d4b\u8bd5\uff0c\u662f\u624b\u5de5\u6d4b\u8bd5\u771f\u6b63\u7684\u4ef7\u503c\u4f53\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#11","title":"11. \u6613\u7528\u6027\u6d4b\u8bd5","text":"\u5bf9\u4e8e\u6613\u7528\u6027\u7684\u5224\u65ad\u901a\u5e38\u662f\u4e3b\u89c2\u7684\uff0c\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\u5f88\u96be\u53bb\u5b9a\u4e49\u4ec0\u4e48\u6837\u7684\u60c5\u51b5\u5bf9\u7528\u6237\u662f\u6613\u7528\u7684\uff0c\u81ea\u52a8\u5316\u9700\u8981\u6709\u660e\u786e\u7684\u53ef\u5b9e\u73b0\u7684\u9884\u671f\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_2","title":"\u4e8c\u3001\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u524d\u9762\u8bb2\u4e86\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u4e00\u4e9b\u7528\u4f8b\u60c5\u51b5\uff0c\u6709\u540c\u5b66\u5c31\u8bf4\u4e86\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\u4e0d\u7528\u8bb2\u4e86\uff0c\u5c31\u662f\u4e0d\u9002\u5408\u7684\u53cd\u9762\u3002\u6ca1\u6bdb\u75c5\u54c8\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\uff0c\u6211\u4eec\u5927\u4f53\u8fd8\u53ef\u4ee5\u5206\u4e3a\u4e24\u7c7b\uff1a \u7b2c\u4e00\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u597d\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u7b2c\u4e8c\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u4e00\u822c\uff0c\u9700\u8981\u6295\u5165\u66f4\u591a\u7cbe\u529b\u624d\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u4ee5\u4e0b\u4ecb\u7ecd\u4e00\u4e9b\u6211\u4eec\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1_1","title":"1. \u64cd\u4f5c\u76f8\u5bf9\u7b80\u5355","text":"\u7528\u4f8b\u6b65\u9aa4\u76f8\u5bf9\u8f83\u5c11\uff0c\u8fd9\u79cd\u7528\u4f8b\u901a\u5e38\u662f\u4e00\u4e9b\u8def\u5f84\u5f88\u6d45\u7684\u7528\u4f8b\uff0c\u4e00\u822c\u4e5f\u662f\u4e00\u4e9b\u57fa\u7840\u7528\u4f8b\u3002\u7528\u4f8b\u7f16\u5199\u3001\u7ef4\u62a4\u90fd\u53ef\u4ee5\u8f7b\u677e\u641e\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2_1","title":"2. \u5bb9\u6613\u5b9e\u73b0","text":"\u73b0\u6709\u6280\u672f\u662f\u53ef\u5b9e\u73b0\u7684\uff0c\u6ca1\u6709\u96be\u5ea6\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3_1","title":"3. \u7ecf\u5e38\u7528\u4e8e\u56de\u5f52\u6d4b\u8bd5","text":"\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bcf\u6b21\u56de\u5f52\u6d4b\u8bd5\u5fc5\u987b\u8981\u6267\u884c\u7684\u7528\u4f8b\uff0c\u90a3\u4e48\u8fd9\u6761\u7528\u4f8b\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u3002 \u56de\u5f52\u6d4b\u8bd5\u65f6\u6211\u4eec\u9996\u5148\u5e94\u8be5\u4fdd\u8bc1\u5e94\u7528\u5386\u53f2\u57fa\u672c\u529f\u80fd\u6b63\u5e38\uff0c\u6240\u4ee5\u90a3\u4e9b\u6bcf\u6b21\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u90fd\u8981\u6267\u884c\u7684\u7528\u4f8b\u9002\u5408\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4_1","title":"4. \u529f\u80fd\u7a33\u5b9a\u7684\u6838\u5fc3\u529f\u80fd","text":"\u6d89\u53ca\u6838\u5fc3\u529f\u80fd\u7684\u7528\u4f8b\u662f\u6700\u6700\u91cd\u8981\u7684\u7528\u4f8b\uff0c\u4e5f\u662f\u6211\u4eec\u4ea4\u4ed8\u65f6\u5fc5\u987b\u8981\u4fdd\u8bc1\u8d28\u91cf\u7684\u76f8\u5173\u529f\u80fd\uff0c\u56e0\u6b64\u5e94\u8be5\u5c3d\u53ef\u80fd\u7684\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5_1","title":"5. \u8f93\u5165\u6570\u636e\u6d4b\u8bd5","text":"\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u901a\u5e38\u662f\u68c0\u9a8c\u88ab\u6d4b\u5e94\u7528\u63a5\u53d7\u6709\u6548\u6570\u636e\u3001\u62d2\u7edd\u65e0\u6548\u6570\u636e\u7684\u80fd\u529b\u3002\u5982\uff1a\u63d0\u4ea4\u8d85\u957f\u5b57\u7b26\u4e32\u3001\u7279\u6b8a\u5b57\u7b26\u4e32\u7b49\u7b49\u3002 \u6b64\u7c7b\u7528\u4f8b\u624b\u5de5\u6d4b\u8bd5\u5f88\u96be\u6bd4\u8f83\u5168\u9762\u7684\u8986\u76d6\u5230\u6240\u6709\u7684\u8f93\u5165\u60c5\u51b5\uff0c\u4f46\u662f\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\uff0c\u6b64\u7c7b\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u90fd\u662f\u4e00\u6837\u7684\uff0c\u53d8\u5316\u7684\u4ec5\u662f\u8f93\u5165\u53c2\u6570\u548c\u65ad\u8a00\u7ed3\u679c\uff0c\u91c7\u7528\u6570\u636e\u9a71\u52a8\uff0c\u53ef\u4ee5\u8f7b\u677e\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6_1","title":"6. \u683c\u5f0f\u8986\u76d6","text":"\u539f\u56e0\u540c\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u7c7b\u7528\u4f8b\u4e00\u6837\uff0c\u591a\u79cd\u683c\u5f0f\u7684\u8986\u76d6\u4e5f\u662f\u4e00\u4e2a\u5f88\u7e41\u7410\u7684\u4e8b\u60c5\uff0c\u4ea4\u7ed9\u81ea\u52a8\u5316\u6765\u505a\u518d\u5408\u9002\u4e0d\u8fc7\u4e86\u3002 \u6bd4\u5982\u5f71\u9662\u5bf9\u5f71\u7247\u683c\u5f0f\u7684\u68c0\u67e5\u3001\u622a\u56fe\u5f55\u5c4f\u5bf9\u4fdd\u5b58\u683c\u5f0f\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7_1","title":"7. \u68c0\u67e5\u5143\u7d20\u72b6\u6001","text":"\u67e5\u770b\u88ab\u6d4b\u5e94\u7528\u7684\u5143\u7d20\u5c5e\u6027\u3002\u5982\uff1a\u56fe\u7247\u7684\u5927\u5c0f\u548c\u6392\u5217\uff1b\u6309\u94ae\u7684\u53ef\u7528\u548c\u4e0d\u53ef\u7528\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/","title":"AT \u7ecf\u9a8c\u603b\u7ed3","text":"\u6b22\u8fce\u6240\u6709\u4eba\u63d0\u4ea4\u4f60\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u9762\u7684\u4f18\u79c0\u5b9e\u8df5\u7ecf\u9a8c\uff0c\u4ee5\u5e2e\u52a9\u5927\u5bb6\u89e3\u51b3\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#1","title":"1\u3001\u7ec8\u7ed3\u5668","text":"# litaoa@uniontech.com\n \u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4 pytest \u5b9e\u73b0\u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4\u7684\u65b9\u5f0f\u6709\u4e24\u79cd\uff0cyield \u548c\u7ec8\u7ed3\u51fd\u6570\uff1b yield \u5b9e\u73b0\uff0cyield\u524d\u9762\u4e3a\u7528\u4f8b\u7684\u524d\u7f6e\u6b65\u9aa4\uff0cyield \u540e\u9762\u4e3a\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4\u3002 @pytest.fixture\ndef clean_env():\nprint(\"setup\")\nyield\nprint(\"teardown\")\n \u7ec8\u7ed3\u51fd\u6570\u5b9e\u73b0\uff0c\u4f7f\u7528 request.addfinalizer \u6ce8\u518c\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4 @pytest.fixture\ndef clean_env(request):\ndef clean():\nprint(\"teardown\")\nrequest.addfinalizer(clean)\nprint(\"setup\")\n yield\u7684\u4f18\u7f3a\u70b9\uff1a \u4f18\u70b9\uff1a\u4ee3\u7801\u7b80\u6d01\uff0c\u76f4\u89c2\uff0c\u53ef\u4f7f\u7528yield\u5728\u7528\u4f8b\u4e2d\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c \u7f3a\u70b9\uff1a\u82e5\u524d\u7f6e\u6b65\u9aa4\u4e2d\u51fa\u73b0\u9519\u8bef\uff0c\u5219\u540e\u7f6e\u6b65\u9aa4\u4e0d\u4f1a\u6267\u884c \u7ec8\u7ed3\u51fd\u6570\uff1a \u4f18\u70b9\uff1a\u524d\u7f6e\u6b65\u9aa4\u5931\u8d25\u7684\u8bdd\uff0c\u540e\u7f6e\u6b65\u9aa4\u4ecd\u4f1a\u6267\u884c\u4e14\u53ef\u4ee5\u6ce8\u518c\u591a\u4e2a\u540e\u7f6e\u6b65\u9aa4\uff08\u524d\u63d0\uff1a\u9700\u8981\u5728\u4ee3\u7801\u62a5\u9519\u4e4b\u524d\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff09\uff0c\u652f\u6301\u7075\u6d3b\u4f7f\u7528\u540e\u7f6e\u6761\u4ef6 \u7f3a\u70b9\uff1a\u4ee3\u7801\u8f83\u4e3a\u590d\u6742\uff0c\u65e0\u6cd5\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c\uff08\u672c\u4eba\u76ee\u524d\u672a\u5b9e\u73b0\uff09 \u603b\u7ed3\uff1a\u5728\u524d\u7f6e\u6b65\u9aa4\u4fdd\u8bc1\u7edd\u5bf9\u4e0d\u4f1a\u51fa\u9519\u65f6\uff0c\u4f7f\u7528yield\u66f4\u4f73\u7b80\u4fbf\uff0c\u5f53\u524d\u7f6e\u6b65\u9aa4\u6613\u51fa\u73b0\u95ee\u9898\u65f6\uff0c\u63a8\u8350\u4f7f\u7528\u7ec8\u7ed3\u51fd\u6570\u3002 \u573a\u666f\uff1a\u4fdd\u9669\u7bb1\u7528\u4f8b\uff0c\u524d\u7f6e\u6b65\u9aa4\u4e2d\u5f00\u542f\u4fdd\u9669\u7bb1\uff0c\u540e\u7f6e\u6b65\u9aa4\u5220\u9664\u4fdd\u9669\u7bb1\u3002 @pytest.fixture(scope=\"session\", autouse=True)\ndef vault_fixture(request):\nDfmWidget.reset_vault_by_cmd() # 1\u3001\u91cd\u7f6e\u4fdd\u9669\u7bb1\nDdeDockPublicWidget().close_file_manager_by_cmd() # 2\u3001\u5173\u95ed\u6587\u7ba1\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 3\u3001\u5f00\u542f\u6587\u7ba1\nvault = DfmWidget()\nvault.create_file_vault() # 4\u3001\u521b\u5efa\u4fdd\u9669\u7bb1\ndef delete_vault(): # 8\u3001\u5220\u9664\u4fdd\u9669\u7bb1\u7684\u540e\u7f6e\u6b65\u9aa4\nsleep(2)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr()\nvault = DfmWidget()\nvault.delete_file_vault()\nDfmWidget.reset_vault_by_cmd()\nDdeDockPublicWidget().close_file_manager_by_cmd()\nrequest.addfinalizer(delete_vault) # 5\u3001\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\nDdeDockPublicWidget().close_file_manager_by_cmd() # 6\u3001\u5173\u95ed\u6587\u7ba1\nsleep(1)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 7\u3001\u5f00\u542f\u6587\u7ba1\n \u4ee3\u7801\u6309\u6ce8\u91ca\u4e2d\u7684\u5e8f\u53f7\u6267\u884c\u6b65\u9aa4 \u4ee3\u7801\u5728\u6b65\u9aa41-4\u4efb\u610f\u4f4d\u7f6e\u62a5\u9519\uff0c\u5219\u4e0d\u4f1a\u6267\u884c\u6b65\u9aa48\uff0c\u56e0\u4e3a\u672a\u6267\u884c\u5230\u6b65\u9aa45\uff0c\u6b65\u9aa48\u8fd8\u672a\u6ce8\u518c \u4ee3\u7801\u5728\u6b65\u9aa46-7\u62a5\u9519\uff0c\u4ecd\u4f1a\u6267\u884c\u6b65\u9aa47\uff0c\u56e0\u4e3a\u5728\u6b65\u9aa45\u4e2d\u5df2\u7ecf\u5c06\u6b65\u9aa47\u6ce8\u518c \u53ef\u4ee5\u7075\u6d3b\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff0c\u80fd\u5b9e\u73b0\u67d0\u4e2a\u524d\u7f6e\u6b65\u9aa4\u6267\u884c\u4e4b\u540e\uff0c\u624d\u4f1a\u6267\u884c\u540e\u7f6e\u6b65\u9aa4\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#2","title":"2\u3001\u542f\u52a8\u5e94\u7528\u7684\u65b9\u5f0f","text":"# huangmingqiang@uniontech.com\n \uff081\uff09\u547d\u4ee4\u884c\u542f\u52a8 \u5728 AT \u4ee3\u7801\u4e2d\u4f7f\u7528\u547d\u4ee4\u884c\u542f\u52a8\u5e94\u7528\uff0c\u4e3e\u4f8b\uff1a os.popen(\"deepin-music\")\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f7f\u7528 ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6\uff0cdogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u3002 \uff082\uff09\u901a\u8fc7 UI \u64cd\u4f5c\u542f\u52a8 \u901a\u8fc7\u4efb\u52a1\u680f\u3001\u542f\u52a8\u5668\u3001\u684c\u9762\u7b49UI\u65b9\u5f0f\u542f\u52a8\uff0c\u6bd4\u5982\u53cc\u51fb\u6253\u5f00\u3001\u53f3\u952e\u6253\u5f00\u7b49\uff0c\u8fd9\u79cd\u64cd\u4f5c\u65b9\u5f0f\u4e0d\u5b58\u5728ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6dogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u7684\u95ee\u9898\uff0c\u4e5f\u66f4\u52a0\u7b26\u5408\u7528\u6237\u7684\u64cd\u4f5c\u884c\u4e3a\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#3","title":"3\u3001\u6587\u4ef6\u9009\u62e9\u6846\u5c5e\u6027\u5b9a\u4f4d\u5076\u73b0\u65e0\u6cd5\u627e\u5230","text":"\u6587\u4ef6\u9009\u62e9\u6846\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5728\u8c03\u7528\u6587\u4ef6\u9009\u62e9\u6846\u65f6\uff0c\u6709\u4e00\u5b9a\u7684\u6982\u7387\u51fa\u73b0\uff0c\u754c\u9762\u5df2\u7ecf\u6e32\u67d3\u51fa\u6765\u4e86\uff0c\u4f46\u662f\u5c5e\u6027\u6811\u5e76\u6ca1\u6709\u5199\u5165\uff0c\u5bfc\u81f4\u901a\u8fc7\u5c5e\u6027\u65e0\u6cd5\u627e\u5230\u5143\u7d20\uff0c\u76ee\u524d\u4e5f\u6ca1\u6709\u5f88\u597d\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u4e3a\u4e86\u7528\u4f8b\u7a33\u5b9a\u6027\uff0c\u6587\u4ef6\u9009\u62e9\u6846\u7684\u64cd\u4f5c\u5efa\u8bae\u4f7f\u7528UI\u6216\u8005\u56fe\u7247\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u53ef\u4ee5\u901a\u8fc7\u641c\u7d22\u5185\u5bb9\u56fa\u5b9a\u6587\u4ef6\u4f4d\u7f6e\u3002 # litaoa@uniontech.com\n desk = DdeDesktopPublicWidget()\n# \u9009\u62e9\u89c6\u9891\u76ee\u5f55\ndesk.click_videos_dir_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.ctrl_f()\nsleep(1)\ndesk.input_message(\"\u5143\u7d20\u540d\u79f0\")\nsleep(0.5)\ndesk.enter()\nsleep(1)\n# \u9009\u62e9\u7b2c\u4e00\u4e2a\u6587\u4ef6\ndesk.click_list_view_btn_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.click_first_file_in_desktop_plugs_by_ui()\nsleep(1)\n# \u6587\u7ba1\u63d2\u4ef6\u4e2d\u70b9\u51fb\u6253\u5f00\ndesk.click_open_btn_in_desktop_plugs_by_ui()\n"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#4","title":"4\u3001\u5e94\u7528\u542f\u52a8","text":"# mikigo\n \u5728UI\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u4e00\u5207\u64cd\u4f5c\u7684\u90fd\u662f\u4ece\u5e94\u7528\u542f\u52a8\u5f00\u59cb\u7684\uff0c\u800c\u5728Linux\u684c\u9762\u5e94\u7528\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u6211\u4eec\u542f\u52a8\u5e94\u7528\u7684\u65b9\u6cd5\u6709\u591a\u79cd\uff0c\u4e0b\u9762\u505a\u4e00\u4e2a\u7b80\u5355\u7684\u4ecb\u7ecd\uff1a \u3010\u4f7f\u7528dogtail\u542f\u52a8\u3011 dogtail\u63d0\u4f9b\u4e86\u5e94\u7528\u542f\u52a8\u7684\u65b9\u6cd5\uff0c\u5728utils\u5e93\u4e2d\uff0c\u4f7f\u7528run\u65b9\u6cd5\u542f\u52a8\uff1a \u9996\u5148\u5bfc\u5165\u65b9\u6cd5\uff1a from dogtail.utils import *\n \u8c03\u7528run\u65b9\u6cd5 run('deepin-music')\n \u5373\u53ef\u542f\u52a8\u97f3\u4e50 \u8fd9\u79cd\u65b9\u6cd5\u7684\u4f18\u70b9\u662f\u91c7\u7528\u8fdb\u7a0b\u7684\u65b9\u5f0f\u76f4\u63a5\u542f\u52a8\uff0c\u4e0d\u4f9d\u8d56\u4e0eUI\uff0c\u65e0\u8bba\u684c\u9762\u6216\u4efb\u52a1\u680f\u4e0a\u662f\u5426\u5b58\u5728\u5e94\u7528\u56fe\u6807\uff0c\u90fd\u53ef\u4ee5\u6b63\u5e38\u542f\u52a8\u3002 \u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c \u5982\u679c\u4f7f\u7528ssh\u8fdc\u7a0b\u8c03\u7528\uff0c\u6216\u8005Jenkins\u4e2d\u6267\u884c\u6d4b\u8bd5\u811a\u672c\u7684\u65f6\u5019\uff0c\u5728sniff\u4e2d\u4f1a\u51fa\u73b0\u627e\u4e0d\u5230\u5e94\u7528\uff0c\u7ecf\u8fc7\u5206\u6790\uff0c\u53ef\u80fd\u662f\u56e0\u4e3a\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\u542f\u52a8\u7684\u65f6\u5019\uff0c\u5b9e\u9645\u662f\u91c7\u7528\u4e00\u4e2a\u5b50\u8fdb\u7a0b\u542f\u52a8\u4e86\u5e94\u7528\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u5230\u3002 \u3010\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u3011 \u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807 \u901a\u5e38\u6709\u4e24\u79cd\u65b9\u6cd5\uff1a \uff081\uff09\u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807\u3002 \uff082\uff09\u5df2\u77e5\u5e94\u7528\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u7684\u4f4d\u7f6e\uff0c\u7136\u540e\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u5bf9\u5e94\u5750\u6807\u3002 \u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u7f3a\u70b9\u662f\u4f4d\u7f6e\u5fc5\u987b\u56fa\u5b9a\uff0c\u5982\u679c\u79fb\u52a8\u4f4d\u7f6e\u5c31\u4e0d\u884c\u4e86\uff0c\u800c\u4f7f\u7528\u7b2c\u4e00\u79cd\u65b9\u6cd5\uff0c\u65e0\u8bba\u4f4d\u7f6e\u5728\u54ea\u91cc\uff0c\u53ea\u8981\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u5b58\u5728\u5373\u53ef\u3002 \u3010\u70b9\u51fb\u684c\u9762\u56fe\u6807\u542f\u52a8\u3011 \u684c\u9762\u56fe\u6807\u76ee\u524d\u662f\u91c7\u7528\u56fe\u50cf\u8bc6\u522b\u6280\u672f\uff0c\u5b9a\u4f4d\u5230\u5e94\u7528\u56fe\u6807\u7684\u5750\u6807\uff0c\u7136\u540e\u901a\u8fc7pyauogui\u8fdb\u884c\u70b9\u51fb\u64cd\u4f5c\u3002 \u8be6\u7ec6\u6280\u672f\u65b9\u6848\u53ef\u4ee5\u53c2\u8003\u6211\u7684\u53e6\u5916\u4e24\u7bc7\u535a\u5ba2: \u57fa\u4e8eopencv\u7684\u6a21\u677f\u5339\u914d\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd4\u56de\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 Python\u4e09\u65b9\u5e93PyAutoGui\u7684\u4f7f\u7528\u65b9\u6cd5 \u3010\u4ece\u542f\u52a8\u5668\u542f\u52a8\uff08\u4fd7\u79f0\u5f00\u59cb\u83dc\u5355\uff09\u3011 \u542f\u52a8\u4e2d\u542f\u52a8\u7684\u5b9e\u73b0\u903b\u8f91\u5b9e\u9645\u548c\u4efb\u52a1\u680f\u4e0a\u542f\u52a8\u5dee\u4e0d\u591a\u3002 \u9996\u5148\uff0c\u9700\u8981\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u542f\u52a8\u5668\u56fe\u6807\uff0c\u6216\u8005\u952e\u76d8super\u952e\uff0c\u5c06\u542f\u52a8\u5668\u547c\u51fa\u6765\uff0c \u7136\u540e\uff0c\u5728\u542f\u52a8\u5668\u4e2d\u70b9\u51fb\u5bf9\u5e94\u7684\u56fe\u6807\uff0c \u4f46\u662f\u8fd9\u91cc\u6709\u4e2a\u95ee\u9898\uff0c\u542f\u52a8\u5668\u4e2d\u7684\u5e94\u7528\u5217\u8868\uff0c\u4e00\u9875\u5c55\u793a\u4e0d\u5b8c\uff0c\u6240\u4ee5\u5982\u679c\u6211\u4eec\u8981\u70b9\u51fb\u7684\u5e94\u7528\u56fe\u6807\u4e0d\u5728\u7b2c\u4e00\u9875\u600e\u4e48\u529e\uff0c\u901a\u5e38\u89e3\u51b3\u65b9\u6848\u6709\u4e24\u79cd\uff1a \uff081\uff09\u9700\u8981\u8fdb\u884c\u5411\u4e0b\u6ed1\u52a8\uff0c\u8fd9\u91cc\u5c31\u6d89\u53ca\u5230\u76f8\u5e94\u7684\u8bc6\u522b\u65b9\u6848\uff0c\u5224\u65ad\u5982\u679c\u4e0d\u5728\u7b2c\u4e00\u9875\u5c31\u5f80\u4e0b\u6ed1\u52a8\u7ffb\u9875\u3002 \uff082\uff09\u542f\u52a8\u5668\u63d0\u4f9b\u641c\u7d22\u7684\u529f\u80fd\uff0c\u8f93\u5165\u5e94\u7528\u540d\u79f0\u641c\u7d22\uff0c\u7136\u540e\u8fdb\u884c\u70b9\u51fb\u3002 \u4ece\u5b9e\u9645\u64cd\u4f5c\u4e2d\u6765\u770b\uff0c\u91c7\u7528\u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u6548\u7387\u4f1a\u9ad8\u4e00\u70b9\u3002 \u3010\u7ec8\u7aef\u547d\u4ee4\u542f\u52a8\u3011 \u5728python\u4e2d\uff0c\u4f7f\u7528os.popen()\u6216os.system()\u6216\u8005subprocess.Popen()\uff0c\u5b9e\u73b0\u547d\u4ee4\u884c\u542f\u52a8\uff0c\u6bd4\u5982\uff1a import os\nos.popen('deepin-music')\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u8fdc\u7a0b\u6267\u884c\u811a\u672c\u7684\u65f6\u5019\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u7684\u95ee\u9898\u3002 \u3010\u603b\u7ed3\u3011 \u4ee5\u4e0a\u51e0\u79cd\u65b9\u6cd5\uff0c\u5404\u6709\u4f18\u7f3a\u70b9\uff0c\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff1a \uff081\uff09\u5982\u679c\u9700\u8981\u5728Jenkins\u4e2d\u505a\u6301\u7eed\u96c6\u6210\uff0c\u5efa\u8bae\u4f7f\u7528\u7b2c\u4e8c\u79cd\u4efb\u52a1\u680f\u542f\u52a8\u7684\u65b9\u6cd5\u3002 \uff082\uff09\u5982\u679c\u4e0d\u4f1a\u91c7\u7528\u8fdc\u7a0b\u6267\u884c\u7684\uff0c\u5efa\u8bae\u91c7\u7528\u7b2c\u4e00\u79cd\u6216\u8005\u6700\u540e\u4e00\u79cd\u65b9\u6848\u3002 \uff083\uff09\u7b2c\u4e09\u79cd\u548c\u7b2c\u56db\u79cd\u542f\u52a8\u65b9\u6cd5\uff0c\u901a\u5e38\u5728\u6d4b\u8bd5\u7528\u4f8b\u4e2d\u4f1a\u6d89\u53ca\u5230\uff0c\u6240\u4ee5\u5076\u5c14\u4f1a\u7528\u3002"},{"location":"RELEASE/","title":"\u7248\u672c\u66f4\u65b0\u8bb0\u5f55","text":""},{"location":"RELEASE/#220202395","title":"2.2.0\uff082023/9/5\uff09","text":"new \u6b63\u5f0f\u542f\u7528 letmego \u6280\u672f\u65b9\u6848\uff1b fix \u5bf9 docs \u91cc\u9762\u7ec6\u5316\u4e86\u8fdc\u7a0b\u6267\u884c\u7ae0\u8282\u7684\u63cf\u8ff0\uff1b "},{"location":"RELEASE/#2152023831","title":"2.1.5\uff082023/8/31\uff09","text":"new \u5c06\u6709\u8da3\u7684\u6587\u6863\u7cfb\u7edf\u8fc1\u79fb\u5230 linuxdeepin \uff0c\u5265\u79bb\u6587\u6863\u4e2d\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u91c7\u7528 CDN \u52a0\u901f\u65b9\u5f0f\u52a0\u8f7d\uff1b \u5c1d\u8bd5\u5408\u5165\u4e00\u4e2a\u6709\u8da3\u7684\u529f\u80fd\uff1b fix \u4fee\u590d\u4e86 Wayland \u952e\u9f20\u5de5\u5177\u6ca1\u6709\u9f20\u6807\u76f8\u5bf9\u79fb\u52a8\u65b9\u6cd5 moveRel \u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 Wayland \u4e0b\u83b7\u53d6\u7a97\u53e3\u4fe1\u606f\u529f\u80fd\u6a21\u5757\u4e2d\u73af\u5883\u53d8\u91cf\u7684\u95ee\u9898\uff1b \u4f18\u5316\u4e86 startproject \u529f\u80fd\u7684\u4e00\u4e9b\u4fe1\u606f\u8f93\u51fa\uff1b \u4fee\u590d\u4e86\u7279\u6b8a\u573a\u666f\u4e0b env_dev.sh \u5f00\u53d1\u73af\u5883\u90e8\u7f72\u662f\u53ef\u80fd\u5f71\u54cd\u5230\u6b63\u5f0f\u73af\u5883 env.sh \u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#2122023822","title":"2.1.2\uff082023/8/22\uff09","text":"new \u589e\u52a0 OCR \u8bc6\u522b\u81ea\u52a8\u91cd\u8bd5\u673a\u5236\uff0c\u9ed8\u8ba4\u91cd\u8bd5 2 \u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u91cd\u8bd5\u6b21\u6570\uff1b \u4f7f\u7528\u7a97\u7ba1\u6700\u65b0\u63d0\u4f9b\u7684\u4e8c\u8fdb\u5236\u63a5\u53e3\uff0c\u4f18\u5316\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u5728 Wayland \u4e0b\u83b7\u53d6\u7a97\u53e3\u4fe1\u606f\u7684\u65b9\u6cd5\uff1b\u611f\u8c22\u684c\u9762\u6d4b\u8bd5\u90e8 @\u4f55\u6743 @\u5b59\u7fe0 \u3001\u7a97\u7ba1\u7814\u53d1 @\u9ec4\u6cfd\u94ed \u7684\u5927\u529b\u652f\u6301\u3002 \u6269\u5145 skipif \u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\u51fd\u6570\uff1a skipif_xdg_type \u652f\u6301 x11 \u6216 wayland \u4e0a\u8df3\u8fc7\uff1b skipif_cpu_name \u652f\u6301\u4e0d\u540c cpu \u4e0a\u8df3\u8fc7\uff0c\u6bd4\u5982\uff1askipif_cpu_name-KLVVW5821\uff1b "},{"location":"RELEASE/#2102023818","title":"2.1.0\uff082023/8/18\uff09","text":"fix \u4fee\u590d SW \u67b6\u6784\u73af\u5883\u4f9d\u8d56\u7684\u95ee\u9898\uff0c\u539f\u56e0\u662f\u4e4b\u524d\u6211\u8fd9\u91cc\u672c\u5730\u6ca1\u6709 SW \u7684\u673a\u5668\uff0c\u6ca1\u6709\u505a\u76f8\u5173\u9002\u914d\uff1b \u4fee\u590d\u5b50\u9879\u76ee\u5355\u72ec\u9700\u8981\u4e09\u65b9\u5305 pexpect\uff0c\u7531\u4e8e\u4e4b\u524d\u662f\u9884\u88c5\u5230\u955c\u50cf\u91cc\u9762\u7684\uff0c\u4f46\u57fa\u7840\u6846\u67b6\u4e0d\u9700\u8981\uff0c\u56e0\u6b64\u6ca1\u6709\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u91cc\u9762\uff0c\u5bfc\u81f4\u5b50\u9879\u76ee\u4f9d\u8d56\u62a5\u9519\u3002 \u4fee\u590d\u5b50\u9879\u76ee cv \u5bfc\u5165\u62a5\u9519\u7684\u95ee\u9898\uff1b \u539f\u56e0\u4e3a\uff1ayouqu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u517c\u5bb9\u4e24\u79cd\u60c5\u51b5\uff0c\u4e00\u79cd\u662f\u9762\u5411\u670d\u52a1\uff0c\u5c31\u662f\u672c\u5730\u6d4b\u8bd5\u673a\u4e0d\u9700\u8981\u5b89\u88c5 OpenCV\uff0c\u7528\u4f8b\u4e2d\u7684\u56fe\u50cf\u8bc6\u522b\u4f1a\u901a\u8fc7\u8fdc\u7a0b\u670d\u52a1\u63a5\u53e3\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u548c\u7ed3\u679c\u83b7\u53d6\uff1b\u7b2c\u4e8c\u79cd\u662f\u539f\u751f\uff0c\u5c31\u662f\u672c\u5730\u76f4\u63a5\u5b89\u88c5 OpenCV \u76f4\u63a5\u7528\u3002\u4e24\u4e2a\u60c5\u51b5\u7684\u4f18\u5148\u7ea7\u662f\u4f18\u5148\u5224\u65ad\u672c\u5730\u5b58\u5728\uff0c\u5426\u5219\u8d70\u670d\u52a1\u3002 \u524d\u9762\u6211\u4eec\u5df2\u7ecf\u628a OCR \u529f\u80fd\u505a\u4e86\u670d\u52a1\u5316\uff0c\u57fa\u4e8e 1 \u5e74\u591a\u4ee5\u6765\u7684\u89c2\u5bdf\uff0c\u7528\u8d77\u6765\u5f88\u7a33\u5b9a\uff0c\u518d\u4e00\u4e2a\u5c31\u662f OpenCV \u5b89\u88c5\u5305\u662f\u6bd4\u8f83\u81c3\u80bf\u7684\uff0c\u7c97\u7565\u6570\u4e86\u4e0b\u4f9d\u8d56\u6709 30+ \u4e2a\uff0c\u800c\u4e14\u5728\u5404\u67b6\u6784\u4e0a\u4f9d\u8d56\u5305\u8fd8\u4e0d\u5c3d\u76f8\u540c\uff0c\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u65b9\u6848\u4e2d\u4e0d\u592a\u597d\u5904\u7406\uff0c\u6240\u4ee5\u672c\u6b21 2.0 \u7248\u672c\u6211\u4eec\u5927\u80c6\u7684\u5c06\u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u529f\u80fd\u4fee\u6539\u4e3a\u9762\u5411\u670d\u52a1\u7684\u65b9\u5f0f\uff0c\u524d\u671f\u6d4b\u8bd5\u4e00\u5207\u770b\u8d77\u6765\u90fd\u5f88\u548c\u8c10\u3002 \u4f46\u662f\u6ca1\u6ce8\u610f\u5230\u4e4b\u524d\u7ed9\u6d77\u71d5\u59d0\u90a3\u8fb9\u9879\u76ee\u5355\u72ec\u5b9a\u5236\u505a\u4e86\u4e2a\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\uff08\u4e3a\u4e86\u80fd\u7b80\u5355\u5e73\u6ed1\u7684\u8fc1\u79fb\u5230 youqu\uff09\uff0c\u6b64\u63a5\u53e3\u5e95\u5c42\u6ca1\u6709\u517c\u5bb9\u670d\u52a1\u5316\uff0c\u6240\u4ee5\u5979\u90a3\u8fb9\u7684\u9879\u76ee\u8c03\u7528\u6b64\u5b9a\u5236\u63a5\u53e3\u4f1a\u62a5 cv \u5bfc\u5165\u7684\u95ee\u9898\u3002 \u7531\u4e8e\u5c06\u8fd9\u4e2a\u5b9a\u5236\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\u8fdb\u884c\u670d\u52a1\u5316\u517c\u5bb9\u6539\u9020\u9700\u8981\u4e00\u5b9a\u65f6\u95f4\uff0c\u6539\u5b8c\u8fd8\u9700\u8981\u6d4b\u8bd5\uff0c\u4f46\u672c\u6b21\u65f6\u95f4\u6bd4\u8f83\u7d27\uff0c\u56e0\u6b64\u5148\u628a OpenCV \u88c5\u8fdb\u865a\u62df\u73af\u5883\uff0c\u540e\u7eed\u7248\u672c\u518d\u8003\u8651\u9488\u5bf9\u6b64\u63a5\u53e3\u505a\u4fee\u6539\u3002"},{"location":"RELEASE/#2002023816","title":"2.0.0\uff082023/8/16\uff09","text":"YouQu\uff08\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff09\u5f00\u6e90\u4e86\uff0c\u540c\u65f6\u63a8\u51fa\u4e86 2.0 \u7248\u672c\u3002 \u611f\u8c22\u738b\u6ce2\u603b\u3001\u67b6\u6784\u5e08\u5f90\u5c0f\u4e1c\u3001\u7814\u53d1\u7ecf\u7406\u90d1\u5e7c\u6208\u3001\u5218\u90d1\u7b49\u7814\u53d1\u540c\u4e8b\u7684\u5927\u529b\u652f\u6301\u3002 new 1\u3001\u65b0\u7684\u57fa\u7840\u6846\u67b6\u4ee3\u7801\u83b7\u53d6\u65b9\u5f0f\u53ca\u65b0\u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4 YouQu \u540e\u7eed\u5747\u901a\u8fc7 PyPI \u8fdb\u884c\u5305\u7684\u53d1\u5e03\uff0c\u4e5f\u5c31\u662f\u8bf4\u540e\u7eed\u53ef\u4ee5\u4f7f\u7528 pip \u8fdb\u884c\u5b89\u88c5\uff1a sudo pip3 install youqu==2.0.0\n \u8fd9\u91cc\u6709 2 \u4e2a\u5c0f\u70b9\u8981\u6ce8\u610f\uff1a \u63a8\u8350\u4f7f\u7528 sudo pip3 \uff08\u52a0 sudo\uff09\u8fdb\u884c\u5b89\u88c5\uff1b \u5982\u679c\u4e0d\u52a0 sudo \u6709\u4e9b\u673a\u5668\u53ef\u80fd $HOME/.local/bin \u4e0d\u5728\u7cfb\u7edf PATH \u73af\u5883\u76ee\u5f55\u4e0b\uff0c\u5728\u4e0d\u6dfb\u52a0\u73af\u5883\u53d8\u91cf\u7684\u60c5\u51b5\u4e0b\uff0c\u4f1a\u51fa\u73b0 YouQu \u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4\uff08youqu-startproject\uff09\u65e0\u6cd5\u4f7f\u7528\u7684\u95ee\u9898\uff1b \u5f53\u7136\uff0c\u5c06\u4e0a\u8ff0\u8def\u5f84\u6dfb\u52a0\u5230\u73af\u5883\u53d8\u91cf\u4e4b\u540e\u4e5f\u662f\u53ef\u4ee5\u7528\u7684\uff0c\u6240\u4ee5\u6211\u8fd9\u91cc\u662f\u63a8\u8350\u52a0 sudo\uff0c\u4e0d\u52a0 sudo \u4e5f\u662f\u53ef\u4ee5\u7684\uff0c\u53ea\u662f\u9700\u8981\u5173\u6ce8\u4e0b\u73af\u5883\u53d8\u91cf\u7684\u95ee\u9898\u3002 \u63a8\u8350\u6307\u5b9a\u7248\u672c\u53f7\uff08youqu==2.0.0\uff09\u5b89\u88c5\uff0c\u5982\u679c\u4e0d\u6307\u5b9a\u7248\u672c\u53f7\u9ed8\u8ba4\u662f\u5b89\u88c5\u6700\u65b0\u53d1\u5e03\u7684 YouQu \u7248\u672c\uff0c\u4f60\u53ef\u4ee5\u5728 PyPI \u4e0a\u7684 Release history \u91cc\u9762\u67e5\u770b\u6709\u54ea\u4e9b\u7248\u672c\u3002 \u5b89\u88c5\u4e4b\u540e\u4f1a\u81ea\u52a8\u751f\u6210\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu-startproject\uff0c\u4f7f\u7528\u5b83\u53ef\u4ee5\u521d\u59cb\u5316\u5de5\u7a0b\uff0c\u8fd9\u91cc\u4ee5\u97f3\u4e50\u4e3e\u4f8b\uff1b youqu-startproject autotest_deepin_music\n \u8fd9\u6837\u5c31\u4f1a\u5728\u5f53\u524d\u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a autotest_deepin_music \u76ee\u5f55\uff0c\u91cc\u9762\u5305\u542b\u4e86\u57fa\u7840\u6846\u67b6\u6240\u6709\u7684\u4ee3\u7801\uff1b \u4e4b\u540e\uff0c\u8fd8\u662f\u5728 apps \u76ee\u5f55\u4e0b\uff0c\u653e\u5165\u5b50\u9879\u76ee\u7684AT\u4ee3\u7801\u5373\u53ef\uff0c\u4f7f\u7528\u65b9\u6cd5\u548c\u8fc7\u53bb\u4e00\u6837\uff0c\u8fd9\u91cc\u5c31\u4e0d\u591a\u4ecb\u7ecd\u3002 \u53e6\u5916\uff0c\u9664\u4e86\u901a\u8fc7 pip \u83b7\u53d6\u4ee5\u5916\uff0c\u4ecd\u7136\u53ef\u4ee5\u901a\u8fc7\u6e90\u7801\u83b7\u53d6\uff08\u76f4\u63a5 git clone\uff09\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u4f7f\u7528 pip \u5b89\u88c5 YouQu \u65f6\uff0cYouQu \u5305\u7684\u5927\u5c0f\u624d 600+ k\uff0c\u5b89\u88c5\u901f\u5ea6\u8d77\u98de\u3002 2\u3001\u65b0\u7684AT\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848 \u4e3a\u4e86\u89e3\u51b3\u4ee5\u4e0b\u95ee\u9898\uff1a \u8fc7\u53bb\u4e00\u6bb5\u65f6\u95f4\u54b1\u4eec\u7ecf\u5e38\u51fa\u73b0\u7684\uff0c\u4e0d\u540c\u7684AT\u9879\u76ee\u5728\u540c\u4e00\u53f0\u673a\u5668\u4e0a\u90e8\u7f72\u73af\u5883\u65f6\u4f9d\u8d56\u7248\u672c\u51b2\u7a81\u7684\u95ee\u9898\uff0c\u65b0\u65b9\u6848\u4e0d\u540c\u7684\u9879\u76ee\u4f1a\u52a8\u6001\u751f\u6210\u81ea\u5df1\u7684\u865a\u62df\u73af\u5883\uff0c\u76f8\u4e92\u4e4b\u95f4\u4e0d\u5f71\u54cd\uff1b \u4e1a\u5185\u4e3a\u4e86\u89e3\u51b3\u7248\u672c\u51b2\u7a81\u95ee\u9898\u4e00\u822c\u90fd\u4f1a\u4f7f\u7528Python\u865a\u62df\u73af\u5883\u7684\u5de5\u5177\uff0c\u4f46\u662f\u90fd\u6709\u4e2a\u95ee\u9898\uff0c\u65e0\u6cd5\u7ba1\u7406 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u5305\uff0c\u672c\u6b21\u6211\u4eec\u89e3\u51b3\u4e86\u8fd9\u4e2a\u95ee\u9898\uff0c\u80fd\u591f\u5b8c\u5168\u7ba1\u7406\u5e38\u89c4\u7684Python\u5305\uff0c\u4e5f\u80fd\u7ba1\u7406\u5230 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u4e09\u65b9\u5305\uff1b \u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u4f7f\u7528\u65b9\u6cd5\uff1a bash env.sh\n \u53ef\u4ee5\u770b\u51fa\u6765\u548c\u539f\u6765\u4f7f\u7528\u65b9\u6cd5\u6ca1\u6709\u53d8\u5316\uff0c\u4e5f\u5c31\u662f\u8bf4\u4ece\u4f7f\u7528\u7684\u89d2\u5ea6\u662f\u5b8c\u5168\u6ca1\u6709\u533a\u522b\u7684\uff0c\u53ea\u662f\u5185\u90e8\u505a\u4e86\u4e0d\u540c\u7684\u4e8b\u60c5\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u672c\u673a\u90e8\u7f72\u7684\u529f\u80fd\u4ecd\u7136\u4fdd\u7559 env_dev.sh\uff0c\u53ef\u4ee5\u4f5c\u4e3a\u5f00\u53d1\u65f6\u7684\u73af\u5883\u90e8\u7f72\u3002 3\u3001\u65b0\u7684\u9a71\u52a8\u547d\u4ee4 \u8fc7\u53bb\u54b1\u4eec\u90fd\u662f\u4f7f\u7528\u8fd9\u6837\u7684\u547d\u4ee4\u6765\u9a71\u52a8\u6267\u884c\uff1a python3 manage.py run\n \u7531\u4e8e\u9ed8\u8ba4\u57fa\u4e8e\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848\uff0c\u56e0\u6b64\u6211\u4eec\u589e\u52a0\u4e86\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu\uff1b \u65b0\u7684\u9a71\u52a8\u65b9\u5f0f\uff1a youqu manage.py run\n \u53ea\u9700\u8981\u628a python3 \u66ff\u6362\u6210 youqu \u5c31\u53ef\u4ee5\u4e86\uff0c\u770b\u8d77\u6765\u5f88\u548c\u8c10~ 4\u3001\u65b0\u7684\u6587\u6863\u5730\u5740 \u8fc7\u53bb\u54b1\u4eec YouQu \u7684\u5728\u7ebf\u6587\u6863\u662f\u90e8\u7f72\u5728\u516c\u53f8\u5185\u7f51\u7684\uff0c\u73b0\u5728\u5f00\u6e90\u5230 github \u4e86\uff0c\u5916\u90e8\u5f00\u53d1\u8005\u80af\u5b9a\u8bbf\u95ee\u4e0d\u5230\u5185\u7f51\u7684\u6587\u6863\uff0c\u56e0\u6b64\u9700\u8981\u5c06\u6587\u6863\u90e8\u7f72\u5230\u516c\u7f51\u3010\u516c\u7f51\u6587\u6863\u3011\uff1b \u516c\u7f51\u6587\u6863\u4f7f\u7528\u7684\u662f github pages\uff08\u767d\u5ad6\u602a\u4e00\u987f\u72c2\u559c~~\uff09\uff0c\u4f46\u53ef\u80fd\u4f1a\u51fa\u73b0\u6587\u6863\u901f\u5ea6\u6162\u7684\u95ee\u9898\uff08\u4ee3\u7406\u4e0b\u5c31\u597d\u4e86\uff09\uff0c\u4e0d\u8fc7\u6ca1\u5173\u7cfb\uff0c\u54b1\u4eec\u3010\u5185\u7f51\u6587\u6863\u3011\u4ecd\u7136\u4fdd\u7559\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u3002 5\u3001\u5176\u4ed6\u4e00\u4e9b\u5c0f\u5c0f\u529f\u80fd\u66f4\u65b0\uff1a \uff081\uff09\u65b0\u589e\u5173\u95ed\u5206\u8fa8\u7387\u68c0\u6d4b\u7684\u53c2\u6570\u503c\uff1b youqu manage.py run --resolution no\n \u6216\u8005\u4fee\u6539 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387, \u6bd4\u5982\uff1a1920x1080\n;no: \u8868\u793a\u4e0d\u505a\u5206\u8fa8\u7387\u6821\u9a8c\nRESOLUTION = 1920x1080\n resolution \u8fd9\u4e2a\u53c2\u6570\u4e00\u76f4\u90fd\u6709\u7684\uff0c\u53ea\u4e0d\u8fc7\u4e4b\u524d\u662f\u7528\u4e8e\u6307\u5b9a\u5206\u8fa8\u7387\u5927\u5c0f\uff0c\u6bd4\u5982 --resolution 1920x1080\uff0c\u4f46\u6709\u4e9b\u63a5\u53e3\u7684\u9879\u76ee\u4e0d\u9700\u8981\u8fd9\u4e2a\u68c0\u67e5\uff0c\u53ef\u4ee5\u7ed9\u5b83\u4e2a no \u5c31\u597d\u4e86\uff0c\u5f53\u7136 CICD \u4e0a\u5173\u95ed\uff0c\u9700\u8981\u6d41\u6c34\u7ebf\u4e0a\u628a\u8fd9\u4e2a\u53c2\u6570\u52a0\u4e0a\uff1b \uff082\uff09\u65b0\u589e\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u7684\u547d\u4ee4\u884c\u53c2\u6570 \u4e4b\u524d\u8fd9\u4e2a\u914d\u7f6e\u9879\u53ea\u80fd\u5728 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c 1 \u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff0cRERUN >= RECORD_FAILED_CASE\u3002\n;1.\u5173\u95ed\u5f55\u5c4f\uff1aRECORD_FAILED_CASE > RERUN\n;2.\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1aRECORD_FAILED_CASE = 0\nRECORD_FAILED_CASE = 1\n \u73b0\u5728\u5c06\u5f00\u53d1\u5230\u547d\u4ee4\u884c\u53c2\u6570\u3002 youqu manage.py run --record_failed_case 2\n fix \u4fee\u590d remote \u6267\u884c\u65f6\uff0c\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u65e0\u6cd5\u751f\u6210\u6d4b\u8bd5\u62a5\u544a\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1302023710","title":"1.3.0\uff082023/7/10\uff09","text":"fix \u8fdb\u4e00\u6b65\u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b\u53c2\u8003\uff1a\u914d\u7f6ePython\u6e90\u7684\u51e0\u79cd\u65b9\u6cd5 \u4fee\u590d wayland_autotool \u53d7\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86wayland\u4e0b\u5076\u73b0\u627e\u4e0d\u5230 .Xauthority \u6587\u4ef6\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1292023626","title":"1.2.9\uff082023/6/26\uff09","text":"fix \u4f18\u5316\u8fdc\u7a0b\u6267\u884c remote \u7684\u53c2\u6570\u76f4\u63a5\u4f20\u7ed9\u8fdc\u7a0b\u673a\u5668\u7684 run \u547d\u4ee4\uff0c\u4e0d\u7528\u518d\u5355\u72ec\u5904\u7406\u8fdc\u7a0b\u6267\u884c\u7684\u53c2\u6570\u903b\u8f91\uff0c\u540e\u7eed\u4e13\u6ce8\u4e8e\u672c\u5730\u6267\u884c\u529f\u80fd\u5f00\u53d1\uff0c\u8fdc\u7a0b\u6267\u884c\u81ea\u52a8\u9002\u7528\uff1b env.sh \u79fb\u9664 pyyaml \u5b89\u88c5\uff0c\u7531\u5b50\u9879\u76ee\u5728 requirement.txt \u91cc\u9762\u5b9a\u4e49\uff0c\u6846\u67b6\u81ea\u52a8\u52a0\u8f7d\uff1b \u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b "},{"location":"RELEASE/#128202369","title":"1.2.8\uff082023/6/9\uff09","text":"fix \u4fee\u590d\u4e86 pypi \u5b89\u88c5 numpy \u5b58\u5728\u7cfb\u7edf\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#127202368","title":"1.2.7\uff082023/6/8\uff09","text":"fix env.sh \u4e2d\u5b89\u88c5 Python \u5305\u672a\u6307\u5b9a\u7248\u672c\u65f6\uff0c\u65e5\u5fd7\u8f93\u51fa\u5b89\u88c5\u7684\u7248\u672c\uff1b pdocr-rpc 2.0.1\nallure-custom 1.2.1\nfunnylog 1.1.3\n \u4fee\u590d -f \u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u62a5\u9519\u7684\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#126202367","title":"1.2.6\uff082023/6/7\uff09","text":"fix \u4fee\u590d wayland \u4e0a\u8c03\u7528\u9f20\u6807\u4e2d\u952e\u3001\u53f3\u952e\u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b \u4fee\u590d pubilic/dde_desktop_public_widget \u91cc\u9762\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u5b9a\u4f4d\u684c\u9762\u6587\u4ef6\u7684\u65b9\u6cd5\uff0c\u5750\u6807\u6ca1\u6709\u62c6\u5305\u7684\u95ee\u9898\uff1b \u4f18\u5316\u4e86\u7b49\u5f85\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b pycreeze \u7248\u672c\u5347\u7ea7\u5230 0.1.29\uff0c\u5bfc\u81f4\u4e0e pyautogui 0.9.53 \u4e0d\u517c\u5bb9\uff0cenv.sh \u91cc\u9762\u589e\u52a0\u6307\u5b9a pycreeze \u7248\u672c\u4e3a 0.1.28\uff1b "},{"location":"RELEASE/#1252023516","title":"1.2.5\uff082023/5/16\uff09","text":"new --app \u53c2\u6570\u540e\u9762\u65b0\u589e\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u76ee\u524d\u652f\u6301\u4e09\u79cd\u53c2\u6570\u4f20\u5165\u65b9\u5f0f\uff1a ~$: youqu run -a deepin-music\n~$: youqu run -a autotest_deepin_music\n~$: youqu run -a apps/autotest_deepin_music\n \u200b \u540e\u4e24\u79cd\u5165\u53c2\u65b9\u5f0f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\u3002 remote \u8fdc\u7a0b\u6267\u884c\u65b0\u589e\u4ece\u547d\u4ee4\u884c\u4f20\u5165\u6d4b\u8bd5\u673a\u4fe1\u606f\uff0c\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679c password \u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6 setting/remote.ini \u4e2d CLIENT_PASSWORD \u7684\u503c,\u6bd4\u5982\uff1auos@10.8.13.33:1 \u6216 uos@10.8.13.33 \uff1b python3 manage.py remote -c uos@10.8.13.33/uos@10.8.13.34\npython3 manage.py remote -c uos@10.8.13.33:1/uos@10.8.13.34:2\n fix \u65e5\u5fd7\u6a21\u5757\u4fee\u6539\u4e3a\u51fd\u6570\u6267\u884c\u4e4b\u524d\u6253\u5370\u65e5\u5fd7\uff1b \u65e5\u5fd7\u6a21\u5757\u589e\u52a0\u767d\u540d\u5355\uff0c\u901a\u8fc7\u7c7b\u540d\u5f00\u5934\uff0c\u7ed3\u675f\uff0c\u5305\u542b\u7b49\u5173\u952e\u5b57\u63a7\u5236\u9700\u8981\u6253\u5370\u7684\u51fd\u6570\u65e5\u5fd7\uff1b \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5982\u679c\u4f20\u5165\u4e86 app_name \u53ea\u4f1a\u5c06 apps \u76ee\u5f55\u4e0b app_name \u7684\u76ee\u5f55\u53d1\u9001\u5230\u6d4b\u8bd5\u673a\uff1b env.sh \u79fb\u9664 python3-dev\uff1b \u4fee\u590d Wayland \u4e0b env.sh \u73af\u5883\u5b89\u88c5\u5931\u8d25\u7684\u95ee\u9898\uff0c\u4f18\u5316\u4e86 deb \u4f9d\u8d56\u5b89\u88c5\u7684\u903b\u8f91\uff1b \u5c06 env.sh \u5237\u65b0\u6e90\u7684\u65e5\u5fd7\u5728\u7ec8\u7aef\u663e\u793a\uff0c\u89e3\u51b3\u5728 CI \u73af\u5883\u4e0b\uff0c\u957f\u65f6\u95f4\u4e0d\u8f93\u51fa\u65e5\u5fd7\u8fde\u63a5\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d1060 \u534e\u4e3a\u673a\u578b\u5b89\u88c5\u952e\u9f20\u5de5\u5177\u65f6\u4f9d\u8d56\u4e0d\u517c\u5bb9\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1242023227","title":"1.2.4\uff082023/2/27\uff09","text":"fix \u4fee\u6539 CURRENT \u6587\u4ef6\uff1b "},{"location":"RELEASE/#1232023227","title":"1.2.3\uff082023/2/27\uff09","text":"new pylint.sh \u652f\u6301\u901a\u8fc7\u4f4d\u7f6e\u53c2\u6570\u4f20\u5165\u6587\u4ef6\u8def\u5f84\uff1abash pylint.sh apps/autotest_deepin_music,\u597d\u5904\u662f\u53c2\u6570\u8def\u5f84\u53ef\u4ee5\u5728\u7ec8\u7aef\u8865\u5168\uff1b \u65b0\u589e\u7cfb\u7edf\u547d\u4ee4 youqu-pylint \uff0c\u7528\u4e8e\u9759\u6001\u4ee3\u7801\u626b\u63cf\uff0c\u4f7f\u7528\u65b9\u6cd5: youqu-pylint apps/autotest_deepin_music\uff1b \u7531\u4e8e\u7cfb\u7edf\u4e00\u4e9b dbus \u63a5\u53e3\u6539\u53d8\uff0c\u516c\u5171\u5e93\u4e2d\u7684 dbus \u65b9\u6cd5\u5c06\u4e0d\u518d\u7ef4\u62a4\uff0c\u7531\u5b50\u9879\u76ee\u5728 other_widget.py \u91cc\u9762\u8fdb\u884c\u7ef4\u62a4\uff1b fix \u4fee\u590d ssh \u73af\u5883\u4e0b\u8fd0\u884c\u63d0\u793a \u201c\u65e0\u6cd5\u8fde\u63a5\u201d \u7684\u95ee\u9898\uff1b \u4fee\u590d\u8fd0\u884c\u65f6\u7a0b\u5e8f\u9000\u51fa\uff0c\u4e0d\u8f93\u51fa\u5f02\u5e38\u65e5\u5fd7\u7684\u95ee\u9898\uff1b \u4fee\u590dyouqu remote xxx \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5728\u670d\u52a1\u7aef Ctrl + C \u65e0\u6cd5\u505c\u6b62\u7a0b\u5e8f\u8fd0\u884c\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#122202328","title":"1.2.2\uff082023/2/8\uff09","text":"new \u65b0\u589e\u6c14\u6ce1\u7c7b\u56fe\u50cf\u8bc6\u522b\u65b9\u6848\uff1bimage_utils.py::ImageUtil::get_during\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u533a\u57df\u8bc6\u522b\uff0c\u4f20\u5165 [x, y, w, h]\uff0cx: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u76ee\u6807\u56fe\u7247\uff0c\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\uff1b env.sh \u79fb\u9664 pypinyin; \u4f18\u5316\u6267\u884c env.sh \u65f6\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b manage.py \u79fb\u9664\u4e86\u53c2\u6570 session_timeout \uff0c\u6846\u67b6\u6839\u636e\u5168\u5c40\u7684 timeout \u4ee5\u53ca\u7528\u4f8b\u81ea\u5b9a\u4e49\u7684 timeout \u81ea\u52a8\u8ba1\u7b97\u51fa sessiontimeout \u7684\u503c\uff1b \u65b0\u589e ocr \u670d\u52a1\u5668\u94fe\u63a5\u91cd\u8bd5\uff0c\u9ed8\u8ba4\u91cd\u8bd51\u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u53c2\u6570\uff1b fix \u4fee\u590d\u4e86\u4e00\u4e9b pylint \u626b\u63cf\u7684\u4ee3\u7801\u98ce\u683c\u95ee\u9898\uff1b \u91cd\u65b0\u8bbe\u8ba1\u4e86\u6d4b\u8bd5\u62a5\u544a\u4e3b\u9898\uff1b "},{"location":"RELEASE/#121202316","title":"1.2.1\uff082023/1/6\uff09","text":"new \u652f\u6301\u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6267\u884c\u7528\u4f8b\uff1b\u53ef\u5c06python3 manage.py \u66ff\u6362\u4e3a youqu \uff1a youqu run -a deepin-music -k 001\n RPC \u670d\u52a1 IP \u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u6307\u5b9a\u4e0d\u540c\u7684\u7aef\u53e3\uff1b \u5728\u7ebf\u6587\u6863\u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u539f\u6765\u7684\u5730\u5740 10.8.10.215 \u5c06\u4e0d\u5728\u4f7f\u7528\uff1b fix \u4fee\u590d --count \u53c2\u6570\u53ef\u80fd\u51fa\u73b0\u4e0e\u5176\u4ed6\u6846\u67b6\u7684\u5de5\u7a0b\u4f9d\u8d56\u5b58\u5728\u51b2\u7a81\uff0c\u62a5\u9519\u91cd\u590d\u6ce8\u518c\u7684\u95ee\u9898\uff1b \u4fee\u590d CI \u73af\u5883\u4e0b\u591a\u4e2a\u5de5\u7a0b\u5b58\u5728 Python \u73af\u5883\u53d8\u91cf\u6307\u5411\u9519\u8bef\uff0c\u5bfc\u5305\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u5355\u72ec\u8fd0\u884c\u65b9\u6cd5\u65f6\u65e0\u65e5\u5fd7\u8f93\u51fa\u7684 Bug\uff1b "},{"location":"RELEASE/#12020221230","title":"1.2.0\uff082022/12/30\uff09","text":"1.1.4 \u7248\u672c\u9002\u914d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e14\u65b0\u589e\u4e86\u8f83\u591a\u65b0\u7279\u6027\uff0c\u6211\u4eec\u8ba1\u5212\u4f7f\u7528 1.1.4 \u7248\u672c\u8fd0\u884c\u4e00\u6bb5\u65f6\u95f4\uff0c1.2.0 \u7248\u672c\u5c06\u4fee\u590d\u671f\u95f4\u51fa\u73b0\u7684 Bug\uff0c\u7136\u540e\u4f5c\u4e3a\u7a33\u5b9a\u7248\u672c\u53d1\u5e03\u3002 new \u4fee\u6539\u5de5\u7a0b\u540d\u79f0\u4e3a youqu\uff1b \u5c06 sphinx \u6587\u6863\u5de5\u7a0b\u8fc1\u79fb\u5230\u5355\u72ec\u7684\u4ed3\u5e93\uff1b fix \u4fee\u590d startapp \u521b\u5efa\u5de5\u7a0b\u65f6\u5b58\u5728\u5de5\u7a0b\u540d\u79f0\u65f6\u65e0\u6cd5\u7ee7\u7eed\u521b\u5efa\uff1b \u4fee\u590d\u4e86 OCR \u670d\u52a1\u5728\u5e76\u53d1\u65f6\u53ef\u80fd\u51fa\u73b0\u65e0\u6cd5\u8fd4\u56de\u7ed3\u679c\u7684\u95ee\u9898\uff0c\u63d0\u5347 OCR \u670d\u52a1\u9ad8\u5e76\u53d1\u7a33\u5b9a\u6027\uff1b \u4fee\u590d PMS \u540c\u6b65\u6807\u7b7e\u5230 CSV \u6587\u4ef6\u4e0d\u652f\u6301\u7528\u4f8b\u5e93\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11420221214","title":"1.1.4\uff082022/12/14\uff09","text":"new \u65b0\u589e startapp \u5b50\u547d\u4ee4\u521b\u5efa\u5b50\u9879\u76ee\u5de5\u7a0b\u6a21\u677f: python3 manage.py startapp autotest_deepin_xxx \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u91cd\u590d\u6267\u884c\u6b21\u6570\uff1b \u53bb\u6389\u6279\u91cf\u6267\u884c\u524d\u6536\u96c6\u7528\u4f8b\u7684\u6b65\u9aa4\uff1b \u589e\u52a0\u5f00\u59cb\u6267\u884c\u65f6\u6253\u5370\u4e00\u4e9b\u6267\u884c\u53c2\u6570\uff0c\u5982\uff1a \u7528\u4f8b\u6536\u96c6\u6570\u91cf: 99\n\u5931\u8d25\u91cd\u8dd1\u6b21\u6570: 1\n\u6700\u5927\u5931\u8d25\u6b21\u6570: 49\n\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4: 200.0s (03\u520620\u79d2)\n\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4: 11880s (3\u5c0f\u65f618\u52060\u79d2)\n \u5b9a\u5236\u4fee\u6539allure\u62a5\u544alogo\u3001title\u3001\u9ed8\u8ba4\u8bed\u8a00\uff1b manage.py \u6267\u884c\u5f00\u59cb\u65f6\u6253\u5370 logo \u548c\u5f53\u524d\u7248\u672c\uff1a \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u255a\u2588\u2588\u2557 \u2588\u2588\u2554\u255d \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2584\u2584 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2580\u2580\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u2584\u2588 \u2584\u2588 \u2588 \u2588 \u2588 \u2584 \u2588 \u2584 \u2580\u2580\u2588 \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\uff1b \u88c5\u9970\u5668\u65b9\u6cd5\u6307\u5b9a\u6b21\u6570\uff1b @pytest.mark.count(2)\ndef test_music_001():\npass\n \u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u6b21\u6570\uff1b python3 manage.py run -a deepin-music -k 001 --count 2\n \u200b image_utils \u589e\u52a0\u51fd\u6570 save_temporary_picture\uff0c\u652f\u6301\u6307\u5b9a\u5c4f\u5e55\u533a\u57df\u622a\u56fe\u5e76\u8fd4\u56de\u56fe\u7247\u5b58\u653e\u7684\u672c\u5730\u8def\u5f84\uff0c\u540e\u7eed\u4f7f\u7528 assert_image_exist \u8fdb\u884c\u65ad\u8a00 Python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(x, y, width, height) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) button_center \u65b0\u589e btn_size \u83b7\u53d6\u63a7\u4ef6\u5de6\u4e0a\u89d2\u5750\u6807\u53ca\u957f\u5bbd\uff0c\u7528\u4e8e\u52a8\u6001\u7684\u622a\u53d6\u5143\u7d20\u7684\u56fe\u7247\uff0c\u53ef\u7528\u4e8e\u5b9a\u4f4d\u65ad\u8a00 python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u6240\u6709\u97f3\u4e50\u6309\u94ae\")) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) allure \u62a5\u544a\u4e2d\u5b9a\u4f4d\u95ee\u9898\u9664\u4e86\u65e5\u5fd7\u3001\u622a\u56fe\u3001\u5f55\u5c4f\u5916\uff0c\u8c03\u7528\u7684\u51fd\u6570\u589e\u52a0\u4e86 step \u6b65\u9aa4\u5c55\u793a\uff1b env.sh \u65b0\u589e\u5b89\u88c5\u5b50\u9879\u76ee Python \u4e09\u65b9\u4f9d\u8d56\uff0c\u5728\u5b50\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u5199 requirement.txt \u6587\u4ef6\uff0cenv.sh \u4f1a\u81ea\u52a8\u52a0\u8f7d\uff1b ocr \u8bc6\u522b\u65b0\u589e\u652f\u6301\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\u8fdb\u884c\u6587\u5b57\u8bc6\u522b\uff0c\u51cf\u5c11\u56e0\u5168\u5c4f\u8bc6\u522b\u65f6\uff0c\u5176\u4ed6\u6587\u5b57\u7684\u5e72\u6270 Python # \u65ad\u8a00\u97f3\u4e50\u7684\u5220\u9664\u5f39\u7a97\u4e2d\uff0c\u5305\u542b\u4e86\u201c\u786e\u8ba4\u201d\u7684\u6587\u5b57 self.assert_ocr_exist(\"\u786e\u8ba4\", picture_abspath=DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u5220\u9664\u5f39\u7a97\"))) \u65ad\u8a00\u51fd\u6570\u7684\u8c03\u7528\u4e5f\u4f1a\u81ea\u52a8\u6253\u5370\u65e5\u5fd7; env.sh \u65b0\u589e\u88c1\u526a\u4f9d\u8d56\u7684\u65b9\u6848\uff1b fix \u4fee\u590d Jenkins \u73af\u5883\u4e0b\uff0c apps \u76ee\u5f55\u4e0b\u5b50\u9879\u76ee\u5b58\u5728 auotest_deepin_xxx@tmp \u76ee\u5f55\uff0c\u5728\u4f20\u5165 app_name \u540e\u65e0\u6cd5\u6267\u884c\u7528\u4f8b\u7684\u95ee\u9898\uff1b \u4fee\u590d\u81ea\u52a8\u751f\u6210 case_list.csv \u6587\u4ef6\u65f6\uff0c\u7528\u4f8b\u987a\u5e8f\u88ab\u8c03\u6574\u7684\u95ee\u9898\uff1b env.sh \u73af\u5883\u5b89\u88c5\u79fb\u9664 git \u548c curl\uff1b \u4fee\u590d\u7528\u4f8b\u5728 setup \u9636\u6bb5\u62a5\u9519\u540e\uff0c\u672a\u5199\u5165 ci_result.json \u7684\u95ee\u9898\uff1b \u79fb\u9664 uos_ci.py\uff1b "},{"location":"RELEASE/#11320221028","title":"1.1.3\uff082022/10/28\uff09","text":"new \u65b0\u589e\u56fe\u50cf\u65ad\u8a00\u6210\u529f\u8f93\u51fa\u5339\u914d\u5ea6\uff1b \u65b0\u589e\u73af\u5883\u5b89\u88c5 yaml \u4f9d\u8d56\uff1b \u65b0\u589e\u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6570\u636e\u56de\u586b\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b \u65b0\u589e\u6d4b\u8bd5\u7ed3\u679c\u8868\u60c5\u663e\u793a\uff0c\u5e76\u4f18\u5316\u4e86\u65e5\u5fd7\u7684\u6392\u7248\uff1b \u65b0\u589e --top {number} \u7528\u4e8e\u8bb0\u5f55\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0c\u65e5\u5fd7\u751f\u6210\u5230 report/logs/top.log\uff1b fix \u4fee\u590d\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4f46\u7ec8\u7aef\u6ca1\u6709\u9519\u8bef\u65e5\u5fd7\u8f93\u51fa\u7684\u95ee\u9898\uff1b \u4fee\u6539\u5931\u8d25\u7528\u4f8b\u56de\u6eaf\u65e5\u5fd7\u4e3a\u8be6\u7ec6\u7ea7\u522b\uff1b \u4fee\u590d\u4e86\u6267\u884c\u8fdb\u5ea6\u672a\u8ba1\u7b97\u8df3\u8fc7\u7528\u4f8b\u7684\u95ee\u9898\uff0c\u5e76\u4f18\u5316\u4e86\u8fdb\u5ea6\u83b7\u53d6\u7684\u7b97\u6cd5\uff1b \u4fee\u590d env.sh \u5728 V23 \u73af\u5883\u4e0b\u5b89\u88c5\u65e0\u6cd5\u8bfb\u53d6\u5bc6\u7801\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 pms \u6d4b\u8bd5\u5957\u6267\u884c\u6216\u6d4b\u8bd5\u5355\u6267\u884c\u65f6\uff0c\u7528\u4f8bID\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b env.sh \u91cc\u9762 hub.deepin.com \u66f4\u6362\u6210 it.uniontech.com\uff1b uos_ci.py \u6d4b\u8bd5\u7ed3\u679c\u7edf\u8ba1\u65f6\uff0c\u603b\u6570\u5254\u9664 skip \u7684\u6570\u91cf "},{"location":"RELEASE/#11220220921","title":"1.1.2\uff082022/09/21\uff09","text":"new \u5728\u6ca1\u6709\u5b89\u88c5 dogtail \u7684\u60c5\u51b5\u4e0b\uff0c\u4e5f\u80fd\u4f7f\u7528 sniff \u5de5\u5177\uff1b fix \u4fee\u590d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e2d\u6ca1\u6709\u5b89\u88c5 AT \u73af\u5883\u6267\u884c uos_ci.py \u62a5\u9519\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11120220919","title":"1.1.1\uff082022/09/19\uff09","text":"new \u65b0\u589e\u6267\u884c\u8fdb\u5ea6\u663e\u793a\uff0c\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u65f6\u65e5\u5fd7\u8f93\u51fa\u5f53\u524d\u8fdb\u5ea6\uff1a[\u5f53\u524d\u6307\u5b9a\u7b2c\u51e0\u6761/\u7528\u4f8b\u603b\u6570]\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u7528\u4f8b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\u6240\u6709\u5931\u8d25\u7528\u4f8b\u7684\u5217\u8868\uff1b \u5173\u95ed\u7ec8\u7aef\u8f93\u51fa\u6355\u83b7\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u65e5\u5fd7\u5feb\u7167\uff1b \u4f18\u5316\u7ec8\u7aef\u8f93\u51fa\u5931\u8d25\u4fe1\u606f\u5197\u957f\u4e3a\u7b80\u8981\u4fe1\u606f\u8f93\u51fa\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u663e\u793a 10 \u4e2a\u6267\u884c\u6700\u6162\u7684\u7528\u4f8b\u5217\u8868\uff0c\u5e76\u8be6\u7ec6\u5217\u51fa\u5404\u4e2a\u9636\u6bb5\u7684\u8017\u65f6\uff1b \u5931\u8d25\u91cd\u8dd1\u7528\u4f8b\u91cd\u8dd1\u4e4b\u524d\u5ef6\u8fdf 1 \u79d2\uff1b \u65b0\u589e\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4ecd\u7136\u5f3a\u5236\u6267\u884c\uff1b \u7528\u4f8b\u6536\u96c6\u65f6\u4ec5\u5728 apps \u76ee\u5f55\u4e0b\u8fdb\u884c\uff0c\u5ffd\u7565 src,setting,public \u76ee\u5f55\uff1b \u65b0\u589e allure \u62a5\u544a\u5907\u4efd\u529f\u80fd\uff0c\u9ed8\u8ba4\u5907\u4efd\u81f3 allure_back \u76ee\u5f55\u4e0b\uff1b manage.py\u65b0\u589e\u53c2\u6570 --lastfailed \u7528\u4e8e\u53ea\u8dd1\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\u7684\u529f\u80fd\uff1b fix \u4fee\u590d\u4e86\u5728\u6ca1\u6709\u6307\u5b9a\u5e94\u7528\u540d\u79f0\u6267\u884c\u65f6\uff0cxml \u62a5\u544a\u751f\u6210\u8def\u5f84\u5f02\u5e38\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 uos_ci.py \u4f20\u5165 timeout \u548c session_timeout \u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11020220916","title":"1.1.0\uff082022/09/16\uff09","text":"new \u65b0\u589ePMS\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u652f\u6301\u591a\u79cd\u6570\u636e\u56de\u586b\u6a21\u5f0f\uff1b \u4f18\u5316\u4e86\u901a\u8fc7\u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u65f6PMS \u722c\u866b\u7684\u6027\u80fd\uff1b \u65b0\u589e .gitmodules \u6587\u4ef6\uff0c\u7528\u4e8e\u6807\u8bb0\u6240\u6709\u5b50\u9879\u76ee\uff0c\u65b9\u4fbf\u7edf\u4e00\u62c9\u53d6\u4ee3\u7801\uff1b env.sh \u9002\u914d\u793e\u533a\u7248\u4e0a\u5b89\u88c5\u81ea\u52a8\u5316\u73af\u5883\uff1b \u589e\u52a0\u6267\u884c\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u9519\u8bef\u7684\u529f\u80fd\uff1b README.md \u589e\u52a0 Wayland \u4e0b\u4f7f\u7528\u3001\u6d4b\u8bd5\u62a5\u544a\u67e5\u770b\u3001\u5e38\u89c1\u95ee\u9898\u7b49\u7684\u6587\u6863\u8bf4\u660e\uff1b \u589e\u52a0\u4e86\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u5bf9 setup\u3001call\u3001teardown \u8fdb\u884c\u65e5\u5fd7\u5206\u6bb5\uff1b fix \u4fee\u590d\u4e86 \u786e\u8ba4\u4fee\u590d \u5217\u6ca1\u5199\u8868\u5934\uff0c\u4f46\u5199\u4e86 fixed-xxx \u6807\u7b7e\uff0c\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u540c\u4e00\u5e94\u7528\u5185\u591a\u4e2a csv \u6587\u4ef6\u4e2d \u786e\u8ba4\u4fee\u590d \u5217\u6709\u7684\u5199\u4e86\uff0c\u6709\u7684\u6ca1\u5199\uff0c\u53ef\u80fd\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 INFO \u65e5\u5fd7\uff0c\u663e\u793a\u4e3a DEBUG \u7684\u95ee\u9898\uff1b\u4fee\u590d\u4e86\u90e8\u5206\u673a\u5668\u4e0a INFO \u65e5\u5fd7\u5185\u5bb9\u663e\u793a\u4e3a\u7ea2\u8272\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\u770b\u4e0d\u5230\u8be6\u7ec6\u4fe1\u606f\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10220220822","title":"1.0.2\uff082022/08/22\uff09","text":"new \u79fb\u9664 loguru\uff0c\u66ff\u6362\u4e3a logging\uff0c\u63a5\u53e3\u4fdd\u6301\u4e0d\u53d8\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u53d7\u5f71\u54cd\uff1b \u9ed8\u8ba4\u5f00\u542f coredump\uff1b fix \u4fee\u590d\u4e86\u4e09\u65b9\u5e93 loguru \u5076\u73b0\u5f02\u5e38\uff0c\u5bfc\u81f4\u7a0b\u5e8f\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7b2c\u4e00\u6b21\u5931\u8d25\u4e0d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10120220812","title":"1.0.1\uff082022/08/12\uff09","text":"new \u65b0\u589e RELEASE.md \u6587\u4ef6\uff0c\u7528\u4e8e\u8bb0\u5f55\u5386\u53f2\u53d1\u5e03\u7248\u672c\u7684\u66f4\u65b0\u5185\u5bb9\uff1b \u517c\u5bb9 Wayland \u6a21\u5f0f\u4e0b\u6267\u884c\u7528\u4f8b\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u7528\u7ba1\u5f53\u524d\u6d4b\u8bd5\u673a\u6267\u884c\u73af\u5883\uff0c\u6846\u67b6\u4f1a\u81ea\u52a8\u6839\u636e\u5f53\u524d\u73af\u5883\u8d70\u4e0d\u540c\u7684\u4ee3\u7801\u903b\u8f91\uff1b \u7531\u4e8e\u9700\u8981\u4fee\u6539 dogtail \u6e90\u4ee3\u7801\uff0c\u56e0\u6b64\u5c06\u4fee\u6539\u540e\u7684\u6e90\u7801\u653e\u5165\u5230\u6838\u5fc3\u5e93\u91cc\u9762 src/depends/dogtail \u540e\u7eed\u7248\u672c\u5c06\u4e0d\u9700\u8981\u5728\u7cfb\u7edf\u4e2d\u5b89\u88c5dogtail\uff1b \u5982\u679c\u5e94\u7528\u5e93\u540c\u6837\u4f7f\u7528\u4e86\u7cfb\u7edf\u5b89\u88c5\u7684 dogtail \u53ef\u80fd\u4f1a\u62a5\u9519\uff0c\u89e3\u51b3\u65b9\u6848\u662f\u5c06\u4ee3\u7801\u4e2d\u7684 import dogtail \u4fee\u6539\u4e3a from src.depends import dogtail ; fix \u91cd\u8dd1\u5931\u8d25\u4e4b\u540e\u624d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff0c\u4fee\u6539\u4e3a\u5931\u8d25\u4e4b\u540e\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":"# Attribution \uff1achengdu Test Team\n# Date \uff1a2021/08/20\n \u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d \u4ed3\u5e93\u5730\u5740\uff1ahttps://gitlabcd.uniontech.com/autotest/cd-desktop-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u65b9\u6848\u6982\u8ff0","text":"\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u667a\u80fd\u8bc6\u522b\u5e94\u7528\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u7528\u4e8e\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u64cd\u4f5c\u8fc7\u7a0b\u4e2d\u7684\u5143\u7d20\u5b9a\u4f4d\u4ee5\u53ca\u5224\u65ad\u7ed3\u679c\u65f6\u7684\u65ad\u8a00\u5904\u7406\uff1b\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\uff0c\u6d4b\u8bd5\u673a\u4e0a\u7684\u753b\u9762\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u5230\u670d\u52a1\u5668\u4e0a\uff0c\u670d\u52a1\u5668\u5bf9\u89c6\u9891\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\u540e\uff0c\u670d\u52a1\u5668\u667a\u80fd\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\u6210\u529f\uff0c\u7136\u540e\u5bf9\u6d4b\u8bd5\u673a\u4e0b\u53d1\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\uff0c\u6d4b\u8bd5\u673a\u63a5\u53d7\u5e76\u6267\u884c\u4e0b\u4e00\u6b65\u64cd\u4f5c\u3002 \u670d\u52a1\u5668\u4e0e\u6d4b\u8bd5\u673a\u4e4b\u95f4\u7684\u94fe\u63a5\uff1a \u670d\u52a1\u5668\u901a\u8fc7 USB \u4e32\u53e3\u8bbe\u5907\uff08USB-HID \u534f\u8bae\uff09\u6a21\u62df\u9f20\u6807\u952e\u76d8\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u64cd\u4f5c\u3002 \u901a\u8fc7\u89c6\u9891\u91c7\u96c6\u8bbe\u5907\u6355\u83b7\u6d4b\u8bd5\u673a\u7684\u5b9e\u65f6\u753b\u9762\u4f20\u8f93\u7ed9\u670d\u52a1\u5668\u3002 \u670d\u52a1\u5668\u5bf9\u91c7\u96c6\u7684\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\uff0c\u8bc6\u522b\u5176\u4e2d\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5e76\u8fd4\u56de\u5143\u7d20\u63a7\u4ef6\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\uff0c\u670d\u52a1\u5668\u901a\u8fc7\u667a\u80fd\u5316\u5206\u6790\uff0c\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e00\u81f4\u5c06\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\u901a\u8fc7\u4e32\u53e3\u6a21\u62df\u952e\u9f20\u4fe1\u53f7\u53d1\u9001\u7ed9\u6d4b\u8bd5\u673a\uff1b\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e0d\u4e00\u81f4\u5c06\u4f1a\u8fdb\u5165\u4e2d\u65ad\u5904\u7406\u53ca\u5f02\u5e38\u7ed3\u679c\u8f93\u51fa\uff0c\u7ee7\u7eed\u6267\u884c\u540e\u7eed\u573a\u666f\uff0c\u76f4\u81f3\u6240\u6709\u7528\u4f8b\u6d4b\u8bd5\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u6df1\u5ea6\u5b66\u4e60\u73af\u5883\u642d\u5efa","text":"\u6a21\u578b\u8bad\u7ec3\u4e3b\u8981\u5bf9 GPU \u6709\u8981\u6c42\uff0c\u8bad\u7ec3\u6a21\u578b\u7684\u673a\u5668\u663e\u5b58\u4e0d\u4f4e\u4e8e 6G\uff0c\u5176\u4ed6\u914d\u7f6e\u65e0\u7279\u6b8a\u8981\u6c42\u3002 \u63a8\u8350\u6027\u4ef7\u6bd4\u8f83\u9ad8\u914d\u7f6e \u64cd\u4f5c\u7cfb\u7edf: UnionTech OS Desktop 20 Professional Linux version 4.19.0-desktop-amd64 (deepin@deepin-PC) (Uos 8.3.0.3-3+rebuild) \u5904\u7406\u5668: Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz (\u516b\u6838 / \u5341\u516d\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460M-HDV(RD)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))/8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: TU116 [GeForce GTX 1660]\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u865a\u62df\u73af\u5883\u5b89\u88c5","text":"cd ~\nwget -c https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh\nbash Miniconda3-latest-Linux-x86_64.sh\n \u4e00\u8def\u56de\u8f66 \u7b2c\u4e00\u6b21\u63d0\u793a\u8f93\u5165 yes/no \uff1a\u8f93\u5165 yes \u7ee7\u7eed\u4e00\u8def\u56de\u8f66 \u7b2c\u4e8c\u6b21\u63d0\u793a\uff1a\u8f93\u5165 no cd ~/miniconda3/bin\nsudo chmod 777 activate\n \u6fc0\u6d3bconda\u73af\u5883 . ./activate\n \u6dfb\u52a0\u516c\u53f8\u5185\u7f51\u6e90 conda config --add channels bioconda\nconda config --add channels conda-forge\n \u5982\u679c\u662f\u5916\u7f51\u6dfb\u52a0\u5916\u7f51\u6e90 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/\n \u5982\u679c\u8981\u5220\u9664\u6e90 conda config --remove-key channels\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"2\u3001\u5b89\u88c5\u4f9d\u8d56","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u521b\u5efa\u865a\u62df\u73af\u5883","text":"conda remove --name mmlab --all # \u79fb\u9664\u6240\u6709\u865a\u62df\u73af\u5883\n conda create -n mmlab python=3.7\n conda activate mmlab\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-pytorch","title":"\uff082\uff09\u5b89\u88c5 Pytorch","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install torch==1.7.0+cu101 torchvision==0.8.1+cu101 torchaudio==0.7.0 -f https://download.pytorch.org/whl/torch_stable.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-mmcv","title":"\uff083\uff09\u5b89\u88c5 MMCV","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install mmcv-full==1.3.3 -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.7.0/index.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"\uff084\uff09\u5b89\u88c5\u663e\u5361\u9a71\u52a8","text":"\u6839\u636e\u4f60\u7684\u663e\u5361\u4e0b\u8f7d\u5bf9\u5e94\u9a71\u52a8\uff0c\u6bd4\u5982\u6211\u7684\u663e\u5361\u4e3a GTX1660\uff0c\u9a71\u52a8\u7248\u672c\u4e3a 430\uff0c\u9a71\u52a8\u4e0b\u8f7d\u5730\u5740\uff1ahttps://www.nvidia.cn/Download/Find.aspx?lang=cn CTRL+ALT+F2 \u8fdb\u5165tty\n \u7981\u7528 nouveau \u9a71\u52a8 sudo vim /etc/modprobe.d/blacklist-nouveau.conf\n \u586b\u5165\uff1a blacklist nouveau options nouveau modeset=0\n \u5237\u65b0\u914d\u7f6e\u6587\u4ef6 sudo update-initramfs -u reboot \u91cd\u542f\u540e\u518d\u8fdb\u5165 tty \u5173\u95ed\u56fe\u50cf\u754c\u9762\uff0c\u8f93\u5165\u547d\u4ee4\u5173\u95ed\u56fe\u50cf\u754c\u9762 sudo service lightdm stop\n \u5b89\u88c5\u9a71\u52a8 sudo chmod a+x NVIDIA-Linux-x86_64-430.run\nsudo ./NVIDIA-Linux-x86_64-430.run\n reboot\u91cd\u542f\uff0cnvidia-smi\u67e5\u770b\u5b89\u88c5\u72b6\u6001\u3002\u6ce8\u610f\u770b\u4e0bcuda\u7248\u672c\uff0c10.1\uff0cdriver\u7248\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u6570\u636e\u6807\u6ce8","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u6570\u636e\u6807\u6ce8","text":"\u6807\u6ce8\u4e4b\u524d\u9700\u8981\u5148\u8f6c\u6362\u56fe\u7247\u5927\u5c0f\uff0c\u5e76\u4e14\u4ee5\u6570\u5b57\u547d\u540d\uff0c\u6bcf\u7ec4\u547d\u540d\u9012\u589e"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"\uff081\uff09\u8f6c\u6362\u5927\u5c0f\u5e76\u91cd\u547d\u540d","text":"rename_pic.py import os\nimport sys\nimport cv2\nimport time\nimport getpass\nusername = getpass.getuser()\nsource_path = f\"/home/{username}/Desktop/right_menu\" # \u56fe\u7247\u8def\u5f84\nsource_dest = os.path.join('/'.join(source_path.split(\"/\")[:-1]), 'tmp')\nif not os.path.exists(source_dest):\nos.mkdir(source_dest)\nstart_name = sys.argv[1]\nfile_name_list = list()\nfor file in os.listdir(source_path):\nif file.endswith('.png'):\nfile_name_list.append(file)\nstart_name = int(start_name)\nfor file in file_name_list:\nos.rename(os.path.join(source_path,file), os.path.join(source_path, f\"{str(start_name)}.png\"))\nstart_name += 1\ntime.sleep(1)\nfor file in os.listdir(source_path):\nimage = os.path.join(source_path, str(file))\nsrc = cv2.imread(image)\nresult = cv2.resize(src, (960, 540))\nresizeImage = os.path.join(source_dest, str(file))\nprint(resizeImage)\ncv2.imwrite(str(resizeImage), result)\ncv2.waitKey(0)\ncv2.destroyAllWindows()\ntime.sleep(1)\nos.system(f'rm -rf {source_path}/*')\nos.system(f'mv {source_dest}/* {source_path}')\nos.system(f'rm -rf {source_dest}')\nprint(\"\u4e0b\u4e00\u4e2a\u5e8f\u53f7\uff1a\", start_name)\n \u6839\u636e\u7ec8\u7aef\u8f93\u51fa\u7684\u4e0b\u4e00\u4e2a\u5e8f\u53f7\u7684\u63d0\u793a\uff0c\u6267\u884c Python \u6587\u4ef6\u7684\u65f6\u5019\u4f20\u53c2\u3002 python rename_pic.py 249\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"\uff082\uff09\u5de5\u5177\u6807\u6ce8","text":"\u4f7f\u7528\u5de5\u5177 labelImg \u6807\u6ce8 sudo pip3 install PyQt5==5.13\nsudo pip3 install labelImg\n \u7ec8\u7aef\u76f4\u63a5\u8f93\u5165 labelImg\uff0c\u56de\u8f66 \u6807\u6ce8\u6a21\u5f0f\u9009\u62e9\uff1aPascalVOC"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u667a\u80fd\u6807\u6ce8","text":"\u6253\u5f00\u5c4f\u5e55\u5f55\u5236\u8f6f\u4ef6\uff0c\u5f55\u5236\u624b\u52a8\u64cd\u4f5c\u4e00\u6b21\u6d4b\u8bd5\u7528\u4f8b\uff0c\u7136\u540e\u5c06\u5f55\u5236\u7684\u89c6\u9891\u8fdb\u884c\u5206\u5e27\uff0c\u7136\u540e\u5bf9\u6bd4\u524d\u4e24\u5e27\u56fe\u6807\u76f8\u4f3c\u5ea6\uff0c\u5254\u9664\u76f8\u4f3c\u5ea6\u8fc7\u9ad8\u7684\u56fe\u7247\uff0c\u5728\u4fdd\u8bc1\u7d20\u6750\u591a\u6837\u6027\u7684\u524d\u63d0\u4e0b\uff0c\u5254\u9664\u91cd\u590d\u591a\u4f59\u7684\u56fe\u7247\u751f\u6210\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u96c6\uff0c\u7136\u540e\u53d6\u51fa\u63a7\u4ef6\u6a21\u677f\u6570\u636e\u96c6\uff0c\u901a\u8fc7 OpenCV \u6a21\u677f\u5339\u914d\u83b7\u53d6\u63a7\u4ef6\u5728\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u56fe\u7247\u4e2d\u6240\u5728\u7684\u5de6\u4e0a\u3001\u5de6\u4e0b\u3001\u53f3\u4e0a\u3001\u53f3\u4e0b\u56db\u5904\u5750\u6807\uff0c\u4ece\u800c\u6839\u636e\u6a21\u677f\u6570\u636e\u96c6\u751f\u6210\u6807\u6ce8\u6570\u636e\u3002\u53c2\u8003\u76ee\u5f55 AnnotationMaterial"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"\uff081\uff09\u6a21\u677f\u6570\u636e\u96c6\u51c6\u5907","text":"1\u3001\u5728\u754c\u9762\u622a\u53d6\u9700\u8981\u6807\u6ce8\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u653e\u5728\u76ee\u5f55\u4e0b AnnotationMaterial/template/img 2\u3001\u7ef4\u62a4\u63a7\u4ef6\u540d\u4e0e\u5143\u7d20\u63a7\u4ef6\u7684\u952e\u5bf9\uff0c\u4e00\u4e2a\u63a7\u4ef6\u540d\u53ef\u5bf9\u5e94\u591a\u4e2a\u5143\u7d20\u63a7\u4ef6 menu:\n- menu.jpg\n- menu1.jpg\n- menu2.jpg\n- menu3.jpg\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"\uff082\uff09\u7d20\u6750\u96c6\u51c6\u5907","text":"\u5f55\u5236\u89c6\u9891\u6216\u6216\u5c4f\u5e55\u622a\u56fe\u653e\u7f6e\u76ee\u5f55 AnnotationMaterial/source"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u5f00\u59cb\u6807\u6ce8","text":"python3 AnnotationMaterial/main.py\n \u751f\u6210\u7684\u6807\u6ce8\u6570\u636e\u5b58\u653e\u5728 AnnotationMaterial/result"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#mmdetection","title":"\u56db\u3001MMDetection","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1-mmdetection","title":"1\u3001 MMDetection \u4ee3\u7801","text":"MMDetection \u662f\u4e00\u4e2a\u6709\u540d\u7684\u6df1\u5ea6\u5b66\u4e60\u76ee\u6807\u68c0\u6d4b\u5f00\u6e90\u9879\u76ee\uff0c\u4e5f\u662f openMMlab \u7684\u62db\u724c\u9879\u76ee\uff0c\u4e3a\u4ec0\u4e48\u9009\u62e9\u5b83\uff0c\u5c0f\u5b69\u513f\u6ca1\u5a18\u8bf4\u6765\u8bdd\u957f\uff0c\u611f\u5174\u8da3\u53ef\u4ee5\u81ea\u884c\u6df1\u5165\u4e86\u89e3\uff1b \u4f60\u53ef\u4ee5\u76f4\u63a5\u5728 GitHub \u4e0a\u514b\u9686\u4ee3\u7801\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u54b1\u4eec\u4ed3\u5e93\u4e0b Train \u76ee\u5f55\u4e2d\u4ee3\u7801\uff0cTrain \u4e2d\u7684\u4ee3\u7801\u4e5f\u662f\u4ece GitHub \u4e0a\u62c9\u53d6\u7684\uff0c\u4e0d\u8fc7\u6211\u4eec\u6839\u636e\u9879\u76ee\u9700\u8981\u505a\u4e86\u4e00\u4e9b\u4e8c\u6b21\u5f00\u53d1\uff0c\u63a8\u8350\u76f4\u63a5\u4f7f\u7528\u5b83\u3002 \u5982\u679c\u4f60\u60f3\u4ece GitHub \u4e0a\u62c9\uff1a git clone https://github.com/open-mmlab/mmdetection.git\n# \u4e0d\u80fd\u76f4\u63a5\u62c9\u53d6\u4e3b\u5206\u652f\uff0c\u5efa\u8bae\u4f7f\u75282.12\u7248\u672c\uff0c\u4e0d\u540c\u7684\u7248\u672c\u5bf9\u5e94\u7684mmcv\u7248\u672c\u662f\u4e0d\u540c\u7684\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-voc2coco","title":"2\u3001\u62c9\u53d6 voc2coco \u4ee3\u7801","text":"git clone https://github.com/Tony607/voc2coco.git\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-coco","title":"3\u3001\u8f6c\u6362 coco \u6570\u636e\u96c6","text":"\u5c06\u6240\u6709\u7684\u56fe\u7247\u548cxml\u6587\u4ef6\u653e\u5165train2017\uff0c\u4ece\u4e2d\u6311\u9009\u51e0\u7ec4\u653e\u5165val2017\uff08\u6d4b\u8bd5\u96c6\uff09 cd mmdetection/data/coco\npython voc2coco.py train2017 annotations/instances_train2017.json\npython voc2coco.py val2017 annotations/instances_val2017.json\n \u751f\u6210json\u6587\u4ef6"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4_1","title":"4\u3001\u4fee\u6539\u914d\u7f6e","text":"\uff081\uff09\u8bfb\u53d6\u6a21\u578b\u540d\u79f0 import json\nmodule_name = []\nwith open('./instances_train2017.json', \"r+\") as f:\njson_file = f.read()\njson_dict = json.loads(json_file)\nmodule_list = json_dict.get('categories')\nfor module_info in module_list:\nname = module_info.get('name')\nmodule_name.append(name)\nprint(module_name)\nprint(\"module_num:\", len(module_name))\n # \u6ce8\u610f\u5bf9\u6bd4instances_train2017.json\u91cc\u9762\u6a21\u578b\u540d\u79f0\u7684\u987a\u5e8f\uff0c\u4e0eCLASSES\u548ccoco_classes\u91cc\u9762\u7684\u987a\u5e8f\u4fdd\u6301\u4e00\u81f4\u3002\n \uff082\uff09\u4fee\u6539 faster_rcnn_r101_2x_coco.py mmdetection/xianjin/faster_rcnn_r101_2x_coco.py \u4fee\u653946\u884c\uff0cnum_clasess\u7684\u503c\uff0c\u65b0\u589e1\u4e2a\uff0c\u5c31 +1\uff1b \uff083\uff09\u4fee\u6539 coco.py mmdetection/mmdet/datasets/coco.py CLASSES = ()\uff0c\u5728\u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b \uff084\uff09\u4fee\u6539 class_names.py mmdetection/mmdet/core/evaluation/class_names.py coco_classes \u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#5","title":"5\u3001\u7f13\u5b58\u6e05\u7406","text":"\u5220\u9664 mmdetection/build \u76ee\u5f55 python setup.py install\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#6","title":"6\u3001\u8bad\u7ec3\u6a21\u578b","text":"\uff081\uff09\u6307\u5b9a\u81ea\u5df1\u914d\u7f6e\u7684\u8bad\u7ec3\u6a21\u578b\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py --gpus 1\n \uff082\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u6d4b\u8bd5\u96c6\u7ed3\u679c\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py xianjin/epoch_24.pth --show\n \uff083\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u51c6\u786e\u5ea6\uff1b python tools/analysis_tools/analyze_logs.py plot_curve xianjin/20210530_011907.log.json --keys acc\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#7","title":"7\u3001\u5feb\u6377\u64cd\u4f5c","text":"python3 run.py\n \u5c06\u4ee5\u4e0a 4 - 7 \u6b65\u64cd\u4f5c\u6574\u5408\u6210 run.py\uff0c\u4e00\u952e\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u4e94\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\uff1b \u670d\u52a1\u7aef\u4e00\u53f0\uff08\u76ee\u524d\u4ec5\u652f\u6301AMD\u67b6\u6784\uff09\uff1b \u91c7\u96c6\u76d2\u4e00\u4e2a \uff08ACASIS hdmi\u89c6\u9891\u91c7\u96c6\u5361\uff0chttps://item.jd.com/10024310742602.html \uff09\uff1b USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\uff1b USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff1b \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5USB\u5ef6\u957f\u7ebf\uff1b \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u63a8\u8350\u914d\u7f6e","text":"\u6267\u884c\u7528\u4f8b\u7684\u670d\u52a1\u7aef\u5bf9\u914d\u7f6e\u6ca1\u6709\u7279\u6b8a\u8981\u6c42\uff0c\u5982\u679c\u6761\u4ef6\u5141\u8bb8\u914d\u7f6e\u8d8a\u9ad8\uff0c\u8bc6\u522b\u901f\u5ea6\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n \u6d4b\u8bd5\u673a\u4e0a\u4e0d\u6267\u884c\u4efb\u4f55\u811a\u672c\uff0c\u5177\u4f53\u914d\u7f6e\u6839\u636e\u6d4b\u8bd5\u9700\u8981\u51b3\u5b9a\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#usb_mk","title":"\u516d\u3001USB_MK\u4e32\u53e3\u9a71\u52a8\u65b9\u6cd5","text":"\u4f4d\u4e8econtrol_method\u76ee\u5f55\u4e0b\u7684usb_mk.py\u6587\u4ef6 \uff081\uff09\u5217\u51fa\u53ef\u901a\u4fe1\u7684\u7aef\u53e3 python3 -m serial.tools.list_ports -v\n \uff082\uff09\u4fee\u6539\u4e32\u53e3\u7684\u6743\u9650 sudo chmod 777 /dev/ttyACM0\n \uff083\uff09\u5b9e\u4f8b\u5316USB_MK import UsbMk\nusb_mk = UsbMk(\"/dev/ttyACM0\", 9600) # \u8bbe\u5907\u9ed8\u8ba49600\u4e3a\u6ce2\u7279\u7387\uff0c\u63a7\u5236\u4f20\u8f93\u901f\u7387\n \uff084\uff09USB\u4e32\u53e3\u8bbe\u5907\u9ed8\u8ba4\u6ce2\u7279\u7387\u4e3a9600\uff08\u7ecf\u6d4b\u8bd5\u6ce2\u7279\u73879600\u51c6\u786e\u6027\u6700\u597d\uff09\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up() # \u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u6c49\u5b57\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e\n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff083\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff084\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff085\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() # \u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2\n \uff086\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff087\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff088\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e03\u3001\u65b9\u6cd5\u8c03\u7528\u5165\u53c2\u89c4\u5219","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_7","title":"1\u3001\u57fa\u7c7b","text":"class Base:\ndef __init__(self):\nself._obj = image\nself._usb = usb_mk\ndef find_element_by_ai(self, element):\nreturn self._obj.find_element(element)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_6","title":"2\u3001\u5165\u53c2\u8bf4\u660e","text":"\u56fe\u50cf\u8bc6\u522b\u65b9\u6cd5\u5165\u53e3\u4e3a Base \u7c7b\u4e0b\u7684 find_element_by_ai \u3002\u4ec5\u63a5\u53d7\u4e00\u4e2a\u53c2\u6570 element\uff0c\u7c7b\u578b\u4e3a string\u3002 \u53ef\u8bc6\u522b\u7684 string \u683c\u5f0f\uff1a \uff081\uff09\u5927\u56fe\u6807\uff08 \u56fe\u6807\u5927\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\uff0c\u4f8b\uff1a Base().find_element_by_ai(\"window\")\n \uff082\uff09\u5927\u56fe\u6807 / \u5c0f\u56fe\u6807\uff08\u56fe\u6807\u5c0f\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5c0f\u56fe\u6807\uff0c\u4f8b\uff1awindow/search_btn Base().find_element_by_ai(\"window/search_btn\")\n \uff083\uff09\u5927\u56fe\u6807 / OCR\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\u5185\u7684\u6587\u5b57\uff0c\u4f8b\uff1amenu/\u5c5e\u6027 Base().find_element_by_ai(\"menu/\u5c5e\u6027\")\n \uff084\uff09OCR\uff1a\u5168\u5c4f\u8bc6\u522b\u6587\u5b57 Base().find_element_by_ai(\"\u641c\u7d22\")\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516b\u3001\u9690\u85cf\u9f20\u6807","text":"\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u8fc7\u6765\u7684\u89c6\u9891\u6d41\uff0c\u5728\u8bc6\u522b\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u53d7\u5230\u9f20\u6807\u5f71\u54cd\uff0c\u56e0\u6b64\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u9690\u85cf\u9f20\u6807\u3002 \u5c4f\u853d\u9f20\u6807\u5149\u6807\u663e\u793a ```shell script /etc/lightdm/lightdm.conf \u5728`[Seat:*]`\u4e0b\u9762\u6dfb\u52a0\u53c2\u6570\n```shell script\nxserver-command=X -bs -core -nocursor\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e5d\u3001\u667a\u80fd\u81ea\u52a8\u5316\u7684\u610f\u4e49","text":"1\u3001\u6539\u5584 Acessibility \u5b9a\u4f4d\u7684\u7a33\u5b9a\u6027\u95ee\u9898 Acessibility \u5c5e\u6027\u5b9a\u4f4d\u5b58\u5728\u5076\u5c14\u5931\u6548\u7684\u60c5\u51b5 \uff081\uff09\u5f00\u53d1\u5728\u505a\u65b0\u9700\u6c42\u5f00\u53d1\u65f6\u53ef\u80fd\u6d89\u53ca\u5230\u5bf9\u5c5e\u6027\u6807\u7b7e\u7684\u4fee\u6539\u6216\u8005\u5c42\u7ea7\u7684\u8c03\u6574\uff0c\u53ef\u80fd\u9020\u6210\u81ea\u52a8\u5316\u7528\u4f8b\u65e0\u6cd5\u5b9a\u4f4d\u5230\u5143\u7d20\u3002 \u6bd4\u59821040\u9636\u6bb5\uff0c\u97f3\u4e50\u91cd\u6784\u7684\u65f6\u5019\uff0c\u5f00\u53d1\u5bf9\u90e8\u5206\u5c5e\u6027\u548c\u5c42\u7ea7\u505a\u4e86\u4fee\u6539\uff0c\u5bfc\u81f4\u81ea\u52a8\u5316\u7528\u4f8b\u5b9a\u4f4d\u65b9\u6cd580%\u9700\u8981\u4fee\u6539\u3002 \u5f00\u53d1\u65b0\u529f\u80fd\u7684\u65f6\u5019\u5076\u5c14\u4e5f\u4f1a\u5bf9\u5c5e\u6027\u505a\u8c03\u6574\uff0c\u9047\u52305\u6b21\u3002 \uff082\uff09\u76ee\u524d\u4e3b\u8981\u4f7f\u7528Dogtail\u8bc6\u522b\u5e94\u7528Acessibility\u5c5e\u6027\u8fdb\u884c\u5b9a\u4f4d\uff0c\u662f\u83b7\u53d6\u5e94\u7528\u5f53\u524d\u754c\u9762\u7684\u5c5e\u6027tree\uff0c\u5728\u5e94\u7528\u8df3\u8f6c\u540e\uff0cDogtail\u5b58\u5728\u65e0\u6cd5\u53ca\u65f6\u83b7\u53d6\u5f53\u524d\u5c5e\u6027\u5217\u8868\u7684\u60c5\u51b5\u3002 \u591a\u5a92\u4f53\u8c03\u7528\u6587\u7ba1\u7a97\u53e3\u7684\u65f6\u5019\uff0c\u51fa\u73b0\u627e\u4e0d\u5230\u6587\u7ba1\u91cc\u9762\u5143\u7d20\u7684\u60c5\u51b5\uff0c\u76ee\u524d\u51fa\u73b010+\u6b21\u3002 \u5e94\u7528\u8bbe\u7f6e\u9875\u9762\u7684\u5c5e\u6027\u5076\u5c14\u5b58\u5728\u627e\u4e0d\u5230\u7684\u60c5\u51b5\uff0c\u9047\u52305\u6b21\u3002 \uff083\uff09Dogtail\u5de5\u5177\u672c\u8eab\u5b58\u5728\u95ee\u9898\uff0c\u6709\u65f6\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u5019\u5f88\u6162\uff0c\u8ba9\u4eba\u65e0\u6cd5\u63a5\u53d7\uff0c\u76ee\u524d\u51fa\u73b0\u8fc7\u5f88\u591a\u6b21\u3002 \u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u95f4\u6bd4\u5e73\u5e38\u61623\u500d\uff0c\u51fa\u73b04\u6b21\u3002 2\u3001\u89e3\u51b3\u4e86\u4f7f\u7528\u7edd\u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898 \u90e8\u5206\u63a7\u4ef6\u65e0\u6cd5\u6dfb\u52a0 Acessibility \u5c5e\u6027\u4ece\u800c\u4f7f\u7528\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u51fa\u73b0\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898\u3002 \uff081\uff09\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u65b9\u6cd5\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u76ee\u6807\u56fe\u7247\u8d44\u6e90\uff0c\u5728 UI \u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u4f1a\u6d89\u53ca\u5230\u76ee\u6807\u8d44\u6e90\u7684\u66ff\u6362\uff0c\u6bd4\u8f83\u8017\u8d39\u4eba\u529b\u3002 \uff082\uff09\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6cd5\u5bf9\u6bd4\u7cbe\u5ea6\u6bd4\u8f83\u641e\uff0c\u5982\u679cUI \u7684\u53d8\u66f4\u4f1a\u9020\u6210\u65e0\u6cd5\u51c6\u786e\u5b9a\u4f4d\u5230\uff0c\u81ea\u52a8\u5316\u811a\u672c\u5065\u58ee\u6027\u4e0d\u8db3\u3002 3\u3001\u4f7f\u7528\u673a\u5668\u5206\u79bb\uff0c\u89e3\u51b3\u4e86\u81ea\u52a8\u5316\u811a\u672c\u5bf9\u5e94\u7528\u7684\u5f71\u54cd\uff0c\u771f\u5b9e\u8fd8\u539f\u7528\u6237\u7684\u4f7f\u7528\u573a\u666f \u673a\u5668\u5206\u79bb\u7684\u67b6\u6784\u8bbe\u8ba1\uff0c\u4fdd\u8bc1\u4e86\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u73af\u5883\u5b8c\u5168\u7b49\u540c\u4e8e\u7528\u6237\uff0c\u6392\u9664\u6d4b\u8bd5\u811a\u672c\u7684\u5f71\u54cd\u3002 \uff081\uff09\u76ee\u524d\u7684\u529f\u80fd\u81ea\u52a8\u5316\u662f\u5728\u6d4b\u8bd5\u673a\u4e0a\u76f4\u63a5\u8fd0\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\uff0c\u52a0\u4e0a\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u6211\u4eec\u6dfb\u52a0\u4e86\u4e00\u4e9b\u8fdb\u7a0b\u76d1\u63a7\u3001\u89c6\u9891\u5f55\u5236\u7b49\u529f\u80fd\uff0c\u81ea\u52a8\u5316\u811a\u672c\u672c\u8eab\u4f1a\u6d88\u8017\u4e00\u4e9b\u7cfb\u7edf\u8d44\u6e90\uff0c\u65e0\u6cd5\u8fd8\u539f\u771f\u662f\u7684\u7528\u6237\u4f7f\u7528\u573a\u666f\u3002 \uff082\uff09\u6027\u80fd\u6d4b\u8bd5\u9700\u8981\u6392\u9664\u5176\u4ed6\u7a0b\u5e8f\u7684\u8d44\u6e90\u6d88\u8017\u5f71\u54cd\uff0c\u6027\u80fd\u81ea\u52a8\u5316\u91c7\u7528\u673a\u5668\u5206\u79bb\uff0c\u4fdd\u8bc1\u4e86\u6027\u80fd\u6570\u636e\u7684\u51c6\u786e\u6027\u3002 \u4ee5\u524d\u7684\u7528\u4f8b\u6267\u884c\u8017\u65f6\u6ca1\u6761\u572830\u79d2\u5de6\u53f3\uff0c\u73b0\u5728\u7528\u4f8b\u8017\u65f6\u572810\u79d2\u3002 4\u3001\u89e3\u51b3\u4e86UI \u8c03\u6574\u5bfc\u81f4\u5b9a\u4f4d\u5931\u8d25\u7684\u4e0d\u7a33\u5b9a\u6027\u95ee\u9898 \uff081\uff09\u89e3\u51b3\u4e86\u56e0 UI \u8c03\u6574\u5bfc\u81f4\u63a7\u4ef6\u4f4d\u7f6e\u53d8\u5316\u6216\u8272\u5dee\u53d8\u5316\u540e\u5b9a\u4f4d\u4e0d\u51c6\u786e\u7684\u95ee\u9898\uff0c\u53ea\u8981\u63a7\u4ef6\u6587\u6848\u548c\u63a7\u4ef6\u5916\u8fb9\u6846\u65e0\u53d8\u5316\u5747\u53ef\u51c6\u786e\u5b9a\u4f4d\uff1b \uff082\uff09\u76ee\u524d\u4e5f\u4f1a\u91c7\u7528\u57fa\u4e8eUI\u7684\u5b9a\u4f4d\u65b9\u6848\uff0c\u5982\u679cUI\u4f4d\u7f6e\u6709\u8c03\u6574\uff0c\u4f1a\u5bfc\u81f4\u5143\u7d20\u65e0\u6cd5\u5b9a\u4f4d\u3002 5\u3001\u7b80\u5316\u4e86\u7528\u4f8b\u7ed3\u6784\uff0c\u63d0\u5347\u7f16\u5199\u53cb\u597d\u5ea6 \uff081\uff09\u667a\u80fd\u81ea\u52a8\u5316\u8bc6\u522b\u5143\u7d20\u7684\u65b9\u6cd5\u53ea\u6709\u4e00\u4e2a\uff0c\u5c31\u662f\u57fa\u4e8e\u6211\u4eec\u8bad\u7ec3\u7684\u6a21\u578b\u8bc6\u522b\u89c6\u9891\u6d41\u4e2d\u7684\u5143\u7d20\uff0c\u7ecf\u8fc7\u811a\u672c\u5c01\u88c5\u4e4b\u540e\uff0c\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u4e2d\u6240\u6709\u5b9a\u4f4d\u7684\u64cd\u4f5c\u90fd\u53ea\u9700\u8981\u8c03\u7528\u8fd9\u4e00\u4e2a\u65b9\u6cd5\u5c31\u884c\u4e86\uff0c\u7f16\u5199\u81ea\u52a8\u5316\u811a\u672c\u7684\u96be\u5ea6\u5927\u5927\u964d\u4f4e\u3002 \uff082\uff09\u4e5f\u662f\u7531\u4e8e\u8c03\u7528\u65b9\u6cd5\u7b80\u5355\uff0c\u5728 UI \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u4e2d\u7684\u5206\u5c42\u7ed3\u6784\u5c06\u4f1a\u51cf\u5c11\uff0c\u591a\u7ee7\u627f\u7684\u60c5\u51b5\u4f1a\u51cf\u5c11\uff0c\u81ea\u52a8\u5316\u4ee3\u7801\u7684\u8c03\u7528\u7ed3\u6784\u4e5f\u4f1a\u53d8\u5f97\u7b80\u5355\uff0c\u800c\u4e14\u529f\u80fd\u6d4b\u8bd5\u540c\u5b66\u7f16\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u66f4\u52a0\u5bb9\u6613\u4e0a\u624b\u3002 \u4ee5\u524d\u5199\u7528\u4f8b\u7531\u4e8e\u9700\u8981\u7ed3\u5408\u4e0d\u540c\u7684\u6a21\u5757\uff0c\u8c03\u7528\u4e0d\u540c\u7684\u65b9\u6cd5\uff0c\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u5e76\u5b8c\u6210\u8c03\u8bd5\u7684\u65f6\u95f4\u5e73\u5747\u572820-30\u5206\u949f\uff0c\u73b0\u5728\u5199\u7528\u4f8b\u811a\u672c\u80fd\u57285\u5206\u949f\u5de6\u53f3\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":"# =============================================\n# Attribution : Application Test Department III\n# Time : 2023/1/3\n# Author : ut003281\n# =============================================\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u7b80\u8ff0","text":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5 \u901a\u8fc7\u81ea\u52a8\u5316\u624b\u6bb5\u5bf9\u5e94\u7528\u8fdb\u884c\u6027\u80fd\u6d4b\u8bd5\uff0c\u63d0\u4f9b\u65b9\u4fbf\u7684\u73af\u5883\u90e8\u7f72\u3001\u8fd0\u884c\u914d\u7f6e\u3001\u7528\u4f8b\u7f16\u5199\u7b49\uff0c\u7528\u4e8e\u684c\u9762\u5e94\u7528\u7684\u51b7\u70ed\u542f\u52a8\u3001\u8d44\u6e90\u62f7\u8d1d\u3001\u9875\u9762\u8df3\u8f6c\u7b49\u6027\u80fd\u573a\u666f\u6d4b\u8bd5\u3002 \u4ed3\u5e93\u5730\u5740\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-perf-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u4ee3\u7801\u7ed3\u6784","text":"autotest-perf-aitest\n\u251c\u2500\u2500 apps # \u5b58\u653e\u6240\u6709\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u811a\u672c\n\u251c\u2500\u2500 conftest.py # pytest hook\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 CURRENT # \u7248\u672c\u5185\u5bb9\n\u251c\u2500\u2500 docs # \u6587\u6863\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u952e\u503c\u5bf9\u7167\u8868.pdf # \u4e32\u53e3\u7ebfcode\u4e0e\u6309\u952e\u7684\u5bf9\u7167\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u6027\u80fd\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\u6267\u884c\u5668\u4f7f\u7528\u6307\u5357.md # \u6267\u884c\u5668\u811a\u672c\u4f7f\u7528\u6307\u5357\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 USB\u4e32\u53e3\u8f6cUSB\u952e\u76d8\u9f20\u6807\u7ebf\u534f\u8bae\u6587\u4ef6V1.0.pdf # \u4e32\u53e3\u534f\u8bae\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput-0.28.2.zip # Linux\u4e0b\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\u7684\u6e90\u7801\uff0c\u53ef\u6839\u636e\u67b6\u6784\u6253\u5305\n\u251c\u2500\u2500 manage.py # \u529f\u80fd\u4e3b\u5165\u53e3\n\u251c\u2500\u2500 pytest.ini # pytst \u914d\u7f6e\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 setting # \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 client.ini # \u6d4b\u8bd5\u673a IP \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5168\u5c40\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dev_env.sh # \u5bbf\u4e3b\u673a\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose_no_relay.yml # \u65e0\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose.yml # \u6709\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker_login.sh # docker \u767b\u9646\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 res\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 black.png # \u5168\u9ed1\u56fe\u7247\uff0c\u7528\u4e8e\u4fee\u6539\u58c1\u7eb8\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_5000.deb # 3A5000 \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_amd64.deb # amd \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_arm64.deb # arm \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_mips64.deb # mips \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_sw_64.deb # sw \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 server.ini # \u670d\u52a1\u5668\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 setup.sh # \u5bb9\u5668\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 template # \u521b\u5efa app \u57fa\u7840\u811a\u672c\u6a21\u677f\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 app_template\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ${app_name}_widget.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 control-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 images\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 test_${app_name}_01_scene.json-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 test_${app_name}_01_scene.py-tpl\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 uos_docker # \u5bb9\u5668\u73af\u5883\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dockerfile\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 requirements.txt\n\u2514\u2500\u2500 src\n \u251c\u2500\u2500 analysis_save.py # \u89e3\u6790\u56fe\u7247\u6d41\u7ed3\u679c\uff0c\u6c47\u603b\u751f\u6210 excel \u62a5\u544a\n\u251c\u2500\u2500 base_widget.py # \u5c01\u88c5\u7684\u57fa\u7840\u64cd\u4f5c\uff0c\u5e94\u7528\u8c03\u7528\u7684\u4e3b\u5165\u53e3\u65b9\u6cd5\n\u251c\u2500\u2500 cmdctl.py # \u8c03\u7528\u547d\u4ee4\u884c\u4f7f\u7528\n\u251c\u2500\u2500 global_value.py # \u5168\u5c40\u53d8\u91cf\n\u251c\u2500\u2500 image_utils.py # \u56fe\u7247\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 __init__.py\n \u251c\u2500\u2500 logger_utils.py # \u65e5\u5fd7\u914d\u7f6e\n\u251c\u2500\u2500 pdocr.py # ocr \u914d\u7f6e\n\u251c\u2500\u2500 public_method.py # \u4e00\u4e9b\u65b9\u4fbf\u7684\u5c01\u4f4f\n\u251c\u2500\u2500 record.py # \u5f55\u5c4f\u76f8\u5173\n\u251c\u2500\u2500 rtk # \u8fd0\u884c\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 _base.py # \u4e00\u4e9b\u679a\u4e3e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 install_env.py # \u5b89\u88c5\u73af\u5883\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 local_runner.py # \u8fd0\u884c\u7528\u4f8b\n\u251c\u2500\u2500 serial_communication # \u4e32\u53e3\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 power_control.py # \u7ee7\u7535\u5668\u64cd\u4f5c\uff0c\u4f7f\u7528\u7ee7\u7535\u5668\u8fde\u63a5\u4e3b\u673a\u7535\u6e90\uff0c\u63a7\u5236\u5f00\u5173\u673a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 serial_common.py # \u4e32\u53e3\u516c\u5171\u65b9\u6cd5\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 usb_mk.py # \u952e\u9f20\u64cd\u4f5c\u57fa\u7840\u5c01\u88c5\n\u251c\u2500\u2500 shortcut_key.py # \u5feb\u6377\u952e\u7684\u5c01\u88c5\n\u251c\u2500\u2500 singleton.py # \u5355\u4f8b\u6a21\u5f0f\n\u251c\u2500\u2500 start_app.py # \u521b\u5efa app\n\u2514\u2500\u2500 write_xlsx.py # \u751f\u6210 excel\n# __init__.py \u6587\u4ef6\u4e3a\u6807\u8bc6\u8be5\u76ee\u5f55\u662f\u4e00\u4e2aPython\u7684\u6a21\u5757\u5305\uff0c\u9879\u76ee\u4e2d\u7684__init__.py\u5747\u4e3a\u7a7a\u6587\u4ef6\u3002\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u73af\u5883\u642d\u5efa","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\u3002 \u670d\u52a1\u7aef\u4e00\u53f0\u3002\uff08\u4ec5\u652f\u6301 AMD \u67b6\u6784\uff0c\u82e5\u9700\u5176\u4ed6\u67b6\u6784\uff0c\u54a8\u8be2\u76f8\u5173\u5f00\u53d1\u4eba\u5458\uff09 \u91c7\u96c6\u76d2\u4e00\u4e2a\u3002 \uff08ACASIS HDMI \u89c6\u9891\u91c7\u96c6\u76d2\uff0chttps://item.jd.com/100013302599.html#crumb-wrap \uff09 USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\u3002\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"\uff082\uff09\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\u3002 USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff08USB3.0 \u63a5\u53e3\u4e0a\uff09\u3002 \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5 USB \u5ef6\u957f\u7ebf\u3002 \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u670d\u52a1\u7aef\u63a8\u8350\u914d\u7f6e","text":"\u914d\u7f6e\u8d8a\u9ad8\uff0c\u89e3\u6790\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"2\u3001\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa","text":" \u6253\u5f00\u63a7\u5236\u4e2d\u5fc3\uff0c\u8d26\u6237\u8bbe\u7f6e\u4e3a\u3010\u81ea\u52a8\u767b\u5f55\u3011\u548c\u3010\u65e0\u5bc6\u7801\u767b\u5f55\u3011\uff0c\u7535\u6e90\u7ba1\u7406\u4e2d\u4f7f\u7528\u7535\u6e90\u5168\u90e8\u8bbe\u7f6e\u4e3a\u3010\u4ece\u4e0d\u3011\uff0c\u5f00\u542f\u5f00\u53d1\u8005\u6a21\u5f0f\u3002 \u6839\u636e\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u8981\u6c42\uff0c\u5bfc\u5165\u76f8\u5173\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\uff1a\u5bfc\u5165\u76f8\u518c\u3001\u5f71\u9662\u3001\u97f3\u4e50\u7684\u6d4b\u8bd5\u8d44\u6e90\u3002 \u5728\u670d\u52a1\u7aef\u6253\u5f00\u76f8\u673a\u5e94\u7528\u540e\uff0c\u5c06\u6d4b\u8bd5\u673a\u684c\u9762\u58c1\u7eb8\u66f4\u6362\u4e3a\u7eaf\u8272\u58c1\u7eb8\uff08\u6ce8\u610f\uff0c\u670d\u52a1\u7aef\u9700\u63d0\u524d\u5f00\u542f\u76f8\u673a\u540e\u518d\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u58c1\u7eb8\uff0c\u5efa\u8bae\u7eaf\u9ed1\u58c1\u7eb8 setting/res/black.png\uff09 \u5728\u6587\u4ef6\u7ba1\u7406\u5668\u4e2d\uff0c\u5c06\u9009\u9879 \u4e3b\u83dc\u5355-\u8bbe\u7f6e-\u9884\u89c8-\u56fe\u7247\u9884\u89c8 \u53d6\u6d88\u52fe\u9009\uff08\u5982\u4e0d\u53d6\u6d88\uff0c\u4f1a\u5f71\u54cd\u622a\u56fe\u5f55\u5c4f\u5e94\u7528\u7684\u6027\u80fd\u6570\u636e\uff09 \u79fb\u52a8\u6216\u5220\u9664\u7cfb\u7edf Logo \uff0c\u6392\u9664\u684c\u9762\u53f3\u4e0b\u89d2 Logo \u7684\u5f71\u54cd\uff08\u91cd\u542f\u751f\u6548\uff09\u3002 sudo mv /usr/share/deepin/uos_logo.svg ~/Pictures/\n \u5b89\u88c5\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\uff08\u5fc5\u987b\u5b89\u88c5\uff01\uff01\uff09 AMD \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_amd64.deb ARM \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_arm64.deb MIPS \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_mips64.deb 3A5000 \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_5000.deb \u5b89\u88c5\u547d\u4ee4 sudo dkpg -i xserver-xorg-input-libinput_0.28.2-2_amd64.deb\n \u5b89\u88c5\u65f6\u4f1a\u63d0\u793a\u5df2\u5b58\u5728\u76f8\u540c\u7248\u672c\uff0c\u8bf7\u5ffd\u7565\uff0c\u76f4\u63a5\u8986\u76d6\u5b89\u88c5\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u4e3b\u673a\u624d\u751f\u6548"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u670d\u52a1\u7aef\u4e00\u952e\u73af\u5883\u90e8\u7f72","text":"\u73af\u5883\u642d\u5efa\u524d\u5fc5\u987b\u5148\u8fde\u63a5\u4e0a USB \u4e32\u53e3\u7ebf\u548c\u91c7\u96c6\u76d2\u3002 \u5bbf\u4e3b\u673a\u73af\u5883\u5b89\u88c5 python3 manage.py install --env host\n \u5bb9\u5668\u73af\u5883\u5b89\u88c5 python3 manage.py install --env docker\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u56db\u3001\u914d\u7f6e\u9879","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u670d\u52a1\u7aef\u914d\u7f6e","text":"setting/config/server.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u914d\u7f6e\u9879\uff0c\u5305\u542b\u4e86\u6240\u6709\u670d\u52a1\u7aef\u6240\u6709\u7684\u53ef\u914d\u7f6e\u9879\u3002 \u672c\u5730\u65e0\u7f51\u7edc\u8fd0\u884c \u5c06\u914d\u7f6e\u9879 network=0 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u672c\u5730\u6709\u7f51\u7edc\u8fd0\u884c \u914d\u7f6e\u9879 network=1 (1)\u914d\u7f6e\u9879 client_alias= \u914d\u7f6e\u4e3a\u4f60\u8981\u6d4b\u8bd5\u7684\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5982 Alias1 \u6d4b\u8bd5\u673a\u522b\u540d\u5728 setting/config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 (2)\u914d\u7f6e\u9879 client_alias= \u4e3a\u7a7a\uff0c\u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager --client_alias Alias1\uff0c\u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002(Alias1 \u4e3a\u4f60\u914d\u7f6e\u7684\u6d4b\u8bd5\u673a\u522b\u540d) (1)\u548c(2)\u53ea\u8981\u4f7f\u7528\u5176\u4e00\u5373\u53ef\u3002 \u6709\u7f51\u7edc\u8fd0\u884c\uff0c\u4e14\u9700\u8981\u901a\u8fc7 Jenkins \u4e0a\u8fd0\u884c\u4e00\u4e2a job \uff0c\u540c\u65f6\u63a7\u5236\u591a\u53f0\u673a\u5668\u3002 \u914d\u7f6e\u9879 network=1 \u914d\u7f6e\u9879 client_alias= \u4e0d\u7528\u914d\u7f6e\uff0c\u5728\u8fd0\u884c run.sh \u7684\u65f6\u5019\u76f4\u63a5\u7a7a\u683c\u52a0\u522b\u540d\u5373\u53ef\uff0c\u6bd4\u5982\uff1a\u6d4b\u8bd5\u673a\u522b\u540d\u4e3a Alias1 \uff0c\u4e14\u5df2\u7ecf\u5728 config/client.ini \u4e2d\u914d\u7f6e\u4e86 Alias1 \u7684user ip password \uff0c\u5219\u8fd0\u884c bash run.sh Alias1 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u5728 Jenkins pipeline \u91cc\u9762\u901a\u8fc7\u5e76\u884c stage \u6216\u5e76\u884c\u8c03\u7528\u4e0b\u5c42\u4efb\u52a1\u7684\u65b9\u5f0f\u53ef\u4ee5\u5b9e\u73b0\u5927\u89c4\u6a21\u7684\u6027\u80fd\u6d4b\u8bd5\u9700\u6c42\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;1\u3001KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2\u3001KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f, e.g. TAGS = L1 or smoke\n[case_conf]\n# \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\uff0cocr\u6587\u6848\u8bc6\u522b\u8f83\u6162\uff0c\u4e0d\u63a8\u8350\u4f7f\u7528\nfind_by = stage\n# \u6700\u540e\u4e00\u4e2a\u7a33\u5b9a\u9636\u6bb5\u7684\u5e27\u6570\u8bc6\u522b\n# \u9996\u5e27\u5b58\u5728\u540e\u7684\u7b2c\u4e00\u4e2a\u5927\u4e8e\u8be5\u914d\u7f6e\u5e27\u6570\u7684\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u5c3e\u5e27\nfinal_stable_num=100\n# \u4ece\u8be5\u5e27\u6570\u5f00\u59cb\u8bc6\u522b\u6587\u6848\u6216\u56fe\u7247\uff0c\u51cf\u5c11\u5206\u6790\u65f6\u95f4\nstart_num = 150\n# \u8bc6\u522b\u7684\u6587\u6848\ntext=\n# \u8bc6\u522b\u56fe\u7247\nmatch=apps/xxx/images/match.png\n# \u8bc6\u522b\u76f8\u4f3c\u5ea6\nmatch_rate=0.9\n# \u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6bd4\u5982\u70ed\u542f\u52a8\u7528\u4f8b\uff0c\u4ece\u70b9\u51fb\u6253\u5f00\u5230\u505c\u6b62\u5f55\u5c4f\uff0c\u4e2d\u95f4\u7b49\u5f855\u79d2\uff1b\nduration = 15\n# \u5355\u6761\u7528\u4f8b\u6267\u884c\u7684\u6b21\u6570\ncount = 5\n# \u7a33\u5b9a\u9636\u6bb5\u5212\u5206\u7684\u76f8\u4f3c\u5ea6\nstable_similarity = 0.9997\n[server]\n# \u8c03\u8bd5\u6a21\u5f0f=1\uff0c\u4e3a\u5f00\u542f\u8c03\u8bd5\u6a21\u5f0f\uff0c0\u4e3a\u5173\u95ed\u3002\n# \u8c03\u8bd5\u6a21\u5f0f\u4e0b\u9ed8\u8ba4\u53ea\u6267\u884c\u4e00\u6b21\u7528\u4f8b\uff0c\u4e0d\u5173\u673a\n# \u7f16\u5199\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u5efa\u8bae\u5f00\u542fmaintain\u3002\nMAINTAIN = 0\n# \u8fd0\u884c\u7684\u73af\u5883docker\u5bb9\u5668\u73af\u5883\uff0chost\u5bbf\u4e3b\u673a\u73af\u5883\nENV = docker\n# \u670d\u52a1\u7aef\u5bc6\u7801\nPASSWORD=1\n# \u6307\u5b9a\u6d4b\u8bd5\u673a\u522b\u540d\n# \u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6bd4\u5982\uff1a\n# [AMD]\n# ip=10.8.15.86\n# user=uos\n# \u5176\u4e2d AMD \u4e3a\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5219client_alias=AMD\nCLIENT_ALIAS = x86\uff08Intel-i7\uff09\n# 1 \u5f00\u542f\u7f51\u7edc, 0 \u5173\u95ed\u7f51\u7edc\n# \uff081\uff09\u670d\u52a1\u7aef\u4e0e\u6d4b\u8bd5\u673a\u987b\u5728\u540c\u4e00\u7f51\u6bb5\u4e0b\uff0c\u4f60\u53ef\u4ee5\u5c1d\u8bd5\u5728\u670d\u52a1\u7aef\u901a\u8fc7ssh\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c\u5982\u679c\u53ef\u4ee5\u8fde\u63a5\uff0c\u8bf4\u660e\u7f51\u7edc\u6b63\u5e38\u3002\n# \uff082\uff09\u5f53input_type=FILE_NAME \u65f6\uff0c\u5fc5\u987b\u5f00\u542f\u7f51\u7edc\u3002\nNETWORK = 1\n# \u6027\u80fd\u7ed3\u679c\u7edf\u8ba1\u5355\u4f4d \u6beb\u79d2\u2014ms, \u79d2\u2014s\nUNIT=ms\n# \u6d4b\u8bd5\u673a\u5f00\u673a\u8fdb\u5165\u684c\u9762\u540e\u7b49\u5f85\u65f6\u95f4,\u5355\u4f4d/\u79d2\nSTARTUP_DELAY = 60\n# 1\u4e3a\u5220\u9664\u7f13\u5b58\uff0c0\u4e3a\u4e0d\u5220\u9664\u7f13\u5b58\n# \u7528\u4f8b\u6267\u884c\u5b8c\u540e\u4f1a\u5728report\u76ee\u5f55\u4e0b\u751f\u6210\u667a\u80fd\u89e3\u6790\u7684\u4e00\u4e9b\u7f13\u5b58\u56fe\u7247\u3002\nCACHE = 0\n# \u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u62a5\u544a\u4f1a\u4fdd\u5b58\u5728\u9879\u76ee\u4e0breport\u76ee\u5f55\u4e2d\uff1b\n# \u6307\u5b9a\u62a5\u544a\u76ee\u5f55\u5219\u5b58\u653e\u5230\u6307\u5b9a\u76ee\u5f55\u3002\nREPORT_PATH = report\n# \u670d\u52a1\u7aef\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684icon\u8d44\u6e90\u4f1a\u7f13\u5b58\u5728\u9879\u76ee\u4e0binput\u76ee\u5f55\u4e2d\nINPUT = input/\n# 1\u4e3a\u6d4b\u8bd5\u5b8c\u5173\u673a\uff0c0\u4e3a\u6d4b\u8bd5\u5b8c\u4e0d\u5173\u673a\nSHUTDOWN = 0\n# \u89e3\u6790\u8fdb\u7a0b\u6570\uff08\u4e0d\u63a8\u8350\u4fee\u6539\uff09\n# 3\u4e2a\u8fdb\u7a0b\u89e3\u6790\u89c6\u9891\u5df2\u7ecf\u80fd\u591f\u6ee1\u8db3\uff0c\u5373\u4f7f\u589e\u52a0\u8fdb\u7a0b\u6570\u4e5f\u4e0d\u80fd\u51cf\u5c11\u6574\u4f53\u8017\u65f6\n# \u53e6\u5916\u8fd8\u8981\u770bCPU\u6838\u6570\u662f\u5426\u652f\u6301\u3002\nPARSING_PROCESS = 3\n# 1\u4e3a\u4f7f\u7528\u7ee7\u7535\u5668\u5f00\u5173\u673a\uff0c0\u4e3a\u4f7f\u7528reboot\u547d\u4ee4\u91cd\u542f\u3002\u4f9d\u8d56\u7ee7\u7535\u5668\u786c\u4ef6\u8bbe\u5907\uff0c\u9700\u8981\u4f7f\u7528\u8054\u7cfb\u5f00\u53d1\u8005\nRELAY = 0\n# \u83b7\u53d6\u6d4b\u8bd5\u5e94\u7528\u7684\u7248\u672c, %s \u5360\u4f4d\u5e94\u7528\u540d\n# \u5982\u679c\u8be5\u914d\u7f6e\u4e3a\u7a7a\uff0c\u5219\u4e0d\u83b7\u53d6\u5e94\u7528\u7684\u7248\u672c\u4fe1\u606f\u3002\nCOMMAND = apt policy %s 2>/dev/null|grep \"\u5df2\u5b89\u88c5\"|awk -F \"\uff1a\" \"{print \\$2}\"\n# \u5173\u673a\u7b49\u5f85\u5f00\u542f\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6839\u636e\u6d4b\u8bd5\u673a\u6027\u80fd\u4e0d\u540c\uff0c\u5f00\u5173\u673a\u8017\u65f6\u53ef\u80fd\u4e0d\u540c\uff0c\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u673a\u60c5\u51b5\u914d\u7f6e\u3002\nSHUTDOWN_DELAY = 30\n# \u53ef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u56fe\u7247\u683c\u5f0f\uff0c\u4ee5\u82f1\u6587\u9017\u53f7\u9694\u5f00\u3002\n# \u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u76ee\u524d\u6211\u4eec\u4ec5\u9a8c\u8bc1\u4e86jpg,jpeg,png\u8fd9\u4e09\u79cd\u5e38\u7528\u7684\u56fe\u7247\u683c\u5f0f\u3002\nINPUT_TYPES = jpg,jpeg,png\n# \u6027\u80fd\u5206\u6790\u8865\u5e27\uff0c\u7b49\u4e8e\u6216\u4f4e\u4e8e\u8be5\u503c\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u9700\u8981\u51cf\u6389\u3002\nUN_STAB_START = 3\n# \u670d\u52a1\u7aef\u83b7\u53d6\u6d4b\u8bd5\u673a\u56fe\u50cf\u7684\u5e27\u7387\uff0c\u5373\u6bcf\u79d2\u83b7\u53d6\u591a\u5c11\u5f20\u6d4b\u8bd5\u673a\u4e0a\u7684\u56fe\u50cf\u3002\n# \u9ed8\u8ba4\u5e27\u7387\u4e3a30\u5e27/\u79d2\uff0c\u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u53ef\u80fd\u4f1a\u5bf9\u89e3\u6790\u7ed3\u679c\u9020\u6210\u504f\u5dee\u3002\nFPS = 30\n# \u4ee5\u4e0b\u573a\u666f\u7c7b\u578b\u4f1a\u91cd\u542f\u6d4b\u8bd5\u673a,\u591a\u79cd\u573a\u666f\u4f7f\u7528\u9017\u53f7\u9694\u5f00\nSCENE = cold\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = http://10.8.13.78:8890\n#\u5c4f\u5e55\u56fe\u7247\u4e34\u65f6\u5b58\u653e\u4f4d\u7f6e\nSCREEN_CACHE = /tmp/screen\n# =======================================\n[log]\n# \u65e5\u5fd7\u7ea7\u522b\uff0cOFF\u3001FATAL\u3001ERROR\u3001WARN\u3001INFO\u3001DEBUG\u3001ALL\n# \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u65e5\u5fd7\u8f93\u51fa\uff0clog_cli=INFO\u8868\u793a \u4ec5\u8f93\u51faINFO\u53ca\u4ee5\u4e0a\u7ea7\u522b\u7684\u65e5\u5fd7\u3002\nLOG_LEVEL = DEBUG\n# \u65e5\u5fd7\u6587\u4ef6\u4fdd\u5b58\u8def\u5f84\nLOG_PATH= logs\n# =======================================\n[dockerhub]\n# \u5bb9\u5668\u767b\u9646\u8d26\u53f7\nDOCKER_USER = user\n# \u5bb9\u5668\u767b\u9646\u5bc6\u7801\nDOCKER_PASSWORD = User1234\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u6d4b\u8bd5\u673a\u914d\u7f6e","text":"setting/config/client.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u4fe1\u606f\u3002 \u6709\u7f51\u7edc\u7684\u60c5\u51b5\u4e0b\uff0c\u670d\u52a1\u7aef\u9700\u8981\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u56e0\u6b64\u4f60\u9700\u8981\u5199\u5165 \u6d4b\u8bd5\u673a\u522b\u540d \u3001 user \u3001ip\u3001 password \u3002 # \u6d4b\u8bd5\u673a\u522b\u540d\n[Alias1] # \u6d4b\u8bd5\u673aip\nip=10.8.15.86 # \u6d4b\u8bd5\u673a\u7528\u6237\u540d\nuser=uos\n \u547d\u540d\u5efa\u8bae\uff1aAliasA1\u3001AliasA2\u3001AliasB1\u3001AliasB2\uff0c\u4e0d\u8981\u91cd\u540d\u3002 \u65e0\u7f51\u7edc\u60c5\u51b5\u4e0b\uff0c\u4ec5\u9700\u8981\u5173\u6ce8\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\u9879 width=\u3001 height= \u5373\u53ef\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a [client]\n# \u9ed8\u8ba4\u6d4b\u8bd5\u673a\u7528\u6237\u540d\uff0c\u5bc6\u7801\uff0cip\nip=\nuser=\n# \u6d4b\u8bd5\u673a\u5bc6\u7801\npassword=1\n# \u6d4b\u8bd5\u673a\u4e3b\u9898\ntheme=bloom\n# \u6d4b\u8bd5\u673aicon\u76ee\u5f55\npath=/usr/share/icons\n# \u7cfb\u7edfdesktop\u6587\u4ef6\u7684\u5b58\u653e\u76ee\u5f55\uff0cUOS\u7cfb\u7edf\u9ed8\u8ba4\u4e3a/usr/share/applications\ndesktop_path=/usr/share/applications\n# \u7528\u4e8e\u5224\u65ad\u6d4b\u8bd5\u673a\u662f\u5426\u5f00\u673a\u8fdb\u5165\u684c\u9762\u7684\u8bc6\u522b\u6807\u8bc6\u3002\n# 1\u3001\u901a\u8fc7\u684c\u9762\u56fe\u6807\u8bc6\u522b\u3002\n# - type=FILE_NAME\u65f6\uff0c\u670d\u52a1\u5668\u548c\u6d4b\u8bd5\u673a\u5fc5\u987b\u5728\u540c\u4e00\u5c40\u57df\u7f51\u5185\u3002\n# - power_on=dde-computer\u8868\u793a\u901a\u8fc7\u684c\u9762\u8ba1\u7b97\u673a\u56fe\u6807\u5224\u65ad\u5f00\u673a\u8fdb\u5165\u684c\u9762\u3002\n# 2\u3001\u901a\u8fc7\u672c\u5730\u56fe\u7247\u4f5c\u4e3a\u5f00\u673a\u8bc6\u522b\u3002\n# - type= \u4f20\u5165\u4e3a\u56fe\u7247\u683c\u5f0f\uff0ctype\u652f\u6301\u7684\u7c7b\u578b\u5305\u542b\u5728server.ini\u5185\u914d\u7f6e\u9879input_type=jpg,jpeg,png\u3002\n# - power_on= \u4f20\u5165\u7684\u662f\u672c\u5730\u56fe\u7247\u7684\u8def\u5f84\u3002\ntype=FILE_NAME\npower_on=dde-computer\n# \u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\uff08\u6d4b\u8bd5\u673a\u8fde\u63a5\u91c7\u96c6\u76d2\uff0c\u91c7\u96c6\u76d2\u7684\u5206\u8fa8\u7387\uff09\nheight=1080\nwidth=1920\n[AliasA1] ip=10.8.15.86\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n[AliasA2]\nip=10.8.15.20\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_2","title":"3\u3001\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e","text":"\u968f\u7740\u6d4b\u8bd5\u573a\u666f\u7684\u4e0d\u65ad\u5f15\u5165\uff0c\u53d1\u73b0\u73b0\u6709\u670d\u52a1\u7aef\u91cc\u7684\u914d\u7f6e\u9879\u5e76\u4e0d\u9002\u7528\u4e8e\u6240\u6709\u7684\u6027\u80fd\u573a\u666f\uff0c\u4e8e\u662f\u5c06\u670d\u52a1\u7aef\u914d\u7f6e\u8fdb\u884c\u4e00\u4e2a\u63d0\u53d6\uff0c\u53ef\u505a\u5355\u4e2a\u573a\u666f\u7684\u4e2a\u6027\u5316\u914d\u7f6e\uff0c\u5f53\u7136\u539f\u6765\u7684\u670d\u52a1\u7aef\u914d\u7f6e\u529f\u80fd\u4fdd\u7559\uff0c\u53ea\u662f\u5f53\u4f60\u914d\u7f6e\u4e86\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e\u540e\uff0c\u4f18\u5148\u4f7f\u7528\u4e2a\u6027\u5316\u914d\u7f6e\u91cc\u9762\u7684\u5185\u5bb9\uff0c\u4ee5\u4e0b\u662f\u5bf9\u4e2a\u6027\u5316\u914d\u7f6e\u7684\u4ecb\u7ecd\u3002 \u76ee\u524d\u6bcf\u4e00\u4e2a py \u6587\u4ef6\u5bf9\u5e94\u4e00\u4e2a\u6027\u80fd\u6d4b\u8bd5\u573a\u666f\uff0c\u4e8e\u662f\u5728\u540c\u7ea7\u76ee\u5f55\u4e0b\u521b\u5efa\u4e00\u4e2a\u4e0e\u4e4b\u540c\u540d\u7684 json \u6587\u4ef6\uff0c\u4f5c\u4e3a\u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6 apps\n\u251c\u2500\u2500 album\n \u251c\u2500\u2500 test_album_01_start.json # \u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6\n\u2514\u2500\u2500 test_album_01_start.py # \u6027\u80fd\u573a\u666f\u6587\u4ef6\n \u4ee5\u4e0b\u662f\u5bf9 json \u6587\u4ef6\u4e2d\u914d\u7f6e\u7684\u89e3\u91ca\uff0c\u82e5\u67d0\u9879\u914d\u7f6e\u4e0d\u9700\u8981\uff0c\u53ef\u4ee5\u7f3a\u5931\uff0c\u4f46\u4e0d\u80fd\u4e3a\u7a7a\uff1b {\n\"title\": \"test_album_start\", # \u6807\u9898\uff1b\u5fc5\u987b\n\"app_name\": \"deepin-album\", # \u573a\u666f\u6240\u5c5e\u7684\u5e94\u7528\uff1b\u5fc5\u987b\n\"scene\": \"hot\", # \u573a\u666f\u522b\u540d\uff1b\u5fc5\u987b\n\"icon\": [\"deepin-album\"], # \u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684icon\u5230\u670d\u52a1\u7aef\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\uff1b\u53ef\u7f3a\u5931\n# \u6ce8\u610f\uff1a\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684desktop\u6587\u4ef6\u540d\u4e3adeepin-album.desktop\uff0c\n# \u53ea\u9700\u8981\u5199deepin-album\u5373\u53ef\uff0c\u201c.desktop\u201d\u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002\n\"size\": { # \u56fe\u7247\u5bf9\u6bd4\u7684\u533a\u57df\u8bbe\u7f6e\u9879\uff0c\u67d0\u4e9b\u5e94\u7528\u5f53\u524d\u5c4f\u5e55\u7684\u90e8\u5206\u533a\u57df\u9700\u8981\u5c06\u5176\u53bb\u6389\uff0c\u53ef\u4ee5\u8bbe\u7f6e\u6b64\u9879\uff0c\u5982\u679c\u6ca1\u6709\u5219\u53ef\u4e0d\u5199\uff1b\u53ef\u786e\u5b9e\n\"x-coordinate\": 0, # \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n\"y-coordinate\": 0, # \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n\"width\": 850, # \u6a2a\u5411\u957f\u5ea6\n\"height\": 1920 # \u7eb5\u5411\u9ad8\u5ea6\n},\n\"count\": 5, # \u573a\u666f\u6267\u884c\u7684\u6b21\u6570\uff1b\u5fc5\u987b\n\"duration\": 5, # \u8be5\u6761\u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff0c\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7279\u5b9a\u573a\u666f\uff0c\u8be5\u914d\u7f6e\u4e3a\u53ef\u9009\u9879\uff0c\u8986\u76d6 server.ini \u4e2d\u7684\u914d\u7f6e\uff1b\u53ef\u7f3a\u5931\n\"stable_similarity\": 0.9997, # \u6027\u80fd\u573a\u666f\u5206\u9636\u6bb5\u65f6\u7684\u56fe\u7247\u76f8\u4f3c\u5ea6\u5bf9\u6bd4\uff0c\u524d\u540e\u56fe\u7247\u4f4e\u4e8e\u8be5\u503c\uff0c\u5219\u5206\u4e3a\u4e0d\u7a33\u5b9a\u9636\u6bb5\uff1b\u53ef\u7f3a\u5931\n\"find_by\": \"stage\", # \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\n\"final_stable_num\": 100, # \u67e5\u627e\u6700\u540e\u4e00\u4e2a\u5927\u4e8e\u8be5\u503c\u7684\u7a33\u5b9a\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u7684\u5c3e\u796f\uff1b\u53ef\u7f3a\u5931\n\"start_num\": 150,\n\"text\": \"\", # ocr\u8bc6\u522b\u7684\u6587\u6848\n\"match\": \"apps/xxx/images/match.png\", # \u56fe\u50cf\u5339\u914d\u7684\u56fe\u7247\u6587\u4ef6\u8def\u5f84\n\"match_rate\": 0.9 # \u5339\u914d\u76f8\u4f3c\u5ea6\n}\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e94\u3001\u6d4b\u8bd5\u6d41\u7a0b","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516d\u3001\u7528\u4f8b\u7f16\u5199\u53ca\u65b9\u6cd5\u53c2\u6570\u6307\u5f15","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"1\u3001\u7528\u4f8b\u5b9e\u4f8b\u8bf4\u660e","text":"# \u6807\u51c6\u5e93\u5bfc\u5165\nfrom time import sleep\n# \u5bfc\u5165\u4e09\u65b9\u5e93pytest\nimport pytest\n# \u5bfc\u5165\u7528\u4f8b\u6267\u884c\u8981\u7528\u5230\u7684Widget\u7c7b\nfrom src.base_widget import BaseWidget\nclass TestStart:\n# class\u7ea7\u522b\u7684fixture\uff0c\u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u6267\u884c\u3002autouse=True \u81ea\u52a8\u5728\u5f53\u524d\u4f5c\u7528\u57df\u4e0b\u4f7f\u7528\u3002\n@pytest.fixture(scope=\"class\", autouse=True)\n# \u6d4b\u8bd5\u70ed\u542f\u52a8\u4e4b\u524d\u9700\u8981\u9884\u542f\u52a8\u3002\ndef application_pre_start(self):\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().right_click_element(\"deepin-album\")\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().click_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\")\nsleep(2)\n# \u5feb\u6377\u952e\u5173\u95ed\u7a97\u53e3\nBaseWidget().hot_key(\"alt\", \"f4\")\nsleep(2)\n# \u9ed8\u8ba4\u4e3afunction\u7ea7\u522b\u7684fixture\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\uff0cclass\u7ea7\u522bfixture\u6267\u884c\u4e4b\u540e\u6267\u884c\u3002\n@pytest.fixture(autouse=True)\ndef setup_start(self):\n# \u53f3\u952e\u70b9\u51fb deepin-album \u56fe\u6807\nBaseWidget().right_click_element(\"deepin-album\")\n# \u79fb\u52a8\u5230\u53f3\u952e\u83dc\u5355\u4e2d\u6253\u5f00\uff08open.png\uff09\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().move_to(*BaseWidget().find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))\n# \u7b49\u5f85\u79fb\u52a8\u5b8c\u6210\nsleep(0.5)\ndef test_album_start(self):\n# \u70b9\u51fb\u201c\u6253\u5f00\u201d\nBaseWidget().click() \n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"2\u3001\u65b9\u6cd5\u53c2\u6570\u8bf4\u660e","text":"2.1\u3001find_element \u65b9\u6cd5 def find_element(element: str, input_type: str = \"FILE_NAME\", fill_color_position: tuple = (-1, -1), size: tuple = (25, 70)):\npass\n \u53c2\u6570 element \u548c input_type \uff081\uff09\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u5143\u7d20 - `input_type` \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a `FIEL_NAME` \uff0c\u8868\u793a\u901a\u8fc7\u5e94\u7528 `icon` \u5bfb\u627e\u5143\u7d20\uff0c\u6b64\u65b9\u6cd5\u4f1a\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u5e94\u7528 `icon` \u56fe\u6807\u3002\n \u4e3e\u4f8b\uff1a\u9ed8\u8ba4\u60c5\u51b5\u4e0b input_type \u53c2\u6570\u4e0d\u9700\u8981\u4f20\u5165\uff0c find_element(\"deepin-album\")\uff0c\u8868\u793a\u901a\u8fc7 deepin-album \u7684\u5e94\u7528 icon \u6765\u83b7\u53d6\u5750\u6807\uff0c\u6ce8\u610f\uff0c\u6b64\u65f6\u4f20\u5165\u7684 deepin-album \u53c2\u6570\u5b9e\u9645\u662f desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u548c2.3\u4e2d\u7684 icon \u53d8\u91cf\u4e00\u81f4\u3002 \u6211\u4eec\u5efa\u8bae\u4f18\u5148\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\uff0c\u4f46\u6b64\u65b9\u6cd5\u4f9d\u8d56\u7f51\u7edc\uff0c\u8bf7\u6839\u636e\u6d4b\u8bd5\u73af\u5883\u5b9e\u9645\u60c5\u51b5\u9009\u62e9\u3002 \uff082\uff09\u901a\u8fc7\u672c\u5730\u56fe\u7247\u8bc6\u522b\u5143\u7d20 - \u53c2\u6570 `input_type` \u4f20\u5165\u56fe\u7247\u683c\u5f0f\uff0c\u6bd4\u5982\u622a\u53d6\u7684\u672c\u5730\u56fe\u7247\u683c\u5f0f\u4e3a `png`\uff0c\u90a3\u4e48 `input_type=\"png\"`\uff0c\u6b64\u65f6\u53c2\u6570 `element ` \u4f20\u5165\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5efa\u8bae\u5b58\u653e\u5728\u5bf9\u5e94\u7684\u4ea7\u54c1 `apps/app/picture/` \u76ee\u5f55\u4e0b\uff0c\u8def\u5f84\u4e3a\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u7684\u76f8\u5bf9\u8def\u5f84\u3002\n- \u4e3e\u4f8b\uff1a`find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))`\uff0c\u8868\u793a\u901a\u8fc7\u672c\u5730\u56fe\u7247 `open.png` \u8bc6\u522b\u5143\u7d20\u3002\n \u53c2\u6570 fill_color_position fill_color_position \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (-1, -1)\uff0c(-1, -1) \u8868\u793a\u53d6\u5c4f\u5e55\u4e2d\u53f3\u4e0b\u89d2\u6700\u540e\u4e00\u4e2a\u50cf\u7d20\u70b9\u4f5c\u4e3a\u586b\u5145\u5750\u6807\uff0c\u5728 1920x1080 \u5c4f\u5e55\u5206\u8fa8\u7387\u4e0b\u5373\u5b9e\u9645\u5750\u6807\u4e3a (1919, 1079) \uff0c\u8fd9\u6837\u7684\u5199\u6cd5\u53ef\u4ee5\u9002\u914d\u4e0d\u540c\u5927\u5c0f\u7684\u5c4f\u5e55\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0d\u540c\u65b9\u4f4d\uff1a \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0b\u65b9\uff0c\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u4e0d\u9700\u8981\u4f20\u5165\u8be5\u53c2\u6570\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u5de6\u8fb9\uff0cfill_color_position=(1, 1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u53f3\u8fb9\uff0cfill_color_position=(-1, -1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0a\u8fb9\uff0cfill_color_position=(1, 1) \u4ece\u684c\u9762\u542f\u52a8\u5e94\u7528\uff0c\u5219\u9700\u8981\u4f20\u5165\u9664\u4efb\u52a1\u680f\u4ee5\u5916\u5176\u4ed6\u4f4d\u7f6e\u7684\u5750\u6807\uff0c\u6bd4\u5982(100, 100)\uff0c\u53ea\u8981\u8fd9\u4e2a\u5750\u6807\u4e3a\u9664\u5e94\u7528\u548c\u4efb\u52a1\u680f\u533a\u57df\u90fd\u53ef\u4ee5\u3002 \u4ece\u542f\u52a8\u5668\u91cc\u9762\u542f\u52a8\u5e94\u7528\uff0c\u9700\u8981\u586b\u5145\u7684\u5750\u6807\u4e3a\u542f\u52a8\u5668\u533a\u57df\u3002 \u6ce8\uff1a\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u65f6\uff0c\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684 icon \u539f\u6587\u4ef6\u4e3a svg \u77e2\u91cf\u56fe\uff0c\u8f6c\u6362\u4e3a png \u4e4b\u540e\u9700\u8981\u586b\u5145\u8fb9\u7f18\u900f\u660e\u90e8\u5206\u3002 \u53c2\u6570 size size \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (25, 70)\uff0c\u8868\u793a\u6d4b\u8bd5\u673a\u4e0a dock \u680f\u4e0a\u5e94\u7528\u56fe\u6807\u7684\u5927\u5c0f\u8303\u56f4\u3002 UOS \u7cfb\u7edf dock \u680f\u662f\u53ef\u4ee5\u4e0a\u4e0b\u62d6\u52a8\u5927\u5c0f\u7684\uff0c\u968f\u7740 dock \u680f\u5927\u5c0f\u6539\u53d8\uff0c\u5e94\u7528\u56fe\u6807\u7684\u8303\u56f4\u4e3a25\u523070\u4e4b\u95f4\u3002 \u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u64cd\u4f5c\u7cfb\u7edf\u4e0a dock \u680f\u5927\u5c0f\u4e0d\u4e00\u6837\uff0c\u53ef\u4ee5\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u4f20\u5165\u5927\u5c0f\u8303\u56f4\u3002 2.2\u3001click_element\u3001 right_click_element\uff0c double_click_element \u8fd9\u51e0\u4e2a\u65b9\u6cd5\u53c2\u6570\u89c4\u5219\u4e0e find_element \u65b9\u6cd5\u4e00\u6837\u3002\u4ed6\u4eec\u5b9e\u9645\u4e0a\u662f\u5728 find_element \u65b9\u6cd5\u57fa\u7840\u4e4b\u4e0a\u505a\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u589e\u52a0\u4e86\u9f20\u6807\u7684\u52a8\u4f5c\uff0c\u5982\u679c\u4f60\u4e0d\u60f3\u4f7f\u7528\u8fd9\u51e0\u4e2a\u65b9\u6cd5\uff0c\u5728\u7528\u4f8b\u4e2d\u4e5f\u53ef\u4ee5\u901a\u8fc7 find_element \u83b7\u53d6\u5230\u5750\u6807\uff0c\u7136\u540e\u5c06\u5750\u6807\u4f20\u5165\u5230\u952e\u9f20\u7684\u65b9\u6cd5\u4e2d\uff0c\u53ef\u4ee5\u5b9e\u73b0\u540c\u6837\u7684\u6548\u679c\u3002 2.3\u3001\u7528\u4f8b\u7c7b\u4e2d\u6709\u4e2a\u7c7b\u53d8\u91cf icon = [\"deepin-album\"] \u9700\u8981\u7279\u6b8a\u8bf4\u660e\uff0c\u5217\u8868\u4e2d\u7684\u5143\u7d20\u4e3a\u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709 icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684 icon \u5230\u670d\u52a1\u7aef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528 desktop \u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684 desktop \u6587\u4ef6\u540d\u4e3a deepin-album.desktop\uff0c\u53ea\u9700\u8981\u5199 deepin-album \u5373\u53ef\uff0c.desktop \u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e03\u3001\u6267\u884c\u5165\u53e3","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"1\u3001\u7528\u4f8b\u7ec4\u7ec7","text":"\u5728 setting/config/server.ini \u6587\u4ef6\u4e2d APP_NAME= \u5b57\u6bb5\u4e3a\u7528\u4f8b\u7684\u6267\u884c\u7684\u76ee\u5f55\uff0c\u9ed8\u8ba4\u4e3a apps \u76ee\u5f55\u4e0b\u6240\u6709\u7528\u4f8b\u3002\u5982\u679c\u4f60\u60f3\u6307\u5b9a\u6267\u884c\u67d0\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4f60\u53ef\u4ee5\u5c06\u8be5\u914d\u7f6e\u9879\u6307\u5b9a\u5230\u5e94\u7528\u7684\u7528\u4f8b\u76ee\u5f55\uff0c\u6bd4\u5982\uff1aAPP_NAME=deepin_album\uff0c \u8868\u793a\u6267\u884c\u76f8\u518c\u76ee\u5f55\u4e0b\u7684\u7528\u4f8b\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a python3 manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music\n -k KEYWORDS, --keywords KEYWORDS\n \u7528\u4f8b\u7684\u5173\u952e\u8bcd\n -t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e\n --log_level LOG_LEVEL \u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n --env {host,docker} \u5728\u5bbf\u4e3b\u673a\u6216\u5bb9\u5668\u73af\u5883\u6267\u884c\n --client_alias \u9009\u62e9\u6d4b\u8bd5\u673a\u522b\u540d, \u53ef\u9009\u9879\u4e3aclient.ini\u4e2d\u5df2\u914d\u7f6e, \u9ed8\u8ba4\u503c\u4e3a zx-x86.\n --count \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a python3 manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\" --env docker\n \u6ce8\uff1a\u5728\u5bb9\u5668\u4e2d\u6267\u884c\u65f6\uff0c\u82e5\u5f3a\u5236\u9000\u51fa\uff0c\u5bb9\u5668\u5e76\u4e0d\u4f1a\u505c\u6b62\u8fd0\u884c\uff01"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_9","title":"\u516b\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1json","title":"1\u3001Json \u62a5\u544a","text":"\u81ea\u7814\u89c6\u9891\u89e3\u6790\u5de5\u5177\u4f1a\u5bf9\u5355\u6761\u7528\u4f8b\u6267\u884c\u4e00\u8f6e\u751f\u6210\u4e00\u4e2a json \u6587\u4ef6\uff0c\u5b58\u653e\u4e8e report/{app_name}/{scene}/{run_num} \u76ee\u5f55\u4e0b\uff0c\u547d\u540d\u683c\u5f0f\u4e3a\uff1a report.json json \u5185\u5bb9\u4e3e\u4f8b\uff1a [\n{\n\"Stab1\": {\n\"images\": [1,2...150,151],\n\"startStub\": 0,\n\"type\": \"Stab\"\n}\n},\n{\n\"Stab2\": {\n\"images\": [152,153...169,170],\n\"startStub\": 1,\n\"type\": \"UnStab\"\n}\n},\n{\n\"Stab3\": {\n\"images\": [171,172...300,301],\n\"startStub\": 0,\n\"type\": \"UnStab\"\n}\n}\n]\n \u8bf4\u660e\uff1a Stab \uff1a\u8868\u793a\u89e3\u6790\u8fc7\u7a0b\u4e2d\u4e0d\u540c\u7684\u9636\u6bb5\u3002 images \uff1a\u8868\u793a\u6bcf\u4e00\u5e27\u7684\u56fe\u7247\u5e8f\u53f7\u3002 startStub\uff1a \u4e3a\u8bc6\u522b\u5c3e\u5e27\u7684\u9636\u6bb5\u8868\u793a\uff0c\u5982\u679c \"startStub\": 1 \uff0c\u8bf4\u660e\u5c3e\u5e27\u51fa\u73b0\u5728\u8be5\u9636\u6bb5\u3002 type\uff1a \u4e3a Stab \u6216 UnStab \uff0c\u8868\u793a\u7a33\u5b9a\u9636\u6bb5\u6216\u4e0d\u7a33\u5b9a\u9636\u6bb5\u3002 \u5404\u9636\u6bb5\u6709\u5e27\u6570\u8865\u507f\uff0c\u9ed8\u8ba4\u8865\u507f\u7684\u5e27\u6570\u4e3a 3 \u5e27\uff08\u53ef\u4ee5\u901a\u8fc7 server.ini \u91cc\u9762 un_stab_start=3 \u8fdb\u884c\u914d\u7f6e\uff09\uff0c\u8868\u793a\u5c0f\u4e8e\u7b49\u4e8e 3 \u5e27\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u524d\u540e\u5747\u9700\u8981\u51cf\u6389\u3002 \u5e94\u7528\u542f\u52a8\u9636\u6bb5\u5c31\u662f\u5728 Stab2 \u9636\u6bb5\uff0c\u542f\u52a8\u65f6\u95f4\u4e3a\uff1a171 \u51cf 151 \u518d\u51cf\u6389\u524d\u540e\u8865\u507f\u5e27\u6570 6 \u5e27\uff0c\u5373 14 \u5e27\uff0c\u89c6\u9891\u5e27\u7387 30 \u5e27/\u79d2\uff0c\u56e0\u6b64\u542f\u52a8\u8017\u65f6\u4e3a\uff1a14 * 33 = 462 ms"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2excel","title":"2\u3001Excel \u62a5\u544a","text":"\u6240\u6709\u7528\u4f8b\u6267\u884c\u5e76\u89e3\u6790\u5b8c\u4e4b\u540e\u4f1a report \u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a\u6c47\u603b\u6570\u636e\u7684 Excel \u6587\u4ef6\uff0c\u6587\u4ef6\u540d\u4e3a\uff1a{time}_perf_time.xlsx\u3002 \u6ce8\u610f\uff0creport \u76ee\u5f55\u4e3a\u53ef\u914d\u7f6e\u9879\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u4f1a\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u751f\u6210\uff0c\u5982\u679c\u4f60\u5c06 report\uff0c\u6307\u5b9a\u5230\u9879\u76ee\u4e0b\u5176\u4ed6\u8def\u5f84\uff0c\u5219\u4f1a\u5728\u5bf9\u5e94\u7684\u8def\u5f84\u4e0b\u751f\u6210 json \u548c Excel \u6587\u4ef6\u3002 \u4f60\u4e5f\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8bfb\u53d6\u6240\u6709 json / excel \u62a5\u544a\u7684\u6570\u636e\uff0c\u751f\u6210\u4f60\u81ea\u5df1\u60f3\u8981\u7684\u4e00\u4e9b\u6d4b\u8bd5\u62a5\u544a\u5f62\u5f0f\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#usb","title":"\u4e5d\u3001USB \u4e32\u53e3\u9a71\u52a8\u952e\u9f20\u65b9\u6cd5","text":"\u4f4d\u4e8e src/utils/control/serial_communication \u76ee\u5f55\u4e0b\u7684 usb_mk.py \u6587\u4ef6 usb_mk = UsbMk()\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up()\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u652f\u6301\u4f20\u5165\u6c49\u5b57\uff0c\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click()\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() \n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() \n \uff084\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() \n \uff085\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() \n \uff086\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() \n \uff087\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff088\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff0810\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_10","title":"\u5341\u3001\u7ee7\u7535\u5668\u63a7\u5236\u4e3b\u673a\u5f00\u673a/\u91cd\u542f","text":"\uff08\u82e5\u4e0d\u4f7f\u7528\u7ee7\u7535\u5668\uff0c\u53ef\u5ffd\u7565\u8be5\u6b65\u9aa4\uff0c\u6267\u884c\u65f6\u4f1a\u901a\u8fc7\u547d\u4ee4 reboot\uff09"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u7ee7\u7535\u5668\u8bbe\u5907","text":"LCUS-2 \u578b \u53cc\u8def USB \u667a\u80fd\u4e32\u53e3\u63a7\u5236\u7ee7\u7535\u5668\u3002 https://item.taobao.com/item.htm?spm=a1z09.2.0.0.41d72e8dUYx2pi&id=582653718178&_u=i25r20ia6a2e "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2usb","title":"2\u3001USB \u5ef6\u957f\u7ebf","text":"\u666e\u901a\u7684 USB \u7ebf\u5373\u53ef\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_3","title":"3\u3001\u675c\u90a6\u7ebf","text":"3.1\u300140P \u6bcd\u5bf9\u516c\u675c\u90a6\u7ebf\u3002 3.2\u3001\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"4\u3001\u5b89\u88c5\u56fe\u6587\u6559\u7a0b","text":"4.1\u3001\u4f7f\u7528 USB \u5ef6\u957f\u7ebf\u8fde\u63a5\u63a7\u5236\u7aef\u548c\u7ee7\u7535\u5668\u3002 4.2\u3001\u5728\u7ee7\u7535\u5668\u5e38\u7aef\u548c\u516c\u5171\u7aef\u5747\u8fde\u63a5\u4e00\u6839\u675c\u90a6\u7ebf\u3002 4.3\u3001\u5728\u4e3b\u677f\u4e0a\u5f00\u673a\u9488\u548c\u91cd\u542f\u9488\u4e0a\u63d2\u4e0a\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 4.4\u3001\u5c06\u5f00\u673a\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76841\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1\u5de6\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 4.5\u3001\u5c06\u91cd\u542f\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76842\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1 \u53f3\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 \u82e5\u60f3\u4fdd\u7559\u539f\u7535\u6e90\u5f00\u5173\u7684\u7535\u6e90\u706f\uff0c\u53ef\u6839\u636e\u5982\u4e0a\u56fe\u6240\u793a\uff0c\u4f7f\u7528\u675c\u90a6\u7ebf\u8fde\u63a5\u4e3b\u677f\u4e0a\u7684\u7535\u6e90\u706f\u548c\u539f\u7535\u6e90\u5f00\u5173"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_11","title":"\u5341\u4e00\u3001\u5e38\u89c1\u95ee\u9898\u8bf4\u660e","text":"1\u3001ERROR: for uos Cannot restart container 2301b1a1395d7959ee6523d61b61c87084649af530786cdb8fb5b3ecbcbd1068: linux runtime spec devices: error gathering device information while adding custom device \"/dev/ttyACM0\": no such file or directory \u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u8fde\u63a5\u72b6\u6001\uff0c\u67e5\u770b /dev/ttyACM0 \u662f\u5426\u5b58\u5728\uff0c\u82e5\u5b58\u5728 /dev/ttyACMn\uff08n\u4e3a\u4efb\u610f\u6570\u5b57\uff09\uff0c\u91cd\u542f\u7535\u8111\u89e3\u51b3\u3002 2\u3001Error response from daemon: Container 5e700fdc769e8c74666d68a7f2bc3de58268b4594cf88706609d59f8dbc7362d is not running \u5bb9\u5668\u542f\u52a8\u5931\u8d25 1\uff09\u68c0\u67e5\u54ea\u4e00\u4e2a\u5bb9\u5668\u672a\u542f\u52a8 sudo docker container ls # \u5217\u51fa\u8fd0\u884c\u4e2d\u7684 Docker \u5bb9\u5668\n 2\uff09\u7f3a\u5c11 uos \u5bb9\u5668\uff0c\u68c0\u67e5 USB \u4e32\u53e3\u8fde\u63a5\u7ebf\u548c\u91c7\u96c6\u76d2\u8fde\u63a5\u7ebf\u662f\u5426\u6b63\u5e38\uff0c\u91cd\u542f\u540e\u6267\u884c bash install/setup.up # \u91cd\u65b0\u5b8c\u6574\u90e8\u7f72\u73af\u5883\n \u6216\u6267\u884c sudo docker-compose up -d --build # \u4ec5\u91cd\u65b0\u6784\u5efa Docker \u955c\u50cf\n 3\u3001\u82e5\u90e8\u7f72\u65f6\u63d0\u793a\u6302\u8f7d ttyACM0\u3001video0 \u5931\u8d25\uff0c\u8bf7\u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u53ca\u91c7\u96c6\u76d2\u662f\u5426\u63a5\u89e6\u826f\u597d\uff0c\u82e5\u63a5\u89e6\u826f\u597d\uff0c\u91cd\u542f\u5373\u53ef\u89e3\u51b3\u3002 4\u3001\u82e5\u51fa\u73b0\u56fe\u7247\u80fd\u8bc6\u522b\uff0c\u4f46\u662f\u9f20\u6807\u672a\u79fb\u52a8\u64cd\u4f5c\u65f6\uff0c\u5b89\u88c5\u7edd\u5bf9\u9f20\u6807\u64cd\u4f5c\u7684\u4f9d\u8d56\u5305\uff0c\u89c1\u7b2c\u4e09\u8282\u7b2c\u4e8c\u5c0f\u8282\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u6d4b\u8bd5\u673a\u3002 5\u3001\u7531\u4e8e\u901a\u8fc7\u91c7\u96c6\u5361\u83b7\u53d6\u7684\u6d4b\u8bd5\u673a\u5b9e\u65f6\u753b\u9762\uff0c\u5305\u542b\u4e86\u9f20\u6807\u7684\u6837\u5f0f\uff0c\u6240\u4ee5\u5bf9\u56fe\u7247\u8bc6\u522b\u65f6\uff0c\u9f20\u6807\u82e5\u505c\u7559\u5728\u56fe\u6807\u4e0a\u5c42\uff0c\u5219\u4f1a\u5bf9\u8bc6\u522b\u7ed3\u679c\u9020\u6210\u5f71\u54cd\uff0c\u9700\u8981\u5c06\u9f20\u6807\u79fb\u52a8\u81f3\u5176\u4ed6\u4f4d\u7f6e\uff0c\u6216\u8005\u9690\u85cf\u9f20\u6807\u89e3\u51b3\u3002 6\u3001Excel \u62a5\u544a\u4e2d\uff0c\u6d4b\u8bd5\u573a\u666f\u5217\u4e0e\u7528\u4f8b\u4e2d\u7684\u4e0d\u4e00\u81f4\uff0c\u5173\u952e\u5b57scene\u3001app_name\u3001\u67b6\u6784\u522b\u540d\uff0c\u4e0d\u80fd\u5305\u542b\u4e0b\u5212\u7ebf\u548c\u82f1\u6587\u7b26\u53f7\u7684\u5706\u62ec\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/","title":"\u6846\u67b6\u529f\u80fd\u4ecb\u7ecd","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2023/1/12\n# Author : Mikigo\n# =============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_2","title":"\u4e00\u3001\u4e00\u53e5\u8bdd\u7b80\u4ecb","text":"\u6b64\u6587\u6863\u4e3b\u8981\u60f3\u5bf9 YouQu \u6846\u67b6\u4e00\u4e9b\u91cd\u70b9\u7684\u529f\u80fd\u505a\u8be6\u7ec6\u7684\u4ecb\u7ecd\uff0c\u5305\u62ec\u5bf9\u4e00\u4e9b\u529f\u80fd\u5f00\u53d1\u7684\u80cc\u666f\u3001\u8981\u89e3\u51b3\u7684\u95ee\u9898\u3001\u5b9e\u73b0\u903b\u8f91\u3001\u4ee3\u7801\u7b49\u65b9\u9762\u7684\u4ecb\u7ecd\uff0c\u4ee5\u6b64\u8ba9\u5927\u5bb6\u80fd\u66f4\u52a0\u6e05\u6670\u7684\u7406\u89e3\u5404\u9879\u529f\u80fd\uff0c\u4ece\u800c\u5728\u4f7f\u7528\u7684\u65f6\u5019\u80fd\u66f4\u52a0\u7684\u5f97\u5fc3\u5e94\u624b\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_3","title":"\u4e8c\u3001\u56fe\u50cf\u8bc6\u522b","text":"\u56fe\u50cf\u8bc6\u522b\u5728 UI \u81ea\u52a8\u5316\u4e2d\u662f\u4e0d\u53ef\u7f3a\u5c11\u7684\uff0c\u5e02\u9762\u4e0a\u751a\u81f3\u6709\u5b8c\u5168\u57fa\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\uff0c\u6bd4\u5982 Airtest\u3001Sikuli \u7b49\uff0c\u5728\u6e38\u620f\u7b49\u7279\u5b9a\u9886\u57df\u4e5f\u6709\u4e0d\u9519\u7684\u6548\u679c\uff0c\u8fd9\u4e9b\u5de5\u5177\u5b9e\u9645\u4e0a\u4e5f\u662f\u7528\u7684 OpenCV \u8fdb\u884c\u4e86\u5c01\u88c5\uff0cYouQu \u6846\u67b6\u57fa\u4e8e OpenCV \u5f00\u53d1\u4e86\u81ea\u5df1\u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\uff0c\u5b83\u53ef\u4ee5\u65b9\u4fbf\u7684\u7528\u4e8e\u754c\u9762\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u65ad\u8a00\uff1b YouQu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u51e0\u4e4e\u6ee1\u8db3\u4e86\u4f60\u7684\u6240\u6709\u8981\u6c42\uff0c\u6211\u4eec\u5728\u957f\u65f6\u95f4\u7684\u601d\u8003\u548c\u6478\u7d22\u4e2d\uff0c\u9488\u5bf9\u5e38\u89c4\u573a\u666f\u53ca\u4e00\u4e9b\u7279\u6b8a\u573a\u666f\u63a2\u7d22\u9664\u4e86\u4e00\u4e9b\u5b9e\u7528\u4e14\u6709\u6548\u7684\u65b9\u6848\uff0c\u4e14\u542c\u6211\u6162\u6162\u9053\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1","title":"1\u3001\u5e38\u89c4\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5e38\u89c4\u8bc6\u522b\u5f88\u597d\u7406\u89e3\uff0c\u4e00\u53e5\u8bdd\u8bb2\u5c31\u662f\uff0c\u8981\u83b7\u53d6\u5230\u76ee\u6807\u5143\u7d20\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u3002 \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u5728\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u9700\u8981\u83b7\u53d6\u7684\u5750\u6807\u662f\u76f8\u5bf9\u4e8e\u6574\u4e2a\u5c4f\u5e55\u7684\u5750\u6807\uff0c\u6211\u4eec\u53ef\u4ee5\u622a\u53d6\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u56fe\u7247\uff08screen\uff09\uff1b \u5728\u5143\u7d20\u8bc6\u522b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u622a\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5c0f\u56fe\u8fdb\u884c\u8bc6\u522b\uff0c\u6bd4\u5982\u622a\u53d6\u64ad\u653e\u6309\u94ae\uff1a \u90a3\u4e48\u5b9e\u9645\u4e0a\uff0c\u5143\u7d20\u5b9a\u4f4d\u7684\u95ee\u9898\u5c31\u8f6c\u6362\u4e3a\uff0c\u5c06\u622a\u56fe\u7684\u5c0f\u56fe\uff08play_btn\uff09\u62ff\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u5927\u56fe\uff08screen\uff09\u4e2d\u53bb\u505a\u5339\u914d\uff0c\u5982\u679c\u5339\u914d\u6210\u529f\uff0c\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff08 x, y \uff09\u5373\u53ef\u3002 \u4e3a\u4e86\u65b9\u4fbf\u63cf\u8ff0\uff0c\u4ee5\u4e0b\u6211\u5c06\u6574\u4e2a\u5c4f\u5e55\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5927\u56fe\uff0c\u67d0\u4e2a\u5143\u7d20\u56fe\u7247\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5c0f\u56fe\u3002 \u57fa\u4e8e OpenCV \u7684\u6a21\u677f\u5339\u914d cv.matchTemplate() \u529f\u80fd\uff0c\u6211\u4eec\u5b9e\u73b0\u4e86\u56fe\u50cf\u5b9a\u4f4d\u7684\u529f\u80fd\uff0c\u6846\u67b6\u63d0\u4f9b\u4e86\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u5e95\u5c42\u63a5\u53e3\uff08\u4e00\u822c\u4e0d\u5bf9\u4e0a\u5c42\u63d0\u4f9b\u8c03\u7528\uff09\uff1a def _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\n# \u8be6\u7ec6\u4ee3\u7801\u592a\u957f\u4e0d\u8d34\u4e86\uff0c\u611f\u5174\u8da3\u8bf7\u67e5\u770b\u6e90\u7801\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001image_path image_path \u662f\u5c0f\u56fe\u7684\u7edd\u5bf9\u8def\u5f84; \u901a\u5e38\u5728 AT \u5de5\u7a0b\u91cc\u9762\uff0c\u6211\u4eec\u7ea6\u5b9a\u5c06\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u5b9e\u9645\u7684\u5143\u7d20\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1aplay_btn.png \uff1b \u7528\u4e8e\u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 case/assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1amusic_001.png \uff1b \u8fd9\u6837\u662f\u4e3a\u4e86\u65b9\u4fbf\u7ba1\u7406\u548c\u7ef4\u62a4\u3002 2\u3001rate \u56fe\u50cf\u8bc6\u522b\u7684\u7684\u5339\u914d\u5ea6\u6216\u8005\u8bf4\u76f8\u4f3c\u5ea6\uff0c\u6846\u67b6\u9ed8\u8ba4\u7684\u914d\u7f6e\u4e3a 0.9\uff0c\u4e5f\u5c31\u662f\u8bf4\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u5b58\u5728\u4e00\u4e2a\u76f8\u4f3c\u5ea6 90% \u7684\u56fe\u6807\u5373\u8fd4\u56de\u5176\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff1b \u5982\u679c\u4f60\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u8c03\u6574\u8bc6\u522b\u5ea6\uff0c\u4f60\u53ef\u4ee5\u5728\u8c03\u7528\u51fd\u6570\u7684\u65f6\u5019\uff0c\u4f20\u5165\u4e0d\u540c\u7684\u8bc6\u522b\u5ea6\u7684\u503c\u3002 3\u3001multiple \u9ed8\u8ba4\u60c5\u51b5\u4e0b multiple=False\uff0c\u8868\u793a\u53ea\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u7b2c\u4e00\u4e2a\uff0c\u5982\u679c multiple=True \u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\uff0c\u56e0\u4e3a\u5927\u56fe\u4e2d\u53ef\u80fd\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u5c0f\u56fe\uff0c\u5728\u67d0\u4e9b\u573a\u666f\u4e0b\u4f60\u53ef\u80fd\u9700\u8981\u5168\u90e8\u83b7\u53d6\u5230\u6240\u6709\u5339\u914d\u5230\u7684\u5750\u6807\u3002 4\u3001picture_abspath \u9ed8\u8ba4\u60c5\u51b5\u4e0b picture_abspath=None \u8868\u793a\u5927\u56fe\u4e3a\u622a\u53d6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u5982\u679c\u4f60\u4e0d\u5e0c\u671b\u5927\u56fe\u662f\u5c4f\u5e55\u7684\u622a\u56fe\uff0c\u800c\u662f\u4f60\u81ea\u5b9a\u4e49\u4f20\u5165\u7684\u67d0\u4e2a\u56fe\u7247\uff0c\u4f60\u53ea\u9700\u8981\u5c06\u4f60\u7684\u56fe\u7247\u8def\u5f84\u4f20\u9012\u7ed9\u8fd9\u4e2a\u53c2\u6570\u5c31\u884c\uff0c\u6bd4\u5982\uff1a picture_abspath=\"~/Desktop/big.png\" \uff1b 5\u3001screen_bbox \u5927\u56fe\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u622a\u53d6\u6574\u4e2a\u5c4f\u5e55\uff0cscreen_bbox = [x, y, w, h] \u53ef\u4ee5\u6307\u5b9a\u622a\u53d6\u5c4f\u5e55\u4e2d\u7684\u56fa\u5b9a\u533a\u57df\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\uff0c\u53ef\u4ee5\u6392\u9664\u90e8\u5206\u533a\u57df\u5bf9\u8bc6\u522b\u7ed3\u679c\u7684\u5f71\u54cd\u3002 \u3010\u9690\u5f0f\u7b49\u5f85\u3011 \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\uff0c\u6709\u65f6\u5019\u9875\u9762\u8df3\u8f6c\u6709\u5ef6\u65f6\uff0c\u6709\u53ef\u80fd\u5b58\u5728\u8bc6\u522b\u7684\u90a3\u4e00\u523b\u9875\u9762\u4e5f\u6ca1\u6709\u8df3\u8f6c\u51fa\u6765\uff0c\u6216\u8005\u6216\u8005\u8bc6\u522b\u7684\u90a3\u4e00\u523b\uff1b \u56e0\u6b64\u6211\u4eec\u9700\u8981\u4e00\u79cd\u7b49\u5f85\u673a\u5236\uff0c\u5373\u5728\u4e00\u5b9a\u7684\u65f6\u95f4\u5185\uff0c\u5982\u679c\u8bc6\u522b\u4e0d\u5230\uff0c\u91cd\u590d\u53bb\u8bc6\u522b\uff1a def find_image(\ncls,\n*widget, rate: [float, int] = None,\nmultiple: bool = False,\nmatch_number: int = None,\npicture_abspath: str = None,\nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u5728\u5c4f\u5e55\u4e2d\u533a\u5bfb\u627e\u5c0f\u56fe\uff0c\u8fd4\u56de\u5750\u6807\uff0c\n \u5982\u679c\u627e\u4e0d\u5230\uff0c\u6839\u636e\u914d\u7f6e\u91cd\u8bd5\u6b21\u6570\uff0c\u6bcf\u6b21\u95f4\u96941\u79d2\n :param widget: \u6a21\u677f\u56fe\u7247\u8def\u5f84\n :param rate: \u76f8\u4f3c\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param match_number: \u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\n :return: \u5750\u6807\u5143\u7ec4\n \"\"\"\nif rate is None:\nrate = float(GlobalConfig.IMAGE_RATE)\ntry:\nfor element in widget:\nfor _ in range((match_number or int(GlobalConfig.IMAGE_MATCH_NUMBER)) + 1):\nlocate = cls._match_image_by_opencv(\nelement,\nrate,\nmultiple=multiple,\npicture_abspath=picture_abspath,\nscreen_bbox=screen_bbox\n)\nif not locate:\nsleep(int(GlobalConfig.IMAGE_MATCH_WAIT_TIME))\nelse:\nreturn locate\nraise TemplateElementNotFound(*widget)\nexcept Exception as e:\nraise e\n \u53c2\u6570 match_number \u7528\u4e8e\u63a7\u5236\u91cd\u590d\u8bc6\u522b\u7684\u6b21\u6570\uff0c\u9ed8\u8ba4\u4e0d\u4f20\u53c2\uff0c\u53d6\u5168\u5c40\u914d\u7f6e setting/globalconfig.ini \u91cc\u9762\u7684 IMAGE_MATCH_NUMBER \u914d\u7f6e\u9879\u7684\u503c\uff0c\u9ed8\u8ba4IMAGE_MATCH_NUMBER = 1\uff0c\u5373\u91cd\u8bd5 1 \u6b21\uff1b find_image \u662f\u6846\u67b6\u63d0\u4f9b\u7684\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u51fd\u6570\u63a5\u53e3\uff0c\u8fd9\u4e2a\u51fd\u6570\u63d0\u4f9b\u4e86\u9690\u5f0f\u7b49\u5f85\u7684\u529f\u80fd\uff0c\u4e14\u5305\u542b\u4e0a\u9762\u4ecb\u7ecd\u7684 _match_image_by_opencv \u51fd\u6570\u7684\u6240\u6709\u529f\u80fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2","title":"2\u3001\u6c14\u6ce1\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u6c14\u6ce1\u8bc6\u522b\u6307\u7684\u662f\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\u8981\u5b9a\u4f4d\u7684\u5143\u7d20\u662f\u4e00\u4e9b\u4f1a\u6d88\u5931\u7684\u5c0f\u5f39\u7a97\uff0c\u8fd9\u7c7b\u573a\u666f\u5728\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\u5c31\u53ef\u80fd\u5b58\u5728\u4e0d\u7a33\u5b9a\u6027\uff0c\u6709\u53ef\u80fd\u56fe\u50cf\u8bc6\u522b\u7684\u65f6\u5019\u6c14\u6ce1\u5df2\u7ecf\u6d88\u5931\u4e86\uff0c\u4e5f\u6709\u53ef\u80fd\u6c14\u6ce1\u51fa\u73b0\u7684\u65f6\u95f4\u592a\u77ed\u4e86\uff0c\u4e0d\u5bb9\u6613\u6355\u6349\u5230\uff0c\u5c31\u50cf\u6c14\u6ce1\u4e00\u6837\uff0c\u51fa\u73b0\u4e00\u4e0b\u5c31\u6d88\u5931\uff0c\u56e0\u6b64\u6211\u4eec\u5f62\u8c61\u7684\u79f0\u4e4b\u4e3a \u201c\u6c14\u6ce1\u8bc6\u522b\u201d\uff1b \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u4e3a\u4e86\u80fd\u7a33\u5b9a\u7684\u8bc6\u522b\u6c14\u6ce1\u7c7b\u573a\u666f\uff0c\u6211\u4eec\u91c7\u7528\u7684\u65b9\u6848\u662f\uff1a \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\uff08\u5305\u542b\u6c14\u6ce1\u4ece\u51fa\u73b0\u5230\u6d88\u5931\uff09\uff0c\u4e0d\u505c\u7684\u622a\u53d6\u8fd9\u6bb5\u65f6\u95f4\u5185\u7684\u5927\u56fe\uff0c\u4ee5\u6b64\u786e\u4fdd\u5728\u622a\u53d6\u7684\u4e00\u5806\u56fe\u7247\u4e2d\uff0c\u80af\u5b9a\u6709\u81f3\u5c11\u4e00\u5f20\u56fe\u7247\u80fd\u6355\u6349\u5230\u6c14\u6ce1\uff0c\u6700\u540e\u518d\u5bf9\u8fd9\u4e00\u5806\u56fe\u7247\u9010\u4e2a\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def get_during(\ncls,\nimage_path: str,\nscreen_time: [float, int],\nrate: float = None,\npause: [int, float] = None,\nmax_range: int = 10000\n):\n\"\"\"\n \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u622a\u56fe\u591a\u5f20\u56fe\u7247\u8fdb\u884c\u8bc6\u522b\uff0c\u5176\u4e2d\u6709\u4e00\u5f20\u56fe\u7247\u8bc6\u522b\u6210\u529f\u5373\u8fd4\u56de\u7ed3\u679c;\n \u9002\u7528\u4e8e\u6c14\u6ce1\u7c7b\u7684\u65ad\u8a00\uff0c\u6bd4\u5982\u6c14\u6ce1\u57281\u79d2\u5185\u6d88\u5931\uff0c\u5982\u679c\u7528\u5e38\u89c4\u7684\u56fe\u50cf\u8bc6\u522b\u5219\u6709\u53ef\u80fd\u65e0\u6cd5\u8bc6\u522b\u5230\uff1b\n :param image_path: \u8981\u8bc6\u522b\u7684\u6a21\u677f\u56fe\u7247\uff1b\n :param screen_time: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff1b\n :param rate: \u8bc6\u522b\u7387\uff1b\n :param pause: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u4e0d\u95f4\u9694\uff1b\n :param max_range: \u622a\u56fe\u7684\u6700\u5927\u6b21\u6570\uff0c\u8fd9\u662f\u4e00\u4e2a\u9884\u8bbe\u503c\uff0c\u4e00\u822c\u60c5\u51b5\u4e0b\u4e0d\u6d89\u53ca\u4fee\u6539\uff1b\n \"\"\"\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001screen_time \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5728\u6b64\u65f6\u95f4\u5185\u4f1a\u4e0d\u65ad\u7684\u8fdb\u884c\u622a\u56fe\u64cd\u4f5c\uff0c\u5c31\u50cf\u5f55\u5236\u89c6\u9891\u4e00\u6837\uff1b 2\u3001pause \u6bcf\u6b21\u622a\u53d6\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u4e00\u523b\u4e0d\u505c\u7684\u622a\u56fe\uff0c\u5982\u679c\u4f60\u60f3\u6bcf\u6b21\u622a\u56fe\u5b58\u5728\u4e00\u4e9b\u95f4\u9694\u65f6\u95f4\u4f20\u5165\u5bf9\u5e94\u7684\u65f6\u95f4\u95f4\u9694\u5373\u53ef\uff0c\u5355\u4f4d\u662f\u79d2\uff0c\u6bd4\u5982\uff1apause = 0.03\uff0c\u8868\u793a 30 ms\uff0c\u76f8\u5f53\u4e8e\u5e27\u7387\u4e3a 30 \u5e27\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-opencv","title":"3\u3001\u4e0d\u4f9d\u8d56 OpenCV \u7684\u56fe\u50cf\u8bc6\u522b\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31","title":"3.1\u3001\u81ea\u7814\u56fe\u50cf\u8bc6\u522b\u6280\u672f","text":"\u3010\u539f\u7406\u3011 \u4e3a\u4e86\u5b9e\u73b0\u8bc6\u522b\u56fe\u50cf\u7684\u76ee\u7684\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u5c06\u56fe\u7247\u7684\u6bcf\u4e2a\u50cf\u7d20\u7684RGB\u503c\uff0c\u4e0e\u6574\u4e2a\u5c4f\u5e55\u4e2d\u7684RGB\u8fdb\u884c\u5bf9\u6bd4\uff0c\u5982\u679c\u5c0f\u56fe\u4e0a\u7684RGB\u503c\u4e0e\u5bf9\u5e94\u5927\u56fe\u4f4d\u7f6e\u7684RGB\u90fd\u76f8\u7b49\uff0c\u5219\u5339\u914d\u6210\u529f\uff0c\u5373\u53ef\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u70b9\u3002 1\u3001\u8bfb\u53d6\u5c0f\u56fe\u548c\u5927\u56fe\u7684RGB\u503c \uff081\uff09\u5c0f\u56fe\u7684RGB\u503c small_data = small_pic.load() # load()\u4f1a\u5c06\u56fe\u7247\u7684RGB\u503c\u83b7\u53d6\u5230\uff0c\u6570\u636e\u683c\u5f0f\u4e3a\u4e00\u4e2a\u4e8c\u7ef4\u5217\u8868\uff0c\u8d4b\u503c\u7ed9\u4e00\u4e2a\u53d8\u91cfsmall_data\u3002\n \uff082\uff09\u5927\u56fe\u7684RGB\u503c big_data = big_pic.load()\n 2\u3001\u5c06\u5c0f\u56fe\u4e0e\u5927\u56fe\u7684RGB\u503c\u8fdb\u884c\u5339\u914d \uff081\uff09\u5339\u914d\u4ece\u5927\u56fe\u7684\u5750\u6807\uff080\uff0c0\uff09\u5f00\u59cb\u5339\u914d\uff0c\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff082\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\uff080\uff0c0\uff09\u5bf9\u5e94\u7684\u6240\u6709\u5c0f\u56fe\u7684RGB\u503c\u4e0d\u76f8\u7b49\uff0c\u5219\u79fb\u52a8\u5230\u4e0b\u4e00\u4e2a\u5750\u6807\u70b9\uff081\uff0c0\uff09\uff0c\u540c\u6837\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff083\uff09\u6309\u7167\u8fd9\u6837\u7684\u89c4\u5f8b\u5c06\u8fd9\u4e00\u884c\u6bcf\u79fb\u52a8\u4e00\u4e2a\u5750\u6807\u70b9\uff0c\u90fd\u5c06\u5c0f\u56fe\u6240\u6709\u7684RGB\u4e0e\u5bf9\u5e94\u5927\u56fe\u7684\u503c\u8fdb\u884c\u5339\u914d\uff1b \uff084\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\u5176\u4e2d\u4e00\u4e2a\u5750\u6807\u70b9\u4e0a\u5339\u914d\u5230\u4e86\u5c0f\u56fe\u7684\u6240\u6709RGB\u503c\uff0c\u5219\u6b64\u65f6\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\u70b9\uff1b \uff085\uff09\u5982\u679c\u5339\u914d\u4e86\u5927\u56fe\u6240\u6709\u7684\u5750\u6807\u70b9\uff0c\u90fd\u6ca1\u6709\u5339\u914d\u5230\uff0c\u5219\u8bf4\u660e\u5927\u56fe\u4e2d\u4e0d\u5b58\u5728\u5c0f\u56fe\uff0c\u5339\u914d\u5931\u8d25\uff1b \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 class ImageRgb:\n@staticmethod\ndef _check_match(_x, _y, small, bdata, sdata, rate):\n\"\"\"\n Matching degree of small graph and large graph matching\n \"\"\"\n@staticmethod\ndef _pre_random_point(small):\n\"\"\"\n Pre matching, take 10-20 points at random each time,\n and take coordinates randomly in the small graph\n \"\"\"\n@staticmethod\ndef _pre_random_match(_x, _y, point_list, bdata, sdata, rate):\n\"\"\"\n In the small graph, several points are randomly\n selected for matching, and the matching degree is\n also set for the random points\n \"\"\"\n@classmethod\ndef match_image_by_rgb(cls, image_name=None, image_path=None, rate=0.9):\n\"\"\"\n By comparing the RGB values of the small image with the large\n image on the screen, the coordinates of the small image on\n the screen are returned.\n \"\"\"\n \u901a\u8fc7 match_image_by_rgb() \u8fd9\u4e2a\u51fd\u6570\uff0c\u4f20\u5165\u76ee\u6807\u5c0f\u56fe\u7684\u6587\u4ef6\u540d\u79f0\uff0c\u5373\u53ef\u8fd4\u56de\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u3002 \u6709\u540c\u5b66\u8981\u95ee\u4e86\uff0c\u6709 OpenCV \u5e72\u561b\u4e0d\u7528\uff0c\u6709\u5fc5\u8981\u81ea\u5df1\u5b9e\u73b0\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u529f\u80fd\u5417\uff0c\u4f60\u4eec\u662f\u4e0d\u662f\u95f2\u7684\u554a\uff1f \u8fd9\u4e48\u95ee\u7684\u8bdd\uff0c\u5c0f\u4e86\uff0c\u683c\u5c40\u5c0f\u4e86\uff1b\u6211\u4eec\u81ea\u5df1\u5b9e\u73b0\u4e3b\u8981\u6709\u51e0\u65b9\u9762\u539f\u56e0\uff1a \u51cf\u5c11\u73af\u5883\u4f9d\u8d56\uff0c\u5373\u4e0d\u7528\u5b89\u88c5 OpenCV\uff0c\u6211\u4eec\u4e5f\u80fd\u5b9e\u73b0\u5176\u529f\u80fd\uff0c\u73af\u5883\u4f9d\u8d56\u8fd9\u5757\u540e\u9762\u4f1a\u5355\u72ec\u8be6\u7ec6\u8bb2\uff0c\u51cf\u5c11\u73af\u5883\u4f9d\u8d56\u5bf9\u4e8e\u4efb\u4f55\u8f6f\u4ef6\u5de5\u7a0b\u90fd\u975e\u5e38\u91cd\u8981\uff1b OpenCV \u5728\u5176\u4ed6\u56fd\u4ea7 CPU \u67b6\u6784\u4e0a\u5b89\u88c5\u5e76\u4e0d\u80fd\u4fdd\u8bc1100%\u6210\u529f\uff0c\u751a\u81f3\u6709\u6ca1\u6709\u53ef\u80fd\u5728\u4e00\u4e9b\u67b6\u6784\u4e0a\u538b\u6839\u513f\u5c31\u4e0d\u80fd\u5b89\u88c5\u4f7f\u7528 OpenCV \uff1f \u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 OpenCV \uff1f\u5c31\u50cf\u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 Windows \u5462\uff1f\u8fd9\u4e9b\u95ee\u9898\u503c\u5f97\u601d\u8003\u3002 \u5f53\u7136\uff0c\u6211\u4eec\u627f\u8ba4\u8fd9\u5957\u65b9\u6848\uff0c\u867d\u7136\u8bc6\u522b\u51c6\u786e\u7387\u6ca1\u95ee\u9898\uff0c\u4f46\u5728\u8bc6\u522b\u6548\u7387\u4e0a\u8fd8\u6ca1\u6709\u8fbe\u5230 OpenCV \u6a21\u677f\u5339\u914d\u7684\u6548\u679c\uff0c\u6211\u4eec\u7684\u65b9\u6848\u6bcf\u6b21\u8bc6\u522b\u5728 1.5s \u5de6\u53f3\uff0c\u800c OpenCV \u5728 1s \u5de6\u53f3\uff1b \u6574\u4f53\u8bc6\u522b\u6548\u679c\u6765\u8bb2\uff0c\u6211\u8ba4\u4e3a\u8fd8\u662f\u53ef\u4ee5\u63a5\u53d7\u7684\uff0c\u4e5f\u5e0c\u671b\u6709\u5fd7\u4e4b\u58eb\u80fd\u4e00\u8d77\u4f18\u5316\u6b64\u65b9\u6848\uff0c\u4e00\u8d77\u6280\u672f\u62a5\u56fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32-rpc","title":"3.2\u3001\u57fa\u4e8e RPC \u670d\u52a1\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b","text":"\u5728\u8fdc\u7a0b\u670d\u52a1\u5668\u4e0a\u90e8\u7f72 OpenCV \u7684\u73af\u5883\uff0c\u5e76\u5c06\u5176\u90e8\u7f72\u4e3a RPC \u670d\u52a1\uff0c\u6d4b\u8bd5\u673a\u4e0a\u4e0d\u7528\u5b89\u88c5 OpenCV \u4f9d\u8d56\uff0c\u800c\u662f\u901a\u8fc7\u8bf7\u6c42 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u3010\u539f\u7406\u3011 \u6d4b\u8bd5\u673a\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u56fe\u7247\u4ee5\u53ca\u6a21\u677f\u56fe\u7247\uff0c\u53d1\u9001\u7ed9 RPC \u670d\u52a1\u7aef\uff0c\u670d\u52a1\u7aef\u62ff\u5230\u4e24\u5f20\u56fe\u7247\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u6700\u540e\u5c06\u8bc6\u522b\u7ed3\u679c\u8fd4\u56de\u7ed9\u6d4b\u8bd5\u673a\uff1b \u8981\u7279\u6b8a\u8bf4\u660e\u7684\u662f\uff1a RPC \u662f\u4e00\u79cd\u534f\u8bae\uff0c\u8bb8\u591a\u8bed\u8a00\u90fd\u662f\u652f\u6301\u7684\uff0c\u6bd4\u5982\u8bf4\u670d\u52a1\u7aef\u4e5f\u53ef\u4ee5\u7528 C++ \u6765\u5b9e\u73b0\uff0c\u5ba2\u6237\u7aef\u4f7f\u7528 Python \u4e5f\u662f\u53ef\u4ee5\u8c03\u7528\u7684\u3002 \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 \u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nimport cv2 as cv\nimport numpy as np\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\nif __name__ == \"__main__\":\nserver = ThreadXMLRPCServer((\"x.x.x.x\", 8889), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(match_image_by_opencv, \"match_image_by_opencv\")\nserver.serve_forever()\n \u8fd9\u6837\uff0c\u6211\u4eec\u57fa\u4e8e Python \u6807\u51c6\u5e93 xmlrpc \u642d\u5efa\u4e86\u4e00\u4e2a RPC \u670d\u52a1\u5668\uff0c\u6ce8\u518c\u4e86 image_put \u548c match_image_by_opencv \u4e24\u4e2a\u529f\u80fd\u63a5\u53e3\uff0c\u5728\u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u901a\u8fc7 IP \u548c\u7aef\u53e3\u8fdb\u884c RPC \u8bf7\u6c42\uff1b \u5ba2\u6237\u7aef\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from xmlrpc.client import Binary\nfrom xmlrpc.client import ServerProxy\nserver = ServerProxy(GlobalConfig.OPENCV_SERVER_HOST, allow_none=True)\nscreen_rb = open(screen, \"rb\")\ntemplate_rb = open(template_path, \"rb\")\ntry:\nscreen_path = server.image_put(Binary(screen_rb.read()))\nscreen_rb.close()\ntpl_path = server.image_put(Binary(template_rb.read()))\ntemplate_rb.close()\nreturn server.match_image_by_opencv(\ntpl_path, screen_path, rate, multiple\n)\nexcept OSError as exc:\nraise EnvironmentError(\nf\"RPC\u670d\u52a1\u5668\u94fe\u63a5\u5931\u8d25. {GlobalConfig.OPENCV_SERVER_HOST}\"\n) from exc\n \u901a\u8fc7\u8fd4\u56de server.match_image_by_opencv \u5c31\u83b7\u53d6\u4e86\u5728\u670d\u52a1\u7aef\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4","title":"4\u3001\u53f3\u952e\u83dc\u5355\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41","title":"4.1\u3001\u53f3\u952e\u83dc\u5355\u5b9a\u4f4d\u7684\u65b9\u6848\u53ca\u95ee\u9898","text":"\u53f3\u952e\u83dc\u5355\u7684\u5143\u7d20\u5b9a\u4f4d\u662f\u4e00\u4e2a\u96be\u70b9\uff0c\u8fc7\u53bb\u6211\u4eec\u8c03\u7814\u548c\u4f7f\u7528\u8fc7\u7684\u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u65b9\u6cd5\u6709 4 \u79cd\uff1a \u7b2c\u4e00\u79cd\uff1a\u6b65\u957f\u64cd\u4f5c\u6cd5 \u5728\u53f3\u952e\u83dc\u5355\u547c\u51fa\u6765\u4e4b\u540e\uff0c\u901a\u8fc7\u952e\u76d8\u7684 up\u3001down \u6309\u952e\uff0c\u8fdb\u884c\u9009\u62e9\u83dc\u5355\u9009\u62e9\uff0c\u9009\u4e2d\u76ee\u6807\u4e4b\u540e enter \u5373\u53ef\uff1b\u6bd4\u5982\uff1a\u5728\u684c\u9762\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\uff0c\u6309 1 \u6b21 down \uff0c\u4f1a\u51fa\u73b0\u4e0b\u56fe\uff1a \u7ee7\u7eed\u518d\u6309 2 \u6b21 down\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u518d\u6309 enter\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u5982\u6b64\uff0c\u201c\u6392\u5e8f\u65b9\u5f0f\u201d\u7684\u6b65\u957f\u4e3a 3\uff1b\u901a\u8fc7\u4f7f\u7528\u952e\u76d8\u4e0a\u4e0b\u952e\uff0c\u5c31\u5b9e\u73b0\u4e86\u5bf9\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\uff1b \u4f46\u662f\uff0c\u8fd9\u79cd\u65b9\u5f0f\u6709\u4e2a\u5f88\u70e6\u4eba\u7684\u95ee\u9898\uff0c\u5c31\u662f\u53f3\u952e\u83dc\u5355\u7684\u9009\u9879\u4f4d\u7f6e\u4e0d\u53ef\u80fd\u4e00\u76f4\u4e0d\u53d8\uff0c\u5728\u9700\u6c42\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\uff0c\u83dc\u5355\u9009\u9879\u7684\u53d8\u5316\u662f\u5f88\u5927\u7684\uff0c\u751a\u81f3\u6709\u4e9b\u5e94\u7528\u652f\u6301\u81ea\u5b9a\u4e49\u83dc\u5355\uff0c\u6bd4\u5982\u6587\u7ba1\u53f3\u952e\u83dc\u5355\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff1b \u4e5f\u5c31\u662f\u8bf4\u4f60\u5f97\u7ecf\u5e38\u53bb\u7ef4\u62a4\u83dc\u5355\u9009\u9879\u7684\u6b65\u957f\uff0c\u4e00\u4e2a\u9009\u9879\u73b0\u5728\u7684\u6b65\u957f\u662f 3\uff0c\u4e0b\u4e2a\u8fed\u4ee3\u53ef\u80fd\u5c31\u662f 4 \u6216\u8005 5\u3002 \u7b2c\u4e8c\u79cd\uff1a\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u6cd5 \u628a\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5355\u72ec\u622a\u56fe\u4fdd\u5b58\uff0c\u56fe\u7247\u4e2d\u4ec5\u5305\u542b\u4e00\u4e2a\u83dc\u5355\u9009\u9879\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u8fd9\u6837\uff0c\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5c31\u53ef\u4ee5\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u65b9\u5f0f\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u8fd9\u79cd\u65b9\u5f0f\u4e0d\u7528\u62c5\u5fc3\u83dc\u5355\u9009\u9879\u7684\u987a\u5e8f\u6216\u4f4d\u7f6e\uff0c\u4f46\u662f\u9700\u8981\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff0c\u4e14\u5bb9\u6613\u53d7\u5230\u5b57\u4f53 UI \u53d8\u66f4\u7c7b\u9700\u6c42\u7684\u5f71\u54cd\uff0c\u6bd4\u5982\uff1a\u5b57\u4f53\u5927\u5c0f\u3001\u5b57\u4f53\u95f4\u8ddd\u7b49\u7b49\u9700\u6c42\u53d8\u66f4\u90fd\u4f1a\u5f71\u54cd\uff0c\u6bcf\u6b21\u53d8\u66f4\u4e4b\u540e\u5c31\u9700\u8981\u8fdb\u884c\u5927\u91cf\u56fe\u7247\u8d44\u6e90\u7684\u91cd\u65b0\u622a\u56fe\u66ff\u6362\uff0c\u662f\u4e2a\u6bd4\u8f83\u9ebb\u70e6\u7684\u4e8b\u60c5\uff1b \u7b2c\u4e09\u79cd\uff1a\u76f8\u5bf9\u4f4d\u79fb\u6cd5 \u9f20\u6807\u70b9\u51fb\u53f3\u952e\u7684\u65f6\u5019\uff0c\u9f20\u6807\u7684\u5f53\u524d\u5750\u6807\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u7684\uff0c\u83dc\u5355\u9009\u9879\u7684\u5bbd\uff08 w \uff09\u4e00\u822c\u662f\u56fa\u5b9a\u7684\uff0c\u53d8\u5316\u7684\u662f\u83dc\u5355\u7684\u957f\u5ea6\uff08 h \uff09\uff0c\u53ef\u4ee5\u901a\u8fc7\u67d0\u4e2a\u9009\u9879\u76f8\u5bf9\u4e8e\u9f20\u6807\u7684\u8ddd\u79bb\u5728\u786e\u5b9a\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u901a\u8fc7\u7ef4\u62a4\u83dc\u5355\u9009\u9879\uff08\u76f8\u5bf9\u4f4d\u7f6e\uff09\u76f8\u5bf9\u4e8e\u9f20\u6807\u4f4d\u7f6e\u7684\u8ddd\u79bb\uff0c\u5373\u53ef\u8f7b\u677e\u8ba1\u7b97\u51fa\u83dc\u5355\u9009\u9879\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\u3002 \u4ece\u7406\u8bba\u4e0a\u6b64\u65b9\u6848\u662f\u53ef\u884c\u7684\uff0c\u4f46\u662f\u8fd9\u91cc\u4ecd\u7136\u5b58\u5728\u4e24\u4e2a\u4e25\u91cd\u7684\u95ee\u9898\uff1a \u83dc\u5355\u987a\u5e8f\u6539\u53d8\uff0c\u5bfc\u81f4\u76f8\u5bf9\u8ddd\u79bb\u6539\u53d8\uff0c\u800c\u4e14\u8ddd\u79bb\u662f\u901a\u8fc7\u50cf\u7d20\uff08px\uff09\u6765\u8868\u793a\u7684\uff0c\u4e0d\u60f3\u6b65\u957f\u90a3\u4e48\u53ea\u7ba1\uff0c\u6bcf\u6b21\u9700\u8981\u53bb\u91cf\u4e00\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u70b9\u9ebb\u70e6\uff1b \u9f20\u6807\u5728\u684c\u9762\u4e0d\u540c\u4f4d\u7f6e\u70b9\u51fb\u53f3\u952e\uff0c\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u4f4d\u7f6e\u662f\u4e0d\u540c\u7684\uff0c\u4e0a\u56fe\u7684\u83dc\u5355\u662f\u5728\u9f20\u6807\u7684\u5de6\u4e0b\u65b9\uff0c\u5982\u679c\u4f60\u79fb\u52a8\u9f20\u6807\u5230\u5c4f\u5e55\u56db\u8fb9\uff0c\u4f60\u4f1a\u53d1\u73b0\uff0c\u53f3\u952e\u83dc\u5355\u53ef\u80fd\u51fa\u73b0\u5728\u9f20\u6807\u7684\u56db\u4e2a\u65b9\u5411\uff0c\u4e5f\u5c31\u662f\u8bf4\u4f60\u9700\u8981\u6839\u636e\u9f20\u6807\u7684\u4e0d\u540c\u4f4d\u7f6e\u6765\u5224\u65ad\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u65b9\u5411\uff0c\u800c\u4e0d\u540c\u7684\u65b9\u5411\u4e0a\u8ba1\u7b97\u65b9\u6cd5\u662f\u4e0d\u540c\u7684\uff0c\u6bd4\u5982\uff1a\u53f3\u952e\u83dc\u5355\u5728\u9f20\u6807\u7684\u5de6\u4e0a\uff0c\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\u8ba1\u7b97\u65b9\u6cd5\u4e3a\uff08x - w / 2\uff0c y - h\uff09\uff0c\u8fd9\u6837\u7ef4\u62a4\u8d77\u6765\u53ef\u4ee5\u8bf4\u975e\u5e38\u590d\u6742\uff1b \u57fa\u4e8e\u4ee5\u4e0a\u4e24\u4e2a\u539f\u56e0\uff0c\u6211\u4eec\u5e76\u4e0d\u63a8\u8350\u8fd9\u79cd\u64cd\u4f5c\u65b9\u6848\u3002 \u7b2c\u56db\u79cd\uff1a\u5c5e\u6027\u5b9a\u4f4d \u6709\u540c\u5b66\u8bf4\u5e72\u561b\u4e0d\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u5462\uff0c\u5176\u5b9e\uff0c\u6211\u4eec\u6700\u5f00\u59cb\u60f3\u5230\u7684\u65b9\u6848\u5c31\u662f\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\uff0c\u4f46\u662f\u5728\u5c5e\u6027\u7684 DOM \u6811\u91cc\u600e\u4e48\u4e5f\u627e\u4e0d\u5230\uff0c\u65e0\u6cd5\u5b9a\u4f4d\u5230\uff0c\u6211\u4eec\u4e5f\u8054\u5408\u7814\u53d1\u540c\u5b66\u4e00\u8d77\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u4f46\u6700\u7ec8\u8fd8\u662f\u6ca1\u80fd\u89e3\u51b3\uff0c\u975e\u5e38\u9057\u61be\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42","title":"4.2\u3001\u6700\u65b0\u7684\u53f3\u952e\u83dc\u5355\u7ec8\u6781\u89e3\u51b3\u65b9\u6848","text":"\u7531\u4e8e\u53f3\u952e\u83dc\u5355\u9009\u9879\u51e0\u4e4e\u90fd\u662f\u6587\u672c\uff0c\u90a3\u4e48\u901a\u8fc7 OCR \u8bc6\u522b\uff0c\u51e0\u4e4e\u662f\u6700\u4f18\u7684\u65b9\u6848\uff1a \u4e0d\u7528\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff1b \u4e0d\u4f1a\u53d7\u5230\u83dc\u5355\u9009\u9879\u987a\u5e8f\u6539\u53d8\u7684\u5f71\u54cd\uff1b \u4e0d\u4f1a\u53d7\u5230\u5b57\u4f53 UI \u53d8\u5316\u7684\u5f71\u54cd\uff1b \u5173\u4e8e OCR \u8bc6\u522b\u6211\u4eec\u5728\u540e\u9762\u4f1a\u8be6\u7ec6\u8bb2\u5230\uff0c\u672c\u7ae0\u8282\u4e3b\u8981\u8bb2\u57fa\u4e8e OCR \u8bc6\u522b\uff0c\u6211\u4eec\u5728\u53f3\u952e\u83dc\u5355\u8bc6\u522b\u4e0a\u7684\u7a81\u7834\u548c\u521b\u65b0\uff1b \u4f7f\u7528 OCR \u8bc6\u522b\u53f3\u952e\u83dc\u5355\u867d\u7136\u5df2\u7ecf\u5f88\u5b8c\u7f8e\u4e86\uff0c\u4f46\u662f\u5728\u4e00\u4e9b\u60c5\u51b5\u4e0b\u4ecd\u7136\u5b58\u5728\u4e00\u70b9\u95ee\u9898\uff0c\u5c31\u662f\u5c4f\u5e55\u4e2d\u51fa\u73b0\u591a\u4e2a\u548c\u83dc\u5355\u9009\u9879\u6587\u5b57\u76f8\u540c\u7684\u6587\u5b57\u65f6\uff0c\u6bd4\u5982\u4e0b\u9762\u8fd9\u79cd\u60c5\u51b5\uff1a \u5c4f\u5e55\u6070\u597d\u51fa\u73b0\u4e86\u4e24\u4e2a\u201c\u590d\u5236\u201d\uff0c\u6b64\u65f6\u8981\u5b9a\u4f4d\u5230\u83dc\u5355\u4e2d\u7684 \u201c\u590d\u5236\u201d\uff0c\u5c31\u9700\u8981\u8fdb\u4e00\u6b65\u505a\u6570\u636e\u5904\u7406\uff0c\u6bd4\u5982\uff1aOCR \u8fd4\u56de 2 \u4e2a\u201c\u590d\u5236\u201d\u7684\u5750\u6807\uff0c\u7528\u4f8b\u91cc\u9762\u6765\u5224\u65ad\u7528\u54ea\u4e2a\uff0c\u4ece\u4e1a\u52a1\u4e0a\u5c06\u5904\u7406\u8d77\u6765\u6bd4\u8f83\u9ebb\u70e6\uff0c\u56e0\u4e3a\u4f60\u5f97\u660e\u786e\u77e5\u9053\u83dc\u5355\u5728\u5de6\u8fb9\u8fd8\u662f\u53f3\u8fb9\uff0c\u7136\u540e\u8fd9\u672c\u8eab\u5c31\u662f\u4e0d\u786e\u5b9a\u7684\uff1b \u600e\u4e48\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u5462\uff0c\u8fd9\u5c31\u8981\u8bf4\u9053\u672c\u7ae0\u7684\u4e3b\u9898\uff1a\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b\u3002 \u3010\u539f\u7406\u3011 \u5728\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u524d\u622a\u4e00\u5f20\u56fe\uff0c\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\u518d\u622a\u53d6\u4e00\u5f20\u56fe\uff0c\u4e24\u5f20\u56fe\u552f\u4e00\u53d8\u5316\u7684\u5c31\u662f\u53f3\u952e\u83dc\u5355\uff0c\u5c06\u5176\u4ed6\u76f8\u540c\u7684\u5730\u65b9\u90fd\u5c4f\u853d\u6389\uff0c\u53ea\u7559\u4e0b\u83dc\u5355\u754c\u9762\uff0c\u5982\u6b64\u5373\u53ef\u6d88\u9664\u5e72\u6270\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u5c06\u4e24\u79cd\u56fe\u505a\u524d\u540e\u5bf9\u6bd4\u63d0\u53d6\u53ef\u4ee5\u5f97\u5230\u8fd9\u6837\u7684\u56fe\uff1a \u4f60\u770b\uff0c\u901a\u8fc7\u524d\u540e\u56fe\u7247\u7684\u5bf9\u6bd4\uff0c\u5c06\u76f8\u540c\u7684\u90e8\u5206\u7ed9\u6d88\u9664\u6389\uff0c\u518d\u8fdb\u884c OCR \u8bc6\u522b\uff0c\u8fd9\u6837\u5c31\u4e0d\u4f1a\u6709\u5e72\u6270\u4e86\uff1b \u4ee3\u7801\u5b9e\u73b0\u8bf7\u67e5\u770b src/filter_image.py \uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def filter_image(action):\n\"\"\"\n \u5bf9\u6bd4\u52a8\u4f5c\u524d\u540e\u4e24\u5f20\u56fe\u7247\uff0c\u63d0\u53d6\u4e0d\u540c\u7684\u90e8\u5206\u751f\u6210\u4e00\u5f20\u65b0\u7684\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u65b0\u56fe\u7247\u7684\u8def\u5f84\n :param action: \u52a8\u4f5c\u51fd\u6570\u7684\u51fd\u6570\u5bf9\u8c61\n :return: \u65b0\u56fe\u7247\u7684\u8def\u5f84\n \"\"\"\n action \u662f\u9f20\u6807\u4e8b\u4ef6\uff0c\u56e0\u4e3a\u6b64\u7c7b\u573a\u666f\u4e0d\u4ec5\u4ec5\u5728\u53f3\u952e\u5b58\u5728\uff0c\u5355\u51fb\u3001\u53cc\u51fb\u7b49\u7b49\uff0c\u53ea\u8981\u64cd\u4f5c\u524d\u540e\u540e\u53d8\u5316\u7684\u90fd\u53ef\u4ee5\uff1a from src.mouse_key import MouseKey\naction = (\nMouseKey.click,\nMouseKey.right_click,\nMouseKey.double_click,\nMouseKey.move_to,\n)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5","title":"5\u3001\u52a8\u6001\u56fe\u50cf\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5728\u684c\u9762\u58c1\u7eb8\u5207\u6362\uff0c\u6216\u770b\u56fe\u3001\u76f8\u518c\u5207\u6362\u56fe\u7247\u7c7b\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u7531\u4e8e\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u662f\u4e0d\u56fa\u5b9a\u7684\uff08\u4e0d\u540c\u7248\u672c\u7684\u7cfb\u7edf\u58c1\u7eb8\u4e0d\u540c\u3001\u58c1\u7eb8\u987a\u5e8f\u4e0d\u540c\uff0c\u770b\u56fe\u76f8\u518c\u5728\u56fe\u7247\u8d44\u6e90\u4e0d\u4e00\u5b9a\u56fa\u5b9a\uff09\uff0c\u90a3\u4e48\u5728\u6d4b\u8bd5\u5207\u6362\u58c1\u7eb8\u6216\u8005\u5207\u6362\u56fe\u7247\u7684\u573a\u666f\u65f6\u5c31\u4f1a\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u4f60\u4e0d\u77e5\u9053\u9884\u671f\u662f\u5565\uff0c\u7528\u4f8b\u64cd\u4f5c\u52a8\u6001\u7684\uff0c\u4e5f\u662f\u6781\u4e0d\u7a33\u5b9a\u3002 \u3010\u539f\u7406\u3011 \u5728\u5207\u6362\u56fe\u7247\u4e4b\u524d\u622a\u56fe\u4fdd\u5b58\u5e76\u8fd4\u56de\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u6b21\u8bc6\u522b\u8fd9\u5f20\u56fe\u7247\uff0c\u5982\u679c\u4e0d\u5b58\u5728\uff0c\u8bf4\u660e\u56fe\u7247\u5df2\u7ecf\u5207\u6362\u4e86\uff1b \u793a\u610f\u56fe\uff1a \u8fd9\u6837\uff0c\u6211\u4eec\u622a\u53d6\u4e86\u5f53\u524d\u56fe\u7247\u4e2d\u6bd4\u8f83\u6709\u4ee3\u8868\u6027\u7684\u4f4d\u7f6e\uff08\u4e00\u53ea\u9e1f\uff09\uff0c\u5728\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u7528\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1a \u6211\u4eec\u518d\u62ff\u7740\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd9\u6837\u5728\u5f53\u524d\u56fe\u7247\u4e2d\uff0c\u5c31\u4e0d\u80fd\u627e\u5230\u8fd9\u53ea\u9e1f\u4e86\uff0c\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u662f False\uff0c\u90a3\u4e48\u4e5f\u5c31\u53ef\u4ee5\u5224\u65ad\u56fe\u7247\u5207\u6362\u662f\u6210\u529f\u7684\u3002 \u4ee3\u7801\u793a\u610f\uff1a def save_temporary_picture(_x: int, _y: int, width: int, height: int):\n\"\"\"\n \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u56fe\u7247\u8def\u5f84\n :param x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n :param y: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n :param width: \u5bbd\u5ea6\n :param height: \u9ad8\u5ea6\n :return: \u56fe\u7247\u8def\u5f84\n \"\"\"\n \u6b64\u51fd\u6570\u7528\u4e8e\u5728\u64cd\u4f5c\u4e4b\u524d\u622a\u56fe\u4e00\u5f20\u4e34\u65f6\u56fe\u7247\uff0c\u8fd4\u56de\u56fe\u7247\u8def\u5f84\uff0c\u6700\u540e\u5728\u65ad\u8a00\u7684\u65f6\u5019\u518d\u5c06\u56fe\u7247\u8def\u5f84\u4f5c\u4e3a\u53c2\u6570\u4f20\u5165\u65ad\u8a00\u8bed\u53e5\u5373\u53ef\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ui","title":"\u4e09\u3001\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_1","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u662f\u6211\u4eec\u81ea\u7814\u7684\u4e00\u79cd\u4f7f\u7528\u7b80\u5355\uff0c\u4e14\u6548\u7387\u6781\u9ad8\u3001\u7a33\u5b9a\u6027\u597d\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u57fa\u4e8e\u5143\u7d20\u6309\u94ae\u5728\u5e94\u7528\u4e2d\u7684\u76f8\u5bf9\u4f4d\u7f6e\uff0c\u52a8\u6001\u83b7\u53d6\u5143\u7d20\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff0c\u9002\u7528\u4e8e\u5404\u79cd\u5c4f\u5e55\u5206\u8fa8\u7387\uff08\u5305\u62ec\u9ad8\u5206\u5c4f\u3001\u5bbd\u5c4f\u3001\u5e26\u9c7c\u5c4f\uff09\uff0c\u5f53\u5143\u7d20\u6309\u94ae\u4f4d\u7f6e\u76f8\u5bf9\u4e8e\u5e94\u7528\u754c\u9762\u4f4d\u7f6e\u53d1\u751f\u4fee\u6539\u4e4b\u540e\uff0c\u53ea\u9700\u8981\u6839\u636e UI \u8bbe\u8ba1\u56fe\u4e0a\u7684\u6e90\u6570\u636e\u4fee\u6539\u5bf9\u5e94\u5750\u6807\u6570\u636e\u5c31\u597d\uff0c\u7ef4\u62a4\u975e\u5e38\u7684\u65b9\u4fbf\u3002 \u6b64\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u9002\u7528\u4e8e\u4e00\u4e9b\u5143\u7d20\u4f4d\u7f6e\u76f8\u5bf9\u4e0e\u5e94\u7528\u754c\u9762\u6bd4\u8f83\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u97f3\u4e50\uff0899% \u7684\u5143\u7d20\u5b9a\u4f4d\u91c7\u7528\u8fd9\u79cd\uff0c\u6548\u679c\u975e\u5e38\u597d\uff09\uff0c\u4e0d\u9002\u7528\u4e8e\u754c\u9762\u4e0d\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u622a\u56fe\u5f55\u5c4f\uff0c\u5f88\u660e\u663e\u4e0d\u9002\u7528\u4e8e\u8fd9\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u3002\u8fd9\u79cd\u5168\u65b0\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u6709\u5b83\u7684\u9002\u7528\u6761\u4ef6\uff0c\u5982\u679c\u4f60\u53d1\u73b0\u4f7f\u7528\u5e38\u89c4\u7684\uff08\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u5b9a\u4f4d\uff09\u4e0d\u597d\u505a\u65f6\uff0c\u4e0d\u59a8\u8003\u8651\u4f7f\u7528\u8fd9\u79cd\uff0c\u5176\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff0c\u5e76\u4e14\u8fc5\u901f\u7231\u4e0a\u4ed6\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_1","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5728 UI \u8bbe\u8ba1\u56fe\u4e2d\u6211\u4eec\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u8fb9\u6846\u7684\u8ddd\u79bb\u7684\uff0c\u7136\u540e\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u6280\u672f\u624b\u6bb5\u83b7\u53d6\u5230\u5e94\u7528\u754c\u9762\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u53ca\u5e94\u7528\u7a97\u53e3\u7684\u5927\u5c0f\uff0c\u793a\u610f\u56fe\u5982\u4e0b\uff1a \uff08x1, y1\uff09\u4e3a\u5e94\u7528\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\uff1b\uff08x2, y2\uff09\u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u5de6\u4e0a\u89d2\uff08x1, y1\uff09\u7684\u5750\u6807\uff0c\u90a3\u4e48\u5b9e\u9645\u4e0a\u3010\u64ad\u653e\u6240\u6709\u3011\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\u4e3a\uff1a\uff08 x1 + x2, y1 + y2 \uff09\uff1b \u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5927\u5c0f\uff08w2, h2\uff09\uff0c\u53ef\u4ee5\u4ece UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\uff1b \u5728 UI \u8bbe\u8ba1\u7a3f\u4e0a\u70b9\u51fb\u3010\u64ad\u653e\u6240\u6709\u3011\u56fe\u6807\uff0c\u7136\u540e\u79fb\u52a8\u9f20\u6807\u5c31\u5c31\u53ef\u4ee5\u770b\u5230\u4e0a\u56fe\u7684\u53c2\u8003\u7ebf\u53ca\u6570\u636e\uff1b \u6240\u4ee5\uff0c\u6211\u4eec\u53ef\u4ee5\u8f7b\u677e\u7684\u83b7\u53d6\u5230\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u4e2d\u5fc3\u5750\u6807\u4e3a\uff1a\uff08 x1 + x2 + (w2 / 2), y1 + y2 + ( h2 / 2) \uff09 \u8be6\u7ec6\u6e90\u4ee3\u7801\u8bf7\u67e5\u770b AT \u57fa\u7840\u6846\u67b6: src/button_center.py \u83b7\u53d6\u5e94\u7528\u7a97\u53e3\u7684\u4fe1\u606f \u4f7f\u7528 xdotool \u548c xwininfo \u83b7\u53d6\u5230\u5e94\u7528\u7a97\u53e3\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u5de6\u4e0a\u89d2\uff09\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a app_id = CmdCtl.run_cmd(f\"xdotool search --classname --onlyvisible {self.app_name}\"\n).split(\"\\n\")\napp_id_list = [int(_id) for _id in app_id if _id]\nreturn CmdCtl.run_cmd(f\"xwininfo -id {app_id_list[self.number]}\")\n \u4f7f\u7528\u6b63\u5219\u83b7\u53d6\u7a97\u53e3\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u83b7\u53d6\u914d\u7f6e \u8bfb ini \u914d\u7f6e\u6587\u4ef6\uff0c\u83b7\u53d6\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e0e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a conf = ConfigParser()\nconf.read(self.config_path)\ndirection = conf.get(btn_name, \"direction\")\nposition = [int(i.strip()) for i in conf.get(btn_name, \"location\").split(\",\")]\n \u8ba1\u7b97\u5143\u7d20\u6309\u94ae\u5750\u6807 \u6839\u636e\u5e94\u7528\u7a97\u53e3\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u5927\u5c0f\u3001\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u5927\u5c0f\uff0c\u4f7f\u7528\u4e00\u5b9a\u7684\u7b97\u6cd5\u5373\u53ef\u8ba1\u7b97\u51fa\u5143\u7d20\u6309\u94ae\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u4e2d\u5fc3\u5750\u6807\uff09\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3","title":"3\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u3010\u914d\u7f6e\u65b9\u6cd5\u3011 \u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u7684\u6570\u636e\u6e90\u662f\u5e94\u7528\u5e93\u4e2d\u7684 ui.ini \u914d\u7f6e\u6587\u4ef6\uff1a ;section\n[\u65b0\u5efa\u6b4c\u5355+] ;key = value\ndirection = left_top\nlocation = 180, 268, 21, 21\n section \u662f\u4f60\u6839\u636e\u5bf9\u5e94\u7684\u5143\u7d20\u6309\u94ae\u547d\u540d\uff0c\u4f60\u53ef\u4ee5\u4efb\u610f\u547d\u540d\uff0c\u4f46\u6700\u597d\u6709\u5177\u4f53\u542b\u4e49\uff0c\u4e14\u80fd\u660e\u786e\u8868\u793a\u8fd9\u4e2a\u5143\u7d20\u6309\u94ae\u7684\u540d\u79f0\uff1b\u7528\u4e2d\u62ec\u53f7\u62ec\u8d77\u6765\u5c31\u884c\uff0c\u6bd4\u5982\uff1a[\u65b0\u5efa\u6b4c\u5355+] \uff1b direction \u662f\u914d\u7f6e\u8be5\u5143\u7d20\u7684\u53c2\u8003\u7cfb\uff0c\u5206\u522b\u4e3a\uff1a left_top \u5de6\u4e0a\uff1b left_bottom \u5de6\u4e0b\uff1b right_top \u53f3\u4e0a\uff1b right_bottom \u53f3\u4e0b\uff1b \u53c2\u8003\u7cfb\u7684\u9009\u53d6\u6807\u51c6\uff1a\u62c9\u52a8\u6539\u53d8\u7a97\u53e3\u5927\u5c0f\u65f6\uff0c\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u53c2\u8003\u7cfb\u4f4d\u7f6e\u662f\u4e0d\u53d8\u7684\uff1b location \u662f\u8be5\u5143\u7d20\u6309\u94ae\u7684\u76f8\u5bf9\u4e0e\u53c2\u8003\u7cfb\u7684 x, y \u7684\u8ddd\u79bb\uff0c\u53ca\u5927\u5c0f(w, h)\uff0c\u8fd9\u56db\u4e2a\u6570\u636e\u53ef\u4ee5\u901a\u8fc7 UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\u6570\u636e\uff0c\u5728\u7f16\u8f91\u6a21\u5f0f\u4e0b\uff0c\u70b9\u51fb UI \u56fe\u4e0a\u7684\u6309\u94ae\uff0c\u53f3\u4fa7\u5c31\u4f1a\u51fa\u73b0\u8be5\u5143\u7d20\u6309\u94ae\u7684 x, y, w, h \u6570\u636e\u3002 \u5982\u679c UI \u56fe\u4e0a\u6ca1\u6709\u63d0\u4f9b\u4f60\u60f3\u8981\u7684\u5143\u7d20\u6570\u636e\uff0c\u4f60\u53ef\u4ee5\u76f4\u63a5\u5728\u7cfb\u7edf\u4e2d\u4f7f\u7528\u622a\u56fe\u5f55\u5c4f\u8fdb\u884c\u5c3a\u91cf\uff0c\u8fd9\u662f\u4e00\u79cd\u4e0d\u63a8\u8350\u4f46\u80fd\u7528\u7684\u65b9\u6cd5\u3002 \u3010\u8c03\u7528\u65b9\u6cd5\u3011 \u5728\u5e94\u7528\u5e93\u65b9\u6cd5\u5c42\u8fd9\u6837\u5199\uff1a def click_add_music_list_btn_in_music_by_ui(self):\n\"\"\"\u70b9\u51fb\u65b0\u5efa\u6b4c\u5355\u6309\u94ae\"\"\"\nself.click(*self.ui.btn_center(\"\u65b0\u5efa\u6b4c\u5355+\"))\n self.ui.btn_center() \u662f\u56fa\u5b9a\u5199\u6cd5\uff0c\u53c2\u6570\u5c31\u662f\u914d\u7f6e\u91cc\u9762\u7684 section \u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ocr","title":"\u56db\u3001OCR \u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_2","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 OCR \u65b9\u6848\u5927\u591a\u91c7\u7528\u8c37\u6b4c OCR\uff08Tesseract\uff09\u65b9\u6848\uff0c\u4f46\u662f\u5b83\u5bf9\u4e8e\u4e2d\u6587\u7684\u8bc6\u522b\u975e\u5e38\u5dee\uff0c\u7ecf\u8fc7\u5927\u91cf\u7684\u8c03\u7814\uff0c\u6211\u4eec\u4f7f\u7528 PaddleOCR\uff0c\u5b83\u662f\u4e00\u4e2a\u5f00\u6e90\u7684\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u8bc6\u522b\u5de5\u5177\uff0c\u4e5f\u662f PaddlePaddle \u6700\u6709\u540d\u7684\u4e00\u4e2a\u5f00\u6e90\u9879\u76ee\uff0c\u611f\u5174\u8da3\u7684\u53ef\u4ee5\u70b9\u8fd9\u91cc\u4e86\u89e3\uff0c\u591a\u7684\u4e0d\u8bf4\u4e86\uff0c\u4f60\u53ea\u9700\u8981\u77e5\u9053\u5b83\u5c31\u662f\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_2","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5b89\u88c5\u4ed6\u662f\u4e2a\u5f88\u9ebb\u70e6\u7684\u4e8b\u60c5\uff0c\u867d\u7136\u64cd\u4f5c\u5f88\u7b80\u5355\uff0c\u4f46\u5176\u5b9e\u5b89\u88c5\u5305\u6709\u70b9\u5927\uff0c\u56e0\u6b64\u6211\u4eec\u4e0d\u5e0c\u671b\u76f4\u63a5\u5728 env.sh \u4e2d\u52a0\u5165\u5b83\uff0c\u8fd9\u4f1a\u8ba9\u6574\u4e2a\u81ea\u52a8\u5316\u73af\u5883\u53d8\u5f97\u975e\u5e38\u81c3\u80bf\uff1b \u56e0\u6b64\uff0c\u6211\u4eec\u60f3\u5230\u5c06\u5b83\u505a\u6210\u4e00\u4e2a RPC \u670d\u52a1\u5728\u5176\u4ed6\u673a\u5668\u4e0a\u90e8\u7f72\uff0c\u6d4b\u8bd5\u673a\u901a\u8fc7\u8fdc\u7a0b\u8c03\u7528 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u4f7f\u7528\u5b83\uff1b RPC \u7684\u8c03\u7528\u903b\u8f91\uff1a \u8fd9\u6837\u6211\u4eec\u53ea\u9700\u8981\u5728\u670d\u52a1\u7aef\u90e8\u7f72\u597d OCR \u8bc6\u522b\u7684\u670d\u52a1\uff0c\u7136\u540e\u901a\u8fc7 RPC \u670d\u52a1\u5c06\u529f\u80fd\u63d0\u4f9b\u51fa\u6765\uff0c\u6846\u67b6\u91cc\u9762\u53ea\u9700\u8981\u8c03\u7528\u5bf9\u5e94\u7684 RPC \u63a5\u53e3\u5c31\u884c\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_1","title":"3\u3001\u4f7f\u7528\u8bf4\u660e","text":"\u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nfrom paddleocr import PaddleOCR\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef paddle_ocr(pic_path, lang):\n\"\"\"\n Paddleocr\u76ee\u524d\u652f\u6301\u7684\u591a\u8bed\u8a00\u8bed\u79cd\u53ef\u4ee5\u901a\u8fc7\u4fee\u6539lang\u53c2\u6570\u8fdb\u884c\u5207\u6362\n \u4f8b\u5982`ch`, `en`, `fr`, `german`, `korean`, `japan`\n :param file_name:\n :param lang:\n :return:\n \"\"\"\nif __name__ == \"__main__\":\nIP = popen(\"hostname -I\").read().split(\" \")[0]\nPORT = 8890\nSCREEN_CACHE = \"/tmp/screen.png\"\nserver = ThreadXMLRPCServer((IP, PORT), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(paddle_ocr, \"paddle_ocr\")\nprint(\"\u76d1\u542c\u5ba2\u6237\u7aef\u8bf7\u6c42\u3002\u3002\")\nserver.serve_forever()\n \u6846\u67b6\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from src import OCR\nOCR.ocr(*target_strings, picture_abspath=None, similarity=0.6, return_default=False, return_first=False, lang=\"ch\"):\n# \u901a\u8fc7 OCR \u8fdb\u884c\u8bc6\u522b\u3002\n# target_strings:\n# \u76ee\u6807\u5b57\u7b26,\u8bc6\u522b\u4e00\u4e2a\u5b57\u7b26\u4e32\u6216\u591a\u4e2a\u5b57\u7b26\u4e32,\u5e76\u8fd4\u56de\u5176\u5728\u56fe\u7247\u4e2d\u7684\u5750\u6807;\n# \u5982\u679c\u4e0d\u4f20\u53c2\uff0c\u8fd4\u56de\u56fe\u7247\u4e2d\u8bc6\u522b\u5230\u7684\u6240\u6709\u5b57\u7b26\u4e32\u3002\n# picture_abspath: \u8981\u8bc6\u522b\u7684\u56fe\u7247\u8def\u5f84\uff0c\u5982\u679c\u4e0d\u4f20\u9ed8\u8ba4\u622a\u53d6\u5168\u5c4f\u8bc6\u522b\u3002\n# similarity: \u5339\u914d\u5ea6\u3002\n# return_default: \u8fd4\u56de\u8bc6\u522b\u7684\u539f\u751f\u6570\u636e\u3002\n# return_first: \u53ea\u8fd4\u56de\u7b2c\u4e00\u4e2a,\u9ed8\u8ba4\u4e3a False,\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u6240\u6709\u6570\u636e\u3002\n# lang: `ch`, `en`, `fr`, `german`, `korean`, `japan`\n \u6b64\u65b9\u6848\u5728\u6846\u67b6\u5185\u6ca1\u6709\u5f15\u5165\u4efb\u4f55\u4e09\u65b9\u4f9d\u8d56\u5b8c\u5168\u91c7\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\uff0c\u800c\u4e14\u4f7f\u7528\u65b9\u6cd5\u975e\u5e38\u7b80\u5355\uff0c\u53ea\u9700\u8981\u901a\u8fc7 OCR.ocr() \u5373\u53ef\uff1b \u5bf9\u4e8e\u4e00\u4e9b\u6587\u6848\u7684\u573a\u666f\u975e\u5e38\u9002\u7528\uff0c\u6b64\u65b9\u6cd5\u76f4\u63a5\u8fd4\u56de\u5750\u6807\uff0c\u53ef\u4ee5\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u3002 \u4e5f\u53ef\u4ee5\u7528\u4e8e\u6587\u5b57\u65ad\u8a00\uff0c\u4ee3\u7801\u793a\u610f\uff1a def assert_ocr_exist(\n*args, picture_abspath=None, similarity=0.6, return_first=False, lang=\"ch\"\n):\n\"\"\"\u65ad\u8a00\u6587\u6848\u5b58\u5728\"\"\"\npic = None\nif picture_abspath is not None:\npic = picture_abspath + \".png\"\nres = OCR.ocr(\n*args,\npicture_abspath=pic,\nsimilarity=similarity,\nreturn_first=return_first,\nlang=lang,\n)\nif res is False:\nraise AssertionError(\n(f\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{args}\", f\"{pic if pic else GlobalConfig.SCREEN_CACHE}\")\n)\nif isinstance(res, tuple):\npass\nelif isinstance(res, dict) and False in res.values():\nres = filter(lambda x: x[1] is False, res.items())\nraise AssertionError(\n(\nf\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{dict(res)}\",\nf\"{pic if pic else GlobalConfig.SCREEN_CACHE}\",\n)\n)\n \u5728\u7528\u4f8b\u4e2d\u4f7f\u7528\u65ad\u8a00\uff0c\u793a\u4f8b\uff1a def test_font_manager_021(self):\n\"\"\"\u53f3\u4fa7\u2665-\u6536\u85cf/\u53d6\u6d88\u6536\u85cf\u5b57\u4f53\"\"\"\n# \u5b57\u4f53\u7ba1\u7406\u5668\u754c\u9762\u53f3\u4fa7\u8be6\u60c5\u5217\u8868\uff0c\u9009\u62e9\u672a\u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e / \u6536\u85cf\u5b57\u4f53\n# \u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e\u83dc\u5355\u663e\u793a\u201c\u53d6\u6d88\u6536\u85cf\u201d\uff1b\n...\nself.assert_ocr_exist(\"\u53d6\u6d88\u6536\u85cf\")\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_1","title":"4\u3001\u670d\u52a1\u7aef\u90e8\u7f72","text":"\u6211\u4eec\u76ee\u524d\u662f\u5c06 OCR \u670d\u52a1\u90e8\u7f72\u5728\u666e\u901a\u7684\u529e\u516c\u673a\u4e0a\u7684\uff0c\u5982\u679c\u4f60\u89c9\u5f97\u73b0\u6709\u7684 OCR \u8bc6\u522b\u6027\u80fd\u4e0d\u591f\u597d\uff0c\u6070\u597d\u4f60\u6709\u66f4\u597d\u7684\u673a\u5668\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u5176\u79c1\u6709\u5316\u90e8\u7f72\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41_1","title":"4.1\u3001\u73af\u5883\u5b89\u88c5","text":"\u63a8\u8350\u4f7f\u7528 pipenv \u8fdb\u884c\u73af\u5883\u642d\u5efa\uff1b \u5b89\u88c5 pipenv \uff1a sudo pip3 install pipenv\n \u65b0\u5efa\u4e00\u4e2a\u76ee\u5f55\u4f5c\u4e3a\u73af\u5883\u5305 ocr_env\uff1a cd ~\nmkdir ocr_env\n \u521b\u5efa python 3.7 \u73af\u5883\uff1a cd ocr_env\npipenv --python 3.7\n \u5b89\u88c5 OCR \u4f9d\u8d56\u5305\uff1a pipenv install paddlepaddle -i https://mirror.baidu.com/pypi/simple\npipenv install \"paddleocr>=2.0.1\" -i https://mirror.baidu.com/pypi/simple\n \u4e0d\u51fa\u610f\u5916\uff0c\u8fd9\u6837\u5c31\u628a\u4f9d\u8d56\u5b89\u88c5\u597d\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42_1","title":"4.2\u3001\u542f\u52a8\u670d\u52a1","text":"\u5c06\u57fa\u7840\u6846\u67b6\u4e2d\u7684 scr/ocr/pdocr_rpc_server.py \u6587\u4ef6\u62f7\u8d1d\u5230 ocr_env \u76ee\u5f55\uff0c\u540e\u53f0\u6267\u884c\u5b83\u5c31\u597d\u4e86\uff1a cd ocr_env\nnohup pipenv run python pdocr_rpc_server.py &\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#43","title":"4.3\u3001\u914d\u7f6e\u5f00\u673a\u81ea\u542f\uff08\u901a\u7528\uff09","text":"\u4f60\u80af\u5b9a\u4e0d\u60f3\u6bcf\u6b21\u673a\u5668\u91cd\u542f\u4e4b\u540e\u90fd\u9700\u8981\u624b\u52a8\u542f\u52a8\u670d\u52a1\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u914d\u7f6e\u5f00\u673a\u81ea\u542f\u3002 \u5199\u5f00\u673a\u81ea\u542f\u670d\u52a1\u6587\u4ef6\uff1a sudo vim /lib/systemd/system/ocr.service\n autoocr \u540d\u79f0\u4f60\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff0c\u5199\u5165\u4ee5\u4e0b\u5185\u5bb9\uff1a [Unit]\nDescription=OCR Service\nAfter=multi-user.target\n\n[Service]\nUser=uos\nGroup=uos\nType=idle\nWorkingDirectory=/home/uos/ocr_env\nExecStart=pipenv run python pdocr_rpc_server.py\n\n[Install]\nWantedBy=multi-user.target\n \u6ce8\u610f\u66ff\u6362\u4f60\u7684${USER} \u4fee\u6539\u914d\u7f6e\u6587\u4ef6\u7684\u6743\u9650\uff1a sudo chmod 644 /lib/systemd/system/ocr.service\n \u81ea\u542f\u670d\u52a1\u751f\u6548\uff1a sudo systemctl daemon-reload\nsudo systemctl enable ocr.service\n \u67e5\u770b\u670d\u52a1\u72b6\u6001\uff1a sudo systemctl status ocr.service\n \u4f60\u53ef\u4ee5\u518d\u91cd\u542f\u4e0b\u7535\u8111\uff0c\u770b\u770b\u670d\u52a1\u662f\u4e0d\u662f\u6b63\u5e38\u542f\u52a8\u4e86\uff0c\u6ca1\u62a5\u9519\u5c31 OK \u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_4","title":"\u4e94\u3001\u5c5e\u6027\u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_3","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 UI \u81ea\u52a8\u5316\u5927\u591a\u90fd\u662f\u57fa\u4e8e\u6d4f\u89c8\u5668\u7684\uff0c\u6838\u5fc3\u662f\u5728\u7f51\u9875\u7684 DOM \u6811\u4e0a\u67e5\u627e\u5143\u7d20\uff0c\u5e76\u5bf9\u5176\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\uff1b Linux \u684c\u9762\u5e94\u7528\u5927\u591a\u662f\u91c7\u7528 Qt \u7f16\u5199\u7684\uff0c\u5728 Qt \u4e2d\u4e5f\u662f\u4ece\u6700\u9876\u5c42\u7684 MainWindow \u5f00\u59cb\u6784\u5efa\u5e94\u7528\uff0c\u6240\u4ee5\u903b\u8f91\u4e5f\u662f\u4e00\u6837\u7684\uff0cQt \u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u540c\u6837\u53ef\u4ee5\u901a\u8fc7 DOM \u6811\uff08\u5c5e\u6027\u6811\uff09\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff0c\u6211\u4eec\u79f0\u4e4b\u4e3a\u5c5e\u6027\u5b9a\u4f4d\u3002 \u501f\u52a9\u5f00\u6e90\u5de5\u5177 dogtail \u6211\u4eec\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u83b7\u53d6\uff0c\u4ece\u800c\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\u3002dogtail \u7684\u9879\u76ee\u4ecb\u7ecd\u53ef\u4ee5\u731b\u6233\u8fd9\u91cc\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_3","title":"2\u3001\u4f7f\u7528\u65b9\u6cd5","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#21sniff","title":"2.1\u3001sniff\uff08\u55c5\u63a2\u5668\uff09\u4f7f\u7528","text":"\u5728\u7ec8\u7aef\u8f93\u5165 sniff \u542f\u52a8 AT-SPI Browser mikigo@mikigo-PC:~$ sniff\n \u67e5\u770b\u5e94\u7528\u7684\u6807\u7b7e \u5728 sniff \u91cc\u9762\u53ef\u4ee5\u770b\u5230\u7cfb\u7edf\u4e2d\u5df2\u542f\u52a8\u7684\u5e94\u7528\uff0c\u70b9\u51fb\u5e94\u7528\u540d\u79f0\u524d\u9762\u7684\u4e09\u89d2\u5f62\u56fe\u6807\uff0c\u53ef\u4ee5\u5c55\u5f00\u5e94\u7528\u7684\u6807\u7b7e\uff0c\u6240\u6709\u6807\u7b7e\u4ee5 tree \u7684\u5f62\u5f0f\u5c55\u793a\uff0c\u5bf9\u5e94\u5e94\u7528\u91cc\u9762\u7684\u7236\u7a97\u53e3\u548c\u5b50\u7a97\u53e3\u3002 \u83b7\u53d6\u5143\u7d20\u63a7\u4ef6\u7684\u6807\u7b7e\u540d\u79f0 \u9996\u5148\uff0c\u4e3a\u4e86\u65b9\u4fbf\u67e5\u770b\u5143\u7d20\u63a7\u4ef6\u5bf9\u5e94\u7684\u4f4d\u7f6e\uff0c\u5efa\u8bae\u73b0\u5728\u4e0a\u65b9\u5de5\u5177\u680f\u70b9\u51fb Actions\uff0c\u7136\u540e\u52fe\u9009 Hightlight Items\uff0c\u8fd9\u6837\u5728 sniff \u4e2d\u9f20\u6807\u9009\u4e2d\u5143\u7d20\u6807\u7b7e\u7684\u65f6\u5019\uff0c\u5e94\u7528\u4e2d\u4f1a\u6709\u76f8\u5e94\u7684\u5149\u6807\u9501\u5b9a\u3002 \u5728 sniff \u91cc\u9762\u70b9\u51fb\u8fdb\u5165\u5e94\u7528\u7684\u6807\u7b7e tree \u4e2d\u540e\uff0c\u70b9\u51fb\u76f8\u5e94\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5728\u5de5\u5177\u4e0b\u65b9\uff0c\u4f1a\u5c55\u793a\u5143\u7d20\u63a7\u4ef6\u7684 Name\uff0c\u8fd9\u4e2a\u5c31\u662f\u6807\u7b7e\u540d\u79f0\u3002 \u5728 tree \u4e2d\u6709\u4e9b\u5730\u65b9\u662f\u7a7a\u767d\u7684\u6216\u8005\u662f Form\uff0c\u662f\u56e0\u4e3a\u5f00\u53d1\u4eba\u5458\u5728\u6dfb\u52a0\u6807\u7b7e\u7684\u65f6\u5019\u6ca1\u6709\u6dfb\u52a0\uff0c\u6216\u8005\u6709\u4e9b\u7236\u7a97\u53e3\u4e0d\u9700\u8981\u6dfb\u52a0\uff0c\u8fd9\u79cd\u5728\u5b9e\u9645\u4e1a\u52a1\u4e2d\u662f\u4e0d\u5f71\u54cd\u7684\uff0c\u6211\u4eec\u53ea\u8981\u4fdd\u8bc1\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\u4e2d\uff0c\u8981\u7528\u5230\u7684\u5143\u7d20\u90fd\u6dfb\u52a0\u4e86\u6807\u7b7e\u5373\u53ef\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#22","title":"2.2\u3001\u5143\u7d20\u64cd\u4f5c","text":"\u83b7\u53d6\u5e94\u7528\u5bf9\u8c61 dogtail \u83b7\u53d6\u5e94\u7528\u5bf9\u8c61\u7684\u65f6\u5019\uff0c\u4f7f\u7528\u7684\u662f tree \u5e93\u91cc\u9762\u7684 application() \u65b9\u6cd5\uff1a from dogtail.tree import root\napp_obj = root.application('deepin-music')\n app_obj\u5c31\u662f\u5e94\u7528\u7684\u5bf9\u8c61\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\uff0c\u662f\u5e94\u7528\u5bf9\u8c61\u4f7f\u7528child()\u65b9\u6cd5\uff1a element = app_obj.child('element_name')\n \u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u4f20\u5165\u5143\u7d20\u7684 Name\uff0c\u83b7\u53d6\u5230\u76f8\u5e94\u5143\u7d20\u7684\u5bf9\u8c61\u3002Name \u53ef\u4ee5\u901a\u8fc7 sniff \u67e5\u770b\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\u5217\u8868: element_list = element.children\n \u83b7\u53d6\u5230\u8fd9\u4e2a\u5143\u7d20\u4e0b\u9762\u6240\u6709\u7684\u5143\u7d20\u5217\u8868\u3002 \u8fd9\u4e2a\u65b9\u6cd5\u9002\u7528\u4e8e\u6709\u4e9b\u6807\u7b7e\u6ca1\u6709\u6dfb\u52a0\uff0c\u4f46\u662f\u4f4d\u7f6e\u662f\u56fa\u5b9a\u7684\uff0c\u6211\u4eec\u901a\u8fc7\u7d22\u5f15\u53ef\u4ee5\u53d6\u5f97\u5143\u7d20\u3002 element_list[0]\n \u5bf9\u5143\u7d20\u7684\u64cd\u4f5c \u5728\u83b7\u53d6\u5230\u5143\u7d20\u4e4b\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u76f8\u5e94\u7684\u64cd\u4f5c\u3002 \u5355\u51fb element.click(button=1)\n button 1 \u2014>\u5de6\u952e\uff0c2 \u2014>\u6eda\u8f6e\uff0c3 \u2014>\u53f3\u952e\uff0c\u9ed8\u8ba4\u4e3a 1 \u53cc\u51fb element.doubleClick(button=1)\n \u9f20\u6807\u60ac\u505c element.point()\n \u9f20\u6807\u79fb\u52a8\u5230\u5143\u7d20\u4e2d\u5fc3\u4f4d\u7f6e \u6587\u672c\u8f93\u5165 element.typeText(string)\n \u5411\u5143\u7d20\u5bf9\u8c61\u8f93\u5165\u5b57\u7b26\u4e32 \uff0c\u6bd4\u5982\u8f93\u5165\u6846 \u7ec4\u5408\u952e element.keyCombo(comboString)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#23","title":"2.3\u3001\u6846\u67b6\u5c01\u88c5","text":"\u4ee3\u7801\u793a\u4f8b\uff1a # \u8be6\u7ec6\u4ee3\u7801\u8bf7\u67e5\u770b src/dogtail_utils.py\nclass DogtailUtils:\ndef __init__(self, name=None, description=None):\nself.name = name\nself.description = description\nself.obj = root.application(self.name, self.description)\ndef app_element(self, *args, **kwargs):\n\"\"\"\n \u83b7\u53d6app\u5143\u7d20\u7684\u5bf9\u8c61\n :return: \u5143\u7d20\u7684\u5bf9\u8c61\n \"\"\"\nreturn self.obj.child(*args, **kwargs, retry=False)\ndef element_center(self, element) -> tuple:\n\"\"\"\n \u83b7\u53d6\u5143\u7d20\u7684\u4e2d\u5fc3\u4f4d\u7f6e\n :param element:\n :return: \u5143\u7d20\u4e2d\u5fc3\u5750\u6807\n \"\"\"\n_x, _y, _w, _h = self.app_element(element).extents\n_x = _x + _w / 2\n_y = _y + _h / 2\nreturn _x, _y\n \u6846\u67b6\u63d0\u4f9b\u7684\u63a5\u53e3\u975e\u5e38\u7b80\u6d01\uff0c\u5728\u8c03\u7528\u65f6\uff1a self.dog.element_center(\"\u64ad\u653e\")\n \u8fd9\u6837\u5c31\u80fd\u83b7\u53d6\u5230\u6b64\u5143\u7d20\u7684\u4e2d\u5fc3\u5750\u6807\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_5","title":"\u516d\u3001\u6807\u7b7e\u5316\u7ba1\u7406","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_4","title":"1\u3001\u6807\u7b7e\u8bf4\u660e","text":"\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u811a\u672c ID\uff1a\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c/\u51fd\u6570 ID\uff1b PMS\u7528\u4f8bID\uff1aPMS \u4e0a\u5bf9\u5e94\u7684\u7528\u4f8b ID\uff08\u7528\u4f8b\u5e93 ID\uff09\uff1b \u9ed8\u8ba4\u4f7f\u7528\u7528\u4f8b\u5e93 ID\uff0c\u5bf9\u4e8e\u6682\u65f6\u6ca1\u6709\u4f7f\u7528\u7528\u4f8b\u5e93\u7ba1\u7406\u7528\u4f8b\u7684\u9879\u76ee\uff0c\u53ef\u4ee5\u4f7f\u7528\u4ea7\u54c1\u5e93\u7528\u4f8b ID\uff1b \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1aFUNC\uff08\u529f\u80fd\uff09\u3001PERF\uff08\u6027\u80fd\uff09\u3001STR\uff08\u538b\u529b\uff09\u3001SEC\uff08\u5b89\u5168\uff09\u3001CTS\uff08\u517c\u5bb9\u6027\uff09\u3001API\uff08\u63a5\u53e3\uff09\u3001BASELINE\uff08\u57fa\u7ebf-\u9884\u7559\uff09 \u8bbe\u5907\u7c7b\u578b\uff1aPPL\uff08\u4f9d\u8d56\u5916\u8bbe\u7684\u7528\u4f8b\uff09\u3001COL\uff08\u4f9d\u8d56\u4e3b\u63a7\u673a\u7684\u7528\u4f8b\uff09 \u7528\u4f8b\u6765\u6e90\uff1aBUG\uff08\u7531 Bug \u8f6c\u7684\u7528\u4f8b\uff09 \u4e0a\u7ebf\u5bf9\u8c61\uff1aCICD\uff0c\u8868\u793a\u4e0a\u7ebf\u5230 CICD \u6d41\u6c34\u7ebf\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u53ef\u4e00\u952e\u751f\u6210 case_list.csv \u6587\u4ef6\uff0c\u7528\u4e8e\u5bfc\u5165\u5230\u660e\u9053\u4e91 AT \u7528\u4f8b\u5217\u8868\u4e2d\u63a7\u5236 CICD \u8dd1\u6d4b\u8303\u56f4\uff1b \u6d4b\u8bd5\u7ea7\u522b\uff1aC1 / C2 / C3 / C4\uff0c\u5177\u4f53\u5b9a\u4e49\u53c2\u8003\u6d41\u6c34\u7ebf\u4f7f\u7528\u6307\u5bfc\uff1b \u8df3\u8fc7\u539f\u56e0\uff1askip-XXX\uff0c\u7528\u4e8e\u63a7\u5236\u7528\u4f8b\u662f\u5426\u6267\u884c\uff1b \u786e\u8ba4\u4fee\u590d\uff1afixed-XXX\uff0c\u7528\u4e8e\u6807\u8bb0\u7528\u4f8b\u7684\u4fee\u590d\u72b6\u6001\uff08\u540e\u9762\u8be6\u7ec6\u8bb2\u89e3\u7528\u6cd5\uff09\uff1b \u5e9f\u5f03\u7528\u4f8b\uff1aremoved-\u5df2\u5e9f\u5f03\uff0c\u7528\u4e8e\u6807\u8bb0\u5df2\u7ecf\u5e9f\u5f03\u7684\u7528\u4f8b\uff0c\u6b64\u7528\u4f8b\u6807\u7b7e\u4e0d\u4f1a\u88ab\u6dfb\u52a0\uff0c\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff1b \u793a\u4f8b\uff1a \u811a\u672cID PMS\u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u8bbe\u5907\u7c7b\u578b \u7528\u4f8b\u6765\u6e90 \u4e0a\u7ebf\u5bf9\u8c61 \u6d4b\u8bd5\u7ea7\u522b \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b ... 679537 679537 L1 FUNC PPL CICD C1 skip-XXX fixed-XXX removed-\u5df2\u5e9f\u5f03 ..."},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_4","title":"2\u3001\u64cd\u4f5c\u6b65\u9aa4","text":"2.1\u3001\u5728\u5b50\u9879\u76ee\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u4ee5\u7528\u4f8b\u7684 py \u6587\u4ef6\u9664\u53bb\u9996\u5b57\u7b26\u4e32 \"test_\" \u548c\u7528\u4f8b\u5e8f\u53f7\u540e\u7684\u5b57\u7b26\u4e32\u4f5c\u4e3a csv \u7684\u6587\u4ef6\u540d\u3002 \u4f8b\u5982: \u76f8\u518c\u7684\u7528\u4f8b\u6587\u4ef6\u4e3a test_album_xxx.py\uff0cxxx \u8868\u793a\u7528\u4f8b\u7684ID\uff08\u4e5f\u53ef\u4ee5\u662f\u81ea\u5b9a\u4e49\u7684\u6570\u5b57\u4ee3\u8868\u7528\u4f8b\u5e8f\u53f7\uff09\uff0c\u6b64\u65f6 csv \u6587\u4ef6\u540d\u5c31\u5e94\u4e3a album.csv\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u6240\u6709 csv \u6587\u4ef6\u5efa\u8bae\u653e\u5728\u4e00\u4e2a tags \u76ee\u5f55\u4e0b\u3002 \u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 2.2\u3001\u7b2c\u4e00\u5217\u4e3a\u811a\u672c ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b\u7528\u4f8b\u6807\u7b7e\u53ef\u4ee5\u65e0\u5e8f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_2","title":"3\u3001\u589e\u52a0\u8bf4\u660e","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_1","title":"3.1\u3001\u8df3\u8fc7\u7528\u4f8b","text":"\u4f20\u7edf\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668(@pytest.mark.skip)\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a; \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#311","title":"3.1.1\u3001\u56fa\u5b9a\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 679537 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u7b7e\u5f00\u5934\u4e3a \u201cskip-XXX\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\uff0c\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\u5219\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u7b7e\u4e3a SKIPED\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#312","title":"3.1.2\u3001\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skipif_platform-aarch64&mips64 \u67d0\u4e9b\u7528\u4f8b\u4f1a\u56e0\u4e3a\u4e0d\u540c\u7684\u73af\u5883\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\uff0c\u5e38\u89c1\u7684\u573a\u666f\u4e3a\u5728\u4e0d\u540c\u67b6\u6784\u4e0a\u5224\u65ad\u662f\u5426\u6267\u884c\uff0c\u8df3\u8fc7\u7684\u539f\u56e0\u6807\u7b7e\u4e3a \u201cskipif_platform-\u201d \u52a0\u67b6\u6784\u540d\uff0c\u591a\u4e2a\u67b6\u6784\u4e4b\u95f4\u4f7f\u7528 \u201c&\u201d \u62fc\u63a5\uff1b \u4ee5\u4e0a\u4f8b\u5b50\u4e3a\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u5224\u65ad\u5f53\u524d\u67b6\u6784\u662f\u5426\u4e3a arrch64 \u6216\u8005 mips64\uff0c\u82e5\u662f\uff0c\u5219\u8df3\u8fc7\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u82e5\u5426\u5219\u6267\u884c\u7528\u4f8b\uff1b \u76ee\u524d\u6846\u67b6\u9ed8\u8ba4\u4ec5\u652f\u6301\u67b6\u6784\u7684\u6761\u4ef6\u5224\u65ad\uff0c\u4f46\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u903b\u8f91\u652f\u6301\u81ea\u5b9a\u4e49\u6dfb\u52a0\u3002 \u5728\u9879\u76ee\u76ee\u5f55\u8def\u5f84\u4e0b\u5b58\u5728\u6587\u4ef6 setting/skipif.py\uff0c\u6240\u6709\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u7684\u51fd\u6570\u5199\u5728\u6b64\u6587\u4ef6\u4e2d\u3002 \u9ed8\u8ba4\u67b6\u6784\u5224\u65ad\u4f8b\u5b50\uff1a def skipif_platform(args: str):\n\"\"\"\u5e73\u53f0\u8df3\u8fc7\"\"\"\n_skip_key = args.split(\"&\")\nfor key in _skip_key:\nif GlobalConfig.SYS_ARCH == key:\nreturn True\nreturn False\n \u65b9\u6cd5\u7f16\u5199\u89c4\u8303\uff1a \u65b9\u6cd5\u540d\u5fc5\u987b\u4ee5 skipif \u5f00\u5934\uff1b \u65b9\u6cd5\u5fc5\u987b\u6709\u8fd4\u56de\u7ed3\u679c\u5e76\u4e14\u4e3a\u5e03\u5c14\u503c\uff08True \u4ee3\u8868\u8df3\u8fc7\uff0cFalse \u4ee3\u8868\u4e0d\u8df3\u8fc7\uff09\uff1b \u65b9\u6cd5\u53ea\u80fd\u6709\u4e00\u4e2a\u5165\u53c2\uff1b \u5728 csv \u6587\u4ef6\u8df3\u8fc7\u539f\u56e0\u4e00\u680f\u4e2d\u586b\u5199\u4e3a \u201c{\u51fd\u6570\u540d}-{\u53c2\u6570}\u201d\uff0c\u4f8b\u5982\uff1askipif_platform-aarch64\uff1b\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u4f1a\u4ee5\u7b2c\u4e00\u4e2a \u201c-\u201d \u8fdb\u884c\u5206\u5272\uff0c\u622a\u53d6\u7684\u5de6\u4fa7\u5b57\u7b26\u4e32\u4f5c\u4e3a\u51fd\u6570\u540d\uff0c\u5728 skipif.py \u6587\u4ef6\u4e2d\u67e5\u627e\u662f\u5426\u6709\u540c\u540d\u51fd\u6570\uff0c\u5e76\u5c06\u622a\u53d6\u7684\u53f3\u4fa7\u4f5c\u4e3a\u53c2\u6570\u4f20\u9012\u7ed9\u8be5\u51fd\u6570\uff0c\u901a\u8fc7\u83b7\u53d6\u8be5\u51fd\u6570\u8fd4\u56de\u7684\u5e03\u5c14\u503c\uff0c\u8fd4\u56de True\uff0c\u5219\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u8fd4\u56de False\uff0c\u5219\u6267\u884c\u8be5\u7528\u4f8b\u3002 \u82e5\u51fd\u6570\u9700\u8981\u591a\u4e2a\u53c2\u6570\uff0c\u53ef\u81ea\u5b9a\u4e49\u591a\u4e2a\u53c2\u6570\u4e4b\u95f4\u7684\u8fde\u63a5\u7b26\uff0c\u8fde\u63a5\u7b26\u53f7\u4e0d\u53ef\u4f7f\u7528\u4e0b\u5212\u7ebf\u548c\u9017\u53f7\uff0c\u63a8\u8350\u7edf\u4e00\u4f7f\u7528 & \u7b26\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32","title":"3.2\u3001\u786e\u8ba4\u4fee\u590d","text":"\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7528\u4f8b\u4fee\u590d\u540e\uff0c\u4f46\u4e0d\u80fd\u7acb\u5373\u5220\u9664\u8df3\u8fc7\u539f\u56e0\uff08skip-XXX\uff09\u7684\u7528\u4f8b\uff0c\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u786e\u8ba4\u4fee\u590d\u201d\uff0c\u4f5c\u4e3a\u6807\u8bb0\u8be5\u7528\u4f8b\u662f\u5426\u5df2\u7ecf\u4fee\u590d\uff0c\u56fa\u5b9a\u586b\u5165\u5b57\u6bb5\u4e3a \u201cfixed-\u5df2\u4fee\u590d\u201d\u3002\u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u5373\u4f7f\u540c\u65f6\u6807\u8bb0\u4e86 skip-XXX \u4e5f\u4f1a\u6b63\u5e38\u6267\u884c\u3002 \u793a\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d 679537 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d \u3010\u540c\u65f6\u6807\u8bb0\u4e86skip \u548c fixed\uff0c\u4f46\u4ecd\u7136\u60f3\u8981\u8df3\u8fc7\u7528\u4f8b\u3011 \u5f53 \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u540c\u65f6\u586b\u5165\u540e\uff0c\u547d\u4ee4\u884c\u4f20\u9012\u53c2\u6570 --ifixed yes\uff0c\u5219\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\u8be5\u6761\u7528\u4f8b\u3002 python3 manage.py run --ifixed yes\n \u770b\u5230\u8fd9\u91cc\u6709\u4e9b\u540c\u5b66\u53ef\u80fd\u8981\u95ee\u4e86\uff0c\u6211\u60f3\u6062\u590d\u8df3\u8fc7\u6267\u884c\uff0c\u76f4\u63a5\u628a skip-XXX \u8fd9\u4e00\u5217\u6807\u7b7e\u5220\u6389\u4e0d\u5c31\u597d\u4e86\uff0c\u8fd8\u641e\u4ec0\u4e48\u786e\u8ba4\u4fee\u590d\u5e72\u5565\uff1f \u8fd9\u91cc\u7ed9\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u89e3\u91ca\u4e00\u4e0b\uff1a \uff08\u4ee5\u4e0b\u6d41\u6c34\u7ebf\u6307\u7684\u662f\u6bcf\u65e5\u6784\u5efa\u7684\u6d41\u6c34\u7ebf\uff0c\u8dd1 AT \u7684\u5168\u91cf\u7528\u4f8b\uff09 \u9996\u5148\uff0c\u6d41\u6c34\u7ebf\u4e0a\u8dd1\u7684\u662f AT \u5386\u53f2 Tag\uff0c\u8df3\u8fc7\u7528\u4f8b\u7684\u6807\u7b7e(skip-XXX) \u662f\u5728\u6700\u65b0\u7684\u4ee3\u7801\u4e0a\u63d0\u4ea4\u7684\uff0c\u6211\u4eec\u91c7\u7528\u6700\u65b0\u7684 csv \u6587\u4ef6\u8986\u76d6\u5386\u53f2 csv \u6587\u4ef6\u7684\u8bbe\u8ba1\u6765\u5b9e\u73b0\u4e86\u5bf9\u5386\u53f2 Tag \u4e0a\u7528\u4f8b\u7684\u8df3\u8fc7\uff1b \u7136\u540e\uff0c\u5728\u65e5\u5e38\u8df3\u8fc7\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u540c\u65f6\u4e5f\u5728\u4fee\u590d\u4e00\u4e9b\u7528\u4f8b\uff0c\u4fee\u590d\u540e\u7684\u8fd9\u4e9b\u7528\u4f8b\u5728\u672c\u5730\u8c03\u8bd5\u7684\u65f6\u5019\u6211\u4eec\u4e0d\u5e0c\u671b\u7ee7\u7eed\u8df3\u8fc7\uff0c\u4f46\u662f\u6b64\u65f6\uff0c\u4fee\u590d\u7684\u8fd9\u4e9b\u7528\u4f8b\u53ef\u80fd\u8fd8\u4e0d\u7a33\u5b9a\uff0c\u4e0d\u9002\u5408\u9a6c\u4e0a\u653e\u5230\u6d41\u6c34\u7ebf\u53bb\u8dd1\uff0c\u4e5f\u5c31\u662f\u8bf4\u6d41\u6c34\u7ebf\u4e0a\u6211\u4eec\u662f\u5e0c\u671b\u4ed6\u7ee7\u7eed\u8df3\u8fc7\u7684\uff0c\u56e0\u6b64\uff0c\u54b1\u4e0d\u80fd\u76f4\u63a5\u628a skip-XXX \u5e72\u6389\uff1b \u8fd9\u91cc\u5c31\u77db\u76fe\u4e86\uff0c\u4e00\u4e2a\u9700\u6c42\u662f\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u53e6\u4e00\u4e2a\u9700\u6c42\u53c8\u4e0d\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u600e\u4e48\u529e\u5462\uff1f \u6211\u4eec\u4f7f\u7528\u201c\u786e\u8ba4\u4fee\u590d\u201d\u6765\u6807\u8bb0\u8fd9\u6761\u7528\u4f8b\u5df2\u7ecf\u4fee\u590d\u4e86\uff0c\u8fd9\u6837\u4f60\u672c\u5730\u8c03\u8bd5\u7528\u4f8b\u7684\u65f6\u5019\u8fd9\u6761\u5df2\u4fee\u590d\u7684\u7528\u4f8b\u662f\u4f1a\u6267\u884c\u7684\uff0c\u540c\u65f6\u5728\u6d41\u6c34\u7ebf\u4e0a\u5c06 --ifixed yes \u53c2\u6570\u52a0\u4e0a\uff0c\u90a3\u4e48\u6d41\u6c34\u7ebf\u4e0a\u6267\u884c\u65f6\u8fd9\u6761\u7528\u4f8b\u4ecd\u7136\u662f\u8df3\u8fc7\u7684\u72b6\u6001\uff0c\u540e\u7eed\u4f60\u6253 Tag \u7684\u65f6\u5019\uff0c\u628a \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u7684\u6807\u7b7e\u5168\u90e8\u5220\u6389\u5c31\u53ef\u4ee5\u4e86\u3002 \u8fd9\u5c31\u662f\u201c\u786e\u8ba4\u4fee\u590d\u201d\u8fd9\u4e2a\u6807\u7b7e\u7684\u80cc\u666f\uff0c\u9700\u8981\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u54c1\u4e00\u54c1\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#33","title":"3.3\u3001\u5e9f\u5f03\u7528\u4f8b","text":"\u9488\u5bf9\u67d0\u4e9b\u7528\u4f8b\uff0c\u7531\u4e8e\u9700\u6c42\u53d8\u66f4\uff0c\u73af\u5883\u5f71\u54cd\u6216\u8bc4\u4f30\u4e0d\u518d\u9002\u7528\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u65f6\uff0c\u7528\u4f8b\u9700\u8981\u5e9f\u5f03\uff0c\u5219\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u5e9f\u5f03\u7528\u4f8b\u201d\uff0c\u8be5\u5217\u5b58\u5728 \u201cremoved-{\u5e9f\u5f03\u539f\u56e0}\u201d\uff0c\u5219\u7528\u4f8b\u4e0d\u4f1a\u6267\u884c\u3002 \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d removed-\u5df2\u5e9f\u5f03 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_2","title":"4\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u4e0a\u9762\u4ecb\u7ecd Pytest \u6846\u67b6\u63d0\u4f9b\u7684\u6807\u7b7e\u529f\u80fd mark\uff0c\u4f7f\u7528\u65f6\u9700\u8981\u4e3a\u6bcf\u4e00\u4e2a\u7528\u4f8b\u6dfb\u52a0\u6807\u7b7e\u88c5\u9970\u5668\uff0c\u5219\u64cd\u4f5c\u590d\u6742\uff0c\u53ef\u7ef4\u62a4\u6027\u5dee\uff0c\u5176\u6839\u672c\u95ee\u9898\u5c31\u662f\u6807\u7b7e\u5206\u6563\u5728\u6bcf\u4e00\u6761\u7528\u4f8b\u7684\u88c5\u9970\u5668\u4e0a\uff0c\u96be\u4ee5\u96c6\u4e2d\u7ef4\u62a4\uff1b\u4e8e\u662f\u4e4e\u5c06\u6240\u6709\u6807\u7b7e\u4f7f\u7528 csv \u6587\u4ef6\u8fdb\u884c\u96c6\u4e2d\u7ba1\u7406\uff0c\u5e76\u901a\u8fc7 Pytest \u7684\u94a9\u5b50\u51fd\u6570\uff0c\u8bfb\u53d6 csv \u6587\u4ef6\uff0c\u52a8\u6001\u6dfb\u52a0\u6807\u7b7e\u5230\u7528\u4e2d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5csv","title":"5\u3001CSV\u6587\u4ef6\u683c\u5f0f","text":"\u6b64\u914d\u7f6e\u6587\u4ef6\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u6807\u7b7e\u6570\u636e\uff0c\u4e14\u8981\u65b9\u4fbf\u80fd\u4f7f\u7528 Excel \u6253\u5f00\u8fdb\u884c\u7f16\u8f91\u67e5\u770b\uff0c\u66f4\u91cd\u8981\u7684\u662f\u6211\u4eec\u4e0d\u60f3\u5f15\u5165\u4e09\u65b9\u4f9d\u8d56\uff0cCSV \u6587\u4ef6\u51e0\u4e4e\u662f\u552f\u4e00\u80fd\u6ee1\u8db3\u6240\u6709\u7684\u8981\u6c42\u7684\u6587\u4ef6\u683c\u5f0f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_6","title":"\u4e03\u3001\u65e5\u5fd7\u7cfb\u7edf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_5","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e YouQu \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u64cd\u4f5c\u65b9\u6cd5\u5c01\u88c5\u5199\u6cd5\uff0c\u901a\u5e38\u662f\u8fd9\u6837\u7684\uff1a\u7c7b\u91cc\u9762\u4e00\u4e2a\u51fd\u6570\u53ea\u5305\u542b\u4e00\u4e2a\u64cd\u4f5c\u6216\u591a\u6b21\u8c03\u7528\u7684\u4e00\u7cfb\u5217\u53ef\u5408\u5e76\u7684\u64cd\u4f5c\uff1b \u4f20\u7edf\u7684\u65e5\u5fd7\u8f93\u51fa\u65b9\u5f0f\uff0c\u9700\u8981\u5728\u6bcf\u4e2a\u51fd\u6570\u91cc\u9762\u4e3b\u52a8\u7f16\u5199\u65e5\u5fd7\u8f93\u51fa\u4ee3\u7801 \uff0c\u4f8b\u5982\uff1a class XXXWidget:\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\nlogger.info(\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\")\n...\n# \u7701\u7565\u4ee3\u7801\u90e8\u5206\n \u4e00\u4e2a\u51fd\u6570\u91cc\u9762\u81f3\u5c11\u5305\u542b\u4e00\u6761\u65e5\u5fd7\u4fe1\u606f\uff0c\u5982\u679c\u6bd4\u8f83\u590d\u6742\u64cd\u4f5c\u6b65\u9aa4\uff0c\u53ef\u80fd\u5305\u542b\u591a\u6761\u65e5\u5fd7\u4fe1\u606f\uff1b \u4e00\u4e2a\u5e94\u7528\u542b\u6709\u5927\u91cf\u7684\u64cd\u4f5c\u51fd\u6570\uff0c\u4e5f\u5c31\u662f\u8bf4\u6211\u4eec\u9700\u8981\u5199\u5927\u91cf\u7684\u65e5\u5fd7\u4ee3\u7801\uff1b \u901a\u8fc7\u7ecf\u9a8c\u89c2\u5bdf\uff0c\u6211\u4eec\u53d1\u73b0\uff0c\u51fd\u6570\u8bf4\u660e\u4ee5\u53ca\u51fd\u6570\u64cd\u4f5c\u65e5\u5fd7\uff0c\u5177\u6709\u8f83\u9ad8\u7684\u91cd\u590d\u5ea6\uff08\u4ece\u4e0a\u9762\u7684\u4f8b\u5b50\u4e5f\u53ef\u4ee5\u770b\u51fa\u6765\uff09\uff0c\u56e0\u6b64\u6211\u4eec\u5927\u80c6\u7684\u8bbe\u60f3\uff0c\u80fd\u4e0d\u80fd\u57fa\u4e8e\u6846\u67b6\u6267\u884c\u65f6\uff0c\u81ea\u52a8\u7684\u5c06\u51fd\u6570\u8bf4\u660e\u4f5c\u4e3a\u65e5\u5fd7\u6253\u5370\u51fa\u6765\uff0c\u4ece\u800c\u51cf\u5c11\u5927\u91cf\u65e5\u5fd7\u4ee3\u7801\u91cf\u548c\u91cd\u590d\u7f16\u5199\uff0c\u90a3\u771f\u662f\u5999\u554a~\u3002 \u57fa\u4e8e\u6b64\u201c\u5929\u771f\u201d\u7684\u60f3\u6cd5\uff0c\u6211\u4eec\u8bbe\u8ba1\u51fa\u4e86 youqu \u7684\u65e5\u5fd7\u7cfb\u7edf\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_5","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u6838\u5fc3\u539f\u7406\uff1a \u901a\u8fc7\u7ed9\u7c7b\u52a0\u4e0a\u4e00\u4e2a\u88c5\u9970\u5668 @log\uff0c\u52a8\u6001\u7ed9\u8be5\u7c7b\u4e0b\u6240\u6709\u7684\u51fd\u6570\u53ca\u7236\u7c7b\u51fd\u6570\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668 @_trace\uff0c\u5728\u6b64\u88c5\u9970\u5668\u4e2d\u6211\u4eec\u80fd\u52a8\u6001\u7684\u6355\u83b7\u6240\u8c03\u7528\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff08func.__doc__\uff09\uff0c\u901a\u8fc7\u65e5\u5fd7\u8f93\u51fa\u5668\u5c06\u5176\u8f93\u51fa\u5373\u53ef\u3002 \u5b9e\u73b0\u6b65\u9aa4\uff1a \u901a\u8fc7 inspect.getmembers \u83b7\u53d6\u88ab\u88c5\u9970\u7684\u7c7b\u4e0b\u6240\u6709\u51fd\u6570\uff0c\u5305\u542b\u9759\u6001\u65b9\u6cd5\uff0c\u7c7b\u65b9\u6cd5\uff0c\u5b9e\u4f8b\u65b9\u6cd5\uff1b \u901a\u8fc7 setattr(\u7c7b, \u65b9\u6cd5, _trace\uff09 \u7684\u65b9\u5f0f\uff0c\u7ed9\u7b26\u5408\u6761\u4ef6\u7684\u51fd\u6570\uff0c\u52a8\u6001\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_3","title":"3\u3001\u65e5\u5fd7\u914d\u7f6e","text":"[log_cli]\n;\u65e5\u5fd7\u76f8\u5173\u914d\u7f6e\uff08\u4e0d\u6253\u5370\u6784\u9020\u51fd\u6570\u548c\u9b54\u6cd5\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff09\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = INFO\n# ============= \u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u914d\u7f6e ================\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u5f00\u5934\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7, \u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_STARTSWITH = Assert\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u7ed3\u5c3e\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_ENDSWITH = Widget\n;\u652f\u6301\u7c7b\u540d\u5305\u542b xxx \u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_CONTAIN = ShortCut\n# ==============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_3","title":"4\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u5728\u5e94\u7528\u5e93 widget \u65b9\u6cd5\u5e93\u91cc\u9762\uff0c\u53ea\u9700\u8981\u5728\u51fa\u53e3\u6587\u4ef6\u52a0\u4e0a\u7c7b\u88c5\u9970\u5668\uff0c\u5c31\u53ef\u4ee5\u5b9e\u73b0\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u4e86\uff1b # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6ce8\u610f\uff0c\u662f\u7c7b\u88c5\u9970\u5668\u3002 \u5b9e\u4f8b\uff1a # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\n@classmethod\ndef find_dfm_image(cls, *elements, multiple=False, rate=0.9):\n\"\"\"\n \u67e5\u627e\u56fe\u7247 {{elements}}.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e {{rate}} \u7684\u5750\u6807\n :param elements:\n :param multiple:\n :return:\n \"\"\"\nelement = tuple(map(lambda x: f\"{Config.PIC_RES_PATH}/{x}\", elements))\nreturn cls.find_image(*element, multiple=multiple)\n \u8c03\u7528\u65b9\u6cd5\u65f6\uff1a DfmWidget.find_dfm_image(\"dfm_001\")\n \u81ea\u52a8\u8f93\u51fa\u7684\u65e5\u5fd7\uff1a >> x86_64-uos-6: 02/28 17:48:47 | INFO | logger_utils: [find_dfm_image]: \u67e5\u627e\u56fe\u7247 dfm_001.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e 0.9 \u7684\u5750\u6807\n \u52a0\u4e0a\u88c5\u9970\u5668 @log \u4e4b\u540e\uff0c\u65b9\u6cd5\u5c42\u6240\u6709\u7684\u51fd\u6570\uff08\u5305\u62ec\u5b9e\u4f8b\u65b9\u6cd5\u3001\u7c7b\u65b9\u6cd5\u3001\u9759\u6001\u65b9\u6cd5\uff09\u90fd\u4e0d\u9700\u8981\u518d\u5199\u65e5\u5fd7\u4ee3\u7801\uff0c\u6267\u884c\u7684\u65f6\u5019\u4f1a\u81ea\u52a8\u8f93\u51fa\uff0c\u5e76\u4e14\u6240\u6709\u8c03\u7528\u7684\u65b9\u6cd5\u4f1a\u4ee5 allure.step \u7684\u65b9\u5f0f\uff0c\u5c55\u793a\u5728 allure \u62a5\u544a\u4e2d\uff0c\u5728\u62a5\u544a\u4e2d\u66f4\u80fd\u4e00\u76ee\u4e86\u7136\u7684\u770b\u5230\u7528\u4f8b\u6267\u884c\u6b65\u9aa4\u3002 \u3010\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\u3011 \u901a\u8fc7\u89c2\u5bdf\u524d\u9762\u7684\u4f8b\u5b50\uff0c\u7ec6\u5fc3\u7684\u540c\u5b66\u53ef\u80fd\u8fd8\u53d1\u73b0\u4e86\u4e00\u4e2a\u5c0f\u7ec6\u8282\uff1a\u51fd\u6570\u529f\u80fd\u8bf4\u660e\u4e2d\uff0c\u4e24\u5bf9\u5927\u62ec\u53f7\u4e2d\u7684\u5185\u5bb9 {{elements}} \u4f5c\u4e3a\u53d8\u91cf\u8f93\u51fa\u51fa\u6765\u4e86\uff1b \u6ca1\u9519\uff0c\u8fd9\u5c31\u662f\u6211\u4eec\u53c2\u8003Django \u548c jinja2 \u7684\u6a21\u677f\u8bed\u6cd5\u8bbe\u8ba1\u51fa\u7684\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\uff0c\u4f7f\u7528\u65b9\u6cd5\u5f88\u7b80\u5355\uff0c\u7528\u4e24\u5bf9\u5927\u62ec\u53f7\u628a\u51fd\u6570\u7684\u53c2\u6570\u62ec\u8d77\u6765\uff0c\u8fd9\u6837\u5728\u65e5\u5fd7\u8f93\u51fa\u7684\u65f6\u5019\u5c31\u80fd\u628a\u8c03\u7528\u51fd\u6570\u65f6\u53c2\u6570\u7684\u503c\u8f93\u51fa\u51fa\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_7","title":"\u516b\u3001\u73af\u5883\u90e8\u7f72","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_6","title":"1\u3001\u539f\u5219","text":"YouQu \u7684\u73af\u5883\u4f9d\u8d56\u4e00\u76f4\u575a\u6301 2 \u4e2a\u539f\u5219\uff1a \u6700\u5c0f\u73af\u5883\u4f9d\u8d56\u539f\u5219 \u6709\u4e9b\u540c\u5b66\u5199\u4e00\u4e9b\u529f\u80fd\uff0c\u9996\u5148\u60f3\u5230\u7684\u5c31\u662f\u53bb\u641c\u7d22\u5f15\u64ce\u641c\u4e00\u4e0b\uff0c\u770b\u6709\u6ca1\u6709\u73b0\u6210\u7684\u5de5\u5177\u6216\u8005\u4ee3\u7801\u76f4\u63a5\u80fd\u7528\uff0c\u7f8e\u5176\u540d\u66f0\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\uff0c\u522b\u4eba\u5df2\u7ecf\u9020\u597d\u4e86\u8f6e\u5b50\u54b1\u4eec\u5c31\u4e0d\u8981\u91cd\u590d\u53bb\u9020\u4e86\uff0c\u7136\u540e\u4e00\u5207\u4f3c\u4e4e\u90fd\u53d8\u5f97\u90a3\u4e48\u7684\u7406\u6240\u5e94\u5f53\u3002 \u5f53\u7136\u8fd9\u6837\u505a\u65e0\u53ef\u539a\u975e\uff0c\u6211\u76f8\u4fe1\u6709\u8fd9\u6837\u60f3\u6cd5\u5e76\u4e14\u4e00\u76f4\u8df5\u884c\u8fd9\u6837\u505a\u6cd5\u7684\u540c\u5b66\u4e0d\u5728\u5c11\u6570\uff0c\u4f46\u8fd9\u6837\u505a\u6709\u4e00\u4e2a\u5f88\u4e25\u91cd\u7684\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f60\u5199\u4e00\u4e2a\u5927\u578b\u9879\u76ee\u65f6\uff0c\u4f60\u4f1a\u5f15\u5165\u975e\u5e38\u975e\u5e38\u975e\u5e38\u591a\u7684\u4f9d\u8d56\uff0c\u6bd4\u5982\u8981\u505a\u4e2a\u63a5\u53e3\u8bf7\u6c42\u8981\u7528 requests\u3001\u8bfb\u5199\u4e2a\u6570\u636e\u7528 pandas\u3001\u5199\u4e2a\u8868\u683c\u7528 pyopenxl\u3001\u89e3\u6790\u4e2a\u6587\u672c\u8981\u7528\u8fd9\u4e2a\u90a3\u4e2a\u4e09\u65b9\u5e93 ... \u3002 \u6211\u8ba4\u4e3a\u8fd9\u662f\u975e\u5e38\u4e0d\u597d\u7684\u4e60\u60ef\uff0c\u5728\u5b9e\u73b0\u4e00\u4e2a\u529f\u80fd\u7684\u65f6\u5019\uff0c\u9996\u5148\u6211\u4eec\u5e94\u8be5\u53bb\u60f3\u81ea\u5df1\u600e\u4e48\u6837\u53bb\u5b9e\u73b0\uff0c\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff1b \u5982\u679c\u4f60\u4e0d\u4f1a\uff0c\u4f60\u53ef\u4ee5\u53bb\u5b66\u4e60\u4e09\u65b9\u5e93\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u522b\u4eba\u4e09\u65b9\u5e93\u4e5f\u662f\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\u7684\uff0c\u4e3a\u4ec0\u4e48\u54b1\u4eec\u4e0d\u884c\u5462\uff1b\u5982\u679c\u522b\u4eba\u7684\u4f60\u5b9e\u5728\u662f\u770b\u4e0d\u61c2\uff0c\u60f3\u5c3d\u4e00\u5207\u529e\u6cd5\u786e\u5b9e\u505a\u4e0d\u51fa\u6765\uff0c\u90a3\u518d\u8003\u8651\u5f15\u5165\u8fd9\u4e2a\u4e09\u65b9\u5e93\uff0c\u6211\u8ba4\u4e3a\u8fd9\u6837\u662f\u6ca1\u95ee\u9898\u7684\uff0c\u6bd5\u7adf\u54b1\u4eec\u6bb5\u4f4d\u8fd8\u4e0d\u591f\uff0c\u4f46\u5e0c\u671b\u5c06\u6765\u6709\u4e00\u5929\u6211\u4eec\u53ef\u4ee5\u3002 \u8fd9\u6837\u7684\u505a\u6cd5\u624d\u5e94\u8be5\u662f\u201c\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\u201d\u6b63\u786e\u7684\u64cd\u4f5c\u3002\u4e0d\u4f1a\u6ca1\u5173\u7cfb\uff0c\u770b\u770b\u522b\u4eba\u662f\u600e\u4e48\u5b9e\u73b0\u7684\uff0c\u81ea\u5df1\u518d\u6478\u7d22\u7740\u5199\u51fa\u6765\uff0c\u8fd9\u6837\u81ea\u5df1\u624d\u80fd\u6709\u6240\u63d0\u9ad8\uff0c\u4e0d\u7136\u4f60\u5c31\u53ea\u4f1a\u7528\u522b\u4eba\u7684\u4e1c\u897f\uff1b\u90a3\u4e9b\u5632\u7b11\u3001\u6279\u8bc4\u6211\u4eec\u91cd\u590d\u9020\u8f6e\u5b50\u7684\u4eba\uff0c\u5148\u60f3\u60f3\u81ea\u5df1\u4f1a\u9020\u8f6e\u5b50\u5417\u3002 \u672c\u7740\u81ea\u5df1\u5b9e\u73b0\u80fd\u5b9e\u73b0\u7684\u4e00\u5207\u7684\u539f\u5219\uff0cYouQu \u6846\u67b6\u505a\u5230\u4e86\u975e\u5e38\u5c11\u7684\u73af\u5883\u4f9d\u8d56\uff0c\u800c\u4e14\u6211\u4eec\u4ecd\u5728\u4e0d\u65ad\u52aa\u529b\uff0c\u51cf\u5c11\u73af\u5883\u90e8\u7f72\u7684\u4f9d\u8d56\u3002 \u6700\u5c0f\u4ed3\u5e93\u4f53\u79ef\u539f\u5219 \u5927\u6587\u4ef6\u4e0d\u80fd\u4e0a\u4f20\u5230\u5de5\u7a0b\u91cc\u9762\uff0c\u4fdd\u6301\u6574\u4e2a\u5de5\u7a0b\u7684\u8f7b\u91cf\u5316\uff0c\u8fd9\u6837\u5728\u514b\u9686\u4ee3\u7801\u7684\u65f6\u5019\u624d\u80fd\u975e\u5e38\u5feb\u901f\u65b9\u4fbf\u4f7f\u7528\uff0c\u6211\u4eec\u89c1\u8fc7\u4e00\u4e2a AT \u5de5\u7a0b clone \u5927\u5c0f\u8fbe\u5230\u597d\u51e0\u4e2a G\uff0c\u7b80\u76f4\u4e0d\u53ef\u601d\u8bae\u3002 \u5176\u5b9e\u4ee3\u7801\u6587\u4ef6\u7684\u5927\u5c0f\u662f\u5f88\u5c0f\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u7eaf\u5199\u4ee3\u7801\u968f\u4fbf\u5199\u5de5\u7a0b\u4e5f\u4e0d\u4f1a\u592a\u5927\uff0c\u800c\u6587\u6863\uff08\u5305\u542b\u63d2\u56fe\uff09\u7b49\u8d44\u6e90\u5374\u662f\u5f88\u5360\u7a7a\u95f4\u3002 \u56e0\u6b64\u6211\u4eec\u9009\u62e9\u5c06 YouQu \u7684\u6587\u6863\u5de5\u7a0b\u6d89\u53ca\u5230\u7684\u56fe\u7247\u8d44\u6e90\u90fd\u91c7\u7528\u5916\u94fe\u52a0\u8f7d\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_6","title":"2\u3001\u5b89\u88c5","text":"\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u8fd0\u884c env.sh \u5373\u53ef\u3002 bash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_4","title":"3\u3001\u5b9a\u5236\u4f9d\u8d56","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_2","title":"3.1\u3001\u65b0\u589e\u4f9d\u8d56","text":"\u5982\u679c\u5e94\u7528\u5e93\u8fd8\u9700\u8981\u5176\u4ed6 Python \u4f9d\u8d56\u5e93\uff0c\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a requirement.txt \u6587\u4ef6\uff1b autotest_xxx\n\u251c\u2500\u2500 requirement.txt\n\u251c\u2500\u2500 case ...\n \u91cc\u9762\u5199\u5165\u9700\u8981\u5b89\u88c5\u7684\u4e09\u65b9\u4f9d\u8d56\uff0c\u6bd4\u5982\u50cf\u8fd9\u6837\uff1a # requirement.txt\nPyYAML==6.0 # \u6307\u5b9a\u5b89\u88c5\u67d0\u4e2a\u7248\u672c\nrequests # \u672a\u6307\u5b9a\u7248\u672c\u5219\u5b89\u88c5\u6700\u65b0\u7248\n \u5728\u6267\u884c bash env.sh \u65f6\u4f1a\u4e00\u5e76\u5c06\u5176\u5b89\u88c5\u3002 \u5982\u679c\u591a\u4e2a\u5e94\u7528\u5e93\u90fd\u5b58\u5728 requirement.txt \u6587\u4ef6\uff0c\u6267\u884c env.sh \u65f6\u4f1a\u5c06\u591a\u4e2a requirement.txt \u6587\u4ef6\u4e00\u5e76\u52a0\u8f7d\uff1b\u90a3\u4e48\u4e00\u5b9a\u8981\u6ce8\u610f\u591a\u4e2a requirement.txt \u6587\u4ef6\u53ef\u80fd\u5b58\u5728\u76f8\u540c\u7684\u4f9d\u8d56\u88ab\u6307\u5b9a\u5b89\u88c5\u4e0d\u540c\u7248\u672c\u7b49\u7b49\u517c\u5bb9\u6027\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32_1","title":"3.2\u3001\u88c1\u526a\u4f9d\u8d56","text":"\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0c\u53ef\u80fd\u4f60\u53ea\u9700\u8981\u5b89\u88c5\u4e00\u4e9b\u6700\u6700\u57fa\u7840\u7684\u4f9d\u8d56\uff0c\u5176\u4ed6\u7684\u90fd\u4e0d\u9700\u8981\uff0c\u6bd4\u5982\u7eaf\u63a5\u53e3\u81ea\u52a8\u5316\u7684\u9879\u76ee\uff0c\u5b83\u4e0d\u9700\u8981 UI \u81ea\u52a8\u5316\u76f8\u5173\u7684\u4f9d\u8d56\u3002 \u4f60\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\uff0c\u5b58\u653e\u4e00\u4e2a BASICENV \u7684\u666e\u901a\u6587\u4ef6\uff0c\u91cc\u9762\u4e0d\u9700\u8981\u5199\u4efb\u4f55\u5185\u5bb9\uff0c\u8fd9\u6837\u6267\u884c env.sh \u65f6\uff0c\u53ea\u4f1a\u5b89\u88c5\u6700\u57fa\u7840\u7684\u4f9d\u8d56\u3002 autotest_xxx\n\u251c\u2500\u2500 BASICENV # \u53ef\u4ee5\u4f7f\u7528\uff1atouch BASICENV \u521b\u5efa\u6587\u4ef6\n\u251c\u2500\u2500 case ...\n \u57fa\u7840\u4f9d\u8d56\u4ec5\u5b89\u88c5\u4ee5\u4e0b\u51e0\u4e2a\u5305\uff1a pytest # pytest\npytest-rerunfailures # \u5931\u8d25\u91cd\u8dd1\u63d2\u4ef6\npytest-timeout # \u7528\u4f8b\u8d85\u65f6\u63d2\u4ef6\nallure-pytest # \u751f\u6210 allure \u62a5\u544a\u63d2\u4ef6\nallure.deb # allure \u62a5\u544a\u67e5\u770b\u5de5\u5177\n \u88c1\u526a\u4f9d\u8d56 \u548c \u65b0\u589e\u4f9d\u8d56 \u662f\u4e0d\u51b2\u7a81\u7684\uff0c\u53ef\u4ee5\u540c\u65f6\u4f7f\u7528\u3002 \u6b64\u65b9\u6848\u9ed8\u8ba4\u4e3a\u865a\u62df\u73af\u5883\u90e8\u7f72\uff0c\u5982\u679c\u4f60\u60f3\u76f4\u63a5\u90e8\u7f72\u5728\u672c\u673a\u4e0a\uff1a bash env_dev.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_4","title":"4\u3001\u865a\u62df\u5316\u90e8\u7f72","text":"YouQu\u9ed8\u8ba4\u91c7\u7528\u865a\u62df\u5316\u90e8\u5206\uff0c\u865a\u62df\u5316\u73af\u5883\u5b9e\u9645\u5b89\u88c5\u7684\u4f4d\u7f6e\u662f\u5728 $HOME/.local/share/virtualenvs/youqu-oHTM7l7G \u76ee\u5f55\u4e0b youqu-oHTM7l7G \u6b64\u76ee\u5f55\u540d\u79f0\u524d\u9762\u90e8\u5206\u662f\u4f60\u7684\u4ee3\u7801\u6839\u76ee\u5f55\u7684\u540d\u79f0\uff0c\u540e\u9762\u90e8\u5206\u662f\u751f\u6210\u7684\u968f\u673a\u5b57\u7b26\u4e32\uff1b \u540c\u5b66\u4eec\u5728\u8fdc\u7a0b\u673a\u5668\u4e0a\u5b9a\u4f4d\u95ee\u9898\u7684\u65f6\u5019\uff0c\u5982\u679c\u4f7f\u7528 Pycharm \u8c03\u8bd5\uff0c\u5c31\u5c06\u89e3\u91ca\u5668\u6307\u5b9a\u5230\u8fd9\u4e2a\u76ee\u5f55\u7684\u5c31\u884c\u4e86\uff1b \u5f53\u7136\uff0c\u6211\u4eec\u4e5f\u63d0\u4f9b\u4e86\u672c\u673a\u5f00\u53d1\u73af\u5883\u90e8\u7f72\uff1a bash env_dev.sh\n \u5982\u679c\u4f60\u662f\u672c\u5730\u5f00\u53d1\u73af\u5883\u53ef\u4ee5\u7528\u5b83\uff0c\u533a\u522b\u5c31\u662f\u9a71\u52a8\u6267\u884c\u7684\u65f6\u5019\u4f7f\u7528\uff1apython3 manage.py xxx"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_8","title":"\u4e5d\u3001\u5931\u8d25\u5f55\u5c4f","text":"\u5f55\u5c4f\u5176\u5b9e\u662f\u4e00\u79cd\u89c6\u9891\u5f62\u5f0f\u7684\u65e5\u5fd7\uff0c\u56e0\u4e3a\u5f88\u591a\u65f6\u5019\u6211\u4eec\u5728\u67e5\u770b\u65e5\u5fd7\u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u51c6\u786e\u7684\u5b9a\u4f4d\u5230\u7528\u4f8b\u5931\u8d25\u7684\u5177\u4f53\u539f\u56e0\uff0c\u56e0\u6b64\u7528\u4f8b\u7684\u5f55\u5c4f\u80fd\u8ba9\u6211\u4eec\u770b\u5230\u7528\u4f8b\u5728\u6267\u884c\u8fc7\u7a0b\uff1b \u3010\u4f7f\u7528\u65b9\u6cd5\u3011 \u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u5173\u6ce8 2 \u4e2a\u53c2\u6570\uff1b ;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\u3002\n;\u6ce8\u610f\uff0c\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u4e0d\u80fd\u5c0f\u4e8e\u5931\u8d25\u5f55\u5c4f\u6b21\u6570\uff0c\u5373 RERUN >= RECORD_FAILED_CASE\nRECORD_FAILED_CASE = 1\n \u9ed8\u8ba4\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u662f 1 \u6b21\uff1b RECORD_FAILED_CASE = 1 \u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff1b RECORD_FAILED_CASE = 0 \u8868\u793a\u4e0d\u7ba1\u7528\u4f8b\u6210\u529f\u6216\u5931\u8d25\u90fd\u5f55\u5c4f\uff1b \u5f55\u5c4f\u662f\u8981\u5360\u7528\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u7279\u522b\u662f\u5728\u4e00\u4e9b\u914d\u7f6e\u8f83\u4f4e\u7684\u673a\u5668\u4e0a\u4f1a\u5f88\u660e\u663e\uff0c\u6240\u4ee5\u4f60\u9700\u8981\u8003\u8651\u662f\u5426\u6709\u5fc5\u8981\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1b \u4f7f\u7528 manage.py \u6267\u884c\u7528\u4f8b\u9ed8\u8ba4\u8bfb\u53d6\u5230 globalconfig.ini \u91cc\u9762\u7684\u53c2\u6570\uff0c\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report/record \u76ee\u5f55\u4e0b\u4fdd\u5b58\u5931\u8d25\u7528\u4f8b\u7684\u5f55\u5c4f\u548c\u65ad\u8a00\u7684\u90a3\u4e2a\u65f6\u95f4\u70b9\u7684\u622a\u5c4f\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7\u89c6\u9891\u6587\u4ef6\u770b\u5230\u5931\u8d25\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u90fd\u53d1\u751f\u4e86\u4ec0\u4e48\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#wayland","title":"\u5341\u3001Wayland \u9002\u914d","text":"Wayland \u4e0b\u81ea\u52a8\u5316\u4e3b\u8981\u95ee\u9898\u662f X11 \u4e0b\u7684\u952e\u9f20\u64cd\u4f5c\u65b9\u6cd5\u65e0\u6cd5\u4f7f\u7528\uff0c\u6bd4\u5982 Xdotool\u3001 PyAutoGUI\u3001Xwininfo \u7b49\u7b49\uff1b YouQu \u5728 Wayland \u4e0b\u517c\u5bb9\u9002\u914d\uff0cenv.sh \u5728 Wayland \u4e0b\u6267\u884c\u65f6\u4f1a\u5b89\u88c5\u81ea\u7814\u7684\u952e\u9f20\u64cd\u4f5c\u670d\u52a1\uff08\u53ef\u80fd\u5b58\u5728\u4e00\u4e9b\u4f9d\u8d56\u62a5\u9519\uff0c\u6309\u7167\u6ce8\u91ca\u89e3\u51b3\u5373\u53ef\uff09\uff0c\u6846\u67b6\u6838\u5fc3\u5e93\u4e5f\u9488\u5bf9\u6027\u7684\u505a\u4e86\u9002\u914d\uff0c\u4e0a\u5c42\u7528\u4f8b\u5b8c\u5168\u4e0d\u7528\u5173\u5fc3\u673a\u5668\u662fWayland \u8fd8\u662f X11\uff0c\u6846\u67b6\u4f1a\u6839\u636e\u6267\u884c\u65f6\u72b6\u6001\u81ea\u52a8\u5224\u65ad\u8d70\u4e0d\u540c\u7684\u903b\u8f91\uff1b \u7b80\u5355\u8bb2\u5c31\u662f\uff0c\u5e94\u7528\u5e93\u53ea\u9700\u8981\u7ef4\u62a4\u4e00\u5957\u7528\u4f8b\u811a\u672c\u5373\u53ef\u3002 \u3010\u7528\u4f8b\u517c\u5bb9\u3011 \u56e0\u4e3a Wayland \u4e0b\u6709\u4e9b\u5e94\u7528\u7684\u754c\u9762\u663e\u793a\u548c\u529f\u80fd\u672c\u8eab\u5b58\u5728\u4e00\u4e9b\u5dee\u5f02\uff0c\u7528\u4f8b\u5c42\u53ef\u80fd\u9700\u8981\u5bf9\u8fd9\u90e8\u5206\u7528\u4f8b\u505a\u903b\u8f91\u5224\u65ad\uff0c\u4f7f\u7528\u5168\u5c40\u914d\u7f6e\u91cc\u9762\u7684\u5e38\u91cf\u8fdb\u884c\u903b\u8f91\u7f16\u5199\u5373\u53ef\uff1a from setting.globalconfig import GlobalConfig\n# GlobalConfig.IS_WAYLAND \u83b7\u53d6\u5230\u5f53\u524d\u7684\u663e\u793a\u670d\u52a1\u5668\uff08bool\uff09\n# \u5e94\u7528\u5e93 Config \u7ee7\u627f GlobalConfig\nif Config.IS_WAYLAND:\npass\nif Config.IS_X11:\npass\n \u6bd4\u5982\u7528\u4f8b\u91cc\u9762\u5982\u679c\u65ad\u8a00\u7684\u56fe\u7247\u4e0d\u540c\uff1a if Config.IS_WAYLAND:\nself.assert_image_exist(\"wayland_XXX\")\nelse:\nself.assert_image_exist(\"x11_XXX\")\n \u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u811a\u672c\u5728 Wayland \u548c X11 \u4e0b\u90fd\u53ef\u4ee5\u8dd1\uff0cso easy \u662f\u4e0d\u662f\uff1f\u5b8c\u5168\u6ca1\u5fc5\u8981\u4e13\u95e8\u62c9\u65b0\u5206\u652f\u8fdb\u884c Wayland \u9002\u914d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_9","title":"\u5341\u4e00\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_7","title":"1. \u76ee\u5f55\u7ed3\u6784","text":"\u6267\u884c\u65f6\u4f1a\u5728\u6839\u76ee\u5f55\u4e0b\u52a8\u6001\u751f\u6210 report \u76ee\u5f55\uff0c\u6240\u6709\u7684\u62a5\u544a\u76f8\u5173\u7684\u6587\u4ef6\u4f1a\u7edf\u4e00\u5b58\u653e\u5728\u91cc\u9762\uff0c\u793a\u4f8b\uff1a /report\n \u251c\u2500\u2500 allure # allure\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json\n \u251c\u2500\u2500 allure_html # \u751f\u6210\u7684html\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 index.html \u251c\u2500\u2500 allure_back # allure\u62a5\u544a\u5907\u4efd\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 20221108114823\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json\n \u251c\u2500\u2500 json # json\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 result_deepin-music_20221109134736_1081333.json\n \u251c\u2500\u2500 logs # \u65e5\u5fd7\u6587\u4ef6\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 2022-11-10_debug.log \u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-10_error.log\n \u251c\u2500\u2500 record # \u5f55\u5c4f\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-09\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 15\u65f614\u520609\u79d2_test_music_303_2_autotest.mp4\n \u2514\u2500\u2500 xml # xml\u62a5\u544a\n\u2514\u2500\u2500 autotest_deepin_music-20221109134736.xml\n \u9ed8\u8ba4\u60c5\u51b5\u4e0b\u540c\u65f6\u751f\u6210 html\u3001xml\u3001json\u4e09\u79cd\u5f62\u5f0f\u7684\u62a5\u544a\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_7","title":"2. \u5b9a\u5236\u62a5\u544a","text":"\u6211\u4eec\u5bf9 allure \u62a5\u544a\u8fdb\u884c\u4e86\u4e00\u7cfb\u5217\u7684\u5b9a\u5236\uff1a \u5b9a\u5236 logo\u3001title\u3001\u62a5\u544a\u9ed8\u8ba4\u8bed\u8a00\u4e3a\u4e2d\u6587\uff1b \u52a0\u5165\u4e86\u7528\u4f8b\u65ad\u8a00\u5931\u8d25\u65f6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u4ee5\u53ca\u6b64\u65f6\u56fe\u50cf\u5bf9\u6bd4\u7684\u6a21\u677f\u56fe\u7247\uff1b \u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\uff0c\u4f60\u53ef\u4ee5\u5728 html \u62a5\u544a\u4e2d\u76f4\u63a5\u770b\u5f55\u5236\u7684\u89c6\u9891\uff1b \u52a0\u5165\u4e86 IP \u5730\u5740\u3001\u7cfb\u7edf\u4fe1\u606f\u3001\u955c\u50cf\u7248\u672c\u7b49\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_5","title":"3. \u67e5\u770b\u62a5\u544a","text":" \u672c\u5730\u6267\u884c \u5728 report/allure \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u4e00\u5806\u6587\u672c\u6587\u4ef6\uff0c\u8fd9\u4e9b\u662f allure \u63d2\u4ef6\u751f\u6210\u7684\u62a5\u544a\u6e90\u6570\u636e\uff0c\u6211\u4eec\u5728 report/allure_html \u76ee\u5f55\u4e0b\u7ed9\u4f60\u751f\u6210\u4e86 html \u6587\u4ef6\uff0c\u4f46\u662f\u4f60\u4e0d\u80fd\u76f4\u63a5\u901a\u8fc7\u6d4f\u89c8\u5668\u6253\u5f00 index.html \u6587\u4ef6\uff0c\u56e0\u4e3a allure \u7684\u62a5\u544a\u90fd\u662f\u57fa\u4e8e\u5728\u7ebf\u7684\u670d\u52a1\uff0c\u4f60\u5e94\u8be5\u8fd9\u6837\u6253\u5f00\uff1a allure open report/allure_html\n \u4f7f\u7528 manage.py \u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u5728\u7ec8\u7aef\u7684\u6700\u540e\u4e00\u884c\uff0c\u6211\u4eec\u4f1a\u7ed9\u4f60\u8f93\u51fa\u6253\u5f00\u62a5\u544a\u7684\u547d\u4ee4\uff0c\u76f4\u63a5\u590d\u5236\u5b83\u5728\u7ec8\u7aef\u6267\u884c\u5c31\u53ef\u4ee5\u67e5\u770b\u4e86\uff0c\u50cf\u8fd9\u6837\uff1a \u7ec8\u7aef\u6267\u884c\u547d\u4ee4: allure open /tmp/youqu/report/allure_html \u67e5\u770b\u62a5\u544a \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 Pycharm \u91cc\u9762\u627e\u5230 index.html \u6587\u4ef6\uff0c\u7136\u540e\u53f3\u952e\u9009\u62e9\u6d4f\u89c8\u5668\u6253\u5f00\uff0c\u6216\u8005\u4f60\u53ef\u4ee5\u7528\u4e00\u4e2a http \u670d\u52a1\u6253\u5f00\u3002 \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 report/allure \u76ee\u5f55\u4e0b\u67e5\u770b\u62a5\u544a\uff1a allure serve report/allure\n \u8fdc\u7a0b\u6267\u884c \u8fdc\u7a0b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\uff0c\u4f1a\u5c06\u6240\u6709\u8fdc\u7a0b\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u62a5\u544a\u90fd\u6536\u96c6\u5230 report/allure \u76ee\u5f55\u4e0b\uff0c\u5206\u522b\u6309\u7167\u673a\u5668\u7684 IP \u7b49\u5efa\u4e86\u4e0d\u540c\u7684\u76ee\u5f55\uff0c\u4f60\u53ef\u4ee5\u5728\u8fd9\u4e9b\u76ee\u5f55\u91cc\u9762\u53bb\u67e5\u770b\u5bf9\u5e94\u7684\u6d4b\u8bd5\u62a5\u544a\uff0c\u67e5\u770b\u65b9\u6cd5\u548c\u524d\u9762\u672c\u5730\u6267\u884c\u67e5\u770b\u7684\u65b9\u6cd5\u4e00\u6837\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_10","title":"\u5341\u4e8c\u3001\u9759\u6001\u4ee3\u7801\u626b\u63cf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_8","title":"1. \u63d0\u524d\u89e3\u51b3\u4ee3\u7801\u95ee\u9898","text":"\u4e3a\u4e86\u5e2e\u52a9\u5f00\u53d1\u8005\u7edf\u4e00\u4ee3\u7801\u98ce\u683c\uff0cPython \u793e\u533a\u63d0\u51fa\u4e86 PEP8 \u4ee3\u7801\u7f16\u7801\u98ce\u683c\uff0cPython \u5b98\u65b9\u540c\u65f6\u63a8\u51fa\u4e86\u4e00\u4e2a\u68c0\u67e5\u4ee3\u7801\u98ce\u683c\u662f\u5426\u7b26\u5408 PEP8 \u7684\u5de5\u5177\uff0c\u540d\u5b57\u4e5f\u53eb PEP8\u3002 \u4f46\u662f\uff0cPycharm \u91cc\u9762\u7684 PEP8 \u63d2\u4ef6\u5b9e\u9645\u4e0a\u5e76\u4e0d\u80fd\u53d1\u73b0\u5f88\u591a\u4ee3\u7801\u95ee\u9898\uff0c\u8fd9\u4e9b\u95ee\u9898\u5e76\u4e0d\u4f1a\u5728\u8fd0\u884c\u65f6\u62a5\u9519\uff0c\u56e0\u4e3a\u4ece Python \u8bed\u8a00\u89d2\u5ea6\u5e76\u4e0d\u5173\u5fc3\u8fd9\u4e9b\u95ee\u9898\uff0c\u5728 Pycharm \u7f16\u8f91\u5668\u91cc\u9762\u4f7f\u7528\u5feb\u6377\u952e ctrl + alt + L\uff0c\u6709\u4e00\u70b9\u70b9\u683c\u5f0f\u5316\u7684\u6548\u679c\uff0c\u80fd\u89e3\u51b3\u4e00\u4e9b\u7a7a\u683c\u3001\u6362\u884c\u7b49\u5c0f\u95ee\u9898\u3002 \u8fd9\u91cc\u63a8\u8350\u4e00\u4e2a Python \u793e\u533a\u6d41\u884c\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff1a Black\uff0c\u53f7\u79f0\u4e0d\u59a5\u534f\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff0c\u5b83\u68c0\u6d4b\u5230\u4e0d\u7b26\u5408\u89c4\u8303\u7684\u4ee3\u7801\u98ce\u683c\u76f4\u63a5\u5c31\u5e2e\u4f60\u5168\u90e8\u683c\u5f0f\u5316\u597d\uff0c\u5c31\u662f\u8fd9\u4e48\u521a\uff01 \u5b89\u88c5\uff1a sudo pip3 install black \n \u4f7f\u7528\u65b9\u6cd5\uff1a black ${CheckPath}\n \u4f7f\u7528\u8fd9\u4e2a\u5de5\u5177\u683c\u5f0f\u5316\u4e4b\u540e\uff0c\u4ee3\u7801\u4f1a\u88ab\u81ea\u52a8\u8c03\u6574\uff0c\u521a\u5f00\u59cb\u4f60\u53ef\u80fd\u4f1a\u89c9\u5f97\u8c03\u6574\u5f97\u5f88\u5938\u5f20\uff0c\u6ca1\u5173\u7cfb\u575a\u6301\u770b\uff0c\u4e60\u60ef\u4e4b\u540e\uff0c\u4f60\u4f1a\u89c9\u5f97\u5f88\u4f18\u96c5\uff0c\u6ca1\u9519\uff0c\u8fd9\u5c31\u662f Pythonic Code \u7684\u6838\u5fc3\uff0c\u8bf7\u4fdd\u6301\u4f18\u96c5\uff5e\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_8","title":"2. \u4ee3\u7801\u626b\u63cf\u5de5\u5177","text":"\u4f7f\u7528\u6839\u76ee\u5f55\u4e0b pylint.sh \u626b\u63cf\u4ee3\u7801\uff0c\u5728 report \u76ee\u5f55\u4e0b\u67e5\u770b\u4ee3\u7801\u626b\u63cf\u62a5\u544a\uff0c\u5982\u679c\u6709\u4ee3\u7801\u95ee\u9898\u8bf7\u63d0\u524d\u89e3\u51b3\u4e4b\u540e\u518d\u63d0\u4ea4\u3002 \u6b64\u811a\u672c\u5df2\u7ecf\u4f7f\u7528 Python \u793e\u533a\u6700\u6d41\u884c\u7684\u4ee3\u7801\u626b\u63cf\u5de5\u5177 Pylint \u8fdb\u884c\u4ee3\u7801\u626b\u63cf\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a bash pylint.sh\n \u8fd0\u884c\u4e4b\u540e\u4f1a\u63d0\u793a\u4f60\u8981\u626b\u63cf\u7684\u76ee\u5f55\uff0c\u6bd4\u5982\u8f93\u5165 apps \uff0c\u5219\u4f1a\u626b\u63cf apps \u4e0b\u7684\u6240\u6709 Python \u4ee3\u7801\u3002 \u5728 setting/pylintrc.cfg \u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u76f8\u5173\u914d\u7f6e\uff0c\u626b\u63cf\u5b8c\u6210\u4e4b\u540e\u5728 report/pylints \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u626b\u63cf\u62a5\u544a\u3002 \u4ee3\u7801\u63d0\u4ea4\u9700\u901a\u8fc7 git review \u63d0\u4ea4\u5230 gerrit \uff0c\u4eba\u5de5 Code Review \u901a\u8fc7\u4e4b\u540e\u5408\u5165\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_11","title":"\u5341\u4e09\u3001\u63d0\u4ea4\u4ee3\u7801","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_9","title":"1. \u5b89\u88c5\u4f9d\u8d56","text":"sudo apt install git-review\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_9","title":"2. \u63d0\u4ea4\u6a21\u677f","text":"\u5728 ~ \u76ee\u5f55\u4e0b\u65b0\u5efa\u6587\u4ef6\uff0c\u5e76\u547d\u540d\u4e3a gitcommit_template \u5c06\u4ee5\u4e0b\u5185\u5bb9\u5199\u5165\u6587\u4ef6\u5f53\u4e2d\uff1a # commit type :fix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style(\u98ce\u683c\u4fee\u6539)\u3001refactor(\u91cd\u6784)\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test(\u6d4b\u8bd5) + \u7b80\u5355\u63cf\u8ff0. \u9ed8\u8ba4fix,\u6839\u636e\u60c5\u51b5\u4fee\u6539\nfix: \n\n# \u8be6\u7ec6\u8bf4\u660e\u4ee3\u7801\u7684\u6539\u52a8\uff0c\u5305\u542b\u4ee3\u7801\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u4ee5\u53ca\u4e3a\u4ec0\u4e48\u8fd9\u4e48\u505a\uff0c\u53ef\u80fd\u4f1a\u5f71\u54cd\u54ea\u4e9b\u529f\u80fd\u3002\u5bf9\u4e8e\u4ee3\u7801\u7684\u5ba1\u6838\u8005\uff0c\u9700\u8981\u4ece\u8fd9\u6bb5\u63cf\u8ff0\u4e2d\u80fd\u5b8c\u5168\u7406\u89e3\u4ee3\u7801\u4e2d\u6240\u6709\u6539\u52a8\u7684\u5185\u5bb9\nDescription: \n\n# \u5199\u4e00\u6bb5\u9762\u5411\u4e8e\u4ea7\u54c1\u7684\u603b\u7ed3\u6027\u5185\u5bb9\uff0c\u7528\u4e8e\u81ea\u52a8\u751f\u6210crp\u4e0a\u7684changlog\uff0c\u9700\u8981\u6ce8\u610f\u7684\u4e8b\uff0c\u8fd9\u6bb5\u63cf\u8ff0\u5fc5\u987b\u4ece\u4ea7\u54c1\u7684\u89d2\u5ea6\u8003\u8651\u3002\nLog: \n\n# \u5173\u8054pms\u4e0a\u7684bug\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94bug\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4fee\u590dbug\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Bug: \n\n# \u4fee\u590d github issue \n#Issue: \n\n# \u5173\u8054pms\u4e0a\u7684\u4efb\u52a1\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94\u4efb\u52a1\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4efb\u52a1\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Task: \n \u547d\u4ee4\u884c\u6267\u884c: git config --global commit.template ~/gitcommit_template\n \u6b64\u547d\u4ee4\u5c06\u6a21\u677f\u52a0\u5165\u5230 git \u7684\u63d0\u4ea4\u6a21\u677f\u4e2d\u3002 \u540e\u7eed\u63d0\u4ea4\u7684\u65f6\u5019\u9700\u8981\u5173\u6ce8\u4e00\u4e0b\u51e0\u70b9\uff1a commit type \u5bf9\u5e94\u4e0d\u540c\u7684\u4fee\u6539\u7c7b\u578b\uff1afix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style \uff08\u98ce\u683c\u4fee\u6539\uff09\u3001refactor \uff08\u91cd\u6784\uff09\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test \uff08\u6d4b\u8bd5\uff09 commit type \u5192\u53f7\u540e\u9762\u52a0\u7a7a\u683c\u3002 Description \u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u9700\u8981\u8fdb\u884c\u8be6\u7ec6\u8bf4\u660e\uff0c\u6bd4\u5982\u5bf9\u529f\u80fd\u8fdb\u884c\u5927\u6539\u7b49\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_6","title":"3. \u63a8\u9001\u4ee3\u7801","text":"\u9996\u5148\u6dfb\u52a0 commit \u4fe1\u606f git add \u540e\u9762\u52a0\u6587\u4ef6\u540d\u79f0\n git add . # \u8868\u793a\u6dfb\u52a0\u6240\u6709\u6587\u4ef6\n \u4f7f\u7528\u8fd9\u6761\u547d\u4ee4\u6ce8\u610f\u6709\u4e9b\u4e34\u65f6\u6587\u4ef6\u4e0d\u8981\u63d0\u4ea4\u5230\u4ed3\u5e93\u4e86\u3002 git commit -a\n \u4e4b\u540e\u5728 fix: \u540e\u9762\uff08\u6ce8\u610f\u5192\u53f7\u540e\u9762\u5fc5\u987b\u52a0\u7a7a\u683c\uff0c\u4e0d\u7136\u76f4\u63a5-1\uff09\u5199\u672c\u5730\u63d0\u4ea4\u7684 commit \u4fe1\u606f\uff0c\u7136\u540e\u5c31\u53ef\u4ee5\u63d0\u4ea4\u4ee3\u7801\u4e86 git review branch(\u5f53\u524d\u5206\u652f) -r origin\n \u6700\u597d\u4e00\u6b21 commit\uff0c\u4e00\u6b21 git review \uff0c\u7ecf\u5e38\u6709\u540c\u5b66\u5728\u672c\u5730\u75af\u72c2 commit \u6700\u540e git review \u62a5\u9519\u4e0d\u77e5\u9053\u548b\u56de\u4e8b\u513f\u3002 \u82e5\u4e0d\u60f3\u6bcf\u6b21\u63d0\u4ea4\u90fd\u52a0\u4e0a -r \u9009\u9879\uff0c\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a git config --global gitreview.remote origin \u63d0\u4ea4\u4ee3\u7801\uff0c\u76f4\u63a5\u4f7f\u7528 git review branch<\u76ee\u6807\u5206\u652f>\uff0c\u4f8b\u5982 git review master"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git","title":"4. Git\u6807\u7b7e","text":"Git \u6807\u7b7e\u5b9e\u9645\u4e0a\u662f commit \u7684\u4e00\u4e2a\u522b\u540d\uff0c\u4e3b\u8981\u7528\u4e8e\u7ba1\u7406\u5386\u53f2\u7248\u672c\u3002 \u60f3\u8c61\u4e00\u4e0b\u9886\u5bfc\u8ba9\u4f60\u628a\u4e4b\u524d\u7684\u67d0\u4e2a\u7248\u672c\u7684\u4ee3\u7801\u62c9\u51fa\u6765\u8dd1\uff0c\u4f60\u662f\u4e0d\u662f\u4e56\u4e56\u7684\u53bb\u628a\u6240\u6709\u63d0\u4ea4\u8bb0\u5f55\u62c9\u51fa\u6765\u627e\uff0c\u7136\u540e\u627e\u5230\u90a3\u4e2a\u54c8\u5e0c\u503c\uff0c\u901a\u8fc7\u54c8\u5e0c\u503c\u6765\u68c0\u51fa\u4ee3\u7801\u3002 \u8fd9\u4e00\u5957\u64cd\u4f5c\u4e0b\u6765\u662f\u4e0d\u662f\u5f88\u9ebb\u70e6\uff0c\u8d39\u65f6\u95f4\u8fd8\u4e0d\u4e00\u5b9a\u80fd\u627e\u5f97\u5230\uff0c\u6ca1\u4eba\u80fd\u8bb0\u4f4f\u6bcf\u4e2a\u63d0\u4ea4\u54c8\u5e0c\u503c\u4ee5\u53ca\u8fd9\u6b21\u63d0\u4ea4\u90fd\u6539\u4e86\u54ea\u4e9b\u4ee3\u7801\u3002 \u56e0\u6b64\u7ed9\u63d0\u4ea4\u6253\u4e2a\u6807\u7b7e\uff0c\u5c31\u662f\u628a\u54c8\u5e0c\u503c\u8f6c\u6362\u6210\u4eba\u7c7b\u80fd\u7406\u89e3\u7684\u8bed\u8a00\uff0c\u6bd4\u5982 v1.0\uff0c\u5c31\u53ef\u4ee5\u76f4\u63a5\u901a\u8fc7\u6807\u7b7e\u627e\u5230\u5bf9\u5e94\u7684\u63d0\u4ea4\u3002 \u65b0\u5efa\u6807\u7b7e git tag -a <tagname>\n \u56de\u8f66\u4e4b\u540e\uff0cGit \u4f1a\u6253\u5f00\u4f60\u7684\u7f16\u8f91\u5668\uff0c\u8ba9\u4f60\u5199\u4e00\u53e5\u6807\u7b7e\u6ce8\u89e3\uff0c\u5c31\u50cf\u4f60\u7ed9\u63d0\u4ea4\u5199\u6ce8\u89e3\u4e00\u6837\u3002 \u67e5\u770b\u6240\u6709\u6807\u7b7e git tag -l\n# git tag \u4e5f\u884c\n \u5220\u9664\u6807\u7b7e git tag -d <tagname>\n \u63a8\u9001\u6807\u7b7e\u81f3\u8fdc\u7a0b git push \u547d\u4ee4\u5e76\u4e0d\u4f1a\u4f20\u9001\u6807\u7b7e\u5230\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\uff0c\u5fc5\u987b\u663e\u5f0f\u5730\u63a8\u9001\u6807\u7b7e\u3002 git push origin <tagname>\n \u63a8\u9001\u6240\u6709\u4e0d\u5728\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\u7684\u6807\u7b7e git push origin --tag\n \u5220\u9664\u8fdc\u7a0b\u6807\u7b7e git push origin :refs/tag/<tagname>\n \u540e\u671f\u6253\u6807\u7b7e \u5148\u7528 git log --pretty=oneline \u67e5\u8be2\u63d0\u4ea4\u8bb0\u5f55\uff0c\u83b7\u53d6\u6821\u9a8c\u7801\u3002 git tag -a <tagname> 9fceb02(\u6821\u9a8c\u7801)\n \u68c0\u51fa\u6807\u7b7e git checkout <tagname>\n \u6b64\u65f6\uff0c\u4ed3\u5e93\u4f1a\u5904\u4e8e\u201c\u5206\u79bb\u5934\u6307\u9488\uff08detached HEAD\uff09\u201d\u7684\u72b6\u6001\u3002 \u5728\u201c\u5206\u79bb\u5934\u6307\u9488\u201d\u72b6\u6001\u4e0b\uff0c\u5982\u679c\u4f60\u505a\u4e86\u67d0\u4e9b\u66f4\u6539\u7136\u540e\u63d0\u4ea4\u5b83\u4eec\uff0c\u6807\u7b7e\u4e0d\u4f1a\u53d1\u751f\u53d8\u5316\uff0c \u4f46\u4f60\u7684\u65b0\u63d0\u4ea4\u5c06\u4e0d\u5c5e\u4e8e\u4efb\u4f55\u5206\u652f\uff0c\u5e76\u4e14\u5c06\u65e0\u6cd5\u8bbf\u95ee\uff0c\u9664\u975e\u901a\u8fc7\u786e\u5207\u7684\u63d0\u4ea4\u54c8\u5e0c\u624d\u80fd\u8bbf\u95ee\u3002 \u56e0\u6b64\uff0c\u5982\u679c\u4f60\u9700\u8981\u8fdb\u884c\u66f4\u6539\uff0c\u6bd4\u5982\u4f60\u8981\u4fee\u590d\u65e7\u7248\u672c\u4e2d\u7684\u9519\u8bef\uff0c\u90a3\u4e48\u901a\u5e38\u9700\u8981\u521b\u5efa\u4e00\u4e2a\u65b0\u5206\u652f\uff1a git checkout -b <NewBranchName> <tagname>\n \u65b0\u5206\u652f\u4e0a\u53ef\u4ee5\u8fdb\u884c\u63d0\u4ea4\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_12","title":"\u5341\u56db\u3001\u5e38\u89c1\u95ee\u9898","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_10","title":"1. \u63d0\u4ea4\u4ee3\u7801\u65f6\u63d0\u793a\u90ae\u7bb1\u6216\u8005\u540d\u79f0\u4e0d\u5bf9","text":"\u91cd\u65b0\u914d\u7f6e\u90ae\u7bb1\u6216\u8005\u540d\u79f0\uff0c\u7136\u540e\u91cd\u7f6e\u751f\u6548\uff1a git commit --amend --reset-author\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_10","title":"2. \u600e\u4e48\u56de\u6eda\u5230\u4e4b\u524d\u7684\u7248\u672c","text":"(1)\u67e5\u8be2\u5386\u53f2\u63d0\u4ea4\u8bb0\u5f55 git log\n \u627e\u5230\u4f60\u8981\u56de\u6eda\u7684\u7248\u672c\uff0c\u590d\u5236 hash \u503c\u3002 \u6ce8\u610f\uff1a\u662f commit \u7a7a\u683c\u4e4b\u540e\u7684 hash \u503c\uff0c\u4e4b\u524d\u6709\u540c\u5b66\u590d\u5236\u7684 Change-Id: \u8fd9\u6837\u80af\u5b9a\u62a5\u9519\u3002 (2)\u56de\u6eda\u7248\u672c\uff0c\u4e0d\u6e05\u9664\u4ee3\u7801 git reset --soft ${hash}\n (3)\u56de\u6eda\u7248\u672c\uff0c\u6e05\u9664\u4ee3\u7801\uff0c\u614e\u7528\u54c8 git reset --hard ${hash}\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-f-s-e","title":"3. \u6d4b\u8bd5\u62a5\u544a\u91cc\u9762 F S . E \u662f\u4ec0\u4e48\u610f\u601d","text":"F \u8868\u793a\u5931\u8d25\uff0c. \uff08\u70b9\uff09\u8868\u793a\u901a\u8fc7\uff0cS \u8868\u793a\u8df3\u8fc7\uff0cE \u8868\u793a error \u6709\u62a5\u9519"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git-status","title":"4. \u89e3\u51b3 git status \u4e2d\u6587\u663e\u793a\u7684\u95ee\u9898","text":"git config --global core.quotePath false\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5-apps","title":"5. apps \u76ee\u5f55\u4e0b\u989c\u8272\u6709\u4e9b\u662f\u9ec4\u8272\u7684","text":"\u5728 Pycharm \u4e2d apps \u76ee\u5f55\u4e0b\u5e94\u7528\u5e93\u6587\u4ef6\u662f\u9ec4\u8272\u7684\uff0c\u7f16\u8f91\u5668\u8bc6\u522b\u4e0d\u5230\u4ee3\u7801\u65b0\u589e\u548c\u4fee\u6539\uff1b \u7531\u4e8e\u793e\u533a\u7248 Pycharm \u4e0d\u80fd\u52a8\u6001\u8bc6\u522b\u591a\u4ed3\u5e93\uff0c\u9700\u8981\u5728 setting \u91cc\u9762\u624b\u52a8\u6ce8\u518c\uff0c\u64cd\u4f5c\u6b65\u9aa4\uff1a File \u2014> Settings \u2014> Version Control \u2014> \u70b9 + \u53f7 \u2014> Directory \u9009\u4e2d\u5e94\u7528\u5e93\u5de5\u7a0b\u76ee\u5f55 \u2014> VCS \u9009\u4e2d Git \u2014> Apply \u5982\u6b64\u5c31\u53ef\u4ee5\u4e86\u3002 \u4e13\u4e1a\u7248 Pycharm \u4e0d\u5b58\u5728\u8fd9\u4e2a\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#6-envsh-r","title":"6. \u6267\u884c env.sh \u62a5\u9519 $'\\r':\u672a\u627e\u5230\u547d\u4ee4","text":"\u51fa\u73b0\u8fd9\u4e2a\u95ee\u9898\u4f60\u5e94\u8be5\u662f\u5728 windows \u4e0a\u6253\u5f00\u6216\u7f16\u8f91\u8fc7 env.sh \u811a\u672c\uff0cwindows\u4e0b\u7684\u6362\u884c\u662f\u56de\u8f66\u7b26+\u6362\u884c\u7b26\uff0c\u4e5f\u5c31\u662f\\r\\n\uff0c\u800c Linxu \u4e0b\u662f\u6362\u884c\u7b26 \\n\uff0cLinux \u4e0b\u4e0d\u8bc6\u522b \\r\uff0c\u56e0\u6b64\u62a5\u9519\u3002 \u89e3\u51b3\u65b9\u6848\uff1a # \u5c06 \\r \u66ff\u6362\u4e3a\u7a7a\nsudo sed -i 's/\\r//' env.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#7","title":"7.\u600e\u6837\u4e3a\u5355\u72ec\u67d0\u4e00\u6761\u7528\u4f8b\u914d\u7f6e\u6267\u884c\u8d85\u65f6\u65f6\u95f4","text":"\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u5982\u4e0b\uff1a @pytest.mark.timeout(300) # \u5355\u4f4d\u79d2\ndef test_xxx_001():\npass\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#8-youqu","title":"8. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u6240\u6709\u4ee3\u7801\uff0c\u5305\u542b\u5b50\u4ed3\u5e93","text":"\u524d\u7f6e\u6761\u4ef6\uff1a\u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 # \u7b2c\u4e00\u6b21\u5b58\u50a8\u5bc6\u7801\uff0c\u63d0\u4f9b\u540e\u9762\u62c9\u4ee3\u7801(gerrit: ldap\u8d26\u53f7\u548c\u5bc6\u7801\uff0cgit\u62c9\u53d6\u7b2c\u4e00\u6b21\u8f93\u5165\u4fdd\u5b58\uff0c\u540e\u9762\u76f4\u63a5\u4f7f\u7528)\ngit config --global credential.helper store\n\n# \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\uff0c\u5e76\u9012\u5f52\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\" --recursive\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#9-youqu","title":"9. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\u6307\u5b9a\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u524d\u7f6e\u6761\u4ef6\uff1a \u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 \u5df2\u5b58\u50a8\u8bbf\u95ee\u5bc6\u7801 # \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\"\n# \u6307\u5b9a\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ncd youqu\ngit submodule update --init apps/autotest_xxx_xxx\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#10-youqu","title":"10. \u5982\u4f55\u66f4\u65b0 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\uff0c\u6240\u6709\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u66f4\u65b0\u6240\u6709\u5b50\u4ed3\u5e93\u4ee3\u7801 cd youqu\ngit pull & git submodule foreach git pull\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#11-youqu-master-detached-head","title":"11. \u5982\u4f55\u4fee\u590d YouQu \u6240\u6709\u5b50\u4ed3\u5e93 master \u5206\u652f\u6e38\u79bb\u5934\uff08detached head\uff09","text":"\u4fee\u590d\u6240\u6709\u5b50\u4ed3\u5e93\u9ed8\u8ba4master \u5206\u652f\u6e38\u79bb\u5934 cd youqu\ngit submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/","title":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212 \u5206\u7c7b\uff1a/ \u67b6\u6784\u5e08\uff1a/ \u76ee\u6807\uff1a \u5e94\u7528 AT \u67b6\u6784\u5de5\u7a0b\u5316\uff0c\u53c2\u8003\u6027\u80fd\u81ea\u52a8\u5316\u5de5\u7a0b\u5b8c\u6210\u5de5\u7a0b\u5316\u6539\u9020\u3002 \u5e94\u7528\u95f4\u7528\u4f8b\u89e3\u8026\uff0c\u89e3\u9664\u6240\u6709\u4ea4\u53c9\u8c03\u7528\u7684\u65b9\u6cd5\uff0c\u5404\u5e94\u7528\u80fd\u8ddf\u968f\u81ea\u8eab\u8fed\u4ee3\u5468\u671f\u72ec\u7acb\u7ef4\u62a4 AT \u7528\u4f8b\u3002 \u5b8c\u6210\u516c\u5171\u65b9\u6cd5\u7684\u62bd\u53d6\u6574\u5408\uff0c\u5f62\u6210\u4e00\u5957\u72ec\u7acb\u4e8e\u5e94\u7528\u95f4\u7684\u516c\u5171\u65b9\u6cd5\u5e93\uff0c\u5404\u5e94\u7528\u65b9\u6cd5\u91cc\u9762\u4e0d\u5b58\u5728\u88ab\u591a\u4e2a\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\u3002 \u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u4e3a\u5c06\u6765\u9002\u914d\u66f4\u591a\u7684 AT \u8fd0\u7528\u573a\u666f\u63d0\u4f9b\u652f\u6491\uff0c\u539f\u5219\u4e0a\u53ef\u5b9e\u73b0\u65e0\u9650\u6269\u5c55\uff0c\u5728\u6bcf\u65e5\u6784\u5efa\u548c\u6301\u7eed\u96c6\u6210\u6d41\u7a0b\u843d\u5730\u4f7f\u7528\u3002 \u4ee3\u7801\u89c4\u8303\u95ee\u9898\u6e05\u96f6\uff0c\u7b26\u5408 Shell Check\u3001Pylint\u3001\u7cfb\u7edf\u90e8\u76f8\u5173\u7f16\u7801\u89c4\u8303\u8981\u6c42\u3002 \u610f\u4e49\uff1a \u7edf\u4e00\u6210\u7814 AT \u67b6\u6784\u8bbe\u8ba1\u601d\u8def\uff0c\u6d88\u9664 AT \u4ee3\u7801\u5b9e\u73b0\u548c\u7ef4\u62a4\u4e0a\u53ef\u80fd\u51fa\u73b0\u7684\u5206\u6b67\uff0c\u6539\u5584\u5386\u53f2 AT \u65e0\u5de5\u7a0b\u5316\u8bbe\u8ba1\u7684\u7f3a\u9677\uff0c\u63d0\u9ad8\u67b6\u6784\u4e13\u4e1a\u6027\u3002 \u5404\u5e94\u7528 AT \u4ee3\u7801\u76f8\u4e92\u72ec\u7acb\uff0c\u5951\u5408\u5e94\u7528\u72ec\u7acb\u53d1\u5e03\u7279\u6027\uff0c\u53ef\u652f\u6301\u8fed\u4ee3\u671f\u95f4\u72ec\u7acb\u65b0\u589e\u3001\u7ef4\u62a4\u548c\u6267\u884c\u3002 \u65b9\u6cd5\u8c03\u7528\u903b\u8f91\u5f97\u5230\u7b80\u5316\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u66f4\u9ad8\u6548\uff1b\u516c\u5171\u5e93\u62bd\u53d6\uff0c\u51cf\u5c11\u65b9\u6cd5\u91cd\u590d\u7f16\u5199\uff0c\u63d0\u9ad8\u4ee3\u7801\u5229\u7528\u7387\uff1b\u5e73\u5747\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u4ece40\u5206\u949f\u964d\u4f4e\u81f330\u5206\u949f\uff0c\u65e5\u4ea7\u51fa\u7528\u4f8b\u4ece12\u6761/\u5929\u63d0\u5347\u81f316\u6761/\u5929\u3002 \u53ef\u7075\u6d3b\u652f\u6491\u4e0d\u540c\u7684\u81ea\u52a8\u5316\u8fd0\u7528\u573a\u666f\uff0c\u5982 CI\u3001\u5192\u70df\u6d4b\u8bd5\u3001\u96c6\u6210\u6d4b\u8bd5\u3001\u56de\u5f52\u6d4b\u8bd5\u3001\u4e13\u9879\u6d4b\u8bd5\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_2","title":"\u4e00\u3001\u80cc\u666f\u4ecb\u7ecd","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1","title":"1\u3001\u73b0\u6709\u67b6\u6784\u4ecb\u7ecd","text":"\u73b0\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u6574\u4f53\u5206\u4e3a\u4e09\u5c42\uff1a\u7528\u4f8b\u5c42\uff08\u4e1a\u52a1\u903b\u8f91\u5c42\uff09\u3001\u4e2d\u95f4\u5c42\uff08\u5143\u7d20\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff09\u3001\u6838\u5fc3\u5c42\uff08\u5e95\u5c42\u529f\u80fd\u5e93\u5c42\uff09\u3002 \u7528\u4f8b\u5c42\uff1a\u5373\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4e13\u6ce8\u4e8e\u4e1a\u52a1\u529f\u80fd\u903b\u8f91\uff0c\u4e0d\u5173\u5fc3\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\uff1b \u4e2d\u95f4\u5c42\uff1a\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff0c\u6bcf\u4e2a\u65b9\u6cd5\u5747\u5bf9\u5e94\u4e00\u4e2a\u5143\u7d20\u7684\u4e00\u4e2a\u5177\u4f53\u64cd\u4f5c\uff0c\u4e5f\u53ef\u4ee5\u662f\u591a\u4e2a\u64cd\u4f5c\u7684\u7ec4\u5408\u64cd\u4f5c\uff0c\u4e2d\u95f4\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u7528\u4f8b\u5c42\uff0c\u5177\u6709\u53ef\u6269\u5c55\u6027\u548c\u590d\u7528\u6027\uff1b \u6838\u5fc3\u5c42\uff1a\u4e3b\u8981\u5c01\u88c5\u7684\u5e95\u5c42\u529f\u80fd\u5b9e\u73b0\uff0c\u6b64\u5c42\u5728\u6846\u67b6\u4e2d\u63d0\u4f9b\u4e00\u4e9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u529f\u80fd\u6a21\u5757\u76f8\u5bf9\u72ec\u7acb\uff0c\u6838\u5fc3\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u64cd\u4f5c\u5c42\uff0c\u6bd4\u5982\uff1a\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7 UI \u5750\u6807\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u952e\u9f20\u64cd\u4f5c\u7684\u57fa\u7840\u65b9\u64cd\u4f5c\u6a21\u5757\u3001Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757\u3001\u6587\u4ef6\u7684\u589e\u5220\u6539\u67e5\u64cd\u4f5c\u6a21\u5757\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2","title":"2\u3001\u81ea\u52a8\u5316\u7684\u5e94\u7528","text":"2.1\u3001CI \u6d41\u7a0b \u6bcf\u65e5\u6784\u5efa\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u7814\u53d1\u6bcf\u65e5\u63d0\u4ea4\u7684\u4ee3\u7801\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u73ed\u4e4b\u540e\u4f1a\u5c06\u5404\u5e94\u7528\u8fdb\u884c\u6253\u5305\uff0c\u7136\u540e\u5728\u6d4b\u8bd5\u673a\u4e0a\u5b89\u88c5\u66f4\u65b0 deb \u5305\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u5e94\u7528\u63d0\u4ea4\u96c6\u6210\u7684\u7248\u672c\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u8f7d\u6700\u65b0\u7684 ISO \u8fdb\u884c PXE \u90e8\u7f72\uff0c\u7136\u540e\u6d4b\u8bd5\u673a\u5b89\u88c5\u6700\u65b0\u7684\u955c\u50cf\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 2.2\u3001\u9a8c\u6536\u6d4b\u8bd5 \u5728\u5404\u9a8c\u6536\u8282\u70b9\u8fdb\u884c\u81ea\u52a8\u5316\u9a8c\u6536\uff0c\u76ee\u524d\u7684\u7b56\u7565\u662f\u5168\u7528\u4f8b\u8986\u76d6\u5168\u67b6\u6784\u3002 2.3\u3001\u56de\u5f52\u6d4b\u8bd5 \u56de\u5f52\u6d4b\u8bd5\u4eca\u5e74\u89c4\u5212\u5efa\u8bbe\u4e2d\uff0c\u65e8\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u6267\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\uff0c\u51cf\u5c11\u529f\u80fd\u6d4b\u8bd5\u7684\u91cd\u590d\u52b3\u52a8\u529b\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3","title":"3\u3001\u5b58\u5728\u7684\u95ee\u9898","text":" \u5404\u5e94\u7528\u4e4b\u95f4\u5b58\u5728\u8026\u5408 \u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u521d\u671f\uff0c\u6240\u6709\u5e94\u7528\u662f\u6574\u4f53\u53d1\u5e03\uff0c\u6211\u4eec\u662f\u5c06\u6240\u6709\u5e94\u7528\u770b\u6210\u662f\u4e00\u4e2a\u6574\u4f53\uff0c\u5404\u5e94\u7528\u4f5c\u4e3a\u5176\u4e2d\u7684\u4e00\u4e2a\u6a21\u5757\uff0c\u6240\u4ee5\u5b58\u5728\u5e94\u7528\u95f4\u65b9\u6cd5\u4ea4\u53c9\u8c03\u7528\u7684\u95ee\u9898\uff0c\u8fd9\u6837\u4ece\u6700\u521d\u7684\u8bbe\u8ba1\u6765\u8bb2\u786e\u5b9e\u80fd\u591f\u51cf\u5c11\u91cd\u590d\u4ee3\u7801\u7684\u7f16\u5199\u3002\u4f46\u662f\u73b0\u5728\u5e94\u7528\u8d70\u72ec\u7acb\u53d1\u5e03\uff0c\u5404\u5e94\u7528\u90fd\u6709\u81ea\u5df1\u7684\u8fed\u4ee3\u8282\u594f\uff0c\u5728\u65b0\u9700\u6c42\u5feb\u901f\u53d8\u5316\u7684\u8fc7\u7a0b\u4e2d\uff0c\u81ea\u52a8\u5316\u7ef4\u62a4\u53d8\u5f97\u5f02\u5e38\u56f0\u96be\uff0c\u539f\u56e0\u5c31\u662f\u81ea\u52a8\u5316\u9879\u76ee\u91cc\u9762\u5404\u4e2a\u5e94\u7528\u7684\u6709\u6bd4\u8f83\u591a\u7684\u8026\u5408\u5173\u7cfb\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u8fdb\u884c\u89e3\u8026\uff0c\u4ee5\u9002\u5e94\u5e94\u7528\u4e0d\u540c\u7684\u8fed\u4ee3\u5468\u671f\u3002 \u65e0\u6cd5\u7cbe\u51c6\u7684\u5212\u5206\u7528\u4f8b\u8303\u56f4 \u7528\u4f8b\u6267\u884c\u7684\u8303\u56f4\u4e0d\u591f\u7cbe\u51c6\uff0c\u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u4e3b\u8981\u901a\u8fc7\u7528\u4f8b\u7684\u5173\u952e\u8bcd core\uff08\u6838\u5fc3\uff09\u6765\u533a\u5206\u7528\u4f8b\u662f\u5426\u4e3a\u6838\u5fc3\u7528\u4f8b\uff0c\u4f46\u662f\u8fd9\u6837\u7684\u533a\u5206\u592a\u5bbd\u6cdb\u4e86\uff0c\u4e0d\u80fd\u9002\u5e94\u81ea\u52a8\u5316\u6d4b\u8bd5\u5728\u591a\u573a\u666f\u4e0b\u7684\u5e94\u7528\u3002\u5f88\u591a\u573a\u666f\u4e0b\u6211\u4eec\u8fd8\u9700\u8981\u6839\u636e\u7528\u4f8b\u7684\u7b49\u7ea7\u3001\u7528\u4f8b\u7684\u7c7b\u578b\u3001\u7528\u4f8b\u6765\u6e90\u7b49\u7b49\uff0c\u4e0d\u540c\u7684\u7ef4\u5ea6\u6765\u6311\u9009\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u5173\u952e\u5b57\u9700\u8981\u4eba\u5de5\u4e00\u6761\u6761\u7684\u6539\uff0c\u8d39\u65f6\u8d39\u529b\uff0c\u800c\u4e14\u4e0d\u597d\u7ef4\u62a4\u3002 \u53d7\u65b0\u9700\u6c42\u5f71\u54cd\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u597d\u7ef4\u62a4 \u76ee\u524d\u9700\u8981\u8df3\u8fc7\u7684\u7528\u4f8b\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684\u7528\u4f8b\u811a\u672c\u91cc\u9762\uff0c\u6dfb\u52a0\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\uff0c\u540e\u7eed\u89e3\u9664\u8df3\u8fc7\u7684\u65f6\u5019\u53c8\u9700\u8981\u627e\u5230\u8fd9\u6761\u811a\u672c\uff0c\u5220\u6389\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\u3002\u5728\u8df3\u8fc7\u7528\u4f8b\u8f83\u591a\u7684\u60c5\u51b5\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u96be\u5ea6\u3002 \u7f16\u5199\u7528\u4f8b\u65f6\u903b\u8f91\u6bd4\u8f83\u590d\u6742\uff0c\u9700\u8981\u8c03\u7528\u591a\u4e2a\u5e94\u7528\u7684\u65b9\u6cd5\u6a21\u5757\u3002 \u6846\u67b6\u6269\u5c55\u6027\u4e0d\u8db3\uff0c\u65e0\u6cd5\u6574\u5408\u6027\u80fd\u81ea\u52a8\u5316\u3001\u538b\u6d4b\u81ea\u52a8\u5316\u3001\u5b89\u5168\u81ea\u52a8\u5316\u7b49\u4e13\u9879\u6d4b\u8bd5\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_3","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u4e3a\u89e3\u51b3\u73b0\u6709\u95ee\u9898\uff0c\u9002\u5e94\u4e0d\u65ad\u4e30\u5bcc\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u66f4\u597d\u7684\u53d1\u6325\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4f5c\u7528\uff0c\u9700\u8981\u5bf9\u81ea\u52a8\u5316\u67b6\u6784\u53ca\u5404\u529f\u80fd\u6a21\u5757\u8fdb\u884c\u91cd\u65b0\u8bbe\u8ba1\u89c4\u5212\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_1","title":"1\u3001\u67b6\u6784\u8bbe\u8ba1","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_1","title":"2\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u6846\u67b6\u7684\u8fd0\u884c\u903b\u8f91\uff1a\u901a\u8fc7\u6838\u5fc3\u5c42\u63d0\u4f9b\u4e00\u4e2a\u57fa\u7840\u80fd\u529b\uff0c\u4e1a\u52a1\u5c42\u6839\u636e\u5b9e\u9645\u4e1a\u52a1\u9700\u6c42\uff08\u6d4b\u8bd5\u7528\u4f8b\uff09\u52a8\u6001\u52a0\u8f7d\u6838\u5fc3\u5c42\uff0c\u6267\u884c\u5165\u53e3\u52a0\u8f7d\u76f8\u5e94\u7684\u7528\u4f8b\u96c6\u5e76\u63a7\u5236\u6267\u884c\uff0c\u5e94\u7528\u5c42\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u9700\u6c42\uff0c\u901a\u8fc7\u76f8\u5e94\u7684\u914d\u7f6e\u9879\u8fdb\u884c\u914d\u7f6e\uff0c\u4ece\u800c\u89e6\u53d1\u81ea\u52a8\u5316\u6d4b\u8bd5\u4efb\u52a1\u3002 \u6838\u5fc3\u5c42\uff1a\u57fa\u672c\u4fdd\u6301\u4e0d\u53d8\uff0c\u90e8\u5206\u6a21\u5757\u4f1a\u6d89\u53ca\u5230\u65b0\u529f\u80fd\u5f00\u53d1\uff0c\u6838\u5fc3\u5c42\u5404\u529f\u80fd\u6a21\u5757\u4fdd\u6301\u72ec\u7acb\u6027\uff0c\u63d0\u4f9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u4f9b\u4e0a\u5c42\u8c03\u7528\uff1b \u5e95\u5c42\u6838\u5fc3\u6a21\u5757\u5305\u62ec\uff1a \u56fe\u50cf\u8bc6\u522b\u6a21\u5757 UI \u5b9a\u4f4d\u6a21\u5757 Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757 \u5c5e\u6027\u5b9a\u4f4d\u6a21\u5757 \u65e5\u5fd7\u6a21\u5757 \u952e\u9f20\u64cd\u4f5c\u6a21\u5757 \u6587\u4ef6\u64cd\u4f5c\u6a21\u5757 \u5f55\u5c4f\u6a21\u5757 \u81ea\u5b9a\u4e49\u65ad\u8a00\u6a21\u5757 \u7528\u4f8b\u6267\u884c\u6a21\u5757 PXE \u88c5\u673a\u6a21\u5757 \u952e\u9f20\u4fe1\u53f7\u6a21\u62df\u6a21\u5757 OCR \u6a21\u5757 \u4e1a\u52a1\u5c42\uff1a\u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e94\u7528\u5185\u5305\u542b\u591a\u4e2a\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5982\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7b49\uff0c\u540e\u7eed\u53ef\u4ee5\u6839\u636e\u9700\u8981\u5ac1\u63a5\u8fdb\u6765\u3002\u5176\u4e2d\u529f\u80fd\u6d4b\u8bd5\u8bbe\u8ba1\u601d\u8def\uff1a \u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e76\u5c06\u6d4b\u8bd5\u6570\u636e\u548c\u6d4b\u8bd5\u8d44\u6e90\u6574\u5408\u8fdb\u6765\uff0c\u589e\u52a0\u7528\u4f8b\u6807\u7b7e csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ed9\u6bcf\u6761\u7528\u4f8b\u6253\u6807\u7b7e\u3002 \u5404\u6807\u7b7e\u6240\u4f7f\u7528\u5bf9\u5e94\u7684\u5b57\u6bb5\u540d\u79f0\uff0c\u4f7f\u7528 csv \u6587\u4ef6\u7ef4\u62a4\u7528\u4f8b\u4e0e\u6807\u7b7e\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u5bf9\u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u53ef\u4ee5\u7ec4\u5408\u5176\u4e2d\u7684\u6807\u7b7e\u800c\u4ece\u9a71\u52a8\u5bf9\u5e94\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\uff0c\u517c\u5bb9\u73b0\u6709\u7528\u4f8b\u6807\u7b7e\uff0c\u4e14\u652f\u6301\u7528\u4f8b\u6807\u7b7e\u53ef\u6269\u5c55\uff1b \u4f7f\u7528 csv \u683c\u5f0f\u6587\u4ef6\u53ef\u4ee5\u65b9\u4fbf\u7684\u4f7f\u7528 Excel \u8868\u683c\u6253\u5f00\u8fdb\u884c\u7f16\u8f91\uff0c\u540c\u65f6\u7531\u4e8e csv \u6587\u4ef6\u5b9e\u9645\u662f\u4ee5\u90fd\u597d\u5206\u9694\u7684\u6587\u672c\u6587\u4ef6\uff0c\u4ee3\u7801\u4e2d\u53ef\u4ee5\u5728\u4e0d\u4f9d\u8d56\u4e09\u65b9\u5e93\u7684\u60c5\u51b5\u4e0b\u65b9\u4fbf\u5feb\u901f\u7684\u89e3\u6790\u5b83\uff0c\u53ef\u64cd\u4f5c\u6027\u548c\u53ef\u7ef4\u62a4\u6027\u8f83\u9ad8\u3002 \u5404\u4e2a\u5e94\u7528\u4e4b\u95f4\uff0c\u7528\u4f8b\u3001\u65b9\u6cd5\u3001\u6807\u7b7e\u548c\u8d44\u6e90\u90fd\u662f\u76f8\u4e92\u72ec\u7acb\u7684\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u7528\u4f8b\u65f6\u53ea\u9700\u8981\u81ea\u5df1\u5e94\u7528\u4e0b\u7684\u65b9\u6cd5\u548c\u516c\u5171\u5e93\u5373\u53ef\u3002 \u7ed3\u6784\u4e3e\u4f8b\uff1a .\n\u251c\u2500\u2500 apps\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_album # \u5e94\u7528\u540d (\u7528\u4e0b\u5212\u7ebf\u8fde\u63a5\u662f Python \u7f16\u7801\u89c4\u8303)\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_assert # \u65ad\u8a00\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_function_tag.csv # \u7528\u4f8b\u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 asan_cases # \u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases # \u529f\u80fd\u6d4b\u8bd5\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 res # \u6d4b\u8bd5\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config # \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_widget # \u5e94\u7528\u81ea\u5df1\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_widget # \u65b9\u6cd5\u57fa\u7c7b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 other_widget # \u8c03\u7528\u5176\u4ed6\u5e94\u7528\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_camera\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases\n\u2502\u00a0\u00a0 \u2502\u00a0 ...\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 public_widget # \u516c\u5171\u65b9\u6cd5\u5e93\n\u251c\u2500\u2500 config # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n...\n config \u914d\u7f6e\u6a21\u5757\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u76f8\u5e94\u914d\u7f6e\uff0c\u6d4b\u8bd5\u540c\u5b66\u53ef\u4ee5\u6839\u636e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5728 config \u91cc\u9762\u8fdb\u884c\u914d\u7f6e\u3002 \u5168\u5c40\u914d\u7f6e\uff1a \u6267\u884c\u4e00\u4e2a\u6216\u591a\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff1a\u5728 pattern \u91cc\u9762\u5199\u5165\u5e94\u7528\u5305\u540d\uff0c\u591a\u4e2a\u5e94\u7528\u4e4b\u95f4\u7528 or \u8fde\u63a5\uff0c\u5982 deepin-music or deepin-movie\uff1b \u5192\u70df\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a smoke\uff1b \u96c6\u6210\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a core \uff1b \u5168\u91cf\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u4e3a\u7a7a\u5373\u53ef\uff1b \u901a\u8fc7 tags \u7684\u914d\u7f6e\u6bd4\u8f83\u7075\u6d3b\uff0c\u540e\u9762\u6807\u7b7e\u5316\u7ba1\u7406\u7ae0\u8282\u4f1a\u8bb2\u5230\uff0c\u652f\u6301\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u7075\u6d3b\u914d\u7f6e\u3002 \u6307\u5b9a\u67d0\u53f0\u673a\u5668\u5728\u6307\u5b9a\u955c\u50cf\u7248\u672c\u4e0a\u6267\u884c\u7528\u4f8b\uff1a\u5728 IP \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a IP\uff0c\u5e76\u5728 URL \u91cc\u9762\u586b\u5165\u955c\u50cf\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u6846\u67b6\u4f1a\u8c03\u7528 PXE \u8fdb\u884c\u81ea\u52a8\u88c5\u673a\uff0c\u88c5\u673a\u5b8c\u4e4b\u540e\u81ea\u52a8\u5f00\u59cb\u6267\u884c\u914d\u7f6e\u7684\u6d4b\u8bd5\u7528\u4f8b\u3002 \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\uff1a \u6bcf\u4e2a\u5e94\u7528\u5185\u90e8\u4f1a\u6709\u4e00\u4e2a\u5355\u72ec\u7684\u914d\u7f6e\u6a21\u5757\uff0c\u4f1a\u5305\u542b\u4e00\u4e9b\u672c\u5e94\u7528\u7684\u6d4b\u8bd5\u8d44\u6e90\u7684\u8def\u5f84\u3001\u6267\u884c\u7528\u4f8b\u7684\u6807\u7b7e\u914d\u7f6e\u7b49\u7b49\uff0c\u5982\u679c\u5728\u5c40\u90e8\u914d\u7f6e\u91cc\u9762\u914d\u7f6e\u4e86\u7528\u4f8b\u6267\u884c\u6807\u7b7e\uff0c\u800c\u5916\u5c42 runner \u51fa\u6ca1\u6709\u6307\u5b9a\u6267\u884c\u6807\u7b7e\uff0c\u5219\u5728\u6267\u884c\u65f6\u53ea\u4f1a\u6267\u884c\u5c40\u90e8\u914d\u7f6e\u5df2\u914d\u7f6e\u7684\uff0c\u82e5\u5916\u5c42 runner \u4e5f\u914d\u7f6e\u4e86\u6267\u884c\u6807\u7b7e\uff0c\u5219\u4f1a\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u7528\u4f8b\u3002 \u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u914d\u7f6e\u90fd\u5728\u540c\u4e00\u4e2a\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\uff0cpy \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684\u7c7b\uff0cini \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684 option\u3002 \u5168\u5c40\u914d\u7f6e\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u7b56\u7565\u5982\u4e0b\uff1a \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5c40\u90e8\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5e94\u7528\u5c42\uff1arunner \u662f\u6d4b\u8bd5\u6267\u884c\u7684\u5165\u53e3\uff0c\u5b83\u4f1a\u6839\u636e\u914d\u7f6e\u91cc\u9762\u7684\u914d\u7f6e\u9879\uff0c\u8fdb\u884c\u7528\u4f8b\u7684\u52a0\u8f7d\u548c\u6267\u884c\u3002\u5b83\u63d0\u4f9b\u63a5\u53e3\u7ed9\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\uff0c\u5e73\u53f0\u4e0a\u7684\u6307\u4ee4\u5b9e\u9645\u4e0a\u90fd\u662f\u901a\u8fc7\u4e0b\u53d1\u7ed9 runner\uff0c\u7136\u540e\u7531 runner \u6765\u6267\u884c\u76f8\u5e94\u7684\u6d4b\u8bd5\u3002 \u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u662f\u4e00\u4e2a\u524d\u7aef\u7cfb\u7edf\uff0c\u53ef\u4ee5\u8fdb\u884c\u6d4b\u8bd5\u673a\u7ba1\u7406\u3001\u81ea\u52a8\u5b89\u88c5\u955c\u50cf\u3001\u81ea\u52a8\u5b89\u88c5\u6307\u5b9a\u5e94\u7528\u7248\u672c\u3001\u8fdb\u884c\u6d4b\u8bd5\u7528\u4f8b\u8303\u56f4\u9009\u62e9\u3001\u7528\u4f8b\u89e6\u53d1\u6267\u884c\u63a7\u5236\u3001\u7ed3\u679c\u5c55\u793a\u8f93\u51fa\u7b49\u3002 \u4e00\u4e2a\u5e94\u7528\u7684\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\u90fd\u53ef\u4ee5\u5355\u72ec\u89e6\u53d1\u3002 \u517c\u5bb9\u6027\u6d4b\u8bd5\u4e3b\u8981\u901a\u8fc7 PXE \u670d\u52a1\u5668\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u88c5\u673a\uff0c\u7136\u540e\u914d\u5408 AT \u8fdb\u884c\u6d4b\u8bd5\uff0c\u53ef\u4ee5\u5b9e\u73b0\u4e0d\u540c\u7cfb\u7edf\u7248\u672c\u3001\u4e0d\u540c\u5e94\u7528\u7248\u672c\u73af\u5883\u4e0a\u90fd\u53ef\u4ee5\u8fdb\u884c\u81ea\u52a8\u5316\u7684 AT \u6267\u884c\uff0c\u63d0\u9ad8\u517c\u5bb9\u6027\u6d4b\u8bd5\u6548\u7387\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_4","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_2","title":"1\u3001\u7528\u4f8b\u89e3\u8026","text":"\u5b58\u5728\u8026\u5408\u5173\u7cfb\u7684\u65b9\u6cd5\uff1a\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u88ab\u5916\u90e8\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\uff0c\u5219\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u8026\u5408\u5173\u7cfb\u3002 1.1\u3001\u901a\u8fc7\u7f16\u8f91\u5668 Find Usages \u67e5\u770b\u6bcf\u4e2a\u65b9\u6cd5\u88ab\u8c03\u7528\u7684\u8def\u5f84\u548c\u88ab\u8c03\u7528\u6b21\u6570\uff1b 1.2\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 1 \u4e2a\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728\u5916\u90e8\u5e94\u7528\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1b 1.3\u3001\u64cd\u4f5c\u5c42\u6587\u4ef6\u540d\u5747\u4ee5 widget \u7ed3\u5c3e\uff0c\u7c7b\u540d\u4ee5 Widget \u7ed3\u5c3e\uff0c\u5982\uff1a\u6587\u4ef6\u540d music_widget.py \uff1a class MusicWidget:\n\"\"\"\u97f3\u4e50\u7684\u64cd\u4f5c\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_2","title":"2\u3001\u516c\u5171\u5e93\u5efa\u8bbe","text":"2.1\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 2 \u4e2a\u53ca\u4ee5\u4e0a\u7684\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728 public_widget \u76ee\u5f55\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1bpublic_widget \u5373\u4e3a\u516c\u5171\u65b9\u6cd5\u5e93\uff1b 2.2\u3001\u5728\u7528\u4f8b\u5c42\u4fee\u6539\u7528\u4f8b\u4e2d\u7c7b\u7684\u5bfc\u5165\u8def\u5f84\uff0c\u5c5e\u4e8e\u516c\u5171\u65b9\u6cd5\u7684\u5219\u8c03\u7528 public_widget \u4e2d\u7684\u7c7b\uff0c\u5916\u90e8\u5e94\u7528\u7684\u64cd\u4f5c\u65b9\u6cd5\uff0c\u5219\u8c03\u7528\u672c\u5e94\u7528\u76ee\u5f55\u4e0b\u91cd\u5199\u7684\u5916\u90e8\u5e94\u7528\u65b9\u6cd5\u3002 \u6bd4\u5982\uff1a\u51e0\u4e4e\u6240\u6709\u591a\u5a92\u4f53\u5e94\u7528\u90fd\u9700\u8981\u901a\u8fc7\u6587\u7ba1\u52a0\u8f7d\u8d44\u6e90\uff0c\u8c03\u8d77\u7684\u6587\u7ba1\u5bf9\u8bdd\u6846\u5b9e\u9645\u4e3a dde-desktop\uff0c\u56e0\u6b64\u5c06 desktop_widget.py \u653e\u5230 public_widget \u91cc\u9762\uff1a class DdeDesktopPublicWidget:\n\"\"\"\u516c\u5171-\u684c\u9762\u7684\u64cd\u4f5c\u65b9\u6cd5\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3_1","title":"3\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406","text":"3.1\u3001\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1a\u5bf9\u5e94 core\u3001smoke\uff0c\u6216\u4e3a\u7a7a\uff1b \u7528\u4f8b\u6765\u6e90\uff1a\u5bf9\u5e94 PMS \u7528\u4f8b\u6765\u6e90\uff0c\u5206\u522b\u7528 acp1\u3001acp2\u3001acp3\u3001acp4 \u8868\u793a\u3002 acp1 \uff1a\u4e1a\u52a1\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5199\u7684\u7528\u4f8b\uff0c\u88ab\u7528\u4e8e\u9a8c\u6536\u6d4b\u8bd5\u7684\uff1b acp2 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5f15\u5165\u7684\u4ea7\u54c1\u9a8c\u6536\u6d4b\u8bc4\u90e8\u7684\u7528\u4f8b\uff1b acp3 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u6839\u636e\u4ea7\u54c1\u9700\u6c42\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\uff1b acp4 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u901a\u8fc7\u793e\u533a\u3001\u8bba\u575b\u7528\u6237\u53cd\u9988\u95ee\u9898\u603b\u7ed3\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\u3002 \u4e3e\u4f8b\uff1a \u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u7528\u4f8b\u6765\u6e90 001 L1 core acp1 \u6807\u7b7e\u91c7\u7528\u679a\u4e3e\u7684\u65b9\u5f0f\u8fdb\u884c\u4ee3\u53f7\u7ba1\u7406\u65b9\u4fbf\u7ba1\u7406\u4ee5\u53ca\u540e\u7eed\u6269\u5c55\u3002 3.2\u3001\u5728\u6bcf\u4e2a\u5e94\u7528\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u7b2c\u4e00\u5217\u4e3a\u7528\u4f8b\u7684 ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ba1\u7406\u6a21\u5757\u5185\u7684\u7528\u4f8b\u6807\u7b7e\u3002\u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 3.3\u3001\u5bf9\u7167 PMS \u4e0a\u7528\u4f8b\u7b49\u7ea7\u3001\u7528\u4f8b\u7c7b\u578b\u548c\u7528\u4f8b\u6765\u6e90\uff0c\u6807\u8bb0\u6240\u6709\u5df2\u5b9e\u73b0\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u540e\u7eed\u7f16\u5199\u65b0\u589e\u81ea\u52a8\u5316\u7528\u4f8b\u65f6\uff0c\u6bcf\u5199\u4e00\u6761\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684 csv \u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u6b64\u6761\u7528\u4f8b\u7684\u6807\u7b7e\u3002 3.4\u3001\u8df3\u8fc7\u7528\u4f8b\u6807\u7b7e\u5316 \u73b0\u6709\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a\uff1a \u4e3e\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u8bb0\u4e3a \u201cskip-\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u8bb0\uff0c\u5982\u679c\u5df2\u7ecf\u6807\u8bb0\u4e86\u8df3\u8fc7\u539f\u56e0\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u8bb0\u4e3a SKIPED\uff0c\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\u3002 \u6240\u6709\u7684\u6807\u7b7e\u5728 docs \u76ee\u5f55\u4e0b\u4f1a\u6709\u4e00\u4e2a\u6587\u6863\uff0c\u6587\u6863\u6682\u5b9a\u540d\u79f0\u4e3a\uff1atags_info.md\uff0c\u7528\u4e8e\u8bf4\u660e\u73b0\u5728\u5df2\u7ecf\u4f7f\u7528\u5230\u7684\u6807\u7b7e\uff0c\u4ee5\u53ca\u8fd9\u4e9b\u6807\u7b7e\u7684\u89e3\u91ca\u548c\u7528\u6cd5\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#4","title":"4\u3001\u7528\u4f8b\u6267\u884c","text":"4.1\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u7684\u9a71\u52a8\u6267\u884c\u903b\u8f91\u529f\u80fd\u5b9e\u73b0 \u5f00\u53d1\u6839\u636e\u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\u91cc\u9762\u7684\u7528\u4f8b\u6807\u7b7e\u6267\u884c\u5bf9\u5e94\u7528\u4f8b\u7684\u529f\u80fd\uff0c\u80fd\u652f\u6301\u591a\u4e2a\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u6267\u884c\u5165\u53e3\u80fd\u968f\u610f\u901a\u8fc7\u7528\u4f8b\u6807\u7b7e\u6307\u5b9a\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002 \u7528\u4f8b\u6807\u7b7e\u7684\u9a71\u52a8\u65b9\u5f0f\u5fc5\u987b\u80fd\u652f\u6301\u6807\u7b7e\u7684\u6269\u5c55\uff0c\u672a\u6765\u968f\u7740\u4e1a\u52a1\u7684\u53d8\u5316\u53ef\u80fd\u9700\u8981\u589e\u52a0\u5404\u79cd\u5404\u6837\u7684\u6807\u7b7e\u3002 4.2\u3001\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u6267\u884c \u529f\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u3001\u6027\u80fd\u6d4b\u8bd5\u7b49\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u662f\u5206\u5f00\u6267\u884c\u7684\uff0c\u4e5f\u5c31\u662f\u5728\u4e00\u6b21\u6267\u884c\u4e2d\uff0c\u53ea\u80fd\u6267\u884c\u5176\u4e2d\u4e00\u79cd\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5177\u4f53\u8981\u6267\u884c\u54ea\u4e00\u79cd\u540c\u6837\u901a\u8fc7\u53c2\u6570\u6765\u63a7\u5236\u3002 4.3\u3001\u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c \u7531\u4e8e\u6d4b\u8bd5\u673a\u8d44\u6e90\u6709\u9650\uff0c\u968f\u7740\u81ea\u52a8\u5316\u7528\u4f8b\u6570\u91cf\u7684\u589e\u52a0\uff0cCI \u6267\u884c\u65f6\u95f4\u4f1a\u8d8a\u6765\u8d8a\u957f\u3002 \u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c\u7684\u529f\u80fd\uff1a \u540c\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\u5206\u6563\u5230\u4e0d\u540c\u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u4e0a\u6267\u884c\uff0c\u7f29\u77ed\u6267\u884c\u603b\u65f6\u95f4\uff1b \u7b2c\u4e8c\u5929\u8dd1\u7684\u65f6\u5019\u540c\u4e00\u4e2a\u673a\u5668\u4e0a\u4f1a\u6267\u884c\u6628\u5929\u6ca1\u6709\u6267\u884c\u5230\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u6267\u884c\u540c\u7406\uff1b \u53ef\u4ee5\u5b9e\u73b0\u5728\u5168\u67b6\u6784\u6d4b\u8bd5\u673a\u4e0a\u8f6e\u6d41\u6267\u884c\u7528\u4f8b\uff0c\u65e2\u80fd\u4fdd\u8bc1\u6267\u884c\u4e86\u6240\u6709\u7684\u7528\u4f8b\uff0c\u53c8\u80fd\u5728\u8d44\u6e90\u6709\u9650\u7684\u60c5\u51b5\u4e0b\u8986\u76d6\u4e86\u6240\u6709\u7684\u67b6\u6784\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#5","title":"5\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0","text":"5.1\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u4f5c\u4e3a\u524d\u7aef\u754c\u9762\u7cfb\u7edf\uff0c\u901a\u8fc7\u9875\u9762\u4e0a\u7684\u4e00\u4e9b\u529f\u80fd\u9009\u9879\u8fdb\u884c\u5bf9\u5e94\u6d4b\u8bd5\u4efb\u52a1\u7684\u7ba1\u7406\u6216\u89e6\u53d1\uff0c\u4e1a\u5185\u6bd4\u8f83\u6d41\u884c\u7684\u5b9e\u73b0\u65b9\u6848\u662f\u4f7f\u7528 Vue + DRF \u5b9e\u73b0\u4e00\u4e2a\u524d\u540e\u7aef\u5206\u79bb\u7684\u7cfb\u7edf\u3002 \u6d4b\u8bd5\u5e73\u53f0\u53ef\u80fd\u4f1a\u6d89\u53ca\u5230\u7684\u6a21\u5757\u6709\uff1a\u6d4b\u8bd5\u673a\u8d44\u6e90\u7ba1\u7406\u6a21\u5757\u3001\u7528\u4f8b\u6267\u884c\u63a7\u5236\u6a21\u5757\u3001\u7ed3\u679c\u5c55\u793a\u6a21\u5757\u3001PXE \u955c\u50cf\u5b89\u88c5\u6a21\u5757\u7b49\u3002 \u7528\u6237\uff08\u6d4b\u8bd5\u3001\u7814\u53d1\u540c\u5b66\u7b49\uff09\u53ef\u4ee5\u914d\u7f6e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5982\u6267\u884c\u54ea\u4e2a\u5e94\u7528\u3001\u6267\u884c\u7528\u4f8b\u7684\u8303\u56f4\u3001\u5728\u54ea\u53f0\u673a\u5668\u4e0a\u6267\u884c\u3001\u955c\u50cf\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u5e94\u7528\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u6267\u884c\u65f6\u95f4\u3002 5.2\u3001\u6267\u884c\u5165\u53e3 runner \u63d0\u4f9b\u7ed9\u6d4b\u8bd5\u5e73\u53f0\u7684\u63a5\u53e3\u5305\u62ec\uff1a\u7528\u4f8b\u6267\u884c\u63a5\u53e3\u3001\u7ed3\u679c\u8fd4\u56de\u63a5\u53e3\u3001\u955c\u50cf\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u955c\u50cf\u5b89\u88c5\u63a5\u53e3\u3001\u5e94\u7528\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u5e94\u7528\u5b89\u88c5\u66f4\u65b0\u63a5\u53e3\u7b49\u3002 \u524d\u7aef\u5e73\u53f0\u76ee\u524d\u8fd8\u6ca1\u6709\u592a\u591a\u8be6\u7ec6\u7684\u65b9\u6848\uff0c\u672c\u6b21\u8bbe\u8ba1\u4e3b\u8981\u96c6\u4e2d\u5728\u540e\u7aef\u8fd9\u90e8\u5206\u67b6\u6784\u7684\u8bbe\u8ba1\u4e0a\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_5","title":"\u56db\u3001\u5b9e\u65bd\u8ba1\u5212","text":"\u8fd1\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u6587\u7ba1\u4ee3\u7801\u89e3\u8026 2022/3/28 2022/4/8 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u56fe\u5f62\u56fe\u50cf\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u97f3\u89c6\u9891\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5168\u5c40\u641c\u7d22\u4ee3\u7801\u89e3\u8026 2022/4/25 2022/4/26 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u516c\u5171\u5e93\u5efa\u8bbe 2022/4/27 2022/5/5 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5c01\u88c5\u7684\u65b9\u6cd5\u6574\u7406\u6210\u4e00\u4e2a\u8868 2022/5/6 2022/5/10 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7528\u4f8b\u6807\u7b7e\u5206\u7c7b\u8bc4\u4f30 2022/5/11 2022/5/11 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u6807\u7b7e\u5316\u6267\u884c\u9a71\u52a8\u7a0b\u5e8f\u7f16\u5199 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u9700\u5b9e\u73b0\u81ea\u52a8\u89e3\u6790 csv \u8868\u683c\u4e2d\u7684\u7528\u4f8b\u7f16\u53f7 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u722c\u866b\u811a\u672c\uff0c\u722c\u53d6 pms \u4e0a\u7528\u4f8b\u7684\u6807\u7b7e 2022/5/11 2022/5/13 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u5b9a\u65f6\u81ea\u52a8\u7ef4\u62a4\u672c\u5730 csv \u6587\u4ef6\u811a\u672c 2022/5/11 2022/5/20 \u4e2d\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u76ee\u5f55\u7ed3\u6784\u8c03\u6574 2022/5/20 2022/6/2 \u5b8c\u6210\u5168\u5c40\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u5177\u4f53\u65b9\u6848\u548c\u903b\u8f91\u5b9e\u73b0 2022/6/6 2022/6/17 \u9759\u6001\u626b\u63cf\u95ee\u9898\u6e05\u96f6 2022/6/20 2022/7/1 \u5b8c\u6210\u65b0\u6846\u67b6\u4f7f\u7528\u57f9\u8bad 2022/7/4 2022/7/11 \u843d\u5730\u8fd0\u884c 2022/7/12 2022/7/20 \u5e95\u5c42\u5e93\u7528\u9014\u8bf4\u660e\u6587\u6863\u7f16\u5199 2022/7/21 2022/7/28"}]} \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz index 8ffaebc1..e0b7bbfc 100644 Binary files a/sitemap.xml.gz and b/sitemap.xml.gz differ diff --git "a/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" "b/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" index 25f669d5..97100667 100644 --- "a/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" +++ "b/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs @@ -1215,8 +1215,7 @@ 智能化功能测试# Attribution :chengdu Test Team # Date :2021/08/20 -此方案仍在演进中 -此方案仍在演进中 +此方案仍在演进中 仓库地址:https://gitlabcd.uniontech.com/autotest/cd-desktop-aitest 一、方案概述¶ 基于深度学习智能识别应用的元素控件,用于在自动化测试操作过程中的元素定位以及判断结果时的断言处理;自动化测试过程中,测试机上的画面通过采集盒传输到服务器上,服务器对视频画面进行智能识别后,服务器智能判断用例是否执行成功,然后对测试机下发下一步操作指令,测试机接受并执行下一步操作。 diff --git "a/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" "b/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" index cdf9ccde..06c9e9a5 100644 --- "a/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" +++ "b/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" @@ -95,7 +95,7 @@ - + @@ -226,7 +226,7 @@ - + YouQu Docs diff --git "a/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" "b/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" index 121b4507..72123668 100644 --- "a/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" +++ "b/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs @@ -752,6 +752,13 @@ + + + + + 4、虚拟化部署 + + @@ -1661,6 +1668,13 @@ + + + + + 4、虚拟化部署 + + @@ -2604,18 +2618,12 @@ 1、标签说明流水线使用指导; 跳过原因:skip-XXX,用于控制用例是否执行; 确认修复:fixed-XXX,用于标记用例的修复状态(后面详细讲解用法); @@ -2629,26 +2637,30 @@ 1、标签说明PMS用例ID 用例级别 用例类型 +设备类型 +用例来源 上线对象 测试级别 跳过原因 确认修复 -废弃用例 -... +废弃用例 +... -001 +679537 679537 L1 FUNC +PPL + CICD C1 skip-XXX fixed-XXX -removed-已废弃 -... +removed-已废弃 +... @@ -2656,7 +2668,7 @@ 2、操作步骤csv 的文件名。 例如:
[csv_link_pms_id] -;同步PMS数据到本地CSV文件,必须要配置的配置项 -;key是本地CSV文件的文件名称; -;value是对应PMS上的模块ID; -;比如要同步音乐的数据, 首先需要将配置 APP_NAME = deepin-music, -;CSV文件名称为music.csv,其在PMS上的用例为: https://pms.uniontech.com/testcase-browse-53.html -;因此应该配置为: music = 53 -;这样才能将PMS与本地CSV文件建立联系。 -;如果你的应用分了很多模块,只需要将对应的信息依次配置好就行了。 -music = 53 +[csv_link_pms_id] +;同步PMS数据到本地CSV文件,必须要配置的配置项 +;key是本地CSV文件的文件名称; +;value是对应PMS上的模块ID; +;比如要同步音乐的数据, 首先需要将配置 APP_NAME = deepin-music, +;CSV文件名称为music.csv,其在PMS上的用例为: https://pms.uniontech.com/testcase-browse-53.html +;因此应该配置为: music = 53 +;这样才能将PMS与本地CSV文件建立联系。 +;如果你的应用分了很多模块,只需要将对应的信息依次配置好就行了。 +music = 53 将以上信息配置好之后,在命令行执行: -youqu manage.py pms --pms2csv yes +youqu manage.py pms --pms2csv yes 每次执行时原 csv 文件会自动备份在 report/csv_back 目录下,因此你不用担心脚本执行导致你的数据丢失。 diff --git a/search/search_index.json b/search/search_index.json index 91ebe84c..c7cfc7a2 100644 --- a/search/search_index.json +++ b/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\u200b\\u3000\\-\u3001\u3002\uff0c\uff0e\uff1f\uff01\uff1b]+","pipeline":["stemmer"]},"docs":[{"location":"","title":"\u9996\u9875","text":""},{"location":"#youqu","title":"\u6709\u8da3\uff08YouQu\uff09","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/4/1\n# Author : Mikigo\n# =============================================\n \u672c\u7ad9\u603b\u8bbf\u95ee\u91cf \u6b21 \u6b22\u8fce\u5728\u6d4f\u89c8\u5668\u8bbf\u95ee\u3010\u516c\u7f51\u6587\u6863\u3011 \u7edf\u4fe1\u516c\u53f8\u5185\u7f51\u8fd8\u53ef\u4ee5\u8bbf\u95ee\u3010\u5185\u7f51\u6587\u6863\u3011\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u54e6~~"},{"location":"#_1","title":"\u4e00\u3001\u7b80\u4ecb","text":"\u6709\u8da3\uff08YouQu\uff09\u662f\u6df1\u5ea6\u79d1\u6280\u8bbe\u8ba1\u548c\u5f00\u53d1\u7684\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff0c\u91c7\u7528\u7ed3\u6784\u5206\u5c42\u7684\u8bbe\u8ba1\u7406\u5ff5\uff0c\u652f\u6301\u591a\u5143\u5316\u5143\u7d20\u5b9a\u4f4d\u548c\u65ad\u8a00\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\u3001\u5f3a\u5927\u7684\u65e5\u5fd7\u548c\u62a5\u544a\u8f93\u51fa\u7b49\u7279\u8272\u529f\u80fd\uff0c\u540c\u65f6\u5b8c\u7f8e\u517c\u5bb9X11\u3001Wayland\u663e\u793a\u534f\u8bae\uff0c\u73af\u5883\u90e8\u7f72\u7b80\u5355\uff0c\u64cd\u4f5c\u6613\u4e0a\u624b\u3002"},{"location":"#17","title":"\u7231\u4e0a \u201c\u6709\u8da3\u201d \u7684 17 \u4e2a\u7406\u7531","text":" \u6838\u5fc3\u5e93\u63d0\u4f9b\u4e86\u7edf\u4e00\u7684\u63a5\u53e3\uff0c\u7f16\u5199\u65b9\u6cd5\u65f6\u53ea\u9700\u8981\u5bfc\u5165\u4e00\u4e2a\u5305\u5c31\u53ef\u4ee5\u4f7f\u7528\u5230\u6838\u5fc3\u5e93\u63d0\u4f9b\u7684\u6240\u6709\u529f\u80fd\uff1b \u516c\u5171\u5e93\u5c01\u88c5\u4e86\u5f88\u591a\u5e38\u7528\u6a21\u5757\u7684\u76f8\u5173\u65b9\u6cd5\uff0c\u6bd4\u5982\uff1a\u4efb\u52a1\u680f\u7684\u64cd\u4f5c\u3001\u684c\u9762\u7684\u64cd\u4f5c\u3001\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\u7b49\u7b49\uff1b \u9664\u4e86\u5e38\u7528\u7684\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u8bc6\u522b\u4ee5\u5916\uff0c\u6211\u4eec\u8fd8\u63d0\u4f9b\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u5176\u4f7f\u7528\u7b80\u5355\u4e14\u9ad8\u6548\uff0c\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff1b \u5bf9\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u5c06\u7f16\u5199\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u53d8\u5f97\u7b80\u5355\u800c\u4f18\u96c5\uff1b \u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u6280\u672f\u8fdb\u884c\u529f\u80fd\u5347\u7ea7\uff0c\u9664\u4e86\u652f\u6301\u5355\u4e2a\u5750\u6807\u8fd4\u56de\uff0c\u8fd8\u652f\u6301\u540c\u4e00\u754c\u9762\u4e0b\u591a\u4e2a\u76f8\u540c\u5143\u7d20\u8fd4\u56de\u591a\u4e2a\u5750\u6807\u7684\u529f\u80fd\uff1b \u63d0\u4f9b\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u548c\u6279\u91cf\u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u4e0d\u5230\u4e00\u4e2a csv \u6587\u4ef6\u539f\u6765\u80fd\u5e72\u8fd9\u4e48\u591a\u4e8b\u60c5\uff1b \u63d0\u4f9b\u4e86\u529f\u80fd\u5f3a\u5927\u7684\u6267\u884c\u5668\u5165\u53e3\uff0c\u8ba9\u4f60\u53ef\u4ee5\u65b9\u4fbf\u7684\u5728\u672c\u5730\u6267\u884c\u4efb\u4f55\u7528\u4f8b\u96c6\u7684\u7528\u4f8b\uff0c\u5176\u4e30\u5bcc\u7684\u81ea\u5b9a\u4e49\u914d\u7f6e\u9879\uff0c\u6ee1\u8db3\u4f60\u5bf9\u6267\u884c\u5668\u6240\u6709\u7684\u5e7b\u60f3\uff1b \u63d0\u4f9b\u8fdc\u7a0b\u6267\u884c\u7684\u529f\u80fd\uff0c\u53ef\u4ee5\u63a7\u5236\u591a\u53f0\u673a\u5668\u5e76\u884c\u8dd1\uff0c\u6216\u8005\u5206\u5e03\u5f0f\u8dd1\uff0c\u8fd9\u79cd\u4ed8\u8d39\u529f\u80fd\u73b0\u5728\u514d\u8d39\u7ed9\u4f60\u7528\uff1b \u63d0\u4f9b\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u529f\u80fd\uff0c\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u6bcf\u4e2a\u65b9\u6cd5\u5355\u72ec\u5199\u8f93\u51fa\u65e5\u5fd7\u7684\u4ee3\u7801\uff0c\u4e00\u5207\u6211\u4eec\u7ed9\u4f60\u641e\u5b9a\u4e86\uff0c\u65e5\u5fd7\u8f93\u51fa\u4e0d\u4ec5\u5185\u5bb9\u4e30\u5bcc\uff0c\u989c\u503c\u4e5f\u7edd\u5bf9\u5728\u7ebf\uff0c\u6211\u4eec\u8fd8\u81ea\u5df1\u8bbe\u8ba1\u4e86\u4e00\u6b3e\u7ec8\u7aef\u8f93\u51fa\u4e3b\u9898\u53eb\u300a\u4e94\u5f69\u6591\u6593\u7684\u9ed1\u300b\uff1b \u63d0\u4f9b\u4e86\u4e00\u952e\u90e8\u7f72\u81ea\u52a8\u5316\u6d4b\u8bd5\u73af\u5883\u7684\u529f\u80fd\uff0c\u8fde\u4ee3\u7801\u7f16\u8f91\u5668\u90fd\u7ed9\u4f60\u88c5\u597d\u4e86\uff0c\u8ba9\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u73af\u5883\u90e8\u7f72\u800c\u70e6\u607c\uff1b \u63d0\u4f9b\u4e86\u81ea\u52a8\u751f\u6210\u591a\u79cd\u62a5\u544a\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u8f93\u51fa\u4ec0\u4e48\u62a5\u544a\u5f62\u5f0f\u90fd\u884c\uff0c\u800c\u4e14\u6211\u4eec\u5728\u62a5\u544a\u4e2d\u8fd8\u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\u548c\u5931\u8d25\u622a\u56fe\u7684\u529f\u80fd\uff1b \u5bf9\u65ad\u8a00\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u63d0\u4f9b\u66f4\u53cb\u597d\u5316\u7684\u9519\u8bef\u63d0\u793a\uff0c\u8ba9\u5b9a\u4f4d\u95ee\u9898\u7cbe\u51c6\u9ad8\u6548\uff1b \u4e0d\u4ec5\u652f\u6301\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u63a7\u5236\uff0c\u800c\u4e14\u8fd8\u652f\u6301\u52a8\u6001\u63a7\u5236\u7528\u4f8b\u6279\u91cf\u6267\u884c\u7684\u603b\u65f6\u95f4\uff0c\u786e\u4fdd CI \u73af\u5883\u4e0b\u80fd\u987a\u7545\u8fd0\u884c\uff1b \u652f\u6301\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\u6267\u884c\u3001PMS \u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6807\u7b7e\u5316\u6267\u884c\u65b9\u6848\uff0c\u6ee1\u8db3\u4f60\u5404\u79cd\u573a\u666f\u4e0b\u7684\u6267\u884c\u9700\u6c42\uff1b \u652f\u6301\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u529f\u80fd\uff0c\u53ef\u5b9a\u4f4d\u53ef\u65ad\u8a00\uff0c\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\uff1b \u5b8c\u7f8e\u517c\u5bb9 Wayland \u548c X11\uff0c\u771f\u6b63\u505a\u5230\u4e00\u5957\u4ee3\u7801\uff0c\u968f\u5904\u6267\u884c\uff1b \u652f\u6301\u591a\u79cd\u65b9\u5f0f\u7684\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u5176\u4e2d\u5f02\u6b65\u56de\u586b\u7684\u65b9\u6848\uff0c\u5b8c\u7f8e\u89e3\u51b3\u4e86\u6570\u636e\u56de\u586b\u7684\u8017\u65f6\u95ee\u9898\uff1b \u3010\u89c6\u9891\u4ecb\u7ecd\u3011"},{"location":"#_2","title":"\u4e8c\u3001\u5b89\u88c5\u4f7f\u7528","text":"\u57fa\u7840\u6846\u67b6\uff1ahttps://github.com/linuxdeepin/deepin-autotest-framework \u4ece PyPI \u5b89\u88c5: sudo pip3 install youqu\n \u521b\u5efa\u9879\u76ee: youqu-startproject youqu\n \u5b89\u88c5\u4f9d\u8d56: cd youqu\nbash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002 \u5e94\u7528\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684\u5e94\u7528\u540d\u79f0\u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music cd apps/\n \u5c06\u5e94\u7528\u5e93\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u50cf\u8fd9\u6837\uff1a youqu\n\u251c\u2500\u2500 apps\n\u2502 \u251c\u2500\u2500 autotest_deepin_music # \u5e94\u7528\u5e93\n...\n \u5e94\u7528\u5e93\u7684\u540d\u79f0\u4e0d\u53ef\u4ee5\u4fee\u6539\u3002"},{"location":"#_3","title":"\u4e09\u3001\u8fd0\u884c","text":""},{"location":"#1","title":"1. \u5de5\u4f5c\u7a7a\u95f4","text":"\u57fa\u7840\u6846\u67b6\u5de5\u7a0b\u76ee\u5f55\u5efa\u8bae\u653e\u5728 ~ \u76ee\u5f55\u4e0b\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u4e5f\u53ef\u4ee5\u8fd0\u884c\uff0c\u4f46\u662f\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u9700\u8981\u505a\u73af\u5883\u6e05\u7406\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u5b58\u5728\u4ee3\u7801\u88ab\u5220\u9664\u7684\u98ce\u9669\u3002 \u5982\u679c\u4f60\u7684\u673a\u5668\u4e0a\u4e0d\u540c\u76ee\u5f55\u4e0b\u5b58\u5728\u591a\u4e2a YouQu \u5de5\u7a0b\uff0c\u90a3\u4e48\u5728\u8fd0\u884c\u4e4b\u524d\uff0c\u8bf7\u5148\u6267\u884c env.sh \u6821\u6b63\u76f8\u5173\u73af\u5883\u3002"},{"location":"#2","title":"2. \u6267\u884c\u5668","text":"\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u6709\u4e00\u4e2a manage.py \uff0c\u5b83\u662f\u4e00\u4e2a\u6267\u884c\u5668\u5165\u53e3\uff0c\u63d0\u4f9b\u4e86\u672c\u5730\u6267\u884c\u3001\u8fdc\u7a0b\u6267\u884c\u7b49\u7684\u529f\u80fd\u3002 \u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6765\u6267\u884c\uff1a youqu manage.py run -a deepin-music\n"},{"location":"#21","title":"2.1. \u672c\u5730\u6267\u884c","text":"youqu manage.py run\n"},{"location":"#211","title":"2.1.1. \u914d\u7f6e\u6587\u4ef6","text":"\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u914d\u7f6e\u53c2\u6570 \u5728\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u91cc\u9762\u652f\u6301\u914d\u7f6e\u5bf9\u6267\u884c\u7684\u4e00\u4e9b\u53c2\u6570\u8fdb\u884c\u914d\u7f6e\uff0c\u5e38\u7528\u7684\u5982\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;1\u3001KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2\u3001KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f, e.g. TAGS = L1 or smoke\n;\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\uff0c\u5c06\u8981\u6267\u884c\u7684\u7528\u4f8b\u5199\u5165\u6307\u5b9a\u7684 csv \u6587\u4ef6\n;\u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u4ece\u57fa\u7840\u6846\u67b6\u6839\u76ee\u5f55\u5f00\u59cb\uff1ae.g. CASE_FILE = case_list.txt\n;\u5982\u679c\u8fd9\u91cc\u6709\u503c\uff0cAPP_NAME KEYWORDS TAGS \u7684\u914d\u7f6e\u5747\u4e0d\u751f\u6548\nCASE_FILE =\n;=============================== RUNNER CONFIG ===================================\n[runner]\n;\u6700\u5927\u5931\u8d25\u7528\u4f8b\u6570\u91cf\u7684\u5360\u6bd4\n;\u6bd4\u5982\uff1a\u603b\u6267\u884c\u7528\u4f8b\u6570\u4e3a100, \u82e5 MAX_FAIL = 0.5,\u5219\u5931\u8d25\u7528\u4f8b\u6570\u8fbe\u523050\u5c31\u4f1a\u7ec8\u6b62\u6d4b\u8bd5\u3002\nMAX_FAIL = 0.5\n;\u5355\u6761\u7528\u4f8b\u7684\u8d85\u65f6\u65f6\u95f4\uff0c\u5982\u679c\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u8d85\u65f6\uff0c\u8fd9\u6761\u7528\u4f8b\u4f1a\u88ab\u505c\u6b62\uff0c\u540e\u7eed\u7528\u4f8b\u7ee7\u7eed\u6267\u884c\u3002\n;\u5355\u4f4d\u4e3a\u79d2\n; \u8fd9\u662f\u4e00\u4e2a\u5168\u5c40\u7edf\u4e00\u914d\u7f6e\uff0c\u5982\u679c\u67d0\u6761\u7528\u4f8b\u9700\u8981\u5355\u72ec\u914d\u7f6e\u8d85\u65f6\u65f6\u95f4\uff0c\u53ef\u4ee5\u5728\u7528\u4f8b\u4e2d\u8fd9\u6837\u5199\uff1a\n;@pytest.mark.timeout(500)\n;def test_xxx_001():\n; ...\n;\u4f1a\u8bdd\uff08\u6240\u6709\u7528\u4f8b\u6267\u884c\u7684\uff09\u8d85\u65f6\u662f\u6839\u636e\u5168\u5c40\u8d85\u65f6\u914d\u7f6e\u548c\u7528\u4f8b\u5355\u72ec\u8d85\u65f6\u914d\u7f6e\u81ea\u52a8\u8ba1\u7b97\u7684\uff1b\nCASE_TIME_OUT = 200\n;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\u3002\n;\u6ce8\u610f\uff0c\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u4e0d\u80fd\u5c0f\u4e8e\u5931\u8d25\u5f55\u5c4f\u6b21\u6570\uff0c\u5373 RERUN >= RECORD_FAILED_CASE\nRECORD_FAILED_CASE = 1\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = INFO\n;yes \u6bcf\u6761\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u8fdb\u884c\u73af\u5883\u6e05\u7406\nCLEAN_ALL = yes\n;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\nRESOLUTION = 1920x1080\n;\u4e0d\u8df3\u8fc7\u7528\u4f8b\uff0ccsv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86 skip-xxx\u7684\u7528\u4f8b\u4e0d\u8df3\u8fc7\nNOSKIP = no\n;ignore fixed\n;no\uff0c\u53ea\u8981\u6807\u8bb0\u4e86fixed\u7684\u7528\u4f8b\uff0c\u5373\u4f7f\u6807\u8bb0\u4e86skip-\uff0c\u4e5f\u4f1a\u6267\u884c\uff1b\n;yes\uff0cfixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\uff1b\nIFIXED = no\n;\u8981\u5b89\u88c5deb\u5305\u7684\u8def\u5f84\n;e.g : ~/Downloads/ \u5b89\u88c5\u4e0b\u8f7d\u76ee\u5f55\u4e0b\u7684deb\u5305\uff0c\u5982\u679c\u662f\u8fdc\u7a0b\u6267\u884c\uff0c\u4f1a\u81ea\u52a8\u62f7\u8d1d\u5230\u8fdc\u7a0b\u5e76\u5b89\u88c5\u3002\nDEB_PATH =\n;DEBUG \u6a21\u5f0f\u6267\u884c\u7528\u4f8b\uff0c\u53ea\u6536\u96c6\u4e0d\u6267\u884c\u7528\u4f8b\uff0c\u4e5f\u4e0d\u505a\u8bbe\u5907\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002\nDEBUG = no\n;\u8bb0\u5f55top\u547d\u4ee4\u67e5\u8be2\u7684\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0cTOP = 3 \u8868\u793a\u8bb0\u5f55\u524d3\u4e2a\u8fdb\u7a0b\u3002\nTOP =\n;\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\nREPEAT =\n;\u9ed8\u8ba4\u5728\u6240\u6709\u6d4b\u8bd5\u5b8c\u6210\u4e4b\u540e\u8f93\u51fa\u62a5\u9519\u4fe1\u606f.\n;yes, \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\nDURING_FAIL = no\n;=============================== REPORT CONFIG ===================================\n[report]\n;\u7528\u4f8b\u6267\u884c\u5b8c\u540e\u751f\u6210\u7684\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n;\u76ee\u524d\u652f\u6301 allure, xml, json \uff08\u652f\u6301\u540c\u65f6\u751f\u6210\uff09\nREPORT_FORMAT = allure, xml, json\n;\u6307\u5b9a\u62a5\u544a\u751f\u6210\u7684\u8def\u5f84\uff08\u76f8\u5bf9\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\uff09\nALLURE_REPORT_PATH = report/\nXML_REPORT_PATH = report/\nJSON_REPORT_PATH = report/\n;=============================== GLOBAL CONFIG ===================================\n[globalconfig]\n;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\nPASSWORD = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\nIMAGE_MATCH_NUMBER = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6bcf\u6b21\u95f4\u9694\u7b49\u5f85\u65f6\u95f4\nIMAGE_MATCH_WAIT_TIME = 1\n;\u56fe\u50cf\u8bc6\u522b\u5339\u914d\u5ea6\nIMAGE_RATE = 0.9\n;\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u5b9e\u65f6\u56fe\u50cf\u4fdd\u5b58\u8def\u5f84\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u5750\u6807\nSCREEN_CACHE = /tmp/screen.png\n;\u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\u7684\u8def\u5f84\nTMPDIR = /tmp/tmpdir\n;\u7cfb\u7edf\u4e3b\u9898\nSYS_THEME = deepin\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = http://youqu-dev.uniontech.com:8890\n;OpenCV\u670d\u52a1\u7aef\u5730\u5740\nOPENCV_SERVER_HOST = http://youqu-dev.uniontech.com:8889\n;=============================== PMS CONFIG ===================================\n;PMS\u76f8\u5173\u914d\u7f6e\uff0c\u5305\u542b\u4ee5\u4e0b\u51e0\u4e2a\u65b9\u9762\uff1a\n;1.PMS\u6d4b\u8bd5\u5957\u6267\u884c\n;2.\u81ea\u52a8\u4ecePMS\u722c\u53d6\u6570\u636e\u5e76\u540c\u6b65\u672c\u5730CSV\u6587\u4ef6\n;3.PMS\u6570\u636e\u56de\u586b\n[pms]\n;PMS\u7684\u7528\u6237\u540d: ut001234\nPMS_USER =\n;PMS\u7684\u5bc6\u7801\nPMS_PASSWORD =\n;PMS\u6d4b\u8bd5\u5957\u7684ID\n;\u5728PMS\u4e0a\u67e5\u770b\u7528\u4f8b\u201c\u5957\u4ef6\u201d\u94fe\u63a5: https://pms.uniontech.com/testsuite-view-495.html\n;\u6d4b\u8bd5\u5957ID\u4e3a: 495\nSUITE_ID =\n;\u6570\u636e\u56de\u586b\u5fc5\u987b\u5173\u8054PMS\u6d4b\u8bd5\u5355\n;\u5728PMS\u4e0a\u67e5\u770b\u6d4b\u8bd5\u5355\u94fe\u63a5: https://pms.uniontech.com/testtask-cases-20747.html\n;\u6d4b\u8bd5\u5355ID\u4e3a: 20747\nTASK_ID =\n;\u5c06\u6d4b\u8bd5\u7ed3\u679c\u6570\u636e\u56de\u586b\u5230PMS\n;\u4e3a\u7a7a: \u8868\u793a\u4e0d\u56de\u586b,\u4e0d\u4f1a\u5728\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u751f\u6210json\u7ed3\u679c\u6587\u4ef6;\n;async: \u8868\u793a\u9010\u6761\u5f02\u6b65\u56de\u586b,\u540e\u9762\u4e00\u6761\u6267\u884c\u5f00\u59cb\u65f6\u901a\u8fc7\u5b50\u7ebf\u7a0b\u5bf9\u524d\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u8fdb\u884c\u56de\u586b\uff0c\u5982\u6b64\u5b9e\u73b0\u65f6\u95f4\u6548\u7387\u6700\u5927\u5316;\n;finish: \u8868\u793a\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u6210\u4e4b\u540e\u9010\u4e2a\u56de\u586b(PMS\u4e0d\u652f\u6301\u5e76\u53d1);\nSEND_PMS =\n;\u6570\u636e\u56de\u586b\u7684\u89e6\u53d1\u8005\n;auto: \u6846\u67b6\u81ea\u52a8\u56de\u586b,\u914d\u5408SEND_PMS\u914d\u7f6e\u4f7f\u7528,\u4f60\u53ef\u4ee5\u9009\u62e9\u5728\u4e0d\u540c\u7684\u9636\u6bb5\u8fdb\u884c\u6570\u636e\u56de\u586b;\n;hand: \u624b\u52a8\u56de\u586b,\u6bcf\u6761\u7528\u4f8b\u4ecd\u7136\u4f1a\u751f\u6210json\u6587\u4ef6,\u4f46\u6846\u67b6\u4e0d\u4f1a\u8fdb\u884c\u6570\u636e\u56de\u586b,\u9700\u8981\u4f60\u53ef\u4ee5\u5728\u4f60\u60f3\u8981\u53d1\u9001\u7684\u65f6\u95f4\u70b9\u624b\u52a8\u89e6\u53d1\u56de\u586b;\nTRIGGER = auto\n;PMS\u56de\u586b\u7684\u91cd\u8bd5\u6b21\u6570\n;\u5982\u679c\u63a5\u53e3\u8bf7\u6c42\u5931\u8d25,\u4f1a\u8fdb\u884c\u91cd\u8bd5\nSEND_PMS_RETRY_NUMBER = 2\n[csv_link_pms_lib]\n;caselib: \u7528\u4f8b\u5e93\n;testcase: \u4ea7\u54c1\u5e93\u7528\u4f8b\nCASE_FROM = caselib\n[csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/caselib-browse-81.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 81\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic =\n[export_csv]\n;\u5bfc\u51fa\u7684csv\u6587\u4ef6\u540d\u79f0\uff0c\u9ed8\u8ba4 case_list.csv\nCSV_FILE = case_list.csv\n;exportcsv \u547d\u4ee4\u5bfc\u51fa case_list.csv \u6587\u4ef6\u65f6\u914d\u7f6e\u7684\u5b57\u6bb5\u540d\uff0c\u7528\u4f8b\u540d\u79f0\u9ed8\u8ba4\u5b58\u5728\u7b2c\u4e00\u5217\uff0c\u65e0\u9700\u6dfb\u52a0\nCSV_HEARD = \u7528\u4f8b\u7ea7\u522b,\u7528\u4f8b\u7c7b\u578b,\u6d4b\u8bd5\u7ea7\u522b,\u662f\u5426\u8df3\u8fc7\n \u914d\u7f6e\u5b8c\u6210\u4e4b\u540e\uff0c\u76f4\u63a5\u5728\u547d\u4ee4\u884c\u6267\u884c manage.py \u5c31\u597d\u4e86\u3002 youqu manage.py run\n"},{"location":"#212","title":"2.1.2. \u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a youqu manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--max_fail MAX_FAIL \u6700\u5927\u5931\u8d25\u7387\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--resolution RESOLUTION\n\u68c0\u67e5\u5206\u8fa8\u7387\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms {,async,finish}\n\u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--trigger {,auto,hand}\n\u89e6\u53d1\u8005\n-f CASE_FILE, --case_file CASE_FILE\n\u6839\u636e\u6587\u4ef6\u6267\u884c\u7528\u4f8b\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n--pms_user PMS_USER pms \u7528\u6237\u540d\n--pms_password PMS_PASSWORD\npms \u5bc6\u7801\n--suite_id SUITE_ID pms \u6d4b\u8bd5\u5957ID\n--pms_info_file PMS_INFO_FILE\npms \u4fe1\u606f\u6587\u4ef6\n--top TOP \u8fc7\u7a0b\u4e2d\u8bb0\u5f55top\u547d\u4ee4\u4e2d\u7684\u503c\n--lastfailed \u4ec5\u6267\u884c\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\n--duringfail \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\n--repeat REPEAT \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n--project_name PROJECT_NAME\n\u5de5\u7a0b\u540d\u79f0\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--build_location BUILD_LOCATION\n\u6784\u5efa\u5730\u533a\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--line LINE \u6267\u884c\u7684\u4e1a\u52a1\u7ebf\uff08\u5199\u5165json\u6587\u4ef6\uff09\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a youqu manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\"\n \u547d\u4ee4\u884c\u53c2\u6570\u4f18\u5148\u7ea7\u662f\u9ad8\u4e8e\u914d\u7f6e\u6587\u4ef6\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u4e86\u5bf9\u5e94\u7684\u53c2\u6570\uff0c\u914d\u7f6e\u6587\u4ef6\u4e2d\u4e0d\u7ba1\u662f\u5426\u914d\u7f6e\u5747\u4e0d\u751f\u6548\u3002 --app \u5165\u53c2\u8fd8\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\uff0c\u4e0b\u9762\u7684\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u540c\u6837\u652f\u6301\u3002"},{"location":"#22","title":"2.2. \u8fdc\u7a0b\u6267\u884c","text":"youqu manage.py remote\n \u8fdc\u7a0b\u6267\u884c\u540c\u6837\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u8fdb\u884c\u7528\u4f8b\u76f8\u5173\u914d\u7f6e\uff1b \u9700\u8981\u91cd\u70b9\u8bf4\u4e00\u4e0b\u8fdc\u7a0b\u6267\u884c\u65f6\u7684\u6d4b\u8bd5\u673a\u4fe1\u606f\u914d\u7f6e\uff0c\u5728\u914d\u7f6e\u6587\u4ef6 setting/remote.ini \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\u3001IP\u3001\u5bc6\u7801\u3002 ;=============================== CLIENT LIST =====================================\n; \u6d4b\u8bd5\u673a\u914d\u7f6e\u5217\u8868\n;[client{number}] ;\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u6709\u591a\u5c11\u53f0\u6d4b\u8bd5\u673a\u5c31\u5199\u591a\u5c11\u4e2a client\uff0c\u522b\u540d\u5fc5\u987b\u5305\u542b client \u5b57\u7b26\uff0c\u4e14\u4e0d\u80fd\u91cd\u590d\u3002\n;user = ;\u6d4b\u8bd5\u673a user\n;ip = ;\u6d4b\u8bd5\u673a ip\n;password = 1 ;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801, \u53ef\u4ee5\u4e0d\u914d\u7f6e\u6b64\u9879\uff0c\u9ed8\u8ba4\u53d6 CLIENT_PASSWORD \u7684\u503c\uff1b\n;\u5982\u679c\u4f60\u6240\u6709\u6d4b\u8bd5\u673a\u5bc6\u7801\u90fd\u76f8\u540c\uff0c\u90a3\u4e48\u53ea\u9700\u8981\u914d\u7f6e CLIENT_PASSWORD \u5c31\u53ef\u4ee5\u4e86\n;=================================================================================\n[client1]\nuser = uos\nip = 10.8.15.xx\n[client2]\nuser = uos\nip = 10.8.15.xx\n[client3]\nuser = uos\nip = 10.8.11.xx\n \u6709\u591a\u5c11\u53f0\u673a\u5668\u5c31\u50cf\u8fd9\u6837\u6328\u7740\u5199\u5c31\u884c\u4e86\u3002 \u7136\u540e\u5728\u547d\u4ee4\u884c\uff1a youqu manage.py remote\n \u8fd9\u6837\u8fd0\u884c\u662f\u4ece\u914d\u7f6e\u6587\u4ef6\u53bb\u8bfb\u53d6\u76f8\u5173\u914d\u7f6e\u3002 \u5982\u679c\u4f60\u4e0d\u60f3\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\uff0c\u4f60\u4ecd\u7136\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u8fdb\u884c\u4f20\u53c2\uff0c \u4ee5\u4e0b\u4e3a python3 manage.py remote \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-c CLIENTS, --clients CLIENTS\n\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679cpassword\u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6\nsetting/remote.ini \u4e2d CLIENT_PASSWORD\n\u7684\u503c,\u6bd4\u5982\uff1auos@10.8.13.33:1 \u6216 uos@10.8.13.33\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-s {yes,no,}, --send_code {yes,no,}\n\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a\uff08\u4e0d\u542breport\u76ee\u5f55\uff09\n-e, --build_env \u642d\u5efa\u6d4b\u8bd5\u73af\u5883,\u5982\u679c\u4e3ayes\uff0c\u4e0d\u7ba1send_code\u662f\u5426\u4e3ayes\u90fd\u4f1a\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a.\n-p CLIENT_PASSWORD, --client_password CLIENT_PASSWORD\n\u6d4b\u8bd5\u673a\u5bc6\u7801\uff08\u5168\u5c40\uff09\n-y PARALLEL, --parallel PARALLEL\nyes:\u8868\u793a\u6240\u6709\u6d4b\u8bd5\u673a\u5e76\u884c\u8dd1\uff0c\u6267\u884c\u76f8\u540c\u7684\u6d4b\u8bd5\u7528\u4f8b\uff0cno\n:\u8868\u793a\u6d4b\u8bd5\u673a\u5206\u5e03\u5f0f\u6267\u884c\uff0c\u670d\u52a1\u7aef\u4f1a\u6839\u636e\u6536\u96c6\u5230\u7684\u6d4b\u8bd5\u7528\u4f8b\u81ea\u52a8\u5206\u914d\u7ed9\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u3002\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms SEND_PMS \u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n \u5728\u547d\u4ee4\u884c\u8fd9\u6837\u8fd0\u884c\uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\"\n \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report \u76ee\u5f55\u4e0b\u56de\u6536\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u7684\u6d4b\u8bd5\u62a5\u544a\u3002 \u914d\u7f6e\u6587\u4ef6\u5176\u4ed6\u76f8\u5173\u914d\u7f6e\u9879\u8be6\u7ec6\u8bf4\u660e\uff0c\u8bf7\u67e5\u770b\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u6ce8\u91ca\u5185\u5bb9\u3002"},{"location":"#23-pms","title":"2.3. PMS \u6570\u636e\u56de\u586b","text":"\u6d4b\u8bd5\u5355\u5173\u8054\u7684\u7528\u4f8b\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u5bf9\u5e94\u7684\u53bb\u8dd1\u8fd9\u4e9b\u5173\u8054\u7684\u7528\u4f8b\uff0c\u5e76\u4e14\u5c06\u6267\u884c\u7684\u7ed3\u679c\u56de\u586b\u7684\u6d4b\u8bd5\u7528\u4f8b\u7684\u72b6\u6001\u91cc\u9762\u3002 PMS \u6570\u636e\u56de\u586b\u4e3b\u8981\u6709\u4e09\u79cd\u65b9\u5f0f\uff1a \uff081\uff09\u5f02\u6b65\u56de\u586b \u5728\u7528\u4f8b\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\uff0c\u91c7\u7528\u5f02\u6b65\u7684\u65b9\u5f0f\u53bb\u8fdb\u884c\u6570\u636e\u56de\u586b\uff0c\u76f4\u767d\u7684\u8bb2\u5c31\u662f\uff0c\u7b2c\u4e8c\u6761\u7528\u4f8b\u5f00\u59cb\u8dd1\u7684\u65f6\u5019\uff0c\u901a\u8fc7\u5b50\u7ebf\u7a0b\u53bb\u505a\u7b2c\u4e00\u6761\u7528\u4f8b\u7684\u6570\u636e\u56de\u586b\uff0c\u5982\u6b64\u5faa\u73af\uff0c\u76f4\u5230\u6240\u6709\u7528\u4f8b\u6267\u884c\u7ed3\u675f\uff1b \u8fd9\u79cd\u65b9\u6848\u7684\u65f6\u95f4\u6548\u7387\u6700\u9ad8\u7684\uff0c\u56e0\u4e3a\u7406\u8bba\u4e0a\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u662f\u5927\u4e8e\u6570\u636e\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\u65f6\u95f4\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u5f53\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u6570\u636e\u56de\u586b\u4e5f\u5b8c\u6210\u4e86\u3002 \u4f7f\u7528\u65b9\u6cd5\uff0c\u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u4ee5\u4e0b\u53c2\u6570\uff1a\uff08\u4ee5\u4e0b\u6d89\u53ca\u5230\u7684\u53c2\u6570\u914d\u7f6e\u90fd\u662f\u5728\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u914d\u7f6e\uff09 PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = async\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \u8fd9\u4e2a\u53c2\u6570\u53ef\u586b\u53ef\u4e0d\u586b\uff0c\u4f46\u662f\u586b\u4e86\u53ef\u4ee5\u63d0\u9ad8\u7528\u4f8b\u7684\u6267\u884c\u901f\u5ea6\uff0c\u56e0\u4e3a\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u53ef\u4ee5\u6307\u5b9a\u5230\u5177\u4f53\u7684\u5e94\u7528\u5e93\u3002\uff08\u4e0b\u540c\uff09\n \uff082\uff09\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u56de\u586b \u7b49\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u518d\u9010\u4e2a\u8fdb\u884c\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u6b64\u65b9\u6848\u65f6\u95f4\u6548\u7387\u6bd4\u8f83\u4f4e\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \uff083\uff09\u624b\u52a8\u56de\u586b \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4e0d\u505a\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u540e\u7eed\u624b\u52a8\u5c06\u7ed3\u679c\u8fdb\u884c\u56de\u586b\u8bf7\u6c42\u3002 \u7528\u4f8b\u6267\u884c\u65f6\u914d\u7f6e\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = hand\nAPP_NAME = \u540e\u7eed\u624b\u52a8\u56de\u586b\u65b9\u6cd5\uff1a youqu manage.py pms --send2task yes\n"},{"location":"#_4","title":"\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898","text":"\u7531\u540c\u5b66\u53ef\u80fd\u4f1a\u53d1\u73b0\uff0c\u600e\u4e48\u56de\u586b\u4e00\u6b21\u4e4b\u540e\uff0c\u540e\u9762\u60f3\u518d\u6b21\u56de\u586b\u5c31\u4e0d\u751f\u6548\u4e86\uff1b \u8fd9\u662f\u56e0\u4e3a\u4e3a\u4e86\u5e94\u5bf9\u524d\u9762\u63d0\u5230\u7684\u591a\u79cd\u6570\u636e\u56de\u586b\u7684\u65b9\u5f0f\uff0c\u5728 report \u76ee\u5f55\u4e0b\u4f1a\u7531 pms_xxx \u5f00\u5934\u7684\u76ee\u5f55\uff0c\u8bb0\u5f55\u4e86\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u548c\u56de\u586b\u60c5\u51b5\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u4e4b\u524d\u5df2\u7ecf\u56de\u586b\u8fc7\u4e86\uff0c\u540e\u7eed\u5c31\u4e0d\u4f1a\u518d\u6b64\u89e6\u53d1\u56de\u586b\u4e86\uff1b \u5982\u679c\u4f60\u60f3\u91cd\u65b0\u505a\u56de\u586b\uff0c\u4f60\u53ef\u4ee5\u628a report/pms_xxx \u76ee\u5f55\u5220\u6389\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u91cd\u65b0\u505a\u6570\u636e\u56de\u586b\u4e86\uff1b"},{"location":"#24-csv","title":"2.4. \u5bfc\u51fa CSV \u6587\u4ef6","text":"\u6846\u67b6\u63d0\u4f9b\u5bfc\u51fa\u6307\u5b9a\u6807\u7b7e\u7528\u4f8b\u7684\u529f\u80fd\uff1a youqu manage.py exportcsv -a deepin-album -t CICD\n \u8868\u793a\u5bfc\u51fa deepin-album \u7684\u7528\u4f8b\u4e2d\u6807\u8bb0\u4e86 CICD \u6807\u7b7e\u7684\u7528\u4f8b\uff0c\u5bfc\u51fa CSV \u6587\u4ef6\u7684\u5b57\u6bb5\u683c\u5f0f\u5df2\u7ecf\u9002\u914d\u4e86 CICD \u7684\u8981\u6c42\u3002"},{"location":"#25-app","title":"2.5. \u811a\u624b\u67b6\u65b0\u5efa APP \u5de5\u7a0b","text":"\u65b0\u5efa\u4e00\u4e2a APP \u5de5\u7a0b\uff1a youqu manage.py startapp autotest_deepin_some \u8fd9\u6837\u5728 apps \u76ee\u5f55\u4e0b\u4f1a\u521b\u5efa\u4e00\u4e2a\u5b50\u9879\u76ee\u5de5\u7a0b autotest_deepin_some\uff0c\u540c\u65f6\u65b0\u5efa\u597d\u5de5\u7a0b\u6a21\u677f\u76ee\u5f55\u548c\u6a21\u677f\u6587\u4ef6\uff1a apps\n\u2514\u2500\u2500 autotest_deepin_some\n \u00a0\u00a0 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_case.py\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 config.ini\n \u00a0\u00a0 \u251c\u2500\u2500 config.py\n \u00a0\u00a0 \u251c\u2500\u2500 conftest.py\n \u00a0\u00a0 \u251c\u2500\u2500 control\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_assert.py\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some.csv\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u2514\u2500\u2500 widget\n \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 case_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 other.ini\n \u00a0\u00a0 \u251c\u2500\u2500 other_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 pic_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2514\u2500\u2500 ui.ini\n autotest_deepin_some \u662f\u4f60\u7684\u5de5\u7a0b\u540d\u79f0\uff0c\u6bd4\u5982\uff1aautotest_deepin_music \uff1b \u5728\u6b64\u57fa\u7840\u4e0a\uff0c\u4f60\u53ef\u4ee5\u5feb\u901f\u7684\u5f00\u59cb\u4f60\u7684 AT \u9879\u76ee\u3002"},{"location":"#26","title":"2.6. \u7528\u4f8b\u6807\u7b7e\u81ea\u52a8\u540c\u6b65","text":"\u7528\u4e8e\u81ea\u52a8\u540c\u6b65 PMS \u7528\u4f8b\u6807\u7b7e\u6570\u636e\u81f3\u672c\u5730 CSV \u6587\u4ef6\uff0c\u4e3b\u8981\u901a\u8fc7\u4ee5\u4e0b\u51e0\u4e2a\u914d\u7f6e\u6765\u63a7\u5236\uff1a APP_NAME = # \u6307\u5b9a\u8981\u540c\u6b65\u7684\u5e94\u7528\u540d\u79f0\nPMS_USER = # PMS\u7684\u7528\u6237\u540d\nPMS_PASSWORD = # PMS\u7684\u5bc6\u7801\n \u5728 [csv_link_pms_id] \u8282\u70b9\u4e0b\u6307\u5b9a csv \u6587\u4ef6\u540d\u4e0e PMS \u7528\u4f8b\u6a21\u5757\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u6bd4\u5982\uff1a [csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/testcase-browse-53.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 53\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic = 53\n \u5c06\u4ee5\u4e0a\u4fe1\u606f\u914d\u7f6e\u597d\u4e4b\u540e\uff0c\u5728\u547d\u4ee4\u884c\u6267\u884c\uff1a youqu manage.py pms --pms2csv yes\n \u6bcf\u6b21\u6267\u884c\u65f6\u539f csv \u6587\u4ef6\u4f1a\u81ea\u52a8\u5907\u4efd\u5728 report/csv_back \u76ee\u5f55\u4e0b\uff0c\u56e0\u6b64\u4f60\u4e0d\u7528\u62c5\u5fc3\u811a\u672c\u6267\u884c\u5bfc\u81f4\u4f60\u7684\u6570\u636e\u4e22\u5931\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u57fa\u7840\u6846\u67b6\u8bbe\u8ba1\u65b9\u6848","text":"# ====================================\n# Author : Mikigo\n# Time : 2022/3/18\n# version \uff1a1.0\n# ====================================\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"\u505a\u4e00\u4e2a\u7b80\u5355\u3001\u597d\u7528\u3001\u529f\u80fd\u5f3a\u5927\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u3002 \u4f5c\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4e00\u4e2a\u57fa\u7840\u6846\u67b6\uff0c\u4efb\u4f55\u5e94\u7528\u90fd\u80fd\u5f88\u65b9\u4fbf\u7684\u63a5\u5165\u8fdb\u6765\uff1b \u63d0\u4f9b\u6240\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u9700\u8981\u7684\u5e95\u5c42\u529f\u80fd\uff0c\u5e76\u5bf9\u5916\u63d0\u4f9b\u552f\u4e00\u7684\u63a5\u53e3\uff0c\u65b9\u4fbf\u5e94\u7528\u5e93\u4f7f\u7528\uff1b \u6574\u5408\u516c\u5171\u5e93\uff0c\u51cf\u5c11\u5e94\u7528\u5e93\u4ee3\u7801\u91cf\u548c\u65b9\u6cd5\u7ef4\u62a4\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u8bbe\u8ba1\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u7edf\u4e00\u6982\u5ff5","text":" \u57fa\u7840\u6846\u67b6 \u672c\u9879\u76ee\u662f\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\uff08AutoTest Basic Frame\uff09\uff0c\u5168\u79f0\u4e3a\u201c\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff08AT \u57fa\u7840\u6846\u67b6\uff09\u201d\u3002 AT \u57fa\u7840\u6846\u67b6\u662f\u505a\u4e3a\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\u6765\u8bbe\u8ba1\u7684\uff0c\u5b83\u63d0\u4f9b\u4e86\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u57fa\u7840\u529f\u80fd\uff0c\u4efb\u4f55\u5e94\u7528\u63a5\u5165\u8fdb\u6765\u90fd\u80fd\u5feb\u901f\u65b9\u4fbf\u7684\u8fdb\u884c\u65b9\u6cd5\u548c\u7528\u4f8b\u7f16\u5199\uff0c\u540c\u65f6\u5728\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u3001\u6807\u7b7e\u5316\u6267\u884c\u3001\u5206\u5e03\u5f0f\u6267\u884c\u3001\u591a\u79cd\u62a5\u544a\u8f93\u51fa\u3001\u4f18\u7f8e\u7684\u6267\u884c\u65e5\u5fd7\u3001\u5931\u8d25\u81ea\u52a8\u5f55\u5c4f\u548c\u622a\u56fe\u3001\u81ea\u52a8\u73af\u5883\u6e05\u7406\u7b49\u7b49\uff0c\u5b83\u90fd\u63d0\u4f9b\u4e86\u5b8c\u5584\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u66f4\u91cd\u8981\u7684\u662f\u8fd9\u4e00\u5207\u4f7f\u7528\u8d77\u6765\u90fd\u975e\u5e38\u7b80\u5355\u3002 \u57fa\u7840\u6846\u67b6\u4e2d\u5305\u542b\u5e94\u7528\u5e93\uff08apps\uff09\u3001\u6838\u5fc3\u5e93\uff08src\uff09\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09\u3002 \u5e94\u7528\u5e93\uff08apps\uff09 \u5404\u4e2a\u5e94\u7528\u81ea\u5df1\u7684\u4ed3\u5e93\uff0c\u91cc\u9762\u4e3b\u8981\u5305\u542b\u7684\u662f\u7528\u4f8b\u3001\u65b9\u6cd5\u53ca\u4e00\u4e9b\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u53eb autotest-dde-file-manager \u3002 \u6838\u5fc3\u5e93\uff08src\uff09 \u6838\u5fc3\u5e93\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u5230\u6240\u6709\u5e95\u5c42\u6838\u5fc3\u529f\u80fd\uff0c\u8fd9\u662f\u6700\u91cd\u8981\u7684\u4e00\u4e2a\u90e8\u5206\uff0c\u7075\u9b42\u3002\u5177\u4f53\u529f\u80fd\u6a21\u5757\u53ca\u8bf4\u660e\u4f1a\u5728\u4e0b\u9762\u7b2c\u56db\u4e2a\u7ae0\u8282\u8be6\u7ec6\u63cf\u8ff0\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09 \u591a\u4e2a\u5e94\u7528\u90fd\u8981\u7528\u5230\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\uff0c\u6309\u7167\u5e94\u7528\u5212\u5206\u5b58\u653e\uff0c\u4e3b\u8981\u662f\u4e3a\u4e86\u51cf\u5c11\u4ee3\u7801\u91cf\uff0c\u6d88\u9664\u5e94\u7528\u95f4\u7684\u8026\u5408\u5173\u7cfb\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u67b6\u6784\u56fe","text":"\u6574\u4f53\u7684\u6846\u67b6\u8bbe\u8ba1\u5728\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u300b\u6587\u6863\u91cc\u9762\u5df2\u7ecf\u6709\u8be6\u7ec6\u63cf\u8ff0\u4e86\uff0c\u8fd9\u91cc\u8d34\u4e00\u4e0b\u6574\u4f53\u7684\u67b6\u6784\u56fe\uff1a \u4e3a\u4e86\u7a81\u663e\u672c\u6587\u7684\u91cd\u70b9\uff0c\u62bd\u53d6\u5176\u4e2d\u91cd\u8981\u529f\u80fd\u6a21\u5757\uff0c\u5982\u4e0b\u56fe\uff1a "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-basic-frame # \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\n\u251c\u2500\u2500 apps # \u5e94\u7528\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-dde-file-manager # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\uff08\u5e94\u7528\u5e93\u8be6\u7ec6\u76ee\u5f55\u7ed3\u6784\u8bf7\u770b\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\uff09\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 tag # \u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u2514\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u2502 \u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 xxx.png\n\u2502 \u2502 ...\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-deepin-music # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 public # \u516c\u5171\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget # dde_dock \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget # dde_desktop \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 src # \u6838\u5fc3\u5e93\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 button_center.py\n\u2502 \u251c\u2500\u2500 cmdtrl.py\n\u2502 \u251c\u2500\u2500 dogtails.py\n\u2502 \u251c\u2500\u2500 find_image.py\n\u2502 \u251c\u2500\u2500 global_config.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 setting # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 config.py\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 global_config.ini\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\u6a21\u5757\uff08Hook\uff09\n\u251c\u2500\u2500 pytest.ini # Pytest \u9ed8\u8ba4\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 docs # \u6587\u6863\u76ee\u5f55\n\u2514\u2500\u2500 manage.py # \u6267\u884c\u5668\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1apps","title":"1\u3001\u5e94\u7528\u5e93\uff08apps\uff09","text":"\u6240\u6709\u5e94\u7528\u5e93\u5747\u653e\u7f6e\u5728\u57fa\u7840\u6846\u67b6\u4e0b\u7684 apps \u76ee\u5f55\u4e0b\uff08\u89c1\u7b2c\u4e8c\u7ae0\u8282\u7b2c3\u6bb5\u76ee\u5f55\u7ed3\u6784\u5185\u5bb9\uff09\u3002\u5e94\u7528\u5e93\u7684\u67b6\u6784\u8bbe\u8ba1\u53ef\u4ee5\u53c2\u8003\u300aAT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b\u6587\u6863\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2src","title":"2\u3001\u6838\u5fc3\u5e93\uff08src\uff09","text":"\u5728 src \u76ee\u5f55\u4e0b\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u5e95\u5c42\u6838\u5fc3\u7ec4\u4ef6\uff0c\u901a\u5e38\u6765\u8bb2\u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5230\u5176\u4e2d\u67d0\u4e00\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4e48\u4f60\u9700\u8981\u663e\u793a\u7684\u5bfc\u5165\u8fd9\u4e2a\u6a21\u5757\uff0c\u7136\u540e\u624d\u80fd\u4f7f\u7528\u8be5\u6a21\u5757\u4e0b\u7684\u529f\u80fd\uff0c\u5982\u679c\u4f60\u7528\u5230\u4e86\u5341\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4f60\u5c31\u9700\u8981\u5bfc\u5165\u5341\u4e2a\u3002\u4f46\u662f\u6211\u4eec\u60f3\u8ba9\u4e8b\u60c5\u53d8\u5f97\u7b80\u5355\uff0c\u4e00\u6b21\u5bfc\u5165\uff0c\u4f7f\u7528\u6240\u6709\u3002 \u5c06\u6240\u6709\u7684\u529f\u80fd\u6a21\u5757\u90fd\u8fdb\u5165\u5230 src \u7684\u540d\u79f0\u7a7a\u95f4\uff0c\u5728 src/__init__.py \u91cc\u9762\u6211\u4eec\u8bbe\u8ba1\u6210\u8fd9\u6837\uff1a # src/__init__.py\nfrom .cmdctl import CmdCtl\nfrom .dogtails import Dogtail\nfrom .find_image import FindImage\nfrom .button_center import ButtonCenter\nclass Src(CmdCtl, FindImage):\ndef __init__(self, **kwargs):\n\"\"\"dogtail or button center param\n :param kwargs: app_name, desc, number\n \"\"\"\nif kwargs:\napp_name = kwargs.get(\"APP_NAME\")\ndesc = kwargs.get(\"DESC\")\nif app_name is None or desc is None:\nraise ValueError\nnumber = kwargs.get(\"number\")\nnumber = number if isinstance(number, int) else -1\n# \u5bf9\u8c61\u7ec4\u5408\nself.dog = Dogtail(app_name, desc, number)\nself.ui = ButtonCenter(app_name, number)\n \u9700\u8981\u4f20\u9012\u53c2\u6570\u7684\u91c7\u7528\u5bf9\u8c61\u7ec4\u5408\uff0c\u6ca1\u6709\u53c2\u6570\u7684\u4f7f\u7528\u7ee7\u627f\uff0c\u7ee7\u627f\u7684\u7c7b\u7b26\u5408 Mixin \u8bbe\u8ba1\u6a21\u5f0f\u3002 \u5e94\u7528\u5e93\u91cc\u9762\u4f7f\u7528\u7684\u65f6\u5019\u5728 widget/base_widget.py \u91cc\u9762\u53ea\u9700\u8981\u552f\u4e00\u7ee7\u627f Src \uff1a # \u5e94\u7528\u5e93\u91cc\u9762\u65b9\u6cd5\u57fa\u7c7b\n# widget/base_widget.py\nfrom src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n \u8981\u4f7f\u7528\u6838\u5fc3\u5e93\u7684\u529f\u80fd\uff0c\u53ea\u9700\u8981\u5199\u4e00\u4e2a\u5bfc\u5165 from src import Src \u5373\u53ef\u3002 \u5199 __init__ \u6784\u9020\u51fd\u6570\u7684\u539f\u56e0\u662f\u901a\u8fc7\u53c2\u6570\u6784\u9020\u5e94\u7528\uff0c\u5e76\u4e14\u4f20\u9012 number \u8fdb\u6765\uff0c\u53ef\u4ee5\u5b9e\u73b0\u591a\u7a97\u53e3\u7684\u63a7\u5236\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3public","title":"3\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09","text":"\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6bcf\u4e2a\u5e94\u7528\u90fd\u662f\u4e00\u4e2a\u5355\u72ec\u7684 py \u6587\u4ef6\uff0c\u76f8\u4e92\u4e4b\u95f4\u662f\u72ec\u7acb\u7684\uff0c\u6bcf\u4e2a py \u6587\u4ef6\u91cc\u9762\u662f\u8be5\u5e94\u7528\u7684\u65b9\u6cd5\u7c7b\uff0c\u6bd4\u5982\uff1a\u6700\u5e38\u7528\u7684\u65b9\u6cd5\u7c7b dde_desktop_public_widget.py # dde_desktop_widget.py\nfrom src import Src\nclass _DdeDesktopPublicBaseWidget(Src):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-desktop\"\nDESC = \"/usr/bin/dde-desktop\"\ndef __init__(self):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC)\nclass DdeDesktopPublicWidget(_DdeDesktopPublicBaseWidget):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u7c7b\"\"\"\ndef click_music_dir_by_ui(self):\n\"\"\"\u5728\u6587\u4ef6\u9009\u62e9\u6846\u70b9\u51fb\u97f3\u4e50\u76ee\u5f55\"\"\"\nself.click(*self.ui.btn_center(\"\u4fa7\u8fb9\u680f-\u97f3\u4e50\")) \ndef click_xxx_by_attr(self):\npass\n \u516c\u5171\u65b9\u6cd5\u5e93\u610f\u4e49\uff1a \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6240\u5c01\u88c5\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\u90fd\u662f\u81f3\u5c11\u88ab2\u4e2a\u5e94\u7528\u90fd\u7528\u5230\u7684\uff0c\u8fd9\u6837\u505a\u53ef\u4ee5\u51cf\u5c11\u6574\u4f53\u4ee3\u7801\u91cf\uff0c\u4ece\u800c\u51cf\u8f7b\u5e94\u7528\u5e93\u4ee3\u7801\u7684\u7ef4\u62a4\u5de5\u4f5c\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u7f16\u5199\u5f62\u5f0f\uff08\u547d\u540d\u89c4\u5219\u3001\u5b9a\u4f4d\u7684\u65b9\u6848\u5199\u6cd5\u3001\u6ce8\u91ca\u7684\u5199\u6cd5\u7b49\u7b49\uff09\u5177\u6709\u4e00\u5b9a\u7684\u6a21\u677f\u4f5c\u7528\uff0c\u8fd9\u6837\u5373\u4f7f\u662f\u5404\u4e2a\u5e94\u7528\u5e93\u90fd\u72ec\u7acb\u7ef4\u62a4\uff0c\u6240\u6709\u7684\u7f16\u7801\u98ce\u683c\u90fd\u662f\u8d8b\u4e8e\u76f8\u540c\u7684\uff0c\u56e0\u4e3a\u5927\u5bb6\u90fd\u5e94\u8be5\u53c2\u7167\u516c\u5171\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u5199\u6cd5\u6765\u5199\u81ea\u5df1\u5e94\u7528\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\u7c7b\uff0c\u8fd9\u6837\u4f7f\u5f97\u4ece\u516c\u53f8\u7684\u89d2\u5ea6\u53bb\u770b\u6240\u6709\u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u90fd\u662f\u7edf\u4e00\u7684\u3002 \u53ef\u4ee5\u901a\u8fc7\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\uff0c\u4e86\u89e3\u5230\u5176\u4ed6\u5e94\u7528\u7684\u529f\u80fd\uff0c\u5bf9\u4e8e\u6211\u4eec\u9700\u6c42\u7406\u89e3\uff0c\u4e86\u89e3\u7cfb\u7edf\u7684\u65b9\u65b9\u9762\u9762\u4e5f\u6709\u597d\u5904\u3002 \u5f53\u7136\uff0c\u5982\u679c\u4f60\u7684\u5e94\u7528\u672c\u8eab\u662f\u5c5e\u4e8e\u6839\u672c\u5c31\u4e0d\u9700\u8981\u548c\u5176\u4ed6\u5e94\u7528\u4ea4\u4e92\u7684\uff0c\u90a3\u4e48\u4f60\u53ef\u80fd\u4e0d\u4f1a\u7528\u5230\u8fd9\u91cc\u9762\u7684\u529f\u80fd\uff0c\u6ca1\u5173\u7cfb\uff0c\u4f60\u6240\u6709\u7684\u65b9\u6cd5\u90fd\u53ef\u4ee5\u76f4\u63a5\u5199\u5728\u5e94\u7528\u5e93\u7684\u4e1a\u52a1\u5c42\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4conftestpy","title":"4\u3001conftest.py","text":"conftest.py \u4ece\u529f\u80fd\u4e0a\u5c06\u662f\u5c5e\u4e8e\u6838\u5fc3\u5e93\uff08src\uff09\u7684\u5185\u5bb9\uff0c\u4f46\u662f\u7531\u4e8e\u5b83\u7684\u7279\u6b8a\u6027\uff0c\u5373\u5b83\u662f\u5bf9\u5e94\u7528\u5e93\u4e2d\u7684\u7528\u4f8b\u751f\u6548\u7684\uff0c\u800c\u4e14\u5b83\u7684\u4f5c\u7528\u57df\u662f\u5f53\u524d\u76ee\u5f55\u53ca\u4ee5\u4e0b\uff0c\u56e0\u6b64\u6211\u4eec\u5c06\u5b83\u653e\u5230\u9879\u76ee\u6839\u76ee\u5f55\u3002\u6211\u4eec\u6846\u67b6\u4e2d\u6709\u4e0d\u5c11\u6838\u5fc3\u529f\u80fd\u90fd\u662f\u5728\u8fd9\u91cc\u9762\u8fdb\u884c\u5f00\u53d1\u7684\uff0c\u540e\u9762\u7b2c\u56db\u7ae0\u4f1a\u8bb2\u5230\u7ec6\u8282\u3002 pytest.ini \u4f5c\u7528\u548c conftest.py \u7c7b\u4f3c\uff0c\u662f Pytest \u6846\u67b6\u7684\u56fa\u5b9a\u914d\u7f6e\u6587\u4ef6\uff0c\u76ee\u524d\u914d\u7f6e\u4e86\u4e00\u4e9b\u901a\u7528\u7684\u547d\u4ee4\u884c\u6267\u884c\u53c2\u6570\uff0c\u4e5f\u653e\u5728\u9879\u76ee\u6839\u76ee\u5f55\u3002 \u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 Hook \u51fd\u6570\uff0capps \u76ee\u5f55\u4e0b\u7684 \u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 fixture \u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5setting","title":"5\u3001setting","text":"\u5168\u5c40\u914d\u7f6e\u6a21\u5757\uff0c\u5305\u542b\u4e86\u4ee5\u4e0b\u914d\u7f6e\u6587\u4ef6\uff1a \uff081\uff09ini \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u914d\u7f6e\u4e00\u4e9b\u5168\u5c40\u7684\u914d\u7f6e\u9879\uff0c\u8b6c\u5982\uff1a\u5931\u8d25\u91cd\u8dd1\u6b21\u6570\u3001\u662f\u5426\u5931\u8d25\u5f55\u5c4f\u3001\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\u3001\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4\u3001\u6267\u884c\u65f6\u65e5\u5fd7\u7ea7\u522b\u3001\u751f\u6210\u7684\u62a5\u544a\u7c7b\u578b\u3001\u4ee5\u53ca\u5206\u5e03\u5f0f\u6267\u884c\u7684\u4e00\u4e9b\u7b56\u7565\u914d\u7f6e\u9879\u7b49\u7b49\u3002 \uff082\uff09config.py \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u63d0\u4f9b\u914d\u7f6e\u6587\u4ef6\u8bfb\u53d6\u3001\u52a8\u6001\u83b7\u53d6\u4e00\u4e9b\u5e38\u91cf\uff08\u5982\u9879\u76ee\u6839\u76ee\u5f55\u7edd\u5bf9\u8def\u5f84 (BASE_DIR)\u3001\u7cfb\u7edf\u67b6\u6784\uff08SYS_FRAME\uff09\u3001\u65f6\u95f4\u5b57\u7b26\u4e32\uff08strftime\uff09\u3001\u672c\u673a USERNAME IP \u7b49\u7b49\uff09\u3001\u516c\u5171 URL \u7b49\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u89c4\u8303","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u7248\u672c\u53ca\u4f9d\u8d56","text":"\u57fa\u7840\u6846\u67b6\u4f1a\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u8fdb\u884c\u7248\u672c\u53d1\u5e03\uff0c\u4e0d\u4e0e\u67d0\u4e2a\u5e94\u7528\u7248\u672c\u7ed1\u5b9a\uff0c\u4f46\u662f\uff0c\u5e94\u7528\u5e93\u4f1a\u4f9d\u8d56\u4e8e\u57fa\u7840\u6846\u67b6\u7684\u7248\u672c\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u5efa\u8bae\u5728\u5e94\u7528\u5e93\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a\u6587\u672c\u6587\u4ef6\u7528\u4e8e\u8bb0\u5f55\u6240\u4f9d\u8d56\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\uff0c\u7c7b\u4f3c\u4e8e\u5f00\u53d1\u5e94\u7528\u7684 debian/control \u6587\u4ef6\u7684\u529f\u80fd\uff0c\u4e3a\u4e86\u4fdd\u6301\u7edf\u4e00\uff0c\u8fd9\u4e2a\u6587\u4ef6\u5c31\u547d\u540d\u4e3a control\uff0c\u653e\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u6838\u5fc3\u5e93\u72ec\u7acb\u6027","text":"\u6838\u5fc3\u5e93\u4e0d\u5efa\u8bae\u9488\u5bf9\u67d0\u4e00\u4e2a\u5e94\u7528\u5355\u72ec\u505a\u4ee3\u7801\u4e0a\u7279\u6b8a\u5904\u7406\uff0c\u901a\u5e38\u8003\u8651\u9488\u5bf9\u67d0\u4e00\u79cd\u573a\u666f\u8fdb\u884c\u5904\u7406\uff0c\u8fd9\u4e9b\u573a\u666f\u901a\u5e38\u662f\u5b58\u5728\u4e00\u4e9b\u5171\u6027\u7684\u3002\u6bd4\u5982\u8bf4\uff1a\u684c\u9762\u7684ID\u5206\u914d\u5b58\u5728\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u903b\u8f91\u5904\u7406\u89e3\u51b3ID\u5206\u914d\u9519\u8bef\u7684\u95ee\u9898\uff0c\u4f46\u662f\u8fd9\u90e8\u5206\u903b\u8f91\u6211\u4eec\u4f1a\u5728\u684c\u9762\u7684\u65b9\u6cd5\u5c42\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u517c\u5bb9\u6027","text":"\u4e3a\u4e86\u4fdd\u6301\u517c\u5bb9\u6027\uff0c\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u539f\u5219\u4e0a\u4e0d\u5bf9\u8001\u65b9\u6cd5\u8fdb\u884c\u4fee\u6539\u6216\u5220\u9664\uff0c\u53ea\u8fdb\u884c\u65b0\u589e\u3002\u6d89\u53ca\u5230\u8001\u65b9\u6cd5\u4fee\u6539\u6216\u5220\u9664\u7684\uff0c\u4f1a\u8fdb\u884c\u63d0\u524d\u9884\u544a\uff0c\u5e76\u5728\u7b2c\u4e8c\u4e2a\u7248\u672c\u4e4b\u540e\uff08\u4e2d\u95f4\u4f1a\u9694\u4e00\u4e2a\u7248\u672c\u8fc7\u5ea6\uff09\u6b63\u5f0f\u5b9e\u65bd\u4fee\u6539\u6216\u5220\u9664\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u547d\u540d\u89c4\u8303","text":" \u7528\u4f8b ID \u6bcf\u4e2a\u5e94\u7528\u81ea\u5df1\u7ef4\u62a4\u4e00\u5957 ID\uff0c\u5728PMS\u4e0a\u7528\u4f8b\u6807\u9898\u4e0a\u5c06\u81ea\u52a8\u5316ID\u4ee5\u6807\u7b7e\u7684\u5f62\u5f0f\u5199\u5165\uff0c\u6bd4\u5982\uff1a[101]\u6253\u5f00-\u542f\u52a8\u5e94\u7528\u540edock\u53f3\u952e\u83dc\u5355 \u4e00\u4e2a\u7528\u4f8b\u7c7b\u91cc\u9762\u6709\u591a\u4e2a\u7528\u4f8b\u65f6\uff0c\u5728\u7528\u4f8b\u540d\u79f0\u540e\u9762\u52a0\u5e8f\u53f7\u3002 class TestFileManager(BaseCase):\n\"\"\"\u6587\u7ba1\u7528\u4f8b\"\"\"\ndef test_xxx_015_1(self):\npass\ndef test_xxx_015_2(self):\npass\n \u6ce8\u610f 015_1\uff0c\u4e0d\u8981\u5199015_01\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 PMS \u4e0a\u7684\u7528\u4f8bID\uff1a PMS \u4e0a\u662f6\u4f4d\u6570\uff0c\u4e0d\u591f\u76f4\u89c2\uff0c\u4e5f\u4e0d\u597d\u7ef4\u62a4\uff0c\u5728\u81ea\u52a8\u5316\u4e0b\u9762\u53bb\u627e\u4e00\u4e2a\u5e26\u6709 6 \u4f4d\u6570\u7684\u6587\u4ef6\u662f\u4e00\u4e2a\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 PMS \u4e0a\u7684 ID \u53ef\u80fd\u4f1a\u53d1\u751f\u53d8\u5316\uff0c\u6bd4\u5982\u5bfc\u51fa\u6765\u5bfc\u8fdb\u53bb\u7684\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u5b58\u5728\u95ee\u9898\uff0c\u5982\u679c\u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u8981\u60f3\u627e\u51fa\u6765\u5bf9\u5e94\u4fee\u6539\u81ea\u52a8\u5316\u7528\u4f8b ID\uff0c\u5c06\u4f1a\u662f\u4ef6\u975e\u5e38\u75db\u82e6\u7684\u4e8b\u60c5\u3002 \u51fd\u6570\u547d\u540d\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5de6\u952e\u70b9\u51fb click \u53f3\u952e\u70b9\u51fb right_click \u53cc\u51fb double_click \u79fb\u52a8 move_to \u62d6\u52a8 drag \u65b0\u5efa new \u62d6\u52a8\u5230 drag_to \u4ece\u54ea\u91cc\u62d6\u52a8\u5230\u54ea\u91cc drag_something_from_xxx_to_xxx \u83b7\u53d6 get \u83b7\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5750\u6807 get_location \u975e\u7279\u6b8a\u6587\u4ef6 file word\u6587\u4ef6 doc text\u6587\u4ef6 text \u6587\u4ef6\u5939 dir \u5173\u952e\u8bcd\u6301\u7eed\u589e\u52a0 \u5e38\u91cf\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5e94\u7528\u540d\u79f0 APP_NAME \u5e94\u7528\u63cf\u8ff0 DESC \u672c\u5e94\u7528\u4ee5\u5916\u7684\u5176\u4ed6\u5e94\u7528\uff0c\u6bd4\u5982\u5e2e\u52a9 HELP \u5176\u4ed6\u540d\u79f0\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u65b9\u6cd5\u5305\u540d widget \u65b9\u6cd5\u6587\u4ef6\u540d\uff08\u6587\u7ba1\u4e3e\u4f8b\uff09 dfm_widget.pytitle_widget.pyright_view_widget.pyleft_view_widget.pypop_widget.pybase_widget.pydfm_assert.py \u65ad\u8a00\u8bed\u53e5\u547d\u540d\u89c4\u8303 \u65ad\u8a00\u8bed\u53e5\u90fd\u662f\u4ee5 assert \u5f00\u5934 \u65ad\u8a00 \u8bed\u53e5 \u5224\u65ad\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_existsassert_file_not_exists \u5224\u65ad\u684c\u9762\u76ee\u5f55\u4e0b\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_exists_in_desktopassert_file_not_exists_in_desktop \u5224\u65ad\u56fe\u7247\u5b58\u5728 assert_image_existsassert_image_not_exists \u5224\u65ad\u5f71\u9662\u4e2d\u662f\u5426\u5b58\u5728\u56fe\u7247 assert_image_exists_in_movieassert_image_not_exists_in_movie \u5224\u65ad\u5143\u7d20\u662f\u5426\u5b58\u5728 assert_element_existassert_element_not_exist \u5224\u65ad\u662f\u5426\u76f8\u7b49 assert_equalassert_not_equal \u5224\u65ad\u662f\u5426\u4e3a\u771f assert_trueassert_false"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5fixture","title":"5\u3001fixture \u89c4\u8303","text":"\u7531\u4e8e Pytest \u6846\u67b6\u4e2d\u652f\u6301 fixture \u7684\u5199\u6cd5\u548c Xunit \u5199\u6cd5\u7684\uff0c\u6240\u4ee5\u5e94\u7528\u5e93\u4e2d\u53ef\u80fd\u5b58\u5728\u6df7\u7528\u7684\u60c5\u51b5\uff0c\u4e3a\u7edf\u4e00\u7f16\u7801\u98ce\u683c\u65b9\u4fbf\u540e\u7eed\u7528\u4f8b\u4ee3\u7801\u7ef4\u62a4\uff0c\u73b0\u505a\u4ee5\u4e0b\u89c4\u8303\u8bf4\u660e\uff1a \u629b\u5f03 Xunit \u7684\u5199\u6cd5\uff0c\u7edf\u4e00\u91c7\u7528 Pytest fixture \u7684\u5199\u6cd5\u3002 \u5e94\u7528\u5185 fixture \u8c28\u614e\u4f7f\u7528 autouse=True \uff0c\u975e\u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u975e\u5e38\u4e0d\u5efa\u8bae\u4f7f\u7528\u8fd9\u4e2a\u53c2\u6570\u3002 \u8c03\u7528 fixture \u4e0d\u80fd\u4f7f\u7528 @pytest.mark.usefixture()\uff0c\u4f7f\u7528\u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u4f20\u5165\u51fd\u6570\u5bf9\u8c61\u3002 \u5efa\u8bae\u5728\u4e00\u4e2a conftest.py \u91cc\u9762\u53bb\u5199\uff0c\u4e00\u4e2a\u5e94\u7528\u4e5f\u5c3d\u91cf\u7ef4\u62a4\u4e00\u4e2a conftest.py\u6587\u4ef6\u3002 fixture \u4e5f\u9700\u8981\u5199\u529f\u80fd\u8bf4\u660e\uff0c\u51fd\u6570\u540d\u79f0\u8981\u6709\u5177\u4f53\u542b\u4e49\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#6","title":"6\u3001\u65b9\u6cd5\u7f16\u5199\u89c4\u8303","text":" \u65b9\u6cd5\u7c7b\u578b\uff1a if \u6ca1\u6709\u7528\u5230\u5b9e\u4f8b\u5bf9\u8c61\uff1a\nif \u6ca1\u6709\u7528\u5230\u7c7b\u5bf9\u8c61\uff1a\n\u5199\u9759\u6001\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @staticmethod\nelse\uff1a\n\u5199\u7c7b\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @classmethod\nelse:\n\u76f4\u63a5\u5199\u5b9e\u4f8b\u65b9\u6cd5\n \u4e3e\u4f8b: class TitleWidget:\ndef click_xxx_by_ui(self):\npass\n@staticmethod\ndef click_xxx_by_ui():\npass\n@classmethod\ndef click_xxx_by_ui(cls):\npass\n \u51fd\u6570\u540d\u79f0\u4e0d\u51fa\u73b0\u6570\u5b57\uff0c\u9700\u8981\u8868\u793a\u6570\u91cf\u7684\u7528\u5355\u8bcd\u8868\u793a\u3002 \u51fd\u6570\u529f\u80fd\u6ce8\u91ca\u3002 \u6ca1\u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg2:xxx\n\"\"\"\n \u6709\u53c2\u6570\uff0c\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg1:xxx\nreturn: xxx\n\"\"\"\n \u200b \u7528 Pycharm \u7684\u6ce8\u91ca\u6a21\u677f\u4e5f\u53ef\u4ee5\uff0c\u53ea\u8981\u4f53\u73b0\u4e86\u53c2\u6570\u7684\u7c7b\u578b\u548c\u8fd4\u56de\u5c31\u884c\u4e86\u3002 \u6682\u4e0d\u8981\u6c42\u5199\u7c7b\u578b\u6ce8\u89e3\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#7case","title":"7\u3001\u7528\u4f8b\uff08case\uff09\u89c4\u8303","text":" \u4ee5\u7c7b\u7684\u5f62\u5f0f\u5199\u7528\u4f8b\uff0c\u7528\u4f8b\u7c7b\u96c6\u6210\u7528\u4f8b\u57fa\u7c7b\u3002 \u7528\u4f8b\u7c7b\u9700\u8981\u5199\u6ce8\u91ca\u3002 \u6d4b\u8bd5\u7528\u4f8b\u51fd\u6570\u8bf4\u660e\uff08\u5efa\u8bae\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u540d\u79f0\uff09 \"\"\"\u53f3\u4fa7\u9884\u89c8-\u56fe\u7247\u7c7b\u578b\u4fe1\u606f\u680f\u57fa\u672c\u4fe1\u606f\"\"\"\n \u4e0d\u5199\u8c03\u8bd5\u4ee3\u7801 if __name__ == '__main__':\npytest.main()\n \u6240\u6709\u7528\u4f8b\u90fd\u7ee7\u627f BaseCase\u3002 BaseCase \u91cc\u9762\u653e\u4e00\u4e9b\u6d4b\u8bd5\u6570\u636e\u7684\u5e38\u91cf\uff0c\u6bd4\u5982\u6587\u4ef6\u540d\u79f0\uff0c\u5e94\u7528\u540d\u79f0\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u4e00\u4e9b\u901a\u7528\u7684\u5b57\u7b26\u4e32\u3002 \u8fd9\u7c7b\u662f\u5c5e\u4e8e\u6d4b\u8bd5\u6570\u636e\u3002 class BaseCase(DfmAssert):\n\"\"\"\u7528\u4f8b\u57fa\u7c7b\"\"\"\nNEW_FILE = \"\u65b0\u5efa\u6587\u672c.txt\"\nTEST_FILE = \"test.txt\"\nNEW_DIR = \"\u65b0\u5efa\u6587\u4ef6\u5939\"\nNEW_WORD = \"\u65b0\u5efaWord\u6587\u6863.doc\"\nAPP_HELP = \"damn\"\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\n\"\"\"\u7528\u4f8b\u6807\u9898\uff08\u590d\u5236PMS\u4e0a\u7528\u4f8b\u6807\u9898\uff09\"\"\"\ndfm = DfmWidget()\ndfm.click_xxx_by_attr(self.NEW_FILE)\ndfm.new_file_in_desktop_by_cmd(self.NEW_FILE)\nself.assert_true(dfm.get_process_status(self.APP_NAME))\n \u7528\u4f8b\u91cc\u9762\u5c3d\u91cf\u51cf\u5c11\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\uff0c\u66f4\u8981\u51cf\u5c11\u76f8\u540c\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\u3002 \u7edf\u4e00\u6587\u4ef6\u6ce8\u91ca\u5934\u3002 #!/usr/bin/env python3\n# _*_ coding:utf-8 _*_\n\"\"\"\n:Author:email@uniontech.com\n:Date :${DATE} ${TIME}\n\"\"\"\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#8","title":"8\u3001\u5176\u4ed6\u89c4\u8303","text":" \u65e5\u5fd7\u6253\u5370\u8981\u5728\u65b9\u6cd5\u6700\u524d\u9762\uff0c\u5426\u5219\u4ee3\u7801\u62a5\u9519\u6ca1\u6709\u65e5\u5fd7\u8f93\u51fa\uff0c\u4e0d\u597d\u5b9a\u4f4d\u95ee\u9898\u3002\uff08\u6211\u4eec\u4f1a\u8003\u8651\u7ee7\u7eed\u4f7f\u7528\u62e6\u622a\u5668\u6253\u5370\u65e5\u5fd7\uff09 \u6240\u6709\u7684\u64cd\u4f5c\u90fd\u9700\u8981\u6709\u65e5\u5fd7\uff0c\u5305\u62ec sleep()\uff0c\u6211\u4eec\u4f1a\u91cd\u5199\u4e00\u4e2a\u6709\u65e5\u5fd7\u8f93\u5165\u7684 sleep\u3002 \u4e1a\u52a1\u5c42\u65e5\u5fd7\u7ea7\u522b\u4e3a INFO\u3002 hook \u51fd\u6570\u53ea\u80fd\u5199\u5230\u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u91cc\u9762\u3002 apps \u76ee\u5f55\u4e0b\u7684 conftest.py \u539f\u5219\u4e0a\u4e0d\u4f1a\u65b0\u589e fixture\u3002 \u56fa\u5b9a\u76ee\u5f55\u6216\u5143\u7d20\u63a7\u4ef6\u7684\u64cd\u4f5c\uff0c\u5c06\u64cd\u4f5c\u65b9\u6cd5\u5199\u6b7b\uff0c\u6587\u4ef6\u7c7b\u64cd\u4f5c\u5c06\u6587\u4ef6\u540d\u7559\u53c2\u6570\u3002 \u8def\u5f84\u62fc\u63a5\u89c4\u8303\uff1a \u7cfb\u7edf\u4e2d\u56fa\u5b9a\u76ee\u5f55\uff0c\u8def\u5f84\u62fc\u63a5\u65f6\u4f7f\u7528\u6ce2\u6d6a\u7b26\u53f7\uff0c\u6bd4\u5982\uff1a~/Desktop/\uff0c\u4e0b\u5c42\u4f7f\u7528 os.path.expanduser()\uff0c\u5b83\u53ef\u4ee5\u81ea\u52a8\u8bc6\u522b\u6ce2\u6d6a\u7b26\u53f7\u3002 \u9879\u76ee\u4e0b\u8def\u5f84\u4f7f\u7528\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u8def\u5f84\uff0c\u6bd4\u5982\uff1aConfig.BASE_PATH\uff0c\u56e0\u4e3a\u9879\u76ee\u662f\u53ef\u4ee5\u5728\u4efb\u610f\u8def\u5f84\u8fd0\u884c\u7684\uff0c\u9700\u8981\u52a8\u6001\u62fc\u63a5\u8def\u5f84\u3002 "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848","text":"# =================================================\n# Author : Mikigo\n# Time : 2022/3/16\n# version \uff1a1.0\n# =================================================\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"AT \u5e94\u7528\u5e93\u6539\u9020\u662f\u57fa\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u8fdb\u884c\u7528\u4f8b\u65b9\u6cd5\u548c\u4e1a\u52a1\u903b\u8f91\u7684\u91cd\u65b0\u8bbe\u8ba1\uff0c\u4ee5\u5b9e\u73b0\u5e94\u7528\u5e93\u9ad8\u6548\u7684\u7f16\u5199\u3001\u7ef4\u62a4\u7528\u4f8b\u53ca\u5176\u65b9\u6cd5\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u6587\u4ef6\u7ba1\u7406\u5668\u4ece\u4e1a\u52a1\u590d\u6742\u5ea6\u548c\u7528\u4f8b\u91cf\u6765\u8bb2\uff0c\u5728\u7cfb\u7edf\u6240\u6709\u5e94\u7528\u4e2d\uff0c\u662f\u5f88\u6709\u4ee3\u8868\u6027\u7684\uff0c\u96be\u5ea6\u4e5f\u662f\u6700\u5927\u7684\uff0c\u56e0\u6b64\u6211\u4eec\u9009\u53d6\u6587\u4ef6\u7ba1\u7406\u5668\u4f5c\u4e3a\u5e94\u7528\u5e93\u6539\u9020\u7684\u5b9e\u9a8c\u5e94\u7528\uff0c\u7ed9\u540e\u7eed\u5176\u4ed6\u5e94\u7528\u6539\u9020\u63d0\u4f9b\u5207\u5b9e\u53ef\u884c\u7684\u601d\u8def\u548c\u65b9\u6848\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u5206\u5c42\u8bbe\u8ba1\u56fe","text":"\u6574\u4f53\u4ecd\u7136\u9075\u5faa PO \u8bbe\u8ba1\u7406\u5ff5\uff0c\u6839\u636e\u4e1a\u52a1\u9700\u8981\uff0c\u5c06\u6587\u7ba1\u4e1a\u52a1\u5c42\u8fdb\u884c 3 \u5c42\u5212\u5206\uff1a "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-dde-file-manager # \u5e94\u7528\u4ed3\u5e93\n\u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 test_xxx_001.py\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u00a0\u251c\u2500\u2500 __init__.py\n\u2502 \u00a0\u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u00a0\u251c\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u00a0\u251c\u2500\u2500 base_widget.py # \u65b9\u6cd5\u57fa\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 title_widget.py # title \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 right_view_widget.py # right view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 left_view_widget.py # left view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 pop_widget.py # pop \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 dfm_widget.py # \u65b9\u6cd5\u7684\u7edf\u4e00\u51fa\u53e3\n\u2502 \u00a0\u2514\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 tag # \u7528\u4f8b\u6807\u7b7e\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 xxx.csv # \u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2514\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u57fa\u7c7b","text":" \u7ee7\u627f\u6838\u5fc3\u5c42\u7684\u5404\u4e2a\u6a21\u5757\u7c7b\u3002 \u62bd\u53d6\u64cd\u4f5c\u5c42\u7684\u4e00\u4e9b\u57fa\u7840\u65b9\u6cd5\u3002 \u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u7684\u4e00\u4e9b\u516c\u5171\u65b9\u6cd5\u3002 \u8def\u5f84\u7ec4\u88c5\u65b9\u6cd5\u3002 \u4e00\u4e9b\u4e1a\u52a1\u5c42\u76f8\u5173\u7684\u53d8\u91cf\u3001\u5e38\u91cf\u3001shell\u547d\u4ee4\u3001\u5750\u6807\u3002 \u65b9\u6cd5\u57fa\u7c7b\u7684\u5199\u6cd5\uff1a from src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u64cd\u4f5c\u5c42","text":" \u6a21\u5757\u5212\u5206 \u6309\u7167\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u6587\u7ba1\u4e3b\u754c\u9762\u5206\u4e3a\u4e09\u4e2a\u533a\u57df\uff1a\u6807\u9898\u680f\u3001\u53f3\u8fb9\u89c6\u56fe\u533a\u57df\u3001\u5de6\u8fb9\u89c6\u56fe\u533a\u57df \u5f39\u7a97\uff1a\u8bbe\u7f6e\u754c\u9762\u5f39\u7a97\u3001\u4fdd\u9669\u7bb1\u5f39\u7a97\u3001\u5220\u9664\u786e\u8ba4\u5f39\u7a97\u3001\u53ca\u5404\u79cd\u7f51\u7edc\u5f39\u7a97 \u53f3\u952e\u83dc\u5355\uff1a\u6682\u65f6\u4e0d\u8003\u8651\u4e3a\u5355\u72ec\u7684\u6a21\u5757\uff0c\u8003\u8651\u4ee5\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6848\u505a\u6210\u516c\u5171\u5e93\u3002 \u5404\u4e2a\u6a21\u5757\u53ea\u7ee7\u627f\u57fa\u7c7b from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u6784\u9020\u51fd\u6570\u91cc\u9762\u4e0d\u6784\u9020\u5bf9\u8c61\uff0c\u53ef\u4ee5\u521d\u59cb\u5316\u4e00\u4e9b\u53d8\u91cf\u3002 \u4e0d\u540c\u7684\u5b9a\u4f4d\u65b9\u6848\u8c03\u7528\u4e0d\u540c\u7684\u5b9a\u4f4d\u5de5\u5177\u5bf9\u8c61\u3002 self.dog\nself.ui\nself.d_bus\n \u65b9\u6cd5\u7f16\u5199 \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u5e94\u7528\u5c42","text":" \u7ee7\u627f\u64cd\u4f5c\u5c42\u7684\u6240\u6709\u7c7b\u3002 \u4ec5\u4ec5\u7528\u4e8e\u7528\u4f8b\u4e2d\u5bfc\u5165\u65b9\u4fbf\uff0c\u4e0d\u505a\u5176\u4ed6\u4e8b\u60c5\u3002 class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n DfmAssert \u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u7ee7\u627f\uff0c\u65b9\u4fbf\u4f7f\u7528\u65ad\u8a00\u8bed\u53e5\u3002 from apps.dde_file_manager.widget.dfm_widget import DfmWidget\nfrom public.assert import Assert\nclass DfmAssert(Assert):\ndef assert_file_exists_in_desktop(self, file_name):\nself.assert_file_exists(f\"~/Desktop{file_name}\")\n...\nDfmWidget().get_file_in_desktop()\n \u7528\u4f8b\u91cc\u9762\u76f4\u63a5\u7ee7\u627f\uff0c\u65b9\u4fbf\u5728\u7528\u4f8b\u91cc\u9762\u4f7f\u7528 self \u8fdb\u884c\u65ad\u8a00\uff0c\u66f4\u7b26\u5408\u65ad\u8a00\u7684\u4f7f\u7528\u4e60\u60ef\uff0c\u7528\u4f8b\u903b\u8f91\u4e0a\u66f4\u6e05\u695a\u3002 class BaseCase(DfmAssert):\npass\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\nself.assert_file_exists_in_desktop(\"xxx\")\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u903b\u8f91\u4e3e\u4f8b","text":"\u7528\u4f8b\u4ee3\u7801\u8c03\u7528\u903b\u8f91\u4e3e\u4f8b\uff1a # BaseWidget\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n# =============================================\n# TitleWidget\nclass TitleWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_title_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# RightViewWidget\nclass RightViewWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_right_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# =============================================\n# \u51fa\u53e3 DfmWidget\nclass DfmWidget(TitleWidget, RightViewWidget):\npass\n# =============================================\n# in case\nfrom apps.dde_file_manager.widget.dfm_widget import DfmWidget\ndfm = DfmWidget()\ndfm.click_xxx_title_by_ui()\ndfm.click_xxx_right_by_ui()\ndfm.dog.print_desc()\ndfm.ui.print_number()\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u5de5\u7a0b\u6539\u9020\u5b9e\u65bd\u6b65\u9aa4","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_2","title":"1\u3001\u5de5\u7a0b\u4ee3\u7801\u62c9\u53d6","text":"1.1. \u5c06\u81ea\u52a8\u5316\u57fa\u7840\u6846\u67b6\u7684\u529f\u80fd\u62c9\u5230\u672c\u5730 Autotest Basic Frame \uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame 1.2. \u5c06\u5e94\u7528\u5e93\u4ee3\u7801\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u5e94\u7528\u5e93\u7684\u4ed3\u5e93\u547d\u540d\u5e94\u8be5\u662f\u957f\u8fd9\u6837\u7684 autotest_deepin_xxx\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_2","title":"2\u3001\u8c03\u6574\u5de5\u7a0b\u76ee\u5f55","text":"\u6309\u7167 \u65b9\u6848\u8bbe\u8ba1-\u76ee\u5f55\u7ed3\u6784 \u8fdb\u884c\u76ee\u5f55\u8c03\u6574\uff0c\u5c3d\u91cf\u4f7f\u7528\u7f16\u8f91\u5668\u8fdb\u884c\u76f8\u5e94\u7684\u8c03\u6574\uff0c\u7f16\u8f91\u5668\u63a8\u8350\u4f7f\u7528 Pycharm \uff0c\u4ee5\u4e0b\u64cd\u4f5c\u5747\u5728 Pycharm \u91cc\u9762\u53ef\u5b9e\u73b0\u3002 2.1. \u9700\u8981\u79fb\u52a8 py \u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u76f4\u63a5\u5728\u7f16\u8f91\u5668\u91cc\u9762\uff0c\u4f7f\u7528\u9f20\u6807\u9009\u4e2d\u5e76\u6309\u4f4f\uff0c\u4e4b\u540e\u62d6\u52a8\u5230\u76ee\u6807\u4f4d\u7f6e\u5373\u53ef\uff0cPycharm \u4f1a\u5c3d\u53ef\u80fd\u7684\u81ea\u52a8\u89e3\u51b3\u79fb\u52a8\u5bfc\u81f4\u7684\u8def\u5f84\u95ee\u9898\u3002\u6ce8\u610f\uff0c\u6211\u8bf4\u7684\u662f\u201c\u5c3d\u53ef\u80fd\u201d\uff0c\u6709\u4e9b\u9a9a\u64cd\u4f5c\u7f16\u8f91\u5668\u662f\u65e0\u6cd5\u81ea\u52a8\u5904\u7406\u7684\u3002\u5982\u679c\u6ca1\u6709\u88ab\u7f16\u8f91\u5668\u81ea\u52a8\u5904\u7406\u7684\u8def\u5f84\u95ee\u9898\uff0c\u540e\u7eed\u53ea\u80fd\u624b\u52a8\u89e3\u51b3\u3002 2.2. \u9700\u8981\u91cd\u547d\u540d\u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u5728\u7f16\u8f91\u5668\u91cc\u9762\u9009\u4e2d\u6587\u4ef6\uff0c\u7136\u540e\u4f7f\u7528\u5feb\u6377\u952e Shift + F6 \uff08\u5982\u679c\u5feb\u6377\u952e\u6ca1\u53cd\u5e94\uff0c\u6587\u4ef6\u53f3\u952e\u83dc\u5355 Refactor \u2014\u2014 Rename\uff09\uff0c\u7136\u540e\u5728\u8f93\u5165\u6846\u4e2d\u8f93\u5165\u8981\u91cd\u547d\u540d\u7684\u540d\u79f0\uff0c\u540c\u65f6\uff0c\u786e\u8ba4\u52fe\u9009 Search for references \u548c Search in comments and strings \u8fd9\u4e24\u4e2a\u9009\u9879\uff0c\u6700\u540e\u6309\u56de\u8f66\u6216\u8005\u9f20\u6807\u70b9 Refactor \u3002 \u6ce8\u610f\uff0c\u6b64\u65f6\u7f16\u8f91\u5668\u53ef\u80fd\u4f1a\u63d0\u793a\u4f60\uff0c\u4f60\u8fd9\u4e2a\u91cd\u547d\u540d\u7684\u64cd\u4f5c\u5173\u8054\u4e86\u591a\u4e2a\u6a21\u5757\uff0c\u5b83\u88ab\u591a\u4e2a\u5730\u65b9\u90fd\u4f7f\u7528\u5230\u4e86\uff0c\u76f8\u5173\u7684\u6a21\u5757\u662f\u5426\u4e5f\u4e00\u8d77\u6539\u540d\u4e86\uff0c\u8fd9\u4e0d\u5e9f\u8bdd\u5417\uff0c\u7528\u8fd9\u4e2a\u529f\u80fd\u5c31\u662f\u60f3\u628a\u5173\u8054\u5230\u7684\u90fd\u4fee\u6539\uff0c\u4e0d\u7136\u6211\u4e3a\u4ec0\u4e48\u4e0d\u7528\u6587\u7ba1\u7684\u91cd\u547d\u540d\u529f\u80fd\u5462\uff0c\u522b\u60f3\u4e86\uff0c\u76f4\u63a5\u70b9\u5de6\u4e0b\u89d2\u7684 Refactor \u6309\u94ae\uff0c\u5c31\u662f\u5e72\u3002 \u7c7b\u540d\u3001\u51fd\u6570\u540d\u7684\u91cd\u547d\u540d\u90fd\u5c3d\u91cf\u91c7\u7528\u8fd9\u79cd\u65b9\u6848\uff0c\u56e0\u4e3a\u7f16\u8f91\u5668\u4f1a\u81ea\u52a8\u7ed9\u6211\u4eec\u627e\u5230\u5173\u8054\u7684\u5730\u65b9\uff0c\u7136\u540e\u540c\u6b65\u4fee\u6539\u6389\u3002\u4f60\u53ef\u5343\u4e07\u522b\u76f4\u63a5\u5220\u4e86\u4fee\u6539\u540d\u79f0\uff0c\u4e0d\u7136\u4f60\u53ef\u80fd\u4f1a\u82b1\u4e0a\u4e00\u5929\u7684\u65f6\u95f4\u6765\u89e3\u51b3\u91cd\u547d\u540d\u7684\u95ee\u9898\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u5b9e\u73b0\u6838\u5fc3\u5e93\u63a5\u53e3","text":"3.1. BaseWidget \u5728 BaseWidget \u91cc\u9762\u628a\u8be5\u5199\u7684\u90fd\u5199\u597d\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u4e0a\u9762\u7684\u8bbe\u8ba1\u7406\u5ff5\u6765\u5199\u3002 \u5982\u679c\u4f60\u5acc\u9ebb\u70e6\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u6587\u7ba1\u7684\u5b9e\u9645\u5de5\u7a0b\u4ee3\u7801 autotest_dde_file_manager : https://gerrit.uniontech.com/admin/repos/autotest_dde_file_manager \u3002 3.2. \u64cd\u4f5c\u5c42 \u5982\u679c\u4f60\u662f\u65b0\u5199\u9879\u76ee\uff0c\u4f60\u4f1a\u53d1\u73b0\u4e00\u5207\u90fd\u662f\u90a3\u4e48\u7684\u7b80\u5355\u3001\u76f4\u63a5\uff0c\u6309\u7167\u6211\u4eec\u63d0\u4f9b\u7ed9\u4f60\u7684\u63a5\u53e3\u5199\u7528\u4f8b\u7684\u64cd\u4f5c\u65b9\u6cd5\u5c31\u597d\u4e86\u3002 \u5982\u679c\u4f60\u662f\u60f3\u5bf9\u539f\u6765\u7684\u5de5\u7a0b\u8fdb\u884c\u6539\u9020\uff0c\u4f60\u9700\u8981\u6309\u7167\u6838\u5fc3\u5e93\u65b9\u6cd5\u7684\u8c03\u7528\uff0c\u5c06\u4f60\u4e4b\u524d\u5199\u7684\u6bcf\u4e2a\u65b9\u6848\u8fdb\u884c\u5bf9\u5e94\u7684\u4fee\u6539\uff0c\u5305\u62ec\u7c7b\u548c\u65b9\u6cd5\u7684\u547d\u540d\u3001\u65b9\u6cd5\u5185\u6240\u8981\u7528\u5230\u4e0d\u540c\u5b9a\u4f4d\u65b9\u6cd5\u7684\u5199\u6cd5\u4fee\u6539\u3002 \u8fd9\u65f6\u5019\u4f60\u53ef\u80fd\u4f60\u7684\u4ee3\u7801\u4e2d\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u62a5\u9519\uff0c\u4e0d\u7528\u62c5\u5fc3\uff0c\u4f60\u53ef\u4ee5\u4ece\u4e1a\u52a1\u903b\u8f91\u51fa\u53d1\uff0c\u60f3\u6e05\u695a\u8fd9\u4e2a\u65b9\u6cd5\u662f\u5e72\u4ec0\u4e48\u7684\u3001\u64cd\u4f5c\u7684\u5bf9\u8c61\u662f\u4ec0\u4e48\u3001\u53c2\u6570\u662f\u4ec0\u4e48\uff0c\u6ce8\u610f\u8fd9\u4e9b\u4fee\u6539\u662f\u4f1a\u5f71\u54cd\u5230\u7528\u4f8b\u4ee3\u7801\u91cc\u9762\u7684\uff0c\u6ca1\u5173\u7cfb\uff0c\u7528\u4f8b\u91cc\u9762\u672c\u6765\u4e5f\u5e94\u8be5\u88ab\u5173\u8054\u4fee\u6539\u3002 3.3. \u628a\u914d\u7f6e\u6a21\u5757\u5199\u597d\uff0c\u8fd9\u90e8\u5206\u57fa\u672c\u53ef\u4ee5\u590d\u5236\u6587\u7ba1\u7684\u4ee3\u7801\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4_1","title":"4\u3001\u8def\u5f84\u5904\u7406","text":"4.1. \u5bfc\u5165\u8def\u5f84 \u65b9\u6cd5\u548c\u7528\u4f8b\u4e2d\u90fd\u4f1a\u6d89\u53ca\u5230\u5bfc\u5165\u8def\u5f84\u7684\u4fee\u6539\uff0c\u5728\u4fee\u6539\u8def\u5f84\u65f6\uff0c\u5efa\u8bae\u4f60\u4f7f\u7528 Ctrl + Shift + R \u5168\u5c40\u66ff\u6362\uff0c\u4f1a\u5c06\u6574\u4e2a\u9879\u76ee\u4e0b\u7684\u76f8\u540c\u5730\u65b9\u90fd\u4fee\u6539\u5230\uff0c\u5f53\u7136\uff0c\u4f60\u4e5f\u53ef\u4ee5\u5728\u5c0f\u5f39\u7a97\u4e2d\u4fee\u6539\u5168\u5c40\u66ff\u6362\u4e3a\u5c40\u90e8\u76ee\u5f55\u4e0b\u66ff\u6362\u3002\u5904\u7406\u90a3\u79cd\u6ca1\u6709\u5173\u8054\u5173\u7cfb\uff0c\u4f46\u662f\u53c8\u662f\u76f8\u540c\u540d\u79f0\u7684\u91cd\u547d\u540d\uff0c\u6211\u4e5f\u63a8\u8350\u4f7f\u7528\u8fd9\u79cd\u65b9\u5f0f\u8fdb\u884c\u91cd\u547d\u540d\u3002 \u6ce8\u610f\uff0c\u5168\u5c40\u66ff\u6362\u7684\u65b9\u5f0f\u4efb\u7136\u65e0\u6cd5\u4fdd\u8bc1\u771f\u7684\u5168\u5c40\u88ab\u66ff\u6362\u4e86\uff08\u53ef\u80fd\u662f\u7f16\u8f91\u5668\u7684 Bug \u5427\uff09\uff0c\u6240\u4ee5\u4f60\u4ecd\u7136\u9700\u8981\u624b\u52a8\u770b\u4e0b\u5404\u5904\u662f\u5426\u4fee\u6539\u5230\u4f4d\u3002 4.2. \u8d44\u6e90\u8def\u5f84 \u4e00\u4e9b\u7528\u4f8b\u8d44\u6e90\u9700\u8981\u6839\u636e config.py \u91cc\u9762\u7684\u8def\u5f84\u914d\u7f6e\u8fdb\u884c\u8d44\u6e90\u8def\u5f84\u7684\u62fc\u63a5\uff0c\u5982\u679c\u4f60\u539f\u6765\u672c\u6765\u5c31\u6709\u4e00\u4e2a\u51fd\u6570\u4e13\u95e8\u7528\u4e8e\u7ec4\u88c5\u8def\u5f84\u7684\uff0c\u90a3\u4f60\u53ea\u9700\u8981\u4fee\u6539\u8fd9\u4e00\u4e2a\u5730\u65b9\u5c31\u597d\u4e86\uff0c\u5982\u679c\u4f60\u4e4b\u524d\u5e76\u6ca1\u6709\u8fd9\u6837\u7684\u8bbe\u8ba1\uff0c\u90a3\u53ef\u80fd\u9700\u8981\u4fee\u6539\u5927\u91cf\u6d89\u53ca\u5230\u8d44\u6e90\u8def\u5f84\u7684\u5730\u65b9\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5","title":"5\u3001\u8c03\u8bd5\u548c\u7f16\u5199\u7528\u4f8b","text":"\u4ee5\u4e0a\u51e0\u4e2a\u6b65\u9aa4\u505a\u5b8c\uff0c\u57fa\u672c\u5c31\u53ef\u4ee5\u8fdb\u884c\u7528\u4f8b\u4ee3\u7801\u7684\u8c03\u8bd5\u4e86\uff0c\u8fd9\u90e8\u5206\u5de5\u4f5c\u4e3b\u8981\u89e3\u51b3\u4f60\u4e4b\u524d\u51e0\u4e2a\u6b65\u9aa4\u9057\u6f0f\u7684\u95ee\u9898\uff0c\u5982\u679c\u6240\u6709\u7528\u4f8b\u90fd\u8c03\u8bd5\u901a\u8fc7\u4e86\uff0c\u90a3\u4e48\u5de5\u7a0b\u6539\u9020\u5c31\u5168\u90e8\u5b8c\u6210\u4e86\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/","title":"AT \u5f00\u53d1\u89c4\u8303","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u5f00\u53d1\u89c4\u8303\u662f\u6839\u636e\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fd0\u884c\u4e24\u5e74\u591a\u6765\uff0c\u9047\u5230\u95ee\u9898\u89e3\u51b3\u95ee\u9898\u800c\u5f62\u6210\u7684\u4e00\u4e9b\u89e3\u51b3\u65b9\u6848\uff0c\u6216\u8005\u8bf4\u7ecf\u9a8c\u603b\u7ed3\uff1b\u8fd9\u4e9b\u7ecf\u9a8c\u7b26\u5408\u6211\u4eec\u73b0\u9636\u6bb5 AT \u6240\u5e94\u7528\u7684\u573a\u666f\u9700\u8981\uff0c\u4e5f\u662f\u6211\u4eec\u7ecf\u8fc7\u957f\u671f\u601d\u8003\uff0c\u4e0d\u65ad\u8bd5\u9519\u4e0d\u65ad\u4fee\u6b63\uff0c\u5e76\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u5b9e\u8df5\u4e2d\u68c0\u9a8c\u8fc7\u53ef\u884c\u7684\u3002\u4ee5\u6b64\uff0c\u5e0c\u671b\u80fd\u5e2e\u52a9\u53c2\u4e0e\u5230\u81ea\u52a8\u5316\u7684\u76f8\u5173\u4eba\u5458\u51cf\u5c11\u8bd5\u9519\u6210\u672c\uff0c\u66f4\u597d\u3001\u66f4\u5feb\u7684\u7f16\u5199\u7528\u4f8b\u53ca\u7ef4\u62a4\u7528\u4f8b\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_1","title":"\u4e00\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u89c4\u8303","text":"\u6807\u7b7e\u5316\u7ba1\u7406\u6587\u6863\u8bf7\u53c2\u8003\uff1a \u300a\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u64cd\u4f5c\u6307\u5f15\u300b \u4ee5\u4e0b\u8bf4\u51e0\u4e2a\u5bb9\u6613\u51fa\u73b0\u7684\u95ee\u9898\uff1a"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1","title":"1. \u5bf9\u5e94\u5173\u7cfb","text":" \u5199\u5b8c\u81ea\u52a8\u5316\u7528\u4f8b\u4e4b\u540e\uff0c\u8bf7\u5728 CSV \u6587\u4ef6\u4e2d\u6807\u8bb0\u7528\u4f8b\u7684 ID\u3001\u7b49\u7ea7\u3002\u4e3a\u4e86\u63d0\u9192\u6807\u8bb0\uff0c\u6267\u884c\u7528\u4f8b\u65f6\u5728\u9996\u884c\u4f1a\u8f93\u51fa ERROR \u65e5\u5fd7\uff1a CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94\u7684 ID\uff1b \u5728\u6700\u7ec8\u63d0\u4ea4\u4ee3\u7801\u4e4b\u524d\uff0c\u4f60\u9700\u8981\u5728 CSV \u6587\u4ef6\u91cc\u9762\u5c06ID\u3001\u7528\u4f8b\u7b49\u7ea7\u7b49\u6807\u7b7e\u8865\u5168\uff0c\u5982\u679c CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94 ID\uff0c\u540e\u7eed\u5728\u6279\u91cf\u6267\u884c\u7684\u65f6\u5019\uff0c\u8fd9\u4e9b\u7528\u4f8b\u662f\u4e0d\u4f1a\u6267\u884c\u7684\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2","title":"2. \u540d\u79f0\u4e00\u81f4","text":" CSV \u6587\u4ef6\u7684\u6587\u4ef6\u540d\u3001\u7528\u4f8b\u51fd\u6570\u4e2d\u95f4\u7684\u540d\u79f0\u4e00\u81f4\u3001\u7528\u4f8b py \u6587\u4ef6\u4e2d\u95f4\u7684\u540d\u79f0\uff0c\u8fd9\u4e09\u4e2a\u540d\u79f0\u4e00\u81f4\u3002 \u4e3e\u4f8b\uff1a # test_music_001.py\ndef test_music_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u90a3\u4e48 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e3a music.csv\u3002 AT \u6846\u67b6\u5e95\u5c42\u4ee3\u7801\u5b9e\u73b0\u662f\u5c06 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e0e\u7528\u4f8b\u51fd\u6570\u540d\u79f0\u540d\u79f0\uff08item.name\uff09\u8fdb\u884c\u5bf9\u5e94\uff0c\u56e0\u6b64\uff0c\u6ce8\u610f CSV \u6587\u4ef6\u540d\u79f0\u5bf9\u5e94\u7684\u662f\u7528\u4f8b\u51fd\u6570\u540d\u79f0\uff0c\u5373 def test_music_001 \u91cc\u9762\u7684 music \uff0c\u800c\u4e0d\u662f test_music_001.py \u91cc\u9762\u7684 music \u3002 \u8fd9\u91cc\u7ec6\u7ec6\u54c1\u4e00\u4e0b\u54c8~ \u5982\u679c\u4f60\u5c06\u4e0a\u4f8b\u5199\u6210\u4e86\u8fd9\u6837: # test_music_001.py\ndef test_movie_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u7528\u4f8b\u6267\u884c\u6ca1\u95ee\u9898\uff0c\u4f46\u662f\u6807\u7b7e\u5316\u7ba1\u7406\u662f\u4e0d\u751f\u6548\u7684\uff0c\u6846\u67b6\u65e0\u6cd5\u5c06 music.csv\u6587\u4ef6\u91cc\u9762\u6807\u7b7e\uff0c\u6dfb\u52a0\u5230 test_movie_001\u8fd9\u4e2a\u7528\u4f8b\u4e2d\uff0c\u56e0\u4e3a\u4ed6\u4eec\u6ca1\u6709\u5bf9\u5e94\u5173\u7cfb\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#tag","title":"\u4e8c\u3001\u5206\u652f\u53ca tag \u7ba1\u7406\u89c4\u8303","text":"\u53c2\u8003\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u4ee3\u7801\u7ba1\u7406\u89c4\u8303\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2-tag","title":"2. \u5e94\u7528\u5e93 tag","text":" \u5e94\u7528\u5e93 tag \u6839\u636e\u5e94\u7528\u4ea4\u4ed8\u8282\u70b9\u751f\u6210\uff0c\u6bcf\u6b21\u6253 tag \u4e4b\u524d\uff0c\u76f8\u5173\u6d4b\u8bd5\u4eba\u5458\u9700\u8981\u8fdb\u884c\u7528\u4f8b\u8c03\u8bd5\uff1b \u8c03\u8bd5\u7528\u4f8b\u662f\u6307\u7684\u5728\u5168\u67b6\u6784\uff08x86\u3001arm\u3001mips\uff09\u4e0a\u8c03\u8bd5\u901a\u8fc7\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\u8fbe\u5230 90% \u4ee5\u4e0a\u624d\u80fd\u6253 tag\uff0c\u901a\u8fc7 Jenkins \u6267\u884c\u5668\u6267\u884c\u7528\u4f8b\uff0c\u4fdd\u7559\u901a\u8fc7\u7387\u7ed3\u679c\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\uff1a\u901a\u8fc7\u7528\u4f8b\u6570 / (\u603b\u7528\u4f8b\u6570 - \u5df2\u5e9f\u5f03\u7528\u4f8b) \u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u7b97\u901a\u8fc7 Jenkins \u6267\u884c\u5668 \u4f60\u53ef\u80fd\u4f1a\u5728\u4e00\u4e2a\u4ea4\u4ed8\u5468\u671f\u5185\u6301\u7eed\u7684\u8fdb\u884cAT\u7528\u4f8b\u8c03\u8bd5\uff0c\u4f46\u662f\u6700\u7ec8 AT \u7528\u4f8b\u6253 tag \u7684\u5e94\u7528\u7248\u672c\uff0c\u9700\u8981\u4f7f\u7528\u5e94\u7528\u96c6\u6210\u4ea4\u4ed8\u7684\u6700\u65b0\u5e94\u7528\u7248\u672c\uff0c\u53ef\u4ee5\u4f7f\u7528\u5e94\u7528\u7684\u63d0\u6d4b\u7248\u672c\uff1b\u4e00\u5b9a\u8981\u786e\u4fdd\u8c03\u8bd5\u7528\u4f8b\u7684\u5e94\u7528\u7248\u672c\u662f\u6700\u65b0\u7684\uff0c\u4e0d\u7136\u96c6\u6210\u8fdb\u53bb\u4e4b\u540e\uff0c\u6301\u7eed\u96c6\u6210\u5c31\u4f1a\u51fa\u95ee\u9898\uff1b tag \u53f7\u600e\u4e48\u6253\uff1f \u6839\u636e\u6301\u7eed\u96c6\u6210\u7684\u8981\u6c42\u751f\u6210\uff0c\u5176\u4e2d\u5e94\u7528\u7248\u672c\u53f7\u9700\u8981\u4e0e\u9879\u76ee\u7ecf\u7406\u786e\u8ba4\u672c\u6b21\u5373\u5c06\u96c6\u6210\u7684\u5e94\u7528\u7248\u672c\u53f7\u662f\u591a\u5c11\uff1b tag \u7684 commit \u4fe1\u606f\u683c\u5f0f\uff1a # commit msg\nversion:5.6.5\n \u5176\u4e2d 5.6.5 \u5199\u5e94\u7528\u7684\u96c6\u6210\u7248\u672c\u53f7\u3002 \u751f\u6210 tag \u7684\u547d\u4ee4\u53c2\u8003\uff1a\u300aGit \u6807\u7b7e\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3-tag","title":"3. \u57fa\u7840\u6846\u67b6 tag","text":"\u57fa\u7840\u6846\u67b6 tag \u4e0d\u4e0e\u4e1a\u52a1\u6302\u94a9\uff0c\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u6309\u9700\u53d1\u5e03\u7248\u672c\uff0c\u5728\u6839\u76ee\u5f55\u4e0b CURRENT \u6587\u4ef6\u4e2d\u8bb0\u5f55\u7684\u5f53\u524d\u7248\u672c\u53f7\u548c\u5386\u53f2\u7248\u672c\u53f7\uff0c\u53ca\u5176\u5bf9\u5e94\u65b0\u589e\u4e86\u54ea\u4e9b\u529f\u80fd\uff0c\u6709\u52a9\u4e8e\u5e94\u7528\u9009\u62e9\u5408\u9002\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\u3002 # CURRENT\n[current]\ntag = 0.9.5\n \u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u7684 control \u6587\u4ef6\u8bb0\u5f55\u5f53\u524d\u5e94\u7528\u5e93\u4f9d\u8d56\u7684\u57fa\u7840\u5e93\u7248\u672c\u3002 # control\n[Depends]\nautotest-basic-frame = 0.9.5\n \u7528\u4f8b\u5728\u6267\u884c\u65f6\u4f1a\u6821\u9a8c\u4e24\u4e2a\u6587\u4ef6\u7684\u7248\u672c\u53f7\u662f\u5426\u4e00\u81f4\uff0c\u5982\u679c\u4e0d\u4e00\u81f4\uff0c\u4f1a\u6253\u5370 error \u65e5\u5fd7\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_2","title":"\u4e09\u3001\u4ed3\u5e93\u6743\u9650\u7ba1\u7406","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_1","title":"1. \u57fa\u7840\u6846\u67b6","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u4ed3\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame \u57fa\u7840\u6846\u67b6\u4e0d\u5141\u8bb8\u533f\u540d\u8bbf\u95ee\uff0c\u5982\u679c\u4f60\u767b\u5f55 gerrit \u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u8bbf\u95ee\u4ee5\u4e0a\u94fe\u63a5\uff0c\u5219\u9700\u8981\u7533\u8bf7\u8bbf\u95ee\u6743\u9650\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_1","title":"2. \u5e94\u7528\u4ed3\u5e93","text":" \u81ea\u52a8\u5316\u5e94\u7528\u4ed3\u5e93\uff1a https://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684 app_name \u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_3","title":"\u56db\u3001\u65b9\u6cd5\u7f16\u5199&\u8c03\u7528\u89c4\u8303","text":"\u65b9\u6cd5\u7f16\u5199\u6574\u4f53\u8bbe\u8ba1\u601d\u8def\u53c2\u8003\uff1a[\u300aAT\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b]"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_2","title":"1. \u65b9\u6cd5\u7f16\u5199","text":"\u5199\u65b9\u6cd5\u7684\u65f6\u5019\u6ce8\u610f\u65b9\u6cd5\u5f52\u5c5e\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget\uff0c\u65b9\u6cd5\u662f\u5728\u54ea\u4e2a\u533a\u57df\u64cd\u4f5c\u7684\uff0c\u5c31\u5199\u5728\u54ea\u4e2a\u7c7b\u91cc\u9762\u3002 \u4e3e\u4f8b\uff1a from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n\"\"\"\u70b9\u51fb\u6807\u9898\u680fxxx\"\"\"\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_2","title":"2. \u65b9\u6cd5\u8c03\u7528","text":" \u5728\u7528\u4f8b\u4e2d\u8c03\u7528\u65b9\u6cd5\uff0c\u901a\u8fc7\u8be5\u5e94\u7528\u552f\u4e00\u7684\u51fa\u53e3\u8fdb\u884c\u8c03\u7528\uff0c\u6bd4\u5982\u6587\u7ba1\uff1a class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n \u4e0d\u8981\u5728\u7528\u4f8b\u4e2d\u5355\u72ec\u53bb\u8c03\u7528 TitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u8fd9\u4e9b\u7c7b\uff0c\u5426\u5219\u540e\u671f\u7528\u4f8b\u4f1a\u53d8\u5f97\u4e0d\u597d\u7ef4\u62a4\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_4","title":"\u4e94\u3001\u7528\u4f8b\u7f16\u5199\u89c4\u8303","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_3","title":"1. \u57fa\u4e8e\u7c7b\u5199\u7528\u4f8b","text":"\u6240\u6709\u7528\u4f8b\u90fd\u5e94\u8be5\u57fa\u4e8e\u7c7b\u53bb\u5199\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001(self):\n\"\"\"\u97f3\u4e50\u542f\u52a8\"\"\"\n \u6ce8\u610f\u4ee5\u4e0b\u51e0\u70b9\uff1a \u7c7b\u540d\u4e0d\u8981\u968f\u4fbf\u53d6\uff0c\u540c\u4e00\u4e2a\u5e94\u7528\u5e94\u8be5\u4f7f\u7528\u540c\u4e00\u4e2a\u7c7b\u540d\uff0c\u7528\u4f8b\u7c7b\u540d\u79f0\u5fc5\u987b\u4ee5 Test \u5f00\u5934\uff0c\u9075\u5faa\u5927\u9a7c\u5cf0\u547d\u540d\u89c4\u8303\uff1b \u7528\u4f8b\u7c7b\u7ee7\u627f BaseCase\uff0c\u4e00\u4e2a\u5e94\u7528\u53ea\u6709\u4e00\u4e2a BaseCase \u4e00\u4e2a py \u6587\u4ef6\u91cc\u9762\u53ea\u6709\u4e00\u4e2a\u7c7b\uff0c\u6211\u4eec\u79f0\u4e3a\u4e00\u4e2a\u6d4b\u8bd5\u7c7b\uff1b \u4e00\u4e2a\u7c7b\u91cc\u9762\u53ef\u4ee5\u6709\u591a\u4e2a\u7528\u4f8b\u51fd\u6570\uff0c\u8fd9\u53d6\u51b3\u8fd9\u6761\u7528\u4f8b\u6709\u591a\u5c11\u4e2a\u6d4b\u8bd5\u70b9\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001_1(self):\n\"\"\"\u4efb\u52a1\u680f\u542f\u52a8\u97f3\u4e50\"\"\"\ndef test_music_001_2(self):\n\"\"\"\u542f\u52a8\u5668\u542f\u52a8\u97f3\u4e50\"\"\" \ndef test_music_001_3(self):\n\"\"\"\u684c\u9762\u542f\u52a8\u97f3\u4e50\"\"\"\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_3","title":"2. \u7528\u4f8b\u51fd\u6570\u89c4\u8303","text":" \u7528\u4f8b\u51fd\u6570\u4ee5 test \u5f00\u5934\uff0c\u9075\u5faa\u86c7\u5f62\u547d\u540d\u89c4\u8303\uff0c\u4e2d\u95f4\u4e3a\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0\uff0c\u540e\u9762\u52a0\u7528\u4f8b ID\uff0c\u6700\u540e\u52a0\u6d4b\u8bd5\u70b9\u5e8f\u53f7\uff0c\u5373 test_${module}_${case_id}[_${index}] \uff1b \u6bd4\u5982\uff1atest_music_001_1\uff0cindex \u4ece 1 \u5f00\u59cb\u3002 \u51fd\u6570\u529f\u80fd\u8bf4\u660e\u91cc\u9762\u5199\u7528\u4f8b\u6807\u9898\uff0c\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u6807\u9898\u5373\u53ef\uff0c\u6ce8\u610f\u7528\u4e09\u5bf9\u53cc\u5f15\u53f7\uff0c\u4e0d\u8981\u7528\u5176\u4ed6\u6ce8\u91ca\uff0c\u66f4\u4e0d\u8981\u7528\u4e95\u53f7\u6ce8\u91ca\u5199\u7528\u4f8b\u6807\u9898\uff1b \u76f4\u63a5\u590d\u5236 PMS \u7528\u4f8b \u7528\u4f8b\u6b65\u9aa4\u76f4\u63a5\u5c06 PMS \u4e0a\u7528\u4f8b\u6b65\u9aa4\u548c\u9884\u671f\u590d\u5236\u8fdb\u6765\uff0c\u7136\u540e\u8fdb\u884c\u6279\u91cf\u6ce8\u91ca\uff08ctrl + /\uff09\uff0c\u5728\u6ce8\u91ca\u7684\u57fa\u7840\u4e0a\u53bb\u5199\u7528\u4f8b\u811a\u672c\u4f1a\u66f4\u52a0\u65b9\u4fbf\u5168\u9762\uff0c\u4e5f\u6bd4\u4f60\u81ea\u5df1\u5199\u6ce8\u91ca\u66f4\u8282\u7ea6\u65f6\u95f4\uff1a \u4e3e\u4f8b\uff0cPMS \u7528\u4f8b\uff1a \u76f4\u63a5\u9009\u4e2d\u7528\u4f8b\u5185\u5bb9\uff0c\u590d\u5236\u4e0b\u6765\uff0c\u7136\u540e\u7c98\u8d34\u5230\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c\u4e2d\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\n \u4e0a\u4f8b\u4e2d\u4e95\u53f7\u6ce8\u91ca\u90e8\u5206\u5c31\u662f\u76f4\u63a5\u4ece PMS \u4e0a\u590d\u5236\u8fc7\u6765\u7684\uff0c\u5728\u6b64\u57fa\u7840\u4e0a\u5199\u7528\u4f8b\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\nmusic = DeepinMusicWidget()\nmusic.click_singer_btn_in_music_by_ui()\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\nmusic.click_icon_mode_in_music_by_ui()\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\nmusic.double_click_first_singer_in_singer_icon_view_by_ui()\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\nself.assert_xxx\n \u4f60\u770b\uff0c\u975e\u5e38\u6e05\u695a\u6bcf\u4e00\u6b65\u5728\u505a\u4ec0\u4e48\uff0c\u91cd\u70b9\u662f\u7701\u53bb\u4e86\u5199\u6ce8\u91ca\u7684\u65f6\u95f4\uff0c\u771f\u7684\u7092\u9e21\u65b9\u4fbf\u3002 \u4e0d\u5199 if __name__ == '__main__':\uff0c\u4e0d\u5199\u591a\u4f59\u7684\u4ee3\u7801\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3","title":"3. \u6570\u636e\u9a71\u52a8","text":" \u5982\u679c\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u662f\u76f8\u540c\u7684\uff0c\u53ea\u662f\u4e00\u4e9b\u53c2\u6570\u53d8\u5316\uff0c\u5c3d\u91cf\u4f7f\u7528\u6570\u636e\u9a71\u52a8\u6765\u5b9e\u73b0\u7528\u4f8b\uff1b \u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u6570\u636e\u9a71\u52a8\u7684\u6570\u636e\uff0c\u4e0d\u80fd\u56e0\u6b64\u5f15\u5165\u4f9d\u8d56\uff0c\u5c3d\u91cf\u4f7f\u7528\u4e00\u4e9b\u6807\u51c6\u5e93\u80fd\u8bfb\u53d6\u7684\u6587\u4ef6\u683c\u5f0f\uff0c\u6bd4\u5982 json\u3001ini\u3001CSV\u3001xml\u3001txt \u7b49\u6587\u4ef6\u683c\u5f0f\uff1b\u4e0d\u5efa\u8bae\u4f7f\u7528 Yaml\u3001Excel\u3001MySQL \u7b49\u6570\u636e\u683c\u5f0f\uff1b \u8bfb\u53d6\u6570\u636e\u65f6\u4e5f\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff0c\u5982\u4f7f\u7528 pandas \u5904\u7406 CSV \u5c31\u5c5e\u4e8e\u5927\u6750\u5c0f\u7528\u4e86\uff0c\u6b63\u5e38\u7684\u6570\u636e\u9a71\u52a8\u8fd8\u6ca1\u5230\u9700\u8981\u5927\u6570\u636e\u5206\u6790\u6765\u5904\u7406\u7684\u5730\u6b65\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u5728 widget/ddt/ \u76ee\u5f55\u4e0b\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5199\u6cd5\uff1a @pytest.mark.parametrize(\"value\", data)\ndef test_smb_049(self, value):\n \u4ee5\u4e0a\u8fd9\u79cd\u53c2\u6570\u5316\u7684\u5199\u6cd5\u672c\u8eab\u6ca1\u4ec0\u4e48\u95ee\u9898\uff0c\u4f46\u662f\uff0c\u8fd9\u91cc\u5fc5\u987b\u8981\u8865\u5145\u4e00\u4e2a\u6ca1\u6709\u7528\u7684\u5c0f\u77e5\u8bc6\uff1a \u5982\u679c\u53c2\u6570\u5316\u6570\u636e\u91cc\u9762\u7684\u5b57\u7b26\u4f1a\u539f\u5c01\u4e0d\u52a8\u7684\u8f93\u51fa\u5230 item.name \u91cc\u9762\uff0c\u663e\u793a\u975e\u5e38\u4e0d\u4f18\u96c5\uff0c\u800c\u4e14\u53ef\u4ee5\u4f1a\u5f15\u5165\u4e00\u4e9b\u610f\u60f3\u4e0d\u5230\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u611f\u53d7\u4e00\u4e0b\uff1a \u53c2\u6570\uff1a data = [\n\"\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\", \"qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678\",\n]\n \u73b0\u8c61\u662f\u8fd9\u6837\u8272\u513f\u7684\uff1a test_smb_049.py::TestFileManager::test_smb_049[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09]\ntest_smb_049.py::TestFileManager::test_smb_049[qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui]\ntest_smb_049.py::TestFileManager::test_smb_049[12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678]\n \u8bf4\u5b9e\u8bdd\uff0c\u770b\u7740\u5fc3\u91cc\u5835\u5f97\u614c\uff0c\u5982\u679c\u8fd9\u91cc\u9762\u5305\u542b\u4e00\u4e9b\u7279\u6b8a\u5b57\u7b26\u6216\u8005\u662f\u8d85\u957f\uff0c\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u5f88\u5947\u5999\u7684\u4e8b\u60c5\u53d1\u751f\u3002 parametrize \u91cc\u9762\u6709\u4e2a\u53c2\u6570\uff1aids\uff0c\u53ef\u4ee5\u89e3\u51b3\u6b64\u7c7b\u95ee\u9898\uff0c\u5c31\u50cf\u8fd9\u6837\uff1a @pytest.mark.parametrize(\"value\", data, ids=[1, 2, 3])\ndef test_smb_049(self, value):\n \u518d\u6765\u611f\u53d7\u4e00\u4e0b\uff1a test_smb_049.py::TestFileManager::test_smb_049[1]\ntest_smb_049.py::TestFileManager::test_smb_049[2]\ntest_smb_049.py::TestFileManager::test_smb_049[3]\n \u660e\u663e\u597d\u591a\u4e86\uff0c\u6240\u4ee5\u5c3d\u91cf\u4f7f\u7528 ids \u8fd9\u4e2a\u53c2\u6570\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 fixture \u7684\u6570\u636e\u9a71\u52a8\u65b9\u5f0f\uff0c\u6846\u67b6\u867d\u7136\u652f\u6301\uff0c\u4f46\u53ef\u8bfb\u6027\u6bd4\u8f83\u5dee\uff1b\u5982\u679c\u4f60\u4e0d\u77e5\u9053\u8fd9\u53e5\u8bdd\u5728\u8bf4\u5565\uff0c\u90a3\u4f60\u53ef\u4ee5\u5ffd\u7565\uff0c\u6211\u4e5f\u4e0d\u6253\u7b97\u8be6\u7ec6\u8bf4\u8fd9\u79cd\u5b9e\u73b0\u65b9\u5f0f\uff0c\u64cd\u4f5c\u6bd4\u8f83\u9a9a\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4","title":"4. \u65ad\u8a00\u8d44\u6e90","text":" \u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u76f4\u63a5\u653e\u5728\u7528\u4f8b\u6a21\u5757\u7684\u540c\u7ea7\u76ee\u5f55\u4e0b\u7684 assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0 + \u7528\u4f8b ID \u547d\u540d\uff1b \u56fe\u50cf\u8bc6\u522b\u65ad\u8a00\uff0c\u4e0d\u8981\u622a\u53d6\u4e00\u5f20\u5f88\u5927\u7684\u56fe\uff0c\u56fe\u7247\u8d44\u6e90\u5305\u542b\u7684\u5143\u7d20\u592a\u591a\u4e86\uff0c\u975e\u5e38\u5bb9\u6613\u53d7\u5230\u9700\u6c42\u5f71\u54cd\uff0c\u5efa\u8bae\u662f\u8fdb\u884c\u5c40\u90e8\u7684\u65ad\u8a00\uff1b \u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u5339\u914d\u5ea6\u662f 0.9\uff0c\u5982\u679c\u65ad\u8a00\u7684\u573a\u666f\u5bf9\u4e8e\u7cbe\u786e\u5ea6\u8981\u6c42\u6ca1\u90a3\u4e48\u9ad8\uff0c\u53ef\u4ee5\u5728\u65ad\u8a00\u8bed\u53e5\u91cc\u9762\u4f20\u5165\u5c0f\u4e8e 0.9 \u7684\u53c2\u6570\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5","title":"5. \u5143\u7d20\u5b9a\u4f4d","text":" \u7528\u4e8e\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u4e2d\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u547d\u540d\u4e3a\u8be5\u5143\u7d20\u7684\u540d\u79f0\uff1b \u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u622a\u53d6\u65f6\u5c3d\u91cf\u7cbe\u786e\u5230\u8fd9\u4e2a\u5177\u4f53\u7684\u6309\u94ae\uff0c\u56fe\u7247\u4e5f\u4e0d\u8981\u592a\u5927\uff1b \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u64cd\u4f5c\u8f83\u5feb\uff0c\u5408\u7406\u52a0\u5165\u7b49\u5f85\u65f6\u95f4\u80fd\u63d0\u9ad8\u7528\u4f8b\u7684\u7a33\u5b9a\u6027\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6","title":"6. \u7528\u4f8b\u8d44\u6e90","text":" \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u4f7f\u7528\u5230\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u6bd4\u5982\u97f3\u4e50\u53ef\u80fd\u9700\u8981\u4e00\u4e9b mp3 \u7684\u8d44\u6e90\u7528\u4e8e\u6d4b\u8bd5\uff0c\u5b58\u653e\u5728 widget/case_res \u76ee\u5f55\u4e0b\uff0c\u524d\u63d0\u662f\u8fd9\u4e9b\u8d44\u6e90\u4e0d\u8d85\u8fc7 10M\uff1b \u5982\u679c\u662f\u4e00\u4e9b\u6bd4\u8f83\u5927\u7684\u8d44\u6e90\uff0c\u5efa\u8bae\u653e\u5230\u7edf\u4e00\u7684 ftp \u670d\u52a1\u5668 \uff08ftp://10.8.10.245\uff09\uff0c\u9700\u8981\u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\u518d\u4e0b\u8f7d\u4e0b\u6765\uff1b f\"wget ftp://{Config.FTP_IP}/uploads/\u591a\u5a92\u4f53/\u5f71\u9662/auto/{file_name};unzip {file_name};rm -rf {file_name};\"\n \u6d4b\u8bd5\u8d44\u6e90\u4e0b\u8f7d\u5230\u5e94\u7528 widget/case_res \u76ee\u5f55\u4e0b\uff1b \u7981\u6b62\u5c06\u6d4b\u8bd5\u8d44\u6e90\u5b58\u653e\u5728\u4e2a\u4eba\u7684\u673a\u5668\u4e0a\uff1b \u5e94\u8be5\u5c3d\u91cf\u4fdd\u8bc1\uff0c\u4e00\u4e2a\u8d44\u6e90\u5728\u4e00\u6b21\u7528\u4f8b\u6267\u884c\u4e2d\u53ea\u9700\u8981\u4e0b\u8f7d\u4e00\u6b21\uff0c\u6240\u4ee5\u4f60\u4e0d\u80fd\u6bcf\u6b21\u4f7f\u7528\u7684\u65f6\u5019\u90fd\u53bb\u4e0b\u8f7d\uff0c\u8fd9\u6837\u53ef\u80fd\u4f1a\u8017\u8d39\u5927\u91cf\u7684\u7f51\u7edc\u8d44\u6e90\uff0c\u800c\u56e0\u4e3a\u5148\u5224\u65ad\u672c\u5730\u662f\u5426\u5b58\u5728\u6b64\u8d44\u6e90\uff0c\u5982\u679c\u4e0d\u5b58\u5728\u518d\u53bb\u4e0b\u8f7d\uff1b \u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u5c06\u8d44\u6e90\u62f7\u8d1d\u5230\u5bf9\u5e94\u7684\u6d4b\u8bd5\u76ee\u5f55\u4e0b\uff0c\u6bd4\u5982\u5c06 mp3 \u6587\u4ef6\u62f7\u8d1d\u5230 ~/Music \u76ee\u5f55\u4e0b\uff0c\u4f46\u662f\u6211\u4eec\u66f4\u5efa\u8bae\u4f60\u4f7f\u7528\u53d1\u9001\u5feb\u6377\u94fe\u63a5\u7684\u65b9\u5f0f\u66ff\u4ee3\u62f7\u8d1d\u7684\u64cd\u4f5c\uff0c\u56e0\u4e3a\u5728\u62f7\u8d1d\u5927\u6587\u4ef6\u65f6\u662f\u5f88\u6d88\u8017\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u800c\u521b\u5efa\u94fe\u63a5\u5219\u4e0d\u4f1a\uff1b @classmethod\ndef recovery_many_movies_in_movie_by_cmd(cls):\n\"\"\"\u6062\u590d\u591a\u4e2a\u89c6\u9891\u6587\u4ef6\u81f3\u89c6\u9891\u76ee\u5f55\u4e2d\"\"\"\nwork_path = f\"/home/{Config.USERNAME}/Videos/auto\"\ncode_path = f\"{Config.CASE_RES_PATH}/auto\"\ncls.run_cmd(f\"rm -rf {work_path};mkdir {work_path}\")\nsleep(1)\nflag = False\nif not exists(code_path):\ncls.run_cmd(f\"mkdir -p {code_path}\")\nflag = True\nlogger.info(f\"ln -s {code_path}/* {work_path}/\")\ncls.run_cmd(\nf\"cd {code_path}/;\"\nf\"{cls.wget_file('auto.zip') if flag else ''}\"\nf\"ln -s {code_path}/* {work_path}/ > /dev/null 2>&1\"\n)\n \u8d44\u6e90\u4e0b\u8f7d\u8fc7\u7a0b\u4e2d\u6ce8\u610f\u8d85\u65f6\u7684\u95ee\u9898\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u5f88\u5927\uff0c\u8981\u7279\u522b\u6ce8\u610f\u8fd9\u95ee\u9898\uff0c\u5982\u679c\u4f60\u4f7f\u7528\u5f3a\u5236\u7b49\u5f85\u4e0b\u8f7d\u7ed3\u675f( os.system )\uff0c\u53ef\u80fd\u4f1a\u9020\u6210\u7528\u4f8b\u6267\u884c\u65f6\u957f\u53d8\u5f97\u4e0d\u53ef\u63a5\u53d7\uff0c\u76ee\u524d\u6211\u4eec\u53d1\u73b0\u5728\u6301\u7eed\u96c6\u6210\u73af\u5883\u6267\u884c\u65f6\u7f51\u7edc\u4e0b\u8f7d\u901f\u5ea6\u5f88\u6162\uff0c\u6240\u4ee5\u8d85\u65f6\u673a\u5236\u662f\u5f88\u6709\u5fc5\u8981\u7684\uff1brun_cmd \u65b9\u6cd5\u6709\u4e00\u4e2a\u9ed8\u8ba4\u8d85\u65f6\u7684\u65f6\u95f4\uff0c\u4f60\u53ef\u4ee5\u6839\u636e\u8d44\u6e90\u5927\u5c0f\u5bf9\u8d85\u65f6\u65f6\u95f4\u8fdb\u884c\u8c03\u6574\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_5","title":"\u516d\u3001\u7528\u4f8b\u8c03\u8bd5\u6280\u5de7","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_4","title":"1. \u65e5\u5fd7","text":" \u4e00\u5b9a\u8981\u5148\u770b\u62a5\u9519\uff0c\u770b error \u65e5\u5fd7\uff0c\u901a\u5e38\u80fd\u660e\u786e\u7684\u544a\u8bc9\u4f60\u5177\u4f53\u54ea\u91cc\u4ee3\u7801\u62a5\u9519\uff1b \u7ed3\u5408\u62a5\u9519\u70b9\u524d\u9762\u7684error\u3001 info \u548c debug \u65e5\u5fd7\u770b\u5426\u662f\u6b63\u5e38\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_4","title":"2. \u65ad\u70b9\u8c03\u8bd5","text":" \u65b9\u6cd5\u62a5\u9519\uff1a \u5728\u65b9\u6cd5\u5e93\u4e2d\u627e\u5230\u5bf9\u5e94\u7684\u65b9\u6cd5\uff0c\u5355\u72ec\u8c03\u7528\uff0c\u770b\u662f\u5426\u80fd\u6b63\u5e38\u6267\u884c\uff1b \u901a\u5e38\u5355\u4e2a\u65b9\u6cd5\u7684\u6267\u884c\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u62a5\u9519\uff0c\u5f88\u5feb\u5c31\u80fd\u6392\u67e5\u51fa\u95ee\u9898\uff1b\u5728\u65b9\u6cd5\u5185\u90e8\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u65b9\u6cd5\u5185\u90e8\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u8c03\u7528\u6ca1\u95ee\u9898\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u62a5\u9519\u7684\u65b9\u6cd5\u524d\u9762\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u7528\u4f8b\u7684\u4e1a\u52a1\u903b\u8f91\u548c\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u65ad\u8a00\u62a5\u9519\uff1a \u65ad\u8a00\u4e3a\u6570\u636e\u65ad\u8a00\uff0c\u6839\u636e\u8868\u8fbe\u5f0f\u8fdb\u884c\u65ad\u8a00\u8bed\u53e5\u8fdb\u884c\u4fee\u6539\uff1b \u6587\u4ef6\u751f\u6210\u7c7b\u65ad\u8a00\uff0c\u67e5\u770b\u662f\u5426\u9700\u8981\u52a0\u7b49\u5f85\u65f6\u95f4\uff1b \u56fe\u50cf\u65ad\u8a00\uff0c\u5728\u65ad\u8a00\u8bed\u53e5\u5904\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u7528\u4f8b\u8fd0\u884c\u5230\u65ad\u8a00\u5904\u4f1a\u505c\u6b62\uff0c\u67e5\u770b\u6b64\u65f6\u65ad\u8a00\u7684\u56fe\u7247\u4e0e\u7528\u4f8b\u6267\u884c\u7684\u73b0\u573a\u5b58\u5728\u4ec0\u4e48\u5dee\u5f02\uff0c\u6b64\u65f6\u4e5f\u53ef\u4ee5\u8fdb\u884c\u91cd\u65b0\u622a\u56fe\uff0c\u4ece\u800c\u66ff\u6362\u65b0\u7684\u56fe\u7247\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3_1","title":"3. \u8fdc\u7a0b\u6267\u884c","text":" \u8fdc\u7a0b\u6267\u884c\u6307\u7684\u662f\u7f16\u8f91\u5668\u901a\u8fc7\u6307\u5b9a\u8fdc\u7a0b\u89e3\u91ca\u5668\u6267\u884c\u81ea\u52a8\u5316\u4ee3\u7801\uff1b \u8fdc\u7a0b\u6267\u884c\u7684\u597d\u5904\u662f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u7684 Debug \u8fd0\u884c\uff0c\u4e0d\u7528\u5728\u6d4b\u8bd5\u673a\u4e0a\u6253\u5f00\u7f16\u8f91\u5668\uff0c\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u66f4\u5feb\uff1b \u652f\u6301\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u7684\u7f16\u8f91\u5668\uff1a \u4e13\u4e1a\u7248 Pycharm VScode \uff0c\u9700\u8981\u4f7f\u7528\u63d2\u4ef6 Remote-SSH \u8fdc\u7a0b\u6267\u884c\u914d\u7f6e \u4ee5 Pycharm \u4e3a\u4f8b\uff1a File \u2014> Settings \u2014> Project \u2014> Python Interpreter \u2014> \u53f3\u8fb9\u8bbe\u7f6e\u6309\u94ae \u2014> Add... \u2014> SSH Interpreter \u2014> New server configuration(\u586b\u5165host\u548cusername) \u2014> Next \u2014> password\uff08\u6d4b\u8bd5\u673a\u5bc6\u7801\uff09 \u2014> Interpreter(\u9009\u62e9\u8fdc\u7a0b\u89e3\u91ca\u5668) \u2014> Finish "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4_1","title":"4. \u73af\u5883\u6e05\u7406","text":" \u5982\u679c\u7528\u4f8b\u91cc\u9762\u7684 teardown \u6ca1\u6709\u6267\u884c\uff0c\u5927\u6982\u7387\u662f\u56e0\u4e3a setup \u91cc\u9762\u4ee3\u7801\u62a5\u9519\uff0c\u8fd9\u4e24\u4e2a\u662f\u4e00\u5bf9\u7684\uff0csetup \u91cc\u9762\u62a5\u9519\uff0cteardown \u91cc\u9762\u7684\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\uff1b \u76ee\u524d\u6211\u4eec\u5df2\u7ecf\u5c06\u5404\u5e94\u7528\u7684 clean_all \u8fd9\u4e2a fixture \u6539\u6210\u4e86\u7ec8\u7ed3\u5668\uff0c\u786e\u4fdd\u59cb\u7ec8\u80fd\u6267\u884c\u5230\u8fd9\u6b65\uff0c\u4f46\u662f\u7528\u4f8b\u91cc\u9762\u7684 fixture\uff0c\u8fd8\u662f\u9700\u8981\u6211\u4eec\u5c0f\u5fc3\u5904\u7406\uff1b \u8981\u6267\u884c clean_all \u9700\u8981\u5728\u7f16\u8f91\u5668\u8fd0\u884c\u53c2\u6570\u52a0 --clean yes\uff0c\u5199\u7528\u4f8b\u7684\u65f6\u5019\u8bf7\u52a0\u4e0a\uff0c\u4e0d\u7136\u4f60\u4e0d\u786e\u5b9a\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u7684\u73af\u5883\u662f\u5426\u6062\u590d\uff1b setup \u53ef\u4ee5\u4e0d\u8981\uff0c\u5c06 setup \u653e\u5230\u7528\u4f8b\u91cc\u9762\u662f\u4e00\u79cd\u7a33\u59a5\u7684\u505a\u6cd5\uff0cteardown \u4e00\u5b9a\u8981\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5_1","title":"5. \u5143\u7d20\u5b9a\u4f4d\u4e0d\u51c6\uff08\u5750\u6807\u8fd4\u56de\u4e0d\u5bf9\uff09","text":" \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u53ef\u80fd\u53d7\u5230\u7a97\u53e3 ID \u7684\u53d8\u5316\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u9ed8\u8ba4\u53d6\u6700\u65b0\u7684\u4e00\u4e2a\u7a97\u53e3\u7528\u4e8e\u5b9a\u4f4d\uff0c\u4f46\u5982\u679c\u5b9e\u9645\u9700\u8981\u5b9a\u4f4d\u7684\u4e0d\u662f\u6700\u65b0\u7684\u7a97\u53e3\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u91cd\u65b0\u5b9e\u4f8b\u5316\u65b9\u6cd5\u7c7b\u5bf9\u8c61\uff0c\u5e76\u5728\u7c7b\u4e2d\u4f20\u5165\u5bf9\u5e94\u7684\u7a97\u53e3\u5e8f\u53f7\uff1b \u57fa\u4e8e\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u76ee\u524d\u9047\u5230\u7684\u7b14\u8bb0\u672c\u4e0a\uff0c\u7531\u4e8e\u5c4f\u5e55\u7f29\u653e\u6bd4\u4f8b\u4e3a 1.25\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u6211\u4eec\u9ed8\u8ba4\u4f7f\u7528\u7f29\u653e\u6bd4\u4f8b\u4e3a 1\uff1b \u57fa\u4e8e\u56fe\u50cf\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u76ee\u6807\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b \u57fa\u4e8e OCR \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u6587\u5b57\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u540c\u6837\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6_1","title":"6. \u952e\u9f20\u64cd\u4f5c\u4e0d\u51c6","text":" \u9f20\u6807\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6bd4\u5982\u53f3\u952e\u3001\u53cc\u51fb\u65e0\u54cd\u5e94\uff1b \u952e\u76d8\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6216\u8005\u5ef6\u8fdf\u8f93\u5165\uff0c\u6bd4\u5982\u7528\u4f8b\u9700\u8981\u8f93\u5165\u201c\u6211\u662f\u4e2d\u56fd\u4eba\u201d\uff0c\u5b9e\u9645\u53ea\u8f93\u5165\u4e86\u201c\u6211\u56fd\u4eba\u201d\uff1b \u4ee5\u4e0a\u95ee\u9898\u6392\u9664\u5e94\u7528\u5361\u987f\u7b49\u95ee\u9898\uff0c\u5927\u6982\u7387\u662f\u7531\u4e8e\u5de5\u5177\u7684\u95ee\u9898\uff0c\u76ee\u524d\u952e\u9f20\u64cd\u4f5c\u6211\u4eec\u4f7f\u7528\u4e09\u4e2a\u5de5\u5177\uff1aDogtail \u63d0\u4f9b\u7684\u952e\u9f20\u5de5\u5177\u3001PyAutoGUI\u3001Xdotool \uff1b \u6709\u540c\u5b66\u53ef\u80fd\u8981\u8bf4\u4e3a\u5565\u8981\u7528\u4e09\u4e2a\u554a\uff0c\u7528\u4e00\u4e2a\u4e0d\u5c31\u597d\u4e86\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u5404\u6709\u4f18\u70b9\u5404\u6709\u7f3a\u70b9\u3002 \u5982\u679c\u4f60\u9047\u5230\u952e\u9f20\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u8bd5\u8bd5\u901a\u8fc7\u4e0d\u540c\u7684\u5de5\u5177\u64cd\u4f5c\uff1b\u952e\u76d8\u8f93\u5165\u5ef6\u8fdf\u7684\u95ee\u9898\uff0c\u4e00\u822c\u662f\u56e0\u4e3a\u8f93\u5165\u901f\u5ea6\u592a\u5feb\u4e86\uff0c\u7cfb\u7edf\u6ca1\u53cd\u5e94\u8fc7\u6765\uff0c\u5e38\u89c1\u4e8e ARM \u548c MIPS \u4e0a\uff0c\u4fee\u6539\u53c2\u6570 delay_time \u7684\u503c\uff0c\u5355\u4f4d\u4e3a\u6beb\u79d2\uff1b # mouse_key.py\n@classmethod\ndef input_message(cls, message, delay_time=300, interval=0.2):\n\"\"\"\n \u8f93\u5165\u5b57\u7b26\u4e32\n :param message: \u8f93\u5165\u7684\u5185\u5bb9\n :param delay_time: \u5ef6\u8fdf\u65f6\u95f4\n :param interval:\n :return:\n \"\"\"\n \u5982\u679c\u4e0d\u662f\u65b9\u6cd5\u7684\u95ee\u9898\uff0c\u5219\u9700\u8981\u7ee7\u7eed\u548c\u5f00\u53d1\u4e00\u8d77\u6392\u9664\uff0c\u662f\u5426\u4e3a\u5e94\u7528\u63a5\u53d7\u952e\u9f20\u4fe1\u53f7\u5904\u7406\u7684\u95ee\u9898\uff0c\u8fd9\u7c7b\u60c5\u51b5\u6211\u4eec\u4e5f\u662f\u9047\u5230\u8fc7\u7684\uff0c\u5177\u4f53\u95ee\u9898\u5177\u4f53\u5206\u6790\u3002 \u6bd4\u5982\u5f71\u9662\u5c31\u91cd\u5199\u4e86\u4e00\u4e2a\u53f3\u952e\u7684\u65b9\u6cd5\uff1a # base_widget.py\n@classmethod\ndef right_click(cls, _x=None, _y=None):\n\"\"\"\n \u91cd\u5199\u5e95\u5c42\u5355\u51fb\u9f20\u6807\u53f3\u952e\n \u89e3\u51b3\u5f71\u9662\u53f3\u952e\u89e6\u53d1release\u4e8b\u4ef6\u7684\u95ee\u9898\uff08\u53f3\u952e\u4e3b\u7a97\u53e3\u4f1a\u64ad\u653e\u89c6\u9891\uff09\n \"\"\"\ncls.mouse_down(_x, _y, button=3)\nsleep(0.1)\ncls.mouse_up(button=3)\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_6","title":"\u4e03\u3001\u5176\u4ed6\u4e0d\u4e3a\u4eba\u77e5\u7684\u7ec6\u8282","text":" \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u5c3d\u91cf\u7f16\u5199\u540c\u4e00\u4e2a\u5e94\u7528\u6216\u6a21\u5757\u7684\u7528\u4f8b\uff0c\u80fd\u5bf9\u8be5\u7528\u4f8b\u5df2\u6709\u65b9\u6cd5\u719f\u6089\uff0c\u907f\u514d\u8fc7\u591a\u91cd\u590d\u4e1a\u52a1\u4ee3\u7801\u7684\u5c01\u88c5\uff1b \u76f8\u540c\u7684\u573a\u666f\u4e0b\uff0c\u5404\u67b6\u6784\u7b49\u5f85\u65f6\u95f4\u4e0d\u540c\uff0c\u5efa\u8bae\u4f7f\u7528\u6846\u67b6\u63d0\u4f9b\u7684 sleep\uff0c\u6211\u4eec\u505a\u4e86\u4e0d\u540c\u67b6\u6784\u7684\u500d\u6570\u653e\u5927\uff1b \u7f16\u5199\u7528\u4f8b\u65f6\uff0c\u5c3d\u91cf\u8003\u8651\u5230\u6bcf\u4e00\u6b65\u5f02\u5e38\u540e\u7684\u73af\u5883\u6062\u590d\uff0c\u9700\u8981\u5efa\u8bae\u8fd9\u79cd\u610f\u8bc6\uff0c\u968f\u65f6\u8981\u8003\u8651\u5230\uff0c\u8fd9\u6b65\u64cd\u4f5c\u6709\u6ca1\u6709\u53ef\u80fd\u51fa\u9519\uff0c\u51fa\u9519\u4e86\u6539\u600e\u4e48\u529e\uff1b \u63d0\u4ea4\u4ee3\u7801\u7684\u65f6\u5019\u6ce8\u610f\u4e0d\u8981\u628a\u4e00\u4e9b\u4e34\u65f6\u7684\u6d4b\u8bd5\u8d44\u6e90\u63d0\u4ea4\u8fdb\u53bb\u4e86\uff0c\u6bd4\u5982\u6d4b\u8bd5\u4e86\u4e00\u4e2a\u5f71\u7247\uff0c\u6709\u4e9b\u540c\u5b66\u4e60\u60ef\u4f7f\u7528 git add . \uff0c\u7136\u540e\u5c31\u5168\u90e8\u63d0\u4ea4\u5230\u4ee3\u7801\u4ed3\u5e93\u4e86\uff0c\u8fd9\u6837\u5373\u4f7f\u540e\u671f\u628a\u5927\u6587\u4ef6\u5220\u4e86\uff0c.git \u6587\u4ef6\u91cc\u9762\u4e5f\u4f1a\u5f88\u5927\uff0c\u9020\u6210\u4ee3\u7801\u4ed3\u5e93\u53d8\u5f97\u5341\u5206\u81c3\u80bf\u3002 \u66f4\u591a\u7ec6\u8282\u67e5\u770b\uff1a\u300aAT\u7ecf\u9a8c\u603b\u7ed3\u300b"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/","title":"AT \u6267\u884c\u5668\u4f7f\u7528\u6307\u5317","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/5/25\n# Author : litao\n# =============================================\n Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1","title":"1\u3001\u529f\u80fd\u4ecb\u7ecd","text":" \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7cfb\u7edf\u8bed\u8a00\u8bbe\u7f6e\uff0c\u5206\u8fa8\u7387\u8bbe\u7f6e\u53ca\u7528\u4f8b\u6267\u884c\u73af\u5883\u642d\u5efa\uff1b \u652f\u6301 IP \u4e3a 15 \u7f51\u6bb5\u7684 AMD \u67b6\u6784\u6d4b\u8bd5\u673a\u955c\u50cf\u88c5\u673a\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u6307\u5b9a\u5e94\u7528\uff0c\u6307\u5b9a\u8303\u56f4\u6807\u7b7e\u7684\u7528\u4f8b\u6267\u884c\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u72b6\u6001\u68c0\u67e5\uff0c\u662f\u5426\u6709\u6b63\u5728\u8fd0\u884c\u7684\u6d4b\u8bd5\uff1b \u652f\u6301\u914d\u7f6e\u7528\u4f8b\u6267\u884c\u65f6\u957f\uff0c\u9632\u6b62\u4efb\u52a1\u963b\u585e\uff1b \u652f\u6301\u6839\u636e\u5e94\u7528\u7248\u672c\u81ea\u52a8\u67e5\u627e\u5bf9\u5e94\u7684\u7528\u4f8b tag\uff1b \u652f\u6301\u5f02\u5e38\u5904\u7406\u548c\u6d4b\u8bd5\u5b8c\u6210\u7684\u5b9e\u65f6\u6d88\u606f\u901a\u77e5\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2job","title":"2\u3001Job \u4ecb\u7ecd","text":"\u4ee5\u4e0b\u6309\u6267\u884c\u6d41\u7a0b\u7684\u987a\u5e8f\u4ecb\u7ecd\uff0c\u6bcf\u4e00\u6b65\u90fd\u53ef\u4ee5\u5355\u72ec\u6267\u884c\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1_1","title":"1\u3001\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/AT_test/ \u6574\u4e2a\u6d41\u7a0b\u7684\u4e3b\u5165\u53e3\uff0c\u901a\u8fc7\u8fd9\u4e2a\u5165\u53e3\uff0c\u8fde\u540c\u6574\u4e2a\u6d4b\u8bd5\u6d41\u7a0b\uff0c\u955c\u50cf\u88c5\u673a\uff0c\u73af\u5883\u90e8\u7f72\uff0c\u6d4b\u8bd5\u5e94\u7528\u53ca\u751f\u6210\u62a5\u544a\u3002 \u53c2\u6570\u4ecb\u7ecd\uff1a \u6d4b\u8bd5\u673a\uff1a\u6240\u6709\u89c4\u6574\u5230\u56fa\u5b9a\u533a\u57df\u7684\u6d4b\u8bd5\u673a\uff0c\u901a\u8fc7\u6d4b\u8bd5\u540c\u5b66\u5bf9\u6d4b\u8bd5\u673a\u7684\u4e60\u60ef\u547d\u540d\uff0c\u5728\u540e\u53f0\u6620\u5c04\u6d4b\u8bd5\u673a\u7684\u8be6\u7ec6\u4fe1\u606f\uff0c\u62ec\u53f7\u4e2d\u4e3a\u6d4b\u8bd5\u673a IP \u7684\u6700\u540e\u4e00\u4f4d\uff1b \u6d4b\u8bd5\u5e94\u7528\uff1a\u6307\u5b9a\u7684\u6d4b\u8bd5\u5e94\u7528\u7684\u5305\u540d\uff0c\u7cfb\u7edf\u6839\u636e\u540d\u79f0\u81ea\u52a8\u62c9\u53d6\u5bf9\u5e94\u7684\u4ed3\u5e93\u4ee3\u7801\uff1b deb\u5305\u4e0b\u8f7d\u5730\u5740\uff1a\u6d4b\u8bd5\u4e0a\u8ff0\u5e94\u7528\u65f6\uff0c\u9700\u8981\u5b89\u88c5\u7684deb\u5305\u4e0b\u8f7d\u5730\u5740\uff0c\u591a\u4e2a\u5730\u5740\u7528\u201c,\u201d\u9694\u5f00\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff1b \u8303\u56f4\u6807\u7b7e\uff1a\u6267\u884c\u6d4b\u8bd5\u7528\u4f8b\u7684\u6807\u7b7e\u8303\u56f4\uff0c\u5bf9\u5e94\u7528\u4f8b\u4ee3\u7801 csv \u6587\u4ef6\u4e2d\u7684\u6807\u7b7e\u4fe1\u606f\uff0c\u4ee5 pytest \u7684mark\u8bed\u6cd5\u7f16\u5199\uff1b \u7cfb\u7edf\u8bed\u8a00\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u8bed\u8a00\u73af\u5883\uff1b \u5206\u8fa8\u7387\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u5206\u8fa8\u7387\u73af\u5883\uff1b \u955c\u50cf\u5730\u5740\uff1a\u955c\u50cf\u4ed3\u5e93\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u901a\u8fc7 PXE \u88c5\u673a\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u88c5\u673a\u73af\u8282\uff08\u76ee\u524d\u4ec5\u652f\u6301\u90e8\u5206 AMD \u67b6\u6784\u7684\u88c5\u673a\uff09\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2pxe","title":"2\u3001PXE \u88c5\u673a","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/IOS_install/ \u8f93\u5165\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\uff0cIP\uff0c\u5bc6\u7801\uff0c\u955c\u50cf\u5730\u5740\u540e\uff0c\u81ea\u52a8\u88c5\u673a\uff0c\u76ee\u524d\u4ec5\u652f\u6301\u56fa\u5b9a 15 \u7f51\u6bb5\u7684\u90e8\u5206 AMD \u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#3","title":"3\u3001\u6b21\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/all_client_test/ \u8be5\u5165\u53e3\u4e0e\u4e3b\u5165\u53e3\u529f\u80fd\u57fa\u672c\u4e00\u81f4\uff0c\u53ea\u662f\u5265\u79bb\u4e86PXE\u88c5\u673a\u6d41\u7a0b\uff0c\u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7684\u6267\u884c\u6d41\u7a0b\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#4","title":"4\u3001\u73af\u5883\u90e8\u7f72","text":"Jenkins url\uff1ahttps://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/env/build?delay=0sec \u8bbe\u7f6e\u6d4b\u8bd5\u673a\u7684\u7cfb\u7edf\u8bed\u8a00\uff0c\u5206\u8fa8\u7387\u53ca\u5b89\u88c5\u6d4b\u8bd5\u6240\u9700\u7684\u4f9d\u8d56\u5305\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#5","title":"5\u3001\u53d1\u9001\u4ee3\u7801","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/send_code/ \u6839\u636e\u6d4b\u8bd5\u5e94\u7528\u540d\u79f0\uff0c\u62c9\u53d6\u5bf9\u5e94\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u5e76\u6839\u636e\u6d4b\u8bd5\u673a\u4e0a\u5e94\u7528\u7248\u672c\u5207\u6362\u5230\u5bf9\u5e94\u7684tag\u7248\u672c\uff0c\u82e5\u672a\u627e\u5230tag\u7248\u672c\uff0c\u5219\u4f7f\u7528\u6700\u65b0\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u518d\u6839\u636e\u5e94\u7528\u5e93\u4ee3\u7801\u4e2d\u914d\u7f6e\u7684\u57fa\u7840\u5e93\u7248\u672c\uff0c\u62c9\u53d6\u57fa\u7840\u5e93\u4ee3\u7801\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#6","title":"6\u3001\u7528\u4f8b\u6267\u884c","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/run_test/ \u8fd0\u884c\u6d4b\u8bd5\u673a\u4e0a\u7684\u7528\u4f8b"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/","title":"AT \u7528\u4f8b\u7b5b\u9009\u6307\u5317","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u7528\u4f8b\u7b5b\u9009\u6807\u51c6\uff0c\u662f\u6311\u9009\u5408\u9002\u7684\u6587\u672c\u7528\u4f8b\u8fdb\u884c\u81ea\u52a8\u5316\u7528\u4f8b\u8f6c\u5316\u7684\u4e00\u4e9b\u901a\u7528\u6807\u51c6\u3002 \u8fc7\u53bb\u6211\u4eec\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u5b9e\u8df5\u8fc7\u7a0b\u4e2d\uff0c\u5199\u4e86\u4e0d\u5c11\u81ea\u52a8\u5316\u7528\u4f8b\uff0c\u968f\u7740\u9700\u6c42\u7684\u8fed\u4ee3\uff0c\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u81ea\u7136\u8150\u5316\uff0c\u56e0\u800c\u9700\u8981\u5728\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\u5bf9\u81ea\u52a8\u5316\u7528\u4f8b\u8fdb\u884c\u7ef4\u62a4\uff0c\u5728\u7ef4\u62a4\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u6211\u4eec\u53d1\u73b0\uff0c\u6709\u4e9b\u7528\u4f8b\u7ef4\u62a4\u8d77\u6765\u592a\u96be\u4e86\uff0c\u8c03\u8bd5\u7528\u4f8b\u8017\u8d39\u5927\u91cf\u65f6\u95f4\uff0c\u6210\u672c\u5f88\u9ad8\u3002 \u56e0\u6b64\uff0c\u6211\u4eec\u603b\u7ed3\u4e00\u4e9b\u81ea\u52a8\u5316\u7528\u4f8b\u9009\u578b\u7684\u6807\u51c6\uff0c\u4ee5\u4f18\u5316\u540e\u7eed\u81ea\u52a8\u5316\u7528\u4f8b\u7ed3\u6784\uff0c\u671f\u5f85\u6211\u4eec\u80fd\u7f16\u5199\u51fa\u9ad8\u6548\u3001\u7a33\u5b9a\u3001\u6613\u4e8e\u7ef4\u62a4\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_1","title":"\u4e00\u3001\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u53ef\u4ee5\u5206\u4e3a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u548c\u4e13\u9879\u81ea\u52a8\u5316\u6d4b\u8bd5\uff0c\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e00\u822c\u53ea\u9488\u5bf9\u4e00\u4e9b\u5e38\u89c4\u7684\u529f\u80fd\u6d4b\u8bd5\uff0c\u5176\u4ed6\u975e\u5e38\u89c4\u529f\u80fd\u7684\u7528\u4f8b\uff0c\u5e94\u8be5\u91c7\u7528\u4e13\u9879\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u6848\uff1b \u4ee5\u4e0b\u662f\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1","title":"1. \u7a33\u5b9a\u6027\u3001\u538b\u6d4b\u7528\u4f8b","text":"\u7a33\u5b9a\u6027\u6d4b\u8bd5\u3001\u538b\u6d4b\u7528\u4f8b\u5e94\u8be5\u662f\u5c5e\u4e8e\u6027\u80fd\u76f8\u5173\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u5982\uff1a\u53cd\u590d\u591a\u6b21\u70b9\u51fb\u6309\u94ae\uff0c\u68c0\u9a8c\u5176\u529f\u80fd\u7a33\u5b9a\u6027\u3002\u56e0\u4e3a\u8fd9\u4e9b\u7528\u4f8b\u65ad\u8a00\u7684\u9884\u671f\u53ef\u80fd\u4e0d\u662f\u5f88\u660e\u786e\uff0c\u66f4\u6709\u751a\u8005\u4e0d\u9700\u8981\u65ad\u8a00\uff0c\u7528\u4f8b\u65f6\u957f\u6bd4\u8f83\u957f\uff0c\u800c\u4e14\u4e0d\u53ef\u63a7\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u76ee\u524d\u6211\u4eec\u6709\u6027\u80fd\u81ea\u52a8\u5316\u7684\u4e13\u9879\u65b9\u6848\uff0c\u4ee5\u53ca\u4e00\u4e9b\u7a33\u5b9a\u6027\u6d4b\u8bd5\u7684\u4e13\u9879\u65b9\u6848\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u6b64\u7c7b\u7528\u4f8b\u653e\u5230\u4e13\u9879\u81ea\u52a8\u5316\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2","title":"2. \u6d89\u53ca\u591a\u4e2a\u7528\u6237\u64cd\u4f5c","text":"\u5e38\u89c1\u4e0e\u6587\u7ba1\u7684\u7528\u4f8b\u4e2d\uff0c\u591a\u7528\u6237\u64cd\u4f5c\u7684\u7528\u4f8b\u4e00\u822c\u90fd\u4f1a\u6d89\u53ca\u5230\u5728\u7cfb\u7edf\u4e2d\u8fdb\u884c\u591a\u4e2a\u7528\u6237\u95f4\u7684\u5207\u6362\uff0c\u81ea\u52a8\u5316\u811a\u672c\u4e00\u822c\u662f\u8fd0\u884c\u5728\u4e00\u4e2a\u7528\u6237\u7a7a\u95f4\u4e0b\u7684\uff0c\u6240\u4ee5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u591a\u7528\u6237\u95f4\u7684\u5207\u6362\u3002 \u6b64\u7c7b\u4e0d\u5efa\u8bae\u91c7\u7528\u81ea\u52a8\u5316\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3","title":"3. \u4e0e\u5f00\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4ea4\u4e92","text":"\u6b64\u7c7b\u573a\u666f\u591a\u4e3a\u5e94\u7528\u7684\u5f02\u5e38\u573a\u666f\u6d4b\u8bd5\uff0c\u6bd4\u5982\uff1a\u590d\u5236\u5927\u6587\u4ef6\u8fc7\u7a0b\u4e2d\u6ce8\u9500\u673a\u5668\u3002 \u81ea\u52a8\u5316\u811a\u672c\u5728\u7cfb\u7edf\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4e4b\u540e\u662f\u4f1a\u505c\u6b62\u8fd0\u884c\u7684\uff1b\u6b64\u7c7b\u7528\u4f8b\u53ef\u4ee5\u505a\u81ea\u52a8\u5316\uff0c\u4f46\u662f\u540c\u6837\u9700\u8981\u505a\u4e13\u9879\u65b9\u6848\uff0c\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u7684\u5904\u7406\u903b\u8f91\u5b8c\u5168\u4e0d\u540c\u3002 \u540e\u7eed\u81ea\u52a8\u5316\u9700\u8981\u516c\u5173\u7684\u70b9\uff1a \u81ea\u52a8\u5316\u811a\u672c\u5728\u672c\u673a\u8fd0\u884c\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u81f3\u5c11\u9700\u8981\u63d0\u4f9b\u4ee5\u4e0b\u529f\u80fd\uff1a \u91cd\u542f\u4e4b\u540e\u7528\u4f8b\u80fd\u81ea\u52a8\u8fd0\u884c\uff1b\u53ef\u4ee5\u8003\u8651\u5c06\u6267\u884c\u7528\u4f8b\u5199\u6210\u4e00\u4e2a\u5f00\u673a\u81ea\u542f\u7684\u670d\u52a1\uff1b \u80fd\u8bb0\u5f55\u5173\u673a\u4e4b\u524d\u7528\u4f8b\u6267\u884c\u7684\u4f4d\u7f6e\uff0c\u91cd\u542f\u4e4b\u540e\u80fd\u4ece\u6b64\u4f4d\u7f6e\u5f00\u59cb\u6267\u884c\uff1b \u50cf\u6027\u80fd\u81ea\u52a8\u5316\u4e00\u6837\uff0c\u7531\u670d\u52a1\u7aef\u63a7\u5236\uff1b \u5b8c\u5168\u57fa\u4e8e\u56fe\u5f62\u8bc6\u522b\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u4e32\u53e3\u7ebf\u63a7\u5236\u952e\u9f20\u7a33\u5b9a\u6027\uff1b "},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4","title":"4. \u6d4b\u8bd5\u6267\u884c\u65f6\u95f4\u957f","text":"\u7528\u4f8b\u6267\u884c\u65f6\u95f4\u63a7\u5236\u57282\u5206\u949f\u4ee5\u5185\uff0c\u6781\u7aef\u60c5\u51b5\u4e0d\u8981\u8d85\u8fc75\u5206\u949f\uff0c\u6240\u6709\u7528\u4f8b\u7684\u5e73\u5747\u65f6\u957f\u5e94\u8be5\u57281\u5206\u949f\u5de6\u53f3\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u95f4\u592a\u957f\uff0c\u7f16\u5199\u7528\u4f8b\u3001\u8c03\u8bd5\u7528\u4f8b\u3001\u6267\u884c\u7528\u4f8b\u3001\u7ef4\u62a4\u7528\u4f8b\u90fd\u975e\u5e38\u7684\u8017\u65f6\uff0c\u4eba\u529b\u6210\u672c\u65f6\u95f4\u6210\u672c\u6295\u5165\u592a\u9ad8\u3002 \u4f60\u60f3\uff0c\u8fd9\u6761\u7528\u4f8b\u6267\u884c\u9700\u89815\u5206\u949f\uff0c\u90a3\u4f60\u5199\u8fd9\u6761\u7528\u4f8b\u7684\u65f6\u95f4\u4e0d\u53ef\u80fd\u4e00\u904d\u8fc7\uff0c\u5199\u7684\u8fc7\u7a0b\u4e2d\u8dd1\u4e0d\u901a\u8fd8\u5f97\u91cd\u8dd1\u81f3\u5c1115\u5206\u949f\u4e0d\u8fc7\u5206\uff0c\u5199\u5b8c\u4e86\u8fd8\u5f97\u5728\u5176\u4ed6\u67b6\u6784\u4e0a\u8c03\u8bd5\uff0c\u534a\u4e2a\u5c0f\u65f6\u8fc7\u53bb\u4e86\uff0c\u8fd9\u8fd8\u53ea\u662f\u7b2c\u4e00\u6b21\u5199\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u540e\u7eed\u5982\u679c\u7528\u4f8b\u7ef4\u62a4\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u7ecf\u5e38\u6295\u5165\u76f8\u5f53\u957f\u65f6\u95f4\uff0c\u8fd9\u6837\u5176\u5b9e\u662f\u5931\u53bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u7684\u3002\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u5c31\u5e94\u8be5\u662f\u5feb\u51c6\u72e0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5","title":"5. \u8fb9\u7f18\u6027\u6d4b\u8bd5","text":"\u6709\u4e9b\u529f\u80fd\u6a21\u5757\u672c\u8eab\u662f\u5c5e\u4e8e\u6bd4\u8f83\u8fb9\u7f18\u6027\u7684\uff0c\u5373\u6781\u5c11\u7528\u6237\u4f1a\u4f7f\u7528\u5230\u7684\u529f\u80fd\uff0c\u8fd9\u7c7b\u529f\u80fd\u6a21\u5757\u4e0d\u9700\u8981\u5927\u89c4\u6a21\u5b9e\u73b0\u81ea\u52a8\u5316\uff0c\u4e00\u4e24\u4e2a\u573a\u666f\u8986\u76d6\u57fa\u672c\u529f\u80fd\u5c31\u884c\u4e86\uff0c\u56e0\u6b64\u6211\u4eec\u5728\u6311\u9009\u6b64\u7c7b\u7528\u4f8b\u7684\u65f6\u5019\u53ef\u4ee5\u7ed3\u5408\u6574\u4e2a\u529f\u80fd\u6a21\u5757\u7684\u8986\u76d6\u60c5\u51b5\u6765\u51b3\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6","title":"6. \u9700\u8981\u4f9d\u8d56\u4eba\u5de5\u4ecb\u5165\u7684","text":"\u81ea\u52a8\u5316\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\u662f\u6ca1\u6709\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bd4\u5982\u8981\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u90a3\u4e48\u5c31\u80cc\u79bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u3002 \u6bd4\u5982\u5149\u9a71\u6a21\u5757\uff0c\u5149\u9a71\u523b\u5f55\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u4f46\u662f\u5149\u9a71\u523b\u5f55\u4e4b\u540e\u5149\u76d8\u4f1a\u5f39\u51fa\u6765\uff0c\u9700\u8981\u4eba\u5de5\u66f4\u6362\u5149\u76d8\uff0c\u518d\u624b\u52a8\u63a8\u8fdb\u5149\u9a71\u4e2d\u3002 \u8fd9\u79cd\u529f\u80fd\u6a21\u5757\u5373\u4f7f\u505a\u81ea\u52a8\u5316\uff0c\u80fd\u6d89\u53ca\u5230\u7684\u529f\u80fd\u975e\u5e38\u6709\u9650\uff0c\u800c\u4e14\u4e0d\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u6240\u4ee5\u660e\u663e\u5c31\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7","title":"7. \u96be\u4ee5\u5b9e\u73b0\u7684","text":"\u7528\u4f8b\u6240\u6d89\u53ca\u5230\u7684\u65b9\u6cd5\u5b9e\u73b0\u8d77\u6765\u53ef\u80fd\u6709\u96be\u5ea6\uff0c\u751a\u81f3\u73b0\u9636\u6bb5\u65e0\u6cd5\u5b9e\u73b0\u7684\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002 \u6bd4\u5982\u5f71\u9662\u6d4b\u8bd5\u753b\u9762\u6e05\u6670\u5ea6\u3001\u6d41\u7545\u5ea6\u3001\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u4e4b\u540e\u7684\u89c6\u9891\u662f\u5426\u5b58\u5728\u5361\u987f\u7b49\u7528\u4f8b\uff0c\u73b0\u9636\u6bb5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#8","title":"8. \u529f\u80fd\u4e0d\u7a33\u5b9a","text":"\u8fd9\u4e2a\u4e0d\u662f\u8bf4\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\uff0c\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\u4e0d\u7a33\u5b9a\u662f\u6b63\u5e38\u7684\uff0c\u8fd9\u79cd\u6211\u4eec\u53ef\u4ee5\u7b49\u5f00\u53d1\u63d0\u6d4b\u4e4b\u540e\u518d\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u3002 \u529f\u80fd\u4e0d\u7a33\u5b9a\u6307\u7684\u662f\u7528\u4f8b\u6240\u6d89\u53ca\u7684\u529f\u80fd\uff0c\u53ef\u80fd\u5b58\u5728\u591a\u79cd\u53d8\u5316\uff0c\u6bcf\u6b21\u6267\u884c\u7528\u4f8b\u53ef\u80fd\u65ad\u8a00\u7684\u9884\u671f\u90fd\u4e0d\u540c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#9","title":"9. \u52a8\u6001\u65ad\u8a00","text":"\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u76f4\u5230\u7528\u4f8b\u7ed3\u675f\uff0c\u4e00\u76f4\u662f\u4e00\u4e2a\u52a8\u6001\u53d8\u5316\u7684\u8fc7\u7a0b\uff0c\u800c\u4e14\u65e0\u6cd5\u901a\u8fc7\u5176\u4ed6\u624b\u6bb5\u505c\u4e0b\u6765\uff1b \u6bd4\u5982\uff1a\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u65f6\uff0c\u53f3\u4e0b\u89d2\u7684\u5f55\u5236\u65f6\u95f4\u662f\u4e00\u76f4\u5728\u53d8\u5316\u7684\uff0c\u7528\u4f8b\u9700\u8981\u6d4b\u8bd5\u5f55\u52361\u5206\u949f\u4e4b\u540e\uff0c\u5f55\u5236\u65f6\u95f4\u662f\u521a\u597d\u505c\u572860\u79d2\uff1b \u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fd8\u505a\u4e0d\u5230\u65f6\u95f4\u7cbe\u51c6\u63a7\u5236\uff0c\u7a0b\u5e8f\u6267\u884c\u65f6\u95f4\u662f\u6709\u6ce2\u52a8\u7684\uff0c\u800c\u4e14\u8981\u9002\u914d\u591a\u4e2a\u5e73\u53f0\uff0c\u6240\u4ee5\u6b64\u7c7b\u7528\u4f8b\u5927\u6982\u7387\u4f1a\u6267\u884c\u5931\u8d25\u3002\u7279\u522b\u662f\u5728\u6027\u80fd\u8f83\u5dee\u7684\u56fd\u4ea7\u5316\u67b6\u6784\u4e0a\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u592a\u53ef\u80fd\u7a33\u5b9a\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#10","title":"10. \u63a2\u7d22\u6027\u6d4b\u8bd5","text":"\u63a2\u7d22\u6027\u6d4b\u8bd5\u901a\u5e38\u662f\u4e00\u4e9b\u4e0d\u786e\u5b9a\u7684\u64cd\u4f5c\uff0c\u591a\u53d8\u5207\u590d\u6742\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u9884\u671f\u4e5f\u53ef\u80fd\u662f\u4e0d\u786e\u5b9a\u7684\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u9a9a\u64cd\u4f5c\u592a\u591a\u4e86\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6b64\u7c7b\u7528\u4f8b\u9002\u5408\u91c7\u7528\u624b\u5de5\u6d4b\u8bd5\uff0c\u662f\u624b\u5de5\u6d4b\u8bd5\u771f\u6b63\u7684\u4ef7\u503c\u4f53\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#11","title":"11. \u6613\u7528\u6027\u6d4b\u8bd5","text":"\u5bf9\u4e8e\u6613\u7528\u6027\u7684\u5224\u65ad\u901a\u5e38\u662f\u4e3b\u89c2\u7684\uff0c\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\u5f88\u96be\u53bb\u5b9a\u4e49\u4ec0\u4e48\u6837\u7684\u60c5\u51b5\u5bf9\u7528\u6237\u662f\u6613\u7528\u7684\uff0c\u81ea\u52a8\u5316\u9700\u8981\u6709\u660e\u786e\u7684\u53ef\u5b9e\u73b0\u7684\u9884\u671f\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_2","title":"\u4e8c\u3001\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u524d\u9762\u8bb2\u4e86\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u4e00\u4e9b\u7528\u4f8b\u60c5\u51b5\uff0c\u6709\u540c\u5b66\u5c31\u8bf4\u4e86\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\u4e0d\u7528\u8bb2\u4e86\uff0c\u5c31\u662f\u4e0d\u9002\u5408\u7684\u53cd\u9762\u3002\u6ca1\u6bdb\u75c5\u54c8\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\uff0c\u6211\u4eec\u5927\u4f53\u8fd8\u53ef\u4ee5\u5206\u4e3a\u4e24\u7c7b\uff1a \u7b2c\u4e00\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u597d\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u7b2c\u4e8c\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u4e00\u822c\uff0c\u9700\u8981\u6295\u5165\u66f4\u591a\u7cbe\u529b\u624d\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u4ee5\u4e0b\u4ecb\u7ecd\u4e00\u4e9b\u6211\u4eec\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1_1","title":"1. \u64cd\u4f5c\u76f8\u5bf9\u7b80\u5355","text":"\u7528\u4f8b\u6b65\u9aa4\u76f8\u5bf9\u8f83\u5c11\uff0c\u8fd9\u79cd\u7528\u4f8b\u901a\u5e38\u662f\u4e00\u4e9b\u8def\u5f84\u5f88\u6d45\u7684\u7528\u4f8b\uff0c\u4e00\u822c\u4e5f\u662f\u4e00\u4e9b\u57fa\u7840\u7528\u4f8b\u3002\u7528\u4f8b\u7f16\u5199\u3001\u7ef4\u62a4\u90fd\u53ef\u4ee5\u8f7b\u677e\u641e\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2_1","title":"2. \u5bb9\u6613\u5b9e\u73b0","text":"\u73b0\u6709\u6280\u672f\u662f\u53ef\u5b9e\u73b0\u7684\uff0c\u6ca1\u6709\u96be\u5ea6\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3_1","title":"3. \u7ecf\u5e38\u7528\u4e8e\u56de\u5f52\u6d4b\u8bd5","text":"\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bcf\u6b21\u56de\u5f52\u6d4b\u8bd5\u5fc5\u987b\u8981\u6267\u884c\u7684\u7528\u4f8b\uff0c\u90a3\u4e48\u8fd9\u6761\u7528\u4f8b\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u3002 \u56de\u5f52\u6d4b\u8bd5\u65f6\u6211\u4eec\u9996\u5148\u5e94\u8be5\u4fdd\u8bc1\u5e94\u7528\u5386\u53f2\u57fa\u672c\u529f\u80fd\u6b63\u5e38\uff0c\u6240\u4ee5\u90a3\u4e9b\u6bcf\u6b21\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u90fd\u8981\u6267\u884c\u7684\u7528\u4f8b\u9002\u5408\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4_1","title":"4. \u529f\u80fd\u7a33\u5b9a\u7684\u6838\u5fc3\u529f\u80fd","text":"\u6d89\u53ca\u6838\u5fc3\u529f\u80fd\u7684\u7528\u4f8b\u662f\u6700\u6700\u91cd\u8981\u7684\u7528\u4f8b\uff0c\u4e5f\u662f\u6211\u4eec\u4ea4\u4ed8\u65f6\u5fc5\u987b\u8981\u4fdd\u8bc1\u8d28\u91cf\u7684\u76f8\u5173\u529f\u80fd\uff0c\u56e0\u6b64\u5e94\u8be5\u5c3d\u53ef\u80fd\u7684\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5_1","title":"5. \u8f93\u5165\u6570\u636e\u6d4b\u8bd5","text":"\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u901a\u5e38\u662f\u68c0\u9a8c\u88ab\u6d4b\u5e94\u7528\u63a5\u53d7\u6709\u6548\u6570\u636e\u3001\u62d2\u7edd\u65e0\u6548\u6570\u636e\u7684\u80fd\u529b\u3002\u5982\uff1a\u63d0\u4ea4\u8d85\u957f\u5b57\u7b26\u4e32\u3001\u7279\u6b8a\u5b57\u7b26\u4e32\u7b49\u7b49\u3002 \u6b64\u7c7b\u7528\u4f8b\u624b\u5de5\u6d4b\u8bd5\u5f88\u96be\u6bd4\u8f83\u5168\u9762\u7684\u8986\u76d6\u5230\u6240\u6709\u7684\u8f93\u5165\u60c5\u51b5\uff0c\u4f46\u662f\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\uff0c\u6b64\u7c7b\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u90fd\u662f\u4e00\u6837\u7684\uff0c\u53d8\u5316\u7684\u4ec5\u662f\u8f93\u5165\u53c2\u6570\u548c\u65ad\u8a00\u7ed3\u679c\uff0c\u91c7\u7528\u6570\u636e\u9a71\u52a8\uff0c\u53ef\u4ee5\u8f7b\u677e\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6_1","title":"6. \u683c\u5f0f\u8986\u76d6","text":"\u539f\u56e0\u540c\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u7c7b\u7528\u4f8b\u4e00\u6837\uff0c\u591a\u79cd\u683c\u5f0f\u7684\u8986\u76d6\u4e5f\u662f\u4e00\u4e2a\u5f88\u7e41\u7410\u7684\u4e8b\u60c5\uff0c\u4ea4\u7ed9\u81ea\u52a8\u5316\u6765\u505a\u518d\u5408\u9002\u4e0d\u8fc7\u4e86\u3002 \u6bd4\u5982\u5f71\u9662\u5bf9\u5f71\u7247\u683c\u5f0f\u7684\u68c0\u67e5\u3001\u622a\u56fe\u5f55\u5c4f\u5bf9\u4fdd\u5b58\u683c\u5f0f\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7_1","title":"7. \u68c0\u67e5\u5143\u7d20\u72b6\u6001","text":"\u67e5\u770b\u88ab\u6d4b\u5e94\u7528\u7684\u5143\u7d20\u5c5e\u6027\u3002\u5982\uff1a\u56fe\u7247\u7684\u5927\u5c0f\u548c\u6392\u5217\uff1b\u6309\u94ae\u7684\u53ef\u7528\u548c\u4e0d\u53ef\u7528\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/","title":"AT \u7ecf\u9a8c\u603b\u7ed3","text":"\u6b22\u8fce\u6240\u6709\u4eba\u63d0\u4ea4\u4f60\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u9762\u7684\u4f18\u79c0\u5b9e\u8df5\u7ecf\u9a8c\uff0c\u4ee5\u5e2e\u52a9\u5927\u5bb6\u89e3\u51b3\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#1","title":"1\u3001\u7ec8\u7ed3\u5668","text":"# litaoa@uniontech.com\n \u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4 pytest \u5b9e\u73b0\u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4\u7684\u65b9\u5f0f\u6709\u4e24\u79cd\uff0cyield \u548c\u7ec8\u7ed3\u51fd\u6570\uff1b yield \u5b9e\u73b0\uff0cyield\u524d\u9762\u4e3a\u7528\u4f8b\u7684\u524d\u7f6e\u6b65\u9aa4\uff0cyield \u540e\u9762\u4e3a\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4\u3002 @pytest.fixture\ndef clean_env():\nprint(\"setup\")\nyield\nprint(\"teardown\")\n \u7ec8\u7ed3\u51fd\u6570\u5b9e\u73b0\uff0c\u4f7f\u7528 request.addfinalizer \u6ce8\u518c\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4 @pytest.fixture\ndef clean_env(request):\ndef clean():\nprint(\"teardown\")\nrequest.addfinalizer(clean)\nprint(\"setup\")\n yield\u7684\u4f18\u7f3a\u70b9\uff1a \u4f18\u70b9\uff1a\u4ee3\u7801\u7b80\u6d01\uff0c\u76f4\u89c2\uff0c\u53ef\u4f7f\u7528yield\u5728\u7528\u4f8b\u4e2d\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c \u7f3a\u70b9\uff1a\u82e5\u524d\u7f6e\u6b65\u9aa4\u4e2d\u51fa\u73b0\u9519\u8bef\uff0c\u5219\u540e\u7f6e\u6b65\u9aa4\u4e0d\u4f1a\u6267\u884c \u7ec8\u7ed3\u51fd\u6570\uff1a \u4f18\u70b9\uff1a\u524d\u7f6e\u6b65\u9aa4\u5931\u8d25\u7684\u8bdd\uff0c\u540e\u7f6e\u6b65\u9aa4\u4ecd\u4f1a\u6267\u884c\u4e14\u53ef\u4ee5\u6ce8\u518c\u591a\u4e2a\u540e\u7f6e\u6b65\u9aa4\uff08\u524d\u63d0\uff1a\u9700\u8981\u5728\u4ee3\u7801\u62a5\u9519\u4e4b\u524d\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff09\uff0c\u652f\u6301\u7075\u6d3b\u4f7f\u7528\u540e\u7f6e\u6761\u4ef6 \u7f3a\u70b9\uff1a\u4ee3\u7801\u8f83\u4e3a\u590d\u6742\uff0c\u65e0\u6cd5\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c\uff08\u672c\u4eba\u76ee\u524d\u672a\u5b9e\u73b0\uff09 \u603b\u7ed3\uff1a\u5728\u524d\u7f6e\u6b65\u9aa4\u4fdd\u8bc1\u7edd\u5bf9\u4e0d\u4f1a\u51fa\u9519\u65f6\uff0c\u4f7f\u7528yield\u66f4\u4f73\u7b80\u4fbf\uff0c\u5f53\u524d\u7f6e\u6b65\u9aa4\u6613\u51fa\u73b0\u95ee\u9898\u65f6\uff0c\u63a8\u8350\u4f7f\u7528\u7ec8\u7ed3\u51fd\u6570\u3002 \u573a\u666f\uff1a\u4fdd\u9669\u7bb1\u7528\u4f8b\uff0c\u524d\u7f6e\u6b65\u9aa4\u4e2d\u5f00\u542f\u4fdd\u9669\u7bb1\uff0c\u540e\u7f6e\u6b65\u9aa4\u5220\u9664\u4fdd\u9669\u7bb1\u3002 @pytest.fixture(scope=\"session\", autouse=True)\ndef vault_fixture(request):\nDfmWidget.reset_vault_by_cmd() # 1\u3001\u91cd\u7f6e\u4fdd\u9669\u7bb1\nDdeDockPublicWidget().close_file_manager_by_cmd() # 2\u3001\u5173\u95ed\u6587\u7ba1\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 3\u3001\u5f00\u542f\u6587\u7ba1\nvault = DfmWidget()\nvault.create_file_vault() # 4\u3001\u521b\u5efa\u4fdd\u9669\u7bb1\ndef delete_vault(): # 8\u3001\u5220\u9664\u4fdd\u9669\u7bb1\u7684\u540e\u7f6e\u6b65\u9aa4\nsleep(2)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr()\nvault = DfmWidget()\nvault.delete_file_vault()\nDfmWidget.reset_vault_by_cmd()\nDdeDockPublicWidget().close_file_manager_by_cmd()\nrequest.addfinalizer(delete_vault) # 5\u3001\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\nDdeDockPublicWidget().close_file_manager_by_cmd() # 6\u3001\u5173\u95ed\u6587\u7ba1\nsleep(1)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 7\u3001\u5f00\u542f\u6587\u7ba1\n \u4ee3\u7801\u6309\u6ce8\u91ca\u4e2d\u7684\u5e8f\u53f7\u6267\u884c\u6b65\u9aa4 \u4ee3\u7801\u5728\u6b65\u9aa41-4\u4efb\u610f\u4f4d\u7f6e\u62a5\u9519\uff0c\u5219\u4e0d\u4f1a\u6267\u884c\u6b65\u9aa48\uff0c\u56e0\u4e3a\u672a\u6267\u884c\u5230\u6b65\u9aa45\uff0c\u6b65\u9aa48\u8fd8\u672a\u6ce8\u518c \u4ee3\u7801\u5728\u6b65\u9aa46-7\u62a5\u9519\uff0c\u4ecd\u4f1a\u6267\u884c\u6b65\u9aa47\uff0c\u56e0\u4e3a\u5728\u6b65\u9aa45\u4e2d\u5df2\u7ecf\u5c06\u6b65\u9aa47\u6ce8\u518c \u53ef\u4ee5\u7075\u6d3b\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff0c\u80fd\u5b9e\u73b0\u67d0\u4e2a\u524d\u7f6e\u6b65\u9aa4\u6267\u884c\u4e4b\u540e\uff0c\u624d\u4f1a\u6267\u884c\u540e\u7f6e\u6b65\u9aa4\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#2","title":"2\u3001\u542f\u52a8\u5e94\u7528\u7684\u65b9\u5f0f","text":"# huangmingqiang@uniontech.com\n \uff081\uff09\u547d\u4ee4\u884c\u542f\u52a8 \u5728 AT \u4ee3\u7801\u4e2d\u4f7f\u7528\u547d\u4ee4\u884c\u542f\u52a8\u5e94\u7528\uff0c\u4e3e\u4f8b\uff1a os.popen(\"deepin-music\")\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f7f\u7528 ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6\uff0cdogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u3002 \uff082\uff09\u901a\u8fc7 UI \u64cd\u4f5c\u542f\u52a8 \u901a\u8fc7\u4efb\u52a1\u680f\u3001\u542f\u52a8\u5668\u3001\u684c\u9762\u7b49UI\u65b9\u5f0f\u542f\u52a8\uff0c\u6bd4\u5982\u53cc\u51fb\u6253\u5f00\u3001\u53f3\u952e\u6253\u5f00\u7b49\uff0c\u8fd9\u79cd\u64cd\u4f5c\u65b9\u5f0f\u4e0d\u5b58\u5728ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6dogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u7684\u95ee\u9898\uff0c\u4e5f\u66f4\u52a0\u7b26\u5408\u7528\u6237\u7684\u64cd\u4f5c\u884c\u4e3a\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#3","title":"3\u3001\u6587\u4ef6\u9009\u62e9\u6846\u5c5e\u6027\u5b9a\u4f4d\u5076\u73b0\u65e0\u6cd5\u627e\u5230","text":"\u6587\u4ef6\u9009\u62e9\u6846\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5728\u8c03\u7528\u6587\u4ef6\u9009\u62e9\u6846\u65f6\uff0c\u6709\u4e00\u5b9a\u7684\u6982\u7387\u51fa\u73b0\uff0c\u754c\u9762\u5df2\u7ecf\u6e32\u67d3\u51fa\u6765\u4e86\uff0c\u4f46\u662f\u5c5e\u6027\u6811\u5e76\u6ca1\u6709\u5199\u5165\uff0c\u5bfc\u81f4\u901a\u8fc7\u5c5e\u6027\u65e0\u6cd5\u627e\u5230\u5143\u7d20\uff0c\u76ee\u524d\u4e5f\u6ca1\u6709\u5f88\u597d\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u4e3a\u4e86\u7528\u4f8b\u7a33\u5b9a\u6027\uff0c\u6587\u4ef6\u9009\u62e9\u6846\u7684\u64cd\u4f5c\u5efa\u8bae\u4f7f\u7528UI\u6216\u8005\u56fe\u7247\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u53ef\u4ee5\u901a\u8fc7\u641c\u7d22\u5185\u5bb9\u56fa\u5b9a\u6587\u4ef6\u4f4d\u7f6e\u3002 # litaoa@uniontech.com\n desk = DdeDesktopPublicWidget()\n# \u9009\u62e9\u89c6\u9891\u76ee\u5f55\ndesk.click_videos_dir_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.ctrl_f()\nsleep(1)\ndesk.input_message(\"\u5143\u7d20\u540d\u79f0\")\nsleep(0.5)\ndesk.enter()\nsleep(1)\n# \u9009\u62e9\u7b2c\u4e00\u4e2a\u6587\u4ef6\ndesk.click_list_view_btn_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.click_first_file_in_desktop_plugs_by_ui()\nsleep(1)\n# \u6587\u7ba1\u63d2\u4ef6\u4e2d\u70b9\u51fb\u6253\u5f00\ndesk.click_open_btn_in_desktop_plugs_by_ui()\n"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#4","title":"4\u3001\u5e94\u7528\u542f\u52a8","text":"# mikigo\n \u5728UI\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u4e00\u5207\u64cd\u4f5c\u7684\u90fd\u662f\u4ece\u5e94\u7528\u542f\u52a8\u5f00\u59cb\u7684\uff0c\u800c\u5728Linux\u684c\u9762\u5e94\u7528\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u6211\u4eec\u542f\u52a8\u5e94\u7528\u7684\u65b9\u6cd5\u6709\u591a\u79cd\uff0c\u4e0b\u9762\u505a\u4e00\u4e2a\u7b80\u5355\u7684\u4ecb\u7ecd\uff1a \u3010\u4f7f\u7528dogtail\u542f\u52a8\u3011 dogtail\u63d0\u4f9b\u4e86\u5e94\u7528\u542f\u52a8\u7684\u65b9\u6cd5\uff0c\u5728utils\u5e93\u4e2d\uff0c\u4f7f\u7528run\u65b9\u6cd5\u542f\u52a8\uff1a \u9996\u5148\u5bfc\u5165\u65b9\u6cd5\uff1a from dogtail.utils import *\n \u8c03\u7528run\u65b9\u6cd5 run('deepin-music')\n \u5373\u53ef\u542f\u52a8\u97f3\u4e50 \u8fd9\u79cd\u65b9\u6cd5\u7684\u4f18\u70b9\u662f\u91c7\u7528\u8fdb\u7a0b\u7684\u65b9\u5f0f\u76f4\u63a5\u542f\u52a8\uff0c\u4e0d\u4f9d\u8d56\u4e0eUI\uff0c\u65e0\u8bba\u684c\u9762\u6216\u4efb\u52a1\u680f\u4e0a\u662f\u5426\u5b58\u5728\u5e94\u7528\u56fe\u6807\uff0c\u90fd\u53ef\u4ee5\u6b63\u5e38\u542f\u52a8\u3002 \u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c \u5982\u679c\u4f7f\u7528ssh\u8fdc\u7a0b\u8c03\u7528\uff0c\u6216\u8005Jenkins\u4e2d\u6267\u884c\u6d4b\u8bd5\u811a\u672c\u7684\u65f6\u5019\uff0c\u5728sniff\u4e2d\u4f1a\u51fa\u73b0\u627e\u4e0d\u5230\u5e94\u7528\uff0c\u7ecf\u8fc7\u5206\u6790\uff0c\u53ef\u80fd\u662f\u56e0\u4e3a\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\u542f\u52a8\u7684\u65f6\u5019\uff0c\u5b9e\u9645\u662f\u91c7\u7528\u4e00\u4e2a\u5b50\u8fdb\u7a0b\u542f\u52a8\u4e86\u5e94\u7528\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u5230\u3002 \u3010\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u3011 \u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807 \u901a\u5e38\u6709\u4e24\u79cd\u65b9\u6cd5\uff1a \uff081\uff09\u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807\u3002 \uff082\uff09\u5df2\u77e5\u5e94\u7528\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u7684\u4f4d\u7f6e\uff0c\u7136\u540e\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u5bf9\u5e94\u5750\u6807\u3002 \u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u7f3a\u70b9\u662f\u4f4d\u7f6e\u5fc5\u987b\u56fa\u5b9a\uff0c\u5982\u679c\u79fb\u52a8\u4f4d\u7f6e\u5c31\u4e0d\u884c\u4e86\uff0c\u800c\u4f7f\u7528\u7b2c\u4e00\u79cd\u65b9\u6cd5\uff0c\u65e0\u8bba\u4f4d\u7f6e\u5728\u54ea\u91cc\uff0c\u53ea\u8981\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u5b58\u5728\u5373\u53ef\u3002 \u3010\u70b9\u51fb\u684c\u9762\u56fe\u6807\u542f\u52a8\u3011 \u684c\u9762\u56fe\u6807\u76ee\u524d\u662f\u91c7\u7528\u56fe\u50cf\u8bc6\u522b\u6280\u672f\uff0c\u5b9a\u4f4d\u5230\u5e94\u7528\u56fe\u6807\u7684\u5750\u6807\uff0c\u7136\u540e\u901a\u8fc7pyauogui\u8fdb\u884c\u70b9\u51fb\u64cd\u4f5c\u3002 \u8be6\u7ec6\u6280\u672f\u65b9\u6848\u53ef\u4ee5\u53c2\u8003\u6211\u7684\u53e6\u5916\u4e24\u7bc7\u535a\u5ba2: \u57fa\u4e8eopencv\u7684\u6a21\u677f\u5339\u914d\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd4\u56de\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 Python\u4e09\u65b9\u5e93PyAutoGui\u7684\u4f7f\u7528\u65b9\u6cd5 \u3010\u4ece\u542f\u52a8\u5668\u542f\u52a8\uff08\u4fd7\u79f0\u5f00\u59cb\u83dc\u5355\uff09\u3011 \u542f\u52a8\u4e2d\u542f\u52a8\u7684\u5b9e\u73b0\u903b\u8f91\u5b9e\u9645\u548c\u4efb\u52a1\u680f\u4e0a\u542f\u52a8\u5dee\u4e0d\u591a\u3002 \u9996\u5148\uff0c\u9700\u8981\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u542f\u52a8\u5668\u56fe\u6807\uff0c\u6216\u8005\u952e\u76d8super\u952e\uff0c\u5c06\u542f\u52a8\u5668\u547c\u51fa\u6765\uff0c \u7136\u540e\uff0c\u5728\u542f\u52a8\u5668\u4e2d\u70b9\u51fb\u5bf9\u5e94\u7684\u56fe\u6807\uff0c \u4f46\u662f\u8fd9\u91cc\u6709\u4e2a\u95ee\u9898\uff0c\u542f\u52a8\u5668\u4e2d\u7684\u5e94\u7528\u5217\u8868\uff0c\u4e00\u9875\u5c55\u793a\u4e0d\u5b8c\uff0c\u6240\u4ee5\u5982\u679c\u6211\u4eec\u8981\u70b9\u51fb\u7684\u5e94\u7528\u56fe\u6807\u4e0d\u5728\u7b2c\u4e00\u9875\u600e\u4e48\u529e\uff0c\u901a\u5e38\u89e3\u51b3\u65b9\u6848\u6709\u4e24\u79cd\uff1a \uff081\uff09\u9700\u8981\u8fdb\u884c\u5411\u4e0b\u6ed1\u52a8\uff0c\u8fd9\u91cc\u5c31\u6d89\u53ca\u5230\u76f8\u5e94\u7684\u8bc6\u522b\u65b9\u6848\uff0c\u5224\u65ad\u5982\u679c\u4e0d\u5728\u7b2c\u4e00\u9875\u5c31\u5f80\u4e0b\u6ed1\u52a8\u7ffb\u9875\u3002 \uff082\uff09\u542f\u52a8\u5668\u63d0\u4f9b\u641c\u7d22\u7684\u529f\u80fd\uff0c\u8f93\u5165\u5e94\u7528\u540d\u79f0\u641c\u7d22\uff0c\u7136\u540e\u8fdb\u884c\u70b9\u51fb\u3002 \u4ece\u5b9e\u9645\u64cd\u4f5c\u4e2d\u6765\u770b\uff0c\u91c7\u7528\u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u6548\u7387\u4f1a\u9ad8\u4e00\u70b9\u3002 \u3010\u7ec8\u7aef\u547d\u4ee4\u542f\u52a8\u3011 \u5728python\u4e2d\uff0c\u4f7f\u7528os.popen()\u6216os.system()\u6216\u8005subprocess.Popen()\uff0c\u5b9e\u73b0\u547d\u4ee4\u884c\u542f\u52a8\uff0c\u6bd4\u5982\uff1a import os\nos.popen('deepin-music')\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u8fdc\u7a0b\u6267\u884c\u811a\u672c\u7684\u65f6\u5019\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u7684\u95ee\u9898\u3002 \u3010\u603b\u7ed3\u3011 \u4ee5\u4e0a\u51e0\u79cd\u65b9\u6cd5\uff0c\u5404\u6709\u4f18\u7f3a\u70b9\uff0c\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff1a \uff081\uff09\u5982\u679c\u9700\u8981\u5728Jenkins\u4e2d\u505a\u6301\u7eed\u96c6\u6210\uff0c\u5efa\u8bae\u4f7f\u7528\u7b2c\u4e8c\u79cd\u4efb\u52a1\u680f\u542f\u52a8\u7684\u65b9\u6cd5\u3002 \uff082\uff09\u5982\u679c\u4e0d\u4f1a\u91c7\u7528\u8fdc\u7a0b\u6267\u884c\u7684\uff0c\u5efa\u8bae\u91c7\u7528\u7b2c\u4e00\u79cd\u6216\u8005\u6700\u540e\u4e00\u79cd\u65b9\u6848\u3002 \uff083\uff09\u7b2c\u4e09\u79cd\u548c\u7b2c\u56db\u79cd\u542f\u52a8\u65b9\u6cd5\uff0c\u901a\u5e38\u5728\u6d4b\u8bd5\u7528\u4f8b\u4e2d\u4f1a\u6d89\u53ca\u5230\uff0c\u6240\u4ee5\u5076\u5c14\u4f1a\u7528\u3002"},{"location":"RELEASE/","title":"\u7248\u672c\u66f4\u65b0\u8bb0\u5f55","text":""},{"location":"RELEASE/#2122023822","title":"2.1.2\uff082023/8/22\uff09","text":"new \u589e\u52a0 OCR \u8bc6\u522b\u81ea\u52a8\u91cd\u8bd5\u673a\u5236\uff0c\u9ed8\u8ba4\u91cd\u8bd5 2 \u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u91cd\u8bd5\u6b21\u6570\uff1b \u4f7f\u7528\u7a97\u7ba1\u6700\u65b0\u63d0\u4f9b\u7684\u4e8c\u8fdb\u5236\u63a5\u53e3\uff0c\u4f18\u5316\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u5728 Wayland \u4e0b\u83b7\u53d6\u7a97\u53e3\u4fe1\u606f\u7684\u65b9\u6cd5\uff1b\u611f\u8c22\u684c\u9762\u6d4b\u8bd5\u90e8 @\u4f55\u6743 @\u5b59\u7fe0 \u3001\u7a97\u7ba1\u7814\u53d1 @\u9ec4\u6cfd\u94ed \u7684\u5927\u529b\u652f\u6301\u3002 \u6269\u5145 skipif \u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\u51fd\u6570\uff1a skipif_xdg_type \u652f\u6301 x11 \u6216 wayland \u4e0a\u8df3\u8fc7\uff1b skipif_cpu_name \u652f\u6301\u4e0d\u540c cpu \u4e0a\u8df3\u8fc7\uff0c\u6bd4\u5982\uff1askipif_cpu_name-KLVVW5821\uff1b "},{"location":"RELEASE/#2102023818","title":"2.1.0\uff082023/8/18\uff09","text":"fix \u4fee\u590d SW \u67b6\u6784\u73af\u5883\u4f9d\u8d56\u7684\u95ee\u9898\uff0c\u539f\u56e0\u662f\u4e4b\u524d\u6211\u8fd9\u91cc\u672c\u5730\u6ca1\u6709 SW \u7684\u673a\u5668\uff0c\u6ca1\u6709\u505a\u76f8\u5173\u9002\u914d\uff1b \u4fee\u590d\u5b50\u9879\u76ee\u5355\u72ec\u9700\u8981\u4e09\u65b9\u5305 pexpect\uff0c\u7531\u4e8e\u4e4b\u524d\u662f\u9884\u88c5\u5230\u955c\u50cf\u91cc\u9762\u7684\uff0c\u4f46\u57fa\u7840\u6846\u67b6\u4e0d\u9700\u8981\uff0c\u56e0\u6b64\u6ca1\u6709\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u91cc\u9762\uff0c\u5bfc\u81f4\u5b50\u9879\u76ee\u4f9d\u8d56\u62a5\u9519\u3002 \u4fee\u590d\u5b50\u9879\u76ee cv \u5bfc\u5165\u62a5\u9519\u7684\u95ee\u9898\uff1b \u539f\u56e0\u4e3a\uff1ayouqu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u517c\u5bb9\u4e24\u79cd\u60c5\u51b5\uff0c\u4e00\u79cd\u662f\u9762\u5411\u670d\u52a1\uff0c\u5c31\u662f\u672c\u5730\u6d4b\u8bd5\u673a\u4e0d\u9700\u8981\u5b89\u88c5 OpenCV\uff0c\u7528\u4f8b\u4e2d\u7684\u56fe\u50cf\u8bc6\u522b\u4f1a\u901a\u8fc7\u8fdc\u7a0b\u670d\u52a1\u63a5\u53e3\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u548c\u7ed3\u679c\u83b7\u53d6\uff1b\u7b2c\u4e8c\u79cd\u662f\u539f\u751f\uff0c\u5c31\u662f\u672c\u5730\u76f4\u63a5\u5b89\u88c5 OpenCV \u76f4\u63a5\u7528\u3002\u4e24\u4e2a\u60c5\u51b5\u7684\u4f18\u5148\u7ea7\u662f\u4f18\u5148\u5224\u65ad\u672c\u5730\u5b58\u5728\uff0c\u5426\u5219\u8d70\u670d\u52a1\u3002 \u524d\u9762\u6211\u4eec\u5df2\u7ecf\u628a OCR \u529f\u80fd\u505a\u4e86\u670d\u52a1\u5316\uff0c\u57fa\u4e8e 1 \u5e74\u591a\u4ee5\u6765\u7684\u89c2\u5bdf\uff0c\u7528\u8d77\u6765\u5f88\u7a33\u5b9a\uff0c\u518d\u4e00\u4e2a\u5c31\u662f OpenCV \u5b89\u88c5\u5305\u662f\u6bd4\u8f83\u81c3\u80bf\u7684\uff0c\u7c97\u7565\u6570\u4e86\u4e0b\u4f9d\u8d56\u6709 30+ \u4e2a\uff0c\u800c\u4e14\u5728\u5404\u67b6\u6784\u4e0a\u4f9d\u8d56\u5305\u8fd8\u4e0d\u5c3d\u76f8\u540c\uff0c\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u65b9\u6848\u4e2d\u4e0d\u592a\u597d\u5904\u7406\uff0c\u6240\u4ee5\u672c\u6b21 2.0 \u7248\u672c\u6211\u4eec\u5927\u80c6\u7684\u5c06\u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u529f\u80fd\u4fee\u6539\u4e3a\u9762\u5411\u670d\u52a1\u7684\u65b9\u5f0f\uff0c\u524d\u671f\u6d4b\u8bd5\u4e00\u5207\u770b\u8d77\u6765\u90fd\u5f88\u548c\u8c10\u3002 \u4f46\u662f\u6ca1\u6ce8\u610f\u5230\u4e4b\u524d\u7ed9\u6d77\u71d5\u59d0\u90a3\u8fb9\u9879\u76ee\u5355\u72ec\u5b9a\u5236\u505a\u4e86\u4e2a\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\uff08\u4e3a\u4e86\u80fd\u7b80\u5355\u5e73\u6ed1\u7684\u8fc1\u79fb\u5230 youqu\uff09\uff0c\u6b64\u63a5\u53e3\u5e95\u5c42\u6ca1\u6709\u517c\u5bb9\u670d\u52a1\u5316\uff0c\u6240\u4ee5\u5979\u90a3\u8fb9\u7684\u9879\u76ee\u8c03\u7528\u6b64\u5b9a\u5236\u63a5\u53e3\u4f1a\u62a5 cv \u5bfc\u5165\u7684\u95ee\u9898\u3002 \u7531\u4e8e\u5c06\u8fd9\u4e2a\u5b9a\u5236\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\u8fdb\u884c\u670d\u52a1\u5316\u517c\u5bb9\u6539\u9020\u9700\u8981\u4e00\u5b9a\u65f6\u95f4\uff0c\u6539\u5b8c\u8fd8\u9700\u8981\u6d4b\u8bd5\uff0c\u4f46\u672c\u6b21\u65f6\u95f4\u6bd4\u8f83\u7d27\uff0c\u56e0\u6b64\u5148\u628a OpenCV \u88c5\u8fdb\u865a\u62df\u73af\u5883\uff0c\u540e\u7eed\u7248\u672c\u518d\u8003\u8651\u9488\u5bf9\u6b64\u63a5\u53e3\u505a\u4fee\u6539\u3002"},{"location":"RELEASE/#2002023816","title":"2.0.0\uff082023/8/16\uff09","text":"YouQu\uff08\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff09\u5f00\u6e90\u4e86\uff0c\u540c\u65f6\u63a8\u51fa\u4e86 2.0 \u7248\u672c\u3002 \u611f\u8c22\u738b\u6ce2\u603b\u3001\u67b6\u6784\u5e08\u5f90\u5c0f\u4e1c\u3001\u7814\u53d1\u7ecf\u7406\u90d1\u5e7c\u6208\u3001\u5218\u90d1\u7b49\u7814\u53d1\u540c\u4e8b\u7684\u5927\u529b\u652f\u6301\u3002 new 1\u3001\u65b0\u7684\u57fa\u7840\u6846\u67b6\u4ee3\u7801\u83b7\u53d6\u65b9\u5f0f\u53ca\u65b0\u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4 YouQu \u540e\u7eed\u5747\u901a\u8fc7 PyPI \u8fdb\u884c\u5305\u7684\u53d1\u5e03\uff0c\u4e5f\u5c31\u662f\u8bf4\u540e\u7eed\u53ef\u4ee5\u4f7f\u7528 pip \u8fdb\u884c\u5b89\u88c5\uff1a sudo pip3 install youqu==2.0.0\n \u8fd9\u91cc\u6709 2 \u4e2a\u5c0f\u70b9\u8981\u6ce8\u610f\uff1a \u63a8\u8350\u4f7f\u7528 sudo pip3 \uff08\u52a0 sudo\uff09\u8fdb\u884c\u5b89\u88c5\uff1b \u5982\u679c\u4e0d\u52a0 sudo \u6709\u4e9b\u673a\u5668\u53ef\u80fd $HOME/.local/bin \u4e0d\u5728\u7cfb\u7edf PATH \u73af\u5883\u76ee\u5f55\u4e0b\uff0c\u5728\u4e0d\u6dfb\u52a0\u73af\u5883\u53d8\u91cf\u7684\u60c5\u51b5\u4e0b\uff0c\u4f1a\u51fa\u73b0 YouQu \u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4\uff08youqu-startproject\uff09\u65e0\u6cd5\u4f7f\u7528\u7684\u95ee\u9898\uff1b \u5f53\u7136\uff0c\u5c06\u4e0a\u8ff0\u8def\u5f84\u6dfb\u52a0\u5230\u73af\u5883\u53d8\u91cf\u4e4b\u540e\u4e5f\u662f\u53ef\u4ee5\u7528\u7684\uff0c\u6240\u4ee5\u6211\u8fd9\u91cc\u662f\u63a8\u8350\u52a0 sudo\uff0c\u4e0d\u52a0 sudo \u4e5f\u662f\u53ef\u4ee5\u7684\uff0c\u53ea\u662f\u9700\u8981\u5173\u6ce8\u4e0b\u73af\u5883\u53d8\u91cf\u7684\u95ee\u9898\u3002 \u63a8\u8350\u6307\u5b9a\u7248\u672c\u53f7\uff08youqu==2.0.0\uff09\u5b89\u88c5\uff0c\u5982\u679c\u4e0d\u6307\u5b9a\u7248\u672c\u53f7\u9ed8\u8ba4\u662f\u5b89\u88c5\u6700\u65b0\u53d1\u5e03\u7684 YouQu \u7248\u672c\uff0c\u4f60\u53ef\u4ee5\u5728 PyPI \u4e0a\u7684 Release history \u91cc\u9762\u67e5\u770b\u6709\u54ea\u4e9b\u7248\u672c\u3002 \u5b89\u88c5\u4e4b\u540e\u4f1a\u81ea\u52a8\u751f\u6210\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu-startproject\uff0c\u4f7f\u7528\u5b83\u53ef\u4ee5\u521d\u59cb\u5316\u5de5\u7a0b\uff0c\u8fd9\u91cc\u4ee5\u97f3\u4e50\u4e3e\u4f8b\uff1b youqu-startproject autotest_deepin_music\n \u8fd9\u6837\u5c31\u4f1a\u5728\u5f53\u524d\u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a autotest_deepin_music \u76ee\u5f55\uff0c\u91cc\u9762\u5305\u542b\u4e86\u57fa\u7840\u6846\u67b6\u6240\u6709\u7684\u4ee3\u7801\uff1b \u4e4b\u540e\uff0c\u8fd8\u662f\u5728 apps \u76ee\u5f55\u4e0b\uff0c\u653e\u5165\u5b50\u9879\u76ee\u7684AT\u4ee3\u7801\u5373\u53ef\uff0c\u4f7f\u7528\u65b9\u6cd5\u548c\u8fc7\u53bb\u4e00\u6837\uff0c\u8fd9\u91cc\u5c31\u4e0d\u591a\u4ecb\u7ecd\u3002 \u53e6\u5916\uff0c\u9664\u4e86\u901a\u8fc7 pip \u83b7\u53d6\u4ee5\u5916\uff0c\u4ecd\u7136\u53ef\u4ee5\u901a\u8fc7\u6e90\u7801\u83b7\u53d6\uff08\u76f4\u63a5 git clone\uff09\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u4f7f\u7528 pip \u5b89\u88c5 YouQu \u65f6\uff0cYouQu \u5305\u7684\u5927\u5c0f\u624d 600+ k\uff0c\u5b89\u88c5\u901f\u5ea6\u8d77\u98de\u3002 2\u3001\u65b0\u7684AT\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848 \u4e3a\u4e86\u89e3\u51b3\u4ee5\u4e0b\u95ee\u9898\uff1a \u8fc7\u53bb\u4e00\u6bb5\u65f6\u95f4\u54b1\u4eec\u7ecf\u5e38\u51fa\u73b0\u7684\uff0c\u4e0d\u540c\u7684AT\u9879\u76ee\u5728\u540c\u4e00\u53f0\u673a\u5668\u4e0a\u90e8\u7f72\u73af\u5883\u65f6\u4f9d\u8d56\u7248\u672c\u51b2\u7a81\u7684\u95ee\u9898\uff0c\u65b0\u65b9\u6848\u4e0d\u540c\u7684\u9879\u76ee\u4f1a\u52a8\u6001\u751f\u6210\u81ea\u5df1\u7684\u865a\u62df\u73af\u5883\uff0c\u76f8\u4e92\u4e4b\u95f4\u4e0d\u5f71\u54cd\uff1b \u4e1a\u5185\u4e3a\u4e86\u89e3\u51b3\u7248\u672c\u51b2\u7a81\u95ee\u9898\u4e00\u822c\u90fd\u4f1a\u4f7f\u7528Python\u865a\u62df\u73af\u5883\u7684\u5de5\u5177\uff0c\u4f46\u662f\u90fd\u6709\u4e2a\u95ee\u9898\uff0c\u65e0\u6cd5\u7ba1\u7406 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u5305\uff0c\u672c\u6b21\u6211\u4eec\u89e3\u51b3\u4e86\u8fd9\u4e2a\u95ee\u9898\uff0c\u80fd\u591f\u5b8c\u5168\u7ba1\u7406\u5e38\u89c4\u7684Python\u5305\uff0c\u4e5f\u80fd\u7ba1\u7406\u5230 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u4e09\u65b9\u5305\uff1b \u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u4f7f\u7528\u65b9\u6cd5\uff1a bash env.sh\n \u53ef\u4ee5\u770b\u51fa\u6765\u548c\u539f\u6765\u4f7f\u7528\u65b9\u6cd5\u6ca1\u6709\u53d8\u5316\uff0c\u4e5f\u5c31\u662f\u8bf4\u4ece\u4f7f\u7528\u7684\u89d2\u5ea6\u662f\u5b8c\u5168\u6ca1\u6709\u533a\u522b\u7684\uff0c\u53ea\u662f\u5185\u90e8\u505a\u4e86\u4e0d\u540c\u7684\u4e8b\u60c5\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u672c\u673a\u90e8\u7f72\u7684\u529f\u80fd\u4ecd\u7136\u4fdd\u7559 env_dev.sh\uff0c\u53ef\u4ee5\u4f5c\u4e3a\u5f00\u53d1\u65f6\u7684\u73af\u5883\u90e8\u7f72\u3002 3\u3001\u65b0\u7684\u9a71\u52a8\u547d\u4ee4 \u8fc7\u53bb\u54b1\u4eec\u90fd\u662f\u4f7f\u7528\u8fd9\u6837\u7684\u547d\u4ee4\u6765\u9a71\u52a8\u6267\u884c\uff1a python3 manage.py run\n \u7531\u4e8e\u9ed8\u8ba4\u57fa\u4e8e\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848\uff0c\u56e0\u6b64\u6211\u4eec\u589e\u52a0\u4e86\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu\uff1b \u65b0\u7684\u9a71\u52a8\u65b9\u5f0f\uff1a youqu manage.py run\n \u53ea\u9700\u8981\u628a python3 \u66ff\u6362\u6210 youqu \u5c31\u53ef\u4ee5\u4e86\uff0c\u770b\u8d77\u6765\u5f88\u548c\u8c10~ 4\u3001\u65b0\u7684\u6587\u6863\u5730\u5740 \u8fc7\u53bb\u54b1\u4eec YouQu \u7684\u5728\u7ebf\u6587\u6863\u662f\u90e8\u7f72\u5728\u516c\u53f8\u5185\u7f51\u7684\uff0c\u73b0\u5728\u5f00\u6e90\u5230 github \u4e86\uff0c\u5916\u90e8\u5f00\u53d1\u8005\u80af\u5b9a\u8bbf\u95ee\u4e0d\u5230\u5185\u7f51\u7684\u6587\u6863\uff0c\u56e0\u6b64\u9700\u8981\u5c06\u6587\u6863\u90e8\u7f72\u5230\u516c\u7f51\u3010\u516c\u7f51\u6587\u6863\u3011\uff1b \u516c\u7f51\u6587\u6863\u4f7f\u7528\u7684\u662f github pages\uff08\u767d\u5ad6\u602a\u4e00\u987f\u72c2\u559c~~\uff09\uff0c\u4f46\u53ef\u80fd\u4f1a\u51fa\u73b0\u6587\u6863\u901f\u5ea6\u6162\u7684\u95ee\u9898\uff08\u4ee3\u7406\u4e0b\u5c31\u597d\u4e86\uff09\uff0c\u4e0d\u8fc7\u6ca1\u5173\u7cfb\uff0c\u54b1\u4eec\u3010\u5185\u7f51\u6587\u6863\u3011\u4ecd\u7136\u4fdd\u7559\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u3002 5\u3001\u5176\u4ed6\u4e00\u4e9b\u5c0f\u5c0f\u529f\u80fd\u66f4\u65b0\uff1a \uff081\uff09\u65b0\u589e\u5173\u95ed\u5206\u8fa8\u7387\u68c0\u6d4b\u7684\u53c2\u6570\u503c\uff1b youqu manage.py run --resolution no\n \u6216\u8005\u4fee\u6539 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387, \u6bd4\u5982\uff1a1920x1080\n;no: \u8868\u793a\u4e0d\u505a\u5206\u8fa8\u7387\u6821\u9a8c\nRESOLUTION = 1920x1080\n resolution \u8fd9\u4e2a\u53c2\u6570\u4e00\u76f4\u90fd\u6709\u7684\uff0c\u53ea\u4e0d\u8fc7\u4e4b\u524d\u662f\u7528\u4e8e\u6307\u5b9a\u5206\u8fa8\u7387\u5927\u5c0f\uff0c\u6bd4\u5982 --resolution 1920x1080\uff0c\u4f46\u6709\u4e9b\u63a5\u53e3\u7684\u9879\u76ee\u4e0d\u9700\u8981\u8fd9\u4e2a\u68c0\u67e5\uff0c\u53ef\u4ee5\u7ed9\u5b83\u4e2a no \u5c31\u597d\u4e86\uff0c\u5f53\u7136 CICD \u4e0a\u5173\u95ed\uff0c\u9700\u8981\u6d41\u6c34\u7ebf\u4e0a\u628a\u8fd9\u4e2a\u53c2\u6570\u52a0\u4e0a\uff1b \uff082\uff09\u65b0\u589e\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u7684\u547d\u4ee4\u884c\u53c2\u6570 \u4e4b\u524d\u8fd9\u4e2a\u914d\u7f6e\u9879\u53ea\u80fd\u5728 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c 1 \u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff0cRERUN >= RECORD_FAILED_CASE\u3002\n;1.\u5173\u95ed\u5f55\u5c4f\uff1aRECORD_FAILED_CASE > RERUN\n;2.\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1aRECORD_FAILED_CASE = 0\nRECORD_FAILED_CASE = 1\n \u73b0\u5728\u5c06\u5f00\u53d1\u5230\u547d\u4ee4\u884c\u53c2\u6570\u3002 youqu manage.py run --record_failed_case 2\n fix \u4fee\u590d remote \u6267\u884c\u65f6\uff0c\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u65e0\u6cd5\u751f\u6210\u6d4b\u8bd5\u62a5\u544a\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1302023710","title":"1.3.0\uff082023/7/10\uff09","text":"fix \u8fdb\u4e00\u6b65\u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b\u53c2\u8003\uff1a\u914d\u7f6ePython\u6e90\u7684\u51e0\u79cd\u65b9\u6cd5 \u4fee\u590d wayland_autotool \u53d7\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86wayland\u4e0b\u5076\u73b0\u627e\u4e0d\u5230 .Xauthority \u6587\u4ef6\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1292023626","title":"1.2.9\uff082023/6/26\uff09","text":"fix \u4f18\u5316\u8fdc\u7a0b\u6267\u884c remote \u7684\u53c2\u6570\u76f4\u63a5\u4f20\u7ed9\u8fdc\u7a0b\u673a\u5668\u7684 run \u547d\u4ee4\uff0c\u4e0d\u7528\u518d\u5355\u72ec\u5904\u7406\u8fdc\u7a0b\u6267\u884c\u7684\u53c2\u6570\u903b\u8f91\uff0c\u540e\u7eed\u4e13\u6ce8\u4e8e\u672c\u5730\u6267\u884c\u529f\u80fd\u5f00\u53d1\uff0c\u8fdc\u7a0b\u6267\u884c\u81ea\u52a8\u9002\u7528\uff1b env.sh \u79fb\u9664 pyyaml \u5b89\u88c5\uff0c\u7531\u5b50\u9879\u76ee\u5728 requirement.txt \u91cc\u9762\u5b9a\u4e49\uff0c\u6846\u67b6\u81ea\u52a8\u52a0\u8f7d\uff1b \u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b "},{"location":"RELEASE/#128202369","title":"1.2.8\uff082023/6/9\uff09","text":"fix \u4fee\u590d\u4e86 pypi \u5b89\u88c5 numpy \u5b58\u5728\u7cfb\u7edf\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#127202368","title":"1.2.7\uff082023/6/8\uff09","text":"fix env.sh \u4e2d\u5b89\u88c5 Python \u5305\u672a\u6307\u5b9a\u7248\u672c\u65f6\uff0c\u65e5\u5fd7\u8f93\u51fa\u5b89\u88c5\u7684\u7248\u672c\uff1b pdocr-rpc 2.0.1\nallure-custom 1.2.1\nfunnylog 1.1.3\n \u4fee\u590d -f \u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u62a5\u9519\u7684\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#126202367","title":"1.2.6\uff082023/6/7\uff09","text":"fix \u4fee\u590d wayland \u4e0a\u8c03\u7528\u9f20\u6807\u4e2d\u952e\u3001\u53f3\u952e\u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b \u4fee\u590d pubilic/dde_desktop_public_widget \u91cc\u9762\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u5b9a\u4f4d\u684c\u9762\u6587\u4ef6\u7684\u65b9\u6cd5\uff0c\u5750\u6807\u6ca1\u6709\u62c6\u5305\u7684\u95ee\u9898\uff1b \u4f18\u5316\u4e86\u7b49\u5f85\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b pycreeze \u7248\u672c\u5347\u7ea7\u5230 0.1.29\uff0c\u5bfc\u81f4\u4e0e pyautogui 0.9.53 \u4e0d\u517c\u5bb9\uff0cenv.sh \u91cc\u9762\u589e\u52a0\u6307\u5b9a pycreeze \u7248\u672c\u4e3a 0.1.28\uff1b "},{"location":"RELEASE/#1252023516","title":"1.2.5\uff082023/5/16\uff09","text":"new --app \u53c2\u6570\u540e\u9762\u65b0\u589e\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u76ee\u524d\u652f\u6301\u4e09\u79cd\u53c2\u6570\u4f20\u5165\u65b9\u5f0f\uff1a ~$: youqu run -a deepin-music\n~$: youqu run -a autotest_deepin_music\n~$: youqu run -a apps/autotest_deepin_music\n \u200b \u540e\u4e24\u79cd\u5165\u53c2\u65b9\u5f0f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\u3002 remote \u8fdc\u7a0b\u6267\u884c\u65b0\u589e\u4ece\u547d\u4ee4\u884c\u4f20\u5165\u6d4b\u8bd5\u673a\u4fe1\u606f\uff0c\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679c password \u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6 setting/remote.ini \u4e2d CLIENT_PASSWORD \u7684\u503c,\u6bd4\u5982\uff1auos@10.8.13.33:1 \u6216 uos@10.8.13.33 \uff1b python3 manage.py remote -c uos@10.8.13.33/uos@10.8.13.34\npython3 manage.py remote -c uos@10.8.13.33:1/uos@10.8.13.34:2\n fix \u65e5\u5fd7\u6a21\u5757\u4fee\u6539\u4e3a\u51fd\u6570\u6267\u884c\u4e4b\u524d\u6253\u5370\u65e5\u5fd7\uff1b \u65e5\u5fd7\u6a21\u5757\u589e\u52a0\u767d\u540d\u5355\uff0c\u901a\u8fc7\u7c7b\u540d\u5f00\u5934\uff0c\u7ed3\u675f\uff0c\u5305\u542b\u7b49\u5173\u952e\u5b57\u63a7\u5236\u9700\u8981\u6253\u5370\u7684\u51fd\u6570\u65e5\u5fd7\uff1b \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5982\u679c\u4f20\u5165\u4e86 app_name \u53ea\u4f1a\u5c06 apps \u76ee\u5f55\u4e0b app_name \u7684\u76ee\u5f55\u53d1\u9001\u5230\u6d4b\u8bd5\u673a\uff1b env.sh \u79fb\u9664 python3-dev\uff1b \u4fee\u590d Wayland \u4e0b env.sh \u73af\u5883\u5b89\u88c5\u5931\u8d25\u7684\u95ee\u9898\uff0c\u4f18\u5316\u4e86 deb \u4f9d\u8d56\u5b89\u88c5\u7684\u903b\u8f91\uff1b \u5c06 env.sh \u5237\u65b0\u6e90\u7684\u65e5\u5fd7\u5728\u7ec8\u7aef\u663e\u793a\uff0c\u89e3\u51b3\u5728 CI \u73af\u5883\u4e0b\uff0c\u957f\u65f6\u95f4\u4e0d\u8f93\u51fa\u65e5\u5fd7\u8fde\u63a5\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d1060 \u534e\u4e3a\u673a\u578b\u5b89\u88c5\u952e\u9f20\u5de5\u5177\u65f6\u4f9d\u8d56\u4e0d\u517c\u5bb9\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1242023227","title":"1.2.4\uff082023/2/27\uff09","text":"fix \u4fee\u6539 CURRENT \u6587\u4ef6\uff1b "},{"location":"RELEASE/#1232023227","title":"1.2.3\uff082023/2/27\uff09","text":"new pylint.sh \u652f\u6301\u901a\u8fc7\u4f4d\u7f6e\u53c2\u6570\u4f20\u5165\u6587\u4ef6\u8def\u5f84\uff1abash pylint.sh apps/autotest_deepin_music,\u597d\u5904\u662f\u53c2\u6570\u8def\u5f84\u53ef\u4ee5\u5728\u7ec8\u7aef\u8865\u5168\uff1b \u65b0\u589e\u7cfb\u7edf\u547d\u4ee4 youqu-pylint \uff0c\u7528\u4e8e\u9759\u6001\u4ee3\u7801\u626b\u63cf\uff0c\u4f7f\u7528\u65b9\u6cd5: youqu-pylint apps/autotest_deepin_music\uff1b \u7531\u4e8e\u7cfb\u7edf\u4e00\u4e9b dbus \u63a5\u53e3\u6539\u53d8\uff0c\u516c\u5171\u5e93\u4e2d\u7684 dbus \u65b9\u6cd5\u5c06\u4e0d\u518d\u7ef4\u62a4\uff0c\u7531\u5b50\u9879\u76ee\u5728 other_widget.py \u91cc\u9762\u8fdb\u884c\u7ef4\u62a4\uff1b fix \u4fee\u590d ssh \u73af\u5883\u4e0b\u8fd0\u884c\u63d0\u793a \u201c\u65e0\u6cd5\u8fde\u63a5\u201d \u7684\u95ee\u9898\uff1b \u4fee\u590d\u8fd0\u884c\u65f6\u7a0b\u5e8f\u9000\u51fa\uff0c\u4e0d\u8f93\u51fa\u5f02\u5e38\u65e5\u5fd7\u7684\u95ee\u9898\uff1b \u4fee\u590dyouqu remote xxx \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5728\u670d\u52a1\u7aef Ctrl + C \u65e0\u6cd5\u505c\u6b62\u7a0b\u5e8f\u8fd0\u884c\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#122202328","title":"1.2.2\uff082023/2/8\uff09","text":"new \u65b0\u589e\u6c14\u6ce1\u7c7b\u56fe\u50cf\u8bc6\u522b\u65b9\u6848\uff1bimage_utils.py::ImageUtil::get_during\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u533a\u57df\u8bc6\u522b\uff0c\u4f20\u5165 [x, y, w, h]\uff0cx: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u76ee\u6807\u56fe\u7247\uff0c\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\uff1b env.sh \u79fb\u9664 pypinyin; \u4f18\u5316\u6267\u884c env.sh \u65f6\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b manage.py \u79fb\u9664\u4e86\u53c2\u6570 session_timeout \uff0c\u6846\u67b6\u6839\u636e\u5168\u5c40\u7684 timeout \u4ee5\u53ca\u7528\u4f8b\u81ea\u5b9a\u4e49\u7684 timeout \u81ea\u52a8\u8ba1\u7b97\u51fa sessiontimeout \u7684\u503c\uff1b \u65b0\u589e ocr \u670d\u52a1\u5668\u94fe\u63a5\u91cd\u8bd5\uff0c\u9ed8\u8ba4\u91cd\u8bd51\u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u53c2\u6570\uff1b fix \u4fee\u590d\u4e86\u4e00\u4e9b pylint \u626b\u63cf\u7684\u4ee3\u7801\u98ce\u683c\u95ee\u9898\uff1b \u91cd\u65b0\u8bbe\u8ba1\u4e86\u6d4b\u8bd5\u62a5\u544a\u4e3b\u9898\uff1b "},{"location":"RELEASE/#121202316","title":"1.2.1\uff082023/1/6\uff09","text":"new \u652f\u6301\u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6267\u884c\u7528\u4f8b\uff1b\u53ef\u5c06python3 manage.py \u66ff\u6362\u4e3a youqu \uff1a youqu run -a deepin-music -k 001\n RPC \u670d\u52a1 IP \u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u6307\u5b9a\u4e0d\u540c\u7684\u7aef\u53e3\uff1b \u5728\u7ebf\u6587\u6863\u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u539f\u6765\u7684\u5730\u5740 10.8.10.215 \u5c06\u4e0d\u5728\u4f7f\u7528\uff1b fix \u4fee\u590d --count \u53c2\u6570\u53ef\u80fd\u51fa\u73b0\u4e0e\u5176\u4ed6\u6846\u67b6\u7684\u5de5\u7a0b\u4f9d\u8d56\u5b58\u5728\u51b2\u7a81\uff0c\u62a5\u9519\u91cd\u590d\u6ce8\u518c\u7684\u95ee\u9898\uff1b \u4fee\u590d CI \u73af\u5883\u4e0b\u591a\u4e2a\u5de5\u7a0b\u5b58\u5728 Python \u73af\u5883\u53d8\u91cf\u6307\u5411\u9519\u8bef\uff0c\u5bfc\u5305\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u5355\u72ec\u8fd0\u884c\u65b9\u6cd5\u65f6\u65e0\u65e5\u5fd7\u8f93\u51fa\u7684 Bug\uff1b "},{"location":"RELEASE/#12020221230","title":"1.2.0\uff082022/12/30\uff09","text":"1.1.4 \u7248\u672c\u9002\u914d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e14\u65b0\u589e\u4e86\u8f83\u591a\u65b0\u7279\u6027\uff0c\u6211\u4eec\u8ba1\u5212\u4f7f\u7528 1.1.4 \u7248\u672c\u8fd0\u884c\u4e00\u6bb5\u65f6\u95f4\uff0c1.2.0 \u7248\u672c\u5c06\u4fee\u590d\u671f\u95f4\u51fa\u73b0\u7684 Bug\uff0c\u7136\u540e\u4f5c\u4e3a\u7a33\u5b9a\u7248\u672c\u53d1\u5e03\u3002 new \u4fee\u6539\u5de5\u7a0b\u540d\u79f0\u4e3a youqu\uff1b \u5c06 sphinx \u6587\u6863\u5de5\u7a0b\u8fc1\u79fb\u5230\u5355\u72ec\u7684\u4ed3\u5e93\uff1b fix \u4fee\u590d startapp \u521b\u5efa\u5de5\u7a0b\u65f6\u5b58\u5728\u5de5\u7a0b\u540d\u79f0\u65f6\u65e0\u6cd5\u7ee7\u7eed\u521b\u5efa\uff1b \u4fee\u590d\u4e86 OCR \u670d\u52a1\u5728\u5e76\u53d1\u65f6\u53ef\u80fd\u51fa\u73b0\u65e0\u6cd5\u8fd4\u56de\u7ed3\u679c\u7684\u95ee\u9898\uff0c\u63d0\u5347 OCR \u670d\u52a1\u9ad8\u5e76\u53d1\u7a33\u5b9a\u6027\uff1b \u4fee\u590d PMS \u540c\u6b65\u6807\u7b7e\u5230 CSV \u6587\u4ef6\u4e0d\u652f\u6301\u7528\u4f8b\u5e93\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11420221214","title":"1.1.4\uff082022/12/14\uff09","text":"new \u65b0\u589e startapp \u5b50\u547d\u4ee4\u521b\u5efa\u5b50\u9879\u76ee\u5de5\u7a0b\u6a21\u677f: python3 manage.py startapp autotest_deepin_xxx \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u91cd\u590d\u6267\u884c\u6b21\u6570\uff1b \u53bb\u6389\u6279\u91cf\u6267\u884c\u524d\u6536\u96c6\u7528\u4f8b\u7684\u6b65\u9aa4\uff1b \u589e\u52a0\u5f00\u59cb\u6267\u884c\u65f6\u6253\u5370\u4e00\u4e9b\u6267\u884c\u53c2\u6570\uff0c\u5982\uff1a \u7528\u4f8b\u6536\u96c6\u6570\u91cf: 99\n\u5931\u8d25\u91cd\u8dd1\u6b21\u6570: 1\n\u6700\u5927\u5931\u8d25\u6b21\u6570: 49\n\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4: 200.0s (03\u520620\u79d2)\n\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4: 11880s (3\u5c0f\u65f618\u52060\u79d2)\n \u5b9a\u5236\u4fee\u6539allure\u62a5\u544alogo\u3001title\u3001\u9ed8\u8ba4\u8bed\u8a00\uff1b manage.py \u6267\u884c\u5f00\u59cb\u65f6\u6253\u5370 logo \u548c\u5f53\u524d\u7248\u672c\uff1a \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u255a\u2588\u2588\u2557 \u2588\u2588\u2554\u255d \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2584\u2584 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2580\u2580\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u2584\u2588 \u2584\u2588 \u2588 \u2588 \u2588 \u2584 \u2588 \u2584 \u2580\u2580\u2588 \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\uff1b \u88c5\u9970\u5668\u65b9\u6cd5\u6307\u5b9a\u6b21\u6570\uff1b @pytest.mark.count(2)\ndef test_music_001():\npass\n \u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u6b21\u6570\uff1b python3 manage.py run -a deepin-music -k 001 --count 2\n \u200b image_utils \u589e\u52a0\u51fd\u6570 save_temporary_picture\uff0c\u652f\u6301\u6307\u5b9a\u5c4f\u5e55\u533a\u57df\u622a\u56fe\u5e76\u8fd4\u56de\u56fe\u7247\u5b58\u653e\u7684\u672c\u5730\u8def\u5f84\uff0c\u540e\u7eed\u4f7f\u7528 assert_image_exist \u8fdb\u884c\u65ad\u8a00 Python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(x, y, width, height) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) button_center \u65b0\u589e btn_size \u83b7\u53d6\u63a7\u4ef6\u5de6\u4e0a\u89d2\u5750\u6807\u53ca\u957f\u5bbd\uff0c\u7528\u4e8e\u52a8\u6001\u7684\u622a\u53d6\u5143\u7d20\u7684\u56fe\u7247\uff0c\u53ef\u7528\u4e8e\u5b9a\u4f4d\u65ad\u8a00 python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u6240\u6709\u97f3\u4e50\u6309\u94ae\")) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) allure \u62a5\u544a\u4e2d\u5b9a\u4f4d\u95ee\u9898\u9664\u4e86\u65e5\u5fd7\u3001\u622a\u56fe\u3001\u5f55\u5c4f\u5916\uff0c\u8c03\u7528\u7684\u51fd\u6570\u589e\u52a0\u4e86 step \u6b65\u9aa4\u5c55\u793a\uff1b env.sh \u65b0\u589e\u5b89\u88c5\u5b50\u9879\u76ee Python \u4e09\u65b9\u4f9d\u8d56\uff0c\u5728\u5b50\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u5199 requirement.txt \u6587\u4ef6\uff0cenv.sh \u4f1a\u81ea\u52a8\u52a0\u8f7d\uff1b ocr \u8bc6\u522b\u65b0\u589e\u652f\u6301\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\u8fdb\u884c\u6587\u5b57\u8bc6\u522b\uff0c\u51cf\u5c11\u56e0\u5168\u5c4f\u8bc6\u522b\u65f6\uff0c\u5176\u4ed6\u6587\u5b57\u7684\u5e72\u6270 Python # \u65ad\u8a00\u97f3\u4e50\u7684\u5220\u9664\u5f39\u7a97\u4e2d\uff0c\u5305\u542b\u4e86\u201c\u786e\u8ba4\u201d\u7684\u6587\u5b57 self.assert_ocr_exist(\"\u786e\u8ba4\", picture_abspath=DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u5220\u9664\u5f39\u7a97\"))) \u65ad\u8a00\u51fd\u6570\u7684\u8c03\u7528\u4e5f\u4f1a\u81ea\u52a8\u6253\u5370\u65e5\u5fd7; env.sh \u65b0\u589e\u88c1\u526a\u4f9d\u8d56\u7684\u65b9\u6848\uff1b fix \u4fee\u590d Jenkins \u73af\u5883\u4e0b\uff0c apps \u76ee\u5f55\u4e0b\u5b50\u9879\u76ee\u5b58\u5728 auotest_deepin_xxx@tmp \u76ee\u5f55\uff0c\u5728\u4f20\u5165 app_name \u540e\u65e0\u6cd5\u6267\u884c\u7528\u4f8b\u7684\u95ee\u9898\uff1b \u4fee\u590d\u81ea\u52a8\u751f\u6210 case_list.csv \u6587\u4ef6\u65f6\uff0c\u7528\u4f8b\u987a\u5e8f\u88ab\u8c03\u6574\u7684\u95ee\u9898\uff1b env.sh \u73af\u5883\u5b89\u88c5\u79fb\u9664 git \u548c curl\uff1b \u4fee\u590d\u7528\u4f8b\u5728 setup \u9636\u6bb5\u62a5\u9519\u540e\uff0c\u672a\u5199\u5165 ci_result.json \u7684\u95ee\u9898\uff1b \u79fb\u9664 uos_ci.py\uff1b "},{"location":"RELEASE/#11320221028","title":"1.1.3\uff082022/10/28\uff09","text":"new \u65b0\u589e\u56fe\u50cf\u65ad\u8a00\u6210\u529f\u8f93\u51fa\u5339\u914d\u5ea6\uff1b \u65b0\u589e\u73af\u5883\u5b89\u88c5 yaml \u4f9d\u8d56\uff1b \u65b0\u589e\u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6570\u636e\u56de\u586b\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b \u65b0\u589e\u6d4b\u8bd5\u7ed3\u679c\u8868\u60c5\u663e\u793a\uff0c\u5e76\u4f18\u5316\u4e86\u65e5\u5fd7\u7684\u6392\u7248\uff1b \u65b0\u589e --top {number} \u7528\u4e8e\u8bb0\u5f55\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0c\u65e5\u5fd7\u751f\u6210\u5230 report/logs/top.log\uff1b fix \u4fee\u590d\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4f46\u7ec8\u7aef\u6ca1\u6709\u9519\u8bef\u65e5\u5fd7\u8f93\u51fa\u7684\u95ee\u9898\uff1b \u4fee\u6539\u5931\u8d25\u7528\u4f8b\u56de\u6eaf\u65e5\u5fd7\u4e3a\u8be6\u7ec6\u7ea7\u522b\uff1b \u4fee\u590d\u4e86\u6267\u884c\u8fdb\u5ea6\u672a\u8ba1\u7b97\u8df3\u8fc7\u7528\u4f8b\u7684\u95ee\u9898\uff0c\u5e76\u4f18\u5316\u4e86\u8fdb\u5ea6\u83b7\u53d6\u7684\u7b97\u6cd5\uff1b \u4fee\u590d env.sh \u5728 V23 \u73af\u5883\u4e0b\u5b89\u88c5\u65e0\u6cd5\u8bfb\u53d6\u5bc6\u7801\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 pms \u6d4b\u8bd5\u5957\u6267\u884c\u6216\u6d4b\u8bd5\u5355\u6267\u884c\u65f6\uff0c\u7528\u4f8bID\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b env.sh \u91cc\u9762 hub.deepin.com \u66f4\u6362\u6210 it.uniontech.com\uff1b uos_ci.py \u6d4b\u8bd5\u7ed3\u679c\u7edf\u8ba1\u65f6\uff0c\u603b\u6570\u5254\u9664 skip \u7684\u6570\u91cf "},{"location":"RELEASE/#11220220921","title":"1.1.2\uff082022/09/21\uff09","text":"new \u5728\u6ca1\u6709\u5b89\u88c5 dogtail \u7684\u60c5\u51b5\u4e0b\uff0c\u4e5f\u80fd\u4f7f\u7528 sniff \u5de5\u5177\uff1b fix \u4fee\u590d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e2d\u6ca1\u6709\u5b89\u88c5 AT \u73af\u5883\u6267\u884c uos_ci.py \u62a5\u9519\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11120220919","title":"1.1.1\uff082022/09/19\uff09","text":"new \u65b0\u589e\u6267\u884c\u8fdb\u5ea6\u663e\u793a\uff0c\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u65f6\u65e5\u5fd7\u8f93\u51fa\u5f53\u524d\u8fdb\u5ea6\uff1a[\u5f53\u524d\u6307\u5b9a\u7b2c\u51e0\u6761/\u7528\u4f8b\u603b\u6570]\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u7528\u4f8b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\u6240\u6709\u5931\u8d25\u7528\u4f8b\u7684\u5217\u8868\uff1b \u5173\u95ed\u7ec8\u7aef\u8f93\u51fa\u6355\u83b7\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u65e5\u5fd7\u5feb\u7167\uff1b \u4f18\u5316\u7ec8\u7aef\u8f93\u51fa\u5931\u8d25\u4fe1\u606f\u5197\u957f\u4e3a\u7b80\u8981\u4fe1\u606f\u8f93\u51fa\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u663e\u793a 10 \u4e2a\u6267\u884c\u6700\u6162\u7684\u7528\u4f8b\u5217\u8868\uff0c\u5e76\u8be6\u7ec6\u5217\u51fa\u5404\u4e2a\u9636\u6bb5\u7684\u8017\u65f6\uff1b \u5931\u8d25\u91cd\u8dd1\u7528\u4f8b\u91cd\u8dd1\u4e4b\u524d\u5ef6\u8fdf 1 \u79d2\uff1b \u65b0\u589e\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4ecd\u7136\u5f3a\u5236\u6267\u884c\uff1b \u7528\u4f8b\u6536\u96c6\u65f6\u4ec5\u5728 apps \u76ee\u5f55\u4e0b\u8fdb\u884c\uff0c\u5ffd\u7565 src,setting,public \u76ee\u5f55\uff1b \u65b0\u589e allure \u62a5\u544a\u5907\u4efd\u529f\u80fd\uff0c\u9ed8\u8ba4\u5907\u4efd\u81f3 allure_back \u76ee\u5f55\u4e0b\uff1b manage.py\u65b0\u589e\u53c2\u6570 --lastfailed \u7528\u4e8e\u53ea\u8dd1\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\u7684\u529f\u80fd\uff1b fix \u4fee\u590d\u4e86\u5728\u6ca1\u6709\u6307\u5b9a\u5e94\u7528\u540d\u79f0\u6267\u884c\u65f6\uff0cxml \u62a5\u544a\u751f\u6210\u8def\u5f84\u5f02\u5e38\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 uos_ci.py \u4f20\u5165 timeout \u548c session_timeout \u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11020220916","title":"1.1.0\uff082022/09/16\uff09","text":"new \u65b0\u589ePMS\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u652f\u6301\u591a\u79cd\u6570\u636e\u56de\u586b\u6a21\u5f0f\uff1b \u4f18\u5316\u4e86\u901a\u8fc7\u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u65f6PMS \u722c\u866b\u7684\u6027\u80fd\uff1b \u65b0\u589e .gitmodules \u6587\u4ef6\uff0c\u7528\u4e8e\u6807\u8bb0\u6240\u6709\u5b50\u9879\u76ee\uff0c\u65b9\u4fbf\u7edf\u4e00\u62c9\u53d6\u4ee3\u7801\uff1b env.sh \u9002\u914d\u793e\u533a\u7248\u4e0a\u5b89\u88c5\u81ea\u52a8\u5316\u73af\u5883\uff1b \u589e\u52a0\u6267\u884c\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u9519\u8bef\u7684\u529f\u80fd\uff1b README.md \u589e\u52a0 Wayland \u4e0b\u4f7f\u7528\u3001\u6d4b\u8bd5\u62a5\u544a\u67e5\u770b\u3001\u5e38\u89c1\u95ee\u9898\u7b49\u7684\u6587\u6863\u8bf4\u660e\uff1b \u589e\u52a0\u4e86\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u5bf9 setup\u3001call\u3001teardown \u8fdb\u884c\u65e5\u5fd7\u5206\u6bb5\uff1b fix \u4fee\u590d\u4e86 \u786e\u8ba4\u4fee\u590d \u5217\u6ca1\u5199\u8868\u5934\uff0c\u4f46\u5199\u4e86 fixed-xxx \u6807\u7b7e\uff0c\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u540c\u4e00\u5e94\u7528\u5185\u591a\u4e2a csv \u6587\u4ef6\u4e2d \u786e\u8ba4\u4fee\u590d \u5217\u6709\u7684\u5199\u4e86\uff0c\u6709\u7684\u6ca1\u5199\uff0c\u53ef\u80fd\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 INFO \u65e5\u5fd7\uff0c\u663e\u793a\u4e3a DEBUG \u7684\u95ee\u9898\uff1b\u4fee\u590d\u4e86\u90e8\u5206\u673a\u5668\u4e0a INFO \u65e5\u5fd7\u5185\u5bb9\u663e\u793a\u4e3a\u7ea2\u8272\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\u770b\u4e0d\u5230\u8be6\u7ec6\u4fe1\u606f\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10220220822","title":"1.0.2\uff082022/08/22\uff09","text":"new \u79fb\u9664 loguru\uff0c\u66ff\u6362\u4e3a logging\uff0c\u63a5\u53e3\u4fdd\u6301\u4e0d\u53d8\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u53d7\u5f71\u54cd\uff1b \u9ed8\u8ba4\u5f00\u542f coredump\uff1b fix \u4fee\u590d\u4e86\u4e09\u65b9\u5e93 loguru \u5076\u73b0\u5f02\u5e38\uff0c\u5bfc\u81f4\u7a0b\u5e8f\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7b2c\u4e00\u6b21\u5931\u8d25\u4e0d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10120220812","title":"1.0.1\uff082022/08/12\uff09","text":"new \u65b0\u589e RELEASE.md \u6587\u4ef6\uff0c\u7528\u4e8e\u8bb0\u5f55\u5386\u53f2\u53d1\u5e03\u7248\u672c\u7684\u66f4\u65b0\u5185\u5bb9\uff1b \u517c\u5bb9 Wayland \u6a21\u5f0f\u4e0b\u6267\u884c\u7528\u4f8b\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u7528\u7ba1\u5f53\u524d\u6d4b\u8bd5\u673a\u6267\u884c\u73af\u5883\uff0c\u6846\u67b6\u4f1a\u81ea\u52a8\u6839\u636e\u5f53\u524d\u73af\u5883\u8d70\u4e0d\u540c\u7684\u4ee3\u7801\u903b\u8f91\uff1b \u7531\u4e8e\u9700\u8981\u4fee\u6539 dogtail \u6e90\u4ee3\u7801\uff0c\u56e0\u6b64\u5c06\u4fee\u6539\u540e\u7684\u6e90\u7801\u653e\u5165\u5230\u6838\u5fc3\u5e93\u91cc\u9762 src/depends/dogtail \u540e\u7eed\u7248\u672c\u5c06\u4e0d\u9700\u8981\u5728\u7cfb\u7edf\u4e2d\u5b89\u88c5dogtail\uff1b \u5982\u679c\u5e94\u7528\u5e93\u540c\u6837\u4f7f\u7528\u4e86\u7cfb\u7edf\u5b89\u88c5\u7684 dogtail \u53ef\u80fd\u4f1a\u62a5\u9519\uff0c\u89e3\u51b3\u65b9\u6848\u662f\u5c06\u4ee3\u7801\u4e2d\u7684 import dogtail \u4fee\u6539\u4e3a from src.depends import dogtail ; fix \u91cd\u8dd1\u5931\u8d25\u4e4b\u540e\u624d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff0c\u4fee\u6539\u4e3a\u5931\u8d25\u4e4b\u540e\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":"# Attribution \uff1achengdu Test Team\n# Date \uff1a2021/08/20\n \u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d \u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d \u4ed3\u5e93\u5730\u5740\uff1ahttps://gitlabcd.uniontech.com/autotest/cd-desktop-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u65b9\u6848\u6982\u8ff0","text":"\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u667a\u80fd\u8bc6\u522b\u5e94\u7528\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u7528\u4e8e\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u64cd\u4f5c\u8fc7\u7a0b\u4e2d\u7684\u5143\u7d20\u5b9a\u4f4d\u4ee5\u53ca\u5224\u65ad\u7ed3\u679c\u65f6\u7684\u65ad\u8a00\u5904\u7406\uff1b\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\uff0c\u6d4b\u8bd5\u673a\u4e0a\u7684\u753b\u9762\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u5230\u670d\u52a1\u5668\u4e0a\uff0c\u670d\u52a1\u5668\u5bf9\u89c6\u9891\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\u540e\uff0c\u670d\u52a1\u5668\u667a\u80fd\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\u6210\u529f\uff0c\u7136\u540e\u5bf9\u6d4b\u8bd5\u673a\u4e0b\u53d1\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\uff0c\u6d4b\u8bd5\u673a\u63a5\u53d7\u5e76\u6267\u884c\u4e0b\u4e00\u6b65\u64cd\u4f5c\u3002 \u670d\u52a1\u5668\u4e0e\u6d4b\u8bd5\u673a\u4e4b\u95f4\u7684\u94fe\u63a5\uff1a \u670d\u52a1\u5668\u901a\u8fc7 USB \u4e32\u53e3\u8bbe\u5907\uff08USB-HID \u534f\u8bae\uff09\u6a21\u62df\u9f20\u6807\u952e\u76d8\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u64cd\u4f5c\u3002 \u901a\u8fc7\u89c6\u9891\u91c7\u96c6\u8bbe\u5907\u6355\u83b7\u6d4b\u8bd5\u673a\u7684\u5b9e\u65f6\u753b\u9762\u4f20\u8f93\u7ed9\u670d\u52a1\u5668\u3002 \u670d\u52a1\u5668\u5bf9\u91c7\u96c6\u7684\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\uff0c\u8bc6\u522b\u5176\u4e2d\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5e76\u8fd4\u56de\u5143\u7d20\u63a7\u4ef6\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\uff0c\u670d\u52a1\u5668\u901a\u8fc7\u667a\u80fd\u5316\u5206\u6790\uff0c\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e00\u81f4\u5c06\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\u901a\u8fc7\u4e32\u53e3\u6a21\u62df\u952e\u9f20\u4fe1\u53f7\u53d1\u9001\u7ed9\u6d4b\u8bd5\u673a\uff1b\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e0d\u4e00\u81f4\u5c06\u4f1a\u8fdb\u5165\u4e2d\u65ad\u5904\u7406\u53ca\u5f02\u5e38\u7ed3\u679c\u8f93\u51fa\uff0c\u7ee7\u7eed\u6267\u884c\u540e\u7eed\u573a\u666f\uff0c\u76f4\u81f3\u6240\u6709\u7528\u4f8b\u6d4b\u8bd5\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u6df1\u5ea6\u5b66\u4e60\u73af\u5883\u642d\u5efa","text":"\u6a21\u578b\u8bad\u7ec3\u4e3b\u8981\u5bf9 GPU \u6709\u8981\u6c42\uff0c\u8bad\u7ec3\u6a21\u578b\u7684\u673a\u5668\u663e\u5b58\u4e0d\u4f4e\u4e8e 6G\uff0c\u5176\u4ed6\u914d\u7f6e\u65e0\u7279\u6b8a\u8981\u6c42\u3002 \u63a8\u8350\u6027\u4ef7\u6bd4\u8f83\u9ad8\u914d\u7f6e \u64cd\u4f5c\u7cfb\u7edf: UnionTech OS Desktop 20 Professional Linux version 4.19.0-desktop-amd64 (deepin@deepin-PC) (Uos 8.3.0.3-3+rebuild) \u5904\u7406\u5668: Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz (\u516b\u6838 / \u5341\u516d\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460M-HDV(RD)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))/8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: TU116 [GeForce GTX 1660]\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u865a\u62df\u73af\u5883\u5b89\u88c5","text":"cd ~\nwget -c https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh\nbash Miniconda3-latest-Linux-x86_64.sh\n \u4e00\u8def\u56de\u8f66 \u7b2c\u4e00\u6b21\u63d0\u793a\u8f93\u5165 yes/no \uff1a\u8f93\u5165 yes \u7ee7\u7eed\u4e00\u8def\u56de\u8f66 \u7b2c\u4e8c\u6b21\u63d0\u793a\uff1a\u8f93\u5165 no cd ~/miniconda3/bin\nsudo chmod 777 activate\n \u6fc0\u6d3bconda\u73af\u5883 . ./activate\n \u6dfb\u52a0\u516c\u53f8\u5185\u7f51\u6e90 conda config --add channels bioconda\nconda config --add channels conda-forge\n \u5982\u679c\u662f\u5916\u7f51\u6dfb\u52a0\u5916\u7f51\u6e90 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/\n \u5982\u679c\u8981\u5220\u9664\u6e90 conda config --remove-key channels\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"2\u3001\u5b89\u88c5\u4f9d\u8d56","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u521b\u5efa\u865a\u62df\u73af\u5883","text":"conda remove --name mmlab --all # \u79fb\u9664\u6240\u6709\u865a\u62df\u73af\u5883\n conda create -n mmlab python=3.7\n conda activate mmlab\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-pytorch","title":"\uff082\uff09\u5b89\u88c5 Pytorch","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install torch==1.7.0+cu101 torchvision==0.8.1+cu101 torchaudio==0.7.0 -f https://download.pytorch.org/whl/torch_stable.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-mmcv","title":"\uff083\uff09\u5b89\u88c5 MMCV","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install mmcv-full==1.3.3 -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.7.0/index.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"\uff084\uff09\u5b89\u88c5\u663e\u5361\u9a71\u52a8","text":"\u6839\u636e\u4f60\u7684\u663e\u5361\u4e0b\u8f7d\u5bf9\u5e94\u9a71\u52a8\uff0c\u6bd4\u5982\u6211\u7684\u663e\u5361\u4e3a GTX1660\uff0c\u9a71\u52a8\u7248\u672c\u4e3a 430\uff0c\u9a71\u52a8\u4e0b\u8f7d\u5730\u5740\uff1ahttps://www.nvidia.cn/Download/Find.aspx?lang=cn CTRL+ALT+F2 \u8fdb\u5165tty\n \u7981\u7528 nouveau \u9a71\u52a8 sudo vim /etc/modprobe.d/blacklist-nouveau.conf\n \u586b\u5165\uff1a blacklist nouveau options nouveau modeset=0\n \u5237\u65b0\u914d\u7f6e\u6587\u4ef6 sudo update-initramfs -u reboot \u91cd\u542f\u540e\u518d\u8fdb\u5165 tty \u5173\u95ed\u56fe\u50cf\u754c\u9762\uff0c\u8f93\u5165\u547d\u4ee4\u5173\u95ed\u56fe\u50cf\u754c\u9762 sudo service lightdm stop\n \u5b89\u88c5\u9a71\u52a8 sudo chmod a+x NVIDIA-Linux-x86_64-430.run\nsudo ./NVIDIA-Linux-x86_64-430.run\n reboot\u91cd\u542f\uff0cnvidia-smi\u67e5\u770b\u5b89\u88c5\u72b6\u6001\u3002\u6ce8\u610f\u770b\u4e0bcuda\u7248\u672c\uff0c10.1\uff0cdriver\u7248\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u6570\u636e\u6807\u6ce8","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u6570\u636e\u6807\u6ce8","text":"\u6807\u6ce8\u4e4b\u524d\u9700\u8981\u5148\u8f6c\u6362\u56fe\u7247\u5927\u5c0f\uff0c\u5e76\u4e14\u4ee5\u6570\u5b57\u547d\u540d\uff0c\u6bcf\u7ec4\u547d\u540d\u9012\u589e"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"\uff081\uff09\u8f6c\u6362\u5927\u5c0f\u5e76\u91cd\u547d\u540d","text":"rename_pic.py import os\nimport sys\nimport cv2\nimport time\nimport getpass\nusername = getpass.getuser()\nsource_path = f\"/home/{username}/Desktop/right_menu\" # \u56fe\u7247\u8def\u5f84\nsource_dest = os.path.join('/'.join(source_path.split(\"/\")[:-1]), 'tmp')\nif not os.path.exists(source_dest):\nos.mkdir(source_dest)\nstart_name = sys.argv[1]\nfile_name_list = list()\nfor file in os.listdir(source_path):\nif file.endswith('.png'):\nfile_name_list.append(file)\nstart_name = int(start_name)\nfor file in file_name_list:\nos.rename(os.path.join(source_path,file), os.path.join(source_path, f\"{str(start_name)}.png\"))\nstart_name += 1\ntime.sleep(1)\nfor file in os.listdir(source_path):\nimage = os.path.join(source_path, str(file))\nsrc = cv2.imread(image)\nresult = cv2.resize(src, (960, 540))\nresizeImage = os.path.join(source_dest, str(file))\nprint(resizeImage)\ncv2.imwrite(str(resizeImage), result)\ncv2.waitKey(0)\ncv2.destroyAllWindows()\ntime.sleep(1)\nos.system(f'rm -rf {source_path}/*')\nos.system(f'mv {source_dest}/* {source_path}')\nos.system(f'rm -rf {source_dest}')\nprint(\"\u4e0b\u4e00\u4e2a\u5e8f\u53f7\uff1a\", start_name)\n \u6839\u636e\u7ec8\u7aef\u8f93\u51fa\u7684\u4e0b\u4e00\u4e2a\u5e8f\u53f7\u7684\u63d0\u793a\uff0c\u6267\u884c Python \u6587\u4ef6\u7684\u65f6\u5019\u4f20\u53c2\u3002 python rename_pic.py 249\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"\uff082\uff09\u5de5\u5177\u6807\u6ce8","text":"\u4f7f\u7528\u5de5\u5177 labelImg \u6807\u6ce8 sudo pip3 install PyQt5==5.13\nsudo pip3 install labelImg\n \u7ec8\u7aef\u76f4\u63a5\u8f93\u5165 labelImg\uff0c\u56de\u8f66 \u6807\u6ce8\u6a21\u5f0f\u9009\u62e9\uff1aPascalVOC"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u667a\u80fd\u6807\u6ce8","text":"\u6253\u5f00\u5c4f\u5e55\u5f55\u5236\u8f6f\u4ef6\uff0c\u5f55\u5236\u624b\u52a8\u64cd\u4f5c\u4e00\u6b21\u6d4b\u8bd5\u7528\u4f8b\uff0c\u7136\u540e\u5c06\u5f55\u5236\u7684\u89c6\u9891\u8fdb\u884c\u5206\u5e27\uff0c\u7136\u540e\u5bf9\u6bd4\u524d\u4e24\u5e27\u56fe\u6807\u76f8\u4f3c\u5ea6\uff0c\u5254\u9664\u76f8\u4f3c\u5ea6\u8fc7\u9ad8\u7684\u56fe\u7247\uff0c\u5728\u4fdd\u8bc1\u7d20\u6750\u591a\u6837\u6027\u7684\u524d\u63d0\u4e0b\uff0c\u5254\u9664\u91cd\u590d\u591a\u4f59\u7684\u56fe\u7247\u751f\u6210\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u96c6\uff0c\u7136\u540e\u53d6\u51fa\u63a7\u4ef6\u6a21\u677f\u6570\u636e\u96c6\uff0c\u901a\u8fc7 OpenCV \u6a21\u677f\u5339\u914d\u83b7\u53d6\u63a7\u4ef6\u5728\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u56fe\u7247\u4e2d\u6240\u5728\u7684\u5de6\u4e0a\u3001\u5de6\u4e0b\u3001\u53f3\u4e0a\u3001\u53f3\u4e0b\u56db\u5904\u5750\u6807\uff0c\u4ece\u800c\u6839\u636e\u6a21\u677f\u6570\u636e\u96c6\u751f\u6210\u6807\u6ce8\u6570\u636e\u3002\u53c2\u8003\u76ee\u5f55 AnnotationMaterial"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"\uff081\uff09\u6a21\u677f\u6570\u636e\u96c6\u51c6\u5907","text":"1\u3001\u5728\u754c\u9762\u622a\u53d6\u9700\u8981\u6807\u6ce8\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u653e\u5728\u76ee\u5f55\u4e0b AnnotationMaterial/template/img 2\u3001\u7ef4\u62a4\u63a7\u4ef6\u540d\u4e0e\u5143\u7d20\u63a7\u4ef6\u7684\u952e\u5bf9\uff0c\u4e00\u4e2a\u63a7\u4ef6\u540d\u53ef\u5bf9\u5e94\u591a\u4e2a\u5143\u7d20\u63a7\u4ef6 menu:\n- menu.jpg\n- menu1.jpg\n- menu2.jpg\n- menu3.jpg\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"\uff082\uff09\u7d20\u6750\u96c6\u51c6\u5907","text":"\u5f55\u5236\u89c6\u9891\u6216\u6216\u5c4f\u5e55\u622a\u56fe\u653e\u7f6e\u76ee\u5f55 AnnotationMaterial/source"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u5f00\u59cb\u6807\u6ce8","text":"python3 AnnotationMaterial/main.py\n \u751f\u6210\u7684\u6807\u6ce8\u6570\u636e\u5b58\u653e\u5728 AnnotationMaterial/result"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#mmdetection","title":"\u56db\u3001MMDetection","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1-mmdetection","title":"1\u3001 MMDetection \u4ee3\u7801","text":"MMDetection \u662f\u4e00\u4e2a\u6709\u540d\u7684\u6df1\u5ea6\u5b66\u4e60\u76ee\u6807\u68c0\u6d4b\u5f00\u6e90\u9879\u76ee\uff0c\u4e5f\u662f openMMlab \u7684\u62db\u724c\u9879\u76ee\uff0c\u4e3a\u4ec0\u4e48\u9009\u62e9\u5b83\uff0c\u5c0f\u5b69\u513f\u6ca1\u5a18\u8bf4\u6765\u8bdd\u957f\uff0c\u611f\u5174\u8da3\u53ef\u4ee5\u81ea\u884c\u6df1\u5165\u4e86\u89e3\uff1b \u4f60\u53ef\u4ee5\u76f4\u63a5\u5728 GitHub \u4e0a\u514b\u9686\u4ee3\u7801\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u54b1\u4eec\u4ed3\u5e93\u4e0b Train \u76ee\u5f55\u4e2d\u4ee3\u7801\uff0cTrain \u4e2d\u7684\u4ee3\u7801\u4e5f\u662f\u4ece GitHub \u4e0a\u62c9\u53d6\u7684\uff0c\u4e0d\u8fc7\u6211\u4eec\u6839\u636e\u9879\u76ee\u9700\u8981\u505a\u4e86\u4e00\u4e9b\u4e8c\u6b21\u5f00\u53d1\uff0c\u63a8\u8350\u76f4\u63a5\u4f7f\u7528\u5b83\u3002 \u5982\u679c\u4f60\u60f3\u4ece GitHub \u4e0a\u62c9\uff1a git clone https://github.com/open-mmlab/mmdetection.git\n# \u4e0d\u80fd\u76f4\u63a5\u62c9\u53d6\u4e3b\u5206\u652f\uff0c\u5efa\u8bae\u4f7f\u75282.12\u7248\u672c\uff0c\u4e0d\u540c\u7684\u7248\u672c\u5bf9\u5e94\u7684mmcv\u7248\u672c\u662f\u4e0d\u540c\u7684\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-voc2coco","title":"2\u3001\u62c9\u53d6 voc2coco \u4ee3\u7801","text":"git clone https://github.com/Tony607/voc2coco.git\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-coco","title":"3\u3001\u8f6c\u6362 coco \u6570\u636e\u96c6","text":"\u5c06\u6240\u6709\u7684\u56fe\u7247\u548cxml\u6587\u4ef6\u653e\u5165train2017\uff0c\u4ece\u4e2d\u6311\u9009\u51e0\u7ec4\u653e\u5165val2017\uff08\u6d4b\u8bd5\u96c6\uff09 cd mmdetection/data/coco\npython voc2coco.py train2017 annotations/instances_train2017.json\npython voc2coco.py val2017 annotations/instances_val2017.json\n \u751f\u6210json\u6587\u4ef6"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4_1","title":"4\u3001\u4fee\u6539\u914d\u7f6e","text":"\uff081\uff09\u8bfb\u53d6\u6a21\u578b\u540d\u79f0 import json\nmodule_name = []\nwith open('./instances_train2017.json', \"r+\") as f:\njson_file = f.read()\njson_dict = json.loads(json_file)\nmodule_list = json_dict.get('categories')\nfor module_info in module_list:\nname = module_info.get('name')\nmodule_name.append(name)\nprint(module_name)\nprint(\"module_num:\", len(module_name))\n # \u6ce8\u610f\u5bf9\u6bd4instances_train2017.json\u91cc\u9762\u6a21\u578b\u540d\u79f0\u7684\u987a\u5e8f\uff0c\u4e0eCLASSES\u548ccoco_classes\u91cc\u9762\u7684\u987a\u5e8f\u4fdd\u6301\u4e00\u81f4\u3002\n \uff082\uff09\u4fee\u6539 faster_rcnn_r101_2x_coco.py mmdetection/xianjin/faster_rcnn_r101_2x_coco.py \u4fee\u653946\u884c\uff0cnum_clasess\u7684\u503c\uff0c\u65b0\u589e1\u4e2a\uff0c\u5c31 +1\uff1b \uff083\uff09\u4fee\u6539 coco.py mmdetection/mmdet/datasets/coco.py CLASSES = ()\uff0c\u5728\u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b \uff084\uff09\u4fee\u6539 class_names.py mmdetection/mmdet/core/evaluation/class_names.py coco_classes \u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#5","title":"5\u3001\u7f13\u5b58\u6e05\u7406","text":"\u5220\u9664 mmdetection/build \u76ee\u5f55 python setup.py install\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#6","title":"6\u3001\u8bad\u7ec3\u6a21\u578b","text":"\uff081\uff09\u6307\u5b9a\u81ea\u5df1\u914d\u7f6e\u7684\u8bad\u7ec3\u6a21\u578b\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py --gpus 1\n \uff082\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u6d4b\u8bd5\u96c6\u7ed3\u679c\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py xianjin/epoch_24.pth --show\n \uff083\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u51c6\u786e\u5ea6\uff1b python tools/analysis_tools/analyze_logs.py plot_curve xianjin/20210530_011907.log.json --keys acc\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#7","title":"7\u3001\u5feb\u6377\u64cd\u4f5c","text":"python3 run.py\n \u5c06\u4ee5\u4e0a 4 - 7 \u6b65\u64cd\u4f5c\u6574\u5408\u6210 run.py\uff0c\u4e00\u952e\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u4e94\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\uff1b \u670d\u52a1\u7aef\u4e00\u53f0\uff08\u76ee\u524d\u4ec5\u652f\u6301AMD\u67b6\u6784\uff09\uff1b \u91c7\u96c6\u76d2\u4e00\u4e2a \uff08ACASIS hdmi\u89c6\u9891\u91c7\u96c6\u5361\uff0chttps://item.jd.com/10024310742602.html \uff09\uff1b USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\uff1b USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff1b \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5USB\u5ef6\u957f\u7ebf\uff1b \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u63a8\u8350\u914d\u7f6e","text":"\u6267\u884c\u7528\u4f8b\u7684\u670d\u52a1\u7aef\u5bf9\u914d\u7f6e\u6ca1\u6709\u7279\u6b8a\u8981\u6c42\uff0c\u5982\u679c\u6761\u4ef6\u5141\u8bb8\u914d\u7f6e\u8d8a\u9ad8\uff0c\u8bc6\u522b\u901f\u5ea6\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n \u6d4b\u8bd5\u673a\u4e0a\u4e0d\u6267\u884c\u4efb\u4f55\u811a\u672c\uff0c\u5177\u4f53\u914d\u7f6e\u6839\u636e\u6d4b\u8bd5\u9700\u8981\u51b3\u5b9a\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#usb_mk","title":"\u516d\u3001USB_MK\u4e32\u53e3\u9a71\u52a8\u65b9\u6cd5","text":"\u4f4d\u4e8econtrol_method\u76ee\u5f55\u4e0b\u7684usb_mk.py\u6587\u4ef6 \uff081\uff09\u5217\u51fa\u53ef\u901a\u4fe1\u7684\u7aef\u53e3 python3 -m serial.tools.list_ports -v\n \uff082\uff09\u4fee\u6539\u4e32\u53e3\u7684\u6743\u9650 sudo chmod 777 /dev/ttyACM0\n \uff083\uff09\u5b9e\u4f8b\u5316USB_MK import UsbMk\nusb_mk = UsbMk(\"/dev/ttyACM0\", 9600) # \u8bbe\u5907\u9ed8\u8ba49600\u4e3a\u6ce2\u7279\u7387\uff0c\u63a7\u5236\u4f20\u8f93\u901f\u7387\n \uff084\uff09USB\u4e32\u53e3\u8bbe\u5907\u9ed8\u8ba4\u6ce2\u7279\u7387\u4e3a9600\uff08\u7ecf\u6d4b\u8bd5\u6ce2\u7279\u73879600\u51c6\u786e\u6027\u6700\u597d\uff09\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up() # \u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u6c49\u5b57\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e\n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff083\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff084\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff085\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() # \u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2\n \uff086\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff087\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff088\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e03\u3001\u65b9\u6cd5\u8c03\u7528\u5165\u53c2\u89c4\u5219","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_7","title":"1\u3001\u57fa\u7c7b","text":"class Base:\ndef __init__(self):\nself._obj = image\nself._usb = usb_mk\ndef find_element_by_ai(self, element):\nreturn self._obj.find_element(element)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_6","title":"2\u3001\u5165\u53c2\u8bf4\u660e","text":"\u56fe\u50cf\u8bc6\u522b\u65b9\u6cd5\u5165\u53e3\u4e3a Base \u7c7b\u4e0b\u7684 find_element_by_ai \u3002\u4ec5\u63a5\u53d7\u4e00\u4e2a\u53c2\u6570 element\uff0c\u7c7b\u578b\u4e3a string\u3002 \u53ef\u8bc6\u522b\u7684 string \u683c\u5f0f\uff1a \uff081\uff09\u5927\u56fe\u6807\uff08 \u56fe\u6807\u5927\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\uff0c\u4f8b\uff1a Base().find_element_by_ai(\"window\")\n \uff082\uff09\u5927\u56fe\u6807 / \u5c0f\u56fe\u6807\uff08\u56fe\u6807\u5c0f\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5c0f\u56fe\u6807\uff0c\u4f8b\uff1awindow/search_btn Base().find_element_by_ai(\"window/search_btn\")\n \uff083\uff09\u5927\u56fe\u6807 / OCR\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\u5185\u7684\u6587\u5b57\uff0c\u4f8b\uff1amenu/\u5c5e\u6027 Base().find_element_by_ai(\"menu/\u5c5e\u6027\")\n \uff084\uff09OCR\uff1a\u5168\u5c4f\u8bc6\u522b\u6587\u5b57 Base().find_element_by_ai(\"\u641c\u7d22\")\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516b\u3001\u9690\u85cf\u9f20\u6807","text":"\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u8fc7\u6765\u7684\u89c6\u9891\u6d41\uff0c\u5728\u8bc6\u522b\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u53d7\u5230\u9f20\u6807\u5f71\u54cd\uff0c\u56e0\u6b64\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u9690\u85cf\u9f20\u6807\u3002 \u5c4f\u853d\u9f20\u6807\u5149\u6807\u663e\u793a ```shell script /etc/lightdm/lightdm.conf \u5728`[Seat:*]`\u4e0b\u9762\u6dfb\u52a0\u53c2\u6570\n```shell script\nxserver-command=X -bs -core -nocursor\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e5d\u3001\u667a\u80fd\u81ea\u52a8\u5316\u7684\u610f\u4e49","text":"1\u3001\u6539\u5584 Acessibility \u5b9a\u4f4d\u7684\u7a33\u5b9a\u6027\u95ee\u9898 Acessibility \u5c5e\u6027\u5b9a\u4f4d\u5b58\u5728\u5076\u5c14\u5931\u6548\u7684\u60c5\u51b5 \uff081\uff09\u5f00\u53d1\u5728\u505a\u65b0\u9700\u6c42\u5f00\u53d1\u65f6\u53ef\u80fd\u6d89\u53ca\u5230\u5bf9\u5c5e\u6027\u6807\u7b7e\u7684\u4fee\u6539\u6216\u8005\u5c42\u7ea7\u7684\u8c03\u6574\uff0c\u53ef\u80fd\u9020\u6210\u81ea\u52a8\u5316\u7528\u4f8b\u65e0\u6cd5\u5b9a\u4f4d\u5230\u5143\u7d20\u3002 \u6bd4\u59821040\u9636\u6bb5\uff0c\u97f3\u4e50\u91cd\u6784\u7684\u65f6\u5019\uff0c\u5f00\u53d1\u5bf9\u90e8\u5206\u5c5e\u6027\u548c\u5c42\u7ea7\u505a\u4e86\u4fee\u6539\uff0c\u5bfc\u81f4\u81ea\u52a8\u5316\u7528\u4f8b\u5b9a\u4f4d\u65b9\u6cd580%\u9700\u8981\u4fee\u6539\u3002 \u5f00\u53d1\u65b0\u529f\u80fd\u7684\u65f6\u5019\u5076\u5c14\u4e5f\u4f1a\u5bf9\u5c5e\u6027\u505a\u8c03\u6574\uff0c\u9047\u52305\u6b21\u3002 \uff082\uff09\u76ee\u524d\u4e3b\u8981\u4f7f\u7528Dogtail\u8bc6\u522b\u5e94\u7528Acessibility\u5c5e\u6027\u8fdb\u884c\u5b9a\u4f4d\uff0c\u662f\u83b7\u53d6\u5e94\u7528\u5f53\u524d\u754c\u9762\u7684\u5c5e\u6027tree\uff0c\u5728\u5e94\u7528\u8df3\u8f6c\u540e\uff0cDogtail\u5b58\u5728\u65e0\u6cd5\u53ca\u65f6\u83b7\u53d6\u5f53\u524d\u5c5e\u6027\u5217\u8868\u7684\u60c5\u51b5\u3002 \u591a\u5a92\u4f53\u8c03\u7528\u6587\u7ba1\u7a97\u53e3\u7684\u65f6\u5019\uff0c\u51fa\u73b0\u627e\u4e0d\u5230\u6587\u7ba1\u91cc\u9762\u5143\u7d20\u7684\u60c5\u51b5\uff0c\u76ee\u524d\u51fa\u73b010+\u6b21\u3002 \u5e94\u7528\u8bbe\u7f6e\u9875\u9762\u7684\u5c5e\u6027\u5076\u5c14\u5b58\u5728\u627e\u4e0d\u5230\u7684\u60c5\u51b5\uff0c\u9047\u52305\u6b21\u3002 \uff083\uff09Dogtail\u5de5\u5177\u672c\u8eab\u5b58\u5728\u95ee\u9898\uff0c\u6709\u65f6\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u5019\u5f88\u6162\uff0c\u8ba9\u4eba\u65e0\u6cd5\u63a5\u53d7\uff0c\u76ee\u524d\u51fa\u73b0\u8fc7\u5f88\u591a\u6b21\u3002 \u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u95f4\u6bd4\u5e73\u5e38\u61623\u500d\uff0c\u51fa\u73b04\u6b21\u3002 2\u3001\u89e3\u51b3\u4e86\u4f7f\u7528\u7edd\u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898 \u90e8\u5206\u63a7\u4ef6\u65e0\u6cd5\u6dfb\u52a0 Acessibility \u5c5e\u6027\u4ece\u800c\u4f7f\u7528\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u51fa\u73b0\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898\u3002 \uff081\uff09\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u65b9\u6cd5\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u76ee\u6807\u56fe\u7247\u8d44\u6e90\uff0c\u5728 UI \u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u4f1a\u6d89\u53ca\u5230\u76ee\u6807\u8d44\u6e90\u7684\u66ff\u6362\uff0c\u6bd4\u8f83\u8017\u8d39\u4eba\u529b\u3002 \uff082\uff09\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6cd5\u5bf9\u6bd4\u7cbe\u5ea6\u6bd4\u8f83\u641e\uff0c\u5982\u679cUI \u7684\u53d8\u66f4\u4f1a\u9020\u6210\u65e0\u6cd5\u51c6\u786e\u5b9a\u4f4d\u5230\uff0c\u81ea\u52a8\u5316\u811a\u672c\u5065\u58ee\u6027\u4e0d\u8db3\u3002 3\u3001\u4f7f\u7528\u673a\u5668\u5206\u79bb\uff0c\u89e3\u51b3\u4e86\u81ea\u52a8\u5316\u811a\u672c\u5bf9\u5e94\u7528\u7684\u5f71\u54cd\uff0c\u771f\u5b9e\u8fd8\u539f\u7528\u6237\u7684\u4f7f\u7528\u573a\u666f \u673a\u5668\u5206\u79bb\u7684\u67b6\u6784\u8bbe\u8ba1\uff0c\u4fdd\u8bc1\u4e86\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u73af\u5883\u5b8c\u5168\u7b49\u540c\u4e8e\u7528\u6237\uff0c\u6392\u9664\u6d4b\u8bd5\u811a\u672c\u7684\u5f71\u54cd\u3002 \uff081\uff09\u76ee\u524d\u7684\u529f\u80fd\u81ea\u52a8\u5316\u662f\u5728\u6d4b\u8bd5\u673a\u4e0a\u76f4\u63a5\u8fd0\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\uff0c\u52a0\u4e0a\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u6211\u4eec\u6dfb\u52a0\u4e86\u4e00\u4e9b\u8fdb\u7a0b\u76d1\u63a7\u3001\u89c6\u9891\u5f55\u5236\u7b49\u529f\u80fd\uff0c\u81ea\u52a8\u5316\u811a\u672c\u672c\u8eab\u4f1a\u6d88\u8017\u4e00\u4e9b\u7cfb\u7edf\u8d44\u6e90\uff0c\u65e0\u6cd5\u8fd8\u539f\u771f\u662f\u7684\u7528\u6237\u4f7f\u7528\u573a\u666f\u3002 \uff082\uff09\u6027\u80fd\u6d4b\u8bd5\u9700\u8981\u6392\u9664\u5176\u4ed6\u7a0b\u5e8f\u7684\u8d44\u6e90\u6d88\u8017\u5f71\u54cd\uff0c\u6027\u80fd\u81ea\u52a8\u5316\u91c7\u7528\u673a\u5668\u5206\u79bb\uff0c\u4fdd\u8bc1\u4e86\u6027\u80fd\u6570\u636e\u7684\u51c6\u786e\u6027\u3002 \u4ee5\u524d\u7684\u7528\u4f8b\u6267\u884c\u8017\u65f6\u6ca1\u6761\u572830\u79d2\u5de6\u53f3\uff0c\u73b0\u5728\u7528\u4f8b\u8017\u65f6\u572810\u79d2\u3002 4\u3001\u89e3\u51b3\u4e86UI \u8c03\u6574\u5bfc\u81f4\u5b9a\u4f4d\u5931\u8d25\u7684\u4e0d\u7a33\u5b9a\u6027\u95ee\u9898 \uff081\uff09\u89e3\u51b3\u4e86\u56e0 UI \u8c03\u6574\u5bfc\u81f4\u63a7\u4ef6\u4f4d\u7f6e\u53d8\u5316\u6216\u8272\u5dee\u53d8\u5316\u540e\u5b9a\u4f4d\u4e0d\u51c6\u786e\u7684\u95ee\u9898\uff0c\u53ea\u8981\u63a7\u4ef6\u6587\u6848\u548c\u63a7\u4ef6\u5916\u8fb9\u6846\u65e0\u53d8\u5316\u5747\u53ef\u51c6\u786e\u5b9a\u4f4d\uff1b \uff082\uff09\u76ee\u524d\u4e5f\u4f1a\u91c7\u7528\u57fa\u4e8eUI\u7684\u5b9a\u4f4d\u65b9\u6848\uff0c\u5982\u679cUI\u4f4d\u7f6e\u6709\u8c03\u6574\uff0c\u4f1a\u5bfc\u81f4\u5143\u7d20\u65e0\u6cd5\u5b9a\u4f4d\u3002 5\u3001\u7b80\u5316\u4e86\u7528\u4f8b\u7ed3\u6784\uff0c\u63d0\u5347\u7f16\u5199\u53cb\u597d\u5ea6 \uff081\uff09\u667a\u80fd\u81ea\u52a8\u5316\u8bc6\u522b\u5143\u7d20\u7684\u65b9\u6cd5\u53ea\u6709\u4e00\u4e2a\uff0c\u5c31\u662f\u57fa\u4e8e\u6211\u4eec\u8bad\u7ec3\u7684\u6a21\u578b\u8bc6\u522b\u89c6\u9891\u6d41\u4e2d\u7684\u5143\u7d20\uff0c\u7ecf\u8fc7\u811a\u672c\u5c01\u88c5\u4e4b\u540e\uff0c\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u4e2d\u6240\u6709\u5b9a\u4f4d\u7684\u64cd\u4f5c\u90fd\u53ea\u9700\u8981\u8c03\u7528\u8fd9\u4e00\u4e2a\u65b9\u6cd5\u5c31\u884c\u4e86\uff0c\u7f16\u5199\u81ea\u52a8\u5316\u811a\u672c\u7684\u96be\u5ea6\u5927\u5927\u964d\u4f4e\u3002 \uff082\uff09\u4e5f\u662f\u7531\u4e8e\u8c03\u7528\u65b9\u6cd5\u7b80\u5355\uff0c\u5728 UI \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u4e2d\u7684\u5206\u5c42\u7ed3\u6784\u5c06\u4f1a\u51cf\u5c11\uff0c\u591a\u7ee7\u627f\u7684\u60c5\u51b5\u4f1a\u51cf\u5c11\uff0c\u81ea\u52a8\u5316\u4ee3\u7801\u7684\u8c03\u7528\u7ed3\u6784\u4e5f\u4f1a\u53d8\u5f97\u7b80\u5355\uff0c\u800c\u4e14\u529f\u80fd\u6d4b\u8bd5\u540c\u5b66\u7f16\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u66f4\u52a0\u5bb9\u6613\u4e0a\u624b\u3002 \u4ee5\u524d\u5199\u7528\u4f8b\u7531\u4e8e\u9700\u8981\u7ed3\u5408\u4e0d\u540c\u7684\u6a21\u5757\uff0c\u8c03\u7528\u4e0d\u540c\u7684\u65b9\u6cd5\uff0c\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u5e76\u5b8c\u6210\u8c03\u8bd5\u7684\u65f6\u95f4\u5e73\u5747\u572820-30\u5206\u949f\uff0c\u73b0\u5728\u5199\u7528\u4f8b\u811a\u672c\u80fd\u57285\u5206\u949f\u5de6\u53f3\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":"# =============================================\n# Attribution : Application Test Department III\n# Time : 2023/1/3\n# Author : ut003281\n# =============================================\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u7b80\u8ff0","text":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5 \u901a\u8fc7\u81ea\u52a8\u5316\u624b\u6bb5\u5bf9\u5e94\u7528\u8fdb\u884c\u6027\u80fd\u6d4b\u8bd5\uff0c\u63d0\u4f9b\u65b9\u4fbf\u7684\u73af\u5883\u90e8\u7f72\u3001\u8fd0\u884c\u914d\u7f6e\u3001\u7528\u4f8b\u7f16\u5199\u7b49\uff0c\u7528\u4e8e\u684c\u9762\u5e94\u7528\u7684\u51b7\u70ed\u542f\u52a8\u3001\u8d44\u6e90\u62f7\u8d1d\u3001\u9875\u9762\u8df3\u8f6c\u7b49\u6027\u80fd\u573a\u666f\u6d4b\u8bd5\u3002 \u4ed3\u5e93\u5730\u5740\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-perf-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u4ee3\u7801\u7ed3\u6784","text":"autotest-perf-aitest\n\u251c\u2500\u2500 apps # \u5b58\u653e\u6240\u6709\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u811a\u672c\n\u251c\u2500\u2500 conftest.py # pytest hook\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 CURRENT # \u7248\u672c\u5185\u5bb9\n\u251c\u2500\u2500 docs # \u6587\u6863\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u952e\u503c\u5bf9\u7167\u8868.pdf # \u4e32\u53e3\u7ebfcode\u4e0e\u6309\u952e\u7684\u5bf9\u7167\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u6027\u80fd\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\u6267\u884c\u5668\u4f7f\u7528\u6307\u5357.md # \u6267\u884c\u5668\u811a\u672c\u4f7f\u7528\u6307\u5357\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 USB\u4e32\u53e3\u8f6cUSB\u952e\u76d8\u9f20\u6807\u7ebf\u534f\u8bae\u6587\u4ef6V1.0.pdf # \u4e32\u53e3\u534f\u8bae\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput-0.28.2.zip # Linux\u4e0b\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\u7684\u6e90\u7801\uff0c\u53ef\u6839\u636e\u67b6\u6784\u6253\u5305\n\u251c\u2500\u2500 manage.py # \u529f\u80fd\u4e3b\u5165\u53e3\n\u251c\u2500\u2500 pytest.ini # pytst \u914d\u7f6e\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 setting # \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 client.ini # \u6d4b\u8bd5\u673a IP \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5168\u5c40\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dev_env.sh # \u5bbf\u4e3b\u673a\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose_no_relay.yml # \u65e0\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose.yml # \u6709\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker_login.sh # docker \u767b\u9646\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 res\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 black.png # \u5168\u9ed1\u56fe\u7247\uff0c\u7528\u4e8e\u4fee\u6539\u58c1\u7eb8\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_5000.deb # 3A5000 \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_amd64.deb # amd \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_arm64.deb # arm \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_mips64.deb # mips \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_sw_64.deb # sw \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 server.ini # \u670d\u52a1\u5668\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 setup.sh # \u5bb9\u5668\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 template # \u521b\u5efa app \u57fa\u7840\u811a\u672c\u6a21\u677f\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 app_template\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ${app_name}_widget.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 control-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 images\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 test_${app_name}_01_scene.json-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 test_${app_name}_01_scene.py-tpl\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 uos_docker # \u5bb9\u5668\u73af\u5883\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dockerfile\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 requirements.txt\n\u2514\u2500\u2500 src\n \u251c\u2500\u2500 analysis_save.py # \u89e3\u6790\u56fe\u7247\u6d41\u7ed3\u679c\uff0c\u6c47\u603b\u751f\u6210 excel \u62a5\u544a\n\u251c\u2500\u2500 base_widget.py # \u5c01\u88c5\u7684\u57fa\u7840\u64cd\u4f5c\uff0c\u5e94\u7528\u8c03\u7528\u7684\u4e3b\u5165\u53e3\u65b9\u6cd5\n\u251c\u2500\u2500 cmdctl.py # \u8c03\u7528\u547d\u4ee4\u884c\u4f7f\u7528\n\u251c\u2500\u2500 global_value.py # \u5168\u5c40\u53d8\u91cf\n\u251c\u2500\u2500 image_utils.py # \u56fe\u7247\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 __init__.py\n \u251c\u2500\u2500 logger_utils.py # \u65e5\u5fd7\u914d\u7f6e\n\u251c\u2500\u2500 pdocr.py # ocr \u914d\u7f6e\n\u251c\u2500\u2500 public_method.py # \u4e00\u4e9b\u65b9\u4fbf\u7684\u5c01\u4f4f\n\u251c\u2500\u2500 record.py # \u5f55\u5c4f\u76f8\u5173\n\u251c\u2500\u2500 rtk # \u8fd0\u884c\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 _base.py # \u4e00\u4e9b\u679a\u4e3e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 install_env.py # \u5b89\u88c5\u73af\u5883\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 local_runner.py # \u8fd0\u884c\u7528\u4f8b\n\u251c\u2500\u2500 serial_communication # \u4e32\u53e3\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 power_control.py # \u7ee7\u7535\u5668\u64cd\u4f5c\uff0c\u4f7f\u7528\u7ee7\u7535\u5668\u8fde\u63a5\u4e3b\u673a\u7535\u6e90\uff0c\u63a7\u5236\u5f00\u5173\u673a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 serial_common.py # \u4e32\u53e3\u516c\u5171\u65b9\u6cd5\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 usb_mk.py # \u952e\u9f20\u64cd\u4f5c\u57fa\u7840\u5c01\u88c5\n\u251c\u2500\u2500 shortcut_key.py # \u5feb\u6377\u952e\u7684\u5c01\u88c5\n\u251c\u2500\u2500 singleton.py # \u5355\u4f8b\u6a21\u5f0f\n\u251c\u2500\u2500 start_app.py # \u521b\u5efa app\n\u2514\u2500\u2500 write_xlsx.py # \u751f\u6210 excel\n# __init__.py \u6587\u4ef6\u4e3a\u6807\u8bc6\u8be5\u76ee\u5f55\u662f\u4e00\u4e2aPython\u7684\u6a21\u5757\u5305\uff0c\u9879\u76ee\u4e2d\u7684__init__.py\u5747\u4e3a\u7a7a\u6587\u4ef6\u3002\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u73af\u5883\u642d\u5efa","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\u3002 \u670d\u52a1\u7aef\u4e00\u53f0\u3002\uff08\u4ec5\u652f\u6301 AMD \u67b6\u6784\uff0c\u82e5\u9700\u5176\u4ed6\u67b6\u6784\uff0c\u54a8\u8be2\u76f8\u5173\u5f00\u53d1\u4eba\u5458\uff09 \u91c7\u96c6\u76d2\u4e00\u4e2a\u3002 \uff08ACASIS HDMI \u89c6\u9891\u91c7\u96c6\u76d2\uff0chttps://item.jd.com/100013302599.html#crumb-wrap \uff09 USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\u3002\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"\uff082\uff09\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\u3002 USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff08USB3.0 \u63a5\u53e3\u4e0a\uff09\u3002 \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5 USB \u5ef6\u957f\u7ebf\u3002 \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u670d\u52a1\u7aef\u63a8\u8350\u914d\u7f6e","text":"\u914d\u7f6e\u8d8a\u9ad8\uff0c\u89e3\u6790\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"2\u3001\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa","text":" \u6253\u5f00\u63a7\u5236\u4e2d\u5fc3\uff0c\u8d26\u6237\u8bbe\u7f6e\u4e3a\u3010\u81ea\u52a8\u767b\u5f55\u3011\u548c\u3010\u65e0\u5bc6\u7801\u767b\u5f55\u3011\uff0c\u7535\u6e90\u7ba1\u7406\u4e2d\u4f7f\u7528\u7535\u6e90\u5168\u90e8\u8bbe\u7f6e\u4e3a\u3010\u4ece\u4e0d\u3011\uff0c\u5f00\u542f\u5f00\u53d1\u8005\u6a21\u5f0f\u3002 \u6839\u636e\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u8981\u6c42\uff0c\u5bfc\u5165\u76f8\u5173\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\uff1a\u5bfc\u5165\u76f8\u518c\u3001\u5f71\u9662\u3001\u97f3\u4e50\u7684\u6d4b\u8bd5\u8d44\u6e90\u3002 \u5728\u670d\u52a1\u7aef\u6253\u5f00\u76f8\u673a\u5e94\u7528\u540e\uff0c\u5c06\u6d4b\u8bd5\u673a\u684c\u9762\u58c1\u7eb8\u66f4\u6362\u4e3a\u7eaf\u8272\u58c1\u7eb8\uff08\u6ce8\u610f\uff0c\u670d\u52a1\u7aef\u9700\u63d0\u524d\u5f00\u542f\u76f8\u673a\u540e\u518d\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u58c1\u7eb8\uff0c\u5efa\u8bae\u7eaf\u9ed1\u58c1\u7eb8 setting/res/black.png\uff09 \u5728\u6587\u4ef6\u7ba1\u7406\u5668\u4e2d\uff0c\u5c06\u9009\u9879 \u4e3b\u83dc\u5355-\u8bbe\u7f6e-\u9884\u89c8-\u56fe\u7247\u9884\u89c8 \u53d6\u6d88\u52fe\u9009\uff08\u5982\u4e0d\u53d6\u6d88\uff0c\u4f1a\u5f71\u54cd\u622a\u56fe\u5f55\u5c4f\u5e94\u7528\u7684\u6027\u80fd\u6570\u636e\uff09 \u79fb\u52a8\u6216\u5220\u9664\u7cfb\u7edf Logo \uff0c\u6392\u9664\u684c\u9762\u53f3\u4e0b\u89d2 Logo \u7684\u5f71\u54cd\uff08\u91cd\u542f\u751f\u6548\uff09\u3002 sudo mv /usr/share/deepin/uos_logo.svg ~/Pictures/\n \u5b89\u88c5\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\uff08\u5fc5\u987b\u5b89\u88c5\uff01\uff01\uff09 AMD \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_amd64.deb ARM \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_arm64.deb MIPS \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_mips64.deb 3A5000 \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_5000.deb \u5b89\u88c5\u547d\u4ee4 sudo dkpg -i xserver-xorg-input-libinput_0.28.2-2_amd64.deb\n \u5b89\u88c5\u65f6\u4f1a\u63d0\u793a\u5df2\u5b58\u5728\u76f8\u540c\u7248\u672c\uff0c\u8bf7\u5ffd\u7565\uff0c\u76f4\u63a5\u8986\u76d6\u5b89\u88c5\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u4e3b\u673a\u624d\u751f\u6548"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u670d\u52a1\u7aef\u4e00\u952e\u73af\u5883\u90e8\u7f72","text":"\u73af\u5883\u642d\u5efa\u524d\u5fc5\u987b\u5148\u8fde\u63a5\u4e0a USB \u4e32\u53e3\u7ebf\u548c\u91c7\u96c6\u76d2\u3002 \u5bbf\u4e3b\u673a\u73af\u5883\u5b89\u88c5 python3 manage.py install --env host\n \u5bb9\u5668\u73af\u5883\u5b89\u88c5 python3 manage.py install --env docker\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u56db\u3001\u914d\u7f6e\u9879","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u670d\u52a1\u7aef\u914d\u7f6e","text":"setting/config/server.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u914d\u7f6e\u9879\uff0c\u5305\u542b\u4e86\u6240\u6709\u670d\u52a1\u7aef\u6240\u6709\u7684\u53ef\u914d\u7f6e\u9879\u3002 \u672c\u5730\u65e0\u7f51\u7edc\u8fd0\u884c \u5c06\u914d\u7f6e\u9879 network=0 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u672c\u5730\u6709\u7f51\u7edc\u8fd0\u884c \u914d\u7f6e\u9879 network=1 (1)\u914d\u7f6e\u9879 client_alias= \u914d\u7f6e\u4e3a\u4f60\u8981\u6d4b\u8bd5\u7684\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5982 Alias1 \u6d4b\u8bd5\u673a\u522b\u540d\u5728 setting/config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 (2)\u914d\u7f6e\u9879 client_alias= \u4e3a\u7a7a\uff0c\u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager --client_alias Alias1\uff0c\u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002(Alias1 \u4e3a\u4f60\u914d\u7f6e\u7684\u6d4b\u8bd5\u673a\u522b\u540d) (1)\u548c(2)\u53ea\u8981\u4f7f\u7528\u5176\u4e00\u5373\u53ef\u3002 \u6709\u7f51\u7edc\u8fd0\u884c\uff0c\u4e14\u9700\u8981\u901a\u8fc7 Jenkins \u4e0a\u8fd0\u884c\u4e00\u4e2a job \uff0c\u540c\u65f6\u63a7\u5236\u591a\u53f0\u673a\u5668\u3002 \u914d\u7f6e\u9879 network=1 \u914d\u7f6e\u9879 client_alias= \u4e0d\u7528\u914d\u7f6e\uff0c\u5728\u8fd0\u884c run.sh \u7684\u65f6\u5019\u76f4\u63a5\u7a7a\u683c\u52a0\u522b\u540d\u5373\u53ef\uff0c\u6bd4\u5982\uff1a\u6d4b\u8bd5\u673a\u522b\u540d\u4e3a Alias1 \uff0c\u4e14\u5df2\u7ecf\u5728 config/client.ini \u4e2d\u914d\u7f6e\u4e86 Alias1 \u7684user ip password \uff0c\u5219\u8fd0\u884c bash run.sh Alias1 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u5728 Jenkins pipeline \u91cc\u9762\u901a\u8fc7\u5e76\u884c stage \u6216\u5e76\u884c\u8c03\u7528\u4e0b\u5c42\u4efb\u52a1\u7684\u65b9\u5f0f\u53ef\u4ee5\u5b9e\u73b0\u5927\u89c4\u6a21\u7684\u6027\u80fd\u6d4b\u8bd5\u9700\u6c42\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;1\u3001KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2\u3001KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f, e.g. TAGS = L1 or smoke\n[case_conf]\n# \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\uff0cocr\u6587\u6848\u8bc6\u522b\u8f83\u6162\uff0c\u4e0d\u63a8\u8350\u4f7f\u7528\nfind_by = stage\n# \u6700\u540e\u4e00\u4e2a\u7a33\u5b9a\u9636\u6bb5\u7684\u5e27\u6570\u8bc6\u522b\n# \u9996\u5e27\u5b58\u5728\u540e\u7684\u7b2c\u4e00\u4e2a\u5927\u4e8e\u8be5\u914d\u7f6e\u5e27\u6570\u7684\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u5c3e\u5e27\nfinal_stable_num=100\n# \u4ece\u8be5\u5e27\u6570\u5f00\u59cb\u8bc6\u522b\u6587\u6848\u6216\u56fe\u7247\uff0c\u51cf\u5c11\u5206\u6790\u65f6\u95f4\nstart_num = 150\n# \u8bc6\u522b\u7684\u6587\u6848\ntext=\n# \u8bc6\u522b\u56fe\u7247\nmatch=apps/xxx/images/match.png\n# \u8bc6\u522b\u76f8\u4f3c\u5ea6\nmatch_rate=0.9\n# \u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6bd4\u5982\u70ed\u542f\u52a8\u7528\u4f8b\uff0c\u4ece\u70b9\u51fb\u6253\u5f00\u5230\u505c\u6b62\u5f55\u5c4f\uff0c\u4e2d\u95f4\u7b49\u5f855\u79d2\uff1b\nduration = 15\n# \u5355\u6761\u7528\u4f8b\u6267\u884c\u7684\u6b21\u6570\ncount = 5\n# \u7a33\u5b9a\u9636\u6bb5\u5212\u5206\u7684\u76f8\u4f3c\u5ea6\nstable_similarity = 0.9997\n[server]\n# \u8c03\u8bd5\u6a21\u5f0f=1\uff0c\u4e3a\u5f00\u542f\u8c03\u8bd5\u6a21\u5f0f\uff0c0\u4e3a\u5173\u95ed\u3002\n# \u8c03\u8bd5\u6a21\u5f0f\u4e0b\u9ed8\u8ba4\u53ea\u6267\u884c\u4e00\u6b21\u7528\u4f8b\uff0c\u4e0d\u5173\u673a\n# \u7f16\u5199\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u5efa\u8bae\u5f00\u542fmaintain\u3002\nMAINTAIN = 0\n# \u8fd0\u884c\u7684\u73af\u5883docker\u5bb9\u5668\u73af\u5883\uff0chost\u5bbf\u4e3b\u673a\u73af\u5883\nENV = docker\n# \u670d\u52a1\u7aef\u5bc6\u7801\nPASSWORD=1\n# \u6307\u5b9a\u6d4b\u8bd5\u673a\u522b\u540d\n# \u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6bd4\u5982\uff1a\n# [AMD]\n# ip=10.8.15.86\n# user=uos\n# \u5176\u4e2d AMD \u4e3a\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5219client_alias=AMD\nCLIENT_ALIAS = x86\uff08Intel-i7\uff09\n# 1 \u5f00\u542f\u7f51\u7edc, 0 \u5173\u95ed\u7f51\u7edc\n# \uff081\uff09\u670d\u52a1\u7aef\u4e0e\u6d4b\u8bd5\u673a\u987b\u5728\u540c\u4e00\u7f51\u6bb5\u4e0b\uff0c\u4f60\u53ef\u4ee5\u5c1d\u8bd5\u5728\u670d\u52a1\u7aef\u901a\u8fc7ssh\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c\u5982\u679c\u53ef\u4ee5\u8fde\u63a5\uff0c\u8bf4\u660e\u7f51\u7edc\u6b63\u5e38\u3002\n# \uff082\uff09\u5f53input_type=FILE_NAME \u65f6\uff0c\u5fc5\u987b\u5f00\u542f\u7f51\u7edc\u3002\nNETWORK = 1\n# \u6027\u80fd\u7ed3\u679c\u7edf\u8ba1\u5355\u4f4d \u6beb\u79d2\u2014ms, \u79d2\u2014s\nUNIT=ms\n# \u6d4b\u8bd5\u673a\u5f00\u673a\u8fdb\u5165\u684c\u9762\u540e\u7b49\u5f85\u65f6\u95f4,\u5355\u4f4d/\u79d2\nSTARTUP_DELAY = 60\n# 1\u4e3a\u5220\u9664\u7f13\u5b58\uff0c0\u4e3a\u4e0d\u5220\u9664\u7f13\u5b58\n# \u7528\u4f8b\u6267\u884c\u5b8c\u540e\u4f1a\u5728report\u76ee\u5f55\u4e0b\u751f\u6210\u667a\u80fd\u89e3\u6790\u7684\u4e00\u4e9b\u7f13\u5b58\u56fe\u7247\u3002\nCACHE = 0\n# \u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u62a5\u544a\u4f1a\u4fdd\u5b58\u5728\u9879\u76ee\u4e0breport\u76ee\u5f55\u4e2d\uff1b\n# \u6307\u5b9a\u62a5\u544a\u76ee\u5f55\u5219\u5b58\u653e\u5230\u6307\u5b9a\u76ee\u5f55\u3002\nREPORT_PATH = report\n# \u670d\u52a1\u7aef\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684icon\u8d44\u6e90\u4f1a\u7f13\u5b58\u5728\u9879\u76ee\u4e0binput\u76ee\u5f55\u4e2d\nINPUT = input/\n# 1\u4e3a\u6d4b\u8bd5\u5b8c\u5173\u673a\uff0c0\u4e3a\u6d4b\u8bd5\u5b8c\u4e0d\u5173\u673a\nSHUTDOWN = 0\n# \u89e3\u6790\u8fdb\u7a0b\u6570\uff08\u4e0d\u63a8\u8350\u4fee\u6539\uff09\n# 3\u4e2a\u8fdb\u7a0b\u89e3\u6790\u89c6\u9891\u5df2\u7ecf\u80fd\u591f\u6ee1\u8db3\uff0c\u5373\u4f7f\u589e\u52a0\u8fdb\u7a0b\u6570\u4e5f\u4e0d\u80fd\u51cf\u5c11\u6574\u4f53\u8017\u65f6\n# \u53e6\u5916\u8fd8\u8981\u770bCPU\u6838\u6570\u662f\u5426\u652f\u6301\u3002\nPARSING_PROCESS = 3\n# 1\u4e3a\u4f7f\u7528\u7ee7\u7535\u5668\u5f00\u5173\u673a\uff0c0\u4e3a\u4f7f\u7528reboot\u547d\u4ee4\u91cd\u542f\u3002\u4f9d\u8d56\u7ee7\u7535\u5668\u786c\u4ef6\u8bbe\u5907\uff0c\u9700\u8981\u4f7f\u7528\u8054\u7cfb\u5f00\u53d1\u8005\nRELAY = 0\n# \u83b7\u53d6\u6d4b\u8bd5\u5e94\u7528\u7684\u7248\u672c, %s \u5360\u4f4d\u5e94\u7528\u540d\n# \u5982\u679c\u8be5\u914d\u7f6e\u4e3a\u7a7a\uff0c\u5219\u4e0d\u83b7\u53d6\u5e94\u7528\u7684\u7248\u672c\u4fe1\u606f\u3002\nCOMMAND = apt policy %s 2>/dev/null|grep \"\u5df2\u5b89\u88c5\"|awk -F \"\uff1a\" \"{print \\$2}\"\n# \u5173\u673a\u7b49\u5f85\u5f00\u542f\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6839\u636e\u6d4b\u8bd5\u673a\u6027\u80fd\u4e0d\u540c\uff0c\u5f00\u5173\u673a\u8017\u65f6\u53ef\u80fd\u4e0d\u540c\uff0c\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u673a\u60c5\u51b5\u914d\u7f6e\u3002\nSHUTDOWN_DELAY = 30\n# \u53ef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u56fe\u7247\u683c\u5f0f\uff0c\u4ee5\u82f1\u6587\u9017\u53f7\u9694\u5f00\u3002\n# \u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u76ee\u524d\u6211\u4eec\u4ec5\u9a8c\u8bc1\u4e86jpg,jpeg,png\u8fd9\u4e09\u79cd\u5e38\u7528\u7684\u56fe\u7247\u683c\u5f0f\u3002\nINPUT_TYPES = jpg,jpeg,png\n# \u6027\u80fd\u5206\u6790\u8865\u5e27\uff0c\u7b49\u4e8e\u6216\u4f4e\u4e8e\u8be5\u503c\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u9700\u8981\u51cf\u6389\u3002\nUN_STAB_START = 3\n# \u670d\u52a1\u7aef\u83b7\u53d6\u6d4b\u8bd5\u673a\u56fe\u50cf\u7684\u5e27\u7387\uff0c\u5373\u6bcf\u79d2\u83b7\u53d6\u591a\u5c11\u5f20\u6d4b\u8bd5\u673a\u4e0a\u7684\u56fe\u50cf\u3002\n# \u9ed8\u8ba4\u5e27\u7387\u4e3a30\u5e27/\u79d2\uff0c\u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u53ef\u80fd\u4f1a\u5bf9\u89e3\u6790\u7ed3\u679c\u9020\u6210\u504f\u5dee\u3002\nFPS = 30\n# \u4ee5\u4e0b\u573a\u666f\u7c7b\u578b\u4f1a\u91cd\u542f\u6d4b\u8bd5\u673a,\u591a\u79cd\u573a\u666f\u4f7f\u7528\u9017\u53f7\u9694\u5f00\nSCENE = cold\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = http://10.8.13.78:8890\n#\u5c4f\u5e55\u56fe\u7247\u4e34\u65f6\u5b58\u653e\u4f4d\u7f6e\nSCREEN_CACHE = /tmp/screen\n# =======================================\n[log]\n# \u65e5\u5fd7\u7ea7\u522b\uff0cOFF\u3001FATAL\u3001ERROR\u3001WARN\u3001INFO\u3001DEBUG\u3001ALL\n# \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u65e5\u5fd7\u8f93\u51fa\uff0clog_cli=INFO\u8868\u793a \u4ec5\u8f93\u51faINFO\u53ca\u4ee5\u4e0a\u7ea7\u522b\u7684\u65e5\u5fd7\u3002\nLOG_LEVEL = DEBUG\n# \u65e5\u5fd7\u6587\u4ef6\u4fdd\u5b58\u8def\u5f84\nLOG_PATH= logs\n# =======================================\n[dockerhub]\n# \u5bb9\u5668\u767b\u9646\u8d26\u53f7\nDOCKER_USER = user\n# \u5bb9\u5668\u767b\u9646\u5bc6\u7801\nDOCKER_PASSWORD = User1234\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u6d4b\u8bd5\u673a\u914d\u7f6e","text":"setting/config/client.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u4fe1\u606f\u3002 \u6709\u7f51\u7edc\u7684\u60c5\u51b5\u4e0b\uff0c\u670d\u52a1\u7aef\u9700\u8981\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u56e0\u6b64\u4f60\u9700\u8981\u5199\u5165 \u6d4b\u8bd5\u673a\u522b\u540d \u3001 user \u3001ip\u3001 password \u3002 # \u6d4b\u8bd5\u673a\u522b\u540d\n[Alias1] # \u6d4b\u8bd5\u673aip\nip=10.8.15.86 # \u6d4b\u8bd5\u673a\u7528\u6237\u540d\nuser=uos\n \u547d\u540d\u5efa\u8bae\uff1aAliasA1\u3001AliasA2\u3001AliasB1\u3001AliasB2\uff0c\u4e0d\u8981\u91cd\u540d\u3002 \u65e0\u7f51\u7edc\u60c5\u51b5\u4e0b\uff0c\u4ec5\u9700\u8981\u5173\u6ce8\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\u9879 width=\u3001 height= \u5373\u53ef\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a [client]\n# \u9ed8\u8ba4\u6d4b\u8bd5\u673a\u7528\u6237\u540d\uff0c\u5bc6\u7801\uff0cip\nip=\nuser=\n# \u6d4b\u8bd5\u673a\u5bc6\u7801\npassword=1\n# \u6d4b\u8bd5\u673a\u4e3b\u9898\ntheme=bloom\n# \u6d4b\u8bd5\u673aicon\u76ee\u5f55\npath=/usr/share/icons\n# \u7cfb\u7edfdesktop\u6587\u4ef6\u7684\u5b58\u653e\u76ee\u5f55\uff0cUOS\u7cfb\u7edf\u9ed8\u8ba4\u4e3a/usr/share/applications\ndesktop_path=/usr/share/applications\n# \u7528\u4e8e\u5224\u65ad\u6d4b\u8bd5\u673a\u662f\u5426\u5f00\u673a\u8fdb\u5165\u684c\u9762\u7684\u8bc6\u522b\u6807\u8bc6\u3002\n# 1\u3001\u901a\u8fc7\u684c\u9762\u56fe\u6807\u8bc6\u522b\u3002\n# - type=FILE_NAME\u65f6\uff0c\u670d\u52a1\u5668\u548c\u6d4b\u8bd5\u673a\u5fc5\u987b\u5728\u540c\u4e00\u5c40\u57df\u7f51\u5185\u3002\n# - power_on=dde-computer\u8868\u793a\u901a\u8fc7\u684c\u9762\u8ba1\u7b97\u673a\u56fe\u6807\u5224\u65ad\u5f00\u673a\u8fdb\u5165\u684c\u9762\u3002\n# 2\u3001\u901a\u8fc7\u672c\u5730\u56fe\u7247\u4f5c\u4e3a\u5f00\u673a\u8bc6\u522b\u3002\n# - type= \u4f20\u5165\u4e3a\u56fe\u7247\u683c\u5f0f\uff0ctype\u652f\u6301\u7684\u7c7b\u578b\u5305\u542b\u5728server.ini\u5185\u914d\u7f6e\u9879input_type=jpg,jpeg,png\u3002\n# - power_on= \u4f20\u5165\u7684\u662f\u672c\u5730\u56fe\u7247\u7684\u8def\u5f84\u3002\ntype=FILE_NAME\npower_on=dde-computer\n# \u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\uff08\u6d4b\u8bd5\u673a\u8fde\u63a5\u91c7\u96c6\u76d2\uff0c\u91c7\u96c6\u76d2\u7684\u5206\u8fa8\u7387\uff09\nheight=1080\nwidth=1920\n[AliasA1] ip=10.8.15.86\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n[AliasA2]\nip=10.8.15.20\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_2","title":"3\u3001\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e","text":"\u968f\u7740\u6d4b\u8bd5\u573a\u666f\u7684\u4e0d\u65ad\u5f15\u5165\uff0c\u53d1\u73b0\u73b0\u6709\u670d\u52a1\u7aef\u91cc\u7684\u914d\u7f6e\u9879\u5e76\u4e0d\u9002\u7528\u4e8e\u6240\u6709\u7684\u6027\u80fd\u573a\u666f\uff0c\u4e8e\u662f\u5c06\u670d\u52a1\u7aef\u914d\u7f6e\u8fdb\u884c\u4e00\u4e2a\u63d0\u53d6\uff0c\u53ef\u505a\u5355\u4e2a\u573a\u666f\u7684\u4e2a\u6027\u5316\u914d\u7f6e\uff0c\u5f53\u7136\u539f\u6765\u7684\u670d\u52a1\u7aef\u914d\u7f6e\u529f\u80fd\u4fdd\u7559\uff0c\u53ea\u662f\u5f53\u4f60\u914d\u7f6e\u4e86\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e\u540e\uff0c\u4f18\u5148\u4f7f\u7528\u4e2a\u6027\u5316\u914d\u7f6e\u91cc\u9762\u7684\u5185\u5bb9\uff0c\u4ee5\u4e0b\u662f\u5bf9\u4e2a\u6027\u5316\u914d\u7f6e\u7684\u4ecb\u7ecd\u3002 \u76ee\u524d\u6bcf\u4e00\u4e2a py \u6587\u4ef6\u5bf9\u5e94\u4e00\u4e2a\u6027\u80fd\u6d4b\u8bd5\u573a\u666f\uff0c\u4e8e\u662f\u5728\u540c\u7ea7\u76ee\u5f55\u4e0b\u521b\u5efa\u4e00\u4e2a\u4e0e\u4e4b\u540c\u540d\u7684 json \u6587\u4ef6\uff0c\u4f5c\u4e3a\u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6 apps\n\u251c\u2500\u2500 album\n \u251c\u2500\u2500 test_album_01_start.json # \u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6\n\u2514\u2500\u2500 test_album_01_start.py # \u6027\u80fd\u573a\u666f\u6587\u4ef6\n \u4ee5\u4e0b\u662f\u5bf9 json \u6587\u4ef6\u4e2d\u914d\u7f6e\u7684\u89e3\u91ca\uff0c\u82e5\u67d0\u9879\u914d\u7f6e\u4e0d\u9700\u8981\uff0c\u53ef\u4ee5\u7f3a\u5931\uff0c\u4f46\u4e0d\u80fd\u4e3a\u7a7a\uff1b {\n\"title\": \"test_album_start\", # \u6807\u9898\uff1b\u5fc5\u987b\n\"app_name\": \"deepin-album\", # \u573a\u666f\u6240\u5c5e\u7684\u5e94\u7528\uff1b\u5fc5\u987b\n\"scene\": \"hot\", # \u573a\u666f\u522b\u540d\uff1b\u5fc5\u987b\n\"icon\": [\"deepin-album\"], # \u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684icon\u5230\u670d\u52a1\u7aef\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\uff1b\u53ef\u7f3a\u5931\n# \u6ce8\u610f\uff1a\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684desktop\u6587\u4ef6\u540d\u4e3adeepin-album.desktop\uff0c\n# \u53ea\u9700\u8981\u5199deepin-album\u5373\u53ef\uff0c\u201c.desktop\u201d\u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002\n\"size\": { # \u56fe\u7247\u5bf9\u6bd4\u7684\u533a\u57df\u8bbe\u7f6e\u9879\uff0c\u67d0\u4e9b\u5e94\u7528\u5f53\u524d\u5c4f\u5e55\u7684\u90e8\u5206\u533a\u57df\u9700\u8981\u5c06\u5176\u53bb\u6389\uff0c\u53ef\u4ee5\u8bbe\u7f6e\u6b64\u9879\uff0c\u5982\u679c\u6ca1\u6709\u5219\u53ef\u4e0d\u5199\uff1b\u53ef\u786e\u5b9e\n\"x-coordinate\": 0, # \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n\"y-coordinate\": 0, # \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n\"width\": 850, # \u6a2a\u5411\u957f\u5ea6\n\"height\": 1920 # \u7eb5\u5411\u9ad8\u5ea6\n},\n\"count\": 5, # \u573a\u666f\u6267\u884c\u7684\u6b21\u6570\uff1b\u5fc5\u987b\n\"duration\": 5, # \u8be5\u6761\u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff0c\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7279\u5b9a\u573a\u666f\uff0c\u8be5\u914d\u7f6e\u4e3a\u53ef\u9009\u9879\uff0c\u8986\u76d6 server.ini \u4e2d\u7684\u914d\u7f6e\uff1b\u53ef\u7f3a\u5931\n\"stable_similarity\": 0.9997, # \u6027\u80fd\u573a\u666f\u5206\u9636\u6bb5\u65f6\u7684\u56fe\u7247\u76f8\u4f3c\u5ea6\u5bf9\u6bd4\uff0c\u524d\u540e\u56fe\u7247\u4f4e\u4e8e\u8be5\u503c\uff0c\u5219\u5206\u4e3a\u4e0d\u7a33\u5b9a\u9636\u6bb5\uff1b\u53ef\u7f3a\u5931\n\"find_by\": \"stage\", # \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\n\"final_stable_num\": 100, # \u67e5\u627e\u6700\u540e\u4e00\u4e2a\u5927\u4e8e\u8be5\u503c\u7684\u7a33\u5b9a\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u7684\u5c3e\u796f\uff1b\u53ef\u7f3a\u5931\n\"start_num\": 150,\n\"text\": \"\", # ocr\u8bc6\u522b\u7684\u6587\u6848\n\"match\": \"apps/xxx/images/match.png\", # \u56fe\u50cf\u5339\u914d\u7684\u56fe\u7247\u6587\u4ef6\u8def\u5f84\n\"match_rate\": 0.9 # \u5339\u914d\u76f8\u4f3c\u5ea6\n}\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e94\u3001\u6d4b\u8bd5\u6d41\u7a0b","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516d\u3001\u7528\u4f8b\u7f16\u5199\u53ca\u65b9\u6cd5\u53c2\u6570\u6307\u5f15","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"1\u3001\u7528\u4f8b\u5b9e\u4f8b\u8bf4\u660e","text":"# \u6807\u51c6\u5e93\u5bfc\u5165\nfrom time import sleep\n# \u5bfc\u5165\u4e09\u65b9\u5e93pytest\nimport pytest\n# \u5bfc\u5165\u7528\u4f8b\u6267\u884c\u8981\u7528\u5230\u7684Widget\u7c7b\nfrom src.base_widget import BaseWidget\nclass TestStart:\n# class\u7ea7\u522b\u7684fixture\uff0c\u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u6267\u884c\u3002autouse=True \u81ea\u52a8\u5728\u5f53\u524d\u4f5c\u7528\u57df\u4e0b\u4f7f\u7528\u3002\n@pytest.fixture(scope=\"class\", autouse=True)\n# \u6d4b\u8bd5\u70ed\u542f\u52a8\u4e4b\u524d\u9700\u8981\u9884\u542f\u52a8\u3002\ndef application_pre_start(self):\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().right_click_element(\"deepin-album\")\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().click_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\")\nsleep(2)\n# \u5feb\u6377\u952e\u5173\u95ed\u7a97\u53e3\nBaseWidget().hot_key(\"alt\", \"f4\")\nsleep(2)\n# \u9ed8\u8ba4\u4e3afunction\u7ea7\u522b\u7684fixture\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\uff0cclass\u7ea7\u522bfixture\u6267\u884c\u4e4b\u540e\u6267\u884c\u3002\n@pytest.fixture(autouse=True)\ndef setup_start(self):\n# \u53f3\u952e\u70b9\u51fb deepin-album \u56fe\u6807\nBaseWidget().right_click_element(\"deepin-album\")\n# \u79fb\u52a8\u5230\u53f3\u952e\u83dc\u5355\u4e2d\u6253\u5f00\uff08open.png\uff09\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().move_to(*BaseWidget().find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))\n# \u7b49\u5f85\u79fb\u52a8\u5b8c\u6210\nsleep(0.5)\ndef test_album_start(self):\n# \u70b9\u51fb\u201c\u6253\u5f00\u201d\nBaseWidget().click() \n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"2\u3001\u65b9\u6cd5\u53c2\u6570\u8bf4\u660e","text":"2.1\u3001find_element \u65b9\u6cd5 def find_element(element: str, input_type: str = \"FILE_NAME\", fill_color_position: tuple = (-1, -1), size: tuple = (25, 70)):\npass\n \u53c2\u6570 element \u548c input_type \uff081\uff09\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u5143\u7d20 - `input_type` \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a `FIEL_NAME` \uff0c\u8868\u793a\u901a\u8fc7\u5e94\u7528 `icon` \u5bfb\u627e\u5143\u7d20\uff0c\u6b64\u65b9\u6cd5\u4f1a\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u5e94\u7528 `icon` \u56fe\u6807\u3002\n \u4e3e\u4f8b\uff1a\u9ed8\u8ba4\u60c5\u51b5\u4e0b input_type \u53c2\u6570\u4e0d\u9700\u8981\u4f20\u5165\uff0c find_element(\"deepin-album\")\uff0c\u8868\u793a\u901a\u8fc7 deepin-album \u7684\u5e94\u7528 icon \u6765\u83b7\u53d6\u5750\u6807\uff0c\u6ce8\u610f\uff0c\u6b64\u65f6\u4f20\u5165\u7684 deepin-album \u53c2\u6570\u5b9e\u9645\u662f desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u548c2.3\u4e2d\u7684 icon \u53d8\u91cf\u4e00\u81f4\u3002 \u6211\u4eec\u5efa\u8bae\u4f18\u5148\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\uff0c\u4f46\u6b64\u65b9\u6cd5\u4f9d\u8d56\u7f51\u7edc\uff0c\u8bf7\u6839\u636e\u6d4b\u8bd5\u73af\u5883\u5b9e\u9645\u60c5\u51b5\u9009\u62e9\u3002 \uff082\uff09\u901a\u8fc7\u672c\u5730\u56fe\u7247\u8bc6\u522b\u5143\u7d20 - \u53c2\u6570 `input_type` \u4f20\u5165\u56fe\u7247\u683c\u5f0f\uff0c\u6bd4\u5982\u622a\u53d6\u7684\u672c\u5730\u56fe\u7247\u683c\u5f0f\u4e3a `png`\uff0c\u90a3\u4e48 `input_type=\"png\"`\uff0c\u6b64\u65f6\u53c2\u6570 `element ` \u4f20\u5165\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5efa\u8bae\u5b58\u653e\u5728\u5bf9\u5e94\u7684\u4ea7\u54c1 `apps/app/picture/` \u76ee\u5f55\u4e0b\uff0c\u8def\u5f84\u4e3a\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u7684\u76f8\u5bf9\u8def\u5f84\u3002\n- \u4e3e\u4f8b\uff1a`find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))`\uff0c\u8868\u793a\u901a\u8fc7\u672c\u5730\u56fe\u7247 `open.png` \u8bc6\u522b\u5143\u7d20\u3002\n \u53c2\u6570 fill_color_position fill_color_position \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (-1, -1)\uff0c(-1, -1) \u8868\u793a\u53d6\u5c4f\u5e55\u4e2d\u53f3\u4e0b\u89d2\u6700\u540e\u4e00\u4e2a\u50cf\u7d20\u70b9\u4f5c\u4e3a\u586b\u5145\u5750\u6807\uff0c\u5728 1920x1080 \u5c4f\u5e55\u5206\u8fa8\u7387\u4e0b\u5373\u5b9e\u9645\u5750\u6807\u4e3a (1919, 1079) \uff0c\u8fd9\u6837\u7684\u5199\u6cd5\u53ef\u4ee5\u9002\u914d\u4e0d\u540c\u5927\u5c0f\u7684\u5c4f\u5e55\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0d\u540c\u65b9\u4f4d\uff1a \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0b\u65b9\uff0c\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u4e0d\u9700\u8981\u4f20\u5165\u8be5\u53c2\u6570\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u5de6\u8fb9\uff0cfill_color_position=(1, 1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u53f3\u8fb9\uff0cfill_color_position=(-1, -1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0a\u8fb9\uff0cfill_color_position=(1, 1) \u4ece\u684c\u9762\u542f\u52a8\u5e94\u7528\uff0c\u5219\u9700\u8981\u4f20\u5165\u9664\u4efb\u52a1\u680f\u4ee5\u5916\u5176\u4ed6\u4f4d\u7f6e\u7684\u5750\u6807\uff0c\u6bd4\u5982(100, 100)\uff0c\u53ea\u8981\u8fd9\u4e2a\u5750\u6807\u4e3a\u9664\u5e94\u7528\u548c\u4efb\u52a1\u680f\u533a\u57df\u90fd\u53ef\u4ee5\u3002 \u4ece\u542f\u52a8\u5668\u91cc\u9762\u542f\u52a8\u5e94\u7528\uff0c\u9700\u8981\u586b\u5145\u7684\u5750\u6807\u4e3a\u542f\u52a8\u5668\u533a\u57df\u3002 \u6ce8\uff1a\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u65f6\uff0c\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684 icon \u539f\u6587\u4ef6\u4e3a svg \u77e2\u91cf\u56fe\uff0c\u8f6c\u6362\u4e3a png \u4e4b\u540e\u9700\u8981\u586b\u5145\u8fb9\u7f18\u900f\u660e\u90e8\u5206\u3002 \u53c2\u6570 size size \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (25, 70)\uff0c\u8868\u793a\u6d4b\u8bd5\u673a\u4e0a dock \u680f\u4e0a\u5e94\u7528\u56fe\u6807\u7684\u5927\u5c0f\u8303\u56f4\u3002 UOS \u7cfb\u7edf dock \u680f\u662f\u53ef\u4ee5\u4e0a\u4e0b\u62d6\u52a8\u5927\u5c0f\u7684\uff0c\u968f\u7740 dock \u680f\u5927\u5c0f\u6539\u53d8\uff0c\u5e94\u7528\u56fe\u6807\u7684\u8303\u56f4\u4e3a25\u523070\u4e4b\u95f4\u3002 \u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u64cd\u4f5c\u7cfb\u7edf\u4e0a dock \u680f\u5927\u5c0f\u4e0d\u4e00\u6837\uff0c\u53ef\u4ee5\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u4f20\u5165\u5927\u5c0f\u8303\u56f4\u3002 2.2\u3001click_element\u3001 right_click_element\uff0c double_click_element \u8fd9\u51e0\u4e2a\u65b9\u6cd5\u53c2\u6570\u89c4\u5219\u4e0e find_element \u65b9\u6cd5\u4e00\u6837\u3002\u4ed6\u4eec\u5b9e\u9645\u4e0a\u662f\u5728 find_element \u65b9\u6cd5\u57fa\u7840\u4e4b\u4e0a\u505a\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u589e\u52a0\u4e86\u9f20\u6807\u7684\u52a8\u4f5c\uff0c\u5982\u679c\u4f60\u4e0d\u60f3\u4f7f\u7528\u8fd9\u51e0\u4e2a\u65b9\u6cd5\uff0c\u5728\u7528\u4f8b\u4e2d\u4e5f\u53ef\u4ee5\u901a\u8fc7 find_element \u83b7\u53d6\u5230\u5750\u6807\uff0c\u7136\u540e\u5c06\u5750\u6807\u4f20\u5165\u5230\u952e\u9f20\u7684\u65b9\u6cd5\u4e2d\uff0c\u53ef\u4ee5\u5b9e\u73b0\u540c\u6837\u7684\u6548\u679c\u3002 2.3\u3001\u7528\u4f8b\u7c7b\u4e2d\u6709\u4e2a\u7c7b\u53d8\u91cf icon = [\"deepin-album\"] \u9700\u8981\u7279\u6b8a\u8bf4\u660e\uff0c\u5217\u8868\u4e2d\u7684\u5143\u7d20\u4e3a\u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709 icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684 icon \u5230\u670d\u52a1\u7aef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528 desktop \u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684 desktop \u6587\u4ef6\u540d\u4e3a deepin-album.desktop\uff0c\u53ea\u9700\u8981\u5199 deepin-album \u5373\u53ef\uff0c.desktop \u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e03\u3001\u6267\u884c\u5165\u53e3","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"1\u3001\u7528\u4f8b\u7ec4\u7ec7","text":"\u5728 setting/config/server.ini \u6587\u4ef6\u4e2d APP_NAME= \u5b57\u6bb5\u4e3a\u7528\u4f8b\u7684\u6267\u884c\u7684\u76ee\u5f55\uff0c\u9ed8\u8ba4\u4e3a apps \u76ee\u5f55\u4e0b\u6240\u6709\u7528\u4f8b\u3002\u5982\u679c\u4f60\u60f3\u6307\u5b9a\u6267\u884c\u67d0\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4f60\u53ef\u4ee5\u5c06\u8be5\u914d\u7f6e\u9879\u6307\u5b9a\u5230\u5e94\u7528\u7684\u7528\u4f8b\u76ee\u5f55\uff0c\u6bd4\u5982\uff1aAPP_NAME=deepin_album\uff0c \u8868\u793a\u6267\u884c\u76f8\u518c\u76ee\u5f55\u4e0b\u7684\u7528\u4f8b\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a python3 manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music\n -k KEYWORDS, --keywords KEYWORDS\n \u7528\u4f8b\u7684\u5173\u952e\u8bcd\n -t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e\n --log_level LOG_LEVEL \u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n --env {host,docker} \u5728\u5bbf\u4e3b\u673a\u6216\u5bb9\u5668\u73af\u5883\u6267\u884c\n --client_alias \u9009\u62e9\u6d4b\u8bd5\u673a\u522b\u540d, \u53ef\u9009\u9879\u4e3aclient.ini\u4e2d\u5df2\u914d\u7f6e, \u9ed8\u8ba4\u503c\u4e3a zx-x86.\n --count \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a python3 manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\" --env docker\n \u6ce8\uff1a\u5728\u5bb9\u5668\u4e2d\u6267\u884c\u65f6\uff0c\u82e5\u5f3a\u5236\u9000\u51fa\uff0c\u5bb9\u5668\u5e76\u4e0d\u4f1a\u505c\u6b62\u8fd0\u884c\uff01"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_9","title":"\u516b\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1json","title":"1\u3001Json \u62a5\u544a","text":"\u81ea\u7814\u89c6\u9891\u89e3\u6790\u5de5\u5177\u4f1a\u5bf9\u5355\u6761\u7528\u4f8b\u6267\u884c\u4e00\u8f6e\u751f\u6210\u4e00\u4e2a json \u6587\u4ef6\uff0c\u5b58\u653e\u4e8e report/{app_name}/{scene}/{run_num} \u76ee\u5f55\u4e0b\uff0c\u547d\u540d\u683c\u5f0f\u4e3a\uff1a report.json json \u5185\u5bb9\u4e3e\u4f8b\uff1a [\n{\n\"Stab1\": {\n\"images\": [1,2...150,151],\n\"startStub\": 0,\n\"type\": \"Stab\"\n}\n},\n{\n\"Stab2\": {\n\"images\": [152,153...169,170],\n\"startStub\": 1,\n\"type\": \"UnStab\"\n}\n},\n{\n\"Stab3\": {\n\"images\": [171,172...300,301],\n\"startStub\": 0,\n\"type\": \"UnStab\"\n}\n}\n]\n \u8bf4\u660e\uff1a Stab \uff1a\u8868\u793a\u89e3\u6790\u8fc7\u7a0b\u4e2d\u4e0d\u540c\u7684\u9636\u6bb5\u3002 images \uff1a\u8868\u793a\u6bcf\u4e00\u5e27\u7684\u56fe\u7247\u5e8f\u53f7\u3002 startStub\uff1a \u4e3a\u8bc6\u522b\u5c3e\u5e27\u7684\u9636\u6bb5\u8868\u793a\uff0c\u5982\u679c \"startStub\": 1 \uff0c\u8bf4\u660e\u5c3e\u5e27\u51fa\u73b0\u5728\u8be5\u9636\u6bb5\u3002 type\uff1a \u4e3a Stab \u6216 UnStab \uff0c\u8868\u793a\u7a33\u5b9a\u9636\u6bb5\u6216\u4e0d\u7a33\u5b9a\u9636\u6bb5\u3002 \u5404\u9636\u6bb5\u6709\u5e27\u6570\u8865\u507f\uff0c\u9ed8\u8ba4\u8865\u507f\u7684\u5e27\u6570\u4e3a 3 \u5e27\uff08\u53ef\u4ee5\u901a\u8fc7 server.ini \u91cc\u9762 un_stab_start=3 \u8fdb\u884c\u914d\u7f6e\uff09\uff0c\u8868\u793a\u5c0f\u4e8e\u7b49\u4e8e 3 \u5e27\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u524d\u540e\u5747\u9700\u8981\u51cf\u6389\u3002 \u5e94\u7528\u542f\u52a8\u9636\u6bb5\u5c31\u662f\u5728 Stab2 \u9636\u6bb5\uff0c\u542f\u52a8\u65f6\u95f4\u4e3a\uff1a171 \u51cf 151 \u518d\u51cf\u6389\u524d\u540e\u8865\u507f\u5e27\u6570 6 \u5e27\uff0c\u5373 14 \u5e27\uff0c\u89c6\u9891\u5e27\u7387 30 \u5e27/\u79d2\uff0c\u56e0\u6b64\u542f\u52a8\u8017\u65f6\u4e3a\uff1a14 * 33 = 462 ms"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2excel","title":"2\u3001Excel \u62a5\u544a","text":"\u6240\u6709\u7528\u4f8b\u6267\u884c\u5e76\u89e3\u6790\u5b8c\u4e4b\u540e\u4f1a report \u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a\u6c47\u603b\u6570\u636e\u7684 Excel \u6587\u4ef6\uff0c\u6587\u4ef6\u540d\u4e3a\uff1a{time}_perf_time.xlsx\u3002 \u6ce8\u610f\uff0creport \u76ee\u5f55\u4e3a\u53ef\u914d\u7f6e\u9879\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u4f1a\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u751f\u6210\uff0c\u5982\u679c\u4f60\u5c06 report\uff0c\u6307\u5b9a\u5230\u9879\u76ee\u4e0b\u5176\u4ed6\u8def\u5f84\uff0c\u5219\u4f1a\u5728\u5bf9\u5e94\u7684\u8def\u5f84\u4e0b\u751f\u6210 json \u548c Excel \u6587\u4ef6\u3002 \u4f60\u4e5f\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8bfb\u53d6\u6240\u6709 json / excel \u62a5\u544a\u7684\u6570\u636e\uff0c\u751f\u6210\u4f60\u81ea\u5df1\u60f3\u8981\u7684\u4e00\u4e9b\u6d4b\u8bd5\u62a5\u544a\u5f62\u5f0f\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#usb","title":"\u4e5d\u3001USB \u4e32\u53e3\u9a71\u52a8\u952e\u9f20\u65b9\u6cd5","text":"\u4f4d\u4e8e src/utils/control/serial_communication \u76ee\u5f55\u4e0b\u7684 usb_mk.py \u6587\u4ef6 usb_mk = UsbMk()\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up()\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u652f\u6301\u4f20\u5165\u6c49\u5b57\uff0c\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click()\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() \n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() \n \uff084\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() \n \uff085\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() \n \uff086\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() \n \uff087\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff088\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff0810\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_10","title":"\u5341\u3001\u7ee7\u7535\u5668\u63a7\u5236\u4e3b\u673a\u5f00\u673a/\u91cd\u542f","text":"\uff08\u82e5\u4e0d\u4f7f\u7528\u7ee7\u7535\u5668\uff0c\u53ef\u5ffd\u7565\u8be5\u6b65\u9aa4\uff0c\u6267\u884c\u65f6\u4f1a\u901a\u8fc7\u547d\u4ee4 reboot\uff09"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u7ee7\u7535\u5668\u8bbe\u5907","text":"LCUS-2 \u578b \u53cc\u8def USB \u667a\u80fd\u4e32\u53e3\u63a7\u5236\u7ee7\u7535\u5668\u3002 https://item.taobao.com/item.htm?spm=a1z09.2.0.0.41d72e8dUYx2pi&id=582653718178&_u=i25r20ia6a2e "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2usb","title":"2\u3001USB \u5ef6\u957f\u7ebf","text":"\u666e\u901a\u7684 USB \u7ebf\u5373\u53ef\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_3","title":"3\u3001\u675c\u90a6\u7ebf","text":"3.1\u300140P \u6bcd\u5bf9\u516c\u675c\u90a6\u7ebf\u3002 3.2\u3001\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"4\u3001\u5b89\u88c5\u56fe\u6587\u6559\u7a0b","text":"4.1\u3001\u4f7f\u7528 USB \u5ef6\u957f\u7ebf\u8fde\u63a5\u63a7\u5236\u7aef\u548c\u7ee7\u7535\u5668\u3002 4.2\u3001\u5728\u7ee7\u7535\u5668\u5e38\u7aef\u548c\u516c\u5171\u7aef\u5747\u8fde\u63a5\u4e00\u6839\u675c\u90a6\u7ebf\u3002 4.3\u3001\u5728\u4e3b\u677f\u4e0a\u5f00\u673a\u9488\u548c\u91cd\u542f\u9488\u4e0a\u63d2\u4e0a\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 4.4\u3001\u5c06\u5f00\u673a\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76841\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1\u5de6\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 4.5\u3001\u5c06\u91cd\u542f\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76842\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1 \u53f3\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 \u82e5\u60f3\u4fdd\u7559\u539f\u7535\u6e90\u5f00\u5173\u7684\u7535\u6e90\u706f\uff0c\u53ef\u6839\u636e\u5982\u4e0a\u56fe\u6240\u793a\uff0c\u4f7f\u7528\u675c\u90a6\u7ebf\u8fde\u63a5\u4e3b\u677f\u4e0a\u7684\u7535\u6e90\u706f\u548c\u539f\u7535\u6e90\u5f00\u5173"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_11","title":"\u5341\u4e00\u3001\u5e38\u89c1\u95ee\u9898\u8bf4\u660e","text":"1\u3001ERROR: for uos Cannot restart container 2301b1a1395d7959ee6523d61b61c87084649af530786cdb8fb5b3ecbcbd1068: linux runtime spec devices: error gathering device information while adding custom device \"/dev/ttyACM0\": no such file or directory \u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u8fde\u63a5\u72b6\u6001\uff0c\u67e5\u770b /dev/ttyACM0 \u662f\u5426\u5b58\u5728\uff0c\u82e5\u5b58\u5728 /dev/ttyACMn\uff08n\u4e3a\u4efb\u610f\u6570\u5b57\uff09\uff0c\u91cd\u542f\u7535\u8111\u89e3\u51b3\u3002 2\u3001Error response from daemon: Container 5e700fdc769e8c74666d68a7f2bc3de58268b4594cf88706609d59f8dbc7362d is not running \u5bb9\u5668\u542f\u52a8\u5931\u8d25 1\uff09\u68c0\u67e5\u54ea\u4e00\u4e2a\u5bb9\u5668\u672a\u542f\u52a8 sudo docker container ls # \u5217\u51fa\u8fd0\u884c\u4e2d\u7684 Docker \u5bb9\u5668\n 2\uff09\u7f3a\u5c11 uos \u5bb9\u5668\uff0c\u68c0\u67e5 USB \u4e32\u53e3\u8fde\u63a5\u7ebf\u548c\u91c7\u96c6\u76d2\u8fde\u63a5\u7ebf\u662f\u5426\u6b63\u5e38\uff0c\u91cd\u542f\u540e\u6267\u884c bash install/setup.up # \u91cd\u65b0\u5b8c\u6574\u90e8\u7f72\u73af\u5883\n \u6216\u6267\u884c sudo docker-compose up -d --build # \u4ec5\u91cd\u65b0\u6784\u5efa Docker \u955c\u50cf\n 3\u3001\u82e5\u90e8\u7f72\u65f6\u63d0\u793a\u6302\u8f7d ttyACM0\u3001video0 \u5931\u8d25\uff0c\u8bf7\u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u53ca\u91c7\u96c6\u76d2\u662f\u5426\u63a5\u89e6\u826f\u597d\uff0c\u82e5\u63a5\u89e6\u826f\u597d\uff0c\u91cd\u542f\u5373\u53ef\u89e3\u51b3\u3002 4\u3001\u82e5\u51fa\u73b0\u56fe\u7247\u80fd\u8bc6\u522b\uff0c\u4f46\u662f\u9f20\u6807\u672a\u79fb\u52a8\u64cd\u4f5c\u65f6\uff0c\u5b89\u88c5\u7edd\u5bf9\u9f20\u6807\u64cd\u4f5c\u7684\u4f9d\u8d56\u5305\uff0c\u89c1\u7b2c\u4e09\u8282\u7b2c\u4e8c\u5c0f\u8282\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u6d4b\u8bd5\u673a\u3002 5\u3001\u7531\u4e8e\u901a\u8fc7\u91c7\u96c6\u5361\u83b7\u53d6\u7684\u6d4b\u8bd5\u673a\u5b9e\u65f6\u753b\u9762\uff0c\u5305\u542b\u4e86\u9f20\u6807\u7684\u6837\u5f0f\uff0c\u6240\u4ee5\u5bf9\u56fe\u7247\u8bc6\u522b\u65f6\uff0c\u9f20\u6807\u82e5\u505c\u7559\u5728\u56fe\u6807\u4e0a\u5c42\uff0c\u5219\u4f1a\u5bf9\u8bc6\u522b\u7ed3\u679c\u9020\u6210\u5f71\u54cd\uff0c\u9700\u8981\u5c06\u9f20\u6807\u79fb\u52a8\u81f3\u5176\u4ed6\u4f4d\u7f6e\uff0c\u6216\u8005\u9690\u85cf\u9f20\u6807\u89e3\u51b3\u3002 6\u3001Excel \u62a5\u544a\u4e2d\uff0c\u6d4b\u8bd5\u573a\u666f\u5217\u4e0e\u7528\u4f8b\u4e2d\u7684\u4e0d\u4e00\u81f4\uff0c\u5173\u952e\u5b57scene\u3001app_name\u3001\u67b6\u6784\u522b\u540d\uff0c\u4e0d\u80fd\u5305\u542b\u4e0b\u5212\u7ebf\u548c\u82f1\u6587\u7b26\u53f7\u7684\u5706\u62ec\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/","title":"\u6846\u67b6\u529f\u80fd\u4ecb\u7ecd","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2023/1/12\n# Author : Mikigo\n# =============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_2","title":"\u4e00\u3001\u4e00\u53e5\u8bdd\u7b80\u4ecb","text":"\u6b64\u6587\u6863\u4e3b\u8981\u60f3\u5bf9 YouQu \u6846\u67b6\u4e00\u4e9b\u91cd\u70b9\u7684\u529f\u80fd\u505a\u8be6\u7ec6\u7684\u4ecb\u7ecd\uff0c\u5305\u62ec\u5bf9\u4e00\u4e9b\u529f\u80fd\u5f00\u53d1\u7684\u80cc\u666f\u3001\u8981\u89e3\u51b3\u7684\u95ee\u9898\u3001\u5b9e\u73b0\u903b\u8f91\u3001\u4ee3\u7801\u7b49\u65b9\u9762\u7684\u4ecb\u7ecd\uff0c\u4ee5\u6b64\u8ba9\u5927\u5bb6\u80fd\u66f4\u52a0\u6e05\u6670\u7684\u7406\u89e3\u5404\u9879\u529f\u80fd\uff0c\u4ece\u800c\u5728\u4f7f\u7528\u7684\u65f6\u5019\u80fd\u66f4\u52a0\u7684\u5f97\u5fc3\u5e94\u624b\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_3","title":"\u4e8c\u3001\u56fe\u50cf\u8bc6\u522b","text":"\u56fe\u50cf\u8bc6\u522b\u5728 UI \u81ea\u52a8\u5316\u4e2d\u662f\u4e0d\u53ef\u7f3a\u5c11\u7684\uff0c\u5e02\u9762\u4e0a\u751a\u81f3\u6709\u5b8c\u5168\u57fa\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\uff0c\u6bd4\u5982 Airtest\u3001Sikuli \u7b49\uff0c\u5728\u6e38\u620f\u7b49\u7279\u5b9a\u9886\u57df\u4e5f\u6709\u4e0d\u9519\u7684\u6548\u679c\uff0c\u8fd9\u4e9b\u5de5\u5177\u5b9e\u9645\u4e0a\u4e5f\u662f\u7528\u7684 OpenCV \u8fdb\u884c\u4e86\u5c01\u88c5\uff0cYouQu \u6846\u67b6\u57fa\u4e8e OpenCV \u5f00\u53d1\u4e86\u81ea\u5df1\u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\uff0c\u5b83\u53ef\u4ee5\u65b9\u4fbf\u7684\u7528\u4e8e\u754c\u9762\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u65ad\u8a00\uff1b YouQu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u51e0\u4e4e\u6ee1\u8db3\u4e86\u4f60\u7684\u6240\u6709\u8981\u6c42\uff0c\u6211\u4eec\u5728\u957f\u65f6\u95f4\u7684\u601d\u8003\u548c\u6478\u7d22\u4e2d\uff0c\u9488\u5bf9\u5e38\u89c4\u573a\u666f\u53ca\u4e00\u4e9b\u7279\u6b8a\u573a\u666f\u63a2\u7d22\u9664\u4e86\u4e00\u4e9b\u5b9e\u7528\u4e14\u6709\u6548\u7684\u65b9\u6848\uff0c\u4e14\u542c\u6211\u6162\u6162\u9053\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1","title":"1\u3001\u5e38\u89c4\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5e38\u89c4\u8bc6\u522b\u5f88\u597d\u7406\u89e3\uff0c\u4e00\u53e5\u8bdd\u8bb2\u5c31\u662f\uff0c\u8981\u83b7\u53d6\u5230\u76ee\u6807\u5143\u7d20\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u3002 \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u5728\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u9700\u8981\u83b7\u53d6\u7684\u5750\u6807\u662f\u76f8\u5bf9\u4e8e\u6574\u4e2a\u5c4f\u5e55\u7684\u5750\u6807\uff0c\u6211\u4eec\u53ef\u4ee5\u622a\u53d6\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u56fe\u7247\uff08screen\uff09\uff1b \u5728\u5143\u7d20\u8bc6\u522b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u622a\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5c0f\u56fe\u8fdb\u884c\u8bc6\u522b\uff0c\u6bd4\u5982\u622a\u53d6\u64ad\u653e\u6309\u94ae\uff1a \u90a3\u4e48\u5b9e\u9645\u4e0a\uff0c\u5143\u7d20\u5b9a\u4f4d\u7684\u95ee\u9898\u5c31\u8f6c\u6362\u4e3a\uff0c\u5c06\u622a\u56fe\u7684\u5c0f\u56fe\uff08play_btn\uff09\u62ff\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u5927\u56fe\uff08screen\uff09\u4e2d\u53bb\u505a\u5339\u914d\uff0c\u5982\u679c\u5339\u914d\u6210\u529f\uff0c\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff08 x, y \uff09\u5373\u53ef\u3002 \u4e3a\u4e86\u65b9\u4fbf\u63cf\u8ff0\uff0c\u4ee5\u4e0b\u6211\u5c06\u6574\u4e2a\u5c4f\u5e55\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5927\u56fe\uff0c\u67d0\u4e2a\u5143\u7d20\u56fe\u7247\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5c0f\u56fe\u3002 \u57fa\u4e8e OpenCV \u7684\u6a21\u677f\u5339\u914d cv.matchTemplate() \u529f\u80fd\uff0c\u6211\u4eec\u5b9e\u73b0\u4e86\u56fe\u50cf\u5b9a\u4f4d\u7684\u529f\u80fd\uff0c\u6846\u67b6\u63d0\u4f9b\u4e86\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u5e95\u5c42\u63a5\u53e3\uff08\u4e00\u822c\u4e0d\u5bf9\u4e0a\u5c42\u63d0\u4f9b\u8c03\u7528\uff09\uff1a def _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\n# \u8be6\u7ec6\u4ee3\u7801\u592a\u957f\u4e0d\u8d34\u4e86\uff0c\u611f\u5174\u8da3\u8bf7\u67e5\u770b\u6e90\u7801\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001image_path image_path \u662f\u5c0f\u56fe\u7684\u7edd\u5bf9\u8def\u5f84; \u901a\u5e38\u5728 AT \u5de5\u7a0b\u91cc\u9762\uff0c\u6211\u4eec\u7ea6\u5b9a\u5c06\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u5b9e\u9645\u7684\u5143\u7d20\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1aplay_btn.png \uff1b \u7528\u4e8e\u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 case/assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1amusic_001.png \uff1b \u8fd9\u6837\u662f\u4e3a\u4e86\u65b9\u4fbf\u7ba1\u7406\u548c\u7ef4\u62a4\u3002 2\u3001rate \u56fe\u50cf\u8bc6\u522b\u7684\u7684\u5339\u914d\u5ea6\u6216\u8005\u8bf4\u76f8\u4f3c\u5ea6\uff0c\u6846\u67b6\u9ed8\u8ba4\u7684\u914d\u7f6e\u4e3a 0.9\uff0c\u4e5f\u5c31\u662f\u8bf4\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u5b58\u5728\u4e00\u4e2a\u76f8\u4f3c\u5ea6 90% \u7684\u56fe\u6807\u5373\u8fd4\u56de\u5176\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff1b \u5982\u679c\u4f60\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u8c03\u6574\u8bc6\u522b\u5ea6\uff0c\u4f60\u53ef\u4ee5\u5728\u8c03\u7528\u51fd\u6570\u7684\u65f6\u5019\uff0c\u4f20\u5165\u4e0d\u540c\u7684\u8bc6\u522b\u5ea6\u7684\u503c\u3002 3\u3001multiple \u9ed8\u8ba4\u60c5\u51b5\u4e0b multiple=False\uff0c\u8868\u793a\u53ea\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u7b2c\u4e00\u4e2a\uff0c\u5982\u679c multiple=True \u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\uff0c\u56e0\u4e3a\u5927\u56fe\u4e2d\u53ef\u80fd\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u5c0f\u56fe\uff0c\u5728\u67d0\u4e9b\u573a\u666f\u4e0b\u4f60\u53ef\u80fd\u9700\u8981\u5168\u90e8\u83b7\u53d6\u5230\u6240\u6709\u5339\u914d\u5230\u7684\u5750\u6807\u3002 4\u3001picture_abspath \u9ed8\u8ba4\u60c5\u51b5\u4e0b picture_abspath=None \u8868\u793a\u5927\u56fe\u4e3a\u622a\u53d6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u5982\u679c\u4f60\u4e0d\u5e0c\u671b\u5927\u56fe\u662f\u5c4f\u5e55\u7684\u622a\u56fe\uff0c\u800c\u662f\u4f60\u81ea\u5b9a\u4e49\u4f20\u5165\u7684\u67d0\u4e2a\u56fe\u7247\uff0c\u4f60\u53ea\u9700\u8981\u5c06\u4f60\u7684\u56fe\u7247\u8def\u5f84\u4f20\u9012\u7ed9\u8fd9\u4e2a\u53c2\u6570\u5c31\u884c\uff0c\u6bd4\u5982\uff1a picture_abspath=\"~/Desktop/big.png\" \uff1b 5\u3001screen_bbox \u5927\u56fe\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u622a\u53d6\u6574\u4e2a\u5c4f\u5e55\uff0cscreen_bbox = [x, y, w, h] \u53ef\u4ee5\u6307\u5b9a\u622a\u53d6\u5c4f\u5e55\u4e2d\u7684\u56fa\u5b9a\u533a\u57df\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\uff0c\u53ef\u4ee5\u6392\u9664\u90e8\u5206\u533a\u57df\u5bf9\u8bc6\u522b\u7ed3\u679c\u7684\u5f71\u54cd\u3002 \u3010\u9690\u5f0f\u7b49\u5f85\u3011 \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\uff0c\u6709\u65f6\u5019\u9875\u9762\u8df3\u8f6c\u6709\u5ef6\u65f6\uff0c\u6709\u53ef\u80fd\u5b58\u5728\u8bc6\u522b\u7684\u90a3\u4e00\u523b\u9875\u9762\u4e5f\u6ca1\u6709\u8df3\u8f6c\u51fa\u6765\uff0c\u6216\u8005\u6216\u8005\u8bc6\u522b\u7684\u90a3\u4e00\u523b\uff1b \u56e0\u6b64\u6211\u4eec\u9700\u8981\u4e00\u79cd\u7b49\u5f85\u673a\u5236\uff0c\u5373\u5728\u4e00\u5b9a\u7684\u65f6\u95f4\u5185\uff0c\u5982\u679c\u8bc6\u522b\u4e0d\u5230\uff0c\u91cd\u590d\u53bb\u8bc6\u522b\uff1a def find_image(\ncls,\n*widget, rate: [float, int] = None,\nmultiple: bool = False,\nmatch_number: int = None,\npicture_abspath: str = None,\nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u5728\u5c4f\u5e55\u4e2d\u533a\u5bfb\u627e\u5c0f\u56fe\uff0c\u8fd4\u56de\u5750\u6807\uff0c\n \u5982\u679c\u627e\u4e0d\u5230\uff0c\u6839\u636e\u914d\u7f6e\u91cd\u8bd5\u6b21\u6570\uff0c\u6bcf\u6b21\u95f4\u96941\u79d2\n :param widget: \u6a21\u677f\u56fe\u7247\u8def\u5f84\n :param rate: \u76f8\u4f3c\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param match_number: \u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\n :return: \u5750\u6807\u5143\u7ec4\n \"\"\"\nif rate is None:\nrate = float(GlobalConfig.IMAGE_RATE)\ntry:\nfor element in widget:\nfor _ in range((match_number or int(GlobalConfig.IMAGE_MATCH_NUMBER)) + 1):\nlocate = cls._match_image_by_opencv(\nelement,\nrate,\nmultiple=multiple,\npicture_abspath=picture_abspath,\nscreen_bbox=screen_bbox\n)\nif not locate:\nsleep(int(GlobalConfig.IMAGE_MATCH_WAIT_TIME))\nelse:\nreturn locate\nraise TemplateElementNotFound(*widget)\nexcept Exception as e:\nraise e\n \u53c2\u6570 match_number \u7528\u4e8e\u63a7\u5236\u91cd\u590d\u8bc6\u522b\u7684\u6b21\u6570\uff0c\u9ed8\u8ba4\u4e0d\u4f20\u53c2\uff0c\u53d6\u5168\u5c40\u914d\u7f6e setting/globalconfig.ini \u91cc\u9762\u7684 IMAGE_MATCH_NUMBER \u914d\u7f6e\u9879\u7684\u503c\uff0c\u9ed8\u8ba4IMAGE_MATCH_NUMBER = 1\uff0c\u5373\u91cd\u8bd5 1 \u6b21\uff1b find_image \u662f\u6846\u67b6\u63d0\u4f9b\u7684\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u51fd\u6570\u63a5\u53e3\uff0c\u8fd9\u4e2a\u51fd\u6570\u63d0\u4f9b\u4e86\u9690\u5f0f\u7b49\u5f85\u7684\u529f\u80fd\uff0c\u4e14\u5305\u542b\u4e0a\u9762\u4ecb\u7ecd\u7684 _match_image_by_opencv \u51fd\u6570\u7684\u6240\u6709\u529f\u80fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2","title":"2\u3001\u6c14\u6ce1\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u6c14\u6ce1\u8bc6\u522b\u6307\u7684\u662f\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\u8981\u5b9a\u4f4d\u7684\u5143\u7d20\u662f\u4e00\u4e9b\u4f1a\u6d88\u5931\u7684\u5c0f\u5f39\u7a97\uff0c\u8fd9\u7c7b\u573a\u666f\u5728\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\u5c31\u53ef\u80fd\u5b58\u5728\u4e0d\u7a33\u5b9a\u6027\uff0c\u6709\u53ef\u80fd\u56fe\u50cf\u8bc6\u522b\u7684\u65f6\u5019\u6c14\u6ce1\u5df2\u7ecf\u6d88\u5931\u4e86\uff0c\u4e5f\u6709\u53ef\u80fd\u6c14\u6ce1\u51fa\u73b0\u7684\u65f6\u95f4\u592a\u77ed\u4e86\uff0c\u4e0d\u5bb9\u6613\u6355\u6349\u5230\uff0c\u5c31\u50cf\u6c14\u6ce1\u4e00\u6837\uff0c\u51fa\u73b0\u4e00\u4e0b\u5c31\u6d88\u5931\uff0c\u56e0\u6b64\u6211\u4eec\u5f62\u8c61\u7684\u79f0\u4e4b\u4e3a \u201c\u6c14\u6ce1\u8bc6\u522b\u201d\uff1b \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u4e3a\u4e86\u80fd\u7a33\u5b9a\u7684\u8bc6\u522b\u6c14\u6ce1\u7c7b\u573a\u666f\uff0c\u6211\u4eec\u91c7\u7528\u7684\u65b9\u6848\u662f\uff1a \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\uff08\u5305\u542b\u6c14\u6ce1\u4ece\u51fa\u73b0\u5230\u6d88\u5931\uff09\uff0c\u4e0d\u505c\u7684\u622a\u53d6\u8fd9\u6bb5\u65f6\u95f4\u5185\u7684\u5927\u56fe\uff0c\u4ee5\u6b64\u786e\u4fdd\u5728\u622a\u53d6\u7684\u4e00\u5806\u56fe\u7247\u4e2d\uff0c\u80af\u5b9a\u6709\u81f3\u5c11\u4e00\u5f20\u56fe\u7247\u80fd\u6355\u6349\u5230\u6c14\u6ce1\uff0c\u6700\u540e\u518d\u5bf9\u8fd9\u4e00\u5806\u56fe\u7247\u9010\u4e2a\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def get_during(\ncls,\nimage_path: str,\nscreen_time: [float, int],\nrate: float = None,\npause: [int, float] = None,\nmax_range: int = 10000\n):\n\"\"\"\n \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u622a\u56fe\u591a\u5f20\u56fe\u7247\u8fdb\u884c\u8bc6\u522b\uff0c\u5176\u4e2d\u6709\u4e00\u5f20\u56fe\u7247\u8bc6\u522b\u6210\u529f\u5373\u8fd4\u56de\u7ed3\u679c;\n \u9002\u7528\u4e8e\u6c14\u6ce1\u7c7b\u7684\u65ad\u8a00\uff0c\u6bd4\u5982\u6c14\u6ce1\u57281\u79d2\u5185\u6d88\u5931\uff0c\u5982\u679c\u7528\u5e38\u89c4\u7684\u56fe\u50cf\u8bc6\u522b\u5219\u6709\u53ef\u80fd\u65e0\u6cd5\u8bc6\u522b\u5230\uff1b\n :param image_path: \u8981\u8bc6\u522b\u7684\u6a21\u677f\u56fe\u7247\uff1b\n :param screen_time: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff1b\n :param rate: \u8bc6\u522b\u7387\uff1b\n :param pause: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u4e0d\u95f4\u9694\uff1b\n :param max_range: \u622a\u56fe\u7684\u6700\u5927\u6b21\u6570\uff0c\u8fd9\u662f\u4e00\u4e2a\u9884\u8bbe\u503c\uff0c\u4e00\u822c\u60c5\u51b5\u4e0b\u4e0d\u6d89\u53ca\u4fee\u6539\uff1b\n \"\"\"\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001screen_time \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5728\u6b64\u65f6\u95f4\u5185\u4f1a\u4e0d\u65ad\u7684\u8fdb\u884c\u622a\u56fe\u64cd\u4f5c\uff0c\u5c31\u50cf\u5f55\u5236\u89c6\u9891\u4e00\u6837\uff1b 2\u3001pause \u6bcf\u6b21\u622a\u53d6\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u4e00\u523b\u4e0d\u505c\u7684\u622a\u56fe\uff0c\u5982\u679c\u4f60\u60f3\u6bcf\u6b21\u622a\u56fe\u5b58\u5728\u4e00\u4e9b\u95f4\u9694\u65f6\u95f4\u4f20\u5165\u5bf9\u5e94\u7684\u65f6\u95f4\u95f4\u9694\u5373\u53ef\uff0c\u5355\u4f4d\u662f\u79d2\uff0c\u6bd4\u5982\uff1apause = 0.03\uff0c\u8868\u793a 30 ms\uff0c\u76f8\u5f53\u4e8e\u5e27\u7387\u4e3a 30 \u5e27\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-opencv","title":"3\u3001\u4e0d\u4f9d\u8d56 OpenCV \u7684\u56fe\u50cf\u8bc6\u522b\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31","title":"3.1\u3001\u81ea\u7814\u56fe\u50cf\u8bc6\u522b\u6280\u672f","text":"\u3010\u539f\u7406\u3011 \u4e3a\u4e86\u5b9e\u73b0\u8bc6\u522b\u56fe\u50cf\u7684\u76ee\u7684\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u5c06\u56fe\u7247\u7684\u6bcf\u4e2a\u50cf\u7d20\u7684RGB\u503c\uff0c\u4e0e\u6574\u4e2a\u5c4f\u5e55\u4e2d\u7684RGB\u8fdb\u884c\u5bf9\u6bd4\uff0c\u5982\u679c\u5c0f\u56fe\u4e0a\u7684RGB\u503c\u4e0e\u5bf9\u5e94\u5927\u56fe\u4f4d\u7f6e\u7684RGB\u90fd\u76f8\u7b49\uff0c\u5219\u5339\u914d\u6210\u529f\uff0c\u5373\u53ef\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u70b9\u3002 1\u3001\u8bfb\u53d6\u5c0f\u56fe\u548c\u5927\u56fe\u7684RGB\u503c \uff081\uff09\u5c0f\u56fe\u7684RGB\u503c small_data = small_pic.load() # load()\u4f1a\u5c06\u56fe\u7247\u7684RGB\u503c\u83b7\u53d6\u5230\uff0c\u6570\u636e\u683c\u5f0f\u4e3a\u4e00\u4e2a\u4e8c\u7ef4\u5217\u8868\uff0c\u8d4b\u503c\u7ed9\u4e00\u4e2a\u53d8\u91cfsmall_data\u3002\n \uff082\uff09\u5927\u56fe\u7684RGB\u503c big_data = big_pic.load()\n 2\u3001\u5c06\u5c0f\u56fe\u4e0e\u5927\u56fe\u7684RGB\u503c\u8fdb\u884c\u5339\u914d \uff081\uff09\u5339\u914d\u4ece\u5927\u56fe\u7684\u5750\u6807\uff080\uff0c0\uff09\u5f00\u59cb\u5339\u914d\uff0c\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff082\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\uff080\uff0c0\uff09\u5bf9\u5e94\u7684\u6240\u6709\u5c0f\u56fe\u7684RGB\u503c\u4e0d\u76f8\u7b49\uff0c\u5219\u79fb\u52a8\u5230\u4e0b\u4e00\u4e2a\u5750\u6807\u70b9\uff081\uff0c0\uff09\uff0c\u540c\u6837\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff083\uff09\u6309\u7167\u8fd9\u6837\u7684\u89c4\u5f8b\u5c06\u8fd9\u4e00\u884c\u6bcf\u79fb\u52a8\u4e00\u4e2a\u5750\u6807\u70b9\uff0c\u90fd\u5c06\u5c0f\u56fe\u6240\u6709\u7684RGB\u4e0e\u5bf9\u5e94\u5927\u56fe\u7684\u503c\u8fdb\u884c\u5339\u914d\uff1b \uff084\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\u5176\u4e2d\u4e00\u4e2a\u5750\u6807\u70b9\u4e0a\u5339\u914d\u5230\u4e86\u5c0f\u56fe\u7684\u6240\u6709RGB\u503c\uff0c\u5219\u6b64\u65f6\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\u70b9\uff1b \uff085\uff09\u5982\u679c\u5339\u914d\u4e86\u5927\u56fe\u6240\u6709\u7684\u5750\u6807\u70b9\uff0c\u90fd\u6ca1\u6709\u5339\u914d\u5230\uff0c\u5219\u8bf4\u660e\u5927\u56fe\u4e2d\u4e0d\u5b58\u5728\u5c0f\u56fe\uff0c\u5339\u914d\u5931\u8d25\uff1b \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 class ImageRgb:\n@staticmethod\ndef _check_match(_x, _y, small, bdata, sdata, rate):\n\"\"\"\n Matching degree of small graph and large graph matching\n \"\"\"\n@staticmethod\ndef _pre_random_point(small):\n\"\"\"\n Pre matching, take 10-20 points at random each time,\n and take coordinates randomly in the small graph\n \"\"\"\n@staticmethod\ndef _pre_random_match(_x, _y, point_list, bdata, sdata, rate):\n\"\"\"\n In the small graph, several points are randomly\n selected for matching, and the matching degree is\n also set for the random points\n \"\"\"\n@classmethod\ndef match_image_by_rgb(cls, image_name=None, image_path=None, rate=0.9):\n\"\"\"\n By comparing the RGB values of the small image with the large\n image on the screen, the coordinates of the small image on\n the screen are returned.\n \"\"\"\n \u901a\u8fc7 match_image_by_rgb() \u8fd9\u4e2a\u51fd\u6570\uff0c\u4f20\u5165\u76ee\u6807\u5c0f\u56fe\u7684\u6587\u4ef6\u540d\u79f0\uff0c\u5373\u53ef\u8fd4\u56de\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u3002 \u6709\u540c\u5b66\u8981\u95ee\u4e86\uff0c\u6709 OpenCV \u5e72\u561b\u4e0d\u7528\uff0c\u6709\u5fc5\u8981\u81ea\u5df1\u5b9e\u73b0\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u529f\u80fd\u5417\uff0c\u4f60\u4eec\u662f\u4e0d\u662f\u95f2\u7684\u554a\uff1f \u8fd9\u4e48\u95ee\u7684\u8bdd\uff0c\u5c0f\u4e86\uff0c\u683c\u5c40\u5c0f\u4e86\uff1b\u6211\u4eec\u81ea\u5df1\u5b9e\u73b0\u4e3b\u8981\u6709\u51e0\u65b9\u9762\u539f\u56e0\uff1a \u51cf\u5c11\u73af\u5883\u4f9d\u8d56\uff0c\u5373\u4e0d\u7528\u5b89\u88c5 OpenCV\uff0c\u6211\u4eec\u4e5f\u80fd\u5b9e\u73b0\u5176\u529f\u80fd\uff0c\u73af\u5883\u4f9d\u8d56\u8fd9\u5757\u540e\u9762\u4f1a\u5355\u72ec\u8be6\u7ec6\u8bb2\uff0c\u51cf\u5c11\u73af\u5883\u4f9d\u8d56\u5bf9\u4e8e\u4efb\u4f55\u8f6f\u4ef6\u5de5\u7a0b\u90fd\u975e\u5e38\u91cd\u8981\uff1b OpenCV \u5728\u5176\u4ed6\u56fd\u4ea7 CPU \u67b6\u6784\u4e0a\u5b89\u88c5\u5e76\u4e0d\u80fd\u4fdd\u8bc1100%\u6210\u529f\uff0c\u751a\u81f3\u6709\u6ca1\u6709\u53ef\u80fd\u5728\u4e00\u4e9b\u67b6\u6784\u4e0a\u538b\u6839\u513f\u5c31\u4e0d\u80fd\u5b89\u88c5\u4f7f\u7528 OpenCV \uff1f \u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 OpenCV \uff1f\u5c31\u50cf\u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 Windows \u5462\uff1f\u8fd9\u4e9b\u95ee\u9898\u503c\u5f97\u601d\u8003\u3002 \u5f53\u7136\uff0c\u6211\u4eec\u627f\u8ba4\u8fd9\u5957\u65b9\u6848\uff0c\u867d\u7136\u8bc6\u522b\u51c6\u786e\u7387\u6ca1\u95ee\u9898\uff0c\u4f46\u5728\u8bc6\u522b\u6548\u7387\u4e0a\u8fd8\u6ca1\u6709\u8fbe\u5230 OpenCV \u6a21\u677f\u5339\u914d\u7684\u6548\u679c\uff0c\u6211\u4eec\u7684\u65b9\u6848\u6bcf\u6b21\u8bc6\u522b\u5728 1.5s \u5de6\u53f3\uff0c\u800c OpenCV \u5728 1s \u5de6\u53f3\uff1b \u6574\u4f53\u8bc6\u522b\u6548\u679c\u6765\u8bb2\uff0c\u6211\u8ba4\u4e3a\u8fd8\u662f\u53ef\u4ee5\u63a5\u53d7\u7684\uff0c\u4e5f\u5e0c\u671b\u6709\u5fd7\u4e4b\u58eb\u80fd\u4e00\u8d77\u4f18\u5316\u6b64\u65b9\u6848\uff0c\u4e00\u8d77\u6280\u672f\u62a5\u56fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32-rpc","title":"3.2\u3001\u57fa\u4e8e RPC \u670d\u52a1\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b","text":"\u5728\u8fdc\u7a0b\u670d\u52a1\u5668\u4e0a\u90e8\u7f72 OpenCV \u7684\u73af\u5883\uff0c\u5e76\u5c06\u5176\u90e8\u7f72\u4e3a RPC \u670d\u52a1\uff0c\u6d4b\u8bd5\u673a\u4e0a\u4e0d\u7528\u5b89\u88c5 OpenCV \u4f9d\u8d56\uff0c\u800c\u662f\u901a\u8fc7\u8bf7\u6c42 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u3010\u539f\u7406\u3011 \u6d4b\u8bd5\u673a\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u56fe\u7247\u4ee5\u53ca\u6a21\u677f\u56fe\u7247\uff0c\u53d1\u9001\u7ed9 RPC \u670d\u52a1\u7aef\uff0c\u670d\u52a1\u7aef\u62ff\u5230\u4e24\u5f20\u56fe\u7247\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u6700\u540e\u5c06\u8bc6\u522b\u7ed3\u679c\u8fd4\u56de\u7ed9\u6d4b\u8bd5\u673a\uff1b \u8981\u7279\u6b8a\u8bf4\u660e\u7684\u662f\uff1a RPC \u662f\u4e00\u79cd\u534f\u8bae\uff0c\u8bb8\u591a\u8bed\u8a00\u90fd\u662f\u652f\u6301\u7684\uff0c\u6bd4\u5982\u8bf4\u670d\u52a1\u7aef\u4e5f\u53ef\u4ee5\u7528 C++ \u6765\u5b9e\u73b0\uff0c\u5ba2\u6237\u7aef\u4f7f\u7528 Python \u4e5f\u662f\u53ef\u4ee5\u8c03\u7528\u7684\u3002 \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 \u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nimport cv2 as cv\nimport numpy as np\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\nif __name__ == \"__main__\":\nserver = ThreadXMLRPCServer((\"x.x.x.x\", 8889), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(match_image_by_opencv, \"match_image_by_opencv\")\nserver.serve_forever()\n \u8fd9\u6837\uff0c\u6211\u4eec\u57fa\u4e8e Python \u6807\u51c6\u5e93 xmlrpc \u642d\u5efa\u4e86\u4e00\u4e2a RPC \u670d\u52a1\u5668\uff0c\u6ce8\u518c\u4e86 image_put \u548c match_image_by_opencv \u4e24\u4e2a\u529f\u80fd\u63a5\u53e3\uff0c\u5728\u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u901a\u8fc7 IP \u548c\u7aef\u53e3\u8fdb\u884c RPC \u8bf7\u6c42\uff1b \u5ba2\u6237\u7aef\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from xmlrpc.client import Binary\nfrom xmlrpc.client import ServerProxy\nserver = ServerProxy(GlobalConfig.OPENCV_SERVER_HOST, allow_none=True)\nscreen_rb = open(screen, \"rb\")\ntemplate_rb = open(template_path, \"rb\")\ntry:\nscreen_path = server.image_put(Binary(screen_rb.read()))\nscreen_rb.close()\ntpl_path = server.image_put(Binary(template_rb.read()))\ntemplate_rb.close()\nreturn server.match_image_by_opencv(\ntpl_path, screen_path, rate, multiple\n)\nexcept OSError as exc:\nraise EnvironmentError(\nf\"RPC\u670d\u52a1\u5668\u94fe\u63a5\u5931\u8d25. {GlobalConfig.OPENCV_SERVER_HOST}\"\n) from exc\n \u901a\u8fc7\u8fd4\u56de server.match_image_by_opencv \u5c31\u83b7\u53d6\u4e86\u5728\u670d\u52a1\u7aef\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4","title":"4\u3001\u53f3\u952e\u83dc\u5355\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41","title":"4.1\u3001\u53f3\u952e\u83dc\u5355\u5b9a\u4f4d\u7684\u65b9\u6848\u53ca\u95ee\u9898","text":"\u53f3\u952e\u83dc\u5355\u7684\u5143\u7d20\u5b9a\u4f4d\u662f\u4e00\u4e2a\u96be\u70b9\uff0c\u8fc7\u53bb\u6211\u4eec\u8c03\u7814\u548c\u4f7f\u7528\u8fc7\u7684\u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u65b9\u6cd5\u6709 4 \u79cd\uff1a \u7b2c\u4e00\u79cd\uff1a\u6b65\u957f\u64cd\u4f5c\u6cd5 \u5728\u53f3\u952e\u83dc\u5355\u547c\u51fa\u6765\u4e4b\u540e\uff0c\u901a\u8fc7\u952e\u76d8\u7684 up\u3001down \u6309\u952e\uff0c\u8fdb\u884c\u9009\u62e9\u83dc\u5355\u9009\u62e9\uff0c\u9009\u4e2d\u76ee\u6807\u4e4b\u540e enter \u5373\u53ef\uff1b\u6bd4\u5982\uff1a\u5728\u684c\u9762\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\uff0c\u6309 1 \u6b21 down \uff0c\u4f1a\u51fa\u73b0\u4e0b\u56fe\uff1a \u7ee7\u7eed\u518d\u6309 2 \u6b21 down\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u518d\u6309 enter\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u5982\u6b64\uff0c\u201c\u6392\u5e8f\u65b9\u5f0f\u201d\u7684\u6b65\u957f\u4e3a 3\uff1b\u901a\u8fc7\u4f7f\u7528\u952e\u76d8\u4e0a\u4e0b\u952e\uff0c\u5c31\u5b9e\u73b0\u4e86\u5bf9\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\uff1b \u4f46\u662f\uff0c\u8fd9\u79cd\u65b9\u5f0f\u6709\u4e2a\u5f88\u70e6\u4eba\u7684\u95ee\u9898\uff0c\u5c31\u662f\u53f3\u952e\u83dc\u5355\u7684\u9009\u9879\u4f4d\u7f6e\u4e0d\u53ef\u80fd\u4e00\u76f4\u4e0d\u53d8\uff0c\u5728\u9700\u6c42\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\uff0c\u83dc\u5355\u9009\u9879\u7684\u53d8\u5316\u662f\u5f88\u5927\u7684\uff0c\u751a\u81f3\u6709\u4e9b\u5e94\u7528\u652f\u6301\u81ea\u5b9a\u4e49\u83dc\u5355\uff0c\u6bd4\u5982\u6587\u7ba1\u53f3\u952e\u83dc\u5355\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff1b \u4e5f\u5c31\u662f\u8bf4\u4f60\u5f97\u7ecf\u5e38\u53bb\u7ef4\u62a4\u83dc\u5355\u9009\u9879\u7684\u6b65\u957f\uff0c\u4e00\u4e2a\u9009\u9879\u73b0\u5728\u7684\u6b65\u957f\u662f 3\uff0c\u4e0b\u4e2a\u8fed\u4ee3\u53ef\u80fd\u5c31\u662f 4 \u6216\u8005 5\u3002 \u7b2c\u4e8c\u79cd\uff1a\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u6cd5 \u628a\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5355\u72ec\u622a\u56fe\u4fdd\u5b58\uff0c\u56fe\u7247\u4e2d\u4ec5\u5305\u542b\u4e00\u4e2a\u83dc\u5355\u9009\u9879\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u8fd9\u6837\uff0c\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5c31\u53ef\u4ee5\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u65b9\u5f0f\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u8fd9\u79cd\u65b9\u5f0f\u4e0d\u7528\u62c5\u5fc3\u83dc\u5355\u9009\u9879\u7684\u987a\u5e8f\u6216\u4f4d\u7f6e\uff0c\u4f46\u662f\u9700\u8981\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff0c\u4e14\u5bb9\u6613\u53d7\u5230\u5b57\u4f53 UI \u53d8\u66f4\u7c7b\u9700\u6c42\u7684\u5f71\u54cd\uff0c\u6bd4\u5982\uff1a\u5b57\u4f53\u5927\u5c0f\u3001\u5b57\u4f53\u95f4\u8ddd\u7b49\u7b49\u9700\u6c42\u53d8\u66f4\u90fd\u4f1a\u5f71\u54cd\uff0c\u6bcf\u6b21\u53d8\u66f4\u4e4b\u540e\u5c31\u9700\u8981\u8fdb\u884c\u5927\u91cf\u56fe\u7247\u8d44\u6e90\u7684\u91cd\u65b0\u622a\u56fe\u66ff\u6362\uff0c\u662f\u4e2a\u6bd4\u8f83\u9ebb\u70e6\u7684\u4e8b\u60c5\uff1b \u7b2c\u4e09\u79cd\uff1a\u76f8\u5bf9\u4f4d\u79fb\u6cd5 \u9f20\u6807\u70b9\u51fb\u53f3\u952e\u7684\u65f6\u5019\uff0c\u9f20\u6807\u7684\u5f53\u524d\u5750\u6807\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u7684\uff0c\u83dc\u5355\u9009\u9879\u7684\u5bbd\uff08 w \uff09\u4e00\u822c\u662f\u56fa\u5b9a\u7684\uff0c\u53d8\u5316\u7684\u662f\u83dc\u5355\u7684\u957f\u5ea6\uff08 h \uff09\uff0c\u53ef\u4ee5\u901a\u8fc7\u67d0\u4e2a\u9009\u9879\u76f8\u5bf9\u4e8e\u9f20\u6807\u7684\u8ddd\u79bb\u5728\u786e\u5b9a\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u901a\u8fc7\u7ef4\u62a4\u83dc\u5355\u9009\u9879\uff08\u76f8\u5bf9\u4f4d\u7f6e\uff09\u76f8\u5bf9\u4e8e\u9f20\u6807\u4f4d\u7f6e\u7684\u8ddd\u79bb\uff0c\u5373\u53ef\u8f7b\u677e\u8ba1\u7b97\u51fa\u83dc\u5355\u9009\u9879\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\u3002 \u4ece\u7406\u8bba\u4e0a\u6b64\u65b9\u6848\u662f\u53ef\u884c\u7684\uff0c\u4f46\u662f\u8fd9\u91cc\u4ecd\u7136\u5b58\u5728\u4e24\u4e2a\u4e25\u91cd\u7684\u95ee\u9898\uff1a \u83dc\u5355\u987a\u5e8f\u6539\u53d8\uff0c\u5bfc\u81f4\u76f8\u5bf9\u8ddd\u79bb\u6539\u53d8\uff0c\u800c\u4e14\u8ddd\u79bb\u662f\u901a\u8fc7\u50cf\u7d20\uff08px\uff09\u6765\u8868\u793a\u7684\uff0c\u4e0d\u60f3\u6b65\u957f\u90a3\u4e48\u53ea\u7ba1\uff0c\u6bcf\u6b21\u9700\u8981\u53bb\u91cf\u4e00\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u70b9\u9ebb\u70e6\uff1b \u9f20\u6807\u5728\u684c\u9762\u4e0d\u540c\u4f4d\u7f6e\u70b9\u51fb\u53f3\u952e\uff0c\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u4f4d\u7f6e\u662f\u4e0d\u540c\u7684\uff0c\u4e0a\u56fe\u7684\u83dc\u5355\u662f\u5728\u9f20\u6807\u7684\u5de6\u4e0b\u65b9\uff0c\u5982\u679c\u4f60\u79fb\u52a8\u9f20\u6807\u5230\u5c4f\u5e55\u56db\u8fb9\uff0c\u4f60\u4f1a\u53d1\u73b0\uff0c\u53f3\u952e\u83dc\u5355\u53ef\u80fd\u51fa\u73b0\u5728\u9f20\u6807\u7684\u56db\u4e2a\u65b9\u5411\uff0c\u4e5f\u5c31\u662f\u8bf4\u4f60\u9700\u8981\u6839\u636e\u9f20\u6807\u7684\u4e0d\u540c\u4f4d\u7f6e\u6765\u5224\u65ad\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u65b9\u5411\uff0c\u800c\u4e0d\u540c\u7684\u65b9\u5411\u4e0a\u8ba1\u7b97\u65b9\u6cd5\u662f\u4e0d\u540c\u7684\uff0c\u6bd4\u5982\uff1a\u53f3\u952e\u83dc\u5355\u5728\u9f20\u6807\u7684\u5de6\u4e0a\uff0c\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\u8ba1\u7b97\u65b9\u6cd5\u4e3a\uff08x - w / 2\uff0c y - h\uff09\uff0c\u8fd9\u6837\u7ef4\u62a4\u8d77\u6765\u53ef\u4ee5\u8bf4\u975e\u5e38\u590d\u6742\uff1b \u57fa\u4e8e\u4ee5\u4e0a\u4e24\u4e2a\u539f\u56e0\uff0c\u6211\u4eec\u5e76\u4e0d\u63a8\u8350\u8fd9\u79cd\u64cd\u4f5c\u65b9\u6848\u3002 \u7b2c\u56db\u79cd\uff1a\u5c5e\u6027\u5b9a\u4f4d \u6709\u540c\u5b66\u8bf4\u5e72\u561b\u4e0d\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u5462\uff0c\u5176\u5b9e\uff0c\u6211\u4eec\u6700\u5f00\u59cb\u60f3\u5230\u7684\u65b9\u6848\u5c31\u662f\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\uff0c\u4f46\u662f\u5728\u5c5e\u6027\u7684 DOM \u6811\u91cc\u600e\u4e48\u4e5f\u627e\u4e0d\u5230\uff0c\u65e0\u6cd5\u5b9a\u4f4d\u5230\uff0c\u6211\u4eec\u4e5f\u8054\u5408\u7814\u53d1\u540c\u5b66\u4e00\u8d77\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u4f46\u6700\u7ec8\u8fd8\u662f\u6ca1\u80fd\u89e3\u51b3\uff0c\u975e\u5e38\u9057\u61be\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42","title":"4.2\u3001\u6700\u65b0\u7684\u53f3\u952e\u83dc\u5355\u7ec8\u6781\u89e3\u51b3\u65b9\u6848","text":"\u7531\u4e8e\u53f3\u952e\u83dc\u5355\u9009\u9879\u51e0\u4e4e\u90fd\u662f\u6587\u672c\uff0c\u90a3\u4e48\u901a\u8fc7 OCR \u8bc6\u522b\uff0c\u51e0\u4e4e\u662f\u6700\u4f18\u7684\u65b9\u6848\uff1a \u4e0d\u7528\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff1b \u4e0d\u4f1a\u53d7\u5230\u83dc\u5355\u9009\u9879\u987a\u5e8f\u6539\u53d8\u7684\u5f71\u54cd\uff1b \u4e0d\u4f1a\u53d7\u5230\u5b57\u4f53 UI \u53d8\u5316\u7684\u5f71\u54cd\uff1b \u5173\u4e8e OCR \u8bc6\u522b\u6211\u4eec\u5728\u540e\u9762\u4f1a\u8be6\u7ec6\u8bb2\u5230\uff0c\u672c\u7ae0\u8282\u4e3b\u8981\u8bb2\u57fa\u4e8e OCR \u8bc6\u522b\uff0c\u6211\u4eec\u5728\u53f3\u952e\u83dc\u5355\u8bc6\u522b\u4e0a\u7684\u7a81\u7834\u548c\u521b\u65b0\uff1b \u4f7f\u7528 OCR \u8bc6\u522b\u53f3\u952e\u83dc\u5355\u867d\u7136\u5df2\u7ecf\u5f88\u5b8c\u7f8e\u4e86\uff0c\u4f46\u662f\u5728\u4e00\u4e9b\u60c5\u51b5\u4e0b\u4ecd\u7136\u5b58\u5728\u4e00\u70b9\u95ee\u9898\uff0c\u5c31\u662f\u5c4f\u5e55\u4e2d\u51fa\u73b0\u591a\u4e2a\u548c\u83dc\u5355\u9009\u9879\u6587\u5b57\u76f8\u540c\u7684\u6587\u5b57\u65f6\uff0c\u6bd4\u5982\u4e0b\u9762\u8fd9\u79cd\u60c5\u51b5\uff1a \u5c4f\u5e55\u6070\u597d\u51fa\u73b0\u4e86\u4e24\u4e2a\u201c\u590d\u5236\u201d\uff0c\u6b64\u65f6\u8981\u5b9a\u4f4d\u5230\u83dc\u5355\u4e2d\u7684 \u201c\u590d\u5236\u201d\uff0c\u5c31\u9700\u8981\u8fdb\u4e00\u6b65\u505a\u6570\u636e\u5904\u7406\uff0c\u6bd4\u5982\uff1aOCR \u8fd4\u56de 2 \u4e2a\u201c\u590d\u5236\u201d\u7684\u5750\u6807\uff0c\u7528\u4f8b\u91cc\u9762\u6765\u5224\u65ad\u7528\u54ea\u4e2a\uff0c\u4ece\u4e1a\u52a1\u4e0a\u5c06\u5904\u7406\u8d77\u6765\u6bd4\u8f83\u9ebb\u70e6\uff0c\u56e0\u4e3a\u4f60\u5f97\u660e\u786e\u77e5\u9053\u83dc\u5355\u5728\u5de6\u8fb9\u8fd8\u662f\u53f3\u8fb9\uff0c\u7136\u540e\u8fd9\u672c\u8eab\u5c31\u662f\u4e0d\u786e\u5b9a\u7684\uff1b \u600e\u4e48\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u5462\uff0c\u8fd9\u5c31\u8981\u8bf4\u9053\u672c\u7ae0\u7684\u4e3b\u9898\uff1a\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b\u3002 \u3010\u539f\u7406\u3011 \u5728\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u524d\u622a\u4e00\u5f20\u56fe\uff0c\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\u518d\u622a\u53d6\u4e00\u5f20\u56fe\uff0c\u4e24\u5f20\u56fe\u552f\u4e00\u53d8\u5316\u7684\u5c31\u662f\u53f3\u952e\u83dc\u5355\uff0c\u5c06\u5176\u4ed6\u76f8\u540c\u7684\u5730\u65b9\u90fd\u5c4f\u853d\u6389\uff0c\u53ea\u7559\u4e0b\u83dc\u5355\u754c\u9762\uff0c\u5982\u6b64\u5373\u53ef\u6d88\u9664\u5e72\u6270\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u5c06\u4e24\u79cd\u56fe\u505a\u524d\u540e\u5bf9\u6bd4\u63d0\u53d6\u53ef\u4ee5\u5f97\u5230\u8fd9\u6837\u7684\u56fe\uff1a \u4f60\u770b\uff0c\u901a\u8fc7\u524d\u540e\u56fe\u7247\u7684\u5bf9\u6bd4\uff0c\u5c06\u76f8\u540c\u7684\u90e8\u5206\u7ed9\u6d88\u9664\u6389\uff0c\u518d\u8fdb\u884c OCR \u8bc6\u522b\uff0c\u8fd9\u6837\u5c31\u4e0d\u4f1a\u6709\u5e72\u6270\u4e86\uff1b \u4ee3\u7801\u5b9e\u73b0\u8bf7\u67e5\u770b src/filter_image.py \uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def filter_image(action):\n\"\"\"\n \u5bf9\u6bd4\u52a8\u4f5c\u524d\u540e\u4e24\u5f20\u56fe\u7247\uff0c\u63d0\u53d6\u4e0d\u540c\u7684\u90e8\u5206\u751f\u6210\u4e00\u5f20\u65b0\u7684\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u65b0\u56fe\u7247\u7684\u8def\u5f84\n :param action: \u52a8\u4f5c\u51fd\u6570\u7684\u51fd\u6570\u5bf9\u8c61\n :return: \u65b0\u56fe\u7247\u7684\u8def\u5f84\n \"\"\"\n action \u662f\u9f20\u6807\u4e8b\u4ef6\uff0c\u56e0\u4e3a\u6b64\u7c7b\u573a\u666f\u4e0d\u4ec5\u4ec5\u5728\u53f3\u952e\u5b58\u5728\uff0c\u5355\u51fb\u3001\u53cc\u51fb\u7b49\u7b49\uff0c\u53ea\u8981\u64cd\u4f5c\u524d\u540e\u540e\u53d8\u5316\u7684\u90fd\u53ef\u4ee5\uff1a from src.mouse_key import MouseKey\naction = (\nMouseKey.click,\nMouseKey.right_click,\nMouseKey.double_click,\nMouseKey.move_to,\n)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5","title":"5\u3001\u52a8\u6001\u56fe\u50cf\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5728\u684c\u9762\u58c1\u7eb8\u5207\u6362\uff0c\u6216\u770b\u56fe\u3001\u76f8\u518c\u5207\u6362\u56fe\u7247\u7c7b\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u7531\u4e8e\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u662f\u4e0d\u56fa\u5b9a\u7684\uff08\u4e0d\u540c\u7248\u672c\u7684\u7cfb\u7edf\u58c1\u7eb8\u4e0d\u540c\u3001\u58c1\u7eb8\u987a\u5e8f\u4e0d\u540c\uff0c\u770b\u56fe\u76f8\u518c\u5728\u56fe\u7247\u8d44\u6e90\u4e0d\u4e00\u5b9a\u56fa\u5b9a\uff09\uff0c\u90a3\u4e48\u5728\u6d4b\u8bd5\u5207\u6362\u58c1\u7eb8\u6216\u8005\u5207\u6362\u56fe\u7247\u7684\u573a\u666f\u65f6\u5c31\u4f1a\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u4f60\u4e0d\u77e5\u9053\u9884\u671f\u662f\u5565\uff0c\u7528\u4f8b\u64cd\u4f5c\u52a8\u6001\u7684\uff0c\u4e5f\u662f\u6781\u4e0d\u7a33\u5b9a\u3002 \u3010\u539f\u7406\u3011 \u5728\u5207\u6362\u56fe\u7247\u4e4b\u524d\u622a\u56fe\u4fdd\u5b58\u5e76\u8fd4\u56de\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u6b21\u8bc6\u522b\u8fd9\u5f20\u56fe\u7247\uff0c\u5982\u679c\u4e0d\u5b58\u5728\uff0c\u8bf4\u660e\u56fe\u7247\u5df2\u7ecf\u5207\u6362\u4e86\uff1b \u793a\u610f\u56fe\uff1a \u8fd9\u6837\uff0c\u6211\u4eec\u622a\u53d6\u4e86\u5f53\u524d\u56fe\u7247\u4e2d\u6bd4\u8f83\u6709\u4ee3\u8868\u6027\u7684\u4f4d\u7f6e\uff08\u4e00\u53ea\u9e1f\uff09\uff0c\u5728\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u7528\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1a \u6211\u4eec\u518d\u62ff\u7740\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd9\u6837\u5728\u5f53\u524d\u56fe\u7247\u4e2d\uff0c\u5c31\u4e0d\u80fd\u627e\u5230\u8fd9\u53ea\u9e1f\u4e86\uff0c\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u662f False\uff0c\u90a3\u4e48\u4e5f\u5c31\u53ef\u4ee5\u5224\u65ad\u56fe\u7247\u5207\u6362\u662f\u6210\u529f\u7684\u3002 \u4ee3\u7801\u793a\u610f\uff1a def save_temporary_picture(_x: int, _y: int, width: int, height: int):\n\"\"\"\n \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u56fe\u7247\u8def\u5f84\n :param x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n :param y: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n :param width: \u5bbd\u5ea6\n :param height: \u9ad8\u5ea6\n :return: \u56fe\u7247\u8def\u5f84\n \"\"\"\n \u6b64\u51fd\u6570\u7528\u4e8e\u5728\u64cd\u4f5c\u4e4b\u524d\u622a\u56fe\u4e00\u5f20\u4e34\u65f6\u56fe\u7247\uff0c\u8fd4\u56de\u56fe\u7247\u8def\u5f84\uff0c\u6700\u540e\u5728\u65ad\u8a00\u7684\u65f6\u5019\u518d\u5c06\u56fe\u7247\u8def\u5f84\u4f5c\u4e3a\u53c2\u6570\u4f20\u5165\u65ad\u8a00\u8bed\u53e5\u5373\u53ef\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ui","title":"\u4e09\u3001\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_1","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u662f\u6211\u4eec\u81ea\u7814\u7684\u4e00\u79cd\u4f7f\u7528\u7b80\u5355\uff0c\u4e14\u6548\u7387\u6781\u9ad8\u3001\u7a33\u5b9a\u6027\u597d\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u57fa\u4e8e\u5143\u7d20\u6309\u94ae\u5728\u5e94\u7528\u4e2d\u7684\u76f8\u5bf9\u4f4d\u7f6e\uff0c\u52a8\u6001\u83b7\u53d6\u5143\u7d20\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff0c\u9002\u7528\u4e8e\u5404\u79cd\u5c4f\u5e55\u5206\u8fa8\u7387\uff08\u5305\u62ec\u9ad8\u5206\u5c4f\u3001\u5bbd\u5c4f\u3001\u5e26\u9c7c\u5c4f\uff09\uff0c\u5f53\u5143\u7d20\u6309\u94ae\u4f4d\u7f6e\u76f8\u5bf9\u4e8e\u5e94\u7528\u754c\u9762\u4f4d\u7f6e\u53d1\u751f\u4fee\u6539\u4e4b\u540e\uff0c\u53ea\u9700\u8981\u6839\u636e UI \u8bbe\u8ba1\u56fe\u4e0a\u7684\u6e90\u6570\u636e\u4fee\u6539\u5bf9\u5e94\u5750\u6807\u6570\u636e\u5c31\u597d\uff0c\u7ef4\u62a4\u975e\u5e38\u7684\u65b9\u4fbf\u3002 \u6b64\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u9002\u7528\u4e8e\u4e00\u4e9b\u5143\u7d20\u4f4d\u7f6e\u76f8\u5bf9\u4e0e\u5e94\u7528\u754c\u9762\u6bd4\u8f83\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u97f3\u4e50\uff0899% \u7684\u5143\u7d20\u5b9a\u4f4d\u91c7\u7528\u8fd9\u79cd\uff0c\u6548\u679c\u975e\u5e38\u597d\uff09\uff0c\u4e0d\u9002\u7528\u4e8e\u754c\u9762\u4e0d\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u622a\u56fe\u5f55\u5c4f\uff0c\u5f88\u660e\u663e\u4e0d\u9002\u7528\u4e8e\u8fd9\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u3002\u8fd9\u79cd\u5168\u65b0\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u6709\u5b83\u7684\u9002\u7528\u6761\u4ef6\uff0c\u5982\u679c\u4f60\u53d1\u73b0\u4f7f\u7528\u5e38\u89c4\u7684\uff08\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u5b9a\u4f4d\uff09\u4e0d\u597d\u505a\u65f6\uff0c\u4e0d\u59a8\u8003\u8651\u4f7f\u7528\u8fd9\u79cd\uff0c\u5176\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff0c\u5e76\u4e14\u8fc5\u901f\u7231\u4e0a\u4ed6\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_1","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5728 UI \u8bbe\u8ba1\u56fe\u4e2d\u6211\u4eec\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u8fb9\u6846\u7684\u8ddd\u79bb\u7684\uff0c\u7136\u540e\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u6280\u672f\u624b\u6bb5\u83b7\u53d6\u5230\u5e94\u7528\u754c\u9762\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u53ca\u5e94\u7528\u7a97\u53e3\u7684\u5927\u5c0f\uff0c\u793a\u610f\u56fe\u5982\u4e0b\uff1a \uff08x1, y1\uff09\u4e3a\u5e94\u7528\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\uff1b\uff08x2, y2\uff09\u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u5de6\u4e0a\u89d2\uff08x1, y1\uff09\u7684\u5750\u6807\uff0c\u90a3\u4e48\u5b9e\u9645\u4e0a\u3010\u64ad\u653e\u6240\u6709\u3011\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\u4e3a\uff1a\uff08 x1 + x2, y1 + y2 \uff09\uff1b \u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5927\u5c0f\uff08w2, h2\uff09\uff0c\u53ef\u4ee5\u4ece UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\uff1b \u5728 UI \u8bbe\u8ba1\u7a3f\u4e0a\u70b9\u51fb\u3010\u64ad\u653e\u6240\u6709\u3011\u56fe\u6807\uff0c\u7136\u540e\u79fb\u52a8\u9f20\u6807\u5c31\u5c31\u53ef\u4ee5\u770b\u5230\u4e0a\u56fe\u7684\u53c2\u8003\u7ebf\u53ca\u6570\u636e\uff1b \u6240\u4ee5\uff0c\u6211\u4eec\u53ef\u4ee5\u8f7b\u677e\u7684\u83b7\u53d6\u5230\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u4e2d\u5fc3\u5750\u6807\u4e3a\uff1a\uff08 x1 + x2 + (w2 / 2), y1 + y2 + ( h2 / 2) \uff09 \u8be6\u7ec6\u6e90\u4ee3\u7801\u8bf7\u67e5\u770b AT \u57fa\u7840\u6846\u67b6: src/button_center.py \u83b7\u53d6\u5e94\u7528\u7a97\u53e3\u7684\u4fe1\u606f \u4f7f\u7528 xdotool \u548c xwininfo \u83b7\u53d6\u5230\u5e94\u7528\u7a97\u53e3\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u5de6\u4e0a\u89d2\uff09\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a app_id = CmdCtl.run_cmd(f\"xdotool search --classname --onlyvisible {self.app_name}\"\n).split(\"\\n\")\napp_id_list = [int(_id) for _id in app_id if _id]\nreturn CmdCtl.run_cmd(f\"xwininfo -id {app_id_list[self.number]}\")\n \u4f7f\u7528\u6b63\u5219\u83b7\u53d6\u7a97\u53e3\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u83b7\u53d6\u914d\u7f6e \u8bfb ini \u914d\u7f6e\u6587\u4ef6\uff0c\u83b7\u53d6\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e0e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a conf = ConfigParser()\nconf.read(self.config_path)\ndirection = conf.get(btn_name, \"direction\")\nposition = [int(i.strip()) for i in conf.get(btn_name, \"location\").split(\",\")]\n \u8ba1\u7b97\u5143\u7d20\u6309\u94ae\u5750\u6807 \u6839\u636e\u5e94\u7528\u7a97\u53e3\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u5927\u5c0f\u3001\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u5927\u5c0f\uff0c\u4f7f\u7528\u4e00\u5b9a\u7684\u7b97\u6cd5\u5373\u53ef\u8ba1\u7b97\u51fa\u5143\u7d20\u6309\u94ae\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u4e2d\u5fc3\u5750\u6807\uff09\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3","title":"3\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u3010\u914d\u7f6e\u65b9\u6cd5\u3011 \u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u7684\u6570\u636e\u6e90\u662f\u5e94\u7528\u5e93\u4e2d\u7684 ui.ini \u914d\u7f6e\u6587\u4ef6\uff1a ;section\n[\u65b0\u5efa\u6b4c\u5355+] ;key = value\ndirection = left_top\nlocation = 180, 268, 21, 21\n section \u662f\u4f60\u6839\u636e\u5bf9\u5e94\u7684\u5143\u7d20\u6309\u94ae\u547d\u540d\uff0c\u4f60\u53ef\u4ee5\u4efb\u610f\u547d\u540d\uff0c\u4f46\u6700\u597d\u6709\u5177\u4f53\u542b\u4e49\uff0c\u4e14\u80fd\u660e\u786e\u8868\u793a\u8fd9\u4e2a\u5143\u7d20\u6309\u94ae\u7684\u540d\u79f0\uff1b\u7528\u4e2d\u62ec\u53f7\u62ec\u8d77\u6765\u5c31\u884c\uff0c\u6bd4\u5982\uff1a[\u65b0\u5efa\u6b4c\u5355+] \uff1b direction \u662f\u914d\u7f6e\u8be5\u5143\u7d20\u7684\u53c2\u8003\u7cfb\uff0c\u5206\u522b\u4e3a\uff1a left_top \u5de6\u4e0a\uff1b left_bottom \u5de6\u4e0b\uff1b right_top \u53f3\u4e0a\uff1b right_bottom \u53f3\u4e0b\uff1b \u53c2\u8003\u7cfb\u7684\u9009\u53d6\u6807\u51c6\uff1a\u62c9\u52a8\u6539\u53d8\u7a97\u53e3\u5927\u5c0f\u65f6\uff0c\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u53c2\u8003\u7cfb\u4f4d\u7f6e\u662f\u4e0d\u53d8\u7684\uff1b location \u662f\u8be5\u5143\u7d20\u6309\u94ae\u7684\u76f8\u5bf9\u4e0e\u53c2\u8003\u7cfb\u7684 x, y \u7684\u8ddd\u79bb\uff0c\u53ca\u5927\u5c0f(w, h)\uff0c\u8fd9\u56db\u4e2a\u6570\u636e\u53ef\u4ee5\u901a\u8fc7 UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\u6570\u636e\uff0c\u5728\u7f16\u8f91\u6a21\u5f0f\u4e0b\uff0c\u70b9\u51fb UI \u56fe\u4e0a\u7684\u6309\u94ae\uff0c\u53f3\u4fa7\u5c31\u4f1a\u51fa\u73b0\u8be5\u5143\u7d20\u6309\u94ae\u7684 x, y, w, h \u6570\u636e\u3002 \u5982\u679c UI \u56fe\u4e0a\u6ca1\u6709\u63d0\u4f9b\u4f60\u60f3\u8981\u7684\u5143\u7d20\u6570\u636e\uff0c\u4f60\u53ef\u4ee5\u76f4\u63a5\u5728\u7cfb\u7edf\u4e2d\u4f7f\u7528\u622a\u56fe\u5f55\u5c4f\u8fdb\u884c\u5c3a\u91cf\uff0c\u8fd9\u662f\u4e00\u79cd\u4e0d\u63a8\u8350\u4f46\u80fd\u7528\u7684\u65b9\u6cd5\u3002 \u3010\u8c03\u7528\u65b9\u6cd5\u3011 \u5728\u5e94\u7528\u5e93\u65b9\u6cd5\u5c42\u8fd9\u6837\u5199\uff1a def click_add_music_list_btn_in_music_by_ui(self):\n\"\"\"\u70b9\u51fb\u65b0\u5efa\u6b4c\u5355\u6309\u94ae\"\"\"\nself.click(*self.ui.btn_center(\"\u65b0\u5efa\u6b4c\u5355+\"))\n self.ui.btn_center() \u662f\u56fa\u5b9a\u5199\u6cd5\uff0c\u53c2\u6570\u5c31\u662f\u914d\u7f6e\u91cc\u9762\u7684 section \u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ocr","title":"\u56db\u3001OCR \u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_2","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 OCR \u65b9\u6848\u5927\u591a\u91c7\u7528\u8c37\u6b4c OCR\uff08Tesseract\uff09\u65b9\u6848\uff0c\u4f46\u662f\u5b83\u5bf9\u4e8e\u4e2d\u6587\u7684\u8bc6\u522b\u975e\u5e38\u5dee\uff0c\u7ecf\u8fc7\u5927\u91cf\u7684\u8c03\u7814\uff0c\u6211\u4eec\u4f7f\u7528 PaddleOCR\uff0c\u5b83\u662f\u4e00\u4e2a\u5f00\u6e90\u7684\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u8bc6\u522b\u5de5\u5177\uff0c\u4e5f\u662f PaddlePaddle \u6700\u6709\u540d\u7684\u4e00\u4e2a\u5f00\u6e90\u9879\u76ee\uff0c\u611f\u5174\u8da3\u7684\u53ef\u4ee5\u70b9\u8fd9\u91cc\u4e86\u89e3\uff0c\u591a\u7684\u4e0d\u8bf4\u4e86\uff0c\u4f60\u53ea\u9700\u8981\u77e5\u9053\u5b83\u5c31\u662f\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_2","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5b89\u88c5\u4ed6\u662f\u4e2a\u5f88\u9ebb\u70e6\u7684\u4e8b\u60c5\uff0c\u867d\u7136\u64cd\u4f5c\u5f88\u7b80\u5355\uff0c\u4f46\u5176\u5b9e\u5b89\u88c5\u5305\u6709\u70b9\u5927\uff0c\u56e0\u6b64\u6211\u4eec\u4e0d\u5e0c\u671b\u76f4\u63a5\u5728 env.sh \u4e2d\u52a0\u5165\u5b83\uff0c\u8fd9\u4f1a\u8ba9\u6574\u4e2a\u81ea\u52a8\u5316\u73af\u5883\u53d8\u5f97\u975e\u5e38\u81c3\u80bf\uff1b \u56e0\u6b64\uff0c\u6211\u4eec\u60f3\u5230\u5c06\u5b83\u505a\u6210\u4e00\u4e2a RPC \u670d\u52a1\u5728\u5176\u4ed6\u673a\u5668\u4e0a\u90e8\u7f72\uff0c\u6d4b\u8bd5\u673a\u901a\u8fc7\u8fdc\u7a0b\u8c03\u7528 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u4f7f\u7528\u5b83\uff1b RPC \u7684\u8c03\u7528\u903b\u8f91\uff1a \u8fd9\u6837\u6211\u4eec\u53ea\u9700\u8981\u5728\u670d\u52a1\u7aef\u90e8\u7f72\u597d OCR \u8bc6\u522b\u7684\u670d\u52a1\uff0c\u7136\u540e\u901a\u8fc7 RPC \u670d\u52a1\u5c06\u529f\u80fd\u63d0\u4f9b\u51fa\u6765\uff0c\u6846\u67b6\u91cc\u9762\u53ea\u9700\u8981\u8c03\u7528\u5bf9\u5e94\u7684 RPC \u63a5\u53e3\u5c31\u884c\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_1","title":"3\u3001\u4f7f\u7528\u8bf4\u660e","text":"\u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nfrom paddleocr import PaddleOCR\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef paddle_ocr(pic_path, lang):\n\"\"\"\n Paddleocr\u76ee\u524d\u652f\u6301\u7684\u591a\u8bed\u8a00\u8bed\u79cd\u53ef\u4ee5\u901a\u8fc7\u4fee\u6539lang\u53c2\u6570\u8fdb\u884c\u5207\u6362\n \u4f8b\u5982`ch`, `en`, `fr`, `german`, `korean`, `japan`\n :param file_name:\n :param lang:\n :return:\n \"\"\"\nif __name__ == \"__main__\":\nIP = popen(\"hostname -I\").read().split(\" \")[0]\nPORT = 8890\nSCREEN_CACHE = \"/tmp/screen.png\"\nserver = ThreadXMLRPCServer((IP, PORT), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(paddle_ocr, \"paddle_ocr\")\nprint(\"\u76d1\u542c\u5ba2\u6237\u7aef\u8bf7\u6c42\u3002\u3002\")\nserver.serve_forever()\n \u6846\u67b6\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from src import OCR\nOCR.ocr(*target_strings, picture_abspath=None, similarity=0.6, return_default=False, return_first=False, lang=\"ch\"):\n# \u901a\u8fc7 OCR \u8fdb\u884c\u8bc6\u522b\u3002\n# target_strings:\n# \u76ee\u6807\u5b57\u7b26,\u8bc6\u522b\u4e00\u4e2a\u5b57\u7b26\u4e32\u6216\u591a\u4e2a\u5b57\u7b26\u4e32,\u5e76\u8fd4\u56de\u5176\u5728\u56fe\u7247\u4e2d\u7684\u5750\u6807;\n# \u5982\u679c\u4e0d\u4f20\u53c2\uff0c\u8fd4\u56de\u56fe\u7247\u4e2d\u8bc6\u522b\u5230\u7684\u6240\u6709\u5b57\u7b26\u4e32\u3002\n# picture_abspath: \u8981\u8bc6\u522b\u7684\u56fe\u7247\u8def\u5f84\uff0c\u5982\u679c\u4e0d\u4f20\u9ed8\u8ba4\u622a\u53d6\u5168\u5c4f\u8bc6\u522b\u3002\n# similarity: \u5339\u914d\u5ea6\u3002\n# return_default: \u8fd4\u56de\u8bc6\u522b\u7684\u539f\u751f\u6570\u636e\u3002\n# return_first: \u53ea\u8fd4\u56de\u7b2c\u4e00\u4e2a,\u9ed8\u8ba4\u4e3a False,\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u6240\u6709\u6570\u636e\u3002\n# lang: `ch`, `en`, `fr`, `german`, `korean`, `japan`\n \u6b64\u65b9\u6848\u5728\u6846\u67b6\u5185\u6ca1\u6709\u5f15\u5165\u4efb\u4f55\u4e09\u65b9\u4f9d\u8d56\u5b8c\u5168\u91c7\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\uff0c\u800c\u4e14\u4f7f\u7528\u65b9\u6cd5\u975e\u5e38\u7b80\u5355\uff0c\u53ea\u9700\u8981\u901a\u8fc7 OCR.ocr() \u5373\u53ef\uff1b \u5bf9\u4e8e\u4e00\u4e9b\u6587\u6848\u7684\u573a\u666f\u975e\u5e38\u9002\u7528\uff0c\u6b64\u65b9\u6cd5\u76f4\u63a5\u8fd4\u56de\u5750\u6807\uff0c\u53ef\u4ee5\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u3002 \u4e5f\u53ef\u4ee5\u7528\u4e8e\u6587\u5b57\u65ad\u8a00\uff0c\u4ee3\u7801\u793a\u610f\uff1a def assert_ocr_exist(\n*args, picture_abspath=None, similarity=0.6, return_first=False, lang=\"ch\"\n):\n\"\"\"\u65ad\u8a00\u6587\u6848\u5b58\u5728\"\"\"\npic = None\nif picture_abspath is not None:\npic = picture_abspath + \".png\"\nres = OCR.ocr(\n*args,\npicture_abspath=pic,\nsimilarity=similarity,\nreturn_first=return_first,\nlang=lang,\n)\nif res is False:\nraise AssertionError(\n(f\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{args}\", f\"{pic if pic else GlobalConfig.SCREEN_CACHE}\")\n)\nif isinstance(res, tuple):\npass\nelif isinstance(res, dict) and False in res.values():\nres = filter(lambda x: x[1] is False, res.items())\nraise AssertionError(\n(\nf\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{dict(res)}\",\nf\"{pic if pic else GlobalConfig.SCREEN_CACHE}\",\n)\n)\n \u5728\u7528\u4f8b\u4e2d\u4f7f\u7528\u65ad\u8a00\uff0c\u793a\u4f8b\uff1a def test_font_manager_021(self):\n\"\"\"\u53f3\u4fa7\u2665-\u6536\u85cf/\u53d6\u6d88\u6536\u85cf\u5b57\u4f53\"\"\"\n# \u5b57\u4f53\u7ba1\u7406\u5668\u754c\u9762\u53f3\u4fa7\u8be6\u60c5\u5217\u8868\uff0c\u9009\u62e9\u672a\u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e / \u6536\u85cf\u5b57\u4f53\n# \u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e\u83dc\u5355\u663e\u793a\u201c\u53d6\u6d88\u6536\u85cf\u201d\uff1b\n...\nself.assert_ocr_exist(\"\u53d6\u6d88\u6536\u85cf\")\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_1","title":"4\u3001\u670d\u52a1\u7aef\u90e8\u7f72","text":"\u6211\u4eec\u76ee\u524d\u662f\u5c06 OCR \u670d\u52a1\u90e8\u7f72\u5728\u666e\u901a\u7684\u529e\u516c\u673a\u4e0a\u7684\uff0c\u5982\u679c\u4f60\u89c9\u5f97\u73b0\u6709\u7684 OCR \u8bc6\u522b\u6027\u80fd\u4e0d\u591f\u597d\uff0c\u6070\u597d\u4f60\u6709\u66f4\u597d\u7684\u673a\u5668\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u5176\u79c1\u6709\u5316\u90e8\u7f72\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41_1","title":"4.1\u3001\u73af\u5883\u5b89\u88c5","text":"\u63a8\u8350\u4f7f\u7528 pipenv \u8fdb\u884c\u73af\u5883\u642d\u5efa\uff1b \u5b89\u88c5 pipenv \uff1a sudo pip3 install pipenv\n \u65b0\u5efa\u4e00\u4e2a\u76ee\u5f55\u4f5c\u4e3a\u73af\u5883\u5305 ocr_env\uff1a cd ~\nmkdir ocr_env\n \u521b\u5efa python 3.7 \u73af\u5883\uff1a cd ocr_env\npipenv --python 3.7\n \u5b89\u88c5 OCR \u4f9d\u8d56\u5305\uff1a pipenv install paddlepaddle -i https://mirror.baidu.com/pypi/simple\npipenv install \"paddleocr>=2.0.1\" -i https://mirror.baidu.com/pypi/simple\n \u4e0d\u51fa\u610f\u5916\uff0c\u8fd9\u6837\u5c31\u628a\u4f9d\u8d56\u5b89\u88c5\u597d\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42_1","title":"4.2\u3001\u542f\u52a8\u670d\u52a1","text":"\u5c06\u57fa\u7840\u6846\u67b6\u4e2d\u7684 scr/ocr/pdocr_rpc_server.py \u6587\u4ef6\u62f7\u8d1d\u5230 ocr_env \u76ee\u5f55\uff0c\u540e\u53f0\u6267\u884c\u5b83\u5c31\u597d\u4e86\uff1a cd ocr_env\nnohup pipenv run python pdocr_rpc_server.py &\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#43","title":"4.3\u3001\u914d\u7f6e\u5f00\u673a\u81ea\u542f\uff08\u901a\u7528\uff09","text":"\u4f60\u80af\u5b9a\u4e0d\u60f3\u6bcf\u6b21\u673a\u5668\u91cd\u542f\u4e4b\u540e\u90fd\u9700\u8981\u624b\u52a8\u542f\u52a8\u670d\u52a1\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u914d\u7f6e\u5f00\u673a\u81ea\u542f\u3002 \u5199\u5f00\u673a\u81ea\u542f\u670d\u52a1\u6587\u4ef6\uff1a sudo vim /lib/systemd/system/ocr.service\n autoocr \u540d\u79f0\u4f60\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff0c\u5199\u5165\u4ee5\u4e0b\u5185\u5bb9\uff1a [Unit]\nDescription=OCR Service\nAfter=multi-user.target\n\n[Service]\nUser=uos\nGroup=uos\nType=idle\nWorkingDirectory=/home/uos/ocr_env\nExecStart=pipenv run python pdocr_rpc_server.py\n\n[Install]\nWantedBy=multi-user.target\n \u6ce8\u610f\u66ff\u6362\u4f60\u7684${USER} \u4fee\u6539\u914d\u7f6e\u6587\u4ef6\u7684\u6743\u9650\uff1a sudo chmod 644 /lib/systemd/system/ocr.service\n \u81ea\u542f\u670d\u52a1\u751f\u6548\uff1a sudo systemctl daemon-reload\nsudo systemctl enable ocr.service\n \u67e5\u770b\u670d\u52a1\u72b6\u6001\uff1a sudo systemctl status ocr.service\n \u4f60\u53ef\u4ee5\u518d\u91cd\u542f\u4e0b\u7535\u8111\uff0c\u770b\u770b\u670d\u52a1\u662f\u4e0d\u662f\u6b63\u5e38\u542f\u52a8\u4e86\uff0c\u6ca1\u62a5\u9519\u5c31 OK \u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_4","title":"\u4e94\u3001\u5c5e\u6027\u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_3","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 UI \u81ea\u52a8\u5316\u5927\u591a\u90fd\u662f\u57fa\u4e8e\u6d4f\u89c8\u5668\u7684\uff0c\u6838\u5fc3\u662f\u5728\u7f51\u9875\u7684 DOM \u6811\u4e0a\u67e5\u627e\u5143\u7d20\uff0c\u5e76\u5bf9\u5176\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\uff1b Linux \u684c\u9762\u5e94\u7528\u5927\u591a\u662f\u91c7\u7528 Qt \u7f16\u5199\u7684\uff0c\u5728 Qt \u4e2d\u4e5f\u662f\u4ece\u6700\u9876\u5c42\u7684 MainWindow \u5f00\u59cb\u6784\u5efa\u5e94\u7528\uff0c\u6240\u4ee5\u903b\u8f91\u4e5f\u662f\u4e00\u6837\u7684\uff0cQt \u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u540c\u6837\u53ef\u4ee5\u901a\u8fc7 DOM \u6811\uff08\u5c5e\u6027\u6811\uff09\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff0c\u6211\u4eec\u79f0\u4e4b\u4e3a\u5c5e\u6027\u5b9a\u4f4d\u3002 \u501f\u52a9\u5f00\u6e90\u5de5\u5177 dogtail \u6211\u4eec\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u83b7\u53d6\uff0c\u4ece\u800c\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\u3002dogtail \u7684\u9879\u76ee\u4ecb\u7ecd\u53ef\u4ee5\u731b\u6233\u8fd9\u91cc\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_3","title":"2\u3001\u4f7f\u7528\u65b9\u6cd5","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#21sniff","title":"2.1\u3001sniff\uff08\u55c5\u63a2\u5668\uff09\u4f7f\u7528","text":"\u5728\u7ec8\u7aef\u8f93\u5165 sniff \u542f\u52a8 AT-SPI Browser mikigo@mikigo-PC:~$ sniff\n \u67e5\u770b\u5e94\u7528\u7684\u6807\u7b7e \u5728 sniff \u91cc\u9762\u53ef\u4ee5\u770b\u5230\u7cfb\u7edf\u4e2d\u5df2\u542f\u52a8\u7684\u5e94\u7528\uff0c\u70b9\u51fb\u5e94\u7528\u540d\u79f0\u524d\u9762\u7684\u4e09\u89d2\u5f62\u56fe\u6807\uff0c\u53ef\u4ee5\u5c55\u5f00\u5e94\u7528\u7684\u6807\u7b7e\uff0c\u6240\u6709\u6807\u7b7e\u4ee5 tree \u7684\u5f62\u5f0f\u5c55\u793a\uff0c\u5bf9\u5e94\u5e94\u7528\u91cc\u9762\u7684\u7236\u7a97\u53e3\u548c\u5b50\u7a97\u53e3\u3002 \u83b7\u53d6\u5143\u7d20\u63a7\u4ef6\u7684\u6807\u7b7e\u540d\u79f0 \u9996\u5148\uff0c\u4e3a\u4e86\u65b9\u4fbf\u67e5\u770b\u5143\u7d20\u63a7\u4ef6\u5bf9\u5e94\u7684\u4f4d\u7f6e\uff0c\u5efa\u8bae\u73b0\u5728\u4e0a\u65b9\u5de5\u5177\u680f\u70b9\u51fb Actions\uff0c\u7136\u540e\u52fe\u9009 Hightlight Items\uff0c\u8fd9\u6837\u5728 sniff \u4e2d\u9f20\u6807\u9009\u4e2d\u5143\u7d20\u6807\u7b7e\u7684\u65f6\u5019\uff0c\u5e94\u7528\u4e2d\u4f1a\u6709\u76f8\u5e94\u7684\u5149\u6807\u9501\u5b9a\u3002 \u5728 sniff \u91cc\u9762\u70b9\u51fb\u8fdb\u5165\u5e94\u7528\u7684\u6807\u7b7e tree \u4e2d\u540e\uff0c\u70b9\u51fb\u76f8\u5e94\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5728\u5de5\u5177\u4e0b\u65b9\uff0c\u4f1a\u5c55\u793a\u5143\u7d20\u63a7\u4ef6\u7684 Name\uff0c\u8fd9\u4e2a\u5c31\u662f\u6807\u7b7e\u540d\u79f0\u3002 \u5728 tree \u4e2d\u6709\u4e9b\u5730\u65b9\u662f\u7a7a\u767d\u7684\u6216\u8005\u662f Form\uff0c\u662f\u56e0\u4e3a\u5f00\u53d1\u4eba\u5458\u5728\u6dfb\u52a0\u6807\u7b7e\u7684\u65f6\u5019\u6ca1\u6709\u6dfb\u52a0\uff0c\u6216\u8005\u6709\u4e9b\u7236\u7a97\u53e3\u4e0d\u9700\u8981\u6dfb\u52a0\uff0c\u8fd9\u79cd\u5728\u5b9e\u9645\u4e1a\u52a1\u4e2d\u662f\u4e0d\u5f71\u54cd\u7684\uff0c\u6211\u4eec\u53ea\u8981\u4fdd\u8bc1\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\u4e2d\uff0c\u8981\u7528\u5230\u7684\u5143\u7d20\u90fd\u6dfb\u52a0\u4e86\u6807\u7b7e\u5373\u53ef\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#22","title":"2.2\u3001\u5143\u7d20\u64cd\u4f5c","text":"\u83b7\u53d6\u5e94\u7528\u5bf9\u8c61 dogtail \u83b7\u53d6\u5e94\u7528\u5bf9\u8c61\u7684\u65f6\u5019\uff0c\u4f7f\u7528\u7684\u662f tree \u5e93\u91cc\u9762\u7684 application() \u65b9\u6cd5\uff1a from dogtail.tree import root\napp_obj = root.application('deepin-music')\n app_obj\u5c31\u662f\u5e94\u7528\u7684\u5bf9\u8c61\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\uff0c\u662f\u5e94\u7528\u5bf9\u8c61\u4f7f\u7528child()\u65b9\u6cd5\uff1a element = app_obj.child('element_name')\n \u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u4f20\u5165\u5143\u7d20\u7684 Name\uff0c\u83b7\u53d6\u5230\u76f8\u5e94\u5143\u7d20\u7684\u5bf9\u8c61\u3002Name \u53ef\u4ee5\u901a\u8fc7 sniff \u67e5\u770b\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\u5217\u8868: element_list = element.children\n \u83b7\u53d6\u5230\u8fd9\u4e2a\u5143\u7d20\u4e0b\u9762\u6240\u6709\u7684\u5143\u7d20\u5217\u8868\u3002 \u8fd9\u4e2a\u65b9\u6cd5\u9002\u7528\u4e8e\u6709\u4e9b\u6807\u7b7e\u6ca1\u6709\u6dfb\u52a0\uff0c\u4f46\u662f\u4f4d\u7f6e\u662f\u56fa\u5b9a\u7684\uff0c\u6211\u4eec\u901a\u8fc7\u7d22\u5f15\u53ef\u4ee5\u53d6\u5f97\u5143\u7d20\u3002 element_list[0]\n \u5bf9\u5143\u7d20\u7684\u64cd\u4f5c \u5728\u83b7\u53d6\u5230\u5143\u7d20\u4e4b\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u76f8\u5e94\u7684\u64cd\u4f5c\u3002 \u5355\u51fb element.click(button=1)\n button 1 \u2014>\u5de6\u952e\uff0c2 \u2014>\u6eda\u8f6e\uff0c3 \u2014>\u53f3\u952e\uff0c\u9ed8\u8ba4\u4e3a 1 \u53cc\u51fb element.doubleClick(button=1)\n \u9f20\u6807\u60ac\u505c element.point()\n \u9f20\u6807\u79fb\u52a8\u5230\u5143\u7d20\u4e2d\u5fc3\u4f4d\u7f6e \u6587\u672c\u8f93\u5165 element.typeText(string)\n \u5411\u5143\u7d20\u5bf9\u8c61\u8f93\u5165\u5b57\u7b26\u4e32 \uff0c\u6bd4\u5982\u8f93\u5165\u6846 \u7ec4\u5408\u952e element.keyCombo(comboString)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#23","title":"2.3\u3001\u6846\u67b6\u5c01\u88c5","text":"\u4ee3\u7801\u793a\u4f8b\uff1a # \u8be6\u7ec6\u4ee3\u7801\u8bf7\u67e5\u770b src/dogtail_utils.py\nclass DogtailUtils:\ndef __init__(self, name=None, description=None):\nself.name = name\nself.description = description\nself.obj = root.application(self.name, self.description)\ndef app_element(self, *args, **kwargs):\n\"\"\"\n \u83b7\u53d6app\u5143\u7d20\u7684\u5bf9\u8c61\n :return: \u5143\u7d20\u7684\u5bf9\u8c61\n \"\"\"\nreturn self.obj.child(*args, **kwargs, retry=False)\ndef element_center(self, element) -> tuple:\n\"\"\"\n \u83b7\u53d6\u5143\u7d20\u7684\u4e2d\u5fc3\u4f4d\u7f6e\n :param element:\n :return: \u5143\u7d20\u4e2d\u5fc3\u5750\u6807\n \"\"\"\n_x, _y, _w, _h = self.app_element(element).extents\n_x = _x + _w / 2\n_y = _y + _h / 2\nreturn _x, _y\n \u6846\u67b6\u63d0\u4f9b\u7684\u63a5\u53e3\u975e\u5e38\u7b80\u6d01\uff0c\u5728\u8c03\u7528\u65f6\uff1a self.dog.element_center(\"\u64ad\u653e\")\n \u8fd9\u6837\u5c31\u80fd\u83b7\u53d6\u5230\u6b64\u5143\u7d20\u7684\u4e2d\u5fc3\u5750\u6807\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_5","title":"\u516d\u3001\u6807\u7b7e\u5316\u7ba1\u7406","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_4","title":"1\u3001\u6807\u7b7e\u8bf4\u660e","text":"\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u811a\u672c ID\uff1a\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c/\u51fd\u6570 ID\uff1b PMS\u7528\u4f8bID\uff1aPMS \u4e0a\u5bf9\u5e94\u7684\u7528\u4f8b ID\uff08\u7528\u4f8b\u5e93 ID\uff09\uff1b \u9ed8\u8ba4\u4f7f\u7528\u7528\u4f8b\u5e93 ID\uff0c\u5bf9\u4e8e\u6682\u65f6\u6ca1\u6709\u4f7f\u7528\u7528\u4f8b\u5e93\u7ba1\u7406\u7528\u4f8b\u7684\u9879\u76ee\uff0c\u53ef\u4ee5\u4f7f\u7528\u4ea7\u54c1\u5e93\u7528\u4f8b ID\uff1b \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1aFUNC\uff08\u529f\u80fd\uff09\u3001API\uff08\u63a5\u53e3\uff09\u3001BASELINE\uff08\u57fa\u7ebf\uff09\u3001PERF\uff08\u6027\u80fd\uff09\u3001STR\uff08\u538b\u529b\uff09\u3001SEC\uff08\u5b89\u5168\uff09\u3001CTS\uff08\u517c\u5bb9\u6027\uff09 \u4e0a\u7ebf\u5bf9\u8c61\uff1aCICD\uff0c\u8868\u793a\u4e0a\u7ebf\u5230 CICD \u6d41\u6c34\u7ebf\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u53ef\u4e00\u952e\u751f\u6210 case_list.csv \u6587\u4ef6\uff0c\u7528\u4e8e\u5bfc\u5165\u5230\u660e\u9053\u4e91 AT \u7528\u4f8b\u5217\u8868\u4e2d\u63a7\u5236 CICD \u8dd1\u6d4b\u8303\u56f4\uff1b \u6d4b\u8bd5\u7ea7\u522b\uff1aC1 / C2 / C3 / C4\uff0c\u5177\u4f53\u5b9a\u4e49\u53c2\u8003\u6d41\u6c34\u7ebf\u4f7f\u7528\u6307\u5bfc\uff1b \u8df3\u8fc7\u539f\u56e0\uff1askip-XXX\uff0c\u7528\u4e8e\u63a7\u5236\u7528\u4f8b\u662f\u5426\u6267\u884c\uff1b \u786e\u8ba4\u4fee\u590d\uff1afixed-XXX\uff0c\u7528\u4e8e\u6807\u8bb0\u7528\u4f8b\u7684\u4fee\u590d\u72b6\u6001\uff08\u540e\u9762\u8be6\u7ec6\u8bb2\u89e3\u7528\u6cd5\uff09\uff1b \u5e9f\u5f03\u7528\u4f8b\uff1aremoved-\u5df2\u5e9f\u5f03\uff0c\u7528\u4e8e\u6807\u8bb0\u5df2\u7ecf\u5e9f\u5f03\u7684\u7528\u4f8b\uff0c\u6b64\u7528\u4f8b\u6807\u7b7e\u4e0d\u4f1a\u88ab\u6dfb\u52a0\uff0c\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff1b \u793a\u4f8b\uff1a \u811a\u672cID PMS\u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u4e0a\u7ebf\u5bf9\u8c61 \u6d4b\u8bd5\u7ea7\u522b \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b ... 001 679537 L1 FUNC CICD C1 skip-XXX fixed-XXX removed-\u5df2\u5e9f\u5f03 ..."},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_4","title":"2\u3001\u64cd\u4f5c\u6b65\u9aa4","text":"2.1\u3001\u5728\u5b50\u9879\u76ee\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u4ee5\u7528\u4f8b\u7684 py \u6587\u4ef6\u9664\u53bb\u9996\u5b57\u7b26\u4e32 \"test_\" \u548c\u7528\u4f8b\u5e8f\u53f7\u540e\u7684\u5b57\u7b26\u4e32\u4f5c\u4e3a csv \u7684\u6587\u4ef6\u540d\u3002 \u4f8b\u5982: \u76f8\u518c\u7684\u7528\u4f8b\u6587\u4ef6\u4e3a test_album_xxx.py\uff0cxxx \u8868\u793a\u4efb\u610f\u4e09\u4f4d\u6570\u5b57\u4ee3\u8868\u7528\u4f8b\u5e8f\u53f7\uff0c\u6b64\u65f6 csv \u6587\u4ef6\u540d\u5c31\u5e94\u4e3a album.csv\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u6240\u6709 csv \u6587\u4ef6\u5efa\u8bae\u653e\u5728\u4e00\u4e2a tags \u76ee\u5f55\u4e0b\u3002 \u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 2.2\u3001\u7b2c\u4e00\u5217\u4e3a\u811a\u672c ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b\u7528\u4f8b\u6807\u7b7e\u53ef\u4ee5\u65e0\u5e8f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_2","title":"3\u3001\u589e\u52a0\u8bf4\u660e","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_1","title":"3.1\u3001\u8df3\u8fc7\u7528\u4f8b","text":"\u4f20\u7edf\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668(@pytest.mark.skip)\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a; \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#311","title":"3.1.1\u3001\u56fa\u5b9a\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u7b7e\u5f00\u5934\u4e3a \u201cskip-XXX\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\uff0c\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\u5219\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u7b7e\u4e3a SKIPED\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#312","title":"3.1.2\u3001\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skipif_platform-aarch64&mips64 \u67d0\u4e9b\u7528\u4f8b\u4f1a\u56e0\u4e3a\u4e0d\u540c\u7684\u73af\u5883\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\uff0c\u5e38\u89c1\u7684\u573a\u666f\u4e3a\u5728\u4e0d\u540c\u67b6\u6784\u4e0a\u5224\u65ad\u662f\u5426\u6267\u884c\uff0c\u8df3\u8fc7\u7684\u539f\u56e0\u6807\u7b7e\u4e3a \u201cskipif_platform-\u201d \u52a0\u67b6\u6784\u540d\uff0c\u591a\u4e2a\u67b6\u6784\u4e4b\u95f4\u4f7f\u7528 \u201c&\u201d \u62fc\u63a5\uff1b \u4ee5\u4e0a\u4f8b\u5b50\u4e3a\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u5224\u65ad\u5f53\u524d\u67b6\u6784\u662f\u5426\u4e3a arrch64 \u6216\u8005 mips64\uff0c\u82e5\u662f\uff0c\u5219\u8df3\u8fc7\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u82e5\u5426\u5219\u6267\u884c\u7528\u4f8b\uff1b \u76ee\u524d\u6846\u67b6\u9ed8\u8ba4\u4ec5\u652f\u6301\u67b6\u6784\u7684\u6761\u4ef6\u5224\u65ad\uff0c\u4f46\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u903b\u8f91\u652f\u6301\u81ea\u5b9a\u4e49\u6dfb\u52a0\u3002 \u5728\u9879\u76ee\u76ee\u5f55\u8def\u5f84\u4e0b\u5b58\u5728\u6587\u4ef6 setting/skipif.py\uff0c\u6240\u6709\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u7684\u51fd\u6570\u5199\u5728\u6b64\u6587\u4ef6\u4e2d\u3002 \u9ed8\u8ba4\u67b6\u6784\u5224\u65ad\u4f8b\u5b50\uff1a def skipif_platform(args: str):\n\"\"\"\u5e73\u53f0\u8df3\u8fc7\"\"\"\n_skip_key = args.split(\"&\")\nfor key in _skip_key:\nif GlobalConfig.SYS_ARCH == key:\nreturn True\nreturn False\n \u65b9\u6cd5\u7f16\u5199\u89c4\u8303\uff1a \u65b9\u6cd5\u540d\u5fc5\u987b\u4ee5 skipif \u5f00\u5934\uff1b \u65b9\u6cd5\u5fc5\u987b\u6709\u8fd4\u56de\u7ed3\u679c\u5e76\u4e14\u4e3a\u5e03\u5c14\u503c\uff08True \u4ee3\u8868\u8df3\u8fc7\uff0cFalse \u4ee3\u8868\u4e0d\u8df3\u8fc7\uff09\uff1b \u65b9\u6cd5\u53ea\u80fd\u6709\u4e00\u4e2a\u5165\u53c2\uff1b \u5728 csv \u6587\u4ef6\u8df3\u8fc7\u539f\u56e0\u4e00\u680f\u4e2d\u586b\u5199\u4e3a \u201c{\u51fd\u6570\u540d}-{\u53c2\u6570}\u201d\uff0c\u4f8b\u5982\uff1askipif_platform-aarch64\uff1b\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u4f1a\u4ee5\u7b2c\u4e00\u4e2a \u201c-\u201d \u8fdb\u884c\u5206\u5272\uff0c\u622a\u53d6\u7684\u5de6\u4fa7\u5b57\u7b26\u4e32\u4f5c\u4e3a\u51fd\u6570\u540d\uff0c\u5728 skipif.py \u6587\u4ef6\u4e2d\u67e5\u627e\u662f\u5426\u6709\u540c\u540d\u51fd\u6570\uff0c\u5e76\u5c06\u622a\u53d6\u7684\u53f3\u4fa7\u4f5c\u4e3a\u53c2\u6570\u4f20\u9012\u7ed9\u8be5\u51fd\u6570\uff0c\u901a\u8fc7\u83b7\u53d6\u8be5\u51fd\u6570\u8fd4\u56de\u7684\u5e03\u5c14\u503c\uff0c\u8fd4\u56de True\uff0c\u5219\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u8fd4\u56de False\uff0c\u5219\u6267\u884c\u8be5\u7528\u4f8b\u3002 \u82e5\u51fd\u6570\u9700\u8981\u591a\u4e2a\u53c2\u6570\uff0c\u53ef\u81ea\u5b9a\u4e49\u591a\u4e2a\u53c2\u6570\u4e4b\u95f4\u7684\u8fde\u63a5\u7b26\uff0c\u8fde\u63a5\u7b26\u53f7\u4e0d\u53ef\u4f7f\u7528\u4e0b\u5212\u7ebf\u548c\u9017\u53f7\uff0c\u63a8\u8350\u7edf\u4e00\u4f7f\u7528 & \u7b26\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32","title":"3.2\u3001\u786e\u8ba4\u4fee\u590d","text":"\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7528\u4f8b\u4fee\u590d\u540e\uff0c\u4f46\u4e0d\u80fd\u7acb\u5373\u5220\u9664\u8df3\u8fc7\u539f\u56e0\uff08skip-XXX\uff09\u7684\u7528\u4f8b\uff0c\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u786e\u8ba4\u4fee\u590d\u201d\uff0c\u4f5c\u4e3a\u6807\u8bb0\u8be5\u7528\u4f8b\u662f\u5426\u5df2\u7ecf\u4fee\u590d\uff0c\u56fa\u5b9a\u586b\u5165\u5b57\u6bb5\u4e3a \u201cfixed-\u5df2\u4fee\u590d\u201d\u3002\u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u5373\u4f7f\u540c\u65f6\u6807\u8bb0\u4e86 skip-XXX \u4e5f\u4f1a\u6b63\u5e38\u6267\u884c\u3002 \u793a\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d \u3010\u540c\u65f6\u6807\u8bb0\u4e86skip \u548c fixed\uff0c\u4f46\u4ecd\u7136\u60f3\u8981\u8df3\u8fc7\u7528\u4f8b\u3011 \u5f53 \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u540c\u65f6\u586b\u5165\u540e\uff0c\u547d\u4ee4\u884c\u4f20\u9012\u53c2\u6570 --ifixed yes\uff0c\u5219\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\u8be5\u6761\u7528\u4f8b\u3002 python3 manage.py run --ifixed yes\n \u770b\u5230\u8fd9\u91cc\u6709\u4e9b\u540c\u5b66\u53ef\u80fd\u8981\u95ee\u4e86\uff0c\u6211\u60f3\u6062\u590d\u8df3\u8fc7\u6267\u884c\uff0c\u76f4\u63a5\u628a skip-XXX \u8fd9\u4e00\u5217\u6807\u7b7e\u5220\u6389\u4e0d\u5c31\u597d\u4e86\uff0c\u8fd8\u641e\u4ec0\u4e48\u786e\u8ba4\u4fee\u590d\u5e72\u5565\uff1f \u8fd9\u91cc\u7ed9\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u89e3\u91ca\u4e00\u4e0b\uff1a \uff08\u4ee5\u4e0b\u6d41\u6c34\u7ebf\u6307\u7684\u662f\u6bcf\u65e5\u6784\u5efa\u7684\u6d41\u6c34\u7ebf\uff0c\u8dd1 AT \u7684\u5168\u91cf\u7528\u4f8b\uff09 \u9996\u5148\uff0c\u6d41\u6c34\u7ebf\u4e0a\u8dd1\u7684\u662f AT \u5386\u53f2 Tag\uff0c\u8df3\u8fc7\u7528\u4f8b\u7684\u6807\u7b7e(skip-XXX) \u662f\u5728\u6700\u65b0\u7684\u4ee3\u7801\u4e0a\u63d0\u4ea4\u7684\uff0c\u6211\u4eec\u91c7\u7528\u6700\u65b0\u7684 csv \u6587\u4ef6\u8986\u76d6\u5386\u53f2 csv \u6587\u4ef6\u7684\u8bbe\u8ba1\u6765\u5b9e\u73b0\u4e86\u5bf9\u5386\u53f2 Tag \u4e0a\u7528\u4f8b\u7684\u8df3\u8fc7\uff1b \u7136\u540e\uff0c\u5728\u65e5\u5e38\u8df3\u8fc7\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u540c\u65f6\u4e5f\u5728\u4fee\u590d\u4e00\u4e9b\u7528\u4f8b\uff0c\u4fee\u590d\u540e\u7684\u8fd9\u4e9b\u7528\u4f8b\u5728\u672c\u5730\u8c03\u8bd5\u7684\u65f6\u5019\u6211\u4eec\u4e0d\u5e0c\u671b\u7ee7\u7eed\u8df3\u8fc7\uff0c\u4f46\u662f\u6b64\u65f6\uff0c\u4fee\u590d\u7684\u8fd9\u4e9b\u7528\u4f8b\u53ef\u80fd\u8fd8\u4e0d\u7a33\u5b9a\uff0c\u4e0d\u9002\u5408\u9a6c\u4e0a\u653e\u5230\u6d41\u6c34\u7ebf\u53bb\u8dd1\uff0c\u4e5f\u5c31\u662f\u8bf4\u6d41\u6c34\u7ebf\u4e0a\u6211\u4eec\u662f\u5e0c\u671b\u4ed6\u7ee7\u7eed\u8df3\u8fc7\u7684\uff0c\u56e0\u6b64\uff0c\u54b1\u4e0d\u80fd\u76f4\u63a5\u628a skip-XXX \u5e72\u6389\uff1b \u8fd9\u91cc\u5c31\u77db\u76fe\u4e86\uff0c\u4e00\u4e2a\u9700\u6c42\u662f\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u53e6\u4e00\u4e2a\u9700\u6c42\u53c8\u4e0d\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u600e\u4e48\u529e\u5462\uff1f \u6211\u4eec\u4f7f\u7528\u201c\u786e\u8ba4\u4fee\u590d\u201d\u6765\u6807\u8bb0\u8fd9\u6761\u7528\u4f8b\u5df2\u7ecf\u4fee\u590d\u4e86\uff0c\u8fd9\u6837\u4f60\u672c\u5730\u8c03\u8bd5\u7528\u4f8b\u7684\u65f6\u5019\u8fd9\u6761\u5df2\u4fee\u590d\u7684\u7528\u4f8b\u662f\u4f1a\u6267\u884c\u7684\uff0c\u540c\u65f6\u5728\u6d41\u6c34\u7ebf\u4e0a\u5c06 --ifixed yes \u53c2\u6570\u52a0\u4e0a\uff0c\u90a3\u4e48\u6d41\u6c34\u7ebf\u4e0a\u6267\u884c\u65f6\u8fd9\u6761\u7528\u4f8b\u4ecd\u7136\u662f\u8df3\u8fc7\u7684\u72b6\u6001\uff0c\u540e\u7eed\u4f60\u6253 Tag \u7684\u65f6\u5019\uff0c\u628a \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u7684\u6807\u7b7e\u5168\u90e8\u5220\u6389\u5c31\u53ef\u4ee5\u4e86\u3002 \u8fd9\u5c31\u662f\u201c\u786e\u8ba4\u4fee\u590d\u201d\u8fd9\u4e2a\u6807\u7b7e\u7684\u80cc\u666f\uff0c\u9700\u8981\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u54c1\u4e00\u54c1\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#33","title":"3.3\u3001\u5e9f\u5f03\u7528\u4f8b","text":"\u9488\u5bf9\u67d0\u4e9b\u7528\u4f8b\uff0c\u7531\u4e8e\u9700\u6c42\u53d8\u66f4\uff0c\u73af\u5883\u5f71\u54cd\u6216\u8bc4\u4f30\u4e0d\u518d\u9002\u7528\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u65f6\uff0c\u7528\u4f8b\u9700\u8981\u5e9f\u5f03\uff0c\u5219\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u5e9f\u5f03\u7528\u4f8b\u201d\uff0c\u8be5\u5217\u5b58\u5728 \u201cremoved-{\u5e9f\u5f03\u539f\u56e0}\u201d\uff0c\u5219\u7528\u4f8b\u4e0d\u4f1a\u6267\u884c\u3002 \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d removed-\u5df2\u5e9f\u5f03 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_2","title":"4\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u4e0a\u9762\u4ecb\u7ecd Pytest \u6846\u67b6\u63d0\u4f9b\u7684\u6807\u7b7e\u529f\u80fd mark\uff0c\u4f7f\u7528\u65f6\u9700\u8981\u4e3a\u6bcf\u4e00\u4e2a\u7528\u4f8b\u6dfb\u52a0\u6807\u7b7e\u88c5\u9970\u5668\uff0c\u5219\u64cd\u4f5c\u590d\u6742\uff0c\u53ef\u7ef4\u62a4\u6027\u5dee\uff0c\u5176\u6839\u672c\u95ee\u9898\u5c31\u662f\u6807\u7b7e\u5206\u6563\u5728\u6bcf\u4e00\u6761\u7528\u4f8b\u7684\u88c5\u9970\u5668\u4e0a\uff0c\u96be\u4ee5\u96c6\u4e2d\u7ef4\u62a4\uff1b\u4e8e\u662f\u4e4e\u5c06\u6240\u6709\u6807\u7b7e\u4f7f\u7528 csv \u6587\u4ef6\u8fdb\u884c\u96c6\u4e2d\u7ba1\u7406\uff0c\u5e76\u901a\u8fc7 Pytest \u7684\u94a9\u5b50\u51fd\u6570\uff0c\u8bfb\u53d6 csv \u6587\u4ef6\uff0c\u52a8\u6001\u6dfb\u52a0\u6807\u7b7e\u5230\u7528\u4e2d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5csv","title":"5\u3001CSV\u6587\u4ef6\u683c\u5f0f","text":"\u6b64\u914d\u7f6e\u6587\u4ef6\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u6807\u7b7e\u6570\u636e\uff0c\u4e14\u8981\u65b9\u4fbf\u80fd\u4f7f\u7528Excel\u6253\u5f00\u8fdb\u884c\u7f16\u8f91\u67e5\u770b\uff0c\u66f4\u91cd\u8981\u7684\u662f\u6211\u4eec\u4e0d\u60f3\u5f15\u5165\u4e09\u65b9\u4f9d\u8d56\uff0cCSV \u6587\u4ef6\u51e0\u4e4e\u662f\u552f\u4e00\u80fd\u6ee1\u8db3\u6240\u6709\u7684\u8981\u6c42\u7684\u6587\u4ef6\u683c\u5f0f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_6","title":"\u4e03\u3001\u65e5\u5fd7\u7cfb\u7edf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_5","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e YouQu \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u64cd\u4f5c\u65b9\u6cd5\u5c01\u88c5\u5199\u6cd5\uff0c\u901a\u5e38\u662f\u8fd9\u6837\u7684\uff1a\u7c7b\u91cc\u9762\u4e00\u4e2a\u51fd\u6570\u53ea\u5305\u542b\u4e00\u4e2a\u64cd\u4f5c\u6216\u591a\u6b21\u8c03\u7528\u7684\u4e00\u7cfb\u5217\u53ef\u5408\u5e76\u7684\u64cd\u4f5c\uff1b \u4f20\u7edf\u7684\u65e5\u5fd7\u8f93\u51fa\u65b9\u5f0f\uff0c\u9700\u8981\u5728\u6bcf\u4e2a\u51fd\u6570\u91cc\u9762\u4e3b\u52a8\u7f16\u5199\u65e5\u5fd7\u8f93\u51fa\u4ee3\u7801 \uff0c\u4f8b\u5982\uff1a class XXXWidget:\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\nlogger.info(\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\")\n...\n# \u7701\u7565\u4ee3\u7801\u90e8\u5206\n \u4e00\u4e2a\u51fd\u6570\u91cc\u9762\u81f3\u5c11\u5305\u542b\u4e00\u6761\u65e5\u5fd7\u4fe1\u606f\uff0c\u5982\u679c\u6bd4\u8f83\u590d\u6742\u64cd\u4f5c\u6b65\u9aa4\uff0c\u53ef\u80fd\u5305\u542b\u591a\u6761\u65e5\u5fd7\u4fe1\u606f\uff1b \u4e00\u4e2a\u5e94\u7528\u542b\u6709\u5927\u91cf\u7684\u64cd\u4f5c\u51fd\u6570\uff0c\u4e5f\u5c31\u662f\u8bf4\u6211\u4eec\u9700\u8981\u5199\u5927\u91cf\u7684\u65e5\u5fd7\u4ee3\u7801\uff1b \u901a\u8fc7\u7ecf\u9a8c\u89c2\u5bdf\uff0c\u6211\u4eec\u53d1\u73b0\uff0c\u51fd\u6570\u8bf4\u660e\u4ee5\u53ca\u51fd\u6570\u64cd\u4f5c\u65e5\u5fd7\uff0c\u5177\u6709\u8f83\u9ad8\u7684\u91cd\u590d\u5ea6\uff08\u4ece\u4e0a\u9762\u7684\u4f8b\u5b50\u4e5f\u53ef\u4ee5\u770b\u51fa\u6765\uff09\uff0c\u56e0\u6b64\u6211\u4eec\u5927\u80c6\u7684\u8bbe\u60f3\uff0c\u80fd\u4e0d\u80fd\u57fa\u4e8e\u6846\u67b6\u6267\u884c\u65f6\uff0c\u81ea\u52a8\u7684\u5c06\u51fd\u6570\u8bf4\u660e\u4f5c\u4e3a\u65e5\u5fd7\u6253\u5370\u51fa\u6765\uff0c\u4ece\u800c\u51cf\u5c11\u5927\u91cf\u65e5\u5fd7\u4ee3\u7801\u91cf\u548c\u91cd\u590d\u7f16\u5199\uff0c\u90a3\u771f\u662f\u5999\u554a~\u3002 \u57fa\u4e8e\u6b64\u201c\u5929\u771f\u201d\u7684\u60f3\u6cd5\uff0c\u6211\u4eec\u8bbe\u8ba1\u51fa\u4e86 youqu \u7684\u65e5\u5fd7\u7cfb\u7edf\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_5","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u6838\u5fc3\u539f\u7406\uff1a \u901a\u8fc7\u7ed9\u7c7b\u52a0\u4e0a\u4e00\u4e2a\u88c5\u9970\u5668 @log\uff0c\u52a8\u6001\u7ed9\u8be5\u7c7b\u4e0b\u6240\u6709\u7684\u51fd\u6570\u53ca\u7236\u7c7b\u51fd\u6570\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668 @_trace\uff0c\u5728\u6b64\u88c5\u9970\u5668\u4e2d\u6211\u4eec\u80fd\u52a8\u6001\u7684\u6355\u83b7\u6240\u8c03\u7528\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff08func.__doc__\uff09\uff0c\u901a\u8fc7\u65e5\u5fd7\u8f93\u51fa\u5668\u5c06\u5176\u8f93\u51fa\u5373\u53ef\u3002 \u5b9e\u73b0\u6b65\u9aa4\uff1a \u901a\u8fc7 inspect.getmembers \u83b7\u53d6\u88ab\u88c5\u9970\u7684\u7c7b\u4e0b\u6240\u6709\u51fd\u6570\uff0c\u5305\u542b\u9759\u6001\u65b9\u6cd5\uff0c\u7c7b\u65b9\u6cd5\uff0c\u5b9e\u4f8b\u65b9\u6cd5\uff1b \u901a\u8fc7 setattr(\u7c7b, \u65b9\u6cd5, _trace\uff09 \u7684\u65b9\u5f0f\uff0c\u7ed9\u7b26\u5408\u6761\u4ef6\u7684\u51fd\u6570\uff0c\u52a8\u6001\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_3","title":"3\u3001\u65e5\u5fd7\u914d\u7f6e","text":"[log_cli]\n;\u65e5\u5fd7\u76f8\u5173\u914d\u7f6e\uff08\u4e0d\u6253\u5370\u6784\u9020\u51fd\u6570\u548c\u9b54\u6cd5\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff09\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = INFO\n# ============= \u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u914d\u7f6e ================\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u5f00\u5934\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7, \u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_STARTSWITH = Assert\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u7ed3\u5c3e\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_ENDSWITH = Widget\n;\u652f\u6301\u7c7b\u540d\u5305\u542b xxx \u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_CONTAIN = ShortCut\n# ==============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_3","title":"4\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u5728\u5e94\u7528\u5e93 widget \u65b9\u6cd5\u5e93\u91cc\u9762\uff0c\u53ea\u9700\u8981\u5728\u51fa\u53e3\u6587\u4ef6\u52a0\u4e0a\u7c7b\u88c5\u9970\u5668\uff0c\u5c31\u53ef\u4ee5\u5b9e\u73b0\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u4e86\uff1b # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6ce8\u610f\uff0c\u662f\u7c7b\u88c5\u9970\u5668\u3002 \u5b9e\u4f8b\uff1a # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\n@classmethod\ndef find_dfm_image(cls, *elements, multiple=False, rate=0.9):\n\"\"\"\n \u67e5\u627e\u56fe\u7247 {{elements}}.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e {{rate}} \u7684\u5750\u6807\n :param elements:\n :param multiple:\n :return:\n \"\"\"\nelement = tuple(map(lambda x: f\"{Config.PIC_RES_PATH}/{x}\", elements))\nreturn cls.find_image(*element, multiple=multiple)\n \u8c03\u7528\u65b9\u6cd5\u65f6\uff1a DfmWidget.find_dfm_image(\"dfm_001\")\n \u81ea\u52a8\u8f93\u51fa\u7684\u65e5\u5fd7\uff1a >> x86_64-uos-6: 02/28 17:48:47 | INFO | logger_utils: [find_dfm_image]: \u67e5\u627e\u56fe\u7247 dfm_001.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e 0.9 \u7684\u5750\u6807\n \u52a0\u4e0a\u88c5\u9970\u5668 @log \u4e4b\u540e\uff0c\u65b9\u6cd5\u5c42\u6240\u6709\u7684\u51fd\u6570\uff08\u5305\u62ec\u5b9e\u4f8b\u65b9\u6cd5\u3001\u7c7b\u65b9\u6cd5\u3001\u9759\u6001\u65b9\u6cd5\uff09\u90fd\u4e0d\u9700\u8981\u518d\u5199\u65e5\u5fd7\u4ee3\u7801\uff0c\u6267\u884c\u7684\u65f6\u5019\u4f1a\u81ea\u52a8\u8f93\u51fa\uff0c\u5e76\u4e14\u6240\u6709\u8c03\u7528\u7684\u65b9\u6cd5\u4f1a\u4ee5 allure.step \u7684\u65b9\u5f0f\uff0c\u5c55\u793a\u5728 allure \u62a5\u544a\u4e2d\uff0c\u5728\u62a5\u544a\u4e2d\u66f4\u80fd\u4e00\u76ee\u4e86\u7136\u7684\u770b\u5230\u7528\u4f8b\u6267\u884c\u6b65\u9aa4\u3002 \u3010\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\u3011 \u901a\u8fc7\u89c2\u5bdf\u524d\u9762\u7684\u4f8b\u5b50\uff0c\u7ec6\u5fc3\u7684\u540c\u5b66\u53ef\u80fd\u8fd8\u53d1\u73b0\u4e86\u4e00\u4e2a\u5c0f\u7ec6\u8282\uff1a\u51fd\u6570\u529f\u80fd\u8bf4\u660e\u4e2d\uff0c\u4e24\u5bf9\u5927\u62ec\u53f7\u4e2d\u7684\u5185\u5bb9 {{elements}} \u4f5c\u4e3a\u53d8\u91cf\u8f93\u51fa\u51fa\u6765\u4e86\uff1b \u6ca1\u9519\uff0c\u8fd9\u5c31\u662f\u6211\u4eec\u53c2\u8003Django \u548c jinja2 \u7684\u6a21\u677f\u8bed\u6cd5\u8bbe\u8ba1\u51fa\u7684\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\uff0c\u4f7f\u7528\u65b9\u6cd5\u5f88\u7b80\u5355\uff0c\u7528\u4e24\u5bf9\u5927\u62ec\u53f7\u628a\u51fd\u6570\u7684\u53c2\u6570\u62ec\u8d77\u6765\uff0c\u8fd9\u6837\u5728\u65e5\u5fd7\u8f93\u51fa\u7684\u65f6\u5019\u5c31\u80fd\u628a\u8c03\u7528\u51fd\u6570\u65f6\u53c2\u6570\u7684\u503c\u8f93\u51fa\u51fa\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_7","title":"\u516b\u3001\u73af\u5883\u90e8\u7f72","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_6","title":"1\u3001\u539f\u5219","text":"YouQu \u7684\u73af\u5883\u4f9d\u8d56\u4e00\u76f4\u575a\u6301 2 \u4e2a\u539f\u5219\uff1a \u6700\u5c0f\u73af\u5883\u4f9d\u8d56\u539f\u5219 \u6709\u4e9b\u540c\u5b66\u5199\u4e00\u4e9b\u529f\u80fd\uff0c\u9996\u5148\u60f3\u5230\u7684\u5c31\u662f\u53bb\u641c\u7d22\u5f15\u64ce\u641c\u4e00\u4e0b\uff0c\u770b\u6709\u6ca1\u6709\u73b0\u6210\u7684\u5de5\u5177\u6216\u8005\u4ee3\u7801\u76f4\u63a5\u80fd\u7528\uff0c\u7f8e\u5176\u540d\u66f0\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\uff0c\u522b\u4eba\u5df2\u7ecf\u9020\u597d\u4e86\u8f6e\u5b50\u54b1\u4eec\u5c31\u4e0d\u8981\u91cd\u590d\u53bb\u9020\u4e86\uff0c\u7136\u540e\u4e00\u5207\u4f3c\u4e4e\u90fd\u53d8\u5f97\u90a3\u4e48\u7684\u7406\u6240\u5e94\u5f53\u3002 \u5f53\u7136\u8fd9\u6837\u505a\u65e0\u53ef\u539a\u975e\uff0c\u6211\u76f8\u4fe1\u6709\u8fd9\u6837\u60f3\u6cd5\u5e76\u4e14\u4e00\u76f4\u8df5\u884c\u8fd9\u6837\u505a\u6cd5\u7684\u540c\u5b66\u4e0d\u5728\u5c11\u6570\uff0c\u4f46\u8fd9\u6837\u505a\u6709\u4e00\u4e2a\u5f88\u4e25\u91cd\u7684\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f60\u5199\u4e00\u4e2a\u5927\u578b\u9879\u76ee\u65f6\uff0c\u4f60\u4f1a\u5f15\u5165\u975e\u5e38\u975e\u5e38\u975e\u5e38\u591a\u7684\u4f9d\u8d56\uff0c\u6bd4\u5982\u8981\u505a\u4e2a\u63a5\u53e3\u8bf7\u6c42\u8981\u7528 requests\u3001\u8bfb\u5199\u4e2a\u6570\u636e\u7528 pandas\u3001\u5199\u4e2a\u8868\u683c\u7528 pyopenxl\u3001\u89e3\u6790\u4e2a\u6587\u672c\u8981\u7528\u8fd9\u4e2a\u90a3\u4e2a\u4e09\u65b9\u5e93 ... \u3002 \u6211\u8ba4\u4e3a\u8fd9\u662f\u975e\u5e38\u4e0d\u597d\u7684\u4e60\u60ef\uff0c\u5728\u5b9e\u73b0\u4e00\u4e2a\u529f\u80fd\u7684\u65f6\u5019\uff0c\u9996\u5148\u6211\u4eec\u5e94\u8be5\u53bb\u60f3\u81ea\u5df1\u600e\u4e48\u6837\u53bb\u5b9e\u73b0\uff0c\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff1b \u5982\u679c\u4f60\u4e0d\u4f1a\uff0c\u4f60\u53ef\u4ee5\u53bb\u5b66\u4e60\u4e09\u65b9\u5e93\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u522b\u4eba\u4e09\u65b9\u5e93\u4e5f\u662f\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\u7684\uff0c\u4e3a\u4ec0\u4e48\u54b1\u4eec\u4e0d\u884c\u5462\uff1b\u5982\u679c\u522b\u4eba\u7684\u4f60\u5b9e\u5728\u662f\u770b\u4e0d\u61c2\uff0c\u60f3\u5c3d\u4e00\u5207\u529e\u6cd5\u786e\u5b9e\u505a\u4e0d\u51fa\u6765\uff0c\u90a3\u518d\u8003\u8651\u5f15\u5165\u8fd9\u4e2a\u4e09\u65b9\u5e93\uff0c\u6211\u8ba4\u4e3a\u8fd9\u6837\u662f\u6ca1\u95ee\u9898\u7684\uff0c\u6bd5\u7adf\u54b1\u4eec\u6bb5\u4f4d\u8fd8\u4e0d\u591f\uff0c\u4f46\u5e0c\u671b\u5c06\u6765\u6709\u4e00\u5929\u6211\u4eec\u53ef\u4ee5\u3002 \u8fd9\u6837\u7684\u505a\u6cd5\u624d\u5e94\u8be5\u662f\u201c\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\u201d\u6b63\u786e\u7684\u64cd\u4f5c\u3002\u4e0d\u4f1a\u6ca1\u5173\u7cfb\uff0c\u770b\u770b\u522b\u4eba\u662f\u600e\u4e48\u5b9e\u73b0\u7684\uff0c\u81ea\u5df1\u518d\u6478\u7d22\u7740\u5199\u51fa\u6765\uff0c\u8fd9\u6837\u81ea\u5df1\u624d\u80fd\u6709\u6240\u63d0\u9ad8\uff0c\u4e0d\u7136\u4f60\u5c31\u53ea\u4f1a\u7528\u522b\u4eba\u7684\u4e1c\u897f\uff1b\u90a3\u4e9b\u5632\u7b11\u3001\u6279\u8bc4\u6211\u4eec\u91cd\u590d\u9020\u8f6e\u5b50\u7684\u4eba\uff0c\u5148\u60f3\u60f3\u81ea\u5df1\u4f1a\u9020\u8f6e\u5b50\u5417\u3002 \u672c\u7740\u81ea\u5df1\u5b9e\u73b0\u80fd\u5b9e\u73b0\u7684\u4e00\u5207\u7684\u539f\u5219\uff0cYouQu \u6846\u67b6\u505a\u5230\u4e86\u975e\u5e38\u5c11\u7684\u73af\u5883\u4f9d\u8d56\uff0c\u800c\u4e14\u6211\u4eec\u4ecd\u5728\u4e0d\u65ad\u52aa\u529b\uff0c\u51cf\u5c11\u73af\u5883\u90e8\u7f72\u7684\u4f9d\u8d56\u3002 \u6700\u5c0f\u4ed3\u5e93\u4f53\u79ef\u539f\u5219 \u5927\u6587\u4ef6\u4e0d\u80fd\u4e0a\u4f20\u5230\u5de5\u7a0b\u91cc\u9762\uff0c\u4fdd\u6301\u6574\u4e2a\u5de5\u7a0b\u7684\u8f7b\u91cf\u5316\uff0c\u8fd9\u6837\u5728\u514b\u9686\u4ee3\u7801\u7684\u65f6\u5019\u624d\u80fd\u975e\u5e38\u5feb\u901f\u65b9\u4fbf\u4f7f\u7528\uff0c\u6211\u4eec\u89c1\u8fc7\u4e00\u4e2a AT \u5de5\u7a0b clone \u5927\u5c0f\u8fbe\u5230\u597d\u51e0\u4e2a G\uff0c\u7b80\u76f4\u4e0d\u53ef\u601d\u8bae\u3002 \u5176\u5b9e\u4ee3\u7801\u6587\u4ef6\u7684\u5927\u5c0f\u662f\u5f88\u5c0f\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u7eaf\u5199\u4ee3\u7801\u968f\u4fbf\u5199\u5de5\u7a0b\u4e5f\u4e0d\u4f1a\u592a\u5927\uff0c\u800c\u6587\u6863\uff08\u5305\u542b\u63d2\u56fe\uff09\u7b49\u8d44\u6e90\u5374\u662f\u5f88\u5360\u7a7a\u95f4\u3002 \u56e0\u6b64\u6211\u4eec\u9009\u62e9\u5c06 YouQu \u7684\u6587\u6863\u5de5\u7a0b\u5355\u72ec\u8fc1\u51fa\u5230\u72ec\u7acb\u7684\u4ed3\u5e93 youqu-docs \u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_6","title":"2\u3001\u5b89\u88c5","text":"\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u8fd0\u884c env.sh \u5373\u53ef\u3002 bash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_4","title":"3\u3001\u5b9a\u5236\u4f9d\u8d56","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_2","title":"3.1\u3001\u65b0\u589e\u4f9d\u8d56","text":"\u5982\u679c\u5e94\u7528\u5e93\u8fd8\u9700\u8981\u5176\u4ed6 Python \u4f9d\u8d56\u5e93\uff0c\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a requirement.txt \u6587\u4ef6\uff1b autotest_xxx\n\u251c\u2500\u2500 requirement.txt\n\u251c\u2500\u2500 case ...\n \u91cc\u9762\u5199\u5165\u9700\u8981\u5b89\u88c5\u7684\u4e09\u65b9\u4f9d\u8d56\uff0c\u6bd4\u5982\u50cf\u8fd9\u6837\uff1a # requirement.txt\nPyYAML==6.0 # \u6307\u5b9a\u5b89\u88c5\u67d0\u4e2a\u7248\u672c\nrequests # \u672a\u6307\u5b9a\u7248\u672c\u5219\u5b89\u88c5\u6700\u65b0\u7248\n \u5728\u6267\u884c bash env.sh \u65f6\u4f1a\u4e00\u5e76\u5c06\u5176\u5b89\u88c5\u3002 \u5982\u679c\u591a\u4e2a\u5e94\u7528\u5e93\u90fd\u5b58\u5728 requirement.txt \u6587\u4ef6\uff0c\u6267\u884c env.sh \u65f6\u4f1a\u5c06\u591a\u4e2a requirement.txt \u6587\u4ef6\u4e00\u5e76\u52a0\u8f7d\uff1b\u90a3\u4e48\u4e00\u5b9a\u8981\u6ce8\u610f\u591a\u4e2a requirement.txt \u6587\u4ef6\u53ef\u80fd\u5b58\u5728\u76f8\u540c\u7684\u4f9d\u8d56\u88ab\u6307\u5b9a\u5b89\u88c5\u4e0d\u540c\u7248\u672c\u7b49\u7b49\u517c\u5bb9\u6027\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32_1","title":"3.2\u3001\u88c1\u526a\u4f9d\u8d56","text":"\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0c\u53ef\u80fd\u4f60\u53ea\u9700\u8981\u5b89\u88c5\u4e00\u4e9b\u6700\u6700\u57fa\u7840\u7684\u4f9d\u8d56\uff0c\u5176\u4ed6\u7684\u90fd\u4e0d\u9700\u8981\uff0c\u6bd4\u5982\u7eaf\u63a5\u53e3\u81ea\u52a8\u5316\u7684\u9879\u76ee\uff0c\u5b83\u4e0d\u9700\u8981 UI \u81ea\u52a8\u5316\u76f8\u5173\u7684\u4f9d\u8d56\u3002 \u4f60\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\uff0c\u5b58\u653e\u4e00\u4e2a BASICENV \u7684\u666e\u901a\u6587\u4ef6\uff0c\u91cc\u9762\u4e0d\u9700\u8981\u5199\u4efb\u4f55\u5185\u5bb9\uff0c\u8fd9\u6837\u6267\u884c env.sh \u65f6\uff0c\u53ea\u4f1a\u5b89\u88c5\u6700\u57fa\u7840\u7684\u4f9d\u8d56\u3002 autotest_xxx\n\u251c\u2500\u2500 BASICENV # \u53ef\u4ee5\u4f7f\u7528\uff1atouch BASICENV \u521b\u5efa\u6587\u4ef6\n\u251c\u2500\u2500 case ...\n \u57fa\u7840\u4f9d\u8d56\u4ec5\u5b89\u88c5\u4ee5\u4e0b\u51e0\u4e2a\u5305\uff1a pytest # pytest\npytest-rerunfailures # \u5931\u8d25\u91cd\u8dd1\u63d2\u4ef6\npytest-timeout # \u7528\u4f8b\u8d85\u65f6\u63d2\u4ef6\nallure-pytest # \u751f\u6210 allure \u62a5\u544a\u63d2\u4ef6\nallure.deb # allure \u62a5\u544a\u67e5\u770b\u5de5\u5177\n \u88c1\u526a\u4f9d\u8d56 \u548c \u65b0\u589e\u4f9d\u8d56 \u662f\u4e0d\u51b2\u7a81\u7684\uff0c\u53ef\u4ee5\u540c\u65f6\u4f7f\u7528\u3002 \u6b64\u65b9\u6848\u9ed8\u8ba4\u4e3a\u865a\u62df\u73af\u5883\u90e8\u7f72\uff0c\u5982\u679c\u4f60\u60f3\u76f4\u63a5\u90e8\u7f72\u5728\u672c\u673a\u4e0a\uff1a bash env_dev.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_8","title":"\u4e5d\u3001\u5931\u8d25\u5f55\u5c4f","text":"\u5f55\u5c4f\u5176\u5b9e\u662f\u4e00\u79cd\u89c6\u9891\u5f62\u5f0f\u7684\u65e5\u5fd7\uff0c\u56e0\u4e3a\u5f88\u591a\u65f6\u5019\u6211\u4eec\u5728\u67e5\u770b\u65e5\u5fd7\u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u51c6\u786e\u7684\u5b9a\u4f4d\u5230\u7528\u4f8b\u5931\u8d25\u7684\u5177\u4f53\u539f\u56e0\uff0c\u56e0\u6b64\u7528\u4f8b\u7684\u5f55\u5c4f\u80fd\u8ba9\u6211\u4eec\u770b\u5230\u7528\u4f8b\u5728\u6267\u884c\u8fc7\u7a0b\uff1b \u3010\u4f7f\u7528\u65b9\u6cd5\u3011 \u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u5173\u6ce8 2 \u4e2a\u53c2\u6570\uff1b ;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\u3002\n;\u6ce8\u610f\uff0c\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u4e0d\u80fd\u5c0f\u4e8e\u5931\u8d25\u5f55\u5c4f\u6b21\u6570\uff0c\u5373 RERUN >= RECORD_FAILED_CASE\nRECORD_FAILED_CASE = 1\n \u9ed8\u8ba4\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u662f 1 \u6b21\uff1b RECORD_FAILED_CASE = 1 \u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff1b RECORD_FAILED_CASE = 0 \u8868\u793a\u4e0d\u7ba1\u7528\u4f8b\u6210\u529f\u6216\u5931\u8d25\u90fd\u5f55\u5c4f\uff1b \u5f55\u5c4f\u662f\u8981\u5360\u7528\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u7279\u522b\u662f\u5728\u4e00\u4e9b\u914d\u7f6e\u8f83\u4f4e\u7684\u673a\u5668\u4e0a\u4f1a\u5f88\u660e\u663e\uff0c\u6240\u4ee5\u4f60\u9700\u8981\u8003\u8651\u662f\u5426\u6709\u5fc5\u8981\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1b \u4f7f\u7528 manage.py \u6267\u884c\u7528\u4f8b\u9ed8\u8ba4\u8bfb\u53d6\u5230 globalconfig.ini \u91cc\u9762\u7684\u53c2\u6570\uff0c\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report/record \u76ee\u5f55\u4e0b\u4fdd\u5b58\u5931\u8d25\u7528\u4f8b\u7684\u5f55\u5c4f\u548c\u65ad\u8a00\u7684\u90a3\u4e2a\u65f6\u95f4\u70b9\u7684\u622a\u5c4f\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7\u89c6\u9891\u6587\u4ef6\u770b\u5230\u5931\u8d25\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u90fd\u53d1\u751f\u4e86\u4ec0\u4e48\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#wayland","title":"\u5341\u3001Wayland \u9002\u914d","text":"Wayland \u4e0b\u81ea\u52a8\u5316\u4e3b\u8981\u95ee\u9898\u662f X11 \u4e0b\u7684\u952e\u9f20\u64cd\u4f5c\u65b9\u6cd5\u65e0\u6cd5\u4f7f\u7528\uff0c\u6bd4\u5982 Xdotool\u3001 PyAutoGUI\u3001Xwininfo \u7b49\u7b49\uff1b YouQu \u5728 Wayland \u4e0b\u517c\u5bb9\u9002\u914d\uff0cenv.sh \u5728 Wayland \u4e0b\u6267\u884c\u65f6\u4f1a\u5b89\u88c5\u81ea\u7814\u7684\u952e\u9f20\u64cd\u4f5c\u670d\u52a1\uff08\u53ef\u80fd\u5b58\u5728\u4e00\u4e9b\u4f9d\u8d56\u62a5\u9519\uff0c\u6309\u7167\u6ce8\u91ca\u89e3\u51b3\u5373\u53ef\uff09\uff0c\u6846\u67b6\u6838\u5fc3\u5e93\u4e5f\u9488\u5bf9\u6027\u7684\u505a\u4e86\u9002\u914d\uff0c\u4e0a\u5c42\u7528\u4f8b\u5b8c\u5168\u4e0d\u7528\u5173\u5fc3\u673a\u5668\u662fWayland \u8fd8\u662f X11\uff0c\u6846\u67b6\u4f1a\u6839\u636e\u6267\u884c\u65f6\u72b6\u6001\u81ea\u52a8\u5224\u65ad\u8d70\u4e0d\u540c\u7684\u903b\u8f91\uff1b \u7b80\u5355\u8bb2\u5c31\u662f\uff0c\u5e94\u7528\u5e93\u53ea\u9700\u8981\u7ef4\u62a4\u4e00\u5957\u7528\u4f8b\u811a\u672c\u5373\u53ef\u3002 \u3010\u7528\u4f8b\u517c\u5bb9\u3011 \u56e0\u4e3a Wayland \u4e0b\u6709\u4e9b\u5e94\u7528\u7684\u754c\u9762\u663e\u793a\u548c\u529f\u80fd\u672c\u8eab\u5b58\u5728\u4e00\u4e9b\u5dee\u5f02\uff0c\u7528\u4f8b\u5c42\u53ef\u80fd\u9700\u8981\u5bf9\u8fd9\u90e8\u5206\u7528\u4f8b\u505a\u903b\u8f91\u5224\u65ad\uff0c\u4f7f\u7528\u5168\u5c40\u914d\u7f6e\u91cc\u9762\u7684\u5e38\u91cf\u8fdb\u884c\u903b\u8f91\u7f16\u5199\u5373\u53ef\uff1a from setting.globalconfig import GlobalConfig\n# GlobalConfig.IS_WAYLAND \u83b7\u53d6\u5230\u5f53\u524d\u7684\u663e\u793a\u670d\u52a1\u5668\uff08bool\uff09\n# \u5e94\u7528\u5e93 Config \u7ee7\u627f GlobalConfig\nif Config.IS_WAYLAND:\npass\nif Config.IS_X11:\npass\n \u6bd4\u5982\u7528\u4f8b\u91cc\u9762\u5982\u679c\u65ad\u8a00\u7684\u56fe\u7247\u4e0d\u540c\uff1a if Config.IS_WAYLAND:\nself.assert_image_exist(\"wayland_XXX\")\nelse:\nself.assert_image_exist(\"x11_XXX\")\n \u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u811a\u672c\u5728 Wayland \u548c X11 \u4e0b\u90fd\u53ef\u4ee5\u8dd1\uff0cso easy \u662f\u4e0d\u662f\uff1f\u5b8c\u5168\u6ca1\u5fc5\u8981\u4e13\u95e8\u62c9\u65b0\u5206\u652f\u8fdb\u884c Wayland \u9002\u914d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_9","title":"\u5341\u4e00\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_7","title":"1. \u76ee\u5f55\u7ed3\u6784","text":"\u6267\u884c\u65f6\u4f1a\u5728\u6839\u76ee\u5f55\u4e0b\u52a8\u6001\u751f\u6210 report \u76ee\u5f55\uff0c\u6240\u6709\u7684\u62a5\u544a\u76f8\u5173\u7684\u6587\u4ef6\u4f1a\u7edf\u4e00\u5b58\u653e\u5728\u91cc\u9762\uff0c\u793a\u4f8b\uff1a /report\n \u251c\u2500\u2500 allure # allure\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json\n \u251c\u2500\u2500 allure_html # \u751f\u6210\u7684html\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 index.html \u251c\u2500\u2500 allure_back # allure\u62a5\u544a\u5907\u4efd\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 20221108114823\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json\n \u251c\u2500\u2500 json # json\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 result_deepin-music_20221109134736_1081333.json\n \u251c\u2500\u2500 logs # \u65e5\u5fd7\u6587\u4ef6\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 2022-11-10_debug.log \u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-10_error.log\n \u251c\u2500\u2500 record # \u5f55\u5c4f\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-09\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 15\u65f614\u520609\u79d2_test_music_303_2_autotest.mp4\n \u2514\u2500\u2500 xml # xml\u62a5\u544a\n\u2514\u2500\u2500 autotest_deepin_music-20221109134736.xml\n \u9ed8\u8ba4\u60c5\u51b5\u4e0b\u540c\u65f6\u751f\u6210 html\u3001xml\u3001json\u4e09\u79cd\u5f62\u5f0f\u7684\u62a5\u544a\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_7","title":"2. \u5b9a\u5236\u62a5\u544a","text":"\u6211\u4eec\u5bf9 allure \u62a5\u544a\u8fdb\u884c\u4e86\u4e00\u7cfb\u5217\u7684\u5b9a\u5236\uff1a \u5b9a\u5236 logo\u3001title\u3001\u62a5\u544a\u9ed8\u8ba4\u8bed\u8a00\u4e3a\u4e2d\u6587\uff1b \u52a0\u5165\u4e86\u7528\u4f8b\u65ad\u8a00\u5931\u8d25\u65f6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u4ee5\u53ca\u6b64\u65f6\u56fe\u50cf\u5bf9\u6bd4\u7684\u6a21\u677f\u56fe\u7247\uff1b \u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\uff0c\u4f60\u53ef\u4ee5\u5728 html \u62a5\u544a\u4e2d\u76f4\u63a5\u770b\u5f55\u5236\u7684\u89c6\u9891\uff1b \u52a0\u5165\u4e86 IP \u5730\u5740\u3001\u7cfb\u7edf\u4fe1\u606f\u3001\u955c\u50cf\u7248\u672c\u7b49\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_5","title":"3. \u67e5\u770b\u62a5\u544a","text":" \u672c\u5730\u6267\u884c \u5728 report/allure \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u4e00\u5806\u6587\u672c\u6587\u4ef6\uff0c\u8fd9\u4e9b\u662f allure \u63d2\u4ef6\u751f\u6210\u7684\u62a5\u544a\u6e90\u6570\u636e\uff0c\u6211\u4eec\u5728 report/allure_html \u76ee\u5f55\u4e0b\u7ed9\u4f60\u751f\u6210\u4e86 html \u6587\u4ef6\uff0c\u4f46\u662f\u4f60\u4e0d\u80fd\u76f4\u63a5\u901a\u8fc7\u6d4f\u89c8\u5668\u6253\u5f00 index.html \u6587\u4ef6\uff0c\u56e0\u4e3a allure \u7684\u62a5\u544a\u90fd\u662f\u57fa\u4e8e\u5728\u7ebf\u7684\u670d\u52a1\uff0c\u4f60\u5e94\u8be5\u8fd9\u6837\u6253\u5f00\uff1a allure open report/allure_html\n \u4f7f\u7528 manage.py \u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u5728\u7ec8\u7aef\u7684\u6700\u540e\u4e00\u884c\uff0c\u6211\u4eec\u4f1a\u7ed9\u4f60\u8f93\u51fa\u6253\u5f00\u62a5\u544a\u7684\u547d\u4ee4\uff0c\u76f4\u63a5\u590d\u5236\u5b83\u5728\u7ec8\u7aef\u6267\u884c\u5c31\u53ef\u4ee5\u67e5\u770b\u4e86\uff0c\u50cf\u8fd9\u6837\uff1a \u7ec8\u7aef\u6267\u884c\u547d\u4ee4: allure open /tmp/youqu/report/allure_html \u67e5\u770b\u62a5\u544a \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 Pycharm \u91cc\u9762\u627e\u5230 index.html \u6587\u4ef6\uff0c\u7136\u540e\u53f3\u952e\u9009\u62e9\u6d4f\u89c8\u5668\u6253\u5f00\uff0c\u6216\u8005\u4f60\u53ef\u4ee5\u7528\u4e00\u4e2a http \u670d\u52a1\u6253\u5f00\u3002 \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 report/allure \u76ee\u5f55\u4e0b\u67e5\u770b\u62a5\u544a\uff1a allure serve report/allure\n \u8fdc\u7a0b\u6267\u884c \u8fdc\u7a0b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\uff0c\u4f1a\u5c06\u6240\u6709\u8fdc\u7a0b\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u62a5\u544a\u90fd\u6536\u96c6\u5230 report/allure \u76ee\u5f55\u4e0b\uff0c\u5206\u522b\u6309\u7167\u673a\u5668\u7684 IP \u7b49\u5efa\u4e86\u4e0d\u540c\u7684\u76ee\u5f55\uff0c\u4f60\u53ef\u4ee5\u5728\u8fd9\u4e9b\u76ee\u5f55\u91cc\u9762\u53bb\u67e5\u770b\u5bf9\u5e94\u7684\u6d4b\u8bd5\u62a5\u544a\uff0c\u67e5\u770b\u65b9\u6cd5\u548c\u524d\u9762\u672c\u5730\u6267\u884c\u67e5\u770b\u7684\u65b9\u6cd5\u4e00\u6837\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_10","title":"\u5341\u4e8c\u3001\u9759\u6001\u4ee3\u7801\u626b\u63cf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_8","title":"1. \u63d0\u524d\u89e3\u51b3\u4ee3\u7801\u95ee\u9898","text":"\u4e3a\u4e86\u5e2e\u52a9\u5f00\u53d1\u8005\u7edf\u4e00\u4ee3\u7801\u98ce\u683c\uff0cPython \u793e\u533a\u63d0\u51fa\u4e86 PEP8 \u4ee3\u7801\u7f16\u7801\u98ce\u683c\uff0cPython \u5b98\u65b9\u540c\u65f6\u63a8\u51fa\u4e86\u4e00\u4e2a\u68c0\u67e5\u4ee3\u7801\u98ce\u683c\u662f\u5426\u7b26\u5408 PEP8 \u7684\u5de5\u5177\uff0c\u540d\u5b57\u4e5f\u53eb PEP8\u3002 \u4f46\u662f\uff0cPycharm \u91cc\u9762\u7684 PEP8 \u63d2\u4ef6\u5b9e\u9645\u4e0a\u5e76\u4e0d\u80fd\u53d1\u73b0\u5f88\u591a\u4ee3\u7801\u95ee\u9898\uff0c\u8fd9\u4e9b\u95ee\u9898\u5e76\u4e0d\u4f1a\u5728\u8fd0\u884c\u65f6\u62a5\u9519\uff0c\u56e0\u4e3a\u4ece Python \u8bed\u8a00\u89d2\u5ea6\u5e76\u4e0d\u5173\u5fc3\u8fd9\u4e9b\u95ee\u9898\uff0c\u5728 Pycharm \u7f16\u8f91\u5668\u91cc\u9762\u4f7f\u7528\u5feb\u6377\u952e ctrl + alt + L\uff0c\u6709\u4e00\u70b9\u70b9\u683c\u5f0f\u5316\u7684\u6548\u679c\uff0c\u80fd\u89e3\u51b3\u4e00\u4e9b\u7a7a\u683c\u3001\u6362\u884c\u7b49\u5c0f\u95ee\u9898\u3002 \u8fd9\u91cc\u63a8\u8350\u4e00\u4e2a Python \u793e\u533a\u6d41\u884c\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff1a Black\uff0c\u53f7\u79f0\u4e0d\u59a5\u534f\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff0c\u5b83\u68c0\u6d4b\u5230\u4e0d\u7b26\u5408\u89c4\u8303\u7684\u4ee3\u7801\u98ce\u683c\u76f4\u63a5\u5c31\u5e2e\u4f60\u5168\u90e8\u683c\u5f0f\u5316\u597d\uff0c\u5c31\u662f\u8fd9\u4e48\u521a\uff01 \u5b89\u88c5\uff1a sudo pip3 install black \n \u4f7f\u7528\u65b9\u6cd5\uff1a black ${CheckPath}\n \u4f7f\u7528\u8fd9\u4e2a\u5de5\u5177\u683c\u5f0f\u5316\u4e4b\u540e\uff0c\u4ee3\u7801\u4f1a\u88ab\u81ea\u52a8\u8c03\u6574\uff0c\u521a\u5f00\u59cb\u4f60\u53ef\u80fd\u4f1a\u89c9\u5f97\u8c03\u6574\u5f97\u5f88\u5938\u5f20\uff0c\u6ca1\u5173\u7cfb\u575a\u6301\u770b\uff0c\u4e60\u60ef\u4e4b\u540e\uff0c\u4f60\u4f1a\u89c9\u5f97\u5f88\u4f18\u96c5\uff0c\u6ca1\u9519\uff0c\u8fd9\u5c31\u662f Pythonic Code \u7684\u6838\u5fc3\uff0c\u8bf7\u4fdd\u6301\u4f18\u96c5\uff5e\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_8","title":"2. \u4ee3\u7801\u626b\u63cf\u5de5\u5177","text":"\u4f7f\u7528\u6839\u76ee\u5f55\u4e0b pylint.sh \u626b\u63cf\u4ee3\u7801\uff0c\u5728 report \u76ee\u5f55\u4e0b\u67e5\u770b\u4ee3\u7801\u626b\u63cf\u62a5\u544a\uff0c\u5982\u679c\u6709\u4ee3\u7801\u95ee\u9898\u8bf7\u63d0\u524d\u89e3\u51b3\u4e4b\u540e\u518d\u63d0\u4ea4\u3002 \u6b64\u811a\u672c\u5df2\u7ecf\u4f7f\u7528 Python \u793e\u533a\u6700\u6d41\u884c\u7684\u4ee3\u7801\u626b\u63cf\u5de5\u5177 Pylint \u8fdb\u884c\u4ee3\u7801\u626b\u63cf\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a bash pylint.sh\n \u8fd0\u884c\u4e4b\u540e\u4f1a\u63d0\u793a\u4f60\u8981\u626b\u63cf\u7684\u76ee\u5f55\uff0c\u6bd4\u5982\u8f93\u5165 apps \uff0c\u5219\u4f1a\u626b\u63cf apps \u4e0b\u7684\u6240\u6709 Python \u4ee3\u7801\u3002 \u5728 setting/pylintrc.cfg \u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u76f8\u5173\u914d\u7f6e\uff0c\u626b\u63cf\u5b8c\u6210\u4e4b\u540e\u5728 report/pylints \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u626b\u63cf\u62a5\u544a\u3002 \u4ee3\u7801\u63d0\u4ea4\u9700\u901a\u8fc7 git review \u63d0\u4ea4\u5230 gerrit \uff0c\u4eba\u5de5 Code Review \u901a\u8fc7\u4e4b\u540e\u5408\u5165\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_11","title":"\u5341\u4e09\u3001\u63d0\u4ea4\u4ee3\u7801","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_9","title":"1. \u5b89\u88c5\u4f9d\u8d56","text":"sudo apt install git-review\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_9","title":"2. \u63d0\u4ea4\u6a21\u677f","text":"\u5728 ~ \u76ee\u5f55\u4e0b\u65b0\u5efa\u6587\u4ef6\uff0c\u5e76\u547d\u540d\u4e3a gitcommit_template \u5c06\u4ee5\u4e0b\u5185\u5bb9\u5199\u5165\u6587\u4ef6\u5f53\u4e2d\uff1a # commit type :fix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style(\u98ce\u683c\u4fee\u6539)\u3001refactor(\u91cd\u6784)\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test(\u6d4b\u8bd5) + \u7b80\u5355\u63cf\u8ff0. \u9ed8\u8ba4fix,\u6839\u636e\u60c5\u51b5\u4fee\u6539\nfix: \n\n# \u8be6\u7ec6\u8bf4\u660e\u4ee3\u7801\u7684\u6539\u52a8\uff0c\u5305\u542b\u4ee3\u7801\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u4ee5\u53ca\u4e3a\u4ec0\u4e48\u8fd9\u4e48\u505a\uff0c\u53ef\u80fd\u4f1a\u5f71\u54cd\u54ea\u4e9b\u529f\u80fd\u3002\u5bf9\u4e8e\u4ee3\u7801\u7684\u5ba1\u6838\u8005\uff0c\u9700\u8981\u4ece\u8fd9\u6bb5\u63cf\u8ff0\u4e2d\u80fd\u5b8c\u5168\u7406\u89e3\u4ee3\u7801\u4e2d\u6240\u6709\u6539\u52a8\u7684\u5185\u5bb9\nDescription: \n\n# \u5199\u4e00\u6bb5\u9762\u5411\u4e8e\u4ea7\u54c1\u7684\u603b\u7ed3\u6027\u5185\u5bb9\uff0c\u7528\u4e8e\u81ea\u52a8\u751f\u6210crp\u4e0a\u7684changlog\uff0c\u9700\u8981\u6ce8\u610f\u7684\u4e8b\uff0c\u8fd9\u6bb5\u63cf\u8ff0\u5fc5\u987b\u4ece\u4ea7\u54c1\u7684\u89d2\u5ea6\u8003\u8651\u3002\nLog: \n\n# \u5173\u8054pms\u4e0a\u7684bug\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94bug\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4fee\u590dbug\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Bug: \n\n# \u4fee\u590d github issue \n#Issue: \n\n# \u5173\u8054pms\u4e0a\u7684\u4efb\u52a1\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94\u4efb\u52a1\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4efb\u52a1\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Task: \n \u547d\u4ee4\u884c\u6267\u884c: git config --global commit.template ~/gitcommit_template\n \u6b64\u547d\u4ee4\u5c06\u6a21\u677f\u52a0\u5165\u5230 git \u7684\u63d0\u4ea4\u6a21\u677f\u4e2d\u3002 \u540e\u7eed\u63d0\u4ea4\u7684\u65f6\u5019\u9700\u8981\u5173\u6ce8\u4e00\u4e0b\u51e0\u70b9\uff1a commit type \u5bf9\u5e94\u4e0d\u540c\u7684\u4fee\u6539\u7c7b\u578b\uff1afix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style \uff08\u98ce\u683c\u4fee\u6539\uff09\u3001refactor \uff08\u91cd\u6784\uff09\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test \uff08\u6d4b\u8bd5\uff09 commit type \u5192\u53f7\u540e\u9762\u52a0\u7a7a\u683c\u3002 Description \u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u9700\u8981\u8fdb\u884c\u8be6\u7ec6\u8bf4\u660e\uff0c\u6bd4\u5982\u5bf9\u529f\u80fd\u8fdb\u884c\u5927\u6539\u7b49\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_6","title":"3. \u63a8\u9001\u4ee3\u7801","text":"\u9996\u5148\u6dfb\u52a0 commit \u4fe1\u606f git add \u540e\u9762\u52a0\u6587\u4ef6\u540d\u79f0\n git add . # \u8868\u793a\u6dfb\u52a0\u6240\u6709\u6587\u4ef6\n \u4f7f\u7528\u8fd9\u6761\u547d\u4ee4\u6ce8\u610f\u6709\u4e9b\u4e34\u65f6\u6587\u4ef6\u4e0d\u8981\u63d0\u4ea4\u5230\u4ed3\u5e93\u4e86\u3002 git commit -a\n \u4e4b\u540e\u5728 fix: \u540e\u9762\uff08\u6ce8\u610f\u5192\u53f7\u540e\u9762\u5fc5\u987b\u52a0\u7a7a\u683c\uff0c\u4e0d\u7136\u76f4\u63a5-1\uff09\u5199\u672c\u5730\u63d0\u4ea4\u7684 commit \u4fe1\u606f\uff0c\u7136\u540e\u5c31\u53ef\u4ee5\u63d0\u4ea4\u4ee3\u7801\u4e86 git review branch(\u5f53\u524d\u5206\u652f) -r origin\n \u6700\u597d\u4e00\u6b21 commit\uff0c\u4e00\u6b21 git review \uff0c\u7ecf\u5e38\u6709\u540c\u5b66\u5728\u672c\u5730\u75af\u72c2 commit \u6700\u540e git review \u62a5\u9519\u4e0d\u77e5\u9053\u548b\u56de\u4e8b\u513f\u3002 \u82e5\u4e0d\u60f3\u6bcf\u6b21\u63d0\u4ea4\u90fd\u52a0\u4e0a -r \u9009\u9879\uff0c\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a git config --global gitreview.remote origin \u63d0\u4ea4\u4ee3\u7801\uff0c\u76f4\u63a5\u4f7f\u7528 git review branch<\u76ee\u6807\u5206\u652f>\uff0c\u4f8b\u5982 git review master"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git","title":"4. Git\u6807\u7b7e","text":"Git \u6807\u7b7e\u5b9e\u9645\u4e0a\u662f commit \u7684\u4e00\u4e2a\u522b\u540d\uff0c\u4e3b\u8981\u7528\u4e8e\u7ba1\u7406\u5386\u53f2\u7248\u672c\u3002 \u60f3\u8c61\u4e00\u4e0b\u9886\u5bfc\u8ba9\u4f60\u628a\u4e4b\u524d\u7684\u67d0\u4e2a\u7248\u672c\u7684\u4ee3\u7801\u62c9\u51fa\u6765\u8dd1\uff0c\u4f60\u662f\u4e0d\u662f\u4e56\u4e56\u7684\u53bb\u628a\u6240\u6709\u63d0\u4ea4\u8bb0\u5f55\u62c9\u51fa\u6765\u627e\uff0c\u7136\u540e\u627e\u5230\u90a3\u4e2a\u54c8\u5e0c\u503c\uff0c\u901a\u8fc7\u54c8\u5e0c\u503c\u6765\u68c0\u51fa\u4ee3\u7801\u3002 \u8fd9\u4e00\u5957\u64cd\u4f5c\u4e0b\u6765\u662f\u4e0d\u662f\u5f88\u9ebb\u70e6\uff0c\u8d39\u65f6\u95f4\u8fd8\u4e0d\u4e00\u5b9a\u80fd\u627e\u5f97\u5230\uff0c\u6ca1\u4eba\u80fd\u8bb0\u4f4f\u6bcf\u4e2a\u63d0\u4ea4\u54c8\u5e0c\u503c\u4ee5\u53ca\u8fd9\u6b21\u63d0\u4ea4\u90fd\u6539\u4e86\u54ea\u4e9b\u4ee3\u7801\u3002 \u56e0\u6b64\u7ed9\u63d0\u4ea4\u6253\u4e2a\u6807\u7b7e\uff0c\u5c31\u662f\u628a\u54c8\u5e0c\u503c\u8f6c\u6362\u6210\u4eba\u7c7b\u80fd\u7406\u89e3\u7684\u8bed\u8a00\uff0c\u6bd4\u5982 v1.0\uff0c\u5c31\u53ef\u4ee5\u76f4\u63a5\u901a\u8fc7\u6807\u7b7e\u627e\u5230\u5bf9\u5e94\u7684\u63d0\u4ea4\u3002 \u65b0\u5efa\u6807\u7b7e git tag -a <tagname>\n \u56de\u8f66\u4e4b\u540e\uff0cGit \u4f1a\u6253\u5f00\u4f60\u7684\u7f16\u8f91\u5668\uff0c\u8ba9\u4f60\u5199\u4e00\u53e5\u6807\u7b7e\u6ce8\u89e3\uff0c\u5c31\u50cf\u4f60\u7ed9\u63d0\u4ea4\u5199\u6ce8\u89e3\u4e00\u6837\u3002 \u67e5\u770b\u6240\u6709\u6807\u7b7e git tag -l\n# git tag \u4e5f\u884c\n \u5220\u9664\u6807\u7b7e git tag -d <tagname>\n \u63a8\u9001\u6807\u7b7e\u81f3\u8fdc\u7a0b git push \u547d\u4ee4\u5e76\u4e0d\u4f1a\u4f20\u9001\u6807\u7b7e\u5230\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\uff0c\u5fc5\u987b\u663e\u5f0f\u5730\u63a8\u9001\u6807\u7b7e\u3002 git push origin <tagname>\n \u63a8\u9001\u6240\u6709\u4e0d\u5728\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\u7684\u6807\u7b7e git push origin --tag\n \u5220\u9664\u8fdc\u7a0b\u6807\u7b7e git push origin :refs/tag/<tagname>\n \u540e\u671f\u6253\u6807\u7b7e \u5148\u7528 git log --pretty=oneline \u67e5\u8be2\u63d0\u4ea4\u8bb0\u5f55\uff0c\u83b7\u53d6\u6821\u9a8c\u7801\u3002 git tag -a <tagname> 9fceb02(\u6821\u9a8c\u7801)\n \u68c0\u51fa\u6807\u7b7e git checkout <tagname>\n \u6b64\u65f6\uff0c\u4ed3\u5e93\u4f1a\u5904\u4e8e\u201c\u5206\u79bb\u5934\u6307\u9488\uff08detached HEAD\uff09\u201d\u7684\u72b6\u6001\u3002 \u5728\u201c\u5206\u79bb\u5934\u6307\u9488\u201d\u72b6\u6001\u4e0b\uff0c\u5982\u679c\u4f60\u505a\u4e86\u67d0\u4e9b\u66f4\u6539\u7136\u540e\u63d0\u4ea4\u5b83\u4eec\uff0c\u6807\u7b7e\u4e0d\u4f1a\u53d1\u751f\u53d8\u5316\uff0c \u4f46\u4f60\u7684\u65b0\u63d0\u4ea4\u5c06\u4e0d\u5c5e\u4e8e\u4efb\u4f55\u5206\u652f\uff0c\u5e76\u4e14\u5c06\u65e0\u6cd5\u8bbf\u95ee\uff0c\u9664\u975e\u901a\u8fc7\u786e\u5207\u7684\u63d0\u4ea4\u54c8\u5e0c\u624d\u80fd\u8bbf\u95ee\u3002 \u56e0\u6b64\uff0c\u5982\u679c\u4f60\u9700\u8981\u8fdb\u884c\u66f4\u6539\uff0c\u6bd4\u5982\u4f60\u8981\u4fee\u590d\u65e7\u7248\u672c\u4e2d\u7684\u9519\u8bef\uff0c\u90a3\u4e48\u901a\u5e38\u9700\u8981\u521b\u5efa\u4e00\u4e2a\u65b0\u5206\u652f\uff1a git checkout -b <NewBranchName> <tagname>\n \u65b0\u5206\u652f\u4e0a\u53ef\u4ee5\u8fdb\u884c\u63d0\u4ea4\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_12","title":"\u5341\u56db\u3001\u5e38\u89c1\u95ee\u9898","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_10","title":"1. \u63d0\u4ea4\u4ee3\u7801\u65f6\u63d0\u793a\u90ae\u7bb1\u6216\u8005\u540d\u79f0\u4e0d\u5bf9","text":"\u91cd\u65b0\u914d\u7f6e\u90ae\u7bb1\u6216\u8005\u540d\u79f0\uff0c\u7136\u540e\u91cd\u7f6e\u751f\u6548\uff1a git commit --amend --reset-author\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_10","title":"2. \u600e\u4e48\u56de\u6eda\u5230\u4e4b\u524d\u7684\u7248\u672c","text":"(1)\u67e5\u8be2\u5386\u53f2\u63d0\u4ea4\u8bb0\u5f55 git log\n \u627e\u5230\u4f60\u8981\u56de\u6eda\u7684\u7248\u672c\uff0c\u590d\u5236 hash \u503c\u3002 \u6ce8\u610f\uff1a\u662f commit \u7a7a\u683c\u4e4b\u540e\u7684 hash \u503c\uff0c\u4e4b\u524d\u6709\u540c\u5b66\u590d\u5236\u7684 Change-Id: \u8fd9\u6837\u80af\u5b9a\u62a5\u9519\u3002 (2)\u56de\u6eda\u7248\u672c\uff0c\u4e0d\u6e05\u9664\u4ee3\u7801 git reset --soft ${hash}\n (3)\u56de\u6eda\u7248\u672c\uff0c\u6e05\u9664\u4ee3\u7801\uff0c\u614e\u7528\u54c8 git reset --hard ${hash}\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-f-s-e","title":"3. \u6d4b\u8bd5\u62a5\u544a\u91cc\u9762 F S . E \u662f\u4ec0\u4e48\u610f\u601d","text":"F \u8868\u793a\u5931\u8d25\uff0c. \uff08\u70b9\uff09\u8868\u793a\u901a\u8fc7\uff0cS \u8868\u793a\u8df3\u8fc7\uff0cE \u8868\u793a error \u6709\u62a5\u9519"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git-status","title":"4. \u89e3\u51b3 git status \u4e2d\u6587\u663e\u793a\u7684\u95ee\u9898","text":"git config --global core.quotePath false\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5-apps","title":"5. apps \u76ee\u5f55\u4e0b\u989c\u8272\u6709\u4e9b\u662f\u9ec4\u8272\u7684","text":"\u5728 Pycharm \u4e2d apps \u76ee\u5f55\u4e0b\u5e94\u7528\u5e93\u6587\u4ef6\u662f\u9ec4\u8272\u7684\uff0c\u7f16\u8f91\u5668\u8bc6\u522b\u4e0d\u5230\u4ee3\u7801\u65b0\u589e\u548c\u4fee\u6539\uff1b \u7531\u4e8e\u793e\u533a\u7248 Pycharm \u4e0d\u80fd\u52a8\u6001\u8bc6\u522b\u591a\u4ed3\u5e93\uff0c\u9700\u8981\u5728 setting \u91cc\u9762\u624b\u52a8\u6ce8\u518c\uff0c\u64cd\u4f5c\u6b65\u9aa4\uff1a File \u2014> Settings \u2014> Version Control \u2014> \u70b9 + \u53f7 \u2014> Directory \u9009\u4e2d\u5e94\u7528\u5e93\u5de5\u7a0b\u76ee\u5f55 \u2014> VCS \u9009\u4e2d Git \u2014> Apply \u5982\u6b64\u5c31\u53ef\u4ee5\u4e86\u3002 \u4e13\u4e1a\u7248 Pycharm \u4e0d\u5b58\u5728\u8fd9\u4e2a\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#6-envsh-r","title":"6. \u6267\u884c env.sh \u62a5\u9519 $'\\r':\u672a\u627e\u5230\u547d\u4ee4","text":"\u51fa\u73b0\u8fd9\u4e2a\u95ee\u9898\u4f60\u5e94\u8be5\u662f\u5728 windows \u4e0a\u6253\u5f00\u6216\u7f16\u8f91\u8fc7 env.sh \u811a\u672c\uff0cwindows\u4e0b\u7684\u6362\u884c\u662f\u56de\u8f66\u7b26+\u6362\u884c\u7b26\uff0c\u4e5f\u5c31\u662f\\r\\n\uff0c\u800c Linxu \u4e0b\u662f\u6362\u884c\u7b26 \\n\uff0cLinux \u4e0b\u4e0d\u8bc6\u522b \\r\uff0c\u56e0\u6b64\u62a5\u9519\u3002 \u89e3\u51b3\u65b9\u6848\uff1a # \u5c06 \\r \u66ff\u6362\u4e3a\u7a7a\nsudo sed -i 's/\\r//' env.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#7","title":"7.\u600e\u6837\u4e3a\u5355\u72ec\u67d0\u4e00\u6761\u7528\u4f8b\u914d\u7f6e\u6267\u884c\u8d85\u65f6\u65f6\u95f4","text":"\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u5982\u4e0b\uff1a @pytest.mark.timeout(300) # \u5355\u4f4d\u79d2\ndef test_xxx_001():\npass\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#8-youqu","title":"8. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u6240\u6709\u4ee3\u7801\uff0c\u5305\u542b\u5b50\u4ed3\u5e93","text":"\u524d\u7f6e\u6761\u4ef6\uff1a\u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 # \u7b2c\u4e00\u6b21\u5b58\u50a8\u5bc6\u7801\uff0c\u63d0\u4f9b\u540e\u9762\u62c9\u4ee3\u7801(gerrit: ldap\u8d26\u53f7\u548c\u5bc6\u7801\uff0cgit\u62c9\u53d6\u7b2c\u4e00\u6b21\u8f93\u5165\u4fdd\u5b58\uff0c\u540e\u9762\u76f4\u63a5\u4f7f\u7528)\ngit config --global credential.helper store\n\n# \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\uff0c\u5e76\u9012\u5f52\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\" --recursive\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#9-youqu","title":"9. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\u6307\u5b9a\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u524d\u7f6e\u6761\u4ef6\uff1a \u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 \u5df2\u5b58\u50a8\u8bbf\u95ee\u5bc6\u7801 # \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\"\n# \u6307\u5b9a\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ncd youqu\ngit submodule update --init apps/autotest_xxx_xxx\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#10-youqu","title":"10. \u5982\u4f55\u66f4\u65b0 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\uff0c\u6240\u6709\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u66f4\u65b0\u6240\u6709\u5b50\u4ed3\u5e93\u4ee3\u7801 cd youqu\ngit pull & git submodule foreach git pull\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#11-youqu-master-detached-head","title":"11. \u5982\u4f55\u4fee\u590d YouQu \u6240\u6709\u5b50\u4ed3\u5e93 master \u5206\u652f\u6e38\u79bb\u5934\uff08detached head\uff09","text":"\u4fee\u590d\u6240\u6709\u5b50\u4ed3\u5e93\u9ed8\u8ba4master \u5206\u652f\u6e38\u79bb\u5934 cd youqu\ngit submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/","title":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212 \u5206\u7c7b\uff1a/ \u67b6\u6784\u5e08\uff1a/ \u76ee\u6807\uff1a \u5e94\u7528 AT \u67b6\u6784\u5de5\u7a0b\u5316\uff0c\u53c2\u8003\u6027\u80fd\u81ea\u52a8\u5316\u5de5\u7a0b\u5b8c\u6210\u5de5\u7a0b\u5316\u6539\u9020\u3002 \u5e94\u7528\u95f4\u7528\u4f8b\u89e3\u8026\uff0c\u89e3\u9664\u6240\u6709\u4ea4\u53c9\u8c03\u7528\u7684\u65b9\u6cd5\uff0c\u5404\u5e94\u7528\u80fd\u8ddf\u968f\u81ea\u8eab\u8fed\u4ee3\u5468\u671f\u72ec\u7acb\u7ef4\u62a4 AT \u7528\u4f8b\u3002 \u5b8c\u6210\u516c\u5171\u65b9\u6cd5\u7684\u62bd\u53d6\u6574\u5408\uff0c\u5f62\u6210\u4e00\u5957\u72ec\u7acb\u4e8e\u5e94\u7528\u95f4\u7684\u516c\u5171\u65b9\u6cd5\u5e93\uff0c\u5404\u5e94\u7528\u65b9\u6cd5\u91cc\u9762\u4e0d\u5b58\u5728\u88ab\u591a\u4e2a\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\u3002 \u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u4e3a\u5c06\u6765\u9002\u914d\u66f4\u591a\u7684 AT \u8fd0\u7528\u573a\u666f\u63d0\u4f9b\u652f\u6491\uff0c\u539f\u5219\u4e0a\u53ef\u5b9e\u73b0\u65e0\u9650\u6269\u5c55\uff0c\u5728\u6bcf\u65e5\u6784\u5efa\u548c\u6301\u7eed\u96c6\u6210\u6d41\u7a0b\u843d\u5730\u4f7f\u7528\u3002 \u4ee3\u7801\u89c4\u8303\u95ee\u9898\u6e05\u96f6\uff0c\u7b26\u5408 Shell Check\u3001Pylint\u3001\u7cfb\u7edf\u90e8\u76f8\u5173\u7f16\u7801\u89c4\u8303\u8981\u6c42\u3002 \u610f\u4e49\uff1a \u7edf\u4e00\u6210\u7814 AT \u67b6\u6784\u8bbe\u8ba1\u601d\u8def\uff0c\u6d88\u9664 AT \u4ee3\u7801\u5b9e\u73b0\u548c\u7ef4\u62a4\u4e0a\u53ef\u80fd\u51fa\u73b0\u7684\u5206\u6b67\uff0c\u6539\u5584\u5386\u53f2 AT \u65e0\u5de5\u7a0b\u5316\u8bbe\u8ba1\u7684\u7f3a\u9677\uff0c\u63d0\u9ad8\u67b6\u6784\u4e13\u4e1a\u6027\u3002 \u5404\u5e94\u7528 AT \u4ee3\u7801\u76f8\u4e92\u72ec\u7acb\uff0c\u5951\u5408\u5e94\u7528\u72ec\u7acb\u53d1\u5e03\u7279\u6027\uff0c\u53ef\u652f\u6301\u8fed\u4ee3\u671f\u95f4\u72ec\u7acb\u65b0\u589e\u3001\u7ef4\u62a4\u548c\u6267\u884c\u3002 \u65b9\u6cd5\u8c03\u7528\u903b\u8f91\u5f97\u5230\u7b80\u5316\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u66f4\u9ad8\u6548\uff1b\u516c\u5171\u5e93\u62bd\u53d6\uff0c\u51cf\u5c11\u65b9\u6cd5\u91cd\u590d\u7f16\u5199\uff0c\u63d0\u9ad8\u4ee3\u7801\u5229\u7528\u7387\uff1b\u5e73\u5747\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u4ece40\u5206\u949f\u964d\u4f4e\u81f330\u5206\u949f\uff0c\u65e5\u4ea7\u51fa\u7528\u4f8b\u4ece12\u6761/\u5929\u63d0\u5347\u81f316\u6761/\u5929\u3002 \u53ef\u7075\u6d3b\u652f\u6491\u4e0d\u540c\u7684\u81ea\u52a8\u5316\u8fd0\u7528\u573a\u666f\uff0c\u5982 CI\u3001\u5192\u70df\u6d4b\u8bd5\u3001\u96c6\u6210\u6d4b\u8bd5\u3001\u56de\u5f52\u6d4b\u8bd5\u3001\u4e13\u9879\u6d4b\u8bd5\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_2","title":"\u4e00\u3001\u80cc\u666f\u4ecb\u7ecd","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1","title":"1\u3001\u73b0\u6709\u67b6\u6784\u4ecb\u7ecd","text":"\u73b0\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u6574\u4f53\u5206\u4e3a\u4e09\u5c42\uff1a\u7528\u4f8b\u5c42\uff08\u4e1a\u52a1\u903b\u8f91\u5c42\uff09\u3001\u4e2d\u95f4\u5c42\uff08\u5143\u7d20\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff09\u3001\u6838\u5fc3\u5c42\uff08\u5e95\u5c42\u529f\u80fd\u5e93\u5c42\uff09\u3002 \u7528\u4f8b\u5c42\uff1a\u5373\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4e13\u6ce8\u4e8e\u4e1a\u52a1\u529f\u80fd\u903b\u8f91\uff0c\u4e0d\u5173\u5fc3\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\uff1b \u4e2d\u95f4\u5c42\uff1a\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff0c\u6bcf\u4e2a\u65b9\u6cd5\u5747\u5bf9\u5e94\u4e00\u4e2a\u5143\u7d20\u7684\u4e00\u4e2a\u5177\u4f53\u64cd\u4f5c\uff0c\u4e5f\u53ef\u4ee5\u662f\u591a\u4e2a\u64cd\u4f5c\u7684\u7ec4\u5408\u64cd\u4f5c\uff0c\u4e2d\u95f4\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u7528\u4f8b\u5c42\uff0c\u5177\u6709\u53ef\u6269\u5c55\u6027\u548c\u590d\u7528\u6027\uff1b \u6838\u5fc3\u5c42\uff1a\u4e3b\u8981\u5c01\u88c5\u7684\u5e95\u5c42\u529f\u80fd\u5b9e\u73b0\uff0c\u6b64\u5c42\u5728\u6846\u67b6\u4e2d\u63d0\u4f9b\u4e00\u4e9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u529f\u80fd\u6a21\u5757\u76f8\u5bf9\u72ec\u7acb\uff0c\u6838\u5fc3\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u64cd\u4f5c\u5c42\uff0c\u6bd4\u5982\uff1a\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7 UI \u5750\u6807\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u952e\u9f20\u64cd\u4f5c\u7684\u57fa\u7840\u65b9\u64cd\u4f5c\u6a21\u5757\u3001Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757\u3001\u6587\u4ef6\u7684\u589e\u5220\u6539\u67e5\u64cd\u4f5c\u6a21\u5757\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2","title":"2\u3001\u81ea\u52a8\u5316\u7684\u5e94\u7528","text":"2.1\u3001CI \u6d41\u7a0b \u6bcf\u65e5\u6784\u5efa\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u7814\u53d1\u6bcf\u65e5\u63d0\u4ea4\u7684\u4ee3\u7801\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u73ed\u4e4b\u540e\u4f1a\u5c06\u5404\u5e94\u7528\u8fdb\u884c\u6253\u5305\uff0c\u7136\u540e\u5728\u6d4b\u8bd5\u673a\u4e0a\u5b89\u88c5\u66f4\u65b0 deb \u5305\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u5e94\u7528\u63d0\u4ea4\u96c6\u6210\u7684\u7248\u672c\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u8f7d\u6700\u65b0\u7684 ISO \u8fdb\u884c PXE \u90e8\u7f72\uff0c\u7136\u540e\u6d4b\u8bd5\u673a\u5b89\u88c5\u6700\u65b0\u7684\u955c\u50cf\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 2.2\u3001\u9a8c\u6536\u6d4b\u8bd5 \u5728\u5404\u9a8c\u6536\u8282\u70b9\u8fdb\u884c\u81ea\u52a8\u5316\u9a8c\u6536\uff0c\u76ee\u524d\u7684\u7b56\u7565\u662f\u5168\u7528\u4f8b\u8986\u76d6\u5168\u67b6\u6784\u3002 2.3\u3001\u56de\u5f52\u6d4b\u8bd5 \u56de\u5f52\u6d4b\u8bd5\u4eca\u5e74\u89c4\u5212\u5efa\u8bbe\u4e2d\uff0c\u65e8\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u6267\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\uff0c\u51cf\u5c11\u529f\u80fd\u6d4b\u8bd5\u7684\u91cd\u590d\u52b3\u52a8\u529b\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3","title":"3\u3001\u5b58\u5728\u7684\u95ee\u9898","text":" \u5404\u5e94\u7528\u4e4b\u95f4\u5b58\u5728\u8026\u5408 \u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u521d\u671f\uff0c\u6240\u6709\u5e94\u7528\u662f\u6574\u4f53\u53d1\u5e03\uff0c\u6211\u4eec\u662f\u5c06\u6240\u6709\u5e94\u7528\u770b\u6210\u662f\u4e00\u4e2a\u6574\u4f53\uff0c\u5404\u5e94\u7528\u4f5c\u4e3a\u5176\u4e2d\u7684\u4e00\u4e2a\u6a21\u5757\uff0c\u6240\u4ee5\u5b58\u5728\u5e94\u7528\u95f4\u65b9\u6cd5\u4ea4\u53c9\u8c03\u7528\u7684\u95ee\u9898\uff0c\u8fd9\u6837\u4ece\u6700\u521d\u7684\u8bbe\u8ba1\u6765\u8bb2\u786e\u5b9e\u80fd\u591f\u51cf\u5c11\u91cd\u590d\u4ee3\u7801\u7684\u7f16\u5199\u3002\u4f46\u662f\u73b0\u5728\u5e94\u7528\u8d70\u72ec\u7acb\u53d1\u5e03\uff0c\u5404\u5e94\u7528\u90fd\u6709\u81ea\u5df1\u7684\u8fed\u4ee3\u8282\u594f\uff0c\u5728\u65b0\u9700\u6c42\u5feb\u901f\u53d8\u5316\u7684\u8fc7\u7a0b\u4e2d\uff0c\u81ea\u52a8\u5316\u7ef4\u62a4\u53d8\u5f97\u5f02\u5e38\u56f0\u96be\uff0c\u539f\u56e0\u5c31\u662f\u81ea\u52a8\u5316\u9879\u76ee\u91cc\u9762\u5404\u4e2a\u5e94\u7528\u7684\u6709\u6bd4\u8f83\u591a\u7684\u8026\u5408\u5173\u7cfb\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u8fdb\u884c\u89e3\u8026\uff0c\u4ee5\u9002\u5e94\u5e94\u7528\u4e0d\u540c\u7684\u8fed\u4ee3\u5468\u671f\u3002 \u65e0\u6cd5\u7cbe\u51c6\u7684\u5212\u5206\u7528\u4f8b\u8303\u56f4 \u7528\u4f8b\u6267\u884c\u7684\u8303\u56f4\u4e0d\u591f\u7cbe\u51c6\uff0c\u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u4e3b\u8981\u901a\u8fc7\u7528\u4f8b\u7684\u5173\u952e\u8bcd core\uff08\u6838\u5fc3\uff09\u6765\u533a\u5206\u7528\u4f8b\u662f\u5426\u4e3a\u6838\u5fc3\u7528\u4f8b\uff0c\u4f46\u662f\u8fd9\u6837\u7684\u533a\u5206\u592a\u5bbd\u6cdb\u4e86\uff0c\u4e0d\u80fd\u9002\u5e94\u81ea\u52a8\u5316\u6d4b\u8bd5\u5728\u591a\u573a\u666f\u4e0b\u7684\u5e94\u7528\u3002\u5f88\u591a\u573a\u666f\u4e0b\u6211\u4eec\u8fd8\u9700\u8981\u6839\u636e\u7528\u4f8b\u7684\u7b49\u7ea7\u3001\u7528\u4f8b\u7684\u7c7b\u578b\u3001\u7528\u4f8b\u6765\u6e90\u7b49\u7b49\uff0c\u4e0d\u540c\u7684\u7ef4\u5ea6\u6765\u6311\u9009\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u5173\u952e\u5b57\u9700\u8981\u4eba\u5de5\u4e00\u6761\u6761\u7684\u6539\uff0c\u8d39\u65f6\u8d39\u529b\uff0c\u800c\u4e14\u4e0d\u597d\u7ef4\u62a4\u3002 \u53d7\u65b0\u9700\u6c42\u5f71\u54cd\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u597d\u7ef4\u62a4 \u76ee\u524d\u9700\u8981\u8df3\u8fc7\u7684\u7528\u4f8b\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684\u7528\u4f8b\u811a\u672c\u91cc\u9762\uff0c\u6dfb\u52a0\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\uff0c\u540e\u7eed\u89e3\u9664\u8df3\u8fc7\u7684\u65f6\u5019\u53c8\u9700\u8981\u627e\u5230\u8fd9\u6761\u811a\u672c\uff0c\u5220\u6389\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\u3002\u5728\u8df3\u8fc7\u7528\u4f8b\u8f83\u591a\u7684\u60c5\u51b5\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u96be\u5ea6\u3002 \u7f16\u5199\u7528\u4f8b\u65f6\u903b\u8f91\u6bd4\u8f83\u590d\u6742\uff0c\u9700\u8981\u8c03\u7528\u591a\u4e2a\u5e94\u7528\u7684\u65b9\u6cd5\u6a21\u5757\u3002 \u6846\u67b6\u6269\u5c55\u6027\u4e0d\u8db3\uff0c\u65e0\u6cd5\u6574\u5408\u6027\u80fd\u81ea\u52a8\u5316\u3001\u538b\u6d4b\u81ea\u52a8\u5316\u3001\u5b89\u5168\u81ea\u52a8\u5316\u7b49\u4e13\u9879\u6d4b\u8bd5\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_3","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u4e3a\u89e3\u51b3\u73b0\u6709\u95ee\u9898\uff0c\u9002\u5e94\u4e0d\u65ad\u4e30\u5bcc\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u66f4\u597d\u7684\u53d1\u6325\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4f5c\u7528\uff0c\u9700\u8981\u5bf9\u81ea\u52a8\u5316\u67b6\u6784\u53ca\u5404\u529f\u80fd\u6a21\u5757\u8fdb\u884c\u91cd\u65b0\u8bbe\u8ba1\u89c4\u5212\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_1","title":"1\u3001\u67b6\u6784\u8bbe\u8ba1","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_1","title":"2\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u6846\u67b6\u7684\u8fd0\u884c\u903b\u8f91\uff1a\u901a\u8fc7\u6838\u5fc3\u5c42\u63d0\u4f9b\u4e00\u4e2a\u57fa\u7840\u80fd\u529b\uff0c\u4e1a\u52a1\u5c42\u6839\u636e\u5b9e\u9645\u4e1a\u52a1\u9700\u6c42\uff08\u6d4b\u8bd5\u7528\u4f8b\uff09\u52a8\u6001\u52a0\u8f7d\u6838\u5fc3\u5c42\uff0c\u6267\u884c\u5165\u53e3\u52a0\u8f7d\u76f8\u5e94\u7684\u7528\u4f8b\u96c6\u5e76\u63a7\u5236\u6267\u884c\uff0c\u5e94\u7528\u5c42\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u9700\u6c42\uff0c\u901a\u8fc7\u76f8\u5e94\u7684\u914d\u7f6e\u9879\u8fdb\u884c\u914d\u7f6e\uff0c\u4ece\u800c\u89e6\u53d1\u81ea\u52a8\u5316\u6d4b\u8bd5\u4efb\u52a1\u3002 \u6838\u5fc3\u5c42\uff1a\u57fa\u672c\u4fdd\u6301\u4e0d\u53d8\uff0c\u90e8\u5206\u6a21\u5757\u4f1a\u6d89\u53ca\u5230\u65b0\u529f\u80fd\u5f00\u53d1\uff0c\u6838\u5fc3\u5c42\u5404\u529f\u80fd\u6a21\u5757\u4fdd\u6301\u72ec\u7acb\u6027\uff0c\u63d0\u4f9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u4f9b\u4e0a\u5c42\u8c03\u7528\uff1b \u5e95\u5c42\u6838\u5fc3\u6a21\u5757\u5305\u62ec\uff1a \u56fe\u50cf\u8bc6\u522b\u6a21\u5757 UI \u5b9a\u4f4d\u6a21\u5757 Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757 \u5c5e\u6027\u5b9a\u4f4d\u6a21\u5757 \u65e5\u5fd7\u6a21\u5757 \u952e\u9f20\u64cd\u4f5c\u6a21\u5757 \u6587\u4ef6\u64cd\u4f5c\u6a21\u5757 \u5f55\u5c4f\u6a21\u5757 \u81ea\u5b9a\u4e49\u65ad\u8a00\u6a21\u5757 \u7528\u4f8b\u6267\u884c\u6a21\u5757 PXE \u88c5\u673a\u6a21\u5757 \u952e\u9f20\u4fe1\u53f7\u6a21\u62df\u6a21\u5757 OCR \u6a21\u5757 \u4e1a\u52a1\u5c42\uff1a\u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e94\u7528\u5185\u5305\u542b\u591a\u4e2a\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5982\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7b49\uff0c\u540e\u7eed\u53ef\u4ee5\u6839\u636e\u9700\u8981\u5ac1\u63a5\u8fdb\u6765\u3002\u5176\u4e2d\u529f\u80fd\u6d4b\u8bd5\u8bbe\u8ba1\u601d\u8def\uff1a \u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e76\u5c06\u6d4b\u8bd5\u6570\u636e\u548c\u6d4b\u8bd5\u8d44\u6e90\u6574\u5408\u8fdb\u6765\uff0c\u589e\u52a0\u7528\u4f8b\u6807\u7b7e csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ed9\u6bcf\u6761\u7528\u4f8b\u6253\u6807\u7b7e\u3002 \u5404\u6807\u7b7e\u6240\u4f7f\u7528\u5bf9\u5e94\u7684\u5b57\u6bb5\u540d\u79f0\uff0c\u4f7f\u7528 csv \u6587\u4ef6\u7ef4\u62a4\u7528\u4f8b\u4e0e\u6807\u7b7e\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u5bf9\u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u53ef\u4ee5\u7ec4\u5408\u5176\u4e2d\u7684\u6807\u7b7e\u800c\u4ece\u9a71\u52a8\u5bf9\u5e94\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\uff0c\u517c\u5bb9\u73b0\u6709\u7528\u4f8b\u6807\u7b7e\uff0c\u4e14\u652f\u6301\u7528\u4f8b\u6807\u7b7e\u53ef\u6269\u5c55\uff1b \u4f7f\u7528 csv \u683c\u5f0f\u6587\u4ef6\u53ef\u4ee5\u65b9\u4fbf\u7684\u4f7f\u7528 Excel \u8868\u683c\u6253\u5f00\u8fdb\u884c\u7f16\u8f91\uff0c\u540c\u65f6\u7531\u4e8e csv \u6587\u4ef6\u5b9e\u9645\u662f\u4ee5\u90fd\u597d\u5206\u9694\u7684\u6587\u672c\u6587\u4ef6\uff0c\u4ee3\u7801\u4e2d\u53ef\u4ee5\u5728\u4e0d\u4f9d\u8d56\u4e09\u65b9\u5e93\u7684\u60c5\u51b5\u4e0b\u65b9\u4fbf\u5feb\u901f\u7684\u89e3\u6790\u5b83\uff0c\u53ef\u64cd\u4f5c\u6027\u548c\u53ef\u7ef4\u62a4\u6027\u8f83\u9ad8\u3002 \u5404\u4e2a\u5e94\u7528\u4e4b\u95f4\uff0c\u7528\u4f8b\u3001\u65b9\u6cd5\u3001\u6807\u7b7e\u548c\u8d44\u6e90\u90fd\u662f\u76f8\u4e92\u72ec\u7acb\u7684\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u7528\u4f8b\u65f6\u53ea\u9700\u8981\u81ea\u5df1\u5e94\u7528\u4e0b\u7684\u65b9\u6cd5\u548c\u516c\u5171\u5e93\u5373\u53ef\u3002 \u7ed3\u6784\u4e3e\u4f8b\uff1a .\n\u251c\u2500\u2500 apps\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_album # \u5e94\u7528\u540d (\u7528\u4e0b\u5212\u7ebf\u8fde\u63a5\u662f Python \u7f16\u7801\u89c4\u8303)\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_assert # \u65ad\u8a00\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_function_tag.csv # \u7528\u4f8b\u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 asan_cases # \u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases # \u529f\u80fd\u6d4b\u8bd5\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 res # \u6d4b\u8bd5\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config # \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_widget # \u5e94\u7528\u81ea\u5df1\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_widget # \u65b9\u6cd5\u57fa\u7c7b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 other_widget # \u8c03\u7528\u5176\u4ed6\u5e94\u7528\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_camera\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases\n\u2502\u00a0\u00a0 \u2502\u00a0 ...\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 public_widget # \u516c\u5171\u65b9\u6cd5\u5e93\n\u251c\u2500\u2500 config # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n...\n config \u914d\u7f6e\u6a21\u5757\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u76f8\u5e94\u914d\u7f6e\uff0c\u6d4b\u8bd5\u540c\u5b66\u53ef\u4ee5\u6839\u636e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5728 config \u91cc\u9762\u8fdb\u884c\u914d\u7f6e\u3002 \u5168\u5c40\u914d\u7f6e\uff1a \u6267\u884c\u4e00\u4e2a\u6216\u591a\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff1a\u5728 pattern \u91cc\u9762\u5199\u5165\u5e94\u7528\u5305\u540d\uff0c\u591a\u4e2a\u5e94\u7528\u4e4b\u95f4\u7528 or \u8fde\u63a5\uff0c\u5982 deepin-music or deepin-movie\uff1b \u5192\u70df\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a smoke\uff1b \u96c6\u6210\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a core \uff1b \u5168\u91cf\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u4e3a\u7a7a\u5373\u53ef\uff1b \u901a\u8fc7 tags \u7684\u914d\u7f6e\u6bd4\u8f83\u7075\u6d3b\uff0c\u540e\u9762\u6807\u7b7e\u5316\u7ba1\u7406\u7ae0\u8282\u4f1a\u8bb2\u5230\uff0c\u652f\u6301\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u7075\u6d3b\u914d\u7f6e\u3002 \u6307\u5b9a\u67d0\u53f0\u673a\u5668\u5728\u6307\u5b9a\u955c\u50cf\u7248\u672c\u4e0a\u6267\u884c\u7528\u4f8b\uff1a\u5728 IP \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a IP\uff0c\u5e76\u5728 URL \u91cc\u9762\u586b\u5165\u955c\u50cf\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u6846\u67b6\u4f1a\u8c03\u7528 PXE \u8fdb\u884c\u81ea\u52a8\u88c5\u673a\uff0c\u88c5\u673a\u5b8c\u4e4b\u540e\u81ea\u52a8\u5f00\u59cb\u6267\u884c\u914d\u7f6e\u7684\u6d4b\u8bd5\u7528\u4f8b\u3002 \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\uff1a \u6bcf\u4e2a\u5e94\u7528\u5185\u90e8\u4f1a\u6709\u4e00\u4e2a\u5355\u72ec\u7684\u914d\u7f6e\u6a21\u5757\uff0c\u4f1a\u5305\u542b\u4e00\u4e9b\u672c\u5e94\u7528\u7684\u6d4b\u8bd5\u8d44\u6e90\u7684\u8def\u5f84\u3001\u6267\u884c\u7528\u4f8b\u7684\u6807\u7b7e\u914d\u7f6e\u7b49\u7b49\uff0c\u5982\u679c\u5728\u5c40\u90e8\u914d\u7f6e\u91cc\u9762\u914d\u7f6e\u4e86\u7528\u4f8b\u6267\u884c\u6807\u7b7e\uff0c\u800c\u5916\u5c42 runner \u51fa\u6ca1\u6709\u6307\u5b9a\u6267\u884c\u6807\u7b7e\uff0c\u5219\u5728\u6267\u884c\u65f6\u53ea\u4f1a\u6267\u884c\u5c40\u90e8\u914d\u7f6e\u5df2\u914d\u7f6e\u7684\uff0c\u82e5\u5916\u5c42 runner \u4e5f\u914d\u7f6e\u4e86\u6267\u884c\u6807\u7b7e\uff0c\u5219\u4f1a\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u7528\u4f8b\u3002 \u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u914d\u7f6e\u90fd\u5728\u540c\u4e00\u4e2a\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\uff0cpy \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684\u7c7b\uff0cini \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684 option\u3002 \u5168\u5c40\u914d\u7f6e\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u7b56\u7565\u5982\u4e0b\uff1a \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5c40\u90e8\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5e94\u7528\u5c42\uff1arunner \u662f\u6d4b\u8bd5\u6267\u884c\u7684\u5165\u53e3\uff0c\u5b83\u4f1a\u6839\u636e\u914d\u7f6e\u91cc\u9762\u7684\u914d\u7f6e\u9879\uff0c\u8fdb\u884c\u7528\u4f8b\u7684\u52a0\u8f7d\u548c\u6267\u884c\u3002\u5b83\u63d0\u4f9b\u63a5\u53e3\u7ed9\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\uff0c\u5e73\u53f0\u4e0a\u7684\u6307\u4ee4\u5b9e\u9645\u4e0a\u90fd\u662f\u901a\u8fc7\u4e0b\u53d1\u7ed9 runner\uff0c\u7136\u540e\u7531 runner \u6765\u6267\u884c\u76f8\u5e94\u7684\u6d4b\u8bd5\u3002 \u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u662f\u4e00\u4e2a\u524d\u7aef\u7cfb\u7edf\uff0c\u53ef\u4ee5\u8fdb\u884c\u6d4b\u8bd5\u673a\u7ba1\u7406\u3001\u81ea\u52a8\u5b89\u88c5\u955c\u50cf\u3001\u81ea\u52a8\u5b89\u88c5\u6307\u5b9a\u5e94\u7528\u7248\u672c\u3001\u8fdb\u884c\u6d4b\u8bd5\u7528\u4f8b\u8303\u56f4\u9009\u62e9\u3001\u7528\u4f8b\u89e6\u53d1\u6267\u884c\u63a7\u5236\u3001\u7ed3\u679c\u5c55\u793a\u8f93\u51fa\u7b49\u3002 \u4e00\u4e2a\u5e94\u7528\u7684\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\u90fd\u53ef\u4ee5\u5355\u72ec\u89e6\u53d1\u3002 \u517c\u5bb9\u6027\u6d4b\u8bd5\u4e3b\u8981\u901a\u8fc7 PXE \u670d\u52a1\u5668\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u88c5\u673a\uff0c\u7136\u540e\u914d\u5408 AT \u8fdb\u884c\u6d4b\u8bd5\uff0c\u53ef\u4ee5\u5b9e\u73b0\u4e0d\u540c\u7cfb\u7edf\u7248\u672c\u3001\u4e0d\u540c\u5e94\u7528\u7248\u672c\u73af\u5883\u4e0a\u90fd\u53ef\u4ee5\u8fdb\u884c\u81ea\u52a8\u5316\u7684 AT \u6267\u884c\uff0c\u63d0\u9ad8\u517c\u5bb9\u6027\u6d4b\u8bd5\u6548\u7387\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_4","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_2","title":"1\u3001\u7528\u4f8b\u89e3\u8026","text":"\u5b58\u5728\u8026\u5408\u5173\u7cfb\u7684\u65b9\u6cd5\uff1a\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u88ab\u5916\u90e8\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\uff0c\u5219\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u8026\u5408\u5173\u7cfb\u3002 1.1\u3001\u901a\u8fc7\u7f16\u8f91\u5668 Find Usages \u67e5\u770b\u6bcf\u4e2a\u65b9\u6cd5\u88ab\u8c03\u7528\u7684\u8def\u5f84\u548c\u88ab\u8c03\u7528\u6b21\u6570\uff1b 1.2\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 1 \u4e2a\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728\u5916\u90e8\u5e94\u7528\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1b 1.3\u3001\u64cd\u4f5c\u5c42\u6587\u4ef6\u540d\u5747\u4ee5 widget \u7ed3\u5c3e\uff0c\u7c7b\u540d\u4ee5 Widget \u7ed3\u5c3e\uff0c\u5982\uff1a\u6587\u4ef6\u540d music_widget.py \uff1a class MusicWidget:\n\"\"\"\u97f3\u4e50\u7684\u64cd\u4f5c\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_2","title":"2\u3001\u516c\u5171\u5e93\u5efa\u8bbe","text":"2.1\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 2 \u4e2a\u53ca\u4ee5\u4e0a\u7684\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728 public_widget \u76ee\u5f55\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1bpublic_widget \u5373\u4e3a\u516c\u5171\u65b9\u6cd5\u5e93\uff1b 2.2\u3001\u5728\u7528\u4f8b\u5c42\u4fee\u6539\u7528\u4f8b\u4e2d\u7c7b\u7684\u5bfc\u5165\u8def\u5f84\uff0c\u5c5e\u4e8e\u516c\u5171\u65b9\u6cd5\u7684\u5219\u8c03\u7528 public_widget \u4e2d\u7684\u7c7b\uff0c\u5916\u90e8\u5e94\u7528\u7684\u64cd\u4f5c\u65b9\u6cd5\uff0c\u5219\u8c03\u7528\u672c\u5e94\u7528\u76ee\u5f55\u4e0b\u91cd\u5199\u7684\u5916\u90e8\u5e94\u7528\u65b9\u6cd5\u3002 \u6bd4\u5982\uff1a\u51e0\u4e4e\u6240\u6709\u591a\u5a92\u4f53\u5e94\u7528\u90fd\u9700\u8981\u901a\u8fc7\u6587\u7ba1\u52a0\u8f7d\u8d44\u6e90\uff0c\u8c03\u8d77\u7684\u6587\u7ba1\u5bf9\u8bdd\u6846\u5b9e\u9645\u4e3a dde-desktop\uff0c\u56e0\u6b64\u5c06 desktop_widget.py \u653e\u5230 public_widget \u91cc\u9762\uff1a class DdeDesktopPublicWidget:\n\"\"\"\u516c\u5171-\u684c\u9762\u7684\u64cd\u4f5c\u65b9\u6cd5\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3_1","title":"3\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406","text":"3.1\u3001\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1a\u5bf9\u5e94 core\u3001smoke\uff0c\u6216\u4e3a\u7a7a\uff1b \u7528\u4f8b\u6765\u6e90\uff1a\u5bf9\u5e94 PMS \u7528\u4f8b\u6765\u6e90\uff0c\u5206\u522b\u7528 acp1\u3001acp2\u3001acp3\u3001acp4 \u8868\u793a\u3002 acp1 \uff1a\u4e1a\u52a1\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5199\u7684\u7528\u4f8b\uff0c\u88ab\u7528\u4e8e\u9a8c\u6536\u6d4b\u8bd5\u7684\uff1b acp2 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5f15\u5165\u7684\u4ea7\u54c1\u9a8c\u6536\u6d4b\u8bc4\u90e8\u7684\u7528\u4f8b\uff1b acp3 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u6839\u636e\u4ea7\u54c1\u9700\u6c42\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\uff1b acp4 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u901a\u8fc7\u793e\u533a\u3001\u8bba\u575b\u7528\u6237\u53cd\u9988\u95ee\u9898\u603b\u7ed3\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\u3002 \u4e3e\u4f8b\uff1a \u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u7528\u4f8b\u6765\u6e90 001 L1 core acp1 \u6807\u7b7e\u91c7\u7528\u679a\u4e3e\u7684\u65b9\u5f0f\u8fdb\u884c\u4ee3\u53f7\u7ba1\u7406\u65b9\u4fbf\u7ba1\u7406\u4ee5\u53ca\u540e\u7eed\u6269\u5c55\u3002 3.2\u3001\u5728\u6bcf\u4e2a\u5e94\u7528\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u7b2c\u4e00\u5217\u4e3a\u7528\u4f8b\u7684 ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ba1\u7406\u6a21\u5757\u5185\u7684\u7528\u4f8b\u6807\u7b7e\u3002\u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 3.3\u3001\u5bf9\u7167 PMS \u4e0a\u7528\u4f8b\u7b49\u7ea7\u3001\u7528\u4f8b\u7c7b\u578b\u548c\u7528\u4f8b\u6765\u6e90\uff0c\u6807\u8bb0\u6240\u6709\u5df2\u5b9e\u73b0\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u540e\u7eed\u7f16\u5199\u65b0\u589e\u81ea\u52a8\u5316\u7528\u4f8b\u65f6\uff0c\u6bcf\u5199\u4e00\u6761\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684 csv \u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u6b64\u6761\u7528\u4f8b\u7684\u6807\u7b7e\u3002 3.4\u3001\u8df3\u8fc7\u7528\u4f8b\u6807\u7b7e\u5316 \u73b0\u6709\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a\uff1a \u4e3e\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u8bb0\u4e3a \u201cskip-\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u8bb0\uff0c\u5982\u679c\u5df2\u7ecf\u6807\u8bb0\u4e86\u8df3\u8fc7\u539f\u56e0\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u8bb0\u4e3a SKIPED\uff0c\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\u3002 \u6240\u6709\u7684\u6807\u7b7e\u5728 docs \u76ee\u5f55\u4e0b\u4f1a\u6709\u4e00\u4e2a\u6587\u6863\uff0c\u6587\u6863\u6682\u5b9a\u540d\u79f0\u4e3a\uff1atags_info.md\uff0c\u7528\u4e8e\u8bf4\u660e\u73b0\u5728\u5df2\u7ecf\u4f7f\u7528\u5230\u7684\u6807\u7b7e\uff0c\u4ee5\u53ca\u8fd9\u4e9b\u6807\u7b7e\u7684\u89e3\u91ca\u548c\u7528\u6cd5\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#4","title":"4\u3001\u7528\u4f8b\u6267\u884c","text":"4.1\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u7684\u9a71\u52a8\u6267\u884c\u903b\u8f91\u529f\u80fd\u5b9e\u73b0 \u5f00\u53d1\u6839\u636e\u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\u91cc\u9762\u7684\u7528\u4f8b\u6807\u7b7e\u6267\u884c\u5bf9\u5e94\u7528\u4f8b\u7684\u529f\u80fd\uff0c\u80fd\u652f\u6301\u591a\u4e2a\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u6267\u884c\u5165\u53e3\u80fd\u968f\u610f\u901a\u8fc7\u7528\u4f8b\u6807\u7b7e\u6307\u5b9a\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002 \u7528\u4f8b\u6807\u7b7e\u7684\u9a71\u52a8\u65b9\u5f0f\u5fc5\u987b\u80fd\u652f\u6301\u6807\u7b7e\u7684\u6269\u5c55\uff0c\u672a\u6765\u968f\u7740\u4e1a\u52a1\u7684\u53d8\u5316\u53ef\u80fd\u9700\u8981\u589e\u52a0\u5404\u79cd\u5404\u6837\u7684\u6807\u7b7e\u3002 4.2\u3001\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u6267\u884c \u529f\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u3001\u6027\u80fd\u6d4b\u8bd5\u7b49\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u662f\u5206\u5f00\u6267\u884c\u7684\uff0c\u4e5f\u5c31\u662f\u5728\u4e00\u6b21\u6267\u884c\u4e2d\uff0c\u53ea\u80fd\u6267\u884c\u5176\u4e2d\u4e00\u79cd\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5177\u4f53\u8981\u6267\u884c\u54ea\u4e00\u79cd\u540c\u6837\u901a\u8fc7\u53c2\u6570\u6765\u63a7\u5236\u3002 4.3\u3001\u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c \u7531\u4e8e\u6d4b\u8bd5\u673a\u8d44\u6e90\u6709\u9650\uff0c\u968f\u7740\u81ea\u52a8\u5316\u7528\u4f8b\u6570\u91cf\u7684\u589e\u52a0\uff0cCI \u6267\u884c\u65f6\u95f4\u4f1a\u8d8a\u6765\u8d8a\u957f\u3002 \u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c\u7684\u529f\u80fd\uff1a \u540c\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\u5206\u6563\u5230\u4e0d\u540c\u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u4e0a\u6267\u884c\uff0c\u7f29\u77ed\u6267\u884c\u603b\u65f6\u95f4\uff1b \u7b2c\u4e8c\u5929\u8dd1\u7684\u65f6\u5019\u540c\u4e00\u4e2a\u673a\u5668\u4e0a\u4f1a\u6267\u884c\u6628\u5929\u6ca1\u6709\u6267\u884c\u5230\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u6267\u884c\u540c\u7406\uff1b \u53ef\u4ee5\u5b9e\u73b0\u5728\u5168\u67b6\u6784\u6d4b\u8bd5\u673a\u4e0a\u8f6e\u6d41\u6267\u884c\u7528\u4f8b\uff0c\u65e2\u80fd\u4fdd\u8bc1\u6267\u884c\u4e86\u6240\u6709\u7684\u7528\u4f8b\uff0c\u53c8\u80fd\u5728\u8d44\u6e90\u6709\u9650\u7684\u60c5\u51b5\u4e0b\u8986\u76d6\u4e86\u6240\u6709\u7684\u67b6\u6784\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#5","title":"5\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0","text":"5.1\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u4f5c\u4e3a\u524d\u7aef\u754c\u9762\u7cfb\u7edf\uff0c\u901a\u8fc7\u9875\u9762\u4e0a\u7684\u4e00\u4e9b\u529f\u80fd\u9009\u9879\u8fdb\u884c\u5bf9\u5e94\u6d4b\u8bd5\u4efb\u52a1\u7684\u7ba1\u7406\u6216\u89e6\u53d1\uff0c\u4e1a\u5185\u6bd4\u8f83\u6d41\u884c\u7684\u5b9e\u73b0\u65b9\u6848\u662f\u4f7f\u7528 Vue + DRF \u5b9e\u73b0\u4e00\u4e2a\u524d\u540e\u7aef\u5206\u79bb\u7684\u7cfb\u7edf\u3002 \u6d4b\u8bd5\u5e73\u53f0\u53ef\u80fd\u4f1a\u6d89\u53ca\u5230\u7684\u6a21\u5757\u6709\uff1a\u6d4b\u8bd5\u673a\u8d44\u6e90\u7ba1\u7406\u6a21\u5757\u3001\u7528\u4f8b\u6267\u884c\u63a7\u5236\u6a21\u5757\u3001\u7ed3\u679c\u5c55\u793a\u6a21\u5757\u3001PXE \u955c\u50cf\u5b89\u88c5\u6a21\u5757\u7b49\u3002 \u7528\u6237\uff08\u6d4b\u8bd5\u3001\u7814\u53d1\u540c\u5b66\u7b49\uff09\u53ef\u4ee5\u914d\u7f6e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5982\u6267\u884c\u54ea\u4e2a\u5e94\u7528\u3001\u6267\u884c\u7528\u4f8b\u7684\u8303\u56f4\u3001\u5728\u54ea\u53f0\u673a\u5668\u4e0a\u6267\u884c\u3001\u955c\u50cf\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u5e94\u7528\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u6267\u884c\u65f6\u95f4\u3002 5.2\u3001\u6267\u884c\u5165\u53e3 runner \u63d0\u4f9b\u7ed9\u6d4b\u8bd5\u5e73\u53f0\u7684\u63a5\u53e3\u5305\u62ec\uff1a\u7528\u4f8b\u6267\u884c\u63a5\u53e3\u3001\u7ed3\u679c\u8fd4\u56de\u63a5\u53e3\u3001\u955c\u50cf\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u955c\u50cf\u5b89\u88c5\u63a5\u53e3\u3001\u5e94\u7528\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u5e94\u7528\u5b89\u88c5\u66f4\u65b0\u63a5\u53e3\u7b49\u3002 \u524d\u7aef\u5e73\u53f0\u76ee\u524d\u8fd8\u6ca1\u6709\u592a\u591a\u8be6\u7ec6\u7684\u65b9\u6848\uff0c\u672c\u6b21\u8bbe\u8ba1\u4e3b\u8981\u96c6\u4e2d\u5728\u540e\u7aef\u8fd9\u90e8\u5206\u67b6\u6784\u7684\u8bbe\u8ba1\u4e0a\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_5","title":"\u56db\u3001\u5b9e\u65bd\u8ba1\u5212","text":"\u8fd1\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u6587\u7ba1\u4ee3\u7801\u89e3\u8026 2022/3/28 2022/4/8 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u56fe\u5f62\u56fe\u50cf\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u97f3\u89c6\u9891\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5168\u5c40\u641c\u7d22\u4ee3\u7801\u89e3\u8026 2022/4/25 2022/4/26 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u516c\u5171\u5e93\u5efa\u8bbe 2022/4/27 2022/5/5 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5c01\u88c5\u7684\u65b9\u6cd5\u6574\u7406\u6210\u4e00\u4e2a\u8868 2022/5/6 2022/5/10 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7528\u4f8b\u6807\u7b7e\u5206\u7c7b\u8bc4\u4f30 2022/5/11 2022/5/11 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u6807\u7b7e\u5316\u6267\u884c\u9a71\u52a8\u7a0b\u5e8f\u7f16\u5199 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u9700\u5b9e\u73b0\u81ea\u52a8\u89e3\u6790 csv \u8868\u683c\u4e2d\u7684\u7528\u4f8b\u7f16\u53f7 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u722c\u866b\u811a\u672c\uff0c\u722c\u53d6 pms \u4e0a\u7528\u4f8b\u7684\u6807\u7b7e 2022/5/11 2022/5/13 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u5b9a\u65f6\u81ea\u52a8\u7ef4\u62a4\u672c\u5730 csv \u6587\u4ef6\u811a\u672c 2022/5/11 2022/5/20 \u4e2d\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u76ee\u5f55\u7ed3\u6784\u8c03\u6574 2022/5/20 2022/6/2 \u5b8c\u6210\u5168\u5c40\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u5177\u4f53\u65b9\u6848\u548c\u903b\u8f91\u5b9e\u73b0 2022/6/6 2022/6/17 \u9759\u6001\u626b\u63cf\u95ee\u9898\u6e05\u96f6 2022/6/20 2022/7/1 \u5b8c\u6210\u65b0\u6846\u67b6\u4f7f\u7528\u57f9\u8bad 2022/7/4 2022/7/11 \u843d\u5730\u8fd0\u884c 2022/7/12 2022/7/20 \u5e95\u5c42\u5e93\u7528\u9014\u8bf4\u660e\u6587\u6863\u7f16\u5199 2022/7/21 2022/7/28"}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\u200b\\u3000\\-\u3001\u3002\uff0c\uff0e\uff1f\uff01\uff1b]+","pipeline":["stemmer"]},"docs":[{"location":"","title":"\u9996\u9875","text":""},{"location":"#youqu","title":"\u6709\u8da3\uff08YouQu\uff09","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/4/1\n# Author : Mikigo\n# =============================================\n \u672c\u7ad9\u603b\u8bbf\u95ee\u91cf \u6b21 \u6b22\u8fce\u5728\u6d4f\u89c8\u5668\u8bbf\u95ee\u3010\u516c\u7f51\u6587\u6863\u3011 \u7edf\u4fe1\u516c\u53f8\u5185\u7f51\u8fd8\u53ef\u4ee5\u8bbf\u95ee\u3010\u5185\u7f51\u6587\u6863\u3011\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u54e6~~"},{"location":"#_1","title":"\u4e00\u3001\u7b80\u4ecb","text":"\u6709\u8da3\uff08YouQu\uff09\u662f\u6df1\u5ea6\u79d1\u6280\u8bbe\u8ba1\u548c\u5f00\u53d1\u7684\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff0c\u91c7\u7528\u7ed3\u6784\u5206\u5c42\u7684\u8bbe\u8ba1\u7406\u5ff5\uff0c\u652f\u6301\u591a\u5143\u5316\u5143\u7d20\u5b9a\u4f4d\u548c\u65ad\u8a00\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\u3001\u5f3a\u5927\u7684\u65e5\u5fd7\u548c\u62a5\u544a\u8f93\u51fa\u7b49\u7279\u8272\u529f\u80fd\uff0c\u540c\u65f6\u5b8c\u7f8e\u517c\u5bb9X11\u3001Wayland\u663e\u793a\u534f\u8bae\uff0c\u73af\u5883\u90e8\u7f72\u7b80\u5355\uff0c\u64cd\u4f5c\u6613\u4e0a\u624b\u3002"},{"location":"#17","title":"\u7231\u4e0a \u201c\u6709\u8da3\u201d \u7684 17 \u4e2a\u7406\u7531","text":" \u6838\u5fc3\u5e93\u63d0\u4f9b\u4e86\u7edf\u4e00\u7684\u63a5\u53e3\uff0c\u7f16\u5199\u65b9\u6cd5\u65f6\u53ea\u9700\u8981\u5bfc\u5165\u4e00\u4e2a\u5305\u5c31\u53ef\u4ee5\u4f7f\u7528\u5230\u6838\u5fc3\u5e93\u63d0\u4f9b\u7684\u6240\u6709\u529f\u80fd\uff1b \u516c\u5171\u5e93\u5c01\u88c5\u4e86\u5f88\u591a\u5e38\u7528\u6a21\u5757\u7684\u76f8\u5173\u65b9\u6cd5\uff0c\u6bd4\u5982\uff1a\u4efb\u52a1\u680f\u7684\u64cd\u4f5c\u3001\u684c\u9762\u7684\u64cd\u4f5c\u3001\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\u7b49\u7b49\uff1b \u9664\u4e86\u5e38\u7528\u7684\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u8bc6\u522b\u4ee5\u5916\uff0c\u6211\u4eec\u8fd8\u63d0\u4f9b\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u5176\u4f7f\u7528\u7b80\u5355\u4e14\u9ad8\u6548\uff0c\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff1b \u5bf9\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u5c06\u7f16\u5199\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u53d8\u5f97\u7b80\u5355\u800c\u4f18\u96c5\uff1b \u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u6280\u672f\u8fdb\u884c\u529f\u80fd\u5347\u7ea7\uff0c\u9664\u4e86\u652f\u6301\u5355\u4e2a\u5750\u6807\u8fd4\u56de\uff0c\u8fd8\u652f\u6301\u540c\u4e00\u754c\u9762\u4e0b\u591a\u4e2a\u76f8\u540c\u5143\u7d20\u8fd4\u56de\u591a\u4e2a\u5750\u6807\u7684\u529f\u80fd\uff1b \u63d0\u4f9b\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u548c\u6279\u91cf\u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u4e0d\u5230\u4e00\u4e2a csv \u6587\u4ef6\u539f\u6765\u80fd\u5e72\u8fd9\u4e48\u591a\u4e8b\u60c5\uff1b \u63d0\u4f9b\u4e86\u529f\u80fd\u5f3a\u5927\u7684\u6267\u884c\u5668\u5165\u53e3\uff0c\u8ba9\u4f60\u53ef\u4ee5\u65b9\u4fbf\u7684\u5728\u672c\u5730\u6267\u884c\u4efb\u4f55\u7528\u4f8b\u96c6\u7684\u7528\u4f8b\uff0c\u5176\u4e30\u5bcc\u7684\u81ea\u5b9a\u4e49\u914d\u7f6e\u9879\uff0c\u6ee1\u8db3\u4f60\u5bf9\u6267\u884c\u5668\u6240\u6709\u7684\u5e7b\u60f3\uff1b \u63d0\u4f9b\u8fdc\u7a0b\u6267\u884c\u7684\u529f\u80fd\uff0c\u53ef\u4ee5\u63a7\u5236\u591a\u53f0\u673a\u5668\u5e76\u884c\u8dd1\uff0c\u6216\u8005\u5206\u5e03\u5f0f\u8dd1\uff0c\u8fd9\u79cd\u4ed8\u8d39\u529f\u80fd\u73b0\u5728\u514d\u8d39\u7ed9\u4f60\u7528\uff1b \u63d0\u4f9b\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u529f\u80fd\uff0c\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u6bcf\u4e2a\u65b9\u6cd5\u5355\u72ec\u5199\u8f93\u51fa\u65e5\u5fd7\u7684\u4ee3\u7801\uff0c\u4e00\u5207\u6211\u4eec\u7ed9\u4f60\u641e\u5b9a\u4e86\uff0c\u65e5\u5fd7\u8f93\u51fa\u4e0d\u4ec5\u5185\u5bb9\u4e30\u5bcc\uff0c\u989c\u503c\u4e5f\u7edd\u5bf9\u5728\u7ebf\uff0c\u6211\u4eec\u8fd8\u81ea\u5df1\u8bbe\u8ba1\u4e86\u4e00\u6b3e\u7ec8\u7aef\u8f93\u51fa\u4e3b\u9898\u53eb\u300a\u4e94\u5f69\u6591\u6593\u7684\u9ed1\u300b\uff1b \u63d0\u4f9b\u4e86\u4e00\u952e\u90e8\u7f72\u81ea\u52a8\u5316\u6d4b\u8bd5\u73af\u5883\u7684\u529f\u80fd\uff0c\u8fde\u4ee3\u7801\u7f16\u8f91\u5668\u90fd\u7ed9\u4f60\u88c5\u597d\u4e86\uff0c\u8ba9\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u73af\u5883\u90e8\u7f72\u800c\u70e6\u607c\uff1b \u63d0\u4f9b\u4e86\u81ea\u52a8\u751f\u6210\u591a\u79cd\u62a5\u544a\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u8f93\u51fa\u4ec0\u4e48\u62a5\u544a\u5f62\u5f0f\u90fd\u884c\uff0c\u800c\u4e14\u6211\u4eec\u5728\u62a5\u544a\u4e2d\u8fd8\u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\u548c\u5931\u8d25\u622a\u56fe\u7684\u529f\u80fd\uff1b \u5bf9\u65ad\u8a00\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u63d0\u4f9b\u66f4\u53cb\u597d\u5316\u7684\u9519\u8bef\u63d0\u793a\uff0c\u8ba9\u5b9a\u4f4d\u95ee\u9898\u7cbe\u51c6\u9ad8\u6548\uff1b \u4e0d\u4ec5\u652f\u6301\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u63a7\u5236\uff0c\u800c\u4e14\u8fd8\u652f\u6301\u52a8\u6001\u63a7\u5236\u7528\u4f8b\u6279\u91cf\u6267\u884c\u7684\u603b\u65f6\u95f4\uff0c\u786e\u4fdd CI \u73af\u5883\u4e0b\u80fd\u987a\u7545\u8fd0\u884c\uff1b \u652f\u6301\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\u6267\u884c\u3001PMS \u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6807\u7b7e\u5316\u6267\u884c\u65b9\u6848\uff0c\u6ee1\u8db3\u4f60\u5404\u79cd\u573a\u666f\u4e0b\u7684\u6267\u884c\u9700\u6c42\uff1b \u652f\u6301\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u529f\u80fd\uff0c\u53ef\u5b9a\u4f4d\u53ef\u65ad\u8a00\uff0c\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\uff1b \u5b8c\u7f8e\u517c\u5bb9 Wayland \u548c X11\uff0c\u771f\u6b63\u505a\u5230\u4e00\u5957\u4ee3\u7801\uff0c\u968f\u5904\u6267\u884c\uff1b \u652f\u6301\u591a\u79cd\u65b9\u5f0f\u7684\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u5176\u4e2d\u5f02\u6b65\u56de\u586b\u7684\u65b9\u6848\uff0c\u5b8c\u7f8e\u89e3\u51b3\u4e86\u6570\u636e\u56de\u586b\u7684\u8017\u65f6\u95ee\u9898\uff1b \u3010\u89c6\u9891\u4ecb\u7ecd\u3011"},{"location":"#_2","title":"\u4e8c\u3001\u5b89\u88c5\u4f7f\u7528","text":"\u57fa\u7840\u6846\u67b6\uff1ahttps://github.com/linuxdeepin/deepin-autotest-framework \u4ece PyPI \u5b89\u88c5: sudo pip3 install youqu\n \u521b\u5efa\u9879\u76ee: youqu-startproject youqu\n \u5b89\u88c5\u4f9d\u8d56: cd youqu\nbash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002 \u5e94\u7528\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684\u5e94\u7528\u540d\u79f0\u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music cd apps/\n \u5c06\u5e94\u7528\u5e93\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u50cf\u8fd9\u6837\uff1a youqu\n\u251c\u2500\u2500 apps\n\u2502 \u251c\u2500\u2500 autotest_deepin_music # \u5e94\u7528\u5e93\n...\n \u5e94\u7528\u5e93\u7684\u540d\u79f0\u4e0d\u53ef\u4ee5\u4fee\u6539\u3002"},{"location":"#_3","title":"\u4e09\u3001\u8fd0\u884c","text":""},{"location":"#1","title":"1. \u5de5\u4f5c\u7a7a\u95f4","text":"\u57fa\u7840\u6846\u67b6\u5de5\u7a0b\u76ee\u5f55\u5efa\u8bae\u653e\u5728 ~ \u76ee\u5f55\u4e0b\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u4e5f\u53ef\u4ee5\u8fd0\u884c\uff0c\u4f46\u662f\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u9700\u8981\u505a\u73af\u5883\u6e05\u7406\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u5b58\u5728\u4ee3\u7801\u88ab\u5220\u9664\u7684\u98ce\u9669\u3002 \u5982\u679c\u4f60\u7684\u673a\u5668\u4e0a\u4e0d\u540c\u76ee\u5f55\u4e0b\u5b58\u5728\u591a\u4e2a YouQu \u5de5\u7a0b\uff0c\u90a3\u4e48\u5728\u8fd0\u884c\u4e4b\u524d\uff0c\u8bf7\u5148\u6267\u884c env.sh \u6821\u6b63\u76f8\u5173\u73af\u5883\u3002"},{"location":"#2","title":"2. \u6267\u884c\u5668","text":"\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u6709\u4e00\u4e2a manage.py \uff0c\u5b83\u662f\u4e00\u4e2a\u6267\u884c\u5668\u5165\u53e3\uff0c\u63d0\u4f9b\u4e86\u672c\u5730\u6267\u884c\u3001\u8fdc\u7a0b\u6267\u884c\u7b49\u7684\u529f\u80fd\u3002 \u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6765\u6267\u884c\uff1a youqu manage.py run -a deepin-music\n"},{"location":"#21","title":"2.1. \u672c\u5730\u6267\u884c","text":"youqu manage.py run\n"},{"location":"#211","title":"2.1.1. \u914d\u7f6e\u6587\u4ef6","text":"\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u914d\u7f6e\u53c2\u6570 \u5728\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u91cc\u9762\u652f\u6301\u914d\u7f6e\u5bf9\u6267\u884c\u7684\u4e00\u4e9b\u53c2\u6570\u8fdb\u884c\u914d\u7f6e\uff0c\u5e38\u7528\u7684\u5982\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;-----------------------------------------------\n;1.KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2.KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f\n;e.g. TAGS = L1 or smoke\n;-----------------------------------------------\n;\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\uff0c\u5c06\u8981\u6267\u884c\u7684\u7528\u4f8b\u5199\u5165\u6307\u5b9a\u7684 csv \u6587\u4ef6\n;\u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u4ece\u57fa\u7840\u6846\u67b6\u6839\u76ee\u5f55\u5f00\u59cb\uff1ae.g. CASE_FILE = case_list.txt\n;\u5982\u679c\u8fd9\u91cc\u6709\u503c\uff0cAPP_NAME KEYWORDS TAGS \u7684\u914d\u7f6e\u5747\u4e0d\u751f\u6548\nCASE_FILE =\n;=============================== RUNNER CONFIG ===================================\n[runner]\n;\u6700\u5927\u5931\u8d25\u7528\u4f8b\u6570\u91cf\u7684\u5360\u6bd4\n;\u6bd4\u5982\uff1a\u603b\u6267\u884c\u7528\u4f8b\u6570\u4e3a 100, \u82e5 MAX_FAIL = 0.5,\u5219\u5931\u8d25\u7528\u4f8b\u6570\u8fbe\u5230 50 \u5c31\u4f1a\u7ec8\u6b62\u6d4b\u8bd5\u3002\nMAX_FAIL = 1\n;\u5355\u6761\u7528\u4f8b\u7684\u8d85\u65f6\u65f6\u95f4\uff0c\u5982\u679c\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u8d85\u65f6\uff0c\u8fd9\u6761\u7528\u4f8b\u4f1a\u88ab\u505c\u6b62\uff0c\u540e\u7eed\u7528\u4f8b\u7ee7\u7eed\u6267\u884c\u3002\n;\u5355\u4f4d\u4e3a\u79d2\n;\u8fd9\u662f\u4e00\u4e2a\u5168\u5c40\u7edf\u4e00\u914d\u7f6e\uff0c\u5982\u679c\u67d0\u6761\u7528\u4f8b\u9700\u8981\u5355\u72ec\u914d\u7f6e\u8d85\u65f6\u65f6\u95f4\uff0c\u53ef\u4ee5\u5728\u7528\u4f8b\u4e2d\u8fd9\u6837\u5199\uff1a\n;@pytest.mark.timeout(500)\n;def test_xxx_001():\n; ...\n;\u4f1a\u8bdd\u8d85\u65f6\uff08\u6240\u6709\u7528\u4f8b\u6267\u884c\u7684\u8d85\u65f6\u65f6\u95f4\uff09\u662f\u6839\u636e\u5168\u5c40\u8d85\u65f6\u914d\u7f6e\u548c\u7528\u4f8b\u5355\u72ec\u8d85\u65f6\u914d\u7f6e\u81ea\u52a8\u8ba1\u7b97\u7684\u3002\nCASE_TIME_OUT = 200\n;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\n;\u6ce8\u610f\uff0cRERUN = 1 \u8868\u793a\u91cd\u8dd1 1 \u6b21\uff0c\u5373\u7b2c\u4e00\u6b21\u7528\u4f8b\u6267\u884c\u5931\u8d25\u4f1a\u81ea\u52a8\u91cd\u8dd1 1 \u6b21\uff0c\u603b\u5171\u6267\u884c 2 \u6b21\uff1b\n;\u5982\u679c\u7b2c 2 \u6b21\u6267\u884c\u6210\u529f\uff0c\u7ed3\u679c\u6210\u529f\uff0c\u5931\u8d25\u4ea6\u4e3a\u5931\u8d25\u3002\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c 1 \u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff0cRERUN >= RECORD_FAILED_CASE\u3002\n;1.\u5173\u95ed\u5f55\u5c4f\uff1aRECORD_FAILED_CASE > RERUN\n;2.\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1aRECORD_FAILED_CASE = 0\nRECORD_FAILED_CASE = 1\n;yes \u6bcf\u6761\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u8fdb\u884c\u73af\u5883\u6e05\u7406\nCLEAN_ALL = yes\n;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387, \u6bd4\u5982\uff1a1920x1080\n;no: \u8868\u793a\u4e0d\u505a\u5206\u8fa8\u7387\u6821\u9a8c\nRESOLUTION = 1920x1080\n;\u4e0d\u8df3\u8fc7\u7528\u4f8b\uff0ccsv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86 skip-xxx\u7684\u7528\u4f8b\u4e0d\u8df3\u8fc7\nNOSKIP = no\n;ignore fixed\n;no\uff0c\u53ea\u8981\u6807\u8bb0\u4e86fixed\u7684\u7528\u4f8b\uff0c\u5373\u4f7f\u6807\u8bb0\u4e86skip-\uff0c\u4e5f\u4f1a\u6267\u884c\uff1b\n;yes\uff0cfixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\uff1b\nIFIXED = no\n;\u8981\u5b89\u88c5deb\u5305\u7684\u8def\u5f84\n;e.g : ~/Downloads/ \u5b89\u88c5\u4e0b\u8f7d\u76ee\u5f55\u4e0b\u7684deb\u5305\uff0c\u5982\u679c\u662f\u8fdc\u7a0b\u6267\u884c\uff0c\u4f1a\u81ea\u52a8\u62f7\u8d1d\u5230\u8fdc\u7a0b\u5e76\u5b89\u88c5\u3002\nDEB_PATH =\n;DEBUG \u6a21\u5f0f\u6267\u884c\u7528\u4f8b\uff0c\u53ea\u6536\u96c6\u4e0d\u6267\u884c\u7528\u4f8b\uff0c\u4e5f\u4e0d\u505a\u8bbe\u5907\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002\nDEBUG = no\n;\u8bb0\u5f55top\u547d\u4ee4\u67e5\u8be2\u7684\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0cTOP = 3 \u8868\u793a\u8bb0\u5f55\u524d3\u4e2a\u8fdb\u7a0b\u3002\nTOP =\n;\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\nREPEAT =\n;\u9ed8\u8ba4\u5728\u6240\u6709\u6d4b\u8bd5\u5b8c\u6210\u4e4b\u540e\u8f93\u51fa\u62a5\u9519\u4fe1\u606f.\n;yes, \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\nDURING_FAIL = no\n;\u6ce8\u518c\u81ea\u542f\u670d\u52a1\nAUTOSTART = no\n;=============================== REPORT CONFIG ===================================\n[report]\n;\u6d4b\u8bd5\u62a5\u544a\u7684title\nREPORT_TITLE = YouQu Report\n;\u6d4b\u8bd5\u62a5\u544a\u7684name\nREPORT_NAME = YouQu Report\n;\u6d4b\u8bd5\u62a5\u544a\u7684\u9ed8\u8ba4\u8bed\u8a00\n;en:English\n;ru:\u0420\u0443\u0441\u0441\u043a\u0438\u0439\n;zh:\u4e2d\u6587\n;de:Deutsch\n;nl:Nederlands\n;he:Hebrew\n;br:Brazil\n;pl:Polski\n;ja:\u65e5\u672c\u8a9e\n;es:Espa\u00f1ol\n;kr:\ud55c\uad6d\uc5b4\n;fr:Fran\u00e7ais\n;az:Az\u0259rbaycanca\nREPORT_LANGUAGE = zh\n;\u7528\u4f8b\u6267\u884c\u5b8c\u540e\u751f\u6210\u7684\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n;\u76ee\u524d\u652f\u6301 allure, xml, json \uff08\u652f\u6301\u540c\u65f6\u751f\u6210\uff09\nREPORT_FORMAT = allure, xml, json\n;\u6307\u5b9a\u62a5\u544a\u751f\u6210\u7684\u8def\u5f84\uff08\u76f8\u5bf9\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\uff09\nALLURE_REPORT_PATH = report/\nXML_REPORT_PATH = report/\nJSON_REPORT_PATH = report/\n;=============================== GLOBAL CONFIG ===================================\n[globalconfig]\n;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\nPASSWORD = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\nIMAGE_MATCH_NUMBER = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6bcf\u6b21\u95f4\u9694\u7b49\u5f85\u65f6\u95f4\nIMAGE_MATCH_WAIT_TIME = 1\n;\u56fe\u50cf\u8bc6\u522b\u5339\u914d\u5ea6\nIMAGE_RATE = 0.9\n;\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u5b9e\u65f6\u56fe\u50cf\u4fdd\u5b58\u8def\u5f84\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u5750\u6807\nSCREEN_CACHE = /tmp/screen.png\n;\u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\u7684\u8def\u5f84\nTMPDIR = /tmp/tmpdir\n;\u7cfb\u7edf\u4e3b\u9898\nSYS_THEME = deepin\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = youqu-dev.uniontech.com\n;OpenCV\u670d\u52a1\u7aef\u5730\u5740\nOPENCV_SERVER_HOST = youqu-dev.uniontech.com\n;=============================== PMS CONFIG ===================================\n;PMS\u76f8\u5173\u914d\u7f6e\uff0c\u5305\u542b\u4ee5\u4e0b\u51e0\u4e2a\u65b9\u9762\uff1a\n;1.PMS\u6d4b\u8bd5\u5957\u6267\u884c\n;2.\u81ea\u52a8\u4ecePMS\u722c\u53d6\u6570\u636e\u5e76\u540c\u6b65\u672c\u5730CSV\u6587\u4ef6\n;3.PMS\u6570\u636e\u56de\u586b\n[pms]\n;PMS\u7684\u7528\u6237\u540d,\u5982: ut001234\nPMS_USER =\n;PMS\u7684\u5bc6\u7801\nPMS_PASSWORD =\n;PMS\u6d4b\u8bd5\u5957\u7684ID\n;\u5728PMS\u4e0a\u67e5\u770b\u7528\u4f8b\u201c\u5957\u4ef6\u201d\u94fe\u63a5: https://pms.uniontech.com/testsuite-view-495.html\n;\u6d4b\u8bd5\u5957ID\u4e3a: 495\nSUITE_ID =\n;\u6570\u636e\u56de\u586b\u5fc5\u987b\u5173\u8054PMS\u6d4b\u8bd5\u5355\n;\u5728PMS\u4e0a\u67e5\u770b\u6d4b\u8bd5\u5355\u94fe\u63a5: https://pms.uniontech.com/testtask-cases-20747.html\n;\u6d4b\u8bd5\u5355ID\u4e3a: 20747\nTASK_ID =\n;\u5c06\u6d4b\u8bd5\u7ed3\u679c\u6570\u636e\u56de\u586b\u5230PMS\n;\u4e3a\u7a7a: \u8868\u793a\u4e0d\u56de\u586b,\u4e0d\u4f1a\u5728\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u751f\u6210json\u7ed3\u679c\u6587\u4ef6;\n;async: \u8868\u793a\u9010\u6761\u5f02\u6b65\u56de\u586b,\u540e\u9762\u4e00\u6761\u6267\u884c\u5f00\u59cb\u65f6\u901a\u8fc7\u5b50\u7ebf\u7a0b\u5bf9\u524d\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u8fdb\u884c\u56de\u586b\uff0c\u5982\u6b64\u5b9e\u73b0\u65f6\u95f4\u6548\u7387\u6700\u5927\u5316;\n;finish: \u8868\u793a\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u6210\u4e4b\u540e\u9010\u4e2a\u56de\u586b(PMS\u4e0d\u652f\u6301\u5e76\u53d1);\nSEND_PMS =\n;\u6570\u636e\u56de\u586b\u7684\u89e6\u53d1\u8005\n;auto: \u6846\u67b6\u81ea\u52a8\u56de\u586b,\u914d\u5408SEND_PMS\u914d\u7f6e\u4f7f\u7528,\u4f60\u53ef\u4ee5\u9009\u62e9\u5728\u4e0d\u540c\u7684\u9636\u6bb5\u8fdb\u884c\u6570\u636e\u56de\u586b;\n;hand: \u624b\u52a8\u56de\u586b,\u6bcf\u6761\u7528\u4f8b\u4ecd\u7136\u4f1a\u751f\u6210json\u6587\u4ef6,\u4f46\u6846\u67b6\u4e0d\u4f1a\u8fdb\u884c\u6570\u636e\u56de\u586b,\u9700\u8981\u4f60\u53ef\u4ee5\u5728\u4f60\u60f3\u8981\u53d1\u9001\u7684\u65f6\u95f4\u70b9\u624b\u52a8\u89e6\u53d1\u56de\u586b;\nTRIGGER = auto\n;PMS\u56de\u586b\u7684\u91cd\u8bd5\u6b21\u6570\n;\u5982\u679c\u63a5\u53e3\u8bf7\u6c42\u5931\u8d25,\u4f1a\u8fdb\u884c\u91cd\u8bd5\nSEND_PMS_RETRY_NUMBER = 2\n[csv_link_pms_lib]\n;caselib: \u7528\u4f8b\u5e93\n;testcase: \u4ea7\u54c1\u5e93\u7528\u4f8b\nCASE_FROM = caselib\n[csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/caselib-browse-81.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 81\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic =\n[export_csv]\n;\u5bfc\u51fa\u7684csv\u6587\u4ef6\u540d\u79f0\uff0c\u9ed8\u8ba4 case_list.csv\nCSV_FILE = case_list.csv\n;exportcsv \u547d\u4ee4\u5bfc\u51fa case_list.csv \u6587\u4ef6\u65f6\u914d\u7f6e\u7684\u5b57\u6bb5\u540d\uff0c\u7528\u4f8b\u540d\u79f0\u9ed8\u8ba4\u5b58\u5728\u7b2c\u4e00\u5217\uff0c\u65e0\u9700\u6dfb\u52a0\nCSV_HEARD = \u7528\u4f8b\u7ea7\u522b,\u7528\u4f8b\u7c7b\u578b,\u6d4b\u8bd5\u7ea7\u522b,\u662f\u5426\u8df3\u8fc7\n[log_cli]\n;\u65e5\u5fd7\u76f8\u5173\u914d\u7f6e\uff08\u4e0d\u6253\u5370\u6784\u9020\u51fd\u6570\u548c\u9b54\u6cd5\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff09\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = DEBUG\n# ============= \u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u914d\u7f6e ================\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u5f00\u5934\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7, \u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_STARTSWITH = Assert\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u7ed3\u5c3e\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_ENDSWITH = Widget\n;\u652f\u6301\u7c7b\u540d\u5305\u542b xxx \u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_CONTAIN = ShortCut\n# ==============================================\n \u914d\u7f6e\u5b8c\u6210\u4e4b\u540e\uff0c\u76f4\u63a5\u5728\u547d\u4ee4\u884c\u6267\u884c manage.py \u5c31\u597d\u4e86\u3002 youqu manage.py run\n"},{"location":"#212","title":"2.1.2. \u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a youqu manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -h, --help show this help message and exit\n-a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--record_failed_case RECORD_FAILED_CASE\n\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--max_fail MAX_FAIL \u6700\u5927\u5931\u8d25\u7387\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--resolution RESOLUTION\n\u68c0\u67e5\u5206\u8fa8\u7387\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms {,async,finish}\n\u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--trigger {,auto,hand}\n\u89e6\u53d1\u8005\n-f CASE_FILE, --case_file CASE_FILE\n\u6839\u636e\u6587\u4ef6\u6267\u884c\u7528\u4f8b\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n--pms_user PMS_USER pms \u7528\u6237\u540d\n--pms_password PMS_PASSWORD\npms \u5bc6\u7801\n--suite_id SUITE_ID pms \u6d4b\u8bd5\u5957ID\n--pms_info_file PMS_INFO_FILE\npms \u4fe1\u606f\u6587\u4ef6\n--top TOP \u8fc7\u7a0b\u4e2d\u8bb0\u5f55top\u547d\u4ee4\u4e2d\u7684\u503c\n--lastfailed \u4ec5\u6267\u884c\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\n--duringfail \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\n--repeat REPEAT \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n--project_name PROJECT_NAME\n\u5de5\u7a0b\u540d\u79f0\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--build_location BUILD_LOCATION\n\u6784\u5efa\u5730\u533a\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--line LINE \u6267\u884c\u7684\u4e1a\u52a1\u7ebf\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--autostart AUTOSTART \u7528\u4f8b\u6267\u884c\u7a0b\u5e8f\u6ce8\u518c\u5230\u5f00\u673a\u81ea\u542f\u670d\u52a1\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a youqu manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\"\n \u547d\u4ee4\u884c\u53c2\u6570\u4f18\u5148\u7ea7\u662f\u9ad8\u4e8e\u914d\u7f6e\u6587\u4ef6\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u4e86\u5bf9\u5e94\u7684\u53c2\u6570\uff0c\u914d\u7f6e\u6587\u4ef6\u4e2d\u4e0d\u7ba1\u662f\u5426\u914d\u7f6e\u5747\u4e0d\u751f\u6548\u3002 --app \u5165\u53c2\u8fd8\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\uff0c\u4e0b\u9762\u7684\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u540c\u6837\u652f\u6301\u3002"},{"location":"#22","title":"2.2. \u8fdc\u7a0b\u6267\u884c","text":"\u8fdc\u7a0b\u6267\u884c\u5c31\u662f\u7528\u672c\u5730\u4f5c\u4e3a\u670d\u52a1\u7aef\u63a7\u5236\u8fdc\u7a0b\u673a\u5668\u6267\u884c\uff0c\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u76f8\u540c\uff1b \u4f7f\u7528 remote \u547d\u4ee4\uff1a youqu manage.py remote\n"},{"location":"#221","title":"2.2.1. \u8fdc\u7a0b\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u6267\u884c","text":"\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u6267\u884c\u5c31\u662f\u7531\u672c\u5730 YouQu \u4f5c\u4e3a\u670d\u52a1\u7aef\uff0c\u63a7\u5236\u8fdc\u7a0b N \u53f0\u673a\u5668\u6267\u884c\u76f8\u540c\u7684\u7528\u4f8b\uff0c\u6267\u884c\u5b8c\u4e4b\u540e\u6240\u6709\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u7ed3\u679c\u4f1a\u8fd4\u56de\u7ed9\u670d\u52a1\u7aef report \u76ee\u5f55\u4e0b\uff1b \u8fdc\u7a0b\u6267\u884c\u540c\u6837\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u8fdb\u884c\u7528\u4f8b\u76f8\u5173\u914d\u7f6e\uff1b \u9700\u8981\u91cd\u70b9\u8bf4\u4e00\u4e0b\u8fdc\u7a0b\u6267\u884c\u65f6\u7684\u6d4b\u8bd5\u673a\u4fe1\u606f\u914d\u7f6e\uff0c\u5728\u914d\u7f6e\u6587\u4ef6 setting/remote.ini \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\u3001IP\u3001\u5bc6\u7801\u3002 ;=============================== CLIENT LIST =====================================\n; \u6d4b\u8bd5\u673a\u914d\u7f6e\u5217\u8868\n;[client{number}] ;\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u6709\u591a\u5c11\u53f0\u6d4b\u8bd5\u673a\u5c31\u5199\u591a\u5c11\u4e2a client\uff0c\u522b\u540d\u5fc5\u987b\u5305\u542b client \u5b57\u7b26\uff0c\u4e14\u4e0d\u80fd\u91cd\u590d\u3002\n;user = ;\u6d4b\u8bd5\u673a user\n;ip = ;\u6d4b\u8bd5\u673a ip\n;password = 1 ;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801, \u53ef\u4ee5\u4e0d\u914d\u7f6e\u6b64\u9879\uff0c\u9ed8\u8ba4\u53d6 CLIENT_PASSWORD \u7684\u503c\uff1b\n;\u5982\u679c\u4f60\u6240\u6709\u6d4b\u8bd5\u673a\u5bc6\u7801\u90fd\u76f8\u540c\uff0c\u90a3\u4e48\u53ea\u9700\u8981\u914d\u7f6e CLIENT_PASSWORD \u5c31\u53ef\u4ee5\u4e86\n;=================================================================================\n[client1]\nuser = uos\nip = 10.8.15.xx\n[client2]\nuser = uos\nip = 10.8.15.xx\n[client3]\nuser = uos\nip = 10.8.11.xx\n \u6709\u591a\u5c11\u53f0\u673a\u5668\u5c31\u50cf\u8fd9\u6837\u53c2\u8003\u4e0a\u9762\u7684\u683c\u5f0f\u5199\u5c31\u884c\u4e86\u3002 \u7136\u540e\u5728\u547d\u4ee4\u884c\uff1a youqu manage.py remote\n \u8fd9\u6837\u8fd0\u884c\u662f\u4ece\u914d\u7f6e\u6587\u4ef6\u53bb\u8bfb\u53d6\u76f8\u5173\u914d\u7f6e\u3002 \u5982\u679c\u4f60\u4e0d\u60f3\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\uff0c\u4f60\u4ecd\u7136\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u8fdb\u884c\u4f20\u53c2\uff0c \u4ee5\u4e0b\u4e3a python3 manage.py remote \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -h, --help show this help message and exit\n-c CLIENTS, --clients CLIENTS\n\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679cpassword\u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6sett\ning/remote.ini\u4e2dCLIENT_PASSWORD\u7684\u503c,\u6bd4\u5982: uos@10.8.13.33:1\n\u6216 uos@10.8.13.33\n-s, --send_code \u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a\uff08\u4e0d\u542breport\u76ee\u5f55\uff09\n-e, --build_env \u642d\u5efa\u6d4b\u8bd5\u73af\u5883,\u5982\u679c\u4e3ayes\uff0c\u4e0d\u7ba1send_code\u662f\u5426\u4e3ayes\u90fd\u4f1a\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a.\n-p CLIENT_PASSWORD, --client_password CLIENT_PASSWORD\n\u6d4b\u8bd5\u673a\u5bc6\u7801\uff08\u5168\u5c40\uff09\n-y PARALLEL, --parallel PARALLEL\nyes:\u8868\u793a\u6240\u6709\u6d4b\u8bd5\u673a\u5e76\u884c\u8dd1\uff0c\u6267\u884c\u76f8\u540c\u7684\u6d4b\u8bd5\u7528\u4f8b;no:\u8868\u793a\u6d4b\u8bd5\u673a\u5206\u5e03\u5f0f\u6267\u884c\uff0c\u670d\u52a1\u7aef\u4f1a\u6839\u636e\u6536\u96c6\u5230\u7684\u6d4b\u8bd5\u7528\u4f8b\u81ea\n\u52a8\u5206\u914d\u7ed9\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u3002\n \u9664\u4e86\u8fd9\u4e9b\u7279\u6709\u53c2\u6570\u4ee5\u5916\uff0c\u5b83\u540c\u6837\u652f\u6301\u672c\u5730\u6267\u884c\u7684\u6240\u6709\u53c2\u6570\uff1b \u5728\u547d\u4ee4\u884c\u8fd9\u6837\u8fd0\u884c\uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\"\n \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report \u76ee\u5f55\u4e0b\u56de\u6536\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u7684\u6d4b\u8bd5\u62a5\u544a\u3002 \u6ce8\u610f\uff0c\u5982\u679c\u8fdc\u7a0b\u673a\u5668\u6ca1\u6709\u642d\u5efa\u81ea\u52a8\u5316\u6d4b\u8bd5\u73af\u5883\uff0c\u8bb0\u5f97\u52a0\u4e0a\u53c2\u6570 -e \uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\" -e\n \u6267\u884c\u524d\u786e\u4fdd\u8fdc\u7a0b\u673a\u5668\u5df2\u7ecf\u5f00\u542f\u4e86 ssh \u670d\u52a1\uff0c\u5426\u5219\u4f1a\u63d0\u793a\u65e0\u6cd5\u8fde\u63a5\uff0c\u5982\u679c\u6ca1\u6709\u5f00\u542f\uff0c\u8bf7\u624b\u52a8\u5f00\u542f\uff1a sudo systemctl restart ssh\nsudo systemctl enable ssh\n \u914d\u7f6e\u6587\u4ef6\u5176\u4ed6\u76f8\u5173\u914d\u7f6e\u9879\u8be6\u7ec6\u8bf4\u660e\uff0c\u8bf7\u67e5\u770b\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u6ce8\u91ca\u5185\u5bb9\u3002"},{"location":"#222","title":"2.2.2. \u8fdc\u7a0b\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u8d1f\u8f7d\u5747\u8861\u6267\u884c","text":"\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u8d1f\u8f7d\u5747\u8861\u6267\u884c\u4e5f\u662f\u7528\u672c\u5730\u4f5c\u4e3a\u670d\u52a1\u7aef\u63a7\u5236\u8fdc\u7a0b\u673a\u5668\u6267\u884c\uff0c\u4f46\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u4e0d\u540c\uff0c\u800c\u662f\u6240\u6709\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u4e4b\u548c\uff0c\u4e3a\u4f60\u60f3\u8981\u6267\u884c\u7684\u7528\u4f8b\u96c6\uff1b \u4f3c\u4e4e\u6709\u70b9\u96be\u4ee5\u7406\u89e3\uff0c\u6211\u7528\u5927\u767d\u8bdd\u4e3e\u4f8b\u63cf\u8ff0\u4e0b\u5c31\u662f\uff0c\u670d\u52a1\u7aef\u60f3\u8981\u6267\u884c 10 \u6761\u7528\u4f8b\uff0c\u73b0\u5728\u8fdc\u7a0b\u673a\u5668\u6709 5 \u53f0\uff1b \u7136\u540e\u670d\u52a1\u7aef\u5c31\u5148\u62ff\u7740\u7b2c 1 \u6761\u7528\u4f8b\u7ed9\u8fdc\u7a0b 1 \u53f7\u673a\u6267\u884c\uff0c\u62ff\u7b2c 2 \u6761\u7528\u4f8b\u7ed9\u8fdc\u7a0b 2 \u53f7\u673a\u6267\u884c...\uff0c\u5982\u6b64\u5faa\u73af\u76f4\u5230\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\uff0c\u8fd9\u5c31\u662f\u8d1f\u8f7d\u5747\u8861\u6267\u884c\u3002 \u4f7f\u7528\u65b9\u6cd5\u548c\u524d\u9762\u4e00\u6837\uff0c\u53ea\u662f\u9700\u8981\u589e\u52a0\u4e00\u4e2a\u53c2\u6570\uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\" --parallel no\n"},{"location":"#23-pms","title":"2.3. PMS \u6570\u636e\u56de\u586b","text":"\u6d4b\u8bd5\u5355\u5173\u8054\u7684\u7528\u4f8b\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u5bf9\u5e94\u7684\u53bb\u8dd1\u8fd9\u4e9b\u5173\u8054\u7684\u7528\u4f8b\uff0c\u5e76\u4e14\u5c06\u6267\u884c\u7684\u7ed3\u679c\u56de\u586b\u7684\u6d4b\u8bd5\u7528\u4f8b\u7684\u72b6\u6001\u91cc\u9762\u3002 PMS \u6570\u636e\u56de\u586b\u4e3b\u8981\u6709\u4e09\u79cd\u65b9\u5f0f\uff1a \uff081\uff09\u5f02\u6b65\u56de\u586b \u5728\u7528\u4f8b\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\uff0c\u91c7\u7528\u5f02\u6b65\u7684\u65b9\u5f0f\u53bb\u8fdb\u884c\u6570\u636e\u56de\u586b\uff0c\u76f4\u767d\u7684\u8bb2\u5c31\u662f\uff0c\u7b2c\u4e8c\u6761\u7528\u4f8b\u5f00\u59cb\u8dd1\u7684\u65f6\u5019\uff0c\u901a\u8fc7\u5b50\u7ebf\u7a0b\u53bb\u505a\u7b2c\u4e00\u6761\u7528\u4f8b\u7684\u6570\u636e\u56de\u586b\uff0c\u5982\u6b64\u5faa\u73af\uff0c\u76f4\u5230\u6240\u6709\u7528\u4f8b\u6267\u884c\u7ed3\u675f\uff1b \u8fd9\u79cd\u65b9\u6848\u7684\u65f6\u95f4\u6548\u7387\u6700\u9ad8\u7684\uff0c\u56e0\u4e3a\u7406\u8bba\u4e0a\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u662f\u5927\u4e8e\u6570\u636e\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\u65f6\u95f4\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u5f53\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u6570\u636e\u56de\u586b\u4e5f\u5b8c\u6210\u4e86\u3002 \u4f7f\u7528\u65b9\u6cd5\uff0c\u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u4ee5\u4e0b\u53c2\u6570\uff1a\uff08\u4ee5\u4e0b\u6d89\u53ca\u5230\u7684\u53c2\u6570\u914d\u7f6e\u90fd\u662f\u5728\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u914d\u7f6e\uff09 PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = async\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \u8fd9\u4e2a\u53c2\u6570\u53ef\u586b\u53ef\u4e0d\u586b\uff0c\u4f46\u662f\u586b\u4e86\u53ef\u4ee5\u63d0\u9ad8\u7528\u4f8b\u7684\u6267\u884c\u901f\u5ea6\uff0c\u56e0\u4e3a\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u53ef\u4ee5\u6307\u5b9a\u5230\u5177\u4f53\u7684\u5e94\u7528\u5e93\u3002\uff08\u4e0b\u540c\uff09\n \uff082\uff09\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u56de\u586b \u7b49\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u518d\u9010\u4e2a\u8fdb\u884c\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u6b64\u65b9\u6848\u65f6\u95f4\u6548\u7387\u6bd4\u8f83\u4f4e\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \uff083\uff09\u624b\u52a8\u56de\u586b \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4e0d\u505a\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u540e\u7eed\u624b\u52a8\u5c06\u7ed3\u679c\u8fdb\u884c\u56de\u586b\u8bf7\u6c42\u3002 \u7528\u4f8b\u6267\u884c\u65f6\u914d\u7f6e\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = hand\nAPP_NAME = \u540e\u7eed\u624b\u52a8\u56de\u586b\u65b9\u6cd5\uff1a youqu manage.py pms --send2task yes\n"},{"location":"#_4","title":"\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898","text":"\u7531\u540c\u5b66\u53ef\u80fd\u4f1a\u53d1\u73b0\uff0c\u600e\u4e48\u56de\u586b\u4e00\u6b21\u4e4b\u540e\uff0c\u540e\u9762\u60f3\u518d\u6b21\u56de\u586b\u5c31\u4e0d\u751f\u6548\u4e86\uff1b \u8fd9\u662f\u56e0\u4e3a\u4e3a\u4e86\u5e94\u5bf9\u524d\u9762\u63d0\u5230\u7684\u591a\u79cd\u6570\u636e\u56de\u586b\u7684\u65b9\u5f0f\uff0c\u5728 report \u76ee\u5f55\u4e0b\u4f1a\u7531 pms_xxx \u5f00\u5934\u7684\u76ee\u5f55\uff0c\u8bb0\u5f55\u4e86\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u548c\u56de\u586b\u60c5\u51b5\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u4e4b\u524d\u5df2\u7ecf\u56de\u586b\u8fc7\u4e86\uff0c\u540e\u7eed\u5c31\u4e0d\u4f1a\u518d\u6b64\u89e6\u53d1\u56de\u586b\u4e86\uff1b \u5982\u679c\u4f60\u60f3\u91cd\u65b0\u505a\u56de\u586b\uff0c\u4f60\u53ef\u4ee5\u628a report/pms_xxx \u76ee\u5f55\u5220\u6389\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u91cd\u65b0\u505a\u6570\u636e\u56de\u586b\u4e86\uff1b"},{"location":"#24-csv","title":"2.4. \u5bfc\u51fa CSV \u6587\u4ef6","text":"\u6846\u67b6\u63d0\u4f9b\u5bfc\u51fa\u6307\u5b9a\u6807\u7b7e\u7528\u4f8b\u7684\u529f\u80fd\uff1a youqu manage.py exportcsv -a deepin-album -t CICD\n \u8868\u793a\u5bfc\u51fa deepin-album \u7684\u7528\u4f8b\u4e2d\u6807\u8bb0\u4e86 CICD \u6807\u7b7e\u7684\u7528\u4f8b\uff0c\u5bfc\u51fa CSV \u6587\u4ef6\u7684\u5b57\u6bb5\u683c\u5f0f\u5df2\u7ecf\u9002\u914d\u4e86 CICD \u7684\u8981\u6c42\u3002"},{"location":"#25-app","title":"2.5. \u811a\u624b\u67b6\u65b0\u5efa APP \u5de5\u7a0b","text":"\u65b0\u5efa\u4e00\u4e2a APP \u5de5\u7a0b\uff1a youqu manage.py startapp autotest_deepin_some \u8fd9\u6837\u5728 apps \u76ee\u5f55\u4e0b\u4f1a\u521b\u5efa\u4e00\u4e2a\u5b50\u9879\u76ee\u5de5\u7a0b autotest_deepin_some\uff0c\u540c\u65f6\u65b0\u5efa\u597d\u5de5\u7a0b\u6a21\u677f\u76ee\u5f55\u548c\u6a21\u677f\u6587\u4ef6\uff1a apps\n\u2514\u2500\u2500 autotest_deepin_some\n \u00a0\u00a0 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_case.py\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 config.ini\n \u00a0\u00a0 \u251c\u2500\u2500 config.py\n \u00a0\u00a0 \u251c\u2500\u2500 conftest.py\n \u00a0\u00a0 \u251c\u2500\u2500 control\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_assert.py\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some.csv\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u2514\u2500\u2500 widget\n \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 case_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 other.ini\n \u00a0\u00a0 \u251c\u2500\u2500 other_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 pic_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2514\u2500\u2500 ui.ini\n autotest_deepin_some \u662f\u4f60\u7684\u5de5\u7a0b\u540d\u79f0\uff0c\u6bd4\u5982\uff1aautotest_deepin_music \uff1b \u5728\u6b64\u57fa\u7840\u4e0a\uff0c\u4f60\u53ef\u4ee5\u5feb\u901f\u7684\u5f00\u59cb\u4f60\u7684 AT \u9879\u76ee\u3002"},{"location":"#26","title":"2.6. \u7528\u4f8b\u6807\u7b7e\u81ea\u52a8\u540c\u6b65","text":"\u7528\u4e8e\u81ea\u52a8\u540c\u6b65 PMS \u7528\u4f8b\u6807\u7b7e\u6570\u636e\u81f3\u672c\u5730 CSV \u6587\u4ef6\uff0c\u4e3b\u8981\u901a\u8fc7\u4ee5\u4e0b\u51e0\u4e2a\u914d\u7f6e\u6765\u63a7\u5236\uff1a APP_NAME = # \u6307\u5b9a\u8981\u540c\u6b65\u7684\u5e94\u7528\u540d\u79f0\nPMS_USER = # PMS\u7684\u7528\u6237\u540d\nPMS_PASSWORD = # PMS\u7684\u5bc6\u7801\n \u5728 [csv_link_pms_id] \u8282\u70b9\u4e0b\u6307\u5b9a csv \u6587\u4ef6\u540d\u4e0e PMS \u7528\u4f8b\u6a21\u5757\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u6bd4\u5982\uff1a [csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/testcase-browse-53.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 53\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic = 53\n \u5c06\u4ee5\u4e0a\u4fe1\u606f\u914d\u7f6e\u597d\u4e4b\u540e\uff0c\u5728\u547d\u4ee4\u884c\u6267\u884c\uff1a youqu manage.py pms --pms2csv yes\n \u6bcf\u6b21\u6267\u884c\u65f6\u539f csv \u6587\u4ef6\u4f1a\u81ea\u52a8\u5907\u4efd\u5728 report/csv_back \u76ee\u5f55\u4e0b\uff0c\u56e0\u6b64\u4f60\u4e0d\u7528\u62c5\u5fc3\u811a\u672c\u6267\u884c\u5bfc\u81f4\u4f60\u7684\u6570\u636e\u4e22\u5931\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u57fa\u7840\u6846\u67b6\u8bbe\u8ba1\u65b9\u6848","text":"# ====================================\n# Author : Mikigo\n# Time : 2022/3/18\n# version \uff1a1.0\n# ====================================\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"\u505a\u4e00\u4e2a\u7b80\u5355\u3001\u597d\u7528\u3001\u529f\u80fd\u5f3a\u5927\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u3002 \u4f5c\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4e00\u4e2a\u57fa\u7840\u6846\u67b6\uff0c\u4efb\u4f55\u5e94\u7528\u90fd\u80fd\u5f88\u65b9\u4fbf\u7684\u63a5\u5165\u8fdb\u6765\uff1b \u63d0\u4f9b\u6240\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u9700\u8981\u7684\u5e95\u5c42\u529f\u80fd\uff0c\u5e76\u5bf9\u5916\u63d0\u4f9b\u552f\u4e00\u7684\u63a5\u53e3\uff0c\u65b9\u4fbf\u5e94\u7528\u5e93\u4f7f\u7528\uff1b \u6574\u5408\u516c\u5171\u5e93\uff0c\u51cf\u5c11\u5e94\u7528\u5e93\u4ee3\u7801\u91cf\u548c\u65b9\u6cd5\u7ef4\u62a4\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u8bbe\u8ba1\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u7edf\u4e00\u6982\u5ff5","text":" \u57fa\u7840\u6846\u67b6 \u672c\u9879\u76ee\u662f\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\uff08AutoTest Basic Frame\uff09\uff0c\u5168\u79f0\u4e3a\u201c\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff08AT \u57fa\u7840\u6846\u67b6\uff09\u201d\u3002 AT \u57fa\u7840\u6846\u67b6\u662f\u505a\u4e3a\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\u6765\u8bbe\u8ba1\u7684\uff0c\u5b83\u63d0\u4f9b\u4e86\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u57fa\u7840\u529f\u80fd\uff0c\u4efb\u4f55\u5e94\u7528\u63a5\u5165\u8fdb\u6765\u90fd\u80fd\u5feb\u901f\u65b9\u4fbf\u7684\u8fdb\u884c\u65b9\u6cd5\u548c\u7528\u4f8b\u7f16\u5199\uff0c\u540c\u65f6\u5728\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u3001\u6807\u7b7e\u5316\u6267\u884c\u3001\u5206\u5e03\u5f0f\u6267\u884c\u3001\u591a\u79cd\u62a5\u544a\u8f93\u51fa\u3001\u4f18\u7f8e\u7684\u6267\u884c\u65e5\u5fd7\u3001\u5931\u8d25\u81ea\u52a8\u5f55\u5c4f\u548c\u622a\u56fe\u3001\u81ea\u52a8\u73af\u5883\u6e05\u7406\u7b49\u7b49\uff0c\u5b83\u90fd\u63d0\u4f9b\u4e86\u5b8c\u5584\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u66f4\u91cd\u8981\u7684\u662f\u8fd9\u4e00\u5207\u4f7f\u7528\u8d77\u6765\u90fd\u975e\u5e38\u7b80\u5355\u3002 \u57fa\u7840\u6846\u67b6\u4e2d\u5305\u542b\u5e94\u7528\u5e93\uff08apps\uff09\u3001\u6838\u5fc3\u5e93\uff08src\uff09\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09\u3002 \u5e94\u7528\u5e93\uff08apps\uff09 \u5404\u4e2a\u5e94\u7528\u81ea\u5df1\u7684\u4ed3\u5e93\uff0c\u91cc\u9762\u4e3b\u8981\u5305\u542b\u7684\u662f\u7528\u4f8b\u3001\u65b9\u6cd5\u53ca\u4e00\u4e9b\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u53eb autotest-dde-file-manager \u3002 \u6838\u5fc3\u5e93\uff08src\uff09 \u6838\u5fc3\u5e93\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u5230\u6240\u6709\u5e95\u5c42\u6838\u5fc3\u529f\u80fd\uff0c\u8fd9\u662f\u6700\u91cd\u8981\u7684\u4e00\u4e2a\u90e8\u5206\uff0c\u7075\u9b42\u3002\u5177\u4f53\u529f\u80fd\u6a21\u5757\u53ca\u8bf4\u660e\u4f1a\u5728\u4e0b\u9762\u7b2c\u56db\u4e2a\u7ae0\u8282\u8be6\u7ec6\u63cf\u8ff0\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09 \u591a\u4e2a\u5e94\u7528\u90fd\u8981\u7528\u5230\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\uff0c\u6309\u7167\u5e94\u7528\u5212\u5206\u5b58\u653e\uff0c\u4e3b\u8981\u662f\u4e3a\u4e86\u51cf\u5c11\u4ee3\u7801\u91cf\uff0c\u6d88\u9664\u5e94\u7528\u95f4\u7684\u8026\u5408\u5173\u7cfb\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u67b6\u6784\u56fe","text":"\u6574\u4f53\u7684\u6846\u67b6\u8bbe\u8ba1\u5728\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u300b\u6587\u6863\u91cc\u9762\u5df2\u7ecf\u6709\u8be6\u7ec6\u63cf\u8ff0\u4e86\uff0c\u8fd9\u91cc\u8d34\u4e00\u4e0b\u6574\u4f53\u7684\u67b6\u6784\u56fe\uff1a \u4e3a\u4e86\u7a81\u663e\u672c\u6587\u7684\u91cd\u70b9\uff0c\u62bd\u53d6\u5176\u4e2d\u91cd\u8981\u529f\u80fd\u6a21\u5757\uff0c\u5982\u4e0b\u56fe\uff1a "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-basic-frame # \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\n\u251c\u2500\u2500 apps # \u5e94\u7528\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-dde-file-manager # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\uff08\u5e94\u7528\u5e93\u8be6\u7ec6\u76ee\u5f55\u7ed3\u6784\u8bf7\u770b\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\uff09\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 tag # \u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u2514\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u2502 \u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 xxx.png\n\u2502 \u2502 ...\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-deepin-music # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 public # \u516c\u5171\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget # dde_dock \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget # dde_desktop \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 src # \u6838\u5fc3\u5e93\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 button_center.py\n\u2502 \u251c\u2500\u2500 cmdtrl.py\n\u2502 \u251c\u2500\u2500 dogtails.py\n\u2502 \u251c\u2500\u2500 find_image.py\n\u2502 \u251c\u2500\u2500 global_config.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 setting # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 config.py\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 global_config.ini\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\u6a21\u5757\uff08Hook\uff09\n\u251c\u2500\u2500 pytest.ini # Pytest \u9ed8\u8ba4\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 docs # \u6587\u6863\u76ee\u5f55\n\u2514\u2500\u2500 manage.py # \u6267\u884c\u5668\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1apps","title":"1\u3001\u5e94\u7528\u5e93\uff08apps\uff09","text":"\u6240\u6709\u5e94\u7528\u5e93\u5747\u653e\u7f6e\u5728\u57fa\u7840\u6846\u67b6\u4e0b\u7684 apps \u76ee\u5f55\u4e0b\uff08\u89c1\u7b2c\u4e8c\u7ae0\u8282\u7b2c3\u6bb5\u76ee\u5f55\u7ed3\u6784\u5185\u5bb9\uff09\u3002\u5e94\u7528\u5e93\u7684\u67b6\u6784\u8bbe\u8ba1\u53ef\u4ee5\u53c2\u8003\u300aAT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b\u6587\u6863\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2src","title":"2\u3001\u6838\u5fc3\u5e93\uff08src\uff09","text":"\u5728 src \u76ee\u5f55\u4e0b\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u5e95\u5c42\u6838\u5fc3\u7ec4\u4ef6\uff0c\u901a\u5e38\u6765\u8bb2\u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5230\u5176\u4e2d\u67d0\u4e00\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4e48\u4f60\u9700\u8981\u663e\u793a\u7684\u5bfc\u5165\u8fd9\u4e2a\u6a21\u5757\uff0c\u7136\u540e\u624d\u80fd\u4f7f\u7528\u8be5\u6a21\u5757\u4e0b\u7684\u529f\u80fd\uff0c\u5982\u679c\u4f60\u7528\u5230\u4e86\u5341\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4f60\u5c31\u9700\u8981\u5bfc\u5165\u5341\u4e2a\u3002\u4f46\u662f\u6211\u4eec\u60f3\u8ba9\u4e8b\u60c5\u53d8\u5f97\u7b80\u5355\uff0c\u4e00\u6b21\u5bfc\u5165\uff0c\u4f7f\u7528\u6240\u6709\u3002 \u5c06\u6240\u6709\u7684\u529f\u80fd\u6a21\u5757\u90fd\u8fdb\u5165\u5230 src \u7684\u540d\u79f0\u7a7a\u95f4\uff0c\u5728 src/__init__.py \u91cc\u9762\u6211\u4eec\u8bbe\u8ba1\u6210\u8fd9\u6837\uff1a # src/__init__.py\nfrom .cmdctl import CmdCtl\nfrom .dogtails import Dogtail\nfrom .find_image import FindImage\nfrom .button_center import ButtonCenter\nclass Src(CmdCtl, FindImage):\ndef __init__(self, **kwargs):\n\"\"\"dogtail or button center param\n :param kwargs: app_name, desc, number\n \"\"\"\nif kwargs:\napp_name = kwargs.get(\"APP_NAME\")\ndesc = kwargs.get(\"DESC\")\nif app_name is None or desc is None:\nraise ValueError\nnumber = kwargs.get(\"number\")\nnumber = number if isinstance(number, int) else -1\n# \u5bf9\u8c61\u7ec4\u5408\nself.dog = Dogtail(app_name, desc, number)\nself.ui = ButtonCenter(app_name, number)\n \u9700\u8981\u4f20\u9012\u53c2\u6570\u7684\u91c7\u7528\u5bf9\u8c61\u7ec4\u5408\uff0c\u6ca1\u6709\u53c2\u6570\u7684\u4f7f\u7528\u7ee7\u627f\uff0c\u7ee7\u627f\u7684\u7c7b\u7b26\u5408 Mixin \u8bbe\u8ba1\u6a21\u5f0f\u3002 \u5e94\u7528\u5e93\u91cc\u9762\u4f7f\u7528\u7684\u65f6\u5019\u5728 widget/base_widget.py \u91cc\u9762\u53ea\u9700\u8981\u552f\u4e00\u7ee7\u627f Src \uff1a # \u5e94\u7528\u5e93\u91cc\u9762\u65b9\u6cd5\u57fa\u7c7b\n# widget/base_widget.py\nfrom src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n \u8981\u4f7f\u7528\u6838\u5fc3\u5e93\u7684\u529f\u80fd\uff0c\u53ea\u9700\u8981\u5199\u4e00\u4e2a\u5bfc\u5165 from src import Src \u5373\u53ef\u3002 \u5199 __init__ \u6784\u9020\u51fd\u6570\u7684\u539f\u56e0\u662f\u901a\u8fc7\u53c2\u6570\u6784\u9020\u5e94\u7528\uff0c\u5e76\u4e14\u4f20\u9012 number \u8fdb\u6765\uff0c\u53ef\u4ee5\u5b9e\u73b0\u591a\u7a97\u53e3\u7684\u63a7\u5236\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3public","title":"3\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09","text":"\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6bcf\u4e2a\u5e94\u7528\u90fd\u662f\u4e00\u4e2a\u5355\u72ec\u7684 py \u6587\u4ef6\uff0c\u76f8\u4e92\u4e4b\u95f4\u662f\u72ec\u7acb\u7684\uff0c\u6bcf\u4e2a py \u6587\u4ef6\u91cc\u9762\u662f\u8be5\u5e94\u7528\u7684\u65b9\u6cd5\u7c7b\uff0c\u6bd4\u5982\uff1a\u6700\u5e38\u7528\u7684\u65b9\u6cd5\u7c7b dde_desktop_public_widget.py # dde_desktop_widget.py\nfrom src import Src\nclass _DdeDesktopPublicBaseWidget(Src):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-desktop\"\nDESC = \"/usr/bin/dde-desktop\"\ndef __init__(self):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC)\nclass DdeDesktopPublicWidget(_DdeDesktopPublicBaseWidget):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u7c7b\"\"\"\ndef click_music_dir_by_ui(self):\n\"\"\"\u5728\u6587\u4ef6\u9009\u62e9\u6846\u70b9\u51fb\u97f3\u4e50\u76ee\u5f55\"\"\"\nself.click(*self.ui.btn_center(\"\u4fa7\u8fb9\u680f-\u97f3\u4e50\")) \ndef click_xxx_by_attr(self):\npass\n \u516c\u5171\u65b9\u6cd5\u5e93\u610f\u4e49\uff1a \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6240\u5c01\u88c5\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\u90fd\u662f\u81f3\u5c11\u88ab2\u4e2a\u5e94\u7528\u90fd\u7528\u5230\u7684\uff0c\u8fd9\u6837\u505a\u53ef\u4ee5\u51cf\u5c11\u6574\u4f53\u4ee3\u7801\u91cf\uff0c\u4ece\u800c\u51cf\u8f7b\u5e94\u7528\u5e93\u4ee3\u7801\u7684\u7ef4\u62a4\u5de5\u4f5c\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u7f16\u5199\u5f62\u5f0f\uff08\u547d\u540d\u89c4\u5219\u3001\u5b9a\u4f4d\u7684\u65b9\u6848\u5199\u6cd5\u3001\u6ce8\u91ca\u7684\u5199\u6cd5\u7b49\u7b49\uff09\u5177\u6709\u4e00\u5b9a\u7684\u6a21\u677f\u4f5c\u7528\uff0c\u8fd9\u6837\u5373\u4f7f\u662f\u5404\u4e2a\u5e94\u7528\u5e93\u90fd\u72ec\u7acb\u7ef4\u62a4\uff0c\u6240\u6709\u7684\u7f16\u7801\u98ce\u683c\u90fd\u662f\u8d8b\u4e8e\u76f8\u540c\u7684\uff0c\u56e0\u4e3a\u5927\u5bb6\u90fd\u5e94\u8be5\u53c2\u7167\u516c\u5171\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u5199\u6cd5\u6765\u5199\u81ea\u5df1\u5e94\u7528\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\u7c7b\uff0c\u8fd9\u6837\u4f7f\u5f97\u4ece\u516c\u53f8\u7684\u89d2\u5ea6\u53bb\u770b\u6240\u6709\u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u90fd\u662f\u7edf\u4e00\u7684\u3002 \u53ef\u4ee5\u901a\u8fc7\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\uff0c\u4e86\u89e3\u5230\u5176\u4ed6\u5e94\u7528\u7684\u529f\u80fd\uff0c\u5bf9\u4e8e\u6211\u4eec\u9700\u6c42\u7406\u89e3\uff0c\u4e86\u89e3\u7cfb\u7edf\u7684\u65b9\u65b9\u9762\u9762\u4e5f\u6709\u597d\u5904\u3002 \u5f53\u7136\uff0c\u5982\u679c\u4f60\u7684\u5e94\u7528\u672c\u8eab\u662f\u5c5e\u4e8e\u6839\u672c\u5c31\u4e0d\u9700\u8981\u548c\u5176\u4ed6\u5e94\u7528\u4ea4\u4e92\u7684\uff0c\u90a3\u4e48\u4f60\u53ef\u80fd\u4e0d\u4f1a\u7528\u5230\u8fd9\u91cc\u9762\u7684\u529f\u80fd\uff0c\u6ca1\u5173\u7cfb\uff0c\u4f60\u6240\u6709\u7684\u65b9\u6cd5\u90fd\u53ef\u4ee5\u76f4\u63a5\u5199\u5728\u5e94\u7528\u5e93\u7684\u4e1a\u52a1\u5c42\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4conftestpy","title":"4\u3001conftest.py","text":"conftest.py \u4ece\u529f\u80fd\u4e0a\u5c06\u662f\u5c5e\u4e8e\u6838\u5fc3\u5e93\uff08src\uff09\u7684\u5185\u5bb9\uff0c\u4f46\u662f\u7531\u4e8e\u5b83\u7684\u7279\u6b8a\u6027\uff0c\u5373\u5b83\u662f\u5bf9\u5e94\u7528\u5e93\u4e2d\u7684\u7528\u4f8b\u751f\u6548\u7684\uff0c\u800c\u4e14\u5b83\u7684\u4f5c\u7528\u57df\u662f\u5f53\u524d\u76ee\u5f55\u53ca\u4ee5\u4e0b\uff0c\u56e0\u6b64\u6211\u4eec\u5c06\u5b83\u653e\u5230\u9879\u76ee\u6839\u76ee\u5f55\u3002\u6211\u4eec\u6846\u67b6\u4e2d\u6709\u4e0d\u5c11\u6838\u5fc3\u529f\u80fd\u90fd\u662f\u5728\u8fd9\u91cc\u9762\u8fdb\u884c\u5f00\u53d1\u7684\uff0c\u540e\u9762\u7b2c\u56db\u7ae0\u4f1a\u8bb2\u5230\u7ec6\u8282\u3002 pytest.ini \u4f5c\u7528\u548c conftest.py \u7c7b\u4f3c\uff0c\u662f Pytest \u6846\u67b6\u7684\u56fa\u5b9a\u914d\u7f6e\u6587\u4ef6\uff0c\u76ee\u524d\u914d\u7f6e\u4e86\u4e00\u4e9b\u901a\u7528\u7684\u547d\u4ee4\u884c\u6267\u884c\u53c2\u6570\uff0c\u4e5f\u653e\u5728\u9879\u76ee\u6839\u76ee\u5f55\u3002 \u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 Hook \u51fd\u6570\uff0capps \u76ee\u5f55\u4e0b\u7684 \u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 fixture \u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5setting","title":"5\u3001setting","text":"\u5168\u5c40\u914d\u7f6e\u6a21\u5757\uff0c\u5305\u542b\u4e86\u4ee5\u4e0b\u914d\u7f6e\u6587\u4ef6\uff1a \uff081\uff09ini \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u914d\u7f6e\u4e00\u4e9b\u5168\u5c40\u7684\u914d\u7f6e\u9879\uff0c\u8b6c\u5982\uff1a\u5931\u8d25\u91cd\u8dd1\u6b21\u6570\u3001\u662f\u5426\u5931\u8d25\u5f55\u5c4f\u3001\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\u3001\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4\u3001\u6267\u884c\u65f6\u65e5\u5fd7\u7ea7\u522b\u3001\u751f\u6210\u7684\u62a5\u544a\u7c7b\u578b\u3001\u4ee5\u53ca\u5206\u5e03\u5f0f\u6267\u884c\u7684\u4e00\u4e9b\u7b56\u7565\u914d\u7f6e\u9879\u7b49\u7b49\u3002 \uff082\uff09config.py \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u63d0\u4f9b\u914d\u7f6e\u6587\u4ef6\u8bfb\u53d6\u3001\u52a8\u6001\u83b7\u53d6\u4e00\u4e9b\u5e38\u91cf\uff08\u5982\u9879\u76ee\u6839\u76ee\u5f55\u7edd\u5bf9\u8def\u5f84 (BASE_DIR)\u3001\u7cfb\u7edf\u67b6\u6784\uff08SYS_FRAME\uff09\u3001\u65f6\u95f4\u5b57\u7b26\u4e32\uff08strftime\uff09\u3001\u672c\u673a USERNAME IP \u7b49\u7b49\uff09\u3001\u516c\u5171 URL \u7b49\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u89c4\u8303","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u7248\u672c\u53ca\u4f9d\u8d56","text":"\u57fa\u7840\u6846\u67b6\u4f1a\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u8fdb\u884c\u7248\u672c\u53d1\u5e03\uff0c\u4e0d\u4e0e\u67d0\u4e2a\u5e94\u7528\u7248\u672c\u7ed1\u5b9a\uff0c\u4f46\u662f\uff0c\u5e94\u7528\u5e93\u4f1a\u4f9d\u8d56\u4e8e\u57fa\u7840\u6846\u67b6\u7684\u7248\u672c\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u5efa\u8bae\u5728\u5e94\u7528\u5e93\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a\u6587\u672c\u6587\u4ef6\u7528\u4e8e\u8bb0\u5f55\u6240\u4f9d\u8d56\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\uff0c\u7c7b\u4f3c\u4e8e\u5f00\u53d1\u5e94\u7528\u7684 debian/control \u6587\u4ef6\u7684\u529f\u80fd\uff0c\u4e3a\u4e86\u4fdd\u6301\u7edf\u4e00\uff0c\u8fd9\u4e2a\u6587\u4ef6\u5c31\u547d\u540d\u4e3a control\uff0c\u653e\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u6838\u5fc3\u5e93\u72ec\u7acb\u6027","text":"\u6838\u5fc3\u5e93\u4e0d\u5efa\u8bae\u9488\u5bf9\u67d0\u4e00\u4e2a\u5e94\u7528\u5355\u72ec\u505a\u4ee3\u7801\u4e0a\u7279\u6b8a\u5904\u7406\uff0c\u901a\u5e38\u8003\u8651\u9488\u5bf9\u67d0\u4e00\u79cd\u573a\u666f\u8fdb\u884c\u5904\u7406\uff0c\u8fd9\u4e9b\u573a\u666f\u901a\u5e38\u662f\u5b58\u5728\u4e00\u4e9b\u5171\u6027\u7684\u3002\u6bd4\u5982\u8bf4\uff1a\u684c\u9762\u7684ID\u5206\u914d\u5b58\u5728\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u903b\u8f91\u5904\u7406\u89e3\u51b3ID\u5206\u914d\u9519\u8bef\u7684\u95ee\u9898\uff0c\u4f46\u662f\u8fd9\u90e8\u5206\u903b\u8f91\u6211\u4eec\u4f1a\u5728\u684c\u9762\u7684\u65b9\u6cd5\u5c42\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u517c\u5bb9\u6027","text":"\u4e3a\u4e86\u4fdd\u6301\u517c\u5bb9\u6027\uff0c\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u539f\u5219\u4e0a\u4e0d\u5bf9\u8001\u65b9\u6cd5\u8fdb\u884c\u4fee\u6539\u6216\u5220\u9664\uff0c\u53ea\u8fdb\u884c\u65b0\u589e\u3002\u6d89\u53ca\u5230\u8001\u65b9\u6cd5\u4fee\u6539\u6216\u5220\u9664\u7684\uff0c\u4f1a\u8fdb\u884c\u63d0\u524d\u9884\u544a\uff0c\u5e76\u5728\u7b2c\u4e8c\u4e2a\u7248\u672c\u4e4b\u540e\uff08\u4e2d\u95f4\u4f1a\u9694\u4e00\u4e2a\u7248\u672c\u8fc7\u5ea6\uff09\u6b63\u5f0f\u5b9e\u65bd\u4fee\u6539\u6216\u5220\u9664\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u547d\u540d\u89c4\u8303","text":" \u7528\u4f8b ID \u6bcf\u4e2a\u5e94\u7528\u81ea\u5df1\u7ef4\u62a4\u4e00\u5957 ID\uff0c\u5728PMS\u4e0a\u7528\u4f8b\u6807\u9898\u4e0a\u5c06\u81ea\u52a8\u5316ID\u4ee5\u6807\u7b7e\u7684\u5f62\u5f0f\u5199\u5165\uff0c\u6bd4\u5982\uff1a[101]\u6253\u5f00-\u542f\u52a8\u5e94\u7528\u540edock\u53f3\u952e\u83dc\u5355 \u4e00\u4e2a\u7528\u4f8b\u7c7b\u91cc\u9762\u6709\u591a\u4e2a\u7528\u4f8b\u65f6\uff0c\u5728\u7528\u4f8b\u540d\u79f0\u540e\u9762\u52a0\u5e8f\u53f7\u3002 class TestFileManager(BaseCase):\n\"\"\"\u6587\u7ba1\u7528\u4f8b\"\"\"\ndef test_xxx_015_1(self):\npass\ndef test_xxx_015_2(self):\npass\n \u6ce8\u610f 015_1\uff0c\u4e0d\u8981\u5199015_01\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 PMS \u4e0a\u7684\u7528\u4f8bID\uff1a PMS \u4e0a\u662f6\u4f4d\u6570\uff0c\u4e0d\u591f\u76f4\u89c2\uff0c\u4e5f\u4e0d\u597d\u7ef4\u62a4\uff0c\u5728\u81ea\u52a8\u5316\u4e0b\u9762\u53bb\u627e\u4e00\u4e2a\u5e26\u6709 6 \u4f4d\u6570\u7684\u6587\u4ef6\u662f\u4e00\u4e2a\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 PMS \u4e0a\u7684 ID \u53ef\u80fd\u4f1a\u53d1\u751f\u53d8\u5316\uff0c\u6bd4\u5982\u5bfc\u51fa\u6765\u5bfc\u8fdb\u53bb\u7684\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u5b58\u5728\u95ee\u9898\uff0c\u5982\u679c\u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u8981\u60f3\u627e\u51fa\u6765\u5bf9\u5e94\u4fee\u6539\u81ea\u52a8\u5316\u7528\u4f8b ID\uff0c\u5c06\u4f1a\u662f\u4ef6\u975e\u5e38\u75db\u82e6\u7684\u4e8b\u60c5\u3002 \u51fd\u6570\u547d\u540d\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5de6\u952e\u70b9\u51fb click \u53f3\u952e\u70b9\u51fb right_click \u53cc\u51fb double_click \u79fb\u52a8 move_to \u62d6\u52a8 drag \u65b0\u5efa new \u62d6\u52a8\u5230 drag_to \u4ece\u54ea\u91cc\u62d6\u52a8\u5230\u54ea\u91cc drag_something_from_xxx_to_xxx \u83b7\u53d6 get \u83b7\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5750\u6807 get_location \u975e\u7279\u6b8a\u6587\u4ef6 file word\u6587\u4ef6 doc text\u6587\u4ef6 text \u6587\u4ef6\u5939 dir \u5173\u952e\u8bcd\u6301\u7eed\u589e\u52a0 \u5e38\u91cf\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5e94\u7528\u540d\u79f0 APP_NAME \u5e94\u7528\u63cf\u8ff0 DESC \u672c\u5e94\u7528\u4ee5\u5916\u7684\u5176\u4ed6\u5e94\u7528\uff0c\u6bd4\u5982\u5e2e\u52a9 HELP \u5176\u4ed6\u540d\u79f0\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u65b9\u6cd5\u5305\u540d widget \u65b9\u6cd5\u6587\u4ef6\u540d\uff08\u6587\u7ba1\u4e3e\u4f8b\uff09 dfm_widget.pytitle_widget.pyright_view_widget.pyleft_view_widget.pypop_widget.pybase_widget.pydfm_assert.py \u65ad\u8a00\u8bed\u53e5\u547d\u540d\u89c4\u8303 \u65ad\u8a00\u8bed\u53e5\u90fd\u662f\u4ee5 assert \u5f00\u5934 \u65ad\u8a00 \u8bed\u53e5 \u5224\u65ad\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_existsassert_file_not_exists \u5224\u65ad\u684c\u9762\u76ee\u5f55\u4e0b\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_exists_in_desktopassert_file_not_exists_in_desktop \u5224\u65ad\u56fe\u7247\u5b58\u5728 assert_image_existsassert_image_not_exists \u5224\u65ad\u5f71\u9662\u4e2d\u662f\u5426\u5b58\u5728\u56fe\u7247 assert_image_exists_in_movieassert_image_not_exists_in_movie \u5224\u65ad\u5143\u7d20\u662f\u5426\u5b58\u5728 assert_element_existassert_element_not_exist \u5224\u65ad\u662f\u5426\u76f8\u7b49 assert_equalassert_not_equal \u5224\u65ad\u662f\u5426\u4e3a\u771f assert_trueassert_false"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5fixture","title":"5\u3001fixture \u89c4\u8303","text":"\u7531\u4e8e Pytest \u6846\u67b6\u4e2d\u652f\u6301 fixture \u7684\u5199\u6cd5\u548c Xunit \u5199\u6cd5\u7684\uff0c\u6240\u4ee5\u5e94\u7528\u5e93\u4e2d\u53ef\u80fd\u5b58\u5728\u6df7\u7528\u7684\u60c5\u51b5\uff0c\u4e3a\u7edf\u4e00\u7f16\u7801\u98ce\u683c\u65b9\u4fbf\u540e\u7eed\u7528\u4f8b\u4ee3\u7801\u7ef4\u62a4\uff0c\u73b0\u505a\u4ee5\u4e0b\u89c4\u8303\u8bf4\u660e\uff1a \u629b\u5f03 Xunit \u7684\u5199\u6cd5\uff0c\u7edf\u4e00\u91c7\u7528 Pytest fixture \u7684\u5199\u6cd5\u3002 \u5e94\u7528\u5185 fixture \u8c28\u614e\u4f7f\u7528 autouse=True \uff0c\u975e\u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u975e\u5e38\u4e0d\u5efa\u8bae\u4f7f\u7528\u8fd9\u4e2a\u53c2\u6570\u3002 \u8c03\u7528 fixture \u4e0d\u80fd\u4f7f\u7528 @pytest.mark.usefixture()\uff0c\u4f7f\u7528\u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u4f20\u5165\u51fd\u6570\u5bf9\u8c61\u3002 \u5efa\u8bae\u5728\u4e00\u4e2a conftest.py \u91cc\u9762\u53bb\u5199\uff0c\u4e00\u4e2a\u5e94\u7528\u4e5f\u5c3d\u91cf\u7ef4\u62a4\u4e00\u4e2a conftest.py\u6587\u4ef6\u3002 fixture \u4e5f\u9700\u8981\u5199\u529f\u80fd\u8bf4\u660e\uff0c\u51fd\u6570\u540d\u79f0\u8981\u6709\u5177\u4f53\u542b\u4e49\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#6","title":"6\u3001\u65b9\u6cd5\u7f16\u5199\u89c4\u8303","text":" \u65b9\u6cd5\u7c7b\u578b\uff1a if \u6ca1\u6709\u7528\u5230\u5b9e\u4f8b\u5bf9\u8c61\uff1a\nif \u6ca1\u6709\u7528\u5230\u7c7b\u5bf9\u8c61\uff1a\n\u5199\u9759\u6001\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @staticmethod\nelse\uff1a\n\u5199\u7c7b\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @classmethod\nelse:\n\u76f4\u63a5\u5199\u5b9e\u4f8b\u65b9\u6cd5\n \u4e3e\u4f8b: class TitleWidget:\ndef click_xxx_by_ui(self):\npass\n@staticmethod\ndef click_xxx_by_ui():\npass\n@classmethod\ndef click_xxx_by_ui(cls):\npass\n \u51fd\u6570\u540d\u79f0\u4e0d\u51fa\u73b0\u6570\u5b57\uff0c\u9700\u8981\u8868\u793a\u6570\u91cf\u7684\u7528\u5355\u8bcd\u8868\u793a\u3002 \u51fd\u6570\u529f\u80fd\u6ce8\u91ca\u3002 \u6ca1\u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg2:xxx\n\"\"\"\n \u6709\u53c2\u6570\uff0c\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg1:xxx\nreturn: xxx\n\"\"\"\n \u200b \u7528 Pycharm \u7684\u6ce8\u91ca\u6a21\u677f\u4e5f\u53ef\u4ee5\uff0c\u53ea\u8981\u4f53\u73b0\u4e86\u53c2\u6570\u7684\u7c7b\u578b\u548c\u8fd4\u56de\u5c31\u884c\u4e86\u3002 \u6682\u4e0d\u8981\u6c42\u5199\u7c7b\u578b\u6ce8\u89e3\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#7case","title":"7\u3001\u7528\u4f8b\uff08case\uff09\u89c4\u8303","text":" \u4ee5\u7c7b\u7684\u5f62\u5f0f\u5199\u7528\u4f8b\uff0c\u7528\u4f8b\u7c7b\u96c6\u6210\u7528\u4f8b\u57fa\u7c7b\u3002 \u7528\u4f8b\u7c7b\u9700\u8981\u5199\u6ce8\u91ca\u3002 \u6d4b\u8bd5\u7528\u4f8b\u51fd\u6570\u8bf4\u660e\uff08\u5efa\u8bae\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u540d\u79f0\uff09 \"\"\"\u53f3\u4fa7\u9884\u89c8-\u56fe\u7247\u7c7b\u578b\u4fe1\u606f\u680f\u57fa\u672c\u4fe1\u606f\"\"\"\n \u4e0d\u5199\u8c03\u8bd5\u4ee3\u7801 if __name__ == '__main__':\npytest.main()\n \u6240\u6709\u7528\u4f8b\u90fd\u7ee7\u627f BaseCase\u3002 BaseCase \u91cc\u9762\u653e\u4e00\u4e9b\u6d4b\u8bd5\u6570\u636e\u7684\u5e38\u91cf\uff0c\u6bd4\u5982\u6587\u4ef6\u540d\u79f0\uff0c\u5e94\u7528\u540d\u79f0\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u4e00\u4e9b\u901a\u7528\u7684\u5b57\u7b26\u4e32\u3002 \u8fd9\u7c7b\u662f\u5c5e\u4e8e\u6d4b\u8bd5\u6570\u636e\u3002 class BaseCase(DfmAssert):\n\"\"\"\u7528\u4f8b\u57fa\u7c7b\"\"\"\nNEW_FILE = \"\u65b0\u5efa\u6587\u672c.txt\"\nTEST_FILE = \"test.txt\"\nNEW_DIR = \"\u65b0\u5efa\u6587\u4ef6\u5939\"\nNEW_WORD = \"\u65b0\u5efaWord\u6587\u6863.doc\"\nAPP_HELP = \"damn\"\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\n\"\"\"\u7528\u4f8b\u6807\u9898\uff08\u590d\u5236PMS\u4e0a\u7528\u4f8b\u6807\u9898\uff09\"\"\"\ndfm = DfmWidget()\ndfm.click_xxx_by_attr(self.NEW_FILE)\ndfm.new_file_in_desktop_by_cmd(self.NEW_FILE)\nself.assert_true(dfm.get_process_status(self.APP_NAME))\n \u7528\u4f8b\u91cc\u9762\u5c3d\u91cf\u51cf\u5c11\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\uff0c\u66f4\u8981\u51cf\u5c11\u76f8\u540c\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\u3002 \u7edf\u4e00\u6587\u4ef6\u6ce8\u91ca\u5934\u3002 #!/usr/bin/env python3\n# _*_ coding:utf-8 _*_\n\"\"\"\n:Author:email@uniontech.com\n:Date :${DATE} ${TIME}\n\"\"\"\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#8","title":"8\u3001\u5176\u4ed6\u89c4\u8303","text":" \u65e5\u5fd7\u6253\u5370\u8981\u5728\u65b9\u6cd5\u6700\u524d\u9762\uff0c\u5426\u5219\u4ee3\u7801\u62a5\u9519\u6ca1\u6709\u65e5\u5fd7\u8f93\u51fa\uff0c\u4e0d\u597d\u5b9a\u4f4d\u95ee\u9898\u3002\uff08\u6211\u4eec\u4f1a\u8003\u8651\u7ee7\u7eed\u4f7f\u7528\u62e6\u622a\u5668\u6253\u5370\u65e5\u5fd7\uff09 \u6240\u6709\u7684\u64cd\u4f5c\u90fd\u9700\u8981\u6709\u65e5\u5fd7\uff0c\u5305\u62ec sleep()\uff0c\u6211\u4eec\u4f1a\u91cd\u5199\u4e00\u4e2a\u6709\u65e5\u5fd7\u8f93\u5165\u7684 sleep\u3002 \u4e1a\u52a1\u5c42\u65e5\u5fd7\u7ea7\u522b\u4e3a INFO\u3002 hook \u51fd\u6570\u53ea\u80fd\u5199\u5230\u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u91cc\u9762\u3002 apps \u76ee\u5f55\u4e0b\u7684 conftest.py \u539f\u5219\u4e0a\u4e0d\u4f1a\u65b0\u589e fixture\u3002 \u56fa\u5b9a\u76ee\u5f55\u6216\u5143\u7d20\u63a7\u4ef6\u7684\u64cd\u4f5c\uff0c\u5c06\u64cd\u4f5c\u65b9\u6cd5\u5199\u6b7b\uff0c\u6587\u4ef6\u7c7b\u64cd\u4f5c\u5c06\u6587\u4ef6\u540d\u7559\u53c2\u6570\u3002 \u8def\u5f84\u62fc\u63a5\u89c4\u8303\uff1a \u7cfb\u7edf\u4e2d\u56fa\u5b9a\u76ee\u5f55\uff0c\u8def\u5f84\u62fc\u63a5\u65f6\u4f7f\u7528\u6ce2\u6d6a\u7b26\u53f7\uff0c\u6bd4\u5982\uff1a~/Desktop/\uff0c\u4e0b\u5c42\u4f7f\u7528 os.path.expanduser()\uff0c\u5b83\u53ef\u4ee5\u81ea\u52a8\u8bc6\u522b\u6ce2\u6d6a\u7b26\u53f7\u3002 \u9879\u76ee\u4e0b\u8def\u5f84\u4f7f\u7528\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u8def\u5f84\uff0c\u6bd4\u5982\uff1aConfig.BASE_PATH\uff0c\u56e0\u4e3a\u9879\u76ee\u662f\u53ef\u4ee5\u5728\u4efb\u610f\u8def\u5f84\u8fd0\u884c\u7684\uff0c\u9700\u8981\u52a8\u6001\u62fc\u63a5\u8def\u5f84\u3002 "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848","text":"# =================================================\n# Author : Mikigo\n# Time : 2022/3/16\n# version \uff1a1.0\n# =================================================\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"AT \u5e94\u7528\u5e93\u6539\u9020\u662f\u57fa\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u8fdb\u884c\u7528\u4f8b\u65b9\u6cd5\u548c\u4e1a\u52a1\u903b\u8f91\u7684\u91cd\u65b0\u8bbe\u8ba1\uff0c\u4ee5\u5b9e\u73b0\u5e94\u7528\u5e93\u9ad8\u6548\u7684\u7f16\u5199\u3001\u7ef4\u62a4\u7528\u4f8b\u53ca\u5176\u65b9\u6cd5\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u6587\u4ef6\u7ba1\u7406\u5668\u4ece\u4e1a\u52a1\u590d\u6742\u5ea6\u548c\u7528\u4f8b\u91cf\u6765\u8bb2\uff0c\u5728\u7cfb\u7edf\u6240\u6709\u5e94\u7528\u4e2d\uff0c\u662f\u5f88\u6709\u4ee3\u8868\u6027\u7684\uff0c\u96be\u5ea6\u4e5f\u662f\u6700\u5927\u7684\uff0c\u56e0\u6b64\u6211\u4eec\u9009\u53d6\u6587\u4ef6\u7ba1\u7406\u5668\u4f5c\u4e3a\u5e94\u7528\u5e93\u6539\u9020\u7684\u5b9e\u9a8c\u5e94\u7528\uff0c\u7ed9\u540e\u7eed\u5176\u4ed6\u5e94\u7528\u6539\u9020\u63d0\u4f9b\u5207\u5b9e\u53ef\u884c\u7684\u601d\u8def\u548c\u65b9\u6848\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u5206\u5c42\u8bbe\u8ba1\u56fe","text":"\u6574\u4f53\u4ecd\u7136\u9075\u5faa PO \u8bbe\u8ba1\u7406\u5ff5\uff0c\u6839\u636e\u4e1a\u52a1\u9700\u8981\uff0c\u5c06\u6587\u7ba1\u4e1a\u52a1\u5c42\u8fdb\u884c 3 \u5c42\u5212\u5206\uff1a "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-dde-file-manager # \u5e94\u7528\u4ed3\u5e93\n\u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 test_xxx_001.py\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u00a0\u251c\u2500\u2500 __init__.py\n\u2502 \u00a0\u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u00a0\u251c\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u00a0\u251c\u2500\u2500 base_widget.py # \u65b9\u6cd5\u57fa\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 title_widget.py # title \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 right_view_widget.py # right view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 left_view_widget.py # left view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 pop_widget.py # pop \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 dfm_widget.py # \u65b9\u6cd5\u7684\u7edf\u4e00\u51fa\u53e3\n\u2502 \u00a0\u2514\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 tag # \u7528\u4f8b\u6807\u7b7e\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 xxx.csv # \u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2514\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u57fa\u7c7b","text":" \u7ee7\u627f\u6838\u5fc3\u5c42\u7684\u5404\u4e2a\u6a21\u5757\u7c7b\u3002 \u62bd\u53d6\u64cd\u4f5c\u5c42\u7684\u4e00\u4e9b\u57fa\u7840\u65b9\u6cd5\u3002 \u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u7684\u4e00\u4e9b\u516c\u5171\u65b9\u6cd5\u3002 \u8def\u5f84\u7ec4\u88c5\u65b9\u6cd5\u3002 \u4e00\u4e9b\u4e1a\u52a1\u5c42\u76f8\u5173\u7684\u53d8\u91cf\u3001\u5e38\u91cf\u3001shell\u547d\u4ee4\u3001\u5750\u6807\u3002 \u65b9\u6cd5\u57fa\u7c7b\u7684\u5199\u6cd5\uff1a from src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u64cd\u4f5c\u5c42","text":" \u6a21\u5757\u5212\u5206 \u6309\u7167\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u6587\u7ba1\u4e3b\u754c\u9762\u5206\u4e3a\u4e09\u4e2a\u533a\u57df\uff1a\u6807\u9898\u680f\u3001\u53f3\u8fb9\u89c6\u56fe\u533a\u57df\u3001\u5de6\u8fb9\u89c6\u56fe\u533a\u57df \u5f39\u7a97\uff1a\u8bbe\u7f6e\u754c\u9762\u5f39\u7a97\u3001\u4fdd\u9669\u7bb1\u5f39\u7a97\u3001\u5220\u9664\u786e\u8ba4\u5f39\u7a97\u3001\u53ca\u5404\u79cd\u7f51\u7edc\u5f39\u7a97 \u53f3\u952e\u83dc\u5355\uff1a\u6682\u65f6\u4e0d\u8003\u8651\u4e3a\u5355\u72ec\u7684\u6a21\u5757\uff0c\u8003\u8651\u4ee5\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6848\u505a\u6210\u516c\u5171\u5e93\u3002 \u5404\u4e2a\u6a21\u5757\u53ea\u7ee7\u627f\u57fa\u7c7b from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u6784\u9020\u51fd\u6570\u91cc\u9762\u4e0d\u6784\u9020\u5bf9\u8c61\uff0c\u53ef\u4ee5\u521d\u59cb\u5316\u4e00\u4e9b\u53d8\u91cf\u3002 \u4e0d\u540c\u7684\u5b9a\u4f4d\u65b9\u6848\u8c03\u7528\u4e0d\u540c\u7684\u5b9a\u4f4d\u5de5\u5177\u5bf9\u8c61\u3002 self.dog\nself.ui\nself.d_bus\n \u65b9\u6cd5\u7f16\u5199 \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u5e94\u7528\u5c42","text":" \u7ee7\u627f\u64cd\u4f5c\u5c42\u7684\u6240\u6709\u7c7b\u3002 \u4ec5\u4ec5\u7528\u4e8e\u7528\u4f8b\u4e2d\u5bfc\u5165\u65b9\u4fbf\uff0c\u4e0d\u505a\u5176\u4ed6\u4e8b\u60c5\u3002 class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n DfmAssert \u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u7ee7\u627f\uff0c\u65b9\u4fbf\u4f7f\u7528\u65ad\u8a00\u8bed\u53e5\u3002 from apps.dde_file_manager.widget.dfm_widget import DfmWidget\nfrom public.assert import Assert\nclass DfmAssert(Assert):\ndef assert_file_exists_in_desktop(self, file_name):\nself.assert_file_exists(f\"~/Desktop{file_name}\")\n...\nDfmWidget().get_file_in_desktop()\n \u7528\u4f8b\u91cc\u9762\u76f4\u63a5\u7ee7\u627f\uff0c\u65b9\u4fbf\u5728\u7528\u4f8b\u91cc\u9762\u4f7f\u7528 self \u8fdb\u884c\u65ad\u8a00\uff0c\u66f4\u7b26\u5408\u65ad\u8a00\u7684\u4f7f\u7528\u4e60\u60ef\uff0c\u7528\u4f8b\u903b\u8f91\u4e0a\u66f4\u6e05\u695a\u3002 class BaseCase(DfmAssert):\npass\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\nself.assert_file_exists_in_desktop(\"xxx\")\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u903b\u8f91\u4e3e\u4f8b","text":"\u7528\u4f8b\u4ee3\u7801\u8c03\u7528\u903b\u8f91\u4e3e\u4f8b\uff1a # BaseWidget\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n# =============================================\n# TitleWidget\nclass TitleWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_title_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# RightViewWidget\nclass RightViewWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_right_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# =============================================\n# \u51fa\u53e3 DfmWidget\nclass DfmWidget(TitleWidget, RightViewWidget):\npass\n# =============================================\n# in case\nfrom apps.dde_file_manager.widget.dfm_widget import DfmWidget\ndfm = DfmWidget()\ndfm.click_xxx_title_by_ui()\ndfm.click_xxx_right_by_ui()\ndfm.dog.print_desc()\ndfm.ui.print_number()\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u5de5\u7a0b\u6539\u9020\u5b9e\u65bd\u6b65\u9aa4","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_2","title":"1\u3001\u5de5\u7a0b\u4ee3\u7801\u62c9\u53d6","text":"1.1. \u5c06\u81ea\u52a8\u5316\u57fa\u7840\u6846\u67b6\u7684\u529f\u80fd\u62c9\u5230\u672c\u5730 Autotest Basic Frame \uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame 1.2. \u5c06\u5e94\u7528\u5e93\u4ee3\u7801\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u5e94\u7528\u5e93\u7684\u4ed3\u5e93\u547d\u540d\u5e94\u8be5\u662f\u957f\u8fd9\u6837\u7684 autotest_deepin_xxx\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_2","title":"2\u3001\u8c03\u6574\u5de5\u7a0b\u76ee\u5f55","text":"\u6309\u7167 \u65b9\u6848\u8bbe\u8ba1-\u76ee\u5f55\u7ed3\u6784 \u8fdb\u884c\u76ee\u5f55\u8c03\u6574\uff0c\u5c3d\u91cf\u4f7f\u7528\u7f16\u8f91\u5668\u8fdb\u884c\u76f8\u5e94\u7684\u8c03\u6574\uff0c\u7f16\u8f91\u5668\u63a8\u8350\u4f7f\u7528 Pycharm \uff0c\u4ee5\u4e0b\u64cd\u4f5c\u5747\u5728 Pycharm \u91cc\u9762\u53ef\u5b9e\u73b0\u3002 2.1. \u9700\u8981\u79fb\u52a8 py \u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u76f4\u63a5\u5728\u7f16\u8f91\u5668\u91cc\u9762\uff0c\u4f7f\u7528\u9f20\u6807\u9009\u4e2d\u5e76\u6309\u4f4f\uff0c\u4e4b\u540e\u62d6\u52a8\u5230\u76ee\u6807\u4f4d\u7f6e\u5373\u53ef\uff0cPycharm \u4f1a\u5c3d\u53ef\u80fd\u7684\u81ea\u52a8\u89e3\u51b3\u79fb\u52a8\u5bfc\u81f4\u7684\u8def\u5f84\u95ee\u9898\u3002\u6ce8\u610f\uff0c\u6211\u8bf4\u7684\u662f\u201c\u5c3d\u53ef\u80fd\u201d\uff0c\u6709\u4e9b\u9a9a\u64cd\u4f5c\u7f16\u8f91\u5668\u662f\u65e0\u6cd5\u81ea\u52a8\u5904\u7406\u7684\u3002\u5982\u679c\u6ca1\u6709\u88ab\u7f16\u8f91\u5668\u81ea\u52a8\u5904\u7406\u7684\u8def\u5f84\u95ee\u9898\uff0c\u540e\u7eed\u53ea\u80fd\u624b\u52a8\u89e3\u51b3\u3002 2.2. \u9700\u8981\u91cd\u547d\u540d\u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u5728\u7f16\u8f91\u5668\u91cc\u9762\u9009\u4e2d\u6587\u4ef6\uff0c\u7136\u540e\u4f7f\u7528\u5feb\u6377\u952e Shift + F6 \uff08\u5982\u679c\u5feb\u6377\u952e\u6ca1\u53cd\u5e94\uff0c\u6587\u4ef6\u53f3\u952e\u83dc\u5355 Refactor \u2014\u2014 Rename\uff09\uff0c\u7136\u540e\u5728\u8f93\u5165\u6846\u4e2d\u8f93\u5165\u8981\u91cd\u547d\u540d\u7684\u540d\u79f0\uff0c\u540c\u65f6\uff0c\u786e\u8ba4\u52fe\u9009 Search for references \u548c Search in comments and strings \u8fd9\u4e24\u4e2a\u9009\u9879\uff0c\u6700\u540e\u6309\u56de\u8f66\u6216\u8005\u9f20\u6807\u70b9 Refactor \u3002 \u6ce8\u610f\uff0c\u6b64\u65f6\u7f16\u8f91\u5668\u53ef\u80fd\u4f1a\u63d0\u793a\u4f60\uff0c\u4f60\u8fd9\u4e2a\u91cd\u547d\u540d\u7684\u64cd\u4f5c\u5173\u8054\u4e86\u591a\u4e2a\u6a21\u5757\uff0c\u5b83\u88ab\u591a\u4e2a\u5730\u65b9\u90fd\u4f7f\u7528\u5230\u4e86\uff0c\u76f8\u5173\u7684\u6a21\u5757\u662f\u5426\u4e5f\u4e00\u8d77\u6539\u540d\u4e86\uff0c\u8fd9\u4e0d\u5e9f\u8bdd\u5417\uff0c\u7528\u8fd9\u4e2a\u529f\u80fd\u5c31\u662f\u60f3\u628a\u5173\u8054\u5230\u7684\u90fd\u4fee\u6539\uff0c\u4e0d\u7136\u6211\u4e3a\u4ec0\u4e48\u4e0d\u7528\u6587\u7ba1\u7684\u91cd\u547d\u540d\u529f\u80fd\u5462\uff0c\u522b\u60f3\u4e86\uff0c\u76f4\u63a5\u70b9\u5de6\u4e0b\u89d2\u7684 Refactor \u6309\u94ae\uff0c\u5c31\u662f\u5e72\u3002 \u7c7b\u540d\u3001\u51fd\u6570\u540d\u7684\u91cd\u547d\u540d\u90fd\u5c3d\u91cf\u91c7\u7528\u8fd9\u79cd\u65b9\u6848\uff0c\u56e0\u4e3a\u7f16\u8f91\u5668\u4f1a\u81ea\u52a8\u7ed9\u6211\u4eec\u627e\u5230\u5173\u8054\u7684\u5730\u65b9\uff0c\u7136\u540e\u540c\u6b65\u4fee\u6539\u6389\u3002\u4f60\u53ef\u5343\u4e07\u522b\u76f4\u63a5\u5220\u4e86\u4fee\u6539\u540d\u79f0\uff0c\u4e0d\u7136\u4f60\u53ef\u80fd\u4f1a\u82b1\u4e0a\u4e00\u5929\u7684\u65f6\u95f4\u6765\u89e3\u51b3\u91cd\u547d\u540d\u7684\u95ee\u9898\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u5b9e\u73b0\u6838\u5fc3\u5e93\u63a5\u53e3","text":"3.1. BaseWidget \u5728 BaseWidget \u91cc\u9762\u628a\u8be5\u5199\u7684\u90fd\u5199\u597d\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u4e0a\u9762\u7684\u8bbe\u8ba1\u7406\u5ff5\u6765\u5199\u3002 \u5982\u679c\u4f60\u5acc\u9ebb\u70e6\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u6587\u7ba1\u7684\u5b9e\u9645\u5de5\u7a0b\u4ee3\u7801 autotest_dde_file_manager : https://gerrit.uniontech.com/admin/repos/autotest_dde_file_manager \u3002 3.2. \u64cd\u4f5c\u5c42 \u5982\u679c\u4f60\u662f\u65b0\u5199\u9879\u76ee\uff0c\u4f60\u4f1a\u53d1\u73b0\u4e00\u5207\u90fd\u662f\u90a3\u4e48\u7684\u7b80\u5355\u3001\u76f4\u63a5\uff0c\u6309\u7167\u6211\u4eec\u63d0\u4f9b\u7ed9\u4f60\u7684\u63a5\u53e3\u5199\u7528\u4f8b\u7684\u64cd\u4f5c\u65b9\u6cd5\u5c31\u597d\u4e86\u3002 \u5982\u679c\u4f60\u662f\u60f3\u5bf9\u539f\u6765\u7684\u5de5\u7a0b\u8fdb\u884c\u6539\u9020\uff0c\u4f60\u9700\u8981\u6309\u7167\u6838\u5fc3\u5e93\u65b9\u6cd5\u7684\u8c03\u7528\uff0c\u5c06\u4f60\u4e4b\u524d\u5199\u7684\u6bcf\u4e2a\u65b9\u6848\u8fdb\u884c\u5bf9\u5e94\u7684\u4fee\u6539\uff0c\u5305\u62ec\u7c7b\u548c\u65b9\u6cd5\u7684\u547d\u540d\u3001\u65b9\u6cd5\u5185\u6240\u8981\u7528\u5230\u4e0d\u540c\u5b9a\u4f4d\u65b9\u6cd5\u7684\u5199\u6cd5\u4fee\u6539\u3002 \u8fd9\u65f6\u5019\u4f60\u53ef\u80fd\u4f60\u7684\u4ee3\u7801\u4e2d\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u62a5\u9519\uff0c\u4e0d\u7528\u62c5\u5fc3\uff0c\u4f60\u53ef\u4ee5\u4ece\u4e1a\u52a1\u903b\u8f91\u51fa\u53d1\uff0c\u60f3\u6e05\u695a\u8fd9\u4e2a\u65b9\u6cd5\u662f\u5e72\u4ec0\u4e48\u7684\u3001\u64cd\u4f5c\u7684\u5bf9\u8c61\u662f\u4ec0\u4e48\u3001\u53c2\u6570\u662f\u4ec0\u4e48\uff0c\u6ce8\u610f\u8fd9\u4e9b\u4fee\u6539\u662f\u4f1a\u5f71\u54cd\u5230\u7528\u4f8b\u4ee3\u7801\u91cc\u9762\u7684\uff0c\u6ca1\u5173\u7cfb\uff0c\u7528\u4f8b\u91cc\u9762\u672c\u6765\u4e5f\u5e94\u8be5\u88ab\u5173\u8054\u4fee\u6539\u3002 3.3. \u628a\u914d\u7f6e\u6a21\u5757\u5199\u597d\uff0c\u8fd9\u90e8\u5206\u57fa\u672c\u53ef\u4ee5\u590d\u5236\u6587\u7ba1\u7684\u4ee3\u7801\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4_1","title":"4\u3001\u8def\u5f84\u5904\u7406","text":"4.1. \u5bfc\u5165\u8def\u5f84 \u65b9\u6cd5\u548c\u7528\u4f8b\u4e2d\u90fd\u4f1a\u6d89\u53ca\u5230\u5bfc\u5165\u8def\u5f84\u7684\u4fee\u6539\uff0c\u5728\u4fee\u6539\u8def\u5f84\u65f6\uff0c\u5efa\u8bae\u4f60\u4f7f\u7528 Ctrl + Shift + R \u5168\u5c40\u66ff\u6362\uff0c\u4f1a\u5c06\u6574\u4e2a\u9879\u76ee\u4e0b\u7684\u76f8\u540c\u5730\u65b9\u90fd\u4fee\u6539\u5230\uff0c\u5f53\u7136\uff0c\u4f60\u4e5f\u53ef\u4ee5\u5728\u5c0f\u5f39\u7a97\u4e2d\u4fee\u6539\u5168\u5c40\u66ff\u6362\u4e3a\u5c40\u90e8\u76ee\u5f55\u4e0b\u66ff\u6362\u3002\u5904\u7406\u90a3\u79cd\u6ca1\u6709\u5173\u8054\u5173\u7cfb\uff0c\u4f46\u662f\u53c8\u662f\u76f8\u540c\u540d\u79f0\u7684\u91cd\u547d\u540d\uff0c\u6211\u4e5f\u63a8\u8350\u4f7f\u7528\u8fd9\u79cd\u65b9\u5f0f\u8fdb\u884c\u91cd\u547d\u540d\u3002 \u6ce8\u610f\uff0c\u5168\u5c40\u66ff\u6362\u7684\u65b9\u5f0f\u4efb\u7136\u65e0\u6cd5\u4fdd\u8bc1\u771f\u7684\u5168\u5c40\u88ab\u66ff\u6362\u4e86\uff08\u53ef\u80fd\u662f\u7f16\u8f91\u5668\u7684 Bug \u5427\uff09\uff0c\u6240\u4ee5\u4f60\u4ecd\u7136\u9700\u8981\u624b\u52a8\u770b\u4e0b\u5404\u5904\u662f\u5426\u4fee\u6539\u5230\u4f4d\u3002 4.2. \u8d44\u6e90\u8def\u5f84 \u4e00\u4e9b\u7528\u4f8b\u8d44\u6e90\u9700\u8981\u6839\u636e config.py \u91cc\u9762\u7684\u8def\u5f84\u914d\u7f6e\u8fdb\u884c\u8d44\u6e90\u8def\u5f84\u7684\u62fc\u63a5\uff0c\u5982\u679c\u4f60\u539f\u6765\u672c\u6765\u5c31\u6709\u4e00\u4e2a\u51fd\u6570\u4e13\u95e8\u7528\u4e8e\u7ec4\u88c5\u8def\u5f84\u7684\uff0c\u90a3\u4f60\u53ea\u9700\u8981\u4fee\u6539\u8fd9\u4e00\u4e2a\u5730\u65b9\u5c31\u597d\u4e86\uff0c\u5982\u679c\u4f60\u4e4b\u524d\u5e76\u6ca1\u6709\u8fd9\u6837\u7684\u8bbe\u8ba1\uff0c\u90a3\u53ef\u80fd\u9700\u8981\u4fee\u6539\u5927\u91cf\u6d89\u53ca\u5230\u8d44\u6e90\u8def\u5f84\u7684\u5730\u65b9\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5","title":"5\u3001\u8c03\u8bd5\u548c\u7f16\u5199\u7528\u4f8b","text":"\u4ee5\u4e0a\u51e0\u4e2a\u6b65\u9aa4\u505a\u5b8c\uff0c\u57fa\u672c\u5c31\u53ef\u4ee5\u8fdb\u884c\u7528\u4f8b\u4ee3\u7801\u7684\u8c03\u8bd5\u4e86\uff0c\u8fd9\u90e8\u5206\u5de5\u4f5c\u4e3b\u8981\u89e3\u51b3\u4f60\u4e4b\u524d\u51e0\u4e2a\u6b65\u9aa4\u9057\u6f0f\u7684\u95ee\u9898\uff0c\u5982\u679c\u6240\u6709\u7528\u4f8b\u90fd\u8c03\u8bd5\u901a\u8fc7\u4e86\uff0c\u90a3\u4e48\u5de5\u7a0b\u6539\u9020\u5c31\u5168\u90e8\u5b8c\u6210\u4e86\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/","title":"AT \u5f00\u53d1\u89c4\u8303","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u5f00\u53d1\u89c4\u8303\u662f\u6839\u636e\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fd0\u884c\u4e24\u5e74\u591a\u6765\uff0c\u9047\u5230\u95ee\u9898\u89e3\u51b3\u95ee\u9898\u800c\u5f62\u6210\u7684\u4e00\u4e9b\u89e3\u51b3\u65b9\u6848\uff0c\u6216\u8005\u8bf4\u7ecf\u9a8c\u603b\u7ed3\uff1b\u8fd9\u4e9b\u7ecf\u9a8c\u7b26\u5408\u6211\u4eec\u73b0\u9636\u6bb5 AT \u6240\u5e94\u7528\u7684\u573a\u666f\u9700\u8981\uff0c\u4e5f\u662f\u6211\u4eec\u7ecf\u8fc7\u957f\u671f\u601d\u8003\uff0c\u4e0d\u65ad\u8bd5\u9519\u4e0d\u65ad\u4fee\u6b63\uff0c\u5e76\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u5b9e\u8df5\u4e2d\u68c0\u9a8c\u8fc7\u53ef\u884c\u7684\u3002\u4ee5\u6b64\uff0c\u5e0c\u671b\u80fd\u5e2e\u52a9\u53c2\u4e0e\u5230\u81ea\u52a8\u5316\u7684\u76f8\u5173\u4eba\u5458\u51cf\u5c11\u8bd5\u9519\u6210\u672c\uff0c\u66f4\u597d\u3001\u66f4\u5feb\u7684\u7f16\u5199\u7528\u4f8b\u53ca\u7ef4\u62a4\u7528\u4f8b\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_1","title":"\u4e00\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u89c4\u8303","text":"\u6807\u7b7e\u5316\u7ba1\u7406\u6587\u6863\u8bf7\u53c2\u8003\uff1a \u300a\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u64cd\u4f5c\u6307\u5f15\u300b \u4ee5\u4e0b\u8bf4\u51e0\u4e2a\u5bb9\u6613\u51fa\u73b0\u7684\u95ee\u9898\uff1a"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1","title":"1. \u5bf9\u5e94\u5173\u7cfb","text":" \u5199\u5b8c\u81ea\u52a8\u5316\u7528\u4f8b\u4e4b\u540e\uff0c\u8bf7\u5728 CSV \u6587\u4ef6\u4e2d\u6807\u8bb0\u7528\u4f8b\u7684 ID\u3001\u7b49\u7ea7\u3002\u4e3a\u4e86\u63d0\u9192\u6807\u8bb0\uff0c\u6267\u884c\u7528\u4f8b\u65f6\u5728\u9996\u884c\u4f1a\u8f93\u51fa ERROR \u65e5\u5fd7\uff1a CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94\u7684 ID\uff1b \u5728\u6700\u7ec8\u63d0\u4ea4\u4ee3\u7801\u4e4b\u524d\uff0c\u4f60\u9700\u8981\u5728 CSV \u6587\u4ef6\u91cc\u9762\u5c06ID\u3001\u7528\u4f8b\u7b49\u7ea7\u7b49\u6807\u7b7e\u8865\u5168\uff0c\u5982\u679c CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94 ID\uff0c\u540e\u7eed\u5728\u6279\u91cf\u6267\u884c\u7684\u65f6\u5019\uff0c\u8fd9\u4e9b\u7528\u4f8b\u662f\u4e0d\u4f1a\u6267\u884c\u7684\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2","title":"2. \u540d\u79f0\u4e00\u81f4","text":" CSV \u6587\u4ef6\u7684\u6587\u4ef6\u540d\u3001\u7528\u4f8b\u51fd\u6570\u4e2d\u95f4\u7684\u540d\u79f0\u4e00\u81f4\u3001\u7528\u4f8b py \u6587\u4ef6\u4e2d\u95f4\u7684\u540d\u79f0\uff0c\u8fd9\u4e09\u4e2a\u540d\u79f0\u4e00\u81f4\u3002 \u4e3e\u4f8b\uff1a # test_music_001.py\ndef test_music_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u90a3\u4e48 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e3a music.csv\u3002 AT \u6846\u67b6\u5e95\u5c42\u4ee3\u7801\u5b9e\u73b0\u662f\u5c06 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e0e\u7528\u4f8b\u51fd\u6570\u540d\u79f0\u540d\u79f0\uff08item.name\uff09\u8fdb\u884c\u5bf9\u5e94\uff0c\u56e0\u6b64\uff0c\u6ce8\u610f CSV \u6587\u4ef6\u540d\u79f0\u5bf9\u5e94\u7684\u662f\u7528\u4f8b\u51fd\u6570\u540d\u79f0\uff0c\u5373 def test_music_001 \u91cc\u9762\u7684 music \uff0c\u800c\u4e0d\u662f test_music_001.py \u91cc\u9762\u7684 music \u3002 \u8fd9\u91cc\u7ec6\u7ec6\u54c1\u4e00\u4e0b\u54c8~ \u5982\u679c\u4f60\u5c06\u4e0a\u4f8b\u5199\u6210\u4e86\u8fd9\u6837: # test_music_001.py\ndef test_movie_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u7528\u4f8b\u6267\u884c\u6ca1\u95ee\u9898\uff0c\u4f46\u662f\u6807\u7b7e\u5316\u7ba1\u7406\u662f\u4e0d\u751f\u6548\u7684\uff0c\u6846\u67b6\u65e0\u6cd5\u5c06 music.csv\u6587\u4ef6\u91cc\u9762\u6807\u7b7e\uff0c\u6dfb\u52a0\u5230 test_movie_001\u8fd9\u4e2a\u7528\u4f8b\u4e2d\uff0c\u56e0\u4e3a\u4ed6\u4eec\u6ca1\u6709\u5bf9\u5e94\u5173\u7cfb\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#tag","title":"\u4e8c\u3001\u5206\u652f\u53ca tag \u7ba1\u7406\u89c4\u8303","text":"\u53c2\u8003\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u4ee3\u7801\u7ba1\u7406\u89c4\u8303\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2-tag","title":"2. \u5e94\u7528\u5e93 tag","text":" \u5e94\u7528\u5e93 tag \u6839\u636e\u5e94\u7528\u4ea4\u4ed8\u8282\u70b9\u751f\u6210\uff0c\u6bcf\u6b21\u6253 tag \u4e4b\u524d\uff0c\u76f8\u5173\u6d4b\u8bd5\u4eba\u5458\u9700\u8981\u8fdb\u884c\u7528\u4f8b\u8c03\u8bd5\uff1b \u8c03\u8bd5\u7528\u4f8b\u662f\u6307\u7684\u5728\u5168\u67b6\u6784\uff08x86\u3001arm\u3001mips\uff09\u4e0a\u8c03\u8bd5\u901a\u8fc7\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\u8fbe\u5230 90% \u4ee5\u4e0a\u624d\u80fd\u6253 tag\uff0c\u901a\u8fc7 Jenkins \u6267\u884c\u5668\u6267\u884c\u7528\u4f8b\uff0c\u4fdd\u7559\u901a\u8fc7\u7387\u7ed3\u679c\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\uff1a\u901a\u8fc7\u7528\u4f8b\u6570 / (\u603b\u7528\u4f8b\u6570 - \u5df2\u5e9f\u5f03\u7528\u4f8b) \u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u7b97\u901a\u8fc7 Jenkins \u6267\u884c\u5668 \u4f60\u53ef\u80fd\u4f1a\u5728\u4e00\u4e2a\u4ea4\u4ed8\u5468\u671f\u5185\u6301\u7eed\u7684\u8fdb\u884cAT\u7528\u4f8b\u8c03\u8bd5\uff0c\u4f46\u662f\u6700\u7ec8 AT \u7528\u4f8b\u6253 tag \u7684\u5e94\u7528\u7248\u672c\uff0c\u9700\u8981\u4f7f\u7528\u5e94\u7528\u96c6\u6210\u4ea4\u4ed8\u7684\u6700\u65b0\u5e94\u7528\u7248\u672c\uff0c\u53ef\u4ee5\u4f7f\u7528\u5e94\u7528\u7684\u63d0\u6d4b\u7248\u672c\uff1b\u4e00\u5b9a\u8981\u786e\u4fdd\u8c03\u8bd5\u7528\u4f8b\u7684\u5e94\u7528\u7248\u672c\u662f\u6700\u65b0\u7684\uff0c\u4e0d\u7136\u96c6\u6210\u8fdb\u53bb\u4e4b\u540e\uff0c\u6301\u7eed\u96c6\u6210\u5c31\u4f1a\u51fa\u95ee\u9898\uff1b tag \u53f7\u600e\u4e48\u6253\uff1f \u6839\u636e\u6301\u7eed\u96c6\u6210\u7684\u8981\u6c42\u751f\u6210\uff0c\u5176\u4e2d\u5e94\u7528\u7248\u672c\u53f7\u9700\u8981\u4e0e\u9879\u76ee\u7ecf\u7406\u786e\u8ba4\u672c\u6b21\u5373\u5c06\u96c6\u6210\u7684\u5e94\u7528\u7248\u672c\u53f7\u662f\u591a\u5c11\uff1b tag \u7684 commit \u4fe1\u606f\u683c\u5f0f\uff1a # commit msg\nversion:5.6.5\n \u5176\u4e2d 5.6.5 \u5199\u5e94\u7528\u7684\u96c6\u6210\u7248\u672c\u53f7\u3002 \u751f\u6210 tag \u7684\u547d\u4ee4\u53c2\u8003\uff1a\u300aGit \u6807\u7b7e\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3-tag","title":"3. \u57fa\u7840\u6846\u67b6 tag","text":"\u57fa\u7840\u6846\u67b6 tag \u4e0d\u4e0e\u4e1a\u52a1\u6302\u94a9\uff0c\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u6309\u9700\u53d1\u5e03\u7248\u672c\uff0c\u5728\u6839\u76ee\u5f55\u4e0b CURRENT \u6587\u4ef6\u4e2d\u8bb0\u5f55\u7684\u5f53\u524d\u7248\u672c\u53f7\u548c\u5386\u53f2\u7248\u672c\u53f7\uff0c\u53ca\u5176\u5bf9\u5e94\u65b0\u589e\u4e86\u54ea\u4e9b\u529f\u80fd\uff0c\u6709\u52a9\u4e8e\u5e94\u7528\u9009\u62e9\u5408\u9002\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\u3002 # CURRENT\n[current]\ntag = 0.9.5\n \u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u7684 control \u6587\u4ef6\u8bb0\u5f55\u5f53\u524d\u5e94\u7528\u5e93\u4f9d\u8d56\u7684\u57fa\u7840\u5e93\u7248\u672c\u3002 # control\n[Depends]\nautotest-basic-frame = 0.9.5\n \u7528\u4f8b\u5728\u6267\u884c\u65f6\u4f1a\u6821\u9a8c\u4e24\u4e2a\u6587\u4ef6\u7684\u7248\u672c\u53f7\u662f\u5426\u4e00\u81f4\uff0c\u5982\u679c\u4e0d\u4e00\u81f4\uff0c\u4f1a\u6253\u5370 error \u65e5\u5fd7\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_2","title":"\u4e09\u3001\u4ed3\u5e93\u6743\u9650\u7ba1\u7406","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_1","title":"1. \u57fa\u7840\u6846\u67b6","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u4ed3\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame \u57fa\u7840\u6846\u67b6\u4e0d\u5141\u8bb8\u533f\u540d\u8bbf\u95ee\uff0c\u5982\u679c\u4f60\u767b\u5f55 gerrit \u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u8bbf\u95ee\u4ee5\u4e0a\u94fe\u63a5\uff0c\u5219\u9700\u8981\u7533\u8bf7\u8bbf\u95ee\u6743\u9650\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_1","title":"2. \u5e94\u7528\u4ed3\u5e93","text":" \u81ea\u52a8\u5316\u5e94\u7528\u4ed3\u5e93\uff1a https://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684 app_name \u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_3","title":"\u56db\u3001\u65b9\u6cd5\u7f16\u5199&\u8c03\u7528\u89c4\u8303","text":"\u65b9\u6cd5\u7f16\u5199\u6574\u4f53\u8bbe\u8ba1\u601d\u8def\u53c2\u8003\uff1a[\u300aAT\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b]"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_2","title":"1. \u65b9\u6cd5\u7f16\u5199","text":"\u5199\u65b9\u6cd5\u7684\u65f6\u5019\u6ce8\u610f\u65b9\u6cd5\u5f52\u5c5e\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget\uff0c\u65b9\u6cd5\u662f\u5728\u54ea\u4e2a\u533a\u57df\u64cd\u4f5c\u7684\uff0c\u5c31\u5199\u5728\u54ea\u4e2a\u7c7b\u91cc\u9762\u3002 \u4e3e\u4f8b\uff1a from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n\"\"\"\u70b9\u51fb\u6807\u9898\u680fxxx\"\"\"\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_2","title":"2. \u65b9\u6cd5\u8c03\u7528","text":" \u5728\u7528\u4f8b\u4e2d\u8c03\u7528\u65b9\u6cd5\uff0c\u901a\u8fc7\u8be5\u5e94\u7528\u552f\u4e00\u7684\u51fa\u53e3\u8fdb\u884c\u8c03\u7528\uff0c\u6bd4\u5982\u6587\u7ba1\uff1a class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n \u4e0d\u8981\u5728\u7528\u4f8b\u4e2d\u5355\u72ec\u53bb\u8c03\u7528 TitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u8fd9\u4e9b\u7c7b\uff0c\u5426\u5219\u540e\u671f\u7528\u4f8b\u4f1a\u53d8\u5f97\u4e0d\u597d\u7ef4\u62a4\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_4","title":"\u4e94\u3001\u7528\u4f8b\u7f16\u5199\u89c4\u8303","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_3","title":"1. \u57fa\u4e8e\u7c7b\u5199\u7528\u4f8b","text":"\u6240\u6709\u7528\u4f8b\u90fd\u5e94\u8be5\u57fa\u4e8e\u7c7b\u53bb\u5199\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001(self):\n\"\"\"\u97f3\u4e50\u542f\u52a8\"\"\"\n \u6ce8\u610f\u4ee5\u4e0b\u51e0\u70b9\uff1a \u7c7b\u540d\u4e0d\u8981\u968f\u4fbf\u53d6\uff0c\u540c\u4e00\u4e2a\u5e94\u7528\u5e94\u8be5\u4f7f\u7528\u540c\u4e00\u4e2a\u7c7b\u540d\uff0c\u7528\u4f8b\u7c7b\u540d\u79f0\u5fc5\u987b\u4ee5 Test \u5f00\u5934\uff0c\u9075\u5faa\u5927\u9a7c\u5cf0\u547d\u540d\u89c4\u8303\uff1b \u7528\u4f8b\u7c7b\u7ee7\u627f BaseCase\uff0c\u4e00\u4e2a\u5e94\u7528\u53ea\u6709\u4e00\u4e2a BaseCase \u4e00\u4e2a py \u6587\u4ef6\u91cc\u9762\u53ea\u6709\u4e00\u4e2a\u7c7b\uff0c\u6211\u4eec\u79f0\u4e3a\u4e00\u4e2a\u6d4b\u8bd5\u7c7b\uff1b \u4e00\u4e2a\u7c7b\u91cc\u9762\u53ef\u4ee5\u6709\u591a\u4e2a\u7528\u4f8b\u51fd\u6570\uff0c\u8fd9\u53d6\u51b3\u8fd9\u6761\u7528\u4f8b\u6709\u591a\u5c11\u4e2a\u6d4b\u8bd5\u70b9\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001_1(self):\n\"\"\"\u4efb\u52a1\u680f\u542f\u52a8\u97f3\u4e50\"\"\"\ndef test_music_001_2(self):\n\"\"\"\u542f\u52a8\u5668\u542f\u52a8\u97f3\u4e50\"\"\" \ndef test_music_001_3(self):\n\"\"\"\u684c\u9762\u542f\u52a8\u97f3\u4e50\"\"\"\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_3","title":"2. \u7528\u4f8b\u51fd\u6570\u89c4\u8303","text":" \u7528\u4f8b\u51fd\u6570\u4ee5 test \u5f00\u5934\uff0c\u9075\u5faa\u86c7\u5f62\u547d\u540d\u89c4\u8303\uff0c\u4e2d\u95f4\u4e3a\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0\uff0c\u540e\u9762\u52a0\u7528\u4f8b ID\uff0c\u6700\u540e\u52a0\u6d4b\u8bd5\u70b9\u5e8f\u53f7\uff0c\u5373 test_${module}_${case_id}[_${index}] \uff1b \u6bd4\u5982\uff1atest_music_001_1\uff0cindex \u4ece 1 \u5f00\u59cb\u3002 \u51fd\u6570\u529f\u80fd\u8bf4\u660e\u91cc\u9762\u5199\u7528\u4f8b\u6807\u9898\uff0c\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u6807\u9898\u5373\u53ef\uff0c\u6ce8\u610f\u7528\u4e09\u5bf9\u53cc\u5f15\u53f7\uff0c\u4e0d\u8981\u7528\u5176\u4ed6\u6ce8\u91ca\uff0c\u66f4\u4e0d\u8981\u7528\u4e95\u53f7\u6ce8\u91ca\u5199\u7528\u4f8b\u6807\u9898\uff1b \u76f4\u63a5\u590d\u5236 PMS \u7528\u4f8b \u7528\u4f8b\u6b65\u9aa4\u76f4\u63a5\u5c06 PMS \u4e0a\u7528\u4f8b\u6b65\u9aa4\u548c\u9884\u671f\u590d\u5236\u8fdb\u6765\uff0c\u7136\u540e\u8fdb\u884c\u6279\u91cf\u6ce8\u91ca\uff08ctrl + /\uff09\uff0c\u5728\u6ce8\u91ca\u7684\u57fa\u7840\u4e0a\u53bb\u5199\u7528\u4f8b\u811a\u672c\u4f1a\u66f4\u52a0\u65b9\u4fbf\u5168\u9762\uff0c\u4e5f\u6bd4\u4f60\u81ea\u5df1\u5199\u6ce8\u91ca\u66f4\u8282\u7ea6\u65f6\u95f4\uff1a \u4e3e\u4f8b\uff0cPMS \u7528\u4f8b\uff1a \u76f4\u63a5\u9009\u4e2d\u7528\u4f8b\u5185\u5bb9\uff0c\u590d\u5236\u4e0b\u6765\uff0c\u7136\u540e\u7c98\u8d34\u5230\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c\u4e2d\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\n \u4e0a\u4f8b\u4e2d\u4e95\u53f7\u6ce8\u91ca\u90e8\u5206\u5c31\u662f\u76f4\u63a5\u4ece PMS \u4e0a\u590d\u5236\u8fc7\u6765\u7684\uff0c\u5728\u6b64\u57fa\u7840\u4e0a\u5199\u7528\u4f8b\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\nmusic = DeepinMusicWidget()\nmusic.click_singer_btn_in_music_by_ui()\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\nmusic.click_icon_mode_in_music_by_ui()\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\nmusic.double_click_first_singer_in_singer_icon_view_by_ui()\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\nself.assert_xxx\n \u4f60\u770b\uff0c\u975e\u5e38\u6e05\u695a\u6bcf\u4e00\u6b65\u5728\u505a\u4ec0\u4e48\uff0c\u91cd\u70b9\u662f\u7701\u53bb\u4e86\u5199\u6ce8\u91ca\u7684\u65f6\u95f4\uff0c\u771f\u7684\u7092\u9e21\u65b9\u4fbf\u3002 \u4e0d\u5199 if __name__ == '__main__':\uff0c\u4e0d\u5199\u591a\u4f59\u7684\u4ee3\u7801\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3","title":"3. \u6570\u636e\u9a71\u52a8","text":" \u5982\u679c\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u662f\u76f8\u540c\u7684\uff0c\u53ea\u662f\u4e00\u4e9b\u53c2\u6570\u53d8\u5316\uff0c\u5c3d\u91cf\u4f7f\u7528\u6570\u636e\u9a71\u52a8\u6765\u5b9e\u73b0\u7528\u4f8b\uff1b \u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u6570\u636e\u9a71\u52a8\u7684\u6570\u636e\uff0c\u4e0d\u80fd\u56e0\u6b64\u5f15\u5165\u4f9d\u8d56\uff0c\u5c3d\u91cf\u4f7f\u7528\u4e00\u4e9b\u6807\u51c6\u5e93\u80fd\u8bfb\u53d6\u7684\u6587\u4ef6\u683c\u5f0f\uff0c\u6bd4\u5982 json\u3001ini\u3001CSV\u3001xml\u3001txt \u7b49\u6587\u4ef6\u683c\u5f0f\uff1b\u4e0d\u5efa\u8bae\u4f7f\u7528 Yaml\u3001Excel\u3001MySQL \u7b49\u6570\u636e\u683c\u5f0f\uff1b \u8bfb\u53d6\u6570\u636e\u65f6\u4e5f\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff0c\u5982\u4f7f\u7528 pandas \u5904\u7406 CSV \u5c31\u5c5e\u4e8e\u5927\u6750\u5c0f\u7528\u4e86\uff0c\u6b63\u5e38\u7684\u6570\u636e\u9a71\u52a8\u8fd8\u6ca1\u5230\u9700\u8981\u5927\u6570\u636e\u5206\u6790\u6765\u5904\u7406\u7684\u5730\u6b65\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u5728 widget/ddt/ \u76ee\u5f55\u4e0b\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5199\u6cd5\uff1a @pytest.mark.parametrize(\"value\", data)\ndef test_smb_049(self, value):\n \u4ee5\u4e0a\u8fd9\u79cd\u53c2\u6570\u5316\u7684\u5199\u6cd5\u672c\u8eab\u6ca1\u4ec0\u4e48\u95ee\u9898\uff0c\u4f46\u662f\uff0c\u8fd9\u91cc\u5fc5\u987b\u8981\u8865\u5145\u4e00\u4e2a\u6ca1\u6709\u7528\u7684\u5c0f\u77e5\u8bc6\uff1a \u5982\u679c\u53c2\u6570\u5316\u6570\u636e\u91cc\u9762\u7684\u5b57\u7b26\u4f1a\u539f\u5c01\u4e0d\u52a8\u7684\u8f93\u51fa\u5230 item.name \u91cc\u9762\uff0c\u663e\u793a\u975e\u5e38\u4e0d\u4f18\u96c5\uff0c\u800c\u4e14\u53ef\u4ee5\u4f1a\u5f15\u5165\u4e00\u4e9b\u610f\u60f3\u4e0d\u5230\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u611f\u53d7\u4e00\u4e0b\uff1a \u53c2\u6570\uff1a data = [\n\"\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\", \"qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678\",\n]\n \u73b0\u8c61\u662f\u8fd9\u6837\u8272\u513f\u7684\uff1a test_smb_049.py::TestFileManager::test_smb_049[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09]\ntest_smb_049.py::TestFileManager::test_smb_049[qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui]\ntest_smb_049.py::TestFileManager::test_smb_049[12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678]\n \u8bf4\u5b9e\u8bdd\uff0c\u770b\u7740\u5fc3\u91cc\u5835\u5f97\u614c\uff0c\u5982\u679c\u8fd9\u91cc\u9762\u5305\u542b\u4e00\u4e9b\u7279\u6b8a\u5b57\u7b26\u6216\u8005\u662f\u8d85\u957f\uff0c\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u5f88\u5947\u5999\u7684\u4e8b\u60c5\u53d1\u751f\u3002 parametrize \u91cc\u9762\u6709\u4e2a\u53c2\u6570\uff1aids\uff0c\u53ef\u4ee5\u89e3\u51b3\u6b64\u7c7b\u95ee\u9898\uff0c\u5c31\u50cf\u8fd9\u6837\uff1a @pytest.mark.parametrize(\"value\", data, ids=[1, 2, 3])\ndef test_smb_049(self, value):\n \u518d\u6765\u611f\u53d7\u4e00\u4e0b\uff1a test_smb_049.py::TestFileManager::test_smb_049[1]\ntest_smb_049.py::TestFileManager::test_smb_049[2]\ntest_smb_049.py::TestFileManager::test_smb_049[3]\n \u660e\u663e\u597d\u591a\u4e86\uff0c\u6240\u4ee5\u5c3d\u91cf\u4f7f\u7528 ids \u8fd9\u4e2a\u53c2\u6570\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 fixture \u7684\u6570\u636e\u9a71\u52a8\u65b9\u5f0f\uff0c\u6846\u67b6\u867d\u7136\u652f\u6301\uff0c\u4f46\u53ef\u8bfb\u6027\u6bd4\u8f83\u5dee\uff1b\u5982\u679c\u4f60\u4e0d\u77e5\u9053\u8fd9\u53e5\u8bdd\u5728\u8bf4\u5565\uff0c\u90a3\u4f60\u53ef\u4ee5\u5ffd\u7565\uff0c\u6211\u4e5f\u4e0d\u6253\u7b97\u8be6\u7ec6\u8bf4\u8fd9\u79cd\u5b9e\u73b0\u65b9\u5f0f\uff0c\u64cd\u4f5c\u6bd4\u8f83\u9a9a\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4","title":"4. \u65ad\u8a00\u8d44\u6e90","text":" \u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u76f4\u63a5\u653e\u5728\u7528\u4f8b\u6a21\u5757\u7684\u540c\u7ea7\u76ee\u5f55\u4e0b\u7684 assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0 + \u7528\u4f8b ID \u547d\u540d\uff1b \u56fe\u50cf\u8bc6\u522b\u65ad\u8a00\uff0c\u4e0d\u8981\u622a\u53d6\u4e00\u5f20\u5f88\u5927\u7684\u56fe\uff0c\u56fe\u7247\u8d44\u6e90\u5305\u542b\u7684\u5143\u7d20\u592a\u591a\u4e86\uff0c\u975e\u5e38\u5bb9\u6613\u53d7\u5230\u9700\u6c42\u5f71\u54cd\uff0c\u5efa\u8bae\u662f\u8fdb\u884c\u5c40\u90e8\u7684\u65ad\u8a00\uff1b \u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u5339\u914d\u5ea6\u662f 0.9\uff0c\u5982\u679c\u65ad\u8a00\u7684\u573a\u666f\u5bf9\u4e8e\u7cbe\u786e\u5ea6\u8981\u6c42\u6ca1\u90a3\u4e48\u9ad8\uff0c\u53ef\u4ee5\u5728\u65ad\u8a00\u8bed\u53e5\u91cc\u9762\u4f20\u5165\u5c0f\u4e8e 0.9 \u7684\u53c2\u6570\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5","title":"5. \u5143\u7d20\u5b9a\u4f4d","text":" \u7528\u4e8e\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u4e2d\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u547d\u540d\u4e3a\u8be5\u5143\u7d20\u7684\u540d\u79f0\uff1b \u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u622a\u53d6\u65f6\u5c3d\u91cf\u7cbe\u786e\u5230\u8fd9\u4e2a\u5177\u4f53\u7684\u6309\u94ae\uff0c\u56fe\u7247\u4e5f\u4e0d\u8981\u592a\u5927\uff1b \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u64cd\u4f5c\u8f83\u5feb\uff0c\u5408\u7406\u52a0\u5165\u7b49\u5f85\u65f6\u95f4\u80fd\u63d0\u9ad8\u7528\u4f8b\u7684\u7a33\u5b9a\u6027\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6","title":"6. \u7528\u4f8b\u8d44\u6e90","text":" \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u4f7f\u7528\u5230\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u6bd4\u5982\u97f3\u4e50\u53ef\u80fd\u9700\u8981\u4e00\u4e9b mp3 \u7684\u8d44\u6e90\u7528\u4e8e\u6d4b\u8bd5\uff0c\u5b58\u653e\u5728 widget/case_res \u76ee\u5f55\u4e0b\uff0c\u524d\u63d0\u662f\u8fd9\u4e9b\u8d44\u6e90\u4e0d\u8d85\u8fc7 10M\uff1b \u5982\u679c\u662f\u4e00\u4e9b\u6bd4\u8f83\u5927\u7684\u8d44\u6e90\uff0c\u5efa\u8bae\u653e\u5230\u7edf\u4e00\u7684 ftp \u670d\u52a1\u5668 \uff08ftp://10.8.10.245\uff09\uff0c\u9700\u8981\u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\u518d\u4e0b\u8f7d\u4e0b\u6765\uff1b f\"wget ftp://{Config.FTP_IP}/uploads/\u591a\u5a92\u4f53/\u5f71\u9662/auto/{file_name};unzip {file_name};rm -rf {file_name};\"\n \u6d4b\u8bd5\u8d44\u6e90\u4e0b\u8f7d\u5230\u5e94\u7528 widget/case_res \u76ee\u5f55\u4e0b\uff1b \u7981\u6b62\u5c06\u6d4b\u8bd5\u8d44\u6e90\u5b58\u653e\u5728\u4e2a\u4eba\u7684\u673a\u5668\u4e0a\uff1b \u5e94\u8be5\u5c3d\u91cf\u4fdd\u8bc1\uff0c\u4e00\u4e2a\u8d44\u6e90\u5728\u4e00\u6b21\u7528\u4f8b\u6267\u884c\u4e2d\u53ea\u9700\u8981\u4e0b\u8f7d\u4e00\u6b21\uff0c\u6240\u4ee5\u4f60\u4e0d\u80fd\u6bcf\u6b21\u4f7f\u7528\u7684\u65f6\u5019\u90fd\u53bb\u4e0b\u8f7d\uff0c\u8fd9\u6837\u53ef\u80fd\u4f1a\u8017\u8d39\u5927\u91cf\u7684\u7f51\u7edc\u8d44\u6e90\uff0c\u800c\u56e0\u4e3a\u5148\u5224\u65ad\u672c\u5730\u662f\u5426\u5b58\u5728\u6b64\u8d44\u6e90\uff0c\u5982\u679c\u4e0d\u5b58\u5728\u518d\u53bb\u4e0b\u8f7d\uff1b \u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u5c06\u8d44\u6e90\u62f7\u8d1d\u5230\u5bf9\u5e94\u7684\u6d4b\u8bd5\u76ee\u5f55\u4e0b\uff0c\u6bd4\u5982\u5c06 mp3 \u6587\u4ef6\u62f7\u8d1d\u5230 ~/Music \u76ee\u5f55\u4e0b\uff0c\u4f46\u662f\u6211\u4eec\u66f4\u5efa\u8bae\u4f60\u4f7f\u7528\u53d1\u9001\u5feb\u6377\u94fe\u63a5\u7684\u65b9\u5f0f\u66ff\u4ee3\u62f7\u8d1d\u7684\u64cd\u4f5c\uff0c\u56e0\u4e3a\u5728\u62f7\u8d1d\u5927\u6587\u4ef6\u65f6\u662f\u5f88\u6d88\u8017\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u800c\u521b\u5efa\u94fe\u63a5\u5219\u4e0d\u4f1a\uff1b @classmethod\ndef recovery_many_movies_in_movie_by_cmd(cls):\n\"\"\"\u6062\u590d\u591a\u4e2a\u89c6\u9891\u6587\u4ef6\u81f3\u89c6\u9891\u76ee\u5f55\u4e2d\"\"\"\nwork_path = f\"/home/{Config.USERNAME}/Videos/auto\"\ncode_path = f\"{Config.CASE_RES_PATH}/auto\"\ncls.run_cmd(f\"rm -rf {work_path};mkdir {work_path}\")\nsleep(1)\nflag = False\nif not exists(code_path):\ncls.run_cmd(f\"mkdir -p {code_path}\")\nflag = True\nlogger.info(f\"ln -s {code_path}/* {work_path}/\")\ncls.run_cmd(\nf\"cd {code_path}/;\"\nf\"{cls.wget_file('auto.zip') if flag else ''}\"\nf\"ln -s {code_path}/* {work_path}/ > /dev/null 2>&1\"\n)\n \u8d44\u6e90\u4e0b\u8f7d\u8fc7\u7a0b\u4e2d\u6ce8\u610f\u8d85\u65f6\u7684\u95ee\u9898\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u5f88\u5927\uff0c\u8981\u7279\u522b\u6ce8\u610f\u8fd9\u95ee\u9898\uff0c\u5982\u679c\u4f60\u4f7f\u7528\u5f3a\u5236\u7b49\u5f85\u4e0b\u8f7d\u7ed3\u675f( os.system )\uff0c\u53ef\u80fd\u4f1a\u9020\u6210\u7528\u4f8b\u6267\u884c\u65f6\u957f\u53d8\u5f97\u4e0d\u53ef\u63a5\u53d7\uff0c\u76ee\u524d\u6211\u4eec\u53d1\u73b0\u5728\u6301\u7eed\u96c6\u6210\u73af\u5883\u6267\u884c\u65f6\u7f51\u7edc\u4e0b\u8f7d\u901f\u5ea6\u5f88\u6162\uff0c\u6240\u4ee5\u8d85\u65f6\u673a\u5236\u662f\u5f88\u6709\u5fc5\u8981\u7684\uff1brun_cmd \u65b9\u6cd5\u6709\u4e00\u4e2a\u9ed8\u8ba4\u8d85\u65f6\u7684\u65f6\u95f4\uff0c\u4f60\u53ef\u4ee5\u6839\u636e\u8d44\u6e90\u5927\u5c0f\u5bf9\u8d85\u65f6\u65f6\u95f4\u8fdb\u884c\u8c03\u6574\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_5","title":"\u516d\u3001\u7528\u4f8b\u8c03\u8bd5\u6280\u5de7","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_4","title":"1. \u65e5\u5fd7","text":" \u4e00\u5b9a\u8981\u5148\u770b\u62a5\u9519\uff0c\u770b error \u65e5\u5fd7\uff0c\u901a\u5e38\u80fd\u660e\u786e\u7684\u544a\u8bc9\u4f60\u5177\u4f53\u54ea\u91cc\u4ee3\u7801\u62a5\u9519\uff1b \u7ed3\u5408\u62a5\u9519\u70b9\u524d\u9762\u7684error\u3001 info \u548c debug \u65e5\u5fd7\u770b\u5426\u662f\u6b63\u5e38\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_4","title":"2. \u65ad\u70b9\u8c03\u8bd5","text":" \u65b9\u6cd5\u62a5\u9519\uff1a \u5728\u65b9\u6cd5\u5e93\u4e2d\u627e\u5230\u5bf9\u5e94\u7684\u65b9\u6cd5\uff0c\u5355\u72ec\u8c03\u7528\uff0c\u770b\u662f\u5426\u80fd\u6b63\u5e38\u6267\u884c\uff1b \u901a\u5e38\u5355\u4e2a\u65b9\u6cd5\u7684\u6267\u884c\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u62a5\u9519\uff0c\u5f88\u5feb\u5c31\u80fd\u6392\u67e5\u51fa\u95ee\u9898\uff1b\u5728\u65b9\u6cd5\u5185\u90e8\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u65b9\u6cd5\u5185\u90e8\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u8c03\u7528\u6ca1\u95ee\u9898\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u62a5\u9519\u7684\u65b9\u6cd5\u524d\u9762\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u7528\u4f8b\u7684\u4e1a\u52a1\u903b\u8f91\u548c\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u65ad\u8a00\u62a5\u9519\uff1a \u65ad\u8a00\u4e3a\u6570\u636e\u65ad\u8a00\uff0c\u6839\u636e\u8868\u8fbe\u5f0f\u8fdb\u884c\u65ad\u8a00\u8bed\u53e5\u8fdb\u884c\u4fee\u6539\uff1b \u6587\u4ef6\u751f\u6210\u7c7b\u65ad\u8a00\uff0c\u67e5\u770b\u662f\u5426\u9700\u8981\u52a0\u7b49\u5f85\u65f6\u95f4\uff1b \u56fe\u50cf\u65ad\u8a00\uff0c\u5728\u65ad\u8a00\u8bed\u53e5\u5904\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u7528\u4f8b\u8fd0\u884c\u5230\u65ad\u8a00\u5904\u4f1a\u505c\u6b62\uff0c\u67e5\u770b\u6b64\u65f6\u65ad\u8a00\u7684\u56fe\u7247\u4e0e\u7528\u4f8b\u6267\u884c\u7684\u73b0\u573a\u5b58\u5728\u4ec0\u4e48\u5dee\u5f02\uff0c\u6b64\u65f6\u4e5f\u53ef\u4ee5\u8fdb\u884c\u91cd\u65b0\u622a\u56fe\uff0c\u4ece\u800c\u66ff\u6362\u65b0\u7684\u56fe\u7247\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3_1","title":"3. \u8fdc\u7a0b\u6267\u884c","text":" \u8fdc\u7a0b\u6267\u884c\u6307\u7684\u662f\u7f16\u8f91\u5668\u901a\u8fc7\u6307\u5b9a\u8fdc\u7a0b\u89e3\u91ca\u5668\u6267\u884c\u81ea\u52a8\u5316\u4ee3\u7801\uff1b \u8fdc\u7a0b\u6267\u884c\u7684\u597d\u5904\u662f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u7684 Debug \u8fd0\u884c\uff0c\u4e0d\u7528\u5728\u6d4b\u8bd5\u673a\u4e0a\u6253\u5f00\u7f16\u8f91\u5668\uff0c\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u66f4\u5feb\uff1b \u652f\u6301\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u7684\u7f16\u8f91\u5668\uff1a \u4e13\u4e1a\u7248 Pycharm VScode \uff0c\u9700\u8981\u4f7f\u7528\u63d2\u4ef6 Remote-SSH \u8fdc\u7a0b\u6267\u884c\u914d\u7f6e \u4ee5 Pycharm \u4e3a\u4f8b\uff1a File \u2014> Settings \u2014> Project \u2014> Python Interpreter \u2014> \u53f3\u8fb9\u8bbe\u7f6e\u6309\u94ae \u2014> Add... \u2014> SSH Interpreter \u2014> New server configuration(\u586b\u5165host\u548cusername) \u2014> Next \u2014> password\uff08\u6d4b\u8bd5\u673a\u5bc6\u7801\uff09 \u2014> Interpreter(\u9009\u62e9\u8fdc\u7a0b\u89e3\u91ca\u5668) \u2014> Finish "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4_1","title":"4. \u73af\u5883\u6e05\u7406","text":" \u5982\u679c\u7528\u4f8b\u91cc\u9762\u7684 teardown \u6ca1\u6709\u6267\u884c\uff0c\u5927\u6982\u7387\u662f\u56e0\u4e3a setup \u91cc\u9762\u4ee3\u7801\u62a5\u9519\uff0c\u8fd9\u4e24\u4e2a\u662f\u4e00\u5bf9\u7684\uff0csetup \u91cc\u9762\u62a5\u9519\uff0cteardown \u91cc\u9762\u7684\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\uff1b \u76ee\u524d\u6211\u4eec\u5df2\u7ecf\u5c06\u5404\u5e94\u7528\u7684 clean_all \u8fd9\u4e2a fixture \u6539\u6210\u4e86\u7ec8\u7ed3\u5668\uff0c\u786e\u4fdd\u59cb\u7ec8\u80fd\u6267\u884c\u5230\u8fd9\u6b65\uff0c\u4f46\u662f\u7528\u4f8b\u91cc\u9762\u7684 fixture\uff0c\u8fd8\u662f\u9700\u8981\u6211\u4eec\u5c0f\u5fc3\u5904\u7406\uff1b \u8981\u6267\u884c clean_all \u9700\u8981\u5728\u7f16\u8f91\u5668\u8fd0\u884c\u53c2\u6570\u52a0 --clean yes\uff0c\u5199\u7528\u4f8b\u7684\u65f6\u5019\u8bf7\u52a0\u4e0a\uff0c\u4e0d\u7136\u4f60\u4e0d\u786e\u5b9a\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u7684\u73af\u5883\u662f\u5426\u6062\u590d\uff1b setup \u53ef\u4ee5\u4e0d\u8981\uff0c\u5c06 setup \u653e\u5230\u7528\u4f8b\u91cc\u9762\u662f\u4e00\u79cd\u7a33\u59a5\u7684\u505a\u6cd5\uff0cteardown \u4e00\u5b9a\u8981\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5_1","title":"5. \u5143\u7d20\u5b9a\u4f4d\u4e0d\u51c6\uff08\u5750\u6807\u8fd4\u56de\u4e0d\u5bf9\uff09","text":" \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u53ef\u80fd\u53d7\u5230\u7a97\u53e3 ID \u7684\u53d8\u5316\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u9ed8\u8ba4\u53d6\u6700\u65b0\u7684\u4e00\u4e2a\u7a97\u53e3\u7528\u4e8e\u5b9a\u4f4d\uff0c\u4f46\u5982\u679c\u5b9e\u9645\u9700\u8981\u5b9a\u4f4d\u7684\u4e0d\u662f\u6700\u65b0\u7684\u7a97\u53e3\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u91cd\u65b0\u5b9e\u4f8b\u5316\u65b9\u6cd5\u7c7b\u5bf9\u8c61\uff0c\u5e76\u5728\u7c7b\u4e2d\u4f20\u5165\u5bf9\u5e94\u7684\u7a97\u53e3\u5e8f\u53f7\uff1b \u57fa\u4e8e\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u76ee\u524d\u9047\u5230\u7684\u7b14\u8bb0\u672c\u4e0a\uff0c\u7531\u4e8e\u5c4f\u5e55\u7f29\u653e\u6bd4\u4f8b\u4e3a 1.25\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u6211\u4eec\u9ed8\u8ba4\u4f7f\u7528\u7f29\u653e\u6bd4\u4f8b\u4e3a 1\uff1b \u57fa\u4e8e\u56fe\u50cf\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u76ee\u6807\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b \u57fa\u4e8e OCR \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u6587\u5b57\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u540c\u6837\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6_1","title":"6. \u952e\u9f20\u64cd\u4f5c\u4e0d\u51c6","text":" \u9f20\u6807\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6bd4\u5982\u53f3\u952e\u3001\u53cc\u51fb\u65e0\u54cd\u5e94\uff1b \u952e\u76d8\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6216\u8005\u5ef6\u8fdf\u8f93\u5165\uff0c\u6bd4\u5982\u7528\u4f8b\u9700\u8981\u8f93\u5165\u201c\u6211\u662f\u4e2d\u56fd\u4eba\u201d\uff0c\u5b9e\u9645\u53ea\u8f93\u5165\u4e86\u201c\u6211\u56fd\u4eba\u201d\uff1b \u4ee5\u4e0a\u95ee\u9898\u6392\u9664\u5e94\u7528\u5361\u987f\u7b49\u95ee\u9898\uff0c\u5927\u6982\u7387\u662f\u7531\u4e8e\u5de5\u5177\u7684\u95ee\u9898\uff0c\u76ee\u524d\u952e\u9f20\u64cd\u4f5c\u6211\u4eec\u4f7f\u7528\u4e09\u4e2a\u5de5\u5177\uff1aDogtail \u63d0\u4f9b\u7684\u952e\u9f20\u5de5\u5177\u3001PyAutoGUI\u3001Xdotool \uff1b \u6709\u540c\u5b66\u53ef\u80fd\u8981\u8bf4\u4e3a\u5565\u8981\u7528\u4e09\u4e2a\u554a\uff0c\u7528\u4e00\u4e2a\u4e0d\u5c31\u597d\u4e86\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u5404\u6709\u4f18\u70b9\u5404\u6709\u7f3a\u70b9\u3002 \u5982\u679c\u4f60\u9047\u5230\u952e\u9f20\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u8bd5\u8bd5\u901a\u8fc7\u4e0d\u540c\u7684\u5de5\u5177\u64cd\u4f5c\uff1b\u952e\u76d8\u8f93\u5165\u5ef6\u8fdf\u7684\u95ee\u9898\uff0c\u4e00\u822c\u662f\u56e0\u4e3a\u8f93\u5165\u901f\u5ea6\u592a\u5feb\u4e86\uff0c\u7cfb\u7edf\u6ca1\u53cd\u5e94\u8fc7\u6765\uff0c\u5e38\u89c1\u4e8e ARM \u548c MIPS \u4e0a\uff0c\u4fee\u6539\u53c2\u6570 delay_time \u7684\u503c\uff0c\u5355\u4f4d\u4e3a\u6beb\u79d2\uff1b # mouse_key.py\n@classmethod\ndef input_message(cls, message, delay_time=300, interval=0.2):\n\"\"\"\n \u8f93\u5165\u5b57\u7b26\u4e32\n :param message: \u8f93\u5165\u7684\u5185\u5bb9\n :param delay_time: \u5ef6\u8fdf\u65f6\u95f4\n :param interval:\n :return:\n \"\"\"\n \u5982\u679c\u4e0d\u662f\u65b9\u6cd5\u7684\u95ee\u9898\uff0c\u5219\u9700\u8981\u7ee7\u7eed\u548c\u5f00\u53d1\u4e00\u8d77\u6392\u9664\uff0c\u662f\u5426\u4e3a\u5e94\u7528\u63a5\u53d7\u952e\u9f20\u4fe1\u53f7\u5904\u7406\u7684\u95ee\u9898\uff0c\u8fd9\u7c7b\u60c5\u51b5\u6211\u4eec\u4e5f\u662f\u9047\u5230\u8fc7\u7684\uff0c\u5177\u4f53\u95ee\u9898\u5177\u4f53\u5206\u6790\u3002 \u6bd4\u5982\u5f71\u9662\u5c31\u91cd\u5199\u4e86\u4e00\u4e2a\u53f3\u952e\u7684\u65b9\u6cd5\uff1a # base_widget.py\n@classmethod\ndef right_click(cls, _x=None, _y=None):\n\"\"\"\n \u91cd\u5199\u5e95\u5c42\u5355\u51fb\u9f20\u6807\u53f3\u952e\n \u89e3\u51b3\u5f71\u9662\u53f3\u952e\u89e6\u53d1release\u4e8b\u4ef6\u7684\u95ee\u9898\uff08\u53f3\u952e\u4e3b\u7a97\u53e3\u4f1a\u64ad\u653e\u89c6\u9891\uff09\n \"\"\"\ncls.mouse_down(_x, _y, button=3)\nsleep(0.1)\ncls.mouse_up(button=3)\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_6","title":"\u4e03\u3001\u5176\u4ed6\u4e0d\u4e3a\u4eba\u77e5\u7684\u7ec6\u8282","text":" \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u5c3d\u91cf\u7f16\u5199\u540c\u4e00\u4e2a\u5e94\u7528\u6216\u6a21\u5757\u7684\u7528\u4f8b\uff0c\u80fd\u5bf9\u8be5\u7528\u4f8b\u5df2\u6709\u65b9\u6cd5\u719f\u6089\uff0c\u907f\u514d\u8fc7\u591a\u91cd\u590d\u4e1a\u52a1\u4ee3\u7801\u7684\u5c01\u88c5\uff1b \u76f8\u540c\u7684\u573a\u666f\u4e0b\uff0c\u5404\u67b6\u6784\u7b49\u5f85\u65f6\u95f4\u4e0d\u540c\uff0c\u5efa\u8bae\u4f7f\u7528\u6846\u67b6\u63d0\u4f9b\u7684 sleep\uff0c\u6211\u4eec\u505a\u4e86\u4e0d\u540c\u67b6\u6784\u7684\u500d\u6570\u653e\u5927\uff1b \u7f16\u5199\u7528\u4f8b\u65f6\uff0c\u5c3d\u91cf\u8003\u8651\u5230\u6bcf\u4e00\u6b65\u5f02\u5e38\u540e\u7684\u73af\u5883\u6062\u590d\uff0c\u9700\u8981\u5efa\u8bae\u8fd9\u79cd\u610f\u8bc6\uff0c\u968f\u65f6\u8981\u8003\u8651\u5230\uff0c\u8fd9\u6b65\u64cd\u4f5c\u6709\u6ca1\u6709\u53ef\u80fd\u51fa\u9519\uff0c\u51fa\u9519\u4e86\u6539\u600e\u4e48\u529e\uff1b \u63d0\u4ea4\u4ee3\u7801\u7684\u65f6\u5019\u6ce8\u610f\u4e0d\u8981\u628a\u4e00\u4e9b\u4e34\u65f6\u7684\u6d4b\u8bd5\u8d44\u6e90\u63d0\u4ea4\u8fdb\u53bb\u4e86\uff0c\u6bd4\u5982\u6d4b\u8bd5\u4e86\u4e00\u4e2a\u5f71\u7247\uff0c\u6709\u4e9b\u540c\u5b66\u4e60\u60ef\u4f7f\u7528 git add . \uff0c\u7136\u540e\u5c31\u5168\u90e8\u63d0\u4ea4\u5230\u4ee3\u7801\u4ed3\u5e93\u4e86\uff0c\u8fd9\u6837\u5373\u4f7f\u540e\u671f\u628a\u5927\u6587\u4ef6\u5220\u4e86\uff0c.git \u6587\u4ef6\u91cc\u9762\u4e5f\u4f1a\u5f88\u5927\uff0c\u9020\u6210\u4ee3\u7801\u4ed3\u5e93\u53d8\u5f97\u5341\u5206\u81c3\u80bf\u3002 \u66f4\u591a\u7ec6\u8282\u67e5\u770b\uff1a\u300aAT\u7ecf\u9a8c\u603b\u7ed3\u300b"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/","title":"AT \u6267\u884c\u5668\u4f7f\u7528\u6307\u5317","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/5/25\n# Author : litao\n# =============================================\n Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1","title":"1\u3001\u529f\u80fd\u4ecb\u7ecd","text":" \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7cfb\u7edf\u8bed\u8a00\u8bbe\u7f6e\uff0c\u5206\u8fa8\u7387\u8bbe\u7f6e\u53ca\u7528\u4f8b\u6267\u884c\u73af\u5883\u642d\u5efa\uff1b \u652f\u6301 IP \u4e3a 15 \u7f51\u6bb5\u7684 AMD \u67b6\u6784\u6d4b\u8bd5\u673a\u955c\u50cf\u88c5\u673a\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u6307\u5b9a\u5e94\u7528\uff0c\u6307\u5b9a\u8303\u56f4\u6807\u7b7e\u7684\u7528\u4f8b\u6267\u884c\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u72b6\u6001\u68c0\u67e5\uff0c\u662f\u5426\u6709\u6b63\u5728\u8fd0\u884c\u7684\u6d4b\u8bd5\uff1b \u652f\u6301\u914d\u7f6e\u7528\u4f8b\u6267\u884c\u65f6\u957f\uff0c\u9632\u6b62\u4efb\u52a1\u963b\u585e\uff1b \u652f\u6301\u6839\u636e\u5e94\u7528\u7248\u672c\u81ea\u52a8\u67e5\u627e\u5bf9\u5e94\u7684\u7528\u4f8b tag\uff1b \u652f\u6301\u5f02\u5e38\u5904\u7406\u548c\u6d4b\u8bd5\u5b8c\u6210\u7684\u5b9e\u65f6\u6d88\u606f\u901a\u77e5\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2job","title":"2\u3001Job \u4ecb\u7ecd","text":"\u4ee5\u4e0b\u6309\u6267\u884c\u6d41\u7a0b\u7684\u987a\u5e8f\u4ecb\u7ecd\uff0c\u6bcf\u4e00\u6b65\u90fd\u53ef\u4ee5\u5355\u72ec\u6267\u884c\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1_1","title":"1\u3001\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/AT_test/ \u6574\u4e2a\u6d41\u7a0b\u7684\u4e3b\u5165\u53e3\uff0c\u901a\u8fc7\u8fd9\u4e2a\u5165\u53e3\uff0c\u8fde\u540c\u6574\u4e2a\u6d4b\u8bd5\u6d41\u7a0b\uff0c\u955c\u50cf\u88c5\u673a\uff0c\u73af\u5883\u90e8\u7f72\uff0c\u6d4b\u8bd5\u5e94\u7528\u53ca\u751f\u6210\u62a5\u544a\u3002 \u53c2\u6570\u4ecb\u7ecd\uff1a \u6d4b\u8bd5\u673a\uff1a\u6240\u6709\u89c4\u6574\u5230\u56fa\u5b9a\u533a\u57df\u7684\u6d4b\u8bd5\u673a\uff0c\u901a\u8fc7\u6d4b\u8bd5\u540c\u5b66\u5bf9\u6d4b\u8bd5\u673a\u7684\u4e60\u60ef\u547d\u540d\uff0c\u5728\u540e\u53f0\u6620\u5c04\u6d4b\u8bd5\u673a\u7684\u8be6\u7ec6\u4fe1\u606f\uff0c\u62ec\u53f7\u4e2d\u4e3a\u6d4b\u8bd5\u673a IP \u7684\u6700\u540e\u4e00\u4f4d\uff1b \u6d4b\u8bd5\u5e94\u7528\uff1a\u6307\u5b9a\u7684\u6d4b\u8bd5\u5e94\u7528\u7684\u5305\u540d\uff0c\u7cfb\u7edf\u6839\u636e\u540d\u79f0\u81ea\u52a8\u62c9\u53d6\u5bf9\u5e94\u7684\u4ed3\u5e93\u4ee3\u7801\uff1b deb\u5305\u4e0b\u8f7d\u5730\u5740\uff1a\u6d4b\u8bd5\u4e0a\u8ff0\u5e94\u7528\u65f6\uff0c\u9700\u8981\u5b89\u88c5\u7684deb\u5305\u4e0b\u8f7d\u5730\u5740\uff0c\u591a\u4e2a\u5730\u5740\u7528\u201c,\u201d\u9694\u5f00\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff1b \u8303\u56f4\u6807\u7b7e\uff1a\u6267\u884c\u6d4b\u8bd5\u7528\u4f8b\u7684\u6807\u7b7e\u8303\u56f4\uff0c\u5bf9\u5e94\u7528\u4f8b\u4ee3\u7801 csv \u6587\u4ef6\u4e2d\u7684\u6807\u7b7e\u4fe1\u606f\uff0c\u4ee5 pytest \u7684mark\u8bed\u6cd5\u7f16\u5199\uff1b \u7cfb\u7edf\u8bed\u8a00\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u8bed\u8a00\u73af\u5883\uff1b \u5206\u8fa8\u7387\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u5206\u8fa8\u7387\u73af\u5883\uff1b \u955c\u50cf\u5730\u5740\uff1a\u955c\u50cf\u4ed3\u5e93\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u901a\u8fc7 PXE \u88c5\u673a\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u88c5\u673a\u73af\u8282\uff08\u76ee\u524d\u4ec5\u652f\u6301\u90e8\u5206 AMD \u67b6\u6784\u7684\u88c5\u673a\uff09\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2pxe","title":"2\u3001PXE \u88c5\u673a","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/IOS_install/ \u8f93\u5165\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\uff0cIP\uff0c\u5bc6\u7801\uff0c\u955c\u50cf\u5730\u5740\u540e\uff0c\u81ea\u52a8\u88c5\u673a\uff0c\u76ee\u524d\u4ec5\u652f\u6301\u56fa\u5b9a 15 \u7f51\u6bb5\u7684\u90e8\u5206 AMD \u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#3","title":"3\u3001\u6b21\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/all_client_test/ \u8be5\u5165\u53e3\u4e0e\u4e3b\u5165\u53e3\u529f\u80fd\u57fa\u672c\u4e00\u81f4\uff0c\u53ea\u662f\u5265\u79bb\u4e86PXE\u88c5\u673a\u6d41\u7a0b\uff0c\u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7684\u6267\u884c\u6d41\u7a0b\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#4","title":"4\u3001\u73af\u5883\u90e8\u7f72","text":"Jenkins url\uff1ahttps://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/env/build?delay=0sec \u8bbe\u7f6e\u6d4b\u8bd5\u673a\u7684\u7cfb\u7edf\u8bed\u8a00\uff0c\u5206\u8fa8\u7387\u53ca\u5b89\u88c5\u6d4b\u8bd5\u6240\u9700\u7684\u4f9d\u8d56\u5305\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#5","title":"5\u3001\u53d1\u9001\u4ee3\u7801","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/send_code/ \u6839\u636e\u6d4b\u8bd5\u5e94\u7528\u540d\u79f0\uff0c\u62c9\u53d6\u5bf9\u5e94\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u5e76\u6839\u636e\u6d4b\u8bd5\u673a\u4e0a\u5e94\u7528\u7248\u672c\u5207\u6362\u5230\u5bf9\u5e94\u7684tag\u7248\u672c\uff0c\u82e5\u672a\u627e\u5230tag\u7248\u672c\uff0c\u5219\u4f7f\u7528\u6700\u65b0\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u518d\u6839\u636e\u5e94\u7528\u5e93\u4ee3\u7801\u4e2d\u914d\u7f6e\u7684\u57fa\u7840\u5e93\u7248\u672c\uff0c\u62c9\u53d6\u57fa\u7840\u5e93\u4ee3\u7801\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#6","title":"6\u3001\u7528\u4f8b\u6267\u884c","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/run_test/ \u8fd0\u884c\u6d4b\u8bd5\u673a\u4e0a\u7684\u7528\u4f8b"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/","title":"AT \u7528\u4f8b\u7b5b\u9009\u6307\u5317","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u7528\u4f8b\u7b5b\u9009\u6807\u51c6\uff0c\u662f\u6311\u9009\u5408\u9002\u7684\u6587\u672c\u7528\u4f8b\u8fdb\u884c\u81ea\u52a8\u5316\u7528\u4f8b\u8f6c\u5316\u7684\u4e00\u4e9b\u901a\u7528\u6807\u51c6\u3002 \u8fc7\u53bb\u6211\u4eec\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u5b9e\u8df5\u8fc7\u7a0b\u4e2d\uff0c\u5199\u4e86\u4e0d\u5c11\u81ea\u52a8\u5316\u7528\u4f8b\uff0c\u968f\u7740\u9700\u6c42\u7684\u8fed\u4ee3\uff0c\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u81ea\u7136\u8150\u5316\uff0c\u56e0\u800c\u9700\u8981\u5728\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\u5bf9\u81ea\u52a8\u5316\u7528\u4f8b\u8fdb\u884c\u7ef4\u62a4\uff0c\u5728\u7ef4\u62a4\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u6211\u4eec\u53d1\u73b0\uff0c\u6709\u4e9b\u7528\u4f8b\u7ef4\u62a4\u8d77\u6765\u592a\u96be\u4e86\uff0c\u8c03\u8bd5\u7528\u4f8b\u8017\u8d39\u5927\u91cf\u65f6\u95f4\uff0c\u6210\u672c\u5f88\u9ad8\u3002 \u56e0\u6b64\uff0c\u6211\u4eec\u603b\u7ed3\u4e00\u4e9b\u81ea\u52a8\u5316\u7528\u4f8b\u9009\u578b\u7684\u6807\u51c6\uff0c\u4ee5\u4f18\u5316\u540e\u7eed\u81ea\u52a8\u5316\u7528\u4f8b\u7ed3\u6784\uff0c\u671f\u5f85\u6211\u4eec\u80fd\u7f16\u5199\u51fa\u9ad8\u6548\u3001\u7a33\u5b9a\u3001\u6613\u4e8e\u7ef4\u62a4\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_1","title":"\u4e00\u3001\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u53ef\u4ee5\u5206\u4e3a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u548c\u4e13\u9879\u81ea\u52a8\u5316\u6d4b\u8bd5\uff0c\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e00\u822c\u53ea\u9488\u5bf9\u4e00\u4e9b\u5e38\u89c4\u7684\u529f\u80fd\u6d4b\u8bd5\uff0c\u5176\u4ed6\u975e\u5e38\u89c4\u529f\u80fd\u7684\u7528\u4f8b\uff0c\u5e94\u8be5\u91c7\u7528\u4e13\u9879\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u6848\uff1b \u4ee5\u4e0b\u662f\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1","title":"1. \u7a33\u5b9a\u6027\u3001\u538b\u6d4b\u7528\u4f8b","text":"\u7a33\u5b9a\u6027\u6d4b\u8bd5\u3001\u538b\u6d4b\u7528\u4f8b\u5e94\u8be5\u662f\u5c5e\u4e8e\u6027\u80fd\u76f8\u5173\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u5982\uff1a\u53cd\u590d\u591a\u6b21\u70b9\u51fb\u6309\u94ae\uff0c\u68c0\u9a8c\u5176\u529f\u80fd\u7a33\u5b9a\u6027\u3002\u56e0\u4e3a\u8fd9\u4e9b\u7528\u4f8b\u65ad\u8a00\u7684\u9884\u671f\u53ef\u80fd\u4e0d\u662f\u5f88\u660e\u786e\uff0c\u66f4\u6709\u751a\u8005\u4e0d\u9700\u8981\u65ad\u8a00\uff0c\u7528\u4f8b\u65f6\u957f\u6bd4\u8f83\u957f\uff0c\u800c\u4e14\u4e0d\u53ef\u63a7\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u76ee\u524d\u6211\u4eec\u6709\u6027\u80fd\u81ea\u52a8\u5316\u7684\u4e13\u9879\u65b9\u6848\uff0c\u4ee5\u53ca\u4e00\u4e9b\u7a33\u5b9a\u6027\u6d4b\u8bd5\u7684\u4e13\u9879\u65b9\u6848\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u6b64\u7c7b\u7528\u4f8b\u653e\u5230\u4e13\u9879\u81ea\u52a8\u5316\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2","title":"2. \u6d89\u53ca\u591a\u4e2a\u7528\u6237\u64cd\u4f5c","text":"\u5e38\u89c1\u4e0e\u6587\u7ba1\u7684\u7528\u4f8b\u4e2d\uff0c\u591a\u7528\u6237\u64cd\u4f5c\u7684\u7528\u4f8b\u4e00\u822c\u90fd\u4f1a\u6d89\u53ca\u5230\u5728\u7cfb\u7edf\u4e2d\u8fdb\u884c\u591a\u4e2a\u7528\u6237\u95f4\u7684\u5207\u6362\uff0c\u81ea\u52a8\u5316\u811a\u672c\u4e00\u822c\u662f\u8fd0\u884c\u5728\u4e00\u4e2a\u7528\u6237\u7a7a\u95f4\u4e0b\u7684\uff0c\u6240\u4ee5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u591a\u7528\u6237\u95f4\u7684\u5207\u6362\u3002 \u6b64\u7c7b\u4e0d\u5efa\u8bae\u91c7\u7528\u81ea\u52a8\u5316\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3","title":"3. \u4e0e\u5f00\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4ea4\u4e92","text":"\u6b64\u7c7b\u573a\u666f\u591a\u4e3a\u5e94\u7528\u7684\u5f02\u5e38\u573a\u666f\u6d4b\u8bd5\uff0c\u6bd4\u5982\uff1a\u590d\u5236\u5927\u6587\u4ef6\u8fc7\u7a0b\u4e2d\u6ce8\u9500\u673a\u5668\u3002 \u81ea\u52a8\u5316\u811a\u672c\u5728\u7cfb\u7edf\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4e4b\u540e\u662f\u4f1a\u505c\u6b62\u8fd0\u884c\u7684\uff1b\u6b64\u7c7b\u7528\u4f8b\u53ef\u4ee5\u505a\u81ea\u52a8\u5316\uff0c\u4f46\u662f\u540c\u6837\u9700\u8981\u505a\u4e13\u9879\u65b9\u6848\uff0c\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u7684\u5904\u7406\u903b\u8f91\u5b8c\u5168\u4e0d\u540c\u3002 \u540e\u7eed\u81ea\u52a8\u5316\u9700\u8981\u516c\u5173\u7684\u70b9\uff1a \u81ea\u52a8\u5316\u811a\u672c\u5728\u672c\u673a\u8fd0\u884c\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u81f3\u5c11\u9700\u8981\u63d0\u4f9b\u4ee5\u4e0b\u529f\u80fd\uff1a \u91cd\u542f\u4e4b\u540e\u7528\u4f8b\u80fd\u81ea\u52a8\u8fd0\u884c\uff1b\u53ef\u4ee5\u8003\u8651\u5c06\u6267\u884c\u7528\u4f8b\u5199\u6210\u4e00\u4e2a\u5f00\u673a\u81ea\u542f\u7684\u670d\u52a1\uff1b \u80fd\u8bb0\u5f55\u5173\u673a\u4e4b\u524d\u7528\u4f8b\u6267\u884c\u7684\u4f4d\u7f6e\uff0c\u91cd\u542f\u4e4b\u540e\u80fd\u4ece\u6b64\u4f4d\u7f6e\u5f00\u59cb\u6267\u884c\uff1b \u50cf\u6027\u80fd\u81ea\u52a8\u5316\u4e00\u6837\uff0c\u7531\u670d\u52a1\u7aef\u63a7\u5236\uff1b \u5b8c\u5168\u57fa\u4e8e\u56fe\u5f62\u8bc6\u522b\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u4e32\u53e3\u7ebf\u63a7\u5236\u952e\u9f20\u7a33\u5b9a\u6027\uff1b "},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4","title":"4. \u6d4b\u8bd5\u6267\u884c\u65f6\u95f4\u957f","text":"\u7528\u4f8b\u6267\u884c\u65f6\u95f4\u63a7\u5236\u57282\u5206\u949f\u4ee5\u5185\uff0c\u6781\u7aef\u60c5\u51b5\u4e0d\u8981\u8d85\u8fc75\u5206\u949f\uff0c\u6240\u6709\u7528\u4f8b\u7684\u5e73\u5747\u65f6\u957f\u5e94\u8be5\u57281\u5206\u949f\u5de6\u53f3\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u95f4\u592a\u957f\uff0c\u7f16\u5199\u7528\u4f8b\u3001\u8c03\u8bd5\u7528\u4f8b\u3001\u6267\u884c\u7528\u4f8b\u3001\u7ef4\u62a4\u7528\u4f8b\u90fd\u975e\u5e38\u7684\u8017\u65f6\uff0c\u4eba\u529b\u6210\u672c\u65f6\u95f4\u6210\u672c\u6295\u5165\u592a\u9ad8\u3002 \u4f60\u60f3\uff0c\u8fd9\u6761\u7528\u4f8b\u6267\u884c\u9700\u89815\u5206\u949f\uff0c\u90a3\u4f60\u5199\u8fd9\u6761\u7528\u4f8b\u7684\u65f6\u95f4\u4e0d\u53ef\u80fd\u4e00\u904d\u8fc7\uff0c\u5199\u7684\u8fc7\u7a0b\u4e2d\u8dd1\u4e0d\u901a\u8fd8\u5f97\u91cd\u8dd1\u81f3\u5c1115\u5206\u949f\u4e0d\u8fc7\u5206\uff0c\u5199\u5b8c\u4e86\u8fd8\u5f97\u5728\u5176\u4ed6\u67b6\u6784\u4e0a\u8c03\u8bd5\uff0c\u534a\u4e2a\u5c0f\u65f6\u8fc7\u53bb\u4e86\uff0c\u8fd9\u8fd8\u53ea\u662f\u7b2c\u4e00\u6b21\u5199\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u540e\u7eed\u5982\u679c\u7528\u4f8b\u7ef4\u62a4\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u7ecf\u5e38\u6295\u5165\u76f8\u5f53\u957f\u65f6\u95f4\uff0c\u8fd9\u6837\u5176\u5b9e\u662f\u5931\u53bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u7684\u3002\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u5c31\u5e94\u8be5\u662f\u5feb\u51c6\u72e0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5","title":"5. \u8fb9\u7f18\u6027\u6d4b\u8bd5","text":"\u6709\u4e9b\u529f\u80fd\u6a21\u5757\u672c\u8eab\u662f\u5c5e\u4e8e\u6bd4\u8f83\u8fb9\u7f18\u6027\u7684\uff0c\u5373\u6781\u5c11\u7528\u6237\u4f1a\u4f7f\u7528\u5230\u7684\u529f\u80fd\uff0c\u8fd9\u7c7b\u529f\u80fd\u6a21\u5757\u4e0d\u9700\u8981\u5927\u89c4\u6a21\u5b9e\u73b0\u81ea\u52a8\u5316\uff0c\u4e00\u4e24\u4e2a\u573a\u666f\u8986\u76d6\u57fa\u672c\u529f\u80fd\u5c31\u884c\u4e86\uff0c\u56e0\u6b64\u6211\u4eec\u5728\u6311\u9009\u6b64\u7c7b\u7528\u4f8b\u7684\u65f6\u5019\u53ef\u4ee5\u7ed3\u5408\u6574\u4e2a\u529f\u80fd\u6a21\u5757\u7684\u8986\u76d6\u60c5\u51b5\u6765\u51b3\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6","title":"6. \u9700\u8981\u4f9d\u8d56\u4eba\u5de5\u4ecb\u5165\u7684","text":"\u81ea\u52a8\u5316\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\u662f\u6ca1\u6709\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bd4\u5982\u8981\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u90a3\u4e48\u5c31\u80cc\u79bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u3002 \u6bd4\u5982\u5149\u9a71\u6a21\u5757\uff0c\u5149\u9a71\u523b\u5f55\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u4f46\u662f\u5149\u9a71\u523b\u5f55\u4e4b\u540e\u5149\u76d8\u4f1a\u5f39\u51fa\u6765\uff0c\u9700\u8981\u4eba\u5de5\u66f4\u6362\u5149\u76d8\uff0c\u518d\u624b\u52a8\u63a8\u8fdb\u5149\u9a71\u4e2d\u3002 \u8fd9\u79cd\u529f\u80fd\u6a21\u5757\u5373\u4f7f\u505a\u81ea\u52a8\u5316\uff0c\u80fd\u6d89\u53ca\u5230\u7684\u529f\u80fd\u975e\u5e38\u6709\u9650\uff0c\u800c\u4e14\u4e0d\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u6240\u4ee5\u660e\u663e\u5c31\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7","title":"7. \u96be\u4ee5\u5b9e\u73b0\u7684","text":"\u7528\u4f8b\u6240\u6d89\u53ca\u5230\u7684\u65b9\u6cd5\u5b9e\u73b0\u8d77\u6765\u53ef\u80fd\u6709\u96be\u5ea6\uff0c\u751a\u81f3\u73b0\u9636\u6bb5\u65e0\u6cd5\u5b9e\u73b0\u7684\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002 \u6bd4\u5982\u5f71\u9662\u6d4b\u8bd5\u753b\u9762\u6e05\u6670\u5ea6\u3001\u6d41\u7545\u5ea6\u3001\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u4e4b\u540e\u7684\u89c6\u9891\u662f\u5426\u5b58\u5728\u5361\u987f\u7b49\u7528\u4f8b\uff0c\u73b0\u9636\u6bb5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#8","title":"8. \u529f\u80fd\u4e0d\u7a33\u5b9a","text":"\u8fd9\u4e2a\u4e0d\u662f\u8bf4\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\uff0c\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\u4e0d\u7a33\u5b9a\u662f\u6b63\u5e38\u7684\uff0c\u8fd9\u79cd\u6211\u4eec\u53ef\u4ee5\u7b49\u5f00\u53d1\u63d0\u6d4b\u4e4b\u540e\u518d\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u3002 \u529f\u80fd\u4e0d\u7a33\u5b9a\u6307\u7684\u662f\u7528\u4f8b\u6240\u6d89\u53ca\u7684\u529f\u80fd\uff0c\u53ef\u80fd\u5b58\u5728\u591a\u79cd\u53d8\u5316\uff0c\u6bcf\u6b21\u6267\u884c\u7528\u4f8b\u53ef\u80fd\u65ad\u8a00\u7684\u9884\u671f\u90fd\u4e0d\u540c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#9","title":"9. \u52a8\u6001\u65ad\u8a00","text":"\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u76f4\u5230\u7528\u4f8b\u7ed3\u675f\uff0c\u4e00\u76f4\u662f\u4e00\u4e2a\u52a8\u6001\u53d8\u5316\u7684\u8fc7\u7a0b\uff0c\u800c\u4e14\u65e0\u6cd5\u901a\u8fc7\u5176\u4ed6\u624b\u6bb5\u505c\u4e0b\u6765\uff1b \u6bd4\u5982\uff1a\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u65f6\uff0c\u53f3\u4e0b\u89d2\u7684\u5f55\u5236\u65f6\u95f4\u662f\u4e00\u76f4\u5728\u53d8\u5316\u7684\uff0c\u7528\u4f8b\u9700\u8981\u6d4b\u8bd5\u5f55\u52361\u5206\u949f\u4e4b\u540e\uff0c\u5f55\u5236\u65f6\u95f4\u662f\u521a\u597d\u505c\u572860\u79d2\uff1b \u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fd8\u505a\u4e0d\u5230\u65f6\u95f4\u7cbe\u51c6\u63a7\u5236\uff0c\u7a0b\u5e8f\u6267\u884c\u65f6\u95f4\u662f\u6709\u6ce2\u52a8\u7684\uff0c\u800c\u4e14\u8981\u9002\u914d\u591a\u4e2a\u5e73\u53f0\uff0c\u6240\u4ee5\u6b64\u7c7b\u7528\u4f8b\u5927\u6982\u7387\u4f1a\u6267\u884c\u5931\u8d25\u3002\u7279\u522b\u662f\u5728\u6027\u80fd\u8f83\u5dee\u7684\u56fd\u4ea7\u5316\u67b6\u6784\u4e0a\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u592a\u53ef\u80fd\u7a33\u5b9a\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#10","title":"10. \u63a2\u7d22\u6027\u6d4b\u8bd5","text":"\u63a2\u7d22\u6027\u6d4b\u8bd5\u901a\u5e38\u662f\u4e00\u4e9b\u4e0d\u786e\u5b9a\u7684\u64cd\u4f5c\uff0c\u591a\u53d8\u5207\u590d\u6742\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u9884\u671f\u4e5f\u53ef\u80fd\u662f\u4e0d\u786e\u5b9a\u7684\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u9a9a\u64cd\u4f5c\u592a\u591a\u4e86\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6b64\u7c7b\u7528\u4f8b\u9002\u5408\u91c7\u7528\u624b\u5de5\u6d4b\u8bd5\uff0c\u662f\u624b\u5de5\u6d4b\u8bd5\u771f\u6b63\u7684\u4ef7\u503c\u4f53\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#11","title":"11. \u6613\u7528\u6027\u6d4b\u8bd5","text":"\u5bf9\u4e8e\u6613\u7528\u6027\u7684\u5224\u65ad\u901a\u5e38\u662f\u4e3b\u89c2\u7684\uff0c\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\u5f88\u96be\u53bb\u5b9a\u4e49\u4ec0\u4e48\u6837\u7684\u60c5\u51b5\u5bf9\u7528\u6237\u662f\u6613\u7528\u7684\uff0c\u81ea\u52a8\u5316\u9700\u8981\u6709\u660e\u786e\u7684\u53ef\u5b9e\u73b0\u7684\u9884\u671f\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_2","title":"\u4e8c\u3001\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u524d\u9762\u8bb2\u4e86\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u4e00\u4e9b\u7528\u4f8b\u60c5\u51b5\uff0c\u6709\u540c\u5b66\u5c31\u8bf4\u4e86\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\u4e0d\u7528\u8bb2\u4e86\uff0c\u5c31\u662f\u4e0d\u9002\u5408\u7684\u53cd\u9762\u3002\u6ca1\u6bdb\u75c5\u54c8\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\uff0c\u6211\u4eec\u5927\u4f53\u8fd8\u53ef\u4ee5\u5206\u4e3a\u4e24\u7c7b\uff1a \u7b2c\u4e00\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u597d\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u7b2c\u4e8c\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u4e00\u822c\uff0c\u9700\u8981\u6295\u5165\u66f4\u591a\u7cbe\u529b\u624d\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u4ee5\u4e0b\u4ecb\u7ecd\u4e00\u4e9b\u6211\u4eec\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1_1","title":"1. \u64cd\u4f5c\u76f8\u5bf9\u7b80\u5355","text":"\u7528\u4f8b\u6b65\u9aa4\u76f8\u5bf9\u8f83\u5c11\uff0c\u8fd9\u79cd\u7528\u4f8b\u901a\u5e38\u662f\u4e00\u4e9b\u8def\u5f84\u5f88\u6d45\u7684\u7528\u4f8b\uff0c\u4e00\u822c\u4e5f\u662f\u4e00\u4e9b\u57fa\u7840\u7528\u4f8b\u3002\u7528\u4f8b\u7f16\u5199\u3001\u7ef4\u62a4\u90fd\u53ef\u4ee5\u8f7b\u677e\u641e\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2_1","title":"2. \u5bb9\u6613\u5b9e\u73b0","text":"\u73b0\u6709\u6280\u672f\u662f\u53ef\u5b9e\u73b0\u7684\uff0c\u6ca1\u6709\u96be\u5ea6\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3_1","title":"3. \u7ecf\u5e38\u7528\u4e8e\u56de\u5f52\u6d4b\u8bd5","text":"\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bcf\u6b21\u56de\u5f52\u6d4b\u8bd5\u5fc5\u987b\u8981\u6267\u884c\u7684\u7528\u4f8b\uff0c\u90a3\u4e48\u8fd9\u6761\u7528\u4f8b\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u3002 \u56de\u5f52\u6d4b\u8bd5\u65f6\u6211\u4eec\u9996\u5148\u5e94\u8be5\u4fdd\u8bc1\u5e94\u7528\u5386\u53f2\u57fa\u672c\u529f\u80fd\u6b63\u5e38\uff0c\u6240\u4ee5\u90a3\u4e9b\u6bcf\u6b21\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u90fd\u8981\u6267\u884c\u7684\u7528\u4f8b\u9002\u5408\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4_1","title":"4. \u529f\u80fd\u7a33\u5b9a\u7684\u6838\u5fc3\u529f\u80fd","text":"\u6d89\u53ca\u6838\u5fc3\u529f\u80fd\u7684\u7528\u4f8b\u662f\u6700\u6700\u91cd\u8981\u7684\u7528\u4f8b\uff0c\u4e5f\u662f\u6211\u4eec\u4ea4\u4ed8\u65f6\u5fc5\u987b\u8981\u4fdd\u8bc1\u8d28\u91cf\u7684\u76f8\u5173\u529f\u80fd\uff0c\u56e0\u6b64\u5e94\u8be5\u5c3d\u53ef\u80fd\u7684\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5_1","title":"5. \u8f93\u5165\u6570\u636e\u6d4b\u8bd5","text":"\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u901a\u5e38\u662f\u68c0\u9a8c\u88ab\u6d4b\u5e94\u7528\u63a5\u53d7\u6709\u6548\u6570\u636e\u3001\u62d2\u7edd\u65e0\u6548\u6570\u636e\u7684\u80fd\u529b\u3002\u5982\uff1a\u63d0\u4ea4\u8d85\u957f\u5b57\u7b26\u4e32\u3001\u7279\u6b8a\u5b57\u7b26\u4e32\u7b49\u7b49\u3002 \u6b64\u7c7b\u7528\u4f8b\u624b\u5de5\u6d4b\u8bd5\u5f88\u96be\u6bd4\u8f83\u5168\u9762\u7684\u8986\u76d6\u5230\u6240\u6709\u7684\u8f93\u5165\u60c5\u51b5\uff0c\u4f46\u662f\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\uff0c\u6b64\u7c7b\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u90fd\u662f\u4e00\u6837\u7684\uff0c\u53d8\u5316\u7684\u4ec5\u662f\u8f93\u5165\u53c2\u6570\u548c\u65ad\u8a00\u7ed3\u679c\uff0c\u91c7\u7528\u6570\u636e\u9a71\u52a8\uff0c\u53ef\u4ee5\u8f7b\u677e\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6_1","title":"6. \u683c\u5f0f\u8986\u76d6","text":"\u539f\u56e0\u540c\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u7c7b\u7528\u4f8b\u4e00\u6837\uff0c\u591a\u79cd\u683c\u5f0f\u7684\u8986\u76d6\u4e5f\u662f\u4e00\u4e2a\u5f88\u7e41\u7410\u7684\u4e8b\u60c5\uff0c\u4ea4\u7ed9\u81ea\u52a8\u5316\u6765\u505a\u518d\u5408\u9002\u4e0d\u8fc7\u4e86\u3002 \u6bd4\u5982\u5f71\u9662\u5bf9\u5f71\u7247\u683c\u5f0f\u7684\u68c0\u67e5\u3001\u622a\u56fe\u5f55\u5c4f\u5bf9\u4fdd\u5b58\u683c\u5f0f\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7_1","title":"7. \u68c0\u67e5\u5143\u7d20\u72b6\u6001","text":"\u67e5\u770b\u88ab\u6d4b\u5e94\u7528\u7684\u5143\u7d20\u5c5e\u6027\u3002\u5982\uff1a\u56fe\u7247\u7684\u5927\u5c0f\u548c\u6392\u5217\uff1b\u6309\u94ae\u7684\u53ef\u7528\u548c\u4e0d\u53ef\u7528\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/","title":"AT \u7ecf\u9a8c\u603b\u7ed3","text":"\u6b22\u8fce\u6240\u6709\u4eba\u63d0\u4ea4\u4f60\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u9762\u7684\u4f18\u79c0\u5b9e\u8df5\u7ecf\u9a8c\uff0c\u4ee5\u5e2e\u52a9\u5927\u5bb6\u89e3\u51b3\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#1","title":"1\u3001\u7ec8\u7ed3\u5668","text":"# litaoa@uniontech.com\n \u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4 pytest \u5b9e\u73b0\u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4\u7684\u65b9\u5f0f\u6709\u4e24\u79cd\uff0cyield \u548c\u7ec8\u7ed3\u51fd\u6570\uff1b yield \u5b9e\u73b0\uff0cyield\u524d\u9762\u4e3a\u7528\u4f8b\u7684\u524d\u7f6e\u6b65\u9aa4\uff0cyield \u540e\u9762\u4e3a\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4\u3002 @pytest.fixture\ndef clean_env():\nprint(\"setup\")\nyield\nprint(\"teardown\")\n \u7ec8\u7ed3\u51fd\u6570\u5b9e\u73b0\uff0c\u4f7f\u7528 request.addfinalizer \u6ce8\u518c\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4 @pytest.fixture\ndef clean_env(request):\ndef clean():\nprint(\"teardown\")\nrequest.addfinalizer(clean)\nprint(\"setup\")\n yield\u7684\u4f18\u7f3a\u70b9\uff1a \u4f18\u70b9\uff1a\u4ee3\u7801\u7b80\u6d01\uff0c\u76f4\u89c2\uff0c\u53ef\u4f7f\u7528yield\u5728\u7528\u4f8b\u4e2d\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c \u7f3a\u70b9\uff1a\u82e5\u524d\u7f6e\u6b65\u9aa4\u4e2d\u51fa\u73b0\u9519\u8bef\uff0c\u5219\u540e\u7f6e\u6b65\u9aa4\u4e0d\u4f1a\u6267\u884c \u7ec8\u7ed3\u51fd\u6570\uff1a \u4f18\u70b9\uff1a\u524d\u7f6e\u6b65\u9aa4\u5931\u8d25\u7684\u8bdd\uff0c\u540e\u7f6e\u6b65\u9aa4\u4ecd\u4f1a\u6267\u884c\u4e14\u53ef\u4ee5\u6ce8\u518c\u591a\u4e2a\u540e\u7f6e\u6b65\u9aa4\uff08\u524d\u63d0\uff1a\u9700\u8981\u5728\u4ee3\u7801\u62a5\u9519\u4e4b\u524d\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff09\uff0c\u652f\u6301\u7075\u6d3b\u4f7f\u7528\u540e\u7f6e\u6761\u4ef6 \u7f3a\u70b9\uff1a\u4ee3\u7801\u8f83\u4e3a\u590d\u6742\uff0c\u65e0\u6cd5\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c\uff08\u672c\u4eba\u76ee\u524d\u672a\u5b9e\u73b0\uff09 \u603b\u7ed3\uff1a\u5728\u524d\u7f6e\u6b65\u9aa4\u4fdd\u8bc1\u7edd\u5bf9\u4e0d\u4f1a\u51fa\u9519\u65f6\uff0c\u4f7f\u7528yield\u66f4\u4f73\u7b80\u4fbf\uff0c\u5f53\u524d\u7f6e\u6b65\u9aa4\u6613\u51fa\u73b0\u95ee\u9898\u65f6\uff0c\u63a8\u8350\u4f7f\u7528\u7ec8\u7ed3\u51fd\u6570\u3002 \u573a\u666f\uff1a\u4fdd\u9669\u7bb1\u7528\u4f8b\uff0c\u524d\u7f6e\u6b65\u9aa4\u4e2d\u5f00\u542f\u4fdd\u9669\u7bb1\uff0c\u540e\u7f6e\u6b65\u9aa4\u5220\u9664\u4fdd\u9669\u7bb1\u3002 @pytest.fixture(scope=\"session\", autouse=True)\ndef vault_fixture(request):\nDfmWidget.reset_vault_by_cmd() # 1\u3001\u91cd\u7f6e\u4fdd\u9669\u7bb1\nDdeDockPublicWidget().close_file_manager_by_cmd() # 2\u3001\u5173\u95ed\u6587\u7ba1\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 3\u3001\u5f00\u542f\u6587\u7ba1\nvault = DfmWidget()\nvault.create_file_vault() # 4\u3001\u521b\u5efa\u4fdd\u9669\u7bb1\ndef delete_vault(): # 8\u3001\u5220\u9664\u4fdd\u9669\u7bb1\u7684\u540e\u7f6e\u6b65\u9aa4\nsleep(2)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr()\nvault = DfmWidget()\nvault.delete_file_vault()\nDfmWidget.reset_vault_by_cmd()\nDdeDockPublicWidget().close_file_manager_by_cmd()\nrequest.addfinalizer(delete_vault) # 5\u3001\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\nDdeDockPublicWidget().close_file_manager_by_cmd() # 6\u3001\u5173\u95ed\u6587\u7ba1\nsleep(1)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 7\u3001\u5f00\u542f\u6587\u7ba1\n \u4ee3\u7801\u6309\u6ce8\u91ca\u4e2d\u7684\u5e8f\u53f7\u6267\u884c\u6b65\u9aa4 \u4ee3\u7801\u5728\u6b65\u9aa41-4\u4efb\u610f\u4f4d\u7f6e\u62a5\u9519\uff0c\u5219\u4e0d\u4f1a\u6267\u884c\u6b65\u9aa48\uff0c\u56e0\u4e3a\u672a\u6267\u884c\u5230\u6b65\u9aa45\uff0c\u6b65\u9aa48\u8fd8\u672a\u6ce8\u518c \u4ee3\u7801\u5728\u6b65\u9aa46-7\u62a5\u9519\uff0c\u4ecd\u4f1a\u6267\u884c\u6b65\u9aa47\uff0c\u56e0\u4e3a\u5728\u6b65\u9aa45\u4e2d\u5df2\u7ecf\u5c06\u6b65\u9aa47\u6ce8\u518c \u53ef\u4ee5\u7075\u6d3b\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff0c\u80fd\u5b9e\u73b0\u67d0\u4e2a\u524d\u7f6e\u6b65\u9aa4\u6267\u884c\u4e4b\u540e\uff0c\u624d\u4f1a\u6267\u884c\u540e\u7f6e\u6b65\u9aa4\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#2","title":"2\u3001\u542f\u52a8\u5e94\u7528\u7684\u65b9\u5f0f","text":"# huangmingqiang@uniontech.com\n \uff081\uff09\u547d\u4ee4\u884c\u542f\u52a8 \u5728 AT \u4ee3\u7801\u4e2d\u4f7f\u7528\u547d\u4ee4\u884c\u542f\u52a8\u5e94\u7528\uff0c\u4e3e\u4f8b\uff1a os.popen(\"deepin-music\")\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f7f\u7528 ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6\uff0cdogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u3002 \uff082\uff09\u901a\u8fc7 UI \u64cd\u4f5c\u542f\u52a8 \u901a\u8fc7\u4efb\u52a1\u680f\u3001\u542f\u52a8\u5668\u3001\u684c\u9762\u7b49UI\u65b9\u5f0f\u542f\u52a8\uff0c\u6bd4\u5982\u53cc\u51fb\u6253\u5f00\u3001\u53f3\u952e\u6253\u5f00\u7b49\uff0c\u8fd9\u79cd\u64cd\u4f5c\u65b9\u5f0f\u4e0d\u5b58\u5728ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6dogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u7684\u95ee\u9898\uff0c\u4e5f\u66f4\u52a0\u7b26\u5408\u7528\u6237\u7684\u64cd\u4f5c\u884c\u4e3a\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#3","title":"3\u3001\u6587\u4ef6\u9009\u62e9\u6846\u5c5e\u6027\u5b9a\u4f4d\u5076\u73b0\u65e0\u6cd5\u627e\u5230","text":"\u6587\u4ef6\u9009\u62e9\u6846\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5728\u8c03\u7528\u6587\u4ef6\u9009\u62e9\u6846\u65f6\uff0c\u6709\u4e00\u5b9a\u7684\u6982\u7387\u51fa\u73b0\uff0c\u754c\u9762\u5df2\u7ecf\u6e32\u67d3\u51fa\u6765\u4e86\uff0c\u4f46\u662f\u5c5e\u6027\u6811\u5e76\u6ca1\u6709\u5199\u5165\uff0c\u5bfc\u81f4\u901a\u8fc7\u5c5e\u6027\u65e0\u6cd5\u627e\u5230\u5143\u7d20\uff0c\u76ee\u524d\u4e5f\u6ca1\u6709\u5f88\u597d\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u4e3a\u4e86\u7528\u4f8b\u7a33\u5b9a\u6027\uff0c\u6587\u4ef6\u9009\u62e9\u6846\u7684\u64cd\u4f5c\u5efa\u8bae\u4f7f\u7528UI\u6216\u8005\u56fe\u7247\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u53ef\u4ee5\u901a\u8fc7\u641c\u7d22\u5185\u5bb9\u56fa\u5b9a\u6587\u4ef6\u4f4d\u7f6e\u3002 # litaoa@uniontech.com\n desk = DdeDesktopPublicWidget()\n# \u9009\u62e9\u89c6\u9891\u76ee\u5f55\ndesk.click_videos_dir_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.ctrl_f()\nsleep(1)\ndesk.input_message(\"\u5143\u7d20\u540d\u79f0\")\nsleep(0.5)\ndesk.enter()\nsleep(1)\n# \u9009\u62e9\u7b2c\u4e00\u4e2a\u6587\u4ef6\ndesk.click_list_view_btn_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.click_first_file_in_desktop_plugs_by_ui()\nsleep(1)\n# \u6587\u7ba1\u63d2\u4ef6\u4e2d\u70b9\u51fb\u6253\u5f00\ndesk.click_open_btn_in_desktop_plugs_by_ui()\n"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#4","title":"4\u3001\u5e94\u7528\u542f\u52a8","text":"# mikigo\n \u5728UI\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u4e00\u5207\u64cd\u4f5c\u7684\u90fd\u662f\u4ece\u5e94\u7528\u542f\u52a8\u5f00\u59cb\u7684\uff0c\u800c\u5728Linux\u684c\u9762\u5e94\u7528\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u6211\u4eec\u542f\u52a8\u5e94\u7528\u7684\u65b9\u6cd5\u6709\u591a\u79cd\uff0c\u4e0b\u9762\u505a\u4e00\u4e2a\u7b80\u5355\u7684\u4ecb\u7ecd\uff1a \u3010\u4f7f\u7528dogtail\u542f\u52a8\u3011 dogtail\u63d0\u4f9b\u4e86\u5e94\u7528\u542f\u52a8\u7684\u65b9\u6cd5\uff0c\u5728utils\u5e93\u4e2d\uff0c\u4f7f\u7528run\u65b9\u6cd5\u542f\u52a8\uff1a \u9996\u5148\u5bfc\u5165\u65b9\u6cd5\uff1a from dogtail.utils import *\n \u8c03\u7528run\u65b9\u6cd5 run('deepin-music')\n \u5373\u53ef\u542f\u52a8\u97f3\u4e50 \u8fd9\u79cd\u65b9\u6cd5\u7684\u4f18\u70b9\u662f\u91c7\u7528\u8fdb\u7a0b\u7684\u65b9\u5f0f\u76f4\u63a5\u542f\u52a8\uff0c\u4e0d\u4f9d\u8d56\u4e0eUI\uff0c\u65e0\u8bba\u684c\u9762\u6216\u4efb\u52a1\u680f\u4e0a\u662f\u5426\u5b58\u5728\u5e94\u7528\u56fe\u6807\uff0c\u90fd\u53ef\u4ee5\u6b63\u5e38\u542f\u52a8\u3002 \u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c \u5982\u679c\u4f7f\u7528ssh\u8fdc\u7a0b\u8c03\u7528\uff0c\u6216\u8005Jenkins\u4e2d\u6267\u884c\u6d4b\u8bd5\u811a\u672c\u7684\u65f6\u5019\uff0c\u5728sniff\u4e2d\u4f1a\u51fa\u73b0\u627e\u4e0d\u5230\u5e94\u7528\uff0c\u7ecf\u8fc7\u5206\u6790\uff0c\u53ef\u80fd\u662f\u56e0\u4e3a\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\u542f\u52a8\u7684\u65f6\u5019\uff0c\u5b9e\u9645\u662f\u91c7\u7528\u4e00\u4e2a\u5b50\u8fdb\u7a0b\u542f\u52a8\u4e86\u5e94\u7528\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u5230\u3002 \u3010\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u3011 \u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807 \u901a\u5e38\u6709\u4e24\u79cd\u65b9\u6cd5\uff1a \uff081\uff09\u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807\u3002 \uff082\uff09\u5df2\u77e5\u5e94\u7528\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u7684\u4f4d\u7f6e\uff0c\u7136\u540e\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u5bf9\u5e94\u5750\u6807\u3002 \u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u7f3a\u70b9\u662f\u4f4d\u7f6e\u5fc5\u987b\u56fa\u5b9a\uff0c\u5982\u679c\u79fb\u52a8\u4f4d\u7f6e\u5c31\u4e0d\u884c\u4e86\uff0c\u800c\u4f7f\u7528\u7b2c\u4e00\u79cd\u65b9\u6cd5\uff0c\u65e0\u8bba\u4f4d\u7f6e\u5728\u54ea\u91cc\uff0c\u53ea\u8981\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u5b58\u5728\u5373\u53ef\u3002 \u3010\u70b9\u51fb\u684c\u9762\u56fe\u6807\u542f\u52a8\u3011 \u684c\u9762\u56fe\u6807\u76ee\u524d\u662f\u91c7\u7528\u56fe\u50cf\u8bc6\u522b\u6280\u672f\uff0c\u5b9a\u4f4d\u5230\u5e94\u7528\u56fe\u6807\u7684\u5750\u6807\uff0c\u7136\u540e\u901a\u8fc7pyauogui\u8fdb\u884c\u70b9\u51fb\u64cd\u4f5c\u3002 \u8be6\u7ec6\u6280\u672f\u65b9\u6848\u53ef\u4ee5\u53c2\u8003\u6211\u7684\u53e6\u5916\u4e24\u7bc7\u535a\u5ba2: \u57fa\u4e8eopencv\u7684\u6a21\u677f\u5339\u914d\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd4\u56de\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 Python\u4e09\u65b9\u5e93PyAutoGui\u7684\u4f7f\u7528\u65b9\u6cd5 \u3010\u4ece\u542f\u52a8\u5668\u542f\u52a8\uff08\u4fd7\u79f0\u5f00\u59cb\u83dc\u5355\uff09\u3011 \u542f\u52a8\u4e2d\u542f\u52a8\u7684\u5b9e\u73b0\u903b\u8f91\u5b9e\u9645\u548c\u4efb\u52a1\u680f\u4e0a\u542f\u52a8\u5dee\u4e0d\u591a\u3002 \u9996\u5148\uff0c\u9700\u8981\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u542f\u52a8\u5668\u56fe\u6807\uff0c\u6216\u8005\u952e\u76d8super\u952e\uff0c\u5c06\u542f\u52a8\u5668\u547c\u51fa\u6765\uff0c \u7136\u540e\uff0c\u5728\u542f\u52a8\u5668\u4e2d\u70b9\u51fb\u5bf9\u5e94\u7684\u56fe\u6807\uff0c \u4f46\u662f\u8fd9\u91cc\u6709\u4e2a\u95ee\u9898\uff0c\u542f\u52a8\u5668\u4e2d\u7684\u5e94\u7528\u5217\u8868\uff0c\u4e00\u9875\u5c55\u793a\u4e0d\u5b8c\uff0c\u6240\u4ee5\u5982\u679c\u6211\u4eec\u8981\u70b9\u51fb\u7684\u5e94\u7528\u56fe\u6807\u4e0d\u5728\u7b2c\u4e00\u9875\u600e\u4e48\u529e\uff0c\u901a\u5e38\u89e3\u51b3\u65b9\u6848\u6709\u4e24\u79cd\uff1a \uff081\uff09\u9700\u8981\u8fdb\u884c\u5411\u4e0b\u6ed1\u52a8\uff0c\u8fd9\u91cc\u5c31\u6d89\u53ca\u5230\u76f8\u5e94\u7684\u8bc6\u522b\u65b9\u6848\uff0c\u5224\u65ad\u5982\u679c\u4e0d\u5728\u7b2c\u4e00\u9875\u5c31\u5f80\u4e0b\u6ed1\u52a8\u7ffb\u9875\u3002 \uff082\uff09\u542f\u52a8\u5668\u63d0\u4f9b\u641c\u7d22\u7684\u529f\u80fd\uff0c\u8f93\u5165\u5e94\u7528\u540d\u79f0\u641c\u7d22\uff0c\u7136\u540e\u8fdb\u884c\u70b9\u51fb\u3002 \u4ece\u5b9e\u9645\u64cd\u4f5c\u4e2d\u6765\u770b\uff0c\u91c7\u7528\u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u6548\u7387\u4f1a\u9ad8\u4e00\u70b9\u3002 \u3010\u7ec8\u7aef\u547d\u4ee4\u542f\u52a8\u3011 \u5728python\u4e2d\uff0c\u4f7f\u7528os.popen()\u6216os.system()\u6216\u8005subprocess.Popen()\uff0c\u5b9e\u73b0\u547d\u4ee4\u884c\u542f\u52a8\uff0c\u6bd4\u5982\uff1a import os\nos.popen('deepin-music')\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u8fdc\u7a0b\u6267\u884c\u811a\u672c\u7684\u65f6\u5019\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u7684\u95ee\u9898\u3002 \u3010\u603b\u7ed3\u3011 \u4ee5\u4e0a\u51e0\u79cd\u65b9\u6cd5\uff0c\u5404\u6709\u4f18\u7f3a\u70b9\uff0c\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff1a \uff081\uff09\u5982\u679c\u9700\u8981\u5728Jenkins\u4e2d\u505a\u6301\u7eed\u96c6\u6210\uff0c\u5efa\u8bae\u4f7f\u7528\u7b2c\u4e8c\u79cd\u4efb\u52a1\u680f\u542f\u52a8\u7684\u65b9\u6cd5\u3002 \uff082\uff09\u5982\u679c\u4e0d\u4f1a\u91c7\u7528\u8fdc\u7a0b\u6267\u884c\u7684\uff0c\u5efa\u8bae\u91c7\u7528\u7b2c\u4e00\u79cd\u6216\u8005\u6700\u540e\u4e00\u79cd\u65b9\u6848\u3002 \uff083\uff09\u7b2c\u4e09\u79cd\u548c\u7b2c\u56db\u79cd\u542f\u52a8\u65b9\u6cd5\uff0c\u901a\u5e38\u5728\u6d4b\u8bd5\u7528\u4f8b\u4e2d\u4f1a\u6d89\u53ca\u5230\uff0c\u6240\u4ee5\u5076\u5c14\u4f1a\u7528\u3002"},{"location":"RELEASE/","title":"\u7248\u672c\u66f4\u65b0\u8bb0\u5f55","text":""},{"location":"RELEASE/#220202395","title":"2.2.0\uff082023/9/5\uff09","text":"new \u6b63\u5f0f\u542f\u7528 letmego \u6280\u672f\u65b9\u6848\uff1b fix \u5bf9 docs \u91cc\u9762\u7ec6\u5316\u4e86\u8fdc\u7a0b\u6267\u884c\u7ae0\u8282\u7684\u63cf\u8ff0\uff1b "},{"location":"RELEASE/#2152023831","title":"2.1.5\uff082023/8/31\uff09","text":"new \u5c06\u6709\u8da3\u7684\u6587\u6863\u7cfb\u7edf\u8fc1\u79fb\u5230 linuxdeepin \uff0c\u5265\u79bb\u6587\u6863\u4e2d\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u91c7\u7528 CDN \u52a0\u901f\u65b9\u5f0f\u52a0\u8f7d\uff1b \u5c1d\u8bd5\u5408\u5165\u4e00\u4e2a\u6709\u8da3\u7684\u529f\u80fd\uff1b fix \u4fee\u590d\u4e86 Wayland \u952e\u9f20\u5de5\u5177\u6ca1\u6709\u9f20\u6807\u76f8\u5bf9\u79fb\u52a8\u65b9\u6cd5 moveRel \u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 Wayland \u4e0b\u83b7\u53d6\u7a97\u53e3\u4fe1\u606f\u529f\u80fd\u6a21\u5757\u4e2d\u73af\u5883\u53d8\u91cf\u7684\u95ee\u9898\uff1b \u4f18\u5316\u4e86 startproject \u529f\u80fd\u7684\u4e00\u4e9b\u4fe1\u606f\u8f93\u51fa\uff1b \u4fee\u590d\u4e86\u7279\u6b8a\u573a\u666f\u4e0b env_dev.sh \u5f00\u53d1\u73af\u5883\u90e8\u7f72\u662f\u53ef\u80fd\u5f71\u54cd\u5230\u6b63\u5f0f\u73af\u5883 env.sh \u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#2122023822","title":"2.1.2\uff082023/8/22\uff09","text":"new \u589e\u52a0 OCR \u8bc6\u522b\u81ea\u52a8\u91cd\u8bd5\u673a\u5236\uff0c\u9ed8\u8ba4\u91cd\u8bd5 2 \u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u91cd\u8bd5\u6b21\u6570\uff1b \u4f7f\u7528\u7a97\u7ba1\u6700\u65b0\u63d0\u4f9b\u7684\u4e8c\u8fdb\u5236\u63a5\u53e3\uff0c\u4f18\u5316\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u5728 Wayland \u4e0b\u83b7\u53d6\u7a97\u53e3\u4fe1\u606f\u7684\u65b9\u6cd5\uff1b\u611f\u8c22\u684c\u9762\u6d4b\u8bd5\u90e8 @\u4f55\u6743 @\u5b59\u7fe0 \u3001\u7a97\u7ba1\u7814\u53d1 @\u9ec4\u6cfd\u94ed \u7684\u5927\u529b\u652f\u6301\u3002 \u6269\u5145 skipif \u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\u51fd\u6570\uff1a skipif_xdg_type \u652f\u6301 x11 \u6216 wayland \u4e0a\u8df3\u8fc7\uff1b skipif_cpu_name \u652f\u6301\u4e0d\u540c cpu \u4e0a\u8df3\u8fc7\uff0c\u6bd4\u5982\uff1askipif_cpu_name-KLVVW5821\uff1b "},{"location":"RELEASE/#2102023818","title":"2.1.0\uff082023/8/18\uff09","text":"fix \u4fee\u590d SW \u67b6\u6784\u73af\u5883\u4f9d\u8d56\u7684\u95ee\u9898\uff0c\u539f\u56e0\u662f\u4e4b\u524d\u6211\u8fd9\u91cc\u672c\u5730\u6ca1\u6709 SW \u7684\u673a\u5668\uff0c\u6ca1\u6709\u505a\u76f8\u5173\u9002\u914d\uff1b \u4fee\u590d\u5b50\u9879\u76ee\u5355\u72ec\u9700\u8981\u4e09\u65b9\u5305 pexpect\uff0c\u7531\u4e8e\u4e4b\u524d\u662f\u9884\u88c5\u5230\u955c\u50cf\u91cc\u9762\u7684\uff0c\u4f46\u57fa\u7840\u6846\u67b6\u4e0d\u9700\u8981\uff0c\u56e0\u6b64\u6ca1\u6709\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u91cc\u9762\uff0c\u5bfc\u81f4\u5b50\u9879\u76ee\u4f9d\u8d56\u62a5\u9519\u3002 \u4fee\u590d\u5b50\u9879\u76ee cv \u5bfc\u5165\u62a5\u9519\u7684\u95ee\u9898\uff1b \u539f\u56e0\u4e3a\uff1ayouqu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u517c\u5bb9\u4e24\u79cd\u60c5\u51b5\uff0c\u4e00\u79cd\u662f\u9762\u5411\u670d\u52a1\uff0c\u5c31\u662f\u672c\u5730\u6d4b\u8bd5\u673a\u4e0d\u9700\u8981\u5b89\u88c5 OpenCV\uff0c\u7528\u4f8b\u4e2d\u7684\u56fe\u50cf\u8bc6\u522b\u4f1a\u901a\u8fc7\u8fdc\u7a0b\u670d\u52a1\u63a5\u53e3\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u548c\u7ed3\u679c\u83b7\u53d6\uff1b\u7b2c\u4e8c\u79cd\u662f\u539f\u751f\uff0c\u5c31\u662f\u672c\u5730\u76f4\u63a5\u5b89\u88c5 OpenCV \u76f4\u63a5\u7528\u3002\u4e24\u4e2a\u60c5\u51b5\u7684\u4f18\u5148\u7ea7\u662f\u4f18\u5148\u5224\u65ad\u672c\u5730\u5b58\u5728\uff0c\u5426\u5219\u8d70\u670d\u52a1\u3002 \u524d\u9762\u6211\u4eec\u5df2\u7ecf\u628a OCR \u529f\u80fd\u505a\u4e86\u670d\u52a1\u5316\uff0c\u57fa\u4e8e 1 \u5e74\u591a\u4ee5\u6765\u7684\u89c2\u5bdf\uff0c\u7528\u8d77\u6765\u5f88\u7a33\u5b9a\uff0c\u518d\u4e00\u4e2a\u5c31\u662f OpenCV \u5b89\u88c5\u5305\u662f\u6bd4\u8f83\u81c3\u80bf\u7684\uff0c\u7c97\u7565\u6570\u4e86\u4e0b\u4f9d\u8d56\u6709 30+ \u4e2a\uff0c\u800c\u4e14\u5728\u5404\u67b6\u6784\u4e0a\u4f9d\u8d56\u5305\u8fd8\u4e0d\u5c3d\u76f8\u540c\uff0c\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u65b9\u6848\u4e2d\u4e0d\u592a\u597d\u5904\u7406\uff0c\u6240\u4ee5\u672c\u6b21 2.0 \u7248\u672c\u6211\u4eec\u5927\u80c6\u7684\u5c06\u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u529f\u80fd\u4fee\u6539\u4e3a\u9762\u5411\u670d\u52a1\u7684\u65b9\u5f0f\uff0c\u524d\u671f\u6d4b\u8bd5\u4e00\u5207\u770b\u8d77\u6765\u90fd\u5f88\u548c\u8c10\u3002 \u4f46\u662f\u6ca1\u6ce8\u610f\u5230\u4e4b\u524d\u7ed9\u6d77\u71d5\u59d0\u90a3\u8fb9\u9879\u76ee\u5355\u72ec\u5b9a\u5236\u505a\u4e86\u4e2a\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\uff08\u4e3a\u4e86\u80fd\u7b80\u5355\u5e73\u6ed1\u7684\u8fc1\u79fb\u5230 youqu\uff09\uff0c\u6b64\u63a5\u53e3\u5e95\u5c42\u6ca1\u6709\u517c\u5bb9\u670d\u52a1\u5316\uff0c\u6240\u4ee5\u5979\u90a3\u8fb9\u7684\u9879\u76ee\u8c03\u7528\u6b64\u5b9a\u5236\u63a5\u53e3\u4f1a\u62a5 cv \u5bfc\u5165\u7684\u95ee\u9898\u3002 \u7531\u4e8e\u5c06\u8fd9\u4e2a\u5b9a\u5236\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\u8fdb\u884c\u670d\u52a1\u5316\u517c\u5bb9\u6539\u9020\u9700\u8981\u4e00\u5b9a\u65f6\u95f4\uff0c\u6539\u5b8c\u8fd8\u9700\u8981\u6d4b\u8bd5\uff0c\u4f46\u672c\u6b21\u65f6\u95f4\u6bd4\u8f83\u7d27\uff0c\u56e0\u6b64\u5148\u628a OpenCV \u88c5\u8fdb\u865a\u62df\u73af\u5883\uff0c\u540e\u7eed\u7248\u672c\u518d\u8003\u8651\u9488\u5bf9\u6b64\u63a5\u53e3\u505a\u4fee\u6539\u3002"},{"location":"RELEASE/#2002023816","title":"2.0.0\uff082023/8/16\uff09","text":"YouQu\uff08\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff09\u5f00\u6e90\u4e86\uff0c\u540c\u65f6\u63a8\u51fa\u4e86 2.0 \u7248\u672c\u3002 \u611f\u8c22\u738b\u6ce2\u603b\u3001\u67b6\u6784\u5e08\u5f90\u5c0f\u4e1c\u3001\u7814\u53d1\u7ecf\u7406\u90d1\u5e7c\u6208\u3001\u5218\u90d1\u7b49\u7814\u53d1\u540c\u4e8b\u7684\u5927\u529b\u652f\u6301\u3002 new 1\u3001\u65b0\u7684\u57fa\u7840\u6846\u67b6\u4ee3\u7801\u83b7\u53d6\u65b9\u5f0f\u53ca\u65b0\u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4 YouQu \u540e\u7eed\u5747\u901a\u8fc7 PyPI \u8fdb\u884c\u5305\u7684\u53d1\u5e03\uff0c\u4e5f\u5c31\u662f\u8bf4\u540e\u7eed\u53ef\u4ee5\u4f7f\u7528 pip \u8fdb\u884c\u5b89\u88c5\uff1a sudo pip3 install youqu==2.0.0\n \u8fd9\u91cc\u6709 2 \u4e2a\u5c0f\u70b9\u8981\u6ce8\u610f\uff1a \u63a8\u8350\u4f7f\u7528 sudo pip3 \uff08\u52a0 sudo\uff09\u8fdb\u884c\u5b89\u88c5\uff1b \u5982\u679c\u4e0d\u52a0 sudo \u6709\u4e9b\u673a\u5668\u53ef\u80fd $HOME/.local/bin \u4e0d\u5728\u7cfb\u7edf PATH \u73af\u5883\u76ee\u5f55\u4e0b\uff0c\u5728\u4e0d\u6dfb\u52a0\u73af\u5883\u53d8\u91cf\u7684\u60c5\u51b5\u4e0b\uff0c\u4f1a\u51fa\u73b0 YouQu \u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4\uff08youqu-startproject\uff09\u65e0\u6cd5\u4f7f\u7528\u7684\u95ee\u9898\uff1b \u5f53\u7136\uff0c\u5c06\u4e0a\u8ff0\u8def\u5f84\u6dfb\u52a0\u5230\u73af\u5883\u53d8\u91cf\u4e4b\u540e\u4e5f\u662f\u53ef\u4ee5\u7528\u7684\uff0c\u6240\u4ee5\u6211\u8fd9\u91cc\u662f\u63a8\u8350\u52a0 sudo\uff0c\u4e0d\u52a0 sudo \u4e5f\u662f\u53ef\u4ee5\u7684\uff0c\u53ea\u662f\u9700\u8981\u5173\u6ce8\u4e0b\u73af\u5883\u53d8\u91cf\u7684\u95ee\u9898\u3002 \u63a8\u8350\u6307\u5b9a\u7248\u672c\u53f7\uff08youqu==2.0.0\uff09\u5b89\u88c5\uff0c\u5982\u679c\u4e0d\u6307\u5b9a\u7248\u672c\u53f7\u9ed8\u8ba4\u662f\u5b89\u88c5\u6700\u65b0\u53d1\u5e03\u7684 YouQu \u7248\u672c\uff0c\u4f60\u53ef\u4ee5\u5728 PyPI \u4e0a\u7684 Release history \u91cc\u9762\u67e5\u770b\u6709\u54ea\u4e9b\u7248\u672c\u3002 \u5b89\u88c5\u4e4b\u540e\u4f1a\u81ea\u52a8\u751f\u6210\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu-startproject\uff0c\u4f7f\u7528\u5b83\u53ef\u4ee5\u521d\u59cb\u5316\u5de5\u7a0b\uff0c\u8fd9\u91cc\u4ee5\u97f3\u4e50\u4e3e\u4f8b\uff1b youqu-startproject autotest_deepin_music\n \u8fd9\u6837\u5c31\u4f1a\u5728\u5f53\u524d\u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a autotest_deepin_music \u76ee\u5f55\uff0c\u91cc\u9762\u5305\u542b\u4e86\u57fa\u7840\u6846\u67b6\u6240\u6709\u7684\u4ee3\u7801\uff1b \u4e4b\u540e\uff0c\u8fd8\u662f\u5728 apps \u76ee\u5f55\u4e0b\uff0c\u653e\u5165\u5b50\u9879\u76ee\u7684AT\u4ee3\u7801\u5373\u53ef\uff0c\u4f7f\u7528\u65b9\u6cd5\u548c\u8fc7\u53bb\u4e00\u6837\uff0c\u8fd9\u91cc\u5c31\u4e0d\u591a\u4ecb\u7ecd\u3002 \u53e6\u5916\uff0c\u9664\u4e86\u901a\u8fc7 pip \u83b7\u53d6\u4ee5\u5916\uff0c\u4ecd\u7136\u53ef\u4ee5\u901a\u8fc7\u6e90\u7801\u83b7\u53d6\uff08\u76f4\u63a5 git clone\uff09\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u4f7f\u7528 pip \u5b89\u88c5 YouQu \u65f6\uff0cYouQu \u5305\u7684\u5927\u5c0f\u624d 600+ k\uff0c\u5b89\u88c5\u901f\u5ea6\u8d77\u98de\u3002 2\u3001\u65b0\u7684AT\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848 \u4e3a\u4e86\u89e3\u51b3\u4ee5\u4e0b\u95ee\u9898\uff1a \u8fc7\u53bb\u4e00\u6bb5\u65f6\u95f4\u54b1\u4eec\u7ecf\u5e38\u51fa\u73b0\u7684\uff0c\u4e0d\u540c\u7684AT\u9879\u76ee\u5728\u540c\u4e00\u53f0\u673a\u5668\u4e0a\u90e8\u7f72\u73af\u5883\u65f6\u4f9d\u8d56\u7248\u672c\u51b2\u7a81\u7684\u95ee\u9898\uff0c\u65b0\u65b9\u6848\u4e0d\u540c\u7684\u9879\u76ee\u4f1a\u52a8\u6001\u751f\u6210\u81ea\u5df1\u7684\u865a\u62df\u73af\u5883\uff0c\u76f8\u4e92\u4e4b\u95f4\u4e0d\u5f71\u54cd\uff1b \u4e1a\u5185\u4e3a\u4e86\u89e3\u51b3\u7248\u672c\u51b2\u7a81\u95ee\u9898\u4e00\u822c\u90fd\u4f1a\u4f7f\u7528Python\u865a\u62df\u73af\u5883\u7684\u5de5\u5177\uff0c\u4f46\u662f\u90fd\u6709\u4e2a\u95ee\u9898\uff0c\u65e0\u6cd5\u7ba1\u7406 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u5305\uff0c\u672c\u6b21\u6211\u4eec\u89e3\u51b3\u4e86\u8fd9\u4e2a\u95ee\u9898\uff0c\u80fd\u591f\u5b8c\u5168\u7ba1\u7406\u5e38\u89c4\u7684Python\u5305\uff0c\u4e5f\u80fd\u7ba1\u7406\u5230 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u4e09\u65b9\u5305\uff1b \u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u4f7f\u7528\u65b9\u6cd5\uff1a bash env.sh\n \u53ef\u4ee5\u770b\u51fa\u6765\u548c\u539f\u6765\u4f7f\u7528\u65b9\u6cd5\u6ca1\u6709\u53d8\u5316\uff0c\u4e5f\u5c31\u662f\u8bf4\u4ece\u4f7f\u7528\u7684\u89d2\u5ea6\u662f\u5b8c\u5168\u6ca1\u6709\u533a\u522b\u7684\uff0c\u53ea\u662f\u5185\u90e8\u505a\u4e86\u4e0d\u540c\u7684\u4e8b\u60c5\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u672c\u673a\u90e8\u7f72\u7684\u529f\u80fd\u4ecd\u7136\u4fdd\u7559 env_dev.sh\uff0c\u53ef\u4ee5\u4f5c\u4e3a\u5f00\u53d1\u65f6\u7684\u73af\u5883\u90e8\u7f72\u3002 3\u3001\u65b0\u7684\u9a71\u52a8\u547d\u4ee4 \u8fc7\u53bb\u54b1\u4eec\u90fd\u662f\u4f7f\u7528\u8fd9\u6837\u7684\u547d\u4ee4\u6765\u9a71\u52a8\u6267\u884c\uff1a python3 manage.py run\n \u7531\u4e8e\u9ed8\u8ba4\u57fa\u4e8e\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848\uff0c\u56e0\u6b64\u6211\u4eec\u589e\u52a0\u4e86\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu\uff1b \u65b0\u7684\u9a71\u52a8\u65b9\u5f0f\uff1a youqu manage.py run\n \u53ea\u9700\u8981\u628a python3 \u66ff\u6362\u6210 youqu \u5c31\u53ef\u4ee5\u4e86\uff0c\u770b\u8d77\u6765\u5f88\u548c\u8c10~ 4\u3001\u65b0\u7684\u6587\u6863\u5730\u5740 \u8fc7\u53bb\u54b1\u4eec YouQu \u7684\u5728\u7ebf\u6587\u6863\u662f\u90e8\u7f72\u5728\u516c\u53f8\u5185\u7f51\u7684\uff0c\u73b0\u5728\u5f00\u6e90\u5230 github \u4e86\uff0c\u5916\u90e8\u5f00\u53d1\u8005\u80af\u5b9a\u8bbf\u95ee\u4e0d\u5230\u5185\u7f51\u7684\u6587\u6863\uff0c\u56e0\u6b64\u9700\u8981\u5c06\u6587\u6863\u90e8\u7f72\u5230\u516c\u7f51\u3010\u516c\u7f51\u6587\u6863\u3011\uff1b \u516c\u7f51\u6587\u6863\u4f7f\u7528\u7684\u662f github pages\uff08\u767d\u5ad6\u602a\u4e00\u987f\u72c2\u559c~~\uff09\uff0c\u4f46\u53ef\u80fd\u4f1a\u51fa\u73b0\u6587\u6863\u901f\u5ea6\u6162\u7684\u95ee\u9898\uff08\u4ee3\u7406\u4e0b\u5c31\u597d\u4e86\uff09\uff0c\u4e0d\u8fc7\u6ca1\u5173\u7cfb\uff0c\u54b1\u4eec\u3010\u5185\u7f51\u6587\u6863\u3011\u4ecd\u7136\u4fdd\u7559\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u3002 5\u3001\u5176\u4ed6\u4e00\u4e9b\u5c0f\u5c0f\u529f\u80fd\u66f4\u65b0\uff1a \uff081\uff09\u65b0\u589e\u5173\u95ed\u5206\u8fa8\u7387\u68c0\u6d4b\u7684\u53c2\u6570\u503c\uff1b youqu manage.py run --resolution no\n \u6216\u8005\u4fee\u6539 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387, \u6bd4\u5982\uff1a1920x1080\n;no: \u8868\u793a\u4e0d\u505a\u5206\u8fa8\u7387\u6821\u9a8c\nRESOLUTION = 1920x1080\n resolution \u8fd9\u4e2a\u53c2\u6570\u4e00\u76f4\u90fd\u6709\u7684\uff0c\u53ea\u4e0d\u8fc7\u4e4b\u524d\u662f\u7528\u4e8e\u6307\u5b9a\u5206\u8fa8\u7387\u5927\u5c0f\uff0c\u6bd4\u5982 --resolution 1920x1080\uff0c\u4f46\u6709\u4e9b\u63a5\u53e3\u7684\u9879\u76ee\u4e0d\u9700\u8981\u8fd9\u4e2a\u68c0\u67e5\uff0c\u53ef\u4ee5\u7ed9\u5b83\u4e2a no \u5c31\u597d\u4e86\uff0c\u5f53\u7136 CICD \u4e0a\u5173\u95ed\uff0c\u9700\u8981\u6d41\u6c34\u7ebf\u4e0a\u628a\u8fd9\u4e2a\u53c2\u6570\u52a0\u4e0a\uff1b \uff082\uff09\u65b0\u589e\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u7684\u547d\u4ee4\u884c\u53c2\u6570 \u4e4b\u524d\u8fd9\u4e2a\u914d\u7f6e\u9879\u53ea\u80fd\u5728 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c 1 \u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff0cRERUN >= RECORD_FAILED_CASE\u3002\n;1.\u5173\u95ed\u5f55\u5c4f\uff1aRECORD_FAILED_CASE > RERUN\n;2.\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1aRECORD_FAILED_CASE = 0\nRECORD_FAILED_CASE = 1\n \u73b0\u5728\u5c06\u5f00\u53d1\u5230\u547d\u4ee4\u884c\u53c2\u6570\u3002 youqu manage.py run --record_failed_case 2\n fix \u4fee\u590d remote \u6267\u884c\u65f6\uff0c\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u65e0\u6cd5\u751f\u6210\u6d4b\u8bd5\u62a5\u544a\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1302023710","title":"1.3.0\uff082023/7/10\uff09","text":"fix \u8fdb\u4e00\u6b65\u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b\u53c2\u8003\uff1a\u914d\u7f6ePython\u6e90\u7684\u51e0\u79cd\u65b9\u6cd5 \u4fee\u590d wayland_autotool \u53d7\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86wayland\u4e0b\u5076\u73b0\u627e\u4e0d\u5230 .Xauthority \u6587\u4ef6\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1292023626","title":"1.2.9\uff082023/6/26\uff09","text":"fix \u4f18\u5316\u8fdc\u7a0b\u6267\u884c remote \u7684\u53c2\u6570\u76f4\u63a5\u4f20\u7ed9\u8fdc\u7a0b\u673a\u5668\u7684 run \u547d\u4ee4\uff0c\u4e0d\u7528\u518d\u5355\u72ec\u5904\u7406\u8fdc\u7a0b\u6267\u884c\u7684\u53c2\u6570\u903b\u8f91\uff0c\u540e\u7eed\u4e13\u6ce8\u4e8e\u672c\u5730\u6267\u884c\u529f\u80fd\u5f00\u53d1\uff0c\u8fdc\u7a0b\u6267\u884c\u81ea\u52a8\u9002\u7528\uff1b env.sh \u79fb\u9664 pyyaml \u5b89\u88c5\uff0c\u7531\u5b50\u9879\u76ee\u5728 requirement.txt \u91cc\u9762\u5b9a\u4e49\uff0c\u6846\u67b6\u81ea\u52a8\u52a0\u8f7d\uff1b \u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b "},{"location":"RELEASE/#128202369","title":"1.2.8\uff082023/6/9\uff09","text":"fix \u4fee\u590d\u4e86 pypi \u5b89\u88c5 numpy \u5b58\u5728\u7cfb\u7edf\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#127202368","title":"1.2.7\uff082023/6/8\uff09","text":"fix env.sh \u4e2d\u5b89\u88c5 Python \u5305\u672a\u6307\u5b9a\u7248\u672c\u65f6\uff0c\u65e5\u5fd7\u8f93\u51fa\u5b89\u88c5\u7684\u7248\u672c\uff1b pdocr-rpc 2.0.1\nallure-custom 1.2.1\nfunnylog 1.1.3\n \u4fee\u590d -f \u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u62a5\u9519\u7684\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#126202367","title":"1.2.6\uff082023/6/7\uff09","text":"fix \u4fee\u590d wayland \u4e0a\u8c03\u7528\u9f20\u6807\u4e2d\u952e\u3001\u53f3\u952e\u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b \u4fee\u590d pubilic/dde_desktop_public_widget \u91cc\u9762\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u5b9a\u4f4d\u684c\u9762\u6587\u4ef6\u7684\u65b9\u6cd5\uff0c\u5750\u6807\u6ca1\u6709\u62c6\u5305\u7684\u95ee\u9898\uff1b \u4f18\u5316\u4e86\u7b49\u5f85\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b pycreeze \u7248\u672c\u5347\u7ea7\u5230 0.1.29\uff0c\u5bfc\u81f4\u4e0e pyautogui 0.9.53 \u4e0d\u517c\u5bb9\uff0cenv.sh \u91cc\u9762\u589e\u52a0\u6307\u5b9a pycreeze \u7248\u672c\u4e3a 0.1.28\uff1b "},{"location":"RELEASE/#1252023516","title":"1.2.5\uff082023/5/16\uff09","text":"new --app \u53c2\u6570\u540e\u9762\u65b0\u589e\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u76ee\u524d\u652f\u6301\u4e09\u79cd\u53c2\u6570\u4f20\u5165\u65b9\u5f0f\uff1a ~$: youqu run -a deepin-music\n~$: youqu run -a autotest_deepin_music\n~$: youqu run -a apps/autotest_deepin_music\n \u200b \u540e\u4e24\u79cd\u5165\u53c2\u65b9\u5f0f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\u3002 remote \u8fdc\u7a0b\u6267\u884c\u65b0\u589e\u4ece\u547d\u4ee4\u884c\u4f20\u5165\u6d4b\u8bd5\u673a\u4fe1\u606f\uff0c\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679c password \u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6 setting/remote.ini \u4e2d CLIENT_PASSWORD \u7684\u503c,\u6bd4\u5982\uff1auos@10.8.13.33:1 \u6216 uos@10.8.13.33 \uff1b python3 manage.py remote -c uos@10.8.13.33/uos@10.8.13.34\npython3 manage.py remote -c uos@10.8.13.33:1/uos@10.8.13.34:2\n fix \u65e5\u5fd7\u6a21\u5757\u4fee\u6539\u4e3a\u51fd\u6570\u6267\u884c\u4e4b\u524d\u6253\u5370\u65e5\u5fd7\uff1b \u65e5\u5fd7\u6a21\u5757\u589e\u52a0\u767d\u540d\u5355\uff0c\u901a\u8fc7\u7c7b\u540d\u5f00\u5934\uff0c\u7ed3\u675f\uff0c\u5305\u542b\u7b49\u5173\u952e\u5b57\u63a7\u5236\u9700\u8981\u6253\u5370\u7684\u51fd\u6570\u65e5\u5fd7\uff1b \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5982\u679c\u4f20\u5165\u4e86 app_name \u53ea\u4f1a\u5c06 apps \u76ee\u5f55\u4e0b app_name \u7684\u76ee\u5f55\u53d1\u9001\u5230\u6d4b\u8bd5\u673a\uff1b env.sh \u79fb\u9664 python3-dev\uff1b \u4fee\u590d Wayland \u4e0b env.sh \u73af\u5883\u5b89\u88c5\u5931\u8d25\u7684\u95ee\u9898\uff0c\u4f18\u5316\u4e86 deb \u4f9d\u8d56\u5b89\u88c5\u7684\u903b\u8f91\uff1b \u5c06 env.sh \u5237\u65b0\u6e90\u7684\u65e5\u5fd7\u5728\u7ec8\u7aef\u663e\u793a\uff0c\u89e3\u51b3\u5728 CI \u73af\u5883\u4e0b\uff0c\u957f\u65f6\u95f4\u4e0d\u8f93\u51fa\u65e5\u5fd7\u8fde\u63a5\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d1060 \u534e\u4e3a\u673a\u578b\u5b89\u88c5\u952e\u9f20\u5de5\u5177\u65f6\u4f9d\u8d56\u4e0d\u517c\u5bb9\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1242023227","title":"1.2.4\uff082023/2/27\uff09","text":"fix \u4fee\u6539 CURRENT \u6587\u4ef6\uff1b "},{"location":"RELEASE/#1232023227","title":"1.2.3\uff082023/2/27\uff09","text":"new pylint.sh \u652f\u6301\u901a\u8fc7\u4f4d\u7f6e\u53c2\u6570\u4f20\u5165\u6587\u4ef6\u8def\u5f84\uff1abash pylint.sh apps/autotest_deepin_music,\u597d\u5904\u662f\u53c2\u6570\u8def\u5f84\u53ef\u4ee5\u5728\u7ec8\u7aef\u8865\u5168\uff1b \u65b0\u589e\u7cfb\u7edf\u547d\u4ee4 youqu-pylint \uff0c\u7528\u4e8e\u9759\u6001\u4ee3\u7801\u626b\u63cf\uff0c\u4f7f\u7528\u65b9\u6cd5: youqu-pylint apps/autotest_deepin_music\uff1b \u7531\u4e8e\u7cfb\u7edf\u4e00\u4e9b dbus \u63a5\u53e3\u6539\u53d8\uff0c\u516c\u5171\u5e93\u4e2d\u7684 dbus \u65b9\u6cd5\u5c06\u4e0d\u518d\u7ef4\u62a4\uff0c\u7531\u5b50\u9879\u76ee\u5728 other_widget.py \u91cc\u9762\u8fdb\u884c\u7ef4\u62a4\uff1b fix \u4fee\u590d ssh \u73af\u5883\u4e0b\u8fd0\u884c\u63d0\u793a \u201c\u65e0\u6cd5\u8fde\u63a5\u201d \u7684\u95ee\u9898\uff1b \u4fee\u590d\u8fd0\u884c\u65f6\u7a0b\u5e8f\u9000\u51fa\uff0c\u4e0d\u8f93\u51fa\u5f02\u5e38\u65e5\u5fd7\u7684\u95ee\u9898\uff1b \u4fee\u590dyouqu remote xxx \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5728\u670d\u52a1\u7aef Ctrl + C \u65e0\u6cd5\u505c\u6b62\u7a0b\u5e8f\u8fd0\u884c\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#122202328","title":"1.2.2\uff082023/2/8\uff09","text":"new \u65b0\u589e\u6c14\u6ce1\u7c7b\u56fe\u50cf\u8bc6\u522b\u65b9\u6848\uff1bimage_utils.py::ImageUtil::get_during\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u533a\u57df\u8bc6\u522b\uff0c\u4f20\u5165 [x, y, w, h]\uff0cx: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u76ee\u6807\u56fe\u7247\uff0c\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\uff1b env.sh \u79fb\u9664 pypinyin; \u4f18\u5316\u6267\u884c env.sh \u65f6\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b manage.py \u79fb\u9664\u4e86\u53c2\u6570 session_timeout \uff0c\u6846\u67b6\u6839\u636e\u5168\u5c40\u7684 timeout \u4ee5\u53ca\u7528\u4f8b\u81ea\u5b9a\u4e49\u7684 timeout \u81ea\u52a8\u8ba1\u7b97\u51fa sessiontimeout \u7684\u503c\uff1b \u65b0\u589e ocr \u670d\u52a1\u5668\u94fe\u63a5\u91cd\u8bd5\uff0c\u9ed8\u8ba4\u91cd\u8bd51\u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u53c2\u6570\uff1b fix \u4fee\u590d\u4e86\u4e00\u4e9b pylint \u626b\u63cf\u7684\u4ee3\u7801\u98ce\u683c\u95ee\u9898\uff1b \u91cd\u65b0\u8bbe\u8ba1\u4e86\u6d4b\u8bd5\u62a5\u544a\u4e3b\u9898\uff1b "},{"location":"RELEASE/#121202316","title":"1.2.1\uff082023/1/6\uff09","text":"new \u652f\u6301\u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6267\u884c\u7528\u4f8b\uff1b\u53ef\u5c06python3 manage.py \u66ff\u6362\u4e3a youqu \uff1a youqu run -a deepin-music -k 001\n RPC \u670d\u52a1 IP \u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u6307\u5b9a\u4e0d\u540c\u7684\u7aef\u53e3\uff1b \u5728\u7ebf\u6587\u6863\u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u539f\u6765\u7684\u5730\u5740 10.8.10.215 \u5c06\u4e0d\u5728\u4f7f\u7528\uff1b fix \u4fee\u590d --count \u53c2\u6570\u53ef\u80fd\u51fa\u73b0\u4e0e\u5176\u4ed6\u6846\u67b6\u7684\u5de5\u7a0b\u4f9d\u8d56\u5b58\u5728\u51b2\u7a81\uff0c\u62a5\u9519\u91cd\u590d\u6ce8\u518c\u7684\u95ee\u9898\uff1b \u4fee\u590d CI \u73af\u5883\u4e0b\u591a\u4e2a\u5de5\u7a0b\u5b58\u5728 Python \u73af\u5883\u53d8\u91cf\u6307\u5411\u9519\u8bef\uff0c\u5bfc\u5305\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u5355\u72ec\u8fd0\u884c\u65b9\u6cd5\u65f6\u65e0\u65e5\u5fd7\u8f93\u51fa\u7684 Bug\uff1b "},{"location":"RELEASE/#12020221230","title":"1.2.0\uff082022/12/30\uff09","text":"1.1.4 \u7248\u672c\u9002\u914d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e14\u65b0\u589e\u4e86\u8f83\u591a\u65b0\u7279\u6027\uff0c\u6211\u4eec\u8ba1\u5212\u4f7f\u7528 1.1.4 \u7248\u672c\u8fd0\u884c\u4e00\u6bb5\u65f6\u95f4\uff0c1.2.0 \u7248\u672c\u5c06\u4fee\u590d\u671f\u95f4\u51fa\u73b0\u7684 Bug\uff0c\u7136\u540e\u4f5c\u4e3a\u7a33\u5b9a\u7248\u672c\u53d1\u5e03\u3002 new \u4fee\u6539\u5de5\u7a0b\u540d\u79f0\u4e3a youqu\uff1b \u5c06 sphinx \u6587\u6863\u5de5\u7a0b\u8fc1\u79fb\u5230\u5355\u72ec\u7684\u4ed3\u5e93\uff1b fix \u4fee\u590d startapp \u521b\u5efa\u5de5\u7a0b\u65f6\u5b58\u5728\u5de5\u7a0b\u540d\u79f0\u65f6\u65e0\u6cd5\u7ee7\u7eed\u521b\u5efa\uff1b \u4fee\u590d\u4e86 OCR \u670d\u52a1\u5728\u5e76\u53d1\u65f6\u53ef\u80fd\u51fa\u73b0\u65e0\u6cd5\u8fd4\u56de\u7ed3\u679c\u7684\u95ee\u9898\uff0c\u63d0\u5347 OCR \u670d\u52a1\u9ad8\u5e76\u53d1\u7a33\u5b9a\u6027\uff1b \u4fee\u590d PMS \u540c\u6b65\u6807\u7b7e\u5230 CSV \u6587\u4ef6\u4e0d\u652f\u6301\u7528\u4f8b\u5e93\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11420221214","title":"1.1.4\uff082022/12/14\uff09","text":"new \u65b0\u589e startapp \u5b50\u547d\u4ee4\u521b\u5efa\u5b50\u9879\u76ee\u5de5\u7a0b\u6a21\u677f: python3 manage.py startapp autotest_deepin_xxx \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u91cd\u590d\u6267\u884c\u6b21\u6570\uff1b \u53bb\u6389\u6279\u91cf\u6267\u884c\u524d\u6536\u96c6\u7528\u4f8b\u7684\u6b65\u9aa4\uff1b \u589e\u52a0\u5f00\u59cb\u6267\u884c\u65f6\u6253\u5370\u4e00\u4e9b\u6267\u884c\u53c2\u6570\uff0c\u5982\uff1a \u7528\u4f8b\u6536\u96c6\u6570\u91cf: 99\n\u5931\u8d25\u91cd\u8dd1\u6b21\u6570: 1\n\u6700\u5927\u5931\u8d25\u6b21\u6570: 49\n\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4: 200.0s (03\u520620\u79d2)\n\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4: 11880s (3\u5c0f\u65f618\u52060\u79d2)\n \u5b9a\u5236\u4fee\u6539allure\u62a5\u544alogo\u3001title\u3001\u9ed8\u8ba4\u8bed\u8a00\uff1b manage.py \u6267\u884c\u5f00\u59cb\u65f6\u6253\u5370 logo \u548c\u5f53\u524d\u7248\u672c\uff1a \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u255a\u2588\u2588\u2557 \u2588\u2588\u2554\u255d \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2584\u2584 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2580\u2580\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u2584\u2588 \u2584\u2588 \u2588 \u2588 \u2588 \u2584 \u2588 \u2584 \u2580\u2580\u2588 \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\uff1b \u88c5\u9970\u5668\u65b9\u6cd5\u6307\u5b9a\u6b21\u6570\uff1b @pytest.mark.count(2)\ndef test_music_001():\npass\n \u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u6b21\u6570\uff1b python3 manage.py run -a deepin-music -k 001 --count 2\n \u200b image_utils \u589e\u52a0\u51fd\u6570 save_temporary_picture\uff0c\u652f\u6301\u6307\u5b9a\u5c4f\u5e55\u533a\u57df\u622a\u56fe\u5e76\u8fd4\u56de\u56fe\u7247\u5b58\u653e\u7684\u672c\u5730\u8def\u5f84\uff0c\u540e\u7eed\u4f7f\u7528 assert_image_exist \u8fdb\u884c\u65ad\u8a00 Python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(x, y, width, height) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) button_center \u65b0\u589e btn_size \u83b7\u53d6\u63a7\u4ef6\u5de6\u4e0a\u89d2\u5750\u6807\u53ca\u957f\u5bbd\uff0c\u7528\u4e8e\u52a8\u6001\u7684\u622a\u53d6\u5143\u7d20\u7684\u56fe\u7247\uff0c\u53ef\u7528\u4e8e\u5b9a\u4f4d\u65ad\u8a00 python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u6240\u6709\u97f3\u4e50\u6309\u94ae\")) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) allure \u62a5\u544a\u4e2d\u5b9a\u4f4d\u95ee\u9898\u9664\u4e86\u65e5\u5fd7\u3001\u622a\u56fe\u3001\u5f55\u5c4f\u5916\uff0c\u8c03\u7528\u7684\u51fd\u6570\u589e\u52a0\u4e86 step \u6b65\u9aa4\u5c55\u793a\uff1b env.sh \u65b0\u589e\u5b89\u88c5\u5b50\u9879\u76ee Python \u4e09\u65b9\u4f9d\u8d56\uff0c\u5728\u5b50\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u5199 requirement.txt \u6587\u4ef6\uff0cenv.sh \u4f1a\u81ea\u52a8\u52a0\u8f7d\uff1b ocr \u8bc6\u522b\u65b0\u589e\u652f\u6301\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\u8fdb\u884c\u6587\u5b57\u8bc6\u522b\uff0c\u51cf\u5c11\u56e0\u5168\u5c4f\u8bc6\u522b\u65f6\uff0c\u5176\u4ed6\u6587\u5b57\u7684\u5e72\u6270 Python # \u65ad\u8a00\u97f3\u4e50\u7684\u5220\u9664\u5f39\u7a97\u4e2d\uff0c\u5305\u542b\u4e86\u201c\u786e\u8ba4\u201d\u7684\u6587\u5b57 self.assert_ocr_exist(\"\u786e\u8ba4\", picture_abspath=DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u5220\u9664\u5f39\u7a97\"))) \u65ad\u8a00\u51fd\u6570\u7684\u8c03\u7528\u4e5f\u4f1a\u81ea\u52a8\u6253\u5370\u65e5\u5fd7; env.sh \u65b0\u589e\u88c1\u526a\u4f9d\u8d56\u7684\u65b9\u6848\uff1b fix \u4fee\u590d Jenkins \u73af\u5883\u4e0b\uff0c apps \u76ee\u5f55\u4e0b\u5b50\u9879\u76ee\u5b58\u5728 auotest_deepin_xxx@tmp \u76ee\u5f55\uff0c\u5728\u4f20\u5165 app_name \u540e\u65e0\u6cd5\u6267\u884c\u7528\u4f8b\u7684\u95ee\u9898\uff1b \u4fee\u590d\u81ea\u52a8\u751f\u6210 case_list.csv \u6587\u4ef6\u65f6\uff0c\u7528\u4f8b\u987a\u5e8f\u88ab\u8c03\u6574\u7684\u95ee\u9898\uff1b env.sh \u73af\u5883\u5b89\u88c5\u79fb\u9664 git \u548c curl\uff1b \u4fee\u590d\u7528\u4f8b\u5728 setup \u9636\u6bb5\u62a5\u9519\u540e\uff0c\u672a\u5199\u5165 ci_result.json \u7684\u95ee\u9898\uff1b \u79fb\u9664 uos_ci.py\uff1b "},{"location":"RELEASE/#11320221028","title":"1.1.3\uff082022/10/28\uff09","text":"new \u65b0\u589e\u56fe\u50cf\u65ad\u8a00\u6210\u529f\u8f93\u51fa\u5339\u914d\u5ea6\uff1b \u65b0\u589e\u73af\u5883\u5b89\u88c5 yaml \u4f9d\u8d56\uff1b \u65b0\u589e\u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6570\u636e\u56de\u586b\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b \u65b0\u589e\u6d4b\u8bd5\u7ed3\u679c\u8868\u60c5\u663e\u793a\uff0c\u5e76\u4f18\u5316\u4e86\u65e5\u5fd7\u7684\u6392\u7248\uff1b \u65b0\u589e --top {number} \u7528\u4e8e\u8bb0\u5f55\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0c\u65e5\u5fd7\u751f\u6210\u5230 report/logs/top.log\uff1b fix \u4fee\u590d\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4f46\u7ec8\u7aef\u6ca1\u6709\u9519\u8bef\u65e5\u5fd7\u8f93\u51fa\u7684\u95ee\u9898\uff1b \u4fee\u6539\u5931\u8d25\u7528\u4f8b\u56de\u6eaf\u65e5\u5fd7\u4e3a\u8be6\u7ec6\u7ea7\u522b\uff1b \u4fee\u590d\u4e86\u6267\u884c\u8fdb\u5ea6\u672a\u8ba1\u7b97\u8df3\u8fc7\u7528\u4f8b\u7684\u95ee\u9898\uff0c\u5e76\u4f18\u5316\u4e86\u8fdb\u5ea6\u83b7\u53d6\u7684\u7b97\u6cd5\uff1b \u4fee\u590d env.sh \u5728 V23 \u73af\u5883\u4e0b\u5b89\u88c5\u65e0\u6cd5\u8bfb\u53d6\u5bc6\u7801\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 pms \u6d4b\u8bd5\u5957\u6267\u884c\u6216\u6d4b\u8bd5\u5355\u6267\u884c\u65f6\uff0c\u7528\u4f8bID\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b env.sh \u91cc\u9762 hub.deepin.com \u66f4\u6362\u6210 it.uniontech.com\uff1b uos_ci.py \u6d4b\u8bd5\u7ed3\u679c\u7edf\u8ba1\u65f6\uff0c\u603b\u6570\u5254\u9664 skip \u7684\u6570\u91cf "},{"location":"RELEASE/#11220220921","title":"1.1.2\uff082022/09/21\uff09","text":"new \u5728\u6ca1\u6709\u5b89\u88c5 dogtail \u7684\u60c5\u51b5\u4e0b\uff0c\u4e5f\u80fd\u4f7f\u7528 sniff \u5de5\u5177\uff1b fix \u4fee\u590d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e2d\u6ca1\u6709\u5b89\u88c5 AT \u73af\u5883\u6267\u884c uos_ci.py \u62a5\u9519\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11120220919","title":"1.1.1\uff082022/09/19\uff09","text":"new \u65b0\u589e\u6267\u884c\u8fdb\u5ea6\u663e\u793a\uff0c\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u65f6\u65e5\u5fd7\u8f93\u51fa\u5f53\u524d\u8fdb\u5ea6\uff1a[\u5f53\u524d\u6307\u5b9a\u7b2c\u51e0\u6761/\u7528\u4f8b\u603b\u6570]\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u7528\u4f8b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\u6240\u6709\u5931\u8d25\u7528\u4f8b\u7684\u5217\u8868\uff1b \u5173\u95ed\u7ec8\u7aef\u8f93\u51fa\u6355\u83b7\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u65e5\u5fd7\u5feb\u7167\uff1b \u4f18\u5316\u7ec8\u7aef\u8f93\u51fa\u5931\u8d25\u4fe1\u606f\u5197\u957f\u4e3a\u7b80\u8981\u4fe1\u606f\u8f93\u51fa\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u663e\u793a 10 \u4e2a\u6267\u884c\u6700\u6162\u7684\u7528\u4f8b\u5217\u8868\uff0c\u5e76\u8be6\u7ec6\u5217\u51fa\u5404\u4e2a\u9636\u6bb5\u7684\u8017\u65f6\uff1b \u5931\u8d25\u91cd\u8dd1\u7528\u4f8b\u91cd\u8dd1\u4e4b\u524d\u5ef6\u8fdf 1 \u79d2\uff1b \u65b0\u589e\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4ecd\u7136\u5f3a\u5236\u6267\u884c\uff1b \u7528\u4f8b\u6536\u96c6\u65f6\u4ec5\u5728 apps \u76ee\u5f55\u4e0b\u8fdb\u884c\uff0c\u5ffd\u7565 src,setting,public \u76ee\u5f55\uff1b \u65b0\u589e allure \u62a5\u544a\u5907\u4efd\u529f\u80fd\uff0c\u9ed8\u8ba4\u5907\u4efd\u81f3 allure_back \u76ee\u5f55\u4e0b\uff1b manage.py\u65b0\u589e\u53c2\u6570 --lastfailed \u7528\u4e8e\u53ea\u8dd1\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\u7684\u529f\u80fd\uff1b fix \u4fee\u590d\u4e86\u5728\u6ca1\u6709\u6307\u5b9a\u5e94\u7528\u540d\u79f0\u6267\u884c\u65f6\uff0cxml \u62a5\u544a\u751f\u6210\u8def\u5f84\u5f02\u5e38\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 uos_ci.py \u4f20\u5165 timeout \u548c session_timeout \u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11020220916","title":"1.1.0\uff082022/09/16\uff09","text":"new \u65b0\u589ePMS\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u652f\u6301\u591a\u79cd\u6570\u636e\u56de\u586b\u6a21\u5f0f\uff1b \u4f18\u5316\u4e86\u901a\u8fc7\u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u65f6PMS \u722c\u866b\u7684\u6027\u80fd\uff1b \u65b0\u589e .gitmodules \u6587\u4ef6\uff0c\u7528\u4e8e\u6807\u8bb0\u6240\u6709\u5b50\u9879\u76ee\uff0c\u65b9\u4fbf\u7edf\u4e00\u62c9\u53d6\u4ee3\u7801\uff1b env.sh \u9002\u914d\u793e\u533a\u7248\u4e0a\u5b89\u88c5\u81ea\u52a8\u5316\u73af\u5883\uff1b \u589e\u52a0\u6267\u884c\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u9519\u8bef\u7684\u529f\u80fd\uff1b README.md \u589e\u52a0 Wayland \u4e0b\u4f7f\u7528\u3001\u6d4b\u8bd5\u62a5\u544a\u67e5\u770b\u3001\u5e38\u89c1\u95ee\u9898\u7b49\u7684\u6587\u6863\u8bf4\u660e\uff1b \u589e\u52a0\u4e86\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u5bf9 setup\u3001call\u3001teardown \u8fdb\u884c\u65e5\u5fd7\u5206\u6bb5\uff1b fix \u4fee\u590d\u4e86 \u786e\u8ba4\u4fee\u590d \u5217\u6ca1\u5199\u8868\u5934\uff0c\u4f46\u5199\u4e86 fixed-xxx \u6807\u7b7e\uff0c\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u540c\u4e00\u5e94\u7528\u5185\u591a\u4e2a csv \u6587\u4ef6\u4e2d \u786e\u8ba4\u4fee\u590d \u5217\u6709\u7684\u5199\u4e86\uff0c\u6709\u7684\u6ca1\u5199\uff0c\u53ef\u80fd\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 INFO \u65e5\u5fd7\uff0c\u663e\u793a\u4e3a DEBUG \u7684\u95ee\u9898\uff1b\u4fee\u590d\u4e86\u90e8\u5206\u673a\u5668\u4e0a INFO \u65e5\u5fd7\u5185\u5bb9\u663e\u793a\u4e3a\u7ea2\u8272\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\u770b\u4e0d\u5230\u8be6\u7ec6\u4fe1\u606f\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10220220822","title":"1.0.2\uff082022/08/22\uff09","text":"new \u79fb\u9664 loguru\uff0c\u66ff\u6362\u4e3a logging\uff0c\u63a5\u53e3\u4fdd\u6301\u4e0d\u53d8\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u53d7\u5f71\u54cd\uff1b \u9ed8\u8ba4\u5f00\u542f coredump\uff1b fix \u4fee\u590d\u4e86\u4e09\u65b9\u5e93 loguru \u5076\u73b0\u5f02\u5e38\uff0c\u5bfc\u81f4\u7a0b\u5e8f\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7b2c\u4e00\u6b21\u5931\u8d25\u4e0d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10120220812","title":"1.0.1\uff082022/08/12\uff09","text":"new \u65b0\u589e RELEASE.md \u6587\u4ef6\uff0c\u7528\u4e8e\u8bb0\u5f55\u5386\u53f2\u53d1\u5e03\u7248\u672c\u7684\u66f4\u65b0\u5185\u5bb9\uff1b \u517c\u5bb9 Wayland \u6a21\u5f0f\u4e0b\u6267\u884c\u7528\u4f8b\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u7528\u7ba1\u5f53\u524d\u6d4b\u8bd5\u673a\u6267\u884c\u73af\u5883\uff0c\u6846\u67b6\u4f1a\u81ea\u52a8\u6839\u636e\u5f53\u524d\u73af\u5883\u8d70\u4e0d\u540c\u7684\u4ee3\u7801\u903b\u8f91\uff1b \u7531\u4e8e\u9700\u8981\u4fee\u6539 dogtail \u6e90\u4ee3\u7801\uff0c\u56e0\u6b64\u5c06\u4fee\u6539\u540e\u7684\u6e90\u7801\u653e\u5165\u5230\u6838\u5fc3\u5e93\u91cc\u9762 src/depends/dogtail \u540e\u7eed\u7248\u672c\u5c06\u4e0d\u9700\u8981\u5728\u7cfb\u7edf\u4e2d\u5b89\u88c5dogtail\uff1b \u5982\u679c\u5e94\u7528\u5e93\u540c\u6837\u4f7f\u7528\u4e86\u7cfb\u7edf\u5b89\u88c5\u7684 dogtail \u53ef\u80fd\u4f1a\u62a5\u9519\uff0c\u89e3\u51b3\u65b9\u6848\u662f\u5c06\u4ee3\u7801\u4e2d\u7684 import dogtail \u4fee\u6539\u4e3a from src.depends import dogtail ; fix \u91cd\u8dd1\u5931\u8d25\u4e4b\u540e\u624d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff0c\u4fee\u6539\u4e3a\u5931\u8d25\u4e4b\u540e\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":"# Attribution \uff1achengdu Test Team\n# Date \uff1a2021/08/20\n \u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d \u4ed3\u5e93\u5730\u5740\uff1ahttps://gitlabcd.uniontech.com/autotest/cd-desktop-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u65b9\u6848\u6982\u8ff0","text":"\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u667a\u80fd\u8bc6\u522b\u5e94\u7528\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u7528\u4e8e\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u64cd\u4f5c\u8fc7\u7a0b\u4e2d\u7684\u5143\u7d20\u5b9a\u4f4d\u4ee5\u53ca\u5224\u65ad\u7ed3\u679c\u65f6\u7684\u65ad\u8a00\u5904\u7406\uff1b\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\uff0c\u6d4b\u8bd5\u673a\u4e0a\u7684\u753b\u9762\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u5230\u670d\u52a1\u5668\u4e0a\uff0c\u670d\u52a1\u5668\u5bf9\u89c6\u9891\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\u540e\uff0c\u670d\u52a1\u5668\u667a\u80fd\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\u6210\u529f\uff0c\u7136\u540e\u5bf9\u6d4b\u8bd5\u673a\u4e0b\u53d1\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\uff0c\u6d4b\u8bd5\u673a\u63a5\u53d7\u5e76\u6267\u884c\u4e0b\u4e00\u6b65\u64cd\u4f5c\u3002 \u670d\u52a1\u5668\u4e0e\u6d4b\u8bd5\u673a\u4e4b\u95f4\u7684\u94fe\u63a5\uff1a \u670d\u52a1\u5668\u901a\u8fc7 USB \u4e32\u53e3\u8bbe\u5907\uff08USB-HID \u534f\u8bae\uff09\u6a21\u62df\u9f20\u6807\u952e\u76d8\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u64cd\u4f5c\u3002 \u901a\u8fc7\u89c6\u9891\u91c7\u96c6\u8bbe\u5907\u6355\u83b7\u6d4b\u8bd5\u673a\u7684\u5b9e\u65f6\u753b\u9762\u4f20\u8f93\u7ed9\u670d\u52a1\u5668\u3002 \u670d\u52a1\u5668\u5bf9\u91c7\u96c6\u7684\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\uff0c\u8bc6\u522b\u5176\u4e2d\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5e76\u8fd4\u56de\u5143\u7d20\u63a7\u4ef6\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\uff0c\u670d\u52a1\u5668\u901a\u8fc7\u667a\u80fd\u5316\u5206\u6790\uff0c\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e00\u81f4\u5c06\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\u901a\u8fc7\u4e32\u53e3\u6a21\u62df\u952e\u9f20\u4fe1\u53f7\u53d1\u9001\u7ed9\u6d4b\u8bd5\u673a\uff1b\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e0d\u4e00\u81f4\u5c06\u4f1a\u8fdb\u5165\u4e2d\u65ad\u5904\u7406\u53ca\u5f02\u5e38\u7ed3\u679c\u8f93\u51fa\uff0c\u7ee7\u7eed\u6267\u884c\u540e\u7eed\u573a\u666f\uff0c\u76f4\u81f3\u6240\u6709\u7528\u4f8b\u6d4b\u8bd5\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u6df1\u5ea6\u5b66\u4e60\u73af\u5883\u642d\u5efa","text":"\u6a21\u578b\u8bad\u7ec3\u4e3b\u8981\u5bf9 GPU \u6709\u8981\u6c42\uff0c\u8bad\u7ec3\u6a21\u578b\u7684\u673a\u5668\u663e\u5b58\u4e0d\u4f4e\u4e8e 6G\uff0c\u5176\u4ed6\u914d\u7f6e\u65e0\u7279\u6b8a\u8981\u6c42\u3002 \u63a8\u8350\u6027\u4ef7\u6bd4\u8f83\u9ad8\u914d\u7f6e \u64cd\u4f5c\u7cfb\u7edf: UnionTech OS Desktop 20 Professional Linux version 4.19.0-desktop-amd64 (deepin@deepin-PC) (Uos 8.3.0.3-3+rebuild) \u5904\u7406\u5668: Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz (\u516b\u6838 / \u5341\u516d\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460M-HDV(RD)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))/8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: TU116 [GeForce GTX 1660]\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u865a\u62df\u73af\u5883\u5b89\u88c5","text":"cd ~\nwget -c https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh\nbash Miniconda3-latest-Linux-x86_64.sh\n \u4e00\u8def\u56de\u8f66 \u7b2c\u4e00\u6b21\u63d0\u793a\u8f93\u5165 yes/no \uff1a\u8f93\u5165 yes \u7ee7\u7eed\u4e00\u8def\u56de\u8f66 \u7b2c\u4e8c\u6b21\u63d0\u793a\uff1a\u8f93\u5165 no cd ~/miniconda3/bin\nsudo chmod 777 activate\n \u6fc0\u6d3bconda\u73af\u5883 . ./activate\n \u6dfb\u52a0\u516c\u53f8\u5185\u7f51\u6e90 conda config --add channels bioconda\nconda config --add channels conda-forge\n \u5982\u679c\u662f\u5916\u7f51\u6dfb\u52a0\u5916\u7f51\u6e90 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/\n \u5982\u679c\u8981\u5220\u9664\u6e90 conda config --remove-key channels\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"2\u3001\u5b89\u88c5\u4f9d\u8d56","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u521b\u5efa\u865a\u62df\u73af\u5883","text":"conda remove --name mmlab --all # \u79fb\u9664\u6240\u6709\u865a\u62df\u73af\u5883\n conda create -n mmlab python=3.7\n conda activate mmlab\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-pytorch","title":"\uff082\uff09\u5b89\u88c5 Pytorch","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install torch==1.7.0+cu101 torchvision==0.8.1+cu101 torchaudio==0.7.0 -f https://download.pytorch.org/whl/torch_stable.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-mmcv","title":"\uff083\uff09\u5b89\u88c5 MMCV","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install mmcv-full==1.3.3 -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.7.0/index.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"\uff084\uff09\u5b89\u88c5\u663e\u5361\u9a71\u52a8","text":"\u6839\u636e\u4f60\u7684\u663e\u5361\u4e0b\u8f7d\u5bf9\u5e94\u9a71\u52a8\uff0c\u6bd4\u5982\u6211\u7684\u663e\u5361\u4e3a GTX1660\uff0c\u9a71\u52a8\u7248\u672c\u4e3a 430\uff0c\u9a71\u52a8\u4e0b\u8f7d\u5730\u5740\uff1ahttps://www.nvidia.cn/Download/Find.aspx?lang=cn CTRL+ALT+F2 \u8fdb\u5165tty\n \u7981\u7528 nouveau \u9a71\u52a8 sudo vim /etc/modprobe.d/blacklist-nouveau.conf\n \u586b\u5165\uff1a blacklist nouveau options nouveau modeset=0\n \u5237\u65b0\u914d\u7f6e\u6587\u4ef6 sudo update-initramfs -u reboot \u91cd\u542f\u540e\u518d\u8fdb\u5165 tty \u5173\u95ed\u56fe\u50cf\u754c\u9762\uff0c\u8f93\u5165\u547d\u4ee4\u5173\u95ed\u56fe\u50cf\u754c\u9762 sudo service lightdm stop\n \u5b89\u88c5\u9a71\u52a8 sudo chmod a+x NVIDIA-Linux-x86_64-430.run\nsudo ./NVIDIA-Linux-x86_64-430.run\n reboot\u91cd\u542f\uff0cnvidia-smi\u67e5\u770b\u5b89\u88c5\u72b6\u6001\u3002\u6ce8\u610f\u770b\u4e0bcuda\u7248\u672c\uff0c10.1\uff0cdriver\u7248\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u6570\u636e\u6807\u6ce8","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u6570\u636e\u6807\u6ce8","text":"\u6807\u6ce8\u4e4b\u524d\u9700\u8981\u5148\u8f6c\u6362\u56fe\u7247\u5927\u5c0f\uff0c\u5e76\u4e14\u4ee5\u6570\u5b57\u547d\u540d\uff0c\u6bcf\u7ec4\u547d\u540d\u9012\u589e"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"\uff081\uff09\u8f6c\u6362\u5927\u5c0f\u5e76\u91cd\u547d\u540d","text":"rename_pic.py import os\nimport sys\nimport cv2\nimport time\nimport getpass\nusername = getpass.getuser()\nsource_path = f\"/home/{username}/Desktop/right_menu\" # \u56fe\u7247\u8def\u5f84\nsource_dest = os.path.join('/'.join(source_path.split(\"/\")[:-1]), 'tmp')\nif not os.path.exists(source_dest):\nos.mkdir(source_dest)\nstart_name = sys.argv[1]\nfile_name_list = list()\nfor file in os.listdir(source_path):\nif file.endswith('.png'):\nfile_name_list.append(file)\nstart_name = int(start_name)\nfor file in file_name_list:\nos.rename(os.path.join(source_path,file), os.path.join(source_path, f\"{str(start_name)}.png\"))\nstart_name += 1\ntime.sleep(1)\nfor file in os.listdir(source_path):\nimage = os.path.join(source_path, str(file))\nsrc = cv2.imread(image)\nresult = cv2.resize(src, (960, 540))\nresizeImage = os.path.join(source_dest, str(file))\nprint(resizeImage)\ncv2.imwrite(str(resizeImage), result)\ncv2.waitKey(0)\ncv2.destroyAllWindows()\ntime.sleep(1)\nos.system(f'rm -rf {source_path}/*')\nos.system(f'mv {source_dest}/* {source_path}')\nos.system(f'rm -rf {source_dest}')\nprint(\"\u4e0b\u4e00\u4e2a\u5e8f\u53f7\uff1a\", start_name)\n \u6839\u636e\u7ec8\u7aef\u8f93\u51fa\u7684\u4e0b\u4e00\u4e2a\u5e8f\u53f7\u7684\u63d0\u793a\uff0c\u6267\u884c Python \u6587\u4ef6\u7684\u65f6\u5019\u4f20\u53c2\u3002 python rename_pic.py 249\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"\uff082\uff09\u5de5\u5177\u6807\u6ce8","text":"\u4f7f\u7528\u5de5\u5177 labelImg \u6807\u6ce8 sudo pip3 install PyQt5==5.13\nsudo pip3 install labelImg\n \u7ec8\u7aef\u76f4\u63a5\u8f93\u5165 labelImg\uff0c\u56de\u8f66 \u6807\u6ce8\u6a21\u5f0f\u9009\u62e9\uff1aPascalVOC"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u667a\u80fd\u6807\u6ce8","text":"\u6253\u5f00\u5c4f\u5e55\u5f55\u5236\u8f6f\u4ef6\uff0c\u5f55\u5236\u624b\u52a8\u64cd\u4f5c\u4e00\u6b21\u6d4b\u8bd5\u7528\u4f8b\uff0c\u7136\u540e\u5c06\u5f55\u5236\u7684\u89c6\u9891\u8fdb\u884c\u5206\u5e27\uff0c\u7136\u540e\u5bf9\u6bd4\u524d\u4e24\u5e27\u56fe\u6807\u76f8\u4f3c\u5ea6\uff0c\u5254\u9664\u76f8\u4f3c\u5ea6\u8fc7\u9ad8\u7684\u56fe\u7247\uff0c\u5728\u4fdd\u8bc1\u7d20\u6750\u591a\u6837\u6027\u7684\u524d\u63d0\u4e0b\uff0c\u5254\u9664\u91cd\u590d\u591a\u4f59\u7684\u56fe\u7247\u751f\u6210\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u96c6\uff0c\u7136\u540e\u53d6\u51fa\u63a7\u4ef6\u6a21\u677f\u6570\u636e\u96c6\uff0c\u901a\u8fc7 OpenCV \u6a21\u677f\u5339\u914d\u83b7\u53d6\u63a7\u4ef6\u5728\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u56fe\u7247\u4e2d\u6240\u5728\u7684\u5de6\u4e0a\u3001\u5de6\u4e0b\u3001\u53f3\u4e0a\u3001\u53f3\u4e0b\u56db\u5904\u5750\u6807\uff0c\u4ece\u800c\u6839\u636e\u6a21\u677f\u6570\u636e\u96c6\u751f\u6210\u6807\u6ce8\u6570\u636e\u3002\u53c2\u8003\u76ee\u5f55 AnnotationMaterial"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"\uff081\uff09\u6a21\u677f\u6570\u636e\u96c6\u51c6\u5907","text":"1\u3001\u5728\u754c\u9762\u622a\u53d6\u9700\u8981\u6807\u6ce8\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u653e\u5728\u76ee\u5f55\u4e0b AnnotationMaterial/template/img 2\u3001\u7ef4\u62a4\u63a7\u4ef6\u540d\u4e0e\u5143\u7d20\u63a7\u4ef6\u7684\u952e\u5bf9\uff0c\u4e00\u4e2a\u63a7\u4ef6\u540d\u53ef\u5bf9\u5e94\u591a\u4e2a\u5143\u7d20\u63a7\u4ef6 menu:\n- menu.jpg\n- menu1.jpg\n- menu2.jpg\n- menu3.jpg\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"\uff082\uff09\u7d20\u6750\u96c6\u51c6\u5907","text":"\u5f55\u5236\u89c6\u9891\u6216\u6216\u5c4f\u5e55\u622a\u56fe\u653e\u7f6e\u76ee\u5f55 AnnotationMaterial/source"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u5f00\u59cb\u6807\u6ce8","text":"python3 AnnotationMaterial/main.py\n \u751f\u6210\u7684\u6807\u6ce8\u6570\u636e\u5b58\u653e\u5728 AnnotationMaterial/result"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#mmdetection","title":"\u56db\u3001MMDetection","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1-mmdetection","title":"1\u3001 MMDetection \u4ee3\u7801","text":"MMDetection \u662f\u4e00\u4e2a\u6709\u540d\u7684\u6df1\u5ea6\u5b66\u4e60\u76ee\u6807\u68c0\u6d4b\u5f00\u6e90\u9879\u76ee\uff0c\u4e5f\u662f openMMlab \u7684\u62db\u724c\u9879\u76ee\uff0c\u4e3a\u4ec0\u4e48\u9009\u62e9\u5b83\uff0c\u5c0f\u5b69\u513f\u6ca1\u5a18\u8bf4\u6765\u8bdd\u957f\uff0c\u611f\u5174\u8da3\u53ef\u4ee5\u81ea\u884c\u6df1\u5165\u4e86\u89e3\uff1b \u4f60\u53ef\u4ee5\u76f4\u63a5\u5728 GitHub \u4e0a\u514b\u9686\u4ee3\u7801\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u54b1\u4eec\u4ed3\u5e93\u4e0b Train \u76ee\u5f55\u4e2d\u4ee3\u7801\uff0cTrain \u4e2d\u7684\u4ee3\u7801\u4e5f\u662f\u4ece GitHub \u4e0a\u62c9\u53d6\u7684\uff0c\u4e0d\u8fc7\u6211\u4eec\u6839\u636e\u9879\u76ee\u9700\u8981\u505a\u4e86\u4e00\u4e9b\u4e8c\u6b21\u5f00\u53d1\uff0c\u63a8\u8350\u76f4\u63a5\u4f7f\u7528\u5b83\u3002 \u5982\u679c\u4f60\u60f3\u4ece GitHub \u4e0a\u62c9\uff1a git clone https://github.com/open-mmlab/mmdetection.git\n# \u4e0d\u80fd\u76f4\u63a5\u62c9\u53d6\u4e3b\u5206\u652f\uff0c\u5efa\u8bae\u4f7f\u75282.12\u7248\u672c\uff0c\u4e0d\u540c\u7684\u7248\u672c\u5bf9\u5e94\u7684mmcv\u7248\u672c\u662f\u4e0d\u540c\u7684\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-voc2coco","title":"2\u3001\u62c9\u53d6 voc2coco \u4ee3\u7801","text":"git clone https://github.com/Tony607/voc2coco.git\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-coco","title":"3\u3001\u8f6c\u6362 coco \u6570\u636e\u96c6","text":"\u5c06\u6240\u6709\u7684\u56fe\u7247\u548cxml\u6587\u4ef6\u653e\u5165train2017\uff0c\u4ece\u4e2d\u6311\u9009\u51e0\u7ec4\u653e\u5165val2017\uff08\u6d4b\u8bd5\u96c6\uff09 cd mmdetection/data/coco\npython voc2coco.py train2017 annotations/instances_train2017.json\npython voc2coco.py val2017 annotations/instances_val2017.json\n \u751f\u6210json\u6587\u4ef6"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4_1","title":"4\u3001\u4fee\u6539\u914d\u7f6e","text":"\uff081\uff09\u8bfb\u53d6\u6a21\u578b\u540d\u79f0 import json\nmodule_name = []\nwith open('./instances_train2017.json', \"r+\") as f:\njson_file = f.read()\njson_dict = json.loads(json_file)\nmodule_list = json_dict.get('categories')\nfor module_info in module_list:\nname = module_info.get('name')\nmodule_name.append(name)\nprint(module_name)\nprint(\"module_num:\", len(module_name))\n # \u6ce8\u610f\u5bf9\u6bd4instances_train2017.json\u91cc\u9762\u6a21\u578b\u540d\u79f0\u7684\u987a\u5e8f\uff0c\u4e0eCLASSES\u548ccoco_classes\u91cc\u9762\u7684\u987a\u5e8f\u4fdd\u6301\u4e00\u81f4\u3002\n \uff082\uff09\u4fee\u6539 faster_rcnn_r101_2x_coco.py mmdetection/xianjin/faster_rcnn_r101_2x_coco.py \u4fee\u653946\u884c\uff0cnum_clasess\u7684\u503c\uff0c\u65b0\u589e1\u4e2a\uff0c\u5c31 +1\uff1b \uff083\uff09\u4fee\u6539 coco.py mmdetection/mmdet/datasets/coco.py CLASSES = ()\uff0c\u5728\u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b \uff084\uff09\u4fee\u6539 class_names.py mmdetection/mmdet/core/evaluation/class_names.py coco_classes \u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#5","title":"5\u3001\u7f13\u5b58\u6e05\u7406","text":"\u5220\u9664 mmdetection/build \u76ee\u5f55 python setup.py install\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#6","title":"6\u3001\u8bad\u7ec3\u6a21\u578b","text":"\uff081\uff09\u6307\u5b9a\u81ea\u5df1\u914d\u7f6e\u7684\u8bad\u7ec3\u6a21\u578b\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py --gpus 1\n \uff082\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u6d4b\u8bd5\u96c6\u7ed3\u679c\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py xianjin/epoch_24.pth --show\n \uff083\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u51c6\u786e\u5ea6\uff1b python tools/analysis_tools/analyze_logs.py plot_curve xianjin/20210530_011907.log.json --keys acc\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#7","title":"7\u3001\u5feb\u6377\u64cd\u4f5c","text":"python3 run.py\n \u5c06\u4ee5\u4e0a 4 - 7 \u6b65\u64cd\u4f5c\u6574\u5408\u6210 run.py\uff0c\u4e00\u952e\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u4e94\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\uff1b \u670d\u52a1\u7aef\u4e00\u53f0\uff08\u76ee\u524d\u4ec5\u652f\u6301AMD\u67b6\u6784\uff09\uff1b \u91c7\u96c6\u76d2\u4e00\u4e2a \uff08ACASIS hdmi\u89c6\u9891\u91c7\u96c6\u5361\uff0chttps://item.jd.com/10024310742602.html \uff09\uff1b USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\uff1b USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff1b \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5USB\u5ef6\u957f\u7ebf\uff1b \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u63a8\u8350\u914d\u7f6e","text":"\u6267\u884c\u7528\u4f8b\u7684\u670d\u52a1\u7aef\u5bf9\u914d\u7f6e\u6ca1\u6709\u7279\u6b8a\u8981\u6c42\uff0c\u5982\u679c\u6761\u4ef6\u5141\u8bb8\u914d\u7f6e\u8d8a\u9ad8\uff0c\u8bc6\u522b\u901f\u5ea6\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n \u6d4b\u8bd5\u673a\u4e0a\u4e0d\u6267\u884c\u4efb\u4f55\u811a\u672c\uff0c\u5177\u4f53\u914d\u7f6e\u6839\u636e\u6d4b\u8bd5\u9700\u8981\u51b3\u5b9a\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#usb_mk","title":"\u516d\u3001USB_MK\u4e32\u53e3\u9a71\u52a8\u65b9\u6cd5","text":"\u4f4d\u4e8econtrol_method\u76ee\u5f55\u4e0b\u7684usb_mk.py\u6587\u4ef6 \uff081\uff09\u5217\u51fa\u53ef\u901a\u4fe1\u7684\u7aef\u53e3 python3 -m serial.tools.list_ports -v\n \uff082\uff09\u4fee\u6539\u4e32\u53e3\u7684\u6743\u9650 sudo chmod 777 /dev/ttyACM0\n \uff083\uff09\u5b9e\u4f8b\u5316USB_MK import UsbMk\nusb_mk = UsbMk(\"/dev/ttyACM0\", 9600) # \u8bbe\u5907\u9ed8\u8ba49600\u4e3a\u6ce2\u7279\u7387\uff0c\u63a7\u5236\u4f20\u8f93\u901f\u7387\n \uff084\uff09USB\u4e32\u53e3\u8bbe\u5907\u9ed8\u8ba4\u6ce2\u7279\u7387\u4e3a9600\uff08\u7ecf\u6d4b\u8bd5\u6ce2\u7279\u73879600\u51c6\u786e\u6027\u6700\u597d\uff09\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up() # \u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u6c49\u5b57\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e\n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff083\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff084\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff085\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() # \u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2\n \uff086\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff087\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff088\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e03\u3001\u65b9\u6cd5\u8c03\u7528\u5165\u53c2\u89c4\u5219","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_7","title":"1\u3001\u57fa\u7c7b","text":"class Base:\ndef __init__(self):\nself._obj = image\nself._usb = usb_mk\ndef find_element_by_ai(self, element):\nreturn self._obj.find_element(element)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_6","title":"2\u3001\u5165\u53c2\u8bf4\u660e","text":"\u56fe\u50cf\u8bc6\u522b\u65b9\u6cd5\u5165\u53e3\u4e3a Base \u7c7b\u4e0b\u7684 find_element_by_ai \u3002\u4ec5\u63a5\u53d7\u4e00\u4e2a\u53c2\u6570 element\uff0c\u7c7b\u578b\u4e3a string\u3002 \u53ef\u8bc6\u522b\u7684 string \u683c\u5f0f\uff1a \uff081\uff09\u5927\u56fe\u6807\uff08 \u56fe\u6807\u5927\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\uff0c\u4f8b\uff1a Base().find_element_by_ai(\"window\")\n \uff082\uff09\u5927\u56fe\u6807 / \u5c0f\u56fe\u6807\uff08\u56fe\u6807\u5c0f\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5c0f\u56fe\u6807\uff0c\u4f8b\uff1awindow/search_btn Base().find_element_by_ai(\"window/search_btn\")\n \uff083\uff09\u5927\u56fe\u6807 / OCR\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\u5185\u7684\u6587\u5b57\uff0c\u4f8b\uff1amenu/\u5c5e\u6027 Base().find_element_by_ai(\"menu/\u5c5e\u6027\")\n \uff084\uff09OCR\uff1a\u5168\u5c4f\u8bc6\u522b\u6587\u5b57 Base().find_element_by_ai(\"\u641c\u7d22\")\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516b\u3001\u9690\u85cf\u9f20\u6807","text":"\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u8fc7\u6765\u7684\u89c6\u9891\u6d41\uff0c\u5728\u8bc6\u522b\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u53d7\u5230\u9f20\u6807\u5f71\u54cd\uff0c\u56e0\u6b64\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u9690\u85cf\u9f20\u6807\u3002 \u5c4f\u853d\u9f20\u6807\u5149\u6807\u663e\u793a ```shell script /etc/lightdm/lightdm.conf \u5728`[Seat:*]`\u4e0b\u9762\u6dfb\u52a0\u53c2\u6570\n```shell script\nxserver-command=X -bs -core -nocursor\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e5d\u3001\u667a\u80fd\u81ea\u52a8\u5316\u7684\u610f\u4e49","text":"1\u3001\u6539\u5584 Acessibility \u5b9a\u4f4d\u7684\u7a33\u5b9a\u6027\u95ee\u9898 Acessibility \u5c5e\u6027\u5b9a\u4f4d\u5b58\u5728\u5076\u5c14\u5931\u6548\u7684\u60c5\u51b5 \uff081\uff09\u5f00\u53d1\u5728\u505a\u65b0\u9700\u6c42\u5f00\u53d1\u65f6\u53ef\u80fd\u6d89\u53ca\u5230\u5bf9\u5c5e\u6027\u6807\u7b7e\u7684\u4fee\u6539\u6216\u8005\u5c42\u7ea7\u7684\u8c03\u6574\uff0c\u53ef\u80fd\u9020\u6210\u81ea\u52a8\u5316\u7528\u4f8b\u65e0\u6cd5\u5b9a\u4f4d\u5230\u5143\u7d20\u3002 \u6bd4\u59821040\u9636\u6bb5\uff0c\u97f3\u4e50\u91cd\u6784\u7684\u65f6\u5019\uff0c\u5f00\u53d1\u5bf9\u90e8\u5206\u5c5e\u6027\u548c\u5c42\u7ea7\u505a\u4e86\u4fee\u6539\uff0c\u5bfc\u81f4\u81ea\u52a8\u5316\u7528\u4f8b\u5b9a\u4f4d\u65b9\u6cd580%\u9700\u8981\u4fee\u6539\u3002 \u5f00\u53d1\u65b0\u529f\u80fd\u7684\u65f6\u5019\u5076\u5c14\u4e5f\u4f1a\u5bf9\u5c5e\u6027\u505a\u8c03\u6574\uff0c\u9047\u52305\u6b21\u3002 \uff082\uff09\u76ee\u524d\u4e3b\u8981\u4f7f\u7528Dogtail\u8bc6\u522b\u5e94\u7528Acessibility\u5c5e\u6027\u8fdb\u884c\u5b9a\u4f4d\uff0c\u662f\u83b7\u53d6\u5e94\u7528\u5f53\u524d\u754c\u9762\u7684\u5c5e\u6027tree\uff0c\u5728\u5e94\u7528\u8df3\u8f6c\u540e\uff0cDogtail\u5b58\u5728\u65e0\u6cd5\u53ca\u65f6\u83b7\u53d6\u5f53\u524d\u5c5e\u6027\u5217\u8868\u7684\u60c5\u51b5\u3002 \u591a\u5a92\u4f53\u8c03\u7528\u6587\u7ba1\u7a97\u53e3\u7684\u65f6\u5019\uff0c\u51fa\u73b0\u627e\u4e0d\u5230\u6587\u7ba1\u91cc\u9762\u5143\u7d20\u7684\u60c5\u51b5\uff0c\u76ee\u524d\u51fa\u73b010+\u6b21\u3002 \u5e94\u7528\u8bbe\u7f6e\u9875\u9762\u7684\u5c5e\u6027\u5076\u5c14\u5b58\u5728\u627e\u4e0d\u5230\u7684\u60c5\u51b5\uff0c\u9047\u52305\u6b21\u3002 \uff083\uff09Dogtail\u5de5\u5177\u672c\u8eab\u5b58\u5728\u95ee\u9898\uff0c\u6709\u65f6\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u5019\u5f88\u6162\uff0c\u8ba9\u4eba\u65e0\u6cd5\u63a5\u53d7\uff0c\u76ee\u524d\u51fa\u73b0\u8fc7\u5f88\u591a\u6b21\u3002 \u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u95f4\u6bd4\u5e73\u5e38\u61623\u500d\uff0c\u51fa\u73b04\u6b21\u3002 2\u3001\u89e3\u51b3\u4e86\u4f7f\u7528\u7edd\u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898 \u90e8\u5206\u63a7\u4ef6\u65e0\u6cd5\u6dfb\u52a0 Acessibility \u5c5e\u6027\u4ece\u800c\u4f7f\u7528\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u51fa\u73b0\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898\u3002 \uff081\uff09\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u65b9\u6cd5\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u76ee\u6807\u56fe\u7247\u8d44\u6e90\uff0c\u5728 UI \u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u4f1a\u6d89\u53ca\u5230\u76ee\u6807\u8d44\u6e90\u7684\u66ff\u6362\uff0c\u6bd4\u8f83\u8017\u8d39\u4eba\u529b\u3002 \uff082\uff09\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6cd5\u5bf9\u6bd4\u7cbe\u5ea6\u6bd4\u8f83\u641e\uff0c\u5982\u679cUI \u7684\u53d8\u66f4\u4f1a\u9020\u6210\u65e0\u6cd5\u51c6\u786e\u5b9a\u4f4d\u5230\uff0c\u81ea\u52a8\u5316\u811a\u672c\u5065\u58ee\u6027\u4e0d\u8db3\u3002 3\u3001\u4f7f\u7528\u673a\u5668\u5206\u79bb\uff0c\u89e3\u51b3\u4e86\u81ea\u52a8\u5316\u811a\u672c\u5bf9\u5e94\u7528\u7684\u5f71\u54cd\uff0c\u771f\u5b9e\u8fd8\u539f\u7528\u6237\u7684\u4f7f\u7528\u573a\u666f \u673a\u5668\u5206\u79bb\u7684\u67b6\u6784\u8bbe\u8ba1\uff0c\u4fdd\u8bc1\u4e86\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u73af\u5883\u5b8c\u5168\u7b49\u540c\u4e8e\u7528\u6237\uff0c\u6392\u9664\u6d4b\u8bd5\u811a\u672c\u7684\u5f71\u54cd\u3002 \uff081\uff09\u76ee\u524d\u7684\u529f\u80fd\u81ea\u52a8\u5316\u662f\u5728\u6d4b\u8bd5\u673a\u4e0a\u76f4\u63a5\u8fd0\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\uff0c\u52a0\u4e0a\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u6211\u4eec\u6dfb\u52a0\u4e86\u4e00\u4e9b\u8fdb\u7a0b\u76d1\u63a7\u3001\u89c6\u9891\u5f55\u5236\u7b49\u529f\u80fd\uff0c\u81ea\u52a8\u5316\u811a\u672c\u672c\u8eab\u4f1a\u6d88\u8017\u4e00\u4e9b\u7cfb\u7edf\u8d44\u6e90\uff0c\u65e0\u6cd5\u8fd8\u539f\u771f\u662f\u7684\u7528\u6237\u4f7f\u7528\u573a\u666f\u3002 \uff082\uff09\u6027\u80fd\u6d4b\u8bd5\u9700\u8981\u6392\u9664\u5176\u4ed6\u7a0b\u5e8f\u7684\u8d44\u6e90\u6d88\u8017\u5f71\u54cd\uff0c\u6027\u80fd\u81ea\u52a8\u5316\u91c7\u7528\u673a\u5668\u5206\u79bb\uff0c\u4fdd\u8bc1\u4e86\u6027\u80fd\u6570\u636e\u7684\u51c6\u786e\u6027\u3002 \u4ee5\u524d\u7684\u7528\u4f8b\u6267\u884c\u8017\u65f6\u6ca1\u6761\u572830\u79d2\u5de6\u53f3\uff0c\u73b0\u5728\u7528\u4f8b\u8017\u65f6\u572810\u79d2\u3002 4\u3001\u89e3\u51b3\u4e86UI \u8c03\u6574\u5bfc\u81f4\u5b9a\u4f4d\u5931\u8d25\u7684\u4e0d\u7a33\u5b9a\u6027\u95ee\u9898 \uff081\uff09\u89e3\u51b3\u4e86\u56e0 UI \u8c03\u6574\u5bfc\u81f4\u63a7\u4ef6\u4f4d\u7f6e\u53d8\u5316\u6216\u8272\u5dee\u53d8\u5316\u540e\u5b9a\u4f4d\u4e0d\u51c6\u786e\u7684\u95ee\u9898\uff0c\u53ea\u8981\u63a7\u4ef6\u6587\u6848\u548c\u63a7\u4ef6\u5916\u8fb9\u6846\u65e0\u53d8\u5316\u5747\u53ef\u51c6\u786e\u5b9a\u4f4d\uff1b \uff082\uff09\u76ee\u524d\u4e5f\u4f1a\u91c7\u7528\u57fa\u4e8eUI\u7684\u5b9a\u4f4d\u65b9\u6848\uff0c\u5982\u679cUI\u4f4d\u7f6e\u6709\u8c03\u6574\uff0c\u4f1a\u5bfc\u81f4\u5143\u7d20\u65e0\u6cd5\u5b9a\u4f4d\u3002 5\u3001\u7b80\u5316\u4e86\u7528\u4f8b\u7ed3\u6784\uff0c\u63d0\u5347\u7f16\u5199\u53cb\u597d\u5ea6 \uff081\uff09\u667a\u80fd\u81ea\u52a8\u5316\u8bc6\u522b\u5143\u7d20\u7684\u65b9\u6cd5\u53ea\u6709\u4e00\u4e2a\uff0c\u5c31\u662f\u57fa\u4e8e\u6211\u4eec\u8bad\u7ec3\u7684\u6a21\u578b\u8bc6\u522b\u89c6\u9891\u6d41\u4e2d\u7684\u5143\u7d20\uff0c\u7ecf\u8fc7\u811a\u672c\u5c01\u88c5\u4e4b\u540e\uff0c\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u4e2d\u6240\u6709\u5b9a\u4f4d\u7684\u64cd\u4f5c\u90fd\u53ea\u9700\u8981\u8c03\u7528\u8fd9\u4e00\u4e2a\u65b9\u6cd5\u5c31\u884c\u4e86\uff0c\u7f16\u5199\u81ea\u52a8\u5316\u811a\u672c\u7684\u96be\u5ea6\u5927\u5927\u964d\u4f4e\u3002 \uff082\uff09\u4e5f\u662f\u7531\u4e8e\u8c03\u7528\u65b9\u6cd5\u7b80\u5355\uff0c\u5728 UI \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u4e2d\u7684\u5206\u5c42\u7ed3\u6784\u5c06\u4f1a\u51cf\u5c11\uff0c\u591a\u7ee7\u627f\u7684\u60c5\u51b5\u4f1a\u51cf\u5c11\uff0c\u81ea\u52a8\u5316\u4ee3\u7801\u7684\u8c03\u7528\u7ed3\u6784\u4e5f\u4f1a\u53d8\u5f97\u7b80\u5355\uff0c\u800c\u4e14\u529f\u80fd\u6d4b\u8bd5\u540c\u5b66\u7f16\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u66f4\u52a0\u5bb9\u6613\u4e0a\u624b\u3002 \u4ee5\u524d\u5199\u7528\u4f8b\u7531\u4e8e\u9700\u8981\u7ed3\u5408\u4e0d\u540c\u7684\u6a21\u5757\uff0c\u8c03\u7528\u4e0d\u540c\u7684\u65b9\u6cd5\uff0c\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u5e76\u5b8c\u6210\u8c03\u8bd5\u7684\u65f6\u95f4\u5e73\u5747\u572820-30\u5206\u949f\uff0c\u73b0\u5728\u5199\u7528\u4f8b\u811a\u672c\u80fd\u57285\u5206\u949f\u5de6\u53f3\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":"# =============================================\n# Attribution : Application Test Department III\n# Time : 2023/1/3\n# Author : ut003281\n# =============================================\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u7b80\u8ff0","text":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5 \u901a\u8fc7\u81ea\u52a8\u5316\u624b\u6bb5\u5bf9\u5e94\u7528\u8fdb\u884c\u6027\u80fd\u6d4b\u8bd5\uff0c\u63d0\u4f9b\u65b9\u4fbf\u7684\u73af\u5883\u90e8\u7f72\u3001\u8fd0\u884c\u914d\u7f6e\u3001\u7528\u4f8b\u7f16\u5199\u7b49\uff0c\u7528\u4e8e\u684c\u9762\u5e94\u7528\u7684\u51b7\u70ed\u542f\u52a8\u3001\u8d44\u6e90\u62f7\u8d1d\u3001\u9875\u9762\u8df3\u8f6c\u7b49\u6027\u80fd\u573a\u666f\u6d4b\u8bd5\u3002 \u4ed3\u5e93\u5730\u5740\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-perf-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u4ee3\u7801\u7ed3\u6784","text":"autotest-perf-aitest\n\u251c\u2500\u2500 apps # \u5b58\u653e\u6240\u6709\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u811a\u672c\n\u251c\u2500\u2500 conftest.py # pytest hook\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 CURRENT # \u7248\u672c\u5185\u5bb9\n\u251c\u2500\u2500 docs # \u6587\u6863\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u952e\u503c\u5bf9\u7167\u8868.pdf # \u4e32\u53e3\u7ebfcode\u4e0e\u6309\u952e\u7684\u5bf9\u7167\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u6027\u80fd\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\u6267\u884c\u5668\u4f7f\u7528\u6307\u5357.md # \u6267\u884c\u5668\u811a\u672c\u4f7f\u7528\u6307\u5357\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 USB\u4e32\u53e3\u8f6cUSB\u952e\u76d8\u9f20\u6807\u7ebf\u534f\u8bae\u6587\u4ef6V1.0.pdf # \u4e32\u53e3\u534f\u8bae\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput-0.28.2.zip # Linux\u4e0b\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\u7684\u6e90\u7801\uff0c\u53ef\u6839\u636e\u67b6\u6784\u6253\u5305\n\u251c\u2500\u2500 manage.py # \u529f\u80fd\u4e3b\u5165\u53e3\n\u251c\u2500\u2500 pytest.ini # pytst \u914d\u7f6e\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 setting # \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 client.ini # \u6d4b\u8bd5\u673a IP \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5168\u5c40\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dev_env.sh # \u5bbf\u4e3b\u673a\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose_no_relay.yml # \u65e0\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose.yml # \u6709\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker_login.sh # docker \u767b\u9646\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 res\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 black.png # \u5168\u9ed1\u56fe\u7247\uff0c\u7528\u4e8e\u4fee\u6539\u58c1\u7eb8\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_5000.deb # 3A5000 \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_amd64.deb # amd \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_arm64.deb # arm \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_mips64.deb # mips \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_sw_64.deb # sw \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 server.ini # \u670d\u52a1\u5668\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 setup.sh # \u5bb9\u5668\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 template # \u521b\u5efa app \u57fa\u7840\u811a\u672c\u6a21\u677f\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 app_template\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ${app_name}_widget.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 control-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 images\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 test_${app_name}_01_scene.json-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 test_${app_name}_01_scene.py-tpl\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 uos_docker # \u5bb9\u5668\u73af\u5883\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dockerfile\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 requirements.txt\n\u2514\u2500\u2500 src\n \u251c\u2500\u2500 analysis_save.py # \u89e3\u6790\u56fe\u7247\u6d41\u7ed3\u679c\uff0c\u6c47\u603b\u751f\u6210 excel \u62a5\u544a\n\u251c\u2500\u2500 base_widget.py # \u5c01\u88c5\u7684\u57fa\u7840\u64cd\u4f5c\uff0c\u5e94\u7528\u8c03\u7528\u7684\u4e3b\u5165\u53e3\u65b9\u6cd5\n\u251c\u2500\u2500 cmdctl.py # \u8c03\u7528\u547d\u4ee4\u884c\u4f7f\u7528\n\u251c\u2500\u2500 global_value.py # \u5168\u5c40\u53d8\u91cf\n\u251c\u2500\u2500 image_utils.py # \u56fe\u7247\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 __init__.py\n \u251c\u2500\u2500 logger_utils.py # \u65e5\u5fd7\u914d\u7f6e\n\u251c\u2500\u2500 pdocr.py # ocr \u914d\u7f6e\n\u251c\u2500\u2500 public_method.py # \u4e00\u4e9b\u65b9\u4fbf\u7684\u5c01\u4f4f\n\u251c\u2500\u2500 record.py # \u5f55\u5c4f\u76f8\u5173\n\u251c\u2500\u2500 rtk # \u8fd0\u884c\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 _base.py # \u4e00\u4e9b\u679a\u4e3e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 install_env.py # \u5b89\u88c5\u73af\u5883\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 local_runner.py # \u8fd0\u884c\u7528\u4f8b\n\u251c\u2500\u2500 serial_communication # \u4e32\u53e3\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 power_control.py # \u7ee7\u7535\u5668\u64cd\u4f5c\uff0c\u4f7f\u7528\u7ee7\u7535\u5668\u8fde\u63a5\u4e3b\u673a\u7535\u6e90\uff0c\u63a7\u5236\u5f00\u5173\u673a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 serial_common.py # \u4e32\u53e3\u516c\u5171\u65b9\u6cd5\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 usb_mk.py # \u952e\u9f20\u64cd\u4f5c\u57fa\u7840\u5c01\u88c5\n\u251c\u2500\u2500 shortcut_key.py # \u5feb\u6377\u952e\u7684\u5c01\u88c5\n\u251c\u2500\u2500 singleton.py # \u5355\u4f8b\u6a21\u5f0f\n\u251c\u2500\u2500 start_app.py # \u521b\u5efa app\n\u2514\u2500\u2500 write_xlsx.py # \u751f\u6210 excel\n# __init__.py \u6587\u4ef6\u4e3a\u6807\u8bc6\u8be5\u76ee\u5f55\u662f\u4e00\u4e2aPython\u7684\u6a21\u5757\u5305\uff0c\u9879\u76ee\u4e2d\u7684__init__.py\u5747\u4e3a\u7a7a\u6587\u4ef6\u3002\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u73af\u5883\u642d\u5efa","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\u3002 \u670d\u52a1\u7aef\u4e00\u53f0\u3002\uff08\u4ec5\u652f\u6301 AMD \u67b6\u6784\uff0c\u82e5\u9700\u5176\u4ed6\u67b6\u6784\uff0c\u54a8\u8be2\u76f8\u5173\u5f00\u53d1\u4eba\u5458\uff09 \u91c7\u96c6\u76d2\u4e00\u4e2a\u3002 \uff08ACASIS HDMI \u89c6\u9891\u91c7\u96c6\u76d2\uff0chttps://item.jd.com/100013302599.html#crumb-wrap \uff09 USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\u3002\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"\uff082\uff09\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\u3002 USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff08USB3.0 \u63a5\u53e3\u4e0a\uff09\u3002 \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5 USB \u5ef6\u957f\u7ebf\u3002 \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u670d\u52a1\u7aef\u63a8\u8350\u914d\u7f6e","text":"\u914d\u7f6e\u8d8a\u9ad8\uff0c\u89e3\u6790\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"2\u3001\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa","text":" \u6253\u5f00\u63a7\u5236\u4e2d\u5fc3\uff0c\u8d26\u6237\u8bbe\u7f6e\u4e3a\u3010\u81ea\u52a8\u767b\u5f55\u3011\u548c\u3010\u65e0\u5bc6\u7801\u767b\u5f55\u3011\uff0c\u7535\u6e90\u7ba1\u7406\u4e2d\u4f7f\u7528\u7535\u6e90\u5168\u90e8\u8bbe\u7f6e\u4e3a\u3010\u4ece\u4e0d\u3011\uff0c\u5f00\u542f\u5f00\u53d1\u8005\u6a21\u5f0f\u3002 \u6839\u636e\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u8981\u6c42\uff0c\u5bfc\u5165\u76f8\u5173\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\uff1a\u5bfc\u5165\u76f8\u518c\u3001\u5f71\u9662\u3001\u97f3\u4e50\u7684\u6d4b\u8bd5\u8d44\u6e90\u3002 \u5728\u670d\u52a1\u7aef\u6253\u5f00\u76f8\u673a\u5e94\u7528\u540e\uff0c\u5c06\u6d4b\u8bd5\u673a\u684c\u9762\u58c1\u7eb8\u66f4\u6362\u4e3a\u7eaf\u8272\u58c1\u7eb8\uff08\u6ce8\u610f\uff0c\u670d\u52a1\u7aef\u9700\u63d0\u524d\u5f00\u542f\u76f8\u673a\u540e\u518d\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u58c1\u7eb8\uff0c\u5efa\u8bae\u7eaf\u9ed1\u58c1\u7eb8 setting/res/black.png\uff09 \u5728\u6587\u4ef6\u7ba1\u7406\u5668\u4e2d\uff0c\u5c06\u9009\u9879 \u4e3b\u83dc\u5355-\u8bbe\u7f6e-\u9884\u89c8-\u56fe\u7247\u9884\u89c8 \u53d6\u6d88\u52fe\u9009\uff08\u5982\u4e0d\u53d6\u6d88\uff0c\u4f1a\u5f71\u54cd\u622a\u56fe\u5f55\u5c4f\u5e94\u7528\u7684\u6027\u80fd\u6570\u636e\uff09 \u79fb\u52a8\u6216\u5220\u9664\u7cfb\u7edf Logo \uff0c\u6392\u9664\u684c\u9762\u53f3\u4e0b\u89d2 Logo \u7684\u5f71\u54cd\uff08\u91cd\u542f\u751f\u6548\uff09\u3002 sudo mv /usr/share/deepin/uos_logo.svg ~/Pictures/\n \u5b89\u88c5\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\uff08\u5fc5\u987b\u5b89\u88c5\uff01\uff01\uff09 AMD \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_amd64.deb ARM \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_arm64.deb MIPS \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_mips64.deb 3A5000 \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_5000.deb \u5b89\u88c5\u547d\u4ee4 sudo dkpg -i xserver-xorg-input-libinput_0.28.2-2_amd64.deb\n \u5b89\u88c5\u65f6\u4f1a\u63d0\u793a\u5df2\u5b58\u5728\u76f8\u540c\u7248\u672c\uff0c\u8bf7\u5ffd\u7565\uff0c\u76f4\u63a5\u8986\u76d6\u5b89\u88c5\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u4e3b\u673a\u624d\u751f\u6548"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u670d\u52a1\u7aef\u4e00\u952e\u73af\u5883\u90e8\u7f72","text":"\u73af\u5883\u642d\u5efa\u524d\u5fc5\u987b\u5148\u8fde\u63a5\u4e0a USB \u4e32\u53e3\u7ebf\u548c\u91c7\u96c6\u76d2\u3002 \u5bbf\u4e3b\u673a\u73af\u5883\u5b89\u88c5 python3 manage.py install --env host\n \u5bb9\u5668\u73af\u5883\u5b89\u88c5 python3 manage.py install --env docker\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u56db\u3001\u914d\u7f6e\u9879","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u670d\u52a1\u7aef\u914d\u7f6e","text":"setting/config/server.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u914d\u7f6e\u9879\uff0c\u5305\u542b\u4e86\u6240\u6709\u670d\u52a1\u7aef\u6240\u6709\u7684\u53ef\u914d\u7f6e\u9879\u3002 \u672c\u5730\u65e0\u7f51\u7edc\u8fd0\u884c \u5c06\u914d\u7f6e\u9879 network=0 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u672c\u5730\u6709\u7f51\u7edc\u8fd0\u884c \u914d\u7f6e\u9879 network=1 (1)\u914d\u7f6e\u9879 client_alias= \u914d\u7f6e\u4e3a\u4f60\u8981\u6d4b\u8bd5\u7684\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5982 Alias1 \u6d4b\u8bd5\u673a\u522b\u540d\u5728 setting/config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 (2)\u914d\u7f6e\u9879 client_alias= \u4e3a\u7a7a\uff0c\u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager --client_alias Alias1\uff0c\u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002(Alias1 \u4e3a\u4f60\u914d\u7f6e\u7684\u6d4b\u8bd5\u673a\u522b\u540d) (1)\u548c(2)\u53ea\u8981\u4f7f\u7528\u5176\u4e00\u5373\u53ef\u3002 \u6709\u7f51\u7edc\u8fd0\u884c\uff0c\u4e14\u9700\u8981\u901a\u8fc7 Jenkins \u4e0a\u8fd0\u884c\u4e00\u4e2a job \uff0c\u540c\u65f6\u63a7\u5236\u591a\u53f0\u673a\u5668\u3002 \u914d\u7f6e\u9879 network=1 \u914d\u7f6e\u9879 client_alias= \u4e0d\u7528\u914d\u7f6e\uff0c\u5728\u8fd0\u884c run.sh \u7684\u65f6\u5019\u76f4\u63a5\u7a7a\u683c\u52a0\u522b\u540d\u5373\u53ef\uff0c\u6bd4\u5982\uff1a\u6d4b\u8bd5\u673a\u522b\u540d\u4e3a Alias1 \uff0c\u4e14\u5df2\u7ecf\u5728 config/client.ini \u4e2d\u914d\u7f6e\u4e86 Alias1 \u7684user ip password \uff0c\u5219\u8fd0\u884c bash run.sh Alias1 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u5728 Jenkins pipeline \u91cc\u9762\u901a\u8fc7\u5e76\u884c stage \u6216\u5e76\u884c\u8c03\u7528\u4e0b\u5c42\u4efb\u52a1\u7684\u65b9\u5f0f\u53ef\u4ee5\u5b9e\u73b0\u5927\u89c4\u6a21\u7684\u6027\u80fd\u6d4b\u8bd5\u9700\u6c42\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;1\u3001KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2\u3001KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f, e.g. TAGS = L1 or smoke\n[case_conf]\n# \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\uff0cocr\u6587\u6848\u8bc6\u522b\u8f83\u6162\uff0c\u4e0d\u63a8\u8350\u4f7f\u7528\nfind_by = stage\n# \u6700\u540e\u4e00\u4e2a\u7a33\u5b9a\u9636\u6bb5\u7684\u5e27\u6570\u8bc6\u522b\n# \u9996\u5e27\u5b58\u5728\u540e\u7684\u7b2c\u4e00\u4e2a\u5927\u4e8e\u8be5\u914d\u7f6e\u5e27\u6570\u7684\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u5c3e\u5e27\nfinal_stable_num=100\n# \u4ece\u8be5\u5e27\u6570\u5f00\u59cb\u8bc6\u522b\u6587\u6848\u6216\u56fe\u7247\uff0c\u51cf\u5c11\u5206\u6790\u65f6\u95f4\nstart_num = 150\n# \u8bc6\u522b\u7684\u6587\u6848\ntext=\n# \u8bc6\u522b\u56fe\u7247\nmatch=apps/xxx/images/match.png\n# \u8bc6\u522b\u76f8\u4f3c\u5ea6\nmatch_rate=0.9\n# \u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6bd4\u5982\u70ed\u542f\u52a8\u7528\u4f8b\uff0c\u4ece\u70b9\u51fb\u6253\u5f00\u5230\u505c\u6b62\u5f55\u5c4f\uff0c\u4e2d\u95f4\u7b49\u5f855\u79d2\uff1b\nduration = 15\n# \u5355\u6761\u7528\u4f8b\u6267\u884c\u7684\u6b21\u6570\ncount = 5\n# \u7a33\u5b9a\u9636\u6bb5\u5212\u5206\u7684\u76f8\u4f3c\u5ea6\nstable_similarity = 0.9997\n[server]\n# \u8c03\u8bd5\u6a21\u5f0f=1\uff0c\u4e3a\u5f00\u542f\u8c03\u8bd5\u6a21\u5f0f\uff0c0\u4e3a\u5173\u95ed\u3002\n# \u8c03\u8bd5\u6a21\u5f0f\u4e0b\u9ed8\u8ba4\u53ea\u6267\u884c\u4e00\u6b21\u7528\u4f8b\uff0c\u4e0d\u5173\u673a\n# \u7f16\u5199\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u5efa\u8bae\u5f00\u542fmaintain\u3002\nMAINTAIN = 0\n# \u8fd0\u884c\u7684\u73af\u5883docker\u5bb9\u5668\u73af\u5883\uff0chost\u5bbf\u4e3b\u673a\u73af\u5883\nENV = docker\n# \u670d\u52a1\u7aef\u5bc6\u7801\nPASSWORD=1\n# \u6307\u5b9a\u6d4b\u8bd5\u673a\u522b\u540d\n# \u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6bd4\u5982\uff1a\n# [AMD]\n# ip=10.8.15.86\n# user=uos\n# \u5176\u4e2d AMD \u4e3a\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5219client_alias=AMD\nCLIENT_ALIAS = x86\uff08Intel-i7\uff09\n# 1 \u5f00\u542f\u7f51\u7edc, 0 \u5173\u95ed\u7f51\u7edc\n# \uff081\uff09\u670d\u52a1\u7aef\u4e0e\u6d4b\u8bd5\u673a\u987b\u5728\u540c\u4e00\u7f51\u6bb5\u4e0b\uff0c\u4f60\u53ef\u4ee5\u5c1d\u8bd5\u5728\u670d\u52a1\u7aef\u901a\u8fc7ssh\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c\u5982\u679c\u53ef\u4ee5\u8fde\u63a5\uff0c\u8bf4\u660e\u7f51\u7edc\u6b63\u5e38\u3002\n# \uff082\uff09\u5f53input_type=FILE_NAME \u65f6\uff0c\u5fc5\u987b\u5f00\u542f\u7f51\u7edc\u3002\nNETWORK = 1\n# \u6027\u80fd\u7ed3\u679c\u7edf\u8ba1\u5355\u4f4d \u6beb\u79d2\u2014ms, \u79d2\u2014s\nUNIT=ms\n# \u6d4b\u8bd5\u673a\u5f00\u673a\u8fdb\u5165\u684c\u9762\u540e\u7b49\u5f85\u65f6\u95f4,\u5355\u4f4d/\u79d2\nSTARTUP_DELAY = 60\n# 1\u4e3a\u5220\u9664\u7f13\u5b58\uff0c0\u4e3a\u4e0d\u5220\u9664\u7f13\u5b58\n# \u7528\u4f8b\u6267\u884c\u5b8c\u540e\u4f1a\u5728report\u76ee\u5f55\u4e0b\u751f\u6210\u667a\u80fd\u89e3\u6790\u7684\u4e00\u4e9b\u7f13\u5b58\u56fe\u7247\u3002\nCACHE = 0\n# \u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u62a5\u544a\u4f1a\u4fdd\u5b58\u5728\u9879\u76ee\u4e0breport\u76ee\u5f55\u4e2d\uff1b\n# \u6307\u5b9a\u62a5\u544a\u76ee\u5f55\u5219\u5b58\u653e\u5230\u6307\u5b9a\u76ee\u5f55\u3002\nREPORT_PATH = report\n# \u670d\u52a1\u7aef\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684icon\u8d44\u6e90\u4f1a\u7f13\u5b58\u5728\u9879\u76ee\u4e0binput\u76ee\u5f55\u4e2d\nINPUT = input/\n# 1\u4e3a\u6d4b\u8bd5\u5b8c\u5173\u673a\uff0c0\u4e3a\u6d4b\u8bd5\u5b8c\u4e0d\u5173\u673a\nSHUTDOWN = 0\n# \u89e3\u6790\u8fdb\u7a0b\u6570\uff08\u4e0d\u63a8\u8350\u4fee\u6539\uff09\n# 3\u4e2a\u8fdb\u7a0b\u89e3\u6790\u89c6\u9891\u5df2\u7ecf\u80fd\u591f\u6ee1\u8db3\uff0c\u5373\u4f7f\u589e\u52a0\u8fdb\u7a0b\u6570\u4e5f\u4e0d\u80fd\u51cf\u5c11\u6574\u4f53\u8017\u65f6\n# \u53e6\u5916\u8fd8\u8981\u770bCPU\u6838\u6570\u662f\u5426\u652f\u6301\u3002\nPARSING_PROCESS = 3\n# 1\u4e3a\u4f7f\u7528\u7ee7\u7535\u5668\u5f00\u5173\u673a\uff0c0\u4e3a\u4f7f\u7528reboot\u547d\u4ee4\u91cd\u542f\u3002\u4f9d\u8d56\u7ee7\u7535\u5668\u786c\u4ef6\u8bbe\u5907\uff0c\u9700\u8981\u4f7f\u7528\u8054\u7cfb\u5f00\u53d1\u8005\nRELAY = 0\n# \u83b7\u53d6\u6d4b\u8bd5\u5e94\u7528\u7684\u7248\u672c, %s \u5360\u4f4d\u5e94\u7528\u540d\n# \u5982\u679c\u8be5\u914d\u7f6e\u4e3a\u7a7a\uff0c\u5219\u4e0d\u83b7\u53d6\u5e94\u7528\u7684\u7248\u672c\u4fe1\u606f\u3002\nCOMMAND = apt policy %s 2>/dev/null|grep \"\u5df2\u5b89\u88c5\"|awk -F \"\uff1a\" \"{print \\$2}\"\n# \u5173\u673a\u7b49\u5f85\u5f00\u542f\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6839\u636e\u6d4b\u8bd5\u673a\u6027\u80fd\u4e0d\u540c\uff0c\u5f00\u5173\u673a\u8017\u65f6\u53ef\u80fd\u4e0d\u540c\uff0c\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u673a\u60c5\u51b5\u914d\u7f6e\u3002\nSHUTDOWN_DELAY = 30\n# \u53ef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u56fe\u7247\u683c\u5f0f\uff0c\u4ee5\u82f1\u6587\u9017\u53f7\u9694\u5f00\u3002\n# \u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u76ee\u524d\u6211\u4eec\u4ec5\u9a8c\u8bc1\u4e86jpg,jpeg,png\u8fd9\u4e09\u79cd\u5e38\u7528\u7684\u56fe\u7247\u683c\u5f0f\u3002\nINPUT_TYPES = jpg,jpeg,png\n# \u6027\u80fd\u5206\u6790\u8865\u5e27\uff0c\u7b49\u4e8e\u6216\u4f4e\u4e8e\u8be5\u503c\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u9700\u8981\u51cf\u6389\u3002\nUN_STAB_START = 3\n# \u670d\u52a1\u7aef\u83b7\u53d6\u6d4b\u8bd5\u673a\u56fe\u50cf\u7684\u5e27\u7387\uff0c\u5373\u6bcf\u79d2\u83b7\u53d6\u591a\u5c11\u5f20\u6d4b\u8bd5\u673a\u4e0a\u7684\u56fe\u50cf\u3002\n# \u9ed8\u8ba4\u5e27\u7387\u4e3a30\u5e27/\u79d2\uff0c\u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u53ef\u80fd\u4f1a\u5bf9\u89e3\u6790\u7ed3\u679c\u9020\u6210\u504f\u5dee\u3002\nFPS = 30\n# \u4ee5\u4e0b\u573a\u666f\u7c7b\u578b\u4f1a\u91cd\u542f\u6d4b\u8bd5\u673a,\u591a\u79cd\u573a\u666f\u4f7f\u7528\u9017\u53f7\u9694\u5f00\nSCENE = cold\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = http://10.8.13.78:8890\n#\u5c4f\u5e55\u56fe\u7247\u4e34\u65f6\u5b58\u653e\u4f4d\u7f6e\nSCREEN_CACHE = /tmp/screen\n# =======================================\n[log]\n# \u65e5\u5fd7\u7ea7\u522b\uff0cOFF\u3001FATAL\u3001ERROR\u3001WARN\u3001INFO\u3001DEBUG\u3001ALL\n# \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u65e5\u5fd7\u8f93\u51fa\uff0clog_cli=INFO\u8868\u793a \u4ec5\u8f93\u51faINFO\u53ca\u4ee5\u4e0a\u7ea7\u522b\u7684\u65e5\u5fd7\u3002\nLOG_LEVEL = DEBUG\n# \u65e5\u5fd7\u6587\u4ef6\u4fdd\u5b58\u8def\u5f84\nLOG_PATH= logs\n# =======================================\n[dockerhub]\n# \u5bb9\u5668\u767b\u9646\u8d26\u53f7\nDOCKER_USER = user\n# \u5bb9\u5668\u767b\u9646\u5bc6\u7801\nDOCKER_PASSWORD = User1234\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u6d4b\u8bd5\u673a\u914d\u7f6e","text":"setting/config/client.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u4fe1\u606f\u3002 \u6709\u7f51\u7edc\u7684\u60c5\u51b5\u4e0b\uff0c\u670d\u52a1\u7aef\u9700\u8981\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u56e0\u6b64\u4f60\u9700\u8981\u5199\u5165 \u6d4b\u8bd5\u673a\u522b\u540d \u3001 user \u3001ip\u3001 password \u3002 # \u6d4b\u8bd5\u673a\u522b\u540d\n[Alias1] # \u6d4b\u8bd5\u673aip\nip=10.8.15.86 # \u6d4b\u8bd5\u673a\u7528\u6237\u540d\nuser=uos\n \u547d\u540d\u5efa\u8bae\uff1aAliasA1\u3001AliasA2\u3001AliasB1\u3001AliasB2\uff0c\u4e0d\u8981\u91cd\u540d\u3002 \u65e0\u7f51\u7edc\u60c5\u51b5\u4e0b\uff0c\u4ec5\u9700\u8981\u5173\u6ce8\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\u9879 width=\u3001 height= \u5373\u53ef\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a [client]\n# \u9ed8\u8ba4\u6d4b\u8bd5\u673a\u7528\u6237\u540d\uff0c\u5bc6\u7801\uff0cip\nip=\nuser=\n# \u6d4b\u8bd5\u673a\u5bc6\u7801\npassword=1\n# \u6d4b\u8bd5\u673a\u4e3b\u9898\ntheme=bloom\n# \u6d4b\u8bd5\u673aicon\u76ee\u5f55\npath=/usr/share/icons\n# \u7cfb\u7edfdesktop\u6587\u4ef6\u7684\u5b58\u653e\u76ee\u5f55\uff0cUOS\u7cfb\u7edf\u9ed8\u8ba4\u4e3a/usr/share/applications\ndesktop_path=/usr/share/applications\n# \u7528\u4e8e\u5224\u65ad\u6d4b\u8bd5\u673a\u662f\u5426\u5f00\u673a\u8fdb\u5165\u684c\u9762\u7684\u8bc6\u522b\u6807\u8bc6\u3002\n# 1\u3001\u901a\u8fc7\u684c\u9762\u56fe\u6807\u8bc6\u522b\u3002\n# - type=FILE_NAME\u65f6\uff0c\u670d\u52a1\u5668\u548c\u6d4b\u8bd5\u673a\u5fc5\u987b\u5728\u540c\u4e00\u5c40\u57df\u7f51\u5185\u3002\n# - power_on=dde-computer\u8868\u793a\u901a\u8fc7\u684c\u9762\u8ba1\u7b97\u673a\u56fe\u6807\u5224\u65ad\u5f00\u673a\u8fdb\u5165\u684c\u9762\u3002\n# 2\u3001\u901a\u8fc7\u672c\u5730\u56fe\u7247\u4f5c\u4e3a\u5f00\u673a\u8bc6\u522b\u3002\n# - type= \u4f20\u5165\u4e3a\u56fe\u7247\u683c\u5f0f\uff0ctype\u652f\u6301\u7684\u7c7b\u578b\u5305\u542b\u5728server.ini\u5185\u914d\u7f6e\u9879input_type=jpg,jpeg,png\u3002\n# - power_on= \u4f20\u5165\u7684\u662f\u672c\u5730\u56fe\u7247\u7684\u8def\u5f84\u3002\ntype=FILE_NAME\npower_on=dde-computer\n# \u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\uff08\u6d4b\u8bd5\u673a\u8fde\u63a5\u91c7\u96c6\u76d2\uff0c\u91c7\u96c6\u76d2\u7684\u5206\u8fa8\u7387\uff09\nheight=1080\nwidth=1920\n[AliasA1] ip=10.8.15.86\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n[AliasA2]\nip=10.8.15.20\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_2","title":"3\u3001\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e","text":"\u968f\u7740\u6d4b\u8bd5\u573a\u666f\u7684\u4e0d\u65ad\u5f15\u5165\uff0c\u53d1\u73b0\u73b0\u6709\u670d\u52a1\u7aef\u91cc\u7684\u914d\u7f6e\u9879\u5e76\u4e0d\u9002\u7528\u4e8e\u6240\u6709\u7684\u6027\u80fd\u573a\u666f\uff0c\u4e8e\u662f\u5c06\u670d\u52a1\u7aef\u914d\u7f6e\u8fdb\u884c\u4e00\u4e2a\u63d0\u53d6\uff0c\u53ef\u505a\u5355\u4e2a\u573a\u666f\u7684\u4e2a\u6027\u5316\u914d\u7f6e\uff0c\u5f53\u7136\u539f\u6765\u7684\u670d\u52a1\u7aef\u914d\u7f6e\u529f\u80fd\u4fdd\u7559\uff0c\u53ea\u662f\u5f53\u4f60\u914d\u7f6e\u4e86\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e\u540e\uff0c\u4f18\u5148\u4f7f\u7528\u4e2a\u6027\u5316\u914d\u7f6e\u91cc\u9762\u7684\u5185\u5bb9\uff0c\u4ee5\u4e0b\u662f\u5bf9\u4e2a\u6027\u5316\u914d\u7f6e\u7684\u4ecb\u7ecd\u3002 \u76ee\u524d\u6bcf\u4e00\u4e2a py \u6587\u4ef6\u5bf9\u5e94\u4e00\u4e2a\u6027\u80fd\u6d4b\u8bd5\u573a\u666f\uff0c\u4e8e\u662f\u5728\u540c\u7ea7\u76ee\u5f55\u4e0b\u521b\u5efa\u4e00\u4e2a\u4e0e\u4e4b\u540c\u540d\u7684 json \u6587\u4ef6\uff0c\u4f5c\u4e3a\u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6 apps\n\u251c\u2500\u2500 album\n \u251c\u2500\u2500 test_album_01_start.json # \u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6\n\u2514\u2500\u2500 test_album_01_start.py # \u6027\u80fd\u573a\u666f\u6587\u4ef6\n \u4ee5\u4e0b\u662f\u5bf9 json \u6587\u4ef6\u4e2d\u914d\u7f6e\u7684\u89e3\u91ca\uff0c\u82e5\u67d0\u9879\u914d\u7f6e\u4e0d\u9700\u8981\uff0c\u53ef\u4ee5\u7f3a\u5931\uff0c\u4f46\u4e0d\u80fd\u4e3a\u7a7a\uff1b {\n\"title\": \"test_album_start\", # \u6807\u9898\uff1b\u5fc5\u987b\n\"app_name\": \"deepin-album\", # \u573a\u666f\u6240\u5c5e\u7684\u5e94\u7528\uff1b\u5fc5\u987b\n\"scene\": \"hot\", # \u573a\u666f\u522b\u540d\uff1b\u5fc5\u987b\n\"icon\": [\"deepin-album\"], # \u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684icon\u5230\u670d\u52a1\u7aef\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\uff1b\u53ef\u7f3a\u5931\n# \u6ce8\u610f\uff1a\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684desktop\u6587\u4ef6\u540d\u4e3adeepin-album.desktop\uff0c\n# \u53ea\u9700\u8981\u5199deepin-album\u5373\u53ef\uff0c\u201c.desktop\u201d\u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002\n\"size\": { # \u56fe\u7247\u5bf9\u6bd4\u7684\u533a\u57df\u8bbe\u7f6e\u9879\uff0c\u67d0\u4e9b\u5e94\u7528\u5f53\u524d\u5c4f\u5e55\u7684\u90e8\u5206\u533a\u57df\u9700\u8981\u5c06\u5176\u53bb\u6389\uff0c\u53ef\u4ee5\u8bbe\u7f6e\u6b64\u9879\uff0c\u5982\u679c\u6ca1\u6709\u5219\u53ef\u4e0d\u5199\uff1b\u53ef\u786e\u5b9e\n\"x-coordinate\": 0, # \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n\"y-coordinate\": 0, # \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n\"width\": 850, # \u6a2a\u5411\u957f\u5ea6\n\"height\": 1920 # \u7eb5\u5411\u9ad8\u5ea6\n},\n\"count\": 5, # \u573a\u666f\u6267\u884c\u7684\u6b21\u6570\uff1b\u5fc5\u987b\n\"duration\": 5, # \u8be5\u6761\u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff0c\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7279\u5b9a\u573a\u666f\uff0c\u8be5\u914d\u7f6e\u4e3a\u53ef\u9009\u9879\uff0c\u8986\u76d6 server.ini \u4e2d\u7684\u914d\u7f6e\uff1b\u53ef\u7f3a\u5931\n\"stable_similarity\": 0.9997, # \u6027\u80fd\u573a\u666f\u5206\u9636\u6bb5\u65f6\u7684\u56fe\u7247\u76f8\u4f3c\u5ea6\u5bf9\u6bd4\uff0c\u524d\u540e\u56fe\u7247\u4f4e\u4e8e\u8be5\u503c\uff0c\u5219\u5206\u4e3a\u4e0d\u7a33\u5b9a\u9636\u6bb5\uff1b\u53ef\u7f3a\u5931\n\"find_by\": \"stage\", # \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\n\"final_stable_num\": 100, # \u67e5\u627e\u6700\u540e\u4e00\u4e2a\u5927\u4e8e\u8be5\u503c\u7684\u7a33\u5b9a\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u7684\u5c3e\u796f\uff1b\u53ef\u7f3a\u5931\n\"start_num\": 150,\n\"text\": \"\", # ocr\u8bc6\u522b\u7684\u6587\u6848\n\"match\": \"apps/xxx/images/match.png\", # \u56fe\u50cf\u5339\u914d\u7684\u56fe\u7247\u6587\u4ef6\u8def\u5f84\n\"match_rate\": 0.9 # \u5339\u914d\u76f8\u4f3c\u5ea6\n}\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e94\u3001\u6d4b\u8bd5\u6d41\u7a0b","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516d\u3001\u7528\u4f8b\u7f16\u5199\u53ca\u65b9\u6cd5\u53c2\u6570\u6307\u5f15","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"1\u3001\u7528\u4f8b\u5b9e\u4f8b\u8bf4\u660e","text":"# \u6807\u51c6\u5e93\u5bfc\u5165\nfrom time import sleep\n# \u5bfc\u5165\u4e09\u65b9\u5e93pytest\nimport pytest\n# \u5bfc\u5165\u7528\u4f8b\u6267\u884c\u8981\u7528\u5230\u7684Widget\u7c7b\nfrom src.base_widget import BaseWidget\nclass TestStart:\n# class\u7ea7\u522b\u7684fixture\uff0c\u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u6267\u884c\u3002autouse=True \u81ea\u52a8\u5728\u5f53\u524d\u4f5c\u7528\u57df\u4e0b\u4f7f\u7528\u3002\n@pytest.fixture(scope=\"class\", autouse=True)\n# \u6d4b\u8bd5\u70ed\u542f\u52a8\u4e4b\u524d\u9700\u8981\u9884\u542f\u52a8\u3002\ndef application_pre_start(self):\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().right_click_element(\"deepin-album\")\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().click_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\")\nsleep(2)\n# \u5feb\u6377\u952e\u5173\u95ed\u7a97\u53e3\nBaseWidget().hot_key(\"alt\", \"f4\")\nsleep(2)\n# \u9ed8\u8ba4\u4e3afunction\u7ea7\u522b\u7684fixture\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\uff0cclass\u7ea7\u522bfixture\u6267\u884c\u4e4b\u540e\u6267\u884c\u3002\n@pytest.fixture(autouse=True)\ndef setup_start(self):\n# \u53f3\u952e\u70b9\u51fb deepin-album \u56fe\u6807\nBaseWidget().right_click_element(\"deepin-album\")\n# \u79fb\u52a8\u5230\u53f3\u952e\u83dc\u5355\u4e2d\u6253\u5f00\uff08open.png\uff09\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().move_to(*BaseWidget().find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))\n# \u7b49\u5f85\u79fb\u52a8\u5b8c\u6210\nsleep(0.5)\ndef test_album_start(self):\n# \u70b9\u51fb\u201c\u6253\u5f00\u201d\nBaseWidget().click() \n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"2\u3001\u65b9\u6cd5\u53c2\u6570\u8bf4\u660e","text":"2.1\u3001find_element \u65b9\u6cd5 def find_element(element: str, input_type: str = \"FILE_NAME\", fill_color_position: tuple = (-1, -1), size: tuple = (25, 70)):\npass\n \u53c2\u6570 element \u548c input_type \uff081\uff09\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u5143\u7d20 - `input_type` \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a `FIEL_NAME` \uff0c\u8868\u793a\u901a\u8fc7\u5e94\u7528 `icon` \u5bfb\u627e\u5143\u7d20\uff0c\u6b64\u65b9\u6cd5\u4f1a\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u5e94\u7528 `icon` \u56fe\u6807\u3002\n \u4e3e\u4f8b\uff1a\u9ed8\u8ba4\u60c5\u51b5\u4e0b input_type \u53c2\u6570\u4e0d\u9700\u8981\u4f20\u5165\uff0c find_element(\"deepin-album\")\uff0c\u8868\u793a\u901a\u8fc7 deepin-album \u7684\u5e94\u7528 icon \u6765\u83b7\u53d6\u5750\u6807\uff0c\u6ce8\u610f\uff0c\u6b64\u65f6\u4f20\u5165\u7684 deepin-album \u53c2\u6570\u5b9e\u9645\u662f desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u548c2.3\u4e2d\u7684 icon \u53d8\u91cf\u4e00\u81f4\u3002 \u6211\u4eec\u5efa\u8bae\u4f18\u5148\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\uff0c\u4f46\u6b64\u65b9\u6cd5\u4f9d\u8d56\u7f51\u7edc\uff0c\u8bf7\u6839\u636e\u6d4b\u8bd5\u73af\u5883\u5b9e\u9645\u60c5\u51b5\u9009\u62e9\u3002 \uff082\uff09\u901a\u8fc7\u672c\u5730\u56fe\u7247\u8bc6\u522b\u5143\u7d20 - \u53c2\u6570 `input_type` \u4f20\u5165\u56fe\u7247\u683c\u5f0f\uff0c\u6bd4\u5982\u622a\u53d6\u7684\u672c\u5730\u56fe\u7247\u683c\u5f0f\u4e3a `png`\uff0c\u90a3\u4e48 `input_type=\"png\"`\uff0c\u6b64\u65f6\u53c2\u6570 `element ` \u4f20\u5165\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5efa\u8bae\u5b58\u653e\u5728\u5bf9\u5e94\u7684\u4ea7\u54c1 `apps/app/picture/` \u76ee\u5f55\u4e0b\uff0c\u8def\u5f84\u4e3a\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u7684\u76f8\u5bf9\u8def\u5f84\u3002\n- \u4e3e\u4f8b\uff1a`find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))`\uff0c\u8868\u793a\u901a\u8fc7\u672c\u5730\u56fe\u7247 `open.png` \u8bc6\u522b\u5143\u7d20\u3002\n \u53c2\u6570 fill_color_position fill_color_position \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (-1, -1)\uff0c(-1, -1) \u8868\u793a\u53d6\u5c4f\u5e55\u4e2d\u53f3\u4e0b\u89d2\u6700\u540e\u4e00\u4e2a\u50cf\u7d20\u70b9\u4f5c\u4e3a\u586b\u5145\u5750\u6807\uff0c\u5728 1920x1080 \u5c4f\u5e55\u5206\u8fa8\u7387\u4e0b\u5373\u5b9e\u9645\u5750\u6807\u4e3a (1919, 1079) \uff0c\u8fd9\u6837\u7684\u5199\u6cd5\u53ef\u4ee5\u9002\u914d\u4e0d\u540c\u5927\u5c0f\u7684\u5c4f\u5e55\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0d\u540c\u65b9\u4f4d\uff1a \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0b\u65b9\uff0c\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u4e0d\u9700\u8981\u4f20\u5165\u8be5\u53c2\u6570\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u5de6\u8fb9\uff0cfill_color_position=(1, 1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u53f3\u8fb9\uff0cfill_color_position=(-1, -1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0a\u8fb9\uff0cfill_color_position=(1, 1) \u4ece\u684c\u9762\u542f\u52a8\u5e94\u7528\uff0c\u5219\u9700\u8981\u4f20\u5165\u9664\u4efb\u52a1\u680f\u4ee5\u5916\u5176\u4ed6\u4f4d\u7f6e\u7684\u5750\u6807\uff0c\u6bd4\u5982(100, 100)\uff0c\u53ea\u8981\u8fd9\u4e2a\u5750\u6807\u4e3a\u9664\u5e94\u7528\u548c\u4efb\u52a1\u680f\u533a\u57df\u90fd\u53ef\u4ee5\u3002 \u4ece\u542f\u52a8\u5668\u91cc\u9762\u542f\u52a8\u5e94\u7528\uff0c\u9700\u8981\u586b\u5145\u7684\u5750\u6807\u4e3a\u542f\u52a8\u5668\u533a\u57df\u3002 \u6ce8\uff1a\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u65f6\uff0c\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684 icon \u539f\u6587\u4ef6\u4e3a svg \u77e2\u91cf\u56fe\uff0c\u8f6c\u6362\u4e3a png \u4e4b\u540e\u9700\u8981\u586b\u5145\u8fb9\u7f18\u900f\u660e\u90e8\u5206\u3002 \u53c2\u6570 size size \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (25, 70)\uff0c\u8868\u793a\u6d4b\u8bd5\u673a\u4e0a dock \u680f\u4e0a\u5e94\u7528\u56fe\u6807\u7684\u5927\u5c0f\u8303\u56f4\u3002 UOS \u7cfb\u7edf dock \u680f\u662f\u53ef\u4ee5\u4e0a\u4e0b\u62d6\u52a8\u5927\u5c0f\u7684\uff0c\u968f\u7740 dock \u680f\u5927\u5c0f\u6539\u53d8\uff0c\u5e94\u7528\u56fe\u6807\u7684\u8303\u56f4\u4e3a25\u523070\u4e4b\u95f4\u3002 \u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u64cd\u4f5c\u7cfb\u7edf\u4e0a dock \u680f\u5927\u5c0f\u4e0d\u4e00\u6837\uff0c\u53ef\u4ee5\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u4f20\u5165\u5927\u5c0f\u8303\u56f4\u3002 2.2\u3001click_element\u3001 right_click_element\uff0c double_click_element \u8fd9\u51e0\u4e2a\u65b9\u6cd5\u53c2\u6570\u89c4\u5219\u4e0e find_element \u65b9\u6cd5\u4e00\u6837\u3002\u4ed6\u4eec\u5b9e\u9645\u4e0a\u662f\u5728 find_element \u65b9\u6cd5\u57fa\u7840\u4e4b\u4e0a\u505a\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u589e\u52a0\u4e86\u9f20\u6807\u7684\u52a8\u4f5c\uff0c\u5982\u679c\u4f60\u4e0d\u60f3\u4f7f\u7528\u8fd9\u51e0\u4e2a\u65b9\u6cd5\uff0c\u5728\u7528\u4f8b\u4e2d\u4e5f\u53ef\u4ee5\u901a\u8fc7 find_element \u83b7\u53d6\u5230\u5750\u6807\uff0c\u7136\u540e\u5c06\u5750\u6807\u4f20\u5165\u5230\u952e\u9f20\u7684\u65b9\u6cd5\u4e2d\uff0c\u53ef\u4ee5\u5b9e\u73b0\u540c\u6837\u7684\u6548\u679c\u3002 2.3\u3001\u7528\u4f8b\u7c7b\u4e2d\u6709\u4e2a\u7c7b\u53d8\u91cf icon = [\"deepin-album\"] \u9700\u8981\u7279\u6b8a\u8bf4\u660e\uff0c\u5217\u8868\u4e2d\u7684\u5143\u7d20\u4e3a\u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709 icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684 icon \u5230\u670d\u52a1\u7aef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528 desktop \u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684 desktop \u6587\u4ef6\u540d\u4e3a deepin-album.desktop\uff0c\u53ea\u9700\u8981\u5199 deepin-album \u5373\u53ef\uff0c.desktop \u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e03\u3001\u6267\u884c\u5165\u53e3","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"1\u3001\u7528\u4f8b\u7ec4\u7ec7","text":"\u5728 setting/config/server.ini \u6587\u4ef6\u4e2d APP_NAME= \u5b57\u6bb5\u4e3a\u7528\u4f8b\u7684\u6267\u884c\u7684\u76ee\u5f55\uff0c\u9ed8\u8ba4\u4e3a apps \u76ee\u5f55\u4e0b\u6240\u6709\u7528\u4f8b\u3002\u5982\u679c\u4f60\u60f3\u6307\u5b9a\u6267\u884c\u67d0\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4f60\u53ef\u4ee5\u5c06\u8be5\u914d\u7f6e\u9879\u6307\u5b9a\u5230\u5e94\u7528\u7684\u7528\u4f8b\u76ee\u5f55\uff0c\u6bd4\u5982\uff1aAPP_NAME=deepin_album\uff0c \u8868\u793a\u6267\u884c\u76f8\u518c\u76ee\u5f55\u4e0b\u7684\u7528\u4f8b\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a python3 manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music\n -k KEYWORDS, --keywords KEYWORDS\n \u7528\u4f8b\u7684\u5173\u952e\u8bcd\n -t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e\n --log_level LOG_LEVEL \u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n --env {host,docker} \u5728\u5bbf\u4e3b\u673a\u6216\u5bb9\u5668\u73af\u5883\u6267\u884c\n --client_alias \u9009\u62e9\u6d4b\u8bd5\u673a\u522b\u540d, \u53ef\u9009\u9879\u4e3aclient.ini\u4e2d\u5df2\u914d\u7f6e, \u9ed8\u8ba4\u503c\u4e3a zx-x86.\n --count \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a python3 manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\" --env docker\n \u6ce8\uff1a\u5728\u5bb9\u5668\u4e2d\u6267\u884c\u65f6\uff0c\u82e5\u5f3a\u5236\u9000\u51fa\uff0c\u5bb9\u5668\u5e76\u4e0d\u4f1a\u505c\u6b62\u8fd0\u884c\uff01"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_9","title":"\u516b\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1json","title":"1\u3001Json \u62a5\u544a","text":"\u81ea\u7814\u89c6\u9891\u89e3\u6790\u5de5\u5177\u4f1a\u5bf9\u5355\u6761\u7528\u4f8b\u6267\u884c\u4e00\u8f6e\u751f\u6210\u4e00\u4e2a json \u6587\u4ef6\uff0c\u5b58\u653e\u4e8e report/{app_name}/{scene}/{run_num} \u76ee\u5f55\u4e0b\uff0c\u547d\u540d\u683c\u5f0f\u4e3a\uff1a report.json json \u5185\u5bb9\u4e3e\u4f8b\uff1a [\n{\n\"Stab1\": {\n\"images\": [1,2...150,151],\n\"startStub\": 0,\n\"type\": \"Stab\"\n}\n},\n{\n\"Stab2\": {\n\"images\": [152,153...169,170],\n\"startStub\": 1,\n\"type\": \"UnStab\"\n}\n},\n{\n\"Stab3\": {\n\"images\": [171,172...300,301],\n\"startStub\": 0,\n\"type\": \"UnStab\"\n}\n}\n]\n \u8bf4\u660e\uff1a Stab \uff1a\u8868\u793a\u89e3\u6790\u8fc7\u7a0b\u4e2d\u4e0d\u540c\u7684\u9636\u6bb5\u3002 images \uff1a\u8868\u793a\u6bcf\u4e00\u5e27\u7684\u56fe\u7247\u5e8f\u53f7\u3002 startStub\uff1a \u4e3a\u8bc6\u522b\u5c3e\u5e27\u7684\u9636\u6bb5\u8868\u793a\uff0c\u5982\u679c \"startStub\": 1 \uff0c\u8bf4\u660e\u5c3e\u5e27\u51fa\u73b0\u5728\u8be5\u9636\u6bb5\u3002 type\uff1a \u4e3a Stab \u6216 UnStab \uff0c\u8868\u793a\u7a33\u5b9a\u9636\u6bb5\u6216\u4e0d\u7a33\u5b9a\u9636\u6bb5\u3002 \u5404\u9636\u6bb5\u6709\u5e27\u6570\u8865\u507f\uff0c\u9ed8\u8ba4\u8865\u507f\u7684\u5e27\u6570\u4e3a 3 \u5e27\uff08\u53ef\u4ee5\u901a\u8fc7 server.ini \u91cc\u9762 un_stab_start=3 \u8fdb\u884c\u914d\u7f6e\uff09\uff0c\u8868\u793a\u5c0f\u4e8e\u7b49\u4e8e 3 \u5e27\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u524d\u540e\u5747\u9700\u8981\u51cf\u6389\u3002 \u5e94\u7528\u542f\u52a8\u9636\u6bb5\u5c31\u662f\u5728 Stab2 \u9636\u6bb5\uff0c\u542f\u52a8\u65f6\u95f4\u4e3a\uff1a171 \u51cf 151 \u518d\u51cf\u6389\u524d\u540e\u8865\u507f\u5e27\u6570 6 \u5e27\uff0c\u5373 14 \u5e27\uff0c\u89c6\u9891\u5e27\u7387 30 \u5e27/\u79d2\uff0c\u56e0\u6b64\u542f\u52a8\u8017\u65f6\u4e3a\uff1a14 * 33 = 462 ms"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2excel","title":"2\u3001Excel \u62a5\u544a","text":"\u6240\u6709\u7528\u4f8b\u6267\u884c\u5e76\u89e3\u6790\u5b8c\u4e4b\u540e\u4f1a report \u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a\u6c47\u603b\u6570\u636e\u7684 Excel \u6587\u4ef6\uff0c\u6587\u4ef6\u540d\u4e3a\uff1a{time}_perf_time.xlsx\u3002 \u6ce8\u610f\uff0creport \u76ee\u5f55\u4e3a\u53ef\u914d\u7f6e\u9879\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u4f1a\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u751f\u6210\uff0c\u5982\u679c\u4f60\u5c06 report\uff0c\u6307\u5b9a\u5230\u9879\u76ee\u4e0b\u5176\u4ed6\u8def\u5f84\uff0c\u5219\u4f1a\u5728\u5bf9\u5e94\u7684\u8def\u5f84\u4e0b\u751f\u6210 json \u548c Excel \u6587\u4ef6\u3002 \u4f60\u4e5f\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8bfb\u53d6\u6240\u6709 json / excel \u62a5\u544a\u7684\u6570\u636e\uff0c\u751f\u6210\u4f60\u81ea\u5df1\u60f3\u8981\u7684\u4e00\u4e9b\u6d4b\u8bd5\u62a5\u544a\u5f62\u5f0f\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#usb","title":"\u4e5d\u3001USB \u4e32\u53e3\u9a71\u52a8\u952e\u9f20\u65b9\u6cd5","text":"\u4f4d\u4e8e src/utils/control/serial_communication \u76ee\u5f55\u4e0b\u7684 usb_mk.py \u6587\u4ef6 usb_mk = UsbMk()\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up()\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u652f\u6301\u4f20\u5165\u6c49\u5b57\uff0c\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click()\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() \n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() \n \uff084\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() \n \uff085\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() \n \uff086\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() \n \uff087\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff088\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff0810\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_10","title":"\u5341\u3001\u7ee7\u7535\u5668\u63a7\u5236\u4e3b\u673a\u5f00\u673a/\u91cd\u542f","text":"\uff08\u82e5\u4e0d\u4f7f\u7528\u7ee7\u7535\u5668\uff0c\u53ef\u5ffd\u7565\u8be5\u6b65\u9aa4\uff0c\u6267\u884c\u65f6\u4f1a\u901a\u8fc7\u547d\u4ee4 reboot\uff09"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u7ee7\u7535\u5668\u8bbe\u5907","text":"LCUS-2 \u578b \u53cc\u8def USB \u667a\u80fd\u4e32\u53e3\u63a7\u5236\u7ee7\u7535\u5668\u3002 https://item.taobao.com/item.htm?spm=a1z09.2.0.0.41d72e8dUYx2pi&id=582653718178&_u=i25r20ia6a2e "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2usb","title":"2\u3001USB \u5ef6\u957f\u7ebf","text":"\u666e\u901a\u7684 USB \u7ebf\u5373\u53ef\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_3","title":"3\u3001\u675c\u90a6\u7ebf","text":"3.1\u300140P \u6bcd\u5bf9\u516c\u675c\u90a6\u7ebf\u3002 3.2\u3001\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"4\u3001\u5b89\u88c5\u56fe\u6587\u6559\u7a0b","text":"4.1\u3001\u4f7f\u7528 USB \u5ef6\u957f\u7ebf\u8fde\u63a5\u63a7\u5236\u7aef\u548c\u7ee7\u7535\u5668\u3002 4.2\u3001\u5728\u7ee7\u7535\u5668\u5e38\u7aef\u548c\u516c\u5171\u7aef\u5747\u8fde\u63a5\u4e00\u6839\u675c\u90a6\u7ebf\u3002 4.3\u3001\u5728\u4e3b\u677f\u4e0a\u5f00\u673a\u9488\u548c\u91cd\u542f\u9488\u4e0a\u63d2\u4e0a\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 4.4\u3001\u5c06\u5f00\u673a\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76841\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1\u5de6\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 4.5\u3001\u5c06\u91cd\u542f\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76842\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1 \u53f3\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 \u82e5\u60f3\u4fdd\u7559\u539f\u7535\u6e90\u5f00\u5173\u7684\u7535\u6e90\u706f\uff0c\u53ef\u6839\u636e\u5982\u4e0a\u56fe\u6240\u793a\uff0c\u4f7f\u7528\u675c\u90a6\u7ebf\u8fde\u63a5\u4e3b\u677f\u4e0a\u7684\u7535\u6e90\u706f\u548c\u539f\u7535\u6e90\u5f00\u5173"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_11","title":"\u5341\u4e00\u3001\u5e38\u89c1\u95ee\u9898\u8bf4\u660e","text":"1\u3001ERROR: for uos Cannot restart container 2301b1a1395d7959ee6523d61b61c87084649af530786cdb8fb5b3ecbcbd1068: linux runtime spec devices: error gathering device information while adding custom device \"/dev/ttyACM0\": no such file or directory \u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u8fde\u63a5\u72b6\u6001\uff0c\u67e5\u770b /dev/ttyACM0 \u662f\u5426\u5b58\u5728\uff0c\u82e5\u5b58\u5728 /dev/ttyACMn\uff08n\u4e3a\u4efb\u610f\u6570\u5b57\uff09\uff0c\u91cd\u542f\u7535\u8111\u89e3\u51b3\u3002 2\u3001Error response from daemon: Container 5e700fdc769e8c74666d68a7f2bc3de58268b4594cf88706609d59f8dbc7362d is not running \u5bb9\u5668\u542f\u52a8\u5931\u8d25 1\uff09\u68c0\u67e5\u54ea\u4e00\u4e2a\u5bb9\u5668\u672a\u542f\u52a8 sudo docker container ls # \u5217\u51fa\u8fd0\u884c\u4e2d\u7684 Docker \u5bb9\u5668\n 2\uff09\u7f3a\u5c11 uos \u5bb9\u5668\uff0c\u68c0\u67e5 USB \u4e32\u53e3\u8fde\u63a5\u7ebf\u548c\u91c7\u96c6\u76d2\u8fde\u63a5\u7ebf\u662f\u5426\u6b63\u5e38\uff0c\u91cd\u542f\u540e\u6267\u884c bash install/setup.up # \u91cd\u65b0\u5b8c\u6574\u90e8\u7f72\u73af\u5883\n \u6216\u6267\u884c sudo docker-compose up -d --build # \u4ec5\u91cd\u65b0\u6784\u5efa Docker \u955c\u50cf\n 3\u3001\u82e5\u90e8\u7f72\u65f6\u63d0\u793a\u6302\u8f7d ttyACM0\u3001video0 \u5931\u8d25\uff0c\u8bf7\u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u53ca\u91c7\u96c6\u76d2\u662f\u5426\u63a5\u89e6\u826f\u597d\uff0c\u82e5\u63a5\u89e6\u826f\u597d\uff0c\u91cd\u542f\u5373\u53ef\u89e3\u51b3\u3002 4\u3001\u82e5\u51fa\u73b0\u56fe\u7247\u80fd\u8bc6\u522b\uff0c\u4f46\u662f\u9f20\u6807\u672a\u79fb\u52a8\u64cd\u4f5c\u65f6\uff0c\u5b89\u88c5\u7edd\u5bf9\u9f20\u6807\u64cd\u4f5c\u7684\u4f9d\u8d56\u5305\uff0c\u89c1\u7b2c\u4e09\u8282\u7b2c\u4e8c\u5c0f\u8282\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u6d4b\u8bd5\u673a\u3002 5\u3001\u7531\u4e8e\u901a\u8fc7\u91c7\u96c6\u5361\u83b7\u53d6\u7684\u6d4b\u8bd5\u673a\u5b9e\u65f6\u753b\u9762\uff0c\u5305\u542b\u4e86\u9f20\u6807\u7684\u6837\u5f0f\uff0c\u6240\u4ee5\u5bf9\u56fe\u7247\u8bc6\u522b\u65f6\uff0c\u9f20\u6807\u82e5\u505c\u7559\u5728\u56fe\u6807\u4e0a\u5c42\uff0c\u5219\u4f1a\u5bf9\u8bc6\u522b\u7ed3\u679c\u9020\u6210\u5f71\u54cd\uff0c\u9700\u8981\u5c06\u9f20\u6807\u79fb\u52a8\u81f3\u5176\u4ed6\u4f4d\u7f6e\uff0c\u6216\u8005\u9690\u85cf\u9f20\u6807\u89e3\u51b3\u3002 6\u3001Excel \u62a5\u544a\u4e2d\uff0c\u6d4b\u8bd5\u573a\u666f\u5217\u4e0e\u7528\u4f8b\u4e2d\u7684\u4e0d\u4e00\u81f4\uff0c\u5173\u952e\u5b57scene\u3001app_name\u3001\u67b6\u6784\u522b\u540d\uff0c\u4e0d\u80fd\u5305\u542b\u4e0b\u5212\u7ebf\u548c\u82f1\u6587\u7b26\u53f7\u7684\u5706\u62ec\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/","title":"\u6846\u67b6\u529f\u80fd\u4ecb\u7ecd","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2023/1/12\n# Author : Mikigo\n# =============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_2","title":"\u4e00\u3001\u4e00\u53e5\u8bdd\u7b80\u4ecb","text":"\u6b64\u6587\u6863\u4e3b\u8981\u60f3\u5bf9 YouQu \u6846\u67b6\u4e00\u4e9b\u91cd\u70b9\u7684\u529f\u80fd\u505a\u8be6\u7ec6\u7684\u4ecb\u7ecd\uff0c\u5305\u62ec\u5bf9\u4e00\u4e9b\u529f\u80fd\u5f00\u53d1\u7684\u80cc\u666f\u3001\u8981\u89e3\u51b3\u7684\u95ee\u9898\u3001\u5b9e\u73b0\u903b\u8f91\u3001\u4ee3\u7801\u7b49\u65b9\u9762\u7684\u4ecb\u7ecd\uff0c\u4ee5\u6b64\u8ba9\u5927\u5bb6\u80fd\u66f4\u52a0\u6e05\u6670\u7684\u7406\u89e3\u5404\u9879\u529f\u80fd\uff0c\u4ece\u800c\u5728\u4f7f\u7528\u7684\u65f6\u5019\u80fd\u66f4\u52a0\u7684\u5f97\u5fc3\u5e94\u624b\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_3","title":"\u4e8c\u3001\u56fe\u50cf\u8bc6\u522b","text":"\u56fe\u50cf\u8bc6\u522b\u5728 UI \u81ea\u52a8\u5316\u4e2d\u662f\u4e0d\u53ef\u7f3a\u5c11\u7684\uff0c\u5e02\u9762\u4e0a\u751a\u81f3\u6709\u5b8c\u5168\u57fa\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\uff0c\u6bd4\u5982 Airtest\u3001Sikuli \u7b49\uff0c\u5728\u6e38\u620f\u7b49\u7279\u5b9a\u9886\u57df\u4e5f\u6709\u4e0d\u9519\u7684\u6548\u679c\uff0c\u8fd9\u4e9b\u5de5\u5177\u5b9e\u9645\u4e0a\u4e5f\u662f\u7528\u7684 OpenCV \u8fdb\u884c\u4e86\u5c01\u88c5\uff0cYouQu \u6846\u67b6\u57fa\u4e8e OpenCV \u5f00\u53d1\u4e86\u81ea\u5df1\u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\uff0c\u5b83\u53ef\u4ee5\u65b9\u4fbf\u7684\u7528\u4e8e\u754c\u9762\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u65ad\u8a00\uff1b YouQu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u51e0\u4e4e\u6ee1\u8db3\u4e86\u4f60\u7684\u6240\u6709\u8981\u6c42\uff0c\u6211\u4eec\u5728\u957f\u65f6\u95f4\u7684\u601d\u8003\u548c\u6478\u7d22\u4e2d\uff0c\u9488\u5bf9\u5e38\u89c4\u573a\u666f\u53ca\u4e00\u4e9b\u7279\u6b8a\u573a\u666f\u63a2\u7d22\u9664\u4e86\u4e00\u4e9b\u5b9e\u7528\u4e14\u6709\u6548\u7684\u65b9\u6848\uff0c\u4e14\u542c\u6211\u6162\u6162\u9053\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1","title":"1\u3001\u5e38\u89c4\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5e38\u89c4\u8bc6\u522b\u5f88\u597d\u7406\u89e3\uff0c\u4e00\u53e5\u8bdd\u8bb2\u5c31\u662f\uff0c\u8981\u83b7\u53d6\u5230\u76ee\u6807\u5143\u7d20\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u3002 \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u5728\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u9700\u8981\u83b7\u53d6\u7684\u5750\u6807\u662f\u76f8\u5bf9\u4e8e\u6574\u4e2a\u5c4f\u5e55\u7684\u5750\u6807\uff0c\u6211\u4eec\u53ef\u4ee5\u622a\u53d6\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u56fe\u7247\uff08screen\uff09\uff1b \u5728\u5143\u7d20\u8bc6\u522b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u622a\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5c0f\u56fe\u8fdb\u884c\u8bc6\u522b\uff0c\u6bd4\u5982\u622a\u53d6\u64ad\u653e\u6309\u94ae\uff1a \u90a3\u4e48\u5b9e\u9645\u4e0a\uff0c\u5143\u7d20\u5b9a\u4f4d\u7684\u95ee\u9898\u5c31\u8f6c\u6362\u4e3a\uff0c\u5c06\u622a\u56fe\u7684\u5c0f\u56fe\uff08play_btn\uff09\u62ff\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u5927\u56fe\uff08screen\uff09\u4e2d\u53bb\u505a\u5339\u914d\uff0c\u5982\u679c\u5339\u914d\u6210\u529f\uff0c\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff08 x, y \uff09\u5373\u53ef\u3002 \u4e3a\u4e86\u65b9\u4fbf\u63cf\u8ff0\uff0c\u4ee5\u4e0b\u6211\u5c06\u6574\u4e2a\u5c4f\u5e55\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5927\u56fe\uff0c\u67d0\u4e2a\u5143\u7d20\u56fe\u7247\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5c0f\u56fe\u3002 \u57fa\u4e8e OpenCV \u7684\u6a21\u677f\u5339\u914d cv.matchTemplate() \u529f\u80fd\uff0c\u6211\u4eec\u5b9e\u73b0\u4e86\u56fe\u50cf\u5b9a\u4f4d\u7684\u529f\u80fd\uff0c\u6846\u67b6\u63d0\u4f9b\u4e86\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u5e95\u5c42\u63a5\u53e3\uff08\u4e00\u822c\u4e0d\u5bf9\u4e0a\u5c42\u63d0\u4f9b\u8c03\u7528\uff09\uff1a def _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\n# \u8be6\u7ec6\u4ee3\u7801\u592a\u957f\u4e0d\u8d34\u4e86\uff0c\u611f\u5174\u8da3\u8bf7\u67e5\u770b\u6e90\u7801\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001image_path image_path \u662f\u5c0f\u56fe\u7684\u7edd\u5bf9\u8def\u5f84; \u901a\u5e38\u5728 AT \u5de5\u7a0b\u91cc\u9762\uff0c\u6211\u4eec\u7ea6\u5b9a\u5c06\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u5b9e\u9645\u7684\u5143\u7d20\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1aplay_btn.png \uff1b \u7528\u4e8e\u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 case/assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1amusic_001.png \uff1b \u8fd9\u6837\u662f\u4e3a\u4e86\u65b9\u4fbf\u7ba1\u7406\u548c\u7ef4\u62a4\u3002 2\u3001rate \u56fe\u50cf\u8bc6\u522b\u7684\u7684\u5339\u914d\u5ea6\u6216\u8005\u8bf4\u76f8\u4f3c\u5ea6\uff0c\u6846\u67b6\u9ed8\u8ba4\u7684\u914d\u7f6e\u4e3a 0.9\uff0c\u4e5f\u5c31\u662f\u8bf4\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u5b58\u5728\u4e00\u4e2a\u76f8\u4f3c\u5ea6 90% \u7684\u56fe\u6807\u5373\u8fd4\u56de\u5176\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff1b \u5982\u679c\u4f60\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u8c03\u6574\u8bc6\u522b\u5ea6\uff0c\u4f60\u53ef\u4ee5\u5728\u8c03\u7528\u51fd\u6570\u7684\u65f6\u5019\uff0c\u4f20\u5165\u4e0d\u540c\u7684\u8bc6\u522b\u5ea6\u7684\u503c\u3002 3\u3001multiple \u9ed8\u8ba4\u60c5\u51b5\u4e0b multiple=False\uff0c\u8868\u793a\u53ea\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u7b2c\u4e00\u4e2a\uff0c\u5982\u679c multiple=True \u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\uff0c\u56e0\u4e3a\u5927\u56fe\u4e2d\u53ef\u80fd\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u5c0f\u56fe\uff0c\u5728\u67d0\u4e9b\u573a\u666f\u4e0b\u4f60\u53ef\u80fd\u9700\u8981\u5168\u90e8\u83b7\u53d6\u5230\u6240\u6709\u5339\u914d\u5230\u7684\u5750\u6807\u3002 4\u3001picture_abspath \u9ed8\u8ba4\u60c5\u51b5\u4e0b picture_abspath=None \u8868\u793a\u5927\u56fe\u4e3a\u622a\u53d6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u5982\u679c\u4f60\u4e0d\u5e0c\u671b\u5927\u56fe\u662f\u5c4f\u5e55\u7684\u622a\u56fe\uff0c\u800c\u662f\u4f60\u81ea\u5b9a\u4e49\u4f20\u5165\u7684\u67d0\u4e2a\u56fe\u7247\uff0c\u4f60\u53ea\u9700\u8981\u5c06\u4f60\u7684\u56fe\u7247\u8def\u5f84\u4f20\u9012\u7ed9\u8fd9\u4e2a\u53c2\u6570\u5c31\u884c\uff0c\u6bd4\u5982\uff1a picture_abspath=\"~/Desktop/big.png\" \uff1b 5\u3001screen_bbox \u5927\u56fe\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u622a\u53d6\u6574\u4e2a\u5c4f\u5e55\uff0cscreen_bbox = [x, y, w, h] \u53ef\u4ee5\u6307\u5b9a\u622a\u53d6\u5c4f\u5e55\u4e2d\u7684\u56fa\u5b9a\u533a\u57df\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\uff0c\u53ef\u4ee5\u6392\u9664\u90e8\u5206\u533a\u57df\u5bf9\u8bc6\u522b\u7ed3\u679c\u7684\u5f71\u54cd\u3002 \u3010\u9690\u5f0f\u7b49\u5f85\u3011 \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\uff0c\u6709\u65f6\u5019\u9875\u9762\u8df3\u8f6c\u6709\u5ef6\u65f6\uff0c\u6709\u53ef\u80fd\u5b58\u5728\u8bc6\u522b\u7684\u90a3\u4e00\u523b\u9875\u9762\u4e5f\u6ca1\u6709\u8df3\u8f6c\u51fa\u6765\uff0c\u6216\u8005\u6216\u8005\u8bc6\u522b\u7684\u90a3\u4e00\u523b\uff1b \u56e0\u6b64\u6211\u4eec\u9700\u8981\u4e00\u79cd\u7b49\u5f85\u673a\u5236\uff0c\u5373\u5728\u4e00\u5b9a\u7684\u65f6\u95f4\u5185\uff0c\u5982\u679c\u8bc6\u522b\u4e0d\u5230\uff0c\u91cd\u590d\u53bb\u8bc6\u522b\uff1a def find_image(\ncls,\n*widget, rate: [float, int] = None,\nmultiple: bool = False,\nmatch_number: int = None,\npicture_abspath: str = None,\nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u5728\u5c4f\u5e55\u4e2d\u533a\u5bfb\u627e\u5c0f\u56fe\uff0c\u8fd4\u56de\u5750\u6807\uff0c\n \u5982\u679c\u627e\u4e0d\u5230\uff0c\u6839\u636e\u914d\u7f6e\u91cd\u8bd5\u6b21\u6570\uff0c\u6bcf\u6b21\u95f4\u96941\u79d2\n :param widget: \u6a21\u677f\u56fe\u7247\u8def\u5f84\n :param rate: \u76f8\u4f3c\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param match_number: \u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\n :return: \u5750\u6807\u5143\u7ec4\n \"\"\"\nif rate is None:\nrate = float(GlobalConfig.IMAGE_RATE)\ntry:\nfor element in widget:\nfor _ in range((match_number or int(GlobalConfig.IMAGE_MATCH_NUMBER)) + 1):\nlocate = cls._match_image_by_opencv(\nelement,\nrate,\nmultiple=multiple,\npicture_abspath=picture_abspath,\nscreen_bbox=screen_bbox\n)\nif not locate:\nsleep(int(GlobalConfig.IMAGE_MATCH_WAIT_TIME))\nelse:\nreturn locate\nraise TemplateElementNotFound(*widget)\nexcept Exception as e:\nraise e\n \u53c2\u6570 match_number \u7528\u4e8e\u63a7\u5236\u91cd\u590d\u8bc6\u522b\u7684\u6b21\u6570\uff0c\u9ed8\u8ba4\u4e0d\u4f20\u53c2\uff0c\u53d6\u5168\u5c40\u914d\u7f6e setting/globalconfig.ini \u91cc\u9762\u7684 IMAGE_MATCH_NUMBER \u914d\u7f6e\u9879\u7684\u503c\uff0c\u9ed8\u8ba4IMAGE_MATCH_NUMBER = 1\uff0c\u5373\u91cd\u8bd5 1 \u6b21\uff1b find_image \u662f\u6846\u67b6\u63d0\u4f9b\u7684\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u51fd\u6570\u63a5\u53e3\uff0c\u8fd9\u4e2a\u51fd\u6570\u63d0\u4f9b\u4e86\u9690\u5f0f\u7b49\u5f85\u7684\u529f\u80fd\uff0c\u4e14\u5305\u542b\u4e0a\u9762\u4ecb\u7ecd\u7684 _match_image_by_opencv \u51fd\u6570\u7684\u6240\u6709\u529f\u80fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2","title":"2\u3001\u6c14\u6ce1\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u6c14\u6ce1\u8bc6\u522b\u6307\u7684\u662f\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\u8981\u5b9a\u4f4d\u7684\u5143\u7d20\u662f\u4e00\u4e9b\u4f1a\u6d88\u5931\u7684\u5c0f\u5f39\u7a97\uff0c\u8fd9\u7c7b\u573a\u666f\u5728\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\u5c31\u53ef\u80fd\u5b58\u5728\u4e0d\u7a33\u5b9a\u6027\uff0c\u6709\u53ef\u80fd\u56fe\u50cf\u8bc6\u522b\u7684\u65f6\u5019\u6c14\u6ce1\u5df2\u7ecf\u6d88\u5931\u4e86\uff0c\u4e5f\u6709\u53ef\u80fd\u6c14\u6ce1\u51fa\u73b0\u7684\u65f6\u95f4\u592a\u77ed\u4e86\uff0c\u4e0d\u5bb9\u6613\u6355\u6349\u5230\uff0c\u5c31\u50cf\u6c14\u6ce1\u4e00\u6837\uff0c\u51fa\u73b0\u4e00\u4e0b\u5c31\u6d88\u5931\uff0c\u56e0\u6b64\u6211\u4eec\u5f62\u8c61\u7684\u79f0\u4e4b\u4e3a \u201c\u6c14\u6ce1\u8bc6\u522b\u201d\uff1b \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u4e3a\u4e86\u80fd\u7a33\u5b9a\u7684\u8bc6\u522b\u6c14\u6ce1\u7c7b\u573a\u666f\uff0c\u6211\u4eec\u91c7\u7528\u7684\u65b9\u6848\u662f\uff1a \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\uff08\u5305\u542b\u6c14\u6ce1\u4ece\u51fa\u73b0\u5230\u6d88\u5931\uff09\uff0c\u4e0d\u505c\u7684\u622a\u53d6\u8fd9\u6bb5\u65f6\u95f4\u5185\u7684\u5927\u56fe\uff0c\u4ee5\u6b64\u786e\u4fdd\u5728\u622a\u53d6\u7684\u4e00\u5806\u56fe\u7247\u4e2d\uff0c\u80af\u5b9a\u6709\u81f3\u5c11\u4e00\u5f20\u56fe\u7247\u80fd\u6355\u6349\u5230\u6c14\u6ce1\uff0c\u6700\u540e\u518d\u5bf9\u8fd9\u4e00\u5806\u56fe\u7247\u9010\u4e2a\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def get_during(\ncls,\nimage_path: str,\nscreen_time: [float, int],\nrate: float = None,\npause: [int, float] = None,\nmax_range: int = 10000\n):\n\"\"\"\n \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u622a\u56fe\u591a\u5f20\u56fe\u7247\u8fdb\u884c\u8bc6\u522b\uff0c\u5176\u4e2d\u6709\u4e00\u5f20\u56fe\u7247\u8bc6\u522b\u6210\u529f\u5373\u8fd4\u56de\u7ed3\u679c;\n \u9002\u7528\u4e8e\u6c14\u6ce1\u7c7b\u7684\u65ad\u8a00\uff0c\u6bd4\u5982\u6c14\u6ce1\u57281\u79d2\u5185\u6d88\u5931\uff0c\u5982\u679c\u7528\u5e38\u89c4\u7684\u56fe\u50cf\u8bc6\u522b\u5219\u6709\u53ef\u80fd\u65e0\u6cd5\u8bc6\u522b\u5230\uff1b\n :param image_path: \u8981\u8bc6\u522b\u7684\u6a21\u677f\u56fe\u7247\uff1b\n :param screen_time: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff1b\n :param rate: \u8bc6\u522b\u7387\uff1b\n :param pause: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u4e0d\u95f4\u9694\uff1b\n :param max_range: \u622a\u56fe\u7684\u6700\u5927\u6b21\u6570\uff0c\u8fd9\u662f\u4e00\u4e2a\u9884\u8bbe\u503c\uff0c\u4e00\u822c\u60c5\u51b5\u4e0b\u4e0d\u6d89\u53ca\u4fee\u6539\uff1b\n \"\"\"\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001screen_time \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5728\u6b64\u65f6\u95f4\u5185\u4f1a\u4e0d\u65ad\u7684\u8fdb\u884c\u622a\u56fe\u64cd\u4f5c\uff0c\u5c31\u50cf\u5f55\u5236\u89c6\u9891\u4e00\u6837\uff1b 2\u3001pause \u6bcf\u6b21\u622a\u53d6\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u4e00\u523b\u4e0d\u505c\u7684\u622a\u56fe\uff0c\u5982\u679c\u4f60\u60f3\u6bcf\u6b21\u622a\u56fe\u5b58\u5728\u4e00\u4e9b\u95f4\u9694\u65f6\u95f4\u4f20\u5165\u5bf9\u5e94\u7684\u65f6\u95f4\u95f4\u9694\u5373\u53ef\uff0c\u5355\u4f4d\u662f\u79d2\uff0c\u6bd4\u5982\uff1apause = 0.03\uff0c\u8868\u793a 30 ms\uff0c\u76f8\u5f53\u4e8e\u5e27\u7387\u4e3a 30 \u5e27\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-opencv","title":"3\u3001\u4e0d\u4f9d\u8d56 OpenCV \u7684\u56fe\u50cf\u8bc6\u522b\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31","title":"3.1\u3001\u81ea\u7814\u56fe\u50cf\u8bc6\u522b\u6280\u672f","text":"\u3010\u539f\u7406\u3011 \u4e3a\u4e86\u5b9e\u73b0\u8bc6\u522b\u56fe\u50cf\u7684\u76ee\u7684\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u5c06\u56fe\u7247\u7684\u6bcf\u4e2a\u50cf\u7d20\u7684RGB\u503c\uff0c\u4e0e\u6574\u4e2a\u5c4f\u5e55\u4e2d\u7684RGB\u8fdb\u884c\u5bf9\u6bd4\uff0c\u5982\u679c\u5c0f\u56fe\u4e0a\u7684RGB\u503c\u4e0e\u5bf9\u5e94\u5927\u56fe\u4f4d\u7f6e\u7684RGB\u90fd\u76f8\u7b49\uff0c\u5219\u5339\u914d\u6210\u529f\uff0c\u5373\u53ef\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u70b9\u3002 1\u3001\u8bfb\u53d6\u5c0f\u56fe\u548c\u5927\u56fe\u7684RGB\u503c \uff081\uff09\u5c0f\u56fe\u7684RGB\u503c small_data = small_pic.load() # load()\u4f1a\u5c06\u56fe\u7247\u7684RGB\u503c\u83b7\u53d6\u5230\uff0c\u6570\u636e\u683c\u5f0f\u4e3a\u4e00\u4e2a\u4e8c\u7ef4\u5217\u8868\uff0c\u8d4b\u503c\u7ed9\u4e00\u4e2a\u53d8\u91cfsmall_data\u3002\n \uff082\uff09\u5927\u56fe\u7684RGB\u503c big_data = big_pic.load()\n 2\u3001\u5c06\u5c0f\u56fe\u4e0e\u5927\u56fe\u7684RGB\u503c\u8fdb\u884c\u5339\u914d \uff081\uff09\u5339\u914d\u4ece\u5927\u56fe\u7684\u5750\u6807\uff080\uff0c0\uff09\u5f00\u59cb\u5339\u914d\uff0c\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff082\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\uff080\uff0c0\uff09\u5bf9\u5e94\u7684\u6240\u6709\u5c0f\u56fe\u7684RGB\u503c\u4e0d\u76f8\u7b49\uff0c\u5219\u79fb\u52a8\u5230\u4e0b\u4e00\u4e2a\u5750\u6807\u70b9\uff081\uff0c0\uff09\uff0c\u540c\u6837\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff083\uff09\u6309\u7167\u8fd9\u6837\u7684\u89c4\u5f8b\u5c06\u8fd9\u4e00\u884c\u6bcf\u79fb\u52a8\u4e00\u4e2a\u5750\u6807\u70b9\uff0c\u90fd\u5c06\u5c0f\u56fe\u6240\u6709\u7684RGB\u4e0e\u5bf9\u5e94\u5927\u56fe\u7684\u503c\u8fdb\u884c\u5339\u914d\uff1b \uff084\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\u5176\u4e2d\u4e00\u4e2a\u5750\u6807\u70b9\u4e0a\u5339\u914d\u5230\u4e86\u5c0f\u56fe\u7684\u6240\u6709RGB\u503c\uff0c\u5219\u6b64\u65f6\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\u70b9\uff1b \uff085\uff09\u5982\u679c\u5339\u914d\u4e86\u5927\u56fe\u6240\u6709\u7684\u5750\u6807\u70b9\uff0c\u90fd\u6ca1\u6709\u5339\u914d\u5230\uff0c\u5219\u8bf4\u660e\u5927\u56fe\u4e2d\u4e0d\u5b58\u5728\u5c0f\u56fe\uff0c\u5339\u914d\u5931\u8d25\uff1b \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 class ImageRgb:\n@staticmethod\ndef _check_match(_x, _y, small, bdata, sdata, rate):\n\"\"\"\n Matching degree of small graph and large graph matching\n \"\"\"\n@staticmethod\ndef _pre_random_point(small):\n\"\"\"\n Pre matching, take 10-20 points at random each time,\n and take coordinates randomly in the small graph\n \"\"\"\n@staticmethod\ndef _pre_random_match(_x, _y, point_list, bdata, sdata, rate):\n\"\"\"\n In the small graph, several points are randomly\n selected for matching, and the matching degree is\n also set for the random points\n \"\"\"\n@classmethod\ndef match_image_by_rgb(cls, image_name=None, image_path=None, rate=0.9):\n\"\"\"\n By comparing the RGB values of the small image with the large\n image on the screen, the coordinates of the small image on\n the screen are returned.\n \"\"\"\n \u901a\u8fc7 match_image_by_rgb() \u8fd9\u4e2a\u51fd\u6570\uff0c\u4f20\u5165\u76ee\u6807\u5c0f\u56fe\u7684\u6587\u4ef6\u540d\u79f0\uff0c\u5373\u53ef\u8fd4\u56de\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u3002 \u6709\u540c\u5b66\u8981\u95ee\u4e86\uff0c\u6709 OpenCV \u5e72\u561b\u4e0d\u7528\uff0c\u6709\u5fc5\u8981\u81ea\u5df1\u5b9e\u73b0\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u529f\u80fd\u5417\uff0c\u4f60\u4eec\u662f\u4e0d\u662f\u95f2\u7684\u554a\uff1f \u8fd9\u4e48\u95ee\u7684\u8bdd\uff0c\u5c0f\u4e86\uff0c\u683c\u5c40\u5c0f\u4e86\uff1b\u6211\u4eec\u81ea\u5df1\u5b9e\u73b0\u4e3b\u8981\u6709\u51e0\u65b9\u9762\u539f\u56e0\uff1a \u51cf\u5c11\u73af\u5883\u4f9d\u8d56\uff0c\u5373\u4e0d\u7528\u5b89\u88c5 OpenCV\uff0c\u6211\u4eec\u4e5f\u80fd\u5b9e\u73b0\u5176\u529f\u80fd\uff0c\u73af\u5883\u4f9d\u8d56\u8fd9\u5757\u540e\u9762\u4f1a\u5355\u72ec\u8be6\u7ec6\u8bb2\uff0c\u51cf\u5c11\u73af\u5883\u4f9d\u8d56\u5bf9\u4e8e\u4efb\u4f55\u8f6f\u4ef6\u5de5\u7a0b\u90fd\u975e\u5e38\u91cd\u8981\uff1b OpenCV \u5728\u5176\u4ed6\u56fd\u4ea7 CPU \u67b6\u6784\u4e0a\u5b89\u88c5\u5e76\u4e0d\u80fd\u4fdd\u8bc1100%\u6210\u529f\uff0c\u751a\u81f3\u6709\u6ca1\u6709\u53ef\u80fd\u5728\u4e00\u4e9b\u67b6\u6784\u4e0a\u538b\u6839\u513f\u5c31\u4e0d\u80fd\u5b89\u88c5\u4f7f\u7528 OpenCV \uff1f \u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 OpenCV \uff1f\u5c31\u50cf\u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 Windows \u5462\uff1f\u8fd9\u4e9b\u95ee\u9898\u503c\u5f97\u601d\u8003\u3002 \u5f53\u7136\uff0c\u6211\u4eec\u627f\u8ba4\u8fd9\u5957\u65b9\u6848\uff0c\u867d\u7136\u8bc6\u522b\u51c6\u786e\u7387\u6ca1\u95ee\u9898\uff0c\u4f46\u5728\u8bc6\u522b\u6548\u7387\u4e0a\u8fd8\u6ca1\u6709\u8fbe\u5230 OpenCV \u6a21\u677f\u5339\u914d\u7684\u6548\u679c\uff0c\u6211\u4eec\u7684\u65b9\u6848\u6bcf\u6b21\u8bc6\u522b\u5728 1.5s \u5de6\u53f3\uff0c\u800c OpenCV \u5728 1s \u5de6\u53f3\uff1b \u6574\u4f53\u8bc6\u522b\u6548\u679c\u6765\u8bb2\uff0c\u6211\u8ba4\u4e3a\u8fd8\u662f\u53ef\u4ee5\u63a5\u53d7\u7684\uff0c\u4e5f\u5e0c\u671b\u6709\u5fd7\u4e4b\u58eb\u80fd\u4e00\u8d77\u4f18\u5316\u6b64\u65b9\u6848\uff0c\u4e00\u8d77\u6280\u672f\u62a5\u56fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32-rpc","title":"3.2\u3001\u57fa\u4e8e RPC \u670d\u52a1\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b","text":"\u5728\u8fdc\u7a0b\u670d\u52a1\u5668\u4e0a\u90e8\u7f72 OpenCV \u7684\u73af\u5883\uff0c\u5e76\u5c06\u5176\u90e8\u7f72\u4e3a RPC \u670d\u52a1\uff0c\u6d4b\u8bd5\u673a\u4e0a\u4e0d\u7528\u5b89\u88c5 OpenCV \u4f9d\u8d56\uff0c\u800c\u662f\u901a\u8fc7\u8bf7\u6c42 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u3010\u539f\u7406\u3011 \u6d4b\u8bd5\u673a\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u56fe\u7247\u4ee5\u53ca\u6a21\u677f\u56fe\u7247\uff0c\u53d1\u9001\u7ed9 RPC \u670d\u52a1\u7aef\uff0c\u670d\u52a1\u7aef\u62ff\u5230\u4e24\u5f20\u56fe\u7247\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u6700\u540e\u5c06\u8bc6\u522b\u7ed3\u679c\u8fd4\u56de\u7ed9\u6d4b\u8bd5\u673a\uff1b \u8981\u7279\u6b8a\u8bf4\u660e\u7684\u662f\uff1a RPC \u662f\u4e00\u79cd\u534f\u8bae\uff0c\u8bb8\u591a\u8bed\u8a00\u90fd\u662f\u652f\u6301\u7684\uff0c\u6bd4\u5982\u8bf4\u670d\u52a1\u7aef\u4e5f\u53ef\u4ee5\u7528 C++ \u6765\u5b9e\u73b0\uff0c\u5ba2\u6237\u7aef\u4f7f\u7528 Python \u4e5f\u662f\u53ef\u4ee5\u8c03\u7528\u7684\u3002 \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 \u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nimport cv2 as cv\nimport numpy as np\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\nif __name__ == \"__main__\":\nserver = ThreadXMLRPCServer((\"x.x.x.x\", 8889), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(match_image_by_opencv, \"match_image_by_opencv\")\nserver.serve_forever()\n \u8fd9\u6837\uff0c\u6211\u4eec\u57fa\u4e8e Python \u6807\u51c6\u5e93 xmlrpc \u642d\u5efa\u4e86\u4e00\u4e2a RPC \u670d\u52a1\u5668\uff0c\u6ce8\u518c\u4e86 image_put \u548c match_image_by_opencv \u4e24\u4e2a\u529f\u80fd\u63a5\u53e3\uff0c\u5728\u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u901a\u8fc7 IP \u548c\u7aef\u53e3\u8fdb\u884c RPC \u8bf7\u6c42\uff1b \u5ba2\u6237\u7aef\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from xmlrpc.client import Binary\nfrom xmlrpc.client import ServerProxy\nserver = ServerProxy(GlobalConfig.OPENCV_SERVER_HOST, allow_none=True)\nscreen_rb = open(screen, \"rb\")\ntemplate_rb = open(template_path, \"rb\")\ntry:\nscreen_path = server.image_put(Binary(screen_rb.read()))\nscreen_rb.close()\ntpl_path = server.image_put(Binary(template_rb.read()))\ntemplate_rb.close()\nreturn server.match_image_by_opencv(\ntpl_path, screen_path, rate, multiple\n)\nexcept OSError as exc:\nraise EnvironmentError(\nf\"RPC\u670d\u52a1\u5668\u94fe\u63a5\u5931\u8d25. {GlobalConfig.OPENCV_SERVER_HOST}\"\n) from exc\n \u901a\u8fc7\u8fd4\u56de server.match_image_by_opencv \u5c31\u83b7\u53d6\u4e86\u5728\u670d\u52a1\u7aef\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4","title":"4\u3001\u53f3\u952e\u83dc\u5355\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41","title":"4.1\u3001\u53f3\u952e\u83dc\u5355\u5b9a\u4f4d\u7684\u65b9\u6848\u53ca\u95ee\u9898","text":"\u53f3\u952e\u83dc\u5355\u7684\u5143\u7d20\u5b9a\u4f4d\u662f\u4e00\u4e2a\u96be\u70b9\uff0c\u8fc7\u53bb\u6211\u4eec\u8c03\u7814\u548c\u4f7f\u7528\u8fc7\u7684\u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u65b9\u6cd5\u6709 4 \u79cd\uff1a \u7b2c\u4e00\u79cd\uff1a\u6b65\u957f\u64cd\u4f5c\u6cd5 \u5728\u53f3\u952e\u83dc\u5355\u547c\u51fa\u6765\u4e4b\u540e\uff0c\u901a\u8fc7\u952e\u76d8\u7684 up\u3001down \u6309\u952e\uff0c\u8fdb\u884c\u9009\u62e9\u83dc\u5355\u9009\u62e9\uff0c\u9009\u4e2d\u76ee\u6807\u4e4b\u540e enter \u5373\u53ef\uff1b\u6bd4\u5982\uff1a\u5728\u684c\u9762\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\uff0c\u6309 1 \u6b21 down \uff0c\u4f1a\u51fa\u73b0\u4e0b\u56fe\uff1a \u7ee7\u7eed\u518d\u6309 2 \u6b21 down\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u518d\u6309 enter\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u5982\u6b64\uff0c\u201c\u6392\u5e8f\u65b9\u5f0f\u201d\u7684\u6b65\u957f\u4e3a 3\uff1b\u901a\u8fc7\u4f7f\u7528\u952e\u76d8\u4e0a\u4e0b\u952e\uff0c\u5c31\u5b9e\u73b0\u4e86\u5bf9\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\uff1b \u4f46\u662f\uff0c\u8fd9\u79cd\u65b9\u5f0f\u6709\u4e2a\u5f88\u70e6\u4eba\u7684\u95ee\u9898\uff0c\u5c31\u662f\u53f3\u952e\u83dc\u5355\u7684\u9009\u9879\u4f4d\u7f6e\u4e0d\u53ef\u80fd\u4e00\u76f4\u4e0d\u53d8\uff0c\u5728\u9700\u6c42\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\uff0c\u83dc\u5355\u9009\u9879\u7684\u53d8\u5316\u662f\u5f88\u5927\u7684\uff0c\u751a\u81f3\u6709\u4e9b\u5e94\u7528\u652f\u6301\u81ea\u5b9a\u4e49\u83dc\u5355\uff0c\u6bd4\u5982\u6587\u7ba1\u53f3\u952e\u83dc\u5355\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff1b \u4e5f\u5c31\u662f\u8bf4\u4f60\u5f97\u7ecf\u5e38\u53bb\u7ef4\u62a4\u83dc\u5355\u9009\u9879\u7684\u6b65\u957f\uff0c\u4e00\u4e2a\u9009\u9879\u73b0\u5728\u7684\u6b65\u957f\u662f 3\uff0c\u4e0b\u4e2a\u8fed\u4ee3\u53ef\u80fd\u5c31\u662f 4 \u6216\u8005 5\u3002 \u7b2c\u4e8c\u79cd\uff1a\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u6cd5 \u628a\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5355\u72ec\u622a\u56fe\u4fdd\u5b58\uff0c\u56fe\u7247\u4e2d\u4ec5\u5305\u542b\u4e00\u4e2a\u83dc\u5355\u9009\u9879\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u8fd9\u6837\uff0c\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5c31\u53ef\u4ee5\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u65b9\u5f0f\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u8fd9\u79cd\u65b9\u5f0f\u4e0d\u7528\u62c5\u5fc3\u83dc\u5355\u9009\u9879\u7684\u987a\u5e8f\u6216\u4f4d\u7f6e\uff0c\u4f46\u662f\u9700\u8981\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff0c\u4e14\u5bb9\u6613\u53d7\u5230\u5b57\u4f53 UI \u53d8\u66f4\u7c7b\u9700\u6c42\u7684\u5f71\u54cd\uff0c\u6bd4\u5982\uff1a\u5b57\u4f53\u5927\u5c0f\u3001\u5b57\u4f53\u95f4\u8ddd\u7b49\u7b49\u9700\u6c42\u53d8\u66f4\u90fd\u4f1a\u5f71\u54cd\uff0c\u6bcf\u6b21\u53d8\u66f4\u4e4b\u540e\u5c31\u9700\u8981\u8fdb\u884c\u5927\u91cf\u56fe\u7247\u8d44\u6e90\u7684\u91cd\u65b0\u622a\u56fe\u66ff\u6362\uff0c\u662f\u4e2a\u6bd4\u8f83\u9ebb\u70e6\u7684\u4e8b\u60c5\uff1b \u7b2c\u4e09\u79cd\uff1a\u76f8\u5bf9\u4f4d\u79fb\u6cd5 \u9f20\u6807\u70b9\u51fb\u53f3\u952e\u7684\u65f6\u5019\uff0c\u9f20\u6807\u7684\u5f53\u524d\u5750\u6807\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u7684\uff0c\u83dc\u5355\u9009\u9879\u7684\u5bbd\uff08 w \uff09\u4e00\u822c\u662f\u56fa\u5b9a\u7684\uff0c\u53d8\u5316\u7684\u662f\u83dc\u5355\u7684\u957f\u5ea6\uff08 h \uff09\uff0c\u53ef\u4ee5\u901a\u8fc7\u67d0\u4e2a\u9009\u9879\u76f8\u5bf9\u4e8e\u9f20\u6807\u7684\u8ddd\u79bb\u5728\u786e\u5b9a\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u901a\u8fc7\u7ef4\u62a4\u83dc\u5355\u9009\u9879\uff08\u76f8\u5bf9\u4f4d\u7f6e\uff09\u76f8\u5bf9\u4e8e\u9f20\u6807\u4f4d\u7f6e\u7684\u8ddd\u79bb\uff0c\u5373\u53ef\u8f7b\u677e\u8ba1\u7b97\u51fa\u83dc\u5355\u9009\u9879\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\u3002 \u4ece\u7406\u8bba\u4e0a\u6b64\u65b9\u6848\u662f\u53ef\u884c\u7684\uff0c\u4f46\u662f\u8fd9\u91cc\u4ecd\u7136\u5b58\u5728\u4e24\u4e2a\u4e25\u91cd\u7684\u95ee\u9898\uff1a \u83dc\u5355\u987a\u5e8f\u6539\u53d8\uff0c\u5bfc\u81f4\u76f8\u5bf9\u8ddd\u79bb\u6539\u53d8\uff0c\u800c\u4e14\u8ddd\u79bb\u662f\u901a\u8fc7\u50cf\u7d20\uff08px\uff09\u6765\u8868\u793a\u7684\uff0c\u4e0d\u60f3\u6b65\u957f\u90a3\u4e48\u53ea\u7ba1\uff0c\u6bcf\u6b21\u9700\u8981\u53bb\u91cf\u4e00\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u70b9\u9ebb\u70e6\uff1b \u9f20\u6807\u5728\u684c\u9762\u4e0d\u540c\u4f4d\u7f6e\u70b9\u51fb\u53f3\u952e\uff0c\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u4f4d\u7f6e\u662f\u4e0d\u540c\u7684\uff0c\u4e0a\u56fe\u7684\u83dc\u5355\u662f\u5728\u9f20\u6807\u7684\u5de6\u4e0b\u65b9\uff0c\u5982\u679c\u4f60\u79fb\u52a8\u9f20\u6807\u5230\u5c4f\u5e55\u56db\u8fb9\uff0c\u4f60\u4f1a\u53d1\u73b0\uff0c\u53f3\u952e\u83dc\u5355\u53ef\u80fd\u51fa\u73b0\u5728\u9f20\u6807\u7684\u56db\u4e2a\u65b9\u5411\uff0c\u4e5f\u5c31\u662f\u8bf4\u4f60\u9700\u8981\u6839\u636e\u9f20\u6807\u7684\u4e0d\u540c\u4f4d\u7f6e\u6765\u5224\u65ad\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u65b9\u5411\uff0c\u800c\u4e0d\u540c\u7684\u65b9\u5411\u4e0a\u8ba1\u7b97\u65b9\u6cd5\u662f\u4e0d\u540c\u7684\uff0c\u6bd4\u5982\uff1a\u53f3\u952e\u83dc\u5355\u5728\u9f20\u6807\u7684\u5de6\u4e0a\uff0c\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\u8ba1\u7b97\u65b9\u6cd5\u4e3a\uff08x - w / 2\uff0c y - h\uff09\uff0c\u8fd9\u6837\u7ef4\u62a4\u8d77\u6765\u53ef\u4ee5\u8bf4\u975e\u5e38\u590d\u6742\uff1b \u57fa\u4e8e\u4ee5\u4e0a\u4e24\u4e2a\u539f\u56e0\uff0c\u6211\u4eec\u5e76\u4e0d\u63a8\u8350\u8fd9\u79cd\u64cd\u4f5c\u65b9\u6848\u3002 \u7b2c\u56db\u79cd\uff1a\u5c5e\u6027\u5b9a\u4f4d \u6709\u540c\u5b66\u8bf4\u5e72\u561b\u4e0d\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u5462\uff0c\u5176\u5b9e\uff0c\u6211\u4eec\u6700\u5f00\u59cb\u60f3\u5230\u7684\u65b9\u6848\u5c31\u662f\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\uff0c\u4f46\u662f\u5728\u5c5e\u6027\u7684 DOM \u6811\u91cc\u600e\u4e48\u4e5f\u627e\u4e0d\u5230\uff0c\u65e0\u6cd5\u5b9a\u4f4d\u5230\uff0c\u6211\u4eec\u4e5f\u8054\u5408\u7814\u53d1\u540c\u5b66\u4e00\u8d77\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u4f46\u6700\u7ec8\u8fd8\u662f\u6ca1\u80fd\u89e3\u51b3\uff0c\u975e\u5e38\u9057\u61be\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42","title":"4.2\u3001\u6700\u65b0\u7684\u53f3\u952e\u83dc\u5355\u7ec8\u6781\u89e3\u51b3\u65b9\u6848","text":"\u7531\u4e8e\u53f3\u952e\u83dc\u5355\u9009\u9879\u51e0\u4e4e\u90fd\u662f\u6587\u672c\uff0c\u90a3\u4e48\u901a\u8fc7 OCR \u8bc6\u522b\uff0c\u51e0\u4e4e\u662f\u6700\u4f18\u7684\u65b9\u6848\uff1a \u4e0d\u7528\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff1b \u4e0d\u4f1a\u53d7\u5230\u83dc\u5355\u9009\u9879\u987a\u5e8f\u6539\u53d8\u7684\u5f71\u54cd\uff1b \u4e0d\u4f1a\u53d7\u5230\u5b57\u4f53 UI \u53d8\u5316\u7684\u5f71\u54cd\uff1b \u5173\u4e8e OCR \u8bc6\u522b\u6211\u4eec\u5728\u540e\u9762\u4f1a\u8be6\u7ec6\u8bb2\u5230\uff0c\u672c\u7ae0\u8282\u4e3b\u8981\u8bb2\u57fa\u4e8e OCR \u8bc6\u522b\uff0c\u6211\u4eec\u5728\u53f3\u952e\u83dc\u5355\u8bc6\u522b\u4e0a\u7684\u7a81\u7834\u548c\u521b\u65b0\uff1b \u4f7f\u7528 OCR \u8bc6\u522b\u53f3\u952e\u83dc\u5355\u867d\u7136\u5df2\u7ecf\u5f88\u5b8c\u7f8e\u4e86\uff0c\u4f46\u662f\u5728\u4e00\u4e9b\u60c5\u51b5\u4e0b\u4ecd\u7136\u5b58\u5728\u4e00\u70b9\u95ee\u9898\uff0c\u5c31\u662f\u5c4f\u5e55\u4e2d\u51fa\u73b0\u591a\u4e2a\u548c\u83dc\u5355\u9009\u9879\u6587\u5b57\u76f8\u540c\u7684\u6587\u5b57\u65f6\uff0c\u6bd4\u5982\u4e0b\u9762\u8fd9\u79cd\u60c5\u51b5\uff1a \u5c4f\u5e55\u6070\u597d\u51fa\u73b0\u4e86\u4e24\u4e2a\u201c\u590d\u5236\u201d\uff0c\u6b64\u65f6\u8981\u5b9a\u4f4d\u5230\u83dc\u5355\u4e2d\u7684 \u201c\u590d\u5236\u201d\uff0c\u5c31\u9700\u8981\u8fdb\u4e00\u6b65\u505a\u6570\u636e\u5904\u7406\uff0c\u6bd4\u5982\uff1aOCR \u8fd4\u56de 2 \u4e2a\u201c\u590d\u5236\u201d\u7684\u5750\u6807\uff0c\u7528\u4f8b\u91cc\u9762\u6765\u5224\u65ad\u7528\u54ea\u4e2a\uff0c\u4ece\u4e1a\u52a1\u4e0a\u5c06\u5904\u7406\u8d77\u6765\u6bd4\u8f83\u9ebb\u70e6\uff0c\u56e0\u4e3a\u4f60\u5f97\u660e\u786e\u77e5\u9053\u83dc\u5355\u5728\u5de6\u8fb9\u8fd8\u662f\u53f3\u8fb9\uff0c\u7136\u540e\u8fd9\u672c\u8eab\u5c31\u662f\u4e0d\u786e\u5b9a\u7684\uff1b \u600e\u4e48\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u5462\uff0c\u8fd9\u5c31\u8981\u8bf4\u9053\u672c\u7ae0\u7684\u4e3b\u9898\uff1a\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b\u3002 \u3010\u539f\u7406\u3011 \u5728\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u524d\u622a\u4e00\u5f20\u56fe\uff0c\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\u518d\u622a\u53d6\u4e00\u5f20\u56fe\uff0c\u4e24\u5f20\u56fe\u552f\u4e00\u53d8\u5316\u7684\u5c31\u662f\u53f3\u952e\u83dc\u5355\uff0c\u5c06\u5176\u4ed6\u76f8\u540c\u7684\u5730\u65b9\u90fd\u5c4f\u853d\u6389\uff0c\u53ea\u7559\u4e0b\u83dc\u5355\u754c\u9762\uff0c\u5982\u6b64\u5373\u53ef\u6d88\u9664\u5e72\u6270\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u5c06\u4e24\u79cd\u56fe\u505a\u524d\u540e\u5bf9\u6bd4\u63d0\u53d6\u53ef\u4ee5\u5f97\u5230\u8fd9\u6837\u7684\u56fe\uff1a \u4f60\u770b\uff0c\u901a\u8fc7\u524d\u540e\u56fe\u7247\u7684\u5bf9\u6bd4\uff0c\u5c06\u76f8\u540c\u7684\u90e8\u5206\u7ed9\u6d88\u9664\u6389\uff0c\u518d\u8fdb\u884c OCR \u8bc6\u522b\uff0c\u8fd9\u6837\u5c31\u4e0d\u4f1a\u6709\u5e72\u6270\u4e86\uff1b \u4ee3\u7801\u5b9e\u73b0\u8bf7\u67e5\u770b src/filter_image.py \uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def filter_image(action):\n\"\"\"\n \u5bf9\u6bd4\u52a8\u4f5c\u524d\u540e\u4e24\u5f20\u56fe\u7247\uff0c\u63d0\u53d6\u4e0d\u540c\u7684\u90e8\u5206\u751f\u6210\u4e00\u5f20\u65b0\u7684\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u65b0\u56fe\u7247\u7684\u8def\u5f84\n :param action: \u52a8\u4f5c\u51fd\u6570\u7684\u51fd\u6570\u5bf9\u8c61\n :return: \u65b0\u56fe\u7247\u7684\u8def\u5f84\n \"\"\"\n action \u662f\u9f20\u6807\u4e8b\u4ef6\uff0c\u56e0\u4e3a\u6b64\u7c7b\u573a\u666f\u4e0d\u4ec5\u4ec5\u5728\u53f3\u952e\u5b58\u5728\uff0c\u5355\u51fb\u3001\u53cc\u51fb\u7b49\u7b49\uff0c\u53ea\u8981\u64cd\u4f5c\u524d\u540e\u540e\u53d8\u5316\u7684\u90fd\u53ef\u4ee5\uff1a from src.mouse_key import MouseKey\naction = (\nMouseKey.click,\nMouseKey.right_click,\nMouseKey.double_click,\nMouseKey.move_to,\n)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5","title":"5\u3001\u52a8\u6001\u56fe\u50cf\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5728\u684c\u9762\u58c1\u7eb8\u5207\u6362\uff0c\u6216\u770b\u56fe\u3001\u76f8\u518c\u5207\u6362\u56fe\u7247\u7c7b\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u7531\u4e8e\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u662f\u4e0d\u56fa\u5b9a\u7684\uff08\u4e0d\u540c\u7248\u672c\u7684\u7cfb\u7edf\u58c1\u7eb8\u4e0d\u540c\u3001\u58c1\u7eb8\u987a\u5e8f\u4e0d\u540c\uff0c\u770b\u56fe\u76f8\u518c\u5728\u56fe\u7247\u8d44\u6e90\u4e0d\u4e00\u5b9a\u56fa\u5b9a\uff09\uff0c\u90a3\u4e48\u5728\u6d4b\u8bd5\u5207\u6362\u58c1\u7eb8\u6216\u8005\u5207\u6362\u56fe\u7247\u7684\u573a\u666f\u65f6\u5c31\u4f1a\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u4f60\u4e0d\u77e5\u9053\u9884\u671f\u662f\u5565\uff0c\u7528\u4f8b\u64cd\u4f5c\u52a8\u6001\u7684\uff0c\u4e5f\u662f\u6781\u4e0d\u7a33\u5b9a\u3002 \u3010\u539f\u7406\u3011 \u5728\u5207\u6362\u56fe\u7247\u4e4b\u524d\u622a\u56fe\u4fdd\u5b58\u5e76\u8fd4\u56de\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u6b21\u8bc6\u522b\u8fd9\u5f20\u56fe\u7247\uff0c\u5982\u679c\u4e0d\u5b58\u5728\uff0c\u8bf4\u660e\u56fe\u7247\u5df2\u7ecf\u5207\u6362\u4e86\uff1b \u793a\u610f\u56fe\uff1a \u8fd9\u6837\uff0c\u6211\u4eec\u622a\u53d6\u4e86\u5f53\u524d\u56fe\u7247\u4e2d\u6bd4\u8f83\u6709\u4ee3\u8868\u6027\u7684\u4f4d\u7f6e\uff08\u4e00\u53ea\u9e1f\uff09\uff0c\u5728\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u7528\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1a \u6211\u4eec\u518d\u62ff\u7740\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd9\u6837\u5728\u5f53\u524d\u56fe\u7247\u4e2d\uff0c\u5c31\u4e0d\u80fd\u627e\u5230\u8fd9\u53ea\u9e1f\u4e86\uff0c\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u662f False\uff0c\u90a3\u4e48\u4e5f\u5c31\u53ef\u4ee5\u5224\u65ad\u56fe\u7247\u5207\u6362\u662f\u6210\u529f\u7684\u3002 \u4ee3\u7801\u793a\u610f\uff1a def save_temporary_picture(_x: int, _y: int, width: int, height: int):\n\"\"\"\n \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u56fe\u7247\u8def\u5f84\n :param x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n :param y: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n :param width: \u5bbd\u5ea6\n :param height: \u9ad8\u5ea6\n :return: \u56fe\u7247\u8def\u5f84\n \"\"\"\n \u6b64\u51fd\u6570\u7528\u4e8e\u5728\u64cd\u4f5c\u4e4b\u524d\u622a\u56fe\u4e00\u5f20\u4e34\u65f6\u56fe\u7247\uff0c\u8fd4\u56de\u56fe\u7247\u8def\u5f84\uff0c\u6700\u540e\u5728\u65ad\u8a00\u7684\u65f6\u5019\u518d\u5c06\u56fe\u7247\u8def\u5f84\u4f5c\u4e3a\u53c2\u6570\u4f20\u5165\u65ad\u8a00\u8bed\u53e5\u5373\u53ef\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ui","title":"\u4e09\u3001\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_1","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u662f\u6211\u4eec\u81ea\u7814\u7684\u4e00\u79cd\u4f7f\u7528\u7b80\u5355\uff0c\u4e14\u6548\u7387\u6781\u9ad8\u3001\u7a33\u5b9a\u6027\u597d\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u57fa\u4e8e\u5143\u7d20\u6309\u94ae\u5728\u5e94\u7528\u4e2d\u7684\u76f8\u5bf9\u4f4d\u7f6e\uff0c\u52a8\u6001\u83b7\u53d6\u5143\u7d20\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff0c\u9002\u7528\u4e8e\u5404\u79cd\u5c4f\u5e55\u5206\u8fa8\u7387\uff08\u5305\u62ec\u9ad8\u5206\u5c4f\u3001\u5bbd\u5c4f\u3001\u5e26\u9c7c\u5c4f\uff09\uff0c\u5f53\u5143\u7d20\u6309\u94ae\u4f4d\u7f6e\u76f8\u5bf9\u4e8e\u5e94\u7528\u754c\u9762\u4f4d\u7f6e\u53d1\u751f\u4fee\u6539\u4e4b\u540e\uff0c\u53ea\u9700\u8981\u6839\u636e UI \u8bbe\u8ba1\u56fe\u4e0a\u7684\u6e90\u6570\u636e\u4fee\u6539\u5bf9\u5e94\u5750\u6807\u6570\u636e\u5c31\u597d\uff0c\u7ef4\u62a4\u975e\u5e38\u7684\u65b9\u4fbf\u3002 \u6b64\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u9002\u7528\u4e8e\u4e00\u4e9b\u5143\u7d20\u4f4d\u7f6e\u76f8\u5bf9\u4e0e\u5e94\u7528\u754c\u9762\u6bd4\u8f83\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u97f3\u4e50\uff0899% \u7684\u5143\u7d20\u5b9a\u4f4d\u91c7\u7528\u8fd9\u79cd\uff0c\u6548\u679c\u975e\u5e38\u597d\uff09\uff0c\u4e0d\u9002\u7528\u4e8e\u754c\u9762\u4e0d\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u622a\u56fe\u5f55\u5c4f\uff0c\u5f88\u660e\u663e\u4e0d\u9002\u7528\u4e8e\u8fd9\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u3002\u8fd9\u79cd\u5168\u65b0\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u6709\u5b83\u7684\u9002\u7528\u6761\u4ef6\uff0c\u5982\u679c\u4f60\u53d1\u73b0\u4f7f\u7528\u5e38\u89c4\u7684\uff08\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u5b9a\u4f4d\uff09\u4e0d\u597d\u505a\u65f6\uff0c\u4e0d\u59a8\u8003\u8651\u4f7f\u7528\u8fd9\u79cd\uff0c\u5176\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff0c\u5e76\u4e14\u8fc5\u901f\u7231\u4e0a\u4ed6\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_1","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5728 UI \u8bbe\u8ba1\u56fe\u4e2d\u6211\u4eec\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u8fb9\u6846\u7684\u8ddd\u79bb\u7684\uff0c\u7136\u540e\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u6280\u672f\u624b\u6bb5\u83b7\u53d6\u5230\u5e94\u7528\u754c\u9762\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u53ca\u5e94\u7528\u7a97\u53e3\u7684\u5927\u5c0f\uff0c\u793a\u610f\u56fe\u5982\u4e0b\uff1a \uff08x1, y1\uff09\u4e3a\u5e94\u7528\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\uff1b\uff08x2, y2\uff09\u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u5de6\u4e0a\u89d2\uff08x1, y1\uff09\u7684\u5750\u6807\uff0c\u90a3\u4e48\u5b9e\u9645\u4e0a\u3010\u64ad\u653e\u6240\u6709\u3011\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\u4e3a\uff1a\uff08 x1 + x2, y1 + y2 \uff09\uff1b \u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5927\u5c0f\uff08w2, h2\uff09\uff0c\u53ef\u4ee5\u4ece UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\uff1b \u5728 UI \u8bbe\u8ba1\u7a3f\u4e0a\u70b9\u51fb\u3010\u64ad\u653e\u6240\u6709\u3011\u56fe\u6807\uff0c\u7136\u540e\u79fb\u52a8\u9f20\u6807\u5c31\u5c31\u53ef\u4ee5\u770b\u5230\u4e0a\u56fe\u7684\u53c2\u8003\u7ebf\u53ca\u6570\u636e\uff1b \u6240\u4ee5\uff0c\u6211\u4eec\u53ef\u4ee5\u8f7b\u677e\u7684\u83b7\u53d6\u5230\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u4e2d\u5fc3\u5750\u6807\u4e3a\uff1a\uff08 x1 + x2 + (w2 / 2), y1 + y2 + ( h2 / 2) \uff09 \u8be6\u7ec6\u6e90\u4ee3\u7801\u8bf7\u67e5\u770b AT \u57fa\u7840\u6846\u67b6: src/button_center.py \u83b7\u53d6\u5e94\u7528\u7a97\u53e3\u7684\u4fe1\u606f \u4f7f\u7528 xdotool \u548c xwininfo \u83b7\u53d6\u5230\u5e94\u7528\u7a97\u53e3\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u5de6\u4e0a\u89d2\uff09\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a app_id = CmdCtl.run_cmd(f\"xdotool search --classname --onlyvisible {self.app_name}\"\n).split(\"\\n\")\napp_id_list = [int(_id) for _id in app_id if _id]\nreturn CmdCtl.run_cmd(f\"xwininfo -id {app_id_list[self.number]}\")\n \u4f7f\u7528\u6b63\u5219\u83b7\u53d6\u7a97\u53e3\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u83b7\u53d6\u914d\u7f6e \u8bfb ini \u914d\u7f6e\u6587\u4ef6\uff0c\u83b7\u53d6\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e0e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a conf = ConfigParser()\nconf.read(self.config_path)\ndirection = conf.get(btn_name, \"direction\")\nposition = [int(i.strip()) for i in conf.get(btn_name, \"location\").split(\",\")]\n \u8ba1\u7b97\u5143\u7d20\u6309\u94ae\u5750\u6807 \u6839\u636e\u5e94\u7528\u7a97\u53e3\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u5927\u5c0f\u3001\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u5927\u5c0f\uff0c\u4f7f\u7528\u4e00\u5b9a\u7684\u7b97\u6cd5\u5373\u53ef\u8ba1\u7b97\u51fa\u5143\u7d20\u6309\u94ae\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u4e2d\u5fc3\u5750\u6807\uff09\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3","title":"3\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u3010\u914d\u7f6e\u65b9\u6cd5\u3011 \u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u7684\u6570\u636e\u6e90\u662f\u5e94\u7528\u5e93\u4e2d\u7684 ui.ini \u914d\u7f6e\u6587\u4ef6\uff1a ;section\n[\u65b0\u5efa\u6b4c\u5355+] ;key = value\ndirection = left_top\nlocation = 180, 268, 21, 21\n section \u662f\u4f60\u6839\u636e\u5bf9\u5e94\u7684\u5143\u7d20\u6309\u94ae\u547d\u540d\uff0c\u4f60\u53ef\u4ee5\u4efb\u610f\u547d\u540d\uff0c\u4f46\u6700\u597d\u6709\u5177\u4f53\u542b\u4e49\uff0c\u4e14\u80fd\u660e\u786e\u8868\u793a\u8fd9\u4e2a\u5143\u7d20\u6309\u94ae\u7684\u540d\u79f0\uff1b\u7528\u4e2d\u62ec\u53f7\u62ec\u8d77\u6765\u5c31\u884c\uff0c\u6bd4\u5982\uff1a[\u65b0\u5efa\u6b4c\u5355+] \uff1b direction \u662f\u914d\u7f6e\u8be5\u5143\u7d20\u7684\u53c2\u8003\u7cfb\uff0c\u5206\u522b\u4e3a\uff1a left_top \u5de6\u4e0a\uff1b left_bottom \u5de6\u4e0b\uff1b right_top \u53f3\u4e0a\uff1b right_bottom \u53f3\u4e0b\uff1b \u53c2\u8003\u7cfb\u7684\u9009\u53d6\u6807\u51c6\uff1a\u62c9\u52a8\u6539\u53d8\u7a97\u53e3\u5927\u5c0f\u65f6\uff0c\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u53c2\u8003\u7cfb\u4f4d\u7f6e\u662f\u4e0d\u53d8\u7684\uff1b location \u662f\u8be5\u5143\u7d20\u6309\u94ae\u7684\u76f8\u5bf9\u4e0e\u53c2\u8003\u7cfb\u7684 x, y \u7684\u8ddd\u79bb\uff0c\u53ca\u5927\u5c0f(w, h)\uff0c\u8fd9\u56db\u4e2a\u6570\u636e\u53ef\u4ee5\u901a\u8fc7 UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\u6570\u636e\uff0c\u5728\u7f16\u8f91\u6a21\u5f0f\u4e0b\uff0c\u70b9\u51fb UI \u56fe\u4e0a\u7684\u6309\u94ae\uff0c\u53f3\u4fa7\u5c31\u4f1a\u51fa\u73b0\u8be5\u5143\u7d20\u6309\u94ae\u7684 x, y, w, h \u6570\u636e\u3002 \u5982\u679c UI \u56fe\u4e0a\u6ca1\u6709\u63d0\u4f9b\u4f60\u60f3\u8981\u7684\u5143\u7d20\u6570\u636e\uff0c\u4f60\u53ef\u4ee5\u76f4\u63a5\u5728\u7cfb\u7edf\u4e2d\u4f7f\u7528\u622a\u56fe\u5f55\u5c4f\u8fdb\u884c\u5c3a\u91cf\uff0c\u8fd9\u662f\u4e00\u79cd\u4e0d\u63a8\u8350\u4f46\u80fd\u7528\u7684\u65b9\u6cd5\u3002 \u3010\u8c03\u7528\u65b9\u6cd5\u3011 \u5728\u5e94\u7528\u5e93\u65b9\u6cd5\u5c42\u8fd9\u6837\u5199\uff1a def click_add_music_list_btn_in_music_by_ui(self):\n\"\"\"\u70b9\u51fb\u65b0\u5efa\u6b4c\u5355\u6309\u94ae\"\"\"\nself.click(*self.ui.btn_center(\"\u65b0\u5efa\u6b4c\u5355+\"))\n self.ui.btn_center() \u662f\u56fa\u5b9a\u5199\u6cd5\uff0c\u53c2\u6570\u5c31\u662f\u914d\u7f6e\u91cc\u9762\u7684 section \u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ocr","title":"\u56db\u3001OCR \u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_2","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 OCR \u65b9\u6848\u5927\u591a\u91c7\u7528\u8c37\u6b4c OCR\uff08Tesseract\uff09\u65b9\u6848\uff0c\u4f46\u662f\u5b83\u5bf9\u4e8e\u4e2d\u6587\u7684\u8bc6\u522b\u975e\u5e38\u5dee\uff0c\u7ecf\u8fc7\u5927\u91cf\u7684\u8c03\u7814\uff0c\u6211\u4eec\u4f7f\u7528 PaddleOCR\uff0c\u5b83\u662f\u4e00\u4e2a\u5f00\u6e90\u7684\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u8bc6\u522b\u5de5\u5177\uff0c\u4e5f\u662f PaddlePaddle \u6700\u6709\u540d\u7684\u4e00\u4e2a\u5f00\u6e90\u9879\u76ee\uff0c\u611f\u5174\u8da3\u7684\u53ef\u4ee5\u70b9\u8fd9\u91cc\u4e86\u89e3\uff0c\u591a\u7684\u4e0d\u8bf4\u4e86\uff0c\u4f60\u53ea\u9700\u8981\u77e5\u9053\u5b83\u5c31\u662f\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_2","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5b89\u88c5\u4ed6\u662f\u4e2a\u5f88\u9ebb\u70e6\u7684\u4e8b\u60c5\uff0c\u867d\u7136\u64cd\u4f5c\u5f88\u7b80\u5355\uff0c\u4f46\u5176\u5b9e\u5b89\u88c5\u5305\u6709\u70b9\u5927\uff0c\u56e0\u6b64\u6211\u4eec\u4e0d\u5e0c\u671b\u76f4\u63a5\u5728 env.sh \u4e2d\u52a0\u5165\u5b83\uff0c\u8fd9\u4f1a\u8ba9\u6574\u4e2a\u81ea\u52a8\u5316\u73af\u5883\u53d8\u5f97\u975e\u5e38\u81c3\u80bf\uff1b \u56e0\u6b64\uff0c\u6211\u4eec\u60f3\u5230\u5c06\u5b83\u505a\u6210\u4e00\u4e2a RPC \u670d\u52a1\u5728\u5176\u4ed6\u673a\u5668\u4e0a\u90e8\u7f72\uff0c\u6d4b\u8bd5\u673a\u901a\u8fc7\u8fdc\u7a0b\u8c03\u7528 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u4f7f\u7528\u5b83\uff1b RPC \u7684\u8c03\u7528\u903b\u8f91\uff1a \u8fd9\u6837\u6211\u4eec\u53ea\u9700\u8981\u5728\u670d\u52a1\u7aef\u90e8\u7f72\u597d OCR \u8bc6\u522b\u7684\u670d\u52a1\uff0c\u7136\u540e\u901a\u8fc7 RPC \u670d\u52a1\u5c06\u529f\u80fd\u63d0\u4f9b\u51fa\u6765\uff0c\u6846\u67b6\u91cc\u9762\u53ea\u9700\u8981\u8c03\u7528\u5bf9\u5e94\u7684 RPC \u63a5\u53e3\u5c31\u884c\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_1","title":"3\u3001\u4f7f\u7528\u8bf4\u660e","text":"\u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nfrom paddleocr import PaddleOCR\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef paddle_ocr(pic_path, lang):\n\"\"\"\n Paddleocr\u76ee\u524d\u652f\u6301\u7684\u591a\u8bed\u8a00\u8bed\u79cd\u53ef\u4ee5\u901a\u8fc7\u4fee\u6539lang\u53c2\u6570\u8fdb\u884c\u5207\u6362\n \u4f8b\u5982`ch`, `en`, `fr`, `german`, `korean`, `japan`\n :param file_name:\n :param lang:\n :return:\n \"\"\"\nif __name__ == \"__main__\":\nIP = popen(\"hostname -I\").read().split(\" \")[0]\nPORT = 8890\nSCREEN_CACHE = \"/tmp/screen.png\"\nserver = ThreadXMLRPCServer((IP, PORT), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(paddle_ocr, \"paddle_ocr\")\nprint(\"\u76d1\u542c\u5ba2\u6237\u7aef\u8bf7\u6c42\u3002\u3002\")\nserver.serve_forever()\n \u6846\u67b6\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from src import OCR\nOCR.ocr(*target_strings, picture_abspath=None, similarity=0.6, return_default=False, return_first=False, lang=\"ch\"):\n# \u901a\u8fc7 OCR \u8fdb\u884c\u8bc6\u522b\u3002\n# target_strings:\n# \u76ee\u6807\u5b57\u7b26,\u8bc6\u522b\u4e00\u4e2a\u5b57\u7b26\u4e32\u6216\u591a\u4e2a\u5b57\u7b26\u4e32,\u5e76\u8fd4\u56de\u5176\u5728\u56fe\u7247\u4e2d\u7684\u5750\u6807;\n# \u5982\u679c\u4e0d\u4f20\u53c2\uff0c\u8fd4\u56de\u56fe\u7247\u4e2d\u8bc6\u522b\u5230\u7684\u6240\u6709\u5b57\u7b26\u4e32\u3002\n# picture_abspath: \u8981\u8bc6\u522b\u7684\u56fe\u7247\u8def\u5f84\uff0c\u5982\u679c\u4e0d\u4f20\u9ed8\u8ba4\u622a\u53d6\u5168\u5c4f\u8bc6\u522b\u3002\n# similarity: \u5339\u914d\u5ea6\u3002\n# return_default: \u8fd4\u56de\u8bc6\u522b\u7684\u539f\u751f\u6570\u636e\u3002\n# return_first: \u53ea\u8fd4\u56de\u7b2c\u4e00\u4e2a,\u9ed8\u8ba4\u4e3a False,\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u6240\u6709\u6570\u636e\u3002\n# lang: `ch`, `en`, `fr`, `german`, `korean`, `japan`\n \u6b64\u65b9\u6848\u5728\u6846\u67b6\u5185\u6ca1\u6709\u5f15\u5165\u4efb\u4f55\u4e09\u65b9\u4f9d\u8d56\u5b8c\u5168\u91c7\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\uff0c\u800c\u4e14\u4f7f\u7528\u65b9\u6cd5\u975e\u5e38\u7b80\u5355\uff0c\u53ea\u9700\u8981\u901a\u8fc7 OCR.ocr() \u5373\u53ef\uff1b \u5bf9\u4e8e\u4e00\u4e9b\u6587\u6848\u7684\u573a\u666f\u975e\u5e38\u9002\u7528\uff0c\u6b64\u65b9\u6cd5\u76f4\u63a5\u8fd4\u56de\u5750\u6807\uff0c\u53ef\u4ee5\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u3002 \u4e5f\u53ef\u4ee5\u7528\u4e8e\u6587\u5b57\u65ad\u8a00\uff0c\u4ee3\u7801\u793a\u610f\uff1a def assert_ocr_exist(\n*args, picture_abspath=None, similarity=0.6, return_first=False, lang=\"ch\"\n):\n\"\"\"\u65ad\u8a00\u6587\u6848\u5b58\u5728\"\"\"\npic = None\nif picture_abspath is not None:\npic = picture_abspath + \".png\"\nres = OCR.ocr(\n*args,\npicture_abspath=pic,\nsimilarity=similarity,\nreturn_first=return_first,\nlang=lang,\n)\nif res is False:\nraise AssertionError(\n(f\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{args}\", f\"{pic if pic else GlobalConfig.SCREEN_CACHE}\")\n)\nif isinstance(res, tuple):\npass\nelif isinstance(res, dict) and False in res.values():\nres = filter(lambda x: x[1] is False, res.items())\nraise AssertionError(\n(\nf\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{dict(res)}\",\nf\"{pic if pic else GlobalConfig.SCREEN_CACHE}\",\n)\n)\n \u5728\u7528\u4f8b\u4e2d\u4f7f\u7528\u65ad\u8a00\uff0c\u793a\u4f8b\uff1a def test_font_manager_021(self):\n\"\"\"\u53f3\u4fa7\u2665-\u6536\u85cf/\u53d6\u6d88\u6536\u85cf\u5b57\u4f53\"\"\"\n# \u5b57\u4f53\u7ba1\u7406\u5668\u754c\u9762\u53f3\u4fa7\u8be6\u60c5\u5217\u8868\uff0c\u9009\u62e9\u672a\u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e / \u6536\u85cf\u5b57\u4f53\n# \u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e\u83dc\u5355\u663e\u793a\u201c\u53d6\u6d88\u6536\u85cf\u201d\uff1b\n...\nself.assert_ocr_exist(\"\u53d6\u6d88\u6536\u85cf\")\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_1","title":"4\u3001\u670d\u52a1\u7aef\u90e8\u7f72","text":"\u6211\u4eec\u76ee\u524d\u662f\u5c06 OCR \u670d\u52a1\u90e8\u7f72\u5728\u666e\u901a\u7684\u529e\u516c\u673a\u4e0a\u7684\uff0c\u5982\u679c\u4f60\u89c9\u5f97\u73b0\u6709\u7684 OCR \u8bc6\u522b\u6027\u80fd\u4e0d\u591f\u597d\uff0c\u6070\u597d\u4f60\u6709\u66f4\u597d\u7684\u673a\u5668\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u5176\u79c1\u6709\u5316\u90e8\u7f72\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41_1","title":"4.1\u3001\u73af\u5883\u5b89\u88c5","text":"\u63a8\u8350\u4f7f\u7528 pipenv \u8fdb\u884c\u73af\u5883\u642d\u5efa\uff1b \u5b89\u88c5 pipenv \uff1a sudo pip3 install pipenv\n \u65b0\u5efa\u4e00\u4e2a\u76ee\u5f55\u4f5c\u4e3a\u73af\u5883\u5305 ocr_env\uff1a cd ~\nmkdir ocr_env\n \u521b\u5efa python 3.7 \u73af\u5883\uff1a cd ocr_env\npipenv --python 3.7\n \u5b89\u88c5 OCR \u4f9d\u8d56\u5305\uff1a pipenv install paddlepaddle -i https://mirror.baidu.com/pypi/simple\npipenv install \"paddleocr>=2.0.1\" -i https://mirror.baidu.com/pypi/simple\n \u4e0d\u51fa\u610f\u5916\uff0c\u8fd9\u6837\u5c31\u628a\u4f9d\u8d56\u5b89\u88c5\u597d\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42_1","title":"4.2\u3001\u542f\u52a8\u670d\u52a1","text":"\u5c06\u57fa\u7840\u6846\u67b6\u4e2d\u7684 scr/ocr/pdocr_rpc_server.py \u6587\u4ef6\u62f7\u8d1d\u5230 ocr_env \u76ee\u5f55\uff0c\u540e\u53f0\u6267\u884c\u5b83\u5c31\u597d\u4e86\uff1a cd ocr_env\nnohup pipenv run python pdocr_rpc_server.py &\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#43","title":"4.3\u3001\u914d\u7f6e\u5f00\u673a\u81ea\u542f\uff08\u901a\u7528\uff09","text":"\u4f60\u80af\u5b9a\u4e0d\u60f3\u6bcf\u6b21\u673a\u5668\u91cd\u542f\u4e4b\u540e\u90fd\u9700\u8981\u624b\u52a8\u542f\u52a8\u670d\u52a1\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u914d\u7f6e\u5f00\u673a\u81ea\u542f\u3002 \u5199\u5f00\u673a\u81ea\u542f\u670d\u52a1\u6587\u4ef6\uff1a sudo vim /lib/systemd/system/ocr.service\n autoocr \u540d\u79f0\u4f60\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff0c\u5199\u5165\u4ee5\u4e0b\u5185\u5bb9\uff1a [Unit]\nDescription=OCR Service\nAfter=multi-user.target\n\n[Service]\nUser=uos\nGroup=uos\nType=idle\nWorkingDirectory=/home/uos/ocr_env\nExecStart=pipenv run python pdocr_rpc_server.py\n\n[Install]\nWantedBy=multi-user.target\n \u6ce8\u610f\u66ff\u6362\u4f60\u7684${USER} \u4fee\u6539\u914d\u7f6e\u6587\u4ef6\u7684\u6743\u9650\uff1a sudo chmod 644 /lib/systemd/system/ocr.service\n \u81ea\u542f\u670d\u52a1\u751f\u6548\uff1a sudo systemctl daemon-reload\nsudo systemctl enable ocr.service\n \u67e5\u770b\u670d\u52a1\u72b6\u6001\uff1a sudo systemctl status ocr.service\n \u4f60\u53ef\u4ee5\u518d\u91cd\u542f\u4e0b\u7535\u8111\uff0c\u770b\u770b\u670d\u52a1\u662f\u4e0d\u662f\u6b63\u5e38\u542f\u52a8\u4e86\uff0c\u6ca1\u62a5\u9519\u5c31 OK \u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_4","title":"\u4e94\u3001\u5c5e\u6027\u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_3","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 UI \u81ea\u52a8\u5316\u5927\u591a\u90fd\u662f\u57fa\u4e8e\u6d4f\u89c8\u5668\u7684\uff0c\u6838\u5fc3\u662f\u5728\u7f51\u9875\u7684 DOM \u6811\u4e0a\u67e5\u627e\u5143\u7d20\uff0c\u5e76\u5bf9\u5176\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\uff1b Linux \u684c\u9762\u5e94\u7528\u5927\u591a\u662f\u91c7\u7528 Qt \u7f16\u5199\u7684\uff0c\u5728 Qt \u4e2d\u4e5f\u662f\u4ece\u6700\u9876\u5c42\u7684 MainWindow \u5f00\u59cb\u6784\u5efa\u5e94\u7528\uff0c\u6240\u4ee5\u903b\u8f91\u4e5f\u662f\u4e00\u6837\u7684\uff0cQt \u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u540c\u6837\u53ef\u4ee5\u901a\u8fc7 DOM \u6811\uff08\u5c5e\u6027\u6811\uff09\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff0c\u6211\u4eec\u79f0\u4e4b\u4e3a\u5c5e\u6027\u5b9a\u4f4d\u3002 \u501f\u52a9\u5f00\u6e90\u5de5\u5177 dogtail \u6211\u4eec\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u83b7\u53d6\uff0c\u4ece\u800c\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\u3002dogtail \u7684\u9879\u76ee\u4ecb\u7ecd\u53ef\u4ee5\u731b\u6233\u8fd9\u91cc\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_3","title":"2\u3001\u4f7f\u7528\u65b9\u6cd5","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#21sniff","title":"2.1\u3001sniff\uff08\u55c5\u63a2\u5668\uff09\u4f7f\u7528","text":"\u5728\u7ec8\u7aef\u8f93\u5165 sniff \u542f\u52a8 AT-SPI Browser mikigo@mikigo-PC:~$ sniff\n \u67e5\u770b\u5e94\u7528\u7684\u6807\u7b7e \u5728 sniff \u91cc\u9762\u53ef\u4ee5\u770b\u5230\u7cfb\u7edf\u4e2d\u5df2\u542f\u52a8\u7684\u5e94\u7528\uff0c\u70b9\u51fb\u5e94\u7528\u540d\u79f0\u524d\u9762\u7684\u4e09\u89d2\u5f62\u56fe\u6807\uff0c\u53ef\u4ee5\u5c55\u5f00\u5e94\u7528\u7684\u6807\u7b7e\uff0c\u6240\u6709\u6807\u7b7e\u4ee5 tree \u7684\u5f62\u5f0f\u5c55\u793a\uff0c\u5bf9\u5e94\u5e94\u7528\u91cc\u9762\u7684\u7236\u7a97\u53e3\u548c\u5b50\u7a97\u53e3\u3002 \u83b7\u53d6\u5143\u7d20\u63a7\u4ef6\u7684\u6807\u7b7e\u540d\u79f0 \u9996\u5148\uff0c\u4e3a\u4e86\u65b9\u4fbf\u67e5\u770b\u5143\u7d20\u63a7\u4ef6\u5bf9\u5e94\u7684\u4f4d\u7f6e\uff0c\u5efa\u8bae\u73b0\u5728\u4e0a\u65b9\u5de5\u5177\u680f\u70b9\u51fb Actions\uff0c\u7136\u540e\u52fe\u9009 Hightlight Items\uff0c\u8fd9\u6837\u5728 sniff \u4e2d\u9f20\u6807\u9009\u4e2d\u5143\u7d20\u6807\u7b7e\u7684\u65f6\u5019\uff0c\u5e94\u7528\u4e2d\u4f1a\u6709\u76f8\u5e94\u7684\u5149\u6807\u9501\u5b9a\u3002 \u5728 sniff \u91cc\u9762\u70b9\u51fb\u8fdb\u5165\u5e94\u7528\u7684\u6807\u7b7e tree \u4e2d\u540e\uff0c\u70b9\u51fb\u76f8\u5e94\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5728\u5de5\u5177\u4e0b\u65b9\uff0c\u4f1a\u5c55\u793a\u5143\u7d20\u63a7\u4ef6\u7684 Name\uff0c\u8fd9\u4e2a\u5c31\u662f\u6807\u7b7e\u540d\u79f0\u3002 \u5728 tree \u4e2d\u6709\u4e9b\u5730\u65b9\u662f\u7a7a\u767d\u7684\u6216\u8005\u662f Form\uff0c\u662f\u56e0\u4e3a\u5f00\u53d1\u4eba\u5458\u5728\u6dfb\u52a0\u6807\u7b7e\u7684\u65f6\u5019\u6ca1\u6709\u6dfb\u52a0\uff0c\u6216\u8005\u6709\u4e9b\u7236\u7a97\u53e3\u4e0d\u9700\u8981\u6dfb\u52a0\uff0c\u8fd9\u79cd\u5728\u5b9e\u9645\u4e1a\u52a1\u4e2d\u662f\u4e0d\u5f71\u54cd\u7684\uff0c\u6211\u4eec\u53ea\u8981\u4fdd\u8bc1\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\u4e2d\uff0c\u8981\u7528\u5230\u7684\u5143\u7d20\u90fd\u6dfb\u52a0\u4e86\u6807\u7b7e\u5373\u53ef\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#22","title":"2.2\u3001\u5143\u7d20\u64cd\u4f5c","text":"\u83b7\u53d6\u5e94\u7528\u5bf9\u8c61 dogtail \u83b7\u53d6\u5e94\u7528\u5bf9\u8c61\u7684\u65f6\u5019\uff0c\u4f7f\u7528\u7684\u662f tree \u5e93\u91cc\u9762\u7684 application() \u65b9\u6cd5\uff1a from dogtail.tree import root\napp_obj = root.application('deepin-music')\n app_obj\u5c31\u662f\u5e94\u7528\u7684\u5bf9\u8c61\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\uff0c\u662f\u5e94\u7528\u5bf9\u8c61\u4f7f\u7528child()\u65b9\u6cd5\uff1a element = app_obj.child('element_name')\n \u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u4f20\u5165\u5143\u7d20\u7684 Name\uff0c\u83b7\u53d6\u5230\u76f8\u5e94\u5143\u7d20\u7684\u5bf9\u8c61\u3002Name \u53ef\u4ee5\u901a\u8fc7 sniff \u67e5\u770b\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\u5217\u8868: element_list = element.children\n \u83b7\u53d6\u5230\u8fd9\u4e2a\u5143\u7d20\u4e0b\u9762\u6240\u6709\u7684\u5143\u7d20\u5217\u8868\u3002 \u8fd9\u4e2a\u65b9\u6cd5\u9002\u7528\u4e8e\u6709\u4e9b\u6807\u7b7e\u6ca1\u6709\u6dfb\u52a0\uff0c\u4f46\u662f\u4f4d\u7f6e\u662f\u56fa\u5b9a\u7684\uff0c\u6211\u4eec\u901a\u8fc7\u7d22\u5f15\u53ef\u4ee5\u53d6\u5f97\u5143\u7d20\u3002 element_list[0]\n \u5bf9\u5143\u7d20\u7684\u64cd\u4f5c \u5728\u83b7\u53d6\u5230\u5143\u7d20\u4e4b\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u76f8\u5e94\u7684\u64cd\u4f5c\u3002 \u5355\u51fb element.click(button=1)\n button 1 \u2014>\u5de6\u952e\uff0c2 \u2014>\u6eda\u8f6e\uff0c3 \u2014>\u53f3\u952e\uff0c\u9ed8\u8ba4\u4e3a 1 \u53cc\u51fb element.doubleClick(button=1)\n \u9f20\u6807\u60ac\u505c element.point()\n \u9f20\u6807\u79fb\u52a8\u5230\u5143\u7d20\u4e2d\u5fc3\u4f4d\u7f6e \u6587\u672c\u8f93\u5165 element.typeText(string)\n \u5411\u5143\u7d20\u5bf9\u8c61\u8f93\u5165\u5b57\u7b26\u4e32 \uff0c\u6bd4\u5982\u8f93\u5165\u6846 \u7ec4\u5408\u952e element.keyCombo(comboString)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#23","title":"2.3\u3001\u6846\u67b6\u5c01\u88c5","text":"\u4ee3\u7801\u793a\u4f8b\uff1a # \u8be6\u7ec6\u4ee3\u7801\u8bf7\u67e5\u770b src/dogtail_utils.py\nclass DogtailUtils:\ndef __init__(self, name=None, description=None):\nself.name = name\nself.description = description\nself.obj = root.application(self.name, self.description)\ndef app_element(self, *args, **kwargs):\n\"\"\"\n \u83b7\u53d6app\u5143\u7d20\u7684\u5bf9\u8c61\n :return: \u5143\u7d20\u7684\u5bf9\u8c61\n \"\"\"\nreturn self.obj.child(*args, **kwargs, retry=False)\ndef element_center(self, element) -> tuple:\n\"\"\"\n \u83b7\u53d6\u5143\u7d20\u7684\u4e2d\u5fc3\u4f4d\u7f6e\n :param element:\n :return: \u5143\u7d20\u4e2d\u5fc3\u5750\u6807\n \"\"\"\n_x, _y, _w, _h = self.app_element(element).extents\n_x = _x + _w / 2\n_y = _y + _h / 2\nreturn _x, _y\n \u6846\u67b6\u63d0\u4f9b\u7684\u63a5\u53e3\u975e\u5e38\u7b80\u6d01\uff0c\u5728\u8c03\u7528\u65f6\uff1a self.dog.element_center(\"\u64ad\u653e\")\n \u8fd9\u6837\u5c31\u80fd\u83b7\u53d6\u5230\u6b64\u5143\u7d20\u7684\u4e2d\u5fc3\u5750\u6807\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_5","title":"\u516d\u3001\u6807\u7b7e\u5316\u7ba1\u7406","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_4","title":"1\u3001\u6807\u7b7e\u8bf4\u660e","text":"\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u811a\u672c ID\uff1a\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c/\u51fd\u6570 ID\uff1b PMS\u7528\u4f8bID\uff1aPMS \u4e0a\u5bf9\u5e94\u7684\u7528\u4f8b ID\uff08\u7528\u4f8b\u5e93 ID\uff09\uff1b \u9ed8\u8ba4\u4f7f\u7528\u7528\u4f8b\u5e93 ID\uff0c\u5bf9\u4e8e\u6682\u65f6\u6ca1\u6709\u4f7f\u7528\u7528\u4f8b\u5e93\u7ba1\u7406\u7528\u4f8b\u7684\u9879\u76ee\uff0c\u53ef\u4ee5\u4f7f\u7528\u4ea7\u54c1\u5e93\u7528\u4f8b ID\uff1b \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1aFUNC\uff08\u529f\u80fd\uff09\u3001PERF\uff08\u6027\u80fd\uff09\u3001STR\uff08\u538b\u529b\uff09\u3001SEC\uff08\u5b89\u5168\uff09\u3001CTS\uff08\u517c\u5bb9\u6027\uff09\u3001API\uff08\u63a5\u53e3\uff09\u3001BASELINE\uff08\u57fa\u7ebf-\u9884\u7559\uff09 \u8bbe\u5907\u7c7b\u578b\uff1aPPL\uff08\u4f9d\u8d56\u5916\u8bbe\u7684\u7528\u4f8b\uff09\u3001COL\uff08\u4f9d\u8d56\u4e3b\u63a7\u673a\u7684\u7528\u4f8b\uff09 \u7528\u4f8b\u6765\u6e90\uff1aBUG\uff08\u7531 Bug \u8f6c\u7684\u7528\u4f8b\uff09 \u4e0a\u7ebf\u5bf9\u8c61\uff1aCICD\uff0c\u8868\u793a\u4e0a\u7ebf\u5230 CICD \u6d41\u6c34\u7ebf\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u53ef\u4e00\u952e\u751f\u6210 case_list.csv \u6587\u4ef6\uff0c\u7528\u4e8e\u5bfc\u5165\u5230\u660e\u9053\u4e91 AT \u7528\u4f8b\u5217\u8868\u4e2d\u63a7\u5236 CICD \u8dd1\u6d4b\u8303\u56f4\uff1b \u6d4b\u8bd5\u7ea7\u522b\uff1aC1 / C2 / C3 / C4\uff0c\u5177\u4f53\u5b9a\u4e49\u53c2\u8003\u6d41\u6c34\u7ebf\u4f7f\u7528\u6307\u5bfc\uff1b \u8df3\u8fc7\u539f\u56e0\uff1askip-XXX\uff0c\u7528\u4e8e\u63a7\u5236\u7528\u4f8b\u662f\u5426\u6267\u884c\uff1b \u786e\u8ba4\u4fee\u590d\uff1afixed-XXX\uff0c\u7528\u4e8e\u6807\u8bb0\u7528\u4f8b\u7684\u4fee\u590d\u72b6\u6001\uff08\u540e\u9762\u8be6\u7ec6\u8bb2\u89e3\u7528\u6cd5\uff09\uff1b \u5e9f\u5f03\u7528\u4f8b\uff1aremoved-\u5df2\u5e9f\u5f03\uff0c\u7528\u4e8e\u6807\u8bb0\u5df2\u7ecf\u5e9f\u5f03\u7684\u7528\u4f8b\uff0c\u6b64\u7528\u4f8b\u6807\u7b7e\u4e0d\u4f1a\u88ab\u6dfb\u52a0\uff0c\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff1b \u793a\u4f8b\uff1a \u811a\u672cID PMS\u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u8bbe\u5907\u7c7b\u578b \u7528\u4f8b\u6765\u6e90 \u4e0a\u7ebf\u5bf9\u8c61 \u6d4b\u8bd5\u7ea7\u522b \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b ... 679537 679537 L1 FUNC PPL CICD C1 skip-XXX fixed-XXX removed-\u5df2\u5e9f\u5f03 ..."},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_4","title":"2\u3001\u64cd\u4f5c\u6b65\u9aa4","text":"2.1\u3001\u5728\u5b50\u9879\u76ee\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u4ee5\u7528\u4f8b\u7684 py \u6587\u4ef6\u9664\u53bb\u9996\u5b57\u7b26\u4e32 \"test_\" \u548c\u7528\u4f8b\u5e8f\u53f7\u540e\u7684\u5b57\u7b26\u4e32\u4f5c\u4e3a csv \u7684\u6587\u4ef6\u540d\u3002 \u4f8b\u5982: \u76f8\u518c\u7684\u7528\u4f8b\u6587\u4ef6\u4e3a test_album_xxx.py\uff0cxxx \u8868\u793a\u7528\u4f8b\u7684ID\uff08\u4e5f\u53ef\u4ee5\u662f\u81ea\u5b9a\u4e49\u7684\u6570\u5b57\u4ee3\u8868\u7528\u4f8b\u5e8f\u53f7\uff09\uff0c\u6b64\u65f6 csv \u6587\u4ef6\u540d\u5c31\u5e94\u4e3a album.csv\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u6240\u6709 csv \u6587\u4ef6\u5efa\u8bae\u653e\u5728\u4e00\u4e2a tags \u76ee\u5f55\u4e0b\u3002 \u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 2.2\u3001\u7b2c\u4e00\u5217\u4e3a\u811a\u672c ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b\u7528\u4f8b\u6807\u7b7e\u53ef\u4ee5\u65e0\u5e8f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_2","title":"3\u3001\u589e\u52a0\u8bf4\u660e","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_1","title":"3.1\u3001\u8df3\u8fc7\u7528\u4f8b","text":"\u4f20\u7edf\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668(@pytest.mark.skip)\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a; \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#311","title":"3.1.1\u3001\u56fa\u5b9a\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 679537 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u7b7e\u5f00\u5934\u4e3a \u201cskip-XXX\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\uff0c\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\u5219\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u7b7e\u4e3a SKIPED\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#312","title":"3.1.2\u3001\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skipif_platform-aarch64&mips64 \u67d0\u4e9b\u7528\u4f8b\u4f1a\u56e0\u4e3a\u4e0d\u540c\u7684\u73af\u5883\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\uff0c\u5e38\u89c1\u7684\u573a\u666f\u4e3a\u5728\u4e0d\u540c\u67b6\u6784\u4e0a\u5224\u65ad\u662f\u5426\u6267\u884c\uff0c\u8df3\u8fc7\u7684\u539f\u56e0\u6807\u7b7e\u4e3a \u201cskipif_platform-\u201d \u52a0\u67b6\u6784\u540d\uff0c\u591a\u4e2a\u67b6\u6784\u4e4b\u95f4\u4f7f\u7528 \u201c&\u201d \u62fc\u63a5\uff1b \u4ee5\u4e0a\u4f8b\u5b50\u4e3a\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u5224\u65ad\u5f53\u524d\u67b6\u6784\u662f\u5426\u4e3a arrch64 \u6216\u8005 mips64\uff0c\u82e5\u662f\uff0c\u5219\u8df3\u8fc7\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u82e5\u5426\u5219\u6267\u884c\u7528\u4f8b\uff1b \u76ee\u524d\u6846\u67b6\u9ed8\u8ba4\u4ec5\u652f\u6301\u67b6\u6784\u7684\u6761\u4ef6\u5224\u65ad\uff0c\u4f46\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u903b\u8f91\u652f\u6301\u81ea\u5b9a\u4e49\u6dfb\u52a0\u3002 \u5728\u9879\u76ee\u76ee\u5f55\u8def\u5f84\u4e0b\u5b58\u5728\u6587\u4ef6 setting/skipif.py\uff0c\u6240\u6709\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u7684\u51fd\u6570\u5199\u5728\u6b64\u6587\u4ef6\u4e2d\u3002 \u9ed8\u8ba4\u67b6\u6784\u5224\u65ad\u4f8b\u5b50\uff1a def skipif_platform(args: str):\n\"\"\"\u5e73\u53f0\u8df3\u8fc7\"\"\"\n_skip_key = args.split(\"&\")\nfor key in _skip_key:\nif GlobalConfig.SYS_ARCH == key:\nreturn True\nreturn False\n \u65b9\u6cd5\u7f16\u5199\u89c4\u8303\uff1a \u65b9\u6cd5\u540d\u5fc5\u987b\u4ee5 skipif \u5f00\u5934\uff1b \u65b9\u6cd5\u5fc5\u987b\u6709\u8fd4\u56de\u7ed3\u679c\u5e76\u4e14\u4e3a\u5e03\u5c14\u503c\uff08True \u4ee3\u8868\u8df3\u8fc7\uff0cFalse \u4ee3\u8868\u4e0d\u8df3\u8fc7\uff09\uff1b \u65b9\u6cd5\u53ea\u80fd\u6709\u4e00\u4e2a\u5165\u53c2\uff1b \u5728 csv \u6587\u4ef6\u8df3\u8fc7\u539f\u56e0\u4e00\u680f\u4e2d\u586b\u5199\u4e3a \u201c{\u51fd\u6570\u540d}-{\u53c2\u6570}\u201d\uff0c\u4f8b\u5982\uff1askipif_platform-aarch64\uff1b\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u4f1a\u4ee5\u7b2c\u4e00\u4e2a \u201c-\u201d \u8fdb\u884c\u5206\u5272\uff0c\u622a\u53d6\u7684\u5de6\u4fa7\u5b57\u7b26\u4e32\u4f5c\u4e3a\u51fd\u6570\u540d\uff0c\u5728 skipif.py \u6587\u4ef6\u4e2d\u67e5\u627e\u662f\u5426\u6709\u540c\u540d\u51fd\u6570\uff0c\u5e76\u5c06\u622a\u53d6\u7684\u53f3\u4fa7\u4f5c\u4e3a\u53c2\u6570\u4f20\u9012\u7ed9\u8be5\u51fd\u6570\uff0c\u901a\u8fc7\u83b7\u53d6\u8be5\u51fd\u6570\u8fd4\u56de\u7684\u5e03\u5c14\u503c\uff0c\u8fd4\u56de True\uff0c\u5219\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u8fd4\u56de False\uff0c\u5219\u6267\u884c\u8be5\u7528\u4f8b\u3002 \u82e5\u51fd\u6570\u9700\u8981\u591a\u4e2a\u53c2\u6570\uff0c\u53ef\u81ea\u5b9a\u4e49\u591a\u4e2a\u53c2\u6570\u4e4b\u95f4\u7684\u8fde\u63a5\u7b26\uff0c\u8fde\u63a5\u7b26\u53f7\u4e0d\u53ef\u4f7f\u7528\u4e0b\u5212\u7ebf\u548c\u9017\u53f7\uff0c\u63a8\u8350\u7edf\u4e00\u4f7f\u7528 & \u7b26\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32","title":"3.2\u3001\u786e\u8ba4\u4fee\u590d","text":"\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7528\u4f8b\u4fee\u590d\u540e\uff0c\u4f46\u4e0d\u80fd\u7acb\u5373\u5220\u9664\u8df3\u8fc7\u539f\u56e0\uff08skip-XXX\uff09\u7684\u7528\u4f8b\uff0c\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u786e\u8ba4\u4fee\u590d\u201d\uff0c\u4f5c\u4e3a\u6807\u8bb0\u8be5\u7528\u4f8b\u662f\u5426\u5df2\u7ecf\u4fee\u590d\uff0c\u56fa\u5b9a\u586b\u5165\u5b57\u6bb5\u4e3a \u201cfixed-\u5df2\u4fee\u590d\u201d\u3002\u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u5373\u4f7f\u540c\u65f6\u6807\u8bb0\u4e86 skip-XXX \u4e5f\u4f1a\u6b63\u5e38\u6267\u884c\u3002 \u793a\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d 679537 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d \u3010\u540c\u65f6\u6807\u8bb0\u4e86skip \u548c fixed\uff0c\u4f46\u4ecd\u7136\u60f3\u8981\u8df3\u8fc7\u7528\u4f8b\u3011 \u5f53 \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u540c\u65f6\u586b\u5165\u540e\uff0c\u547d\u4ee4\u884c\u4f20\u9012\u53c2\u6570 --ifixed yes\uff0c\u5219\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\u8be5\u6761\u7528\u4f8b\u3002 python3 manage.py run --ifixed yes\n \u770b\u5230\u8fd9\u91cc\u6709\u4e9b\u540c\u5b66\u53ef\u80fd\u8981\u95ee\u4e86\uff0c\u6211\u60f3\u6062\u590d\u8df3\u8fc7\u6267\u884c\uff0c\u76f4\u63a5\u628a skip-XXX \u8fd9\u4e00\u5217\u6807\u7b7e\u5220\u6389\u4e0d\u5c31\u597d\u4e86\uff0c\u8fd8\u641e\u4ec0\u4e48\u786e\u8ba4\u4fee\u590d\u5e72\u5565\uff1f \u8fd9\u91cc\u7ed9\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u89e3\u91ca\u4e00\u4e0b\uff1a \uff08\u4ee5\u4e0b\u6d41\u6c34\u7ebf\u6307\u7684\u662f\u6bcf\u65e5\u6784\u5efa\u7684\u6d41\u6c34\u7ebf\uff0c\u8dd1 AT \u7684\u5168\u91cf\u7528\u4f8b\uff09 \u9996\u5148\uff0c\u6d41\u6c34\u7ebf\u4e0a\u8dd1\u7684\u662f AT \u5386\u53f2 Tag\uff0c\u8df3\u8fc7\u7528\u4f8b\u7684\u6807\u7b7e(skip-XXX) \u662f\u5728\u6700\u65b0\u7684\u4ee3\u7801\u4e0a\u63d0\u4ea4\u7684\uff0c\u6211\u4eec\u91c7\u7528\u6700\u65b0\u7684 csv \u6587\u4ef6\u8986\u76d6\u5386\u53f2 csv \u6587\u4ef6\u7684\u8bbe\u8ba1\u6765\u5b9e\u73b0\u4e86\u5bf9\u5386\u53f2 Tag \u4e0a\u7528\u4f8b\u7684\u8df3\u8fc7\uff1b \u7136\u540e\uff0c\u5728\u65e5\u5e38\u8df3\u8fc7\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u540c\u65f6\u4e5f\u5728\u4fee\u590d\u4e00\u4e9b\u7528\u4f8b\uff0c\u4fee\u590d\u540e\u7684\u8fd9\u4e9b\u7528\u4f8b\u5728\u672c\u5730\u8c03\u8bd5\u7684\u65f6\u5019\u6211\u4eec\u4e0d\u5e0c\u671b\u7ee7\u7eed\u8df3\u8fc7\uff0c\u4f46\u662f\u6b64\u65f6\uff0c\u4fee\u590d\u7684\u8fd9\u4e9b\u7528\u4f8b\u53ef\u80fd\u8fd8\u4e0d\u7a33\u5b9a\uff0c\u4e0d\u9002\u5408\u9a6c\u4e0a\u653e\u5230\u6d41\u6c34\u7ebf\u53bb\u8dd1\uff0c\u4e5f\u5c31\u662f\u8bf4\u6d41\u6c34\u7ebf\u4e0a\u6211\u4eec\u662f\u5e0c\u671b\u4ed6\u7ee7\u7eed\u8df3\u8fc7\u7684\uff0c\u56e0\u6b64\uff0c\u54b1\u4e0d\u80fd\u76f4\u63a5\u628a skip-XXX \u5e72\u6389\uff1b \u8fd9\u91cc\u5c31\u77db\u76fe\u4e86\uff0c\u4e00\u4e2a\u9700\u6c42\u662f\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u53e6\u4e00\u4e2a\u9700\u6c42\u53c8\u4e0d\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u600e\u4e48\u529e\u5462\uff1f \u6211\u4eec\u4f7f\u7528\u201c\u786e\u8ba4\u4fee\u590d\u201d\u6765\u6807\u8bb0\u8fd9\u6761\u7528\u4f8b\u5df2\u7ecf\u4fee\u590d\u4e86\uff0c\u8fd9\u6837\u4f60\u672c\u5730\u8c03\u8bd5\u7528\u4f8b\u7684\u65f6\u5019\u8fd9\u6761\u5df2\u4fee\u590d\u7684\u7528\u4f8b\u662f\u4f1a\u6267\u884c\u7684\uff0c\u540c\u65f6\u5728\u6d41\u6c34\u7ebf\u4e0a\u5c06 --ifixed yes \u53c2\u6570\u52a0\u4e0a\uff0c\u90a3\u4e48\u6d41\u6c34\u7ebf\u4e0a\u6267\u884c\u65f6\u8fd9\u6761\u7528\u4f8b\u4ecd\u7136\u662f\u8df3\u8fc7\u7684\u72b6\u6001\uff0c\u540e\u7eed\u4f60\u6253 Tag \u7684\u65f6\u5019\uff0c\u628a \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u7684\u6807\u7b7e\u5168\u90e8\u5220\u6389\u5c31\u53ef\u4ee5\u4e86\u3002 \u8fd9\u5c31\u662f\u201c\u786e\u8ba4\u4fee\u590d\u201d\u8fd9\u4e2a\u6807\u7b7e\u7684\u80cc\u666f\uff0c\u9700\u8981\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u54c1\u4e00\u54c1\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#33","title":"3.3\u3001\u5e9f\u5f03\u7528\u4f8b","text":"\u9488\u5bf9\u67d0\u4e9b\u7528\u4f8b\uff0c\u7531\u4e8e\u9700\u6c42\u53d8\u66f4\uff0c\u73af\u5883\u5f71\u54cd\u6216\u8bc4\u4f30\u4e0d\u518d\u9002\u7528\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u65f6\uff0c\u7528\u4f8b\u9700\u8981\u5e9f\u5f03\uff0c\u5219\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u5e9f\u5f03\u7528\u4f8b\u201d\uff0c\u8be5\u5217\u5b58\u5728 \u201cremoved-{\u5e9f\u5f03\u539f\u56e0}\u201d\uff0c\u5219\u7528\u4f8b\u4e0d\u4f1a\u6267\u884c\u3002 \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d removed-\u5df2\u5e9f\u5f03 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_2","title":"4\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u4e0a\u9762\u4ecb\u7ecd Pytest \u6846\u67b6\u63d0\u4f9b\u7684\u6807\u7b7e\u529f\u80fd mark\uff0c\u4f7f\u7528\u65f6\u9700\u8981\u4e3a\u6bcf\u4e00\u4e2a\u7528\u4f8b\u6dfb\u52a0\u6807\u7b7e\u88c5\u9970\u5668\uff0c\u5219\u64cd\u4f5c\u590d\u6742\uff0c\u53ef\u7ef4\u62a4\u6027\u5dee\uff0c\u5176\u6839\u672c\u95ee\u9898\u5c31\u662f\u6807\u7b7e\u5206\u6563\u5728\u6bcf\u4e00\u6761\u7528\u4f8b\u7684\u88c5\u9970\u5668\u4e0a\uff0c\u96be\u4ee5\u96c6\u4e2d\u7ef4\u62a4\uff1b\u4e8e\u662f\u4e4e\u5c06\u6240\u6709\u6807\u7b7e\u4f7f\u7528 csv \u6587\u4ef6\u8fdb\u884c\u96c6\u4e2d\u7ba1\u7406\uff0c\u5e76\u901a\u8fc7 Pytest \u7684\u94a9\u5b50\u51fd\u6570\uff0c\u8bfb\u53d6 csv \u6587\u4ef6\uff0c\u52a8\u6001\u6dfb\u52a0\u6807\u7b7e\u5230\u7528\u4e2d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5csv","title":"5\u3001CSV\u6587\u4ef6\u683c\u5f0f","text":"\u6b64\u914d\u7f6e\u6587\u4ef6\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u6807\u7b7e\u6570\u636e\uff0c\u4e14\u8981\u65b9\u4fbf\u80fd\u4f7f\u7528 Excel \u6253\u5f00\u8fdb\u884c\u7f16\u8f91\u67e5\u770b\uff0c\u66f4\u91cd\u8981\u7684\u662f\u6211\u4eec\u4e0d\u60f3\u5f15\u5165\u4e09\u65b9\u4f9d\u8d56\uff0cCSV \u6587\u4ef6\u51e0\u4e4e\u662f\u552f\u4e00\u80fd\u6ee1\u8db3\u6240\u6709\u7684\u8981\u6c42\u7684\u6587\u4ef6\u683c\u5f0f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_6","title":"\u4e03\u3001\u65e5\u5fd7\u7cfb\u7edf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_5","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e YouQu \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u64cd\u4f5c\u65b9\u6cd5\u5c01\u88c5\u5199\u6cd5\uff0c\u901a\u5e38\u662f\u8fd9\u6837\u7684\uff1a\u7c7b\u91cc\u9762\u4e00\u4e2a\u51fd\u6570\u53ea\u5305\u542b\u4e00\u4e2a\u64cd\u4f5c\u6216\u591a\u6b21\u8c03\u7528\u7684\u4e00\u7cfb\u5217\u53ef\u5408\u5e76\u7684\u64cd\u4f5c\uff1b \u4f20\u7edf\u7684\u65e5\u5fd7\u8f93\u51fa\u65b9\u5f0f\uff0c\u9700\u8981\u5728\u6bcf\u4e2a\u51fd\u6570\u91cc\u9762\u4e3b\u52a8\u7f16\u5199\u65e5\u5fd7\u8f93\u51fa\u4ee3\u7801 \uff0c\u4f8b\u5982\uff1a class XXXWidget:\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\nlogger.info(\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\")\n...\n# \u7701\u7565\u4ee3\u7801\u90e8\u5206\n \u4e00\u4e2a\u51fd\u6570\u91cc\u9762\u81f3\u5c11\u5305\u542b\u4e00\u6761\u65e5\u5fd7\u4fe1\u606f\uff0c\u5982\u679c\u6bd4\u8f83\u590d\u6742\u64cd\u4f5c\u6b65\u9aa4\uff0c\u53ef\u80fd\u5305\u542b\u591a\u6761\u65e5\u5fd7\u4fe1\u606f\uff1b \u4e00\u4e2a\u5e94\u7528\u542b\u6709\u5927\u91cf\u7684\u64cd\u4f5c\u51fd\u6570\uff0c\u4e5f\u5c31\u662f\u8bf4\u6211\u4eec\u9700\u8981\u5199\u5927\u91cf\u7684\u65e5\u5fd7\u4ee3\u7801\uff1b \u901a\u8fc7\u7ecf\u9a8c\u89c2\u5bdf\uff0c\u6211\u4eec\u53d1\u73b0\uff0c\u51fd\u6570\u8bf4\u660e\u4ee5\u53ca\u51fd\u6570\u64cd\u4f5c\u65e5\u5fd7\uff0c\u5177\u6709\u8f83\u9ad8\u7684\u91cd\u590d\u5ea6\uff08\u4ece\u4e0a\u9762\u7684\u4f8b\u5b50\u4e5f\u53ef\u4ee5\u770b\u51fa\u6765\uff09\uff0c\u56e0\u6b64\u6211\u4eec\u5927\u80c6\u7684\u8bbe\u60f3\uff0c\u80fd\u4e0d\u80fd\u57fa\u4e8e\u6846\u67b6\u6267\u884c\u65f6\uff0c\u81ea\u52a8\u7684\u5c06\u51fd\u6570\u8bf4\u660e\u4f5c\u4e3a\u65e5\u5fd7\u6253\u5370\u51fa\u6765\uff0c\u4ece\u800c\u51cf\u5c11\u5927\u91cf\u65e5\u5fd7\u4ee3\u7801\u91cf\u548c\u91cd\u590d\u7f16\u5199\uff0c\u90a3\u771f\u662f\u5999\u554a~\u3002 \u57fa\u4e8e\u6b64\u201c\u5929\u771f\u201d\u7684\u60f3\u6cd5\uff0c\u6211\u4eec\u8bbe\u8ba1\u51fa\u4e86 youqu \u7684\u65e5\u5fd7\u7cfb\u7edf\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_5","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u6838\u5fc3\u539f\u7406\uff1a \u901a\u8fc7\u7ed9\u7c7b\u52a0\u4e0a\u4e00\u4e2a\u88c5\u9970\u5668 @log\uff0c\u52a8\u6001\u7ed9\u8be5\u7c7b\u4e0b\u6240\u6709\u7684\u51fd\u6570\u53ca\u7236\u7c7b\u51fd\u6570\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668 @_trace\uff0c\u5728\u6b64\u88c5\u9970\u5668\u4e2d\u6211\u4eec\u80fd\u52a8\u6001\u7684\u6355\u83b7\u6240\u8c03\u7528\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff08func.__doc__\uff09\uff0c\u901a\u8fc7\u65e5\u5fd7\u8f93\u51fa\u5668\u5c06\u5176\u8f93\u51fa\u5373\u53ef\u3002 \u5b9e\u73b0\u6b65\u9aa4\uff1a \u901a\u8fc7 inspect.getmembers \u83b7\u53d6\u88ab\u88c5\u9970\u7684\u7c7b\u4e0b\u6240\u6709\u51fd\u6570\uff0c\u5305\u542b\u9759\u6001\u65b9\u6cd5\uff0c\u7c7b\u65b9\u6cd5\uff0c\u5b9e\u4f8b\u65b9\u6cd5\uff1b \u901a\u8fc7 setattr(\u7c7b, \u65b9\u6cd5, _trace\uff09 \u7684\u65b9\u5f0f\uff0c\u7ed9\u7b26\u5408\u6761\u4ef6\u7684\u51fd\u6570\uff0c\u52a8\u6001\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_3","title":"3\u3001\u65e5\u5fd7\u914d\u7f6e","text":"[log_cli]\n;\u65e5\u5fd7\u76f8\u5173\u914d\u7f6e\uff08\u4e0d\u6253\u5370\u6784\u9020\u51fd\u6570\u548c\u9b54\u6cd5\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff09\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = INFO\n# ============= \u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u914d\u7f6e ================\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u5f00\u5934\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7, \u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_STARTSWITH = Assert\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u7ed3\u5c3e\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_ENDSWITH = Widget\n;\u652f\u6301\u7c7b\u540d\u5305\u542b xxx \u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_CONTAIN = ShortCut\n# ==============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_3","title":"4\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u5728\u5e94\u7528\u5e93 widget \u65b9\u6cd5\u5e93\u91cc\u9762\uff0c\u53ea\u9700\u8981\u5728\u51fa\u53e3\u6587\u4ef6\u52a0\u4e0a\u7c7b\u88c5\u9970\u5668\uff0c\u5c31\u53ef\u4ee5\u5b9e\u73b0\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u4e86\uff1b # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6ce8\u610f\uff0c\u662f\u7c7b\u88c5\u9970\u5668\u3002 \u5b9e\u4f8b\uff1a # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\n@classmethod\ndef find_dfm_image(cls, *elements, multiple=False, rate=0.9):\n\"\"\"\n \u67e5\u627e\u56fe\u7247 {{elements}}.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e {{rate}} \u7684\u5750\u6807\n :param elements:\n :param multiple:\n :return:\n \"\"\"\nelement = tuple(map(lambda x: f\"{Config.PIC_RES_PATH}/{x}\", elements))\nreturn cls.find_image(*element, multiple=multiple)\n \u8c03\u7528\u65b9\u6cd5\u65f6\uff1a DfmWidget.find_dfm_image(\"dfm_001\")\n \u81ea\u52a8\u8f93\u51fa\u7684\u65e5\u5fd7\uff1a >> x86_64-uos-6: 02/28 17:48:47 | INFO | logger_utils: [find_dfm_image]: \u67e5\u627e\u56fe\u7247 dfm_001.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e 0.9 \u7684\u5750\u6807\n \u52a0\u4e0a\u88c5\u9970\u5668 @log \u4e4b\u540e\uff0c\u65b9\u6cd5\u5c42\u6240\u6709\u7684\u51fd\u6570\uff08\u5305\u62ec\u5b9e\u4f8b\u65b9\u6cd5\u3001\u7c7b\u65b9\u6cd5\u3001\u9759\u6001\u65b9\u6cd5\uff09\u90fd\u4e0d\u9700\u8981\u518d\u5199\u65e5\u5fd7\u4ee3\u7801\uff0c\u6267\u884c\u7684\u65f6\u5019\u4f1a\u81ea\u52a8\u8f93\u51fa\uff0c\u5e76\u4e14\u6240\u6709\u8c03\u7528\u7684\u65b9\u6cd5\u4f1a\u4ee5 allure.step \u7684\u65b9\u5f0f\uff0c\u5c55\u793a\u5728 allure \u62a5\u544a\u4e2d\uff0c\u5728\u62a5\u544a\u4e2d\u66f4\u80fd\u4e00\u76ee\u4e86\u7136\u7684\u770b\u5230\u7528\u4f8b\u6267\u884c\u6b65\u9aa4\u3002 \u3010\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\u3011 \u901a\u8fc7\u89c2\u5bdf\u524d\u9762\u7684\u4f8b\u5b50\uff0c\u7ec6\u5fc3\u7684\u540c\u5b66\u53ef\u80fd\u8fd8\u53d1\u73b0\u4e86\u4e00\u4e2a\u5c0f\u7ec6\u8282\uff1a\u51fd\u6570\u529f\u80fd\u8bf4\u660e\u4e2d\uff0c\u4e24\u5bf9\u5927\u62ec\u53f7\u4e2d\u7684\u5185\u5bb9 {{elements}} \u4f5c\u4e3a\u53d8\u91cf\u8f93\u51fa\u51fa\u6765\u4e86\uff1b \u6ca1\u9519\uff0c\u8fd9\u5c31\u662f\u6211\u4eec\u53c2\u8003Django \u548c jinja2 \u7684\u6a21\u677f\u8bed\u6cd5\u8bbe\u8ba1\u51fa\u7684\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\uff0c\u4f7f\u7528\u65b9\u6cd5\u5f88\u7b80\u5355\uff0c\u7528\u4e24\u5bf9\u5927\u62ec\u53f7\u628a\u51fd\u6570\u7684\u53c2\u6570\u62ec\u8d77\u6765\uff0c\u8fd9\u6837\u5728\u65e5\u5fd7\u8f93\u51fa\u7684\u65f6\u5019\u5c31\u80fd\u628a\u8c03\u7528\u51fd\u6570\u65f6\u53c2\u6570\u7684\u503c\u8f93\u51fa\u51fa\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_7","title":"\u516b\u3001\u73af\u5883\u90e8\u7f72","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_6","title":"1\u3001\u539f\u5219","text":"YouQu \u7684\u73af\u5883\u4f9d\u8d56\u4e00\u76f4\u575a\u6301 2 \u4e2a\u539f\u5219\uff1a \u6700\u5c0f\u73af\u5883\u4f9d\u8d56\u539f\u5219 \u6709\u4e9b\u540c\u5b66\u5199\u4e00\u4e9b\u529f\u80fd\uff0c\u9996\u5148\u60f3\u5230\u7684\u5c31\u662f\u53bb\u641c\u7d22\u5f15\u64ce\u641c\u4e00\u4e0b\uff0c\u770b\u6709\u6ca1\u6709\u73b0\u6210\u7684\u5de5\u5177\u6216\u8005\u4ee3\u7801\u76f4\u63a5\u80fd\u7528\uff0c\u7f8e\u5176\u540d\u66f0\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\uff0c\u522b\u4eba\u5df2\u7ecf\u9020\u597d\u4e86\u8f6e\u5b50\u54b1\u4eec\u5c31\u4e0d\u8981\u91cd\u590d\u53bb\u9020\u4e86\uff0c\u7136\u540e\u4e00\u5207\u4f3c\u4e4e\u90fd\u53d8\u5f97\u90a3\u4e48\u7684\u7406\u6240\u5e94\u5f53\u3002 \u5f53\u7136\u8fd9\u6837\u505a\u65e0\u53ef\u539a\u975e\uff0c\u6211\u76f8\u4fe1\u6709\u8fd9\u6837\u60f3\u6cd5\u5e76\u4e14\u4e00\u76f4\u8df5\u884c\u8fd9\u6837\u505a\u6cd5\u7684\u540c\u5b66\u4e0d\u5728\u5c11\u6570\uff0c\u4f46\u8fd9\u6837\u505a\u6709\u4e00\u4e2a\u5f88\u4e25\u91cd\u7684\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f60\u5199\u4e00\u4e2a\u5927\u578b\u9879\u76ee\u65f6\uff0c\u4f60\u4f1a\u5f15\u5165\u975e\u5e38\u975e\u5e38\u975e\u5e38\u591a\u7684\u4f9d\u8d56\uff0c\u6bd4\u5982\u8981\u505a\u4e2a\u63a5\u53e3\u8bf7\u6c42\u8981\u7528 requests\u3001\u8bfb\u5199\u4e2a\u6570\u636e\u7528 pandas\u3001\u5199\u4e2a\u8868\u683c\u7528 pyopenxl\u3001\u89e3\u6790\u4e2a\u6587\u672c\u8981\u7528\u8fd9\u4e2a\u90a3\u4e2a\u4e09\u65b9\u5e93 ... \u3002 \u6211\u8ba4\u4e3a\u8fd9\u662f\u975e\u5e38\u4e0d\u597d\u7684\u4e60\u60ef\uff0c\u5728\u5b9e\u73b0\u4e00\u4e2a\u529f\u80fd\u7684\u65f6\u5019\uff0c\u9996\u5148\u6211\u4eec\u5e94\u8be5\u53bb\u60f3\u81ea\u5df1\u600e\u4e48\u6837\u53bb\u5b9e\u73b0\uff0c\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff1b \u5982\u679c\u4f60\u4e0d\u4f1a\uff0c\u4f60\u53ef\u4ee5\u53bb\u5b66\u4e60\u4e09\u65b9\u5e93\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u522b\u4eba\u4e09\u65b9\u5e93\u4e5f\u662f\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\u7684\uff0c\u4e3a\u4ec0\u4e48\u54b1\u4eec\u4e0d\u884c\u5462\uff1b\u5982\u679c\u522b\u4eba\u7684\u4f60\u5b9e\u5728\u662f\u770b\u4e0d\u61c2\uff0c\u60f3\u5c3d\u4e00\u5207\u529e\u6cd5\u786e\u5b9e\u505a\u4e0d\u51fa\u6765\uff0c\u90a3\u518d\u8003\u8651\u5f15\u5165\u8fd9\u4e2a\u4e09\u65b9\u5e93\uff0c\u6211\u8ba4\u4e3a\u8fd9\u6837\u662f\u6ca1\u95ee\u9898\u7684\uff0c\u6bd5\u7adf\u54b1\u4eec\u6bb5\u4f4d\u8fd8\u4e0d\u591f\uff0c\u4f46\u5e0c\u671b\u5c06\u6765\u6709\u4e00\u5929\u6211\u4eec\u53ef\u4ee5\u3002 \u8fd9\u6837\u7684\u505a\u6cd5\u624d\u5e94\u8be5\u662f\u201c\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\u201d\u6b63\u786e\u7684\u64cd\u4f5c\u3002\u4e0d\u4f1a\u6ca1\u5173\u7cfb\uff0c\u770b\u770b\u522b\u4eba\u662f\u600e\u4e48\u5b9e\u73b0\u7684\uff0c\u81ea\u5df1\u518d\u6478\u7d22\u7740\u5199\u51fa\u6765\uff0c\u8fd9\u6837\u81ea\u5df1\u624d\u80fd\u6709\u6240\u63d0\u9ad8\uff0c\u4e0d\u7136\u4f60\u5c31\u53ea\u4f1a\u7528\u522b\u4eba\u7684\u4e1c\u897f\uff1b\u90a3\u4e9b\u5632\u7b11\u3001\u6279\u8bc4\u6211\u4eec\u91cd\u590d\u9020\u8f6e\u5b50\u7684\u4eba\uff0c\u5148\u60f3\u60f3\u81ea\u5df1\u4f1a\u9020\u8f6e\u5b50\u5417\u3002 \u672c\u7740\u81ea\u5df1\u5b9e\u73b0\u80fd\u5b9e\u73b0\u7684\u4e00\u5207\u7684\u539f\u5219\uff0cYouQu \u6846\u67b6\u505a\u5230\u4e86\u975e\u5e38\u5c11\u7684\u73af\u5883\u4f9d\u8d56\uff0c\u800c\u4e14\u6211\u4eec\u4ecd\u5728\u4e0d\u65ad\u52aa\u529b\uff0c\u51cf\u5c11\u73af\u5883\u90e8\u7f72\u7684\u4f9d\u8d56\u3002 \u6700\u5c0f\u4ed3\u5e93\u4f53\u79ef\u539f\u5219 \u5927\u6587\u4ef6\u4e0d\u80fd\u4e0a\u4f20\u5230\u5de5\u7a0b\u91cc\u9762\uff0c\u4fdd\u6301\u6574\u4e2a\u5de5\u7a0b\u7684\u8f7b\u91cf\u5316\uff0c\u8fd9\u6837\u5728\u514b\u9686\u4ee3\u7801\u7684\u65f6\u5019\u624d\u80fd\u975e\u5e38\u5feb\u901f\u65b9\u4fbf\u4f7f\u7528\uff0c\u6211\u4eec\u89c1\u8fc7\u4e00\u4e2a AT \u5de5\u7a0b clone \u5927\u5c0f\u8fbe\u5230\u597d\u51e0\u4e2a G\uff0c\u7b80\u76f4\u4e0d\u53ef\u601d\u8bae\u3002 \u5176\u5b9e\u4ee3\u7801\u6587\u4ef6\u7684\u5927\u5c0f\u662f\u5f88\u5c0f\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u7eaf\u5199\u4ee3\u7801\u968f\u4fbf\u5199\u5de5\u7a0b\u4e5f\u4e0d\u4f1a\u592a\u5927\uff0c\u800c\u6587\u6863\uff08\u5305\u542b\u63d2\u56fe\uff09\u7b49\u8d44\u6e90\u5374\u662f\u5f88\u5360\u7a7a\u95f4\u3002 \u56e0\u6b64\u6211\u4eec\u9009\u62e9\u5c06 YouQu \u7684\u6587\u6863\u5de5\u7a0b\u6d89\u53ca\u5230\u7684\u56fe\u7247\u8d44\u6e90\u90fd\u91c7\u7528\u5916\u94fe\u52a0\u8f7d\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_6","title":"2\u3001\u5b89\u88c5","text":"\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u8fd0\u884c env.sh \u5373\u53ef\u3002 bash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_4","title":"3\u3001\u5b9a\u5236\u4f9d\u8d56","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_2","title":"3.1\u3001\u65b0\u589e\u4f9d\u8d56","text":"\u5982\u679c\u5e94\u7528\u5e93\u8fd8\u9700\u8981\u5176\u4ed6 Python \u4f9d\u8d56\u5e93\uff0c\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a requirement.txt \u6587\u4ef6\uff1b autotest_xxx\n\u251c\u2500\u2500 requirement.txt\n\u251c\u2500\u2500 case ...\n \u91cc\u9762\u5199\u5165\u9700\u8981\u5b89\u88c5\u7684\u4e09\u65b9\u4f9d\u8d56\uff0c\u6bd4\u5982\u50cf\u8fd9\u6837\uff1a # requirement.txt\nPyYAML==6.0 # \u6307\u5b9a\u5b89\u88c5\u67d0\u4e2a\u7248\u672c\nrequests # \u672a\u6307\u5b9a\u7248\u672c\u5219\u5b89\u88c5\u6700\u65b0\u7248\n \u5728\u6267\u884c bash env.sh \u65f6\u4f1a\u4e00\u5e76\u5c06\u5176\u5b89\u88c5\u3002 \u5982\u679c\u591a\u4e2a\u5e94\u7528\u5e93\u90fd\u5b58\u5728 requirement.txt \u6587\u4ef6\uff0c\u6267\u884c env.sh \u65f6\u4f1a\u5c06\u591a\u4e2a requirement.txt \u6587\u4ef6\u4e00\u5e76\u52a0\u8f7d\uff1b\u90a3\u4e48\u4e00\u5b9a\u8981\u6ce8\u610f\u591a\u4e2a requirement.txt \u6587\u4ef6\u53ef\u80fd\u5b58\u5728\u76f8\u540c\u7684\u4f9d\u8d56\u88ab\u6307\u5b9a\u5b89\u88c5\u4e0d\u540c\u7248\u672c\u7b49\u7b49\u517c\u5bb9\u6027\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32_1","title":"3.2\u3001\u88c1\u526a\u4f9d\u8d56","text":"\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0c\u53ef\u80fd\u4f60\u53ea\u9700\u8981\u5b89\u88c5\u4e00\u4e9b\u6700\u6700\u57fa\u7840\u7684\u4f9d\u8d56\uff0c\u5176\u4ed6\u7684\u90fd\u4e0d\u9700\u8981\uff0c\u6bd4\u5982\u7eaf\u63a5\u53e3\u81ea\u52a8\u5316\u7684\u9879\u76ee\uff0c\u5b83\u4e0d\u9700\u8981 UI \u81ea\u52a8\u5316\u76f8\u5173\u7684\u4f9d\u8d56\u3002 \u4f60\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\uff0c\u5b58\u653e\u4e00\u4e2a BASICENV \u7684\u666e\u901a\u6587\u4ef6\uff0c\u91cc\u9762\u4e0d\u9700\u8981\u5199\u4efb\u4f55\u5185\u5bb9\uff0c\u8fd9\u6837\u6267\u884c env.sh \u65f6\uff0c\u53ea\u4f1a\u5b89\u88c5\u6700\u57fa\u7840\u7684\u4f9d\u8d56\u3002 autotest_xxx\n\u251c\u2500\u2500 BASICENV # \u53ef\u4ee5\u4f7f\u7528\uff1atouch BASICENV \u521b\u5efa\u6587\u4ef6\n\u251c\u2500\u2500 case ...\n \u57fa\u7840\u4f9d\u8d56\u4ec5\u5b89\u88c5\u4ee5\u4e0b\u51e0\u4e2a\u5305\uff1a pytest # pytest\npytest-rerunfailures # \u5931\u8d25\u91cd\u8dd1\u63d2\u4ef6\npytest-timeout # \u7528\u4f8b\u8d85\u65f6\u63d2\u4ef6\nallure-pytest # \u751f\u6210 allure \u62a5\u544a\u63d2\u4ef6\nallure.deb # allure \u62a5\u544a\u67e5\u770b\u5de5\u5177\n \u88c1\u526a\u4f9d\u8d56 \u548c \u65b0\u589e\u4f9d\u8d56 \u662f\u4e0d\u51b2\u7a81\u7684\uff0c\u53ef\u4ee5\u540c\u65f6\u4f7f\u7528\u3002 \u6b64\u65b9\u6848\u9ed8\u8ba4\u4e3a\u865a\u62df\u73af\u5883\u90e8\u7f72\uff0c\u5982\u679c\u4f60\u60f3\u76f4\u63a5\u90e8\u7f72\u5728\u672c\u673a\u4e0a\uff1a bash env_dev.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_4","title":"4\u3001\u865a\u62df\u5316\u90e8\u7f72","text":"YouQu\u9ed8\u8ba4\u91c7\u7528\u865a\u62df\u5316\u90e8\u5206\uff0c\u865a\u62df\u5316\u73af\u5883\u5b9e\u9645\u5b89\u88c5\u7684\u4f4d\u7f6e\u662f\u5728 $HOME/.local/share/virtualenvs/youqu-oHTM7l7G \u76ee\u5f55\u4e0b youqu-oHTM7l7G \u6b64\u76ee\u5f55\u540d\u79f0\u524d\u9762\u90e8\u5206\u662f\u4f60\u7684\u4ee3\u7801\u6839\u76ee\u5f55\u7684\u540d\u79f0\uff0c\u540e\u9762\u90e8\u5206\u662f\u751f\u6210\u7684\u968f\u673a\u5b57\u7b26\u4e32\uff1b \u540c\u5b66\u4eec\u5728\u8fdc\u7a0b\u673a\u5668\u4e0a\u5b9a\u4f4d\u95ee\u9898\u7684\u65f6\u5019\uff0c\u5982\u679c\u4f7f\u7528 Pycharm \u8c03\u8bd5\uff0c\u5c31\u5c06\u89e3\u91ca\u5668\u6307\u5b9a\u5230\u8fd9\u4e2a\u76ee\u5f55\u7684\u5c31\u884c\u4e86\uff1b \u5f53\u7136\uff0c\u6211\u4eec\u4e5f\u63d0\u4f9b\u4e86\u672c\u673a\u5f00\u53d1\u73af\u5883\u90e8\u7f72\uff1a bash env_dev.sh\n \u5982\u679c\u4f60\u662f\u672c\u5730\u5f00\u53d1\u73af\u5883\u53ef\u4ee5\u7528\u5b83\uff0c\u533a\u522b\u5c31\u662f\u9a71\u52a8\u6267\u884c\u7684\u65f6\u5019\u4f7f\u7528\uff1apython3 manage.py xxx"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_8","title":"\u4e5d\u3001\u5931\u8d25\u5f55\u5c4f","text":"\u5f55\u5c4f\u5176\u5b9e\u662f\u4e00\u79cd\u89c6\u9891\u5f62\u5f0f\u7684\u65e5\u5fd7\uff0c\u56e0\u4e3a\u5f88\u591a\u65f6\u5019\u6211\u4eec\u5728\u67e5\u770b\u65e5\u5fd7\u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u51c6\u786e\u7684\u5b9a\u4f4d\u5230\u7528\u4f8b\u5931\u8d25\u7684\u5177\u4f53\u539f\u56e0\uff0c\u56e0\u6b64\u7528\u4f8b\u7684\u5f55\u5c4f\u80fd\u8ba9\u6211\u4eec\u770b\u5230\u7528\u4f8b\u5728\u6267\u884c\u8fc7\u7a0b\uff1b \u3010\u4f7f\u7528\u65b9\u6cd5\u3011 \u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u5173\u6ce8 2 \u4e2a\u53c2\u6570\uff1b ;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\u3002\n;\u6ce8\u610f\uff0c\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u4e0d\u80fd\u5c0f\u4e8e\u5931\u8d25\u5f55\u5c4f\u6b21\u6570\uff0c\u5373 RERUN >= RECORD_FAILED_CASE\nRECORD_FAILED_CASE = 1\n \u9ed8\u8ba4\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u662f 1 \u6b21\uff1b RECORD_FAILED_CASE = 1 \u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff1b RECORD_FAILED_CASE = 0 \u8868\u793a\u4e0d\u7ba1\u7528\u4f8b\u6210\u529f\u6216\u5931\u8d25\u90fd\u5f55\u5c4f\uff1b \u5f55\u5c4f\u662f\u8981\u5360\u7528\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u7279\u522b\u662f\u5728\u4e00\u4e9b\u914d\u7f6e\u8f83\u4f4e\u7684\u673a\u5668\u4e0a\u4f1a\u5f88\u660e\u663e\uff0c\u6240\u4ee5\u4f60\u9700\u8981\u8003\u8651\u662f\u5426\u6709\u5fc5\u8981\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1b \u4f7f\u7528 manage.py \u6267\u884c\u7528\u4f8b\u9ed8\u8ba4\u8bfb\u53d6\u5230 globalconfig.ini \u91cc\u9762\u7684\u53c2\u6570\uff0c\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report/record \u76ee\u5f55\u4e0b\u4fdd\u5b58\u5931\u8d25\u7528\u4f8b\u7684\u5f55\u5c4f\u548c\u65ad\u8a00\u7684\u90a3\u4e2a\u65f6\u95f4\u70b9\u7684\u622a\u5c4f\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7\u89c6\u9891\u6587\u4ef6\u770b\u5230\u5931\u8d25\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u90fd\u53d1\u751f\u4e86\u4ec0\u4e48\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#wayland","title":"\u5341\u3001Wayland \u9002\u914d","text":"Wayland \u4e0b\u81ea\u52a8\u5316\u4e3b\u8981\u95ee\u9898\u662f X11 \u4e0b\u7684\u952e\u9f20\u64cd\u4f5c\u65b9\u6cd5\u65e0\u6cd5\u4f7f\u7528\uff0c\u6bd4\u5982 Xdotool\u3001 PyAutoGUI\u3001Xwininfo \u7b49\u7b49\uff1b YouQu \u5728 Wayland \u4e0b\u517c\u5bb9\u9002\u914d\uff0cenv.sh \u5728 Wayland \u4e0b\u6267\u884c\u65f6\u4f1a\u5b89\u88c5\u81ea\u7814\u7684\u952e\u9f20\u64cd\u4f5c\u670d\u52a1\uff08\u53ef\u80fd\u5b58\u5728\u4e00\u4e9b\u4f9d\u8d56\u62a5\u9519\uff0c\u6309\u7167\u6ce8\u91ca\u89e3\u51b3\u5373\u53ef\uff09\uff0c\u6846\u67b6\u6838\u5fc3\u5e93\u4e5f\u9488\u5bf9\u6027\u7684\u505a\u4e86\u9002\u914d\uff0c\u4e0a\u5c42\u7528\u4f8b\u5b8c\u5168\u4e0d\u7528\u5173\u5fc3\u673a\u5668\u662fWayland \u8fd8\u662f X11\uff0c\u6846\u67b6\u4f1a\u6839\u636e\u6267\u884c\u65f6\u72b6\u6001\u81ea\u52a8\u5224\u65ad\u8d70\u4e0d\u540c\u7684\u903b\u8f91\uff1b \u7b80\u5355\u8bb2\u5c31\u662f\uff0c\u5e94\u7528\u5e93\u53ea\u9700\u8981\u7ef4\u62a4\u4e00\u5957\u7528\u4f8b\u811a\u672c\u5373\u53ef\u3002 \u3010\u7528\u4f8b\u517c\u5bb9\u3011 \u56e0\u4e3a Wayland \u4e0b\u6709\u4e9b\u5e94\u7528\u7684\u754c\u9762\u663e\u793a\u548c\u529f\u80fd\u672c\u8eab\u5b58\u5728\u4e00\u4e9b\u5dee\u5f02\uff0c\u7528\u4f8b\u5c42\u53ef\u80fd\u9700\u8981\u5bf9\u8fd9\u90e8\u5206\u7528\u4f8b\u505a\u903b\u8f91\u5224\u65ad\uff0c\u4f7f\u7528\u5168\u5c40\u914d\u7f6e\u91cc\u9762\u7684\u5e38\u91cf\u8fdb\u884c\u903b\u8f91\u7f16\u5199\u5373\u53ef\uff1a from setting.globalconfig import GlobalConfig\n# GlobalConfig.IS_WAYLAND \u83b7\u53d6\u5230\u5f53\u524d\u7684\u663e\u793a\u670d\u52a1\u5668\uff08bool\uff09\n# \u5e94\u7528\u5e93 Config \u7ee7\u627f GlobalConfig\nif Config.IS_WAYLAND:\npass\nif Config.IS_X11:\npass\n \u6bd4\u5982\u7528\u4f8b\u91cc\u9762\u5982\u679c\u65ad\u8a00\u7684\u56fe\u7247\u4e0d\u540c\uff1a if Config.IS_WAYLAND:\nself.assert_image_exist(\"wayland_XXX\")\nelse:\nself.assert_image_exist(\"x11_XXX\")\n \u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u811a\u672c\u5728 Wayland \u548c X11 \u4e0b\u90fd\u53ef\u4ee5\u8dd1\uff0cso easy \u662f\u4e0d\u662f\uff1f\u5b8c\u5168\u6ca1\u5fc5\u8981\u4e13\u95e8\u62c9\u65b0\u5206\u652f\u8fdb\u884c Wayland \u9002\u914d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_9","title":"\u5341\u4e00\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_7","title":"1. \u76ee\u5f55\u7ed3\u6784","text":"\u6267\u884c\u65f6\u4f1a\u5728\u6839\u76ee\u5f55\u4e0b\u52a8\u6001\u751f\u6210 report \u76ee\u5f55\uff0c\u6240\u6709\u7684\u62a5\u544a\u76f8\u5173\u7684\u6587\u4ef6\u4f1a\u7edf\u4e00\u5b58\u653e\u5728\u91cc\u9762\uff0c\u793a\u4f8b\uff1a /report\n \u251c\u2500\u2500 allure # allure\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json\n \u251c\u2500\u2500 allure_html # \u751f\u6210\u7684html\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 index.html \u251c\u2500\u2500 allure_back # allure\u62a5\u544a\u5907\u4efd\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 20221108114823\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json\n \u251c\u2500\u2500 json # json\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 result_deepin-music_20221109134736_1081333.json\n \u251c\u2500\u2500 logs # \u65e5\u5fd7\u6587\u4ef6\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 2022-11-10_debug.log \u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-10_error.log\n \u251c\u2500\u2500 record # \u5f55\u5c4f\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-09\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 15\u65f614\u520609\u79d2_test_music_303_2_autotest.mp4\n \u2514\u2500\u2500 xml # xml\u62a5\u544a\n\u2514\u2500\u2500 autotest_deepin_music-20221109134736.xml\n \u9ed8\u8ba4\u60c5\u51b5\u4e0b\u540c\u65f6\u751f\u6210 html\u3001xml\u3001json\u4e09\u79cd\u5f62\u5f0f\u7684\u62a5\u544a\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_7","title":"2. \u5b9a\u5236\u62a5\u544a","text":"\u6211\u4eec\u5bf9 allure \u62a5\u544a\u8fdb\u884c\u4e86\u4e00\u7cfb\u5217\u7684\u5b9a\u5236\uff1a \u5b9a\u5236 logo\u3001title\u3001\u62a5\u544a\u9ed8\u8ba4\u8bed\u8a00\u4e3a\u4e2d\u6587\uff1b \u52a0\u5165\u4e86\u7528\u4f8b\u65ad\u8a00\u5931\u8d25\u65f6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u4ee5\u53ca\u6b64\u65f6\u56fe\u50cf\u5bf9\u6bd4\u7684\u6a21\u677f\u56fe\u7247\uff1b \u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\uff0c\u4f60\u53ef\u4ee5\u5728 html \u62a5\u544a\u4e2d\u76f4\u63a5\u770b\u5f55\u5236\u7684\u89c6\u9891\uff1b \u52a0\u5165\u4e86 IP \u5730\u5740\u3001\u7cfb\u7edf\u4fe1\u606f\u3001\u955c\u50cf\u7248\u672c\u7b49\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_5","title":"3. \u67e5\u770b\u62a5\u544a","text":" \u672c\u5730\u6267\u884c \u5728 report/allure \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u4e00\u5806\u6587\u672c\u6587\u4ef6\uff0c\u8fd9\u4e9b\u662f allure \u63d2\u4ef6\u751f\u6210\u7684\u62a5\u544a\u6e90\u6570\u636e\uff0c\u6211\u4eec\u5728 report/allure_html \u76ee\u5f55\u4e0b\u7ed9\u4f60\u751f\u6210\u4e86 html \u6587\u4ef6\uff0c\u4f46\u662f\u4f60\u4e0d\u80fd\u76f4\u63a5\u901a\u8fc7\u6d4f\u89c8\u5668\u6253\u5f00 index.html \u6587\u4ef6\uff0c\u56e0\u4e3a allure \u7684\u62a5\u544a\u90fd\u662f\u57fa\u4e8e\u5728\u7ebf\u7684\u670d\u52a1\uff0c\u4f60\u5e94\u8be5\u8fd9\u6837\u6253\u5f00\uff1a allure open report/allure_html\n \u4f7f\u7528 manage.py \u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u5728\u7ec8\u7aef\u7684\u6700\u540e\u4e00\u884c\uff0c\u6211\u4eec\u4f1a\u7ed9\u4f60\u8f93\u51fa\u6253\u5f00\u62a5\u544a\u7684\u547d\u4ee4\uff0c\u76f4\u63a5\u590d\u5236\u5b83\u5728\u7ec8\u7aef\u6267\u884c\u5c31\u53ef\u4ee5\u67e5\u770b\u4e86\uff0c\u50cf\u8fd9\u6837\uff1a \u7ec8\u7aef\u6267\u884c\u547d\u4ee4: allure open /tmp/youqu/report/allure_html \u67e5\u770b\u62a5\u544a \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 Pycharm \u91cc\u9762\u627e\u5230 index.html \u6587\u4ef6\uff0c\u7136\u540e\u53f3\u952e\u9009\u62e9\u6d4f\u89c8\u5668\u6253\u5f00\uff0c\u6216\u8005\u4f60\u53ef\u4ee5\u7528\u4e00\u4e2a http \u670d\u52a1\u6253\u5f00\u3002 \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 report/allure \u76ee\u5f55\u4e0b\u67e5\u770b\u62a5\u544a\uff1a allure serve report/allure\n \u8fdc\u7a0b\u6267\u884c \u8fdc\u7a0b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\uff0c\u4f1a\u5c06\u6240\u6709\u8fdc\u7a0b\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u62a5\u544a\u90fd\u6536\u96c6\u5230 report/allure \u76ee\u5f55\u4e0b\uff0c\u5206\u522b\u6309\u7167\u673a\u5668\u7684 IP \u7b49\u5efa\u4e86\u4e0d\u540c\u7684\u76ee\u5f55\uff0c\u4f60\u53ef\u4ee5\u5728\u8fd9\u4e9b\u76ee\u5f55\u91cc\u9762\u53bb\u67e5\u770b\u5bf9\u5e94\u7684\u6d4b\u8bd5\u62a5\u544a\uff0c\u67e5\u770b\u65b9\u6cd5\u548c\u524d\u9762\u672c\u5730\u6267\u884c\u67e5\u770b\u7684\u65b9\u6cd5\u4e00\u6837\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_10","title":"\u5341\u4e8c\u3001\u9759\u6001\u4ee3\u7801\u626b\u63cf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_8","title":"1. \u63d0\u524d\u89e3\u51b3\u4ee3\u7801\u95ee\u9898","text":"\u4e3a\u4e86\u5e2e\u52a9\u5f00\u53d1\u8005\u7edf\u4e00\u4ee3\u7801\u98ce\u683c\uff0cPython \u793e\u533a\u63d0\u51fa\u4e86 PEP8 \u4ee3\u7801\u7f16\u7801\u98ce\u683c\uff0cPython \u5b98\u65b9\u540c\u65f6\u63a8\u51fa\u4e86\u4e00\u4e2a\u68c0\u67e5\u4ee3\u7801\u98ce\u683c\u662f\u5426\u7b26\u5408 PEP8 \u7684\u5de5\u5177\uff0c\u540d\u5b57\u4e5f\u53eb PEP8\u3002 \u4f46\u662f\uff0cPycharm \u91cc\u9762\u7684 PEP8 \u63d2\u4ef6\u5b9e\u9645\u4e0a\u5e76\u4e0d\u80fd\u53d1\u73b0\u5f88\u591a\u4ee3\u7801\u95ee\u9898\uff0c\u8fd9\u4e9b\u95ee\u9898\u5e76\u4e0d\u4f1a\u5728\u8fd0\u884c\u65f6\u62a5\u9519\uff0c\u56e0\u4e3a\u4ece Python \u8bed\u8a00\u89d2\u5ea6\u5e76\u4e0d\u5173\u5fc3\u8fd9\u4e9b\u95ee\u9898\uff0c\u5728 Pycharm \u7f16\u8f91\u5668\u91cc\u9762\u4f7f\u7528\u5feb\u6377\u952e ctrl + alt + L\uff0c\u6709\u4e00\u70b9\u70b9\u683c\u5f0f\u5316\u7684\u6548\u679c\uff0c\u80fd\u89e3\u51b3\u4e00\u4e9b\u7a7a\u683c\u3001\u6362\u884c\u7b49\u5c0f\u95ee\u9898\u3002 \u8fd9\u91cc\u63a8\u8350\u4e00\u4e2a Python \u793e\u533a\u6d41\u884c\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff1a Black\uff0c\u53f7\u79f0\u4e0d\u59a5\u534f\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff0c\u5b83\u68c0\u6d4b\u5230\u4e0d\u7b26\u5408\u89c4\u8303\u7684\u4ee3\u7801\u98ce\u683c\u76f4\u63a5\u5c31\u5e2e\u4f60\u5168\u90e8\u683c\u5f0f\u5316\u597d\uff0c\u5c31\u662f\u8fd9\u4e48\u521a\uff01 \u5b89\u88c5\uff1a sudo pip3 install black \n \u4f7f\u7528\u65b9\u6cd5\uff1a black ${CheckPath}\n \u4f7f\u7528\u8fd9\u4e2a\u5de5\u5177\u683c\u5f0f\u5316\u4e4b\u540e\uff0c\u4ee3\u7801\u4f1a\u88ab\u81ea\u52a8\u8c03\u6574\uff0c\u521a\u5f00\u59cb\u4f60\u53ef\u80fd\u4f1a\u89c9\u5f97\u8c03\u6574\u5f97\u5f88\u5938\u5f20\uff0c\u6ca1\u5173\u7cfb\u575a\u6301\u770b\uff0c\u4e60\u60ef\u4e4b\u540e\uff0c\u4f60\u4f1a\u89c9\u5f97\u5f88\u4f18\u96c5\uff0c\u6ca1\u9519\uff0c\u8fd9\u5c31\u662f Pythonic Code \u7684\u6838\u5fc3\uff0c\u8bf7\u4fdd\u6301\u4f18\u96c5\uff5e\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_8","title":"2. \u4ee3\u7801\u626b\u63cf\u5de5\u5177","text":"\u4f7f\u7528\u6839\u76ee\u5f55\u4e0b pylint.sh \u626b\u63cf\u4ee3\u7801\uff0c\u5728 report \u76ee\u5f55\u4e0b\u67e5\u770b\u4ee3\u7801\u626b\u63cf\u62a5\u544a\uff0c\u5982\u679c\u6709\u4ee3\u7801\u95ee\u9898\u8bf7\u63d0\u524d\u89e3\u51b3\u4e4b\u540e\u518d\u63d0\u4ea4\u3002 \u6b64\u811a\u672c\u5df2\u7ecf\u4f7f\u7528 Python \u793e\u533a\u6700\u6d41\u884c\u7684\u4ee3\u7801\u626b\u63cf\u5de5\u5177 Pylint \u8fdb\u884c\u4ee3\u7801\u626b\u63cf\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a bash pylint.sh\n \u8fd0\u884c\u4e4b\u540e\u4f1a\u63d0\u793a\u4f60\u8981\u626b\u63cf\u7684\u76ee\u5f55\uff0c\u6bd4\u5982\u8f93\u5165 apps \uff0c\u5219\u4f1a\u626b\u63cf apps \u4e0b\u7684\u6240\u6709 Python \u4ee3\u7801\u3002 \u5728 setting/pylintrc.cfg \u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u76f8\u5173\u914d\u7f6e\uff0c\u626b\u63cf\u5b8c\u6210\u4e4b\u540e\u5728 report/pylints \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u626b\u63cf\u62a5\u544a\u3002 \u4ee3\u7801\u63d0\u4ea4\u9700\u901a\u8fc7 git review \u63d0\u4ea4\u5230 gerrit \uff0c\u4eba\u5de5 Code Review \u901a\u8fc7\u4e4b\u540e\u5408\u5165\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_11","title":"\u5341\u4e09\u3001\u63d0\u4ea4\u4ee3\u7801","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_9","title":"1. \u5b89\u88c5\u4f9d\u8d56","text":"sudo apt install git-review\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_9","title":"2. \u63d0\u4ea4\u6a21\u677f","text":"\u5728 ~ \u76ee\u5f55\u4e0b\u65b0\u5efa\u6587\u4ef6\uff0c\u5e76\u547d\u540d\u4e3a gitcommit_template \u5c06\u4ee5\u4e0b\u5185\u5bb9\u5199\u5165\u6587\u4ef6\u5f53\u4e2d\uff1a # commit type :fix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style(\u98ce\u683c\u4fee\u6539)\u3001refactor(\u91cd\u6784)\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test(\u6d4b\u8bd5) + \u7b80\u5355\u63cf\u8ff0. \u9ed8\u8ba4fix,\u6839\u636e\u60c5\u51b5\u4fee\u6539\nfix: \n\n# \u8be6\u7ec6\u8bf4\u660e\u4ee3\u7801\u7684\u6539\u52a8\uff0c\u5305\u542b\u4ee3\u7801\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u4ee5\u53ca\u4e3a\u4ec0\u4e48\u8fd9\u4e48\u505a\uff0c\u53ef\u80fd\u4f1a\u5f71\u54cd\u54ea\u4e9b\u529f\u80fd\u3002\u5bf9\u4e8e\u4ee3\u7801\u7684\u5ba1\u6838\u8005\uff0c\u9700\u8981\u4ece\u8fd9\u6bb5\u63cf\u8ff0\u4e2d\u80fd\u5b8c\u5168\u7406\u89e3\u4ee3\u7801\u4e2d\u6240\u6709\u6539\u52a8\u7684\u5185\u5bb9\nDescription: \n\n# \u5199\u4e00\u6bb5\u9762\u5411\u4e8e\u4ea7\u54c1\u7684\u603b\u7ed3\u6027\u5185\u5bb9\uff0c\u7528\u4e8e\u81ea\u52a8\u751f\u6210crp\u4e0a\u7684changlog\uff0c\u9700\u8981\u6ce8\u610f\u7684\u4e8b\uff0c\u8fd9\u6bb5\u63cf\u8ff0\u5fc5\u987b\u4ece\u4ea7\u54c1\u7684\u89d2\u5ea6\u8003\u8651\u3002\nLog: \n\n# \u5173\u8054pms\u4e0a\u7684bug\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94bug\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4fee\u590dbug\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Bug: \n\n# \u4fee\u590d github issue \n#Issue: \n\n# \u5173\u8054pms\u4e0a\u7684\u4efb\u52a1\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94\u4efb\u52a1\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4efb\u52a1\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Task: \n \u547d\u4ee4\u884c\u6267\u884c: git config --global commit.template ~/gitcommit_template\n \u6b64\u547d\u4ee4\u5c06\u6a21\u677f\u52a0\u5165\u5230 git \u7684\u63d0\u4ea4\u6a21\u677f\u4e2d\u3002 \u540e\u7eed\u63d0\u4ea4\u7684\u65f6\u5019\u9700\u8981\u5173\u6ce8\u4e00\u4e0b\u51e0\u70b9\uff1a commit type \u5bf9\u5e94\u4e0d\u540c\u7684\u4fee\u6539\u7c7b\u578b\uff1afix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style \uff08\u98ce\u683c\u4fee\u6539\uff09\u3001refactor \uff08\u91cd\u6784\uff09\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test \uff08\u6d4b\u8bd5\uff09 commit type \u5192\u53f7\u540e\u9762\u52a0\u7a7a\u683c\u3002 Description \u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u9700\u8981\u8fdb\u884c\u8be6\u7ec6\u8bf4\u660e\uff0c\u6bd4\u5982\u5bf9\u529f\u80fd\u8fdb\u884c\u5927\u6539\u7b49\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_6","title":"3. \u63a8\u9001\u4ee3\u7801","text":"\u9996\u5148\u6dfb\u52a0 commit \u4fe1\u606f git add \u540e\u9762\u52a0\u6587\u4ef6\u540d\u79f0\n git add . # \u8868\u793a\u6dfb\u52a0\u6240\u6709\u6587\u4ef6\n \u4f7f\u7528\u8fd9\u6761\u547d\u4ee4\u6ce8\u610f\u6709\u4e9b\u4e34\u65f6\u6587\u4ef6\u4e0d\u8981\u63d0\u4ea4\u5230\u4ed3\u5e93\u4e86\u3002 git commit -a\n \u4e4b\u540e\u5728 fix: \u540e\u9762\uff08\u6ce8\u610f\u5192\u53f7\u540e\u9762\u5fc5\u987b\u52a0\u7a7a\u683c\uff0c\u4e0d\u7136\u76f4\u63a5-1\uff09\u5199\u672c\u5730\u63d0\u4ea4\u7684 commit \u4fe1\u606f\uff0c\u7136\u540e\u5c31\u53ef\u4ee5\u63d0\u4ea4\u4ee3\u7801\u4e86 git review branch(\u5f53\u524d\u5206\u652f) -r origin\n \u6700\u597d\u4e00\u6b21 commit\uff0c\u4e00\u6b21 git review \uff0c\u7ecf\u5e38\u6709\u540c\u5b66\u5728\u672c\u5730\u75af\u72c2 commit \u6700\u540e git review \u62a5\u9519\u4e0d\u77e5\u9053\u548b\u56de\u4e8b\u513f\u3002 \u82e5\u4e0d\u60f3\u6bcf\u6b21\u63d0\u4ea4\u90fd\u52a0\u4e0a -r \u9009\u9879\uff0c\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a git config --global gitreview.remote origin \u63d0\u4ea4\u4ee3\u7801\uff0c\u76f4\u63a5\u4f7f\u7528 git review branch<\u76ee\u6807\u5206\u652f>\uff0c\u4f8b\u5982 git review master"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git","title":"4. Git\u6807\u7b7e","text":"Git \u6807\u7b7e\u5b9e\u9645\u4e0a\u662f commit \u7684\u4e00\u4e2a\u522b\u540d\uff0c\u4e3b\u8981\u7528\u4e8e\u7ba1\u7406\u5386\u53f2\u7248\u672c\u3002 \u60f3\u8c61\u4e00\u4e0b\u9886\u5bfc\u8ba9\u4f60\u628a\u4e4b\u524d\u7684\u67d0\u4e2a\u7248\u672c\u7684\u4ee3\u7801\u62c9\u51fa\u6765\u8dd1\uff0c\u4f60\u662f\u4e0d\u662f\u4e56\u4e56\u7684\u53bb\u628a\u6240\u6709\u63d0\u4ea4\u8bb0\u5f55\u62c9\u51fa\u6765\u627e\uff0c\u7136\u540e\u627e\u5230\u90a3\u4e2a\u54c8\u5e0c\u503c\uff0c\u901a\u8fc7\u54c8\u5e0c\u503c\u6765\u68c0\u51fa\u4ee3\u7801\u3002 \u8fd9\u4e00\u5957\u64cd\u4f5c\u4e0b\u6765\u662f\u4e0d\u662f\u5f88\u9ebb\u70e6\uff0c\u8d39\u65f6\u95f4\u8fd8\u4e0d\u4e00\u5b9a\u80fd\u627e\u5f97\u5230\uff0c\u6ca1\u4eba\u80fd\u8bb0\u4f4f\u6bcf\u4e2a\u63d0\u4ea4\u54c8\u5e0c\u503c\u4ee5\u53ca\u8fd9\u6b21\u63d0\u4ea4\u90fd\u6539\u4e86\u54ea\u4e9b\u4ee3\u7801\u3002 \u56e0\u6b64\u7ed9\u63d0\u4ea4\u6253\u4e2a\u6807\u7b7e\uff0c\u5c31\u662f\u628a\u54c8\u5e0c\u503c\u8f6c\u6362\u6210\u4eba\u7c7b\u80fd\u7406\u89e3\u7684\u8bed\u8a00\uff0c\u6bd4\u5982 v1.0\uff0c\u5c31\u53ef\u4ee5\u76f4\u63a5\u901a\u8fc7\u6807\u7b7e\u627e\u5230\u5bf9\u5e94\u7684\u63d0\u4ea4\u3002 \u65b0\u5efa\u6807\u7b7e git tag -a <tagname>\n \u56de\u8f66\u4e4b\u540e\uff0cGit \u4f1a\u6253\u5f00\u4f60\u7684\u7f16\u8f91\u5668\uff0c\u8ba9\u4f60\u5199\u4e00\u53e5\u6807\u7b7e\u6ce8\u89e3\uff0c\u5c31\u50cf\u4f60\u7ed9\u63d0\u4ea4\u5199\u6ce8\u89e3\u4e00\u6837\u3002 \u67e5\u770b\u6240\u6709\u6807\u7b7e git tag -l\n# git tag \u4e5f\u884c\n \u5220\u9664\u6807\u7b7e git tag -d <tagname>\n \u63a8\u9001\u6807\u7b7e\u81f3\u8fdc\u7a0b git push \u547d\u4ee4\u5e76\u4e0d\u4f1a\u4f20\u9001\u6807\u7b7e\u5230\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\uff0c\u5fc5\u987b\u663e\u5f0f\u5730\u63a8\u9001\u6807\u7b7e\u3002 git push origin <tagname>\n \u63a8\u9001\u6240\u6709\u4e0d\u5728\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\u7684\u6807\u7b7e git push origin --tag\n \u5220\u9664\u8fdc\u7a0b\u6807\u7b7e git push origin :refs/tag/<tagname>\n \u540e\u671f\u6253\u6807\u7b7e \u5148\u7528 git log --pretty=oneline \u67e5\u8be2\u63d0\u4ea4\u8bb0\u5f55\uff0c\u83b7\u53d6\u6821\u9a8c\u7801\u3002 git tag -a <tagname> 9fceb02(\u6821\u9a8c\u7801)\n \u68c0\u51fa\u6807\u7b7e git checkout <tagname>\n \u6b64\u65f6\uff0c\u4ed3\u5e93\u4f1a\u5904\u4e8e\u201c\u5206\u79bb\u5934\u6307\u9488\uff08detached HEAD\uff09\u201d\u7684\u72b6\u6001\u3002 \u5728\u201c\u5206\u79bb\u5934\u6307\u9488\u201d\u72b6\u6001\u4e0b\uff0c\u5982\u679c\u4f60\u505a\u4e86\u67d0\u4e9b\u66f4\u6539\u7136\u540e\u63d0\u4ea4\u5b83\u4eec\uff0c\u6807\u7b7e\u4e0d\u4f1a\u53d1\u751f\u53d8\u5316\uff0c \u4f46\u4f60\u7684\u65b0\u63d0\u4ea4\u5c06\u4e0d\u5c5e\u4e8e\u4efb\u4f55\u5206\u652f\uff0c\u5e76\u4e14\u5c06\u65e0\u6cd5\u8bbf\u95ee\uff0c\u9664\u975e\u901a\u8fc7\u786e\u5207\u7684\u63d0\u4ea4\u54c8\u5e0c\u624d\u80fd\u8bbf\u95ee\u3002 \u56e0\u6b64\uff0c\u5982\u679c\u4f60\u9700\u8981\u8fdb\u884c\u66f4\u6539\uff0c\u6bd4\u5982\u4f60\u8981\u4fee\u590d\u65e7\u7248\u672c\u4e2d\u7684\u9519\u8bef\uff0c\u90a3\u4e48\u901a\u5e38\u9700\u8981\u521b\u5efa\u4e00\u4e2a\u65b0\u5206\u652f\uff1a git checkout -b <NewBranchName> <tagname>\n \u65b0\u5206\u652f\u4e0a\u53ef\u4ee5\u8fdb\u884c\u63d0\u4ea4\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_12","title":"\u5341\u56db\u3001\u5e38\u89c1\u95ee\u9898","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_10","title":"1. \u63d0\u4ea4\u4ee3\u7801\u65f6\u63d0\u793a\u90ae\u7bb1\u6216\u8005\u540d\u79f0\u4e0d\u5bf9","text":"\u91cd\u65b0\u914d\u7f6e\u90ae\u7bb1\u6216\u8005\u540d\u79f0\uff0c\u7136\u540e\u91cd\u7f6e\u751f\u6548\uff1a git commit --amend --reset-author\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_10","title":"2. \u600e\u4e48\u56de\u6eda\u5230\u4e4b\u524d\u7684\u7248\u672c","text":"(1)\u67e5\u8be2\u5386\u53f2\u63d0\u4ea4\u8bb0\u5f55 git log\n \u627e\u5230\u4f60\u8981\u56de\u6eda\u7684\u7248\u672c\uff0c\u590d\u5236 hash \u503c\u3002 \u6ce8\u610f\uff1a\u662f commit \u7a7a\u683c\u4e4b\u540e\u7684 hash \u503c\uff0c\u4e4b\u524d\u6709\u540c\u5b66\u590d\u5236\u7684 Change-Id: \u8fd9\u6837\u80af\u5b9a\u62a5\u9519\u3002 (2)\u56de\u6eda\u7248\u672c\uff0c\u4e0d\u6e05\u9664\u4ee3\u7801 git reset --soft ${hash}\n (3)\u56de\u6eda\u7248\u672c\uff0c\u6e05\u9664\u4ee3\u7801\uff0c\u614e\u7528\u54c8 git reset --hard ${hash}\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-f-s-e","title":"3. \u6d4b\u8bd5\u62a5\u544a\u91cc\u9762 F S . E \u662f\u4ec0\u4e48\u610f\u601d","text":"F \u8868\u793a\u5931\u8d25\uff0c. \uff08\u70b9\uff09\u8868\u793a\u901a\u8fc7\uff0cS \u8868\u793a\u8df3\u8fc7\uff0cE \u8868\u793a error \u6709\u62a5\u9519"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git-status","title":"4. \u89e3\u51b3 git status \u4e2d\u6587\u663e\u793a\u7684\u95ee\u9898","text":"git config --global core.quotePath false\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5-apps","title":"5. apps \u76ee\u5f55\u4e0b\u989c\u8272\u6709\u4e9b\u662f\u9ec4\u8272\u7684","text":"\u5728 Pycharm \u4e2d apps \u76ee\u5f55\u4e0b\u5e94\u7528\u5e93\u6587\u4ef6\u662f\u9ec4\u8272\u7684\uff0c\u7f16\u8f91\u5668\u8bc6\u522b\u4e0d\u5230\u4ee3\u7801\u65b0\u589e\u548c\u4fee\u6539\uff1b \u7531\u4e8e\u793e\u533a\u7248 Pycharm \u4e0d\u80fd\u52a8\u6001\u8bc6\u522b\u591a\u4ed3\u5e93\uff0c\u9700\u8981\u5728 setting \u91cc\u9762\u624b\u52a8\u6ce8\u518c\uff0c\u64cd\u4f5c\u6b65\u9aa4\uff1a File \u2014> Settings \u2014> Version Control \u2014> \u70b9 + \u53f7 \u2014> Directory \u9009\u4e2d\u5e94\u7528\u5e93\u5de5\u7a0b\u76ee\u5f55 \u2014> VCS \u9009\u4e2d Git \u2014> Apply \u5982\u6b64\u5c31\u53ef\u4ee5\u4e86\u3002 \u4e13\u4e1a\u7248 Pycharm \u4e0d\u5b58\u5728\u8fd9\u4e2a\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#6-envsh-r","title":"6. \u6267\u884c env.sh \u62a5\u9519 $'\\r':\u672a\u627e\u5230\u547d\u4ee4","text":"\u51fa\u73b0\u8fd9\u4e2a\u95ee\u9898\u4f60\u5e94\u8be5\u662f\u5728 windows \u4e0a\u6253\u5f00\u6216\u7f16\u8f91\u8fc7 env.sh \u811a\u672c\uff0cwindows\u4e0b\u7684\u6362\u884c\u662f\u56de\u8f66\u7b26+\u6362\u884c\u7b26\uff0c\u4e5f\u5c31\u662f\\r\\n\uff0c\u800c Linxu \u4e0b\u662f\u6362\u884c\u7b26 \\n\uff0cLinux \u4e0b\u4e0d\u8bc6\u522b \\r\uff0c\u56e0\u6b64\u62a5\u9519\u3002 \u89e3\u51b3\u65b9\u6848\uff1a # \u5c06 \\r \u66ff\u6362\u4e3a\u7a7a\nsudo sed -i 's/\\r//' env.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#7","title":"7.\u600e\u6837\u4e3a\u5355\u72ec\u67d0\u4e00\u6761\u7528\u4f8b\u914d\u7f6e\u6267\u884c\u8d85\u65f6\u65f6\u95f4","text":"\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u5982\u4e0b\uff1a @pytest.mark.timeout(300) # \u5355\u4f4d\u79d2\ndef test_xxx_001():\npass\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#8-youqu","title":"8. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u6240\u6709\u4ee3\u7801\uff0c\u5305\u542b\u5b50\u4ed3\u5e93","text":"\u524d\u7f6e\u6761\u4ef6\uff1a\u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 # \u7b2c\u4e00\u6b21\u5b58\u50a8\u5bc6\u7801\uff0c\u63d0\u4f9b\u540e\u9762\u62c9\u4ee3\u7801(gerrit: ldap\u8d26\u53f7\u548c\u5bc6\u7801\uff0cgit\u62c9\u53d6\u7b2c\u4e00\u6b21\u8f93\u5165\u4fdd\u5b58\uff0c\u540e\u9762\u76f4\u63a5\u4f7f\u7528)\ngit config --global credential.helper store\n\n# \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\uff0c\u5e76\u9012\u5f52\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\" --recursive\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#9-youqu","title":"9. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\u6307\u5b9a\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u524d\u7f6e\u6761\u4ef6\uff1a \u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 \u5df2\u5b58\u50a8\u8bbf\u95ee\u5bc6\u7801 # \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\"\n# \u6307\u5b9a\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ncd youqu\ngit submodule update --init apps/autotest_xxx_xxx\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#10-youqu","title":"10. \u5982\u4f55\u66f4\u65b0 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\uff0c\u6240\u6709\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u66f4\u65b0\u6240\u6709\u5b50\u4ed3\u5e93\u4ee3\u7801 cd youqu\ngit pull & git submodule foreach git pull\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#11-youqu-master-detached-head","title":"11. \u5982\u4f55\u4fee\u590d YouQu \u6240\u6709\u5b50\u4ed3\u5e93 master \u5206\u652f\u6e38\u79bb\u5934\uff08detached head\uff09","text":"\u4fee\u590d\u6240\u6709\u5b50\u4ed3\u5e93\u9ed8\u8ba4master \u5206\u652f\u6e38\u79bb\u5934 cd youqu\ngit submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/","title":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212 \u5206\u7c7b\uff1a/ \u67b6\u6784\u5e08\uff1a/ \u76ee\u6807\uff1a \u5e94\u7528 AT \u67b6\u6784\u5de5\u7a0b\u5316\uff0c\u53c2\u8003\u6027\u80fd\u81ea\u52a8\u5316\u5de5\u7a0b\u5b8c\u6210\u5de5\u7a0b\u5316\u6539\u9020\u3002 \u5e94\u7528\u95f4\u7528\u4f8b\u89e3\u8026\uff0c\u89e3\u9664\u6240\u6709\u4ea4\u53c9\u8c03\u7528\u7684\u65b9\u6cd5\uff0c\u5404\u5e94\u7528\u80fd\u8ddf\u968f\u81ea\u8eab\u8fed\u4ee3\u5468\u671f\u72ec\u7acb\u7ef4\u62a4 AT \u7528\u4f8b\u3002 \u5b8c\u6210\u516c\u5171\u65b9\u6cd5\u7684\u62bd\u53d6\u6574\u5408\uff0c\u5f62\u6210\u4e00\u5957\u72ec\u7acb\u4e8e\u5e94\u7528\u95f4\u7684\u516c\u5171\u65b9\u6cd5\u5e93\uff0c\u5404\u5e94\u7528\u65b9\u6cd5\u91cc\u9762\u4e0d\u5b58\u5728\u88ab\u591a\u4e2a\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\u3002 \u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u4e3a\u5c06\u6765\u9002\u914d\u66f4\u591a\u7684 AT \u8fd0\u7528\u573a\u666f\u63d0\u4f9b\u652f\u6491\uff0c\u539f\u5219\u4e0a\u53ef\u5b9e\u73b0\u65e0\u9650\u6269\u5c55\uff0c\u5728\u6bcf\u65e5\u6784\u5efa\u548c\u6301\u7eed\u96c6\u6210\u6d41\u7a0b\u843d\u5730\u4f7f\u7528\u3002 \u4ee3\u7801\u89c4\u8303\u95ee\u9898\u6e05\u96f6\uff0c\u7b26\u5408 Shell Check\u3001Pylint\u3001\u7cfb\u7edf\u90e8\u76f8\u5173\u7f16\u7801\u89c4\u8303\u8981\u6c42\u3002 \u610f\u4e49\uff1a \u7edf\u4e00\u6210\u7814 AT \u67b6\u6784\u8bbe\u8ba1\u601d\u8def\uff0c\u6d88\u9664 AT \u4ee3\u7801\u5b9e\u73b0\u548c\u7ef4\u62a4\u4e0a\u53ef\u80fd\u51fa\u73b0\u7684\u5206\u6b67\uff0c\u6539\u5584\u5386\u53f2 AT \u65e0\u5de5\u7a0b\u5316\u8bbe\u8ba1\u7684\u7f3a\u9677\uff0c\u63d0\u9ad8\u67b6\u6784\u4e13\u4e1a\u6027\u3002 \u5404\u5e94\u7528 AT \u4ee3\u7801\u76f8\u4e92\u72ec\u7acb\uff0c\u5951\u5408\u5e94\u7528\u72ec\u7acb\u53d1\u5e03\u7279\u6027\uff0c\u53ef\u652f\u6301\u8fed\u4ee3\u671f\u95f4\u72ec\u7acb\u65b0\u589e\u3001\u7ef4\u62a4\u548c\u6267\u884c\u3002 \u65b9\u6cd5\u8c03\u7528\u903b\u8f91\u5f97\u5230\u7b80\u5316\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u66f4\u9ad8\u6548\uff1b\u516c\u5171\u5e93\u62bd\u53d6\uff0c\u51cf\u5c11\u65b9\u6cd5\u91cd\u590d\u7f16\u5199\uff0c\u63d0\u9ad8\u4ee3\u7801\u5229\u7528\u7387\uff1b\u5e73\u5747\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u4ece40\u5206\u949f\u964d\u4f4e\u81f330\u5206\u949f\uff0c\u65e5\u4ea7\u51fa\u7528\u4f8b\u4ece12\u6761/\u5929\u63d0\u5347\u81f316\u6761/\u5929\u3002 \u53ef\u7075\u6d3b\u652f\u6491\u4e0d\u540c\u7684\u81ea\u52a8\u5316\u8fd0\u7528\u573a\u666f\uff0c\u5982 CI\u3001\u5192\u70df\u6d4b\u8bd5\u3001\u96c6\u6210\u6d4b\u8bd5\u3001\u56de\u5f52\u6d4b\u8bd5\u3001\u4e13\u9879\u6d4b\u8bd5\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_2","title":"\u4e00\u3001\u80cc\u666f\u4ecb\u7ecd","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1","title":"1\u3001\u73b0\u6709\u67b6\u6784\u4ecb\u7ecd","text":"\u73b0\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u6574\u4f53\u5206\u4e3a\u4e09\u5c42\uff1a\u7528\u4f8b\u5c42\uff08\u4e1a\u52a1\u903b\u8f91\u5c42\uff09\u3001\u4e2d\u95f4\u5c42\uff08\u5143\u7d20\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff09\u3001\u6838\u5fc3\u5c42\uff08\u5e95\u5c42\u529f\u80fd\u5e93\u5c42\uff09\u3002 \u7528\u4f8b\u5c42\uff1a\u5373\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4e13\u6ce8\u4e8e\u4e1a\u52a1\u529f\u80fd\u903b\u8f91\uff0c\u4e0d\u5173\u5fc3\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\uff1b \u4e2d\u95f4\u5c42\uff1a\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff0c\u6bcf\u4e2a\u65b9\u6cd5\u5747\u5bf9\u5e94\u4e00\u4e2a\u5143\u7d20\u7684\u4e00\u4e2a\u5177\u4f53\u64cd\u4f5c\uff0c\u4e5f\u53ef\u4ee5\u662f\u591a\u4e2a\u64cd\u4f5c\u7684\u7ec4\u5408\u64cd\u4f5c\uff0c\u4e2d\u95f4\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u7528\u4f8b\u5c42\uff0c\u5177\u6709\u53ef\u6269\u5c55\u6027\u548c\u590d\u7528\u6027\uff1b \u6838\u5fc3\u5c42\uff1a\u4e3b\u8981\u5c01\u88c5\u7684\u5e95\u5c42\u529f\u80fd\u5b9e\u73b0\uff0c\u6b64\u5c42\u5728\u6846\u67b6\u4e2d\u63d0\u4f9b\u4e00\u4e9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u529f\u80fd\u6a21\u5757\u76f8\u5bf9\u72ec\u7acb\uff0c\u6838\u5fc3\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u64cd\u4f5c\u5c42\uff0c\u6bd4\u5982\uff1a\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7 UI \u5750\u6807\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u952e\u9f20\u64cd\u4f5c\u7684\u57fa\u7840\u65b9\u64cd\u4f5c\u6a21\u5757\u3001Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757\u3001\u6587\u4ef6\u7684\u589e\u5220\u6539\u67e5\u64cd\u4f5c\u6a21\u5757\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2","title":"2\u3001\u81ea\u52a8\u5316\u7684\u5e94\u7528","text":"2.1\u3001CI \u6d41\u7a0b \u6bcf\u65e5\u6784\u5efa\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u7814\u53d1\u6bcf\u65e5\u63d0\u4ea4\u7684\u4ee3\u7801\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u73ed\u4e4b\u540e\u4f1a\u5c06\u5404\u5e94\u7528\u8fdb\u884c\u6253\u5305\uff0c\u7136\u540e\u5728\u6d4b\u8bd5\u673a\u4e0a\u5b89\u88c5\u66f4\u65b0 deb \u5305\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u5e94\u7528\u63d0\u4ea4\u96c6\u6210\u7684\u7248\u672c\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u8f7d\u6700\u65b0\u7684 ISO \u8fdb\u884c PXE \u90e8\u7f72\uff0c\u7136\u540e\u6d4b\u8bd5\u673a\u5b89\u88c5\u6700\u65b0\u7684\u955c\u50cf\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 2.2\u3001\u9a8c\u6536\u6d4b\u8bd5 \u5728\u5404\u9a8c\u6536\u8282\u70b9\u8fdb\u884c\u81ea\u52a8\u5316\u9a8c\u6536\uff0c\u76ee\u524d\u7684\u7b56\u7565\u662f\u5168\u7528\u4f8b\u8986\u76d6\u5168\u67b6\u6784\u3002 2.3\u3001\u56de\u5f52\u6d4b\u8bd5 \u56de\u5f52\u6d4b\u8bd5\u4eca\u5e74\u89c4\u5212\u5efa\u8bbe\u4e2d\uff0c\u65e8\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u6267\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\uff0c\u51cf\u5c11\u529f\u80fd\u6d4b\u8bd5\u7684\u91cd\u590d\u52b3\u52a8\u529b\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3","title":"3\u3001\u5b58\u5728\u7684\u95ee\u9898","text":" \u5404\u5e94\u7528\u4e4b\u95f4\u5b58\u5728\u8026\u5408 \u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u521d\u671f\uff0c\u6240\u6709\u5e94\u7528\u662f\u6574\u4f53\u53d1\u5e03\uff0c\u6211\u4eec\u662f\u5c06\u6240\u6709\u5e94\u7528\u770b\u6210\u662f\u4e00\u4e2a\u6574\u4f53\uff0c\u5404\u5e94\u7528\u4f5c\u4e3a\u5176\u4e2d\u7684\u4e00\u4e2a\u6a21\u5757\uff0c\u6240\u4ee5\u5b58\u5728\u5e94\u7528\u95f4\u65b9\u6cd5\u4ea4\u53c9\u8c03\u7528\u7684\u95ee\u9898\uff0c\u8fd9\u6837\u4ece\u6700\u521d\u7684\u8bbe\u8ba1\u6765\u8bb2\u786e\u5b9e\u80fd\u591f\u51cf\u5c11\u91cd\u590d\u4ee3\u7801\u7684\u7f16\u5199\u3002\u4f46\u662f\u73b0\u5728\u5e94\u7528\u8d70\u72ec\u7acb\u53d1\u5e03\uff0c\u5404\u5e94\u7528\u90fd\u6709\u81ea\u5df1\u7684\u8fed\u4ee3\u8282\u594f\uff0c\u5728\u65b0\u9700\u6c42\u5feb\u901f\u53d8\u5316\u7684\u8fc7\u7a0b\u4e2d\uff0c\u81ea\u52a8\u5316\u7ef4\u62a4\u53d8\u5f97\u5f02\u5e38\u56f0\u96be\uff0c\u539f\u56e0\u5c31\u662f\u81ea\u52a8\u5316\u9879\u76ee\u91cc\u9762\u5404\u4e2a\u5e94\u7528\u7684\u6709\u6bd4\u8f83\u591a\u7684\u8026\u5408\u5173\u7cfb\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u8fdb\u884c\u89e3\u8026\uff0c\u4ee5\u9002\u5e94\u5e94\u7528\u4e0d\u540c\u7684\u8fed\u4ee3\u5468\u671f\u3002 \u65e0\u6cd5\u7cbe\u51c6\u7684\u5212\u5206\u7528\u4f8b\u8303\u56f4 \u7528\u4f8b\u6267\u884c\u7684\u8303\u56f4\u4e0d\u591f\u7cbe\u51c6\uff0c\u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u4e3b\u8981\u901a\u8fc7\u7528\u4f8b\u7684\u5173\u952e\u8bcd core\uff08\u6838\u5fc3\uff09\u6765\u533a\u5206\u7528\u4f8b\u662f\u5426\u4e3a\u6838\u5fc3\u7528\u4f8b\uff0c\u4f46\u662f\u8fd9\u6837\u7684\u533a\u5206\u592a\u5bbd\u6cdb\u4e86\uff0c\u4e0d\u80fd\u9002\u5e94\u81ea\u52a8\u5316\u6d4b\u8bd5\u5728\u591a\u573a\u666f\u4e0b\u7684\u5e94\u7528\u3002\u5f88\u591a\u573a\u666f\u4e0b\u6211\u4eec\u8fd8\u9700\u8981\u6839\u636e\u7528\u4f8b\u7684\u7b49\u7ea7\u3001\u7528\u4f8b\u7684\u7c7b\u578b\u3001\u7528\u4f8b\u6765\u6e90\u7b49\u7b49\uff0c\u4e0d\u540c\u7684\u7ef4\u5ea6\u6765\u6311\u9009\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u5173\u952e\u5b57\u9700\u8981\u4eba\u5de5\u4e00\u6761\u6761\u7684\u6539\uff0c\u8d39\u65f6\u8d39\u529b\uff0c\u800c\u4e14\u4e0d\u597d\u7ef4\u62a4\u3002 \u53d7\u65b0\u9700\u6c42\u5f71\u54cd\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u597d\u7ef4\u62a4 \u76ee\u524d\u9700\u8981\u8df3\u8fc7\u7684\u7528\u4f8b\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684\u7528\u4f8b\u811a\u672c\u91cc\u9762\uff0c\u6dfb\u52a0\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\uff0c\u540e\u7eed\u89e3\u9664\u8df3\u8fc7\u7684\u65f6\u5019\u53c8\u9700\u8981\u627e\u5230\u8fd9\u6761\u811a\u672c\uff0c\u5220\u6389\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\u3002\u5728\u8df3\u8fc7\u7528\u4f8b\u8f83\u591a\u7684\u60c5\u51b5\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u96be\u5ea6\u3002 \u7f16\u5199\u7528\u4f8b\u65f6\u903b\u8f91\u6bd4\u8f83\u590d\u6742\uff0c\u9700\u8981\u8c03\u7528\u591a\u4e2a\u5e94\u7528\u7684\u65b9\u6cd5\u6a21\u5757\u3002 \u6846\u67b6\u6269\u5c55\u6027\u4e0d\u8db3\uff0c\u65e0\u6cd5\u6574\u5408\u6027\u80fd\u81ea\u52a8\u5316\u3001\u538b\u6d4b\u81ea\u52a8\u5316\u3001\u5b89\u5168\u81ea\u52a8\u5316\u7b49\u4e13\u9879\u6d4b\u8bd5\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_3","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u4e3a\u89e3\u51b3\u73b0\u6709\u95ee\u9898\uff0c\u9002\u5e94\u4e0d\u65ad\u4e30\u5bcc\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u66f4\u597d\u7684\u53d1\u6325\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4f5c\u7528\uff0c\u9700\u8981\u5bf9\u81ea\u52a8\u5316\u67b6\u6784\u53ca\u5404\u529f\u80fd\u6a21\u5757\u8fdb\u884c\u91cd\u65b0\u8bbe\u8ba1\u89c4\u5212\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_1","title":"1\u3001\u67b6\u6784\u8bbe\u8ba1","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_1","title":"2\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u6846\u67b6\u7684\u8fd0\u884c\u903b\u8f91\uff1a\u901a\u8fc7\u6838\u5fc3\u5c42\u63d0\u4f9b\u4e00\u4e2a\u57fa\u7840\u80fd\u529b\uff0c\u4e1a\u52a1\u5c42\u6839\u636e\u5b9e\u9645\u4e1a\u52a1\u9700\u6c42\uff08\u6d4b\u8bd5\u7528\u4f8b\uff09\u52a8\u6001\u52a0\u8f7d\u6838\u5fc3\u5c42\uff0c\u6267\u884c\u5165\u53e3\u52a0\u8f7d\u76f8\u5e94\u7684\u7528\u4f8b\u96c6\u5e76\u63a7\u5236\u6267\u884c\uff0c\u5e94\u7528\u5c42\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u9700\u6c42\uff0c\u901a\u8fc7\u76f8\u5e94\u7684\u914d\u7f6e\u9879\u8fdb\u884c\u914d\u7f6e\uff0c\u4ece\u800c\u89e6\u53d1\u81ea\u52a8\u5316\u6d4b\u8bd5\u4efb\u52a1\u3002 \u6838\u5fc3\u5c42\uff1a\u57fa\u672c\u4fdd\u6301\u4e0d\u53d8\uff0c\u90e8\u5206\u6a21\u5757\u4f1a\u6d89\u53ca\u5230\u65b0\u529f\u80fd\u5f00\u53d1\uff0c\u6838\u5fc3\u5c42\u5404\u529f\u80fd\u6a21\u5757\u4fdd\u6301\u72ec\u7acb\u6027\uff0c\u63d0\u4f9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u4f9b\u4e0a\u5c42\u8c03\u7528\uff1b \u5e95\u5c42\u6838\u5fc3\u6a21\u5757\u5305\u62ec\uff1a \u56fe\u50cf\u8bc6\u522b\u6a21\u5757 UI \u5b9a\u4f4d\u6a21\u5757 Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757 \u5c5e\u6027\u5b9a\u4f4d\u6a21\u5757 \u65e5\u5fd7\u6a21\u5757 \u952e\u9f20\u64cd\u4f5c\u6a21\u5757 \u6587\u4ef6\u64cd\u4f5c\u6a21\u5757 \u5f55\u5c4f\u6a21\u5757 \u81ea\u5b9a\u4e49\u65ad\u8a00\u6a21\u5757 \u7528\u4f8b\u6267\u884c\u6a21\u5757 PXE \u88c5\u673a\u6a21\u5757 \u952e\u9f20\u4fe1\u53f7\u6a21\u62df\u6a21\u5757 OCR \u6a21\u5757 \u4e1a\u52a1\u5c42\uff1a\u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e94\u7528\u5185\u5305\u542b\u591a\u4e2a\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5982\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7b49\uff0c\u540e\u7eed\u53ef\u4ee5\u6839\u636e\u9700\u8981\u5ac1\u63a5\u8fdb\u6765\u3002\u5176\u4e2d\u529f\u80fd\u6d4b\u8bd5\u8bbe\u8ba1\u601d\u8def\uff1a \u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e76\u5c06\u6d4b\u8bd5\u6570\u636e\u548c\u6d4b\u8bd5\u8d44\u6e90\u6574\u5408\u8fdb\u6765\uff0c\u589e\u52a0\u7528\u4f8b\u6807\u7b7e csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ed9\u6bcf\u6761\u7528\u4f8b\u6253\u6807\u7b7e\u3002 \u5404\u6807\u7b7e\u6240\u4f7f\u7528\u5bf9\u5e94\u7684\u5b57\u6bb5\u540d\u79f0\uff0c\u4f7f\u7528 csv \u6587\u4ef6\u7ef4\u62a4\u7528\u4f8b\u4e0e\u6807\u7b7e\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u5bf9\u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u53ef\u4ee5\u7ec4\u5408\u5176\u4e2d\u7684\u6807\u7b7e\u800c\u4ece\u9a71\u52a8\u5bf9\u5e94\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\uff0c\u517c\u5bb9\u73b0\u6709\u7528\u4f8b\u6807\u7b7e\uff0c\u4e14\u652f\u6301\u7528\u4f8b\u6807\u7b7e\u53ef\u6269\u5c55\uff1b \u4f7f\u7528 csv \u683c\u5f0f\u6587\u4ef6\u53ef\u4ee5\u65b9\u4fbf\u7684\u4f7f\u7528 Excel \u8868\u683c\u6253\u5f00\u8fdb\u884c\u7f16\u8f91\uff0c\u540c\u65f6\u7531\u4e8e csv \u6587\u4ef6\u5b9e\u9645\u662f\u4ee5\u90fd\u597d\u5206\u9694\u7684\u6587\u672c\u6587\u4ef6\uff0c\u4ee3\u7801\u4e2d\u53ef\u4ee5\u5728\u4e0d\u4f9d\u8d56\u4e09\u65b9\u5e93\u7684\u60c5\u51b5\u4e0b\u65b9\u4fbf\u5feb\u901f\u7684\u89e3\u6790\u5b83\uff0c\u53ef\u64cd\u4f5c\u6027\u548c\u53ef\u7ef4\u62a4\u6027\u8f83\u9ad8\u3002 \u5404\u4e2a\u5e94\u7528\u4e4b\u95f4\uff0c\u7528\u4f8b\u3001\u65b9\u6cd5\u3001\u6807\u7b7e\u548c\u8d44\u6e90\u90fd\u662f\u76f8\u4e92\u72ec\u7acb\u7684\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u7528\u4f8b\u65f6\u53ea\u9700\u8981\u81ea\u5df1\u5e94\u7528\u4e0b\u7684\u65b9\u6cd5\u548c\u516c\u5171\u5e93\u5373\u53ef\u3002 \u7ed3\u6784\u4e3e\u4f8b\uff1a .\n\u251c\u2500\u2500 apps\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_album # \u5e94\u7528\u540d (\u7528\u4e0b\u5212\u7ebf\u8fde\u63a5\u662f Python \u7f16\u7801\u89c4\u8303)\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_assert # \u65ad\u8a00\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_function_tag.csv # \u7528\u4f8b\u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 asan_cases # \u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases # \u529f\u80fd\u6d4b\u8bd5\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 res # \u6d4b\u8bd5\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config # \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_widget # \u5e94\u7528\u81ea\u5df1\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_widget # \u65b9\u6cd5\u57fa\u7c7b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 other_widget # \u8c03\u7528\u5176\u4ed6\u5e94\u7528\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_camera\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases\n\u2502\u00a0\u00a0 \u2502\u00a0 ...\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 public_widget # \u516c\u5171\u65b9\u6cd5\u5e93\n\u251c\u2500\u2500 config # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n...\n config \u914d\u7f6e\u6a21\u5757\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u76f8\u5e94\u914d\u7f6e\uff0c\u6d4b\u8bd5\u540c\u5b66\u53ef\u4ee5\u6839\u636e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5728 config \u91cc\u9762\u8fdb\u884c\u914d\u7f6e\u3002 \u5168\u5c40\u914d\u7f6e\uff1a \u6267\u884c\u4e00\u4e2a\u6216\u591a\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff1a\u5728 pattern \u91cc\u9762\u5199\u5165\u5e94\u7528\u5305\u540d\uff0c\u591a\u4e2a\u5e94\u7528\u4e4b\u95f4\u7528 or \u8fde\u63a5\uff0c\u5982 deepin-music or deepin-movie\uff1b \u5192\u70df\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a smoke\uff1b \u96c6\u6210\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a core \uff1b \u5168\u91cf\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u4e3a\u7a7a\u5373\u53ef\uff1b \u901a\u8fc7 tags \u7684\u914d\u7f6e\u6bd4\u8f83\u7075\u6d3b\uff0c\u540e\u9762\u6807\u7b7e\u5316\u7ba1\u7406\u7ae0\u8282\u4f1a\u8bb2\u5230\uff0c\u652f\u6301\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u7075\u6d3b\u914d\u7f6e\u3002 \u6307\u5b9a\u67d0\u53f0\u673a\u5668\u5728\u6307\u5b9a\u955c\u50cf\u7248\u672c\u4e0a\u6267\u884c\u7528\u4f8b\uff1a\u5728 IP \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a IP\uff0c\u5e76\u5728 URL \u91cc\u9762\u586b\u5165\u955c\u50cf\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u6846\u67b6\u4f1a\u8c03\u7528 PXE \u8fdb\u884c\u81ea\u52a8\u88c5\u673a\uff0c\u88c5\u673a\u5b8c\u4e4b\u540e\u81ea\u52a8\u5f00\u59cb\u6267\u884c\u914d\u7f6e\u7684\u6d4b\u8bd5\u7528\u4f8b\u3002 \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\uff1a \u6bcf\u4e2a\u5e94\u7528\u5185\u90e8\u4f1a\u6709\u4e00\u4e2a\u5355\u72ec\u7684\u914d\u7f6e\u6a21\u5757\uff0c\u4f1a\u5305\u542b\u4e00\u4e9b\u672c\u5e94\u7528\u7684\u6d4b\u8bd5\u8d44\u6e90\u7684\u8def\u5f84\u3001\u6267\u884c\u7528\u4f8b\u7684\u6807\u7b7e\u914d\u7f6e\u7b49\u7b49\uff0c\u5982\u679c\u5728\u5c40\u90e8\u914d\u7f6e\u91cc\u9762\u914d\u7f6e\u4e86\u7528\u4f8b\u6267\u884c\u6807\u7b7e\uff0c\u800c\u5916\u5c42 runner \u51fa\u6ca1\u6709\u6307\u5b9a\u6267\u884c\u6807\u7b7e\uff0c\u5219\u5728\u6267\u884c\u65f6\u53ea\u4f1a\u6267\u884c\u5c40\u90e8\u914d\u7f6e\u5df2\u914d\u7f6e\u7684\uff0c\u82e5\u5916\u5c42 runner \u4e5f\u914d\u7f6e\u4e86\u6267\u884c\u6807\u7b7e\uff0c\u5219\u4f1a\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u7528\u4f8b\u3002 \u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u914d\u7f6e\u90fd\u5728\u540c\u4e00\u4e2a\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\uff0cpy \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684\u7c7b\uff0cini \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684 option\u3002 \u5168\u5c40\u914d\u7f6e\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u7b56\u7565\u5982\u4e0b\uff1a \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5c40\u90e8\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5e94\u7528\u5c42\uff1arunner \u662f\u6d4b\u8bd5\u6267\u884c\u7684\u5165\u53e3\uff0c\u5b83\u4f1a\u6839\u636e\u914d\u7f6e\u91cc\u9762\u7684\u914d\u7f6e\u9879\uff0c\u8fdb\u884c\u7528\u4f8b\u7684\u52a0\u8f7d\u548c\u6267\u884c\u3002\u5b83\u63d0\u4f9b\u63a5\u53e3\u7ed9\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\uff0c\u5e73\u53f0\u4e0a\u7684\u6307\u4ee4\u5b9e\u9645\u4e0a\u90fd\u662f\u901a\u8fc7\u4e0b\u53d1\u7ed9 runner\uff0c\u7136\u540e\u7531 runner \u6765\u6267\u884c\u76f8\u5e94\u7684\u6d4b\u8bd5\u3002 \u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u662f\u4e00\u4e2a\u524d\u7aef\u7cfb\u7edf\uff0c\u53ef\u4ee5\u8fdb\u884c\u6d4b\u8bd5\u673a\u7ba1\u7406\u3001\u81ea\u52a8\u5b89\u88c5\u955c\u50cf\u3001\u81ea\u52a8\u5b89\u88c5\u6307\u5b9a\u5e94\u7528\u7248\u672c\u3001\u8fdb\u884c\u6d4b\u8bd5\u7528\u4f8b\u8303\u56f4\u9009\u62e9\u3001\u7528\u4f8b\u89e6\u53d1\u6267\u884c\u63a7\u5236\u3001\u7ed3\u679c\u5c55\u793a\u8f93\u51fa\u7b49\u3002 \u4e00\u4e2a\u5e94\u7528\u7684\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\u90fd\u53ef\u4ee5\u5355\u72ec\u89e6\u53d1\u3002 \u517c\u5bb9\u6027\u6d4b\u8bd5\u4e3b\u8981\u901a\u8fc7 PXE \u670d\u52a1\u5668\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u88c5\u673a\uff0c\u7136\u540e\u914d\u5408 AT \u8fdb\u884c\u6d4b\u8bd5\uff0c\u53ef\u4ee5\u5b9e\u73b0\u4e0d\u540c\u7cfb\u7edf\u7248\u672c\u3001\u4e0d\u540c\u5e94\u7528\u7248\u672c\u73af\u5883\u4e0a\u90fd\u53ef\u4ee5\u8fdb\u884c\u81ea\u52a8\u5316\u7684 AT \u6267\u884c\uff0c\u63d0\u9ad8\u517c\u5bb9\u6027\u6d4b\u8bd5\u6548\u7387\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_4","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_2","title":"1\u3001\u7528\u4f8b\u89e3\u8026","text":"\u5b58\u5728\u8026\u5408\u5173\u7cfb\u7684\u65b9\u6cd5\uff1a\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u88ab\u5916\u90e8\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\uff0c\u5219\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u8026\u5408\u5173\u7cfb\u3002 1.1\u3001\u901a\u8fc7\u7f16\u8f91\u5668 Find Usages \u67e5\u770b\u6bcf\u4e2a\u65b9\u6cd5\u88ab\u8c03\u7528\u7684\u8def\u5f84\u548c\u88ab\u8c03\u7528\u6b21\u6570\uff1b 1.2\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 1 \u4e2a\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728\u5916\u90e8\u5e94\u7528\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1b 1.3\u3001\u64cd\u4f5c\u5c42\u6587\u4ef6\u540d\u5747\u4ee5 widget \u7ed3\u5c3e\uff0c\u7c7b\u540d\u4ee5 Widget \u7ed3\u5c3e\uff0c\u5982\uff1a\u6587\u4ef6\u540d music_widget.py \uff1a class MusicWidget:\n\"\"\"\u97f3\u4e50\u7684\u64cd\u4f5c\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_2","title":"2\u3001\u516c\u5171\u5e93\u5efa\u8bbe","text":"2.1\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 2 \u4e2a\u53ca\u4ee5\u4e0a\u7684\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728 public_widget \u76ee\u5f55\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1bpublic_widget \u5373\u4e3a\u516c\u5171\u65b9\u6cd5\u5e93\uff1b 2.2\u3001\u5728\u7528\u4f8b\u5c42\u4fee\u6539\u7528\u4f8b\u4e2d\u7c7b\u7684\u5bfc\u5165\u8def\u5f84\uff0c\u5c5e\u4e8e\u516c\u5171\u65b9\u6cd5\u7684\u5219\u8c03\u7528 public_widget \u4e2d\u7684\u7c7b\uff0c\u5916\u90e8\u5e94\u7528\u7684\u64cd\u4f5c\u65b9\u6cd5\uff0c\u5219\u8c03\u7528\u672c\u5e94\u7528\u76ee\u5f55\u4e0b\u91cd\u5199\u7684\u5916\u90e8\u5e94\u7528\u65b9\u6cd5\u3002 \u6bd4\u5982\uff1a\u51e0\u4e4e\u6240\u6709\u591a\u5a92\u4f53\u5e94\u7528\u90fd\u9700\u8981\u901a\u8fc7\u6587\u7ba1\u52a0\u8f7d\u8d44\u6e90\uff0c\u8c03\u8d77\u7684\u6587\u7ba1\u5bf9\u8bdd\u6846\u5b9e\u9645\u4e3a dde-desktop\uff0c\u56e0\u6b64\u5c06 desktop_widget.py \u653e\u5230 public_widget \u91cc\u9762\uff1a class DdeDesktopPublicWidget:\n\"\"\"\u516c\u5171-\u684c\u9762\u7684\u64cd\u4f5c\u65b9\u6cd5\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3_1","title":"3\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406","text":"3.1\u3001\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1a\u5bf9\u5e94 core\u3001smoke\uff0c\u6216\u4e3a\u7a7a\uff1b \u7528\u4f8b\u6765\u6e90\uff1a\u5bf9\u5e94 PMS \u7528\u4f8b\u6765\u6e90\uff0c\u5206\u522b\u7528 acp1\u3001acp2\u3001acp3\u3001acp4 \u8868\u793a\u3002 acp1 \uff1a\u4e1a\u52a1\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5199\u7684\u7528\u4f8b\uff0c\u88ab\u7528\u4e8e\u9a8c\u6536\u6d4b\u8bd5\u7684\uff1b acp2 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5f15\u5165\u7684\u4ea7\u54c1\u9a8c\u6536\u6d4b\u8bc4\u90e8\u7684\u7528\u4f8b\uff1b acp3 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u6839\u636e\u4ea7\u54c1\u9700\u6c42\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\uff1b acp4 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u901a\u8fc7\u793e\u533a\u3001\u8bba\u575b\u7528\u6237\u53cd\u9988\u95ee\u9898\u603b\u7ed3\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\u3002 \u4e3e\u4f8b\uff1a \u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u7528\u4f8b\u6765\u6e90 001 L1 core acp1 \u6807\u7b7e\u91c7\u7528\u679a\u4e3e\u7684\u65b9\u5f0f\u8fdb\u884c\u4ee3\u53f7\u7ba1\u7406\u65b9\u4fbf\u7ba1\u7406\u4ee5\u53ca\u540e\u7eed\u6269\u5c55\u3002 3.2\u3001\u5728\u6bcf\u4e2a\u5e94\u7528\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u7b2c\u4e00\u5217\u4e3a\u7528\u4f8b\u7684 ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ba1\u7406\u6a21\u5757\u5185\u7684\u7528\u4f8b\u6807\u7b7e\u3002\u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 3.3\u3001\u5bf9\u7167 PMS \u4e0a\u7528\u4f8b\u7b49\u7ea7\u3001\u7528\u4f8b\u7c7b\u578b\u548c\u7528\u4f8b\u6765\u6e90\uff0c\u6807\u8bb0\u6240\u6709\u5df2\u5b9e\u73b0\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u540e\u7eed\u7f16\u5199\u65b0\u589e\u81ea\u52a8\u5316\u7528\u4f8b\u65f6\uff0c\u6bcf\u5199\u4e00\u6761\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684 csv \u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u6b64\u6761\u7528\u4f8b\u7684\u6807\u7b7e\u3002 3.4\u3001\u8df3\u8fc7\u7528\u4f8b\u6807\u7b7e\u5316 \u73b0\u6709\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a\uff1a \u4e3e\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u8bb0\u4e3a \u201cskip-\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u8bb0\uff0c\u5982\u679c\u5df2\u7ecf\u6807\u8bb0\u4e86\u8df3\u8fc7\u539f\u56e0\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u8bb0\u4e3a SKIPED\uff0c\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\u3002 \u6240\u6709\u7684\u6807\u7b7e\u5728 docs \u76ee\u5f55\u4e0b\u4f1a\u6709\u4e00\u4e2a\u6587\u6863\uff0c\u6587\u6863\u6682\u5b9a\u540d\u79f0\u4e3a\uff1atags_info.md\uff0c\u7528\u4e8e\u8bf4\u660e\u73b0\u5728\u5df2\u7ecf\u4f7f\u7528\u5230\u7684\u6807\u7b7e\uff0c\u4ee5\u53ca\u8fd9\u4e9b\u6807\u7b7e\u7684\u89e3\u91ca\u548c\u7528\u6cd5\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#4","title":"4\u3001\u7528\u4f8b\u6267\u884c","text":"4.1\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u7684\u9a71\u52a8\u6267\u884c\u903b\u8f91\u529f\u80fd\u5b9e\u73b0 \u5f00\u53d1\u6839\u636e\u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\u91cc\u9762\u7684\u7528\u4f8b\u6807\u7b7e\u6267\u884c\u5bf9\u5e94\u7528\u4f8b\u7684\u529f\u80fd\uff0c\u80fd\u652f\u6301\u591a\u4e2a\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u6267\u884c\u5165\u53e3\u80fd\u968f\u610f\u901a\u8fc7\u7528\u4f8b\u6807\u7b7e\u6307\u5b9a\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002 \u7528\u4f8b\u6807\u7b7e\u7684\u9a71\u52a8\u65b9\u5f0f\u5fc5\u987b\u80fd\u652f\u6301\u6807\u7b7e\u7684\u6269\u5c55\uff0c\u672a\u6765\u968f\u7740\u4e1a\u52a1\u7684\u53d8\u5316\u53ef\u80fd\u9700\u8981\u589e\u52a0\u5404\u79cd\u5404\u6837\u7684\u6807\u7b7e\u3002 4.2\u3001\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u6267\u884c \u529f\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u3001\u6027\u80fd\u6d4b\u8bd5\u7b49\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u662f\u5206\u5f00\u6267\u884c\u7684\uff0c\u4e5f\u5c31\u662f\u5728\u4e00\u6b21\u6267\u884c\u4e2d\uff0c\u53ea\u80fd\u6267\u884c\u5176\u4e2d\u4e00\u79cd\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5177\u4f53\u8981\u6267\u884c\u54ea\u4e00\u79cd\u540c\u6837\u901a\u8fc7\u53c2\u6570\u6765\u63a7\u5236\u3002 4.3\u3001\u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c \u7531\u4e8e\u6d4b\u8bd5\u673a\u8d44\u6e90\u6709\u9650\uff0c\u968f\u7740\u81ea\u52a8\u5316\u7528\u4f8b\u6570\u91cf\u7684\u589e\u52a0\uff0cCI \u6267\u884c\u65f6\u95f4\u4f1a\u8d8a\u6765\u8d8a\u957f\u3002 \u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c\u7684\u529f\u80fd\uff1a \u540c\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\u5206\u6563\u5230\u4e0d\u540c\u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u4e0a\u6267\u884c\uff0c\u7f29\u77ed\u6267\u884c\u603b\u65f6\u95f4\uff1b \u7b2c\u4e8c\u5929\u8dd1\u7684\u65f6\u5019\u540c\u4e00\u4e2a\u673a\u5668\u4e0a\u4f1a\u6267\u884c\u6628\u5929\u6ca1\u6709\u6267\u884c\u5230\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u6267\u884c\u540c\u7406\uff1b \u53ef\u4ee5\u5b9e\u73b0\u5728\u5168\u67b6\u6784\u6d4b\u8bd5\u673a\u4e0a\u8f6e\u6d41\u6267\u884c\u7528\u4f8b\uff0c\u65e2\u80fd\u4fdd\u8bc1\u6267\u884c\u4e86\u6240\u6709\u7684\u7528\u4f8b\uff0c\u53c8\u80fd\u5728\u8d44\u6e90\u6709\u9650\u7684\u60c5\u51b5\u4e0b\u8986\u76d6\u4e86\u6240\u6709\u7684\u67b6\u6784\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#5","title":"5\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0","text":"5.1\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u4f5c\u4e3a\u524d\u7aef\u754c\u9762\u7cfb\u7edf\uff0c\u901a\u8fc7\u9875\u9762\u4e0a\u7684\u4e00\u4e9b\u529f\u80fd\u9009\u9879\u8fdb\u884c\u5bf9\u5e94\u6d4b\u8bd5\u4efb\u52a1\u7684\u7ba1\u7406\u6216\u89e6\u53d1\uff0c\u4e1a\u5185\u6bd4\u8f83\u6d41\u884c\u7684\u5b9e\u73b0\u65b9\u6848\u662f\u4f7f\u7528 Vue + DRF \u5b9e\u73b0\u4e00\u4e2a\u524d\u540e\u7aef\u5206\u79bb\u7684\u7cfb\u7edf\u3002 \u6d4b\u8bd5\u5e73\u53f0\u53ef\u80fd\u4f1a\u6d89\u53ca\u5230\u7684\u6a21\u5757\u6709\uff1a\u6d4b\u8bd5\u673a\u8d44\u6e90\u7ba1\u7406\u6a21\u5757\u3001\u7528\u4f8b\u6267\u884c\u63a7\u5236\u6a21\u5757\u3001\u7ed3\u679c\u5c55\u793a\u6a21\u5757\u3001PXE \u955c\u50cf\u5b89\u88c5\u6a21\u5757\u7b49\u3002 \u7528\u6237\uff08\u6d4b\u8bd5\u3001\u7814\u53d1\u540c\u5b66\u7b49\uff09\u53ef\u4ee5\u914d\u7f6e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5982\u6267\u884c\u54ea\u4e2a\u5e94\u7528\u3001\u6267\u884c\u7528\u4f8b\u7684\u8303\u56f4\u3001\u5728\u54ea\u53f0\u673a\u5668\u4e0a\u6267\u884c\u3001\u955c\u50cf\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u5e94\u7528\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u6267\u884c\u65f6\u95f4\u3002 5.2\u3001\u6267\u884c\u5165\u53e3 runner \u63d0\u4f9b\u7ed9\u6d4b\u8bd5\u5e73\u53f0\u7684\u63a5\u53e3\u5305\u62ec\uff1a\u7528\u4f8b\u6267\u884c\u63a5\u53e3\u3001\u7ed3\u679c\u8fd4\u56de\u63a5\u53e3\u3001\u955c\u50cf\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u955c\u50cf\u5b89\u88c5\u63a5\u53e3\u3001\u5e94\u7528\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u5e94\u7528\u5b89\u88c5\u66f4\u65b0\u63a5\u53e3\u7b49\u3002 \u524d\u7aef\u5e73\u53f0\u76ee\u524d\u8fd8\u6ca1\u6709\u592a\u591a\u8be6\u7ec6\u7684\u65b9\u6848\uff0c\u672c\u6b21\u8bbe\u8ba1\u4e3b\u8981\u96c6\u4e2d\u5728\u540e\u7aef\u8fd9\u90e8\u5206\u67b6\u6784\u7684\u8bbe\u8ba1\u4e0a\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_5","title":"\u56db\u3001\u5b9e\u65bd\u8ba1\u5212","text":"\u8fd1\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u6587\u7ba1\u4ee3\u7801\u89e3\u8026 2022/3/28 2022/4/8 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u56fe\u5f62\u56fe\u50cf\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u97f3\u89c6\u9891\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5168\u5c40\u641c\u7d22\u4ee3\u7801\u89e3\u8026 2022/4/25 2022/4/26 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u516c\u5171\u5e93\u5efa\u8bbe 2022/4/27 2022/5/5 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5c01\u88c5\u7684\u65b9\u6cd5\u6574\u7406\u6210\u4e00\u4e2a\u8868 2022/5/6 2022/5/10 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7528\u4f8b\u6807\u7b7e\u5206\u7c7b\u8bc4\u4f30 2022/5/11 2022/5/11 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u6807\u7b7e\u5316\u6267\u884c\u9a71\u52a8\u7a0b\u5e8f\u7f16\u5199 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u9700\u5b9e\u73b0\u81ea\u52a8\u89e3\u6790 csv \u8868\u683c\u4e2d\u7684\u7528\u4f8b\u7f16\u53f7 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u722c\u866b\u811a\u672c\uff0c\u722c\u53d6 pms \u4e0a\u7528\u4f8b\u7684\u6807\u7b7e 2022/5/11 2022/5/13 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u5b9a\u65f6\u81ea\u52a8\u7ef4\u62a4\u672c\u5730 csv \u6587\u4ef6\u811a\u672c 2022/5/11 2022/5/20 \u4e2d\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u76ee\u5f55\u7ed3\u6784\u8c03\u6574 2022/5/20 2022/6/2 \u5b8c\u6210\u5168\u5c40\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u5177\u4f53\u65b9\u6848\u548c\u903b\u8f91\u5b9e\u73b0 2022/6/6 2022/6/17 \u9759\u6001\u626b\u63cf\u95ee\u9898\u6e05\u96f6 2022/6/20 2022/7/1 \u5b8c\u6210\u65b0\u6846\u67b6\u4f7f\u7528\u57f9\u8bad 2022/7/4 2022/7/11 \u843d\u5730\u8fd0\u884c 2022/7/12 2022/7/20 \u5e95\u5c42\u5e93\u7528\u9014\u8bf4\u660e\u6587\u6863\u7f16\u5199 2022/7/21 2022/7/28"}]} \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz index 8ffaebc1..e0b7bbfc 100644 Binary files a/sitemap.xml.gz and b/sitemap.xml.gz differ diff --git "a/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" "b/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" index 25f669d5..97100667 100644 --- "a/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" +++ "b/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs @@ -1215,8 +1215,7 @@ 智能化功能测试# Attribution :chengdu Test Team # Date :2021/08/20 -此方案仍在演进中 -此方案仍在演进中 +此方案仍在演进中 仓库地址:https://gitlabcd.uniontech.com/autotest/cd-desktop-aitest 一、方案概述¶ 基于深度学习智能识别应用的元素控件,用于在自动化测试操作过程中的元素定位以及判断结果时的断言处理;自动化测试过程中,测试机上的画面通过采集盒传输到服务器上,服务器对视频画面进行智能识别后,服务器智能判断用例是否执行成功,然后对测试机下发下一步操作指令,测试机接受并执行下一步操作。 diff --git "a/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" "b/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" index cdf9ccde..06c9e9a5 100644 --- "a/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" +++ "b/\346\231\272\350\203\275\345\214\226\346\200\247\350\203\275\346\265\213\350\257\225/index.html" @@ -95,7 +95,7 @@ - + @@ -226,7 +226,7 @@ - + YouQu Docs diff --git "a/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" "b/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" index 121b4507..72123668 100644 --- "a/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" +++ "b/\346\241\206\346\236\266\345\212\237\350\203\275\344\273\213\347\273\215/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs @@ -752,6 +752,13 @@ + + + + + 4、虚拟化部署 + + @@ -1661,6 +1668,13 @@ + + + + + 4、虚拟化部署 + + @@ -2604,18 +2618,12 @@ 1、标签说明流水线使用指导; 跳过原因:skip-XXX,用于控制用例是否执行; 确认修复:fixed-XXX,用于标记用例的修复状态(后面详细讲解用法); @@ -2629,26 +2637,30 @@ 1、标签说明PMS用例ID 用例级别 用例类型 +设备类型 +用例来源 上线对象 测试级别 跳过原因 确认修复 -废弃用例 -... +废弃用例 +... -001 +679537 679537 L1 FUNC +PPL + CICD C1 skip-XXX fixed-XXX -removed-已废弃 -... +removed-已废弃 +... @@ -2656,7 +2668,7 @@ 2、操作步骤csv
[csv_link_pms_id] +;同步PMS数据到本地CSV文件,必须要配置的配置项 +;key是本地CSV文件的文件名称; +;value是对应PMS上的模块ID; +;比如要同步音乐的数据, 首先需要将配置 APP_NAME = deepin-music, +;CSV文件名称为music.csv,其在PMS上的用例为: https://pms.uniontech.com/testcase-browse-53.html +;因此应该配置为: music = 53 +;这样才能将PMS与本地CSV文件建立联系。 +;如果你的应用分了很多模块,只需要将对应的信息依次配置好就行了。 +music = 53
将以上信息配置好之后,在命令行执行:
youqu manage.py pms --pms2csv yes +youqu manage.py pms --pms2csv yes 每次执行时原 csv 文件会自动备份在 report/csv_back 目录下,因此你不用担心脚本执行导致你的数据丢失。 diff --git a/search/search_index.json b/search/search_index.json index 91ebe84c..c7cfc7a2 100644 --- a/search/search_index.json +++ b/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"separator":"[\\s\\u200b\\u3000\\-\u3001\u3002\uff0c\uff0e\uff1f\uff01\uff1b]+","pipeline":["stemmer"]},"docs":[{"location":"","title":"\u9996\u9875","text":""},{"location":"#youqu","title":"\u6709\u8da3\uff08YouQu\uff09","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/4/1\n# Author : Mikigo\n# =============================================\n \u672c\u7ad9\u603b\u8bbf\u95ee\u91cf \u6b21 \u6b22\u8fce\u5728\u6d4f\u89c8\u5668\u8bbf\u95ee\u3010\u516c\u7f51\u6587\u6863\u3011 \u7edf\u4fe1\u516c\u53f8\u5185\u7f51\u8fd8\u53ef\u4ee5\u8bbf\u95ee\u3010\u5185\u7f51\u6587\u6863\u3011\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u54e6~~"},{"location":"#_1","title":"\u4e00\u3001\u7b80\u4ecb","text":"\u6709\u8da3\uff08YouQu\uff09\u662f\u6df1\u5ea6\u79d1\u6280\u8bbe\u8ba1\u548c\u5f00\u53d1\u7684\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff0c\u91c7\u7528\u7ed3\u6784\u5206\u5c42\u7684\u8bbe\u8ba1\u7406\u5ff5\uff0c\u652f\u6301\u591a\u5143\u5316\u5143\u7d20\u5b9a\u4f4d\u548c\u65ad\u8a00\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\u3001\u5f3a\u5927\u7684\u65e5\u5fd7\u548c\u62a5\u544a\u8f93\u51fa\u7b49\u7279\u8272\u529f\u80fd\uff0c\u540c\u65f6\u5b8c\u7f8e\u517c\u5bb9X11\u3001Wayland\u663e\u793a\u534f\u8bae\uff0c\u73af\u5883\u90e8\u7f72\u7b80\u5355\uff0c\u64cd\u4f5c\u6613\u4e0a\u624b\u3002"},{"location":"#17","title":"\u7231\u4e0a \u201c\u6709\u8da3\u201d \u7684 17 \u4e2a\u7406\u7531","text":" \u6838\u5fc3\u5e93\u63d0\u4f9b\u4e86\u7edf\u4e00\u7684\u63a5\u53e3\uff0c\u7f16\u5199\u65b9\u6cd5\u65f6\u53ea\u9700\u8981\u5bfc\u5165\u4e00\u4e2a\u5305\u5c31\u53ef\u4ee5\u4f7f\u7528\u5230\u6838\u5fc3\u5e93\u63d0\u4f9b\u7684\u6240\u6709\u529f\u80fd\uff1b \u516c\u5171\u5e93\u5c01\u88c5\u4e86\u5f88\u591a\u5e38\u7528\u6a21\u5757\u7684\u76f8\u5173\u65b9\u6cd5\uff0c\u6bd4\u5982\uff1a\u4efb\u52a1\u680f\u7684\u64cd\u4f5c\u3001\u684c\u9762\u7684\u64cd\u4f5c\u3001\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\u7b49\u7b49\uff1b \u9664\u4e86\u5e38\u7528\u7684\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u8bc6\u522b\u4ee5\u5916\uff0c\u6211\u4eec\u8fd8\u63d0\u4f9b\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u5176\u4f7f\u7528\u7b80\u5355\u4e14\u9ad8\u6548\uff0c\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff1b \u5bf9\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u5c06\u7f16\u5199\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u53d8\u5f97\u7b80\u5355\u800c\u4f18\u96c5\uff1b \u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u6280\u672f\u8fdb\u884c\u529f\u80fd\u5347\u7ea7\uff0c\u9664\u4e86\u652f\u6301\u5355\u4e2a\u5750\u6807\u8fd4\u56de\uff0c\u8fd8\u652f\u6301\u540c\u4e00\u754c\u9762\u4e0b\u591a\u4e2a\u76f8\u540c\u5143\u7d20\u8fd4\u56de\u591a\u4e2a\u5750\u6807\u7684\u529f\u80fd\uff1b \u63d0\u4f9b\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u548c\u6279\u91cf\u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u4e0d\u5230\u4e00\u4e2a csv \u6587\u4ef6\u539f\u6765\u80fd\u5e72\u8fd9\u4e48\u591a\u4e8b\u60c5\uff1b \u63d0\u4f9b\u4e86\u529f\u80fd\u5f3a\u5927\u7684\u6267\u884c\u5668\u5165\u53e3\uff0c\u8ba9\u4f60\u53ef\u4ee5\u65b9\u4fbf\u7684\u5728\u672c\u5730\u6267\u884c\u4efb\u4f55\u7528\u4f8b\u96c6\u7684\u7528\u4f8b\uff0c\u5176\u4e30\u5bcc\u7684\u81ea\u5b9a\u4e49\u914d\u7f6e\u9879\uff0c\u6ee1\u8db3\u4f60\u5bf9\u6267\u884c\u5668\u6240\u6709\u7684\u5e7b\u60f3\uff1b \u63d0\u4f9b\u8fdc\u7a0b\u6267\u884c\u7684\u529f\u80fd\uff0c\u53ef\u4ee5\u63a7\u5236\u591a\u53f0\u673a\u5668\u5e76\u884c\u8dd1\uff0c\u6216\u8005\u5206\u5e03\u5f0f\u8dd1\uff0c\u8fd9\u79cd\u4ed8\u8d39\u529f\u80fd\u73b0\u5728\u514d\u8d39\u7ed9\u4f60\u7528\uff1b \u63d0\u4f9b\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u529f\u80fd\uff0c\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u6bcf\u4e2a\u65b9\u6cd5\u5355\u72ec\u5199\u8f93\u51fa\u65e5\u5fd7\u7684\u4ee3\u7801\uff0c\u4e00\u5207\u6211\u4eec\u7ed9\u4f60\u641e\u5b9a\u4e86\uff0c\u65e5\u5fd7\u8f93\u51fa\u4e0d\u4ec5\u5185\u5bb9\u4e30\u5bcc\uff0c\u989c\u503c\u4e5f\u7edd\u5bf9\u5728\u7ebf\uff0c\u6211\u4eec\u8fd8\u81ea\u5df1\u8bbe\u8ba1\u4e86\u4e00\u6b3e\u7ec8\u7aef\u8f93\u51fa\u4e3b\u9898\u53eb\u300a\u4e94\u5f69\u6591\u6593\u7684\u9ed1\u300b\uff1b \u63d0\u4f9b\u4e86\u4e00\u952e\u90e8\u7f72\u81ea\u52a8\u5316\u6d4b\u8bd5\u73af\u5883\u7684\u529f\u80fd\uff0c\u8fde\u4ee3\u7801\u7f16\u8f91\u5668\u90fd\u7ed9\u4f60\u88c5\u597d\u4e86\uff0c\u8ba9\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u73af\u5883\u90e8\u7f72\u800c\u70e6\u607c\uff1b \u63d0\u4f9b\u4e86\u81ea\u52a8\u751f\u6210\u591a\u79cd\u62a5\u544a\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u8f93\u51fa\u4ec0\u4e48\u62a5\u544a\u5f62\u5f0f\u90fd\u884c\uff0c\u800c\u4e14\u6211\u4eec\u5728\u62a5\u544a\u4e2d\u8fd8\u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\u548c\u5931\u8d25\u622a\u56fe\u7684\u529f\u80fd\uff1b \u5bf9\u65ad\u8a00\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u63d0\u4f9b\u66f4\u53cb\u597d\u5316\u7684\u9519\u8bef\u63d0\u793a\uff0c\u8ba9\u5b9a\u4f4d\u95ee\u9898\u7cbe\u51c6\u9ad8\u6548\uff1b \u4e0d\u4ec5\u652f\u6301\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u63a7\u5236\uff0c\u800c\u4e14\u8fd8\u652f\u6301\u52a8\u6001\u63a7\u5236\u7528\u4f8b\u6279\u91cf\u6267\u884c\u7684\u603b\u65f6\u95f4\uff0c\u786e\u4fdd CI \u73af\u5883\u4e0b\u80fd\u987a\u7545\u8fd0\u884c\uff1b \u652f\u6301\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\u6267\u884c\u3001PMS \u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6807\u7b7e\u5316\u6267\u884c\u65b9\u6848\uff0c\u6ee1\u8db3\u4f60\u5404\u79cd\u573a\u666f\u4e0b\u7684\u6267\u884c\u9700\u6c42\uff1b \u652f\u6301\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u529f\u80fd\uff0c\u53ef\u5b9a\u4f4d\u53ef\u65ad\u8a00\uff0c\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\uff1b \u5b8c\u7f8e\u517c\u5bb9 Wayland \u548c X11\uff0c\u771f\u6b63\u505a\u5230\u4e00\u5957\u4ee3\u7801\uff0c\u968f\u5904\u6267\u884c\uff1b \u652f\u6301\u591a\u79cd\u65b9\u5f0f\u7684\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u5176\u4e2d\u5f02\u6b65\u56de\u586b\u7684\u65b9\u6848\uff0c\u5b8c\u7f8e\u89e3\u51b3\u4e86\u6570\u636e\u56de\u586b\u7684\u8017\u65f6\u95ee\u9898\uff1b \u3010\u89c6\u9891\u4ecb\u7ecd\u3011"},{"location":"#_2","title":"\u4e8c\u3001\u5b89\u88c5\u4f7f\u7528","text":"\u57fa\u7840\u6846\u67b6\uff1ahttps://github.com/linuxdeepin/deepin-autotest-framework \u4ece PyPI \u5b89\u88c5: sudo pip3 install youqu\n \u521b\u5efa\u9879\u76ee: youqu-startproject youqu\n \u5b89\u88c5\u4f9d\u8d56: cd youqu\nbash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002 \u5e94\u7528\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684\u5e94\u7528\u540d\u79f0\u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music cd apps/\n \u5c06\u5e94\u7528\u5e93\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u50cf\u8fd9\u6837\uff1a youqu\n\u251c\u2500\u2500 apps\n\u2502 \u251c\u2500\u2500 autotest_deepin_music # \u5e94\u7528\u5e93\n...\n \u5e94\u7528\u5e93\u7684\u540d\u79f0\u4e0d\u53ef\u4ee5\u4fee\u6539\u3002"},{"location":"#_3","title":"\u4e09\u3001\u8fd0\u884c","text":""},{"location":"#1","title":"1. \u5de5\u4f5c\u7a7a\u95f4","text":"\u57fa\u7840\u6846\u67b6\u5de5\u7a0b\u76ee\u5f55\u5efa\u8bae\u653e\u5728 ~ \u76ee\u5f55\u4e0b\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u4e5f\u53ef\u4ee5\u8fd0\u884c\uff0c\u4f46\u662f\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u9700\u8981\u505a\u73af\u5883\u6e05\u7406\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u5b58\u5728\u4ee3\u7801\u88ab\u5220\u9664\u7684\u98ce\u9669\u3002 \u5982\u679c\u4f60\u7684\u673a\u5668\u4e0a\u4e0d\u540c\u76ee\u5f55\u4e0b\u5b58\u5728\u591a\u4e2a YouQu \u5de5\u7a0b\uff0c\u90a3\u4e48\u5728\u8fd0\u884c\u4e4b\u524d\uff0c\u8bf7\u5148\u6267\u884c env.sh \u6821\u6b63\u76f8\u5173\u73af\u5883\u3002"},{"location":"#2","title":"2. \u6267\u884c\u5668","text":"\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u6709\u4e00\u4e2a manage.py \uff0c\u5b83\u662f\u4e00\u4e2a\u6267\u884c\u5668\u5165\u53e3\uff0c\u63d0\u4f9b\u4e86\u672c\u5730\u6267\u884c\u3001\u8fdc\u7a0b\u6267\u884c\u7b49\u7684\u529f\u80fd\u3002 \u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6765\u6267\u884c\uff1a youqu manage.py run -a deepin-music\n"},{"location":"#21","title":"2.1. \u672c\u5730\u6267\u884c","text":"youqu manage.py run\n"},{"location":"#211","title":"2.1.1. \u914d\u7f6e\u6587\u4ef6","text":"\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u914d\u7f6e\u53c2\u6570 \u5728\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u91cc\u9762\u652f\u6301\u914d\u7f6e\u5bf9\u6267\u884c\u7684\u4e00\u4e9b\u53c2\u6570\u8fdb\u884c\u914d\u7f6e\uff0c\u5e38\u7528\u7684\u5982\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;1\u3001KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2\u3001KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f, e.g. TAGS = L1 or smoke\n;\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\uff0c\u5c06\u8981\u6267\u884c\u7684\u7528\u4f8b\u5199\u5165\u6307\u5b9a\u7684 csv \u6587\u4ef6\n;\u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u4ece\u57fa\u7840\u6846\u67b6\u6839\u76ee\u5f55\u5f00\u59cb\uff1ae.g. CASE_FILE = case_list.txt\n;\u5982\u679c\u8fd9\u91cc\u6709\u503c\uff0cAPP_NAME KEYWORDS TAGS \u7684\u914d\u7f6e\u5747\u4e0d\u751f\u6548\nCASE_FILE =\n;=============================== RUNNER CONFIG ===================================\n[runner]\n;\u6700\u5927\u5931\u8d25\u7528\u4f8b\u6570\u91cf\u7684\u5360\u6bd4\n;\u6bd4\u5982\uff1a\u603b\u6267\u884c\u7528\u4f8b\u6570\u4e3a100, \u82e5 MAX_FAIL = 0.5,\u5219\u5931\u8d25\u7528\u4f8b\u6570\u8fbe\u523050\u5c31\u4f1a\u7ec8\u6b62\u6d4b\u8bd5\u3002\nMAX_FAIL = 0.5\n;\u5355\u6761\u7528\u4f8b\u7684\u8d85\u65f6\u65f6\u95f4\uff0c\u5982\u679c\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u8d85\u65f6\uff0c\u8fd9\u6761\u7528\u4f8b\u4f1a\u88ab\u505c\u6b62\uff0c\u540e\u7eed\u7528\u4f8b\u7ee7\u7eed\u6267\u884c\u3002\n;\u5355\u4f4d\u4e3a\u79d2\n; \u8fd9\u662f\u4e00\u4e2a\u5168\u5c40\u7edf\u4e00\u914d\u7f6e\uff0c\u5982\u679c\u67d0\u6761\u7528\u4f8b\u9700\u8981\u5355\u72ec\u914d\u7f6e\u8d85\u65f6\u65f6\u95f4\uff0c\u53ef\u4ee5\u5728\u7528\u4f8b\u4e2d\u8fd9\u6837\u5199\uff1a\n;@pytest.mark.timeout(500)\n;def test_xxx_001():\n; ...\n;\u4f1a\u8bdd\uff08\u6240\u6709\u7528\u4f8b\u6267\u884c\u7684\uff09\u8d85\u65f6\u662f\u6839\u636e\u5168\u5c40\u8d85\u65f6\u914d\u7f6e\u548c\u7528\u4f8b\u5355\u72ec\u8d85\u65f6\u914d\u7f6e\u81ea\u52a8\u8ba1\u7b97\u7684\uff1b\nCASE_TIME_OUT = 200\n;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\u3002\n;\u6ce8\u610f\uff0c\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u4e0d\u80fd\u5c0f\u4e8e\u5931\u8d25\u5f55\u5c4f\u6b21\u6570\uff0c\u5373 RERUN >= RECORD_FAILED_CASE\nRECORD_FAILED_CASE = 1\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = INFO\n;yes \u6bcf\u6761\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u8fdb\u884c\u73af\u5883\u6e05\u7406\nCLEAN_ALL = yes\n;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\nRESOLUTION = 1920x1080\n;\u4e0d\u8df3\u8fc7\u7528\u4f8b\uff0ccsv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86 skip-xxx\u7684\u7528\u4f8b\u4e0d\u8df3\u8fc7\nNOSKIP = no\n;ignore fixed\n;no\uff0c\u53ea\u8981\u6807\u8bb0\u4e86fixed\u7684\u7528\u4f8b\uff0c\u5373\u4f7f\u6807\u8bb0\u4e86skip-\uff0c\u4e5f\u4f1a\u6267\u884c\uff1b\n;yes\uff0cfixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\uff1b\nIFIXED = no\n;\u8981\u5b89\u88c5deb\u5305\u7684\u8def\u5f84\n;e.g : ~/Downloads/ \u5b89\u88c5\u4e0b\u8f7d\u76ee\u5f55\u4e0b\u7684deb\u5305\uff0c\u5982\u679c\u662f\u8fdc\u7a0b\u6267\u884c\uff0c\u4f1a\u81ea\u52a8\u62f7\u8d1d\u5230\u8fdc\u7a0b\u5e76\u5b89\u88c5\u3002\nDEB_PATH =\n;DEBUG \u6a21\u5f0f\u6267\u884c\u7528\u4f8b\uff0c\u53ea\u6536\u96c6\u4e0d\u6267\u884c\u7528\u4f8b\uff0c\u4e5f\u4e0d\u505a\u8bbe\u5907\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002\nDEBUG = no\n;\u8bb0\u5f55top\u547d\u4ee4\u67e5\u8be2\u7684\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0cTOP = 3 \u8868\u793a\u8bb0\u5f55\u524d3\u4e2a\u8fdb\u7a0b\u3002\nTOP =\n;\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\nREPEAT =\n;\u9ed8\u8ba4\u5728\u6240\u6709\u6d4b\u8bd5\u5b8c\u6210\u4e4b\u540e\u8f93\u51fa\u62a5\u9519\u4fe1\u606f.\n;yes, \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\nDURING_FAIL = no\n;=============================== REPORT CONFIG ===================================\n[report]\n;\u7528\u4f8b\u6267\u884c\u5b8c\u540e\u751f\u6210\u7684\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n;\u76ee\u524d\u652f\u6301 allure, xml, json \uff08\u652f\u6301\u540c\u65f6\u751f\u6210\uff09\nREPORT_FORMAT = allure, xml, json\n;\u6307\u5b9a\u62a5\u544a\u751f\u6210\u7684\u8def\u5f84\uff08\u76f8\u5bf9\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\uff09\nALLURE_REPORT_PATH = report/\nXML_REPORT_PATH = report/\nJSON_REPORT_PATH = report/\n;=============================== GLOBAL CONFIG ===================================\n[globalconfig]\n;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\nPASSWORD = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\nIMAGE_MATCH_NUMBER = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6bcf\u6b21\u95f4\u9694\u7b49\u5f85\u65f6\u95f4\nIMAGE_MATCH_WAIT_TIME = 1\n;\u56fe\u50cf\u8bc6\u522b\u5339\u914d\u5ea6\nIMAGE_RATE = 0.9\n;\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u5b9e\u65f6\u56fe\u50cf\u4fdd\u5b58\u8def\u5f84\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u5750\u6807\nSCREEN_CACHE = /tmp/screen.png\n;\u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\u7684\u8def\u5f84\nTMPDIR = /tmp/tmpdir\n;\u7cfb\u7edf\u4e3b\u9898\nSYS_THEME = deepin\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = http://youqu-dev.uniontech.com:8890\n;OpenCV\u670d\u52a1\u7aef\u5730\u5740\nOPENCV_SERVER_HOST = http://youqu-dev.uniontech.com:8889\n;=============================== PMS CONFIG ===================================\n;PMS\u76f8\u5173\u914d\u7f6e\uff0c\u5305\u542b\u4ee5\u4e0b\u51e0\u4e2a\u65b9\u9762\uff1a\n;1.PMS\u6d4b\u8bd5\u5957\u6267\u884c\n;2.\u81ea\u52a8\u4ecePMS\u722c\u53d6\u6570\u636e\u5e76\u540c\u6b65\u672c\u5730CSV\u6587\u4ef6\n;3.PMS\u6570\u636e\u56de\u586b\n[pms]\n;PMS\u7684\u7528\u6237\u540d: ut001234\nPMS_USER =\n;PMS\u7684\u5bc6\u7801\nPMS_PASSWORD =\n;PMS\u6d4b\u8bd5\u5957\u7684ID\n;\u5728PMS\u4e0a\u67e5\u770b\u7528\u4f8b\u201c\u5957\u4ef6\u201d\u94fe\u63a5: https://pms.uniontech.com/testsuite-view-495.html\n;\u6d4b\u8bd5\u5957ID\u4e3a: 495\nSUITE_ID =\n;\u6570\u636e\u56de\u586b\u5fc5\u987b\u5173\u8054PMS\u6d4b\u8bd5\u5355\n;\u5728PMS\u4e0a\u67e5\u770b\u6d4b\u8bd5\u5355\u94fe\u63a5: https://pms.uniontech.com/testtask-cases-20747.html\n;\u6d4b\u8bd5\u5355ID\u4e3a: 20747\nTASK_ID =\n;\u5c06\u6d4b\u8bd5\u7ed3\u679c\u6570\u636e\u56de\u586b\u5230PMS\n;\u4e3a\u7a7a: \u8868\u793a\u4e0d\u56de\u586b,\u4e0d\u4f1a\u5728\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u751f\u6210json\u7ed3\u679c\u6587\u4ef6;\n;async: \u8868\u793a\u9010\u6761\u5f02\u6b65\u56de\u586b,\u540e\u9762\u4e00\u6761\u6267\u884c\u5f00\u59cb\u65f6\u901a\u8fc7\u5b50\u7ebf\u7a0b\u5bf9\u524d\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u8fdb\u884c\u56de\u586b\uff0c\u5982\u6b64\u5b9e\u73b0\u65f6\u95f4\u6548\u7387\u6700\u5927\u5316;\n;finish: \u8868\u793a\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u6210\u4e4b\u540e\u9010\u4e2a\u56de\u586b(PMS\u4e0d\u652f\u6301\u5e76\u53d1);\nSEND_PMS =\n;\u6570\u636e\u56de\u586b\u7684\u89e6\u53d1\u8005\n;auto: \u6846\u67b6\u81ea\u52a8\u56de\u586b,\u914d\u5408SEND_PMS\u914d\u7f6e\u4f7f\u7528,\u4f60\u53ef\u4ee5\u9009\u62e9\u5728\u4e0d\u540c\u7684\u9636\u6bb5\u8fdb\u884c\u6570\u636e\u56de\u586b;\n;hand: \u624b\u52a8\u56de\u586b,\u6bcf\u6761\u7528\u4f8b\u4ecd\u7136\u4f1a\u751f\u6210json\u6587\u4ef6,\u4f46\u6846\u67b6\u4e0d\u4f1a\u8fdb\u884c\u6570\u636e\u56de\u586b,\u9700\u8981\u4f60\u53ef\u4ee5\u5728\u4f60\u60f3\u8981\u53d1\u9001\u7684\u65f6\u95f4\u70b9\u624b\u52a8\u89e6\u53d1\u56de\u586b;\nTRIGGER = auto\n;PMS\u56de\u586b\u7684\u91cd\u8bd5\u6b21\u6570\n;\u5982\u679c\u63a5\u53e3\u8bf7\u6c42\u5931\u8d25,\u4f1a\u8fdb\u884c\u91cd\u8bd5\nSEND_PMS_RETRY_NUMBER = 2\n[csv_link_pms_lib]\n;caselib: \u7528\u4f8b\u5e93\n;testcase: \u4ea7\u54c1\u5e93\u7528\u4f8b\nCASE_FROM = caselib\n[csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/caselib-browse-81.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 81\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic =\n[export_csv]\n;\u5bfc\u51fa\u7684csv\u6587\u4ef6\u540d\u79f0\uff0c\u9ed8\u8ba4 case_list.csv\nCSV_FILE = case_list.csv\n;exportcsv \u547d\u4ee4\u5bfc\u51fa case_list.csv \u6587\u4ef6\u65f6\u914d\u7f6e\u7684\u5b57\u6bb5\u540d\uff0c\u7528\u4f8b\u540d\u79f0\u9ed8\u8ba4\u5b58\u5728\u7b2c\u4e00\u5217\uff0c\u65e0\u9700\u6dfb\u52a0\nCSV_HEARD = \u7528\u4f8b\u7ea7\u522b,\u7528\u4f8b\u7c7b\u578b,\u6d4b\u8bd5\u7ea7\u522b,\u662f\u5426\u8df3\u8fc7\n \u914d\u7f6e\u5b8c\u6210\u4e4b\u540e\uff0c\u76f4\u63a5\u5728\u547d\u4ee4\u884c\u6267\u884c manage.py \u5c31\u597d\u4e86\u3002 youqu manage.py run\n"},{"location":"#212","title":"2.1.2. \u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a youqu manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--max_fail MAX_FAIL \u6700\u5927\u5931\u8d25\u7387\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--resolution RESOLUTION\n\u68c0\u67e5\u5206\u8fa8\u7387\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms {,async,finish}\n\u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--trigger {,auto,hand}\n\u89e6\u53d1\u8005\n-f CASE_FILE, --case_file CASE_FILE\n\u6839\u636e\u6587\u4ef6\u6267\u884c\u7528\u4f8b\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n--pms_user PMS_USER pms \u7528\u6237\u540d\n--pms_password PMS_PASSWORD\npms \u5bc6\u7801\n--suite_id SUITE_ID pms \u6d4b\u8bd5\u5957ID\n--pms_info_file PMS_INFO_FILE\npms \u4fe1\u606f\u6587\u4ef6\n--top TOP \u8fc7\u7a0b\u4e2d\u8bb0\u5f55top\u547d\u4ee4\u4e2d\u7684\u503c\n--lastfailed \u4ec5\u6267\u884c\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\n--duringfail \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\n--repeat REPEAT \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n--project_name PROJECT_NAME\n\u5de5\u7a0b\u540d\u79f0\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--build_location BUILD_LOCATION\n\u6784\u5efa\u5730\u533a\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--line LINE \u6267\u884c\u7684\u4e1a\u52a1\u7ebf\uff08\u5199\u5165json\u6587\u4ef6\uff09\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a youqu manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\"\n \u547d\u4ee4\u884c\u53c2\u6570\u4f18\u5148\u7ea7\u662f\u9ad8\u4e8e\u914d\u7f6e\u6587\u4ef6\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u4e86\u5bf9\u5e94\u7684\u53c2\u6570\uff0c\u914d\u7f6e\u6587\u4ef6\u4e2d\u4e0d\u7ba1\u662f\u5426\u914d\u7f6e\u5747\u4e0d\u751f\u6548\u3002 --app \u5165\u53c2\u8fd8\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\uff0c\u4e0b\u9762\u7684\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u540c\u6837\u652f\u6301\u3002"},{"location":"#22","title":"2.2. \u8fdc\u7a0b\u6267\u884c","text":"youqu manage.py remote\n \u8fdc\u7a0b\u6267\u884c\u540c\u6837\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u8fdb\u884c\u7528\u4f8b\u76f8\u5173\u914d\u7f6e\uff1b \u9700\u8981\u91cd\u70b9\u8bf4\u4e00\u4e0b\u8fdc\u7a0b\u6267\u884c\u65f6\u7684\u6d4b\u8bd5\u673a\u4fe1\u606f\u914d\u7f6e\uff0c\u5728\u914d\u7f6e\u6587\u4ef6 setting/remote.ini \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\u3001IP\u3001\u5bc6\u7801\u3002 ;=============================== CLIENT LIST =====================================\n; \u6d4b\u8bd5\u673a\u914d\u7f6e\u5217\u8868\n;[client{number}] ;\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u6709\u591a\u5c11\u53f0\u6d4b\u8bd5\u673a\u5c31\u5199\u591a\u5c11\u4e2a client\uff0c\u522b\u540d\u5fc5\u987b\u5305\u542b client \u5b57\u7b26\uff0c\u4e14\u4e0d\u80fd\u91cd\u590d\u3002\n;user = ;\u6d4b\u8bd5\u673a user\n;ip = ;\u6d4b\u8bd5\u673a ip\n;password = 1 ;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801, \u53ef\u4ee5\u4e0d\u914d\u7f6e\u6b64\u9879\uff0c\u9ed8\u8ba4\u53d6 CLIENT_PASSWORD \u7684\u503c\uff1b\n;\u5982\u679c\u4f60\u6240\u6709\u6d4b\u8bd5\u673a\u5bc6\u7801\u90fd\u76f8\u540c\uff0c\u90a3\u4e48\u53ea\u9700\u8981\u914d\u7f6e CLIENT_PASSWORD \u5c31\u53ef\u4ee5\u4e86\n;=================================================================================\n[client1]\nuser = uos\nip = 10.8.15.xx\n[client2]\nuser = uos\nip = 10.8.15.xx\n[client3]\nuser = uos\nip = 10.8.11.xx\n \u6709\u591a\u5c11\u53f0\u673a\u5668\u5c31\u50cf\u8fd9\u6837\u6328\u7740\u5199\u5c31\u884c\u4e86\u3002 \u7136\u540e\u5728\u547d\u4ee4\u884c\uff1a youqu manage.py remote\n \u8fd9\u6837\u8fd0\u884c\u662f\u4ece\u914d\u7f6e\u6587\u4ef6\u53bb\u8bfb\u53d6\u76f8\u5173\u914d\u7f6e\u3002 \u5982\u679c\u4f60\u4e0d\u60f3\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\uff0c\u4f60\u4ecd\u7136\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u8fdb\u884c\u4f20\u53c2\uff0c \u4ee5\u4e0b\u4e3a python3 manage.py remote \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-c CLIENTS, --clients CLIENTS\n\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679cpassword\u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6\nsetting/remote.ini \u4e2d CLIENT_PASSWORD\n\u7684\u503c,\u6bd4\u5982\uff1auos@10.8.13.33:1 \u6216 uos@10.8.13.33\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-s {yes,no,}, --send_code {yes,no,}\n\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a\uff08\u4e0d\u542breport\u76ee\u5f55\uff09\n-e, --build_env \u642d\u5efa\u6d4b\u8bd5\u73af\u5883,\u5982\u679c\u4e3ayes\uff0c\u4e0d\u7ba1send_code\u662f\u5426\u4e3ayes\u90fd\u4f1a\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a.\n-p CLIENT_PASSWORD, --client_password CLIENT_PASSWORD\n\u6d4b\u8bd5\u673a\u5bc6\u7801\uff08\u5168\u5c40\uff09\n-y PARALLEL, --parallel PARALLEL\nyes:\u8868\u793a\u6240\u6709\u6d4b\u8bd5\u673a\u5e76\u884c\u8dd1\uff0c\u6267\u884c\u76f8\u540c\u7684\u6d4b\u8bd5\u7528\u4f8b\uff0cno\n:\u8868\u793a\u6d4b\u8bd5\u673a\u5206\u5e03\u5f0f\u6267\u884c\uff0c\u670d\u52a1\u7aef\u4f1a\u6839\u636e\u6536\u96c6\u5230\u7684\u6d4b\u8bd5\u7528\u4f8b\u81ea\u52a8\u5206\u914d\u7ed9\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u3002\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms SEND_PMS \u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n \u5728\u547d\u4ee4\u884c\u8fd9\u6837\u8fd0\u884c\uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\"\n \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report \u76ee\u5f55\u4e0b\u56de\u6536\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u7684\u6d4b\u8bd5\u62a5\u544a\u3002 \u914d\u7f6e\u6587\u4ef6\u5176\u4ed6\u76f8\u5173\u914d\u7f6e\u9879\u8be6\u7ec6\u8bf4\u660e\uff0c\u8bf7\u67e5\u770b\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u6ce8\u91ca\u5185\u5bb9\u3002"},{"location":"#23-pms","title":"2.3. PMS \u6570\u636e\u56de\u586b","text":"\u6d4b\u8bd5\u5355\u5173\u8054\u7684\u7528\u4f8b\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u5bf9\u5e94\u7684\u53bb\u8dd1\u8fd9\u4e9b\u5173\u8054\u7684\u7528\u4f8b\uff0c\u5e76\u4e14\u5c06\u6267\u884c\u7684\u7ed3\u679c\u56de\u586b\u7684\u6d4b\u8bd5\u7528\u4f8b\u7684\u72b6\u6001\u91cc\u9762\u3002 PMS \u6570\u636e\u56de\u586b\u4e3b\u8981\u6709\u4e09\u79cd\u65b9\u5f0f\uff1a \uff081\uff09\u5f02\u6b65\u56de\u586b \u5728\u7528\u4f8b\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\uff0c\u91c7\u7528\u5f02\u6b65\u7684\u65b9\u5f0f\u53bb\u8fdb\u884c\u6570\u636e\u56de\u586b\uff0c\u76f4\u767d\u7684\u8bb2\u5c31\u662f\uff0c\u7b2c\u4e8c\u6761\u7528\u4f8b\u5f00\u59cb\u8dd1\u7684\u65f6\u5019\uff0c\u901a\u8fc7\u5b50\u7ebf\u7a0b\u53bb\u505a\u7b2c\u4e00\u6761\u7528\u4f8b\u7684\u6570\u636e\u56de\u586b\uff0c\u5982\u6b64\u5faa\u73af\uff0c\u76f4\u5230\u6240\u6709\u7528\u4f8b\u6267\u884c\u7ed3\u675f\uff1b \u8fd9\u79cd\u65b9\u6848\u7684\u65f6\u95f4\u6548\u7387\u6700\u9ad8\u7684\uff0c\u56e0\u4e3a\u7406\u8bba\u4e0a\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u662f\u5927\u4e8e\u6570\u636e\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\u65f6\u95f4\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u5f53\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u6570\u636e\u56de\u586b\u4e5f\u5b8c\u6210\u4e86\u3002 \u4f7f\u7528\u65b9\u6cd5\uff0c\u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u4ee5\u4e0b\u53c2\u6570\uff1a\uff08\u4ee5\u4e0b\u6d89\u53ca\u5230\u7684\u53c2\u6570\u914d\u7f6e\u90fd\u662f\u5728\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u914d\u7f6e\uff09 PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = async\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \u8fd9\u4e2a\u53c2\u6570\u53ef\u586b\u53ef\u4e0d\u586b\uff0c\u4f46\u662f\u586b\u4e86\u53ef\u4ee5\u63d0\u9ad8\u7528\u4f8b\u7684\u6267\u884c\u901f\u5ea6\uff0c\u56e0\u4e3a\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u53ef\u4ee5\u6307\u5b9a\u5230\u5177\u4f53\u7684\u5e94\u7528\u5e93\u3002\uff08\u4e0b\u540c\uff09\n \uff082\uff09\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u56de\u586b \u7b49\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u518d\u9010\u4e2a\u8fdb\u884c\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u6b64\u65b9\u6848\u65f6\u95f4\u6548\u7387\u6bd4\u8f83\u4f4e\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \uff083\uff09\u624b\u52a8\u56de\u586b \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4e0d\u505a\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u540e\u7eed\u624b\u52a8\u5c06\u7ed3\u679c\u8fdb\u884c\u56de\u586b\u8bf7\u6c42\u3002 \u7528\u4f8b\u6267\u884c\u65f6\u914d\u7f6e\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = hand\nAPP_NAME = \u540e\u7eed\u624b\u52a8\u56de\u586b\u65b9\u6cd5\uff1a youqu manage.py pms --send2task yes\n"},{"location":"#_4","title":"\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898","text":"\u7531\u540c\u5b66\u53ef\u80fd\u4f1a\u53d1\u73b0\uff0c\u600e\u4e48\u56de\u586b\u4e00\u6b21\u4e4b\u540e\uff0c\u540e\u9762\u60f3\u518d\u6b21\u56de\u586b\u5c31\u4e0d\u751f\u6548\u4e86\uff1b \u8fd9\u662f\u56e0\u4e3a\u4e3a\u4e86\u5e94\u5bf9\u524d\u9762\u63d0\u5230\u7684\u591a\u79cd\u6570\u636e\u56de\u586b\u7684\u65b9\u5f0f\uff0c\u5728 report \u76ee\u5f55\u4e0b\u4f1a\u7531 pms_xxx \u5f00\u5934\u7684\u76ee\u5f55\uff0c\u8bb0\u5f55\u4e86\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u548c\u56de\u586b\u60c5\u51b5\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u4e4b\u524d\u5df2\u7ecf\u56de\u586b\u8fc7\u4e86\uff0c\u540e\u7eed\u5c31\u4e0d\u4f1a\u518d\u6b64\u89e6\u53d1\u56de\u586b\u4e86\uff1b \u5982\u679c\u4f60\u60f3\u91cd\u65b0\u505a\u56de\u586b\uff0c\u4f60\u53ef\u4ee5\u628a report/pms_xxx \u76ee\u5f55\u5220\u6389\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u91cd\u65b0\u505a\u6570\u636e\u56de\u586b\u4e86\uff1b"},{"location":"#24-csv","title":"2.4. \u5bfc\u51fa CSV \u6587\u4ef6","text":"\u6846\u67b6\u63d0\u4f9b\u5bfc\u51fa\u6307\u5b9a\u6807\u7b7e\u7528\u4f8b\u7684\u529f\u80fd\uff1a youqu manage.py exportcsv -a deepin-album -t CICD\n \u8868\u793a\u5bfc\u51fa deepin-album \u7684\u7528\u4f8b\u4e2d\u6807\u8bb0\u4e86 CICD \u6807\u7b7e\u7684\u7528\u4f8b\uff0c\u5bfc\u51fa CSV \u6587\u4ef6\u7684\u5b57\u6bb5\u683c\u5f0f\u5df2\u7ecf\u9002\u914d\u4e86 CICD \u7684\u8981\u6c42\u3002"},{"location":"#25-app","title":"2.5. \u811a\u624b\u67b6\u65b0\u5efa APP \u5de5\u7a0b","text":"\u65b0\u5efa\u4e00\u4e2a APP \u5de5\u7a0b\uff1a youqu manage.py startapp autotest_deepin_some \u8fd9\u6837\u5728 apps \u76ee\u5f55\u4e0b\u4f1a\u521b\u5efa\u4e00\u4e2a\u5b50\u9879\u76ee\u5de5\u7a0b autotest_deepin_some\uff0c\u540c\u65f6\u65b0\u5efa\u597d\u5de5\u7a0b\u6a21\u677f\u76ee\u5f55\u548c\u6a21\u677f\u6587\u4ef6\uff1a apps\n\u2514\u2500\u2500 autotest_deepin_some\n \u00a0\u00a0 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_case.py\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 config.ini\n \u00a0\u00a0 \u251c\u2500\u2500 config.py\n \u00a0\u00a0 \u251c\u2500\u2500 conftest.py\n \u00a0\u00a0 \u251c\u2500\u2500 control\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_assert.py\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some.csv\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u2514\u2500\u2500 widget\n \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 case_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 other.ini\n \u00a0\u00a0 \u251c\u2500\u2500 other_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 pic_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2514\u2500\u2500 ui.ini\n autotest_deepin_some \u662f\u4f60\u7684\u5de5\u7a0b\u540d\u79f0\uff0c\u6bd4\u5982\uff1aautotest_deepin_music \uff1b \u5728\u6b64\u57fa\u7840\u4e0a\uff0c\u4f60\u53ef\u4ee5\u5feb\u901f\u7684\u5f00\u59cb\u4f60\u7684 AT \u9879\u76ee\u3002"},{"location":"#26","title":"2.6. \u7528\u4f8b\u6807\u7b7e\u81ea\u52a8\u540c\u6b65","text":"\u7528\u4e8e\u81ea\u52a8\u540c\u6b65 PMS \u7528\u4f8b\u6807\u7b7e\u6570\u636e\u81f3\u672c\u5730 CSV \u6587\u4ef6\uff0c\u4e3b\u8981\u901a\u8fc7\u4ee5\u4e0b\u51e0\u4e2a\u914d\u7f6e\u6765\u63a7\u5236\uff1a APP_NAME = # \u6307\u5b9a\u8981\u540c\u6b65\u7684\u5e94\u7528\u540d\u79f0\nPMS_USER = # PMS\u7684\u7528\u6237\u540d\nPMS_PASSWORD = # PMS\u7684\u5bc6\u7801\n \u5728 [csv_link_pms_id] \u8282\u70b9\u4e0b\u6307\u5b9a csv \u6587\u4ef6\u540d\u4e0e PMS \u7528\u4f8b\u6a21\u5757\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u6bd4\u5982\uff1a [csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/testcase-browse-53.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 53\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic = 53\n \u5c06\u4ee5\u4e0a\u4fe1\u606f\u914d\u7f6e\u597d\u4e4b\u540e\uff0c\u5728\u547d\u4ee4\u884c\u6267\u884c\uff1a youqu manage.py pms --pms2csv yes\n \u6bcf\u6b21\u6267\u884c\u65f6\u539f csv \u6587\u4ef6\u4f1a\u81ea\u52a8\u5907\u4efd\u5728 report/csv_back \u76ee\u5f55\u4e0b\uff0c\u56e0\u6b64\u4f60\u4e0d\u7528\u62c5\u5fc3\u811a\u672c\u6267\u884c\u5bfc\u81f4\u4f60\u7684\u6570\u636e\u4e22\u5931\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u57fa\u7840\u6846\u67b6\u8bbe\u8ba1\u65b9\u6848","text":"# ====================================\n# Author : Mikigo\n# Time : 2022/3/18\n# version \uff1a1.0\n# ====================================\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"\u505a\u4e00\u4e2a\u7b80\u5355\u3001\u597d\u7528\u3001\u529f\u80fd\u5f3a\u5927\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u3002 \u4f5c\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4e00\u4e2a\u57fa\u7840\u6846\u67b6\uff0c\u4efb\u4f55\u5e94\u7528\u90fd\u80fd\u5f88\u65b9\u4fbf\u7684\u63a5\u5165\u8fdb\u6765\uff1b \u63d0\u4f9b\u6240\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u9700\u8981\u7684\u5e95\u5c42\u529f\u80fd\uff0c\u5e76\u5bf9\u5916\u63d0\u4f9b\u552f\u4e00\u7684\u63a5\u53e3\uff0c\u65b9\u4fbf\u5e94\u7528\u5e93\u4f7f\u7528\uff1b \u6574\u5408\u516c\u5171\u5e93\uff0c\u51cf\u5c11\u5e94\u7528\u5e93\u4ee3\u7801\u91cf\u548c\u65b9\u6cd5\u7ef4\u62a4\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u8bbe\u8ba1\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u7edf\u4e00\u6982\u5ff5","text":" \u57fa\u7840\u6846\u67b6 \u672c\u9879\u76ee\u662f\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\uff08AutoTest Basic Frame\uff09\uff0c\u5168\u79f0\u4e3a\u201c\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff08AT \u57fa\u7840\u6846\u67b6\uff09\u201d\u3002 AT \u57fa\u7840\u6846\u67b6\u662f\u505a\u4e3a\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\u6765\u8bbe\u8ba1\u7684\uff0c\u5b83\u63d0\u4f9b\u4e86\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u57fa\u7840\u529f\u80fd\uff0c\u4efb\u4f55\u5e94\u7528\u63a5\u5165\u8fdb\u6765\u90fd\u80fd\u5feb\u901f\u65b9\u4fbf\u7684\u8fdb\u884c\u65b9\u6cd5\u548c\u7528\u4f8b\u7f16\u5199\uff0c\u540c\u65f6\u5728\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u3001\u6807\u7b7e\u5316\u6267\u884c\u3001\u5206\u5e03\u5f0f\u6267\u884c\u3001\u591a\u79cd\u62a5\u544a\u8f93\u51fa\u3001\u4f18\u7f8e\u7684\u6267\u884c\u65e5\u5fd7\u3001\u5931\u8d25\u81ea\u52a8\u5f55\u5c4f\u548c\u622a\u56fe\u3001\u81ea\u52a8\u73af\u5883\u6e05\u7406\u7b49\u7b49\uff0c\u5b83\u90fd\u63d0\u4f9b\u4e86\u5b8c\u5584\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u66f4\u91cd\u8981\u7684\u662f\u8fd9\u4e00\u5207\u4f7f\u7528\u8d77\u6765\u90fd\u975e\u5e38\u7b80\u5355\u3002 \u57fa\u7840\u6846\u67b6\u4e2d\u5305\u542b\u5e94\u7528\u5e93\uff08apps\uff09\u3001\u6838\u5fc3\u5e93\uff08src\uff09\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09\u3002 \u5e94\u7528\u5e93\uff08apps\uff09 \u5404\u4e2a\u5e94\u7528\u81ea\u5df1\u7684\u4ed3\u5e93\uff0c\u91cc\u9762\u4e3b\u8981\u5305\u542b\u7684\u662f\u7528\u4f8b\u3001\u65b9\u6cd5\u53ca\u4e00\u4e9b\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u53eb autotest-dde-file-manager \u3002 \u6838\u5fc3\u5e93\uff08src\uff09 \u6838\u5fc3\u5e93\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u5230\u6240\u6709\u5e95\u5c42\u6838\u5fc3\u529f\u80fd\uff0c\u8fd9\u662f\u6700\u91cd\u8981\u7684\u4e00\u4e2a\u90e8\u5206\uff0c\u7075\u9b42\u3002\u5177\u4f53\u529f\u80fd\u6a21\u5757\u53ca\u8bf4\u660e\u4f1a\u5728\u4e0b\u9762\u7b2c\u56db\u4e2a\u7ae0\u8282\u8be6\u7ec6\u63cf\u8ff0\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09 \u591a\u4e2a\u5e94\u7528\u90fd\u8981\u7528\u5230\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\uff0c\u6309\u7167\u5e94\u7528\u5212\u5206\u5b58\u653e\uff0c\u4e3b\u8981\u662f\u4e3a\u4e86\u51cf\u5c11\u4ee3\u7801\u91cf\uff0c\u6d88\u9664\u5e94\u7528\u95f4\u7684\u8026\u5408\u5173\u7cfb\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u67b6\u6784\u56fe","text":"\u6574\u4f53\u7684\u6846\u67b6\u8bbe\u8ba1\u5728\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u300b\u6587\u6863\u91cc\u9762\u5df2\u7ecf\u6709\u8be6\u7ec6\u63cf\u8ff0\u4e86\uff0c\u8fd9\u91cc\u8d34\u4e00\u4e0b\u6574\u4f53\u7684\u67b6\u6784\u56fe\uff1a \u4e3a\u4e86\u7a81\u663e\u672c\u6587\u7684\u91cd\u70b9\uff0c\u62bd\u53d6\u5176\u4e2d\u91cd\u8981\u529f\u80fd\u6a21\u5757\uff0c\u5982\u4e0b\u56fe\uff1a "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-basic-frame # \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\n\u251c\u2500\u2500 apps # \u5e94\u7528\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-dde-file-manager # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\uff08\u5e94\u7528\u5e93\u8be6\u7ec6\u76ee\u5f55\u7ed3\u6784\u8bf7\u770b\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\uff09\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 tag # \u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u2514\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u2502 \u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 xxx.png\n\u2502 \u2502 ...\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-deepin-music # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 public # \u516c\u5171\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget # dde_dock \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget # dde_desktop \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 src # \u6838\u5fc3\u5e93\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 button_center.py\n\u2502 \u251c\u2500\u2500 cmdtrl.py\n\u2502 \u251c\u2500\u2500 dogtails.py\n\u2502 \u251c\u2500\u2500 find_image.py\n\u2502 \u251c\u2500\u2500 global_config.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 setting # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 config.py\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 global_config.ini\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\u6a21\u5757\uff08Hook\uff09\n\u251c\u2500\u2500 pytest.ini # Pytest \u9ed8\u8ba4\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 docs # \u6587\u6863\u76ee\u5f55\n\u2514\u2500\u2500 manage.py # \u6267\u884c\u5668\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1apps","title":"1\u3001\u5e94\u7528\u5e93\uff08apps\uff09","text":"\u6240\u6709\u5e94\u7528\u5e93\u5747\u653e\u7f6e\u5728\u57fa\u7840\u6846\u67b6\u4e0b\u7684 apps \u76ee\u5f55\u4e0b\uff08\u89c1\u7b2c\u4e8c\u7ae0\u8282\u7b2c3\u6bb5\u76ee\u5f55\u7ed3\u6784\u5185\u5bb9\uff09\u3002\u5e94\u7528\u5e93\u7684\u67b6\u6784\u8bbe\u8ba1\u53ef\u4ee5\u53c2\u8003\u300aAT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b\u6587\u6863\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2src","title":"2\u3001\u6838\u5fc3\u5e93\uff08src\uff09","text":"\u5728 src \u76ee\u5f55\u4e0b\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u5e95\u5c42\u6838\u5fc3\u7ec4\u4ef6\uff0c\u901a\u5e38\u6765\u8bb2\u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5230\u5176\u4e2d\u67d0\u4e00\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4e48\u4f60\u9700\u8981\u663e\u793a\u7684\u5bfc\u5165\u8fd9\u4e2a\u6a21\u5757\uff0c\u7136\u540e\u624d\u80fd\u4f7f\u7528\u8be5\u6a21\u5757\u4e0b\u7684\u529f\u80fd\uff0c\u5982\u679c\u4f60\u7528\u5230\u4e86\u5341\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4f60\u5c31\u9700\u8981\u5bfc\u5165\u5341\u4e2a\u3002\u4f46\u662f\u6211\u4eec\u60f3\u8ba9\u4e8b\u60c5\u53d8\u5f97\u7b80\u5355\uff0c\u4e00\u6b21\u5bfc\u5165\uff0c\u4f7f\u7528\u6240\u6709\u3002 \u5c06\u6240\u6709\u7684\u529f\u80fd\u6a21\u5757\u90fd\u8fdb\u5165\u5230 src \u7684\u540d\u79f0\u7a7a\u95f4\uff0c\u5728 src/__init__.py \u91cc\u9762\u6211\u4eec\u8bbe\u8ba1\u6210\u8fd9\u6837\uff1a # src/__init__.py\nfrom .cmdctl import CmdCtl\nfrom .dogtails import Dogtail\nfrom .find_image import FindImage\nfrom .button_center import ButtonCenter\nclass Src(CmdCtl, FindImage):\ndef __init__(self, **kwargs):\n\"\"\"dogtail or button center param\n :param kwargs: app_name, desc, number\n \"\"\"\nif kwargs:\napp_name = kwargs.get(\"APP_NAME\")\ndesc = kwargs.get(\"DESC\")\nif app_name is None or desc is None:\nraise ValueError\nnumber = kwargs.get(\"number\")\nnumber = number if isinstance(number, int) else -1\n# \u5bf9\u8c61\u7ec4\u5408\nself.dog = Dogtail(app_name, desc, number)\nself.ui = ButtonCenter(app_name, number)\n \u9700\u8981\u4f20\u9012\u53c2\u6570\u7684\u91c7\u7528\u5bf9\u8c61\u7ec4\u5408\uff0c\u6ca1\u6709\u53c2\u6570\u7684\u4f7f\u7528\u7ee7\u627f\uff0c\u7ee7\u627f\u7684\u7c7b\u7b26\u5408 Mixin \u8bbe\u8ba1\u6a21\u5f0f\u3002 \u5e94\u7528\u5e93\u91cc\u9762\u4f7f\u7528\u7684\u65f6\u5019\u5728 widget/base_widget.py \u91cc\u9762\u53ea\u9700\u8981\u552f\u4e00\u7ee7\u627f Src \uff1a # \u5e94\u7528\u5e93\u91cc\u9762\u65b9\u6cd5\u57fa\u7c7b\n# widget/base_widget.py\nfrom src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n \u8981\u4f7f\u7528\u6838\u5fc3\u5e93\u7684\u529f\u80fd\uff0c\u53ea\u9700\u8981\u5199\u4e00\u4e2a\u5bfc\u5165 from src import Src \u5373\u53ef\u3002 \u5199 __init__ \u6784\u9020\u51fd\u6570\u7684\u539f\u56e0\u662f\u901a\u8fc7\u53c2\u6570\u6784\u9020\u5e94\u7528\uff0c\u5e76\u4e14\u4f20\u9012 number \u8fdb\u6765\uff0c\u53ef\u4ee5\u5b9e\u73b0\u591a\u7a97\u53e3\u7684\u63a7\u5236\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3public","title":"3\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09","text":"\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6bcf\u4e2a\u5e94\u7528\u90fd\u662f\u4e00\u4e2a\u5355\u72ec\u7684 py \u6587\u4ef6\uff0c\u76f8\u4e92\u4e4b\u95f4\u662f\u72ec\u7acb\u7684\uff0c\u6bcf\u4e2a py \u6587\u4ef6\u91cc\u9762\u662f\u8be5\u5e94\u7528\u7684\u65b9\u6cd5\u7c7b\uff0c\u6bd4\u5982\uff1a\u6700\u5e38\u7528\u7684\u65b9\u6cd5\u7c7b dde_desktop_public_widget.py # dde_desktop_widget.py\nfrom src import Src\nclass _DdeDesktopPublicBaseWidget(Src):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-desktop\"\nDESC = \"/usr/bin/dde-desktop\"\ndef __init__(self):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC)\nclass DdeDesktopPublicWidget(_DdeDesktopPublicBaseWidget):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u7c7b\"\"\"\ndef click_music_dir_by_ui(self):\n\"\"\"\u5728\u6587\u4ef6\u9009\u62e9\u6846\u70b9\u51fb\u97f3\u4e50\u76ee\u5f55\"\"\"\nself.click(*self.ui.btn_center(\"\u4fa7\u8fb9\u680f-\u97f3\u4e50\")) \ndef click_xxx_by_attr(self):\npass\n \u516c\u5171\u65b9\u6cd5\u5e93\u610f\u4e49\uff1a \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6240\u5c01\u88c5\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\u90fd\u662f\u81f3\u5c11\u88ab2\u4e2a\u5e94\u7528\u90fd\u7528\u5230\u7684\uff0c\u8fd9\u6837\u505a\u53ef\u4ee5\u51cf\u5c11\u6574\u4f53\u4ee3\u7801\u91cf\uff0c\u4ece\u800c\u51cf\u8f7b\u5e94\u7528\u5e93\u4ee3\u7801\u7684\u7ef4\u62a4\u5de5\u4f5c\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u7f16\u5199\u5f62\u5f0f\uff08\u547d\u540d\u89c4\u5219\u3001\u5b9a\u4f4d\u7684\u65b9\u6848\u5199\u6cd5\u3001\u6ce8\u91ca\u7684\u5199\u6cd5\u7b49\u7b49\uff09\u5177\u6709\u4e00\u5b9a\u7684\u6a21\u677f\u4f5c\u7528\uff0c\u8fd9\u6837\u5373\u4f7f\u662f\u5404\u4e2a\u5e94\u7528\u5e93\u90fd\u72ec\u7acb\u7ef4\u62a4\uff0c\u6240\u6709\u7684\u7f16\u7801\u98ce\u683c\u90fd\u662f\u8d8b\u4e8e\u76f8\u540c\u7684\uff0c\u56e0\u4e3a\u5927\u5bb6\u90fd\u5e94\u8be5\u53c2\u7167\u516c\u5171\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u5199\u6cd5\u6765\u5199\u81ea\u5df1\u5e94\u7528\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\u7c7b\uff0c\u8fd9\u6837\u4f7f\u5f97\u4ece\u516c\u53f8\u7684\u89d2\u5ea6\u53bb\u770b\u6240\u6709\u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u90fd\u662f\u7edf\u4e00\u7684\u3002 \u53ef\u4ee5\u901a\u8fc7\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\uff0c\u4e86\u89e3\u5230\u5176\u4ed6\u5e94\u7528\u7684\u529f\u80fd\uff0c\u5bf9\u4e8e\u6211\u4eec\u9700\u6c42\u7406\u89e3\uff0c\u4e86\u89e3\u7cfb\u7edf\u7684\u65b9\u65b9\u9762\u9762\u4e5f\u6709\u597d\u5904\u3002 \u5f53\u7136\uff0c\u5982\u679c\u4f60\u7684\u5e94\u7528\u672c\u8eab\u662f\u5c5e\u4e8e\u6839\u672c\u5c31\u4e0d\u9700\u8981\u548c\u5176\u4ed6\u5e94\u7528\u4ea4\u4e92\u7684\uff0c\u90a3\u4e48\u4f60\u53ef\u80fd\u4e0d\u4f1a\u7528\u5230\u8fd9\u91cc\u9762\u7684\u529f\u80fd\uff0c\u6ca1\u5173\u7cfb\uff0c\u4f60\u6240\u6709\u7684\u65b9\u6cd5\u90fd\u53ef\u4ee5\u76f4\u63a5\u5199\u5728\u5e94\u7528\u5e93\u7684\u4e1a\u52a1\u5c42\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4conftestpy","title":"4\u3001conftest.py","text":"conftest.py \u4ece\u529f\u80fd\u4e0a\u5c06\u662f\u5c5e\u4e8e\u6838\u5fc3\u5e93\uff08src\uff09\u7684\u5185\u5bb9\uff0c\u4f46\u662f\u7531\u4e8e\u5b83\u7684\u7279\u6b8a\u6027\uff0c\u5373\u5b83\u662f\u5bf9\u5e94\u7528\u5e93\u4e2d\u7684\u7528\u4f8b\u751f\u6548\u7684\uff0c\u800c\u4e14\u5b83\u7684\u4f5c\u7528\u57df\u662f\u5f53\u524d\u76ee\u5f55\u53ca\u4ee5\u4e0b\uff0c\u56e0\u6b64\u6211\u4eec\u5c06\u5b83\u653e\u5230\u9879\u76ee\u6839\u76ee\u5f55\u3002\u6211\u4eec\u6846\u67b6\u4e2d\u6709\u4e0d\u5c11\u6838\u5fc3\u529f\u80fd\u90fd\u662f\u5728\u8fd9\u91cc\u9762\u8fdb\u884c\u5f00\u53d1\u7684\uff0c\u540e\u9762\u7b2c\u56db\u7ae0\u4f1a\u8bb2\u5230\u7ec6\u8282\u3002 pytest.ini \u4f5c\u7528\u548c conftest.py \u7c7b\u4f3c\uff0c\u662f Pytest \u6846\u67b6\u7684\u56fa\u5b9a\u914d\u7f6e\u6587\u4ef6\uff0c\u76ee\u524d\u914d\u7f6e\u4e86\u4e00\u4e9b\u901a\u7528\u7684\u547d\u4ee4\u884c\u6267\u884c\u53c2\u6570\uff0c\u4e5f\u653e\u5728\u9879\u76ee\u6839\u76ee\u5f55\u3002 \u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 Hook \u51fd\u6570\uff0capps \u76ee\u5f55\u4e0b\u7684 \u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 fixture \u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5setting","title":"5\u3001setting","text":"\u5168\u5c40\u914d\u7f6e\u6a21\u5757\uff0c\u5305\u542b\u4e86\u4ee5\u4e0b\u914d\u7f6e\u6587\u4ef6\uff1a \uff081\uff09ini \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u914d\u7f6e\u4e00\u4e9b\u5168\u5c40\u7684\u914d\u7f6e\u9879\uff0c\u8b6c\u5982\uff1a\u5931\u8d25\u91cd\u8dd1\u6b21\u6570\u3001\u662f\u5426\u5931\u8d25\u5f55\u5c4f\u3001\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\u3001\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4\u3001\u6267\u884c\u65f6\u65e5\u5fd7\u7ea7\u522b\u3001\u751f\u6210\u7684\u62a5\u544a\u7c7b\u578b\u3001\u4ee5\u53ca\u5206\u5e03\u5f0f\u6267\u884c\u7684\u4e00\u4e9b\u7b56\u7565\u914d\u7f6e\u9879\u7b49\u7b49\u3002 \uff082\uff09config.py \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u63d0\u4f9b\u914d\u7f6e\u6587\u4ef6\u8bfb\u53d6\u3001\u52a8\u6001\u83b7\u53d6\u4e00\u4e9b\u5e38\u91cf\uff08\u5982\u9879\u76ee\u6839\u76ee\u5f55\u7edd\u5bf9\u8def\u5f84 (BASE_DIR)\u3001\u7cfb\u7edf\u67b6\u6784\uff08SYS_FRAME\uff09\u3001\u65f6\u95f4\u5b57\u7b26\u4e32\uff08strftime\uff09\u3001\u672c\u673a USERNAME IP \u7b49\u7b49\uff09\u3001\u516c\u5171 URL \u7b49\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u89c4\u8303","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u7248\u672c\u53ca\u4f9d\u8d56","text":"\u57fa\u7840\u6846\u67b6\u4f1a\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u8fdb\u884c\u7248\u672c\u53d1\u5e03\uff0c\u4e0d\u4e0e\u67d0\u4e2a\u5e94\u7528\u7248\u672c\u7ed1\u5b9a\uff0c\u4f46\u662f\uff0c\u5e94\u7528\u5e93\u4f1a\u4f9d\u8d56\u4e8e\u57fa\u7840\u6846\u67b6\u7684\u7248\u672c\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u5efa\u8bae\u5728\u5e94\u7528\u5e93\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a\u6587\u672c\u6587\u4ef6\u7528\u4e8e\u8bb0\u5f55\u6240\u4f9d\u8d56\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\uff0c\u7c7b\u4f3c\u4e8e\u5f00\u53d1\u5e94\u7528\u7684 debian/control \u6587\u4ef6\u7684\u529f\u80fd\uff0c\u4e3a\u4e86\u4fdd\u6301\u7edf\u4e00\uff0c\u8fd9\u4e2a\u6587\u4ef6\u5c31\u547d\u540d\u4e3a control\uff0c\u653e\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u6838\u5fc3\u5e93\u72ec\u7acb\u6027","text":"\u6838\u5fc3\u5e93\u4e0d\u5efa\u8bae\u9488\u5bf9\u67d0\u4e00\u4e2a\u5e94\u7528\u5355\u72ec\u505a\u4ee3\u7801\u4e0a\u7279\u6b8a\u5904\u7406\uff0c\u901a\u5e38\u8003\u8651\u9488\u5bf9\u67d0\u4e00\u79cd\u573a\u666f\u8fdb\u884c\u5904\u7406\uff0c\u8fd9\u4e9b\u573a\u666f\u901a\u5e38\u662f\u5b58\u5728\u4e00\u4e9b\u5171\u6027\u7684\u3002\u6bd4\u5982\u8bf4\uff1a\u684c\u9762\u7684ID\u5206\u914d\u5b58\u5728\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u903b\u8f91\u5904\u7406\u89e3\u51b3ID\u5206\u914d\u9519\u8bef\u7684\u95ee\u9898\uff0c\u4f46\u662f\u8fd9\u90e8\u5206\u903b\u8f91\u6211\u4eec\u4f1a\u5728\u684c\u9762\u7684\u65b9\u6cd5\u5c42\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u517c\u5bb9\u6027","text":"\u4e3a\u4e86\u4fdd\u6301\u517c\u5bb9\u6027\uff0c\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u539f\u5219\u4e0a\u4e0d\u5bf9\u8001\u65b9\u6cd5\u8fdb\u884c\u4fee\u6539\u6216\u5220\u9664\uff0c\u53ea\u8fdb\u884c\u65b0\u589e\u3002\u6d89\u53ca\u5230\u8001\u65b9\u6cd5\u4fee\u6539\u6216\u5220\u9664\u7684\uff0c\u4f1a\u8fdb\u884c\u63d0\u524d\u9884\u544a\uff0c\u5e76\u5728\u7b2c\u4e8c\u4e2a\u7248\u672c\u4e4b\u540e\uff08\u4e2d\u95f4\u4f1a\u9694\u4e00\u4e2a\u7248\u672c\u8fc7\u5ea6\uff09\u6b63\u5f0f\u5b9e\u65bd\u4fee\u6539\u6216\u5220\u9664\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u547d\u540d\u89c4\u8303","text":" \u7528\u4f8b ID \u6bcf\u4e2a\u5e94\u7528\u81ea\u5df1\u7ef4\u62a4\u4e00\u5957 ID\uff0c\u5728PMS\u4e0a\u7528\u4f8b\u6807\u9898\u4e0a\u5c06\u81ea\u52a8\u5316ID\u4ee5\u6807\u7b7e\u7684\u5f62\u5f0f\u5199\u5165\uff0c\u6bd4\u5982\uff1a[101]\u6253\u5f00-\u542f\u52a8\u5e94\u7528\u540edock\u53f3\u952e\u83dc\u5355 \u4e00\u4e2a\u7528\u4f8b\u7c7b\u91cc\u9762\u6709\u591a\u4e2a\u7528\u4f8b\u65f6\uff0c\u5728\u7528\u4f8b\u540d\u79f0\u540e\u9762\u52a0\u5e8f\u53f7\u3002 class TestFileManager(BaseCase):\n\"\"\"\u6587\u7ba1\u7528\u4f8b\"\"\"\ndef test_xxx_015_1(self):\npass\ndef test_xxx_015_2(self):\npass\n \u6ce8\u610f 015_1\uff0c\u4e0d\u8981\u5199015_01\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 PMS \u4e0a\u7684\u7528\u4f8bID\uff1a PMS \u4e0a\u662f6\u4f4d\u6570\uff0c\u4e0d\u591f\u76f4\u89c2\uff0c\u4e5f\u4e0d\u597d\u7ef4\u62a4\uff0c\u5728\u81ea\u52a8\u5316\u4e0b\u9762\u53bb\u627e\u4e00\u4e2a\u5e26\u6709 6 \u4f4d\u6570\u7684\u6587\u4ef6\u662f\u4e00\u4e2a\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 PMS \u4e0a\u7684 ID \u53ef\u80fd\u4f1a\u53d1\u751f\u53d8\u5316\uff0c\u6bd4\u5982\u5bfc\u51fa\u6765\u5bfc\u8fdb\u53bb\u7684\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u5b58\u5728\u95ee\u9898\uff0c\u5982\u679c\u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u8981\u60f3\u627e\u51fa\u6765\u5bf9\u5e94\u4fee\u6539\u81ea\u52a8\u5316\u7528\u4f8b ID\uff0c\u5c06\u4f1a\u662f\u4ef6\u975e\u5e38\u75db\u82e6\u7684\u4e8b\u60c5\u3002 \u51fd\u6570\u547d\u540d\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5de6\u952e\u70b9\u51fb click \u53f3\u952e\u70b9\u51fb right_click \u53cc\u51fb double_click \u79fb\u52a8 move_to \u62d6\u52a8 drag \u65b0\u5efa new \u62d6\u52a8\u5230 drag_to \u4ece\u54ea\u91cc\u62d6\u52a8\u5230\u54ea\u91cc drag_something_from_xxx_to_xxx \u83b7\u53d6 get \u83b7\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5750\u6807 get_location \u975e\u7279\u6b8a\u6587\u4ef6 file word\u6587\u4ef6 doc text\u6587\u4ef6 text \u6587\u4ef6\u5939 dir \u5173\u952e\u8bcd\u6301\u7eed\u589e\u52a0 \u5e38\u91cf\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5e94\u7528\u540d\u79f0 APP_NAME \u5e94\u7528\u63cf\u8ff0 DESC \u672c\u5e94\u7528\u4ee5\u5916\u7684\u5176\u4ed6\u5e94\u7528\uff0c\u6bd4\u5982\u5e2e\u52a9 HELP \u5176\u4ed6\u540d\u79f0\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u65b9\u6cd5\u5305\u540d widget \u65b9\u6cd5\u6587\u4ef6\u540d\uff08\u6587\u7ba1\u4e3e\u4f8b\uff09 dfm_widget.pytitle_widget.pyright_view_widget.pyleft_view_widget.pypop_widget.pybase_widget.pydfm_assert.py \u65ad\u8a00\u8bed\u53e5\u547d\u540d\u89c4\u8303 \u65ad\u8a00\u8bed\u53e5\u90fd\u662f\u4ee5 assert \u5f00\u5934 \u65ad\u8a00 \u8bed\u53e5 \u5224\u65ad\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_existsassert_file_not_exists \u5224\u65ad\u684c\u9762\u76ee\u5f55\u4e0b\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_exists_in_desktopassert_file_not_exists_in_desktop \u5224\u65ad\u56fe\u7247\u5b58\u5728 assert_image_existsassert_image_not_exists \u5224\u65ad\u5f71\u9662\u4e2d\u662f\u5426\u5b58\u5728\u56fe\u7247 assert_image_exists_in_movieassert_image_not_exists_in_movie \u5224\u65ad\u5143\u7d20\u662f\u5426\u5b58\u5728 assert_element_existassert_element_not_exist \u5224\u65ad\u662f\u5426\u76f8\u7b49 assert_equalassert_not_equal \u5224\u65ad\u662f\u5426\u4e3a\u771f assert_trueassert_false"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5fixture","title":"5\u3001fixture \u89c4\u8303","text":"\u7531\u4e8e Pytest \u6846\u67b6\u4e2d\u652f\u6301 fixture \u7684\u5199\u6cd5\u548c Xunit \u5199\u6cd5\u7684\uff0c\u6240\u4ee5\u5e94\u7528\u5e93\u4e2d\u53ef\u80fd\u5b58\u5728\u6df7\u7528\u7684\u60c5\u51b5\uff0c\u4e3a\u7edf\u4e00\u7f16\u7801\u98ce\u683c\u65b9\u4fbf\u540e\u7eed\u7528\u4f8b\u4ee3\u7801\u7ef4\u62a4\uff0c\u73b0\u505a\u4ee5\u4e0b\u89c4\u8303\u8bf4\u660e\uff1a \u629b\u5f03 Xunit \u7684\u5199\u6cd5\uff0c\u7edf\u4e00\u91c7\u7528 Pytest fixture \u7684\u5199\u6cd5\u3002 \u5e94\u7528\u5185 fixture \u8c28\u614e\u4f7f\u7528 autouse=True \uff0c\u975e\u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u975e\u5e38\u4e0d\u5efa\u8bae\u4f7f\u7528\u8fd9\u4e2a\u53c2\u6570\u3002 \u8c03\u7528 fixture \u4e0d\u80fd\u4f7f\u7528 @pytest.mark.usefixture()\uff0c\u4f7f\u7528\u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u4f20\u5165\u51fd\u6570\u5bf9\u8c61\u3002 \u5efa\u8bae\u5728\u4e00\u4e2a conftest.py \u91cc\u9762\u53bb\u5199\uff0c\u4e00\u4e2a\u5e94\u7528\u4e5f\u5c3d\u91cf\u7ef4\u62a4\u4e00\u4e2a conftest.py\u6587\u4ef6\u3002 fixture \u4e5f\u9700\u8981\u5199\u529f\u80fd\u8bf4\u660e\uff0c\u51fd\u6570\u540d\u79f0\u8981\u6709\u5177\u4f53\u542b\u4e49\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#6","title":"6\u3001\u65b9\u6cd5\u7f16\u5199\u89c4\u8303","text":" \u65b9\u6cd5\u7c7b\u578b\uff1a if \u6ca1\u6709\u7528\u5230\u5b9e\u4f8b\u5bf9\u8c61\uff1a\nif \u6ca1\u6709\u7528\u5230\u7c7b\u5bf9\u8c61\uff1a\n\u5199\u9759\u6001\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @staticmethod\nelse\uff1a\n\u5199\u7c7b\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @classmethod\nelse:\n\u76f4\u63a5\u5199\u5b9e\u4f8b\u65b9\u6cd5\n \u4e3e\u4f8b: class TitleWidget:\ndef click_xxx_by_ui(self):\npass\n@staticmethod\ndef click_xxx_by_ui():\npass\n@classmethod\ndef click_xxx_by_ui(cls):\npass\n \u51fd\u6570\u540d\u79f0\u4e0d\u51fa\u73b0\u6570\u5b57\uff0c\u9700\u8981\u8868\u793a\u6570\u91cf\u7684\u7528\u5355\u8bcd\u8868\u793a\u3002 \u51fd\u6570\u529f\u80fd\u6ce8\u91ca\u3002 \u6ca1\u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg2:xxx\n\"\"\"\n \u6709\u53c2\u6570\uff0c\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg1:xxx\nreturn: xxx\n\"\"\"\n \u200b \u7528 Pycharm \u7684\u6ce8\u91ca\u6a21\u677f\u4e5f\u53ef\u4ee5\uff0c\u53ea\u8981\u4f53\u73b0\u4e86\u53c2\u6570\u7684\u7c7b\u578b\u548c\u8fd4\u56de\u5c31\u884c\u4e86\u3002 \u6682\u4e0d\u8981\u6c42\u5199\u7c7b\u578b\u6ce8\u89e3\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#7case","title":"7\u3001\u7528\u4f8b\uff08case\uff09\u89c4\u8303","text":" \u4ee5\u7c7b\u7684\u5f62\u5f0f\u5199\u7528\u4f8b\uff0c\u7528\u4f8b\u7c7b\u96c6\u6210\u7528\u4f8b\u57fa\u7c7b\u3002 \u7528\u4f8b\u7c7b\u9700\u8981\u5199\u6ce8\u91ca\u3002 \u6d4b\u8bd5\u7528\u4f8b\u51fd\u6570\u8bf4\u660e\uff08\u5efa\u8bae\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u540d\u79f0\uff09 \"\"\"\u53f3\u4fa7\u9884\u89c8-\u56fe\u7247\u7c7b\u578b\u4fe1\u606f\u680f\u57fa\u672c\u4fe1\u606f\"\"\"\n \u4e0d\u5199\u8c03\u8bd5\u4ee3\u7801 if __name__ == '__main__':\npytest.main()\n \u6240\u6709\u7528\u4f8b\u90fd\u7ee7\u627f BaseCase\u3002 BaseCase \u91cc\u9762\u653e\u4e00\u4e9b\u6d4b\u8bd5\u6570\u636e\u7684\u5e38\u91cf\uff0c\u6bd4\u5982\u6587\u4ef6\u540d\u79f0\uff0c\u5e94\u7528\u540d\u79f0\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u4e00\u4e9b\u901a\u7528\u7684\u5b57\u7b26\u4e32\u3002 \u8fd9\u7c7b\u662f\u5c5e\u4e8e\u6d4b\u8bd5\u6570\u636e\u3002 class BaseCase(DfmAssert):\n\"\"\"\u7528\u4f8b\u57fa\u7c7b\"\"\"\nNEW_FILE = \"\u65b0\u5efa\u6587\u672c.txt\"\nTEST_FILE = \"test.txt\"\nNEW_DIR = \"\u65b0\u5efa\u6587\u4ef6\u5939\"\nNEW_WORD = \"\u65b0\u5efaWord\u6587\u6863.doc\"\nAPP_HELP = \"damn\"\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\n\"\"\"\u7528\u4f8b\u6807\u9898\uff08\u590d\u5236PMS\u4e0a\u7528\u4f8b\u6807\u9898\uff09\"\"\"\ndfm = DfmWidget()\ndfm.click_xxx_by_attr(self.NEW_FILE)\ndfm.new_file_in_desktop_by_cmd(self.NEW_FILE)\nself.assert_true(dfm.get_process_status(self.APP_NAME))\n \u7528\u4f8b\u91cc\u9762\u5c3d\u91cf\u51cf\u5c11\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\uff0c\u66f4\u8981\u51cf\u5c11\u76f8\u540c\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\u3002 \u7edf\u4e00\u6587\u4ef6\u6ce8\u91ca\u5934\u3002 #!/usr/bin/env python3\n# _*_ coding:utf-8 _*_\n\"\"\"\n:Author:email@uniontech.com\n:Date :${DATE} ${TIME}\n\"\"\"\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#8","title":"8\u3001\u5176\u4ed6\u89c4\u8303","text":" \u65e5\u5fd7\u6253\u5370\u8981\u5728\u65b9\u6cd5\u6700\u524d\u9762\uff0c\u5426\u5219\u4ee3\u7801\u62a5\u9519\u6ca1\u6709\u65e5\u5fd7\u8f93\u51fa\uff0c\u4e0d\u597d\u5b9a\u4f4d\u95ee\u9898\u3002\uff08\u6211\u4eec\u4f1a\u8003\u8651\u7ee7\u7eed\u4f7f\u7528\u62e6\u622a\u5668\u6253\u5370\u65e5\u5fd7\uff09 \u6240\u6709\u7684\u64cd\u4f5c\u90fd\u9700\u8981\u6709\u65e5\u5fd7\uff0c\u5305\u62ec sleep()\uff0c\u6211\u4eec\u4f1a\u91cd\u5199\u4e00\u4e2a\u6709\u65e5\u5fd7\u8f93\u5165\u7684 sleep\u3002 \u4e1a\u52a1\u5c42\u65e5\u5fd7\u7ea7\u522b\u4e3a INFO\u3002 hook \u51fd\u6570\u53ea\u80fd\u5199\u5230\u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u91cc\u9762\u3002 apps \u76ee\u5f55\u4e0b\u7684 conftest.py \u539f\u5219\u4e0a\u4e0d\u4f1a\u65b0\u589e fixture\u3002 \u56fa\u5b9a\u76ee\u5f55\u6216\u5143\u7d20\u63a7\u4ef6\u7684\u64cd\u4f5c\uff0c\u5c06\u64cd\u4f5c\u65b9\u6cd5\u5199\u6b7b\uff0c\u6587\u4ef6\u7c7b\u64cd\u4f5c\u5c06\u6587\u4ef6\u540d\u7559\u53c2\u6570\u3002 \u8def\u5f84\u62fc\u63a5\u89c4\u8303\uff1a \u7cfb\u7edf\u4e2d\u56fa\u5b9a\u76ee\u5f55\uff0c\u8def\u5f84\u62fc\u63a5\u65f6\u4f7f\u7528\u6ce2\u6d6a\u7b26\u53f7\uff0c\u6bd4\u5982\uff1a~/Desktop/\uff0c\u4e0b\u5c42\u4f7f\u7528 os.path.expanduser()\uff0c\u5b83\u53ef\u4ee5\u81ea\u52a8\u8bc6\u522b\u6ce2\u6d6a\u7b26\u53f7\u3002 \u9879\u76ee\u4e0b\u8def\u5f84\u4f7f\u7528\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u8def\u5f84\uff0c\u6bd4\u5982\uff1aConfig.BASE_PATH\uff0c\u56e0\u4e3a\u9879\u76ee\u662f\u53ef\u4ee5\u5728\u4efb\u610f\u8def\u5f84\u8fd0\u884c\u7684\uff0c\u9700\u8981\u52a8\u6001\u62fc\u63a5\u8def\u5f84\u3002 "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848","text":"# =================================================\n# Author : Mikigo\n# Time : 2022/3/16\n# version \uff1a1.0\n# =================================================\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"AT \u5e94\u7528\u5e93\u6539\u9020\u662f\u57fa\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u8fdb\u884c\u7528\u4f8b\u65b9\u6cd5\u548c\u4e1a\u52a1\u903b\u8f91\u7684\u91cd\u65b0\u8bbe\u8ba1\uff0c\u4ee5\u5b9e\u73b0\u5e94\u7528\u5e93\u9ad8\u6548\u7684\u7f16\u5199\u3001\u7ef4\u62a4\u7528\u4f8b\u53ca\u5176\u65b9\u6cd5\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u6587\u4ef6\u7ba1\u7406\u5668\u4ece\u4e1a\u52a1\u590d\u6742\u5ea6\u548c\u7528\u4f8b\u91cf\u6765\u8bb2\uff0c\u5728\u7cfb\u7edf\u6240\u6709\u5e94\u7528\u4e2d\uff0c\u662f\u5f88\u6709\u4ee3\u8868\u6027\u7684\uff0c\u96be\u5ea6\u4e5f\u662f\u6700\u5927\u7684\uff0c\u56e0\u6b64\u6211\u4eec\u9009\u53d6\u6587\u4ef6\u7ba1\u7406\u5668\u4f5c\u4e3a\u5e94\u7528\u5e93\u6539\u9020\u7684\u5b9e\u9a8c\u5e94\u7528\uff0c\u7ed9\u540e\u7eed\u5176\u4ed6\u5e94\u7528\u6539\u9020\u63d0\u4f9b\u5207\u5b9e\u53ef\u884c\u7684\u601d\u8def\u548c\u65b9\u6848\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u5206\u5c42\u8bbe\u8ba1\u56fe","text":"\u6574\u4f53\u4ecd\u7136\u9075\u5faa PO \u8bbe\u8ba1\u7406\u5ff5\uff0c\u6839\u636e\u4e1a\u52a1\u9700\u8981\uff0c\u5c06\u6587\u7ba1\u4e1a\u52a1\u5c42\u8fdb\u884c 3 \u5c42\u5212\u5206\uff1a "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-dde-file-manager # \u5e94\u7528\u4ed3\u5e93\n\u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 test_xxx_001.py\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u00a0\u251c\u2500\u2500 __init__.py\n\u2502 \u00a0\u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u00a0\u251c\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u00a0\u251c\u2500\u2500 base_widget.py # \u65b9\u6cd5\u57fa\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 title_widget.py # title \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 right_view_widget.py # right view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 left_view_widget.py # left view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 pop_widget.py # pop \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 dfm_widget.py # \u65b9\u6cd5\u7684\u7edf\u4e00\u51fa\u53e3\n\u2502 \u00a0\u2514\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 tag # \u7528\u4f8b\u6807\u7b7e\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 xxx.csv # \u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2514\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u57fa\u7c7b","text":" \u7ee7\u627f\u6838\u5fc3\u5c42\u7684\u5404\u4e2a\u6a21\u5757\u7c7b\u3002 \u62bd\u53d6\u64cd\u4f5c\u5c42\u7684\u4e00\u4e9b\u57fa\u7840\u65b9\u6cd5\u3002 \u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u7684\u4e00\u4e9b\u516c\u5171\u65b9\u6cd5\u3002 \u8def\u5f84\u7ec4\u88c5\u65b9\u6cd5\u3002 \u4e00\u4e9b\u4e1a\u52a1\u5c42\u76f8\u5173\u7684\u53d8\u91cf\u3001\u5e38\u91cf\u3001shell\u547d\u4ee4\u3001\u5750\u6807\u3002 \u65b9\u6cd5\u57fa\u7c7b\u7684\u5199\u6cd5\uff1a from src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u64cd\u4f5c\u5c42","text":" \u6a21\u5757\u5212\u5206 \u6309\u7167\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u6587\u7ba1\u4e3b\u754c\u9762\u5206\u4e3a\u4e09\u4e2a\u533a\u57df\uff1a\u6807\u9898\u680f\u3001\u53f3\u8fb9\u89c6\u56fe\u533a\u57df\u3001\u5de6\u8fb9\u89c6\u56fe\u533a\u57df \u5f39\u7a97\uff1a\u8bbe\u7f6e\u754c\u9762\u5f39\u7a97\u3001\u4fdd\u9669\u7bb1\u5f39\u7a97\u3001\u5220\u9664\u786e\u8ba4\u5f39\u7a97\u3001\u53ca\u5404\u79cd\u7f51\u7edc\u5f39\u7a97 \u53f3\u952e\u83dc\u5355\uff1a\u6682\u65f6\u4e0d\u8003\u8651\u4e3a\u5355\u72ec\u7684\u6a21\u5757\uff0c\u8003\u8651\u4ee5\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6848\u505a\u6210\u516c\u5171\u5e93\u3002 \u5404\u4e2a\u6a21\u5757\u53ea\u7ee7\u627f\u57fa\u7c7b from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u6784\u9020\u51fd\u6570\u91cc\u9762\u4e0d\u6784\u9020\u5bf9\u8c61\uff0c\u53ef\u4ee5\u521d\u59cb\u5316\u4e00\u4e9b\u53d8\u91cf\u3002 \u4e0d\u540c\u7684\u5b9a\u4f4d\u65b9\u6848\u8c03\u7528\u4e0d\u540c\u7684\u5b9a\u4f4d\u5de5\u5177\u5bf9\u8c61\u3002 self.dog\nself.ui\nself.d_bus\n \u65b9\u6cd5\u7f16\u5199 \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u5e94\u7528\u5c42","text":" \u7ee7\u627f\u64cd\u4f5c\u5c42\u7684\u6240\u6709\u7c7b\u3002 \u4ec5\u4ec5\u7528\u4e8e\u7528\u4f8b\u4e2d\u5bfc\u5165\u65b9\u4fbf\uff0c\u4e0d\u505a\u5176\u4ed6\u4e8b\u60c5\u3002 class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n DfmAssert \u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u7ee7\u627f\uff0c\u65b9\u4fbf\u4f7f\u7528\u65ad\u8a00\u8bed\u53e5\u3002 from apps.dde_file_manager.widget.dfm_widget import DfmWidget\nfrom public.assert import Assert\nclass DfmAssert(Assert):\ndef assert_file_exists_in_desktop(self, file_name):\nself.assert_file_exists(f\"~/Desktop{file_name}\")\n...\nDfmWidget().get_file_in_desktop()\n \u7528\u4f8b\u91cc\u9762\u76f4\u63a5\u7ee7\u627f\uff0c\u65b9\u4fbf\u5728\u7528\u4f8b\u91cc\u9762\u4f7f\u7528 self \u8fdb\u884c\u65ad\u8a00\uff0c\u66f4\u7b26\u5408\u65ad\u8a00\u7684\u4f7f\u7528\u4e60\u60ef\uff0c\u7528\u4f8b\u903b\u8f91\u4e0a\u66f4\u6e05\u695a\u3002 class BaseCase(DfmAssert):\npass\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\nself.assert_file_exists_in_desktop(\"xxx\")\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u903b\u8f91\u4e3e\u4f8b","text":"\u7528\u4f8b\u4ee3\u7801\u8c03\u7528\u903b\u8f91\u4e3e\u4f8b\uff1a # BaseWidget\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n# =============================================\n# TitleWidget\nclass TitleWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_title_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# RightViewWidget\nclass RightViewWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_right_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# =============================================\n# \u51fa\u53e3 DfmWidget\nclass DfmWidget(TitleWidget, RightViewWidget):\npass\n# =============================================\n# in case\nfrom apps.dde_file_manager.widget.dfm_widget import DfmWidget\ndfm = DfmWidget()\ndfm.click_xxx_title_by_ui()\ndfm.click_xxx_right_by_ui()\ndfm.dog.print_desc()\ndfm.ui.print_number()\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u5de5\u7a0b\u6539\u9020\u5b9e\u65bd\u6b65\u9aa4","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_2","title":"1\u3001\u5de5\u7a0b\u4ee3\u7801\u62c9\u53d6","text":"1.1. \u5c06\u81ea\u52a8\u5316\u57fa\u7840\u6846\u67b6\u7684\u529f\u80fd\u62c9\u5230\u672c\u5730 Autotest Basic Frame \uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame 1.2. \u5c06\u5e94\u7528\u5e93\u4ee3\u7801\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u5e94\u7528\u5e93\u7684\u4ed3\u5e93\u547d\u540d\u5e94\u8be5\u662f\u957f\u8fd9\u6837\u7684 autotest_deepin_xxx\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_2","title":"2\u3001\u8c03\u6574\u5de5\u7a0b\u76ee\u5f55","text":"\u6309\u7167 \u65b9\u6848\u8bbe\u8ba1-\u76ee\u5f55\u7ed3\u6784 \u8fdb\u884c\u76ee\u5f55\u8c03\u6574\uff0c\u5c3d\u91cf\u4f7f\u7528\u7f16\u8f91\u5668\u8fdb\u884c\u76f8\u5e94\u7684\u8c03\u6574\uff0c\u7f16\u8f91\u5668\u63a8\u8350\u4f7f\u7528 Pycharm \uff0c\u4ee5\u4e0b\u64cd\u4f5c\u5747\u5728 Pycharm \u91cc\u9762\u53ef\u5b9e\u73b0\u3002 2.1. \u9700\u8981\u79fb\u52a8 py \u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u76f4\u63a5\u5728\u7f16\u8f91\u5668\u91cc\u9762\uff0c\u4f7f\u7528\u9f20\u6807\u9009\u4e2d\u5e76\u6309\u4f4f\uff0c\u4e4b\u540e\u62d6\u52a8\u5230\u76ee\u6807\u4f4d\u7f6e\u5373\u53ef\uff0cPycharm \u4f1a\u5c3d\u53ef\u80fd\u7684\u81ea\u52a8\u89e3\u51b3\u79fb\u52a8\u5bfc\u81f4\u7684\u8def\u5f84\u95ee\u9898\u3002\u6ce8\u610f\uff0c\u6211\u8bf4\u7684\u662f\u201c\u5c3d\u53ef\u80fd\u201d\uff0c\u6709\u4e9b\u9a9a\u64cd\u4f5c\u7f16\u8f91\u5668\u662f\u65e0\u6cd5\u81ea\u52a8\u5904\u7406\u7684\u3002\u5982\u679c\u6ca1\u6709\u88ab\u7f16\u8f91\u5668\u81ea\u52a8\u5904\u7406\u7684\u8def\u5f84\u95ee\u9898\uff0c\u540e\u7eed\u53ea\u80fd\u624b\u52a8\u89e3\u51b3\u3002 2.2. \u9700\u8981\u91cd\u547d\u540d\u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u5728\u7f16\u8f91\u5668\u91cc\u9762\u9009\u4e2d\u6587\u4ef6\uff0c\u7136\u540e\u4f7f\u7528\u5feb\u6377\u952e Shift + F6 \uff08\u5982\u679c\u5feb\u6377\u952e\u6ca1\u53cd\u5e94\uff0c\u6587\u4ef6\u53f3\u952e\u83dc\u5355 Refactor \u2014\u2014 Rename\uff09\uff0c\u7136\u540e\u5728\u8f93\u5165\u6846\u4e2d\u8f93\u5165\u8981\u91cd\u547d\u540d\u7684\u540d\u79f0\uff0c\u540c\u65f6\uff0c\u786e\u8ba4\u52fe\u9009 Search for references \u548c Search in comments and strings \u8fd9\u4e24\u4e2a\u9009\u9879\uff0c\u6700\u540e\u6309\u56de\u8f66\u6216\u8005\u9f20\u6807\u70b9 Refactor \u3002 \u6ce8\u610f\uff0c\u6b64\u65f6\u7f16\u8f91\u5668\u53ef\u80fd\u4f1a\u63d0\u793a\u4f60\uff0c\u4f60\u8fd9\u4e2a\u91cd\u547d\u540d\u7684\u64cd\u4f5c\u5173\u8054\u4e86\u591a\u4e2a\u6a21\u5757\uff0c\u5b83\u88ab\u591a\u4e2a\u5730\u65b9\u90fd\u4f7f\u7528\u5230\u4e86\uff0c\u76f8\u5173\u7684\u6a21\u5757\u662f\u5426\u4e5f\u4e00\u8d77\u6539\u540d\u4e86\uff0c\u8fd9\u4e0d\u5e9f\u8bdd\u5417\uff0c\u7528\u8fd9\u4e2a\u529f\u80fd\u5c31\u662f\u60f3\u628a\u5173\u8054\u5230\u7684\u90fd\u4fee\u6539\uff0c\u4e0d\u7136\u6211\u4e3a\u4ec0\u4e48\u4e0d\u7528\u6587\u7ba1\u7684\u91cd\u547d\u540d\u529f\u80fd\u5462\uff0c\u522b\u60f3\u4e86\uff0c\u76f4\u63a5\u70b9\u5de6\u4e0b\u89d2\u7684 Refactor \u6309\u94ae\uff0c\u5c31\u662f\u5e72\u3002 \u7c7b\u540d\u3001\u51fd\u6570\u540d\u7684\u91cd\u547d\u540d\u90fd\u5c3d\u91cf\u91c7\u7528\u8fd9\u79cd\u65b9\u6848\uff0c\u56e0\u4e3a\u7f16\u8f91\u5668\u4f1a\u81ea\u52a8\u7ed9\u6211\u4eec\u627e\u5230\u5173\u8054\u7684\u5730\u65b9\uff0c\u7136\u540e\u540c\u6b65\u4fee\u6539\u6389\u3002\u4f60\u53ef\u5343\u4e07\u522b\u76f4\u63a5\u5220\u4e86\u4fee\u6539\u540d\u79f0\uff0c\u4e0d\u7136\u4f60\u53ef\u80fd\u4f1a\u82b1\u4e0a\u4e00\u5929\u7684\u65f6\u95f4\u6765\u89e3\u51b3\u91cd\u547d\u540d\u7684\u95ee\u9898\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u5b9e\u73b0\u6838\u5fc3\u5e93\u63a5\u53e3","text":"3.1. BaseWidget \u5728 BaseWidget \u91cc\u9762\u628a\u8be5\u5199\u7684\u90fd\u5199\u597d\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u4e0a\u9762\u7684\u8bbe\u8ba1\u7406\u5ff5\u6765\u5199\u3002 \u5982\u679c\u4f60\u5acc\u9ebb\u70e6\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u6587\u7ba1\u7684\u5b9e\u9645\u5de5\u7a0b\u4ee3\u7801 autotest_dde_file_manager : https://gerrit.uniontech.com/admin/repos/autotest_dde_file_manager \u3002 3.2. \u64cd\u4f5c\u5c42 \u5982\u679c\u4f60\u662f\u65b0\u5199\u9879\u76ee\uff0c\u4f60\u4f1a\u53d1\u73b0\u4e00\u5207\u90fd\u662f\u90a3\u4e48\u7684\u7b80\u5355\u3001\u76f4\u63a5\uff0c\u6309\u7167\u6211\u4eec\u63d0\u4f9b\u7ed9\u4f60\u7684\u63a5\u53e3\u5199\u7528\u4f8b\u7684\u64cd\u4f5c\u65b9\u6cd5\u5c31\u597d\u4e86\u3002 \u5982\u679c\u4f60\u662f\u60f3\u5bf9\u539f\u6765\u7684\u5de5\u7a0b\u8fdb\u884c\u6539\u9020\uff0c\u4f60\u9700\u8981\u6309\u7167\u6838\u5fc3\u5e93\u65b9\u6cd5\u7684\u8c03\u7528\uff0c\u5c06\u4f60\u4e4b\u524d\u5199\u7684\u6bcf\u4e2a\u65b9\u6848\u8fdb\u884c\u5bf9\u5e94\u7684\u4fee\u6539\uff0c\u5305\u62ec\u7c7b\u548c\u65b9\u6cd5\u7684\u547d\u540d\u3001\u65b9\u6cd5\u5185\u6240\u8981\u7528\u5230\u4e0d\u540c\u5b9a\u4f4d\u65b9\u6cd5\u7684\u5199\u6cd5\u4fee\u6539\u3002 \u8fd9\u65f6\u5019\u4f60\u53ef\u80fd\u4f60\u7684\u4ee3\u7801\u4e2d\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u62a5\u9519\uff0c\u4e0d\u7528\u62c5\u5fc3\uff0c\u4f60\u53ef\u4ee5\u4ece\u4e1a\u52a1\u903b\u8f91\u51fa\u53d1\uff0c\u60f3\u6e05\u695a\u8fd9\u4e2a\u65b9\u6cd5\u662f\u5e72\u4ec0\u4e48\u7684\u3001\u64cd\u4f5c\u7684\u5bf9\u8c61\u662f\u4ec0\u4e48\u3001\u53c2\u6570\u662f\u4ec0\u4e48\uff0c\u6ce8\u610f\u8fd9\u4e9b\u4fee\u6539\u662f\u4f1a\u5f71\u54cd\u5230\u7528\u4f8b\u4ee3\u7801\u91cc\u9762\u7684\uff0c\u6ca1\u5173\u7cfb\uff0c\u7528\u4f8b\u91cc\u9762\u672c\u6765\u4e5f\u5e94\u8be5\u88ab\u5173\u8054\u4fee\u6539\u3002 3.3. \u628a\u914d\u7f6e\u6a21\u5757\u5199\u597d\uff0c\u8fd9\u90e8\u5206\u57fa\u672c\u53ef\u4ee5\u590d\u5236\u6587\u7ba1\u7684\u4ee3\u7801\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4_1","title":"4\u3001\u8def\u5f84\u5904\u7406","text":"4.1. \u5bfc\u5165\u8def\u5f84 \u65b9\u6cd5\u548c\u7528\u4f8b\u4e2d\u90fd\u4f1a\u6d89\u53ca\u5230\u5bfc\u5165\u8def\u5f84\u7684\u4fee\u6539\uff0c\u5728\u4fee\u6539\u8def\u5f84\u65f6\uff0c\u5efa\u8bae\u4f60\u4f7f\u7528 Ctrl + Shift + R \u5168\u5c40\u66ff\u6362\uff0c\u4f1a\u5c06\u6574\u4e2a\u9879\u76ee\u4e0b\u7684\u76f8\u540c\u5730\u65b9\u90fd\u4fee\u6539\u5230\uff0c\u5f53\u7136\uff0c\u4f60\u4e5f\u53ef\u4ee5\u5728\u5c0f\u5f39\u7a97\u4e2d\u4fee\u6539\u5168\u5c40\u66ff\u6362\u4e3a\u5c40\u90e8\u76ee\u5f55\u4e0b\u66ff\u6362\u3002\u5904\u7406\u90a3\u79cd\u6ca1\u6709\u5173\u8054\u5173\u7cfb\uff0c\u4f46\u662f\u53c8\u662f\u76f8\u540c\u540d\u79f0\u7684\u91cd\u547d\u540d\uff0c\u6211\u4e5f\u63a8\u8350\u4f7f\u7528\u8fd9\u79cd\u65b9\u5f0f\u8fdb\u884c\u91cd\u547d\u540d\u3002 \u6ce8\u610f\uff0c\u5168\u5c40\u66ff\u6362\u7684\u65b9\u5f0f\u4efb\u7136\u65e0\u6cd5\u4fdd\u8bc1\u771f\u7684\u5168\u5c40\u88ab\u66ff\u6362\u4e86\uff08\u53ef\u80fd\u662f\u7f16\u8f91\u5668\u7684 Bug \u5427\uff09\uff0c\u6240\u4ee5\u4f60\u4ecd\u7136\u9700\u8981\u624b\u52a8\u770b\u4e0b\u5404\u5904\u662f\u5426\u4fee\u6539\u5230\u4f4d\u3002 4.2. \u8d44\u6e90\u8def\u5f84 \u4e00\u4e9b\u7528\u4f8b\u8d44\u6e90\u9700\u8981\u6839\u636e config.py \u91cc\u9762\u7684\u8def\u5f84\u914d\u7f6e\u8fdb\u884c\u8d44\u6e90\u8def\u5f84\u7684\u62fc\u63a5\uff0c\u5982\u679c\u4f60\u539f\u6765\u672c\u6765\u5c31\u6709\u4e00\u4e2a\u51fd\u6570\u4e13\u95e8\u7528\u4e8e\u7ec4\u88c5\u8def\u5f84\u7684\uff0c\u90a3\u4f60\u53ea\u9700\u8981\u4fee\u6539\u8fd9\u4e00\u4e2a\u5730\u65b9\u5c31\u597d\u4e86\uff0c\u5982\u679c\u4f60\u4e4b\u524d\u5e76\u6ca1\u6709\u8fd9\u6837\u7684\u8bbe\u8ba1\uff0c\u90a3\u53ef\u80fd\u9700\u8981\u4fee\u6539\u5927\u91cf\u6d89\u53ca\u5230\u8d44\u6e90\u8def\u5f84\u7684\u5730\u65b9\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5","title":"5\u3001\u8c03\u8bd5\u548c\u7f16\u5199\u7528\u4f8b","text":"\u4ee5\u4e0a\u51e0\u4e2a\u6b65\u9aa4\u505a\u5b8c\uff0c\u57fa\u672c\u5c31\u53ef\u4ee5\u8fdb\u884c\u7528\u4f8b\u4ee3\u7801\u7684\u8c03\u8bd5\u4e86\uff0c\u8fd9\u90e8\u5206\u5de5\u4f5c\u4e3b\u8981\u89e3\u51b3\u4f60\u4e4b\u524d\u51e0\u4e2a\u6b65\u9aa4\u9057\u6f0f\u7684\u95ee\u9898\uff0c\u5982\u679c\u6240\u6709\u7528\u4f8b\u90fd\u8c03\u8bd5\u901a\u8fc7\u4e86\uff0c\u90a3\u4e48\u5de5\u7a0b\u6539\u9020\u5c31\u5168\u90e8\u5b8c\u6210\u4e86\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/","title":"AT \u5f00\u53d1\u89c4\u8303","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u5f00\u53d1\u89c4\u8303\u662f\u6839\u636e\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fd0\u884c\u4e24\u5e74\u591a\u6765\uff0c\u9047\u5230\u95ee\u9898\u89e3\u51b3\u95ee\u9898\u800c\u5f62\u6210\u7684\u4e00\u4e9b\u89e3\u51b3\u65b9\u6848\uff0c\u6216\u8005\u8bf4\u7ecf\u9a8c\u603b\u7ed3\uff1b\u8fd9\u4e9b\u7ecf\u9a8c\u7b26\u5408\u6211\u4eec\u73b0\u9636\u6bb5 AT \u6240\u5e94\u7528\u7684\u573a\u666f\u9700\u8981\uff0c\u4e5f\u662f\u6211\u4eec\u7ecf\u8fc7\u957f\u671f\u601d\u8003\uff0c\u4e0d\u65ad\u8bd5\u9519\u4e0d\u65ad\u4fee\u6b63\uff0c\u5e76\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u5b9e\u8df5\u4e2d\u68c0\u9a8c\u8fc7\u53ef\u884c\u7684\u3002\u4ee5\u6b64\uff0c\u5e0c\u671b\u80fd\u5e2e\u52a9\u53c2\u4e0e\u5230\u81ea\u52a8\u5316\u7684\u76f8\u5173\u4eba\u5458\u51cf\u5c11\u8bd5\u9519\u6210\u672c\uff0c\u66f4\u597d\u3001\u66f4\u5feb\u7684\u7f16\u5199\u7528\u4f8b\u53ca\u7ef4\u62a4\u7528\u4f8b\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_1","title":"\u4e00\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u89c4\u8303","text":"\u6807\u7b7e\u5316\u7ba1\u7406\u6587\u6863\u8bf7\u53c2\u8003\uff1a \u300a\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u64cd\u4f5c\u6307\u5f15\u300b \u4ee5\u4e0b\u8bf4\u51e0\u4e2a\u5bb9\u6613\u51fa\u73b0\u7684\u95ee\u9898\uff1a"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1","title":"1. \u5bf9\u5e94\u5173\u7cfb","text":" \u5199\u5b8c\u81ea\u52a8\u5316\u7528\u4f8b\u4e4b\u540e\uff0c\u8bf7\u5728 CSV \u6587\u4ef6\u4e2d\u6807\u8bb0\u7528\u4f8b\u7684 ID\u3001\u7b49\u7ea7\u3002\u4e3a\u4e86\u63d0\u9192\u6807\u8bb0\uff0c\u6267\u884c\u7528\u4f8b\u65f6\u5728\u9996\u884c\u4f1a\u8f93\u51fa ERROR \u65e5\u5fd7\uff1a CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94\u7684 ID\uff1b \u5728\u6700\u7ec8\u63d0\u4ea4\u4ee3\u7801\u4e4b\u524d\uff0c\u4f60\u9700\u8981\u5728 CSV \u6587\u4ef6\u91cc\u9762\u5c06ID\u3001\u7528\u4f8b\u7b49\u7ea7\u7b49\u6807\u7b7e\u8865\u5168\uff0c\u5982\u679c CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94 ID\uff0c\u540e\u7eed\u5728\u6279\u91cf\u6267\u884c\u7684\u65f6\u5019\uff0c\u8fd9\u4e9b\u7528\u4f8b\u662f\u4e0d\u4f1a\u6267\u884c\u7684\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2","title":"2. \u540d\u79f0\u4e00\u81f4","text":" CSV \u6587\u4ef6\u7684\u6587\u4ef6\u540d\u3001\u7528\u4f8b\u51fd\u6570\u4e2d\u95f4\u7684\u540d\u79f0\u4e00\u81f4\u3001\u7528\u4f8b py \u6587\u4ef6\u4e2d\u95f4\u7684\u540d\u79f0\uff0c\u8fd9\u4e09\u4e2a\u540d\u79f0\u4e00\u81f4\u3002 \u4e3e\u4f8b\uff1a # test_music_001.py\ndef test_music_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u90a3\u4e48 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e3a music.csv\u3002 AT \u6846\u67b6\u5e95\u5c42\u4ee3\u7801\u5b9e\u73b0\u662f\u5c06 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e0e\u7528\u4f8b\u51fd\u6570\u540d\u79f0\u540d\u79f0\uff08item.name\uff09\u8fdb\u884c\u5bf9\u5e94\uff0c\u56e0\u6b64\uff0c\u6ce8\u610f CSV \u6587\u4ef6\u540d\u79f0\u5bf9\u5e94\u7684\u662f\u7528\u4f8b\u51fd\u6570\u540d\u79f0\uff0c\u5373 def test_music_001 \u91cc\u9762\u7684 music \uff0c\u800c\u4e0d\u662f test_music_001.py \u91cc\u9762\u7684 music \u3002 \u8fd9\u91cc\u7ec6\u7ec6\u54c1\u4e00\u4e0b\u54c8~ \u5982\u679c\u4f60\u5c06\u4e0a\u4f8b\u5199\u6210\u4e86\u8fd9\u6837: # test_music_001.py\ndef test_movie_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u7528\u4f8b\u6267\u884c\u6ca1\u95ee\u9898\uff0c\u4f46\u662f\u6807\u7b7e\u5316\u7ba1\u7406\u662f\u4e0d\u751f\u6548\u7684\uff0c\u6846\u67b6\u65e0\u6cd5\u5c06 music.csv\u6587\u4ef6\u91cc\u9762\u6807\u7b7e\uff0c\u6dfb\u52a0\u5230 test_movie_001\u8fd9\u4e2a\u7528\u4f8b\u4e2d\uff0c\u56e0\u4e3a\u4ed6\u4eec\u6ca1\u6709\u5bf9\u5e94\u5173\u7cfb\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#tag","title":"\u4e8c\u3001\u5206\u652f\u53ca tag \u7ba1\u7406\u89c4\u8303","text":"\u53c2\u8003\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u4ee3\u7801\u7ba1\u7406\u89c4\u8303\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2-tag","title":"2. \u5e94\u7528\u5e93 tag","text":" \u5e94\u7528\u5e93 tag \u6839\u636e\u5e94\u7528\u4ea4\u4ed8\u8282\u70b9\u751f\u6210\uff0c\u6bcf\u6b21\u6253 tag \u4e4b\u524d\uff0c\u76f8\u5173\u6d4b\u8bd5\u4eba\u5458\u9700\u8981\u8fdb\u884c\u7528\u4f8b\u8c03\u8bd5\uff1b \u8c03\u8bd5\u7528\u4f8b\u662f\u6307\u7684\u5728\u5168\u67b6\u6784\uff08x86\u3001arm\u3001mips\uff09\u4e0a\u8c03\u8bd5\u901a\u8fc7\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\u8fbe\u5230 90% \u4ee5\u4e0a\u624d\u80fd\u6253 tag\uff0c\u901a\u8fc7 Jenkins \u6267\u884c\u5668\u6267\u884c\u7528\u4f8b\uff0c\u4fdd\u7559\u901a\u8fc7\u7387\u7ed3\u679c\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\uff1a\u901a\u8fc7\u7528\u4f8b\u6570 / (\u603b\u7528\u4f8b\u6570 - \u5df2\u5e9f\u5f03\u7528\u4f8b) \u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u7b97\u901a\u8fc7 Jenkins \u6267\u884c\u5668 \u4f60\u53ef\u80fd\u4f1a\u5728\u4e00\u4e2a\u4ea4\u4ed8\u5468\u671f\u5185\u6301\u7eed\u7684\u8fdb\u884cAT\u7528\u4f8b\u8c03\u8bd5\uff0c\u4f46\u662f\u6700\u7ec8 AT \u7528\u4f8b\u6253 tag \u7684\u5e94\u7528\u7248\u672c\uff0c\u9700\u8981\u4f7f\u7528\u5e94\u7528\u96c6\u6210\u4ea4\u4ed8\u7684\u6700\u65b0\u5e94\u7528\u7248\u672c\uff0c\u53ef\u4ee5\u4f7f\u7528\u5e94\u7528\u7684\u63d0\u6d4b\u7248\u672c\uff1b\u4e00\u5b9a\u8981\u786e\u4fdd\u8c03\u8bd5\u7528\u4f8b\u7684\u5e94\u7528\u7248\u672c\u662f\u6700\u65b0\u7684\uff0c\u4e0d\u7136\u96c6\u6210\u8fdb\u53bb\u4e4b\u540e\uff0c\u6301\u7eed\u96c6\u6210\u5c31\u4f1a\u51fa\u95ee\u9898\uff1b tag \u53f7\u600e\u4e48\u6253\uff1f \u6839\u636e\u6301\u7eed\u96c6\u6210\u7684\u8981\u6c42\u751f\u6210\uff0c\u5176\u4e2d\u5e94\u7528\u7248\u672c\u53f7\u9700\u8981\u4e0e\u9879\u76ee\u7ecf\u7406\u786e\u8ba4\u672c\u6b21\u5373\u5c06\u96c6\u6210\u7684\u5e94\u7528\u7248\u672c\u53f7\u662f\u591a\u5c11\uff1b tag \u7684 commit \u4fe1\u606f\u683c\u5f0f\uff1a # commit msg\nversion:5.6.5\n \u5176\u4e2d 5.6.5 \u5199\u5e94\u7528\u7684\u96c6\u6210\u7248\u672c\u53f7\u3002 \u751f\u6210 tag \u7684\u547d\u4ee4\u53c2\u8003\uff1a\u300aGit \u6807\u7b7e\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3-tag","title":"3. \u57fa\u7840\u6846\u67b6 tag","text":"\u57fa\u7840\u6846\u67b6 tag \u4e0d\u4e0e\u4e1a\u52a1\u6302\u94a9\uff0c\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u6309\u9700\u53d1\u5e03\u7248\u672c\uff0c\u5728\u6839\u76ee\u5f55\u4e0b CURRENT \u6587\u4ef6\u4e2d\u8bb0\u5f55\u7684\u5f53\u524d\u7248\u672c\u53f7\u548c\u5386\u53f2\u7248\u672c\u53f7\uff0c\u53ca\u5176\u5bf9\u5e94\u65b0\u589e\u4e86\u54ea\u4e9b\u529f\u80fd\uff0c\u6709\u52a9\u4e8e\u5e94\u7528\u9009\u62e9\u5408\u9002\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\u3002 # CURRENT\n[current]\ntag = 0.9.5\n \u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u7684 control \u6587\u4ef6\u8bb0\u5f55\u5f53\u524d\u5e94\u7528\u5e93\u4f9d\u8d56\u7684\u57fa\u7840\u5e93\u7248\u672c\u3002 # control\n[Depends]\nautotest-basic-frame = 0.9.5\n \u7528\u4f8b\u5728\u6267\u884c\u65f6\u4f1a\u6821\u9a8c\u4e24\u4e2a\u6587\u4ef6\u7684\u7248\u672c\u53f7\u662f\u5426\u4e00\u81f4\uff0c\u5982\u679c\u4e0d\u4e00\u81f4\uff0c\u4f1a\u6253\u5370 error \u65e5\u5fd7\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_2","title":"\u4e09\u3001\u4ed3\u5e93\u6743\u9650\u7ba1\u7406","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_1","title":"1. \u57fa\u7840\u6846\u67b6","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u4ed3\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame \u57fa\u7840\u6846\u67b6\u4e0d\u5141\u8bb8\u533f\u540d\u8bbf\u95ee\uff0c\u5982\u679c\u4f60\u767b\u5f55 gerrit \u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u8bbf\u95ee\u4ee5\u4e0a\u94fe\u63a5\uff0c\u5219\u9700\u8981\u7533\u8bf7\u8bbf\u95ee\u6743\u9650\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_1","title":"2. \u5e94\u7528\u4ed3\u5e93","text":" \u81ea\u52a8\u5316\u5e94\u7528\u4ed3\u5e93\uff1a https://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684 app_name \u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_3","title":"\u56db\u3001\u65b9\u6cd5\u7f16\u5199&\u8c03\u7528\u89c4\u8303","text":"\u65b9\u6cd5\u7f16\u5199\u6574\u4f53\u8bbe\u8ba1\u601d\u8def\u53c2\u8003\uff1a[\u300aAT\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b]"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_2","title":"1. \u65b9\u6cd5\u7f16\u5199","text":"\u5199\u65b9\u6cd5\u7684\u65f6\u5019\u6ce8\u610f\u65b9\u6cd5\u5f52\u5c5e\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget\uff0c\u65b9\u6cd5\u662f\u5728\u54ea\u4e2a\u533a\u57df\u64cd\u4f5c\u7684\uff0c\u5c31\u5199\u5728\u54ea\u4e2a\u7c7b\u91cc\u9762\u3002 \u4e3e\u4f8b\uff1a from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n\"\"\"\u70b9\u51fb\u6807\u9898\u680fxxx\"\"\"\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_2","title":"2. \u65b9\u6cd5\u8c03\u7528","text":" \u5728\u7528\u4f8b\u4e2d\u8c03\u7528\u65b9\u6cd5\uff0c\u901a\u8fc7\u8be5\u5e94\u7528\u552f\u4e00\u7684\u51fa\u53e3\u8fdb\u884c\u8c03\u7528\uff0c\u6bd4\u5982\u6587\u7ba1\uff1a class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n \u4e0d\u8981\u5728\u7528\u4f8b\u4e2d\u5355\u72ec\u53bb\u8c03\u7528 TitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u8fd9\u4e9b\u7c7b\uff0c\u5426\u5219\u540e\u671f\u7528\u4f8b\u4f1a\u53d8\u5f97\u4e0d\u597d\u7ef4\u62a4\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_4","title":"\u4e94\u3001\u7528\u4f8b\u7f16\u5199\u89c4\u8303","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_3","title":"1. \u57fa\u4e8e\u7c7b\u5199\u7528\u4f8b","text":"\u6240\u6709\u7528\u4f8b\u90fd\u5e94\u8be5\u57fa\u4e8e\u7c7b\u53bb\u5199\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001(self):\n\"\"\"\u97f3\u4e50\u542f\u52a8\"\"\"\n \u6ce8\u610f\u4ee5\u4e0b\u51e0\u70b9\uff1a \u7c7b\u540d\u4e0d\u8981\u968f\u4fbf\u53d6\uff0c\u540c\u4e00\u4e2a\u5e94\u7528\u5e94\u8be5\u4f7f\u7528\u540c\u4e00\u4e2a\u7c7b\u540d\uff0c\u7528\u4f8b\u7c7b\u540d\u79f0\u5fc5\u987b\u4ee5 Test \u5f00\u5934\uff0c\u9075\u5faa\u5927\u9a7c\u5cf0\u547d\u540d\u89c4\u8303\uff1b \u7528\u4f8b\u7c7b\u7ee7\u627f BaseCase\uff0c\u4e00\u4e2a\u5e94\u7528\u53ea\u6709\u4e00\u4e2a BaseCase \u4e00\u4e2a py \u6587\u4ef6\u91cc\u9762\u53ea\u6709\u4e00\u4e2a\u7c7b\uff0c\u6211\u4eec\u79f0\u4e3a\u4e00\u4e2a\u6d4b\u8bd5\u7c7b\uff1b \u4e00\u4e2a\u7c7b\u91cc\u9762\u53ef\u4ee5\u6709\u591a\u4e2a\u7528\u4f8b\u51fd\u6570\uff0c\u8fd9\u53d6\u51b3\u8fd9\u6761\u7528\u4f8b\u6709\u591a\u5c11\u4e2a\u6d4b\u8bd5\u70b9\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001_1(self):\n\"\"\"\u4efb\u52a1\u680f\u542f\u52a8\u97f3\u4e50\"\"\"\ndef test_music_001_2(self):\n\"\"\"\u542f\u52a8\u5668\u542f\u52a8\u97f3\u4e50\"\"\" \ndef test_music_001_3(self):\n\"\"\"\u684c\u9762\u542f\u52a8\u97f3\u4e50\"\"\"\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_3","title":"2. \u7528\u4f8b\u51fd\u6570\u89c4\u8303","text":" \u7528\u4f8b\u51fd\u6570\u4ee5 test \u5f00\u5934\uff0c\u9075\u5faa\u86c7\u5f62\u547d\u540d\u89c4\u8303\uff0c\u4e2d\u95f4\u4e3a\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0\uff0c\u540e\u9762\u52a0\u7528\u4f8b ID\uff0c\u6700\u540e\u52a0\u6d4b\u8bd5\u70b9\u5e8f\u53f7\uff0c\u5373 test_${module}_${case_id}[_${index}] \uff1b \u6bd4\u5982\uff1atest_music_001_1\uff0cindex \u4ece 1 \u5f00\u59cb\u3002 \u51fd\u6570\u529f\u80fd\u8bf4\u660e\u91cc\u9762\u5199\u7528\u4f8b\u6807\u9898\uff0c\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u6807\u9898\u5373\u53ef\uff0c\u6ce8\u610f\u7528\u4e09\u5bf9\u53cc\u5f15\u53f7\uff0c\u4e0d\u8981\u7528\u5176\u4ed6\u6ce8\u91ca\uff0c\u66f4\u4e0d\u8981\u7528\u4e95\u53f7\u6ce8\u91ca\u5199\u7528\u4f8b\u6807\u9898\uff1b \u76f4\u63a5\u590d\u5236 PMS \u7528\u4f8b \u7528\u4f8b\u6b65\u9aa4\u76f4\u63a5\u5c06 PMS \u4e0a\u7528\u4f8b\u6b65\u9aa4\u548c\u9884\u671f\u590d\u5236\u8fdb\u6765\uff0c\u7136\u540e\u8fdb\u884c\u6279\u91cf\u6ce8\u91ca\uff08ctrl + /\uff09\uff0c\u5728\u6ce8\u91ca\u7684\u57fa\u7840\u4e0a\u53bb\u5199\u7528\u4f8b\u811a\u672c\u4f1a\u66f4\u52a0\u65b9\u4fbf\u5168\u9762\uff0c\u4e5f\u6bd4\u4f60\u81ea\u5df1\u5199\u6ce8\u91ca\u66f4\u8282\u7ea6\u65f6\u95f4\uff1a \u4e3e\u4f8b\uff0cPMS \u7528\u4f8b\uff1a \u76f4\u63a5\u9009\u4e2d\u7528\u4f8b\u5185\u5bb9\uff0c\u590d\u5236\u4e0b\u6765\uff0c\u7136\u540e\u7c98\u8d34\u5230\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c\u4e2d\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\n \u4e0a\u4f8b\u4e2d\u4e95\u53f7\u6ce8\u91ca\u90e8\u5206\u5c31\u662f\u76f4\u63a5\u4ece PMS \u4e0a\u590d\u5236\u8fc7\u6765\u7684\uff0c\u5728\u6b64\u57fa\u7840\u4e0a\u5199\u7528\u4f8b\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\nmusic = DeepinMusicWidget()\nmusic.click_singer_btn_in_music_by_ui()\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\nmusic.click_icon_mode_in_music_by_ui()\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\nmusic.double_click_first_singer_in_singer_icon_view_by_ui()\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\nself.assert_xxx\n \u4f60\u770b\uff0c\u975e\u5e38\u6e05\u695a\u6bcf\u4e00\u6b65\u5728\u505a\u4ec0\u4e48\uff0c\u91cd\u70b9\u662f\u7701\u53bb\u4e86\u5199\u6ce8\u91ca\u7684\u65f6\u95f4\uff0c\u771f\u7684\u7092\u9e21\u65b9\u4fbf\u3002 \u4e0d\u5199 if __name__ == '__main__':\uff0c\u4e0d\u5199\u591a\u4f59\u7684\u4ee3\u7801\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3","title":"3. \u6570\u636e\u9a71\u52a8","text":" \u5982\u679c\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u662f\u76f8\u540c\u7684\uff0c\u53ea\u662f\u4e00\u4e9b\u53c2\u6570\u53d8\u5316\uff0c\u5c3d\u91cf\u4f7f\u7528\u6570\u636e\u9a71\u52a8\u6765\u5b9e\u73b0\u7528\u4f8b\uff1b \u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u6570\u636e\u9a71\u52a8\u7684\u6570\u636e\uff0c\u4e0d\u80fd\u56e0\u6b64\u5f15\u5165\u4f9d\u8d56\uff0c\u5c3d\u91cf\u4f7f\u7528\u4e00\u4e9b\u6807\u51c6\u5e93\u80fd\u8bfb\u53d6\u7684\u6587\u4ef6\u683c\u5f0f\uff0c\u6bd4\u5982 json\u3001ini\u3001CSV\u3001xml\u3001txt \u7b49\u6587\u4ef6\u683c\u5f0f\uff1b\u4e0d\u5efa\u8bae\u4f7f\u7528 Yaml\u3001Excel\u3001MySQL \u7b49\u6570\u636e\u683c\u5f0f\uff1b \u8bfb\u53d6\u6570\u636e\u65f6\u4e5f\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff0c\u5982\u4f7f\u7528 pandas \u5904\u7406 CSV \u5c31\u5c5e\u4e8e\u5927\u6750\u5c0f\u7528\u4e86\uff0c\u6b63\u5e38\u7684\u6570\u636e\u9a71\u52a8\u8fd8\u6ca1\u5230\u9700\u8981\u5927\u6570\u636e\u5206\u6790\u6765\u5904\u7406\u7684\u5730\u6b65\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u5728 widget/ddt/ \u76ee\u5f55\u4e0b\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5199\u6cd5\uff1a @pytest.mark.parametrize(\"value\", data)\ndef test_smb_049(self, value):\n \u4ee5\u4e0a\u8fd9\u79cd\u53c2\u6570\u5316\u7684\u5199\u6cd5\u672c\u8eab\u6ca1\u4ec0\u4e48\u95ee\u9898\uff0c\u4f46\u662f\uff0c\u8fd9\u91cc\u5fc5\u987b\u8981\u8865\u5145\u4e00\u4e2a\u6ca1\u6709\u7528\u7684\u5c0f\u77e5\u8bc6\uff1a \u5982\u679c\u53c2\u6570\u5316\u6570\u636e\u91cc\u9762\u7684\u5b57\u7b26\u4f1a\u539f\u5c01\u4e0d\u52a8\u7684\u8f93\u51fa\u5230 item.name \u91cc\u9762\uff0c\u663e\u793a\u975e\u5e38\u4e0d\u4f18\u96c5\uff0c\u800c\u4e14\u53ef\u4ee5\u4f1a\u5f15\u5165\u4e00\u4e9b\u610f\u60f3\u4e0d\u5230\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u611f\u53d7\u4e00\u4e0b\uff1a \u53c2\u6570\uff1a data = [\n\"\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\", \"qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678\",\n]\n \u73b0\u8c61\u662f\u8fd9\u6837\u8272\u513f\u7684\uff1a test_smb_049.py::TestFileManager::test_smb_049[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09]\ntest_smb_049.py::TestFileManager::test_smb_049[qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui]\ntest_smb_049.py::TestFileManager::test_smb_049[12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678]\n \u8bf4\u5b9e\u8bdd\uff0c\u770b\u7740\u5fc3\u91cc\u5835\u5f97\u614c\uff0c\u5982\u679c\u8fd9\u91cc\u9762\u5305\u542b\u4e00\u4e9b\u7279\u6b8a\u5b57\u7b26\u6216\u8005\u662f\u8d85\u957f\uff0c\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u5f88\u5947\u5999\u7684\u4e8b\u60c5\u53d1\u751f\u3002 parametrize \u91cc\u9762\u6709\u4e2a\u53c2\u6570\uff1aids\uff0c\u53ef\u4ee5\u89e3\u51b3\u6b64\u7c7b\u95ee\u9898\uff0c\u5c31\u50cf\u8fd9\u6837\uff1a @pytest.mark.parametrize(\"value\", data, ids=[1, 2, 3])\ndef test_smb_049(self, value):\n \u518d\u6765\u611f\u53d7\u4e00\u4e0b\uff1a test_smb_049.py::TestFileManager::test_smb_049[1]\ntest_smb_049.py::TestFileManager::test_smb_049[2]\ntest_smb_049.py::TestFileManager::test_smb_049[3]\n \u660e\u663e\u597d\u591a\u4e86\uff0c\u6240\u4ee5\u5c3d\u91cf\u4f7f\u7528 ids \u8fd9\u4e2a\u53c2\u6570\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 fixture \u7684\u6570\u636e\u9a71\u52a8\u65b9\u5f0f\uff0c\u6846\u67b6\u867d\u7136\u652f\u6301\uff0c\u4f46\u53ef\u8bfb\u6027\u6bd4\u8f83\u5dee\uff1b\u5982\u679c\u4f60\u4e0d\u77e5\u9053\u8fd9\u53e5\u8bdd\u5728\u8bf4\u5565\uff0c\u90a3\u4f60\u53ef\u4ee5\u5ffd\u7565\uff0c\u6211\u4e5f\u4e0d\u6253\u7b97\u8be6\u7ec6\u8bf4\u8fd9\u79cd\u5b9e\u73b0\u65b9\u5f0f\uff0c\u64cd\u4f5c\u6bd4\u8f83\u9a9a\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4","title":"4. \u65ad\u8a00\u8d44\u6e90","text":" \u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u76f4\u63a5\u653e\u5728\u7528\u4f8b\u6a21\u5757\u7684\u540c\u7ea7\u76ee\u5f55\u4e0b\u7684 assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0 + \u7528\u4f8b ID \u547d\u540d\uff1b \u56fe\u50cf\u8bc6\u522b\u65ad\u8a00\uff0c\u4e0d\u8981\u622a\u53d6\u4e00\u5f20\u5f88\u5927\u7684\u56fe\uff0c\u56fe\u7247\u8d44\u6e90\u5305\u542b\u7684\u5143\u7d20\u592a\u591a\u4e86\uff0c\u975e\u5e38\u5bb9\u6613\u53d7\u5230\u9700\u6c42\u5f71\u54cd\uff0c\u5efa\u8bae\u662f\u8fdb\u884c\u5c40\u90e8\u7684\u65ad\u8a00\uff1b \u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u5339\u914d\u5ea6\u662f 0.9\uff0c\u5982\u679c\u65ad\u8a00\u7684\u573a\u666f\u5bf9\u4e8e\u7cbe\u786e\u5ea6\u8981\u6c42\u6ca1\u90a3\u4e48\u9ad8\uff0c\u53ef\u4ee5\u5728\u65ad\u8a00\u8bed\u53e5\u91cc\u9762\u4f20\u5165\u5c0f\u4e8e 0.9 \u7684\u53c2\u6570\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5","title":"5. \u5143\u7d20\u5b9a\u4f4d","text":" \u7528\u4e8e\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u4e2d\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u547d\u540d\u4e3a\u8be5\u5143\u7d20\u7684\u540d\u79f0\uff1b \u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u622a\u53d6\u65f6\u5c3d\u91cf\u7cbe\u786e\u5230\u8fd9\u4e2a\u5177\u4f53\u7684\u6309\u94ae\uff0c\u56fe\u7247\u4e5f\u4e0d\u8981\u592a\u5927\uff1b \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u64cd\u4f5c\u8f83\u5feb\uff0c\u5408\u7406\u52a0\u5165\u7b49\u5f85\u65f6\u95f4\u80fd\u63d0\u9ad8\u7528\u4f8b\u7684\u7a33\u5b9a\u6027\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6","title":"6. \u7528\u4f8b\u8d44\u6e90","text":" \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u4f7f\u7528\u5230\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u6bd4\u5982\u97f3\u4e50\u53ef\u80fd\u9700\u8981\u4e00\u4e9b mp3 \u7684\u8d44\u6e90\u7528\u4e8e\u6d4b\u8bd5\uff0c\u5b58\u653e\u5728 widget/case_res \u76ee\u5f55\u4e0b\uff0c\u524d\u63d0\u662f\u8fd9\u4e9b\u8d44\u6e90\u4e0d\u8d85\u8fc7 10M\uff1b \u5982\u679c\u662f\u4e00\u4e9b\u6bd4\u8f83\u5927\u7684\u8d44\u6e90\uff0c\u5efa\u8bae\u653e\u5230\u7edf\u4e00\u7684 ftp \u670d\u52a1\u5668 \uff08ftp://10.8.10.245\uff09\uff0c\u9700\u8981\u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\u518d\u4e0b\u8f7d\u4e0b\u6765\uff1b f\"wget ftp://{Config.FTP_IP}/uploads/\u591a\u5a92\u4f53/\u5f71\u9662/auto/{file_name};unzip {file_name};rm -rf {file_name};\"\n \u6d4b\u8bd5\u8d44\u6e90\u4e0b\u8f7d\u5230\u5e94\u7528 widget/case_res \u76ee\u5f55\u4e0b\uff1b \u7981\u6b62\u5c06\u6d4b\u8bd5\u8d44\u6e90\u5b58\u653e\u5728\u4e2a\u4eba\u7684\u673a\u5668\u4e0a\uff1b \u5e94\u8be5\u5c3d\u91cf\u4fdd\u8bc1\uff0c\u4e00\u4e2a\u8d44\u6e90\u5728\u4e00\u6b21\u7528\u4f8b\u6267\u884c\u4e2d\u53ea\u9700\u8981\u4e0b\u8f7d\u4e00\u6b21\uff0c\u6240\u4ee5\u4f60\u4e0d\u80fd\u6bcf\u6b21\u4f7f\u7528\u7684\u65f6\u5019\u90fd\u53bb\u4e0b\u8f7d\uff0c\u8fd9\u6837\u53ef\u80fd\u4f1a\u8017\u8d39\u5927\u91cf\u7684\u7f51\u7edc\u8d44\u6e90\uff0c\u800c\u56e0\u4e3a\u5148\u5224\u65ad\u672c\u5730\u662f\u5426\u5b58\u5728\u6b64\u8d44\u6e90\uff0c\u5982\u679c\u4e0d\u5b58\u5728\u518d\u53bb\u4e0b\u8f7d\uff1b \u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u5c06\u8d44\u6e90\u62f7\u8d1d\u5230\u5bf9\u5e94\u7684\u6d4b\u8bd5\u76ee\u5f55\u4e0b\uff0c\u6bd4\u5982\u5c06 mp3 \u6587\u4ef6\u62f7\u8d1d\u5230 ~/Music \u76ee\u5f55\u4e0b\uff0c\u4f46\u662f\u6211\u4eec\u66f4\u5efa\u8bae\u4f60\u4f7f\u7528\u53d1\u9001\u5feb\u6377\u94fe\u63a5\u7684\u65b9\u5f0f\u66ff\u4ee3\u62f7\u8d1d\u7684\u64cd\u4f5c\uff0c\u56e0\u4e3a\u5728\u62f7\u8d1d\u5927\u6587\u4ef6\u65f6\u662f\u5f88\u6d88\u8017\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u800c\u521b\u5efa\u94fe\u63a5\u5219\u4e0d\u4f1a\uff1b @classmethod\ndef recovery_many_movies_in_movie_by_cmd(cls):\n\"\"\"\u6062\u590d\u591a\u4e2a\u89c6\u9891\u6587\u4ef6\u81f3\u89c6\u9891\u76ee\u5f55\u4e2d\"\"\"\nwork_path = f\"/home/{Config.USERNAME}/Videos/auto\"\ncode_path = f\"{Config.CASE_RES_PATH}/auto\"\ncls.run_cmd(f\"rm -rf {work_path};mkdir {work_path}\")\nsleep(1)\nflag = False\nif not exists(code_path):\ncls.run_cmd(f\"mkdir -p {code_path}\")\nflag = True\nlogger.info(f\"ln -s {code_path}/* {work_path}/\")\ncls.run_cmd(\nf\"cd {code_path}/;\"\nf\"{cls.wget_file('auto.zip') if flag else ''}\"\nf\"ln -s {code_path}/* {work_path}/ > /dev/null 2>&1\"\n)\n \u8d44\u6e90\u4e0b\u8f7d\u8fc7\u7a0b\u4e2d\u6ce8\u610f\u8d85\u65f6\u7684\u95ee\u9898\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u5f88\u5927\uff0c\u8981\u7279\u522b\u6ce8\u610f\u8fd9\u95ee\u9898\uff0c\u5982\u679c\u4f60\u4f7f\u7528\u5f3a\u5236\u7b49\u5f85\u4e0b\u8f7d\u7ed3\u675f( os.system )\uff0c\u53ef\u80fd\u4f1a\u9020\u6210\u7528\u4f8b\u6267\u884c\u65f6\u957f\u53d8\u5f97\u4e0d\u53ef\u63a5\u53d7\uff0c\u76ee\u524d\u6211\u4eec\u53d1\u73b0\u5728\u6301\u7eed\u96c6\u6210\u73af\u5883\u6267\u884c\u65f6\u7f51\u7edc\u4e0b\u8f7d\u901f\u5ea6\u5f88\u6162\uff0c\u6240\u4ee5\u8d85\u65f6\u673a\u5236\u662f\u5f88\u6709\u5fc5\u8981\u7684\uff1brun_cmd \u65b9\u6cd5\u6709\u4e00\u4e2a\u9ed8\u8ba4\u8d85\u65f6\u7684\u65f6\u95f4\uff0c\u4f60\u53ef\u4ee5\u6839\u636e\u8d44\u6e90\u5927\u5c0f\u5bf9\u8d85\u65f6\u65f6\u95f4\u8fdb\u884c\u8c03\u6574\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_5","title":"\u516d\u3001\u7528\u4f8b\u8c03\u8bd5\u6280\u5de7","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_4","title":"1. \u65e5\u5fd7","text":" \u4e00\u5b9a\u8981\u5148\u770b\u62a5\u9519\uff0c\u770b error \u65e5\u5fd7\uff0c\u901a\u5e38\u80fd\u660e\u786e\u7684\u544a\u8bc9\u4f60\u5177\u4f53\u54ea\u91cc\u4ee3\u7801\u62a5\u9519\uff1b \u7ed3\u5408\u62a5\u9519\u70b9\u524d\u9762\u7684error\u3001 info \u548c debug \u65e5\u5fd7\u770b\u5426\u662f\u6b63\u5e38\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_4","title":"2. \u65ad\u70b9\u8c03\u8bd5","text":" \u65b9\u6cd5\u62a5\u9519\uff1a \u5728\u65b9\u6cd5\u5e93\u4e2d\u627e\u5230\u5bf9\u5e94\u7684\u65b9\u6cd5\uff0c\u5355\u72ec\u8c03\u7528\uff0c\u770b\u662f\u5426\u80fd\u6b63\u5e38\u6267\u884c\uff1b \u901a\u5e38\u5355\u4e2a\u65b9\u6cd5\u7684\u6267\u884c\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u62a5\u9519\uff0c\u5f88\u5feb\u5c31\u80fd\u6392\u67e5\u51fa\u95ee\u9898\uff1b\u5728\u65b9\u6cd5\u5185\u90e8\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u65b9\u6cd5\u5185\u90e8\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u8c03\u7528\u6ca1\u95ee\u9898\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u62a5\u9519\u7684\u65b9\u6cd5\u524d\u9762\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u7528\u4f8b\u7684\u4e1a\u52a1\u903b\u8f91\u548c\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u65ad\u8a00\u62a5\u9519\uff1a \u65ad\u8a00\u4e3a\u6570\u636e\u65ad\u8a00\uff0c\u6839\u636e\u8868\u8fbe\u5f0f\u8fdb\u884c\u65ad\u8a00\u8bed\u53e5\u8fdb\u884c\u4fee\u6539\uff1b \u6587\u4ef6\u751f\u6210\u7c7b\u65ad\u8a00\uff0c\u67e5\u770b\u662f\u5426\u9700\u8981\u52a0\u7b49\u5f85\u65f6\u95f4\uff1b \u56fe\u50cf\u65ad\u8a00\uff0c\u5728\u65ad\u8a00\u8bed\u53e5\u5904\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u7528\u4f8b\u8fd0\u884c\u5230\u65ad\u8a00\u5904\u4f1a\u505c\u6b62\uff0c\u67e5\u770b\u6b64\u65f6\u65ad\u8a00\u7684\u56fe\u7247\u4e0e\u7528\u4f8b\u6267\u884c\u7684\u73b0\u573a\u5b58\u5728\u4ec0\u4e48\u5dee\u5f02\uff0c\u6b64\u65f6\u4e5f\u53ef\u4ee5\u8fdb\u884c\u91cd\u65b0\u622a\u56fe\uff0c\u4ece\u800c\u66ff\u6362\u65b0\u7684\u56fe\u7247\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3_1","title":"3. \u8fdc\u7a0b\u6267\u884c","text":" \u8fdc\u7a0b\u6267\u884c\u6307\u7684\u662f\u7f16\u8f91\u5668\u901a\u8fc7\u6307\u5b9a\u8fdc\u7a0b\u89e3\u91ca\u5668\u6267\u884c\u81ea\u52a8\u5316\u4ee3\u7801\uff1b \u8fdc\u7a0b\u6267\u884c\u7684\u597d\u5904\u662f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u7684 Debug \u8fd0\u884c\uff0c\u4e0d\u7528\u5728\u6d4b\u8bd5\u673a\u4e0a\u6253\u5f00\u7f16\u8f91\u5668\uff0c\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u66f4\u5feb\uff1b \u652f\u6301\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u7684\u7f16\u8f91\u5668\uff1a \u4e13\u4e1a\u7248 Pycharm VScode \uff0c\u9700\u8981\u4f7f\u7528\u63d2\u4ef6 Remote-SSH \u8fdc\u7a0b\u6267\u884c\u914d\u7f6e \u4ee5 Pycharm \u4e3a\u4f8b\uff1a File \u2014> Settings \u2014> Project \u2014> Python Interpreter \u2014> \u53f3\u8fb9\u8bbe\u7f6e\u6309\u94ae \u2014> Add... \u2014> SSH Interpreter \u2014> New server configuration(\u586b\u5165host\u548cusername) \u2014> Next \u2014> password\uff08\u6d4b\u8bd5\u673a\u5bc6\u7801\uff09 \u2014> Interpreter(\u9009\u62e9\u8fdc\u7a0b\u89e3\u91ca\u5668) \u2014> Finish "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4_1","title":"4. \u73af\u5883\u6e05\u7406","text":" \u5982\u679c\u7528\u4f8b\u91cc\u9762\u7684 teardown \u6ca1\u6709\u6267\u884c\uff0c\u5927\u6982\u7387\u662f\u56e0\u4e3a setup \u91cc\u9762\u4ee3\u7801\u62a5\u9519\uff0c\u8fd9\u4e24\u4e2a\u662f\u4e00\u5bf9\u7684\uff0csetup \u91cc\u9762\u62a5\u9519\uff0cteardown \u91cc\u9762\u7684\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\uff1b \u76ee\u524d\u6211\u4eec\u5df2\u7ecf\u5c06\u5404\u5e94\u7528\u7684 clean_all \u8fd9\u4e2a fixture \u6539\u6210\u4e86\u7ec8\u7ed3\u5668\uff0c\u786e\u4fdd\u59cb\u7ec8\u80fd\u6267\u884c\u5230\u8fd9\u6b65\uff0c\u4f46\u662f\u7528\u4f8b\u91cc\u9762\u7684 fixture\uff0c\u8fd8\u662f\u9700\u8981\u6211\u4eec\u5c0f\u5fc3\u5904\u7406\uff1b \u8981\u6267\u884c clean_all \u9700\u8981\u5728\u7f16\u8f91\u5668\u8fd0\u884c\u53c2\u6570\u52a0 --clean yes\uff0c\u5199\u7528\u4f8b\u7684\u65f6\u5019\u8bf7\u52a0\u4e0a\uff0c\u4e0d\u7136\u4f60\u4e0d\u786e\u5b9a\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u7684\u73af\u5883\u662f\u5426\u6062\u590d\uff1b setup \u53ef\u4ee5\u4e0d\u8981\uff0c\u5c06 setup \u653e\u5230\u7528\u4f8b\u91cc\u9762\u662f\u4e00\u79cd\u7a33\u59a5\u7684\u505a\u6cd5\uff0cteardown \u4e00\u5b9a\u8981\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5_1","title":"5. \u5143\u7d20\u5b9a\u4f4d\u4e0d\u51c6\uff08\u5750\u6807\u8fd4\u56de\u4e0d\u5bf9\uff09","text":" \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u53ef\u80fd\u53d7\u5230\u7a97\u53e3 ID \u7684\u53d8\u5316\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u9ed8\u8ba4\u53d6\u6700\u65b0\u7684\u4e00\u4e2a\u7a97\u53e3\u7528\u4e8e\u5b9a\u4f4d\uff0c\u4f46\u5982\u679c\u5b9e\u9645\u9700\u8981\u5b9a\u4f4d\u7684\u4e0d\u662f\u6700\u65b0\u7684\u7a97\u53e3\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u91cd\u65b0\u5b9e\u4f8b\u5316\u65b9\u6cd5\u7c7b\u5bf9\u8c61\uff0c\u5e76\u5728\u7c7b\u4e2d\u4f20\u5165\u5bf9\u5e94\u7684\u7a97\u53e3\u5e8f\u53f7\uff1b \u57fa\u4e8e\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u76ee\u524d\u9047\u5230\u7684\u7b14\u8bb0\u672c\u4e0a\uff0c\u7531\u4e8e\u5c4f\u5e55\u7f29\u653e\u6bd4\u4f8b\u4e3a 1.25\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u6211\u4eec\u9ed8\u8ba4\u4f7f\u7528\u7f29\u653e\u6bd4\u4f8b\u4e3a 1\uff1b \u57fa\u4e8e\u56fe\u50cf\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u76ee\u6807\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b \u57fa\u4e8e OCR \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u6587\u5b57\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u540c\u6837\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6_1","title":"6. \u952e\u9f20\u64cd\u4f5c\u4e0d\u51c6","text":" \u9f20\u6807\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6bd4\u5982\u53f3\u952e\u3001\u53cc\u51fb\u65e0\u54cd\u5e94\uff1b \u952e\u76d8\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6216\u8005\u5ef6\u8fdf\u8f93\u5165\uff0c\u6bd4\u5982\u7528\u4f8b\u9700\u8981\u8f93\u5165\u201c\u6211\u662f\u4e2d\u56fd\u4eba\u201d\uff0c\u5b9e\u9645\u53ea\u8f93\u5165\u4e86\u201c\u6211\u56fd\u4eba\u201d\uff1b \u4ee5\u4e0a\u95ee\u9898\u6392\u9664\u5e94\u7528\u5361\u987f\u7b49\u95ee\u9898\uff0c\u5927\u6982\u7387\u662f\u7531\u4e8e\u5de5\u5177\u7684\u95ee\u9898\uff0c\u76ee\u524d\u952e\u9f20\u64cd\u4f5c\u6211\u4eec\u4f7f\u7528\u4e09\u4e2a\u5de5\u5177\uff1aDogtail \u63d0\u4f9b\u7684\u952e\u9f20\u5de5\u5177\u3001PyAutoGUI\u3001Xdotool \uff1b \u6709\u540c\u5b66\u53ef\u80fd\u8981\u8bf4\u4e3a\u5565\u8981\u7528\u4e09\u4e2a\u554a\uff0c\u7528\u4e00\u4e2a\u4e0d\u5c31\u597d\u4e86\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u5404\u6709\u4f18\u70b9\u5404\u6709\u7f3a\u70b9\u3002 \u5982\u679c\u4f60\u9047\u5230\u952e\u9f20\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u8bd5\u8bd5\u901a\u8fc7\u4e0d\u540c\u7684\u5de5\u5177\u64cd\u4f5c\uff1b\u952e\u76d8\u8f93\u5165\u5ef6\u8fdf\u7684\u95ee\u9898\uff0c\u4e00\u822c\u662f\u56e0\u4e3a\u8f93\u5165\u901f\u5ea6\u592a\u5feb\u4e86\uff0c\u7cfb\u7edf\u6ca1\u53cd\u5e94\u8fc7\u6765\uff0c\u5e38\u89c1\u4e8e ARM \u548c MIPS \u4e0a\uff0c\u4fee\u6539\u53c2\u6570 delay_time \u7684\u503c\uff0c\u5355\u4f4d\u4e3a\u6beb\u79d2\uff1b # mouse_key.py\n@classmethod\ndef input_message(cls, message, delay_time=300, interval=0.2):\n\"\"\"\n \u8f93\u5165\u5b57\u7b26\u4e32\n :param message: \u8f93\u5165\u7684\u5185\u5bb9\n :param delay_time: \u5ef6\u8fdf\u65f6\u95f4\n :param interval:\n :return:\n \"\"\"\n \u5982\u679c\u4e0d\u662f\u65b9\u6cd5\u7684\u95ee\u9898\uff0c\u5219\u9700\u8981\u7ee7\u7eed\u548c\u5f00\u53d1\u4e00\u8d77\u6392\u9664\uff0c\u662f\u5426\u4e3a\u5e94\u7528\u63a5\u53d7\u952e\u9f20\u4fe1\u53f7\u5904\u7406\u7684\u95ee\u9898\uff0c\u8fd9\u7c7b\u60c5\u51b5\u6211\u4eec\u4e5f\u662f\u9047\u5230\u8fc7\u7684\uff0c\u5177\u4f53\u95ee\u9898\u5177\u4f53\u5206\u6790\u3002 \u6bd4\u5982\u5f71\u9662\u5c31\u91cd\u5199\u4e86\u4e00\u4e2a\u53f3\u952e\u7684\u65b9\u6cd5\uff1a # base_widget.py\n@classmethod\ndef right_click(cls, _x=None, _y=None):\n\"\"\"\n \u91cd\u5199\u5e95\u5c42\u5355\u51fb\u9f20\u6807\u53f3\u952e\n \u89e3\u51b3\u5f71\u9662\u53f3\u952e\u89e6\u53d1release\u4e8b\u4ef6\u7684\u95ee\u9898\uff08\u53f3\u952e\u4e3b\u7a97\u53e3\u4f1a\u64ad\u653e\u89c6\u9891\uff09\n \"\"\"\ncls.mouse_down(_x, _y, button=3)\nsleep(0.1)\ncls.mouse_up(button=3)\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_6","title":"\u4e03\u3001\u5176\u4ed6\u4e0d\u4e3a\u4eba\u77e5\u7684\u7ec6\u8282","text":" \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u5c3d\u91cf\u7f16\u5199\u540c\u4e00\u4e2a\u5e94\u7528\u6216\u6a21\u5757\u7684\u7528\u4f8b\uff0c\u80fd\u5bf9\u8be5\u7528\u4f8b\u5df2\u6709\u65b9\u6cd5\u719f\u6089\uff0c\u907f\u514d\u8fc7\u591a\u91cd\u590d\u4e1a\u52a1\u4ee3\u7801\u7684\u5c01\u88c5\uff1b \u76f8\u540c\u7684\u573a\u666f\u4e0b\uff0c\u5404\u67b6\u6784\u7b49\u5f85\u65f6\u95f4\u4e0d\u540c\uff0c\u5efa\u8bae\u4f7f\u7528\u6846\u67b6\u63d0\u4f9b\u7684 sleep\uff0c\u6211\u4eec\u505a\u4e86\u4e0d\u540c\u67b6\u6784\u7684\u500d\u6570\u653e\u5927\uff1b \u7f16\u5199\u7528\u4f8b\u65f6\uff0c\u5c3d\u91cf\u8003\u8651\u5230\u6bcf\u4e00\u6b65\u5f02\u5e38\u540e\u7684\u73af\u5883\u6062\u590d\uff0c\u9700\u8981\u5efa\u8bae\u8fd9\u79cd\u610f\u8bc6\uff0c\u968f\u65f6\u8981\u8003\u8651\u5230\uff0c\u8fd9\u6b65\u64cd\u4f5c\u6709\u6ca1\u6709\u53ef\u80fd\u51fa\u9519\uff0c\u51fa\u9519\u4e86\u6539\u600e\u4e48\u529e\uff1b \u63d0\u4ea4\u4ee3\u7801\u7684\u65f6\u5019\u6ce8\u610f\u4e0d\u8981\u628a\u4e00\u4e9b\u4e34\u65f6\u7684\u6d4b\u8bd5\u8d44\u6e90\u63d0\u4ea4\u8fdb\u53bb\u4e86\uff0c\u6bd4\u5982\u6d4b\u8bd5\u4e86\u4e00\u4e2a\u5f71\u7247\uff0c\u6709\u4e9b\u540c\u5b66\u4e60\u60ef\u4f7f\u7528 git add . \uff0c\u7136\u540e\u5c31\u5168\u90e8\u63d0\u4ea4\u5230\u4ee3\u7801\u4ed3\u5e93\u4e86\uff0c\u8fd9\u6837\u5373\u4f7f\u540e\u671f\u628a\u5927\u6587\u4ef6\u5220\u4e86\uff0c.git \u6587\u4ef6\u91cc\u9762\u4e5f\u4f1a\u5f88\u5927\uff0c\u9020\u6210\u4ee3\u7801\u4ed3\u5e93\u53d8\u5f97\u5341\u5206\u81c3\u80bf\u3002 \u66f4\u591a\u7ec6\u8282\u67e5\u770b\uff1a\u300aAT\u7ecf\u9a8c\u603b\u7ed3\u300b"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/","title":"AT \u6267\u884c\u5668\u4f7f\u7528\u6307\u5317","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/5/25\n# Author : litao\n# =============================================\n Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1","title":"1\u3001\u529f\u80fd\u4ecb\u7ecd","text":" \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7cfb\u7edf\u8bed\u8a00\u8bbe\u7f6e\uff0c\u5206\u8fa8\u7387\u8bbe\u7f6e\u53ca\u7528\u4f8b\u6267\u884c\u73af\u5883\u642d\u5efa\uff1b \u652f\u6301 IP \u4e3a 15 \u7f51\u6bb5\u7684 AMD \u67b6\u6784\u6d4b\u8bd5\u673a\u955c\u50cf\u88c5\u673a\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u6307\u5b9a\u5e94\u7528\uff0c\u6307\u5b9a\u8303\u56f4\u6807\u7b7e\u7684\u7528\u4f8b\u6267\u884c\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u72b6\u6001\u68c0\u67e5\uff0c\u662f\u5426\u6709\u6b63\u5728\u8fd0\u884c\u7684\u6d4b\u8bd5\uff1b \u652f\u6301\u914d\u7f6e\u7528\u4f8b\u6267\u884c\u65f6\u957f\uff0c\u9632\u6b62\u4efb\u52a1\u963b\u585e\uff1b \u652f\u6301\u6839\u636e\u5e94\u7528\u7248\u672c\u81ea\u52a8\u67e5\u627e\u5bf9\u5e94\u7684\u7528\u4f8b tag\uff1b \u652f\u6301\u5f02\u5e38\u5904\u7406\u548c\u6d4b\u8bd5\u5b8c\u6210\u7684\u5b9e\u65f6\u6d88\u606f\u901a\u77e5\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2job","title":"2\u3001Job \u4ecb\u7ecd","text":"\u4ee5\u4e0b\u6309\u6267\u884c\u6d41\u7a0b\u7684\u987a\u5e8f\u4ecb\u7ecd\uff0c\u6bcf\u4e00\u6b65\u90fd\u53ef\u4ee5\u5355\u72ec\u6267\u884c\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1_1","title":"1\u3001\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/AT_test/ \u6574\u4e2a\u6d41\u7a0b\u7684\u4e3b\u5165\u53e3\uff0c\u901a\u8fc7\u8fd9\u4e2a\u5165\u53e3\uff0c\u8fde\u540c\u6574\u4e2a\u6d4b\u8bd5\u6d41\u7a0b\uff0c\u955c\u50cf\u88c5\u673a\uff0c\u73af\u5883\u90e8\u7f72\uff0c\u6d4b\u8bd5\u5e94\u7528\u53ca\u751f\u6210\u62a5\u544a\u3002 \u53c2\u6570\u4ecb\u7ecd\uff1a \u6d4b\u8bd5\u673a\uff1a\u6240\u6709\u89c4\u6574\u5230\u56fa\u5b9a\u533a\u57df\u7684\u6d4b\u8bd5\u673a\uff0c\u901a\u8fc7\u6d4b\u8bd5\u540c\u5b66\u5bf9\u6d4b\u8bd5\u673a\u7684\u4e60\u60ef\u547d\u540d\uff0c\u5728\u540e\u53f0\u6620\u5c04\u6d4b\u8bd5\u673a\u7684\u8be6\u7ec6\u4fe1\u606f\uff0c\u62ec\u53f7\u4e2d\u4e3a\u6d4b\u8bd5\u673a IP \u7684\u6700\u540e\u4e00\u4f4d\uff1b \u6d4b\u8bd5\u5e94\u7528\uff1a\u6307\u5b9a\u7684\u6d4b\u8bd5\u5e94\u7528\u7684\u5305\u540d\uff0c\u7cfb\u7edf\u6839\u636e\u540d\u79f0\u81ea\u52a8\u62c9\u53d6\u5bf9\u5e94\u7684\u4ed3\u5e93\u4ee3\u7801\uff1b deb\u5305\u4e0b\u8f7d\u5730\u5740\uff1a\u6d4b\u8bd5\u4e0a\u8ff0\u5e94\u7528\u65f6\uff0c\u9700\u8981\u5b89\u88c5\u7684deb\u5305\u4e0b\u8f7d\u5730\u5740\uff0c\u591a\u4e2a\u5730\u5740\u7528\u201c,\u201d\u9694\u5f00\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff1b \u8303\u56f4\u6807\u7b7e\uff1a\u6267\u884c\u6d4b\u8bd5\u7528\u4f8b\u7684\u6807\u7b7e\u8303\u56f4\uff0c\u5bf9\u5e94\u7528\u4f8b\u4ee3\u7801 csv \u6587\u4ef6\u4e2d\u7684\u6807\u7b7e\u4fe1\u606f\uff0c\u4ee5 pytest \u7684mark\u8bed\u6cd5\u7f16\u5199\uff1b \u7cfb\u7edf\u8bed\u8a00\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u8bed\u8a00\u73af\u5883\uff1b \u5206\u8fa8\u7387\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u5206\u8fa8\u7387\u73af\u5883\uff1b \u955c\u50cf\u5730\u5740\uff1a\u955c\u50cf\u4ed3\u5e93\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u901a\u8fc7 PXE \u88c5\u673a\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u88c5\u673a\u73af\u8282\uff08\u76ee\u524d\u4ec5\u652f\u6301\u90e8\u5206 AMD \u67b6\u6784\u7684\u88c5\u673a\uff09\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2pxe","title":"2\u3001PXE \u88c5\u673a","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/IOS_install/ \u8f93\u5165\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\uff0cIP\uff0c\u5bc6\u7801\uff0c\u955c\u50cf\u5730\u5740\u540e\uff0c\u81ea\u52a8\u88c5\u673a\uff0c\u76ee\u524d\u4ec5\u652f\u6301\u56fa\u5b9a 15 \u7f51\u6bb5\u7684\u90e8\u5206 AMD \u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#3","title":"3\u3001\u6b21\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/all_client_test/ \u8be5\u5165\u53e3\u4e0e\u4e3b\u5165\u53e3\u529f\u80fd\u57fa\u672c\u4e00\u81f4\uff0c\u53ea\u662f\u5265\u79bb\u4e86PXE\u88c5\u673a\u6d41\u7a0b\uff0c\u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7684\u6267\u884c\u6d41\u7a0b\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#4","title":"4\u3001\u73af\u5883\u90e8\u7f72","text":"Jenkins url\uff1ahttps://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/env/build?delay=0sec \u8bbe\u7f6e\u6d4b\u8bd5\u673a\u7684\u7cfb\u7edf\u8bed\u8a00\uff0c\u5206\u8fa8\u7387\u53ca\u5b89\u88c5\u6d4b\u8bd5\u6240\u9700\u7684\u4f9d\u8d56\u5305\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#5","title":"5\u3001\u53d1\u9001\u4ee3\u7801","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/send_code/ \u6839\u636e\u6d4b\u8bd5\u5e94\u7528\u540d\u79f0\uff0c\u62c9\u53d6\u5bf9\u5e94\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u5e76\u6839\u636e\u6d4b\u8bd5\u673a\u4e0a\u5e94\u7528\u7248\u672c\u5207\u6362\u5230\u5bf9\u5e94\u7684tag\u7248\u672c\uff0c\u82e5\u672a\u627e\u5230tag\u7248\u672c\uff0c\u5219\u4f7f\u7528\u6700\u65b0\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u518d\u6839\u636e\u5e94\u7528\u5e93\u4ee3\u7801\u4e2d\u914d\u7f6e\u7684\u57fa\u7840\u5e93\u7248\u672c\uff0c\u62c9\u53d6\u57fa\u7840\u5e93\u4ee3\u7801\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#6","title":"6\u3001\u7528\u4f8b\u6267\u884c","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/run_test/ \u8fd0\u884c\u6d4b\u8bd5\u673a\u4e0a\u7684\u7528\u4f8b"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/","title":"AT \u7528\u4f8b\u7b5b\u9009\u6307\u5317","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u7528\u4f8b\u7b5b\u9009\u6807\u51c6\uff0c\u662f\u6311\u9009\u5408\u9002\u7684\u6587\u672c\u7528\u4f8b\u8fdb\u884c\u81ea\u52a8\u5316\u7528\u4f8b\u8f6c\u5316\u7684\u4e00\u4e9b\u901a\u7528\u6807\u51c6\u3002 \u8fc7\u53bb\u6211\u4eec\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u5b9e\u8df5\u8fc7\u7a0b\u4e2d\uff0c\u5199\u4e86\u4e0d\u5c11\u81ea\u52a8\u5316\u7528\u4f8b\uff0c\u968f\u7740\u9700\u6c42\u7684\u8fed\u4ee3\uff0c\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u81ea\u7136\u8150\u5316\uff0c\u56e0\u800c\u9700\u8981\u5728\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\u5bf9\u81ea\u52a8\u5316\u7528\u4f8b\u8fdb\u884c\u7ef4\u62a4\uff0c\u5728\u7ef4\u62a4\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u6211\u4eec\u53d1\u73b0\uff0c\u6709\u4e9b\u7528\u4f8b\u7ef4\u62a4\u8d77\u6765\u592a\u96be\u4e86\uff0c\u8c03\u8bd5\u7528\u4f8b\u8017\u8d39\u5927\u91cf\u65f6\u95f4\uff0c\u6210\u672c\u5f88\u9ad8\u3002 \u56e0\u6b64\uff0c\u6211\u4eec\u603b\u7ed3\u4e00\u4e9b\u81ea\u52a8\u5316\u7528\u4f8b\u9009\u578b\u7684\u6807\u51c6\uff0c\u4ee5\u4f18\u5316\u540e\u7eed\u81ea\u52a8\u5316\u7528\u4f8b\u7ed3\u6784\uff0c\u671f\u5f85\u6211\u4eec\u80fd\u7f16\u5199\u51fa\u9ad8\u6548\u3001\u7a33\u5b9a\u3001\u6613\u4e8e\u7ef4\u62a4\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_1","title":"\u4e00\u3001\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u53ef\u4ee5\u5206\u4e3a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u548c\u4e13\u9879\u81ea\u52a8\u5316\u6d4b\u8bd5\uff0c\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e00\u822c\u53ea\u9488\u5bf9\u4e00\u4e9b\u5e38\u89c4\u7684\u529f\u80fd\u6d4b\u8bd5\uff0c\u5176\u4ed6\u975e\u5e38\u89c4\u529f\u80fd\u7684\u7528\u4f8b\uff0c\u5e94\u8be5\u91c7\u7528\u4e13\u9879\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u6848\uff1b \u4ee5\u4e0b\u662f\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1","title":"1. \u7a33\u5b9a\u6027\u3001\u538b\u6d4b\u7528\u4f8b","text":"\u7a33\u5b9a\u6027\u6d4b\u8bd5\u3001\u538b\u6d4b\u7528\u4f8b\u5e94\u8be5\u662f\u5c5e\u4e8e\u6027\u80fd\u76f8\u5173\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u5982\uff1a\u53cd\u590d\u591a\u6b21\u70b9\u51fb\u6309\u94ae\uff0c\u68c0\u9a8c\u5176\u529f\u80fd\u7a33\u5b9a\u6027\u3002\u56e0\u4e3a\u8fd9\u4e9b\u7528\u4f8b\u65ad\u8a00\u7684\u9884\u671f\u53ef\u80fd\u4e0d\u662f\u5f88\u660e\u786e\uff0c\u66f4\u6709\u751a\u8005\u4e0d\u9700\u8981\u65ad\u8a00\uff0c\u7528\u4f8b\u65f6\u957f\u6bd4\u8f83\u957f\uff0c\u800c\u4e14\u4e0d\u53ef\u63a7\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u76ee\u524d\u6211\u4eec\u6709\u6027\u80fd\u81ea\u52a8\u5316\u7684\u4e13\u9879\u65b9\u6848\uff0c\u4ee5\u53ca\u4e00\u4e9b\u7a33\u5b9a\u6027\u6d4b\u8bd5\u7684\u4e13\u9879\u65b9\u6848\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u6b64\u7c7b\u7528\u4f8b\u653e\u5230\u4e13\u9879\u81ea\u52a8\u5316\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2","title":"2. \u6d89\u53ca\u591a\u4e2a\u7528\u6237\u64cd\u4f5c","text":"\u5e38\u89c1\u4e0e\u6587\u7ba1\u7684\u7528\u4f8b\u4e2d\uff0c\u591a\u7528\u6237\u64cd\u4f5c\u7684\u7528\u4f8b\u4e00\u822c\u90fd\u4f1a\u6d89\u53ca\u5230\u5728\u7cfb\u7edf\u4e2d\u8fdb\u884c\u591a\u4e2a\u7528\u6237\u95f4\u7684\u5207\u6362\uff0c\u81ea\u52a8\u5316\u811a\u672c\u4e00\u822c\u662f\u8fd0\u884c\u5728\u4e00\u4e2a\u7528\u6237\u7a7a\u95f4\u4e0b\u7684\uff0c\u6240\u4ee5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u591a\u7528\u6237\u95f4\u7684\u5207\u6362\u3002 \u6b64\u7c7b\u4e0d\u5efa\u8bae\u91c7\u7528\u81ea\u52a8\u5316\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3","title":"3. \u4e0e\u5f00\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4ea4\u4e92","text":"\u6b64\u7c7b\u573a\u666f\u591a\u4e3a\u5e94\u7528\u7684\u5f02\u5e38\u573a\u666f\u6d4b\u8bd5\uff0c\u6bd4\u5982\uff1a\u590d\u5236\u5927\u6587\u4ef6\u8fc7\u7a0b\u4e2d\u6ce8\u9500\u673a\u5668\u3002 \u81ea\u52a8\u5316\u811a\u672c\u5728\u7cfb\u7edf\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4e4b\u540e\u662f\u4f1a\u505c\u6b62\u8fd0\u884c\u7684\uff1b\u6b64\u7c7b\u7528\u4f8b\u53ef\u4ee5\u505a\u81ea\u52a8\u5316\uff0c\u4f46\u662f\u540c\u6837\u9700\u8981\u505a\u4e13\u9879\u65b9\u6848\uff0c\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u7684\u5904\u7406\u903b\u8f91\u5b8c\u5168\u4e0d\u540c\u3002 \u540e\u7eed\u81ea\u52a8\u5316\u9700\u8981\u516c\u5173\u7684\u70b9\uff1a \u81ea\u52a8\u5316\u811a\u672c\u5728\u672c\u673a\u8fd0\u884c\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u81f3\u5c11\u9700\u8981\u63d0\u4f9b\u4ee5\u4e0b\u529f\u80fd\uff1a \u91cd\u542f\u4e4b\u540e\u7528\u4f8b\u80fd\u81ea\u52a8\u8fd0\u884c\uff1b\u53ef\u4ee5\u8003\u8651\u5c06\u6267\u884c\u7528\u4f8b\u5199\u6210\u4e00\u4e2a\u5f00\u673a\u81ea\u542f\u7684\u670d\u52a1\uff1b \u80fd\u8bb0\u5f55\u5173\u673a\u4e4b\u524d\u7528\u4f8b\u6267\u884c\u7684\u4f4d\u7f6e\uff0c\u91cd\u542f\u4e4b\u540e\u80fd\u4ece\u6b64\u4f4d\u7f6e\u5f00\u59cb\u6267\u884c\uff1b \u50cf\u6027\u80fd\u81ea\u52a8\u5316\u4e00\u6837\uff0c\u7531\u670d\u52a1\u7aef\u63a7\u5236\uff1b \u5b8c\u5168\u57fa\u4e8e\u56fe\u5f62\u8bc6\u522b\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u4e32\u53e3\u7ebf\u63a7\u5236\u952e\u9f20\u7a33\u5b9a\u6027\uff1b "},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4","title":"4. \u6d4b\u8bd5\u6267\u884c\u65f6\u95f4\u957f","text":"\u7528\u4f8b\u6267\u884c\u65f6\u95f4\u63a7\u5236\u57282\u5206\u949f\u4ee5\u5185\uff0c\u6781\u7aef\u60c5\u51b5\u4e0d\u8981\u8d85\u8fc75\u5206\u949f\uff0c\u6240\u6709\u7528\u4f8b\u7684\u5e73\u5747\u65f6\u957f\u5e94\u8be5\u57281\u5206\u949f\u5de6\u53f3\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u95f4\u592a\u957f\uff0c\u7f16\u5199\u7528\u4f8b\u3001\u8c03\u8bd5\u7528\u4f8b\u3001\u6267\u884c\u7528\u4f8b\u3001\u7ef4\u62a4\u7528\u4f8b\u90fd\u975e\u5e38\u7684\u8017\u65f6\uff0c\u4eba\u529b\u6210\u672c\u65f6\u95f4\u6210\u672c\u6295\u5165\u592a\u9ad8\u3002 \u4f60\u60f3\uff0c\u8fd9\u6761\u7528\u4f8b\u6267\u884c\u9700\u89815\u5206\u949f\uff0c\u90a3\u4f60\u5199\u8fd9\u6761\u7528\u4f8b\u7684\u65f6\u95f4\u4e0d\u53ef\u80fd\u4e00\u904d\u8fc7\uff0c\u5199\u7684\u8fc7\u7a0b\u4e2d\u8dd1\u4e0d\u901a\u8fd8\u5f97\u91cd\u8dd1\u81f3\u5c1115\u5206\u949f\u4e0d\u8fc7\u5206\uff0c\u5199\u5b8c\u4e86\u8fd8\u5f97\u5728\u5176\u4ed6\u67b6\u6784\u4e0a\u8c03\u8bd5\uff0c\u534a\u4e2a\u5c0f\u65f6\u8fc7\u53bb\u4e86\uff0c\u8fd9\u8fd8\u53ea\u662f\u7b2c\u4e00\u6b21\u5199\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u540e\u7eed\u5982\u679c\u7528\u4f8b\u7ef4\u62a4\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u7ecf\u5e38\u6295\u5165\u76f8\u5f53\u957f\u65f6\u95f4\uff0c\u8fd9\u6837\u5176\u5b9e\u662f\u5931\u53bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u7684\u3002\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u5c31\u5e94\u8be5\u662f\u5feb\u51c6\u72e0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5","title":"5. \u8fb9\u7f18\u6027\u6d4b\u8bd5","text":"\u6709\u4e9b\u529f\u80fd\u6a21\u5757\u672c\u8eab\u662f\u5c5e\u4e8e\u6bd4\u8f83\u8fb9\u7f18\u6027\u7684\uff0c\u5373\u6781\u5c11\u7528\u6237\u4f1a\u4f7f\u7528\u5230\u7684\u529f\u80fd\uff0c\u8fd9\u7c7b\u529f\u80fd\u6a21\u5757\u4e0d\u9700\u8981\u5927\u89c4\u6a21\u5b9e\u73b0\u81ea\u52a8\u5316\uff0c\u4e00\u4e24\u4e2a\u573a\u666f\u8986\u76d6\u57fa\u672c\u529f\u80fd\u5c31\u884c\u4e86\uff0c\u56e0\u6b64\u6211\u4eec\u5728\u6311\u9009\u6b64\u7c7b\u7528\u4f8b\u7684\u65f6\u5019\u53ef\u4ee5\u7ed3\u5408\u6574\u4e2a\u529f\u80fd\u6a21\u5757\u7684\u8986\u76d6\u60c5\u51b5\u6765\u51b3\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6","title":"6. \u9700\u8981\u4f9d\u8d56\u4eba\u5de5\u4ecb\u5165\u7684","text":"\u81ea\u52a8\u5316\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\u662f\u6ca1\u6709\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bd4\u5982\u8981\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u90a3\u4e48\u5c31\u80cc\u79bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u3002 \u6bd4\u5982\u5149\u9a71\u6a21\u5757\uff0c\u5149\u9a71\u523b\u5f55\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u4f46\u662f\u5149\u9a71\u523b\u5f55\u4e4b\u540e\u5149\u76d8\u4f1a\u5f39\u51fa\u6765\uff0c\u9700\u8981\u4eba\u5de5\u66f4\u6362\u5149\u76d8\uff0c\u518d\u624b\u52a8\u63a8\u8fdb\u5149\u9a71\u4e2d\u3002 \u8fd9\u79cd\u529f\u80fd\u6a21\u5757\u5373\u4f7f\u505a\u81ea\u52a8\u5316\uff0c\u80fd\u6d89\u53ca\u5230\u7684\u529f\u80fd\u975e\u5e38\u6709\u9650\uff0c\u800c\u4e14\u4e0d\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u6240\u4ee5\u660e\u663e\u5c31\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7","title":"7. \u96be\u4ee5\u5b9e\u73b0\u7684","text":"\u7528\u4f8b\u6240\u6d89\u53ca\u5230\u7684\u65b9\u6cd5\u5b9e\u73b0\u8d77\u6765\u53ef\u80fd\u6709\u96be\u5ea6\uff0c\u751a\u81f3\u73b0\u9636\u6bb5\u65e0\u6cd5\u5b9e\u73b0\u7684\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002 \u6bd4\u5982\u5f71\u9662\u6d4b\u8bd5\u753b\u9762\u6e05\u6670\u5ea6\u3001\u6d41\u7545\u5ea6\u3001\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u4e4b\u540e\u7684\u89c6\u9891\u662f\u5426\u5b58\u5728\u5361\u987f\u7b49\u7528\u4f8b\uff0c\u73b0\u9636\u6bb5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#8","title":"8. \u529f\u80fd\u4e0d\u7a33\u5b9a","text":"\u8fd9\u4e2a\u4e0d\u662f\u8bf4\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\uff0c\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\u4e0d\u7a33\u5b9a\u662f\u6b63\u5e38\u7684\uff0c\u8fd9\u79cd\u6211\u4eec\u53ef\u4ee5\u7b49\u5f00\u53d1\u63d0\u6d4b\u4e4b\u540e\u518d\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u3002 \u529f\u80fd\u4e0d\u7a33\u5b9a\u6307\u7684\u662f\u7528\u4f8b\u6240\u6d89\u53ca\u7684\u529f\u80fd\uff0c\u53ef\u80fd\u5b58\u5728\u591a\u79cd\u53d8\u5316\uff0c\u6bcf\u6b21\u6267\u884c\u7528\u4f8b\u53ef\u80fd\u65ad\u8a00\u7684\u9884\u671f\u90fd\u4e0d\u540c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#9","title":"9. \u52a8\u6001\u65ad\u8a00","text":"\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u76f4\u5230\u7528\u4f8b\u7ed3\u675f\uff0c\u4e00\u76f4\u662f\u4e00\u4e2a\u52a8\u6001\u53d8\u5316\u7684\u8fc7\u7a0b\uff0c\u800c\u4e14\u65e0\u6cd5\u901a\u8fc7\u5176\u4ed6\u624b\u6bb5\u505c\u4e0b\u6765\uff1b \u6bd4\u5982\uff1a\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u65f6\uff0c\u53f3\u4e0b\u89d2\u7684\u5f55\u5236\u65f6\u95f4\u662f\u4e00\u76f4\u5728\u53d8\u5316\u7684\uff0c\u7528\u4f8b\u9700\u8981\u6d4b\u8bd5\u5f55\u52361\u5206\u949f\u4e4b\u540e\uff0c\u5f55\u5236\u65f6\u95f4\u662f\u521a\u597d\u505c\u572860\u79d2\uff1b \u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fd8\u505a\u4e0d\u5230\u65f6\u95f4\u7cbe\u51c6\u63a7\u5236\uff0c\u7a0b\u5e8f\u6267\u884c\u65f6\u95f4\u662f\u6709\u6ce2\u52a8\u7684\uff0c\u800c\u4e14\u8981\u9002\u914d\u591a\u4e2a\u5e73\u53f0\uff0c\u6240\u4ee5\u6b64\u7c7b\u7528\u4f8b\u5927\u6982\u7387\u4f1a\u6267\u884c\u5931\u8d25\u3002\u7279\u522b\u662f\u5728\u6027\u80fd\u8f83\u5dee\u7684\u56fd\u4ea7\u5316\u67b6\u6784\u4e0a\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u592a\u53ef\u80fd\u7a33\u5b9a\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#10","title":"10. \u63a2\u7d22\u6027\u6d4b\u8bd5","text":"\u63a2\u7d22\u6027\u6d4b\u8bd5\u901a\u5e38\u662f\u4e00\u4e9b\u4e0d\u786e\u5b9a\u7684\u64cd\u4f5c\uff0c\u591a\u53d8\u5207\u590d\u6742\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u9884\u671f\u4e5f\u53ef\u80fd\u662f\u4e0d\u786e\u5b9a\u7684\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u9a9a\u64cd\u4f5c\u592a\u591a\u4e86\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6b64\u7c7b\u7528\u4f8b\u9002\u5408\u91c7\u7528\u624b\u5de5\u6d4b\u8bd5\uff0c\u662f\u624b\u5de5\u6d4b\u8bd5\u771f\u6b63\u7684\u4ef7\u503c\u4f53\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#11","title":"11. \u6613\u7528\u6027\u6d4b\u8bd5","text":"\u5bf9\u4e8e\u6613\u7528\u6027\u7684\u5224\u65ad\u901a\u5e38\u662f\u4e3b\u89c2\u7684\uff0c\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\u5f88\u96be\u53bb\u5b9a\u4e49\u4ec0\u4e48\u6837\u7684\u60c5\u51b5\u5bf9\u7528\u6237\u662f\u6613\u7528\u7684\uff0c\u81ea\u52a8\u5316\u9700\u8981\u6709\u660e\u786e\u7684\u53ef\u5b9e\u73b0\u7684\u9884\u671f\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_2","title":"\u4e8c\u3001\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u524d\u9762\u8bb2\u4e86\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u4e00\u4e9b\u7528\u4f8b\u60c5\u51b5\uff0c\u6709\u540c\u5b66\u5c31\u8bf4\u4e86\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\u4e0d\u7528\u8bb2\u4e86\uff0c\u5c31\u662f\u4e0d\u9002\u5408\u7684\u53cd\u9762\u3002\u6ca1\u6bdb\u75c5\u54c8\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\uff0c\u6211\u4eec\u5927\u4f53\u8fd8\u53ef\u4ee5\u5206\u4e3a\u4e24\u7c7b\uff1a \u7b2c\u4e00\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u597d\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u7b2c\u4e8c\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u4e00\u822c\uff0c\u9700\u8981\u6295\u5165\u66f4\u591a\u7cbe\u529b\u624d\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u4ee5\u4e0b\u4ecb\u7ecd\u4e00\u4e9b\u6211\u4eec\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1_1","title":"1. \u64cd\u4f5c\u76f8\u5bf9\u7b80\u5355","text":"\u7528\u4f8b\u6b65\u9aa4\u76f8\u5bf9\u8f83\u5c11\uff0c\u8fd9\u79cd\u7528\u4f8b\u901a\u5e38\u662f\u4e00\u4e9b\u8def\u5f84\u5f88\u6d45\u7684\u7528\u4f8b\uff0c\u4e00\u822c\u4e5f\u662f\u4e00\u4e9b\u57fa\u7840\u7528\u4f8b\u3002\u7528\u4f8b\u7f16\u5199\u3001\u7ef4\u62a4\u90fd\u53ef\u4ee5\u8f7b\u677e\u641e\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2_1","title":"2. \u5bb9\u6613\u5b9e\u73b0","text":"\u73b0\u6709\u6280\u672f\u662f\u53ef\u5b9e\u73b0\u7684\uff0c\u6ca1\u6709\u96be\u5ea6\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3_1","title":"3. \u7ecf\u5e38\u7528\u4e8e\u56de\u5f52\u6d4b\u8bd5","text":"\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bcf\u6b21\u56de\u5f52\u6d4b\u8bd5\u5fc5\u987b\u8981\u6267\u884c\u7684\u7528\u4f8b\uff0c\u90a3\u4e48\u8fd9\u6761\u7528\u4f8b\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u3002 \u56de\u5f52\u6d4b\u8bd5\u65f6\u6211\u4eec\u9996\u5148\u5e94\u8be5\u4fdd\u8bc1\u5e94\u7528\u5386\u53f2\u57fa\u672c\u529f\u80fd\u6b63\u5e38\uff0c\u6240\u4ee5\u90a3\u4e9b\u6bcf\u6b21\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u90fd\u8981\u6267\u884c\u7684\u7528\u4f8b\u9002\u5408\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4_1","title":"4. \u529f\u80fd\u7a33\u5b9a\u7684\u6838\u5fc3\u529f\u80fd","text":"\u6d89\u53ca\u6838\u5fc3\u529f\u80fd\u7684\u7528\u4f8b\u662f\u6700\u6700\u91cd\u8981\u7684\u7528\u4f8b\uff0c\u4e5f\u662f\u6211\u4eec\u4ea4\u4ed8\u65f6\u5fc5\u987b\u8981\u4fdd\u8bc1\u8d28\u91cf\u7684\u76f8\u5173\u529f\u80fd\uff0c\u56e0\u6b64\u5e94\u8be5\u5c3d\u53ef\u80fd\u7684\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5_1","title":"5. \u8f93\u5165\u6570\u636e\u6d4b\u8bd5","text":"\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u901a\u5e38\u662f\u68c0\u9a8c\u88ab\u6d4b\u5e94\u7528\u63a5\u53d7\u6709\u6548\u6570\u636e\u3001\u62d2\u7edd\u65e0\u6548\u6570\u636e\u7684\u80fd\u529b\u3002\u5982\uff1a\u63d0\u4ea4\u8d85\u957f\u5b57\u7b26\u4e32\u3001\u7279\u6b8a\u5b57\u7b26\u4e32\u7b49\u7b49\u3002 \u6b64\u7c7b\u7528\u4f8b\u624b\u5de5\u6d4b\u8bd5\u5f88\u96be\u6bd4\u8f83\u5168\u9762\u7684\u8986\u76d6\u5230\u6240\u6709\u7684\u8f93\u5165\u60c5\u51b5\uff0c\u4f46\u662f\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\uff0c\u6b64\u7c7b\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u90fd\u662f\u4e00\u6837\u7684\uff0c\u53d8\u5316\u7684\u4ec5\u662f\u8f93\u5165\u53c2\u6570\u548c\u65ad\u8a00\u7ed3\u679c\uff0c\u91c7\u7528\u6570\u636e\u9a71\u52a8\uff0c\u53ef\u4ee5\u8f7b\u677e\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6_1","title":"6. \u683c\u5f0f\u8986\u76d6","text":"\u539f\u56e0\u540c\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u7c7b\u7528\u4f8b\u4e00\u6837\uff0c\u591a\u79cd\u683c\u5f0f\u7684\u8986\u76d6\u4e5f\u662f\u4e00\u4e2a\u5f88\u7e41\u7410\u7684\u4e8b\u60c5\uff0c\u4ea4\u7ed9\u81ea\u52a8\u5316\u6765\u505a\u518d\u5408\u9002\u4e0d\u8fc7\u4e86\u3002 \u6bd4\u5982\u5f71\u9662\u5bf9\u5f71\u7247\u683c\u5f0f\u7684\u68c0\u67e5\u3001\u622a\u56fe\u5f55\u5c4f\u5bf9\u4fdd\u5b58\u683c\u5f0f\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7_1","title":"7. \u68c0\u67e5\u5143\u7d20\u72b6\u6001","text":"\u67e5\u770b\u88ab\u6d4b\u5e94\u7528\u7684\u5143\u7d20\u5c5e\u6027\u3002\u5982\uff1a\u56fe\u7247\u7684\u5927\u5c0f\u548c\u6392\u5217\uff1b\u6309\u94ae\u7684\u53ef\u7528\u548c\u4e0d\u53ef\u7528\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/","title":"AT \u7ecf\u9a8c\u603b\u7ed3","text":"\u6b22\u8fce\u6240\u6709\u4eba\u63d0\u4ea4\u4f60\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u9762\u7684\u4f18\u79c0\u5b9e\u8df5\u7ecf\u9a8c\uff0c\u4ee5\u5e2e\u52a9\u5927\u5bb6\u89e3\u51b3\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#1","title":"1\u3001\u7ec8\u7ed3\u5668","text":"# litaoa@uniontech.com\n \u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4 pytest \u5b9e\u73b0\u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4\u7684\u65b9\u5f0f\u6709\u4e24\u79cd\uff0cyield \u548c\u7ec8\u7ed3\u51fd\u6570\uff1b yield \u5b9e\u73b0\uff0cyield\u524d\u9762\u4e3a\u7528\u4f8b\u7684\u524d\u7f6e\u6b65\u9aa4\uff0cyield \u540e\u9762\u4e3a\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4\u3002 @pytest.fixture\ndef clean_env():\nprint(\"setup\")\nyield\nprint(\"teardown\")\n \u7ec8\u7ed3\u51fd\u6570\u5b9e\u73b0\uff0c\u4f7f\u7528 request.addfinalizer \u6ce8\u518c\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4 @pytest.fixture\ndef clean_env(request):\ndef clean():\nprint(\"teardown\")\nrequest.addfinalizer(clean)\nprint(\"setup\")\n yield\u7684\u4f18\u7f3a\u70b9\uff1a \u4f18\u70b9\uff1a\u4ee3\u7801\u7b80\u6d01\uff0c\u76f4\u89c2\uff0c\u53ef\u4f7f\u7528yield\u5728\u7528\u4f8b\u4e2d\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c \u7f3a\u70b9\uff1a\u82e5\u524d\u7f6e\u6b65\u9aa4\u4e2d\u51fa\u73b0\u9519\u8bef\uff0c\u5219\u540e\u7f6e\u6b65\u9aa4\u4e0d\u4f1a\u6267\u884c \u7ec8\u7ed3\u51fd\u6570\uff1a \u4f18\u70b9\uff1a\u524d\u7f6e\u6b65\u9aa4\u5931\u8d25\u7684\u8bdd\uff0c\u540e\u7f6e\u6b65\u9aa4\u4ecd\u4f1a\u6267\u884c\u4e14\u53ef\u4ee5\u6ce8\u518c\u591a\u4e2a\u540e\u7f6e\u6b65\u9aa4\uff08\u524d\u63d0\uff1a\u9700\u8981\u5728\u4ee3\u7801\u62a5\u9519\u4e4b\u524d\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff09\uff0c\u652f\u6301\u7075\u6d3b\u4f7f\u7528\u540e\u7f6e\u6761\u4ef6 \u7f3a\u70b9\uff1a\u4ee3\u7801\u8f83\u4e3a\u590d\u6742\uff0c\u65e0\u6cd5\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c\uff08\u672c\u4eba\u76ee\u524d\u672a\u5b9e\u73b0\uff09 \u603b\u7ed3\uff1a\u5728\u524d\u7f6e\u6b65\u9aa4\u4fdd\u8bc1\u7edd\u5bf9\u4e0d\u4f1a\u51fa\u9519\u65f6\uff0c\u4f7f\u7528yield\u66f4\u4f73\u7b80\u4fbf\uff0c\u5f53\u524d\u7f6e\u6b65\u9aa4\u6613\u51fa\u73b0\u95ee\u9898\u65f6\uff0c\u63a8\u8350\u4f7f\u7528\u7ec8\u7ed3\u51fd\u6570\u3002 \u573a\u666f\uff1a\u4fdd\u9669\u7bb1\u7528\u4f8b\uff0c\u524d\u7f6e\u6b65\u9aa4\u4e2d\u5f00\u542f\u4fdd\u9669\u7bb1\uff0c\u540e\u7f6e\u6b65\u9aa4\u5220\u9664\u4fdd\u9669\u7bb1\u3002 @pytest.fixture(scope=\"session\", autouse=True)\ndef vault_fixture(request):\nDfmWidget.reset_vault_by_cmd() # 1\u3001\u91cd\u7f6e\u4fdd\u9669\u7bb1\nDdeDockPublicWidget().close_file_manager_by_cmd() # 2\u3001\u5173\u95ed\u6587\u7ba1\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 3\u3001\u5f00\u542f\u6587\u7ba1\nvault = DfmWidget()\nvault.create_file_vault() # 4\u3001\u521b\u5efa\u4fdd\u9669\u7bb1\ndef delete_vault(): # 8\u3001\u5220\u9664\u4fdd\u9669\u7bb1\u7684\u540e\u7f6e\u6b65\u9aa4\nsleep(2)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr()\nvault = DfmWidget()\nvault.delete_file_vault()\nDfmWidget.reset_vault_by_cmd()\nDdeDockPublicWidget().close_file_manager_by_cmd()\nrequest.addfinalizer(delete_vault) # 5\u3001\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\nDdeDockPublicWidget().close_file_manager_by_cmd() # 6\u3001\u5173\u95ed\u6587\u7ba1\nsleep(1)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 7\u3001\u5f00\u542f\u6587\u7ba1\n \u4ee3\u7801\u6309\u6ce8\u91ca\u4e2d\u7684\u5e8f\u53f7\u6267\u884c\u6b65\u9aa4 \u4ee3\u7801\u5728\u6b65\u9aa41-4\u4efb\u610f\u4f4d\u7f6e\u62a5\u9519\uff0c\u5219\u4e0d\u4f1a\u6267\u884c\u6b65\u9aa48\uff0c\u56e0\u4e3a\u672a\u6267\u884c\u5230\u6b65\u9aa45\uff0c\u6b65\u9aa48\u8fd8\u672a\u6ce8\u518c \u4ee3\u7801\u5728\u6b65\u9aa46-7\u62a5\u9519\uff0c\u4ecd\u4f1a\u6267\u884c\u6b65\u9aa47\uff0c\u56e0\u4e3a\u5728\u6b65\u9aa45\u4e2d\u5df2\u7ecf\u5c06\u6b65\u9aa47\u6ce8\u518c \u53ef\u4ee5\u7075\u6d3b\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff0c\u80fd\u5b9e\u73b0\u67d0\u4e2a\u524d\u7f6e\u6b65\u9aa4\u6267\u884c\u4e4b\u540e\uff0c\u624d\u4f1a\u6267\u884c\u540e\u7f6e\u6b65\u9aa4\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#2","title":"2\u3001\u542f\u52a8\u5e94\u7528\u7684\u65b9\u5f0f","text":"# huangmingqiang@uniontech.com\n \uff081\uff09\u547d\u4ee4\u884c\u542f\u52a8 \u5728 AT \u4ee3\u7801\u4e2d\u4f7f\u7528\u547d\u4ee4\u884c\u542f\u52a8\u5e94\u7528\uff0c\u4e3e\u4f8b\uff1a os.popen(\"deepin-music\")\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f7f\u7528 ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6\uff0cdogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u3002 \uff082\uff09\u901a\u8fc7 UI \u64cd\u4f5c\u542f\u52a8 \u901a\u8fc7\u4efb\u52a1\u680f\u3001\u542f\u52a8\u5668\u3001\u684c\u9762\u7b49UI\u65b9\u5f0f\u542f\u52a8\uff0c\u6bd4\u5982\u53cc\u51fb\u6253\u5f00\u3001\u53f3\u952e\u6253\u5f00\u7b49\uff0c\u8fd9\u79cd\u64cd\u4f5c\u65b9\u5f0f\u4e0d\u5b58\u5728ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6dogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u7684\u95ee\u9898\uff0c\u4e5f\u66f4\u52a0\u7b26\u5408\u7528\u6237\u7684\u64cd\u4f5c\u884c\u4e3a\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#3","title":"3\u3001\u6587\u4ef6\u9009\u62e9\u6846\u5c5e\u6027\u5b9a\u4f4d\u5076\u73b0\u65e0\u6cd5\u627e\u5230","text":"\u6587\u4ef6\u9009\u62e9\u6846\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5728\u8c03\u7528\u6587\u4ef6\u9009\u62e9\u6846\u65f6\uff0c\u6709\u4e00\u5b9a\u7684\u6982\u7387\u51fa\u73b0\uff0c\u754c\u9762\u5df2\u7ecf\u6e32\u67d3\u51fa\u6765\u4e86\uff0c\u4f46\u662f\u5c5e\u6027\u6811\u5e76\u6ca1\u6709\u5199\u5165\uff0c\u5bfc\u81f4\u901a\u8fc7\u5c5e\u6027\u65e0\u6cd5\u627e\u5230\u5143\u7d20\uff0c\u76ee\u524d\u4e5f\u6ca1\u6709\u5f88\u597d\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u4e3a\u4e86\u7528\u4f8b\u7a33\u5b9a\u6027\uff0c\u6587\u4ef6\u9009\u62e9\u6846\u7684\u64cd\u4f5c\u5efa\u8bae\u4f7f\u7528UI\u6216\u8005\u56fe\u7247\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u53ef\u4ee5\u901a\u8fc7\u641c\u7d22\u5185\u5bb9\u56fa\u5b9a\u6587\u4ef6\u4f4d\u7f6e\u3002 # litaoa@uniontech.com\n desk = DdeDesktopPublicWidget()\n# \u9009\u62e9\u89c6\u9891\u76ee\u5f55\ndesk.click_videos_dir_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.ctrl_f()\nsleep(1)\ndesk.input_message(\"\u5143\u7d20\u540d\u79f0\")\nsleep(0.5)\ndesk.enter()\nsleep(1)\n# \u9009\u62e9\u7b2c\u4e00\u4e2a\u6587\u4ef6\ndesk.click_list_view_btn_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.click_first_file_in_desktop_plugs_by_ui()\nsleep(1)\n# \u6587\u7ba1\u63d2\u4ef6\u4e2d\u70b9\u51fb\u6253\u5f00\ndesk.click_open_btn_in_desktop_plugs_by_ui()\n"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#4","title":"4\u3001\u5e94\u7528\u542f\u52a8","text":"# mikigo\n \u5728UI\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u4e00\u5207\u64cd\u4f5c\u7684\u90fd\u662f\u4ece\u5e94\u7528\u542f\u52a8\u5f00\u59cb\u7684\uff0c\u800c\u5728Linux\u684c\u9762\u5e94\u7528\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u6211\u4eec\u542f\u52a8\u5e94\u7528\u7684\u65b9\u6cd5\u6709\u591a\u79cd\uff0c\u4e0b\u9762\u505a\u4e00\u4e2a\u7b80\u5355\u7684\u4ecb\u7ecd\uff1a \u3010\u4f7f\u7528dogtail\u542f\u52a8\u3011 dogtail\u63d0\u4f9b\u4e86\u5e94\u7528\u542f\u52a8\u7684\u65b9\u6cd5\uff0c\u5728utils\u5e93\u4e2d\uff0c\u4f7f\u7528run\u65b9\u6cd5\u542f\u52a8\uff1a \u9996\u5148\u5bfc\u5165\u65b9\u6cd5\uff1a from dogtail.utils import *\n \u8c03\u7528run\u65b9\u6cd5 run('deepin-music')\n \u5373\u53ef\u542f\u52a8\u97f3\u4e50 \u8fd9\u79cd\u65b9\u6cd5\u7684\u4f18\u70b9\u662f\u91c7\u7528\u8fdb\u7a0b\u7684\u65b9\u5f0f\u76f4\u63a5\u542f\u52a8\uff0c\u4e0d\u4f9d\u8d56\u4e0eUI\uff0c\u65e0\u8bba\u684c\u9762\u6216\u4efb\u52a1\u680f\u4e0a\u662f\u5426\u5b58\u5728\u5e94\u7528\u56fe\u6807\uff0c\u90fd\u53ef\u4ee5\u6b63\u5e38\u542f\u52a8\u3002 \u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c \u5982\u679c\u4f7f\u7528ssh\u8fdc\u7a0b\u8c03\u7528\uff0c\u6216\u8005Jenkins\u4e2d\u6267\u884c\u6d4b\u8bd5\u811a\u672c\u7684\u65f6\u5019\uff0c\u5728sniff\u4e2d\u4f1a\u51fa\u73b0\u627e\u4e0d\u5230\u5e94\u7528\uff0c\u7ecf\u8fc7\u5206\u6790\uff0c\u53ef\u80fd\u662f\u56e0\u4e3a\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\u542f\u52a8\u7684\u65f6\u5019\uff0c\u5b9e\u9645\u662f\u91c7\u7528\u4e00\u4e2a\u5b50\u8fdb\u7a0b\u542f\u52a8\u4e86\u5e94\u7528\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u5230\u3002 \u3010\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u3011 \u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807 \u901a\u5e38\u6709\u4e24\u79cd\u65b9\u6cd5\uff1a \uff081\uff09\u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807\u3002 \uff082\uff09\u5df2\u77e5\u5e94\u7528\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u7684\u4f4d\u7f6e\uff0c\u7136\u540e\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u5bf9\u5e94\u5750\u6807\u3002 \u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u7f3a\u70b9\u662f\u4f4d\u7f6e\u5fc5\u987b\u56fa\u5b9a\uff0c\u5982\u679c\u79fb\u52a8\u4f4d\u7f6e\u5c31\u4e0d\u884c\u4e86\uff0c\u800c\u4f7f\u7528\u7b2c\u4e00\u79cd\u65b9\u6cd5\uff0c\u65e0\u8bba\u4f4d\u7f6e\u5728\u54ea\u91cc\uff0c\u53ea\u8981\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u5b58\u5728\u5373\u53ef\u3002 \u3010\u70b9\u51fb\u684c\u9762\u56fe\u6807\u542f\u52a8\u3011 \u684c\u9762\u56fe\u6807\u76ee\u524d\u662f\u91c7\u7528\u56fe\u50cf\u8bc6\u522b\u6280\u672f\uff0c\u5b9a\u4f4d\u5230\u5e94\u7528\u56fe\u6807\u7684\u5750\u6807\uff0c\u7136\u540e\u901a\u8fc7pyauogui\u8fdb\u884c\u70b9\u51fb\u64cd\u4f5c\u3002 \u8be6\u7ec6\u6280\u672f\u65b9\u6848\u53ef\u4ee5\u53c2\u8003\u6211\u7684\u53e6\u5916\u4e24\u7bc7\u535a\u5ba2: \u57fa\u4e8eopencv\u7684\u6a21\u677f\u5339\u914d\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd4\u56de\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 Python\u4e09\u65b9\u5e93PyAutoGui\u7684\u4f7f\u7528\u65b9\u6cd5 \u3010\u4ece\u542f\u52a8\u5668\u542f\u52a8\uff08\u4fd7\u79f0\u5f00\u59cb\u83dc\u5355\uff09\u3011 \u542f\u52a8\u4e2d\u542f\u52a8\u7684\u5b9e\u73b0\u903b\u8f91\u5b9e\u9645\u548c\u4efb\u52a1\u680f\u4e0a\u542f\u52a8\u5dee\u4e0d\u591a\u3002 \u9996\u5148\uff0c\u9700\u8981\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u542f\u52a8\u5668\u56fe\u6807\uff0c\u6216\u8005\u952e\u76d8super\u952e\uff0c\u5c06\u542f\u52a8\u5668\u547c\u51fa\u6765\uff0c \u7136\u540e\uff0c\u5728\u542f\u52a8\u5668\u4e2d\u70b9\u51fb\u5bf9\u5e94\u7684\u56fe\u6807\uff0c \u4f46\u662f\u8fd9\u91cc\u6709\u4e2a\u95ee\u9898\uff0c\u542f\u52a8\u5668\u4e2d\u7684\u5e94\u7528\u5217\u8868\uff0c\u4e00\u9875\u5c55\u793a\u4e0d\u5b8c\uff0c\u6240\u4ee5\u5982\u679c\u6211\u4eec\u8981\u70b9\u51fb\u7684\u5e94\u7528\u56fe\u6807\u4e0d\u5728\u7b2c\u4e00\u9875\u600e\u4e48\u529e\uff0c\u901a\u5e38\u89e3\u51b3\u65b9\u6848\u6709\u4e24\u79cd\uff1a \uff081\uff09\u9700\u8981\u8fdb\u884c\u5411\u4e0b\u6ed1\u52a8\uff0c\u8fd9\u91cc\u5c31\u6d89\u53ca\u5230\u76f8\u5e94\u7684\u8bc6\u522b\u65b9\u6848\uff0c\u5224\u65ad\u5982\u679c\u4e0d\u5728\u7b2c\u4e00\u9875\u5c31\u5f80\u4e0b\u6ed1\u52a8\u7ffb\u9875\u3002 \uff082\uff09\u542f\u52a8\u5668\u63d0\u4f9b\u641c\u7d22\u7684\u529f\u80fd\uff0c\u8f93\u5165\u5e94\u7528\u540d\u79f0\u641c\u7d22\uff0c\u7136\u540e\u8fdb\u884c\u70b9\u51fb\u3002 \u4ece\u5b9e\u9645\u64cd\u4f5c\u4e2d\u6765\u770b\uff0c\u91c7\u7528\u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u6548\u7387\u4f1a\u9ad8\u4e00\u70b9\u3002 \u3010\u7ec8\u7aef\u547d\u4ee4\u542f\u52a8\u3011 \u5728python\u4e2d\uff0c\u4f7f\u7528os.popen()\u6216os.system()\u6216\u8005subprocess.Popen()\uff0c\u5b9e\u73b0\u547d\u4ee4\u884c\u542f\u52a8\uff0c\u6bd4\u5982\uff1a import os\nos.popen('deepin-music')\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u8fdc\u7a0b\u6267\u884c\u811a\u672c\u7684\u65f6\u5019\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u7684\u95ee\u9898\u3002 \u3010\u603b\u7ed3\u3011 \u4ee5\u4e0a\u51e0\u79cd\u65b9\u6cd5\uff0c\u5404\u6709\u4f18\u7f3a\u70b9\uff0c\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff1a \uff081\uff09\u5982\u679c\u9700\u8981\u5728Jenkins\u4e2d\u505a\u6301\u7eed\u96c6\u6210\uff0c\u5efa\u8bae\u4f7f\u7528\u7b2c\u4e8c\u79cd\u4efb\u52a1\u680f\u542f\u52a8\u7684\u65b9\u6cd5\u3002 \uff082\uff09\u5982\u679c\u4e0d\u4f1a\u91c7\u7528\u8fdc\u7a0b\u6267\u884c\u7684\uff0c\u5efa\u8bae\u91c7\u7528\u7b2c\u4e00\u79cd\u6216\u8005\u6700\u540e\u4e00\u79cd\u65b9\u6848\u3002 \uff083\uff09\u7b2c\u4e09\u79cd\u548c\u7b2c\u56db\u79cd\u542f\u52a8\u65b9\u6cd5\uff0c\u901a\u5e38\u5728\u6d4b\u8bd5\u7528\u4f8b\u4e2d\u4f1a\u6d89\u53ca\u5230\uff0c\u6240\u4ee5\u5076\u5c14\u4f1a\u7528\u3002"},{"location":"RELEASE/","title":"\u7248\u672c\u66f4\u65b0\u8bb0\u5f55","text":""},{"location":"RELEASE/#2122023822","title":"2.1.2\uff082023/8/22\uff09","text":"new \u589e\u52a0 OCR \u8bc6\u522b\u81ea\u52a8\u91cd\u8bd5\u673a\u5236\uff0c\u9ed8\u8ba4\u91cd\u8bd5 2 \u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u91cd\u8bd5\u6b21\u6570\uff1b \u4f7f\u7528\u7a97\u7ba1\u6700\u65b0\u63d0\u4f9b\u7684\u4e8c\u8fdb\u5236\u63a5\u53e3\uff0c\u4f18\u5316\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u5728 Wayland \u4e0b\u83b7\u53d6\u7a97\u53e3\u4fe1\u606f\u7684\u65b9\u6cd5\uff1b\u611f\u8c22\u684c\u9762\u6d4b\u8bd5\u90e8 @\u4f55\u6743 @\u5b59\u7fe0 \u3001\u7a97\u7ba1\u7814\u53d1 @\u9ec4\u6cfd\u94ed \u7684\u5927\u529b\u652f\u6301\u3002 \u6269\u5145 skipif \u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\u51fd\u6570\uff1a skipif_xdg_type \u652f\u6301 x11 \u6216 wayland \u4e0a\u8df3\u8fc7\uff1b skipif_cpu_name \u652f\u6301\u4e0d\u540c cpu \u4e0a\u8df3\u8fc7\uff0c\u6bd4\u5982\uff1askipif_cpu_name-KLVVW5821\uff1b "},{"location":"RELEASE/#2102023818","title":"2.1.0\uff082023/8/18\uff09","text":"fix \u4fee\u590d SW \u67b6\u6784\u73af\u5883\u4f9d\u8d56\u7684\u95ee\u9898\uff0c\u539f\u56e0\u662f\u4e4b\u524d\u6211\u8fd9\u91cc\u672c\u5730\u6ca1\u6709 SW \u7684\u673a\u5668\uff0c\u6ca1\u6709\u505a\u76f8\u5173\u9002\u914d\uff1b \u4fee\u590d\u5b50\u9879\u76ee\u5355\u72ec\u9700\u8981\u4e09\u65b9\u5305 pexpect\uff0c\u7531\u4e8e\u4e4b\u524d\u662f\u9884\u88c5\u5230\u955c\u50cf\u91cc\u9762\u7684\uff0c\u4f46\u57fa\u7840\u6846\u67b6\u4e0d\u9700\u8981\uff0c\u56e0\u6b64\u6ca1\u6709\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u91cc\u9762\uff0c\u5bfc\u81f4\u5b50\u9879\u76ee\u4f9d\u8d56\u62a5\u9519\u3002 \u4fee\u590d\u5b50\u9879\u76ee cv \u5bfc\u5165\u62a5\u9519\u7684\u95ee\u9898\uff1b \u539f\u56e0\u4e3a\uff1ayouqu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u517c\u5bb9\u4e24\u79cd\u60c5\u51b5\uff0c\u4e00\u79cd\u662f\u9762\u5411\u670d\u52a1\uff0c\u5c31\u662f\u672c\u5730\u6d4b\u8bd5\u673a\u4e0d\u9700\u8981\u5b89\u88c5 OpenCV\uff0c\u7528\u4f8b\u4e2d\u7684\u56fe\u50cf\u8bc6\u522b\u4f1a\u901a\u8fc7\u8fdc\u7a0b\u670d\u52a1\u63a5\u53e3\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u548c\u7ed3\u679c\u83b7\u53d6\uff1b\u7b2c\u4e8c\u79cd\u662f\u539f\u751f\uff0c\u5c31\u662f\u672c\u5730\u76f4\u63a5\u5b89\u88c5 OpenCV \u76f4\u63a5\u7528\u3002\u4e24\u4e2a\u60c5\u51b5\u7684\u4f18\u5148\u7ea7\u662f\u4f18\u5148\u5224\u65ad\u672c\u5730\u5b58\u5728\uff0c\u5426\u5219\u8d70\u670d\u52a1\u3002 \u524d\u9762\u6211\u4eec\u5df2\u7ecf\u628a OCR \u529f\u80fd\u505a\u4e86\u670d\u52a1\u5316\uff0c\u57fa\u4e8e 1 \u5e74\u591a\u4ee5\u6765\u7684\u89c2\u5bdf\uff0c\u7528\u8d77\u6765\u5f88\u7a33\u5b9a\uff0c\u518d\u4e00\u4e2a\u5c31\u662f OpenCV \u5b89\u88c5\u5305\u662f\u6bd4\u8f83\u81c3\u80bf\u7684\uff0c\u7c97\u7565\u6570\u4e86\u4e0b\u4f9d\u8d56\u6709 30+ \u4e2a\uff0c\u800c\u4e14\u5728\u5404\u67b6\u6784\u4e0a\u4f9d\u8d56\u5305\u8fd8\u4e0d\u5c3d\u76f8\u540c\uff0c\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u65b9\u6848\u4e2d\u4e0d\u592a\u597d\u5904\u7406\uff0c\u6240\u4ee5\u672c\u6b21 2.0 \u7248\u672c\u6211\u4eec\u5927\u80c6\u7684\u5c06\u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u529f\u80fd\u4fee\u6539\u4e3a\u9762\u5411\u670d\u52a1\u7684\u65b9\u5f0f\uff0c\u524d\u671f\u6d4b\u8bd5\u4e00\u5207\u770b\u8d77\u6765\u90fd\u5f88\u548c\u8c10\u3002 \u4f46\u662f\u6ca1\u6ce8\u610f\u5230\u4e4b\u524d\u7ed9\u6d77\u71d5\u59d0\u90a3\u8fb9\u9879\u76ee\u5355\u72ec\u5b9a\u5236\u505a\u4e86\u4e2a\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\uff08\u4e3a\u4e86\u80fd\u7b80\u5355\u5e73\u6ed1\u7684\u8fc1\u79fb\u5230 youqu\uff09\uff0c\u6b64\u63a5\u53e3\u5e95\u5c42\u6ca1\u6709\u517c\u5bb9\u670d\u52a1\u5316\uff0c\u6240\u4ee5\u5979\u90a3\u8fb9\u7684\u9879\u76ee\u8c03\u7528\u6b64\u5b9a\u5236\u63a5\u53e3\u4f1a\u62a5 cv \u5bfc\u5165\u7684\u95ee\u9898\u3002 \u7531\u4e8e\u5c06\u8fd9\u4e2a\u5b9a\u5236\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\u8fdb\u884c\u670d\u52a1\u5316\u517c\u5bb9\u6539\u9020\u9700\u8981\u4e00\u5b9a\u65f6\u95f4\uff0c\u6539\u5b8c\u8fd8\u9700\u8981\u6d4b\u8bd5\uff0c\u4f46\u672c\u6b21\u65f6\u95f4\u6bd4\u8f83\u7d27\uff0c\u56e0\u6b64\u5148\u628a OpenCV \u88c5\u8fdb\u865a\u62df\u73af\u5883\uff0c\u540e\u7eed\u7248\u672c\u518d\u8003\u8651\u9488\u5bf9\u6b64\u63a5\u53e3\u505a\u4fee\u6539\u3002"},{"location":"RELEASE/#2002023816","title":"2.0.0\uff082023/8/16\uff09","text":"YouQu\uff08\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff09\u5f00\u6e90\u4e86\uff0c\u540c\u65f6\u63a8\u51fa\u4e86 2.0 \u7248\u672c\u3002 \u611f\u8c22\u738b\u6ce2\u603b\u3001\u67b6\u6784\u5e08\u5f90\u5c0f\u4e1c\u3001\u7814\u53d1\u7ecf\u7406\u90d1\u5e7c\u6208\u3001\u5218\u90d1\u7b49\u7814\u53d1\u540c\u4e8b\u7684\u5927\u529b\u652f\u6301\u3002 new 1\u3001\u65b0\u7684\u57fa\u7840\u6846\u67b6\u4ee3\u7801\u83b7\u53d6\u65b9\u5f0f\u53ca\u65b0\u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4 YouQu \u540e\u7eed\u5747\u901a\u8fc7 PyPI \u8fdb\u884c\u5305\u7684\u53d1\u5e03\uff0c\u4e5f\u5c31\u662f\u8bf4\u540e\u7eed\u53ef\u4ee5\u4f7f\u7528 pip \u8fdb\u884c\u5b89\u88c5\uff1a sudo pip3 install youqu==2.0.0\n \u8fd9\u91cc\u6709 2 \u4e2a\u5c0f\u70b9\u8981\u6ce8\u610f\uff1a \u63a8\u8350\u4f7f\u7528 sudo pip3 \uff08\u52a0 sudo\uff09\u8fdb\u884c\u5b89\u88c5\uff1b \u5982\u679c\u4e0d\u52a0 sudo \u6709\u4e9b\u673a\u5668\u53ef\u80fd $HOME/.local/bin \u4e0d\u5728\u7cfb\u7edf PATH \u73af\u5883\u76ee\u5f55\u4e0b\uff0c\u5728\u4e0d\u6dfb\u52a0\u73af\u5883\u53d8\u91cf\u7684\u60c5\u51b5\u4e0b\uff0c\u4f1a\u51fa\u73b0 YouQu \u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4\uff08youqu-startproject\uff09\u65e0\u6cd5\u4f7f\u7528\u7684\u95ee\u9898\uff1b \u5f53\u7136\uff0c\u5c06\u4e0a\u8ff0\u8def\u5f84\u6dfb\u52a0\u5230\u73af\u5883\u53d8\u91cf\u4e4b\u540e\u4e5f\u662f\u53ef\u4ee5\u7528\u7684\uff0c\u6240\u4ee5\u6211\u8fd9\u91cc\u662f\u63a8\u8350\u52a0 sudo\uff0c\u4e0d\u52a0 sudo \u4e5f\u662f\u53ef\u4ee5\u7684\uff0c\u53ea\u662f\u9700\u8981\u5173\u6ce8\u4e0b\u73af\u5883\u53d8\u91cf\u7684\u95ee\u9898\u3002 \u63a8\u8350\u6307\u5b9a\u7248\u672c\u53f7\uff08youqu==2.0.0\uff09\u5b89\u88c5\uff0c\u5982\u679c\u4e0d\u6307\u5b9a\u7248\u672c\u53f7\u9ed8\u8ba4\u662f\u5b89\u88c5\u6700\u65b0\u53d1\u5e03\u7684 YouQu \u7248\u672c\uff0c\u4f60\u53ef\u4ee5\u5728 PyPI \u4e0a\u7684 Release history \u91cc\u9762\u67e5\u770b\u6709\u54ea\u4e9b\u7248\u672c\u3002 \u5b89\u88c5\u4e4b\u540e\u4f1a\u81ea\u52a8\u751f\u6210\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu-startproject\uff0c\u4f7f\u7528\u5b83\u53ef\u4ee5\u521d\u59cb\u5316\u5de5\u7a0b\uff0c\u8fd9\u91cc\u4ee5\u97f3\u4e50\u4e3e\u4f8b\uff1b youqu-startproject autotest_deepin_music\n \u8fd9\u6837\u5c31\u4f1a\u5728\u5f53\u524d\u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a autotest_deepin_music \u76ee\u5f55\uff0c\u91cc\u9762\u5305\u542b\u4e86\u57fa\u7840\u6846\u67b6\u6240\u6709\u7684\u4ee3\u7801\uff1b \u4e4b\u540e\uff0c\u8fd8\u662f\u5728 apps \u76ee\u5f55\u4e0b\uff0c\u653e\u5165\u5b50\u9879\u76ee\u7684AT\u4ee3\u7801\u5373\u53ef\uff0c\u4f7f\u7528\u65b9\u6cd5\u548c\u8fc7\u53bb\u4e00\u6837\uff0c\u8fd9\u91cc\u5c31\u4e0d\u591a\u4ecb\u7ecd\u3002 \u53e6\u5916\uff0c\u9664\u4e86\u901a\u8fc7 pip \u83b7\u53d6\u4ee5\u5916\uff0c\u4ecd\u7136\u53ef\u4ee5\u901a\u8fc7\u6e90\u7801\u83b7\u53d6\uff08\u76f4\u63a5 git clone\uff09\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u4f7f\u7528 pip \u5b89\u88c5 YouQu \u65f6\uff0cYouQu \u5305\u7684\u5927\u5c0f\u624d 600+ k\uff0c\u5b89\u88c5\u901f\u5ea6\u8d77\u98de\u3002 2\u3001\u65b0\u7684AT\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848 \u4e3a\u4e86\u89e3\u51b3\u4ee5\u4e0b\u95ee\u9898\uff1a \u8fc7\u53bb\u4e00\u6bb5\u65f6\u95f4\u54b1\u4eec\u7ecf\u5e38\u51fa\u73b0\u7684\uff0c\u4e0d\u540c\u7684AT\u9879\u76ee\u5728\u540c\u4e00\u53f0\u673a\u5668\u4e0a\u90e8\u7f72\u73af\u5883\u65f6\u4f9d\u8d56\u7248\u672c\u51b2\u7a81\u7684\u95ee\u9898\uff0c\u65b0\u65b9\u6848\u4e0d\u540c\u7684\u9879\u76ee\u4f1a\u52a8\u6001\u751f\u6210\u81ea\u5df1\u7684\u865a\u62df\u73af\u5883\uff0c\u76f8\u4e92\u4e4b\u95f4\u4e0d\u5f71\u54cd\uff1b \u4e1a\u5185\u4e3a\u4e86\u89e3\u51b3\u7248\u672c\u51b2\u7a81\u95ee\u9898\u4e00\u822c\u90fd\u4f1a\u4f7f\u7528Python\u865a\u62df\u73af\u5883\u7684\u5de5\u5177\uff0c\u4f46\u662f\u90fd\u6709\u4e2a\u95ee\u9898\uff0c\u65e0\u6cd5\u7ba1\u7406 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u5305\uff0c\u672c\u6b21\u6211\u4eec\u89e3\u51b3\u4e86\u8fd9\u4e2a\u95ee\u9898\uff0c\u80fd\u591f\u5b8c\u5168\u7ba1\u7406\u5e38\u89c4\u7684Python\u5305\uff0c\u4e5f\u80fd\u7ba1\u7406\u5230 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u4e09\u65b9\u5305\uff1b \u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u4f7f\u7528\u65b9\u6cd5\uff1a bash env.sh\n \u53ef\u4ee5\u770b\u51fa\u6765\u548c\u539f\u6765\u4f7f\u7528\u65b9\u6cd5\u6ca1\u6709\u53d8\u5316\uff0c\u4e5f\u5c31\u662f\u8bf4\u4ece\u4f7f\u7528\u7684\u89d2\u5ea6\u662f\u5b8c\u5168\u6ca1\u6709\u533a\u522b\u7684\uff0c\u53ea\u662f\u5185\u90e8\u505a\u4e86\u4e0d\u540c\u7684\u4e8b\u60c5\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u672c\u673a\u90e8\u7f72\u7684\u529f\u80fd\u4ecd\u7136\u4fdd\u7559 env_dev.sh\uff0c\u53ef\u4ee5\u4f5c\u4e3a\u5f00\u53d1\u65f6\u7684\u73af\u5883\u90e8\u7f72\u3002 3\u3001\u65b0\u7684\u9a71\u52a8\u547d\u4ee4 \u8fc7\u53bb\u54b1\u4eec\u90fd\u662f\u4f7f\u7528\u8fd9\u6837\u7684\u547d\u4ee4\u6765\u9a71\u52a8\u6267\u884c\uff1a python3 manage.py run\n \u7531\u4e8e\u9ed8\u8ba4\u57fa\u4e8e\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848\uff0c\u56e0\u6b64\u6211\u4eec\u589e\u52a0\u4e86\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu\uff1b \u65b0\u7684\u9a71\u52a8\u65b9\u5f0f\uff1a youqu manage.py run\n \u53ea\u9700\u8981\u628a python3 \u66ff\u6362\u6210 youqu \u5c31\u53ef\u4ee5\u4e86\uff0c\u770b\u8d77\u6765\u5f88\u548c\u8c10~ 4\u3001\u65b0\u7684\u6587\u6863\u5730\u5740 \u8fc7\u53bb\u54b1\u4eec YouQu \u7684\u5728\u7ebf\u6587\u6863\u662f\u90e8\u7f72\u5728\u516c\u53f8\u5185\u7f51\u7684\uff0c\u73b0\u5728\u5f00\u6e90\u5230 github \u4e86\uff0c\u5916\u90e8\u5f00\u53d1\u8005\u80af\u5b9a\u8bbf\u95ee\u4e0d\u5230\u5185\u7f51\u7684\u6587\u6863\uff0c\u56e0\u6b64\u9700\u8981\u5c06\u6587\u6863\u90e8\u7f72\u5230\u516c\u7f51\u3010\u516c\u7f51\u6587\u6863\u3011\uff1b \u516c\u7f51\u6587\u6863\u4f7f\u7528\u7684\u662f github pages\uff08\u767d\u5ad6\u602a\u4e00\u987f\u72c2\u559c~~\uff09\uff0c\u4f46\u53ef\u80fd\u4f1a\u51fa\u73b0\u6587\u6863\u901f\u5ea6\u6162\u7684\u95ee\u9898\uff08\u4ee3\u7406\u4e0b\u5c31\u597d\u4e86\uff09\uff0c\u4e0d\u8fc7\u6ca1\u5173\u7cfb\uff0c\u54b1\u4eec\u3010\u5185\u7f51\u6587\u6863\u3011\u4ecd\u7136\u4fdd\u7559\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u3002 5\u3001\u5176\u4ed6\u4e00\u4e9b\u5c0f\u5c0f\u529f\u80fd\u66f4\u65b0\uff1a \uff081\uff09\u65b0\u589e\u5173\u95ed\u5206\u8fa8\u7387\u68c0\u6d4b\u7684\u53c2\u6570\u503c\uff1b youqu manage.py run --resolution no\n \u6216\u8005\u4fee\u6539 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387, \u6bd4\u5982\uff1a1920x1080\n;no: \u8868\u793a\u4e0d\u505a\u5206\u8fa8\u7387\u6821\u9a8c\nRESOLUTION = 1920x1080\n resolution \u8fd9\u4e2a\u53c2\u6570\u4e00\u76f4\u90fd\u6709\u7684\uff0c\u53ea\u4e0d\u8fc7\u4e4b\u524d\u662f\u7528\u4e8e\u6307\u5b9a\u5206\u8fa8\u7387\u5927\u5c0f\uff0c\u6bd4\u5982 --resolution 1920x1080\uff0c\u4f46\u6709\u4e9b\u63a5\u53e3\u7684\u9879\u76ee\u4e0d\u9700\u8981\u8fd9\u4e2a\u68c0\u67e5\uff0c\u53ef\u4ee5\u7ed9\u5b83\u4e2a no \u5c31\u597d\u4e86\uff0c\u5f53\u7136 CICD \u4e0a\u5173\u95ed\uff0c\u9700\u8981\u6d41\u6c34\u7ebf\u4e0a\u628a\u8fd9\u4e2a\u53c2\u6570\u52a0\u4e0a\uff1b \uff082\uff09\u65b0\u589e\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u7684\u547d\u4ee4\u884c\u53c2\u6570 \u4e4b\u524d\u8fd9\u4e2a\u914d\u7f6e\u9879\u53ea\u80fd\u5728 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c 1 \u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff0cRERUN >= RECORD_FAILED_CASE\u3002\n;1.\u5173\u95ed\u5f55\u5c4f\uff1aRECORD_FAILED_CASE > RERUN\n;2.\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1aRECORD_FAILED_CASE = 0\nRECORD_FAILED_CASE = 1\n \u73b0\u5728\u5c06\u5f00\u53d1\u5230\u547d\u4ee4\u884c\u53c2\u6570\u3002 youqu manage.py run --record_failed_case 2\n fix \u4fee\u590d remote \u6267\u884c\u65f6\uff0c\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u65e0\u6cd5\u751f\u6210\u6d4b\u8bd5\u62a5\u544a\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1302023710","title":"1.3.0\uff082023/7/10\uff09","text":"fix \u8fdb\u4e00\u6b65\u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b\u53c2\u8003\uff1a\u914d\u7f6ePython\u6e90\u7684\u51e0\u79cd\u65b9\u6cd5 \u4fee\u590d wayland_autotool \u53d7\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86wayland\u4e0b\u5076\u73b0\u627e\u4e0d\u5230 .Xauthority \u6587\u4ef6\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1292023626","title":"1.2.9\uff082023/6/26\uff09","text":"fix \u4f18\u5316\u8fdc\u7a0b\u6267\u884c remote \u7684\u53c2\u6570\u76f4\u63a5\u4f20\u7ed9\u8fdc\u7a0b\u673a\u5668\u7684 run \u547d\u4ee4\uff0c\u4e0d\u7528\u518d\u5355\u72ec\u5904\u7406\u8fdc\u7a0b\u6267\u884c\u7684\u53c2\u6570\u903b\u8f91\uff0c\u540e\u7eed\u4e13\u6ce8\u4e8e\u672c\u5730\u6267\u884c\u529f\u80fd\u5f00\u53d1\uff0c\u8fdc\u7a0b\u6267\u884c\u81ea\u52a8\u9002\u7528\uff1b env.sh \u79fb\u9664 pyyaml \u5b89\u88c5\uff0c\u7531\u5b50\u9879\u76ee\u5728 requirement.txt \u91cc\u9762\u5b9a\u4e49\uff0c\u6846\u67b6\u81ea\u52a8\u52a0\u8f7d\uff1b \u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b "},{"location":"RELEASE/#128202369","title":"1.2.8\uff082023/6/9\uff09","text":"fix \u4fee\u590d\u4e86 pypi \u5b89\u88c5 numpy \u5b58\u5728\u7cfb\u7edf\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#127202368","title":"1.2.7\uff082023/6/8\uff09","text":"fix env.sh \u4e2d\u5b89\u88c5 Python \u5305\u672a\u6307\u5b9a\u7248\u672c\u65f6\uff0c\u65e5\u5fd7\u8f93\u51fa\u5b89\u88c5\u7684\u7248\u672c\uff1b pdocr-rpc 2.0.1\nallure-custom 1.2.1\nfunnylog 1.1.3\n \u4fee\u590d -f \u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u62a5\u9519\u7684\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#126202367","title":"1.2.6\uff082023/6/7\uff09","text":"fix \u4fee\u590d wayland \u4e0a\u8c03\u7528\u9f20\u6807\u4e2d\u952e\u3001\u53f3\u952e\u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b \u4fee\u590d pubilic/dde_desktop_public_widget \u91cc\u9762\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u5b9a\u4f4d\u684c\u9762\u6587\u4ef6\u7684\u65b9\u6cd5\uff0c\u5750\u6807\u6ca1\u6709\u62c6\u5305\u7684\u95ee\u9898\uff1b \u4f18\u5316\u4e86\u7b49\u5f85\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b pycreeze \u7248\u672c\u5347\u7ea7\u5230 0.1.29\uff0c\u5bfc\u81f4\u4e0e pyautogui 0.9.53 \u4e0d\u517c\u5bb9\uff0cenv.sh \u91cc\u9762\u589e\u52a0\u6307\u5b9a pycreeze \u7248\u672c\u4e3a 0.1.28\uff1b "},{"location":"RELEASE/#1252023516","title":"1.2.5\uff082023/5/16\uff09","text":"new --app \u53c2\u6570\u540e\u9762\u65b0\u589e\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u76ee\u524d\u652f\u6301\u4e09\u79cd\u53c2\u6570\u4f20\u5165\u65b9\u5f0f\uff1a ~$: youqu run -a deepin-music\n~$: youqu run -a autotest_deepin_music\n~$: youqu run -a apps/autotest_deepin_music\n \u200b \u540e\u4e24\u79cd\u5165\u53c2\u65b9\u5f0f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\u3002 remote \u8fdc\u7a0b\u6267\u884c\u65b0\u589e\u4ece\u547d\u4ee4\u884c\u4f20\u5165\u6d4b\u8bd5\u673a\u4fe1\u606f\uff0c\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679c password \u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6 setting/remote.ini \u4e2d CLIENT_PASSWORD \u7684\u503c,\u6bd4\u5982\uff1auos@10.8.13.33:1 \u6216 uos@10.8.13.33 \uff1b python3 manage.py remote -c uos@10.8.13.33/uos@10.8.13.34\npython3 manage.py remote -c uos@10.8.13.33:1/uos@10.8.13.34:2\n fix \u65e5\u5fd7\u6a21\u5757\u4fee\u6539\u4e3a\u51fd\u6570\u6267\u884c\u4e4b\u524d\u6253\u5370\u65e5\u5fd7\uff1b \u65e5\u5fd7\u6a21\u5757\u589e\u52a0\u767d\u540d\u5355\uff0c\u901a\u8fc7\u7c7b\u540d\u5f00\u5934\uff0c\u7ed3\u675f\uff0c\u5305\u542b\u7b49\u5173\u952e\u5b57\u63a7\u5236\u9700\u8981\u6253\u5370\u7684\u51fd\u6570\u65e5\u5fd7\uff1b \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5982\u679c\u4f20\u5165\u4e86 app_name \u53ea\u4f1a\u5c06 apps \u76ee\u5f55\u4e0b app_name \u7684\u76ee\u5f55\u53d1\u9001\u5230\u6d4b\u8bd5\u673a\uff1b env.sh \u79fb\u9664 python3-dev\uff1b \u4fee\u590d Wayland \u4e0b env.sh \u73af\u5883\u5b89\u88c5\u5931\u8d25\u7684\u95ee\u9898\uff0c\u4f18\u5316\u4e86 deb \u4f9d\u8d56\u5b89\u88c5\u7684\u903b\u8f91\uff1b \u5c06 env.sh \u5237\u65b0\u6e90\u7684\u65e5\u5fd7\u5728\u7ec8\u7aef\u663e\u793a\uff0c\u89e3\u51b3\u5728 CI \u73af\u5883\u4e0b\uff0c\u957f\u65f6\u95f4\u4e0d\u8f93\u51fa\u65e5\u5fd7\u8fde\u63a5\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d1060 \u534e\u4e3a\u673a\u578b\u5b89\u88c5\u952e\u9f20\u5de5\u5177\u65f6\u4f9d\u8d56\u4e0d\u517c\u5bb9\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1242023227","title":"1.2.4\uff082023/2/27\uff09","text":"fix \u4fee\u6539 CURRENT \u6587\u4ef6\uff1b "},{"location":"RELEASE/#1232023227","title":"1.2.3\uff082023/2/27\uff09","text":"new pylint.sh \u652f\u6301\u901a\u8fc7\u4f4d\u7f6e\u53c2\u6570\u4f20\u5165\u6587\u4ef6\u8def\u5f84\uff1abash pylint.sh apps/autotest_deepin_music,\u597d\u5904\u662f\u53c2\u6570\u8def\u5f84\u53ef\u4ee5\u5728\u7ec8\u7aef\u8865\u5168\uff1b \u65b0\u589e\u7cfb\u7edf\u547d\u4ee4 youqu-pylint \uff0c\u7528\u4e8e\u9759\u6001\u4ee3\u7801\u626b\u63cf\uff0c\u4f7f\u7528\u65b9\u6cd5: youqu-pylint apps/autotest_deepin_music\uff1b \u7531\u4e8e\u7cfb\u7edf\u4e00\u4e9b dbus \u63a5\u53e3\u6539\u53d8\uff0c\u516c\u5171\u5e93\u4e2d\u7684 dbus \u65b9\u6cd5\u5c06\u4e0d\u518d\u7ef4\u62a4\uff0c\u7531\u5b50\u9879\u76ee\u5728 other_widget.py \u91cc\u9762\u8fdb\u884c\u7ef4\u62a4\uff1b fix \u4fee\u590d ssh \u73af\u5883\u4e0b\u8fd0\u884c\u63d0\u793a \u201c\u65e0\u6cd5\u8fde\u63a5\u201d \u7684\u95ee\u9898\uff1b \u4fee\u590d\u8fd0\u884c\u65f6\u7a0b\u5e8f\u9000\u51fa\uff0c\u4e0d\u8f93\u51fa\u5f02\u5e38\u65e5\u5fd7\u7684\u95ee\u9898\uff1b \u4fee\u590dyouqu remote xxx \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5728\u670d\u52a1\u7aef Ctrl + C \u65e0\u6cd5\u505c\u6b62\u7a0b\u5e8f\u8fd0\u884c\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#122202328","title":"1.2.2\uff082023/2/8\uff09","text":"new \u65b0\u589e\u6c14\u6ce1\u7c7b\u56fe\u50cf\u8bc6\u522b\u65b9\u6848\uff1bimage_utils.py::ImageUtil::get_during\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u533a\u57df\u8bc6\u522b\uff0c\u4f20\u5165 [x, y, w, h]\uff0cx: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u76ee\u6807\u56fe\u7247\uff0c\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\uff1b env.sh \u79fb\u9664 pypinyin; \u4f18\u5316\u6267\u884c env.sh \u65f6\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b manage.py \u79fb\u9664\u4e86\u53c2\u6570 session_timeout \uff0c\u6846\u67b6\u6839\u636e\u5168\u5c40\u7684 timeout \u4ee5\u53ca\u7528\u4f8b\u81ea\u5b9a\u4e49\u7684 timeout \u81ea\u52a8\u8ba1\u7b97\u51fa sessiontimeout \u7684\u503c\uff1b \u65b0\u589e ocr \u670d\u52a1\u5668\u94fe\u63a5\u91cd\u8bd5\uff0c\u9ed8\u8ba4\u91cd\u8bd51\u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u53c2\u6570\uff1b fix \u4fee\u590d\u4e86\u4e00\u4e9b pylint \u626b\u63cf\u7684\u4ee3\u7801\u98ce\u683c\u95ee\u9898\uff1b \u91cd\u65b0\u8bbe\u8ba1\u4e86\u6d4b\u8bd5\u62a5\u544a\u4e3b\u9898\uff1b "},{"location":"RELEASE/#121202316","title":"1.2.1\uff082023/1/6\uff09","text":"new \u652f\u6301\u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6267\u884c\u7528\u4f8b\uff1b\u53ef\u5c06python3 manage.py \u66ff\u6362\u4e3a youqu \uff1a youqu run -a deepin-music -k 001\n RPC \u670d\u52a1 IP \u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u6307\u5b9a\u4e0d\u540c\u7684\u7aef\u53e3\uff1b \u5728\u7ebf\u6587\u6863\u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u539f\u6765\u7684\u5730\u5740 10.8.10.215 \u5c06\u4e0d\u5728\u4f7f\u7528\uff1b fix \u4fee\u590d --count \u53c2\u6570\u53ef\u80fd\u51fa\u73b0\u4e0e\u5176\u4ed6\u6846\u67b6\u7684\u5de5\u7a0b\u4f9d\u8d56\u5b58\u5728\u51b2\u7a81\uff0c\u62a5\u9519\u91cd\u590d\u6ce8\u518c\u7684\u95ee\u9898\uff1b \u4fee\u590d CI \u73af\u5883\u4e0b\u591a\u4e2a\u5de5\u7a0b\u5b58\u5728 Python \u73af\u5883\u53d8\u91cf\u6307\u5411\u9519\u8bef\uff0c\u5bfc\u5305\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u5355\u72ec\u8fd0\u884c\u65b9\u6cd5\u65f6\u65e0\u65e5\u5fd7\u8f93\u51fa\u7684 Bug\uff1b "},{"location":"RELEASE/#12020221230","title":"1.2.0\uff082022/12/30\uff09","text":"1.1.4 \u7248\u672c\u9002\u914d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e14\u65b0\u589e\u4e86\u8f83\u591a\u65b0\u7279\u6027\uff0c\u6211\u4eec\u8ba1\u5212\u4f7f\u7528 1.1.4 \u7248\u672c\u8fd0\u884c\u4e00\u6bb5\u65f6\u95f4\uff0c1.2.0 \u7248\u672c\u5c06\u4fee\u590d\u671f\u95f4\u51fa\u73b0\u7684 Bug\uff0c\u7136\u540e\u4f5c\u4e3a\u7a33\u5b9a\u7248\u672c\u53d1\u5e03\u3002 new \u4fee\u6539\u5de5\u7a0b\u540d\u79f0\u4e3a youqu\uff1b \u5c06 sphinx \u6587\u6863\u5de5\u7a0b\u8fc1\u79fb\u5230\u5355\u72ec\u7684\u4ed3\u5e93\uff1b fix \u4fee\u590d startapp \u521b\u5efa\u5de5\u7a0b\u65f6\u5b58\u5728\u5de5\u7a0b\u540d\u79f0\u65f6\u65e0\u6cd5\u7ee7\u7eed\u521b\u5efa\uff1b \u4fee\u590d\u4e86 OCR \u670d\u52a1\u5728\u5e76\u53d1\u65f6\u53ef\u80fd\u51fa\u73b0\u65e0\u6cd5\u8fd4\u56de\u7ed3\u679c\u7684\u95ee\u9898\uff0c\u63d0\u5347 OCR \u670d\u52a1\u9ad8\u5e76\u53d1\u7a33\u5b9a\u6027\uff1b \u4fee\u590d PMS \u540c\u6b65\u6807\u7b7e\u5230 CSV \u6587\u4ef6\u4e0d\u652f\u6301\u7528\u4f8b\u5e93\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11420221214","title":"1.1.4\uff082022/12/14\uff09","text":"new \u65b0\u589e startapp \u5b50\u547d\u4ee4\u521b\u5efa\u5b50\u9879\u76ee\u5de5\u7a0b\u6a21\u677f: python3 manage.py startapp autotest_deepin_xxx \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u91cd\u590d\u6267\u884c\u6b21\u6570\uff1b \u53bb\u6389\u6279\u91cf\u6267\u884c\u524d\u6536\u96c6\u7528\u4f8b\u7684\u6b65\u9aa4\uff1b \u589e\u52a0\u5f00\u59cb\u6267\u884c\u65f6\u6253\u5370\u4e00\u4e9b\u6267\u884c\u53c2\u6570\uff0c\u5982\uff1a \u7528\u4f8b\u6536\u96c6\u6570\u91cf: 99\n\u5931\u8d25\u91cd\u8dd1\u6b21\u6570: 1\n\u6700\u5927\u5931\u8d25\u6b21\u6570: 49\n\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4: 200.0s (03\u520620\u79d2)\n\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4: 11880s (3\u5c0f\u65f618\u52060\u79d2)\n \u5b9a\u5236\u4fee\u6539allure\u62a5\u544alogo\u3001title\u3001\u9ed8\u8ba4\u8bed\u8a00\uff1b manage.py \u6267\u884c\u5f00\u59cb\u65f6\u6253\u5370 logo \u548c\u5f53\u524d\u7248\u672c\uff1a \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u255a\u2588\u2588\u2557 \u2588\u2588\u2554\u255d \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2584\u2584 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2580\u2580\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u2584\u2588 \u2584\u2588 \u2588 \u2588 \u2588 \u2584 \u2588 \u2584 \u2580\u2580\u2588 \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\uff1b \u88c5\u9970\u5668\u65b9\u6cd5\u6307\u5b9a\u6b21\u6570\uff1b @pytest.mark.count(2)\ndef test_music_001():\npass\n \u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u6b21\u6570\uff1b python3 manage.py run -a deepin-music -k 001 --count 2\n \u200b image_utils \u589e\u52a0\u51fd\u6570 save_temporary_picture\uff0c\u652f\u6301\u6307\u5b9a\u5c4f\u5e55\u533a\u57df\u622a\u56fe\u5e76\u8fd4\u56de\u56fe\u7247\u5b58\u653e\u7684\u672c\u5730\u8def\u5f84\uff0c\u540e\u7eed\u4f7f\u7528 assert_image_exist \u8fdb\u884c\u65ad\u8a00 Python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(x, y, width, height) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) button_center \u65b0\u589e btn_size \u83b7\u53d6\u63a7\u4ef6\u5de6\u4e0a\u89d2\u5750\u6807\u53ca\u957f\u5bbd\uff0c\u7528\u4e8e\u52a8\u6001\u7684\u622a\u53d6\u5143\u7d20\u7684\u56fe\u7247\uff0c\u53ef\u7528\u4e8e\u5b9a\u4f4d\u65ad\u8a00 python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u6240\u6709\u97f3\u4e50\u6309\u94ae\")) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) allure \u62a5\u544a\u4e2d\u5b9a\u4f4d\u95ee\u9898\u9664\u4e86\u65e5\u5fd7\u3001\u622a\u56fe\u3001\u5f55\u5c4f\u5916\uff0c\u8c03\u7528\u7684\u51fd\u6570\u589e\u52a0\u4e86 step \u6b65\u9aa4\u5c55\u793a\uff1b env.sh \u65b0\u589e\u5b89\u88c5\u5b50\u9879\u76ee Python \u4e09\u65b9\u4f9d\u8d56\uff0c\u5728\u5b50\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u5199 requirement.txt \u6587\u4ef6\uff0cenv.sh \u4f1a\u81ea\u52a8\u52a0\u8f7d\uff1b ocr \u8bc6\u522b\u65b0\u589e\u652f\u6301\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\u8fdb\u884c\u6587\u5b57\u8bc6\u522b\uff0c\u51cf\u5c11\u56e0\u5168\u5c4f\u8bc6\u522b\u65f6\uff0c\u5176\u4ed6\u6587\u5b57\u7684\u5e72\u6270 Python # \u65ad\u8a00\u97f3\u4e50\u7684\u5220\u9664\u5f39\u7a97\u4e2d\uff0c\u5305\u542b\u4e86\u201c\u786e\u8ba4\u201d\u7684\u6587\u5b57 self.assert_ocr_exist(\"\u786e\u8ba4\", picture_abspath=DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u5220\u9664\u5f39\u7a97\"))) \u65ad\u8a00\u51fd\u6570\u7684\u8c03\u7528\u4e5f\u4f1a\u81ea\u52a8\u6253\u5370\u65e5\u5fd7; env.sh \u65b0\u589e\u88c1\u526a\u4f9d\u8d56\u7684\u65b9\u6848\uff1b fix \u4fee\u590d Jenkins \u73af\u5883\u4e0b\uff0c apps \u76ee\u5f55\u4e0b\u5b50\u9879\u76ee\u5b58\u5728 auotest_deepin_xxx@tmp \u76ee\u5f55\uff0c\u5728\u4f20\u5165 app_name \u540e\u65e0\u6cd5\u6267\u884c\u7528\u4f8b\u7684\u95ee\u9898\uff1b \u4fee\u590d\u81ea\u52a8\u751f\u6210 case_list.csv \u6587\u4ef6\u65f6\uff0c\u7528\u4f8b\u987a\u5e8f\u88ab\u8c03\u6574\u7684\u95ee\u9898\uff1b env.sh \u73af\u5883\u5b89\u88c5\u79fb\u9664 git \u548c curl\uff1b \u4fee\u590d\u7528\u4f8b\u5728 setup \u9636\u6bb5\u62a5\u9519\u540e\uff0c\u672a\u5199\u5165 ci_result.json \u7684\u95ee\u9898\uff1b \u79fb\u9664 uos_ci.py\uff1b "},{"location":"RELEASE/#11320221028","title":"1.1.3\uff082022/10/28\uff09","text":"new \u65b0\u589e\u56fe\u50cf\u65ad\u8a00\u6210\u529f\u8f93\u51fa\u5339\u914d\u5ea6\uff1b \u65b0\u589e\u73af\u5883\u5b89\u88c5 yaml \u4f9d\u8d56\uff1b \u65b0\u589e\u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6570\u636e\u56de\u586b\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b \u65b0\u589e\u6d4b\u8bd5\u7ed3\u679c\u8868\u60c5\u663e\u793a\uff0c\u5e76\u4f18\u5316\u4e86\u65e5\u5fd7\u7684\u6392\u7248\uff1b \u65b0\u589e --top {number} \u7528\u4e8e\u8bb0\u5f55\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0c\u65e5\u5fd7\u751f\u6210\u5230 report/logs/top.log\uff1b fix \u4fee\u590d\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4f46\u7ec8\u7aef\u6ca1\u6709\u9519\u8bef\u65e5\u5fd7\u8f93\u51fa\u7684\u95ee\u9898\uff1b \u4fee\u6539\u5931\u8d25\u7528\u4f8b\u56de\u6eaf\u65e5\u5fd7\u4e3a\u8be6\u7ec6\u7ea7\u522b\uff1b \u4fee\u590d\u4e86\u6267\u884c\u8fdb\u5ea6\u672a\u8ba1\u7b97\u8df3\u8fc7\u7528\u4f8b\u7684\u95ee\u9898\uff0c\u5e76\u4f18\u5316\u4e86\u8fdb\u5ea6\u83b7\u53d6\u7684\u7b97\u6cd5\uff1b \u4fee\u590d env.sh \u5728 V23 \u73af\u5883\u4e0b\u5b89\u88c5\u65e0\u6cd5\u8bfb\u53d6\u5bc6\u7801\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 pms \u6d4b\u8bd5\u5957\u6267\u884c\u6216\u6d4b\u8bd5\u5355\u6267\u884c\u65f6\uff0c\u7528\u4f8bID\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b env.sh \u91cc\u9762 hub.deepin.com \u66f4\u6362\u6210 it.uniontech.com\uff1b uos_ci.py \u6d4b\u8bd5\u7ed3\u679c\u7edf\u8ba1\u65f6\uff0c\u603b\u6570\u5254\u9664 skip \u7684\u6570\u91cf "},{"location":"RELEASE/#11220220921","title":"1.1.2\uff082022/09/21\uff09","text":"new \u5728\u6ca1\u6709\u5b89\u88c5 dogtail \u7684\u60c5\u51b5\u4e0b\uff0c\u4e5f\u80fd\u4f7f\u7528 sniff \u5de5\u5177\uff1b fix \u4fee\u590d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e2d\u6ca1\u6709\u5b89\u88c5 AT \u73af\u5883\u6267\u884c uos_ci.py \u62a5\u9519\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11120220919","title":"1.1.1\uff082022/09/19\uff09","text":"new \u65b0\u589e\u6267\u884c\u8fdb\u5ea6\u663e\u793a\uff0c\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u65f6\u65e5\u5fd7\u8f93\u51fa\u5f53\u524d\u8fdb\u5ea6\uff1a[\u5f53\u524d\u6307\u5b9a\u7b2c\u51e0\u6761/\u7528\u4f8b\u603b\u6570]\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u7528\u4f8b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\u6240\u6709\u5931\u8d25\u7528\u4f8b\u7684\u5217\u8868\uff1b \u5173\u95ed\u7ec8\u7aef\u8f93\u51fa\u6355\u83b7\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u65e5\u5fd7\u5feb\u7167\uff1b \u4f18\u5316\u7ec8\u7aef\u8f93\u51fa\u5931\u8d25\u4fe1\u606f\u5197\u957f\u4e3a\u7b80\u8981\u4fe1\u606f\u8f93\u51fa\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u663e\u793a 10 \u4e2a\u6267\u884c\u6700\u6162\u7684\u7528\u4f8b\u5217\u8868\uff0c\u5e76\u8be6\u7ec6\u5217\u51fa\u5404\u4e2a\u9636\u6bb5\u7684\u8017\u65f6\uff1b \u5931\u8d25\u91cd\u8dd1\u7528\u4f8b\u91cd\u8dd1\u4e4b\u524d\u5ef6\u8fdf 1 \u79d2\uff1b \u65b0\u589e\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4ecd\u7136\u5f3a\u5236\u6267\u884c\uff1b \u7528\u4f8b\u6536\u96c6\u65f6\u4ec5\u5728 apps \u76ee\u5f55\u4e0b\u8fdb\u884c\uff0c\u5ffd\u7565 src,setting,public \u76ee\u5f55\uff1b \u65b0\u589e allure \u62a5\u544a\u5907\u4efd\u529f\u80fd\uff0c\u9ed8\u8ba4\u5907\u4efd\u81f3 allure_back \u76ee\u5f55\u4e0b\uff1b manage.py\u65b0\u589e\u53c2\u6570 --lastfailed \u7528\u4e8e\u53ea\u8dd1\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\u7684\u529f\u80fd\uff1b fix \u4fee\u590d\u4e86\u5728\u6ca1\u6709\u6307\u5b9a\u5e94\u7528\u540d\u79f0\u6267\u884c\u65f6\uff0cxml \u62a5\u544a\u751f\u6210\u8def\u5f84\u5f02\u5e38\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 uos_ci.py \u4f20\u5165 timeout \u548c session_timeout \u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11020220916","title":"1.1.0\uff082022/09/16\uff09","text":"new \u65b0\u589ePMS\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u652f\u6301\u591a\u79cd\u6570\u636e\u56de\u586b\u6a21\u5f0f\uff1b \u4f18\u5316\u4e86\u901a\u8fc7\u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u65f6PMS \u722c\u866b\u7684\u6027\u80fd\uff1b \u65b0\u589e .gitmodules \u6587\u4ef6\uff0c\u7528\u4e8e\u6807\u8bb0\u6240\u6709\u5b50\u9879\u76ee\uff0c\u65b9\u4fbf\u7edf\u4e00\u62c9\u53d6\u4ee3\u7801\uff1b env.sh \u9002\u914d\u793e\u533a\u7248\u4e0a\u5b89\u88c5\u81ea\u52a8\u5316\u73af\u5883\uff1b \u589e\u52a0\u6267\u884c\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u9519\u8bef\u7684\u529f\u80fd\uff1b README.md \u589e\u52a0 Wayland \u4e0b\u4f7f\u7528\u3001\u6d4b\u8bd5\u62a5\u544a\u67e5\u770b\u3001\u5e38\u89c1\u95ee\u9898\u7b49\u7684\u6587\u6863\u8bf4\u660e\uff1b \u589e\u52a0\u4e86\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u5bf9 setup\u3001call\u3001teardown \u8fdb\u884c\u65e5\u5fd7\u5206\u6bb5\uff1b fix \u4fee\u590d\u4e86 \u786e\u8ba4\u4fee\u590d \u5217\u6ca1\u5199\u8868\u5934\uff0c\u4f46\u5199\u4e86 fixed-xxx \u6807\u7b7e\uff0c\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u540c\u4e00\u5e94\u7528\u5185\u591a\u4e2a csv \u6587\u4ef6\u4e2d \u786e\u8ba4\u4fee\u590d \u5217\u6709\u7684\u5199\u4e86\uff0c\u6709\u7684\u6ca1\u5199\uff0c\u53ef\u80fd\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 INFO \u65e5\u5fd7\uff0c\u663e\u793a\u4e3a DEBUG \u7684\u95ee\u9898\uff1b\u4fee\u590d\u4e86\u90e8\u5206\u673a\u5668\u4e0a INFO \u65e5\u5fd7\u5185\u5bb9\u663e\u793a\u4e3a\u7ea2\u8272\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\u770b\u4e0d\u5230\u8be6\u7ec6\u4fe1\u606f\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10220220822","title":"1.0.2\uff082022/08/22\uff09","text":"new \u79fb\u9664 loguru\uff0c\u66ff\u6362\u4e3a logging\uff0c\u63a5\u53e3\u4fdd\u6301\u4e0d\u53d8\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u53d7\u5f71\u54cd\uff1b \u9ed8\u8ba4\u5f00\u542f coredump\uff1b fix \u4fee\u590d\u4e86\u4e09\u65b9\u5e93 loguru \u5076\u73b0\u5f02\u5e38\uff0c\u5bfc\u81f4\u7a0b\u5e8f\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7b2c\u4e00\u6b21\u5931\u8d25\u4e0d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10120220812","title":"1.0.1\uff082022/08/12\uff09","text":"new \u65b0\u589e RELEASE.md \u6587\u4ef6\uff0c\u7528\u4e8e\u8bb0\u5f55\u5386\u53f2\u53d1\u5e03\u7248\u672c\u7684\u66f4\u65b0\u5185\u5bb9\uff1b \u517c\u5bb9 Wayland \u6a21\u5f0f\u4e0b\u6267\u884c\u7528\u4f8b\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u7528\u7ba1\u5f53\u524d\u6d4b\u8bd5\u673a\u6267\u884c\u73af\u5883\uff0c\u6846\u67b6\u4f1a\u81ea\u52a8\u6839\u636e\u5f53\u524d\u73af\u5883\u8d70\u4e0d\u540c\u7684\u4ee3\u7801\u903b\u8f91\uff1b \u7531\u4e8e\u9700\u8981\u4fee\u6539 dogtail \u6e90\u4ee3\u7801\uff0c\u56e0\u6b64\u5c06\u4fee\u6539\u540e\u7684\u6e90\u7801\u653e\u5165\u5230\u6838\u5fc3\u5e93\u91cc\u9762 src/depends/dogtail \u540e\u7eed\u7248\u672c\u5c06\u4e0d\u9700\u8981\u5728\u7cfb\u7edf\u4e2d\u5b89\u88c5dogtail\uff1b \u5982\u679c\u5e94\u7528\u5e93\u540c\u6837\u4f7f\u7528\u4e86\u7cfb\u7edf\u5b89\u88c5\u7684 dogtail \u53ef\u80fd\u4f1a\u62a5\u9519\uff0c\u89e3\u51b3\u65b9\u6848\u662f\u5c06\u4ee3\u7801\u4e2d\u7684 import dogtail \u4fee\u6539\u4e3a from src.depends import dogtail ; fix \u91cd\u8dd1\u5931\u8d25\u4e4b\u540e\u624d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff0c\u4fee\u6539\u4e3a\u5931\u8d25\u4e4b\u540e\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":"# Attribution \uff1achengdu Test Team\n# Date \uff1a2021/08/20\n \u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d \u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d \u4ed3\u5e93\u5730\u5740\uff1ahttps://gitlabcd.uniontech.com/autotest/cd-desktop-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u65b9\u6848\u6982\u8ff0","text":"\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u667a\u80fd\u8bc6\u522b\u5e94\u7528\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u7528\u4e8e\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u64cd\u4f5c\u8fc7\u7a0b\u4e2d\u7684\u5143\u7d20\u5b9a\u4f4d\u4ee5\u53ca\u5224\u65ad\u7ed3\u679c\u65f6\u7684\u65ad\u8a00\u5904\u7406\uff1b\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\uff0c\u6d4b\u8bd5\u673a\u4e0a\u7684\u753b\u9762\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u5230\u670d\u52a1\u5668\u4e0a\uff0c\u670d\u52a1\u5668\u5bf9\u89c6\u9891\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\u540e\uff0c\u670d\u52a1\u5668\u667a\u80fd\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\u6210\u529f\uff0c\u7136\u540e\u5bf9\u6d4b\u8bd5\u673a\u4e0b\u53d1\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\uff0c\u6d4b\u8bd5\u673a\u63a5\u53d7\u5e76\u6267\u884c\u4e0b\u4e00\u6b65\u64cd\u4f5c\u3002 \u670d\u52a1\u5668\u4e0e\u6d4b\u8bd5\u673a\u4e4b\u95f4\u7684\u94fe\u63a5\uff1a \u670d\u52a1\u5668\u901a\u8fc7 USB \u4e32\u53e3\u8bbe\u5907\uff08USB-HID \u534f\u8bae\uff09\u6a21\u62df\u9f20\u6807\u952e\u76d8\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u64cd\u4f5c\u3002 \u901a\u8fc7\u89c6\u9891\u91c7\u96c6\u8bbe\u5907\u6355\u83b7\u6d4b\u8bd5\u673a\u7684\u5b9e\u65f6\u753b\u9762\u4f20\u8f93\u7ed9\u670d\u52a1\u5668\u3002 \u670d\u52a1\u5668\u5bf9\u91c7\u96c6\u7684\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\uff0c\u8bc6\u522b\u5176\u4e2d\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5e76\u8fd4\u56de\u5143\u7d20\u63a7\u4ef6\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\uff0c\u670d\u52a1\u5668\u901a\u8fc7\u667a\u80fd\u5316\u5206\u6790\uff0c\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e00\u81f4\u5c06\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\u901a\u8fc7\u4e32\u53e3\u6a21\u62df\u952e\u9f20\u4fe1\u53f7\u53d1\u9001\u7ed9\u6d4b\u8bd5\u673a\uff1b\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e0d\u4e00\u81f4\u5c06\u4f1a\u8fdb\u5165\u4e2d\u65ad\u5904\u7406\u53ca\u5f02\u5e38\u7ed3\u679c\u8f93\u51fa\uff0c\u7ee7\u7eed\u6267\u884c\u540e\u7eed\u573a\u666f\uff0c\u76f4\u81f3\u6240\u6709\u7528\u4f8b\u6d4b\u8bd5\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u6df1\u5ea6\u5b66\u4e60\u73af\u5883\u642d\u5efa","text":"\u6a21\u578b\u8bad\u7ec3\u4e3b\u8981\u5bf9 GPU \u6709\u8981\u6c42\uff0c\u8bad\u7ec3\u6a21\u578b\u7684\u673a\u5668\u663e\u5b58\u4e0d\u4f4e\u4e8e 6G\uff0c\u5176\u4ed6\u914d\u7f6e\u65e0\u7279\u6b8a\u8981\u6c42\u3002 \u63a8\u8350\u6027\u4ef7\u6bd4\u8f83\u9ad8\u914d\u7f6e \u64cd\u4f5c\u7cfb\u7edf: UnionTech OS Desktop 20 Professional Linux version 4.19.0-desktop-amd64 (deepin@deepin-PC) (Uos 8.3.0.3-3+rebuild) \u5904\u7406\u5668: Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz (\u516b\u6838 / \u5341\u516d\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460M-HDV(RD)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))/8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: TU116 [GeForce GTX 1660]\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u865a\u62df\u73af\u5883\u5b89\u88c5","text":"cd ~\nwget -c https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh\nbash Miniconda3-latest-Linux-x86_64.sh\n \u4e00\u8def\u56de\u8f66 \u7b2c\u4e00\u6b21\u63d0\u793a\u8f93\u5165 yes/no \uff1a\u8f93\u5165 yes \u7ee7\u7eed\u4e00\u8def\u56de\u8f66 \u7b2c\u4e8c\u6b21\u63d0\u793a\uff1a\u8f93\u5165 no cd ~/miniconda3/bin\nsudo chmod 777 activate\n \u6fc0\u6d3bconda\u73af\u5883 . ./activate\n \u6dfb\u52a0\u516c\u53f8\u5185\u7f51\u6e90 conda config --add channels bioconda\nconda config --add channels conda-forge\n \u5982\u679c\u662f\u5916\u7f51\u6dfb\u52a0\u5916\u7f51\u6e90 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/\n \u5982\u679c\u8981\u5220\u9664\u6e90 conda config --remove-key channels\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"2\u3001\u5b89\u88c5\u4f9d\u8d56","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u521b\u5efa\u865a\u62df\u73af\u5883","text":"conda remove --name mmlab --all # \u79fb\u9664\u6240\u6709\u865a\u62df\u73af\u5883\n conda create -n mmlab python=3.7\n conda activate mmlab\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-pytorch","title":"\uff082\uff09\u5b89\u88c5 Pytorch","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install torch==1.7.0+cu101 torchvision==0.8.1+cu101 torchaudio==0.7.0 -f https://download.pytorch.org/whl/torch_stable.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-mmcv","title":"\uff083\uff09\u5b89\u88c5 MMCV","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install mmcv-full==1.3.3 -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.7.0/index.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"\uff084\uff09\u5b89\u88c5\u663e\u5361\u9a71\u52a8","text":"\u6839\u636e\u4f60\u7684\u663e\u5361\u4e0b\u8f7d\u5bf9\u5e94\u9a71\u52a8\uff0c\u6bd4\u5982\u6211\u7684\u663e\u5361\u4e3a GTX1660\uff0c\u9a71\u52a8\u7248\u672c\u4e3a 430\uff0c\u9a71\u52a8\u4e0b\u8f7d\u5730\u5740\uff1ahttps://www.nvidia.cn/Download/Find.aspx?lang=cn CTRL+ALT+F2 \u8fdb\u5165tty\n \u7981\u7528 nouveau \u9a71\u52a8 sudo vim /etc/modprobe.d/blacklist-nouveau.conf\n \u586b\u5165\uff1a blacklist nouveau options nouveau modeset=0\n \u5237\u65b0\u914d\u7f6e\u6587\u4ef6 sudo update-initramfs -u reboot \u91cd\u542f\u540e\u518d\u8fdb\u5165 tty \u5173\u95ed\u56fe\u50cf\u754c\u9762\uff0c\u8f93\u5165\u547d\u4ee4\u5173\u95ed\u56fe\u50cf\u754c\u9762 sudo service lightdm stop\n \u5b89\u88c5\u9a71\u52a8 sudo chmod a+x NVIDIA-Linux-x86_64-430.run\nsudo ./NVIDIA-Linux-x86_64-430.run\n reboot\u91cd\u542f\uff0cnvidia-smi\u67e5\u770b\u5b89\u88c5\u72b6\u6001\u3002\u6ce8\u610f\u770b\u4e0bcuda\u7248\u672c\uff0c10.1\uff0cdriver\u7248\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u6570\u636e\u6807\u6ce8","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u6570\u636e\u6807\u6ce8","text":"\u6807\u6ce8\u4e4b\u524d\u9700\u8981\u5148\u8f6c\u6362\u56fe\u7247\u5927\u5c0f\uff0c\u5e76\u4e14\u4ee5\u6570\u5b57\u547d\u540d\uff0c\u6bcf\u7ec4\u547d\u540d\u9012\u589e"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"\uff081\uff09\u8f6c\u6362\u5927\u5c0f\u5e76\u91cd\u547d\u540d","text":"rename_pic.py import os\nimport sys\nimport cv2\nimport time\nimport getpass\nusername = getpass.getuser()\nsource_path = f\"/home/{username}/Desktop/right_menu\" # \u56fe\u7247\u8def\u5f84\nsource_dest = os.path.join('/'.join(source_path.split(\"/\")[:-1]), 'tmp')\nif not os.path.exists(source_dest):\nos.mkdir(source_dest)\nstart_name = sys.argv[1]\nfile_name_list = list()\nfor file in os.listdir(source_path):\nif file.endswith('.png'):\nfile_name_list.append(file)\nstart_name = int(start_name)\nfor file in file_name_list:\nos.rename(os.path.join(source_path,file), os.path.join(source_path, f\"{str(start_name)}.png\"))\nstart_name += 1\ntime.sleep(1)\nfor file in os.listdir(source_path):\nimage = os.path.join(source_path, str(file))\nsrc = cv2.imread(image)\nresult = cv2.resize(src, (960, 540))\nresizeImage = os.path.join(source_dest, str(file))\nprint(resizeImage)\ncv2.imwrite(str(resizeImage), result)\ncv2.waitKey(0)\ncv2.destroyAllWindows()\ntime.sleep(1)\nos.system(f'rm -rf {source_path}/*')\nos.system(f'mv {source_dest}/* {source_path}')\nos.system(f'rm -rf {source_dest}')\nprint(\"\u4e0b\u4e00\u4e2a\u5e8f\u53f7\uff1a\", start_name)\n \u6839\u636e\u7ec8\u7aef\u8f93\u51fa\u7684\u4e0b\u4e00\u4e2a\u5e8f\u53f7\u7684\u63d0\u793a\uff0c\u6267\u884c Python \u6587\u4ef6\u7684\u65f6\u5019\u4f20\u53c2\u3002 python rename_pic.py 249\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"\uff082\uff09\u5de5\u5177\u6807\u6ce8","text":"\u4f7f\u7528\u5de5\u5177 labelImg \u6807\u6ce8 sudo pip3 install PyQt5==5.13\nsudo pip3 install labelImg\n \u7ec8\u7aef\u76f4\u63a5\u8f93\u5165 labelImg\uff0c\u56de\u8f66 \u6807\u6ce8\u6a21\u5f0f\u9009\u62e9\uff1aPascalVOC"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u667a\u80fd\u6807\u6ce8","text":"\u6253\u5f00\u5c4f\u5e55\u5f55\u5236\u8f6f\u4ef6\uff0c\u5f55\u5236\u624b\u52a8\u64cd\u4f5c\u4e00\u6b21\u6d4b\u8bd5\u7528\u4f8b\uff0c\u7136\u540e\u5c06\u5f55\u5236\u7684\u89c6\u9891\u8fdb\u884c\u5206\u5e27\uff0c\u7136\u540e\u5bf9\u6bd4\u524d\u4e24\u5e27\u56fe\u6807\u76f8\u4f3c\u5ea6\uff0c\u5254\u9664\u76f8\u4f3c\u5ea6\u8fc7\u9ad8\u7684\u56fe\u7247\uff0c\u5728\u4fdd\u8bc1\u7d20\u6750\u591a\u6837\u6027\u7684\u524d\u63d0\u4e0b\uff0c\u5254\u9664\u91cd\u590d\u591a\u4f59\u7684\u56fe\u7247\u751f\u6210\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u96c6\uff0c\u7136\u540e\u53d6\u51fa\u63a7\u4ef6\u6a21\u677f\u6570\u636e\u96c6\uff0c\u901a\u8fc7 OpenCV \u6a21\u677f\u5339\u914d\u83b7\u53d6\u63a7\u4ef6\u5728\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u56fe\u7247\u4e2d\u6240\u5728\u7684\u5de6\u4e0a\u3001\u5de6\u4e0b\u3001\u53f3\u4e0a\u3001\u53f3\u4e0b\u56db\u5904\u5750\u6807\uff0c\u4ece\u800c\u6839\u636e\u6a21\u677f\u6570\u636e\u96c6\u751f\u6210\u6807\u6ce8\u6570\u636e\u3002\u53c2\u8003\u76ee\u5f55 AnnotationMaterial"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"\uff081\uff09\u6a21\u677f\u6570\u636e\u96c6\u51c6\u5907","text":"1\u3001\u5728\u754c\u9762\u622a\u53d6\u9700\u8981\u6807\u6ce8\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u653e\u5728\u76ee\u5f55\u4e0b AnnotationMaterial/template/img 2\u3001\u7ef4\u62a4\u63a7\u4ef6\u540d\u4e0e\u5143\u7d20\u63a7\u4ef6\u7684\u952e\u5bf9\uff0c\u4e00\u4e2a\u63a7\u4ef6\u540d\u53ef\u5bf9\u5e94\u591a\u4e2a\u5143\u7d20\u63a7\u4ef6 menu:\n- menu.jpg\n- menu1.jpg\n- menu2.jpg\n- menu3.jpg\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"\uff082\uff09\u7d20\u6750\u96c6\u51c6\u5907","text":"\u5f55\u5236\u89c6\u9891\u6216\u6216\u5c4f\u5e55\u622a\u56fe\u653e\u7f6e\u76ee\u5f55 AnnotationMaterial/source"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u5f00\u59cb\u6807\u6ce8","text":"python3 AnnotationMaterial/main.py\n \u751f\u6210\u7684\u6807\u6ce8\u6570\u636e\u5b58\u653e\u5728 AnnotationMaterial/result"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#mmdetection","title":"\u56db\u3001MMDetection","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1-mmdetection","title":"1\u3001 MMDetection \u4ee3\u7801","text":"MMDetection \u662f\u4e00\u4e2a\u6709\u540d\u7684\u6df1\u5ea6\u5b66\u4e60\u76ee\u6807\u68c0\u6d4b\u5f00\u6e90\u9879\u76ee\uff0c\u4e5f\u662f openMMlab \u7684\u62db\u724c\u9879\u76ee\uff0c\u4e3a\u4ec0\u4e48\u9009\u62e9\u5b83\uff0c\u5c0f\u5b69\u513f\u6ca1\u5a18\u8bf4\u6765\u8bdd\u957f\uff0c\u611f\u5174\u8da3\u53ef\u4ee5\u81ea\u884c\u6df1\u5165\u4e86\u89e3\uff1b \u4f60\u53ef\u4ee5\u76f4\u63a5\u5728 GitHub \u4e0a\u514b\u9686\u4ee3\u7801\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u54b1\u4eec\u4ed3\u5e93\u4e0b Train \u76ee\u5f55\u4e2d\u4ee3\u7801\uff0cTrain \u4e2d\u7684\u4ee3\u7801\u4e5f\u662f\u4ece GitHub \u4e0a\u62c9\u53d6\u7684\uff0c\u4e0d\u8fc7\u6211\u4eec\u6839\u636e\u9879\u76ee\u9700\u8981\u505a\u4e86\u4e00\u4e9b\u4e8c\u6b21\u5f00\u53d1\uff0c\u63a8\u8350\u76f4\u63a5\u4f7f\u7528\u5b83\u3002 \u5982\u679c\u4f60\u60f3\u4ece GitHub \u4e0a\u62c9\uff1a git clone https://github.com/open-mmlab/mmdetection.git\n# \u4e0d\u80fd\u76f4\u63a5\u62c9\u53d6\u4e3b\u5206\u652f\uff0c\u5efa\u8bae\u4f7f\u75282.12\u7248\u672c\uff0c\u4e0d\u540c\u7684\u7248\u672c\u5bf9\u5e94\u7684mmcv\u7248\u672c\u662f\u4e0d\u540c\u7684\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-voc2coco","title":"2\u3001\u62c9\u53d6 voc2coco \u4ee3\u7801","text":"git clone https://github.com/Tony607/voc2coco.git\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-coco","title":"3\u3001\u8f6c\u6362 coco \u6570\u636e\u96c6","text":"\u5c06\u6240\u6709\u7684\u56fe\u7247\u548cxml\u6587\u4ef6\u653e\u5165train2017\uff0c\u4ece\u4e2d\u6311\u9009\u51e0\u7ec4\u653e\u5165val2017\uff08\u6d4b\u8bd5\u96c6\uff09 cd mmdetection/data/coco\npython voc2coco.py train2017 annotations/instances_train2017.json\npython voc2coco.py val2017 annotations/instances_val2017.json\n \u751f\u6210json\u6587\u4ef6"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4_1","title":"4\u3001\u4fee\u6539\u914d\u7f6e","text":"\uff081\uff09\u8bfb\u53d6\u6a21\u578b\u540d\u79f0 import json\nmodule_name = []\nwith open('./instances_train2017.json', \"r+\") as f:\njson_file = f.read()\njson_dict = json.loads(json_file)\nmodule_list = json_dict.get('categories')\nfor module_info in module_list:\nname = module_info.get('name')\nmodule_name.append(name)\nprint(module_name)\nprint(\"module_num:\", len(module_name))\n # \u6ce8\u610f\u5bf9\u6bd4instances_train2017.json\u91cc\u9762\u6a21\u578b\u540d\u79f0\u7684\u987a\u5e8f\uff0c\u4e0eCLASSES\u548ccoco_classes\u91cc\u9762\u7684\u987a\u5e8f\u4fdd\u6301\u4e00\u81f4\u3002\n \uff082\uff09\u4fee\u6539 faster_rcnn_r101_2x_coco.py mmdetection/xianjin/faster_rcnn_r101_2x_coco.py \u4fee\u653946\u884c\uff0cnum_clasess\u7684\u503c\uff0c\u65b0\u589e1\u4e2a\uff0c\u5c31 +1\uff1b \uff083\uff09\u4fee\u6539 coco.py mmdetection/mmdet/datasets/coco.py CLASSES = ()\uff0c\u5728\u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b \uff084\uff09\u4fee\u6539 class_names.py mmdetection/mmdet/core/evaluation/class_names.py coco_classes \u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#5","title":"5\u3001\u7f13\u5b58\u6e05\u7406","text":"\u5220\u9664 mmdetection/build \u76ee\u5f55 python setup.py install\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#6","title":"6\u3001\u8bad\u7ec3\u6a21\u578b","text":"\uff081\uff09\u6307\u5b9a\u81ea\u5df1\u914d\u7f6e\u7684\u8bad\u7ec3\u6a21\u578b\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py --gpus 1\n \uff082\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u6d4b\u8bd5\u96c6\u7ed3\u679c\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py xianjin/epoch_24.pth --show\n \uff083\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u51c6\u786e\u5ea6\uff1b python tools/analysis_tools/analyze_logs.py plot_curve xianjin/20210530_011907.log.json --keys acc\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#7","title":"7\u3001\u5feb\u6377\u64cd\u4f5c","text":"python3 run.py\n \u5c06\u4ee5\u4e0a 4 - 7 \u6b65\u64cd\u4f5c\u6574\u5408\u6210 run.py\uff0c\u4e00\u952e\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u4e94\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\uff1b \u670d\u52a1\u7aef\u4e00\u53f0\uff08\u76ee\u524d\u4ec5\u652f\u6301AMD\u67b6\u6784\uff09\uff1b \u91c7\u96c6\u76d2\u4e00\u4e2a \uff08ACASIS hdmi\u89c6\u9891\u91c7\u96c6\u5361\uff0chttps://item.jd.com/10024310742602.html \uff09\uff1b USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\uff1b USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff1b \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5USB\u5ef6\u957f\u7ebf\uff1b \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u63a8\u8350\u914d\u7f6e","text":"\u6267\u884c\u7528\u4f8b\u7684\u670d\u52a1\u7aef\u5bf9\u914d\u7f6e\u6ca1\u6709\u7279\u6b8a\u8981\u6c42\uff0c\u5982\u679c\u6761\u4ef6\u5141\u8bb8\u914d\u7f6e\u8d8a\u9ad8\uff0c\u8bc6\u522b\u901f\u5ea6\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n \u6d4b\u8bd5\u673a\u4e0a\u4e0d\u6267\u884c\u4efb\u4f55\u811a\u672c\uff0c\u5177\u4f53\u914d\u7f6e\u6839\u636e\u6d4b\u8bd5\u9700\u8981\u51b3\u5b9a\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#usb_mk","title":"\u516d\u3001USB_MK\u4e32\u53e3\u9a71\u52a8\u65b9\u6cd5","text":"\u4f4d\u4e8econtrol_method\u76ee\u5f55\u4e0b\u7684usb_mk.py\u6587\u4ef6 \uff081\uff09\u5217\u51fa\u53ef\u901a\u4fe1\u7684\u7aef\u53e3 python3 -m serial.tools.list_ports -v\n \uff082\uff09\u4fee\u6539\u4e32\u53e3\u7684\u6743\u9650 sudo chmod 777 /dev/ttyACM0\n \uff083\uff09\u5b9e\u4f8b\u5316USB_MK import UsbMk\nusb_mk = UsbMk(\"/dev/ttyACM0\", 9600) # \u8bbe\u5907\u9ed8\u8ba49600\u4e3a\u6ce2\u7279\u7387\uff0c\u63a7\u5236\u4f20\u8f93\u901f\u7387\n \uff084\uff09USB\u4e32\u53e3\u8bbe\u5907\u9ed8\u8ba4\u6ce2\u7279\u7387\u4e3a9600\uff08\u7ecf\u6d4b\u8bd5\u6ce2\u7279\u73879600\u51c6\u786e\u6027\u6700\u597d\uff09\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up() # \u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u6c49\u5b57\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e\n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff083\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff084\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff085\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() # \u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2\n \uff086\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff087\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff088\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e03\u3001\u65b9\u6cd5\u8c03\u7528\u5165\u53c2\u89c4\u5219","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_7","title":"1\u3001\u57fa\u7c7b","text":"class Base:\ndef __init__(self):\nself._obj = image\nself._usb = usb_mk\ndef find_element_by_ai(self, element):\nreturn self._obj.find_element(element)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_6","title":"2\u3001\u5165\u53c2\u8bf4\u660e","text":"\u56fe\u50cf\u8bc6\u522b\u65b9\u6cd5\u5165\u53e3\u4e3a Base \u7c7b\u4e0b\u7684 find_element_by_ai \u3002\u4ec5\u63a5\u53d7\u4e00\u4e2a\u53c2\u6570 element\uff0c\u7c7b\u578b\u4e3a string\u3002 \u53ef\u8bc6\u522b\u7684 string \u683c\u5f0f\uff1a \uff081\uff09\u5927\u56fe\u6807\uff08 \u56fe\u6807\u5927\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\uff0c\u4f8b\uff1a Base().find_element_by_ai(\"window\")\n \uff082\uff09\u5927\u56fe\u6807 / \u5c0f\u56fe\u6807\uff08\u56fe\u6807\u5c0f\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5c0f\u56fe\u6807\uff0c\u4f8b\uff1awindow/search_btn Base().find_element_by_ai(\"window/search_btn\")\n \uff083\uff09\u5927\u56fe\u6807 / OCR\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\u5185\u7684\u6587\u5b57\uff0c\u4f8b\uff1amenu/\u5c5e\u6027 Base().find_element_by_ai(\"menu/\u5c5e\u6027\")\n \uff084\uff09OCR\uff1a\u5168\u5c4f\u8bc6\u522b\u6587\u5b57 Base().find_element_by_ai(\"\u641c\u7d22\")\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516b\u3001\u9690\u85cf\u9f20\u6807","text":"\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u8fc7\u6765\u7684\u89c6\u9891\u6d41\uff0c\u5728\u8bc6\u522b\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u53d7\u5230\u9f20\u6807\u5f71\u54cd\uff0c\u56e0\u6b64\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u9690\u85cf\u9f20\u6807\u3002 \u5c4f\u853d\u9f20\u6807\u5149\u6807\u663e\u793a ```shell script /etc/lightdm/lightdm.conf \u5728`[Seat:*]`\u4e0b\u9762\u6dfb\u52a0\u53c2\u6570\n```shell script\nxserver-command=X -bs -core -nocursor\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e5d\u3001\u667a\u80fd\u81ea\u52a8\u5316\u7684\u610f\u4e49","text":"1\u3001\u6539\u5584 Acessibility \u5b9a\u4f4d\u7684\u7a33\u5b9a\u6027\u95ee\u9898 Acessibility \u5c5e\u6027\u5b9a\u4f4d\u5b58\u5728\u5076\u5c14\u5931\u6548\u7684\u60c5\u51b5 \uff081\uff09\u5f00\u53d1\u5728\u505a\u65b0\u9700\u6c42\u5f00\u53d1\u65f6\u53ef\u80fd\u6d89\u53ca\u5230\u5bf9\u5c5e\u6027\u6807\u7b7e\u7684\u4fee\u6539\u6216\u8005\u5c42\u7ea7\u7684\u8c03\u6574\uff0c\u53ef\u80fd\u9020\u6210\u81ea\u52a8\u5316\u7528\u4f8b\u65e0\u6cd5\u5b9a\u4f4d\u5230\u5143\u7d20\u3002 \u6bd4\u59821040\u9636\u6bb5\uff0c\u97f3\u4e50\u91cd\u6784\u7684\u65f6\u5019\uff0c\u5f00\u53d1\u5bf9\u90e8\u5206\u5c5e\u6027\u548c\u5c42\u7ea7\u505a\u4e86\u4fee\u6539\uff0c\u5bfc\u81f4\u81ea\u52a8\u5316\u7528\u4f8b\u5b9a\u4f4d\u65b9\u6cd580%\u9700\u8981\u4fee\u6539\u3002 \u5f00\u53d1\u65b0\u529f\u80fd\u7684\u65f6\u5019\u5076\u5c14\u4e5f\u4f1a\u5bf9\u5c5e\u6027\u505a\u8c03\u6574\uff0c\u9047\u52305\u6b21\u3002 \uff082\uff09\u76ee\u524d\u4e3b\u8981\u4f7f\u7528Dogtail\u8bc6\u522b\u5e94\u7528Acessibility\u5c5e\u6027\u8fdb\u884c\u5b9a\u4f4d\uff0c\u662f\u83b7\u53d6\u5e94\u7528\u5f53\u524d\u754c\u9762\u7684\u5c5e\u6027tree\uff0c\u5728\u5e94\u7528\u8df3\u8f6c\u540e\uff0cDogtail\u5b58\u5728\u65e0\u6cd5\u53ca\u65f6\u83b7\u53d6\u5f53\u524d\u5c5e\u6027\u5217\u8868\u7684\u60c5\u51b5\u3002 \u591a\u5a92\u4f53\u8c03\u7528\u6587\u7ba1\u7a97\u53e3\u7684\u65f6\u5019\uff0c\u51fa\u73b0\u627e\u4e0d\u5230\u6587\u7ba1\u91cc\u9762\u5143\u7d20\u7684\u60c5\u51b5\uff0c\u76ee\u524d\u51fa\u73b010+\u6b21\u3002 \u5e94\u7528\u8bbe\u7f6e\u9875\u9762\u7684\u5c5e\u6027\u5076\u5c14\u5b58\u5728\u627e\u4e0d\u5230\u7684\u60c5\u51b5\uff0c\u9047\u52305\u6b21\u3002 \uff083\uff09Dogtail\u5de5\u5177\u672c\u8eab\u5b58\u5728\u95ee\u9898\uff0c\u6709\u65f6\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u5019\u5f88\u6162\uff0c\u8ba9\u4eba\u65e0\u6cd5\u63a5\u53d7\uff0c\u76ee\u524d\u51fa\u73b0\u8fc7\u5f88\u591a\u6b21\u3002 \u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u95f4\u6bd4\u5e73\u5e38\u61623\u500d\uff0c\u51fa\u73b04\u6b21\u3002 2\u3001\u89e3\u51b3\u4e86\u4f7f\u7528\u7edd\u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898 \u90e8\u5206\u63a7\u4ef6\u65e0\u6cd5\u6dfb\u52a0 Acessibility \u5c5e\u6027\u4ece\u800c\u4f7f\u7528\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u51fa\u73b0\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898\u3002 \uff081\uff09\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u65b9\u6cd5\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u76ee\u6807\u56fe\u7247\u8d44\u6e90\uff0c\u5728 UI \u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u4f1a\u6d89\u53ca\u5230\u76ee\u6807\u8d44\u6e90\u7684\u66ff\u6362\uff0c\u6bd4\u8f83\u8017\u8d39\u4eba\u529b\u3002 \uff082\uff09\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6cd5\u5bf9\u6bd4\u7cbe\u5ea6\u6bd4\u8f83\u641e\uff0c\u5982\u679cUI \u7684\u53d8\u66f4\u4f1a\u9020\u6210\u65e0\u6cd5\u51c6\u786e\u5b9a\u4f4d\u5230\uff0c\u81ea\u52a8\u5316\u811a\u672c\u5065\u58ee\u6027\u4e0d\u8db3\u3002 3\u3001\u4f7f\u7528\u673a\u5668\u5206\u79bb\uff0c\u89e3\u51b3\u4e86\u81ea\u52a8\u5316\u811a\u672c\u5bf9\u5e94\u7528\u7684\u5f71\u54cd\uff0c\u771f\u5b9e\u8fd8\u539f\u7528\u6237\u7684\u4f7f\u7528\u573a\u666f \u673a\u5668\u5206\u79bb\u7684\u67b6\u6784\u8bbe\u8ba1\uff0c\u4fdd\u8bc1\u4e86\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u73af\u5883\u5b8c\u5168\u7b49\u540c\u4e8e\u7528\u6237\uff0c\u6392\u9664\u6d4b\u8bd5\u811a\u672c\u7684\u5f71\u54cd\u3002 \uff081\uff09\u76ee\u524d\u7684\u529f\u80fd\u81ea\u52a8\u5316\u662f\u5728\u6d4b\u8bd5\u673a\u4e0a\u76f4\u63a5\u8fd0\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\uff0c\u52a0\u4e0a\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u6211\u4eec\u6dfb\u52a0\u4e86\u4e00\u4e9b\u8fdb\u7a0b\u76d1\u63a7\u3001\u89c6\u9891\u5f55\u5236\u7b49\u529f\u80fd\uff0c\u81ea\u52a8\u5316\u811a\u672c\u672c\u8eab\u4f1a\u6d88\u8017\u4e00\u4e9b\u7cfb\u7edf\u8d44\u6e90\uff0c\u65e0\u6cd5\u8fd8\u539f\u771f\u662f\u7684\u7528\u6237\u4f7f\u7528\u573a\u666f\u3002 \uff082\uff09\u6027\u80fd\u6d4b\u8bd5\u9700\u8981\u6392\u9664\u5176\u4ed6\u7a0b\u5e8f\u7684\u8d44\u6e90\u6d88\u8017\u5f71\u54cd\uff0c\u6027\u80fd\u81ea\u52a8\u5316\u91c7\u7528\u673a\u5668\u5206\u79bb\uff0c\u4fdd\u8bc1\u4e86\u6027\u80fd\u6570\u636e\u7684\u51c6\u786e\u6027\u3002 \u4ee5\u524d\u7684\u7528\u4f8b\u6267\u884c\u8017\u65f6\u6ca1\u6761\u572830\u79d2\u5de6\u53f3\uff0c\u73b0\u5728\u7528\u4f8b\u8017\u65f6\u572810\u79d2\u3002 4\u3001\u89e3\u51b3\u4e86UI \u8c03\u6574\u5bfc\u81f4\u5b9a\u4f4d\u5931\u8d25\u7684\u4e0d\u7a33\u5b9a\u6027\u95ee\u9898 \uff081\uff09\u89e3\u51b3\u4e86\u56e0 UI \u8c03\u6574\u5bfc\u81f4\u63a7\u4ef6\u4f4d\u7f6e\u53d8\u5316\u6216\u8272\u5dee\u53d8\u5316\u540e\u5b9a\u4f4d\u4e0d\u51c6\u786e\u7684\u95ee\u9898\uff0c\u53ea\u8981\u63a7\u4ef6\u6587\u6848\u548c\u63a7\u4ef6\u5916\u8fb9\u6846\u65e0\u53d8\u5316\u5747\u53ef\u51c6\u786e\u5b9a\u4f4d\uff1b \uff082\uff09\u76ee\u524d\u4e5f\u4f1a\u91c7\u7528\u57fa\u4e8eUI\u7684\u5b9a\u4f4d\u65b9\u6848\uff0c\u5982\u679cUI\u4f4d\u7f6e\u6709\u8c03\u6574\uff0c\u4f1a\u5bfc\u81f4\u5143\u7d20\u65e0\u6cd5\u5b9a\u4f4d\u3002 5\u3001\u7b80\u5316\u4e86\u7528\u4f8b\u7ed3\u6784\uff0c\u63d0\u5347\u7f16\u5199\u53cb\u597d\u5ea6 \uff081\uff09\u667a\u80fd\u81ea\u52a8\u5316\u8bc6\u522b\u5143\u7d20\u7684\u65b9\u6cd5\u53ea\u6709\u4e00\u4e2a\uff0c\u5c31\u662f\u57fa\u4e8e\u6211\u4eec\u8bad\u7ec3\u7684\u6a21\u578b\u8bc6\u522b\u89c6\u9891\u6d41\u4e2d\u7684\u5143\u7d20\uff0c\u7ecf\u8fc7\u811a\u672c\u5c01\u88c5\u4e4b\u540e\uff0c\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u4e2d\u6240\u6709\u5b9a\u4f4d\u7684\u64cd\u4f5c\u90fd\u53ea\u9700\u8981\u8c03\u7528\u8fd9\u4e00\u4e2a\u65b9\u6cd5\u5c31\u884c\u4e86\uff0c\u7f16\u5199\u81ea\u52a8\u5316\u811a\u672c\u7684\u96be\u5ea6\u5927\u5927\u964d\u4f4e\u3002 \uff082\uff09\u4e5f\u662f\u7531\u4e8e\u8c03\u7528\u65b9\u6cd5\u7b80\u5355\uff0c\u5728 UI \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u4e2d\u7684\u5206\u5c42\u7ed3\u6784\u5c06\u4f1a\u51cf\u5c11\uff0c\u591a\u7ee7\u627f\u7684\u60c5\u51b5\u4f1a\u51cf\u5c11\uff0c\u81ea\u52a8\u5316\u4ee3\u7801\u7684\u8c03\u7528\u7ed3\u6784\u4e5f\u4f1a\u53d8\u5f97\u7b80\u5355\uff0c\u800c\u4e14\u529f\u80fd\u6d4b\u8bd5\u540c\u5b66\u7f16\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u66f4\u52a0\u5bb9\u6613\u4e0a\u624b\u3002 \u4ee5\u524d\u5199\u7528\u4f8b\u7531\u4e8e\u9700\u8981\u7ed3\u5408\u4e0d\u540c\u7684\u6a21\u5757\uff0c\u8c03\u7528\u4e0d\u540c\u7684\u65b9\u6cd5\uff0c\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u5e76\u5b8c\u6210\u8c03\u8bd5\u7684\u65f6\u95f4\u5e73\u5747\u572820-30\u5206\u949f\uff0c\u73b0\u5728\u5199\u7528\u4f8b\u811a\u672c\u80fd\u57285\u5206\u949f\u5de6\u53f3\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":"# =============================================\n# Attribution : Application Test Department III\n# Time : 2023/1/3\n# Author : ut003281\n# =============================================\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u7b80\u8ff0","text":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5 \u901a\u8fc7\u81ea\u52a8\u5316\u624b\u6bb5\u5bf9\u5e94\u7528\u8fdb\u884c\u6027\u80fd\u6d4b\u8bd5\uff0c\u63d0\u4f9b\u65b9\u4fbf\u7684\u73af\u5883\u90e8\u7f72\u3001\u8fd0\u884c\u914d\u7f6e\u3001\u7528\u4f8b\u7f16\u5199\u7b49\uff0c\u7528\u4e8e\u684c\u9762\u5e94\u7528\u7684\u51b7\u70ed\u542f\u52a8\u3001\u8d44\u6e90\u62f7\u8d1d\u3001\u9875\u9762\u8df3\u8f6c\u7b49\u6027\u80fd\u573a\u666f\u6d4b\u8bd5\u3002 \u4ed3\u5e93\u5730\u5740\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-perf-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u4ee3\u7801\u7ed3\u6784","text":"autotest-perf-aitest\n\u251c\u2500\u2500 apps # \u5b58\u653e\u6240\u6709\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u811a\u672c\n\u251c\u2500\u2500 conftest.py # pytest hook\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 CURRENT # \u7248\u672c\u5185\u5bb9\n\u251c\u2500\u2500 docs # \u6587\u6863\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u952e\u503c\u5bf9\u7167\u8868.pdf # \u4e32\u53e3\u7ebfcode\u4e0e\u6309\u952e\u7684\u5bf9\u7167\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u6027\u80fd\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\u6267\u884c\u5668\u4f7f\u7528\u6307\u5357.md # \u6267\u884c\u5668\u811a\u672c\u4f7f\u7528\u6307\u5357\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 USB\u4e32\u53e3\u8f6cUSB\u952e\u76d8\u9f20\u6807\u7ebf\u534f\u8bae\u6587\u4ef6V1.0.pdf # \u4e32\u53e3\u534f\u8bae\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput-0.28.2.zip # Linux\u4e0b\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\u7684\u6e90\u7801\uff0c\u53ef\u6839\u636e\u67b6\u6784\u6253\u5305\n\u251c\u2500\u2500 manage.py # \u529f\u80fd\u4e3b\u5165\u53e3\n\u251c\u2500\u2500 pytest.ini # pytst \u914d\u7f6e\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 setting # \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 client.ini # \u6d4b\u8bd5\u673a IP \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5168\u5c40\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dev_env.sh # \u5bbf\u4e3b\u673a\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose_no_relay.yml # \u65e0\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose.yml # \u6709\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker_login.sh # docker \u767b\u9646\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 res\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 black.png # \u5168\u9ed1\u56fe\u7247\uff0c\u7528\u4e8e\u4fee\u6539\u58c1\u7eb8\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_5000.deb # 3A5000 \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_amd64.deb # amd \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_arm64.deb # arm \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_mips64.deb # mips \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_sw_64.deb # sw \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 server.ini # \u670d\u52a1\u5668\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 setup.sh # \u5bb9\u5668\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 template # \u521b\u5efa app \u57fa\u7840\u811a\u672c\u6a21\u677f\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 app_template\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ${app_name}_widget.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 control-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 images\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 test_${app_name}_01_scene.json-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 test_${app_name}_01_scene.py-tpl\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 uos_docker # \u5bb9\u5668\u73af\u5883\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dockerfile\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 requirements.txt\n\u2514\u2500\u2500 src\n \u251c\u2500\u2500 analysis_save.py # \u89e3\u6790\u56fe\u7247\u6d41\u7ed3\u679c\uff0c\u6c47\u603b\u751f\u6210 excel \u62a5\u544a\n\u251c\u2500\u2500 base_widget.py # \u5c01\u88c5\u7684\u57fa\u7840\u64cd\u4f5c\uff0c\u5e94\u7528\u8c03\u7528\u7684\u4e3b\u5165\u53e3\u65b9\u6cd5\n\u251c\u2500\u2500 cmdctl.py # \u8c03\u7528\u547d\u4ee4\u884c\u4f7f\u7528\n\u251c\u2500\u2500 global_value.py # \u5168\u5c40\u53d8\u91cf\n\u251c\u2500\u2500 image_utils.py # \u56fe\u7247\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 __init__.py\n \u251c\u2500\u2500 logger_utils.py # \u65e5\u5fd7\u914d\u7f6e\n\u251c\u2500\u2500 pdocr.py # ocr \u914d\u7f6e\n\u251c\u2500\u2500 public_method.py # \u4e00\u4e9b\u65b9\u4fbf\u7684\u5c01\u4f4f\n\u251c\u2500\u2500 record.py # \u5f55\u5c4f\u76f8\u5173\n\u251c\u2500\u2500 rtk # \u8fd0\u884c\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 _base.py # \u4e00\u4e9b\u679a\u4e3e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 install_env.py # \u5b89\u88c5\u73af\u5883\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 local_runner.py # \u8fd0\u884c\u7528\u4f8b\n\u251c\u2500\u2500 serial_communication # \u4e32\u53e3\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 power_control.py # \u7ee7\u7535\u5668\u64cd\u4f5c\uff0c\u4f7f\u7528\u7ee7\u7535\u5668\u8fde\u63a5\u4e3b\u673a\u7535\u6e90\uff0c\u63a7\u5236\u5f00\u5173\u673a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 serial_common.py # \u4e32\u53e3\u516c\u5171\u65b9\u6cd5\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 usb_mk.py # \u952e\u9f20\u64cd\u4f5c\u57fa\u7840\u5c01\u88c5\n\u251c\u2500\u2500 shortcut_key.py # \u5feb\u6377\u952e\u7684\u5c01\u88c5\n\u251c\u2500\u2500 singleton.py # \u5355\u4f8b\u6a21\u5f0f\n\u251c\u2500\u2500 start_app.py # \u521b\u5efa app\n\u2514\u2500\u2500 write_xlsx.py # \u751f\u6210 excel\n# __init__.py \u6587\u4ef6\u4e3a\u6807\u8bc6\u8be5\u76ee\u5f55\u662f\u4e00\u4e2aPython\u7684\u6a21\u5757\u5305\uff0c\u9879\u76ee\u4e2d\u7684__init__.py\u5747\u4e3a\u7a7a\u6587\u4ef6\u3002\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u73af\u5883\u642d\u5efa","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\u3002 \u670d\u52a1\u7aef\u4e00\u53f0\u3002\uff08\u4ec5\u652f\u6301 AMD \u67b6\u6784\uff0c\u82e5\u9700\u5176\u4ed6\u67b6\u6784\uff0c\u54a8\u8be2\u76f8\u5173\u5f00\u53d1\u4eba\u5458\uff09 \u91c7\u96c6\u76d2\u4e00\u4e2a\u3002 \uff08ACASIS HDMI \u89c6\u9891\u91c7\u96c6\u76d2\uff0chttps://item.jd.com/100013302599.html#crumb-wrap \uff09 USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\u3002\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"\uff082\uff09\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\u3002 USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff08USB3.0 \u63a5\u53e3\u4e0a\uff09\u3002 \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5 USB \u5ef6\u957f\u7ebf\u3002 \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u670d\u52a1\u7aef\u63a8\u8350\u914d\u7f6e","text":"\u914d\u7f6e\u8d8a\u9ad8\uff0c\u89e3\u6790\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"2\u3001\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa","text":" \u6253\u5f00\u63a7\u5236\u4e2d\u5fc3\uff0c\u8d26\u6237\u8bbe\u7f6e\u4e3a\u3010\u81ea\u52a8\u767b\u5f55\u3011\u548c\u3010\u65e0\u5bc6\u7801\u767b\u5f55\u3011\uff0c\u7535\u6e90\u7ba1\u7406\u4e2d\u4f7f\u7528\u7535\u6e90\u5168\u90e8\u8bbe\u7f6e\u4e3a\u3010\u4ece\u4e0d\u3011\uff0c\u5f00\u542f\u5f00\u53d1\u8005\u6a21\u5f0f\u3002 \u6839\u636e\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u8981\u6c42\uff0c\u5bfc\u5165\u76f8\u5173\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\uff1a\u5bfc\u5165\u76f8\u518c\u3001\u5f71\u9662\u3001\u97f3\u4e50\u7684\u6d4b\u8bd5\u8d44\u6e90\u3002 \u5728\u670d\u52a1\u7aef\u6253\u5f00\u76f8\u673a\u5e94\u7528\u540e\uff0c\u5c06\u6d4b\u8bd5\u673a\u684c\u9762\u58c1\u7eb8\u66f4\u6362\u4e3a\u7eaf\u8272\u58c1\u7eb8\uff08\u6ce8\u610f\uff0c\u670d\u52a1\u7aef\u9700\u63d0\u524d\u5f00\u542f\u76f8\u673a\u540e\u518d\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u58c1\u7eb8\uff0c\u5efa\u8bae\u7eaf\u9ed1\u58c1\u7eb8 setting/res/black.png\uff09 \u5728\u6587\u4ef6\u7ba1\u7406\u5668\u4e2d\uff0c\u5c06\u9009\u9879 \u4e3b\u83dc\u5355-\u8bbe\u7f6e-\u9884\u89c8-\u56fe\u7247\u9884\u89c8 \u53d6\u6d88\u52fe\u9009\uff08\u5982\u4e0d\u53d6\u6d88\uff0c\u4f1a\u5f71\u54cd\u622a\u56fe\u5f55\u5c4f\u5e94\u7528\u7684\u6027\u80fd\u6570\u636e\uff09 \u79fb\u52a8\u6216\u5220\u9664\u7cfb\u7edf Logo \uff0c\u6392\u9664\u684c\u9762\u53f3\u4e0b\u89d2 Logo \u7684\u5f71\u54cd\uff08\u91cd\u542f\u751f\u6548\uff09\u3002 sudo mv /usr/share/deepin/uos_logo.svg ~/Pictures/\n \u5b89\u88c5\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\uff08\u5fc5\u987b\u5b89\u88c5\uff01\uff01\uff09 AMD \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_amd64.deb ARM \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_arm64.deb MIPS \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_mips64.deb 3A5000 \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_5000.deb \u5b89\u88c5\u547d\u4ee4 sudo dkpg -i xserver-xorg-input-libinput_0.28.2-2_amd64.deb\n \u5b89\u88c5\u65f6\u4f1a\u63d0\u793a\u5df2\u5b58\u5728\u76f8\u540c\u7248\u672c\uff0c\u8bf7\u5ffd\u7565\uff0c\u76f4\u63a5\u8986\u76d6\u5b89\u88c5\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u4e3b\u673a\u624d\u751f\u6548"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u670d\u52a1\u7aef\u4e00\u952e\u73af\u5883\u90e8\u7f72","text":"\u73af\u5883\u642d\u5efa\u524d\u5fc5\u987b\u5148\u8fde\u63a5\u4e0a USB \u4e32\u53e3\u7ebf\u548c\u91c7\u96c6\u76d2\u3002 \u5bbf\u4e3b\u673a\u73af\u5883\u5b89\u88c5 python3 manage.py install --env host\n \u5bb9\u5668\u73af\u5883\u5b89\u88c5 python3 manage.py install --env docker\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u56db\u3001\u914d\u7f6e\u9879","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u670d\u52a1\u7aef\u914d\u7f6e","text":"setting/config/server.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u914d\u7f6e\u9879\uff0c\u5305\u542b\u4e86\u6240\u6709\u670d\u52a1\u7aef\u6240\u6709\u7684\u53ef\u914d\u7f6e\u9879\u3002 \u672c\u5730\u65e0\u7f51\u7edc\u8fd0\u884c \u5c06\u914d\u7f6e\u9879 network=0 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u672c\u5730\u6709\u7f51\u7edc\u8fd0\u884c \u914d\u7f6e\u9879 network=1 (1)\u914d\u7f6e\u9879 client_alias= \u914d\u7f6e\u4e3a\u4f60\u8981\u6d4b\u8bd5\u7684\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5982 Alias1 \u6d4b\u8bd5\u673a\u522b\u540d\u5728 setting/config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 (2)\u914d\u7f6e\u9879 client_alias= \u4e3a\u7a7a\uff0c\u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager --client_alias Alias1\uff0c\u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002(Alias1 \u4e3a\u4f60\u914d\u7f6e\u7684\u6d4b\u8bd5\u673a\u522b\u540d) (1)\u548c(2)\u53ea\u8981\u4f7f\u7528\u5176\u4e00\u5373\u53ef\u3002 \u6709\u7f51\u7edc\u8fd0\u884c\uff0c\u4e14\u9700\u8981\u901a\u8fc7 Jenkins \u4e0a\u8fd0\u884c\u4e00\u4e2a job \uff0c\u540c\u65f6\u63a7\u5236\u591a\u53f0\u673a\u5668\u3002 \u914d\u7f6e\u9879 network=1 \u914d\u7f6e\u9879 client_alias= \u4e0d\u7528\u914d\u7f6e\uff0c\u5728\u8fd0\u884c run.sh \u7684\u65f6\u5019\u76f4\u63a5\u7a7a\u683c\u52a0\u522b\u540d\u5373\u53ef\uff0c\u6bd4\u5982\uff1a\u6d4b\u8bd5\u673a\u522b\u540d\u4e3a Alias1 \uff0c\u4e14\u5df2\u7ecf\u5728 config/client.ini \u4e2d\u914d\u7f6e\u4e86 Alias1 \u7684user ip password \uff0c\u5219\u8fd0\u884c bash run.sh Alias1 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u5728 Jenkins pipeline \u91cc\u9762\u901a\u8fc7\u5e76\u884c stage \u6216\u5e76\u884c\u8c03\u7528\u4e0b\u5c42\u4efb\u52a1\u7684\u65b9\u5f0f\u53ef\u4ee5\u5b9e\u73b0\u5927\u89c4\u6a21\u7684\u6027\u80fd\u6d4b\u8bd5\u9700\u6c42\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;1\u3001KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2\u3001KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f, e.g. TAGS = L1 or smoke\n[case_conf]\n# \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\uff0cocr\u6587\u6848\u8bc6\u522b\u8f83\u6162\uff0c\u4e0d\u63a8\u8350\u4f7f\u7528\nfind_by = stage\n# \u6700\u540e\u4e00\u4e2a\u7a33\u5b9a\u9636\u6bb5\u7684\u5e27\u6570\u8bc6\u522b\n# \u9996\u5e27\u5b58\u5728\u540e\u7684\u7b2c\u4e00\u4e2a\u5927\u4e8e\u8be5\u914d\u7f6e\u5e27\u6570\u7684\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u5c3e\u5e27\nfinal_stable_num=100\n# \u4ece\u8be5\u5e27\u6570\u5f00\u59cb\u8bc6\u522b\u6587\u6848\u6216\u56fe\u7247\uff0c\u51cf\u5c11\u5206\u6790\u65f6\u95f4\nstart_num = 150\n# \u8bc6\u522b\u7684\u6587\u6848\ntext=\n# \u8bc6\u522b\u56fe\u7247\nmatch=apps/xxx/images/match.png\n# \u8bc6\u522b\u76f8\u4f3c\u5ea6\nmatch_rate=0.9\n# \u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6bd4\u5982\u70ed\u542f\u52a8\u7528\u4f8b\uff0c\u4ece\u70b9\u51fb\u6253\u5f00\u5230\u505c\u6b62\u5f55\u5c4f\uff0c\u4e2d\u95f4\u7b49\u5f855\u79d2\uff1b\nduration = 15\n# \u5355\u6761\u7528\u4f8b\u6267\u884c\u7684\u6b21\u6570\ncount = 5\n# \u7a33\u5b9a\u9636\u6bb5\u5212\u5206\u7684\u76f8\u4f3c\u5ea6\nstable_similarity = 0.9997\n[server]\n# \u8c03\u8bd5\u6a21\u5f0f=1\uff0c\u4e3a\u5f00\u542f\u8c03\u8bd5\u6a21\u5f0f\uff0c0\u4e3a\u5173\u95ed\u3002\n# \u8c03\u8bd5\u6a21\u5f0f\u4e0b\u9ed8\u8ba4\u53ea\u6267\u884c\u4e00\u6b21\u7528\u4f8b\uff0c\u4e0d\u5173\u673a\n# \u7f16\u5199\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u5efa\u8bae\u5f00\u542fmaintain\u3002\nMAINTAIN = 0\n# \u8fd0\u884c\u7684\u73af\u5883docker\u5bb9\u5668\u73af\u5883\uff0chost\u5bbf\u4e3b\u673a\u73af\u5883\nENV = docker\n# \u670d\u52a1\u7aef\u5bc6\u7801\nPASSWORD=1\n# \u6307\u5b9a\u6d4b\u8bd5\u673a\u522b\u540d\n# \u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6bd4\u5982\uff1a\n# [AMD]\n# ip=10.8.15.86\n# user=uos\n# \u5176\u4e2d AMD \u4e3a\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5219client_alias=AMD\nCLIENT_ALIAS = x86\uff08Intel-i7\uff09\n# 1 \u5f00\u542f\u7f51\u7edc, 0 \u5173\u95ed\u7f51\u7edc\n# \uff081\uff09\u670d\u52a1\u7aef\u4e0e\u6d4b\u8bd5\u673a\u987b\u5728\u540c\u4e00\u7f51\u6bb5\u4e0b\uff0c\u4f60\u53ef\u4ee5\u5c1d\u8bd5\u5728\u670d\u52a1\u7aef\u901a\u8fc7ssh\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c\u5982\u679c\u53ef\u4ee5\u8fde\u63a5\uff0c\u8bf4\u660e\u7f51\u7edc\u6b63\u5e38\u3002\n# \uff082\uff09\u5f53input_type=FILE_NAME \u65f6\uff0c\u5fc5\u987b\u5f00\u542f\u7f51\u7edc\u3002\nNETWORK = 1\n# \u6027\u80fd\u7ed3\u679c\u7edf\u8ba1\u5355\u4f4d \u6beb\u79d2\u2014ms, \u79d2\u2014s\nUNIT=ms\n# \u6d4b\u8bd5\u673a\u5f00\u673a\u8fdb\u5165\u684c\u9762\u540e\u7b49\u5f85\u65f6\u95f4,\u5355\u4f4d/\u79d2\nSTARTUP_DELAY = 60\n# 1\u4e3a\u5220\u9664\u7f13\u5b58\uff0c0\u4e3a\u4e0d\u5220\u9664\u7f13\u5b58\n# \u7528\u4f8b\u6267\u884c\u5b8c\u540e\u4f1a\u5728report\u76ee\u5f55\u4e0b\u751f\u6210\u667a\u80fd\u89e3\u6790\u7684\u4e00\u4e9b\u7f13\u5b58\u56fe\u7247\u3002\nCACHE = 0\n# \u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u62a5\u544a\u4f1a\u4fdd\u5b58\u5728\u9879\u76ee\u4e0breport\u76ee\u5f55\u4e2d\uff1b\n# \u6307\u5b9a\u62a5\u544a\u76ee\u5f55\u5219\u5b58\u653e\u5230\u6307\u5b9a\u76ee\u5f55\u3002\nREPORT_PATH = report\n# \u670d\u52a1\u7aef\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684icon\u8d44\u6e90\u4f1a\u7f13\u5b58\u5728\u9879\u76ee\u4e0binput\u76ee\u5f55\u4e2d\nINPUT = input/\n# 1\u4e3a\u6d4b\u8bd5\u5b8c\u5173\u673a\uff0c0\u4e3a\u6d4b\u8bd5\u5b8c\u4e0d\u5173\u673a\nSHUTDOWN = 0\n# \u89e3\u6790\u8fdb\u7a0b\u6570\uff08\u4e0d\u63a8\u8350\u4fee\u6539\uff09\n# 3\u4e2a\u8fdb\u7a0b\u89e3\u6790\u89c6\u9891\u5df2\u7ecf\u80fd\u591f\u6ee1\u8db3\uff0c\u5373\u4f7f\u589e\u52a0\u8fdb\u7a0b\u6570\u4e5f\u4e0d\u80fd\u51cf\u5c11\u6574\u4f53\u8017\u65f6\n# \u53e6\u5916\u8fd8\u8981\u770bCPU\u6838\u6570\u662f\u5426\u652f\u6301\u3002\nPARSING_PROCESS = 3\n# 1\u4e3a\u4f7f\u7528\u7ee7\u7535\u5668\u5f00\u5173\u673a\uff0c0\u4e3a\u4f7f\u7528reboot\u547d\u4ee4\u91cd\u542f\u3002\u4f9d\u8d56\u7ee7\u7535\u5668\u786c\u4ef6\u8bbe\u5907\uff0c\u9700\u8981\u4f7f\u7528\u8054\u7cfb\u5f00\u53d1\u8005\nRELAY = 0\n# \u83b7\u53d6\u6d4b\u8bd5\u5e94\u7528\u7684\u7248\u672c, %s \u5360\u4f4d\u5e94\u7528\u540d\n# \u5982\u679c\u8be5\u914d\u7f6e\u4e3a\u7a7a\uff0c\u5219\u4e0d\u83b7\u53d6\u5e94\u7528\u7684\u7248\u672c\u4fe1\u606f\u3002\nCOMMAND = apt policy %s 2>/dev/null|grep \"\u5df2\u5b89\u88c5\"|awk -F \"\uff1a\" \"{print \\$2}\"\n# \u5173\u673a\u7b49\u5f85\u5f00\u542f\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6839\u636e\u6d4b\u8bd5\u673a\u6027\u80fd\u4e0d\u540c\uff0c\u5f00\u5173\u673a\u8017\u65f6\u53ef\u80fd\u4e0d\u540c\uff0c\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u673a\u60c5\u51b5\u914d\u7f6e\u3002\nSHUTDOWN_DELAY = 30\n# \u53ef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u56fe\u7247\u683c\u5f0f\uff0c\u4ee5\u82f1\u6587\u9017\u53f7\u9694\u5f00\u3002\n# \u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u76ee\u524d\u6211\u4eec\u4ec5\u9a8c\u8bc1\u4e86jpg,jpeg,png\u8fd9\u4e09\u79cd\u5e38\u7528\u7684\u56fe\u7247\u683c\u5f0f\u3002\nINPUT_TYPES = jpg,jpeg,png\n# \u6027\u80fd\u5206\u6790\u8865\u5e27\uff0c\u7b49\u4e8e\u6216\u4f4e\u4e8e\u8be5\u503c\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u9700\u8981\u51cf\u6389\u3002\nUN_STAB_START = 3\n# \u670d\u52a1\u7aef\u83b7\u53d6\u6d4b\u8bd5\u673a\u56fe\u50cf\u7684\u5e27\u7387\uff0c\u5373\u6bcf\u79d2\u83b7\u53d6\u591a\u5c11\u5f20\u6d4b\u8bd5\u673a\u4e0a\u7684\u56fe\u50cf\u3002\n# \u9ed8\u8ba4\u5e27\u7387\u4e3a30\u5e27/\u79d2\uff0c\u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u53ef\u80fd\u4f1a\u5bf9\u89e3\u6790\u7ed3\u679c\u9020\u6210\u504f\u5dee\u3002\nFPS = 30\n# \u4ee5\u4e0b\u573a\u666f\u7c7b\u578b\u4f1a\u91cd\u542f\u6d4b\u8bd5\u673a,\u591a\u79cd\u573a\u666f\u4f7f\u7528\u9017\u53f7\u9694\u5f00\nSCENE = cold\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = http://10.8.13.78:8890\n#\u5c4f\u5e55\u56fe\u7247\u4e34\u65f6\u5b58\u653e\u4f4d\u7f6e\nSCREEN_CACHE = /tmp/screen\n# =======================================\n[log]\n# \u65e5\u5fd7\u7ea7\u522b\uff0cOFF\u3001FATAL\u3001ERROR\u3001WARN\u3001INFO\u3001DEBUG\u3001ALL\n# \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u65e5\u5fd7\u8f93\u51fa\uff0clog_cli=INFO\u8868\u793a \u4ec5\u8f93\u51faINFO\u53ca\u4ee5\u4e0a\u7ea7\u522b\u7684\u65e5\u5fd7\u3002\nLOG_LEVEL = DEBUG\n# \u65e5\u5fd7\u6587\u4ef6\u4fdd\u5b58\u8def\u5f84\nLOG_PATH= logs\n# =======================================\n[dockerhub]\n# \u5bb9\u5668\u767b\u9646\u8d26\u53f7\nDOCKER_USER = user\n# \u5bb9\u5668\u767b\u9646\u5bc6\u7801\nDOCKER_PASSWORD = User1234\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u6d4b\u8bd5\u673a\u914d\u7f6e","text":"setting/config/client.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u4fe1\u606f\u3002 \u6709\u7f51\u7edc\u7684\u60c5\u51b5\u4e0b\uff0c\u670d\u52a1\u7aef\u9700\u8981\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u56e0\u6b64\u4f60\u9700\u8981\u5199\u5165 \u6d4b\u8bd5\u673a\u522b\u540d \u3001 user \u3001ip\u3001 password \u3002 # \u6d4b\u8bd5\u673a\u522b\u540d\n[Alias1] # \u6d4b\u8bd5\u673aip\nip=10.8.15.86 # \u6d4b\u8bd5\u673a\u7528\u6237\u540d\nuser=uos\n \u547d\u540d\u5efa\u8bae\uff1aAliasA1\u3001AliasA2\u3001AliasB1\u3001AliasB2\uff0c\u4e0d\u8981\u91cd\u540d\u3002 \u65e0\u7f51\u7edc\u60c5\u51b5\u4e0b\uff0c\u4ec5\u9700\u8981\u5173\u6ce8\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\u9879 width=\u3001 height= \u5373\u53ef\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a [client]\n# \u9ed8\u8ba4\u6d4b\u8bd5\u673a\u7528\u6237\u540d\uff0c\u5bc6\u7801\uff0cip\nip=\nuser=\n# \u6d4b\u8bd5\u673a\u5bc6\u7801\npassword=1\n# \u6d4b\u8bd5\u673a\u4e3b\u9898\ntheme=bloom\n# \u6d4b\u8bd5\u673aicon\u76ee\u5f55\npath=/usr/share/icons\n# \u7cfb\u7edfdesktop\u6587\u4ef6\u7684\u5b58\u653e\u76ee\u5f55\uff0cUOS\u7cfb\u7edf\u9ed8\u8ba4\u4e3a/usr/share/applications\ndesktop_path=/usr/share/applications\n# \u7528\u4e8e\u5224\u65ad\u6d4b\u8bd5\u673a\u662f\u5426\u5f00\u673a\u8fdb\u5165\u684c\u9762\u7684\u8bc6\u522b\u6807\u8bc6\u3002\n# 1\u3001\u901a\u8fc7\u684c\u9762\u56fe\u6807\u8bc6\u522b\u3002\n# - type=FILE_NAME\u65f6\uff0c\u670d\u52a1\u5668\u548c\u6d4b\u8bd5\u673a\u5fc5\u987b\u5728\u540c\u4e00\u5c40\u57df\u7f51\u5185\u3002\n# - power_on=dde-computer\u8868\u793a\u901a\u8fc7\u684c\u9762\u8ba1\u7b97\u673a\u56fe\u6807\u5224\u65ad\u5f00\u673a\u8fdb\u5165\u684c\u9762\u3002\n# 2\u3001\u901a\u8fc7\u672c\u5730\u56fe\u7247\u4f5c\u4e3a\u5f00\u673a\u8bc6\u522b\u3002\n# - type= \u4f20\u5165\u4e3a\u56fe\u7247\u683c\u5f0f\uff0ctype\u652f\u6301\u7684\u7c7b\u578b\u5305\u542b\u5728server.ini\u5185\u914d\u7f6e\u9879input_type=jpg,jpeg,png\u3002\n# - power_on= \u4f20\u5165\u7684\u662f\u672c\u5730\u56fe\u7247\u7684\u8def\u5f84\u3002\ntype=FILE_NAME\npower_on=dde-computer\n# \u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\uff08\u6d4b\u8bd5\u673a\u8fde\u63a5\u91c7\u96c6\u76d2\uff0c\u91c7\u96c6\u76d2\u7684\u5206\u8fa8\u7387\uff09\nheight=1080\nwidth=1920\n[AliasA1] ip=10.8.15.86\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n[AliasA2]\nip=10.8.15.20\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_2","title":"3\u3001\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e","text":"\u968f\u7740\u6d4b\u8bd5\u573a\u666f\u7684\u4e0d\u65ad\u5f15\u5165\uff0c\u53d1\u73b0\u73b0\u6709\u670d\u52a1\u7aef\u91cc\u7684\u914d\u7f6e\u9879\u5e76\u4e0d\u9002\u7528\u4e8e\u6240\u6709\u7684\u6027\u80fd\u573a\u666f\uff0c\u4e8e\u662f\u5c06\u670d\u52a1\u7aef\u914d\u7f6e\u8fdb\u884c\u4e00\u4e2a\u63d0\u53d6\uff0c\u53ef\u505a\u5355\u4e2a\u573a\u666f\u7684\u4e2a\u6027\u5316\u914d\u7f6e\uff0c\u5f53\u7136\u539f\u6765\u7684\u670d\u52a1\u7aef\u914d\u7f6e\u529f\u80fd\u4fdd\u7559\uff0c\u53ea\u662f\u5f53\u4f60\u914d\u7f6e\u4e86\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e\u540e\uff0c\u4f18\u5148\u4f7f\u7528\u4e2a\u6027\u5316\u914d\u7f6e\u91cc\u9762\u7684\u5185\u5bb9\uff0c\u4ee5\u4e0b\u662f\u5bf9\u4e2a\u6027\u5316\u914d\u7f6e\u7684\u4ecb\u7ecd\u3002 \u76ee\u524d\u6bcf\u4e00\u4e2a py \u6587\u4ef6\u5bf9\u5e94\u4e00\u4e2a\u6027\u80fd\u6d4b\u8bd5\u573a\u666f\uff0c\u4e8e\u662f\u5728\u540c\u7ea7\u76ee\u5f55\u4e0b\u521b\u5efa\u4e00\u4e2a\u4e0e\u4e4b\u540c\u540d\u7684 json \u6587\u4ef6\uff0c\u4f5c\u4e3a\u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6 apps\n\u251c\u2500\u2500 album\n \u251c\u2500\u2500 test_album_01_start.json # \u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6\n\u2514\u2500\u2500 test_album_01_start.py # \u6027\u80fd\u573a\u666f\u6587\u4ef6\n \u4ee5\u4e0b\u662f\u5bf9 json \u6587\u4ef6\u4e2d\u914d\u7f6e\u7684\u89e3\u91ca\uff0c\u82e5\u67d0\u9879\u914d\u7f6e\u4e0d\u9700\u8981\uff0c\u53ef\u4ee5\u7f3a\u5931\uff0c\u4f46\u4e0d\u80fd\u4e3a\u7a7a\uff1b {\n\"title\": \"test_album_start\", # \u6807\u9898\uff1b\u5fc5\u987b\n\"app_name\": \"deepin-album\", # \u573a\u666f\u6240\u5c5e\u7684\u5e94\u7528\uff1b\u5fc5\u987b\n\"scene\": \"hot\", # \u573a\u666f\u522b\u540d\uff1b\u5fc5\u987b\n\"icon\": [\"deepin-album\"], # \u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684icon\u5230\u670d\u52a1\u7aef\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\uff1b\u53ef\u7f3a\u5931\n# \u6ce8\u610f\uff1a\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684desktop\u6587\u4ef6\u540d\u4e3adeepin-album.desktop\uff0c\n# \u53ea\u9700\u8981\u5199deepin-album\u5373\u53ef\uff0c\u201c.desktop\u201d\u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002\n\"size\": { # \u56fe\u7247\u5bf9\u6bd4\u7684\u533a\u57df\u8bbe\u7f6e\u9879\uff0c\u67d0\u4e9b\u5e94\u7528\u5f53\u524d\u5c4f\u5e55\u7684\u90e8\u5206\u533a\u57df\u9700\u8981\u5c06\u5176\u53bb\u6389\uff0c\u53ef\u4ee5\u8bbe\u7f6e\u6b64\u9879\uff0c\u5982\u679c\u6ca1\u6709\u5219\u53ef\u4e0d\u5199\uff1b\u53ef\u786e\u5b9e\n\"x-coordinate\": 0, # \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n\"y-coordinate\": 0, # \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n\"width\": 850, # \u6a2a\u5411\u957f\u5ea6\n\"height\": 1920 # \u7eb5\u5411\u9ad8\u5ea6\n},\n\"count\": 5, # \u573a\u666f\u6267\u884c\u7684\u6b21\u6570\uff1b\u5fc5\u987b\n\"duration\": 5, # \u8be5\u6761\u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff0c\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7279\u5b9a\u573a\u666f\uff0c\u8be5\u914d\u7f6e\u4e3a\u53ef\u9009\u9879\uff0c\u8986\u76d6 server.ini \u4e2d\u7684\u914d\u7f6e\uff1b\u53ef\u7f3a\u5931\n\"stable_similarity\": 0.9997, # \u6027\u80fd\u573a\u666f\u5206\u9636\u6bb5\u65f6\u7684\u56fe\u7247\u76f8\u4f3c\u5ea6\u5bf9\u6bd4\uff0c\u524d\u540e\u56fe\u7247\u4f4e\u4e8e\u8be5\u503c\uff0c\u5219\u5206\u4e3a\u4e0d\u7a33\u5b9a\u9636\u6bb5\uff1b\u53ef\u7f3a\u5931\n\"find_by\": \"stage\", # \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\n\"final_stable_num\": 100, # \u67e5\u627e\u6700\u540e\u4e00\u4e2a\u5927\u4e8e\u8be5\u503c\u7684\u7a33\u5b9a\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u7684\u5c3e\u796f\uff1b\u53ef\u7f3a\u5931\n\"start_num\": 150,\n\"text\": \"\", # ocr\u8bc6\u522b\u7684\u6587\u6848\n\"match\": \"apps/xxx/images/match.png\", # \u56fe\u50cf\u5339\u914d\u7684\u56fe\u7247\u6587\u4ef6\u8def\u5f84\n\"match_rate\": 0.9 # \u5339\u914d\u76f8\u4f3c\u5ea6\n}\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e94\u3001\u6d4b\u8bd5\u6d41\u7a0b","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516d\u3001\u7528\u4f8b\u7f16\u5199\u53ca\u65b9\u6cd5\u53c2\u6570\u6307\u5f15","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"1\u3001\u7528\u4f8b\u5b9e\u4f8b\u8bf4\u660e","text":"# \u6807\u51c6\u5e93\u5bfc\u5165\nfrom time import sleep\n# \u5bfc\u5165\u4e09\u65b9\u5e93pytest\nimport pytest\n# \u5bfc\u5165\u7528\u4f8b\u6267\u884c\u8981\u7528\u5230\u7684Widget\u7c7b\nfrom src.base_widget import BaseWidget\nclass TestStart:\n# class\u7ea7\u522b\u7684fixture\uff0c\u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u6267\u884c\u3002autouse=True \u81ea\u52a8\u5728\u5f53\u524d\u4f5c\u7528\u57df\u4e0b\u4f7f\u7528\u3002\n@pytest.fixture(scope=\"class\", autouse=True)\n# \u6d4b\u8bd5\u70ed\u542f\u52a8\u4e4b\u524d\u9700\u8981\u9884\u542f\u52a8\u3002\ndef application_pre_start(self):\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().right_click_element(\"deepin-album\")\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().click_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\")\nsleep(2)\n# \u5feb\u6377\u952e\u5173\u95ed\u7a97\u53e3\nBaseWidget().hot_key(\"alt\", \"f4\")\nsleep(2)\n# \u9ed8\u8ba4\u4e3afunction\u7ea7\u522b\u7684fixture\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\uff0cclass\u7ea7\u522bfixture\u6267\u884c\u4e4b\u540e\u6267\u884c\u3002\n@pytest.fixture(autouse=True)\ndef setup_start(self):\n# \u53f3\u952e\u70b9\u51fb deepin-album \u56fe\u6807\nBaseWidget().right_click_element(\"deepin-album\")\n# \u79fb\u52a8\u5230\u53f3\u952e\u83dc\u5355\u4e2d\u6253\u5f00\uff08open.png\uff09\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().move_to(*BaseWidget().find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))\n# \u7b49\u5f85\u79fb\u52a8\u5b8c\u6210\nsleep(0.5)\ndef test_album_start(self):\n# \u70b9\u51fb\u201c\u6253\u5f00\u201d\nBaseWidget().click() \n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"2\u3001\u65b9\u6cd5\u53c2\u6570\u8bf4\u660e","text":"2.1\u3001find_element \u65b9\u6cd5 def find_element(element: str, input_type: str = \"FILE_NAME\", fill_color_position: tuple = (-1, -1), size: tuple = (25, 70)):\npass\n \u53c2\u6570 element \u548c input_type \uff081\uff09\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u5143\u7d20 - `input_type` \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a `FIEL_NAME` \uff0c\u8868\u793a\u901a\u8fc7\u5e94\u7528 `icon` \u5bfb\u627e\u5143\u7d20\uff0c\u6b64\u65b9\u6cd5\u4f1a\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u5e94\u7528 `icon` \u56fe\u6807\u3002\n \u4e3e\u4f8b\uff1a\u9ed8\u8ba4\u60c5\u51b5\u4e0b input_type \u53c2\u6570\u4e0d\u9700\u8981\u4f20\u5165\uff0c find_element(\"deepin-album\")\uff0c\u8868\u793a\u901a\u8fc7 deepin-album \u7684\u5e94\u7528 icon \u6765\u83b7\u53d6\u5750\u6807\uff0c\u6ce8\u610f\uff0c\u6b64\u65f6\u4f20\u5165\u7684 deepin-album \u53c2\u6570\u5b9e\u9645\u662f desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u548c2.3\u4e2d\u7684 icon \u53d8\u91cf\u4e00\u81f4\u3002 \u6211\u4eec\u5efa\u8bae\u4f18\u5148\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\uff0c\u4f46\u6b64\u65b9\u6cd5\u4f9d\u8d56\u7f51\u7edc\uff0c\u8bf7\u6839\u636e\u6d4b\u8bd5\u73af\u5883\u5b9e\u9645\u60c5\u51b5\u9009\u62e9\u3002 \uff082\uff09\u901a\u8fc7\u672c\u5730\u56fe\u7247\u8bc6\u522b\u5143\u7d20 - \u53c2\u6570 `input_type` \u4f20\u5165\u56fe\u7247\u683c\u5f0f\uff0c\u6bd4\u5982\u622a\u53d6\u7684\u672c\u5730\u56fe\u7247\u683c\u5f0f\u4e3a `png`\uff0c\u90a3\u4e48 `input_type=\"png\"`\uff0c\u6b64\u65f6\u53c2\u6570 `element ` \u4f20\u5165\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5efa\u8bae\u5b58\u653e\u5728\u5bf9\u5e94\u7684\u4ea7\u54c1 `apps/app/picture/` \u76ee\u5f55\u4e0b\uff0c\u8def\u5f84\u4e3a\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u7684\u76f8\u5bf9\u8def\u5f84\u3002\n- \u4e3e\u4f8b\uff1a`find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))`\uff0c\u8868\u793a\u901a\u8fc7\u672c\u5730\u56fe\u7247 `open.png` \u8bc6\u522b\u5143\u7d20\u3002\n \u53c2\u6570 fill_color_position fill_color_position \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (-1, -1)\uff0c(-1, -1) \u8868\u793a\u53d6\u5c4f\u5e55\u4e2d\u53f3\u4e0b\u89d2\u6700\u540e\u4e00\u4e2a\u50cf\u7d20\u70b9\u4f5c\u4e3a\u586b\u5145\u5750\u6807\uff0c\u5728 1920x1080 \u5c4f\u5e55\u5206\u8fa8\u7387\u4e0b\u5373\u5b9e\u9645\u5750\u6807\u4e3a (1919, 1079) \uff0c\u8fd9\u6837\u7684\u5199\u6cd5\u53ef\u4ee5\u9002\u914d\u4e0d\u540c\u5927\u5c0f\u7684\u5c4f\u5e55\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0d\u540c\u65b9\u4f4d\uff1a \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0b\u65b9\uff0c\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u4e0d\u9700\u8981\u4f20\u5165\u8be5\u53c2\u6570\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u5de6\u8fb9\uff0cfill_color_position=(1, 1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u53f3\u8fb9\uff0cfill_color_position=(-1, -1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0a\u8fb9\uff0cfill_color_position=(1, 1) \u4ece\u684c\u9762\u542f\u52a8\u5e94\u7528\uff0c\u5219\u9700\u8981\u4f20\u5165\u9664\u4efb\u52a1\u680f\u4ee5\u5916\u5176\u4ed6\u4f4d\u7f6e\u7684\u5750\u6807\uff0c\u6bd4\u5982(100, 100)\uff0c\u53ea\u8981\u8fd9\u4e2a\u5750\u6807\u4e3a\u9664\u5e94\u7528\u548c\u4efb\u52a1\u680f\u533a\u57df\u90fd\u53ef\u4ee5\u3002 \u4ece\u542f\u52a8\u5668\u91cc\u9762\u542f\u52a8\u5e94\u7528\uff0c\u9700\u8981\u586b\u5145\u7684\u5750\u6807\u4e3a\u542f\u52a8\u5668\u533a\u57df\u3002 \u6ce8\uff1a\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u65f6\uff0c\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684 icon \u539f\u6587\u4ef6\u4e3a svg \u77e2\u91cf\u56fe\uff0c\u8f6c\u6362\u4e3a png \u4e4b\u540e\u9700\u8981\u586b\u5145\u8fb9\u7f18\u900f\u660e\u90e8\u5206\u3002 \u53c2\u6570 size size \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (25, 70)\uff0c\u8868\u793a\u6d4b\u8bd5\u673a\u4e0a dock \u680f\u4e0a\u5e94\u7528\u56fe\u6807\u7684\u5927\u5c0f\u8303\u56f4\u3002 UOS \u7cfb\u7edf dock \u680f\u662f\u53ef\u4ee5\u4e0a\u4e0b\u62d6\u52a8\u5927\u5c0f\u7684\uff0c\u968f\u7740 dock \u680f\u5927\u5c0f\u6539\u53d8\uff0c\u5e94\u7528\u56fe\u6807\u7684\u8303\u56f4\u4e3a25\u523070\u4e4b\u95f4\u3002 \u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u64cd\u4f5c\u7cfb\u7edf\u4e0a dock \u680f\u5927\u5c0f\u4e0d\u4e00\u6837\uff0c\u53ef\u4ee5\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u4f20\u5165\u5927\u5c0f\u8303\u56f4\u3002 2.2\u3001click_element\u3001 right_click_element\uff0c double_click_element \u8fd9\u51e0\u4e2a\u65b9\u6cd5\u53c2\u6570\u89c4\u5219\u4e0e find_element \u65b9\u6cd5\u4e00\u6837\u3002\u4ed6\u4eec\u5b9e\u9645\u4e0a\u662f\u5728 find_element \u65b9\u6cd5\u57fa\u7840\u4e4b\u4e0a\u505a\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u589e\u52a0\u4e86\u9f20\u6807\u7684\u52a8\u4f5c\uff0c\u5982\u679c\u4f60\u4e0d\u60f3\u4f7f\u7528\u8fd9\u51e0\u4e2a\u65b9\u6cd5\uff0c\u5728\u7528\u4f8b\u4e2d\u4e5f\u53ef\u4ee5\u901a\u8fc7 find_element \u83b7\u53d6\u5230\u5750\u6807\uff0c\u7136\u540e\u5c06\u5750\u6807\u4f20\u5165\u5230\u952e\u9f20\u7684\u65b9\u6cd5\u4e2d\uff0c\u53ef\u4ee5\u5b9e\u73b0\u540c\u6837\u7684\u6548\u679c\u3002 2.3\u3001\u7528\u4f8b\u7c7b\u4e2d\u6709\u4e2a\u7c7b\u53d8\u91cf icon = [\"deepin-album\"] \u9700\u8981\u7279\u6b8a\u8bf4\u660e\uff0c\u5217\u8868\u4e2d\u7684\u5143\u7d20\u4e3a\u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709 icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684 icon \u5230\u670d\u52a1\u7aef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528 desktop \u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684 desktop \u6587\u4ef6\u540d\u4e3a deepin-album.desktop\uff0c\u53ea\u9700\u8981\u5199 deepin-album \u5373\u53ef\uff0c.desktop \u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e03\u3001\u6267\u884c\u5165\u53e3","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"1\u3001\u7528\u4f8b\u7ec4\u7ec7","text":"\u5728 setting/config/server.ini \u6587\u4ef6\u4e2d APP_NAME= \u5b57\u6bb5\u4e3a\u7528\u4f8b\u7684\u6267\u884c\u7684\u76ee\u5f55\uff0c\u9ed8\u8ba4\u4e3a apps \u76ee\u5f55\u4e0b\u6240\u6709\u7528\u4f8b\u3002\u5982\u679c\u4f60\u60f3\u6307\u5b9a\u6267\u884c\u67d0\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4f60\u53ef\u4ee5\u5c06\u8be5\u914d\u7f6e\u9879\u6307\u5b9a\u5230\u5e94\u7528\u7684\u7528\u4f8b\u76ee\u5f55\uff0c\u6bd4\u5982\uff1aAPP_NAME=deepin_album\uff0c \u8868\u793a\u6267\u884c\u76f8\u518c\u76ee\u5f55\u4e0b\u7684\u7528\u4f8b\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a python3 manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music\n -k KEYWORDS, --keywords KEYWORDS\n \u7528\u4f8b\u7684\u5173\u952e\u8bcd\n -t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e\n --log_level LOG_LEVEL \u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n --env {host,docker} \u5728\u5bbf\u4e3b\u673a\u6216\u5bb9\u5668\u73af\u5883\u6267\u884c\n --client_alias \u9009\u62e9\u6d4b\u8bd5\u673a\u522b\u540d, \u53ef\u9009\u9879\u4e3aclient.ini\u4e2d\u5df2\u914d\u7f6e, \u9ed8\u8ba4\u503c\u4e3a zx-x86.\n --count \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a python3 manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\" --env docker\n \u6ce8\uff1a\u5728\u5bb9\u5668\u4e2d\u6267\u884c\u65f6\uff0c\u82e5\u5f3a\u5236\u9000\u51fa\uff0c\u5bb9\u5668\u5e76\u4e0d\u4f1a\u505c\u6b62\u8fd0\u884c\uff01"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_9","title":"\u516b\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1json","title":"1\u3001Json \u62a5\u544a","text":"\u81ea\u7814\u89c6\u9891\u89e3\u6790\u5de5\u5177\u4f1a\u5bf9\u5355\u6761\u7528\u4f8b\u6267\u884c\u4e00\u8f6e\u751f\u6210\u4e00\u4e2a json \u6587\u4ef6\uff0c\u5b58\u653e\u4e8e report/{app_name}/{scene}/{run_num} \u76ee\u5f55\u4e0b\uff0c\u547d\u540d\u683c\u5f0f\u4e3a\uff1a report.json json \u5185\u5bb9\u4e3e\u4f8b\uff1a [\n{\n\"Stab1\": {\n\"images\": [1,2...150,151],\n\"startStub\": 0,\n\"type\": \"Stab\"\n}\n},\n{\n\"Stab2\": {\n\"images\": [152,153...169,170],\n\"startStub\": 1,\n\"type\": \"UnStab\"\n}\n},\n{\n\"Stab3\": {\n\"images\": [171,172...300,301],\n\"startStub\": 0,\n\"type\": \"UnStab\"\n}\n}\n]\n \u8bf4\u660e\uff1a Stab \uff1a\u8868\u793a\u89e3\u6790\u8fc7\u7a0b\u4e2d\u4e0d\u540c\u7684\u9636\u6bb5\u3002 images \uff1a\u8868\u793a\u6bcf\u4e00\u5e27\u7684\u56fe\u7247\u5e8f\u53f7\u3002 startStub\uff1a \u4e3a\u8bc6\u522b\u5c3e\u5e27\u7684\u9636\u6bb5\u8868\u793a\uff0c\u5982\u679c \"startStub\": 1 \uff0c\u8bf4\u660e\u5c3e\u5e27\u51fa\u73b0\u5728\u8be5\u9636\u6bb5\u3002 type\uff1a \u4e3a Stab \u6216 UnStab \uff0c\u8868\u793a\u7a33\u5b9a\u9636\u6bb5\u6216\u4e0d\u7a33\u5b9a\u9636\u6bb5\u3002 \u5404\u9636\u6bb5\u6709\u5e27\u6570\u8865\u507f\uff0c\u9ed8\u8ba4\u8865\u507f\u7684\u5e27\u6570\u4e3a 3 \u5e27\uff08\u53ef\u4ee5\u901a\u8fc7 server.ini \u91cc\u9762 un_stab_start=3 \u8fdb\u884c\u914d\u7f6e\uff09\uff0c\u8868\u793a\u5c0f\u4e8e\u7b49\u4e8e 3 \u5e27\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u524d\u540e\u5747\u9700\u8981\u51cf\u6389\u3002 \u5e94\u7528\u542f\u52a8\u9636\u6bb5\u5c31\u662f\u5728 Stab2 \u9636\u6bb5\uff0c\u542f\u52a8\u65f6\u95f4\u4e3a\uff1a171 \u51cf 151 \u518d\u51cf\u6389\u524d\u540e\u8865\u507f\u5e27\u6570 6 \u5e27\uff0c\u5373 14 \u5e27\uff0c\u89c6\u9891\u5e27\u7387 30 \u5e27/\u79d2\uff0c\u56e0\u6b64\u542f\u52a8\u8017\u65f6\u4e3a\uff1a14 * 33 = 462 ms"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2excel","title":"2\u3001Excel \u62a5\u544a","text":"\u6240\u6709\u7528\u4f8b\u6267\u884c\u5e76\u89e3\u6790\u5b8c\u4e4b\u540e\u4f1a report \u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a\u6c47\u603b\u6570\u636e\u7684 Excel \u6587\u4ef6\uff0c\u6587\u4ef6\u540d\u4e3a\uff1a{time}_perf_time.xlsx\u3002 \u6ce8\u610f\uff0creport \u76ee\u5f55\u4e3a\u53ef\u914d\u7f6e\u9879\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u4f1a\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u751f\u6210\uff0c\u5982\u679c\u4f60\u5c06 report\uff0c\u6307\u5b9a\u5230\u9879\u76ee\u4e0b\u5176\u4ed6\u8def\u5f84\uff0c\u5219\u4f1a\u5728\u5bf9\u5e94\u7684\u8def\u5f84\u4e0b\u751f\u6210 json \u548c Excel \u6587\u4ef6\u3002 \u4f60\u4e5f\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8bfb\u53d6\u6240\u6709 json / excel \u62a5\u544a\u7684\u6570\u636e\uff0c\u751f\u6210\u4f60\u81ea\u5df1\u60f3\u8981\u7684\u4e00\u4e9b\u6d4b\u8bd5\u62a5\u544a\u5f62\u5f0f\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#usb","title":"\u4e5d\u3001USB \u4e32\u53e3\u9a71\u52a8\u952e\u9f20\u65b9\u6cd5","text":"\u4f4d\u4e8e src/utils/control/serial_communication \u76ee\u5f55\u4e0b\u7684 usb_mk.py \u6587\u4ef6 usb_mk = UsbMk()\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up()\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u652f\u6301\u4f20\u5165\u6c49\u5b57\uff0c\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click()\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() \n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() \n \uff084\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() \n \uff085\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() \n \uff086\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() \n \uff087\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff088\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff0810\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_10","title":"\u5341\u3001\u7ee7\u7535\u5668\u63a7\u5236\u4e3b\u673a\u5f00\u673a/\u91cd\u542f","text":"\uff08\u82e5\u4e0d\u4f7f\u7528\u7ee7\u7535\u5668\uff0c\u53ef\u5ffd\u7565\u8be5\u6b65\u9aa4\uff0c\u6267\u884c\u65f6\u4f1a\u901a\u8fc7\u547d\u4ee4 reboot\uff09"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u7ee7\u7535\u5668\u8bbe\u5907","text":"LCUS-2 \u578b \u53cc\u8def USB \u667a\u80fd\u4e32\u53e3\u63a7\u5236\u7ee7\u7535\u5668\u3002 https://item.taobao.com/item.htm?spm=a1z09.2.0.0.41d72e8dUYx2pi&id=582653718178&_u=i25r20ia6a2e "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2usb","title":"2\u3001USB \u5ef6\u957f\u7ebf","text":"\u666e\u901a\u7684 USB \u7ebf\u5373\u53ef\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_3","title":"3\u3001\u675c\u90a6\u7ebf","text":"3.1\u300140P \u6bcd\u5bf9\u516c\u675c\u90a6\u7ebf\u3002 3.2\u3001\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"4\u3001\u5b89\u88c5\u56fe\u6587\u6559\u7a0b","text":"4.1\u3001\u4f7f\u7528 USB \u5ef6\u957f\u7ebf\u8fde\u63a5\u63a7\u5236\u7aef\u548c\u7ee7\u7535\u5668\u3002 4.2\u3001\u5728\u7ee7\u7535\u5668\u5e38\u7aef\u548c\u516c\u5171\u7aef\u5747\u8fde\u63a5\u4e00\u6839\u675c\u90a6\u7ebf\u3002 4.3\u3001\u5728\u4e3b\u677f\u4e0a\u5f00\u673a\u9488\u548c\u91cd\u542f\u9488\u4e0a\u63d2\u4e0a\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 4.4\u3001\u5c06\u5f00\u673a\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76841\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1\u5de6\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 4.5\u3001\u5c06\u91cd\u542f\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76842\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1 \u53f3\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 \u82e5\u60f3\u4fdd\u7559\u539f\u7535\u6e90\u5f00\u5173\u7684\u7535\u6e90\u706f\uff0c\u53ef\u6839\u636e\u5982\u4e0a\u56fe\u6240\u793a\uff0c\u4f7f\u7528\u675c\u90a6\u7ebf\u8fde\u63a5\u4e3b\u677f\u4e0a\u7684\u7535\u6e90\u706f\u548c\u539f\u7535\u6e90\u5f00\u5173"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_11","title":"\u5341\u4e00\u3001\u5e38\u89c1\u95ee\u9898\u8bf4\u660e","text":"1\u3001ERROR: for uos Cannot restart container 2301b1a1395d7959ee6523d61b61c87084649af530786cdb8fb5b3ecbcbd1068: linux runtime spec devices: error gathering device information while adding custom device \"/dev/ttyACM0\": no such file or directory \u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u8fde\u63a5\u72b6\u6001\uff0c\u67e5\u770b /dev/ttyACM0 \u662f\u5426\u5b58\u5728\uff0c\u82e5\u5b58\u5728 /dev/ttyACMn\uff08n\u4e3a\u4efb\u610f\u6570\u5b57\uff09\uff0c\u91cd\u542f\u7535\u8111\u89e3\u51b3\u3002 2\u3001Error response from daemon: Container 5e700fdc769e8c74666d68a7f2bc3de58268b4594cf88706609d59f8dbc7362d is not running \u5bb9\u5668\u542f\u52a8\u5931\u8d25 1\uff09\u68c0\u67e5\u54ea\u4e00\u4e2a\u5bb9\u5668\u672a\u542f\u52a8 sudo docker container ls # \u5217\u51fa\u8fd0\u884c\u4e2d\u7684 Docker \u5bb9\u5668\n 2\uff09\u7f3a\u5c11 uos \u5bb9\u5668\uff0c\u68c0\u67e5 USB \u4e32\u53e3\u8fde\u63a5\u7ebf\u548c\u91c7\u96c6\u76d2\u8fde\u63a5\u7ebf\u662f\u5426\u6b63\u5e38\uff0c\u91cd\u542f\u540e\u6267\u884c bash install/setup.up # \u91cd\u65b0\u5b8c\u6574\u90e8\u7f72\u73af\u5883\n \u6216\u6267\u884c sudo docker-compose up -d --build # \u4ec5\u91cd\u65b0\u6784\u5efa Docker \u955c\u50cf\n 3\u3001\u82e5\u90e8\u7f72\u65f6\u63d0\u793a\u6302\u8f7d ttyACM0\u3001video0 \u5931\u8d25\uff0c\u8bf7\u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u53ca\u91c7\u96c6\u76d2\u662f\u5426\u63a5\u89e6\u826f\u597d\uff0c\u82e5\u63a5\u89e6\u826f\u597d\uff0c\u91cd\u542f\u5373\u53ef\u89e3\u51b3\u3002 4\u3001\u82e5\u51fa\u73b0\u56fe\u7247\u80fd\u8bc6\u522b\uff0c\u4f46\u662f\u9f20\u6807\u672a\u79fb\u52a8\u64cd\u4f5c\u65f6\uff0c\u5b89\u88c5\u7edd\u5bf9\u9f20\u6807\u64cd\u4f5c\u7684\u4f9d\u8d56\u5305\uff0c\u89c1\u7b2c\u4e09\u8282\u7b2c\u4e8c\u5c0f\u8282\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u6d4b\u8bd5\u673a\u3002 5\u3001\u7531\u4e8e\u901a\u8fc7\u91c7\u96c6\u5361\u83b7\u53d6\u7684\u6d4b\u8bd5\u673a\u5b9e\u65f6\u753b\u9762\uff0c\u5305\u542b\u4e86\u9f20\u6807\u7684\u6837\u5f0f\uff0c\u6240\u4ee5\u5bf9\u56fe\u7247\u8bc6\u522b\u65f6\uff0c\u9f20\u6807\u82e5\u505c\u7559\u5728\u56fe\u6807\u4e0a\u5c42\uff0c\u5219\u4f1a\u5bf9\u8bc6\u522b\u7ed3\u679c\u9020\u6210\u5f71\u54cd\uff0c\u9700\u8981\u5c06\u9f20\u6807\u79fb\u52a8\u81f3\u5176\u4ed6\u4f4d\u7f6e\uff0c\u6216\u8005\u9690\u85cf\u9f20\u6807\u89e3\u51b3\u3002 6\u3001Excel \u62a5\u544a\u4e2d\uff0c\u6d4b\u8bd5\u573a\u666f\u5217\u4e0e\u7528\u4f8b\u4e2d\u7684\u4e0d\u4e00\u81f4\uff0c\u5173\u952e\u5b57scene\u3001app_name\u3001\u67b6\u6784\u522b\u540d\uff0c\u4e0d\u80fd\u5305\u542b\u4e0b\u5212\u7ebf\u548c\u82f1\u6587\u7b26\u53f7\u7684\u5706\u62ec\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/","title":"\u6846\u67b6\u529f\u80fd\u4ecb\u7ecd","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2023/1/12\n# Author : Mikigo\n# =============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_2","title":"\u4e00\u3001\u4e00\u53e5\u8bdd\u7b80\u4ecb","text":"\u6b64\u6587\u6863\u4e3b\u8981\u60f3\u5bf9 YouQu \u6846\u67b6\u4e00\u4e9b\u91cd\u70b9\u7684\u529f\u80fd\u505a\u8be6\u7ec6\u7684\u4ecb\u7ecd\uff0c\u5305\u62ec\u5bf9\u4e00\u4e9b\u529f\u80fd\u5f00\u53d1\u7684\u80cc\u666f\u3001\u8981\u89e3\u51b3\u7684\u95ee\u9898\u3001\u5b9e\u73b0\u903b\u8f91\u3001\u4ee3\u7801\u7b49\u65b9\u9762\u7684\u4ecb\u7ecd\uff0c\u4ee5\u6b64\u8ba9\u5927\u5bb6\u80fd\u66f4\u52a0\u6e05\u6670\u7684\u7406\u89e3\u5404\u9879\u529f\u80fd\uff0c\u4ece\u800c\u5728\u4f7f\u7528\u7684\u65f6\u5019\u80fd\u66f4\u52a0\u7684\u5f97\u5fc3\u5e94\u624b\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_3","title":"\u4e8c\u3001\u56fe\u50cf\u8bc6\u522b","text":"\u56fe\u50cf\u8bc6\u522b\u5728 UI \u81ea\u52a8\u5316\u4e2d\u662f\u4e0d\u53ef\u7f3a\u5c11\u7684\uff0c\u5e02\u9762\u4e0a\u751a\u81f3\u6709\u5b8c\u5168\u57fa\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\uff0c\u6bd4\u5982 Airtest\u3001Sikuli \u7b49\uff0c\u5728\u6e38\u620f\u7b49\u7279\u5b9a\u9886\u57df\u4e5f\u6709\u4e0d\u9519\u7684\u6548\u679c\uff0c\u8fd9\u4e9b\u5de5\u5177\u5b9e\u9645\u4e0a\u4e5f\u662f\u7528\u7684 OpenCV \u8fdb\u884c\u4e86\u5c01\u88c5\uff0cYouQu \u6846\u67b6\u57fa\u4e8e OpenCV \u5f00\u53d1\u4e86\u81ea\u5df1\u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\uff0c\u5b83\u53ef\u4ee5\u65b9\u4fbf\u7684\u7528\u4e8e\u754c\u9762\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u65ad\u8a00\uff1b YouQu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u51e0\u4e4e\u6ee1\u8db3\u4e86\u4f60\u7684\u6240\u6709\u8981\u6c42\uff0c\u6211\u4eec\u5728\u957f\u65f6\u95f4\u7684\u601d\u8003\u548c\u6478\u7d22\u4e2d\uff0c\u9488\u5bf9\u5e38\u89c4\u573a\u666f\u53ca\u4e00\u4e9b\u7279\u6b8a\u573a\u666f\u63a2\u7d22\u9664\u4e86\u4e00\u4e9b\u5b9e\u7528\u4e14\u6709\u6548\u7684\u65b9\u6848\uff0c\u4e14\u542c\u6211\u6162\u6162\u9053\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1","title":"1\u3001\u5e38\u89c4\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5e38\u89c4\u8bc6\u522b\u5f88\u597d\u7406\u89e3\uff0c\u4e00\u53e5\u8bdd\u8bb2\u5c31\u662f\uff0c\u8981\u83b7\u53d6\u5230\u76ee\u6807\u5143\u7d20\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u3002 \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u5728\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u9700\u8981\u83b7\u53d6\u7684\u5750\u6807\u662f\u76f8\u5bf9\u4e8e\u6574\u4e2a\u5c4f\u5e55\u7684\u5750\u6807\uff0c\u6211\u4eec\u53ef\u4ee5\u622a\u53d6\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u56fe\u7247\uff08screen\uff09\uff1b \u5728\u5143\u7d20\u8bc6\u522b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u622a\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5c0f\u56fe\u8fdb\u884c\u8bc6\u522b\uff0c\u6bd4\u5982\u622a\u53d6\u64ad\u653e\u6309\u94ae\uff1a \u90a3\u4e48\u5b9e\u9645\u4e0a\uff0c\u5143\u7d20\u5b9a\u4f4d\u7684\u95ee\u9898\u5c31\u8f6c\u6362\u4e3a\uff0c\u5c06\u622a\u56fe\u7684\u5c0f\u56fe\uff08play_btn\uff09\u62ff\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u5927\u56fe\uff08screen\uff09\u4e2d\u53bb\u505a\u5339\u914d\uff0c\u5982\u679c\u5339\u914d\u6210\u529f\uff0c\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff08 x, y \uff09\u5373\u53ef\u3002 \u4e3a\u4e86\u65b9\u4fbf\u63cf\u8ff0\uff0c\u4ee5\u4e0b\u6211\u5c06\u6574\u4e2a\u5c4f\u5e55\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5927\u56fe\uff0c\u67d0\u4e2a\u5143\u7d20\u56fe\u7247\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5c0f\u56fe\u3002 \u57fa\u4e8e OpenCV \u7684\u6a21\u677f\u5339\u914d cv.matchTemplate() \u529f\u80fd\uff0c\u6211\u4eec\u5b9e\u73b0\u4e86\u56fe\u50cf\u5b9a\u4f4d\u7684\u529f\u80fd\uff0c\u6846\u67b6\u63d0\u4f9b\u4e86\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u5e95\u5c42\u63a5\u53e3\uff08\u4e00\u822c\u4e0d\u5bf9\u4e0a\u5c42\u63d0\u4f9b\u8c03\u7528\uff09\uff1a def _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\n# \u8be6\u7ec6\u4ee3\u7801\u592a\u957f\u4e0d\u8d34\u4e86\uff0c\u611f\u5174\u8da3\u8bf7\u67e5\u770b\u6e90\u7801\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001image_path image_path \u662f\u5c0f\u56fe\u7684\u7edd\u5bf9\u8def\u5f84; \u901a\u5e38\u5728 AT \u5de5\u7a0b\u91cc\u9762\uff0c\u6211\u4eec\u7ea6\u5b9a\u5c06\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u5b9e\u9645\u7684\u5143\u7d20\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1aplay_btn.png \uff1b \u7528\u4e8e\u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 case/assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1amusic_001.png \uff1b \u8fd9\u6837\u662f\u4e3a\u4e86\u65b9\u4fbf\u7ba1\u7406\u548c\u7ef4\u62a4\u3002 2\u3001rate \u56fe\u50cf\u8bc6\u522b\u7684\u7684\u5339\u914d\u5ea6\u6216\u8005\u8bf4\u76f8\u4f3c\u5ea6\uff0c\u6846\u67b6\u9ed8\u8ba4\u7684\u914d\u7f6e\u4e3a 0.9\uff0c\u4e5f\u5c31\u662f\u8bf4\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u5b58\u5728\u4e00\u4e2a\u76f8\u4f3c\u5ea6 90% \u7684\u56fe\u6807\u5373\u8fd4\u56de\u5176\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff1b \u5982\u679c\u4f60\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u8c03\u6574\u8bc6\u522b\u5ea6\uff0c\u4f60\u53ef\u4ee5\u5728\u8c03\u7528\u51fd\u6570\u7684\u65f6\u5019\uff0c\u4f20\u5165\u4e0d\u540c\u7684\u8bc6\u522b\u5ea6\u7684\u503c\u3002 3\u3001multiple \u9ed8\u8ba4\u60c5\u51b5\u4e0b multiple=False\uff0c\u8868\u793a\u53ea\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u7b2c\u4e00\u4e2a\uff0c\u5982\u679c multiple=True \u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\uff0c\u56e0\u4e3a\u5927\u56fe\u4e2d\u53ef\u80fd\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u5c0f\u56fe\uff0c\u5728\u67d0\u4e9b\u573a\u666f\u4e0b\u4f60\u53ef\u80fd\u9700\u8981\u5168\u90e8\u83b7\u53d6\u5230\u6240\u6709\u5339\u914d\u5230\u7684\u5750\u6807\u3002 4\u3001picture_abspath \u9ed8\u8ba4\u60c5\u51b5\u4e0b picture_abspath=None \u8868\u793a\u5927\u56fe\u4e3a\u622a\u53d6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u5982\u679c\u4f60\u4e0d\u5e0c\u671b\u5927\u56fe\u662f\u5c4f\u5e55\u7684\u622a\u56fe\uff0c\u800c\u662f\u4f60\u81ea\u5b9a\u4e49\u4f20\u5165\u7684\u67d0\u4e2a\u56fe\u7247\uff0c\u4f60\u53ea\u9700\u8981\u5c06\u4f60\u7684\u56fe\u7247\u8def\u5f84\u4f20\u9012\u7ed9\u8fd9\u4e2a\u53c2\u6570\u5c31\u884c\uff0c\u6bd4\u5982\uff1a picture_abspath=\"~/Desktop/big.png\" \uff1b 5\u3001screen_bbox \u5927\u56fe\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u622a\u53d6\u6574\u4e2a\u5c4f\u5e55\uff0cscreen_bbox = [x, y, w, h] \u53ef\u4ee5\u6307\u5b9a\u622a\u53d6\u5c4f\u5e55\u4e2d\u7684\u56fa\u5b9a\u533a\u57df\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\uff0c\u53ef\u4ee5\u6392\u9664\u90e8\u5206\u533a\u57df\u5bf9\u8bc6\u522b\u7ed3\u679c\u7684\u5f71\u54cd\u3002 \u3010\u9690\u5f0f\u7b49\u5f85\u3011 \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\uff0c\u6709\u65f6\u5019\u9875\u9762\u8df3\u8f6c\u6709\u5ef6\u65f6\uff0c\u6709\u53ef\u80fd\u5b58\u5728\u8bc6\u522b\u7684\u90a3\u4e00\u523b\u9875\u9762\u4e5f\u6ca1\u6709\u8df3\u8f6c\u51fa\u6765\uff0c\u6216\u8005\u6216\u8005\u8bc6\u522b\u7684\u90a3\u4e00\u523b\uff1b \u56e0\u6b64\u6211\u4eec\u9700\u8981\u4e00\u79cd\u7b49\u5f85\u673a\u5236\uff0c\u5373\u5728\u4e00\u5b9a\u7684\u65f6\u95f4\u5185\uff0c\u5982\u679c\u8bc6\u522b\u4e0d\u5230\uff0c\u91cd\u590d\u53bb\u8bc6\u522b\uff1a def find_image(\ncls,\n*widget, rate: [float, int] = None,\nmultiple: bool = False,\nmatch_number: int = None,\npicture_abspath: str = None,\nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u5728\u5c4f\u5e55\u4e2d\u533a\u5bfb\u627e\u5c0f\u56fe\uff0c\u8fd4\u56de\u5750\u6807\uff0c\n \u5982\u679c\u627e\u4e0d\u5230\uff0c\u6839\u636e\u914d\u7f6e\u91cd\u8bd5\u6b21\u6570\uff0c\u6bcf\u6b21\u95f4\u96941\u79d2\n :param widget: \u6a21\u677f\u56fe\u7247\u8def\u5f84\n :param rate: \u76f8\u4f3c\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param match_number: \u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\n :return: \u5750\u6807\u5143\u7ec4\n \"\"\"\nif rate is None:\nrate = float(GlobalConfig.IMAGE_RATE)\ntry:\nfor element in widget:\nfor _ in range((match_number or int(GlobalConfig.IMAGE_MATCH_NUMBER)) + 1):\nlocate = cls._match_image_by_opencv(\nelement,\nrate,\nmultiple=multiple,\npicture_abspath=picture_abspath,\nscreen_bbox=screen_bbox\n)\nif not locate:\nsleep(int(GlobalConfig.IMAGE_MATCH_WAIT_TIME))\nelse:\nreturn locate\nraise TemplateElementNotFound(*widget)\nexcept Exception as e:\nraise e\n \u53c2\u6570 match_number \u7528\u4e8e\u63a7\u5236\u91cd\u590d\u8bc6\u522b\u7684\u6b21\u6570\uff0c\u9ed8\u8ba4\u4e0d\u4f20\u53c2\uff0c\u53d6\u5168\u5c40\u914d\u7f6e setting/globalconfig.ini \u91cc\u9762\u7684 IMAGE_MATCH_NUMBER \u914d\u7f6e\u9879\u7684\u503c\uff0c\u9ed8\u8ba4IMAGE_MATCH_NUMBER = 1\uff0c\u5373\u91cd\u8bd5 1 \u6b21\uff1b find_image \u662f\u6846\u67b6\u63d0\u4f9b\u7684\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u51fd\u6570\u63a5\u53e3\uff0c\u8fd9\u4e2a\u51fd\u6570\u63d0\u4f9b\u4e86\u9690\u5f0f\u7b49\u5f85\u7684\u529f\u80fd\uff0c\u4e14\u5305\u542b\u4e0a\u9762\u4ecb\u7ecd\u7684 _match_image_by_opencv \u51fd\u6570\u7684\u6240\u6709\u529f\u80fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2","title":"2\u3001\u6c14\u6ce1\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u6c14\u6ce1\u8bc6\u522b\u6307\u7684\u662f\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\u8981\u5b9a\u4f4d\u7684\u5143\u7d20\u662f\u4e00\u4e9b\u4f1a\u6d88\u5931\u7684\u5c0f\u5f39\u7a97\uff0c\u8fd9\u7c7b\u573a\u666f\u5728\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\u5c31\u53ef\u80fd\u5b58\u5728\u4e0d\u7a33\u5b9a\u6027\uff0c\u6709\u53ef\u80fd\u56fe\u50cf\u8bc6\u522b\u7684\u65f6\u5019\u6c14\u6ce1\u5df2\u7ecf\u6d88\u5931\u4e86\uff0c\u4e5f\u6709\u53ef\u80fd\u6c14\u6ce1\u51fa\u73b0\u7684\u65f6\u95f4\u592a\u77ed\u4e86\uff0c\u4e0d\u5bb9\u6613\u6355\u6349\u5230\uff0c\u5c31\u50cf\u6c14\u6ce1\u4e00\u6837\uff0c\u51fa\u73b0\u4e00\u4e0b\u5c31\u6d88\u5931\uff0c\u56e0\u6b64\u6211\u4eec\u5f62\u8c61\u7684\u79f0\u4e4b\u4e3a \u201c\u6c14\u6ce1\u8bc6\u522b\u201d\uff1b \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u4e3a\u4e86\u80fd\u7a33\u5b9a\u7684\u8bc6\u522b\u6c14\u6ce1\u7c7b\u573a\u666f\uff0c\u6211\u4eec\u91c7\u7528\u7684\u65b9\u6848\u662f\uff1a \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\uff08\u5305\u542b\u6c14\u6ce1\u4ece\u51fa\u73b0\u5230\u6d88\u5931\uff09\uff0c\u4e0d\u505c\u7684\u622a\u53d6\u8fd9\u6bb5\u65f6\u95f4\u5185\u7684\u5927\u56fe\uff0c\u4ee5\u6b64\u786e\u4fdd\u5728\u622a\u53d6\u7684\u4e00\u5806\u56fe\u7247\u4e2d\uff0c\u80af\u5b9a\u6709\u81f3\u5c11\u4e00\u5f20\u56fe\u7247\u80fd\u6355\u6349\u5230\u6c14\u6ce1\uff0c\u6700\u540e\u518d\u5bf9\u8fd9\u4e00\u5806\u56fe\u7247\u9010\u4e2a\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def get_during(\ncls,\nimage_path: str,\nscreen_time: [float, int],\nrate: float = None,\npause: [int, float] = None,\nmax_range: int = 10000\n):\n\"\"\"\n \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u622a\u56fe\u591a\u5f20\u56fe\u7247\u8fdb\u884c\u8bc6\u522b\uff0c\u5176\u4e2d\u6709\u4e00\u5f20\u56fe\u7247\u8bc6\u522b\u6210\u529f\u5373\u8fd4\u56de\u7ed3\u679c;\n \u9002\u7528\u4e8e\u6c14\u6ce1\u7c7b\u7684\u65ad\u8a00\uff0c\u6bd4\u5982\u6c14\u6ce1\u57281\u79d2\u5185\u6d88\u5931\uff0c\u5982\u679c\u7528\u5e38\u89c4\u7684\u56fe\u50cf\u8bc6\u522b\u5219\u6709\u53ef\u80fd\u65e0\u6cd5\u8bc6\u522b\u5230\uff1b\n :param image_path: \u8981\u8bc6\u522b\u7684\u6a21\u677f\u56fe\u7247\uff1b\n :param screen_time: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff1b\n :param rate: \u8bc6\u522b\u7387\uff1b\n :param pause: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u4e0d\u95f4\u9694\uff1b\n :param max_range: \u622a\u56fe\u7684\u6700\u5927\u6b21\u6570\uff0c\u8fd9\u662f\u4e00\u4e2a\u9884\u8bbe\u503c\uff0c\u4e00\u822c\u60c5\u51b5\u4e0b\u4e0d\u6d89\u53ca\u4fee\u6539\uff1b\n \"\"\"\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001screen_time \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5728\u6b64\u65f6\u95f4\u5185\u4f1a\u4e0d\u65ad\u7684\u8fdb\u884c\u622a\u56fe\u64cd\u4f5c\uff0c\u5c31\u50cf\u5f55\u5236\u89c6\u9891\u4e00\u6837\uff1b 2\u3001pause \u6bcf\u6b21\u622a\u53d6\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u4e00\u523b\u4e0d\u505c\u7684\u622a\u56fe\uff0c\u5982\u679c\u4f60\u60f3\u6bcf\u6b21\u622a\u56fe\u5b58\u5728\u4e00\u4e9b\u95f4\u9694\u65f6\u95f4\u4f20\u5165\u5bf9\u5e94\u7684\u65f6\u95f4\u95f4\u9694\u5373\u53ef\uff0c\u5355\u4f4d\u662f\u79d2\uff0c\u6bd4\u5982\uff1apause = 0.03\uff0c\u8868\u793a 30 ms\uff0c\u76f8\u5f53\u4e8e\u5e27\u7387\u4e3a 30 \u5e27\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-opencv","title":"3\u3001\u4e0d\u4f9d\u8d56 OpenCV \u7684\u56fe\u50cf\u8bc6\u522b\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31","title":"3.1\u3001\u81ea\u7814\u56fe\u50cf\u8bc6\u522b\u6280\u672f","text":"\u3010\u539f\u7406\u3011 \u4e3a\u4e86\u5b9e\u73b0\u8bc6\u522b\u56fe\u50cf\u7684\u76ee\u7684\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u5c06\u56fe\u7247\u7684\u6bcf\u4e2a\u50cf\u7d20\u7684RGB\u503c\uff0c\u4e0e\u6574\u4e2a\u5c4f\u5e55\u4e2d\u7684RGB\u8fdb\u884c\u5bf9\u6bd4\uff0c\u5982\u679c\u5c0f\u56fe\u4e0a\u7684RGB\u503c\u4e0e\u5bf9\u5e94\u5927\u56fe\u4f4d\u7f6e\u7684RGB\u90fd\u76f8\u7b49\uff0c\u5219\u5339\u914d\u6210\u529f\uff0c\u5373\u53ef\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u70b9\u3002 1\u3001\u8bfb\u53d6\u5c0f\u56fe\u548c\u5927\u56fe\u7684RGB\u503c \uff081\uff09\u5c0f\u56fe\u7684RGB\u503c small_data = small_pic.load() # load()\u4f1a\u5c06\u56fe\u7247\u7684RGB\u503c\u83b7\u53d6\u5230\uff0c\u6570\u636e\u683c\u5f0f\u4e3a\u4e00\u4e2a\u4e8c\u7ef4\u5217\u8868\uff0c\u8d4b\u503c\u7ed9\u4e00\u4e2a\u53d8\u91cfsmall_data\u3002\n \uff082\uff09\u5927\u56fe\u7684RGB\u503c big_data = big_pic.load()\n 2\u3001\u5c06\u5c0f\u56fe\u4e0e\u5927\u56fe\u7684RGB\u503c\u8fdb\u884c\u5339\u914d \uff081\uff09\u5339\u914d\u4ece\u5927\u56fe\u7684\u5750\u6807\uff080\uff0c0\uff09\u5f00\u59cb\u5339\u914d\uff0c\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff082\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\uff080\uff0c0\uff09\u5bf9\u5e94\u7684\u6240\u6709\u5c0f\u56fe\u7684RGB\u503c\u4e0d\u76f8\u7b49\uff0c\u5219\u79fb\u52a8\u5230\u4e0b\u4e00\u4e2a\u5750\u6807\u70b9\uff081\uff0c0\uff09\uff0c\u540c\u6837\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff083\uff09\u6309\u7167\u8fd9\u6837\u7684\u89c4\u5f8b\u5c06\u8fd9\u4e00\u884c\u6bcf\u79fb\u52a8\u4e00\u4e2a\u5750\u6807\u70b9\uff0c\u90fd\u5c06\u5c0f\u56fe\u6240\u6709\u7684RGB\u4e0e\u5bf9\u5e94\u5927\u56fe\u7684\u503c\u8fdb\u884c\u5339\u914d\uff1b \uff084\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\u5176\u4e2d\u4e00\u4e2a\u5750\u6807\u70b9\u4e0a\u5339\u914d\u5230\u4e86\u5c0f\u56fe\u7684\u6240\u6709RGB\u503c\uff0c\u5219\u6b64\u65f6\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\u70b9\uff1b \uff085\uff09\u5982\u679c\u5339\u914d\u4e86\u5927\u56fe\u6240\u6709\u7684\u5750\u6807\u70b9\uff0c\u90fd\u6ca1\u6709\u5339\u914d\u5230\uff0c\u5219\u8bf4\u660e\u5927\u56fe\u4e2d\u4e0d\u5b58\u5728\u5c0f\u56fe\uff0c\u5339\u914d\u5931\u8d25\uff1b \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 class ImageRgb:\n@staticmethod\ndef _check_match(_x, _y, small, bdata, sdata, rate):\n\"\"\"\n Matching degree of small graph and large graph matching\n \"\"\"\n@staticmethod\ndef _pre_random_point(small):\n\"\"\"\n Pre matching, take 10-20 points at random each time,\n and take coordinates randomly in the small graph\n \"\"\"\n@staticmethod\ndef _pre_random_match(_x, _y, point_list, bdata, sdata, rate):\n\"\"\"\n In the small graph, several points are randomly\n selected for matching, and the matching degree is\n also set for the random points\n \"\"\"\n@classmethod\ndef match_image_by_rgb(cls, image_name=None, image_path=None, rate=0.9):\n\"\"\"\n By comparing the RGB values of the small image with the large\n image on the screen, the coordinates of the small image on\n the screen are returned.\n \"\"\"\n \u901a\u8fc7 match_image_by_rgb() \u8fd9\u4e2a\u51fd\u6570\uff0c\u4f20\u5165\u76ee\u6807\u5c0f\u56fe\u7684\u6587\u4ef6\u540d\u79f0\uff0c\u5373\u53ef\u8fd4\u56de\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u3002 \u6709\u540c\u5b66\u8981\u95ee\u4e86\uff0c\u6709 OpenCV \u5e72\u561b\u4e0d\u7528\uff0c\u6709\u5fc5\u8981\u81ea\u5df1\u5b9e\u73b0\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u529f\u80fd\u5417\uff0c\u4f60\u4eec\u662f\u4e0d\u662f\u95f2\u7684\u554a\uff1f \u8fd9\u4e48\u95ee\u7684\u8bdd\uff0c\u5c0f\u4e86\uff0c\u683c\u5c40\u5c0f\u4e86\uff1b\u6211\u4eec\u81ea\u5df1\u5b9e\u73b0\u4e3b\u8981\u6709\u51e0\u65b9\u9762\u539f\u56e0\uff1a \u51cf\u5c11\u73af\u5883\u4f9d\u8d56\uff0c\u5373\u4e0d\u7528\u5b89\u88c5 OpenCV\uff0c\u6211\u4eec\u4e5f\u80fd\u5b9e\u73b0\u5176\u529f\u80fd\uff0c\u73af\u5883\u4f9d\u8d56\u8fd9\u5757\u540e\u9762\u4f1a\u5355\u72ec\u8be6\u7ec6\u8bb2\uff0c\u51cf\u5c11\u73af\u5883\u4f9d\u8d56\u5bf9\u4e8e\u4efb\u4f55\u8f6f\u4ef6\u5de5\u7a0b\u90fd\u975e\u5e38\u91cd\u8981\uff1b OpenCV \u5728\u5176\u4ed6\u56fd\u4ea7 CPU \u67b6\u6784\u4e0a\u5b89\u88c5\u5e76\u4e0d\u80fd\u4fdd\u8bc1100%\u6210\u529f\uff0c\u751a\u81f3\u6709\u6ca1\u6709\u53ef\u80fd\u5728\u4e00\u4e9b\u67b6\u6784\u4e0a\u538b\u6839\u513f\u5c31\u4e0d\u80fd\u5b89\u88c5\u4f7f\u7528 OpenCV \uff1f \u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 OpenCV \uff1f\u5c31\u50cf\u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 Windows \u5462\uff1f\u8fd9\u4e9b\u95ee\u9898\u503c\u5f97\u601d\u8003\u3002 \u5f53\u7136\uff0c\u6211\u4eec\u627f\u8ba4\u8fd9\u5957\u65b9\u6848\uff0c\u867d\u7136\u8bc6\u522b\u51c6\u786e\u7387\u6ca1\u95ee\u9898\uff0c\u4f46\u5728\u8bc6\u522b\u6548\u7387\u4e0a\u8fd8\u6ca1\u6709\u8fbe\u5230 OpenCV \u6a21\u677f\u5339\u914d\u7684\u6548\u679c\uff0c\u6211\u4eec\u7684\u65b9\u6848\u6bcf\u6b21\u8bc6\u522b\u5728 1.5s \u5de6\u53f3\uff0c\u800c OpenCV \u5728 1s \u5de6\u53f3\uff1b \u6574\u4f53\u8bc6\u522b\u6548\u679c\u6765\u8bb2\uff0c\u6211\u8ba4\u4e3a\u8fd8\u662f\u53ef\u4ee5\u63a5\u53d7\u7684\uff0c\u4e5f\u5e0c\u671b\u6709\u5fd7\u4e4b\u58eb\u80fd\u4e00\u8d77\u4f18\u5316\u6b64\u65b9\u6848\uff0c\u4e00\u8d77\u6280\u672f\u62a5\u56fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32-rpc","title":"3.2\u3001\u57fa\u4e8e RPC \u670d\u52a1\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b","text":"\u5728\u8fdc\u7a0b\u670d\u52a1\u5668\u4e0a\u90e8\u7f72 OpenCV \u7684\u73af\u5883\uff0c\u5e76\u5c06\u5176\u90e8\u7f72\u4e3a RPC \u670d\u52a1\uff0c\u6d4b\u8bd5\u673a\u4e0a\u4e0d\u7528\u5b89\u88c5 OpenCV \u4f9d\u8d56\uff0c\u800c\u662f\u901a\u8fc7\u8bf7\u6c42 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u3010\u539f\u7406\u3011 \u6d4b\u8bd5\u673a\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u56fe\u7247\u4ee5\u53ca\u6a21\u677f\u56fe\u7247\uff0c\u53d1\u9001\u7ed9 RPC \u670d\u52a1\u7aef\uff0c\u670d\u52a1\u7aef\u62ff\u5230\u4e24\u5f20\u56fe\u7247\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u6700\u540e\u5c06\u8bc6\u522b\u7ed3\u679c\u8fd4\u56de\u7ed9\u6d4b\u8bd5\u673a\uff1b \u8981\u7279\u6b8a\u8bf4\u660e\u7684\u662f\uff1a RPC \u662f\u4e00\u79cd\u534f\u8bae\uff0c\u8bb8\u591a\u8bed\u8a00\u90fd\u662f\u652f\u6301\u7684\uff0c\u6bd4\u5982\u8bf4\u670d\u52a1\u7aef\u4e5f\u53ef\u4ee5\u7528 C++ \u6765\u5b9e\u73b0\uff0c\u5ba2\u6237\u7aef\u4f7f\u7528 Python \u4e5f\u662f\u53ef\u4ee5\u8c03\u7528\u7684\u3002 \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 \u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nimport cv2 as cv\nimport numpy as np\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\nif __name__ == \"__main__\":\nserver = ThreadXMLRPCServer((\"x.x.x.x\", 8889), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(match_image_by_opencv, \"match_image_by_opencv\")\nserver.serve_forever()\n \u8fd9\u6837\uff0c\u6211\u4eec\u57fa\u4e8e Python \u6807\u51c6\u5e93 xmlrpc \u642d\u5efa\u4e86\u4e00\u4e2a RPC \u670d\u52a1\u5668\uff0c\u6ce8\u518c\u4e86 image_put \u548c match_image_by_opencv \u4e24\u4e2a\u529f\u80fd\u63a5\u53e3\uff0c\u5728\u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u901a\u8fc7 IP \u548c\u7aef\u53e3\u8fdb\u884c RPC \u8bf7\u6c42\uff1b \u5ba2\u6237\u7aef\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from xmlrpc.client import Binary\nfrom xmlrpc.client import ServerProxy\nserver = ServerProxy(GlobalConfig.OPENCV_SERVER_HOST, allow_none=True)\nscreen_rb = open(screen, \"rb\")\ntemplate_rb = open(template_path, \"rb\")\ntry:\nscreen_path = server.image_put(Binary(screen_rb.read()))\nscreen_rb.close()\ntpl_path = server.image_put(Binary(template_rb.read()))\ntemplate_rb.close()\nreturn server.match_image_by_opencv(\ntpl_path, screen_path, rate, multiple\n)\nexcept OSError as exc:\nraise EnvironmentError(\nf\"RPC\u670d\u52a1\u5668\u94fe\u63a5\u5931\u8d25. {GlobalConfig.OPENCV_SERVER_HOST}\"\n) from exc\n \u901a\u8fc7\u8fd4\u56de server.match_image_by_opencv \u5c31\u83b7\u53d6\u4e86\u5728\u670d\u52a1\u7aef\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4","title":"4\u3001\u53f3\u952e\u83dc\u5355\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41","title":"4.1\u3001\u53f3\u952e\u83dc\u5355\u5b9a\u4f4d\u7684\u65b9\u6848\u53ca\u95ee\u9898","text":"\u53f3\u952e\u83dc\u5355\u7684\u5143\u7d20\u5b9a\u4f4d\u662f\u4e00\u4e2a\u96be\u70b9\uff0c\u8fc7\u53bb\u6211\u4eec\u8c03\u7814\u548c\u4f7f\u7528\u8fc7\u7684\u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u65b9\u6cd5\u6709 4 \u79cd\uff1a \u7b2c\u4e00\u79cd\uff1a\u6b65\u957f\u64cd\u4f5c\u6cd5 \u5728\u53f3\u952e\u83dc\u5355\u547c\u51fa\u6765\u4e4b\u540e\uff0c\u901a\u8fc7\u952e\u76d8\u7684 up\u3001down \u6309\u952e\uff0c\u8fdb\u884c\u9009\u62e9\u83dc\u5355\u9009\u62e9\uff0c\u9009\u4e2d\u76ee\u6807\u4e4b\u540e enter \u5373\u53ef\uff1b\u6bd4\u5982\uff1a\u5728\u684c\u9762\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\uff0c\u6309 1 \u6b21 down \uff0c\u4f1a\u51fa\u73b0\u4e0b\u56fe\uff1a \u7ee7\u7eed\u518d\u6309 2 \u6b21 down\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u518d\u6309 enter\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u5982\u6b64\uff0c\u201c\u6392\u5e8f\u65b9\u5f0f\u201d\u7684\u6b65\u957f\u4e3a 3\uff1b\u901a\u8fc7\u4f7f\u7528\u952e\u76d8\u4e0a\u4e0b\u952e\uff0c\u5c31\u5b9e\u73b0\u4e86\u5bf9\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\uff1b \u4f46\u662f\uff0c\u8fd9\u79cd\u65b9\u5f0f\u6709\u4e2a\u5f88\u70e6\u4eba\u7684\u95ee\u9898\uff0c\u5c31\u662f\u53f3\u952e\u83dc\u5355\u7684\u9009\u9879\u4f4d\u7f6e\u4e0d\u53ef\u80fd\u4e00\u76f4\u4e0d\u53d8\uff0c\u5728\u9700\u6c42\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\uff0c\u83dc\u5355\u9009\u9879\u7684\u53d8\u5316\u662f\u5f88\u5927\u7684\uff0c\u751a\u81f3\u6709\u4e9b\u5e94\u7528\u652f\u6301\u81ea\u5b9a\u4e49\u83dc\u5355\uff0c\u6bd4\u5982\u6587\u7ba1\u53f3\u952e\u83dc\u5355\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff1b \u4e5f\u5c31\u662f\u8bf4\u4f60\u5f97\u7ecf\u5e38\u53bb\u7ef4\u62a4\u83dc\u5355\u9009\u9879\u7684\u6b65\u957f\uff0c\u4e00\u4e2a\u9009\u9879\u73b0\u5728\u7684\u6b65\u957f\u662f 3\uff0c\u4e0b\u4e2a\u8fed\u4ee3\u53ef\u80fd\u5c31\u662f 4 \u6216\u8005 5\u3002 \u7b2c\u4e8c\u79cd\uff1a\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u6cd5 \u628a\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5355\u72ec\u622a\u56fe\u4fdd\u5b58\uff0c\u56fe\u7247\u4e2d\u4ec5\u5305\u542b\u4e00\u4e2a\u83dc\u5355\u9009\u9879\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u8fd9\u6837\uff0c\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5c31\u53ef\u4ee5\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u65b9\u5f0f\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u8fd9\u79cd\u65b9\u5f0f\u4e0d\u7528\u62c5\u5fc3\u83dc\u5355\u9009\u9879\u7684\u987a\u5e8f\u6216\u4f4d\u7f6e\uff0c\u4f46\u662f\u9700\u8981\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff0c\u4e14\u5bb9\u6613\u53d7\u5230\u5b57\u4f53 UI \u53d8\u66f4\u7c7b\u9700\u6c42\u7684\u5f71\u54cd\uff0c\u6bd4\u5982\uff1a\u5b57\u4f53\u5927\u5c0f\u3001\u5b57\u4f53\u95f4\u8ddd\u7b49\u7b49\u9700\u6c42\u53d8\u66f4\u90fd\u4f1a\u5f71\u54cd\uff0c\u6bcf\u6b21\u53d8\u66f4\u4e4b\u540e\u5c31\u9700\u8981\u8fdb\u884c\u5927\u91cf\u56fe\u7247\u8d44\u6e90\u7684\u91cd\u65b0\u622a\u56fe\u66ff\u6362\uff0c\u662f\u4e2a\u6bd4\u8f83\u9ebb\u70e6\u7684\u4e8b\u60c5\uff1b \u7b2c\u4e09\u79cd\uff1a\u76f8\u5bf9\u4f4d\u79fb\u6cd5 \u9f20\u6807\u70b9\u51fb\u53f3\u952e\u7684\u65f6\u5019\uff0c\u9f20\u6807\u7684\u5f53\u524d\u5750\u6807\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u7684\uff0c\u83dc\u5355\u9009\u9879\u7684\u5bbd\uff08 w \uff09\u4e00\u822c\u662f\u56fa\u5b9a\u7684\uff0c\u53d8\u5316\u7684\u662f\u83dc\u5355\u7684\u957f\u5ea6\uff08 h \uff09\uff0c\u53ef\u4ee5\u901a\u8fc7\u67d0\u4e2a\u9009\u9879\u76f8\u5bf9\u4e8e\u9f20\u6807\u7684\u8ddd\u79bb\u5728\u786e\u5b9a\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u901a\u8fc7\u7ef4\u62a4\u83dc\u5355\u9009\u9879\uff08\u76f8\u5bf9\u4f4d\u7f6e\uff09\u76f8\u5bf9\u4e8e\u9f20\u6807\u4f4d\u7f6e\u7684\u8ddd\u79bb\uff0c\u5373\u53ef\u8f7b\u677e\u8ba1\u7b97\u51fa\u83dc\u5355\u9009\u9879\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\u3002 \u4ece\u7406\u8bba\u4e0a\u6b64\u65b9\u6848\u662f\u53ef\u884c\u7684\uff0c\u4f46\u662f\u8fd9\u91cc\u4ecd\u7136\u5b58\u5728\u4e24\u4e2a\u4e25\u91cd\u7684\u95ee\u9898\uff1a \u83dc\u5355\u987a\u5e8f\u6539\u53d8\uff0c\u5bfc\u81f4\u76f8\u5bf9\u8ddd\u79bb\u6539\u53d8\uff0c\u800c\u4e14\u8ddd\u79bb\u662f\u901a\u8fc7\u50cf\u7d20\uff08px\uff09\u6765\u8868\u793a\u7684\uff0c\u4e0d\u60f3\u6b65\u957f\u90a3\u4e48\u53ea\u7ba1\uff0c\u6bcf\u6b21\u9700\u8981\u53bb\u91cf\u4e00\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u70b9\u9ebb\u70e6\uff1b \u9f20\u6807\u5728\u684c\u9762\u4e0d\u540c\u4f4d\u7f6e\u70b9\u51fb\u53f3\u952e\uff0c\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u4f4d\u7f6e\u662f\u4e0d\u540c\u7684\uff0c\u4e0a\u56fe\u7684\u83dc\u5355\u662f\u5728\u9f20\u6807\u7684\u5de6\u4e0b\u65b9\uff0c\u5982\u679c\u4f60\u79fb\u52a8\u9f20\u6807\u5230\u5c4f\u5e55\u56db\u8fb9\uff0c\u4f60\u4f1a\u53d1\u73b0\uff0c\u53f3\u952e\u83dc\u5355\u53ef\u80fd\u51fa\u73b0\u5728\u9f20\u6807\u7684\u56db\u4e2a\u65b9\u5411\uff0c\u4e5f\u5c31\u662f\u8bf4\u4f60\u9700\u8981\u6839\u636e\u9f20\u6807\u7684\u4e0d\u540c\u4f4d\u7f6e\u6765\u5224\u65ad\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u65b9\u5411\uff0c\u800c\u4e0d\u540c\u7684\u65b9\u5411\u4e0a\u8ba1\u7b97\u65b9\u6cd5\u662f\u4e0d\u540c\u7684\uff0c\u6bd4\u5982\uff1a\u53f3\u952e\u83dc\u5355\u5728\u9f20\u6807\u7684\u5de6\u4e0a\uff0c\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\u8ba1\u7b97\u65b9\u6cd5\u4e3a\uff08x - w / 2\uff0c y - h\uff09\uff0c\u8fd9\u6837\u7ef4\u62a4\u8d77\u6765\u53ef\u4ee5\u8bf4\u975e\u5e38\u590d\u6742\uff1b \u57fa\u4e8e\u4ee5\u4e0a\u4e24\u4e2a\u539f\u56e0\uff0c\u6211\u4eec\u5e76\u4e0d\u63a8\u8350\u8fd9\u79cd\u64cd\u4f5c\u65b9\u6848\u3002 \u7b2c\u56db\u79cd\uff1a\u5c5e\u6027\u5b9a\u4f4d \u6709\u540c\u5b66\u8bf4\u5e72\u561b\u4e0d\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u5462\uff0c\u5176\u5b9e\uff0c\u6211\u4eec\u6700\u5f00\u59cb\u60f3\u5230\u7684\u65b9\u6848\u5c31\u662f\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\uff0c\u4f46\u662f\u5728\u5c5e\u6027\u7684 DOM \u6811\u91cc\u600e\u4e48\u4e5f\u627e\u4e0d\u5230\uff0c\u65e0\u6cd5\u5b9a\u4f4d\u5230\uff0c\u6211\u4eec\u4e5f\u8054\u5408\u7814\u53d1\u540c\u5b66\u4e00\u8d77\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u4f46\u6700\u7ec8\u8fd8\u662f\u6ca1\u80fd\u89e3\u51b3\uff0c\u975e\u5e38\u9057\u61be\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42","title":"4.2\u3001\u6700\u65b0\u7684\u53f3\u952e\u83dc\u5355\u7ec8\u6781\u89e3\u51b3\u65b9\u6848","text":"\u7531\u4e8e\u53f3\u952e\u83dc\u5355\u9009\u9879\u51e0\u4e4e\u90fd\u662f\u6587\u672c\uff0c\u90a3\u4e48\u901a\u8fc7 OCR \u8bc6\u522b\uff0c\u51e0\u4e4e\u662f\u6700\u4f18\u7684\u65b9\u6848\uff1a \u4e0d\u7528\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff1b \u4e0d\u4f1a\u53d7\u5230\u83dc\u5355\u9009\u9879\u987a\u5e8f\u6539\u53d8\u7684\u5f71\u54cd\uff1b \u4e0d\u4f1a\u53d7\u5230\u5b57\u4f53 UI \u53d8\u5316\u7684\u5f71\u54cd\uff1b \u5173\u4e8e OCR \u8bc6\u522b\u6211\u4eec\u5728\u540e\u9762\u4f1a\u8be6\u7ec6\u8bb2\u5230\uff0c\u672c\u7ae0\u8282\u4e3b\u8981\u8bb2\u57fa\u4e8e OCR \u8bc6\u522b\uff0c\u6211\u4eec\u5728\u53f3\u952e\u83dc\u5355\u8bc6\u522b\u4e0a\u7684\u7a81\u7834\u548c\u521b\u65b0\uff1b \u4f7f\u7528 OCR \u8bc6\u522b\u53f3\u952e\u83dc\u5355\u867d\u7136\u5df2\u7ecf\u5f88\u5b8c\u7f8e\u4e86\uff0c\u4f46\u662f\u5728\u4e00\u4e9b\u60c5\u51b5\u4e0b\u4ecd\u7136\u5b58\u5728\u4e00\u70b9\u95ee\u9898\uff0c\u5c31\u662f\u5c4f\u5e55\u4e2d\u51fa\u73b0\u591a\u4e2a\u548c\u83dc\u5355\u9009\u9879\u6587\u5b57\u76f8\u540c\u7684\u6587\u5b57\u65f6\uff0c\u6bd4\u5982\u4e0b\u9762\u8fd9\u79cd\u60c5\u51b5\uff1a \u5c4f\u5e55\u6070\u597d\u51fa\u73b0\u4e86\u4e24\u4e2a\u201c\u590d\u5236\u201d\uff0c\u6b64\u65f6\u8981\u5b9a\u4f4d\u5230\u83dc\u5355\u4e2d\u7684 \u201c\u590d\u5236\u201d\uff0c\u5c31\u9700\u8981\u8fdb\u4e00\u6b65\u505a\u6570\u636e\u5904\u7406\uff0c\u6bd4\u5982\uff1aOCR \u8fd4\u56de 2 \u4e2a\u201c\u590d\u5236\u201d\u7684\u5750\u6807\uff0c\u7528\u4f8b\u91cc\u9762\u6765\u5224\u65ad\u7528\u54ea\u4e2a\uff0c\u4ece\u4e1a\u52a1\u4e0a\u5c06\u5904\u7406\u8d77\u6765\u6bd4\u8f83\u9ebb\u70e6\uff0c\u56e0\u4e3a\u4f60\u5f97\u660e\u786e\u77e5\u9053\u83dc\u5355\u5728\u5de6\u8fb9\u8fd8\u662f\u53f3\u8fb9\uff0c\u7136\u540e\u8fd9\u672c\u8eab\u5c31\u662f\u4e0d\u786e\u5b9a\u7684\uff1b \u600e\u4e48\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u5462\uff0c\u8fd9\u5c31\u8981\u8bf4\u9053\u672c\u7ae0\u7684\u4e3b\u9898\uff1a\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b\u3002 \u3010\u539f\u7406\u3011 \u5728\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u524d\u622a\u4e00\u5f20\u56fe\uff0c\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\u518d\u622a\u53d6\u4e00\u5f20\u56fe\uff0c\u4e24\u5f20\u56fe\u552f\u4e00\u53d8\u5316\u7684\u5c31\u662f\u53f3\u952e\u83dc\u5355\uff0c\u5c06\u5176\u4ed6\u76f8\u540c\u7684\u5730\u65b9\u90fd\u5c4f\u853d\u6389\uff0c\u53ea\u7559\u4e0b\u83dc\u5355\u754c\u9762\uff0c\u5982\u6b64\u5373\u53ef\u6d88\u9664\u5e72\u6270\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u5c06\u4e24\u79cd\u56fe\u505a\u524d\u540e\u5bf9\u6bd4\u63d0\u53d6\u53ef\u4ee5\u5f97\u5230\u8fd9\u6837\u7684\u56fe\uff1a \u4f60\u770b\uff0c\u901a\u8fc7\u524d\u540e\u56fe\u7247\u7684\u5bf9\u6bd4\uff0c\u5c06\u76f8\u540c\u7684\u90e8\u5206\u7ed9\u6d88\u9664\u6389\uff0c\u518d\u8fdb\u884c OCR \u8bc6\u522b\uff0c\u8fd9\u6837\u5c31\u4e0d\u4f1a\u6709\u5e72\u6270\u4e86\uff1b \u4ee3\u7801\u5b9e\u73b0\u8bf7\u67e5\u770b src/filter_image.py \uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def filter_image(action):\n\"\"\"\n \u5bf9\u6bd4\u52a8\u4f5c\u524d\u540e\u4e24\u5f20\u56fe\u7247\uff0c\u63d0\u53d6\u4e0d\u540c\u7684\u90e8\u5206\u751f\u6210\u4e00\u5f20\u65b0\u7684\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u65b0\u56fe\u7247\u7684\u8def\u5f84\n :param action: \u52a8\u4f5c\u51fd\u6570\u7684\u51fd\u6570\u5bf9\u8c61\n :return: \u65b0\u56fe\u7247\u7684\u8def\u5f84\n \"\"\"\n action \u662f\u9f20\u6807\u4e8b\u4ef6\uff0c\u56e0\u4e3a\u6b64\u7c7b\u573a\u666f\u4e0d\u4ec5\u4ec5\u5728\u53f3\u952e\u5b58\u5728\uff0c\u5355\u51fb\u3001\u53cc\u51fb\u7b49\u7b49\uff0c\u53ea\u8981\u64cd\u4f5c\u524d\u540e\u540e\u53d8\u5316\u7684\u90fd\u53ef\u4ee5\uff1a from src.mouse_key import MouseKey\naction = (\nMouseKey.click,\nMouseKey.right_click,\nMouseKey.double_click,\nMouseKey.move_to,\n)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5","title":"5\u3001\u52a8\u6001\u56fe\u50cf\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5728\u684c\u9762\u58c1\u7eb8\u5207\u6362\uff0c\u6216\u770b\u56fe\u3001\u76f8\u518c\u5207\u6362\u56fe\u7247\u7c7b\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u7531\u4e8e\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u662f\u4e0d\u56fa\u5b9a\u7684\uff08\u4e0d\u540c\u7248\u672c\u7684\u7cfb\u7edf\u58c1\u7eb8\u4e0d\u540c\u3001\u58c1\u7eb8\u987a\u5e8f\u4e0d\u540c\uff0c\u770b\u56fe\u76f8\u518c\u5728\u56fe\u7247\u8d44\u6e90\u4e0d\u4e00\u5b9a\u56fa\u5b9a\uff09\uff0c\u90a3\u4e48\u5728\u6d4b\u8bd5\u5207\u6362\u58c1\u7eb8\u6216\u8005\u5207\u6362\u56fe\u7247\u7684\u573a\u666f\u65f6\u5c31\u4f1a\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u4f60\u4e0d\u77e5\u9053\u9884\u671f\u662f\u5565\uff0c\u7528\u4f8b\u64cd\u4f5c\u52a8\u6001\u7684\uff0c\u4e5f\u662f\u6781\u4e0d\u7a33\u5b9a\u3002 \u3010\u539f\u7406\u3011 \u5728\u5207\u6362\u56fe\u7247\u4e4b\u524d\u622a\u56fe\u4fdd\u5b58\u5e76\u8fd4\u56de\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u6b21\u8bc6\u522b\u8fd9\u5f20\u56fe\u7247\uff0c\u5982\u679c\u4e0d\u5b58\u5728\uff0c\u8bf4\u660e\u56fe\u7247\u5df2\u7ecf\u5207\u6362\u4e86\uff1b \u793a\u610f\u56fe\uff1a \u8fd9\u6837\uff0c\u6211\u4eec\u622a\u53d6\u4e86\u5f53\u524d\u56fe\u7247\u4e2d\u6bd4\u8f83\u6709\u4ee3\u8868\u6027\u7684\u4f4d\u7f6e\uff08\u4e00\u53ea\u9e1f\uff09\uff0c\u5728\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u7528\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1a \u6211\u4eec\u518d\u62ff\u7740\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd9\u6837\u5728\u5f53\u524d\u56fe\u7247\u4e2d\uff0c\u5c31\u4e0d\u80fd\u627e\u5230\u8fd9\u53ea\u9e1f\u4e86\uff0c\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u662f False\uff0c\u90a3\u4e48\u4e5f\u5c31\u53ef\u4ee5\u5224\u65ad\u56fe\u7247\u5207\u6362\u662f\u6210\u529f\u7684\u3002 \u4ee3\u7801\u793a\u610f\uff1a def save_temporary_picture(_x: int, _y: int, width: int, height: int):\n\"\"\"\n \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u56fe\u7247\u8def\u5f84\n :param x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n :param y: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n :param width: \u5bbd\u5ea6\n :param height: \u9ad8\u5ea6\n :return: \u56fe\u7247\u8def\u5f84\n \"\"\"\n \u6b64\u51fd\u6570\u7528\u4e8e\u5728\u64cd\u4f5c\u4e4b\u524d\u622a\u56fe\u4e00\u5f20\u4e34\u65f6\u56fe\u7247\uff0c\u8fd4\u56de\u56fe\u7247\u8def\u5f84\uff0c\u6700\u540e\u5728\u65ad\u8a00\u7684\u65f6\u5019\u518d\u5c06\u56fe\u7247\u8def\u5f84\u4f5c\u4e3a\u53c2\u6570\u4f20\u5165\u65ad\u8a00\u8bed\u53e5\u5373\u53ef\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ui","title":"\u4e09\u3001\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_1","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u662f\u6211\u4eec\u81ea\u7814\u7684\u4e00\u79cd\u4f7f\u7528\u7b80\u5355\uff0c\u4e14\u6548\u7387\u6781\u9ad8\u3001\u7a33\u5b9a\u6027\u597d\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u57fa\u4e8e\u5143\u7d20\u6309\u94ae\u5728\u5e94\u7528\u4e2d\u7684\u76f8\u5bf9\u4f4d\u7f6e\uff0c\u52a8\u6001\u83b7\u53d6\u5143\u7d20\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff0c\u9002\u7528\u4e8e\u5404\u79cd\u5c4f\u5e55\u5206\u8fa8\u7387\uff08\u5305\u62ec\u9ad8\u5206\u5c4f\u3001\u5bbd\u5c4f\u3001\u5e26\u9c7c\u5c4f\uff09\uff0c\u5f53\u5143\u7d20\u6309\u94ae\u4f4d\u7f6e\u76f8\u5bf9\u4e8e\u5e94\u7528\u754c\u9762\u4f4d\u7f6e\u53d1\u751f\u4fee\u6539\u4e4b\u540e\uff0c\u53ea\u9700\u8981\u6839\u636e UI \u8bbe\u8ba1\u56fe\u4e0a\u7684\u6e90\u6570\u636e\u4fee\u6539\u5bf9\u5e94\u5750\u6807\u6570\u636e\u5c31\u597d\uff0c\u7ef4\u62a4\u975e\u5e38\u7684\u65b9\u4fbf\u3002 \u6b64\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u9002\u7528\u4e8e\u4e00\u4e9b\u5143\u7d20\u4f4d\u7f6e\u76f8\u5bf9\u4e0e\u5e94\u7528\u754c\u9762\u6bd4\u8f83\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u97f3\u4e50\uff0899% \u7684\u5143\u7d20\u5b9a\u4f4d\u91c7\u7528\u8fd9\u79cd\uff0c\u6548\u679c\u975e\u5e38\u597d\uff09\uff0c\u4e0d\u9002\u7528\u4e8e\u754c\u9762\u4e0d\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u622a\u56fe\u5f55\u5c4f\uff0c\u5f88\u660e\u663e\u4e0d\u9002\u7528\u4e8e\u8fd9\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u3002\u8fd9\u79cd\u5168\u65b0\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u6709\u5b83\u7684\u9002\u7528\u6761\u4ef6\uff0c\u5982\u679c\u4f60\u53d1\u73b0\u4f7f\u7528\u5e38\u89c4\u7684\uff08\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u5b9a\u4f4d\uff09\u4e0d\u597d\u505a\u65f6\uff0c\u4e0d\u59a8\u8003\u8651\u4f7f\u7528\u8fd9\u79cd\uff0c\u5176\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff0c\u5e76\u4e14\u8fc5\u901f\u7231\u4e0a\u4ed6\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_1","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5728 UI \u8bbe\u8ba1\u56fe\u4e2d\u6211\u4eec\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u8fb9\u6846\u7684\u8ddd\u79bb\u7684\uff0c\u7136\u540e\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u6280\u672f\u624b\u6bb5\u83b7\u53d6\u5230\u5e94\u7528\u754c\u9762\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u53ca\u5e94\u7528\u7a97\u53e3\u7684\u5927\u5c0f\uff0c\u793a\u610f\u56fe\u5982\u4e0b\uff1a \uff08x1, y1\uff09\u4e3a\u5e94\u7528\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\uff1b\uff08x2, y2\uff09\u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u5de6\u4e0a\u89d2\uff08x1, y1\uff09\u7684\u5750\u6807\uff0c\u90a3\u4e48\u5b9e\u9645\u4e0a\u3010\u64ad\u653e\u6240\u6709\u3011\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\u4e3a\uff1a\uff08 x1 + x2, y1 + y2 \uff09\uff1b \u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5927\u5c0f\uff08w2, h2\uff09\uff0c\u53ef\u4ee5\u4ece UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\uff1b \u5728 UI \u8bbe\u8ba1\u7a3f\u4e0a\u70b9\u51fb\u3010\u64ad\u653e\u6240\u6709\u3011\u56fe\u6807\uff0c\u7136\u540e\u79fb\u52a8\u9f20\u6807\u5c31\u5c31\u53ef\u4ee5\u770b\u5230\u4e0a\u56fe\u7684\u53c2\u8003\u7ebf\u53ca\u6570\u636e\uff1b \u6240\u4ee5\uff0c\u6211\u4eec\u53ef\u4ee5\u8f7b\u677e\u7684\u83b7\u53d6\u5230\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u4e2d\u5fc3\u5750\u6807\u4e3a\uff1a\uff08 x1 + x2 + (w2 / 2), y1 + y2 + ( h2 / 2) \uff09 \u8be6\u7ec6\u6e90\u4ee3\u7801\u8bf7\u67e5\u770b AT \u57fa\u7840\u6846\u67b6: src/button_center.py \u83b7\u53d6\u5e94\u7528\u7a97\u53e3\u7684\u4fe1\u606f \u4f7f\u7528 xdotool \u548c xwininfo \u83b7\u53d6\u5230\u5e94\u7528\u7a97\u53e3\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u5de6\u4e0a\u89d2\uff09\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a app_id = CmdCtl.run_cmd(f\"xdotool search --classname --onlyvisible {self.app_name}\"\n).split(\"\\n\")\napp_id_list = [int(_id) for _id in app_id if _id]\nreturn CmdCtl.run_cmd(f\"xwininfo -id {app_id_list[self.number]}\")\n \u4f7f\u7528\u6b63\u5219\u83b7\u53d6\u7a97\u53e3\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u83b7\u53d6\u914d\u7f6e \u8bfb ini \u914d\u7f6e\u6587\u4ef6\uff0c\u83b7\u53d6\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e0e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a conf = ConfigParser()\nconf.read(self.config_path)\ndirection = conf.get(btn_name, \"direction\")\nposition = [int(i.strip()) for i in conf.get(btn_name, \"location\").split(\",\")]\n \u8ba1\u7b97\u5143\u7d20\u6309\u94ae\u5750\u6807 \u6839\u636e\u5e94\u7528\u7a97\u53e3\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u5927\u5c0f\u3001\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u5927\u5c0f\uff0c\u4f7f\u7528\u4e00\u5b9a\u7684\u7b97\u6cd5\u5373\u53ef\u8ba1\u7b97\u51fa\u5143\u7d20\u6309\u94ae\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u4e2d\u5fc3\u5750\u6807\uff09\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3","title":"3\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u3010\u914d\u7f6e\u65b9\u6cd5\u3011 \u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u7684\u6570\u636e\u6e90\u662f\u5e94\u7528\u5e93\u4e2d\u7684 ui.ini \u914d\u7f6e\u6587\u4ef6\uff1a ;section\n[\u65b0\u5efa\u6b4c\u5355+] ;key = value\ndirection = left_top\nlocation = 180, 268, 21, 21\n section \u662f\u4f60\u6839\u636e\u5bf9\u5e94\u7684\u5143\u7d20\u6309\u94ae\u547d\u540d\uff0c\u4f60\u53ef\u4ee5\u4efb\u610f\u547d\u540d\uff0c\u4f46\u6700\u597d\u6709\u5177\u4f53\u542b\u4e49\uff0c\u4e14\u80fd\u660e\u786e\u8868\u793a\u8fd9\u4e2a\u5143\u7d20\u6309\u94ae\u7684\u540d\u79f0\uff1b\u7528\u4e2d\u62ec\u53f7\u62ec\u8d77\u6765\u5c31\u884c\uff0c\u6bd4\u5982\uff1a[\u65b0\u5efa\u6b4c\u5355+] \uff1b direction \u662f\u914d\u7f6e\u8be5\u5143\u7d20\u7684\u53c2\u8003\u7cfb\uff0c\u5206\u522b\u4e3a\uff1a left_top \u5de6\u4e0a\uff1b left_bottom \u5de6\u4e0b\uff1b right_top \u53f3\u4e0a\uff1b right_bottom \u53f3\u4e0b\uff1b \u53c2\u8003\u7cfb\u7684\u9009\u53d6\u6807\u51c6\uff1a\u62c9\u52a8\u6539\u53d8\u7a97\u53e3\u5927\u5c0f\u65f6\uff0c\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u53c2\u8003\u7cfb\u4f4d\u7f6e\u662f\u4e0d\u53d8\u7684\uff1b location \u662f\u8be5\u5143\u7d20\u6309\u94ae\u7684\u76f8\u5bf9\u4e0e\u53c2\u8003\u7cfb\u7684 x, y \u7684\u8ddd\u79bb\uff0c\u53ca\u5927\u5c0f(w, h)\uff0c\u8fd9\u56db\u4e2a\u6570\u636e\u53ef\u4ee5\u901a\u8fc7 UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\u6570\u636e\uff0c\u5728\u7f16\u8f91\u6a21\u5f0f\u4e0b\uff0c\u70b9\u51fb UI \u56fe\u4e0a\u7684\u6309\u94ae\uff0c\u53f3\u4fa7\u5c31\u4f1a\u51fa\u73b0\u8be5\u5143\u7d20\u6309\u94ae\u7684 x, y, w, h \u6570\u636e\u3002 \u5982\u679c UI \u56fe\u4e0a\u6ca1\u6709\u63d0\u4f9b\u4f60\u60f3\u8981\u7684\u5143\u7d20\u6570\u636e\uff0c\u4f60\u53ef\u4ee5\u76f4\u63a5\u5728\u7cfb\u7edf\u4e2d\u4f7f\u7528\u622a\u56fe\u5f55\u5c4f\u8fdb\u884c\u5c3a\u91cf\uff0c\u8fd9\u662f\u4e00\u79cd\u4e0d\u63a8\u8350\u4f46\u80fd\u7528\u7684\u65b9\u6cd5\u3002 \u3010\u8c03\u7528\u65b9\u6cd5\u3011 \u5728\u5e94\u7528\u5e93\u65b9\u6cd5\u5c42\u8fd9\u6837\u5199\uff1a def click_add_music_list_btn_in_music_by_ui(self):\n\"\"\"\u70b9\u51fb\u65b0\u5efa\u6b4c\u5355\u6309\u94ae\"\"\"\nself.click(*self.ui.btn_center(\"\u65b0\u5efa\u6b4c\u5355+\"))\n self.ui.btn_center() \u662f\u56fa\u5b9a\u5199\u6cd5\uff0c\u53c2\u6570\u5c31\u662f\u914d\u7f6e\u91cc\u9762\u7684 section \u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ocr","title":"\u56db\u3001OCR \u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_2","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 OCR \u65b9\u6848\u5927\u591a\u91c7\u7528\u8c37\u6b4c OCR\uff08Tesseract\uff09\u65b9\u6848\uff0c\u4f46\u662f\u5b83\u5bf9\u4e8e\u4e2d\u6587\u7684\u8bc6\u522b\u975e\u5e38\u5dee\uff0c\u7ecf\u8fc7\u5927\u91cf\u7684\u8c03\u7814\uff0c\u6211\u4eec\u4f7f\u7528 PaddleOCR\uff0c\u5b83\u662f\u4e00\u4e2a\u5f00\u6e90\u7684\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u8bc6\u522b\u5de5\u5177\uff0c\u4e5f\u662f PaddlePaddle \u6700\u6709\u540d\u7684\u4e00\u4e2a\u5f00\u6e90\u9879\u76ee\uff0c\u611f\u5174\u8da3\u7684\u53ef\u4ee5\u70b9\u8fd9\u91cc\u4e86\u89e3\uff0c\u591a\u7684\u4e0d\u8bf4\u4e86\uff0c\u4f60\u53ea\u9700\u8981\u77e5\u9053\u5b83\u5c31\u662f\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_2","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5b89\u88c5\u4ed6\u662f\u4e2a\u5f88\u9ebb\u70e6\u7684\u4e8b\u60c5\uff0c\u867d\u7136\u64cd\u4f5c\u5f88\u7b80\u5355\uff0c\u4f46\u5176\u5b9e\u5b89\u88c5\u5305\u6709\u70b9\u5927\uff0c\u56e0\u6b64\u6211\u4eec\u4e0d\u5e0c\u671b\u76f4\u63a5\u5728 env.sh \u4e2d\u52a0\u5165\u5b83\uff0c\u8fd9\u4f1a\u8ba9\u6574\u4e2a\u81ea\u52a8\u5316\u73af\u5883\u53d8\u5f97\u975e\u5e38\u81c3\u80bf\uff1b \u56e0\u6b64\uff0c\u6211\u4eec\u60f3\u5230\u5c06\u5b83\u505a\u6210\u4e00\u4e2a RPC \u670d\u52a1\u5728\u5176\u4ed6\u673a\u5668\u4e0a\u90e8\u7f72\uff0c\u6d4b\u8bd5\u673a\u901a\u8fc7\u8fdc\u7a0b\u8c03\u7528 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u4f7f\u7528\u5b83\uff1b RPC \u7684\u8c03\u7528\u903b\u8f91\uff1a \u8fd9\u6837\u6211\u4eec\u53ea\u9700\u8981\u5728\u670d\u52a1\u7aef\u90e8\u7f72\u597d OCR \u8bc6\u522b\u7684\u670d\u52a1\uff0c\u7136\u540e\u901a\u8fc7 RPC \u670d\u52a1\u5c06\u529f\u80fd\u63d0\u4f9b\u51fa\u6765\uff0c\u6846\u67b6\u91cc\u9762\u53ea\u9700\u8981\u8c03\u7528\u5bf9\u5e94\u7684 RPC \u63a5\u53e3\u5c31\u884c\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_1","title":"3\u3001\u4f7f\u7528\u8bf4\u660e","text":"\u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nfrom paddleocr import PaddleOCR\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef paddle_ocr(pic_path, lang):\n\"\"\"\n Paddleocr\u76ee\u524d\u652f\u6301\u7684\u591a\u8bed\u8a00\u8bed\u79cd\u53ef\u4ee5\u901a\u8fc7\u4fee\u6539lang\u53c2\u6570\u8fdb\u884c\u5207\u6362\n \u4f8b\u5982`ch`, `en`, `fr`, `german`, `korean`, `japan`\n :param file_name:\n :param lang:\n :return:\n \"\"\"\nif __name__ == \"__main__\":\nIP = popen(\"hostname -I\").read().split(\" \")[0]\nPORT = 8890\nSCREEN_CACHE = \"/tmp/screen.png\"\nserver = ThreadXMLRPCServer((IP, PORT), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(paddle_ocr, \"paddle_ocr\")\nprint(\"\u76d1\u542c\u5ba2\u6237\u7aef\u8bf7\u6c42\u3002\u3002\")\nserver.serve_forever()\n \u6846\u67b6\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from src import OCR\nOCR.ocr(*target_strings, picture_abspath=None, similarity=0.6, return_default=False, return_first=False, lang=\"ch\"):\n# \u901a\u8fc7 OCR \u8fdb\u884c\u8bc6\u522b\u3002\n# target_strings:\n# \u76ee\u6807\u5b57\u7b26,\u8bc6\u522b\u4e00\u4e2a\u5b57\u7b26\u4e32\u6216\u591a\u4e2a\u5b57\u7b26\u4e32,\u5e76\u8fd4\u56de\u5176\u5728\u56fe\u7247\u4e2d\u7684\u5750\u6807;\n# \u5982\u679c\u4e0d\u4f20\u53c2\uff0c\u8fd4\u56de\u56fe\u7247\u4e2d\u8bc6\u522b\u5230\u7684\u6240\u6709\u5b57\u7b26\u4e32\u3002\n# picture_abspath: \u8981\u8bc6\u522b\u7684\u56fe\u7247\u8def\u5f84\uff0c\u5982\u679c\u4e0d\u4f20\u9ed8\u8ba4\u622a\u53d6\u5168\u5c4f\u8bc6\u522b\u3002\n# similarity: \u5339\u914d\u5ea6\u3002\n# return_default: \u8fd4\u56de\u8bc6\u522b\u7684\u539f\u751f\u6570\u636e\u3002\n# return_first: \u53ea\u8fd4\u56de\u7b2c\u4e00\u4e2a,\u9ed8\u8ba4\u4e3a False,\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u6240\u6709\u6570\u636e\u3002\n# lang: `ch`, `en`, `fr`, `german`, `korean`, `japan`\n \u6b64\u65b9\u6848\u5728\u6846\u67b6\u5185\u6ca1\u6709\u5f15\u5165\u4efb\u4f55\u4e09\u65b9\u4f9d\u8d56\u5b8c\u5168\u91c7\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\uff0c\u800c\u4e14\u4f7f\u7528\u65b9\u6cd5\u975e\u5e38\u7b80\u5355\uff0c\u53ea\u9700\u8981\u901a\u8fc7 OCR.ocr() \u5373\u53ef\uff1b \u5bf9\u4e8e\u4e00\u4e9b\u6587\u6848\u7684\u573a\u666f\u975e\u5e38\u9002\u7528\uff0c\u6b64\u65b9\u6cd5\u76f4\u63a5\u8fd4\u56de\u5750\u6807\uff0c\u53ef\u4ee5\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u3002 \u4e5f\u53ef\u4ee5\u7528\u4e8e\u6587\u5b57\u65ad\u8a00\uff0c\u4ee3\u7801\u793a\u610f\uff1a def assert_ocr_exist(\n*args, picture_abspath=None, similarity=0.6, return_first=False, lang=\"ch\"\n):\n\"\"\"\u65ad\u8a00\u6587\u6848\u5b58\u5728\"\"\"\npic = None\nif picture_abspath is not None:\npic = picture_abspath + \".png\"\nres = OCR.ocr(\n*args,\npicture_abspath=pic,\nsimilarity=similarity,\nreturn_first=return_first,\nlang=lang,\n)\nif res is False:\nraise AssertionError(\n(f\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{args}\", f\"{pic if pic else GlobalConfig.SCREEN_CACHE}\")\n)\nif isinstance(res, tuple):\npass\nelif isinstance(res, dict) and False in res.values():\nres = filter(lambda x: x[1] is False, res.items())\nraise AssertionError(\n(\nf\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{dict(res)}\",\nf\"{pic if pic else GlobalConfig.SCREEN_CACHE}\",\n)\n)\n \u5728\u7528\u4f8b\u4e2d\u4f7f\u7528\u65ad\u8a00\uff0c\u793a\u4f8b\uff1a def test_font_manager_021(self):\n\"\"\"\u53f3\u4fa7\u2665-\u6536\u85cf/\u53d6\u6d88\u6536\u85cf\u5b57\u4f53\"\"\"\n# \u5b57\u4f53\u7ba1\u7406\u5668\u754c\u9762\u53f3\u4fa7\u8be6\u60c5\u5217\u8868\uff0c\u9009\u62e9\u672a\u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e / \u6536\u85cf\u5b57\u4f53\n# \u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e\u83dc\u5355\u663e\u793a\u201c\u53d6\u6d88\u6536\u85cf\u201d\uff1b\n...\nself.assert_ocr_exist(\"\u53d6\u6d88\u6536\u85cf\")\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_1","title":"4\u3001\u670d\u52a1\u7aef\u90e8\u7f72","text":"\u6211\u4eec\u76ee\u524d\u662f\u5c06 OCR \u670d\u52a1\u90e8\u7f72\u5728\u666e\u901a\u7684\u529e\u516c\u673a\u4e0a\u7684\uff0c\u5982\u679c\u4f60\u89c9\u5f97\u73b0\u6709\u7684 OCR \u8bc6\u522b\u6027\u80fd\u4e0d\u591f\u597d\uff0c\u6070\u597d\u4f60\u6709\u66f4\u597d\u7684\u673a\u5668\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u5176\u79c1\u6709\u5316\u90e8\u7f72\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41_1","title":"4.1\u3001\u73af\u5883\u5b89\u88c5","text":"\u63a8\u8350\u4f7f\u7528 pipenv \u8fdb\u884c\u73af\u5883\u642d\u5efa\uff1b \u5b89\u88c5 pipenv \uff1a sudo pip3 install pipenv\n \u65b0\u5efa\u4e00\u4e2a\u76ee\u5f55\u4f5c\u4e3a\u73af\u5883\u5305 ocr_env\uff1a cd ~\nmkdir ocr_env\n \u521b\u5efa python 3.7 \u73af\u5883\uff1a cd ocr_env\npipenv --python 3.7\n \u5b89\u88c5 OCR \u4f9d\u8d56\u5305\uff1a pipenv install paddlepaddle -i https://mirror.baidu.com/pypi/simple\npipenv install \"paddleocr>=2.0.1\" -i https://mirror.baidu.com/pypi/simple\n \u4e0d\u51fa\u610f\u5916\uff0c\u8fd9\u6837\u5c31\u628a\u4f9d\u8d56\u5b89\u88c5\u597d\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42_1","title":"4.2\u3001\u542f\u52a8\u670d\u52a1","text":"\u5c06\u57fa\u7840\u6846\u67b6\u4e2d\u7684 scr/ocr/pdocr_rpc_server.py \u6587\u4ef6\u62f7\u8d1d\u5230 ocr_env \u76ee\u5f55\uff0c\u540e\u53f0\u6267\u884c\u5b83\u5c31\u597d\u4e86\uff1a cd ocr_env\nnohup pipenv run python pdocr_rpc_server.py &\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#43","title":"4.3\u3001\u914d\u7f6e\u5f00\u673a\u81ea\u542f\uff08\u901a\u7528\uff09","text":"\u4f60\u80af\u5b9a\u4e0d\u60f3\u6bcf\u6b21\u673a\u5668\u91cd\u542f\u4e4b\u540e\u90fd\u9700\u8981\u624b\u52a8\u542f\u52a8\u670d\u52a1\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u914d\u7f6e\u5f00\u673a\u81ea\u542f\u3002 \u5199\u5f00\u673a\u81ea\u542f\u670d\u52a1\u6587\u4ef6\uff1a sudo vim /lib/systemd/system/ocr.service\n autoocr \u540d\u79f0\u4f60\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff0c\u5199\u5165\u4ee5\u4e0b\u5185\u5bb9\uff1a [Unit]\nDescription=OCR Service\nAfter=multi-user.target\n\n[Service]\nUser=uos\nGroup=uos\nType=idle\nWorkingDirectory=/home/uos/ocr_env\nExecStart=pipenv run python pdocr_rpc_server.py\n\n[Install]\nWantedBy=multi-user.target\n \u6ce8\u610f\u66ff\u6362\u4f60\u7684${USER} \u4fee\u6539\u914d\u7f6e\u6587\u4ef6\u7684\u6743\u9650\uff1a sudo chmod 644 /lib/systemd/system/ocr.service\n \u81ea\u542f\u670d\u52a1\u751f\u6548\uff1a sudo systemctl daemon-reload\nsudo systemctl enable ocr.service\n \u67e5\u770b\u670d\u52a1\u72b6\u6001\uff1a sudo systemctl status ocr.service\n \u4f60\u53ef\u4ee5\u518d\u91cd\u542f\u4e0b\u7535\u8111\uff0c\u770b\u770b\u670d\u52a1\u662f\u4e0d\u662f\u6b63\u5e38\u542f\u52a8\u4e86\uff0c\u6ca1\u62a5\u9519\u5c31 OK \u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_4","title":"\u4e94\u3001\u5c5e\u6027\u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_3","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 UI \u81ea\u52a8\u5316\u5927\u591a\u90fd\u662f\u57fa\u4e8e\u6d4f\u89c8\u5668\u7684\uff0c\u6838\u5fc3\u662f\u5728\u7f51\u9875\u7684 DOM \u6811\u4e0a\u67e5\u627e\u5143\u7d20\uff0c\u5e76\u5bf9\u5176\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\uff1b Linux \u684c\u9762\u5e94\u7528\u5927\u591a\u662f\u91c7\u7528 Qt \u7f16\u5199\u7684\uff0c\u5728 Qt \u4e2d\u4e5f\u662f\u4ece\u6700\u9876\u5c42\u7684 MainWindow \u5f00\u59cb\u6784\u5efa\u5e94\u7528\uff0c\u6240\u4ee5\u903b\u8f91\u4e5f\u662f\u4e00\u6837\u7684\uff0cQt \u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u540c\u6837\u53ef\u4ee5\u901a\u8fc7 DOM \u6811\uff08\u5c5e\u6027\u6811\uff09\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff0c\u6211\u4eec\u79f0\u4e4b\u4e3a\u5c5e\u6027\u5b9a\u4f4d\u3002 \u501f\u52a9\u5f00\u6e90\u5de5\u5177 dogtail \u6211\u4eec\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u83b7\u53d6\uff0c\u4ece\u800c\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\u3002dogtail \u7684\u9879\u76ee\u4ecb\u7ecd\u53ef\u4ee5\u731b\u6233\u8fd9\u91cc\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_3","title":"2\u3001\u4f7f\u7528\u65b9\u6cd5","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#21sniff","title":"2.1\u3001sniff\uff08\u55c5\u63a2\u5668\uff09\u4f7f\u7528","text":"\u5728\u7ec8\u7aef\u8f93\u5165 sniff \u542f\u52a8 AT-SPI Browser mikigo@mikigo-PC:~$ sniff\n \u67e5\u770b\u5e94\u7528\u7684\u6807\u7b7e \u5728 sniff \u91cc\u9762\u53ef\u4ee5\u770b\u5230\u7cfb\u7edf\u4e2d\u5df2\u542f\u52a8\u7684\u5e94\u7528\uff0c\u70b9\u51fb\u5e94\u7528\u540d\u79f0\u524d\u9762\u7684\u4e09\u89d2\u5f62\u56fe\u6807\uff0c\u53ef\u4ee5\u5c55\u5f00\u5e94\u7528\u7684\u6807\u7b7e\uff0c\u6240\u6709\u6807\u7b7e\u4ee5 tree \u7684\u5f62\u5f0f\u5c55\u793a\uff0c\u5bf9\u5e94\u5e94\u7528\u91cc\u9762\u7684\u7236\u7a97\u53e3\u548c\u5b50\u7a97\u53e3\u3002 \u83b7\u53d6\u5143\u7d20\u63a7\u4ef6\u7684\u6807\u7b7e\u540d\u79f0 \u9996\u5148\uff0c\u4e3a\u4e86\u65b9\u4fbf\u67e5\u770b\u5143\u7d20\u63a7\u4ef6\u5bf9\u5e94\u7684\u4f4d\u7f6e\uff0c\u5efa\u8bae\u73b0\u5728\u4e0a\u65b9\u5de5\u5177\u680f\u70b9\u51fb Actions\uff0c\u7136\u540e\u52fe\u9009 Hightlight Items\uff0c\u8fd9\u6837\u5728 sniff \u4e2d\u9f20\u6807\u9009\u4e2d\u5143\u7d20\u6807\u7b7e\u7684\u65f6\u5019\uff0c\u5e94\u7528\u4e2d\u4f1a\u6709\u76f8\u5e94\u7684\u5149\u6807\u9501\u5b9a\u3002 \u5728 sniff \u91cc\u9762\u70b9\u51fb\u8fdb\u5165\u5e94\u7528\u7684\u6807\u7b7e tree \u4e2d\u540e\uff0c\u70b9\u51fb\u76f8\u5e94\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5728\u5de5\u5177\u4e0b\u65b9\uff0c\u4f1a\u5c55\u793a\u5143\u7d20\u63a7\u4ef6\u7684 Name\uff0c\u8fd9\u4e2a\u5c31\u662f\u6807\u7b7e\u540d\u79f0\u3002 \u5728 tree \u4e2d\u6709\u4e9b\u5730\u65b9\u662f\u7a7a\u767d\u7684\u6216\u8005\u662f Form\uff0c\u662f\u56e0\u4e3a\u5f00\u53d1\u4eba\u5458\u5728\u6dfb\u52a0\u6807\u7b7e\u7684\u65f6\u5019\u6ca1\u6709\u6dfb\u52a0\uff0c\u6216\u8005\u6709\u4e9b\u7236\u7a97\u53e3\u4e0d\u9700\u8981\u6dfb\u52a0\uff0c\u8fd9\u79cd\u5728\u5b9e\u9645\u4e1a\u52a1\u4e2d\u662f\u4e0d\u5f71\u54cd\u7684\uff0c\u6211\u4eec\u53ea\u8981\u4fdd\u8bc1\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\u4e2d\uff0c\u8981\u7528\u5230\u7684\u5143\u7d20\u90fd\u6dfb\u52a0\u4e86\u6807\u7b7e\u5373\u53ef\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#22","title":"2.2\u3001\u5143\u7d20\u64cd\u4f5c","text":"\u83b7\u53d6\u5e94\u7528\u5bf9\u8c61 dogtail \u83b7\u53d6\u5e94\u7528\u5bf9\u8c61\u7684\u65f6\u5019\uff0c\u4f7f\u7528\u7684\u662f tree \u5e93\u91cc\u9762\u7684 application() \u65b9\u6cd5\uff1a from dogtail.tree import root\napp_obj = root.application('deepin-music')\n app_obj\u5c31\u662f\u5e94\u7528\u7684\u5bf9\u8c61\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\uff0c\u662f\u5e94\u7528\u5bf9\u8c61\u4f7f\u7528child()\u65b9\u6cd5\uff1a element = app_obj.child('element_name')\n \u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u4f20\u5165\u5143\u7d20\u7684 Name\uff0c\u83b7\u53d6\u5230\u76f8\u5e94\u5143\u7d20\u7684\u5bf9\u8c61\u3002Name \u53ef\u4ee5\u901a\u8fc7 sniff \u67e5\u770b\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\u5217\u8868: element_list = element.children\n \u83b7\u53d6\u5230\u8fd9\u4e2a\u5143\u7d20\u4e0b\u9762\u6240\u6709\u7684\u5143\u7d20\u5217\u8868\u3002 \u8fd9\u4e2a\u65b9\u6cd5\u9002\u7528\u4e8e\u6709\u4e9b\u6807\u7b7e\u6ca1\u6709\u6dfb\u52a0\uff0c\u4f46\u662f\u4f4d\u7f6e\u662f\u56fa\u5b9a\u7684\uff0c\u6211\u4eec\u901a\u8fc7\u7d22\u5f15\u53ef\u4ee5\u53d6\u5f97\u5143\u7d20\u3002 element_list[0]\n \u5bf9\u5143\u7d20\u7684\u64cd\u4f5c \u5728\u83b7\u53d6\u5230\u5143\u7d20\u4e4b\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u76f8\u5e94\u7684\u64cd\u4f5c\u3002 \u5355\u51fb element.click(button=1)\n button 1 \u2014>\u5de6\u952e\uff0c2 \u2014>\u6eda\u8f6e\uff0c3 \u2014>\u53f3\u952e\uff0c\u9ed8\u8ba4\u4e3a 1 \u53cc\u51fb element.doubleClick(button=1)\n \u9f20\u6807\u60ac\u505c element.point()\n \u9f20\u6807\u79fb\u52a8\u5230\u5143\u7d20\u4e2d\u5fc3\u4f4d\u7f6e \u6587\u672c\u8f93\u5165 element.typeText(string)\n \u5411\u5143\u7d20\u5bf9\u8c61\u8f93\u5165\u5b57\u7b26\u4e32 \uff0c\u6bd4\u5982\u8f93\u5165\u6846 \u7ec4\u5408\u952e element.keyCombo(comboString)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#23","title":"2.3\u3001\u6846\u67b6\u5c01\u88c5","text":"\u4ee3\u7801\u793a\u4f8b\uff1a # \u8be6\u7ec6\u4ee3\u7801\u8bf7\u67e5\u770b src/dogtail_utils.py\nclass DogtailUtils:\ndef __init__(self, name=None, description=None):\nself.name = name\nself.description = description\nself.obj = root.application(self.name, self.description)\ndef app_element(self, *args, **kwargs):\n\"\"\"\n \u83b7\u53d6app\u5143\u7d20\u7684\u5bf9\u8c61\n :return: \u5143\u7d20\u7684\u5bf9\u8c61\n \"\"\"\nreturn self.obj.child(*args, **kwargs, retry=False)\ndef element_center(self, element) -> tuple:\n\"\"\"\n \u83b7\u53d6\u5143\u7d20\u7684\u4e2d\u5fc3\u4f4d\u7f6e\n :param element:\n :return: \u5143\u7d20\u4e2d\u5fc3\u5750\u6807\n \"\"\"\n_x, _y, _w, _h = self.app_element(element).extents\n_x = _x + _w / 2\n_y = _y + _h / 2\nreturn _x, _y\n \u6846\u67b6\u63d0\u4f9b\u7684\u63a5\u53e3\u975e\u5e38\u7b80\u6d01\uff0c\u5728\u8c03\u7528\u65f6\uff1a self.dog.element_center(\"\u64ad\u653e\")\n \u8fd9\u6837\u5c31\u80fd\u83b7\u53d6\u5230\u6b64\u5143\u7d20\u7684\u4e2d\u5fc3\u5750\u6807\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_5","title":"\u516d\u3001\u6807\u7b7e\u5316\u7ba1\u7406","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_4","title":"1\u3001\u6807\u7b7e\u8bf4\u660e","text":"\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u811a\u672c ID\uff1a\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c/\u51fd\u6570 ID\uff1b PMS\u7528\u4f8bID\uff1aPMS \u4e0a\u5bf9\u5e94\u7684\u7528\u4f8b ID\uff08\u7528\u4f8b\u5e93 ID\uff09\uff1b \u9ed8\u8ba4\u4f7f\u7528\u7528\u4f8b\u5e93 ID\uff0c\u5bf9\u4e8e\u6682\u65f6\u6ca1\u6709\u4f7f\u7528\u7528\u4f8b\u5e93\u7ba1\u7406\u7528\u4f8b\u7684\u9879\u76ee\uff0c\u53ef\u4ee5\u4f7f\u7528\u4ea7\u54c1\u5e93\u7528\u4f8b ID\uff1b \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1aFUNC\uff08\u529f\u80fd\uff09\u3001API\uff08\u63a5\u53e3\uff09\u3001BASELINE\uff08\u57fa\u7ebf\uff09\u3001PERF\uff08\u6027\u80fd\uff09\u3001STR\uff08\u538b\u529b\uff09\u3001SEC\uff08\u5b89\u5168\uff09\u3001CTS\uff08\u517c\u5bb9\u6027\uff09 \u4e0a\u7ebf\u5bf9\u8c61\uff1aCICD\uff0c\u8868\u793a\u4e0a\u7ebf\u5230 CICD \u6d41\u6c34\u7ebf\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u53ef\u4e00\u952e\u751f\u6210 case_list.csv \u6587\u4ef6\uff0c\u7528\u4e8e\u5bfc\u5165\u5230\u660e\u9053\u4e91 AT \u7528\u4f8b\u5217\u8868\u4e2d\u63a7\u5236 CICD \u8dd1\u6d4b\u8303\u56f4\uff1b \u6d4b\u8bd5\u7ea7\u522b\uff1aC1 / C2 / C3 / C4\uff0c\u5177\u4f53\u5b9a\u4e49\u53c2\u8003\u6d41\u6c34\u7ebf\u4f7f\u7528\u6307\u5bfc\uff1b \u8df3\u8fc7\u539f\u56e0\uff1askip-XXX\uff0c\u7528\u4e8e\u63a7\u5236\u7528\u4f8b\u662f\u5426\u6267\u884c\uff1b \u786e\u8ba4\u4fee\u590d\uff1afixed-XXX\uff0c\u7528\u4e8e\u6807\u8bb0\u7528\u4f8b\u7684\u4fee\u590d\u72b6\u6001\uff08\u540e\u9762\u8be6\u7ec6\u8bb2\u89e3\u7528\u6cd5\uff09\uff1b \u5e9f\u5f03\u7528\u4f8b\uff1aremoved-\u5df2\u5e9f\u5f03\uff0c\u7528\u4e8e\u6807\u8bb0\u5df2\u7ecf\u5e9f\u5f03\u7684\u7528\u4f8b\uff0c\u6b64\u7528\u4f8b\u6807\u7b7e\u4e0d\u4f1a\u88ab\u6dfb\u52a0\uff0c\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff1b \u793a\u4f8b\uff1a \u811a\u672cID PMS\u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u4e0a\u7ebf\u5bf9\u8c61 \u6d4b\u8bd5\u7ea7\u522b \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b ... 001 679537 L1 FUNC CICD C1 skip-XXX fixed-XXX removed-\u5df2\u5e9f\u5f03 ..."},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_4","title":"2\u3001\u64cd\u4f5c\u6b65\u9aa4","text":"2.1\u3001\u5728\u5b50\u9879\u76ee\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u4ee5\u7528\u4f8b\u7684 py \u6587\u4ef6\u9664\u53bb\u9996\u5b57\u7b26\u4e32 \"test_\" \u548c\u7528\u4f8b\u5e8f\u53f7\u540e\u7684\u5b57\u7b26\u4e32\u4f5c\u4e3a csv \u7684\u6587\u4ef6\u540d\u3002 \u4f8b\u5982: \u76f8\u518c\u7684\u7528\u4f8b\u6587\u4ef6\u4e3a test_album_xxx.py\uff0cxxx \u8868\u793a\u4efb\u610f\u4e09\u4f4d\u6570\u5b57\u4ee3\u8868\u7528\u4f8b\u5e8f\u53f7\uff0c\u6b64\u65f6 csv \u6587\u4ef6\u540d\u5c31\u5e94\u4e3a album.csv\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u6240\u6709 csv \u6587\u4ef6\u5efa\u8bae\u653e\u5728\u4e00\u4e2a tags \u76ee\u5f55\u4e0b\u3002 \u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 2.2\u3001\u7b2c\u4e00\u5217\u4e3a\u811a\u672c ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b\u7528\u4f8b\u6807\u7b7e\u53ef\u4ee5\u65e0\u5e8f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_2","title":"3\u3001\u589e\u52a0\u8bf4\u660e","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_1","title":"3.1\u3001\u8df3\u8fc7\u7528\u4f8b","text":"\u4f20\u7edf\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668(@pytest.mark.skip)\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a; \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#311","title":"3.1.1\u3001\u56fa\u5b9a\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u7b7e\u5f00\u5934\u4e3a \u201cskip-XXX\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\uff0c\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\u5219\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u7b7e\u4e3a SKIPED\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#312","title":"3.1.2\u3001\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skipif_platform-aarch64&mips64 \u67d0\u4e9b\u7528\u4f8b\u4f1a\u56e0\u4e3a\u4e0d\u540c\u7684\u73af\u5883\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\uff0c\u5e38\u89c1\u7684\u573a\u666f\u4e3a\u5728\u4e0d\u540c\u67b6\u6784\u4e0a\u5224\u65ad\u662f\u5426\u6267\u884c\uff0c\u8df3\u8fc7\u7684\u539f\u56e0\u6807\u7b7e\u4e3a \u201cskipif_platform-\u201d \u52a0\u67b6\u6784\u540d\uff0c\u591a\u4e2a\u67b6\u6784\u4e4b\u95f4\u4f7f\u7528 \u201c&\u201d \u62fc\u63a5\uff1b \u4ee5\u4e0a\u4f8b\u5b50\u4e3a\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u5224\u65ad\u5f53\u524d\u67b6\u6784\u662f\u5426\u4e3a arrch64 \u6216\u8005 mips64\uff0c\u82e5\u662f\uff0c\u5219\u8df3\u8fc7\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u82e5\u5426\u5219\u6267\u884c\u7528\u4f8b\uff1b \u76ee\u524d\u6846\u67b6\u9ed8\u8ba4\u4ec5\u652f\u6301\u67b6\u6784\u7684\u6761\u4ef6\u5224\u65ad\uff0c\u4f46\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u903b\u8f91\u652f\u6301\u81ea\u5b9a\u4e49\u6dfb\u52a0\u3002 \u5728\u9879\u76ee\u76ee\u5f55\u8def\u5f84\u4e0b\u5b58\u5728\u6587\u4ef6 setting/skipif.py\uff0c\u6240\u6709\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u7684\u51fd\u6570\u5199\u5728\u6b64\u6587\u4ef6\u4e2d\u3002 \u9ed8\u8ba4\u67b6\u6784\u5224\u65ad\u4f8b\u5b50\uff1a def skipif_platform(args: str):\n\"\"\"\u5e73\u53f0\u8df3\u8fc7\"\"\"\n_skip_key = args.split(\"&\")\nfor key in _skip_key:\nif GlobalConfig.SYS_ARCH == key:\nreturn True\nreturn False\n \u65b9\u6cd5\u7f16\u5199\u89c4\u8303\uff1a \u65b9\u6cd5\u540d\u5fc5\u987b\u4ee5 skipif \u5f00\u5934\uff1b \u65b9\u6cd5\u5fc5\u987b\u6709\u8fd4\u56de\u7ed3\u679c\u5e76\u4e14\u4e3a\u5e03\u5c14\u503c\uff08True \u4ee3\u8868\u8df3\u8fc7\uff0cFalse \u4ee3\u8868\u4e0d\u8df3\u8fc7\uff09\uff1b \u65b9\u6cd5\u53ea\u80fd\u6709\u4e00\u4e2a\u5165\u53c2\uff1b \u5728 csv \u6587\u4ef6\u8df3\u8fc7\u539f\u56e0\u4e00\u680f\u4e2d\u586b\u5199\u4e3a \u201c{\u51fd\u6570\u540d}-{\u53c2\u6570}\u201d\uff0c\u4f8b\u5982\uff1askipif_platform-aarch64\uff1b\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u4f1a\u4ee5\u7b2c\u4e00\u4e2a \u201c-\u201d \u8fdb\u884c\u5206\u5272\uff0c\u622a\u53d6\u7684\u5de6\u4fa7\u5b57\u7b26\u4e32\u4f5c\u4e3a\u51fd\u6570\u540d\uff0c\u5728 skipif.py \u6587\u4ef6\u4e2d\u67e5\u627e\u662f\u5426\u6709\u540c\u540d\u51fd\u6570\uff0c\u5e76\u5c06\u622a\u53d6\u7684\u53f3\u4fa7\u4f5c\u4e3a\u53c2\u6570\u4f20\u9012\u7ed9\u8be5\u51fd\u6570\uff0c\u901a\u8fc7\u83b7\u53d6\u8be5\u51fd\u6570\u8fd4\u56de\u7684\u5e03\u5c14\u503c\uff0c\u8fd4\u56de True\uff0c\u5219\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u8fd4\u56de False\uff0c\u5219\u6267\u884c\u8be5\u7528\u4f8b\u3002 \u82e5\u51fd\u6570\u9700\u8981\u591a\u4e2a\u53c2\u6570\uff0c\u53ef\u81ea\u5b9a\u4e49\u591a\u4e2a\u53c2\u6570\u4e4b\u95f4\u7684\u8fde\u63a5\u7b26\uff0c\u8fde\u63a5\u7b26\u53f7\u4e0d\u53ef\u4f7f\u7528\u4e0b\u5212\u7ebf\u548c\u9017\u53f7\uff0c\u63a8\u8350\u7edf\u4e00\u4f7f\u7528 & \u7b26\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32","title":"3.2\u3001\u786e\u8ba4\u4fee\u590d","text":"\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7528\u4f8b\u4fee\u590d\u540e\uff0c\u4f46\u4e0d\u80fd\u7acb\u5373\u5220\u9664\u8df3\u8fc7\u539f\u56e0\uff08skip-XXX\uff09\u7684\u7528\u4f8b\uff0c\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u786e\u8ba4\u4fee\u590d\u201d\uff0c\u4f5c\u4e3a\u6807\u8bb0\u8be5\u7528\u4f8b\u662f\u5426\u5df2\u7ecf\u4fee\u590d\uff0c\u56fa\u5b9a\u586b\u5165\u5b57\u6bb5\u4e3a \u201cfixed-\u5df2\u4fee\u590d\u201d\u3002\u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u5373\u4f7f\u540c\u65f6\u6807\u8bb0\u4e86 skip-XXX \u4e5f\u4f1a\u6b63\u5e38\u6267\u884c\u3002 \u793a\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d \u3010\u540c\u65f6\u6807\u8bb0\u4e86skip \u548c fixed\uff0c\u4f46\u4ecd\u7136\u60f3\u8981\u8df3\u8fc7\u7528\u4f8b\u3011 \u5f53 \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u540c\u65f6\u586b\u5165\u540e\uff0c\u547d\u4ee4\u884c\u4f20\u9012\u53c2\u6570 --ifixed yes\uff0c\u5219\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\u8be5\u6761\u7528\u4f8b\u3002 python3 manage.py run --ifixed yes\n \u770b\u5230\u8fd9\u91cc\u6709\u4e9b\u540c\u5b66\u53ef\u80fd\u8981\u95ee\u4e86\uff0c\u6211\u60f3\u6062\u590d\u8df3\u8fc7\u6267\u884c\uff0c\u76f4\u63a5\u628a skip-XXX \u8fd9\u4e00\u5217\u6807\u7b7e\u5220\u6389\u4e0d\u5c31\u597d\u4e86\uff0c\u8fd8\u641e\u4ec0\u4e48\u786e\u8ba4\u4fee\u590d\u5e72\u5565\uff1f \u8fd9\u91cc\u7ed9\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u89e3\u91ca\u4e00\u4e0b\uff1a \uff08\u4ee5\u4e0b\u6d41\u6c34\u7ebf\u6307\u7684\u662f\u6bcf\u65e5\u6784\u5efa\u7684\u6d41\u6c34\u7ebf\uff0c\u8dd1 AT \u7684\u5168\u91cf\u7528\u4f8b\uff09 \u9996\u5148\uff0c\u6d41\u6c34\u7ebf\u4e0a\u8dd1\u7684\u662f AT \u5386\u53f2 Tag\uff0c\u8df3\u8fc7\u7528\u4f8b\u7684\u6807\u7b7e(skip-XXX) \u662f\u5728\u6700\u65b0\u7684\u4ee3\u7801\u4e0a\u63d0\u4ea4\u7684\uff0c\u6211\u4eec\u91c7\u7528\u6700\u65b0\u7684 csv \u6587\u4ef6\u8986\u76d6\u5386\u53f2 csv \u6587\u4ef6\u7684\u8bbe\u8ba1\u6765\u5b9e\u73b0\u4e86\u5bf9\u5386\u53f2 Tag \u4e0a\u7528\u4f8b\u7684\u8df3\u8fc7\uff1b \u7136\u540e\uff0c\u5728\u65e5\u5e38\u8df3\u8fc7\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u540c\u65f6\u4e5f\u5728\u4fee\u590d\u4e00\u4e9b\u7528\u4f8b\uff0c\u4fee\u590d\u540e\u7684\u8fd9\u4e9b\u7528\u4f8b\u5728\u672c\u5730\u8c03\u8bd5\u7684\u65f6\u5019\u6211\u4eec\u4e0d\u5e0c\u671b\u7ee7\u7eed\u8df3\u8fc7\uff0c\u4f46\u662f\u6b64\u65f6\uff0c\u4fee\u590d\u7684\u8fd9\u4e9b\u7528\u4f8b\u53ef\u80fd\u8fd8\u4e0d\u7a33\u5b9a\uff0c\u4e0d\u9002\u5408\u9a6c\u4e0a\u653e\u5230\u6d41\u6c34\u7ebf\u53bb\u8dd1\uff0c\u4e5f\u5c31\u662f\u8bf4\u6d41\u6c34\u7ebf\u4e0a\u6211\u4eec\u662f\u5e0c\u671b\u4ed6\u7ee7\u7eed\u8df3\u8fc7\u7684\uff0c\u56e0\u6b64\uff0c\u54b1\u4e0d\u80fd\u76f4\u63a5\u628a skip-XXX \u5e72\u6389\uff1b \u8fd9\u91cc\u5c31\u77db\u76fe\u4e86\uff0c\u4e00\u4e2a\u9700\u6c42\u662f\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u53e6\u4e00\u4e2a\u9700\u6c42\u53c8\u4e0d\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u600e\u4e48\u529e\u5462\uff1f \u6211\u4eec\u4f7f\u7528\u201c\u786e\u8ba4\u4fee\u590d\u201d\u6765\u6807\u8bb0\u8fd9\u6761\u7528\u4f8b\u5df2\u7ecf\u4fee\u590d\u4e86\uff0c\u8fd9\u6837\u4f60\u672c\u5730\u8c03\u8bd5\u7528\u4f8b\u7684\u65f6\u5019\u8fd9\u6761\u5df2\u4fee\u590d\u7684\u7528\u4f8b\u662f\u4f1a\u6267\u884c\u7684\uff0c\u540c\u65f6\u5728\u6d41\u6c34\u7ebf\u4e0a\u5c06 --ifixed yes \u53c2\u6570\u52a0\u4e0a\uff0c\u90a3\u4e48\u6d41\u6c34\u7ebf\u4e0a\u6267\u884c\u65f6\u8fd9\u6761\u7528\u4f8b\u4ecd\u7136\u662f\u8df3\u8fc7\u7684\u72b6\u6001\uff0c\u540e\u7eed\u4f60\u6253 Tag \u7684\u65f6\u5019\uff0c\u628a \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u7684\u6807\u7b7e\u5168\u90e8\u5220\u6389\u5c31\u53ef\u4ee5\u4e86\u3002 \u8fd9\u5c31\u662f\u201c\u786e\u8ba4\u4fee\u590d\u201d\u8fd9\u4e2a\u6807\u7b7e\u7684\u80cc\u666f\uff0c\u9700\u8981\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u54c1\u4e00\u54c1\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#33","title":"3.3\u3001\u5e9f\u5f03\u7528\u4f8b","text":"\u9488\u5bf9\u67d0\u4e9b\u7528\u4f8b\uff0c\u7531\u4e8e\u9700\u6c42\u53d8\u66f4\uff0c\u73af\u5883\u5f71\u54cd\u6216\u8bc4\u4f30\u4e0d\u518d\u9002\u7528\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u65f6\uff0c\u7528\u4f8b\u9700\u8981\u5e9f\u5f03\uff0c\u5219\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u5e9f\u5f03\u7528\u4f8b\u201d\uff0c\u8be5\u5217\u5b58\u5728 \u201cremoved-{\u5e9f\u5f03\u539f\u56e0}\u201d\uff0c\u5219\u7528\u4f8b\u4e0d\u4f1a\u6267\u884c\u3002 \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d removed-\u5df2\u5e9f\u5f03 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_2","title":"4\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u4e0a\u9762\u4ecb\u7ecd Pytest \u6846\u67b6\u63d0\u4f9b\u7684\u6807\u7b7e\u529f\u80fd mark\uff0c\u4f7f\u7528\u65f6\u9700\u8981\u4e3a\u6bcf\u4e00\u4e2a\u7528\u4f8b\u6dfb\u52a0\u6807\u7b7e\u88c5\u9970\u5668\uff0c\u5219\u64cd\u4f5c\u590d\u6742\uff0c\u53ef\u7ef4\u62a4\u6027\u5dee\uff0c\u5176\u6839\u672c\u95ee\u9898\u5c31\u662f\u6807\u7b7e\u5206\u6563\u5728\u6bcf\u4e00\u6761\u7528\u4f8b\u7684\u88c5\u9970\u5668\u4e0a\uff0c\u96be\u4ee5\u96c6\u4e2d\u7ef4\u62a4\uff1b\u4e8e\u662f\u4e4e\u5c06\u6240\u6709\u6807\u7b7e\u4f7f\u7528 csv \u6587\u4ef6\u8fdb\u884c\u96c6\u4e2d\u7ba1\u7406\uff0c\u5e76\u901a\u8fc7 Pytest \u7684\u94a9\u5b50\u51fd\u6570\uff0c\u8bfb\u53d6 csv \u6587\u4ef6\uff0c\u52a8\u6001\u6dfb\u52a0\u6807\u7b7e\u5230\u7528\u4e2d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5csv","title":"5\u3001CSV\u6587\u4ef6\u683c\u5f0f","text":"\u6b64\u914d\u7f6e\u6587\u4ef6\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u6807\u7b7e\u6570\u636e\uff0c\u4e14\u8981\u65b9\u4fbf\u80fd\u4f7f\u7528Excel\u6253\u5f00\u8fdb\u884c\u7f16\u8f91\u67e5\u770b\uff0c\u66f4\u91cd\u8981\u7684\u662f\u6211\u4eec\u4e0d\u60f3\u5f15\u5165\u4e09\u65b9\u4f9d\u8d56\uff0cCSV \u6587\u4ef6\u51e0\u4e4e\u662f\u552f\u4e00\u80fd\u6ee1\u8db3\u6240\u6709\u7684\u8981\u6c42\u7684\u6587\u4ef6\u683c\u5f0f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_6","title":"\u4e03\u3001\u65e5\u5fd7\u7cfb\u7edf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_5","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e YouQu \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u64cd\u4f5c\u65b9\u6cd5\u5c01\u88c5\u5199\u6cd5\uff0c\u901a\u5e38\u662f\u8fd9\u6837\u7684\uff1a\u7c7b\u91cc\u9762\u4e00\u4e2a\u51fd\u6570\u53ea\u5305\u542b\u4e00\u4e2a\u64cd\u4f5c\u6216\u591a\u6b21\u8c03\u7528\u7684\u4e00\u7cfb\u5217\u53ef\u5408\u5e76\u7684\u64cd\u4f5c\uff1b \u4f20\u7edf\u7684\u65e5\u5fd7\u8f93\u51fa\u65b9\u5f0f\uff0c\u9700\u8981\u5728\u6bcf\u4e2a\u51fd\u6570\u91cc\u9762\u4e3b\u52a8\u7f16\u5199\u65e5\u5fd7\u8f93\u51fa\u4ee3\u7801 \uff0c\u4f8b\u5982\uff1a class XXXWidget:\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\nlogger.info(\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\")\n...\n# \u7701\u7565\u4ee3\u7801\u90e8\u5206\n \u4e00\u4e2a\u51fd\u6570\u91cc\u9762\u81f3\u5c11\u5305\u542b\u4e00\u6761\u65e5\u5fd7\u4fe1\u606f\uff0c\u5982\u679c\u6bd4\u8f83\u590d\u6742\u64cd\u4f5c\u6b65\u9aa4\uff0c\u53ef\u80fd\u5305\u542b\u591a\u6761\u65e5\u5fd7\u4fe1\u606f\uff1b \u4e00\u4e2a\u5e94\u7528\u542b\u6709\u5927\u91cf\u7684\u64cd\u4f5c\u51fd\u6570\uff0c\u4e5f\u5c31\u662f\u8bf4\u6211\u4eec\u9700\u8981\u5199\u5927\u91cf\u7684\u65e5\u5fd7\u4ee3\u7801\uff1b \u901a\u8fc7\u7ecf\u9a8c\u89c2\u5bdf\uff0c\u6211\u4eec\u53d1\u73b0\uff0c\u51fd\u6570\u8bf4\u660e\u4ee5\u53ca\u51fd\u6570\u64cd\u4f5c\u65e5\u5fd7\uff0c\u5177\u6709\u8f83\u9ad8\u7684\u91cd\u590d\u5ea6\uff08\u4ece\u4e0a\u9762\u7684\u4f8b\u5b50\u4e5f\u53ef\u4ee5\u770b\u51fa\u6765\uff09\uff0c\u56e0\u6b64\u6211\u4eec\u5927\u80c6\u7684\u8bbe\u60f3\uff0c\u80fd\u4e0d\u80fd\u57fa\u4e8e\u6846\u67b6\u6267\u884c\u65f6\uff0c\u81ea\u52a8\u7684\u5c06\u51fd\u6570\u8bf4\u660e\u4f5c\u4e3a\u65e5\u5fd7\u6253\u5370\u51fa\u6765\uff0c\u4ece\u800c\u51cf\u5c11\u5927\u91cf\u65e5\u5fd7\u4ee3\u7801\u91cf\u548c\u91cd\u590d\u7f16\u5199\uff0c\u90a3\u771f\u662f\u5999\u554a~\u3002 \u57fa\u4e8e\u6b64\u201c\u5929\u771f\u201d\u7684\u60f3\u6cd5\uff0c\u6211\u4eec\u8bbe\u8ba1\u51fa\u4e86 youqu \u7684\u65e5\u5fd7\u7cfb\u7edf\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_5","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u6838\u5fc3\u539f\u7406\uff1a \u901a\u8fc7\u7ed9\u7c7b\u52a0\u4e0a\u4e00\u4e2a\u88c5\u9970\u5668 @log\uff0c\u52a8\u6001\u7ed9\u8be5\u7c7b\u4e0b\u6240\u6709\u7684\u51fd\u6570\u53ca\u7236\u7c7b\u51fd\u6570\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668 @_trace\uff0c\u5728\u6b64\u88c5\u9970\u5668\u4e2d\u6211\u4eec\u80fd\u52a8\u6001\u7684\u6355\u83b7\u6240\u8c03\u7528\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff08func.__doc__\uff09\uff0c\u901a\u8fc7\u65e5\u5fd7\u8f93\u51fa\u5668\u5c06\u5176\u8f93\u51fa\u5373\u53ef\u3002 \u5b9e\u73b0\u6b65\u9aa4\uff1a \u901a\u8fc7 inspect.getmembers \u83b7\u53d6\u88ab\u88c5\u9970\u7684\u7c7b\u4e0b\u6240\u6709\u51fd\u6570\uff0c\u5305\u542b\u9759\u6001\u65b9\u6cd5\uff0c\u7c7b\u65b9\u6cd5\uff0c\u5b9e\u4f8b\u65b9\u6cd5\uff1b \u901a\u8fc7 setattr(\u7c7b, \u65b9\u6cd5, _trace\uff09 \u7684\u65b9\u5f0f\uff0c\u7ed9\u7b26\u5408\u6761\u4ef6\u7684\u51fd\u6570\uff0c\u52a8\u6001\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_3","title":"3\u3001\u65e5\u5fd7\u914d\u7f6e","text":"[log_cli]\n;\u65e5\u5fd7\u76f8\u5173\u914d\u7f6e\uff08\u4e0d\u6253\u5370\u6784\u9020\u51fd\u6570\u548c\u9b54\u6cd5\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff09\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = INFO\n# ============= \u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u914d\u7f6e ================\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u5f00\u5934\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7, \u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_STARTSWITH = Assert\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u7ed3\u5c3e\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_ENDSWITH = Widget\n;\u652f\u6301\u7c7b\u540d\u5305\u542b xxx \u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_CONTAIN = ShortCut\n# ==============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_3","title":"4\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u5728\u5e94\u7528\u5e93 widget \u65b9\u6cd5\u5e93\u91cc\u9762\uff0c\u53ea\u9700\u8981\u5728\u51fa\u53e3\u6587\u4ef6\u52a0\u4e0a\u7c7b\u88c5\u9970\u5668\uff0c\u5c31\u53ef\u4ee5\u5b9e\u73b0\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u4e86\uff1b # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6ce8\u610f\uff0c\u662f\u7c7b\u88c5\u9970\u5668\u3002 \u5b9e\u4f8b\uff1a # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\n@classmethod\ndef find_dfm_image(cls, *elements, multiple=False, rate=0.9):\n\"\"\"\n \u67e5\u627e\u56fe\u7247 {{elements}}.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e {{rate}} \u7684\u5750\u6807\n :param elements:\n :param multiple:\n :return:\n \"\"\"\nelement = tuple(map(lambda x: f\"{Config.PIC_RES_PATH}/{x}\", elements))\nreturn cls.find_image(*element, multiple=multiple)\n \u8c03\u7528\u65b9\u6cd5\u65f6\uff1a DfmWidget.find_dfm_image(\"dfm_001\")\n \u81ea\u52a8\u8f93\u51fa\u7684\u65e5\u5fd7\uff1a >> x86_64-uos-6: 02/28 17:48:47 | INFO | logger_utils: [find_dfm_image]: \u67e5\u627e\u56fe\u7247 dfm_001.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e 0.9 \u7684\u5750\u6807\n \u52a0\u4e0a\u88c5\u9970\u5668 @log \u4e4b\u540e\uff0c\u65b9\u6cd5\u5c42\u6240\u6709\u7684\u51fd\u6570\uff08\u5305\u62ec\u5b9e\u4f8b\u65b9\u6cd5\u3001\u7c7b\u65b9\u6cd5\u3001\u9759\u6001\u65b9\u6cd5\uff09\u90fd\u4e0d\u9700\u8981\u518d\u5199\u65e5\u5fd7\u4ee3\u7801\uff0c\u6267\u884c\u7684\u65f6\u5019\u4f1a\u81ea\u52a8\u8f93\u51fa\uff0c\u5e76\u4e14\u6240\u6709\u8c03\u7528\u7684\u65b9\u6cd5\u4f1a\u4ee5 allure.step \u7684\u65b9\u5f0f\uff0c\u5c55\u793a\u5728 allure \u62a5\u544a\u4e2d\uff0c\u5728\u62a5\u544a\u4e2d\u66f4\u80fd\u4e00\u76ee\u4e86\u7136\u7684\u770b\u5230\u7528\u4f8b\u6267\u884c\u6b65\u9aa4\u3002 \u3010\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\u3011 \u901a\u8fc7\u89c2\u5bdf\u524d\u9762\u7684\u4f8b\u5b50\uff0c\u7ec6\u5fc3\u7684\u540c\u5b66\u53ef\u80fd\u8fd8\u53d1\u73b0\u4e86\u4e00\u4e2a\u5c0f\u7ec6\u8282\uff1a\u51fd\u6570\u529f\u80fd\u8bf4\u660e\u4e2d\uff0c\u4e24\u5bf9\u5927\u62ec\u53f7\u4e2d\u7684\u5185\u5bb9 {{elements}} \u4f5c\u4e3a\u53d8\u91cf\u8f93\u51fa\u51fa\u6765\u4e86\uff1b \u6ca1\u9519\uff0c\u8fd9\u5c31\u662f\u6211\u4eec\u53c2\u8003Django \u548c jinja2 \u7684\u6a21\u677f\u8bed\u6cd5\u8bbe\u8ba1\u51fa\u7684\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\uff0c\u4f7f\u7528\u65b9\u6cd5\u5f88\u7b80\u5355\uff0c\u7528\u4e24\u5bf9\u5927\u62ec\u53f7\u628a\u51fd\u6570\u7684\u53c2\u6570\u62ec\u8d77\u6765\uff0c\u8fd9\u6837\u5728\u65e5\u5fd7\u8f93\u51fa\u7684\u65f6\u5019\u5c31\u80fd\u628a\u8c03\u7528\u51fd\u6570\u65f6\u53c2\u6570\u7684\u503c\u8f93\u51fa\u51fa\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_7","title":"\u516b\u3001\u73af\u5883\u90e8\u7f72","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_6","title":"1\u3001\u539f\u5219","text":"YouQu \u7684\u73af\u5883\u4f9d\u8d56\u4e00\u76f4\u575a\u6301 2 \u4e2a\u539f\u5219\uff1a \u6700\u5c0f\u73af\u5883\u4f9d\u8d56\u539f\u5219 \u6709\u4e9b\u540c\u5b66\u5199\u4e00\u4e9b\u529f\u80fd\uff0c\u9996\u5148\u60f3\u5230\u7684\u5c31\u662f\u53bb\u641c\u7d22\u5f15\u64ce\u641c\u4e00\u4e0b\uff0c\u770b\u6709\u6ca1\u6709\u73b0\u6210\u7684\u5de5\u5177\u6216\u8005\u4ee3\u7801\u76f4\u63a5\u80fd\u7528\uff0c\u7f8e\u5176\u540d\u66f0\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\uff0c\u522b\u4eba\u5df2\u7ecf\u9020\u597d\u4e86\u8f6e\u5b50\u54b1\u4eec\u5c31\u4e0d\u8981\u91cd\u590d\u53bb\u9020\u4e86\uff0c\u7136\u540e\u4e00\u5207\u4f3c\u4e4e\u90fd\u53d8\u5f97\u90a3\u4e48\u7684\u7406\u6240\u5e94\u5f53\u3002 \u5f53\u7136\u8fd9\u6837\u505a\u65e0\u53ef\u539a\u975e\uff0c\u6211\u76f8\u4fe1\u6709\u8fd9\u6837\u60f3\u6cd5\u5e76\u4e14\u4e00\u76f4\u8df5\u884c\u8fd9\u6837\u505a\u6cd5\u7684\u540c\u5b66\u4e0d\u5728\u5c11\u6570\uff0c\u4f46\u8fd9\u6837\u505a\u6709\u4e00\u4e2a\u5f88\u4e25\u91cd\u7684\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f60\u5199\u4e00\u4e2a\u5927\u578b\u9879\u76ee\u65f6\uff0c\u4f60\u4f1a\u5f15\u5165\u975e\u5e38\u975e\u5e38\u975e\u5e38\u591a\u7684\u4f9d\u8d56\uff0c\u6bd4\u5982\u8981\u505a\u4e2a\u63a5\u53e3\u8bf7\u6c42\u8981\u7528 requests\u3001\u8bfb\u5199\u4e2a\u6570\u636e\u7528 pandas\u3001\u5199\u4e2a\u8868\u683c\u7528 pyopenxl\u3001\u89e3\u6790\u4e2a\u6587\u672c\u8981\u7528\u8fd9\u4e2a\u90a3\u4e2a\u4e09\u65b9\u5e93 ... \u3002 \u6211\u8ba4\u4e3a\u8fd9\u662f\u975e\u5e38\u4e0d\u597d\u7684\u4e60\u60ef\uff0c\u5728\u5b9e\u73b0\u4e00\u4e2a\u529f\u80fd\u7684\u65f6\u5019\uff0c\u9996\u5148\u6211\u4eec\u5e94\u8be5\u53bb\u60f3\u81ea\u5df1\u600e\u4e48\u6837\u53bb\u5b9e\u73b0\uff0c\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff1b \u5982\u679c\u4f60\u4e0d\u4f1a\uff0c\u4f60\u53ef\u4ee5\u53bb\u5b66\u4e60\u4e09\u65b9\u5e93\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u522b\u4eba\u4e09\u65b9\u5e93\u4e5f\u662f\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\u7684\uff0c\u4e3a\u4ec0\u4e48\u54b1\u4eec\u4e0d\u884c\u5462\uff1b\u5982\u679c\u522b\u4eba\u7684\u4f60\u5b9e\u5728\u662f\u770b\u4e0d\u61c2\uff0c\u60f3\u5c3d\u4e00\u5207\u529e\u6cd5\u786e\u5b9e\u505a\u4e0d\u51fa\u6765\uff0c\u90a3\u518d\u8003\u8651\u5f15\u5165\u8fd9\u4e2a\u4e09\u65b9\u5e93\uff0c\u6211\u8ba4\u4e3a\u8fd9\u6837\u662f\u6ca1\u95ee\u9898\u7684\uff0c\u6bd5\u7adf\u54b1\u4eec\u6bb5\u4f4d\u8fd8\u4e0d\u591f\uff0c\u4f46\u5e0c\u671b\u5c06\u6765\u6709\u4e00\u5929\u6211\u4eec\u53ef\u4ee5\u3002 \u8fd9\u6837\u7684\u505a\u6cd5\u624d\u5e94\u8be5\u662f\u201c\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\u201d\u6b63\u786e\u7684\u64cd\u4f5c\u3002\u4e0d\u4f1a\u6ca1\u5173\u7cfb\uff0c\u770b\u770b\u522b\u4eba\u662f\u600e\u4e48\u5b9e\u73b0\u7684\uff0c\u81ea\u5df1\u518d\u6478\u7d22\u7740\u5199\u51fa\u6765\uff0c\u8fd9\u6837\u81ea\u5df1\u624d\u80fd\u6709\u6240\u63d0\u9ad8\uff0c\u4e0d\u7136\u4f60\u5c31\u53ea\u4f1a\u7528\u522b\u4eba\u7684\u4e1c\u897f\uff1b\u90a3\u4e9b\u5632\u7b11\u3001\u6279\u8bc4\u6211\u4eec\u91cd\u590d\u9020\u8f6e\u5b50\u7684\u4eba\uff0c\u5148\u60f3\u60f3\u81ea\u5df1\u4f1a\u9020\u8f6e\u5b50\u5417\u3002 \u672c\u7740\u81ea\u5df1\u5b9e\u73b0\u80fd\u5b9e\u73b0\u7684\u4e00\u5207\u7684\u539f\u5219\uff0cYouQu \u6846\u67b6\u505a\u5230\u4e86\u975e\u5e38\u5c11\u7684\u73af\u5883\u4f9d\u8d56\uff0c\u800c\u4e14\u6211\u4eec\u4ecd\u5728\u4e0d\u65ad\u52aa\u529b\uff0c\u51cf\u5c11\u73af\u5883\u90e8\u7f72\u7684\u4f9d\u8d56\u3002 \u6700\u5c0f\u4ed3\u5e93\u4f53\u79ef\u539f\u5219 \u5927\u6587\u4ef6\u4e0d\u80fd\u4e0a\u4f20\u5230\u5de5\u7a0b\u91cc\u9762\uff0c\u4fdd\u6301\u6574\u4e2a\u5de5\u7a0b\u7684\u8f7b\u91cf\u5316\uff0c\u8fd9\u6837\u5728\u514b\u9686\u4ee3\u7801\u7684\u65f6\u5019\u624d\u80fd\u975e\u5e38\u5feb\u901f\u65b9\u4fbf\u4f7f\u7528\uff0c\u6211\u4eec\u89c1\u8fc7\u4e00\u4e2a AT \u5de5\u7a0b clone \u5927\u5c0f\u8fbe\u5230\u597d\u51e0\u4e2a G\uff0c\u7b80\u76f4\u4e0d\u53ef\u601d\u8bae\u3002 \u5176\u5b9e\u4ee3\u7801\u6587\u4ef6\u7684\u5927\u5c0f\u662f\u5f88\u5c0f\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u7eaf\u5199\u4ee3\u7801\u968f\u4fbf\u5199\u5de5\u7a0b\u4e5f\u4e0d\u4f1a\u592a\u5927\uff0c\u800c\u6587\u6863\uff08\u5305\u542b\u63d2\u56fe\uff09\u7b49\u8d44\u6e90\u5374\u662f\u5f88\u5360\u7a7a\u95f4\u3002 \u56e0\u6b64\u6211\u4eec\u9009\u62e9\u5c06 YouQu \u7684\u6587\u6863\u5de5\u7a0b\u5355\u72ec\u8fc1\u51fa\u5230\u72ec\u7acb\u7684\u4ed3\u5e93 youqu-docs \u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_6","title":"2\u3001\u5b89\u88c5","text":"\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u8fd0\u884c env.sh \u5373\u53ef\u3002 bash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_4","title":"3\u3001\u5b9a\u5236\u4f9d\u8d56","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_2","title":"3.1\u3001\u65b0\u589e\u4f9d\u8d56","text":"\u5982\u679c\u5e94\u7528\u5e93\u8fd8\u9700\u8981\u5176\u4ed6 Python \u4f9d\u8d56\u5e93\uff0c\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a requirement.txt \u6587\u4ef6\uff1b autotest_xxx\n\u251c\u2500\u2500 requirement.txt\n\u251c\u2500\u2500 case ...\n \u91cc\u9762\u5199\u5165\u9700\u8981\u5b89\u88c5\u7684\u4e09\u65b9\u4f9d\u8d56\uff0c\u6bd4\u5982\u50cf\u8fd9\u6837\uff1a # requirement.txt\nPyYAML==6.0 # \u6307\u5b9a\u5b89\u88c5\u67d0\u4e2a\u7248\u672c\nrequests # \u672a\u6307\u5b9a\u7248\u672c\u5219\u5b89\u88c5\u6700\u65b0\u7248\n \u5728\u6267\u884c bash env.sh \u65f6\u4f1a\u4e00\u5e76\u5c06\u5176\u5b89\u88c5\u3002 \u5982\u679c\u591a\u4e2a\u5e94\u7528\u5e93\u90fd\u5b58\u5728 requirement.txt \u6587\u4ef6\uff0c\u6267\u884c env.sh \u65f6\u4f1a\u5c06\u591a\u4e2a requirement.txt \u6587\u4ef6\u4e00\u5e76\u52a0\u8f7d\uff1b\u90a3\u4e48\u4e00\u5b9a\u8981\u6ce8\u610f\u591a\u4e2a requirement.txt \u6587\u4ef6\u53ef\u80fd\u5b58\u5728\u76f8\u540c\u7684\u4f9d\u8d56\u88ab\u6307\u5b9a\u5b89\u88c5\u4e0d\u540c\u7248\u672c\u7b49\u7b49\u517c\u5bb9\u6027\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32_1","title":"3.2\u3001\u88c1\u526a\u4f9d\u8d56","text":"\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0c\u53ef\u80fd\u4f60\u53ea\u9700\u8981\u5b89\u88c5\u4e00\u4e9b\u6700\u6700\u57fa\u7840\u7684\u4f9d\u8d56\uff0c\u5176\u4ed6\u7684\u90fd\u4e0d\u9700\u8981\uff0c\u6bd4\u5982\u7eaf\u63a5\u53e3\u81ea\u52a8\u5316\u7684\u9879\u76ee\uff0c\u5b83\u4e0d\u9700\u8981 UI \u81ea\u52a8\u5316\u76f8\u5173\u7684\u4f9d\u8d56\u3002 \u4f60\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\uff0c\u5b58\u653e\u4e00\u4e2a BASICENV \u7684\u666e\u901a\u6587\u4ef6\uff0c\u91cc\u9762\u4e0d\u9700\u8981\u5199\u4efb\u4f55\u5185\u5bb9\uff0c\u8fd9\u6837\u6267\u884c env.sh \u65f6\uff0c\u53ea\u4f1a\u5b89\u88c5\u6700\u57fa\u7840\u7684\u4f9d\u8d56\u3002 autotest_xxx\n\u251c\u2500\u2500 BASICENV # \u53ef\u4ee5\u4f7f\u7528\uff1atouch BASICENV \u521b\u5efa\u6587\u4ef6\n\u251c\u2500\u2500 case ...\n \u57fa\u7840\u4f9d\u8d56\u4ec5\u5b89\u88c5\u4ee5\u4e0b\u51e0\u4e2a\u5305\uff1a pytest # pytest\npytest-rerunfailures # \u5931\u8d25\u91cd\u8dd1\u63d2\u4ef6\npytest-timeout # \u7528\u4f8b\u8d85\u65f6\u63d2\u4ef6\nallure-pytest # \u751f\u6210 allure \u62a5\u544a\u63d2\u4ef6\nallure.deb # allure \u62a5\u544a\u67e5\u770b\u5de5\u5177\n \u88c1\u526a\u4f9d\u8d56 \u548c \u65b0\u589e\u4f9d\u8d56 \u662f\u4e0d\u51b2\u7a81\u7684\uff0c\u53ef\u4ee5\u540c\u65f6\u4f7f\u7528\u3002 \u6b64\u65b9\u6848\u9ed8\u8ba4\u4e3a\u865a\u62df\u73af\u5883\u90e8\u7f72\uff0c\u5982\u679c\u4f60\u60f3\u76f4\u63a5\u90e8\u7f72\u5728\u672c\u673a\u4e0a\uff1a bash env_dev.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_8","title":"\u4e5d\u3001\u5931\u8d25\u5f55\u5c4f","text":"\u5f55\u5c4f\u5176\u5b9e\u662f\u4e00\u79cd\u89c6\u9891\u5f62\u5f0f\u7684\u65e5\u5fd7\uff0c\u56e0\u4e3a\u5f88\u591a\u65f6\u5019\u6211\u4eec\u5728\u67e5\u770b\u65e5\u5fd7\u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u51c6\u786e\u7684\u5b9a\u4f4d\u5230\u7528\u4f8b\u5931\u8d25\u7684\u5177\u4f53\u539f\u56e0\uff0c\u56e0\u6b64\u7528\u4f8b\u7684\u5f55\u5c4f\u80fd\u8ba9\u6211\u4eec\u770b\u5230\u7528\u4f8b\u5728\u6267\u884c\u8fc7\u7a0b\uff1b \u3010\u4f7f\u7528\u65b9\u6cd5\u3011 \u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u5173\u6ce8 2 \u4e2a\u53c2\u6570\uff1b ;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\u3002\n;\u6ce8\u610f\uff0c\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u4e0d\u80fd\u5c0f\u4e8e\u5931\u8d25\u5f55\u5c4f\u6b21\u6570\uff0c\u5373 RERUN >= RECORD_FAILED_CASE\nRECORD_FAILED_CASE = 1\n \u9ed8\u8ba4\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u662f 1 \u6b21\uff1b RECORD_FAILED_CASE = 1 \u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff1b RECORD_FAILED_CASE = 0 \u8868\u793a\u4e0d\u7ba1\u7528\u4f8b\u6210\u529f\u6216\u5931\u8d25\u90fd\u5f55\u5c4f\uff1b \u5f55\u5c4f\u662f\u8981\u5360\u7528\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u7279\u522b\u662f\u5728\u4e00\u4e9b\u914d\u7f6e\u8f83\u4f4e\u7684\u673a\u5668\u4e0a\u4f1a\u5f88\u660e\u663e\uff0c\u6240\u4ee5\u4f60\u9700\u8981\u8003\u8651\u662f\u5426\u6709\u5fc5\u8981\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1b \u4f7f\u7528 manage.py \u6267\u884c\u7528\u4f8b\u9ed8\u8ba4\u8bfb\u53d6\u5230 globalconfig.ini \u91cc\u9762\u7684\u53c2\u6570\uff0c\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report/record \u76ee\u5f55\u4e0b\u4fdd\u5b58\u5931\u8d25\u7528\u4f8b\u7684\u5f55\u5c4f\u548c\u65ad\u8a00\u7684\u90a3\u4e2a\u65f6\u95f4\u70b9\u7684\u622a\u5c4f\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7\u89c6\u9891\u6587\u4ef6\u770b\u5230\u5931\u8d25\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u90fd\u53d1\u751f\u4e86\u4ec0\u4e48\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#wayland","title":"\u5341\u3001Wayland \u9002\u914d","text":"Wayland \u4e0b\u81ea\u52a8\u5316\u4e3b\u8981\u95ee\u9898\u662f X11 \u4e0b\u7684\u952e\u9f20\u64cd\u4f5c\u65b9\u6cd5\u65e0\u6cd5\u4f7f\u7528\uff0c\u6bd4\u5982 Xdotool\u3001 PyAutoGUI\u3001Xwininfo \u7b49\u7b49\uff1b YouQu \u5728 Wayland \u4e0b\u517c\u5bb9\u9002\u914d\uff0cenv.sh \u5728 Wayland \u4e0b\u6267\u884c\u65f6\u4f1a\u5b89\u88c5\u81ea\u7814\u7684\u952e\u9f20\u64cd\u4f5c\u670d\u52a1\uff08\u53ef\u80fd\u5b58\u5728\u4e00\u4e9b\u4f9d\u8d56\u62a5\u9519\uff0c\u6309\u7167\u6ce8\u91ca\u89e3\u51b3\u5373\u53ef\uff09\uff0c\u6846\u67b6\u6838\u5fc3\u5e93\u4e5f\u9488\u5bf9\u6027\u7684\u505a\u4e86\u9002\u914d\uff0c\u4e0a\u5c42\u7528\u4f8b\u5b8c\u5168\u4e0d\u7528\u5173\u5fc3\u673a\u5668\u662fWayland \u8fd8\u662f X11\uff0c\u6846\u67b6\u4f1a\u6839\u636e\u6267\u884c\u65f6\u72b6\u6001\u81ea\u52a8\u5224\u65ad\u8d70\u4e0d\u540c\u7684\u903b\u8f91\uff1b \u7b80\u5355\u8bb2\u5c31\u662f\uff0c\u5e94\u7528\u5e93\u53ea\u9700\u8981\u7ef4\u62a4\u4e00\u5957\u7528\u4f8b\u811a\u672c\u5373\u53ef\u3002 \u3010\u7528\u4f8b\u517c\u5bb9\u3011 \u56e0\u4e3a Wayland \u4e0b\u6709\u4e9b\u5e94\u7528\u7684\u754c\u9762\u663e\u793a\u548c\u529f\u80fd\u672c\u8eab\u5b58\u5728\u4e00\u4e9b\u5dee\u5f02\uff0c\u7528\u4f8b\u5c42\u53ef\u80fd\u9700\u8981\u5bf9\u8fd9\u90e8\u5206\u7528\u4f8b\u505a\u903b\u8f91\u5224\u65ad\uff0c\u4f7f\u7528\u5168\u5c40\u914d\u7f6e\u91cc\u9762\u7684\u5e38\u91cf\u8fdb\u884c\u903b\u8f91\u7f16\u5199\u5373\u53ef\uff1a from setting.globalconfig import GlobalConfig\n# GlobalConfig.IS_WAYLAND \u83b7\u53d6\u5230\u5f53\u524d\u7684\u663e\u793a\u670d\u52a1\u5668\uff08bool\uff09\n# \u5e94\u7528\u5e93 Config \u7ee7\u627f GlobalConfig\nif Config.IS_WAYLAND:\npass\nif Config.IS_X11:\npass\n \u6bd4\u5982\u7528\u4f8b\u91cc\u9762\u5982\u679c\u65ad\u8a00\u7684\u56fe\u7247\u4e0d\u540c\uff1a if Config.IS_WAYLAND:\nself.assert_image_exist(\"wayland_XXX\")\nelse:\nself.assert_image_exist(\"x11_XXX\")\n \u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u811a\u672c\u5728 Wayland \u548c X11 \u4e0b\u90fd\u53ef\u4ee5\u8dd1\uff0cso easy \u662f\u4e0d\u662f\uff1f\u5b8c\u5168\u6ca1\u5fc5\u8981\u4e13\u95e8\u62c9\u65b0\u5206\u652f\u8fdb\u884c Wayland \u9002\u914d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_9","title":"\u5341\u4e00\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_7","title":"1. \u76ee\u5f55\u7ed3\u6784","text":"\u6267\u884c\u65f6\u4f1a\u5728\u6839\u76ee\u5f55\u4e0b\u52a8\u6001\u751f\u6210 report \u76ee\u5f55\uff0c\u6240\u6709\u7684\u62a5\u544a\u76f8\u5173\u7684\u6587\u4ef6\u4f1a\u7edf\u4e00\u5b58\u653e\u5728\u91cc\u9762\uff0c\u793a\u4f8b\uff1a /report\n \u251c\u2500\u2500 allure # allure\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json\n \u251c\u2500\u2500 allure_html # \u751f\u6210\u7684html\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 index.html \u251c\u2500\u2500 allure_back # allure\u62a5\u544a\u5907\u4efd\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 20221108114823\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json\n \u251c\u2500\u2500 json # json\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 result_deepin-music_20221109134736_1081333.json\n \u251c\u2500\u2500 logs # \u65e5\u5fd7\u6587\u4ef6\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 2022-11-10_debug.log \u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-10_error.log\n \u251c\u2500\u2500 record # \u5f55\u5c4f\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-09\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 15\u65f614\u520609\u79d2_test_music_303_2_autotest.mp4\n \u2514\u2500\u2500 xml # xml\u62a5\u544a\n\u2514\u2500\u2500 autotest_deepin_music-20221109134736.xml\n \u9ed8\u8ba4\u60c5\u51b5\u4e0b\u540c\u65f6\u751f\u6210 html\u3001xml\u3001json\u4e09\u79cd\u5f62\u5f0f\u7684\u62a5\u544a\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_7","title":"2. \u5b9a\u5236\u62a5\u544a","text":"\u6211\u4eec\u5bf9 allure \u62a5\u544a\u8fdb\u884c\u4e86\u4e00\u7cfb\u5217\u7684\u5b9a\u5236\uff1a \u5b9a\u5236 logo\u3001title\u3001\u62a5\u544a\u9ed8\u8ba4\u8bed\u8a00\u4e3a\u4e2d\u6587\uff1b \u52a0\u5165\u4e86\u7528\u4f8b\u65ad\u8a00\u5931\u8d25\u65f6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u4ee5\u53ca\u6b64\u65f6\u56fe\u50cf\u5bf9\u6bd4\u7684\u6a21\u677f\u56fe\u7247\uff1b \u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\uff0c\u4f60\u53ef\u4ee5\u5728 html \u62a5\u544a\u4e2d\u76f4\u63a5\u770b\u5f55\u5236\u7684\u89c6\u9891\uff1b \u52a0\u5165\u4e86 IP \u5730\u5740\u3001\u7cfb\u7edf\u4fe1\u606f\u3001\u955c\u50cf\u7248\u672c\u7b49\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_5","title":"3. \u67e5\u770b\u62a5\u544a","text":" \u672c\u5730\u6267\u884c \u5728 report/allure \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u4e00\u5806\u6587\u672c\u6587\u4ef6\uff0c\u8fd9\u4e9b\u662f allure \u63d2\u4ef6\u751f\u6210\u7684\u62a5\u544a\u6e90\u6570\u636e\uff0c\u6211\u4eec\u5728 report/allure_html \u76ee\u5f55\u4e0b\u7ed9\u4f60\u751f\u6210\u4e86 html \u6587\u4ef6\uff0c\u4f46\u662f\u4f60\u4e0d\u80fd\u76f4\u63a5\u901a\u8fc7\u6d4f\u89c8\u5668\u6253\u5f00 index.html \u6587\u4ef6\uff0c\u56e0\u4e3a allure \u7684\u62a5\u544a\u90fd\u662f\u57fa\u4e8e\u5728\u7ebf\u7684\u670d\u52a1\uff0c\u4f60\u5e94\u8be5\u8fd9\u6837\u6253\u5f00\uff1a allure open report/allure_html\n \u4f7f\u7528 manage.py \u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u5728\u7ec8\u7aef\u7684\u6700\u540e\u4e00\u884c\uff0c\u6211\u4eec\u4f1a\u7ed9\u4f60\u8f93\u51fa\u6253\u5f00\u62a5\u544a\u7684\u547d\u4ee4\uff0c\u76f4\u63a5\u590d\u5236\u5b83\u5728\u7ec8\u7aef\u6267\u884c\u5c31\u53ef\u4ee5\u67e5\u770b\u4e86\uff0c\u50cf\u8fd9\u6837\uff1a \u7ec8\u7aef\u6267\u884c\u547d\u4ee4: allure open /tmp/youqu/report/allure_html \u67e5\u770b\u62a5\u544a \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 Pycharm \u91cc\u9762\u627e\u5230 index.html \u6587\u4ef6\uff0c\u7136\u540e\u53f3\u952e\u9009\u62e9\u6d4f\u89c8\u5668\u6253\u5f00\uff0c\u6216\u8005\u4f60\u53ef\u4ee5\u7528\u4e00\u4e2a http \u670d\u52a1\u6253\u5f00\u3002 \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 report/allure \u76ee\u5f55\u4e0b\u67e5\u770b\u62a5\u544a\uff1a allure serve report/allure\n \u8fdc\u7a0b\u6267\u884c \u8fdc\u7a0b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\uff0c\u4f1a\u5c06\u6240\u6709\u8fdc\u7a0b\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u62a5\u544a\u90fd\u6536\u96c6\u5230 report/allure \u76ee\u5f55\u4e0b\uff0c\u5206\u522b\u6309\u7167\u673a\u5668\u7684 IP \u7b49\u5efa\u4e86\u4e0d\u540c\u7684\u76ee\u5f55\uff0c\u4f60\u53ef\u4ee5\u5728\u8fd9\u4e9b\u76ee\u5f55\u91cc\u9762\u53bb\u67e5\u770b\u5bf9\u5e94\u7684\u6d4b\u8bd5\u62a5\u544a\uff0c\u67e5\u770b\u65b9\u6cd5\u548c\u524d\u9762\u672c\u5730\u6267\u884c\u67e5\u770b\u7684\u65b9\u6cd5\u4e00\u6837\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_10","title":"\u5341\u4e8c\u3001\u9759\u6001\u4ee3\u7801\u626b\u63cf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_8","title":"1. \u63d0\u524d\u89e3\u51b3\u4ee3\u7801\u95ee\u9898","text":"\u4e3a\u4e86\u5e2e\u52a9\u5f00\u53d1\u8005\u7edf\u4e00\u4ee3\u7801\u98ce\u683c\uff0cPython \u793e\u533a\u63d0\u51fa\u4e86 PEP8 \u4ee3\u7801\u7f16\u7801\u98ce\u683c\uff0cPython \u5b98\u65b9\u540c\u65f6\u63a8\u51fa\u4e86\u4e00\u4e2a\u68c0\u67e5\u4ee3\u7801\u98ce\u683c\u662f\u5426\u7b26\u5408 PEP8 \u7684\u5de5\u5177\uff0c\u540d\u5b57\u4e5f\u53eb PEP8\u3002 \u4f46\u662f\uff0cPycharm \u91cc\u9762\u7684 PEP8 \u63d2\u4ef6\u5b9e\u9645\u4e0a\u5e76\u4e0d\u80fd\u53d1\u73b0\u5f88\u591a\u4ee3\u7801\u95ee\u9898\uff0c\u8fd9\u4e9b\u95ee\u9898\u5e76\u4e0d\u4f1a\u5728\u8fd0\u884c\u65f6\u62a5\u9519\uff0c\u56e0\u4e3a\u4ece Python \u8bed\u8a00\u89d2\u5ea6\u5e76\u4e0d\u5173\u5fc3\u8fd9\u4e9b\u95ee\u9898\uff0c\u5728 Pycharm \u7f16\u8f91\u5668\u91cc\u9762\u4f7f\u7528\u5feb\u6377\u952e ctrl + alt + L\uff0c\u6709\u4e00\u70b9\u70b9\u683c\u5f0f\u5316\u7684\u6548\u679c\uff0c\u80fd\u89e3\u51b3\u4e00\u4e9b\u7a7a\u683c\u3001\u6362\u884c\u7b49\u5c0f\u95ee\u9898\u3002 \u8fd9\u91cc\u63a8\u8350\u4e00\u4e2a Python \u793e\u533a\u6d41\u884c\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff1a Black\uff0c\u53f7\u79f0\u4e0d\u59a5\u534f\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff0c\u5b83\u68c0\u6d4b\u5230\u4e0d\u7b26\u5408\u89c4\u8303\u7684\u4ee3\u7801\u98ce\u683c\u76f4\u63a5\u5c31\u5e2e\u4f60\u5168\u90e8\u683c\u5f0f\u5316\u597d\uff0c\u5c31\u662f\u8fd9\u4e48\u521a\uff01 \u5b89\u88c5\uff1a sudo pip3 install black \n \u4f7f\u7528\u65b9\u6cd5\uff1a black ${CheckPath}\n \u4f7f\u7528\u8fd9\u4e2a\u5de5\u5177\u683c\u5f0f\u5316\u4e4b\u540e\uff0c\u4ee3\u7801\u4f1a\u88ab\u81ea\u52a8\u8c03\u6574\uff0c\u521a\u5f00\u59cb\u4f60\u53ef\u80fd\u4f1a\u89c9\u5f97\u8c03\u6574\u5f97\u5f88\u5938\u5f20\uff0c\u6ca1\u5173\u7cfb\u575a\u6301\u770b\uff0c\u4e60\u60ef\u4e4b\u540e\uff0c\u4f60\u4f1a\u89c9\u5f97\u5f88\u4f18\u96c5\uff0c\u6ca1\u9519\uff0c\u8fd9\u5c31\u662f Pythonic Code \u7684\u6838\u5fc3\uff0c\u8bf7\u4fdd\u6301\u4f18\u96c5\uff5e\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_8","title":"2. \u4ee3\u7801\u626b\u63cf\u5de5\u5177","text":"\u4f7f\u7528\u6839\u76ee\u5f55\u4e0b pylint.sh \u626b\u63cf\u4ee3\u7801\uff0c\u5728 report \u76ee\u5f55\u4e0b\u67e5\u770b\u4ee3\u7801\u626b\u63cf\u62a5\u544a\uff0c\u5982\u679c\u6709\u4ee3\u7801\u95ee\u9898\u8bf7\u63d0\u524d\u89e3\u51b3\u4e4b\u540e\u518d\u63d0\u4ea4\u3002 \u6b64\u811a\u672c\u5df2\u7ecf\u4f7f\u7528 Python \u793e\u533a\u6700\u6d41\u884c\u7684\u4ee3\u7801\u626b\u63cf\u5de5\u5177 Pylint \u8fdb\u884c\u4ee3\u7801\u626b\u63cf\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a bash pylint.sh\n \u8fd0\u884c\u4e4b\u540e\u4f1a\u63d0\u793a\u4f60\u8981\u626b\u63cf\u7684\u76ee\u5f55\uff0c\u6bd4\u5982\u8f93\u5165 apps \uff0c\u5219\u4f1a\u626b\u63cf apps \u4e0b\u7684\u6240\u6709 Python \u4ee3\u7801\u3002 \u5728 setting/pylintrc.cfg \u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u76f8\u5173\u914d\u7f6e\uff0c\u626b\u63cf\u5b8c\u6210\u4e4b\u540e\u5728 report/pylints \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u626b\u63cf\u62a5\u544a\u3002 \u4ee3\u7801\u63d0\u4ea4\u9700\u901a\u8fc7 git review \u63d0\u4ea4\u5230 gerrit \uff0c\u4eba\u5de5 Code Review \u901a\u8fc7\u4e4b\u540e\u5408\u5165\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_11","title":"\u5341\u4e09\u3001\u63d0\u4ea4\u4ee3\u7801","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_9","title":"1. \u5b89\u88c5\u4f9d\u8d56","text":"sudo apt install git-review\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_9","title":"2. \u63d0\u4ea4\u6a21\u677f","text":"\u5728 ~ \u76ee\u5f55\u4e0b\u65b0\u5efa\u6587\u4ef6\uff0c\u5e76\u547d\u540d\u4e3a gitcommit_template \u5c06\u4ee5\u4e0b\u5185\u5bb9\u5199\u5165\u6587\u4ef6\u5f53\u4e2d\uff1a # commit type :fix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style(\u98ce\u683c\u4fee\u6539)\u3001refactor(\u91cd\u6784)\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test(\u6d4b\u8bd5) + \u7b80\u5355\u63cf\u8ff0. \u9ed8\u8ba4fix,\u6839\u636e\u60c5\u51b5\u4fee\u6539\nfix: \n\n# \u8be6\u7ec6\u8bf4\u660e\u4ee3\u7801\u7684\u6539\u52a8\uff0c\u5305\u542b\u4ee3\u7801\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u4ee5\u53ca\u4e3a\u4ec0\u4e48\u8fd9\u4e48\u505a\uff0c\u53ef\u80fd\u4f1a\u5f71\u54cd\u54ea\u4e9b\u529f\u80fd\u3002\u5bf9\u4e8e\u4ee3\u7801\u7684\u5ba1\u6838\u8005\uff0c\u9700\u8981\u4ece\u8fd9\u6bb5\u63cf\u8ff0\u4e2d\u80fd\u5b8c\u5168\u7406\u89e3\u4ee3\u7801\u4e2d\u6240\u6709\u6539\u52a8\u7684\u5185\u5bb9\nDescription: \n\n# \u5199\u4e00\u6bb5\u9762\u5411\u4e8e\u4ea7\u54c1\u7684\u603b\u7ed3\u6027\u5185\u5bb9\uff0c\u7528\u4e8e\u81ea\u52a8\u751f\u6210crp\u4e0a\u7684changlog\uff0c\u9700\u8981\u6ce8\u610f\u7684\u4e8b\uff0c\u8fd9\u6bb5\u63cf\u8ff0\u5fc5\u987b\u4ece\u4ea7\u54c1\u7684\u89d2\u5ea6\u8003\u8651\u3002\nLog: \n\n# \u5173\u8054pms\u4e0a\u7684bug\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94bug\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4fee\u590dbug\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Bug: \n\n# \u4fee\u590d github issue \n#Issue: \n\n# \u5173\u8054pms\u4e0a\u7684\u4efb\u52a1\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94\u4efb\u52a1\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4efb\u52a1\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Task: \n \u547d\u4ee4\u884c\u6267\u884c: git config --global commit.template ~/gitcommit_template\n \u6b64\u547d\u4ee4\u5c06\u6a21\u677f\u52a0\u5165\u5230 git \u7684\u63d0\u4ea4\u6a21\u677f\u4e2d\u3002 \u540e\u7eed\u63d0\u4ea4\u7684\u65f6\u5019\u9700\u8981\u5173\u6ce8\u4e00\u4e0b\u51e0\u70b9\uff1a commit type \u5bf9\u5e94\u4e0d\u540c\u7684\u4fee\u6539\u7c7b\u578b\uff1afix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style \uff08\u98ce\u683c\u4fee\u6539\uff09\u3001refactor \uff08\u91cd\u6784\uff09\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test \uff08\u6d4b\u8bd5\uff09 commit type \u5192\u53f7\u540e\u9762\u52a0\u7a7a\u683c\u3002 Description \u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u9700\u8981\u8fdb\u884c\u8be6\u7ec6\u8bf4\u660e\uff0c\u6bd4\u5982\u5bf9\u529f\u80fd\u8fdb\u884c\u5927\u6539\u7b49\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_6","title":"3. \u63a8\u9001\u4ee3\u7801","text":"\u9996\u5148\u6dfb\u52a0 commit \u4fe1\u606f git add \u540e\u9762\u52a0\u6587\u4ef6\u540d\u79f0\n git add . # \u8868\u793a\u6dfb\u52a0\u6240\u6709\u6587\u4ef6\n \u4f7f\u7528\u8fd9\u6761\u547d\u4ee4\u6ce8\u610f\u6709\u4e9b\u4e34\u65f6\u6587\u4ef6\u4e0d\u8981\u63d0\u4ea4\u5230\u4ed3\u5e93\u4e86\u3002 git commit -a\n \u4e4b\u540e\u5728 fix: \u540e\u9762\uff08\u6ce8\u610f\u5192\u53f7\u540e\u9762\u5fc5\u987b\u52a0\u7a7a\u683c\uff0c\u4e0d\u7136\u76f4\u63a5-1\uff09\u5199\u672c\u5730\u63d0\u4ea4\u7684 commit \u4fe1\u606f\uff0c\u7136\u540e\u5c31\u53ef\u4ee5\u63d0\u4ea4\u4ee3\u7801\u4e86 git review branch(\u5f53\u524d\u5206\u652f) -r origin\n \u6700\u597d\u4e00\u6b21 commit\uff0c\u4e00\u6b21 git review \uff0c\u7ecf\u5e38\u6709\u540c\u5b66\u5728\u672c\u5730\u75af\u72c2 commit \u6700\u540e git review \u62a5\u9519\u4e0d\u77e5\u9053\u548b\u56de\u4e8b\u513f\u3002 \u82e5\u4e0d\u60f3\u6bcf\u6b21\u63d0\u4ea4\u90fd\u52a0\u4e0a -r \u9009\u9879\uff0c\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a git config --global gitreview.remote origin \u63d0\u4ea4\u4ee3\u7801\uff0c\u76f4\u63a5\u4f7f\u7528 git review branch<\u76ee\u6807\u5206\u652f>\uff0c\u4f8b\u5982 git review master"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git","title":"4. Git\u6807\u7b7e","text":"Git \u6807\u7b7e\u5b9e\u9645\u4e0a\u662f commit \u7684\u4e00\u4e2a\u522b\u540d\uff0c\u4e3b\u8981\u7528\u4e8e\u7ba1\u7406\u5386\u53f2\u7248\u672c\u3002 \u60f3\u8c61\u4e00\u4e0b\u9886\u5bfc\u8ba9\u4f60\u628a\u4e4b\u524d\u7684\u67d0\u4e2a\u7248\u672c\u7684\u4ee3\u7801\u62c9\u51fa\u6765\u8dd1\uff0c\u4f60\u662f\u4e0d\u662f\u4e56\u4e56\u7684\u53bb\u628a\u6240\u6709\u63d0\u4ea4\u8bb0\u5f55\u62c9\u51fa\u6765\u627e\uff0c\u7136\u540e\u627e\u5230\u90a3\u4e2a\u54c8\u5e0c\u503c\uff0c\u901a\u8fc7\u54c8\u5e0c\u503c\u6765\u68c0\u51fa\u4ee3\u7801\u3002 \u8fd9\u4e00\u5957\u64cd\u4f5c\u4e0b\u6765\u662f\u4e0d\u662f\u5f88\u9ebb\u70e6\uff0c\u8d39\u65f6\u95f4\u8fd8\u4e0d\u4e00\u5b9a\u80fd\u627e\u5f97\u5230\uff0c\u6ca1\u4eba\u80fd\u8bb0\u4f4f\u6bcf\u4e2a\u63d0\u4ea4\u54c8\u5e0c\u503c\u4ee5\u53ca\u8fd9\u6b21\u63d0\u4ea4\u90fd\u6539\u4e86\u54ea\u4e9b\u4ee3\u7801\u3002 \u56e0\u6b64\u7ed9\u63d0\u4ea4\u6253\u4e2a\u6807\u7b7e\uff0c\u5c31\u662f\u628a\u54c8\u5e0c\u503c\u8f6c\u6362\u6210\u4eba\u7c7b\u80fd\u7406\u89e3\u7684\u8bed\u8a00\uff0c\u6bd4\u5982 v1.0\uff0c\u5c31\u53ef\u4ee5\u76f4\u63a5\u901a\u8fc7\u6807\u7b7e\u627e\u5230\u5bf9\u5e94\u7684\u63d0\u4ea4\u3002 \u65b0\u5efa\u6807\u7b7e git tag -a <tagname>\n \u56de\u8f66\u4e4b\u540e\uff0cGit \u4f1a\u6253\u5f00\u4f60\u7684\u7f16\u8f91\u5668\uff0c\u8ba9\u4f60\u5199\u4e00\u53e5\u6807\u7b7e\u6ce8\u89e3\uff0c\u5c31\u50cf\u4f60\u7ed9\u63d0\u4ea4\u5199\u6ce8\u89e3\u4e00\u6837\u3002 \u67e5\u770b\u6240\u6709\u6807\u7b7e git tag -l\n# git tag \u4e5f\u884c\n \u5220\u9664\u6807\u7b7e git tag -d <tagname>\n \u63a8\u9001\u6807\u7b7e\u81f3\u8fdc\u7a0b git push \u547d\u4ee4\u5e76\u4e0d\u4f1a\u4f20\u9001\u6807\u7b7e\u5230\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\uff0c\u5fc5\u987b\u663e\u5f0f\u5730\u63a8\u9001\u6807\u7b7e\u3002 git push origin <tagname>\n \u63a8\u9001\u6240\u6709\u4e0d\u5728\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\u7684\u6807\u7b7e git push origin --tag\n \u5220\u9664\u8fdc\u7a0b\u6807\u7b7e git push origin :refs/tag/<tagname>\n \u540e\u671f\u6253\u6807\u7b7e \u5148\u7528 git log --pretty=oneline \u67e5\u8be2\u63d0\u4ea4\u8bb0\u5f55\uff0c\u83b7\u53d6\u6821\u9a8c\u7801\u3002 git tag -a <tagname> 9fceb02(\u6821\u9a8c\u7801)\n \u68c0\u51fa\u6807\u7b7e git checkout <tagname>\n \u6b64\u65f6\uff0c\u4ed3\u5e93\u4f1a\u5904\u4e8e\u201c\u5206\u79bb\u5934\u6307\u9488\uff08detached HEAD\uff09\u201d\u7684\u72b6\u6001\u3002 \u5728\u201c\u5206\u79bb\u5934\u6307\u9488\u201d\u72b6\u6001\u4e0b\uff0c\u5982\u679c\u4f60\u505a\u4e86\u67d0\u4e9b\u66f4\u6539\u7136\u540e\u63d0\u4ea4\u5b83\u4eec\uff0c\u6807\u7b7e\u4e0d\u4f1a\u53d1\u751f\u53d8\u5316\uff0c \u4f46\u4f60\u7684\u65b0\u63d0\u4ea4\u5c06\u4e0d\u5c5e\u4e8e\u4efb\u4f55\u5206\u652f\uff0c\u5e76\u4e14\u5c06\u65e0\u6cd5\u8bbf\u95ee\uff0c\u9664\u975e\u901a\u8fc7\u786e\u5207\u7684\u63d0\u4ea4\u54c8\u5e0c\u624d\u80fd\u8bbf\u95ee\u3002 \u56e0\u6b64\uff0c\u5982\u679c\u4f60\u9700\u8981\u8fdb\u884c\u66f4\u6539\uff0c\u6bd4\u5982\u4f60\u8981\u4fee\u590d\u65e7\u7248\u672c\u4e2d\u7684\u9519\u8bef\uff0c\u90a3\u4e48\u901a\u5e38\u9700\u8981\u521b\u5efa\u4e00\u4e2a\u65b0\u5206\u652f\uff1a git checkout -b <NewBranchName> <tagname>\n \u65b0\u5206\u652f\u4e0a\u53ef\u4ee5\u8fdb\u884c\u63d0\u4ea4\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_12","title":"\u5341\u56db\u3001\u5e38\u89c1\u95ee\u9898","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_10","title":"1. \u63d0\u4ea4\u4ee3\u7801\u65f6\u63d0\u793a\u90ae\u7bb1\u6216\u8005\u540d\u79f0\u4e0d\u5bf9","text":"\u91cd\u65b0\u914d\u7f6e\u90ae\u7bb1\u6216\u8005\u540d\u79f0\uff0c\u7136\u540e\u91cd\u7f6e\u751f\u6548\uff1a git commit --amend --reset-author\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_10","title":"2. \u600e\u4e48\u56de\u6eda\u5230\u4e4b\u524d\u7684\u7248\u672c","text":"(1)\u67e5\u8be2\u5386\u53f2\u63d0\u4ea4\u8bb0\u5f55 git log\n \u627e\u5230\u4f60\u8981\u56de\u6eda\u7684\u7248\u672c\uff0c\u590d\u5236 hash \u503c\u3002 \u6ce8\u610f\uff1a\u662f commit \u7a7a\u683c\u4e4b\u540e\u7684 hash \u503c\uff0c\u4e4b\u524d\u6709\u540c\u5b66\u590d\u5236\u7684 Change-Id: \u8fd9\u6837\u80af\u5b9a\u62a5\u9519\u3002 (2)\u56de\u6eda\u7248\u672c\uff0c\u4e0d\u6e05\u9664\u4ee3\u7801 git reset --soft ${hash}\n (3)\u56de\u6eda\u7248\u672c\uff0c\u6e05\u9664\u4ee3\u7801\uff0c\u614e\u7528\u54c8 git reset --hard ${hash}\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-f-s-e","title":"3. \u6d4b\u8bd5\u62a5\u544a\u91cc\u9762 F S . E \u662f\u4ec0\u4e48\u610f\u601d","text":"F \u8868\u793a\u5931\u8d25\uff0c. \uff08\u70b9\uff09\u8868\u793a\u901a\u8fc7\uff0cS \u8868\u793a\u8df3\u8fc7\uff0cE \u8868\u793a error \u6709\u62a5\u9519"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git-status","title":"4. \u89e3\u51b3 git status \u4e2d\u6587\u663e\u793a\u7684\u95ee\u9898","text":"git config --global core.quotePath false\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5-apps","title":"5. apps \u76ee\u5f55\u4e0b\u989c\u8272\u6709\u4e9b\u662f\u9ec4\u8272\u7684","text":"\u5728 Pycharm \u4e2d apps \u76ee\u5f55\u4e0b\u5e94\u7528\u5e93\u6587\u4ef6\u662f\u9ec4\u8272\u7684\uff0c\u7f16\u8f91\u5668\u8bc6\u522b\u4e0d\u5230\u4ee3\u7801\u65b0\u589e\u548c\u4fee\u6539\uff1b \u7531\u4e8e\u793e\u533a\u7248 Pycharm \u4e0d\u80fd\u52a8\u6001\u8bc6\u522b\u591a\u4ed3\u5e93\uff0c\u9700\u8981\u5728 setting \u91cc\u9762\u624b\u52a8\u6ce8\u518c\uff0c\u64cd\u4f5c\u6b65\u9aa4\uff1a File \u2014> Settings \u2014> Version Control \u2014> \u70b9 + \u53f7 \u2014> Directory \u9009\u4e2d\u5e94\u7528\u5e93\u5de5\u7a0b\u76ee\u5f55 \u2014> VCS \u9009\u4e2d Git \u2014> Apply \u5982\u6b64\u5c31\u53ef\u4ee5\u4e86\u3002 \u4e13\u4e1a\u7248 Pycharm \u4e0d\u5b58\u5728\u8fd9\u4e2a\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#6-envsh-r","title":"6. \u6267\u884c env.sh \u62a5\u9519 $'\\r':\u672a\u627e\u5230\u547d\u4ee4","text":"\u51fa\u73b0\u8fd9\u4e2a\u95ee\u9898\u4f60\u5e94\u8be5\u662f\u5728 windows \u4e0a\u6253\u5f00\u6216\u7f16\u8f91\u8fc7 env.sh \u811a\u672c\uff0cwindows\u4e0b\u7684\u6362\u884c\u662f\u56de\u8f66\u7b26+\u6362\u884c\u7b26\uff0c\u4e5f\u5c31\u662f\\r\\n\uff0c\u800c Linxu \u4e0b\u662f\u6362\u884c\u7b26 \\n\uff0cLinux \u4e0b\u4e0d\u8bc6\u522b \\r\uff0c\u56e0\u6b64\u62a5\u9519\u3002 \u89e3\u51b3\u65b9\u6848\uff1a # \u5c06 \\r \u66ff\u6362\u4e3a\u7a7a\nsudo sed -i 's/\\r//' env.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#7","title":"7.\u600e\u6837\u4e3a\u5355\u72ec\u67d0\u4e00\u6761\u7528\u4f8b\u914d\u7f6e\u6267\u884c\u8d85\u65f6\u65f6\u95f4","text":"\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u5982\u4e0b\uff1a @pytest.mark.timeout(300) # \u5355\u4f4d\u79d2\ndef test_xxx_001():\npass\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#8-youqu","title":"8. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u6240\u6709\u4ee3\u7801\uff0c\u5305\u542b\u5b50\u4ed3\u5e93","text":"\u524d\u7f6e\u6761\u4ef6\uff1a\u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 # \u7b2c\u4e00\u6b21\u5b58\u50a8\u5bc6\u7801\uff0c\u63d0\u4f9b\u540e\u9762\u62c9\u4ee3\u7801(gerrit: ldap\u8d26\u53f7\u548c\u5bc6\u7801\uff0cgit\u62c9\u53d6\u7b2c\u4e00\u6b21\u8f93\u5165\u4fdd\u5b58\uff0c\u540e\u9762\u76f4\u63a5\u4f7f\u7528)\ngit config --global credential.helper store\n\n# \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\uff0c\u5e76\u9012\u5f52\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\" --recursive\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#9-youqu","title":"9. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\u6307\u5b9a\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u524d\u7f6e\u6761\u4ef6\uff1a \u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 \u5df2\u5b58\u50a8\u8bbf\u95ee\u5bc6\u7801 # \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\"\n# \u6307\u5b9a\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ncd youqu\ngit submodule update --init apps/autotest_xxx_xxx\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#10-youqu","title":"10. \u5982\u4f55\u66f4\u65b0 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\uff0c\u6240\u6709\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u66f4\u65b0\u6240\u6709\u5b50\u4ed3\u5e93\u4ee3\u7801 cd youqu\ngit pull & git submodule foreach git pull\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#11-youqu-master-detached-head","title":"11. \u5982\u4f55\u4fee\u590d YouQu \u6240\u6709\u5b50\u4ed3\u5e93 master \u5206\u652f\u6e38\u79bb\u5934\uff08detached head\uff09","text":"\u4fee\u590d\u6240\u6709\u5b50\u4ed3\u5e93\u9ed8\u8ba4master \u5206\u652f\u6e38\u79bb\u5934 cd youqu\ngit submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/","title":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212 \u5206\u7c7b\uff1a/ \u67b6\u6784\u5e08\uff1a/ \u76ee\u6807\uff1a \u5e94\u7528 AT \u67b6\u6784\u5de5\u7a0b\u5316\uff0c\u53c2\u8003\u6027\u80fd\u81ea\u52a8\u5316\u5de5\u7a0b\u5b8c\u6210\u5de5\u7a0b\u5316\u6539\u9020\u3002 \u5e94\u7528\u95f4\u7528\u4f8b\u89e3\u8026\uff0c\u89e3\u9664\u6240\u6709\u4ea4\u53c9\u8c03\u7528\u7684\u65b9\u6cd5\uff0c\u5404\u5e94\u7528\u80fd\u8ddf\u968f\u81ea\u8eab\u8fed\u4ee3\u5468\u671f\u72ec\u7acb\u7ef4\u62a4 AT \u7528\u4f8b\u3002 \u5b8c\u6210\u516c\u5171\u65b9\u6cd5\u7684\u62bd\u53d6\u6574\u5408\uff0c\u5f62\u6210\u4e00\u5957\u72ec\u7acb\u4e8e\u5e94\u7528\u95f4\u7684\u516c\u5171\u65b9\u6cd5\u5e93\uff0c\u5404\u5e94\u7528\u65b9\u6cd5\u91cc\u9762\u4e0d\u5b58\u5728\u88ab\u591a\u4e2a\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\u3002 \u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u4e3a\u5c06\u6765\u9002\u914d\u66f4\u591a\u7684 AT \u8fd0\u7528\u573a\u666f\u63d0\u4f9b\u652f\u6491\uff0c\u539f\u5219\u4e0a\u53ef\u5b9e\u73b0\u65e0\u9650\u6269\u5c55\uff0c\u5728\u6bcf\u65e5\u6784\u5efa\u548c\u6301\u7eed\u96c6\u6210\u6d41\u7a0b\u843d\u5730\u4f7f\u7528\u3002 \u4ee3\u7801\u89c4\u8303\u95ee\u9898\u6e05\u96f6\uff0c\u7b26\u5408 Shell Check\u3001Pylint\u3001\u7cfb\u7edf\u90e8\u76f8\u5173\u7f16\u7801\u89c4\u8303\u8981\u6c42\u3002 \u610f\u4e49\uff1a \u7edf\u4e00\u6210\u7814 AT \u67b6\u6784\u8bbe\u8ba1\u601d\u8def\uff0c\u6d88\u9664 AT \u4ee3\u7801\u5b9e\u73b0\u548c\u7ef4\u62a4\u4e0a\u53ef\u80fd\u51fa\u73b0\u7684\u5206\u6b67\uff0c\u6539\u5584\u5386\u53f2 AT \u65e0\u5de5\u7a0b\u5316\u8bbe\u8ba1\u7684\u7f3a\u9677\uff0c\u63d0\u9ad8\u67b6\u6784\u4e13\u4e1a\u6027\u3002 \u5404\u5e94\u7528 AT \u4ee3\u7801\u76f8\u4e92\u72ec\u7acb\uff0c\u5951\u5408\u5e94\u7528\u72ec\u7acb\u53d1\u5e03\u7279\u6027\uff0c\u53ef\u652f\u6301\u8fed\u4ee3\u671f\u95f4\u72ec\u7acb\u65b0\u589e\u3001\u7ef4\u62a4\u548c\u6267\u884c\u3002 \u65b9\u6cd5\u8c03\u7528\u903b\u8f91\u5f97\u5230\u7b80\u5316\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u66f4\u9ad8\u6548\uff1b\u516c\u5171\u5e93\u62bd\u53d6\uff0c\u51cf\u5c11\u65b9\u6cd5\u91cd\u590d\u7f16\u5199\uff0c\u63d0\u9ad8\u4ee3\u7801\u5229\u7528\u7387\uff1b\u5e73\u5747\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u4ece40\u5206\u949f\u964d\u4f4e\u81f330\u5206\u949f\uff0c\u65e5\u4ea7\u51fa\u7528\u4f8b\u4ece12\u6761/\u5929\u63d0\u5347\u81f316\u6761/\u5929\u3002 \u53ef\u7075\u6d3b\u652f\u6491\u4e0d\u540c\u7684\u81ea\u52a8\u5316\u8fd0\u7528\u573a\u666f\uff0c\u5982 CI\u3001\u5192\u70df\u6d4b\u8bd5\u3001\u96c6\u6210\u6d4b\u8bd5\u3001\u56de\u5f52\u6d4b\u8bd5\u3001\u4e13\u9879\u6d4b\u8bd5\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_2","title":"\u4e00\u3001\u80cc\u666f\u4ecb\u7ecd","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1","title":"1\u3001\u73b0\u6709\u67b6\u6784\u4ecb\u7ecd","text":"\u73b0\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u6574\u4f53\u5206\u4e3a\u4e09\u5c42\uff1a\u7528\u4f8b\u5c42\uff08\u4e1a\u52a1\u903b\u8f91\u5c42\uff09\u3001\u4e2d\u95f4\u5c42\uff08\u5143\u7d20\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff09\u3001\u6838\u5fc3\u5c42\uff08\u5e95\u5c42\u529f\u80fd\u5e93\u5c42\uff09\u3002 \u7528\u4f8b\u5c42\uff1a\u5373\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4e13\u6ce8\u4e8e\u4e1a\u52a1\u529f\u80fd\u903b\u8f91\uff0c\u4e0d\u5173\u5fc3\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\uff1b \u4e2d\u95f4\u5c42\uff1a\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff0c\u6bcf\u4e2a\u65b9\u6cd5\u5747\u5bf9\u5e94\u4e00\u4e2a\u5143\u7d20\u7684\u4e00\u4e2a\u5177\u4f53\u64cd\u4f5c\uff0c\u4e5f\u53ef\u4ee5\u662f\u591a\u4e2a\u64cd\u4f5c\u7684\u7ec4\u5408\u64cd\u4f5c\uff0c\u4e2d\u95f4\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u7528\u4f8b\u5c42\uff0c\u5177\u6709\u53ef\u6269\u5c55\u6027\u548c\u590d\u7528\u6027\uff1b \u6838\u5fc3\u5c42\uff1a\u4e3b\u8981\u5c01\u88c5\u7684\u5e95\u5c42\u529f\u80fd\u5b9e\u73b0\uff0c\u6b64\u5c42\u5728\u6846\u67b6\u4e2d\u63d0\u4f9b\u4e00\u4e9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u529f\u80fd\u6a21\u5757\u76f8\u5bf9\u72ec\u7acb\uff0c\u6838\u5fc3\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u64cd\u4f5c\u5c42\uff0c\u6bd4\u5982\uff1a\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7 UI \u5750\u6807\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u952e\u9f20\u64cd\u4f5c\u7684\u57fa\u7840\u65b9\u64cd\u4f5c\u6a21\u5757\u3001Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757\u3001\u6587\u4ef6\u7684\u589e\u5220\u6539\u67e5\u64cd\u4f5c\u6a21\u5757\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2","title":"2\u3001\u81ea\u52a8\u5316\u7684\u5e94\u7528","text":"2.1\u3001CI \u6d41\u7a0b \u6bcf\u65e5\u6784\u5efa\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u7814\u53d1\u6bcf\u65e5\u63d0\u4ea4\u7684\u4ee3\u7801\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u73ed\u4e4b\u540e\u4f1a\u5c06\u5404\u5e94\u7528\u8fdb\u884c\u6253\u5305\uff0c\u7136\u540e\u5728\u6d4b\u8bd5\u673a\u4e0a\u5b89\u88c5\u66f4\u65b0 deb \u5305\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u5e94\u7528\u63d0\u4ea4\u96c6\u6210\u7684\u7248\u672c\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u8f7d\u6700\u65b0\u7684 ISO \u8fdb\u884c PXE \u90e8\u7f72\uff0c\u7136\u540e\u6d4b\u8bd5\u673a\u5b89\u88c5\u6700\u65b0\u7684\u955c\u50cf\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 2.2\u3001\u9a8c\u6536\u6d4b\u8bd5 \u5728\u5404\u9a8c\u6536\u8282\u70b9\u8fdb\u884c\u81ea\u52a8\u5316\u9a8c\u6536\uff0c\u76ee\u524d\u7684\u7b56\u7565\u662f\u5168\u7528\u4f8b\u8986\u76d6\u5168\u67b6\u6784\u3002 2.3\u3001\u56de\u5f52\u6d4b\u8bd5 \u56de\u5f52\u6d4b\u8bd5\u4eca\u5e74\u89c4\u5212\u5efa\u8bbe\u4e2d\uff0c\u65e8\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u6267\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\uff0c\u51cf\u5c11\u529f\u80fd\u6d4b\u8bd5\u7684\u91cd\u590d\u52b3\u52a8\u529b\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3","title":"3\u3001\u5b58\u5728\u7684\u95ee\u9898","text":" \u5404\u5e94\u7528\u4e4b\u95f4\u5b58\u5728\u8026\u5408 \u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u521d\u671f\uff0c\u6240\u6709\u5e94\u7528\u662f\u6574\u4f53\u53d1\u5e03\uff0c\u6211\u4eec\u662f\u5c06\u6240\u6709\u5e94\u7528\u770b\u6210\u662f\u4e00\u4e2a\u6574\u4f53\uff0c\u5404\u5e94\u7528\u4f5c\u4e3a\u5176\u4e2d\u7684\u4e00\u4e2a\u6a21\u5757\uff0c\u6240\u4ee5\u5b58\u5728\u5e94\u7528\u95f4\u65b9\u6cd5\u4ea4\u53c9\u8c03\u7528\u7684\u95ee\u9898\uff0c\u8fd9\u6837\u4ece\u6700\u521d\u7684\u8bbe\u8ba1\u6765\u8bb2\u786e\u5b9e\u80fd\u591f\u51cf\u5c11\u91cd\u590d\u4ee3\u7801\u7684\u7f16\u5199\u3002\u4f46\u662f\u73b0\u5728\u5e94\u7528\u8d70\u72ec\u7acb\u53d1\u5e03\uff0c\u5404\u5e94\u7528\u90fd\u6709\u81ea\u5df1\u7684\u8fed\u4ee3\u8282\u594f\uff0c\u5728\u65b0\u9700\u6c42\u5feb\u901f\u53d8\u5316\u7684\u8fc7\u7a0b\u4e2d\uff0c\u81ea\u52a8\u5316\u7ef4\u62a4\u53d8\u5f97\u5f02\u5e38\u56f0\u96be\uff0c\u539f\u56e0\u5c31\u662f\u81ea\u52a8\u5316\u9879\u76ee\u91cc\u9762\u5404\u4e2a\u5e94\u7528\u7684\u6709\u6bd4\u8f83\u591a\u7684\u8026\u5408\u5173\u7cfb\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u8fdb\u884c\u89e3\u8026\uff0c\u4ee5\u9002\u5e94\u5e94\u7528\u4e0d\u540c\u7684\u8fed\u4ee3\u5468\u671f\u3002 \u65e0\u6cd5\u7cbe\u51c6\u7684\u5212\u5206\u7528\u4f8b\u8303\u56f4 \u7528\u4f8b\u6267\u884c\u7684\u8303\u56f4\u4e0d\u591f\u7cbe\u51c6\uff0c\u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u4e3b\u8981\u901a\u8fc7\u7528\u4f8b\u7684\u5173\u952e\u8bcd core\uff08\u6838\u5fc3\uff09\u6765\u533a\u5206\u7528\u4f8b\u662f\u5426\u4e3a\u6838\u5fc3\u7528\u4f8b\uff0c\u4f46\u662f\u8fd9\u6837\u7684\u533a\u5206\u592a\u5bbd\u6cdb\u4e86\uff0c\u4e0d\u80fd\u9002\u5e94\u81ea\u52a8\u5316\u6d4b\u8bd5\u5728\u591a\u573a\u666f\u4e0b\u7684\u5e94\u7528\u3002\u5f88\u591a\u573a\u666f\u4e0b\u6211\u4eec\u8fd8\u9700\u8981\u6839\u636e\u7528\u4f8b\u7684\u7b49\u7ea7\u3001\u7528\u4f8b\u7684\u7c7b\u578b\u3001\u7528\u4f8b\u6765\u6e90\u7b49\u7b49\uff0c\u4e0d\u540c\u7684\u7ef4\u5ea6\u6765\u6311\u9009\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u5173\u952e\u5b57\u9700\u8981\u4eba\u5de5\u4e00\u6761\u6761\u7684\u6539\uff0c\u8d39\u65f6\u8d39\u529b\uff0c\u800c\u4e14\u4e0d\u597d\u7ef4\u62a4\u3002 \u53d7\u65b0\u9700\u6c42\u5f71\u54cd\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u597d\u7ef4\u62a4 \u76ee\u524d\u9700\u8981\u8df3\u8fc7\u7684\u7528\u4f8b\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684\u7528\u4f8b\u811a\u672c\u91cc\u9762\uff0c\u6dfb\u52a0\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\uff0c\u540e\u7eed\u89e3\u9664\u8df3\u8fc7\u7684\u65f6\u5019\u53c8\u9700\u8981\u627e\u5230\u8fd9\u6761\u811a\u672c\uff0c\u5220\u6389\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\u3002\u5728\u8df3\u8fc7\u7528\u4f8b\u8f83\u591a\u7684\u60c5\u51b5\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u96be\u5ea6\u3002 \u7f16\u5199\u7528\u4f8b\u65f6\u903b\u8f91\u6bd4\u8f83\u590d\u6742\uff0c\u9700\u8981\u8c03\u7528\u591a\u4e2a\u5e94\u7528\u7684\u65b9\u6cd5\u6a21\u5757\u3002 \u6846\u67b6\u6269\u5c55\u6027\u4e0d\u8db3\uff0c\u65e0\u6cd5\u6574\u5408\u6027\u80fd\u81ea\u52a8\u5316\u3001\u538b\u6d4b\u81ea\u52a8\u5316\u3001\u5b89\u5168\u81ea\u52a8\u5316\u7b49\u4e13\u9879\u6d4b\u8bd5\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_3","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u4e3a\u89e3\u51b3\u73b0\u6709\u95ee\u9898\uff0c\u9002\u5e94\u4e0d\u65ad\u4e30\u5bcc\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u66f4\u597d\u7684\u53d1\u6325\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4f5c\u7528\uff0c\u9700\u8981\u5bf9\u81ea\u52a8\u5316\u67b6\u6784\u53ca\u5404\u529f\u80fd\u6a21\u5757\u8fdb\u884c\u91cd\u65b0\u8bbe\u8ba1\u89c4\u5212\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_1","title":"1\u3001\u67b6\u6784\u8bbe\u8ba1","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_1","title":"2\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u6846\u67b6\u7684\u8fd0\u884c\u903b\u8f91\uff1a\u901a\u8fc7\u6838\u5fc3\u5c42\u63d0\u4f9b\u4e00\u4e2a\u57fa\u7840\u80fd\u529b\uff0c\u4e1a\u52a1\u5c42\u6839\u636e\u5b9e\u9645\u4e1a\u52a1\u9700\u6c42\uff08\u6d4b\u8bd5\u7528\u4f8b\uff09\u52a8\u6001\u52a0\u8f7d\u6838\u5fc3\u5c42\uff0c\u6267\u884c\u5165\u53e3\u52a0\u8f7d\u76f8\u5e94\u7684\u7528\u4f8b\u96c6\u5e76\u63a7\u5236\u6267\u884c\uff0c\u5e94\u7528\u5c42\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u9700\u6c42\uff0c\u901a\u8fc7\u76f8\u5e94\u7684\u914d\u7f6e\u9879\u8fdb\u884c\u914d\u7f6e\uff0c\u4ece\u800c\u89e6\u53d1\u81ea\u52a8\u5316\u6d4b\u8bd5\u4efb\u52a1\u3002 \u6838\u5fc3\u5c42\uff1a\u57fa\u672c\u4fdd\u6301\u4e0d\u53d8\uff0c\u90e8\u5206\u6a21\u5757\u4f1a\u6d89\u53ca\u5230\u65b0\u529f\u80fd\u5f00\u53d1\uff0c\u6838\u5fc3\u5c42\u5404\u529f\u80fd\u6a21\u5757\u4fdd\u6301\u72ec\u7acb\u6027\uff0c\u63d0\u4f9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u4f9b\u4e0a\u5c42\u8c03\u7528\uff1b \u5e95\u5c42\u6838\u5fc3\u6a21\u5757\u5305\u62ec\uff1a \u56fe\u50cf\u8bc6\u522b\u6a21\u5757 UI \u5b9a\u4f4d\u6a21\u5757 Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757 \u5c5e\u6027\u5b9a\u4f4d\u6a21\u5757 \u65e5\u5fd7\u6a21\u5757 \u952e\u9f20\u64cd\u4f5c\u6a21\u5757 \u6587\u4ef6\u64cd\u4f5c\u6a21\u5757 \u5f55\u5c4f\u6a21\u5757 \u81ea\u5b9a\u4e49\u65ad\u8a00\u6a21\u5757 \u7528\u4f8b\u6267\u884c\u6a21\u5757 PXE \u88c5\u673a\u6a21\u5757 \u952e\u9f20\u4fe1\u53f7\u6a21\u62df\u6a21\u5757 OCR \u6a21\u5757 \u4e1a\u52a1\u5c42\uff1a\u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e94\u7528\u5185\u5305\u542b\u591a\u4e2a\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5982\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7b49\uff0c\u540e\u7eed\u53ef\u4ee5\u6839\u636e\u9700\u8981\u5ac1\u63a5\u8fdb\u6765\u3002\u5176\u4e2d\u529f\u80fd\u6d4b\u8bd5\u8bbe\u8ba1\u601d\u8def\uff1a \u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e76\u5c06\u6d4b\u8bd5\u6570\u636e\u548c\u6d4b\u8bd5\u8d44\u6e90\u6574\u5408\u8fdb\u6765\uff0c\u589e\u52a0\u7528\u4f8b\u6807\u7b7e csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ed9\u6bcf\u6761\u7528\u4f8b\u6253\u6807\u7b7e\u3002 \u5404\u6807\u7b7e\u6240\u4f7f\u7528\u5bf9\u5e94\u7684\u5b57\u6bb5\u540d\u79f0\uff0c\u4f7f\u7528 csv \u6587\u4ef6\u7ef4\u62a4\u7528\u4f8b\u4e0e\u6807\u7b7e\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u5bf9\u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u53ef\u4ee5\u7ec4\u5408\u5176\u4e2d\u7684\u6807\u7b7e\u800c\u4ece\u9a71\u52a8\u5bf9\u5e94\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\uff0c\u517c\u5bb9\u73b0\u6709\u7528\u4f8b\u6807\u7b7e\uff0c\u4e14\u652f\u6301\u7528\u4f8b\u6807\u7b7e\u53ef\u6269\u5c55\uff1b \u4f7f\u7528 csv \u683c\u5f0f\u6587\u4ef6\u53ef\u4ee5\u65b9\u4fbf\u7684\u4f7f\u7528 Excel \u8868\u683c\u6253\u5f00\u8fdb\u884c\u7f16\u8f91\uff0c\u540c\u65f6\u7531\u4e8e csv \u6587\u4ef6\u5b9e\u9645\u662f\u4ee5\u90fd\u597d\u5206\u9694\u7684\u6587\u672c\u6587\u4ef6\uff0c\u4ee3\u7801\u4e2d\u53ef\u4ee5\u5728\u4e0d\u4f9d\u8d56\u4e09\u65b9\u5e93\u7684\u60c5\u51b5\u4e0b\u65b9\u4fbf\u5feb\u901f\u7684\u89e3\u6790\u5b83\uff0c\u53ef\u64cd\u4f5c\u6027\u548c\u53ef\u7ef4\u62a4\u6027\u8f83\u9ad8\u3002 \u5404\u4e2a\u5e94\u7528\u4e4b\u95f4\uff0c\u7528\u4f8b\u3001\u65b9\u6cd5\u3001\u6807\u7b7e\u548c\u8d44\u6e90\u90fd\u662f\u76f8\u4e92\u72ec\u7acb\u7684\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u7528\u4f8b\u65f6\u53ea\u9700\u8981\u81ea\u5df1\u5e94\u7528\u4e0b\u7684\u65b9\u6cd5\u548c\u516c\u5171\u5e93\u5373\u53ef\u3002 \u7ed3\u6784\u4e3e\u4f8b\uff1a .\n\u251c\u2500\u2500 apps\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_album # \u5e94\u7528\u540d (\u7528\u4e0b\u5212\u7ebf\u8fde\u63a5\u662f Python \u7f16\u7801\u89c4\u8303)\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_assert # \u65ad\u8a00\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_function_tag.csv # \u7528\u4f8b\u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 asan_cases # \u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases # \u529f\u80fd\u6d4b\u8bd5\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 res # \u6d4b\u8bd5\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config # \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_widget # \u5e94\u7528\u81ea\u5df1\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_widget # \u65b9\u6cd5\u57fa\u7c7b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 other_widget # \u8c03\u7528\u5176\u4ed6\u5e94\u7528\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_camera\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases\n\u2502\u00a0\u00a0 \u2502\u00a0 ...\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 public_widget # \u516c\u5171\u65b9\u6cd5\u5e93\n\u251c\u2500\u2500 config # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n...\n config \u914d\u7f6e\u6a21\u5757\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u76f8\u5e94\u914d\u7f6e\uff0c\u6d4b\u8bd5\u540c\u5b66\u53ef\u4ee5\u6839\u636e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5728 config \u91cc\u9762\u8fdb\u884c\u914d\u7f6e\u3002 \u5168\u5c40\u914d\u7f6e\uff1a \u6267\u884c\u4e00\u4e2a\u6216\u591a\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff1a\u5728 pattern \u91cc\u9762\u5199\u5165\u5e94\u7528\u5305\u540d\uff0c\u591a\u4e2a\u5e94\u7528\u4e4b\u95f4\u7528 or \u8fde\u63a5\uff0c\u5982 deepin-music or deepin-movie\uff1b \u5192\u70df\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a smoke\uff1b \u96c6\u6210\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a core \uff1b \u5168\u91cf\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u4e3a\u7a7a\u5373\u53ef\uff1b \u901a\u8fc7 tags \u7684\u914d\u7f6e\u6bd4\u8f83\u7075\u6d3b\uff0c\u540e\u9762\u6807\u7b7e\u5316\u7ba1\u7406\u7ae0\u8282\u4f1a\u8bb2\u5230\uff0c\u652f\u6301\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u7075\u6d3b\u914d\u7f6e\u3002 \u6307\u5b9a\u67d0\u53f0\u673a\u5668\u5728\u6307\u5b9a\u955c\u50cf\u7248\u672c\u4e0a\u6267\u884c\u7528\u4f8b\uff1a\u5728 IP \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a IP\uff0c\u5e76\u5728 URL \u91cc\u9762\u586b\u5165\u955c\u50cf\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u6846\u67b6\u4f1a\u8c03\u7528 PXE \u8fdb\u884c\u81ea\u52a8\u88c5\u673a\uff0c\u88c5\u673a\u5b8c\u4e4b\u540e\u81ea\u52a8\u5f00\u59cb\u6267\u884c\u914d\u7f6e\u7684\u6d4b\u8bd5\u7528\u4f8b\u3002 \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\uff1a \u6bcf\u4e2a\u5e94\u7528\u5185\u90e8\u4f1a\u6709\u4e00\u4e2a\u5355\u72ec\u7684\u914d\u7f6e\u6a21\u5757\uff0c\u4f1a\u5305\u542b\u4e00\u4e9b\u672c\u5e94\u7528\u7684\u6d4b\u8bd5\u8d44\u6e90\u7684\u8def\u5f84\u3001\u6267\u884c\u7528\u4f8b\u7684\u6807\u7b7e\u914d\u7f6e\u7b49\u7b49\uff0c\u5982\u679c\u5728\u5c40\u90e8\u914d\u7f6e\u91cc\u9762\u914d\u7f6e\u4e86\u7528\u4f8b\u6267\u884c\u6807\u7b7e\uff0c\u800c\u5916\u5c42 runner \u51fa\u6ca1\u6709\u6307\u5b9a\u6267\u884c\u6807\u7b7e\uff0c\u5219\u5728\u6267\u884c\u65f6\u53ea\u4f1a\u6267\u884c\u5c40\u90e8\u914d\u7f6e\u5df2\u914d\u7f6e\u7684\uff0c\u82e5\u5916\u5c42 runner \u4e5f\u914d\u7f6e\u4e86\u6267\u884c\u6807\u7b7e\uff0c\u5219\u4f1a\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u7528\u4f8b\u3002 \u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u914d\u7f6e\u90fd\u5728\u540c\u4e00\u4e2a\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\uff0cpy \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684\u7c7b\uff0cini \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684 option\u3002 \u5168\u5c40\u914d\u7f6e\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u7b56\u7565\u5982\u4e0b\uff1a \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5c40\u90e8\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5e94\u7528\u5c42\uff1arunner \u662f\u6d4b\u8bd5\u6267\u884c\u7684\u5165\u53e3\uff0c\u5b83\u4f1a\u6839\u636e\u914d\u7f6e\u91cc\u9762\u7684\u914d\u7f6e\u9879\uff0c\u8fdb\u884c\u7528\u4f8b\u7684\u52a0\u8f7d\u548c\u6267\u884c\u3002\u5b83\u63d0\u4f9b\u63a5\u53e3\u7ed9\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\uff0c\u5e73\u53f0\u4e0a\u7684\u6307\u4ee4\u5b9e\u9645\u4e0a\u90fd\u662f\u901a\u8fc7\u4e0b\u53d1\u7ed9 runner\uff0c\u7136\u540e\u7531 runner \u6765\u6267\u884c\u76f8\u5e94\u7684\u6d4b\u8bd5\u3002 \u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u662f\u4e00\u4e2a\u524d\u7aef\u7cfb\u7edf\uff0c\u53ef\u4ee5\u8fdb\u884c\u6d4b\u8bd5\u673a\u7ba1\u7406\u3001\u81ea\u52a8\u5b89\u88c5\u955c\u50cf\u3001\u81ea\u52a8\u5b89\u88c5\u6307\u5b9a\u5e94\u7528\u7248\u672c\u3001\u8fdb\u884c\u6d4b\u8bd5\u7528\u4f8b\u8303\u56f4\u9009\u62e9\u3001\u7528\u4f8b\u89e6\u53d1\u6267\u884c\u63a7\u5236\u3001\u7ed3\u679c\u5c55\u793a\u8f93\u51fa\u7b49\u3002 \u4e00\u4e2a\u5e94\u7528\u7684\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\u90fd\u53ef\u4ee5\u5355\u72ec\u89e6\u53d1\u3002 \u517c\u5bb9\u6027\u6d4b\u8bd5\u4e3b\u8981\u901a\u8fc7 PXE \u670d\u52a1\u5668\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u88c5\u673a\uff0c\u7136\u540e\u914d\u5408 AT \u8fdb\u884c\u6d4b\u8bd5\uff0c\u53ef\u4ee5\u5b9e\u73b0\u4e0d\u540c\u7cfb\u7edf\u7248\u672c\u3001\u4e0d\u540c\u5e94\u7528\u7248\u672c\u73af\u5883\u4e0a\u90fd\u53ef\u4ee5\u8fdb\u884c\u81ea\u52a8\u5316\u7684 AT \u6267\u884c\uff0c\u63d0\u9ad8\u517c\u5bb9\u6027\u6d4b\u8bd5\u6548\u7387\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_4","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_2","title":"1\u3001\u7528\u4f8b\u89e3\u8026","text":"\u5b58\u5728\u8026\u5408\u5173\u7cfb\u7684\u65b9\u6cd5\uff1a\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u88ab\u5916\u90e8\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\uff0c\u5219\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u8026\u5408\u5173\u7cfb\u3002 1.1\u3001\u901a\u8fc7\u7f16\u8f91\u5668 Find Usages \u67e5\u770b\u6bcf\u4e2a\u65b9\u6cd5\u88ab\u8c03\u7528\u7684\u8def\u5f84\u548c\u88ab\u8c03\u7528\u6b21\u6570\uff1b 1.2\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 1 \u4e2a\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728\u5916\u90e8\u5e94\u7528\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1b 1.3\u3001\u64cd\u4f5c\u5c42\u6587\u4ef6\u540d\u5747\u4ee5 widget \u7ed3\u5c3e\uff0c\u7c7b\u540d\u4ee5 Widget \u7ed3\u5c3e\uff0c\u5982\uff1a\u6587\u4ef6\u540d music_widget.py \uff1a class MusicWidget:\n\"\"\"\u97f3\u4e50\u7684\u64cd\u4f5c\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_2","title":"2\u3001\u516c\u5171\u5e93\u5efa\u8bbe","text":"2.1\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 2 \u4e2a\u53ca\u4ee5\u4e0a\u7684\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728 public_widget \u76ee\u5f55\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1bpublic_widget \u5373\u4e3a\u516c\u5171\u65b9\u6cd5\u5e93\uff1b 2.2\u3001\u5728\u7528\u4f8b\u5c42\u4fee\u6539\u7528\u4f8b\u4e2d\u7c7b\u7684\u5bfc\u5165\u8def\u5f84\uff0c\u5c5e\u4e8e\u516c\u5171\u65b9\u6cd5\u7684\u5219\u8c03\u7528 public_widget \u4e2d\u7684\u7c7b\uff0c\u5916\u90e8\u5e94\u7528\u7684\u64cd\u4f5c\u65b9\u6cd5\uff0c\u5219\u8c03\u7528\u672c\u5e94\u7528\u76ee\u5f55\u4e0b\u91cd\u5199\u7684\u5916\u90e8\u5e94\u7528\u65b9\u6cd5\u3002 \u6bd4\u5982\uff1a\u51e0\u4e4e\u6240\u6709\u591a\u5a92\u4f53\u5e94\u7528\u90fd\u9700\u8981\u901a\u8fc7\u6587\u7ba1\u52a0\u8f7d\u8d44\u6e90\uff0c\u8c03\u8d77\u7684\u6587\u7ba1\u5bf9\u8bdd\u6846\u5b9e\u9645\u4e3a dde-desktop\uff0c\u56e0\u6b64\u5c06 desktop_widget.py \u653e\u5230 public_widget \u91cc\u9762\uff1a class DdeDesktopPublicWidget:\n\"\"\"\u516c\u5171-\u684c\u9762\u7684\u64cd\u4f5c\u65b9\u6cd5\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3_1","title":"3\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406","text":"3.1\u3001\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1a\u5bf9\u5e94 core\u3001smoke\uff0c\u6216\u4e3a\u7a7a\uff1b \u7528\u4f8b\u6765\u6e90\uff1a\u5bf9\u5e94 PMS \u7528\u4f8b\u6765\u6e90\uff0c\u5206\u522b\u7528 acp1\u3001acp2\u3001acp3\u3001acp4 \u8868\u793a\u3002 acp1 \uff1a\u4e1a\u52a1\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5199\u7684\u7528\u4f8b\uff0c\u88ab\u7528\u4e8e\u9a8c\u6536\u6d4b\u8bd5\u7684\uff1b acp2 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5f15\u5165\u7684\u4ea7\u54c1\u9a8c\u6536\u6d4b\u8bc4\u90e8\u7684\u7528\u4f8b\uff1b acp3 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u6839\u636e\u4ea7\u54c1\u9700\u6c42\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\uff1b acp4 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u901a\u8fc7\u793e\u533a\u3001\u8bba\u575b\u7528\u6237\u53cd\u9988\u95ee\u9898\u603b\u7ed3\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\u3002 \u4e3e\u4f8b\uff1a \u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u7528\u4f8b\u6765\u6e90 001 L1 core acp1 \u6807\u7b7e\u91c7\u7528\u679a\u4e3e\u7684\u65b9\u5f0f\u8fdb\u884c\u4ee3\u53f7\u7ba1\u7406\u65b9\u4fbf\u7ba1\u7406\u4ee5\u53ca\u540e\u7eed\u6269\u5c55\u3002 3.2\u3001\u5728\u6bcf\u4e2a\u5e94\u7528\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u7b2c\u4e00\u5217\u4e3a\u7528\u4f8b\u7684 ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ba1\u7406\u6a21\u5757\u5185\u7684\u7528\u4f8b\u6807\u7b7e\u3002\u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 3.3\u3001\u5bf9\u7167 PMS \u4e0a\u7528\u4f8b\u7b49\u7ea7\u3001\u7528\u4f8b\u7c7b\u578b\u548c\u7528\u4f8b\u6765\u6e90\uff0c\u6807\u8bb0\u6240\u6709\u5df2\u5b9e\u73b0\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u540e\u7eed\u7f16\u5199\u65b0\u589e\u81ea\u52a8\u5316\u7528\u4f8b\u65f6\uff0c\u6bcf\u5199\u4e00\u6761\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684 csv \u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u6b64\u6761\u7528\u4f8b\u7684\u6807\u7b7e\u3002 3.4\u3001\u8df3\u8fc7\u7528\u4f8b\u6807\u7b7e\u5316 \u73b0\u6709\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a\uff1a \u4e3e\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u8bb0\u4e3a \u201cskip-\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u8bb0\uff0c\u5982\u679c\u5df2\u7ecf\u6807\u8bb0\u4e86\u8df3\u8fc7\u539f\u56e0\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u8bb0\u4e3a SKIPED\uff0c\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\u3002 \u6240\u6709\u7684\u6807\u7b7e\u5728 docs \u76ee\u5f55\u4e0b\u4f1a\u6709\u4e00\u4e2a\u6587\u6863\uff0c\u6587\u6863\u6682\u5b9a\u540d\u79f0\u4e3a\uff1atags_info.md\uff0c\u7528\u4e8e\u8bf4\u660e\u73b0\u5728\u5df2\u7ecf\u4f7f\u7528\u5230\u7684\u6807\u7b7e\uff0c\u4ee5\u53ca\u8fd9\u4e9b\u6807\u7b7e\u7684\u89e3\u91ca\u548c\u7528\u6cd5\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#4","title":"4\u3001\u7528\u4f8b\u6267\u884c","text":"4.1\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u7684\u9a71\u52a8\u6267\u884c\u903b\u8f91\u529f\u80fd\u5b9e\u73b0 \u5f00\u53d1\u6839\u636e\u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\u91cc\u9762\u7684\u7528\u4f8b\u6807\u7b7e\u6267\u884c\u5bf9\u5e94\u7528\u4f8b\u7684\u529f\u80fd\uff0c\u80fd\u652f\u6301\u591a\u4e2a\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u6267\u884c\u5165\u53e3\u80fd\u968f\u610f\u901a\u8fc7\u7528\u4f8b\u6807\u7b7e\u6307\u5b9a\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002 \u7528\u4f8b\u6807\u7b7e\u7684\u9a71\u52a8\u65b9\u5f0f\u5fc5\u987b\u80fd\u652f\u6301\u6807\u7b7e\u7684\u6269\u5c55\uff0c\u672a\u6765\u968f\u7740\u4e1a\u52a1\u7684\u53d8\u5316\u53ef\u80fd\u9700\u8981\u589e\u52a0\u5404\u79cd\u5404\u6837\u7684\u6807\u7b7e\u3002 4.2\u3001\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u6267\u884c \u529f\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u3001\u6027\u80fd\u6d4b\u8bd5\u7b49\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u662f\u5206\u5f00\u6267\u884c\u7684\uff0c\u4e5f\u5c31\u662f\u5728\u4e00\u6b21\u6267\u884c\u4e2d\uff0c\u53ea\u80fd\u6267\u884c\u5176\u4e2d\u4e00\u79cd\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5177\u4f53\u8981\u6267\u884c\u54ea\u4e00\u79cd\u540c\u6837\u901a\u8fc7\u53c2\u6570\u6765\u63a7\u5236\u3002 4.3\u3001\u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c \u7531\u4e8e\u6d4b\u8bd5\u673a\u8d44\u6e90\u6709\u9650\uff0c\u968f\u7740\u81ea\u52a8\u5316\u7528\u4f8b\u6570\u91cf\u7684\u589e\u52a0\uff0cCI \u6267\u884c\u65f6\u95f4\u4f1a\u8d8a\u6765\u8d8a\u957f\u3002 \u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c\u7684\u529f\u80fd\uff1a \u540c\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\u5206\u6563\u5230\u4e0d\u540c\u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u4e0a\u6267\u884c\uff0c\u7f29\u77ed\u6267\u884c\u603b\u65f6\u95f4\uff1b \u7b2c\u4e8c\u5929\u8dd1\u7684\u65f6\u5019\u540c\u4e00\u4e2a\u673a\u5668\u4e0a\u4f1a\u6267\u884c\u6628\u5929\u6ca1\u6709\u6267\u884c\u5230\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u6267\u884c\u540c\u7406\uff1b \u53ef\u4ee5\u5b9e\u73b0\u5728\u5168\u67b6\u6784\u6d4b\u8bd5\u673a\u4e0a\u8f6e\u6d41\u6267\u884c\u7528\u4f8b\uff0c\u65e2\u80fd\u4fdd\u8bc1\u6267\u884c\u4e86\u6240\u6709\u7684\u7528\u4f8b\uff0c\u53c8\u80fd\u5728\u8d44\u6e90\u6709\u9650\u7684\u60c5\u51b5\u4e0b\u8986\u76d6\u4e86\u6240\u6709\u7684\u67b6\u6784\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#5","title":"5\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0","text":"5.1\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u4f5c\u4e3a\u524d\u7aef\u754c\u9762\u7cfb\u7edf\uff0c\u901a\u8fc7\u9875\u9762\u4e0a\u7684\u4e00\u4e9b\u529f\u80fd\u9009\u9879\u8fdb\u884c\u5bf9\u5e94\u6d4b\u8bd5\u4efb\u52a1\u7684\u7ba1\u7406\u6216\u89e6\u53d1\uff0c\u4e1a\u5185\u6bd4\u8f83\u6d41\u884c\u7684\u5b9e\u73b0\u65b9\u6848\u662f\u4f7f\u7528 Vue + DRF \u5b9e\u73b0\u4e00\u4e2a\u524d\u540e\u7aef\u5206\u79bb\u7684\u7cfb\u7edf\u3002 \u6d4b\u8bd5\u5e73\u53f0\u53ef\u80fd\u4f1a\u6d89\u53ca\u5230\u7684\u6a21\u5757\u6709\uff1a\u6d4b\u8bd5\u673a\u8d44\u6e90\u7ba1\u7406\u6a21\u5757\u3001\u7528\u4f8b\u6267\u884c\u63a7\u5236\u6a21\u5757\u3001\u7ed3\u679c\u5c55\u793a\u6a21\u5757\u3001PXE \u955c\u50cf\u5b89\u88c5\u6a21\u5757\u7b49\u3002 \u7528\u6237\uff08\u6d4b\u8bd5\u3001\u7814\u53d1\u540c\u5b66\u7b49\uff09\u53ef\u4ee5\u914d\u7f6e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5982\u6267\u884c\u54ea\u4e2a\u5e94\u7528\u3001\u6267\u884c\u7528\u4f8b\u7684\u8303\u56f4\u3001\u5728\u54ea\u53f0\u673a\u5668\u4e0a\u6267\u884c\u3001\u955c\u50cf\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u5e94\u7528\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u6267\u884c\u65f6\u95f4\u3002 5.2\u3001\u6267\u884c\u5165\u53e3 runner \u63d0\u4f9b\u7ed9\u6d4b\u8bd5\u5e73\u53f0\u7684\u63a5\u53e3\u5305\u62ec\uff1a\u7528\u4f8b\u6267\u884c\u63a5\u53e3\u3001\u7ed3\u679c\u8fd4\u56de\u63a5\u53e3\u3001\u955c\u50cf\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u955c\u50cf\u5b89\u88c5\u63a5\u53e3\u3001\u5e94\u7528\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u5e94\u7528\u5b89\u88c5\u66f4\u65b0\u63a5\u53e3\u7b49\u3002 \u524d\u7aef\u5e73\u53f0\u76ee\u524d\u8fd8\u6ca1\u6709\u592a\u591a\u8be6\u7ec6\u7684\u65b9\u6848\uff0c\u672c\u6b21\u8bbe\u8ba1\u4e3b\u8981\u96c6\u4e2d\u5728\u540e\u7aef\u8fd9\u90e8\u5206\u67b6\u6784\u7684\u8bbe\u8ba1\u4e0a\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_5","title":"\u56db\u3001\u5b9e\u65bd\u8ba1\u5212","text":"\u8fd1\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u6587\u7ba1\u4ee3\u7801\u89e3\u8026 2022/3/28 2022/4/8 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u56fe\u5f62\u56fe\u50cf\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u97f3\u89c6\u9891\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5168\u5c40\u641c\u7d22\u4ee3\u7801\u89e3\u8026 2022/4/25 2022/4/26 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u516c\u5171\u5e93\u5efa\u8bbe 2022/4/27 2022/5/5 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5c01\u88c5\u7684\u65b9\u6cd5\u6574\u7406\u6210\u4e00\u4e2a\u8868 2022/5/6 2022/5/10 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7528\u4f8b\u6807\u7b7e\u5206\u7c7b\u8bc4\u4f30 2022/5/11 2022/5/11 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u6807\u7b7e\u5316\u6267\u884c\u9a71\u52a8\u7a0b\u5e8f\u7f16\u5199 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u9700\u5b9e\u73b0\u81ea\u52a8\u89e3\u6790 csv \u8868\u683c\u4e2d\u7684\u7528\u4f8b\u7f16\u53f7 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u722c\u866b\u811a\u672c\uff0c\u722c\u53d6 pms \u4e0a\u7528\u4f8b\u7684\u6807\u7b7e 2022/5/11 2022/5/13 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u5b9a\u65f6\u81ea\u52a8\u7ef4\u62a4\u672c\u5730 csv \u6587\u4ef6\u811a\u672c 2022/5/11 2022/5/20 \u4e2d\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u76ee\u5f55\u7ed3\u6784\u8c03\u6574 2022/5/20 2022/6/2 \u5b8c\u6210\u5168\u5c40\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u5177\u4f53\u65b9\u6848\u548c\u903b\u8f91\u5b9e\u73b0 2022/6/6 2022/6/17 \u9759\u6001\u626b\u63cf\u95ee\u9898\u6e05\u96f6 2022/6/20 2022/7/1 \u5b8c\u6210\u65b0\u6846\u67b6\u4f7f\u7528\u57f9\u8bad 2022/7/4 2022/7/11 \u843d\u5730\u8fd0\u884c 2022/7/12 2022/7/20 \u5e95\u5c42\u5e93\u7528\u9014\u8bf4\u660e\u6587\u6863\u7f16\u5199 2022/7/21 2022/7/28"}]} \ No newline at end of file +{"config":{"lang":["en"],"separator":"[\\s\\u200b\\u3000\\-\u3001\u3002\uff0c\uff0e\uff1f\uff01\uff1b]+","pipeline":["stemmer"]},"docs":[{"location":"","title":"\u9996\u9875","text":""},{"location":"#youqu","title":"\u6709\u8da3\uff08YouQu\uff09","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/4/1\n# Author : Mikigo\n# =============================================\n \u672c\u7ad9\u603b\u8bbf\u95ee\u91cf \u6b21 \u6b22\u8fce\u5728\u6d4f\u89c8\u5668\u8bbf\u95ee\u3010\u516c\u7f51\u6587\u6863\u3011 \u7edf\u4fe1\u516c\u53f8\u5185\u7f51\u8fd8\u53ef\u4ee5\u8bbf\u95ee\u3010\u5185\u7f51\u6587\u6863\u3011\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u54e6~~"},{"location":"#_1","title":"\u4e00\u3001\u7b80\u4ecb","text":"\u6709\u8da3\uff08YouQu\uff09\u662f\u6df1\u5ea6\u79d1\u6280\u8bbe\u8ba1\u548c\u5f00\u53d1\u7684\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff0c\u91c7\u7528\u7ed3\u6784\u5206\u5c42\u7684\u8bbe\u8ba1\u7406\u5ff5\uff0c\u652f\u6301\u591a\u5143\u5316\u5143\u7d20\u5b9a\u4f4d\u548c\u65ad\u8a00\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\u3001\u5f3a\u5927\u7684\u65e5\u5fd7\u548c\u62a5\u544a\u8f93\u51fa\u7b49\u7279\u8272\u529f\u80fd\uff0c\u540c\u65f6\u5b8c\u7f8e\u517c\u5bb9X11\u3001Wayland\u663e\u793a\u534f\u8bae\uff0c\u73af\u5883\u90e8\u7f72\u7b80\u5355\uff0c\u64cd\u4f5c\u6613\u4e0a\u624b\u3002"},{"location":"#17","title":"\u7231\u4e0a \u201c\u6709\u8da3\u201d \u7684 17 \u4e2a\u7406\u7531","text":" \u6838\u5fc3\u5e93\u63d0\u4f9b\u4e86\u7edf\u4e00\u7684\u63a5\u53e3\uff0c\u7f16\u5199\u65b9\u6cd5\u65f6\u53ea\u9700\u8981\u5bfc\u5165\u4e00\u4e2a\u5305\u5c31\u53ef\u4ee5\u4f7f\u7528\u5230\u6838\u5fc3\u5e93\u63d0\u4f9b\u7684\u6240\u6709\u529f\u80fd\uff1b \u516c\u5171\u5e93\u5c01\u88c5\u4e86\u5f88\u591a\u5e38\u7528\u6a21\u5757\u7684\u76f8\u5173\u65b9\u6cd5\uff0c\u6bd4\u5982\uff1a\u4efb\u52a1\u680f\u7684\u64cd\u4f5c\u3001\u684c\u9762\u7684\u64cd\u4f5c\u3001\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\u7b49\u7b49\uff1b \u9664\u4e86\u5e38\u7528\u7684\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u8bc6\u522b\u4ee5\u5916\uff0c\u6211\u4eec\u8fd8\u63d0\u4f9b\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u5176\u4f7f\u7528\u7b80\u5355\u4e14\u9ad8\u6548\uff0c\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff1b \u5bf9\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u5c06\u7f16\u5199\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\u53d8\u5f97\u7b80\u5355\u800c\u4f18\u96c5\uff1b \u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u6280\u672f\u8fdb\u884c\u529f\u80fd\u5347\u7ea7\uff0c\u9664\u4e86\u652f\u6301\u5355\u4e2a\u5750\u6807\u8fd4\u56de\uff0c\u8fd8\u652f\u6301\u540c\u4e00\u754c\u9762\u4e0b\u591a\u4e2a\u76f8\u540c\u5143\u7d20\u8fd4\u56de\u591a\u4e2a\u5750\u6807\u7684\u529f\u80fd\uff1b \u63d0\u4f9b\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u548c\u6279\u91cf\u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u4e0d\u5230\u4e00\u4e2a csv \u6587\u4ef6\u539f\u6765\u80fd\u5e72\u8fd9\u4e48\u591a\u4e8b\u60c5\uff1b \u63d0\u4f9b\u4e86\u529f\u80fd\u5f3a\u5927\u7684\u6267\u884c\u5668\u5165\u53e3\uff0c\u8ba9\u4f60\u53ef\u4ee5\u65b9\u4fbf\u7684\u5728\u672c\u5730\u6267\u884c\u4efb\u4f55\u7528\u4f8b\u96c6\u7684\u7528\u4f8b\uff0c\u5176\u4e30\u5bcc\u7684\u81ea\u5b9a\u4e49\u914d\u7f6e\u9879\uff0c\u6ee1\u8db3\u4f60\u5bf9\u6267\u884c\u5668\u6240\u6709\u7684\u5e7b\u60f3\uff1b \u63d0\u4f9b\u8fdc\u7a0b\u6267\u884c\u7684\u529f\u80fd\uff0c\u53ef\u4ee5\u63a7\u5236\u591a\u53f0\u673a\u5668\u5e76\u884c\u8dd1\uff0c\u6216\u8005\u5206\u5e03\u5f0f\u8dd1\uff0c\u8fd9\u79cd\u4ed8\u8d39\u529f\u80fd\u73b0\u5728\u514d\u8d39\u7ed9\u4f60\u7528\uff1b \u63d0\u4f9b\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u529f\u80fd\uff0c\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u6bcf\u4e2a\u65b9\u6cd5\u5355\u72ec\u5199\u8f93\u51fa\u65e5\u5fd7\u7684\u4ee3\u7801\uff0c\u4e00\u5207\u6211\u4eec\u7ed9\u4f60\u641e\u5b9a\u4e86\uff0c\u65e5\u5fd7\u8f93\u51fa\u4e0d\u4ec5\u5185\u5bb9\u4e30\u5bcc\uff0c\u989c\u503c\u4e5f\u7edd\u5bf9\u5728\u7ebf\uff0c\u6211\u4eec\u8fd8\u81ea\u5df1\u8bbe\u8ba1\u4e86\u4e00\u6b3e\u7ec8\u7aef\u8f93\u51fa\u4e3b\u9898\u53eb\u300a\u4e94\u5f69\u6591\u6593\u7684\u9ed1\u300b\uff1b \u63d0\u4f9b\u4e86\u4e00\u952e\u90e8\u7f72\u81ea\u52a8\u5316\u6d4b\u8bd5\u73af\u5883\u7684\u529f\u80fd\uff0c\u8fde\u4ee3\u7801\u7f16\u8f91\u5668\u90fd\u7ed9\u4f60\u88c5\u597d\u4e86\uff0c\u8ba9\u4f60\u518d\u4e5f\u4e0d\u7528\u4e3a\u73af\u5883\u90e8\u7f72\u800c\u70e6\u607c\uff1b \u63d0\u4f9b\u4e86\u81ea\u52a8\u751f\u6210\u591a\u79cd\u62a5\u544a\u7684\u529f\u80fd\uff0c\u4f60\u60f3\u8f93\u51fa\u4ec0\u4e48\u62a5\u544a\u5f62\u5f0f\u90fd\u884c\uff0c\u800c\u4e14\u6211\u4eec\u5728\u62a5\u544a\u4e2d\u8fd8\u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\u548c\u5931\u8d25\u622a\u56fe\u7684\u529f\u80fd\uff1b \u5bf9\u65ad\u8a00\u8fdb\u884c\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u63d0\u4f9b\u66f4\u53cb\u597d\u5316\u7684\u9519\u8bef\u63d0\u793a\uff0c\u8ba9\u5b9a\u4f4d\u95ee\u9898\u7cbe\u51c6\u9ad8\u6548\uff1b \u4e0d\u4ec5\u652f\u6301\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u63a7\u5236\uff0c\u800c\u4e14\u8fd8\u652f\u6301\u52a8\u6001\u63a7\u5236\u7528\u4f8b\u6279\u91cf\u6267\u884c\u7684\u603b\u65f6\u95f4\uff0c\u786e\u4fdd CI \u73af\u5883\u4e0b\u80fd\u987a\u7545\u8fd0\u884c\uff1b \u652f\u6301\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\u6267\u884c\u3001PMS \u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6807\u7b7e\u5316\u6267\u884c\u65b9\u6848\uff0c\u6ee1\u8db3\u4f60\u5404\u79cd\u573a\u666f\u4e0b\u7684\u6267\u884c\u9700\u6c42\uff1b \u652f\u6301\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u529f\u80fd\uff0c\u53ef\u5b9a\u4f4d\u53ef\u65ad\u8a00\uff0c\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\uff1b \u5b8c\u7f8e\u517c\u5bb9 Wayland \u548c X11\uff0c\u771f\u6b63\u505a\u5230\u4e00\u5957\u4ee3\u7801\uff0c\u968f\u5904\u6267\u884c\uff1b \u652f\u6301\u591a\u79cd\u65b9\u5f0f\u7684\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u5176\u4e2d\u5f02\u6b65\u56de\u586b\u7684\u65b9\u6848\uff0c\u5b8c\u7f8e\u89e3\u51b3\u4e86\u6570\u636e\u56de\u586b\u7684\u8017\u65f6\u95ee\u9898\uff1b \u3010\u89c6\u9891\u4ecb\u7ecd\u3011"},{"location":"#_2","title":"\u4e8c\u3001\u5b89\u88c5\u4f7f\u7528","text":"\u57fa\u7840\u6846\u67b6\uff1ahttps://github.com/linuxdeepin/deepin-autotest-framework \u4ece PyPI \u5b89\u88c5: sudo pip3 install youqu\n \u521b\u5efa\u9879\u76ee: youqu-startproject youqu\n \u5b89\u88c5\u4f9d\u8d56: cd youqu\nbash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002 \u5e94\u7528\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684\u5e94\u7528\u540d\u79f0\u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music cd apps/\n \u5c06\u5e94\u7528\u5e93\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u50cf\u8fd9\u6837\uff1a youqu\n\u251c\u2500\u2500 apps\n\u2502 \u251c\u2500\u2500 autotest_deepin_music # \u5e94\u7528\u5e93\n...\n \u5e94\u7528\u5e93\u7684\u540d\u79f0\u4e0d\u53ef\u4ee5\u4fee\u6539\u3002"},{"location":"#_3","title":"\u4e09\u3001\u8fd0\u884c","text":""},{"location":"#1","title":"1. \u5de5\u4f5c\u7a7a\u95f4","text":"\u57fa\u7840\u6846\u67b6\u5de5\u7a0b\u76ee\u5f55\u5efa\u8bae\u653e\u5728 ~ \u76ee\u5f55\u4e0b\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u4e5f\u53ef\u4ee5\u8fd0\u884c\uff0c\u4f46\u662f\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u9700\u8981\u505a\u73af\u5883\u6e05\u7406\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u5b58\u5728\u4ee3\u7801\u88ab\u5220\u9664\u7684\u98ce\u9669\u3002 \u5982\u679c\u4f60\u7684\u673a\u5668\u4e0a\u4e0d\u540c\u76ee\u5f55\u4e0b\u5b58\u5728\u591a\u4e2a YouQu \u5de5\u7a0b\uff0c\u90a3\u4e48\u5728\u8fd0\u884c\u4e4b\u524d\uff0c\u8bf7\u5148\u6267\u884c env.sh \u6821\u6b63\u76f8\u5173\u73af\u5883\u3002"},{"location":"#2","title":"2. \u6267\u884c\u5668","text":"\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u6709\u4e00\u4e2a manage.py \uff0c\u5b83\u662f\u4e00\u4e2a\u6267\u884c\u5668\u5165\u53e3\uff0c\u63d0\u4f9b\u4e86\u672c\u5730\u6267\u884c\u3001\u8fdc\u7a0b\u6267\u884c\u7b49\u7684\u529f\u80fd\u3002 \u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6765\u6267\u884c\uff1a youqu manage.py run -a deepin-music\n"},{"location":"#21","title":"2.1. \u672c\u5730\u6267\u884c","text":"youqu manage.py run\n"},{"location":"#211","title":"2.1.1. \u914d\u7f6e\u6587\u4ef6","text":"\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u914d\u7f6e\u53c2\u6570 \u5728\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u91cc\u9762\u652f\u6301\u914d\u7f6e\u5bf9\u6267\u884c\u7684\u4e00\u4e9b\u53c2\u6570\u8fdb\u884c\u914d\u7f6e\uff0c\u5e38\u7528\u7684\u5982\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;-----------------------------------------------\n;1.KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2.KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f\n;e.g. TAGS = L1 or smoke\n;-----------------------------------------------\n;\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\uff0c\u5c06\u8981\u6267\u884c\u7684\u7528\u4f8b\u5199\u5165\u6307\u5b9a\u7684 csv \u6587\u4ef6\n;\u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u4ece\u57fa\u7840\u6846\u67b6\u6839\u76ee\u5f55\u5f00\u59cb\uff1ae.g. CASE_FILE = case_list.txt\n;\u5982\u679c\u8fd9\u91cc\u6709\u503c\uff0cAPP_NAME KEYWORDS TAGS \u7684\u914d\u7f6e\u5747\u4e0d\u751f\u6548\nCASE_FILE =\n;=============================== RUNNER CONFIG ===================================\n[runner]\n;\u6700\u5927\u5931\u8d25\u7528\u4f8b\u6570\u91cf\u7684\u5360\u6bd4\n;\u6bd4\u5982\uff1a\u603b\u6267\u884c\u7528\u4f8b\u6570\u4e3a 100, \u82e5 MAX_FAIL = 0.5,\u5219\u5931\u8d25\u7528\u4f8b\u6570\u8fbe\u5230 50 \u5c31\u4f1a\u7ec8\u6b62\u6d4b\u8bd5\u3002\nMAX_FAIL = 1\n;\u5355\u6761\u7528\u4f8b\u7684\u8d85\u65f6\u65f6\u95f4\uff0c\u5982\u679c\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u8d85\u65f6\uff0c\u8fd9\u6761\u7528\u4f8b\u4f1a\u88ab\u505c\u6b62\uff0c\u540e\u7eed\u7528\u4f8b\u7ee7\u7eed\u6267\u884c\u3002\n;\u5355\u4f4d\u4e3a\u79d2\n;\u8fd9\u662f\u4e00\u4e2a\u5168\u5c40\u7edf\u4e00\u914d\u7f6e\uff0c\u5982\u679c\u67d0\u6761\u7528\u4f8b\u9700\u8981\u5355\u72ec\u914d\u7f6e\u8d85\u65f6\u65f6\u95f4\uff0c\u53ef\u4ee5\u5728\u7528\u4f8b\u4e2d\u8fd9\u6837\u5199\uff1a\n;@pytest.mark.timeout(500)\n;def test_xxx_001():\n; ...\n;\u4f1a\u8bdd\u8d85\u65f6\uff08\u6240\u6709\u7528\u4f8b\u6267\u884c\u7684\u8d85\u65f6\u65f6\u95f4\uff09\u662f\u6839\u636e\u5168\u5c40\u8d85\u65f6\u914d\u7f6e\u548c\u7528\u4f8b\u5355\u72ec\u8d85\u65f6\u914d\u7f6e\u81ea\u52a8\u8ba1\u7b97\u7684\u3002\nCASE_TIME_OUT = 200\n;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\n;\u6ce8\u610f\uff0cRERUN = 1 \u8868\u793a\u91cd\u8dd1 1 \u6b21\uff0c\u5373\u7b2c\u4e00\u6b21\u7528\u4f8b\u6267\u884c\u5931\u8d25\u4f1a\u81ea\u52a8\u91cd\u8dd1 1 \u6b21\uff0c\u603b\u5171\u6267\u884c 2 \u6b21\uff1b\n;\u5982\u679c\u7b2c 2 \u6b21\u6267\u884c\u6210\u529f\uff0c\u7ed3\u679c\u6210\u529f\uff0c\u5931\u8d25\u4ea6\u4e3a\u5931\u8d25\u3002\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c 1 \u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff0cRERUN >= RECORD_FAILED_CASE\u3002\n;1.\u5173\u95ed\u5f55\u5c4f\uff1aRECORD_FAILED_CASE > RERUN\n;2.\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1aRECORD_FAILED_CASE = 0\nRECORD_FAILED_CASE = 1\n;yes \u6bcf\u6761\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u8fdb\u884c\u73af\u5883\u6e05\u7406\nCLEAN_ALL = yes\n;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387, \u6bd4\u5982\uff1a1920x1080\n;no: \u8868\u793a\u4e0d\u505a\u5206\u8fa8\u7387\u6821\u9a8c\nRESOLUTION = 1920x1080\n;\u4e0d\u8df3\u8fc7\u7528\u4f8b\uff0ccsv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86 skip-xxx\u7684\u7528\u4f8b\u4e0d\u8df3\u8fc7\nNOSKIP = no\n;ignore fixed\n;no\uff0c\u53ea\u8981\u6807\u8bb0\u4e86fixed\u7684\u7528\u4f8b\uff0c\u5373\u4f7f\u6807\u8bb0\u4e86skip-\uff0c\u4e5f\u4f1a\u6267\u884c\uff1b\n;yes\uff0cfixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\uff1b\nIFIXED = no\n;\u8981\u5b89\u88c5deb\u5305\u7684\u8def\u5f84\n;e.g : ~/Downloads/ \u5b89\u88c5\u4e0b\u8f7d\u76ee\u5f55\u4e0b\u7684deb\u5305\uff0c\u5982\u679c\u662f\u8fdc\u7a0b\u6267\u884c\uff0c\u4f1a\u81ea\u52a8\u62f7\u8d1d\u5230\u8fdc\u7a0b\u5e76\u5b89\u88c5\u3002\nDEB_PATH =\n;DEBUG \u6a21\u5f0f\u6267\u884c\u7528\u4f8b\uff0c\u53ea\u6536\u96c6\u4e0d\u6267\u884c\u7528\u4f8b\uff0c\u4e5f\u4e0d\u505a\u8bbe\u5907\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002\nDEBUG = no\n;\u8bb0\u5f55top\u547d\u4ee4\u67e5\u8be2\u7684\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0cTOP = 3 \u8868\u793a\u8bb0\u5f55\u524d3\u4e2a\u8fdb\u7a0b\u3002\nTOP =\n;\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\nREPEAT =\n;\u9ed8\u8ba4\u5728\u6240\u6709\u6d4b\u8bd5\u5b8c\u6210\u4e4b\u540e\u8f93\u51fa\u62a5\u9519\u4fe1\u606f.\n;yes, \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\nDURING_FAIL = no\n;\u6ce8\u518c\u81ea\u542f\u670d\u52a1\nAUTOSTART = no\n;=============================== REPORT CONFIG ===================================\n[report]\n;\u6d4b\u8bd5\u62a5\u544a\u7684title\nREPORT_TITLE = YouQu Report\n;\u6d4b\u8bd5\u62a5\u544a\u7684name\nREPORT_NAME = YouQu Report\n;\u6d4b\u8bd5\u62a5\u544a\u7684\u9ed8\u8ba4\u8bed\u8a00\n;en:English\n;ru:\u0420\u0443\u0441\u0441\u043a\u0438\u0439\n;zh:\u4e2d\u6587\n;de:Deutsch\n;nl:Nederlands\n;he:Hebrew\n;br:Brazil\n;pl:Polski\n;ja:\u65e5\u672c\u8a9e\n;es:Espa\u00f1ol\n;kr:\ud55c\uad6d\uc5b4\n;fr:Fran\u00e7ais\n;az:Az\u0259rbaycanca\nREPORT_LANGUAGE = zh\n;\u7528\u4f8b\u6267\u884c\u5b8c\u540e\u751f\u6210\u7684\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n;\u76ee\u524d\u652f\u6301 allure, xml, json \uff08\u652f\u6301\u540c\u65f6\u751f\u6210\uff09\nREPORT_FORMAT = allure, xml, json\n;\u6307\u5b9a\u62a5\u544a\u751f\u6210\u7684\u8def\u5f84\uff08\u76f8\u5bf9\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\uff09\nALLURE_REPORT_PATH = report/\nXML_REPORT_PATH = report/\nJSON_REPORT_PATH = report/\n;=============================== GLOBAL CONFIG ===================================\n[globalconfig]\n;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\nPASSWORD = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\nIMAGE_MATCH_NUMBER = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6bcf\u6b21\u95f4\u9694\u7b49\u5f85\u65f6\u95f4\nIMAGE_MATCH_WAIT_TIME = 1\n;\u56fe\u50cf\u8bc6\u522b\u5339\u914d\u5ea6\nIMAGE_RATE = 0.9\n;\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u5b9e\u65f6\u56fe\u50cf\u4fdd\u5b58\u8def\u5f84\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u5750\u6807\nSCREEN_CACHE = /tmp/screen.png\n;\u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\u7684\u8def\u5f84\nTMPDIR = /tmp/tmpdir\n;\u7cfb\u7edf\u4e3b\u9898\nSYS_THEME = deepin\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = youqu-dev.uniontech.com\n;OpenCV\u670d\u52a1\u7aef\u5730\u5740\nOPENCV_SERVER_HOST = youqu-dev.uniontech.com\n;=============================== PMS CONFIG ===================================\n;PMS\u76f8\u5173\u914d\u7f6e\uff0c\u5305\u542b\u4ee5\u4e0b\u51e0\u4e2a\u65b9\u9762\uff1a\n;1.PMS\u6d4b\u8bd5\u5957\u6267\u884c\n;2.\u81ea\u52a8\u4ecePMS\u722c\u53d6\u6570\u636e\u5e76\u540c\u6b65\u672c\u5730CSV\u6587\u4ef6\n;3.PMS\u6570\u636e\u56de\u586b\n[pms]\n;PMS\u7684\u7528\u6237\u540d,\u5982: ut001234\nPMS_USER =\n;PMS\u7684\u5bc6\u7801\nPMS_PASSWORD =\n;PMS\u6d4b\u8bd5\u5957\u7684ID\n;\u5728PMS\u4e0a\u67e5\u770b\u7528\u4f8b\u201c\u5957\u4ef6\u201d\u94fe\u63a5: https://pms.uniontech.com/testsuite-view-495.html\n;\u6d4b\u8bd5\u5957ID\u4e3a: 495\nSUITE_ID =\n;\u6570\u636e\u56de\u586b\u5fc5\u987b\u5173\u8054PMS\u6d4b\u8bd5\u5355\n;\u5728PMS\u4e0a\u67e5\u770b\u6d4b\u8bd5\u5355\u94fe\u63a5: https://pms.uniontech.com/testtask-cases-20747.html\n;\u6d4b\u8bd5\u5355ID\u4e3a: 20747\nTASK_ID =\n;\u5c06\u6d4b\u8bd5\u7ed3\u679c\u6570\u636e\u56de\u586b\u5230PMS\n;\u4e3a\u7a7a: \u8868\u793a\u4e0d\u56de\u586b,\u4e0d\u4f1a\u5728\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u751f\u6210json\u7ed3\u679c\u6587\u4ef6;\n;async: \u8868\u793a\u9010\u6761\u5f02\u6b65\u56de\u586b,\u540e\u9762\u4e00\u6761\u6267\u884c\u5f00\u59cb\u65f6\u901a\u8fc7\u5b50\u7ebf\u7a0b\u5bf9\u524d\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u8fdb\u884c\u56de\u586b\uff0c\u5982\u6b64\u5b9e\u73b0\u65f6\u95f4\u6548\u7387\u6700\u5927\u5316;\n;finish: \u8868\u793a\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u6210\u4e4b\u540e\u9010\u4e2a\u56de\u586b(PMS\u4e0d\u652f\u6301\u5e76\u53d1);\nSEND_PMS =\n;\u6570\u636e\u56de\u586b\u7684\u89e6\u53d1\u8005\n;auto: \u6846\u67b6\u81ea\u52a8\u56de\u586b,\u914d\u5408SEND_PMS\u914d\u7f6e\u4f7f\u7528,\u4f60\u53ef\u4ee5\u9009\u62e9\u5728\u4e0d\u540c\u7684\u9636\u6bb5\u8fdb\u884c\u6570\u636e\u56de\u586b;\n;hand: \u624b\u52a8\u56de\u586b,\u6bcf\u6761\u7528\u4f8b\u4ecd\u7136\u4f1a\u751f\u6210json\u6587\u4ef6,\u4f46\u6846\u67b6\u4e0d\u4f1a\u8fdb\u884c\u6570\u636e\u56de\u586b,\u9700\u8981\u4f60\u53ef\u4ee5\u5728\u4f60\u60f3\u8981\u53d1\u9001\u7684\u65f6\u95f4\u70b9\u624b\u52a8\u89e6\u53d1\u56de\u586b;\nTRIGGER = auto\n;PMS\u56de\u586b\u7684\u91cd\u8bd5\u6b21\u6570\n;\u5982\u679c\u63a5\u53e3\u8bf7\u6c42\u5931\u8d25,\u4f1a\u8fdb\u884c\u91cd\u8bd5\nSEND_PMS_RETRY_NUMBER = 2\n[csv_link_pms_lib]\n;caselib: \u7528\u4f8b\u5e93\n;testcase: \u4ea7\u54c1\u5e93\u7528\u4f8b\nCASE_FROM = caselib\n[csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/caselib-browse-81.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 81\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic =\n[export_csv]\n;\u5bfc\u51fa\u7684csv\u6587\u4ef6\u540d\u79f0\uff0c\u9ed8\u8ba4 case_list.csv\nCSV_FILE = case_list.csv\n;exportcsv \u547d\u4ee4\u5bfc\u51fa case_list.csv \u6587\u4ef6\u65f6\u914d\u7f6e\u7684\u5b57\u6bb5\u540d\uff0c\u7528\u4f8b\u540d\u79f0\u9ed8\u8ba4\u5b58\u5728\u7b2c\u4e00\u5217\uff0c\u65e0\u9700\u6dfb\u52a0\nCSV_HEARD = \u7528\u4f8b\u7ea7\u522b,\u7528\u4f8b\u7c7b\u578b,\u6d4b\u8bd5\u7ea7\u522b,\u662f\u5426\u8df3\u8fc7\n[log_cli]\n;\u65e5\u5fd7\u76f8\u5173\u914d\u7f6e\uff08\u4e0d\u6253\u5370\u6784\u9020\u51fd\u6570\u548c\u9b54\u6cd5\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff09\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = DEBUG\n# ============= \u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u914d\u7f6e ================\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u5f00\u5934\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7, \u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_STARTSWITH = Assert\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u7ed3\u5c3e\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_ENDSWITH = Widget\n;\u652f\u6301\u7c7b\u540d\u5305\u542b xxx \u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_CONTAIN = ShortCut\n# ==============================================\n \u914d\u7f6e\u5b8c\u6210\u4e4b\u540e\uff0c\u76f4\u63a5\u5728\u547d\u4ee4\u884c\u6267\u884c manage.py \u5c31\u597d\u4e86\u3002 youqu manage.py run\n"},{"location":"#212","title":"2.1.2. \u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a youqu manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -h, --help show this help message and exit\n-a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--record_failed_case RECORD_FAILED_CASE\n\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--max_fail MAX_FAIL \u6700\u5927\u5931\u8d25\u7387\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--resolution RESOLUTION\n\u68c0\u67e5\u5206\u8fa8\u7387\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms {,async,finish}\n\u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--trigger {,auto,hand}\n\u89e6\u53d1\u8005\n-f CASE_FILE, --case_file CASE_FILE\n\u6839\u636e\u6587\u4ef6\u6267\u884c\u7528\u4f8b\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n--pms_user PMS_USER pms \u7528\u6237\u540d\n--pms_password PMS_PASSWORD\npms \u5bc6\u7801\n--suite_id SUITE_ID pms \u6d4b\u8bd5\u5957ID\n--pms_info_file PMS_INFO_FILE\npms \u4fe1\u606f\u6587\u4ef6\n--top TOP \u8fc7\u7a0b\u4e2d\u8bb0\u5f55top\u547d\u4ee4\u4e2d\u7684\u503c\n--lastfailed \u4ec5\u6267\u884c\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\n--duringfail \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\n--repeat REPEAT \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n--project_name PROJECT_NAME\n\u5de5\u7a0b\u540d\u79f0\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--build_location BUILD_LOCATION\n\u6784\u5efa\u5730\u533a\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--line LINE \u6267\u884c\u7684\u4e1a\u52a1\u7ebf\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--autostart AUTOSTART \u7528\u4f8b\u6267\u884c\u7a0b\u5e8f\u6ce8\u518c\u5230\u5f00\u673a\u81ea\u542f\u670d\u52a1\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a youqu manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\"\n \u547d\u4ee4\u884c\u53c2\u6570\u4f18\u5148\u7ea7\u662f\u9ad8\u4e8e\u914d\u7f6e\u6587\u4ef6\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u4e86\u5bf9\u5e94\u7684\u53c2\u6570\uff0c\u914d\u7f6e\u6587\u4ef6\u4e2d\u4e0d\u7ba1\u662f\u5426\u914d\u7f6e\u5747\u4e0d\u751f\u6548\u3002 --app \u5165\u53c2\u8fd8\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\uff0c\u4e0b\u9762\u7684\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u540c\u6837\u652f\u6301\u3002"},{"location":"#22","title":"2.2. \u8fdc\u7a0b\u6267\u884c","text":"\u8fdc\u7a0b\u6267\u884c\u5c31\u662f\u7528\u672c\u5730\u4f5c\u4e3a\u670d\u52a1\u7aef\u63a7\u5236\u8fdc\u7a0b\u673a\u5668\u6267\u884c\uff0c\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u76f8\u540c\uff1b \u4f7f\u7528 remote \u547d\u4ee4\uff1a youqu manage.py remote\n"},{"location":"#221","title":"2.2.1. \u8fdc\u7a0b\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u6267\u884c","text":"\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u6267\u884c\u5c31\u662f\u7531\u672c\u5730 YouQu \u4f5c\u4e3a\u670d\u52a1\u7aef\uff0c\u63a7\u5236\u8fdc\u7a0b N \u53f0\u673a\u5668\u6267\u884c\u76f8\u540c\u7684\u7528\u4f8b\uff0c\u6267\u884c\u5b8c\u4e4b\u540e\u6240\u6709\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u7ed3\u679c\u4f1a\u8fd4\u56de\u7ed9\u670d\u52a1\u7aef report \u76ee\u5f55\u4e0b\uff1b \u8fdc\u7a0b\u6267\u884c\u540c\u6837\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u8fdb\u884c\u7528\u4f8b\u76f8\u5173\u914d\u7f6e\uff1b \u9700\u8981\u91cd\u70b9\u8bf4\u4e00\u4e0b\u8fdc\u7a0b\u6267\u884c\u65f6\u7684\u6d4b\u8bd5\u673a\u4fe1\u606f\u914d\u7f6e\uff0c\u5728\u914d\u7f6e\u6587\u4ef6 setting/remote.ini \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\u3001IP\u3001\u5bc6\u7801\u3002 ;=============================== CLIENT LIST =====================================\n; \u6d4b\u8bd5\u673a\u914d\u7f6e\u5217\u8868\n;[client{number}] ;\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u6709\u591a\u5c11\u53f0\u6d4b\u8bd5\u673a\u5c31\u5199\u591a\u5c11\u4e2a client\uff0c\u522b\u540d\u5fc5\u987b\u5305\u542b client \u5b57\u7b26\uff0c\u4e14\u4e0d\u80fd\u91cd\u590d\u3002\n;user = ;\u6d4b\u8bd5\u673a user\n;ip = ;\u6d4b\u8bd5\u673a ip\n;password = 1 ;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801, \u53ef\u4ee5\u4e0d\u914d\u7f6e\u6b64\u9879\uff0c\u9ed8\u8ba4\u53d6 CLIENT_PASSWORD \u7684\u503c\uff1b\n;\u5982\u679c\u4f60\u6240\u6709\u6d4b\u8bd5\u673a\u5bc6\u7801\u90fd\u76f8\u540c\uff0c\u90a3\u4e48\u53ea\u9700\u8981\u914d\u7f6e CLIENT_PASSWORD \u5c31\u53ef\u4ee5\u4e86\n;=================================================================================\n[client1]\nuser = uos\nip = 10.8.15.xx\n[client2]\nuser = uos\nip = 10.8.15.xx\n[client3]\nuser = uos\nip = 10.8.11.xx\n \u6709\u591a\u5c11\u53f0\u673a\u5668\u5c31\u50cf\u8fd9\u6837\u53c2\u8003\u4e0a\u9762\u7684\u683c\u5f0f\u5199\u5c31\u884c\u4e86\u3002 \u7136\u540e\u5728\u547d\u4ee4\u884c\uff1a youqu manage.py remote\n \u8fd9\u6837\u8fd0\u884c\u662f\u4ece\u914d\u7f6e\u6587\u4ef6\u53bb\u8bfb\u53d6\u76f8\u5173\u914d\u7f6e\u3002 \u5982\u679c\u4f60\u4e0d\u60f3\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\uff0c\u4f60\u4ecd\u7136\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u8fdb\u884c\u4f20\u53c2\uff0c \u4ee5\u4e0b\u4e3a python3 manage.py remote \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -h, --help show this help message and exit\n-c CLIENTS, --clients CLIENTS\n\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679cpassword\u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6sett\ning/remote.ini\u4e2dCLIENT_PASSWORD\u7684\u503c,\u6bd4\u5982: uos@10.8.13.33:1\n\u6216 uos@10.8.13.33\n-s, --send_code \u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a\uff08\u4e0d\u542breport\u76ee\u5f55\uff09\n-e, --build_env \u642d\u5efa\u6d4b\u8bd5\u73af\u5883,\u5982\u679c\u4e3ayes\uff0c\u4e0d\u7ba1send_code\u662f\u5426\u4e3ayes\u90fd\u4f1a\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a.\n-p CLIENT_PASSWORD, --client_password CLIENT_PASSWORD\n\u6d4b\u8bd5\u673a\u5bc6\u7801\uff08\u5168\u5c40\uff09\n-y PARALLEL, --parallel PARALLEL\nyes:\u8868\u793a\u6240\u6709\u6d4b\u8bd5\u673a\u5e76\u884c\u8dd1\uff0c\u6267\u884c\u76f8\u540c\u7684\u6d4b\u8bd5\u7528\u4f8b;no:\u8868\u793a\u6d4b\u8bd5\u673a\u5206\u5e03\u5f0f\u6267\u884c\uff0c\u670d\u52a1\u7aef\u4f1a\u6839\u636e\u6536\u96c6\u5230\u7684\u6d4b\u8bd5\u7528\u4f8b\u81ea\n\u52a8\u5206\u914d\u7ed9\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u3002\n \u9664\u4e86\u8fd9\u4e9b\u7279\u6709\u53c2\u6570\u4ee5\u5916\uff0c\u5b83\u540c\u6837\u652f\u6301\u672c\u5730\u6267\u884c\u7684\u6240\u6709\u53c2\u6570\uff1b \u5728\u547d\u4ee4\u884c\u8fd9\u6837\u8fd0\u884c\uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\"\n \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report \u76ee\u5f55\u4e0b\u56de\u6536\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u7684\u6d4b\u8bd5\u62a5\u544a\u3002 \u6ce8\u610f\uff0c\u5982\u679c\u8fdc\u7a0b\u673a\u5668\u6ca1\u6709\u642d\u5efa\u81ea\u52a8\u5316\u6d4b\u8bd5\u73af\u5883\uff0c\u8bb0\u5f97\u52a0\u4e0a\u53c2\u6570 -e \uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\" -e\n \u6267\u884c\u524d\u786e\u4fdd\u8fdc\u7a0b\u673a\u5668\u5df2\u7ecf\u5f00\u542f\u4e86 ssh \u670d\u52a1\uff0c\u5426\u5219\u4f1a\u63d0\u793a\u65e0\u6cd5\u8fde\u63a5\uff0c\u5982\u679c\u6ca1\u6709\u5f00\u542f\uff0c\u8bf7\u624b\u52a8\u5f00\u542f\uff1a sudo systemctl restart ssh\nsudo systemctl enable ssh\n \u914d\u7f6e\u6587\u4ef6\u5176\u4ed6\u76f8\u5173\u914d\u7f6e\u9879\u8be6\u7ec6\u8bf4\u660e\uff0c\u8bf7\u67e5\u770b\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u6ce8\u91ca\u5185\u5bb9\u3002"},{"location":"#222","title":"2.2.2. \u8fdc\u7a0b\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u8d1f\u8f7d\u5747\u8861\u6267\u884c","text":"\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u8d1f\u8f7d\u5747\u8861\u6267\u884c\u4e5f\u662f\u7528\u672c\u5730\u4f5c\u4e3a\u670d\u52a1\u7aef\u63a7\u5236\u8fdc\u7a0b\u673a\u5668\u6267\u884c\uff0c\u4f46\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u4e0d\u540c\uff0c\u800c\u662f\u6240\u6709\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u4e4b\u548c\uff0c\u4e3a\u4f60\u60f3\u8981\u6267\u884c\u7684\u7528\u4f8b\u96c6\uff1b \u4f3c\u4e4e\u6709\u70b9\u96be\u4ee5\u7406\u89e3\uff0c\u6211\u7528\u5927\u767d\u8bdd\u4e3e\u4f8b\u63cf\u8ff0\u4e0b\u5c31\u662f\uff0c\u670d\u52a1\u7aef\u60f3\u8981\u6267\u884c 10 \u6761\u7528\u4f8b\uff0c\u73b0\u5728\u8fdc\u7a0b\u673a\u5668\u6709 5 \u53f0\uff1b \u7136\u540e\u670d\u52a1\u7aef\u5c31\u5148\u62ff\u7740\u7b2c 1 \u6761\u7528\u4f8b\u7ed9\u8fdc\u7a0b 1 \u53f7\u673a\u6267\u884c\uff0c\u62ff\u7b2c 2 \u6761\u7528\u4f8b\u7ed9\u8fdc\u7a0b 2 \u53f7\u673a\u6267\u884c...\uff0c\u5982\u6b64\u5faa\u73af\u76f4\u5230\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\uff0c\u8fd9\u5c31\u662f\u8d1f\u8f7d\u5747\u8861\u6267\u884c\u3002 \u4f7f\u7528\u65b9\u6cd5\u548c\u524d\u9762\u4e00\u6837\uff0c\u53ea\u662f\u9700\u8981\u589e\u52a0\u4e00\u4e2a\u53c2\u6570\uff1a youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\" --parallel no\n"},{"location":"#23-pms","title":"2.3. PMS \u6570\u636e\u56de\u586b","text":"\u6d4b\u8bd5\u5355\u5173\u8054\u7684\u7528\u4f8b\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u5bf9\u5e94\u7684\u53bb\u8dd1\u8fd9\u4e9b\u5173\u8054\u7684\u7528\u4f8b\uff0c\u5e76\u4e14\u5c06\u6267\u884c\u7684\u7ed3\u679c\u56de\u586b\u7684\u6d4b\u8bd5\u7528\u4f8b\u7684\u72b6\u6001\u91cc\u9762\u3002 PMS \u6570\u636e\u56de\u586b\u4e3b\u8981\u6709\u4e09\u79cd\u65b9\u5f0f\uff1a \uff081\uff09\u5f02\u6b65\u56de\u586b \u5728\u7528\u4f8b\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\uff0c\u91c7\u7528\u5f02\u6b65\u7684\u65b9\u5f0f\u53bb\u8fdb\u884c\u6570\u636e\u56de\u586b\uff0c\u76f4\u767d\u7684\u8bb2\u5c31\u662f\uff0c\u7b2c\u4e8c\u6761\u7528\u4f8b\u5f00\u59cb\u8dd1\u7684\u65f6\u5019\uff0c\u901a\u8fc7\u5b50\u7ebf\u7a0b\u53bb\u505a\u7b2c\u4e00\u6761\u7528\u4f8b\u7684\u6570\u636e\u56de\u586b\uff0c\u5982\u6b64\u5faa\u73af\uff0c\u76f4\u5230\u6240\u6709\u7528\u4f8b\u6267\u884c\u7ed3\u675f\uff1b \u8fd9\u79cd\u65b9\u6848\u7684\u65f6\u95f4\u6548\u7387\u6700\u9ad8\u7684\uff0c\u56e0\u4e3a\u7406\u8bba\u4e0a\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u662f\u5927\u4e8e\u6570\u636e\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\u65f6\u95f4\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u5f53\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u6570\u636e\u56de\u586b\u4e5f\u5b8c\u6210\u4e86\u3002 \u4f7f\u7528\u65b9\u6cd5\uff0c\u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u4ee5\u4e0b\u53c2\u6570\uff1a\uff08\u4ee5\u4e0b\u6d89\u53ca\u5230\u7684\u53c2\u6570\u914d\u7f6e\u90fd\u662f\u5728\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u914d\u7f6e\uff09 PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = async\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \u8fd9\u4e2a\u53c2\u6570\u53ef\u586b\u53ef\u4e0d\u586b\uff0c\u4f46\u662f\u586b\u4e86\u53ef\u4ee5\u63d0\u9ad8\u7528\u4f8b\u7684\u6267\u884c\u901f\u5ea6\uff0c\u56e0\u4e3a\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u53ef\u4ee5\u6307\u5b9a\u5230\u5177\u4f53\u7684\u5e94\u7528\u5e93\u3002\uff08\u4e0b\u540c\uff09\n \uff082\uff09\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u56de\u586b \u7b49\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u518d\u9010\u4e2a\u8fdb\u884c\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u6b64\u65b9\u6848\u65f6\u95f4\u6548\u7387\u6bd4\u8f83\u4f4e\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \uff083\uff09\u624b\u52a8\u56de\u586b \u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4e0d\u505a\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u540e\u7eed\u624b\u52a8\u5c06\u7ed3\u679c\u8fdb\u884c\u56de\u586b\u8bf7\u6c42\u3002 \u7528\u4f8b\u6267\u884c\u65f6\u914d\u7f6e\uff1a PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = hand\nAPP_NAME = \u540e\u7eed\u624b\u52a8\u56de\u586b\u65b9\u6cd5\uff1a youqu manage.py pms --send2task yes\n"},{"location":"#_4","title":"\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898","text":"\u7531\u540c\u5b66\u53ef\u80fd\u4f1a\u53d1\u73b0\uff0c\u600e\u4e48\u56de\u586b\u4e00\u6b21\u4e4b\u540e\uff0c\u540e\u9762\u60f3\u518d\u6b21\u56de\u586b\u5c31\u4e0d\u751f\u6548\u4e86\uff1b \u8fd9\u662f\u56e0\u4e3a\u4e3a\u4e86\u5e94\u5bf9\u524d\u9762\u63d0\u5230\u7684\u591a\u79cd\u6570\u636e\u56de\u586b\u7684\u65b9\u5f0f\uff0c\u5728 report \u76ee\u5f55\u4e0b\u4f1a\u7531 pms_xxx \u5f00\u5934\u7684\u76ee\u5f55\uff0c\u8bb0\u5f55\u4e86\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u548c\u56de\u586b\u60c5\u51b5\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u4e4b\u524d\u5df2\u7ecf\u56de\u586b\u8fc7\u4e86\uff0c\u540e\u7eed\u5c31\u4e0d\u4f1a\u518d\u6b64\u89e6\u53d1\u56de\u586b\u4e86\uff1b \u5982\u679c\u4f60\u60f3\u91cd\u65b0\u505a\u56de\u586b\uff0c\u4f60\u53ef\u4ee5\u628a report/pms_xxx \u76ee\u5f55\u5220\u6389\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u91cd\u65b0\u505a\u6570\u636e\u56de\u586b\u4e86\uff1b"},{"location":"#24-csv","title":"2.4. \u5bfc\u51fa CSV \u6587\u4ef6","text":"\u6846\u67b6\u63d0\u4f9b\u5bfc\u51fa\u6307\u5b9a\u6807\u7b7e\u7528\u4f8b\u7684\u529f\u80fd\uff1a youqu manage.py exportcsv -a deepin-album -t CICD\n \u8868\u793a\u5bfc\u51fa deepin-album \u7684\u7528\u4f8b\u4e2d\u6807\u8bb0\u4e86 CICD \u6807\u7b7e\u7684\u7528\u4f8b\uff0c\u5bfc\u51fa CSV \u6587\u4ef6\u7684\u5b57\u6bb5\u683c\u5f0f\u5df2\u7ecf\u9002\u914d\u4e86 CICD \u7684\u8981\u6c42\u3002"},{"location":"#25-app","title":"2.5. \u811a\u624b\u67b6\u65b0\u5efa APP \u5de5\u7a0b","text":"\u65b0\u5efa\u4e00\u4e2a APP \u5de5\u7a0b\uff1a youqu manage.py startapp autotest_deepin_some \u8fd9\u6837\u5728 apps \u76ee\u5f55\u4e0b\u4f1a\u521b\u5efa\u4e00\u4e2a\u5b50\u9879\u76ee\u5de5\u7a0b autotest_deepin_some\uff0c\u540c\u65f6\u65b0\u5efa\u597d\u5de5\u7a0b\u6a21\u677f\u76ee\u5f55\u548c\u6a21\u677f\u6587\u4ef6\uff1a apps\n\u2514\u2500\u2500 autotest_deepin_some\n \u00a0\u00a0 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_case.py\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 config.ini\n \u00a0\u00a0 \u251c\u2500\u2500 config.py\n \u00a0\u00a0 \u251c\u2500\u2500 conftest.py\n \u00a0\u00a0 \u251c\u2500\u2500 control\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_assert.py\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some.csv\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u2514\u2500\u2500 widget\n \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 case_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 other.ini\n \u00a0\u00a0 \u251c\u2500\u2500 other_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 pic_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2514\u2500\u2500 ui.ini\n autotest_deepin_some \u662f\u4f60\u7684\u5de5\u7a0b\u540d\u79f0\uff0c\u6bd4\u5982\uff1aautotest_deepin_music \uff1b \u5728\u6b64\u57fa\u7840\u4e0a\uff0c\u4f60\u53ef\u4ee5\u5feb\u901f\u7684\u5f00\u59cb\u4f60\u7684 AT \u9879\u76ee\u3002"},{"location":"#26","title":"2.6. \u7528\u4f8b\u6807\u7b7e\u81ea\u52a8\u540c\u6b65","text":"\u7528\u4e8e\u81ea\u52a8\u540c\u6b65 PMS \u7528\u4f8b\u6807\u7b7e\u6570\u636e\u81f3\u672c\u5730 CSV \u6587\u4ef6\uff0c\u4e3b\u8981\u901a\u8fc7\u4ee5\u4e0b\u51e0\u4e2a\u914d\u7f6e\u6765\u63a7\u5236\uff1a APP_NAME = # \u6307\u5b9a\u8981\u540c\u6b65\u7684\u5e94\u7528\u540d\u79f0\nPMS_USER = # PMS\u7684\u7528\u6237\u540d\nPMS_PASSWORD = # PMS\u7684\u5bc6\u7801\n \u5728 [csv_link_pms_id] \u8282\u70b9\u4e0b\u6307\u5b9a csv \u6587\u4ef6\u540d\u4e0e PMS \u7528\u4f8b\u6a21\u5757\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u6bd4\u5982\uff1a [csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/testcase-browse-53.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 53\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic = 53\n \u5c06\u4ee5\u4e0a\u4fe1\u606f\u914d\u7f6e\u597d\u4e4b\u540e\uff0c\u5728\u547d\u4ee4\u884c\u6267\u884c\uff1a youqu manage.py pms --pms2csv yes\n \u6bcf\u6b21\u6267\u884c\u65f6\u539f csv \u6587\u4ef6\u4f1a\u81ea\u52a8\u5907\u4efd\u5728 report/csv_back \u76ee\u5f55\u4e0b\uff0c\u56e0\u6b64\u4f60\u4e0d\u7528\u62c5\u5fc3\u811a\u672c\u6267\u884c\u5bfc\u81f4\u4f60\u7684\u6570\u636e\u4e22\u5931\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u57fa\u7840\u6846\u67b6\u8bbe\u8ba1\u65b9\u6848","text":"# ====================================\n# Author : Mikigo\n# Time : 2022/3/18\n# version \uff1a1.0\n# ====================================\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"\u505a\u4e00\u4e2a\u7b80\u5355\u3001\u597d\u7528\u3001\u529f\u80fd\u5f3a\u5927\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u3002 \u4f5c\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4e00\u4e2a\u57fa\u7840\u6846\u67b6\uff0c\u4efb\u4f55\u5e94\u7528\u90fd\u80fd\u5f88\u65b9\u4fbf\u7684\u63a5\u5165\u8fdb\u6765\uff1b \u63d0\u4f9b\u6240\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u9700\u8981\u7684\u5e95\u5c42\u529f\u80fd\uff0c\u5e76\u5bf9\u5916\u63d0\u4f9b\u552f\u4e00\u7684\u63a5\u53e3\uff0c\u65b9\u4fbf\u5e94\u7528\u5e93\u4f7f\u7528\uff1b \u6574\u5408\u516c\u5171\u5e93\uff0c\u51cf\u5c11\u5e94\u7528\u5e93\u4ee3\u7801\u91cf\u548c\u65b9\u6cd5\u7ef4\u62a4\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u8bbe\u8ba1\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u7edf\u4e00\u6982\u5ff5","text":" \u57fa\u7840\u6846\u67b6 \u672c\u9879\u76ee\u662f\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\uff08AutoTest Basic Frame\uff09\uff0c\u5168\u79f0\u4e3a\u201c\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff08AT \u57fa\u7840\u6846\u67b6\uff09\u201d\u3002 AT \u57fa\u7840\u6846\u67b6\u662f\u505a\u4e3a\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\u6765\u8bbe\u8ba1\u7684\uff0c\u5b83\u63d0\u4f9b\u4e86\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u57fa\u7840\u529f\u80fd\uff0c\u4efb\u4f55\u5e94\u7528\u63a5\u5165\u8fdb\u6765\u90fd\u80fd\u5feb\u901f\u65b9\u4fbf\u7684\u8fdb\u884c\u65b9\u6cd5\u548c\u7528\u4f8b\u7f16\u5199\uff0c\u540c\u65f6\u5728\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u3001\u6807\u7b7e\u5316\u6267\u884c\u3001\u5206\u5e03\u5f0f\u6267\u884c\u3001\u591a\u79cd\u62a5\u544a\u8f93\u51fa\u3001\u4f18\u7f8e\u7684\u6267\u884c\u65e5\u5fd7\u3001\u5931\u8d25\u81ea\u52a8\u5f55\u5c4f\u548c\u622a\u56fe\u3001\u81ea\u52a8\u73af\u5883\u6e05\u7406\u7b49\u7b49\uff0c\u5b83\u90fd\u63d0\u4f9b\u4e86\u5b8c\u5584\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u66f4\u91cd\u8981\u7684\u662f\u8fd9\u4e00\u5207\u4f7f\u7528\u8d77\u6765\u90fd\u975e\u5e38\u7b80\u5355\u3002 \u57fa\u7840\u6846\u67b6\u4e2d\u5305\u542b\u5e94\u7528\u5e93\uff08apps\uff09\u3001\u6838\u5fc3\u5e93\uff08src\uff09\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09\u3002 \u5e94\u7528\u5e93\uff08apps\uff09 \u5404\u4e2a\u5e94\u7528\u81ea\u5df1\u7684\u4ed3\u5e93\uff0c\u91cc\u9762\u4e3b\u8981\u5305\u542b\u7684\u662f\u7528\u4f8b\u3001\u65b9\u6cd5\u53ca\u4e00\u4e9b\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u53eb autotest-dde-file-manager \u3002 \u6838\u5fc3\u5e93\uff08src\uff09 \u6838\u5fc3\u5e93\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u5230\u6240\u6709\u5e95\u5c42\u6838\u5fc3\u529f\u80fd\uff0c\u8fd9\u662f\u6700\u91cd\u8981\u7684\u4e00\u4e2a\u90e8\u5206\uff0c\u7075\u9b42\u3002\u5177\u4f53\u529f\u80fd\u6a21\u5757\u53ca\u8bf4\u660e\u4f1a\u5728\u4e0b\u9762\u7b2c\u56db\u4e2a\u7ae0\u8282\u8be6\u7ec6\u63cf\u8ff0\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09 \u591a\u4e2a\u5e94\u7528\u90fd\u8981\u7528\u5230\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\uff0c\u6309\u7167\u5e94\u7528\u5212\u5206\u5b58\u653e\uff0c\u4e3b\u8981\u662f\u4e3a\u4e86\u51cf\u5c11\u4ee3\u7801\u91cf\uff0c\u6d88\u9664\u5e94\u7528\u95f4\u7684\u8026\u5408\u5173\u7cfb\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u67b6\u6784\u56fe","text":"\u6574\u4f53\u7684\u6846\u67b6\u8bbe\u8ba1\u5728\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u300b\u6587\u6863\u91cc\u9762\u5df2\u7ecf\u6709\u8be6\u7ec6\u63cf\u8ff0\u4e86\uff0c\u8fd9\u91cc\u8d34\u4e00\u4e0b\u6574\u4f53\u7684\u67b6\u6784\u56fe\uff1a \u4e3a\u4e86\u7a81\u663e\u672c\u6587\u7684\u91cd\u70b9\uff0c\u62bd\u53d6\u5176\u4e2d\u91cd\u8981\u529f\u80fd\u6a21\u5757\uff0c\u5982\u4e0b\u56fe\uff1a "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-basic-frame # \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\n\u251c\u2500\u2500 apps # \u5e94\u7528\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-dde-file-manager # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\uff08\u5e94\u7528\u5e93\u8be6\u7ec6\u76ee\u5f55\u7ed3\u6784\u8bf7\u770b\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\uff09\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 tag # \u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u2514\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u2502 \u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 xxx.png\n\u2502 \u2502 ...\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-deepin-music # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 public # \u516c\u5171\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget # dde_dock \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget # dde_desktop \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 src # \u6838\u5fc3\u5e93\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 button_center.py\n\u2502 \u251c\u2500\u2500 cmdtrl.py\n\u2502 \u251c\u2500\u2500 dogtails.py\n\u2502 \u251c\u2500\u2500 find_image.py\n\u2502 \u251c\u2500\u2500 global_config.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 setting # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 config.py\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 global_config.ini\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\u6a21\u5757\uff08Hook\uff09\n\u251c\u2500\u2500 pytest.ini # Pytest \u9ed8\u8ba4\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 docs # \u6587\u6863\u76ee\u5f55\n\u2514\u2500\u2500 manage.py # \u6267\u884c\u5668\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1apps","title":"1\u3001\u5e94\u7528\u5e93\uff08apps\uff09","text":"\u6240\u6709\u5e94\u7528\u5e93\u5747\u653e\u7f6e\u5728\u57fa\u7840\u6846\u67b6\u4e0b\u7684 apps \u76ee\u5f55\u4e0b\uff08\u89c1\u7b2c\u4e8c\u7ae0\u8282\u7b2c3\u6bb5\u76ee\u5f55\u7ed3\u6784\u5185\u5bb9\uff09\u3002\u5e94\u7528\u5e93\u7684\u67b6\u6784\u8bbe\u8ba1\u53ef\u4ee5\u53c2\u8003\u300aAT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b\u6587\u6863\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2src","title":"2\u3001\u6838\u5fc3\u5e93\uff08src\uff09","text":"\u5728 src \u76ee\u5f55\u4e0b\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u5e95\u5c42\u6838\u5fc3\u7ec4\u4ef6\uff0c\u901a\u5e38\u6765\u8bb2\u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5230\u5176\u4e2d\u67d0\u4e00\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4e48\u4f60\u9700\u8981\u663e\u793a\u7684\u5bfc\u5165\u8fd9\u4e2a\u6a21\u5757\uff0c\u7136\u540e\u624d\u80fd\u4f7f\u7528\u8be5\u6a21\u5757\u4e0b\u7684\u529f\u80fd\uff0c\u5982\u679c\u4f60\u7528\u5230\u4e86\u5341\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4f60\u5c31\u9700\u8981\u5bfc\u5165\u5341\u4e2a\u3002\u4f46\u662f\u6211\u4eec\u60f3\u8ba9\u4e8b\u60c5\u53d8\u5f97\u7b80\u5355\uff0c\u4e00\u6b21\u5bfc\u5165\uff0c\u4f7f\u7528\u6240\u6709\u3002 \u5c06\u6240\u6709\u7684\u529f\u80fd\u6a21\u5757\u90fd\u8fdb\u5165\u5230 src \u7684\u540d\u79f0\u7a7a\u95f4\uff0c\u5728 src/__init__.py \u91cc\u9762\u6211\u4eec\u8bbe\u8ba1\u6210\u8fd9\u6837\uff1a # src/__init__.py\nfrom .cmdctl import CmdCtl\nfrom .dogtails import Dogtail\nfrom .find_image import FindImage\nfrom .button_center import ButtonCenter\nclass Src(CmdCtl, FindImage):\ndef __init__(self, **kwargs):\n\"\"\"dogtail or button center param\n :param kwargs: app_name, desc, number\n \"\"\"\nif kwargs:\napp_name = kwargs.get(\"APP_NAME\")\ndesc = kwargs.get(\"DESC\")\nif app_name is None or desc is None:\nraise ValueError\nnumber = kwargs.get(\"number\")\nnumber = number if isinstance(number, int) else -1\n# \u5bf9\u8c61\u7ec4\u5408\nself.dog = Dogtail(app_name, desc, number)\nself.ui = ButtonCenter(app_name, number)\n \u9700\u8981\u4f20\u9012\u53c2\u6570\u7684\u91c7\u7528\u5bf9\u8c61\u7ec4\u5408\uff0c\u6ca1\u6709\u53c2\u6570\u7684\u4f7f\u7528\u7ee7\u627f\uff0c\u7ee7\u627f\u7684\u7c7b\u7b26\u5408 Mixin \u8bbe\u8ba1\u6a21\u5f0f\u3002 \u5e94\u7528\u5e93\u91cc\u9762\u4f7f\u7528\u7684\u65f6\u5019\u5728 widget/base_widget.py \u91cc\u9762\u53ea\u9700\u8981\u552f\u4e00\u7ee7\u627f Src \uff1a # \u5e94\u7528\u5e93\u91cc\u9762\u65b9\u6cd5\u57fa\u7c7b\n# widget/base_widget.py\nfrom src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n \u8981\u4f7f\u7528\u6838\u5fc3\u5e93\u7684\u529f\u80fd\uff0c\u53ea\u9700\u8981\u5199\u4e00\u4e2a\u5bfc\u5165 from src import Src \u5373\u53ef\u3002 \u5199 __init__ \u6784\u9020\u51fd\u6570\u7684\u539f\u56e0\u662f\u901a\u8fc7\u53c2\u6570\u6784\u9020\u5e94\u7528\uff0c\u5e76\u4e14\u4f20\u9012 number \u8fdb\u6765\uff0c\u53ef\u4ee5\u5b9e\u73b0\u591a\u7a97\u53e3\u7684\u63a7\u5236\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3public","title":"3\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09","text":"\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6bcf\u4e2a\u5e94\u7528\u90fd\u662f\u4e00\u4e2a\u5355\u72ec\u7684 py \u6587\u4ef6\uff0c\u76f8\u4e92\u4e4b\u95f4\u662f\u72ec\u7acb\u7684\uff0c\u6bcf\u4e2a py \u6587\u4ef6\u91cc\u9762\u662f\u8be5\u5e94\u7528\u7684\u65b9\u6cd5\u7c7b\uff0c\u6bd4\u5982\uff1a\u6700\u5e38\u7528\u7684\u65b9\u6cd5\u7c7b dde_desktop_public_widget.py # dde_desktop_widget.py\nfrom src import Src\nclass _DdeDesktopPublicBaseWidget(Src):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-desktop\"\nDESC = \"/usr/bin/dde-desktop\"\ndef __init__(self):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC)\nclass DdeDesktopPublicWidget(_DdeDesktopPublicBaseWidget):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u7c7b\"\"\"\ndef click_music_dir_by_ui(self):\n\"\"\"\u5728\u6587\u4ef6\u9009\u62e9\u6846\u70b9\u51fb\u97f3\u4e50\u76ee\u5f55\"\"\"\nself.click(*self.ui.btn_center(\"\u4fa7\u8fb9\u680f-\u97f3\u4e50\")) \ndef click_xxx_by_attr(self):\npass\n \u516c\u5171\u65b9\u6cd5\u5e93\u610f\u4e49\uff1a \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6240\u5c01\u88c5\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\u90fd\u662f\u81f3\u5c11\u88ab2\u4e2a\u5e94\u7528\u90fd\u7528\u5230\u7684\uff0c\u8fd9\u6837\u505a\u53ef\u4ee5\u51cf\u5c11\u6574\u4f53\u4ee3\u7801\u91cf\uff0c\u4ece\u800c\u51cf\u8f7b\u5e94\u7528\u5e93\u4ee3\u7801\u7684\u7ef4\u62a4\u5de5\u4f5c\u3002 \u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u7f16\u5199\u5f62\u5f0f\uff08\u547d\u540d\u89c4\u5219\u3001\u5b9a\u4f4d\u7684\u65b9\u6848\u5199\u6cd5\u3001\u6ce8\u91ca\u7684\u5199\u6cd5\u7b49\u7b49\uff09\u5177\u6709\u4e00\u5b9a\u7684\u6a21\u677f\u4f5c\u7528\uff0c\u8fd9\u6837\u5373\u4f7f\u662f\u5404\u4e2a\u5e94\u7528\u5e93\u90fd\u72ec\u7acb\u7ef4\u62a4\uff0c\u6240\u6709\u7684\u7f16\u7801\u98ce\u683c\u90fd\u662f\u8d8b\u4e8e\u76f8\u540c\u7684\uff0c\u56e0\u4e3a\u5927\u5bb6\u90fd\u5e94\u8be5\u53c2\u7167\u516c\u5171\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u5199\u6cd5\u6765\u5199\u81ea\u5df1\u5e94\u7528\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\u7c7b\uff0c\u8fd9\u6837\u4f7f\u5f97\u4ece\u516c\u53f8\u7684\u89d2\u5ea6\u53bb\u770b\u6240\u6709\u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u90fd\u662f\u7edf\u4e00\u7684\u3002 \u53ef\u4ee5\u901a\u8fc7\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\uff0c\u4e86\u89e3\u5230\u5176\u4ed6\u5e94\u7528\u7684\u529f\u80fd\uff0c\u5bf9\u4e8e\u6211\u4eec\u9700\u6c42\u7406\u89e3\uff0c\u4e86\u89e3\u7cfb\u7edf\u7684\u65b9\u65b9\u9762\u9762\u4e5f\u6709\u597d\u5904\u3002 \u5f53\u7136\uff0c\u5982\u679c\u4f60\u7684\u5e94\u7528\u672c\u8eab\u662f\u5c5e\u4e8e\u6839\u672c\u5c31\u4e0d\u9700\u8981\u548c\u5176\u4ed6\u5e94\u7528\u4ea4\u4e92\u7684\uff0c\u90a3\u4e48\u4f60\u53ef\u80fd\u4e0d\u4f1a\u7528\u5230\u8fd9\u91cc\u9762\u7684\u529f\u80fd\uff0c\u6ca1\u5173\u7cfb\uff0c\u4f60\u6240\u6709\u7684\u65b9\u6cd5\u90fd\u53ef\u4ee5\u76f4\u63a5\u5199\u5728\u5e94\u7528\u5e93\u7684\u4e1a\u52a1\u5c42\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4conftestpy","title":"4\u3001conftest.py","text":"conftest.py \u4ece\u529f\u80fd\u4e0a\u5c06\u662f\u5c5e\u4e8e\u6838\u5fc3\u5e93\uff08src\uff09\u7684\u5185\u5bb9\uff0c\u4f46\u662f\u7531\u4e8e\u5b83\u7684\u7279\u6b8a\u6027\uff0c\u5373\u5b83\u662f\u5bf9\u5e94\u7528\u5e93\u4e2d\u7684\u7528\u4f8b\u751f\u6548\u7684\uff0c\u800c\u4e14\u5b83\u7684\u4f5c\u7528\u57df\u662f\u5f53\u524d\u76ee\u5f55\u53ca\u4ee5\u4e0b\uff0c\u56e0\u6b64\u6211\u4eec\u5c06\u5b83\u653e\u5230\u9879\u76ee\u6839\u76ee\u5f55\u3002\u6211\u4eec\u6846\u67b6\u4e2d\u6709\u4e0d\u5c11\u6838\u5fc3\u529f\u80fd\u90fd\u662f\u5728\u8fd9\u91cc\u9762\u8fdb\u884c\u5f00\u53d1\u7684\uff0c\u540e\u9762\u7b2c\u56db\u7ae0\u4f1a\u8bb2\u5230\u7ec6\u8282\u3002 pytest.ini \u4f5c\u7528\u548c conftest.py \u7c7b\u4f3c\uff0c\u662f Pytest \u6846\u67b6\u7684\u56fa\u5b9a\u914d\u7f6e\u6587\u4ef6\uff0c\u76ee\u524d\u914d\u7f6e\u4e86\u4e00\u4e9b\u901a\u7528\u7684\u547d\u4ee4\u884c\u6267\u884c\u53c2\u6570\uff0c\u4e5f\u653e\u5728\u9879\u76ee\u6839\u76ee\u5f55\u3002 \u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 Hook \u51fd\u6570\uff0capps \u76ee\u5f55\u4e0b\u7684 \u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 fixture \u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5setting","title":"5\u3001setting","text":"\u5168\u5c40\u914d\u7f6e\u6a21\u5757\uff0c\u5305\u542b\u4e86\u4ee5\u4e0b\u914d\u7f6e\u6587\u4ef6\uff1a \uff081\uff09ini \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u914d\u7f6e\u4e00\u4e9b\u5168\u5c40\u7684\u914d\u7f6e\u9879\uff0c\u8b6c\u5982\uff1a\u5931\u8d25\u91cd\u8dd1\u6b21\u6570\u3001\u662f\u5426\u5931\u8d25\u5f55\u5c4f\u3001\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\u3001\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4\u3001\u6267\u884c\u65f6\u65e5\u5fd7\u7ea7\u522b\u3001\u751f\u6210\u7684\u62a5\u544a\u7c7b\u578b\u3001\u4ee5\u53ca\u5206\u5e03\u5f0f\u6267\u884c\u7684\u4e00\u4e9b\u7b56\u7565\u914d\u7f6e\u9879\u7b49\u7b49\u3002 \uff082\uff09config.py \u914d\u7f6e\u6587\u4ef6 \u4e3b\u8981\u63d0\u4f9b\u914d\u7f6e\u6587\u4ef6\u8bfb\u53d6\u3001\u52a8\u6001\u83b7\u53d6\u4e00\u4e9b\u5e38\u91cf\uff08\u5982\u9879\u76ee\u6839\u76ee\u5f55\u7edd\u5bf9\u8def\u5f84 (BASE_DIR)\u3001\u7cfb\u7edf\u67b6\u6784\uff08SYS_FRAME\uff09\u3001\u65f6\u95f4\u5b57\u7b26\u4e32\uff08strftime\uff09\u3001\u672c\u673a USERNAME IP \u7b49\u7b49\uff09\u3001\u516c\u5171 URL \u7b49\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u89c4\u8303","text":""},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u7248\u672c\u53ca\u4f9d\u8d56","text":"\u57fa\u7840\u6846\u67b6\u4f1a\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u8fdb\u884c\u7248\u672c\u53d1\u5e03\uff0c\u4e0d\u4e0e\u67d0\u4e2a\u5e94\u7528\u7248\u672c\u7ed1\u5b9a\uff0c\u4f46\u662f\uff0c\u5e94\u7528\u5e93\u4f1a\u4f9d\u8d56\u4e8e\u57fa\u7840\u6846\u67b6\u7684\u7248\u672c\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u5efa\u8bae\u5728\u5e94\u7528\u5e93\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a\u6587\u672c\u6587\u4ef6\u7528\u4e8e\u8bb0\u5f55\u6240\u4f9d\u8d56\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\uff0c\u7c7b\u4f3c\u4e8e\u5f00\u53d1\u5e94\u7528\u7684 debian/control \u6587\u4ef6\u7684\u529f\u80fd\uff0c\u4e3a\u4e86\u4fdd\u6301\u7edf\u4e00\uff0c\u8fd9\u4e2a\u6587\u4ef6\u5c31\u547d\u540d\u4e3a control\uff0c\u653e\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u6838\u5fc3\u5e93\u72ec\u7acb\u6027","text":"\u6838\u5fc3\u5e93\u4e0d\u5efa\u8bae\u9488\u5bf9\u67d0\u4e00\u4e2a\u5e94\u7528\u5355\u72ec\u505a\u4ee3\u7801\u4e0a\u7279\u6b8a\u5904\u7406\uff0c\u901a\u5e38\u8003\u8651\u9488\u5bf9\u67d0\u4e00\u79cd\u573a\u666f\u8fdb\u884c\u5904\u7406\uff0c\u8fd9\u4e9b\u573a\u666f\u901a\u5e38\u662f\u5b58\u5728\u4e00\u4e9b\u5171\u6027\u7684\u3002\u6bd4\u5982\u8bf4\uff1a\u684c\u9762\u7684ID\u5206\u914d\u5b58\u5728\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u903b\u8f91\u5904\u7406\u89e3\u51b3ID\u5206\u914d\u9519\u8bef\u7684\u95ee\u9898\uff0c\u4f46\u662f\u8fd9\u90e8\u5206\u903b\u8f91\u6211\u4eec\u4f1a\u5728\u684c\u9762\u7684\u65b9\u6cd5\u5c42\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u517c\u5bb9\u6027","text":"\u4e3a\u4e86\u4fdd\u6301\u517c\u5bb9\u6027\uff0c\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u539f\u5219\u4e0a\u4e0d\u5bf9\u8001\u65b9\u6cd5\u8fdb\u884c\u4fee\u6539\u6216\u5220\u9664\uff0c\u53ea\u8fdb\u884c\u65b0\u589e\u3002\u6d89\u53ca\u5230\u8001\u65b9\u6cd5\u4fee\u6539\u6216\u5220\u9664\u7684\uff0c\u4f1a\u8fdb\u884c\u63d0\u524d\u9884\u544a\uff0c\u5e76\u5728\u7b2c\u4e8c\u4e2a\u7248\u672c\u4e4b\u540e\uff08\u4e2d\u95f4\u4f1a\u9694\u4e00\u4e2a\u7248\u672c\u8fc7\u5ea6\uff09\u6b63\u5f0f\u5b9e\u65bd\u4fee\u6539\u6216\u5220\u9664\u3002"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u547d\u540d\u89c4\u8303","text":" \u7528\u4f8b ID \u6bcf\u4e2a\u5e94\u7528\u81ea\u5df1\u7ef4\u62a4\u4e00\u5957 ID\uff0c\u5728PMS\u4e0a\u7528\u4f8b\u6807\u9898\u4e0a\u5c06\u81ea\u52a8\u5316ID\u4ee5\u6807\u7b7e\u7684\u5f62\u5f0f\u5199\u5165\uff0c\u6bd4\u5982\uff1a[101]\u6253\u5f00-\u542f\u52a8\u5e94\u7528\u540edock\u53f3\u952e\u83dc\u5355 \u4e00\u4e2a\u7528\u4f8b\u7c7b\u91cc\u9762\u6709\u591a\u4e2a\u7528\u4f8b\u65f6\uff0c\u5728\u7528\u4f8b\u540d\u79f0\u540e\u9762\u52a0\u5e8f\u53f7\u3002 class TestFileManager(BaseCase):\n\"\"\"\u6587\u7ba1\u7528\u4f8b\"\"\"\ndef test_xxx_015_1(self):\npass\ndef test_xxx_015_2(self):\npass\n \u6ce8\u610f 015_1\uff0c\u4e0d\u8981\u5199015_01\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 PMS \u4e0a\u7684\u7528\u4f8bID\uff1a PMS \u4e0a\u662f6\u4f4d\u6570\uff0c\u4e0d\u591f\u76f4\u89c2\uff0c\u4e5f\u4e0d\u597d\u7ef4\u62a4\uff0c\u5728\u81ea\u52a8\u5316\u4e0b\u9762\u53bb\u627e\u4e00\u4e2a\u5e26\u6709 6 \u4f4d\u6570\u7684\u6587\u4ef6\u662f\u4e00\u4e2a\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 PMS \u4e0a\u7684 ID \u53ef\u80fd\u4f1a\u53d1\u751f\u53d8\u5316\uff0c\u6bd4\u5982\u5bfc\u51fa\u6765\u5bfc\u8fdb\u53bb\u7684\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u5b58\u5728\u95ee\u9898\uff0c\u5982\u679c\u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u8981\u60f3\u627e\u51fa\u6765\u5bf9\u5e94\u4fee\u6539\u81ea\u52a8\u5316\u7528\u4f8b ID\uff0c\u5c06\u4f1a\u662f\u4ef6\u975e\u5e38\u75db\u82e6\u7684\u4e8b\u60c5\u3002 \u51fd\u6570\u547d\u540d\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5de6\u952e\u70b9\u51fb click \u53f3\u952e\u70b9\u51fb right_click \u53cc\u51fb double_click \u79fb\u52a8 move_to \u62d6\u52a8 drag \u65b0\u5efa new \u62d6\u52a8\u5230 drag_to \u4ece\u54ea\u91cc\u62d6\u52a8\u5230\u54ea\u91cc drag_something_from_xxx_to_xxx \u83b7\u53d6 get \u83b7\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5750\u6807 get_location \u975e\u7279\u6b8a\u6587\u4ef6 file word\u6587\u4ef6 doc text\u6587\u4ef6 text \u6587\u4ef6\u5939 dir \u5173\u952e\u8bcd\u6301\u7eed\u589e\u52a0 \u5e38\u91cf\u5173\u952e\u8bcd\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u5e94\u7528\u540d\u79f0 APP_NAME \u5e94\u7528\u63cf\u8ff0 DESC \u672c\u5e94\u7528\u4ee5\u5916\u7684\u5176\u4ed6\u5e94\u7528\uff0c\u6bd4\u5982\u5e2e\u52a9 HELP \u5176\u4ed6\u540d\u79f0\u5217\u8868 \u540d\u79f0 \u5355\u8bcd \u65b9\u6cd5\u5305\u540d widget \u65b9\u6cd5\u6587\u4ef6\u540d\uff08\u6587\u7ba1\u4e3e\u4f8b\uff09 dfm_widget.pytitle_widget.pyright_view_widget.pyleft_view_widget.pypop_widget.pybase_widget.pydfm_assert.py \u65ad\u8a00\u8bed\u53e5\u547d\u540d\u89c4\u8303 \u65ad\u8a00\u8bed\u53e5\u90fd\u662f\u4ee5 assert \u5f00\u5934 \u65ad\u8a00 \u8bed\u53e5 \u5224\u65ad\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_existsassert_file_not_exists \u5224\u65ad\u684c\u9762\u76ee\u5f55\u4e0b\u6587\u4ef6\u662f\u5426\u5b58\u5728 assert_file_exists_in_desktopassert_file_not_exists_in_desktop \u5224\u65ad\u56fe\u7247\u5b58\u5728 assert_image_existsassert_image_not_exists \u5224\u65ad\u5f71\u9662\u4e2d\u662f\u5426\u5b58\u5728\u56fe\u7247 assert_image_exists_in_movieassert_image_not_exists_in_movie \u5224\u65ad\u5143\u7d20\u662f\u5426\u5b58\u5728 assert_element_existassert_element_not_exist \u5224\u65ad\u662f\u5426\u76f8\u7b49 assert_equalassert_not_equal \u5224\u65ad\u662f\u5426\u4e3a\u771f assert_trueassert_false"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5fixture","title":"5\u3001fixture \u89c4\u8303","text":"\u7531\u4e8e Pytest \u6846\u67b6\u4e2d\u652f\u6301 fixture \u7684\u5199\u6cd5\u548c Xunit \u5199\u6cd5\u7684\uff0c\u6240\u4ee5\u5e94\u7528\u5e93\u4e2d\u53ef\u80fd\u5b58\u5728\u6df7\u7528\u7684\u60c5\u51b5\uff0c\u4e3a\u7edf\u4e00\u7f16\u7801\u98ce\u683c\u65b9\u4fbf\u540e\u7eed\u7528\u4f8b\u4ee3\u7801\u7ef4\u62a4\uff0c\u73b0\u505a\u4ee5\u4e0b\u89c4\u8303\u8bf4\u660e\uff1a \u629b\u5f03 Xunit \u7684\u5199\u6cd5\uff0c\u7edf\u4e00\u91c7\u7528 Pytest fixture \u7684\u5199\u6cd5\u3002 \u5e94\u7528\u5185 fixture \u8c28\u614e\u4f7f\u7528 autouse=True \uff0c\u975e\u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u975e\u5e38\u4e0d\u5efa\u8bae\u4f7f\u7528\u8fd9\u4e2a\u53c2\u6570\u3002 \u8c03\u7528 fixture \u4e0d\u80fd\u4f7f\u7528 @pytest.mark.usefixture()\uff0c\u4f7f\u7528\u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u4f20\u5165\u51fd\u6570\u5bf9\u8c61\u3002 \u5efa\u8bae\u5728\u4e00\u4e2a conftest.py \u91cc\u9762\u53bb\u5199\uff0c\u4e00\u4e2a\u5e94\u7528\u4e5f\u5c3d\u91cf\u7ef4\u62a4\u4e00\u4e2a conftest.py\u6587\u4ef6\u3002 fixture \u4e5f\u9700\u8981\u5199\u529f\u80fd\u8bf4\u660e\uff0c\u51fd\u6570\u540d\u79f0\u8981\u6709\u5177\u4f53\u542b\u4e49\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#6","title":"6\u3001\u65b9\u6cd5\u7f16\u5199\u89c4\u8303","text":" \u65b9\u6cd5\u7c7b\u578b\uff1a if \u6ca1\u6709\u7528\u5230\u5b9e\u4f8b\u5bf9\u8c61\uff1a\nif \u6ca1\u6709\u7528\u5230\u7c7b\u5bf9\u8c61\uff1a\n\u5199\u9759\u6001\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @staticmethod\nelse\uff1a\n\u5199\u7c7b\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @classmethod\nelse:\n\u76f4\u63a5\u5199\u5b9e\u4f8b\u65b9\u6cd5\n \u4e3e\u4f8b: class TitleWidget:\ndef click_xxx_by_ui(self):\npass\n@staticmethod\ndef click_xxx_by_ui():\npass\n@classmethod\ndef click_xxx_by_ui(cls):\npass\n \u51fd\u6570\u540d\u79f0\u4e0d\u51fa\u73b0\u6570\u5b57\uff0c\u9700\u8981\u8868\u793a\u6570\u91cf\u7684\u7528\u5355\u8bcd\u8868\u793a\u3002 \u51fd\u6570\u529f\u80fd\u6ce8\u91ca\u3002 \u6ca1\u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg2:xxx\n\"\"\"\n \u6709\u53c2\u6570\uff0c\u6709\u8fd4\u56de \"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg1:xxx\nreturn: xxx\n\"\"\"\n \u200b \u7528 Pycharm \u7684\u6ce8\u91ca\u6a21\u677f\u4e5f\u53ef\u4ee5\uff0c\u53ea\u8981\u4f53\u73b0\u4e86\u53c2\u6570\u7684\u7c7b\u578b\u548c\u8fd4\u56de\u5c31\u884c\u4e86\u3002 \u6682\u4e0d\u8981\u6c42\u5199\u7c7b\u578b\u6ce8\u89e3\u3002 "},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#7case","title":"7\u3001\u7528\u4f8b\uff08case\uff09\u89c4\u8303","text":" \u4ee5\u7c7b\u7684\u5f62\u5f0f\u5199\u7528\u4f8b\uff0c\u7528\u4f8b\u7c7b\u96c6\u6210\u7528\u4f8b\u57fa\u7c7b\u3002 \u7528\u4f8b\u7c7b\u9700\u8981\u5199\u6ce8\u91ca\u3002 \u6d4b\u8bd5\u7528\u4f8b\u51fd\u6570\u8bf4\u660e\uff08\u5efa\u8bae\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u540d\u79f0\uff09 \"\"\"\u53f3\u4fa7\u9884\u89c8-\u56fe\u7247\u7c7b\u578b\u4fe1\u606f\u680f\u57fa\u672c\u4fe1\u606f\"\"\"\n \u4e0d\u5199\u8c03\u8bd5\u4ee3\u7801 if __name__ == '__main__':\npytest.main()\n \u6240\u6709\u7528\u4f8b\u90fd\u7ee7\u627f BaseCase\u3002 BaseCase \u91cc\u9762\u653e\u4e00\u4e9b\u6d4b\u8bd5\u6570\u636e\u7684\u5e38\u91cf\uff0c\u6bd4\u5982\u6587\u4ef6\u540d\u79f0\uff0c\u5e94\u7528\u540d\u79f0\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u4e00\u4e9b\u901a\u7528\u7684\u5b57\u7b26\u4e32\u3002 \u8fd9\u7c7b\u662f\u5c5e\u4e8e\u6d4b\u8bd5\u6570\u636e\u3002 class BaseCase(DfmAssert):\n\"\"\"\u7528\u4f8b\u57fa\u7c7b\"\"\"\nNEW_FILE = \"\u65b0\u5efa\u6587\u672c.txt\"\nTEST_FILE = \"test.txt\"\nNEW_DIR = \"\u65b0\u5efa\u6587\u4ef6\u5939\"\nNEW_WORD = \"\u65b0\u5efaWord\u6587\u6863.doc\"\nAPP_HELP = \"damn\"\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\n\"\"\"\u7528\u4f8b\u6807\u9898\uff08\u590d\u5236PMS\u4e0a\u7528\u4f8b\u6807\u9898\uff09\"\"\"\ndfm = DfmWidget()\ndfm.click_xxx_by_attr(self.NEW_FILE)\ndfm.new_file_in_desktop_by_cmd(self.NEW_FILE)\nself.assert_true(dfm.get_process_status(self.APP_NAME))\n \u7528\u4f8b\u91cc\u9762\u5c3d\u91cf\u51cf\u5c11\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\uff0c\u66f4\u8981\u51cf\u5c11\u76f8\u540c\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\u3002 \u7edf\u4e00\u6587\u4ef6\u6ce8\u91ca\u5934\u3002 #!/usr/bin/env python3\n# _*_ coding:utf-8 _*_\n\"\"\"\n:Author:email@uniontech.com\n:Date :${DATE} ${TIME}\n\"\"\"\n"},{"location":"AT%E5%9F%BA%E7%A1%80%E6%A1%86%E6%9E%B6%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#8","title":"8\u3001\u5176\u4ed6\u89c4\u8303","text":" \u65e5\u5fd7\u6253\u5370\u8981\u5728\u65b9\u6cd5\u6700\u524d\u9762\uff0c\u5426\u5219\u4ee3\u7801\u62a5\u9519\u6ca1\u6709\u65e5\u5fd7\u8f93\u51fa\uff0c\u4e0d\u597d\u5b9a\u4f4d\u95ee\u9898\u3002\uff08\u6211\u4eec\u4f1a\u8003\u8651\u7ee7\u7eed\u4f7f\u7528\u62e6\u622a\u5668\u6253\u5370\u65e5\u5fd7\uff09 \u6240\u6709\u7684\u64cd\u4f5c\u90fd\u9700\u8981\u6709\u65e5\u5fd7\uff0c\u5305\u62ec sleep()\uff0c\u6211\u4eec\u4f1a\u91cd\u5199\u4e00\u4e2a\u6709\u65e5\u5fd7\u8f93\u5165\u7684 sleep\u3002 \u4e1a\u52a1\u5c42\u65e5\u5fd7\u7ea7\u522b\u4e3a INFO\u3002 hook \u51fd\u6570\u53ea\u80fd\u5199\u5230\u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u91cc\u9762\u3002 apps \u76ee\u5f55\u4e0b\u7684 conftest.py \u539f\u5219\u4e0a\u4e0d\u4f1a\u65b0\u589e fixture\u3002 \u56fa\u5b9a\u76ee\u5f55\u6216\u5143\u7d20\u63a7\u4ef6\u7684\u64cd\u4f5c\uff0c\u5c06\u64cd\u4f5c\u65b9\u6cd5\u5199\u6b7b\uff0c\u6587\u4ef6\u7c7b\u64cd\u4f5c\u5c06\u6587\u4ef6\u540d\u7559\u53c2\u6570\u3002 \u8def\u5f84\u62fc\u63a5\u89c4\u8303\uff1a \u7cfb\u7edf\u4e2d\u56fa\u5b9a\u76ee\u5f55\uff0c\u8def\u5f84\u62fc\u63a5\u65f6\u4f7f\u7528\u6ce2\u6d6a\u7b26\u53f7\uff0c\u6bd4\u5982\uff1a~/Desktop/\uff0c\u4e0b\u5c42\u4f7f\u7528 os.path.expanduser()\uff0c\u5b83\u53ef\u4ee5\u81ea\u52a8\u8bc6\u522b\u6ce2\u6d6a\u7b26\u53f7\u3002 \u9879\u76ee\u4e0b\u8def\u5f84\u4f7f\u7528\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u8def\u5f84\uff0c\u6bd4\u5982\uff1aConfig.BASE_PATH\uff0c\u56e0\u4e3a\u9879\u76ee\u662f\u53ef\u4ee5\u5728\u4efb\u610f\u8def\u5f84\u8fd0\u884c\u7684\uff0c\u9700\u8981\u52a8\u6001\u62fc\u63a5\u8def\u5f84\u3002 "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/","title":"AT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848","text":"# =================================================\n# Author : Mikigo\n# Time : 2022/3/16\n# version \uff1a1.0\n# =================================================\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_1","title":"\u4e00\u3001\u76ee\u6807","text":"AT \u5e94\u7528\u5e93\u6539\u9020\u662f\u57fa\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u8fdb\u884c\u7528\u4f8b\u65b9\u6cd5\u548c\u4e1a\u52a1\u903b\u8f91\u7684\u91cd\u65b0\u8bbe\u8ba1\uff0c\u4ee5\u5b9e\u73b0\u5e94\u7528\u5e93\u9ad8\u6548\u7684\u7f16\u5199\u3001\u7ef4\u62a4\u7528\u4f8b\u53ca\u5176\u65b9\u6cd5\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_2","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u6587\u4ef6\u7ba1\u7406\u5668\u4ece\u4e1a\u52a1\u590d\u6742\u5ea6\u548c\u7528\u4f8b\u91cf\u6765\u8bb2\uff0c\u5728\u7cfb\u7edf\u6240\u6709\u5e94\u7528\u4e2d\uff0c\u662f\u5f88\u6709\u4ee3\u8868\u6027\u7684\uff0c\u96be\u5ea6\u4e5f\u662f\u6700\u5927\u7684\uff0c\u56e0\u6b64\u6211\u4eec\u9009\u53d6\u6587\u4ef6\u7ba1\u7406\u5668\u4f5c\u4e3a\u5e94\u7528\u5e93\u6539\u9020\u7684\u5b9e\u9a8c\u5e94\u7528\uff0c\u7ed9\u540e\u7eed\u5176\u4ed6\u5e94\u7528\u6539\u9020\u63d0\u4f9b\u5207\u5b9e\u53ef\u884c\u7684\u601d\u8def\u548c\u65b9\u6848\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1","title":"1\u3001\u5206\u5c42\u8bbe\u8ba1\u56fe","text":"\u6574\u4f53\u4ecd\u7136\u9075\u5faa PO \u8bbe\u8ba1\u7406\u5ff5\uff0c\u6839\u636e\u4e1a\u52a1\u9700\u8981\uff0c\u5c06\u6587\u7ba1\u4e1a\u52a1\u5c42\u8fdb\u884c 3 \u5c42\u5212\u5206\uff1a "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2","title":"2\u3001\u76ee\u5f55\u7ed3\u6784","text":"autotest-dde-file-manager # \u5e94\u7528\u4ed3\u5e93\n\u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 test_xxx_001.py\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u00a0\u251c\u2500\u2500 __init__.py\n\u2502 \u00a0\u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u00a0\u251c\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u00a0\u251c\u2500\u2500 base_widget.py # \u65b9\u6cd5\u57fa\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 title_widget.py # title \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 right_view_widget.py # right view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 left_view_widget.py # left view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 pop_widget.py # pop \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 dfm_widget.py # \u65b9\u6cd5\u7684\u7edf\u4e00\u51fa\u53e3\n\u2502 \u00a0\u2514\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 tag # \u7528\u4f8b\u6807\u7b7e\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 xxx.csv # \u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2514\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_3","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_1","title":"1\u3001\u57fa\u7c7b","text":" \u7ee7\u627f\u6838\u5fc3\u5c42\u7684\u5404\u4e2a\u6a21\u5757\u7c7b\u3002 \u62bd\u53d6\u64cd\u4f5c\u5c42\u7684\u4e00\u4e9b\u57fa\u7840\u65b9\u6cd5\u3002 \u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u7684\u4e00\u4e9b\u516c\u5171\u65b9\u6cd5\u3002 \u8def\u5f84\u7ec4\u88c5\u65b9\u6cd5\u3002 \u4e00\u4e9b\u4e1a\u52a1\u5c42\u76f8\u5173\u7684\u53d8\u91cf\u3001\u5e38\u91cf\u3001shell\u547d\u4ee4\u3001\u5750\u6807\u3002 \u65b9\u6cd5\u57fa\u7c7b\u7684\u5199\u6cd5\uff1a from src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_1","title":"2\u3001\u64cd\u4f5c\u5c42","text":" \u6a21\u5757\u5212\u5206 \u6309\u7167\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u6587\u7ba1\u4e3b\u754c\u9762\u5206\u4e3a\u4e09\u4e2a\u533a\u57df\uff1a\u6807\u9898\u680f\u3001\u53f3\u8fb9\u89c6\u56fe\u533a\u57df\u3001\u5de6\u8fb9\u89c6\u56fe\u533a\u57df \u5f39\u7a97\uff1a\u8bbe\u7f6e\u754c\u9762\u5f39\u7a97\u3001\u4fdd\u9669\u7bb1\u5f39\u7a97\u3001\u5220\u9664\u786e\u8ba4\u5f39\u7a97\u3001\u53ca\u5404\u79cd\u7f51\u7edc\u5f39\u7a97 \u53f3\u952e\u83dc\u5355\uff1a\u6682\u65f6\u4e0d\u8003\u8651\u4e3a\u5355\u72ec\u7684\u6a21\u5757\uff0c\u8003\u8651\u4ee5\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6848\u505a\u6210\u516c\u5171\u5e93\u3002 \u5404\u4e2a\u6a21\u5757\u53ea\u7ee7\u627f\u57fa\u7c7b from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u6784\u9020\u51fd\u6570\u91cc\u9762\u4e0d\u6784\u9020\u5bf9\u8c61\uff0c\u53ef\u4ee5\u521d\u59cb\u5316\u4e00\u4e9b\u53d8\u91cf\u3002 \u4e0d\u540c\u7684\u5b9a\u4f4d\u65b9\u6848\u8c03\u7528\u4e0d\u540c\u7684\u5b9a\u4f4d\u5de5\u5177\u5bf9\u8c61\u3002 self.dog\nself.ui\nself.d_bus\n \u65b9\u6cd5\u7f16\u5199 \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n "},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3","title":"3\u3001\u5e94\u7528\u5c42","text":" \u7ee7\u627f\u64cd\u4f5c\u5c42\u7684\u6240\u6709\u7c7b\u3002 \u4ec5\u4ec5\u7528\u4e8e\u7528\u4f8b\u4e2d\u5bfc\u5165\u65b9\u4fbf\uff0c\u4e0d\u505a\u5176\u4ed6\u4e8b\u60c5\u3002 class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n DfmAssert \u76f4\u63a5\u5728\u7528\u4f8b\u91cc\u9762\u7ee7\u627f\uff0c\u65b9\u4fbf\u4f7f\u7528\u65ad\u8a00\u8bed\u53e5\u3002 from apps.dde_file_manager.widget.dfm_widget import DfmWidget\nfrom public.assert import Assert\nclass DfmAssert(Assert):\ndef assert_file_exists_in_desktop(self, file_name):\nself.assert_file_exists(f\"~/Desktop{file_name}\")\n...\nDfmWidget().get_file_in_desktop()\n \u7528\u4f8b\u91cc\u9762\u76f4\u63a5\u7ee7\u627f\uff0c\u65b9\u4fbf\u5728\u7528\u4f8b\u91cc\u9762\u4f7f\u7528 self \u8fdb\u884c\u65ad\u8a00\uff0c\u66f4\u7b26\u5408\u65ad\u8a00\u7684\u4f7f\u7528\u4e60\u60ef\uff0c\u7528\u4f8b\u903b\u8f91\u4e0a\u66f4\u6e05\u695a\u3002 class BaseCase(DfmAssert):\npass\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\nself.assert_file_exists_in_desktop(\"xxx\")\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4","title":"4\u3001\u903b\u8f91\u4e3e\u4f8b","text":"\u7528\u4f8b\u4ee3\u7801\u8c03\u7528\u903b\u8f91\u4e3e\u4f8b\uff1a # BaseWidget\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n# =============================================\n# TitleWidget\nclass TitleWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_title_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# RightViewWidget\nclass RightViewWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_right_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# =============================================\n# \u51fa\u53e3 DfmWidget\nclass DfmWidget(TitleWidget, RightViewWidget):\npass\n# =============================================\n# in case\nfrom apps.dde_file_manager.widget.dfm_widget import DfmWidget\ndfm = DfmWidget()\ndfm.click_xxx_title_by_ui()\ndfm.click_xxx_right_by_ui()\ndfm.dog.print_desc()\ndfm.ui.print_number()\n"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#_4","title":"\u56db\u3001\u5de5\u7a0b\u6539\u9020\u5b9e\u65bd\u6b65\u9aa4","text":""},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#1_2","title":"1\u3001\u5de5\u7a0b\u4ee3\u7801\u62c9\u53d6","text":"1.1. \u5c06\u81ea\u52a8\u5316\u57fa\u7840\u6846\u67b6\u7684\u529f\u80fd\u62c9\u5230\u672c\u5730 Autotest Basic Frame \uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame 1.2. \u5c06\u5e94\u7528\u5e93\u4ee3\u7801\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u5e94\u7528\u5e93\u7684\u4ed3\u5e93\u547d\u540d\u5e94\u8be5\u662f\u957f\u8fd9\u6837\u7684 autotest_deepin_xxx\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#2_2","title":"2\u3001\u8c03\u6574\u5de5\u7a0b\u76ee\u5f55","text":"\u6309\u7167 \u65b9\u6848\u8bbe\u8ba1-\u76ee\u5f55\u7ed3\u6784 \u8fdb\u884c\u76ee\u5f55\u8c03\u6574\uff0c\u5c3d\u91cf\u4f7f\u7528\u7f16\u8f91\u5668\u8fdb\u884c\u76f8\u5e94\u7684\u8c03\u6574\uff0c\u7f16\u8f91\u5668\u63a8\u8350\u4f7f\u7528 Pycharm \uff0c\u4ee5\u4e0b\u64cd\u4f5c\u5747\u5728 Pycharm \u91cc\u9762\u53ef\u5b9e\u73b0\u3002 2.1. \u9700\u8981\u79fb\u52a8 py \u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u76f4\u63a5\u5728\u7f16\u8f91\u5668\u91cc\u9762\uff0c\u4f7f\u7528\u9f20\u6807\u9009\u4e2d\u5e76\u6309\u4f4f\uff0c\u4e4b\u540e\u62d6\u52a8\u5230\u76ee\u6807\u4f4d\u7f6e\u5373\u53ef\uff0cPycharm \u4f1a\u5c3d\u53ef\u80fd\u7684\u81ea\u52a8\u89e3\u51b3\u79fb\u52a8\u5bfc\u81f4\u7684\u8def\u5f84\u95ee\u9898\u3002\u6ce8\u610f\uff0c\u6211\u8bf4\u7684\u662f\u201c\u5c3d\u53ef\u80fd\u201d\uff0c\u6709\u4e9b\u9a9a\u64cd\u4f5c\u7f16\u8f91\u5668\u662f\u65e0\u6cd5\u81ea\u52a8\u5904\u7406\u7684\u3002\u5982\u679c\u6ca1\u6709\u88ab\u7f16\u8f91\u5668\u81ea\u52a8\u5904\u7406\u7684\u8def\u5f84\u95ee\u9898\uff0c\u540e\u7eed\u53ea\u80fd\u624b\u52a8\u89e3\u51b3\u3002 2.2. \u9700\u8981\u91cd\u547d\u540d\u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u5728\u7f16\u8f91\u5668\u91cc\u9762\u9009\u4e2d\u6587\u4ef6\uff0c\u7136\u540e\u4f7f\u7528\u5feb\u6377\u952e Shift + F6 \uff08\u5982\u679c\u5feb\u6377\u952e\u6ca1\u53cd\u5e94\uff0c\u6587\u4ef6\u53f3\u952e\u83dc\u5355 Refactor \u2014\u2014 Rename\uff09\uff0c\u7136\u540e\u5728\u8f93\u5165\u6846\u4e2d\u8f93\u5165\u8981\u91cd\u547d\u540d\u7684\u540d\u79f0\uff0c\u540c\u65f6\uff0c\u786e\u8ba4\u52fe\u9009 Search for references \u548c Search in comments and strings \u8fd9\u4e24\u4e2a\u9009\u9879\uff0c\u6700\u540e\u6309\u56de\u8f66\u6216\u8005\u9f20\u6807\u70b9 Refactor \u3002 \u6ce8\u610f\uff0c\u6b64\u65f6\u7f16\u8f91\u5668\u53ef\u80fd\u4f1a\u63d0\u793a\u4f60\uff0c\u4f60\u8fd9\u4e2a\u91cd\u547d\u540d\u7684\u64cd\u4f5c\u5173\u8054\u4e86\u591a\u4e2a\u6a21\u5757\uff0c\u5b83\u88ab\u591a\u4e2a\u5730\u65b9\u90fd\u4f7f\u7528\u5230\u4e86\uff0c\u76f8\u5173\u7684\u6a21\u5757\u662f\u5426\u4e5f\u4e00\u8d77\u6539\u540d\u4e86\uff0c\u8fd9\u4e0d\u5e9f\u8bdd\u5417\uff0c\u7528\u8fd9\u4e2a\u529f\u80fd\u5c31\u662f\u60f3\u628a\u5173\u8054\u5230\u7684\u90fd\u4fee\u6539\uff0c\u4e0d\u7136\u6211\u4e3a\u4ec0\u4e48\u4e0d\u7528\u6587\u7ba1\u7684\u91cd\u547d\u540d\u529f\u80fd\u5462\uff0c\u522b\u60f3\u4e86\uff0c\u76f4\u63a5\u70b9\u5de6\u4e0b\u89d2\u7684 Refactor \u6309\u94ae\uff0c\u5c31\u662f\u5e72\u3002 \u7c7b\u540d\u3001\u51fd\u6570\u540d\u7684\u91cd\u547d\u540d\u90fd\u5c3d\u91cf\u91c7\u7528\u8fd9\u79cd\u65b9\u6848\uff0c\u56e0\u4e3a\u7f16\u8f91\u5668\u4f1a\u81ea\u52a8\u7ed9\u6211\u4eec\u627e\u5230\u5173\u8054\u7684\u5730\u65b9\uff0c\u7136\u540e\u540c\u6b65\u4fee\u6539\u6389\u3002\u4f60\u53ef\u5343\u4e07\u522b\u76f4\u63a5\u5220\u4e86\u4fee\u6539\u540d\u79f0\uff0c\u4e0d\u7136\u4f60\u53ef\u80fd\u4f1a\u82b1\u4e0a\u4e00\u5929\u7684\u65f6\u95f4\u6765\u89e3\u51b3\u91cd\u547d\u540d\u7684\u95ee\u9898\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#3_1","title":"3\u3001\u5b9e\u73b0\u6838\u5fc3\u5e93\u63a5\u53e3","text":"3.1. BaseWidget \u5728 BaseWidget \u91cc\u9762\u628a\u8be5\u5199\u7684\u90fd\u5199\u597d\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u4e0a\u9762\u7684\u8bbe\u8ba1\u7406\u5ff5\u6765\u5199\u3002 \u5982\u679c\u4f60\u5acc\u9ebb\u70e6\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u6587\u7ba1\u7684\u5b9e\u9645\u5de5\u7a0b\u4ee3\u7801 autotest_dde_file_manager : https://gerrit.uniontech.com/admin/repos/autotest_dde_file_manager \u3002 3.2. \u64cd\u4f5c\u5c42 \u5982\u679c\u4f60\u662f\u65b0\u5199\u9879\u76ee\uff0c\u4f60\u4f1a\u53d1\u73b0\u4e00\u5207\u90fd\u662f\u90a3\u4e48\u7684\u7b80\u5355\u3001\u76f4\u63a5\uff0c\u6309\u7167\u6211\u4eec\u63d0\u4f9b\u7ed9\u4f60\u7684\u63a5\u53e3\u5199\u7528\u4f8b\u7684\u64cd\u4f5c\u65b9\u6cd5\u5c31\u597d\u4e86\u3002 \u5982\u679c\u4f60\u662f\u60f3\u5bf9\u539f\u6765\u7684\u5de5\u7a0b\u8fdb\u884c\u6539\u9020\uff0c\u4f60\u9700\u8981\u6309\u7167\u6838\u5fc3\u5e93\u65b9\u6cd5\u7684\u8c03\u7528\uff0c\u5c06\u4f60\u4e4b\u524d\u5199\u7684\u6bcf\u4e2a\u65b9\u6848\u8fdb\u884c\u5bf9\u5e94\u7684\u4fee\u6539\uff0c\u5305\u62ec\u7c7b\u548c\u65b9\u6cd5\u7684\u547d\u540d\u3001\u65b9\u6cd5\u5185\u6240\u8981\u7528\u5230\u4e0d\u540c\u5b9a\u4f4d\u65b9\u6cd5\u7684\u5199\u6cd5\u4fee\u6539\u3002 \u8fd9\u65f6\u5019\u4f60\u53ef\u80fd\u4f60\u7684\u4ee3\u7801\u4e2d\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u62a5\u9519\uff0c\u4e0d\u7528\u62c5\u5fc3\uff0c\u4f60\u53ef\u4ee5\u4ece\u4e1a\u52a1\u903b\u8f91\u51fa\u53d1\uff0c\u60f3\u6e05\u695a\u8fd9\u4e2a\u65b9\u6cd5\u662f\u5e72\u4ec0\u4e48\u7684\u3001\u64cd\u4f5c\u7684\u5bf9\u8c61\u662f\u4ec0\u4e48\u3001\u53c2\u6570\u662f\u4ec0\u4e48\uff0c\u6ce8\u610f\u8fd9\u4e9b\u4fee\u6539\u662f\u4f1a\u5f71\u54cd\u5230\u7528\u4f8b\u4ee3\u7801\u91cc\u9762\u7684\uff0c\u6ca1\u5173\u7cfb\uff0c\u7528\u4f8b\u91cc\u9762\u672c\u6765\u4e5f\u5e94\u8be5\u88ab\u5173\u8054\u4fee\u6539\u3002 3.3. \u628a\u914d\u7f6e\u6a21\u5757\u5199\u597d\uff0c\u8fd9\u90e8\u5206\u57fa\u672c\u53ef\u4ee5\u590d\u5236\u6587\u7ba1\u7684\u4ee3\u7801\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#4_1","title":"4\u3001\u8def\u5f84\u5904\u7406","text":"4.1. \u5bfc\u5165\u8def\u5f84 \u65b9\u6cd5\u548c\u7528\u4f8b\u4e2d\u90fd\u4f1a\u6d89\u53ca\u5230\u5bfc\u5165\u8def\u5f84\u7684\u4fee\u6539\uff0c\u5728\u4fee\u6539\u8def\u5f84\u65f6\uff0c\u5efa\u8bae\u4f60\u4f7f\u7528 Ctrl + Shift + R \u5168\u5c40\u66ff\u6362\uff0c\u4f1a\u5c06\u6574\u4e2a\u9879\u76ee\u4e0b\u7684\u76f8\u540c\u5730\u65b9\u90fd\u4fee\u6539\u5230\uff0c\u5f53\u7136\uff0c\u4f60\u4e5f\u53ef\u4ee5\u5728\u5c0f\u5f39\u7a97\u4e2d\u4fee\u6539\u5168\u5c40\u66ff\u6362\u4e3a\u5c40\u90e8\u76ee\u5f55\u4e0b\u66ff\u6362\u3002\u5904\u7406\u90a3\u79cd\u6ca1\u6709\u5173\u8054\u5173\u7cfb\uff0c\u4f46\u662f\u53c8\u662f\u76f8\u540c\u540d\u79f0\u7684\u91cd\u547d\u540d\uff0c\u6211\u4e5f\u63a8\u8350\u4f7f\u7528\u8fd9\u79cd\u65b9\u5f0f\u8fdb\u884c\u91cd\u547d\u540d\u3002 \u6ce8\u610f\uff0c\u5168\u5c40\u66ff\u6362\u7684\u65b9\u5f0f\u4efb\u7136\u65e0\u6cd5\u4fdd\u8bc1\u771f\u7684\u5168\u5c40\u88ab\u66ff\u6362\u4e86\uff08\u53ef\u80fd\u662f\u7f16\u8f91\u5668\u7684 Bug \u5427\uff09\uff0c\u6240\u4ee5\u4f60\u4ecd\u7136\u9700\u8981\u624b\u52a8\u770b\u4e0b\u5404\u5904\u662f\u5426\u4fee\u6539\u5230\u4f4d\u3002 4.2. \u8d44\u6e90\u8def\u5f84 \u4e00\u4e9b\u7528\u4f8b\u8d44\u6e90\u9700\u8981\u6839\u636e config.py \u91cc\u9762\u7684\u8def\u5f84\u914d\u7f6e\u8fdb\u884c\u8d44\u6e90\u8def\u5f84\u7684\u62fc\u63a5\uff0c\u5982\u679c\u4f60\u539f\u6765\u672c\u6765\u5c31\u6709\u4e00\u4e2a\u51fd\u6570\u4e13\u95e8\u7528\u4e8e\u7ec4\u88c5\u8def\u5f84\u7684\uff0c\u90a3\u4f60\u53ea\u9700\u8981\u4fee\u6539\u8fd9\u4e00\u4e2a\u5730\u65b9\u5c31\u597d\u4e86\uff0c\u5982\u679c\u4f60\u4e4b\u524d\u5e76\u6ca1\u6709\u8fd9\u6837\u7684\u8bbe\u8ba1\uff0c\u90a3\u53ef\u80fd\u9700\u8981\u4fee\u6539\u5927\u91cf\u6d89\u53ca\u5230\u8d44\u6e90\u8def\u5f84\u7684\u5730\u65b9\u3002"},{"location":"AT%E5%BA%94%E7%94%A8%E5%BA%93%E8%AE%BE%E8%AE%A1%E6%96%B9%E6%A1%88/#5","title":"5\u3001\u8c03\u8bd5\u548c\u7f16\u5199\u7528\u4f8b","text":"\u4ee5\u4e0a\u51e0\u4e2a\u6b65\u9aa4\u505a\u5b8c\uff0c\u57fa\u672c\u5c31\u53ef\u4ee5\u8fdb\u884c\u7528\u4f8b\u4ee3\u7801\u7684\u8c03\u8bd5\u4e86\uff0c\u8fd9\u90e8\u5206\u5de5\u4f5c\u4e3b\u8981\u89e3\u51b3\u4f60\u4e4b\u524d\u51e0\u4e2a\u6b65\u9aa4\u9057\u6f0f\u7684\u95ee\u9898\uff0c\u5982\u679c\u6240\u6709\u7528\u4f8b\u90fd\u8c03\u8bd5\u901a\u8fc7\u4e86\uff0c\u90a3\u4e48\u5de5\u7a0b\u6539\u9020\u5c31\u5168\u90e8\u5b8c\u6210\u4e86\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/","title":"AT \u5f00\u53d1\u89c4\u8303","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u5f00\u53d1\u89c4\u8303\u662f\u6839\u636e\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fd0\u884c\u4e24\u5e74\u591a\u6765\uff0c\u9047\u5230\u95ee\u9898\u89e3\u51b3\u95ee\u9898\u800c\u5f62\u6210\u7684\u4e00\u4e9b\u89e3\u51b3\u65b9\u6848\uff0c\u6216\u8005\u8bf4\u7ecf\u9a8c\u603b\u7ed3\uff1b\u8fd9\u4e9b\u7ecf\u9a8c\u7b26\u5408\u6211\u4eec\u73b0\u9636\u6bb5 AT \u6240\u5e94\u7528\u7684\u573a\u666f\u9700\u8981\uff0c\u4e5f\u662f\u6211\u4eec\u7ecf\u8fc7\u957f\u671f\u601d\u8003\uff0c\u4e0d\u65ad\u8bd5\u9519\u4e0d\u65ad\u4fee\u6b63\uff0c\u5e76\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u5b9e\u8df5\u4e2d\u68c0\u9a8c\u8fc7\u53ef\u884c\u7684\u3002\u4ee5\u6b64\uff0c\u5e0c\u671b\u80fd\u5e2e\u52a9\u53c2\u4e0e\u5230\u81ea\u52a8\u5316\u7684\u76f8\u5173\u4eba\u5458\u51cf\u5c11\u8bd5\u9519\u6210\u672c\uff0c\u66f4\u597d\u3001\u66f4\u5feb\u7684\u7f16\u5199\u7528\u4f8b\u53ca\u7ef4\u62a4\u7528\u4f8b\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_1","title":"\u4e00\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u89c4\u8303","text":"\u6807\u7b7e\u5316\u7ba1\u7406\u6587\u6863\u8bf7\u53c2\u8003\uff1a \u300a\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u64cd\u4f5c\u6307\u5f15\u300b \u4ee5\u4e0b\u8bf4\u51e0\u4e2a\u5bb9\u6613\u51fa\u73b0\u7684\u95ee\u9898\uff1a"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1","title":"1. \u5bf9\u5e94\u5173\u7cfb","text":" \u5199\u5b8c\u81ea\u52a8\u5316\u7528\u4f8b\u4e4b\u540e\uff0c\u8bf7\u5728 CSV \u6587\u4ef6\u4e2d\u6807\u8bb0\u7528\u4f8b\u7684 ID\u3001\u7b49\u7ea7\u3002\u4e3a\u4e86\u63d0\u9192\u6807\u8bb0\uff0c\u6267\u884c\u7528\u4f8b\u65f6\u5728\u9996\u884c\u4f1a\u8f93\u51fa ERROR \u65e5\u5fd7\uff1a CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94\u7684 ID\uff1b \u5728\u6700\u7ec8\u63d0\u4ea4\u4ee3\u7801\u4e4b\u524d\uff0c\u4f60\u9700\u8981\u5728 CSV \u6587\u4ef6\u91cc\u9762\u5c06ID\u3001\u7528\u4f8b\u7b49\u7ea7\u7b49\u6807\u7b7e\u8865\u5168\uff0c\u5982\u679c CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94 ID\uff0c\u540e\u7eed\u5728\u6279\u91cf\u6267\u884c\u7684\u65f6\u5019\uff0c\u8fd9\u4e9b\u7528\u4f8b\u662f\u4e0d\u4f1a\u6267\u884c\u7684\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2","title":"2. \u540d\u79f0\u4e00\u81f4","text":" CSV \u6587\u4ef6\u7684\u6587\u4ef6\u540d\u3001\u7528\u4f8b\u51fd\u6570\u4e2d\u95f4\u7684\u540d\u79f0\u4e00\u81f4\u3001\u7528\u4f8b py \u6587\u4ef6\u4e2d\u95f4\u7684\u540d\u79f0\uff0c\u8fd9\u4e09\u4e2a\u540d\u79f0\u4e00\u81f4\u3002 \u4e3e\u4f8b\uff1a # test_music_001.py\ndef test_music_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u90a3\u4e48 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e3a music.csv\u3002 AT \u6846\u67b6\u5e95\u5c42\u4ee3\u7801\u5b9e\u73b0\u662f\u5c06 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e0e\u7528\u4f8b\u51fd\u6570\u540d\u79f0\u540d\u79f0\uff08item.name\uff09\u8fdb\u884c\u5bf9\u5e94\uff0c\u56e0\u6b64\uff0c\u6ce8\u610f CSV \u6587\u4ef6\u540d\u79f0\u5bf9\u5e94\u7684\u662f\u7528\u4f8b\u51fd\u6570\u540d\u79f0\uff0c\u5373 def test_music_001 \u91cc\u9762\u7684 music \uff0c\u800c\u4e0d\u662f test_music_001.py \u91cc\u9762\u7684 music \u3002 \u8fd9\u91cc\u7ec6\u7ec6\u54c1\u4e00\u4e0b\u54c8~ \u5982\u679c\u4f60\u5c06\u4e0a\u4f8b\u5199\u6210\u4e86\u8fd9\u6837: # test_music_001.py\ndef test_movie_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n \u7528\u4f8b\u6267\u884c\u6ca1\u95ee\u9898\uff0c\u4f46\u662f\u6807\u7b7e\u5316\u7ba1\u7406\u662f\u4e0d\u751f\u6548\u7684\uff0c\u6846\u67b6\u65e0\u6cd5\u5c06 music.csv\u6587\u4ef6\u91cc\u9762\u6807\u7b7e\uff0c\u6dfb\u52a0\u5230 test_movie_001\u8fd9\u4e2a\u7528\u4f8b\u4e2d\uff0c\u56e0\u4e3a\u4ed6\u4eec\u6ca1\u6709\u5bf9\u5e94\u5173\u7cfb\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#tag","title":"\u4e8c\u3001\u5206\u652f\u53ca tag \u7ba1\u7406\u89c4\u8303","text":"\u53c2\u8003\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u4ee3\u7801\u7ba1\u7406\u89c4\u8303\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2-tag","title":"2. \u5e94\u7528\u5e93 tag","text":" \u5e94\u7528\u5e93 tag \u6839\u636e\u5e94\u7528\u4ea4\u4ed8\u8282\u70b9\u751f\u6210\uff0c\u6bcf\u6b21\u6253 tag \u4e4b\u524d\uff0c\u76f8\u5173\u6d4b\u8bd5\u4eba\u5458\u9700\u8981\u8fdb\u884c\u7528\u4f8b\u8c03\u8bd5\uff1b \u8c03\u8bd5\u7528\u4f8b\u662f\u6307\u7684\u5728\u5168\u67b6\u6784\uff08x86\u3001arm\u3001mips\uff09\u4e0a\u8c03\u8bd5\u901a\u8fc7\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\u8fbe\u5230 90% \u4ee5\u4e0a\u624d\u80fd\u6253 tag\uff0c\u901a\u8fc7 Jenkins \u6267\u884c\u5668\u6267\u884c\u7528\u4f8b\uff0c\u4fdd\u7559\u901a\u8fc7\u7387\u7ed3\u679c\uff1b \u7528\u4f8b\u901a\u8fc7\u7387\uff1a\u901a\u8fc7\u7528\u4f8b\u6570 / (\u603b\u7528\u4f8b\u6570 - \u5df2\u5e9f\u5f03\u7528\u4f8b) \u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u7b97\u901a\u8fc7 Jenkins \u6267\u884c\u5668 \u4f60\u53ef\u80fd\u4f1a\u5728\u4e00\u4e2a\u4ea4\u4ed8\u5468\u671f\u5185\u6301\u7eed\u7684\u8fdb\u884cAT\u7528\u4f8b\u8c03\u8bd5\uff0c\u4f46\u662f\u6700\u7ec8 AT \u7528\u4f8b\u6253 tag \u7684\u5e94\u7528\u7248\u672c\uff0c\u9700\u8981\u4f7f\u7528\u5e94\u7528\u96c6\u6210\u4ea4\u4ed8\u7684\u6700\u65b0\u5e94\u7528\u7248\u672c\uff0c\u53ef\u4ee5\u4f7f\u7528\u5e94\u7528\u7684\u63d0\u6d4b\u7248\u672c\uff1b\u4e00\u5b9a\u8981\u786e\u4fdd\u8c03\u8bd5\u7528\u4f8b\u7684\u5e94\u7528\u7248\u672c\u662f\u6700\u65b0\u7684\uff0c\u4e0d\u7136\u96c6\u6210\u8fdb\u53bb\u4e4b\u540e\uff0c\u6301\u7eed\u96c6\u6210\u5c31\u4f1a\u51fa\u95ee\u9898\uff1b tag \u53f7\u600e\u4e48\u6253\uff1f \u6839\u636e\u6301\u7eed\u96c6\u6210\u7684\u8981\u6c42\u751f\u6210\uff0c\u5176\u4e2d\u5e94\u7528\u7248\u672c\u53f7\u9700\u8981\u4e0e\u9879\u76ee\u7ecf\u7406\u786e\u8ba4\u672c\u6b21\u5373\u5c06\u96c6\u6210\u7684\u5e94\u7528\u7248\u672c\u53f7\u662f\u591a\u5c11\uff1b tag \u7684 commit \u4fe1\u606f\u683c\u5f0f\uff1a # commit msg\nversion:5.6.5\n \u5176\u4e2d 5.6.5 \u5199\u5e94\u7528\u7684\u96c6\u6210\u7248\u672c\u53f7\u3002 \u751f\u6210 tag \u7684\u547d\u4ee4\u53c2\u8003\uff1a\u300aGit \u6807\u7b7e\u300b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3-tag","title":"3. \u57fa\u7840\u6846\u67b6 tag","text":"\u57fa\u7840\u6846\u67b6 tag \u4e0d\u4e0e\u4e1a\u52a1\u6302\u94a9\uff0c\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u6309\u9700\u53d1\u5e03\u7248\u672c\uff0c\u5728\u6839\u76ee\u5f55\u4e0b CURRENT \u6587\u4ef6\u4e2d\u8bb0\u5f55\u7684\u5f53\u524d\u7248\u672c\u53f7\u548c\u5386\u53f2\u7248\u672c\u53f7\uff0c\u53ca\u5176\u5bf9\u5e94\u65b0\u589e\u4e86\u54ea\u4e9b\u529f\u80fd\uff0c\u6709\u52a9\u4e8e\u5e94\u7528\u9009\u62e9\u5408\u9002\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\u3002 # CURRENT\n[current]\ntag = 0.9.5\n \u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u7684 control \u6587\u4ef6\u8bb0\u5f55\u5f53\u524d\u5e94\u7528\u5e93\u4f9d\u8d56\u7684\u57fa\u7840\u5e93\u7248\u672c\u3002 # control\n[Depends]\nautotest-basic-frame = 0.9.5\n \u7528\u4f8b\u5728\u6267\u884c\u65f6\u4f1a\u6821\u9a8c\u4e24\u4e2a\u6587\u4ef6\u7684\u7248\u672c\u53f7\u662f\u5426\u4e00\u81f4\uff0c\u5982\u679c\u4e0d\u4e00\u81f4\uff0c\u4f1a\u6253\u5370 error \u65e5\u5fd7\u3002"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_2","title":"\u4e09\u3001\u4ed3\u5e93\u6743\u9650\u7ba1\u7406","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_1","title":"1. \u57fa\u7840\u6846\u67b6","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u4ed3\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame \u57fa\u7840\u6846\u67b6\u4e0d\u5141\u8bb8\u533f\u540d\u8bbf\u95ee\uff0c\u5982\u679c\u4f60\u767b\u5f55 gerrit \u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u8bbf\u95ee\u4ee5\u4e0a\u94fe\u63a5\uff0c\u5219\u9700\u8981\u7533\u8bf7\u8bbf\u95ee\u6743\u9650\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_1","title":"2. \u5e94\u7528\u4ed3\u5e93","text":" \u81ea\u52a8\u5316\u5e94\u7528\u4ed3\u5e93\uff1a https://gerrit.uniontech.com/admin/repos/autotest_ + app_name \u94fe\u63a5\u540e\u9762\u7684 app_name \u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_3","title":"\u56db\u3001\u65b9\u6cd5\u7f16\u5199&\u8c03\u7528\u89c4\u8303","text":"\u65b9\u6cd5\u7f16\u5199\u6574\u4f53\u8bbe\u8ba1\u601d\u8def\u53c2\u8003\uff1a[\u300aAT\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b]"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_2","title":"1. \u65b9\u6cd5\u7f16\u5199","text":"\u5199\u65b9\u6cd5\u7684\u65f6\u5019\u6ce8\u610f\u65b9\u6cd5\u5f52\u5c5e\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget\uff0c\u65b9\u6cd5\u662f\u5728\u54ea\u4e2a\u533a\u57df\u64cd\u4f5c\u7684\uff0c\u5c31\u5199\u5728\u54ea\u4e2a\u7c7b\u91cc\u9762\u3002 \u4e3e\u4f8b\uff1a from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n\"\"\"\u70b9\u51fb\u6807\u9898\u680fxxx\"\"\"\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n \u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd click\ndouble_click\nright_click\nget\nmake\n \u5143\u7d20\u5bf9\u8c61\u540d\u79f0 \u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002 \u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd \u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002 \u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5 by_ui\nby_attr\nby_mk\nby_img\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_2","title":"2. \u65b9\u6cd5\u8c03\u7528","text":" \u5728\u7528\u4f8b\u4e2d\u8c03\u7528\u65b9\u6cd5\uff0c\u901a\u8fc7\u8be5\u5e94\u7528\u552f\u4e00\u7684\u51fa\u53e3\u8fdb\u884c\u8c03\u7528\uff0c\u6bd4\u5982\u6587\u7ba1\uff1a class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n \u4e0d\u8981\u5728\u7528\u4f8b\u4e2d\u5355\u72ec\u53bb\u8c03\u7528 TitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u8fd9\u4e9b\u7c7b\uff0c\u5426\u5219\u540e\u671f\u7528\u4f8b\u4f1a\u53d8\u5f97\u4e0d\u597d\u7ef4\u62a4\uff1b"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_4","title":"\u4e94\u3001\u7528\u4f8b\u7f16\u5199\u89c4\u8303","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_3","title":"1. \u57fa\u4e8e\u7c7b\u5199\u7528\u4f8b","text":"\u6240\u6709\u7528\u4f8b\u90fd\u5e94\u8be5\u57fa\u4e8e\u7c7b\u53bb\u5199\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001(self):\n\"\"\"\u97f3\u4e50\u542f\u52a8\"\"\"\n \u6ce8\u610f\u4ee5\u4e0b\u51e0\u70b9\uff1a \u7c7b\u540d\u4e0d\u8981\u968f\u4fbf\u53d6\uff0c\u540c\u4e00\u4e2a\u5e94\u7528\u5e94\u8be5\u4f7f\u7528\u540c\u4e00\u4e2a\u7c7b\u540d\uff0c\u7528\u4f8b\u7c7b\u540d\u79f0\u5fc5\u987b\u4ee5 Test \u5f00\u5934\uff0c\u9075\u5faa\u5927\u9a7c\u5cf0\u547d\u540d\u89c4\u8303\uff1b \u7528\u4f8b\u7c7b\u7ee7\u627f BaseCase\uff0c\u4e00\u4e2a\u5e94\u7528\u53ea\u6709\u4e00\u4e2a BaseCase \u4e00\u4e2a py \u6587\u4ef6\u91cc\u9762\u53ea\u6709\u4e00\u4e2a\u7c7b\uff0c\u6211\u4eec\u79f0\u4e3a\u4e00\u4e2a\u6d4b\u8bd5\u7c7b\uff1b \u4e00\u4e2a\u7c7b\u91cc\u9762\u53ef\u4ee5\u6709\u591a\u4e2a\u7528\u4f8b\u51fd\u6570\uff0c\u8fd9\u53d6\u51b3\u8fd9\u6761\u7528\u4f8b\u6709\u591a\u5c11\u4e2a\u6d4b\u8bd5\u70b9\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001_1(self):\n\"\"\"\u4efb\u52a1\u680f\u542f\u52a8\u97f3\u4e50\"\"\"\ndef test_music_001_2(self):\n\"\"\"\u542f\u52a8\u5668\u542f\u52a8\u97f3\u4e50\"\"\" \ndef test_music_001_3(self):\n\"\"\"\u684c\u9762\u542f\u52a8\u97f3\u4e50\"\"\"\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_3","title":"2. \u7528\u4f8b\u51fd\u6570\u89c4\u8303","text":" \u7528\u4f8b\u51fd\u6570\u4ee5 test \u5f00\u5934\uff0c\u9075\u5faa\u86c7\u5f62\u547d\u540d\u89c4\u8303\uff0c\u4e2d\u95f4\u4e3a\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0\uff0c\u540e\u9762\u52a0\u7528\u4f8b ID\uff0c\u6700\u540e\u52a0\u6d4b\u8bd5\u70b9\u5e8f\u53f7\uff0c\u5373 test_${module}_${case_id}[_${index}] \uff1b \u6bd4\u5982\uff1atest_music_001_1\uff0cindex \u4ece 1 \u5f00\u59cb\u3002 \u51fd\u6570\u529f\u80fd\u8bf4\u660e\u91cc\u9762\u5199\u7528\u4f8b\u6807\u9898\uff0c\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u6807\u9898\u5373\u53ef\uff0c\u6ce8\u610f\u7528\u4e09\u5bf9\u53cc\u5f15\u53f7\uff0c\u4e0d\u8981\u7528\u5176\u4ed6\u6ce8\u91ca\uff0c\u66f4\u4e0d\u8981\u7528\u4e95\u53f7\u6ce8\u91ca\u5199\u7528\u4f8b\u6807\u9898\uff1b \u76f4\u63a5\u590d\u5236 PMS \u7528\u4f8b \u7528\u4f8b\u6b65\u9aa4\u76f4\u63a5\u5c06 PMS \u4e0a\u7528\u4f8b\u6b65\u9aa4\u548c\u9884\u671f\u590d\u5236\u8fdb\u6765\uff0c\u7136\u540e\u8fdb\u884c\u6279\u91cf\u6ce8\u91ca\uff08ctrl + /\uff09\uff0c\u5728\u6ce8\u91ca\u7684\u57fa\u7840\u4e0a\u53bb\u5199\u7528\u4f8b\u811a\u672c\u4f1a\u66f4\u52a0\u65b9\u4fbf\u5168\u9762\uff0c\u4e5f\u6bd4\u4f60\u81ea\u5df1\u5199\u6ce8\u91ca\u66f4\u8282\u7ea6\u65f6\u95f4\uff1a \u4e3e\u4f8b\uff0cPMS \u7528\u4f8b\uff1a \u76f4\u63a5\u9009\u4e2d\u7528\u4f8b\u5185\u5bb9\uff0c\u590d\u5236\u4e0b\u6765\uff0c\u7136\u540e\u7c98\u8d34\u5230\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c\u4e2d\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\n \u4e0a\u4f8b\u4e2d\u4e95\u53f7\u6ce8\u91ca\u90e8\u5206\u5c31\u662f\u76f4\u63a5\u4ece PMS \u4e0a\u590d\u5236\u8fc7\u6765\u7684\uff0c\u5728\u6b64\u57fa\u7840\u4e0a\u5199\u7528\u4f8b\uff1a class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\nmusic = DeepinMusicWidget()\nmusic.click_singer_btn_in_music_by_ui()\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\nmusic.click_icon_mode_in_music_by_ui()\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\nmusic.double_click_first_singer_in_singer_icon_view_by_ui()\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\nself.assert_xxx\n \u4f60\u770b\uff0c\u975e\u5e38\u6e05\u695a\u6bcf\u4e00\u6b65\u5728\u505a\u4ec0\u4e48\uff0c\u91cd\u70b9\u662f\u7701\u53bb\u4e86\u5199\u6ce8\u91ca\u7684\u65f6\u95f4\uff0c\u771f\u7684\u7092\u9e21\u65b9\u4fbf\u3002 \u4e0d\u5199 if __name__ == '__main__':\uff0c\u4e0d\u5199\u591a\u4f59\u7684\u4ee3\u7801\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3","title":"3. \u6570\u636e\u9a71\u52a8","text":" \u5982\u679c\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u662f\u76f8\u540c\u7684\uff0c\u53ea\u662f\u4e00\u4e9b\u53c2\u6570\u53d8\u5316\uff0c\u5c3d\u91cf\u4f7f\u7528\u6570\u636e\u9a71\u52a8\u6765\u5b9e\u73b0\u7528\u4f8b\uff1b \u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u6570\u636e\u9a71\u52a8\u7684\u6570\u636e\uff0c\u4e0d\u80fd\u56e0\u6b64\u5f15\u5165\u4f9d\u8d56\uff0c\u5c3d\u91cf\u4f7f\u7528\u4e00\u4e9b\u6807\u51c6\u5e93\u80fd\u8bfb\u53d6\u7684\u6587\u4ef6\u683c\u5f0f\uff0c\u6bd4\u5982 json\u3001ini\u3001CSV\u3001xml\u3001txt \u7b49\u6587\u4ef6\u683c\u5f0f\uff1b\u4e0d\u5efa\u8bae\u4f7f\u7528 Yaml\u3001Excel\u3001MySQL \u7b49\u6570\u636e\u683c\u5f0f\uff1b \u8bfb\u53d6\u6570\u636e\u65f6\u4e5f\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff0c\u5982\u4f7f\u7528 pandas \u5904\u7406 CSV \u5c31\u5c5e\u4e8e\u5927\u6750\u5c0f\u7528\u4e86\uff0c\u6b63\u5e38\u7684\u6570\u636e\u9a71\u52a8\u8fd8\u6ca1\u5230\u9700\u8981\u5927\u6570\u636e\u5206\u6790\u6765\u5904\u7406\u7684\u5730\u6b65\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u5728 widget/ddt/ \u76ee\u5f55\u4e0b\uff1b \u6570\u636e\u9a71\u52a8\u7684\u5199\u6cd5\uff1a @pytest.mark.parametrize(\"value\", data)\ndef test_smb_049(self, value):\n \u4ee5\u4e0a\u8fd9\u79cd\u53c2\u6570\u5316\u7684\u5199\u6cd5\u672c\u8eab\u6ca1\u4ec0\u4e48\u95ee\u9898\uff0c\u4f46\u662f\uff0c\u8fd9\u91cc\u5fc5\u987b\u8981\u8865\u5145\u4e00\u4e2a\u6ca1\u6709\u7528\u7684\u5c0f\u77e5\u8bc6\uff1a \u5982\u679c\u53c2\u6570\u5316\u6570\u636e\u91cc\u9762\u7684\u5b57\u7b26\u4f1a\u539f\u5c01\u4e0d\u52a8\u7684\u8f93\u51fa\u5230 item.name \u91cc\u9762\uff0c\u663e\u793a\u975e\u5e38\u4e0d\u4f18\u96c5\uff0c\u800c\u4e14\u53ef\u4ee5\u4f1a\u5f15\u5165\u4e00\u4e9b\u610f\u60f3\u4e0d\u5230\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u611f\u53d7\u4e00\u4e0b\uff1a \u53c2\u6570\uff1a data = [\n\"\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\", \"qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678\",\n]\n \u73b0\u8c61\u662f\u8fd9\u6837\u8272\u513f\u7684\uff1a test_smb_049.py::TestFileManager::test_smb_049[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09]\ntest_smb_049.py::TestFileManager::test_smb_049[qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui]\ntest_smb_049.py::TestFileManager::test_smb_049[12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678]\n \u8bf4\u5b9e\u8bdd\uff0c\u770b\u7740\u5fc3\u91cc\u5835\u5f97\u614c\uff0c\u5982\u679c\u8fd9\u91cc\u9762\u5305\u542b\u4e00\u4e9b\u7279\u6b8a\u5b57\u7b26\u6216\u8005\u662f\u8d85\u957f\uff0c\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u5f88\u5947\u5999\u7684\u4e8b\u60c5\u53d1\u751f\u3002 parametrize \u91cc\u9762\u6709\u4e2a\u53c2\u6570\uff1aids\uff0c\u53ef\u4ee5\u89e3\u51b3\u6b64\u7c7b\u95ee\u9898\uff0c\u5c31\u50cf\u8fd9\u6837\uff1a @pytest.mark.parametrize(\"value\", data, ids=[1, 2, 3])\ndef test_smb_049(self, value):\n \u518d\u6765\u611f\u53d7\u4e00\u4e0b\uff1a test_smb_049.py::TestFileManager::test_smb_049[1]\ntest_smb_049.py::TestFileManager::test_smb_049[2]\ntest_smb_049.py::TestFileManager::test_smb_049[3]\n \u660e\u663e\u597d\u591a\u4e86\uff0c\u6240\u4ee5\u5c3d\u91cf\u4f7f\u7528 ids \u8fd9\u4e2a\u53c2\u6570\u3002 \u4e0d\u5efa\u8bae\u4f7f\u7528 fixture \u7684\u6570\u636e\u9a71\u52a8\u65b9\u5f0f\uff0c\u6846\u67b6\u867d\u7136\u652f\u6301\uff0c\u4f46\u53ef\u8bfb\u6027\u6bd4\u8f83\u5dee\uff1b\u5982\u679c\u4f60\u4e0d\u77e5\u9053\u8fd9\u53e5\u8bdd\u5728\u8bf4\u5565\uff0c\u90a3\u4f60\u53ef\u4ee5\u5ffd\u7565\uff0c\u6211\u4e5f\u4e0d\u6253\u7b97\u8be6\u7ec6\u8bf4\u8fd9\u79cd\u5b9e\u73b0\u65b9\u5f0f\uff0c\u64cd\u4f5c\u6bd4\u8f83\u9a9a\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4","title":"4. \u65ad\u8a00\u8d44\u6e90","text":" \u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u76f4\u63a5\u653e\u5728\u7528\u4f8b\u6a21\u5757\u7684\u540c\u7ea7\u76ee\u5f55\u4e0b\u7684 assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u6a21\u5757\u540d\u79f0 + \u7528\u4f8b ID \u547d\u540d\uff1b \u56fe\u50cf\u8bc6\u522b\u65ad\u8a00\uff0c\u4e0d\u8981\u622a\u53d6\u4e00\u5f20\u5f88\u5927\u7684\u56fe\uff0c\u56fe\u7247\u8d44\u6e90\u5305\u542b\u7684\u5143\u7d20\u592a\u591a\u4e86\uff0c\u975e\u5e38\u5bb9\u6613\u53d7\u5230\u9700\u6c42\u5f71\u54cd\uff0c\u5efa\u8bae\u662f\u8fdb\u884c\u5c40\u90e8\u7684\u65ad\u8a00\uff1b \u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u5339\u914d\u5ea6\u662f 0.9\uff0c\u5982\u679c\u65ad\u8a00\u7684\u573a\u666f\u5bf9\u4e8e\u7cbe\u786e\u5ea6\u8981\u6c42\u6ca1\u90a3\u4e48\u9ad8\uff0c\u53ef\u4ee5\u5728\u65ad\u8a00\u8bed\u53e5\u91cc\u9762\u4f20\u5165\u5c0f\u4e8e 0.9 \u7684\u53c2\u6570\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5","title":"5. \u5143\u7d20\u5b9a\u4f4d","text":" \u7528\u4e8e\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u4e2d\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u540d\u79f0\u547d\u540d\u4e3a\u8be5\u5143\u7d20\u7684\u540d\u79f0\uff1b \u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u622a\u53d6\u65f6\u5c3d\u91cf\u7cbe\u786e\u5230\u8fd9\u4e2a\u5177\u4f53\u7684\u6309\u94ae\uff0c\u56fe\u7247\u4e5f\u4e0d\u8981\u592a\u5927\uff1b \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u64cd\u4f5c\u8f83\u5feb\uff0c\u5408\u7406\u52a0\u5165\u7b49\u5f85\u65f6\u95f4\u80fd\u63d0\u9ad8\u7528\u4f8b\u7684\u7a33\u5b9a\u6027\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6","title":"6. \u7528\u4f8b\u8d44\u6e90","text":" \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u4f7f\u7528\u5230\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u6bd4\u5982\u97f3\u4e50\u53ef\u80fd\u9700\u8981\u4e00\u4e9b mp3 \u7684\u8d44\u6e90\u7528\u4e8e\u6d4b\u8bd5\uff0c\u5b58\u653e\u5728 widget/case_res \u76ee\u5f55\u4e0b\uff0c\u524d\u63d0\u662f\u8fd9\u4e9b\u8d44\u6e90\u4e0d\u8d85\u8fc7 10M\uff1b \u5982\u679c\u662f\u4e00\u4e9b\u6bd4\u8f83\u5927\u7684\u8d44\u6e90\uff0c\u5efa\u8bae\u653e\u5230\u7edf\u4e00\u7684 ftp \u670d\u52a1\u5668 \uff08ftp://10.8.10.245\uff09\uff0c\u9700\u8981\u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\u518d\u4e0b\u8f7d\u4e0b\u6765\uff1b f\"wget ftp://{Config.FTP_IP}/uploads/\u591a\u5a92\u4f53/\u5f71\u9662/auto/{file_name};unzip {file_name};rm -rf {file_name};\"\n \u6d4b\u8bd5\u8d44\u6e90\u4e0b\u8f7d\u5230\u5e94\u7528 widget/case_res \u76ee\u5f55\u4e0b\uff1b \u7981\u6b62\u5c06\u6d4b\u8bd5\u8d44\u6e90\u5b58\u653e\u5728\u4e2a\u4eba\u7684\u673a\u5668\u4e0a\uff1b \u5e94\u8be5\u5c3d\u91cf\u4fdd\u8bc1\uff0c\u4e00\u4e2a\u8d44\u6e90\u5728\u4e00\u6b21\u7528\u4f8b\u6267\u884c\u4e2d\u53ea\u9700\u8981\u4e0b\u8f7d\u4e00\u6b21\uff0c\u6240\u4ee5\u4f60\u4e0d\u80fd\u6bcf\u6b21\u4f7f\u7528\u7684\u65f6\u5019\u90fd\u53bb\u4e0b\u8f7d\uff0c\u8fd9\u6837\u53ef\u80fd\u4f1a\u8017\u8d39\u5927\u91cf\u7684\u7f51\u7edc\u8d44\u6e90\uff0c\u800c\u56e0\u4e3a\u5148\u5224\u65ad\u672c\u5730\u662f\u5426\u5b58\u5728\u6b64\u8d44\u6e90\uff0c\u5982\u679c\u4e0d\u5b58\u5728\u518d\u53bb\u4e0b\u8f7d\uff1b \u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u5c06\u8d44\u6e90\u62f7\u8d1d\u5230\u5bf9\u5e94\u7684\u6d4b\u8bd5\u76ee\u5f55\u4e0b\uff0c\u6bd4\u5982\u5c06 mp3 \u6587\u4ef6\u62f7\u8d1d\u5230 ~/Music \u76ee\u5f55\u4e0b\uff0c\u4f46\u662f\u6211\u4eec\u66f4\u5efa\u8bae\u4f60\u4f7f\u7528\u53d1\u9001\u5feb\u6377\u94fe\u63a5\u7684\u65b9\u5f0f\u66ff\u4ee3\u62f7\u8d1d\u7684\u64cd\u4f5c\uff0c\u56e0\u4e3a\u5728\u62f7\u8d1d\u5927\u6587\u4ef6\u65f6\u662f\u5f88\u6d88\u8017\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u800c\u521b\u5efa\u94fe\u63a5\u5219\u4e0d\u4f1a\uff1b @classmethod\ndef recovery_many_movies_in_movie_by_cmd(cls):\n\"\"\"\u6062\u590d\u591a\u4e2a\u89c6\u9891\u6587\u4ef6\u81f3\u89c6\u9891\u76ee\u5f55\u4e2d\"\"\"\nwork_path = f\"/home/{Config.USERNAME}/Videos/auto\"\ncode_path = f\"{Config.CASE_RES_PATH}/auto\"\ncls.run_cmd(f\"rm -rf {work_path};mkdir {work_path}\")\nsleep(1)\nflag = False\nif not exists(code_path):\ncls.run_cmd(f\"mkdir -p {code_path}\")\nflag = True\nlogger.info(f\"ln -s {code_path}/* {work_path}/\")\ncls.run_cmd(\nf\"cd {code_path}/;\"\nf\"{cls.wget_file('auto.zip') if flag else ''}\"\nf\"ln -s {code_path}/* {work_path}/ > /dev/null 2>&1\"\n)\n \u8d44\u6e90\u4e0b\u8f7d\u8fc7\u7a0b\u4e2d\u6ce8\u610f\u8d85\u65f6\u7684\u95ee\u9898\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u5f88\u5927\uff0c\u8981\u7279\u522b\u6ce8\u610f\u8fd9\u95ee\u9898\uff0c\u5982\u679c\u4f60\u4f7f\u7528\u5f3a\u5236\u7b49\u5f85\u4e0b\u8f7d\u7ed3\u675f( os.system )\uff0c\u53ef\u80fd\u4f1a\u9020\u6210\u7528\u4f8b\u6267\u884c\u65f6\u957f\u53d8\u5f97\u4e0d\u53ef\u63a5\u53d7\uff0c\u76ee\u524d\u6211\u4eec\u53d1\u73b0\u5728\u6301\u7eed\u96c6\u6210\u73af\u5883\u6267\u884c\u65f6\u7f51\u7edc\u4e0b\u8f7d\u901f\u5ea6\u5f88\u6162\uff0c\u6240\u4ee5\u8d85\u65f6\u673a\u5236\u662f\u5f88\u6709\u5fc5\u8981\u7684\uff1brun_cmd \u65b9\u6cd5\u6709\u4e00\u4e2a\u9ed8\u8ba4\u8d85\u65f6\u7684\u65f6\u95f4\uff0c\u4f60\u53ef\u4ee5\u6839\u636e\u8d44\u6e90\u5927\u5c0f\u5bf9\u8d85\u65f6\u65f6\u95f4\u8fdb\u884c\u8c03\u6574\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_5","title":"\u516d\u3001\u7528\u4f8b\u8c03\u8bd5\u6280\u5de7","text":""},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#1_4","title":"1. \u65e5\u5fd7","text":" \u4e00\u5b9a\u8981\u5148\u770b\u62a5\u9519\uff0c\u770b error \u65e5\u5fd7\uff0c\u901a\u5e38\u80fd\u660e\u786e\u7684\u544a\u8bc9\u4f60\u5177\u4f53\u54ea\u91cc\u4ee3\u7801\u62a5\u9519\uff1b \u7ed3\u5408\u62a5\u9519\u70b9\u524d\u9762\u7684error\u3001 info \u548c debug \u65e5\u5fd7\u770b\u5426\u662f\u6b63\u5e38\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#2_4","title":"2. \u65ad\u70b9\u8c03\u8bd5","text":" \u65b9\u6cd5\u62a5\u9519\uff1a \u5728\u65b9\u6cd5\u5e93\u4e2d\u627e\u5230\u5bf9\u5e94\u7684\u65b9\u6cd5\uff0c\u5355\u72ec\u8c03\u7528\uff0c\u770b\u662f\u5426\u80fd\u6b63\u5e38\u6267\u884c\uff1b \u901a\u5e38\u5355\u4e2a\u65b9\u6cd5\u7684\u6267\u884c\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u62a5\u9519\uff0c\u5f88\u5feb\u5c31\u80fd\u6392\u67e5\u51fa\u95ee\u9898\uff1b\u5728\u65b9\u6cd5\u5185\u90e8\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u65b9\u6cd5\u5185\u90e8\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u5982\u679c\u5355\u4e2a\u65b9\u6cd5\u8c03\u7528\u6ca1\u95ee\u9898\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u62a5\u9519\u7684\u65b9\u6cd5\u524d\u9762\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u770b\u7528\u4f8b\u7684\u4e1a\u52a1\u903b\u8f91\u548c\u6570\u636e\u4f20\u9012\u662f\u5426\u5b58\u5728\u95ee\u9898\uff1b \u65ad\u8a00\u62a5\u9519\uff1a \u65ad\u8a00\u4e3a\u6570\u636e\u65ad\u8a00\uff0c\u6839\u636e\u8868\u8fbe\u5f0f\u8fdb\u884c\u65ad\u8a00\u8bed\u53e5\u8fdb\u884c\u4fee\u6539\uff1b \u6587\u4ef6\u751f\u6210\u7c7b\u65ad\u8a00\uff0c\u67e5\u770b\u662f\u5426\u9700\u8981\u52a0\u7b49\u5f85\u65f6\u95f4\uff1b \u56fe\u50cf\u65ad\u8a00\uff0c\u5728\u65ad\u8a00\u8bed\u53e5\u5904\u6253\u65ad\u70b9\uff0c\u4f7f\u7528 Debug \u8fd0\u884c\uff0c\u7528\u4f8b\u8fd0\u884c\u5230\u65ad\u8a00\u5904\u4f1a\u505c\u6b62\uff0c\u67e5\u770b\u6b64\u65f6\u65ad\u8a00\u7684\u56fe\u7247\u4e0e\u7528\u4f8b\u6267\u884c\u7684\u73b0\u573a\u5b58\u5728\u4ec0\u4e48\u5dee\u5f02\uff0c\u6b64\u65f6\u4e5f\u53ef\u4ee5\u8fdb\u884c\u91cd\u65b0\u622a\u56fe\uff0c\u4ece\u800c\u66ff\u6362\u65b0\u7684\u56fe\u7247\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#3_1","title":"3. \u8fdc\u7a0b\u6267\u884c","text":" \u8fdc\u7a0b\u6267\u884c\u6307\u7684\u662f\u7f16\u8f91\u5668\u901a\u8fc7\u6307\u5b9a\u8fdc\u7a0b\u89e3\u91ca\u5668\u6267\u884c\u81ea\u52a8\u5316\u4ee3\u7801\uff1b \u8fdc\u7a0b\u6267\u884c\u7684\u597d\u5904\u662f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u7684 Debug \u8fd0\u884c\uff0c\u4e0d\u7528\u5728\u6d4b\u8bd5\u673a\u4e0a\u6253\u5f00\u7f16\u8f91\u5668\uff0c\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u66f4\u5feb\uff1b \u652f\u6301\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u7684\u7f16\u8f91\u5668\uff1a \u4e13\u4e1a\u7248 Pycharm VScode \uff0c\u9700\u8981\u4f7f\u7528\u63d2\u4ef6 Remote-SSH \u8fdc\u7a0b\u6267\u884c\u914d\u7f6e \u4ee5 Pycharm \u4e3a\u4f8b\uff1a File \u2014> Settings \u2014> Project \u2014> Python Interpreter \u2014> \u53f3\u8fb9\u8bbe\u7f6e\u6309\u94ae \u2014> Add... \u2014> SSH Interpreter \u2014> New server configuration(\u586b\u5165host\u548cusername) \u2014> Next \u2014> password\uff08\u6d4b\u8bd5\u673a\u5bc6\u7801\uff09 \u2014> Interpreter(\u9009\u62e9\u8fdc\u7a0b\u89e3\u91ca\u5668) \u2014> Finish "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#4_1","title":"4. \u73af\u5883\u6e05\u7406","text":" \u5982\u679c\u7528\u4f8b\u91cc\u9762\u7684 teardown \u6ca1\u6709\u6267\u884c\uff0c\u5927\u6982\u7387\u662f\u56e0\u4e3a setup \u91cc\u9762\u4ee3\u7801\u62a5\u9519\uff0c\u8fd9\u4e24\u4e2a\u662f\u4e00\u5bf9\u7684\uff0csetup \u91cc\u9762\u62a5\u9519\uff0cteardown \u91cc\u9762\u7684\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\uff1b \u76ee\u524d\u6211\u4eec\u5df2\u7ecf\u5c06\u5404\u5e94\u7528\u7684 clean_all \u8fd9\u4e2a fixture \u6539\u6210\u4e86\u7ec8\u7ed3\u5668\uff0c\u786e\u4fdd\u59cb\u7ec8\u80fd\u6267\u884c\u5230\u8fd9\u6b65\uff0c\u4f46\u662f\u7528\u4f8b\u91cc\u9762\u7684 fixture\uff0c\u8fd8\u662f\u9700\u8981\u6211\u4eec\u5c0f\u5fc3\u5904\u7406\uff1b \u8981\u6267\u884c clean_all \u9700\u8981\u5728\u7f16\u8f91\u5668\u8fd0\u884c\u53c2\u6570\u52a0 --clean yes\uff0c\u5199\u7528\u4f8b\u7684\u65f6\u5019\u8bf7\u52a0\u4e0a\uff0c\u4e0d\u7136\u4f60\u4e0d\u786e\u5b9a\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u7684\u73af\u5883\u662f\u5426\u6062\u590d\uff1b setup \u53ef\u4ee5\u4e0d\u8981\uff0c\u5c06 setup \u653e\u5230\u7528\u4f8b\u91cc\u9762\u662f\u4e00\u79cd\u7a33\u59a5\u7684\u505a\u6cd5\uff0cteardown \u4e00\u5b9a\u8981\u3002 "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#5_1","title":"5. \u5143\u7d20\u5b9a\u4f4d\u4e0d\u51c6\uff08\u5750\u6807\u8fd4\u56de\u4e0d\u5bf9\uff09","text":" \u57fa\u4e8e UI \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u53ef\u80fd\u53d7\u5230\u7a97\u53e3 ID \u7684\u53d8\u5316\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u9ed8\u8ba4\u53d6\u6700\u65b0\u7684\u4e00\u4e2a\u7a97\u53e3\u7528\u4e8e\u5b9a\u4f4d\uff0c\u4f46\u5982\u679c\u5b9e\u9645\u9700\u8981\u5b9a\u4f4d\u7684\u4e0d\u662f\u6700\u65b0\u7684\u7a97\u53e3\uff0c\u90a3\u4e48\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u91cd\u65b0\u5b9e\u4f8b\u5316\u65b9\u6cd5\u7c7b\u5bf9\u8c61\uff0c\u5e76\u5728\u7c7b\u4e2d\u4f20\u5165\u5bf9\u5e94\u7684\u7a97\u53e3\u5e8f\u53f7\uff1b \u57fa\u4e8e\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u76ee\u524d\u9047\u5230\u7684\u7b14\u8bb0\u672c\u4e0a\uff0c\u7531\u4e8e\u5c4f\u5e55\u7f29\u653e\u6bd4\u4f8b\u4e3a 1.25\uff0c\u5bfc\u81f4\u5750\u6807\u8fd4\u56de\u4e0d\u51c6\uff0c\u6211\u4eec\u9ed8\u8ba4\u4f7f\u7528\u7f29\u653e\u6bd4\u4f8b\u4e3a 1\uff1b \u57fa\u4e8e\u56fe\u50cf\u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u76ee\u6807\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b \u57fa\u4e8e OCR \u5b9a\u4f4d\u7684\u65b9\u6cd5\uff0c\u5982\u679c\u5f53\u524d\u5c4f\u5e55\u4e2d\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u6587\u5b57\u5143\u7d20\uff0c\u53ef\u80fd\u51fa\u73b0\u5b9a\u4f4d\u4e0d\u51c6\uff1b\u540c\u6837\u652f\u6301\u901a\u8fc7\u53c2\u6570\u63a7\u5236\uff0c\u8fd4\u56de\u591a\u4e2a\u5750\u6807\uff1b "},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#6_1","title":"6. \u952e\u9f20\u64cd\u4f5c\u4e0d\u51c6","text":" \u9f20\u6807\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6bd4\u5982\u53f3\u952e\u3001\u53cc\u51fb\u65e0\u54cd\u5e94\uff1b \u952e\u76d8\u64cd\u4f5c\u4e0d\u751f\u6548\uff0c\u6216\u8005\u5ef6\u8fdf\u8f93\u5165\uff0c\u6bd4\u5982\u7528\u4f8b\u9700\u8981\u8f93\u5165\u201c\u6211\u662f\u4e2d\u56fd\u4eba\u201d\uff0c\u5b9e\u9645\u53ea\u8f93\u5165\u4e86\u201c\u6211\u56fd\u4eba\u201d\uff1b \u4ee5\u4e0a\u95ee\u9898\u6392\u9664\u5e94\u7528\u5361\u987f\u7b49\u95ee\u9898\uff0c\u5927\u6982\u7387\u662f\u7531\u4e8e\u5de5\u5177\u7684\u95ee\u9898\uff0c\u76ee\u524d\u952e\u9f20\u64cd\u4f5c\u6211\u4eec\u4f7f\u7528\u4e09\u4e2a\u5de5\u5177\uff1aDogtail \u63d0\u4f9b\u7684\u952e\u9f20\u5de5\u5177\u3001PyAutoGUI\u3001Xdotool \uff1b \u6709\u540c\u5b66\u53ef\u80fd\u8981\u8bf4\u4e3a\u5565\u8981\u7528\u4e09\u4e2a\u554a\uff0c\u7528\u4e00\u4e2a\u4e0d\u5c31\u597d\u4e86\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u5404\u6709\u4f18\u70b9\u5404\u6709\u7f3a\u70b9\u3002 \u5982\u679c\u4f60\u9047\u5230\u952e\u9f20\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u8bd5\u8bd5\u901a\u8fc7\u4e0d\u540c\u7684\u5de5\u5177\u64cd\u4f5c\uff1b\u952e\u76d8\u8f93\u5165\u5ef6\u8fdf\u7684\u95ee\u9898\uff0c\u4e00\u822c\u662f\u56e0\u4e3a\u8f93\u5165\u901f\u5ea6\u592a\u5feb\u4e86\uff0c\u7cfb\u7edf\u6ca1\u53cd\u5e94\u8fc7\u6765\uff0c\u5e38\u89c1\u4e8e ARM \u548c MIPS \u4e0a\uff0c\u4fee\u6539\u53c2\u6570 delay_time \u7684\u503c\uff0c\u5355\u4f4d\u4e3a\u6beb\u79d2\uff1b # mouse_key.py\n@classmethod\ndef input_message(cls, message, delay_time=300, interval=0.2):\n\"\"\"\n \u8f93\u5165\u5b57\u7b26\u4e32\n :param message: \u8f93\u5165\u7684\u5185\u5bb9\n :param delay_time: \u5ef6\u8fdf\u65f6\u95f4\n :param interval:\n :return:\n \"\"\"\n \u5982\u679c\u4e0d\u662f\u65b9\u6cd5\u7684\u95ee\u9898\uff0c\u5219\u9700\u8981\u7ee7\u7eed\u548c\u5f00\u53d1\u4e00\u8d77\u6392\u9664\uff0c\u662f\u5426\u4e3a\u5e94\u7528\u63a5\u53d7\u952e\u9f20\u4fe1\u53f7\u5904\u7406\u7684\u95ee\u9898\uff0c\u8fd9\u7c7b\u60c5\u51b5\u6211\u4eec\u4e5f\u662f\u9047\u5230\u8fc7\u7684\uff0c\u5177\u4f53\u95ee\u9898\u5177\u4f53\u5206\u6790\u3002 \u6bd4\u5982\u5f71\u9662\u5c31\u91cd\u5199\u4e86\u4e00\u4e2a\u53f3\u952e\u7684\u65b9\u6cd5\uff1a # base_widget.py\n@classmethod\ndef right_click(cls, _x=None, _y=None):\n\"\"\"\n \u91cd\u5199\u5e95\u5c42\u5355\u51fb\u9f20\u6807\u53f3\u952e\n \u89e3\u51b3\u5f71\u9662\u53f3\u952e\u89e6\u53d1release\u4e8b\u4ef6\u7684\u95ee\u9898\uff08\u53f3\u952e\u4e3b\u7a97\u53e3\u4f1a\u64ad\u653e\u89c6\u9891\uff09\n \"\"\"\ncls.mouse_down(_x, _y, button=3)\nsleep(0.1)\ncls.mouse_up(button=3)\n"},{"location":"AT%E5%BC%80%E5%8F%91%E8%A7%84%E8%8C%83/#_6","title":"\u4e03\u3001\u5176\u4ed6\u4e0d\u4e3a\u4eba\u77e5\u7684\u7ec6\u8282","text":" \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u5c3d\u91cf\u7f16\u5199\u540c\u4e00\u4e2a\u5e94\u7528\u6216\u6a21\u5757\u7684\u7528\u4f8b\uff0c\u80fd\u5bf9\u8be5\u7528\u4f8b\u5df2\u6709\u65b9\u6cd5\u719f\u6089\uff0c\u907f\u514d\u8fc7\u591a\u91cd\u590d\u4e1a\u52a1\u4ee3\u7801\u7684\u5c01\u88c5\uff1b \u76f8\u540c\u7684\u573a\u666f\u4e0b\uff0c\u5404\u67b6\u6784\u7b49\u5f85\u65f6\u95f4\u4e0d\u540c\uff0c\u5efa\u8bae\u4f7f\u7528\u6846\u67b6\u63d0\u4f9b\u7684 sleep\uff0c\u6211\u4eec\u505a\u4e86\u4e0d\u540c\u67b6\u6784\u7684\u500d\u6570\u653e\u5927\uff1b \u7f16\u5199\u7528\u4f8b\u65f6\uff0c\u5c3d\u91cf\u8003\u8651\u5230\u6bcf\u4e00\u6b65\u5f02\u5e38\u540e\u7684\u73af\u5883\u6062\u590d\uff0c\u9700\u8981\u5efa\u8bae\u8fd9\u79cd\u610f\u8bc6\uff0c\u968f\u65f6\u8981\u8003\u8651\u5230\uff0c\u8fd9\u6b65\u64cd\u4f5c\u6709\u6ca1\u6709\u53ef\u80fd\u51fa\u9519\uff0c\u51fa\u9519\u4e86\u6539\u600e\u4e48\u529e\uff1b \u63d0\u4ea4\u4ee3\u7801\u7684\u65f6\u5019\u6ce8\u610f\u4e0d\u8981\u628a\u4e00\u4e9b\u4e34\u65f6\u7684\u6d4b\u8bd5\u8d44\u6e90\u63d0\u4ea4\u8fdb\u53bb\u4e86\uff0c\u6bd4\u5982\u6d4b\u8bd5\u4e86\u4e00\u4e2a\u5f71\u7247\uff0c\u6709\u4e9b\u540c\u5b66\u4e60\u60ef\u4f7f\u7528 git add . \uff0c\u7136\u540e\u5c31\u5168\u90e8\u63d0\u4ea4\u5230\u4ee3\u7801\u4ed3\u5e93\u4e86\uff0c\u8fd9\u6837\u5373\u4f7f\u540e\u671f\u628a\u5927\u6587\u4ef6\u5220\u4e86\uff0c.git \u6587\u4ef6\u91cc\u9762\u4e5f\u4f1a\u5f88\u5927\uff0c\u9020\u6210\u4ee3\u7801\u4ed3\u5e93\u53d8\u5f97\u5341\u5206\u81c3\u80bf\u3002 \u66f4\u591a\u7ec6\u8282\u67e5\u770b\uff1a\u300aAT\u7ecf\u9a8c\u603b\u7ed3\u300b"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/","title":"AT \u6267\u884c\u5668\u4f7f\u7528\u6307\u5317","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/5/25\n# Author : litao\n# =============================================\n Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1","title":"1\u3001\u529f\u80fd\u4ecb\u7ecd","text":" \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7cfb\u7edf\u8bed\u8a00\u8bbe\u7f6e\uff0c\u5206\u8fa8\u7387\u8bbe\u7f6e\u53ca\u7528\u4f8b\u6267\u884c\u73af\u5883\u642d\u5efa\uff1b \u652f\u6301 IP \u4e3a 15 \u7f51\u6bb5\u7684 AMD \u67b6\u6784\u6d4b\u8bd5\u673a\u955c\u50cf\u88c5\u673a\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u6307\u5b9a\u5e94\u7528\uff0c\u6307\u5b9a\u8303\u56f4\u6807\u7b7e\u7684\u7528\u4f8b\u6267\u884c\uff1b \u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u72b6\u6001\u68c0\u67e5\uff0c\u662f\u5426\u6709\u6b63\u5728\u8fd0\u884c\u7684\u6d4b\u8bd5\uff1b \u652f\u6301\u914d\u7f6e\u7528\u4f8b\u6267\u884c\u65f6\u957f\uff0c\u9632\u6b62\u4efb\u52a1\u963b\u585e\uff1b \u652f\u6301\u6839\u636e\u5e94\u7528\u7248\u672c\u81ea\u52a8\u67e5\u627e\u5bf9\u5e94\u7684\u7528\u4f8b tag\uff1b \u652f\u6301\u5f02\u5e38\u5904\u7406\u548c\u6d4b\u8bd5\u5b8c\u6210\u7684\u5b9e\u65f6\u6d88\u606f\u901a\u77e5\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2job","title":"2\u3001Job \u4ecb\u7ecd","text":"\u4ee5\u4e0b\u6309\u6267\u884c\u6d41\u7a0b\u7684\u987a\u5e8f\u4ecb\u7ecd\uff0c\u6bcf\u4e00\u6b65\u90fd\u53ef\u4ee5\u5355\u72ec\u6267\u884c\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#1_1","title":"1\u3001\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/AT_test/ \u6574\u4e2a\u6d41\u7a0b\u7684\u4e3b\u5165\u53e3\uff0c\u901a\u8fc7\u8fd9\u4e2a\u5165\u53e3\uff0c\u8fde\u540c\u6574\u4e2a\u6d4b\u8bd5\u6d41\u7a0b\uff0c\u955c\u50cf\u88c5\u673a\uff0c\u73af\u5883\u90e8\u7f72\uff0c\u6d4b\u8bd5\u5e94\u7528\u53ca\u751f\u6210\u62a5\u544a\u3002 \u53c2\u6570\u4ecb\u7ecd\uff1a \u6d4b\u8bd5\u673a\uff1a\u6240\u6709\u89c4\u6574\u5230\u56fa\u5b9a\u533a\u57df\u7684\u6d4b\u8bd5\u673a\uff0c\u901a\u8fc7\u6d4b\u8bd5\u540c\u5b66\u5bf9\u6d4b\u8bd5\u673a\u7684\u4e60\u60ef\u547d\u540d\uff0c\u5728\u540e\u53f0\u6620\u5c04\u6d4b\u8bd5\u673a\u7684\u8be6\u7ec6\u4fe1\u606f\uff0c\u62ec\u53f7\u4e2d\u4e3a\u6d4b\u8bd5\u673a IP \u7684\u6700\u540e\u4e00\u4f4d\uff1b \u6d4b\u8bd5\u5e94\u7528\uff1a\u6307\u5b9a\u7684\u6d4b\u8bd5\u5e94\u7528\u7684\u5305\u540d\uff0c\u7cfb\u7edf\u6839\u636e\u540d\u79f0\u81ea\u52a8\u62c9\u53d6\u5bf9\u5e94\u7684\u4ed3\u5e93\u4ee3\u7801\uff1b deb\u5305\u4e0b\u8f7d\u5730\u5740\uff1a\u6d4b\u8bd5\u4e0a\u8ff0\u5e94\u7528\u65f6\uff0c\u9700\u8981\u5b89\u88c5\u7684deb\u5305\u4e0b\u8f7d\u5730\u5740\uff0c\u591a\u4e2a\u5730\u5740\u7528\u201c,\u201d\u9694\u5f00\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff1b \u8303\u56f4\u6807\u7b7e\uff1a\u6267\u884c\u6d4b\u8bd5\u7528\u4f8b\u7684\u6807\u7b7e\u8303\u56f4\uff0c\u5bf9\u5e94\u7528\u4f8b\u4ee3\u7801 csv \u6587\u4ef6\u4e2d\u7684\u6807\u7b7e\u4fe1\u606f\uff0c\u4ee5 pytest \u7684mark\u8bed\u6cd5\u7f16\u5199\uff1b \u7cfb\u7edf\u8bed\u8a00\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u8bed\u8a00\u73af\u5883\uff1b \u5206\u8fa8\u7387\uff1a\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u6267\u884c\u7528\u4f8b\u65f6\u7684\u7cfb\u7edf\u5206\u8fa8\u7387\u73af\u5883\uff1b \u955c\u50cf\u5730\u5740\uff1a\u955c\u50cf\u4ed3\u5e93\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u901a\u8fc7 PXE \u88c5\u673a\uff0c\u53ef\u4ee5\u4e3a\u7a7a\uff0c\u5219\u76f4\u63a5\u8df3\u8fc7\u88c5\u673a\u73af\u8282\uff08\u76ee\u524d\u4ec5\u652f\u6301\u90e8\u5206 AMD \u67b6\u6784\u7684\u88c5\u673a\uff09\uff1b "},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#2pxe","title":"2\u3001PXE \u88c5\u673a","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/IOS_install/ \u8f93\u5165\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\uff0cIP\uff0c\u5bc6\u7801\uff0c\u955c\u50cf\u5730\u5740\u540e\uff0c\u81ea\u52a8\u88c5\u673a\uff0c\u76ee\u524d\u4ec5\u652f\u6301\u56fa\u5b9a 15 \u7f51\u6bb5\u7684\u90e8\u5206 AMD \u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#3","title":"3\u3001\u6b21\u4e3b\u5165\u53e3","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/all_client_test/ \u8be5\u5165\u53e3\u4e0e\u4e3b\u5165\u53e3\u529f\u80fd\u57fa\u672c\u4e00\u81f4\uff0c\u53ea\u662f\u5265\u79bb\u4e86PXE\u88c5\u673a\u6d41\u7a0b\uff0c\u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7684\u6267\u884c\u6d41\u7a0b\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#4","title":"4\u3001\u73af\u5883\u90e8\u7f72","text":"Jenkins url\uff1ahttps://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/env/build?delay=0sec \u8bbe\u7f6e\u6d4b\u8bd5\u673a\u7684\u7cfb\u7edf\u8bed\u8a00\uff0c\u5206\u8fa8\u7387\u53ca\u5b89\u88c5\u6d4b\u8bd5\u6240\u9700\u7684\u4f9d\u8d56\u5305\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#5","title":"5\u3001\u53d1\u9001\u4ee3\u7801","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/send_code/ \u6839\u636e\u6d4b\u8bd5\u5e94\u7528\u540d\u79f0\uff0c\u62c9\u53d6\u5bf9\u5e94\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u5e76\u6839\u636e\u6d4b\u8bd5\u673a\u4e0a\u5e94\u7528\u7248\u672c\u5207\u6362\u5230\u5bf9\u5e94\u7684tag\u7248\u672c\uff0c\u82e5\u672a\u627e\u5230tag\u7248\u672c\uff0c\u5219\u4f7f\u7528\u6700\u65b0\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u518d\u6839\u636e\u5e94\u7528\u5e93\u4ee3\u7801\u4e2d\u914d\u7f6e\u7684\u57fa\u7840\u5e93\u7248\u672c\uff0c\u62c9\u53d6\u57fa\u7840\u5e93\u4ee3\u7801\u3002"},{"location":"AT%E6%89%A7%E8%A1%8C%E5%99%A8%E4%BD%BF%E7%94%A8%E6%8C%87%E5%8C%97/#6","title":"6\u3001\u7528\u4f8b\u6267\u884c","text":"Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/run_test/ \u8fd0\u884c\u6d4b\u8bd5\u673a\u4e0a\u7684\u7528\u4f8b"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/","title":"AT \u7528\u4f8b\u7b5b\u9009\u6307\u5317","text":"# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n AT \u7528\u4f8b\u7b5b\u9009\u6807\u51c6\uff0c\u662f\u6311\u9009\u5408\u9002\u7684\u6587\u672c\u7528\u4f8b\u8fdb\u884c\u81ea\u52a8\u5316\u7528\u4f8b\u8f6c\u5316\u7684\u4e00\u4e9b\u901a\u7528\u6807\u51c6\u3002 \u8fc7\u53bb\u6211\u4eec\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u5b9e\u8df5\u8fc7\u7a0b\u4e2d\uff0c\u5199\u4e86\u4e0d\u5c11\u81ea\u52a8\u5316\u7528\u4f8b\uff0c\u968f\u7740\u9700\u6c42\u7684\u8fed\u4ee3\uff0c\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u81ea\u7136\u8150\u5316\uff0c\u56e0\u800c\u9700\u8981\u5728\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\u5bf9\u81ea\u52a8\u5316\u7528\u4f8b\u8fdb\u884c\u7ef4\u62a4\uff0c\u5728\u7ef4\u62a4\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u6211\u4eec\u53d1\u73b0\uff0c\u6709\u4e9b\u7528\u4f8b\u7ef4\u62a4\u8d77\u6765\u592a\u96be\u4e86\uff0c\u8c03\u8bd5\u7528\u4f8b\u8017\u8d39\u5927\u91cf\u65f6\u95f4\uff0c\u6210\u672c\u5f88\u9ad8\u3002 \u56e0\u6b64\uff0c\u6211\u4eec\u603b\u7ed3\u4e00\u4e9b\u81ea\u52a8\u5316\u7528\u4f8b\u9009\u578b\u7684\u6807\u51c6\uff0c\u4ee5\u4f18\u5316\u540e\u7eed\u81ea\u52a8\u5316\u7528\u4f8b\u7ed3\u6784\uff0c\u671f\u5f85\u6211\u4eec\u80fd\u7f16\u5199\u51fa\u9ad8\u6548\u3001\u7a33\u5b9a\u3001\u6613\u4e8e\u7ef4\u62a4\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_1","title":"\u4e00\u3001\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u53ef\u4ee5\u5206\u4e3a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u548c\u4e13\u9879\u81ea\u52a8\u5316\u6d4b\u8bd5\uff0c\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e00\u822c\u53ea\u9488\u5bf9\u4e00\u4e9b\u5e38\u89c4\u7684\u529f\u80fd\u6d4b\u8bd5\uff0c\u5176\u4ed6\u975e\u5e38\u89c4\u529f\u80fd\u7684\u7528\u4f8b\uff0c\u5e94\u8be5\u91c7\u7528\u4e13\u9879\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u6848\uff1b \u4ee5\u4e0b\u662f\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1","title":"1. \u7a33\u5b9a\u6027\u3001\u538b\u6d4b\u7528\u4f8b","text":"\u7a33\u5b9a\u6027\u6d4b\u8bd5\u3001\u538b\u6d4b\u7528\u4f8b\u5e94\u8be5\u662f\u5c5e\u4e8e\u6027\u80fd\u76f8\u5173\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u5982\uff1a\u53cd\u590d\u591a\u6b21\u70b9\u51fb\u6309\u94ae\uff0c\u68c0\u9a8c\u5176\u529f\u80fd\u7a33\u5b9a\u6027\u3002\u56e0\u4e3a\u8fd9\u4e9b\u7528\u4f8b\u65ad\u8a00\u7684\u9884\u671f\u53ef\u80fd\u4e0d\u662f\u5f88\u660e\u786e\uff0c\u66f4\u6709\u751a\u8005\u4e0d\u9700\u8981\u65ad\u8a00\uff0c\u7528\u4f8b\u65f6\u957f\u6bd4\u8f83\u957f\uff0c\u800c\u4e14\u4e0d\u53ef\u63a7\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u76ee\u524d\u6211\u4eec\u6709\u6027\u80fd\u81ea\u52a8\u5316\u7684\u4e13\u9879\u65b9\u6848\uff0c\u4ee5\u53ca\u4e00\u4e9b\u7a33\u5b9a\u6027\u6d4b\u8bd5\u7684\u4e13\u9879\u65b9\u6848\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u6b64\u7c7b\u7528\u4f8b\u653e\u5230\u4e13\u9879\u81ea\u52a8\u5316\u91cc\u9762\u53bb\u505a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2","title":"2. \u6d89\u53ca\u591a\u4e2a\u7528\u6237\u64cd\u4f5c","text":"\u5e38\u89c1\u4e0e\u6587\u7ba1\u7684\u7528\u4f8b\u4e2d\uff0c\u591a\u7528\u6237\u64cd\u4f5c\u7684\u7528\u4f8b\u4e00\u822c\u90fd\u4f1a\u6d89\u53ca\u5230\u5728\u7cfb\u7edf\u4e2d\u8fdb\u884c\u591a\u4e2a\u7528\u6237\u95f4\u7684\u5207\u6362\uff0c\u81ea\u52a8\u5316\u811a\u672c\u4e00\u822c\u662f\u8fd0\u884c\u5728\u4e00\u4e2a\u7528\u6237\u7a7a\u95f4\u4e0b\u7684\uff0c\u6240\u4ee5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u591a\u7528\u6237\u95f4\u7684\u5207\u6362\u3002 \u6b64\u7c7b\u4e0d\u5efa\u8bae\u91c7\u7528\u81ea\u52a8\u5316\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3","title":"3. \u4e0e\u5f00\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4ea4\u4e92","text":"\u6b64\u7c7b\u573a\u666f\u591a\u4e3a\u5e94\u7528\u7684\u5f02\u5e38\u573a\u666f\u6d4b\u8bd5\uff0c\u6bd4\u5982\uff1a\u590d\u5236\u5927\u6587\u4ef6\u8fc7\u7a0b\u4e2d\u6ce8\u9500\u673a\u5668\u3002 \u81ea\u52a8\u5316\u811a\u672c\u5728\u7cfb\u7edf\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4e4b\u540e\u662f\u4f1a\u505c\u6b62\u8fd0\u884c\u7684\uff1b\u6b64\u7c7b\u7528\u4f8b\u53ef\u4ee5\u505a\u81ea\u52a8\u5316\uff0c\u4f46\u662f\u540c\u6837\u9700\u8981\u505a\u4e13\u9879\u65b9\u6848\uff0c\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u7684\u5904\u7406\u903b\u8f91\u5b8c\u5168\u4e0d\u540c\u3002 \u540e\u7eed\u81ea\u52a8\u5316\u9700\u8981\u516c\u5173\u7684\u70b9\uff1a \u81ea\u52a8\u5316\u811a\u672c\u5728\u672c\u673a\u8fd0\u884c\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u81f3\u5c11\u9700\u8981\u63d0\u4f9b\u4ee5\u4e0b\u529f\u80fd\uff1a \u91cd\u542f\u4e4b\u540e\u7528\u4f8b\u80fd\u81ea\u52a8\u8fd0\u884c\uff1b\u53ef\u4ee5\u8003\u8651\u5c06\u6267\u884c\u7528\u4f8b\u5199\u6210\u4e00\u4e2a\u5f00\u673a\u81ea\u542f\u7684\u670d\u52a1\uff1b \u80fd\u8bb0\u5f55\u5173\u673a\u4e4b\u524d\u7528\u4f8b\u6267\u884c\u7684\u4f4d\u7f6e\uff0c\u91cd\u542f\u4e4b\u540e\u80fd\u4ece\u6b64\u4f4d\u7f6e\u5f00\u59cb\u6267\u884c\uff1b \u50cf\u6027\u80fd\u81ea\u52a8\u5316\u4e00\u6837\uff0c\u7531\u670d\u52a1\u7aef\u63a7\u5236\uff1b \u5b8c\u5168\u57fa\u4e8e\u56fe\u5f62\u8bc6\u522b\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u4e32\u53e3\u7ebf\u63a7\u5236\u952e\u9f20\u7a33\u5b9a\u6027\uff1b "},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4","title":"4. \u6d4b\u8bd5\u6267\u884c\u65f6\u95f4\u957f","text":"\u7528\u4f8b\u6267\u884c\u65f6\u95f4\u63a7\u5236\u57282\u5206\u949f\u4ee5\u5185\uff0c\u6781\u7aef\u60c5\u51b5\u4e0d\u8981\u8d85\u8fc75\u5206\u949f\uff0c\u6240\u6709\u7528\u4f8b\u7684\u5e73\u5747\u65f6\u957f\u5e94\u8be5\u57281\u5206\u949f\u5de6\u53f3\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u95f4\u592a\u957f\uff0c\u7f16\u5199\u7528\u4f8b\u3001\u8c03\u8bd5\u7528\u4f8b\u3001\u6267\u884c\u7528\u4f8b\u3001\u7ef4\u62a4\u7528\u4f8b\u90fd\u975e\u5e38\u7684\u8017\u65f6\uff0c\u4eba\u529b\u6210\u672c\u65f6\u95f4\u6210\u672c\u6295\u5165\u592a\u9ad8\u3002 \u4f60\u60f3\uff0c\u8fd9\u6761\u7528\u4f8b\u6267\u884c\u9700\u89815\u5206\u949f\uff0c\u90a3\u4f60\u5199\u8fd9\u6761\u7528\u4f8b\u7684\u65f6\u95f4\u4e0d\u53ef\u80fd\u4e00\u904d\u8fc7\uff0c\u5199\u7684\u8fc7\u7a0b\u4e2d\u8dd1\u4e0d\u901a\u8fd8\u5f97\u91cd\u8dd1\u81f3\u5c1115\u5206\u949f\u4e0d\u8fc7\u5206\uff0c\u5199\u5b8c\u4e86\u8fd8\u5f97\u5728\u5176\u4ed6\u67b6\u6784\u4e0a\u8c03\u8bd5\uff0c\u534a\u4e2a\u5c0f\u65f6\u8fc7\u53bb\u4e86\uff0c\u8fd9\u8fd8\u53ea\u662f\u7b2c\u4e00\u6b21\u5199\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u540e\u7eed\u5982\u679c\u7528\u4f8b\u7ef4\u62a4\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u7ecf\u5e38\u6295\u5165\u76f8\u5f53\u957f\u65f6\u95f4\uff0c\u8fd9\u6837\u5176\u5b9e\u662f\u5931\u53bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u7684\u3002\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u5c31\u5e94\u8be5\u662f\u5feb\u51c6\u72e0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5","title":"5. \u8fb9\u7f18\u6027\u6d4b\u8bd5","text":"\u6709\u4e9b\u529f\u80fd\u6a21\u5757\u672c\u8eab\u662f\u5c5e\u4e8e\u6bd4\u8f83\u8fb9\u7f18\u6027\u7684\uff0c\u5373\u6781\u5c11\u7528\u6237\u4f1a\u4f7f\u7528\u5230\u7684\u529f\u80fd\uff0c\u8fd9\u7c7b\u529f\u80fd\u6a21\u5757\u4e0d\u9700\u8981\u5927\u89c4\u6a21\u5b9e\u73b0\u81ea\u52a8\u5316\uff0c\u4e00\u4e24\u4e2a\u573a\u666f\u8986\u76d6\u57fa\u672c\u529f\u80fd\u5c31\u884c\u4e86\uff0c\u56e0\u6b64\u6211\u4eec\u5728\u6311\u9009\u6b64\u7c7b\u7528\u4f8b\u7684\u65f6\u5019\u53ef\u4ee5\u7ed3\u5408\u6574\u4e2a\u529f\u80fd\u6a21\u5757\u7684\u8986\u76d6\u60c5\u51b5\u6765\u51b3\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6","title":"6. \u9700\u8981\u4f9d\u8d56\u4eba\u5de5\u4ecb\u5165\u7684","text":"\u81ea\u52a8\u5316\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\u662f\u6ca1\u6709\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bd4\u5982\u8981\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u90a3\u4e48\u5c31\u80cc\u79bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u3002 \u6bd4\u5982\u5149\u9a71\u6a21\u5757\uff0c\u5149\u9a71\u523b\u5f55\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u4f46\u662f\u5149\u9a71\u523b\u5f55\u4e4b\u540e\u5149\u76d8\u4f1a\u5f39\u51fa\u6765\uff0c\u9700\u8981\u4eba\u5de5\u66f4\u6362\u5149\u76d8\uff0c\u518d\u624b\u52a8\u63a8\u8fdb\u5149\u9a71\u4e2d\u3002 \u8fd9\u79cd\u529f\u80fd\u6a21\u5757\u5373\u4f7f\u505a\u81ea\u52a8\u5316\uff0c\u80fd\u6d89\u53ca\u5230\u7684\u529f\u80fd\u975e\u5e38\u6709\u9650\uff0c\u800c\u4e14\u4e0d\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u6240\u4ee5\u660e\u663e\u5c31\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7","title":"7. \u96be\u4ee5\u5b9e\u73b0\u7684","text":"\u7528\u4f8b\u6240\u6d89\u53ca\u5230\u7684\u65b9\u6cd5\u5b9e\u73b0\u8d77\u6765\u53ef\u80fd\u6709\u96be\u5ea6\uff0c\u751a\u81f3\u73b0\u9636\u6bb5\u65e0\u6cd5\u5b9e\u73b0\u7684\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002 \u6bd4\u5982\u5f71\u9662\u6d4b\u8bd5\u753b\u9762\u6e05\u6670\u5ea6\u3001\u6d41\u7545\u5ea6\u3001\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u4e4b\u540e\u7684\u89c6\u9891\u662f\u5426\u5b58\u5728\u5361\u987f\u7b49\u7528\u4f8b\uff0c\u73b0\u9636\u6bb5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#8","title":"8. \u529f\u80fd\u4e0d\u7a33\u5b9a","text":"\u8fd9\u4e2a\u4e0d\u662f\u8bf4\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\uff0c\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\u4e0d\u7a33\u5b9a\u662f\u6b63\u5e38\u7684\uff0c\u8fd9\u79cd\u6211\u4eec\u53ef\u4ee5\u7b49\u5f00\u53d1\u63d0\u6d4b\u4e4b\u540e\u518d\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u3002 \u529f\u80fd\u4e0d\u7a33\u5b9a\u6307\u7684\u662f\u7528\u4f8b\u6240\u6d89\u53ca\u7684\u529f\u80fd\uff0c\u53ef\u80fd\u5b58\u5728\u591a\u79cd\u53d8\u5316\uff0c\u6bcf\u6b21\u6267\u884c\u7528\u4f8b\u53ef\u80fd\u65ad\u8a00\u7684\u9884\u671f\u90fd\u4e0d\u540c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#9","title":"9. \u52a8\u6001\u65ad\u8a00","text":"\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u76f4\u5230\u7528\u4f8b\u7ed3\u675f\uff0c\u4e00\u76f4\u662f\u4e00\u4e2a\u52a8\u6001\u53d8\u5316\u7684\u8fc7\u7a0b\uff0c\u800c\u4e14\u65e0\u6cd5\u901a\u8fc7\u5176\u4ed6\u624b\u6bb5\u505c\u4e0b\u6765\uff1b \u6bd4\u5982\uff1a\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u65f6\uff0c\u53f3\u4e0b\u89d2\u7684\u5f55\u5236\u65f6\u95f4\u662f\u4e00\u76f4\u5728\u53d8\u5316\u7684\uff0c\u7528\u4f8b\u9700\u8981\u6d4b\u8bd5\u5f55\u52361\u5206\u949f\u4e4b\u540e\uff0c\u5f55\u5236\u65f6\u95f4\u662f\u521a\u597d\u505c\u572860\u79d2\uff1b \u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fd8\u505a\u4e0d\u5230\u65f6\u95f4\u7cbe\u51c6\u63a7\u5236\uff0c\u7a0b\u5e8f\u6267\u884c\u65f6\u95f4\u662f\u6709\u6ce2\u52a8\u7684\uff0c\u800c\u4e14\u8981\u9002\u914d\u591a\u4e2a\u5e73\u53f0\uff0c\u6240\u4ee5\u6b64\u7c7b\u7528\u4f8b\u5927\u6982\u7387\u4f1a\u6267\u884c\u5931\u8d25\u3002\u7279\u522b\u662f\u5728\u6027\u80fd\u8f83\u5dee\u7684\u56fd\u4ea7\u5316\u67b6\u6784\u4e0a\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u592a\u53ef\u80fd\u7a33\u5b9a\u6267\u884c\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#10","title":"10. \u63a2\u7d22\u6027\u6d4b\u8bd5","text":"\u63a2\u7d22\u6027\u6d4b\u8bd5\u901a\u5e38\u662f\u4e00\u4e9b\u4e0d\u786e\u5b9a\u7684\u64cd\u4f5c\uff0c\u591a\u53d8\u5207\u590d\u6742\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u9884\u671f\u4e5f\u53ef\u80fd\u662f\u4e0d\u786e\u5b9a\u7684\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u9a9a\u64cd\u4f5c\u592a\u591a\u4e86\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6b64\u7c7b\u7528\u4f8b\u9002\u5408\u91c7\u7528\u624b\u5de5\u6d4b\u8bd5\uff0c\u662f\u624b\u5de5\u6d4b\u8bd5\u771f\u6b63\u7684\u4ef7\u503c\u4f53\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#11","title":"11. \u6613\u7528\u6027\u6d4b\u8bd5","text":"\u5bf9\u4e8e\u6613\u7528\u6027\u7684\u5224\u65ad\u901a\u5e38\u662f\u4e3b\u89c2\u7684\uff0c\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\u5f88\u96be\u53bb\u5b9a\u4e49\u4ec0\u4e48\u6837\u7684\u60c5\u51b5\u5bf9\u7528\u6237\u662f\u6613\u7528\u7684\uff0c\u81ea\u52a8\u5316\u9700\u8981\u6709\u660e\u786e\u7684\u53ef\u5b9e\u73b0\u7684\u9884\u671f\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#_2","title":"\u4e8c\u3001\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b","text":"\u524d\u9762\u8bb2\u4e86\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u4e00\u4e9b\u7528\u4f8b\u60c5\u51b5\uff0c\u6709\u540c\u5b66\u5c31\u8bf4\u4e86\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\u4e0d\u7528\u8bb2\u4e86\uff0c\u5c31\u662f\u4e0d\u9002\u5408\u7684\u53cd\u9762\u3002\u6ca1\u6bdb\u75c5\u54c8\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\uff0c\u6211\u4eec\u5927\u4f53\u8fd8\u53ef\u4ee5\u5206\u4e3a\u4e24\u7c7b\uff1a \u7b2c\u4e00\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u597d\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u7b2c\u4e8c\u7c7b\uff1a\u81ea\u52a8\u5316\u6548\u679c\u4e00\u822c\uff0c\u9700\u8981\u6295\u5165\u66f4\u591a\u7cbe\u529b\u624d\u80fd\u5b9e\u73b0\u7684\u81ea\u52a8\u5316\u7528\u4f8b\uff1b \u4ee5\u4e0b\u4ecb\u7ecd\u4e00\u4e9b\u6211\u4eec\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u7684\u60c5\u51b5\uff1a"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#1_1","title":"1. \u64cd\u4f5c\u76f8\u5bf9\u7b80\u5355","text":"\u7528\u4f8b\u6b65\u9aa4\u76f8\u5bf9\u8f83\u5c11\uff0c\u8fd9\u79cd\u7528\u4f8b\u901a\u5e38\u662f\u4e00\u4e9b\u8def\u5f84\u5f88\u6d45\u7684\u7528\u4f8b\uff0c\u4e00\u822c\u4e5f\u662f\u4e00\u4e9b\u57fa\u7840\u7528\u4f8b\u3002\u7528\u4f8b\u7f16\u5199\u3001\u7ef4\u62a4\u90fd\u53ef\u4ee5\u8f7b\u677e\u641e\u5b9a\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#2_1","title":"2. \u5bb9\u6613\u5b9e\u73b0","text":"\u73b0\u6709\u6280\u672f\u662f\u53ef\u5b9e\u73b0\u7684\uff0c\u6ca1\u6709\u96be\u5ea6\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u505a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#3_1","title":"3. \u7ecf\u5e38\u7528\u4e8e\u56de\u5f52\u6d4b\u8bd5","text":"\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bcf\u6b21\u56de\u5f52\u6d4b\u8bd5\u5fc5\u987b\u8981\u6267\u884c\u7684\u7528\u4f8b\uff0c\u90a3\u4e48\u8fd9\u6761\u7528\u4f8b\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u3002 \u56de\u5f52\u6d4b\u8bd5\u65f6\u6211\u4eec\u9996\u5148\u5e94\u8be5\u4fdd\u8bc1\u5e94\u7528\u5386\u53f2\u57fa\u672c\u529f\u80fd\u6b63\u5e38\uff0c\u6240\u4ee5\u90a3\u4e9b\u6bcf\u6b21\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u90fd\u8981\u6267\u884c\u7684\u7528\u4f8b\u9002\u5408\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u7528\u4f8b\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#4_1","title":"4. \u529f\u80fd\u7a33\u5b9a\u7684\u6838\u5fc3\u529f\u80fd","text":"\u6d89\u53ca\u6838\u5fc3\u529f\u80fd\u7684\u7528\u4f8b\u662f\u6700\u6700\u91cd\u8981\u7684\u7528\u4f8b\uff0c\u4e5f\u662f\u6211\u4eec\u4ea4\u4ed8\u65f6\u5fc5\u987b\u8981\u4fdd\u8bc1\u8d28\u91cf\u7684\u76f8\u5173\u529f\u80fd\uff0c\u56e0\u6b64\u5e94\u8be5\u5c3d\u53ef\u80fd\u7684\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#5_1","title":"5. \u8f93\u5165\u6570\u636e\u6d4b\u8bd5","text":"\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u901a\u5e38\u662f\u68c0\u9a8c\u88ab\u6d4b\u5e94\u7528\u63a5\u53d7\u6709\u6548\u6570\u636e\u3001\u62d2\u7edd\u65e0\u6548\u6570\u636e\u7684\u80fd\u529b\u3002\u5982\uff1a\u63d0\u4ea4\u8d85\u957f\u5b57\u7b26\u4e32\u3001\u7279\u6b8a\u5b57\u7b26\u4e32\u7b49\u7b49\u3002 \u6b64\u7c7b\u7528\u4f8b\u624b\u5de5\u6d4b\u8bd5\u5f88\u96be\u6bd4\u8f83\u5168\u9762\u7684\u8986\u76d6\u5230\u6240\u6709\u7684\u8f93\u5165\u60c5\u51b5\uff0c\u4f46\u662f\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\uff0c\u6b64\u7c7b\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u90fd\u662f\u4e00\u6837\u7684\uff0c\u53d8\u5316\u7684\u4ec5\u662f\u8f93\u5165\u53c2\u6570\u548c\u65ad\u8a00\u7ed3\u679c\uff0c\u91c7\u7528\u6570\u636e\u9a71\u52a8\uff0c\u53ef\u4ee5\u8f7b\u677e\u5b9e\u73b0\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#6_1","title":"6. \u683c\u5f0f\u8986\u76d6","text":"\u539f\u56e0\u540c\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u7c7b\u7528\u4f8b\u4e00\u6837\uff0c\u591a\u79cd\u683c\u5f0f\u7684\u8986\u76d6\u4e5f\u662f\u4e00\u4e2a\u5f88\u7e41\u7410\u7684\u4e8b\u60c5\uff0c\u4ea4\u7ed9\u81ea\u52a8\u5316\u6765\u505a\u518d\u5408\u9002\u4e0d\u8fc7\u4e86\u3002 \u6bd4\u5982\u5f71\u9662\u5bf9\u5f71\u7247\u683c\u5f0f\u7684\u68c0\u67e5\u3001\u622a\u56fe\u5f55\u5c4f\u5bf9\u4fdd\u5b58\u683c\u5f0f\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002"},{"location":"AT%E7%94%A8%E4%BE%8B%E7%AD%9B%E9%80%89%E6%8C%87%E5%8C%97/#7_1","title":"7. \u68c0\u67e5\u5143\u7d20\u72b6\u6001","text":"\u67e5\u770b\u88ab\u6d4b\u5e94\u7528\u7684\u5143\u7d20\u5c5e\u6027\u3002\u5982\uff1a\u56fe\u7247\u7684\u5927\u5c0f\u548c\u6392\u5217\uff1b\u6309\u94ae\u7684\u53ef\u7528\u548c\u4e0d\u53ef\u7528\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/","title":"AT \u7ecf\u9a8c\u603b\u7ed3","text":"\u6b22\u8fce\u6240\u6709\u4eba\u63d0\u4ea4\u4f60\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u9762\u7684\u4f18\u79c0\u5b9e\u8df5\u7ecf\u9a8c\uff0c\u4ee5\u5e2e\u52a9\u5927\u5bb6\u89e3\u51b3\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#1","title":"1\u3001\u7ec8\u7ed3\u5668","text":"# litaoa@uniontech.com\n \u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4 pytest \u5b9e\u73b0\u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4\u7684\u65b9\u5f0f\u6709\u4e24\u79cd\uff0cyield \u548c\u7ec8\u7ed3\u51fd\u6570\uff1b yield \u5b9e\u73b0\uff0cyield\u524d\u9762\u4e3a\u7528\u4f8b\u7684\u524d\u7f6e\u6b65\u9aa4\uff0cyield \u540e\u9762\u4e3a\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4\u3002 @pytest.fixture\ndef clean_env():\nprint(\"setup\")\nyield\nprint(\"teardown\")\n \u7ec8\u7ed3\u51fd\u6570\u5b9e\u73b0\uff0c\u4f7f\u7528 request.addfinalizer \u6ce8\u518c\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4 @pytest.fixture\ndef clean_env(request):\ndef clean():\nprint(\"teardown\")\nrequest.addfinalizer(clean)\nprint(\"setup\")\n yield\u7684\u4f18\u7f3a\u70b9\uff1a \u4f18\u70b9\uff1a\u4ee3\u7801\u7b80\u6d01\uff0c\u76f4\u89c2\uff0c\u53ef\u4f7f\u7528yield\u5728\u7528\u4f8b\u4e2d\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c \u7f3a\u70b9\uff1a\u82e5\u524d\u7f6e\u6b65\u9aa4\u4e2d\u51fa\u73b0\u9519\u8bef\uff0c\u5219\u540e\u7f6e\u6b65\u9aa4\u4e0d\u4f1a\u6267\u884c \u7ec8\u7ed3\u51fd\u6570\uff1a \u4f18\u70b9\uff1a\u524d\u7f6e\u6b65\u9aa4\u5931\u8d25\u7684\u8bdd\uff0c\u540e\u7f6e\u6b65\u9aa4\u4ecd\u4f1a\u6267\u884c\u4e14\u53ef\u4ee5\u6ce8\u518c\u591a\u4e2a\u540e\u7f6e\u6b65\u9aa4\uff08\u524d\u63d0\uff1a\u9700\u8981\u5728\u4ee3\u7801\u62a5\u9519\u4e4b\u524d\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff09\uff0c\u652f\u6301\u7075\u6d3b\u4f7f\u7528\u540e\u7f6e\u6761\u4ef6 \u7f3a\u70b9\uff1a\u4ee3\u7801\u8f83\u4e3a\u590d\u6742\uff0c\u65e0\u6cd5\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c\uff08\u672c\u4eba\u76ee\u524d\u672a\u5b9e\u73b0\uff09 \u603b\u7ed3\uff1a\u5728\u524d\u7f6e\u6b65\u9aa4\u4fdd\u8bc1\u7edd\u5bf9\u4e0d\u4f1a\u51fa\u9519\u65f6\uff0c\u4f7f\u7528yield\u66f4\u4f73\u7b80\u4fbf\uff0c\u5f53\u524d\u7f6e\u6b65\u9aa4\u6613\u51fa\u73b0\u95ee\u9898\u65f6\uff0c\u63a8\u8350\u4f7f\u7528\u7ec8\u7ed3\u51fd\u6570\u3002 \u573a\u666f\uff1a\u4fdd\u9669\u7bb1\u7528\u4f8b\uff0c\u524d\u7f6e\u6b65\u9aa4\u4e2d\u5f00\u542f\u4fdd\u9669\u7bb1\uff0c\u540e\u7f6e\u6b65\u9aa4\u5220\u9664\u4fdd\u9669\u7bb1\u3002 @pytest.fixture(scope=\"session\", autouse=True)\ndef vault_fixture(request):\nDfmWidget.reset_vault_by_cmd() # 1\u3001\u91cd\u7f6e\u4fdd\u9669\u7bb1\nDdeDockPublicWidget().close_file_manager_by_cmd() # 2\u3001\u5173\u95ed\u6587\u7ba1\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 3\u3001\u5f00\u542f\u6587\u7ba1\nvault = DfmWidget()\nvault.create_file_vault() # 4\u3001\u521b\u5efa\u4fdd\u9669\u7bb1\ndef delete_vault(): # 8\u3001\u5220\u9664\u4fdd\u9669\u7bb1\u7684\u540e\u7f6e\u6b65\u9aa4\nsleep(2)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr()\nvault = DfmWidget()\nvault.delete_file_vault()\nDfmWidget.reset_vault_by_cmd()\nDdeDockPublicWidget().close_file_manager_by_cmd()\nrequest.addfinalizer(delete_vault) # 5\u3001\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\nDdeDockPublicWidget().close_file_manager_by_cmd() # 6\u3001\u5173\u95ed\u6587\u7ba1\nsleep(1)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 7\u3001\u5f00\u542f\u6587\u7ba1\n \u4ee3\u7801\u6309\u6ce8\u91ca\u4e2d\u7684\u5e8f\u53f7\u6267\u884c\u6b65\u9aa4 \u4ee3\u7801\u5728\u6b65\u9aa41-4\u4efb\u610f\u4f4d\u7f6e\u62a5\u9519\uff0c\u5219\u4e0d\u4f1a\u6267\u884c\u6b65\u9aa48\uff0c\u56e0\u4e3a\u672a\u6267\u884c\u5230\u6b65\u9aa45\uff0c\u6b65\u9aa48\u8fd8\u672a\u6ce8\u518c \u4ee3\u7801\u5728\u6b65\u9aa46-7\u62a5\u9519\uff0c\u4ecd\u4f1a\u6267\u884c\u6b65\u9aa47\uff0c\u56e0\u4e3a\u5728\u6b65\u9aa45\u4e2d\u5df2\u7ecf\u5c06\u6b65\u9aa47\u6ce8\u518c \u53ef\u4ee5\u7075\u6d3b\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff0c\u80fd\u5b9e\u73b0\u67d0\u4e2a\u524d\u7f6e\u6b65\u9aa4\u6267\u884c\u4e4b\u540e\uff0c\u624d\u4f1a\u6267\u884c\u540e\u7f6e\u6b65\u9aa4\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#2","title":"2\u3001\u542f\u52a8\u5e94\u7528\u7684\u65b9\u5f0f","text":"# huangmingqiang@uniontech.com\n \uff081\uff09\u547d\u4ee4\u884c\u542f\u52a8 \u5728 AT \u4ee3\u7801\u4e2d\u4f7f\u7528\u547d\u4ee4\u884c\u542f\u52a8\u5e94\u7528\uff0c\u4e3e\u4f8b\uff1a os.popen(\"deepin-music\")\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f7f\u7528 ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6\uff0cdogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u3002 \uff082\uff09\u901a\u8fc7 UI \u64cd\u4f5c\u542f\u52a8 \u901a\u8fc7\u4efb\u52a1\u680f\u3001\u542f\u52a8\u5668\u3001\u684c\u9762\u7b49UI\u65b9\u5f0f\u542f\u52a8\uff0c\u6bd4\u5982\u53cc\u51fb\u6253\u5f00\u3001\u53f3\u952e\u6253\u5f00\u7b49\uff0c\u8fd9\u79cd\u64cd\u4f5c\u65b9\u5f0f\u4e0d\u5b58\u5728ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6dogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u7684\u95ee\u9898\uff0c\u4e5f\u66f4\u52a0\u7b26\u5408\u7528\u6237\u7684\u64cd\u4f5c\u884c\u4e3a\u3002"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#3","title":"3\u3001\u6587\u4ef6\u9009\u62e9\u6846\u5c5e\u6027\u5b9a\u4f4d\u5076\u73b0\u65e0\u6cd5\u627e\u5230","text":"\u6587\u4ef6\u9009\u62e9\u6846\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5728\u8c03\u7528\u6587\u4ef6\u9009\u62e9\u6846\u65f6\uff0c\u6709\u4e00\u5b9a\u7684\u6982\u7387\u51fa\u73b0\uff0c\u754c\u9762\u5df2\u7ecf\u6e32\u67d3\u51fa\u6765\u4e86\uff0c\u4f46\u662f\u5c5e\u6027\u6811\u5e76\u6ca1\u6709\u5199\u5165\uff0c\u5bfc\u81f4\u901a\u8fc7\u5c5e\u6027\u65e0\u6cd5\u627e\u5230\u5143\u7d20\uff0c\u76ee\u524d\u4e5f\u6ca1\u6709\u5f88\u597d\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u4e3a\u4e86\u7528\u4f8b\u7a33\u5b9a\u6027\uff0c\u6587\u4ef6\u9009\u62e9\u6846\u7684\u64cd\u4f5c\u5efa\u8bae\u4f7f\u7528UI\u6216\u8005\u56fe\u7247\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u53ef\u4ee5\u901a\u8fc7\u641c\u7d22\u5185\u5bb9\u56fa\u5b9a\u6587\u4ef6\u4f4d\u7f6e\u3002 # litaoa@uniontech.com\n desk = DdeDesktopPublicWidget()\n# \u9009\u62e9\u89c6\u9891\u76ee\u5f55\ndesk.click_videos_dir_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.ctrl_f()\nsleep(1)\ndesk.input_message(\"\u5143\u7d20\u540d\u79f0\")\nsleep(0.5)\ndesk.enter()\nsleep(1)\n# \u9009\u62e9\u7b2c\u4e00\u4e2a\u6587\u4ef6\ndesk.click_list_view_btn_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.click_first_file_in_desktop_plugs_by_ui()\nsleep(1)\n# \u6587\u7ba1\u63d2\u4ef6\u4e2d\u70b9\u51fb\u6253\u5f00\ndesk.click_open_btn_in_desktop_plugs_by_ui()\n"},{"location":"AT%E7%BB%8F%E9%AA%8C%E6%80%BB%E7%BB%93/#4","title":"4\u3001\u5e94\u7528\u542f\u52a8","text":"# mikigo\n \u5728UI\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u4e00\u5207\u64cd\u4f5c\u7684\u90fd\u662f\u4ece\u5e94\u7528\u542f\u52a8\u5f00\u59cb\u7684\uff0c\u800c\u5728Linux\u684c\u9762\u5e94\u7528\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u6211\u4eec\u542f\u52a8\u5e94\u7528\u7684\u65b9\u6cd5\u6709\u591a\u79cd\uff0c\u4e0b\u9762\u505a\u4e00\u4e2a\u7b80\u5355\u7684\u4ecb\u7ecd\uff1a \u3010\u4f7f\u7528dogtail\u542f\u52a8\u3011 dogtail\u63d0\u4f9b\u4e86\u5e94\u7528\u542f\u52a8\u7684\u65b9\u6cd5\uff0c\u5728utils\u5e93\u4e2d\uff0c\u4f7f\u7528run\u65b9\u6cd5\u542f\u52a8\uff1a \u9996\u5148\u5bfc\u5165\u65b9\u6cd5\uff1a from dogtail.utils import *\n \u8c03\u7528run\u65b9\u6cd5 run('deepin-music')\n \u5373\u53ef\u542f\u52a8\u97f3\u4e50 \u8fd9\u79cd\u65b9\u6cd5\u7684\u4f18\u70b9\u662f\u91c7\u7528\u8fdb\u7a0b\u7684\u65b9\u5f0f\u76f4\u63a5\u542f\u52a8\uff0c\u4e0d\u4f9d\u8d56\u4e0eUI\uff0c\u65e0\u8bba\u684c\u9762\u6216\u4efb\u52a1\u680f\u4e0a\u662f\u5426\u5b58\u5728\u5e94\u7528\u56fe\u6807\uff0c\u90fd\u53ef\u4ee5\u6b63\u5e38\u542f\u52a8\u3002 \u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c \u5982\u679c\u4f7f\u7528ssh\u8fdc\u7a0b\u8c03\u7528\uff0c\u6216\u8005Jenkins\u4e2d\u6267\u884c\u6d4b\u8bd5\u811a\u672c\u7684\u65f6\u5019\uff0c\u5728sniff\u4e2d\u4f1a\u51fa\u73b0\u627e\u4e0d\u5230\u5e94\u7528\uff0c\u7ecf\u8fc7\u5206\u6790\uff0c\u53ef\u80fd\u662f\u56e0\u4e3a\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\u542f\u52a8\u7684\u65f6\u5019\uff0c\u5b9e\u9645\u662f\u91c7\u7528\u4e00\u4e2a\u5b50\u8fdb\u7a0b\u542f\u52a8\u4e86\u5e94\u7528\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u5230\u3002 \u3010\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u3011 \u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807 \u901a\u5e38\u6709\u4e24\u79cd\u65b9\u6cd5\uff1a \uff081\uff09\u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807\u3002 \uff082\uff09\u5df2\u77e5\u5e94\u7528\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u7684\u4f4d\u7f6e\uff0c\u7136\u540e\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u5bf9\u5e94\u5750\u6807\u3002 \u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u7f3a\u70b9\u662f\u4f4d\u7f6e\u5fc5\u987b\u56fa\u5b9a\uff0c\u5982\u679c\u79fb\u52a8\u4f4d\u7f6e\u5c31\u4e0d\u884c\u4e86\uff0c\u800c\u4f7f\u7528\u7b2c\u4e00\u79cd\u65b9\u6cd5\uff0c\u65e0\u8bba\u4f4d\u7f6e\u5728\u54ea\u91cc\uff0c\u53ea\u8981\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u5b58\u5728\u5373\u53ef\u3002 \u3010\u70b9\u51fb\u684c\u9762\u56fe\u6807\u542f\u52a8\u3011 \u684c\u9762\u56fe\u6807\u76ee\u524d\u662f\u91c7\u7528\u56fe\u50cf\u8bc6\u522b\u6280\u672f\uff0c\u5b9a\u4f4d\u5230\u5e94\u7528\u56fe\u6807\u7684\u5750\u6807\uff0c\u7136\u540e\u901a\u8fc7pyauogui\u8fdb\u884c\u70b9\u51fb\u64cd\u4f5c\u3002 \u8be6\u7ec6\u6280\u672f\u65b9\u6848\u53ef\u4ee5\u53c2\u8003\u6211\u7684\u53e6\u5916\u4e24\u7bc7\u535a\u5ba2: \u57fa\u4e8eopencv\u7684\u6a21\u677f\u5339\u914d\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd4\u56de\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 Python\u4e09\u65b9\u5e93PyAutoGui\u7684\u4f7f\u7528\u65b9\u6cd5 \u3010\u4ece\u542f\u52a8\u5668\u542f\u52a8\uff08\u4fd7\u79f0\u5f00\u59cb\u83dc\u5355\uff09\u3011 \u542f\u52a8\u4e2d\u542f\u52a8\u7684\u5b9e\u73b0\u903b\u8f91\u5b9e\u9645\u548c\u4efb\u52a1\u680f\u4e0a\u542f\u52a8\u5dee\u4e0d\u591a\u3002 \u9996\u5148\uff0c\u9700\u8981\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u542f\u52a8\u5668\u56fe\u6807\uff0c\u6216\u8005\u952e\u76d8super\u952e\uff0c\u5c06\u542f\u52a8\u5668\u547c\u51fa\u6765\uff0c \u7136\u540e\uff0c\u5728\u542f\u52a8\u5668\u4e2d\u70b9\u51fb\u5bf9\u5e94\u7684\u56fe\u6807\uff0c \u4f46\u662f\u8fd9\u91cc\u6709\u4e2a\u95ee\u9898\uff0c\u542f\u52a8\u5668\u4e2d\u7684\u5e94\u7528\u5217\u8868\uff0c\u4e00\u9875\u5c55\u793a\u4e0d\u5b8c\uff0c\u6240\u4ee5\u5982\u679c\u6211\u4eec\u8981\u70b9\u51fb\u7684\u5e94\u7528\u56fe\u6807\u4e0d\u5728\u7b2c\u4e00\u9875\u600e\u4e48\u529e\uff0c\u901a\u5e38\u89e3\u51b3\u65b9\u6848\u6709\u4e24\u79cd\uff1a \uff081\uff09\u9700\u8981\u8fdb\u884c\u5411\u4e0b\u6ed1\u52a8\uff0c\u8fd9\u91cc\u5c31\u6d89\u53ca\u5230\u76f8\u5e94\u7684\u8bc6\u522b\u65b9\u6848\uff0c\u5224\u65ad\u5982\u679c\u4e0d\u5728\u7b2c\u4e00\u9875\u5c31\u5f80\u4e0b\u6ed1\u52a8\u7ffb\u9875\u3002 \uff082\uff09\u542f\u52a8\u5668\u63d0\u4f9b\u641c\u7d22\u7684\u529f\u80fd\uff0c\u8f93\u5165\u5e94\u7528\u540d\u79f0\u641c\u7d22\uff0c\u7136\u540e\u8fdb\u884c\u70b9\u51fb\u3002 \u4ece\u5b9e\u9645\u64cd\u4f5c\u4e2d\u6765\u770b\uff0c\u91c7\u7528\u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u6548\u7387\u4f1a\u9ad8\u4e00\u70b9\u3002 \u3010\u7ec8\u7aef\u547d\u4ee4\u542f\u52a8\u3011 \u5728python\u4e2d\uff0c\u4f7f\u7528os.popen()\u6216os.system()\u6216\u8005subprocess.Popen()\uff0c\u5b9e\u73b0\u547d\u4ee4\u884c\u542f\u52a8\uff0c\u6bd4\u5982\uff1a import os\nos.popen('deepin-music')\n \u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u8fdc\u7a0b\u6267\u884c\u811a\u672c\u7684\u65f6\u5019\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u7684\u95ee\u9898\u3002 \u3010\u603b\u7ed3\u3011 \u4ee5\u4e0a\u51e0\u79cd\u65b9\u6cd5\uff0c\u5404\u6709\u4f18\u7f3a\u70b9\uff0c\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff1a \uff081\uff09\u5982\u679c\u9700\u8981\u5728Jenkins\u4e2d\u505a\u6301\u7eed\u96c6\u6210\uff0c\u5efa\u8bae\u4f7f\u7528\u7b2c\u4e8c\u79cd\u4efb\u52a1\u680f\u542f\u52a8\u7684\u65b9\u6cd5\u3002 \uff082\uff09\u5982\u679c\u4e0d\u4f1a\u91c7\u7528\u8fdc\u7a0b\u6267\u884c\u7684\uff0c\u5efa\u8bae\u91c7\u7528\u7b2c\u4e00\u79cd\u6216\u8005\u6700\u540e\u4e00\u79cd\u65b9\u6848\u3002 \uff083\uff09\u7b2c\u4e09\u79cd\u548c\u7b2c\u56db\u79cd\u542f\u52a8\u65b9\u6cd5\uff0c\u901a\u5e38\u5728\u6d4b\u8bd5\u7528\u4f8b\u4e2d\u4f1a\u6d89\u53ca\u5230\uff0c\u6240\u4ee5\u5076\u5c14\u4f1a\u7528\u3002"},{"location":"RELEASE/","title":"\u7248\u672c\u66f4\u65b0\u8bb0\u5f55","text":""},{"location":"RELEASE/#220202395","title":"2.2.0\uff082023/9/5\uff09","text":"new \u6b63\u5f0f\u542f\u7528 letmego \u6280\u672f\u65b9\u6848\uff1b fix \u5bf9 docs \u91cc\u9762\u7ec6\u5316\u4e86\u8fdc\u7a0b\u6267\u884c\u7ae0\u8282\u7684\u63cf\u8ff0\uff1b "},{"location":"RELEASE/#2152023831","title":"2.1.5\uff082023/8/31\uff09","text":"new \u5c06\u6709\u8da3\u7684\u6587\u6863\u7cfb\u7edf\u8fc1\u79fb\u5230 linuxdeepin \uff0c\u5265\u79bb\u6587\u6863\u4e2d\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u91c7\u7528 CDN \u52a0\u901f\u65b9\u5f0f\u52a0\u8f7d\uff1b \u5c1d\u8bd5\u5408\u5165\u4e00\u4e2a\u6709\u8da3\u7684\u529f\u80fd\uff1b fix \u4fee\u590d\u4e86 Wayland \u952e\u9f20\u5de5\u5177\u6ca1\u6709\u9f20\u6807\u76f8\u5bf9\u79fb\u52a8\u65b9\u6cd5 moveRel \u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 Wayland \u4e0b\u83b7\u53d6\u7a97\u53e3\u4fe1\u606f\u529f\u80fd\u6a21\u5757\u4e2d\u73af\u5883\u53d8\u91cf\u7684\u95ee\u9898\uff1b \u4f18\u5316\u4e86 startproject \u529f\u80fd\u7684\u4e00\u4e9b\u4fe1\u606f\u8f93\u51fa\uff1b \u4fee\u590d\u4e86\u7279\u6b8a\u573a\u666f\u4e0b env_dev.sh \u5f00\u53d1\u73af\u5883\u90e8\u7f72\u662f\u53ef\u80fd\u5f71\u54cd\u5230\u6b63\u5f0f\u73af\u5883 env.sh \u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#2122023822","title":"2.1.2\uff082023/8/22\uff09","text":"new \u589e\u52a0 OCR \u8bc6\u522b\u81ea\u52a8\u91cd\u8bd5\u673a\u5236\uff0c\u9ed8\u8ba4\u91cd\u8bd5 2 \u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u91cd\u8bd5\u6b21\u6570\uff1b \u4f7f\u7528\u7a97\u7ba1\u6700\u65b0\u63d0\u4f9b\u7684\u4e8c\u8fdb\u5236\u63a5\u53e3\uff0c\u4f18\u5316\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u5728 Wayland \u4e0b\u83b7\u53d6\u7a97\u53e3\u4fe1\u606f\u7684\u65b9\u6cd5\uff1b\u611f\u8c22\u684c\u9762\u6d4b\u8bd5\u90e8 @\u4f55\u6743 @\u5b59\u7fe0 \u3001\u7a97\u7ba1\u7814\u53d1 @\u9ec4\u6cfd\u94ed \u7684\u5927\u529b\u652f\u6301\u3002 \u6269\u5145 skipif \u6761\u4ef6\u8df3\u8fc7\u7684\u529f\u80fd\u51fd\u6570\uff1a skipif_xdg_type \u652f\u6301 x11 \u6216 wayland \u4e0a\u8df3\u8fc7\uff1b skipif_cpu_name \u652f\u6301\u4e0d\u540c cpu \u4e0a\u8df3\u8fc7\uff0c\u6bd4\u5982\uff1askipif_cpu_name-KLVVW5821\uff1b "},{"location":"RELEASE/#2102023818","title":"2.1.0\uff082023/8/18\uff09","text":"fix \u4fee\u590d SW \u67b6\u6784\u73af\u5883\u4f9d\u8d56\u7684\u95ee\u9898\uff0c\u539f\u56e0\u662f\u4e4b\u524d\u6211\u8fd9\u91cc\u672c\u5730\u6ca1\u6709 SW \u7684\u673a\u5668\uff0c\u6ca1\u6709\u505a\u76f8\u5173\u9002\u914d\uff1b \u4fee\u590d\u5b50\u9879\u76ee\u5355\u72ec\u9700\u8981\u4e09\u65b9\u5305 pexpect\uff0c\u7531\u4e8e\u4e4b\u524d\u662f\u9884\u88c5\u5230\u955c\u50cf\u91cc\u9762\u7684\uff0c\u4f46\u57fa\u7840\u6846\u67b6\u4e0d\u9700\u8981\uff0c\u56e0\u6b64\u6ca1\u6709\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u91cc\u9762\uff0c\u5bfc\u81f4\u5b50\u9879\u76ee\u4f9d\u8d56\u62a5\u9519\u3002 \u4fee\u590d\u5b50\u9879\u76ee cv \u5bfc\u5165\u62a5\u9519\u7684\u95ee\u9898\uff1b \u539f\u56e0\u4e3a\uff1ayouqu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u517c\u5bb9\u4e24\u79cd\u60c5\u51b5\uff0c\u4e00\u79cd\u662f\u9762\u5411\u670d\u52a1\uff0c\u5c31\u662f\u672c\u5730\u6d4b\u8bd5\u673a\u4e0d\u9700\u8981\u5b89\u88c5 OpenCV\uff0c\u7528\u4f8b\u4e2d\u7684\u56fe\u50cf\u8bc6\u522b\u4f1a\u901a\u8fc7\u8fdc\u7a0b\u670d\u52a1\u63a5\u53e3\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u548c\u7ed3\u679c\u83b7\u53d6\uff1b\u7b2c\u4e8c\u79cd\u662f\u539f\u751f\uff0c\u5c31\u662f\u672c\u5730\u76f4\u63a5\u5b89\u88c5 OpenCV \u76f4\u63a5\u7528\u3002\u4e24\u4e2a\u60c5\u51b5\u7684\u4f18\u5148\u7ea7\u662f\u4f18\u5148\u5224\u65ad\u672c\u5730\u5b58\u5728\uff0c\u5426\u5219\u8d70\u670d\u52a1\u3002 \u524d\u9762\u6211\u4eec\u5df2\u7ecf\u628a OCR \u529f\u80fd\u505a\u4e86\u670d\u52a1\u5316\uff0c\u57fa\u4e8e 1 \u5e74\u591a\u4ee5\u6765\u7684\u89c2\u5bdf\uff0c\u7528\u8d77\u6765\u5f88\u7a33\u5b9a\uff0c\u518d\u4e00\u4e2a\u5c31\u662f OpenCV \u5b89\u88c5\u5305\u662f\u6bd4\u8f83\u81c3\u80bf\u7684\uff0c\u7c97\u7565\u6570\u4e86\u4e0b\u4f9d\u8d56\u6709 30+ \u4e2a\uff0c\u800c\u4e14\u5728\u5404\u67b6\u6784\u4e0a\u4f9d\u8d56\u5305\u8fd8\u4e0d\u5c3d\u76f8\u540c\uff0c\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u65b9\u6848\u4e2d\u4e0d\u592a\u597d\u5904\u7406\uff0c\u6240\u4ee5\u672c\u6b21 2.0 \u7248\u672c\u6211\u4eec\u5927\u80c6\u7684\u5c06\u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u529f\u80fd\u4fee\u6539\u4e3a\u9762\u5411\u670d\u52a1\u7684\u65b9\u5f0f\uff0c\u524d\u671f\u6d4b\u8bd5\u4e00\u5207\u770b\u8d77\u6765\u90fd\u5f88\u548c\u8c10\u3002 \u4f46\u662f\u6ca1\u6ce8\u610f\u5230\u4e4b\u524d\u7ed9\u6d77\u71d5\u59d0\u90a3\u8fb9\u9879\u76ee\u5355\u72ec\u5b9a\u5236\u505a\u4e86\u4e2a\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\uff08\u4e3a\u4e86\u80fd\u7b80\u5355\u5e73\u6ed1\u7684\u8fc1\u79fb\u5230 youqu\uff09\uff0c\u6b64\u63a5\u53e3\u5e95\u5c42\u6ca1\u6709\u517c\u5bb9\u670d\u52a1\u5316\uff0c\u6240\u4ee5\u5979\u90a3\u8fb9\u7684\u9879\u76ee\u8c03\u7528\u6b64\u5b9a\u5236\u63a5\u53e3\u4f1a\u62a5 cv \u5bfc\u5165\u7684\u95ee\u9898\u3002 \u7531\u4e8e\u5c06\u8fd9\u4e2a\u5b9a\u5236\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\u8fdb\u884c\u670d\u52a1\u5316\u517c\u5bb9\u6539\u9020\u9700\u8981\u4e00\u5b9a\u65f6\u95f4\uff0c\u6539\u5b8c\u8fd8\u9700\u8981\u6d4b\u8bd5\uff0c\u4f46\u672c\u6b21\u65f6\u95f4\u6bd4\u8f83\u7d27\uff0c\u56e0\u6b64\u5148\u628a OpenCV \u88c5\u8fdb\u865a\u62df\u73af\u5883\uff0c\u540e\u7eed\u7248\u672c\u518d\u8003\u8651\u9488\u5bf9\u6b64\u63a5\u53e3\u505a\u4fee\u6539\u3002"},{"location":"RELEASE/#2002023816","title":"2.0.0\uff082023/8/16\uff09","text":"YouQu\uff08\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff09\u5f00\u6e90\u4e86\uff0c\u540c\u65f6\u63a8\u51fa\u4e86 2.0 \u7248\u672c\u3002 \u611f\u8c22\u738b\u6ce2\u603b\u3001\u67b6\u6784\u5e08\u5f90\u5c0f\u4e1c\u3001\u7814\u53d1\u7ecf\u7406\u90d1\u5e7c\u6208\u3001\u5218\u90d1\u7b49\u7814\u53d1\u540c\u4e8b\u7684\u5927\u529b\u652f\u6301\u3002 new 1\u3001\u65b0\u7684\u57fa\u7840\u6846\u67b6\u4ee3\u7801\u83b7\u53d6\u65b9\u5f0f\u53ca\u65b0\u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4 YouQu \u540e\u7eed\u5747\u901a\u8fc7 PyPI \u8fdb\u884c\u5305\u7684\u53d1\u5e03\uff0c\u4e5f\u5c31\u662f\u8bf4\u540e\u7eed\u53ef\u4ee5\u4f7f\u7528 pip \u8fdb\u884c\u5b89\u88c5\uff1a sudo pip3 install youqu==2.0.0\n \u8fd9\u91cc\u6709 2 \u4e2a\u5c0f\u70b9\u8981\u6ce8\u610f\uff1a \u63a8\u8350\u4f7f\u7528 sudo pip3 \uff08\u52a0 sudo\uff09\u8fdb\u884c\u5b89\u88c5\uff1b \u5982\u679c\u4e0d\u52a0 sudo \u6709\u4e9b\u673a\u5668\u53ef\u80fd $HOME/.local/bin \u4e0d\u5728\u7cfb\u7edf PATH \u73af\u5883\u76ee\u5f55\u4e0b\uff0c\u5728\u4e0d\u6dfb\u52a0\u73af\u5883\u53d8\u91cf\u7684\u60c5\u51b5\u4e0b\uff0c\u4f1a\u51fa\u73b0 YouQu \u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4\uff08youqu-startproject\uff09\u65e0\u6cd5\u4f7f\u7528\u7684\u95ee\u9898\uff1b \u5f53\u7136\uff0c\u5c06\u4e0a\u8ff0\u8def\u5f84\u6dfb\u52a0\u5230\u73af\u5883\u53d8\u91cf\u4e4b\u540e\u4e5f\u662f\u53ef\u4ee5\u7528\u7684\uff0c\u6240\u4ee5\u6211\u8fd9\u91cc\u662f\u63a8\u8350\u52a0 sudo\uff0c\u4e0d\u52a0 sudo \u4e5f\u662f\u53ef\u4ee5\u7684\uff0c\u53ea\u662f\u9700\u8981\u5173\u6ce8\u4e0b\u73af\u5883\u53d8\u91cf\u7684\u95ee\u9898\u3002 \u63a8\u8350\u6307\u5b9a\u7248\u672c\u53f7\uff08youqu==2.0.0\uff09\u5b89\u88c5\uff0c\u5982\u679c\u4e0d\u6307\u5b9a\u7248\u672c\u53f7\u9ed8\u8ba4\u662f\u5b89\u88c5\u6700\u65b0\u53d1\u5e03\u7684 YouQu \u7248\u672c\uff0c\u4f60\u53ef\u4ee5\u5728 PyPI \u4e0a\u7684 Release history \u91cc\u9762\u67e5\u770b\u6709\u54ea\u4e9b\u7248\u672c\u3002 \u5b89\u88c5\u4e4b\u540e\u4f1a\u81ea\u52a8\u751f\u6210\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu-startproject\uff0c\u4f7f\u7528\u5b83\u53ef\u4ee5\u521d\u59cb\u5316\u5de5\u7a0b\uff0c\u8fd9\u91cc\u4ee5\u97f3\u4e50\u4e3e\u4f8b\uff1b youqu-startproject autotest_deepin_music\n \u8fd9\u6837\u5c31\u4f1a\u5728\u5f53\u524d\u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a autotest_deepin_music \u76ee\u5f55\uff0c\u91cc\u9762\u5305\u542b\u4e86\u57fa\u7840\u6846\u67b6\u6240\u6709\u7684\u4ee3\u7801\uff1b \u4e4b\u540e\uff0c\u8fd8\u662f\u5728 apps \u76ee\u5f55\u4e0b\uff0c\u653e\u5165\u5b50\u9879\u76ee\u7684AT\u4ee3\u7801\u5373\u53ef\uff0c\u4f7f\u7528\u65b9\u6cd5\u548c\u8fc7\u53bb\u4e00\u6837\uff0c\u8fd9\u91cc\u5c31\u4e0d\u591a\u4ecb\u7ecd\u3002 \u53e6\u5916\uff0c\u9664\u4e86\u901a\u8fc7 pip \u83b7\u53d6\u4ee5\u5916\uff0c\u4ecd\u7136\u53ef\u4ee5\u901a\u8fc7\u6e90\u7801\u83b7\u53d6\uff08\u76f4\u63a5 git clone\uff09\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u4f7f\u7528 pip \u5b89\u88c5 YouQu \u65f6\uff0cYouQu \u5305\u7684\u5927\u5c0f\u624d 600+ k\uff0c\u5b89\u88c5\u901f\u5ea6\u8d77\u98de\u3002 2\u3001\u65b0\u7684AT\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848 \u4e3a\u4e86\u89e3\u51b3\u4ee5\u4e0b\u95ee\u9898\uff1a \u8fc7\u53bb\u4e00\u6bb5\u65f6\u95f4\u54b1\u4eec\u7ecf\u5e38\u51fa\u73b0\u7684\uff0c\u4e0d\u540c\u7684AT\u9879\u76ee\u5728\u540c\u4e00\u53f0\u673a\u5668\u4e0a\u90e8\u7f72\u73af\u5883\u65f6\u4f9d\u8d56\u7248\u672c\u51b2\u7a81\u7684\u95ee\u9898\uff0c\u65b0\u65b9\u6848\u4e0d\u540c\u7684\u9879\u76ee\u4f1a\u52a8\u6001\u751f\u6210\u81ea\u5df1\u7684\u865a\u62df\u73af\u5883\uff0c\u76f8\u4e92\u4e4b\u95f4\u4e0d\u5f71\u54cd\uff1b \u4e1a\u5185\u4e3a\u4e86\u89e3\u51b3\u7248\u672c\u51b2\u7a81\u95ee\u9898\u4e00\u822c\u90fd\u4f1a\u4f7f\u7528Python\u865a\u62df\u73af\u5883\u7684\u5de5\u5177\uff0c\u4f46\u662f\u90fd\u6709\u4e2a\u95ee\u9898\uff0c\u65e0\u6cd5\u7ba1\u7406 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u5305\uff0c\u672c\u6b21\u6211\u4eec\u89e3\u51b3\u4e86\u8fd9\u4e2a\u95ee\u9898\uff0c\u80fd\u591f\u5b8c\u5168\u7ba1\u7406\u5e38\u89c4\u7684Python\u5305\uff0c\u4e5f\u80fd\u7ba1\u7406\u5230 deb \u5305\u5f62\u5f0f\u53d1\u5e03\u7684 Python \u4e09\u65b9\u5305\uff1b \u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u4f7f\u7528\u65b9\u6cd5\uff1a bash env.sh\n \u53ef\u4ee5\u770b\u51fa\u6765\u548c\u539f\u6765\u4f7f\u7528\u65b9\u6cd5\u6ca1\u6709\u53d8\u5316\uff0c\u4e5f\u5c31\u662f\u8bf4\u4ece\u4f7f\u7528\u7684\u89d2\u5ea6\u662f\u5b8c\u5168\u6ca1\u6709\u533a\u522b\u7684\uff0c\u53ea\u662f\u5185\u90e8\u505a\u4e86\u4e0d\u540c\u7684\u4e8b\u60c5\u3002 \u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u672c\u673a\u90e8\u7f72\u7684\u529f\u80fd\u4ecd\u7136\u4fdd\u7559 env_dev.sh\uff0c\u53ef\u4ee5\u4f5c\u4e3a\u5f00\u53d1\u65f6\u7684\u73af\u5883\u90e8\u7f72\u3002 3\u3001\u65b0\u7684\u9a71\u52a8\u547d\u4ee4 \u8fc7\u53bb\u54b1\u4eec\u90fd\u662f\u4f7f\u7528\u8fd9\u6837\u7684\u547d\u4ee4\u6765\u9a71\u52a8\u6267\u884c\uff1a python3 manage.py run\n \u7531\u4e8e\u9ed8\u8ba4\u57fa\u4e8e\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848\uff0c\u56e0\u6b64\u6211\u4eec\u589e\u52a0\u4e86\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu\uff1b \u65b0\u7684\u9a71\u52a8\u65b9\u5f0f\uff1a youqu manage.py run\n \u53ea\u9700\u8981\u628a python3 \u66ff\u6362\u6210 youqu \u5c31\u53ef\u4ee5\u4e86\uff0c\u770b\u8d77\u6765\u5f88\u548c\u8c10~ 4\u3001\u65b0\u7684\u6587\u6863\u5730\u5740 \u8fc7\u53bb\u54b1\u4eec YouQu \u7684\u5728\u7ebf\u6587\u6863\u662f\u90e8\u7f72\u5728\u516c\u53f8\u5185\u7f51\u7684\uff0c\u73b0\u5728\u5f00\u6e90\u5230 github \u4e86\uff0c\u5916\u90e8\u5f00\u53d1\u8005\u80af\u5b9a\u8bbf\u95ee\u4e0d\u5230\u5185\u7f51\u7684\u6587\u6863\uff0c\u56e0\u6b64\u9700\u8981\u5c06\u6587\u6863\u90e8\u7f72\u5230\u516c\u7f51\u3010\u516c\u7f51\u6587\u6863\u3011\uff1b \u516c\u7f51\u6587\u6863\u4f7f\u7528\u7684\u662f github pages\uff08\u767d\u5ad6\u602a\u4e00\u987f\u72c2\u559c~~\uff09\uff0c\u4f46\u53ef\u80fd\u4f1a\u51fa\u73b0\u6587\u6863\u901f\u5ea6\u6162\u7684\u95ee\u9898\uff08\u4ee3\u7406\u4e0b\u5c31\u597d\u4e86\uff09\uff0c\u4e0d\u8fc7\u6ca1\u5173\u7cfb\uff0c\u54b1\u4eec\u3010\u5185\u7f51\u6587\u6863\u3011\u4ecd\u7136\u4fdd\u7559\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u3002 5\u3001\u5176\u4ed6\u4e00\u4e9b\u5c0f\u5c0f\u529f\u80fd\u66f4\u65b0\uff1a \uff081\uff09\u65b0\u589e\u5173\u95ed\u5206\u8fa8\u7387\u68c0\u6d4b\u7684\u53c2\u6570\u503c\uff1b youqu manage.py run --resolution no\n \u6216\u8005\u4fee\u6539 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387, \u6bd4\u5982\uff1a1920x1080\n;no: \u8868\u793a\u4e0d\u505a\u5206\u8fa8\u7387\u6821\u9a8c\nRESOLUTION = 1920x1080\n resolution \u8fd9\u4e2a\u53c2\u6570\u4e00\u76f4\u90fd\u6709\u7684\uff0c\u53ea\u4e0d\u8fc7\u4e4b\u524d\u662f\u7528\u4e8e\u6307\u5b9a\u5206\u8fa8\u7387\u5927\u5c0f\uff0c\u6bd4\u5982 --resolution 1920x1080\uff0c\u4f46\u6709\u4e9b\u63a5\u53e3\u7684\u9879\u76ee\u4e0d\u9700\u8981\u8fd9\u4e2a\u68c0\u67e5\uff0c\u53ef\u4ee5\u7ed9\u5b83\u4e2a no \u5c31\u597d\u4e86\uff0c\u5f53\u7136 CICD \u4e0a\u5173\u95ed\uff0c\u9700\u8981\u6d41\u6c34\u7ebf\u4e0a\u628a\u8fd9\u4e2a\u53c2\u6570\u52a0\u4e0a\uff1b \uff082\uff09\u65b0\u589e\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u7684\u547d\u4ee4\u884c\u53c2\u6570 \u4e4b\u524d\u8fd9\u4e2a\u914d\u7f6e\u9879\u53ea\u80fd\u5728 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a ;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c 1 \u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff0cRERUN >= RECORD_FAILED_CASE\u3002\n;1.\u5173\u95ed\u5f55\u5c4f\uff1aRECORD_FAILED_CASE > RERUN\n;2.\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1aRECORD_FAILED_CASE = 0\nRECORD_FAILED_CASE = 1\n \u73b0\u5728\u5c06\u5f00\u53d1\u5230\u547d\u4ee4\u884c\u53c2\u6570\u3002 youqu manage.py run --record_failed_case 2\n fix \u4fee\u590d remote \u6267\u884c\u65f6\uff0c\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\u65e0\u6cd5\u751f\u6210\u6d4b\u8bd5\u62a5\u544a\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1302023710","title":"1.3.0\uff082023/7/10\uff09","text":"fix \u8fdb\u4e00\u6b65\u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b\u53c2\u8003\uff1a\u914d\u7f6ePython\u6e90\u7684\u51e0\u79cd\u65b9\u6cd5 \u4fee\u590d wayland_autotool \u53d7\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86wayland\u4e0b\u5076\u73b0\u627e\u4e0d\u5230 .Xauthority \u6587\u4ef6\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1292023626","title":"1.2.9\uff082023/6/26\uff09","text":"fix \u4f18\u5316\u8fdc\u7a0b\u6267\u884c remote \u7684\u53c2\u6570\u76f4\u63a5\u4f20\u7ed9\u8fdc\u7a0b\u673a\u5668\u7684 run \u547d\u4ee4\uff0c\u4e0d\u7528\u518d\u5355\u72ec\u5904\u7406\u8fdc\u7a0b\u6267\u884c\u7684\u53c2\u6570\u903b\u8f91\uff0c\u540e\u7eed\u4e13\u6ce8\u4e8e\u672c\u5730\u6267\u884c\u529f\u80fd\u5f00\u53d1\uff0c\u8fdc\u7a0b\u6267\u884c\u81ea\u52a8\u9002\u7528\uff1b env.sh \u79fb\u9664 pyyaml \u5b89\u88c5\uff0c\u7531\u5b50\u9879\u76ee\u5728 requirement.txt \u91cc\u9762\u5b9a\u4e49\uff0c\u6846\u67b6\u81ea\u52a8\u52a0\u8f7d\uff1b \u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b "},{"location":"RELEASE/#128202369","title":"1.2.8\uff082023/6/9\uff09","text":"fix \u4fee\u590d\u4e86 pypi \u5b89\u88c5 numpy \u5b58\u5728\u7cfb\u7edf\u5b89\u5168\u7ba1\u63a7\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#127202368","title":"1.2.7\uff082023/6/8\uff09","text":"fix env.sh \u4e2d\u5b89\u88c5 Python \u5305\u672a\u6307\u5b9a\u7248\u672c\u65f6\uff0c\u65e5\u5fd7\u8f93\u51fa\u5b89\u88c5\u7684\u7248\u672c\uff1b pdocr-rpc 2.0.1\nallure-custom 1.2.1\nfunnylog 1.1.3\n \u4fee\u590d -f \u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u62a5\u9519\u7684\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#126202367","title":"1.2.6\uff082023/6/7\uff09","text":"fix \u4fee\u590d wayland \u4e0a\u8c03\u7528\u9f20\u6807\u4e2d\u952e\u3001\u53f3\u952e\u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b \u4fee\u590d pubilic/dde_desktop_public_widget \u91cc\u9762\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u5b9a\u4f4d\u684c\u9762\u6587\u4ef6\u7684\u65b9\u6cd5\uff0c\u5750\u6807\u6ca1\u6709\u62c6\u5305\u7684\u95ee\u9898\uff1b \u4f18\u5316\u4e86\u7b49\u5f85\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b pycreeze \u7248\u672c\u5347\u7ea7\u5230 0.1.29\uff0c\u5bfc\u81f4\u4e0e pyautogui 0.9.53 \u4e0d\u517c\u5bb9\uff0cenv.sh \u91cc\u9762\u589e\u52a0\u6307\u5b9a pycreeze \u7248\u672c\u4e3a 0.1.28\uff1b "},{"location":"RELEASE/#1252023516","title":"1.2.5\uff082023/5/16\uff09","text":"new --app \u53c2\u6570\u540e\u9762\u65b0\u589e\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u76ee\u524d\u652f\u6301\u4e09\u79cd\u53c2\u6570\u4f20\u5165\u65b9\u5f0f\uff1a ~$: youqu run -a deepin-music\n~$: youqu run -a autotest_deepin_music\n~$: youqu run -a apps/autotest_deepin_music\n \u200b \u540e\u4e24\u79cd\u5165\u53c2\u65b9\u5f0f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\u3002 remote \u8fdc\u7a0b\u6267\u884c\u65b0\u589e\u4ece\u547d\u4ee4\u884c\u4f20\u5165\u6d4b\u8bd5\u673a\u4fe1\u606f\uff0c\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679c password \u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6 setting/remote.ini \u4e2d CLIENT_PASSWORD \u7684\u503c,\u6bd4\u5982\uff1auos@10.8.13.33:1 \u6216 uos@10.8.13.33 \uff1b python3 manage.py remote -c uos@10.8.13.33/uos@10.8.13.34\npython3 manage.py remote -c uos@10.8.13.33:1/uos@10.8.13.34:2\n fix \u65e5\u5fd7\u6a21\u5757\u4fee\u6539\u4e3a\u51fd\u6570\u6267\u884c\u4e4b\u524d\u6253\u5370\u65e5\u5fd7\uff1b \u65e5\u5fd7\u6a21\u5757\u589e\u52a0\u767d\u540d\u5355\uff0c\u901a\u8fc7\u7c7b\u540d\u5f00\u5934\uff0c\u7ed3\u675f\uff0c\u5305\u542b\u7b49\u5173\u952e\u5b57\u63a7\u5236\u9700\u8981\u6253\u5370\u7684\u51fd\u6570\u65e5\u5fd7\uff1b \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5982\u679c\u4f20\u5165\u4e86 app_name \u53ea\u4f1a\u5c06 apps \u76ee\u5f55\u4e0b app_name \u7684\u76ee\u5f55\u53d1\u9001\u5230\u6d4b\u8bd5\u673a\uff1b env.sh \u79fb\u9664 python3-dev\uff1b \u4fee\u590d Wayland \u4e0b env.sh \u73af\u5883\u5b89\u88c5\u5931\u8d25\u7684\u95ee\u9898\uff0c\u4f18\u5316\u4e86 deb \u4f9d\u8d56\u5b89\u88c5\u7684\u903b\u8f91\uff1b \u5c06 env.sh \u5237\u65b0\u6e90\u7684\u65e5\u5fd7\u5728\u7ec8\u7aef\u663e\u793a\uff0c\u89e3\u51b3\u5728 CI \u73af\u5883\u4e0b\uff0c\u957f\u65f6\u95f4\u4e0d\u8f93\u51fa\u65e5\u5fd7\u8fde\u63a5\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d1060 \u534e\u4e3a\u673a\u578b\u5b89\u88c5\u952e\u9f20\u5de5\u5177\u65f6\u4f9d\u8d56\u4e0d\u517c\u5bb9\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#1242023227","title":"1.2.4\uff082023/2/27\uff09","text":"fix \u4fee\u6539 CURRENT \u6587\u4ef6\uff1b "},{"location":"RELEASE/#1232023227","title":"1.2.3\uff082023/2/27\uff09","text":"new pylint.sh \u652f\u6301\u901a\u8fc7\u4f4d\u7f6e\u53c2\u6570\u4f20\u5165\u6587\u4ef6\u8def\u5f84\uff1abash pylint.sh apps/autotest_deepin_music,\u597d\u5904\u662f\u53c2\u6570\u8def\u5f84\u53ef\u4ee5\u5728\u7ec8\u7aef\u8865\u5168\uff1b \u65b0\u589e\u7cfb\u7edf\u547d\u4ee4 youqu-pylint \uff0c\u7528\u4e8e\u9759\u6001\u4ee3\u7801\u626b\u63cf\uff0c\u4f7f\u7528\u65b9\u6cd5: youqu-pylint apps/autotest_deepin_music\uff1b \u7531\u4e8e\u7cfb\u7edf\u4e00\u4e9b dbus \u63a5\u53e3\u6539\u53d8\uff0c\u516c\u5171\u5e93\u4e2d\u7684 dbus \u65b9\u6cd5\u5c06\u4e0d\u518d\u7ef4\u62a4\uff0c\u7531\u5b50\u9879\u76ee\u5728 other_widget.py \u91cc\u9762\u8fdb\u884c\u7ef4\u62a4\uff1b fix \u4fee\u590d ssh \u73af\u5883\u4e0b\u8fd0\u884c\u63d0\u793a \u201c\u65e0\u6cd5\u8fde\u63a5\u201d \u7684\u95ee\u9898\uff1b \u4fee\u590d\u8fd0\u884c\u65f6\u7a0b\u5e8f\u9000\u51fa\uff0c\u4e0d\u8f93\u51fa\u5f02\u5e38\u65e5\u5fd7\u7684\u95ee\u9898\uff1b \u4fee\u590dyouqu remote xxx \u8fdc\u7a0b\u6267\u884c\u65f6\uff0c\u5728\u670d\u52a1\u7aef Ctrl + C \u65e0\u6cd5\u505c\u6b62\u7a0b\u5e8f\u8fd0\u884c\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#122202328","title":"1.2.2\uff082023/2/8\uff09","text":"new \u65b0\u589e\u6c14\u6ce1\u7c7b\u56fe\u50cf\u8bc6\u522b\u65b9\u6848\uff1bimage_utils.py::ImageUtil::get_during\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u533a\u57df\u8bc6\u522b\uff0c\u4f20\u5165 [x, y, w, h]\uff0cx: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\uff1b \u56fe\u50cf\u8bc6\u522b\u65b0\u589e\u6307\u5b9a\u76ee\u6807\u56fe\u7247\uff0c\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\uff1b env.sh \u79fb\u9664 pypinyin; \u4f18\u5316\u6267\u884c env.sh \u65f6\u7684\u65e5\u5fd7\u8f93\u51fa\uff1b manage.py \u79fb\u9664\u4e86\u53c2\u6570 session_timeout \uff0c\u6846\u67b6\u6839\u636e\u5168\u5c40\u7684 timeout \u4ee5\u53ca\u7528\u4f8b\u81ea\u5b9a\u4e49\u7684 timeout \u81ea\u52a8\u8ba1\u7b97\u51fa sessiontimeout \u7684\u503c\uff1b \u65b0\u589e ocr \u670d\u52a1\u5668\u94fe\u63a5\u91cd\u8bd5\uff0c\u9ed8\u8ba4\u91cd\u8bd51\u6b21\uff0c\u652f\u6301\u52a8\u6001\u4f20\u5165\u53c2\u6570\uff1b fix \u4fee\u590d\u4e86\u4e00\u4e9b pylint \u626b\u63cf\u7684\u4ee3\u7801\u98ce\u683c\u95ee\u9898\uff1b \u91cd\u65b0\u8bbe\u8ba1\u4e86\u6d4b\u8bd5\u62a5\u544a\u4e3b\u9898\uff1b "},{"location":"RELEASE/#121202316","title":"1.2.1\uff082023/1/6\uff09","text":"new \u652f\u6301\u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6267\u884c\u7528\u4f8b\uff1b\u53ef\u5c06python3 manage.py \u66ff\u6362\u4e3a youqu \uff1a youqu run -a deepin-music -k 001\n RPC \u670d\u52a1 IP \u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u6307\u5b9a\u4e0d\u540c\u7684\u7aef\u53e3\uff1b \u5728\u7ebf\u6587\u6863\u5730\u5740\u4fee\u6539\u4e3a\u57df\u540d\uff1ahttp://youqu-dev.uniontech.com\uff0c\u539f\u6765\u7684\u5730\u5740 10.8.10.215 \u5c06\u4e0d\u5728\u4f7f\u7528\uff1b fix \u4fee\u590d --count \u53c2\u6570\u53ef\u80fd\u51fa\u73b0\u4e0e\u5176\u4ed6\u6846\u67b6\u7684\u5de5\u7a0b\u4f9d\u8d56\u5b58\u5728\u51b2\u7a81\uff0c\u62a5\u9519\u91cd\u590d\u6ce8\u518c\u7684\u95ee\u9898\uff1b \u4fee\u590d CI \u73af\u5883\u4e0b\u591a\u4e2a\u5de5\u7a0b\u5b58\u5728 Python \u73af\u5883\u53d8\u91cf\u6307\u5411\u9519\u8bef\uff0c\u5bfc\u5305\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u5355\u72ec\u8fd0\u884c\u65b9\u6cd5\u65f6\u65e0\u65e5\u5fd7\u8f93\u51fa\u7684 Bug\uff1b "},{"location":"RELEASE/#12020221230","title":"1.2.0\uff082022/12/30\uff09","text":"1.1.4 \u7248\u672c\u9002\u914d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e14\u65b0\u589e\u4e86\u8f83\u591a\u65b0\u7279\u6027\uff0c\u6211\u4eec\u8ba1\u5212\u4f7f\u7528 1.1.4 \u7248\u672c\u8fd0\u884c\u4e00\u6bb5\u65f6\u95f4\uff0c1.2.0 \u7248\u672c\u5c06\u4fee\u590d\u671f\u95f4\u51fa\u73b0\u7684 Bug\uff0c\u7136\u540e\u4f5c\u4e3a\u7a33\u5b9a\u7248\u672c\u53d1\u5e03\u3002 new \u4fee\u6539\u5de5\u7a0b\u540d\u79f0\u4e3a youqu\uff1b \u5c06 sphinx \u6587\u6863\u5de5\u7a0b\u8fc1\u79fb\u5230\u5355\u72ec\u7684\u4ed3\u5e93\uff1b fix \u4fee\u590d startapp \u521b\u5efa\u5de5\u7a0b\u65f6\u5b58\u5728\u5de5\u7a0b\u540d\u79f0\u65f6\u65e0\u6cd5\u7ee7\u7eed\u521b\u5efa\uff1b \u4fee\u590d\u4e86 OCR \u670d\u52a1\u5728\u5e76\u53d1\u65f6\u53ef\u80fd\u51fa\u73b0\u65e0\u6cd5\u8fd4\u56de\u7ed3\u679c\u7684\u95ee\u9898\uff0c\u63d0\u5347 OCR \u670d\u52a1\u9ad8\u5e76\u53d1\u7a33\u5b9a\u6027\uff1b \u4fee\u590d PMS \u540c\u6b65\u6807\u7b7e\u5230 CSV \u6587\u4ef6\u4e0d\u652f\u6301\u7528\u4f8b\u5e93\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11420221214","title":"1.1.4\uff082022/12/14\uff09","text":"new \u65b0\u589e startapp \u5b50\u547d\u4ee4\u521b\u5efa\u5b50\u9879\u76ee\u5de5\u7a0b\u6a21\u677f: python3 manage.py startapp autotest_deepin_xxx \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u91cd\u590d\u6267\u884c\u6b21\u6570\uff1b \u53bb\u6389\u6279\u91cf\u6267\u884c\u524d\u6536\u96c6\u7528\u4f8b\u7684\u6b65\u9aa4\uff1b \u589e\u52a0\u5f00\u59cb\u6267\u884c\u65f6\u6253\u5370\u4e00\u4e9b\u6267\u884c\u53c2\u6570\uff0c\u5982\uff1a \u7528\u4f8b\u6536\u96c6\u6570\u91cf: 99\n\u5931\u8d25\u91cd\u8dd1\u6b21\u6570: 1\n\u6700\u5927\u5931\u8d25\u6b21\u6570: 49\n\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4: 200.0s (03\u520620\u79d2)\n\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4: 11880s (3\u5c0f\u65f618\u52060\u79d2)\n \u5b9a\u5236\u4fee\u6539allure\u62a5\u544alogo\u3001title\u3001\u9ed8\u8ba4\u8bed\u8a00\uff1b manage.py \u6267\u884c\u5f00\u59cb\u65f6\u6253\u5370 logo \u548c\u5f53\u524d\u7248\u672c\uff1a \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u255a\u2588\u2588\u2557 \u2588\u2588\u2554\u255d \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2584\u2584 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2580\u2580\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u2584\u2588 \u2584\u2588 \u2588 \u2588 \u2588 \u2584 \u2588 \u2584 \u2580\u2580\u2588 \u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\uff1b \u88c5\u9970\u5668\u65b9\u6cd5\u6307\u5b9a\u6b21\u6570\uff1b @pytest.mark.count(2)\ndef test_music_001():\npass\n \u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u6b21\u6570\uff1b python3 manage.py run -a deepin-music -k 001 --count 2\n \u200b image_utils \u589e\u52a0\u51fd\u6570 save_temporary_picture\uff0c\u652f\u6301\u6307\u5b9a\u5c4f\u5e55\u533a\u57df\u622a\u56fe\u5e76\u8fd4\u56de\u56fe\u7247\u5b58\u653e\u7684\u672c\u5730\u8def\u5f84\uff0c\u540e\u7eed\u4f7f\u7528 assert_image_exist \u8fdb\u884c\u65ad\u8a00 Python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(x, y, width, height) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) button_center \u65b0\u589e btn_size \u83b7\u53d6\u63a7\u4ef6\u5de6\u4e0a\u89d2\u5750\u6807\u53ca\u957f\u5bbd\uff0c\u7528\u4e8e\u52a8\u6001\u7684\u622a\u53d6\u5143\u7d20\u7684\u56fe\u7247\uff0c\u53ef\u7528\u4e8e\u5b9a\u4f4d\u65ad\u8a00 python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u6240\u6709\u97f3\u4e50\u6309\u94ae\")) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path) allure \u62a5\u544a\u4e2d\u5b9a\u4f4d\u95ee\u9898\u9664\u4e86\u65e5\u5fd7\u3001\u622a\u56fe\u3001\u5f55\u5c4f\u5916\uff0c\u8c03\u7528\u7684\u51fd\u6570\u589e\u52a0\u4e86 step \u6b65\u9aa4\u5c55\u793a\uff1b env.sh \u65b0\u589e\u5b89\u88c5\u5b50\u9879\u76ee Python \u4e09\u65b9\u4f9d\u8d56\uff0c\u5728\u5b50\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u5199 requirement.txt \u6587\u4ef6\uff0cenv.sh \u4f1a\u81ea\u52a8\u52a0\u8f7d\uff1b ocr \u8bc6\u522b\u65b0\u589e\u652f\u6301\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\u8fdb\u884c\u6587\u5b57\u8bc6\u522b\uff0c\u51cf\u5c11\u56e0\u5168\u5c4f\u8bc6\u522b\u65f6\uff0c\u5176\u4ed6\u6587\u5b57\u7684\u5e72\u6270 Python # \u65ad\u8a00\u97f3\u4e50\u7684\u5220\u9664\u5f39\u7a97\u4e2d\uff0c\u5305\u542b\u4e86\u201c\u786e\u8ba4\u201d\u7684\u6587\u5b57 self.assert_ocr_exist(\"\u786e\u8ba4\", picture_abspath=DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u5220\u9664\u5f39\u7a97\"))) \u65ad\u8a00\u51fd\u6570\u7684\u8c03\u7528\u4e5f\u4f1a\u81ea\u52a8\u6253\u5370\u65e5\u5fd7; env.sh \u65b0\u589e\u88c1\u526a\u4f9d\u8d56\u7684\u65b9\u6848\uff1b fix \u4fee\u590d Jenkins \u73af\u5883\u4e0b\uff0c apps \u76ee\u5f55\u4e0b\u5b50\u9879\u76ee\u5b58\u5728 auotest_deepin_xxx@tmp \u76ee\u5f55\uff0c\u5728\u4f20\u5165 app_name \u540e\u65e0\u6cd5\u6267\u884c\u7528\u4f8b\u7684\u95ee\u9898\uff1b \u4fee\u590d\u81ea\u52a8\u751f\u6210 case_list.csv \u6587\u4ef6\u65f6\uff0c\u7528\u4f8b\u987a\u5e8f\u88ab\u8c03\u6574\u7684\u95ee\u9898\uff1b env.sh \u73af\u5883\u5b89\u88c5\u79fb\u9664 git \u548c curl\uff1b \u4fee\u590d\u7528\u4f8b\u5728 setup \u9636\u6bb5\u62a5\u9519\u540e\uff0c\u672a\u5199\u5165 ci_result.json \u7684\u95ee\u9898\uff1b \u79fb\u9664 uos_ci.py\uff1b "},{"location":"RELEASE/#11320221028","title":"1.1.3\uff082022/10/28\uff09","text":"new \u65b0\u589e\u56fe\u50cf\u65ad\u8a00\u6210\u529f\u8f93\u51fa\u5339\u914d\u5ea6\uff1b \u65b0\u589e\u73af\u5883\u5b89\u88c5 yaml \u4f9d\u8d56\uff1b \u65b0\u589e\u6d4b\u8bd5\u5957\u6267\u884c\u3001\u6570\u636e\u56de\u586b\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b \u65b0\u589e\u6d4b\u8bd5\u7ed3\u679c\u8868\u60c5\u663e\u793a\uff0c\u5e76\u4f18\u5316\u4e86\u65e5\u5fd7\u7684\u6392\u7248\uff1b \u65b0\u589e --top {number} \u7528\u4e8e\u8bb0\u5f55\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0c\u65e5\u5fd7\u751f\u6210\u5230 report/logs/top.log\uff1b fix \u4fee\u590d\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4f46\u7ec8\u7aef\u6ca1\u6709\u9519\u8bef\u65e5\u5fd7\u8f93\u51fa\u7684\u95ee\u9898\uff1b \u4fee\u6539\u5931\u8d25\u7528\u4f8b\u56de\u6eaf\u65e5\u5fd7\u4e3a\u8be6\u7ec6\u7ea7\u522b\uff1b \u4fee\u590d\u4e86\u6267\u884c\u8fdb\u5ea6\u672a\u8ba1\u7b97\u8df3\u8fc7\u7528\u4f8b\u7684\u95ee\u9898\uff0c\u5e76\u4f18\u5316\u4e86\u8fdb\u5ea6\u83b7\u53d6\u7684\u7b97\u6cd5\uff1b \u4fee\u590d env.sh \u5728 V23 \u73af\u5883\u4e0b\u5b89\u88c5\u65e0\u6cd5\u8bfb\u53d6\u5bc6\u7801\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 pms \u6d4b\u8bd5\u5957\u6267\u884c\u6216\u6d4b\u8bd5\u5355\u6267\u884c\u65f6\uff0c\u7528\u4f8bID\u517c\u5bb9\u7528\u4f8b\u5e93ID\u548c\u4ea7\u54c1\u5e93ID\uff1b env.sh \u91cc\u9762 hub.deepin.com \u66f4\u6362\u6210 it.uniontech.com\uff1b uos_ci.py \u6d4b\u8bd5\u7ed3\u679c\u7edf\u8ba1\u65f6\uff0c\u603b\u6570\u5254\u9664 skip \u7684\u6570\u91cf "},{"location":"RELEASE/#11220220921","title":"1.1.2\uff082022/09/21\uff09","text":"new \u5728\u6ca1\u6709\u5b89\u88c5 dogtail \u7684\u60c5\u51b5\u4e0b\uff0c\u4e5f\u80fd\u4f7f\u7528 sniff \u5de5\u5177\uff1b fix \u4fee\u590d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e2d\u6ca1\u6709\u5b89\u88c5 AT \u73af\u5883\u6267\u884c uos_ci.py \u62a5\u9519\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11120220919","title":"1.1.1\uff082022/09/19\uff09","text":"new \u65b0\u589e\u6267\u884c\u8fdb\u5ea6\u663e\u793a\uff0c\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u65f6\u65e5\u5fd7\u8f93\u51fa\u5f53\u524d\u8fdb\u5ea6\uff1a[\u5f53\u524d\u6307\u5b9a\u7b2c\u51e0\u6761/\u7528\u4f8b\u603b\u6570]\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u7528\u4f8b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\u6240\u6709\u5931\u8d25\u7528\u4f8b\u7684\u5217\u8868\uff1b \u5173\u95ed\u7ec8\u7aef\u8f93\u51fa\u6355\u83b7\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u65e5\u5fd7\u5feb\u7167\uff1b \u4f18\u5316\u7ec8\u7aef\u8f93\u51fa\u5931\u8d25\u4fe1\u606f\u5197\u957f\u4e3a\u7b80\u8981\u4fe1\u606f\u8f93\u51fa\uff1b \u65b0\u589e\u7ec8\u7aef\u8f93\u51fa\u663e\u793a 10 \u4e2a\u6267\u884c\u6700\u6162\u7684\u7528\u4f8b\u5217\u8868\uff0c\u5e76\u8be6\u7ec6\u5217\u51fa\u5404\u4e2a\u9636\u6bb5\u7684\u8017\u65f6\uff1b \u5931\u8d25\u91cd\u8dd1\u7528\u4f8b\u91cd\u8dd1\u4e4b\u524d\u5ef6\u8fdf 1 \u79d2\uff1b \u65b0\u589e\u6536\u96c6\u9636\u6bb5\u62a5\u9519\uff0c\u4ecd\u7136\u5f3a\u5236\u6267\u884c\uff1b \u7528\u4f8b\u6536\u96c6\u65f6\u4ec5\u5728 apps \u76ee\u5f55\u4e0b\u8fdb\u884c\uff0c\u5ffd\u7565 src,setting,public \u76ee\u5f55\uff1b \u65b0\u589e allure \u62a5\u544a\u5907\u4efd\u529f\u80fd\uff0c\u9ed8\u8ba4\u5907\u4efd\u81f3 allure_back \u76ee\u5f55\u4e0b\uff1b manage.py\u65b0\u589e\u53c2\u6570 --lastfailed \u7528\u4e8e\u53ea\u8dd1\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\u7684\u529f\u80fd\uff1b fix \u4fee\u590d\u4e86\u5728\u6ca1\u6709\u6307\u5b9a\u5e94\u7528\u540d\u79f0\u6267\u884c\u65f6\uff0cxml \u62a5\u544a\u751f\u6210\u8def\u5f84\u5f02\u5e38\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 uos_ci.py \u4f20\u5165 timeout \u548c session_timeout \u4e0d\u751f\u6548\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#11020220916","title":"1.1.0\uff082022/09/16\uff09","text":"new \u65b0\u589ePMS\u6570\u636e\u56de\u586b\u529f\u80fd\uff0c\u652f\u6301\u591a\u79cd\u6570\u636e\u56de\u586b\u6a21\u5f0f\uff1b \u4f18\u5316\u4e86\u901a\u8fc7\u6d4b\u8bd5\u5957\u4ef6\u6267\u884c\u65f6PMS \u722c\u866b\u7684\u6027\u80fd\uff1b \u65b0\u589e .gitmodules \u6587\u4ef6\uff0c\u7528\u4e8e\u6807\u8bb0\u6240\u6709\u5b50\u9879\u76ee\uff0c\u65b9\u4fbf\u7edf\u4e00\u62c9\u53d6\u4ee3\u7801\uff1b env.sh \u9002\u914d\u793e\u533a\u7248\u4e0a\u5b89\u88c5\u81ea\u52a8\u5316\u73af\u5883\uff1b \u589e\u52a0\u6267\u884c\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u9519\u8bef\u7684\u529f\u80fd\uff1b README.md \u589e\u52a0 Wayland \u4e0b\u4f7f\u7528\u3001\u6d4b\u8bd5\u62a5\u544a\u67e5\u770b\u3001\u5e38\u89c1\u95ee\u9898\u7b49\u7684\u6587\u6863\u8bf4\u660e\uff1b \u589e\u52a0\u4e86\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u5bf9 setup\u3001call\u3001teardown \u8fdb\u884c\u65e5\u5fd7\u5206\u6bb5\uff1b fix \u4fee\u590d\u4e86 \u786e\u8ba4\u4fee\u590d \u5217\u6ca1\u5199\u8868\u5934\uff0c\u4f46\u5199\u4e86 fixed-xxx \u6807\u7b7e\uff0c\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u540c\u4e00\u5e94\u7528\u5185\u591a\u4e2a csv \u6587\u4ef6\u4e2d \u786e\u8ba4\u4fee\u590d \u5217\u6709\u7684\u5199\u4e86\uff0c\u6709\u7684\u6ca1\u5199\uff0c\u53ef\u80fd\u51fa\u73b0\u7684\u7a0b\u5e8f\u62a5\u9519\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86 INFO \u65e5\u5fd7\uff0c\u663e\u793a\u4e3a DEBUG \u7684\u95ee\u9898\uff1b\u4fee\u590d\u4e86\u90e8\u5206\u673a\u5668\u4e0a INFO \u65e5\u5fd7\u5185\u5bb9\u663e\u793a\u4e3a\u7ea2\u8272\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u62a5\u9519\u770b\u4e0d\u5230\u8be6\u7ec6\u4fe1\u606f\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10220220822","title":"1.0.2\uff082022/08/22\uff09","text":"new \u79fb\u9664 loguru\uff0c\u66ff\u6362\u4e3a logging\uff0c\u63a5\u53e3\u4fdd\u6301\u4e0d\u53d8\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u53d7\u5f71\u54cd\uff1b \u9ed8\u8ba4\u5f00\u542f coredump\uff1b fix \u4fee\u590d\u4e86\u4e09\u65b9\u5e93 loguru \u5076\u73b0\u5f02\u5e38\uff0c\u5bfc\u81f4\u7a0b\u5e8f\u4e2d\u65ad\u7684\u95ee\u9898\uff1b \u4fee\u590d\u4e86\u7b2c\u4e00\u6b21\u5931\u8d25\u4e0d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\u7684\u95ee\u9898\uff1b "},{"location":"RELEASE/#10120220812","title":"1.0.1\uff082022/08/12\uff09","text":"new \u65b0\u589e RELEASE.md \u6587\u4ef6\uff0c\u7528\u4e8e\u8bb0\u5f55\u5386\u53f2\u53d1\u5e03\u7248\u672c\u7684\u66f4\u65b0\u5185\u5bb9\uff1b \u517c\u5bb9 Wayland \u6a21\u5f0f\u4e0b\u6267\u884c\u7528\u4f8b\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u7528\u7ba1\u5f53\u524d\u6d4b\u8bd5\u673a\u6267\u884c\u73af\u5883\uff0c\u6846\u67b6\u4f1a\u81ea\u52a8\u6839\u636e\u5f53\u524d\u73af\u5883\u8d70\u4e0d\u540c\u7684\u4ee3\u7801\u903b\u8f91\uff1b \u7531\u4e8e\u9700\u8981\u4fee\u6539 dogtail \u6e90\u4ee3\u7801\uff0c\u56e0\u6b64\u5c06\u4fee\u6539\u540e\u7684\u6e90\u7801\u653e\u5165\u5230\u6838\u5fc3\u5e93\u91cc\u9762 src/depends/dogtail \u540e\u7eed\u7248\u672c\u5c06\u4e0d\u9700\u8981\u5728\u7cfb\u7edf\u4e2d\u5b89\u88c5dogtail\uff1b \u5982\u679c\u5e94\u7528\u5e93\u540c\u6837\u4f7f\u7528\u4e86\u7cfb\u7edf\u5b89\u88c5\u7684 dogtail \u53ef\u80fd\u4f1a\u62a5\u9519\uff0c\u89e3\u51b3\u65b9\u6848\u662f\u5c06\u4ee3\u7801\u4e2d\u7684 import dogtail \u4fee\u6539\u4e3a from src.depends import dogtail ; fix \u91cd\u8dd1\u5931\u8d25\u4e4b\u540e\u624d\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff0c\u4fee\u6539\u4e3a\u5931\u8d25\u4e4b\u540e\u4f1a\u5173\u95ed\u6587\u4ef6\u9009\u62e9\u6846\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u529f\u80fd\u6d4b\u8bd5","text":"# Attribution \uff1achengdu Test Team\n# Date \uff1a2021/08/20\n \u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d \u4ed3\u5e93\u5730\u5740\uff1ahttps://gitlabcd.uniontech.com/autotest/cd-desktop-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u65b9\u6848\u6982\u8ff0","text":"\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u667a\u80fd\u8bc6\u522b\u5e94\u7528\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u7528\u4e8e\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u64cd\u4f5c\u8fc7\u7a0b\u4e2d\u7684\u5143\u7d20\u5b9a\u4f4d\u4ee5\u53ca\u5224\u65ad\u7ed3\u679c\u65f6\u7684\u65ad\u8a00\u5904\u7406\uff1b\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\uff0c\u6d4b\u8bd5\u673a\u4e0a\u7684\u753b\u9762\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u5230\u670d\u52a1\u5668\u4e0a\uff0c\u670d\u52a1\u5668\u5bf9\u89c6\u9891\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\u540e\uff0c\u670d\u52a1\u5668\u667a\u80fd\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\u6210\u529f\uff0c\u7136\u540e\u5bf9\u6d4b\u8bd5\u673a\u4e0b\u53d1\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\uff0c\u6d4b\u8bd5\u673a\u63a5\u53d7\u5e76\u6267\u884c\u4e0b\u4e00\u6b65\u64cd\u4f5c\u3002 \u670d\u52a1\u5668\u4e0e\u6d4b\u8bd5\u673a\u4e4b\u95f4\u7684\u94fe\u63a5\uff1a \u670d\u52a1\u5668\u901a\u8fc7 USB \u4e32\u53e3\u8bbe\u5907\uff08USB-HID \u534f\u8bae\uff09\u6a21\u62df\u9f20\u6807\u952e\u76d8\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u64cd\u4f5c\u3002 \u901a\u8fc7\u89c6\u9891\u91c7\u96c6\u8bbe\u5907\u6355\u83b7\u6d4b\u8bd5\u673a\u7684\u5b9e\u65f6\u753b\u9762\u4f20\u8f93\u7ed9\u670d\u52a1\u5668\u3002 \u670d\u52a1\u5668\u5bf9\u91c7\u96c6\u7684\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\uff0c\u8bc6\u522b\u5176\u4e2d\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5e76\u8fd4\u56de\u5143\u7d20\u63a7\u4ef6\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\uff0c\u670d\u52a1\u5668\u901a\u8fc7\u667a\u80fd\u5316\u5206\u6790\uff0c\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e00\u81f4\u5c06\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\u901a\u8fc7\u4e32\u53e3\u6a21\u62df\u952e\u9f20\u4fe1\u53f7\u53d1\u9001\u7ed9\u6d4b\u8bd5\u673a\uff1b\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e0d\u4e00\u81f4\u5c06\u4f1a\u8fdb\u5165\u4e2d\u65ad\u5904\u7406\u53ca\u5f02\u5e38\u7ed3\u679c\u8f93\u51fa\uff0c\u7ee7\u7eed\u6267\u884c\u540e\u7eed\u573a\u666f\uff0c\u76f4\u81f3\u6240\u6709\u7528\u4f8b\u6d4b\u8bd5\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u6df1\u5ea6\u5b66\u4e60\u73af\u5883\u642d\u5efa","text":"\u6a21\u578b\u8bad\u7ec3\u4e3b\u8981\u5bf9 GPU \u6709\u8981\u6c42\uff0c\u8bad\u7ec3\u6a21\u578b\u7684\u673a\u5668\u663e\u5b58\u4e0d\u4f4e\u4e8e 6G\uff0c\u5176\u4ed6\u914d\u7f6e\u65e0\u7279\u6b8a\u8981\u6c42\u3002 \u63a8\u8350\u6027\u4ef7\u6bd4\u8f83\u9ad8\u914d\u7f6e \u64cd\u4f5c\u7cfb\u7edf: UnionTech OS Desktop 20 Professional Linux version 4.19.0-desktop-amd64 (deepin@deepin-PC) (Uos 8.3.0.3-3+rebuild) \u5904\u7406\u5668: Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz (\u516b\u6838 / \u5341\u516d\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460M-HDV(RD)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))/8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: TU116 [GeForce GTX 1660]\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u865a\u62df\u73af\u5883\u5b89\u88c5","text":"cd ~\nwget -c https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh\nbash Miniconda3-latest-Linux-x86_64.sh\n \u4e00\u8def\u56de\u8f66 \u7b2c\u4e00\u6b21\u63d0\u793a\u8f93\u5165 yes/no \uff1a\u8f93\u5165 yes \u7ee7\u7eed\u4e00\u8def\u56de\u8f66 \u7b2c\u4e8c\u6b21\u63d0\u793a\uff1a\u8f93\u5165 no cd ~/miniconda3/bin\nsudo chmod 777 activate\n \u6fc0\u6d3bconda\u73af\u5883 . ./activate\n \u6dfb\u52a0\u516c\u53f8\u5185\u7f51\u6e90 conda config --add channels bioconda\nconda config --add channels conda-forge\n \u5982\u679c\u662f\u5916\u7f51\u6dfb\u52a0\u5916\u7f51\u6e90 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/\n \u5982\u679c\u8981\u5220\u9664\u6e90 conda config --remove-key channels\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"2\u3001\u5b89\u88c5\u4f9d\u8d56","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u521b\u5efa\u865a\u62df\u73af\u5883","text":"conda remove --name mmlab --all # \u79fb\u9664\u6240\u6709\u865a\u62df\u73af\u5883\n conda create -n mmlab python=3.7\n conda activate mmlab\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-pytorch","title":"\uff082\uff09\u5b89\u88c5 Pytorch","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install torch==1.7.0+cu101 torchvision==0.8.1+cu101 torchaudio==0.7.0 -f https://download.pytorch.org/whl/torch_stable.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-mmcv","title":"\uff083\uff09\u5b89\u88c5 MMCV","text":"\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c pip install mmcv-full==1.3.3 -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.7.0/index.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"\uff084\uff09\u5b89\u88c5\u663e\u5361\u9a71\u52a8","text":"\u6839\u636e\u4f60\u7684\u663e\u5361\u4e0b\u8f7d\u5bf9\u5e94\u9a71\u52a8\uff0c\u6bd4\u5982\u6211\u7684\u663e\u5361\u4e3a GTX1660\uff0c\u9a71\u52a8\u7248\u672c\u4e3a 430\uff0c\u9a71\u52a8\u4e0b\u8f7d\u5730\u5740\uff1ahttps://www.nvidia.cn/Download/Find.aspx?lang=cn CTRL+ALT+F2 \u8fdb\u5165tty\n \u7981\u7528 nouveau \u9a71\u52a8 sudo vim /etc/modprobe.d/blacklist-nouveau.conf\n \u586b\u5165\uff1a blacklist nouveau options nouveau modeset=0\n \u5237\u65b0\u914d\u7f6e\u6587\u4ef6 sudo update-initramfs -u reboot \u91cd\u542f\u540e\u518d\u8fdb\u5165 tty \u5173\u95ed\u56fe\u50cf\u754c\u9762\uff0c\u8f93\u5165\u547d\u4ee4\u5173\u95ed\u56fe\u50cf\u754c\u9762 sudo service lightdm stop\n \u5b89\u88c5\u9a71\u52a8 sudo chmod a+x NVIDIA-Linux-x86_64-430.run\nsudo ./NVIDIA-Linux-x86_64-430.run\n reboot\u91cd\u542f\uff0cnvidia-smi\u67e5\u770b\u5b89\u88c5\u72b6\u6001\u3002\u6ce8\u610f\u770b\u4e0bcuda\u7248\u672c\uff0c10.1\uff0cdriver\u7248\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u6570\u636e\u6807\u6ce8","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u6570\u636e\u6807\u6ce8","text":"\u6807\u6ce8\u4e4b\u524d\u9700\u8981\u5148\u8f6c\u6362\u56fe\u7247\u5927\u5c0f\uff0c\u5e76\u4e14\u4ee5\u6570\u5b57\u547d\u540d\uff0c\u6bcf\u7ec4\u547d\u540d\u9012\u589e"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"\uff081\uff09\u8f6c\u6362\u5927\u5c0f\u5e76\u91cd\u547d\u540d","text":"rename_pic.py import os\nimport sys\nimport cv2\nimport time\nimport getpass\nusername = getpass.getuser()\nsource_path = f\"/home/{username}/Desktop/right_menu\" # \u56fe\u7247\u8def\u5f84\nsource_dest = os.path.join('/'.join(source_path.split(\"/\")[:-1]), 'tmp')\nif not os.path.exists(source_dest):\nos.mkdir(source_dest)\nstart_name = sys.argv[1]\nfile_name_list = list()\nfor file in os.listdir(source_path):\nif file.endswith('.png'):\nfile_name_list.append(file)\nstart_name = int(start_name)\nfor file in file_name_list:\nos.rename(os.path.join(source_path,file), os.path.join(source_path, f\"{str(start_name)}.png\"))\nstart_name += 1\ntime.sleep(1)\nfor file in os.listdir(source_path):\nimage = os.path.join(source_path, str(file))\nsrc = cv2.imread(image)\nresult = cv2.resize(src, (960, 540))\nresizeImage = os.path.join(source_dest, str(file))\nprint(resizeImage)\ncv2.imwrite(str(resizeImage), result)\ncv2.waitKey(0)\ncv2.destroyAllWindows()\ntime.sleep(1)\nos.system(f'rm -rf {source_path}/*')\nos.system(f'mv {source_dest}/* {source_path}')\nos.system(f'rm -rf {source_dest}')\nprint(\"\u4e0b\u4e00\u4e2a\u5e8f\u53f7\uff1a\", start_name)\n \u6839\u636e\u7ec8\u7aef\u8f93\u51fa\u7684\u4e0b\u4e00\u4e2a\u5e8f\u53f7\u7684\u63d0\u793a\uff0c\u6267\u884c Python \u6587\u4ef6\u7684\u65f6\u5019\u4f20\u53c2\u3002 python rename_pic.py 249\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"\uff082\uff09\u5de5\u5177\u6807\u6ce8","text":"\u4f7f\u7528\u5de5\u5177 labelImg \u6807\u6ce8 sudo pip3 install PyQt5==5.13\nsudo pip3 install labelImg\n \u7ec8\u7aef\u76f4\u63a5\u8f93\u5165 labelImg\uff0c\u56de\u8f66 \u6807\u6ce8\u6a21\u5f0f\u9009\u62e9\uff1aPascalVOC"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u667a\u80fd\u6807\u6ce8","text":"\u6253\u5f00\u5c4f\u5e55\u5f55\u5236\u8f6f\u4ef6\uff0c\u5f55\u5236\u624b\u52a8\u64cd\u4f5c\u4e00\u6b21\u6d4b\u8bd5\u7528\u4f8b\uff0c\u7136\u540e\u5c06\u5f55\u5236\u7684\u89c6\u9891\u8fdb\u884c\u5206\u5e27\uff0c\u7136\u540e\u5bf9\u6bd4\u524d\u4e24\u5e27\u56fe\u6807\u76f8\u4f3c\u5ea6\uff0c\u5254\u9664\u76f8\u4f3c\u5ea6\u8fc7\u9ad8\u7684\u56fe\u7247\uff0c\u5728\u4fdd\u8bc1\u7d20\u6750\u591a\u6837\u6027\u7684\u524d\u63d0\u4e0b\uff0c\u5254\u9664\u91cd\u590d\u591a\u4f59\u7684\u56fe\u7247\u751f\u6210\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u96c6\uff0c\u7136\u540e\u53d6\u51fa\u63a7\u4ef6\u6a21\u677f\u6570\u636e\u96c6\uff0c\u901a\u8fc7 OpenCV \u6a21\u677f\u5339\u914d\u83b7\u53d6\u63a7\u4ef6\u5728\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u56fe\u7247\u4e2d\u6240\u5728\u7684\u5de6\u4e0a\u3001\u5de6\u4e0b\u3001\u53f3\u4e0a\u3001\u53f3\u4e0b\u56db\u5904\u5750\u6807\uff0c\u4ece\u800c\u6839\u636e\u6a21\u677f\u6570\u636e\u96c6\u751f\u6210\u6807\u6ce8\u6570\u636e\u3002\u53c2\u8003\u76ee\u5f55 AnnotationMaterial"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"\uff081\uff09\u6a21\u677f\u6570\u636e\u96c6\u51c6\u5907","text":"1\u3001\u5728\u754c\u9762\u622a\u53d6\u9700\u8981\u6807\u6ce8\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u653e\u5728\u76ee\u5f55\u4e0b AnnotationMaterial/template/img 2\u3001\u7ef4\u62a4\u63a7\u4ef6\u540d\u4e0e\u5143\u7d20\u63a7\u4ef6\u7684\u952e\u5bf9\uff0c\u4e00\u4e2a\u63a7\u4ef6\u540d\u53ef\u5bf9\u5e94\u591a\u4e2a\u5143\u7d20\u63a7\u4ef6 menu:\n- menu.jpg\n- menu1.jpg\n- menu2.jpg\n- menu3.jpg\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"\uff082\uff09\u7d20\u6750\u96c6\u51c6\u5907","text":"\u5f55\u5236\u89c6\u9891\u6216\u6216\u5c4f\u5e55\u622a\u56fe\u653e\u7f6e\u76ee\u5f55 AnnotationMaterial/source"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u5f00\u59cb\u6807\u6ce8","text":"python3 AnnotationMaterial/main.py\n \u751f\u6210\u7684\u6807\u6ce8\u6570\u636e\u5b58\u653e\u5728 AnnotationMaterial/result"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#mmdetection","title":"\u56db\u3001MMDetection","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1-mmdetection","title":"1\u3001 MMDetection \u4ee3\u7801","text":"MMDetection \u662f\u4e00\u4e2a\u6709\u540d\u7684\u6df1\u5ea6\u5b66\u4e60\u76ee\u6807\u68c0\u6d4b\u5f00\u6e90\u9879\u76ee\uff0c\u4e5f\u662f openMMlab \u7684\u62db\u724c\u9879\u76ee\uff0c\u4e3a\u4ec0\u4e48\u9009\u62e9\u5b83\uff0c\u5c0f\u5b69\u513f\u6ca1\u5a18\u8bf4\u6765\u8bdd\u957f\uff0c\u611f\u5174\u8da3\u53ef\u4ee5\u81ea\u884c\u6df1\u5165\u4e86\u89e3\uff1b \u4f60\u53ef\u4ee5\u76f4\u63a5\u5728 GitHub \u4e0a\u514b\u9686\u4ee3\u7801\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u54b1\u4eec\u4ed3\u5e93\u4e0b Train \u76ee\u5f55\u4e2d\u4ee3\u7801\uff0cTrain \u4e2d\u7684\u4ee3\u7801\u4e5f\u662f\u4ece GitHub \u4e0a\u62c9\u53d6\u7684\uff0c\u4e0d\u8fc7\u6211\u4eec\u6839\u636e\u9879\u76ee\u9700\u8981\u505a\u4e86\u4e00\u4e9b\u4e8c\u6b21\u5f00\u53d1\uff0c\u63a8\u8350\u76f4\u63a5\u4f7f\u7528\u5b83\u3002 \u5982\u679c\u4f60\u60f3\u4ece GitHub \u4e0a\u62c9\uff1a git clone https://github.com/open-mmlab/mmdetection.git\n# \u4e0d\u80fd\u76f4\u63a5\u62c9\u53d6\u4e3b\u5206\u652f\uff0c\u5efa\u8bae\u4f7f\u75282.12\u7248\u672c\uff0c\u4e0d\u540c\u7684\u7248\u672c\u5bf9\u5e94\u7684mmcv\u7248\u672c\u662f\u4e0d\u540c\u7684\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2-voc2coco","title":"2\u3001\u62c9\u53d6 voc2coco \u4ee3\u7801","text":"git clone https://github.com/Tony607/voc2coco.git\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3-coco","title":"3\u3001\u8f6c\u6362 coco \u6570\u636e\u96c6","text":"\u5c06\u6240\u6709\u7684\u56fe\u7247\u548cxml\u6587\u4ef6\u653e\u5165train2017\uff0c\u4ece\u4e2d\u6311\u9009\u51e0\u7ec4\u653e\u5165val2017\uff08\u6d4b\u8bd5\u96c6\uff09 cd mmdetection/data/coco\npython voc2coco.py train2017 annotations/instances_train2017.json\npython voc2coco.py val2017 annotations/instances_val2017.json\n \u751f\u6210json\u6587\u4ef6"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#4_1","title":"4\u3001\u4fee\u6539\u914d\u7f6e","text":"\uff081\uff09\u8bfb\u53d6\u6a21\u578b\u540d\u79f0 import json\nmodule_name = []\nwith open('./instances_train2017.json', \"r+\") as f:\njson_file = f.read()\njson_dict = json.loads(json_file)\nmodule_list = json_dict.get('categories')\nfor module_info in module_list:\nname = module_info.get('name')\nmodule_name.append(name)\nprint(module_name)\nprint(\"module_num:\", len(module_name))\n # \u6ce8\u610f\u5bf9\u6bd4instances_train2017.json\u91cc\u9762\u6a21\u578b\u540d\u79f0\u7684\u987a\u5e8f\uff0c\u4e0eCLASSES\u548ccoco_classes\u91cc\u9762\u7684\u987a\u5e8f\u4fdd\u6301\u4e00\u81f4\u3002\n \uff082\uff09\u4fee\u6539 faster_rcnn_r101_2x_coco.py mmdetection/xianjin/faster_rcnn_r101_2x_coco.py \u4fee\u653946\u884c\uff0cnum_clasess\u7684\u503c\uff0c\u65b0\u589e1\u4e2a\uff0c\u5c31 +1\uff1b \uff083\uff09\u4fee\u6539 coco.py mmdetection/mmdet/datasets/coco.py CLASSES = ()\uff0c\u5728\u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b \uff084\uff09\u4fee\u6539 class_names.py mmdetection/mmdet/core/evaluation/class_names.py coco_classes \u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#5","title":"5\u3001\u7f13\u5b58\u6e05\u7406","text":"\u5220\u9664 mmdetection/build \u76ee\u5f55 python setup.py install\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#6","title":"6\u3001\u8bad\u7ec3\u6a21\u578b","text":"\uff081\uff09\u6307\u5b9a\u81ea\u5df1\u914d\u7f6e\u7684\u8bad\u7ec3\u6a21\u578b\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py --gpus 1\n \uff082\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u6d4b\u8bd5\u96c6\u7ed3\u679c\uff1b python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py xianjin/epoch_24.pth --show\n \uff083\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u51c6\u786e\u5ea6\uff1b python tools/analysis_tools/analyze_logs.py plot_curve xianjin/20210530_011907.log.json --keys acc\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#7","title":"7\u3001\u5feb\u6377\u64cd\u4f5c","text":"python3 run.py\n \u5c06\u4ee5\u4e0a 4 - 7 \u6b65\u64cd\u4f5c\u6574\u5408\u6210 run.py\uff0c\u4e00\u952e\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u4e94\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\uff1b \u670d\u52a1\u7aef\u4e00\u53f0\uff08\u76ee\u524d\u4ec5\u652f\u6301AMD\u67b6\u6784\uff09\uff1b \u91c7\u96c6\u76d2\u4e00\u4e2a \uff08ACASIS hdmi\u89c6\u9891\u91c7\u96c6\u5361\uff0chttps://item.jd.com/10024310742602.html \uff09\uff1b USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\uff1b USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff1b \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5USB\u5ef6\u957f\u7ebf\uff1b \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\uff1b "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u63a8\u8350\u914d\u7f6e","text":"\u6267\u884c\u7528\u4f8b\u7684\u670d\u52a1\u7aef\u5bf9\u914d\u7f6e\u6ca1\u6709\u7279\u6b8a\u8981\u6c42\uff0c\u5982\u679c\u6761\u4ef6\u5141\u8bb8\u914d\u7f6e\u8d8a\u9ad8\uff0c\u8bc6\u522b\u901f\u5ea6\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n \u6d4b\u8bd5\u673a\u4e0a\u4e0d\u6267\u884c\u4efb\u4f55\u811a\u672c\uff0c\u5177\u4f53\u914d\u7f6e\u6839\u636e\u6d4b\u8bd5\u9700\u8981\u51b3\u5b9a\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#usb_mk","title":"\u516d\u3001USB_MK\u4e32\u53e3\u9a71\u52a8\u65b9\u6cd5","text":"\u4f4d\u4e8econtrol_method\u76ee\u5f55\u4e0b\u7684usb_mk.py\u6587\u4ef6 \uff081\uff09\u5217\u51fa\u53ef\u901a\u4fe1\u7684\u7aef\u53e3 python3 -m serial.tools.list_ports -v\n \uff082\uff09\u4fee\u6539\u4e32\u53e3\u7684\u6743\u9650 sudo chmod 777 /dev/ttyACM0\n \uff083\uff09\u5b9e\u4f8b\u5316USB_MK import UsbMk\nusb_mk = UsbMk(\"/dev/ttyACM0\", 9600) # \u8bbe\u5907\u9ed8\u8ba49600\u4e3a\u6ce2\u7279\u7387\uff0c\u63a7\u5236\u4f20\u8f93\u901f\u7387\n \uff084\uff09USB\u4e32\u53e3\u8bbe\u5907\u9ed8\u8ba4\u6ce2\u7279\u7387\u4e3a9600\uff08\u7ecf\u6d4b\u8bd5\u6ce2\u7279\u73879600\u51c6\u786e\u6027\u6700\u597d\uff09\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up() # \u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u6c49\u5b57\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e\n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff083\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff084\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n \uff085\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() # \u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2\n \uff086\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff087\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff088\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e03\u3001\u65b9\u6cd5\u8c03\u7528\u5165\u53c2\u89c4\u5219","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#1_7","title":"1\u3001\u57fa\u7c7b","text":"class Base:\ndef __init__(self):\nself._obj = image\nself._usb = usb_mk\ndef find_element_by_ai(self, element):\nreturn self._obj.find_element(element)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#2_6","title":"2\u3001\u5165\u53c2\u8bf4\u660e","text":"\u56fe\u50cf\u8bc6\u522b\u65b9\u6cd5\u5165\u53e3\u4e3a Base \u7c7b\u4e0b\u7684 find_element_by_ai \u3002\u4ec5\u63a5\u53d7\u4e00\u4e2a\u53c2\u6570 element\uff0c\u7c7b\u578b\u4e3a string\u3002 \u53ef\u8bc6\u522b\u7684 string \u683c\u5f0f\uff1a \uff081\uff09\u5927\u56fe\u6807\uff08 \u56fe\u6807\u5927\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\uff0c\u4f8b\uff1a Base().find_element_by_ai(\"window\")\n \uff082\uff09\u5927\u56fe\u6807 / \u5c0f\u56fe\u6807\uff08\u56fe\u6807\u5c0f\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5c0f\u56fe\u6807\uff0c\u4f8b\uff1awindow/search_btn Base().find_element_by_ai(\"window/search_btn\")\n \uff083\uff09\u5927\u56fe\u6807 / OCR\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\u5185\u7684\u6587\u5b57\uff0c\u4f8b\uff1amenu/\u5c5e\u6027 Base().find_element_by_ai(\"menu/\u5c5e\u6027\")\n \uff084\uff09OCR\uff1a\u5168\u5c4f\u8bc6\u522b\u6587\u5b57 Base().find_element_by_ai(\"\u641c\u7d22\")\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516b\u3001\u9690\u85cf\u9f20\u6807","text":"\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u8fc7\u6765\u7684\u89c6\u9891\u6d41\uff0c\u5728\u8bc6\u522b\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u53d7\u5230\u9f20\u6807\u5f71\u54cd\uff0c\u56e0\u6b64\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u9690\u85cf\u9f20\u6807\u3002 \u5c4f\u853d\u9f20\u6807\u5149\u6807\u663e\u793a ```shell script /etc/lightdm/lightdm.conf \u5728`[Seat:*]`\u4e0b\u9762\u6dfb\u52a0\u53c2\u6570\n```shell script\nxserver-command=X -bs -core -nocursor\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E5%8A%9F%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e5d\u3001\u667a\u80fd\u81ea\u52a8\u5316\u7684\u610f\u4e49","text":"1\u3001\u6539\u5584 Acessibility \u5b9a\u4f4d\u7684\u7a33\u5b9a\u6027\u95ee\u9898 Acessibility \u5c5e\u6027\u5b9a\u4f4d\u5b58\u5728\u5076\u5c14\u5931\u6548\u7684\u60c5\u51b5 \uff081\uff09\u5f00\u53d1\u5728\u505a\u65b0\u9700\u6c42\u5f00\u53d1\u65f6\u53ef\u80fd\u6d89\u53ca\u5230\u5bf9\u5c5e\u6027\u6807\u7b7e\u7684\u4fee\u6539\u6216\u8005\u5c42\u7ea7\u7684\u8c03\u6574\uff0c\u53ef\u80fd\u9020\u6210\u81ea\u52a8\u5316\u7528\u4f8b\u65e0\u6cd5\u5b9a\u4f4d\u5230\u5143\u7d20\u3002 \u6bd4\u59821040\u9636\u6bb5\uff0c\u97f3\u4e50\u91cd\u6784\u7684\u65f6\u5019\uff0c\u5f00\u53d1\u5bf9\u90e8\u5206\u5c5e\u6027\u548c\u5c42\u7ea7\u505a\u4e86\u4fee\u6539\uff0c\u5bfc\u81f4\u81ea\u52a8\u5316\u7528\u4f8b\u5b9a\u4f4d\u65b9\u6cd580%\u9700\u8981\u4fee\u6539\u3002 \u5f00\u53d1\u65b0\u529f\u80fd\u7684\u65f6\u5019\u5076\u5c14\u4e5f\u4f1a\u5bf9\u5c5e\u6027\u505a\u8c03\u6574\uff0c\u9047\u52305\u6b21\u3002 \uff082\uff09\u76ee\u524d\u4e3b\u8981\u4f7f\u7528Dogtail\u8bc6\u522b\u5e94\u7528Acessibility\u5c5e\u6027\u8fdb\u884c\u5b9a\u4f4d\uff0c\u662f\u83b7\u53d6\u5e94\u7528\u5f53\u524d\u754c\u9762\u7684\u5c5e\u6027tree\uff0c\u5728\u5e94\u7528\u8df3\u8f6c\u540e\uff0cDogtail\u5b58\u5728\u65e0\u6cd5\u53ca\u65f6\u83b7\u53d6\u5f53\u524d\u5c5e\u6027\u5217\u8868\u7684\u60c5\u51b5\u3002 \u591a\u5a92\u4f53\u8c03\u7528\u6587\u7ba1\u7a97\u53e3\u7684\u65f6\u5019\uff0c\u51fa\u73b0\u627e\u4e0d\u5230\u6587\u7ba1\u91cc\u9762\u5143\u7d20\u7684\u60c5\u51b5\uff0c\u76ee\u524d\u51fa\u73b010+\u6b21\u3002 \u5e94\u7528\u8bbe\u7f6e\u9875\u9762\u7684\u5c5e\u6027\u5076\u5c14\u5b58\u5728\u627e\u4e0d\u5230\u7684\u60c5\u51b5\uff0c\u9047\u52305\u6b21\u3002 \uff083\uff09Dogtail\u5de5\u5177\u672c\u8eab\u5b58\u5728\u95ee\u9898\uff0c\u6709\u65f6\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u5019\u5f88\u6162\uff0c\u8ba9\u4eba\u65e0\u6cd5\u63a5\u53d7\uff0c\u76ee\u524d\u51fa\u73b0\u8fc7\u5f88\u591a\u6b21\u3002 \u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u95f4\u6bd4\u5e73\u5e38\u61623\u500d\uff0c\u51fa\u73b04\u6b21\u3002 2\u3001\u89e3\u51b3\u4e86\u4f7f\u7528\u7edd\u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898 \u90e8\u5206\u63a7\u4ef6\u65e0\u6cd5\u6dfb\u52a0 Acessibility \u5c5e\u6027\u4ece\u800c\u4f7f\u7528\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u51fa\u73b0\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898\u3002 \uff081\uff09\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u65b9\u6cd5\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u76ee\u6807\u56fe\u7247\u8d44\u6e90\uff0c\u5728 UI \u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u4f1a\u6d89\u53ca\u5230\u76ee\u6807\u8d44\u6e90\u7684\u66ff\u6362\uff0c\u6bd4\u8f83\u8017\u8d39\u4eba\u529b\u3002 \uff082\uff09\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6cd5\u5bf9\u6bd4\u7cbe\u5ea6\u6bd4\u8f83\u641e\uff0c\u5982\u679cUI \u7684\u53d8\u66f4\u4f1a\u9020\u6210\u65e0\u6cd5\u51c6\u786e\u5b9a\u4f4d\u5230\uff0c\u81ea\u52a8\u5316\u811a\u672c\u5065\u58ee\u6027\u4e0d\u8db3\u3002 3\u3001\u4f7f\u7528\u673a\u5668\u5206\u79bb\uff0c\u89e3\u51b3\u4e86\u81ea\u52a8\u5316\u811a\u672c\u5bf9\u5e94\u7528\u7684\u5f71\u54cd\uff0c\u771f\u5b9e\u8fd8\u539f\u7528\u6237\u7684\u4f7f\u7528\u573a\u666f \u673a\u5668\u5206\u79bb\u7684\u67b6\u6784\u8bbe\u8ba1\uff0c\u4fdd\u8bc1\u4e86\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u73af\u5883\u5b8c\u5168\u7b49\u540c\u4e8e\u7528\u6237\uff0c\u6392\u9664\u6d4b\u8bd5\u811a\u672c\u7684\u5f71\u54cd\u3002 \uff081\uff09\u76ee\u524d\u7684\u529f\u80fd\u81ea\u52a8\u5316\u662f\u5728\u6d4b\u8bd5\u673a\u4e0a\u76f4\u63a5\u8fd0\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\uff0c\u52a0\u4e0a\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u6211\u4eec\u6dfb\u52a0\u4e86\u4e00\u4e9b\u8fdb\u7a0b\u76d1\u63a7\u3001\u89c6\u9891\u5f55\u5236\u7b49\u529f\u80fd\uff0c\u81ea\u52a8\u5316\u811a\u672c\u672c\u8eab\u4f1a\u6d88\u8017\u4e00\u4e9b\u7cfb\u7edf\u8d44\u6e90\uff0c\u65e0\u6cd5\u8fd8\u539f\u771f\u662f\u7684\u7528\u6237\u4f7f\u7528\u573a\u666f\u3002 \uff082\uff09\u6027\u80fd\u6d4b\u8bd5\u9700\u8981\u6392\u9664\u5176\u4ed6\u7a0b\u5e8f\u7684\u8d44\u6e90\u6d88\u8017\u5f71\u54cd\uff0c\u6027\u80fd\u81ea\u52a8\u5316\u91c7\u7528\u673a\u5668\u5206\u79bb\uff0c\u4fdd\u8bc1\u4e86\u6027\u80fd\u6570\u636e\u7684\u51c6\u786e\u6027\u3002 \u4ee5\u524d\u7684\u7528\u4f8b\u6267\u884c\u8017\u65f6\u6ca1\u6761\u572830\u79d2\u5de6\u53f3\uff0c\u73b0\u5728\u7528\u4f8b\u8017\u65f6\u572810\u79d2\u3002 4\u3001\u89e3\u51b3\u4e86UI \u8c03\u6574\u5bfc\u81f4\u5b9a\u4f4d\u5931\u8d25\u7684\u4e0d\u7a33\u5b9a\u6027\u95ee\u9898 \uff081\uff09\u89e3\u51b3\u4e86\u56e0 UI \u8c03\u6574\u5bfc\u81f4\u63a7\u4ef6\u4f4d\u7f6e\u53d8\u5316\u6216\u8272\u5dee\u53d8\u5316\u540e\u5b9a\u4f4d\u4e0d\u51c6\u786e\u7684\u95ee\u9898\uff0c\u53ea\u8981\u63a7\u4ef6\u6587\u6848\u548c\u63a7\u4ef6\u5916\u8fb9\u6846\u65e0\u53d8\u5316\u5747\u53ef\u51c6\u786e\u5b9a\u4f4d\uff1b \uff082\uff09\u76ee\u524d\u4e5f\u4f1a\u91c7\u7528\u57fa\u4e8eUI\u7684\u5b9a\u4f4d\u65b9\u6848\uff0c\u5982\u679cUI\u4f4d\u7f6e\u6709\u8c03\u6574\uff0c\u4f1a\u5bfc\u81f4\u5143\u7d20\u65e0\u6cd5\u5b9a\u4f4d\u3002 5\u3001\u7b80\u5316\u4e86\u7528\u4f8b\u7ed3\u6784\uff0c\u63d0\u5347\u7f16\u5199\u53cb\u597d\u5ea6 \uff081\uff09\u667a\u80fd\u81ea\u52a8\u5316\u8bc6\u522b\u5143\u7d20\u7684\u65b9\u6cd5\u53ea\u6709\u4e00\u4e2a\uff0c\u5c31\u662f\u57fa\u4e8e\u6211\u4eec\u8bad\u7ec3\u7684\u6a21\u578b\u8bc6\u522b\u89c6\u9891\u6d41\u4e2d\u7684\u5143\u7d20\uff0c\u7ecf\u8fc7\u811a\u672c\u5c01\u88c5\u4e4b\u540e\uff0c\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u4e2d\u6240\u6709\u5b9a\u4f4d\u7684\u64cd\u4f5c\u90fd\u53ea\u9700\u8981\u8c03\u7528\u8fd9\u4e00\u4e2a\u65b9\u6cd5\u5c31\u884c\u4e86\uff0c\u7f16\u5199\u81ea\u52a8\u5316\u811a\u672c\u7684\u96be\u5ea6\u5927\u5927\u964d\u4f4e\u3002 \uff082\uff09\u4e5f\u662f\u7531\u4e8e\u8c03\u7528\u65b9\u6cd5\u7b80\u5355\uff0c\u5728 UI \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u4e2d\u7684\u5206\u5c42\u7ed3\u6784\u5c06\u4f1a\u51cf\u5c11\uff0c\u591a\u7ee7\u627f\u7684\u60c5\u51b5\u4f1a\u51cf\u5c11\uff0c\u81ea\u52a8\u5316\u4ee3\u7801\u7684\u8c03\u7528\u7ed3\u6784\u4e5f\u4f1a\u53d8\u5f97\u7b80\u5355\uff0c\u800c\u4e14\u529f\u80fd\u6d4b\u8bd5\u540c\u5b66\u7f16\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u66f4\u52a0\u5bb9\u6613\u4e0a\u624b\u3002 \u4ee5\u524d\u5199\u7528\u4f8b\u7531\u4e8e\u9700\u8981\u7ed3\u5408\u4e0d\u540c\u7684\u6a21\u5757\uff0c\u8c03\u7528\u4e0d\u540c\u7684\u65b9\u6cd5\uff0c\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u5e76\u5b8c\u6210\u8c03\u8bd5\u7684\u65f6\u95f4\u5e73\u5747\u572820-30\u5206\u949f\uff0c\u73b0\u5728\u5199\u7528\u4f8b\u811a\u672c\u80fd\u57285\u5206\u949f\u5de6\u53f3\u5b8c\u6210\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_1","title":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5","text":"# =============================================\n# Attribution : Application Test Department III\n# Time : 2023/1/3\n# Author : ut003281\n# =============================================\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_2","title":"\u4e00\u3001\u7b80\u8ff0","text":"\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5 \u901a\u8fc7\u81ea\u52a8\u5316\u624b\u6bb5\u5bf9\u5e94\u7528\u8fdb\u884c\u6027\u80fd\u6d4b\u8bd5\uff0c\u63d0\u4f9b\u65b9\u4fbf\u7684\u73af\u5883\u90e8\u7f72\u3001\u8fd0\u884c\u914d\u7f6e\u3001\u7528\u4f8b\u7f16\u5199\u7b49\uff0c\u7528\u4e8e\u684c\u9762\u5e94\u7528\u7684\u51b7\u70ed\u542f\u52a8\u3001\u8d44\u6e90\u62f7\u8d1d\u3001\u9875\u9762\u8df3\u8f6c\u7b49\u6027\u80fd\u573a\u666f\u6d4b\u8bd5\u3002 \u4ed3\u5e93\u5730\u5740\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-perf-aitest"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_3","title":"\u4e8c\u3001\u4ee3\u7801\u7ed3\u6784","text":"autotest-perf-aitest\n\u251c\u2500\u2500 apps # \u5b58\u653e\u6240\u6709\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u811a\u672c\n\u251c\u2500\u2500 conftest.py # pytest hook\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 CURRENT # \u7248\u672c\u5185\u5bb9\n\u251c\u2500\u2500 docs # \u6587\u6863\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u952e\u503c\u5bf9\u7167\u8868.pdf # \u4e32\u53e3\u7ebfcode\u4e0e\u6309\u952e\u7684\u5bf9\u7167\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u6027\u80fd\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\u6267\u884c\u5668\u4f7f\u7528\u6307\u5357.md # \u6267\u884c\u5668\u811a\u672c\u4f7f\u7528\u6307\u5357\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 USB\u4e32\u53e3\u8f6cUSB\u952e\u76d8\u9f20\u6807\u7ebf\u534f\u8bae\u6587\u4ef6V1.0.pdf # \u4e32\u53e3\u534f\u8bae\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput-0.28.2.zip # Linux\u4e0b\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\u7684\u6e90\u7801\uff0c\u53ef\u6839\u636e\u67b6\u6784\u6253\u5305\n\u251c\u2500\u2500 manage.py # \u529f\u80fd\u4e3b\u5165\u53e3\n\u251c\u2500\u2500 pytest.ini # pytst \u914d\u7f6e\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 setting # \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 client.ini # \u6d4b\u8bd5\u673a IP \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5168\u5c40\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dev_env.sh # \u5bbf\u4e3b\u673a\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose_no_relay.yml # \u65e0\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose.yml # \u6709\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker_login.sh # docker \u767b\u9646\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 res\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 black.png # \u5168\u9ed1\u56fe\u7247\uff0c\u7528\u4e8e\u4fee\u6539\u58c1\u7eb8\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_5000.deb # 3A5000 \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_amd64.deb # amd \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_arm64.deb # arm \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_mips64.deb # mips \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_sw_64.deb # sw \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 server.ini # \u670d\u52a1\u5668\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 setup.sh # \u5bb9\u5668\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 template # \u521b\u5efa app \u57fa\u7840\u811a\u672c\u6a21\u677f\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 app_template\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ${app_name}_widget.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 control-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 images\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 test_${app_name}_01_scene.json-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 test_${app_name}_01_scene.py-tpl\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 uos_docker # \u5bb9\u5668\u73af\u5883\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dockerfile\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 requirements.txt\n\u2514\u2500\u2500 src\n \u251c\u2500\u2500 analysis_save.py # \u89e3\u6790\u56fe\u7247\u6d41\u7ed3\u679c\uff0c\u6c47\u603b\u751f\u6210 excel \u62a5\u544a\n\u251c\u2500\u2500 base_widget.py # \u5c01\u88c5\u7684\u57fa\u7840\u64cd\u4f5c\uff0c\u5e94\u7528\u8c03\u7528\u7684\u4e3b\u5165\u53e3\u65b9\u6cd5\n\u251c\u2500\u2500 cmdctl.py # \u8c03\u7528\u547d\u4ee4\u884c\u4f7f\u7528\n\u251c\u2500\u2500 global_value.py # \u5168\u5c40\u53d8\u91cf\n\u251c\u2500\u2500 image_utils.py # \u56fe\u7247\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 __init__.py\n \u251c\u2500\u2500 logger_utils.py # \u65e5\u5fd7\u914d\u7f6e\n\u251c\u2500\u2500 pdocr.py # ocr \u914d\u7f6e\n\u251c\u2500\u2500 public_method.py # \u4e00\u4e9b\u65b9\u4fbf\u7684\u5c01\u4f4f\n\u251c\u2500\u2500 record.py # \u5f55\u5c4f\u76f8\u5173\n\u251c\u2500\u2500 rtk # \u8fd0\u884c\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 _base.py # \u4e00\u4e9b\u679a\u4e3e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 install_env.py # \u5b89\u88c5\u73af\u5883\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 local_runner.py # \u8fd0\u884c\u7528\u4f8b\n\u251c\u2500\u2500 serial_communication # \u4e32\u53e3\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 power_control.py # \u7ee7\u7535\u5668\u64cd\u4f5c\uff0c\u4f7f\u7528\u7ee7\u7535\u5668\u8fde\u63a5\u4e3b\u673a\u7535\u6e90\uff0c\u63a7\u5236\u5f00\u5173\u673a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 serial_common.py # \u4e32\u53e3\u516c\u5171\u65b9\u6cd5\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 usb_mk.py # \u952e\u9f20\u64cd\u4f5c\u57fa\u7840\u5c01\u88c5\n\u251c\u2500\u2500 shortcut_key.py # \u5feb\u6377\u952e\u7684\u5c01\u88c5\n\u251c\u2500\u2500 singleton.py # \u5355\u4f8b\u6a21\u5f0f\n\u251c\u2500\u2500 start_app.py # \u521b\u5efa app\n\u2514\u2500\u2500 write_xlsx.py # \u751f\u6210 excel\n# __init__.py \u6587\u4ef6\u4e3a\u6807\u8bc6\u8be5\u76ee\u5f55\u662f\u4e00\u4e2aPython\u7684\u6a21\u5757\u5305\uff0c\u9879\u76ee\u4e2d\u7684__init__.py\u5747\u4e3a\u7a7a\u6587\u4ef6\u3002\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_4","title":"\u4e09\u3001\u73af\u5883\u642d\u5efa","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1","title":"1\u3001\u786c\u4ef6\u73af\u5883","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_1","title":"\uff081\uff09\u8bbe\u5907\u6e05\u5355","text":" \u6d4b\u8bd5\u673a\u81f3\u5c11\u4e00\u53f0\u3002 \u670d\u52a1\u7aef\u4e00\u53f0\u3002\uff08\u4ec5\u652f\u6301 AMD \u67b6\u6784\uff0c\u82e5\u9700\u5176\u4ed6\u67b6\u6784\uff0c\u54a8\u8be2\u76f8\u5173\u5f00\u53d1\u4eba\u5458\uff09 \u91c7\u96c6\u76d2\u4e00\u4e2a\u3002 \uff08ACASIS HDMI \u89c6\u9891\u91c7\u96c6\u76d2\uff0chttps://item.jd.com/100013302599.html#crumb-wrap \uff09 USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebf\u3002\uff08\u4f18\u80dc\u7535\u5b50\u79d1\u6280USB\u4e32\u53e3\u8f6cUSB\u952e\u9f20\u534f\u8bae\u7ebfB\u7c7b\uff0chttps://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-1385258877.57.7ea037891D6nKh&id=611894882981 \uff09 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2","title":"\uff082\uff09\u786c\u4ef6\u73af\u5883\u642d\u5efa","text":" \u91c7\u96c6\u76d2\uff0cHDMI \u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c USB \u7aef\u8fde\u63a5\u5230\u670d\u52a1\u5668\u4e0a\u3002 USB \u4e32\u53e3\u7ebf\uff0c\u767d\u8272\u7aef\u8fde\u63a5\u670d\u52a1\u5668\uff0c\u9ed1\u8272\u7aef\u8fde\u63a5\u6d4b\u8bd5\u673a\uff08USB3.0 \u63a5\u53e3\u4e0a\uff09\u3002 \u5982\u679c\u9700\u8981\u53ef\u4ee5\u63a5 USB \u5ef6\u957f\u7ebf\u3002 \u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u4e0d\u63a5\u663e\u793a\u5668\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3","title":"\uff083\uff09\u670d\u52a1\u7aef\u63a8\u8350\u914d\u7f6e","text":"\u914d\u7f6e\u8d8a\u9ad8\uff0c\u89e3\u6790\u901f\u5ea6\u8d8a\u5feb\u3002 \u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_1","title":"2\u3001\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa","text":" \u6253\u5f00\u63a7\u5236\u4e2d\u5fc3\uff0c\u8d26\u6237\u8bbe\u7f6e\u4e3a\u3010\u81ea\u52a8\u767b\u5f55\u3011\u548c\u3010\u65e0\u5bc6\u7801\u767b\u5f55\u3011\uff0c\u7535\u6e90\u7ba1\u7406\u4e2d\u4f7f\u7528\u7535\u6e90\u5168\u90e8\u8bbe\u7f6e\u4e3a\u3010\u4ece\u4e0d\u3011\uff0c\u5f00\u542f\u5f00\u53d1\u8005\u6a21\u5f0f\u3002 \u6839\u636e\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u8981\u6c42\uff0c\u5bfc\u5165\u76f8\u5173\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\uff1a\u5bfc\u5165\u76f8\u518c\u3001\u5f71\u9662\u3001\u97f3\u4e50\u7684\u6d4b\u8bd5\u8d44\u6e90\u3002 \u5728\u670d\u52a1\u7aef\u6253\u5f00\u76f8\u673a\u5e94\u7528\u540e\uff0c\u5c06\u6d4b\u8bd5\u673a\u684c\u9762\u58c1\u7eb8\u66f4\u6362\u4e3a\u7eaf\u8272\u58c1\u7eb8\uff08\u6ce8\u610f\uff0c\u670d\u52a1\u7aef\u9700\u63d0\u524d\u5f00\u542f\u76f8\u673a\u540e\u518d\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u58c1\u7eb8\uff0c\u5efa\u8bae\u7eaf\u9ed1\u58c1\u7eb8 setting/res/black.png\uff09 \u5728\u6587\u4ef6\u7ba1\u7406\u5668\u4e2d\uff0c\u5c06\u9009\u9879 \u4e3b\u83dc\u5355-\u8bbe\u7f6e-\u9884\u89c8-\u56fe\u7247\u9884\u89c8 \u53d6\u6d88\u52fe\u9009\uff08\u5982\u4e0d\u53d6\u6d88\uff0c\u4f1a\u5f71\u54cd\u622a\u56fe\u5f55\u5c4f\u5e94\u7528\u7684\u6027\u80fd\u6570\u636e\uff09 \u79fb\u52a8\u6216\u5220\u9664\u7cfb\u7edf Logo \uff0c\u6392\u9664\u684c\u9762\u53f3\u4e0b\u89d2 Logo \u7684\u5f71\u54cd\uff08\u91cd\u542f\u751f\u6548\uff09\u3002 sudo mv /usr/share/deepin/uos_logo.svg ~/Pictures/\n \u5b89\u88c5\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\uff08\u5fc5\u987b\u5b89\u88c5\uff01\uff01\uff09 AMD \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_amd64.deb ARM \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_arm64.deb MIPS \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_mips64.deb 3A5000 \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_5000.deb \u5b89\u88c5\u547d\u4ee4 sudo dkpg -i xserver-xorg-input-libinput_0.28.2-2_amd64.deb\n \u5b89\u88c5\u65f6\u4f1a\u63d0\u793a\u5df2\u5b58\u5728\u76f8\u540c\u7248\u672c\uff0c\u8bf7\u5ffd\u7565\uff0c\u76f4\u63a5\u8986\u76d6\u5b89\u88c5\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u4e3b\u673a\u624d\u751f\u6548"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_1","title":"3\u3001\u670d\u52a1\u7aef\u4e00\u952e\u73af\u5883\u90e8\u7f72","text":"\u73af\u5883\u642d\u5efa\u524d\u5fc5\u987b\u5148\u8fde\u63a5\u4e0a USB \u4e32\u53e3\u7ebf\u548c\u91c7\u96c6\u76d2\u3002 \u5bbf\u4e3b\u673a\u73af\u5883\u5b89\u88c5 python3 manage.py install --env host\n \u5bb9\u5668\u73af\u5883\u5b89\u88c5 python3 manage.py install --env docker\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_5","title":"\u56db\u3001\u914d\u7f6e\u9879","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_2","title":"1\u3001\u670d\u52a1\u7aef\u914d\u7f6e","text":"setting/config/server.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u914d\u7f6e\u9879\uff0c\u5305\u542b\u4e86\u6240\u6709\u670d\u52a1\u7aef\u6240\u6709\u7684\u53ef\u914d\u7f6e\u9879\u3002 \u672c\u5730\u65e0\u7f51\u7edc\u8fd0\u884c \u5c06\u914d\u7f6e\u9879 network=0 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u672c\u5730\u6709\u7f51\u7edc\u8fd0\u884c \u914d\u7f6e\u9879 network=1 (1)\u914d\u7f6e\u9879 client_alias= \u914d\u7f6e\u4e3a\u4f60\u8981\u6d4b\u8bd5\u7684\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5982 Alias1 \u6d4b\u8bd5\u673a\u522b\u540d\u5728 setting/config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 (2)\u914d\u7f6e\u9879 client_alias= \u4e3a\u7a7a\uff0c\u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6b64\u65f6\uff0c\u76f4\u63a5\u8fd0\u884c python3 manager --client_alias Alias1\uff0c\u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002(Alias1 \u4e3a\u4f60\u914d\u7f6e\u7684\u6d4b\u8bd5\u673a\u522b\u540d) (1)\u548c(2)\u53ea\u8981\u4f7f\u7528\u5176\u4e00\u5373\u53ef\u3002 \u6709\u7f51\u7edc\u8fd0\u884c\uff0c\u4e14\u9700\u8981\u901a\u8fc7 Jenkins \u4e0a\u8fd0\u884c\u4e00\u4e2a job \uff0c\u540c\u65f6\u63a7\u5236\u591a\u53f0\u673a\u5668\u3002 \u914d\u7f6e\u9879 network=1 \u914d\u7f6e\u9879 client_alias= \u4e0d\u7528\u914d\u7f6e\uff0c\u5728\u8fd0\u884c run.sh \u7684\u65f6\u5019\u76f4\u63a5\u7a7a\u683c\u52a0\u522b\u540d\u5373\u53ef\uff0c\u6bd4\u5982\uff1a\u6d4b\u8bd5\u673a\u522b\u540d\u4e3a Alias1 \uff0c\u4e14\u5df2\u7ecf\u5728 config/client.ini \u4e2d\u914d\u7f6e\u4e86 Alias1 \u7684user ip password \uff0c\u5219\u8fd0\u884c bash run.sh Alias1 \u5373\u53ef\u5f00\u59cb\u6d4b\u8bd5\u3002 \u5728 Jenkins pipeline \u91cc\u9762\u901a\u8fc7\u5e76\u884c stage \u6216\u5e76\u884c\u8c03\u7528\u4e0b\u5c42\u4efb\u52a1\u7684\u65b9\u5f0f\u53ef\u4ee5\u5b9e\u73b0\u5927\u89c4\u6a21\u7684\u6027\u80fd\u6d4b\u8bd5\u9700\u6c42\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a ;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;1\u3001KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2\u3001KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f, e.g. TAGS = L1 or smoke\n[case_conf]\n# \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\uff0cocr\u6587\u6848\u8bc6\u522b\u8f83\u6162\uff0c\u4e0d\u63a8\u8350\u4f7f\u7528\nfind_by = stage\n# \u6700\u540e\u4e00\u4e2a\u7a33\u5b9a\u9636\u6bb5\u7684\u5e27\u6570\u8bc6\u522b\n# \u9996\u5e27\u5b58\u5728\u540e\u7684\u7b2c\u4e00\u4e2a\u5927\u4e8e\u8be5\u914d\u7f6e\u5e27\u6570\u7684\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u5c3e\u5e27\nfinal_stable_num=100\n# \u4ece\u8be5\u5e27\u6570\u5f00\u59cb\u8bc6\u522b\u6587\u6848\u6216\u56fe\u7247\uff0c\u51cf\u5c11\u5206\u6790\u65f6\u95f4\nstart_num = 150\n# \u8bc6\u522b\u7684\u6587\u6848\ntext=\n# \u8bc6\u522b\u56fe\u7247\nmatch=apps/xxx/images/match.png\n# \u8bc6\u522b\u76f8\u4f3c\u5ea6\nmatch_rate=0.9\n# \u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6bd4\u5982\u70ed\u542f\u52a8\u7528\u4f8b\uff0c\u4ece\u70b9\u51fb\u6253\u5f00\u5230\u505c\u6b62\u5f55\u5c4f\uff0c\u4e2d\u95f4\u7b49\u5f855\u79d2\uff1b\nduration = 15\n# \u5355\u6761\u7528\u4f8b\u6267\u884c\u7684\u6b21\u6570\ncount = 5\n# \u7a33\u5b9a\u9636\u6bb5\u5212\u5206\u7684\u76f8\u4f3c\u5ea6\nstable_similarity = 0.9997\n[server]\n# \u8c03\u8bd5\u6a21\u5f0f=1\uff0c\u4e3a\u5f00\u542f\u8c03\u8bd5\u6a21\u5f0f\uff0c0\u4e3a\u5173\u95ed\u3002\n# \u8c03\u8bd5\u6a21\u5f0f\u4e0b\u9ed8\u8ba4\u53ea\u6267\u884c\u4e00\u6b21\u7528\u4f8b\uff0c\u4e0d\u5173\u673a\n# \u7f16\u5199\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u5efa\u8bae\u5f00\u542fmaintain\u3002\nMAINTAIN = 0\n# \u8fd0\u884c\u7684\u73af\u5883docker\u5bb9\u5668\u73af\u5883\uff0chost\u5bbf\u4e3b\u673a\u73af\u5883\nENV = docker\n# \u670d\u52a1\u7aef\u5bc6\u7801\nPASSWORD=1\n# \u6307\u5b9a\u6d4b\u8bd5\u673a\u522b\u540d\n# \u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6bd4\u5982\uff1a\n# [AMD]\n# ip=10.8.15.86\n# user=uos\n# \u5176\u4e2d AMD \u4e3a\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5219client_alias=AMD\nCLIENT_ALIAS = x86\uff08Intel-i7\uff09\n# 1 \u5f00\u542f\u7f51\u7edc, 0 \u5173\u95ed\u7f51\u7edc\n# \uff081\uff09\u670d\u52a1\u7aef\u4e0e\u6d4b\u8bd5\u673a\u987b\u5728\u540c\u4e00\u7f51\u6bb5\u4e0b\uff0c\u4f60\u53ef\u4ee5\u5c1d\u8bd5\u5728\u670d\u52a1\u7aef\u901a\u8fc7ssh\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c\u5982\u679c\u53ef\u4ee5\u8fde\u63a5\uff0c\u8bf4\u660e\u7f51\u7edc\u6b63\u5e38\u3002\n# \uff082\uff09\u5f53input_type=FILE_NAME \u65f6\uff0c\u5fc5\u987b\u5f00\u542f\u7f51\u7edc\u3002\nNETWORK = 1\n# \u6027\u80fd\u7ed3\u679c\u7edf\u8ba1\u5355\u4f4d \u6beb\u79d2\u2014ms, \u79d2\u2014s\nUNIT=ms\n# \u6d4b\u8bd5\u673a\u5f00\u673a\u8fdb\u5165\u684c\u9762\u540e\u7b49\u5f85\u65f6\u95f4,\u5355\u4f4d/\u79d2\nSTARTUP_DELAY = 60\n# 1\u4e3a\u5220\u9664\u7f13\u5b58\uff0c0\u4e3a\u4e0d\u5220\u9664\u7f13\u5b58\n# \u7528\u4f8b\u6267\u884c\u5b8c\u540e\u4f1a\u5728report\u76ee\u5f55\u4e0b\u751f\u6210\u667a\u80fd\u89e3\u6790\u7684\u4e00\u4e9b\u7f13\u5b58\u56fe\u7247\u3002\nCACHE = 0\n# \u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u62a5\u544a\u4f1a\u4fdd\u5b58\u5728\u9879\u76ee\u4e0breport\u76ee\u5f55\u4e2d\uff1b\n# \u6307\u5b9a\u62a5\u544a\u76ee\u5f55\u5219\u5b58\u653e\u5230\u6307\u5b9a\u76ee\u5f55\u3002\nREPORT_PATH = report\n# \u670d\u52a1\u7aef\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684icon\u8d44\u6e90\u4f1a\u7f13\u5b58\u5728\u9879\u76ee\u4e0binput\u76ee\u5f55\u4e2d\nINPUT = input/\n# 1\u4e3a\u6d4b\u8bd5\u5b8c\u5173\u673a\uff0c0\u4e3a\u6d4b\u8bd5\u5b8c\u4e0d\u5173\u673a\nSHUTDOWN = 0\n# \u89e3\u6790\u8fdb\u7a0b\u6570\uff08\u4e0d\u63a8\u8350\u4fee\u6539\uff09\n# 3\u4e2a\u8fdb\u7a0b\u89e3\u6790\u89c6\u9891\u5df2\u7ecf\u80fd\u591f\u6ee1\u8db3\uff0c\u5373\u4f7f\u589e\u52a0\u8fdb\u7a0b\u6570\u4e5f\u4e0d\u80fd\u51cf\u5c11\u6574\u4f53\u8017\u65f6\n# \u53e6\u5916\u8fd8\u8981\u770bCPU\u6838\u6570\u662f\u5426\u652f\u6301\u3002\nPARSING_PROCESS = 3\n# 1\u4e3a\u4f7f\u7528\u7ee7\u7535\u5668\u5f00\u5173\u673a\uff0c0\u4e3a\u4f7f\u7528reboot\u547d\u4ee4\u91cd\u542f\u3002\u4f9d\u8d56\u7ee7\u7535\u5668\u786c\u4ef6\u8bbe\u5907\uff0c\u9700\u8981\u4f7f\u7528\u8054\u7cfb\u5f00\u53d1\u8005\nRELAY = 0\n# \u83b7\u53d6\u6d4b\u8bd5\u5e94\u7528\u7684\u7248\u672c, %s \u5360\u4f4d\u5e94\u7528\u540d\n# \u5982\u679c\u8be5\u914d\u7f6e\u4e3a\u7a7a\uff0c\u5219\u4e0d\u83b7\u53d6\u5e94\u7528\u7684\u7248\u672c\u4fe1\u606f\u3002\nCOMMAND = apt policy %s 2>/dev/null|grep \"\u5df2\u5b89\u88c5\"|awk -F \"\uff1a\" \"{print \\$2}\"\n# \u5173\u673a\u7b49\u5f85\u5f00\u542f\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6839\u636e\u6d4b\u8bd5\u673a\u6027\u80fd\u4e0d\u540c\uff0c\u5f00\u5173\u673a\u8017\u65f6\u53ef\u80fd\u4e0d\u540c\uff0c\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u673a\u60c5\u51b5\u914d\u7f6e\u3002\nSHUTDOWN_DELAY = 30\n# \u53ef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u56fe\u7247\u683c\u5f0f\uff0c\u4ee5\u82f1\u6587\u9017\u53f7\u9694\u5f00\u3002\n# \u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u76ee\u524d\u6211\u4eec\u4ec5\u9a8c\u8bc1\u4e86jpg,jpeg,png\u8fd9\u4e09\u79cd\u5e38\u7528\u7684\u56fe\u7247\u683c\u5f0f\u3002\nINPUT_TYPES = jpg,jpeg,png\n# \u6027\u80fd\u5206\u6790\u8865\u5e27\uff0c\u7b49\u4e8e\u6216\u4f4e\u4e8e\u8be5\u503c\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u9700\u8981\u51cf\u6389\u3002\nUN_STAB_START = 3\n# \u670d\u52a1\u7aef\u83b7\u53d6\u6d4b\u8bd5\u673a\u56fe\u50cf\u7684\u5e27\u7387\uff0c\u5373\u6bcf\u79d2\u83b7\u53d6\u591a\u5c11\u5f20\u6d4b\u8bd5\u673a\u4e0a\u7684\u56fe\u50cf\u3002\n# \u9ed8\u8ba4\u5e27\u7387\u4e3a30\u5e27/\u79d2\uff0c\u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u53ef\u80fd\u4f1a\u5bf9\u89e3\u6790\u7ed3\u679c\u9020\u6210\u504f\u5dee\u3002\nFPS = 30\n# \u4ee5\u4e0b\u573a\u666f\u7c7b\u578b\u4f1a\u91cd\u542f\u6d4b\u8bd5\u673a,\u591a\u79cd\u573a\u666f\u4f7f\u7528\u9017\u53f7\u9694\u5f00\nSCENE = cold\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = http://10.8.13.78:8890\n#\u5c4f\u5e55\u56fe\u7247\u4e34\u65f6\u5b58\u653e\u4f4d\u7f6e\nSCREEN_CACHE = /tmp/screen\n# =======================================\n[log]\n# \u65e5\u5fd7\u7ea7\u522b\uff0cOFF\u3001FATAL\u3001ERROR\u3001WARN\u3001INFO\u3001DEBUG\u3001ALL\n# \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u65e5\u5fd7\u8f93\u51fa\uff0clog_cli=INFO\u8868\u793a \u4ec5\u8f93\u51faINFO\u53ca\u4ee5\u4e0a\u7ea7\u522b\u7684\u65e5\u5fd7\u3002\nLOG_LEVEL = DEBUG\n# \u65e5\u5fd7\u6587\u4ef6\u4fdd\u5b58\u8def\u5f84\nLOG_PATH= logs\n# =======================================\n[dockerhub]\n# \u5bb9\u5668\u767b\u9646\u8d26\u53f7\nDOCKER_USER = user\n# \u5bb9\u5668\u767b\u9646\u5bc6\u7801\nDOCKER_PASSWORD = User1234\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_2","title":"2\u3001\u6d4b\u8bd5\u673a\u914d\u7f6e","text":"setting/config/client.ini \u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u4fe1\u606f\u3002 \u6709\u7f51\u7edc\u7684\u60c5\u51b5\u4e0b\uff0c\u670d\u52a1\u7aef\u9700\u8981\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u56e0\u6b64\u4f60\u9700\u8981\u5199\u5165 \u6d4b\u8bd5\u673a\u522b\u540d \u3001 user \u3001ip\u3001 password \u3002 # \u6d4b\u8bd5\u673a\u522b\u540d\n[Alias1] # \u6d4b\u8bd5\u673aip\nip=10.8.15.86 # \u6d4b\u8bd5\u673a\u7528\u6237\u540d\nuser=uos\n \u547d\u540d\u5efa\u8bae\uff1aAliasA1\u3001AliasA2\u3001AliasB1\u3001AliasB2\uff0c\u4e0d\u8981\u91cd\u540d\u3002 \u65e0\u7f51\u7edc\u60c5\u51b5\u4e0b\uff0c\u4ec5\u9700\u8981\u5173\u6ce8\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\u9879 width=\u3001 height= \u5373\u53ef\u3002 \u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a [client]\n# \u9ed8\u8ba4\u6d4b\u8bd5\u673a\u7528\u6237\u540d\uff0c\u5bc6\u7801\uff0cip\nip=\nuser=\n# \u6d4b\u8bd5\u673a\u5bc6\u7801\npassword=1\n# \u6d4b\u8bd5\u673a\u4e3b\u9898\ntheme=bloom\n# \u6d4b\u8bd5\u673aicon\u76ee\u5f55\npath=/usr/share/icons\n# \u7cfb\u7edfdesktop\u6587\u4ef6\u7684\u5b58\u653e\u76ee\u5f55\uff0cUOS\u7cfb\u7edf\u9ed8\u8ba4\u4e3a/usr/share/applications\ndesktop_path=/usr/share/applications\n# \u7528\u4e8e\u5224\u65ad\u6d4b\u8bd5\u673a\u662f\u5426\u5f00\u673a\u8fdb\u5165\u684c\u9762\u7684\u8bc6\u522b\u6807\u8bc6\u3002\n# 1\u3001\u901a\u8fc7\u684c\u9762\u56fe\u6807\u8bc6\u522b\u3002\n# - type=FILE_NAME\u65f6\uff0c\u670d\u52a1\u5668\u548c\u6d4b\u8bd5\u673a\u5fc5\u987b\u5728\u540c\u4e00\u5c40\u57df\u7f51\u5185\u3002\n# - power_on=dde-computer\u8868\u793a\u901a\u8fc7\u684c\u9762\u8ba1\u7b97\u673a\u56fe\u6807\u5224\u65ad\u5f00\u673a\u8fdb\u5165\u684c\u9762\u3002\n# 2\u3001\u901a\u8fc7\u672c\u5730\u56fe\u7247\u4f5c\u4e3a\u5f00\u673a\u8bc6\u522b\u3002\n# - type= \u4f20\u5165\u4e3a\u56fe\u7247\u683c\u5f0f\uff0ctype\u652f\u6301\u7684\u7c7b\u578b\u5305\u542b\u5728server.ini\u5185\u914d\u7f6e\u9879input_type=jpg,jpeg,png\u3002\n# - power_on= \u4f20\u5165\u7684\u662f\u672c\u5730\u56fe\u7247\u7684\u8def\u5f84\u3002\ntype=FILE_NAME\npower_on=dde-computer\n# \u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\uff08\u6d4b\u8bd5\u673a\u8fde\u63a5\u91c7\u96c6\u76d2\uff0c\u91c7\u96c6\u76d2\u7684\u5206\u8fa8\u7387\uff09\nheight=1080\nwidth=1920\n[AliasA1] ip=10.8.15.86\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n[AliasA2]\nip=10.8.15.20\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_2","title":"3\u3001\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e","text":"\u968f\u7740\u6d4b\u8bd5\u573a\u666f\u7684\u4e0d\u65ad\u5f15\u5165\uff0c\u53d1\u73b0\u73b0\u6709\u670d\u52a1\u7aef\u91cc\u7684\u914d\u7f6e\u9879\u5e76\u4e0d\u9002\u7528\u4e8e\u6240\u6709\u7684\u6027\u80fd\u573a\u666f\uff0c\u4e8e\u662f\u5c06\u670d\u52a1\u7aef\u914d\u7f6e\u8fdb\u884c\u4e00\u4e2a\u63d0\u53d6\uff0c\u53ef\u505a\u5355\u4e2a\u573a\u666f\u7684\u4e2a\u6027\u5316\u914d\u7f6e\uff0c\u5f53\u7136\u539f\u6765\u7684\u670d\u52a1\u7aef\u914d\u7f6e\u529f\u80fd\u4fdd\u7559\uff0c\u53ea\u662f\u5f53\u4f60\u914d\u7f6e\u4e86\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e\u540e\uff0c\u4f18\u5148\u4f7f\u7528\u4e2a\u6027\u5316\u914d\u7f6e\u91cc\u9762\u7684\u5185\u5bb9\uff0c\u4ee5\u4e0b\u662f\u5bf9\u4e2a\u6027\u5316\u914d\u7f6e\u7684\u4ecb\u7ecd\u3002 \u76ee\u524d\u6bcf\u4e00\u4e2a py \u6587\u4ef6\u5bf9\u5e94\u4e00\u4e2a\u6027\u80fd\u6d4b\u8bd5\u573a\u666f\uff0c\u4e8e\u662f\u5728\u540c\u7ea7\u76ee\u5f55\u4e0b\u521b\u5efa\u4e00\u4e2a\u4e0e\u4e4b\u540c\u540d\u7684 json \u6587\u4ef6\uff0c\u4f5c\u4e3a\u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6 apps\n\u251c\u2500\u2500 album\n \u251c\u2500\u2500 test_album_01_start.json # \u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6\n\u2514\u2500\u2500 test_album_01_start.py # \u6027\u80fd\u573a\u666f\u6587\u4ef6\n \u4ee5\u4e0b\u662f\u5bf9 json \u6587\u4ef6\u4e2d\u914d\u7f6e\u7684\u89e3\u91ca\uff0c\u82e5\u67d0\u9879\u914d\u7f6e\u4e0d\u9700\u8981\uff0c\u53ef\u4ee5\u7f3a\u5931\uff0c\u4f46\u4e0d\u80fd\u4e3a\u7a7a\uff1b {\n\"title\": \"test_album_start\", # \u6807\u9898\uff1b\u5fc5\u987b\n\"app_name\": \"deepin-album\", # \u573a\u666f\u6240\u5c5e\u7684\u5e94\u7528\uff1b\u5fc5\u987b\n\"scene\": \"hot\", # \u573a\u666f\u522b\u540d\uff1b\u5fc5\u987b\n\"icon\": [\"deepin-album\"], # \u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684icon\u5230\u670d\u52a1\u7aef\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\uff1b\u53ef\u7f3a\u5931\n# \u6ce8\u610f\uff1a\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684desktop\u6587\u4ef6\u540d\u4e3adeepin-album.desktop\uff0c\n# \u53ea\u9700\u8981\u5199deepin-album\u5373\u53ef\uff0c\u201c.desktop\u201d\u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002\n\"size\": { # \u56fe\u7247\u5bf9\u6bd4\u7684\u533a\u57df\u8bbe\u7f6e\u9879\uff0c\u67d0\u4e9b\u5e94\u7528\u5f53\u524d\u5c4f\u5e55\u7684\u90e8\u5206\u533a\u57df\u9700\u8981\u5c06\u5176\u53bb\u6389\uff0c\u53ef\u4ee5\u8bbe\u7f6e\u6b64\u9879\uff0c\u5982\u679c\u6ca1\u6709\u5219\u53ef\u4e0d\u5199\uff1b\u53ef\u786e\u5b9e\n\"x-coordinate\": 0, # \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n\"y-coordinate\": 0, # \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n\"width\": 850, # \u6a2a\u5411\u957f\u5ea6\n\"height\": 1920 # \u7eb5\u5411\u9ad8\u5ea6\n},\n\"count\": 5, # \u573a\u666f\u6267\u884c\u7684\u6b21\u6570\uff1b\u5fc5\u987b\n\"duration\": 5, # \u8be5\u6761\u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff0c\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7279\u5b9a\u573a\u666f\uff0c\u8be5\u914d\u7f6e\u4e3a\u53ef\u9009\u9879\uff0c\u8986\u76d6 server.ini \u4e2d\u7684\u914d\u7f6e\uff1b\u53ef\u7f3a\u5931\n\"stable_similarity\": 0.9997, # \u6027\u80fd\u573a\u666f\u5206\u9636\u6bb5\u65f6\u7684\u56fe\u7247\u76f8\u4f3c\u5ea6\u5bf9\u6bd4\uff0c\u524d\u540e\u56fe\u7247\u4f4e\u4e8e\u8be5\u503c\uff0c\u5219\u5206\u4e3a\u4e0d\u7a33\u5b9a\u9636\u6bb5\uff1b\u53ef\u7f3a\u5931\n\"find_by\": \"stage\", # \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\n\"final_stable_num\": 100, # \u67e5\u627e\u6700\u540e\u4e00\u4e2a\u5927\u4e8e\u8be5\u503c\u7684\u7a33\u5b9a\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u7684\u5c3e\u796f\uff1b\u53ef\u7f3a\u5931\n\"start_num\": 150,\n\"text\": \"\", # ocr\u8bc6\u522b\u7684\u6587\u6848\n\"match\": \"apps/xxx/images/match.png\", # \u56fe\u50cf\u5339\u914d\u7684\u56fe\u7247\u6587\u4ef6\u8def\u5f84\n\"match_rate\": 0.9 # \u5339\u914d\u76f8\u4f3c\u5ea6\n}\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_6","title":"\u4e94\u3001\u6d4b\u8bd5\u6d41\u7a0b","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_7","title":"\u516d\u3001\u7528\u4f8b\u7f16\u5199\u53ca\u65b9\u6cd5\u53c2\u6570\u6307\u5f15","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_3","title":"1\u3001\u7528\u4f8b\u5b9e\u4f8b\u8bf4\u660e","text":"# \u6807\u51c6\u5e93\u5bfc\u5165\nfrom time import sleep\n# \u5bfc\u5165\u4e09\u65b9\u5e93pytest\nimport pytest\n# \u5bfc\u5165\u7528\u4f8b\u6267\u884c\u8981\u7528\u5230\u7684Widget\u7c7b\nfrom src.base_widget import BaseWidget\nclass TestStart:\n# class\u7ea7\u522b\u7684fixture\uff0c\u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u6267\u884c\u3002autouse=True \u81ea\u52a8\u5728\u5f53\u524d\u4f5c\u7528\u57df\u4e0b\u4f7f\u7528\u3002\n@pytest.fixture(scope=\"class\", autouse=True)\n# \u6d4b\u8bd5\u70ed\u542f\u52a8\u4e4b\u524d\u9700\u8981\u9884\u542f\u52a8\u3002\ndef application_pre_start(self):\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().right_click_element(\"deepin-album\")\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().click_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\")\nsleep(2)\n# \u5feb\u6377\u952e\u5173\u95ed\u7a97\u53e3\nBaseWidget().hot_key(\"alt\", \"f4\")\nsleep(2)\n# \u9ed8\u8ba4\u4e3afunction\u7ea7\u522b\u7684fixture\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\uff0cclass\u7ea7\u522bfixture\u6267\u884c\u4e4b\u540e\u6267\u884c\u3002\n@pytest.fixture(autouse=True)\ndef setup_start(self):\n# \u53f3\u952e\u70b9\u51fb deepin-album \u56fe\u6807\nBaseWidget().right_click_element(\"deepin-album\")\n# \u79fb\u52a8\u5230\u53f3\u952e\u83dc\u5355\u4e2d\u6253\u5f00\uff08open.png\uff09\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().move_to(*BaseWidget().find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))\n# \u7b49\u5f85\u79fb\u52a8\u5b8c\u6210\nsleep(0.5)\ndef test_album_start(self):\n# \u70b9\u51fb\u201c\u6253\u5f00\u201d\nBaseWidget().click() \n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_3","title":"2\u3001\u65b9\u6cd5\u53c2\u6570\u8bf4\u660e","text":"2.1\u3001find_element \u65b9\u6cd5 def find_element(element: str, input_type: str = \"FILE_NAME\", fill_color_position: tuple = (-1, -1), size: tuple = (25, 70)):\npass\n \u53c2\u6570 element \u548c input_type \uff081\uff09\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u5143\u7d20 - `input_type` \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a `FIEL_NAME` \uff0c\u8868\u793a\u901a\u8fc7\u5e94\u7528 `icon` \u5bfb\u627e\u5143\u7d20\uff0c\u6b64\u65b9\u6cd5\u4f1a\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u5e94\u7528 `icon` \u56fe\u6807\u3002\n \u4e3e\u4f8b\uff1a\u9ed8\u8ba4\u60c5\u51b5\u4e0b input_type \u53c2\u6570\u4e0d\u9700\u8981\u4f20\u5165\uff0c find_element(\"deepin-album\")\uff0c\u8868\u793a\u901a\u8fc7 deepin-album \u7684\u5e94\u7528 icon \u6765\u83b7\u53d6\u5750\u6807\uff0c\u6ce8\u610f\uff0c\u6b64\u65f6\u4f20\u5165\u7684 deepin-album \u53c2\u6570\u5b9e\u9645\u662f desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u548c2.3\u4e2d\u7684 icon \u53d8\u91cf\u4e00\u81f4\u3002 \u6211\u4eec\u5efa\u8bae\u4f18\u5148\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\uff0c\u4f46\u6b64\u65b9\u6cd5\u4f9d\u8d56\u7f51\u7edc\uff0c\u8bf7\u6839\u636e\u6d4b\u8bd5\u73af\u5883\u5b9e\u9645\u60c5\u51b5\u9009\u62e9\u3002 \uff082\uff09\u901a\u8fc7\u672c\u5730\u56fe\u7247\u8bc6\u522b\u5143\u7d20 - \u53c2\u6570 `input_type` \u4f20\u5165\u56fe\u7247\u683c\u5f0f\uff0c\u6bd4\u5982\u622a\u53d6\u7684\u672c\u5730\u56fe\u7247\u683c\u5f0f\u4e3a `png`\uff0c\u90a3\u4e48 `input_type=\"png\"`\uff0c\u6b64\u65f6\u53c2\u6570 `element ` \u4f20\u5165\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5efa\u8bae\u5b58\u653e\u5728\u5bf9\u5e94\u7684\u4ea7\u54c1 `apps/app/picture/` \u76ee\u5f55\u4e0b\uff0c\u8def\u5f84\u4e3a\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u7684\u76f8\u5bf9\u8def\u5f84\u3002\n- \u4e3e\u4f8b\uff1a`find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))`\uff0c\u8868\u793a\u901a\u8fc7\u672c\u5730\u56fe\u7247 `open.png` \u8bc6\u522b\u5143\u7d20\u3002\n \u53c2\u6570 fill_color_position fill_color_position \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (-1, -1)\uff0c(-1, -1) \u8868\u793a\u53d6\u5c4f\u5e55\u4e2d\u53f3\u4e0b\u89d2\u6700\u540e\u4e00\u4e2a\u50cf\u7d20\u70b9\u4f5c\u4e3a\u586b\u5145\u5750\u6807\uff0c\u5728 1920x1080 \u5c4f\u5e55\u5206\u8fa8\u7387\u4e0b\u5373\u5b9e\u9645\u5750\u6807\u4e3a (1919, 1079) \uff0c\u8fd9\u6837\u7684\u5199\u6cd5\u53ef\u4ee5\u9002\u914d\u4e0d\u540c\u5927\u5c0f\u7684\u5c4f\u5e55\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0d\u540c\u65b9\u4f4d\uff1a \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0b\u65b9\uff0c\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u4e0d\u9700\u8981\u4f20\u5165\u8be5\u53c2\u6570\u3002 \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u5de6\u8fb9\uff0cfill_color_position=(1, 1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u53f3\u8fb9\uff0cfill_color_position=(-1, -1) \u4efb\u52a1\u680f\u5728\u5c4f\u5e55\u4e0a\u8fb9\uff0cfill_color_position=(1, 1) \u4ece\u684c\u9762\u542f\u52a8\u5e94\u7528\uff0c\u5219\u9700\u8981\u4f20\u5165\u9664\u4efb\u52a1\u680f\u4ee5\u5916\u5176\u4ed6\u4f4d\u7f6e\u7684\u5750\u6807\uff0c\u6bd4\u5982(100, 100)\uff0c\u53ea\u8981\u8fd9\u4e2a\u5750\u6807\u4e3a\u9664\u5e94\u7528\u548c\u4efb\u52a1\u680f\u533a\u57df\u90fd\u53ef\u4ee5\u3002 \u4ece\u542f\u52a8\u5668\u91cc\u9762\u542f\u52a8\u5e94\u7528\uff0c\u9700\u8981\u586b\u5145\u7684\u5750\u6807\u4e3a\u542f\u52a8\u5668\u533a\u57df\u3002 \u6ce8\uff1a\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u65f6\uff0c\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684 icon \u539f\u6587\u4ef6\u4e3a svg \u77e2\u91cf\u56fe\uff0c\u8f6c\u6362\u4e3a png \u4e4b\u540e\u9700\u8981\u586b\u5145\u8fb9\u7f18\u900f\u660e\u90e8\u5206\u3002 \u53c2\u6570 size size \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (25, 70)\uff0c\u8868\u793a\u6d4b\u8bd5\u673a\u4e0a dock \u680f\u4e0a\u5e94\u7528\u56fe\u6807\u7684\u5927\u5c0f\u8303\u56f4\u3002 UOS \u7cfb\u7edf dock \u680f\u662f\u53ef\u4ee5\u4e0a\u4e0b\u62d6\u52a8\u5927\u5c0f\u7684\uff0c\u968f\u7740 dock \u680f\u5927\u5c0f\u6539\u53d8\uff0c\u5e94\u7528\u56fe\u6807\u7684\u8303\u56f4\u4e3a25\u523070\u4e4b\u95f4\u3002 \u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u64cd\u4f5c\u7cfb\u7edf\u4e0a dock \u680f\u5927\u5c0f\u4e0d\u4e00\u6837\uff0c\u53ef\u4ee5\u6839\u636e\u5b9e\u9645\u60c5\u51b5\u4f20\u5165\u5927\u5c0f\u8303\u56f4\u3002 2.2\u3001click_element\u3001 right_click_element\uff0c double_click_element \u8fd9\u51e0\u4e2a\u65b9\u6cd5\u53c2\u6570\u89c4\u5219\u4e0e find_element \u65b9\u6cd5\u4e00\u6837\u3002\u4ed6\u4eec\u5b9e\u9645\u4e0a\u662f\u5728 find_element \u65b9\u6cd5\u57fa\u7840\u4e4b\u4e0a\u505a\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u589e\u52a0\u4e86\u9f20\u6807\u7684\u52a8\u4f5c\uff0c\u5982\u679c\u4f60\u4e0d\u60f3\u4f7f\u7528\u8fd9\u51e0\u4e2a\u65b9\u6cd5\uff0c\u5728\u7528\u4f8b\u4e2d\u4e5f\u53ef\u4ee5\u901a\u8fc7 find_element \u83b7\u53d6\u5230\u5750\u6807\uff0c\u7136\u540e\u5c06\u5750\u6807\u4f20\u5165\u5230\u952e\u9f20\u7684\u65b9\u6cd5\u4e2d\uff0c\u53ef\u4ee5\u5b9e\u73b0\u540c\u6837\u7684\u6548\u679c\u3002 2.3\u3001\u7528\u4f8b\u7c7b\u4e2d\u6709\u4e2a\u7c7b\u53d8\u91cf icon = [\"deepin-album\"] \u9700\u8981\u7279\u6b8a\u8bf4\u660e\uff0c\u5217\u8868\u4e2d\u7684\u5143\u7d20\u4e3a\u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709 icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684 icon \u5230\u670d\u52a1\u7aef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528 desktop \u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684 desktop \u6587\u4ef6\u540d\u4e3a deepin-album.desktop\uff0c\u53ea\u9700\u8981\u5199 deepin-album \u5373\u53ef\uff0c.desktop \u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_8","title":"\u4e03\u3001\u6267\u884c\u5165\u53e3","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_4","title":"1\u3001\u7528\u4f8b\u7ec4\u7ec7","text":"\u5728 setting/config/server.ini \u6587\u4ef6\u4e2d APP_NAME= \u5b57\u6bb5\u4e3a\u7528\u4f8b\u7684\u6267\u884c\u7684\u76ee\u5f55\uff0c\u9ed8\u8ba4\u4e3a apps \u76ee\u5f55\u4e0b\u6240\u6709\u7528\u4f8b\u3002\u5982\u679c\u4f60\u60f3\u6307\u5b9a\u6267\u884c\u67d0\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4f60\u53ef\u4ee5\u5c06\u8be5\u914d\u7f6e\u9879\u6307\u5b9a\u5230\u5e94\u7528\u7684\u7528\u4f8b\u76ee\u5f55\uff0c\u6bd4\u5982\uff1aAPP_NAME=deepin_album\uff0c \u8868\u793a\u6267\u884c\u76f8\u518c\u76ee\u5f55\u4e0b\u7684\u7528\u4f8b\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_4","title":"2\u3001\u547d\u4ee4\u884c\u53c2\u6570","text":"\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570 \u4ee5\u4e0b\u4e3a python3 manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a -a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music\n -k KEYWORDS, --keywords KEYWORDS\n \u7528\u4f8b\u7684\u5173\u952e\u8bcd\n -t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e\n --log_level LOG_LEVEL \u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n --env {host,docker} \u5728\u5bbf\u4e3b\u673a\u6216\u5bb9\u5668\u73af\u5883\u6267\u884c\n --client_alias \u9009\u62e9\u6d4b\u8bd5\u673a\u522b\u540d, \u53ef\u9009\u9879\u4e3aclient.ini\u4e2d\u5df2\u914d\u7f6e, \u9ed8\u8ba4\u503c\u4e3a zx-x86.\n --count \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n \u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a python3 manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\" --env docker\n \u6ce8\uff1a\u5728\u5bb9\u5668\u4e2d\u6267\u884c\u65f6\uff0c\u82e5\u5f3a\u5236\u9000\u51fa\uff0c\u5bb9\u5668\u5e76\u4e0d\u4f1a\u505c\u6b62\u8fd0\u884c\uff01"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_9","title":"\u516b\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1json","title":"1\u3001Json \u62a5\u544a","text":"\u81ea\u7814\u89c6\u9891\u89e3\u6790\u5de5\u5177\u4f1a\u5bf9\u5355\u6761\u7528\u4f8b\u6267\u884c\u4e00\u8f6e\u751f\u6210\u4e00\u4e2a json \u6587\u4ef6\uff0c\u5b58\u653e\u4e8e report/{app_name}/{scene}/{run_num} \u76ee\u5f55\u4e0b\uff0c\u547d\u540d\u683c\u5f0f\u4e3a\uff1a report.json json \u5185\u5bb9\u4e3e\u4f8b\uff1a [\n{\n\"Stab1\": {\n\"images\": [1,2...150,151],\n\"startStub\": 0,\n\"type\": \"Stab\"\n}\n},\n{\n\"Stab2\": {\n\"images\": [152,153...169,170],\n\"startStub\": 1,\n\"type\": \"UnStab\"\n}\n},\n{\n\"Stab3\": {\n\"images\": [171,172...300,301],\n\"startStub\": 0,\n\"type\": \"UnStab\"\n}\n}\n]\n \u8bf4\u660e\uff1a Stab \uff1a\u8868\u793a\u89e3\u6790\u8fc7\u7a0b\u4e2d\u4e0d\u540c\u7684\u9636\u6bb5\u3002 images \uff1a\u8868\u793a\u6bcf\u4e00\u5e27\u7684\u56fe\u7247\u5e8f\u53f7\u3002 startStub\uff1a \u4e3a\u8bc6\u522b\u5c3e\u5e27\u7684\u9636\u6bb5\u8868\u793a\uff0c\u5982\u679c \"startStub\": 1 \uff0c\u8bf4\u660e\u5c3e\u5e27\u51fa\u73b0\u5728\u8be5\u9636\u6bb5\u3002 type\uff1a \u4e3a Stab \u6216 UnStab \uff0c\u8868\u793a\u7a33\u5b9a\u9636\u6bb5\u6216\u4e0d\u7a33\u5b9a\u9636\u6bb5\u3002 \u5404\u9636\u6bb5\u6709\u5e27\u6570\u8865\u507f\uff0c\u9ed8\u8ba4\u8865\u507f\u7684\u5e27\u6570\u4e3a 3 \u5e27\uff08\u53ef\u4ee5\u901a\u8fc7 server.ini \u91cc\u9762 un_stab_start=3 \u8fdb\u884c\u914d\u7f6e\uff09\uff0c\u8868\u793a\u5c0f\u4e8e\u7b49\u4e8e 3 \u5e27\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u524d\u540e\u5747\u9700\u8981\u51cf\u6389\u3002 \u5e94\u7528\u542f\u52a8\u9636\u6bb5\u5c31\u662f\u5728 Stab2 \u9636\u6bb5\uff0c\u542f\u52a8\u65f6\u95f4\u4e3a\uff1a171 \u51cf 151 \u518d\u51cf\u6389\u524d\u540e\u8865\u507f\u5e27\u6570 6 \u5e27\uff0c\u5373 14 \u5e27\uff0c\u89c6\u9891\u5e27\u7387 30 \u5e27/\u79d2\uff0c\u56e0\u6b64\u542f\u52a8\u8017\u65f6\u4e3a\uff1a14 * 33 = 462 ms"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2excel","title":"2\u3001Excel \u62a5\u544a","text":"\u6240\u6709\u7528\u4f8b\u6267\u884c\u5e76\u89e3\u6790\u5b8c\u4e4b\u540e\u4f1a report \u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a\u6c47\u603b\u6570\u636e\u7684 Excel \u6587\u4ef6\uff0c\u6587\u4ef6\u540d\u4e3a\uff1a{time}_perf_time.xlsx\u3002 \u6ce8\u610f\uff0creport \u76ee\u5f55\u4e3a\u53ef\u914d\u7f6e\u9879\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u4f1a\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u751f\u6210\uff0c\u5982\u679c\u4f60\u5c06 report\uff0c\u6307\u5b9a\u5230\u9879\u76ee\u4e0b\u5176\u4ed6\u8def\u5f84\uff0c\u5219\u4f1a\u5728\u5bf9\u5e94\u7684\u8def\u5f84\u4e0b\u751f\u6210 json \u548c Excel \u6587\u4ef6\u3002 \u4f60\u4e5f\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8bfb\u53d6\u6240\u6709 json / excel \u62a5\u544a\u7684\u6570\u636e\uff0c\u751f\u6210\u4f60\u81ea\u5df1\u60f3\u8981\u7684\u4e00\u4e9b\u6d4b\u8bd5\u62a5\u544a\u5f62\u5f0f\u3002"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#usb","title":"\u4e5d\u3001USB \u4e32\u53e3\u9a71\u52a8\u952e\u9f20\u65b9\u6cd5","text":"\u4f4d\u4e8e src/utils/control/serial_communication \u76ee\u5f55\u4e0b\u7684 usb_mk.py \u6587\u4ef6 usb_mk = UsbMk()\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_5","title":"1\u3001\u952e\u76d8\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n \uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n \uff083\uff09\u7ec4\u5408\u6309\u952e usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n \uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n \uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e usb_mk.key_up()\n \uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u652f\u6301\u4f20\u5165\u6c49\u5b57\uff0c\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09 usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2_5","title":"2\u3001\u9f20\u6807\u64cd\u4f5c","text":"\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e usb_mk.click()\n \uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e usb_mk.mouse_down() \n \uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e usb_mk.mouse_up() \n \uff084\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e usb_mk.right_click() \n \uff085\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb usb_mk.double_click() \n \uff086\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2 usb_mk.move_to_init() \n \uff087\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807 usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n \uff088\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807 usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n \uff0810\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_10","title":"\u5341\u3001\u7ee7\u7535\u5668\u63a7\u5236\u4e3b\u673a\u5f00\u673a/\u91cd\u542f","text":"\uff08\u82e5\u4e0d\u4f7f\u7528\u7ee7\u7535\u5668\uff0c\u53ef\u5ffd\u7565\u8be5\u6b65\u9aa4\uff0c\u6267\u884c\u65f6\u4f1a\u901a\u8fc7\u547d\u4ee4 reboot\uff09"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#1_6","title":"1\u3001\u7ee7\u7535\u5668\u8bbe\u5907","text":"LCUS-2 \u578b \u53cc\u8def USB \u667a\u80fd\u4e32\u53e3\u63a7\u5236\u7ee7\u7535\u5668\u3002 https://item.taobao.com/item.htm?spm=a1z09.2.0.0.41d72e8dUYx2pi&id=582653718178&_u=i25r20ia6a2e "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#2usb","title":"2\u3001USB \u5ef6\u957f\u7ebf","text":"\u666e\u901a\u7684 USB \u7ebf\u5373\u53ef\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#3_3","title":"3\u3001\u675c\u90a6\u7ebf","text":"3.1\u300140P \u6bcd\u5bf9\u516c\u675c\u90a6\u7ebf\u3002 3.2\u3001\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 "},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#4","title":"4\u3001\u5b89\u88c5\u56fe\u6587\u6559\u7a0b","text":"4.1\u3001\u4f7f\u7528 USB \u5ef6\u957f\u7ebf\u8fde\u63a5\u63a7\u5236\u7aef\u548c\u7ee7\u7535\u5668\u3002 4.2\u3001\u5728\u7ee7\u7535\u5668\u5e38\u7aef\u548c\u516c\u5171\u7aef\u5747\u8fde\u63a5\u4e00\u6839\u675c\u90a6\u7ebf\u3002 4.3\u3001\u5728\u4e3b\u677f\u4e0a\u5f00\u673a\u9488\u548c\u91cd\u542f\u9488\u4e0a\u63d2\u4e0a\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002 4.4\u3001\u5c06\u5f00\u673a\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76841\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1\u5de6\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 4.5\u3001\u5c06\u91cd\u542f\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76842\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1 \u53f3\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002 \u82e5\u60f3\u4fdd\u7559\u539f\u7535\u6e90\u5f00\u5173\u7684\u7535\u6e90\u706f\uff0c\u53ef\u6839\u636e\u5982\u4e0a\u56fe\u6240\u793a\uff0c\u4f7f\u7528\u675c\u90a6\u7ebf\u8fde\u63a5\u4e3b\u677f\u4e0a\u7684\u7535\u6e90\u706f\u548c\u539f\u7535\u6e90\u5f00\u5173"},{"location":"%E6%99%BA%E8%83%BD%E5%8C%96%E6%80%A7%E8%83%BD%E6%B5%8B%E8%AF%95/#_11","title":"\u5341\u4e00\u3001\u5e38\u89c1\u95ee\u9898\u8bf4\u660e","text":"1\u3001ERROR: for uos Cannot restart container 2301b1a1395d7959ee6523d61b61c87084649af530786cdb8fb5b3ecbcbd1068: linux runtime spec devices: error gathering device information while adding custom device \"/dev/ttyACM0\": no such file or directory \u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u8fde\u63a5\u72b6\u6001\uff0c\u67e5\u770b /dev/ttyACM0 \u662f\u5426\u5b58\u5728\uff0c\u82e5\u5b58\u5728 /dev/ttyACMn\uff08n\u4e3a\u4efb\u610f\u6570\u5b57\uff09\uff0c\u91cd\u542f\u7535\u8111\u89e3\u51b3\u3002 2\u3001Error response from daemon: Container 5e700fdc769e8c74666d68a7f2bc3de58268b4594cf88706609d59f8dbc7362d is not running \u5bb9\u5668\u542f\u52a8\u5931\u8d25 1\uff09\u68c0\u67e5\u54ea\u4e00\u4e2a\u5bb9\u5668\u672a\u542f\u52a8 sudo docker container ls # \u5217\u51fa\u8fd0\u884c\u4e2d\u7684 Docker \u5bb9\u5668\n 2\uff09\u7f3a\u5c11 uos \u5bb9\u5668\uff0c\u68c0\u67e5 USB \u4e32\u53e3\u8fde\u63a5\u7ebf\u548c\u91c7\u96c6\u76d2\u8fde\u63a5\u7ebf\u662f\u5426\u6b63\u5e38\uff0c\u91cd\u542f\u540e\u6267\u884c bash install/setup.up # \u91cd\u65b0\u5b8c\u6574\u90e8\u7f72\u73af\u5883\n \u6216\u6267\u884c sudo docker-compose up -d --build # \u4ec5\u91cd\u65b0\u6784\u5efa Docker \u955c\u50cf\n 3\u3001\u82e5\u90e8\u7f72\u65f6\u63d0\u793a\u6302\u8f7d ttyACM0\u3001video0 \u5931\u8d25\uff0c\u8bf7\u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u53ca\u91c7\u96c6\u76d2\u662f\u5426\u63a5\u89e6\u826f\u597d\uff0c\u82e5\u63a5\u89e6\u826f\u597d\uff0c\u91cd\u542f\u5373\u53ef\u89e3\u51b3\u3002 4\u3001\u82e5\u51fa\u73b0\u56fe\u7247\u80fd\u8bc6\u522b\uff0c\u4f46\u662f\u9f20\u6807\u672a\u79fb\u52a8\u64cd\u4f5c\u65f6\uff0c\u5b89\u88c5\u7edd\u5bf9\u9f20\u6807\u64cd\u4f5c\u7684\u4f9d\u8d56\u5305\uff0c\u89c1\u7b2c\u4e09\u8282\u7b2c\u4e8c\u5c0f\u8282\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u6d4b\u8bd5\u673a\u3002 5\u3001\u7531\u4e8e\u901a\u8fc7\u91c7\u96c6\u5361\u83b7\u53d6\u7684\u6d4b\u8bd5\u673a\u5b9e\u65f6\u753b\u9762\uff0c\u5305\u542b\u4e86\u9f20\u6807\u7684\u6837\u5f0f\uff0c\u6240\u4ee5\u5bf9\u56fe\u7247\u8bc6\u522b\u65f6\uff0c\u9f20\u6807\u82e5\u505c\u7559\u5728\u56fe\u6807\u4e0a\u5c42\uff0c\u5219\u4f1a\u5bf9\u8bc6\u522b\u7ed3\u679c\u9020\u6210\u5f71\u54cd\uff0c\u9700\u8981\u5c06\u9f20\u6807\u79fb\u52a8\u81f3\u5176\u4ed6\u4f4d\u7f6e\uff0c\u6216\u8005\u9690\u85cf\u9f20\u6807\u89e3\u51b3\u3002 6\u3001Excel \u62a5\u544a\u4e2d\uff0c\u6d4b\u8bd5\u573a\u666f\u5217\u4e0e\u7528\u4f8b\u4e2d\u7684\u4e0d\u4e00\u81f4\uff0c\u5173\u952e\u5b57scene\u3001app_name\u3001\u67b6\u6784\u522b\u540d\uff0c\u4e0d\u80fd\u5305\u542b\u4e0b\u5212\u7ebf\u548c\u82f1\u6587\u7b26\u53f7\u7684\u5706\u62ec\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/","title":"\u6846\u67b6\u529f\u80fd\u4ecb\u7ecd","text":"# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2023/1/12\n# Author : Mikigo\n# =============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_2","title":"\u4e00\u3001\u4e00\u53e5\u8bdd\u7b80\u4ecb","text":"\u6b64\u6587\u6863\u4e3b\u8981\u60f3\u5bf9 YouQu \u6846\u67b6\u4e00\u4e9b\u91cd\u70b9\u7684\u529f\u80fd\u505a\u8be6\u7ec6\u7684\u4ecb\u7ecd\uff0c\u5305\u62ec\u5bf9\u4e00\u4e9b\u529f\u80fd\u5f00\u53d1\u7684\u80cc\u666f\u3001\u8981\u89e3\u51b3\u7684\u95ee\u9898\u3001\u5b9e\u73b0\u903b\u8f91\u3001\u4ee3\u7801\u7b49\u65b9\u9762\u7684\u4ecb\u7ecd\uff0c\u4ee5\u6b64\u8ba9\u5927\u5bb6\u80fd\u66f4\u52a0\u6e05\u6670\u7684\u7406\u89e3\u5404\u9879\u529f\u80fd\uff0c\u4ece\u800c\u5728\u4f7f\u7528\u7684\u65f6\u5019\u80fd\u66f4\u52a0\u7684\u5f97\u5fc3\u5e94\u624b\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_3","title":"\u4e8c\u3001\u56fe\u50cf\u8bc6\u522b","text":"\u56fe\u50cf\u8bc6\u522b\u5728 UI \u81ea\u52a8\u5316\u4e2d\u662f\u4e0d\u53ef\u7f3a\u5c11\u7684\uff0c\u5e02\u9762\u4e0a\u751a\u81f3\u6709\u5b8c\u5168\u57fa\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\uff0c\u6bd4\u5982 Airtest\u3001Sikuli \u7b49\uff0c\u5728\u6e38\u620f\u7b49\u7279\u5b9a\u9886\u57df\u4e5f\u6709\u4e0d\u9519\u7684\u6548\u679c\uff0c\u8fd9\u4e9b\u5de5\u5177\u5b9e\u9645\u4e0a\u4e5f\u662f\u7528\u7684 OpenCV \u8fdb\u884c\u4e86\u5c01\u88c5\uff0cYouQu \u6846\u67b6\u57fa\u4e8e OpenCV \u5f00\u53d1\u4e86\u81ea\u5df1\u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\uff0c\u5b83\u53ef\u4ee5\u65b9\u4fbf\u7684\u7528\u4e8e\u754c\u9762\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u65ad\u8a00\uff1b YouQu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u51e0\u4e4e\u6ee1\u8db3\u4e86\u4f60\u7684\u6240\u6709\u8981\u6c42\uff0c\u6211\u4eec\u5728\u957f\u65f6\u95f4\u7684\u601d\u8003\u548c\u6478\u7d22\u4e2d\uff0c\u9488\u5bf9\u5e38\u89c4\u573a\u666f\u53ca\u4e00\u4e9b\u7279\u6b8a\u573a\u666f\u63a2\u7d22\u9664\u4e86\u4e00\u4e9b\u5b9e\u7528\u4e14\u6709\u6548\u7684\u65b9\u6848\uff0c\u4e14\u542c\u6211\u6162\u6162\u9053\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1","title":"1\u3001\u5e38\u89c4\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5e38\u89c4\u8bc6\u522b\u5f88\u597d\u7406\u89e3\uff0c\u4e00\u53e5\u8bdd\u8bb2\u5c31\u662f\uff0c\u8981\u83b7\u53d6\u5230\u76ee\u6807\u5143\u7d20\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u3002 \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u5728\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u9700\u8981\u83b7\u53d6\u7684\u5750\u6807\u662f\u76f8\u5bf9\u4e8e\u6574\u4e2a\u5c4f\u5e55\u7684\u5750\u6807\uff0c\u6211\u4eec\u53ef\u4ee5\u622a\u53d6\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u56fe\u7247\uff08screen\uff09\uff1b \u5728\u5143\u7d20\u8bc6\u522b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u622a\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5c0f\u56fe\u8fdb\u884c\u8bc6\u522b\uff0c\u6bd4\u5982\u622a\u53d6\u64ad\u653e\u6309\u94ae\uff1a \u90a3\u4e48\u5b9e\u9645\u4e0a\uff0c\u5143\u7d20\u5b9a\u4f4d\u7684\u95ee\u9898\u5c31\u8f6c\u6362\u4e3a\uff0c\u5c06\u622a\u56fe\u7684\u5c0f\u56fe\uff08play_btn\uff09\u62ff\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u5927\u56fe\uff08screen\uff09\u4e2d\u53bb\u505a\u5339\u914d\uff0c\u5982\u679c\u5339\u914d\u6210\u529f\uff0c\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff08 x, y \uff09\u5373\u53ef\u3002 \u4e3a\u4e86\u65b9\u4fbf\u63cf\u8ff0\uff0c\u4ee5\u4e0b\u6211\u5c06\u6574\u4e2a\u5c4f\u5e55\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5927\u56fe\uff0c\u67d0\u4e2a\u5143\u7d20\u56fe\u7247\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5c0f\u56fe\u3002 \u57fa\u4e8e OpenCV \u7684\u6a21\u677f\u5339\u914d cv.matchTemplate() \u529f\u80fd\uff0c\u6211\u4eec\u5b9e\u73b0\u4e86\u56fe\u50cf\u5b9a\u4f4d\u7684\u529f\u80fd\uff0c\u6846\u67b6\u63d0\u4f9b\u4e86\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u5e95\u5c42\u63a5\u53e3\uff08\u4e00\u822c\u4e0d\u5bf9\u4e0a\u5c42\u63d0\u4f9b\u8c03\u7528\uff09\uff1a def _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\n# \u8be6\u7ec6\u4ee3\u7801\u592a\u957f\u4e0d\u8d34\u4e86\uff0c\u611f\u5174\u8da3\u8bf7\u67e5\u770b\u6e90\u7801\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001image_path image_path \u662f\u5c0f\u56fe\u7684\u7edd\u5bf9\u8def\u5f84; \u901a\u5e38\u5728 AT \u5de5\u7a0b\u91cc\u9762\uff0c\u6211\u4eec\u7ea6\u5b9a\u5c06\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u5b9e\u9645\u7684\u5143\u7d20\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1aplay_btn.png \uff1b \u7528\u4e8e\u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 case/assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1amusic_001.png \uff1b \u8fd9\u6837\u662f\u4e3a\u4e86\u65b9\u4fbf\u7ba1\u7406\u548c\u7ef4\u62a4\u3002 2\u3001rate \u56fe\u50cf\u8bc6\u522b\u7684\u7684\u5339\u914d\u5ea6\u6216\u8005\u8bf4\u76f8\u4f3c\u5ea6\uff0c\u6846\u67b6\u9ed8\u8ba4\u7684\u914d\u7f6e\u4e3a 0.9\uff0c\u4e5f\u5c31\u662f\u8bf4\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u5b58\u5728\u4e00\u4e2a\u76f8\u4f3c\u5ea6 90% \u7684\u56fe\u6807\u5373\u8fd4\u56de\u5176\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff1b \u5982\u679c\u4f60\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u8c03\u6574\u8bc6\u522b\u5ea6\uff0c\u4f60\u53ef\u4ee5\u5728\u8c03\u7528\u51fd\u6570\u7684\u65f6\u5019\uff0c\u4f20\u5165\u4e0d\u540c\u7684\u8bc6\u522b\u5ea6\u7684\u503c\u3002 3\u3001multiple \u9ed8\u8ba4\u60c5\u51b5\u4e0b multiple=False\uff0c\u8868\u793a\u53ea\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u7b2c\u4e00\u4e2a\uff0c\u5982\u679c multiple=True \u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\uff0c\u56e0\u4e3a\u5927\u56fe\u4e2d\u53ef\u80fd\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u5c0f\u56fe\uff0c\u5728\u67d0\u4e9b\u573a\u666f\u4e0b\u4f60\u53ef\u80fd\u9700\u8981\u5168\u90e8\u83b7\u53d6\u5230\u6240\u6709\u5339\u914d\u5230\u7684\u5750\u6807\u3002 4\u3001picture_abspath \u9ed8\u8ba4\u60c5\u51b5\u4e0b picture_abspath=None \u8868\u793a\u5927\u56fe\u4e3a\u622a\u53d6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u5982\u679c\u4f60\u4e0d\u5e0c\u671b\u5927\u56fe\u662f\u5c4f\u5e55\u7684\u622a\u56fe\uff0c\u800c\u662f\u4f60\u81ea\u5b9a\u4e49\u4f20\u5165\u7684\u67d0\u4e2a\u56fe\u7247\uff0c\u4f60\u53ea\u9700\u8981\u5c06\u4f60\u7684\u56fe\u7247\u8def\u5f84\u4f20\u9012\u7ed9\u8fd9\u4e2a\u53c2\u6570\u5c31\u884c\uff0c\u6bd4\u5982\uff1a picture_abspath=\"~/Desktop/big.png\" \uff1b 5\u3001screen_bbox \u5927\u56fe\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u622a\u53d6\u6574\u4e2a\u5c4f\u5e55\uff0cscreen_bbox = [x, y, w, h] \u53ef\u4ee5\u6307\u5b9a\u622a\u53d6\u5c4f\u5e55\u4e2d\u7684\u56fa\u5b9a\u533a\u57df\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\uff0c\u53ef\u4ee5\u6392\u9664\u90e8\u5206\u533a\u57df\u5bf9\u8bc6\u522b\u7ed3\u679c\u7684\u5f71\u54cd\u3002 \u3010\u9690\u5f0f\u7b49\u5f85\u3011 \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\uff0c\u6709\u65f6\u5019\u9875\u9762\u8df3\u8f6c\u6709\u5ef6\u65f6\uff0c\u6709\u53ef\u80fd\u5b58\u5728\u8bc6\u522b\u7684\u90a3\u4e00\u523b\u9875\u9762\u4e5f\u6ca1\u6709\u8df3\u8f6c\u51fa\u6765\uff0c\u6216\u8005\u6216\u8005\u8bc6\u522b\u7684\u90a3\u4e00\u523b\uff1b \u56e0\u6b64\u6211\u4eec\u9700\u8981\u4e00\u79cd\u7b49\u5f85\u673a\u5236\uff0c\u5373\u5728\u4e00\u5b9a\u7684\u65f6\u95f4\u5185\uff0c\u5982\u679c\u8bc6\u522b\u4e0d\u5230\uff0c\u91cd\u590d\u53bb\u8bc6\u522b\uff1a def find_image(\ncls,\n*widget, rate: [float, int] = None,\nmultiple: bool = False,\nmatch_number: int = None,\npicture_abspath: str = None,\nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u5728\u5c4f\u5e55\u4e2d\u533a\u5bfb\u627e\u5c0f\u56fe\uff0c\u8fd4\u56de\u5750\u6807\uff0c\n \u5982\u679c\u627e\u4e0d\u5230\uff0c\u6839\u636e\u914d\u7f6e\u91cd\u8bd5\u6b21\u6570\uff0c\u6bcf\u6b21\u95f4\u96941\u79d2\n :param widget: \u6a21\u677f\u56fe\u7247\u8def\u5f84\n :param rate: \u76f8\u4f3c\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param match_number: \u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\n :return: \u5750\u6807\u5143\u7ec4\n \"\"\"\nif rate is None:\nrate = float(GlobalConfig.IMAGE_RATE)\ntry:\nfor element in widget:\nfor _ in range((match_number or int(GlobalConfig.IMAGE_MATCH_NUMBER)) + 1):\nlocate = cls._match_image_by_opencv(\nelement,\nrate,\nmultiple=multiple,\npicture_abspath=picture_abspath,\nscreen_bbox=screen_bbox\n)\nif not locate:\nsleep(int(GlobalConfig.IMAGE_MATCH_WAIT_TIME))\nelse:\nreturn locate\nraise TemplateElementNotFound(*widget)\nexcept Exception as e:\nraise e\n \u53c2\u6570 match_number \u7528\u4e8e\u63a7\u5236\u91cd\u590d\u8bc6\u522b\u7684\u6b21\u6570\uff0c\u9ed8\u8ba4\u4e0d\u4f20\u53c2\uff0c\u53d6\u5168\u5c40\u914d\u7f6e setting/globalconfig.ini \u91cc\u9762\u7684 IMAGE_MATCH_NUMBER \u914d\u7f6e\u9879\u7684\u503c\uff0c\u9ed8\u8ba4IMAGE_MATCH_NUMBER = 1\uff0c\u5373\u91cd\u8bd5 1 \u6b21\uff1b find_image \u662f\u6846\u67b6\u63d0\u4f9b\u7684\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u51fd\u6570\u63a5\u53e3\uff0c\u8fd9\u4e2a\u51fd\u6570\u63d0\u4f9b\u4e86\u9690\u5f0f\u7b49\u5f85\u7684\u529f\u80fd\uff0c\u4e14\u5305\u542b\u4e0a\u9762\u4ecb\u7ecd\u7684 _match_image_by_opencv \u51fd\u6570\u7684\u6240\u6709\u529f\u80fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2","title":"2\u3001\u6c14\u6ce1\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u6c14\u6ce1\u8bc6\u522b\u6307\u7684\u662f\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\u8981\u5b9a\u4f4d\u7684\u5143\u7d20\u662f\u4e00\u4e9b\u4f1a\u6d88\u5931\u7684\u5c0f\u5f39\u7a97\uff0c\u8fd9\u7c7b\u573a\u666f\u5728\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\u5c31\u53ef\u80fd\u5b58\u5728\u4e0d\u7a33\u5b9a\u6027\uff0c\u6709\u53ef\u80fd\u56fe\u50cf\u8bc6\u522b\u7684\u65f6\u5019\u6c14\u6ce1\u5df2\u7ecf\u6d88\u5931\u4e86\uff0c\u4e5f\u6709\u53ef\u80fd\u6c14\u6ce1\u51fa\u73b0\u7684\u65f6\u95f4\u592a\u77ed\u4e86\uff0c\u4e0d\u5bb9\u6613\u6355\u6349\u5230\uff0c\u5c31\u50cf\u6c14\u6ce1\u4e00\u6837\uff0c\u51fa\u73b0\u4e00\u4e0b\u5c31\u6d88\u5931\uff0c\u56e0\u6b64\u6211\u4eec\u5f62\u8c61\u7684\u79f0\u4e4b\u4e3a \u201c\u6c14\u6ce1\u8bc6\u522b\u201d\uff1b \u3010\u539f\u7406\u5b9e\u73b0\u3011 \u4e3a\u4e86\u80fd\u7a33\u5b9a\u7684\u8bc6\u522b\u6c14\u6ce1\u7c7b\u573a\u666f\uff0c\u6211\u4eec\u91c7\u7528\u7684\u65b9\u6848\u662f\uff1a \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\uff08\u5305\u542b\u6c14\u6ce1\u4ece\u51fa\u73b0\u5230\u6d88\u5931\uff09\uff0c\u4e0d\u505c\u7684\u622a\u53d6\u8fd9\u6bb5\u65f6\u95f4\u5185\u7684\u5927\u56fe\uff0c\u4ee5\u6b64\u786e\u4fdd\u5728\u622a\u53d6\u7684\u4e00\u5806\u56fe\u7247\u4e2d\uff0c\u80af\u5b9a\u6709\u81f3\u5c11\u4e00\u5f20\u56fe\u7247\u80fd\u6355\u6349\u5230\u6c14\u6ce1\uff0c\u6700\u540e\u518d\u5bf9\u8fd9\u4e00\u5806\u56fe\u7247\u9010\u4e2a\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def get_during(\ncls,\nimage_path: str,\nscreen_time: [float, int],\nrate: float = None,\npause: [int, float] = None,\nmax_range: int = 10000\n):\n\"\"\"\n \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u622a\u56fe\u591a\u5f20\u56fe\u7247\u8fdb\u884c\u8bc6\u522b\uff0c\u5176\u4e2d\u6709\u4e00\u5f20\u56fe\u7247\u8bc6\u522b\u6210\u529f\u5373\u8fd4\u56de\u7ed3\u679c;\n \u9002\u7528\u4e8e\u6c14\u6ce1\u7c7b\u7684\u65ad\u8a00\uff0c\u6bd4\u5982\u6c14\u6ce1\u57281\u79d2\u5185\u6d88\u5931\uff0c\u5982\u679c\u7528\u5e38\u89c4\u7684\u56fe\u50cf\u8bc6\u522b\u5219\u6709\u53ef\u80fd\u65e0\u6cd5\u8bc6\u522b\u5230\uff1b\n :param image_path: \u8981\u8bc6\u522b\u7684\u6a21\u677f\u56fe\u7247\uff1b\n :param screen_time: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff1b\n :param rate: \u8bc6\u522b\u7387\uff1b\n :param pause: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u4e0d\u95f4\u9694\uff1b\n :param max_range: \u622a\u56fe\u7684\u6700\u5927\u6b21\u6570\uff0c\u8fd9\u662f\u4e00\u4e2a\u9884\u8bbe\u503c\uff0c\u4e00\u822c\u60c5\u51b5\u4e0b\u4e0d\u6d89\u53ca\u4fee\u6539\uff1b\n \"\"\"\n \u3010\u53c2\u6570\u4ecb\u7ecd\u3011 1\u3001screen_time \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5728\u6b64\u65f6\u95f4\u5185\u4f1a\u4e0d\u65ad\u7684\u8fdb\u884c\u622a\u56fe\u64cd\u4f5c\uff0c\u5c31\u50cf\u5f55\u5236\u89c6\u9891\u4e00\u6837\uff1b 2\u3001pause \u6bcf\u6b21\u622a\u53d6\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u4e00\u523b\u4e0d\u505c\u7684\u622a\u56fe\uff0c\u5982\u679c\u4f60\u60f3\u6bcf\u6b21\u622a\u56fe\u5b58\u5728\u4e00\u4e9b\u95f4\u9694\u65f6\u95f4\u4f20\u5165\u5bf9\u5e94\u7684\u65f6\u95f4\u95f4\u9694\u5373\u53ef\uff0c\u5355\u4f4d\u662f\u79d2\uff0c\u6bd4\u5982\uff1apause = 0.03\uff0c\u8868\u793a 30 ms\uff0c\u76f8\u5f53\u4e8e\u5e27\u7387\u4e3a 30 \u5e27\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-opencv","title":"3\u3001\u4e0d\u4f9d\u8d56 OpenCV \u7684\u56fe\u50cf\u8bc6\u522b\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31","title":"3.1\u3001\u81ea\u7814\u56fe\u50cf\u8bc6\u522b\u6280\u672f","text":"\u3010\u539f\u7406\u3011 \u4e3a\u4e86\u5b9e\u73b0\u8bc6\u522b\u56fe\u50cf\u7684\u76ee\u7684\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u5c06\u56fe\u7247\u7684\u6bcf\u4e2a\u50cf\u7d20\u7684RGB\u503c\uff0c\u4e0e\u6574\u4e2a\u5c4f\u5e55\u4e2d\u7684RGB\u8fdb\u884c\u5bf9\u6bd4\uff0c\u5982\u679c\u5c0f\u56fe\u4e0a\u7684RGB\u503c\u4e0e\u5bf9\u5e94\u5927\u56fe\u4f4d\u7f6e\u7684RGB\u90fd\u76f8\u7b49\uff0c\u5219\u5339\u914d\u6210\u529f\uff0c\u5373\u53ef\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u70b9\u3002 1\u3001\u8bfb\u53d6\u5c0f\u56fe\u548c\u5927\u56fe\u7684RGB\u503c \uff081\uff09\u5c0f\u56fe\u7684RGB\u503c small_data = small_pic.load() # load()\u4f1a\u5c06\u56fe\u7247\u7684RGB\u503c\u83b7\u53d6\u5230\uff0c\u6570\u636e\u683c\u5f0f\u4e3a\u4e00\u4e2a\u4e8c\u7ef4\u5217\u8868\uff0c\u8d4b\u503c\u7ed9\u4e00\u4e2a\u53d8\u91cfsmall_data\u3002\n \uff082\uff09\u5927\u56fe\u7684RGB\u503c big_data = big_pic.load()\n 2\u3001\u5c06\u5c0f\u56fe\u4e0e\u5927\u56fe\u7684RGB\u503c\u8fdb\u884c\u5339\u914d \uff081\uff09\u5339\u914d\u4ece\u5927\u56fe\u7684\u5750\u6807\uff080\uff0c0\uff09\u5f00\u59cb\u5339\u914d\uff0c\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff082\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\uff080\uff0c0\uff09\u5bf9\u5e94\u7684\u6240\u6709\u5c0f\u56fe\u7684RGB\u503c\u4e0d\u76f8\u7b49\uff0c\u5219\u79fb\u52a8\u5230\u4e0b\u4e00\u4e2a\u5750\u6807\u70b9\uff081\uff0c0\uff09\uff0c\u540c\u6837\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b \uff083\uff09\u6309\u7167\u8fd9\u6837\u7684\u89c4\u5f8b\u5c06\u8fd9\u4e00\u884c\u6bcf\u79fb\u52a8\u4e00\u4e2a\u5750\u6807\u70b9\uff0c\u90fd\u5c06\u5c0f\u56fe\u6240\u6709\u7684RGB\u4e0e\u5bf9\u5e94\u5927\u56fe\u7684\u503c\u8fdb\u884c\u5339\u914d\uff1b \uff084\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\u5176\u4e2d\u4e00\u4e2a\u5750\u6807\u70b9\u4e0a\u5339\u914d\u5230\u4e86\u5c0f\u56fe\u7684\u6240\u6709RGB\u503c\uff0c\u5219\u6b64\u65f6\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\u70b9\uff1b \uff085\uff09\u5982\u679c\u5339\u914d\u4e86\u5927\u56fe\u6240\u6709\u7684\u5750\u6807\u70b9\uff0c\u90fd\u6ca1\u6709\u5339\u914d\u5230\uff0c\u5219\u8bf4\u660e\u5927\u56fe\u4e2d\u4e0d\u5b58\u5728\u5c0f\u56fe\uff0c\u5339\u914d\u5931\u8d25\uff1b \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 class ImageRgb:\n@staticmethod\ndef _check_match(_x, _y, small, bdata, sdata, rate):\n\"\"\"\n Matching degree of small graph and large graph matching\n \"\"\"\n@staticmethod\ndef _pre_random_point(small):\n\"\"\"\n Pre matching, take 10-20 points at random each time,\n and take coordinates randomly in the small graph\n \"\"\"\n@staticmethod\ndef _pre_random_match(_x, _y, point_list, bdata, sdata, rate):\n\"\"\"\n In the small graph, several points are randomly\n selected for matching, and the matching degree is\n also set for the random points\n \"\"\"\n@classmethod\ndef match_image_by_rgb(cls, image_name=None, image_path=None, rate=0.9):\n\"\"\"\n By comparing the RGB values of the small image with the large\n image on the screen, the coordinates of the small image on\n the screen are returned.\n \"\"\"\n \u901a\u8fc7 match_image_by_rgb() \u8fd9\u4e2a\u51fd\u6570\uff0c\u4f20\u5165\u76ee\u6807\u5c0f\u56fe\u7684\u6587\u4ef6\u540d\u79f0\uff0c\u5373\u53ef\u8fd4\u56de\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u3002 \u6709\u540c\u5b66\u8981\u95ee\u4e86\uff0c\u6709 OpenCV \u5e72\u561b\u4e0d\u7528\uff0c\u6709\u5fc5\u8981\u81ea\u5df1\u5b9e\u73b0\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u529f\u80fd\u5417\uff0c\u4f60\u4eec\u662f\u4e0d\u662f\u95f2\u7684\u554a\uff1f \u8fd9\u4e48\u95ee\u7684\u8bdd\uff0c\u5c0f\u4e86\uff0c\u683c\u5c40\u5c0f\u4e86\uff1b\u6211\u4eec\u81ea\u5df1\u5b9e\u73b0\u4e3b\u8981\u6709\u51e0\u65b9\u9762\u539f\u56e0\uff1a \u51cf\u5c11\u73af\u5883\u4f9d\u8d56\uff0c\u5373\u4e0d\u7528\u5b89\u88c5 OpenCV\uff0c\u6211\u4eec\u4e5f\u80fd\u5b9e\u73b0\u5176\u529f\u80fd\uff0c\u73af\u5883\u4f9d\u8d56\u8fd9\u5757\u540e\u9762\u4f1a\u5355\u72ec\u8be6\u7ec6\u8bb2\uff0c\u51cf\u5c11\u73af\u5883\u4f9d\u8d56\u5bf9\u4e8e\u4efb\u4f55\u8f6f\u4ef6\u5de5\u7a0b\u90fd\u975e\u5e38\u91cd\u8981\uff1b OpenCV \u5728\u5176\u4ed6\u56fd\u4ea7 CPU \u67b6\u6784\u4e0a\u5b89\u88c5\u5e76\u4e0d\u80fd\u4fdd\u8bc1100%\u6210\u529f\uff0c\u751a\u81f3\u6709\u6ca1\u6709\u53ef\u80fd\u5728\u4e00\u4e9b\u67b6\u6784\u4e0a\u538b\u6839\u513f\u5c31\u4e0d\u80fd\u5b89\u88c5\u4f7f\u7528 OpenCV \uff1f \u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 OpenCV \uff1f\u5c31\u50cf\u6709\u6ca1\u6709\u53ef\u80fd\u6709\u4e00\u5929\u56fd\u5185\u65e0\u6cd5\u4f7f\u7528 Windows \u5462\uff1f\u8fd9\u4e9b\u95ee\u9898\u503c\u5f97\u601d\u8003\u3002 \u5f53\u7136\uff0c\u6211\u4eec\u627f\u8ba4\u8fd9\u5957\u65b9\u6848\uff0c\u867d\u7136\u8bc6\u522b\u51c6\u786e\u7387\u6ca1\u95ee\u9898\uff0c\u4f46\u5728\u8bc6\u522b\u6548\u7387\u4e0a\u8fd8\u6ca1\u6709\u8fbe\u5230 OpenCV \u6a21\u677f\u5339\u914d\u7684\u6548\u679c\uff0c\u6211\u4eec\u7684\u65b9\u6848\u6bcf\u6b21\u8bc6\u522b\u5728 1.5s \u5de6\u53f3\uff0c\u800c OpenCV \u5728 1s \u5de6\u53f3\uff1b \u6574\u4f53\u8bc6\u522b\u6548\u679c\u6765\u8bb2\uff0c\u6211\u8ba4\u4e3a\u8fd8\u662f\u53ef\u4ee5\u63a5\u53d7\u7684\uff0c\u4e5f\u5e0c\u671b\u6709\u5fd7\u4e4b\u58eb\u80fd\u4e00\u8d77\u4f18\u5316\u6b64\u65b9\u6848\uff0c\u4e00\u8d77\u6280\u672f\u62a5\u56fd\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32-rpc","title":"3.2\u3001\u57fa\u4e8e RPC \u670d\u52a1\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b","text":"\u5728\u8fdc\u7a0b\u670d\u52a1\u5668\u4e0a\u90e8\u7f72 OpenCV \u7684\u73af\u5883\uff0c\u5e76\u5c06\u5176\u90e8\u7f72\u4e3a RPC \u670d\u52a1\uff0c\u6d4b\u8bd5\u673a\u4e0a\u4e0d\u7528\u5b89\u88c5 OpenCV \u4f9d\u8d56\uff0c\u800c\u662f\u901a\u8fc7\u8bf7\u6c42 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b \u3010\u539f\u7406\u3011 \u6d4b\u8bd5\u673a\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u56fe\u7247\u4ee5\u53ca\u6a21\u677f\u56fe\u7247\uff0c\u53d1\u9001\u7ed9 RPC \u670d\u52a1\u7aef\uff0c\u670d\u52a1\u7aef\u62ff\u5230\u4e24\u5f20\u56fe\u7247\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u6700\u540e\u5c06\u8bc6\u522b\u7ed3\u679c\u8fd4\u56de\u7ed9\u6d4b\u8bd5\u673a\uff1b \u8981\u7279\u6b8a\u8bf4\u660e\u7684\u662f\uff1a RPC \u662f\u4e00\u79cd\u534f\u8bae\uff0c\u8bb8\u591a\u8bed\u8a00\u90fd\u662f\u652f\u6301\u7684\uff0c\u6bd4\u5982\u8bf4\u670d\u52a1\u7aef\u4e5f\u53ef\u4ee5\u7528 C++ \u6765\u5b9e\u73b0\uff0c\u5ba2\u6237\u7aef\u4f7f\u7528 Python \u4e5f\u662f\u53ef\u4ee5\u8c03\u7528\u7684\u3002 \u3010\u4ee3\u7801\u5b9e\u73b0\u3011 \u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nimport cv2 as cv\nimport numpy as np\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\nif __name__ == \"__main__\":\nserver = ThreadXMLRPCServer((\"x.x.x.x\", 8889), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(match_image_by_opencv, \"match_image_by_opencv\")\nserver.serve_forever()\n \u8fd9\u6837\uff0c\u6211\u4eec\u57fa\u4e8e Python \u6807\u51c6\u5e93 xmlrpc \u642d\u5efa\u4e86\u4e00\u4e2a RPC \u670d\u52a1\u5668\uff0c\u6ce8\u518c\u4e86 image_put \u548c match_image_by_opencv \u4e24\u4e2a\u529f\u80fd\u63a5\u53e3\uff0c\u5728\u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u901a\u8fc7 IP \u548c\u7aef\u53e3\u8fdb\u884c RPC \u8bf7\u6c42\uff1b \u5ba2\u6237\u7aef\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from xmlrpc.client import Binary\nfrom xmlrpc.client import ServerProxy\nserver = ServerProxy(GlobalConfig.OPENCV_SERVER_HOST, allow_none=True)\nscreen_rb = open(screen, \"rb\")\ntemplate_rb = open(template_path, \"rb\")\ntry:\nscreen_path = server.image_put(Binary(screen_rb.read()))\nscreen_rb.close()\ntpl_path = server.image_put(Binary(template_rb.read()))\ntemplate_rb.close()\nreturn server.match_image_by_opencv(\ntpl_path, screen_path, rate, multiple\n)\nexcept OSError as exc:\nraise EnvironmentError(\nf\"RPC\u670d\u52a1\u5668\u94fe\u63a5\u5931\u8d25. {GlobalConfig.OPENCV_SERVER_HOST}\"\n) from exc\n \u901a\u8fc7\u8fd4\u56de server.match_image_by_opencv \u5c31\u83b7\u53d6\u4e86\u5728\u670d\u52a1\u7aef\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4","title":"4\u3001\u53f3\u952e\u83dc\u5355\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41","title":"4.1\u3001\u53f3\u952e\u83dc\u5355\u5b9a\u4f4d\u7684\u65b9\u6848\u53ca\u95ee\u9898","text":"\u53f3\u952e\u83dc\u5355\u7684\u5143\u7d20\u5b9a\u4f4d\u662f\u4e00\u4e2a\u96be\u70b9\uff0c\u8fc7\u53bb\u6211\u4eec\u8c03\u7814\u548c\u4f7f\u7528\u8fc7\u7684\u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u65b9\u6cd5\u6709 4 \u79cd\uff1a \u7b2c\u4e00\u79cd\uff1a\u6b65\u957f\u64cd\u4f5c\u6cd5 \u5728\u53f3\u952e\u83dc\u5355\u547c\u51fa\u6765\u4e4b\u540e\uff0c\u901a\u8fc7\u952e\u76d8\u7684 up\u3001down \u6309\u952e\uff0c\u8fdb\u884c\u9009\u62e9\u83dc\u5355\u9009\u62e9\uff0c\u9009\u4e2d\u76ee\u6807\u4e4b\u540e enter \u5373\u53ef\uff1b\u6bd4\u5982\uff1a\u5728\u684c\u9762\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\uff0c\u6309 1 \u6b21 down \uff0c\u4f1a\u51fa\u73b0\u4e0b\u56fe\uff1a \u7ee7\u7eed\u518d\u6309 2 \u6b21 down\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u518d\u6309 enter\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a \u5982\u6b64\uff0c\u201c\u6392\u5e8f\u65b9\u5f0f\u201d\u7684\u6b65\u957f\u4e3a 3\uff1b\u901a\u8fc7\u4f7f\u7528\u952e\u76d8\u4e0a\u4e0b\u952e\uff0c\u5c31\u5b9e\u73b0\u4e86\u5bf9\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\uff1b \u4f46\u662f\uff0c\u8fd9\u79cd\u65b9\u5f0f\u6709\u4e2a\u5f88\u70e6\u4eba\u7684\u95ee\u9898\uff0c\u5c31\u662f\u53f3\u952e\u83dc\u5355\u7684\u9009\u9879\u4f4d\u7f6e\u4e0d\u53ef\u80fd\u4e00\u76f4\u4e0d\u53d8\uff0c\u5728\u9700\u6c42\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\uff0c\u83dc\u5355\u9009\u9879\u7684\u53d8\u5316\u662f\u5f88\u5927\u7684\uff0c\u751a\u81f3\u6709\u4e9b\u5e94\u7528\u652f\u6301\u81ea\u5b9a\u4e49\u83dc\u5355\uff0c\u6bd4\u5982\u6587\u7ba1\u53f3\u952e\u83dc\u5355\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff1b \u4e5f\u5c31\u662f\u8bf4\u4f60\u5f97\u7ecf\u5e38\u53bb\u7ef4\u62a4\u83dc\u5355\u9009\u9879\u7684\u6b65\u957f\uff0c\u4e00\u4e2a\u9009\u9879\u73b0\u5728\u7684\u6b65\u957f\u662f 3\uff0c\u4e0b\u4e2a\u8fed\u4ee3\u53ef\u80fd\u5c31\u662f 4 \u6216\u8005 5\u3002 \u7b2c\u4e8c\u79cd\uff1a\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u6cd5 \u628a\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5355\u72ec\u622a\u56fe\u4fdd\u5b58\uff0c\u56fe\u7247\u4e2d\u4ec5\u5305\u542b\u4e00\u4e2a\u83dc\u5355\u9009\u9879\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u8fd9\u6837\uff0c\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5c31\u53ef\u4ee5\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u65b9\u5f0f\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b \u8fd9\u79cd\u65b9\u5f0f\u4e0d\u7528\u62c5\u5fc3\u83dc\u5355\u9009\u9879\u7684\u987a\u5e8f\u6216\u4f4d\u7f6e\uff0c\u4f46\u662f\u9700\u8981\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff0c\u4e14\u5bb9\u6613\u53d7\u5230\u5b57\u4f53 UI \u53d8\u66f4\u7c7b\u9700\u6c42\u7684\u5f71\u54cd\uff0c\u6bd4\u5982\uff1a\u5b57\u4f53\u5927\u5c0f\u3001\u5b57\u4f53\u95f4\u8ddd\u7b49\u7b49\u9700\u6c42\u53d8\u66f4\u90fd\u4f1a\u5f71\u54cd\uff0c\u6bcf\u6b21\u53d8\u66f4\u4e4b\u540e\u5c31\u9700\u8981\u8fdb\u884c\u5927\u91cf\u56fe\u7247\u8d44\u6e90\u7684\u91cd\u65b0\u622a\u56fe\u66ff\u6362\uff0c\u662f\u4e2a\u6bd4\u8f83\u9ebb\u70e6\u7684\u4e8b\u60c5\uff1b \u7b2c\u4e09\u79cd\uff1a\u76f8\u5bf9\u4f4d\u79fb\u6cd5 \u9f20\u6807\u70b9\u51fb\u53f3\u952e\u7684\u65f6\u5019\uff0c\u9f20\u6807\u7684\u5f53\u524d\u5750\u6807\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u7684\uff0c\u83dc\u5355\u9009\u9879\u7684\u5bbd\uff08 w \uff09\u4e00\u822c\u662f\u56fa\u5b9a\u7684\uff0c\u53d8\u5316\u7684\u662f\u83dc\u5355\u7684\u957f\u5ea6\uff08 h \uff09\uff0c\u53ef\u4ee5\u901a\u8fc7\u67d0\u4e2a\u9009\u9879\u76f8\u5bf9\u4e8e\u9f20\u6807\u7684\u8ddd\u79bb\u5728\u786e\u5b9a\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u901a\u8fc7\u7ef4\u62a4\u83dc\u5355\u9009\u9879\uff08\u76f8\u5bf9\u4f4d\u7f6e\uff09\u76f8\u5bf9\u4e8e\u9f20\u6807\u4f4d\u7f6e\u7684\u8ddd\u79bb\uff0c\u5373\u53ef\u8f7b\u677e\u8ba1\u7b97\u51fa\u83dc\u5355\u9009\u9879\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\u3002 \u4ece\u7406\u8bba\u4e0a\u6b64\u65b9\u6848\u662f\u53ef\u884c\u7684\uff0c\u4f46\u662f\u8fd9\u91cc\u4ecd\u7136\u5b58\u5728\u4e24\u4e2a\u4e25\u91cd\u7684\u95ee\u9898\uff1a \u83dc\u5355\u987a\u5e8f\u6539\u53d8\uff0c\u5bfc\u81f4\u76f8\u5bf9\u8ddd\u79bb\u6539\u53d8\uff0c\u800c\u4e14\u8ddd\u79bb\u662f\u901a\u8fc7\u50cf\u7d20\uff08px\uff09\u6765\u8868\u793a\u7684\uff0c\u4e0d\u60f3\u6b65\u957f\u90a3\u4e48\u53ea\u7ba1\uff0c\u6bcf\u6b21\u9700\u8981\u53bb\u91cf\u4e00\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u70b9\u9ebb\u70e6\uff1b \u9f20\u6807\u5728\u684c\u9762\u4e0d\u540c\u4f4d\u7f6e\u70b9\u51fb\u53f3\u952e\uff0c\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u4f4d\u7f6e\u662f\u4e0d\u540c\u7684\uff0c\u4e0a\u56fe\u7684\u83dc\u5355\u662f\u5728\u9f20\u6807\u7684\u5de6\u4e0b\u65b9\uff0c\u5982\u679c\u4f60\u79fb\u52a8\u9f20\u6807\u5230\u5c4f\u5e55\u56db\u8fb9\uff0c\u4f60\u4f1a\u53d1\u73b0\uff0c\u53f3\u952e\u83dc\u5355\u53ef\u80fd\u51fa\u73b0\u5728\u9f20\u6807\u7684\u56db\u4e2a\u65b9\u5411\uff0c\u4e5f\u5c31\u662f\u8bf4\u4f60\u9700\u8981\u6839\u636e\u9f20\u6807\u7684\u4e0d\u540c\u4f4d\u7f6e\u6765\u5224\u65ad\u53f3\u952e\u83dc\u5355\u51fa\u73b0\u7684\u65b9\u5411\uff0c\u800c\u4e0d\u540c\u7684\u65b9\u5411\u4e0a\u8ba1\u7b97\u65b9\u6cd5\u662f\u4e0d\u540c\u7684\uff0c\u6bd4\u5982\uff1a\u53f3\u952e\u83dc\u5355\u5728\u9f20\u6807\u7684\u5de6\u4e0a\uff0c\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\u8ba1\u7b97\u65b9\u6cd5\u4e3a\uff08x - w / 2\uff0c y - h\uff09\uff0c\u8fd9\u6837\u7ef4\u62a4\u8d77\u6765\u53ef\u4ee5\u8bf4\u975e\u5e38\u590d\u6742\uff1b \u57fa\u4e8e\u4ee5\u4e0a\u4e24\u4e2a\u539f\u56e0\uff0c\u6211\u4eec\u5e76\u4e0d\u63a8\u8350\u8fd9\u79cd\u64cd\u4f5c\u65b9\u6848\u3002 \u7b2c\u56db\u79cd\uff1a\u5c5e\u6027\u5b9a\u4f4d \u6709\u540c\u5b66\u8bf4\u5e72\u561b\u4e0d\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u5462\uff0c\u5176\u5b9e\uff0c\u6211\u4eec\u6700\u5f00\u59cb\u60f3\u5230\u7684\u65b9\u6848\u5c31\u662f\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\uff0c\u4f46\u662f\u5728\u5c5e\u6027\u7684 DOM \u6811\u91cc\u600e\u4e48\u4e5f\u627e\u4e0d\u5230\uff0c\u65e0\u6cd5\u5b9a\u4f4d\u5230\uff0c\u6211\u4eec\u4e5f\u8054\u5408\u7814\u53d1\u540c\u5b66\u4e00\u8d77\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u4f46\u6700\u7ec8\u8fd8\u662f\u6ca1\u80fd\u89e3\u51b3\uff0c\u975e\u5e38\u9057\u61be\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42","title":"4.2\u3001\u6700\u65b0\u7684\u53f3\u952e\u83dc\u5355\u7ec8\u6781\u89e3\u51b3\u65b9\u6848","text":"\u7531\u4e8e\u53f3\u952e\u83dc\u5355\u9009\u9879\u51e0\u4e4e\u90fd\u662f\u6587\u672c\uff0c\u90a3\u4e48\u901a\u8fc7 OCR \u8bc6\u522b\uff0c\u51e0\u4e4e\u662f\u6700\u4f18\u7684\u65b9\u6848\uff1a \u4e0d\u7528\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff1b \u4e0d\u4f1a\u53d7\u5230\u83dc\u5355\u9009\u9879\u987a\u5e8f\u6539\u53d8\u7684\u5f71\u54cd\uff1b \u4e0d\u4f1a\u53d7\u5230\u5b57\u4f53 UI \u53d8\u5316\u7684\u5f71\u54cd\uff1b \u5173\u4e8e OCR \u8bc6\u522b\u6211\u4eec\u5728\u540e\u9762\u4f1a\u8be6\u7ec6\u8bb2\u5230\uff0c\u672c\u7ae0\u8282\u4e3b\u8981\u8bb2\u57fa\u4e8e OCR \u8bc6\u522b\uff0c\u6211\u4eec\u5728\u53f3\u952e\u83dc\u5355\u8bc6\u522b\u4e0a\u7684\u7a81\u7834\u548c\u521b\u65b0\uff1b \u4f7f\u7528 OCR \u8bc6\u522b\u53f3\u952e\u83dc\u5355\u867d\u7136\u5df2\u7ecf\u5f88\u5b8c\u7f8e\u4e86\uff0c\u4f46\u662f\u5728\u4e00\u4e9b\u60c5\u51b5\u4e0b\u4ecd\u7136\u5b58\u5728\u4e00\u70b9\u95ee\u9898\uff0c\u5c31\u662f\u5c4f\u5e55\u4e2d\u51fa\u73b0\u591a\u4e2a\u548c\u83dc\u5355\u9009\u9879\u6587\u5b57\u76f8\u540c\u7684\u6587\u5b57\u65f6\uff0c\u6bd4\u5982\u4e0b\u9762\u8fd9\u79cd\u60c5\u51b5\uff1a \u5c4f\u5e55\u6070\u597d\u51fa\u73b0\u4e86\u4e24\u4e2a\u201c\u590d\u5236\u201d\uff0c\u6b64\u65f6\u8981\u5b9a\u4f4d\u5230\u83dc\u5355\u4e2d\u7684 \u201c\u590d\u5236\u201d\uff0c\u5c31\u9700\u8981\u8fdb\u4e00\u6b65\u505a\u6570\u636e\u5904\u7406\uff0c\u6bd4\u5982\uff1aOCR \u8fd4\u56de 2 \u4e2a\u201c\u590d\u5236\u201d\u7684\u5750\u6807\uff0c\u7528\u4f8b\u91cc\u9762\u6765\u5224\u65ad\u7528\u54ea\u4e2a\uff0c\u4ece\u4e1a\u52a1\u4e0a\u5c06\u5904\u7406\u8d77\u6765\u6bd4\u8f83\u9ebb\u70e6\uff0c\u56e0\u4e3a\u4f60\u5f97\u660e\u786e\u77e5\u9053\u83dc\u5355\u5728\u5de6\u8fb9\u8fd8\u662f\u53f3\u8fb9\uff0c\u7136\u540e\u8fd9\u672c\u8eab\u5c31\u662f\u4e0d\u786e\u5b9a\u7684\uff1b \u600e\u4e48\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u5462\uff0c\u8fd9\u5c31\u8981\u8bf4\u9053\u672c\u7ae0\u7684\u4e3b\u9898\uff1a\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b\u3002 \u3010\u539f\u7406\u3011 \u5728\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u524d\u622a\u4e00\u5f20\u56fe\uff0c\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\u518d\u622a\u53d6\u4e00\u5f20\u56fe\uff0c\u4e24\u5f20\u56fe\u552f\u4e00\u53d8\u5316\u7684\u5c31\u662f\u53f3\u952e\u83dc\u5355\uff0c\u5c06\u5176\u4ed6\u76f8\u540c\u7684\u5730\u65b9\u90fd\u5c4f\u853d\u6389\uff0c\u53ea\u7559\u4e0b\u83dc\u5355\u754c\u9762\uff0c\u5982\u6b64\u5373\u53ef\u6d88\u9664\u5e72\u6270\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a \u5c06\u4e24\u79cd\u56fe\u505a\u524d\u540e\u5bf9\u6bd4\u63d0\u53d6\u53ef\u4ee5\u5f97\u5230\u8fd9\u6837\u7684\u56fe\uff1a \u4f60\u770b\uff0c\u901a\u8fc7\u524d\u540e\u56fe\u7247\u7684\u5bf9\u6bd4\uff0c\u5c06\u76f8\u540c\u7684\u90e8\u5206\u7ed9\u6d88\u9664\u6389\uff0c\u518d\u8fdb\u884c OCR \u8bc6\u522b\uff0c\u8fd9\u6837\u5c31\u4e0d\u4f1a\u6709\u5e72\u6270\u4e86\uff1b \u4ee3\u7801\u5b9e\u73b0\u8bf7\u67e5\u770b src/filter_image.py \uff1b \u4ee3\u7801\u793a\u4f8b\uff1a def filter_image(action):\n\"\"\"\n \u5bf9\u6bd4\u52a8\u4f5c\u524d\u540e\u4e24\u5f20\u56fe\u7247\uff0c\u63d0\u53d6\u4e0d\u540c\u7684\u90e8\u5206\u751f\u6210\u4e00\u5f20\u65b0\u7684\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u65b0\u56fe\u7247\u7684\u8def\u5f84\n :param action: \u52a8\u4f5c\u51fd\u6570\u7684\u51fd\u6570\u5bf9\u8c61\n :return: \u65b0\u56fe\u7247\u7684\u8def\u5f84\n \"\"\"\n action \u662f\u9f20\u6807\u4e8b\u4ef6\uff0c\u56e0\u4e3a\u6b64\u7c7b\u573a\u666f\u4e0d\u4ec5\u4ec5\u5728\u53f3\u952e\u5b58\u5728\uff0c\u5355\u51fb\u3001\u53cc\u51fb\u7b49\u7b49\uff0c\u53ea\u8981\u64cd\u4f5c\u524d\u540e\u540e\u53d8\u5316\u7684\u90fd\u53ef\u4ee5\uff1a from src.mouse_key import MouseKey\naction = (\nMouseKey.click,\nMouseKey.right_click,\nMouseKey.double_click,\nMouseKey.move_to,\n)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5","title":"5\u3001\u52a8\u6001\u56fe\u50cf\u8bc6\u522b","text":"\u3010\u80cc\u666f\u3011 \u5728\u684c\u9762\u58c1\u7eb8\u5207\u6362\uff0c\u6216\u770b\u56fe\u3001\u76f8\u518c\u5207\u6362\u56fe\u7247\u7c7b\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u7531\u4e8e\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u662f\u4e0d\u56fa\u5b9a\u7684\uff08\u4e0d\u540c\u7248\u672c\u7684\u7cfb\u7edf\u58c1\u7eb8\u4e0d\u540c\u3001\u58c1\u7eb8\u987a\u5e8f\u4e0d\u540c\uff0c\u770b\u56fe\u76f8\u518c\u5728\u56fe\u7247\u8d44\u6e90\u4e0d\u4e00\u5b9a\u56fa\u5b9a\uff09\uff0c\u90a3\u4e48\u5728\u6d4b\u8bd5\u5207\u6362\u58c1\u7eb8\u6216\u8005\u5207\u6362\u56fe\u7247\u7684\u573a\u666f\u65f6\u5c31\u4f1a\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u4f60\u4e0d\u77e5\u9053\u9884\u671f\u662f\u5565\uff0c\u7528\u4f8b\u64cd\u4f5c\u52a8\u6001\u7684\uff0c\u4e5f\u662f\u6781\u4e0d\u7a33\u5b9a\u3002 \u3010\u539f\u7406\u3011 \u5728\u5207\u6362\u56fe\u7247\u4e4b\u524d\u622a\u56fe\u4fdd\u5b58\u5e76\u8fd4\u56de\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u6b21\u8bc6\u522b\u8fd9\u5f20\u56fe\u7247\uff0c\u5982\u679c\u4e0d\u5b58\u5728\uff0c\u8bf4\u660e\u56fe\u7247\u5df2\u7ecf\u5207\u6362\u4e86\uff1b \u793a\u610f\u56fe\uff1a \u8fd9\u6837\uff0c\u6211\u4eec\u622a\u53d6\u4e86\u5f53\u524d\u56fe\u7247\u4e2d\u6bd4\u8f83\u6709\u4ee3\u8868\u6027\u7684\u4f4d\u7f6e\uff08\u4e00\u53ea\u9e1f\uff09\uff0c\u5728\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u7528\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1a \u6211\u4eec\u518d\u62ff\u7740\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd9\u6837\u5728\u5f53\u524d\u56fe\u7247\u4e2d\uff0c\u5c31\u4e0d\u80fd\u627e\u5230\u8fd9\u53ea\u9e1f\u4e86\uff0c\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u662f False\uff0c\u90a3\u4e48\u4e5f\u5c31\u53ef\u4ee5\u5224\u65ad\u56fe\u7247\u5207\u6362\u662f\u6210\u529f\u7684\u3002 \u4ee3\u7801\u793a\u610f\uff1a def save_temporary_picture(_x: int, _y: int, width: int, height: int):\n\"\"\"\n \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u56fe\u7247\u8def\u5f84\n :param x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n :param y: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n :param width: \u5bbd\u5ea6\n :param height: \u9ad8\u5ea6\n :return: \u56fe\u7247\u8def\u5f84\n \"\"\"\n \u6b64\u51fd\u6570\u7528\u4e8e\u5728\u64cd\u4f5c\u4e4b\u524d\u622a\u56fe\u4e00\u5f20\u4e34\u65f6\u56fe\u7247\uff0c\u8fd4\u56de\u56fe\u7247\u8def\u5f84\uff0c\u6700\u540e\u5728\u65ad\u8a00\u7684\u65f6\u5019\u518d\u5c06\u56fe\u7247\u8def\u5f84\u4f5c\u4e3a\u53c2\u6570\u4f20\u5165\u65ad\u8a00\u8bed\u53e5\u5373\u53ef\uff1b \u4ee3\u7801\u793a\u4f8b\uff1a "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ui","title":"\u4e09\u3001\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_1","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u662f\u6211\u4eec\u81ea\u7814\u7684\u4e00\u79cd\u4f7f\u7528\u7b80\u5355\uff0c\u4e14\u6548\u7387\u6781\u9ad8\u3001\u7a33\u5b9a\u6027\u597d\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u57fa\u4e8e\u5143\u7d20\u6309\u94ae\u5728\u5e94\u7528\u4e2d\u7684\u76f8\u5bf9\u4f4d\u7f6e\uff0c\u52a8\u6001\u83b7\u53d6\u5143\u7d20\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff0c\u9002\u7528\u4e8e\u5404\u79cd\u5c4f\u5e55\u5206\u8fa8\u7387\uff08\u5305\u62ec\u9ad8\u5206\u5c4f\u3001\u5bbd\u5c4f\u3001\u5e26\u9c7c\u5c4f\uff09\uff0c\u5f53\u5143\u7d20\u6309\u94ae\u4f4d\u7f6e\u76f8\u5bf9\u4e8e\u5e94\u7528\u754c\u9762\u4f4d\u7f6e\u53d1\u751f\u4fee\u6539\u4e4b\u540e\uff0c\u53ea\u9700\u8981\u6839\u636e UI \u8bbe\u8ba1\u56fe\u4e0a\u7684\u6e90\u6570\u636e\u4fee\u6539\u5bf9\u5e94\u5750\u6807\u6570\u636e\u5c31\u597d\uff0c\u7ef4\u62a4\u975e\u5e38\u7684\u65b9\u4fbf\u3002 \u6b64\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u9002\u7528\u4e8e\u4e00\u4e9b\u5143\u7d20\u4f4d\u7f6e\u76f8\u5bf9\u4e0e\u5e94\u7528\u754c\u9762\u6bd4\u8f83\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u97f3\u4e50\uff0899% \u7684\u5143\u7d20\u5b9a\u4f4d\u91c7\u7528\u8fd9\u79cd\uff0c\u6548\u679c\u975e\u5e38\u597d\uff09\uff0c\u4e0d\u9002\u7528\u4e8e\u754c\u9762\u4e0d\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u622a\u56fe\u5f55\u5c4f\uff0c\u5f88\u660e\u663e\u4e0d\u9002\u7528\u4e8e\u8fd9\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u3002\u8fd9\u79cd\u5168\u65b0\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u6709\u5b83\u7684\u9002\u7528\u6761\u4ef6\uff0c\u5982\u679c\u4f60\u53d1\u73b0\u4f7f\u7528\u5e38\u89c4\u7684\uff08\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u5b9a\u4f4d\uff09\u4e0d\u597d\u505a\u65f6\uff0c\u4e0d\u59a8\u8003\u8651\u4f7f\u7528\u8fd9\u79cd\uff0c\u5176\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff0c\u5e76\u4e14\u8fc5\u901f\u7231\u4e0a\u4ed6\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_1","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5728 UI \u8bbe\u8ba1\u56fe\u4e2d\u6211\u4eec\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u8fb9\u6846\u7684\u8ddd\u79bb\u7684\uff0c\u7136\u540e\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u6280\u672f\u624b\u6bb5\u83b7\u53d6\u5230\u5e94\u7528\u754c\u9762\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u53ca\u5e94\u7528\u7a97\u53e3\u7684\u5927\u5c0f\uff0c\u793a\u610f\u56fe\u5982\u4e0b\uff1a \uff08x1, y1\uff09\u4e3a\u5e94\u7528\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\uff1b\uff08x2, y2\uff09\u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u5de6\u4e0a\u89d2\uff08x1, y1\uff09\u7684\u5750\u6807\uff0c\u90a3\u4e48\u5b9e\u9645\u4e0a\u3010\u64ad\u653e\u6240\u6709\u3011\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\u4e3a\uff1a\uff08 x1 + x2, y1 + y2 \uff09\uff1b \u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5927\u5c0f\uff08w2, h2\uff09\uff0c\u53ef\u4ee5\u4ece UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\uff1b \u5728 UI \u8bbe\u8ba1\u7a3f\u4e0a\u70b9\u51fb\u3010\u64ad\u653e\u6240\u6709\u3011\u56fe\u6807\uff0c\u7136\u540e\u79fb\u52a8\u9f20\u6807\u5c31\u5c31\u53ef\u4ee5\u770b\u5230\u4e0a\u56fe\u7684\u53c2\u8003\u7ebf\u53ca\u6570\u636e\uff1b \u6240\u4ee5\uff0c\u6211\u4eec\u53ef\u4ee5\u8f7b\u677e\u7684\u83b7\u53d6\u5230\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u4e2d\u5fc3\u5750\u6807\u4e3a\uff1a\uff08 x1 + x2 + (w2 / 2), y1 + y2 + ( h2 / 2) \uff09 \u8be6\u7ec6\u6e90\u4ee3\u7801\u8bf7\u67e5\u770b AT \u57fa\u7840\u6846\u67b6: src/button_center.py \u83b7\u53d6\u5e94\u7528\u7a97\u53e3\u7684\u4fe1\u606f \u4f7f\u7528 xdotool \u548c xwininfo \u83b7\u53d6\u5230\u5e94\u7528\u7a97\u53e3\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u5de6\u4e0a\u89d2\uff09\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a app_id = CmdCtl.run_cmd(f\"xdotool search --classname --onlyvisible {self.app_name}\"\n).split(\"\\n\")\napp_id_list = [int(_id) for _id in app_id if _id]\nreturn CmdCtl.run_cmd(f\"xwininfo -id {app_id_list[self.number]}\")\n \u4f7f\u7528\u6b63\u5219\u83b7\u53d6\u7a97\u53e3\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u83b7\u53d6\u914d\u7f6e \u8bfb ini \u914d\u7f6e\u6587\u4ef6\uff0c\u83b7\u53d6\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e0e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002 \u4ee3\u7801\u793a\u4f8b\uff1a conf = ConfigParser()\nconf.read(self.config_path)\ndirection = conf.get(btn_name, \"direction\")\nposition = [int(i.strip()) for i in conf.get(btn_name, \"location\").split(\",\")]\n \u8ba1\u7b97\u5143\u7d20\u6309\u94ae\u5750\u6807 \u6839\u636e\u5e94\u7528\u7a97\u53e3\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u5927\u5c0f\u3001\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u5927\u5c0f\uff0c\u4f7f\u7528\u4e00\u5b9a\u7684\u7b97\u6cd5\u5373\u53ef\u8ba1\u7b97\u51fa\u5143\u7d20\u6309\u94ae\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u4e2d\u5fc3\u5750\u6807\uff09\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3","title":"3\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u3010\u914d\u7f6e\u65b9\u6cd5\u3011 \u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u7684\u6570\u636e\u6e90\u662f\u5e94\u7528\u5e93\u4e2d\u7684 ui.ini \u914d\u7f6e\u6587\u4ef6\uff1a ;section\n[\u65b0\u5efa\u6b4c\u5355+] ;key = value\ndirection = left_top\nlocation = 180, 268, 21, 21\n section \u662f\u4f60\u6839\u636e\u5bf9\u5e94\u7684\u5143\u7d20\u6309\u94ae\u547d\u540d\uff0c\u4f60\u53ef\u4ee5\u4efb\u610f\u547d\u540d\uff0c\u4f46\u6700\u597d\u6709\u5177\u4f53\u542b\u4e49\uff0c\u4e14\u80fd\u660e\u786e\u8868\u793a\u8fd9\u4e2a\u5143\u7d20\u6309\u94ae\u7684\u540d\u79f0\uff1b\u7528\u4e2d\u62ec\u53f7\u62ec\u8d77\u6765\u5c31\u884c\uff0c\u6bd4\u5982\uff1a[\u65b0\u5efa\u6b4c\u5355+] \uff1b direction \u662f\u914d\u7f6e\u8be5\u5143\u7d20\u7684\u53c2\u8003\u7cfb\uff0c\u5206\u522b\u4e3a\uff1a left_top \u5de6\u4e0a\uff1b left_bottom \u5de6\u4e0b\uff1b right_top \u53f3\u4e0a\uff1b right_bottom \u53f3\u4e0b\uff1b \u53c2\u8003\u7cfb\u7684\u9009\u53d6\u6807\u51c6\uff1a\u62c9\u52a8\u6539\u53d8\u7a97\u53e3\u5927\u5c0f\u65f6\uff0c\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u53c2\u8003\u7cfb\u4f4d\u7f6e\u662f\u4e0d\u53d8\u7684\uff1b location \u662f\u8be5\u5143\u7d20\u6309\u94ae\u7684\u76f8\u5bf9\u4e0e\u53c2\u8003\u7cfb\u7684 x, y \u7684\u8ddd\u79bb\uff0c\u53ca\u5927\u5c0f(w, h)\uff0c\u8fd9\u56db\u4e2a\u6570\u636e\u53ef\u4ee5\u901a\u8fc7 UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\u6570\u636e\uff0c\u5728\u7f16\u8f91\u6a21\u5f0f\u4e0b\uff0c\u70b9\u51fb UI \u56fe\u4e0a\u7684\u6309\u94ae\uff0c\u53f3\u4fa7\u5c31\u4f1a\u51fa\u73b0\u8be5\u5143\u7d20\u6309\u94ae\u7684 x, y, w, h \u6570\u636e\u3002 \u5982\u679c UI \u56fe\u4e0a\u6ca1\u6709\u63d0\u4f9b\u4f60\u60f3\u8981\u7684\u5143\u7d20\u6570\u636e\uff0c\u4f60\u53ef\u4ee5\u76f4\u63a5\u5728\u7cfb\u7edf\u4e2d\u4f7f\u7528\u622a\u56fe\u5f55\u5c4f\u8fdb\u884c\u5c3a\u91cf\uff0c\u8fd9\u662f\u4e00\u79cd\u4e0d\u63a8\u8350\u4f46\u80fd\u7528\u7684\u65b9\u6cd5\u3002 \u3010\u8c03\u7528\u65b9\u6cd5\u3011 \u5728\u5e94\u7528\u5e93\u65b9\u6cd5\u5c42\u8fd9\u6837\u5199\uff1a def click_add_music_list_btn_in_music_by_ui(self):\n\"\"\"\u70b9\u51fb\u65b0\u5efa\u6b4c\u5355\u6309\u94ae\"\"\"\nself.click(*self.ui.btn_center(\"\u65b0\u5efa\u6b4c\u5355+\"))\n self.ui.btn_center() \u662f\u56fa\u5b9a\u5199\u6cd5\uff0c\u53c2\u6570\u5c31\u662f\u914d\u7f6e\u91cc\u9762\u7684 section \u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#ocr","title":"\u56db\u3001OCR \u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_2","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 OCR \u65b9\u6848\u5927\u591a\u91c7\u7528\u8c37\u6b4c OCR\uff08Tesseract\uff09\u65b9\u6848\uff0c\u4f46\u662f\u5b83\u5bf9\u4e8e\u4e2d\u6587\u7684\u8bc6\u522b\u975e\u5e38\u5dee\uff0c\u7ecf\u8fc7\u5927\u91cf\u7684\u8c03\u7814\uff0c\u6211\u4eec\u4f7f\u7528 PaddleOCR\uff0c\u5b83\u662f\u4e00\u4e2a\u5f00\u6e90\u7684\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u8bc6\u522b\u5de5\u5177\uff0c\u4e5f\u662f PaddlePaddle \u6700\u6709\u540d\u7684\u4e00\u4e2a\u5f00\u6e90\u9879\u76ee\uff0c\u611f\u5174\u8da3\u7684\u53ef\u4ee5\u70b9\u8fd9\u91cc\u4e86\u89e3\uff0c\u591a\u7684\u4e0d\u8bf4\u4e86\uff0c\u4f60\u53ea\u9700\u8981\u77e5\u9053\u5b83\u5c31\u662f\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_2","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u5b89\u88c5\u4ed6\u662f\u4e2a\u5f88\u9ebb\u70e6\u7684\u4e8b\u60c5\uff0c\u867d\u7136\u64cd\u4f5c\u5f88\u7b80\u5355\uff0c\u4f46\u5176\u5b9e\u5b89\u88c5\u5305\u6709\u70b9\u5927\uff0c\u56e0\u6b64\u6211\u4eec\u4e0d\u5e0c\u671b\u76f4\u63a5\u5728 env.sh \u4e2d\u52a0\u5165\u5b83\uff0c\u8fd9\u4f1a\u8ba9\u6574\u4e2a\u81ea\u52a8\u5316\u73af\u5883\u53d8\u5f97\u975e\u5e38\u81c3\u80bf\uff1b \u56e0\u6b64\uff0c\u6211\u4eec\u60f3\u5230\u5c06\u5b83\u505a\u6210\u4e00\u4e2a RPC \u670d\u52a1\u5728\u5176\u4ed6\u673a\u5668\u4e0a\u90e8\u7f72\uff0c\u6d4b\u8bd5\u673a\u901a\u8fc7\u8fdc\u7a0b\u8c03\u7528 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u4f7f\u7528\u5b83\uff1b RPC \u7684\u8c03\u7528\u903b\u8f91\uff1a \u8fd9\u6837\u6211\u4eec\u53ea\u9700\u8981\u5728\u670d\u52a1\u7aef\u90e8\u7f72\u597d OCR \u8bc6\u522b\u7684\u670d\u52a1\uff0c\u7136\u540e\u901a\u8fc7 RPC \u670d\u52a1\u5c06\u529f\u80fd\u63d0\u4f9b\u51fa\u6765\uff0c\u6846\u67b6\u91cc\u9762\u53ea\u9700\u8981\u8c03\u7528\u5bf9\u5e94\u7684 RPC \u63a5\u53e3\u5c31\u884c\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_1","title":"3\u3001\u4f7f\u7528\u8bf4\u660e","text":"\u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nfrom paddleocr import PaddleOCR\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef paddle_ocr(pic_path, lang):\n\"\"\"\n Paddleocr\u76ee\u524d\u652f\u6301\u7684\u591a\u8bed\u8a00\u8bed\u79cd\u53ef\u4ee5\u901a\u8fc7\u4fee\u6539lang\u53c2\u6570\u8fdb\u884c\u5207\u6362\n \u4f8b\u5982`ch`, `en`, `fr`, `german`, `korean`, `japan`\n :param file_name:\n :param lang:\n :return:\n \"\"\"\nif __name__ == \"__main__\":\nIP = popen(\"hostname -I\").read().split(\" \")[0]\nPORT = 8890\nSCREEN_CACHE = \"/tmp/screen.png\"\nserver = ThreadXMLRPCServer((IP, PORT), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(paddle_ocr, \"paddle_ocr\")\nprint(\"\u76d1\u542c\u5ba2\u6237\u7aef\u8bf7\u6c42\u3002\u3002\")\nserver.serve_forever()\n \u6846\u67b6\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a from src import OCR\nOCR.ocr(*target_strings, picture_abspath=None, similarity=0.6, return_default=False, return_first=False, lang=\"ch\"):\n# \u901a\u8fc7 OCR \u8fdb\u884c\u8bc6\u522b\u3002\n# target_strings:\n# \u76ee\u6807\u5b57\u7b26,\u8bc6\u522b\u4e00\u4e2a\u5b57\u7b26\u4e32\u6216\u591a\u4e2a\u5b57\u7b26\u4e32,\u5e76\u8fd4\u56de\u5176\u5728\u56fe\u7247\u4e2d\u7684\u5750\u6807;\n# \u5982\u679c\u4e0d\u4f20\u53c2\uff0c\u8fd4\u56de\u56fe\u7247\u4e2d\u8bc6\u522b\u5230\u7684\u6240\u6709\u5b57\u7b26\u4e32\u3002\n# picture_abspath: \u8981\u8bc6\u522b\u7684\u56fe\u7247\u8def\u5f84\uff0c\u5982\u679c\u4e0d\u4f20\u9ed8\u8ba4\u622a\u53d6\u5168\u5c4f\u8bc6\u522b\u3002\n# similarity: \u5339\u914d\u5ea6\u3002\n# return_default: \u8fd4\u56de\u8bc6\u522b\u7684\u539f\u751f\u6570\u636e\u3002\n# return_first: \u53ea\u8fd4\u56de\u7b2c\u4e00\u4e2a,\u9ed8\u8ba4\u4e3a False,\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u6240\u6709\u6570\u636e\u3002\n# lang: `ch`, `en`, `fr`, `german`, `korean`, `japan`\n \u6b64\u65b9\u6848\u5728\u6846\u67b6\u5185\u6ca1\u6709\u5f15\u5165\u4efb\u4f55\u4e09\u65b9\u4f9d\u8d56\u5b8c\u5168\u91c7\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\uff0c\u800c\u4e14\u4f7f\u7528\u65b9\u6cd5\u975e\u5e38\u7b80\u5355\uff0c\u53ea\u9700\u8981\u901a\u8fc7 OCR.ocr() \u5373\u53ef\uff1b \u5bf9\u4e8e\u4e00\u4e9b\u6587\u6848\u7684\u573a\u666f\u975e\u5e38\u9002\u7528\uff0c\u6b64\u65b9\u6cd5\u76f4\u63a5\u8fd4\u56de\u5750\u6807\uff0c\u53ef\u4ee5\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u3002 \u4e5f\u53ef\u4ee5\u7528\u4e8e\u6587\u5b57\u65ad\u8a00\uff0c\u4ee3\u7801\u793a\u610f\uff1a def assert_ocr_exist(\n*args, picture_abspath=None, similarity=0.6, return_first=False, lang=\"ch\"\n):\n\"\"\"\u65ad\u8a00\u6587\u6848\u5b58\u5728\"\"\"\npic = None\nif picture_abspath is not None:\npic = picture_abspath + \".png\"\nres = OCR.ocr(\n*args,\npicture_abspath=pic,\nsimilarity=similarity,\nreturn_first=return_first,\nlang=lang,\n)\nif res is False:\nraise AssertionError(\n(f\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{args}\", f\"{pic if pic else GlobalConfig.SCREEN_CACHE}\")\n)\nif isinstance(res, tuple):\npass\nelif isinstance(res, dict) and False in res.values():\nres = filter(lambda x: x[1] is False, res.items())\nraise AssertionError(\n(\nf\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{dict(res)}\",\nf\"{pic if pic else GlobalConfig.SCREEN_CACHE}\",\n)\n)\n \u5728\u7528\u4f8b\u4e2d\u4f7f\u7528\u65ad\u8a00\uff0c\u793a\u4f8b\uff1a def test_font_manager_021(self):\n\"\"\"\u53f3\u4fa7\u2665-\u6536\u85cf/\u53d6\u6d88\u6536\u85cf\u5b57\u4f53\"\"\"\n# \u5b57\u4f53\u7ba1\u7406\u5668\u754c\u9762\u53f3\u4fa7\u8be6\u60c5\u5217\u8868\uff0c\u9009\u62e9\u672a\u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e / \u6536\u85cf\u5b57\u4f53\n# \u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e\u83dc\u5355\u663e\u793a\u201c\u53d6\u6d88\u6536\u85cf\u201d\uff1b\n...\nself.assert_ocr_exist(\"\u53d6\u6d88\u6536\u85cf\")\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_1","title":"4\u3001\u670d\u52a1\u7aef\u90e8\u7f72","text":"\u6211\u4eec\u76ee\u524d\u662f\u5c06 OCR \u670d\u52a1\u90e8\u7f72\u5728\u666e\u901a\u7684\u529e\u516c\u673a\u4e0a\u7684\uff0c\u5982\u679c\u4f60\u89c9\u5f97\u73b0\u6709\u7684 OCR \u8bc6\u522b\u6027\u80fd\u4e0d\u591f\u597d\uff0c\u6070\u597d\u4f60\u6709\u66f4\u597d\u7684\u673a\u5668\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u5176\u79c1\u6709\u5316\u90e8\u7f72\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#41_1","title":"4.1\u3001\u73af\u5883\u5b89\u88c5","text":"\u63a8\u8350\u4f7f\u7528 pipenv \u8fdb\u884c\u73af\u5883\u642d\u5efa\uff1b \u5b89\u88c5 pipenv \uff1a sudo pip3 install pipenv\n \u65b0\u5efa\u4e00\u4e2a\u76ee\u5f55\u4f5c\u4e3a\u73af\u5883\u5305 ocr_env\uff1a cd ~\nmkdir ocr_env\n \u521b\u5efa python 3.7 \u73af\u5883\uff1a cd ocr_env\npipenv --python 3.7\n \u5b89\u88c5 OCR \u4f9d\u8d56\u5305\uff1a pipenv install paddlepaddle -i https://mirror.baidu.com/pypi/simple\npipenv install \"paddleocr>=2.0.1\" -i https://mirror.baidu.com/pypi/simple\n \u4e0d\u51fa\u610f\u5916\uff0c\u8fd9\u6837\u5c31\u628a\u4f9d\u8d56\u5b89\u88c5\u597d\u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#42_1","title":"4.2\u3001\u542f\u52a8\u670d\u52a1","text":"\u5c06\u57fa\u7840\u6846\u67b6\u4e2d\u7684 scr/ocr/pdocr_rpc_server.py \u6587\u4ef6\u62f7\u8d1d\u5230 ocr_env \u76ee\u5f55\uff0c\u540e\u53f0\u6267\u884c\u5b83\u5c31\u597d\u4e86\uff1a cd ocr_env\nnohup pipenv run python pdocr_rpc_server.py &\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#43","title":"4.3\u3001\u914d\u7f6e\u5f00\u673a\u81ea\u542f\uff08\u901a\u7528\uff09","text":"\u4f60\u80af\u5b9a\u4e0d\u60f3\u6bcf\u6b21\u673a\u5668\u91cd\u542f\u4e4b\u540e\u90fd\u9700\u8981\u624b\u52a8\u542f\u52a8\u670d\u52a1\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u914d\u7f6e\u5f00\u673a\u81ea\u542f\u3002 \u5199\u5f00\u673a\u81ea\u542f\u670d\u52a1\u6587\u4ef6\uff1a sudo vim /lib/systemd/system/ocr.service\n autoocr \u540d\u79f0\u4f60\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff0c\u5199\u5165\u4ee5\u4e0b\u5185\u5bb9\uff1a [Unit]\nDescription=OCR Service\nAfter=multi-user.target\n\n[Service]\nUser=uos\nGroup=uos\nType=idle\nWorkingDirectory=/home/uos/ocr_env\nExecStart=pipenv run python pdocr_rpc_server.py\n\n[Install]\nWantedBy=multi-user.target\n \u6ce8\u610f\u66ff\u6362\u4f60\u7684${USER} \u4fee\u6539\u914d\u7f6e\u6587\u4ef6\u7684\u6743\u9650\uff1a sudo chmod 644 /lib/systemd/system/ocr.service\n \u81ea\u542f\u670d\u52a1\u751f\u6548\uff1a sudo systemctl daemon-reload\nsudo systemctl enable ocr.service\n \u67e5\u770b\u670d\u52a1\u72b6\u6001\uff1a sudo systemctl status ocr.service\n \u4f60\u53ef\u4ee5\u518d\u91cd\u542f\u4e0b\u7535\u8111\uff0c\u770b\u770b\u670d\u52a1\u662f\u4e0d\u662f\u6b63\u5e38\u542f\u52a8\u4e86\uff0c\u6ca1\u62a5\u9519\u5c31 OK \u4e86\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_4","title":"\u4e94\u3001\u5c5e\u6027\u5b9a\u4f4d","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_3","title":"1\u3001\u80cc\u666f","text":"\u4f20\u7edf\u7684 UI \u81ea\u52a8\u5316\u5927\u591a\u90fd\u662f\u57fa\u4e8e\u6d4f\u89c8\u5668\u7684\uff0c\u6838\u5fc3\u662f\u5728\u7f51\u9875\u7684 DOM \u6811\u4e0a\u67e5\u627e\u5143\u7d20\uff0c\u5e76\u5bf9\u5176\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\uff1b Linux \u684c\u9762\u5e94\u7528\u5927\u591a\u662f\u91c7\u7528 Qt \u7f16\u5199\u7684\uff0c\u5728 Qt \u4e2d\u4e5f\u662f\u4ece\u6700\u9876\u5c42\u7684 MainWindow \u5f00\u59cb\u6784\u5efa\u5e94\u7528\uff0c\u6240\u4ee5\u903b\u8f91\u4e5f\u662f\u4e00\u6837\u7684\uff0cQt \u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u540c\u6837\u53ef\u4ee5\u901a\u8fc7 DOM \u6811\uff08\u5c5e\u6027\u6811\uff09\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff0c\u6211\u4eec\u79f0\u4e4b\u4e3a\u5c5e\u6027\u5b9a\u4f4d\u3002 \u501f\u52a9\u5f00\u6e90\u5de5\u5177 dogtail \u6211\u4eec\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u83b7\u53d6\uff0c\u4ece\u800c\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\u3002dogtail \u7684\u9879\u76ee\u4ecb\u7ecd\u53ef\u4ee5\u731b\u6233\u8fd9\u91cc\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_3","title":"2\u3001\u4f7f\u7528\u65b9\u6cd5","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#21sniff","title":"2.1\u3001sniff\uff08\u55c5\u63a2\u5668\uff09\u4f7f\u7528","text":"\u5728\u7ec8\u7aef\u8f93\u5165 sniff \u542f\u52a8 AT-SPI Browser mikigo@mikigo-PC:~$ sniff\n \u67e5\u770b\u5e94\u7528\u7684\u6807\u7b7e \u5728 sniff \u91cc\u9762\u53ef\u4ee5\u770b\u5230\u7cfb\u7edf\u4e2d\u5df2\u542f\u52a8\u7684\u5e94\u7528\uff0c\u70b9\u51fb\u5e94\u7528\u540d\u79f0\u524d\u9762\u7684\u4e09\u89d2\u5f62\u56fe\u6807\uff0c\u53ef\u4ee5\u5c55\u5f00\u5e94\u7528\u7684\u6807\u7b7e\uff0c\u6240\u6709\u6807\u7b7e\u4ee5 tree \u7684\u5f62\u5f0f\u5c55\u793a\uff0c\u5bf9\u5e94\u5e94\u7528\u91cc\u9762\u7684\u7236\u7a97\u53e3\u548c\u5b50\u7a97\u53e3\u3002 \u83b7\u53d6\u5143\u7d20\u63a7\u4ef6\u7684\u6807\u7b7e\u540d\u79f0 \u9996\u5148\uff0c\u4e3a\u4e86\u65b9\u4fbf\u67e5\u770b\u5143\u7d20\u63a7\u4ef6\u5bf9\u5e94\u7684\u4f4d\u7f6e\uff0c\u5efa\u8bae\u73b0\u5728\u4e0a\u65b9\u5de5\u5177\u680f\u70b9\u51fb Actions\uff0c\u7136\u540e\u52fe\u9009 Hightlight Items\uff0c\u8fd9\u6837\u5728 sniff \u4e2d\u9f20\u6807\u9009\u4e2d\u5143\u7d20\u6807\u7b7e\u7684\u65f6\u5019\uff0c\u5e94\u7528\u4e2d\u4f1a\u6709\u76f8\u5e94\u7684\u5149\u6807\u9501\u5b9a\u3002 \u5728 sniff \u91cc\u9762\u70b9\u51fb\u8fdb\u5165\u5e94\u7528\u7684\u6807\u7b7e tree \u4e2d\u540e\uff0c\u70b9\u51fb\u76f8\u5e94\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5728\u5de5\u5177\u4e0b\u65b9\uff0c\u4f1a\u5c55\u793a\u5143\u7d20\u63a7\u4ef6\u7684 Name\uff0c\u8fd9\u4e2a\u5c31\u662f\u6807\u7b7e\u540d\u79f0\u3002 \u5728 tree \u4e2d\u6709\u4e9b\u5730\u65b9\u662f\u7a7a\u767d\u7684\u6216\u8005\u662f Form\uff0c\u662f\u56e0\u4e3a\u5f00\u53d1\u4eba\u5458\u5728\u6dfb\u52a0\u6807\u7b7e\u7684\u65f6\u5019\u6ca1\u6709\u6dfb\u52a0\uff0c\u6216\u8005\u6709\u4e9b\u7236\u7a97\u53e3\u4e0d\u9700\u8981\u6dfb\u52a0\uff0c\u8fd9\u79cd\u5728\u5b9e\u9645\u4e1a\u52a1\u4e2d\u662f\u4e0d\u5f71\u54cd\u7684\uff0c\u6211\u4eec\u53ea\u8981\u4fdd\u8bc1\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\u4e2d\uff0c\u8981\u7528\u5230\u7684\u5143\u7d20\u90fd\u6dfb\u52a0\u4e86\u6807\u7b7e\u5373\u53ef\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#22","title":"2.2\u3001\u5143\u7d20\u64cd\u4f5c","text":"\u83b7\u53d6\u5e94\u7528\u5bf9\u8c61 dogtail \u83b7\u53d6\u5e94\u7528\u5bf9\u8c61\u7684\u65f6\u5019\uff0c\u4f7f\u7528\u7684\u662f tree \u5e93\u91cc\u9762\u7684 application() \u65b9\u6cd5\uff1a from dogtail.tree import root\napp_obj = root.application('deepin-music')\n app_obj\u5c31\u662f\u5e94\u7528\u7684\u5bf9\u8c61\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\uff0c\u662f\u5e94\u7528\u5bf9\u8c61\u4f7f\u7528child()\u65b9\u6cd5\uff1a element = app_obj.child('element_name')\n \u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u4f20\u5165\u5143\u7d20\u7684 Name\uff0c\u83b7\u53d6\u5230\u76f8\u5e94\u5143\u7d20\u7684\u5bf9\u8c61\u3002Name \u53ef\u4ee5\u901a\u8fc7 sniff \u67e5\u770b\u3002 \u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\u5217\u8868: element_list = element.children\n \u83b7\u53d6\u5230\u8fd9\u4e2a\u5143\u7d20\u4e0b\u9762\u6240\u6709\u7684\u5143\u7d20\u5217\u8868\u3002 \u8fd9\u4e2a\u65b9\u6cd5\u9002\u7528\u4e8e\u6709\u4e9b\u6807\u7b7e\u6ca1\u6709\u6dfb\u52a0\uff0c\u4f46\u662f\u4f4d\u7f6e\u662f\u56fa\u5b9a\u7684\uff0c\u6211\u4eec\u901a\u8fc7\u7d22\u5f15\u53ef\u4ee5\u53d6\u5f97\u5143\u7d20\u3002 element_list[0]\n \u5bf9\u5143\u7d20\u7684\u64cd\u4f5c \u5728\u83b7\u53d6\u5230\u5143\u7d20\u4e4b\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u76f8\u5e94\u7684\u64cd\u4f5c\u3002 \u5355\u51fb element.click(button=1)\n button 1 \u2014>\u5de6\u952e\uff0c2 \u2014>\u6eda\u8f6e\uff0c3 \u2014>\u53f3\u952e\uff0c\u9ed8\u8ba4\u4e3a 1 \u53cc\u51fb element.doubleClick(button=1)\n \u9f20\u6807\u60ac\u505c element.point()\n \u9f20\u6807\u79fb\u52a8\u5230\u5143\u7d20\u4e2d\u5fc3\u4f4d\u7f6e \u6587\u672c\u8f93\u5165 element.typeText(string)\n \u5411\u5143\u7d20\u5bf9\u8c61\u8f93\u5165\u5b57\u7b26\u4e32 \uff0c\u6bd4\u5982\u8f93\u5165\u6846 \u7ec4\u5408\u952e element.keyCombo(comboString)\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#23","title":"2.3\u3001\u6846\u67b6\u5c01\u88c5","text":"\u4ee3\u7801\u793a\u4f8b\uff1a # \u8be6\u7ec6\u4ee3\u7801\u8bf7\u67e5\u770b src/dogtail_utils.py\nclass DogtailUtils:\ndef __init__(self, name=None, description=None):\nself.name = name\nself.description = description\nself.obj = root.application(self.name, self.description)\ndef app_element(self, *args, **kwargs):\n\"\"\"\n \u83b7\u53d6app\u5143\u7d20\u7684\u5bf9\u8c61\n :return: \u5143\u7d20\u7684\u5bf9\u8c61\n \"\"\"\nreturn self.obj.child(*args, **kwargs, retry=False)\ndef element_center(self, element) -> tuple:\n\"\"\"\n \u83b7\u53d6\u5143\u7d20\u7684\u4e2d\u5fc3\u4f4d\u7f6e\n :param element:\n :return: \u5143\u7d20\u4e2d\u5fc3\u5750\u6807\n \"\"\"\n_x, _y, _w, _h = self.app_element(element).extents\n_x = _x + _w / 2\n_y = _y + _h / 2\nreturn _x, _y\n \u6846\u67b6\u63d0\u4f9b\u7684\u63a5\u53e3\u975e\u5e38\u7b80\u6d01\uff0c\u5728\u8c03\u7528\u65f6\uff1a self.dog.element_center(\"\u64ad\u653e\")\n \u8fd9\u6837\u5c31\u80fd\u83b7\u53d6\u5230\u6b64\u5143\u7d20\u7684\u4e2d\u5fc3\u5750\u6807\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_5","title":"\u516d\u3001\u6807\u7b7e\u5316\u7ba1\u7406","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_4","title":"1\u3001\u6807\u7b7e\u8bf4\u660e","text":"\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u811a\u672c ID\uff1a\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c/\u51fd\u6570 ID\uff1b PMS\u7528\u4f8bID\uff1aPMS \u4e0a\u5bf9\u5e94\u7684\u7528\u4f8b ID\uff08\u7528\u4f8b\u5e93 ID\uff09\uff1b \u9ed8\u8ba4\u4f7f\u7528\u7528\u4f8b\u5e93 ID\uff0c\u5bf9\u4e8e\u6682\u65f6\u6ca1\u6709\u4f7f\u7528\u7528\u4f8b\u5e93\u7ba1\u7406\u7528\u4f8b\u7684\u9879\u76ee\uff0c\u53ef\u4ee5\u4f7f\u7528\u4ea7\u54c1\u5e93\u7528\u4f8b ID\uff1b \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1aFUNC\uff08\u529f\u80fd\uff09\u3001PERF\uff08\u6027\u80fd\uff09\u3001STR\uff08\u538b\u529b\uff09\u3001SEC\uff08\u5b89\u5168\uff09\u3001CTS\uff08\u517c\u5bb9\u6027\uff09\u3001API\uff08\u63a5\u53e3\uff09\u3001BASELINE\uff08\u57fa\u7ebf-\u9884\u7559\uff09 \u8bbe\u5907\u7c7b\u578b\uff1aPPL\uff08\u4f9d\u8d56\u5916\u8bbe\u7684\u7528\u4f8b\uff09\u3001COL\uff08\u4f9d\u8d56\u4e3b\u63a7\u673a\u7684\u7528\u4f8b\uff09 \u7528\u4f8b\u6765\u6e90\uff1aBUG\uff08\u7531 Bug \u8f6c\u7684\u7528\u4f8b\uff09 \u4e0a\u7ebf\u5bf9\u8c61\uff1aCICD\uff0c\u8868\u793a\u4e0a\u7ebf\u5230 CICD \u6d41\u6c34\u7ebf\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u53ef\u4e00\u952e\u751f\u6210 case_list.csv \u6587\u4ef6\uff0c\u7528\u4e8e\u5bfc\u5165\u5230\u660e\u9053\u4e91 AT \u7528\u4f8b\u5217\u8868\u4e2d\u63a7\u5236 CICD \u8dd1\u6d4b\u8303\u56f4\uff1b \u6d4b\u8bd5\u7ea7\u522b\uff1aC1 / C2 / C3 / C4\uff0c\u5177\u4f53\u5b9a\u4e49\u53c2\u8003\u6d41\u6c34\u7ebf\u4f7f\u7528\u6307\u5bfc\uff1b \u8df3\u8fc7\u539f\u56e0\uff1askip-XXX\uff0c\u7528\u4e8e\u63a7\u5236\u7528\u4f8b\u662f\u5426\u6267\u884c\uff1b \u786e\u8ba4\u4fee\u590d\uff1afixed-XXX\uff0c\u7528\u4e8e\u6807\u8bb0\u7528\u4f8b\u7684\u4fee\u590d\u72b6\u6001\uff08\u540e\u9762\u8be6\u7ec6\u8bb2\u89e3\u7528\u6cd5\uff09\uff1b \u5e9f\u5f03\u7528\u4f8b\uff1aremoved-\u5df2\u5e9f\u5f03\uff0c\u7528\u4e8e\u6807\u8bb0\u5df2\u7ecf\u5e9f\u5f03\u7684\u7528\u4f8b\uff0c\u6b64\u7528\u4f8b\u6807\u7b7e\u4e0d\u4f1a\u88ab\u6dfb\u52a0\uff0c\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff1b \u793a\u4f8b\uff1a \u811a\u672cID PMS\u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u8bbe\u5907\u7c7b\u578b \u7528\u4f8b\u6765\u6e90 \u4e0a\u7ebf\u5bf9\u8c61 \u6d4b\u8bd5\u7ea7\u522b \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b ... 679537 679537 L1 FUNC PPL CICD C1 skip-XXX fixed-XXX removed-\u5df2\u5e9f\u5f03 ..."},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_4","title":"2\u3001\u64cd\u4f5c\u6b65\u9aa4","text":"2.1\u3001\u5728\u5b50\u9879\u76ee\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u4ee5\u7528\u4f8b\u7684 py \u6587\u4ef6\u9664\u53bb\u9996\u5b57\u7b26\u4e32 \"test_\" \u548c\u7528\u4f8b\u5e8f\u53f7\u540e\u7684\u5b57\u7b26\u4e32\u4f5c\u4e3a csv \u7684\u6587\u4ef6\u540d\u3002 \u4f8b\u5982: \u76f8\u518c\u7684\u7528\u4f8b\u6587\u4ef6\u4e3a test_album_xxx.py\uff0cxxx \u8868\u793a\u7528\u4f8b\u7684ID\uff08\u4e5f\u53ef\u4ee5\u662f\u81ea\u5b9a\u4e49\u7684\u6570\u5b57\u4ee3\u8868\u7528\u4f8b\u5e8f\u53f7\uff09\uff0c\u6b64\u65f6 csv \u6587\u4ef6\u540d\u5c31\u5e94\u4e3a album.csv\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u6240\u6709 csv \u6587\u4ef6\u5efa\u8bae\u653e\u5728\u4e00\u4e2a tags \u76ee\u5f55\u4e0b\u3002 \u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 2.2\u3001\u7b2c\u4e00\u5217\u4e3a\u811a\u672c ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b\u7528\u4f8b\u6807\u7b7e\u53ef\u4ee5\u65e0\u5e8f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_2","title":"3\u3001\u589e\u52a0\u8bf4\u660e","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_1","title":"3.1\u3001\u8df3\u8fc7\u7528\u4f8b","text":"\u4f20\u7edf\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668(@pytest.mark.skip)\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a; \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#311","title":"3.1.1\u3001\u56fa\u5b9a\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 679537 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u7b7e\u5f00\u5934\u4e3a \u201cskip-XXX\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\uff0c\u5b58\u5728\u8df3\u8fc7\u6807\u7b7e\u5219\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u7b7e\u4e3a SKIPED\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#312","title":"3.1.2\u3001\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7","text":"\u793a\u4f8b\uff1a \u811a\u672cID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skipif_platform-aarch64&mips64 \u67d0\u4e9b\u7528\u4f8b\u4f1a\u56e0\u4e3a\u4e0d\u540c\u7684\u73af\u5883\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\uff0c\u5e38\u89c1\u7684\u573a\u666f\u4e3a\u5728\u4e0d\u540c\u67b6\u6784\u4e0a\u5224\u65ad\u662f\u5426\u6267\u884c\uff0c\u8df3\u8fc7\u7684\u539f\u56e0\u6807\u7b7e\u4e3a \u201cskipif_platform-\u201d \u52a0\u67b6\u6784\u540d\uff0c\u591a\u4e2a\u67b6\u6784\u4e4b\u95f4\u4f7f\u7528 \u201c&\u201d \u62fc\u63a5\uff1b \u4ee5\u4e0a\u4f8b\u5b50\u4e3a\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u5224\u65ad\u5f53\u524d\u67b6\u6784\u662f\u5426\u4e3a arrch64 \u6216\u8005 mips64\uff0c\u82e5\u662f\uff0c\u5219\u8df3\u8fc7\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u82e5\u5426\u5219\u6267\u884c\u7528\u4f8b\uff1b \u76ee\u524d\u6846\u67b6\u9ed8\u8ba4\u4ec5\u652f\u6301\u67b6\u6784\u7684\u6761\u4ef6\u5224\u65ad\uff0c\u4f46\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u903b\u8f91\u652f\u6301\u81ea\u5b9a\u4e49\u6dfb\u52a0\u3002 \u5728\u9879\u76ee\u76ee\u5f55\u8def\u5f84\u4e0b\u5b58\u5728\u6587\u4ef6 setting/skipif.py\uff0c\u6240\u6709\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u7684\u51fd\u6570\u5199\u5728\u6b64\u6587\u4ef6\u4e2d\u3002 \u9ed8\u8ba4\u67b6\u6784\u5224\u65ad\u4f8b\u5b50\uff1a def skipif_platform(args: str):\n\"\"\"\u5e73\u53f0\u8df3\u8fc7\"\"\"\n_skip_key = args.split(\"&\")\nfor key in _skip_key:\nif GlobalConfig.SYS_ARCH == key:\nreturn True\nreturn False\n \u65b9\u6cd5\u7f16\u5199\u89c4\u8303\uff1a \u65b9\u6cd5\u540d\u5fc5\u987b\u4ee5 skipif \u5f00\u5934\uff1b \u65b9\u6cd5\u5fc5\u987b\u6709\u8fd4\u56de\u7ed3\u679c\u5e76\u4e14\u4e3a\u5e03\u5c14\u503c\uff08True \u4ee3\u8868\u8df3\u8fc7\uff0cFalse \u4ee3\u8868\u4e0d\u8df3\u8fc7\uff09\uff1b \u65b9\u6cd5\u53ea\u80fd\u6709\u4e00\u4e2a\u5165\u53c2\uff1b \u5728 csv \u6587\u4ef6\u8df3\u8fc7\u539f\u56e0\u4e00\u680f\u4e2d\u586b\u5199\u4e3a \u201c{\u51fd\u6570\u540d}-{\u53c2\u6570}\u201d\uff0c\u4f8b\u5982\uff1askipif_platform-aarch64\uff1b\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u4f1a\u4ee5\u7b2c\u4e00\u4e2a \u201c-\u201d \u8fdb\u884c\u5206\u5272\uff0c\u622a\u53d6\u7684\u5de6\u4fa7\u5b57\u7b26\u4e32\u4f5c\u4e3a\u51fd\u6570\u540d\uff0c\u5728 skipif.py \u6587\u4ef6\u4e2d\u67e5\u627e\u662f\u5426\u6709\u540c\u540d\u51fd\u6570\uff0c\u5e76\u5c06\u622a\u53d6\u7684\u53f3\u4fa7\u4f5c\u4e3a\u53c2\u6570\u4f20\u9012\u7ed9\u8be5\u51fd\u6570\uff0c\u901a\u8fc7\u83b7\u53d6\u8be5\u51fd\u6570\u8fd4\u56de\u7684\u5e03\u5c14\u503c\uff0c\u8fd4\u56de True\uff0c\u5219\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u8fd4\u56de False\uff0c\u5219\u6267\u884c\u8be5\u7528\u4f8b\u3002 \u82e5\u51fd\u6570\u9700\u8981\u591a\u4e2a\u53c2\u6570\uff0c\u53ef\u81ea\u5b9a\u4e49\u591a\u4e2a\u53c2\u6570\u4e4b\u95f4\u7684\u8fde\u63a5\u7b26\uff0c\u8fde\u63a5\u7b26\u53f7\u4e0d\u53ef\u4f7f\u7528\u4e0b\u5212\u7ebf\u548c\u9017\u53f7\uff0c\u63a8\u8350\u7edf\u4e00\u4f7f\u7528 & \u7b26\u53f7\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32","title":"3.2\u3001\u786e\u8ba4\u4fee\u590d","text":"\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7528\u4f8b\u4fee\u590d\u540e\uff0c\u4f46\u4e0d\u80fd\u7acb\u5373\u5220\u9664\u8df3\u8fc7\u539f\u56e0\uff08skip-XXX\uff09\u7684\u7528\u4f8b\uff0c\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u786e\u8ba4\u4fee\u590d\u201d\uff0c\u4f5c\u4e3a\u6807\u8bb0\u8be5\u7528\u4f8b\u662f\u5426\u5df2\u7ecf\u4fee\u590d\uff0c\u56fa\u5b9a\u586b\u5165\u5b57\u6bb5\u4e3a \u201cfixed-\u5df2\u4fee\u590d\u201d\u3002\u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u5373\u4f7f\u540c\u65f6\u6807\u8bb0\u4e86 skip-XXX \u4e5f\u4f1a\u6b63\u5e38\u6267\u884c\u3002 \u793a\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d 679537 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d \u3010\u540c\u65f6\u6807\u8bb0\u4e86skip \u548c fixed\uff0c\u4f46\u4ecd\u7136\u60f3\u8981\u8df3\u8fc7\u7528\u4f8b\u3011 \u5f53 \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u540c\u65f6\u586b\u5165\u540e\uff0c\u547d\u4ee4\u884c\u4f20\u9012\u53c2\u6570 --ifixed yes\uff0c\u5219\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\u8be5\u6761\u7528\u4f8b\u3002 python3 manage.py run --ifixed yes\n \u770b\u5230\u8fd9\u91cc\u6709\u4e9b\u540c\u5b66\u53ef\u80fd\u8981\u95ee\u4e86\uff0c\u6211\u60f3\u6062\u590d\u8df3\u8fc7\u6267\u884c\uff0c\u76f4\u63a5\u628a skip-XXX \u8fd9\u4e00\u5217\u6807\u7b7e\u5220\u6389\u4e0d\u5c31\u597d\u4e86\uff0c\u8fd8\u641e\u4ec0\u4e48\u786e\u8ba4\u4fee\u590d\u5e72\u5565\uff1f \u8fd9\u91cc\u7ed9\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u89e3\u91ca\u4e00\u4e0b\uff1a \uff08\u4ee5\u4e0b\u6d41\u6c34\u7ebf\u6307\u7684\u662f\u6bcf\u65e5\u6784\u5efa\u7684\u6d41\u6c34\u7ebf\uff0c\u8dd1 AT \u7684\u5168\u91cf\u7528\u4f8b\uff09 \u9996\u5148\uff0c\u6d41\u6c34\u7ebf\u4e0a\u8dd1\u7684\u662f AT \u5386\u53f2 Tag\uff0c\u8df3\u8fc7\u7528\u4f8b\u7684\u6807\u7b7e(skip-XXX) \u662f\u5728\u6700\u65b0\u7684\u4ee3\u7801\u4e0a\u63d0\u4ea4\u7684\uff0c\u6211\u4eec\u91c7\u7528\u6700\u65b0\u7684 csv \u6587\u4ef6\u8986\u76d6\u5386\u53f2 csv \u6587\u4ef6\u7684\u8bbe\u8ba1\u6765\u5b9e\u73b0\u4e86\u5bf9\u5386\u53f2 Tag \u4e0a\u7528\u4f8b\u7684\u8df3\u8fc7\uff1b \u7136\u540e\uff0c\u5728\u65e5\u5e38\u8df3\u8fc7\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u540c\u65f6\u4e5f\u5728\u4fee\u590d\u4e00\u4e9b\u7528\u4f8b\uff0c\u4fee\u590d\u540e\u7684\u8fd9\u4e9b\u7528\u4f8b\u5728\u672c\u5730\u8c03\u8bd5\u7684\u65f6\u5019\u6211\u4eec\u4e0d\u5e0c\u671b\u7ee7\u7eed\u8df3\u8fc7\uff0c\u4f46\u662f\u6b64\u65f6\uff0c\u4fee\u590d\u7684\u8fd9\u4e9b\u7528\u4f8b\u53ef\u80fd\u8fd8\u4e0d\u7a33\u5b9a\uff0c\u4e0d\u9002\u5408\u9a6c\u4e0a\u653e\u5230\u6d41\u6c34\u7ebf\u53bb\u8dd1\uff0c\u4e5f\u5c31\u662f\u8bf4\u6d41\u6c34\u7ebf\u4e0a\u6211\u4eec\u662f\u5e0c\u671b\u4ed6\u7ee7\u7eed\u8df3\u8fc7\u7684\uff0c\u56e0\u6b64\uff0c\u54b1\u4e0d\u80fd\u76f4\u63a5\u628a skip-XXX \u5e72\u6389\uff1b \u8fd9\u91cc\u5c31\u77db\u76fe\u4e86\uff0c\u4e00\u4e2a\u9700\u6c42\u662f\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u53e6\u4e00\u4e2a\u9700\u6c42\u53c8\u4e0d\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u600e\u4e48\u529e\u5462\uff1f \u6211\u4eec\u4f7f\u7528\u201c\u786e\u8ba4\u4fee\u590d\u201d\u6765\u6807\u8bb0\u8fd9\u6761\u7528\u4f8b\u5df2\u7ecf\u4fee\u590d\u4e86\uff0c\u8fd9\u6837\u4f60\u672c\u5730\u8c03\u8bd5\u7528\u4f8b\u7684\u65f6\u5019\u8fd9\u6761\u5df2\u4fee\u590d\u7684\u7528\u4f8b\u662f\u4f1a\u6267\u884c\u7684\uff0c\u540c\u65f6\u5728\u6d41\u6c34\u7ebf\u4e0a\u5c06 --ifixed yes \u53c2\u6570\u52a0\u4e0a\uff0c\u90a3\u4e48\u6d41\u6c34\u7ebf\u4e0a\u6267\u884c\u65f6\u8fd9\u6761\u7528\u4f8b\u4ecd\u7136\u662f\u8df3\u8fc7\u7684\u72b6\u6001\uff0c\u540e\u7eed\u4f60\u6253 Tag \u7684\u65f6\u5019\uff0c\u628a \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u7684\u6807\u7b7e\u5168\u90e8\u5220\u6389\u5c31\u53ef\u4ee5\u4e86\u3002 \u8fd9\u5c31\u662f\u201c\u786e\u8ba4\u4fee\u590d\u201d\u8fd9\u4e2a\u6807\u7b7e\u7684\u80cc\u666f\uff0c\u9700\u8981\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u54c1\u4e00\u54c1\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#33","title":"3.3\u3001\u5e9f\u5f03\u7528\u4f8b","text":"\u9488\u5bf9\u67d0\u4e9b\u7528\u4f8b\uff0c\u7531\u4e8e\u9700\u6c42\u53d8\u66f4\uff0c\u73af\u5883\u5f71\u54cd\u6216\u8bc4\u4f30\u4e0d\u518d\u9002\u7528\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u65f6\uff0c\u7528\u4f8b\u9700\u8981\u5e9f\u5f03\uff0c\u5219\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u5e9f\u5f03\u7528\u4f8b\u201d\uff0c\u8be5\u5217\u5b58\u5728 \u201cremoved-{\u5e9f\u5f03\u539f\u56e0}\u201d\uff0c\u5219\u7528\u4f8b\u4e0d\u4f1a\u6267\u884c\u3002 \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 \u786e\u8ba4\u4fee\u590d \u5e9f\u5f03\u7528\u4f8b 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd fixed-\u5df2\u4fee\u590d removed-\u5df2\u5e9f\u5f03 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_2","title":"4\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u4e0a\u9762\u4ecb\u7ecd Pytest \u6846\u67b6\u63d0\u4f9b\u7684\u6807\u7b7e\u529f\u80fd mark\uff0c\u4f7f\u7528\u65f6\u9700\u8981\u4e3a\u6bcf\u4e00\u4e2a\u7528\u4f8b\u6dfb\u52a0\u6807\u7b7e\u88c5\u9970\u5668\uff0c\u5219\u64cd\u4f5c\u590d\u6742\uff0c\u53ef\u7ef4\u62a4\u6027\u5dee\uff0c\u5176\u6839\u672c\u95ee\u9898\u5c31\u662f\u6807\u7b7e\u5206\u6563\u5728\u6bcf\u4e00\u6761\u7528\u4f8b\u7684\u88c5\u9970\u5668\u4e0a\uff0c\u96be\u4ee5\u96c6\u4e2d\u7ef4\u62a4\uff1b\u4e8e\u662f\u4e4e\u5c06\u6240\u6709\u6807\u7b7e\u4f7f\u7528 csv \u6587\u4ef6\u8fdb\u884c\u96c6\u4e2d\u7ba1\u7406\uff0c\u5e76\u901a\u8fc7 Pytest \u7684\u94a9\u5b50\u51fd\u6570\uff0c\u8bfb\u53d6 csv \u6587\u4ef6\uff0c\u52a8\u6001\u6dfb\u52a0\u6807\u7b7e\u5230\u7528\u4e2d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5csv","title":"5\u3001CSV\u6587\u4ef6\u683c\u5f0f","text":"\u6b64\u914d\u7f6e\u6587\u4ef6\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u6807\u7b7e\u6570\u636e\uff0c\u4e14\u8981\u65b9\u4fbf\u80fd\u4f7f\u7528 Excel \u6253\u5f00\u8fdb\u884c\u7f16\u8f91\u67e5\u770b\uff0c\u66f4\u91cd\u8981\u7684\u662f\u6211\u4eec\u4e0d\u60f3\u5f15\u5165\u4e09\u65b9\u4f9d\u8d56\uff0cCSV \u6587\u4ef6\u51e0\u4e4e\u662f\u552f\u4e00\u80fd\u6ee1\u8db3\u6240\u6709\u7684\u8981\u6c42\u7684\u6587\u4ef6\u683c\u5f0f\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_6","title":"\u4e03\u3001\u65e5\u5fd7\u7cfb\u7edf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_5","title":"1\u3001\u80cc\u666f","text":"\u57fa\u4e8e YouQu \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u64cd\u4f5c\u65b9\u6cd5\u5c01\u88c5\u5199\u6cd5\uff0c\u901a\u5e38\u662f\u8fd9\u6837\u7684\uff1a\u7c7b\u91cc\u9762\u4e00\u4e2a\u51fd\u6570\u53ea\u5305\u542b\u4e00\u4e2a\u64cd\u4f5c\u6216\u591a\u6b21\u8c03\u7528\u7684\u4e00\u7cfb\u5217\u53ef\u5408\u5e76\u7684\u64cd\u4f5c\uff1b \u4f20\u7edf\u7684\u65e5\u5fd7\u8f93\u51fa\u65b9\u5f0f\uff0c\u9700\u8981\u5728\u6bcf\u4e2a\u51fd\u6570\u91cc\u9762\u4e3b\u52a8\u7f16\u5199\u65e5\u5fd7\u8f93\u51fa\u4ee3\u7801 \uff0c\u4f8b\u5982\uff1a class XXXWidget:\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\nlogger.info(\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\")\n...\n# \u7701\u7565\u4ee3\u7801\u90e8\u5206\n \u4e00\u4e2a\u51fd\u6570\u91cc\u9762\u81f3\u5c11\u5305\u542b\u4e00\u6761\u65e5\u5fd7\u4fe1\u606f\uff0c\u5982\u679c\u6bd4\u8f83\u590d\u6742\u64cd\u4f5c\u6b65\u9aa4\uff0c\u53ef\u80fd\u5305\u542b\u591a\u6761\u65e5\u5fd7\u4fe1\u606f\uff1b \u4e00\u4e2a\u5e94\u7528\u542b\u6709\u5927\u91cf\u7684\u64cd\u4f5c\u51fd\u6570\uff0c\u4e5f\u5c31\u662f\u8bf4\u6211\u4eec\u9700\u8981\u5199\u5927\u91cf\u7684\u65e5\u5fd7\u4ee3\u7801\uff1b \u901a\u8fc7\u7ecf\u9a8c\u89c2\u5bdf\uff0c\u6211\u4eec\u53d1\u73b0\uff0c\u51fd\u6570\u8bf4\u660e\u4ee5\u53ca\u51fd\u6570\u64cd\u4f5c\u65e5\u5fd7\uff0c\u5177\u6709\u8f83\u9ad8\u7684\u91cd\u590d\u5ea6\uff08\u4ece\u4e0a\u9762\u7684\u4f8b\u5b50\u4e5f\u53ef\u4ee5\u770b\u51fa\u6765\uff09\uff0c\u56e0\u6b64\u6211\u4eec\u5927\u80c6\u7684\u8bbe\u60f3\uff0c\u80fd\u4e0d\u80fd\u57fa\u4e8e\u6846\u67b6\u6267\u884c\u65f6\uff0c\u81ea\u52a8\u7684\u5c06\u51fd\u6570\u8bf4\u660e\u4f5c\u4e3a\u65e5\u5fd7\u6253\u5370\u51fa\u6765\uff0c\u4ece\u800c\u51cf\u5c11\u5927\u91cf\u65e5\u5fd7\u4ee3\u7801\u91cf\u548c\u91cd\u590d\u7f16\u5199\uff0c\u90a3\u771f\u662f\u5999\u554a~\u3002 \u57fa\u4e8e\u6b64\u201c\u5929\u771f\u201d\u7684\u60f3\u6cd5\uff0c\u6211\u4eec\u8bbe\u8ba1\u51fa\u4e86 youqu \u7684\u65e5\u5fd7\u7cfb\u7edf\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_5","title":"2\u3001\u5b9e\u73b0\u539f\u7406","text":"\u6838\u5fc3\u539f\u7406\uff1a \u901a\u8fc7\u7ed9\u7c7b\u52a0\u4e0a\u4e00\u4e2a\u88c5\u9970\u5668 @log\uff0c\u52a8\u6001\u7ed9\u8be5\u7c7b\u4e0b\u6240\u6709\u7684\u51fd\u6570\u53ca\u7236\u7c7b\u51fd\u6570\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668 @_trace\uff0c\u5728\u6b64\u88c5\u9970\u5668\u4e2d\u6211\u4eec\u80fd\u52a8\u6001\u7684\u6355\u83b7\u6240\u8c03\u7528\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff08func.__doc__\uff09\uff0c\u901a\u8fc7\u65e5\u5fd7\u8f93\u51fa\u5668\u5c06\u5176\u8f93\u51fa\u5373\u53ef\u3002 \u5b9e\u73b0\u6b65\u9aa4\uff1a \u901a\u8fc7 inspect.getmembers \u83b7\u53d6\u88ab\u88c5\u9970\u7684\u7c7b\u4e0b\u6240\u6709\u51fd\u6570\uff0c\u5305\u542b\u9759\u6001\u65b9\u6cd5\uff0c\u7c7b\u65b9\u6cd5\uff0c\u5b9e\u4f8b\u65b9\u6cd5\uff1b \u901a\u8fc7 setattr(\u7c7b, \u65b9\u6cd5, _trace\uff09 \u7684\u65b9\u5f0f\uff0c\u7ed9\u7b26\u5408\u6761\u4ef6\u7684\u51fd\u6570\uff0c\u52a8\u6001\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_3","title":"3\u3001\u65e5\u5fd7\u914d\u7f6e","text":"[log_cli]\n;\u65e5\u5fd7\u76f8\u5173\u914d\u7f6e\uff08\u4e0d\u6253\u5370\u6784\u9020\u51fd\u6570\u548c\u9b54\u6cd5\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff09\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = INFO\n# ============= \u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u914d\u7f6e ================\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u5f00\u5934\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7, \u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_STARTSWITH = Assert\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u7ed3\u5c3e\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_ENDSWITH = Widget\n;\u652f\u6301\u7c7b\u540d\u5305\u542b xxx \u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_CONTAIN = ShortCut\n# ==============================================\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_3","title":"4\u3001\u4f7f\u7528\u65b9\u6cd5","text":"\u5728\u5e94\u7528\u5e93 widget \u65b9\u6cd5\u5e93\u91cc\u9762\uff0c\u53ea\u9700\u8981\u5728\u51fa\u53e3\u6587\u4ef6\u52a0\u4e0a\u7c7b\u88c5\u9970\u5668\uff0c\u5c31\u53ef\u4ee5\u5b9e\u73b0\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u4e86\uff1b # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n \u6ce8\u610f\uff0c\u662f\u7c7b\u88c5\u9970\u5668\u3002 \u5b9e\u4f8b\uff1a # dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\n@classmethod\ndef find_dfm_image(cls, *elements, multiple=False, rate=0.9):\n\"\"\"\n \u67e5\u627e\u56fe\u7247 {{elements}}.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e {{rate}} \u7684\u5750\u6807\n :param elements:\n :param multiple:\n :return:\n \"\"\"\nelement = tuple(map(lambda x: f\"{Config.PIC_RES_PATH}/{x}\", elements))\nreturn cls.find_image(*element, multiple=multiple)\n \u8c03\u7528\u65b9\u6cd5\u65f6\uff1a DfmWidget.find_dfm_image(\"dfm_001\")\n \u81ea\u52a8\u8f93\u51fa\u7684\u65e5\u5fd7\uff1a >> x86_64-uos-6: 02/28 17:48:47 | INFO | logger_utils: [find_dfm_image]: \u67e5\u627e\u56fe\u7247 dfm_001.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e 0.9 \u7684\u5750\u6807\n \u52a0\u4e0a\u88c5\u9970\u5668 @log \u4e4b\u540e\uff0c\u65b9\u6cd5\u5c42\u6240\u6709\u7684\u51fd\u6570\uff08\u5305\u62ec\u5b9e\u4f8b\u65b9\u6cd5\u3001\u7c7b\u65b9\u6cd5\u3001\u9759\u6001\u65b9\u6cd5\uff09\u90fd\u4e0d\u9700\u8981\u518d\u5199\u65e5\u5fd7\u4ee3\u7801\uff0c\u6267\u884c\u7684\u65f6\u5019\u4f1a\u81ea\u52a8\u8f93\u51fa\uff0c\u5e76\u4e14\u6240\u6709\u8c03\u7528\u7684\u65b9\u6cd5\u4f1a\u4ee5 allure.step \u7684\u65b9\u5f0f\uff0c\u5c55\u793a\u5728 allure \u62a5\u544a\u4e2d\uff0c\u5728\u62a5\u544a\u4e2d\u66f4\u80fd\u4e00\u76ee\u4e86\u7136\u7684\u770b\u5230\u7528\u4f8b\u6267\u884c\u6b65\u9aa4\u3002 \u3010\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\u3011 \u901a\u8fc7\u89c2\u5bdf\u524d\u9762\u7684\u4f8b\u5b50\uff0c\u7ec6\u5fc3\u7684\u540c\u5b66\u53ef\u80fd\u8fd8\u53d1\u73b0\u4e86\u4e00\u4e2a\u5c0f\u7ec6\u8282\uff1a\u51fd\u6570\u529f\u80fd\u8bf4\u660e\u4e2d\uff0c\u4e24\u5bf9\u5927\u62ec\u53f7\u4e2d\u7684\u5185\u5bb9 {{elements}} \u4f5c\u4e3a\u53d8\u91cf\u8f93\u51fa\u51fa\u6765\u4e86\uff1b \u6ca1\u9519\uff0c\u8fd9\u5c31\u662f\u6211\u4eec\u53c2\u8003Django \u548c jinja2 \u7684\u6a21\u677f\u8bed\u6cd5\u8bbe\u8ba1\u51fa\u7684\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\uff0c\u4f7f\u7528\u65b9\u6cd5\u5f88\u7b80\u5355\uff0c\u7528\u4e24\u5bf9\u5927\u62ec\u53f7\u628a\u51fd\u6570\u7684\u53c2\u6570\u62ec\u8d77\u6765\uff0c\u8fd9\u6837\u5728\u65e5\u5fd7\u8f93\u51fa\u7684\u65f6\u5019\u5c31\u80fd\u628a\u8c03\u7528\u51fd\u6570\u65f6\u53c2\u6570\u7684\u503c\u8f93\u51fa\u51fa\u6765\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_7","title":"\u516b\u3001\u73af\u5883\u90e8\u7f72","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_6","title":"1\u3001\u539f\u5219","text":"YouQu \u7684\u73af\u5883\u4f9d\u8d56\u4e00\u76f4\u575a\u6301 2 \u4e2a\u539f\u5219\uff1a \u6700\u5c0f\u73af\u5883\u4f9d\u8d56\u539f\u5219 \u6709\u4e9b\u540c\u5b66\u5199\u4e00\u4e9b\u529f\u80fd\uff0c\u9996\u5148\u60f3\u5230\u7684\u5c31\u662f\u53bb\u641c\u7d22\u5f15\u64ce\u641c\u4e00\u4e0b\uff0c\u770b\u6709\u6ca1\u6709\u73b0\u6210\u7684\u5de5\u5177\u6216\u8005\u4ee3\u7801\u76f4\u63a5\u80fd\u7528\uff0c\u7f8e\u5176\u540d\u66f0\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\uff0c\u522b\u4eba\u5df2\u7ecf\u9020\u597d\u4e86\u8f6e\u5b50\u54b1\u4eec\u5c31\u4e0d\u8981\u91cd\u590d\u53bb\u9020\u4e86\uff0c\u7136\u540e\u4e00\u5207\u4f3c\u4e4e\u90fd\u53d8\u5f97\u90a3\u4e48\u7684\u7406\u6240\u5e94\u5f53\u3002 \u5f53\u7136\u8fd9\u6837\u505a\u65e0\u53ef\u539a\u975e\uff0c\u6211\u76f8\u4fe1\u6709\u8fd9\u6837\u60f3\u6cd5\u5e76\u4e14\u4e00\u76f4\u8df5\u884c\u8fd9\u6837\u505a\u6cd5\u7684\u540c\u5b66\u4e0d\u5728\u5c11\u6570\uff0c\u4f46\u8fd9\u6837\u505a\u6709\u4e00\u4e2a\u5f88\u4e25\u91cd\u7684\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f60\u5199\u4e00\u4e2a\u5927\u578b\u9879\u76ee\u65f6\uff0c\u4f60\u4f1a\u5f15\u5165\u975e\u5e38\u975e\u5e38\u975e\u5e38\u591a\u7684\u4f9d\u8d56\uff0c\u6bd4\u5982\u8981\u505a\u4e2a\u63a5\u53e3\u8bf7\u6c42\u8981\u7528 requests\u3001\u8bfb\u5199\u4e2a\u6570\u636e\u7528 pandas\u3001\u5199\u4e2a\u8868\u683c\u7528 pyopenxl\u3001\u89e3\u6790\u4e2a\u6587\u672c\u8981\u7528\u8fd9\u4e2a\u90a3\u4e2a\u4e09\u65b9\u5e93 ... \u3002 \u6211\u8ba4\u4e3a\u8fd9\u662f\u975e\u5e38\u4e0d\u597d\u7684\u4e60\u60ef\uff0c\u5728\u5b9e\u73b0\u4e00\u4e2a\u529f\u80fd\u7684\u65f6\u5019\uff0c\u9996\u5148\u6211\u4eec\u5e94\u8be5\u53bb\u60f3\u81ea\u5df1\u600e\u4e48\u6837\u53bb\u5b9e\u73b0\uff0c\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff1b \u5982\u679c\u4f60\u4e0d\u4f1a\uff0c\u4f60\u53ef\u4ee5\u53bb\u5b66\u4e60\u4e09\u65b9\u5e93\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u522b\u4eba\u4e09\u65b9\u5e93\u4e5f\u662f\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\u7684\uff0c\u4e3a\u4ec0\u4e48\u54b1\u4eec\u4e0d\u884c\u5462\uff1b\u5982\u679c\u522b\u4eba\u7684\u4f60\u5b9e\u5728\u662f\u770b\u4e0d\u61c2\uff0c\u60f3\u5c3d\u4e00\u5207\u529e\u6cd5\u786e\u5b9e\u505a\u4e0d\u51fa\u6765\uff0c\u90a3\u518d\u8003\u8651\u5f15\u5165\u8fd9\u4e2a\u4e09\u65b9\u5e93\uff0c\u6211\u8ba4\u4e3a\u8fd9\u6837\u662f\u6ca1\u95ee\u9898\u7684\uff0c\u6bd5\u7adf\u54b1\u4eec\u6bb5\u4f4d\u8fd8\u4e0d\u591f\uff0c\u4f46\u5e0c\u671b\u5c06\u6765\u6709\u4e00\u5929\u6211\u4eec\u53ef\u4ee5\u3002 \u8fd9\u6837\u7684\u505a\u6cd5\u624d\u5e94\u8be5\u662f\u201c\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\u201d\u6b63\u786e\u7684\u64cd\u4f5c\u3002\u4e0d\u4f1a\u6ca1\u5173\u7cfb\uff0c\u770b\u770b\u522b\u4eba\u662f\u600e\u4e48\u5b9e\u73b0\u7684\uff0c\u81ea\u5df1\u518d\u6478\u7d22\u7740\u5199\u51fa\u6765\uff0c\u8fd9\u6837\u81ea\u5df1\u624d\u80fd\u6709\u6240\u63d0\u9ad8\uff0c\u4e0d\u7136\u4f60\u5c31\u53ea\u4f1a\u7528\u522b\u4eba\u7684\u4e1c\u897f\uff1b\u90a3\u4e9b\u5632\u7b11\u3001\u6279\u8bc4\u6211\u4eec\u91cd\u590d\u9020\u8f6e\u5b50\u7684\u4eba\uff0c\u5148\u60f3\u60f3\u81ea\u5df1\u4f1a\u9020\u8f6e\u5b50\u5417\u3002 \u672c\u7740\u81ea\u5df1\u5b9e\u73b0\u80fd\u5b9e\u73b0\u7684\u4e00\u5207\u7684\u539f\u5219\uff0cYouQu \u6846\u67b6\u505a\u5230\u4e86\u975e\u5e38\u5c11\u7684\u73af\u5883\u4f9d\u8d56\uff0c\u800c\u4e14\u6211\u4eec\u4ecd\u5728\u4e0d\u65ad\u52aa\u529b\uff0c\u51cf\u5c11\u73af\u5883\u90e8\u7f72\u7684\u4f9d\u8d56\u3002 \u6700\u5c0f\u4ed3\u5e93\u4f53\u79ef\u539f\u5219 \u5927\u6587\u4ef6\u4e0d\u80fd\u4e0a\u4f20\u5230\u5de5\u7a0b\u91cc\u9762\uff0c\u4fdd\u6301\u6574\u4e2a\u5de5\u7a0b\u7684\u8f7b\u91cf\u5316\uff0c\u8fd9\u6837\u5728\u514b\u9686\u4ee3\u7801\u7684\u65f6\u5019\u624d\u80fd\u975e\u5e38\u5feb\u901f\u65b9\u4fbf\u4f7f\u7528\uff0c\u6211\u4eec\u89c1\u8fc7\u4e00\u4e2a AT \u5de5\u7a0b clone \u5927\u5c0f\u8fbe\u5230\u597d\u51e0\u4e2a G\uff0c\u7b80\u76f4\u4e0d\u53ef\u601d\u8bae\u3002 \u5176\u5b9e\u4ee3\u7801\u6587\u4ef6\u7684\u5927\u5c0f\u662f\u5f88\u5c0f\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u7eaf\u5199\u4ee3\u7801\u968f\u4fbf\u5199\u5de5\u7a0b\u4e5f\u4e0d\u4f1a\u592a\u5927\uff0c\u800c\u6587\u6863\uff08\u5305\u542b\u63d2\u56fe\uff09\u7b49\u8d44\u6e90\u5374\u662f\u5f88\u5360\u7a7a\u95f4\u3002 \u56e0\u6b64\u6211\u4eec\u9009\u62e9\u5c06 YouQu \u7684\u6587\u6863\u5de5\u7a0b\u6d89\u53ca\u5230\u7684\u56fe\u7247\u8d44\u6e90\u90fd\u91c7\u7528\u5916\u94fe\u52a0\u8f7d\uff1b"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_6","title":"2\u3001\u5b89\u88c5","text":"\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u8fd0\u884c env.sh \u5373\u53ef\u3002 bash env.sh\n \u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_4","title":"3\u3001\u5b9a\u5236\u4f9d\u8d56","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#31_2","title":"3.1\u3001\u65b0\u589e\u4f9d\u8d56","text":"\u5982\u679c\u5e94\u7528\u5e93\u8fd8\u9700\u8981\u5176\u4ed6 Python \u4f9d\u8d56\u5e93\uff0c\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a requirement.txt \u6587\u4ef6\uff1b autotest_xxx\n\u251c\u2500\u2500 requirement.txt\n\u251c\u2500\u2500 case ...\n \u91cc\u9762\u5199\u5165\u9700\u8981\u5b89\u88c5\u7684\u4e09\u65b9\u4f9d\u8d56\uff0c\u6bd4\u5982\u50cf\u8fd9\u6837\uff1a # requirement.txt\nPyYAML==6.0 # \u6307\u5b9a\u5b89\u88c5\u67d0\u4e2a\u7248\u672c\nrequests # \u672a\u6307\u5b9a\u7248\u672c\u5219\u5b89\u88c5\u6700\u65b0\u7248\n \u5728\u6267\u884c bash env.sh \u65f6\u4f1a\u4e00\u5e76\u5c06\u5176\u5b89\u88c5\u3002 \u5982\u679c\u591a\u4e2a\u5e94\u7528\u5e93\u90fd\u5b58\u5728 requirement.txt \u6587\u4ef6\uff0c\u6267\u884c env.sh \u65f6\u4f1a\u5c06\u591a\u4e2a requirement.txt \u6587\u4ef6\u4e00\u5e76\u52a0\u8f7d\uff1b\u90a3\u4e48\u4e00\u5b9a\u8981\u6ce8\u610f\u591a\u4e2a requirement.txt \u6587\u4ef6\u53ef\u80fd\u5b58\u5728\u76f8\u540c\u7684\u4f9d\u8d56\u88ab\u6307\u5b9a\u5b89\u88c5\u4e0d\u540c\u7248\u672c\u7b49\u7b49\u517c\u5bb9\u6027\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#32_1","title":"3.2\u3001\u88c1\u526a\u4f9d\u8d56","text":"\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0c\u53ef\u80fd\u4f60\u53ea\u9700\u8981\u5b89\u88c5\u4e00\u4e9b\u6700\u6700\u57fa\u7840\u7684\u4f9d\u8d56\uff0c\u5176\u4ed6\u7684\u90fd\u4e0d\u9700\u8981\uff0c\u6bd4\u5982\u7eaf\u63a5\u53e3\u81ea\u52a8\u5316\u7684\u9879\u76ee\uff0c\u5b83\u4e0d\u9700\u8981 UI \u81ea\u52a8\u5316\u76f8\u5173\u7684\u4f9d\u8d56\u3002 \u4f60\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\uff0c\u5b58\u653e\u4e00\u4e2a BASICENV \u7684\u666e\u901a\u6587\u4ef6\uff0c\u91cc\u9762\u4e0d\u9700\u8981\u5199\u4efb\u4f55\u5185\u5bb9\uff0c\u8fd9\u6837\u6267\u884c env.sh \u65f6\uff0c\u53ea\u4f1a\u5b89\u88c5\u6700\u57fa\u7840\u7684\u4f9d\u8d56\u3002 autotest_xxx\n\u251c\u2500\u2500 BASICENV # \u53ef\u4ee5\u4f7f\u7528\uff1atouch BASICENV \u521b\u5efa\u6587\u4ef6\n\u251c\u2500\u2500 case ...\n \u57fa\u7840\u4f9d\u8d56\u4ec5\u5b89\u88c5\u4ee5\u4e0b\u51e0\u4e2a\u5305\uff1a pytest # pytest\npytest-rerunfailures # \u5931\u8d25\u91cd\u8dd1\u63d2\u4ef6\npytest-timeout # \u7528\u4f8b\u8d85\u65f6\u63d2\u4ef6\nallure-pytest # \u751f\u6210 allure \u62a5\u544a\u63d2\u4ef6\nallure.deb # allure \u62a5\u544a\u67e5\u770b\u5de5\u5177\n \u88c1\u526a\u4f9d\u8d56 \u548c \u65b0\u589e\u4f9d\u8d56 \u662f\u4e0d\u51b2\u7a81\u7684\uff0c\u53ef\u4ee5\u540c\u65f6\u4f7f\u7528\u3002 \u6b64\u65b9\u6848\u9ed8\u8ba4\u4e3a\u865a\u62df\u73af\u5883\u90e8\u7f72\uff0c\u5982\u679c\u4f60\u60f3\u76f4\u63a5\u90e8\u7f72\u5728\u672c\u673a\u4e0a\uff1a bash env_dev.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4_4","title":"4\u3001\u865a\u62df\u5316\u90e8\u7f72","text":"YouQu\u9ed8\u8ba4\u91c7\u7528\u865a\u62df\u5316\u90e8\u5206\uff0c\u865a\u62df\u5316\u73af\u5883\u5b9e\u9645\u5b89\u88c5\u7684\u4f4d\u7f6e\u662f\u5728 $HOME/.local/share/virtualenvs/youqu-oHTM7l7G \u76ee\u5f55\u4e0b youqu-oHTM7l7G \u6b64\u76ee\u5f55\u540d\u79f0\u524d\u9762\u90e8\u5206\u662f\u4f60\u7684\u4ee3\u7801\u6839\u76ee\u5f55\u7684\u540d\u79f0\uff0c\u540e\u9762\u90e8\u5206\u662f\u751f\u6210\u7684\u968f\u673a\u5b57\u7b26\u4e32\uff1b \u540c\u5b66\u4eec\u5728\u8fdc\u7a0b\u673a\u5668\u4e0a\u5b9a\u4f4d\u95ee\u9898\u7684\u65f6\u5019\uff0c\u5982\u679c\u4f7f\u7528 Pycharm \u8c03\u8bd5\uff0c\u5c31\u5c06\u89e3\u91ca\u5668\u6307\u5b9a\u5230\u8fd9\u4e2a\u76ee\u5f55\u7684\u5c31\u884c\u4e86\uff1b \u5f53\u7136\uff0c\u6211\u4eec\u4e5f\u63d0\u4f9b\u4e86\u672c\u673a\u5f00\u53d1\u73af\u5883\u90e8\u7f72\uff1a bash env_dev.sh\n \u5982\u679c\u4f60\u662f\u672c\u5730\u5f00\u53d1\u73af\u5883\u53ef\u4ee5\u7528\u5b83\uff0c\u533a\u522b\u5c31\u662f\u9a71\u52a8\u6267\u884c\u7684\u65f6\u5019\u4f7f\u7528\uff1apython3 manage.py xxx"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_8","title":"\u4e5d\u3001\u5931\u8d25\u5f55\u5c4f","text":"\u5f55\u5c4f\u5176\u5b9e\u662f\u4e00\u79cd\u89c6\u9891\u5f62\u5f0f\u7684\u65e5\u5fd7\uff0c\u56e0\u4e3a\u5f88\u591a\u65f6\u5019\u6211\u4eec\u5728\u67e5\u770b\u65e5\u5fd7\u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u51c6\u786e\u7684\u5b9a\u4f4d\u5230\u7528\u4f8b\u5931\u8d25\u7684\u5177\u4f53\u539f\u56e0\uff0c\u56e0\u6b64\u7528\u4f8b\u7684\u5f55\u5c4f\u80fd\u8ba9\u6211\u4eec\u770b\u5230\u7528\u4f8b\u5728\u6267\u884c\u8fc7\u7a0b\uff1b \u3010\u4f7f\u7528\u65b9\u6cd5\u3011 \u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u5173\u6ce8 2 \u4e2a\u53c2\u6570\uff1b ;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\u3002\n;\u6ce8\u610f\uff0c\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u4e0d\u80fd\u5c0f\u4e8e\u5931\u8d25\u5f55\u5c4f\u6b21\u6570\uff0c\u5373 RERUN >= RECORD_FAILED_CASE\nRECORD_FAILED_CASE = 1\n \u9ed8\u8ba4\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u662f 1 \u6b21\uff1b RECORD_FAILED_CASE = 1 \u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff1b RECORD_FAILED_CASE = 0 \u8868\u793a\u4e0d\u7ba1\u7528\u4f8b\u6210\u529f\u6216\u5931\u8d25\u90fd\u5f55\u5c4f\uff1b \u5f55\u5c4f\u662f\u8981\u5360\u7528\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u7279\u522b\u662f\u5728\u4e00\u4e9b\u914d\u7f6e\u8f83\u4f4e\u7684\u673a\u5668\u4e0a\u4f1a\u5f88\u660e\u663e\uff0c\u6240\u4ee5\u4f60\u9700\u8981\u8003\u8651\u662f\u5426\u6709\u5fc5\u8981\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1b \u4f7f\u7528 manage.py \u6267\u884c\u7528\u4f8b\u9ed8\u8ba4\u8bfb\u53d6\u5230 globalconfig.ini \u91cc\u9762\u7684\u53c2\u6570\uff0c\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report/record \u76ee\u5f55\u4e0b\u4fdd\u5b58\u5931\u8d25\u7528\u4f8b\u7684\u5f55\u5c4f\u548c\u65ad\u8a00\u7684\u90a3\u4e2a\u65f6\u95f4\u70b9\u7684\u622a\u5c4f\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7\u89c6\u9891\u6587\u4ef6\u770b\u5230\u5931\u8d25\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u90fd\u53d1\u751f\u4e86\u4ec0\u4e48\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#wayland","title":"\u5341\u3001Wayland \u9002\u914d","text":"Wayland \u4e0b\u81ea\u52a8\u5316\u4e3b\u8981\u95ee\u9898\u662f X11 \u4e0b\u7684\u952e\u9f20\u64cd\u4f5c\u65b9\u6cd5\u65e0\u6cd5\u4f7f\u7528\uff0c\u6bd4\u5982 Xdotool\u3001 PyAutoGUI\u3001Xwininfo \u7b49\u7b49\uff1b YouQu \u5728 Wayland \u4e0b\u517c\u5bb9\u9002\u914d\uff0cenv.sh \u5728 Wayland \u4e0b\u6267\u884c\u65f6\u4f1a\u5b89\u88c5\u81ea\u7814\u7684\u952e\u9f20\u64cd\u4f5c\u670d\u52a1\uff08\u53ef\u80fd\u5b58\u5728\u4e00\u4e9b\u4f9d\u8d56\u62a5\u9519\uff0c\u6309\u7167\u6ce8\u91ca\u89e3\u51b3\u5373\u53ef\uff09\uff0c\u6846\u67b6\u6838\u5fc3\u5e93\u4e5f\u9488\u5bf9\u6027\u7684\u505a\u4e86\u9002\u914d\uff0c\u4e0a\u5c42\u7528\u4f8b\u5b8c\u5168\u4e0d\u7528\u5173\u5fc3\u673a\u5668\u662fWayland \u8fd8\u662f X11\uff0c\u6846\u67b6\u4f1a\u6839\u636e\u6267\u884c\u65f6\u72b6\u6001\u81ea\u52a8\u5224\u65ad\u8d70\u4e0d\u540c\u7684\u903b\u8f91\uff1b \u7b80\u5355\u8bb2\u5c31\u662f\uff0c\u5e94\u7528\u5e93\u53ea\u9700\u8981\u7ef4\u62a4\u4e00\u5957\u7528\u4f8b\u811a\u672c\u5373\u53ef\u3002 \u3010\u7528\u4f8b\u517c\u5bb9\u3011 \u56e0\u4e3a Wayland \u4e0b\u6709\u4e9b\u5e94\u7528\u7684\u754c\u9762\u663e\u793a\u548c\u529f\u80fd\u672c\u8eab\u5b58\u5728\u4e00\u4e9b\u5dee\u5f02\uff0c\u7528\u4f8b\u5c42\u53ef\u80fd\u9700\u8981\u5bf9\u8fd9\u90e8\u5206\u7528\u4f8b\u505a\u903b\u8f91\u5224\u65ad\uff0c\u4f7f\u7528\u5168\u5c40\u914d\u7f6e\u91cc\u9762\u7684\u5e38\u91cf\u8fdb\u884c\u903b\u8f91\u7f16\u5199\u5373\u53ef\uff1a from setting.globalconfig import GlobalConfig\n# GlobalConfig.IS_WAYLAND \u83b7\u53d6\u5230\u5f53\u524d\u7684\u663e\u793a\u670d\u52a1\u5668\uff08bool\uff09\n# \u5e94\u7528\u5e93 Config \u7ee7\u627f GlobalConfig\nif Config.IS_WAYLAND:\npass\nif Config.IS_X11:\npass\n \u6bd4\u5982\u7528\u4f8b\u91cc\u9762\u5982\u679c\u65ad\u8a00\u7684\u56fe\u7247\u4e0d\u540c\uff1a if Config.IS_WAYLAND:\nself.assert_image_exist(\"wayland_XXX\")\nelse:\nself.assert_image_exist(\"x11_XXX\")\n \u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u811a\u672c\u5728 Wayland \u548c X11 \u4e0b\u90fd\u53ef\u4ee5\u8dd1\uff0cso easy \u662f\u4e0d\u662f\uff1f\u5b8c\u5168\u6ca1\u5fc5\u8981\u4e13\u95e8\u62c9\u65b0\u5206\u652f\u8fdb\u884c Wayland \u9002\u914d\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_9","title":"\u5341\u4e00\u3001\u6d4b\u8bd5\u62a5\u544a","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_7","title":"1. \u76ee\u5f55\u7ed3\u6784","text":"\u6267\u884c\u65f6\u4f1a\u5728\u6839\u76ee\u5f55\u4e0b\u52a8\u6001\u751f\u6210 report \u76ee\u5f55\uff0c\u6240\u6709\u7684\u62a5\u544a\u76f8\u5173\u7684\u6587\u4ef6\u4f1a\u7edf\u4e00\u5b58\u653e\u5728\u91cc\u9762\uff0c\u793a\u4f8b\uff1a /report\n \u251c\u2500\u2500 allure # allure\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json\n \u251c\u2500\u2500 allure_html # \u751f\u6210\u7684html\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 index.html \u251c\u2500\u2500 allure_back # allure\u62a5\u544a\u5907\u4efd\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 20221108114823\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json\n \u251c\u2500\u2500 json # json\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 result_deepin-music_20221109134736_1081333.json\n \u251c\u2500\u2500 logs # \u65e5\u5fd7\u6587\u4ef6\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 2022-11-10_debug.log \u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-10_error.log\n \u251c\u2500\u2500 record # \u5f55\u5c4f\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-09\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 15\u65f614\u520609\u79d2_test_music_303_2_autotest.mp4\n \u2514\u2500\u2500 xml # xml\u62a5\u544a\n\u2514\u2500\u2500 autotest_deepin_music-20221109134736.xml\n \u9ed8\u8ba4\u60c5\u51b5\u4e0b\u540c\u65f6\u751f\u6210 html\u3001xml\u3001json\u4e09\u79cd\u5f62\u5f0f\u7684\u62a5\u544a\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_7","title":"2. \u5b9a\u5236\u62a5\u544a","text":"\u6211\u4eec\u5bf9 allure \u62a5\u544a\u8fdb\u884c\u4e86\u4e00\u7cfb\u5217\u7684\u5b9a\u5236\uff1a \u5b9a\u5236 logo\u3001title\u3001\u62a5\u544a\u9ed8\u8ba4\u8bed\u8a00\u4e3a\u4e2d\u6587\uff1b \u52a0\u5165\u4e86\u7528\u4f8b\u65ad\u8a00\u5931\u8d25\u65f6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u4ee5\u53ca\u6b64\u65f6\u56fe\u50cf\u5bf9\u6bd4\u7684\u6a21\u677f\u56fe\u7247\uff1b \u52a0\u5165\u4e86\u5931\u8d25\u5f55\u5c4f\uff0c\u4f60\u53ef\u4ee5\u5728 html \u62a5\u544a\u4e2d\u76f4\u63a5\u770b\u5f55\u5236\u7684\u89c6\u9891\uff1b \u52a0\u5165\u4e86 IP \u5730\u5740\u3001\u7cfb\u7edf\u4fe1\u606f\u3001\u955c\u50cf\u7248\u672c\u7b49\uff1b "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_5","title":"3. \u67e5\u770b\u62a5\u544a","text":" \u672c\u5730\u6267\u884c \u5728 report/allure \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u4e00\u5806\u6587\u672c\u6587\u4ef6\uff0c\u8fd9\u4e9b\u662f allure \u63d2\u4ef6\u751f\u6210\u7684\u62a5\u544a\u6e90\u6570\u636e\uff0c\u6211\u4eec\u5728 report/allure_html \u76ee\u5f55\u4e0b\u7ed9\u4f60\u751f\u6210\u4e86 html \u6587\u4ef6\uff0c\u4f46\u662f\u4f60\u4e0d\u80fd\u76f4\u63a5\u901a\u8fc7\u6d4f\u89c8\u5668\u6253\u5f00 index.html \u6587\u4ef6\uff0c\u56e0\u4e3a allure \u7684\u62a5\u544a\u90fd\u662f\u57fa\u4e8e\u5728\u7ebf\u7684\u670d\u52a1\uff0c\u4f60\u5e94\u8be5\u8fd9\u6837\u6253\u5f00\uff1a allure open report/allure_html\n \u4f7f\u7528 manage.py \u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u5728\u7ec8\u7aef\u7684\u6700\u540e\u4e00\u884c\uff0c\u6211\u4eec\u4f1a\u7ed9\u4f60\u8f93\u51fa\u6253\u5f00\u62a5\u544a\u7684\u547d\u4ee4\uff0c\u76f4\u63a5\u590d\u5236\u5b83\u5728\u7ec8\u7aef\u6267\u884c\u5c31\u53ef\u4ee5\u67e5\u770b\u4e86\uff0c\u50cf\u8fd9\u6837\uff1a \u7ec8\u7aef\u6267\u884c\u547d\u4ee4: allure open /tmp/youqu/report/allure_html \u67e5\u770b\u62a5\u544a \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 Pycharm \u91cc\u9762\u627e\u5230 index.html \u6587\u4ef6\uff0c\u7136\u540e\u53f3\u952e\u9009\u62e9\u6d4f\u89c8\u5668\u6253\u5f00\uff0c\u6216\u8005\u4f60\u53ef\u4ee5\u7528\u4e00\u4e2a http \u670d\u52a1\u6253\u5f00\u3002 \u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 report/allure \u76ee\u5f55\u4e0b\u67e5\u770b\u62a5\u544a\uff1a allure serve report/allure\n \u8fdc\u7a0b\u6267\u884c \u8fdc\u7a0b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\uff0c\u4f1a\u5c06\u6240\u6709\u8fdc\u7a0b\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u62a5\u544a\u90fd\u6536\u96c6\u5230 report/allure \u76ee\u5f55\u4e0b\uff0c\u5206\u522b\u6309\u7167\u673a\u5668\u7684 IP \u7b49\u5efa\u4e86\u4e0d\u540c\u7684\u76ee\u5f55\uff0c\u4f60\u53ef\u4ee5\u5728\u8fd9\u4e9b\u76ee\u5f55\u91cc\u9762\u53bb\u67e5\u770b\u5bf9\u5e94\u7684\u6d4b\u8bd5\u62a5\u544a\uff0c\u67e5\u770b\u65b9\u6cd5\u548c\u524d\u9762\u672c\u5730\u6267\u884c\u67e5\u770b\u7684\u65b9\u6cd5\u4e00\u6837\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_10","title":"\u5341\u4e8c\u3001\u9759\u6001\u4ee3\u7801\u626b\u63cf","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_8","title":"1. \u63d0\u524d\u89e3\u51b3\u4ee3\u7801\u95ee\u9898","text":"\u4e3a\u4e86\u5e2e\u52a9\u5f00\u53d1\u8005\u7edf\u4e00\u4ee3\u7801\u98ce\u683c\uff0cPython \u793e\u533a\u63d0\u51fa\u4e86 PEP8 \u4ee3\u7801\u7f16\u7801\u98ce\u683c\uff0cPython \u5b98\u65b9\u540c\u65f6\u63a8\u51fa\u4e86\u4e00\u4e2a\u68c0\u67e5\u4ee3\u7801\u98ce\u683c\u662f\u5426\u7b26\u5408 PEP8 \u7684\u5de5\u5177\uff0c\u540d\u5b57\u4e5f\u53eb PEP8\u3002 \u4f46\u662f\uff0cPycharm \u91cc\u9762\u7684 PEP8 \u63d2\u4ef6\u5b9e\u9645\u4e0a\u5e76\u4e0d\u80fd\u53d1\u73b0\u5f88\u591a\u4ee3\u7801\u95ee\u9898\uff0c\u8fd9\u4e9b\u95ee\u9898\u5e76\u4e0d\u4f1a\u5728\u8fd0\u884c\u65f6\u62a5\u9519\uff0c\u56e0\u4e3a\u4ece Python \u8bed\u8a00\u89d2\u5ea6\u5e76\u4e0d\u5173\u5fc3\u8fd9\u4e9b\u95ee\u9898\uff0c\u5728 Pycharm \u7f16\u8f91\u5668\u91cc\u9762\u4f7f\u7528\u5feb\u6377\u952e ctrl + alt + L\uff0c\u6709\u4e00\u70b9\u70b9\u683c\u5f0f\u5316\u7684\u6548\u679c\uff0c\u80fd\u89e3\u51b3\u4e00\u4e9b\u7a7a\u683c\u3001\u6362\u884c\u7b49\u5c0f\u95ee\u9898\u3002 \u8fd9\u91cc\u63a8\u8350\u4e00\u4e2a Python \u793e\u533a\u6d41\u884c\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff1a Black\uff0c\u53f7\u79f0\u4e0d\u59a5\u534f\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff0c\u5b83\u68c0\u6d4b\u5230\u4e0d\u7b26\u5408\u89c4\u8303\u7684\u4ee3\u7801\u98ce\u683c\u76f4\u63a5\u5c31\u5e2e\u4f60\u5168\u90e8\u683c\u5f0f\u5316\u597d\uff0c\u5c31\u662f\u8fd9\u4e48\u521a\uff01 \u5b89\u88c5\uff1a sudo pip3 install black \n \u4f7f\u7528\u65b9\u6cd5\uff1a black ${CheckPath}\n \u4f7f\u7528\u8fd9\u4e2a\u5de5\u5177\u683c\u5f0f\u5316\u4e4b\u540e\uff0c\u4ee3\u7801\u4f1a\u88ab\u81ea\u52a8\u8c03\u6574\uff0c\u521a\u5f00\u59cb\u4f60\u53ef\u80fd\u4f1a\u89c9\u5f97\u8c03\u6574\u5f97\u5f88\u5938\u5f20\uff0c\u6ca1\u5173\u7cfb\u575a\u6301\u770b\uff0c\u4e60\u60ef\u4e4b\u540e\uff0c\u4f60\u4f1a\u89c9\u5f97\u5f88\u4f18\u96c5\uff0c\u6ca1\u9519\uff0c\u8fd9\u5c31\u662f Pythonic Code \u7684\u6838\u5fc3\uff0c\u8bf7\u4fdd\u6301\u4f18\u96c5\uff5e\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_8","title":"2. \u4ee3\u7801\u626b\u63cf\u5de5\u5177","text":"\u4f7f\u7528\u6839\u76ee\u5f55\u4e0b pylint.sh \u626b\u63cf\u4ee3\u7801\uff0c\u5728 report \u76ee\u5f55\u4e0b\u67e5\u770b\u4ee3\u7801\u626b\u63cf\u62a5\u544a\uff0c\u5982\u679c\u6709\u4ee3\u7801\u95ee\u9898\u8bf7\u63d0\u524d\u89e3\u51b3\u4e4b\u540e\u518d\u63d0\u4ea4\u3002 \u6b64\u811a\u672c\u5df2\u7ecf\u4f7f\u7528 Python \u793e\u533a\u6700\u6d41\u884c\u7684\u4ee3\u7801\u626b\u63cf\u5de5\u5177 Pylint \u8fdb\u884c\u4ee3\u7801\u626b\u63cf\u3002 \u4f7f\u7528\u65b9\u6cd5\uff1a bash pylint.sh\n \u8fd0\u884c\u4e4b\u540e\u4f1a\u63d0\u793a\u4f60\u8981\u626b\u63cf\u7684\u76ee\u5f55\uff0c\u6bd4\u5982\u8f93\u5165 apps \uff0c\u5219\u4f1a\u626b\u63cf apps \u4e0b\u7684\u6240\u6709 Python \u4ee3\u7801\u3002 \u5728 setting/pylintrc.cfg \u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u76f8\u5173\u914d\u7f6e\uff0c\u626b\u63cf\u5b8c\u6210\u4e4b\u540e\u5728 report/pylints \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u626b\u63cf\u62a5\u544a\u3002 \u4ee3\u7801\u63d0\u4ea4\u9700\u901a\u8fc7 git review \u63d0\u4ea4\u5230 gerrit \uff0c\u4eba\u5de5 Code Review \u901a\u8fc7\u4e4b\u540e\u5408\u5165\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_11","title":"\u5341\u4e09\u3001\u63d0\u4ea4\u4ee3\u7801","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_9","title":"1. \u5b89\u88c5\u4f9d\u8d56","text":"sudo apt install git-review\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_9","title":"2. \u63d0\u4ea4\u6a21\u677f","text":"\u5728 ~ \u76ee\u5f55\u4e0b\u65b0\u5efa\u6587\u4ef6\uff0c\u5e76\u547d\u540d\u4e3a gitcommit_template \u5c06\u4ee5\u4e0b\u5185\u5bb9\u5199\u5165\u6587\u4ef6\u5f53\u4e2d\uff1a # commit type :fix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style(\u98ce\u683c\u4fee\u6539)\u3001refactor(\u91cd\u6784)\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test(\u6d4b\u8bd5) + \u7b80\u5355\u63cf\u8ff0. \u9ed8\u8ba4fix,\u6839\u636e\u60c5\u51b5\u4fee\u6539\nfix: \n\n# \u8be6\u7ec6\u8bf4\u660e\u4ee3\u7801\u7684\u6539\u52a8\uff0c\u5305\u542b\u4ee3\u7801\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u4ee5\u53ca\u4e3a\u4ec0\u4e48\u8fd9\u4e48\u505a\uff0c\u53ef\u80fd\u4f1a\u5f71\u54cd\u54ea\u4e9b\u529f\u80fd\u3002\u5bf9\u4e8e\u4ee3\u7801\u7684\u5ba1\u6838\u8005\uff0c\u9700\u8981\u4ece\u8fd9\u6bb5\u63cf\u8ff0\u4e2d\u80fd\u5b8c\u5168\u7406\u89e3\u4ee3\u7801\u4e2d\u6240\u6709\u6539\u52a8\u7684\u5185\u5bb9\nDescription: \n\n# \u5199\u4e00\u6bb5\u9762\u5411\u4e8e\u4ea7\u54c1\u7684\u603b\u7ed3\u6027\u5185\u5bb9\uff0c\u7528\u4e8e\u81ea\u52a8\u751f\u6210crp\u4e0a\u7684changlog\uff0c\u9700\u8981\u6ce8\u610f\u7684\u4e8b\uff0c\u8fd9\u6bb5\u63cf\u8ff0\u5fc5\u987b\u4ece\u4ea7\u54c1\u7684\u89d2\u5ea6\u8003\u8651\u3002\nLog: \n\n# \u5173\u8054pms\u4e0a\u7684bug\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94bug\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4fee\u590dbug\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Bug: \n\n# \u4fee\u590d github issue \n#Issue: \n\n# \u5173\u8054pms\u4e0a\u7684\u4efb\u52a1\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94\u4efb\u52a1\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4efb\u52a1\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Task: \n \u547d\u4ee4\u884c\u6267\u884c: git config --global commit.template ~/gitcommit_template\n \u6b64\u547d\u4ee4\u5c06\u6a21\u677f\u52a0\u5165\u5230 git \u7684\u63d0\u4ea4\u6a21\u677f\u4e2d\u3002 \u540e\u7eed\u63d0\u4ea4\u7684\u65f6\u5019\u9700\u8981\u5173\u6ce8\u4e00\u4e0b\u51e0\u70b9\uff1a commit type \u5bf9\u5e94\u4e0d\u540c\u7684\u4fee\u6539\u7c7b\u578b\uff1afix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style \uff08\u98ce\u683c\u4fee\u6539\uff09\u3001refactor \uff08\u91cd\u6784\uff09\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test \uff08\u6d4b\u8bd5\uff09 commit type \u5192\u53f7\u540e\u9762\u52a0\u7a7a\u683c\u3002 Description \u5fc5\u8981\u7684\u60c5\u51b5\u4e0b\u9700\u8981\u8fdb\u884c\u8be6\u7ec6\u8bf4\u660e\uff0c\u6bd4\u5982\u5bf9\u529f\u80fd\u8fdb\u884c\u5927\u6539\u7b49\u3002 "},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3_6","title":"3. \u63a8\u9001\u4ee3\u7801","text":"\u9996\u5148\u6dfb\u52a0 commit \u4fe1\u606f git add \u540e\u9762\u52a0\u6587\u4ef6\u540d\u79f0\n git add . # \u8868\u793a\u6dfb\u52a0\u6240\u6709\u6587\u4ef6\n \u4f7f\u7528\u8fd9\u6761\u547d\u4ee4\u6ce8\u610f\u6709\u4e9b\u4e34\u65f6\u6587\u4ef6\u4e0d\u8981\u63d0\u4ea4\u5230\u4ed3\u5e93\u4e86\u3002 git commit -a\n \u4e4b\u540e\u5728 fix: \u540e\u9762\uff08\u6ce8\u610f\u5192\u53f7\u540e\u9762\u5fc5\u987b\u52a0\u7a7a\u683c\uff0c\u4e0d\u7136\u76f4\u63a5-1\uff09\u5199\u672c\u5730\u63d0\u4ea4\u7684 commit \u4fe1\u606f\uff0c\u7136\u540e\u5c31\u53ef\u4ee5\u63d0\u4ea4\u4ee3\u7801\u4e86 git review branch(\u5f53\u524d\u5206\u652f) -r origin\n \u6700\u597d\u4e00\u6b21 commit\uff0c\u4e00\u6b21 git review \uff0c\u7ecf\u5e38\u6709\u540c\u5b66\u5728\u672c\u5730\u75af\u72c2 commit \u6700\u540e git review \u62a5\u9519\u4e0d\u77e5\u9053\u548b\u56de\u4e8b\u513f\u3002 \u82e5\u4e0d\u60f3\u6bcf\u6b21\u63d0\u4ea4\u90fd\u52a0\u4e0a -r \u9009\u9879\uff0c\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a git config --global gitreview.remote origin \u63d0\u4ea4\u4ee3\u7801\uff0c\u76f4\u63a5\u4f7f\u7528 git review branch<\u76ee\u6807\u5206\u652f>\uff0c\u4f8b\u5982 git review master"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git","title":"4. Git\u6807\u7b7e","text":"Git \u6807\u7b7e\u5b9e\u9645\u4e0a\u662f commit \u7684\u4e00\u4e2a\u522b\u540d\uff0c\u4e3b\u8981\u7528\u4e8e\u7ba1\u7406\u5386\u53f2\u7248\u672c\u3002 \u60f3\u8c61\u4e00\u4e0b\u9886\u5bfc\u8ba9\u4f60\u628a\u4e4b\u524d\u7684\u67d0\u4e2a\u7248\u672c\u7684\u4ee3\u7801\u62c9\u51fa\u6765\u8dd1\uff0c\u4f60\u662f\u4e0d\u662f\u4e56\u4e56\u7684\u53bb\u628a\u6240\u6709\u63d0\u4ea4\u8bb0\u5f55\u62c9\u51fa\u6765\u627e\uff0c\u7136\u540e\u627e\u5230\u90a3\u4e2a\u54c8\u5e0c\u503c\uff0c\u901a\u8fc7\u54c8\u5e0c\u503c\u6765\u68c0\u51fa\u4ee3\u7801\u3002 \u8fd9\u4e00\u5957\u64cd\u4f5c\u4e0b\u6765\u662f\u4e0d\u662f\u5f88\u9ebb\u70e6\uff0c\u8d39\u65f6\u95f4\u8fd8\u4e0d\u4e00\u5b9a\u80fd\u627e\u5f97\u5230\uff0c\u6ca1\u4eba\u80fd\u8bb0\u4f4f\u6bcf\u4e2a\u63d0\u4ea4\u54c8\u5e0c\u503c\u4ee5\u53ca\u8fd9\u6b21\u63d0\u4ea4\u90fd\u6539\u4e86\u54ea\u4e9b\u4ee3\u7801\u3002 \u56e0\u6b64\u7ed9\u63d0\u4ea4\u6253\u4e2a\u6807\u7b7e\uff0c\u5c31\u662f\u628a\u54c8\u5e0c\u503c\u8f6c\u6362\u6210\u4eba\u7c7b\u80fd\u7406\u89e3\u7684\u8bed\u8a00\uff0c\u6bd4\u5982 v1.0\uff0c\u5c31\u53ef\u4ee5\u76f4\u63a5\u901a\u8fc7\u6807\u7b7e\u627e\u5230\u5bf9\u5e94\u7684\u63d0\u4ea4\u3002 \u65b0\u5efa\u6807\u7b7e git tag -a <tagname>\n \u56de\u8f66\u4e4b\u540e\uff0cGit \u4f1a\u6253\u5f00\u4f60\u7684\u7f16\u8f91\u5668\uff0c\u8ba9\u4f60\u5199\u4e00\u53e5\u6807\u7b7e\u6ce8\u89e3\uff0c\u5c31\u50cf\u4f60\u7ed9\u63d0\u4ea4\u5199\u6ce8\u89e3\u4e00\u6837\u3002 \u67e5\u770b\u6240\u6709\u6807\u7b7e git tag -l\n# git tag \u4e5f\u884c\n \u5220\u9664\u6807\u7b7e git tag -d <tagname>\n \u63a8\u9001\u6807\u7b7e\u81f3\u8fdc\u7a0b git push \u547d\u4ee4\u5e76\u4e0d\u4f1a\u4f20\u9001\u6807\u7b7e\u5230\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\uff0c\u5fc5\u987b\u663e\u5f0f\u5730\u63a8\u9001\u6807\u7b7e\u3002 git push origin <tagname>\n \u63a8\u9001\u6240\u6709\u4e0d\u5728\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\u7684\u6807\u7b7e git push origin --tag\n \u5220\u9664\u8fdc\u7a0b\u6807\u7b7e git push origin :refs/tag/<tagname>\n \u540e\u671f\u6253\u6807\u7b7e \u5148\u7528 git log --pretty=oneline \u67e5\u8be2\u63d0\u4ea4\u8bb0\u5f55\uff0c\u83b7\u53d6\u6821\u9a8c\u7801\u3002 git tag -a <tagname> 9fceb02(\u6821\u9a8c\u7801)\n \u68c0\u51fa\u6807\u7b7e git checkout <tagname>\n \u6b64\u65f6\uff0c\u4ed3\u5e93\u4f1a\u5904\u4e8e\u201c\u5206\u79bb\u5934\u6307\u9488\uff08detached HEAD\uff09\u201d\u7684\u72b6\u6001\u3002 \u5728\u201c\u5206\u79bb\u5934\u6307\u9488\u201d\u72b6\u6001\u4e0b\uff0c\u5982\u679c\u4f60\u505a\u4e86\u67d0\u4e9b\u66f4\u6539\u7136\u540e\u63d0\u4ea4\u5b83\u4eec\uff0c\u6807\u7b7e\u4e0d\u4f1a\u53d1\u751f\u53d8\u5316\uff0c \u4f46\u4f60\u7684\u65b0\u63d0\u4ea4\u5c06\u4e0d\u5c5e\u4e8e\u4efb\u4f55\u5206\u652f\uff0c\u5e76\u4e14\u5c06\u65e0\u6cd5\u8bbf\u95ee\uff0c\u9664\u975e\u901a\u8fc7\u786e\u5207\u7684\u63d0\u4ea4\u54c8\u5e0c\u624d\u80fd\u8bbf\u95ee\u3002 \u56e0\u6b64\uff0c\u5982\u679c\u4f60\u9700\u8981\u8fdb\u884c\u66f4\u6539\uff0c\u6bd4\u5982\u4f60\u8981\u4fee\u590d\u65e7\u7248\u672c\u4e2d\u7684\u9519\u8bef\uff0c\u90a3\u4e48\u901a\u5e38\u9700\u8981\u521b\u5efa\u4e00\u4e2a\u65b0\u5206\u652f\uff1a git checkout -b <NewBranchName> <tagname>\n \u65b0\u5206\u652f\u4e0a\u53ef\u4ee5\u8fdb\u884c\u63d0\u4ea4\u4ee3\u7801\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#_12","title":"\u5341\u56db\u3001\u5e38\u89c1\u95ee\u9898","text":""},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#1_10","title":"1. \u63d0\u4ea4\u4ee3\u7801\u65f6\u63d0\u793a\u90ae\u7bb1\u6216\u8005\u540d\u79f0\u4e0d\u5bf9","text":"\u91cd\u65b0\u914d\u7f6e\u90ae\u7bb1\u6216\u8005\u540d\u79f0\uff0c\u7136\u540e\u91cd\u7f6e\u751f\u6548\uff1a git commit --amend --reset-author\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#2_10","title":"2. \u600e\u4e48\u56de\u6eda\u5230\u4e4b\u524d\u7684\u7248\u672c","text":"(1)\u67e5\u8be2\u5386\u53f2\u63d0\u4ea4\u8bb0\u5f55 git log\n \u627e\u5230\u4f60\u8981\u56de\u6eda\u7684\u7248\u672c\uff0c\u590d\u5236 hash \u503c\u3002 \u6ce8\u610f\uff1a\u662f commit \u7a7a\u683c\u4e4b\u540e\u7684 hash \u503c\uff0c\u4e4b\u524d\u6709\u540c\u5b66\u590d\u5236\u7684 Change-Id: \u8fd9\u6837\u80af\u5b9a\u62a5\u9519\u3002 (2)\u56de\u6eda\u7248\u672c\uff0c\u4e0d\u6e05\u9664\u4ee3\u7801 git reset --soft ${hash}\n (3)\u56de\u6eda\u7248\u672c\uff0c\u6e05\u9664\u4ee3\u7801\uff0c\u614e\u7528\u54c8 git reset --hard ${hash}\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#3-f-s-e","title":"3. \u6d4b\u8bd5\u62a5\u544a\u91cc\u9762 F S . E \u662f\u4ec0\u4e48\u610f\u601d","text":"F \u8868\u793a\u5931\u8d25\uff0c. \uff08\u70b9\uff09\u8868\u793a\u901a\u8fc7\uff0cS \u8868\u793a\u8df3\u8fc7\uff0cE \u8868\u793a error \u6709\u62a5\u9519"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#4-git-status","title":"4. \u89e3\u51b3 git status \u4e2d\u6587\u663e\u793a\u7684\u95ee\u9898","text":"git config --global core.quotePath false\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#5-apps","title":"5. apps \u76ee\u5f55\u4e0b\u989c\u8272\u6709\u4e9b\u662f\u9ec4\u8272\u7684","text":"\u5728 Pycharm \u4e2d apps \u76ee\u5f55\u4e0b\u5e94\u7528\u5e93\u6587\u4ef6\u662f\u9ec4\u8272\u7684\uff0c\u7f16\u8f91\u5668\u8bc6\u522b\u4e0d\u5230\u4ee3\u7801\u65b0\u589e\u548c\u4fee\u6539\uff1b \u7531\u4e8e\u793e\u533a\u7248 Pycharm \u4e0d\u80fd\u52a8\u6001\u8bc6\u522b\u591a\u4ed3\u5e93\uff0c\u9700\u8981\u5728 setting \u91cc\u9762\u624b\u52a8\u6ce8\u518c\uff0c\u64cd\u4f5c\u6b65\u9aa4\uff1a File \u2014> Settings \u2014> Version Control \u2014> \u70b9 + \u53f7 \u2014> Directory \u9009\u4e2d\u5e94\u7528\u5e93\u5de5\u7a0b\u76ee\u5f55 \u2014> VCS \u9009\u4e2d Git \u2014> Apply \u5982\u6b64\u5c31\u53ef\u4ee5\u4e86\u3002 \u4e13\u4e1a\u7248 Pycharm \u4e0d\u5b58\u5728\u8fd9\u4e2a\u95ee\u9898\u3002"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#6-envsh-r","title":"6. \u6267\u884c env.sh \u62a5\u9519 $'\\r':\u672a\u627e\u5230\u547d\u4ee4","text":"\u51fa\u73b0\u8fd9\u4e2a\u95ee\u9898\u4f60\u5e94\u8be5\u662f\u5728 windows \u4e0a\u6253\u5f00\u6216\u7f16\u8f91\u8fc7 env.sh \u811a\u672c\uff0cwindows\u4e0b\u7684\u6362\u884c\u662f\u56de\u8f66\u7b26+\u6362\u884c\u7b26\uff0c\u4e5f\u5c31\u662f\\r\\n\uff0c\u800c Linxu \u4e0b\u662f\u6362\u884c\u7b26 \\n\uff0cLinux \u4e0b\u4e0d\u8bc6\u522b \\r\uff0c\u56e0\u6b64\u62a5\u9519\u3002 \u89e3\u51b3\u65b9\u6848\uff1a # \u5c06 \\r \u66ff\u6362\u4e3a\u7a7a\nsudo sed -i 's/\\r//' env.sh\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#7","title":"7.\u600e\u6837\u4e3a\u5355\u72ec\u67d0\u4e00\u6761\u7528\u4f8b\u914d\u7f6e\u6267\u884c\u8d85\u65f6\u65f6\u95f4","text":"\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u5982\u4e0b\uff1a @pytest.mark.timeout(300) # \u5355\u4f4d\u79d2\ndef test_xxx_001():\npass\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#8-youqu","title":"8. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u6240\u6709\u4ee3\u7801\uff0c\u5305\u542b\u5b50\u4ed3\u5e93","text":"\u524d\u7f6e\u6761\u4ef6\uff1a\u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 # \u7b2c\u4e00\u6b21\u5b58\u50a8\u5bc6\u7801\uff0c\u63d0\u4f9b\u540e\u9762\u62c9\u4ee3\u7801(gerrit: ldap\u8d26\u53f7\u548c\u5bc6\u7801\uff0cgit\u62c9\u53d6\u7b2c\u4e00\u6b21\u8f93\u5165\u4fdd\u5b58\uff0c\u540e\u9762\u76f4\u63a5\u4f7f\u7528)\ngit config --global credential.helper store\n\n# \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\uff0c\u5e76\u9012\u5f52\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\" --recursive\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#9-youqu","title":"9. \u5982\u4f55\u62c9\u53d6 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\u6307\u5b9a\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u524d\u7f6e\u6761\u4ef6\uff1a \u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4 \u5df2\u5b58\u50a8\u8bbf\u95ee\u5bc6\u7801 # \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\"\n# \u6307\u5b9a\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ncd youqu\ngit submodule update --init apps/autotest_xxx_xxx\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#10-youqu","title":"10. \u5982\u4f55\u66f4\u65b0 YouQu \u81ea\u52a8\u5316\u9879\u76ee\u4e2d\uff0c\u6240\u6709\u5b50\u4ed3\u5e93\u7684\u4ee3\u7801","text":"\u66f4\u65b0\u6240\u6709\u5b50\u4ed3\u5e93\u4ee3\u7801 cd youqu\ngit pull & git submodule foreach git pull\n"},{"location":"%E6%A1%86%E6%9E%B6%E5%8A%9F%E8%83%BD%E4%BB%8B%E7%BB%8D/#11-youqu-master-detached-head","title":"11. \u5982\u4f55\u4fee\u590d YouQu \u6240\u6709\u5b50\u4ed3\u5e93 master \u5206\u652f\u6e38\u79bb\u5934\uff08detached head\uff09","text":"\u4fee\u590d\u6240\u6709\u5b50\u4ed3\u5e93\u9ed8\u8ba4master \u5206\u652f\u6e38\u79bb\u5934 cd youqu\ngit submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/","title":"\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212","text":" \u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u89c4\u5212 \u5206\u7c7b\uff1a/ \u67b6\u6784\u5e08\uff1a/ \u76ee\u6807\uff1a \u5e94\u7528 AT \u67b6\u6784\u5de5\u7a0b\u5316\uff0c\u53c2\u8003\u6027\u80fd\u81ea\u52a8\u5316\u5de5\u7a0b\u5b8c\u6210\u5de5\u7a0b\u5316\u6539\u9020\u3002 \u5e94\u7528\u95f4\u7528\u4f8b\u89e3\u8026\uff0c\u89e3\u9664\u6240\u6709\u4ea4\u53c9\u8c03\u7528\u7684\u65b9\u6cd5\uff0c\u5404\u5e94\u7528\u80fd\u8ddf\u968f\u81ea\u8eab\u8fed\u4ee3\u5468\u671f\u72ec\u7acb\u7ef4\u62a4 AT \u7528\u4f8b\u3002 \u5b8c\u6210\u516c\u5171\u65b9\u6cd5\u7684\u62bd\u53d6\u6574\u5408\uff0c\u5f62\u6210\u4e00\u5957\u72ec\u7acb\u4e8e\u5e94\u7528\u95f4\u7684\u516c\u5171\u65b9\u6cd5\u5e93\uff0c\u5404\u5e94\u7528\u65b9\u6cd5\u91cc\u9762\u4e0d\u5b58\u5728\u88ab\u591a\u4e2a\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\u3002 \u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u4e3a\u5c06\u6765\u9002\u914d\u66f4\u591a\u7684 AT \u8fd0\u7528\u573a\u666f\u63d0\u4f9b\u652f\u6491\uff0c\u539f\u5219\u4e0a\u53ef\u5b9e\u73b0\u65e0\u9650\u6269\u5c55\uff0c\u5728\u6bcf\u65e5\u6784\u5efa\u548c\u6301\u7eed\u96c6\u6210\u6d41\u7a0b\u843d\u5730\u4f7f\u7528\u3002 \u4ee3\u7801\u89c4\u8303\u95ee\u9898\u6e05\u96f6\uff0c\u7b26\u5408 Shell Check\u3001Pylint\u3001\u7cfb\u7edf\u90e8\u76f8\u5173\u7f16\u7801\u89c4\u8303\u8981\u6c42\u3002 \u610f\u4e49\uff1a \u7edf\u4e00\u6210\u7814 AT \u67b6\u6784\u8bbe\u8ba1\u601d\u8def\uff0c\u6d88\u9664 AT \u4ee3\u7801\u5b9e\u73b0\u548c\u7ef4\u62a4\u4e0a\u53ef\u80fd\u51fa\u73b0\u7684\u5206\u6b67\uff0c\u6539\u5584\u5386\u53f2 AT \u65e0\u5de5\u7a0b\u5316\u8bbe\u8ba1\u7684\u7f3a\u9677\uff0c\u63d0\u9ad8\u67b6\u6784\u4e13\u4e1a\u6027\u3002 \u5404\u5e94\u7528 AT \u4ee3\u7801\u76f8\u4e92\u72ec\u7acb\uff0c\u5951\u5408\u5e94\u7528\u72ec\u7acb\u53d1\u5e03\u7279\u6027\uff0c\u53ef\u652f\u6301\u8fed\u4ee3\u671f\u95f4\u72ec\u7acb\u65b0\u589e\u3001\u7ef4\u62a4\u548c\u6267\u884c\u3002 \u65b9\u6cd5\u8c03\u7528\u903b\u8f91\u5f97\u5230\u7b80\u5316\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u66f4\u9ad8\u6548\uff1b\u516c\u5171\u5e93\u62bd\u53d6\uff0c\u51cf\u5c11\u65b9\u6cd5\u91cd\u590d\u7f16\u5199\uff0c\u63d0\u9ad8\u4ee3\u7801\u5229\u7528\u7387\uff1b\u5e73\u5747\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u4ece40\u5206\u949f\u964d\u4f4e\u81f330\u5206\u949f\uff0c\u65e5\u4ea7\u51fa\u7528\u4f8b\u4ece12\u6761/\u5929\u63d0\u5347\u81f316\u6761/\u5929\u3002 \u53ef\u7075\u6d3b\u652f\u6491\u4e0d\u540c\u7684\u81ea\u52a8\u5316\u8fd0\u7528\u573a\u666f\uff0c\u5982 CI\u3001\u5192\u70df\u6d4b\u8bd5\u3001\u96c6\u6210\u6d4b\u8bd5\u3001\u56de\u5f52\u6d4b\u8bd5\u3001\u4e13\u9879\u6d4b\u8bd5\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_2","title":"\u4e00\u3001\u80cc\u666f\u4ecb\u7ecd","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1","title":"1\u3001\u73b0\u6709\u67b6\u6784\u4ecb\u7ecd","text":"\u73b0\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u6574\u4f53\u5206\u4e3a\u4e09\u5c42\uff1a\u7528\u4f8b\u5c42\uff08\u4e1a\u52a1\u903b\u8f91\u5c42\uff09\u3001\u4e2d\u95f4\u5c42\uff08\u5143\u7d20\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff09\u3001\u6838\u5fc3\u5c42\uff08\u5e95\u5c42\u529f\u80fd\u5e93\u5c42\uff09\u3002 \u7528\u4f8b\u5c42\uff1a\u5373\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4e13\u6ce8\u4e8e\u4e1a\u52a1\u529f\u80fd\u903b\u8f91\uff0c\u4e0d\u5173\u5fc3\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\uff1b \u4e2d\u95f4\u5c42\uff1a\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff0c\u6bcf\u4e2a\u65b9\u6cd5\u5747\u5bf9\u5e94\u4e00\u4e2a\u5143\u7d20\u7684\u4e00\u4e2a\u5177\u4f53\u64cd\u4f5c\uff0c\u4e5f\u53ef\u4ee5\u662f\u591a\u4e2a\u64cd\u4f5c\u7684\u7ec4\u5408\u64cd\u4f5c\uff0c\u4e2d\u95f4\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u7528\u4f8b\u5c42\uff0c\u5177\u6709\u53ef\u6269\u5c55\u6027\u548c\u590d\u7528\u6027\uff1b \u6838\u5fc3\u5c42\uff1a\u4e3b\u8981\u5c01\u88c5\u7684\u5e95\u5c42\u529f\u80fd\u5b9e\u73b0\uff0c\u6b64\u5c42\u5728\u6846\u67b6\u4e2d\u63d0\u4f9b\u4e00\u4e9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u529f\u80fd\u6a21\u5757\u76f8\u5bf9\u72ec\u7acb\uff0c\u6838\u5fc3\u5c42\u4e3b\u8981\u670d\u52a1\u4e8e\u64cd\u4f5c\u5c42\uff0c\u6bd4\u5982\uff1a\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7 UI \u5750\u6807\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u5143\u7d20\u5b9a\u4f4d\u6a21\u5757\u3001\u952e\u9f20\u64cd\u4f5c\u7684\u57fa\u7840\u65b9\u64cd\u4f5c\u6a21\u5757\u3001Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757\u3001\u6587\u4ef6\u7684\u589e\u5220\u6539\u67e5\u64cd\u4f5c\u6a21\u5757\u7b49\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2","title":"2\u3001\u81ea\u52a8\u5316\u7684\u5e94\u7528","text":"2.1\u3001CI \u6d41\u7a0b \u6bcf\u65e5\u6784\u5efa\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u7814\u53d1\u6bcf\u65e5\u63d0\u4ea4\u7684\u4ee3\u7801\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u73ed\u4e4b\u540e\u4f1a\u5c06\u5404\u5e94\u7528\u8fdb\u884c\u6253\u5305\uff0c\u7136\u540e\u5728\u6d4b\u8bd5\u673a\u4e0a\u5b89\u88c5\u66f4\u65b0 deb \u5305\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 \u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u5e94\u7528\u63d0\u4ea4\u96c6\u6210\u7684\u7248\u672c\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u8f7d\u6700\u65b0\u7684 ISO \u8fdb\u884c PXE \u90e8\u7f72\uff0c\u7136\u540e\u6d4b\u8bd5\u673a\u5b89\u88c5\u6700\u65b0\u7684\u955c\u50cf\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002 2.2\u3001\u9a8c\u6536\u6d4b\u8bd5 \u5728\u5404\u9a8c\u6536\u8282\u70b9\u8fdb\u884c\u81ea\u52a8\u5316\u9a8c\u6536\uff0c\u76ee\u524d\u7684\u7b56\u7565\u662f\u5168\u7528\u4f8b\u8986\u76d6\u5168\u67b6\u6784\u3002 2.3\u3001\u56de\u5f52\u6d4b\u8bd5 \u56de\u5f52\u6d4b\u8bd5\u4eca\u5e74\u89c4\u5212\u5efa\u8bbe\u4e2d\uff0c\u65e8\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u6267\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\uff0c\u51cf\u5c11\u529f\u80fd\u6d4b\u8bd5\u7684\u91cd\u590d\u52b3\u52a8\u529b\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3","title":"3\u3001\u5b58\u5728\u7684\u95ee\u9898","text":" \u5404\u5e94\u7528\u4e4b\u95f4\u5b58\u5728\u8026\u5408 \u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u521d\u671f\uff0c\u6240\u6709\u5e94\u7528\u662f\u6574\u4f53\u53d1\u5e03\uff0c\u6211\u4eec\u662f\u5c06\u6240\u6709\u5e94\u7528\u770b\u6210\u662f\u4e00\u4e2a\u6574\u4f53\uff0c\u5404\u5e94\u7528\u4f5c\u4e3a\u5176\u4e2d\u7684\u4e00\u4e2a\u6a21\u5757\uff0c\u6240\u4ee5\u5b58\u5728\u5e94\u7528\u95f4\u65b9\u6cd5\u4ea4\u53c9\u8c03\u7528\u7684\u95ee\u9898\uff0c\u8fd9\u6837\u4ece\u6700\u521d\u7684\u8bbe\u8ba1\u6765\u8bb2\u786e\u5b9e\u80fd\u591f\u51cf\u5c11\u91cd\u590d\u4ee3\u7801\u7684\u7f16\u5199\u3002\u4f46\u662f\u73b0\u5728\u5e94\u7528\u8d70\u72ec\u7acb\u53d1\u5e03\uff0c\u5404\u5e94\u7528\u90fd\u6709\u81ea\u5df1\u7684\u8fed\u4ee3\u8282\u594f\uff0c\u5728\u65b0\u9700\u6c42\u5feb\u901f\u53d8\u5316\u7684\u8fc7\u7a0b\u4e2d\uff0c\u81ea\u52a8\u5316\u7ef4\u62a4\u53d8\u5f97\u5f02\u5e38\u56f0\u96be\uff0c\u539f\u56e0\u5c31\u662f\u81ea\u52a8\u5316\u9879\u76ee\u91cc\u9762\u5404\u4e2a\u5e94\u7528\u7684\u6709\u6bd4\u8f83\u591a\u7684\u8026\u5408\u5173\u7cfb\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u8fdb\u884c\u89e3\u8026\uff0c\u4ee5\u9002\u5e94\u5e94\u7528\u4e0d\u540c\u7684\u8fed\u4ee3\u5468\u671f\u3002 \u65e0\u6cd5\u7cbe\u51c6\u7684\u5212\u5206\u7528\u4f8b\u8303\u56f4 \u7528\u4f8b\u6267\u884c\u7684\u8303\u56f4\u4e0d\u591f\u7cbe\u51c6\uff0c\u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u4e3b\u8981\u901a\u8fc7\u7528\u4f8b\u7684\u5173\u952e\u8bcd core\uff08\u6838\u5fc3\uff09\u6765\u533a\u5206\u7528\u4f8b\u662f\u5426\u4e3a\u6838\u5fc3\u7528\u4f8b\uff0c\u4f46\u662f\u8fd9\u6837\u7684\u533a\u5206\u592a\u5bbd\u6cdb\u4e86\uff0c\u4e0d\u80fd\u9002\u5e94\u81ea\u52a8\u5316\u6d4b\u8bd5\u5728\u591a\u573a\u666f\u4e0b\u7684\u5e94\u7528\u3002\u5f88\u591a\u573a\u666f\u4e0b\u6211\u4eec\u8fd8\u9700\u8981\u6839\u636e\u7528\u4f8b\u7684\u7b49\u7ea7\u3001\u7528\u4f8b\u7684\u7c7b\u578b\u3001\u7528\u4f8b\u6765\u6e90\u7b49\u7b49\uff0c\u4e0d\u540c\u7684\u7ef4\u5ea6\u6765\u6311\u9009\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u5173\u952e\u5b57\u9700\u8981\u4eba\u5de5\u4e00\u6761\u6761\u7684\u6539\uff0c\u8d39\u65f6\u8d39\u529b\uff0c\u800c\u4e14\u4e0d\u597d\u7ef4\u62a4\u3002 \u53d7\u65b0\u9700\u6c42\u5f71\u54cd\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u597d\u7ef4\u62a4 \u76ee\u524d\u9700\u8981\u8df3\u8fc7\u7684\u7528\u4f8b\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684\u7528\u4f8b\u811a\u672c\u91cc\u9762\uff0c\u6dfb\u52a0\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\uff0c\u540e\u7eed\u89e3\u9664\u8df3\u8fc7\u7684\u65f6\u5019\u53c8\u9700\u8981\u627e\u5230\u8fd9\u6761\u811a\u672c\uff0c\u5220\u6389\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\u3002\u5728\u8df3\u8fc7\u7528\u4f8b\u8f83\u591a\u7684\u60c5\u51b5\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u96be\u5ea6\u3002 \u7f16\u5199\u7528\u4f8b\u65f6\u903b\u8f91\u6bd4\u8f83\u590d\u6742\uff0c\u9700\u8981\u8c03\u7528\u591a\u4e2a\u5e94\u7528\u7684\u65b9\u6cd5\u6a21\u5757\u3002 \u6846\u67b6\u6269\u5c55\u6027\u4e0d\u8db3\uff0c\u65e0\u6cd5\u6574\u5408\u6027\u80fd\u81ea\u52a8\u5316\u3001\u538b\u6d4b\u81ea\u52a8\u5316\u3001\u5b89\u5168\u81ea\u52a8\u5316\u7b49\u4e13\u9879\u6d4b\u8bd5\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_3","title":"\u4e8c\u3001\u65b9\u6848\u8bbe\u8ba1","text":"\u4e3a\u89e3\u51b3\u73b0\u6709\u95ee\u9898\uff0c\u9002\u5e94\u4e0d\u65ad\u4e30\u5bcc\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u66f4\u597d\u7684\u53d1\u6325\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4f5c\u7528\uff0c\u9700\u8981\u5bf9\u81ea\u52a8\u5316\u67b6\u6784\u53ca\u5404\u529f\u80fd\u6a21\u5757\u8fdb\u884c\u91cd\u65b0\u8bbe\u8ba1\u89c4\u5212\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_1","title":"1\u3001\u67b6\u6784\u8bbe\u8ba1","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_1","title":"2\u3001\u8bbe\u8ba1\u601d\u8def","text":"\u6846\u67b6\u7684\u8fd0\u884c\u903b\u8f91\uff1a\u901a\u8fc7\u6838\u5fc3\u5c42\u63d0\u4f9b\u4e00\u4e2a\u57fa\u7840\u80fd\u529b\uff0c\u4e1a\u52a1\u5c42\u6839\u636e\u5b9e\u9645\u4e1a\u52a1\u9700\u6c42\uff08\u6d4b\u8bd5\u7528\u4f8b\uff09\u52a8\u6001\u52a0\u8f7d\u6838\u5fc3\u5c42\uff0c\u6267\u884c\u5165\u53e3\u52a0\u8f7d\u76f8\u5e94\u7684\u7528\u4f8b\u96c6\u5e76\u63a7\u5236\u6267\u884c\uff0c\u5e94\u7528\u5c42\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u9700\u6c42\uff0c\u901a\u8fc7\u76f8\u5e94\u7684\u914d\u7f6e\u9879\u8fdb\u884c\u914d\u7f6e\uff0c\u4ece\u800c\u89e6\u53d1\u81ea\u52a8\u5316\u6d4b\u8bd5\u4efb\u52a1\u3002 \u6838\u5fc3\u5c42\uff1a\u57fa\u672c\u4fdd\u6301\u4e0d\u53d8\uff0c\u90e8\u5206\u6a21\u5757\u4f1a\u6d89\u53ca\u5230\u65b0\u529f\u80fd\u5f00\u53d1\uff0c\u6838\u5fc3\u5c42\u5404\u529f\u80fd\u6a21\u5757\u4fdd\u6301\u72ec\u7acb\u6027\uff0c\u63d0\u4f9b\u901a\u7528\u7684\u63a5\u53e3\u80fd\u529b\uff0c\u4f9b\u4e0a\u5c42\u8c03\u7528\uff1b \u5e95\u5c42\u6838\u5fc3\u6a21\u5757\u5305\u62ec\uff1a \u56fe\u50cf\u8bc6\u522b\u6a21\u5757 UI \u5b9a\u4f4d\u6a21\u5757 Dbus \u63a5\u53e3\u64cd\u4f5c\u6a21\u5757 \u5c5e\u6027\u5b9a\u4f4d\u6a21\u5757 \u65e5\u5fd7\u6a21\u5757 \u952e\u9f20\u64cd\u4f5c\u6a21\u5757 \u6587\u4ef6\u64cd\u4f5c\u6a21\u5757 \u5f55\u5c4f\u6a21\u5757 \u81ea\u5b9a\u4e49\u65ad\u8a00\u6a21\u5757 \u7528\u4f8b\u6267\u884c\u6a21\u5757 PXE \u88c5\u673a\u6a21\u5757 \u952e\u9f20\u4fe1\u53f7\u6a21\u62df\u6a21\u5757 OCR \u6a21\u5757 \u4e1a\u52a1\u5c42\uff1a\u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e94\u7528\u5185\u5305\u542b\u591a\u4e2a\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5982\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7b49\uff0c\u540e\u7eed\u53ef\u4ee5\u6839\u636e\u9700\u8981\u5ac1\u63a5\u8fdb\u6765\u3002\u5176\u4e2d\u529f\u80fd\u6d4b\u8bd5\u8bbe\u8ba1\u601d\u8def\uff1a \u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e76\u5c06\u6d4b\u8bd5\u6570\u636e\u548c\u6d4b\u8bd5\u8d44\u6e90\u6574\u5408\u8fdb\u6765\uff0c\u589e\u52a0\u7528\u4f8b\u6807\u7b7e csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ed9\u6bcf\u6761\u7528\u4f8b\u6253\u6807\u7b7e\u3002 \u5404\u6807\u7b7e\u6240\u4f7f\u7528\u5bf9\u5e94\u7684\u5b57\u6bb5\u540d\u79f0\uff0c\u4f7f\u7528 csv \u6587\u4ef6\u7ef4\u62a4\u7528\u4f8b\u4e0e\u6807\u7b7e\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u5bf9\u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u53ef\u4ee5\u7ec4\u5408\u5176\u4e2d\u7684\u6807\u7b7e\u800c\u4ece\u9a71\u52a8\u5bf9\u5e94\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\uff0c\u517c\u5bb9\u73b0\u6709\u7528\u4f8b\u6807\u7b7e\uff0c\u4e14\u652f\u6301\u7528\u4f8b\u6807\u7b7e\u53ef\u6269\u5c55\uff1b \u4f7f\u7528 csv \u683c\u5f0f\u6587\u4ef6\u53ef\u4ee5\u65b9\u4fbf\u7684\u4f7f\u7528 Excel \u8868\u683c\u6253\u5f00\u8fdb\u884c\u7f16\u8f91\uff0c\u540c\u65f6\u7531\u4e8e csv \u6587\u4ef6\u5b9e\u9645\u662f\u4ee5\u90fd\u597d\u5206\u9694\u7684\u6587\u672c\u6587\u4ef6\uff0c\u4ee3\u7801\u4e2d\u53ef\u4ee5\u5728\u4e0d\u4f9d\u8d56\u4e09\u65b9\u5e93\u7684\u60c5\u51b5\u4e0b\u65b9\u4fbf\u5feb\u901f\u7684\u89e3\u6790\u5b83\uff0c\u53ef\u64cd\u4f5c\u6027\u548c\u53ef\u7ef4\u62a4\u6027\u8f83\u9ad8\u3002 \u5404\u4e2a\u5e94\u7528\u4e4b\u95f4\uff0c\u7528\u4f8b\u3001\u65b9\u6cd5\u3001\u6807\u7b7e\u548c\u8d44\u6e90\u90fd\u662f\u76f8\u4e92\u72ec\u7acb\u7684\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u7528\u4f8b\u65f6\u53ea\u9700\u8981\u81ea\u5df1\u5e94\u7528\u4e0b\u7684\u65b9\u6cd5\u548c\u516c\u5171\u5e93\u5373\u53ef\u3002 \u7ed3\u6784\u4e3e\u4f8b\uff1a .\n\u251c\u2500\u2500 apps\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_album # \u5e94\u7528\u540d (\u7528\u4e0b\u5212\u7ebf\u8fde\u63a5\u662f Python \u7f16\u7801\u89c4\u8303)\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_assert # \u65ad\u8a00\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_function_tag.csv # \u7528\u4f8b\u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 asan_cases # \u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases # \u529f\u80fd\u6d4b\u8bd5\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 res # \u6d4b\u8bd5\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config # \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_widget # \u5e94\u7528\u81ea\u5df1\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_widget # \u65b9\u6cd5\u57fa\u7c7b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 other_widget # \u8c03\u7528\u5176\u4ed6\u5e94\u7528\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_camera\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases\n\u2502\u00a0\u00a0 \u2502\u00a0 ...\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 public_widget # \u516c\u5171\u65b9\u6cd5\u5e93\n\u251c\u2500\u2500 config # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n...\n config \u914d\u7f6e\u6a21\u5757\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u76f8\u5e94\u914d\u7f6e\uff0c\u6d4b\u8bd5\u540c\u5b66\u53ef\u4ee5\u6839\u636e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5728 config \u91cc\u9762\u8fdb\u884c\u914d\u7f6e\u3002 \u5168\u5c40\u914d\u7f6e\uff1a \u6267\u884c\u4e00\u4e2a\u6216\u591a\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff1a\u5728 pattern \u91cc\u9762\u5199\u5165\u5e94\u7528\u5305\u540d\uff0c\u591a\u4e2a\u5e94\u7528\u4e4b\u95f4\u7528 or \u8fde\u63a5\uff0c\u5982 deepin-music or deepin-movie\uff1b \u5192\u70df\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a smoke\uff1b \u96c6\u6210\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a core \uff1b \u5168\u91cf\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u4e3a\u7a7a\u5373\u53ef\uff1b \u901a\u8fc7 tags \u7684\u914d\u7f6e\u6bd4\u8f83\u7075\u6d3b\uff0c\u540e\u9762\u6807\u7b7e\u5316\u7ba1\u7406\u7ae0\u8282\u4f1a\u8bb2\u5230\uff0c\u652f\u6301\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u7075\u6d3b\u914d\u7f6e\u3002 \u6307\u5b9a\u67d0\u53f0\u673a\u5668\u5728\u6307\u5b9a\u955c\u50cf\u7248\u672c\u4e0a\u6267\u884c\u7528\u4f8b\uff1a\u5728 IP \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a IP\uff0c\u5e76\u5728 URL \u91cc\u9762\u586b\u5165\u955c\u50cf\u7684\u4e0b\u8f7d\u5730\u5740\uff0c\u6846\u67b6\u4f1a\u8c03\u7528 PXE \u8fdb\u884c\u81ea\u52a8\u88c5\u673a\uff0c\u88c5\u673a\u5b8c\u4e4b\u540e\u81ea\u52a8\u5f00\u59cb\u6267\u884c\u914d\u7f6e\u7684\u6d4b\u8bd5\u7528\u4f8b\u3002 \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\uff1a \u6bcf\u4e2a\u5e94\u7528\u5185\u90e8\u4f1a\u6709\u4e00\u4e2a\u5355\u72ec\u7684\u914d\u7f6e\u6a21\u5757\uff0c\u4f1a\u5305\u542b\u4e00\u4e9b\u672c\u5e94\u7528\u7684\u6d4b\u8bd5\u8d44\u6e90\u7684\u8def\u5f84\u3001\u6267\u884c\u7528\u4f8b\u7684\u6807\u7b7e\u914d\u7f6e\u7b49\u7b49\uff0c\u5982\u679c\u5728\u5c40\u90e8\u914d\u7f6e\u91cc\u9762\u914d\u7f6e\u4e86\u7528\u4f8b\u6267\u884c\u6807\u7b7e\uff0c\u800c\u5916\u5c42 runner \u51fa\u6ca1\u6709\u6307\u5b9a\u6267\u884c\u6807\u7b7e\uff0c\u5219\u5728\u6267\u884c\u65f6\u53ea\u4f1a\u6267\u884c\u5c40\u90e8\u914d\u7f6e\u5df2\u914d\u7f6e\u7684\uff0c\u82e5\u5916\u5c42 runner \u4e5f\u914d\u7f6e\u4e86\u6267\u884c\u6807\u7b7e\uff0c\u5219\u4f1a\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u7528\u4f8b\u3002 \u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u914d\u7f6e\u90fd\u5728\u540c\u4e00\u4e2a\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\uff0cpy \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684\u7c7b\uff0cini \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684 option\u3002 \u5168\u5c40\u914d\u7f6e\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u7b56\u7565\u5982\u4e0b\uff1a \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u672a\u914d\u7f6e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5c40\u90e8\u914d\u7f6e\u6267\u884c\u3002 \u5168\u5c40\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5c40\u90e8\u914d\u7f6e\u4e86\u6267\u884c\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u5219\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u3002 \u5e94\u7528\u5c42\uff1arunner \u662f\u6d4b\u8bd5\u6267\u884c\u7684\u5165\u53e3\uff0c\u5b83\u4f1a\u6839\u636e\u914d\u7f6e\u91cc\u9762\u7684\u914d\u7f6e\u9879\uff0c\u8fdb\u884c\u7528\u4f8b\u7684\u52a0\u8f7d\u548c\u6267\u884c\u3002\u5b83\u63d0\u4f9b\u63a5\u53e3\u7ed9\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\uff0c\u5e73\u53f0\u4e0a\u7684\u6307\u4ee4\u5b9e\u9645\u4e0a\u90fd\u662f\u901a\u8fc7\u4e0b\u53d1\u7ed9 runner\uff0c\u7136\u540e\u7531 runner \u6765\u6267\u884c\u76f8\u5e94\u7684\u6d4b\u8bd5\u3002 \u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u662f\u4e00\u4e2a\u524d\u7aef\u7cfb\u7edf\uff0c\u53ef\u4ee5\u8fdb\u884c\u6d4b\u8bd5\u673a\u7ba1\u7406\u3001\u81ea\u52a8\u5b89\u88c5\u955c\u50cf\u3001\u81ea\u52a8\u5b89\u88c5\u6307\u5b9a\u5e94\u7528\u7248\u672c\u3001\u8fdb\u884c\u6d4b\u8bd5\u7528\u4f8b\u8303\u56f4\u9009\u62e9\u3001\u7528\u4f8b\u89e6\u53d1\u6267\u884c\u63a7\u5236\u3001\u7ed3\u679c\u5c55\u793a\u8f93\u51fa\u7b49\u3002 \u4e00\u4e2a\u5e94\u7528\u7684\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\u90fd\u53ef\u4ee5\u5355\u72ec\u89e6\u53d1\u3002 \u517c\u5bb9\u6027\u6d4b\u8bd5\u4e3b\u8981\u901a\u8fc7 PXE \u670d\u52a1\u5668\u5bf9\u6d4b\u8bd5\u673a\u8fdb\u884c\u88c5\u673a\uff0c\u7136\u540e\u914d\u5408 AT \u8fdb\u884c\u6d4b\u8bd5\uff0c\u53ef\u4ee5\u5b9e\u73b0\u4e0d\u540c\u7cfb\u7edf\u7248\u672c\u3001\u4e0d\u540c\u5e94\u7528\u7248\u672c\u73af\u5883\u4e0a\u90fd\u53ef\u4ee5\u8fdb\u884c\u81ea\u52a8\u5316\u7684 AT \u6267\u884c\uff0c\u63d0\u9ad8\u517c\u5bb9\u6027\u6d4b\u8bd5\u6548\u7387\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_4","title":"\u4e09\u3001\u8be6\u7ec6\u65b9\u6848","text":""},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#1_2","title":"1\u3001\u7528\u4f8b\u89e3\u8026","text":"\u5b58\u5728\u8026\u5408\u5173\u7cfb\u7684\u65b9\u6cd5\uff1a\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u88ab\u5916\u90e8\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\uff0c\u5219\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u8026\u5408\u5173\u7cfb\u3002 1.1\u3001\u901a\u8fc7\u7f16\u8f91\u5668 Find Usages \u67e5\u770b\u6bcf\u4e2a\u65b9\u6cd5\u88ab\u8c03\u7528\u7684\u8def\u5f84\u548c\u88ab\u8c03\u7528\u6b21\u6570\uff1b 1.2\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 1 \u4e2a\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728\u5916\u90e8\u5e94\u7528\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1b 1.3\u3001\u64cd\u4f5c\u5c42\u6587\u4ef6\u540d\u5747\u4ee5 widget \u7ed3\u5c3e\uff0c\u7c7b\u540d\u4ee5 Widget \u7ed3\u5c3e\uff0c\u5982\uff1a\u6587\u4ef6\u540d music_widget.py \uff1a class MusicWidget:\n\"\"\"\u97f3\u4e50\u7684\u64cd\u4f5c\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#2_2","title":"2\u3001\u516c\u5171\u5e93\u5efa\u8bbe","text":"2.1\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 2 \u4e2a\u53ca\u4ee5\u4e0a\u7684\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728 public_widget \u76ee\u5f55\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1bpublic_widget \u5373\u4e3a\u516c\u5171\u65b9\u6cd5\u5e93\uff1b 2.2\u3001\u5728\u7528\u4f8b\u5c42\u4fee\u6539\u7528\u4f8b\u4e2d\u7c7b\u7684\u5bfc\u5165\u8def\u5f84\uff0c\u5c5e\u4e8e\u516c\u5171\u65b9\u6cd5\u7684\u5219\u8c03\u7528 public_widget \u4e2d\u7684\u7c7b\uff0c\u5916\u90e8\u5e94\u7528\u7684\u64cd\u4f5c\u65b9\u6cd5\uff0c\u5219\u8c03\u7528\u672c\u5e94\u7528\u76ee\u5f55\u4e0b\u91cd\u5199\u7684\u5916\u90e8\u5e94\u7528\u65b9\u6cd5\u3002 \u6bd4\u5982\uff1a\u51e0\u4e4e\u6240\u6709\u591a\u5a92\u4f53\u5e94\u7528\u90fd\u9700\u8981\u901a\u8fc7\u6587\u7ba1\u52a0\u8f7d\u8d44\u6e90\uff0c\u8c03\u8d77\u7684\u6587\u7ba1\u5bf9\u8bdd\u6846\u5b9e\u9645\u4e3a dde-desktop\uff0c\u56e0\u6b64\u5c06 desktop_widget.py \u653e\u5230 public_widget \u91cc\u9762\uff1a class DdeDesktopPublicWidget:\n\"\"\"\u516c\u5171-\u684c\u9762\u7684\u64cd\u4f5c\u65b9\u6cd5\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#3_1","title":"3\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406","text":"3.1\u3001\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a \u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b \u7528\u4f8b\u7c7b\u578b\uff1a\u5bf9\u5e94 core\u3001smoke\uff0c\u6216\u4e3a\u7a7a\uff1b \u7528\u4f8b\u6765\u6e90\uff1a\u5bf9\u5e94 PMS \u7528\u4f8b\u6765\u6e90\uff0c\u5206\u522b\u7528 acp1\u3001acp2\u3001acp3\u3001acp4 \u8868\u793a\u3002 acp1 \uff1a\u4e1a\u52a1\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5199\u7684\u7528\u4f8b\uff0c\u88ab\u7528\u4e8e\u9a8c\u6536\u6d4b\u8bd5\u7684\uff1b acp2 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u5f15\u5165\u7684\u4ea7\u54c1\u9a8c\u6536\u6d4b\u8bc4\u90e8\u7684\u7528\u4f8b\uff1b acp3 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u6839\u636e\u4ea7\u54c1\u9700\u6c42\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\uff1b acp4 \uff1a\u9a8c\u6536\u7ebf\u6d4b\u8bd5\u540c\u5b66\u901a\u8fc7\u793e\u533a\u3001\u8bba\u575b\u7528\u6237\u53cd\u9988\u95ee\u9898\u603b\u7ed3\u8bbe\u8ba1\u7684\u9a8c\u6536\u6d4b\u8bd5\u7528\u4f8b\u3002 \u4e3e\u4f8b\uff1a \u7528\u4f8bID \u7528\u4f8b\u7ea7\u522b \u7528\u4f8b\u7c7b\u578b \u7528\u4f8b\u6765\u6e90 001 L1 core acp1 \u6807\u7b7e\u91c7\u7528\u679a\u4e3e\u7684\u65b9\u5f0f\u8fdb\u884c\u4ee3\u53f7\u7ba1\u7406\u65b9\u4fbf\u7ba1\u7406\u4ee5\u53ca\u540e\u7eed\u6269\u5c55\u3002 3.2\u3001\u5728\u6bcf\u4e2a\u5e94\u7528\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u7b2c\u4e00\u5217\u4e3a\u7528\u4f8b\u7684 ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b \u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ba1\u7406\u6a21\u5757\u5185\u7684\u7528\u4f8b\u6807\u7b7e\u3002\u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002 3.3\u3001\u5bf9\u7167 PMS \u4e0a\u7528\u4f8b\u7b49\u7ea7\u3001\u7528\u4f8b\u7c7b\u578b\u548c\u7528\u4f8b\u6765\u6e90\uff0c\u6807\u8bb0\u6240\u6709\u5df2\u5b9e\u73b0\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u540e\u7eed\u7f16\u5199\u65b0\u589e\u81ea\u52a8\u5316\u7528\u4f8b\u65f6\uff0c\u6bcf\u5199\u4e00\u6761\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684 csv \u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u6b64\u6761\u7528\u4f8b\u7684\u6807\u7b7e\u3002 3.4\u3001\u8df3\u8fc7\u7528\u4f8b\u6807\u7b7e\u5316 \u73b0\u6709\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a\uff1a \u4e3e\u4f8b\uff1a \u7528\u4f8bID ...\uff08\u5404\u79cd\u7528\u4f8b\u6807\u7b7e\uff09 \u8df3\u8fc7\u539f\u56e0 001 ... skip-\u53d7\u5230\u67d0\u65b0\u9700\u6c42\u5f71\u54cd \u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u5982\u679c\u5e94\u7528\u53d7\u5230\u65b0\u9700\u6c42\u5f71\u54cd\u9700\u8981\u8df3\u8fc7\uff0c\u5219\u5728\u6b64\u5217\u5907\u6ce8\u5177\u4f53\u7684\u8df3\u8fc7\u539f\u56e0\u3002\u8df3\u8fc7\u7684\u539f\u56e0\u7edf\u4e00\u6807\u8bb0\u4e3a \u201cskip-\u8df3\u8fc7\u539f\u56e0\u201d\uff1b \u7528\u4f8b\u6267\u884c\u65f6\u5224\u65ad csv \u6587\u4ef6\u91cc\u9762\u8df3\u8fc7\u539f\u56e0\u5217\u662f\u5426\u5b58\u5728\u8df3\u8fc7\u6807\u8bb0\uff0c\u5982\u679c\u5df2\u7ecf\u6807\u8bb0\u4e86\u8df3\u8fc7\u539f\u56e0\uff0c\u6700\u7ec8\u7684\u7528\u4f8b\u72b6\u6001\u4f1a\u88ab\u6807\u8bb0\u4e3a SKIPED\uff0c\u7528\u4f8b\u4e5f\u4e0d\u4f1a\u88ab\u6267\u884c\u3002 \u6240\u6709\u7684\u6807\u7b7e\u5728 docs \u76ee\u5f55\u4e0b\u4f1a\u6709\u4e00\u4e2a\u6587\u6863\uff0c\u6587\u6863\u6682\u5b9a\u540d\u79f0\u4e3a\uff1atags_info.md\uff0c\u7528\u4e8e\u8bf4\u660e\u73b0\u5728\u5df2\u7ecf\u4f7f\u7528\u5230\u7684\u6807\u7b7e\uff0c\u4ee5\u53ca\u8fd9\u4e9b\u6807\u7b7e\u7684\u89e3\u91ca\u548c\u7528\u6cd5\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#4","title":"4\u3001\u7528\u4f8b\u6267\u884c","text":"4.1\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u7684\u9a71\u52a8\u6267\u884c\u903b\u8f91\u529f\u80fd\u5b9e\u73b0 \u5f00\u53d1\u6839\u636e\u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\u91cc\u9762\u7684\u7528\u4f8b\u6807\u7b7e\u6267\u884c\u5bf9\u5e94\u7528\u4f8b\u7684\u529f\u80fd\uff0c\u80fd\u652f\u6301\u591a\u4e2a\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u6267\u884c\u5165\u53e3\u80fd\u968f\u610f\u901a\u8fc7\u7528\u4f8b\u6807\u7b7e\u6307\u5b9a\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002 \u7528\u4f8b\u6807\u7b7e\u7684\u9a71\u52a8\u65b9\u5f0f\u5fc5\u987b\u80fd\u652f\u6301\u6807\u7b7e\u7684\u6269\u5c55\uff0c\u672a\u6765\u968f\u7740\u4e1a\u52a1\u7684\u53d8\u5316\u53ef\u80fd\u9700\u8981\u589e\u52a0\u5404\u79cd\u5404\u6837\u7684\u6807\u7b7e\u3002 4.2\u3001\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u6267\u884c \u529f\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u3001\u6027\u80fd\u6d4b\u8bd5\u7b49\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u662f\u5206\u5f00\u6267\u884c\u7684\uff0c\u4e5f\u5c31\u662f\u5728\u4e00\u6b21\u6267\u884c\u4e2d\uff0c\u53ea\u80fd\u6267\u884c\u5176\u4e2d\u4e00\u79cd\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5177\u4f53\u8981\u6267\u884c\u54ea\u4e00\u79cd\u540c\u6837\u901a\u8fc7\u53c2\u6570\u6765\u63a7\u5236\u3002 4.3\u3001\u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c \u7531\u4e8e\u6d4b\u8bd5\u673a\u8d44\u6e90\u6709\u9650\uff0c\u968f\u7740\u81ea\u52a8\u5316\u7528\u4f8b\u6570\u91cf\u7684\u589e\u52a0\uff0cCI \u6267\u884c\u65f6\u95f4\u4f1a\u8d8a\u6765\u8d8a\u957f\u3002 \u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c\u7684\u529f\u80fd\uff1a \u540c\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\u5206\u6563\u5230\u4e0d\u540c\u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u4e0a\u6267\u884c\uff0c\u7f29\u77ed\u6267\u884c\u603b\u65f6\u95f4\uff1b \u7b2c\u4e8c\u5929\u8dd1\u7684\u65f6\u5019\u540c\u4e00\u4e2a\u673a\u5668\u4e0a\u4f1a\u6267\u884c\u6628\u5929\u6ca1\u6709\u6267\u884c\u5230\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u6267\u884c\u540c\u7406\uff1b \u53ef\u4ee5\u5b9e\u73b0\u5728\u5168\u67b6\u6784\u6d4b\u8bd5\u673a\u4e0a\u8f6e\u6d41\u6267\u884c\u7528\u4f8b\uff0c\u65e2\u80fd\u4fdd\u8bc1\u6267\u884c\u4e86\u6240\u6709\u7684\u7528\u4f8b\uff0c\u53c8\u80fd\u5728\u8d44\u6e90\u6709\u9650\u7684\u60c5\u51b5\u4e0b\u8986\u76d6\u4e86\u6240\u6709\u7684\u67b6\u6784\u3002 "},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#5","title":"5\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0","text":"5.1\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u4f5c\u4e3a\u524d\u7aef\u754c\u9762\u7cfb\u7edf\uff0c\u901a\u8fc7\u9875\u9762\u4e0a\u7684\u4e00\u4e9b\u529f\u80fd\u9009\u9879\u8fdb\u884c\u5bf9\u5e94\u6d4b\u8bd5\u4efb\u52a1\u7684\u7ba1\u7406\u6216\u89e6\u53d1\uff0c\u4e1a\u5185\u6bd4\u8f83\u6d41\u884c\u7684\u5b9e\u73b0\u65b9\u6848\u662f\u4f7f\u7528 Vue + DRF \u5b9e\u73b0\u4e00\u4e2a\u524d\u540e\u7aef\u5206\u79bb\u7684\u7cfb\u7edf\u3002 \u6d4b\u8bd5\u5e73\u53f0\u53ef\u80fd\u4f1a\u6d89\u53ca\u5230\u7684\u6a21\u5757\u6709\uff1a\u6d4b\u8bd5\u673a\u8d44\u6e90\u7ba1\u7406\u6a21\u5757\u3001\u7528\u4f8b\u6267\u884c\u63a7\u5236\u6a21\u5757\u3001\u7ed3\u679c\u5c55\u793a\u6a21\u5757\u3001PXE \u955c\u50cf\u5b89\u88c5\u6a21\u5757\u7b49\u3002 \u7528\u6237\uff08\u6d4b\u8bd5\u3001\u7814\u53d1\u540c\u5b66\u7b49\uff09\u53ef\u4ee5\u914d\u7f6e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5982\u6267\u884c\u54ea\u4e2a\u5e94\u7528\u3001\u6267\u884c\u7528\u4f8b\u7684\u8303\u56f4\u3001\u5728\u54ea\u53f0\u673a\u5668\u4e0a\u6267\u884c\u3001\u955c\u50cf\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u5e94\u7528\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u6267\u884c\u65f6\u95f4\u3002 5.2\u3001\u6267\u884c\u5165\u53e3 runner \u63d0\u4f9b\u7ed9\u6d4b\u8bd5\u5e73\u53f0\u7684\u63a5\u53e3\u5305\u62ec\uff1a\u7528\u4f8b\u6267\u884c\u63a5\u53e3\u3001\u7ed3\u679c\u8fd4\u56de\u63a5\u53e3\u3001\u955c\u50cf\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u955c\u50cf\u5b89\u88c5\u63a5\u53e3\u3001\u5e94\u7528\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u5e94\u7528\u5b89\u88c5\u66f4\u65b0\u63a5\u53e3\u7b49\u3002 \u524d\u7aef\u5e73\u53f0\u76ee\u524d\u8fd8\u6ca1\u6709\u592a\u591a\u8be6\u7ec6\u7684\u65b9\u6848\uff0c\u672c\u6b21\u8bbe\u8ba1\u4e3b\u8981\u96c6\u4e2d\u5728\u540e\u7aef\u8fd9\u90e8\u5206\u67b6\u6784\u7684\u8bbe\u8ba1\u4e0a\u3002"},{"location":"%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95%E6%9E%B6%E6%9E%84%E8%AE%BE%E8%AE%A1v1.0/#_5","title":"\u56db\u3001\u5b9e\u65bd\u8ba1\u5212","text":"\u8fd1\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u6587\u7ba1\u4ee3\u7801\u89e3\u8026 2022/3/28 2022/4/8 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u56fe\u5f62\u56fe\u50cf\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u97f3\u89c6\u9891\u5e94\u7528\u4ee3\u7801\u89e3\u8026 2022/4/11 2022/4/22 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5168\u5c40\u641c\u7d22\u4ee3\u7801\u89e3\u8026 2022/4/25 2022/4/26 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u516c\u5171\u5e93\u5efa\u8bbe 2022/4/27 2022/5/5 \u5e94\u7528\u89e3\u8026\u3001\u516c\u5171\u65b9\u6cd5\u5e93\u62bd\u79bb\u548c\u65b9\u6cd5\u6587\u6863\u6574\u7406\uff1a\u5c01\u88c5\u7684\u65b9\u6cd5\u6574\u7406\u6210\u4e00\u4e2a\u8868 2022/5/6 2022/5/10 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7528\u4f8b\u6807\u7b7e\u5206\u7c7b\u8bc4\u4f30 2022/5/11 2022/5/11 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u6807\u7b7e\u5316\u6267\u884c\u9a71\u52a8\u7a0b\u5e8f\u7f16\u5199 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u9700\u5b9e\u73b0\u81ea\u52a8\u89e3\u6790 csv \u8868\u683c\u4e2d\u7684\u7528\u4f8b\u7f16\u53f7 2022/5/12 2022/5/23 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u722c\u866b\u811a\u672c\uff0c\u722c\u53d6 pms \u4e0a\u7528\u4f8b\u7684\u6807\u7b7e 2022/5/11 2022/5/13 \u5b8c\u6210\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\uff1a\u7f16\u5199\u5b9a\u65f6\u81ea\u52a8\u7ef4\u62a4\u672c\u5730 csv \u6587\u4ef6\u811a\u672c 2022/5/11 2022/5/20 \u4e2d\u671f\u4efb\u52a1\u8ba1\u5212 \u9636\u6bb5\u76ee\u6807 \u8ba1\u5212\u5f00\u59cb\u65f6\u95f4 \u8ba1\u5212\u7ed3\u675f\u65f6\u95f4 \u76ee\u5f55\u7ed3\u6784\u8c03\u6574 2022/5/20 2022/6/2 \u5b8c\u6210\u5168\u5c40\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u5177\u4f53\u65b9\u6848\u548c\u903b\u8f91\u5b9e\u73b0 2022/6/6 2022/6/17 \u9759\u6001\u626b\u63cf\u95ee\u9898\u6e05\u96f6 2022/6/20 2022/7/1 \u5b8c\u6210\u65b0\u6846\u67b6\u4f7f\u7528\u57f9\u8bad 2022/7/4 2022/7/11 \u843d\u5730\u8fd0\u884c 2022/7/12 2022/7/20 \u5e95\u5c42\u5e93\u7528\u9014\u8bf4\u660e\u6587\u6863\u7f16\u5199 2022/7/21 2022/7/28"}]} \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz index 8ffaebc1..e0b7bbfc 100644 Binary files a/sitemap.xml.gz and b/sitemap.xml.gz differ diff --git "a/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" "b/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" index 25f669d5..97100667 100644 --- "a/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" +++ "b/\346\231\272\350\203\275\345\214\226\345\212\237\350\203\275\346\265\213\350\257\225/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs @@ -1215,8 +1215,7 @@ 智能化功能测试# Attribution :chengdu Test Team # Date :2021/08/20
youqu manage.py pms --pms2csv yes
每次执行时原 csv 文件会自动备份在 report/csv_back 目录下,因此你不用担心脚本执行导致你的数据丢失。
report/csv_back
# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/4/1\n# Author : Mikigo\n# =============================================\n
\u672c\u7ad9\u603b\u8bbf\u95ee\u91cf \u6b21
\u6b22\u8fce\u5728\u6d4f\u89c8\u5668\u8bbf\u95ee\u3010\u516c\u7f51\u6587\u6863\u3011
\u7edf\u4fe1\u516c\u53f8\u5185\u7f51\u8fd8\u53ef\u4ee5\u8bbf\u95ee\u3010\u5185\u7f51\u6587\u6863\u3011\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u54e6~~
\u6709\u8da3\uff08YouQu\uff09\u662f\u6df1\u5ea6\u79d1\u6280\u8bbe\u8ba1\u548c\u5f00\u53d1\u7684\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff0c\u91c7\u7528\u7ed3\u6784\u5206\u5c42\u7684\u8bbe\u8ba1\u7406\u5ff5\uff0c\u652f\u6301\u591a\u5143\u5316\u5143\u7d20\u5b9a\u4f4d\u548c\u65ad\u8a00\u3001\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u548c\u6267\u884c\u3001\u5f3a\u5927\u7684\u65e5\u5fd7\u548c\u62a5\u544a\u8f93\u51fa\u7b49\u7279\u8272\u529f\u80fd\uff0c\u540c\u65f6\u5b8c\u7f8e\u517c\u5bb9X11\u3001Wayland\u663e\u793a\u534f\u8bae\uff0c\u73af\u5883\u90e8\u7f72\u7b80\u5355\uff0c\u64cd\u4f5c\u6613\u4e0a\u624b\u3002
CI
OCR
X11
\u3010\u89c6\u9891\u4ecb\u7ecd\u3011
\u57fa\u7840\u6846\u67b6\uff1ahttps://github.com/linuxdeepin/deepin-autotest-framework
\u4ece PyPI \u5b89\u88c5:
sudo pip3 install youqu\n
\u521b\u5efa\u9879\u76ee:
youqu-startproject youqu\n
\u5b89\u88c5\u4f9d\u8d56:
cd youqu\nbash env.sh\n
\u6ce8\u610f\uff0c\u5982\u679c\u4f60\u7684\u6d4b\u8bd5\u673a\u5bc6\u7801\u4e0d\u662f 1 \uff0c\u90a3\u4f60\u9700\u8981\u5728\u5168\u5c40\u914d\u7f6e\u6587\u4ef6 globalconfig.ini \u91cc\u9762\u5c06 PASSWORD \u914d\u7f6e\u9879\u4fee\u6539\u4e3a\u5f53\u524d\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\u3002
PASSWORD
\u5e94\u7528\u5e93\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_ + app_name
https://gerrit.uniontech.com/admin/repos/autotest_ + app_name
\u94fe\u63a5\u540e\u9762\u7684\u5e94\u7528\u540d\u79f0\u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music
cd apps/\n
\u5c06\u5e94\u7528\u5e93\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u50cf\u8fd9\u6837\uff1a
youqu\n\u251c\u2500\u2500 apps\n\u2502 \u251c\u2500\u2500 autotest_deepin_music # \u5e94\u7528\u5e93\n...\n
\u5e94\u7528\u5e93\u7684\u540d\u79f0\u4e0d\u53ef\u4ee5\u4fee\u6539\u3002
\u57fa\u7840\u6846\u67b6\u5de5\u7a0b\u76ee\u5f55\u5efa\u8bae\u653e\u5728 ~ \u76ee\u5f55\u4e0b\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u4e5f\u53ef\u4ee5\u8fd0\u884c\uff0c\u4f46\u662f\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u9700\u8981\u505a\u73af\u5883\u6e05\u7406\uff0c\u653e\u5728\u5176\u4ed6\u76ee\u5f55\u5b58\u5728\u4ee3\u7801\u88ab\u5220\u9664\u7684\u98ce\u9669\u3002
~
\u5982\u679c\u4f60\u7684\u673a\u5668\u4e0a\u4e0d\u540c\u76ee\u5f55\u4e0b\u5b58\u5728\u591a\u4e2a YouQu \u5de5\u7a0b\uff0c\u90a3\u4e48\u5728\u8fd0\u884c\u4e4b\u524d\uff0c\u8bf7\u5148\u6267\u884c env.sh \u6821\u6b63\u76f8\u5173\u73af\u5883\u3002
\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u6709\u4e00\u4e2a manage.py \uff0c\u5b83\u662f\u4e00\u4e2a\u6267\u884c\u5668\u5165\u53e3\uff0c\u63d0\u4f9b\u4e86\u672c\u5730\u6267\u884c\u3001\u8fdc\u7a0b\u6267\u884c\u7b49\u7684\u529f\u80fd\u3002
\u4f7f\u7528\u7cfb\u7edf\u547d\u4ee4 youqu \u6765\u6267\u884c\uff1a
youqu
youqu manage.py run -a deepin-music\n
youqu manage.py run\n
\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\u914d\u7f6e\u53c2\u6570
\u5728\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u91cc\u9762\u652f\u6301\u914d\u7f6e\u5bf9\u6267\u884c\u7684\u4e00\u4e9b\u53c2\u6570\u8fdb\u884c\u914d\u7f6e\uff0c\u5e38\u7528\u7684\u5982\uff1a
;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;1\u3001KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2\u3001KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f, e.g. TAGS = L1 or smoke\n;\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\uff0c\u5c06\u8981\u6267\u884c\u7684\u7528\u4f8b\u5199\u5165\u6307\u5b9a\u7684 csv \u6587\u4ef6\n;\u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u4ece\u57fa\u7840\u6846\u67b6\u6839\u76ee\u5f55\u5f00\u59cb\uff1ae.g. CASE_FILE = case_list.txt\n;\u5982\u679c\u8fd9\u91cc\u6709\u503c\uff0cAPP_NAME KEYWORDS TAGS \u7684\u914d\u7f6e\u5747\u4e0d\u751f\u6548\nCASE_FILE =\n;=============================== RUNNER CONFIG ===================================\n[runner]\n;\u6700\u5927\u5931\u8d25\u7528\u4f8b\u6570\u91cf\u7684\u5360\u6bd4\n;\u6bd4\u5982\uff1a\u603b\u6267\u884c\u7528\u4f8b\u6570\u4e3a100, \u82e5 MAX_FAIL = 0.5,\u5219\u5931\u8d25\u7528\u4f8b\u6570\u8fbe\u523050\u5c31\u4f1a\u7ec8\u6b62\u6d4b\u8bd5\u3002\nMAX_FAIL = 0.5\n;\u5355\u6761\u7528\u4f8b\u7684\u8d85\u65f6\u65f6\u95f4\uff0c\u5982\u679c\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u8d85\u65f6\uff0c\u8fd9\u6761\u7528\u4f8b\u4f1a\u88ab\u505c\u6b62\uff0c\u540e\u7eed\u7528\u4f8b\u7ee7\u7eed\u6267\u884c\u3002\n;\u5355\u4f4d\u4e3a\u79d2\n; \u8fd9\u662f\u4e00\u4e2a\u5168\u5c40\u7edf\u4e00\u914d\u7f6e\uff0c\u5982\u679c\u67d0\u6761\u7528\u4f8b\u9700\u8981\u5355\u72ec\u914d\u7f6e\u8d85\u65f6\u65f6\u95f4\uff0c\u53ef\u4ee5\u5728\u7528\u4f8b\u4e2d\u8fd9\u6837\u5199\uff1a\n;@pytest.mark.timeout(500)\n;def test_xxx_001():\n; ...\n;\u4f1a\u8bdd\uff08\u6240\u6709\u7528\u4f8b\u6267\u884c\u7684\uff09\u8d85\u65f6\u662f\u6839\u636e\u5168\u5c40\u8d85\u65f6\u914d\u7f6e\u548c\u7528\u4f8b\u5355\u72ec\u8d85\u65f6\u914d\u7f6e\u81ea\u52a8\u8ba1\u7b97\u7684\uff1b\nCASE_TIME_OUT = 200\n;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\u3002\n;\u6ce8\u610f\uff0c\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u4e0d\u80fd\u5c0f\u4e8e\u5931\u8d25\u5f55\u5c4f\u6b21\u6570\uff0c\u5373 RERUN >= RECORD_FAILED_CASE\nRECORD_FAILED_CASE = 1\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = INFO\n;yes \u6bcf\u6761\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u8fdb\u884c\u73af\u5883\u6e05\u7406\nCLEAN_ALL = yes\n;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\nRESOLUTION = 1920x1080\n;\u4e0d\u8df3\u8fc7\u7528\u4f8b\uff0ccsv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86 skip-xxx\u7684\u7528\u4f8b\u4e0d\u8df3\u8fc7\nNOSKIP = no\n;ignore fixed\n;no\uff0c\u53ea\u8981\u6807\u8bb0\u4e86fixed\u7684\u7528\u4f8b\uff0c\u5373\u4f7f\u6807\u8bb0\u4e86skip-\uff0c\u4e5f\u4f1a\u6267\u884c\uff1b\n;yes\uff0cfixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\uff1b\nIFIXED = no\n;\u8981\u5b89\u88c5deb\u5305\u7684\u8def\u5f84\n;e.g : ~/Downloads/ \u5b89\u88c5\u4e0b\u8f7d\u76ee\u5f55\u4e0b\u7684deb\u5305\uff0c\u5982\u679c\u662f\u8fdc\u7a0b\u6267\u884c\uff0c\u4f1a\u81ea\u52a8\u62f7\u8d1d\u5230\u8fdc\u7a0b\u5e76\u5b89\u88c5\u3002\nDEB_PATH =\n;DEBUG \u6a21\u5f0f\u6267\u884c\u7528\u4f8b\uff0c\u53ea\u6536\u96c6\u4e0d\u6267\u884c\u7528\u4f8b\uff0c\u4e5f\u4e0d\u505a\u8bbe\u5907\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002\nDEBUG = no\n;\u8bb0\u5f55top\u547d\u4ee4\u67e5\u8be2\u7684\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0cTOP = 3 \u8868\u793a\u8bb0\u5f55\u524d3\u4e2a\u8fdb\u7a0b\u3002\nTOP =\n;\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\nREPEAT =\n;\u9ed8\u8ba4\u5728\u6240\u6709\u6d4b\u8bd5\u5b8c\u6210\u4e4b\u540e\u8f93\u51fa\u62a5\u9519\u4fe1\u606f.\n;yes, \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\nDURING_FAIL = no\n;=============================== REPORT CONFIG ===================================\n[report]\n;\u7528\u4f8b\u6267\u884c\u5b8c\u540e\u751f\u6210\u7684\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n;\u76ee\u524d\u652f\u6301 allure, xml, json \uff08\u652f\u6301\u540c\u65f6\u751f\u6210\uff09\nREPORT_FORMAT = allure, xml, json\n;\u6307\u5b9a\u62a5\u544a\u751f\u6210\u7684\u8def\u5f84\uff08\u76f8\u5bf9\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\uff09\nALLURE_REPORT_PATH = report/\nXML_REPORT_PATH = report/\nJSON_REPORT_PATH = report/\n;=============================== GLOBAL CONFIG ===================================\n[globalconfig]\n;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\nPASSWORD = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\nIMAGE_MATCH_NUMBER = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6bcf\u6b21\u95f4\u9694\u7b49\u5f85\u65f6\u95f4\nIMAGE_MATCH_WAIT_TIME = 1\n;\u56fe\u50cf\u8bc6\u522b\u5339\u914d\u5ea6\nIMAGE_RATE = 0.9\n;\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u5b9e\u65f6\u56fe\u50cf\u4fdd\u5b58\u8def\u5f84\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u5750\u6807\nSCREEN_CACHE = /tmp/screen.png\n;\u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\u7684\u8def\u5f84\nTMPDIR = /tmp/tmpdir\n;\u7cfb\u7edf\u4e3b\u9898\nSYS_THEME = deepin\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = http://youqu-dev.uniontech.com:8890\n;OpenCV\u670d\u52a1\u7aef\u5730\u5740\nOPENCV_SERVER_HOST = http://youqu-dev.uniontech.com:8889\n;=============================== PMS CONFIG ===================================\n;PMS\u76f8\u5173\u914d\u7f6e\uff0c\u5305\u542b\u4ee5\u4e0b\u51e0\u4e2a\u65b9\u9762\uff1a\n;1.PMS\u6d4b\u8bd5\u5957\u6267\u884c\n;2.\u81ea\u52a8\u4ecePMS\u722c\u53d6\u6570\u636e\u5e76\u540c\u6b65\u672c\u5730CSV\u6587\u4ef6\n;3.PMS\u6570\u636e\u56de\u586b\n[pms]\n;PMS\u7684\u7528\u6237\u540d: ut001234\nPMS_USER =\n;PMS\u7684\u5bc6\u7801\nPMS_PASSWORD =\n;PMS\u6d4b\u8bd5\u5957\u7684ID\n;\u5728PMS\u4e0a\u67e5\u770b\u7528\u4f8b\u201c\u5957\u4ef6\u201d\u94fe\u63a5: https://pms.uniontech.com/testsuite-view-495.html\n;\u6d4b\u8bd5\u5957ID\u4e3a: 495\nSUITE_ID =\n;\u6570\u636e\u56de\u586b\u5fc5\u987b\u5173\u8054PMS\u6d4b\u8bd5\u5355\n;\u5728PMS\u4e0a\u67e5\u770b\u6d4b\u8bd5\u5355\u94fe\u63a5: https://pms.uniontech.com/testtask-cases-20747.html\n;\u6d4b\u8bd5\u5355ID\u4e3a: 20747\nTASK_ID =\n;\u5c06\u6d4b\u8bd5\u7ed3\u679c\u6570\u636e\u56de\u586b\u5230PMS\n;\u4e3a\u7a7a: \u8868\u793a\u4e0d\u56de\u586b,\u4e0d\u4f1a\u5728\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u751f\u6210json\u7ed3\u679c\u6587\u4ef6;\n;async: \u8868\u793a\u9010\u6761\u5f02\u6b65\u56de\u586b,\u540e\u9762\u4e00\u6761\u6267\u884c\u5f00\u59cb\u65f6\u901a\u8fc7\u5b50\u7ebf\u7a0b\u5bf9\u524d\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u8fdb\u884c\u56de\u586b\uff0c\u5982\u6b64\u5b9e\u73b0\u65f6\u95f4\u6548\u7387\u6700\u5927\u5316;\n;finish: \u8868\u793a\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u6210\u4e4b\u540e\u9010\u4e2a\u56de\u586b(PMS\u4e0d\u652f\u6301\u5e76\u53d1);\nSEND_PMS =\n;\u6570\u636e\u56de\u586b\u7684\u89e6\u53d1\u8005\n;auto: \u6846\u67b6\u81ea\u52a8\u56de\u586b,\u914d\u5408SEND_PMS\u914d\u7f6e\u4f7f\u7528,\u4f60\u53ef\u4ee5\u9009\u62e9\u5728\u4e0d\u540c\u7684\u9636\u6bb5\u8fdb\u884c\u6570\u636e\u56de\u586b;\n;hand: \u624b\u52a8\u56de\u586b,\u6bcf\u6761\u7528\u4f8b\u4ecd\u7136\u4f1a\u751f\u6210json\u6587\u4ef6,\u4f46\u6846\u67b6\u4e0d\u4f1a\u8fdb\u884c\u6570\u636e\u56de\u586b,\u9700\u8981\u4f60\u53ef\u4ee5\u5728\u4f60\u60f3\u8981\u53d1\u9001\u7684\u65f6\u95f4\u70b9\u624b\u52a8\u89e6\u53d1\u56de\u586b;\nTRIGGER = auto\n;PMS\u56de\u586b\u7684\u91cd\u8bd5\u6b21\u6570\n;\u5982\u679c\u63a5\u53e3\u8bf7\u6c42\u5931\u8d25,\u4f1a\u8fdb\u884c\u91cd\u8bd5\nSEND_PMS_RETRY_NUMBER = 2\n[csv_link_pms_lib]\n;caselib: \u7528\u4f8b\u5e93\n;testcase: \u4ea7\u54c1\u5e93\u7528\u4f8b\nCASE_FROM = caselib\n[csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/caselib-browse-81.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 81\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic =\n[export_csv]\n;\u5bfc\u51fa\u7684csv\u6587\u4ef6\u540d\u79f0\uff0c\u9ed8\u8ba4 case_list.csv\nCSV_FILE = case_list.csv\n;exportcsv \u547d\u4ee4\u5bfc\u51fa case_list.csv \u6587\u4ef6\u65f6\u914d\u7f6e\u7684\u5b57\u6bb5\u540d\uff0c\u7528\u4f8b\u540d\u79f0\u9ed8\u8ba4\u5b58\u5728\u7b2c\u4e00\u5217\uff0c\u65e0\u9700\u6dfb\u52a0\nCSV_HEARD = \u7528\u4f8b\u7ea7\u522b,\u7528\u4f8b\u7c7b\u578b,\u6d4b\u8bd5\u7ea7\u522b,\u662f\u5426\u8df3\u8fc7\n
\u914d\u7f6e\u5b8c\u6210\u4e4b\u540e\uff0c\u76f4\u63a5\u5728\u547d\u4ee4\u884c\u6267\u884c manage.py \u5c31\u597d\u4e86\u3002
\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u914d\u7f6e\u53c2\u6570
\u4ee5\u4e0b\u4e3a youqu manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a
-a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--max_fail MAX_FAIL \u6700\u5927\u5931\u8d25\u7387\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--resolution RESOLUTION\n\u68c0\u67e5\u5206\u8fa8\u7387\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms {,async,finish}\n\u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--trigger {,auto,hand}\n\u89e6\u53d1\u8005\n-f CASE_FILE, --case_file CASE_FILE\n\u6839\u636e\u6587\u4ef6\u6267\u884c\u7528\u4f8b\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n--pms_user PMS_USER pms \u7528\u6237\u540d\n--pms_password PMS_PASSWORD\npms \u5bc6\u7801\n--suite_id SUITE_ID pms \u6d4b\u8bd5\u5957ID\n--pms_info_file PMS_INFO_FILE\npms \u4fe1\u606f\u6587\u4ef6\n--top TOP \u8fc7\u7a0b\u4e2d\u8bb0\u5f55top\u547d\u4ee4\u4e2d\u7684\u503c\n--lastfailed \u4ec5\u6267\u884c\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\n--duringfail \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\n--repeat REPEAT \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n--project_name PROJECT_NAME\n\u5de5\u7a0b\u540d\u79f0\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--build_location BUILD_LOCATION\n\u6784\u5efa\u5730\u533a\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--line LINE \u6267\u884c\u7684\u4e1a\u52a1\u7ebf\uff08\u5199\u5165json\u6587\u4ef6\uff09\n
\u5728\u4e00\u4e9b CI \u73af\u5883\u4e0b\u4f7f\u7528\u547d\u4ee4\u884c\u53c2\u6570\u4f1a\u66f4\u52a0\u65b9\u4fbf\uff1a
youqu manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\"\n
\u547d\u4ee4\u884c\u53c2\u6570\u4f18\u5148\u7ea7\u662f\u9ad8\u4e8e\u914d\u7f6e\u6587\u4ef6\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u4e86\u5bf9\u5e94\u7684\u53c2\u6570\uff0c\u914d\u7f6e\u6587\u4ef6\u4e2d\u4e0d\u7ba1\u662f\u5426\u914d\u7f6e\u5747\u4e0d\u751f\u6548\u3002
--app \u5165\u53c2\u8fd8\u652f\u6301 autotest_xxx \u548c apps/autotest_xxx \u4e24\u79cd\u5199\u6cd5\uff0c\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\uff0c\u4e0b\u9762\u7684\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u540c\u6837\u652f\u6301\u3002
autotest_xxx
apps/autotest_xxx
youqu manage.py remote\n
\u8fdc\u7a0b\u6267\u884c\u540c\u6837\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6 setting/globalconfig.ini \u8fdb\u884c\u7528\u4f8b\u76f8\u5173\u914d\u7f6e\uff1b
\u9700\u8981\u91cd\u70b9\u8bf4\u4e00\u4e0b\u8fdc\u7a0b\u6267\u884c\u65f6\u7684\u6d4b\u8bd5\u673a\u4fe1\u606f\u914d\u7f6e\uff0c\u5728\u914d\u7f6e\u6587\u4ef6 setting/remote.ini \u91cc\u9762\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\u3001IP\u3001\u5bc6\u7801\u3002
;=============================== CLIENT LIST =====================================\n; \u6d4b\u8bd5\u673a\u914d\u7f6e\u5217\u8868\n;[client{number}] ;\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u6709\u591a\u5c11\u53f0\u6d4b\u8bd5\u673a\u5c31\u5199\u591a\u5c11\u4e2a client\uff0c\u522b\u540d\u5fc5\u987b\u5305\u542b client \u5b57\u7b26\uff0c\u4e14\u4e0d\u80fd\u91cd\u590d\u3002\n;user = ;\u6d4b\u8bd5\u673a user\n;ip = ;\u6d4b\u8bd5\u673a ip\n;password = 1 ;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801, \u53ef\u4ee5\u4e0d\u914d\u7f6e\u6b64\u9879\uff0c\u9ed8\u8ba4\u53d6 CLIENT_PASSWORD \u7684\u503c\uff1b\n;\u5982\u679c\u4f60\u6240\u6709\u6d4b\u8bd5\u673a\u5bc6\u7801\u90fd\u76f8\u540c\uff0c\u90a3\u4e48\u53ea\u9700\u8981\u914d\u7f6e CLIENT_PASSWORD \u5c31\u53ef\u4ee5\u4e86\n;=================================================================================\n[client1]\nuser = uos\nip = 10.8.15.xx\n[client2]\nuser = uos\nip = 10.8.15.xx\n[client3]\nuser = uos\nip = 10.8.11.xx\n
\u6709\u591a\u5c11\u53f0\u673a\u5668\u5c31\u50cf\u8fd9\u6837\u6328\u7740\u5199\u5c31\u884c\u4e86\u3002
\u7136\u540e\u5728\u547d\u4ee4\u884c\uff1a
\u8fd9\u6837\u8fd0\u884c\u662f\u4ece\u914d\u7f6e\u6587\u4ef6\u53bb\u8bfb\u53d6\u76f8\u5173\u914d\u7f6e\u3002
\u5982\u679c\u4f60\u4e0d\u60f3\u901a\u8fc7\u914d\u7f6e\u6587\u4ef6\uff0c\u4f60\u4ecd\u7136\u901a\u8fc7\u547d\u4ee4\u884c\u53c2\u6570\u8fdb\u884c\u4f20\u53c2\uff0c
\u4ee5\u4e0b\u4e3a python3 manage.py remote \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a
-a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-c CLIENTS, --clients CLIENTS\n\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679cpassword\u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6\nsetting/remote.ini \u4e2d CLIENT_PASSWORD\n\u7684\u503c,\u6bd4\u5982\uff1auos@10.8.13.33:1 \u6216 uos@10.8.13.33\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-s {yes,no,}, --send_code {yes,no,}\n\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a\uff08\u4e0d\u542breport\u76ee\u5f55\uff09\n-e, --build_env \u642d\u5efa\u6d4b\u8bd5\u73af\u5883,\u5982\u679c\u4e3ayes\uff0c\u4e0d\u7ba1send_code\u662f\u5426\u4e3ayes\u90fd\u4f1a\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a.\n-p CLIENT_PASSWORD, --client_password CLIENT_PASSWORD\n\u6d4b\u8bd5\u673a\u5bc6\u7801\uff08\u5168\u5c40\uff09\n-y PARALLEL, --parallel PARALLEL\nyes:\u8868\u793a\u6240\u6709\u6d4b\u8bd5\u673a\u5e76\u884c\u8dd1\uff0c\u6267\u884c\u76f8\u540c\u7684\u6d4b\u8bd5\u7528\u4f8b\uff0cno\n:\u8868\u793a\u6d4b\u8bd5\u673a\u5206\u5e03\u5f0f\u6267\u884c\uff0c\u670d\u52a1\u7aef\u4f1a\u6839\u636e\u6536\u96c6\u5230\u7684\u6d4b\u8bd5\u7528\u4f8b\u81ea\u52a8\u5206\u914d\u7ed9\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u3002\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms SEND_PMS \u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n
\u5728\u547d\u4ee4\u884c\u8fd9\u6837\u8fd0\u884c\uff1a
youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\"\n
\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report \u76ee\u5f55\u4e0b\u56de\u6536\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u7684\u6d4b\u8bd5\u62a5\u544a\u3002
\u914d\u7f6e\u6587\u4ef6\u5176\u4ed6\u76f8\u5173\u914d\u7f6e\u9879\u8be6\u7ec6\u8bf4\u660e\uff0c\u8bf7\u67e5\u770b\u914d\u7f6e\u6587\u4ef6\u4e2d\u7684\u6ce8\u91ca\u5185\u5bb9\u3002
\u6d4b\u8bd5\u5355\u5173\u8054\u7684\u7528\u4f8b\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u5bf9\u5e94\u7684\u53bb\u8dd1\u8fd9\u4e9b\u5173\u8054\u7684\u7528\u4f8b\uff0c\u5e76\u4e14\u5c06\u6267\u884c\u7684\u7ed3\u679c\u56de\u586b\u7684\u6d4b\u8bd5\u7528\u4f8b\u7684\u72b6\u6001\u91cc\u9762\u3002
PMS \u6570\u636e\u56de\u586b\u4e3b\u8981\u6709\u4e09\u79cd\u65b9\u5f0f\uff1a
\uff081\uff09\u5f02\u6b65\u56de\u586b
\u5728\u7528\u4f8b\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\uff0c\u91c7\u7528\u5f02\u6b65\u7684\u65b9\u5f0f\u53bb\u8fdb\u884c\u6570\u636e\u56de\u586b\uff0c\u76f4\u767d\u7684\u8bb2\u5c31\u662f\uff0c\u7b2c\u4e8c\u6761\u7528\u4f8b\u5f00\u59cb\u8dd1\u7684\u65f6\u5019\uff0c\u901a\u8fc7\u5b50\u7ebf\u7a0b\u53bb\u505a\u7b2c\u4e00\u6761\u7528\u4f8b\u7684\u6570\u636e\u56de\u586b\uff0c\u5982\u6b64\u5faa\u73af\uff0c\u76f4\u5230\u6240\u6709\u7528\u4f8b\u6267\u884c\u7ed3\u675f\uff1b
\u8fd9\u79cd\u65b9\u6848\u7684\u65f6\u95f4\u6548\u7387\u6700\u9ad8\u7684\uff0c\u56e0\u4e3a\u7406\u8bba\u4e0a\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u662f\u5927\u4e8e\u6570\u636e\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\u65f6\u95f4\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u5f53\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u6570\u636e\u56de\u586b\u4e5f\u5b8c\u6210\u4e86\u3002
\u4f7f\u7528\u65b9\u6cd5\uff0c\u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u4ee5\u4e0b\u53c2\u6570\uff1a\uff08\u4ee5\u4e0b\u6d89\u53ca\u5230\u7684\u53c2\u6570\u914d\u7f6e\u90fd\u662f\u5728\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u914d\u7f6e\uff09
PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = async\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME = \u8fd9\u4e2a\u53c2\u6570\u53ef\u586b\u53ef\u4e0d\u586b\uff0c\u4f46\u662f\u586b\u4e86\u53ef\u4ee5\u63d0\u9ad8\u7528\u4f8b\u7684\u6267\u884c\u901f\u5ea6\uff0c\u56e0\u4e3a\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u53ef\u4ee5\u6307\u5b9a\u5230\u5177\u4f53\u7684\u5e94\u7528\u5e93\u3002\uff08\u4e0b\u540c\uff09\n
\uff082\uff09\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u56de\u586b
\u7b49\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u518d\u9010\u4e2a\u8fdb\u884c\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u6b64\u65b9\u6848\u65f6\u95f4\u6548\u7387\u6bd4\u8f83\u4f4e\u3002
\u4f7f\u7528\u65b9\u6cd5\uff1a
PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = auto\nAPP_NAME =
\uff083\uff09\u624b\u52a8\u56de\u586b
\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u4e0d\u505a\u56de\u586b\u7684\u63a5\u53e3\u8bf7\u6c42\uff0c\u540e\u7eed\u624b\u52a8\u5c06\u7ed3\u679c\u8fdb\u884c\u56de\u586b\u8bf7\u6c42\u3002
\u7528\u4f8b\u6267\u884c\u65f6\u914d\u7f6e\uff1a
PMS_USER = PMS\u8d26\u53f7\nPMS_PASSWORD = PMS\u5bc6\u7801\nSEND_PMS = finish\nTASK_ID = \u6d4b\u8bd5\u5355ID\nTRIGGER = hand\nAPP_NAME =
\u540e\u7eed\u624b\u52a8\u56de\u586b\u65b9\u6cd5\uff1a
youqu manage.py pms --send2task yes\n
\u7531\u540c\u5b66\u53ef\u80fd\u4f1a\u53d1\u73b0\uff0c\u600e\u4e48\u56de\u586b\u4e00\u6b21\u4e4b\u540e\uff0c\u540e\u9762\u60f3\u518d\u6b21\u56de\u586b\u5c31\u4e0d\u751f\u6548\u4e86\uff1b
\u8fd9\u662f\u56e0\u4e3a\u4e3a\u4e86\u5e94\u5bf9\u524d\u9762\u63d0\u5230\u7684\u591a\u79cd\u6570\u636e\u56de\u586b\u7684\u65b9\u5f0f\uff0c\u5728 report \u76ee\u5f55\u4e0b\u4f1a\u7531 pms_xxx \u5f00\u5934\u7684\u76ee\u5f55\uff0c\u8bb0\u5f55\u4e86\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u548c\u56de\u586b\u60c5\u51b5\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u4e4b\u524d\u5df2\u7ecf\u56de\u586b\u8fc7\u4e86\uff0c\u540e\u7eed\u5c31\u4e0d\u4f1a\u518d\u6b64\u89e6\u53d1\u56de\u586b\u4e86\uff1b
pms_xxx
\u5982\u679c\u4f60\u60f3\u91cd\u65b0\u505a\u56de\u586b\uff0c\u4f60\u53ef\u4ee5\u628a report/pms_xxx \u76ee\u5f55\u5220\u6389\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u91cd\u65b0\u505a\u6570\u636e\u56de\u586b\u4e86\uff1b
report/pms_xxx
\u6846\u67b6\u63d0\u4f9b\u5bfc\u51fa\u6307\u5b9a\u6807\u7b7e\u7528\u4f8b\u7684\u529f\u80fd\uff1a
youqu manage.py exportcsv -a deepin-album -t CICD\n
\u8868\u793a\u5bfc\u51fa deepin-album \u7684\u7528\u4f8b\u4e2d\u6807\u8bb0\u4e86 CICD \u6807\u7b7e\u7684\u7528\u4f8b\uff0c\u5bfc\u51fa CSV \u6587\u4ef6\u7684\u5b57\u6bb5\u683c\u5f0f\u5df2\u7ecf\u9002\u914d\u4e86 CICD \u7684\u8981\u6c42\u3002
\u65b0\u5efa\u4e00\u4e2a APP \u5de5\u7a0b\uff1a
\u8fd9\u6837\u5728 apps \u76ee\u5f55\u4e0b\u4f1a\u521b\u5efa\u4e00\u4e2a\u5b50\u9879\u76ee\u5de5\u7a0b autotest_deepin_some\uff0c\u540c\u65f6\u65b0\u5efa\u597d\u5de5\u7a0b\u6a21\u677f\u76ee\u5f55\u548c\u6a21\u677f\u6587\u4ef6\uff1a
apps\n\u2514\u2500\u2500 autotest_deepin_some\n \u00a0\u00a0 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_case.py\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 config.ini\n \u00a0\u00a0 \u251c\u2500\u2500 config.py\n \u00a0\u00a0 \u251c\u2500\u2500 conftest.py\n \u00a0\u00a0 \u251c\u2500\u2500 control\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_assert.py\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some.csv\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u2514\u2500\u2500 widget\n \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 case_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u251c\u2500\u2500 deepin_some_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u00a0\u00a0 \u251c\u2500\u2500 other.ini\n \u00a0\u00a0 \u251c\u2500\u2500 other_widget.py\n \u00a0\u00a0 \u251c\u2500\u2500 pic_res\n \u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n \u00a0\u00a0 \u2514\u2500\u2500 ui.ini\n
autotest_deepin_some \u662f\u4f60\u7684\u5de5\u7a0b\u540d\u79f0\uff0c\u6bd4\u5982\uff1aautotest_deepin_music \uff1b
\u5728\u6b64\u57fa\u7840\u4e0a\uff0c\u4f60\u53ef\u4ee5\u5feb\u901f\u7684\u5f00\u59cb\u4f60\u7684 AT \u9879\u76ee\u3002
\u7528\u4e8e\u81ea\u52a8\u540c\u6b65 PMS \u7528\u4f8b\u6807\u7b7e\u6570\u636e\u81f3\u672c\u5730 CSV \u6587\u4ef6\uff0c\u4e3b\u8981\u901a\u8fc7\u4ee5\u4e0b\u51e0\u4e2a\u914d\u7f6e\u6765\u63a7\u5236\uff1a
APP_NAME = # \u6307\u5b9a\u8981\u540c\u6b65\u7684\u5e94\u7528\u540d\u79f0\nPMS_USER = # PMS\u7684\u7528\u6237\u540d\nPMS_PASSWORD = # PMS\u7684\u5bc6\u7801\n
\u5728 [csv_link_pms_id] \u8282\u70b9\u4e0b\u6307\u5b9a csv \u6587\u4ef6\u540d\u4e0e PMS \u7528\u4f8b\u6a21\u5757\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u6bd4\u5982\uff1a
[csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/testcase-browse-53.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 53\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic = 53\n
\u5c06\u4ee5\u4e0a\u4fe1\u606f\u914d\u7f6e\u597d\u4e4b\u540e\uff0c\u5728\u547d\u4ee4\u884c\u6267\u884c\uff1a
youqu manage.py pms --pms2csv yes\n
\u6bcf\u6b21\u6267\u884c\u65f6\u539f csv \u6587\u4ef6\u4f1a\u81ea\u52a8\u5907\u4efd\u5728 report/csv_back \u76ee\u5f55\u4e0b\uff0c\u56e0\u6b64\u4f60\u4e0d\u7528\u62c5\u5fc3\u811a\u672c\u6267\u884c\u5bfc\u81f4\u4f60\u7684\u6570\u636e\u4e22\u5931\u3002
# ====================================\n# Author : Mikigo\n# Time : 2022/3/18\n# version \uff1a1.0\n# ====================================\n
\u505a\u4e00\u4e2a\u7b80\u5355\u3001\u597d\u7528\u3001\u529f\u80fd\u5f3a\u5927\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u3002
\u672c\u9879\u76ee\u662f\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\uff08AutoTest Basic Frame\uff09\uff0c\u5168\u79f0\u4e3a\u201c\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff08AT \u57fa\u7840\u6846\u67b6\uff09\u201d\u3002
AutoTest Basic Frame
AT \u57fa\u7840\u6846\u67b6\u662f\u505a\u4e3a\u4e00\u4e2a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u57fa\u7840\u6846\u67b6\u6765\u8bbe\u8ba1\u7684\uff0c\u5b83\u63d0\u4f9b\u4e86\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u57fa\u7840\u529f\u80fd\uff0c\u4efb\u4f55\u5e94\u7528\u63a5\u5165\u8fdb\u6765\u90fd\u80fd\u5feb\u901f\u65b9\u4fbf\u7684\u8fdb\u884c\u65b9\u6cd5\u548c\u7528\u4f8b\u7f16\u5199\uff0c\u540c\u65f6\u5728\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u3001\u6279\u91cf\u8df3\u8fc7\u3001\u6807\u7b7e\u5316\u6267\u884c\u3001\u5206\u5e03\u5f0f\u6267\u884c\u3001\u591a\u79cd\u62a5\u544a\u8f93\u51fa\u3001\u4f18\u7f8e\u7684\u6267\u884c\u65e5\u5fd7\u3001\u5931\u8d25\u81ea\u52a8\u5f55\u5c4f\u548c\u622a\u56fe\u3001\u81ea\u52a8\u73af\u5883\u6e05\u7406\u7b49\u7b49\uff0c\u5b83\u90fd\u63d0\u4f9b\u4e86\u5b8c\u5584\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u66f4\u91cd\u8981\u7684\u662f\u8fd9\u4e00\u5207\u4f7f\u7528\u8d77\u6765\u90fd\u975e\u5e38\u7b80\u5355\u3002
\u57fa\u7840\u6846\u67b6\u4e2d\u5305\u542b\u5e94\u7528\u5e93\uff08apps\uff09\u3001\u6838\u5fc3\u5e93\uff08src\uff09\u3001\u516c\u5171\u65b9\u6cd5\u5e93\uff08public\uff09\u3002
src
public
\u5404\u4e2a\u5e94\u7528\u81ea\u5df1\u7684\u4ed3\u5e93\uff0c\u91cc\u9762\u4e3b\u8981\u5305\u542b\u7684\u662f\u7528\u4f8b\u3001\u65b9\u6cd5\u53ca\u4e00\u4e9b\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u53eb autotest-dde-file-manager \u3002
autotest-dde-file-manager
\u6838\u5fc3\u5e93\u81ea\u52a8\u5316\u6d4b\u8bd5\u6240\u8981\u7528\u7684\u5230\u6240\u6709\u5e95\u5c42\u6838\u5fc3\u529f\u80fd\uff0c\u8fd9\u662f\u6700\u91cd\u8981\u7684\u4e00\u4e2a\u90e8\u5206\uff0c\u7075\u9b42\u3002\u5177\u4f53\u529f\u80fd\u6a21\u5757\u53ca\u8bf4\u660e\u4f1a\u5728\u4e0b\u9762\u7b2c\u56db\u4e2a\u7ae0\u8282\u8be6\u7ec6\u63cf\u8ff0\u3002
\u591a\u4e2a\u5e94\u7528\u90fd\u8981\u7528\u5230\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\uff0c\u6309\u7167\u5e94\u7528\u5212\u5206\u5b58\u653e\uff0c\u4e3b\u8981\u662f\u4e3a\u4e86\u51cf\u5c11\u4ee3\u7801\u91cf\uff0c\u6d88\u9664\u5e94\u7528\u95f4\u7684\u8026\u5408\u5173\u7cfb\u3002
\u6574\u4f53\u7684\u6846\u67b6\u8bbe\u8ba1\u5728\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u8bbe\u8ba1\u300b\u6587\u6863\u91cc\u9762\u5df2\u7ecf\u6709\u8be6\u7ec6\u63cf\u8ff0\u4e86\uff0c\u8fd9\u91cc\u8d34\u4e00\u4e0b\u6574\u4f53\u7684\u67b6\u6784\u56fe\uff1a
\u4e3a\u4e86\u7a81\u663e\u672c\u6587\u7684\u91cd\u70b9\uff0c\u62bd\u53d6\u5176\u4e2d\u91cd\u8981\u529f\u80fd\u6a21\u5757\uff0c\u5982\u4e0b\u56fe\uff1a
autotest-basic-frame # \u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\n\u251c\u2500\u2500 apps # \u5e94\u7528\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-dde-file-manager # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\uff08\u5e94\u7528\u5e93\u8be6\u7ec6\u76ee\u5f55\u7ed3\u6784\u8bf7\u770b\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\uff09\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 tag # \u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 base_widget.py\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u2502\u00a0\u00a0 \u00a0\u00a0 \u2514\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u2502 \u00a0\u00a0 \u00a0\u00a0 \u251c\u2500\u2500 xxx.png\n\u2502 \u2502 ...\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 autotest-deepin-music # \u5355\u72ec\u7684\u5e94\u7528\u4ed3\u5e93\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 case\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 public # \u516c\u5171\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget # dde_dock \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_dock_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget # dde_desktop \u7684\u516c\u5171\u65b9\u6cd5 package\n\u2502\u00a0\u00a0 \u2502 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 dde_desktop_public_widget.py\n\u2502 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ui.ini \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 res \u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 src # \u6838\u5fc3\u5e93\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 button_center.py\n\u2502 \u251c\u2500\u2500 cmdtrl.py\n\u2502 \u251c\u2500\u2500 dogtails.py\n\u2502 \u251c\u2500\u2500 find_image.py\n\u2502 \u251c\u2500\u2500 global_config.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 setting # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n\u2502 \u251c\u2500\u2500 __init__.py\n\u2502 \u251c\u2500\u2500 config.py\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 global_config.ini\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\u6a21\u5757\uff08Hook\uff09\n\u251c\u2500\u2500 pytest.ini # Pytest \u9ed8\u8ba4\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 docs # \u6587\u6863\u76ee\u5f55\n\u2514\u2500\u2500 manage.py # \u6267\u884c\u5668\n
\u6240\u6709\u5e94\u7528\u5e93\u5747\u653e\u7f6e\u5728\u57fa\u7840\u6846\u67b6\u4e0b\u7684 apps \u76ee\u5f55\u4e0b\uff08\u89c1\u7b2c\u4e8c\u7ae0\u8282\u7b2c3\u6bb5\u76ee\u5f55\u7ed3\u6784\u5185\u5bb9\uff09\u3002\u5e94\u7528\u5e93\u7684\u67b6\u6784\u8bbe\u8ba1\u53ef\u4ee5\u53c2\u8003\u300aAT \u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b\u6587\u6863\u3002
\u5728 src \u76ee\u5f55\u4e0b\u4e3a\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u5e95\u5c42\u6838\u5fc3\u7ec4\u4ef6\uff0c\u901a\u5e38\u6765\u8bb2\u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5230\u5176\u4e2d\u67d0\u4e00\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4e48\u4f60\u9700\u8981\u663e\u793a\u7684\u5bfc\u5165\u8fd9\u4e2a\u6a21\u5757\uff0c\u7136\u540e\u624d\u80fd\u4f7f\u7528\u8be5\u6a21\u5757\u4e0b\u7684\u529f\u80fd\uff0c\u5982\u679c\u4f60\u7528\u5230\u4e86\u5341\u4e2a\u529f\u80fd\u6a21\u5757\uff0c\u90a3\u4f60\u5c31\u9700\u8981\u5bfc\u5165\u5341\u4e2a\u3002\u4f46\u662f\u6211\u4eec\u60f3\u8ba9\u4e8b\u60c5\u53d8\u5f97\u7b80\u5355\uff0c\u4e00\u6b21\u5bfc\u5165\uff0c\u4f7f\u7528\u6240\u6709\u3002
\u5c06\u6240\u6709\u7684\u529f\u80fd\u6a21\u5757\u90fd\u8fdb\u5165\u5230 src \u7684\u540d\u79f0\u7a7a\u95f4\uff0c\u5728 src/__init__.py \u91cc\u9762\u6211\u4eec\u8bbe\u8ba1\u6210\u8fd9\u6837\uff1a
src/__init__.py
# src/__init__.py\nfrom .cmdctl import CmdCtl\nfrom .dogtails import Dogtail\nfrom .find_image import FindImage\nfrom .button_center import ButtonCenter\nclass Src(CmdCtl, FindImage):\ndef __init__(self, **kwargs):\n\"\"\"dogtail or button center param\n :param kwargs: app_name, desc, number\n \"\"\"\nif kwargs:\napp_name = kwargs.get(\"APP_NAME\")\ndesc = kwargs.get(\"DESC\")\nif app_name is None or desc is None:\nraise ValueError\nnumber = kwargs.get(\"number\")\nnumber = number if isinstance(number, int) else -1\n# \u5bf9\u8c61\u7ec4\u5408\nself.dog = Dogtail(app_name, desc, number)\nself.ui = ButtonCenter(app_name, number)\n
\u9700\u8981\u4f20\u9012\u53c2\u6570\u7684\u91c7\u7528\u5bf9\u8c61\u7ec4\u5408\uff0c\u6ca1\u6709\u53c2\u6570\u7684\u4f7f\u7528\u7ee7\u627f\uff0c\u7ee7\u627f\u7684\u7c7b\u7b26\u5408 Mixin \u8bbe\u8ba1\u6a21\u5f0f\u3002
Mixin
\u5e94\u7528\u5e93\u91cc\u9762\u4f7f\u7528\u7684\u65f6\u5019\u5728 widget/base_widget.py \u91cc\u9762\u53ea\u9700\u8981\u552f\u4e00\u7ee7\u627f Src \uff1a
widget/base_widget.py
Src
# \u5e94\u7528\u5e93\u91cc\u9762\u65b9\u6cd5\u57fa\u7c7b\n# widget/base_widget.py\nfrom src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n
\u8981\u4f7f\u7528\u6838\u5fc3\u5e93\u7684\u529f\u80fd\uff0c\u53ea\u9700\u8981\u5199\u4e00\u4e2a\u5bfc\u5165 from src import Src \u5373\u53ef\u3002
from src import Src
\u5199 __init__ \u6784\u9020\u51fd\u6570\u7684\u539f\u56e0\u662f\u901a\u8fc7\u53c2\u6570\u6784\u9020\u5e94\u7528\uff0c\u5e76\u4e14\u4f20\u9012 number \u8fdb\u6765\uff0c\u53ef\u4ee5\u5b9e\u73b0\u591a\u7a97\u53e3\u7684\u63a7\u5236\u3002
__init__
number
\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6bcf\u4e2a\u5e94\u7528\u90fd\u662f\u4e00\u4e2a\u5355\u72ec\u7684 py \u6587\u4ef6\uff0c\u76f8\u4e92\u4e4b\u95f4\u662f\u72ec\u7acb\u7684\uff0c\u6bcf\u4e2a py \u6587\u4ef6\u91cc\u9762\u662f\u8be5\u5e94\u7528\u7684\u65b9\u6cd5\u7c7b\uff0c\u6bd4\u5982\uff1a\u6700\u5e38\u7528\u7684\u65b9\u6cd5\u7c7b dde_desktop_public_widget.py
py
dde_desktop_public_widget.py
# dde_desktop_widget.py\nfrom src import Src\nclass _DdeDesktopPublicBaseWidget(Src):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-desktop\"\nDESC = \"/usr/bin/dde-desktop\"\ndef __init__(self):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC)\nclass DdeDesktopPublicWidget(_DdeDesktopPublicBaseWidget):\n\"\"\"\u684c\u9762\u516c\u5171\u65b9\u6cd5\u7c7b\"\"\"\ndef click_music_dir_by_ui(self):\n\"\"\"\u5728\u6587\u4ef6\u9009\u62e9\u6846\u70b9\u51fb\u97f3\u4e50\u76ee\u5f55\"\"\"\nself.click(*self.ui.btn_center(\"\u4fa7\u8fb9\u680f-\u97f3\u4e50\")) \ndef click_xxx_by_attr(self):\npass\n
\u516c\u5171\u65b9\u6cd5\u5e93\u610f\u4e49\uff1a
\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u6240\u5c01\u88c5\u7684\u4e00\u4e9b\u64cd\u4f5c\u65b9\u6cd5\u90fd\u662f\u81f3\u5c11\u88ab2\u4e2a\u5e94\u7528\u90fd\u7528\u5230\u7684\uff0c\u8fd9\u6837\u505a\u53ef\u4ee5\u51cf\u5c11\u6574\u4f53\u4ee3\u7801\u91cf\uff0c\u4ece\u800c\u51cf\u8f7b\u5e94\u7528\u5e93\u4ee3\u7801\u7684\u7ef4\u62a4\u5de5\u4f5c\u3002
\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u7684\u7f16\u5199\u5f62\u5f0f\uff08\u547d\u540d\u89c4\u5219\u3001\u5b9a\u4f4d\u7684\u65b9\u6848\u5199\u6cd5\u3001\u6ce8\u91ca\u7684\u5199\u6cd5\u7b49\u7b49\uff09\u5177\u6709\u4e00\u5b9a\u7684\u6a21\u677f\u4f5c\u7528\uff0c\u8fd9\u6837\u5373\u4f7f\u662f\u5404\u4e2a\u5e94\u7528\u5e93\u90fd\u72ec\u7acb\u7ef4\u62a4\uff0c\u6240\u6709\u7684\u7f16\u7801\u98ce\u683c\u90fd\u662f\u8d8b\u4e8e\u76f8\u540c\u7684\uff0c\u56e0\u4e3a\u5927\u5bb6\u90fd\u5e94\u8be5\u53c2\u7167\u516c\u5171\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u5199\u6cd5\u6765\u5199\u81ea\u5df1\u5e94\u7528\u5e93\u91cc\u9762\u7684\u4e00\u4e9b\u65b9\u6cd5\u7c7b\uff0c\u8fd9\u6837\u4f7f\u5f97\u4ece\u516c\u53f8\u7684\u89d2\u5ea6\u53bb\u770b\u6240\u6709\u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u90fd\u662f\u7edf\u4e00\u7684\u3002
\u5f53\u7136\uff0c\u5982\u679c\u4f60\u7684\u5e94\u7528\u672c\u8eab\u662f\u5c5e\u4e8e\u6839\u672c\u5c31\u4e0d\u9700\u8981\u548c\u5176\u4ed6\u5e94\u7528\u4ea4\u4e92\u7684\uff0c\u90a3\u4e48\u4f60\u53ef\u80fd\u4e0d\u4f1a\u7528\u5230\u8fd9\u91cc\u9762\u7684\u529f\u80fd\uff0c\u6ca1\u5173\u7cfb\uff0c\u4f60\u6240\u6709\u7684\u65b9\u6cd5\u90fd\u53ef\u4ee5\u76f4\u63a5\u5199\u5728\u5e94\u7528\u5e93\u7684\u4e1a\u52a1\u5c42\u3002
conftest.py
conftest.py \u4ece\u529f\u80fd\u4e0a\u5c06\u662f\u5c5e\u4e8e\u6838\u5fc3\u5e93\uff08src\uff09\u7684\u5185\u5bb9\uff0c\u4f46\u662f\u7531\u4e8e\u5b83\u7684\u7279\u6b8a\u6027\uff0c\u5373\u5b83\u662f\u5bf9\u5e94\u7528\u5e93\u4e2d\u7684\u7528\u4f8b\u751f\u6548\u7684\uff0c\u800c\u4e14\u5b83\u7684\u4f5c\u7528\u57df\u662f\u5f53\u524d\u76ee\u5f55\u53ca\u4ee5\u4e0b\uff0c\u56e0\u6b64\u6211\u4eec\u5c06\u5b83\u653e\u5230\u9879\u76ee\u6839\u76ee\u5f55\u3002\u6211\u4eec\u6846\u67b6\u4e2d\u6709\u4e0d\u5c11\u6838\u5fc3\u529f\u80fd\u90fd\u662f\u5728\u8fd9\u91cc\u9762\u8fdb\u884c\u5f00\u53d1\u7684\uff0c\u540e\u9762\u7b2c\u56db\u7ae0\u4f1a\u8bb2\u5230\u7ec6\u8282\u3002
pytest.ini \u4f5c\u7528\u548c conftest.py \u7c7b\u4f3c\uff0c\u662f Pytest \u6846\u67b6\u7684\u56fa\u5b9a\u914d\u7f6e\u6587\u4ef6\uff0c\u76ee\u524d\u914d\u7f6e\u4e86\u4e00\u4e9b\u901a\u7528\u7684\u547d\u4ee4\u884c\u6267\u884c\u53c2\u6570\uff0c\u4e5f\u653e\u5728\u9879\u76ee\u6839\u76ee\u5f55\u3002
pytest.ini
Pytest
\u6839\u76ee\u5f55\u4e0b\u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 Hook \u51fd\u6570\uff0capps \u76ee\u5f55\u4e0b\u7684 \u7684 conftest.py \u6587\u4ef6\u53ea\u4f1a\u7528\u6765\u5199 fixture \u3002
Hook
fixture
\u5168\u5c40\u914d\u7f6e\u6a21\u5757\uff0c\u5305\u542b\u4e86\u4ee5\u4e0b\u914d\u7f6e\u6587\u4ef6\uff1a
\uff081\uff09ini \u914d\u7f6e\u6587\u4ef6
ini
\u4e3b\u8981\u914d\u7f6e\u4e00\u4e9b\u5168\u5c40\u7684\u914d\u7f6e\u9879\uff0c\u8b6c\u5982\uff1a\u5931\u8d25\u91cd\u8dd1\u6b21\u6570\u3001\u662f\u5426\u5931\u8d25\u5f55\u5c4f\u3001\u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\u3001\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4\u3001\u6267\u884c\u65f6\u65e5\u5fd7\u7ea7\u522b\u3001\u751f\u6210\u7684\u62a5\u544a\u7c7b\u578b\u3001\u4ee5\u53ca\u5206\u5e03\u5f0f\u6267\u884c\u7684\u4e00\u4e9b\u7b56\u7565\u914d\u7f6e\u9879\u7b49\u7b49\u3002
\uff082\uff09config.py \u914d\u7f6e\u6587\u4ef6
config.py
\u4e3b\u8981\u63d0\u4f9b\u914d\u7f6e\u6587\u4ef6\u8bfb\u53d6\u3001\u52a8\u6001\u83b7\u53d6\u4e00\u4e9b\u5e38\u91cf\uff08\u5982\u9879\u76ee\u6839\u76ee\u5f55\u7edd\u5bf9\u8def\u5f84 (BASE_DIR)\u3001\u7cfb\u7edf\u67b6\u6784\uff08SYS_FRAME\uff09\u3001\u65f6\u95f4\u5b57\u7b26\u4e32\uff08strftime\uff09\u3001\u672c\u673a USERNAME IP \u7b49\u7b49\uff09\u3001\u516c\u5171 URL \u7b49\u3002
(BASE_DIR)
SYS_FRAME
strftime
USERNAME
IP
\u57fa\u7840\u6846\u67b6\u4f1a\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u8fdb\u884c\u7248\u672c\u53d1\u5e03\uff0c\u4e0d\u4e0e\u67d0\u4e2a\u5e94\u7528\u7248\u672c\u7ed1\u5b9a\uff0c\u4f46\u662f\uff0c\u5e94\u7528\u5e93\u4f1a\u4f9d\u8d56\u4e8e\u57fa\u7840\u6846\u67b6\u7684\u7248\u672c\u3002\u56e0\u6b64\uff0c\u6211\u4eec\u5efa\u8bae\u5728\u5e94\u7528\u5e93\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a\u6587\u672c\u6587\u4ef6\u7528\u4e8e\u8bb0\u5f55\u6240\u4f9d\u8d56\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\uff0c\u7c7b\u4f3c\u4e8e\u5f00\u53d1\u5e94\u7528\u7684 debian/control \u6587\u4ef6\u7684\u529f\u80fd\uff0c\u4e3a\u4e86\u4fdd\u6301\u7edf\u4e00\uff0c\u8fd9\u4e2a\u6587\u4ef6\u5c31\u547d\u540d\u4e3a control\uff0c\u653e\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u3002
debian/control
control
\u6838\u5fc3\u5e93\u4e0d\u5efa\u8bae\u9488\u5bf9\u67d0\u4e00\u4e2a\u5e94\u7528\u5355\u72ec\u505a\u4ee3\u7801\u4e0a\u7279\u6b8a\u5904\u7406\uff0c\u901a\u5e38\u8003\u8651\u9488\u5bf9\u67d0\u4e00\u79cd\u573a\u666f\u8fdb\u884c\u5904\u7406\uff0c\u8fd9\u4e9b\u573a\u666f\u901a\u5e38\u662f\u5b58\u5728\u4e00\u4e9b\u5171\u6027\u7684\u3002\u6bd4\u5982\u8bf4\uff1a\u684c\u9762\u7684ID\u5206\u914d\u5b58\u5728\u95ee\u9898\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u903b\u8f91\u5904\u7406\u89e3\u51b3ID\u5206\u914d\u9519\u8bef\u7684\u95ee\u9898\uff0c\u4f46\u662f\u8fd9\u90e8\u5206\u903b\u8f91\u6211\u4eec\u4f1a\u5728\u684c\u9762\u7684\u65b9\u6cd5\u5c42\u91cc\u9762\u53bb\u505a\u3002
\u4e3a\u4e86\u4fdd\u6301\u517c\u5bb9\u6027\uff0c\u516c\u5171\u65b9\u6cd5\u5e93\u91cc\u9762\u539f\u5219\u4e0a\u4e0d\u5bf9\u8001\u65b9\u6cd5\u8fdb\u884c\u4fee\u6539\u6216\u5220\u9664\uff0c\u53ea\u8fdb\u884c\u65b0\u589e\u3002\u6d89\u53ca\u5230\u8001\u65b9\u6cd5\u4fee\u6539\u6216\u5220\u9664\u7684\uff0c\u4f1a\u8fdb\u884c\u63d0\u524d\u9884\u544a\uff0c\u5e76\u5728\u7b2c\u4e8c\u4e2a\u7248\u672c\u4e4b\u540e\uff08\u4e2d\u95f4\u4f1a\u9694\u4e00\u4e2a\u7248\u672c\u8fc7\u5ea6\uff09\u6b63\u5f0f\u5b9e\u65bd\u4fee\u6539\u6216\u5220\u9664\u3002
\u6bcf\u4e2a\u5e94\u7528\u81ea\u5df1\u7ef4\u62a4\u4e00\u5957 ID\uff0c\u5728PMS\u4e0a\u7528\u4f8b\u6807\u9898\u4e0a\u5c06\u81ea\u52a8\u5316ID\u4ee5\u6807\u7b7e\u7684\u5f62\u5f0f\u5199\u5165\uff0c\u6bd4\u5982\uff1a[101]\u6253\u5f00-\u542f\u52a8\u5e94\u7528\u540edock\u53f3\u952e\u83dc\u5355
\u4e00\u4e2a\u7528\u4f8b\u7c7b\u91cc\u9762\u6709\u591a\u4e2a\u7528\u4f8b\u65f6\uff0c\u5728\u7528\u4f8b\u540d\u79f0\u540e\u9762\u52a0\u5e8f\u53f7\u3002
class TestFileManager(BaseCase):\n\"\"\"\u6587\u7ba1\u7528\u4f8b\"\"\"\ndef test_xxx_015_1(self):\npass\ndef test_xxx_015_2(self):\npass\n
\u6ce8\u610f 015_1\uff0c\u4e0d\u8981\u5199015_01\u3002
\u4e0d\u5efa\u8bae\u4f7f\u7528 PMS \u4e0a\u7684\u7528\u4f8bID\uff1a
PMS \u4e0a\u662f6\u4f4d\u6570\uff0c\u4e0d\u591f\u76f4\u89c2\uff0c\u4e5f\u4e0d\u597d\u7ef4\u62a4\uff0c\u5728\u81ea\u52a8\u5316\u4e0b\u9762\u53bb\u627e\u4e00\u4e2a\u5e26\u6709 6 \u4f4d\u6570\u7684\u6587\u4ef6\u662f\u4e00\u4e2a\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002
PMS \u4e0a\u7684 ID \u53ef\u80fd\u4f1a\u53d1\u751f\u53d8\u5316\uff0c\u6bd4\u5982\u5bfc\u51fa\u6765\u5bfc\u8fdb\u53bb\u7684\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u5b58\u5728\u95ee\u9898\uff0c\u5982\u679c\u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u8981\u60f3\u627e\u51fa\u6765\u5bf9\u5e94\u4fee\u6539\u81ea\u52a8\u5316\u7528\u4f8b ID\uff0c\u5c06\u4f1a\u662f\u4ef6\u975e\u5e38\u75db\u82e6\u7684\u4e8b\u60c5\u3002
\u51fd\u6570\u547d\u540d\u5173\u952e\u8bcd\u5217\u8868
\u5173\u952e\u8bcd\u6301\u7eed\u589e\u52a0
APP_NAME
DESC
HELP
dfm_widget.py
title_widget.py
right_view_widget.py
left_view_widget.py
pop_widget.py
base_widget.py
dfm_assert.py
\u65ad\u8a00\u8bed\u53e5\u547d\u540d\u89c4\u8303
\u65ad\u8a00\u8bed\u53e5\u90fd\u662f\u4ee5 assert \u5f00\u5934
\u7531\u4e8e Pytest \u6846\u67b6\u4e2d\u652f\u6301 fixture \u7684\u5199\u6cd5\u548c Xunit \u5199\u6cd5\u7684\uff0c\u6240\u4ee5\u5e94\u7528\u5e93\u4e2d\u53ef\u80fd\u5b58\u5728\u6df7\u7528\u7684\u60c5\u51b5\uff0c\u4e3a\u7edf\u4e00\u7f16\u7801\u98ce\u683c\u65b9\u4fbf\u540e\u7eed\u7528\u4f8b\u4ee3\u7801\u7ef4\u62a4\uff0c\u73b0\u505a\u4ee5\u4e0b\u89c4\u8303\u8bf4\u660e\uff1a
Xunit
autouse=True
@pytest.mark.usefixture()
if \u6ca1\u6709\u7528\u5230\u5b9e\u4f8b\u5bf9\u8c61\uff1a\nif \u6ca1\u6709\u7528\u5230\u7c7b\u5bf9\u8c61\uff1a\n\u5199\u9759\u6001\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @staticmethod\nelse\uff1a\n\u5199\u7c7b\u65b9\u6cd5\uff0c\u51fd\u6570\u524d\u52a0 @classmethod\nelse:\n\u76f4\u63a5\u5199\u5b9e\u4f8b\u65b9\u6cd5\n
\u4e3e\u4f8b:
class TitleWidget:\ndef click_xxx_by_ui(self):\npass\n@staticmethod\ndef click_xxx_by_ui():\npass\n@classmethod\ndef click_xxx_by_ui(cls):\npass\n
\u51fd\u6570\u540d\u79f0\u4e0d\u51fa\u73b0\u6570\u5b57\uff0c\u9700\u8981\u8868\u793a\u6570\u91cf\u7684\u7528\u5355\u8bcd\u8868\u793a\u3002
\u51fd\u6570\u529f\u80fd\u6ce8\u91ca\u3002
\u6ca1\u6709\u53c2\u6570\uff0c\u6ca1\u6709\u8fd4\u56de
\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n
\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg2:xxx\n\"\"\"\n
\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\narg1:xxx\narg1:xxx\nreturn: xxx\n\"\"\"\n
\u200b \u7528 Pycharm \u7684\u6ce8\u91ca\u6a21\u677f\u4e5f\u53ef\u4ee5\uff0c\u53ea\u8981\u4f53\u73b0\u4e86\u53c2\u6570\u7684\u7c7b\u578b\u548c\u8fd4\u56de\u5c31\u884c\u4e86\u3002
Pycharm
\u4ee5\u7c7b\u7684\u5f62\u5f0f\u5199\u7528\u4f8b\uff0c\u7528\u4f8b\u7c7b\u96c6\u6210\u7528\u4f8b\u57fa\u7c7b\u3002
\u7528\u4f8b\u7c7b\u9700\u8981\u5199\u6ce8\u91ca\u3002
\u6d4b\u8bd5\u7528\u4f8b\u51fd\u6570\u8bf4\u660e\uff08\u5efa\u8bae\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u540d\u79f0\uff09
\"\"\"\u53f3\u4fa7\u9884\u89c8-\u56fe\u7247\u7c7b\u578b\u4fe1\u606f\u680f\u57fa\u672c\u4fe1\u606f\"\"\"\n
if __name__ == '__main__':\npytest.main()\n
\u6240\u6709\u7528\u4f8b\u90fd\u7ee7\u627f BaseCase\u3002
BaseCase
BaseCase \u91cc\u9762\u653e\u4e00\u4e9b\u6d4b\u8bd5\u6570\u636e\u7684\u5e38\u91cf\uff0c\u6bd4\u5982\u6587\u4ef6\u540d\u79f0\uff0c\u5e94\u7528\u540d\u79f0\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u4e00\u4e9b\u901a\u7528\u7684\u5b57\u7b26\u4e32\u3002
\u8fd9\u7c7b\u662f\u5c5e\u4e8e\u6d4b\u8bd5\u6570\u636e\u3002
class BaseCase(DfmAssert):\n\"\"\"\u7528\u4f8b\u57fa\u7c7b\"\"\"\nNEW_FILE = \"\u65b0\u5efa\u6587\u672c.txt\"\nTEST_FILE = \"test.txt\"\nNEW_DIR = \"\u65b0\u5efa\u6587\u4ef6\u5939\"\nNEW_WORD = \"\u65b0\u5efaWord\u6587\u6863.doc\"\nAPP_HELP = \"damn\"\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\n\"\"\"\u7528\u4f8b\u6807\u9898\uff08\u590d\u5236PMS\u4e0a\u7528\u4f8b\u6807\u9898\uff09\"\"\"\ndfm = DfmWidget()\ndfm.click_xxx_by_attr(self.NEW_FILE)\ndfm.new_file_in_desktop_by_cmd(self.NEW_FILE)\nself.assert_true(dfm.get_process_status(self.APP_NAME))\n
\u7528\u4f8b\u91cc\u9762\u5c3d\u91cf\u51cf\u5c11\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\uff0c\u66f4\u8981\u51cf\u5c11\u76f8\u540c\u5b57\u7b26\u4e32\u7684\u51fa\u73b0\u3002
#!/usr/bin/env python3\n# _*_ coding:utf-8 _*_\n\"\"\"\n:Author:email@uniontech.com\n:Date :${DATE} ${TIME}\n\"\"\"\n
sleep()
sleep
INFO
~/Desktop/
os.path.expanduser()
Config.BASE_PATH
# =================================================\n# Author : Mikigo\n# Time : 2022/3/16\n# version \uff1a1.0\n# =================================================\n
AT \u5e94\u7528\u5e93\u6539\u9020\u662f\u57fa\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\u8fdb\u884c\u7528\u4f8b\u65b9\u6cd5\u548c\u4e1a\u52a1\u903b\u8f91\u7684\u91cd\u65b0\u8bbe\u8ba1\uff0c\u4ee5\u5b9e\u73b0\u5e94\u7528\u5e93\u9ad8\u6548\u7684\u7f16\u5199\u3001\u7ef4\u62a4\u7528\u4f8b\u53ca\u5176\u65b9\u6cd5\u3002
\u6587\u4ef6\u7ba1\u7406\u5668\u4ece\u4e1a\u52a1\u590d\u6742\u5ea6\u548c\u7528\u4f8b\u91cf\u6765\u8bb2\uff0c\u5728\u7cfb\u7edf\u6240\u6709\u5e94\u7528\u4e2d\uff0c\u662f\u5f88\u6709\u4ee3\u8868\u6027\u7684\uff0c\u96be\u5ea6\u4e5f\u662f\u6700\u5927\u7684\uff0c\u56e0\u6b64\u6211\u4eec\u9009\u53d6\u6587\u4ef6\u7ba1\u7406\u5668\u4f5c\u4e3a\u5e94\u7528\u5e93\u6539\u9020\u7684\u5b9e\u9a8c\u5e94\u7528\uff0c\u7ed9\u540e\u7eed\u5176\u4ed6\u5e94\u7528\u6539\u9020\u63d0\u4f9b\u5207\u5b9e\u53ef\u884c\u7684\u601d\u8def\u548c\u65b9\u6848\u3002
\u6574\u4f53\u4ecd\u7136\u9075\u5faa PO \u8bbe\u8ba1\u7406\u5ff5\uff0c\u6839\u636e\u4e1a\u52a1\u9700\u8981\uff0c\u5c06\u6587\u7ba1\u4e1a\u52a1\u5c42\u8fdb\u884c 3 \u5c42\u5212\u5206\uff1a
autotest-dde-file-manager # \u5e94\u7528\u4ed3\u5e93\n\u251c\u2500\u2500 case # \u7528\u4f8b\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 assert_res # \u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 test_xxx_001.py\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 widget # \u65b9\u6cd5\n\u2502 \u00a0\u251c\u2500\u2500 __init__.py\n\u2502 \u00a0\u251c\u2500\u2500 case_res # \u6d4b\u8bd5\u6570\u636e\uff08\u7528\u4f8b\u9700\u8981\u7528\u5230\u7684\u8d44\u6e90\uff09\n\u2502 \u00a0\u251c\u2500\u2500 pic_res # \u56fe\u50cf\u8bc6\u522b\u5143\u7d20\u5b9a\u4f4d\u8981\u7528\u7684\u56fe\u7247\n\u2502 \u00a0\u251c\u2500\u2500 base_widget.py # \u65b9\u6cd5\u57fa\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 title_widget.py # title \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 right_view_widget.py # right view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 left_view_widget.py # left view \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 pop_widget.py # pop \u6a21\u5757\u65b9\u6cd5\u7c7b\n\u2502 \u00a0\u251c\u2500\u2500 dfm_widget.py # \u65b9\u6cd5\u7684\u7edf\u4e00\u51fa\u53e3\n\u2502 \u00a0\u2514\u2500\u2500 ui.ini # UI \u5b9a\u4f4d\u7684\u5750\u6807\u914d\u7f6e\u6587\u4ef6\n\u251c\u2500\u2500 tag # \u7528\u4f8b\u6807\u7b7e\u76ee\u5f55\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 xxx.csv # \u7528\u4f8b\u6807\u7b7e\u6587\u4ef6\n\u2502\u00a0\u00a0 ...\n\u251c\u2500\u2500 config.ini # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 config.py # \u5c40\u90e8\u914d\u7f6e\n\u251c\u2500\u2500 conftest.py # Pytest \u672c\u5730\u63d2\u4ef6\n\u2514\u2500\u2500 dfm_assert.py # \u65ad\u8a00\u65b9\u6cd5\u6a21\u5757\n
\u65b9\u6cd5\u57fa\u7c7b\u7684\u5199\u6cd5\uff1a
from src import Src\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n
\u6309\u7167\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget
TitleWidget
RightViewWidget
LeftViewWidget
PopWidget
\u6587\u7ba1\u4e3b\u754c\u9762\u5206\u4e3a\u4e09\u4e2a\u533a\u57df\uff1a\u6807\u9898\u680f\u3001\u53f3\u8fb9\u89c6\u56fe\u533a\u57df\u3001\u5de6\u8fb9\u89c6\u56fe\u533a\u57df
\u5f39\u7a97\uff1a\u8bbe\u7f6e\u754c\u9762\u5f39\u7a97\u3001\u4fdd\u9669\u7bb1\u5f39\u7a97\u3001\u5220\u9664\u786e\u8ba4\u5f39\u7a97\u3001\u53ca\u5404\u79cd\u7f51\u7edc\u5f39\u7a97
\u53f3\u952e\u83dc\u5355\uff1a\u6682\u65f6\u4e0d\u8003\u8651\u4e3a\u5355\u72ec\u7684\u6a21\u5757\uff0c\u8003\u8651\u4ee5\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6848\u505a\u6210\u516c\u5171\u5e93\u3002
from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n
\u6784\u9020\u51fd\u6570\u91cc\u9762\u4e0d\u6784\u9020\u5bf9\u8c61\uff0c\u53ef\u4ee5\u521d\u59cb\u5316\u4e00\u4e9b\u53d8\u91cf\u3002
\u4e0d\u540c\u7684\u5b9a\u4f4d\u65b9\u6848\u8c03\u7528\u4e0d\u540c\u7684\u5b9a\u4f4d\u5de5\u5177\u5bf9\u8c61\u3002
self.dog\nself.ui\nself.d_bus\n
\u65b9\u6cd5\u7f16\u5199
\u52a8\u4f5c\u5f00\u5934\uff0c\u6ce8\u610f\u662f\u52a8\u8bcd
click\ndouble_click\nright_click\nget\nmake\n
\u5143\u7d20\u5bf9\u8c61\u540d\u79f0
\u52a0\u4e0a\u7c7b\u7684\u5173\u952e\u8bcd
\u6807\u5b9a\u64cd\u4f5c\u65b9\u6cd5
by_ui\nby_attr\nby_mk\nby_img\n
\u7ee7\u627f\u64cd\u4f5c\u5c42\u7684\u6240\u6709\u7c7b\u3002
\u4ec5\u4ec5\u7528\u4e8e\u7528\u4f8b\u4e2d\u5bfc\u5165\u65b9\u4fbf\uff0c\u4e0d\u505a\u5176\u4ed6\u4e8b\u60c5\u3002
class DfmWidget(TitleWidget, RightViewWidget, LeftViewWidget, PopWidget):\npass\n
DfmAssert
from apps.dde_file_manager.widget.dfm_widget import DfmWidget\nfrom public.assert import Assert\nclass DfmAssert(Assert):\ndef assert_file_exists_in_desktop(self, file_name):\nself.assert_file_exists(f\"~/Desktop{file_name}\")\n...\nDfmWidget().get_file_in_desktop()\n
class BaseCase(DfmAssert):\npass\nclass TestFileManager(BaseCase):\ndef test_xxx_001(self):\nself.assert_file_exists_in_desktop(\"xxx\")\n
\u7528\u4f8b\u4ee3\u7801\u8c03\u7528\u903b\u8f91\u4e3e\u4f8b\uff1a
# BaseWidget\nclass BaseWidget(Src):\n\"\"\"\u65b9\u6cd5\u57fa\u7c7b\"\"\"\nAPP_NAME = \"dde-file-manager\"\nDESC = \"/usr/bin/dde-file-manager\"\ndef __init__(self, number=-1):\nSrc.__init__(self, APP_NAME=self.APP_NAME, DESC=self.DESC, number=number)\n# =============================================\n# TitleWidget\nclass TitleWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_title_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# RightViewWidget\nclass RightViewWidget(BaseWidget):\ndef __init__(self, nubmer=-1):\nBaseWidget.__init__(self, nubmer=nubmer)\ndef click_xxx_right_by_ui(self):\nprint(self.dog.app_name)\nself.ui.print_number()\n# =============================================\n# \u51fa\u53e3 DfmWidget\nclass DfmWidget(TitleWidget, RightViewWidget):\npass\n# =============================================\n# in case\nfrom apps.dde_file_manager.widget.dfm_widget import DfmWidget\ndfm = DfmWidget()\ndfm.click_xxx_title_by_ui()\ndfm.click_xxx_right_by_ui()\ndfm.dog.print_desc()\ndfm.ui.print_number()\n
1.1. \u5c06\u81ea\u52a8\u5316\u57fa\u7840\u6846\u67b6\u7684\u529f\u80fd\u62c9\u5230\u672c\u5730 Autotest Basic Frame \uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-basic-frame
Autotest Basic Frame
1.2. \u5c06\u5e94\u7528\u5e93\u4ee3\u7801\u62c9\u5230\u57fa\u7840\u6846\u67b6\u4e0b apps \u76ee\u5f55\u4e0b\uff0c\u5e94\u7528\u5e93\u7684\u4ed3\u5e93\u547d\u540d\u5e94\u8be5\u662f\u957f\u8fd9\u6837\u7684 autotest_deepin_xxx\u3002
autotest_deepin_xxx
\u6309\u7167 \u65b9\u6848\u8bbe\u8ba1-\u76ee\u5f55\u7ed3\u6784 \u8fdb\u884c\u76ee\u5f55\u8c03\u6574\uff0c\u5c3d\u91cf\u4f7f\u7528\u7f16\u8f91\u5668\u8fdb\u884c\u76f8\u5e94\u7684\u8c03\u6574\uff0c\u7f16\u8f91\u5668\u63a8\u8350\u4f7f\u7528 Pycharm \uff0c\u4ee5\u4e0b\u64cd\u4f5c\u5747\u5728 Pycharm \u91cc\u9762\u53ef\u5b9e\u73b0\u3002
\u65b9\u6848\u8bbe\u8ba1-\u76ee\u5f55\u7ed3\u6784
2.1. \u9700\u8981\u79fb\u52a8 py \u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u76f4\u63a5\u5728\u7f16\u8f91\u5668\u91cc\u9762\uff0c\u4f7f\u7528\u9f20\u6807\u9009\u4e2d\u5e76\u6309\u4f4f\uff0c\u4e4b\u540e\u62d6\u52a8\u5230\u76ee\u6807\u4f4d\u7f6e\u5373\u53ef\uff0cPycharm \u4f1a\u5c3d\u53ef\u80fd\u7684\u81ea\u52a8\u89e3\u51b3\u79fb\u52a8\u5bfc\u81f4\u7684\u8def\u5f84\u95ee\u9898\u3002\u6ce8\u610f\uff0c\u6211\u8bf4\u7684\u662f\u201c\u5c3d\u53ef\u80fd\u201d\uff0c\u6709\u4e9b\u9a9a\u64cd\u4f5c\u7f16\u8f91\u5668\u662f\u65e0\u6cd5\u81ea\u52a8\u5904\u7406\u7684\u3002\u5982\u679c\u6ca1\u6709\u88ab\u7f16\u8f91\u5668\u81ea\u52a8\u5904\u7406\u7684\u8def\u5f84\u95ee\u9898\uff0c\u540e\u7eed\u53ea\u80fd\u624b\u52a8\u89e3\u51b3\u3002
2.2. \u9700\u8981\u91cd\u547d\u540d\u6587\u4ef6\u6216\u76ee\u5f55\uff0c\u5728\u7f16\u8f91\u5668\u91cc\u9762\u9009\u4e2d\u6587\u4ef6\uff0c\u7136\u540e\u4f7f\u7528\u5feb\u6377\u952e Shift + F6 \uff08\u5982\u679c\u5feb\u6377\u952e\u6ca1\u53cd\u5e94\uff0c\u6587\u4ef6\u53f3\u952e\u83dc\u5355 Refactor \u2014\u2014 Rename\uff09\uff0c\u7136\u540e\u5728\u8f93\u5165\u6846\u4e2d\u8f93\u5165\u8981\u91cd\u547d\u540d\u7684\u540d\u79f0\uff0c\u540c\u65f6\uff0c\u786e\u8ba4\u52fe\u9009 Search for references \u548c Search in comments and strings \u8fd9\u4e24\u4e2a\u9009\u9879\uff0c\u6700\u540e\u6309\u56de\u8f66\u6216\u8005\u9f20\u6807\u70b9 Refactor \u3002
Shift + F6
Refactor \u2014\u2014 Rename
Search for references
Search in comments and strings
Refactor
\u6ce8\u610f\uff0c\u6b64\u65f6\u7f16\u8f91\u5668\u53ef\u80fd\u4f1a\u63d0\u793a\u4f60\uff0c\u4f60\u8fd9\u4e2a\u91cd\u547d\u540d\u7684\u64cd\u4f5c\u5173\u8054\u4e86\u591a\u4e2a\u6a21\u5757\uff0c\u5b83\u88ab\u591a\u4e2a\u5730\u65b9\u90fd\u4f7f\u7528\u5230\u4e86\uff0c\u76f8\u5173\u7684\u6a21\u5757\u662f\u5426\u4e5f\u4e00\u8d77\u6539\u540d\u4e86\uff0c\u8fd9\u4e0d\u5e9f\u8bdd\u5417\uff0c\u7528\u8fd9\u4e2a\u529f\u80fd\u5c31\u662f\u60f3\u628a\u5173\u8054\u5230\u7684\u90fd\u4fee\u6539\uff0c\u4e0d\u7136\u6211\u4e3a\u4ec0\u4e48\u4e0d\u7528\u6587\u7ba1\u7684\u91cd\u547d\u540d\u529f\u80fd\u5462\uff0c\u522b\u60f3\u4e86\uff0c\u76f4\u63a5\u70b9\u5de6\u4e0b\u89d2\u7684 Refactor \u6309\u94ae\uff0c\u5c31\u662f\u5e72\u3002
\u7c7b\u540d\u3001\u51fd\u6570\u540d\u7684\u91cd\u547d\u540d\u90fd\u5c3d\u91cf\u91c7\u7528\u8fd9\u79cd\u65b9\u6848\uff0c\u56e0\u4e3a\u7f16\u8f91\u5668\u4f1a\u81ea\u52a8\u7ed9\u6211\u4eec\u627e\u5230\u5173\u8054\u7684\u5730\u65b9\uff0c\u7136\u540e\u540c\u6b65\u4fee\u6539\u6389\u3002\u4f60\u53ef\u5343\u4e07\u522b\u76f4\u63a5\u5220\u4e86\u4fee\u6539\u540d\u79f0\uff0c\u4e0d\u7136\u4f60\u53ef\u80fd\u4f1a\u82b1\u4e0a\u4e00\u5929\u7684\u65f6\u95f4\u6765\u89e3\u51b3\u91cd\u547d\u540d\u7684\u95ee\u9898\u3002
3.1. BaseWidget
BaseWidget
\u5728 BaseWidget \u91cc\u9762\u628a\u8be5\u5199\u7684\u90fd\u5199\u597d\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u4e0a\u9762\u7684\u8bbe\u8ba1\u7406\u5ff5\u6765\u5199\u3002
\u5982\u679c\u4f60\u5acc\u9ebb\u70e6\uff0c\u4f60\u53ef\u4ee5\u53c2\u8003\u6587\u7ba1\u7684\u5b9e\u9645\u5de5\u7a0b\u4ee3\u7801 autotest_dde_file_manager : https://gerrit.uniontech.com/admin/repos/autotest_dde_file_manager \u3002
autotest_dde_file_manager
3.2. \u64cd\u4f5c\u5c42
\u5982\u679c\u4f60\u662f\u65b0\u5199\u9879\u76ee\uff0c\u4f60\u4f1a\u53d1\u73b0\u4e00\u5207\u90fd\u662f\u90a3\u4e48\u7684\u7b80\u5355\u3001\u76f4\u63a5\uff0c\u6309\u7167\u6211\u4eec\u63d0\u4f9b\u7ed9\u4f60\u7684\u63a5\u53e3\u5199\u7528\u4f8b\u7684\u64cd\u4f5c\u65b9\u6cd5\u5c31\u597d\u4e86\u3002
\u5982\u679c\u4f60\u662f\u60f3\u5bf9\u539f\u6765\u7684\u5de5\u7a0b\u8fdb\u884c\u6539\u9020\uff0c\u4f60\u9700\u8981\u6309\u7167\u6838\u5fc3\u5e93\u65b9\u6cd5\u7684\u8c03\u7528\uff0c\u5c06\u4f60\u4e4b\u524d\u5199\u7684\u6bcf\u4e2a\u65b9\u6848\u8fdb\u884c\u5bf9\u5e94\u7684\u4fee\u6539\uff0c\u5305\u62ec\u7c7b\u548c\u65b9\u6cd5\u7684\u547d\u540d\u3001\u65b9\u6cd5\u5185\u6240\u8981\u7528\u5230\u4e0d\u540c\u5b9a\u4f4d\u65b9\u6cd5\u7684\u5199\u6cd5\u4fee\u6539\u3002
\u8fd9\u65f6\u5019\u4f60\u53ef\u80fd\u4f60\u7684\u4ee3\u7801\u4e2d\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u62a5\u9519\uff0c\u4e0d\u7528\u62c5\u5fc3\uff0c\u4f60\u53ef\u4ee5\u4ece\u4e1a\u52a1\u903b\u8f91\u51fa\u53d1\uff0c\u60f3\u6e05\u695a\u8fd9\u4e2a\u65b9\u6cd5\u662f\u5e72\u4ec0\u4e48\u7684\u3001\u64cd\u4f5c\u7684\u5bf9\u8c61\u662f\u4ec0\u4e48\u3001\u53c2\u6570\u662f\u4ec0\u4e48\uff0c\u6ce8\u610f\u8fd9\u4e9b\u4fee\u6539\u662f\u4f1a\u5f71\u54cd\u5230\u7528\u4f8b\u4ee3\u7801\u91cc\u9762\u7684\uff0c\u6ca1\u5173\u7cfb\uff0c\u7528\u4f8b\u91cc\u9762\u672c\u6765\u4e5f\u5e94\u8be5\u88ab\u5173\u8054\u4fee\u6539\u3002
3.3. \u628a\u914d\u7f6e\u6a21\u5757\u5199\u597d\uff0c\u8fd9\u90e8\u5206\u57fa\u672c\u53ef\u4ee5\u590d\u5236\u6587\u7ba1\u7684\u4ee3\u7801\u3002
4.1. \u5bfc\u5165\u8def\u5f84
\u65b9\u6cd5\u548c\u7528\u4f8b\u4e2d\u90fd\u4f1a\u6d89\u53ca\u5230\u5bfc\u5165\u8def\u5f84\u7684\u4fee\u6539\uff0c\u5728\u4fee\u6539\u8def\u5f84\u65f6\uff0c\u5efa\u8bae\u4f60\u4f7f\u7528 Ctrl + Shift + R \u5168\u5c40\u66ff\u6362\uff0c\u4f1a\u5c06\u6574\u4e2a\u9879\u76ee\u4e0b\u7684\u76f8\u540c\u5730\u65b9\u90fd\u4fee\u6539\u5230\uff0c\u5f53\u7136\uff0c\u4f60\u4e5f\u53ef\u4ee5\u5728\u5c0f\u5f39\u7a97\u4e2d\u4fee\u6539\u5168\u5c40\u66ff\u6362\u4e3a\u5c40\u90e8\u76ee\u5f55\u4e0b\u66ff\u6362\u3002\u5904\u7406\u90a3\u79cd\u6ca1\u6709\u5173\u8054\u5173\u7cfb\uff0c\u4f46\u662f\u53c8\u662f\u76f8\u540c\u540d\u79f0\u7684\u91cd\u547d\u540d\uff0c\u6211\u4e5f\u63a8\u8350\u4f7f\u7528\u8fd9\u79cd\u65b9\u5f0f\u8fdb\u884c\u91cd\u547d\u540d\u3002
Ctrl + Shift + R
\u6ce8\u610f\uff0c\u5168\u5c40\u66ff\u6362\u7684\u65b9\u5f0f\u4efb\u7136\u65e0\u6cd5\u4fdd\u8bc1\u771f\u7684\u5168\u5c40\u88ab\u66ff\u6362\u4e86\uff08\u53ef\u80fd\u662f\u7f16\u8f91\u5668\u7684 Bug \u5427\uff09\uff0c\u6240\u4ee5\u4f60\u4ecd\u7136\u9700\u8981\u624b\u52a8\u770b\u4e0b\u5404\u5904\u662f\u5426\u4fee\u6539\u5230\u4f4d\u3002
4.2. \u8d44\u6e90\u8def\u5f84
\u4e00\u4e9b\u7528\u4f8b\u8d44\u6e90\u9700\u8981\u6839\u636e config.py \u91cc\u9762\u7684\u8def\u5f84\u914d\u7f6e\u8fdb\u884c\u8d44\u6e90\u8def\u5f84\u7684\u62fc\u63a5\uff0c\u5982\u679c\u4f60\u539f\u6765\u672c\u6765\u5c31\u6709\u4e00\u4e2a\u51fd\u6570\u4e13\u95e8\u7528\u4e8e\u7ec4\u88c5\u8def\u5f84\u7684\uff0c\u90a3\u4f60\u53ea\u9700\u8981\u4fee\u6539\u8fd9\u4e00\u4e2a\u5730\u65b9\u5c31\u597d\u4e86\uff0c\u5982\u679c\u4f60\u4e4b\u524d\u5e76\u6ca1\u6709\u8fd9\u6837\u7684\u8bbe\u8ba1\uff0c\u90a3\u53ef\u80fd\u9700\u8981\u4fee\u6539\u5927\u91cf\u6d89\u53ca\u5230\u8d44\u6e90\u8def\u5f84\u7684\u5730\u65b9\u3002
\u4ee5\u4e0a\u51e0\u4e2a\u6b65\u9aa4\u505a\u5b8c\uff0c\u57fa\u672c\u5c31\u53ef\u4ee5\u8fdb\u884c\u7528\u4f8b\u4ee3\u7801\u7684\u8c03\u8bd5\u4e86\uff0c\u8fd9\u90e8\u5206\u5de5\u4f5c\u4e3b\u8981\u89e3\u51b3\u4f60\u4e4b\u524d\u51e0\u4e2a\u6b65\u9aa4\u9057\u6f0f\u7684\u95ee\u9898\uff0c\u5982\u679c\u6240\u6709\u7528\u4f8b\u90fd\u8c03\u8bd5\u901a\u8fc7\u4e86\uff0c\u90a3\u4e48\u5de5\u7a0b\u6539\u9020\u5c31\u5168\u90e8\u5b8c\u6210\u4e86\u3002
# ================================================\n# Attribution : Chengdu Testing Department\n# Time : 2022/6/16\n# Author : Mikigo\n# ================================================\n
AT \u5f00\u53d1\u89c4\u8303\u662f\u6839\u636e\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fd0\u884c\u4e24\u5e74\u591a\u6765\uff0c\u9047\u5230\u95ee\u9898\u89e3\u51b3\u95ee\u9898\u800c\u5f62\u6210\u7684\u4e00\u4e9b\u89e3\u51b3\u65b9\u6848\uff0c\u6216\u8005\u8bf4\u7ecf\u9a8c\u603b\u7ed3\uff1b\u8fd9\u4e9b\u7ecf\u9a8c\u7b26\u5408\u6211\u4eec\u73b0\u9636\u6bb5 AT \u6240\u5e94\u7528\u7684\u573a\u666f\u9700\u8981\uff0c\u4e5f\u662f\u6211\u4eec\u7ecf\u8fc7\u957f\u671f\u601d\u8003\uff0c\u4e0d\u65ad\u8bd5\u9519\u4e0d\u65ad\u4fee\u6b63\uff0c\u5e76\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u5b9e\u8df5\u4e2d\u68c0\u9a8c\u8fc7\u53ef\u884c\u7684\u3002\u4ee5\u6b64\uff0c\u5e0c\u671b\u80fd\u5e2e\u52a9\u53c2\u4e0e\u5230\u81ea\u52a8\u5316\u7684\u76f8\u5173\u4eba\u5458\u51cf\u5c11\u8bd5\u9519\u6210\u672c\uff0c\u66f4\u597d\u3001\u66f4\u5feb\u7684\u7f16\u5199\u7528\u4f8b\u53ca\u7ef4\u62a4\u7528\u4f8b\u3002
\u6807\u7b7e\u5316\u7ba1\u7406\u6587\u6863\u8bf7\u53c2\u8003\uff1a \u300a\u7528\u4f8b\u6807\u7b7e\u5316\u7ba1\u7406\u64cd\u4f5c\u6307\u5f15\u300b
\u4ee5\u4e0b\u8bf4\u51e0\u4e2a\u5bb9\u6613\u51fa\u73b0\u7684\u95ee\u9898\uff1a
ERROR
CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94\u7684 ID
\u5728\u6700\u7ec8\u63d0\u4ea4\u4ee3\u7801\u4e4b\u524d\uff0c\u4f60\u9700\u8981\u5728 CSV \u6587\u4ef6\u91cc\u9762\u5c06ID\u3001\u7528\u4f8b\u7b49\u7ea7\u7b49\u6807\u7b7e\u8865\u5168\uff0c\u5982\u679c CSV \u6587\u4ef6\u91cc\u9762\u6ca1\u6709\u5bf9\u5e94 ID\uff0c\u540e\u7eed\u5728\u6279\u91cf\u6267\u884c\u7684\u65f6\u5019\uff0c\u8fd9\u4e9b\u7528\u4f8b\u662f\u4e0d\u4f1a\u6267\u884c\u7684\u3002
\u4e3e\u4f8b\uff1a
# test_music_001.py\ndef test_music_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n
\u90a3\u4e48 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e3a music.csv\u3002
music.csv
AT \u6846\u67b6\u5e95\u5c42\u4ee3\u7801\u5b9e\u73b0\u662f\u5c06 CSV \u6587\u4ef6\u7684\u540d\u79f0\u4e0e\u7528\u4f8b\u51fd\u6570\u540d\u79f0\u540d\u79f0\uff08item.name\uff09\u8fdb\u884c\u5bf9\u5e94\uff0c\u56e0\u6b64\uff0c\u6ce8\u610f CSV \u6587\u4ef6\u540d\u79f0\u5bf9\u5e94\u7684\u662f\u7528\u4f8b\u51fd\u6570\u540d\u79f0\uff0c\u5373 def test_music_001 \u91cc\u9762\u7684 music \uff0c\u800c\u4e0d\u662f test_music_001.py \u91cc\u9762\u7684 music \u3002
item.name
def test_music_001
music
test_music_001.py
\u8fd9\u91cc\u7ec6\u7ec6\u54c1\u4e00\u4e0b\u54c8~
\u5982\u679c\u4f60\u5c06\u4e0a\u4f8b\u5199\u6210\u4e86\u8fd9\u6837:
# test_music_001.py\ndef test_movie_001():\n\"\"\"\u7528\u4f8b\u6807\u9898\"\"\"\npass\n
\u7528\u4f8b\u6267\u884c\u6ca1\u95ee\u9898\uff0c\u4f46\u662f\u6807\u7b7e\u5316\u7ba1\u7406\u662f\u4e0d\u751f\u6548\u7684\uff0c\u6846\u67b6\u65e0\u6cd5\u5c06 music.csv\u6587\u4ef6\u91cc\u9762\u6807\u7b7e\uff0c\u6dfb\u52a0\u5230 test_movie_001\u8fd9\u4e2a\u7528\u4f8b\u4e2d\uff0c\u56e0\u4e3a\u4ed6\u4eec\u6ca1\u6709\u5bf9\u5e94\u5173\u7cfb\u3002
test_movie_001
\u53c2\u8003\u300a\u81ea\u52a8\u5316\u6d4b\u8bd5\u4ee3\u7801\u7ba1\u7406\u89c4\u8303\u300b
\u5e94\u7528\u5e93 tag \u6839\u636e\u5e94\u7528\u4ea4\u4ed8\u8282\u70b9\u751f\u6210\uff0c\u6bcf\u6b21\u6253 tag \u4e4b\u524d\uff0c\u76f8\u5173\u6d4b\u8bd5\u4eba\u5458\u9700\u8981\u8fdb\u884c\u7528\u4f8b\u8c03\u8bd5\uff1b
\u8c03\u8bd5\u7528\u4f8b\u662f\u6307\u7684\u5728\u5168\u67b6\u6784\uff08x86\u3001arm\u3001mips\uff09\u4e0a\u8c03\u8bd5\u901a\u8fc7\uff1b
\u7528\u4f8b\u901a\u8fc7\u7387\u8fbe\u5230 90% \u4ee5\u4e0a\u624d\u80fd\u6253 tag\uff0c\u901a\u8fc7 Jenkins \u6267\u884c\u5668\u6267\u884c\u7528\u4f8b\uff0c\u4fdd\u7559\u901a\u8fc7\u7387\u7ed3\u679c\uff1b
\u7528\u4f8b\u901a\u8fc7\u7387\uff1a\u901a\u8fc7\u7528\u4f8b\u6570 / (\u603b\u7528\u4f8b\u6570 - \u5df2\u5e9f\u5f03\u7528\u4f8b) \u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u7b97\u901a\u8fc7
Jenkins \u6267\u884c\u5668
\u4f60\u53ef\u80fd\u4f1a\u5728\u4e00\u4e2a\u4ea4\u4ed8\u5468\u671f\u5185\u6301\u7eed\u7684\u8fdb\u884cAT\u7528\u4f8b\u8c03\u8bd5\uff0c\u4f46\u662f\u6700\u7ec8 AT \u7528\u4f8b\u6253 tag \u7684\u5e94\u7528\u7248\u672c\uff0c\u9700\u8981\u4f7f\u7528\u5e94\u7528\u96c6\u6210\u4ea4\u4ed8\u7684\u6700\u65b0\u5e94\u7528\u7248\u672c\uff0c\u53ef\u4ee5\u4f7f\u7528\u5e94\u7528\u7684\u63d0\u6d4b\u7248\u672c\uff1b\u4e00\u5b9a\u8981\u786e\u4fdd\u8c03\u8bd5\u7528\u4f8b\u7684\u5e94\u7528\u7248\u672c\u662f\u6700\u65b0\u7684\uff0c\u4e0d\u7136\u96c6\u6210\u8fdb\u53bb\u4e4b\u540e\uff0c\u6301\u7eed\u96c6\u6210\u5c31\u4f1a\u51fa\u95ee\u9898\uff1b
tag \u53f7\u600e\u4e48\u6253\uff1f
\u6839\u636e\u6301\u7eed\u96c6\u6210\u7684\u8981\u6c42\u751f\u6210\uff0c\u5176\u4e2d\u5e94\u7528\u7248\u672c\u53f7\u9700\u8981\u4e0e\u9879\u76ee\u7ecf\u7406\u786e\u8ba4\u672c\u6b21\u5373\u5c06\u96c6\u6210\u7684\u5e94\u7528\u7248\u672c\u53f7\u662f\u591a\u5c11\uff1b
tag \u7684 commit \u4fe1\u606f\u683c\u5f0f\uff1a
# commit msg\nversion:5.6.5\n
\u5176\u4e2d 5.6.5 \u5199\u5e94\u7528\u7684\u96c6\u6210\u7248\u672c\u53f7\u3002
5.6.5
\u751f\u6210 tag \u7684\u547d\u4ee4\u53c2\u8003\uff1a\u300aGit \u6807\u7b7e\u300b
\u57fa\u7840\u6846\u67b6 tag \u4e0d\u4e0e\u4e1a\u52a1\u6302\u94a9\uff0c\u6839\u636e\u81ea\u8eab\u7684\u529f\u80fd\u5f00\u53d1\u6309\u9700\u53d1\u5e03\u7248\u672c\uff0c\u5728\u6839\u76ee\u5f55\u4e0b CURRENT \u6587\u4ef6\u4e2d\u8bb0\u5f55\u7684\u5f53\u524d\u7248\u672c\u53f7\u548c\u5386\u53f2\u7248\u672c\u53f7\uff0c\u53ca\u5176\u5bf9\u5e94\u65b0\u589e\u4e86\u54ea\u4e9b\u529f\u80fd\uff0c\u6709\u52a9\u4e8e\u5e94\u7528\u9009\u62e9\u5408\u9002\u7684\u57fa\u7840\u6846\u67b6\u7248\u672c\u3002
CURRENT
# CURRENT\n[current]\ntag = 0.9.5\n
\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u7684 control \u6587\u4ef6\u8bb0\u5f55\u5f53\u524d\u5e94\u7528\u5e93\u4f9d\u8d56\u7684\u57fa\u7840\u5e93\u7248\u672c\u3002
# control\n[Depends]\nautotest-basic-frame = 0.9.5\n
\u7528\u4f8b\u5728\u6267\u884c\u65f6\u4f1a\u6821\u9a8c\u4e24\u4e2a\u6587\u4ef6\u7684\u7248\u672c\u53f7\u662f\u5426\u4e00\u81f4\uff0c\u5982\u679c\u4e0d\u4e00\u81f4\uff0c\u4f1a\u6253\u5370 error \u65e5\u5fd7\u3002
error
\u57fa\u7840\u6846\u67b6\u4e0d\u5141\u8bb8\u533f\u540d\u8bbf\u95ee\uff0c\u5982\u679c\u4f60\u767b\u5f55 gerrit \u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u8bbf\u95ee\u4ee5\u4e0a\u94fe\u63a5\uff0c\u5219\u9700\u8981\u7533\u8bf7\u8bbf\u95ee\u6743\u9650\uff1b
gerrit
\u94fe\u63a5\u540e\u9762\u7684 app_name \u4e2d\u95f4\u4ee5\u4e0b\u5212\u7ebf\u8fde\u63a5\uff0c\u6bd4\u5982\u97f3\u4e50\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest_deepin_music
app_name
\u65b9\u6cd5\u7f16\u5199\u6574\u4f53\u8bbe\u8ba1\u601d\u8def\u53c2\u8003\uff1a[\u300aAT\u5e94\u7528\u5e93\u8bbe\u8ba1\u65b9\u6848\u300b]
\u5199\u65b9\u6cd5\u7684\u65f6\u5019\u6ce8\u610f\u65b9\u6cd5\u5f52\u5c5e\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\u7684\u754c\u9762\u533a\u57df\u5212\u5206\u4e3a\uff1aTitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget\uff0c\u65b9\u6cd5\u662f\u5728\u54ea\u4e2a\u533a\u57df\u64cd\u4f5c\u7684\uff0c\u5c31\u5199\u5728\u54ea\u4e2a\u7c7b\u91cc\u9762\u3002
from apps.dde_file_manager.widget import BaseWidget # dde_file_manager \u4e3a\u4ed3\u5e93\u540d\u79f0\nclass TitleWidget(BaseWidget):\n\"\"\"\u6807\u9898\u680f\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_in_title_by_ui(self):\n\"\"\"\u70b9\u51fb\u6807\u9898\u680fxxx\"\"\"\n# self.dog.find_element_by_attr(\"xxxx\").click()\nself.click(*self.ui.btn_center(\"xxx\"))\n
\u754c\u9762\u5143\u7d20\u76f4\u63a5\u4e0e\u5143\u7d20\u540d\u79f0\u76f8\u540c\uff0c\u6ca1\u6709\u540d\u79f0\u7684\u5c31\u53d6\u4e00\u4e2a\u597d\u542c\u6613\u61c2\u7684\u540d\u5b57\u3002
\u907f\u514d\u65b9\u6cd5\u91cd\u540d\uff0c\u540c\u65f6\u53ef\u4ee5\u6807\u8bb0\u533a\u57df\u3002
\u4e0d\u8981\u5728\u7528\u4f8b\u4e2d\u5355\u72ec\u53bb\u8c03\u7528 TitleWidget \u3001RightViewWidget\u3001LeftViewWidget \u3001PopWidget \u8fd9\u4e9b\u7c7b\uff0c\u5426\u5219\u540e\u671f\u7528\u4f8b\u4f1a\u53d8\u5f97\u4e0d\u597d\u7ef4\u62a4\uff1b
\u6240\u6709\u7528\u4f8b\u90fd\u5e94\u8be5\u57fa\u4e8e\u7c7b\u53bb\u5199\uff1a
class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001(self):\n\"\"\"\u97f3\u4e50\u542f\u52a8\"\"\"\n
\u6ce8\u610f\u4ee5\u4e0b\u51e0\u70b9\uff1a
\u7c7b\u540d\u4e0d\u8981\u968f\u4fbf\u53d6\uff0c\u540c\u4e00\u4e2a\u5e94\u7528\u5e94\u8be5\u4f7f\u7528\u540c\u4e00\u4e2a\u7c7b\u540d\uff0c\u7528\u4f8b\u7c7b\u540d\u79f0\u5fc5\u987b\u4ee5 Test \u5f00\u5934\uff0c\u9075\u5faa\u5927\u9a7c\u5cf0\u547d\u540d\u89c4\u8303\uff1b
\u7528\u4f8b\u7c7b\u7ee7\u627f BaseCase\uff0c\u4e00\u4e2a\u5e94\u7528\u53ea\u6709\u4e00\u4e2a BaseCase
\u4e00\u4e2a py \u6587\u4ef6\u91cc\u9762\u53ea\u6709\u4e00\u4e2a\u7c7b\uff0c\u6211\u4eec\u79f0\u4e3a\u4e00\u4e2a\u6d4b\u8bd5\u7c7b\uff1b
\u4e00\u4e2a\u7c7b\u91cc\u9762\u53ef\u4ee5\u6709\u591a\u4e2a\u7528\u4f8b\u51fd\u6570\uff0c\u8fd9\u53d6\u51b3\u8fd9\u6761\u7528\u4f8b\u6709\u591a\u5c11\u4e2a\u6d4b\u8bd5\u70b9\uff1a
class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_001_1(self):\n\"\"\"\u4efb\u52a1\u680f\u542f\u52a8\u97f3\u4e50\"\"\"\ndef test_music_001_2(self):\n\"\"\"\u542f\u52a8\u5668\u542f\u52a8\u97f3\u4e50\"\"\" \ndef test_music_001_3(self):\n\"\"\"\u684c\u9762\u542f\u52a8\u97f3\u4e50\"\"\"\n
test_${module}_${case_id}[_${index}]
\u6bd4\u5982\uff1atest_music_001_1\uff0cindex \u4ece 1 \u5f00\u59cb\u3002
test_music_001_1
\u51fd\u6570\u529f\u80fd\u8bf4\u660e\u91cc\u9762\u5199\u7528\u4f8b\u6807\u9898\uff0c\u76f4\u63a5\u590d\u5236 PMS \u4e0a\u7528\u4f8b\u6807\u9898\u5373\u53ef\uff0c\u6ce8\u610f\u7528\u4e09\u5bf9\u53cc\u5f15\u53f7\uff0c\u4e0d\u8981\u7528\u5176\u4ed6\u6ce8\u91ca\uff0c\u66f4\u4e0d\u8981\u7528\u4e95\u53f7\u6ce8\u91ca\u5199\u7528\u4f8b\u6807\u9898\uff1b
\u76f4\u63a5\u590d\u5236 PMS \u7528\u4f8b
\u7528\u4f8b\u6b65\u9aa4\u76f4\u63a5\u5c06 PMS \u4e0a\u7528\u4f8b\u6b65\u9aa4\u548c\u9884\u671f\u590d\u5236\u8fdb\u6765\uff0c\u7136\u540e\u8fdb\u884c\u6279\u91cf\u6ce8\u91ca\uff08ctrl + /\uff09\uff0c\u5728\u6ce8\u91ca\u7684\u57fa\u7840\u4e0a\u53bb\u5199\u7528\u4f8b\u811a\u672c\u4f1a\u66f4\u52a0\u65b9\u4fbf\u5168\u9762\uff0c\u4e5f\u6bd4\u4f60\u81ea\u5df1\u5199\u6ce8\u91ca\u66f4\u8282\u7ea6\u65f6\u95f4\uff1a
ctrl + /
\u4e3e\u4f8b\uff0cPMS \u7528\u4f8b\uff1a
\u76f4\u63a5\u9009\u4e2d\u7528\u4f8b\u5185\u5bb9\uff0c\u590d\u5236\u4e0b\u6765\uff0c\u7136\u540e\u7c98\u8d34\u5230\u81ea\u52a8\u5316\u7528\u4f8b\u811a\u672c\u4e2d\uff1a
class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\n
\u4e0a\u4f8b\u4e2d\u4e95\u53f7\u6ce8\u91ca\u90e8\u5206\u5c31\u662f\u76f4\u63a5\u4ece PMS \u4e0a\u590d\u5236\u8fc7\u6765\u7684\uff0c\u5728\u6b64\u57fa\u7840\u4e0a\u5199\u7528\u4f8b\uff1a
class TestMusic(BaseCase):\n\"\"\"\u97f3\u4e50\u7528\u4f8b\"\"\"\ndef test_music_182(self):\n\"\"\"\u6f14\u5531\u8005-\u5e73\u94fa\u89c6\u56fe\u4e0b\u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\"\"\"\nmusic = DeepinMusicWidget()\nmusic.click_singer_btn_in_music_by_ui()\n# 1\n# \u70b9\u51fb\u53f3\u4e0a\u89d2\u7684\u3010\u5e73\u94fa\u89c6\u56fe\u3011\u6309\u94ae\nmusic.click_icon_mode_in_music_by_ui()\n# \u5207\u6362\u4e3a\u5e73\u94fa\u89c6\u56fe\n# 2\n# \u53cc\u51fb\u4efb\u610f\u6f14\u5531\u8005\u5c01\u9762\nmusic.double_click_first_singer_in_singer_icon_view_by_ui()\n# \u8fdb\u5165\u6f14\u5531\u8005\u8be6\u60c5\u9875\u9762\nself.assert_xxx\n
\u4f60\u770b\uff0c\u975e\u5e38\u6e05\u695a\u6bcf\u4e00\u6b65\u5728\u505a\u4ec0\u4e48\uff0c\u91cd\u70b9\u662f\u7701\u53bb\u4e86\u5199\u6ce8\u91ca\u7684\u65f6\u95f4\uff0c\u771f\u7684\u7092\u9e21\u65b9\u4fbf\u3002
if __name__ == '__main__':
\u5982\u679c\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u662f\u76f8\u540c\u7684\uff0c\u53ea\u662f\u4e00\u4e9b\u53c2\u6570\u53d8\u5316\uff0c\u5c3d\u91cf\u4f7f\u7528\u6570\u636e\u9a71\u52a8\u6765\u5b9e\u73b0\u7528\u4f8b\uff1b
\u5982\u679c\u4f60\u9700\u8981\u4f7f\u7528\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u6570\u636e\u9a71\u52a8\u7684\u6570\u636e\uff0c\u4e0d\u80fd\u56e0\u6b64\u5f15\u5165\u4f9d\u8d56\uff0c\u5c3d\u91cf\u4f7f\u7528\u4e00\u4e9b\u6807\u51c6\u5e93\u80fd\u8bfb\u53d6\u7684\u6587\u4ef6\u683c\u5f0f\uff0c\u6bd4\u5982 json\u3001ini\u3001CSV\u3001xml\u3001txt \u7b49\u6587\u4ef6\u683c\u5f0f\uff1b\u4e0d\u5efa\u8bae\u4f7f\u7528 Yaml\u3001Excel\u3001MySQL \u7b49\u6570\u636e\u683c\u5f0f\uff1b
json\u3001ini\u3001CSV\u3001xml\u3001txt
Yaml\u3001Excel\u3001MySQL
\u8bfb\u53d6\u6570\u636e\u65f6\u4e5f\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff0c\u5982\u4f7f\u7528 pandas \u5904\u7406 CSV \u5c31\u5c5e\u4e8e\u5927\u6750\u5c0f\u7528\u4e86\uff0c\u6b63\u5e38\u7684\u6570\u636e\u9a71\u52a8\u8fd8\u6ca1\u5230\u9700\u8981\u5927\u6570\u636e\u5206\u6790\u6765\u5904\u7406\u7684\u5730\u6b65\uff1b
pandas
\u6570\u636e\u9a71\u52a8\u7684\u5916\u90e8\u6587\u4ef6\u5b58\u653e\u5728 widget/ddt/ \u76ee\u5f55\u4e0b\uff1b
widget/ddt/
\u6570\u636e\u9a71\u52a8\u7684\u5199\u6cd5\uff1a
@pytest.mark.parametrize(\"value\", data)\ndef test_smb_049(self, value):\n
\u4ee5\u4e0a\u8fd9\u79cd\u53c2\u6570\u5316\u7684\u5199\u6cd5\u672c\u8eab\u6ca1\u4ec0\u4e48\u95ee\u9898\uff0c\u4f46\u662f\uff0c\u8fd9\u91cc\u5fc5\u987b\u8981\u8865\u5145\u4e00\u4e2a\u6ca1\u6709\u7528\u7684\u5c0f\u77e5\u8bc6\uff1a
\u5982\u679c\u53c2\u6570\u5316\u6570\u636e\u91cc\u9762\u7684\u5b57\u7b26\u4f1a\u539f\u5c01\u4e0d\u52a8\u7684\u8f93\u51fa\u5230 item.name \u91cc\u9762\uff0c\u663e\u793a\u975e\u5e38\u4e0d\u4f18\u96c5\uff0c\u800c\u4e14\u53ef\u4ee5\u4f1a\u5f15\u5165\u4e00\u4e9b\u610f\u60f3\u4e0d\u5230\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u611f\u53d7\u4e00\u4e0b\uff1a
\u53c2\u6570\uff1a
data = [\n\"\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\", \"qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui\", \"12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678\",\n]\n
\u73b0\u8c61\u662f\u8fd9\u6837\u8272\u513f\u7684\uff1a
test_smb_049.py::TestFileManager::test_smb_049[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u4e00\u4e8c\u4e09]\ntest_smb_049.py::TestFileManager::test_smb_049[qwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyuiopqwertyui]\ntest_smb_049.py::TestFileManager::test_smb_049[12345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678]\n
\u8bf4\u5b9e\u8bdd\uff0c\u770b\u7740\u5fc3\u91cc\u5835\u5f97\u614c\uff0c\u5982\u679c\u8fd9\u91cc\u9762\u5305\u542b\u4e00\u4e9b\u7279\u6b8a\u5b57\u7b26\u6216\u8005\u662f\u8d85\u957f\uff0c\u53ef\u80fd\u4f1a\u6709\u4e00\u4e9b\u5f88\u5947\u5999\u7684\u4e8b\u60c5\u53d1\u751f\u3002
parametrize \u91cc\u9762\u6709\u4e2a\u53c2\u6570\uff1aids\uff0c\u53ef\u4ee5\u89e3\u51b3\u6b64\u7c7b\u95ee\u9898\uff0c\u5c31\u50cf\u8fd9\u6837\uff1a
@pytest.mark.parametrize(\"value\", data, ids=[1, 2, 3])\ndef test_smb_049(self, value):\n
\u518d\u6765\u611f\u53d7\u4e00\u4e0b\uff1a
test_smb_049.py::TestFileManager::test_smb_049[1]\ntest_smb_049.py::TestFileManager::test_smb_049[2]\ntest_smb_049.py::TestFileManager::test_smb_049[3]\n
\u660e\u663e\u597d\u591a\u4e86\uff0c\u6240\u4ee5\u5c3d\u91cf\u4f7f\u7528 ids \u8fd9\u4e2a\u53c2\u6570\u3002
\u4e0d\u5efa\u8bae\u4f7f\u7528 fixture \u7684\u6570\u636e\u9a71\u52a8\u65b9\u5f0f\uff0c\u6846\u67b6\u867d\u7136\u652f\u6301\uff0c\u4f46\u53ef\u8bfb\u6027\u6bd4\u8f83\u5dee\uff1b\u5982\u679c\u4f60\u4e0d\u77e5\u9053\u8fd9\u53e5\u8bdd\u5728\u8bf4\u5565\uff0c\u90a3\u4f60\u53ef\u4ee5\u5ffd\u7565\uff0c\u6211\u4e5f\u4e0d\u6253\u7b97\u8be6\u7ec6\u8bf4\u8fd9\u79cd\u5b9e\u73b0\u65b9\u5f0f\uff0c\u64cd\u4f5c\u6bd4\u8f83\u9a9a\u3002
assert_res
widget/pic_res
\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u4f7f\u7528\u5230\u7684\u4e00\u4e9b\u8d44\u6e90\uff0c\u6bd4\u5982\u97f3\u4e50\u53ef\u80fd\u9700\u8981\u4e00\u4e9b mp3 \u7684\u8d44\u6e90\u7528\u4e8e\u6d4b\u8bd5\uff0c\u5b58\u653e\u5728 widget/case_res \u76ee\u5f55\u4e0b\uff0c\u524d\u63d0\u662f\u8fd9\u4e9b\u8d44\u6e90\u4e0d\u8d85\u8fc7 10M\uff1b
widget/case_res
10M
\u5982\u679c\u662f\u4e00\u4e9b\u6bd4\u8f83\u5927\u7684\u8d44\u6e90\uff0c\u5efa\u8bae\u653e\u5230\u7edf\u4e00\u7684 ftp \u670d\u52a1\u5668 \uff08ftp://10.8.10.245\uff09\uff0c\u9700\u8981\u6267\u884c\u7528\u4f8b\u7684\u65f6\u5019\u518d\u4e0b\u8f7d\u4e0b\u6765\uff1b
f\"wget ftp://{Config.FTP_IP}/uploads/\u591a\u5a92\u4f53/\u5f71\u9662/auto/{file_name};unzip {file_name};rm -rf {file_name};\"\n
\u6d4b\u8bd5\u8d44\u6e90\u4e0b\u8f7d\u5230\u5e94\u7528 widget/case_res \u76ee\u5f55\u4e0b\uff1b
\u7981\u6b62\u5c06\u6d4b\u8bd5\u8d44\u6e90\u5b58\u653e\u5728\u4e2a\u4eba\u7684\u673a\u5668\u4e0a\uff1b
\u5e94\u8be5\u5c3d\u91cf\u4fdd\u8bc1\uff0c\u4e00\u4e2a\u8d44\u6e90\u5728\u4e00\u6b21\u7528\u4f8b\u6267\u884c\u4e2d\u53ea\u9700\u8981\u4e0b\u8f7d\u4e00\u6b21\uff0c\u6240\u4ee5\u4f60\u4e0d\u80fd\u6bcf\u6b21\u4f7f\u7528\u7684\u65f6\u5019\u90fd\u53bb\u4e0b\u8f7d\uff0c\u8fd9\u6837\u53ef\u80fd\u4f1a\u8017\u8d39\u5927\u91cf\u7684\u7f51\u7edc\u8d44\u6e90\uff0c\u800c\u56e0\u4e3a\u5148\u5224\u65ad\u672c\u5730\u662f\u5426\u5b58\u5728\u6b64\u8d44\u6e90\uff0c\u5982\u679c\u4e0d\u5b58\u5728\u518d\u53bb\u4e0b\u8f7d\uff1b
\u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u5c06\u8d44\u6e90\u62f7\u8d1d\u5230\u5bf9\u5e94\u7684\u6d4b\u8bd5\u76ee\u5f55\u4e0b\uff0c\u6bd4\u5982\u5c06 mp3 \u6587\u4ef6\u62f7\u8d1d\u5230 ~/Music \u76ee\u5f55\u4e0b\uff0c\u4f46\u662f\u6211\u4eec\u66f4\u5efa\u8bae\u4f60\u4f7f\u7528\u53d1\u9001\u5feb\u6377\u94fe\u63a5\u7684\u65b9\u5f0f\u66ff\u4ee3\u62f7\u8d1d\u7684\u64cd\u4f5c\uff0c\u56e0\u4e3a\u5728\u62f7\u8d1d\u5927\u6587\u4ef6\u65f6\u662f\u5f88\u6d88\u8017\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u800c\u521b\u5efa\u94fe\u63a5\u5219\u4e0d\u4f1a\uff1b
~/Music
@classmethod\ndef recovery_many_movies_in_movie_by_cmd(cls):\n\"\"\"\u6062\u590d\u591a\u4e2a\u89c6\u9891\u6587\u4ef6\u81f3\u89c6\u9891\u76ee\u5f55\u4e2d\"\"\"\nwork_path = f\"/home/{Config.USERNAME}/Videos/auto\"\ncode_path = f\"{Config.CASE_RES_PATH}/auto\"\ncls.run_cmd(f\"rm -rf {work_path};mkdir {work_path}\")\nsleep(1)\nflag = False\nif not exists(code_path):\ncls.run_cmd(f\"mkdir -p {code_path}\")\nflag = True\nlogger.info(f\"ln -s {code_path}/* {work_path}/\")\ncls.run_cmd(\nf\"cd {code_path}/;\"\nf\"{cls.wget_file('auto.zip') if flag else ''}\"\nf\"ln -s {code_path}/* {work_path}/ > /dev/null 2>&1\"\n)\n
os.system
run_cmd
Debug
\u8fdc\u7a0b\u6267\u884c\u7684\u597d\u5904\u662f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u7684 Debug \u8fd0\u884c\uff0c\u4e0d\u7528\u5728\u6d4b\u8bd5\u673a\u4e0a\u6253\u5f00\u7f16\u8f91\u5668\uff0c\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u66f4\u5feb\uff1b
\u652f\u6301\u8fdc\u7a0b\u6267\u884c\u529f\u80fd\u7684\u7f16\u8f91\u5668\uff1a
VScode \uff0c\u9700\u8981\u4f7f\u7528\u63d2\u4ef6 Remote-SSH
VScode
Remote-SSH
\u8fdc\u7a0b\u6267\u884c\u914d\u7f6e
\u4ee5 Pycharm \u4e3a\u4f8b\uff1a
File \u2014> Settings \u2014> Project \u2014> Python Interpreter \u2014> \u53f3\u8fb9\u8bbe\u7f6e\u6309\u94ae \u2014> Add... \u2014> SSH Interpreter \u2014> New server configuration(\u586b\u5165host\u548cusername) \u2014> Next \u2014> password\uff08\u6d4b\u8bd5\u673a\u5bc6\u7801\uff09 \u2014> Interpreter(\u9009\u62e9\u8fdc\u7a0b\u89e3\u91ca\u5668) \u2014> Finish
File
Settings
Project
Python Interpreter
\u53f3\u8fb9\u8bbe\u7f6e\u6309\u94ae
Add...
SSH Interpreter
New server configuration(\u586b\u5165host\u548cusername)
Next
password\uff08\u6d4b\u8bd5\u673a\u5bc6\u7801\uff09
Interpreter(\u9009\u62e9\u8fdc\u7a0b\u89e3\u91ca\u5668)
Finish
teardown
setup
clean_all
--clean yes
\u4ee5\u4e0a\u95ee\u9898\u6392\u9664\u5e94\u7528\u5361\u987f\u7b49\u95ee\u9898\uff0c\u5927\u6982\u7387\u662f\u7531\u4e8e\u5de5\u5177\u7684\u95ee\u9898\uff0c\u76ee\u524d\u952e\u9f20\u64cd\u4f5c\u6211\u4eec\u4f7f\u7528\u4e09\u4e2a\u5de5\u5177\uff1aDogtail \u63d0\u4f9b\u7684\u952e\u9f20\u5de5\u5177\u3001PyAutoGUI\u3001Xdotool \uff1b
Dogtail
PyAutoGUI
Xdotool
\u6709\u540c\u5b66\u53ef\u80fd\u8981\u8bf4\u4e3a\u5565\u8981\u7528\u4e09\u4e2a\u554a\uff0c\u7528\u4e00\u4e2a\u4e0d\u5c31\u597d\u4e86\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u5404\u6709\u4f18\u70b9\u5404\u6709\u7f3a\u70b9\u3002
\u5982\u679c\u4f60\u9047\u5230\u952e\u9f20\u7684\u95ee\u9898\uff0c\u53ef\u4ee5\u8bd5\u8bd5\u901a\u8fc7\u4e0d\u540c\u7684\u5de5\u5177\u64cd\u4f5c\uff1b\u952e\u76d8\u8f93\u5165\u5ef6\u8fdf\u7684\u95ee\u9898\uff0c\u4e00\u822c\u662f\u56e0\u4e3a\u8f93\u5165\u901f\u5ea6\u592a\u5feb\u4e86\uff0c\u7cfb\u7edf\u6ca1\u53cd\u5e94\u8fc7\u6765\uff0c\u5e38\u89c1\u4e8e ARM \u548c MIPS \u4e0a\uff0c\u4fee\u6539\u53c2\u6570 delay_time \u7684\u503c\uff0c\u5355\u4f4d\u4e3a\u6beb\u79d2\uff1b
ARM
MIPS
# mouse_key.py\n@classmethod\ndef input_message(cls, message, delay_time=300, interval=0.2):\n\"\"\"\n \u8f93\u5165\u5b57\u7b26\u4e32\n :param message: \u8f93\u5165\u7684\u5185\u5bb9\n :param delay_time: \u5ef6\u8fdf\u65f6\u95f4\n :param interval:\n :return:\n \"\"\"\n
\u5982\u679c\u4e0d\u662f\u65b9\u6cd5\u7684\u95ee\u9898\uff0c\u5219\u9700\u8981\u7ee7\u7eed\u548c\u5f00\u53d1\u4e00\u8d77\u6392\u9664\uff0c\u662f\u5426\u4e3a\u5e94\u7528\u63a5\u53d7\u952e\u9f20\u4fe1\u53f7\u5904\u7406\u7684\u95ee\u9898\uff0c\u8fd9\u7c7b\u60c5\u51b5\u6211\u4eec\u4e5f\u662f\u9047\u5230\u8fc7\u7684\uff0c\u5177\u4f53\u95ee\u9898\u5177\u4f53\u5206\u6790\u3002
\u6bd4\u5982\u5f71\u9662\u5c31\u91cd\u5199\u4e86\u4e00\u4e2a\u53f3\u952e\u7684\u65b9\u6cd5\uff1a
# base_widget.py\n@classmethod\ndef right_click(cls, _x=None, _y=None):\n\"\"\"\n \u91cd\u5199\u5e95\u5c42\u5355\u51fb\u9f20\u6807\u53f3\u952e\n \u89e3\u51b3\u5f71\u9662\u53f3\u952e\u89e6\u53d1release\u4e8b\u4ef6\u7684\u95ee\u9898\uff08\u53f3\u952e\u4e3b\u7a97\u53e3\u4f1a\u64ad\u653e\u89c6\u9891\uff09\n \"\"\"\ncls.mouse_down(_x, _y, button=3)\nsleep(0.1)\ncls.mouse_up(button=3)\n
git add .
.git
\u66f4\u591a\u7ec6\u8282\u67e5\u770b\uff1a\u300aAT\u7ecf\u9a8c\u603b\u7ed3\u300b
# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2022/5/25\n# Author : litao\n# =============================================\n
\u4ee5\u4e0b\u6309\u6267\u884c\u6d41\u7a0b\u7684\u987a\u5e8f\u4ecb\u7ecd\uff0c\u6bcf\u4e00\u6b65\u90fd\u53ef\u4ee5\u5355\u72ec\u6267\u884c\u3002
Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/AT_test/
\u6574\u4e2a\u6d41\u7a0b\u7684\u4e3b\u5165\u53e3\uff0c\u901a\u8fc7\u8fd9\u4e2a\u5165\u53e3\uff0c\u8fde\u540c\u6574\u4e2a\u6d4b\u8bd5\u6d41\u7a0b\uff0c\u955c\u50cf\u88c5\u673a\uff0c\u73af\u5883\u90e8\u7f72\uff0c\u6d4b\u8bd5\u5e94\u7528\u53ca\u751f\u6210\u62a5\u544a\u3002
\u53c2\u6570\u4ecb\u7ecd\uff1a
Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/IOS_install/
\u8f93\u5165\u6d4b\u8bd5\u673a\u7684\u7528\u6237\u540d\uff0cIP\uff0c\u5bc6\u7801\uff0c\u955c\u50cf\u5730\u5740\u540e\uff0c\u81ea\u52a8\u88c5\u673a\uff0c\u76ee\u524d\u4ec5\u652f\u6301\u56fa\u5b9a 15 \u7f51\u6bb5\u7684\u90e8\u5206 AMD \u67b6\u6784\u7684\u6d4b\u8bd5\u673a\u3002
Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/all_client_test/
\u8be5\u5165\u53e3\u4e0e\u4e3b\u5165\u53e3\u529f\u80fd\u57fa\u672c\u4e00\u81f4\uff0c\u53ea\u662f\u5265\u79bb\u4e86PXE\u88c5\u673a\u6d41\u7a0b\uff0c\u652f\u6301\u4efb\u610f\u6d4b\u8bd5\u673a\u7684\u6267\u884c\u6d41\u7a0b\u3002
Jenkins url\uff1ahttps://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/env/build?delay=0sec
\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u7684\u7cfb\u7edf\u8bed\u8a00\uff0c\u5206\u8fa8\u7387\u53ca\u5b89\u88c5\u6d4b\u8bd5\u6240\u9700\u7684\u4f9d\u8d56\u5305\u3002
Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/send_code/
\u6839\u636e\u6d4b\u8bd5\u5e94\u7528\u540d\u79f0\uff0c\u62c9\u53d6\u5bf9\u5e94\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u5e76\u6839\u636e\u6d4b\u8bd5\u673a\u4e0a\u5e94\u7528\u7248\u672c\u5207\u6362\u5230\u5bf9\u5e94\u7684tag\u7248\u672c\uff0c\u82e5\u672a\u627e\u5230tag\u7248\u672c\uff0c\u5219\u4f7f\u7528\u6700\u65b0\u7684\u5e94\u7528\u5e93\u4ee3\u7801\uff0c\u518d\u6839\u636e\u5e94\u7528\u5e93\u4ee3\u7801\u4e2d\u914d\u7f6e\u7684\u57fa\u7840\u5e93\u7248\u672c\uff0c\u62c9\u53d6\u57fa\u7840\u5e93\u4ee3\u7801\u3002
Jenkins url: https://jenkinswh.uniontech.com/view/CI/job/chengdu/job/AT_test/job/run_test/
\u8fd0\u884c\u6d4b\u8bd5\u673a\u4e0a\u7684\u7528\u4f8b
AT \u7528\u4f8b\u7b5b\u9009\u6807\u51c6\uff0c\u662f\u6311\u9009\u5408\u9002\u7684\u6587\u672c\u7528\u4f8b\u8fdb\u884c\u81ea\u52a8\u5316\u7528\u4f8b\u8f6c\u5316\u7684\u4e00\u4e9b\u901a\u7528\u6807\u51c6\u3002
\u8fc7\u53bb\u6211\u4eec\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u5b9e\u8df5\u8fc7\u7a0b\u4e2d\uff0c\u5199\u4e86\u4e0d\u5c11\u81ea\u52a8\u5316\u7528\u4f8b\uff0c\u968f\u7740\u9700\u6c42\u7684\u8fed\u4ee3\uff0c\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u81ea\u7136\u8150\u5316\uff0c\u56e0\u800c\u9700\u8981\u5728\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\u5bf9\u81ea\u52a8\u5316\u7528\u4f8b\u8fdb\u884c\u7ef4\u62a4\uff0c\u5728\u7ef4\u62a4\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u6211\u4eec\u53d1\u73b0\uff0c\u6709\u4e9b\u7528\u4f8b\u7ef4\u62a4\u8d77\u6765\u592a\u96be\u4e86\uff0c\u8c03\u8bd5\u7528\u4f8b\u8017\u8d39\u5927\u91cf\u65f6\u95f4\uff0c\u6210\u672c\u5f88\u9ad8\u3002
\u56e0\u6b64\uff0c\u6211\u4eec\u603b\u7ed3\u4e00\u4e9b\u81ea\u52a8\u5316\u7528\u4f8b\u9009\u578b\u7684\u6807\u51c6\uff0c\u4ee5\u4f18\u5316\u540e\u7eed\u81ea\u52a8\u5316\u7528\u4f8b\u7ed3\u6784\uff0c\u671f\u5f85\u6211\u4eec\u80fd\u7f16\u5199\u51fa\u9ad8\u6548\u3001\u7a33\u5b9a\u3001\u6613\u4e8e\u7ef4\u62a4\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u3002
\u81ea\u52a8\u5316\u6d4b\u8bd5\u53ef\u4ee5\u5206\u4e3a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u548c\u4e13\u9879\u81ea\u52a8\u5316\u6d4b\u8bd5\uff0c\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e00\u822c\u53ea\u9488\u5bf9\u4e00\u4e9b\u5e38\u89c4\u7684\u529f\u80fd\u6d4b\u8bd5\uff0c\u5176\u4ed6\u975e\u5e38\u89c4\u529f\u80fd\u7684\u7528\u4f8b\uff0c\u5e94\u8be5\u91c7\u7528\u4e13\u9879\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u6848\uff1b
\u4ee5\u4e0b\u662f\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7528\u4f8b\u7684\u60c5\u51b5\uff1a
\u7a33\u5b9a\u6027\u6d4b\u8bd5\u3001\u538b\u6d4b\u7528\u4f8b\u5e94\u8be5\u662f\u5c5e\u4e8e\u6027\u80fd\u76f8\u5173\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u5982\uff1a\u53cd\u590d\u591a\u6b21\u70b9\u51fb\u6309\u94ae\uff0c\u68c0\u9a8c\u5176\u529f\u80fd\u7a33\u5b9a\u6027\u3002\u56e0\u4e3a\u8fd9\u4e9b\u7528\u4f8b\u65ad\u8a00\u7684\u9884\u671f\u53ef\u80fd\u4e0d\u662f\u5f88\u660e\u786e\uff0c\u66f4\u6709\u751a\u8005\u4e0d\u9700\u8981\u65ad\u8a00\uff0c\u7528\u4f8b\u65f6\u957f\u6bd4\u8f83\u957f\uff0c\u800c\u4e14\u4e0d\u53ef\u63a7\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002
\u76ee\u524d\u6211\u4eec\u6709\u6027\u80fd\u81ea\u52a8\u5316\u7684\u4e13\u9879\u65b9\u6848\uff0c\u4ee5\u53ca\u4e00\u4e9b\u7a33\u5b9a\u6027\u6d4b\u8bd5\u7684\u4e13\u9879\u65b9\u6848\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u6b64\u7c7b\u7528\u4f8b\u653e\u5230\u4e13\u9879\u81ea\u52a8\u5316\u91cc\u9762\u53bb\u505a\u3002
\u5e38\u89c1\u4e0e\u6587\u7ba1\u7684\u7528\u4f8b\u4e2d\uff0c\u591a\u7528\u6237\u64cd\u4f5c\u7684\u7528\u4f8b\u4e00\u822c\u90fd\u4f1a\u6d89\u53ca\u5230\u5728\u7cfb\u7edf\u4e2d\u8fdb\u884c\u591a\u4e2a\u7528\u6237\u95f4\u7684\u5207\u6362\uff0c\u81ea\u52a8\u5316\u811a\u672c\u4e00\u822c\u662f\u8fd0\u884c\u5728\u4e00\u4e2a\u7528\u6237\u7a7a\u95f4\u4e0b\u7684\uff0c\u6240\u4ee5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u591a\u7528\u6237\u95f4\u7684\u5207\u6362\u3002
\u6b64\u7c7b\u4e0d\u5efa\u8bae\u91c7\u7528\u81ea\u52a8\u5316\u6267\u884c\u3002
\u6b64\u7c7b\u573a\u666f\u591a\u4e3a\u5e94\u7528\u7684\u5f02\u5e38\u573a\u666f\u6d4b\u8bd5\uff0c\u6bd4\u5982\uff1a\u590d\u5236\u5927\u6587\u4ef6\u8fc7\u7a0b\u4e2d\u6ce8\u9500\u673a\u5668\u3002
\u81ea\u52a8\u5316\u811a\u672c\u5728\u7cfb\u7edf\u5173\u673a\u3001\u6ce8\u9500\u3001\u91cd\u542f\u4e4b\u540e\u662f\u4f1a\u505c\u6b62\u8fd0\u884c\u7684\uff1b\u6b64\u7c7b\u7528\u4f8b\u53ef\u4ee5\u505a\u81ea\u52a8\u5316\uff0c\u4f46\u662f\u540c\u6837\u9700\u8981\u505a\u4e13\u9879\u65b9\u6848\uff0c\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u7684\u5904\u7406\u903b\u8f91\u5b8c\u5168\u4e0d\u540c\u3002
\u540e\u7eed\u81ea\u52a8\u5316\u9700\u8981\u516c\u5173\u7684\u70b9\uff1a
\u81ea\u52a8\u5316\u811a\u672c\u5728\u672c\u673a\u8fd0\u884c\uff0c\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u81f3\u5c11\u9700\u8981\u63d0\u4f9b\u4ee5\u4e0b\u529f\u80fd\uff1a
\u91cd\u542f\u4e4b\u540e\u7528\u4f8b\u80fd\u81ea\u52a8\u8fd0\u884c\uff1b\u53ef\u4ee5\u8003\u8651\u5c06\u6267\u884c\u7528\u4f8b\u5199\u6210\u4e00\u4e2a\u5f00\u673a\u81ea\u542f\u7684\u670d\u52a1\uff1b
\u80fd\u8bb0\u5f55\u5173\u673a\u4e4b\u524d\u7528\u4f8b\u6267\u884c\u7684\u4f4d\u7f6e\uff0c\u91cd\u542f\u4e4b\u540e\u80fd\u4ece\u6b64\u4f4d\u7f6e\u5f00\u59cb\u6267\u884c\uff1b
\u50cf\u6027\u80fd\u81ea\u52a8\u5316\u4e00\u6837\uff0c\u7531\u670d\u52a1\u7aef\u63a7\u5236\uff1b
\u5b8c\u5168\u57fa\u4e8e\u56fe\u5f62\u8bc6\u522b\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b
\u7528\u4f8b\u6267\u884c\u65f6\u95f4\u63a7\u5236\u57282\u5206\u949f\u4ee5\u5185\uff0c\u6781\u7aef\u60c5\u51b5\u4e0d\u8981\u8d85\u8fc75\u5206\u949f\uff0c\u6240\u6709\u7528\u4f8b\u7684\u5e73\u5747\u65f6\u957f\u5e94\u8be5\u57281\u5206\u949f\u5de6\u53f3\uff1b
\u7528\u4f8b\u6267\u884c\u65f6\u95f4\u592a\u957f\uff0c\u7f16\u5199\u7528\u4f8b\u3001\u8c03\u8bd5\u7528\u4f8b\u3001\u6267\u884c\u7528\u4f8b\u3001\u7ef4\u62a4\u7528\u4f8b\u90fd\u975e\u5e38\u7684\u8017\u65f6\uff0c\u4eba\u529b\u6210\u672c\u65f6\u95f4\u6210\u672c\u6295\u5165\u592a\u9ad8\u3002
\u4f60\u60f3\uff0c\u8fd9\u6761\u7528\u4f8b\u6267\u884c\u9700\u89815\u5206\u949f\uff0c\u90a3\u4f60\u5199\u8fd9\u6761\u7528\u4f8b\u7684\u65f6\u95f4\u4e0d\u53ef\u80fd\u4e00\u904d\u8fc7\uff0c\u5199\u7684\u8fc7\u7a0b\u4e2d\u8dd1\u4e0d\u901a\u8fd8\u5f97\u91cd\u8dd1\u81f3\u5c1115\u5206\u949f\u4e0d\u8fc7\u5206\uff0c\u5199\u5b8c\u4e86\u8fd8\u5f97\u5728\u5176\u4ed6\u67b6\u6784\u4e0a\u8c03\u8bd5\uff0c\u534a\u4e2a\u5c0f\u65f6\u8fc7\u53bb\u4e86\uff0c\u8fd9\u8fd8\u53ea\u662f\u7b2c\u4e00\u6b21\u5199\u7528\u4f8b\u7684\u65f6\u5019\uff0c\u540e\u7eed\u5982\u679c\u7528\u4f8b\u7ef4\u62a4\u8fc7\u7a0b\u4e2d\uff0c\u4f60\u53ef\u80fd\u9700\u8981\u7ecf\u5e38\u6295\u5165\u76f8\u5f53\u957f\u65f6\u95f4\uff0c\u8fd9\u6837\u5176\u5b9e\u662f\u5931\u53bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u7684\u3002\u5e38\u89c4\u81ea\u52a8\u5316\u6d4b\u8bd5\u5c31\u5e94\u8be5\u662f\u5feb\u51c6\u72e0\u3002
\u6709\u4e9b\u529f\u80fd\u6a21\u5757\u672c\u8eab\u662f\u5c5e\u4e8e\u6bd4\u8f83\u8fb9\u7f18\u6027\u7684\uff0c\u5373\u6781\u5c11\u7528\u6237\u4f1a\u4f7f\u7528\u5230\u7684\u529f\u80fd\uff0c\u8fd9\u7c7b\u529f\u80fd\u6a21\u5757\u4e0d\u9700\u8981\u5927\u89c4\u6a21\u5b9e\u73b0\u81ea\u52a8\u5316\uff0c\u4e00\u4e24\u4e2a\u573a\u666f\u8986\u76d6\u57fa\u672c\u529f\u80fd\u5c31\u884c\u4e86\uff0c\u56e0\u6b64\u6211\u4eec\u5728\u6311\u9009\u6b64\u7c7b\u7528\u4f8b\u7684\u65f6\u5019\u53ef\u4ee5\u7ed3\u5408\u6574\u4e2a\u529f\u80fd\u6a21\u5757\u7684\u8986\u76d6\u60c5\u51b5\u6765\u51b3\u5b9a\u3002
\u81ea\u52a8\u5316\u6267\u884c\u7684\u8fc7\u7a0b\u4e2d\u662f\u6ca1\u6709\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bd4\u5982\u8981\u4eba\u5de5\u4ecb\u5165\u7684\uff0c\u90a3\u4e48\u5c31\u80cc\u79bb\u4e86\u81ea\u52a8\u5316\u7684\u610f\u4e49\u3002
\u6bd4\u5982\u5149\u9a71\u6a21\u5757\uff0c\u5149\u9a71\u523b\u5f55\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u4f46\u662f\u5149\u9a71\u523b\u5f55\u4e4b\u540e\u5149\u76d8\u4f1a\u5f39\u51fa\u6765\uff0c\u9700\u8981\u4eba\u5de5\u66f4\u6362\u5149\u76d8\uff0c\u518d\u624b\u52a8\u63a8\u8fdb\u5149\u9a71\u4e2d\u3002
\u8fd9\u79cd\u529f\u80fd\u6a21\u5757\u5373\u4f7f\u505a\u81ea\u52a8\u5316\uff0c\u80fd\u6d89\u53ca\u5230\u7684\u529f\u80fd\u975e\u5e38\u6709\u9650\uff0c\u800c\u4e14\u4e0d\u662f\u6838\u5fc3\u529f\u80fd\uff0c\u6240\u4ee5\u660e\u663e\u5c31\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002
\u7528\u4f8b\u6240\u6d89\u53ca\u5230\u7684\u65b9\u6cd5\u5b9e\u73b0\u8d77\u6765\u53ef\u80fd\u6709\u96be\u5ea6\uff0c\u751a\u81f3\u73b0\u9636\u6bb5\u65e0\u6cd5\u5b9e\u73b0\u7684\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u3002
\u6bd4\u5982\u5f71\u9662\u6d4b\u8bd5\u753b\u9762\u6e05\u6670\u5ea6\u3001\u6d41\u7545\u5ea6\u3001\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u4e4b\u540e\u7684\u89c6\u9891\u662f\u5426\u5b58\u5728\u5361\u987f\u7b49\u7528\u4f8b\uff0c\u73b0\u9636\u6bb5\u8fd8\u65e0\u6cd5\u5b9e\u73b0\u3002
\u8fd9\u4e2a\u4e0d\u662f\u8bf4\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\uff0c\u8fd8\u5728\u5f00\u53d1\u9636\u6bb5\u7684\u529f\u80fd\u4e0d\u7a33\u5b9a\u662f\u6b63\u5e38\u7684\uff0c\u8fd9\u79cd\u6211\u4eec\u53ef\u4ee5\u7b49\u5f00\u53d1\u63d0\u6d4b\u4e4b\u540e\u518d\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u3002
\u529f\u80fd\u4e0d\u7a33\u5b9a\u6307\u7684\u662f\u7528\u4f8b\u6240\u6d89\u53ca\u7684\u529f\u80fd\uff0c\u53ef\u80fd\u5b58\u5728\u591a\u79cd\u53d8\u5316\uff0c\u6bcf\u6b21\u6267\u884c\u7528\u4f8b\u53ef\u80fd\u65ad\u8a00\u7684\u9884\u671f\u90fd\u4e0d\u540c\u3002
\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u76f4\u5230\u7528\u4f8b\u7ed3\u675f\uff0c\u4e00\u76f4\u662f\u4e00\u4e2a\u52a8\u6001\u53d8\u5316\u7684\u8fc7\u7a0b\uff0c\u800c\u4e14\u65e0\u6cd5\u901a\u8fc7\u5176\u4ed6\u624b\u6bb5\u505c\u4e0b\u6765\uff1b
\u6bd4\u5982\uff1a\u622a\u56fe\u5f55\u5c4f\u5f55\u5236\u89c6\u9891\u65f6\uff0c\u53f3\u4e0b\u89d2\u7684\u5f55\u5236\u65f6\u95f4\u662f\u4e00\u76f4\u5728\u53d8\u5316\u7684\uff0c\u7528\u4f8b\u9700\u8981\u6d4b\u8bd5\u5f55\u52361\u5206\u949f\u4e4b\u540e\uff0c\u5f55\u5236\u65f6\u95f4\u662f\u521a\u597d\u505c\u572860\u79d2\uff1b
\u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u8fd8\u505a\u4e0d\u5230\u65f6\u95f4\u7cbe\u51c6\u63a7\u5236\uff0c\u7a0b\u5e8f\u6267\u884c\u65f6\u95f4\u662f\u6709\u6ce2\u52a8\u7684\uff0c\u800c\u4e14\u8981\u9002\u914d\u591a\u4e2a\u5e73\u53f0\uff0c\u6240\u4ee5\u6b64\u7c7b\u7528\u4f8b\u5927\u6982\u7387\u4f1a\u6267\u884c\u5931\u8d25\u3002\u7279\u522b\u662f\u5728\u6027\u80fd\u8f83\u5dee\u7684\u56fd\u4ea7\u5316\u67b6\u6784\u4e0a\uff0c\u6b64\u7c7b\u7528\u4f8b\u4e0d\u592a\u53ef\u80fd\u7a33\u5b9a\u6267\u884c\u3002
\u63a2\u7d22\u6027\u6d4b\u8bd5\u901a\u5e38\u662f\u4e00\u4e9b\u4e0d\u786e\u5b9a\u7684\u64cd\u4f5c\uff0c\u591a\u53d8\u5207\u590d\u6742\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u9884\u671f\u4e5f\u53ef\u80fd\u662f\u4e0d\u786e\u5b9a\u7684\uff0c\u7b80\u5355\u8bb2\u5c31\u662f\u9a9a\u64cd\u4f5c\u592a\u591a\u4e86\uff0c\u56e0\u6b64\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002
\u6b64\u7c7b\u7528\u4f8b\u9002\u5408\u91c7\u7528\u624b\u5de5\u6d4b\u8bd5\uff0c\u662f\u624b\u5de5\u6d4b\u8bd5\u771f\u6b63\u7684\u4ef7\u503c\u4f53\u73b0\u3002
\u5bf9\u4e8e\u6613\u7528\u6027\u7684\u5224\u65ad\u901a\u5e38\u662f\u4e3b\u89c2\u7684\uff0c\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\u5f88\u96be\u53bb\u5b9a\u4e49\u4ec0\u4e48\u6837\u7684\u60c5\u51b5\u5bf9\u7528\u6237\u662f\u6613\u7528\u7684\uff0c\u81ea\u52a8\u5316\u9700\u8981\u6709\u660e\u786e\u7684\u53ef\u5b9e\u73b0\u7684\u9884\u671f\u3002
\u524d\u9762\u8bb2\u4e86\u4e0d\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u4e00\u4e9b\u7528\u4f8b\u60c5\u51b5\uff0c\u6709\u540c\u5b66\u5c31\u8bf4\u4e86\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\u4e0d\u7528\u8bb2\u4e86\uff0c\u5c31\u662f\u4e0d\u9002\u5408\u7684\u53cd\u9762\u3002\u6ca1\u6bdb\u75c5\u54c8\uff0c\u9002\u5408\u505a\u81ea\u52a8\u5316\u7684\u7528\u4f8b\uff0c\u6211\u4eec\u5927\u4f53\u8fd8\u53ef\u4ee5\u5206\u4e3a\u4e24\u7c7b\uff1a
\u4ee5\u4e0b\u4ecb\u7ecd\u4e00\u4e9b\u6211\u4eec\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u7684\u60c5\u51b5\uff1a
\u7528\u4f8b\u6b65\u9aa4\u76f8\u5bf9\u8f83\u5c11\uff0c\u8fd9\u79cd\u7528\u4f8b\u901a\u5e38\u662f\u4e00\u4e9b\u8def\u5f84\u5f88\u6d45\u7684\u7528\u4f8b\uff0c\u4e00\u822c\u4e5f\u662f\u4e00\u4e9b\u57fa\u7840\u7528\u4f8b\u3002\u7528\u4f8b\u7f16\u5199\u3001\u7ef4\u62a4\u90fd\u53ef\u4ee5\u8f7b\u677e\u641e\u5b9a\u3002
\u73b0\u6709\u6280\u672f\u662f\u53ef\u5b9e\u73b0\u7684\uff0c\u6ca1\u6709\u96be\u5ea6\uff0c\u5e94\u8be5\u5c3d\u53ef\u80fd\u505a\u81ea\u52a8\u5316\u3002
\u5982\u679c\u8fd9\u6761\u7528\u4f8b\u662f\u6bcf\u6b21\u56de\u5f52\u6d4b\u8bd5\u5fc5\u987b\u8981\u6267\u884c\u7684\u7528\u4f8b\uff0c\u90a3\u4e48\u8fd9\u6761\u7528\u4f8b\u5e94\u8be5\u5c3d\u53ef\u80fd\u5b9e\u73b0\u81ea\u52a8\u5316\u3002
\u56de\u5f52\u6d4b\u8bd5\u65f6\u6211\u4eec\u9996\u5148\u5e94\u8be5\u4fdd\u8bc1\u5e94\u7528\u5386\u53f2\u57fa\u672c\u529f\u80fd\u6b63\u5e38\uff0c\u6240\u4ee5\u90a3\u4e9b\u6bcf\u6b21\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u90fd\u8981\u6267\u884c\u7684\u7528\u4f8b\u9002\u5408\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u7528\u4f8b\u3002
\u6d89\u53ca\u6838\u5fc3\u529f\u80fd\u7684\u7528\u4f8b\u662f\u6700\u6700\u91cd\u8981\u7684\u7528\u4f8b\uff0c\u4e5f\u662f\u6211\u4eec\u4ea4\u4ed8\u65f6\u5fc5\u987b\u8981\u4fdd\u8bc1\u8d28\u91cf\u7684\u76f8\u5173\u529f\u80fd\uff0c\u56e0\u6b64\u5e94\u8be5\u5c3d\u53ef\u80fd\u7684\u8f6c\u5316\u4e3a\u81ea\u52a8\u5316\u3002
\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u901a\u5e38\u662f\u68c0\u9a8c\u88ab\u6d4b\u5e94\u7528\u63a5\u53d7\u6709\u6548\u6570\u636e\u3001\u62d2\u7edd\u65e0\u6548\u6570\u636e\u7684\u80fd\u529b\u3002\u5982\uff1a\u63d0\u4ea4\u8d85\u957f\u5b57\u7b26\u4e32\u3001\u7279\u6b8a\u5b57\u7b26\u4e32\u7b49\u7b49\u3002
\u6b64\u7c7b\u7528\u4f8b\u624b\u5de5\u6d4b\u8bd5\u5f88\u96be\u6bd4\u8f83\u5168\u9762\u7684\u8986\u76d6\u5230\u6240\u6709\u7684\u8f93\u5165\u60c5\u51b5\uff0c\u4f46\u662f\u5bf9\u4e8e\u81ea\u52a8\u5316\u6765\u8bb2\uff0c\u6b64\u7c7b\u7528\u4f8b\u64cd\u4f5c\u6b65\u9aa4\u90fd\u662f\u4e00\u6837\u7684\uff0c\u53d8\u5316\u7684\u4ec5\u662f\u8f93\u5165\u53c2\u6570\u548c\u65ad\u8a00\u7ed3\u679c\uff0c\u91c7\u7528\u6570\u636e\u9a71\u52a8\uff0c\u53ef\u4ee5\u8f7b\u677e\u5b9e\u73b0\u3002
\u539f\u56e0\u540c\u8f93\u5165\u6570\u636e\u6d4b\u8bd5\u7c7b\u7528\u4f8b\u4e00\u6837\uff0c\u591a\u79cd\u683c\u5f0f\u7684\u8986\u76d6\u4e5f\u662f\u4e00\u4e2a\u5f88\u7e41\u7410\u7684\u4e8b\u60c5\uff0c\u4ea4\u7ed9\u81ea\u52a8\u5316\u6765\u505a\u518d\u5408\u9002\u4e0d\u8fc7\u4e86\u3002
\u6bd4\u5982\u5f71\u9662\u5bf9\u5f71\u7247\u683c\u5f0f\u7684\u68c0\u67e5\u3001\u622a\u56fe\u5f55\u5c4f\u5bf9\u4fdd\u5b58\u683c\u5f0f\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002
\u67e5\u770b\u88ab\u6d4b\u5e94\u7528\u7684\u5143\u7d20\u5c5e\u6027\u3002\u5982\uff1a\u56fe\u7247\u7684\u5927\u5c0f\u548c\u6392\u5217\uff1b\u6309\u94ae\u7684\u53ef\u7528\u548c\u4e0d\u53ef\u7528\u3002
\u6b22\u8fce\u6240\u6709\u4eba\u63d0\u4ea4\u4f60\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u65b9\u9762\u7684\u4f18\u79c0\u5b9e\u8df5\u7ecf\u9a8c\uff0c\u4ee5\u5e2e\u52a9\u5927\u5bb6\u89e3\u51b3\u53ef\u80fd\u9047\u5230\u7684\u95ee\u9898\u3002
# litaoa@uniontech.com\n
\u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4
pytest \u5b9e\u73b0\u524d\u7f6e/\u540e\u7f6e\u6b65\u9aa4\u7684\u65b9\u5f0f\u6709\u4e24\u79cd\uff0cyield \u548c\u7ec8\u7ed3\u51fd\u6570\uff1b
yield \u5b9e\u73b0\uff0cyield\u524d\u9762\u4e3a\u7528\u4f8b\u7684\u524d\u7f6e\u6b65\u9aa4\uff0cyield \u540e\u9762\u4e3a\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4\u3002
@pytest.fixture\ndef clean_env():\nprint(\"setup\")\nyield\nprint(\"teardown\")\n
\u7ec8\u7ed3\u51fd\u6570\u5b9e\u73b0\uff0c\u4f7f\u7528 request.addfinalizer \u6ce8\u518c\u7528\u4f8b\u7684\u540e\u7f6e\u6b65\u9aa4
@pytest.fixture\ndef clean_env(request):\ndef clean():\nprint(\"teardown\")\nrequest.addfinalizer(clean)\nprint(\"setup\")\n
yield\u7684\u4f18\u7f3a\u70b9\uff1a
\u4f18\u70b9\uff1a\u4ee3\u7801\u7b80\u6d01\uff0c\u76f4\u89c2\uff0c\u53ef\u4f7f\u7528yield\u5728\u7528\u4f8b\u4e2d\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c
\u7f3a\u70b9\uff1a\u82e5\u524d\u7f6e\u6b65\u9aa4\u4e2d\u51fa\u73b0\u9519\u8bef\uff0c\u5219\u540e\u7f6e\u6b65\u9aa4\u4e0d\u4f1a\u6267\u884c
\u7ec8\u7ed3\u51fd\u6570\uff1a
\u4f18\u70b9\uff1a\u524d\u7f6e\u6b65\u9aa4\u5931\u8d25\u7684\u8bdd\uff0c\u540e\u7f6e\u6b65\u9aa4\u4ecd\u4f1a\u6267\u884c\u4e14\u53ef\u4ee5\u6ce8\u518c\u591a\u4e2a\u540e\u7f6e\u6b65\u9aa4\uff08\u524d\u63d0\uff1a\u9700\u8981\u5728\u4ee3\u7801\u62a5\u9519\u4e4b\u524d\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff09\uff0c\u652f\u6301\u7075\u6d3b\u4f7f\u7528\u540e\u7f6e\u6761\u4ef6
\u7f3a\u70b9\uff1a\u4ee3\u7801\u8f83\u4e3a\u590d\u6742\uff0c\u65e0\u6cd5\u83b7\u53d6\u524d\u7f6e\u6b65\u9aa4\u7684\u8fd4\u56de\u503c\uff08\u672c\u4eba\u76ee\u524d\u672a\u5b9e\u73b0\uff09
\u603b\u7ed3\uff1a\u5728\u524d\u7f6e\u6b65\u9aa4\u4fdd\u8bc1\u7edd\u5bf9\u4e0d\u4f1a\u51fa\u9519\u65f6\uff0c\u4f7f\u7528yield\u66f4\u4f73\u7b80\u4fbf\uff0c\u5f53\u524d\u7f6e\u6b65\u9aa4\u6613\u51fa\u73b0\u95ee\u9898\u65f6\uff0c\u63a8\u8350\u4f7f\u7528\u7ec8\u7ed3\u51fd\u6570\u3002
\u573a\u666f\uff1a\u4fdd\u9669\u7bb1\u7528\u4f8b\uff0c\u524d\u7f6e\u6b65\u9aa4\u4e2d\u5f00\u542f\u4fdd\u9669\u7bb1\uff0c\u540e\u7f6e\u6b65\u9aa4\u5220\u9664\u4fdd\u9669\u7bb1\u3002
@pytest.fixture(scope=\"session\", autouse=True)\ndef vault_fixture(request):\nDfmWidget.reset_vault_by_cmd() # 1\u3001\u91cd\u7f6e\u4fdd\u9669\u7bb1\nDdeDockPublicWidget().close_file_manager_by_cmd() # 2\u3001\u5173\u95ed\u6587\u7ba1\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 3\u3001\u5f00\u542f\u6587\u7ba1\nvault = DfmWidget()\nvault.create_file_vault() # 4\u3001\u521b\u5efa\u4fdd\u9669\u7bb1\ndef delete_vault(): # 8\u3001\u5220\u9664\u4fdd\u9669\u7bb1\u7684\u540e\u7f6e\u6b65\u9aa4\nsleep(2)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr()\nvault = DfmWidget()\nvault.delete_file_vault()\nDfmWidget.reset_vault_by_cmd()\nDdeDockPublicWidget().close_file_manager_by_cmd()\nrequest.addfinalizer(delete_vault) # 5\u3001\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\nDdeDockPublicWidget().close_file_manager_by_cmd() # 6\u3001\u5173\u95ed\u6587\u7ba1\nsleep(1)\nDdeDockPublicWidget().open_file_manager_in_dock_by_attr() # 7\u3001\u5f00\u542f\u6587\u7ba1\n
\u4ee3\u7801\u6309\u6ce8\u91ca\u4e2d\u7684\u5e8f\u53f7\u6267\u884c\u6b65\u9aa4
\u53ef\u4ee5\u7075\u6d3b\u6ce8\u518c\u540e\u7f6e\u6b65\u9aa4\uff0c\u80fd\u5b9e\u73b0\u67d0\u4e2a\u524d\u7f6e\u6b65\u9aa4\u6267\u884c\u4e4b\u540e\uff0c\u624d\u4f1a\u6267\u884c\u540e\u7f6e\u6b65\u9aa4\u3002
# huangmingqiang@uniontech.com\n
\uff081\uff09\u547d\u4ee4\u884c\u542f\u52a8
\u5728 AT \u4ee3\u7801\u4e2d\u4f7f\u7528\u547d\u4ee4\u884c\u542f\u52a8\u5e94\u7528\uff0c\u4e3e\u4f8b\uff1a
os.popen(\"deepin-music\")\n
\u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f7f\u7528 ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6\uff0cdogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u3002
dogtail
\uff082\uff09\u901a\u8fc7 UI \u64cd\u4f5c\u542f\u52a8
\u901a\u8fc7\u4efb\u52a1\u680f\u3001\u542f\u52a8\u5668\u3001\u684c\u9762\u7b49UI\u65b9\u5f0f\u542f\u52a8\uff0c\u6bd4\u5982\u53cc\u51fb\u6253\u5f00\u3001\u53f3\u952e\u6253\u5f00\u7b49\uff0c\u8fd9\u79cd\u64cd\u4f5c\u65b9\u5f0f\u4e0d\u5b58\u5728ssh \u8fdc\u7a0b\u6267\u884c\u7528\u4f8b\u65f6dogtail \u65e0\u6cd5\u83b7\u53d6\u5230\u5143\u7d20\u7684\u95ee\u9898\uff0c\u4e5f\u66f4\u52a0\u7b26\u5408\u7528\u6237\u7684\u64cd\u4f5c\u884c\u4e3a\u3002
\u6587\u4ef6\u9009\u62e9\u6846\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5728\u8c03\u7528\u6587\u4ef6\u9009\u62e9\u6846\u65f6\uff0c\u6709\u4e00\u5b9a\u7684\u6982\u7387\u51fa\u73b0\uff0c\u754c\u9762\u5df2\u7ecf\u6e32\u67d3\u51fa\u6765\u4e86\uff0c\u4f46\u662f\u5c5e\u6027\u6811\u5e76\u6ca1\u6709\u5199\u5165\uff0c\u5bfc\u81f4\u901a\u8fc7\u5c5e\u6027\u65e0\u6cd5\u627e\u5230\u5143\u7d20\uff0c\u76ee\u524d\u4e5f\u6ca1\u6709\u5f88\u597d\u7684\u89e3\u51b3\u65b9\u6848\uff0c\u4e3a\u4e86\u7528\u4f8b\u7a33\u5b9a\u6027\uff0c\u6587\u4ef6\u9009\u62e9\u6846\u7684\u64cd\u4f5c\u5efa\u8bae\u4f7f\u7528UI\u6216\u8005\u56fe\u7247\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u53ef\u4ee5\u901a\u8fc7\u641c\u7d22\u5185\u5bb9\u56fa\u5b9a\u6587\u4ef6\u4f4d\u7f6e\u3002
desk = DdeDesktopPublicWidget()\n# \u9009\u62e9\u89c6\u9891\u76ee\u5f55\ndesk.click_videos_dir_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.ctrl_f()\nsleep(1)\ndesk.input_message(\"\u5143\u7d20\u540d\u79f0\")\nsleep(0.5)\ndesk.enter()\nsleep(1)\n# \u9009\u62e9\u7b2c\u4e00\u4e2a\u6587\u4ef6\ndesk.click_list_view_btn_in_desktop_plugs_by_ui()\nsleep(1)\ndesk.click_first_file_in_desktop_plugs_by_ui()\nsleep(1)\n# \u6587\u7ba1\u63d2\u4ef6\u4e2d\u70b9\u51fb\u6253\u5f00\ndesk.click_open_btn_in_desktop_plugs_by_ui()\n
# mikigo\n
\u5728UI\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u4e00\u5207\u64cd\u4f5c\u7684\u90fd\u662f\u4ece\u5e94\u7528\u542f\u52a8\u5f00\u59cb\u7684\uff0c\u800c\u5728Linux\u684c\u9762\u5e94\u7528\u81ea\u52a8\u5316\u6d4b\u8bd5\u4e2d\uff0c\u6211\u4eec\u542f\u52a8\u5e94\u7528\u7684\u65b9\u6cd5\u6709\u591a\u79cd\uff0c\u4e0b\u9762\u505a\u4e00\u4e2a\u7b80\u5355\u7684\u4ecb\u7ecd\uff1a
\u3010\u4f7f\u7528dogtail\u542f\u52a8\u3011
dogtail\u63d0\u4f9b\u4e86\u5e94\u7528\u542f\u52a8\u7684\u65b9\u6cd5\uff0c\u5728utils\u5e93\u4e2d\uff0c\u4f7f\u7528run\u65b9\u6cd5\u542f\u52a8\uff1a
\u9996\u5148\u5bfc\u5165\u65b9\u6cd5\uff1a
from dogtail.utils import *\n
\u8c03\u7528run\u65b9\u6cd5
run('deepin-music')\n
\u5373\u53ef\u542f\u52a8\u97f3\u4e50
\u8fd9\u79cd\u65b9\u6cd5\u7684\u4f18\u70b9\u662f\u91c7\u7528\u8fdb\u7a0b\u7684\u65b9\u5f0f\u76f4\u63a5\u542f\u52a8\uff0c\u4e0d\u4f9d\u8d56\u4e0eUI\uff0c\u65e0\u8bba\u684c\u9762\u6216\u4efb\u52a1\u680f\u4e0a\u662f\u5426\u5b58\u5728\u5e94\u7528\u56fe\u6807\uff0c\u90fd\u53ef\u4ee5\u6b63\u5e38\u542f\u52a8\u3002
\u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c
\u5982\u679c\u4f7f\u7528ssh\u8fdc\u7a0b\u8c03\u7528\uff0c\u6216\u8005Jenkins\u4e2d\u6267\u884c\u6d4b\u8bd5\u811a\u672c\u7684\u65f6\u5019\uff0c\u5728sniff\u4e2d\u4f1a\u51fa\u73b0\u627e\u4e0d\u5230\u5e94\u7528\uff0c\u7ecf\u8fc7\u5206\u6790\uff0c\u53ef\u80fd\u662f\u56e0\u4e3a\u4f7f\u7528\u8fd9\u79cd\u65b9\u6cd5\u542f\u52a8\u7684\u65f6\u5019\uff0c\u5b9e\u9645\u662f\u91c7\u7528\u4e00\u4e2a\u5b50\u8fdb\u7a0b\u542f\u52a8\u4e86\u5e94\u7528\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u5230\u3002
\u3010\u4ece\u4efb\u52a1\u680f\u542f\u52a8\u3011
\u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807
\u901a\u5e38\u6709\u4e24\u79cd\u65b9\u6cd5\uff1a
\uff081\uff09\u4f7f\u7528dogtail\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u5e94\u7528\u56fe\u6807\u3002
\uff082\uff09\u5df2\u77e5\u5e94\u7528\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u7684\u4f4d\u7f6e\uff0c\u7136\u540e\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u5bf9\u5e94\u5750\u6807\u3002
\u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u7f3a\u70b9\u662f\u4f4d\u7f6e\u5fc5\u987b\u56fa\u5b9a\uff0c\u5982\u679c\u79fb\u52a8\u4f4d\u7f6e\u5c31\u4e0d\u884c\u4e86\uff0c\u800c\u4f7f\u7528\u7b2c\u4e00\u79cd\u65b9\u6cd5\uff0c\u65e0\u8bba\u4f4d\u7f6e\u5728\u54ea\u91cc\uff0c\u53ea\u8981\u56fe\u6807\u5728\u4efb\u52a1\u680f\u4e0a\u5b58\u5728\u5373\u53ef\u3002
\u3010\u70b9\u51fb\u684c\u9762\u56fe\u6807\u542f\u52a8\u3011
\u684c\u9762\u56fe\u6807\u76ee\u524d\u662f\u91c7\u7528\u56fe\u50cf\u8bc6\u522b\u6280\u672f\uff0c\u5b9a\u4f4d\u5230\u5e94\u7528\u56fe\u6807\u7684\u5750\u6807\uff0c\u7136\u540e\u901a\u8fc7pyauogui\u8fdb\u884c\u70b9\u51fb\u64cd\u4f5c\u3002
\u8be6\u7ec6\u6280\u672f\u65b9\u6848\u53ef\u4ee5\u53c2\u8003\u6211\u7684\u53e6\u5916\u4e24\u7bc7\u535a\u5ba2:
\u57fa\u4e8eopencv\u7684\u6a21\u677f\u5339\u914d\u5b9e\u73b0\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd4\u56de\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807
Python\u4e09\u65b9\u5e93PyAutoGui\u7684\u4f7f\u7528\u65b9\u6cd5
\u3010\u4ece\u542f\u52a8\u5668\u542f\u52a8\uff08\u4fd7\u79f0\u5f00\u59cb\u83dc\u5355\uff09\u3011
\u542f\u52a8\u4e2d\u542f\u52a8\u7684\u5b9e\u73b0\u903b\u8f91\u5b9e\u9645\u548c\u4efb\u52a1\u680f\u4e0a\u542f\u52a8\u5dee\u4e0d\u591a\u3002
\u9996\u5148\uff0c\u9700\u8981\u4f7f\u7528\u9f20\u6807\u70b9\u51fb\u4efb\u52a1\u680f\u4e0a\u7684\u542f\u52a8\u5668\u56fe\u6807\uff0c\u6216\u8005\u952e\u76d8super\u952e\uff0c\u5c06\u542f\u52a8\u5668\u547c\u51fa\u6765\uff0c
\u7136\u540e\uff0c\u5728\u542f\u52a8\u5668\u4e2d\u70b9\u51fb\u5bf9\u5e94\u7684\u56fe\u6807\uff0c
\u4f46\u662f\u8fd9\u91cc\u6709\u4e2a\u95ee\u9898\uff0c\u542f\u52a8\u5668\u4e2d\u7684\u5e94\u7528\u5217\u8868\uff0c\u4e00\u9875\u5c55\u793a\u4e0d\u5b8c\uff0c\u6240\u4ee5\u5982\u679c\u6211\u4eec\u8981\u70b9\u51fb\u7684\u5e94\u7528\u56fe\u6807\u4e0d\u5728\u7b2c\u4e00\u9875\u600e\u4e48\u529e\uff0c\u901a\u5e38\u89e3\u51b3\u65b9\u6848\u6709\u4e24\u79cd\uff1a
\uff081\uff09\u9700\u8981\u8fdb\u884c\u5411\u4e0b\u6ed1\u52a8\uff0c\u8fd9\u91cc\u5c31\u6d89\u53ca\u5230\u76f8\u5e94\u7684\u8bc6\u522b\u65b9\u6848\uff0c\u5224\u65ad\u5982\u679c\u4e0d\u5728\u7b2c\u4e00\u9875\u5c31\u5f80\u4e0b\u6ed1\u52a8\u7ffb\u9875\u3002
\uff082\uff09\u542f\u52a8\u5668\u63d0\u4f9b\u641c\u7d22\u7684\u529f\u80fd\uff0c\u8f93\u5165\u5e94\u7528\u540d\u79f0\u641c\u7d22\uff0c\u7136\u540e\u8fdb\u884c\u70b9\u51fb\u3002
\u4ece\u5b9e\u9645\u64cd\u4f5c\u4e2d\u6765\u770b\uff0c\u91c7\u7528\u7b2c\u4e8c\u79cd\u65b9\u6cd5\u7684\u6548\u7387\u4f1a\u9ad8\u4e00\u70b9\u3002
\u3010\u7ec8\u7aef\u547d\u4ee4\u542f\u52a8\u3011
\u5728python\u4e2d\uff0c\u4f7f\u7528os.popen()\u6216os.system()\u6216\u8005subprocess.Popen()\uff0c\u5b9e\u73b0\u547d\u4ee4\u884c\u542f\u52a8\uff0c\u6bd4\u5982\uff1a
import os\nos.popen('deepin-music')\n
\u8fd9\u79cd\u65b9\u5f0f\u542f\u52a8\u662f\u6bd4\u8f83\u7b80\u5355\u7684\uff0c\u4f46\u662f\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff0c\u4ecd\u7136\u5b58\u5728\u8fdc\u7a0b\u6267\u884c\u811a\u672c\u7684\u65f6\u5019\uff0cdogtail\u65e0\u6cd5\u8bc6\u522b\u7684\u95ee\u9898\u3002
\u3010\u603b\u7ed3\u3011
\u4ee5\u4e0a\u51e0\u79cd\u65b9\u6cd5\uff0c\u5404\u6709\u4f18\u7f3a\u70b9\uff0c\u5728\u5b9e\u9645\u9879\u76ee\u4e2d\uff1a
\uff081\uff09\u5982\u679c\u9700\u8981\u5728Jenkins\u4e2d\u505a\u6301\u7eed\u96c6\u6210\uff0c\u5efa\u8bae\u4f7f\u7528\u7b2c\u4e8c\u79cd\u4efb\u52a1\u680f\u542f\u52a8\u7684\u65b9\u6cd5\u3002
\uff082\uff09\u5982\u679c\u4e0d\u4f1a\u91c7\u7528\u8fdc\u7a0b\u6267\u884c\u7684\uff0c\u5efa\u8bae\u91c7\u7528\u7b2c\u4e00\u79cd\u6216\u8005\u6700\u540e\u4e00\u79cd\u65b9\u6848\u3002
\uff083\uff09\u7b2c\u4e09\u79cd\u548c\u7b2c\u56db\u79cd\u542f\u52a8\u65b9\u6cd5\uff0c\u901a\u5e38\u5728\u6d4b\u8bd5\u7528\u4f8b\u4e2d\u4f1a\u6d89\u53ca\u5230\uff0c\u6240\u4ee5\u5076\u5c14\u4f1a\u7528\u3002
\u4fee\u590d SW \u67b6\u6784\u73af\u5883\u4f9d\u8d56\u7684\u95ee\u9898\uff0c\u539f\u56e0\u662f\u4e4b\u524d\u6211\u8fd9\u91cc\u672c\u5730\u6ca1\u6709 SW \u7684\u673a\u5668\uff0c\u6ca1\u6709\u505a\u76f8\u5173\u9002\u914d\uff1b
\u4fee\u590d\u5b50\u9879\u76ee\u5355\u72ec\u9700\u8981\u4e09\u65b9\u5305 pexpect\uff0c\u7531\u4e8e\u4e4b\u524d\u662f\u9884\u88c5\u5230\u955c\u50cf\u91cc\u9762\u7684\uff0c\u4f46\u57fa\u7840\u6846\u67b6\u4e0d\u9700\u8981\uff0c\u56e0\u6b64\u6ca1\u6709\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u91cc\u9762\uff0c\u5bfc\u81f4\u5b50\u9879\u76ee\u4f9d\u8d56\u62a5\u9519\u3002
pexpect
\u4fee\u590d\u5b50\u9879\u76ee cv \u5bfc\u5165\u62a5\u9519\u7684\u95ee\u9898\uff1b
\u539f\u56e0\u4e3a\uff1ayouqu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u517c\u5bb9\u4e24\u79cd\u60c5\u51b5\uff0c\u4e00\u79cd\u662f\u9762\u5411\u670d\u52a1\uff0c\u5c31\u662f\u672c\u5730\u6d4b\u8bd5\u673a\u4e0d\u9700\u8981\u5b89\u88c5 OpenCV\uff0c\u7528\u4f8b\u4e2d\u7684\u56fe\u50cf\u8bc6\u522b\u4f1a\u901a\u8fc7\u8fdc\u7a0b\u670d\u52a1\u63a5\u53e3\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u548c\u7ed3\u679c\u83b7\u53d6\uff1b\u7b2c\u4e8c\u79cd\u662f\u539f\u751f\uff0c\u5c31\u662f\u672c\u5730\u76f4\u63a5\u5b89\u88c5 OpenCV \u76f4\u63a5\u7528\u3002\u4e24\u4e2a\u60c5\u51b5\u7684\u4f18\u5148\u7ea7\u662f\u4f18\u5148\u5224\u65ad\u672c\u5730\u5b58\u5728\uff0c\u5426\u5219\u8d70\u670d\u52a1\u3002
OpenCV
\u524d\u9762\u6211\u4eec\u5df2\u7ecf\u628a OCR \u529f\u80fd\u505a\u4e86\u670d\u52a1\u5316\uff0c\u57fa\u4e8e 1 \u5e74\u591a\u4ee5\u6765\u7684\u89c2\u5bdf\uff0c\u7528\u8d77\u6765\u5f88\u7a33\u5b9a\uff0c\u518d\u4e00\u4e2a\u5c31\u662f OpenCV \u5b89\u88c5\u5305\u662f\u6bd4\u8f83\u81c3\u80bf\u7684\uff0c\u7c97\u7565\u6570\u4e86\u4e0b\u4f9d\u8d56\u6709 30+ \u4e2a\uff0c\u800c\u4e14\u5728\u5404\u67b6\u6784\u4e0a\u4f9d\u8d56\u5305\u8fd8\u4e0d\u5c3d\u76f8\u540c\uff0c\u88c5\u8f7d\u5230\u865a\u62df\u73af\u5883\u65b9\u6848\u4e2d\u4e0d\u592a\u597d\u5904\u7406\uff0c\u6240\u4ee5\u672c\u6b21 2.0 \u7248\u672c\u6211\u4eec\u5927\u80c6\u7684\u5c06\u56fe\u50cf\u8bc6\u522b\u7684\u9ed8\u8ba4\u529f\u80fd\u4fee\u6539\u4e3a\u9762\u5411\u670d\u52a1\u7684\u65b9\u5f0f\uff0c\u524d\u671f\u6d4b\u8bd5\u4e00\u5207\u770b\u8d77\u6765\u90fd\u5f88\u548c\u8c10\u3002
30+
\u4f46\u662f\u6ca1\u6ce8\u610f\u5230\u4e4b\u524d\u7ed9\u6d77\u71d5\u59d0\u90a3\u8fb9\u9879\u76ee\u5355\u72ec\u5b9a\u5236\u505a\u4e86\u4e2a\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\uff08\u4e3a\u4e86\u80fd\u7b80\u5355\u5e73\u6ed1\u7684\u8fc1\u79fb\u5230 youqu\uff09\uff0c\u6b64\u63a5\u53e3\u5e95\u5c42\u6ca1\u6709\u517c\u5bb9\u670d\u52a1\u5316\uff0c\u6240\u4ee5\u5979\u90a3\u8fb9\u7684\u9879\u76ee\u8c03\u7528\u6b64\u5b9a\u5236\u63a5\u53e3\u4f1a\u62a5 cv \u5bfc\u5165\u7684\u95ee\u9898\u3002
\u7531\u4e8e\u5c06\u8fd9\u4e2a\u5b9a\u5236\u56fe\u50cf\u8bc6\u522b\u63a5\u53e3\u8fdb\u884c\u670d\u52a1\u5316\u517c\u5bb9\u6539\u9020\u9700\u8981\u4e00\u5b9a\u65f6\u95f4\uff0c\u6539\u5b8c\u8fd8\u9700\u8981\u6d4b\u8bd5\uff0c\u4f46\u672c\u6b21\u65f6\u95f4\u6bd4\u8f83\u7d27\uff0c\u56e0\u6b64\u5148\u628a OpenCV \u88c5\u8fdb\u865a\u62df\u73af\u5883\uff0c\u540e\u7eed\u7248\u672c\u518d\u8003\u8651\u9488\u5bf9\u6b64\u63a5\u53e3\u505a\u4fee\u6539\u3002
YouQu\uff08\u81ea\u52a8\u5316\u6d4b\u8bd5\u57fa\u7840\u6846\u67b6\uff09\u5f00\u6e90\u4e86\uff0c\u540c\u65f6\u63a8\u51fa\u4e86 2.0 \u7248\u672c\u3002
YouQu
\u611f\u8c22\u738b\u6ce2\u603b\u3001\u67b6\u6784\u5e08\u5f90\u5c0f\u4e1c\u3001\u7814\u53d1\u7ecf\u7406\u90d1\u5e7c\u6208\u3001\u5218\u90d1\u7b49\u7814\u53d1\u540c\u4e8b\u7684\u5927\u529b\u652f\u6301\u3002
1\u3001\u65b0\u7684\u57fa\u7840\u6846\u67b6\u4ee3\u7801\u83b7\u53d6\u65b9\u5f0f\u53ca\u65b0\u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4
YouQu \u540e\u7eed\u5747\u901a\u8fc7 PyPI \u8fdb\u884c\u5305\u7684\u53d1\u5e03\uff0c\u4e5f\u5c31\u662f\u8bf4\u540e\u7eed\u53ef\u4ee5\u4f7f\u7528 pip \u8fdb\u884c\u5b89\u88c5\uff1a
PyPI
sudo pip3 install youqu==2.0.0\n
\u8fd9\u91cc\u6709 2 \u4e2a\u5c0f\u70b9\u8981\u6ce8\u610f\uff1a
sudo pip3
\u5982\u679c\u4e0d\u52a0 sudo \u6709\u4e9b\u673a\u5668\u53ef\u80fd $HOME/.local/bin \u4e0d\u5728\u7cfb\u7edf PATH \u73af\u5883\u76ee\u5f55\u4e0b\uff0c\u5728\u4e0d\u6dfb\u52a0\u73af\u5883\u53d8\u91cf\u7684\u60c5\u51b5\u4e0b\uff0c\u4f1a\u51fa\u73b0 YouQu \u7684\u521d\u59cb\u5316\u5de5\u7a0b\u547d\u4ee4\uff08youqu-startproject\uff09\u65e0\u6cd5\u4f7f\u7528\u7684\u95ee\u9898\uff1b
$HOME/.local/bin
\u5f53\u7136\uff0c\u5c06\u4e0a\u8ff0\u8def\u5f84\u6dfb\u52a0\u5230\u73af\u5883\u53d8\u91cf\u4e4b\u540e\u4e5f\u662f\u53ef\u4ee5\u7528\u7684\uff0c\u6240\u4ee5\u6211\u8fd9\u91cc\u662f\u63a8\u8350\u52a0 sudo\uff0c\u4e0d\u52a0 sudo \u4e5f\u662f\u53ef\u4ee5\u7684\uff0c\u53ea\u662f\u9700\u8981\u5173\u6ce8\u4e0b\u73af\u5883\u53d8\u91cf\u7684\u95ee\u9898\u3002
\u5b89\u88c5\u4e4b\u540e\u4f1a\u81ea\u52a8\u751f\u6210\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu-startproject\uff0c\u4f7f\u7528\u5b83\u53ef\u4ee5\u521d\u59cb\u5316\u5de5\u7a0b\uff0c\u8fd9\u91cc\u4ee5\u97f3\u4e50\u4e3e\u4f8b\uff1b
youqu-startproject autotest_deepin_music\n
\u8fd9\u6837\u5c31\u4f1a\u5728\u5f53\u524d\u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a autotest_deepin_music \u76ee\u5f55\uff0c\u91cc\u9762\u5305\u542b\u4e86\u57fa\u7840\u6846\u67b6\u6240\u6709\u7684\u4ee3\u7801\uff1b
\u4e4b\u540e\uff0c\u8fd8\u662f\u5728 apps \u76ee\u5f55\u4e0b\uff0c\u653e\u5165\u5b50\u9879\u76ee\u7684AT\u4ee3\u7801\u5373\u53ef\uff0c\u4f7f\u7528\u65b9\u6cd5\u548c\u8fc7\u53bb\u4e00\u6837\uff0c\u8fd9\u91cc\u5c31\u4e0d\u591a\u4ecb\u7ecd\u3002
\u53e6\u5916\uff0c\u9664\u4e86\u901a\u8fc7 pip \u83b7\u53d6\u4ee5\u5916\uff0c\u4ecd\u7136\u53ef\u4ee5\u901a\u8fc7\u6e90\u7801\u83b7\u53d6\uff08\u76f4\u63a5 git clone\uff09\u3002
\u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u4f7f\u7528 pip \u5b89\u88c5 YouQu \u65f6\uff0cYouQu \u5305\u7684\u5927\u5c0f\u624d 600+ k\uff0c\u5b89\u88c5\u901f\u5ea6\u8d77\u98de\u3002
600+
2\u3001\u65b0\u7684AT\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848
\u4e3a\u4e86\u89e3\u51b3\u4ee5\u4e0b\u95ee\u9898\uff1a
\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u4f7f\u7528\u65b9\u6cd5\uff1a
bash env.sh\n
\u53ef\u4ee5\u770b\u51fa\u6765\u548c\u539f\u6765\u4f7f\u7528\u65b9\u6cd5\u6ca1\u6709\u53d8\u5316\uff0c\u4e5f\u5c31\u662f\u8bf4\u4ece\u4f7f\u7528\u7684\u89d2\u5ea6\u662f\u5b8c\u5168\u6ca1\u6709\u533a\u522b\u7684\uff0c\u53ea\u662f\u5185\u90e8\u505a\u4e86\u4e0d\u540c\u7684\u4e8b\u60c5\u3002
\u503c\u5f97\u4e00\u63d0\u7684\u662f\uff0c\u672c\u673a\u90e8\u7f72\u7684\u529f\u80fd\u4ecd\u7136\u4fdd\u7559 env_dev.sh\uff0c\u53ef\u4ee5\u4f5c\u4e3a\u5f00\u53d1\u65f6\u7684\u73af\u5883\u90e8\u7f72\u3002
3\u3001\u65b0\u7684\u9a71\u52a8\u547d\u4ee4
\u8fc7\u53bb\u54b1\u4eec\u90fd\u662f\u4f7f\u7528\u8fd9\u6837\u7684\u547d\u4ee4\u6765\u9a71\u52a8\u6267\u884c\uff1a
python3 manage.py run\n
\u7531\u4e8e\u9ed8\u8ba4\u57fa\u4e8e\u865a\u62df\u5316\u73af\u5883\u90e8\u7f72\u65b9\u6848\uff0c\u56e0\u6b64\u6211\u4eec\u589e\u52a0\u4e86\u4e00\u4e2a\u7cfb\u7edf\u547d\u4ee4 youqu\uff1b
\u65b0\u7684\u9a71\u52a8\u65b9\u5f0f\uff1a
\u53ea\u9700\u8981\u628a python3 \u66ff\u6362\u6210 youqu \u5c31\u53ef\u4ee5\u4e86\uff0c\u770b\u8d77\u6765\u5f88\u548c\u8c10~
4\u3001\u65b0\u7684\u6587\u6863\u5730\u5740
\u8fc7\u53bb\u54b1\u4eec YouQu \u7684\u5728\u7ebf\u6587\u6863\u662f\u90e8\u7f72\u5728\u516c\u53f8\u5185\u7f51\u7684\uff0c\u73b0\u5728\u5f00\u6e90\u5230 github \u4e86\uff0c\u5916\u90e8\u5f00\u53d1\u8005\u80af\u5b9a\u8bbf\u95ee\u4e0d\u5230\u5185\u7f51\u7684\u6587\u6863\uff0c\u56e0\u6b64\u9700\u8981\u5c06\u6587\u6863\u90e8\u7f72\u5230\u516c\u7f51\u3010\u516c\u7f51\u6587\u6863\u3011\uff1b
\u516c\u7f51\u6587\u6863\u4f7f\u7528\u7684\u662f github pages\uff08\u767d\u5ad6\u602a\u4e00\u987f\u72c2\u559c~~\uff09\uff0c\u4f46\u53ef\u80fd\u4f1a\u51fa\u73b0\u6587\u6863\u901f\u5ea6\u6162\u7684\u95ee\u9898\uff08\u4ee3\u7406\u4e0b\u5c31\u597d\u4e86\uff09\uff0c\u4e0d\u8fc7\u6ca1\u5173\u7cfb\uff0c\u54b1\u4eec\u3010\u5185\u7f51\u6587\u6863\u3011\u4ecd\u7136\u4fdd\u7559\uff0c\u6587\u6863\u5185\u5bb9\u4e00\u6837\uff0c\u8bbf\u95ee\u901f\u5ea6\u66f4\u5feb\u3002
5\u3001\u5176\u4ed6\u4e00\u4e9b\u5c0f\u5c0f\u529f\u80fd\u66f4\u65b0\uff1a
\uff081\uff09\u65b0\u589e\u5173\u95ed\u5206\u8fa8\u7387\u68c0\u6d4b\u7684\u53c2\u6570\u503c\uff1b
youqu manage.py run --resolution no\n
\u6216\u8005\u4fee\u6539 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a
;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387, \u6bd4\u5982\uff1a1920x1080\n;no: \u8868\u793a\u4e0d\u505a\u5206\u8fa8\u7387\u6821\u9a8c\nRESOLUTION = 1920x1080\n
resolution \u8fd9\u4e2a\u53c2\u6570\u4e00\u76f4\u90fd\u6709\u7684\uff0c\u53ea\u4e0d\u8fc7\u4e4b\u524d\u662f\u7528\u4e8e\u6307\u5b9a\u5206\u8fa8\u7387\u5927\u5c0f\uff0c\u6bd4\u5982 --resolution 1920x1080\uff0c\u4f46\u6709\u4e9b\u63a5\u53e3\u7684\u9879\u76ee\u4e0d\u9700\u8981\u8fd9\u4e2a\u68c0\u67e5\uff0c\u53ef\u4ee5\u7ed9\u5b83\u4e2a no \u5c31\u597d\u4e86\uff0c\u5f53\u7136 CICD \u4e0a\u5173\u95ed\uff0c\u9700\u8981\u6d41\u6c34\u7ebf\u4e0a\u628a\u8fd9\u4e2a\u53c2\u6570\u52a0\u4e0a\uff1b
resolution
--resolution 1920x1080
\uff082\uff09\u65b0\u589e\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u7684\u547d\u4ee4\u884c\u53c2\u6570
\u4e4b\u524d\u8fd9\u4e2a\u914d\u7f6e\u9879\u53ea\u80fd\u5728 setting/globalconfig.ini \u91cc\u9762\u7684\u914d\u7f6e\uff1a
;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c 1 \u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff0cRERUN >= RECORD_FAILED_CASE\u3002\n;1.\u5173\u95ed\u5f55\u5c4f\uff1aRECORD_FAILED_CASE > RERUN\n;2.\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1aRECORD_FAILED_CASE = 0\nRECORD_FAILED_CASE = 1\n
\u73b0\u5728\u5c06\u5f00\u53d1\u5230\u547d\u4ee4\u884c\u53c2\u6570\u3002
youqu manage.py run --record_failed_case 2\n
env.sh
Python
wayland_autotool
.Xauthority
\u4f18\u5316\u8fdc\u7a0b\u6267\u884c remote \u7684\u53c2\u6570\u76f4\u63a5\u4f20\u7ed9\u8fdc\u7a0b\u673a\u5668\u7684 run \u547d\u4ee4\uff0c\u4e0d\u7528\u518d\u5355\u72ec\u5904\u7406\u8fdc\u7a0b\u6267\u884c\u7684\u53c2\u6570\u903b\u8f91\uff0c\u540e\u7eed\u4e13\u6ce8\u4e8e\u672c\u5730\u6267\u884c\u529f\u80fd\u5f00\u53d1\uff0c\u8fdc\u7a0b\u6267\u884c\u81ea\u52a8\u9002\u7528\uff1b
run
env.sh \u79fb\u9664 pyyaml \u5b89\u88c5\uff0c\u7531\u5b50\u9879\u76ee\u5728 requirement.txt \u91cc\u9762\u5b9a\u4e49\uff0c\u6846\u67b6\u81ea\u52a8\u52a0\u8f7d\uff1b
pyyaml
requirement.txt
\u4f18\u5316\u4e86 env.sh \u5b89\u88c5 Python \u7684\u4e09\u65b9\u6e90\uff1b
pypi
numpy
pdocr-rpc 2.0.1\nallure-custom 1.2.1\nfunnylog 1.1.3\n
-f
pubilic/dde_desktop_public_widget
pycreeze
0.1.29
pyautogui
0.9.53
0.1.28
--app
~$: youqu run -a deepin-music\n~$: youqu run -a autotest_deepin_music\n~$: youqu run -a apps/autotest_deepin_music\n
\u200b \u540e\u4e24\u79cd\u5165\u53c2\u65b9\u5f0f\u53ef\u4ee5\u5f88\u65b9\u4fbf\u5728\u8f93\u5165\u547d\u4ee4\u7684\u8fc7\u7a0b\u4e2d\u4f7f\u7528\u8865\u5168\u3002
user@ip:password
password
CLIENT_PASSWORD
uos@10.8.13.33:1
uos@10.8.13.33
python3 manage.py remote -c uos@10.8.13.33/uos@10.8.13.34\npython3 manage.py remote -c uos@10.8.13.33:1/uos@10.8.13.34:2\n
python3-dev
deb
1060
pylint.sh
bash pylint.sh apps/autotest_deepin_music
youqu-pylint
youqu-pylint apps/autotest_deepin_music
dbus
other_widget.py
ssh
youqu remote xxx
Ctrl + C
image_utils.py::ImageUtil::get_during
[x, y, w, h]
pypinyin
session_timeout
timeout
sessiontimeout
python3 manage.py
youqu run -a deepin-music -k 001\n
RPC
--count
1.1.4 \u7248\u672c\u9002\u914d\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\u4e14\u65b0\u589e\u4e86\u8f83\u591a\u65b0\u7279\u6027\uff0c\u6211\u4eec\u8ba1\u5212\u4f7f\u7528 1.1.4 \u7248\u672c\u8fd0\u884c\u4e00\u6bb5\u65f6\u95f4\uff0c1.2.0 \u7248\u672c\u5c06\u4fee\u590d\u671f\u95f4\u51fa\u73b0\u7684 Bug\uff0c\u7136\u540e\u4f5c\u4e3a\u7a33\u5b9a\u7248\u672c\u53d1\u5e03\u3002
\u65b0\u589e startapp \u5b50\u547d\u4ee4\u521b\u5efa\u5b50\u9879\u76ee\u5de5\u7a0b\u6a21\u677f: python3 manage.py startapp autotest_deepin_xxx
startapp
python3 manage.py startapp autotest_deepin_xxx
\u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u91cd\u590d\u6267\u884c\u6b21\u6570\uff1b
\u53bb\u6389\u6279\u91cf\u6267\u884c\u524d\u6536\u96c6\u7528\u4f8b\u7684\u6b65\u9aa4\uff1b
\u589e\u52a0\u5f00\u59cb\u6267\u884c\u65f6\u6253\u5370\u4e00\u4e9b\u6267\u884c\u53c2\u6570\uff0c\u5982\uff1a
\u7528\u4f8b\u6536\u96c6\u6570\u91cf: 99\n\u5931\u8d25\u91cd\u8dd1\u6b21\u6570: 1\n\u6700\u5927\u5931\u8d25\u6b21\u6570: 49\n\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4: 200.0s (03\u520620\u79d2)\n\u4f1a\u8bdd\u8d85\u65f6\u65f6\u95f4: 11880s (3\u5c0f\u65f618\u52060\u79d2)\n
\u5b9a\u5236\u4fee\u6539allure\u62a5\u544alogo\u3001title\u3001\u9ed8\u8ba4\u8bed\u8a00\uff1b
manage.py \u6267\u884c\u5f00\u59cb\u65f6\u6253\u5370 logo \u548c\u5f53\u524d\u7248\u672c\uff1a
\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2588\u2588\u2588\u2588\u2557 \u2588\u2588\u2557 \u2588\u2588\u2557 \u255a\u2588\u2588\u2557 \u2588\u2588\u2554\u255d \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2554\u2550\u2550\u2550\u2588\u2588\u2557 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2554\u255d \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551\u2584\u2584 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u2588\u2588\u2551 \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2588\u2588\u2588\u2588\u2588\u2588\u2554\u255d \u255a\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u255a\u2550\u2550\u2580\u2580\u2550\u255d \u255a\u2550\u2550\u2550\u2550\u2550\u255d \u2584\u2588 \u2584\u2588 \u2588 \u2588 \u2588 \u2584 \u2588 \u2584 \u2580\u2580\u2588
\u65b0\u589e\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\uff1b
\u88c5\u9970\u5668\u65b9\u6cd5\u6307\u5b9a\u6b21\u6570\uff1b
@pytest.mark.count(2)\ndef test_music_001():\npass\n
\u547d\u4ee4\u884c\u53c2\u6570\u6307\u5b9a\u6b21\u6570\uff1b
python3 manage.py run -a deepin-music -k 001 --count 2\n
\u200b image_utils \u589e\u52a0\u51fd\u6570 save_temporary_picture\uff0c\u652f\u6301\u6307\u5b9a\u5c4f\u5e55\u533a\u57df\u622a\u56fe\u5e76\u8fd4\u56de\u56fe\u7247\u5b58\u653e\u7684\u672c\u5730\u8def\u5f84\uff0c\u540e\u7eed\u4f7f\u7528 assert_image_exist \u8fdb\u884c\u65ad\u8a00
Python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(x, y, width, height) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path)
button_center \u65b0\u589e btn_size \u83b7\u53d6\u63a7\u4ef6\u5de6\u4e0a\u89d2\u5750\u6807\u53ca\u957f\u5bbd\uff0c\u7528\u4e8e\u52a8\u6001\u7684\u622a\u53d6\u5143\u7d20\u7684\u56fe\u7247\uff0c\u53ef\u7528\u4e8e\u5b9a\u4f4d\u65ad\u8a00
python def test_music_001(self): pic_path = DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u6240\u6709\u97f3\u4e50\u6309\u94ae\")) ...... # \u4e2d\u95f4\u64cd\u4f5c self.assert_image_exit(pic_path)
allure \u62a5\u544a\u4e2d\u5b9a\u4f4d\u95ee\u9898\u9664\u4e86\u65e5\u5fd7\u3001\u622a\u56fe\u3001\u5f55\u5c4f\u5916\uff0c\u8c03\u7528\u7684\u51fd\u6570\u589e\u52a0\u4e86 step \u6b65\u9aa4\u5c55\u793a\uff1b
env.sh \u65b0\u589e\u5b89\u88c5\u5b50\u9879\u76ee Python \u4e09\u65b9\u4f9d\u8d56\uff0c\u5728\u5b50\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u5199 requirement.txt \u6587\u4ef6\uff0cenv.sh \u4f1a\u81ea\u52a8\u52a0\u8f7d\uff1b
ocr \u8bc6\u522b\u65b0\u589e\u652f\u6301\u4f20\u5165\u76ee\u6807\u56fe\u7247\u8def\u5f84\u8fdb\u884c\u6587\u5b57\u8bc6\u522b\uff0c\u51cf\u5c11\u56e0\u5168\u5c4f\u8bc6\u522b\u65f6\uff0c\u5176\u4ed6\u6587\u5b57\u7684\u5e72\u6270
Python # \u65ad\u8a00\u97f3\u4e50\u7684\u5220\u9664\u5f39\u7a97\u4e2d\uff0c\u5305\u542b\u4e86\u201c\u786e\u8ba4\u201d\u7684\u6587\u5b57 self.assert_ocr_exist(\"\u786e\u8ba4\", picture_abspath=DeepinMusicWidget.save_temporary_picture(*DeepinMusicWidget().ui.btn_size(\"\u5220\u9664\u5f39\u7a97\")))
\u65ad\u8a00\u51fd\u6570\u7684\u8c03\u7528\u4e5f\u4f1a\u81ea\u52a8\u6253\u5370\u65e5\u5fd7;
env.sh \u65b0\u589e\u88c1\u526a\u4f9d\u8d56\u7684\u65b9\u6848\uff1b
Jenkins
auotest_deepin_xxx@tmp
case_list.csv
uos_ci.py
--top {number}
report/logs/top.log
sniff
src,setting,public
allure
allure_back
--lastfailed
.gitmodules
README.md
call
\u786e\u8ba4\u4fee\u590d
fixed-xxx
DEBUG
loguru
logging
coredump
\u65b0\u589e RELEASE.md \u6587\u4ef6\uff0c\u7528\u4e8e\u8bb0\u5f55\u5386\u53f2\u53d1\u5e03\u7248\u672c\u7684\u66f4\u65b0\u5185\u5bb9\uff1b
RELEASE.md
\u517c\u5bb9 Wayland \u6a21\u5f0f\u4e0b\u6267\u884c\u7528\u4f8b\uff0c\u4e0a\u5c42\u7528\u4f8b\u4e0d\u7528\u7ba1\u5f53\u524d\u6d4b\u8bd5\u673a\u6267\u884c\u73af\u5883\uff0c\u6846\u67b6\u4f1a\u81ea\u52a8\u6839\u636e\u5f53\u524d\u73af\u5883\u8d70\u4e0d\u540c\u7684\u4ee3\u7801\u903b\u8f91\uff1b
src/depends/dogtail
import dogtail
from src.depends import dogtail
# Attribution \uff1achengdu Test Team\n# Date \uff1a2021/08/20\n
\u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d \u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d
\u4ed3\u5e93\u5730\u5740\uff1ahttps://gitlabcd.uniontech.com/autotest/cd-desktop-aitest
\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u667a\u80fd\u8bc6\u522b\u5e94\u7528\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u7528\u4e8e\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u64cd\u4f5c\u8fc7\u7a0b\u4e2d\u7684\u5143\u7d20\u5b9a\u4f4d\u4ee5\u53ca\u5224\u65ad\u7ed3\u679c\u65f6\u7684\u65ad\u8a00\u5904\u7406\uff1b\u81ea\u52a8\u5316\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\uff0c\u6d4b\u8bd5\u673a\u4e0a\u7684\u753b\u9762\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u5230\u670d\u52a1\u5668\u4e0a\uff0c\u670d\u52a1\u5668\u5bf9\u89c6\u9891\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\u540e\uff0c\u670d\u52a1\u5668\u667a\u80fd\u5224\u65ad\u7528\u4f8b\u662f\u5426\u6267\u884c\u6210\u529f\uff0c\u7136\u540e\u5bf9\u6d4b\u8bd5\u673a\u4e0b\u53d1\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\uff0c\u6d4b\u8bd5\u673a\u63a5\u53d7\u5e76\u6267\u884c\u4e0b\u4e00\u6b65\u64cd\u4f5c\u3002
\u670d\u52a1\u5668\u4e0e\u6d4b\u8bd5\u673a\u4e4b\u95f4\u7684\u94fe\u63a5\uff1a
\u670d\u52a1\u5668\u5bf9\u91c7\u96c6\u7684\u753b\u9762\u8fdb\u884c\u667a\u80fd\u8bc6\u522b\uff0c\u8bc6\u522b\u5176\u4e2d\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5e76\u8fd4\u56de\u5143\u7d20\u63a7\u4ef6\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\uff0c\u670d\u52a1\u5668\u901a\u8fc7\u667a\u80fd\u5316\u5206\u6790\uff0c\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e00\u81f4\u5c06\u4e0b\u4e00\u6b65\u64cd\u4f5c\u6307\u4ee4\u901a\u8fc7\u4e32\u53e3\u6a21\u62df\u952e\u9f20\u4fe1\u53f7\u53d1\u9001\u7ed9\u6d4b\u8bd5\u673a\uff1b\u5982\u679c\u6d4b\u8bd5\u7ed3\u679c\u4e0e\u9884\u671f\u4e0d\u4e00\u81f4\u5c06\u4f1a\u8fdb\u5165\u4e2d\u65ad\u5904\u7406\u53ca\u5f02\u5e38\u7ed3\u679c\u8f93\u51fa\uff0c\u7ee7\u7eed\u6267\u884c\u540e\u7eed\u573a\u666f\uff0c\u76f4\u81f3\u6240\u6709\u7528\u4f8b\u6d4b\u8bd5\u5b8c\u6210\u3002
\u6a21\u578b\u8bad\u7ec3\u4e3b\u8981\u5bf9 GPU \u6709\u8981\u6c42\uff0c\u8bad\u7ec3\u6a21\u578b\u7684\u673a\u5668\u663e\u5b58\u4e0d\u4f4e\u4e8e 6G\uff0c\u5176\u4ed6\u914d\u7f6e\u65e0\u7279\u6b8a\u8981\u6c42\u3002
\u63a8\u8350\u6027\u4ef7\u6bd4\u8f83\u9ad8\u914d\u7f6e
\u64cd\u4f5c\u7cfb\u7edf: UnionTech OS Desktop 20 Professional Linux version 4.19.0-desktop-amd64 (deepin@deepin-PC) (Uos 8.3.0.3-3+rebuild) \u5904\u7406\u5668: Intel(R) Core(TM) i7-10700 CPU @ 2.90GHz (\u516b\u6838 / \u5341\u516d\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460M-HDV(RD)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))/8GB(TF32D4U2S1MEH-8 DDR4 2933MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: TU116 [GeForce GTX 1660]\n
cd ~\nwget -c https://repo.continuum.io/miniconda/Miniconda3-latest-Linux-x86_64.sh\nbash Miniconda3-latest-Linux-x86_64.sh\n
\u4e00\u8def\u56de\u8f66
\u7b2c\u4e00\u6b21\u63d0\u793a\u8f93\u5165 yes/no \uff1a\u8f93\u5165 yes
yes
\u7ee7\u7eed\u4e00\u8def\u56de\u8f66
\u7b2c\u4e8c\u6b21\u63d0\u793a\uff1a\u8f93\u5165 no
no
cd ~/miniconda3/bin\nsudo chmod 777 activate\n
\u6fc0\u6d3bconda\u73af\u5883
. ./activate\n
\u6dfb\u52a0\u516c\u53f8\u5185\u7f51\u6e90
conda config --add channels bioconda\nconda config --add channels conda-forge\n
\u5982\u679c\u662f\u5916\u7f51\u6dfb\u52a0\u5916\u7f51\u6e90
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/\nconda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/bioconda/\n
\u5982\u679c\u8981\u5220\u9664\u6e90
conda config --remove-key channels\n
conda remove --name mmlab --all # \u79fb\u9664\u6240\u6709\u865a\u62df\u73af\u5883\n
conda create -n mmlab python=3.7\n
conda activate mmlab\n
\u5728mmlab\u865a\u62df\u73af\u5883\u4e2d\u6267\u884c
pip install torch==1.7.0+cu101 torchvision==0.8.1+cu101 torchaudio==0.7.0 -f https://download.pytorch.org/whl/torch_stable.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n
pip install mmcv-full==1.3.3 -f https://download.openmmlab.com/mmcv/dist/cu101/torch1.7.0/index.html -i http://pypi.douban.com/simple --trusted-host pypi.douban.com\n
\u6839\u636e\u4f60\u7684\u663e\u5361\u4e0b\u8f7d\u5bf9\u5e94\u9a71\u52a8\uff0c\u6bd4\u5982\u6211\u7684\u663e\u5361\u4e3a GTX1660\uff0c\u9a71\u52a8\u7248\u672c\u4e3a 430\uff0c\u9a71\u52a8\u4e0b\u8f7d\u5730\u5740\uff1ahttps://www.nvidia.cn/Download/Find.aspx?lang=cn
GTX1660
CTRL+ALT+F2 \u8fdb\u5165tty\n
\u7981\u7528 nouveau \u9a71\u52a8
sudo vim /etc/modprobe.d/blacklist-nouveau.conf\n
\u586b\u5165\uff1a
blacklist nouveau options nouveau modeset=0\n
\u5237\u65b0\u914d\u7f6e\u6587\u4ef6
sudo update-initramfs -u
reboot \u91cd\u542f\u540e\u518d\u8fdb\u5165 tty
\u5173\u95ed\u56fe\u50cf\u754c\u9762\uff0c\u8f93\u5165\u547d\u4ee4\u5173\u95ed\u56fe\u50cf\u754c\u9762
sudo service lightdm stop\n
\u5b89\u88c5\u9a71\u52a8
sudo chmod a+x NVIDIA-Linux-x86_64-430.run\nsudo ./NVIDIA-Linux-x86_64-430.run\n
reboot\u91cd\u542f\uff0cnvidia-smi\u67e5\u770b\u5b89\u88c5\u72b6\u6001\u3002\u6ce8\u610f\u770b\u4e0bcuda\u7248\u672c\uff0c10.1\uff0cdriver\u7248\u3002
\u6807\u6ce8\u4e4b\u524d\u9700\u8981\u5148\u8f6c\u6362\u56fe\u7247\u5927\u5c0f\uff0c\u5e76\u4e14\u4ee5\u6570\u5b57\u547d\u540d\uff0c\u6bcf\u7ec4\u547d\u540d\u9012\u589e
rename_pic.py
import os\nimport sys\nimport cv2\nimport time\nimport getpass\nusername = getpass.getuser()\nsource_path = f\"/home/{username}/Desktop/right_menu\" # \u56fe\u7247\u8def\u5f84\nsource_dest = os.path.join('/'.join(source_path.split(\"/\")[:-1]), 'tmp')\nif not os.path.exists(source_dest):\nos.mkdir(source_dest)\nstart_name = sys.argv[1]\nfile_name_list = list()\nfor file in os.listdir(source_path):\nif file.endswith('.png'):\nfile_name_list.append(file)\nstart_name = int(start_name)\nfor file in file_name_list:\nos.rename(os.path.join(source_path,file), os.path.join(source_path, f\"{str(start_name)}.png\"))\nstart_name += 1\ntime.sleep(1)\nfor file in os.listdir(source_path):\nimage = os.path.join(source_path, str(file))\nsrc = cv2.imread(image)\nresult = cv2.resize(src, (960, 540))\nresizeImage = os.path.join(source_dest, str(file))\nprint(resizeImage)\ncv2.imwrite(str(resizeImage), result)\ncv2.waitKey(0)\ncv2.destroyAllWindows()\ntime.sleep(1)\nos.system(f'rm -rf {source_path}/*')\nos.system(f'mv {source_dest}/* {source_path}')\nos.system(f'rm -rf {source_dest}')\nprint(\"\u4e0b\u4e00\u4e2a\u5e8f\u53f7\uff1a\", start_name)\n
\u6839\u636e\u7ec8\u7aef\u8f93\u51fa\u7684\u4e0b\u4e00\u4e2a\u5e8f\u53f7\u7684\u63d0\u793a\uff0c\u6267\u884c Python \u6587\u4ef6\u7684\u65f6\u5019\u4f20\u53c2\u3002
python rename_pic.py 249\n
\u4f7f\u7528\u5de5\u5177 labelImg \u6807\u6ce8
sudo pip3 install PyQt5==5.13\nsudo pip3 install labelImg\n
\u7ec8\u7aef\u76f4\u63a5\u8f93\u5165 labelImg\uff0c\u56de\u8f66
\u6807\u6ce8\u6a21\u5f0f\u9009\u62e9\uff1aPascalVOC
PascalVOC
\u6253\u5f00\u5c4f\u5e55\u5f55\u5236\u8f6f\u4ef6\uff0c\u5f55\u5236\u624b\u52a8\u64cd\u4f5c\u4e00\u6b21\u6d4b\u8bd5\u7528\u4f8b\uff0c\u7136\u540e\u5c06\u5f55\u5236\u7684\u89c6\u9891\u8fdb\u884c\u5206\u5e27\uff0c\u7136\u540e\u5bf9\u6bd4\u524d\u4e24\u5e27\u56fe\u6807\u76f8\u4f3c\u5ea6\uff0c\u5254\u9664\u76f8\u4f3c\u5ea6\u8fc7\u9ad8\u7684\u56fe\u7247\uff0c\u5728\u4fdd\u8bc1\u7d20\u6750\u591a\u6837\u6027\u7684\u524d\u63d0\u4e0b\uff0c\u5254\u9664\u91cd\u590d\u591a\u4f59\u7684\u56fe\u7247\u751f\u6210\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u96c6\uff0c\u7136\u540e\u53d6\u51fa\u63a7\u4ef6\u6a21\u677f\u6570\u636e\u96c6\uff0c\u901a\u8fc7 OpenCV \u6a21\u677f\u5339\u914d\u83b7\u53d6\u63a7\u4ef6\u5728\u5f85\u6807\u6ce8\u7684\u7d20\u6750\u56fe\u7247\u4e2d\u6240\u5728\u7684\u5de6\u4e0a\u3001\u5de6\u4e0b\u3001\u53f3\u4e0a\u3001\u53f3\u4e0b\u56db\u5904\u5750\u6807\uff0c\u4ece\u800c\u6839\u636e\u6a21\u677f\u6570\u636e\u96c6\u751f\u6210\u6807\u6ce8\u6570\u636e\u3002\u53c2\u8003\u76ee\u5f55 AnnotationMaterial
1\u3001\u5728\u754c\u9762\u622a\u53d6\u9700\u8981\u6807\u6ce8\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u653e\u5728\u76ee\u5f55\u4e0b AnnotationMaterial/template/img
2\u3001\u7ef4\u62a4\u63a7\u4ef6\u540d\u4e0e\u5143\u7d20\u63a7\u4ef6\u7684\u952e\u5bf9\uff0c\u4e00\u4e2a\u63a7\u4ef6\u540d\u53ef\u5bf9\u5e94\u591a\u4e2a\u5143\u7d20\u63a7\u4ef6
menu:\n- menu.jpg\n- menu1.jpg\n- menu2.jpg\n- menu3.jpg\n
\u5f55\u5236\u89c6\u9891\u6216\u6216\u5c4f\u5e55\u622a\u56fe\u653e\u7f6e\u76ee\u5f55 AnnotationMaterial/source
python3 AnnotationMaterial/main.py\n
\u751f\u6210\u7684\u6807\u6ce8\u6570\u636e\u5b58\u653e\u5728 AnnotationMaterial/result
MMDetection \u662f\u4e00\u4e2a\u6709\u540d\u7684\u6df1\u5ea6\u5b66\u4e60\u76ee\u6807\u68c0\u6d4b\u5f00\u6e90\u9879\u76ee\uff0c\u4e5f\u662f openMMlab \u7684\u62db\u724c\u9879\u76ee\uff0c\u4e3a\u4ec0\u4e48\u9009\u62e9\u5b83\uff0c\u5c0f\u5b69\u513f\u6ca1\u5a18\u8bf4\u6765\u8bdd\u957f\uff0c\u611f\u5174\u8da3\u53ef\u4ee5\u81ea\u884c\u6df1\u5165\u4e86\u89e3\uff1b
openMMlab
\u4f60\u53ef\u4ee5\u76f4\u63a5\u5728 GitHub \u4e0a\u514b\u9686\u4ee3\u7801\uff0c\u4e5f\u53ef\u4ee5\u76f4\u63a5\u4f7f\u7528\u54b1\u4eec\u4ed3\u5e93\u4e0b Train \u76ee\u5f55\u4e2d\u4ee3\u7801\uff0cTrain \u4e2d\u7684\u4ee3\u7801\u4e5f\u662f\u4ece GitHub \u4e0a\u62c9\u53d6\u7684\uff0c\u4e0d\u8fc7\u6211\u4eec\u6839\u636e\u9879\u76ee\u9700\u8981\u505a\u4e86\u4e00\u4e9b\u4e8c\u6b21\u5f00\u53d1\uff0c\u63a8\u8350\u76f4\u63a5\u4f7f\u7528\u5b83\u3002
\u5982\u679c\u4f60\u60f3\u4ece GitHub \u4e0a\u62c9\uff1a
git clone https://github.com/open-mmlab/mmdetection.git\n# \u4e0d\u80fd\u76f4\u63a5\u62c9\u53d6\u4e3b\u5206\u652f\uff0c\u5efa\u8bae\u4f7f\u75282.12\u7248\u672c\uff0c\u4e0d\u540c\u7684\u7248\u672c\u5bf9\u5e94\u7684mmcv\u7248\u672c\u662f\u4e0d\u540c\u7684\n
git clone https://github.com/Tony607/voc2coco.git\n
\u5c06\u6240\u6709\u7684\u56fe\u7247\u548cxml\u6587\u4ef6\u653e\u5165train2017\uff0c\u4ece\u4e2d\u6311\u9009\u51e0\u7ec4\u653e\u5165val2017\uff08\u6d4b\u8bd5\u96c6\uff09
cd mmdetection/data/coco\npython voc2coco.py train2017 annotations/instances_train2017.json\npython voc2coco.py val2017 annotations/instances_val2017.json\n
\u751f\u6210json\u6587\u4ef6
\uff081\uff09\u8bfb\u53d6\u6a21\u578b\u540d\u79f0
import json\nmodule_name = []\nwith open('./instances_train2017.json', \"r+\") as f:\njson_file = f.read()\njson_dict = json.loads(json_file)\nmodule_list = json_dict.get('categories')\nfor module_info in module_list:\nname = module_info.get('name')\nmodule_name.append(name)\nprint(module_name)\nprint(\"module_num:\", len(module_name))\n
# \u6ce8\u610f\u5bf9\u6bd4instances_train2017.json\u91cc\u9762\u6a21\u578b\u540d\u79f0\u7684\u987a\u5e8f\uff0c\u4e0eCLASSES\u548ccoco_classes\u91cc\u9762\u7684\u987a\u5e8f\u4fdd\u6301\u4e00\u81f4\u3002\n
\uff082\uff09\u4fee\u6539 faster_rcnn_r101_2x_coco.py
mmdetection/xianjin/faster_rcnn_r101_2x_coco.py
\u4fee\u653946\u884c\uff0cnum_clasess\u7684\u503c\uff0c\u65b0\u589e1\u4e2a\uff0c\u5c31 +1\uff1b
num_clasess
\uff083\uff09\u4fee\u6539 coco.py
mmdetection/mmdet/datasets/coco.py
CLASSES = ()\uff0c\u5728\u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b
\uff084\uff09\u4fee\u6539 class_names.py
mmdetection/mmdet/core/evaluation/class_names.py
coco_classes \u91cc\u9762\u6dfb\u52a0\u6a21\u578b\u540d\u79f0\uff1b
coco_classes
\u5220\u9664 mmdetection/build \u76ee\u5f55
python setup.py install\n
\uff081\uff09\u6307\u5b9a\u81ea\u5df1\u914d\u7f6e\u7684\u8bad\u7ec3\u6a21\u578b\uff1b
python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py --gpus 1\n
\uff082\uff09\u67e5\u770b\u8bad\u7ec3\u7ed3\u679c\u7684\u6d4b\u8bd5\u96c6\u7ed3\u679c\uff1b
python tools/train.py xianjin/faster_rcnn_r101_fpn_2x_coco.py xianjin/epoch_24.pth --show\n
python tools/analysis_tools/analyze_logs.py plot_curve xianjin/20210530_011907.log.json --keys acc\n
python3 run.py\n
\u5c06\u4ee5\u4e0a 4 - 7 \u6b65\u64cd\u4f5c\u6574\u5408\u6210 run.py\uff0c\u4e00\u952e\u5b8c\u6210\u3002
\u6267\u884c\u7528\u4f8b\u7684\u670d\u52a1\u7aef\u5bf9\u914d\u7f6e\u6ca1\u6709\u7279\u6b8a\u8981\u6c42\uff0c\u5982\u679c\u6761\u4ef6\u5141\u8bb8\u914d\u7f6e\u8d8a\u9ad8\uff0c\u8bc6\u522b\u901f\u5ea6\u7528\u4f8b\u6267\u884c\u901f\u5ea6\u8d8a\u5feb\u3002
\u5904\u7406\u5668: Intel(R) Core(TM) i3-10100 CPU @ 3.60GHz (\u56db\u6838 / \u516b\u903b\u8f91\u5904\u7406\u5668)\n\u4e3b\u677f: B460-N2(J)\n\u5185\u5b58: 8GB(TF32D4U2S1MEH-8 DDR4 3200MHz (0.3ns))\n\u663e\u793a\u9002\u914d\u5668: UHD Graphics 630\n\u5b58\u50a8\u8bbe\u5907: FORESEE P900F256GBH (256 GB)/ST1000DM003-1SB102 (1.00 TB)\n
\u6d4b\u8bd5\u673a\u4e0a\u4e0d\u6267\u884c\u4efb\u4f55\u811a\u672c\uff0c\u5177\u4f53\u914d\u7f6e\u6839\u636e\u6d4b\u8bd5\u9700\u8981\u51b3\u5b9a\u3002
\u4f4d\u4e8econtrol_method\u76ee\u5f55\u4e0b\u7684usb_mk.py\u6587\u4ef6
\uff081\uff09\u5217\u51fa\u53ef\u901a\u4fe1\u7684\u7aef\u53e3
python3 -m serial.tools.list_ports -v\n
\uff082\uff09\u4fee\u6539\u4e32\u53e3\u7684\u6743\u9650
sudo chmod 777 /dev/ttyACM0\n
\uff083\uff09\u5b9e\u4f8b\u5316USB_MK
import UsbMk\nusb_mk = UsbMk(\"/dev/ttyACM0\", 9600) # \u8bbe\u5907\u9ed8\u8ba49600\u4e3a\u6ce2\u7279\u7387\uff0c\u63a7\u5236\u4f20\u8f93\u901f\u7387\n
\uff084\uff09USB\u4e32\u53e3\u8bbe\u5907\u9ed8\u8ba4\u6ce2\u7279\u7387\u4e3a9600\uff08\u7ecf\u6d4b\u8bd5\u6ce2\u7279\u73879600\u51c6\u786e\u6027\u6700\u597d\uff09\u3002
\uff081\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e
usb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n
\uff082\uff09\u6309\u4e0b\u952e\u76d8\u6309\u952e\u5e76\u4e14\u4e0d\u653e
usb_mk.press_key_down(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\u4e0d\u653e\n
\uff083\uff09\u7ec4\u5408\u6309\u952e
usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\n
\uff084\uff09\u7ec4\u5408\u6309\u952e\u4e0d\u653e
usb_mk.hot_key_down(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\u4e0d\u653e\n
\uff085\uff09\u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e
usb_mk.key_up() # \u91ca\u653e\u6240\u6709\u952e\u76d8\u6309\u952e\n
\uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u6c49\u5b57\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09
usb_mk.hot_key(\"ctrl\", \"alt\", \"T\") # \u6309\u4e0b\u7ec4\u5408\u6309\u952ectrl+alt+T\u8c03\u8d77\u7ec8\u7aef\nusb_mk.input_text(\"reboot\") # \u8f93\u5165\u5b57\u7b26\u4e32reboot\nusb_mk.press_key(\"enter\") # \u6309\u4e0b\u952e\u76d8enter\u952e\n
\uff081\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e
usb_mk.click() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\n
\uff082\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e
usb_mk.mouse_down() # \u6309\u4e0b\u9f20\u6807\u5de6\u952e\u4e0d\u653e\n
\uff083\uff09\u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e
usb_mk.mouse_up() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n
\uff083\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e
usb_mk.right_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n
\uff084\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb
usb_mk.double_click() # \u91ca\u653e\u9f20\u6807\u6240\u6709\u6309\u952e\n
\uff085\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2
usb_mk.move_to_init() # \u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2\n
\uff086\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807
usb_mk.move_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n
\uff087\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807
usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n
\uff088\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e
usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n# \u6ce8\uff1a\u56e0Linux\u7cfb\u7edf\u4e0d\u652f\u6301\u9f20\u6807\u7edd\u5bf9\u8def\u5f84\uff0c\u6240\u4ee5\u4f1a\u9f20\u6807\u4f1a\u5148\u79fb\u52a8\u5230\u521d\u59cb\u4f4d\u7f6e\n
\uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e
usb_mk.drag_rel(100, 200) # \u9f20\u6807\u5411\u5de6\u8fb9\u79fb\u52a8100\u4e2a\u50cf\u7d20\uff0c\u5411\u4e0b\u79fb\u52a8200\u4e2a\u50cf\u7d20\n
class Base:\ndef __init__(self):\nself._obj = image\nself._usb = usb_mk\ndef find_element_by_ai(self, element):\nreturn self._obj.find_element(element)\n
\u56fe\u50cf\u8bc6\u522b\u65b9\u6cd5\u5165\u53e3\u4e3a Base \u7c7b\u4e0b\u7684 find_element_by_ai \u3002\u4ec5\u63a5\u53d7\u4e00\u4e2a\u53c2\u6570 element\uff0c\u7c7b\u578b\u4e3a string\u3002
\u53ef\u8bc6\u522b\u7684 string \u683c\u5f0f\uff1a
\uff081\uff09\u5927\u56fe\u6807\uff08 \u56fe\u6807\u5927\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\uff0c\u4f8b\uff1a
Base().find_element_by_ai(\"window\")\n
\uff082\uff09\u5927\u56fe\u6807 / \u5c0f\u56fe\u6807\uff08\u56fe\u6807\u5c0f\u4e8e 40 \u50cf\u7d20\uff09\uff1a\u8bc6\u522b\u67d0\u4e2a\u5c0f\u56fe\u6807\uff0c\u4f8b\uff1awindow/search_btn
Base().find_element_by_ai(\"window/search_btn\")\n
\uff083\uff09\u5927\u56fe\u6807 / OCR\uff1a\u8bc6\u522b\u67d0\u4e2a\u5927\u56fe\u6807\u5185\u7684\u6587\u5b57\uff0c\u4f8b\uff1amenu/\u5c5e\u6027
Base().find_element_by_ai(\"menu/\u5c5e\u6027\")\n
\uff084\uff09OCR\uff1a\u5168\u5c4f\u8bc6\u522b\u6587\u5b57
Base().find_element_by_ai(\"\u641c\u7d22\")\n
\u901a\u8fc7\u91c7\u96c6\u76d2\u4f20\u8f93\u8fc7\u6765\u7684\u89c6\u9891\u6d41\uff0c\u5728\u8bc6\u522b\u8fc7\u7a0b\u4e2d\u53ef\u80fd\u53d7\u5230\u9f20\u6807\u5f71\u54cd\uff0c\u56e0\u6b64\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u9700\u8981\u9690\u85cf\u9f20\u6807\u3002
\u5c4f\u853d\u9f20\u6807\u5149\u6807\u663e\u793a
```shell script /etc/lightdm/lightdm.conf
\u5728`[Seat:*]`\u4e0b\u9762\u6dfb\u52a0\u53c2\u6570\n```shell script\nxserver-command=X -bs -core -nocursor\n
1\u3001\u6539\u5584 Acessibility \u5b9a\u4f4d\u7684\u7a33\u5b9a\u6027\u95ee\u9898
Acessibility \u5c5e\u6027\u5b9a\u4f4d\u5b58\u5728\u5076\u5c14\u5931\u6548\u7684\u60c5\u51b5
\uff081\uff09\u5f00\u53d1\u5728\u505a\u65b0\u9700\u6c42\u5f00\u53d1\u65f6\u53ef\u80fd\u6d89\u53ca\u5230\u5bf9\u5c5e\u6027\u6807\u7b7e\u7684\u4fee\u6539\u6216\u8005\u5c42\u7ea7\u7684\u8c03\u6574\uff0c\u53ef\u80fd\u9020\u6210\u81ea\u52a8\u5316\u7528\u4f8b\u65e0\u6cd5\u5b9a\u4f4d\u5230\u5143\u7d20\u3002
\uff082\uff09\u76ee\u524d\u4e3b\u8981\u4f7f\u7528Dogtail\u8bc6\u522b\u5e94\u7528Acessibility\u5c5e\u6027\u8fdb\u884c\u5b9a\u4f4d\uff0c\u662f\u83b7\u53d6\u5e94\u7528\u5f53\u524d\u754c\u9762\u7684\u5c5e\u6027tree\uff0c\u5728\u5e94\u7528\u8df3\u8f6c\u540e\uff0cDogtail\u5b58\u5728\u65e0\u6cd5\u53ca\u65f6\u83b7\u53d6\u5f53\u524d\u5c5e\u6027\u5217\u8868\u7684\u60c5\u51b5\u3002
\uff083\uff09Dogtail\u5de5\u5177\u672c\u8eab\u5b58\u5728\u95ee\u9898\uff0c\u6709\u65f6\u5b9a\u4f4d\u5143\u7d20\u7684\u65f6\u5019\u5f88\u6162\uff0c\u8ba9\u4eba\u65e0\u6cd5\u63a5\u53d7\uff0c\u76ee\u524d\u51fa\u73b0\u8fc7\u5f88\u591a\u6b21\u3002
2\u3001\u89e3\u51b3\u4e86\u4f7f\u7528\u7edd\u5bf9\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898
\u90e8\u5206\u63a7\u4ef6\u65e0\u6cd5\u6dfb\u52a0 Acessibility \u5c5e\u6027\u4ece\u800c\u4f7f\u7528\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u51fa\u73b0\u7684\u5bb9\u9519\u6027\u5dee\u7684\u95ee\u9898\u3002
\uff081\uff09\u56fe\u50cf\u8bc6\u522b\u5b9a\u4f4d\u65b9\u6cd5\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u76ee\u6807\u56fe\u7247\u8d44\u6e90\uff0c\u5728 UI \u53d1\u751f\u53d8\u5316\u4e4b\u540e\uff0c\u4f1a\u6d89\u53ca\u5230\u76ee\u6807\u8d44\u6e90\u7684\u66ff\u6362\uff0c\u6bd4\u8f83\u8017\u8d39\u4eba\u529b\u3002
\uff082\uff09\u56fe\u50cf\u8bc6\u522b\u7684\u5b9a\u4f4d\u65b9\u6cd5\u5bf9\u6bd4\u7cbe\u5ea6\u6bd4\u8f83\u641e\uff0c\u5982\u679cUI \u7684\u53d8\u66f4\u4f1a\u9020\u6210\u65e0\u6cd5\u51c6\u786e\u5b9a\u4f4d\u5230\uff0c\u81ea\u52a8\u5316\u811a\u672c\u5065\u58ee\u6027\u4e0d\u8db3\u3002
3\u3001\u4f7f\u7528\u673a\u5668\u5206\u79bb\uff0c\u89e3\u51b3\u4e86\u81ea\u52a8\u5316\u811a\u672c\u5bf9\u5e94\u7528\u7684\u5f71\u54cd\uff0c\u771f\u5b9e\u8fd8\u539f\u7528\u6237\u7684\u4f7f\u7528\u573a\u666f
\u673a\u5668\u5206\u79bb\u7684\u67b6\u6784\u8bbe\u8ba1\uff0c\u4fdd\u8bc1\u4e86\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u73af\u5883\u5b8c\u5168\u7b49\u540c\u4e8e\u7528\u6237\uff0c\u6392\u9664\u6d4b\u8bd5\u811a\u672c\u7684\u5f71\u54cd\u3002
\uff081\uff09\u76ee\u524d\u7684\u529f\u80fd\u81ea\u52a8\u5316\u662f\u5728\u6d4b\u8bd5\u673a\u4e0a\u76f4\u63a5\u8fd0\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\uff0c\u52a0\u4e0a\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u6211\u4eec\u6dfb\u52a0\u4e86\u4e00\u4e9b\u8fdb\u7a0b\u76d1\u63a7\u3001\u89c6\u9891\u5f55\u5236\u7b49\u529f\u80fd\uff0c\u81ea\u52a8\u5316\u811a\u672c\u672c\u8eab\u4f1a\u6d88\u8017\u4e00\u4e9b\u7cfb\u7edf\u8d44\u6e90\uff0c\u65e0\u6cd5\u8fd8\u539f\u771f\u662f\u7684\u7528\u6237\u4f7f\u7528\u573a\u666f\u3002
\uff082\uff09\u6027\u80fd\u6d4b\u8bd5\u9700\u8981\u6392\u9664\u5176\u4ed6\u7a0b\u5e8f\u7684\u8d44\u6e90\u6d88\u8017\u5f71\u54cd\uff0c\u6027\u80fd\u81ea\u52a8\u5316\u91c7\u7528\u673a\u5668\u5206\u79bb\uff0c\u4fdd\u8bc1\u4e86\u6027\u80fd\u6570\u636e\u7684\u51c6\u786e\u6027\u3002
\u4ee5\u524d\u7684\u7528\u4f8b\u6267\u884c\u8017\u65f6\u6ca1\u6761\u572830\u79d2\u5de6\u53f3\uff0c\u73b0\u5728\u7528\u4f8b\u8017\u65f6\u572810\u79d2\u3002
4\u3001\u89e3\u51b3\u4e86UI \u8c03\u6574\u5bfc\u81f4\u5b9a\u4f4d\u5931\u8d25\u7684\u4e0d\u7a33\u5b9a\u6027\u95ee\u9898
\uff081\uff09\u89e3\u51b3\u4e86\u56e0 UI \u8c03\u6574\u5bfc\u81f4\u63a7\u4ef6\u4f4d\u7f6e\u53d8\u5316\u6216\u8272\u5dee\u53d8\u5316\u540e\u5b9a\u4f4d\u4e0d\u51c6\u786e\u7684\u95ee\u9898\uff0c\u53ea\u8981\u63a7\u4ef6\u6587\u6848\u548c\u63a7\u4ef6\u5916\u8fb9\u6846\u65e0\u53d8\u5316\u5747\u53ef\u51c6\u786e\u5b9a\u4f4d\uff1b
\uff082\uff09\u76ee\u524d\u4e5f\u4f1a\u91c7\u7528\u57fa\u4e8eUI\u7684\u5b9a\u4f4d\u65b9\u6848\uff0c\u5982\u679cUI\u4f4d\u7f6e\u6709\u8c03\u6574\uff0c\u4f1a\u5bfc\u81f4\u5143\u7d20\u65e0\u6cd5\u5b9a\u4f4d\u3002
5\u3001\u7b80\u5316\u4e86\u7528\u4f8b\u7ed3\u6784\uff0c\u63d0\u5347\u7f16\u5199\u53cb\u597d\u5ea6
\uff081\uff09\u667a\u80fd\u81ea\u52a8\u5316\u8bc6\u522b\u5143\u7d20\u7684\u65b9\u6cd5\u53ea\u6709\u4e00\u4e2a\uff0c\u5c31\u662f\u57fa\u4e8e\u6211\u4eec\u8bad\u7ec3\u7684\u6a21\u578b\u8bc6\u522b\u89c6\u9891\u6d41\u4e2d\u7684\u5143\u7d20\uff0c\u7ecf\u8fc7\u811a\u672c\u5c01\u88c5\u4e4b\u540e\uff0c\u5728\u81ea\u52a8\u5316\u7528\u4f8b\u4e2d\u6240\u6709\u5b9a\u4f4d\u7684\u64cd\u4f5c\u90fd\u53ea\u9700\u8981\u8c03\u7528\u8fd9\u4e00\u4e2a\u65b9\u6cd5\u5c31\u884c\u4e86\uff0c\u7f16\u5199\u81ea\u52a8\u5316\u811a\u672c\u7684\u96be\u5ea6\u5927\u5927\u964d\u4f4e\u3002
\uff082\uff09\u4e5f\u662f\u7531\u4e8e\u8c03\u7528\u65b9\u6cd5\u7b80\u5355\uff0c\u5728 UI \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u4e2d\u7684\u5206\u5c42\u7ed3\u6784\u5c06\u4f1a\u51cf\u5c11\uff0c\u591a\u7ee7\u627f\u7684\u60c5\u51b5\u4f1a\u51cf\u5c11\uff0c\u81ea\u52a8\u5316\u4ee3\u7801\u7684\u8c03\u7528\u7ed3\u6784\u4e5f\u4f1a\u53d8\u5f97\u7b80\u5355\uff0c\u800c\u4e14\u529f\u80fd\u6d4b\u8bd5\u540c\u5b66\u7f16\u5199\u81ea\u52a8\u5316\u7528\u4f8b\u4f1a\u66f4\u52a0\u5bb9\u6613\u4e0a\u624b\u3002
\u4ee5\u524d\u5199\u7528\u4f8b\u7531\u4e8e\u9700\u8981\u7ed3\u5408\u4e0d\u540c\u7684\u6a21\u5757\uff0c\u8c03\u7528\u4e0d\u540c\u7684\u65b9\u6cd5\uff0c\u7f16\u5199\u4e00\u6761\u7528\u4f8b\u5e76\u5b8c\u6210\u8c03\u8bd5\u7684\u65f6\u95f4\u5e73\u5747\u572820-30\u5206\u949f\uff0c\u73b0\u5728\u5199\u7528\u4f8b\u811a\u672c\u80fd\u57285\u5206\u949f\u5de6\u53f3\u5b8c\u6210\u3002
# =============================================\n# Attribution : Application Test Department III\n# Time : 2023/1/3\n# Author : ut003281\n# =============================================\n
\u667a\u80fd\u5316\u6027\u80fd\u6d4b\u8bd5
\u901a\u8fc7\u81ea\u52a8\u5316\u624b\u6bb5\u5bf9\u5e94\u7528\u8fdb\u884c\u6027\u80fd\u6d4b\u8bd5\uff0c\u63d0\u4f9b\u65b9\u4fbf\u7684\u73af\u5883\u90e8\u7f72\u3001\u8fd0\u884c\u914d\u7f6e\u3001\u7528\u4f8b\u7f16\u5199\u7b49\uff0c\u7528\u4e8e\u684c\u9762\u5e94\u7528\u7684\u51b7\u70ed\u542f\u52a8\u3001\u8d44\u6e90\u62f7\u8d1d\u3001\u9875\u9762\u8df3\u8f6c\u7b49\u6027\u80fd\u573a\u666f\u6d4b\u8bd5\u3002
\u4ed3\u5e93\u5730\u5740\uff1ahttps://gerrit.uniontech.com/admin/repos/autotest-perf-aitest
autotest-perf-aitest\n\u251c\u2500\u2500 apps # \u5b58\u653e\u6240\u6709\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u811a\u672c\n\u251c\u2500\u2500 conftest.py # pytest hook\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 CURRENT # \u7248\u672c\u5185\u5bb9\n\u251c\u2500\u2500 docs # \u6587\u6863\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u952e\u503c\u5bf9\u7167\u8868.pdf # \u4e32\u53e3\u7ebfcode\u4e0e\u6309\u952e\u7684\u5bf9\u7167\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 \u6027\u80fd\u81ea\u52a8\u5316\u6d4b\u8bd5\u811a\u672c\u6267\u884c\u5668\u4f7f\u7528\u6307\u5357.md # \u6267\u884c\u5668\u811a\u672c\u4f7f\u7528\u6307\u5357\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 USB\u4e32\u53e3\u8f6cUSB\u952e\u76d8\u9f20\u6807\u7ebf\u534f\u8bae\u6587\u4ef6V1.0.pdf # \u4e32\u53e3\u534f\u8bae\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput-0.28.2.zip # Linux\u4e0b\u7edd\u5bf9\u5750\u6807\u64cd\u4f5c\u4f9d\u8d56\u7684\u6e90\u7801\uff0c\u53ef\u6839\u636e\u67b6\u6784\u6253\u5305\n\u251c\u2500\u2500 manage.py # \u529f\u80fd\u4e3b\u5165\u53e3\n\u251c\u2500\u2500 pytest.ini # pytst \u914d\u7f6e\n\u251c\u2500\u2500 README.md\n\u251c\u2500\u2500 setting # \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 client.ini # \u6d4b\u8bd5\u673a IP \u8bbe\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 config.py # \u5168\u5c40\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dev_env.sh # \u5bbf\u4e3b\u673a\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose_no_relay.yml # \u65e0\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker-compose.yml # \u6709\u7ee7\u7535\u5668\u5bb9\u5668\u96c6\u7fa4\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 docker_login.sh # docker \u767b\u9646\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 res\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 black.png # \u5168\u9ed1\u56fe\u7247\uff0c\u7528\u4e8e\u4fee\u6539\u58c1\u7eb8\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_5000.deb # 3A5000 \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_amd64.deb # amd \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_arm64.deb # arm \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_mips64.deb # mips \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 xserver-xorg-input-libinput_0.28.2-2_sw_64.deb # sw \u67b6\u6784\u9f20\u6807\u7edd\u5bf9\u5750\u6807\u4f9d\u8d56\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 server.ini # \u670d\u52a1\u5668\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 setup.sh # \u5bb9\u5668\u73af\u5883\u90e8\u7f72\u811a\u672c\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 template # \u521b\u5efa app \u57fa\u7840\u811a\u672c\u6a21\u677f\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 app_template\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 ${app_name}_widget.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 control-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 images\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 readme\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 test_${app_name}_01_scene.json-tpl\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 test_${app_name}_01_scene.py-tpl\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 uos_docker # \u5bb9\u5668\u73af\u5883\u914d\u7f6e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 dockerfile\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 requirements.txt\n\u2514\u2500\u2500 src\n \u251c\u2500\u2500 analysis_save.py # \u89e3\u6790\u56fe\u7247\u6d41\u7ed3\u679c\uff0c\u6c47\u603b\u751f\u6210 excel \u62a5\u544a\n\u251c\u2500\u2500 base_widget.py # \u5c01\u88c5\u7684\u57fa\u7840\u64cd\u4f5c\uff0c\u5e94\u7528\u8c03\u7528\u7684\u4e3b\u5165\u53e3\u65b9\u6cd5\n\u251c\u2500\u2500 cmdctl.py # \u8c03\u7528\u547d\u4ee4\u884c\u4f7f\u7528\n\u251c\u2500\u2500 global_value.py # \u5168\u5c40\u53d8\u91cf\n\u251c\u2500\u2500 image_utils.py # \u56fe\u7247\u76f8\u5173\u65b9\u6cd5\n\u251c\u2500\u2500 __init__.py\n \u251c\u2500\u2500 logger_utils.py # \u65e5\u5fd7\u914d\u7f6e\n\u251c\u2500\u2500 pdocr.py # ocr \u914d\u7f6e\n\u251c\u2500\u2500 public_method.py # \u4e00\u4e9b\u65b9\u4fbf\u7684\u5c01\u4f4f\n\u251c\u2500\u2500 record.py # \u5f55\u5c4f\u76f8\u5173\n\u251c\u2500\u2500 rtk # \u8fd0\u884c\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 _base.py # \u4e00\u4e9b\u679a\u4e3e\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 install_env.py # \u5b89\u88c5\u73af\u5883\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 local_runner.py # \u8fd0\u884c\u7528\u4f8b\n\u251c\u2500\u2500 serial_communication # \u4e32\u53e3\u76f8\u5173\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 power_control.py # \u7ee7\u7535\u5668\u64cd\u4f5c\uff0c\u4f7f\u7528\u7ee7\u7535\u5668\u8fde\u63a5\u4e3b\u673a\u7535\u6e90\uff0c\u63a7\u5236\u5f00\u5173\u673a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 serial_common.py # \u4e32\u53e3\u516c\u5171\u65b9\u6cd5\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 usb_mk.py # \u952e\u9f20\u64cd\u4f5c\u57fa\u7840\u5c01\u88c5\n\u251c\u2500\u2500 shortcut_key.py # \u5feb\u6377\u952e\u7684\u5c01\u88c5\n\u251c\u2500\u2500 singleton.py # \u5355\u4f8b\u6a21\u5f0f\n\u251c\u2500\u2500 start_app.py # \u521b\u5efa app\n\u2514\u2500\u2500 write_xlsx.py # \u751f\u6210 excel\n# __init__.py \u6587\u4ef6\u4e3a\u6807\u8bc6\u8be5\u76ee\u5f55\u662f\u4e00\u4e2aPython\u7684\u6a21\u5757\u5305\uff0c\u9879\u76ee\u4e2d\u7684__init__.py\u5747\u4e3a\u7a7a\u6587\u4ef6\u3002\n
AMD
ACASIS
HDMI
USB
USB3.0
\u914d\u7f6e\u8d8a\u9ad8\uff0c\u89e3\u6790\u901f\u5ea6\u8d8a\u5feb\u3002
\u6253\u5f00\u63a7\u5236\u4e2d\u5fc3\uff0c\u8d26\u6237\u8bbe\u7f6e\u4e3a\u3010\u81ea\u52a8\u767b\u5f55\u3011\u548c\u3010\u65e0\u5bc6\u7801\u767b\u5f55\u3011\uff0c\u7535\u6e90\u7ba1\u7406\u4e2d\u4f7f\u7528\u7535\u6e90\u5168\u90e8\u8bbe\u7f6e\u4e3a\u3010\u4ece\u4e0d\u3011\uff0c\u5f00\u542f\u5f00\u53d1\u8005\u6a21\u5f0f\u3002
\u6839\u636e\u5e94\u7528\u6027\u80fd\u6d4b\u8bd5\u8981\u6c42\uff0c\u5bfc\u5165\u76f8\u5173\u6d4b\u8bd5\u8d44\u6e90\uff0c\u6bd4\u5982\uff1a\u5bfc\u5165\u76f8\u518c\u3001\u5f71\u9662\u3001\u97f3\u4e50\u7684\u6d4b\u8bd5\u8d44\u6e90\u3002
\u5728\u670d\u52a1\u7aef\u6253\u5f00\u76f8\u673a\u5e94\u7528\u540e\uff0c\u5c06\u6d4b\u8bd5\u673a\u684c\u9762\u58c1\u7eb8\u66f4\u6362\u4e3a\u7eaf\u8272\u58c1\u7eb8\uff08\u6ce8\u610f\uff0c\u670d\u52a1\u7aef\u9700\u63d0\u524d\u5f00\u542f\u76f8\u673a\u540e\u518d\u8bbe\u7f6e\u6d4b\u8bd5\u673a\u58c1\u7eb8\uff0c\u5efa\u8bae\u7eaf\u9ed1\u58c1\u7eb8 setting/res/black.png\uff09
setting/res/black.png
\u5728\u6587\u4ef6\u7ba1\u7406\u5668\u4e2d\uff0c\u5c06\u9009\u9879 \u4e3b\u83dc\u5355-\u8bbe\u7f6e-\u9884\u89c8-\u56fe\u7247\u9884\u89c8 \u53d6\u6d88\u52fe\u9009\uff08\u5982\u4e0d\u53d6\u6d88\uff0c\u4f1a\u5f71\u54cd\u622a\u56fe\u5f55\u5c4f\u5e94\u7528\u7684\u6027\u80fd\u6570\u636e\uff09
\u79fb\u52a8\u6216\u5220\u9664\u7cfb\u7edf Logo \uff0c\u6392\u9664\u684c\u9762\u53f3\u4e0b\u89d2 Logo \u7684\u5f71\u54cd\uff08\u91cd\u542f\u751f\u6548\uff09\u3002
sudo mv /usr/share/deepin/uos_logo.svg ~/Pictures/\n
AMD \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_amd64.deb
setting/res
xserver-xorg-input-libinput_0.28.2-2_amd64.deb
ARM \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_arm64.deb
xserver-xorg-input-libinput_0.28.2-2_arm64.deb
MIPS \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_mips64.deb
res
xserver-xorg-input-libinput_0.28.2-2_mips64.deb
3A5000 \u5b89\u88c5 setting/res \u76ee\u5f55\u4e0b xserver-xorg-input-libinput_0.28.2-2_5000.deb
3A5000
xserver-xorg-input-libinput_0.28.2-2_5000.deb
\u5b89\u88c5\u547d\u4ee4
sudo dkpg -i xserver-xorg-input-libinput_0.28.2-2_amd64.deb\n
\u5b89\u88c5\u65f6\u4f1a\u63d0\u793a\u5df2\u5b58\u5728\u76f8\u540c\u7248\u672c\uff0c\u8bf7\u5ffd\u7565\uff0c\u76f4\u63a5\u8986\u76d6\u5b89\u88c5\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u4e3b\u673a\u624d\u751f\u6548
\u73af\u5883\u642d\u5efa\u524d\u5fc5\u987b\u5148\u8fde\u63a5\u4e0a USB \u4e32\u53e3\u7ebf\u548c\u91c7\u96c6\u76d2\u3002
\u5bbf\u4e3b\u673a\u73af\u5883\u5b89\u88c5
python3 manage.py install --env host\n
\u5bb9\u5668\u73af\u5883\u5b89\u88c5
python3 manage.py install --env docker\n
setting/config/server.ini
\u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u914d\u7f6e\u9879\uff0c\u5305\u542b\u4e86\u6240\u6709\u670d\u52a1\u7aef\u6240\u6709\u7684\u53ef\u914d\u7f6e\u9879\u3002
network=0
network=1
client_alias=
Alias1
setting/config/client.ini
python3 manager
config/client.ini
python3 manager --client_alias Alias1
job
run.sh
user
ip
bash run.sh Alias1
pipeline
stage
\u8be6\u7ec6\u914d\u7f6e\u9879\u8bf4\u660e\uff1a
;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;1\u3001KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2\u3001KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f, e.g. TAGS = L1 or smoke\n[case_conf]\n# \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\uff0cocr\u6587\u6848\u8bc6\u522b\u8f83\u6162\uff0c\u4e0d\u63a8\u8350\u4f7f\u7528\nfind_by = stage\n# \u6700\u540e\u4e00\u4e2a\u7a33\u5b9a\u9636\u6bb5\u7684\u5e27\u6570\u8bc6\u522b\n# \u9996\u5e27\u5b58\u5728\u540e\u7684\u7b2c\u4e00\u4e2a\u5927\u4e8e\u8be5\u914d\u7f6e\u5e27\u6570\u7684\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u5c3e\u5e27\nfinal_stable_num=100\n# \u4ece\u8be5\u5e27\u6570\u5f00\u59cb\u8bc6\u522b\u6587\u6848\u6216\u56fe\u7247\uff0c\u51cf\u5c11\u5206\u6790\u65f6\u95f4\nstart_num = 150\n# \u8bc6\u522b\u7684\u6587\u6848\ntext=\n# \u8bc6\u522b\u56fe\u7247\nmatch=apps/xxx/images/match.png\n# \u8bc6\u522b\u76f8\u4f3c\u5ea6\nmatch_rate=0.9\n# \u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6bd4\u5982\u70ed\u542f\u52a8\u7528\u4f8b\uff0c\u4ece\u70b9\u51fb\u6253\u5f00\u5230\u505c\u6b62\u5f55\u5c4f\uff0c\u4e2d\u95f4\u7b49\u5f855\u79d2\uff1b\nduration = 15\n# \u5355\u6761\u7528\u4f8b\u6267\u884c\u7684\u6b21\u6570\ncount = 5\n# \u7a33\u5b9a\u9636\u6bb5\u5212\u5206\u7684\u76f8\u4f3c\u5ea6\nstable_similarity = 0.9997\n[server]\n# \u8c03\u8bd5\u6a21\u5f0f=1\uff0c\u4e3a\u5f00\u542f\u8c03\u8bd5\u6a21\u5f0f\uff0c0\u4e3a\u5173\u95ed\u3002\n# \u8c03\u8bd5\u6a21\u5f0f\u4e0b\u9ed8\u8ba4\u53ea\u6267\u884c\u4e00\u6b21\u7528\u4f8b\uff0c\u4e0d\u5173\u673a\n# \u7f16\u5199\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\u5efa\u8bae\u5f00\u542fmaintain\u3002\nMAINTAIN = 0\n# \u8fd0\u884c\u7684\u73af\u5883docker\u5bb9\u5668\u73af\u5883\uff0chost\u5bbf\u4e3b\u673a\u73af\u5883\nENV = docker\n# \u670d\u52a1\u7aef\u5bc6\u7801\nPASSWORD=1\n# \u6307\u5b9a\u6d4b\u8bd5\u673a\u522b\u540d\n# \u6d4b\u8bd5\u673a\u522b\u540d\u5728 config/client.ini \u4e2d\u8fdb\u884c\u914d\u7f6e\uff0c\u6bd4\u5982\uff1a\n# [AMD]\n# ip=10.8.15.86\n# user=uos\n# \u5176\u4e2d AMD \u4e3a\u6d4b\u8bd5\u673a\u522b\u540d\uff0c\u5219client_alias=AMD\nCLIENT_ALIAS = x86\uff08Intel-i7\uff09\n# 1 \u5f00\u542f\u7f51\u7edc, 0 \u5173\u95ed\u7f51\u7edc\n# \uff081\uff09\u670d\u52a1\u7aef\u4e0e\u6d4b\u8bd5\u673a\u987b\u5728\u540c\u4e00\u7f51\u6bb5\u4e0b\uff0c\u4f60\u53ef\u4ee5\u5c1d\u8bd5\u5728\u670d\u52a1\u7aef\u901a\u8fc7ssh\u8fde\u63a5\u6d4b\u8bd5\u673a\uff0c\u5982\u679c\u53ef\u4ee5\u8fde\u63a5\uff0c\u8bf4\u660e\u7f51\u7edc\u6b63\u5e38\u3002\n# \uff082\uff09\u5f53input_type=FILE_NAME \u65f6\uff0c\u5fc5\u987b\u5f00\u542f\u7f51\u7edc\u3002\nNETWORK = 1\n# \u6027\u80fd\u7ed3\u679c\u7edf\u8ba1\u5355\u4f4d \u6beb\u79d2\u2014ms, \u79d2\u2014s\nUNIT=ms\n# \u6d4b\u8bd5\u673a\u5f00\u673a\u8fdb\u5165\u684c\u9762\u540e\u7b49\u5f85\u65f6\u95f4,\u5355\u4f4d/\u79d2\nSTARTUP_DELAY = 60\n# 1\u4e3a\u5220\u9664\u7f13\u5b58\uff0c0\u4e3a\u4e0d\u5220\u9664\u7f13\u5b58\n# \u7528\u4f8b\u6267\u884c\u5b8c\u540e\u4f1a\u5728report\u76ee\u5f55\u4e0b\u751f\u6210\u667a\u80fd\u89e3\u6790\u7684\u4e00\u4e9b\u7f13\u5b58\u56fe\u7247\u3002\nCACHE = 0\n# \u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u62a5\u544a\u4f1a\u4fdd\u5b58\u5728\u9879\u76ee\u4e0breport\u76ee\u5f55\u4e2d\uff1b\n# \u6307\u5b9a\u62a5\u544a\u76ee\u5f55\u5219\u5b58\u653e\u5230\u6307\u5b9a\u76ee\u5f55\u3002\nREPORT_PATH = report\n# \u670d\u52a1\u7aef\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684icon\u8d44\u6e90\u4f1a\u7f13\u5b58\u5728\u9879\u76ee\u4e0binput\u76ee\u5f55\u4e2d\nINPUT = input/\n# 1\u4e3a\u6d4b\u8bd5\u5b8c\u5173\u673a\uff0c0\u4e3a\u6d4b\u8bd5\u5b8c\u4e0d\u5173\u673a\nSHUTDOWN = 0\n# \u89e3\u6790\u8fdb\u7a0b\u6570\uff08\u4e0d\u63a8\u8350\u4fee\u6539\uff09\n# 3\u4e2a\u8fdb\u7a0b\u89e3\u6790\u89c6\u9891\u5df2\u7ecf\u80fd\u591f\u6ee1\u8db3\uff0c\u5373\u4f7f\u589e\u52a0\u8fdb\u7a0b\u6570\u4e5f\u4e0d\u80fd\u51cf\u5c11\u6574\u4f53\u8017\u65f6\n# \u53e6\u5916\u8fd8\u8981\u770bCPU\u6838\u6570\u662f\u5426\u652f\u6301\u3002\nPARSING_PROCESS = 3\n# 1\u4e3a\u4f7f\u7528\u7ee7\u7535\u5668\u5f00\u5173\u673a\uff0c0\u4e3a\u4f7f\u7528reboot\u547d\u4ee4\u91cd\u542f\u3002\u4f9d\u8d56\u7ee7\u7535\u5668\u786c\u4ef6\u8bbe\u5907\uff0c\u9700\u8981\u4f7f\u7528\u8054\u7cfb\u5f00\u53d1\u8005\nRELAY = 0\n# \u83b7\u53d6\u6d4b\u8bd5\u5e94\u7528\u7684\u7248\u672c, %s \u5360\u4f4d\u5e94\u7528\u540d\n# \u5982\u679c\u8be5\u914d\u7f6e\u4e3a\u7a7a\uff0c\u5219\u4e0d\u83b7\u53d6\u5e94\u7528\u7684\u7248\u672c\u4fe1\u606f\u3002\nCOMMAND = apt policy %s 2>/dev/null|grep \"\u5df2\u5b89\u88c5\"|awk -F \"\uff1a\" \"{print \\$2}\"\n# \u5173\u673a\u7b49\u5f85\u5f00\u542f\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\n# \u6839\u636e\u6d4b\u8bd5\u673a\u6027\u80fd\u4e0d\u540c\uff0c\u5f00\u5173\u673a\u8017\u65f6\u53ef\u80fd\u4e0d\u540c\uff0c\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u673a\u60c5\u51b5\u914d\u7f6e\u3002\nSHUTDOWN_DELAY = 30\n# \u53ef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u56fe\u7247\u683c\u5f0f\uff0c\u4ee5\u82f1\u6587\u9017\u53f7\u9694\u5f00\u3002\n# \u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u76ee\u524d\u6211\u4eec\u4ec5\u9a8c\u8bc1\u4e86jpg,jpeg,png\u8fd9\u4e09\u79cd\u5e38\u7528\u7684\u56fe\u7247\u683c\u5f0f\u3002\nINPUT_TYPES = jpg,jpeg,png\n# \u6027\u80fd\u5206\u6790\u8865\u5e27\uff0c\u7b49\u4e8e\u6216\u4f4e\u4e8e\u8be5\u503c\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u9700\u8981\u51cf\u6389\u3002\nUN_STAB_START = 3\n# \u670d\u52a1\u7aef\u83b7\u53d6\u6d4b\u8bd5\u673a\u56fe\u50cf\u7684\u5e27\u7387\uff0c\u5373\u6bcf\u79d2\u83b7\u53d6\u591a\u5c11\u5f20\u6d4b\u8bd5\u673a\u4e0a\u7684\u56fe\u50cf\u3002\n# \u9ed8\u8ba4\u5e27\u7387\u4e3a30\u5e27/\u79d2\uff0c\u8be5\u914d\u7f6e\u9879\u4e0d\u5efa\u8bae\u4fee\u6539\uff0c\u53ef\u80fd\u4f1a\u5bf9\u89e3\u6790\u7ed3\u679c\u9020\u6210\u504f\u5dee\u3002\nFPS = 30\n# \u4ee5\u4e0b\u573a\u666f\u7c7b\u578b\u4f1a\u91cd\u542f\u6d4b\u8bd5\u673a,\u591a\u79cd\u573a\u666f\u4f7f\u7528\u9017\u53f7\u9694\u5f00\nSCENE = cold\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = http://10.8.13.78:8890\n#\u5c4f\u5e55\u56fe\u7247\u4e34\u65f6\u5b58\u653e\u4f4d\u7f6e\nSCREEN_CACHE = /tmp/screen\n# =======================================\n[log]\n# \u65e5\u5fd7\u7ea7\u522b\uff0cOFF\u3001FATAL\u3001ERROR\u3001WARN\u3001INFO\u3001DEBUG\u3001ALL\n# \u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u7684\u4e00\u4e9b\u65e5\u5fd7\u8f93\u51fa\uff0clog_cli=INFO\u8868\u793a \u4ec5\u8f93\u51faINFO\u53ca\u4ee5\u4e0a\u7ea7\u522b\u7684\u65e5\u5fd7\u3002\nLOG_LEVEL = DEBUG\n# \u65e5\u5fd7\u6587\u4ef6\u4fdd\u5b58\u8def\u5f84\nLOG_PATH= logs\n# =======================================\n[dockerhub]\n# \u5bb9\u5668\u767b\u9646\u8d26\u53f7\nDOCKER_USER = user\n# \u5bb9\u5668\u767b\u9646\u5bc6\u7801\nDOCKER_PASSWORD = User1234\n
\u7528\u4e8e\u914d\u7f6e\u6d4b\u8bd5\u673a\u7684\u4fe1\u606f\u3002
\u6d4b\u8bd5\u673a\u522b\u540d
# \u6d4b\u8bd5\u673a\u522b\u540d\n[Alias1] # \u6d4b\u8bd5\u673aip\nip=10.8.15.86 # \u6d4b\u8bd5\u673a\u7528\u6237\u540d\nuser=uos\n
\u547d\u540d\u5efa\u8bae\uff1aAliasA1\u3001AliasA2\u3001AliasB1\u3001AliasB2\uff0c\u4e0d\u8981\u91cd\u540d\u3002
AliasA1
AliasA2
AliasB1
AliasB2
width=
height=
[client]\n# \u9ed8\u8ba4\u6d4b\u8bd5\u673a\u7528\u6237\u540d\uff0c\u5bc6\u7801\uff0cip\nip=\nuser=\n# \u6d4b\u8bd5\u673a\u5bc6\u7801\npassword=1\n# \u6d4b\u8bd5\u673a\u4e3b\u9898\ntheme=bloom\n# \u6d4b\u8bd5\u673aicon\u76ee\u5f55\npath=/usr/share/icons\n# \u7cfb\u7edfdesktop\u6587\u4ef6\u7684\u5b58\u653e\u76ee\u5f55\uff0cUOS\u7cfb\u7edf\u9ed8\u8ba4\u4e3a/usr/share/applications\ndesktop_path=/usr/share/applications\n# \u7528\u4e8e\u5224\u65ad\u6d4b\u8bd5\u673a\u662f\u5426\u5f00\u673a\u8fdb\u5165\u684c\u9762\u7684\u8bc6\u522b\u6807\u8bc6\u3002\n# 1\u3001\u901a\u8fc7\u684c\u9762\u56fe\u6807\u8bc6\u522b\u3002\n# - type=FILE_NAME\u65f6\uff0c\u670d\u52a1\u5668\u548c\u6d4b\u8bd5\u673a\u5fc5\u987b\u5728\u540c\u4e00\u5c40\u57df\u7f51\u5185\u3002\n# - power_on=dde-computer\u8868\u793a\u901a\u8fc7\u684c\u9762\u8ba1\u7b97\u673a\u56fe\u6807\u5224\u65ad\u5f00\u673a\u8fdb\u5165\u684c\u9762\u3002\n# 2\u3001\u901a\u8fc7\u672c\u5730\u56fe\u7247\u4f5c\u4e3a\u5f00\u673a\u8bc6\u522b\u3002\n# - type= \u4f20\u5165\u4e3a\u56fe\u7247\u683c\u5f0f\uff0ctype\u652f\u6301\u7684\u7c7b\u578b\u5305\u542b\u5728server.ini\u5185\u914d\u7f6e\u9879input_type=jpg,jpeg,png\u3002\n# - power_on= \u4f20\u5165\u7684\u662f\u672c\u5730\u56fe\u7247\u7684\u8def\u5f84\u3002\ntype=FILE_NAME\npower_on=dde-computer\n# \u6d4b\u8bd5\u673a\u5206\u8fa8\u7387\u914d\u7f6e\uff08\u6d4b\u8bd5\u673a\u8fde\u63a5\u91c7\u96c6\u76d2\uff0c\u91c7\u96c6\u76d2\u7684\u5206\u8fa8\u7387\uff09\nheight=1080\nwidth=1920\n[AliasA1] ip=10.8.15.86\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n[AliasA2]\nip=10.8.15.20\nuser=uos\n# password=1 \u5982\u679c\u8fd9\u91cc\u4e0d\u5199\u5bc6\u7801\uff0c\u9ed8\u8ba4\u53d6\u4e0a\u9762client\u91cc\u9762\u7684password\n
\u968f\u7740\u6d4b\u8bd5\u573a\u666f\u7684\u4e0d\u65ad\u5f15\u5165\uff0c\u53d1\u73b0\u73b0\u6709\u670d\u52a1\u7aef\u91cc\u7684\u914d\u7f6e\u9879\u5e76\u4e0d\u9002\u7528\u4e8e\u6240\u6709\u7684\u6027\u80fd\u573a\u666f\uff0c\u4e8e\u662f\u5c06\u670d\u52a1\u7aef\u914d\u7f6e\u8fdb\u884c\u4e00\u4e2a\u63d0\u53d6\uff0c\u53ef\u505a\u5355\u4e2a\u573a\u666f\u7684\u4e2a\u6027\u5316\u914d\u7f6e\uff0c\u5f53\u7136\u539f\u6765\u7684\u670d\u52a1\u7aef\u914d\u7f6e\u529f\u80fd\u4fdd\u7559\uff0c\u53ea\u662f\u5f53\u4f60\u914d\u7f6e\u4e86\u573a\u666f\u4e2a\u6027\u5316\u914d\u7f6e\u540e\uff0c\u4f18\u5148\u4f7f\u7528\u4e2a\u6027\u5316\u914d\u7f6e\u91cc\u9762\u7684\u5185\u5bb9\uff0c\u4ee5\u4e0b\u662f\u5bf9\u4e2a\u6027\u5316\u914d\u7f6e\u7684\u4ecb\u7ecd\u3002
\u76ee\u524d\u6bcf\u4e00\u4e2a py \u6587\u4ef6\u5bf9\u5e94\u4e00\u4e2a\u6027\u80fd\u6d4b\u8bd5\u573a\u666f\uff0c\u4e8e\u662f\u5728\u540c\u7ea7\u76ee\u5f55\u4e0b\u521b\u5efa\u4e00\u4e2a\u4e0e\u4e4b\u540c\u540d\u7684 json \u6587\u4ef6\uff0c\u4f5c\u4e3a\u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6
apps\n\u251c\u2500\u2500 album\n \u251c\u2500\u2500 test_album_01_start.json # \u4e2a\u6027\u5316\u914d\u7f6e\u6587\u4ef6\n\u2514\u2500\u2500 test_album_01_start.py # \u6027\u80fd\u573a\u666f\u6587\u4ef6\n
\u4ee5\u4e0b\u662f\u5bf9 json \u6587\u4ef6\u4e2d\u914d\u7f6e\u7684\u89e3\u91ca\uff0c\u82e5\u67d0\u9879\u914d\u7f6e\u4e0d\u9700\u8981\uff0c\u53ef\u4ee5\u7f3a\u5931\uff0c\u4f46\u4e0d\u80fd\u4e3a\u7a7a\uff1b
{\n\"title\": \"test_album_start\", # \u6807\u9898\uff1b\u5fc5\u987b\n\"app_name\": \"deepin-album\", # \u573a\u666f\u6240\u5c5e\u7684\u5e94\u7528\uff1b\u5fc5\u987b\n\"scene\": \"hot\", # \u573a\u666f\u522b\u540d\uff1b\u5fc5\u987b\n\"icon\": [\"deepin-album\"], # \u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684icon\u5230\u670d\u52a1\u7aef\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\uff1b\u53ef\u7f3a\u5931\n# \u6ce8\u610f\uff1a\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528desktop\u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684desktop\u6587\u4ef6\u540d\u4e3adeepin-album.desktop\uff0c\n# \u53ea\u9700\u8981\u5199deepin-album\u5373\u53ef\uff0c\u201c.desktop\u201d\u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002\n\"size\": { # \u56fe\u7247\u5bf9\u6bd4\u7684\u533a\u57df\u8bbe\u7f6e\u9879\uff0c\u67d0\u4e9b\u5e94\u7528\u5f53\u524d\u5c4f\u5e55\u7684\u90e8\u5206\u533a\u57df\u9700\u8981\u5c06\u5176\u53bb\u6389\uff0c\u53ef\u4ee5\u8bbe\u7f6e\u6b64\u9879\uff0c\u5982\u679c\u6ca1\u6709\u5219\u53ef\u4e0d\u5199\uff1b\u53ef\u786e\u5b9e\n\"x-coordinate\": 0, # \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n\"y-coordinate\": 0, # \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n\"width\": 850, # \u6a2a\u5411\u957f\u5ea6\n\"height\": 1920 # \u7eb5\u5411\u9ad8\u5ea6\n},\n\"count\": 5, # \u573a\u666f\u6267\u884c\u7684\u6b21\u6570\uff1b\u5fc5\u987b\n\"duration\": 5, # \u8be5\u6761\u7528\u4f8b\u64cd\u4f5c\u6267\u884c\u4e4b\u540e\uff0c\u505c\u6b62\u5f55\u5c4f\u4e4b\u524d\u7684\u7b49\u5f85\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff0c\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7279\u5b9a\u573a\u666f\uff0c\u8be5\u914d\u7f6e\u4e3a\u53ef\u9009\u9879\uff0c\u8986\u76d6 server.ini \u4e2d\u7684\u914d\u7f6e\uff1b\u53ef\u7f3a\u5931\n\"stable_similarity\": 0.9997, # \u6027\u80fd\u573a\u666f\u5206\u9636\u6bb5\u65f6\u7684\u56fe\u7247\u76f8\u4f3c\u5ea6\u5bf9\u6bd4\uff0c\u524d\u540e\u56fe\u7247\u4f4e\u4e8e\u8be5\u503c\uff0c\u5219\u5206\u4e3a\u4e0d\u7a33\u5b9a\u9636\u6bb5\uff1b\u53ef\u7f3a\u5931\n\"find_by\": \"stage\", # \u5c3e\u5e27\u8bc6\u522b\u7684\u65b9\u5f0fstage\u6309\u9636\u6bb5\u5212\u5206\uff0cocr\u901a\u8fc7\u6587\u6848\u8bc6\u522b\uff0cmatch \u56fe\u7247\u5339\u914d\n\"final_stable_num\": 100, # \u67e5\u627e\u6700\u540e\u4e00\u4e2a\u5927\u4e8e\u8be5\u503c\u7684\u7a33\u5b9a\u9636\u6bb5\u7684\u9996\u5e27\u4f5c\u4e3a\u6027\u80fd\u7684\u5c3e\u796f\uff1b\u53ef\u7f3a\u5931\n\"start_num\": 150,\n\"text\": \"\", # ocr\u8bc6\u522b\u7684\u6587\u6848\n\"match\": \"apps/xxx/images/match.png\", # \u56fe\u50cf\u5339\u914d\u7684\u56fe\u7247\u6587\u4ef6\u8def\u5f84\n\"match_rate\": 0.9 # \u5339\u914d\u76f8\u4f3c\u5ea6\n}\n
# \u6807\u51c6\u5e93\u5bfc\u5165\nfrom time import sleep\n# \u5bfc\u5165\u4e09\u65b9\u5e93pytest\nimport pytest\n# \u5bfc\u5165\u7528\u4f8b\u6267\u884c\u8981\u7528\u5230\u7684Widget\u7c7b\nfrom src.base_widget import BaseWidget\nclass TestStart:\n# class\u7ea7\u522b\u7684fixture\uff0c\u6d4b\u8bd5\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u6267\u884c\u3002autouse=True \u81ea\u52a8\u5728\u5f53\u524d\u4f5c\u7528\u57df\u4e0b\u4f7f\u7528\u3002\n@pytest.fixture(scope=\"class\", autouse=True)\n# \u6d4b\u8bd5\u70ed\u542f\u52a8\u4e4b\u524d\u9700\u8981\u9884\u542f\u52a8\u3002\ndef application_pre_start(self):\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().right_click_element(\"deepin-album\")\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().click_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\")\nsleep(2)\n# \u5feb\u6377\u952e\u5173\u95ed\u7a97\u53e3\nBaseWidget().hot_key(\"alt\", \"f4\")\nsleep(2)\n# \u9ed8\u8ba4\u4e3afunction\u7ea7\u522b\u7684fixture\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\uff0cclass\u7ea7\u522bfixture\u6267\u884c\u4e4b\u540e\u6267\u884c\u3002\n@pytest.fixture(autouse=True)\ndef setup_start(self):\n# \u53f3\u952e\u70b9\u51fb deepin-album \u56fe\u6807\nBaseWidget().right_click_element(\"deepin-album\")\n# \u79fb\u52a8\u5230\u53f3\u952e\u83dc\u5355\u4e2d\u6253\u5f00\uff08open.png\uff09\n# \u5165\u53c2\u89c4\u5219\u5728\u7b2c2\u70b9\u4e2d\u8be6\u7ec6\u63cf\u8ff0\u3002\nBaseWidget().move_to(*BaseWidget().find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))\n# \u7b49\u5f85\u79fb\u52a8\u5b8c\u6210\nsleep(0.5)\ndef test_album_start(self):\n# \u70b9\u51fb\u201c\u6253\u5f00\u201d\nBaseWidget().click() \n
2.1\u3001find_element \u65b9\u6cd5
find_element
def find_element(element: str, input_type: str = \"FILE_NAME\", fill_color_position: tuple = (-1, -1), size: tuple = (25, 70)):\npass\n
element
input_type
\uff081\uff09\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u5143\u7d20
icon
- `input_type` \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a `FIEL_NAME` \uff0c\u8868\u793a\u901a\u8fc7\u5e94\u7528 `icon` \u5bfb\u627e\u5143\u7d20\uff0c\u6b64\u65b9\u6cd5\u4f1a\u52a8\u6001\u83b7\u53d6\u6d4b\u8bd5\u673a\u4e0a\u7684\u5e94\u7528 `icon` \u56fe\u6807\u3002\n
find_element(\"deepin-album\")
desktop
\uff082\uff09\u901a\u8fc7\u672c\u5730\u56fe\u7247\u8bc6\u522b\u5143\u7d20
- \u53c2\u6570 `input_type` \u4f20\u5165\u56fe\u7247\u683c\u5f0f\uff0c\u6bd4\u5982\u622a\u53d6\u7684\u672c\u5730\u56fe\u7247\u683c\u5f0f\u4e3a `png`\uff0c\u90a3\u4e48 `input_type=\"png\"`\uff0c\u6b64\u65f6\u53c2\u6570 `element ` \u4f20\u5165\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5efa\u8bae\u5b58\u653e\u5728\u5bf9\u5e94\u7684\u4ea7\u54c1 `apps/app/picture/` \u76ee\u5f55\u4e0b\uff0c\u8def\u5f84\u4e3a\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u7684\u76f8\u5bf9\u8def\u5f84\u3002\n- \u4e3e\u4f8b\uff1a`find_element(\"apps/autotest_deepin_album/picture/open.png\", input_type=\"png\"))`\uff0c\u8868\u793a\u901a\u8fc7\u672c\u5730\u56fe\u7247 `open.png` \u8bc6\u522b\u5143\u7d20\u3002\n
\u53c2\u6570 fill_color_position
fill_color_position
fill_color_position \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (-1, -1)\uff0c(-1, -1) \u8868\u793a\u53d6\u5c4f\u5e55\u4e2d\u53f3\u4e0b\u89d2\u6700\u540e\u4e00\u4e2a\u50cf\u7d20\u70b9\u4f5c\u4e3a\u586b\u5145\u5750\u6807\uff0c\u5728 1920x1080 \u5c4f\u5e55\u5206\u8fa8\u7387\u4e0b\u5373\u5b9e\u9645\u5750\u6807\u4e3a (1919, 1079) \uff0c\u8fd9\u6837\u7684\u5199\u6cd5\u53ef\u4ee5\u9002\u914d\u4e0d\u540c\u5927\u5c0f\u7684\u5c4f\u5e55\u3002
(-1, -1)
1920x1080
(1919, 1079)
fill_color_position=(1, 1)
fill_color_position=(-1, -1)
\u6ce8\uff1a\u901a\u8fc7\u5e94\u7528 icon \u8bc6\u522b\u65f6\uff0c\u4ece\u6d4b\u8bd5\u673a\u83b7\u53d6\u7684 icon \u539f\u6587\u4ef6\u4e3a svg \u77e2\u91cf\u56fe\uff0c\u8f6c\u6362\u4e3a png \u4e4b\u540e\u9700\u8981\u586b\u5145\u8fb9\u7f18\u900f\u660e\u90e8\u5206\u3002
svg
png
\u53c2\u6570 size
size
size \u53c2\u6570\u4e3a\u9ed8\u8ba4\u53c2\u6570\uff0c\u9ed8\u8ba4\u503c\u4e3a (25, 70)\uff0c\u8868\u793a\u6d4b\u8bd5\u673a\u4e0a dock \u680f\u4e0a\u5e94\u7528\u56fe\u6807\u7684\u5927\u5c0f\u8303\u56f4\u3002
(25, 70)
dock
UOS
2.2\u3001click_element\u3001 right_click_element\uff0c double_click_element \u8fd9\u51e0\u4e2a\u65b9\u6cd5\u53c2\u6570\u89c4\u5219\u4e0e find_element \u65b9\u6cd5\u4e00\u6837\u3002\u4ed6\u4eec\u5b9e\u9645\u4e0a\u662f\u5728 find_element \u65b9\u6cd5\u57fa\u7840\u4e4b\u4e0a\u505a\u4e86\u4e8c\u6b21\u5c01\u88c5\uff0c\u589e\u52a0\u4e86\u9f20\u6807\u7684\u52a8\u4f5c\uff0c\u5982\u679c\u4f60\u4e0d\u60f3\u4f7f\u7528\u8fd9\u51e0\u4e2a\u65b9\u6cd5\uff0c\u5728\u7528\u4f8b\u4e2d\u4e5f\u53ef\u4ee5\u901a\u8fc7 find_element \u83b7\u53d6\u5230\u5750\u6807\uff0c\u7136\u540e\u5c06\u5750\u6807\u4f20\u5165\u5230\u952e\u9f20\u7684\u65b9\u6cd5\u4e2d\uff0c\u53ef\u4ee5\u5b9e\u73b0\u540c\u6837\u7684\u6548\u679c\u3002
click_element
right_click_element
double_click_element
2.3\u3001\u7528\u4f8b\u7c7b\u4e2d\u6709\u4e2a\u7c7b\u53d8\u91cf icon = [\"deepin-album\"] \u9700\u8981\u7279\u6b8a\u8bf4\u660e\uff0c\u5217\u8868\u4e2d\u7684\u5143\u7d20\u4e3a\u8fd9\u6761\u7528\u4f8b\u91cc\u9762\u9700\u8981\u7528\u5230\u7684\u6240\u6709 icon\uff0c\u7528\u4f8b\u6267\u884c\u4e4b\u524d\u4f1a\u4ece\u6d4b\u8bd5\u673a\u4e0a\u62f7\u8d1d\u6240\u6709\u9700\u8981\u7528\u7684 icon \u5230\u670d\u52a1\u7aef\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u3002\u5217\u8868\u4e2d\u5143\u7d20\u4e3a\u5e94\u7528 desktop \u6587\u4ef6\u7684\u6587\u4ef6\u540d\uff0c\u76f8\u518c\u7684 desktop \u6587\u4ef6\u540d\u4e3a deepin-album.desktop\uff0c\u53ea\u9700\u8981\u5199 deepin-album \u5373\u53ef\uff0c.desktop \u5df2\u7ecf\u5728\u5e95\u5c42\u505a\u4e86\u62fc\u63a5\u3002
icon = [\"deepin-album\"]
deepin-album.desktop
.desktop
\u5728 setting/config/server.ini \u6587\u4ef6\u4e2d APP_NAME= \u5b57\u6bb5\u4e3a\u7528\u4f8b\u7684\u6267\u884c\u7684\u76ee\u5f55\uff0c\u9ed8\u8ba4\u4e3a apps \u76ee\u5f55\u4e0b\u6240\u6709\u7528\u4f8b\u3002\u5982\u679c\u4f60\u60f3\u6307\u5b9a\u6267\u884c\u67d0\u4e00\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff0c\u4f60\u53ef\u4ee5\u5c06\u8be5\u914d\u7f6e\u9879\u6307\u5b9a\u5230\u5e94\u7528\u7684\u7528\u4f8b\u76ee\u5f55\uff0c\u6bd4\u5982\uff1aAPP_NAME=deepin_album\uff0c \u8868\u793a\u6267\u884c\u76f8\u518c\u76ee\u5f55\u4e0b\u7684\u7528\u4f8b\u3002
APP_NAME=
APP_NAME=deepin_album
\u4ee5\u4e0b\u4e3a python3 manage.py run \u63d0\u4f9b\u7684\u4e00\u4e9b\u53c2\u6570\u9009\u9879\uff1a
python3 manage.py run
-a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music\n -k KEYWORDS, --keywords KEYWORDS\n \u7528\u4f8b\u7684\u5173\u952e\u8bcd\n -t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e\n --log_level LOG_LEVEL \u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n --env {host,docker} \u5728\u5bbf\u4e3b\u673a\u6216\u5bb9\u5668\u73af\u5883\u6267\u884c\n --client_alias \u9009\u62e9\u6d4b\u8bd5\u673a\u522b\u540d, \u53ef\u9009\u9879\u4e3aclient.ini\u4e2d\u5df2\u914d\u7f6e, \u9ed8\u8ba4\u503c\u4e3a zx-x86.\n --count \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n
python3 manage.py run --app deepin-music --keywords \"xxx\" --tags \"xxx\" --env docker\n
\u6ce8\uff1a\u5728\u5bb9\u5668\u4e2d\u6267\u884c\u65f6\uff0c\u82e5\u5f3a\u5236\u9000\u51fa\uff0c\u5bb9\u5668\u5e76\u4e0d\u4f1a\u505c\u6b62\u8fd0\u884c\uff01
\u81ea\u7814\u89c6\u9891\u89e3\u6790\u5de5\u5177\u4f1a\u5bf9\u5355\u6761\u7528\u4f8b\u6267\u884c\u4e00\u8f6e\u751f\u6210\u4e00\u4e2a json \u6587\u4ef6\uff0c\u5b58\u653e\u4e8e report/{app_name}/{scene}/{run_num} \u76ee\u5f55\u4e0b\uff0c\u547d\u540d\u683c\u5f0f\u4e3a\uff1a
json
report/{app_name}/{scene}/{run_num}
report.json
json \u5185\u5bb9\u4e3e\u4f8b\uff1a
[\n{\n\"Stab1\": {\n\"images\": [1,2...150,151],\n\"startStub\": 0,\n\"type\": \"Stab\"\n}\n},\n{\n\"Stab2\": {\n\"images\": [152,153...169,170],\n\"startStub\": 1,\n\"type\": \"UnStab\"\n}\n},\n{\n\"Stab3\": {\n\"images\": [171,172...300,301],\n\"startStub\": 0,\n\"type\": \"UnStab\"\n}\n}\n]\n
\u8bf4\u660e\uff1a
Stab
images
startStub
\"startStub\": 1
type
UnStab
\u5404\u9636\u6bb5\u6709\u5e27\u6570\u8865\u507f\uff0c\u9ed8\u8ba4\u8865\u507f\u7684\u5e27\u6570\u4e3a 3 \u5e27\uff08\u53ef\u4ee5\u901a\u8fc7 server.ini \u91cc\u9762 un_stab_start=3 \u8fdb\u884c\u914d\u7f6e\uff09\uff0c\u8868\u793a\u5c0f\u4e8e\u7b49\u4e8e 3 \u5e27\u7684\u4e0d\u7a33\u5b9a\u9636\u6bb5\u89c6\u4e3a\u7a33\u5b9a\u9636\u6bb5\uff0c\u5728\u6700\u540e\u8ba1\u7b97\u6027\u80fd\u7ed3\u679c\u65f6\u524d\u540e\u5747\u9700\u8981\u51cf\u6389\u3002
server.ini
un_stab_start=3
\u5e94\u7528\u542f\u52a8\u9636\u6bb5\u5c31\u662f\u5728 Stab2 \u9636\u6bb5\uff0c\u542f\u52a8\u65f6\u95f4\u4e3a\uff1a171 \u51cf 151 \u518d\u51cf\u6389\u524d\u540e\u8865\u507f\u5e27\u6570 6 \u5e27\uff0c\u5373 14 \u5e27\uff0c\u89c6\u9891\u5e27\u7387 30 \u5e27/\u79d2\uff0c\u56e0\u6b64\u542f\u52a8\u8017\u65f6\u4e3a\uff1a14 * 33 = 462 ms
Stab2
\u6240\u6709\u7528\u4f8b\u6267\u884c\u5e76\u89e3\u6790\u5b8c\u4e4b\u540e\u4f1a report \u76ee\u5f55\u4e0b\u751f\u6210\u4e00\u4e2a\u6c47\u603b\u6570\u636e\u7684 Excel \u6587\u4ef6\uff0c\u6587\u4ef6\u540d\u4e3a\uff1a{time}_perf_time.xlsx\u3002
Excel
{time}_perf_time.xlsx
\u6ce8\u610f\uff0creport \u76ee\u5f55\u4e3a\u53ef\u914d\u7f6e\u9879\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u4f1a\u5728\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u751f\u6210\uff0c\u5982\u679c\u4f60\u5c06 report\uff0c\u6307\u5b9a\u5230\u9879\u76ee\u4e0b\u5176\u4ed6\u8def\u5f84\uff0c\u5219\u4f1a\u5728\u5bf9\u5e94\u7684\u8def\u5f84\u4e0b\u751f\u6210 json \u548c Excel \u6587\u4ef6\u3002
\u4f60\u4e5f\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8bfb\u53d6\u6240\u6709 json / excel \u62a5\u544a\u7684\u6570\u636e\uff0c\u751f\u6210\u4f60\u81ea\u5df1\u60f3\u8981\u7684\u4e00\u4e9b\u6d4b\u8bd5\u62a5\u544a\u5f62\u5f0f\u3002
excel
\u4f4d\u4e8e src/utils/control/serial_communication \u76ee\u5f55\u4e0b\u7684 usb_mk.py \u6587\u4ef6
src/utils/control/serial_communication
usb_mk.py
usb_mk = UsbMk()\n
usb_mk.key_up()\n
\uff086\uff09\u952e\u76d8\u8f93\u5165\u5b57\u7b26\u4e32\uff08\u652f\u6301\u4f20\u5165\u6c49\u5b57\uff0c\u4f1a\u81ea\u52a8\u8f6c\u6210\u62fc\u97f3\u8f93\u5165\uff09
usb_mk.click()\n
usb_mk.mouse_down() \n
usb_mk.mouse_up() \n
\uff084\uff09\u6309\u4e0b\u9f20\u6807\u53f3\u952e
usb_mk.right_click() \n
\uff085\uff09\u9f20\u6807\u5de6\u952e\u53cc\u51fb
usb_mk.double_click() \n
\uff086\uff09\u6062\u590d\u9f20\u6807\u81f3\u521d\u59cb\u4f4d\u7f6e\uff0c\u9ed8\u8ba4\u5de6\u4e0a\u89d2
usb_mk.move_to_init() \n
\uff087\uff09\u79fb\u52a8\u9f20\u6807\u81f3\u76f8\u5bf9\u5750\u6807
\uff088\uff09\u4ee5\u5c4f\u5e55\u5de6\u4e0a\u89d2\u4e3a\u5706\u5fc3\u5750\u6807\u79fb\u52a8\u9f20\u6807\u81f3\u5c4f\u5e55\u7edd\u5bf9\u5750\u6807
usb_mk.move_to(100, 200) # \u9f20\u6807\u79fb\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n
\uff089\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u7edd\u5bf9\u5750\u6807\u4f4d\u7f6e
usb_mk.drag_to(100, 200) # \u6309\u4e0b\u9f20\u6807\u62d6\u52a8\u81f3\u5c4f\u5e55\u5750\u6807\uff08100, 200\uff09\n
\uff0810\uff09\u6309\u4e0b\u9f20\u6807\u5de6\u952e\uff0c\u62d6\u52a8\u5230\u76f8\u5bf9\u5750\u6807\u4f4d\u7f6e
\uff08\u82e5\u4e0d\u4f7f\u7528\u7ee7\u7535\u5668\uff0c\u53ef\u5ffd\u7565\u8be5\u6b65\u9aa4\uff0c\u6267\u884c\u65f6\u4f1a\u901a\u8fc7\u547d\u4ee4 reboot\uff09
reboot
LCUS-2 \u578b \u53cc\u8def USB \u667a\u80fd\u4e32\u53e3\u63a7\u5236\u7ee7\u7535\u5668\u3002
LCUS-2
https://item.taobao.com/item.htm?spm=a1z09.2.0.0.41d72e8dUYx2pi&id=582653718178&_u=i25r20ia6a2e
\u666e\u901a\u7684 USB \u7ebf\u5373\u53ef\u3002
3.1\u300140P \u6bcd\u5bf9\u516c\u675c\u90a6\u7ebf\u3002
40P
3.2\u3001\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002
4.1\u3001\u4f7f\u7528 USB \u5ef6\u957f\u7ebf\u8fde\u63a5\u63a7\u5236\u7aef\u548c\u7ee7\u7535\u5668\u3002
4.2\u3001\u5728\u7ee7\u7535\u5668\u5e38\u7aef\u548c\u516c\u5171\u7aef\u5747\u8fde\u63a5\u4e00\u6839\u675c\u90a6\u7ebf\u3002
4.3\u3001\u5728\u4e3b\u677f\u4e0a\u5f00\u673a\u9488\u548c\u91cd\u542f\u9488\u4e0a\u63d2\u4e0a\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u3002
4.4\u3001\u5c06\u5f00\u673a\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76841\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1\u5de6\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002
4.5\u3001\u5c06\u91cd\u542f\u9488\u5916\u63a5\u7684\u4e00\u6bcd\u4e8c\u516c\u675c\u90a6\u7ebf\u7684\u4e24\u6839\u516c\u7ebf\u5206\u522b\u63a5\u5165\u7ee7\u7535\u5668\u76842\u8def\u7ee7\u7535\u5668\uff08\u5982\u56fe 1 \u53f3\u4fa7\u7ee7\u7535\u5668\uff09\u548c\u539f\u7535\u6e90\u5f00\u5173\u3002
\u82e5\u60f3\u4fdd\u7559\u539f\u7535\u6e90\u5f00\u5173\u7684\u7535\u6e90\u706f\uff0c\u53ef\u6839\u636e\u5982\u4e0a\u56fe\u6240\u793a\uff0c\u4f7f\u7528\u675c\u90a6\u7ebf\u8fde\u63a5\u4e3b\u677f\u4e0a\u7684\u7535\u6e90\u706f\u548c\u539f\u7535\u6e90\u5f00\u5173
1\u3001ERROR: for uos Cannot restart container 2301b1a1395d7959ee6523d61b61c87084649af530786cdb8fb5b3ecbcbd1068: linux runtime spec devices: error gathering device information while adding custom device \"/dev/ttyACM0\": no such file or directory
ERROR: for uos Cannot restart container 2301b1a1395d7959ee6523d61b61c87084649af530786cdb8fb5b3ecbcbd1068: linux runtime spec devices: error gathering device information while adding custom device \"/dev/ttyACM0\": no such file or directory
\u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u8fde\u63a5\u72b6\u6001\uff0c\u67e5\u770b /dev/ttyACM0 \u662f\u5426\u5b58\u5728\uff0c\u82e5\u5b58\u5728 /dev/ttyACMn\uff08n\u4e3a\u4efb\u610f\u6570\u5b57\uff09\uff0c\u91cd\u542f\u7535\u8111\u89e3\u51b3\u3002
/dev/ttyACM0
/dev/ttyACMn
2\u3001Error response from daemon: Container 5e700fdc769e8c74666d68a7f2bc3de58268b4594cf88706609d59f8dbc7362d is not running
Error response from daemon: Container 5e700fdc769e8c74666d68a7f2bc3de58268b4594cf88706609d59f8dbc7362d is not running
\u5bb9\u5668\u542f\u52a8\u5931\u8d25
1\uff09\u68c0\u67e5\u54ea\u4e00\u4e2a\u5bb9\u5668\u672a\u542f\u52a8
sudo docker container ls # \u5217\u51fa\u8fd0\u884c\u4e2d\u7684 Docker \u5bb9\u5668\n
2\uff09\u7f3a\u5c11 uos \u5bb9\u5668\uff0c\u68c0\u67e5 USB \u4e32\u53e3\u8fde\u63a5\u7ebf\u548c\u91c7\u96c6\u76d2\u8fde\u63a5\u7ebf\u662f\u5426\u6b63\u5e38\uff0c\u91cd\u542f\u540e\u6267\u884c
bash install/setup.up # \u91cd\u65b0\u5b8c\u6574\u90e8\u7f72\u73af\u5883\n
\u6216\u6267\u884c
sudo docker-compose up -d --build # \u4ec5\u91cd\u65b0\u6784\u5efa Docker \u955c\u50cf\n
3\u3001\u82e5\u90e8\u7f72\u65f6\u63d0\u793a\u6302\u8f7d ttyACM0\u3001video0 \u5931\u8d25\uff0c\u8bf7\u68c0\u67e5 USB \u4e32\u53e3\u7ebf\u53ca\u91c7\u96c6\u76d2\u662f\u5426\u63a5\u89e6\u826f\u597d\uff0c\u82e5\u63a5\u89e6\u826f\u597d\uff0c\u91cd\u542f\u5373\u53ef\u89e3\u51b3\u3002
ttyACM0
video0
4\u3001\u82e5\u51fa\u73b0\u56fe\u7247\u80fd\u8bc6\u522b\uff0c\u4f46\u662f\u9f20\u6807\u672a\u79fb\u52a8\u64cd\u4f5c\u65f6\uff0c\u5b89\u88c5\u7edd\u5bf9\u9f20\u6807\u64cd\u4f5c\u7684\u4f9d\u8d56\u5305\uff0c\u89c1\u7b2c\u4e09\u8282\u7b2c\u4e8c\u5c0f\u8282\u6d4b\u8bd5\u673a\u73af\u5883\u642d\u5efa\uff0c\u5b89\u88c5\u5b8c\u6210\u540e\uff0c\u5fc5\u987b\u91cd\u542f\u6d4b\u8bd5\u673a\u3002
5\u3001\u7531\u4e8e\u901a\u8fc7\u91c7\u96c6\u5361\u83b7\u53d6\u7684\u6d4b\u8bd5\u673a\u5b9e\u65f6\u753b\u9762\uff0c\u5305\u542b\u4e86\u9f20\u6807\u7684\u6837\u5f0f\uff0c\u6240\u4ee5\u5bf9\u56fe\u7247\u8bc6\u522b\u65f6\uff0c\u9f20\u6807\u82e5\u505c\u7559\u5728\u56fe\u6807\u4e0a\u5c42\uff0c\u5219\u4f1a\u5bf9\u8bc6\u522b\u7ed3\u679c\u9020\u6210\u5f71\u54cd\uff0c\u9700\u8981\u5c06\u9f20\u6807\u79fb\u52a8\u81f3\u5176\u4ed6\u4f4d\u7f6e\uff0c\u6216\u8005\u9690\u85cf\u9f20\u6807\u89e3\u51b3\u3002
6\u3001Excel \u62a5\u544a\u4e2d\uff0c\u6d4b\u8bd5\u573a\u666f\u5217\u4e0e\u7528\u4f8b\u4e2d\u7684\u4e0d\u4e00\u81f4\uff0c\u5173\u952e\u5b57scene\u3001app_name\u3001\u67b6\u6784\u522b\u540d\uff0c\u4e0d\u80fd\u5305\u542b\u4e0b\u5212\u7ebf\u548c\u82f1\u6587\u7b26\u53f7\u7684\u5706\u62ec\u53f7\u3002
# =============================================\n# Attribution : Chengdu Test Department\n# Time : 2023/1/12\n# Author : Mikigo\n# =============================================\n
\u6b64\u6587\u6863\u4e3b\u8981\u60f3\u5bf9 YouQu \u6846\u67b6\u4e00\u4e9b\u91cd\u70b9\u7684\u529f\u80fd\u505a\u8be6\u7ec6\u7684\u4ecb\u7ecd\uff0c\u5305\u62ec\u5bf9\u4e00\u4e9b\u529f\u80fd\u5f00\u53d1\u7684\u80cc\u666f\u3001\u8981\u89e3\u51b3\u7684\u95ee\u9898\u3001\u5b9e\u73b0\u903b\u8f91\u3001\u4ee3\u7801\u7b49\u65b9\u9762\u7684\u4ecb\u7ecd\uff0c\u4ee5\u6b64\u8ba9\u5927\u5bb6\u80fd\u66f4\u52a0\u6e05\u6670\u7684\u7406\u89e3\u5404\u9879\u529f\u80fd\uff0c\u4ece\u800c\u5728\u4f7f\u7528\u7684\u65f6\u5019\u80fd\u66f4\u52a0\u7684\u5f97\u5fc3\u5e94\u624b\u3002
\u56fe\u50cf\u8bc6\u522b\u5728 UI \u81ea\u52a8\u5316\u4e2d\u662f\u4e0d\u53ef\u7f3a\u5c11\u7684\uff0c\u5e02\u9762\u4e0a\u751a\u81f3\u6709\u5b8c\u5168\u57fa\u4e8e\u56fe\u50cf\u8bc6\u522b\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\uff0c\u6bd4\u5982 Airtest\u3001Sikuli \u7b49\uff0c\u5728\u6e38\u620f\u7b49\u7279\u5b9a\u9886\u57df\u4e5f\u6709\u4e0d\u9519\u7684\u6548\u679c\uff0c\u8fd9\u4e9b\u5de5\u5177\u5b9e\u9645\u4e0a\u4e5f\u662f\u7528\u7684 OpenCV \u8fdb\u884c\u4e86\u5c01\u88c5\uff0cYouQu \u6846\u67b6\u57fa\u4e8e OpenCV \u5f00\u53d1\u4e86\u81ea\u5df1\u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\uff0c\u5b83\u53ef\u4ee5\u65b9\u4fbf\u7684\u7528\u4e8e\u754c\u9762\u5143\u7d20\u7684\u5b9a\u4f4d\u548c\u65ad\u8a00\uff1b
Airtest
Sikuli
YouQu \u7684\u56fe\u50cf\u8bc6\u522b\u529f\u80fd\u51e0\u4e4e\u6ee1\u8db3\u4e86\u4f60\u7684\u6240\u6709\u8981\u6c42\uff0c\u6211\u4eec\u5728\u957f\u65f6\u95f4\u7684\u601d\u8003\u548c\u6478\u7d22\u4e2d\uff0c\u9488\u5bf9\u5e38\u89c4\u573a\u666f\u53ca\u4e00\u4e9b\u7279\u6b8a\u573a\u666f\u63a2\u7d22\u9664\u4e86\u4e00\u4e9b\u5b9e\u7528\u4e14\u6709\u6548\u7684\u65b9\u6848\uff0c\u4e14\u542c\u6211\u6162\u6162\u9053\u6765\u3002
\u3010\u80cc\u666f\u3011
\u5e38\u89c4\u8bc6\u522b\u5f88\u597d\u7406\u89e3\uff0c\u4e00\u53e5\u8bdd\u8bb2\u5c31\u662f\uff0c\u8981\u83b7\u53d6\u5230\u76ee\u6807\u5143\u7d20\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u3002
\u3010\u539f\u7406\u5b9e\u73b0\u3011
\u5728\u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u9700\u8981\u83b7\u53d6\u7684\u5750\u6807\u662f\u76f8\u5bf9\u4e8e\u6574\u4e2a\u5c4f\u5e55\u7684\u5750\u6807\uff0c\u6211\u4eec\u53ef\u4ee5\u622a\u53d6\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u56fe\u7247\uff08screen\uff09\uff1b
\u5728\u5143\u7d20\u8bc6\u522b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u6211\u4eec\u9700\u8981\u622a\u53d6\u67d0\u4e2a\u5143\u7d20\u7684\u5c0f\u56fe\u8fdb\u884c\u8bc6\u522b\uff0c\u6bd4\u5982\u622a\u53d6\u64ad\u653e\u6309\u94ae\uff1a
\u90a3\u4e48\u5b9e\u9645\u4e0a\uff0c\u5143\u7d20\u5b9a\u4f4d\u7684\u95ee\u9898\u5c31\u8f6c\u6362\u4e3a\uff0c\u5c06\u622a\u56fe\u7684\u5c0f\u56fe\uff08play_btn\uff09\u62ff\u5230\u6574\u4e2a\u5c4f\u5e55\u7684\u5927\u56fe\uff08screen\uff09\u4e2d\u53bb\u505a\u5339\u914d\uff0c\u5982\u679c\u5339\u914d\u6210\u529f\uff0c\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff08 x, y \uff09\u5373\u53ef\u3002
\u4e3a\u4e86\u65b9\u4fbf\u63cf\u8ff0\uff0c\u4ee5\u4e0b\u6211\u5c06\u6574\u4e2a\u5c4f\u5e55\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5927\u56fe\uff0c\u67d0\u4e2a\u5143\u7d20\u56fe\u7247\u7684\u622a\u56fe\u79f0\u4e3a\uff1a\u5c0f\u56fe\u3002
\u57fa\u4e8e OpenCV \u7684\u6a21\u677f\u5339\u914d cv.matchTemplate() \u529f\u80fd\uff0c\u6211\u4eec\u5b9e\u73b0\u4e86\u56fe\u50cf\u5b9a\u4f4d\u7684\u529f\u80fd\uff0c\u6846\u67b6\u63d0\u4f9b\u4e86\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u5e95\u5c42\u63a5\u53e3\uff08\u4e00\u822c\u4e0d\u5bf9\u4e0a\u5c42\u63d0\u4f9b\u8c03\u7528\uff09\uff1a
cv.matchTemplate()
def _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\n# \u8be6\u7ec6\u4ee3\u7801\u592a\u957f\u4e0d\u8d34\u4e86\uff0c\u611f\u5174\u8da3\u8bf7\u67e5\u770b\u6e90\u7801\n
\u3010\u53c2\u6570\u4ecb\u7ecd\u3011
1\u3001image_path
image_path \u662f\u5c0f\u56fe\u7684\u7edd\u5bf9\u8def\u5f84;
image_path
\u901a\u5e38\u5728 AT \u5de5\u7a0b\u91cc\u9762\uff0c\u6211\u4eec\u7ea6\u5b9a\u5c06\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 widget/pic_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u5b9e\u9645\u7684\u5143\u7d20\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1aplay_btn.png \uff1b
play_btn.png
\u7528\u4e8e\u7528\u4f8b\u65ad\u8a00\u7684\u56fe\u7247\u8d44\u6e90\u653e\u5230 case/assert_res \u76ee\u5f55\u4e0b\uff0c\u56fe\u7247\u7684\u540d\u79f0\u4ee5\u7528\u4f8b\u7684\u540d\u79f0\u547d\u540d\uff0c\u5982\uff1amusic_001.png \uff1b
case/assert_res
music_001.png
\u8fd9\u6837\u662f\u4e3a\u4e86\u65b9\u4fbf\u7ba1\u7406\u548c\u7ef4\u62a4\u3002
2\u3001rate
\u56fe\u50cf\u8bc6\u522b\u7684\u7684\u5339\u914d\u5ea6\u6216\u8005\u8bf4\u76f8\u4f3c\u5ea6\uff0c\u6846\u67b6\u9ed8\u8ba4\u7684\u914d\u7f6e\u4e3a 0.9\uff0c\u4e5f\u5c31\u662f\u8bf4\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u5b58\u5728\u4e00\u4e2a\u76f8\u4f3c\u5ea6 90% \u7684\u56fe\u6807\u5373\u8fd4\u56de\u5176\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\uff1b
0.9
\u5982\u679c\u4f60\u5728\u7528\u4f8b\u4e2d\u9700\u8981\u8c03\u6574\u8bc6\u522b\u5ea6\uff0c\u4f60\u53ef\u4ee5\u5728\u8c03\u7528\u51fd\u6570\u7684\u65f6\u5019\uff0c\u4f20\u5165\u4e0d\u540c\u7684\u8bc6\u522b\u5ea6\u7684\u503c\u3002
3\u3001multiple
\u9ed8\u8ba4\u60c5\u51b5\u4e0b multiple=False\uff0c\u8868\u793a\u53ea\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u7b2c\u4e00\u4e2a\uff0c\u5982\u679c multiple=True \u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\uff0c\u56e0\u4e3a\u5927\u56fe\u4e2d\u53ef\u80fd\u5b58\u5728\u591a\u4e2a\u76f8\u540c\u7684\u5c0f\u56fe\uff0c\u5728\u67d0\u4e9b\u573a\u666f\u4e0b\u4f60\u53ef\u80fd\u9700\u8981\u5168\u90e8\u83b7\u53d6\u5230\u6240\u6709\u5339\u914d\u5230\u7684\u5750\u6807\u3002
multiple=False
multiple=True
4\u3001picture_abspath
\u9ed8\u8ba4\u60c5\u51b5\u4e0b picture_abspath=None \u8868\u793a\u5927\u56fe\u4e3a\u622a\u53d6\u7684\u5c4f\u5e55\u622a\u56fe\uff0c\u5982\u679c\u4f60\u4e0d\u5e0c\u671b\u5927\u56fe\u662f\u5c4f\u5e55\u7684\u622a\u56fe\uff0c\u800c\u662f\u4f60\u81ea\u5b9a\u4e49\u4f20\u5165\u7684\u67d0\u4e2a\u56fe\u7247\uff0c\u4f60\u53ea\u9700\u8981\u5c06\u4f60\u7684\u56fe\u7247\u8def\u5f84\u4f20\u9012\u7ed9\u8fd9\u4e2a\u53c2\u6570\u5c31\u884c\uff0c\u6bd4\u5982\uff1a picture_abspath=\"~/Desktop/big.png\" \uff1b
picture_abspath=None
picture_abspath=\"~/Desktop/big.png\"
5\u3001screen_bbox
\u5927\u56fe\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u622a\u53d6\u6574\u4e2a\u5c4f\u5e55\uff0cscreen_bbox = [x, y, w, h] \u53ef\u4ee5\u6307\u5b9a\u622a\u53d6\u5c4f\u5e55\u4e2d\u7684\u56fa\u5b9a\u533a\u57df\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\uff0c\u53ef\u4ee5\u6392\u9664\u90e8\u5206\u533a\u57df\u5bf9\u8bc6\u522b\u7ed3\u679c\u7684\u5f71\u54cd\u3002
screen_bbox = [x, y, w, h]
\u3010\u9690\u5f0f\u7b49\u5f85\u3011
\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\uff0c\u6709\u65f6\u5019\u9875\u9762\u8df3\u8f6c\u6709\u5ef6\u65f6\uff0c\u6709\u53ef\u80fd\u5b58\u5728\u8bc6\u522b\u7684\u90a3\u4e00\u523b\u9875\u9762\u4e5f\u6ca1\u6709\u8df3\u8f6c\u51fa\u6765\uff0c\u6216\u8005\u6216\u8005\u8bc6\u522b\u7684\u90a3\u4e00\u523b\uff1b
\u56e0\u6b64\u6211\u4eec\u9700\u8981\u4e00\u79cd\u7b49\u5f85\u673a\u5236\uff0c\u5373\u5728\u4e00\u5b9a\u7684\u65f6\u95f4\u5185\uff0c\u5982\u679c\u8bc6\u522b\u4e0d\u5230\uff0c\u91cd\u590d\u53bb\u8bc6\u522b\uff1a
def find_image(\ncls,\n*widget, rate: [float, int] = None,\nmultiple: bool = False,\nmatch_number: int = None,\npicture_abspath: str = None,\nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u5728\u5c4f\u5e55\u4e2d\u533a\u5bfb\u627e\u5c0f\u56fe\uff0c\u8fd4\u56de\u5750\u6807\uff0c\n \u5982\u679c\u627e\u4e0d\u5230\uff0c\u6839\u636e\u914d\u7f6e\u91cd\u8bd5\u6b21\u6570\uff0c\u6bcf\u6b21\u95f4\u96941\u79d2\n :param widget: \u6a21\u677f\u56fe\u7247\u8def\u5f84\n :param rate: \u76f8\u4f3c\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param match_number: \u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\n :return: \u5750\u6807\u5143\u7ec4\n \"\"\"\nif rate is None:\nrate = float(GlobalConfig.IMAGE_RATE)\ntry:\nfor element in widget:\nfor _ in range((match_number or int(GlobalConfig.IMAGE_MATCH_NUMBER)) + 1):\nlocate = cls._match_image_by_opencv(\nelement,\nrate,\nmultiple=multiple,\npicture_abspath=picture_abspath,\nscreen_bbox=screen_bbox\n)\nif not locate:\nsleep(int(GlobalConfig.IMAGE_MATCH_WAIT_TIME))\nelse:\nreturn locate\nraise TemplateElementNotFound(*widget)\nexcept Exception as e:\nraise e\n
\u53c2\u6570 match_number \u7528\u4e8e\u63a7\u5236\u91cd\u590d\u8bc6\u522b\u7684\u6b21\u6570\uff0c\u9ed8\u8ba4\u4e0d\u4f20\u53c2\uff0c\u53d6\u5168\u5c40\u914d\u7f6e setting/globalconfig.ini \u91cc\u9762\u7684 IMAGE_MATCH_NUMBER \u914d\u7f6e\u9879\u7684\u503c\uff0c\u9ed8\u8ba4IMAGE_MATCH_NUMBER = 1\uff0c\u5373\u91cd\u8bd5 1 \u6b21\uff1b
match_number
IMAGE_MATCH_NUMBER
IMAGE_MATCH_NUMBER = 1
find_image \u662f\u6846\u67b6\u63d0\u4f9b\u7684\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u51fd\u6570\u63a5\u53e3\uff0c\u8fd9\u4e2a\u51fd\u6570\u63d0\u4f9b\u4e86\u9690\u5f0f\u7b49\u5f85\u7684\u529f\u80fd\uff0c\u4e14\u5305\u542b\u4e0a\u9762\u4ecb\u7ecd\u7684 _match_image_by_opencv \u51fd\u6570\u7684\u6240\u6709\u529f\u80fd\u3002
find_image
_match_image_by_opencv
\u6c14\u6ce1\u8bc6\u522b\u6307\u7684\u662f\uff0c\u67d0\u4e9b\u573a\u666f\u4e0b\u8981\u5b9a\u4f4d\u7684\u5143\u7d20\u662f\u4e00\u4e9b\u4f1a\u6d88\u5931\u7684\u5c0f\u5f39\u7a97\uff0c\u8fd9\u7c7b\u573a\u666f\u5728\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\u65f6\u5c31\u53ef\u80fd\u5b58\u5728\u4e0d\u7a33\u5b9a\u6027\uff0c\u6709\u53ef\u80fd\u56fe\u50cf\u8bc6\u522b\u7684\u65f6\u5019\u6c14\u6ce1\u5df2\u7ecf\u6d88\u5931\u4e86\uff0c\u4e5f\u6709\u53ef\u80fd\u6c14\u6ce1\u51fa\u73b0\u7684\u65f6\u95f4\u592a\u77ed\u4e86\uff0c\u4e0d\u5bb9\u6613\u6355\u6349\u5230\uff0c\u5c31\u50cf\u6c14\u6ce1\u4e00\u6837\uff0c\u51fa\u73b0\u4e00\u4e0b\u5c31\u6d88\u5931\uff0c\u56e0\u6b64\u6211\u4eec\u5f62\u8c61\u7684\u79f0\u4e4b\u4e3a \u201c\u6c14\u6ce1\u8bc6\u522b\u201d\uff1b
\u4e3a\u4e86\u80fd\u7a33\u5b9a\u7684\u8bc6\u522b\u6c14\u6ce1\u7c7b\u573a\u666f\uff0c\u6211\u4eec\u91c7\u7528\u7684\u65b9\u6848\u662f\uff1a
\u5728\u4e00\u6bb5\u65f6\u95f4\u5185\uff08\u5305\u542b\u6c14\u6ce1\u4ece\u51fa\u73b0\u5230\u6d88\u5931\uff09\uff0c\u4e0d\u505c\u7684\u622a\u53d6\u8fd9\u6bb5\u65f6\u95f4\u5185\u7684\u5927\u56fe\uff0c\u4ee5\u6b64\u786e\u4fdd\u5728\u622a\u53d6\u7684\u4e00\u5806\u56fe\u7247\u4e2d\uff0c\u80af\u5b9a\u6709\u81f3\u5c11\u4e00\u5f20\u56fe\u7247\u80fd\u6355\u6349\u5230\u6c14\u6ce1\uff0c\u6700\u540e\u518d\u5bf9\u8fd9\u4e00\u5806\u56fe\u7247\u9010\u4e2a\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b
\u4ee3\u7801\u793a\u4f8b\uff1a
def get_during(\ncls,\nimage_path: str,\nscreen_time: [float, int],\nrate: float = None,\npause: [int, float] = None,\nmax_range: int = 10000\n):\n\"\"\"\n \u5728\u4e00\u6bb5\u65f6\u95f4\u5185\u622a\u56fe\u591a\u5f20\u56fe\u7247\u8fdb\u884c\u8bc6\u522b\uff0c\u5176\u4e2d\u6709\u4e00\u5f20\u56fe\u7247\u8bc6\u522b\u6210\u529f\u5373\u8fd4\u56de\u7ed3\u679c;\n \u9002\u7528\u4e8e\u6c14\u6ce1\u7c7b\u7684\u65ad\u8a00\uff0c\u6bd4\u5982\u6c14\u6ce1\u57281\u79d2\u5185\u6d88\u5931\uff0c\u5982\u679c\u7528\u5e38\u89c4\u7684\u56fe\u50cf\u8bc6\u522b\u5219\u6709\u53ef\u80fd\u65e0\u6cd5\u8bc6\u522b\u5230\uff1b\n :param image_path: \u8981\u8bc6\u522b\u7684\u6a21\u677f\u56fe\u7247\uff1b\n :param screen_time: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5355\u4f4d\u79d2\uff1b\n :param rate: \u8bc6\u522b\u7387\uff1b\n :param pause: \u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u4e0d\u95f4\u9694\uff1b\n :param max_range: \u622a\u56fe\u7684\u6700\u5927\u6b21\u6570\uff0c\u8fd9\u662f\u4e00\u4e2a\u9884\u8bbe\u503c\uff0c\u4e00\u822c\u60c5\u51b5\u4e0b\u4e0d\u6d89\u53ca\u4fee\u6539\uff1b\n \"\"\"\n
1\u3001screen_time
\u622a\u53d6\u5c4f\u5e55\u56fe\u7247\u7684\u65f6\u95f4\uff0c\u5728\u6b64\u65f6\u95f4\u5185\u4f1a\u4e0d\u65ad\u7684\u8fdb\u884c\u622a\u56fe\u64cd\u4f5c\uff0c\u5c31\u50cf\u5f55\u5236\u89c6\u9891\u4e00\u6837\uff1b
2\u3001pause
\u6bcf\u6b21\u622a\u53d6\u56fe\u7247\u7684\u95f4\u9694\u65f6\u95f4\uff0c\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u662f\u4e00\u523b\u4e0d\u505c\u7684\u622a\u56fe\uff0c\u5982\u679c\u4f60\u60f3\u6bcf\u6b21\u622a\u56fe\u5b58\u5728\u4e00\u4e9b\u95f4\u9694\u65f6\u95f4\u4f20\u5165\u5bf9\u5e94\u7684\u65f6\u95f4\u95f4\u9694\u5373\u53ef\uff0c\u5355\u4f4d\u662f\u79d2\uff0c\u6bd4\u5982\uff1apause = 0.03\uff0c\u8868\u793a 30 ms\uff0c\u76f8\u5f53\u4e8e\u5e27\u7387\u4e3a 30 \u5e27\uff1b
\u3010\u539f\u7406\u3011
\u4e3a\u4e86\u5b9e\u73b0\u8bc6\u522b\u56fe\u50cf\u7684\u76ee\u7684\uff0c\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u5c06\u56fe\u7247\u7684\u6bcf\u4e2a\u50cf\u7d20\u7684RGB\u503c\uff0c\u4e0e\u6574\u4e2a\u5c4f\u5e55\u4e2d\u7684RGB\u8fdb\u884c\u5bf9\u6bd4\uff0c\u5982\u679c\u5c0f\u56fe\u4e0a\u7684RGB\u503c\u4e0e\u5bf9\u5e94\u5927\u56fe\u4f4d\u7f6e\u7684RGB\u90fd\u76f8\u7b49\uff0c\u5219\u5339\u914d\u6210\u529f\uff0c\u5373\u53ef\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u70b9\u3002
1\u3001\u8bfb\u53d6\u5c0f\u56fe\u548c\u5927\u56fe\u7684RGB\u503c
\uff081\uff09\u5c0f\u56fe\u7684RGB\u503c
small_data = small_pic.load() # load()\u4f1a\u5c06\u56fe\u7247\u7684RGB\u503c\u83b7\u53d6\u5230\uff0c\u6570\u636e\u683c\u5f0f\u4e3a\u4e00\u4e2a\u4e8c\u7ef4\u5217\u8868\uff0c\u8d4b\u503c\u7ed9\u4e00\u4e2a\u53d8\u91cfsmall_data\u3002\n
\uff082\uff09\u5927\u56fe\u7684RGB\u503c
big_data = big_pic.load()\n
2\u3001\u5c06\u5c0f\u56fe\u4e0e\u5927\u56fe\u7684RGB\u503c\u8fdb\u884c\u5339\u914d
\uff081\uff09\u5339\u914d\u4ece\u5927\u56fe\u7684\u5750\u6807\uff080\uff0c0\uff09\u5f00\u59cb\u5339\u914d\uff0c\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b
\uff082\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\uff080\uff0c0\uff09\u5bf9\u5e94\u7684\u6240\u6709\u5c0f\u56fe\u7684RGB\u503c\u4e0d\u76f8\u7b49\uff0c\u5219\u79fb\u52a8\u5230\u4e0b\u4e00\u4e2a\u5750\u6807\u70b9\uff081\uff0c0\uff09\uff0c\u540c\u6837\u5339\u914d\u5c0f\u56fe\u91cc\u9762\u6240\u6709\u7684\u5750\u6807\u70b9\uff080\uff0c0\uff09\u2014\uff08small_pic.width\uff0csmall_pic.height\uff09\uff1b
\uff083\uff09\u6309\u7167\u8fd9\u6837\u7684\u89c4\u5f8b\u5c06\u8fd9\u4e00\u884c\u6bcf\u79fb\u52a8\u4e00\u4e2a\u5750\u6807\u70b9\uff0c\u90fd\u5c06\u5c0f\u56fe\u6240\u6709\u7684RGB\u4e0e\u5bf9\u5e94\u5927\u56fe\u7684\u503c\u8fdb\u884c\u5339\u914d\uff1b
\uff084\uff09\u5982\u679c\u5728\u5927\u56fe\u7684\u5176\u4e2d\u4e00\u4e2a\u5750\u6807\u70b9\u4e0a\u5339\u914d\u5230\u4e86\u5c0f\u56fe\u7684\u6240\u6709RGB\u503c\uff0c\u5219\u6b64\u65f6\u8fd4\u56de\u5c0f\u56fe\u5728\u5927\u56fe\u4e2d\u7684\u5750\u6807\u70b9\uff1b
\uff085\uff09\u5982\u679c\u5339\u914d\u4e86\u5927\u56fe\u6240\u6709\u7684\u5750\u6807\u70b9\uff0c\u90fd\u6ca1\u6709\u5339\u914d\u5230\uff0c\u5219\u8bf4\u660e\u5927\u56fe\u4e2d\u4e0d\u5b58\u5728\u5c0f\u56fe\uff0c\u5339\u914d\u5931\u8d25\uff1b
\u3010\u4ee3\u7801\u5b9e\u73b0\u3011
class ImageRgb:\n@staticmethod\ndef _check_match(_x, _y, small, bdata, sdata, rate):\n\"\"\"\n Matching degree of small graph and large graph matching\n \"\"\"\n@staticmethod\ndef _pre_random_point(small):\n\"\"\"\n Pre matching, take 10-20 points at random each time,\n and take coordinates randomly in the small graph\n \"\"\"\n@staticmethod\ndef _pre_random_match(_x, _y, point_list, bdata, sdata, rate):\n\"\"\"\n In the small graph, several points are randomly\n selected for matching, and the matching degree is\n also set for the random points\n \"\"\"\n@classmethod\ndef match_image_by_rgb(cls, image_name=None, image_path=None, rate=0.9):\n\"\"\"\n By comparing the RGB values of the small image with the large\n image on the screen, the coordinates of the small image on\n the screen are returned.\n \"\"\"\n
\u901a\u8fc7 match_image_by_rgb() \u8fd9\u4e2a\u51fd\u6570\uff0c\u4f20\u5165\u76ee\u6807\u5c0f\u56fe\u7684\u6587\u4ef6\u540d\u79f0\uff0c\u5373\u53ef\u8fd4\u56de\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4e2d\u5fc3\u5750\u6807\u3002
match_image_by_rgb()
\u6709\u540c\u5b66\u8981\u95ee\u4e86\uff0c\u6709 OpenCV \u5e72\u561b\u4e0d\u7528\uff0c\u6709\u5fc5\u8981\u81ea\u5df1\u5b9e\u73b0\u4e00\u4e2a\u56fe\u50cf\u8bc6\u522b\u7684\u529f\u80fd\u5417\uff0c\u4f60\u4eec\u662f\u4e0d\u662f\u95f2\u7684\u554a\uff1f
\u8fd9\u4e48\u95ee\u7684\u8bdd\uff0c\u5c0f\u4e86\uff0c\u683c\u5c40\u5c0f\u4e86\uff1b\u6211\u4eec\u81ea\u5df1\u5b9e\u73b0\u4e3b\u8981\u6709\u51e0\u65b9\u9762\u539f\u56e0\uff1a
\u5f53\u7136\uff0c\u6211\u4eec\u627f\u8ba4\u8fd9\u5957\u65b9\u6848\uff0c\u867d\u7136\u8bc6\u522b\u51c6\u786e\u7387\u6ca1\u95ee\u9898\uff0c\u4f46\u5728\u8bc6\u522b\u6548\u7387\u4e0a\u8fd8\u6ca1\u6709\u8fbe\u5230 OpenCV \u6a21\u677f\u5339\u914d\u7684\u6548\u679c\uff0c\u6211\u4eec\u7684\u65b9\u6848\u6bcf\u6b21\u8bc6\u522b\u5728 1.5s \u5de6\u53f3\uff0c\u800c OpenCV \u5728 1s \u5de6\u53f3\uff1b
\u6574\u4f53\u8bc6\u522b\u6548\u679c\u6765\u8bb2\uff0c\u6211\u8ba4\u4e3a\u8fd8\u662f\u53ef\u4ee5\u63a5\u53d7\u7684\uff0c\u4e5f\u5e0c\u671b\u6709\u5fd7\u4e4b\u58eb\u80fd\u4e00\u8d77\u4f18\u5316\u6b64\u65b9\u6848\uff0c\u4e00\u8d77\u6280\u672f\u62a5\u56fd\u3002
\u5728\u8fdc\u7a0b\u670d\u52a1\u5668\u4e0a\u90e8\u7f72 OpenCV \u7684\u73af\u5883\uff0c\u5e76\u5c06\u5176\u90e8\u7f72\u4e3a RPC \u670d\u52a1\uff0c\u6d4b\u8bd5\u673a\u4e0a\u4e0d\u7528\u5b89\u88c5 OpenCV \u4f9d\u8d56\uff0c\u800c\u662f\u901a\u8fc7\u8bf7\u6c42 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1b
\u6d4b\u8bd5\u673a\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u56fe\u7247\u4ee5\u53ca\u6a21\u677f\u56fe\u7247\uff0c\u53d1\u9001\u7ed9 RPC \u670d\u52a1\u7aef\uff0c\u670d\u52a1\u7aef\u62ff\u5230\u4e24\u5f20\u56fe\u7247\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u6700\u540e\u5c06\u8bc6\u522b\u7ed3\u679c\u8fd4\u56de\u7ed9\u6d4b\u8bd5\u673a\uff1b
\u8981\u7279\u6b8a\u8bf4\u660e\u7684\u662f\uff1a RPC \u662f\u4e00\u79cd\u534f\u8bae\uff0c\u8bb8\u591a\u8bed\u8a00\u90fd\u662f\u652f\u6301\u7684\uff0c\u6bd4\u5982\u8bf4\u670d\u52a1\u7aef\u4e5f\u53ef\u4ee5\u7528 C++ \u6765\u5b9e\u73b0\uff0c\u5ba2\u6237\u7aef\u4f7f\u7528 Python \u4e5f\u662f\u53ef\u4ee5\u8c03\u7528\u7684\u3002
\u670d\u52a1\u7aef\u4ee3\u7801\u793a\u610f\uff08Service\uff09\uff1a
from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nimport cv2 as cv\nimport numpy as np\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef _match_image_by_opencv(\nimage_path: str, \nrate: float = None, \nmultiple: bool = False, \npicture_abspath: str = None, \nscreen_bbox: List[int] = None\n):\n\"\"\"\n \u56fe\u50cf\u8bc6\u522b\uff0c\u5339\u914d\u5c0f\u56fe\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807 x, y\n :param image_path: \u56fe\u50cf\u8bc6\u522b\u76ee\u6807\u6587\u4ef6\u7684\u5b58\u653e\u8def\u5f84\n :param rate: \u5339\u914d\u5ea6\n :param multiple: \u662f\u5426\u8fd4\u56de\u5339\u914d\u5230\u7684\u591a\u4e2a\u76ee\u6807\n :param picture_abspath: \u5927\u56fe\uff0c\u9ed8\u8ba4\u5927\u56fe\u662f\u622a\u53d6\u5c4f\u5e55\uff0c\u5426\u5219\u4f7f\u7528\u4f20\u5165\u7684\u56fe\u7247\uff1b\n :param screen_bbox: \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff08\u4ec5\u652f\u6301X11\u4e0b\u4f7f\u7528\uff09\uff1b\n [x, y, w, h]\n x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\uff1by: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\uff1bw: \u5bbd\u5ea6\uff1bh: \u9ad8\u5ea6\uff1b\u6839\u636e\u5339\u914d\u5ea6\u8fd4\u56de\u5750\u6807\n \"\"\"\nif __name__ == \"__main__\":\nserver = ThreadXMLRPCServer((\"x.x.x.x\", 8889), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(match_image_by_opencv, \"match_image_by_opencv\")\nserver.serve_forever()\n
\u8fd9\u6837\uff0c\u6211\u4eec\u57fa\u4e8e Python \u6807\u51c6\u5e93 xmlrpc \u642d\u5efa\u4e86\u4e00\u4e2a RPC \u670d\u52a1\u5668\uff0c\u6ce8\u518c\u4e86 image_put \u548c match_image_by_opencv \u4e24\u4e2a\u529f\u80fd\u63a5\u53e3\uff0c\u5728\u6d4b\u8bd5\u673a\u4e0a\u53ef\u4ee5\u901a\u8fc7 IP \u548c\u7aef\u53e3\u8fdb\u884c RPC \u8bf7\u6c42\uff1b
image_put
match_image_by_opencv
\u5ba2\u6237\u7aef\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a
from xmlrpc.client import Binary\nfrom xmlrpc.client import ServerProxy\nserver = ServerProxy(GlobalConfig.OPENCV_SERVER_HOST, allow_none=True)\nscreen_rb = open(screen, \"rb\")\ntemplate_rb = open(template_path, \"rb\")\ntry:\nscreen_path = server.image_put(Binary(screen_rb.read()))\nscreen_rb.close()\ntpl_path = server.image_put(Binary(template_rb.read()))\ntemplate_rb.close()\nreturn server.match_image_by_opencv(\ntpl_path, screen_path, rate, multiple\n)\nexcept OSError as exc:\nraise EnvironmentError(\nf\"RPC\u670d\u52a1\u5668\u94fe\u63a5\u5931\u8d25. {GlobalConfig.OPENCV_SERVER_HOST}\"\n) from exc\n
\u901a\u8fc7\u8fd4\u56de server.match_image_by_opencv \u5c31\u83b7\u53d6\u4e86\u5728\u670d\u52a1\u7aef\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u3002
server.match_image_by_opencv
\u53f3\u952e\u83dc\u5355\u7684\u5143\u7d20\u5b9a\u4f4d\u662f\u4e00\u4e2a\u96be\u70b9\uff0c\u8fc7\u53bb\u6211\u4eec\u8c03\u7814\u548c\u4f7f\u7528\u8fc7\u7684\u5143\u7d20\u5b9a\u4f4d\u64cd\u4f5c\u65b9\u6cd5\u6709 4 \u79cd\uff1a
\u7b2c\u4e00\u79cd\uff1a\u6b65\u957f\u64cd\u4f5c\u6cd5
\u5728\u53f3\u952e\u83dc\u5355\u547c\u51fa\u6765\u4e4b\u540e\uff0c\u901a\u8fc7\u952e\u76d8\u7684 up\u3001down \u6309\u952e\uff0c\u8fdb\u884c\u9009\u62e9\u83dc\u5355\u9009\u62e9\uff0c\u9009\u4e2d\u76ee\u6807\u4e4b\u540e enter \u5373\u53ef\uff1b\u6bd4\u5982\uff1a\u5728\u684c\u9762\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\uff0c\u6309 1 \u6b21 down \uff0c\u4f1a\u51fa\u73b0\u4e0b\u56fe\uff1a
up
down
enter
\u7ee7\u7eed\u518d\u6309 2 \u6b21 down\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a
\u518d\u6309 enter\uff0c\u4f1a\u51fa\u73b0\u8fd9\u6837\uff1a
\u5982\u6b64\uff0c\u201c\u6392\u5e8f\u65b9\u5f0f\u201d\u7684\u6b65\u957f\u4e3a 3\uff1b\u901a\u8fc7\u4f7f\u7528\u952e\u76d8\u4e0a\u4e0b\u952e\uff0c\u5c31\u5b9e\u73b0\u4e86\u5bf9\u53f3\u952e\u83dc\u5355\u7684\u64cd\u4f5c\uff1b
\u4f46\u662f\uff0c\u8fd9\u79cd\u65b9\u5f0f\u6709\u4e2a\u5f88\u70e6\u4eba\u7684\u95ee\u9898\uff0c\u5c31\u662f\u53f3\u952e\u83dc\u5355\u7684\u9009\u9879\u4f4d\u7f6e\u4e0d\u53ef\u80fd\u4e00\u76f4\u4e0d\u53d8\uff0c\u5728\u9700\u6c42\u8fed\u4ee3\u7684\u8fc7\u7a0b\u4e2d\uff0c\u83dc\u5355\u9009\u9879\u7684\u53d8\u5316\u662f\u5f88\u5927\u7684\uff0c\u751a\u81f3\u6709\u4e9b\u5e94\u7528\u652f\u6301\u81ea\u5b9a\u4e49\u83dc\u5355\uff0c\u6bd4\u5982\u6587\u7ba1\u53f3\u952e\u83dc\u5355\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff1b
\u4e5f\u5c31\u662f\u8bf4\u4f60\u5f97\u7ecf\u5e38\u53bb\u7ef4\u62a4\u83dc\u5355\u9009\u9879\u7684\u6b65\u957f\uff0c\u4e00\u4e2a\u9009\u9879\u73b0\u5728\u7684\u6b65\u957f\u662f 3\uff0c\u4e0b\u4e2a\u8fed\u4ee3\u53ef\u80fd\u5c31\u662f 4 \u6216\u8005 5\u3002
\u7b2c\u4e8c\u79cd\uff1a\u5e38\u89c4\u56fe\u50cf\u8bc6\u522b\u6cd5
\u628a\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5355\u72ec\u622a\u56fe\u4fdd\u5b58\uff0c\u56fe\u7247\u4e2d\u4ec5\u5305\u542b\u4e00\u4e2a\u83dc\u5355\u9009\u9879\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a
\u8fd9\u6837\uff0c\u6bcf\u4e2a\u83dc\u5355\u9009\u9879\u5c31\u53ef\u4ee5\u901a\u8fc7\u56fe\u50cf\u8bc6\u522b\u7684\u65b9\u5f0f\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff1b
\u8fd9\u79cd\u65b9\u5f0f\u4e0d\u7528\u62c5\u5fc3\u83dc\u5355\u9009\u9879\u7684\u987a\u5e8f\u6216\u4f4d\u7f6e\uff0c\u4f46\u662f\u9700\u8981\u4fdd\u5b58\u5927\u91cf\u7684\u56fe\u7247\uff0c\u4e14\u5bb9\u6613\u53d7\u5230\u5b57\u4f53 UI \u53d8\u66f4\u7c7b\u9700\u6c42\u7684\u5f71\u54cd\uff0c\u6bd4\u5982\uff1a\u5b57\u4f53\u5927\u5c0f\u3001\u5b57\u4f53\u95f4\u8ddd\u7b49\u7b49\u9700\u6c42\u53d8\u66f4\u90fd\u4f1a\u5f71\u54cd\uff0c\u6bcf\u6b21\u53d8\u66f4\u4e4b\u540e\u5c31\u9700\u8981\u8fdb\u884c\u5927\u91cf\u56fe\u7247\u8d44\u6e90\u7684\u91cd\u65b0\u622a\u56fe\u66ff\u6362\uff0c\u662f\u4e2a\u6bd4\u8f83\u9ebb\u70e6\u7684\u4e8b\u60c5\uff1b
\u7b2c\u4e09\u79cd\uff1a\u76f8\u5bf9\u4f4d\u79fb\u6cd5
\u9f20\u6807\u70b9\u51fb\u53f3\u952e\u7684\u65f6\u5019\uff0c\u9f20\u6807\u7684\u5f53\u524d\u5750\u6807\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u7684\uff0c\u83dc\u5355\u9009\u9879\u7684\u5bbd\uff08 w \uff09\u4e00\u822c\u662f\u56fa\u5b9a\u7684\uff0c\u53d8\u5316\u7684\u662f\u83dc\u5355\u7684\u957f\u5ea6\uff08 h \uff09\uff0c\u53ef\u4ee5\u901a\u8fc7\u67d0\u4e2a\u9009\u9879\u76f8\u5bf9\u4e8e\u9f20\u6807\u7684\u8ddd\u79bb\u5728\u786e\u5b9a\u83dc\u5355\u9009\u9879\u7684\u5750\u6807\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a
\u901a\u8fc7\u7ef4\u62a4\u83dc\u5355\u9009\u9879\uff08\u76f8\u5bf9\u4f4d\u7f6e\uff09\u76f8\u5bf9\u4e8e\u9f20\u6807\u4f4d\u7f6e\u7684\u8ddd\u79bb\uff0c\u5373\u53ef\u8f7b\u677e\u8ba1\u7b97\u51fa\u83dc\u5355\u9009\u9879\u5728\u5c4f\u5e55\u4e2d\u7684\u5750\u6807\u3002
\u4ece\u7406\u8bba\u4e0a\u6b64\u65b9\u6848\u662f\u53ef\u884c\u7684\uff0c\u4f46\u662f\u8fd9\u91cc\u4ecd\u7136\u5b58\u5728\u4e24\u4e2a\u4e25\u91cd\u7684\u95ee\u9898\uff1a
\u57fa\u4e8e\u4ee5\u4e0a\u4e24\u4e2a\u539f\u56e0\uff0c\u6211\u4eec\u5e76\u4e0d\u63a8\u8350\u8fd9\u79cd\u64cd\u4f5c\u65b9\u6848\u3002
\u7b2c\u56db\u79cd\uff1a\u5c5e\u6027\u5b9a\u4f4d
\u6709\u540c\u5b66\u8bf4\u5e72\u561b\u4e0d\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u5462\uff0c\u5176\u5b9e\uff0c\u6211\u4eec\u6700\u5f00\u59cb\u60f3\u5230\u7684\u65b9\u6848\u5c31\u662f\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\uff0c\u4f46\u662f\u5728\u5c5e\u6027\u7684 DOM \u6811\u91cc\u600e\u4e48\u4e5f\u627e\u4e0d\u5230\uff0c\u65e0\u6cd5\u5b9a\u4f4d\u5230\uff0c\u6211\u4eec\u4e5f\u8054\u5408\u7814\u53d1\u540c\u5b66\u4e00\u8d77\u89e3\u51b3\u6b64\u95ee\u9898\uff0c\u4f46\u6700\u7ec8\u8fd8\u662f\u6ca1\u80fd\u89e3\u51b3\uff0c\u975e\u5e38\u9057\u61be\uff1b
\u7531\u4e8e\u53f3\u952e\u83dc\u5355\u9009\u9879\u51e0\u4e4e\u90fd\u662f\u6587\u672c\uff0c\u90a3\u4e48\u901a\u8fc7 OCR \u8bc6\u522b\uff0c\u51e0\u4e4e\u662f\u6700\u4f18\u7684\u65b9\u6848\uff1a
\u5173\u4e8e OCR \u8bc6\u522b\u6211\u4eec\u5728\u540e\u9762\u4f1a\u8be6\u7ec6\u8bb2\u5230\uff0c\u672c\u7ae0\u8282\u4e3b\u8981\u8bb2\u57fa\u4e8e OCR \u8bc6\u522b\uff0c\u6211\u4eec\u5728\u53f3\u952e\u83dc\u5355\u8bc6\u522b\u4e0a\u7684\u7a81\u7834\u548c\u521b\u65b0\uff1b
\u4f7f\u7528 OCR \u8bc6\u522b\u53f3\u952e\u83dc\u5355\u867d\u7136\u5df2\u7ecf\u5f88\u5b8c\u7f8e\u4e86\uff0c\u4f46\u662f\u5728\u4e00\u4e9b\u60c5\u51b5\u4e0b\u4ecd\u7136\u5b58\u5728\u4e00\u70b9\u95ee\u9898\uff0c\u5c31\u662f\u5c4f\u5e55\u4e2d\u51fa\u73b0\u591a\u4e2a\u548c\u83dc\u5355\u9009\u9879\u6587\u5b57\u76f8\u540c\u7684\u6587\u5b57\u65f6\uff0c\u6bd4\u5982\u4e0b\u9762\u8fd9\u79cd\u60c5\u51b5\uff1a
\u5c4f\u5e55\u6070\u597d\u51fa\u73b0\u4e86\u4e24\u4e2a\u201c\u590d\u5236\u201d\uff0c\u6b64\u65f6\u8981\u5b9a\u4f4d\u5230\u83dc\u5355\u4e2d\u7684 \u201c\u590d\u5236\u201d\uff0c\u5c31\u9700\u8981\u8fdb\u4e00\u6b65\u505a\u6570\u636e\u5904\u7406\uff0c\u6bd4\u5982\uff1aOCR \u8fd4\u56de 2 \u4e2a\u201c\u590d\u5236\u201d\u7684\u5750\u6807\uff0c\u7528\u4f8b\u91cc\u9762\u6765\u5224\u65ad\u7528\u54ea\u4e2a\uff0c\u4ece\u4e1a\u52a1\u4e0a\u5c06\u5904\u7406\u8d77\u6765\u6bd4\u8f83\u9ebb\u70e6\uff0c\u56e0\u4e3a\u4f60\u5f97\u660e\u786e\u77e5\u9053\u83dc\u5355\u5728\u5de6\u8fb9\u8fd8\u662f\u53f3\u8fb9\uff0c\u7136\u540e\u8fd9\u672c\u8eab\u5c31\u662f\u4e0d\u786e\u5b9a\u7684\uff1b
\u600e\u4e48\u89e3\u51b3\u8fd9\u4e2a\u95ee\u9898\u5462\uff0c\u8fd9\u5c31\u8981\u8bf4\u9053\u672c\u7ae0\u7684\u4e3b\u9898\uff1a\u524d\u540e\u5bf9\u6bd4\u56fe\u50cf\u8bc6\u522b\u3002
\u5728\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u524d\u622a\u4e00\u5f20\u56fe\uff0c\u70b9\u51fb\u53f3\u952e\u83dc\u5355\u4e4b\u540e\u518d\u622a\u53d6\u4e00\u5f20\u56fe\uff0c\u4e24\u5f20\u56fe\u552f\u4e00\u53d8\u5316\u7684\u5c31\u662f\u53f3\u952e\u83dc\u5355\uff0c\u5c06\u5176\u4ed6\u76f8\u540c\u7684\u5730\u65b9\u90fd\u5c4f\u853d\u6389\uff0c\u53ea\u7559\u4e0b\u83dc\u5355\u754c\u9762\uff0c\u5982\u6b64\u5373\u53ef\u6d88\u9664\u5e72\u6270\uff0c\u5982\u4e0b\u56fe\u6240\u793a\uff1a
\u5c06\u4e24\u79cd\u56fe\u505a\u524d\u540e\u5bf9\u6bd4\u63d0\u53d6\u53ef\u4ee5\u5f97\u5230\u8fd9\u6837\u7684\u56fe\uff1a
\u4f60\u770b\uff0c\u901a\u8fc7\u524d\u540e\u56fe\u7247\u7684\u5bf9\u6bd4\uff0c\u5c06\u76f8\u540c\u7684\u90e8\u5206\u7ed9\u6d88\u9664\u6389\uff0c\u518d\u8fdb\u884c OCR \u8bc6\u522b\uff0c\u8fd9\u6837\u5c31\u4e0d\u4f1a\u6709\u5e72\u6270\u4e86\uff1b
\u4ee3\u7801\u5b9e\u73b0\u8bf7\u67e5\u770b src/filter_image.py \uff1b
src/filter_image.py
def filter_image(action):\n\"\"\"\n \u5bf9\u6bd4\u52a8\u4f5c\u524d\u540e\u4e24\u5f20\u56fe\u7247\uff0c\u63d0\u53d6\u4e0d\u540c\u7684\u90e8\u5206\u751f\u6210\u4e00\u5f20\u65b0\u7684\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u65b0\u56fe\u7247\u7684\u8def\u5f84\n :param action: \u52a8\u4f5c\u51fd\u6570\u7684\u51fd\u6570\u5bf9\u8c61\n :return: \u65b0\u56fe\u7247\u7684\u8def\u5f84\n \"\"\"\n
action \u662f\u9f20\u6807\u4e8b\u4ef6\uff0c\u56e0\u4e3a\u6b64\u7c7b\u573a\u666f\u4e0d\u4ec5\u4ec5\u5728\u53f3\u952e\u5b58\u5728\uff0c\u5355\u51fb\u3001\u53cc\u51fb\u7b49\u7b49\uff0c\u53ea\u8981\u64cd\u4f5c\u524d\u540e\u540e\u53d8\u5316\u7684\u90fd\u53ef\u4ee5\uff1a
action
from src.mouse_key import MouseKey\naction = (\nMouseKey.click,\nMouseKey.right_click,\nMouseKey.double_click,\nMouseKey.move_to,\n)\n
\u5728\u684c\u9762\u58c1\u7eb8\u5207\u6362\uff0c\u6216\u770b\u56fe\u3001\u76f8\u518c\u5207\u6362\u56fe\u7247\u7c7b\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u7531\u4e8e\u4f60\u7684\u6d4b\u8bd5\u8d44\u6e90\u662f\u4e0d\u56fa\u5b9a\u7684\uff08\u4e0d\u540c\u7248\u672c\u7684\u7cfb\u7edf\u58c1\u7eb8\u4e0d\u540c\u3001\u58c1\u7eb8\u987a\u5e8f\u4e0d\u540c\uff0c\u770b\u56fe\u76f8\u518c\u5728\u56fe\u7247\u8d44\u6e90\u4e0d\u4e00\u5b9a\u56fa\u5b9a\uff09\uff0c\u90a3\u4e48\u5728\u6d4b\u8bd5\u5207\u6362\u58c1\u7eb8\u6216\u8005\u5207\u6362\u56fe\u7247\u7684\u573a\u666f\u65f6\u5c31\u4f1a\u5b58\u5728\u4e00\u4e2a\u95ee\u9898\uff0c\u5c31\u662f\u4f60\u4e0d\u77e5\u9053\u9884\u671f\u662f\u5565\uff0c\u7528\u4f8b\u64cd\u4f5c\u52a8\u6001\u7684\uff0c\u4e5f\u662f\u6781\u4e0d\u7a33\u5b9a\u3002
\u5728\u5207\u6362\u56fe\u7247\u4e4b\u524d\u622a\u56fe\u4fdd\u5b58\u5e76\u8fd4\u56de\u56fe\u7247\u7684\u8def\u5f84\uff0c\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u6b21\u8bc6\u522b\u8fd9\u5f20\u56fe\u7247\uff0c\u5982\u679c\u4e0d\u5b58\u5728\uff0c\u8bf4\u660e\u56fe\u7247\u5df2\u7ecf\u5207\u6362\u4e86\uff1b
\u793a\u610f\u56fe\uff1a
\u8fd9\u6837\uff0c\u6211\u4eec\u622a\u53d6\u4e86\u5f53\u524d\u56fe\u7247\u4e2d\u6bd4\u8f83\u6709\u4ee3\u8868\u6027\u7684\u4f4d\u7f6e\uff08\u4e00\u53ea\u9e1f\uff09\uff0c\u5728\u5207\u6362\u56fe\u7247\u4e4b\u540e\u518d\u7528\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff1a
\u6211\u4eec\u518d\u62ff\u7740\u8fd9\u5f20\u5c0f\u56fe\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u8fdb\u884c\u56fe\u50cf\u8bc6\u522b\uff0c\u8fd9\u6837\u5728\u5f53\u524d\u56fe\u7247\u4e2d\uff0c\u5c31\u4e0d\u80fd\u627e\u5230\u8fd9\u53ea\u9e1f\u4e86\uff0c\u56fe\u50cf\u8bc6\u522b\u7684\u7ed3\u679c\u662f False\uff0c\u90a3\u4e48\u4e5f\u5c31\u53ef\u4ee5\u5224\u65ad\u56fe\u7247\u5207\u6362\u662f\u6210\u529f\u7684\u3002
\u4ee3\u7801\u793a\u610f\uff1a
def save_temporary_picture(_x: int, _y: int, width: int, height: int):\n\"\"\"\n \u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\uff0c\u5e76\u8fd4\u56de\u56fe\u7247\u8def\u5f84\n :param x: \u5de6\u4e0a\u89d2\u6a2a\u5750\u6807\n :param y: \u5de6\u4e0a\u89d2\u7eb5\u5750\u6807\n :param width: \u5bbd\u5ea6\n :param height: \u9ad8\u5ea6\n :return: \u56fe\u7247\u8def\u5f84\n \"\"\"\n
\u6b64\u51fd\u6570\u7528\u4e8e\u5728\u64cd\u4f5c\u4e4b\u524d\u622a\u56fe\u4e00\u5f20\u4e34\u65f6\u56fe\u7247\uff0c\u8fd4\u56de\u56fe\u7247\u8def\u5f84\uff0c\u6700\u540e\u5728\u65ad\u8a00\u7684\u65f6\u5019\u518d\u5c06\u56fe\u7247\u8def\u5f84\u4f5c\u4e3a\u53c2\u6570\u4f20\u5165\u65ad\u8a00\u8bed\u53e5\u5373\u53ef\uff1b
\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u662f\u6211\u4eec\u81ea\u7814\u7684\u4e00\u79cd\u4f7f\u7528\u7b80\u5355\uff0c\u4e14\u6548\u7387\u6781\u9ad8\u3001\u7a33\u5b9a\u6027\u597d\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\uff0c\u57fa\u4e8e\u5143\u7d20\u6309\u94ae\u5728\u5e94\u7528\u4e2d\u7684\u76f8\u5bf9\u4f4d\u7f6e\uff0c\u52a8\u6001\u83b7\u53d6\u5143\u7d20\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff0c\u9002\u7528\u4e8e\u5404\u79cd\u5c4f\u5e55\u5206\u8fa8\u7387\uff08\u5305\u62ec\u9ad8\u5206\u5c4f\u3001\u5bbd\u5c4f\u3001\u5e26\u9c7c\u5c4f\uff09\uff0c\u5f53\u5143\u7d20\u6309\u94ae\u4f4d\u7f6e\u76f8\u5bf9\u4e8e\u5e94\u7528\u754c\u9762\u4f4d\u7f6e\u53d1\u751f\u4fee\u6539\u4e4b\u540e\uff0c\u53ea\u9700\u8981\u6839\u636e UI \u8bbe\u8ba1\u56fe\u4e0a\u7684\u6e90\u6570\u636e\u4fee\u6539\u5bf9\u5e94\u5750\u6807\u6570\u636e\u5c31\u597d\uff0c\u7ef4\u62a4\u975e\u5e38\u7684\u65b9\u4fbf\u3002
\u6b64\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u9002\u7528\u4e8e\u4e00\u4e9b\u5143\u7d20\u4f4d\u7f6e\u76f8\u5bf9\u4e0e\u5e94\u7528\u754c\u9762\u6bd4\u8f83\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u97f3\u4e50\uff0899% \u7684\u5143\u7d20\u5b9a\u4f4d\u91c7\u7528\u8fd9\u79cd\uff0c\u6548\u679c\u975e\u5e38\u597d\uff09\uff0c\u4e0d\u9002\u7528\u4e8e\u754c\u9762\u4e0d\u56fa\u5b9a\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u622a\u56fe\u5f55\u5c4f\uff0c\u5f88\u660e\u663e\u4e0d\u9002\u7528\u4e8e\u8fd9\u7c7b\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u3002\u8fd9\u79cd\u5168\u65b0\u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u6709\u5b83\u7684\u9002\u7528\u6761\u4ef6\uff0c\u5982\u679c\u4f60\u53d1\u73b0\u4f7f\u7528\u5e38\u89c4\u7684\uff08\u5c5e\u6027\u5b9a\u4f4d\u3001\u56fe\u50cf\u5b9a\u4f4d\uff09\u4e0d\u597d\u505a\u65f6\uff0c\u4e0d\u59a8\u8003\u8651\u4f7f\u7528\u8fd9\u79cd\uff0c\u5176\u6548\u679c\u4e00\u5b9a\u80fd\u60ca\u8bb6\u5230\u4f60\uff0c\u5e76\u4e14\u8fc5\u901f\u7231\u4e0a\u4ed6\u3002
\u5728 UI \u8bbe\u8ba1\u56fe\u4e2d\u6211\u4eec\u662f\u53ef\u4ee5\u83b7\u53d6\u5230\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u8fb9\u6846\u7684\u8ddd\u79bb\u7684\uff0c\u7136\u540e\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u6280\u672f\u624b\u6bb5\u83b7\u53d6\u5230\u5e94\u7528\u754c\u9762\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u53ca\u5e94\u7528\u7a97\u53e3\u7684\u5927\u5c0f\uff0c\u793a\u610f\u56fe\u5982\u4e0b\uff1a
\uff08x1, y1\uff09\u4e3a\u5e94\u7528\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\uff1b\uff08x2, y2\uff09\u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u5de6\u4e0a\u89d2\uff08x1, y1\uff09\u7684\u5750\u6807\uff0c\u90a3\u4e48\u5b9e\u9645\u4e0a\u3010\u64ad\u653e\u6240\u6709\u3011\u5de6\u4e0a\u89d2\u76f8\u5bf9\u4e8e\u5c4f\u5e55\u5de6\u4e0a\u89d2\uff080, 0\uff09\u7684\u4f4d\u7f6e\u4e3a\uff1a\uff08 x1 + x2, y1 + y2 \uff09\uff1b
\uff08x1, y1\uff09
\uff08x2, y2\uff09
\uff08 x1 + x2, y1 + y2 \uff09
\u662f\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u5927\u5c0f\uff08w2, h2\uff09\uff0c\u53ef\u4ee5\u4ece UI \u8bbe\u8ba1\u56fe\u4e0a\u83b7\u53d6\uff1b
\u5728 UI \u8bbe\u8ba1\u7a3f\u4e0a\u70b9\u51fb\u3010\u64ad\u653e\u6240\u6709\u3011\u56fe\u6807\uff0c\u7136\u540e\u79fb\u52a8\u9f20\u6807\u5c31\u5c31\u53ef\u4ee5\u770b\u5230\u4e0a\u56fe\u7684\u53c2\u8003\u7ebf\u53ca\u6570\u636e\uff1b
\u6240\u4ee5\uff0c\u6211\u4eec\u53ef\u4ee5\u8f7b\u677e\u7684\u83b7\u53d6\u5230\u6309\u94ae\u3010\u64ad\u653e\u6240\u6709\u3011\u7684\u4e2d\u5fc3\u5750\u6807\u4e3a\uff1a\uff08 x1 + x2 + (w2 / 2), y1 + y2 + ( h2 / 2) \uff09
\uff08 x1 + x2 + (w2 / 2), y1 + y2 + ( h2 / 2) \uff09
\u8be6\u7ec6\u6e90\u4ee3\u7801\u8bf7\u67e5\u770b AT \u57fa\u7840\u6846\u67b6: src/button_center.py
src/button_center.py
\u4f7f\u7528 xdotool \u548c xwininfo \u83b7\u53d6\u5230\u5e94\u7528\u7a97\u53e3\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u5de6\u4e0a\u89d2\uff09\u53ca\u5927\u5c0f\u3002
xdotool
xwininfo
app_id = CmdCtl.run_cmd(f\"xdotool search --classname --onlyvisible {self.app_name}\"\n).split(\"\\n\")\napp_id_list = [int(_id) for _id in app_id if _id]\nreturn CmdCtl.run_cmd(f\"xwininfo -id {app_id_list[self.number]}\")\n
\u4f7f\u7528\u6b63\u5219\u83b7\u53d6\u7a97\u53e3\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002
\u8bfb ini \u914d\u7f6e\u6587\u4ef6\uff0c\u83b7\u53d6\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e0e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u53ca\u5927\u5c0f\u3002
conf = ConfigParser()\nconf.read(self.config_path)\ndirection = conf.get(btn_name, \"direction\")\nposition = [int(i.strip()) for i in conf.get(btn_name, \"location\").split(\",\")]\n
\u6839\u636e\u5e94\u7528\u7a97\u53e3\u5728\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\u5927\u5c0f\u3001\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u5e94\u7528\u7a97\u53e3\u8fb9\u754c\u7684\u4f4d\u7f6e\u5927\u5c0f\uff0c\u4f7f\u7528\u4e00\u5b9a\u7684\u7b97\u6cd5\u5373\u53ef\u8ba1\u7b97\u51fa\u5143\u7d20\u6309\u94ae\u5728\u5f53\u524d\u5c4f\u5e55\u4e2d\u7684\u4f4d\u7f6e\uff08\u4e2d\u5fc3\u5750\u6807\uff09\u3002
\u3010\u914d\u7f6e\u65b9\u6cd5\u3011
\u57fa\u4e8e UI \u7684\u5143\u7d20\u5b9a\u4f4d\u65b9\u6848\u7684\u6570\u636e\u6e90\u662f\u5e94\u7528\u5e93\u4e2d\u7684 ui.ini \u914d\u7f6e\u6587\u4ef6\uff1a
ui.ini
;section\n[\u65b0\u5efa\u6b4c\u5355+] ;key = value\ndirection = left_top\nlocation = 180, 268, 21, 21\n
section \u662f\u4f60\u6839\u636e\u5bf9\u5e94\u7684\u5143\u7d20\u6309\u94ae\u547d\u540d\uff0c\u4f60\u53ef\u4ee5\u4efb\u610f\u547d\u540d\uff0c\u4f46\u6700\u597d\u6709\u5177\u4f53\u542b\u4e49\uff0c\u4e14\u80fd\u660e\u786e\u8868\u793a\u8fd9\u4e2a\u5143\u7d20\u6309\u94ae\u7684\u540d\u79f0\uff1b\u7528\u4e2d\u62ec\u53f7\u62ec\u8d77\u6765\u5c31\u884c\uff0c\u6bd4\u5982\uff1a[\u65b0\u5efa\u6b4c\u5355+] \uff1b
section
[\u65b0\u5efa\u6b4c\u5355+]
direction \u662f\u914d\u7f6e\u8be5\u5143\u7d20\u7684\u53c2\u8003\u7cfb\uff0c\u5206\u522b\u4e3a\uff1a
direction
left_top \u5de6\u4e0a\uff1b
left_top
left_bottom \u5de6\u4e0b\uff1b
left_bottom
right_top \u53f3\u4e0a\uff1b
right_top
right_bottom \u53f3\u4e0b\uff1b
right_bottom
\u53c2\u8003\u7cfb\u7684\u9009\u53d6\u6807\u51c6\uff1a\u62c9\u52a8\u6539\u53d8\u7a97\u53e3\u5927\u5c0f\u65f6\uff0c\u5143\u7d20\u6309\u94ae\u76f8\u5bf9\u4e8e\u53c2\u8003\u7cfb\u4f4d\u7f6e\u662f\u4e0d\u53d8\u7684\uff1b
location
\u5982\u679c UI \u56fe\u4e0a\u6ca1\u6709\u63d0\u4f9b\u4f60\u60f3\u8981\u7684\u5143\u7d20\u6570\u636e\uff0c\u4f60\u53ef\u4ee5\u76f4\u63a5\u5728\u7cfb\u7edf\u4e2d\u4f7f\u7528\u622a\u56fe\u5f55\u5c4f\u8fdb\u884c\u5c3a\u91cf\uff0c\u8fd9\u662f\u4e00\u79cd\u4e0d\u63a8\u8350\u4f46\u80fd\u7528\u7684\u65b9\u6cd5\u3002
\u3010\u8c03\u7528\u65b9\u6cd5\u3011
\u5728\u5e94\u7528\u5e93\u65b9\u6cd5\u5c42\u8fd9\u6837\u5199\uff1a
def click_add_music_list_btn_in_music_by_ui(self):\n\"\"\"\u70b9\u51fb\u65b0\u5efa\u6b4c\u5355\u6309\u94ae\"\"\"\nself.click(*self.ui.btn_center(\"\u65b0\u5efa\u6b4c\u5355+\"))\n
self.ui.btn_center() \u662f\u56fa\u5b9a\u5199\u6cd5\uff0c\u53c2\u6570\u5c31\u662f\u914d\u7f6e\u91cc\u9762\u7684 section \u3002
self.ui.btn_center()
\u4f20\u7edf\u7684 OCR \u65b9\u6848\u5927\u591a\u91c7\u7528\u8c37\u6b4c OCR\uff08Tesseract\uff09\u65b9\u6848\uff0c\u4f46\u662f\u5b83\u5bf9\u4e8e\u4e2d\u6587\u7684\u8bc6\u522b\u975e\u5e38\u5dee\uff0c\u7ecf\u8fc7\u5927\u91cf\u7684\u8c03\u7814\uff0c\u6211\u4eec\u4f7f\u7528 PaddleOCR\uff0c\u5b83\u662f\u4e00\u4e2a\u5f00\u6e90\u7684\u57fa\u4e8e\u6df1\u5ea6\u5b66\u4e60\u7684 OCR \u8bc6\u522b\u5de5\u5177\uff0c\u4e5f\u662f PaddlePaddle \u6700\u6709\u540d\u7684\u4e00\u4e2a\u5f00\u6e90\u9879\u76ee\uff0c\u611f\u5174\u8da3\u7684\u53ef\u4ee5\u70b9\u8fd9\u91cc\u4e86\u89e3\uff0c\u591a\u7684\u4e0d\u8bf4\u4e86\uff0c\u4f60\u53ea\u9700\u8981\u77e5\u9053\u5b83\u5c31\u662f\u4e2d\u6587\u8bc6\u522b\u7684\u5929\u82b1\u677f\u3002
Tesseract
PaddleOCR
PaddlePaddle
\u5b89\u88c5\u4ed6\u662f\u4e2a\u5f88\u9ebb\u70e6\u7684\u4e8b\u60c5\uff0c\u867d\u7136\u64cd\u4f5c\u5f88\u7b80\u5355\uff0c\u4f46\u5176\u5b9e\u5b89\u88c5\u5305\u6709\u70b9\u5927\uff0c\u56e0\u6b64\u6211\u4eec\u4e0d\u5e0c\u671b\u76f4\u63a5\u5728 env.sh \u4e2d\u52a0\u5165\u5b83\uff0c\u8fd9\u4f1a\u8ba9\u6574\u4e2a\u81ea\u52a8\u5316\u73af\u5883\u53d8\u5f97\u975e\u5e38\u81c3\u80bf\uff1b
\u56e0\u6b64\uff0c\u6211\u4eec\u60f3\u5230\u5c06\u5b83\u505a\u6210\u4e00\u4e2a RPC \u670d\u52a1\u5728\u5176\u4ed6\u673a\u5668\u4e0a\u90e8\u7f72\uff0c\u6d4b\u8bd5\u673a\u901a\u8fc7\u8fdc\u7a0b\u8c03\u7528 RPC \u670d\u52a1\u7684\u65b9\u5f0f\u4f7f\u7528\u5b83\uff1b
RPC \u7684\u8c03\u7528\u903b\u8f91\uff1a
\u8fd9\u6837\u6211\u4eec\u53ea\u9700\u8981\u5728\u670d\u52a1\u7aef\u90e8\u7f72\u597d OCR \u8bc6\u522b\u7684\u670d\u52a1\uff0c\u7136\u540e\u901a\u8fc7 RPC \u670d\u52a1\u5c06\u529f\u80fd\u63d0\u4f9b\u51fa\u6765\uff0c\u6846\u67b6\u91cc\u9762\u53ea\u9700\u8981\u8c03\u7528\u5bf9\u5e94\u7684 RPC \u63a5\u53e3\u5c31\u884c\u4e86\u3002
from socketserver import ThreadingMixIn\nfrom xmlrpc.server import SimpleXMLRPCServer\nfrom paddleocr import PaddleOCR\nclass ThreadXMLRPCServer(ThreadingMixIn, SimpleXMLRPCServer):\npass\nCURRENT_DIR = dirname(abspath(__file__))\ndef image_put(data):\n\"\"\"\u4e0a\u4f20\u56fe\u7247\"\"\"\ndef paddle_ocr(pic_path, lang):\n\"\"\"\n Paddleocr\u76ee\u524d\u652f\u6301\u7684\u591a\u8bed\u8a00\u8bed\u79cd\u53ef\u4ee5\u901a\u8fc7\u4fee\u6539lang\u53c2\u6570\u8fdb\u884c\u5207\u6362\n \u4f8b\u5982`ch`, `en`, `fr`, `german`, `korean`, `japan`\n :param file_name:\n :param lang:\n :return:\n \"\"\"\nif __name__ == \"__main__\":\nIP = popen(\"hostname -I\").read().split(\" \")[0]\nPORT = 8890\nSCREEN_CACHE = \"/tmp/screen.png\"\nserver = ThreadXMLRPCServer((IP, PORT), allow_none=True)\nserver.register_function(image_put, \"image_put\")\nserver.register_function(paddle_ocr, \"paddle_ocr\")\nprint(\"\u76d1\u542c\u5ba2\u6237\u7aef\u8bf7\u6c42\u3002\u3002\")\nserver.serve_forever()\n
\u6846\u67b6\u4ee3\u7801\u793a\u610f\uff08Client\uff09\uff1a
from src import OCR\nOCR.ocr(*target_strings, picture_abspath=None, similarity=0.6, return_default=False, return_first=False, lang=\"ch\"):\n# \u901a\u8fc7 OCR \u8fdb\u884c\u8bc6\u522b\u3002\n# target_strings:\n# \u76ee\u6807\u5b57\u7b26,\u8bc6\u522b\u4e00\u4e2a\u5b57\u7b26\u4e32\u6216\u591a\u4e2a\u5b57\u7b26\u4e32,\u5e76\u8fd4\u56de\u5176\u5728\u56fe\u7247\u4e2d\u7684\u5750\u6807;\n# \u5982\u679c\u4e0d\u4f20\u53c2\uff0c\u8fd4\u56de\u56fe\u7247\u4e2d\u8bc6\u522b\u5230\u7684\u6240\u6709\u5b57\u7b26\u4e32\u3002\n# picture_abspath: \u8981\u8bc6\u522b\u7684\u56fe\u7247\u8def\u5f84\uff0c\u5982\u679c\u4e0d\u4f20\u9ed8\u8ba4\u622a\u53d6\u5168\u5c4f\u8bc6\u522b\u3002\n# similarity: \u5339\u914d\u5ea6\u3002\n# return_default: \u8fd4\u56de\u8bc6\u522b\u7684\u539f\u751f\u6570\u636e\u3002\n# return_first: \u53ea\u8fd4\u56de\u7b2c\u4e00\u4e2a,\u9ed8\u8ba4\u4e3a False,\u8fd4\u56de\u8bc6\u522b\u5230\u7684\u6240\u6709\u6570\u636e\u3002\n# lang: `ch`, `en`, `fr`, `german`, `korean`, `japan`\n
\u6b64\u65b9\u6848\u5728\u6846\u67b6\u5185\u6ca1\u6709\u5f15\u5165\u4efb\u4f55\u4e09\u65b9\u4f9d\u8d56\u5b8c\u5168\u91c7\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\uff0c\u800c\u4e14\u4f7f\u7528\u65b9\u6cd5\u975e\u5e38\u7b80\u5355\uff0c\u53ea\u9700\u8981\u901a\u8fc7 OCR.ocr() \u5373\u53ef\uff1b
OCR.ocr()
\u5bf9\u4e8e\u4e00\u4e9b\u6587\u6848\u7684\u573a\u666f\u975e\u5e38\u9002\u7528\uff0c\u6b64\u65b9\u6cd5\u76f4\u63a5\u8fd4\u56de\u5750\u6807\uff0c\u53ef\u4ee5\u7528\u4e8e\u5143\u7d20\u5b9a\u4f4d\u3002
\u4e5f\u53ef\u4ee5\u7528\u4e8e\u6587\u5b57\u65ad\u8a00\uff0c\u4ee3\u7801\u793a\u610f\uff1a
def assert_ocr_exist(\n*args, picture_abspath=None, similarity=0.6, return_first=False, lang=\"ch\"\n):\n\"\"\"\u65ad\u8a00\u6587\u6848\u5b58\u5728\"\"\"\npic = None\nif picture_abspath is not None:\npic = picture_abspath + \".png\"\nres = OCR.ocr(\n*args,\npicture_abspath=pic,\nsimilarity=similarity,\nreturn_first=return_first,\nlang=lang,\n)\nif res is False:\nraise AssertionError(\n(f\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{args}\", f\"{pic if pic else GlobalConfig.SCREEN_CACHE}\")\n)\nif isinstance(res, tuple):\npass\nelif isinstance(res, dict) and False in res.values():\nres = filter(lambda x: x[1] is False, res.items())\nraise AssertionError(\n(\nf\"\u901a\u8fc7OCR\u672a\u8bc6\u522b\u5230\uff1a{dict(res)}\",\nf\"{pic if pic else GlobalConfig.SCREEN_CACHE}\",\n)\n)\n
\u5728\u7528\u4f8b\u4e2d\u4f7f\u7528\u65ad\u8a00\uff0c\u793a\u4f8b\uff1a
def test_font_manager_021(self):\n\"\"\"\u53f3\u4fa7\u2665-\u6536\u85cf/\u53d6\u6d88\u6536\u85cf\u5b57\u4f53\"\"\"\n# \u5b57\u4f53\u7ba1\u7406\u5668\u754c\u9762\u53f3\u4fa7\u8be6\u60c5\u5217\u8868\uff0c\u9009\u62e9\u672a\u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e / \u6536\u85cf\u5b57\u4f53\n# \u6536\u85cf\u5b57\u4f53\uff0c\u53f3\u952e\u83dc\u5355\u663e\u793a\u201c\u53d6\u6d88\u6536\u85cf\u201d\uff1b\n...\nself.assert_ocr_exist(\"\u53d6\u6d88\u6536\u85cf\")\n
\u6211\u4eec\u76ee\u524d\u662f\u5c06 OCR \u670d\u52a1\u90e8\u7f72\u5728\u666e\u901a\u7684\u529e\u516c\u673a\u4e0a\u7684\uff0c\u5982\u679c\u4f60\u89c9\u5f97\u73b0\u6709\u7684 OCR \u8bc6\u522b\u6027\u80fd\u4e0d\u591f\u597d\uff0c\u6070\u597d\u4f60\u6709\u66f4\u597d\u7684\u673a\u5668\uff0c\u53ef\u4ee5\u8003\u8651\u5c06\u5176\u79c1\u6709\u5316\u90e8\u7f72\u3002
\u63a8\u8350\u4f7f\u7528 pipenv \u8fdb\u884c\u73af\u5883\u642d\u5efa\uff1b
pipenv
\u5b89\u88c5 pipenv \uff1a
sudo pip3 install pipenv\n
\u65b0\u5efa\u4e00\u4e2a\u76ee\u5f55\u4f5c\u4e3a\u73af\u5883\u5305 ocr_env\uff1a
ocr_env
cd ~\nmkdir ocr_env\n
\u521b\u5efa python 3.7 \u73af\u5883\uff1a
python 3.7
cd ocr_env\npipenv --python 3.7\n
\u5b89\u88c5 OCR \u4f9d\u8d56\u5305\uff1a
pipenv install paddlepaddle -i https://mirror.baidu.com/pypi/simple\npipenv install \"paddleocr>=2.0.1\" -i https://mirror.baidu.com/pypi/simple\n
\u4e0d\u51fa\u610f\u5916\uff0c\u8fd9\u6837\u5c31\u628a\u4f9d\u8d56\u5b89\u88c5\u597d\u4e86\u3002
\u5c06\u57fa\u7840\u6846\u67b6\u4e2d\u7684 scr/ocr/pdocr_rpc_server.py \u6587\u4ef6\u62f7\u8d1d\u5230 ocr_env \u76ee\u5f55\uff0c\u540e\u53f0\u6267\u884c\u5b83\u5c31\u597d\u4e86\uff1a
scr/ocr/pdocr_rpc_server.py
cd ocr_env\nnohup pipenv run python pdocr_rpc_server.py &\n
\u4f60\u80af\u5b9a\u4e0d\u60f3\u6bcf\u6b21\u673a\u5668\u91cd\u542f\u4e4b\u540e\u90fd\u9700\u8981\u624b\u52a8\u542f\u52a8\u670d\u52a1\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u914d\u7f6e\u5f00\u673a\u81ea\u542f\u3002
\u5199\u5f00\u673a\u81ea\u542f\u670d\u52a1\u6587\u4ef6\uff1a
sudo vim /lib/systemd/system/ocr.service\n
autoocr \u540d\u79f0\u4f60\u53ef\u4ee5\u81ea\u5b9a\u4e49\uff0c\u5199\u5165\u4ee5\u4e0b\u5185\u5bb9\uff1a
autoocr
[Unit]\nDescription=OCR Service\nAfter=multi-user.target\n\n[Service]\nUser=uos\nGroup=uos\nType=idle\nWorkingDirectory=/home/uos/ocr_env\nExecStart=pipenv run python pdocr_rpc_server.py\n\n[Install]\nWantedBy=multi-user.target\n
\u6ce8\u610f\u66ff\u6362\u4f60\u7684${USER}
\u4fee\u6539\u914d\u7f6e\u6587\u4ef6\u7684\u6743\u9650\uff1a
sudo chmod 644 /lib/systemd/system/ocr.service\n
\u81ea\u542f\u670d\u52a1\u751f\u6548\uff1a
sudo systemctl daemon-reload\nsudo systemctl enable ocr.service\n
\u67e5\u770b\u670d\u52a1\u72b6\u6001\uff1a
sudo systemctl status ocr.service\n
\u4f60\u53ef\u4ee5\u518d\u91cd\u542f\u4e0b\u7535\u8111\uff0c\u770b\u770b\u670d\u52a1\u662f\u4e0d\u662f\u6b63\u5e38\u542f\u52a8\u4e86\uff0c\u6ca1\u62a5\u9519\u5c31 OK \u4e86\u3002
\u4f20\u7edf\u7684 UI \u81ea\u52a8\u5316\u5927\u591a\u90fd\u662f\u57fa\u4e8e\u6d4f\u89c8\u5668\u7684\uff0c\u6838\u5fc3\u662f\u5728\u7f51\u9875\u7684 DOM \u6811\u4e0a\u67e5\u627e\u5143\u7d20\uff0c\u5e76\u5bf9\u5176\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\uff1b
Linux \u684c\u9762\u5e94\u7528\u5927\u591a\u662f\u91c7\u7528 Qt \u7f16\u5199\u7684\uff0c\u5728 Qt \u4e2d\u4e5f\u662f\u4ece\u6700\u9876\u5c42\u7684 MainWindow \u5f00\u59cb\u6784\u5efa\u5e94\u7528\uff0c\u6240\u4ee5\u903b\u8f91\u4e5f\u662f\u4e00\u6837\u7684\uff0cQt \u5e94\u7528\u7684\u81ea\u52a8\u5316\u6d4b\u8bd5\u540c\u6837\u53ef\u4ee5\u901a\u8fc7 DOM \u6811\uff08\u5c5e\u6027\u6811\uff09\u8fdb\u884c\u5143\u7d20\u5b9a\u4f4d\uff0c\u6211\u4eec\u79f0\u4e4b\u4e3a\u5c5e\u6027\u5b9a\u4f4d\u3002
MainWindow
\u501f\u52a9\u5f00\u6e90\u5de5\u5177 dogtail \u6211\u4eec\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u83b7\u53d6\uff0c\u4ece\u800c\u8fdb\u884c\u5b9a\u4f4d\u64cd\u4f5c\u3002dogtail \u7684\u9879\u76ee\u4ecb\u7ecd\u53ef\u4ee5\u731b\u6233\u8fd9\u91cc\u3002
\u5728\u7ec8\u7aef\u8f93\u5165 sniff \u542f\u52a8 AT-SPI Browser
mikigo@mikigo-PC:~$ sniff\n
\u67e5\u770b\u5e94\u7528\u7684\u6807\u7b7e
\u5728 sniff \u91cc\u9762\u53ef\u4ee5\u770b\u5230\u7cfb\u7edf\u4e2d\u5df2\u542f\u52a8\u7684\u5e94\u7528\uff0c\u70b9\u51fb\u5e94\u7528\u540d\u79f0\u524d\u9762\u7684\u4e09\u89d2\u5f62\u56fe\u6807\uff0c\u53ef\u4ee5\u5c55\u5f00\u5e94\u7528\u7684\u6807\u7b7e\uff0c\u6240\u6709\u6807\u7b7e\u4ee5 tree \u7684\u5f62\u5f0f\u5c55\u793a\uff0c\u5bf9\u5e94\u5e94\u7528\u91cc\u9762\u7684\u7236\u7a97\u53e3\u548c\u5b50\u7a97\u53e3\u3002
\u83b7\u53d6\u5143\u7d20\u63a7\u4ef6\u7684\u6807\u7b7e\u540d\u79f0
\u9996\u5148\uff0c\u4e3a\u4e86\u65b9\u4fbf\u67e5\u770b\u5143\u7d20\u63a7\u4ef6\u5bf9\u5e94\u7684\u4f4d\u7f6e\uff0c\u5efa\u8bae\u73b0\u5728\u4e0a\u65b9\u5de5\u5177\u680f\u70b9\u51fb Actions\uff0c\u7136\u540e\u52fe\u9009 Hightlight Items\uff0c\u8fd9\u6837\u5728 sniff \u4e2d\u9f20\u6807\u9009\u4e2d\u5143\u7d20\u6807\u7b7e\u7684\u65f6\u5019\uff0c\u5e94\u7528\u4e2d\u4f1a\u6709\u76f8\u5e94\u7684\u5149\u6807\u9501\u5b9a\u3002
Actions
Hightlight Items
\u5728 sniff \u91cc\u9762\u70b9\u51fb\u8fdb\u5165\u5e94\u7528\u7684\u6807\u7b7e tree \u4e2d\u540e\uff0c\u70b9\u51fb\u76f8\u5e94\u7684\u5143\u7d20\u63a7\u4ef6\uff0c\u5728\u5de5\u5177\u4e0b\u65b9\uff0c\u4f1a\u5c55\u793a\u5143\u7d20\u63a7\u4ef6\u7684 Name\uff0c\u8fd9\u4e2a\u5c31\u662f\u6807\u7b7e\u540d\u79f0\u3002
Name
\u5728 tree \u4e2d\u6709\u4e9b\u5730\u65b9\u662f\u7a7a\u767d\u7684\u6216\u8005\u662f Form\uff0c\u662f\u56e0\u4e3a\u5f00\u53d1\u4eba\u5458\u5728\u6dfb\u52a0\u6807\u7b7e\u7684\u65f6\u5019\u6ca1\u6709\u6dfb\u52a0\uff0c\u6216\u8005\u6709\u4e9b\u7236\u7a97\u53e3\u4e0d\u9700\u8981\u6dfb\u52a0\uff0c\u8fd9\u79cd\u5728\u5b9e\u9645\u4e1a\u52a1\u4e2d\u662f\u4e0d\u5f71\u54cd\u7684\uff0c\u6211\u4eec\u53ea\u8981\u4fdd\u8bc1\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\u4e2d\uff0c\u8981\u7528\u5230\u7684\u5143\u7d20\u90fd\u6dfb\u52a0\u4e86\u6807\u7b7e\u5373\u53ef\u3002
\u83b7\u53d6\u5e94\u7528\u5bf9\u8c61
dogtail \u83b7\u53d6\u5e94\u7528\u5bf9\u8c61\u7684\u65f6\u5019\uff0c\u4f7f\u7528\u7684\u662f tree \u5e93\u91cc\u9762\u7684 application() \u65b9\u6cd5\uff1a
from dogtail.tree import root\napp_obj = root.application('deepin-music')\n
app_obj\u5c31\u662f\u5e94\u7528\u7684\u5bf9\u8c61\u3002
\u83b7\u53d6\u5143\u7d20\u5bf9\u8c61\uff0c\u662f\u5e94\u7528\u5bf9\u8c61\u4f7f\u7528child()\u65b9\u6cd5\uff1a
element = app_obj.child('element_name')\n
\u6211\u4eec\u53ef\u4ee5\u901a\u8fc7\u4f20\u5165\u5143\u7d20\u7684 Name\uff0c\u83b7\u53d6\u5230\u76f8\u5e94\u5143\u7d20\u7684\u5bf9\u8c61\u3002Name \u53ef\u4ee5\u901a\u8fc7 sniff \u67e5\u770b\u3002
element_list = element.children\n
\u83b7\u53d6\u5230\u8fd9\u4e2a\u5143\u7d20\u4e0b\u9762\u6240\u6709\u7684\u5143\u7d20\u5217\u8868\u3002
\u8fd9\u4e2a\u65b9\u6cd5\u9002\u7528\u4e8e\u6709\u4e9b\u6807\u7b7e\u6ca1\u6709\u6dfb\u52a0\uff0c\u4f46\u662f\u4f4d\u7f6e\u662f\u56fa\u5b9a\u7684\uff0c\u6211\u4eec\u901a\u8fc7\u7d22\u5f15\u53ef\u4ee5\u53d6\u5f97\u5143\u7d20\u3002
element_list[0]\n
\u5728\u83b7\u53d6\u5230\u5143\u7d20\u4e4b\u540e\uff0c\u6211\u4eec\u5c31\u53ef\u4ee5\u5bf9\u5143\u7d20\u8fdb\u884c\u76f8\u5e94\u7684\u64cd\u4f5c\u3002
element.click(button=1)\n
button 1 \u2014>\u5de6\u952e\uff0c2 \u2014>\u6eda\u8f6e\uff0c3 \u2014>\u53f3\u952e\uff0c\u9ed8\u8ba4\u4e3a 1
element.doubleClick(button=1)\n
element.point()\n
\u9f20\u6807\u79fb\u52a8\u5230\u5143\u7d20\u4e2d\u5fc3\u4f4d\u7f6e
element.typeText(string)\n
\u5411\u5143\u7d20\u5bf9\u8c61\u8f93\u5165\u5b57\u7b26\u4e32 \uff0c\u6bd4\u5982\u8f93\u5165\u6846
element.keyCombo(comboString)\n
# \u8be6\u7ec6\u4ee3\u7801\u8bf7\u67e5\u770b src/dogtail_utils.py\nclass DogtailUtils:\ndef __init__(self, name=None, description=None):\nself.name = name\nself.description = description\nself.obj = root.application(self.name, self.description)\ndef app_element(self, *args, **kwargs):\n\"\"\"\n \u83b7\u53d6app\u5143\u7d20\u7684\u5bf9\u8c61\n :return: \u5143\u7d20\u7684\u5bf9\u8c61\n \"\"\"\nreturn self.obj.child(*args, **kwargs, retry=False)\ndef element_center(self, element) -> tuple:\n\"\"\"\n \u83b7\u53d6\u5143\u7d20\u7684\u4e2d\u5fc3\u4f4d\u7f6e\n :param element:\n :return: \u5143\u7d20\u4e2d\u5fc3\u5750\u6807\n \"\"\"\n_x, _y, _w, _h = self.app_element(element).extents\n_x = _x + _w / 2\n_y = _y + _h / 2\nreturn _x, _y\n
\u6846\u67b6\u63d0\u4f9b\u7684\u63a5\u53e3\u975e\u5e38\u7b80\u6d01\uff0c\u5728\u8c03\u7528\u65f6\uff1a
self.dog.element_center(\"\u64ad\u653e\")\n
\u8fd9\u6837\u5c31\u80fd\u83b7\u53d6\u5230\u6b64\u5143\u7d20\u7684\u4e2d\u5fc3\u5750\u6807\u3002
\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a
PMS\u7528\u4f8bID
\u9ed8\u8ba4\u4f7f\u7528\u7528\u4f8b\u5e93 ID\uff0c\u5bf9\u4e8e\u6682\u65f6\u6ca1\u6709\u4f7f\u7528\u7528\u4f8b\u5e93\u7ba1\u7406\u7528\u4f8b\u7684\u9879\u76ee\uff0c\u53ef\u4ee5\u4f7f\u7528\u4ea7\u54c1\u5e93\u7528\u4f8b ID\uff1b
\u7528\u4f8b\u7ea7\u522b\uff1a\u5bf9\u5e94 PMS \u4e0a\u7528\u4f8b\u7ea7\u522b\uff0c\u5206\u522b\u7528 L1\u3001L2\u3001L3\u3001L4 \u8868\u793a\uff1b
L1\u3001L2\u3001L3\u3001L4
\u7528\u4f8b\u7c7b\u578b\uff1aFUNC\uff08\u529f\u80fd\uff09\u3001API\uff08\u63a5\u53e3\uff09\u3001BASELINE\uff08\u57fa\u7ebf\uff09\u3001PERF\uff08\u6027\u80fd\uff09\u3001STR\uff08\u538b\u529b\uff09\u3001SEC\uff08\u5b89\u5168\uff09\u3001CTS\uff08\u517c\u5bb9\u6027\uff09
FUNC
API
BASELINE
PERF
STR
SEC
CTS
\u4e0a\u7ebf\u5bf9\u8c61\uff1aCICD\uff0c\u8868\u793a\u4e0a\u7ebf\u5230 CICD \u6d41\u6c34\u7ebf\u7684\u7528\u4f8b\uff0c\u540e\u7eed\u53ef\u4e00\u952e\u751f\u6210 case_list.csv \u6587\u4ef6\uff0c\u7528\u4e8e\u5bfc\u5165\u5230\u660e\u9053\u4e91 AT \u7528\u4f8b\u5217\u8868\u4e2d\u63a7\u5236 CICD \u8dd1\u6d4b\u8303\u56f4\uff1b
C1 / C2 / C3 / C4
skip-XXX
fixed-XXX
removed-\u5df2\u5e9f\u5f03
\u793a\u4f8b\uff1a
2.1\u3001\u5728\u5b50\u9879\u76ee\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u4ee5\u7528\u4f8b\u7684 py \u6587\u4ef6\u9664\u53bb\u9996\u5b57\u7b26\u4e32 \"test_\" \u548c\u7528\u4f8b\u5e8f\u53f7\u540e\u7684\u5b57\u7b26\u4e32\u4f5c\u4e3a csv \u7684\u6587\u4ef6\u540d\u3002
\u4f8b\u5982:
test_album_xxx.py
album.csv
\u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u6240\u6709 csv \u6587\u4ef6\u5efa\u8bae\u653e\u5728\u4e00\u4e2a tags \u76ee\u5f55\u4e0b\u3002
tags
\u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002
2.2\u3001\u7b2c\u4e00\u5217\u4e3a\u811a\u672c ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b\u7528\u4f8b\u6807\u7b7e\u53ef\u4ee5\u65e0\u5e8f\u3002
\u4f20\u7edf\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668(@pytest.mark.skip)\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a;
@pytest.mark.skip
\u5c06\u8df3\u8fc7\u7528\u4f8b\u64cd\u4f5c\u4e5f\u6574\u5408\u8fdb\u5165\u7528\u4f8b\u6807\u7b7e\uff0c\u5728 csv \u6587\u4ef6\u4e2d\u65b0\u589e\u4e00\u5217\u4e3a\u201c\u8df3\u8fc7\u539f\u56e0\u201d\uff1b
SKIPED
arrch64
mips64
\u76ee\u524d\u6846\u67b6\u9ed8\u8ba4\u4ec5\u652f\u6301\u67b6\u6784\u7684\u6761\u4ef6\u5224\u65ad\uff0c\u4f46\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u903b\u8f91\u652f\u6301\u81ea\u5b9a\u4e49\u6dfb\u52a0\u3002
\u5728\u9879\u76ee\u76ee\u5f55\u8def\u5f84\u4e0b\u5b58\u5728\u6587\u4ef6 setting/skipif.py\uff0c\u6240\u6709\u6761\u4ef6\u5224\u65ad\u8df3\u8fc7\u7684\u51fd\u6570\u5199\u5728\u6b64\u6587\u4ef6\u4e2d\u3002
\u9ed8\u8ba4\u67b6\u6784\u5224\u65ad\u4f8b\u5b50\uff1a
def skipif_platform(args: str):\n\"\"\"\u5e73\u53f0\u8df3\u8fc7\"\"\"\n_skip_key = args.split(\"&\")\nfor key in _skip_key:\nif GlobalConfig.SYS_ARCH == key:\nreturn True\nreturn False\n
\u65b9\u6cd5\u7f16\u5199\u89c4\u8303\uff1a
True
False
\u5728 csv \u6587\u4ef6\u8df3\u8fc7\u539f\u56e0\u4e00\u680f\u4e2d\u586b\u5199\u4e3a \u201c{\u51fd\u6570\u540d}-{\u53c2\u6570}\u201d\uff0c\u4f8b\u5982\uff1askipif_platform-aarch64\uff1b\u5728\u7528\u4f8b\u6536\u96c6\u9636\u6bb5\u4f1a\u4ee5\u7b2c\u4e00\u4e2a \u201c-\u201d \u8fdb\u884c\u5206\u5272\uff0c\u622a\u53d6\u7684\u5de6\u4fa7\u5b57\u7b26\u4e32\u4f5c\u4e3a\u51fd\u6570\u540d\uff0c\u5728 skipif.py \u6587\u4ef6\u4e2d\u67e5\u627e\u662f\u5426\u6709\u540c\u540d\u51fd\u6570\uff0c\u5e76\u5c06\u622a\u53d6\u7684\u53f3\u4fa7\u4f5c\u4e3a\u53c2\u6570\u4f20\u9012\u7ed9\u8be5\u51fd\u6570\uff0c\u901a\u8fc7\u83b7\u53d6\u8be5\u51fd\u6570\u8fd4\u56de\u7684\u5e03\u5c14\u503c\uff0c\u8fd4\u56de True\uff0c\u5219\u7528\u4f8b\u4e0d\u6267\u884c\uff0c\u8fd4\u56de False\uff0c\u5219\u6267\u884c\u8be5\u7528\u4f8b\u3002
skipif_platform-aarch64
skipif.py
\u82e5\u51fd\u6570\u9700\u8981\u591a\u4e2a\u53c2\u6570\uff0c\u53ef\u81ea\u5b9a\u4e49\u591a\u4e2a\u53c2\u6570\u4e4b\u95f4\u7684\u8fde\u63a5\u7b26\uff0c\u8fde\u63a5\u7b26\u53f7\u4e0d\u53ef\u4f7f\u7528\u4e0b\u5212\u7ebf\u548c\u9017\u53f7\uff0c\u63a8\u8350\u7edf\u4e00\u4f7f\u7528 & \u7b26\u53f7\u3002
&
\u9488\u5bf9\u4e8e\u67d0\u4e9b\u7528\u4f8b\u4fee\u590d\u540e\uff0c\u4f46\u4e0d\u80fd\u7acb\u5373\u5220\u9664\u8df3\u8fc7\u539f\u56e0\uff08skip-XXX\uff09\u7684\u7528\u4f8b\uff0c\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u786e\u8ba4\u4fee\u590d\u201d\uff0c\u4f5c\u4e3a\u6807\u8bb0\u8be5\u7528\u4f8b\u662f\u5426\u5df2\u7ecf\u4fee\u590d\uff0c\u56fa\u5b9a\u586b\u5165\u5b57\u6bb5\u4e3a \u201cfixed-\u5df2\u4fee\u590d\u201d\u3002\u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u5373\u4f7f\u540c\u65f6\u6807\u8bb0\u4e86 skip-XXX \u4e5f\u4f1a\u6b63\u5e38\u6267\u884c\u3002
fixed-\u5df2\u4fee\u590d
\u3010\u540c\u65f6\u6807\u8bb0\u4e86skip \u548c fixed\uff0c\u4f46\u4ecd\u7136\u60f3\u8981\u8df3\u8fc7\u7528\u4f8b\u3011
\u5f53 \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u540c\u65f6\u586b\u5165\u540e\uff0c\u547d\u4ee4\u884c\u4f20\u9012\u53c2\u6570 --ifixed yes\uff0c\u5219\u4ee3\u7801\u4e0d\u4f1a\u6267\u884c\u8be5\u6761\u7528\u4f8b\u3002
--ifixed yes
python3 manage.py run --ifixed yes\n
\u770b\u5230\u8fd9\u91cc\u6709\u4e9b\u540c\u5b66\u53ef\u80fd\u8981\u95ee\u4e86\uff0c\u6211\u60f3\u6062\u590d\u8df3\u8fc7\u6267\u884c\uff0c\u76f4\u63a5\u628a skip-XXX \u8fd9\u4e00\u5217\u6807\u7b7e\u5220\u6389\u4e0d\u5c31\u597d\u4e86\uff0c\u8fd8\u641e\u4ec0\u4e48\u786e\u8ba4\u4fee\u590d\u5e72\u5565\uff1f
\u8fd9\u91cc\u7ed9\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u89e3\u91ca\u4e00\u4e0b\uff1a
\uff08\u4ee5\u4e0b\u6d41\u6c34\u7ebf\u6307\u7684\u662f\u6bcf\u65e5\u6784\u5efa\u7684\u6d41\u6c34\u7ebf\uff0c\u8dd1 AT \u7684\u5168\u91cf\u7528\u4f8b\uff09
\u9996\u5148\uff0c\u6d41\u6c34\u7ebf\u4e0a\u8dd1\u7684\u662f AT \u5386\u53f2 Tag\uff0c\u8df3\u8fc7\u7528\u4f8b\u7684\u6807\u7b7e(skip-XXX) \u662f\u5728\u6700\u65b0\u7684\u4ee3\u7801\u4e0a\u63d0\u4ea4\u7684\uff0c\u6211\u4eec\u91c7\u7528\u6700\u65b0\u7684 csv \u6587\u4ef6\u8986\u76d6\u5386\u53f2 csv \u6587\u4ef6\u7684\u8bbe\u8ba1\u6765\u5b9e\u73b0\u4e86\u5bf9\u5386\u53f2 Tag \u4e0a\u7528\u4f8b\u7684\u8df3\u8fc7\uff1b
\u7136\u540e\uff0c\u5728\u65e5\u5e38\u8df3\u8fc7\u7528\u4f8b\u7684\u8fc7\u7a0b\u4e2d\uff0c\u540c\u65f6\u4e5f\u5728\u4fee\u590d\u4e00\u4e9b\u7528\u4f8b\uff0c\u4fee\u590d\u540e\u7684\u8fd9\u4e9b\u7528\u4f8b\u5728\u672c\u5730\u8c03\u8bd5\u7684\u65f6\u5019\u6211\u4eec\u4e0d\u5e0c\u671b\u7ee7\u7eed\u8df3\u8fc7\uff0c\u4f46\u662f\u6b64\u65f6\uff0c\u4fee\u590d\u7684\u8fd9\u4e9b\u7528\u4f8b\u53ef\u80fd\u8fd8\u4e0d\u7a33\u5b9a\uff0c\u4e0d\u9002\u5408\u9a6c\u4e0a\u653e\u5230\u6d41\u6c34\u7ebf\u53bb\u8dd1\uff0c\u4e5f\u5c31\u662f\u8bf4\u6d41\u6c34\u7ebf\u4e0a\u6211\u4eec\u662f\u5e0c\u671b\u4ed6\u7ee7\u7eed\u8df3\u8fc7\u7684\uff0c\u56e0\u6b64\uff0c\u54b1\u4e0d\u80fd\u76f4\u63a5\u628a skip-XXX \u5e72\u6389\uff1b
\u8fd9\u91cc\u5c31\u77db\u76fe\u4e86\uff0c\u4e00\u4e2a\u9700\u6c42\u662f\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u53e6\u4e00\u4e2a\u9700\u6c42\u53c8\u4e0d\u60f3\u4fee\u590d\u4e86\u7acb\u9a6c\u89e3\u9664\u8df3\u8fc7\uff0c\u600e\u4e48\u529e\u5462\uff1f
\u6211\u4eec\u4f7f\u7528\u201c\u786e\u8ba4\u4fee\u590d\u201d\u6765\u6807\u8bb0\u8fd9\u6761\u7528\u4f8b\u5df2\u7ecf\u4fee\u590d\u4e86\uff0c\u8fd9\u6837\u4f60\u672c\u5730\u8c03\u8bd5\u7528\u4f8b\u7684\u65f6\u5019\u8fd9\u6761\u5df2\u4fee\u590d\u7684\u7528\u4f8b\u662f\u4f1a\u6267\u884c\u7684\uff0c\u540c\u65f6\u5728\u6d41\u6c34\u7ebf\u4e0a\u5c06 --ifixed yes \u53c2\u6570\u52a0\u4e0a\uff0c\u90a3\u4e48\u6d41\u6c34\u7ebf\u4e0a\u6267\u884c\u65f6\u8fd9\u6761\u7528\u4f8b\u4ecd\u7136\u662f\u8df3\u8fc7\u7684\u72b6\u6001\uff0c\u540e\u7eed\u4f60\u6253 Tag \u7684\u65f6\u5019\uff0c\u628a \u201c\u8df3\u8fc7\u539f\u56e0\u201d \u548c \u201c\u786e\u8ba4\u4fee\u590d\u201d \u4e2d\u7684\u6807\u7b7e\u5168\u90e8\u5220\u6389\u5c31\u53ef\u4ee5\u4e86\u3002
\u8fd9\u5c31\u662f\u201c\u786e\u8ba4\u4fee\u590d\u201d\u8fd9\u4e2a\u6807\u7b7e\u7684\u80cc\u666f\uff0c\u9700\u8981\u5404\u4f4d\u770b\u5b98\u7a0d\u5fae\u54c1\u4e00\u54c1\u3002
\u9488\u5bf9\u67d0\u4e9b\u7528\u4f8b\uff0c\u7531\u4e8e\u9700\u6c42\u53d8\u66f4\uff0c\u73af\u5883\u5f71\u54cd\u6216\u8bc4\u4f30\u4e0d\u518d\u9002\u7528\u4e8e\u81ea\u52a8\u5316\u6d4b\u8bd5\u65f6\uff0c\u7528\u4f8b\u9700\u8981\u5e9f\u5f03\uff0c\u5219\u65b0\u589e\u4e00\u5217\u6807\u7b7e\u540d\u4e3a \u201c\u5e9f\u5f03\u7528\u4f8b\u201d\uff0c\u8be5\u5217\u5b58\u5728 \u201cremoved-{\u5e9f\u5f03\u539f\u56e0}\u201d\uff0c\u5219\u7528\u4f8b\u4e0d\u4f1a\u6267\u884c\u3002
\u4e0a\u9762\u4ecb\u7ecd Pytest \u6846\u67b6\u63d0\u4f9b\u7684\u6807\u7b7e\u529f\u80fd mark\uff0c\u4f7f\u7528\u65f6\u9700\u8981\u4e3a\u6bcf\u4e00\u4e2a\u7528\u4f8b\u6dfb\u52a0\u6807\u7b7e\u88c5\u9970\u5668\uff0c\u5219\u64cd\u4f5c\u590d\u6742\uff0c\u53ef\u7ef4\u62a4\u6027\u5dee\uff0c\u5176\u6839\u672c\u95ee\u9898\u5c31\u662f\u6807\u7b7e\u5206\u6563\u5728\u6bcf\u4e00\u6761\u7528\u4f8b\u7684\u88c5\u9970\u5668\u4e0a\uff0c\u96be\u4ee5\u96c6\u4e2d\u7ef4\u62a4\uff1b\u4e8e\u662f\u4e4e\u5c06\u6240\u6709\u6807\u7b7e\u4f7f\u7528 csv \u6587\u4ef6\u8fdb\u884c\u96c6\u4e2d\u7ba1\u7406\uff0c\u5e76\u901a\u8fc7 Pytest \u7684\u94a9\u5b50\u51fd\u6570\uff0c\u8bfb\u53d6 csv \u6587\u4ef6\uff0c\u52a8\u6001\u6dfb\u52a0\u6807\u7b7e\u5230\u7528\u4e2d\u3002
\u6b64\u914d\u7f6e\u6587\u4ef6\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u6807\u7b7e\u6570\u636e\uff0c\u4e14\u8981\u65b9\u4fbf\u80fd\u4f7f\u7528Excel\u6253\u5f00\u8fdb\u884c\u7f16\u8f91\u67e5\u770b\uff0c\u66f4\u91cd\u8981\u7684\u662f\u6211\u4eec\u4e0d\u60f3\u5f15\u5165\u4e09\u65b9\u4f9d\u8d56\uff0cCSV \u6587\u4ef6\u51e0\u4e4e\u662f\u552f\u4e00\u80fd\u6ee1\u8db3\u6240\u6709\u7684\u8981\u6c42\u7684\u6587\u4ef6\u683c\u5f0f\u3002
\u57fa\u4e8e YouQu \u81ea\u52a8\u5316\u6d4b\u8bd5\u6846\u67b6\u64cd\u4f5c\u65b9\u6cd5\u5c01\u88c5\u5199\u6cd5\uff0c\u901a\u5e38\u662f\u8fd9\u6837\u7684\uff1a\u7c7b\u91cc\u9762\u4e00\u4e2a\u51fd\u6570\u53ea\u5305\u542b\u4e00\u4e2a\u64cd\u4f5c\u6216\u591a\u6b21\u8c03\u7528\u7684\u4e00\u7cfb\u5217\u53ef\u5408\u5e76\u7684\u64cd\u4f5c\uff1b
\u4f20\u7edf\u7684\u65e5\u5fd7\u8f93\u51fa\u65b9\u5f0f\uff0c\u9700\u8981\u5728\u6bcf\u4e2a\u51fd\u6570\u91cc\u9762\u4e3b\u52a8\u7f16\u5199\u65e5\u5fd7\u8f93\u51fa\u4ee3\u7801 \uff0c\u4f8b\u5982\uff1a
class XXXWidget:\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\nlogger.info(\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\")\n...\n# \u7701\u7565\u4ee3\u7801\u90e8\u5206\n
\u4e00\u4e2a\u51fd\u6570\u91cc\u9762\u81f3\u5c11\u5305\u542b\u4e00\u6761\u65e5\u5fd7\u4fe1\u606f\uff0c\u5982\u679c\u6bd4\u8f83\u590d\u6742\u64cd\u4f5c\u6b65\u9aa4\uff0c\u53ef\u80fd\u5305\u542b\u591a\u6761\u65e5\u5fd7\u4fe1\u606f\uff1b
\u4e00\u4e2a\u5e94\u7528\u542b\u6709\u5927\u91cf\u7684\u64cd\u4f5c\u51fd\u6570\uff0c\u4e5f\u5c31\u662f\u8bf4\u6211\u4eec\u9700\u8981\u5199\u5927\u91cf\u7684\u65e5\u5fd7\u4ee3\u7801\uff1b
\u901a\u8fc7\u7ecf\u9a8c\u89c2\u5bdf\uff0c\u6211\u4eec\u53d1\u73b0\uff0c\u51fd\u6570\u8bf4\u660e\u4ee5\u53ca\u51fd\u6570\u64cd\u4f5c\u65e5\u5fd7\uff0c\u5177\u6709\u8f83\u9ad8\u7684\u91cd\u590d\u5ea6\uff08\u4ece\u4e0a\u9762\u7684\u4f8b\u5b50\u4e5f\u53ef\u4ee5\u770b\u51fa\u6765\uff09\uff0c\u56e0\u6b64\u6211\u4eec\u5927\u80c6\u7684\u8bbe\u60f3\uff0c\u80fd\u4e0d\u80fd\u57fa\u4e8e\u6846\u67b6\u6267\u884c\u65f6\uff0c\u81ea\u52a8\u7684\u5c06\u51fd\u6570\u8bf4\u660e\u4f5c\u4e3a\u65e5\u5fd7\u6253\u5370\u51fa\u6765\uff0c\u4ece\u800c\u51cf\u5c11\u5927\u91cf\u65e5\u5fd7\u4ee3\u7801\u91cf\u548c\u91cd\u590d\u7f16\u5199\uff0c\u90a3\u771f\u662f\u5999\u554a~\u3002
\u57fa\u4e8e\u6b64\u201c\u5929\u771f\u201d\u7684\u60f3\u6cd5\uff0c\u6211\u4eec\u8bbe\u8ba1\u51fa\u4e86 youqu \u7684\u65e5\u5fd7\u7cfb\u7edf\u3002
\u6838\u5fc3\u539f\u7406\uff1a
\u901a\u8fc7\u7ed9\u7c7b\u52a0\u4e0a\u4e00\u4e2a\u88c5\u9970\u5668 @log\uff0c\u52a8\u6001\u7ed9\u8be5\u7c7b\u4e0b\u6240\u6709\u7684\u51fd\u6570\u53ca\u7236\u7c7b\u51fd\u6570\u6dfb\u52a0\u65e5\u5fd7\u88c5\u9970\u5668 @_trace\uff0c\u5728\u6b64\u88c5\u9970\u5668\u4e2d\u6211\u4eec\u80fd\u52a8\u6001\u7684\u6355\u83b7\u6240\u8c03\u7528\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff08func.__doc__\uff09\uff0c\u901a\u8fc7\u65e5\u5fd7\u8f93\u51fa\u5668\u5c06\u5176\u8f93\u51fa\u5373\u53ef\u3002
@log
@_trace
func.__doc__
\u5b9e\u73b0\u6b65\u9aa4\uff1a
inspect.getmembers
setattr(\u7c7b, \u65b9\u6cd5, _trace\uff09
[log_cli]\n;\u65e5\u5fd7\u76f8\u5173\u914d\u7f6e\uff08\u4e0d\u6253\u5370\u6784\u9020\u51fd\u6570\u548c\u9b54\u6cd5\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff09\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = INFO\n# ============= \u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u914d\u7f6e ================\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u5f00\u5934\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7, \u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_STARTSWITH = Assert\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u7ed3\u5c3e\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_ENDSWITH = Widget\n;\u652f\u6301\u7c7b\u540d\u5305\u542b xxx \u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_CONTAIN = ShortCut\n# ==============================================\n
\u5728\u5e94\u7528\u5e93 widget \u65b9\u6cd5\u5e93\u91cc\u9762\uff0c\u53ea\u9700\u8981\u5728\u51fa\u53e3\u6587\u4ef6\u52a0\u4e0a\u7c7b\u88c5\u9970\u5668\uff0c\u5c31\u53ef\u4ee5\u5b9e\u73b0\u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u4e86\uff1b
# dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\ndef click_xxx(self):\n\"\"\"\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n
\u6ce8\u610f\uff0c\u662f\u7c7b\u88c5\u9970\u5668\u3002
\u5b9e\u4f8b\uff1a
# dfm_widget.py\nfrom src import log\n@log\nclass DfmWidget():\n\"\"\"\u6587\u7ba1\u65b9\u6cd5\u5e93\u51fa\u53e3\"\"\"\n@classmethod\ndef find_dfm_image(cls, *elements, multiple=False, rate=0.9):\n\"\"\"\n \u67e5\u627e\u56fe\u7247 {{elements}}.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e {{rate}} \u7684\u5750\u6807\n :param elements:\n :param multiple:\n :return:\n \"\"\"\nelement = tuple(map(lambda x: f\"{Config.PIC_RES_PATH}/{x}\", elements))\nreturn cls.find_image(*element, multiple=multiple)\n
\u8c03\u7528\u65b9\u6cd5\u65f6\uff1a
DfmWidget.find_dfm_image(\"dfm_001\")\n
\u81ea\u52a8\u8f93\u51fa\u7684\u65e5\u5fd7\uff1a
>> x86_64-uos-6: 02/28 17:48:47 | INFO | logger_utils: [find_dfm_image]: \u67e5\u627e\u56fe\u7247 dfm_001.png \u5728\u5c4f\u5e55\u4e2d\u76f8\u4f3c\u5ea6\u5927\u4e8e 0.9 \u7684\u5750\u6807\n
\u52a0\u4e0a\u88c5\u9970\u5668 @log \u4e4b\u540e\uff0c\u65b9\u6cd5\u5c42\u6240\u6709\u7684\u51fd\u6570\uff08\u5305\u62ec\u5b9e\u4f8b\u65b9\u6cd5\u3001\u7c7b\u65b9\u6cd5\u3001\u9759\u6001\u65b9\u6cd5\uff09\u90fd\u4e0d\u9700\u8981\u518d\u5199\u65e5\u5fd7\u4ee3\u7801\uff0c\u6267\u884c\u7684\u65f6\u5019\u4f1a\u81ea\u52a8\u8f93\u51fa\uff0c\u5e76\u4e14\u6240\u6709\u8c03\u7528\u7684\u65b9\u6cd5\u4f1a\u4ee5 allure.step \u7684\u65b9\u5f0f\uff0c\u5c55\u793a\u5728 allure \u62a5\u544a\u4e2d\uff0c\u5728\u62a5\u544a\u4e2d\u66f4\u80fd\u4e00\u76ee\u4e86\u7136\u7684\u770b\u5230\u7528\u4f8b\u6267\u884c\u6b65\u9aa4\u3002
allure.step
\u3010\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\u3011
\u901a\u8fc7\u89c2\u5bdf\u524d\u9762\u7684\u4f8b\u5b50\uff0c\u7ec6\u5fc3\u7684\u540c\u5b66\u53ef\u80fd\u8fd8\u53d1\u73b0\u4e86\u4e00\u4e2a\u5c0f\u7ec6\u8282\uff1a\u51fd\u6570\u529f\u80fd\u8bf4\u660e\u4e2d\uff0c\u4e24\u5bf9\u5927\u62ec\u53f7\u4e2d\u7684\u5185\u5bb9 {{elements}} \u4f5c\u4e3a\u53d8\u91cf\u8f93\u51fa\u51fa\u6765\u4e86\uff1b
{{elements}}
\u6ca1\u9519\uff0c\u8fd9\u5c31\u662f\u6211\u4eec\u53c2\u8003Django \u548c jinja2 \u7684\u6a21\u677f\u8bed\u6cd5\u8bbe\u8ba1\u51fa\u7684\u65e5\u5fd7\u6a21\u677f\u8bed\u6cd5\uff0c\u4f7f\u7528\u65b9\u6cd5\u5f88\u7b80\u5355\uff0c\u7528\u4e24\u5bf9\u5927\u62ec\u53f7\u628a\u51fd\u6570\u7684\u53c2\u6570\u62ec\u8d77\u6765\uff0c\u8fd9\u6837\u5728\u65e5\u5fd7\u8f93\u51fa\u7684\u65f6\u5019\u5c31\u80fd\u628a\u8c03\u7528\u51fd\u6570\u65f6\u53c2\u6570\u7684\u503c\u8f93\u51fa\u51fa\u6765\u3002
Django
jinja2
YouQu \u7684\u73af\u5883\u4f9d\u8d56\u4e00\u76f4\u575a\u6301 2 \u4e2a\u539f\u5219\uff1a
\u6709\u4e9b\u540c\u5b66\u5199\u4e00\u4e9b\u529f\u80fd\uff0c\u9996\u5148\u60f3\u5230\u7684\u5c31\u662f\u53bb\u641c\u7d22\u5f15\u64ce\u641c\u4e00\u4e0b\uff0c\u770b\u6709\u6ca1\u6709\u73b0\u6210\u7684\u5de5\u5177\u6216\u8005\u4ee3\u7801\u76f4\u63a5\u80fd\u7528\uff0c\u7f8e\u5176\u540d\u66f0\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\uff0c\u522b\u4eba\u5df2\u7ecf\u9020\u597d\u4e86\u8f6e\u5b50\u54b1\u4eec\u5c31\u4e0d\u8981\u91cd\u590d\u53bb\u9020\u4e86\uff0c\u7136\u540e\u4e00\u5207\u4f3c\u4e4e\u90fd\u53d8\u5f97\u90a3\u4e48\u7684\u7406\u6240\u5e94\u5f53\u3002
\u5f53\u7136\u8fd9\u6837\u505a\u65e0\u53ef\u539a\u975e\uff0c\u6211\u76f8\u4fe1\u6709\u8fd9\u6837\u60f3\u6cd5\u5e76\u4e14\u4e00\u76f4\u8df5\u884c\u8fd9\u6837\u505a\u6cd5\u7684\u540c\u5b66\u4e0d\u5728\u5c11\u6570\uff0c\u4f46\u8fd9\u6837\u505a\u6709\u4e00\u4e2a\u5f88\u4e25\u91cd\u7684\u95ee\u9898\uff0c\u5c31\u662f\u5f53\u4f60\u5199\u4e00\u4e2a\u5927\u578b\u9879\u76ee\u65f6\uff0c\u4f60\u4f1a\u5f15\u5165\u975e\u5e38\u975e\u5e38\u975e\u5e38\u591a\u7684\u4f9d\u8d56\uff0c\u6bd4\u5982\u8981\u505a\u4e2a\u63a5\u53e3\u8bf7\u6c42\u8981\u7528 requests\u3001\u8bfb\u5199\u4e2a\u6570\u636e\u7528 pandas\u3001\u5199\u4e2a\u8868\u683c\u7528 pyopenxl\u3001\u89e3\u6790\u4e2a\u6587\u672c\u8981\u7528\u8fd9\u4e2a\u90a3\u4e2a\u4e09\u65b9\u5e93 ... \u3002
\u6211\u8ba4\u4e3a\u8fd9\u662f\u975e\u5e38\u4e0d\u597d\u7684\u4e60\u60ef\uff0c\u5728\u5b9e\u73b0\u4e00\u4e2a\u529f\u80fd\u7684\u65f6\u5019\uff0c\u9996\u5148\u6211\u4eec\u5e94\u8be5\u53bb\u60f3\u81ea\u5df1\u600e\u4e48\u6837\u53bb\u5b9e\u73b0\uff0c\u5c3d\u91cf\u4f7f\u7528\u6807\u51c6\u5e93\u53bb\u505a\uff1b
\u5982\u679c\u4f60\u4e0d\u4f1a\uff0c\u4f60\u53ef\u4ee5\u53bb\u5b66\u4e60\u4e09\u65b9\u5e93\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u522b\u4eba\u4e09\u65b9\u5e93\u4e5f\u662f\u7528\u6807\u51c6\u5e93\u5b9e\u73b0\u7684\uff0c\u4e3a\u4ec0\u4e48\u54b1\u4eec\u4e0d\u884c\u5462\uff1b\u5982\u679c\u522b\u4eba\u7684\u4f60\u5b9e\u5728\u662f\u770b\u4e0d\u61c2\uff0c\u60f3\u5c3d\u4e00\u5207\u529e\u6cd5\u786e\u5b9e\u505a\u4e0d\u51fa\u6765\uff0c\u90a3\u518d\u8003\u8651\u5f15\u5165\u8fd9\u4e2a\u4e09\u65b9\u5e93\uff0c\u6211\u8ba4\u4e3a\u8fd9\u6837\u662f\u6ca1\u95ee\u9898\u7684\uff0c\u6bd5\u7adf\u54b1\u4eec\u6bb5\u4f4d\u8fd8\u4e0d\u591f\uff0c\u4f46\u5e0c\u671b\u5c06\u6765\u6709\u4e00\u5929\u6211\u4eec\u53ef\u4ee5\u3002
\u8fd9\u6837\u7684\u505a\u6cd5\u624d\u5e94\u8be5\u662f\u201c\u4e0d\u8981\u91cd\u590d\u9020\u8f6e\u5b50\u201d\u6b63\u786e\u7684\u64cd\u4f5c\u3002\u4e0d\u4f1a\u6ca1\u5173\u7cfb\uff0c\u770b\u770b\u522b\u4eba\u662f\u600e\u4e48\u5b9e\u73b0\u7684\uff0c\u81ea\u5df1\u518d\u6478\u7d22\u7740\u5199\u51fa\u6765\uff0c\u8fd9\u6837\u81ea\u5df1\u624d\u80fd\u6709\u6240\u63d0\u9ad8\uff0c\u4e0d\u7136\u4f60\u5c31\u53ea\u4f1a\u7528\u522b\u4eba\u7684\u4e1c\u897f\uff1b\u90a3\u4e9b\u5632\u7b11\u3001\u6279\u8bc4\u6211\u4eec\u91cd\u590d\u9020\u8f6e\u5b50\u7684\u4eba\uff0c\u5148\u60f3\u60f3\u81ea\u5df1\u4f1a\u9020\u8f6e\u5b50\u5417\u3002
\u672c\u7740\u81ea\u5df1\u5b9e\u73b0\u80fd\u5b9e\u73b0\u7684\u4e00\u5207\u7684\u539f\u5219\uff0cYouQu \u6846\u67b6\u505a\u5230\u4e86\u975e\u5e38\u5c11\u7684\u73af\u5883\u4f9d\u8d56\uff0c\u800c\u4e14\u6211\u4eec\u4ecd\u5728\u4e0d\u65ad\u52aa\u529b\uff0c\u51cf\u5c11\u73af\u5883\u90e8\u7f72\u7684\u4f9d\u8d56\u3002
\u5927\u6587\u4ef6\u4e0d\u80fd\u4e0a\u4f20\u5230\u5de5\u7a0b\u91cc\u9762\uff0c\u4fdd\u6301\u6574\u4e2a\u5de5\u7a0b\u7684\u8f7b\u91cf\u5316\uff0c\u8fd9\u6837\u5728\u514b\u9686\u4ee3\u7801\u7684\u65f6\u5019\u624d\u80fd\u975e\u5e38\u5feb\u901f\u65b9\u4fbf\u4f7f\u7528\uff0c\u6211\u4eec\u89c1\u8fc7\u4e00\u4e2a AT \u5de5\u7a0b clone \u5927\u5c0f\u8fbe\u5230\u597d\u51e0\u4e2a G\uff0c\u7b80\u76f4\u4e0d\u53ef\u601d\u8bae\u3002
\u5176\u5b9e\u4ee3\u7801\u6587\u4ef6\u7684\u5927\u5c0f\u662f\u5f88\u5c0f\u7684\uff0c\u4e5f\u5c31\u662f\u8bf4\uff0c\u7eaf\u5199\u4ee3\u7801\u968f\u4fbf\u5199\u5de5\u7a0b\u4e5f\u4e0d\u4f1a\u592a\u5927\uff0c\u800c\u6587\u6863\uff08\u5305\u542b\u63d2\u56fe\uff09\u7b49\u8d44\u6e90\u5374\u662f\u5f88\u5360\u7a7a\u95f4\u3002
\u56e0\u6b64\u6211\u4eec\u9009\u62e9\u5c06 YouQu \u7684\u6587\u6863\u5de5\u7a0b\u5355\u72ec\u8fc1\u51fa\u5230\u72ec\u7acb\u7684\u4ed3\u5e93 youqu-docs \u3002
\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u8fd0\u884c env.sh \u5373\u53ef\u3002
\u5982\u679c\u5e94\u7528\u5e93\u8fd8\u9700\u8981\u5176\u4ed6 Python \u4f9d\u8d56\u5e93\uff0c\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\u4fdd\u5b58\u4e00\u4e2a requirement.txt \u6587\u4ef6\uff1b
autotest_xxx\n\u251c\u2500\u2500 requirement.txt\n\u251c\u2500\u2500 case ...\n
\u91cc\u9762\u5199\u5165\u9700\u8981\u5b89\u88c5\u7684\u4e09\u65b9\u4f9d\u8d56\uff0c\u6bd4\u5982\u50cf\u8fd9\u6837\uff1a
# requirement.txt\nPyYAML==6.0 # \u6307\u5b9a\u5b89\u88c5\u67d0\u4e2a\u7248\u672c\nrequests # \u672a\u6307\u5b9a\u7248\u672c\u5219\u5b89\u88c5\u6700\u65b0\u7248\n
\u5728\u6267\u884c bash env.sh \u65f6\u4f1a\u4e00\u5e76\u5c06\u5176\u5b89\u88c5\u3002
bash env.sh
\u5982\u679c\u591a\u4e2a\u5e94\u7528\u5e93\u90fd\u5b58\u5728 requirement.txt \u6587\u4ef6\uff0c\u6267\u884c env.sh \u65f6\u4f1a\u5c06\u591a\u4e2a requirement.txt \u6587\u4ef6\u4e00\u5e76\u52a0\u8f7d\uff1b\u90a3\u4e48\u4e00\u5b9a\u8981\u6ce8\u610f\u591a\u4e2a requirement.txt \u6587\u4ef6\u53ef\u80fd\u5b58\u5728\u76f8\u540c\u7684\u4f9d\u8d56\u88ab\u6307\u5b9a\u5b89\u88c5\u4e0d\u540c\u7248\u672c\u7b49\u7b49\u517c\u5bb9\u6027\u95ee\u9898\u3002
\u5728\u67d0\u4e9b\u60c5\u51b5\u4e0b\uff0c\u53ef\u80fd\u4f60\u53ea\u9700\u8981\u5b89\u88c5\u4e00\u4e9b\u6700\u6700\u57fa\u7840\u7684\u4f9d\u8d56\uff0c\u5176\u4ed6\u7684\u90fd\u4e0d\u9700\u8981\uff0c\u6bd4\u5982\u7eaf\u63a5\u53e3\u81ea\u52a8\u5316\u7684\u9879\u76ee\uff0c\u5b83\u4e0d\u9700\u8981 UI \u81ea\u52a8\u5316\u76f8\u5173\u7684\u4f9d\u8d56\u3002
\u4f60\u53ea\u9700\u8981\u5728\u5e94\u7528\u5e93\u6839\u76ee\u5f55\u4e0b\uff0c\u5b58\u653e\u4e00\u4e2a BASICENV \u7684\u666e\u901a\u6587\u4ef6\uff0c\u91cc\u9762\u4e0d\u9700\u8981\u5199\u4efb\u4f55\u5185\u5bb9\uff0c\u8fd9\u6837\u6267\u884c env.sh \u65f6\uff0c\u53ea\u4f1a\u5b89\u88c5\u6700\u57fa\u7840\u7684\u4f9d\u8d56\u3002
BASICENV
autotest_xxx\n\u251c\u2500\u2500 BASICENV # \u53ef\u4ee5\u4f7f\u7528\uff1atouch BASICENV \u521b\u5efa\u6587\u4ef6\n\u251c\u2500\u2500 case ...\n
\u57fa\u7840\u4f9d\u8d56\u4ec5\u5b89\u88c5\u4ee5\u4e0b\u51e0\u4e2a\u5305\uff1a
pytest # pytest\npytest-rerunfailures # \u5931\u8d25\u91cd\u8dd1\u63d2\u4ef6\npytest-timeout # \u7528\u4f8b\u8d85\u65f6\u63d2\u4ef6\nallure-pytest # \u751f\u6210 allure \u62a5\u544a\u63d2\u4ef6\nallure.deb # allure \u62a5\u544a\u67e5\u770b\u5de5\u5177\n
\u88c1\u526a\u4f9d\u8d56 \u548c \u65b0\u589e\u4f9d\u8d56 \u662f\u4e0d\u51b2\u7a81\u7684\uff0c\u53ef\u4ee5\u540c\u65f6\u4f7f\u7528\u3002
\u88c1\u526a\u4f9d\u8d56
\u65b0\u589e\u4f9d\u8d56
\u6b64\u65b9\u6848\u9ed8\u8ba4\u4e3a\u865a\u62df\u73af\u5883\u90e8\u7f72\uff0c\u5982\u679c\u4f60\u60f3\u76f4\u63a5\u90e8\u7f72\u5728\u672c\u673a\u4e0a\uff1a
bash env_dev.sh\n
\u5f55\u5c4f\u5176\u5b9e\u662f\u4e00\u79cd\u89c6\u9891\u5f62\u5f0f\u7684\u65e5\u5fd7\uff0c\u56e0\u4e3a\u5f88\u591a\u65f6\u5019\u6211\u4eec\u5728\u67e5\u770b\u65e5\u5fd7\u4e4b\u540e\u4ecd\u7136\u65e0\u6cd5\u51c6\u786e\u7684\u5b9a\u4f4d\u5230\u7528\u4f8b\u5931\u8d25\u7684\u5177\u4f53\u539f\u56e0\uff0c\u56e0\u6b64\u7528\u4f8b\u7684\u5f55\u5c4f\u80fd\u8ba9\u6211\u4eec\u770b\u5230\u7528\u4f8b\u5728\u6267\u884c\u8fc7\u7a0b\uff1b
\u3010\u4f7f\u7528\u65b9\u6cd5\u3011
\u5728 globalconfig.ini \u91cc\u9762\u914d\u7f6e\u5173\u6ce8 2 \u4e2a\u53c2\u6570\uff1b
;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\u3002\n;\u6ce8\u610f\uff0c\u7528\u4f8b\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u4e0d\u80fd\u5c0f\u4e8e\u5931\u8d25\u5f55\u5c4f\u6b21\u6570\uff0c\u5373 RERUN >= RECORD_FAILED_CASE\nRECORD_FAILED_CASE = 1\n
\u9ed8\u8ba4\u5931\u8d25\u91cd\u8dd1\u7684\u6b21\u6570\u662f 1 \u6b21\uff1b
RECORD_FAILED_CASE = 1 \u8868\u793a\u7528\u4f8b\u7b2c1\u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff1b
RECORD_FAILED_CASE = 1
RECORD_FAILED_CASE = 0 \u8868\u793a\u4e0d\u7ba1\u7528\u4f8b\u6210\u529f\u6216\u5931\u8d25\u90fd\u5f55\u5c4f\uff1b
RECORD_FAILED_CASE = 0
\u5f55\u5c4f\u662f\u8981\u5360\u7528\u7cfb\u7edf\u8d44\u6e90\u7684\uff0c\u7279\u522b\u662f\u5728\u4e00\u4e9b\u914d\u7f6e\u8f83\u4f4e\u7684\u673a\u5668\u4e0a\u4f1a\u5f88\u660e\u663e\uff0c\u6240\u4ee5\u4f60\u9700\u8981\u8003\u8651\u662f\u5426\u6709\u5fc5\u8981\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1b
\u4f7f\u7528 manage.py \u6267\u884c\u7528\u4f8b\u9ed8\u8ba4\u8bfb\u53d6\u5230 globalconfig.ini \u91cc\u9762\u7684\u53c2\u6570\uff0c\u6267\u884c\u5b8c\u4e4b\u540e\u4f1a\u5728 report/record \u76ee\u5f55\u4e0b\u4fdd\u5b58\u5931\u8d25\u7528\u4f8b\u7684\u5f55\u5c4f\u548c\u65ad\u8a00\u7684\u90a3\u4e2a\u65f6\u95f4\u70b9\u7684\u622a\u5c4f\uff0c\u4f60\u53ef\u4ee5\u901a\u8fc7\u89c6\u9891\u6587\u4ef6\u770b\u5230\u5931\u8d25\u7528\u4f8b\u6267\u884c\u8fc7\u7a0b\u90fd\u53d1\u751f\u4e86\u4ec0\u4e48\u3002
report/record
Wayland \u4e0b\u81ea\u52a8\u5316\u4e3b\u8981\u95ee\u9898\u662f X11 \u4e0b\u7684\u952e\u9f20\u64cd\u4f5c\u65b9\u6cd5\u65e0\u6cd5\u4f7f\u7528\uff0c\u6bd4\u5982 Xdotool\u3001 PyAutoGUI\u3001Xwininfo \u7b49\u7b49\uff1b
Xwininfo
YouQu \u5728 Wayland \u4e0b\u517c\u5bb9\u9002\u914d\uff0cenv.sh \u5728 Wayland \u4e0b\u6267\u884c\u65f6\u4f1a\u5b89\u88c5\u81ea\u7814\u7684\u952e\u9f20\u64cd\u4f5c\u670d\u52a1\uff08\u53ef\u80fd\u5b58\u5728\u4e00\u4e9b\u4f9d\u8d56\u62a5\u9519\uff0c\u6309\u7167\u6ce8\u91ca\u89e3\u51b3\u5373\u53ef\uff09\uff0c\u6846\u67b6\u6838\u5fc3\u5e93\u4e5f\u9488\u5bf9\u6027\u7684\u505a\u4e86\u9002\u914d\uff0c\u4e0a\u5c42\u7528\u4f8b\u5b8c\u5168\u4e0d\u7528\u5173\u5fc3\u673a\u5668\u662fWayland \u8fd8\u662f X11\uff0c\u6846\u67b6\u4f1a\u6839\u636e\u6267\u884c\u65f6\u72b6\u6001\u81ea\u52a8\u5224\u65ad\u8d70\u4e0d\u540c\u7684\u903b\u8f91\uff1b
\u7b80\u5355\u8bb2\u5c31\u662f\uff0c\u5e94\u7528\u5e93\u53ea\u9700\u8981\u7ef4\u62a4\u4e00\u5957\u7528\u4f8b\u811a\u672c\u5373\u53ef\u3002
\u3010\u7528\u4f8b\u517c\u5bb9\u3011
\u56e0\u4e3a Wayland \u4e0b\u6709\u4e9b\u5e94\u7528\u7684\u754c\u9762\u663e\u793a\u548c\u529f\u80fd\u672c\u8eab\u5b58\u5728\u4e00\u4e9b\u5dee\u5f02\uff0c\u7528\u4f8b\u5c42\u53ef\u80fd\u9700\u8981\u5bf9\u8fd9\u90e8\u5206\u7528\u4f8b\u505a\u903b\u8f91\u5224\u65ad\uff0c\u4f7f\u7528\u5168\u5c40\u914d\u7f6e\u91cc\u9762\u7684\u5e38\u91cf\u8fdb\u884c\u903b\u8f91\u7f16\u5199\u5373\u53ef\uff1a
from setting.globalconfig import GlobalConfig\n# GlobalConfig.IS_WAYLAND \u83b7\u53d6\u5230\u5f53\u524d\u7684\u663e\u793a\u670d\u52a1\u5668\uff08bool\uff09\n# \u5e94\u7528\u5e93 Config \u7ee7\u627f GlobalConfig\nif Config.IS_WAYLAND:\npass\nif Config.IS_X11:\npass\n
\u6bd4\u5982\u7528\u4f8b\u91cc\u9762\u5982\u679c\u65ad\u8a00\u7684\u56fe\u7247\u4e0d\u540c\uff1a
if Config.IS_WAYLAND:\nself.assert_image_exist(\"wayland_XXX\")\nelse:\nself.assert_image_exist(\"x11_XXX\")\n
\u8fd9\u6837\u8fd9\u6761\u7528\u4f8b\u811a\u672c\u5728 Wayland \u548c X11 \u4e0b\u90fd\u53ef\u4ee5\u8dd1\uff0cso easy \u662f\u4e0d\u662f\uff1f\u5b8c\u5168\u6ca1\u5fc5\u8981\u4e13\u95e8\u62c9\u65b0\u5206\u652f\u8fdb\u884c Wayland \u9002\u914d\u3002
\u6267\u884c\u65f6\u4f1a\u5728\u6839\u76ee\u5f55\u4e0b\u52a8\u6001\u751f\u6210 report \u76ee\u5f55\uff0c\u6240\u6709\u7684\u62a5\u544a\u76f8\u5173\u7684\u6587\u4ef6\u4f1a\u7edf\u4e00\u5b58\u653e\u5728\u91cc\u9762\uff0c\u793a\u4f8b\uff1a
/report\n \u251c\u2500\u2500 allure # allure\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json\n \u251c\u2500\u2500 allure_html # \u751f\u6210\u7684html\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 index.html \u251c\u2500\u2500 allure_back # allure\u62a5\u544a\u5907\u4efd\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 20221108114823\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json\n \u251c\u2500\u2500 json # json\u62a5\u544a\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 result_deepin-music_20221109134736_1081333.json\n \u251c\u2500\u2500 logs # \u65e5\u5fd7\u6587\u4ef6\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 2022-11-10_debug.log \u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-10_error.log\n \u251c\u2500\u2500 record # \u5f55\u5c4f\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 2022-11-09\n \u2502\u00a0\u00a0 \u251c\u2500\u2500 ...\n \u2502\u00a0\u00a0 \u2514\u2500\u2500 15\u65f614\u520609\u79d2_test_music_303_2_autotest.mp4\n \u2514\u2500\u2500 xml # xml\u62a5\u544a\n\u2514\u2500\u2500 autotest_deepin_music-20221109134736.xml\n
\u9ed8\u8ba4\u60c5\u51b5\u4e0b\u540c\u65f6\u751f\u6210 html\u3001xml\u3001json\u4e09\u79cd\u5f62\u5f0f\u7684\u62a5\u544a\u3002
\u6211\u4eec\u5bf9 allure \u62a5\u544a\u8fdb\u884c\u4e86\u4e00\u7cfb\u5217\u7684\u5b9a\u5236\uff1a
html
\u5728 report/allure \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u4e00\u5806\u6587\u672c\u6587\u4ef6\uff0c\u8fd9\u4e9b\u662f allure \u63d2\u4ef6\u751f\u6210\u7684\u62a5\u544a\u6e90\u6570\u636e\uff0c\u6211\u4eec\u5728 report/allure_html \u76ee\u5f55\u4e0b\u7ed9\u4f60\u751f\u6210\u4e86 html \u6587\u4ef6\uff0c\u4f46\u662f\u4f60\u4e0d\u80fd\u76f4\u63a5\u901a\u8fc7\u6d4f\u89c8\u5668\u6253\u5f00 index.html \u6587\u4ef6\uff0c\u56e0\u4e3a allure \u7684\u62a5\u544a\u90fd\u662f\u57fa\u4e8e\u5728\u7ebf\u7684\u670d\u52a1\uff0c\u4f60\u5e94\u8be5\u8fd9\u6837\u6253\u5f00\uff1a
report/allure
report/allure_html
index.html
allure open report/allure_html\n
\u4f7f\u7528 manage.py \u6267\u884c\u5b8c\u4e4b\u540e\uff0c\u5728\u7ec8\u7aef\u7684\u6700\u540e\u4e00\u884c\uff0c\u6211\u4eec\u4f1a\u7ed9\u4f60\u8f93\u51fa\u6253\u5f00\u62a5\u544a\u7684\u547d\u4ee4\uff0c\u76f4\u63a5\u590d\u5236\u5b83\u5728\u7ec8\u7aef\u6267\u884c\u5c31\u53ef\u4ee5\u67e5\u770b\u4e86\uff0c\u50cf\u8fd9\u6837\uff1a
\u7ec8\u7aef\u6267\u884c\u547d\u4ee4: allure open /tmp/youqu/report/allure_html \u67e5\u770b\u62a5\u544a
\u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 Pycharm \u91cc\u9762\u627e\u5230 index.html \u6587\u4ef6\uff0c\u7136\u540e\u53f3\u952e\u9009\u62e9\u6d4f\u89c8\u5668\u6253\u5f00\uff0c\u6216\u8005\u4f60\u53ef\u4ee5\u7528\u4e00\u4e2a http \u670d\u52a1\u6253\u5f00\u3002
\u4f60\u4e5f\u53ef\u4ee5\u76f4\u63a5\u5728 report/allure \u76ee\u5f55\u4e0b\u67e5\u770b\u62a5\u544a\uff1a
allure serve report/allure\n
\u8fdc\u7a0b\u6267\u884c\u7ed3\u675f\u4e4b\u540e\uff0c\u4f1a\u5c06\u6240\u6709\u8fdc\u7a0b\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u62a5\u544a\u90fd\u6536\u96c6\u5230 report/allure \u76ee\u5f55\u4e0b\uff0c\u5206\u522b\u6309\u7167\u673a\u5668\u7684 IP \u7b49\u5efa\u4e86\u4e0d\u540c\u7684\u76ee\u5f55\uff0c\u4f60\u53ef\u4ee5\u5728\u8fd9\u4e9b\u76ee\u5f55\u91cc\u9762\u53bb\u67e5\u770b\u5bf9\u5e94\u7684\u6d4b\u8bd5\u62a5\u544a\uff0c\u67e5\u770b\u65b9\u6cd5\u548c\u524d\u9762\u672c\u5730\u6267\u884c\u67e5\u770b\u7684\u65b9\u6cd5\u4e00\u6837\u3002
\u4e3a\u4e86\u5e2e\u52a9\u5f00\u53d1\u8005\u7edf\u4e00\u4ee3\u7801\u98ce\u683c\uff0cPython \u793e\u533a\u63d0\u51fa\u4e86 PEP8 \u4ee3\u7801\u7f16\u7801\u98ce\u683c\uff0cPython \u5b98\u65b9\u540c\u65f6\u63a8\u51fa\u4e86\u4e00\u4e2a\u68c0\u67e5\u4ee3\u7801\u98ce\u683c\u662f\u5426\u7b26\u5408 PEP8 \u7684\u5de5\u5177\uff0c\u540d\u5b57\u4e5f\u53eb PEP8\u3002
PEP8
\u4f46\u662f\uff0cPycharm \u91cc\u9762\u7684 PEP8 \u63d2\u4ef6\u5b9e\u9645\u4e0a\u5e76\u4e0d\u80fd\u53d1\u73b0\u5f88\u591a\u4ee3\u7801\u95ee\u9898\uff0c\u8fd9\u4e9b\u95ee\u9898\u5e76\u4e0d\u4f1a\u5728\u8fd0\u884c\u65f6\u62a5\u9519\uff0c\u56e0\u4e3a\u4ece Python \u8bed\u8a00\u89d2\u5ea6\u5e76\u4e0d\u5173\u5fc3\u8fd9\u4e9b\u95ee\u9898\uff0c\u5728 Pycharm \u7f16\u8f91\u5668\u91cc\u9762\u4f7f\u7528\u5feb\u6377\u952e ctrl + alt + L\uff0c\u6709\u4e00\u70b9\u70b9\u683c\u5f0f\u5316\u7684\u6548\u679c\uff0c\u80fd\u89e3\u51b3\u4e00\u4e9b\u7a7a\u683c\u3001\u6362\u884c\u7b49\u5c0f\u95ee\u9898\u3002
ctrl + alt + L
\u8fd9\u91cc\u63a8\u8350\u4e00\u4e2a Python \u793e\u533a\u6d41\u884c\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff1a
Black\uff0c\u53f7\u79f0\u4e0d\u59a5\u534f\u7684\u4ee3\u7801\u683c\u5f0f\u5316\u5de5\u5177\uff0c\u5b83\u68c0\u6d4b\u5230\u4e0d\u7b26\u5408\u89c4\u8303\u7684\u4ee3\u7801\u98ce\u683c\u76f4\u63a5\u5c31\u5e2e\u4f60\u5168\u90e8\u683c\u5f0f\u5316\u597d\uff0c\u5c31\u662f\u8fd9\u4e48\u521a\uff01
Black
\u5b89\u88c5\uff1a
sudo pip3 install black \n
black ${CheckPath}\n
\u4f7f\u7528\u8fd9\u4e2a\u5de5\u5177\u683c\u5f0f\u5316\u4e4b\u540e\uff0c\u4ee3\u7801\u4f1a\u88ab\u81ea\u52a8\u8c03\u6574\uff0c\u521a\u5f00\u59cb\u4f60\u53ef\u80fd\u4f1a\u89c9\u5f97\u8c03\u6574\u5f97\u5f88\u5938\u5f20\uff0c\u6ca1\u5173\u7cfb\u575a\u6301\u770b\uff0c\u4e60\u60ef\u4e4b\u540e\uff0c\u4f60\u4f1a\u89c9\u5f97\u5f88\u4f18\u96c5\uff0c\u6ca1\u9519\uff0c\u8fd9\u5c31\u662f Pythonic Code \u7684\u6838\u5fc3\uff0c\u8bf7\u4fdd\u6301\u4f18\u96c5\uff5e\u3002
Pythonic Code
\u4f7f\u7528\u6839\u76ee\u5f55\u4e0b pylint.sh \u626b\u63cf\u4ee3\u7801\uff0c\u5728 report \u76ee\u5f55\u4e0b\u67e5\u770b\u4ee3\u7801\u626b\u63cf\u62a5\u544a\uff0c\u5982\u679c\u6709\u4ee3\u7801\u95ee\u9898\u8bf7\u63d0\u524d\u89e3\u51b3\u4e4b\u540e\u518d\u63d0\u4ea4\u3002
\u6b64\u811a\u672c\u5df2\u7ecf\u4f7f\u7528 Python \u793e\u533a\u6700\u6d41\u884c\u7684\u4ee3\u7801\u626b\u63cf\u5de5\u5177 Pylint \u8fdb\u884c\u4ee3\u7801\u626b\u63cf\u3002
Pylint
bash pylint.sh\n
\u8fd0\u884c\u4e4b\u540e\u4f1a\u63d0\u793a\u4f60\u8981\u626b\u63cf\u7684\u76ee\u5f55\uff0c\u6bd4\u5982\u8f93\u5165 apps \uff0c\u5219\u4f1a\u626b\u63cf apps \u4e0b\u7684\u6240\u6709 Python \u4ee3\u7801\u3002
\u5728 setting/pylintrc.cfg \u914d\u7f6e\u6587\u4ef6\u91cc\u9762\u8fdb\u884c\u76f8\u5173\u914d\u7f6e\uff0c\u626b\u63cf\u5b8c\u6210\u4e4b\u540e\u5728 report/pylints \u76ee\u5f55\u4e0b\u4f1a\u751f\u6210\u626b\u63cf\u62a5\u544a\u3002
setting/pylintrc.cfg
report/pylints
\u4ee3\u7801\u63d0\u4ea4\u9700\u901a\u8fc7 git review \u63d0\u4ea4\u5230 gerrit \uff0c\u4eba\u5de5 Code Review \u901a\u8fc7\u4e4b\u540e\u5408\u5165\u4ee3\u7801\u3002
git review
Code Review
sudo apt install git-review\n
\u5728 ~ \u76ee\u5f55\u4e0b\u65b0\u5efa\u6587\u4ef6\uff0c\u5e76\u547d\u540d\u4e3a gitcommit_template
gitcommit_template
\u5c06\u4ee5\u4e0b\u5185\u5bb9\u5199\u5165\u6587\u4ef6\u5f53\u4e2d\uff1a
# commit type :fix\uff08\u95ee\u9898\u4fee\u590d\uff09\u3001feat\uff08\u529f\u80fd\u5f00\u53d1\uff09\u3001style(\u98ce\u683c\u4fee\u6539)\u3001refactor(\u91cd\u6784)\u3001docs\uff08\u6587\u6863\uff09\u3001chore\uff08\u5176\u4ed6)\u3001test(\u6d4b\u8bd5) + \u7b80\u5355\u63cf\u8ff0. \u9ed8\u8ba4fix,\u6839\u636e\u60c5\u51b5\u4fee\u6539\nfix: \n\n# \u8be6\u7ec6\u8bf4\u660e\u4ee3\u7801\u7684\u6539\u52a8\uff0c\u5305\u542b\u4ee3\u7801\u7684\u5b9e\u73b0\u601d\u8def\uff0c\u4ee5\u53ca\u4e3a\u4ec0\u4e48\u8fd9\u4e48\u505a\uff0c\u53ef\u80fd\u4f1a\u5f71\u54cd\u54ea\u4e9b\u529f\u80fd\u3002\u5bf9\u4e8e\u4ee3\u7801\u7684\u5ba1\u6838\u8005\uff0c\u9700\u8981\u4ece\u8fd9\u6bb5\u63cf\u8ff0\u4e2d\u80fd\u5b8c\u5168\u7406\u89e3\u4ee3\u7801\u4e2d\u6240\u6709\u6539\u52a8\u7684\u5185\u5bb9\nDescription: \n\n# \u5199\u4e00\u6bb5\u9762\u5411\u4e8e\u4ea7\u54c1\u7684\u603b\u7ed3\u6027\u5185\u5bb9\uff0c\u7528\u4e8e\u81ea\u52a8\u751f\u6210crp\u4e0a\u7684changlog\uff0c\u9700\u8981\u6ce8\u610f\u7684\u4e8b\uff0c\u8fd9\u6bb5\u63cf\u8ff0\u5fc5\u987b\u4ece\u4ea7\u54c1\u7684\u89d2\u5ea6\u8003\u8651\u3002\nLog: \n\n# \u5173\u8054pms\u4e0a\u7684bug\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94bug\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4fee\u590dbug\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Bug: \n\n# \u4fee\u590d github issue \n#Issue: \n\n# \u5173\u8054pms\u4e0a\u7684\u4efb\u52a1\u53f7\uff0c\u63d0\u4ea4\u540e\uff0c\u5219\u4f1a\u81ea\u52a8\u5728pms\u5bf9\u5e94\u4efb\u52a1\u4fe1\u606f\u9875\u9762\u6dfb\u52a0\u5907\u6ce8\uff0c\u5173\u8054\u672c\u6b21\u63d0\u4ea4\u3002\u82e5\u672c\u6b21\u63d0\u4ea4\u4e3a\u4efb\u52a1\u76f8\u5173\uff0c\u5219\u8bf7\u53d6\u6d88\u6ce8\u91ca\n#Task: \n
\u547d\u4ee4\u884c\u6267\u884c:
git config --global commit.template ~/gitcommit_template\n
\u6b64\u547d\u4ee4\u5c06\u6a21\u677f\u52a0\u5165\u5230 git \u7684\u63d0\u4ea4\u6a21\u677f\u4e2d\u3002
git
\u540e\u7eed\u63d0\u4ea4\u7684\u65f6\u5019\u9700\u8981\u5173\u6ce8\u4e00\u4e0b\u51e0\u70b9\uff1a
commit type
feat
style
refactor
docs
chore
test
Description
\u9996\u5148\u6dfb\u52a0 commit \u4fe1\u606f
commit
git add \u540e\u9762\u52a0\u6587\u4ef6\u540d\u79f0\n
git add . # \u8868\u793a\u6dfb\u52a0\u6240\u6709\u6587\u4ef6\n
\u4f7f\u7528\u8fd9\u6761\u547d\u4ee4\u6ce8\u610f\u6709\u4e9b\u4e34\u65f6\u6587\u4ef6\u4e0d\u8981\u63d0\u4ea4\u5230\u4ed3\u5e93\u4e86\u3002
git commit -a\n
\u4e4b\u540e\u5728 fix: \u540e\u9762\uff08\u6ce8\u610f\u5192\u53f7\u540e\u9762\u5fc5\u987b\u52a0\u7a7a\u683c\uff0c\u4e0d\u7136\u76f4\u63a5-1\uff09\u5199\u672c\u5730\u63d0\u4ea4\u7684 commit \u4fe1\u606f\uff0c\u7136\u540e\u5c31\u53ef\u4ee5\u63d0\u4ea4\u4ee3\u7801\u4e86
fix:
git review branch(\u5f53\u524d\u5206\u652f) -r origin\n
\u6700\u597d\u4e00\u6b21 commit\uff0c\u4e00\u6b21 git review \uff0c\u7ecf\u5e38\u6709\u540c\u5b66\u5728\u672c\u5730\u75af\u72c2 commit \u6700\u540e git review \u62a5\u9519\u4e0d\u77e5\u9053\u548b\u56de\u4e8b\u513f\u3002 \u82e5\u4e0d\u60f3\u6bcf\u6b21\u63d0\u4ea4\u90fd\u52a0\u4e0a -r \u9009\u9879\uff0c\u6267\u884c\u4ee5\u4e0b\u547d\u4ee4\uff1a
-r
git config --global gitreview.remote origin
\u63d0\u4ea4\u4ee3\u7801\uff0c\u76f4\u63a5\u4f7f\u7528 git review branch<\u76ee\u6807\u5206\u652f>\uff0c\u4f8b\u5982 git review master
git review branch<\u76ee\u6807\u5206\u652f>
git review master
Git \u6807\u7b7e\u5b9e\u9645\u4e0a\u662f commit \u7684\u4e00\u4e2a\u522b\u540d\uff0c\u4e3b\u8981\u7528\u4e8e\u7ba1\u7406\u5386\u53f2\u7248\u672c\u3002
Git
\u60f3\u8c61\u4e00\u4e0b\u9886\u5bfc\u8ba9\u4f60\u628a\u4e4b\u524d\u7684\u67d0\u4e2a\u7248\u672c\u7684\u4ee3\u7801\u62c9\u51fa\u6765\u8dd1\uff0c\u4f60\u662f\u4e0d\u662f\u4e56\u4e56\u7684\u53bb\u628a\u6240\u6709\u63d0\u4ea4\u8bb0\u5f55\u62c9\u51fa\u6765\u627e\uff0c\u7136\u540e\u627e\u5230\u90a3\u4e2a\u54c8\u5e0c\u503c\uff0c\u901a\u8fc7\u54c8\u5e0c\u503c\u6765\u68c0\u51fa\u4ee3\u7801\u3002
\u8fd9\u4e00\u5957\u64cd\u4f5c\u4e0b\u6765\u662f\u4e0d\u662f\u5f88\u9ebb\u70e6\uff0c\u8d39\u65f6\u95f4\u8fd8\u4e0d\u4e00\u5b9a\u80fd\u627e\u5f97\u5230\uff0c\u6ca1\u4eba\u80fd\u8bb0\u4f4f\u6bcf\u4e2a\u63d0\u4ea4\u54c8\u5e0c\u503c\u4ee5\u53ca\u8fd9\u6b21\u63d0\u4ea4\u90fd\u6539\u4e86\u54ea\u4e9b\u4ee3\u7801\u3002
\u56e0\u6b64\u7ed9\u63d0\u4ea4\u6253\u4e2a\u6807\u7b7e\uff0c\u5c31\u662f\u628a\u54c8\u5e0c\u503c\u8f6c\u6362\u6210\u4eba\u7c7b\u80fd\u7406\u89e3\u7684\u8bed\u8a00\uff0c\u6bd4\u5982 v1.0\uff0c\u5c31\u53ef\u4ee5\u76f4\u63a5\u901a\u8fc7\u6807\u7b7e\u627e\u5230\u5bf9\u5e94\u7684\u63d0\u4ea4\u3002
v1.0
git tag -a <tagname>\n
\u56de\u8f66\u4e4b\u540e\uff0cGit \u4f1a\u6253\u5f00\u4f60\u7684\u7f16\u8f91\u5668\uff0c\u8ba9\u4f60\u5199\u4e00\u53e5\u6807\u7b7e\u6ce8\u89e3\uff0c\u5c31\u50cf\u4f60\u7ed9\u63d0\u4ea4\u5199\u6ce8\u89e3\u4e00\u6837\u3002
git tag -l\n# git tag \u4e5f\u884c\n
git tag -d <tagname>\n
git push \u547d\u4ee4\u5e76\u4e0d\u4f1a\u4f20\u9001\u6807\u7b7e\u5230\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\uff0c\u5fc5\u987b\u663e\u5f0f\u5730\u63a8\u9001\u6807\u7b7e\u3002
git push
git push origin <tagname>\n
\u63a8\u9001\u6240\u6709\u4e0d\u5728\u8fdc\u7a0b\u4ed3\u5e93\u670d\u52a1\u5668\u4e0a\u7684\u6807\u7b7e
git push origin --tag\n
git push origin :refs/tag/<tagname>\n
\u5148\u7528 git log --pretty=oneline \u67e5\u8be2\u63d0\u4ea4\u8bb0\u5f55\uff0c\u83b7\u53d6\u6821\u9a8c\u7801\u3002
git log --pretty=oneline
git tag -a <tagname> 9fceb02(\u6821\u9a8c\u7801)\n
git checkout <tagname>\n
\u6b64\u65f6\uff0c\u4ed3\u5e93\u4f1a\u5904\u4e8e\u201c\u5206\u79bb\u5934\u6307\u9488\uff08detached HEAD\uff09\u201d\u7684\u72b6\u6001\u3002
detached HEAD
\u5728\u201c\u5206\u79bb\u5934\u6307\u9488\u201d\u72b6\u6001\u4e0b\uff0c\u5982\u679c\u4f60\u505a\u4e86\u67d0\u4e9b\u66f4\u6539\u7136\u540e\u63d0\u4ea4\u5b83\u4eec\uff0c\u6807\u7b7e\u4e0d\u4f1a\u53d1\u751f\u53d8\u5316\uff0c \u4f46\u4f60\u7684\u65b0\u63d0\u4ea4\u5c06\u4e0d\u5c5e\u4e8e\u4efb\u4f55\u5206\u652f\uff0c\u5e76\u4e14\u5c06\u65e0\u6cd5\u8bbf\u95ee\uff0c\u9664\u975e\u901a\u8fc7\u786e\u5207\u7684\u63d0\u4ea4\u54c8\u5e0c\u624d\u80fd\u8bbf\u95ee\u3002
\u56e0\u6b64\uff0c\u5982\u679c\u4f60\u9700\u8981\u8fdb\u884c\u66f4\u6539\uff0c\u6bd4\u5982\u4f60\u8981\u4fee\u590d\u65e7\u7248\u672c\u4e2d\u7684\u9519\u8bef\uff0c\u90a3\u4e48\u901a\u5e38\u9700\u8981\u521b\u5efa\u4e00\u4e2a\u65b0\u5206\u652f\uff1a
git checkout -b <NewBranchName> <tagname>\n
\u65b0\u5206\u652f\u4e0a\u53ef\u4ee5\u8fdb\u884c\u63d0\u4ea4\u4ee3\u7801\u3002
\u91cd\u65b0\u914d\u7f6e\u90ae\u7bb1\u6216\u8005\u540d\u79f0\uff0c\u7136\u540e\u91cd\u7f6e\u751f\u6548\uff1a
git commit --amend --reset-author\n
(1)\u67e5\u8be2\u5386\u53f2\u63d0\u4ea4\u8bb0\u5f55
git log\n
\u627e\u5230\u4f60\u8981\u56de\u6eda\u7684\u7248\u672c\uff0c\u590d\u5236 hash \u503c\u3002
hash
Change-Id:
(2)\u56de\u6eda\u7248\u672c\uff0c\u4e0d\u6e05\u9664\u4ee3\u7801
git reset --soft ${hash}\n
(3)\u56de\u6eda\u7248\u672c\uff0c\u6e05\u9664\u4ee3\u7801\uff0c\u614e\u7528\u54c8
git reset --hard ${hash}\n
F \u8868\u793a\u5931\u8d25\uff0c. \uff08\u70b9\uff09\u8868\u793a\u901a\u8fc7\uff0cS \u8868\u793a\u8df3\u8fc7\uff0cE \u8868\u793a error \u6709\u62a5\u9519
F
.
S
E
git config --global core.quotePath false\n
\u5728 Pycharm \u4e2d apps \u76ee\u5f55\u4e0b\u5e94\u7528\u5e93\u6587\u4ef6\u662f\u9ec4\u8272\u7684\uff0c\u7f16\u8f91\u5668\u8bc6\u522b\u4e0d\u5230\u4ee3\u7801\u65b0\u589e\u548c\u4fee\u6539\uff1b
\u7531\u4e8e\u793e\u533a\u7248 Pycharm \u4e0d\u80fd\u52a8\u6001\u8bc6\u522b\u591a\u4ed3\u5e93\uff0c\u9700\u8981\u5728 setting \u91cc\u9762\u624b\u52a8\u6ce8\u518c\uff0c\u64cd\u4f5c\u6b65\u9aa4\uff1a
File \u2014> Settings \u2014> Version Control \u2014> \u70b9 + \u53f7 \u2014> Directory \u9009\u4e2d\u5e94\u7528\u5e93\u5de5\u7a0b\u76ee\u5f55 \u2014> VCS \u9009\u4e2d Git \u2014> Apply
Version Control
+
Directory
VCS
Apply
\u5982\u6b64\u5c31\u53ef\u4ee5\u4e86\u3002
\u4e13\u4e1a\u7248 Pycharm \u4e0d\u5b58\u5728\u8fd9\u4e2a\u95ee\u9898\u3002
$'\\r':\u672a\u627e\u5230\u547d\u4ee4
\u51fa\u73b0\u8fd9\u4e2a\u95ee\u9898\u4f60\u5e94\u8be5\u662f\u5728 windows \u4e0a\u6253\u5f00\u6216\u7f16\u8f91\u8fc7 env.sh \u811a\u672c\uff0cwindows\u4e0b\u7684\u6362\u884c\u662f\u56de\u8f66\u7b26+\u6362\u884c\u7b26\uff0c\u4e5f\u5c31\u662f\\r\\n\uff0c\u800c Linxu \u4e0b\u662f\u6362\u884c\u7b26 \\n\uff0cLinux \u4e0b\u4e0d\u8bc6\u522b \\r\uff0c\u56e0\u6b64\u62a5\u9519\u3002
\\r\\n
Linxu
\\n
Linux
\\r
\u89e3\u51b3\u65b9\u6848\uff1a
# \u5c06 \\r \u66ff\u6362\u4e3a\u7a7a\nsudo sed -i 's/\\r//' env.sh\n
\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u5982\u4e0b\uff1a
@pytest.mark.timeout(300) # \u5355\u4f4d\u79d2\ndef test_xxx_001():\npass\n
\u524d\u7f6e\u6761\u4ef6\uff1a\u5df2\u7533\u8bf7\u8bbf\u95ee YouQu \u6743\u9650\u7fa4\u7ec4
# \u7b2c\u4e00\u6b21\u5b58\u50a8\u5bc6\u7801\uff0c\u63d0\u4f9b\u540e\u9762\u62c9\u4ee3\u7801(gerrit: ldap\u8d26\u53f7\u548c\u5bc6\u7801\uff0cgit\u62c9\u53d6\u7b2c\u4e00\u6b21\u8f93\u5165\u4fdd\u5b58\uff0c\u540e\u9762\u76f4\u63a5\u4f7f\u7528)\ngit config --global credential.helper store\n\n# \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\uff0c\u5e76\u9012\u5f52\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\" --recursive\n
\u524d\u7f6e\u6761\u4ef6\uff1a
# \u62c9\u53d6YouQu\u6846\u67b6\u4ee3\u7801\ngit clone \"http://gerrit.uniontech.com/youqu\"\n# \u6307\u5b9a\u62c9\u53d6\u5b50\u4ed3\u5e93\u4ee3\u7801\ncd youqu\ngit submodule update --init apps/autotest_xxx_xxx\n
\u66f4\u65b0\u6240\u6709\u5b50\u4ed3\u5e93\u4ee3\u7801
cd youqu\ngit pull & git submodule foreach git pull\n
\u4fee\u590d\u6240\u6709\u5b50\u4ed3\u5e93\u9ed8\u8ba4master \u5206\u652f\u6e38\u79bb\u5934
cd youqu\ngit submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'\n
Shell Check
\u73b0\u6709\u81ea\u52a8\u5316\u6d4b\u8bd5\u67b6\u6784\u6574\u4f53\u5206\u4e3a\u4e09\u5c42\uff1a\u7528\u4f8b\u5c42\uff08\u4e1a\u52a1\u903b\u8f91\u5c42\uff09\u3001\u4e2d\u95f4\u5c42\uff08\u5143\u7d20\u5b9a\u4f4d\u548c\u64cd\u4f5c\u65b9\u6cd5\u5c42\uff09\u3001\u6838\u5fc3\u5c42\uff08\u5e95\u5c42\u529f\u80fd\u5e93\u5c42\uff09\u3002
Dbus
2.1\u3001CI \u6d41\u7a0b
\u6bcf\u65e5\u6784\u5efa\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u7814\u53d1\u6bcf\u65e5\u63d0\u4ea4\u7684\u4ee3\u7801\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u73ed\u4e4b\u540e\u4f1a\u5c06\u5404\u5e94\u7528\u8fdb\u884c\u6253\u5305\uff0c\u7136\u540e\u5728\u6d4b\u8bd5\u673a\u4e0a\u5b89\u88c5\u66f4\u65b0 deb \u5305\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002
\u6301\u7eed\u96c6\u6210\u6d41\u6c34\u7ebf\uff1a\u662f\u5bf9\u5e94\u7528\u63d0\u4ea4\u96c6\u6210\u7684\u7248\u672c\u8fdb\u884c\u6d4b\u8bd5\uff0cAT \u7684\u5927\u81f4\u6d41\u7a0b\uff1a\u6bcf\u65e5\u4e0b\u8f7d\u6700\u65b0\u7684 ISO \u8fdb\u884c PXE \u90e8\u7f72\uff0c\u7136\u540e\u6d4b\u8bd5\u673a\u5b89\u88c5\u6700\u65b0\u7684\u955c\u50cf\uff0c\u6700\u540e\u8fdb\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u3002
PXE
2.2\u3001\u9a8c\u6536\u6d4b\u8bd5
\u5728\u5404\u9a8c\u6536\u8282\u70b9\u8fdb\u884c\u81ea\u52a8\u5316\u9a8c\u6536\uff0c\u76ee\u524d\u7684\u7b56\u7565\u662f\u5168\u7528\u4f8b\u8986\u76d6\u5168\u67b6\u6784\u3002
2.3\u3001\u56de\u5f52\u6d4b\u8bd5
\u56de\u5f52\u6d4b\u8bd5\u4eca\u5e74\u89c4\u5212\u5efa\u8bbe\u4e2d\uff0c\u65e8\u5728\u56de\u5f52\u6d4b\u8bd5\u65f6\u6267\u884c\u81ea\u52a8\u5316\u6d4b\u8bd5\u7528\u4f8b\uff0c\u51cf\u5c11\u529f\u80fd\u6d4b\u8bd5\u7684\u91cd\u590d\u52b3\u52a8\u529b\u3002
\u5728\u81ea\u52a8\u5316\u6d4b\u8bd5\u9879\u76ee\u521d\u671f\uff0c\u6240\u6709\u5e94\u7528\u662f\u6574\u4f53\u53d1\u5e03\uff0c\u6211\u4eec\u662f\u5c06\u6240\u6709\u5e94\u7528\u770b\u6210\u662f\u4e00\u4e2a\u6574\u4f53\uff0c\u5404\u5e94\u7528\u4f5c\u4e3a\u5176\u4e2d\u7684\u4e00\u4e2a\u6a21\u5757\uff0c\u6240\u4ee5\u5b58\u5728\u5e94\u7528\u95f4\u65b9\u6cd5\u4ea4\u53c9\u8c03\u7528\u7684\u95ee\u9898\uff0c\u8fd9\u6837\u4ece\u6700\u521d\u7684\u8bbe\u8ba1\u6765\u8bb2\u786e\u5b9e\u80fd\u591f\u51cf\u5c11\u91cd\u590d\u4ee3\u7801\u7684\u7f16\u5199\u3002\u4f46\u662f\u73b0\u5728\u5e94\u7528\u8d70\u72ec\u7acb\u53d1\u5e03\uff0c\u5404\u5e94\u7528\u90fd\u6709\u81ea\u5df1\u7684\u8fed\u4ee3\u8282\u594f\uff0c\u5728\u65b0\u9700\u6c42\u5feb\u901f\u53d8\u5316\u7684\u8fc7\u7a0b\u4e2d\uff0c\u81ea\u52a8\u5316\u7ef4\u62a4\u53d8\u5f97\u5f02\u5e38\u56f0\u96be\uff0c\u539f\u56e0\u5c31\u662f\u81ea\u52a8\u5316\u9879\u76ee\u91cc\u9762\u5404\u4e2a\u5e94\u7528\u7684\u6709\u6bd4\u8f83\u591a\u7684\u8026\u5408\u5173\u7cfb\uff0c\u56e0\u6b64\u6211\u4eec\u9700\u8981\u8fdb\u884c\u89e3\u8026\uff0c\u4ee5\u9002\u5e94\u5e94\u7528\u4e0d\u540c\u7684\u8fed\u4ee3\u5468\u671f\u3002
\u7528\u4f8b\u6267\u884c\u7684\u8303\u56f4\u4e0d\u591f\u7cbe\u51c6\uff0c\u76ee\u524d\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\u65f6\uff0c\u4e3b\u8981\u901a\u8fc7\u7528\u4f8b\u7684\u5173\u952e\u8bcd core\uff08\u6838\u5fc3\uff09\u6765\u533a\u5206\u7528\u4f8b\u662f\u5426\u4e3a\u6838\u5fc3\u7528\u4f8b\uff0c\u4f46\u662f\u8fd9\u6837\u7684\u533a\u5206\u592a\u5bbd\u6cdb\u4e86\uff0c\u4e0d\u80fd\u9002\u5e94\u81ea\u52a8\u5316\u6d4b\u8bd5\u5728\u591a\u573a\u666f\u4e0b\u7684\u5e94\u7528\u3002\u5f88\u591a\u573a\u666f\u4e0b\u6211\u4eec\u8fd8\u9700\u8981\u6839\u636e\u7528\u4f8b\u7684\u7b49\u7ea7\u3001\u7528\u4f8b\u7684\u7c7b\u578b\u3001\u7528\u4f8b\u6765\u6e90\u7b49\u7b49\uff0c\u4e0d\u540c\u7684\u7ef4\u5ea6\u6765\u6311\u9009\u8981\u6267\u884c\u7684\u7528\u4f8b\u3002\u5728\u7528\u4f8b\u811a\u672c\u4e2d\u6dfb\u52a0\u5173\u952e\u5b57\u9700\u8981\u4eba\u5de5\u4e00\u6761\u6761\u7684\u6539\uff0c\u8d39\u65f6\u8d39\u529b\uff0c\u800c\u4e14\u4e0d\u597d\u7ef4\u62a4\u3002
\u76ee\u524d\u9700\u8981\u8df3\u8fc7\u7684\u7528\u4f8b\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684\u7528\u4f8b\u811a\u672c\u91cc\u9762\uff0c\u6dfb\u52a0\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\uff0c\u540e\u7eed\u89e3\u9664\u8df3\u8fc7\u7684\u65f6\u5019\u53c8\u9700\u8981\u627e\u5230\u8fd9\u6761\u811a\u672c\uff0c\u5220\u6389\u8df3\u8fc7\u7528\u4f8b\u7684\u4ee3\u7801\u3002\u5728\u8df3\u8fc7\u7528\u4f8b\u8f83\u591a\u7684\u60c5\u51b5\u4e0b\uff0c\u7ef4\u62a4\u8d77\u6765\u6709\u96be\u5ea6\u3002
\u7f16\u5199\u7528\u4f8b\u65f6\u903b\u8f91\u6bd4\u8f83\u590d\u6742\uff0c\u9700\u8981\u8c03\u7528\u591a\u4e2a\u5e94\u7528\u7684\u65b9\u6cd5\u6a21\u5757\u3002
\u6846\u67b6\u6269\u5c55\u6027\u4e0d\u8db3\uff0c\u65e0\u6cd5\u6574\u5408\u6027\u80fd\u81ea\u52a8\u5316\u3001\u538b\u6d4b\u81ea\u52a8\u5316\u3001\u5b89\u5168\u81ea\u52a8\u5316\u7b49\u4e13\u9879\u6d4b\u8bd5\u3002
\u4e3a\u89e3\u51b3\u73b0\u6709\u95ee\u9898\uff0c\u9002\u5e94\u4e0d\u65ad\u4e30\u5bcc\u7684\u6d4b\u8bd5\u573a\u666f\uff0c\u66f4\u597d\u7684\u53d1\u6325\u81ea\u52a8\u5316\u6d4b\u8bd5\u7684\u4f5c\u7528\uff0c\u9700\u8981\u5bf9\u81ea\u52a8\u5316\u67b6\u6784\u53ca\u5404\u529f\u80fd\u6a21\u5757\u8fdb\u884c\u91cd\u65b0\u8bbe\u8ba1\u89c4\u5212\u3002
\u6846\u67b6\u7684\u8fd0\u884c\u903b\u8f91\uff1a\u901a\u8fc7\u6838\u5fc3\u5c42\u63d0\u4f9b\u4e00\u4e2a\u57fa\u7840\u80fd\u529b\uff0c\u4e1a\u52a1\u5c42\u6839\u636e\u5b9e\u9645\u4e1a\u52a1\u9700\u6c42\uff08\u6d4b\u8bd5\u7528\u4f8b\uff09\u52a8\u6001\u52a0\u8f7d\u6838\u5fc3\u5c42\uff0c\u6267\u884c\u5165\u53e3\u52a0\u8f7d\u76f8\u5e94\u7684\u7528\u4f8b\u96c6\u5e76\u63a7\u5236\u6267\u884c\uff0c\u5e94\u7528\u5c42\u6839\u636e\u5b9e\u9645\u6d4b\u8bd5\u9700\u6c42\uff0c\u901a\u8fc7\u76f8\u5e94\u7684\u914d\u7f6e\u9879\u8fdb\u884c\u914d\u7f6e\uff0c\u4ece\u800c\u89e6\u53d1\u81ea\u52a8\u5316\u6d4b\u8bd5\u4efb\u52a1\u3002
\u5e95\u5c42\u6838\u5fc3\u6a21\u5757\u5305\u62ec\uff1a
OCR \u6a21\u5757
\u4e1a\u52a1\u5c42\uff1a\u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e94\u7528\u5185\u5305\u542b\u591a\u4e2a\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5982\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7b49\uff0c\u540e\u7eed\u53ef\u4ee5\u6839\u636e\u9700\u8981\u5ac1\u63a5\u8fdb\u6765\u3002\u5176\u4e2d\u529f\u80fd\u6d4b\u8bd5\u8bbe\u8ba1\u601d\u8def\uff1a
\u4ee5\u5e94\u7528\u4e3a\u7ef4\u5ea6\u5212\u5206\uff0c\u5e76\u5c06\u6d4b\u8bd5\u6570\u636e\u548c\u6d4b\u8bd5\u8d44\u6e90\u6574\u5408\u8fdb\u6765\uff0c\u589e\u52a0\u7528\u4f8b\u6807\u7b7e csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ed9\u6bcf\u6761\u7528\u4f8b\u6253\u6807\u7b7e\u3002
\u5404\u6807\u7b7e\u6240\u4f7f\u7528\u5bf9\u5e94\u7684\u5b57\u6bb5\u540d\u79f0\uff0c\u4f7f\u7528 csv \u6587\u4ef6\u7ef4\u62a4\u7528\u4f8b\u4e0e\u6807\u7b7e\u7684\u5bf9\u5e94\u5173\u7cfb\uff0c\u5bf9\u7528\u4f8b\u5b9e\u73b0\u6807\u7b7e\u5316\u7ba1\u7406\uff0c\u53ef\u4ee5\u7ec4\u5408\u5176\u4e2d\u7684\u6807\u7b7e\u800c\u4ece\u9a71\u52a8\u5bf9\u5e94\u7684\u81ea\u52a8\u5316\u7528\u4f8b\u6267\u884c\uff0c\u517c\u5bb9\u73b0\u6709\u7528\u4f8b\u6807\u7b7e\uff0c\u4e14\u652f\u6301\u7528\u4f8b\u6807\u7b7e\u53ef\u6269\u5c55\uff1b
\u4f7f\u7528 csv \u683c\u5f0f\u6587\u4ef6\u53ef\u4ee5\u65b9\u4fbf\u7684\u4f7f\u7528 Excel \u8868\u683c\u6253\u5f00\u8fdb\u884c\u7f16\u8f91\uff0c\u540c\u65f6\u7531\u4e8e csv \u6587\u4ef6\u5b9e\u9645\u662f\u4ee5\u90fd\u597d\u5206\u9694\u7684\u6587\u672c\u6587\u4ef6\uff0c\u4ee3\u7801\u4e2d\u53ef\u4ee5\u5728\u4e0d\u4f9d\u8d56\u4e09\u65b9\u5e93\u7684\u60c5\u51b5\u4e0b\u65b9\u4fbf\u5feb\u901f\u7684\u89e3\u6790\u5b83\uff0c\u53ef\u64cd\u4f5c\u6027\u548c\u53ef\u7ef4\u62a4\u6027\u8f83\u9ad8\u3002
\u5404\u4e2a\u5e94\u7528\u4e4b\u95f4\uff0c\u7528\u4f8b\u3001\u65b9\u6cd5\u3001\u6807\u7b7e\u548c\u8d44\u6e90\u90fd\u662f\u76f8\u4e92\u72ec\u7acb\u7684\uff0c\u7f16\u5199\u548c\u7ef4\u62a4\u7528\u4f8b\u65f6\u53ea\u9700\u8981\u81ea\u5df1\u5e94\u7528\u4e0b\u7684\u65b9\u6cd5\u548c\u516c\u5171\u5e93\u5373\u53ef\u3002
\u7ed3\u6784\u4e3e\u4f8b\uff1a
.\n\u251c\u2500\u2500 apps\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_album # \u5e94\u7528\u540d (\u7528\u4e0b\u5212\u7ebf\u8fde\u63a5\u662f Python \u7f16\u7801\u89c4\u8303)\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_assert # \u65ad\u8a00\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_function_tag.csv # \u7528\u4f8b\u6807\u7b7e\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 asan_cases # \u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases # \u529f\u80fd\u6d4b\u8bd5\u7528\u4f8b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 res # \u6d4b\u8bd5\u8d44\u6e90\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 config # \u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\u6a21\u5757\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 widget # \u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 album_widget # \u5e94\u7528\u81ea\u5df1\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 base_widget # \u65b9\u6cd5\u57fa\u7c7b\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 other_widget # \u8c03\u7528\u5176\u4ed6\u5e94\u7528\u7684\u65b9\u6cd5\u5e93\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 deepin_camera\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 function_cases\n\u2502\u00a0\u00a0 \u2502\u00a0 ...\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 public_widget # \u516c\u5171\u65b9\u6cd5\u5e93\n\u251c\u2500\u2500 config # \u5168\u5c40\u914d\u7f6e\u6a21\u5757\n...\n
config \u914d\u7f6e\u6a21\u5757\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u76f8\u5e94\u914d\u7f6e\uff0c\u6d4b\u8bd5\u540c\u5b66\u53ef\u4ee5\u6839\u636e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5728 config \u91cc\u9762\u8fdb\u884c\u914d\u7f6e\u3002
config
\u5168\u5c40\u914d\u7f6e\uff1a
\u6267\u884c\u4e00\u4e2a\u6216\u591a\u4e2a\u5e94\u7528\u7684\u7528\u4f8b\uff1a\u5728 pattern \u91cc\u9762\u5199\u5165\u5e94\u7528\u5305\u540d\uff0c\u591a\u4e2a\u5e94\u7528\u4e4b\u95f4\u7528 or \u8fde\u63a5\uff0c\u5982 deepin-music or deepin-movie\uff1b
pattern
or
deepin-music or deepin-movie
\u5192\u70df\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a smoke\uff1b
smoke
\u96c6\u6210\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u914d\u7f6e\u4e3a core \uff1b
core
\u5168\u91cf\u6d4b\u8bd5\uff1a\u5728 tags \u91cc\u9762\u4e3a\u7a7a\u5373\u53ef\uff1b
\u901a\u8fc7 tags \u7684\u914d\u7f6e\u6bd4\u8f83\u7075\u6d3b\uff0c\u540e\u9762\u6807\u7b7e\u5316\u7ba1\u7406\u7ae0\u8282\u4f1a\u8bb2\u5230\uff0c\u652f\u6301\u6807\u7b7e\u7684\u903b\u8f91\u7ec4\u5408\uff0c\u53ef\u4ee5\u6839\u636e\u9700\u8981\u8fdb\u884c\u7075\u6d3b\u914d\u7f6e\u3002
URL
\u5e94\u7528\u5185\u5c40\u90e8\u914d\u7f6e\uff1a
\u6bcf\u4e2a\u5e94\u7528\u5185\u90e8\u4f1a\u6709\u4e00\u4e2a\u5355\u72ec\u7684\u914d\u7f6e\u6a21\u5757\uff0c\u4f1a\u5305\u542b\u4e00\u4e9b\u672c\u5e94\u7528\u7684\u6d4b\u8bd5\u8d44\u6e90\u7684\u8def\u5f84\u3001\u6267\u884c\u7528\u4f8b\u7684\u6807\u7b7e\u914d\u7f6e\u7b49\u7b49\uff0c\u5982\u679c\u5728\u5c40\u90e8\u914d\u7f6e\u91cc\u9762\u914d\u7f6e\u4e86\u7528\u4f8b\u6267\u884c\u6807\u7b7e\uff0c\u800c\u5916\u5c42 runner \u51fa\u6ca1\u6709\u6307\u5b9a\u6267\u884c\u6807\u7b7e\uff0c\u5219\u5728\u6267\u884c\u65f6\u53ea\u4f1a\u6267\u884c\u5c40\u90e8\u914d\u7f6e\u5df2\u914d\u7f6e\u7684\uff0c\u82e5\u5916\u5c42 runner \u4e5f\u914d\u7f6e\u4e86\u6267\u884c\u6807\u7b7e\uff0c\u5219\u4f1a\u6309\u7167\u5168\u5c40\u914d\u7f6e\u6267\u884c\u7528\u4f8b\u3002
runner
\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u914d\u7f6e\u90fd\u5728\u540c\u4e00\u4e2a\u914d\u7f6e\u6587\u4ef6\u91cc\u9762\uff0cpy \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684\u7c7b\uff0cini \u6587\u4ef6\u91cc\u9762\u5206\u4e0d\u540c\u7684 option\u3002
option
\u5168\u5c40\u914d\u7f6e\u548c\u5c40\u90e8\u914d\u7f6e\u7684\u7b56\u7565\u5982\u4e0b\uff1a
\u5e94\u7528\u5c42\uff1arunner \u662f\u6d4b\u8bd5\u6267\u884c\u7684\u5165\u53e3\uff0c\u5b83\u4f1a\u6839\u636e\u914d\u7f6e\u91cc\u9762\u7684\u914d\u7f6e\u9879\uff0c\u8fdb\u884c\u7528\u4f8b\u7684\u52a0\u8f7d\u548c\u6267\u884c\u3002\u5b83\u63d0\u4f9b\u63a5\u53e3\u7ed9\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\uff0c\u5e73\u53f0\u4e0a\u7684\u6307\u4ee4\u5b9e\u9645\u4e0a\u90fd\u662f\u901a\u8fc7\u4e0b\u53d1\u7ed9 runner\uff0c\u7136\u540e\u7531 runner \u6765\u6267\u884c\u76f8\u5e94\u7684\u6d4b\u8bd5\u3002
\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u662f\u4e00\u4e2a\u524d\u7aef\u7cfb\u7edf\uff0c\u53ef\u4ee5\u8fdb\u884c\u6d4b\u8bd5\u673a\u7ba1\u7406\u3001\u81ea\u52a8\u5b89\u88c5\u955c\u50cf\u3001\u81ea\u52a8\u5b89\u88c5\u6307\u5b9a\u5e94\u7528\u7248\u672c\u3001\u8fdb\u884c\u6d4b\u8bd5\u7528\u4f8b\u8303\u56f4\u9009\u62e9\u3001\u7528\u4f8b\u89e6\u53d1\u6267\u884c\u63a7\u5236\u3001\u7ed3\u679c\u5c55\u793a\u8f93\u51fa\u7b49\u3002
\u4e00\u4e2a\u5e94\u7528\u7684\u529f\u80fd\u6d4b\u8bd5\u3001\u6027\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u7528\u4f8b\u90fd\u53ef\u4ee5\u5355\u72ec\u89e6\u53d1\u3002
\u5b58\u5728\u8026\u5408\u5173\u7cfb\u7684\u65b9\u6cd5\uff1a\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u88ab\u5916\u90e8\u5e94\u7528\u8c03\u7528\u7684\u60c5\u51b5\uff0c\u5219\u8fd9\u4e2a\u65b9\u6cd5\u5b58\u5728\u8026\u5408\u5173\u7cfb\u3002
1.1\u3001\u901a\u8fc7\u7f16\u8f91\u5668 Find Usages \u67e5\u770b\u6bcf\u4e2a\u65b9\u6cd5\u88ab\u8c03\u7528\u7684\u8def\u5f84\u548c\u88ab\u8c03\u7528\u6b21\u6570\uff1b
Find Usages
1.2\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 1 \u4e2a\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728\u5916\u90e8\u5e94\u7528\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1b
widget
Widget
1.3\u3001\u64cd\u4f5c\u5c42\u6587\u4ef6\u540d\u5747\u4ee5 widget \u7ed3\u5c3e\uff0c\u7c7b\u540d\u4ee5 Widget \u7ed3\u5c3e\uff0c\u5982\uff1a\u6587\u4ef6\u540d music_widget.py \uff1a
music_widget.py
class MusicWidget:\n\"\"\"\u97f3\u4e50\u7684\u64cd\u4f5c\u65b9\u6cd5\u7c7b\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n
2.1\u3001\u5982\u679c\u67d0\u4e2a\u65b9\u6cd5\u88ab 2 \u4e2a\u53ca\u4ee5\u4e0a\u7684\u5916\u90e8\u5e94\u7528\u8c03\u7528\uff0c\u5219\u5728 public_widget \u76ee\u5f55\u4e0b\u65b0\u5efa\u4e00\u4e2a widget \u7684 Python \u6587\u4ef6\uff0c\u5728\u6587\u4ef6\u4e2d\u5199\u4e00\u4e2a Widget \u7c7b\uff0c\u5728\u7c7b\u4e2d\u91cd\u5199\u6b64\u65b9\u6cd5\uff1bpublic_widget \u5373\u4e3a\u516c\u5171\u65b9\u6cd5\u5e93\uff1b
public_widget
2.2\u3001\u5728\u7528\u4f8b\u5c42\u4fee\u6539\u7528\u4f8b\u4e2d\u7c7b\u7684\u5bfc\u5165\u8def\u5f84\uff0c\u5c5e\u4e8e\u516c\u5171\u65b9\u6cd5\u7684\u5219\u8c03\u7528 public_widget \u4e2d\u7684\u7c7b\uff0c\u5916\u90e8\u5e94\u7528\u7684\u64cd\u4f5c\u65b9\u6cd5\uff0c\u5219\u8c03\u7528\u672c\u5e94\u7528\u76ee\u5f55\u4e0b\u91cd\u5199\u7684\u5916\u90e8\u5e94\u7528\u65b9\u6cd5\u3002
\u6bd4\u5982\uff1a\u51e0\u4e4e\u6240\u6709\u591a\u5a92\u4f53\u5e94\u7528\u90fd\u9700\u8981\u901a\u8fc7\u6587\u7ba1\u52a0\u8f7d\u8d44\u6e90\uff0c\u8c03\u8d77\u7684\u6587\u7ba1\u5bf9\u8bdd\u6846\u5b9e\u9645\u4e3a dde-desktop\uff0c\u56e0\u6b64\u5c06 desktop_widget.py \u653e\u5230 public_widget \u91cc\u9762\uff1a
dde-desktop
desktop_widget.py
class DdeDesktopPublicWidget:\n\"\"\"\u516c\u5171-\u684c\u9762\u7684\u64cd\u4f5c\u65b9\u6cd5\"\"\"\ndef click_xxx_by_attr(self):\n\"\"\"\u901a\u8fc7\u5c5e\u6027\u5b9a\u4f4d\u7684\u65b9\u5f0f\uff0c\u70b9\u51fb\u67d0\u4e2a\u5143\u7d20\"\"\"\n...\ndef ...\n
3.1\u3001\u6839\u636e\u73b0\u6709\u4e1a\u52a1\u9700\u8981\uff0c\u7528\u4f8b\u9700\u8981\u6dfb\u52a0\u7684\u6807\u7b7e\u6709\uff1a
acp1\u3001acp2\u3001acp3\u3001acp4
acp1
acp2
acp3
acp4
L1
\u6807\u7b7e\u91c7\u7528\u679a\u4e3e\u7684\u65b9\u5f0f\u8fdb\u884c\u4ee3\u53f7\u7ba1\u7406\u65b9\u4fbf\u7ba1\u7406\u4ee5\u53ca\u540e\u7eed\u6269\u5c55\u3002
3.2\u3001\u5728\u6bcf\u4e2a\u5e94\u7528\u76ee\u5f55\u4e0b\u65b0\u5efa csv \u6587\u4ef6\uff0c\u7528\u4e8e\u4fdd\u5b58\u7528\u4f8b\u6807\u7b7e\uff0c\u7b2c\u4e00\u5217\u4e3a\u7528\u4f8b\u7684 ID\uff0c\u4ece\u7b2c\u4e8c\u5217\u5f00\u59cb\u53ca\u4e4b\u540e\u7684\u5217\uff0c\u6bcf\u4e00\u5217\u90fd\u662f\u4e00\u4e2a\u7528\u4f8b\u6807\u7b7e\uff1b\u540e\u7eed\u9700\u8981\u65b0\u589e\u7528\u4f8b\u6807\u7b7e\uff0c\u53ef\u4ee5\u76f4\u63a5\u5728 csv \u6587\u4ef6\u91cc\u9762\u6dfb\u52a0\u5bf9\u5e94\u7684\u5217\u5373\u53ef\uff1b
\u5bf9\u4e8e\u7528\u4f8b\u89c4\u6a21\u6bd4\u8f83\u5927\u7684\u5e94\u7528\uff0c\u6bd4\u5982\u6587\u4ef6\u7ba1\u7406\u5668\uff0c\u5efa\u8bae\u5206\u6a21\u5757\uff0c\u6bcf\u4e2a\u6a21\u5757\u5efa\u7acb\u4e00\u4e2a csv \u6587\u4ef6\uff0c\u7528\u4e8e\u7ba1\u7406\u6a21\u5757\u5185\u7684\u7528\u4f8b\u6807\u7b7e\u3002\u662f\u5426\u5206\u6a21\u5757\u7ef4\u62a4 csv \u53d6\u51b3\u4e8e\u5e94\u7528\u7684\u7528\u4f8b\u590d\u6742\u5ea6\uff0c\u540c\u65f6\u6211\u4eec\u5e94\u8be5\u5145\u5206\u8003\u8651\u540e\u671f\u7684\u53ef\u7ef4\u62a4\u6027\uff0ccsv \u6587\u4ef6\u592a\u591a\u4e86\u4e5f\u662f\u4e00\u4e2a\u5f88\u7cdf\u7cd5\u7684\u4e8b\u60c5\u3002
3.3\u3001\u5bf9\u7167 PMS \u4e0a\u7528\u4f8b\u7b49\u7ea7\u3001\u7528\u4f8b\u7c7b\u578b\u548c\u7528\u4f8b\u6765\u6e90\uff0c\u6807\u8bb0\u6240\u6709\u5df2\u5b9e\u73b0\u7684\u7528\u4f8b\u6807\u7b7e\uff0c\u540e\u7eed\u7f16\u5199\u65b0\u589e\u81ea\u52a8\u5316\u7528\u4f8b\u65f6\uff0c\u6bcf\u5199\u4e00\u6761\u90fd\u9700\u8981\u5728\u5bf9\u5e94\u7684 csv \u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u6b64\u6761\u7528\u4f8b\u7684\u6807\u7b7e\u3002
3.4\u3001\u8df3\u8fc7\u7528\u4f8b\u6807\u7b7e\u5316
\u73b0\u6709\u8df3\u8fc7\u7528\u4f8b\u7684\u65b9\u5f0f\u662f\u5728\u7528\u4f8b\u811a\u672c\u91cc\u9762\u7ed9\u7528\u4f8b\u6dfb\u52a0\u88c5\u9970\u5668\uff0c\u89e3\u9664\u8df3\u8fc7\u65f6\u5c06\u88c5\u9970\u5668\u4ee3\u7801\u5220\u6389\uff0c\u8fd9\u79cd\u65b9\u5f0f\u9700\u8981\u4fee\u6539\u7528\u4f8b\u4ee3\u7801\uff0c\u800c\u901a\u8fc7 csv \u6587\u4ef6\u6765\u7ba1\u7406\u8df3\u8fc7\u7528\u4f8b\u5219\u4f1a\u65b9\u4fbf\u5f88\u591a\uff1a
skip-\u8df3\u8fc7\u539f\u56e0
\u6240\u6709\u7684\u6807\u7b7e\u5728 docs \u76ee\u5f55\u4e0b\u4f1a\u6709\u4e00\u4e2a\u6587\u6863\uff0c\u6587\u6863\u6682\u5b9a\u540d\u79f0\u4e3a\uff1atags_info.md\uff0c\u7528\u4e8e\u8bf4\u660e\u73b0\u5728\u5df2\u7ecf\u4f7f\u7528\u5230\u7684\u6807\u7b7e\uff0c\u4ee5\u53ca\u8fd9\u4e9b\u6807\u7b7e\u7684\u89e3\u91ca\u548c\u7528\u6cd5\u3002
tags_info.md
4.1\u3001\u6807\u7b7e\u5316\u7ba1\u7406\u7684\u9a71\u52a8\u6267\u884c\u903b\u8f91\u529f\u80fd\u5b9e\u73b0
4.2\u3001\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u6267\u884c
\u529f\u80fd\u6d4b\u8bd5\u3001\u6f0f\u6d1e\u626b\u63cf\u3001\u6027\u80fd\u6d4b\u8bd5\u7b49\u4e0d\u540c\u6d4b\u8bd5\u7c7b\u578b\u7684\u7528\u4f8b\u662f\u5206\u5f00\u6267\u884c\u7684\uff0c\u4e5f\u5c31\u662f\u5728\u4e00\u6b21\u6267\u884c\u4e2d\uff0c\u53ea\u80fd\u6267\u884c\u5176\u4e2d\u4e00\u79cd\u6d4b\u8bd5\u7c7b\u578b\uff0c\u5177\u4f53\u8981\u6267\u884c\u54ea\u4e00\u79cd\u540c\u6837\u901a\u8fc7\u53c2\u6570\u6765\u63a7\u5236\u3002
4.3\u3001\u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c
\u7531\u4e8e\u6d4b\u8bd5\u673a\u8d44\u6e90\u6709\u9650\uff0c\u968f\u7740\u81ea\u52a8\u5316\u7528\u4f8b\u6570\u91cf\u7684\u589e\u52a0\uff0cCI \u6267\u884c\u65f6\u95f4\u4f1a\u8d8a\u6765\u8d8a\u957f\u3002
\u5206\u5e03\u5f0f\u8f6e\u6362\u6267\u884c\u7684\u529f\u80fd\uff1a
5.1\u3001\u81ea\u52a8\u5316\u6d4b\u8bd5\u5e73\u53f0\u4f5c\u4e3a\u524d\u7aef\u754c\u9762\u7cfb\u7edf\uff0c\u901a\u8fc7\u9875\u9762\u4e0a\u7684\u4e00\u4e9b\u529f\u80fd\u9009\u9879\u8fdb\u884c\u5bf9\u5e94\u6d4b\u8bd5\u4efb\u52a1\u7684\u7ba1\u7406\u6216\u89e6\u53d1\uff0c\u4e1a\u5185\u6bd4\u8f83\u6d41\u884c\u7684\u5b9e\u73b0\u65b9\u6848\u662f\u4f7f\u7528 Vue + DRF \u5b9e\u73b0\u4e00\u4e2a\u524d\u540e\u7aef\u5206\u79bb\u7684\u7cfb\u7edf\u3002
Vue + DRF
\u6d4b\u8bd5\u5e73\u53f0\u53ef\u80fd\u4f1a\u6d89\u53ca\u5230\u7684\u6a21\u5757\u6709\uff1a\u6d4b\u8bd5\u673a\u8d44\u6e90\u7ba1\u7406\u6a21\u5757\u3001\u7528\u4f8b\u6267\u884c\u63a7\u5236\u6a21\u5757\u3001\u7ed3\u679c\u5c55\u793a\u6a21\u5757\u3001PXE \u955c\u50cf\u5b89\u88c5\u6a21\u5757\u7b49\u3002
\u7528\u6237\uff08\u6d4b\u8bd5\u3001\u7814\u53d1\u540c\u5b66\u7b49\uff09\u53ef\u4ee5\u914d\u7f6e\u81ea\u5df1\u7684\u6d4b\u8bd5\u8ba1\u5212\uff0c\u5982\u6267\u884c\u54ea\u4e2a\u5e94\u7528\u3001\u6267\u884c\u7528\u4f8b\u7684\u8303\u56f4\u3001\u5728\u54ea\u53f0\u673a\u5668\u4e0a\u6267\u884c\u3001\u955c\u50cf\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u5e94\u7528\u7248\u672c\u53ca\u4e0b\u8f7d\u5730\u5740\u3001\u6267\u884c\u65f6\u95f4\u3002
5.2\u3001\u6267\u884c\u5165\u53e3 runner \u63d0\u4f9b\u7ed9\u6d4b\u8bd5\u5e73\u53f0\u7684\u63a5\u53e3\u5305\u62ec\uff1a\u7528\u4f8b\u6267\u884c\u63a5\u53e3\u3001\u7ed3\u679c\u8fd4\u56de\u63a5\u53e3\u3001\u955c\u50cf\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u955c\u50cf\u5b89\u88c5\u63a5\u53e3\u3001\u5e94\u7528\u4e0b\u8f7d\u63a5\u53e3\u3001\u6d4b\u8bd5\u673a\u5e94\u7528\u5b89\u88c5\u66f4\u65b0\u63a5\u53e3\u7b49\u3002
\u524d\u7aef\u5e73\u53f0\u76ee\u524d\u8fd8\u6ca1\u6709\u592a\u591a\u8be6\u7ec6\u7684\u65b9\u6848\uff0c\u672c\u6b21\u8bbe\u8ba1\u4e3b\u8981\u96c6\u4e2d\u5728\u540e\u7aef\u8fd9\u90e8\u5206\u67b6\u6784\u7684\u8bbe\u8ba1\u4e0a\u3002
\u8fd1\u671f\u4efb\u52a1\u8ba1\u5212
\u4e2d\u671f\u4efb\u52a1\u8ba1\u5212
;=============================== CASE CONFIG ===================================\n[case]\n;\u6267\u884c\u7684\u5e94\u7528\u540d\u79f0\n;\u4e3a\u7a7a\u8868\u793a\u6267\u884c apps/ \u76ee\u5f55\u4e0b\u6240\u6709\u5e94\u7528\u7684\u7528\u4f8b\nAPP_NAME =\n;\u6267\u884c\u5305\u542b\u5173\u952e\u8bcd\u7684\u7528\u4f8b\nKEYWORDS =\n;\u6267\u884c\u5305\u542b\u7528\u4f8b\u6807\u7b7e\u7684\u7528\u4f8b\nTAGS =\n;-----------------------------------------------\n;1.KEYWORDS \u548c TAGS \u90fd\u4e3a\u7a7a\u8868\u793a\u6267\u884c APP_NAME \u7684\u6240\u6709\u7528\u4f8b\n;2.KEYWORDS \u548c TAGS \u90fd\u652f\u6301\u903b\u8f91\u7ec4\u5408\uff0c\u5373 and/or/not \u7684\u8868\u8fbe\u5f0f\n;e.g. TAGS = L1 or smoke\n;-----------------------------------------------\n;\u672c\u5730\u6587\u4ef6\u6d4b\u8bd5\u5957\uff0c\u5c06\u8981\u6267\u884c\u7684\u7528\u4f8b\u5199\u5165\u6307\u5b9a\u7684 csv \u6587\u4ef6\n;\u9ed8\u8ba4\u4e3a\u7a7a\uff0c\u4ece\u57fa\u7840\u6846\u67b6\u6839\u76ee\u5f55\u5f00\u59cb\uff1ae.g. CASE_FILE = case_list.txt\n;\u5982\u679c\u8fd9\u91cc\u6709\u503c\uff0cAPP_NAME KEYWORDS TAGS \u7684\u914d\u7f6e\u5747\u4e0d\u751f\u6548\nCASE_FILE =\n;=============================== RUNNER CONFIG ===================================\n[runner]\n;\u6700\u5927\u5931\u8d25\u7528\u4f8b\u6570\u91cf\u7684\u5360\u6bd4\n;\u6bd4\u5982\uff1a\u603b\u6267\u884c\u7528\u4f8b\u6570\u4e3a 100, \u82e5 MAX_FAIL = 0.5,\u5219\u5931\u8d25\u7528\u4f8b\u6570\u8fbe\u5230 50 \u5c31\u4f1a\u7ec8\u6b62\u6d4b\u8bd5\u3002\nMAX_FAIL = 1\n;\u5355\u6761\u7528\u4f8b\u7684\u8d85\u65f6\u65f6\u95f4\uff0c\u5982\u679c\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u65f6\u95f4\u8d85\u65f6\uff0c\u8fd9\u6761\u7528\u4f8b\u4f1a\u88ab\u505c\u6b62\uff0c\u540e\u7eed\u7528\u4f8b\u7ee7\u7eed\u6267\u884c\u3002\n;\u5355\u4f4d\u4e3a\u79d2\n;\u8fd9\u662f\u4e00\u4e2a\u5168\u5c40\u7edf\u4e00\u914d\u7f6e\uff0c\u5982\u679c\u67d0\u6761\u7528\u4f8b\u9700\u8981\u5355\u72ec\u914d\u7f6e\u8d85\u65f6\u65f6\u95f4\uff0c\u53ef\u4ee5\u5728\u7528\u4f8b\u4e2d\u8fd9\u6837\u5199\uff1a\n;@pytest.mark.timeout(500)\n;def test_xxx_001():\n; ...\n;\u4f1a\u8bdd\u8d85\u65f6\uff08\u6240\u6709\u7528\u4f8b\u6267\u884c\u7684\u8d85\u65f6\u65f6\u95f4\uff09\u662f\u6839\u636e\u5168\u5c40\u8d85\u65f6\u914d\u7f6e\u548c\u7528\u4f8b\u5355\u72ec\u8d85\u65f6\u914d\u7f6e\u81ea\u52a8\u8ba1\u7b97\u7684\u3002\nCASE_TIME_OUT = 200\n;\u5931\u8d25\u7528\u4f8b\u91cd\u8dd1\u6b21\u6570\n;\u6ce8\u610f\uff0cRERUN = 1 \u8868\u793a\u91cd\u8dd1 1 \u6b21\uff0c\u5373\u7b2c\u4e00\u6b21\u7528\u4f8b\u6267\u884c\u5931\u8d25\u4f1a\u81ea\u52a8\u91cd\u8dd1 1 \u6b21\uff0c\u603b\u5171\u6267\u884c 2 \u6b21\uff1b\n;\u5982\u679c\u7b2c 2 \u6b21\u6267\u884c\u6210\u529f\uff0c\u7ed3\u679c\u6210\u529f\uff0c\u5931\u8d25\u4ea6\u4e3a\u5931\u8d25\u3002\nRERUN = 1\n;\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\u3002\n;\u6bd4\u5982 RECORD_FAILED_CASE = 1 \uff0c\u8868\u793a\u7528\u4f8b\u7b2c 1 \u6b21\u6267\u884c\u5931\u8d25\u4e4b\u540e\u5f00\u59cb\u5f55\u5c4f\uff0cRERUN >= RECORD_FAILED_CASE\u3002\n;1.\u5173\u95ed\u5f55\u5c4f\uff1aRECORD_FAILED_CASE > RERUN\n;2.\u6bcf\u6761\u7528\u4f8b\u90fd\u5f55\u5c4f\uff1aRECORD_FAILED_CASE = 0\nRECORD_FAILED_CASE = 1\n;yes \u6bcf\u6761\u7528\u4f8b\u6267\u884c\u4e4b\u540e\u8fdb\u884c\u73af\u5883\u6e05\u7406\nCLEAN_ALL = yes\n;\u68c0\u67e5\u6d4b\u8bd5\u673a\u5206\u8fa8\u7387, \u6bd4\u5982\uff1a1920x1080\n;no: \u8868\u793a\u4e0d\u505a\u5206\u8fa8\u7387\u6821\u9a8c\nRESOLUTION = 1920x1080\n;\u4e0d\u8df3\u8fc7\u7528\u4f8b\uff0ccsv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86 skip-xxx\u7684\u7528\u4f8b\u4e0d\u8df3\u8fc7\nNOSKIP = no\n;ignore fixed\n;no\uff0c\u53ea\u8981\u6807\u8bb0\u4e86fixed\u7684\u7528\u4f8b\uff0c\u5373\u4f7f\u6807\u8bb0\u4e86skip-\uff0c\u4e5f\u4f1a\u6267\u884c\uff1b\n;yes\uff0cfixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\uff1b\nIFIXED = no\n;\u8981\u5b89\u88c5deb\u5305\u7684\u8def\u5f84\n;e.g : ~/Downloads/ \u5b89\u88c5\u4e0b\u8f7d\u76ee\u5f55\u4e0b\u7684deb\u5305\uff0c\u5982\u679c\u662f\u8fdc\u7a0b\u6267\u884c\uff0c\u4f1a\u81ea\u52a8\u62f7\u8d1d\u5230\u8fdc\u7a0b\u5e76\u5b89\u88c5\u3002\nDEB_PATH =\n;DEBUG \u6a21\u5f0f\u6267\u884c\u7528\u4f8b\uff0c\u53ea\u6536\u96c6\u4e0d\u6267\u884c\u7528\u4f8b\uff0c\u4e5f\u4e0d\u505a\u8bbe\u5907\u5206\u8fa8\u7387\u7684\u68c0\u67e5\u3002\nDEBUG = no\n;\u8bb0\u5f55top\u547d\u4ee4\u67e5\u8be2\u7684\u7cfb\u7edf\u8d44\u6e90\u5360\u7528\u60c5\u51b5\uff0cTOP = 3 \u8868\u793a\u8bb0\u5f55\u524d3\u4e2a\u8fdb\u7a0b\u3002\nTOP =\n;\u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\nREPEAT =\n;\u9ed8\u8ba4\u5728\u6240\u6709\u6d4b\u8bd5\u5b8c\u6210\u4e4b\u540e\u8f93\u51fa\u62a5\u9519\u4fe1\u606f.\n;yes, \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\nDURING_FAIL = no\n;\u6ce8\u518c\u81ea\u542f\u670d\u52a1\nAUTOSTART = no\n;=============================== REPORT CONFIG ===================================\n[report]\n;\u6d4b\u8bd5\u62a5\u544a\u7684title\nREPORT_TITLE = YouQu Report\n;\u6d4b\u8bd5\u62a5\u544a\u7684name\nREPORT_NAME = YouQu Report\n;\u6d4b\u8bd5\u62a5\u544a\u7684\u9ed8\u8ba4\u8bed\u8a00\n;en:English\n;ru:\u0420\u0443\u0441\u0441\u043a\u0438\u0439\n;zh:\u4e2d\u6587\n;de:Deutsch\n;nl:Nederlands\n;he:Hebrew\n;br:Brazil\n;pl:Polski\n;ja:\u65e5\u672c\u8a9e\n;es:Espa\u00f1ol\n;kr:\ud55c\uad6d\uc5b4\n;fr:Fran\u00e7ais\n;az:Az\u0259rbaycanca\nREPORT_LANGUAGE = zh\n;\u7528\u4f8b\u6267\u884c\u5b8c\u540e\u751f\u6210\u7684\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n;\u76ee\u524d\u652f\u6301 allure, xml, json \uff08\u652f\u6301\u540c\u65f6\u751f\u6210\uff09\nREPORT_FORMAT = allure, xml, json\n;\u6307\u5b9a\u62a5\u544a\u751f\u6210\u7684\u8def\u5f84\uff08\u76f8\u5bf9\u9879\u76ee\u6839\u76ee\u5f55\u4e0b\uff09\nALLURE_REPORT_PATH = report/\nXML_REPORT_PATH = report/\nJSON_REPORT_PATH = report/\n;=============================== GLOBAL CONFIG ===================================\n[globalconfig]\n;\u6d4b\u8bd5\u673a\u7684\u5bc6\u7801\nPASSWORD = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6b21\u6570\nIMAGE_MATCH_NUMBER = 1\n;\u56fe\u50cf\u8bc6\u522b\u91cd\u8bd5\u6bcf\u6b21\u95f4\u9694\u7b49\u5f85\u65f6\u95f4\nIMAGE_MATCH_WAIT_TIME = 1\n;\u56fe\u50cf\u8bc6\u522b\u5339\u914d\u5ea6\nIMAGE_RATE = 0.9\n;\u622a\u53d6\u5f53\u524d\u5c4f\u5e55\u5b9e\u65f6\u56fe\u50cf\u4fdd\u5b58\u8def\u5f84\uff0c\u7528\u4e8e\u56fe\u50cf\u8bc6\u522b\u5750\u6807\nSCREEN_CACHE = /tmp/screen.png\n;\u622a\u53d6\u5c4f\u5e55\u4e0a\u6307\u5b9a\u533a\u57df\u56fe\u7247\uff0c\u4fdd\u5b58\u4e34\u65f6\u56fe\u7247\u7684\u8def\u5f84\nTMPDIR = /tmp/tmpdir\n;\u7cfb\u7edf\u4e3b\u9898\nSYS_THEME = deepin\n;OCR\u670d\u52a1\u7aef\u5730\u5740\uff08\u4e0d\u53ef\u968f\u610f\u4fee\u6539\uff09\nOCR_SERVER_HOST = youqu-dev.uniontech.com\n;OpenCV\u670d\u52a1\u7aef\u5730\u5740\nOPENCV_SERVER_HOST = youqu-dev.uniontech.com\n;=============================== PMS CONFIG ===================================\n;PMS\u76f8\u5173\u914d\u7f6e\uff0c\u5305\u542b\u4ee5\u4e0b\u51e0\u4e2a\u65b9\u9762\uff1a\n;1.PMS\u6d4b\u8bd5\u5957\u6267\u884c\n;2.\u81ea\u52a8\u4ecePMS\u722c\u53d6\u6570\u636e\u5e76\u540c\u6b65\u672c\u5730CSV\u6587\u4ef6\n;3.PMS\u6570\u636e\u56de\u586b\n[pms]\n;PMS\u7684\u7528\u6237\u540d,\u5982: ut001234\nPMS_USER =\n;PMS\u7684\u5bc6\u7801\nPMS_PASSWORD =\n;PMS\u6d4b\u8bd5\u5957\u7684ID\n;\u5728PMS\u4e0a\u67e5\u770b\u7528\u4f8b\u201c\u5957\u4ef6\u201d\u94fe\u63a5: https://pms.uniontech.com/testsuite-view-495.html\n;\u6d4b\u8bd5\u5957ID\u4e3a: 495\nSUITE_ID =\n;\u6570\u636e\u56de\u586b\u5fc5\u987b\u5173\u8054PMS\u6d4b\u8bd5\u5355\n;\u5728PMS\u4e0a\u67e5\u770b\u6d4b\u8bd5\u5355\u94fe\u63a5: https://pms.uniontech.com/testtask-cases-20747.html\n;\u6d4b\u8bd5\u5355ID\u4e3a: 20747\nTASK_ID =\n;\u5c06\u6d4b\u8bd5\u7ed3\u679c\u6570\u636e\u56de\u586b\u5230PMS\n;\u4e3a\u7a7a: \u8868\u793a\u4e0d\u56de\u586b,\u4e0d\u4f1a\u5728\u6bcf\u6761\u7528\u4f8b\u6267\u884c\u5b8c\u4e4b\u540e\u751f\u6210json\u7ed3\u679c\u6587\u4ef6;\n;async: \u8868\u793a\u9010\u6761\u5f02\u6b65\u56de\u586b,\u540e\u9762\u4e00\u6761\u6267\u884c\u5f00\u59cb\u65f6\u901a\u8fc7\u5b50\u7ebf\u7a0b\u5bf9\u524d\u4e00\u6761\u7528\u4f8b\u7684\u6267\u884c\u7ed3\u679c\u8fdb\u884c\u56de\u586b\uff0c\u5982\u6b64\u5b9e\u73b0\u65f6\u95f4\u6548\u7387\u6700\u5927\u5316;\n;finish: \u8868\u793a\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\u6210\u4e4b\u540e\u9010\u4e2a\u56de\u586b(PMS\u4e0d\u652f\u6301\u5e76\u53d1);\nSEND_PMS =\n;\u6570\u636e\u56de\u586b\u7684\u89e6\u53d1\u8005\n;auto: \u6846\u67b6\u81ea\u52a8\u56de\u586b,\u914d\u5408SEND_PMS\u914d\u7f6e\u4f7f\u7528,\u4f60\u53ef\u4ee5\u9009\u62e9\u5728\u4e0d\u540c\u7684\u9636\u6bb5\u8fdb\u884c\u6570\u636e\u56de\u586b;\n;hand: \u624b\u52a8\u56de\u586b,\u6bcf\u6761\u7528\u4f8b\u4ecd\u7136\u4f1a\u751f\u6210json\u6587\u4ef6,\u4f46\u6846\u67b6\u4e0d\u4f1a\u8fdb\u884c\u6570\u636e\u56de\u586b,\u9700\u8981\u4f60\u53ef\u4ee5\u5728\u4f60\u60f3\u8981\u53d1\u9001\u7684\u65f6\u95f4\u70b9\u624b\u52a8\u89e6\u53d1\u56de\u586b;\nTRIGGER = auto\n;PMS\u56de\u586b\u7684\u91cd\u8bd5\u6b21\u6570\n;\u5982\u679c\u63a5\u53e3\u8bf7\u6c42\u5931\u8d25,\u4f1a\u8fdb\u884c\u91cd\u8bd5\nSEND_PMS_RETRY_NUMBER = 2\n[csv_link_pms_lib]\n;caselib: \u7528\u4f8b\u5e93\n;testcase: \u4ea7\u54c1\u5e93\u7528\u4f8b\nCASE_FROM = caselib\n[csv_link_pms_id]\n;\u540c\u6b65PMS\u6570\u636e\u5230\u672c\u5730CSV\u6587\u4ef6\uff0c\u5fc5\u987b\u8981\u914d\u7f6e\u7684\u914d\u7f6e\u9879\n;key\u662f\u672c\u5730CSV\u6587\u4ef6\u7684\u6587\u4ef6\u540d\u79f0;\n;value\u662f\u5bf9\u5e94PMS\u4e0a\u7684\u6a21\u5757ID;\n;\u6bd4\u5982\u8981\u540c\u6b65\u97f3\u4e50\u7684\u6570\u636e, \u9996\u5148\u9700\u8981\u5c06\u914d\u7f6e APP_NAME = deepin-music\uff0c\n;CSV\u6587\u4ef6\u540d\u79f0\u4e3amusic.csv\uff0c\u5176\u5728PMS\u4e0a\u7684\u7528\u4f8b\u4e3a: https://pms.uniontech.com/caselib-browse-81.html\n;\u56e0\u6b64\u5e94\u8be5\u914d\u7f6e\u4e3a: music = 81\n;\u8fd9\u6837\u624d\u80fd\u5c06PMS\u4e0e\u672c\u5730CSV\u6587\u4ef6\u5efa\u7acb\u8054\u7cfb\u3002\n;\u5982\u679c\u4f60\u7684\u5e94\u7528\u5206\u4e86\u5f88\u591a\u6a21\u5757,\u53ea\u9700\u8981\u5c06\u5bf9\u5e94\u7684\u4fe1\u606f\u4f9d\u6b21\u914d\u7f6e\u597d\u5c31\u884c\u4e86\u3002\nmusic =\n[export_csv]\n;\u5bfc\u51fa\u7684csv\u6587\u4ef6\u540d\u79f0\uff0c\u9ed8\u8ba4 case_list.csv\nCSV_FILE = case_list.csv\n;exportcsv \u547d\u4ee4\u5bfc\u51fa case_list.csv \u6587\u4ef6\u65f6\u914d\u7f6e\u7684\u5b57\u6bb5\u540d\uff0c\u7528\u4f8b\u540d\u79f0\u9ed8\u8ba4\u5b58\u5728\u7b2c\u4e00\u5217\uff0c\u65e0\u9700\u6dfb\u52a0\nCSV_HEARD = \u7528\u4f8b\u7ea7\u522b,\u7528\u4f8b\u7c7b\u578b,\u6d4b\u8bd5\u7ea7\u522b,\u662f\u5426\u8df3\u8fc7\n[log_cli]\n;\u65e5\u5fd7\u76f8\u5173\u914d\u7f6e\uff08\u4e0d\u6253\u5370\u6784\u9020\u51fd\u6570\u548c\u9b54\u6cd5\u51fd\u6570\u7684\u529f\u80fd\u8bf4\u660e\uff09\n;\u6279\u91cf\u6267\u884c\u65f6\uff0c\u7ec8\u7aef\u8f93\u51fa\u7684\u65e5\u5fd7\u7ea7\u522b DEBUG/INFO/ERROR\nLOG_LEVEL = DEBUG\n# ============= \u81ea\u52a8\u8f93\u51fa\u65e5\u5fd7\u7684\u914d\u7f6e ================\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u5f00\u5934\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7, \u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_STARTSWITH = Assert\n;\u652f\u6301\u7c7b\u540d\u4ee5 xxx \u7ed3\u5c3e\u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_ENDSWITH = Widget\n;\u652f\u6301\u7c7b\u540d\u5305\u542b xxx \u7684\uff0c\u81ea\u52a8\u5c06\u51fd\u6570\u8bf4\u660e\u6253\u5370\u4e3a\u65e5\u5fd7\uff0c\u591a\u4e2a\u53c2\u6570\u4ee5\u9017\u53f7\u9694\u5f00\nCLASS_NAME_CONTAIN = ShortCut\n# ==============================================\n
-h, --help show this help message and exit\n-a APP, --app APP \u5e94\u7528\u540d\u79f0\uff1adeepin-music \u6216 autotest_deepin_music \u6216\napps/autotest_deepin_music\n-k KEYWORDS, --keywords KEYWORDS\n\u7528\u4f8b\u7684\u5173\u952e\u8bcd,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n-t TAGS, --tags TAGS \u7528\u4f8b\u7684\u6807\u7b7e,\u652f\u6301and/or/not\u903b\u8f91\u7ec4\u5408\n--rerun RERUN \u5931\u8d25\u91cd\u8dd1\u6b21\u6570\n--record_failed_case RECORD_FAILED_CASE\n\u5931\u8d25\u5f55\u5c4f\u4ece\u7b2c\u51e0\u6b21\u5931\u8d25\u5f00\u59cb\u5f55\u5236\u89c6\u9891\n--clean {yes,} \u6e05\u7406\u73af\u5883\n--report_formats REPORT_FORMATS\n\u6d4b\u8bd5\u62a5\u544a\u683c\u5f0f\n--max_fail MAX_FAIL \u6700\u5927\u5931\u8d25\u7387\n--log_level LOG_LEVEL\n\u65e5\u5fd7\u8f93\u51fa\u7ea7\u522b\n--timeout TIMEOUT \u5355\u6761\u7528\u4f8b\u8d85\u65f6\u65f6\u95f4\n--resolution RESOLUTION\n\u68c0\u67e5\u5206\u8fa8\u7387\n--debug DEBUG \u8c03\u8bd5\u6a21\u5f0f\n--noskip {yes,} csv\u6587\u4ef6\u91cc\u9762\u6807\u8bb0\u4e86skip\u8df3\u8fc7\u7684\u7528\u4f8b\u4e0d\u751f\u6548\n--ifixed {yes,} fixed\u4e0d\u751f\u6548\uff0c\u4ec5\u901a\u8fc7skip\u8df3\u8fc7\u7528\u4f8b\n--send_pms {,async,finish}\n\u6570\u636e\u56de\u586b\n--task_id TASK_ID \u6d4b\u8bd5\u5355ID\n--trigger {,auto,hand}\n\u89e6\u53d1\u8005\n-f CASE_FILE, --case_file CASE_FILE\n\u6839\u636e\u6587\u4ef6\u6267\u884c\u7528\u4f8b\n--deb_path DEB_PATH \u9700\u8981\u5b89\u88c5deb\u5305\u7684\u672c\u5730\u8def\u5f84\n--pms_user PMS_USER pms \u7528\u6237\u540d\n--pms_password PMS_PASSWORD\npms \u5bc6\u7801\n--suite_id SUITE_ID pms \u6d4b\u8bd5\u5957ID\n--pms_info_file PMS_INFO_FILE\npms \u4fe1\u606f\u6587\u4ef6\n--top TOP \u8fc7\u7a0b\u4e2d\u8bb0\u5f55top\u547d\u4ee4\u4e2d\u7684\u503c\n--lastfailed \u4ec5\u6267\u884c\u4e0a\u6b21\u5931\u8d25\u7528\u4f8b\n--duringfail \u6d4b\u8bd5\u8fc7\u7a0b\u4e2d\u7acb\u5373\u663e\u793a\u62a5\u9519\n--repeat REPEAT \u6307\u5b9a\u7528\u4f8b\u6267\u884c\u6b21\u6570\n--project_name PROJECT_NAME\n\u5de5\u7a0b\u540d\u79f0\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--build_location BUILD_LOCATION\n\u6784\u5efa\u5730\u533a\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--line LINE \u6267\u884c\u7684\u4e1a\u52a1\u7ebf\uff08\u5199\u5165json\u6587\u4ef6\uff09\n--autostart AUTOSTART \u7528\u4f8b\u6267\u884c\u7a0b\u5e8f\u6ce8\u518c\u5230\u5f00\u673a\u81ea\u542f\u670d\u52a1\n
\u8fdc\u7a0b\u6267\u884c\u5c31\u662f\u7528\u672c\u5730\u4f5c\u4e3a\u670d\u52a1\u7aef\u63a7\u5236\u8fdc\u7a0b\u673a\u5668\u6267\u884c\uff0c\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u76f8\u540c\uff1b
\u4f7f\u7528 remote \u547d\u4ee4\uff1a
\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u6267\u884c\u5c31\u662f\u7531\u672c\u5730 YouQu \u4f5c\u4e3a\u670d\u52a1\u7aef\uff0c\u63a7\u5236\u8fdc\u7a0b N \u53f0\u673a\u5668\u6267\u884c\u76f8\u540c\u7684\u7528\u4f8b\uff0c\u6267\u884c\u5b8c\u4e4b\u540e\u6240\u6709\u6d4b\u8bd5\u673a\u7684\u6d4b\u8bd5\u7ed3\u679c\u4f1a\u8fd4\u56de\u7ed9\u670d\u52a1\u7aef report \u76ee\u5f55\u4e0b\uff1b
\u6709\u591a\u5c11\u53f0\u673a\u5668\u5c31\u50cf\u8fd9\u6837\u53c2\u8003\u4e0a\u9762\u7684\u683c\u5f0f\u5199\u5c31\u884c\u4e86\u3002
-h, --help show this help message and exit\n-c CLIENTS, --clients CLIENTS\n\u8fdc\u7a0b\u673a\u5668\u7684user@ip:password,\u591a\u4e2a\u673a\u5668\u7528'/'\u8fde\u63a5,\u5982\u679cpassword\u4e0d\u4f20\u5165,\u9ed8\u8ba4\u53d6sett\ning/remote.ini\u4e2dCLIENT_PASSWORD\u7684\u503c,\u6bd4\u5982: uos@10.8.13.33:1\n\u6216 uos@10.8.13.33\n-s, --send_code \u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a\uff08\u4e0d\u542breport\u76ee\u5f55\uff09\n-e, --build_env \u642d\u5efa\u6d4b\u8bd5\u73af\u5883,\u5982\u679c\u4e3ayes\uff0c\u4e0d\u7ba1send_code\u662f\u5426\u4e3ayes\u90fd\u4f1a\u53d1\u9001\u4ee3\u7801\u5230\u6d4b\u8bd5\u673a.\n-p CLIENT_PASSWORD, --client_password CLIENT_PASSWORD\n\u6d4b\u8bd5\u673a\u5bc6\u7801\uff08\u5168\u5c40\uff09\n-y PARALLEL, --parallel PARALLEL\nyes:\u8868\u793a\u6240\u6709\u6d4b\u8bd5\u673a\u5e76\u884c\u8dd1\uff0c\u6267\u884c\u76f8\u540c\u7684\u6d4b\u8bd5\u7528\u4f8b;no:\u8868\u793a\u6d4b\u8bd5\u673a\u5206\u5e03\u5f0f\u6267\u884c\uff0c\u670d\u52a1\u7aef\u4f1a\u6839\u636e\u6536\u96c6\u5230\u7684\u6d4b\u8bd5\u7528\u4f8b\u81ea\n\u52a8\u5206\u914d\u7ed9\u5404\u4e2a\u6d4b\u8bd5\u673a\u6267\u884c\u3002\n
\u9664\u4e86\u8fd9\u4e9b\u7279\u6709\u53c2\u6570\u4ee5\u5916\uff0c\u5b83\u540c\u6837\u652f\u6301\u672c\u5730\u6267\u884c\u7684\u6240\u6709\u53c2\u6570\uff1b
\u6ce8\u610f\uff0c\u5982\u679c\u8fdc\u7a0b\u673a\u5668\u6ca1\u6709\u642d\u5efa\u81ea\u52a8\u5316\u6d4b\u8bd5\u73af\u5883\uff0c\u8bb0\u5f97\u52a0\u4e0a\u53c2\u6570 -e \uff1a
youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\" -e\n
\u6267\u884c\u524d\u786e\u4fdd\u8fdc\u7a0b\u673a\u5668\u5df2\u7ecf\u5f00\u542f\u4e86 ssh \u670d\u52a1\uff0c\u5426\u5219\u4f1a\u63d0\u793a\u65e0\u6cd5\u8fde\u63a5\uff0c\u5982\u679c\u6ca1\u6709\u5f00\u542f\uff0c\u8bf7\u624b\u52a8\u5f00\u542f\uff1a
sudo systemctl restart ssh\nsudo systemctl enable ssh\n
\u591a\u673a\u5668\u5206\u5e03\u5f0f\u5f02\u6b65\u8d1f\u8f7d\u5747\u8861\u6267\u884c\u4e5f\u662f\u7528\u672c\u5730\u4f5c\u4e3a\u670d\u52a1\u7aef\u63a7\u5236\u8fdc\u7a0b\u673a\u5668\u6267\u884c\uff0c\u4f46\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u4e0d\u540c\uff0c\u800c\u662f\u6240\u6709\u8fdc\u7a0b\u673a\u5668\u6267\u884c\u7684\u7528\u4f8b\u4e4b\u548c\uff0c\u4e3a\u4f60\u60f3\u8981\u6267\u884c\u7684\u7528\u4f8b\u96c6\uff1b
\u4f3c\u4e4e\u6709\u70b9\u96be\u4ee5\u7406\u89e3\uff0c\u6211\u7528\u5927\u767d\u8bdd\u4e3e\u4f8b\u63cf\u8ff0\u4e0b\u5c31\u662f\uff0c\u670d\u52a1\u7aef\u60f3\u8981\u6267\u884c 10 \u6761\u7528\u4f8b\uff0c\u73b0\u5728\u8fdc\u7a0b\u673a\u5668\u6709 5 \u53f0\uff1b
\u7136\u540e\u670d\u52a1\u7aef\u5c31\u5148\u62ff\u7740\u7b2c 1 \u6761\u7528\u4f8b\u7ed9\u8fdc\u7a0b 1 \u53f7\u673a\u6267\u884c\uff0c\u62ff\u7b2c 2 \u6761\u7528\u4f8b\u7ed9\u8fdc\u7a0b 2 \u53f7\u673a\u6267\u884c...\uff0c\u5982\u6b64\u5faa\u73af\u76f4\u5230\u6240\u6709\u7528\u4f8b\u6267\u884c\u5b8c\uff0c\u8fd9\u5c31\u662f\u8d1f\u8f7d\u5747\u8861\u6267\u884c\u3002
\u4f7f\u7528\u65b9\u6cd5\u548c\u524d\u9762\u4e00\u6837\uff0c\u53ea\u662f\u9700\u8981\u589e\u52a0\u4e00\u4e2a\u53c2\u6570\uff1a
youqu manage.py remote -a deepin-music -c uos@10.8.13.33/uos@10.8.13.34 -k \"xxx\" -t \"xxx\" --parallel no\n
\u5c06\u6709\u8da3\u7684\u6587\u6863\u7cfb\u7edf\u8fc1\u79fb\u5230 linuxdeepin \uff0c\u5265\u79bb\u6587\u6863\u4e2d\u7684\u56fe\u7247\u8d44\u6e90\uff0c\u91c7\u7528 CDN \u52a0\u901f\u65b9\u5f0f\u52a0\u8f7d\uff1b
\u5c1d\u8bd5\u5408\u5165\u4e00\u4e2a\u6709\u8da3\u7684\u529f\u80fd\uff1b
\u6b64\u65b9\u6848\u4ecd\u5728\u6f14\u8fdb\u4e2d
PPL
COL
BUG
Bug
\u6b64\u914d\u7f6e\u6587\u4ef6\u9700\u8981\u7ef4\u62a4\u5927\u91cf\u7684\u6807\u7b7e\u6570\u636e\uff0c\u4e14\u8981\u65b9\u4fbf\u80fd\u4f7f\u7528 Excel \u6253\u5f00\u8fdb\u884c\u7f16\u8f91\u67e5\u770b\uff0c\u66f4\u91cd\u8981\u7684\u662f\u6211\u4eec\u4e0d\u60f3\u5f15\u5165\u4e09\u65b9\u4f9d\u8d56\uff0cCSV \u6587\u4ef6\u51e0\u4e4e\u662f\u552f\u4e00\u80fd\u6ee1\u8db3\u6240\u6709\u7684\u8981\u6c42\u7684\u6587\u4ef6\u683c\u5f0f\u3002
\u56e0\u6b64\u6211\u4eec\u9009\u62e9\u5c06 YouQu \u7684\u6587\u6863\u5de5\u7a0b\u6d89\u53ca\u5230\u7684\u56fe\u7247\u8d44\u6e90\u90fd\u91c7\u7528\u5916\u94fe\u52a0\u8f7d\uff1b
YouQu\u9ed8\u8ba4\u91c7\u7528\u865a\u62df\u5316\u90e8\u5206\uff0c\u865a\u62df\u5316\u73af\u5883\u5b9e\u9645\u5b89\u88c5\u7684\u4f4d\u7f6e\u662f\u5728 $HOME/.local/share/virtualenvs/youqu-oHTM7l7G \u76ee\u5f55\u4e0b
$HOME/.local/share/virtualenvs/youqu-oHTM7l7G
youqu-oHTM7l7G \u6b64\u76ee\u5f55\u540d\u79f0\u524d\u9762\u90e8\u5206\u662f\u4f60\u7684\u4ee3\u7801\u6839\u76ee\u5f55\u7684\u540d\u79f0\uff0c\u540e\u9762\u90e8\u5206\u662f\u751f\u6210\u7684\u968f\u673a\u5b57\u7b26\u4e32\uff1b
youqu-oHTM7l7G
\u540c\u5b66\u4eec\u5728\u8fdc\u7a0b\u673a\u5668\u4e0a\u5b9a\u4f4d\u95ee\u9898\u7684\u65f6\u5019\uff0c\u5982\u679c\u4f7f\u7528 Pycharm \u8c03\u8bd5\uff0c\u5c31\u5c06\u89e3\u91ca\u5668\u6307\u5b9a\u5230\u8fd9\u4e2a\u76ee\u5f55\u7684\u5c31\u884c\u4e86\uff1b
\u5f53\u7136\uff0c\u6211\u4eec\u4e5f\u63d0\u4f9b\u4e86\u672c\u673a\u5f00\u53d1\u73af\u5883\u90e8\u7f72\uff1a
\u5982\u679c\u4f60\u662f\u672c\u5730\u5f00\u53d1\u73af\u5883\u53ef\u4ee5\u7528\u5b83\uff0c\u533a\u522b\u5c31\u662f\u9a71\u52a8\u6267\u884c\u7684\u65f6\u5019\u4f7f\u7528\uff1apython3 manage.py xxx
python3 manage.py xxx
# Attribution :chengdu Test Team # Date :2021/08/20
此方案仍在演进中 -此方案仍在演进中
此方案仍在演进中
仓库地址:https://gitlabcd.uniontech.com/autotest/cd-desktop-aitest
基于深度学习智能识别应用的元素控件,用于在自动化测试操作过程中的元素定位以及判断结果时的断言处理;自动化测试过程中,测试机上的画面通过采集盒传输到服务器上,服务器对视频画面进行智能识别后,服务器智能判断用例是否执行成功,然后对测试机下发下一步操作指令,测试机接受并执行下一步操作。
例如:
对于用例规模比较大的应用,比如文件管理器,建议分模块,每个模块建立一个 csv 文件,所有 csv 文件建议放在一个 tags 目录下。
是否分模块维护 csv 取决于应用的用例复杂度,同时我们应该充分考虑后期的可维护性,csv 文件太多了也是一个很糟糕的事情。
上面介绍 Pytest 框架提供的标签功能 mark,使用时需要为每一个用例添加标签装饰器,则操作复杂,可维护性差,其根本问题就是标签分散在每一条用例的装饰器上,难以集中维护;于是乎将所有标签使用 csv 文件进行集中管理,并通过 Pytest 的钩子函数,读取 csv 文件,动态添加标签到用中。
此配置文件需要维护大量的标签数据,且要方便能使用Excel打开进行编辑查看,更重要的是我们不想引入三方依赖,CSV 文件几乎是唯一能满足所有的要求的文件格式。
此配置文件需要维护大量的标签数据,且要方便能使用 Excel 打开进行编辑查看,更重要的是我们不想引入三方依赖,CSV 文件几乎是唯一能满足所有的要求的文件格式。
基于 YouQu 自动化测试框架操作方法封装写法,通常是这样的:类里面一个函数只包含一个操作或多次调用的一系列可合并的操作;
大文件不能上传到工程里面,保持整个工程的轻量化,这样在克隆代码的时候才能非常快速方便使用,我们见过一个 AT 工程 clone 大小达到好几个 G,简直不可思议。
其实代码文件的大小是很小的,也就是说,纯写代码随便写工程也不会太大,而文档(包含插图)等资源却是很占空间。
因此我们选择将 YouQu 的文档工程单独迁出到独立的仓库 youqu-docs 。
因此我们选择将 YouQu 的文档工程涉及到的图片资源都采用外链加载;
项目根目录下运行 env.sh 即可。
bash env.sh @@ -2930,17 +2942,25 @@ 3.2、裁剪依赖bash env_dev.sh
bash env_dev.sh
YouQu默认采用虚拟化部分,虚拟化环境实际安装的位置是在 $HOME/.local/share/virtualenvs/youqu-oHTM7l7G 目录下
youqu-oHTM7l7G 此目录名称前面部分是你的代码根目录的名称,后面部分是生成的随机字符串;
同学们在远程机器上定位问题的时候,如果使用 Pycharm 调试,就将解释器指定到这个目录的就行了;
当然,我们也提供了本机开发环境部署:
bash env_dev.sh +
如果你是本地开发环境可以用它,区别就是驱动执行的时候使用:python3 manage.py xxx
录屏其实是一种视频形式的日志,因为很多时候我们在查看日志之后仍然无法准确的定位到用例失败的具体原因,因此用例的录屏能让我们看到用例在执行过程;
【使用方法】
在 globalconfig.ini 里面配置关注 2 个参数;
;失败用例重跑次数 -RERUN = 1 - -;失败录屏从第几次开始录制视频。 -;比如 RECORD_FAILED_CASE = 1 ,表示用例第1次执行失败之后开始录屏。 -;注意,用例失败重跑的次数不能小于失败录屏次数,即 RERUN >= RECORD_FAILED_CASE -RECORD_FAILED_CASE = 1 +;失败用例重跑次数 +RERUN = 1 + +;失败录屏从第几次开始录制视频。 +;比如 RECORD_FAILED_CASE = 1 ,表示用例第1次执行失败之后开始录屏。 +;注意,用例失败重跑的次数不能小于失败录屏次数,即 RERUN >= RECORD_FAILED_CASE +RECORD_FAILED_CASE = 1 默认失败重跑的次数是 1 次; RECORD_FAILED_CASE = 1 表示用例第1次执行失败之后开始录屏; @@ -2953,48 +2973,48 @@ 十、Wayland 适配简单讲就是,应用库只需要维护一套用例脚本即可。 【用例兼容】 因为 Wayland 下有些应用的界面显示和功能本身存在一些差异,用例层可能需要对这部分用例做逻辑判断,使用全局配置里面的常量进行逻辑编写即可: -from setting.globalconfig import GlobalConfig - -# GlobalConfig.IS_WAYLAND 获取到当前的显示服务器(bool) -# 应用库 Config 继承 GlobalConfig -if Config.IS_WAYLAND: - pass -if Config.IS_X11: - pass +from setting.globalconfig import GlobalConfig + +# GlobalConfig.IS_WAYLAND 获取到当前的显示服务器(bool) +# 应用库 Config 继承 GlobalConfig +if Config.IS_WAYLAND: + pass +if Config.IS_X11: + pass 比如用例里面如果断言的图片不同: -if Config.IS_WAYLAND: - self.assert_image_exist("wayland_XXX") -else: - self.assert_image_exist("x11_XXX") +if Config.IS_WAYLAND: + self.assert_image_exist("wayland_XXX") +else: + self.assert_image_exist("x11_XXX") 这样这条用例脚本在 Wayland 和 X11 下都可以跑,so easy 是不是?完全没必要专门拉新分支进行 Wayland 适配。 十一、测试报告¶ 1. 目录结构¶ 执行时会在根目录下动态生成 report 目录,所有的报告相关的文件会统一存放在里面,示例: -/report - ├── allure # allure报告 - │ ├── ... - │ └── ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json - ├── allure_html # 生成的html报告 - │ ├── ... - │ └── index.html - ├── allure_back # allure报告备份 - │ └── 20221108114823 - │ ├── ... - │ └── f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json - ├── json # json报告 - │ ├── ... - │ └── result_deepin-music_20221109134736_1081333.json - ├── logs # 日志文件 - │ ├── 2022-11-10_debug.log - │ └── 2022-11-10_error.log - ├── record # 录屏 - │ └── 2022-11-09 - │ ├── ... - │ └── 15时14分09秒_test_music_303_2_autotest.mp4 - └── xml # xml报告 - └── autotest_deepin_music-20221109134736.xml +/report + ├── allure # allure报告 + │ ├── ... + │ └── ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json + ├── allure_html # 生成的html报告 + │ ├── ... + │ └── index.html + ├── allure_back # allure报告备份 + │ └── 20221108114823 + │ ├── ... + │ └── f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json + ├── json # json报告 + │ ├── ... + │ └── result_deepin-music_20221109134736_1081333.json + ├── logs # 日志文件 + │ ├── 2022-11-10_debug.log + │ └── 2022-11-10_error.log + ├── record # 录屏 + │ └── 2022-11-09 + │ ├── ... + │ └── 15时14分09秒_test_music_303_2_autotest.mp4 + └── xml # xml报告 + └── autotest_deepin_music-20221109134736.xml 默认情况下同时生成 html、xml、json三种形式的报告。 2. 定制报告¶ @@ -3011,14 +3031,14 @@ 3. 查看报告allure open report/allure_html +allure open report/allure_html 使用 manage.py 执行完之后,在终端的最后一行,我们会给你输出打开报告的命令,直接复制它在终端执行就可以查看了,像这样: - 终端执行命令: allure open /tmp/youqu/report/allure_html 查看报告 + 终端执行命令: allure open /tmp/youqu/report/allure_html 查看报告 你也可以直接在 Pycharm 里面找到 index.html 文件,然后右键选择浏览器打开,或者你可以用一个 http 服务打开。 你也可以直接在 report/allure 目录下查看报告: - allure serve report/allure + allure serve report/allure 远程执行 @@ -3031,48 +3051,48 @@ 1. 提前解决代码问题这里推荐一个 Python 社区流行的代码格式化工具: Black,号称不妥协的代码格式化工具,它检测到不符合规范的代码风格直接就帮你全部格式化好,就是这么刚! 安装: -sudo pip3 install black +sudo pip3 install black 使用方法: -black ${CheckPath} +black ${CheckPath} 使用这个工具格式化之后,代码会被自动调整,刚开始你可能会觉得调整得很夸张,没关系坚持看,习惯之后,你会觉得很优雅,没错,这就是 Pythonic Code 的核心,请保持优雅~。 2. 代码扫描工具¶ 使用根目录下 pylint.sh 扫描代码,在 report 目录下查看代码扫描报告,如果有代码问题请提前解决之后再提交。 此脚本已经使用 Python 社区最流行的代码扫描工具 Pylint 进行代码扫描。 使用方法: -bash pylint.sh +bash pylint.sh 运行之后会提示你要扫描的目录,比如输入 apps ,则会扫描 apps 下的所有 Python 代码。 在 setting/pylintrc.cfg 配置文件里面进行相关配置,扫描完成之后在 report/pylints 目录下会生成扫描报告。 代码提交需通过 git review 提交到 gerrit ,人工 Code Review 通过之后合入代码。 十三、提交代码¶ 1. 安装依赖¶ -sudo apt install git-review +sudo apt install git-review 2. 提交模板¶ 在 ~ 目录下新建文件,并命名为 gitcommit_template 将以下内容写入文件当中: -# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 -fix: - -# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 -Description: - -# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 -Log: - -# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 -#Bug: - -# 修复 github issue -#Issue: - -# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 -#Task: +# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 +fix: + +# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 +Description: + +# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 +Log: + +# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 +#Bug: + +# 修复 github issue +#Issue: + +# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 +#Task: 命令行执行: -git config --global commit.template ~/gitcommit_template +git config --global commit.template ~/gitcommit_template 此命令将模板加入到 git 的提交模板中。 后续提交的时候需要关注一下几点: @@ -3083,19 +3103,19 @@ 2. 提交模板3. 推送代码¶ 首先添加 commit 信息 -git add 后面加文件名称 +git add 后面加文件名称 -git add . # 表示添加所有文件 +git add . # 表示添加所有文件 使用这条命令注意有些临时文件不要提交到仓库了。 -git commit -a +git commit -a 之后在 fix: 后面(注意冒号后面必须加空格,不然直接-1)写本地提交的 commit 信息,然后就可以提交代码了 -git review branch(当前分支) -r origin +git review branch(当前分支) -r origin 最好一次 commit,一次 git review ,经常有同学在本地疯狂 commit 最后 git review 报错不知道咋回事儿。 若不想每次提交都加上 -r 选项,执行以下命令: -git config --global gitreview.remote origin +git config --global gitreview.remote origin 提交代码,直接使用 git review branch<目标分支>,例如 git review master 4. Git标签¶ @@ -3106,74 +3126,74 @@ 4. Git标签git tag -a <tagname> +git tag -a <tagname> 回车之后,Git 会打开你的编辑器,让你写一句标签注解,就像你给提交写注解一样。 查看所有标签 -git tag -l -# git tag 也行 +git tag -l +# git tag 也行 删除标签 -git tag -d <tagname> +git tag -d <tagname> 推送标签至远程 git push 命令并不会传送标签到远程仓库服务器上,必须显式地推送标签。 -git push origin <tagname> +git push origin <tagname> 推送所有不在远程仓库服务器上的标签 -git push origin --tag +git push origin --tag 删除远程标签 -git push origin :refs/tag/<tagname> +git push origin :refs/tag/<tagname> 后期打标签 先用 git log --pretty=oneline 查询提交记录,获取校验码。 -git tag -a <tagname> 9fceb02(校验码) +git tag -a <tagname> 9fceb02(校验码) 检出标签 -git checkout <tagname> +git checkout <tagname> 此时,仓库会处于“分离头指针(detached HEAD)”的状态。 在“分离头指针”状态下,如果你做了某些更改然后提交它们,标签不会发生变化, 但你的新提交将不属于任何分支,并且将无法访问,除非通过确切的提交哈希才能访问。 因此,如果你需要进行更改,比如你要修复旧版本中的错误,那么通常需要创建一个新分支: -git checkout -b <NewBranchName> <tagname> +git checkout -b <NewBranchName> <tagname> 新分支上可以进行提交代码。 十四、常见问题¶ 1. 提交代码时提示邮箱或者名称不对¶ 重新配置邮箱或者名称,然后重置生效: -git commit --amend --reset-author +git commit --amend --reset-author 2. 怎么回滚到之前的版本¶ (1)查询历史提交记录 -git log +git log 找到你要回滚的版本,复制 hash 值。 注意:是 commit 空格之后的 hash 值,之前有同学复制的 Change-Id: 这样肯定报错。 (2)回滚版本,不清除代码 -git reset --soft ${hash} +git reset --soft ${hash} (3)回滚版本,清除代码,慎用哈 -git reset --hard ${hash} +git reset --hard ${hash} 3. 测试报告里面 F S . E 是什么意思¶ F 表示失败,. (点)表示通过,S 表示跳过,E 表示 error 有报错 4. 解决 git status 中文显示的问题¶ -git config --global core.quotePath false +git config --global core.quotePath false 5. apps 目录下颜色有些是黄色的¶ 在 Pycharm 中 apps 目录下应用库文件是黄色的,编辑器识别不到代码新增和修改; @@ -3184,22 +3204,22 @@ 5. apps 目录下颜色有些是黄色的6. 执行 env.sh 报错 $'\r':未找到命令¶ 出现这个问题你应该是在 windows 上打开或编辑过 env.sh 脚本,windows下的换行是回车符+换行符,也就是\r\n,而 Linxu 下是换行符 \n,Linux 下不识别 \r,因此报错。 解决方案: -# 将 \r 替换为空 -sudo sed -i 's/\r//' env.sh +# 将 \r 替换为空 +sudo sed -i 's/\r//' env.sh 7.怎样为单独某一条用例配置执行超时时间¶ 在用例脚本中添加装饰器,如下: -@pytest.mark.timeout(300) # 单位秒 -def test_xxx_001(): - pass +@pytest.mark.timeout(300) # 单位秒 +def test_xxx_001(): + pass 8. 如何拉取 YouQu 自动化项目所有代码,包含子仓库¶ 前置条件:已申请访问 YouQu 权限群组 -# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) -git config --global credential.helper store - -# 拉取YouQu框架代码,并递归拉取子仓库代码 -git clone "http://gerrit.uniontech.com/youqu" --recursive +# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) +git config --global credential.helper store + +# 拉取YouQu框架代码,并递归拉取子仓库代码 +git clone "http://gerrit.uniontech.com/youqu" --recursive 9. 如何拉取 YouQu 自动化项目中指定子仓库的代码¶ 前置条件: @@ -3207,22 +3227,22 @@ 9. 如何拉取 YouQu 自动化项目中指定子仓库的代 已申请访问 YouQu 权限群组 已存储访问密码 -# 拉取YouQu框架代码 -git clone "http://gerrit.uniontech.com/youqu" - -# 指定拉取子仓库代码 -cd youqu -git submodule update --init apps/autotest_xxx_xxx +# 拉取YouQu框架代码 +git clone "http://gerrit.uniontech.com/youqu" + +# 指定拉取子仓库代码 +cd youqu +git submodule update --init apps/autotest_xxx_xxx 10. 如何更新 YouQu 自动化项目中,所有子仓库的代码¶ 更新所有子仓库代码 -cd youqu -git pull & git submodule foreach git pull +cd youqu +git pull & git submodule foreach git pull 11. 如何修复 YouQu 所有子仓库 master 分支游离头(detached head)¶ 修复所有子仓库默认master 分支游离头 -cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
;失败用例重跑次数 +RERUN = 1 + +;失败录屏从第几次开始录制视频。 +;比如 RECORD_FAILED_CASE = 1 ,表示用例第1次执行失败之后开始录屏。 +;注意,用例失败重跑的次数不能小于失败录屏次数,即 RERUN >= RECORD_FAILED_CASE +RECORD_FAILED_CASE = 1
默认失败重跑的次数是 1 次;
RECORD_FAILED_CASE = 1 表示用例第1次执行失败之后开始录屏;
【用例兼容】
因为 Wayland 下有些应用的界面显示和功能本身存在一些差异,用例层可能需要对这部分用例做逻辑判断,使用全局配置里面的常量进行逻辑编写即可:
from setting.globalconfig import GlobalConfig - -# GlobalConfig.IS_WAYLAND 获取到当前的显示服务器(bool) -# 应用库 Config 继承 GlobalConfig -if Config.IS_WAYLAND: - pass -if Config.IS_X11: - pass +from setting.globalconfig import GlobalConfig + +# GlobalConfig.IS_WAYLAND 获取到当前的显示服务器(bool) +# 应用库 Config 继承 GlobalConfig +if Config.IS_WAYLAND: + pass +if Config.IS_X11: + pass 比如用例里面如果断言的图片不同: -if Config.IS_WAYLAND: - self.assert_image_exist("wayland_XXX") -else: - self.assert_image_exist("x11_XXX") +if Config.IS_WAYLAND: + self.assert_image_exist("wayland_XXX") +else: + self.assert_image_exist("x11_XXX") 这样这条用例脚本在 Wayland 和 X11 下都可以跑,so easy 是不是?完全没必要专门拉新分支进行 Wayland 适配。 十一、测试报告¶ 1. 目录结构¶ 执行时会在根目录下动态生成 report 目录,所有的报告相关的文件会统一存放在里面,示例: -/report - ├── allure # allure报告 - │ ├── ... - │ └── ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json - ├── allure_html # 生成的html报告 - │ ├── ... - │ └── index.html - ├── allure_back # allure报告备份 - │ └── 20221108114823 - │ ├── ... - │ └── f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json - ├── json # json报告 - │ ├── ... - │ └── result_deepin-music_20221109134736_1081333.json - ├── logs # 日志文件 - │ ├── 2022-11-10_debug.log - │ └── 2022-11-10_error.log - ├── record # 录屏 - │ └── 2022-11-09 - │ ├── ... - │ └── 15时14分09秒_test_music_303_2_autotest.mp4 - └── xml # xml报告 - └── autotest_deepin_music-20221109134736.xml +/report + ├── allure # allure报告 + │ ├── ... + │ └── ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json + ├── allure_html # 生成的html报告 + │ ├── ... + │ └── index.html + ├── allure_back # allure报告备份 + │ └── 20221108114823 + │ ├── ... + │ └── f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json + ├── json # json报告 + │ ├── ... + │ └── result_deepin-music_20221109134736_1081333.json + ├── logs # 日志文件 + │ ├── 2022-11-10_debug.log + │ └── 2022-11-10_error.log + ├── record # 录屏 + │ └── 2022-11-09 + │ ├── ... + │ └── 15时14分09秒_test_music_303_2_autotest.mp4 + └── xml # xml报告 + └── autotest_deepin_music-20221109134736.xml 默认情况下同时生成 html、xml、json三种形式的报告。 2. 定制报告¶ @@ -3011,14 +3031,14 @@ 3. 查看报告allure open report/allure_html +allure open report/allure_html 使用 manage.py 执行完之后,在终端的最后一行,我们会给你输出打开报告的命令,直接复制它在终端执行就可以查看了,像这样: - 终端执行命令: allure open /tmp/youqu/report/allure_html 查看报告 + 终端执行命令: allure open /tmp/youqu/report/allure_html 查看报告 你也可以直接在 Pycharm 里面找到 index.html 文件,然后右键选择浏览器打开,或者你可以用一个 http 服务打开。 你也可以直接在 report/allure 目录下查看报告: - allure serve report/allure + allure serve report/allure 远程执行 @@ -3031,48 +3051,48 @@ 1. 提前解决代码问题这里推荐一个 Python 社区流行的代码格式化工具: Black,号称不妥协的代码格式化工具,它检测到不符合规范的代码风格直接就帮你全部格式化好,就是这么刚! 安装: -sudo pip3 install black +sudo pip3 install black 使用方法: -black ${CheckPath} +black ${CheckPath} 使用这个工具格式化之后,代码会被自动调整,刚开始你可能会觉得调整得很夸张,没关系坚持看,习惯之后,你会觉得很优雅,没错,这就是 Pythonic Code 的核心,请保持优雅~。 2. 代码扫描工具¶ 使用根目录下 pylint.sh 扫描代码,在 report 目录下查看代码扫描报告,如果有代码问题请提前解决之后再提交。 此脚本已经使用 Python 社区最流行的代码扫描工具 Pylint 进行代码扫描。 使用方法: -bash pylint.sh +bash pylint.sh 运行之后会提示你要扫描的目录,比如输入 apps ,则会扫描 apps 下的所有 Python 代码。 在 setting/pylintrc.cfg 配置文件里面进行相关配置,扫描完成之后在 report/pylints 目录下会生成扫描报告。 代码提交需通过 git review 提交到 gerrit ,人工 Code Review 通过之后合入代码。 十三、提交代码¶ 1. 安装依赖¶ -sudo apt install git-review +sudo apt install git-review 2. 提交模板¶ 在 ~ 目录下新建文件,并命名为 gitcommit_template 将以下内容写入文件当中: -# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 -fix: - -# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 -Description: - -# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 -Log: - -# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 -#Bug: - -# 修复 github issue -#Issue: - -# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 -#Task: +# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 +fix: + +# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 +Description: + +# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 +Log: + +# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 +#Bug: + +# 修复 github issue +#Issue: + +# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 +#Task: 命令行执行: -git config --global commit.template ~/gitcommit_template +git config --global commit.template ~/gitcommit_template 此命令将模板加入到 git 的提交模板中。 后续提交的时候需要关注一下几点: @@ -3083,19 +3103,19 @@ 2. 提交模板3. 推送代码¶ 首先添加 commit 信息 -git add 后面加文件名称 +git add 后面加文件名称 -git add . # 表示添加所有文件 +git add . # 表示添加所有文件 使用这条命令注意有些临时文件不要提交到仓库了。 -git commit -a +git commit -a 之后在 fix: 后面(注意冒号后面必须加空格,不然直接-1)写本地提交的 commit 信息,然后就可以提交代码了 -git review branch(当前分支) -r origin +git review branch(当前分支) -r origin 最好一次 commit,一次 git review ,经常有同学在本地疯狂 commit 最后 git review 报错不知道咋回事儿。 若不想每次提交都加上 -r 选项,执行以下命令: -git config --global gitreview.remote origin +git config --global gitreview.remote origin 提交代码,直接使用 git review branch<目标分支>,例如 git review master 4. Git标签¶ @@ -3106,74 +3126,74 @@ 4. Git标签git tag -a <tagname> +git tag -a <tagname> 回车之后,Git 会打开你的编辑器,让你写一句标签注解,就像你给提交写注解一样。 查看所有标签 -git tag -l -# git tag 也行 +git tag -l +# git tag 也行 删除标签 -git tag -d <tagname> +git tag -d <tagname> 推送标签至远程 git push 命令并不会传送标签到远程仓库服务器上,必须显式地推送标签。 -git push origin <tagname> +git push origin <tagname> 推送所有不在远程仓库服务器上的标签 -git push origin --tag +git push origin --tag 删除远程标签 -git push origin :refs/tag/<tagname> +git push origin :refs/tag/<tagname> 后期打标签 先用 git log --pretty=oneline 查询提交记录,获取校验码。 -git tag -a <tagname> 9fceb02(校验码) +git tag -a <tagname> 9fceb02(校验码) 检出标签 -git checkout <tagname> +git checkout <tagname> 此时,仓库会处于“分离头指针(detached HEAD)”的状态。 在“分离头指针”状态下,如果你做了某些更改然后提交它们,标签不会发生变化, 但你的新提交将不属于任何分支,并且将无法访问,除非通过确切的提交哈希才能访问。 因此,如果你需要进行更改,比如你要修复旧版本中的错误,那么通常需要创建一个新分支: -git checkout -b <NewBranchName> <tagname> +git checkout -b <NewBranchName> <tagname> 新分支上可以进行提交代码。 十四、常见问题¶ 1. 提交代码时提示邮箱或者名称不对¶ 重新配置邮箱或者名称,然后重置生效: -git commit --amend --reset-author +git commit --amend --reset-author 2. 怎么回滚到之前的版本¶ (1)查询历史提交记录 -git log +git log 找到你要回滚的版本,复制 hash 值。 注意:是 commit 空格之后的 hash 值,之前有同学复制的 Change-Id: 这样肯定报错。 (2)回滚版本,不清除代码 -git reset --soft ${hash} +git reset --soft ${hash} (3)回滚版本,清除代码,慎用哈 -git reset --hard ${hash} +git reset --hard ${hash} 3. 测试报告里面 F S . E 是什么意思¶ F 表示失败,. (点)表示通过,S 表示跳过,E 表示 error 有报错 4. 解决 git status 中文显示的问题¶ -git config --global core.quotePath false +git config --global core.quotePath false 5. apps 目录下颜色有些是黄色的¶ 在 Pycharm 中 apps 目录下应用库文件是黄色的,编辑器识别不到代码新增和修改; @@ -3184,22 +3204,22 @@ 5. apps 目录下颜色有些是黄色的6. 执行 env.sh 报错 $'\r':未找到命令¶ 出现这个问题你应该是在 windows 上打开或编辑过 env.sh 脚本,windows下的换行是回车符+换行符,也就是\r\n,而 Linxu 下是换行符 \n,Linux 下不识别 \r,因此报错。 解决方案: -# 将 \r 替换为空 -sudo sed -i 's/\r//' env.sh +# 将 \r 替换为空 +sudo sed -i 's/\r//' env.sh 7.怎样为单独某一条用例配置执行超时时间¶ 在用例脚本中添加装饰器,如下: -@pytest.mark.timeout(300) # 单位秒 -def test_xxx_001(): - pass +@pytest.mark.timeout(300) # 单位秒 +def test_xxx_001(): + pass 8. 如何拉取 YouQu 自动化项目所有代码,包含子仓库¶ 前置条件:已申请访问 YouQu 权限群组 -# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) -git config --global credential.helper store - -# 拉取YouQu框架代码,并递归拉取子仓库代码 -git clone "http://gerrit.uniontech.com/youqu" --recursive +# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) +git config --global credential.helper store + +# 拉取YouQu框架代码,并递归拉取子仓库代码 +git clone "http://gerrit.uniontech.com/youqu" --recursive 9. 如何拉取 YouQu 自动化项目中指定子仓库的代码¶ 前置条件: @@ -3207,22 +3227,22 @@ 9. 如何拉取 YouQu 自动化项目中指定子仓库的代 已申请访问 YouQu 权限群组 已存储访问密码 -# 拉取YouQu框架代码 -git clone "http://gerrit.uniontech.com/youqu" - -# 指定拉取子仓库代码 -cd youqu -git submodule update --init apps/autotest_xxx_xxx +# 拉取YouQu框架代码 +git clone "http://gerrit.uniontech.com/youqu" + +# 指定拉取子仓库代码 +cd youqu +git submodule update --init apps/autotest_xxx_xxx 10. 如何更新 YouQu 自动化项目中,所有子仓库的代码¶ 更新所有子仓库代码 -cd youqu -git pull & git submodule foreach git pull +cd youqu +git pull & git submodule foreach git pull 11. 如何修复 YouQu 所有子仓库 master 分支游离头(detached head)¶ 修复所有子仓库默认master 分支游离头 -cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
from setting.globalconfig import GlobalConfig + +# GlobalConfig.IS_WAYLAND 获取到当前的显示服务器(bool) +# 应用库 Config 继承 GlobalConfig +if Config.IS_WAYLAND: + pass +if Config.IS_X11: + pass
比如用例里面如果断言的图片不同:
if Config.IS_WAYLAND: - self.assert_image_exist("wayland_XXX") -else: - self.assert_image_exist("x11_XXX") +if Config.IS_WAYLAND: + self.assert_image_exist("wayland_XXX") +else: + self.assert_image_exist("x11_XXX") 这样这条用例脚本在 Wayland 和 X11 下都可以跑,so easy 是不是?完全没必要专门拉新分支进行 Wayland 适配。 十一、测试报告¶ 1. 目录结构¶ 执行时会在根目录下动态生成 report 目录,所有的报告相关的文件会统一存放在里面,示例: -/report - ├── allure # allure报告 - │ ├── ... - │ └── ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json - ├── allure_html # 生成的html报告 - │ ├── ... - │ └── index.html - ├── allure_back # allure报告备份 - │ └── 20221108114823 - │ ├── ... - │ └── f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json - ├── json # json报告 - │ ├── ... - │ └── result_deepin-music_20221109134736_1081333.json - ├── logs # 日志文件 - │ ├── 2022-11-10_debug.log - │ └── 2022-11-10_error.log - ├── record # 录屏 - │ └── 2022-11-09 - │ ├── ... - │ └── 15时14分09秒_test_music_303_2_autotest.mp4 - └── xml # xml报告 - └── autotest_deepin_music-20221109134736.xml +/report + ├── allure # allure报告 + │ ├── ... + │ └── ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json + ├── allure_html # 生成的html报告 + │ ├── ... + │ └── index.html + ├── allure_back # allure报告备份 + │ └── 20221108114823 + │ ├── ... + │ └── f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json + ├── json # json报告 + │ ├── ... + │ └── result_deepin-music_20221109134736_1081333.json + ├── logs # 日志文件 + │ ├── 2022-11-10_debug.log + │ └── 2022-11-10_error.log + ├── record # 录屏 + │ └── 2022-11-09 + │ ├── ... + │ └── 15时14分09秒_test_music_303_2_autotest.mp4 + └── xml # xml报告 + └── autotest_deepin_music-20221109134736.xml 默认情况下同时生成 html、xml、json三种形式的报告。 2. 定制报告¶ @@ -3011,14 +3031,14 @@ 3. 查看报告allure open report/allure_html +allure open report/allure_html 使用 manage.py 执行完之后,在终端的最后一行,我们会给你输出打开报告的命令,直接复制它在终端执行就可以查看了,像这样: - 终端执行命令: allure open /tmp/youqu/report/allure_html 查看报告 + 终端执行命令: allure open /tmp/youqu/report/allure_html 查看报告 你也可以直接在 Pycharm 里面找到 index.html 文件,然后右键选择浏览器打开,或者你可以用一个 http 服务打开。 你也可以直接在 report/allure 目录下查看报告: - allure serve report/allure + allure serve report/allure 远程执行 @@ -3031,48 +3051,48 @@ 1. 提前解决代码问题这里推荐一个 Python 社区流行的代码格式化工具: Black,号称不妥协的代码格式化工具,它检测到不符合规范的代码风格直接就帮你全部格式化好,就是这么刚! 安装: -sudo pip3 install black +sudo pip3 install black 使用方法: -black ${CheckPath} +black ${CheckPath} 使用这个工具格式化之后,代码会被自动调整,刚开始你可能会觉得调整得很夸张,没关系坚持看,习惯之后,你会觉得很优雅,没错,这就是 Pythonic Code 的核心,请保持优雅~。 2. 代码扫描工具¶ 使用根目录下 pylint.sh 扫描代码,在 report 目录下查看代码扫描报告,如果有代码问题请提前解决之后再提交。 此脚本已经使用 Python 社区最流行的代码扫描工具 Pylint 进行代码扫描。 使用方法: -bash pylint.sh +bash pylint.sh 运行之后会提示你要扫描的目录,比如输入 apps ,则会扫描 apps 下的所有 Python 代码。 在 setting/pylintrc.cfg 配置文件里面进行相关配置,扫描完成之后在 report/pylints 目录下会生成扫描报告。 代码提交需通过 git review 提交到 gerrit ,人工 Code Review 通过之后合入代码。 十三、提交代码¶ 1. 安装依赖¶ -sudo apt install git-review +sudo apt install git-review 2. 提交模板¶ 在 ~ 目录下新建文件,并命名为 gitcommit_template 将以下内容写入文件当中: -# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 -fix: - -# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 -Description: - -# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 -Log: - -# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 -#Bug: - -# 修复 github issue -#Issue: - -# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 -#Task: +# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 +fix: + +# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 +Description: + +# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 +Log: + +# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 +#Bug: + +# 修复 github issue +#Issue: + +# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 +#Task: 命令行执行: -git config --global commit.template ~/gitcommit_template +git config --global commit.template ~/gitcommit_template 此命令将模板加入到 git 的提交模板中。 后续提交的时候需要关注一下几点: @@ -3083,19 +3103,19 @@ 2. 提交模板3. 推送代码¶ 首先添加 commit 信息 -git add 后面加文件名称 +git add 后面加文件名称 -git add . # 表示添加所有文件 +git add . # 表示添加所有文件 使用这条命令注意有些临时文件不要提交到仓库了。 -git commit -a +git commit -a 之后在 fix: 后面(注意冒号后面必须加空格,不然直接-1)写本地提交的 commit 信息,然后就可以提交代码了 -git review branch(当前分支) -r origin +git review branch(当前分支) -r origin 最好一次 commit,一次 git review ,经常有同学在本地疯狂 commit 最后 git review 报错不知道咋回事儿。 若不想每次提交都加上 -r 选项,执行以下命令: -git config --global gitreview.remote origin +git config --global gitreview.remote origin 提交代码,直接使用 git review branch<目标分支>,例如 git review master 4. Git标签¶ @@ -3106,74 +3126,74 @@ 4. Git标签git tag -a <tagname> +git tag -a <tagname> 回车之后,Git 会打开你的编辑器,让你写一句标签注解,就像你给提交写注解一样。 查看所有标签 -git tag -l -# git tag 也行 +git tag -l +# git tag 也行 删除标签 -git tag -d <tagname> +git tag -d <tagname> 推送标签至远程 git push 命令并不会传送标签到远程仓库服务器上,必须显式地推送标签。 -git push origin <tagname> +git push origin <tagname> 推送所有不在远程仓库服务器上的标签 -git push origin --tag +git push origin --tag 删除远程标签 -git push origin :refs/tag/<tagname> +git push origin :refs/tag/<tagname> 后期打标签 先用 git log --pretty=oneline 查询提交记录,获取校验码。 -git tag -a <tagname> 9fceb02(校验码) +git tag -a <tagname> 9fceb02(校验码) 检出标签 -git checkout <tagname> +git checkout <tagname> 此时,仓库会处于“分离头指针(detached HEAD)”的状态。 在“分离头指针”状态下,如果你做了某些更改然后提交它们,标签不会发生变化, 但你的新提交将不属于任何分支,并且将无法访问,除非通过确切的提交哈希才能访问。 因此,如果你需要进行更改,比如你要修复旧版本中的错误,那么通常需要创建一个新分支: -git checkout -b <NewBranchName> <tagname> +git checkout -b <NewBranchName> <tagname> 新分支上可以进行提交代码。 十四、常见问题¶ 1. 提交代码时提示邮箱或者名称不对¶ 重新配置邮箱或者名称,然后重置生效: -git commit --amend --reset-author +git commit --amend --reset-author 2. 怎么回滚到之前的版本¶ (1)查询历史提交记录 -git log +git log 找到你要回滚的版本,复制 hash 值。 注意:是 commit 空格之后的 hash 值,之前有同学复制的 Change-Id: 这样肯定报错。 (2)回滚版本,不清除代码 -git reset --soft ${hash} +git reset --soft ${hash} (3)回滚版本,清除代码,慎用哈 -git reset --hard ${hash} +git reset --hard ${hash} 3. 测试报告里面 F S . E 是什么意思¶ F 表示失败,. (点)表示通过,S 表示跳过,E 表示 error 有报错 4. 解决 git status 中文显示的问题¶ -git config --global core.quotePath false +git config --global core.quotePath false 5. apps 目录下颜色有些是黄色的¶ 在 Pycharm 中 apps 目录下应用库文件是黄色的,编辑器识别不到代码新增和修改; @@ -3184,22 +3204,22 @@ 5. apps 目录下颜色有些是黄色的6. 执行 env.sh 报错 $'\r':未找到命令¶ 出现这个问题你应该是在 windows 上打开或编辑过 env.sh 脚本,windows下的换行是回车符+换行符,也就是\r\n,而 Linxu 下是换行符 \n,Linux 下不识别 \r,因此报错。 解决方案: -# 将 \r 替换为空 -sudo sed -i 's/\r//' env.sh +# 将 \r 替换为空 +sudo sed -i 's/\r//' env.sh 7.怎样为单独某一条用例配置执行超时时间¶ 在用例脚本中添加装饰器,如下: -@pytest.mark.timeout(300) # 单位秒 -def test_xxx_001(): - pass +@pytest.mark.timeout(300) # 单位秒 +def test_xxx_001(): + pass 8. 如何拉取 YouQu 自动化项目所有代码,包含子仓库¶ 前置条件:已申请访问 YouQu 权限群组 -# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) -git config --global credential.helper store - -# 拉取YouQu框架代码,并递归拉取子仓库代码 -git clone "http://gerrit.uniontech.com/youqu" --recursive +# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) +git config --global credential.helper store + +# 拉取YouQu框架代码,并递归拉取子仓库代码 +git clone "http://gerrit.uniontech.com/youqu" --recursive 9. 如何拉取 YouQu 自动化项目中指定子仓库的代码¶ 前置条件: @@ -3207,22 +3227,22 @@ 9. 如何拉取 YouQu 自动化项目中指定子仓库的代 已申请访问 YouQu 权限群组 已存储访问密码 -# 拉取YouQu框架代码 -git clone "http://gerrit.uniontech.com/youqu" - -# 指定拉取子仓库代码 -cd youqu -git submodule update --init apps/autotest_xxx_xxx +# 拉取YouQu框架代码 +git clone "http://gerrit.uniontech.com/youqu" + +# 指定拉取子仓库代码 +cd youqu +git submodule update --init apps/autotest_xxx_xxx 10. 如何更新 YouQu 自动化项目中,所有子仓库的代码¶ 更新所有子仓库代码 -cd youqu -git pull & git submodule foreach git pull +cd youqu +git pull & git submodule foreach git pull 11. 如何修复 YouQu 所有子仓库 master 分支游离头(detached head)¶ 修复所有子仓库默认master 分支游离头 -cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
if Config.IS_WAYLAND: + self.assert_image_exist("wayland_XXX") +else: + self.assert_image_exist("x11_XXX")
这样这条用例脚本在 Wayland 和 X11 下都可以跑,so easy 是不是?完全没必要专门拉新分支进行 Wayland 适配。
执行时会在根目录下动态生成 report 目录,所有的报告相关的文件会统一存放在里面,示例:
/report - ├── allure # allure报告 - │ ├── ... - │ └── ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json - ├── allure_html # 生成的html报告 - │ ├── ... - │ └── index.html - ├── allure_back # allure报告备份 - │ └── 20221108114823 - │ ├── ... - │ └── f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json - ├── json # json报告 - │ ├── ... - │ └── result_deepin-music_20221109134736_1081333.json - ├── logs # 日志文件 - │ ├── 2022-11-10_debug.log - │ └── 2022-11-10_error.log - ├── record # 录屏 - │ └── 2022-11-09 - │ ├── ... - │ └── 15时14分09秒_test_music_303_2_autotest.mp4 - └── xml # xml报告 - └── autotest_deepin_music-20221109134736.xml +/report + ├── allure # allure报告 + │ ├── ... + │ └── ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json + ├── allure_html # 生成的html报告 + │ ├── ... + │ └── index.html + ├── allure_back # allure报告备份 + │ └── 20221108114823 + │ ├── ... + │ └── f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json + ├── json # json报告 + │ ├── ... + │ └── result_deepin-music_20221109134736_1081333.json + ├── logs # 日志文件 + │ ├── 2022-11-10_debug.log + │ └── 2022-11-10_error.log + ├── record # 录屏 + │ └── 2022-11-09 + │ ├── ... + │ └── 15时14分09秒_test_music_303_2_autotest.mp4 + └── xml # xml报告 + └── autotest_deepin_music-20221109134736.xml 默认情况下同时生成 html、xml、json三种形式的报告。 2. 定制报告¶ @@ -3011,14 +3031,14 @@ 3. 查看报告allure open report/allure_html +allure open report/allure_html 使用 manage.py 执行完之后,在终端的最后一行,我们会给你输出打开报告的命令,直接复制它在终端执行就可以查看了,像这样: - 终端执行命令: allure open /tmp/youqu/report/allure_html 查看报告 + 终端执行命令: allure open /tmp/youqu/report/allure_html 查看报告 你也可以直接在 Pycharm 里面找到 index.html 文件,然后右键选择浏览器打开,或者你可以用一个 http 服务打开。 你也可以直接在 report/allure 目录下查看报告: - allure serve report/allure + allure serve report/allure 远程执行 @@ -3031,48 +3051,48 @@ 1. 提前解决代码问题这里推荐一个 Python 社区流行的代码格式化工具: Black,号称不妥协的代码格式化工具,它检测到不符合规范的代码风格直接就帮你全部格式化好,就是这么刚! 安装: -sudo pip3 install black +sudo pip3 install black 使用方法: -black ${CheckPath} +black ${CheckPath} 使用这个工具格式化之后,代码会被自动调整,刚开始你可能会觉得调整得很夸张,没关系坚持看,习惯之后,你会觉得很优雅,没错,这就是 Pythonic Code 的核心,请保持优雅~。 2. 代码扫描工具¶ 使用根目录下 pylint.sh 扫描代码,在 report 目录下查看代码扫描报告,如果有代码问题请提前解决之后再提交。 此脚本已经使用 Python 社区最流行的代码扫描工具 Pylint 进行代码扫描。 使用方法: -bash pylint.sh +bash pylint.sh 运行之后会提示你要扫描的目录,比如输入 apps ,则会扫描 apps 下的所有 Python 代码。 在 setting/pylintrc.cfg 配置文件里面进行相关配置,扫描完成之后在 report/pylints 目录下会生成扫描报告。 代码提交需通过 git review 提交到 gerrit ,人工 Code Review 通过之后合入代码。 十三、提交代码¶ 1. 安装依赖¶ -sudo apt install git-review +sudo apt install git-review 2. 提交模板¶ 在 ~ 目录下新建文件,并命名为 gitcommit_template 将以下内容写入文件当中: -# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 -fix: - -# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 -Description: - -# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 -Log: - -# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 -#Bug: - -# 修复 github issue -#Issue: - -# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 -#Task: +# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 +fix: + +# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 +Description: + +# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 +Log: + +# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 +#Bug: + +# 修复 github issue +#Issue: + +# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 +#Task: 命令行执行: -git config --global commit.template ~/gitcommit_template +git config --global commit.template ~/gitcommit_template 此命令将模板加入到 git 的提交模板中。 后续提交的时候需要关注一下几点: @@ -3083,19 +3103,19 @@ 2. 提交模板3. 推送代码¶ 首先添加 commit 信息 -git add 后面加文件名称 +git add 后面加文件名称 -git add . # 表示添加所有文件 +git add . # 表示添加所有文件 使用这条命令注意有些临时文件不要提交到仓库了。 -git commit -a +git commit -a 之后在 fix: 后面(注意冒号后面必须加空格,不然直接-1)写本地提交的 commit 信息,然后就可以提交代码了 -git review branch(当前分支) -r origin +git review branch(当前分支) -r origin 最好一次 commit,一次 git review ,经常有同学在本地疯狂 commit 最后 git review 报错不知道咋回事儿。 若不想每次提交都加上 -r 选项,执行以下命令: -git config --global gitreview.remote origin +git config --global gitreview.remote origin 提交代码,直接使用 git review branch<目标分支>,例如 git review master 4. Git标签¶ @@ -3106,74 +3126,74 @@ 4. Git标签git tag -a <tagname> +git tag -a <tagname> 回车之后,Git 会打开你的编辑器,让你写一句标签注解,就像你给提交写注解一样。 查看所有标签 -git tag -l -# git tag 也行 +git tag -l +# git tag 也行 删除标签 -git tag -d <tagname> +git tag -d <tagname> 推送标签至远程 git push 命令并不会传送标签到远程仓库服务器上,必须显式地推送标签。 -git push origin <tagname> +git push origin <tagname> 推送所有不在远程仓库服务器上的标签 -git push origin --tag +git push origin --tag 删除远程标签 -git push origin :refs/tag/<tagname> +git push origin :refs/tag/<tagname> 后期打标签 先用 git log --pretty=oneline 查询提交记录,获取校验码。 -git tag -a <tagname> 9fceb02(校验码) +git tag -a <tagname> 9fceb02(校验码) 检出标签 -git checkout <tagname> +git checkout <tagname> 此时,仓库会处于“分离头指针(detached HEAD)”的状态。 在“分离头指针”状态下,如果你做了某些更改然后提交它们,标签不会发生变化, 但你的新提交将不属于任何分支,并且将无法访问,除非通过确切的提交哈希才能访问。 因此,如果你需要进行更改,比如你要修复旧版本中的错误,那么通常需要创建一个新分支: -git checkout -b <NewBranchName> <tagname> +git checkout -b <NewBranchName> <tagname> 新分支上可以进行提交代码。 十四、常见问题¶ 1. 提交代码时提示邮箱或者名称不对¶ 重新配置邮箱或者名称,然后重置生效: -git commit --amend --reset-author +git commit --amend --reset-author 2. 怎么回滚到之前的版本¶ (1)查询历史提交记录 -git log +git log 找到你要回滚的版本,复制 hash 值。 注意:是 commit 空格之后的 hash 值,之前有同学复制的 Change-Id: 这样肯定报错。 (2)回滚版本,不清除代码 -git reset --soft ${hash} +git reset --soft ${hash} (3)回滚版本,清除代码,慎用哈 -git reset --hard ${hash} +git reset --hard ${hash} 3. 测试报告里面 F S . E 是什么意思¶ F 表示失败,. (点)表示通过,S 表示跳过,E 表示 error 有报错 4. 解决 git status 中文显示的问题¶ -git config --global core.quotePath false +git config --global core.quotePath false 5. apps 目录下颜色有些是黄色的¶ 在 Pycharm 中 apps 目录下应用库文件是黄色的,编辑器识别不到代码新增和修改; @@ -3184,22 +3204,22 @@ 5. apps 目录下颜色有些是黄色的6. 执行 env.sh 报错 $'\r':未找到命令¶ 出现这个问题你应该是在 windows 上打开或编辑过 env.sh 脚本,windows下的换行是回车符+换行符,也就是\r\n,而 Linxu 下是换行符 \n,Linux 下不识别 \r,因此报错。 解决方案: -# 将 \r 替换为空 -sudo sed -i 's/\r//' env.sh +# 将 \r 替换为空 +sudo sed -i 's/\r//' env.sh 7.怎样为单独某一条用例配置执行超时时间¶ 在用例脚本中添加装饰器,如下: -@pytest.mark.timeout(300) # 单位秒 -def test_xxx_001(): - pass +@pytest.mark.timeout(300) # 单位秒 +def test_xxx_001(): + pass 8. 如何拉取 YouQu 自动化项目所有代码,包含子仓库¶ 前置条件:已申请访问 YouQu 权限群组 -# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) -git config --global credential.helper store - -# 拉取YouQu框架代码,并递归拉取子仓库代码 -git clone "http://gerrit.uniontech.com/youqu" --recursive +# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) +git config --global credential.helper store + +# 拉取YouQu框架代码,并递归拉取子仓库代码 +git clone "http://gerrit.uniontech.com/youqu" --recursive 9. 如何拉取 YouQu 自动化项目中指定子仓库的代码¶ 前置条件: @@ -3207,22 +3227,22 @@ 9. 如何拉取 YouQu 自动化项目中指定子仓库的代 已申请访问 YouQu 权限群组 已存储访问密码 -# 拉取YouQu框架代码 -git clone "http://gerrit.uniontech.com/youqu" - -# 指定拉取子仓库代码 -cd youqu -git submodule update --init apps/autotest_xxx_xxx +# 拉取YouQu框架代码 +git clone "http://gerrit.uniontech.com/youqu" + +# 指定拉取子仓库代码 +cd youqu +git submodule update --init apps/autotest_xxx_xxx 10. 如何更新 YouQu 自动化项目中,所有子仓库的代码¶ 更新所有子仓库代码 -cd youqu -git pull & git submodule foreach git pull +cd youqu +git pull & git submodule foreach git pull 11. 如何修复 YouQu 所有子仓库 master 分支游离头(detached head)¶ 修复所有子仓库默认master 分支游离头 -cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
/report + ├── allure # allure报告 + │ ├── ... + │ └── ffb324f3-2199-4eea-8a6f-2d7e77ce1718-container.json + ├── allure_html # 生成的html报告 + │ ├── ... + │ └── index.html + ├── allure_back # allure报告备份 + │ └── 20221108114823 + │ ├── ... + │ └── f8cab367-71f6-44aa-8810-b2ae5ab1d3a5-container.json + ├── json # json报告 + │ ├── ... + │ └── result_deepin-music_20221109134736_1081333.json + ├── logs # 日志文件 + │ ├── 2022-11-10_debug.log + │ └── 2022-11-10_error.log + ├── record # 录屏 + │ └── 2022-11-09 + │ ├── ... + │ └── 15时14分09秒_test_music_303_2_autotest.mp4 + └── xml # xml报告 + └── autotest_deepin_music-20221109134736.xml
默认情况下同时生成 html、xml、json三种形式的报告。
allure open report/allure_html +allure open report/allure_html 使用 manage.py 执行完之后,在终端的最后一行,我们会给你输出打开报告的命令,直接复制它在终端执行就可以查看了,像这样: - 终端执行命令: allure open /tmp/youqu/report/allure_html 查看报告 + 终端执行命令: allure open /tmp/youqu/report/allure_html 查看报告 你也可以直接在 Pycharm 里面找到 index.html 文件,然后右键选择浏览器打开,或者你可以用一个 http 服务打开。 你也可以直接在 report/allure 目录下查看报告: - allure serve report/allure + allure serve report/allure 远程执行 @@ -3031,48 +3051,48 @@ 1. 提前解决代码问题这里推荐一个 Python 社区流行的代码格式化工具: Black,号称不妥协的代码格式化工具,它检测到不符合规范的代码风格直接就帮你全部格式化好,就是这么刚! 安装: -sudo pip3 install black +sudo pip3 install black 使用方法: -black ${CheckPath} +black ${CheckPath} 使用这个工具格式化之后,代码会被自动调整,刚开始你可能会觉得调整得很夸张,没关系坚持看,习惯之后,你会觉得很优雅,没错,这就是 Pythonic Code 的核心,请保持优雅~。 2. 代码扫描工具¶ 使用根目录下 pylint.sh 扫描代码,在 report 目录下查看代码扫描报告,如果有代码问题请提前解决之后再提交。 此脚本已经使用 Python 社区最流行的代码扫描工具 Pylint 进行代码扫描。 使用方法: -bash pylint.sh +bash pylint.sh 运行之后会提示你要扫描的目录,比如输入 apps ,则会扫描 apps 下的所有 Python 代码。 在 setting/pylintrc.cfg 配置文件里面进行相关配置,扫描完成之后在 report/pylints 目录下会生成扫描报告。 代码提交需通过 git review 提交到 gerrit ,人工 Code Review 通过之后合入代码。 十三、提交代码¶ 1. 安装依赖¶ -sudo apt install git-review +sudo apt install git-review 2. 提交模板¶ 在 ~ 目录下新建文件,并命名为 gitcommit_template 将以下内容写入文件当中: -# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 -fix: - -# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 -Description: - -# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 -Log: - -# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 -#Bug: - -# 修复 github issue -#Issue: - -# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 -#Task: +# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 +fix: + +# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 +Description: + +# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 +Log: + +# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 +#Bug: + +# 修复 github issue +#Issue: + +# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 +#Task: 命令行执行: -git config --global commit.template ~/gitcommit_template +git config --global commit.template ~/gitcommit_template 此命令将模板加入到 git 的提交模板中。 后续提交的时候需要关注一下几点: @@ -3083,19 +3103,19 @@ 2. 提交模板3. 推送代码¶ 首先添加 commit 信息 -git add 后面加文件名称 +git add 后面加文件名称 -git add . # 表示添加所有文件 +git add . # 表示添加所有文件 使用这条命令注意有些临时文件不要提交到仓库了。 -git commit -a +git commit -a 之后在 fix: 后面(注意冒号后面必须加空格,不然直接-1)写本地提交的 commit 信息,然后就可以提交代码了 -git review branch(当前分支) -r origin +git review branch(当前分支) -r origin 最好一次 commit,一次 git review ,经常有同学在本地疯狂 commit 最后 git review 报错不知道咋回事儿。 若不想每次提交都加上 -r 选项,执行以下命令: -git config --global gitreview.remote origin +git config --global gitreview.remote origin 提交代码,直接使用 git review branch<目标分支>,例如 git review master 4. Git标签¶ @@ -3106,74 +3126,74 @@ 4. Git标签git tag -a <tagname> +git tag -a <tagname> 回车之后,Git 会打开你的编辑器,让你写一句标签注解,就像你给提交写注解一样。 查看所有标签 -git tag -l -# git tag 也行 +git tag -l +# git tag 也行 删除标签 -git tag -d <tagname> +git tag -d <tagname> 推送标签至远程 git push 命令并不会传送标签到远程仓库服务器上,必须显式地推送标签。 -git push origin <tagname> +git push origin <tagname> 推送所有不在远程仓库服务器上的标签 -git push origin --tag +git push origin --tag 删除远程标签 -git push origin :refs/tag/<tagname> +git push origin :refs/tag/<tagname> 后期打标签 先用 git log --pretty=oneline 查询提交记录,获取校验码。 -git tag -a <tagname> 9fceb02(校验码) +git tag -a <tagname> 9fceb02(校验码) 检出标签 -git checkout <tagname> +git checkout <tagname> 此时,仓库会处于“分离头指针(detached HEAD)”的状态。 在“分离头指针”状态下,如果你做了某些更改然后提交它们,标签不会发生变化, 但你的新提交将不属于任何分支,并且将无法访问,除非通过确切的提交哈希才能访问。 因此,如果你需要进行更改,比如你要修复旧版本中的错误,那么通常需要创建一个新分支: -git checkout -b <NewBranchName> <tagname> +git checkout -b <NewBranchName> <tagname> 新分支上可以进行提交代码。 十四、常见问题¶ 1. 提交代码时提示邮箱或者名称不对¶ 重新配置邮箱或者名称,然后重置生效: -git commit --amend --reset-author +git commit --amend --reset-author 2. 怎么回滚到之前的版本¶ (1)查询历史提交记录 -git log +git log 找到你要回滚的版本,复制 hash 值。 注意:是 commit 空格之后的 hash 值,之前有同学复制的 Change-Id: 这样肯定报错。 (2)回滚版本,不清除代码 -git reset --soft ${hash} +git reset --soft ${hash} (3)回滚版本,清除代码,慎用哈 -git reset --hard ${hash} +git reset --hard ${hash} 3. 测试报告里面 F S . E 是什么意思¶ F 表示失败,. (点)表示通过,S 表示跳过,E 表示 error 有报错 4. 解决 git status 中文显示的问题¶ -git config --global core.quotePath false +git config --global core.quotePath false 5. apps 目录下颜色有些是黄色的¶ 在 Pycharm 中 apps 目录下应用库文件是黄色的,编辑器识别不到代码新增和修改; @@ -3184,22 +3204,22 @@ 5. apps 目录下颜色有些是黄色的6. 执行 env.sh 报错 $'\r':未找到命令¶ 出现这个问题你应该是在 windows 上打开或编辑过 env.sh 脚本,windows下的换行是回车符+换行符,也就是\r\n,而 Linxu 下是换行符 \n,Linux 下不识别 \r,因此报错。 解决方案: -# 将 \r 替换为空 -sudo sed -i 's/\r//' env.sh +# 将 \r 替换为空 +sudo sed -i 's/\r//' env.sh 7.怎样为单独某一条用例配置执行超时时间¶ 在用例脚本中添加装饰器,如下: -@pytest.mark.timeout(300) # 单位秒 -def test_xxx_001(): - pass +@pytest.mark.timeout(300) # 单位秒 +def test_xxx_001(): + pass 8. 如何拉取 YouQu 自动化项目所有代码,包含子仓库¶ 前置条件:已申请访问 YouQu 权限群组 -# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) -git config --global credential.helper store - -# 拉取YouQu框架代码,并递归拉取子仓库代码 -git clone "http://gerrit.uniontech.com/youqu" --recursive +# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) +git config --global credential.helper store + +# 拉取YouQu框架代码,并递归拉取子仓库代码 +git clone "http://gerrit.uniontech.com/youqu" --recursive 9. 如何拉取 YouQu 自动化项目中指定子仓库的代码¶ 前置条件: @@ -3207,22 +3227,22 @@ 9. 如何拉取 YouQu 自动化项目中指定子仓库的代 已申请访问 YouQu 权限群组 已存储访问密码 -# 拉取YouQu框架代码 -git clone "http://gerrit.uniontech.com/youqu" - -# 指定拉取子仓库代码 -cd youqu -git submodule update --init apps/autotest_xxx_xxx +# 拉取YouQu框架代码 +git clone "http://gerrit.uniontech.com/youqu" + +# 指定拉取子仓库代码 +cd youqu +git submodule update --init apps/autotest_xxx_xxx 10. 如何更新 YouQu 自动化项目中,所有子仓库的代码¶ 更新所有子仓库代码 -cd youqu -git pull & git submodule foreach git pull +cd youqu +git pull & git submodule foreach git pull 11. 如何修复 YouQu 所有子仓库 master 分支游离头(detached head)¶ 修复所有子仓库默认master 分支游离头 -cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
allure open report/allure_html
使用 manage.py 执行完之后,在终端的最后一行,我们会给你输出打开报告的命令,直接复制它在终端执行就可以查看了,像这样:
终端执行命令: allure open /tmp/youqu/report/allure_html 查看报告 + 终端执行命令: allure open /tmp/youqu/report/allure_html 查看报告 你也可以直接在 Pycharm 里面找到 index.html 文件,然后右键选择浏览器打开,或者你可以用一个 http 服务打开。 你也可以直接在 report/allure 目录下查看报告: - allure serve report/allure + allure serve report/allure 远程执行 @@ -3031,48 +3051,48 @@ 1. 提前解决代码问题这里推荐一个 Python 社区流行的代码格式化工具: Black,号称不妥协的代码格式化工具,它检测到不符合规范的代码风格直接就帮你全部格式化好,就是这么刚! 安装: -sudo pip3 install black +sudo pip3 install black 使用方法: -black ${CheckPath} +black ${CheckPath} 使用这个工具格式化之后,代码会被自动调整,刚开始你可能会觉得调整得很夸张,没关系坚持看,习惯之后,你会觉得很优雅,没错,这就是 Pythonic Code 的核心,请保持优雅~。 2. 代码扫描工具¶ 使用根目录下 pylint.sh 扫描代码,在 report 目录下查看代码扫描报告,如果有代码问题请提前解决之后再提交。 此脚本已经使用 Python 社区最流行的代码扫描工具 Pylint 进行代码扫描。 使用方法: -bash pylint.sh +bash pylint.sh 运行之后会提示你要扫描的目录,比如输入 apps ,则会扫描 apps 下的所有 Python 代码。 在 setting/pylintrc.cfg 配置文件里面进行相关配置,扫描完成之后在 report/pylints 目录下会生成扫描报告。 代码提交需通过 git review 提交到 gerrit ,人工 Code Review 通过之后合入代码。 十三、提交代码¶ 1. 安装依赖¶ -sudo apt install git-review +sudo apt install git-review 2. 提交模板¶ 在 ~ 目录下新建文件,并命名为 gitcommit_template 将以下内容写入文件当中: -# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 -fix: - -# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 -Description: - -# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 -Log: - -# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 -#Bug: - -# 修复 github issue -#Issue: - -# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 -#Task: +# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 +fix: + +# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 +Description: + +# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 +Log: + +# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 +#Bug: + +# 修复 github issue +#Issue: + +# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 +#Task: 命令行执行: -git config --global commit.template ~/gitcommit_template +git config --global commit.template ~/gitcommit_template 此命令将模板加入到 git 的提交模板中。 后续提交的时候需要关注一下几点: @@ -3083,19 +3103,19 @@ 2. 提交模板3. 推送代码¶ 首先添加 commit 信息 -git add 后面加文件名称 +git add 后面加文件名称 -git add . # 表示添加所有文件 +git add . # 表示添加所有文件 使用这条命令注意有些临时文件不要提交到仓库了。 -git commit -a +git commit -a 之后在 fix: 后面(注意冒号后面必须加空格,不然直接-1)写本地提交的 commit 信息,然后就可以提交代码了 -git review branch(当前分支) -r origin +git review branch(当前分支) -r origin 最好一次 commit,一次 git review ,经常有同学在本地疯狂 commit 最后 git review 报错不知道咋回事儿。 若不想每次提交都加上 -r 选项,执行以下命令: -git config --global gitreview.remote origin +git config --global gitreview.remote origin 提交代码,直接使用 git review branch<目标分支>,例如 git review master 4. Git标签¶ @@ -3106,74 +3126,74 @@ 4. Git标签git tag -a <tagname> +git tag -a <tagname> 回车之后,Git 会打开你的编辑器,让你写一句标签注解,就像你给提交写注解一样。 查看所有标签 -git tag -l -# git tag 也行 +git tag -l +# git tag 也行 删除标签 -git tag -d <tagname> +git tag -d <tagname> 推送标签至远程 git push 命令并不会传送标签到远程仓库服务器上,必须显式地推送标签。 -git push origin <tagname> +git push origin <tagname> 推送所有不在远程仓库服务器上的标签 -git push origin --tag +git push origin --tag 删除远程标签 -git push origin :refs/tag/<tagname> +git push origin :refs/tag/<tagname> 后期打标签 先用 git log --pretty=oneline 查询提交记录,获取校验码。 -git tag -a <tagname> 9fceb02(校验码) +git tag -a <tagname> 9fceb02(校验码) 检出标签 -git checkout <tagname> +git checkout <tagname> 此时,仓库会处于“分离头指针(detached HEAD)”的状态。 在“分离头指针”状态下,如果你做了某些更改然后提交它们,标签不会发生变化, 但你的新提交将不属于任何分支,并且将无法访问,除非通过确切的提交哈希才能访问。 因此,如果你需要进行更改,比如你要修复旧版本中的错误,那么通常需要创建一个新分支: -git checkout -b <NewBranchName> <tagname> +git checkout -b <NewBranchName> <tagname> 新分支上可以进行提交代码。 十四、常见问题¶ 1. 提交代码时提示邮箱或者名称不对¶ 重新配置邮箱或者名称,然后重置生效: -git commit --amend --reset-author +git commit --amend --reset-author 2. 怎么回滚到之前的版本¶ (1)查询历史提交记录 -git log +git log 找到你要回滚的版本,复制 hash 值。 注意:是 commit 空格之后的 hash 值,之前有同学复制的 Change-Id: 这样肯定报错。 (2)回滚版本,不清除代码 -git reset --soft ${hash} +git reset --soft ${hash} (3)回滚版本,清除代码,慎用哈 -git reset --hard ${hash} +git reset --hard ${hash} 3. 测试报告里面 F S . E 是什么意思¶ F 表示失败,. (点)表示通过,S 表示跳过,E 表示 error 有报错 4. 解决 git status 中文显示的问题¶ -git config --global core.quotePath false +git config --global core.quotePath false 5. apps 目录下颜色有些是黄色的¶ 在 Pycharm 中 apps 目录下应用库文件是黄色的,编辑器识别不到代码新增和修改; @@ -3184,22 +3204,22 @@ 5. apps 目录下颜色有些是黄色的6. 执行 env.sh 报错 $'\r':未找到命令¶ 出现这个问题你应该是在 windows 上打开或编辑过 env.sh 脚本,windows下的换行是回车符+换行符,也就是\r\n,而 Linxu 下是换行符 \n,Linux 下不识别 \r,因此报错。 解决方案: -# 将 \r 替换为空 -sudo sed -i 's/\r//' env.sh +# 将 \r 替换为空 +sudo sed -i 's/\r//' env.sh 7.怎样为单独某一条用例配置执行超时时间¶ 在用例脚本中添加装饰器,如下: -@pytest.mark.timeout(300) # 单位秒 -def test_xxx_001(): - pass +@pytest.mark.timeout(300) # 单位秒 +def test_xxx_001(): + pass 8. 如何拉取 YouQu 自动化项目所有代码,包含子仓库¶ 前置条件:已申请访问 YouQu 权限群组 -# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) -git config --global credential.helper store - -# 拉取YouQu框架代码,并递归拉取子仓库代码 -git clone "http://gerrit.uniontech.com/youqu" --recursive +# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) +git config --global credential.helper store + +# 拉取YouQu框架代码,并递归拉取子仓库代码 +git clone "http://gerrit.uniontech.com/youqu" --recursive 9. 如何拉取 YouQu 自动化项目中指定子仓库的代码¶ 前置条件: @@ -3207,22 +3227,22 @@ 9. 如何拉取 YouQu 自动化项目中指定子仓库的代 已申请访问 YouQu 权限群组 已存储访问密码 -# 拉取YouQu框架代码 -git clone "http://gerrit.uniontech.com/youqu" - -# 指定拉取子仓库代码 -cd youqu -git submodule update --init apps/autotest_xxx_xxx +# 拉取YouQu框架代码 +git clone "http://gerrit.uniontech.com/youqu" + +# 指定拉取子仓库代码 +cd youqu +git submodule update --init apps/autotest_xxx_xxx 10. 如何更新 YouQu 自动化项目中,所有子仓库的代码¶ 更新所有子仓库代码 -cd youqu -git pull & git submodule foreach git pull +cd youqu +git pull & git submodule foreach git pull 11. 如何修复 YouQu 所有子仓库 master 分支游离头(detached head)¶ 修复所有子仓库默认master 分支游离头 -cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
终端执行命令: allure open /tmp/youqu/report/allure_html 查看报告
你也可以直接在 Pycharm 里面找到 index.html 文件,然后右键选择浏览器打开,或者你可以用一个 http 服务打开。
你也可以直接在 report/allure 目录下查看报告:
allure serve report/allure + allure serve report/allure 远程执行 @@ -3031,48 +3051,48 @@ 1. 提前解决代码问题这里推荐一个 Python 社区流行的代码格式化工具: Black,号称不妥协的代码格式化工具,它检测到不符合规范的代码风格直接就帮你全部格式化好,就是这么刚! 安装: -sudo pip3 install black +sudo pip3 install black 使用方法: -black ${CheckPath} +black ${CheckPath} 使用这个工具格式化之后,代码会被自动调整,刚开始你可能会觉得调整得很夸张,没关系坚持看,习惯之后,你会觉得很优雅,没错,这就是 Pythonic Code 的核心,请保持优雅~。 2. 代码扫描工具¶ 使用根目录下 pylint.sh 扫描代码,在 report 目录下查看代码扫描报告,如果有代码问题请提前解决之后再提交。 此脚本已经使用 Python 社区最流行的代码扫描工具 Pylint 进行代码扫描。 使用方法: -bash pylint.sh +bash pylint.sh 运行之后会提示你要扫描的目录,比如输入 apps ,则会扫描 apps 下的所有 Python 代码。 在 setting/pylintrc.cfg 配置文件里面进行相关配置,扫描完成之后在 report/pylints 目录下会生成扫描报告。 代码提交需通过 git review 提交到 gerrit ,人工 Code Review 通过之后合入代码。 十三、提交代码¶ 1. 安装依赖¶ -sudo apt install git-review +sudo apt install git-review 2. 提交模板¶ 在 ~ 目录下新建文件,并命名为 gitcommit_template 将以下内容写入文件当中: -# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 -fix: - -# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 -Description: - -# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 -Log: - -# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 -#Bug: - -# 修复 github issue -#Issue: - -# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 -#Task: +# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 +fix: + +# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 +Description: + +# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 +Log: + +# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 +#Bug: + +# 修复 github issue +#Issue: + +# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 +#Task: 命令行执行: -git config --global commit.template ~/gitcommit_template +git config --global commit.template ~/gitcommit_template 此命令将模板加入到 git 的提交模板中。 后续提交的时候需要关注一下几点: @@ -3083,19 +3103,19 @@ 2. 提交模板3. 推送代码¶ 首先添加 commit 信息 -git add 后面加文件名称 +git add 后面加文件名称 -git add . # 表示添加所有文件 +git add . # 表示添加所有文件 使用这条命令注意有些临时文件不要提交到仓库了。 -git commit -a +git commit -a 之后在 fix: 后面(注意冒号后面必须加空格,不然直接-1)写本地提交的 commit 信息,然后就可以提交代码了 -git review branch(当前分支) -r origin +git review branch(当前分支) -r origin 最好一次 commit,一次 git review ,经常有同学在本地疯狂 commit 最后 git review 报错不知道咋回事儿。 若不想每次提交都加上 -r 选项,执行以下命令: -git config --global gitreview.remote origin +git config --global gitreview.remote origin 提交代码,直接使用 git review branch<目标分支>,例如 git review master 4. Git标签¶ @@ -3106,74 +3126,74 @@ 4. Git标签git tag -a <tagname> +git tag -a <tagname> 回车之后,Git 会打开你的编辑器,让你写一句标签注解,就像你给提交写注解一样。 查看所有标签 -git tag -l -# git tag 也行 +git tag -l +# git tag 也行 删除标签 -git tag -d <tagname> +git tag -d <tagname> 推送标签至远程 git push 命令并不会传送标签到远程仓库服务器上,必须显式地推送标签。 -git push origin <tagname> +git push origin <tagname> 推送所有不在远程仓库服务器上的标签 -git push origin --tag +git push origin --tag 删除远程标签 -git push origin :refs/tag/<tagname> +git push origin :refs/tag/<tagname> 后期打标签 先用 git log --pretty=oneline 查询提交记录,获取校验码。 -git tag -a <tagname> 9fceb02(校验码) +git tag -a <tagname> 9fceb02(校验码) 检出标签 -git checkout <tagname> +git checkout <tagname> 此时,仓库会处于“分离头指针(detached HEAD)”的状态。 在“分离头指针”状态下,如果你做了某些更改然后提交它们,标签不会发生变化, 但你的新提交将不属于任何分支,并且将无法访问,除非通过确切的提交哈希才能访问。 因此,如果你需要进行更改,比如你要修复旧版本中的错误,那么通常需要创建一个新分支: -git checkout -b <NewBranchName> <tagname> +git checkout -b <NewBranchName> <tagname> 新分支上可以进行提交代码。 十四、常见问题¶ 1. 提交代码时提示邮箱或者名称不对¶ 重新配置邮箱或者名称,然后重置生效: -git commit --amend --reset-author +git commit --amend --reset-author 2. 怎么回滚到之前的版本¶ (1)查询历史提交记录 -git log +git log 找到你要回滚的版本,复制 hash 值。 注意:是 commit 空格之后的 hash 值,之前有同学复制的 Change-Id: 这样肯定报错。 (2)回滚版本,不清除代码 -git reset --soft ${hash} +git reset --soft ${hash} (3)回滚版本,清除代码,慎用哈 -git reset --hard ${hash} +git reset --hard ${hash} 3. 测试报告里面 F S . E 是什么意思¶ F 表示失败,. (点)表示通过,S 表示跳过,E 表示 error 有报错 4. 解决 git status 中文显示的问题¶ -git config --global core.quotePath false +git config --global core.quotePath false 5. apps 目录下颜色有些是黄色的¶ 在 Pycharm 中 apps 目录下应用库文件是黄色的,编辑器识别不到代码新增和修改; @@ -3184,22 +3204,22 @@ 5. apps 目录下颜色有些是黄色的6. 执行 env.sh 报错 $'\r':未找到命令¶ 出现这个问题你应该是在 windows 上打开或编辑过 env.sh 脚本,windows下的换行是回车符+换行符,也就是\r\n,而 Linxu 下是换行符 \n,Linux 下不识别 \r,因此报错。 解决方案: -# 将 \r 替换为空 -sudo sed -i 's/\r//' env.sh +# 将 \r 替换为空 +sudo sed -i 's/\r//' env.sh 7.怎样为单独某一条用例配置执行超时时间¶ 在用例脚本中添加装饰器,如下: -@pytest.mark.timeout(300) # 单位秒 -def test_xxx_001(): - pass +@pytest.mark.timeout(300) # 单位秒 +def test_xxx_001(): + pass 8. 如何拉取 YouQu 自动化项目所有代码,包含子仓库¶ 前置条件:已申请访问 YouQu 权限群组 -# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) -git config --global credential.helper store - -# 拉取YouQu框架代码,并递归拉取子仓库代码 -git clone "http://gerrit.uniontech.com/youqu" --recursive +# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) +git config --global credential.helper store + +# 拉取YouQu框架代码,并递归拉取子仓库代码 +git clone "http://gerrit.uniontech.com/youqu" --recursive 9. 如何拉取 YouQu 自动化项目中指定子仓库的代码¶ 前置条件: @@ -3207,22 +3227,22 @@ 9. 如何拉取 YouQu 自动化项目中指定子仓库的代 已申请访问 YouQu 权限群组 已存储访问密码 -# 拉取YouQu框架代码 -git clone "http://gerrit.uniontech.com/youqu" - -# 指定拉取子仓库代码 -cd youqu -git submodule update --init apps/autotest_xxx_xxx +# 拉取YouQu框架代码 +git clone "http://gerrit.uniontech.com/youqu" + +# 指定拉取子仓库代码 +cd youqu +git submodule update --init apps/autotest_xxx_xxx 10. 如何更新 YouQu 自动化项目中,所有子仓库的代码¶ 更新所有子仓库代码 -cd youqu -git pull & git submodule foreach git pull +cd youqu +git pull & git submodule foreach git pull 11. 如何修复 YouQu 所有子仓库 master 分支游离头(detached head)¶ 修复所有子仓库默认master 分支游离头 -cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
allure serve report/allure
Black,号称不妥协的代码格式化工具,它检测到不符合规范的代码风格直接就帮你全部格式化好,就是这么刚!
安装:
sudo pip3 install black +sudo pip3 install black 使用方法: -black ${CheckPath} +black ${CheckPath} 使用这个工具格式化之后,代码会被自动调整,刚开始你可能会觉得调整得很夸张,没关系坚持看,习惯之后,你会觉得很优雅,没错,这就是 Pythonic Code 的核心,请保持优雅~。 2. 代码扫描工具¶ 使用根目录下 pylint.sh 扫描代码,在 report 目录下查看代码扫描报告,如果有代码问题请提前解决之后再提交。 此脚本已经使用 Python 社区最流行的代码扫描工具 Pylint 进行代码扫描。 使用方法: -bash pylint.sh +bash pylint.sh 运行之后会提示你要扫描的目录,比如输入 apps ,则会扫描 apps 下的所有 Python 代码。 在 setting/pylintrc.cfg 配置文件里面进行相关配置,扫描完成之后在 report/pylints 目录下会生成扫描报告。 代码提交需通过 git review 提交到 gerrit ,人工 Code Review 通过之后合入代码。 十三、提交代码¶ 1. 安装依赖¶ -sudo apt install git-review +sudo apt install git-review 2. 提交模板¶ 在 ~ 目录下新建文件,并命名为 gitcommit_template 将以下内容写入文件当中: -# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 -fix: - -# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 -Description: - -# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 -Log: - -# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 -#Bug: - -# 修复 github issue -#Issue: - -# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 -#Task: +# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 +fix: + +# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 +Description: + +# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 +Log: + +# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 +#Bug: + +# 修复 github issue +#Issue: + +# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 +#Task: 命令行执行: -git config --global commit.template ~/gitcommit_template +git config --global commit.template ~/gitcommit_template 此命令将模板加入到 git 的提交模板中。 后续提交的时候需要关注一下几点: @@ -3083,19 +3103,19 @@ 2. 提交模板3. 推送代码¶ 首先添加 commit 信息 -git add 后面加文件名称 +git add 后面加文件名称 -git add . # 表示添加所有文件 +git add . # 表示添加所有文件 使用这条命令注意有些临时文件不要提交到仓库了。 -git commit -a +git commit -a 之后在 fix: 后面(注意冒号后面必须加空格,不然直接-1)写本地提交的 commit 信息,然后就可以提交代码了 -git review branch(当前分支) -r origin +git review branch(当前分支) -r origin 最好一次 commit,一次 git review ,经常有同学在本地疯狂 commit 最后 git review 报错不知道咋回事儿。 若不想每次提交都加上 -r 选项,执行以下命令: -git config --global gitreview.remote origin +git config --global gitreview.remote origin 提交代码,直接使用 git review branch<目标分支>,例如 git review master 4. Git标签¶ @@ -3106,74 +3126,74 @@ 4. Git标签git tag -a <tagname> +git tag -a <tagname> 回车之后,Git 会打开你的编辑器,让你写一句标签注解,就像你给提交写注解一样。 查看所有标签 -git tag -l -# git tag 也行 +git tag -l +# git tag 也行 删除标签 -git tag -d <tagname> +git tag -d <tagname> 推送标签至远程 git push 命令并不会传送标签到远程仓库服务器上,必须显式地推送标签。 -git push origin <tagname> +git push origin <tagname> 推送所有不在远程仓库服务器上的标签 -git push origin --tag +git push origin --tag 删除远程标签 -git push origin :refs/tag/<tagname> +git push origin :refs/tag/<tagname> 后期打标签 先用 git log --pretty=oneline 查询提交记录,获取校验码。 -git tag -a <tagname> 9fceb02(校验码) +git tag -a <tagname> 9fceb02(校验码) 检出标签 -git checkout <tagname> +git checkout <tagname> 此时,仓库会处于“分离头指针(detached HEAD)”的状态。 在“分离头指针”状态下,如果你做了某些更改然后提交它们,标签不会发生变化, 但你的新提交将不属于任何分支,并且将无法访问,除非通过确切的提交哈希才能访问。 因此,如果你需要进行更改,比如你要修复旧版本中的错误,那么通常需要创建一个新分支: -git checkout -b <NewBranchName> <tagname> +git checkout -b <NewBranchName> <tagname> 新分支上可以进行提交代码。 十四、常见问题¶ 1. 提交代码时提示邮箱或者名称不对¶ 重新配置邮箱或者名称,然后重置生效: -git commit --amend --reset-author +git commit --amend --reset-author 2. 怎么回滚到之前的版本¶ (1)查询历史提交记录 -git log +git log 找到你要回滚的版本,复制 hash 值。 注意:是 commit 空格之后的 hash 值,之前有同学复制的 Change-Id: 这样肯定报错。 (2)回滚版本,不清除代码 -git reset --soft ${hash} +git reset --soft ${hash} (3)回滚版本,清除代码,慎用哈 -git reset --hard ${hash} +git reset --hard ${hash} 3. 测试报告里面 F S . E 是什么意思¶ F 表示失败,. (点)表示通过,S 表示跳过,E 表示 error 有报错 4. 解决 git status 中文显示的问题¶ -git config --global core.quotePath false +git config --global core.quotePath false 5. apps 目录下颜色有些是黄色的¶ 在 Pycharm 中 apps 目录下应用库文件是黄色的,编辑器识别不到代码新增和修改; @@ -3184,22 +3204,22 @@ 5. apps 目录下颜色有些是黄色的6. 执行 env.sh 报错 $'\r':未找到命令¶ 出现这个问题你应该是在 windows 上打开或编辑过 env.sh 脚本,windows下的换行是回车符+换行符,也就是\r\n,而 Linxu 下是换行符 \n,Linux 下不识别 \r,因此报错。 解决方案: -# 将 \r 替换为空 -sudo sed -i 's/\r//' env.sh +# 将 \r 替换为空 +sudo sed -i 's/\r//' env.sh 7.怎样为单独某一条用例配置执行超时时间¶ 在用例脚本中添加装饰器,如下: -@pytest.mark.timeout(300) # 单位秒 -def test_xxx_001(): - pass +@pytest.mark.timeout(300) # 单位秒 +def test_xxx_001(): + pass 8. 如何拉取 YouQu 自动化项目所有代码,包含子仓库¶ 前置条件:已申请访问 YouQu 权限群组 -# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) -git config --global credential.helper store - -# 拉取YouQu框架代码,并递归拉取子仓库代码 -git clone "http://gerrit.uniontech.com/youqu" --recursive +# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) +git config --global credential.helper store + +# 拉取YouQu框架代码,并递归拉取子仓库代码 +git clone "http://gerrit.uniontech.com/youqu" --recursive 9. 如何拉取 YouQu 自动化项目中指定子仓库的代码¶ 前置条件: @@ -3207,22 +3227,22 @@ 9. 如何拉取 YouQu 自动化项目中指定子仓库的代 已申请访问 YouQu 权限群组 已存储访问密码 -# 拉取YouQu框架代码 -git clone "http://gerrit.uniontech.com/youqu" - -# 指定拉取子仓库代码 -cd youqu -git submodule update --init apps/autotest_xxx_xxx +# 拉取YouQu框架代码 +git clone "http://gerrit.uniontech.com/youqu" + +# 指定拉取子仓库代码 +cd youqu +git submodule update --init apps/autotest_xxx_xxx 10. 如何更新 YouQu 自动化项目中,所有子仓库的代码¶ 更新所有子仓库代码 -cd youqu -git pull & git submodule foreach git pull +cd youqu +git pull & git submodule foreach git pull 11. 如何修复 YouQu 所有子仓库 master 分支游离头(detached head)¶ 修复所有子仓库默认master 分支游离头 -cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
sudo pip3 install black
black ${CheckPath} +black ${CheckPath} 使用这个工具格式化之后,代码会被自动调整,刚开始你可能会觉得调整得很夸张,没关系坚持看,习惯之后,你会觉得很优雅,没错,这就是 Pythonic Code 的核心,请保持优雅~。 2. 代码扫描工具¶ 使用根目录下 pylint.sh 扫描代码,在 report 目录下查看代码扫描报告,如果有代码问题请提前解决之后再提交。 此脚本已经使用 Python 社区最流行的代码扫描工具 Pylint 进行代码扫描。 使用方法: -bash pylint.sh +bash pylint.sh 运行之后会提示你要扫描的目录,比如输入 apps ,则会扫描 apps 下的所有 Python 代码。 在 setting/pylintrc.cfg 配置文件里面进行相关配置,扫描完成之后在 report/pylints 目录下会生成扫描报告。 代码提交需通过 git review 提交到 gerrit ,人工 Code Review 通过之后合入代码。 十三、提交代码¶ 1. 安装依赖¶ -sudo apt install git-review +sudo apt install git-review 2. 提交模板¶ 在 ~ 目录下新建文件,并命名为 gitcommit_template 将以下内容写入文件当中: -# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 -fix: - -# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 -Description: - -# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 -Log: - -# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 -#Bug: - -# 修复 github issue -#Issue: - -# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 -#Task: +# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 +fix: + +# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 +Description: + +# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 +Log: + +# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 +#Bug: + +# 修复 github issue +#Issue: + +# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 +#Task: 命令行执行: -git config --global commit.template ~/gitcommit_template +git config --global commit.template ~/gitcommit_template 此命令将模板加入到 git 的提交模板中。 后续提交的时候需要关注一下几点: @@ -3083,19 +3103,19 @@ 2. 提交模板3. 推送代码¶ 首先添加 commit 信息 -git add 后面加文件名称 +git add 后面加文件名称 -git add . # 表示添加所有文件 +git add . # 表示添加所有文件 使用这条命令注意有些临时文件不要提交到仓库了。 -git commit -a +git commit -a 之后在 fix: 后面(注意冒号后面必须加空格,不然直接-1)写本地提交的 commit 信息,然后就可以提交代码了 -git review branch(当前分支) -r origin +git review branch(当前分支) -r origin 最好一次 commit,一次 git review ,经常有同学在本地疯狂 commit 最后 git review 报错不知道咋回事儿。 若不想每次提交都加上 -r 选项,执行以下命令: -git config --global gitreview.remote origin +git config --global gitreview.remote origin 提交代码,直接使用 git review branch<目标分支>,例如 git review master 4. Git标签¶ @@ -3106,74 +3126,74 @@ 4. Git标签git tag -a <tagname> +git tag -a <tagname> 回车之后,Git 会打开你的编辑器,让你写一句标签注解,就像你给提交写注解一样。 查看所有标签 -git tag -l -# git tag 也行 +git tag -l +# git tag 也行 删除标签 -git tag -d <tagname> +git tag -d <tagname> 推送标签至远程 git push 命令并不会传送标签到远程仓库服务器上,必须显式地推送标签。 -git push origin <tagname> +git push origin <tagname> 推送所有不在远程仓库服务器上的标签 -git push origin --tag +git push origin --tag 删除远程标签 -git push origin :refs/tag/<tagname> +git push origin :refs/tag/<tagname> 后期打标签 先用 git log --pretty=oneline 查询提交记录,获取校验码。 -git tag -a <tagname> 9fceb02(校验码) +git tag -a <tagname> 9fceb02(校验码) 检出标签 -git checkout <tagname> +git checkout <tagname> 此时,仓库会处于“分离头指针(detached HEAD)”的状态。 在“分离头指针”状态下,如果你做了某些更改然后提交它们,标签不会发生变化, 但你的新提交将不属于任何分支,并且将无法访问,除非通过确切的提交哈希才能访问。 因此,如果你需要进行更改,比如你要修复旧版本中的错误,那么通常需要创建一个新分支: -git checkout -b <NewBranchName> <tagname> +git checkout -b <NewBranchName> <tagname> 新分支上可以进行提交代码。 十四、常见问题¶ 1. 提交代码时提示邮箱或者名称不对¶ 重新配置邮箱或者名称,然后重置生效: -git commit --amend --reset-author +git commit --amend --reset-author 2. 怎么回滚到之前的版本¶ (1)查询历史提交记录 -git log +git log 找到你要回滚的版本,复制 hash 值。 注意:是 commit 空格之后的 hash 值,之前有同学复制的 Change-Id: 这样肯定报错。 (2)回滚版本,不清除代码 -git reset --soft ${hash} +git reset --soft ${hash} (3)回滚版本,清除代码,慎用哈 -git reset --hard ${hash} +git reset --hard ${hash} 3. 测试报告里面 F S . E 是什么意思¶ F 表示失败,. (点)表示通过,S 表示跳过,E 表示 error 有报错 4. 解决 git status 中文显示的问题¶ -git config --global core.quotePath false +git config --global core.quotePath false 5. apps 目录下颜色有些是黄色的¶ 在 Pycharm 中 apps 目录下应用库文件是黄色的,编辑器识别不到代码新增和修改; @@ -3184,22 +3204,22 @@ 5. apps 目录下颜色有些是黄色的6. 执行 env.sh 报错 $'\r':未找到命令¶ 出现这个问题你应该是在 windows 上打开或编辑过 env.sh 脚本,windows下的换行是回车符+换行符,也就是\r\n,而 Linxu 下是换行符 \n,Linux 下不识别 \r,因此报错。 解决方案: -# 将 \r 替换为空 -sudo sed -i 's/\r//' env.sh +# 将 \r 替换为空 +sudo sed -i 's/\r//' env.sh 7.怎样为单独某一条用例配置执行超时时间¶ 在用例脚本中添加装饰器,如下: -@pytest.mark.timeout(300) # 单位秒 -def test_xxx_001(): - pass +@pytest.mark.timeout(300) # 单位秒 +def test_xxx_001(): + pass 8. 如何拉取 YouQu 自动化项目所有代码,包含子仓库¶ 前置条件:已申请访问 YouQu 权限群组 -# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) -git config --global credential.helper store - -# 拉取YouQu框架代码,并递归拉取子仓库代码 -git clone "http://gerrit.uniontech.com/youqu" --recursive +# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) +git config --global credential.helper store + +# 拉取YouQu框架代码,并递归拉取子仓库代码 +git clone "http://gerrit.uniontech.com/youqu" --recursive 9. 如何拉取 YouQu 自动化项目中指定子仓库的代码¶ 前置条件: @@ -3207,22 +3227,22 @@ 9. 如何拉取 YouQu 自动化项目中指定子仓库的代 已申请访问 YouQu 权限群组 已存储访问密码 -# 拉取YouQu框架代码 -git clone "http://gerrit.uniontech.com/youqu" - -# 指定拉取子仓库代码 -cd youqu -git submodule update --init apps/autotest_xxx_xxx +# 拉取YouQu框架代码 +git clone "http://gerrit.uniontech.com/youqu" + +# 指定拉取子仓库代码 +cd youqu +git submodule update --init apps/autotest_xxx_xxx 10. 如何更新 YouQu 自动化项目中,所有子仓库的代码¶ 更新所有子仓库代码 -cd youqu -git pull & git submodule foreach git pull +cd youqu +git pull & git submodule foreach git pull 11. 如何修复 YouQu 所有子仓库 master 分支游离头(detached head)¶ 修复所有子仓库默认master 分支游离头 -cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
black ${CheckPath}
使用这个工具格式化之后,代码会被自动调整,刚开始你可能会觉得调整得很夸张,没关系坚持看,习惯之后,你会觉得很优雅,没错,这就是 Pythonic Code 的核心,请保持优雅~。
使用根目录下 pylint.sh 扫描代码,在 report 目录下查看代码扫描报告,如果有代码问题请提前解决之后再提交。
此脚本已经使用 Python 社区最流行的代码扫描工具 Pylint 进行代码扫描。
bash pylint.sh +bash pylint.sh 运行之后会提示你要扫描的目录,比如输入 apps ,则会扫描 apps 下的所有 Python 代码。 在 setting/pylintrc.cfg 配置文件里面进行相关配置,扫描完成之后在 report/pylints 目录下会生成扫描报告。 代码提交需通过 git review 提交到 gerrit ,人工 Code Review 通过之后合入代码。 十三、提交代码¶ 1. 安装依赖¶ -sudo apt install git-review +sudo apt install git-review 2. 提交模板¶ 在 ~ 目录下新建文件,并命名为 gitcommit_template 将以下内容写入文件当中: -# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 -fix: - -# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 -Description: - -# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 -Log: - -# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 -#Bug: - -# 修复 github issue -#Issue: - -# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 -#Task: +# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 +fix: + +# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 +Description: + +# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 +Log: + +# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 +#Bug: + +# 修复 github issue +#Issue: + +# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 +#Task: 命令行执行: -git config --global commit.template ~/gitcommit_template +git config --global commit.template ~/gitcommit_template 此命令将模板加入到 git 的提交模板中。 后续提交的时候需要关注一下几点: @@ -3083,19 +3103,19 @@ 2. 提交模板3. 推送代码¶ 首先添加 commit 信息 -git add 后面加文件名称 +git add 后面加文件名称 -git add . # 表示添加所有文件 +git add . # 表示添加所有文件 使用这条命令注意有些临时文件不要提交到仓库了。 -git commit -a +git commit -a 之后在 fix: 后面(注意冒号后面必须加空格,不然直接-1)写本地提交的 commit 信息,然后就可以提交代码了 -git review branch(当前分支) -r origin +git review branch(当前分支) -r origin 最好一次 commit,一次 git review ,经常有同学在本地疯狂 commit 最后 git review 报错不知道咋回事儿。 若不想每次提交都加上 -r 选项,执行以下命令: -git config --global gitreview.remote origin +git config --global gitreview.remote origin 提交代码,直接使用 git review branch<目标分支>,例如 git review master 4. Git标签¶ @@ -3106,74 +3126,74 @@ 4. Git标签git tag -a <tagname> +git tag -a <tagname> 回车之后,Git 会打开你的编辑器,让你写一句标签注解,就像你给提交写注解一样。 查看所有标签 -git tag -l -# git tag 也行 +git tag -l +# git tag 也行 删除标签 -git tag -d <tagname> +git tag -d <tagname> 推送标签至远程 git push 命令并不会传送标签到远程仓库服务器上,必须显式地推送标签。 -git push origin <tagname> +git push origin <tagname> 推送所有不在远程仓库服务器上的标签 -git push origin --tag +git push origin --tag 删除远程标签 -git push origin :refs/tag/<tagname> +git push origin :refs/tag/<tagname> 后期打标签 先用 git log --pretty=oneline 查询提交记录,获取校验码。 -git tag -a <tagname> 9fceb02(校验码) +git tag -a <tagname> 9fceb02(校验码) 检出标签 -git checkout <tagname> +git checkout <tagname> 此时,仓库会处于“分离头指针(detached HEAD)”的状态。 在“分离头指针”状态下,如果你做了某些更改然后提交它们,标签不会发生变化, 但你的新提交将不属于任何分支,并且将无法访问,除非通过确切的提交哈希才能访问。 因此,如果你需要进行更改,比如你要修复旧版本中的错误,那么通常需要创建一个新分支: -git checkout -b <NewBranchName> <tagname> +git checkout -b <NewBranchName> <tagname> 新分支上可以进行提交代码。 十四、常见问题¶ 1. 提交代码时提示邮箱或者名称不对¶ 重新配置邮箱或者名称,然后重置生效: -git commit --amend --reset-author +git commit --amend --reset-author 2. 怎么回滚到之前的版本¶ (1)查询历史提交记录 -git log +git log 找到你要回滚的版本,复制 hash 值。 注意:是 commit 空格之后的 hash 值,之前有同学复制的 Change-Id: 这样肯定报错。 (2)回滚版本,不清除代码 -git reset --soft ${hash} +git reset --soft ${hash} (3)回滚版本,清除代码,慎用哈 -git reset --hard ${hash} +git reset --hard ${hash} 3. 测试报告里面 F S . E 是什么意思¶ F 表示失败,. (点)表示通过,S 表示跳过,E 表示 error 有报错 4. 解决 git status 中文显示的问题¶ -git config --global core.quotePath false +git config --global core.quotePath false 5. apps 目录下颜色有些是黄色的¶ 在 Pycharm 中 apps 目录下应用库文件是黄色的,编辑器识别不到代码新增和修改; @@ -3184,22 +3204,22 @@ 5. apps 目录下颜色有些是黄色的6. 执行 env.sh 报错 $'\r':未找到命令¶ 出现这个问题你应该是在 windows 上打开或编辑过 env.sh 脚本,windows下的换行是回车符+换行符,也就是\r\n,而 Linxu 下是换行符 \n,Linux 下不识别 \r,因此报错。 解决方案: -# 将 \r 替换为空 -sudo sed -i 's/\r//' env.sh +# 将 \r 替换为空 +sudo sed -i 's/\r//' env.sh 7.怎样为单独某一条用例配置执行超时时间¶ 在用例脚本中添加装饰器,如下: -@pytest.mark.timeout(300) # 单位秒 -def test_xxx_001(): - pass +@pytest.mark.timeout(300) # 单位秒 +def test_xxx_001(): + pass 8. 如何拉取 YouQu 自动化项目所有代码,包含子仓库¶ 前置条件:已申请访问 YouQu 权限群组 -# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) -git config --global credential.helper store - -# 拉取YouQu框架代码,并递归拉取子仓库代码 -git clone "http://gerrit.uniontech.com/youqu" --recursive +# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) +git config --global credential.helper store + +# 拉取YouQu框架代码,并递归拉取子仓库代码 +git clone "http://gerrit.uniontech.com/youqu" --recursive 9. 如何拉取 YouQu 自动化项目中指定子仓库的代码¶ 前置条件: @@ -3207,22 +3227,22 @@ 9. 如何拉取 YouQu 自动化项目中指定子仓库的代 已申请访问 YouQu 权限群组 已存储访问密码 -# 拉取YouQu框架代码 -git clone "http://gerrit.uniontech.com/youqu" - -# 指定拉取子仓库代码 -cd youqu -git submodule update --init apps/autotest_xxx_xxx +# 拉取YouQu框架代码 +git clone "http://gerrit.uniontech.com/youqu" + +# 指定拉取子仓库代码 +cd youqu +git submodule update --init apps/autotest_xxx_xxx 10. 如何更新 YouQu 自动化项目中,所有子仓库的代码¶ 更新所有子仓库代码 -cd youqu -git pull & git submodule foreach git pull +cd youqu +git pull & git submodule foreach git pull 11. 如何修复 YouQu 所有子仓库 master 分支游离头(detached head)¶ 修复所有子仓库默认master 分支游离头 -cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
bash pylint.sh
运行之后会提示你要扫描的目录,比如输入 apps ,则会扫描 apps 下的所有 Python 代码。
在 setting/pylintrc.cfg 配置文件里面进行相关配置,扫描完成之后在 report/pylints 目录下会生成扫描报告。
代码提交需通过 git review 提交到 gerrit ,人工 Code Review 通过之后合入代码。
sudo apt install git-review +sudo apt install git-review 2. 提交模板¶ 在 ~ 目录下新建文件,并命名为 gitcommit_template 将以下内容写入文件当中: -# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 -fix: - -# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 -Description: - -# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 -Log: - -# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 -#Bug: - -# 修复 github issue -#Issue: - -# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 -#Task: +# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 +fix: + +# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 +Description: + +# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 +Log: + +# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 +#Bug: + +# 修复 github issue +#Issue: + +# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 +#Task: 命令行执行: -git config --global commit.template ~/gitcommit_template +git config --global commit.template ~/gitcommit_template 此命令将模板加入到 git 的提交模板中。 后续提交的时候需要关注一下几点: @@ -3083,19 +3103,19 @@ 2. 提交模板3. 推送代码¶ 首先添加 commit 信息 -git add 后面加文件名称 +git add 后面加文件名称 -git add . # 表示添加所有文件 +git add . # 表示添加所有文件 使用这条命令注意有些临时文件不要提交到仓库了。 -git commit -a +git commit -a 之后在 fix: 后面(注意冒号后面必须加空格,不然直接-1)写本地提交的 commit 信息,然后就可以提交代码了 -git review branch(当前分支) -r origin +git review branch(当前分支) -r origin 最好一次 commit,一次 git review ,经常有同学在本地疯狂 commit 最后 git review 报错不知道咋回事儿。 若不想每次提交都加上 -r 选项,执行以下命令: -git config --global gitreview.remote origin +git config --global gitreview.remote origin 提交代码,直接使用 git review branch<目标分支>,例如 git review master 4. Git标签¶ @@ -3106,74 +3126,74 @@ 4. Git标签git tag -a <tagname> +git tag -a <tagname> 回车之后,Git 会打开你的编辑器,让你写一句标签注解,就像你给提交写注解一样。 查看所有标签 -git tag -l -# git tag 也行 +git tag -l +# git tag 也行 删除标签 -git tag -d <tagname> +git tag -d <tagname> 推送标签至远程 git push 命令并不会传送标签到远程仓库服务器上,必须显式地推送标签。 -git push origin <tagname> +git push origin <tagname> 推送所有不在远程仓库服务器上的标签 -git push origin --tag +git push origin --tag 删除远程标签 -git push origin :refs/tag/<tagname> +git push origin :refs/tag/<tagname> 后期打标签 先用 git log --pretty=oneline 查询提交记录,获取校验码。 -git tag -a <tagname> 9fceb02(校验码) +git tag -a <tagname> 9fceb02(校验码) 检出标签 -git checkout <tagname> +git checkout <tagname> 此时,仓库会处于“分离头指针(detached HEAD)”的状态。 在“分离头指针”状态下,如果你做了某些更改然后提交它们,标签不会发生变化, 但你的新提交将不属于任何分支,并且将无法访问,除非通过确切的提交哈希才能访问。 因此,如果你需要进行更改,比如你要修复旧版本中的错误,那么通常需要创建一个新分支: -git checkout -b <NewBranchName> <tagname> +git checkout -b <NewBranchName> <tagname> 新分支上可以进行提交代码。 十四、常见问题¶ 1. 提交代码时提示邮箱或者名称不对¶ 重新配置邮箱或者名称,然后重置生效: -git commit --amend --reset-author +git commit --amend --reset-author 2. 怎么回滚到之前的版本¶ (1)查询历史提交记录 -git log +git log 找到你要回滚的版本,复制 hash 值。 注意:是 commit 空格之后的 hash 值,之前有同学复制的 Change-Id: 这样肯定报错。 (2)回滚版本,不清除代码 -git reset --soft ${hash} +git reset --soft ${hash} (3)回滚版本,清除代码,慎用哈 -git reset --hard ${hash} +git reset --hard ${hash} 3. 测试报告里面 F S . E 是什么意思¶ F 表示失败,. (点)表示通过,S 表示跳过,E 表示 error 有报错 4. 解决 git status 中文显示的问题¶ -git config --global core.quotePath false +git config --global core.quotePath false 5. apps 目录下颜色有些是黄色的¶ 在 Pycharm 中 apps 目录下应用库文件是黄色的,编辑器识别不到代码新增和修改; @@ -3184,22 +3204,22 @@ 5. apps 目录下颜色有些是黄色的6. 执行 env.sh 报错 $'\r':未找到命令¶ 出现这个问题你应该是在 windows 上打开或编辑过 env.sh 脚本,windows下的换行是回车符+换行符,也就是\r\n,而 Linxu 下是换行符 \n,Linux 下不识别 \r,因此报错。 解决方案: -# 将 \r 替换为空 -sudo sed -i 's/\r//' env.sh +# 将 \r 替换为空 +sudo sed -i 's/\r//' env.sh 7.怎样为单独某一条用例配置执行超时时间¶ 在用例脚本中添加装饰器,如下: -@pytest.mark.timeout(300) # 单位秒 -def test_xxx_001(): - pass +@pytest.mark.timeout(300) # 单位秒 +def test_xxx_001(): + pass 8. 如何拉取 YouQu 自动化项目所有代码,包含子仓库¶ 前置条件:已申请访问 YouQu 权限群组 -# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) -git config --global credential.helper store - -# 拉取YouQu框架代码,并递归拉取子仓库代码 -git clone "http://gerrit.uniontech.com/youqu" --recursive +# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) +git config --global credential.helper store + +# 拉取YouQu框架代码,并递归拉取子仓库代码 +git clone "http://gerrit.uniontech.com/youqu" --recursive 9. 如何拉取 YouQu 自动化项目中指定子仓库的代码¶ 前置条件: @@ -3207,22 +3227,22 @@ 9. 如何拉取 YouQu 自动化项目中指定子仓库的代 已申请访问 YouQu 权限群组 已存储访问密码 -# 拉取YouQu框架代码 -git clone "http://gerrit.uniontech.com/youqu" - -# 指定拉取子仓库代码 -cd youqu -git submodule update --init apps/autotest_xxx_xxx +# 拉取YouQu框架代码 +git clone "http://gerrit.uniontech.com/youqu" + +# 指定拉取子仓库代码 +cd youqu +git submodule update --init apps/autotest_xxx_xxx 10. 如何更新 YouQu 自动化项目中,所有子仓库的代码¶ 更新所有子仓库代码 -cd youqu -git pull & git submodule foreach git pull +cd youqu +git pull & git submodule foreach git pull 11. 如何修复 YouQu 所有子仓库 master 分支游离头(detached head)¶ 修复所有子仓库默认master 分支游离头 -cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
sudo apt install git-review
在 ~ 目录下新建文件,并命名为 gitcommit_template
将以下内容写入文件当中:
# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 -fix: - -# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 -Description: - -# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 -Log: - -# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 -#Bug: - -# 修复 github issue -#Issue: - -# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 -#Task: +# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 +fix: + +# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 +Description: + +# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 +Log: + +# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 +#Bug: + +# 修复 github issue +#Issue: + +# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 +#Task: 命令行执行: -git config --global commit.template ~/gitcommit_template +git config --global commit.template ~/gitcommit_template 此命令将模板加入到 git 的提交模板中。 后续提交的时候需要关注一下几点: @@ -3083,19 +3103,19 @@ 2. 提交模板3. 推送代码¶ 首先添加 commit 信息 -git add 后面加文件名称 +git add 后面加文件名称 -git add . # 表示添加所有文件 +git add . # 表示添加所有文件 使用这条命令注意有些临时文件不要提交到仓库了。 -git commit -a +git commit -a 之后在 fix: 后面(注意冒号后面必须加空格,不然直接-1)写本地提交的 commit 信息,然后就可以提交代码了 -git review branch(当前分支) -r origin +git review branch(当前分支) -r origin 最好一次 commit,一次 git review ,经常有同学在本地疯狂 commit 最后 git review 报错不知道咋回事儿。 若不想每次提交都加上 -r 选项,执行以下命令: -git config --global gitreview.remote origin +git config --global gitreview.remote origin 提交代码,直接使用 git review branch<目标分支>,例如 git review master 4. Git标签¶ @@ -3106,74 +3126,74 @@ 4. Git标签git tag -a <tagname> +git tag -a <tagname> 回车之后,Git 会打开你的编辑器,让你写一句标签注解,就像你给提交写注解一样。 查看所有标签 -git tag -l -# git tag 也行 +git tag -l +# git tag 也行 删除标签 -git tag -d <tagname> +git tag -d <tagname> 推送标签至远程 git push 命令并不会传送标签到远程仓库服务器上,必须显式地推送标签。 -git push origin <tagname> +git push origin <tagname> 推送所有不在远程仓库服务器上的标签 -git push origin --tag +git push origin --tag 删除远程标签 -git push origin :refs/tag/<tagname> +git push origin :refs/tag/<tagname> 后期打标签 先用 git log --pretty=oneline 查询提交记录,获取校验码。 -git tag -a <tagname> 9fceb02(校验码) +git tag -a <tagname> 9fceb02(校验码) 检出标签 -git checkout <tagname> +git checkout <tagname> 此时,仓库会处于“分离头指针(detached HEAD)”的状态。 在“分离头指针”状态下,如果你做了某些更改然后提交它们,标签不会发生变化, 但你的新提交将不属于任何分支,并且将无法访问,除非通过确切的提交哈希才能访问。 因此,如果你需要进行更改,比如你要修复旧版本中的错误,那么通常需要创建一个新分支: -git checkout -b <NewBranchName> <tagname> +git checkout -b <NewBranchName> <tagname> 新分支上可以进行提交代码。 十四、常见问题¶ 1. 提交代码时提示邮箱或者名称不对¶ 重新配置邮箱或者名称,然后重置生效: -git commit --amend --reset-author +git commit --amend --reset-author 2. 怎么回滚到之前的版本¶ (1)查询历史提交记录 -git log +git log 找到你要回滚的版本,复制 hash 值。 注意:是 commit 空格之后的 hash 值,之前有同学复制的 Change-Id: 这样肯定报错。 (2)回滚版本,不清除代码 -git reset --soft ${hash} +git reset --soft ${hash} (3)回滚版本,清除代码,慎用哈 -git reset --hard ${hash} +git reset --hard ${hash} 3. 测试报告里面 F S . E 是什么意思¶ F 表示失败,. (点)表示通过,S 表示跳过,E 表示 error 有报错 4. 解决 git status 中文显示的问题¶ -git config --global core.quotePath false +git config --global core.quotePath false 5. apps 目录下颜色有些是黄色的¶ 在 Pycharm 中 apps 目录下应用库文件是黄色的,编辑器识别不到代码新增和修改; @@ -3184,22 +3204,22 @@ 5. apps 目录下颜色有些是黄色的6. 执行 env.sh 报错 $'\r':未找到命令¶ 出现这个问题你应该是在 windows 上打开或编辑过 env.sh 脚本,windows下的换行是回车符+换行符,也就是\r\n,而 Linxu 下是换行符 \n,Linux 下不识别 \r,因此报错。 解决方案: -# 将 \r 替换为空 -sudo sed -i 's/\r//' env.sh +# 将 \r 替换为空 +sudo sed -i 's/\r//' env.sh 7.怎样为单独某一条用例配置执行超时时间¶ 在用例脚本中添加装饰器,如下: -@pytest.mark.timeout(300) # 单位秒 -def test_xxx_001(): - pass +@pytest.mark.timeout(300) # 单位秒 +def test_xxx_001(): + pass 8. 如何拉取 YouQu 自动化项目所有代码,包含子仓库¶ 前置条件:已申请访问 YouQu 权限群组 -# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) -git config --global credential.helper store - -# 拉取YouQu框架代码,并递归拉取子仓库代码 -git clone "http://gerrit.uniontech.com/youqu" --recursive +# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) +git config --global credential.helper store + +# 拉取YouQu框架代码,并递归拉取子仓库代码 +git clone "http://gerrit.uniontech.com/youqu" --recursive 9. 如何拉取 YouQu 自动化项目中指定子仓库的代码¶ 前置条件: @@ -3207,22 +3227,22 @@ 9. 如何拉取 YouQu 自动化项目中指定子仓库的代 已申请访问 YouQu 权限群组 已存储访问密码 -# 拉取YouQu框架代码 -git clone "http://gerrit.uniontech.com/youqu" - -# 指定拉取子仓库代码 -cd youqu -git submodule update --init apps/autotest_xxx_xxx +# 拉取YouQu框架代码 +git clone "http://gerrit.uniontech.com/youqu" + +# 指定拉取子仓库代码 +cd youqu +git submodule update --init apps/autotest_xxx_xxx 10. 如何更新 YouQu 自动化项目中,所有子仓库的代码¶ 更新所有子仓库代码 -cd youqu -git pull & git submodule foreach git pull +cd youqu +git pull & git submodule foreach git pull 11. 如何修复 YouQu 所有子仓库 master 分支游离头(detached head)¶ 修复所有子仓库默认master 分支游离头 -cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
# commit type :fix(问题修复)、feat(功能开发)、style(风格修改)、refactor(重构)、docs(文档)、chore(其他)、test(测试) + 简单描述. 默认fix,根据情况修改 +fix: + +# 详细说明代码的改动,包含代码的实现思路,以及为什么这么做,可能会影响哪些功能。对于代码的审核者,需要从这段描述中能完全理解代码中所有改动的内容 +Description: + +# 写一段面向于产品的总结性内容,用于自动生成crp上的changlog,需要注意的事,这段描述必须从产品的角度考虑。 +Log: + +# 关联pms上的bug号,提交后,则会自动在pms对应bug信息页面添加备注,关联本次提交。若本次提交为修复bug相关,则请取消注释 +#Bug: + +# 修复 github issue +#Issue: + +# 关联pms上的任务号,提交后,则会自动在pms对应任务信息页面添加备注,关联本次提交。若本次提交为任务相关,则请取消注释 +#Task:
命令行执行:
git config --global commit.template ~/gitcommit_template +git config --global commit.template ~/gitcommit_template 此命令将模板加入到 git 的提交模板中。 后续提交的时候需要关注一下几点: @@ -3083,19 +3103,19 @@ 2. 提交模板3. 推送代码¶ 首先添加 commit 信息 -git add 后面加文件名称 +git add 后面加文件名称 -git add . # 表示添加所有文件 +git add . # 表示添加所有文件 使用这条命令注意有些临时文件不要提交到仓库了。 -git commit -a +git commit -a 之后在 fix: 后面(注意冒号后面必须加空格,不然直接-1)写本地提交的 commit 信息,然后就可以提交代码了 -git review branch(当前分支) -r origin +git review branch(当前分支) -r origin 最好一次 commit,一次 git review ,经常有同学在本地疯狂 commit 最后 git review 报错不知道咋回事儿。 若不想每次提交都加上 -r 选项,执行以下命令: -git config --global gitreview.remote origin +git config --global gitreview.remote origin 提交代码,直接使用 git review branch<目标分支>,例如 git review master 4. Git标签¶ @@ -3106,74 +3126,74 @@ 4. Git标签git tag -a <tagname> +git tag -a <tagname> 回车之后,Git 会打开你的编辑器,让你写一句标签注解,就像你给提交写注解一样。 查看所有标签 -git tag -l -# git tag 也行 +git tag -l +# git tag 也行 删除标签 -git tag -d <tagname> +git tag -d <tagname> 推送标签至远程 git push 命令并不会传送标签到远程仓库服务器上,必须显式地推送标签。 -git push origin <tagname> +git push origin <tagname> 推送所有不在远程仓库服务器上的标签 -git push origin --tag +git push origin --tag 删除远程标签 -git push origin :refs/tag/<tagname> +git push origin :refs/tag/<tagname> 后期打标签 先用 git log --pretty=oneline 查询提交记录,获取校验码。 -git tag -a <tagname> 9fceb02(校验码) +git tag -a <tagname> 9fceb02(校验码) 检出标签 -git checkout <tagname> +git checkout <tagname> 此时,仓库会处于“分离头指针(detached HEAD)”的状态。 在“分离头指针”状态下,如果你做了某些更改然后提交它们,标签不会发生变化, 但你的新提交将不属于任何分支,并且将无法访问,除非通过确切的提交哈希才能访问。 因此,如果你需要进行更改,比如你要修复旧版本中的错误,那么通常需要创建一个新分支: -git checkout -b <NewBranchName> <tagname> +git checkout -b <NewBranchName> <tagname> 新分支上可以进行提交代码。 十四、常见问题¶ 1. 提交代码时提示邮箱或者名称不对¶ 重新配置邮箱或者名称,然后重置生效: -git commit --amend --reset-author +git commit --amend --reset-author 2. 怎么回滚到之前的版本¶ (1)查询历史提交记录 -git log +git log 找到你要回滚的版本,复制 hash 值。 注意:是 commit 空格之后的 hash 值,之前有同学复制的 Change-Id: 这样肯定报错。 (2)回滚版本,不清除代码 -git reset --soft ${hash} +git reset --soft ${hash} (3)回滚版本,清除代码,慎用哈 -git reset --hard ${hash} +git reset --hard ${hash} 3. 测试报告里面 F S . E 是什么意思¶ F 表示失败,. (点)表示通过,S 表示跳过,E 表示 error 有报错 4. 解决 git status 中文显示的问题¶ -git config --global core.quotePath false +git config --global core.quotePath false 5. apps 目录下颜色有些是黄色的¶ 在 Pycharm 中 apps 目录下应用库文件是黄色的,编辑器识别不到代码新增和修改; @@ -3184,22 +3204,22 @@ 5. apps 目录下颜色有些是黄色的6. 执行 env.sh 报错 $'\r':未找到命令¶ 出现这个问题你应该是在 windows 上打开或编辑过 env.sh 脚本,windows下的换行是回车符+换行符,也就是\r\n,而 Linxu 下是换行符 \n,Linux 下不识别 \r,因此报错。 解决方案: -# 将 \r 替换为空 -sudo sed -i 's/\r//' env.sh +# 将 \r 替换为空 +sudo sed -i 's/\r//' env.sh 7.怎样为单独某一条用例配置执行超时时间¶ 在用例脚本中添加装饰器,如下: -@pytest.mark.timeout(300) # 单位秒 -def test_xxx_001(): - pass +@pytest.mark.timeout(300) # 单位秒 +def test_xxx_001(): + pass 8. 如何拉取 YouQu 自动化项目所有代码,包含子仓库¶ 前置条件:已申请访问 YouQu 权限群组 -# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) -git config --global credential.helper store - -# 拉取YouQu框架代码,并递归拉取子仓库代码 -git clone "http://gerrit.uniontech.com/youqu" --recursive +# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) +git config --global credential.helper store + +# 拉取YouQu框架代码,并递归拉取子仓库代码 +git clone "http://gerrit.uniontech.com/youqu" --recursive 9. 如何拉取 YouQu 自动化项目中指定子仓库的代码¶ 前置条件: @@ -3207,22 +3227,22 @@ 9. 如何拉取 YouQu 自动化项目中指定子仓库的代 已申请访问 YouQu 权限群组 已存储访问密码 -# 拉取YouQu框架代码 -git clone "http://gerrit.uniontech.com/youqu" - -# 指定拉取子仓库代码 -cd youqu -git submodule update --init apps/autotest_xxx_xxx +# 拉取YouQu框架代码 +git clone "http://gerrit.uniontech.com/youqu" + +# 指定拉取子仓库代码 +cd youqu +git submodule update --init apps/autotest_xxx_xxx 10. 如何更新 YouQu 自动化项目中,所有子仓库的代码¶ 更新所有子仓库代码 -cd youqu -git pull & git submodule foreach git pull +cd youqu +git pull & git submodule foreach git pull 11. 如何修复 YouQu 所有子仓库 master 分支游离头(detached head)¶ 修复所有子仓库默认master 分支游离头 -cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
git config --global commit.template ~/gitcommit_template
此命令将模板加入到 git 的提交模板中。
后续提交的时候需要关注一下几点:
首先添加 commit 信息
git add 后面加文件名称 +git add 后面加文件名称 -git add . # 表示添加所有文件 +git add . # 表示添加所有文件 使用这条命令注意有些临时文件不要提交到仓库了。 -git commit -a +git commit -a 之后在 fix: 后面(注意冒号后面必须加空格,不然直接-1)写本地提交的 commit 信息,然后就可以提交代码了 -git review branch(当前分支) -r origin +git review branch(当前分支) -r origin 最好一次 commit,一次 git review ,经常有同学在本地疯狂 commit 最后 git review 报错不知道咋回事儿。 若不想每次提交都加上 -r 选项,执行以下命令: -git config --global gitreview.remote origin +git config --global gitreview.remote origin 提交代码,直接使用 git review branch<目标分支>,例如 git review master 4. Git标签¶ @@ -3106,74 +3126,74 @@ 4. Git标签git tag -a <tagname> +git tag -a <tagname> 回车之后,Git 会打开你的编辑器,让你写一句标签注解,就像你给提交写注解一样。 查看所有标签 -git tag -l -# git tag 也行 +git tag -l +# git tag 也行 删除标签 -git tag -d <tagname> +git tag -d <tagname> 推送标签至远程 git push 命令并不会传送标签到远程仓库服务器上,必须显式地推送标签。 -git push origin <tagname> +git push origin <tagname> 推送所有不在远程仓库服务器上的标签 -git push origin --tag +git push origin --tag 删除远程标签 -git push origin :refs/tag/<tagname> +git push origin :refs/tag/<tagname> 后期打标签 先用 git log --pretty=oneline 查询提交记录,获取校验码。 -git tag -a <tagname> 9fceb02(校验码) +git tag -a <tagname> 9fceb02(校验码) 检出标签 -git checkout <tagname> +git checkout <tagname> 此时,仓库会处于“分离头指针(detached HEAD)”的状态。 在“分离头指针”状态下,如果你做了某些更改然后提交它们,标签不会发生变化, 但你的新提交将不属于任何分支,并且将无法访问,除非通过确切的提交哈希才能访问。 因此,如果你需要进行更改,比如你要修复旧版本中的错误,那么通常需要创建一个新分支: -git checkout -b <NewBranchName> <tagname> +git checkout -b <NewBranchName> <tagname> 新分支上可以进行提交代码。 十四、常见问题¶ 1. 提交代码时提示邮箱或者名称不对¶ 重新配置邮箱或者名称,然后重置生效: -git commit --amend --reset-author +git commit --amend --reset-author 2. 怎么回滚到之前的版本¶ (1)查询历史提交记录 -git log +git log 找到你要回滚的版本,复制 hash 值。 注意:是 commit 空格之后的 hash 值,之前有同学复制的 Change-Id: 这样肯定报错。 (2)回滚版本,不清除代码 -git reset --soft ${hash} +git reset --soft ${hash} (3)回滚版本,清除代码,慎用哈 -git reset --hard ${hash} +git reset --hard ${hash} 3. 测试报告里面 F S . E 是什么意思¶ F 表示失败,. (点)表示通过,S 表示跳过,E 表示 error 有报错 4. 解决 git status 中文显示的问题¶ -git config --global core.quotePath false +git config --global core.quotePath false 5. apps 目录下颜色有些是黄色的¶ 在 Pycharm 中 apps 目录下应用库文件是黄色的,编辑器识别不到代码新增和修改; @@ -3184,22 +3204,22 @@ 5. apps 目录下颜色有些是黄色的6. 执行 env.sh 报错 $'\r':未找到命令¶ 出现这个问题你应该是在 windows 上打开或编辑过 env.sh 脚本,windows下的换行是回车符+换行符,也就是\r\n,而 Linxu 下是换行符 \n,Linux 下不识别 \r,因此报错。 解决方案: -# 将 \r 替换为空 -sudo sed -i 's/\r//' env.sh +# 将 \r 替换为空 +sudo sed -i 's/\r//' env.sh 7.怎样为单独某一条用例配置执行超时时间¶ 在用例脚本中添加装饰器,如下: -@pytest.mark.timeout(300) # 单位秒 -def test_xxx_001(): - pass +@pytest.mark.timeout(300) # 单位秒 +def test_xxx_001(): + pass 8. 如何拉取 YouQu 自动化项目所有代码,包含子仓库¶ 前置条件:已申请访问 YouQu 权限群组 -# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) -git config --global credential.helper store - -# 拉取YouQu框架代码,并递归拉取子仓库代码 -git clone "http://gerrit.uniontech.com/youqu" --recursive +# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) +git config --global credential.helper store + +# 拉取YouQu框架代码,并递归拉取子仓库代码 +git clone "http://gerrit.uniontech.com/youqu" --recursive 9. 如何拉取 YouQu 自动化项目中指定子仓库的代码¶ 前置条件: @@ -3207,22 +3227,22 @@ 9. 如何拉取 YouQu 自动化项目中指定子仓库的代 已申请访问 YouQu 权限群组 已存储访问密码 -# 拉取YouQu框架代码 -git clone "http://gerrit.uniontech.com/youqu" - -# 指定拉取子仓库代码 -cd youqu -git submodule update --init apps/autotest_xxx_xxx +# 拉取YouQu框架代码 +git clone "http://gerrit.uniontech.com/youqu" + +# 指定拉取子仓库代码 +cd youqu +git submodule update --init apps/autotest_xxx_xxx 10. 如何更新 YouQu 自动化项目中,所有子仓库的代码¶ 更新所有子仓库代码 -cd youqu -git pull & git submodule foreach git pull +cd youqu +git pull & git submodule foreach git pull 11. 如何修复 YouQu 所有子仓库 master 分支游离头(detached head)¶ 修复所有子仓库默认master 分支游离头 -cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
git add 后面加文件名称
git add . # 表示添加所有文件 +git add . # 表示添加所有文件 使用这条命令注意有些临时文件不要提交到仓库了。 -git commit -a +git commit -a 之后在 fix: 后面(注意冒号后面必须加空格,不然直接-1)写本地提交的 commit 信息,然后就可以提交代码了 -git review branch(当前分支) -r origin +git review branch(当前分支) -r origin 最好一次 commit,一次 git review ,经常有同学在本地疯狂 commit 最后 git review 报错不知道咋回事儿。 若不想每次提交都加上 -r 选项,执行以下命令: -git config --global gitreview.remote origin +git config --global gitreview.remote origin 提交代码,直接使用 git review branch<目标分支>,例如 git review master 4. Git标签¶ @@ -3106,74 +3126,74 @@ 4. Git标签git tag -a <tagname> +git tag -a <tagname> 回车之后,Git 会打开你的编辑器,让你写一句标签注解,就像你给提交写注解一样。 查看所有标签 -git tag -l -# git tag 也行 +git tag -l +# git tag 也行 删除标签 -git tag -d <tagname> +git tag -d <tagname> 推送标签至远程 git push 命令并不会传送标签到远程仓库服务器上,必须显式地推送标签。 -git push origin <tagname> +git push origin <tagname> 推送所有不在远程仓库服务器上的标签 -git push origin --tag +git push origin --tag 删除远程标签 -git push origin :refs/tag/<tagname> +git push origin :refs/tag/<tagname> 后期打标签 先用 git log --pretty=oneline 查询提交记录,获取校验码。 -git tag -a <tagname> 9fceb02(校验码) +git tag -a <tagname> 9fceb02(校验码) 检出标签 -git checkout <tagname> +git checkout <tagname> 此时,仓库会处于“分离头指针(detached HEAD)”的状态。 在“分离头指针”状态下,如果你做了某些更改然后提交它们,标签不会发生变化, 但你的新提交将不属于任何分支,并且将无法访问,除非通过确切的提交哈希才能访问。 因此,如果你需要进行更改,比如你要修复旧版本中的错误,那么通常需要创建一个新分支: -git checkout -b <NewBranchName> <tagname> +git checkout -b <NewBranchName> <tagname> 新分支上可以进行提交代码。 十四、常见问题¶ 1. 提交代码时提示邮箱或者名称不对¶ 重新配置邮箱或者名称,然后重置生效: -git commit --amend --reset-author +git commit --amend --reset-author 2. 怎么回滚到之前的版本¶ (1)查询历史提交记录 -git log +git log 找到你要回滚的版本,复制 hash 值。 注意:是 commit 空格之后的 hash 值,之前有同学复制的 Change-Id: 这样肯定报错。 (2)回滚版本,不清除代码 -git reset --soft ${hash} +git reset --soft ${hash} (3)回滚版本,清除代码,慎用哈 -git reset --hard ${hash} +git reset --hard ${hash} 3. 测试报告里面 F S . E 是什么意思¶ F 表示失败,. (点)表示通过,S 表示跳过,E 表示 error 有报错 4. 解决 git status 中文显示的问题¶ -git config --global core.quotePath false +git config --global core.quotePath false 5. apps 目录下颜色有些是黄色的¶ 在 Pycharm 中 apps 目录下应用库文件是黄色的,编辑器识别不到代码新增和修改; @@ -3184,22 +3204,22 @@ 5. apps 目录下颜色有些是黄色的6. 执行 env.sh 报错 $'\r':未找到命令¶ 出现这个问题你应该是在 windows 上打开或编辑过 env.sh 脚本,windows下的换行是回车符+换行符,也就是\r\n,而 Linxu 下是换行符 \n,Linux 下不识别 \r,因此报错。 解决方案: -# 将 \r 替换为空 -sudo sed -i 's/\r//' env.sh +# 将 \r 替换为空 +sudo sed -i 's/\r//' env.sh 7.怎样为单独某一条用例配置执行超时时间¶ 在用例脚本中添加装饰器,如下: -@pytest.mark.timeout(300) # 单位秒 -def test_xxx_001(): - pass +@pytest.mark.timeout(300) # 单位秒 +def test_xxx_001(): + pass 8. 如何拉取 YouQu 自动化项目所有代码,包含子仓库¶ 前置条件:已申请访问 YouQu 权限群组 -# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) -git config --global credential.helper store - -# 拉取YouQu框架代码,并递归拉取子仓库代码 -git clone "http://gerrit.uniontech.com/youqu" --recursive +# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) +git config --global credential.helper store + +# 拉取YouQu框架代码,并递归拉取子仓库代码 +git clone "http://gerrit.uniontech.com/youqu" --recursive 9. 如何拉取 YouQu 自动化项目中指定子仓库的代码¶ 前置条件: @@ -3207,22 +3227,22 @@ 9. 如何拉取 YouQu 自动化项目中指定子仓库的代 已申请访问 YouQu 权限群组 已存储访问密码 -# 拉取YouQu框架代码 -git clone "http://gerrit.uniontech.com/youqu" - -# 指定拉取子仓库代码 -cd youqu -git submodule update --init apps/autotest_xxx_xxx +# 拉取YouQu框架代码 +git clone "http://gerrit.uniontech.com/youqu" + +# 指定拉取子仓库代码 +cd youqu +git submodule update --init apps/autotest_xxx_xxx 10. 如何更新 YouQu 自动化项目中,所有子仓库的代码¶ 更新所有子仓库代码 -cd youqu -git pull & git submodule foreach git pull +cd youqu +git pull & git submodule foreach git pull 11. 如何修复 YouQu 所有子仓库 master 分支游离头(detached head)¶ 修复所有子仓库默认master 分支游离头 -cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
git add . # 表示添加所有文件
使用这条命令注意有些临时文件不要提交到仓库了。
git commit -a +git commit -a 之后在 fix: 后面(注意冒号后面必须加空格,不然直接-1)写本地提交的 commit 信息,然后就可以提交代码了 -git review branch(当前分支) -r origin +git review branch(当前分支) -r origin 最好一次 commit,一次 git review ,经常有同学在本地疯狂 commit 最后 git review 报错不知道咋回事儿。 若不想每次提交都加上 -r 选项,执行以下命令: -git config --global gitreview.remote origin +git config --global gitreview.remote origin 提交代码,直接使用 git review branch<目标分支>,例如 git review master 4. Git标签¶ @@ -3106,74 +3126,74 @@ 4. Git标签git tag -a <tagname> +git tag -a <tagname> 回车之后,Git 会打开你的编辑器,让你写一句标签注解,就像你给提交写注解一样。 查看所有标签 -git tag -l -# git tag 也行 +git tag -l +# git tag 也行 删除标签 -git tag -d <tagname> +git tag -d <tagname> 推送标签至远程 git push 命令并不会传送标签到远程仓库服务器上,必须显式地推送标签。 -git push origin <tagname> +git push origin <tagname> 推送所有不在远程仓库服务器上的标签 -git push origin --tag +git push origin --tag 删除远程标签 -git push origin :refs/tag/<tagname> +git push origin :refs/tag/<tagname> 后期打标签 先用 git log --pretty=oneline 查询提交记录,获取校验码。 -git tag -a <tagname> 9fceb02(校验码) +git tag -a <tagname> 9fceb02(校验码) 检出标签 -git checkout <tagname> +git checkout <tagname> 此时,仓库会处于“分离头指针(detached HEAD)”的状态。 在“分离头指针”状态下,如果你做了某些更改然后提交它们,标签不会发生变化, 但你的新提交将不属于任何分支,并且将无法访问,除非通过确切的提交哈希才能访问。 因此,如果你需要进行更改,比如你要修复旧版本中的错误,那么通常需要创建一个新分支: -git checkout -b <NewBranchName> <tagname> +git checkout -b <NewBranchName> <tagname> 新分支上可以进行提交代码。 十四、常见问题¶ 1. 提交代码时提示邮箱或者名称不对¶ 重新配置邮箱或者名称,然后重置生效: -git commit --amend --reset-author +git commit --amend --reset-author 2. 怎么回滚到之前的版本¶ (1)查询历史提交记录 -git log +git log 找到你要回滚的版本,复制 hash 值。 注意:是 commit 空格之后的 hash 值,之前有同学复制的 Change-Id: 这样肯定报错。 (2)回滚版本,不清除代码 -git reset --soft ${hash} +git reset --soft ${hash} (3)回滚版本,清除代码,慎用哈 -git reset --hard ${hash} +git reset --hard ${hash} 3. 测试报告里面 F S . E 是什么意思¶ F 表示失败,. (点)表示通过,S 表示跳过,E 表示 error 有报错 4. 解决 git status 中文显示的问题¶ -git config --global core.quotePath false +git config --global core.quotePath false 5. apps 目录下颜色有些是黄色的¶ 在 Pycharm 中 apps 目录下应用库文件是黄色的,编辑器识别不到代码新增和修改; @@ -3184,22 +3204,22 @@ 5. apps 目录下颜色有些是黄色的6. 执行 env.sh 报错 $'\r':未找到命令¶ 出现这个问题你应该是在 windows 上打开或编辑过 env.sh 脚本,windows下的换行是回车符+换行符,也就是\r\n,而 Linxu 下是换行符 \n,Linux 下不识别 \r,因此报错。 解决方案: -# 将 \r 替换为空 -sudo sed -i 's/\r//' env.sh +# 将 \r 替换为空 +sudo sed -i 's/\r//' env.sh 7.怎样为单独某一条用例配置执行超时时间¶ 在用例脚本中添加装饰器,如下: -@pytest.mark.timeout(300) # 单位秒 -def test_xxx_001(): - pass +@pytest.mark.timeout(300) # 单位秒 +def test_xxx_001(): + pass 8. 如何拉取 YouQu 自动化项目所有代码,包含子仓库¶ 前置条件:已申请访问 YouQu 权限群组 -# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) -git config --global credential.helper store - -# 拉取YouQu框架代码,并递归拉取子仓库代码 -git clone "http://gerrit.uniontech.com/youqu" --recursive +# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) +git config --global credential.helper store + +# 拉取YouQu框架代码,并递归拉取子仓库代码 +git clone "http://gerrit.uniontech.com/youqu" --recursive 9. 如何拉取 YouQu 自动化项目中指定子仓库的代码¶ 前置条件: @@ -3207,22 +3227,22 @@ 9. 如何拉取 YouQu 自动化项目中指定子仓库的代 已申请访问 YouQu 权限群组 已存储访问密码 -# 拉取YouQu框架代码 -git clone "http://gerrit.uniontech.com/youqu" - -# 指定拉取子仓库代码 -cd youqu -git submodule update --init apps/autotest_xxx_xxx +# 拉取YouQu框架代码 +git clone "http://gerrit.uniontech.com/youqu" + +# 指定拉取子仓库代码 +cd youqu +git submodule update --init apps/autotest_xxx_xxx 10. 如何更新 YouQu 自动化项目中,所有子仓库的代码¶ 更新所有子仓库代码 -cd youqu -git pull & git submodule foreach git pull +cd youqu +git pull & git submodule foreach git pull 11. 如何修复 YouQu 所有子仓库 master 分支游离头(detached head)¶ 修复所有子仓库默认master 分支游离头 -cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
git commit -a
之后在 fix: 后面(注意冒号后面必须加空格,不然直接-1)写本地提交的 commit 信息,然后就可以提交代码了
git review branch(当前分支) -r origin +git review branch(当前分支) -r origin 最好一次 commit,一次 git review ,经常有同学在本地疯狂 commit 最后 git review 报错不知道咋回事儿。 若不想每次提交都加上 -r 选项,执行以下命令: -git config --global gitreview.remote origin +git config --global gitreview.remote origin 提交代码,直接使用 git review branch<目标分支>,例如 git review master 4. Git标签¶ @@ -3106,74 +3126,74 @@ 4. Git标签git tag -a <tagname> +git tag -a <tagname> 回车之后,Git 会打开你的编辑器,让你写一句标签注解,就像你给提交写注解一样。 查看所有标签 -git tag -l -# git tag 也行 +git tag -l +# git tag 也行 删除标签 -git tag -d <tagname> +git tag -d <tagname> 推送标签至远程 git push 命令并不会传送标签到远程仓库服务器上,必须显式地推送标签。 -git push origin <tagname> +git push origin <tagname> 推送所有不在远程仓库服务器上的标签 -git push origin --tag +git push origin --tag 删除远程标签 -git push origin :refs/tag/<tagname> +git push origin :refs/tag/<tagname> 后期打标签 先用 git log --pretty=oneline 查询提交记录,获取校验码。 -git tag -a <tagname> 9fceb02(校验码) +git tag -a <tagname> 9fceb02(校验码) 检出标签 -git checkout <tagname> +git checkout <tagname> 此时,仓库会处于“分离头指针(detached HEAD)”的状态。 在“分离头指针”状态下,如果你做了某些更改然后提交它们,标签不会发生变化, 但你的新提交将不属于任何分支,并且将无法访问,除非通过确切的提交哈希才能访问。 因此,如果你需要进行更改,比如你要修复旧版本中的错误,那么通常需要创建一个新分支: -git checkout -b <NewBranchName> <tagname> +git checkout -b <NewBranchName> <tagname> 新分支上可以进行提交代码。 十四、常见问题¶ 1. 提交代码时提示邮箱或者名称不对¶ 重新配置邮箱或者名称,然后重置生效: -git commit --amend --reset-author +git commit --amend --reset-author 2. 怎么回滚到之前的版本¶ (1)查询历史提交记录 -git log +git log 找到你要回滚的版本,复制 hash 值。 注意:是 commit 空格之后的 hash 值,之前有同学复制的 Change-Id: 这样肯定报错。 (2)回滚版本,不清除代码 -git reset --soft ${hash} +git reset --soft ${hash} (3)回滚版本,清除代码,慎用哈 -git reset --hard ${hash} +git reset --hard ${hash} 3. 测试报告里面 F S . E 是什么意思¶ F 表示失败,. (点)表示通过,S 表示跳过,E 表示 error 有报错 4. 解决 git status 中文显示的问题¶ -git config --global core.quotePath false +git config --global core.quotePath false 5. apps 目录下颜色有些是黄色的¶ 在 Pycharm 中 apps 目录下应用库文件是黄色的,编辑器识别不到代码新增和修改; @@ -3184,22 +3204,22 @@ 5. apps 目录下颜色有些是黄色的6. 执行 env.sh 报错 $'\r':未找到命令¶ 出现这个问题你应该是在 windows 上打开或编辑过 env.sh 脚本,windows下的换行是回车符+换行符,也就是\r\n,而 Linxu 下是换行符 \n,Linux 下不识别 \r,因此报错。 解决方案: -# 将 \r 替换为空 -sudo sed -i 's/\r//' env.sh +# 将 \r 替换为空 +sudo sed -i 's/\r//' env.sh 7.怎样为单独某一条用例配置执行超时时间¶ 在用例脚本中添加装饰器,如下: -@pytest.mark.timeout(300) # 单位秒 -def test_xxx_001(): - pass +@pytest.mark.timeout(300) # 单位秒 +def test_xxx_001(): + pass 8. 如何拉取 YouQu 自动化项目所有代码,包含子仓库¶ 前置条件:已申请访问 YouQu 权限群组 -# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) -git config --global credential.helper store - -# 拉取YouQu框架代码,并递归拉取子仓库代码 -git clone "http://gerrit.uniontech.com/youqu" --recursive +# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) +git config --global credential.helper store + +# 拉取YouQu框架代码,并递归拉取子仓库代码 +git clone "http://gerrit.uniontech.com/youqu" --recursive 9. 如何拉取 YouQu 自动化项目中指定子仓库的代码¶ 前置条件: @@ -3207,22 +3227,22 @@ 9. 如何拉取 YouQu 自动化项目中指定子仓库的代 已申请访问 YouQu 权限群组 已存储访问密码 -# 拉取YouQu框架代码 -git clone "http://gerrit.uniontech.com/youqu" - -# 指定拉取子仓库代码 -cd youqu -git submodule update --init apps/autotest_xxx_xxx +# 拉取YouQu框架代码 +git clone "http://gerrit.uniontech.com/youqu" + +# 指定拉取子仓库代码 +cd youqu +git submodule update --init apps/autotest_xxx_xxx 10. 如何更新 YouQu 自动化项目中,所有子仓库的代码¶ 更新所有子仓库代码 -cd youqu -git pull & git submodule foreach git pull +cd youqu +git pull & git submodule foreach git pull 11. 如何修复 YouQu 所有子仓库 master 分支游离头(detached head)¶ 修复所有子仓库默认master 分支游离头 -cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
git review branch(当前分支) -r origin
最好一次 commit,一次 git review ,经常有同学在本地疯狂 commit 最后 git review 报错不知道咋回事儿。 若不想每次提交都加上 -r 选项,执行以下命令:
git config --global gitreview.remote origin +git config --global gitreview.remote origin 提交代码,直接使用 git review branch<目标分支>,例如 git review master 4. Git标签¶ @@ -3106,74 +3126,74 @@ 4. Git标签git tag -a <tagname> +git tag -a <tagname> 回车之后,Git 会打开你的编辑器,让你写一句标签注解,就像你给提交写注解一样。 查看所有标签 -git tag -l -# git tag 也行 +git tag -l +# git tag 也行 删除标签 -git tag -d <tagname> +git tag -d <tagname> 推送标签至远程 git push 命令并不会传送标签到远程仓库服务器上,必须显式地推送标签。 -git push origin <tagname> +git push origin <tagname> 推送所有不在远程仓库服务器上的标签 -git push origin --tag +git push origin --tag 删除远程标签 -git push origin :refs/tag/<tagname> +git push origin :refs/tag/<tagname> 后期打标签 先用 git log --pretty=oneline 查询提交记录,获取校验码。 -git tag -a <tagname> 9fceb02(校验码) +git tag -a <tagname> 9fceb02(校验码) 检出标签 -git checkout <tagname> +git checkout <tagname> 此时,仓库会处于“分离头指针(detached HEAD)”的状态。 在“分离头指针”状态下,如果你做了某些更改然后提交它们,标签不会发生变化, 但你的新提交将不属于任何分支,并且将无法访问,除非通过确切的提交哈希才能访问。 因此,如果你需要进行更改,比如你要修复旧版本中的错误,那么通常需要创建一个新分支: -git checkout -b <NewBranchName> <tagname> +git checkout -b <NewBranchName> <tagname> 新分支上可以进行提交代码。 十四、常见问题¶ 1. 提交代码时提示邮箱或者名称不对¶ 重新配置邮箱或者名称,然后重置生效: -git commit --amend --reset-author +git commit --amend --reset-author 2. 怎么回滚到之前的版本¶ (1)查询历史提交记录 -git log +git log 找到你要回滚的版本,复制 hash 值。 注意:是 commit 空格之后的 hash 值,之前有同学复制的 Change-Id: 这样肯定报错。 (2)回滚版本,不清除代码 -git reset --soft ${hash} +git reset --soft ${hash} (3)回滚版本,清除代码,慎用哈 -git reset --hard ${hash} +git reset --hard ${hash} 3. 测试报告里面 F S . E 是什么意思¶ F 表示失败,. (点)表示通过,S 表示跳过,E 表示 error 有报错 4. 解决 git status 中文显示的问题¶ -git config --global core.quotePath false +git config --global core.quotePath false 5. apps 目录下颜色有些是黄色的¶ 在 Pycharm 中 apps 目录下应用库文件是黄色的,编辑器识别不到代码新增和修改; @@ -3184,22 +3204,22 @@ 5. apps 目录下颜色有些是黄色的6. 执行 env.sh 报错 $'\r':未找到命令¶ 出现这个问题你应该是在 windows 上打开或编辑过 env.sh 脚本,windows下的换行是回车符+换行符,也就是\r\n,而 Linxu 下是换行符 \n,Linux 下不识别 \r,因此报错。 解决方案: -# 将 \r 替换为空 -sudo sed -i 's/\r//' env.sh +# 将 \r 替换为空 +sudo sed -i 's/\r//' env.sh 7.怎样为单独某一条用例配置执行超时时间¶ 在用例脚本中添加装饰器,如下: -@pytest.mark.timeout(300) # 单位秒 -def test_xxx_001(): - pass +@pytest.mark.timeout(300) # 单位秒 +def test_xxx_001(): + pass 8. 如何拉取 YouQu 自动化项目所有代码,包含子仓库¶ 前置条件:已申请访问 YouQu 权限群组 -# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) -git config --global credential.helper store - -# 拉取YouQu框架代码,并递归拉取子仓库代码 -git clone "http://gerrit.uniontech.com/youqu" --recursive +# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) +git config --global credential.helper store + +# 拉取YouQu框架代码,并递归拉取子仓库代码 +git clone "http://gerrit.uniontech.com/youqu" --recursive 9. 如何拉取 YouQu 自动化项目中指定子仓库的代码¶ 前置条件: @@ -3207,22 +3227,22 @@ 9. 如何拉取 YouQu 自动化项目中指定子仓库的代 已申请访问 YouQu 权限群组 已存储访问密码 -# 拉取YouQu框架代码 -git clone "http://gerrit.uniontech.com/youqu" - -# 指定拉取子仓库代码 -cd youqu -git submodule update --init apps/autotest_xxx_xxx +# 拉取YouQu框架代码 +git clone "http://gerrit.uniontech.com/youqu" + +# 指定拉取子仓库代码 +cd youqu +git submodule update --init apps/autotest_xxx_xxx 10. 如何更新 YouQu 自动化项目中,所有子仓库的代码¶ 更新所有子仓库代码 -cd youqu -git pull & git submodule foreach git pull +cd youqu +git pull & git submodule foreach git pull 11. 如何修复 YouQu 所有子仓库 master 分支游离头(detached head)¶ 修复所有子仓库默认master 分支游离头 -cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
提交代码,直接使用 git review branch<目标分支>,例如 git review master
git review branch<目标分支>
git tag -a <tagname> +git tag -a <tagname> 回车之后,Git 会打开你的编辑器,让你写一句标签注解,就像你给提交写注解一样。 查看所有标签 -git tag -l -# git tag 也行 +git tag -l +# git tag 也行 删除标签 -git tag -d <tagname> +git tag -d <tagname> 推送标签至远程 git push 命令并不会传送标签到远程仓库服务器上,必须显式地推送标签。 -git push origin <tagname> +git push origin <tagname> 推送所有不在远程仓库服务器上的标签 -git push origin --tag +git push origin --tag 删除远程标签 -git push origin :refs/tag/<tagname> +git push origin :refs/tag/<tagname> 后期打标签 先用 git log --pretty=oneline 查询提交记录,获取校验码。 -git tag -a <tagname> 9fceb02(校验码) +git tag -a <tagname> 9fceb02(校验码) 检出标签 -git checkout <tagname> +git checkout <tagname> 此时,仓库会处于“分离头指针(detached HEAD)”的状态。 在“分离头指针”状态下,如果你做了某些更改然后提交它们,标签不会发生变化, 但你的新提交将不属于任何分支,并且将无法访问,除非通过确切的提交哈希才能访问。 因此,如果你需要进行更改,比如你要修复旧版本中的错误,那么通常需要创建一个新分支: -git checkout -b <NewBranchName> <tagname> +git checkout -b <NewBranchName> <tagname> 新分支上可以进行提交代码。 十四、常见问题¶ 1. 提交代码时提示邮箱或者名称不对¶ 重新配置邮箱或者名称,然后重置生效: -git commit --amend --reset-author +git commit --amend --reset-author 2. 怎么回滚到之前的版本¶ (1)查询历史提交记录 -git log +git log 找到你要回滚的版本,复制 hash 值。 注意:是 commit 空格之后的 hash 值,之前有同学复制的 Change-Id: 这样肯定报错。 (2)回滚版本,不清除代码 -git reset --soft ${hash} +git reset --soft ${hash} (3)回滚版本,清除代码,慎用哈 -git reset --hard ${hash} +git reset --hard ${hash} 3. 测试报告里面 F S . E 是什么意思¶ F 表示失败,. (点)表示通过,S 表示跳过,E 表示 error 有报错 4. 解决 git status 中文显示的问题¶ -git config --global core.quotePath false +git config --global core.quotePath false 5. apps 目录下颜色有些是黄色的¶ 在 Pycharm 中 apps 目录下应用库文件是黄色的,编辑器识别不到代码新增和修改; @@ -3184,22 +3204,22 @@ 5. apps 目录下颜色有些是黄色的6. 执行 env.sh 报错 $'\r':未找到命令¶ 出现这个问题你应该是在 windows 上打开或编辑过 env.sh 脚本,windows下的换行是回车符+换行符,也就是\r\n,而 Linxu 下是换行符 \n,Linux 下不识别 \r,因此报错。 解决方案: -# 将 \r 替换为空 -sudo sed -i 's/\r//' env.sh +# 将 \r 替换为空 +sudo sed -i 's/\r//' env.sh 7.怎样为单独某一条用例配置执行超时时间¶ 在用例脚本中添加装饰器,如下: -@pytest.mark.timeout(300) # 单位秒 -def test_xxx_001(): - pass +@pytest.mark.timeout(300) # 单位秒 +def test_xxx_001(): + pass 8. 如何拉取 YouQu 自动化项目所有代码,包含子仓库¶ 前置条件:已申请访问 YouQu 权限群组 -# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) -git config --global credential.helper store - -# 拉取YouQu框架代码,并递归拉取子仓库代码 -git clone "http://gerrit.uniontech.com/youqu" --recursive +# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) +git config --global credential.helper store + +# 拉取YouQu框架代码,并递归拉取子仓库代码 +git clone "http://gerrit.uniontech.com/youqu" --recursive 9. 如何拉取 YouQu 自动化项目中指定子仓库的代码¶ 前置条件: @@ -3207,22 +3227,22 @@ 9. 如何拉取 YouQu 自动化项目中指定子仓库的代 已申请访问 YouQu 权限群组 已存储访问密码 -# 拉取YouQu框架代码 -git clone "http://gerrit.uniontech.com/youqu" - -# 指定拉取子仓库代码 -cd youqu -git submodule update --init apps/autotest_xxx_xxx +# 拉取YouQu框架代码 +git clone "http://gerrit.uniontech.com/youqu" + +# 指定拉取子仓库代码 +cd youqu +git submodule update --init apps/autotest_xxx_xxx 10. 如何更新 YouQu 自动化项目中,所有子仓库的代码¶ 更新所有子仓库代码 -cd youqu -git pull & git submodule foreach git pull +cd youqu +git pull & git submodule foreach git pull 11. 如何修复 YouQu 所有子仓库 master 分支游离头(detached head)¶ 修复所有子仓库默认master 分支游离头 -cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
git tag -a <tagname>
回车之后,Git 会打开你的编辑器,让你写一句标签注解,就像你给提交写注解一样。
git tag -l -# git tag 也行 +git tag -l +# git tag 也行 删除标签 -git tag -d <tagname> +git tag -d <tagname> 推送标签至远程 git push 命令并不会传送标签到远程仓库服务器上,必须显式地推送标签。 -git push origin <tagname> +git push origin <tagname> 推送所有不在远程仓库服务器上的标签 -git push origin --tag +git push origin --tag 删除远程标签 -git push origin :refs/tag/<tagname> +git push origin :refs/tag/<tagname> 后期打标签 先用 git log --pretty=oneline 查询提交记录,获取校验码。 -git tag -a <tagname> 9fceb02(校验码) +git tag -a <tagname> 9fceb02(校验码) 检出标签 -git checkout <tagname> +git checkout <tagname> 此时,仓库会处于“分离头指针(detached HEAD)”的状态。 在“分离头指针”状态下,如果你做了某些更改然后提交它们,标签不会发生变化, 但你的新提交将不属于任何分支,并且将无法访问,除非通过确切的提交哈希才能访问。 因此,如果你需要进行更改,比如你要修复旧版本中的错误,那么通常需要创建一个新分支: -git checkout -b <NewBranchName> <tagname> +git checkout -b <NewBranchName> <tagname> 新分支上可以进行提交代码。 十四、常见问题¶ 1. 提交代码时提示邮箱或者名称不对¶ 重新配置邮箱或者名称,然后重置生效: -git commit --amend --reset-author +git commit --amend --reset-author 2. 怎么回滚到之前的版本¶ (1)查询历史提交记录 -git log +git log 找到你要回滚的版本,复制 hash 值。 注意:是 commit 空格之后的 hash 值,之前有同学复制的 Change-Id: 这样肯定报错。 (2)回滚版本,不清除代码 -git reset --soft ${hash} +git reset --soft ${hash} (3)回滚版本,清除代码,慎用哈 -git reset --hard ${hash} +git reset --hard ${hash} 3. 测试报告里面 F S . E 是什么意思¶ F 表示失败,. (点)表示通过,S 表示跳过,E 表示 error 有报错 4. 解决 git status 中文显示的问题¶ -git config --global core.quotePath false +git config --global core.quotePath false 5. apps 目录下颜色有些是黄色的¶ 在 Pycharm 中 apps 目录下应用库文件是黄色的,编辑器识别不到代码新增和修改; @@ -3184,22 +3204,22 @@ 5. apps 目录下颜色有些是黄色的6. 执行 env.sh 报错 $'\r':未找到命令¶ 出现这个问题你应该是在 windows 上打开或编辑过 env.sh 脚本,windows下的换行是回车符+换行符,也就是\r\n,而 Linxu 下是换行符 \n,Linux 下不识别 \r,因此报错。 解决方案: -# 将 \r 替换为空 -sudo sed -i 's/\r//' env.sh +# 将 \r 替换为空 +sudo sed -i 's/\r//' env.sh 7.怎样为单独某一条用例配置执行超时时间¶ 在用例脚本中添加装饰器,如下: -@pytest.mark.timeout(300) # 单位秒 -def test_xxx_001(): - pass +@pytest.mark.timeout(300) # 单位秒 +def test_xxx_001(): + pass 8. 如何拉取 YouQu 自动化项目所有代码,包含子仓库¶ 前置条件:已申请访问 YouQu 权限群组 -# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) -git config --global credential.helper store - -# 拉取YouQu框架代码,并递归拉取子仓库代码 -git clone "http://gerrit.uniontech.com/youqu" --recursive +# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) +git config --global credential.helper store + +# 拉取YouQu框架代码,并递归拉取子仓库代码 +git clone "http://gerrit.uniontech.com/youqu" --recursive 9. 如何拉取 YouQu 自动化项目中指定子仓库的代码¶ 前置条件: @@ -3207,22 +3227,22 @@ 9. 如何拉取 YouQu 自动化项目中指定子仓库的代 已申请访问 YouQu 权限群组 已存储访问密码 -# 拉取YouQu框架代码 -git clone "http://gerrit.uniontech.com/youqu" - -# 指定拉取子仓库代码 -cd youqu -git submodule update --init apps/autotest_xxx_xxx +# 拉取YouQu框架代码 +git clone "http://gerrit.uniontech.com/youqu" + +# 指定拉取子仓库代码 +cd youqu +git submodule update --init apps/autotest_xxx_xxx 10. 如何更新 YouQu 自动化项目中,所有子仓库的代码¶ 更新所有子仓库代码 -cd youqu -git pull & git submodule foreach git pull +cd youqu +git pull & git submodule foreach git pull 11. 如何修复 YouQu 所有子仓库 master 分支游离头(detached head)¶ 修复所有子仓库默认master 分支游离头 -cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
git tag -l +# git tag 也行
git tag -d <tagname> +git tag -d <tagname> 推送标签至远程 git push 命令并不会传送标签到远程仓库服务器上,必须显式地推送标签。 -git push origin <tagname> +git push origin <tagname> 推送所有不在远程仓库服务器上的标签 -git push origin --tag +git push origin --tag 删除远程标签 -git push origin :refs/tag/<tagname> +git push origin :refs/tag/<tagname> 后期打标签 先用 git log --pretty=oneline 查询提交记录,获取校验码。 -git tag -a <tagname> 9fceb02(校验码) +git tag -a <tagname> 9fceb02(校验码) 检出标签 -git checkout <tagname> +git checkout <tagname> 此时,仓库会处于“分离头指针(detached HEAD)”的状态。 在“分离头指针”状态下,如果你做了某些更改然后提交它们,标签不会发生变化, 但你的新提交将不属于任何分支,并且将无法访问,除非通过确切的提交哈希才能访问。 因此,如果你需要进行更改,比如你要修复旧版本中的错误,那么通常需要创建一个新分支: -git checkout -b <NewBranchName> <tagname> +git checkout -b <NewBranchName> <tagname> 新分支上可以进行提交代码。 十四、常见问题¶ 1. 提交代码时提示邮箱或者名称不对¶ 重新配置邮箱或者名称,然后重置生效: -git commit --amend --reset-author +git commit --amend --reset-author 2. 怎么回滚到之前的版本¶ (1)查询历史提交记录 -git log +git log 找到你要回滚的版本,复制 hash 值。 注意:是 commit 空格之后的 hash 值,之前有同学复制的 Change-Id: 这样肯定报错。 (2)回滚版本,不清除代码 -git reset --soft ${hash} +git reset --soft ${hash} (3)回滚版本,清除代码,慎用哈 -git reset --hard ${hash} +git reset --hard ${hash} 3. 测试报告里面 F S . E 是什么意思¶ F 表示失败,. (点)表示通过,S 表示跳过,E 表示 error 有报错 4. 解决 git status 中文显示的问题¶ -git config --global core.quotePath false +git config --global core.quotePath false 5. apps 目录下颜色有些是黄色的¶ 在 Pycharm 中 apps 目录下应用库文件是黄色的,编辑器识别不到代码新增和修改; @@ -3184,22 +3204,22 @@ 5. apps 目录下颜色有些是黄色的6. 执行 env.sh 报错 $'\r':未找到命令¶ 出现这个问题你应该是在 windows 上打开或编辑过 env.sh 脚本,windows下的换行是回车符+换行符,也就是\r\n,而 Linxu 下是换行符 \n,Linux 下不识别 \r,因此报错。 解决方案: -# 将 \r 替换为空 -sudo sed -i 's/\r//' env.sh +# 将 \r 替换为空 +sudo sed -i 's/\r//' env.sh 7.怎样为单独某一条用例配置执行超时时间¶ 在用例脚本中添加装饰器,如下: -@pytest.mark.timeout(300) # 单位秒 -def test_xxx_001(): - pass +@pytest.mark.timeout(300) # 单位秒 +def test_xxx_001(): + pass 8. 如何拉取 YouQu 自动化项目所有代码,包含子仓库¶ 前置条件:已申请访问 YouQu 权限群组 -# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) -git config --global credential.helper store - -# 拉取YouQu框架代码,并递归拉取子仓库代码 -git clone "http://gerrit.uniontech.com/youqu" --recursive +# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) +git config --global credential.helper store + +# 拉取YouQu框架代码,并递归拉取子仓库代码 +git clone "http://gerrit.uniontech.com/youqu" --recursive 9. 如何拉取 YouQu 自动化项目中指定子仓库的代码¶ 前置条件: @@ -3207,22 +3227,22 @@ 9. 如何拉取 YouQu 自动化项目中指定子仓库的代 已申请访问 YouQu 权限群组 已存储访问密码 -# 拉取YouQu框架代码 -git clone "http://gerrit.uniontech.com/youqu" - -# 指定拉取子仓库代码 -cd youqu -git submodule update --init apps/autotest_xxx_xxx +# 拉取YouQu框架代码 +git clone "http://gerrit.uniontech.com/youqu" + +# 指定拉取子仓库代码 +cd youqu +git submodule update --init apps/autotest_xxx_xxx 10. 如何更新 YouQu 自动化项目中,所有子仓库的代码¶ 更新所有子仓库代码 -cd youqu -git pull & git submodule foreach git pull +cd youqu +git pull & git submodule foreach git pull 11. 如何修复 YouQu 所有子仓库 master 分支游离头(detached head)¶ 修复所有子仓库默认master 分支游离头 -cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
git tag -d <tagname>
git push 命令并不会传送标签到远程仓库服务器上,必须显式地推送标签。
git push origin <tagname> +git push origin <tagname> 推送所有不在远程仓库服务器上的标签 -git push origin --tag +git push origin --tag 删除远程标签 -git push origin :refs/tag/<tagname> +git push origin :refs/tag/<tagname> 后期打标签 先用 git log --pretty=oneline 查询提交记录,获取校验码。 -git tag -a <tagname> 9fceb02(校验码) +git tag -a <tagname> 9fceb02(校验码) 检出标签 -git checkout <tagname> +git checkout <tagname> 此时,仓库会处于“分离头指针(detached HEAD)”的状态。 在“分离头指针”状态下,如果你做了某些更改然后提交它们,标签不会发生变化, 但你的新提交将不属于任何分支,并且将无法访问,除非通过确切的提交哈希才能访问。 因此,如果你需要进行更改,比如你要修复旧版本中的错误,那么通常需要创建一个新分支: -git checkout -b <NewBranchName> <tagname> +git checkout -b <NewBranchName> <tagname> 新分支上可以进行提交代码。 十四、常见问题¶ 1. 提交代码时提示邮箱或者名称不对¶ 重新配置邮箱或者名称,然后重置生效: -git commit --amend --reset-author +git commit --amend --reset-author 2. 怎么回滚到之前的版本¶ (1)查询历史提交记录 -git log +git log 找到你要回滚的版本,复制 hash 值。 注意:是 commit 空格之后的 hash 值,之前有同学复制的 Change-Id: 这样肯定报错。 (2)回滚版本,不清除代码 -git reset --soft ${hash} +git reset --soft ${hash} (3)回滚版本,清除代码,慎用哈 -git reset --hard ${hash} +git reset --hard ${hash} 3. 测试报告里面 F S . E 是什么意思¶ F 表示失败,. (点)表示通过,S 表示跳过,E 表示 error 有报错 4. 解决 git status 中文显示的问题¶ -git config --global core.quotePath false +git config --global core.quotePath false 5. apps 目录下颜色有些是黄色的¶ 在 Pycharm 中 apps 目录下应用库文件是黄色的,编辑器识别不到代码新增和修改; @@ -3184,22 +3204,22 @@ 5. apps 目录下颜色有些是黄色的6. 执行 env.sh 报错 $'\r':未找到命令¶ 出现这个问题你应该是在 windows 上打开或编辑过 env.sh 脚本,windows下的换行是回车符+换行符,也就是\r\n,而 Linxu 下是换行符 \n,Linux 下不识别 \r,因此报错。 解决方案: -# 将 \r 替换为空 -sudo sed -i 's/\r//' env.sh +# 将 \r 替换为空 +sudo sed -i 's/\r//' env.sh 7.怎样为单独某一条用例配置执行超时时间¶ 在用例脚本中添加装饰器,如下: -@pytest.mark.timeout(300) # 单位秒 -def test_xxx_001(): - pass +@pytest.mark.timeout(300) # 单位秒 +def test_xxx_001(): + pass 8. 如何拉取 YouQu 自动化项目所有代码,包含子仓库¶ 前置条件:已申请访问 YouQu 权限群组 -# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) -git config --global credential.helper store - -# 拉取YouQu框架代码,并递归拉取子仓库代码 -git clone "http://gerrit.uniontech.com/youqu" --recursive +# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) +git config --global credential.helper store + +# 拉取YouQu框架代码,并递归拉取子仓库代码 +git clone "http://gerrit.uniontech.com/youqu" --recursive 9. 如何拉取 YouQu 自动化项目中指定子仓库的代码¶ 前置条件: @@ -3207,22 +3227,22 @@ 9. 如何拉取 YouQu 自动化项目中指定子仓库的代 已申请访问 YouQu 权限群组 已存储访问密码 -# 拉取YouQu框架代码 -git clone "http://gerrit.uniontech.com/youqu" - -# 指定拉取子仓库代码 -cd youqu -git submodule update --init apps/autotest_xxx_xxx +# 拉取YouQu框架代码 +git clone "http://gerrit.uniontech.com/youqu" + +# 指定拉取子仓库代码 +cd youqu +git submodule update --init apps/autotest_xxx_xxx 10. 如何更新 YouQu 自动化项目中,所有子仓库的代码¶ 更新所有子仓库代码 -cd youqu -git pull & git submodule foreach git pull +cd youqu +git pull & git submodule foreach git pull 11. 如何修复 YouQu 所有子仓库 master 分支游离头(detached head)¶ 修复所有子仓库默认master 分支游离头 -cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
git push origin <tagname>
推送所有不在远程仓库服务器上的标签
git push origin --tag +git push origin --tag 删除远程标签 -git push origin :refs/tag/<tagname> +git push origin :refs/tag/<tagname> 后期打标签 先用 git log --pretty=oneline 查询提交记录,获取校验码。 -git tag -a <tagname> 9fceb02(校验码) +git tag -a <tagname> 9fceb02(校验码) 检出标签 -git checkout <tagname> +git checkout <tagname> 此时,仓库会处于“分离头指针(detached HEAD)”的状态。 在“分离头指针”状态下,如果你做了某些更改然后提交它们,标签不会发生变化, 但你的新提交将不属于任何分支,并且将无法访问,除非通过确切的提交哈希才能访问。 因此,如果你需要进行更改,比如你要修复旧版本中的错误,那么通常需要创建一个新分支: -git checkout -b <NewBranchName> <tagname> +git checkout -b <NewBranchName> <tagname> 新分支上可以进行提交代码。 十四、常见问题¶ 1. 提交代码时提示邮箱或者名称不对¶ 重新配置邮箱或者名称,然后重置生效: -git commit --amend --reset-author +git commit --amend --reset-author 2. 怎么回滚到之前的版本¶ (1)查询历史提交记录 -git log +git log 找到你要回滚的版本,复制 hash 值。 注意:是 commit 空格之后的 hash 值,之前有同学复制的 Change-Id: 这样肯定报错。 (2)回滚版本,不清除代码 -git reset --soft ${hash} +git reset --soft ${hash} (3)回滚版本,清除代码,慎用哈 -git reset --hard ${hash} +git reset --hard ${hash} 3. 测试报告里面 F S . E 是什么意思¶ F 表示失败,. (点)表示通过,S 表示跳过,E 表示 error 有报错 4. 解决 git status 中文显示的问题¶ -git config --global core.quotePath false +git config --global core.quotePath false 5. apps 目录下颜色有些是黄色的¶ 在 Pycharm 中 apps 目录下应用库文件是黄色的,编辑器识别不到代码新增和修改; @@ -3184,22 +3204,22 @@ 5. apps 目录下颜色有些是黄色的6. 执行 env.sh 报错 $'\r':未找到命令¶ 出现这个问题你应该是在 windows 上打开或编辑过 env.sh 脚本,windows下的换行是回车符+换行符,也就是\r\n,而 Linxu 下是换行符 \n,Linux 下不识别 \r,因此报错。 解决方案: -# 将 \r 替换为空 -sudo sed -i 's/\r//' env.sh +# 将 \r 替换为空 +sudo sed -i 's/\r//' env.sh 7.怎样为单独某一条用例配置执行超时时间¶ 在用例脚本中添加装饰器,如下: -@pytest.mark.timeout(300) # 单位秒 -def test_xxx_001(): - pass +@pytest.mark.timeout(300) # 单位秒 +def test_xxx_001(): + pass 8. 如何拉取 YouQu 自动化项目所有代码,包含子仓库¶ 前置条件:已申请访问 YouQu 权限群组 -# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) -git config --global credential.helper store - -# 拉取YouQu框架代码,并递归拉取子仓库代码 -git clone "http://gerrit.uniontech.com/youqu" --recursive +# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) +git config --global credential.helper store + +# 拉取YouQu框架代码,并递归拉取子仓库代码 +git clone "http://gerrit.uniontech.com/youqu" --recursive 9. 如何拉取 YouQu 自动化项目中指定子仓库的代码¶ 前置条件: @@ -3207,22 +3227,22 @@ 9. 如何拉取 YouQu 自动化项目中指定子仓库的代 已申请访问 YouQu 权限群组 已存储访问密码 -# 拉取YouQu框架代码 -git clone "http://gerrit.uniontech.com/youqu" - -# 指定拉取子仓库代码 -cd youqu -git submodule update --init apps/autotest_xxx_xxx +# 拉取YouQu框架代码 +git clone "http://gerrit.uniontech.com/youqu" + +# 指定拉取子仓库代码 +cd youqu +git submodule update --init apps/autotest_xxx_xxx 10. 如何更新 YouQu 自动化项目中,所有子仓库的代码¶ 更新所有子仓库代码 -cd youqu -git pull & git submodule foreach git pull +cd youqu +git pull & git submodule foreach git pull 11. 如何修复 YouQu 所有子仓库 master 分支游离头(detached head)¶ 修复所有子仓库默认master 分支游离头 -cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
git push origin --tag
git push origin :refs/tag/<tagname> +git push origin :refs/tag/<tagname> 后期打标签 先用 git log --pretty=oneline 查询提交记录,获取校验码。 -git tag -a <tagname> 9fceb02(校验码) +git tag -a <tagname> 9fceb02(校验码) 检出标签 -git checkout <tagname> +git checkout <tagname> 此时,仓库会处于“分离头指针(detached HEAD)”的状态。 在“分离头指针”状态下,如果你做了某些更改然后提交它们,标签不会发生变化, 但你的新提交将不属于任何分支,并且将无法访问,除非通过确切的提交哈希才能访问。 因此,如果你需要进行更改,比如你要修复旧版本中的错误,那么通常需要创建一个新分支: -git checkout -b <NewBranchName> <tagname> +git checkout -b <NewBranchName> <tagname> 新分支上可以进行提交代码。 十四、常见问题¶ 1. 提交代码时提示邮箱或者名称不对¶ 重新配置邮箱或者名称,然后重置生效: -git commit --amend --reset-author +git commit --amend --reset-author 2. 怎么回滚到之前的版本¶ (1)查询历史提交记录 -git log +git log 找到你要回滚的版本,复制 hash 值。 注意:是 commit 空格之后的 hash 值,之前有同学复制的 Change-Id: 这样肯定报错。 (2)回滚版本,不清除代码 -git reset --soft ${hash} +git reset --soft ${hash} (3)回滚版本,清除代码,慎用哈 -git reset --hard ${hash} +git reset --hard ${hash} 3. 测试报告里面 F S . E 是什么意思¶ F 表示失败,. (点)表示通过,S 表示跳过,E 表示 error 有报错 4. 解决 git status 中文显示的问题¶ -git config --global core.quotePath false +git config --global core.quotePath false 5. apps 目录下颜色有些是黄色的¶ 在 Pycharm 中 apps 目录下应用库文件是黄色的,编辑器识别不到代码新增和修改; @@ -3184,22 +3204,22 @@ 5. apps 目录下颜色有些是黄色的6. 执行 env.sh 报错 $'\r':未找到命令¶ 出现这个问题你应该是在 windows 上打开或编辑过 env.sh 脚本,windows下的换行是回车符+换行符,也就是\r\n,而 Linxu 下是换行符 \n,Linux 下不识别 \r,因此报错。 解决方案: -# 将 \r 替换为空 -sudo sed -i 's/\r//' env.sh +# 将 \r 替换为空 +sudo sed -i 's/\r//' env.sh 7.怎样为单独某一条用例配置执行超时时间¶ 在用例脚本中添加装饰器,如下: -@pytest.mark.timeout(300) # 单位秒 -def test_xxx_001(): - pass +@pytest.mark.timeout(300) # 单位秒 +def test_xxx_001(): + pass 8. 如何拉取 YouQu 自动化项目所有代码,包含子仓库¶ 前置条件:已申请访问 YouQu 权限群组 -# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) -git config --global credential.helper store - -# 拉取YouQu框架代码,并递归拉取子仓库代码 -git clone "http://gerrit.uniontech.com/youqu" --recursive +# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) +git config --global credential.helper store + +# 拉取YouQu框架代码,并递归拉取子仓库代码 +git clone "http://gerrit.uniontech.com/youqu" --recursive 9. 如何拉取 YouQu 自动化项目中指定子仓库的代码¶ 前置条件: @@ -3207,22 +3227,22 @@ 9. 如何拉取 YouQu 自动化项目中指定子仓库的代 已申请访问 YouQu 权限群组 已存储访问密码 -# 拉取YouQu框架代码 -git clone "http://gerrit.uniontech.com/youqu" - -# 指定拉取子仓库代码 -cd youqu -git submodule update --init apps/autotest_xxx_xxx +# 拉取YouQu框架代码 +git clone "http://gerrit.uniontech.com/youqu" + +# 指定拉取子仓库代码 +cd youqu +git submodule update --init apps/autotest_xxx_xxx 10. 如何更新 YouQu 自动化项目中,所有子仓库的代码¶ 更新所有子仓库代码 -cd youqu -git pull & git submodule foreach git pull +cd youqu +git pull & git submodule foreach git pull 11. 如何修复 YouQu 所有子仓库 master 分支游离头(detached head)¶ 修复所有子仓库默认master 分支游离头 -cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
git push origin :refs/tag/<tagname>
先用 git log --pretty=oneline 查询提交记录,获取校验码。
git tag -a <tagname> 9fceb02(校验码) +git tag -a <tagname> 9fceb02(校验码) 检出标签 -git checkout <tagname> +git checkout <tagname> 此时,仓库会处于“分离头指针(detached HEAD)”的状态。 在“分离头指针”状态下,如果你做了某些更改然后提交它们,标签不会发生变化, 但你的新提交将不属于任何分支,并且将无法访问,除非通过确切的提交哈希才能访问。 因此,如果你需要进行更改,比如你要修复旧版本中的错误,那么通常需要创建一个新分支: -git checkout -b <NewBranchName> <tagname> +git checkout -b <NewBranchName> <tagname> 新分支上可以进行提交代码。 十四、常见问题¶ 1. 提交代码时提示邮箱或者名称不对¶ 重新配置邮箱或者名称,然后重置生效: -git commit --amend --reset-author +git commit --amend --reset-author 2. 怎么回滚到之前的版本¶ (1)查询历史提交记录 -git log +git log 找到你要回滚的版本,复制 hash 值。 注意:是 commit 空格之后的 hash 值,之前有同学复制的 Change-Id: 这样肯定报错。 (2)回滚版本,不清除代码 -git reset --soft ${hash} +git reset --soft ${hash} (3)回滚版本,清除代码,慎用哈 -git reset --hard ${hash} +git reset --hard ${hash} 3. 测试报告里面 F S . E 是什么意思¶ F 表示失败,. (点)表示通过,S 表示跳过,E 表示 error 有报错 4. 解决 git status 中文显示的问题¶ -git config --global core.quotePath false +git config --global core.quotePath false 5. apps 目录下颜色有些是黄色的¶ 在 Pycharm 中 apps 目录下应用库文件是黄色的,编辑器识别不到代码新增和修改; @@ -3184,22 +3204,22 @@ 5. apps 目录下颜色有些是黄色的6. 执行 env.sh 报错 $'\r':未找到命令¶ 出现这个问题你应该是在 windows 上打开或编辑过 env.sh 脚本,windows下的换行是回车符+换行符,也就是\r\n,而 Linxu 下是换行符 \n,Linux 下不识别 \r,因此报错。 解决方案: -# 将 \r 替换为空 -sudo sed -i 's/\r//' env.sh +# 将 \r 替换为空 +sudo sed -i 's/\r//' env.sh 7.怎样为单独某一条用例配置执行超时时间¶ 在用例脚本中添加装饰器,如下: -@pytest.mark.timeout(300) # 单位秒 -def test_xxx_001(): - pass +@pytest.mark.timeout(300) # 单位秒 +def test_xxx_001(): + pass 8. 如何拉取 YouQu 自动化项目所有代码,包含子仓库¶ 前置条件:已申请访问 YouQu 权限群组 -# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) -git config --global credential.helper store - -# 拉取YouQu框架代码,并递归拉取子仓库代码 -git clone "http://gerrit.uniontech.com/youqu" --recursive +# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) +git config --global credential.helper store + +# 拉取YouQu框架代码,并递归拉取子仓库代码 +git clone "http://gerrit.uniontech.com/youqu" --recursive 9. 如何拉取 YouQu 自动化项目中指定子仓库的代码¶ 前置条件: @@ -3207,22 +3227,22 @@ 9. 如何拉取 YouQu 自动化项目中指定子仓库的代 已申请访问 YouQu 权限群组 已存储访问密码 -# 拉取YouQu框架代码 -git clone "http://gerrit.uniontech.com/youqu" - -# 指定拉取子仓库代码 -cd youqu -git submodule update --init apps/autotest_xxx_xxx +# 拉取YouQu框架代码 +git clone "http://gerrit.uniontech.com/youqu" + +# 指定拉取子仓库代码 +cd youqu +git submodule update --init apps/autotest_xxx_xxx 10. 如何更新 YouQu 自动化项目中,所有子仓库的代码¶ 更新所有子仓库代码 -cd youqu -git pull & git submodule foreach git pull +cd youqu +git pull & git submodule foreach git pull 11. 如何修复 YouQu 所有子仓库 master 分支游离头(detached head)¶ 修复所有子仓库默认master 分支游离头 -cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
git tag -a <tagname> 9fceb02(校验码)
git checkout <tagname> +git checkout <tagname> 此时,仓库会处于“分离头指针(detached HEAD)”的状态。 在“分离头指针”状态下,如果你做了某些更改然后提交它们,标签不会发生变化, 但你的新提交将不属于任何分支,并且将无法访问,除非通过确切的提交哈希才能访问。 因此,如果你需要进行更改,比如你要修复旧版本中的错误,那么通常需要创建一个新分支: -git checkout -b <NewBranchName> <tagname> +git checkout -b <NewBranchName> <tagname> 新分支上可以进行提交代码。 十四、常见问题¶ 1. 提交代码时提示邮箱或者名称不对¶ 重新配置邮箱或者名称,然后重置生效: -git commit --amend --reset-author +git commit --amend --reset-author 2. 怎么回滚到之前的版本¶ (1)查询历史提交记录 -git log +git log 找到你要回滚的版本,复制 hash 值。 注意:是 commit 空格之后的 hash 值,之前有同学复制的 Change-Id: 这样肯定报错。 (2)回滚版本,不清除代码 -git reset --soft ${hash} +git reset --soft ${hash} (3)回滚版本,清除代码,慎用哈 -git reset --hard ${hash} +git reset --hard ${hash} 3. 测试报告里面 F S . E 是什么意思¶ F 表示失败,. (点)表示通过,S 表示跳过,E 表示 error 有报错 4. 解决 git status 中文显示的问题¶ -git config --global core.quotePath false +git config --global core.quotePath false 5. apps 目录下颜色有些是黄色的¶ 在 Pycharm 中 apps 目录下应用库文件是黄色的,编辑器识别不到代码新增和修改; @@ -3184,22 +3204,22 @@ 5. apps 目录下颜色有些是黄色的6. 执行 env.sh 报错 $'\r':未找到命令¶ 出现这个问题你应该是在 windows 上打开或编辑过 env.sh 脚本,windows下的换行是回车符+换行符,也就是\r\n,而 Linxu 下是换行符 \n,Linux 下不识别 \r,因此报错。 解决方案: -# 将 \r 替换为空 -sudo sed -i 's/\r//' env.sh +# 将 \r 替换为空 +sudo sed -i 's/\r//' env.sh 7.怎样为单独某一条用例配置执行超时时间¶ 在用例脚本中添加装饰器,如下: -@pytest.mark.timeout(300) # 单位秒 -def test_xxx_001(): - pass +@pytest.mark.timeout(300) # 单位秒 +def test_xxx_001(): + pass 8. 如何拉取 YouQu 自动化项目所有代码,包含子仓库¶ 前置条件:已申请访问 YouQu 权限群组 -# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) -git config --global credential.helper store - -# 拉取YouQu框架代码,并递归拉取子仓库代码 -git clone "http://gerrit.uniontech.com/youqu" --recursive +# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) +git config --global credential.helper store + +# 拉取YouQu框架代码,并递归拉取子仓库代码 +git clone "http://gerrit.uniontech.com/youqu" --recursive 9. 如何拉取 YouQu 自动化项目中指定子仓库的代码¶ 前置条件: @@ -3207,22 +3227,22 @@ 9. 如何拉取 YouQu 自动化项目中指定子仓库的代 已申请访问 YouQu 权限群组 已存储访问密码 -# 拉取YouQu框架代码 -git clone "http://gerrit.uniontech.com/youqu" - -# 指定拉取子仓库代码 -cd youqu -git submodule update --init apps/autotest_xxx_xxx +# 拉取YouQu框架代码 +git clone "http://gerrit.uniontech.com/youqu" + +# 指定拉取子仓库代码 +cd youqu +git submodule update --init apps/autotest_xxx_xxx 10. 如何更新 YouQu 自动化项目中,所有子仓库的代码¶ 更新所有子仓库代码 -cd youqu -git pull & git submodule foreach git pull +cd youqu +git pull & git submodule foreach git pull 11. 如何修复 YouQu 所有子仓库 master 分支游离头(detached head)¶ 修复所有子仓库默认master 分支游离头 -cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
git checkout <tagname>
此时,仓库会处于“分离头指针(detached HEAD)”的状态。
在“分离头指针”状态下,如果你做了某些更改然后提交它们,标签不会发生变化, 但你的新提交将不属于任何分支,并且将无法访问,除非通过确切的提交哈希才能访问。
因此,如果你需要进行更改,比如你要修复旧版本中的错误,那么通常需要创建一个新分支:
git checkout -b <NewBranchName> <tagname> +git checkout -b <NewBranchName> <tagname> 新分支上可以进行提交代码。 十四、常见问题¶ 1. 提交代码时提示邮箱或者名称不对¶ 重新配置邮箱或者名称,然后重置生效: -git commit --amend --reset-author +git commit --amend --reset-author 2. 怎么回滚到之前的版本¶ (1)查询历史提交记录 -git log +git log 找到你要回滚的版本,复制 hash 值。 注意:是 commit 空格之后的 hash 值,之前有同学复制的 Change-Id: 这样肯定报错。 (2)回滚版本,不清除代码 -git reset --soft ${hash} +git reset --soft ${hash} (3)回滚版本,清除代码,慎用哈 -git reset --hard ${hash} +git reset --hard ${hash} 3. 测试报告里面 F S . E 是什么意思¶ F 表示失败,. (点)表示通过,S 表示跳过,E 表示 error 有报错 4. 解决 git status 中文显示的问题¶ -git config --global core.quotePath false +git config --global core.quotePath false 5. apps 目录下颜色有些是黄色的¶ 在 Pycharm 中 apps 目录下应用库文件是黄色的,编辑器识别不到代码新增和修改; @@ -3184,22 +3204,22 @@ 5. apps 目录下颜色有些是黄色的6. 执行 env.sh 报错 $'\r':未找到命令¶ 出现这个问题你应该是在 windows 上打开或编辑过 env.sh 脚本,windows下的换行是回车符+换行符,也就是\r\n,而 Linxu 下是换行符 \n,Linux 下不识别 \r,因此报错。 解决方案: -# 将 \r 替换为空 -sudo sed -i 's/\r//' env.sh +# 将 \r 替换为空 +sudo sed -i 's/\r//' env.sh 7.怎样为单独某一条用例配置执行超时时间¶ 在用例脚本中添加装饰器,如下: -@pytest.mark.timeout(300) # 单位秒 -def test_xxx_001(): - pass +@pytest.mark.timeout(300) # 单位秒 +def test_xxx_001(): + pass 8. 如何拉取 YouQu 自动化项目所有代码,包含子仓库¶ 前置条件:已申请访问 YouQu 权限群组 -# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) -git config --global credential.helper store - -# 拉取YouQu框架代码,并递归拉取子仓库代码 -git clone "http://gerrit.uniontech.com/youqu" --recursive +# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) +git config --global credential.helper store + +# 拉取YouQu框架代码,并递归拉取子仓库代码 +git clone "http://gerrit.uniontech.com/youqu" --recursive 9. 如何拉取 YouQu 自动化项目中指定子仓库的代码¶ 前置条件: @@ -3207,22 +3227,22 @@ 9. 如何拉取 YouQu 自动化项目中指定子仓库的代 已申请访问 YouQu 权限群组 已存储访问密码 -# 拉取YouQu框架代码 -git clone "http://gerrit.uniontech.com/youqu" - -# 指定拉取子仓库代码 -cd youqu -git submodule update --init apps/autotest_xxx_xxx +# 拉取YouQu框架代码 +git clone "http://gerrit.uniontech.com/youqu" + +# 指定拉取子仓库代码 +cd youqu +git submodule update --init apps/autotest_xxx_xxx 10. 如何更新 YouQu 自动化项目中,所有子仓库的代码¶ 更新所有子仓库代码 -cd youqu -git pull & git submodule foreach git pull +cd youqu +git pull & git submodule foreach git pull 11. 如何修复 YouQu 所有子仓库 master 分支游离头(detached head)¶ 修复所有子仓库默认master 分支游离头 -cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
git checkout -b <NewBranchName> <tagname>
新分支上可以进行提交代码。
重新配置邮箱或者名称,然后重置生效:
git commit --amend --reset-author +git commit --amend --reset-author 2. 怎么回滚到之前的版本¶ (1)查询历史提交记录 -git log +git log 找到你要回滚的版本,复制 hash 值。 注意:是 commit 空格之后的 hash 值,之前有同学复制的 Change-Id: 这样肯定报错。 (2)回滚版本,不清除代码 -git reset --soft ${hash} +git reset --soft ${hash} (3)回滚版本,清除代码,慎用哈 -git reset --hard ${hash} +git reset --hard ${hash} 3. 测试报告里面 F S . E 是什么意思¶ F 表示失败,. (点)表示通过,S 表示跳过,E 表示 error 有报错 4. 解决 git status 中文显示的问题¶ -git config --global core.quotePath false +git config --global core.quotePath false 5. apps 目录下颜色有些是黄色的¶ 在 Pycharm 中 apps 目录下应用库文件是黄色的,编辑器识别不到代码新增和修改; @@ -3184,22 +3204,22 @@ 5. apps 目录下颜色有些是黄色的6. 执行 env.sh 报错 $'\r':未找到命令¶ 出现这个问题你应该是在 windows 上打开或编辑过 env.sh 脚本,windows下的换行是回车符+换行符,也就是\r\n,而 Linxu 下是换行符 \n,Linux 下不识别 \r,因此报错。 解决方案: -# 将 \r 替换为空 -sudo sed -i 's/\r//' env.sh +# 将 \r 替换为空 +sudo sed -i 's/\r//' env.sh 7.怎样为单独某一条用例配置执行超时时间¶ 在用例脚本中添加装饰器,如下: -@pytest.mark.timeout(300) # 单位秒 -def test_xxx_001(): - pass +@pytest.mark.timeout(300) # 单位秒 +def test_xxx_001(): + pass 8. 如何拉取 YouQu 自动化项目所有代码,包含子仓库¶ 前置条件:已申请访问 YouQu 权限群组 -# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) -git config --global credential.helper store - -# 拉取YouQu框架代码,并递归拉取子仓库代码 -git clone "http://gerrit.uniontech.com/youqu" --recursive +# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) +git config --global credential.helper store + +# 拉取YouQu框架代码,并递归拉取子仓库代码 +git clone "http://gerrit.uniontech.com/youqu" --recursive 9. 如何拉取 YouQu 自动化项目中指定子仓库的代码¶ 前置条件: @@ -3207,22 +3227,22 @@ 9. 如何拉取 YouQu 自动化项目中指定子仓库的代 已申请访问 YouQu 权限群组 已存储访问密码 -# 拉取YouQu框架代码 -git clone "http://gerrit.uniontech.com/youqu" - -# 指定拉取子仓库代码 -cd youqu -git submodule update --init apps/autotest_xxx_xxx +# 拉取YouQu框架代码 +git clone "http://gerrit.uniontech.com/youqu" + +# 指定拉取子仓库代码 +cd youqu +git submodule update --init apps/autotest_xxx_xxx 10. 如何更新 YouQu 自动化项目中,所有子仓库的代码¶ 更新所有子仓库代码 -cd youqu -git pull & git submodule foreach git pull +cd youqu +git pull & git submodule foreach git pull 11. 如何修复 YouQu 所有子仓库 master 分支游离头(detached head)¶ 修复所有子仓库默认master 分支游离头 -cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
git commit --amend --reset-author
(1)查询历史提交记录
git log +git log 找到你要回滚的版本,复制 hash 值。 注意:是 commit 空格之后的 hash 值,之前有同学复制的 Change-Id: 这样肯定报错。 (2)回滚版本,不清除代码 -git reset --soft ${hash} +git reset --soft ${hash} (3)回滚版本,清除代码,慎用哈 -git reset --hard ${hash} +git reset --hard ${hash} 3. 测试报告里面 F S . E 是什么意思¶ F 表示失败,. (点)表示通过,S 表示跳过,E 表示 error 有报错 4. 解决 git status 中文显示的问题¶ -git config --global core.quotePath false +git config --global core.quotePath false 5. apps 目录下颜色有些是黄色的¶ 在 Pycharm 中 apps 目录下应用库文件是黄色的,编辑器识别不到代码新增和修改; @@ -3184,22 +3204,22 @@ 5. apps 目录下颜色有些是黄色的6. 执行 env.sh 报错 $'\r':未找到命令¶ 出现这个问题你应该是在 windows 上打开或编辑过 env.sh 脚本,windows下的换行是回车符+换行符,也就是\r\n,而 Linxu 下是换行符 \n,Linux 下不识别 \r,因此报错。 解决方案: -# 将 \r 替换为空 -sudo sed -i 's/\r//' env.sh +# 将 \r 替换为空 +sudo sed -i 's/\r//' env.sh 7.怎样为单独某一条用例配置执行超时时间¶ 在用例脚本中添加装饰器,如下: -@pytest.mark.timeout(300) # 单位秒 -def test_xxx_001(): - pass +@pytest.mark.timeout(300) # 单位秒 +def test_xxx_001(): + pass 8. 如何拉取 YouQu 自动化项目所有代码,包含子仓库¶ 前置条件:已申请访问 YouQu 权限群组 -# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) -git config --global credential.helper store - -# 拉取YouQu框架代码,并递归拉取子仓库代码 -git clone "http://gerrit.uniontech.com/youqu" --recursive +# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) +git config --global credential.helper store + +# 拉取YouQu框架代码,并递归拉取子仓库代码 +git clone "http://gerrit.uniontech.com/youqu" --recursive 9. 如何拉取 YouQu 自动化项目中指定子仓库的代码¶ 前置条件: @@ -3207,22 +3227,22 @@ 9. 如何拉取 YouQu 自动化项目中指定子仓库的代 已申请访问 YouQu 权限群组 已存储访问密码 -# 拉取YouQu框架代码 -git clone "http://gerrit.uniontech.com/youqu" - -# 指定拉取子仓库代码 -cd youqu -git submodule update --init apps/autotest_xxx_xxx +# 拉取YouQu框架代码 +git clone "http://gerrit.uniontech.com/youqu" + +# 指定拉取子仓库代码 +cd youqu +git submodule update --init apps/autotest_xxx_xxx 10. 如何更新 YouQu 自动化项目中,所有子仓库的代码¶ 更新所有子仓库代码 -cd youqu -git pull & git submodule foreach git pull +cd youqu +git pull & git submodule foreach git pull 11. 如何修复 YouQu 所有子仓库 master 分支游离头(detached head)¶ 修复所有子仓库默认master 分支游离头 -cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
git log
找到你要回滚的版本,复制 hash 值。
(2)回滚版本,不清除代码
git reset --soft ${hash} +git reset --soft ${hash} (3)回滚版本,清除代码,慎用哈 -git reset --hard ${hash} +git reset --hard ${hash} 3. 测试报告里面 F S . E 是什么意思¶ F 表示失败,. (点)表示通过,S 表示跳过,E 表示 error 有报错 4. 解决 git status 中文显示的问题¶ -git config --global core.quotePath false +git config --global core.quotePath false 5. apps 目录下颜色有些是黄色的¶ 在 Pycharm 中 apps 目录下应用库文件是黄色的,编辑器识别不到代码新增和修改; @@ -3184,22 +3204,22 @@ 5. apps 目录下颜色有些是黄色的6. 执行 env.sh 报错 $'\r':未找到命令¶ 出现这个问题你应该是在 windows 上打开或编辑过 env.sh 脚本,windows下的换行是回车符+换行符,也就是\r\n,而 Linxu 下是换行符 \n,Linux 下不识别 \r,因此报错。 解决方案: -# 将 \r 替换为空 -sudo sed -i 's/\r//' env.sh +# 将 \r 替换为空 +sudo sed -i 's/\r//' env.sh 7.怎样为单独某一条用例配置执行超时时间¶ 在用例脚本中添加装饰器,如下: -@pytest.mark.timeout(300) # 单位秒 -def test_xxx_001(): - pass +@pytest.mark.timeout(300) # 单位秒 +def test_xxx_001(): + pass 8. 如何拉取 YouQu 自动化项目所有代码,包含子仓库¶ 前置条件:已申请访问 YouQu 权限群组 -# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) -git config --global credential.helper store - -# 拉取YouQu框架代码,并递归拉取子仓库代码 -git clone "http://gerrit.uniontech.com/youqu" --recursive +# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) +git config --global credential.helper store + +# 拉取YouQu框架代码,并递归拉取子仓库代码 +git clone "http://gerrit.uniontech.com/youqu" --recursive 9. 如何拉取 YouQu 自动化项目中指定子仓库的代码¶ 前置条件: @@ -3207,22 +3227,22 @@ 9. 如何拉取 YouQu 自动化项目中指定子仓库的代 已申请访问 YouQu 权限群组 已存储访问密码 -# 拉取YouQu框架代码 -git clone "http://gerrit.uniontech.com/youqu" - -# 指定拉取子仓库代码 -cd youqu -git submodule update --init apps/autotest_xxx_xxx +# 拉取YouQu框架代码 +git clone "http://gerrit.uniontech.com/youqu" + +# 指定拉取子仓库代码 +cd youqu +git submodule update --init apps/autotest_xxx_xxx 10. 如何更新 YouQu 自动化项目中,所有子仓库的代码¶ 更新所有子仓库代码 -cd youqu -git pull & git submodule foreach git pull +cd youqu +git pull & git submodule foreach git pull 11. 如何修复 YouQu 所有子仓库 master 分支游离头(detached head)¶ 修复所有子仓库默认master 分支游离头 -cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
git reset --soft ${hash}
(3)回滚版本,清除代码,慎用哈
git reset --hard ${hash} +git reset --hard ${hash} 3. 测试报告里面 F S . E 是什么意思¶ F 表示失败,. (点)表示通过,S 表示跳过,E 表示 error 有报错 4. 解决 git status 中文显示的问题¶ -git config --global core.quotePath false +git config --global core.quotePath false 5. apps 目录下颜色有些是黄色的¶ 在 Pycharm 中 apps 目录下应用库文件是黄色的,编辑器识别不到代码新增和修改; @@ -3184,22 +3204,22 @@ 5. apps 目录下颜色有些是黄色的6. 执行 env.sh 报错 $'\r':未找到命令¶ 出现这个问题你应该是在 windows 上打开或编辑过 env.sh 脚本,windows下的换行是回车符+换行符,也就是\r\n,而 Linxu 下是换行符 \n,Linux 下不识别 \r,因此报错。 解决方案: -# 将 \r 替换为空 -sudo sed -i 's/\r//' env.sh +# 将 \r 替换为空 +sudo sed -i 's/\r//' env.sh 7.怎样为单独某一条用例配置执行超时时间¶ 在用例脚本中添加装饰器,如下: -@pytest.mark.timeout(300) # 单位秒 -def test_xxx_001(): - pass +@pytest.mark.timeout(300) # 单位秒 +def test_xxx_001(): + pass 8. 如何拉取 YouQu 自动化项目所有代码,包含子仓库¶ 前置条件:已申请访问 YouQu 权限群组 -# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) -git config --global credential.helper store - -# 拉取YouQu框架代码,并递归拉取子仓库代码 -git clone "http://gerrit.uniontech.com/youqu" --recursive +# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) +git config --global credential.helper store + +# 拉取YouQu框架代码,并递归拉取子仓库代码 +git clone "http://gerrit.uniontech.com/youqu" --recursive 9. 如何拉取 YouQu 自动化项目中指定子仓库的代码¶ 前置条件: @@ -3207,22 +3227,22 @@ 9. 如何拉取 YouQu 自动化项目中指定子仓库的代 已申请访问 YouQu 权限群组 已存储访问密码 -# 拉取YouQu框架代码 -git clone "http://gerrit.uniontech.com/youqu" - -# 指定拉取子仓库代码 -cd youqu -git submodule update --init apps/autotest_xxx_xxx +# 拉取YouQu框架代码 +git clone "http://gerrit.uniontech.com/youqu" + +# 指定拉取子仓库代码 +cd youqu +git submodule update --init apps/autotest_xxx_xxx 10. 如何更新 YouQu 自动化项目中,所有子仓库的代码¶ 更新所有子仓库代码 -cd youqu -git pull & git submodule foreach git pull +cd youqu +git pull & git submodule foreach git pull 11. 如何修复 YouQu 所有子仓库 master 分支游离头(detached head)¶ 修复所有子仓库默认master 分支游离头 -cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
git reset --hard ${hash}
F 表示失败,. (点)表示通过,S 表示跳过,E 表示 error 有报错
git config --global core.quotePath false +git config --global core.quotePath false 5. apps 目录下颜色有些是黄色的¶ 在 Pycharm 中 apps 目录下应用库文件是黄色的,编辑器识别不到代码新增和修改; @@ -3184,22 +3204,22 @@ 5. apps 目录下颜色有些是黄色的6. 执行 env.sh 报错 $'\r':未找到命令¶ 出现这个问题你应该是在 windows 上打开或编辑过 env.sh 脚本,windows下的换行是回车符+换行符,也就是\r\n,而 Linxu 下是换行符 \n,Linux 下不识别 \r,因此报错。 解决方案: -# 将 \r 替换为空 -sudo sed -i 's/\r//' env.sh +# 将 \r 替换为空 +sudo sed -i 's/\r//' env.sh 7.怎样为单独某一条用例配置执行超时时间¶ 在用例脚本中添加装饰器,如下: -@pytest.mark.timeout(300) # 单位秒 -def test_xxx_001(): - pass +@pytest.mark.timeout(300) # 单位秒 +def test_xxx_001(): + pass 8. 如何拉取 YouQu 自动化项目所有代码,包含子仓库¶ 前置条件:已申请访问 YouQu 权限群组 -# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) -git config --global credential.helper store - -# 拉取YouQu框架代码,并递归拉取子仓库代码 -git clone "http://gerrit.uniontech.com/youqu" --recursive +# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) +git config --global credential.helper store + +# 拉取YouQu框架代码,并递归拉取子仓库代码 +git clone "http://gerrit.uniontech.com/youqu" --recursive 9. 如何拉取 YouQu 自动化项目中指定子仓库的代码¶ 前置条件: @@ -3207,22 +3227,22 @@ 9. 如何拉取 YouQu 自动化项目中指定子仓库的代 已申请访问 YouQu 权限群组 已存储访问密码 -# 拉取YouQu框架代码 -git clone "http://gerrit.uniontech.com/youqu" - -# 指定拉取子仓库代码 -cd youqu -git submodule update --init apps/autotest_xxx_xxx +# 拉取YouQu框架代码 +git clone "http://gerrit.uniontech.com/youqu" + +# 指定拉取子仓库代码 +cd youqu +git submodule update --init apps/autotest_xxx_xxx 10. 如何更新 YouQu 自动化项目中,所有子仓库的代码¶ 更新所有子仓库代码 -cd youqu -git pull & git submodule foreach git pull +cd youqu +git pull & git submodule foreach git pull 11. 如何修复 YouQu 所有子仓库 master 分支游离头(detached head)¶ 修复所有子仓库默认master 分支游离头 -cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
git config --global core.quotePath false
在 Pycharm 中 apps 目录下应用库文件是黄色的,编辑器识别不到代码新增和修改;
$'\r':未找到命令
出现这个问题你应该是在 windows 上打开或编辑过 env.sh 脚本,windows下的换行是回车符+换行符,也就是\r\n,而 Linxu 下是换行符 \n,Linux 下不识别 \r,因此报错。
\r\n
\n
\r
解决方案:
# 将 \r 替换为空 -sudo sed -i 's/\r//' env.sh +# 将 \r 替换为空 +sudo sed -i 's/\r//' env.sh 7.怎样为单独某一条用例配置执行超时时间¶ 在用例脚本中添加装饰器,如下: -@pytest.mark.timeout(300) # 单位秒 -def test_xxx_001(): - pass +@pytest.mark.timeout(300) # 单位秒 +def test_xxx_001(): + pass 8. 如何拉取 YouQu 自动化项目所有代码,包含子仓库¶ 前置条件:已申请访问 YouQu 权限群组 -# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) -git config --global credential.helper store - -# 拉取YouQu框架代码,并递归拉取子仓库代码 -git clone "http://gerrit.uniontech.com/youqu" --recursive +# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) +git config --global credential.helper store + +# 拉取YouQu框架代码,并递归拉取子仓库代码 +git clone "http://gerrit.uniontech.com/youqu" --recursive 9. 如何拉取 YouQu 自动化项目中指定子仓库的代码¶ 前置条件: @@ -3207,22 +3227,22 @@ 9. 如何拉取 YouQu 自动化项目中指定子仓库的代 已申请访问 YouQu 权限群组 已存储访问密码 -# 拉取YouQu框架代码 -git clone "http://gerrit.uniontech.com/youqu" - -# 指定拉取子仓库代码 -cd youqu -git submodule update --init apps/autotest_xxx_xxx +# 拉取YouQu框架代码 +git clone "http://gerrit.uniontech.com/youqu" + +# 指定拉取子仓库代码 +cd youqu +git submodule update --init apps/autotest_xxx_xxx 10. 如何更新 YouQu 自动化项目中,所有子仓库的代码¶ 更新所有子仓库代码 -cd youqu -git pull & git submodule foreach git pull +cd youqu +git pull & git submodule foreach git pull 11. 如何修复 YouQu 所有子仓库 master 分支游离头(detached head)¶ 修复所有子仓库默认master 分支游离头 -cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
# 将 \r 替换为空 +sudo sed -i 's/\r//' env.sh
在用例脚本中添加装饰器,如下:
@pytest.mark.timeout(300) # 单位秒 -def test_xxx_001(): - pass +@pytest.mark.timeout(300) # 单位秒 +def test_xxx_001(): + pass 8. 如何拉取 YouQu 自动化项目所有代码,包含子仓库¶ 前置条件:已申请访问 YouQu 权限群组 -# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) -git config --global credential.helper store - -# 拉取YouQu框架代码,并递归拉取子仓库代码 -git clone "http://gerrit.uniontech.com/youqu" --recursive +# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) +git config --global credential.helper store + +# 拉取YouQu框架代码,并递归拉取子仓库代码 +git clone "http://gerrit.uniontech.com/youqu" --recursive 9. 如何拉取 YouQu 自动化项目中指定子仓库的代码¶ 前置条件: @@ -3207,22 +3227,22 @@ 9. 如何拉取 YouQu 自动化项目中指定子仓库的代 已申请访问 YouQu 权限群组 已存储访问密码 -# 拉取YouQu框架代码 -git clone "http://gerrit.uniontech.com/youqu" - -# 指定拉取子仓库代码 -cd youqu -git submodule update --init apps/autotest_xxx_xxx +# 拉取YouQu框架代码 +git clone "http://gerrit.uniontech.com/youqu" + +# 指定拉取子仓库代码 +cd youqu +git submodule update --init apps/autotest_xxx_xxx 10. 如何更新 YouQu 自动化项目中,所有子仓库的代码¶ 更新所有子仓库代码 -cd youqu -git pull & git submodule foreach git pull +cd youqu +git pull & git submodule foreach git pull 11. 如何修复 YouQu 所有子仓库 master 分支游离头(detached head)¶ 修复所有子仓库默认master 分支游离头 -cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
@pytest.mark.timeout(300) # 单位秒 +def test_xxx_001(): + pass
前置条件:已申请访问 YouQu 权限群组
# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) -git config --global credential.helper store - -# 拉取YouQu框架代码,并递归拉取子仓库代码 -git clone "http://gerrit.uniontech.com/youqu" --recursive +# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) +git config --global credential.helper store + +# 拉取YouQu框架代码,并递归拉取子仓库代码 +git clone "http://gerrit.uniontech.com/youqu" --recursive 9. 如何拉取 YouQu 自动化项目中指定子仓库的代码¶ 前置条件: @@ -3207,22 +3227,22 @@ 9. 如何拉取 YouQu 自动化项目中指定子仓库的代 已申请访问 YouQu 权限群组 已存储访问密码 -# 拉取YouQu框架代码 -git clone "http://gerrit.uniontech.com/youqu" - -# 指定拉取子仓库代码 -cd youqu -git submodule update --init apps/autotest_xxx_xxx +# 拉取YouQu框架代码 +git clone "http://gerrit.uniontech.com/youqu" + +# 指定拉取子仓库代码 +cd youqu +git submodule update --init apps/autotest_xxx_xxx 10. 如何更新 YouQu 自动化项目中,所有子仓库的代码¶ 更新所有子仓库代码 -cd youqu -git pull & git submodule foreach git pull +cd youqu +git pull & git submodule foreach git pull 11. 如何修复 YouQu 所有子仓库 master 分支游离头(detached head)¶ 修复所有子仓库默认master 分支游离头 -cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
# 第一次存储密码,提供后面拉代码(gerrit: ldap账号和密码,git拉取第一次输入保存,后面直接使用) +git config --global credential.helper store + +# 拉取YouQu框架代码,并递归拉取子仓库代码 +git clone "http://gerrit.uniontech.com/youqu" --recursive
前置条件:
# 拉取YouQu框架代码 -git clone "http://gerrit.uniontech.com/youqu" - -# 指定拉取子仓库代码 -cd youqu -git submodule update --init apps/autotest_xxx_xxx +# 拉取YouQu框架代码 +git clone "http://gerrit.uniontech.com/youqu" + +# 指定拉取子仓库代码 +cd youqu +git submodule update --init apps/autotest_xxx_xxx 10. 如何更新 YouQu 自动化项目中,所有子仓库的代码¶ 更新所有子仓库代码 -cd youqu -git pull & git submodule foreach git pull +cd youqu +git pull & git submodule foreach git pull 11. 如何修复 YouQu 所有子仓库 master 分支游离头(detached head)¶ 修复所有子仓库默认master 分支游离头 -cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
# 拉取YouQu框架代码 +git clone "http://gerrit.uniontech.com/youqu" + +# 指定拉取子仓库代码 +cd youqu +git submodule update --init apps/autotest_xxx_xxx
更新所有子仓库代码
cd youqu -git pull & git submodule foreach git pull +cd youqu +git pull & git submodule foreach git pull 11. 如何修复 YouQu 所有子仓库 master 分支游离头(detached head)¶ 修复所有子仓库默认master 分支游离头 -cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
cd youqu +git pull & git submodule foreach git pull
修复所有子仓库默认master 分支游离头
cd youqu -git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' +cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)' diff --git "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" index e512514e..56c67539 100644 --- "a/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" +++ "b/\350\207\252\345\212\250\345\214\226\346\265\213\350\257\225\346\236\266\346\236\204\350\256\276\350\256\241v1.0/index.html" @@ -97,7 +97,7 @@ - + @@ -228,7 +228,7 @@ - + YouQu Docs
cd youqu +git submodule foreach -q --recursive 'git checkout $(git config -f $toplevel/.gitmodules submodule.$name.branch || echo master)'